ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3N2NjOS4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2ODI0ICswLDAgQEAKLU1vbiBNYXkgMjkgMTM6NTA6MDMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB0ZXhpbmZvL3RleGluZm8udGV4OiBVcGRhdGUuIFZlcnNpb24gZnJvbSBtYWtlaW5mbyA0LjAuCi0KLVR1ZSBNYXkgMzAgMTk6MDE6MTIgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBJbXBvcnQgQ1ZTIHZlcnNpb24gMS4xNjcgVHVlIE1heSAzMCAwOTowMDowNyAyMDAwLgotCSogY29uZmlnLmd1ZXNzOiBJbXBvcnQgQ1ZTIHZlcnNpb24gMS4xNDggVHVlIE1heSAzMCAwOTowMDowNiAyMDAwCi0KLTIwMDAwLTA1LTIxICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZTogUmV2ZXJ0IGNoYW5nZXMgbWFkZSBvbiBNYXkgMTggYW5kIE1heSAxOS4KLQotICAgICAgICAqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogTWFrZSBzdXJlIGFzL2xkIGluIHRoZSBnY2MKLSAgICAgICAgZGlyZWN0b3J5IGFyZSB1c2VkIGlmIHRoZXkgZXhpc3QuIE1ha2Ugc3VyZQotICAgICAgICAkKGJ1aWxkX3Rvb2xkaXIpL2luY2x1ZGUgaXMgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcywKLSAgICAgICAgJChidWlsZF90b29sZGlyKS9saWIvIGZvciBsaWJyYXJ5IGZpbGVzLgotCShHQ0NfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotICAgICAgICAoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotMjAwMDAtMDUtMTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlOiBQcm92aWRlIC0tZGlzYWJsZS10YXJnZXQtZGlyLXNhbml0eS1jaGVja2luZyB0bwotCWRpc2FibGUgdGhlIGdjYyBkaXJlY3RvcnkgY2hlY2tpbmcgZm9yIGNyb3NzIGNvbXBpbGluZy4KLQotMjAwMDAtMDUtMTggIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlOiBBc2sgdG8gY3JlYXRlIHRoZSBnY2MgZGlyZWN0b3J5IGZvciBjcm9zcwotCWNvbXBpbGluZyBpZiBuZWNlc3NhcnkuCi0KLVRodSBNYXkgMTggMTA6NTg6MTMgMjAwMCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqNjQqLSotKik6IERvIGJ1aWxkIGxkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0KLTIwMDAtMDUtMTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluOiBTcGVjaWFsIGNhc2UgcG93ZXJwYyotKi1haXgqIHRhcmdldF9tYWtlZmlsZV9mcmFnLgotCi1XZWQgTWF5IDE3IDE2OjAzOjQ4IDIwMDAgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlndXJlLXRhcmdldC1saWJpYmVydHkpOiBEZXBlbmQgb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYi4KLQotVHVlIE1heSAxNiAxMDowNjoyMSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQlUaHUgQXByIDI3IDExOjAxOjQ4IDIwMDAgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGIxLmN5Z251cy5jb20+OgotCSogTWFrZWZpbGUuaW4gKGRvLXRhci1iejIsIGRvLW1kNXN1bSk6IFNraXAgQ1ZTIGRpcmVjdG9yaWVzLgotCi1UdWUgTWF5IDE2IDA5OjU3OjM1IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCVdlZCBBcHIgMjYgMTc6MDM6NTMgMjAwMCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAYjEuY3lnbnVzLmNvbT46Ci0JKiBNYWtlZmlsZS5pbiAoZG8tZGp1bnBhY2spOiBOZXcgdGFyZ2V0LiBVcGRhdGUgZGp1bnBhY2suYmF0IHdpdGgKLSAJY3VycmVudCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgQWRkIHRvIHByb3RvLXRvcGxldiBkaXJlY3RvcnkuCi0JKGdkYi10YXopOiBCdWlsZCBkby1kanVucGFjay4KLQotMjAwMC0wNS0xMyBBbGV4YW5kcmUgT2xpdmEgIDxvbGl2YUBsc2QuaWMudW5pY2FtcC5icj4KLQotCSogbHRtYWluLnNoOiBQcmVzZXJ2ZSBpbiByZWxpbmtfY29tbWFuZCBhbnkgZW52aXJvbm1lbnQKLQl2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IHRoZSBsaW5rZXIgYmVoYXZpb3IuCi0KLUZyaSBNYXkgMTIgMTE6MjM6MTcgMjAwMCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogUmVjb2duaXplIGhwcGE2NCBhcyBhIHZhbGlkIGNwdSB0eXBlLgotCi1XZWQgTWF5IDEwIDIxOjI2OjUxIDIwMDAgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpYTY0Ki0qLWVsZiopOiBBZGQgZ2RiIGFuZCBmcmllbmRzIHRvIG5vY29uZmlnZGlycy4KLQotMjAwMC0wNS0wOCAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogZGp1bnBhY2suYmF0OiBDaGFuZ2UgdGhlIFNlZCBzY3JpcHQgdG8gcmVwbGFjZSBAVkAgaW4gZm5jaGFuZ2UubHN0Ci0gICAgICAgIHdpdGggdGhlIHZlcnNpb24gbmFtZS4KLQotMjAwMC0wNC0yMyAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogZGp1bnBhY2suYmF0OiBOZXcgZmlsZS4KLQotMjAwMC0wNC0yMSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGQzMHYpOiBBZGQgZDMwdiBhcyBhIGJhc2ljIG1hY2hpbmUgdHlwZS4KLQotV2VkIEFwciAxOSAxMjo0NjoyNiAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXosIGdkYi10YXosIGdhcy50YXIuYnoyLCBiaW51dGlscy50YXIuYnoyLAotIAlnYXMrYmludXRpbHMudGFyLmJ6MiwgbGliZysrLnRhci5iejIsIGduYXRzLnRhci5iejIsIGdkYi50YXIuYnoyLAotIAlkZWphZ251LnRhci5iejIsIGdkYitkZWphZ251LnRhci5iejIsIGluc2lnaHQudGFyLmJ6MiwKLSAJaW5zaWdodCtkZWphZ251LnRhci5iejIsIG5ld2xpYi50YXIuYnoyKTogUGFzcyBNRDVQUk9HIHRvIHN1Yi1tYWtlLgotCi1XZWQgQXByIDEyIDE2OjQyOjQ4IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGdkYi10YXopOiBOZXcgdGFyZ2V0LiAgR0RCIHNwZWNpZmljIGFyY2hpdmUuCi0JKGRvLW1kNXN1bSk6IE5ldyB0YXJnZXQuCi0JKE1ENVBST0cpOiBEZWZpbmUuCi0JKFBBQ0tBR0UpOiBEZWZhdWx0IHRvIFRPT0wuCi0JKFZFUik6IERlZmF1bHQgdG8gYSBzaGVsbCBzY3JpcHQuCi0JKHRheik6IFJld3JpdGUgdGFyZ2V0LiAgTW92ZSByZWFsIHdvcmsgdG8gZG8tcHJvdG8tdG9wbGV2LiAgSW5jbHVkZQotIAltZDUgY2hlY2tzdW0gZ2VuZXJhdGlvbi4KLQkoZG8tcHJvdG8tdG9wbGV2KTogTmV3IHRhcmdldC4gQ3JlYXRlICQoUEFDS0FHRSktJChWRVIpIGxpbmsuCi0JKGRvLXRhci1iejIpOiBEZWxldGUgY3JlYXRpb24gb2YgJChQQUNLQUdFKS0kKFZFUikgbGluay4KLQkoZ2RiLnRhci5iejIsIGRlamFnbnUudGFyLmJ6MiwgZ2RiK2RlamFnbnUudGFyLmJ6MiwKLSAJaW5zaWdodC50YXIuYnoyKTogVXNlIGdkYi10YXogdG8gY3JlYXRlIGFyY2hpdmUuCi0KLUZyaSBBcHIgIDcgMTg6MTA6MjkgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKHdhcm5fY2ZsYWdzKTogRGVsZXRlLgotCi0yMDAwLTAzLTMwICBDaHJpc3RvcGhlciBGYXlsb3IgIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBBZGQgbmV3IHdpbnN1cCBkaXJlY3RvcnkKLQlzdHJ1Y3R1cmUgc3R1ZmYgdG8gLUwgbGlicmFyeSBzZWFyY2guCi0JKENYWF9GT1JfVEFSR0VUKTogRGl0dG8uCi0KLTIwMDAtMDMtMjkgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IC1saW51eC1nbnUqLCBub3QgLWxpbnV4LWdudS4KLQotMjAwMC0wMy0xMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEJhY2tlZCBvdXQgdGhlIGxhc3QgY2hhbmdlLgotCi0yMDAwLTAzLTEwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogUnVuIGxkL2xkLW5ldyBpZiBuZWNlc3NhcnkuCi0KLUZyaSBNYXIgIDMgMTg6NDQ6MDggMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogU2V0IFBBQ0tBR0UgdG8gVE9PTCB3aGVuIG5vdCBkZWZpbmVkLgotCShkby10YXItYnoyKTogUmVwbGFjZSBUT09MIHdpdGggUEFDS0FHRS4KLQkoZ2RiLnRhci5iejIpOiBSZW1vdmUgR0RCVEsgZnJvbSBHREIgcGFja2FnZS4KLQkoZ2RiK2RlamFnbnUudGFyLmJ6MiwgaW5zaWdodC50YXIuYnoyLCBpbnNpZ2h0K2RlamFnbnUudGFyLmJ6MiwKLSAJZGVqYWdudS50YXIuYnoyKTogTmV3IHBhY2thZ2VzLgotCi0yMDAwLTAyLTI3ICBBbmRyZWFzIEphZWdlciAgPGFqQHN1c2UuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGVudHJ5IGZvciBtaXBzKi0qLWxpbnV4KiwgbW92ZSBjYXRjaCBhbGwKLQkqLSotKmxpbnV4KiBlbnRyeSBiZWxvdyB0aGlzIG9uZS4KLQotMjAwMC0wMi0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMy40LgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBTdXBwb3J0IGFuIE9TIG9mICJ3aW5jZSIuCi0KLVRodSBGZWIgMjQgMTY6MTU6NTYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFVwZGF0ZWQgdG8gbWF0Y2ggY29uZmlnJ3MgMjAwMC0wMi0xNQotIAl2ZXJzaW9uLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBMaW51eC9JQk0gMzcwLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlwcy1wZSwgc2gtcGUgYW5kIGFybS13aW5jZS1wZSB0YXJnZXRzLgotCi0yMDAwLTAyLTIwICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzICJjeWd3aW4iIHJhdGhlciB0aGFuICJjeWd3aW4zMiIuCi0KLTIwMDAtMDItMTYgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IFdoZW4gc2V0dGluZywgbmFycm93IHNlYXJjaCB0bwotCWxpbmVzIGNvbnRhaW5pbmcgYHZlcnNpb25fc3RyaW5nJy4KLQotMjAwMC0wMS0wNiAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtdC1haXg0MyB0byBoYW5kbGUgKl9UQVJHRVQgZGVmcywKLQlub3QgbWgtYWl4NDMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIGZvciBwai4KLQotMTk5OS0wOC0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgZm9yIGZyMzAuCi0KLTE5OTktMDgtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IGNvbmZpZ3VyZSBvciBidWlsZCBsZCBmb3IgQUlYCi0JcGxhdGZvcm1zLiAgbGQgaXMga25vd24gdG8gYmUgYnJva2VuIG9uIHRoZXNlIHBsYXRmb3Jtcy4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMREZMQUdTKTogRGVmaW5lLgotCi0xOTk5LTA4LTA4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdLSotbWluZ3czMiopOiBEb24ndCBwdXQgZ3Byb2YgaW4KLQlub2NvbmZpZ2RpcnMuCi0JKCotKi1jeWd3aW4qKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBta2RlcDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBta2RlcC4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogQWRkIG1rZGVwLgotCi0JRnJvbSBFbGkgWmFyZXRza2lpIDxlbGl6QGlzLmVsdGEuY28uaWw+OgotCSogY29uZmlndXJlICh0bXBmaWxlKTogQ2hhbmdlIGNPTmYkJCB0byBjTmYkJCB0byBhdm9pZCBhbiBvdmVybHkKLQlsb25nIGZpbGUgbmFtZSB3aGVuIHVzaW5nIERKR1BQIG9uIE1TLURPUy4KLQotMTk5OS0wNy0zMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2stdGFyZ2V0LWxpYmlvKTogUmVtb3ZlIGFsbC10YXJnZXQtbGlic3RkYysrCi0JZGVwZW5kZW5jeSBhcyB0aGlzIGNhdXNlcyAibWFrZSBjaGVjayIgdG8gZ2xvYmFsbHkgIm1ha2UgYWxsIgotCi0xOTk5LTA3LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJpbnV0aWxzLnRhci5iejIpOiBEb24ndCBwYXNzIG1ha2VhbGwuYmF0IGFuZAotCWNvbmZpZ3VyZS5iYXQgaW4gU1VQUE9SVF9GSUxFUy4KLQkoZ2FzK2JpbnV0aWxzLnRhci5iejIpOiBMaWtld2lzZS4KLQotCSogbWFrZWFsbC5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIC1XIC1XYWxsIHRvIHRoZSBkZWZhdWx0IENGTEFHUyB3aGVuIGNvbXBpbGluZyB3aXRoCi0JZ2NjLgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCwgYmludXRpbHMgJiBnYXMgZm9yIGhwcGEqLSotbGludXgtZ251Ki4KLQotMTk5OS0wNi0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBvbiBJUklYNi4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZGlzdHJpYnV0aW9uIHRhcmdldHMgdG8gdXNlIGJ6aXAyIGluc3RlYWQgb2YKLQlnemlwLgotCShURVhJTkZPX1NVUFBPUlQpOiBTZXQgdG8ganVzdCB0ZXhpbmZvL3RleGluZm8udGV4LgotCSh0YXopOiBEb24ndCB1c2UgdGV4aW5mby9ncGwudGV4aW5mbyBvciB0ZXhpbmZvL2xncGwudGV4aW5mby4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1jb3JlIHRhcmdldC4KLQotU3VuIE1heSAzMCAxNjowMzoxNiAxOTk5ICBDb3J0IERvdWdhbiAgPGNvcnRAY3Mubm10LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzIChwcGMtKi1saW51eC1nbnUpOiBBbHNvIHVzZSBsZCBlbXVsIGVsZjMycHBjbGludXguCi0KLTE5OTktMDUtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IEVHQ1MgdmVyc2lvbi4KLQotMTk5OS0wNC0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFttb2RlIGxpbmtdIEFsd2F5cyB1c2UgQ0MgZ2l2ZW4gYnkgbHRjb25maWcuCi0KLTE5OTktMDQtMjMgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yZi4KLQotMTk5OS0wNC0yMCAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJzdHViIGZvciBhcm0tZWxmIHRhcmdldHMuCi0JKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGFueSBic3Agc3R1ZmYgZm9yIGZvciBhcm0tb2FiaSB0YXJnZXRzLgotCUJhZCBtZXJnZSByZW1vdmVkIHRoZXNlIHR3byBjaGFuZ2VzLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGk/ODYtKi1iZW9zKik6IERvIGNvbmZpZyBncGVyZjsgZG9uJ3QgY29uZmlnCi0JZ2RiLCBuZXdsaWIsIG9yIGxpYmdsb3NzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQotMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogVXNlIGNvbmZpZy9tdC1kMzB2IGFzIG1ha2VmaWxlIGZyYWdtZW50LAotCW5vdCBtdC1vc3BhY2UsIGluIG9yZGVyIHRvIHNodXQgdXAgYXNzZW1ibGVyIHdhcm5pbmcgYWJvdXQgdXNpbmcKLQlzeW1ib2xzIHRoYXQgYXJlIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycy4KLQotMTk5OS0wNC0wNyAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtY3lnbW9uKTogQWRkZWQgYWxsLXRhcmdldC1ic3AgdG8gdGhlCi0JZGVwZW5kZW5jeSBsaXN0IGZvciBhbGwtdGFyZ2V0LWN5Z21vbi4KLQotMTk5OS0wNC0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IENoZWNrICRob3N0LCBub3QgJHRhcmdldCwgZm9yIHNlbGVjdGl2ZSBtdWx0aWxpYnMuCi0JKGFybS0qLSopOiBBbGxvdyBkaXNhYmxpbmcgb2YgYmllbmRpYW4sIGgvdyBmcCwgMjYgYml0IGFwY3MsCi0JdGh1bWIgaW50ZXJ3b3JraW5nLCBhbmQgdW5kZXJzY29yZSBwcmVmaXggbXVsdGlsaWJzLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBjdXJyZW50IGF1dG9tYWtlLgotCi1GcmkgQXByICAyIDE1OjExOjMyIDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBSZW1vdmVkLgotCi0JKiBjb25maWd1cmUuaW4gKGd4eF9pbmNsdWRlX2Rpcik6IEhhbmRsZSBpdC4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotMTk5OS0wMy0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKG1pcHM2NHZyNDExMSxtaXBzNjR2cjQxMTFlbCkgQWRkLgotCi0xOTk5LTAzLTIxICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5ndWVzczogQ29ycmVjdCB0eXBvIGZvciBkZXRlY3RpbmcgRUxGIG9uIEZyZWVCU0QuCi0KLVRodSBNYXIgMTggMDA6MTc6NTAgMTk5OSAgTWFyayBFbGJyZWNodCA8c25vd2JhbGwzQHVzYS5uZXQ+Ci0KLQkqIGNvbmZpZy9taC1nbzMyOiBEZWxldGUuCi0JKiBjb25maWcvbWgtZGpncHA6IE5ldy4gUmVuYW1lZCBmcm9tIG1oLWdvMzIuCi0JKiBjb25maWd1cmUuaW4gKHBjLW1zZG9zZGpncHApOiBTZXQgaG9zdF9tYWtlZmlsZV9mcmFnIHRvCi0JY29uZmlnL21oLWRqZ3BwLgotCi1UaHUgTWFyIDExIDE4OjM3OjIzIDE5OTkgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWJzcCk6IEFkZGVkIGFsbC1nY2MgYWxsLWJpbnV0aWxzIGFuZAotCWFsbC10YXJnZXQtbmV3bGliIHRvIGRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1ic3AuCi0KLVRodSBNYXIgMTEgMDE6MTk6MzEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBpMzg2LXV3aW4gc3VwcG9ydC4KLQkqIGNvbmZpZy5ndWVzczogTGlrZXdpc2UuCi0KLVRodSBNYXIgMTEgMDE6MDc6NTUgMTk5OSAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2xlYW51cCwgYWRkIG1oLSpwaWMgaGFuZGxpbmcgZm9yIGFybSwgc3BlY2lhbAotCWNhc2UgcG93ZXJwYyotKi1haXgqCi0KLVdlZCBNYXIgMTAgMTg6MzU6MDcgMTk5OSAgSmVmZiBKb2huc3RvbiAgPGpqb2huc3RuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlZCB0YXJnZXQtbGliZ2xvc3Mgc28gbGlibm9zeXMuYQotCWNhbiBiZSBidWlsdC4KLQotV2VkIE1hciAxMCAxNzozOTowOSAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGJzcCBzdXBwb3J0IHRvIGFybS0qLWNvZmYgYW5kIGFybS0qLWVsZgotIAl0YXJnZXRzLgotCi0xOTk5LTAzLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW5hbWUgQ1lHTlVTIExPQ0FMIHRvIEVHQ1MgTE9DQUwKLQotU3VuIEZlYiAyOCAwMjoyMDowMCAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBDaGVjayBmb3IgImN5Z3dpbioiIHJhdGhlciB0aGFuICJjeWd3aW4zMioiCi0KLTE5OTktMDItMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGFybSByZWNvZ25pdGlvbi4KLQotV2VkIEZlYiAyNCAxMzo1MTo0MCAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IENoYW5nZWQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8KLQlpbmNsdWRlIHRhcmdldC1ic3Agb25seSBmb3IgbTY4ay0qLWVsZiogYW5kIG02OGstKi1jb2ZmKgotCXJhdGhlciB0aGFuIG02OGstKi0qIHNpbmNlIGl0IGlzIG5vdCBrbm93biB0byB3b3JrIG9uCi0JbTY4ay1hb3V0LiBEaXR0byBmb3IgYXJtLSotKm9hYmkuCi0KLVdlZCBGZWIgMjQgMTI6NTI6MTcgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCi0JKiBjb25maWcvbWgtd2luZG93czogRGl0dG8uCi0KLTE5OTktMDItMTkgIEJlbiBFbGxpc3RvbiA8YmplQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pc2UgRUxGIG9uIEZyZWVCU0QuIEZyb20gTmlhbGwKLQlTbWFydCBhbmQgaW1wcm92ZWQgYnkgQW5kcmV3IENhZ25leS4KLQotVGh1IEZlYiAxOCAxOTo1NTowOSAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG9wZW5ic2QtKi1ocHBhLgotCi1XZWQgRmViIDE3IDAxOjM4OjU5IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogTWFrZWZpbGUuaW4gKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBBcHBlbmQgJCQkKFJQQVRIX0VOVlZBUikKLQlvbmx5IGlmIGl0IGlzIG5vdCBlbXB0eS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogY29uZmlnLmd1ZXNzOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguCi0KLQkqIGNvbmZpZy5zdWI6IE1vZGlmaWVkIHRvIHJlY29nbml6ZSB1bmFtZSdzIGFybXYqIHN5bnRheC4KLQotMTk5OS0wMi0xNyAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgdGFyZ2V0LWJzcCBmb3Igc3BhcmNsaXRlLgotCi1Nb24gRmViICA4IDE0OjE3OjI0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBhbHBoYXBjYTVbNjddIGFuZCB1cCB0byBhbHBoYWV2OC4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIHBvcnQuCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIHRhcmdldC4KLQotU3VuIEZlYiAgNyAxODowMTo1NCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQkKLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWN5Z3dpbjMyKik6IFVzZSBjb25maWcvbWgtY3lnd2luIGluc3RlYWQgb2YKLQl0aGUgb2xkIG5hbWUgY29uZmlnL21oLWN5Z3dpbjMyLgotCUVuYWJsZSB0ZXhpbmZvLgotCi1UaHUgRmViICA0IDIwOjQzOjI1IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBsZCBmb3IgaXg4NiBTb2xhcmlzLgotCi1UdWUgRmViICAyIDE5OjQ2OjQwIDE5OTkgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6ICBTZXQgQVIgdG8gJEFSIGluc3RlYWQgb2YKLQkkQVJfRk9SX1RBUkdFVC4gIExpa2V3aXNlIGZvciBSQU5MSUIuCi0KLVR1ZSBGZWIgIDIgMjA6MDU6MDUgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnLnN1YiAob2FiaSk6ICBSZWNvZ25pemUuCi0gICAgICAgICogY29uZmlndXJlLmluIChhcm0tKi1vYWJpKTogIEhhbmRsZS4KLQotU2F0IEphbiAzMCAwNjowOTowMCAxOTk5ICBSb2JlcnQgTGlwZSAgKHJvYmVydGxpcGVAdXNhLm5ldCkKLQotCSogY29uZmlnLmd1ZXNzOiBJbXByb3ZlIGRldGVjdGlvbiBvZiBpNjg2IG9uIFVuaXhXYXJlIDcuCi0KLVNhdCBKYW4gMzAgMDg6MDQ6MDAgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHN1cHBvcnQgZm9yIGkzODYtcGMtaW50ZXJpeC4KLQkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9taC1pbnRlcml4OiBOZXcgZmlsZS4KLQotTW9uIEphbiAxOCAxMzo1OToyMCAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHVubmVlZGVkIGFsbC10YXJnZXQtbGliaW8gZnJvbQotCWZyb20gYWxsLXRhcmdldC13aW5zdXAgdGFyZ2V0IHNpbmNlIGl0IGlzIG5vdyB1bm5lZWRlZC4KLQlBZGQgYWxsLXRhcmdldC1saWJ0ZXJtY2FwIGluIGl0cyBwbGFjZSBzaW5jZSBpdCBpcyBub3cKLQluZWVkZWQuCi0KLVdlZCBEZWMgMzAgMjA6MzQ6NTIgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBtYWtlZmlsZSBzdHViIGZvciBjeWd3aW4gdGFyZ2V0IGlzIHByb2JhYmx5Ci0JdW5uZWNlc3NhcnkuICBSZW1vdmUgaXQgZm9yIG5vdy4KLQkqIGNvbmZpZy9tdC1jeWd3aW46IFJlbW92ZS4KLQotV2VkIERlYyAzMCAwMToxMzowMyAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGxpYnRlcm1jYXAuYSBzaG91bGQgYmUgYnVpbHQgd2hlbiBjeWd3aW4gaXMgdGhlCi0JdGFyZ2V0IGFzIHdlbGwgYXMgdGhlIGhvc3QuCi0JKiBjb25maWcuZ3Vlc3M6IEFsbG93IG1peGVkIGNhc2UgaW4gY3lnd2luIHVuYW1lIG91dHB1dC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGlidGVybWNhcCB0YXJnZXQuCi0JKiBjb25maWcvbXQtY3lnd2luOiBOZXcgZmlsZS4gIGxpYnRlcm1jYXAgdGFyZ2V0IGluZm8uCi0KLVR1ZSBEZWMgMTUgMTc6MDI6NTggMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBmb3IgeDg2LWNvZmYgYW5kIHg4Ni1lbGYuIENvbmZpZ3VyZQotIAljeWdtb24gZm9yIGFsbCBzcGFyY2xpdGUgdGFyZ2V0cywgcmVnYXJkbGVzcyBvZiBvYmplY3QgZm9ybWF0LgotCi0xOTk4LTEyLTE1ICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCB0YXJnZXQtYnNwIGZvciBzZXZlcmFsIHRhcmdldCBhcmNoaXRlY3R1cmVzLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgcnVsZXMgZm9yIGJzcC4KLQotV2VkIERlYyAyMyAwMDoyMDo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENsZWFuIHVwIGhhbmRsaW5nIG9mIGhwcGEyLjAuCi0KLVR1ZSBEZWMgMjIgMjM6NTY6MzEgMTk5OCAgUm9kbmV5IEJyb3duICAocm9kbmV5YnJvd25AcG1zYy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogVXNlIEMgY29kZSB0byBpZGVudGlmeSBtb3JlIEhQIG1hY2hpbmVzLgotCi1UaHUgRGVjIDE3IDAxOjIyOjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIGhwcGEyLjAuCi0KLUZyaSBEZWMgIDQgMDE6MzQ6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEltcHJvdmUgZGV0ZWN0aW9uIG9mIGhwcGEyLjAgcHJvY2Vzc29ycy4KLQotRnJpIERlYyAgNCAwMTozMzowNSAxOTk4ICBOaWFsbCBTbWFydCA8bmlhbGxzQGV1cmlzdGl4LmllPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBGcmVlQlNEIHVzaW5nIEVMRiBhdXRvbWF0aWNhbGx5LgotCi0xOTk4LTExLTI2ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoc2tpcC10aGlzLWRpcik6IEFkZCBoYW5kbGluZyBmb3IgbmV3IHNoZWxsIHNjcmlwdCwgd2hpY2gKLQltaWdodCBiZSBjcmVhdGVkIGJ5IGEgc3ViLWRpcmVjdG9yeSdzIGNvbmZpZ3VyZSB0byBpbmRpY2F0ZSwgdGhpcyBwYXJ0aWN1bGFyCi0JZGlyZWN0b3J5IGlzICJ1bndhbnRlZCIuCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0KLQotV2VkIE5vdiAxOCAxODoyODo0NSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogaW1wb3J0IGZyb20gbGlidG9vbCwgYWZ0ZXIgY2hhbmdpbmcgbGlidG9vbCB0bwotCWFjY291bnQgZm9yIHRoZSBjeWd3aW4gbmFtZSBjaGFuZ2UuCi0KLVdlZCBOb3YgMTggMTg6MDk6MTQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENDX0ZPUl9UQVJHRVQgYW5kIENYWF9GT1JfVEFSR0VUIHNob3VsZCBhbHNvCi0JaW5jbHVkZSBuZXdsaWIvbGliYy9zeXMvY3lnd2luIGFuZCBuZXdsaWIvbGliYy9zeXMvY3lnd2luMzIuCi0KLVdlZCBOb3YgMTggMjA6MTM6MjkgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbGlidGVybWNhcCB0byBsaXN0IG9mIGN5Z3dpbiBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBOb3YgMTcgMTY6NTc6NTEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmluOiBtb2RpZnkgQ0NfRk9SX1RBUkdFVCBhbmQgQ1hYX0ZPUl9UQVJHRVQgc28gdGhhdAotICAgICAgICB0aGV5IGluY2x1ZGUgd2luc3VwL2luY2x1ZGUgd2hlbiBpdCdzIGEgY3lnd2luIHRhcmdldC4KLQotMTk5OC0xMS0xMiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCB6aXAuCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uIGFsbC16aXAuCi0JKGFsbC16aXApOiBOZXcgdGFyZ2V0LgotCShBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC16aXAuCi0JKE5BVElWRV9DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stemlwLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLXppcC4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLXppcC4KLQotVGh1IE5vdiAxMiAxNzoyNzoyMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogbG9zZSAiMzIiIGZyb20gY29tbWVudCBhYm91dCBjeWd3aW4uCi0KLVRodSBOb3YgIDUgMTU6MDA6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgLU9zIHRvIGJ1aWxkIHRhcmdldCBsaWJyYXJpZXMgZm9yIHRoZSBmcjMwLgotCi1XZWQgTm92ICA0IDE4OjQ5OjQzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIGZyMzAuCi0KLU1vbiBOb3YgIDIgMTU6MTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZHJvcCAiMzIiIGZyb20gY29uZmlnL21oLWN5Z3dpbjMyLiAgQ2hlY2sKLQljeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCSogY29uZmlnLnN1YjogQ2hlY2sgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQotMTk5OC0xMC0yMCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW46IEFkZCB0aGUgYWJpbGl0eSB0byB1c2UgdGNsOC4xIGFuZCB0azguMQotCWlmIGRlc2lyZWQuCi0KLVN1biBPY3QgMTggMTg6MzQ6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuaWYgKGN4eF9pbnRlcmZhY2UsIGxpYnN0ZGN4eF9pbnRlcmZhY2UpOiBEbyBub3QgdHJ5IHRvIHNldAotCXRoZXNlIGlmIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgdG8gbm90IGV4aXN0LgotCi1XZWQgT2N0IDE0IDEwOjI5OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCBjb25maWcuaWYuCi0KLVR1ZSBPY3QgMTMgMDk6MTc6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBCcmluZyBiYWNrIGxvc3Qgc3BhcmN2OS4KLQotV2VkIFNlcCAzMCAyMjoyMDo1MCAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBpWzM0NTY3XTg2LXBjLXVkay4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMzAgMTk6MjM6NDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBiemlwMiBwYWNrYWdlIGJ1aWxkaW5nIGJpdHMgZm9yIHVzZXIKLQl0b29scyBtb2R1bGUKLQkqIGNvbmZpZ3VyZS5pbjogZGl0dG8KLQotMTk5OC0wOS0zMCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JICogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogUmVtb3ZlIGR1cGxpY2F0ZSBsaW5lLgotCi1UdWUgU2VwIDI5IDIyOjQ1OjQxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1hdXRvbWFrZSk6IGZpeCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBTZXAgMjggMDQ6MDQ6MjcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1pbm9yIGNsZWFudXBzIGZvciBidWlsZGluZyBpbiB0aGUgJCh0YXJnZXRfYWxpYXMpCi0Jc3ViZGlyLgotCi0xOTk4LTA5LTIyICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBTZXQgciBhbmQgcyBiZWZvcmUgbWFrZSBhbGwuICBVc2UKLQlCQVNFX0ZMQUdTX1RPX1BBU1MgaW4gbWFrZSBhbGwuCi0JKGNyb3NzKTogTGlrZXdpc2UuCi0KLTE5OTgtMDktMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBQYXNzIFRBUkdFVF9GTEFHU19UT19QQVNTIHRvIGBtYWtlIGFsbCcuCi0KLQotU3VuIFNlcCAyMCAwMDoxMzowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotMTk5OC0wOS0xOSAgTWljaGFlbCBIYXllcyAgPG0uaGF5ZXNAZWxlYy5jYW50ZXJidXJ5LmFjLm56PgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgQzR4IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLTE5OTgtMDktMTMgIERhdmlkIFMuIE1pbGxlciAgPGRhdmVtQHBpZXJkb2wuY29iYWx0bWljcm8uY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgc3BhcmN2OSBqdXN0IGxpa2Ugc3BhcmM2NC4KLQotV2VkIFNlcCAgOSAxNTo0NDo1MiAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogTWF0Y2ggIlBlbnQgSUkiIG9yICJQZW50SUkiIGZvciBPcGVuU2VydmVyLgotCi1UdWUgU2VwICA4IDAxOjE4OjM5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBDb3JyZWN0bHkgaWRlbnRpZnkgUGVudGl1bSBJSSBzY28gYm94ZXMuCi0KLQkqIGNvbmZpZy5ndWVzczogRml4ICJ0ciIgY29kZS4gIEZyb20gV2Vpd2VuIExpdS4KLQotU2F0IFNlcCAgNSAxMzo1Njo1MiAxOTk4ICBKb2huIEh1Z2hlcyAgPGpvaG5AQ2FsdmEuQ09NPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCBhc3N1bWUgeDg2LXN2cjQgb3IgeDg2LXVuaXh3YXJlIGNhbiBoYW5kbGUKLQlzdGFicy4KLQotU2F0IFNlcCAgNSAwMjoxMjowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IEFkZCBsaWJjaGlsbC4KLQkoQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGFsbC10YXJnZXQtbGliY2hpbGwuCi0JKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBTaW1pbGFybHkuCi0JKElOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTKTogU2ltaWxhcmx5LgotCShhbGwtdGFyZ2V0LWxpYmNoaWxsKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiBBZGQgbGliY2hpbGwuCi0KLVN1biBBdWcgMzAgMjI6Mjc6MDIgMTk5OCAgTHV0eiBXb2hscmFiIDxsdXR6LndvaGxyYWJAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KLQotCSogY29uZmlnLmd1ZXNzOiBBdm9pZCBhc3N1bXB0aW9ucyBhYm91dCAidHIiIGJlaGF2ZXMgd2hlbgotCUxBTkcgaXMgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIEVuZ2xpc2guCi0KLVN1biBBdWcgMzAgMjI6MTQ6NDQgMTk5OCAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBjb25maWd1cmUgKGd4eF9pbmNsdWRlX2Rpcik6IENoYW5nZWQgdG8KLQknJHtwcmVmaXh9L2luY2x1ZGUvZysrJy0ke2xpYnN0ZGN4eF9pbnRlcmZhY2V9LgotCi0JKiBjb25maWcuaWY6IE5ldyB0byBkZXRlcm1pbmUgdGhlIGludGVyZmFjZXMuCi0KLVN1biBBdWcgMzAgMjE6MTU6MTkgMTk5OCAgTWFyayBLbGVpbiAobWtsZWluQGRpcy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRGV0ZWN0IGFuZCBoYW5kbGUgTVBFL0lYLgotCSogY29uZmlnLnN1YjogRGVhbCB3aXRoIE1QRS9JWC4KLQotU2F0IEF1ZyAyOSAxNDozMjo1NSAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgbWgtYWl4NDMuCi0KLTE5OTgtMDctMjkgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlOiBGaXggLS13aXRob3V0Ly0tZGlzYWJsZSBjYXNlcyBmb3IgZ3h4LWluY2x1ZGUtZGlyLgotCi1GcmkgQXVnIDI4IDEyOjI4OjI2IDE5OTggIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgotCi0JKiBtZGF0YS1zaDogIEltcG9ydGVkLiAgTmVlZGVkIGZvciBhdXRvbWFrZSBzdXBwb3J0LgotCi1UaHUgQXVnIDEzIDEyOjQ5OjI5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFRyeSAiY2htb2QgLVIgb2c9dSAuIiBiZWZvcmUgCi0JImNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgIi4KLQotRnJpIEp1bCAzMSAwOTozODozMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQWRkIGFybS1lbGYgYW5kIHRodW1iLWVsZiBzdXBwb3J0LgotCi1Nb24gSnVsIDI3IDE2OjIzOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIHByZXZpb3VzIHBhdGNoLgotCi1GcmkgSnVsIDI0IDE5OjU1OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IE1vdmUgRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTCi0JdG8gaGVyZSAuLi4KLQkoaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzKTogYW5kIGhlcmUKLQkoSU5TVEFMTF9NT0RVTEVTKTogLi4uIGZyb20gaGVyZS4KLQotRnJpIEp1bCAyNCAxNzowMTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1GcmkgSnVsIDI0IDA4OjQzOjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoZXh0cmFjb25maWdkaXJzKTogTmV3IHZhcmlhYmxlLgotCShTVUJESVJTKTogQWRkIGV4dHJhY29uZmlnZGlycyBhbmQgcmVjdXJzZSBvbiB0aGVtIHRvby4KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBNb3ZlIGhpZ2hlciBpbiBmaWxlLgotCShFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfVEFSR0VUX0hPU1Rfe0lOU1RBTEwsQ0hFQ0t9X01PRFVMRVMpOiBOZXcgdmFyaWFibGVzLgotCShBTExfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUy4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTLgotCi0xOTk4LTA3LTIzICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uIGFsbC1nY2MgYW5kCi0JYWxsLXRhcmdldC1uZXdsaWIuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiAkKEFMTF9HQ0MpLgotCi1TYXQgSnVsIDE4IDE0OjMyOjQzIENEVCAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogKCotcGMtc2NvMy4ydjUpIEFkZCBkZXRlY3Rpb24gZm9yIFBlbnRpdW0gSUkuCi0JKCotcGMtdW5peHdhcmU3KSBBZGQgZGV0ZWN0aW9uIGZvciBQZW50aXVtIElJLCBQZW50aXVtIFByby4KLQotRnJpIEp1bCAxNyAxMzozMDoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHlsd3JhcDogQ2hhbmdlIGFic29sdXRlIHBhdGggY2hlY2tzIHRvIGNoZWNrIGZvciBET1Mgc3R5bGUgcGF0aAotCW5hbWVzLgotCi0JKiB5bHdyYXA6IERvbid0IHVzZSBhIGZ1bGwgcGF0aCBuYW1lIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbiB0aGUKLQlzYW1lIGRpcmVjdG9yeS4gIEZyb20gaGpsQGx1Y29uLm9yZyAoSC5KLiBMdSkuCi0KLQkqIGNvbmZpZy1tbC5pbjogRGVmYXVsdCB0byBiZWluZyB2ZXJib3NlLCB0byBtYXRjaCBGZWIgMTggY2hhbmdlIHRvCi0JY29uZmlndXJlLgotCi1UaHUgSnVsIDE2IDEyOjI5OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJyb3VnaHQgb3ZlciBmcm9tIGVnY3M6Ci0KLQlTYXQgSnVuIDI3IDIyOjQ2OjMyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvICR7dGFyZ2V0X2FsaWFzfSBpbnN0ZWFkCi0Jb2YgImxpYnJhcmllcyIuCi0KLQlNb24gU2VwICAxIDE2OjQ1OjQ0IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvIGxpYnJhcmllcyBpZiBlbmFibGVfbXVsdGlsaWIuCi0KLVdlZCBKdWwgMTUgMDE6MDA6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogSWYgdGhlcmUgYXJlIGFueQotCW11bHRpbGlicywgZm9yY2UgcmVjb25maWd1cmF0aW9uIHRoZSBmaXJzdCB0aW1lIHdlIGNyZWF0ZQotCW11bHRpbGliLm91dCBpbiBhIHN1YmRpcmVjdG9yeSwgaW4gY2FzZSBUQVJHRVRfU1VCRElSIGlzIGAuJy4KLQotVHVlIEp1bCAxNCAyMzo0MTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgYW55IC0tbm8gb3B0aW9uIGZyb20gQ09ORklHX0FSR1VNRU5UUywgdG8KLQlhdm9pZCBjb25mdXNpb24gd2l0aCAtLW5vLXJlY3Vyc2lvbi4KLQotVHVlIEp1bCAxNCAxNTozNzo0MSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdpbjMyIGhvc3RzIHNob3VsZG4ndCB1c2UgaW5zdGFsbCAteAotCSogaW5zdGFsbC1zaDogcmVtb3ZlIC14IG9wdGlvbiwgYW5kIHNwZWNpYWwgLmV4ZS1oYW5kbGluZwotCWhhY2suCi0KLVR1ZSBKdWwgMTQgMTU6Mjg6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTU4Ni1wYy1iZW9zLgotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBzb21lIGJpdHMgZm9yIGJlb3MuCi0KLVR1ZSBKdWwgMTQgMTM6MjI6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIENDIGlzIHNldCBidXQgQ0ZMQUdTIGlzIG5vdCwgYW5kIENDIGlzIGdjYywgbWFrZQotCUNGTEFHUyBkZWZhdWx0IHRvIC1PMi4KLQotCSogbHRtYWluLnNoOiBBZGQgc29tZSBoYWNrcyB0byBtYWtlIFN1bk9TIC0tZW5hYmxlLXNoYXJlZCB3b3JrCi0Jd2hlbiB1c2luZyBHTlUgbGQuCi0KLUZyaSBKdWwgMTAgMTM6MTg6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IENvcnJlY3QgaW5zdGFsbCB3aGVuIHVzaW5nIGEgZGlmZmVyZW50IHNoZWxsLgotCi1UdWUgSnVsICA3IDE1OjI0OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yYi4KLQotVGh1IEp1bCAgMiAxMzo1NzozNiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gYnVpbGQgYmludXRpbHMvbWFrZWZpbGUudm1zLiAgQWRkIGluc3RhbGwKLQl0YXJnZXQuCi0KLVdlZCBKdWwgIDEgMTY6NDU6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogVXBkYXRlIHRvIGNvcnJlY3QgQUlYIGhhbmRsaW5nLgotCi1TYXQgSnVuIDI3IDIyOjQ2OjMyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBUQVJHRVRfU1VCRElSLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gJHt0YXJnZXRfYWxpYXN9IGluc3RlYWQKLQlvZiAibGlicmFyaWVzIi4KLQotMTk5OC0wNi0yNiAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogQWRkIGdjY192ZXJzaW9uX3RyaWdnZXIuCi0JKE1ha2VmaWxlKTogRGVwZW5kIG9uICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikuCi0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBDaGFuZ2UgZGVmYXVsdCBpbml0aWFsaXplciB0byBlbXB0eQotCXN0cmluZy4KLQkoZ2NjX3ZlcnNpb25fdHJpZ2dlcik6IE5ldyB2YXJpYWJsZTsgcGFzcyB0aGlzIHZhcmlhYmxlIGRvd24KLQl0byBzdWJkaXIgY29uZmlndXJlcyB0byBlbmFibGUgdGhlbSBjaGVja2luZyBnY2MncyB2ZXJzaW9uCi0JdGhlbXNlbHZlcy4gRW1pdCBtYWtlIG1hY3JvcyBmb3IgYm90aCBnY2NfdmVyc2lvbiB2YXJzLgotCSh0b3BzcmNkaXIpOiBJbml0aWFsaXplIHJlbGlhYmx5LgotCShyZWN1cnNpb24gbGluZSk6IFJlbW92ZSAtLXdpdGgtZ2NjLXZlcnNpb249JHtnY2NfdmVyc2lvbn0uCi0KLTE5OTgtMDYtMjQgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMpOiBJbXBsZW1lbnQgbmV3IGZsYWcKLQktLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlicyB3aGljaCBpbnN0YWxscyBDKysgcnVudGltZSBzdHVmZgotCWluICQobGlic3ViZGlyKTsgZW1pdCBkZWZpbml0aW9uIGluIGVhY2ggZ2VuZXJhdGVkIE1ha2VmaWxlLgotCShneHhfaW5jbHVkZV9kaXIpOiBJbml0aWFsaXplIGRlcGVuZGluZyBvbgotCSRlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMuCi0KLTE5OTgtMDYtMjQgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IEluaXRpYWxpemUgcHJvcGVybHkgZGVwZW5kaW5nIG9uCi0JaG93IGFuZCB3aGVyZSBjb25maWd1cmUgaXMgc3RhcnRlZC4KLQkocmVjdXJzaW9uIGxpbmUpOiBQYXNzIGEgLS13aXRoLWdjYy12ZXJzaW9uPSR7Z2NjX3ZlcnNpb259Ci0JdG8gY29uZmlndXJlcyBpbiBzdWJkaXJzLgotCi1XZWQgSnVuIDI0IDE2OjAxOjU5IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIGNvbmZpZ3VyZSBwYXR0ZXJuIGZvciBtaXBzIHR4MzkKLSAJY3lnbW9uCi0KLVR1ZSBKdW4gMjMgMjI6NDI6MzIgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gYW5kIGxpYnN0dWIgc3VwcG9ydCBmb3IgbW4xMDIwMC4KLQotMTk5OC0wNi0xOSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogQWRkIG5ldyB2YXJpYWJsZSBkZXNjcmliaW5nIHRoZQotCXBhcnRpY3VsYXIgZ2NjIHZlcnNpb24gd2UncmUgYnVpbGRpbmcuCi0JKiBNYWtlZmlsZS5pbiAobGlic3ViZGlyKTogQWRkIG5ldyBtYWNybyBmb3IgdGhlIGRpcmVjdG9yeQotCWluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBnY2NfdmVyc2lvbiwgdGFyZ2V0X2FsaWFzCi0JYW5kIGxpYnN1YmRpci4KLQotRnJpIEp1biAxOSAwMjozNjo1OSAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtY2xlYW4pOiByZW1vdmUgKi5sb2cKLQkod2FybmluZy5sb2cpOiBidWlsdCB3aXRoIHdhcm5fc3VtbWFyeSBmcm9tIGJ1aWxkLmxvZwotCShtYWlsLXJlcG9ydC5sb2cpOiBydW4gdGVzdF9zdW1tYXJ5Ci0JKG1haWwtcmVwb3J0LXdpdGgtd2FybmluZ3MubG9nKTogcnVuIHRlc3Rfc3VtbWFyeSBpbmNsdWRpbmcKLQl3YXJuaW5nLmxvZyBpbiB0aGUgcmVwb3J0Ci0KLVRodSBKdW4gMTggMTE6MjY6MDMgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IERldGVjdGlvbiBvZiBQZW50aXVtIElJIGZvciAqLXNjby0zLjJ2NSouCi0KLU1vbiBKdW4gMTUgMTQ6NTM6NTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZ3JlcCk6IEdyZXAgbm8gbG9uZ2VyIGRlcGVuZHMgb24gbGliaWJlcnR5LgotCi1GcmkgSnVuIDEyIDE0OjAzOjM0IDE5OTggIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFsbC1zbmF2aWdhdG9yIG5lZWRzIGFsbC1saWJndWkuCi0KLVRodSBKdW4gMTEgMTk6NDM6NDcgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gYW5kIGxpYnN0dWIgc3VwcG9ydCBmb3IgbW4xMDMwMC4KLQotV2VkIEp1biAxMCAxMToxOTo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pc3Npbmc6IFVwZGF0ZSB0byB2ZXJzaW9uIGZyb20gYXV0b21ha2UgMS4zLgotCi0JKiBsdG1haW4uc2g6IE9uIGluc3RhbGxhdGlvbiwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGlmIHRoZSBzYW1lIG5hbWUKLQlhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBsaXN0IG9mIGxpYnJhcnkgbmFtZXMuCi0KLVdlZCBKdW4gIDMgMTQ6NTE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgbTY4MDYwIGFuZCBtNTIwMCBhcyBDUFUgbmFtZXMuCi0KLU1vbiBKdW4gIDEgMTc6MjU6MTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFVzZSAmJiByYXRoZXIgdGhhbiB1c2luZyAtYSBpbiB0ZXN0LCBiZWNhdXNlIG9kZAotCXN0cmluZ3MgY2FuIGNvbmZ1c2UgdGVzdC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjggMTk6MzE6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBCcmluZyBpbiBWaXN1YWwgQysrIHN1cHBvcnQuCi0KLVNhdCBNYXkgMjMgMjM6NDQ6MTMgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3N0cmFwMi1sZWFuLCBib290c3RyYXAzLWxlYW4sCi0JYm9vdHN0cmFwNC1sZWFuKTogbmV3IHRhcmdldHMKLQotTW9uIE1heSAxMSAyMzoxMTozNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTElCOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLUZyaSBNYXkgIDggMDE6MzA6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjJhLgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTQl9TVVBQT1JUX0RJUlMpOiBSZW1vdmUgaW50bDsgYWxyZWFkeSBpbmNsdWRlZCB2aWEKLQlHQVNfU1VQUE9SVF9ESVJTLgotCi1UaHUgTWF5ICA3IDE3OjI3OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogQXZvaWQgcHJvZHVjaW5nIGEgdmVyc2lvbiBudW1iZXIgaWYKLQktdmVyc2lvbi1pbmZvIHdhcyBub3QgdXNlZC4KLQotVHVlIE1heSAgNSAxODowMjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIC0td2l0aC1uZXdsaWIgdG8gQ09ORklHX0FSR1VNRU5UUyBpZiB3ZSBhcmUKLQlidWlsZGluZyB3aXRoIG5ld2xpYi4KLQotMTk5OC0wNC0zMCAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAdHdpbnN1bi5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogUmVtb3ZlIGJhY2tzbGFzaCBhdCBlbmQ7Ci0gICAgICAgIFNvbGFyaXMgYG1ha2UnIGNhdXNlcyBpdCB0byBjb250aW51ZSB0byBuZXh0IGRlZmluaXRpb24uIAotCi1UdWUgQXByIDI4IDE2OjI0OjI0IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1nZGJ0ayk6IENhbGwgdGhpcyAnaW5zdGFsbC1nZGInIHNvIHRoYXQKLQl0aGUgcmlnaHQgR1VJIGxpYnJhcmllcyBhbmQgZmlsZXMgYXJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIEdEQi4KLQotVHVlIEFwciAyOCAxODoxMToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhIHRvIGFscGhhKiBpbiBzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAyOCAwNzo0MjowMCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyYzg2eC4KLQotVHVlIEFwciAyOCAwNzozNTowMiAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLSAKLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlKTogUmVtb3ZlIGRlYnVnIGVjaG8uCi0KLVRodSBBcHIgMjMgMjE6MzE6MTYgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBDWFhGTEFHUyBmcm9tIENYWEZMQUdTLCBub3QgQ0ZMQUdTLgotCi1UaHUgQXByIDIzIDEyOjI2OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFVwZGF0ZSBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBpbnRsLgotCShCSU5VVElMU19TVVBQT1JUX0RJUlMsIEdBU0JfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0JKEdEQl9TVVBQT1JUX0RJUlMpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyMiAxMjozMDoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IElmIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSwKLQl1c2UgLU9zIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcyByYXRoZXIgdGhhbiAtTzIuICBEZWZhdWx0IHRvCi0JdXNpbmcgLU9zIGZvciBkMTB2IGFuZCBtMzJyIGlmIC0te2VuYWJsZSxkaXNhYmxlfS10YXJnZXQtb3B0c3BhY2UgaXMKLQlub3QgdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NmbGFncyk6IERpdHRvIGZvciBkMzB2LgotCi1UdWUgQXByIDIxIDIzOjA2OjU0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgb24gYWxsLWludGwuCi0JKGFsbC1iaW51dGlscyk6IExpa2V3aXNlLgotCShhbGwtZ2FzKTogTGlrZXdpc2UuCi0JKGFsbC1ncHJvZik6IExpa2V3aXNlLgotCShhbGwtbGQpOiBMaWtld2lzZS4KLQotCi0xOTk4LTA0LTE5ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBGaXggdHlwbywgbGJ0b29sIC0+IGxpYnRvb2wuCi0KLUZyaSBBcHIgMTcgMTY6MjA6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJmZCk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCi0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIG5ld2VyIGN5Z3dpbjMyIHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMTI6MjI6MjIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGlic3R1Yi4KLQotCSogY29uZmlndXJlLmluOiBEaXR0by4gQnVpbGQgbGlic3R1YiBmb3IgdGFyZ2V0cyB0aGF0IGhhdmUgY3lnbW9uCi0Jc3VwcG9ydC4KLQotVHVlIEFwciAxNCAxODowMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFBJQ0ZMQUcgb24gaXg4Ni1jeWd3aW4zMi4KLQotVHVlIEFwciAxNCAxMjoyNDo0NSAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGlbMzQ1Nl05Ni0qLXN5c3Y1KiBhcyBhIHZhbGlkIGhvc3QsIGFuZAotCXVzZSBtaC1zeXN2NSBpZiBzcGVjaWZpZWQuICBTdXBwb3J0IGdwcm9mIG9uIFNDTyBPcGVuIFNlcnZlci4KLQotVHVlIEFwciAxNCAxMTozMzo1MSAxOTk4ICBLcmlzdGVyIFdhbGZyaWRzc29uIDxjYXRvQGRmLmx0aC5zZT4KLQotCSogY29uZmlndXJlOiBEZWZpbmUgREVGQVVMVF9NNCBieSBzZWFyY2hpbmcgUEFUSC4KLQkqIE1ha2ZpbGUuaW46IFVzZSBERUZBVUxUX000LgotCi1Nb24gQXByIDEzIDE1OjM3OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IEFkZCBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgbGlidG9vbCBhcyBhIG5hdGl2ZSBvbmx5IGRpcmVjdG9yeQotIAl0byBjb25maWd1cmUgYW5kIGJ1aWxkLgotCi1XZWQgQXByICA4IDEzOjE4OjU2IDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogWEZPTyBsaW5lcyBzaG9ydGVuZWQuCi0KLVRodSBBcHIgIDIgMTQ6NDg6NDQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBhc2ggbWFrZSBydWxlcwotCSogY29uZmlndXJlLmluOiBhZGQgYXNoIHRvIG5hdGl2ZV9vbmx5IGFuZCBob3N0X3Rvb2xzIGxpc3RzCi0KLVRodSBNYXIgMjYgMTI6NTM6MjAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQsIGFsbC1pbnRsKTogTmV3IHRhcmdldHMuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdldHRleHQsIGFsbC1pbnRsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stZ2V0dGV4dCwgY2hlY2staW50bC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1nZXR0ZXh0LCBpbnN0YWxsLWludGwuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nZXR0ZXh0LCBjbGVhbi1pbnRsLgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBnZXR0ZXh0LgotCShuYXRpdmVfb25seSk6IExpa2V3aXNlLgotCShub2NvbmZpZ2RpcnMpIFt2YXJpb3VzIGNhc2VzXTogTGlrZXdpc2UuCi0JKGhvc3RfbGlicyk6IEFkZGVkIGludGwuCi0KLVRodSBNYXIgMjYgMTU6MDA6MTEgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG8gbm90IGRpc2FibGUgYnVpbGRpbmcgZ2RidGsgZm9yIGN5Z3dpbjMyIGhvc3RzLgotCi1XZWQgTWFyIDI1IDExOjQ5OjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkoYWxsLXRhcmdldC13aW5zdXApOiAgYWxsLXRhcmdldC1saWJyeCBzdGF5cyBvdXQgb2YgaGVyZS4KLQotVHVlIE1hciAyNCAxNjo1ODoyOSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTLCBBTExfVEFSR0VUX01PRFVMRVMsIAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMsIAotCUlOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTLCBhbGwtdGFyZ2V0LXdpbnN1cCk6IAotCVJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYnJ4IGFuZCBsaWJnKysuCi0KLVR1ZSBNYXIgMjQgMTg6Mjg6MTIgMTk5OCAgRXJpYyBNdW1wb3dlciAgPG5vY3R1cm5lQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzICQobGlzcGRpcikgZG93biB0bwotCXJlY3Vyc2l2ZSBtYWtlcwotCi1UdWUgTWFyIDI0IDExOjM3OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgJChUQVJHRVRfU1VCRElSKSB3aGVuIHBhc3NpbmcgLUIKLQlmb3IgbmV3bGliIGRpcmVjdG9yeS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMyAxMTozMDoyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgYWZ0ZXIgbGlidG9vbC9sdGNvbmZpZy5pbiBjaGFuZ2UgZm9yCi0JaHB1eDExLgotCi1GcmkgTWFyIDIwIDE4OjUxOjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDA5OjMyOjE0IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZ2NjKTogRG9uJ3Qgc3BlY2lmeSBMQU5HVUFHRVMgaGVyZS4KLQkoaW5zdGFsbC1nY2MtY3Jvc3MpOiBJbnN0ZWFkLCBvdmVycmlkZSBMQU5HVUFHRVMgaGVyZS4KLQotMTk5OC0wMy0xOCAgRGF2ZSBMb3ZlICA8ZC5sb3ZlQGRsLmFjLnVrPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogU2V0IENPTkZJR19TSVRFIHRvIGEKLQlub24tZXhpc3RlbnQgZmlsZSBzaW5jZSAvZGV2L251bGwgbG9zZXMgd2l0aCBiYXNoIDIuMC9hdXRvY29uZiAyLjEyLgotCi1XZWQgTWFyIDE4IDA5OjI0OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFRodW1iLXBlIHRhcmdldC4KLQotVHVlIE1hciAxNyAxNjo1OTowMCAxOTk4ICBTeWQgUG9sayA8c3BvbGtAY3lnbnVzLmNvbT4KLQkqIE1ha2VmaWxlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQkqIGNvbmZpZ3VyZS5pbiAtIGNoYW5nZWQgc24gdGFyZ2V0cyB0byBzbmF2aWdhdG9yCi0KLVR1ZSBNYXIgMTcgMTA6MzM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWctbWwuaW46IEFmdGVyIGJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBjYWxsIG1ha2UgZGlzdGNsZWFuCi0JaWYgYSBNYWtlZmlsZSBnb3QgbGlua2VkIGludG8gJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgdGhpcyBoYXBwZW5zCi0JdG8gYmUgdGhlIGNhc2UgZm9yIGxpYmliZXJ0eS4KLQotVHVlIE1hciAxNyAxMDoyMjozNyAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWd1cmU6IFdoZW4gbWFraW5nIGxpbmssIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuIFRoZSBjb25maWd1cmUgc2NyaXB0cyBtYXkgY3JlYXRlIG9uZS4KLQotRnJpIE1hciAgNiAwMTowMjowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgYWxwaGFwY2E1NiBhbmQgYWxwaGFldjYgcHJvcGVybHkuCi0KLUZyaSBNYXIgIDYgMDA6MTQ6NTUgMTk5OCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0IDMgSmFuIGNoYW5nZSBmb3IgcG93ZXJwYy1saW51eC1nbnVsaWJjMS4KLQotCi1Nb24gRmViIDIzIDE1OjA5OjE4IDE5OTggIEJydW5vIEhhaWJsZSA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZQotCi0gICAgICAgICogY29uZmlnLnN1YiAoc2NvNSk6IEZpeCB0eXBvLgotCi1Nb24gRmViIDIzIDE0OjQ2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IE1vdmUgaW5zdGFsbC10Y2wgYmVmb3JlCi0JaW5zdGFsbC1pdGNsLgotCShpbnN0YWxsLWl0Y2wpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBpbnN0YWxsLXRjbC4KLQotTW9uIEZlYiAyMyAwOTo1MzoyOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYmdsb3NzIGZyb20gbm9jb25maWdkaXJzIGZvciBNTjEwMzAwLgotCi1GcmkgRmViIDIwIDE2OjQ3OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBsZXQgYnVpbGRzIGJlIGRvbmUgaW4gc291cmNlIHRyZWUuCi0KLVRodSBGZWIgMTkgMTM6NDA6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxpYmd1aSBmb3IgYSBjeWd3aW4zMiB0YXJnZXQgd2hlbiBub3Qgb24KLQlhIGN5Z3dpbjMyIGhvc3QuCi0KLVdlZCBGZWIgMTggMTI6Mjk6MDAgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAocmVkaXJlY3QpOiBTZXQgdG8gbnVsbCwgc28gZGVmYXVsdCBiZWhhdmlvciBvZgotCWNvbmZpZ3VyZSBpcyBub3cgLS12ZXJib3NlLgotCi0xOTk4LTAyLTE2ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBSdW4gY29uZmlndXJlIHdpdGgKLQlDT05GSUdfU0lURT0vZGV2L251bGwgdG8gZm9yZXN0YWxsIGxvc3NhZ2Ugd2l0aCBzaXRlIGNvbmZpZ3VyYXRpb24uCi0KLU1vbiBGZWIgMTYgMTI6MjM6NTMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxNYW5mcmVkLkhvbGxzdGVpbkBrcy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTKTogUmVhbGx5IGFkZAotCXRoaXMgY2hhbmdlIHRvIHN5bmMgTWFrZWZpbGUuaW4gd2l0aCBpdHMgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLVRodSBGZWIgMTIgMTU6MDM6MDggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsdG1haW4uc2ggKG1rZGlyKTogQ2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKLQliZWZvcmUgd2UgZXhpdCB3aXRoIGVycm9yLCBzbyB0aGF0IHdlIGRvbid0IGdldCByYWNlcyBkdXJpbmcKLQlwYXJhbGxlbCBidWlsZHMuCi0KLVNhdCBGZWIgIDcgMTU6MTk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGkuCi0KLUZyaSBGZWIgIDYgMDE6MzM6NTIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHIGFuZAotCVBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRG9uJ3QgcGFzcyBQSUNGTEFHX0ZPUl9UQVJHRVQuCi0KLQkqIGNvbmZpZ3VyZTogRW1pdCBhIGRlZmluaXRpb24gZm9yIHRoZSBuZXcgbWFjcm8gZW5hYmxlX3NoYXJlZAotCWludG8gZWFjaCBNYWtlZmlsZS4KLQotCSogY29uZmlnL21oLXNwYXJjcGljIChQSUNGTEFHKTogRGVmaW5lIHRvIHByb3Blcmx5IGFjY29yZGluZwotCXRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZy9tdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogRGVmaW5lIHRvIHByb3Blcmx5Ci0JYWNjb3JkaW5nIHRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQotVGh1IEZlYiAgNSAxNzowMToxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzLCBuYXRpdmVfb25seSk6IEFkZCBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjUzOjU4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHRhcmdldC1ncGVyZiB0byBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyLgotCUZpeCB0eXBvIGluIG1pbmcgY29uZmlnIGNvbW1lbnQuCi0KLVdlZCBGZWIgIDQgMTg6NTY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGguCi0KLU1vbiBGZWIgIDIgMTk6Mzg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgdGljMzAgY2FzZXMsIGFuZCBtYXAgYzMwIHRvIHRpYzMwLgotCi1GcmkgSmFuIDMwIDE3OjE4OjMyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBlY3QgZnJvbSBub2NvbmZpZ2RpcnMgd2hlbiB0YXJnZXQKLSAgICAgICAgaXMgY3lnd2luMzIuICBPSyB0byBidWlsZCBleHBlY3QgYW5kIGRlamFnbnUgd2l0aCBDYW5hZGlhbgotICAgICAgICBDcm9zcy4KLQotV2VkIEphbiAyOCAxMjo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXhwZWN0LCBkZWphZ251LCBhbmQgY3Zzc3JjIGZvciBhIGN5Z3dpbjMyCi0JaG9zdC4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgJHtVTkFNRV9NQUNISU5FfSByYXRoZXIgdGhhbiBpMzg2IGZvciBjeWd3aW4zMgotCWFuZCBtaW5ndzMyLgotCi1XZWQgSmFuIDI4IDEwOjI2OjM3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBwYXNzaW5nICQobG9jYWxfcHJlZml4KQotCWhlcmUgYXMgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHRvcGxldmVsIE1ha2VmaWxlLgotCi1UdWUgSmFuIDI3IDIzOjI1OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWcpOiBOZXcgdmFyaWFibGUsIHdoaWNoIG5hbWVzCi0JYSBmaWxlIHdpdGggZ2VuZXJpYyBydWxlcywgLi4uCi0JQ2hhbmdlIGNvbW1lbnQgdG8gbWVudGlvbiB3ZSBub3cgaGF2ZSBGSVZFIHBhcnRzLgotCSogY29uZmlndXJlOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UdWUgSmFuIDI3IDIzOjE1OjU1IDE5OTggIExhc3NpIEEuIFR1dXJhICA8bGF0QGlraS5maT4KLQotCSogY29uZmlnLmd1ZXNzOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCSogY29uZmlnLnN1YjogTW9yZSBhY2N1cmF0ZSBkZXRlcm1pbmF0aW9uIG9mIEhQIHByb2Nlc3NvciB0eXBlcy4KLQotU2F0IEphbiAyNCAwMTo1OTo0NSAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAocGFja2FnZV9tYWtlZmlsZV9mcmFnKTogTW92ZSBpbnNlcnRpbmcgdGhlCi0JJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IHRvIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcKLQl0byB0aGUgY29tbWVudC4KLQotRnJpIEphbiAyMyAwMDozMDoyMSAxOTk4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvQVJNLgotCi1UaHUgSmFuIDIyIDE1OjE0OjAxIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiAuY3ZzaWdub3JlOiBSZW1vdmUgKi1pbmZvIGFuZCAqLWluc3RhbGwgc2luY2UgdGhleSBtYXRjaAotCXJlbGVhc2UtaW5mbyBhbmQgbXB3LWluc3RhbGwsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8ganVzdCBpZ25vcmUuCi0KLVRodSBKYW4gMjIgMDE6Mzg6MzMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBhbHBoYS1saW51eC1nbnVsaWJjMS4KLQotU2F0IEphbiAxNyAyMToyODowOCAxOTk4ICBQaWV0ZXIgTmFnZWwgPHBuYWdlbEBlcGl1c2UuY28uemE+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY19pbmNsdWRlX2RpciBhbmQKLQlsb2NhbF9wcmVmaXggdG8gc3ViLW1ha2UgaW52b2NhdGlvbnMuCi0KLVNhdCBKYW4gMTcgMjE6MDQ6NTkgMTk5OCBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgbWFrZWZpbGUgZnJhZ21lbnRzIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnkuCi0KLUZyaSBKYW4gMTYgMDA6NDE6MzcgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogY29uZmlndXJlLmluOiBjaGVjayB3aGV0aGVyIGhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cyBleGlzdCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gKl9tYWtlZmlsZV9mcmFnCi0KLVdlZCBKYW4gMTQgMjM6Mzk6MTAgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBBZGQgY3lnbW9uIGZvciBzcGFyYzY0LWVsZi4KLQkKLVdlZCBKYW4gMTQgMTI6NDg6MDcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSByZXBsYWNlIFJQQVRIX0VOVlZBUiBvbgotCWxpbmVzIHdoaWNoIGJlZ2luIHdpdGggUlBBVEhfRU5WVkFSLCBpLmUuIGFkZCAiXiIgdG8gdGhlCi0JcmVnZXhwIHRvIHNlZC4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgUlJQQVRIX0VOVlZBUiBkb3duCi0JdG8gc3ViLW1ha2VzLgotCi0xOTk4LTAxLTEzICBMZWUgSXZlcnNvbiAgIChsZWVpQGFpLnNyaS5jb20pCi0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGktZG8pOiBMREZMQUdTIG11c3QgaW5jbHVkZSBtdWx0aWxpYgotCWRlc2lnbmF0b3IuCi0KLVR1ZSBKYW4gMTMgMDE6MTM6MjQgMTk5OCAgIFJvYmVydCBMaXBlIChyb2JlcnRsQGRnaWkuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpWzM0NTZdLWk1ODYtVW5peFdhcmU3LXN5c3Y1LgotCi1TdW4gSmFuICA0IDAxOjA2OjU1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIG1oLW1pbmd3MzI6IE5ldyBmaWxlLgotCi1TYXQgSmFuICAzIDEyOjExOjA1IDE5OTggRnJhbnogU2lybCA8ZnJhbnouc2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRmluYWxpemUgc3VwcG9ydCBmb3Ige2FscGhhfHBvd2VycGN9Ki0qLWxpbnV4LWdudWxpYmMxCi0KLVN1biBEZWMgMjggMTE6Mjg6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBEbyBpbnN0YWxsLWdjYyBmaXJzdC4KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHN1YmRpcnMKLQl3aGljaCBkbyBub3QgdXNlIGF1dG9jb25mLgotCi1XZWQgRGVjIDI0IDIyOjQ2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBTeW5jIHdpdGggZWdjcy4gIFBpY2tzIHVwIG5ldyBhbHBoYSBzdXBwb3J0LAotCUJlT1MgJiBzb21lIGFkZGl0aW9uYWwgbGludXggc3VwcG9ydC4KLQotVHVlIERlYyAyMyAxMjo0NTo1MCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSFAgOTAwMC84MDMgaXMgYSBQQTEuMSBtYWNoaW5lLgotCi0KLVN1biBEZWMgMjEgMTY6NTM6MTIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnLCB0YXJnZXRfbWFrZWZpbGVfZnJhZyk6Ci0gICAgICAgIEhhbmRsZSBtdWx0aXBsZSBjb25maWcgZmlsZXMuCi0gICAgICAgIChhbHBoYS0qLWxpbnV4Kik6IFRyZWF0IGFscGhhLSotbGludXgqIGFzIGFscGhhLSotbGludXgqIGFuZAotICAgICAgICBhbHBoYS0qLSouCi0KLVRodSBEZWMgMTggMTM6MTM6MDMgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE3IDA5OjUzOjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQWxsb3cgY29uZmlndXJpbmcgb2YgbGliaWRlLCB2bWFrZSwgZXRjLgotCi1UdWUgRGVjIDE2IDE3OjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJndWkgZGlyZWN0b3J5LgotCShHREJfVEspOiBBZGQgYWxsLWxpYmd1aS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IEFkZCBhbGwtbGliZ3VpIHRvIEdEQl9USy4KLQotTW9uIERlYyAxNSAxNjoxMjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG11bHRpZGlycyk6IEFkZCBtMzJyIHRvIG11bHRpbGliIGxpc3QuCi0KLUZyaSBEZWMgMTIgMTA6NDM6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogQ2hhbmdlIGRlcGVuZGVuY3kgdG8KLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotVGh1IERlYyAxMSAyMzozMDo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgQmVPUyBzdXBwb3J0LgotCi1XZWQgRGVjIDEwIDE1OjEwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNvdXJjZSBkaXJlY3RvcnkgY3ZzIHJlbmFtZWQgdG8gY3Zzc3JjOgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQ2hhbmdlIGN2cyB0byBjdnNzcmMuCi0JKG5hdGl2ZV9vbmx5KTogTGlrZXdpc2UuCi0JKG5vY29uZmlnZGlycykgW3ZhcmlvdXMgY2FzZXNdOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IENoYW5nZSBhbGwtY3ZzIHRvIGFsbC1jdnNzcmMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBDaGFuZ2UgY2hlY2stY3ZzIHRvIGNoZWNrLWN2c3NyYy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQ2hhbmdlIGluc3RhbGwtY3ZzIHRvIGluc3RhbGwtY3Zzc3JjLgotCShDTEVBTl9NT0RVTEVTKTogQ2hhbmdlIGNsZWFuLWN2cyB0byBjbGVhbi1jdnNzcmMuCi0JKGFsbC1jdnNzcmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYWxsLWN2cy4KLQotV2VkIERlYyAgMyAwNzo1NTo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogRml4IHRoaW5rby4KLQotVHVlIERlYyAgMiAxMDo1NTozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVF9DUk9TUyk6IERlZmluZS4KLQkoaW5zdGFsbC1jcm9zcywgaW5zdGFsbC1nY2MtY3Jvc3MpOiBOZXcgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAxMDowODozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU3VuIE5vdiAzMCAxNjoxMjoyNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgY3lnbW9uLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGN5Z21vbiBmb3Igc3BhcmMtZWxmIGFuZCBzcGFyY2xpdGUtYW91dC4KLQotVGh1IE5vdiAyNyAwMTozMTozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBOb3YgMjYgMTE6NTM6MzMgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgQ2hhbmdlTG9nOiBtZXJnZSB3aXRoIGZvdW5kcnkncwotCTExLzE4Lzk3IGJ1aWxkIAotCi1XZWQgTm92IDI2IDE2OjA4OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogRnJvbSBGcmFueiBTaXJsLgotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjKi0qLWxpbnV4KTogSGFuZGxlIGdsaWJjMiBiZXRhIHJlbGVhc2UKLQlmb3VuZCBvbiBSZWRIYXQgTGludXggc3lzdGVtcy4KLQotRnJpIE5vdiAyMSAwOTo1MTowMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoYWxwaGEgc3R1ZmYpOiBNZXJnZSB3aXRoIEZTRiB0byBhdm9pZCBpbmNvcnJlY3QKLQlndWVzc2VzLgotCi1UaHUgTm92IDEzIDExOjM4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKTogVHdlYWsuCi0KLU1vbiBOb3YgMTAgMTU6MjM6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbHRtYWluLnNoOiBJZiBta2RpciBmYWlscywgY2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkCi0JYW55aG93IGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcy4KLQotTW9uIE5vdiAxMCAxNDozODowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBhbGwgZGlyZWN0b3JpZXMuCi0KLVN1biBOb3YgIDkgMTc6MzY6MjAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgbmV3bGliLCBsaWJpYmVydHkgZGlyZWN0b3JpZXMKLQlmb3IgdGhlIEQzMFYuCi0KLVNhdCBOb3YgIDggMTQ6NDI6NTkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgdGFyZ2V0LWxpYmdsb3NzIG9uIHRoZSBEMzBWLgotCi1GcmkgTm92ICA3IDEwOjM0OjA5IDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGluY2x1ZGUvbGliaWJlcnR5Lmg6IEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3Jtcy4KLSAgICAgICAgKiBpbmNsdWRlL3JlbW90ZS1zaW0uaDogIEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3JhbXMuCi0KLVRodSBPY3QgMzAgMTE6MDk6MjkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgR0NDIG5vdy4KLQotTW9uIE9jdCAyNyAxMzoxNzoyNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGEgInNlY29uZCBwYXNzIiBvZiB0d2Vha2luZyBub2NvbmZpZ2RpcnMsCi0JaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIE9jdCAyNyAxMjowMzo1MyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGVjay10YXJnZXQtbGliaW8gZGVwZW5kcyBvbiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotU3VuIE9jdCAyNiAxMTo0ODoyNyAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgKG1hbmZyZWRAcy1kaXJla3RuZXQuZGUpCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IENvbWJpbmVkIHdpdGggYG5vcm1hbCcgYm9vdHN0cmFwCi0JdGFyZ2V0cyB1c2luZyAiJEAiIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igc2ltaWxhciBidXQgbm90IGlkZW50aWNhbAotCXRhcmdldHMgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUuCi0KLU1vbiBPY3QgMjAgMTU6Mjg6NDkgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IHRvIHdvcmsgd2l0aCBERUMgQy4KLQotVHVlIE9jdCAgNyAyMzo1ODo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHMtdHgzOS1lbGYgdG8gbWFya2V0aW5nIG5hbWVzLgotCi1UdWUgT2N0ICA3IDE0OjI0OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgc3ltbGlua3MgaW4gZ2VuZXJhdGVkIHNjcmlwdC4KLQotV2VkIE9jdCAgMSAxMzoxMToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGF1dG9jb25mIHN0eWxlIGRpcmVjdG9yeSBvcHRpb25zOiAtLWJpbmRpciwKLQktLWRhdGFkaXIsIC0taW5jbHVkZWRpciwgLS1pbmZvZGlyLCAtLWxpYmRpciwgLS1saWJleGVjZGlyLAotCS0tbWFuZGlyLCAtLW9sZGluY2x1ZGVkaXIsIC0tc2JpbmRpciwgLS1zaGFyZWRzdGF0ZWRpciwKLQktLXN5c2NvbmZkaXIuCi0JKiBNYWtlZmlsZS5pbiAoc2JpbmRpciwgbGliZXhlY2Rpciwgc3lzY29uZmRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKHNoYXJlZHN0YXRlZGlyLCBsb2NhbHN0YXRlZGlyLCBvbGRpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGJpbmRpciwgZGF0YWRpciwgaW5jbHVkZWRpciwKLQlpbmZvZGlyLCBsaWJkaXIsIGxpYmV4ZWNkaXIsIGxvY2Fsc3RhdGVkaXIsIG1hbmRpciwgb2xkaW5jbHVkZWRpciwKLQlzYmluZGlyLCBzaGFyZWRzdGF0ZWRpciwgYW5kIHN5c2NvbmZkaXIuCi0KLU1vbiBTZXAgMjkgMDA6Mzg6MDggMTk5NyBBYXJvbiBKYWNrc29uIDxqYWNrc29uQG5lZ3JpbC5tc3JjZS5ob3dhcmQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLWxlYW4pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE4OjA2OjI3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiAgUmVtb3ZlIHRjbCwgdGssIGV4cGVjdCwgZ2RiLCBpdGNsLCB0aXgsIGRiLAotIAlzbiwgYW5kIGdudXNlcnYgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBTZXAgMjQgMTU6MTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFR3ZWFrIHNoZWxsIHBhdHRlcm4gdG8gYXZvaWQgYnVnIGluIE5ldEJTRCAvYmluL3NoLgotCi1UaHUgU2VwIDE4IDIzOjU4OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotKiBNYWtlZmlsZS5pbiAoY3Jvc3MpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDE4IDIxOjQzOjIzIDE5OTcgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCQkJICBKZWZmIExhdyAgICAgICAgIDxsYXdAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWJvb3RzdHJhcCk6IFJlbW92ZSBvdXRkYXRlZCBhbmQgY29uZnVzaW5nIHRhcmdldC4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogRG9uJ3QgcGFzcyBCT09UX0NGTEFHUyBkb3duLgotCi1UaHUgU2VwIDE4IDE1OjM3OjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlICh0b29sZGlyKTogZW5hYmxlX2dkYnRrPVlFUyBmb3IgY3lnd2luMzIsIE5PIGZvcgotIAl3aW5kb3dzLiAgQ29uc2lzdGVudCB3aXRoIGdkYi9jb25maWd1cmUuCi0KLQotMTk5Ny0wOS0xNSAwMjozNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC1saW51eDogRGVmaW5lIENYWEZMQUdTIHRvIG1ha2Ugc3VyZSAtZnZ0YWJsZS10aHVua3MgaXMKLQl1c2VkLgotCSogY29uZmlndXJlLmluOiBOYW1lIExpbnV4IHRhcmdldCBmcmFnbWVudC4KLQotCSogY29uZmlndXJlOiBSZXdyaXRlIHNvIHRoYXQgcHJvamVjdCBNYWtlZmlsZSBmcmFnbWVudCBpcyBpbnNlcnRlZAotCWZpcnN0IGFuZCBhcHBlYXJzIGxhc3QgaW4gdGhlIHJlc3VsdGluZyBNYWtlZmlsZS4KLQotVHVlIFNlcCAxNiAwOTo1NTowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWl0Y2wpOiBJbnN0YWxsIHRjbCBmaXJzdC4KLQotU3VuIFNlcCAxNCAyMDo1Mzo0MiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IG9rIHRvIGJ1aWxkIHNwbGl0IHRleGluZm8gZmlsZXMKLQotRnJpIFNlcCAxMiAxNjoxOToyMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCQotCSogY29uZmlndXJlLmluOiByZW1vdmUgYmlzb24gZnJvbSBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyIGhvc3QKLQotVGh1IFNlcCAxMSAxNjo0MDo0NiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogQWxzbyByZW1vdmUgbWgtZnJhZyBtdC1mcmFnLgotCi0JKiBjb25maWd1cmUuaW4gKHNraXBkaXJzKTogQWRkIHRhcmdldC1saWJyeCBmb3IgTGludXguCi0JKGFscGhhLSotbGludXgqKTogVXNlIGNvbmZpZy9taC1lbGZhbHBoYXBpYyBhbmQgY29uZmlnL210LWVsZmFscGhhcGljLgotCi1XZWQgU2VwIDEwIDIxOjI5OjU0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IE5ldyB0YXJnZXQuCi0KLVdlZCBTZXAgMTAgMTU6MTk6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgJ2FtaWdhZG9zJyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eS4KLQotTW9uIFNlcCAgOCAyMDo0NjoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCi0KLVN1biBTZXAgIDcgMTU6NTU6MjggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCAibWFya2V0aW5nLW5hbWVzIiBwYXRjaC4KLQotRnJpIFNlcCAgNSAxNjoxMToyOCAxOTk3ICBKb2VsIFNoZXJyaWxsICAoam9lbEBPQVJjb3JwLmNvbSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoKi0qLXJ0ZW1zKik6IERvIG5vdCBidWlsZCBsaWJnbG9zcyBmb3IgcnRlbXMuCi0KLUZyaSBTZXAgIDUgMTI6Mjc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC1lbGYuCi0KLVdlZCBTZXAgIDMgMTI6MTU6MjQgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogU2V0IENPTkZJR19TSEVMTCBpbiBsaWJ0b29sLgotCSogbHRtYWluLnNoOiBVc2UgQ09ORklHX1NIRUxMIGluc3RlYWQgb2YgL2Jpbi9zaAotCi1Nb24gU2VwICAxIDE2OjQ1OjQ0IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvIGxpYnJhcmllcyBpZiBlbmFibGVfbXVsdGlsaWIuCi0KLVdlZCBBdWcgMjcgMTY6MTU6MTEgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFVwZGF0ZSBmcm9tIGdjYyBkaXJlY3RvcnkuCi0KLVR1ZSBBdWcgMjYgMTY6NDY6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXNpbSk6IERlcGVuZHMgb24gYWxsLXJlYWRsaW5lLgotCi1XZWQgQXVnIDIwIDE5OjU3OjM3IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OLCBZQUNDKTogVXNlICQkcy4KLQkoYWxsLWJpc29uKTogRGVwZW5kIG9uIGFsbC10ZXhpbmZvLgotCi1UdWUgQXVnIDE5IDAxOjQxOjMyIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogQWRkIC1MIGZsYWcuCi0JKFlBQ0MpOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuIAotCQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjMwOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuIAotCQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAwOToyNDowNiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHN0eDM5LiAgRGVsZXRlIHIzOTAwLgotCi1Nb24gQXVnIDE4IDE3OjIwOjEwIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtYXV0b2NvbmYpOiBEZXBlbmRzIG9uIGFsbC10ZXhpbmZvLgotCi1GcmkgQXVnIDE1IDIzOjA5OjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHtwb3dlcnBjLHJzNjAwMH0qLSotKik6IFVwZGF0ZSB0byBjdXJyZW50IEFJWCBhbmQKLQllYWJpIHRhcmdldHMuCi0KLVRodSBBdWcgMTQgMTQ6NDI6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEdldCBDRkxBR1MgYW5kIENYWEZMQUdTIGZyb20gTWFrZWZpbGUsIGlmIHBvc3NpYmxlLgotCi0JKiBjb25maWd1cmU6IFdoZW4gaGFuZGxpbmcgYSBDYW5hZGlhbiBDcm9zcywgaGFuZGxlIFlBQ0MgYXMgd2VsbCBhcwotCUJJU09OLiAgSnVzdCBzZXQgQklTT04gdG8gYmlzb24uICBXaGVuIHNldHRpbmcgWUFDQywgcHJlZmVyIGJpc29uLgotICAgICAgICAqIE1ha2VmaWxlLmluIChhbGwtYmlzb24pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KLQotVHVlIEF1ZyAxMiAyMDowOTo0OCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IGJpc29uLCBub3QgYnlhY2Mgb3IgYmlzb24gLXkuCi0JKFlBQ0MpOiBiaXNvbiAteSBvciBieWFjYyBvciB5YWNjLgotCSh2YXJpb3VzKTogQWRkICotYmlzb24gYXMgYXBwcm9wcmlhdGUuCi0JKHRheik6IE5vIG5lZWQgdG8gbWVzcyB3aXRoIEJJU09OIGFueW1vcmUuCi0KLVR1ZSBBdWcgMTIgMjI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIE9TVFlQRSBtYXRjaGVzICp3aW4zMiosIHRyeSB0byBmaW5kIGEgZ29vZCB2YWx1ZSBmb3IKLQlDT05GSUdfU0hFTEwuCi0KLVN1biBBdWcgMTAgMTQ6NDE6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEFNX0lOSVRfQVVUT01BS0UgaW4KLQljb25maWd1cmUuaW4gaWYgaXQgaXMgcHJlc2VudC4KLQotU2F0IEF1ZyAgOSAwMDo1ODowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogQ2hhbmdlIGxkLm5ldyB0byBsZC1uZXcuCi0KLUZyaSBBdWcgIDggMTY6MzA6MTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGBhcmMnIGNwdS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWctbWwuaW46IExpa2V3aXNlLgotCi1UaHUgQXVnICA3IDExOjAyOjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoSU5TVEFMTF9YMTFfTU9EVUxFUykpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KLQotV2VkIEF1ZyAgNiAxNjoyNzoyOSAxOTk3ICBDaHJpcyBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlZCBzZWQgZGVsaW1pdGVyIGZyb20gJzonIHRvICd8JyB3aGVuCi0JYXR0ZW1wdGluZyB0byBzdWJzdGl0dXRlICR7Y29uZmlnX3NoZWxsfSBmb3IgU0hFTEwuIE9uCi0JTlQgJHtjb25maWdfc2hlbGx9IG1heSBjb250YWluIGEgJzonIGluIGl0LgotCi1XZWQgQXVnICA2IDEyOjI5OjA1IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBmb3Igbm9uLWJhc2ggc2hlbGxzLgotCi1XZWQgQXVnICA2IDAwOjQyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFTX0ZPUl9UQVJHRVQpOiBDaGFuZ2UgYXMubmV3IHRvIGFzLW5ldy4KLQotVHVlIEF1ZyAgNSAxNDowODo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogQ2hhbmdlIG5tLm5ldyB0byBubS1uZXcuCi0KLQkqIHlsd3JhcDogSWYgdGhlIHByb2dyYW0gaXMgYSByZWxhdGl2ZSBwYXRoLCBmb3JjZSBpdCB0byBiZQotCWFic29sdXRlLgotCi1UdWUgQXVnICA1IDEyOjEyOjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlICh0b29sZGlyKTogU2V0IEJJU09OIHRvIGBiaXNvbiAteScgYW5kIG5vdCBqdXN0IGJpc29uLgotCi1Nb24gQXVnICA0IDIyOjU5OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBXaGVuIHdpbnN1cC9NYWtlZmlsZSBwcmVzZW50LAotIAljb3JyZWN0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGJ1aWxkIGRpcmVjdG9yeSAkKFRBUkdFVF9TVUJESVIpL3dpbnN1cAotIAlmb3IgbGlicmFyaWVzLgotCi1Nb24gQXVnICA0IDEyOjQwOjI0IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCB2YWx1ZXMKLSAJc2VwYXJhdGVkIGJ5IHNwYWNlcy4KLQotVGh1IEp1bCAzMSAxOTo0OTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHlsd3JhcDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHlsd3JhcC4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgL2Jpbi9zaCBhdCBzdGFydCBvZiBpbnN0YWxsIHByb2dyYW0uCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbHRjb25maWcsIGx0bWFpbi5zaCwgYW5kIG1pc3NpbmcuCi0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IE5ldyBmaWxlcywgZnJvbSBsaWJ0b29sIDEuMC4KLQkqIG1pc3Npbmc6IE5ldyBmaWxlLCBmcm9tIGF1dG9tYWtlIDEuMi4KLQotVGh1IEp1bCAyNCAxMjo1Nzo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBUcmVhdCB0aXggbGlrZSB0aywgcHV0dGluZyBpdCBpbiBYMTFfTU9EVUxFUy4gIEFkZAotCWNoZWNrLXRrIHRvIENIRUNLX1gxMV9NT0RVTEVTLgotCi1XZWQgSnVsIDIzIDE3OjAzOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLVR1ZSBKdWwgMjIgMTk6MDg6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgSnVsIDIyIDE0OjUwOjQyIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29uZmlndXJlOiBUcmVhdCBtc2Rvc2RqZ3BwIGxpa2UgZ28zMi4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuICBEb24ndCByZW1vdmUgZ3Byb2YgZm9yIGdvMzIuCi0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlIE1ha2VmaWxlLnRlbTIgdG8gTWFrZWZpbGUudG0yLgotCi1Nb24gSnVsIDIxIDEwOjMxOjI2IDE5OTcgIFN0ZXBoZW4gUGV0ZXJzICA8c3BldGVyc0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEZvciBhbHBoYS1kZWMtb3NmKiwgZG9uJ3QgaWdub3JlIGdyZXAuCi0KLVR1ZSBKdWwgMTUgMTQ6MzM6MDMgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKLQlleGlzdHMuICBTYW1lIGFzIE5vdiAxMXRoIGNoYW5nZS4KLQotTW9uIEp1bCAxNCAxMTowMToxNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChHREJfVEspOiBOZWVkcyBpdGNsIGFuZCB0aXguIAotCi1Nb24gSnVsIDE0IDAwOjMyOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBKdWwgMTEgMTE6NTc6MTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHREJfVEspOiBEZXBlbmQgb24gaXRjbCBhbmQgdGl4LgotCi1GcmkgSnVsICA0IDEzOjI1OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfUFJPR1JBTV9BUkdTKTogTmV3IHZhcmlhYmxlLgotCShJTlNUQUxMX1BST0dSQU0pOiBVc2UgJChJTlNUQUxMX1BST0dSQU1fQVJHUykuCi0JKElOU1RBTExfU0NSSVBUKTogTmV3IHZhcmlhYmxlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gSU5TVEFMTF9TQ1JJUFQuCi0JKiBjb25maWd1cmUuaW46IElmIGhvc3QgaXMgKi0qLWN5Z3dpbjMyKiwgc2V0IElOU1RBTExfUFJPR1JBTV9BUkdTCi0JdG8gLXguCi0JKiBpbnN0YWxsLXNoOiBBZGQgc3VwcG9ydCBmb3IgLXggb3B0aW9uLgotCi1Nb24gSnVuIDMwIDE1OjUxOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgaXRjbC4KLQotVGh1IEp1biAyNiAxMzo1OToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChXSU5EUkVTKTogTmV3IHZhcmlhYmxlLgotCShXSU5EUkVTX0ZPUl9UQVJHRVQpOiBOZXcgdmFyaWFibGUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBXSU5EUkVTX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBBZGQgV0lORFJFUy4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IEFkZCBXSU5EUkVTLgotCSgkKERPX1gpKTogUGFzcyBkb3duIFdJTkRSRVMuCi0JKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IFNldCBXSU5EUkVTIHdoZW4gY29uZmlndXJpbmcuCi0JKiBjb25maWd1cmU6IFRyZWF0IFdJTkRSRVMgbGlrZSBETExUT09MLCBhbmQgV0lORFJFU19GT1JfVEFSR0VUIGxpa2UKLQlETExUT09MX0ZPUl9UQVJHRVQuCi0KLVdlZCBKdW4gMjUgMTU6MDE6MjYgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBzaW0gYmVmb3JlIGdkYiBmb3Igd2luMzIteC1wcGMKLQotV2VkIEp1biAyNSAxMjoxODo1NCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGdwZXJmIGludG8gdGhlIHRvcGxldmVsLCBmcm9tIGxpYmcrKy4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3Rvb2xzKTogQWRkIHRhcmdldC1ncGVyZi4KLQkobmF0aXZlX29ubHkpOiBBZGQgdGFyZ2V0LWdwZXJmLgotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtZ3BlcmYpOiBOZXcgdGFyZ2V0LCBkZXBlbmQgb24KLQlhbGwtdGFyZ2V0LWxpYmcrKy4KLQkoY29uZmlndXJlLXRhcmdldC1ncGVyZik6IEVtcHR5IHJ1bGUuCi0JKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBhbGwtdGFyZ2V0LWdwZXJmLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBBZGQgY29uZmlndXJlLXRhcmdldC1ncGVyZi4KLQkoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBBZGQgY2hlY2stdGFyZ2V0LWdwZXJmLgotCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGluc3RhbGwtdGFyZ2V0LWdwZXJmLgotCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IEFkZCBjbGVhbi10YXJnZXQtZ3BlcmYuCi0KLU1vbiBKdW4gMjMgMTA6NTE6NTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotIAotCSogY29uZmlnLnN1YiAobW4xMDIwMCk6IFJlY29nbml6ZSBuZXcgYmFzaWMgbWFjaGluZS4KLQotVGh1IEp1biAxOSAxNDoxNjo0MiAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IEVOQUJMRV9NVUxUSUxJQiwgc28gd2UnbGwgYmUgcGFzc2luZwotCS0tZW5hYmxlLW11bHRpbGliIGRvd24gdG8gc3ViZGlyczsgc2V0dGluZyBUQVJHRVRfU1VCRElSIHdhcyBlbm91Z2guCi0KLVR1ZSBKdW4gMTcgMTU6MzE6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHdlJ3JlIGJ1aWxkaW5nIG1pcHMtc2dpLWlyaXg2KiBuYXRpdmUsIHR1cm4gb24KLQlFTkFCTEVfTVVMVElMSUIgYW5kIHNldCBUQVJHRVRfU1VCRElSLgotCi1UdWUgSnVuIDE3IDEyOjIwOjU5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zbik6IERlcGVuZCBvbiBhbGwtZ3JlcC4KLQotTW9uIEp1biAxNiAxMToxMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLXBwY3BpYyBhbmQgbXQtcHBjcGljIGZvciBwb3dlcnBjKi0qIHRhcmdldHMuCi0KLQkqIGNvbmZpZ3VyZTogU2V0IENGTEFHUyBhbmQgQ1hYRkxBR1MsIGFuZCBzdWJzdGl0dXRlIHRoZW0gaW50bwotCU1ha2VmaWxlLiAgRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCSogTWFrZWZpbGUuaW46IEFkZCBjb21tZW50IGZvciBDRkxBR1MgYW5kIENYWEZMQUdTLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEJJU09ORklMRVMpOiBSZW1vdmUuCi0JKHRheik6IERvbid0IGZ1dHogd2l0aCBESVNUQklTT05GSUxFUy4gIENoYW5nZSBCSVNPTiB0byB1c2UKLQkkKERFRkFVTFRfWUFDQykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgaXRsLCBkYiwgc24sIGV0Yy4sIHdoZW4gYnVpbGRpbmcgZm9yIG5hdGl2ZQotIAljeWd3aW4zMi4KLQotCSogTWFrZWZpbGUuaW4gKExEKTogTmV3IHZhcmlhYmxlLgotCShFWFRSQV9IT1NUX0ZMQUdTKTogUGFzcyBkb3duIExELgotCSgkKERPX1gpKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTYgMTE6MTA6MzUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8UGhpbGlwLkJsdW5kZWxsQHBvYm94LmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgJChTSEVMTCkgd2hlbiBleGVjdXRpbmcgaW5zdGFsbC1zaC4KLQotRnJpIEp1biAxMyAxMDoyMjo1NiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFN0cmlwIG91dCBhbnkgc3VwcGxpZWQgLS1idWlsZCBhcmd1bWVudAotIAliZWZvcmUgYWRkaW5nIG91ciBvd24uIEFsd2F5cyBhZGQgLS1idWlsZC4KLQotVGh1IEp1biAxMiAyMToxMjoyOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFBhc3MgLS1idWlsZCBpZiB3ZSdyZSBkb2luZwotCWEgY3Jvc3MtY29tcGlsZS4KLQotRnJpIEp1biAgNiAyMTozODo0MCAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFVzZSAnfCcgaW5zdGVhZCBvZiAiOiIgYXMgdGhlIHNlcGVyYXRvciBpbgotCXNlZC4gT3RoZXJ3aXNlIHNlZCBjaG9rZXMgb24gTlQgcGF0aCBuYW1lcyB3aXRoIGRyaXZlCi0JZGVzaWduYXRvcnMuIEFsc28gbG9vayBmb3IgIj86KiIgYXMgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBpbiBhbgotCWFic29sdXRlIHBhdGhuYW1lLgotCi1Nb24gSnVuICAyIDEzOjA1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBTdXBwb3J0IGZvciByMzkwMC4KLQotV2VkIE1heSAyMSAxNzozMzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGluc3RhbGwtc2gsIG5vdCBpbnN0YWxsLnNoLgotCi1XZWQgTWF5IDE0IDE2OjA2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEltcHJvdmUgY2hlY2sgZm9yIEJJU09OIHNvIGl0IGRvZXNuJ3QgdHJ5IHRvCi0JYXBwbHkgaXQgdHdpY2UuCi0KLUZyaSBNYXkgIDkgMTc6MjI6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9NT0RVTEVTKTogUHV0IGluc3RhbGwtb3Bjb2RlcyBiZWZvcmUKLQlpbnN0YWxsLWJpbnV0aWxzLgotCi1UaHUgTWF5ICA4IDE3OjI5OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBhdXRvbWFrZSB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkIGF1dG9tYWtlLgotCi1UdWUgTWF5ICA2IDE1OjQ5OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEZWZhdWx0IENYWCB0byBjKyssIG5vdCBnY2MuCi0JKiBNYWtlZmlsZS5pbiAoQ1hYKTogU2V0IHRvIGMrKywgbm90IGdjYy4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBXaGVuIGNyb3NzLCB0cmFuc2Zvcm0gYysrLCBub3QgZ2NjLgotCi1UaHUgTWF5ICAxIDEwOjExOjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGluc3RhbGwtc2g6IHRyeSBhcHBlbmRpbmcgYSAuZXhlIGlmIHNvdXJjZSBmaWxlIGRvZXNuJ3QKLQlleGlzdAotCi1XZWQgQXByIDMwIDEyOjA1OjM2IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUdXJuIG9uIG11bHRpbGliIGJ5IGRlZmF1bHQuCi0JKGNyb3NzX29ubHkpOiBSZW1vdmUgdGFyZ2V0LWxpYmliZXJ0eS4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEb24ndCBkZXBlbmQgb24gbGliaWJlcnR5LgotCi1Nb24gQXByIDI4IDE4OjM5OjQ1IDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogaW1wcm92ZSBhbGdvcml0aG0gZm9yIHJlY29nbml6aW5nIEdudSBIdXJkIHg4Ni4KLQotVGh1IEFwciAyNCAxOTozMDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbXB3LWluc3RhbGwuCi0JKERJU1RCSVNPTkZJTEVTKTogQWRkIGxkL01ha2VmaWxlLmluCi0KLVR1ZSBBcHIgMjIgMTc6MTc6MjggMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBpZiB0YXJnZXQgaXMgY3lnd2luMzIgYnV0IGhvc3QgaXNuJ3QgY3lnd2luMzIsCi0JZG9uJ3QgY29uZmlndXJlIGdkYiB0Y2wgdGsgZXhwZWN0LCBub3QganVzdCBnZGIuCi0KLU1vbiBBcHIgMjEgMTM6MzM6MzkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGdudXNlcnYgZXZlcnl3aGVyZSBzbiBhcHBlYXJzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZ251c2Vydi4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdudXNlcnYuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ251c2Vydi4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWdudXNlcnYuCi0JKGFsbC1nbnVzZXJ2KTogTmV3IHRhcmdldC4KLQotVGh1IEFwciAxNyAxMzo1NzowNiAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5ndWVzczogRml4ZXMgZm9yIE1JUFMgT3BlbkJTRCBzeXN0ZW1zLgotCi1UdWUgQXByIDE1IDEyOjIxOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBSZW1vdmUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBJTlNUQUxMX1hGT1JNLgotCi0JKiBta2luc3RhbGxkaXJzOiBOZXcgZmlsZSwgY29waWVkIGZyb20gYXV0b21ha2UuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbGRpcnMpOiBSZW5hbWUgZnJvbSBpbnN0YWxsLWRpcnMuICBVc2UKLQlta2luc3RhbGxkaXJzLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkoREVWT19TVVBQT1JUKTogQWRkIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTE6MjE6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoOiBSZW5hbWUgZnJvbSBpbnN0YWxsLnNoLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCShERVZPX1NVUFBPUlQpOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdpdGggJHttb3ZlaWZjaGFuZ2V9LiAgRnJvbSBUaG9tYXMKLQlHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT4uCi0KLUZyaSBBcHIgMTEgMTY6Mzc6MTAgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgT3BlbkJTRCBzeXN0ZW1zIGNvcnJlY3RseS4KLQotRnJpIEFwciAxMSAxNzowNzowNCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBSRUFETUUsIE1ha2VmaWxlLmluIChFVENfU1VQUE9SVCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0JY2ZnLXBhcGVyKiwgY29uZmlndXJlLnt0ZXhpLG1hbixpbmZvKn0uXwotCi1TdW4gQXByICA2IDE4OjQ3OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IEVuc3VyZSB0aGF0IGdjYyBpcyBidWlsdCBhZnRlciBhbGwKLQl0aGUgeDExIC0gaWUgZ2RiIC0gdGFyZ2V0cy4KLQotVHVlIEFwciAgMSAxNjoyODo1MCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBEb24ndCBydW4gY29uZi1hLWdhcy4KLQotTW9uIE1hciAzMSAxNjoyNjo1NSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaHBwYTEuMS0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1TdW4gTWFyIDMwIDEyOjM4OjI3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBub2NvbmZpZ2RpcnMgY2FzZSBzaW5jZSBnZGIgYWxzbwotCWNvbmZpZ3VyZXMgYW5kIGJ1aWxkcyBmb3IgdGljODAtY29mZi4KLQotRnJpIE1hciAyOCAxODoyODo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGNhY2hlX2ZpbGUgdG8gY29uZmlnLmNhY2hlLgotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLVdlZCBNYXIgMjYgMTg6NDk6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLVdlZCBNYXIgMjYgMTA6Mzg6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogUmVtb3ZlIEcrKyBsaWJyYXJpZXMgYW5kIGxpYmdsb3NzIGZyb20KLQlub2NvbmZpZ2RpcnMuCi0KLU1vbiBNYXIgMjQgMTU6MDI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kaXJzKTogRG9uJ3QgY3Jhc2ggaWYgcHJlZml4LCBhbmQgaGVuY2UKLQlNQUtFRElSUywgaXMgZW1wdHkuCi0KLU1vbiBNYXIgMjQgMTI6NDA6NTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogVHdlYWsgbW4xMDMwMCBlbnRyeS4KLQotRnJpIE1hciAyMSAxNTozNToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogUHV0IHNpbSBiZWZvcmUgZ2RiLCBzbyBnZGIncwotCWNvbmZpZ3VyZS50Z3QgY2FuIGRldGVybWluZSBpZiB0aGUgc2ltdWxhdG9yIHdhcyBjb25maWd1cmVkLgotCi1TdW4gTWFyIDE2IDE2OjA3OjA4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNb3ZlIEJlT1MgJG9zIGNhc2UgdG8gYmUgd2l0aCBvdGhlciBDeWdudXMKLQlsb2NhbCBjYXNlcy4KLQotU3VuIE1hciAxNiAwMTozNDo1NSAxOTk3ICBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgbWlzcGxhY2VkIGNvbW1lbnQgdGhhdCBicm9rZSBMaW51eC4KLQotU2F0IE1hciAxNSAyMjo1MDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIEJlT1Mgc3VwcG9ydC4KLQotTW9uIE1hciAxMCAxMzozMDoxMSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDSEVDS19YMTFfTU9EVUxFUyk6IERvbid0IHJ1biBjaGVjay10ay4KLQotV2VkIE1hciAgNSAxMjowOToyOSAxOTk3ICBNYXJ0aW4gIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlIHRjbCBhbmQgdGsgZnJvbQotCW5vY29uZmlnZGlycyBmb3IgY3lnd2luMzIgYnVpbGRzLgotCi1GcmkgRmViIDI4IDE4OjIwOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBsZCBmcm9tIG5vY29uZmlnZGlycy4KLQotVGh1IEZlYiAyNyAxNDo1NzoyNiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMsIEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IFJlbW92ZQotCW1ha2UtYWxsLmNvbSwgdXNlIG1ha2VmaWxlLnZtcyBpbnN0ZWFkLgotCi1UdWUgRmViIDI1IDE4OjQ2OjE0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1sbmV3cyouCi0KLVR1ZSBGZWIgMjUgMTM6MTk6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgdGFyZ2V0LW5ld2xpYiwKLSAJdGFyZ2V0LWV4YW1wbGVzIGFuZCB0YXJnZXQtbGliaWJlcnR5IGZvciBkMzB2LgotCi1GcmkgRmViIDIxIDE3OjU2OjI1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEVuYWJsZSBsZCBmb3IgZDMwdi4KLQotRnJpIEZlYiAyMSAyMDo1ODo1MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBCdWlsZCBjb21waWxlci4KLQotU3VuIEZlYiAxNiAxNTo0MTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogUmVtb3ZlIHNpbSBkaXJlY3RvcnkgZnJvbSBsaXN0IG9mCi0gCXVuc3VwcG9ydGVkIGQzMHYgZGlyZWN0b3JpZXMKLQotVHVlIEZlYiAxOCAxNzozMjo0MiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZDMwdiB0YXJnZXQgY3B1LiAKLQkKLVRodSBGZWIgMTMgMjI6MDQ6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0JKiBtYWtlLWFsbC5jb206IFJlbW92ZS4KLQotV2VkIEZlYiAxMiAxMjo1NDoxOCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgTElCR0NDMl9ERUJVR19DRkxBR1MuCi0KLVNhdCBGZWIgIDggMjA6MzY6NDkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtaXRjbCk6IFRoZSBydWxlIGlzIGFsbC1pdGNsLCBub3QgYWxsLXRjbC4KLQotVHVlIEZlYiAgNCAxMTozOToyOSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1kYi4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVjIGNoZWNrLWRiLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWRiLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZGIuCi0KLU1vbiBGZWIgIDMgMTM6Mjk6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1UdWUgSmFuIDI4IDA5OjIwOjM3IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWl0Y2wuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pdGNsLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWl0Y2wuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pdGNsLgotCi1UaHUgSmFuIDIzIDAxOjQ0OjI3IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZ2RiIGZvciBtbjEwMjAwCi0KLUZyaSBKYW4gMTcgMTU6MzI6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogRGVwZW5kIG9uIGFsbC10YXJnZXQtbGliaW8uCi0KLU1vbiBKYW4gMTMgMjI6NDY6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFR1cm4gb2ZmIG1vc3QgdGFyZ2V0cyByaWdodCBub3cuCi0KLUZyaSBKYW4gIDMgMTY6MDQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgTWFrZWZpbGUsCi0JcmF0aGVyIHRoYW4gdGhlIG1ha2VpbmZvIHByb2dyYW0uCi0JKGRvLWluZm8pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KLQotVHVlIERlYyAzMSAxNjowMDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVzZXMgb2YgY29uZmlnL21oLWxpbnV4LgotCi0JKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1GcmkgRGVjIDI3IDIzOjA0OjMzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViIChjYXNlICRiYXNpY19tYWNoaW5lKTogQWRkIHRpYzgwIGVudHJpZXMuCi0KLUZyaSBEZWMgMjcgMTI6MDc6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1XZWQgRGVjIDE4IDIyOjQ2OjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCBsZCBiZWZvcmUgZ2NjLCB1c2UgTmV3Rm9sZGVyUmVjdXJzaXZlLgotCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgTmV3Rm9sZGVyUmVjdXJzaXZlLgotCSogbXB3LWluc3RhbGw6IFVzZSBzeW1ib2xpYyBuYW1lIGZvciBzdGFydHVwIGZpbGVuYW1lLgotCSogbXB3LVJFQURNRTogQWRkIHZhcmlvdXMgYWRkaXRpb25hbCBkZXRhaWxzLgotCi1XZWQgRGVjIDE4IDEzOjExOjQ2IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogUmVtb3ZlIGJpbnV0aWxzIGZyb20gbm9jb25maWdkaXJzLgotCi1XZWQgRGVjIDE4IDEwOjI5OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBnY2MgYW5kIHRoZSB0YXJnZXQgbGlicmFyaWVzIGZvcgotCXRoZSBtbjEwMjAwLgotCi1XZWQgRGVjICA0IDE2OjUzOjA1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYXZvaWQgYnVpbGRpbmcgZ2RiIGZvciBtbjEwMzAwIGFueSBtb3JlCi0JKiBNYWtlZmlsZS5pbjogZG91YmxlLXF1b3RlIEdDQ19GT1JfVEFSR0VUIGxpbmUgaW4gRVhUUkFfR0NDX0ZMQUdTCi0JaW5zdGVhZCBvZiBzaW5nbGUtcXVvdGluZyBpdC4KLQotVHVlIERlYyAgMyAyMzoyNjo1MCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIC0td2l0aC1zdGFicyBvbiBJUklYIDYuCi0KLVR1ZSBEZWMgIDMgMDk6MDU6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtMzJyKTogQnVpbGQgZ2RiLCBsaWJnKysgbm93LgotCi1TdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogIFJlbW92ZSBnZGIgYW5kIHJlbGF0ZWQKLQlkaXJlY3RvcmllcyBmcm9tIG5vY29uZmlnZGlycy4KLQotVHVlIE5vdiAyNiAxMTo0NTozMyAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IGFkZGVkIG1pcHMxNiBjb25maWd1cmF0aW9uCi0KLVNhdCBOb3YgMjMgMTk6MjY6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgZDEwdi11bmtub3duLgotCi1TYXQgTm92IDIzIDEwOjIzOjAxIDE5OTYgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC11bmtub3duLgotCi1UaHUgTm92IDIxIDE2OjE5OjQ0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZmluZHV0aWxzCi0JKiBjb25maWd1cmUuaW46IGFkZCBmaW5kdXRpbHMgdG8gbGlzdCBvZiBob3N0X3Rvb2xzCi0KLVdlZCBOb3YgMjAgMTA6MDk6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQotVHVlIE5vdiAxOSAxNjozNToxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qKTogRG8gbm90IGJ1aWxkIGxpYnJ4LgotCi1Nb24gTm92IDE4IDEzOjI4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtbjEwMzAwKTogQnVpbGQgZXZlcnl0aGluZyBleGNlcHQgZ2RiICYgbGliZ2xvc3MuCi0KLVdlZCBOb3YgMTMgMTQ6NTk6NDYgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIFBhdGNoIGZvciBEYW5zayBEYXRhIEVsZWt0cm9uaWsgc2VydmVycywKLQlmcm9tIE5pZWxzIFNrb3UgT2xzZW4gPG5zb0BkZGUuZGs+LgotCi0JRm9yIG5jciwgdXNlIC9iaW4vdW5hbWUgcmF0aGVyIHRoYW4gdW5hbWUsIHNpbmNlIEdOVSB1bmFtZSBkb2VzIG5vdAotCXN1cHBvcnQgLXAuICBTdWdnZXN0ZWQgYnkgTWFyayBNaXRjaGVsbCA8bW1pdGNoZWxsQHVzYS5uZXQ+LgotCi0JUGF0Y2ggZm9yIE1JUFMgUjQwMDAgcnVubmluZyBTeXN0ZW0gViwKLQlmcm9tIEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPi4KLQotCUZpeCB0aGlua28gZm9yIG5leHRzdGVwLgotCi0JUGF0Y2ggZm9yIE9TRjEgaW4gaT84NiwgZnJvbSBEYW4gTXVycGh5IDxkbG1Ab3NmLm9yZz4gdmlhIEhhcmxhbiBTdGVubi4KLQotCVNhdCBKdW4gMjQgMTg6NTg6MTcgMTk5NSAgTW9ydGVuIFdlbGluZGVyICA8dGVycmErQGNzLmNtdS5lZHU+Ci0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzIG1pcHMtZGVjLW1hY2hfYnNkNC4zLgotCi0JVGh1IE9jdCAxMCAwNDowNzowNCAxOTk2ICBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4KLQkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBqdXN0IGVub3VnaCBvZiB0aGUgbWlub3IKLQlyZWxlYXNlIG51bWJlcnMuCi0JKiBjb25maWcuZ3Vlc3MgKG1pcHMtbWlwcy1yaXNjb3MqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlCi0JcmVsZWFzZSBudW1iZXIuCi0KLQlUdWUgT2N0ICA4IDEwOjM3OjIyIDE5OTYgIEZyYW5rIFZhbmNlIDxmdmFuY2VAd2FpaS5jb20+Ci0JKiBjb25maWcuZ3Vlc3MgKHNwYXJjLWF1c3BleC1zdW5vcyopOiAgQWRkZWQuCi0JKGYzMDAtZnVqaXRzdS0qKTogQWRkZWQuCi0KLQlXZWQgU2VwIDI1IDIyOjAwOjM1IDE5OTYgIEplZmYgV29vbHNleSA8d29vbHNleUBqbHcuY29tPgotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGEgVGFkcG9sZSBhcyBhIHNwYXJjLgotCi1XZWQgTm92IDEzIDAwOjUzOjA5IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IERvbid0IGFzc3VtZSB0aGF0IE5leHRTdGVwIHZlcnNpb24gaXMgZWl0aGVyIDIgb3IKLQkzLiAgTmV4dFN0ZXAgNCAoYWthIE9wZW5TdGVwIDQpIGhhcyBjb21lIG91dCBub3cuCi0KLU1vbiBOb3YgMTEgMjM6NTI6MDMgMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGNodXJjaHkuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogU3VwcG9ydCBDcmF5IFQ5MCB0aGF0IHJlcG9ydHMgaXRzZWxmIGFzICJDUkFZIFRTIi4KLQlGcm9tIFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4uCi0KLUZyaSBOb3YgIDggMTE6MzQ6NTggMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGdlZWNoLmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuc3ViOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0bzoKLQlTdXBwb3J0IHBsYWluICJocHBhIiAobm8gdmVyc2lvbiBnaXZlbikgYXJjaGl0ZWN0dXJlLCByZXBvcnRlZCBieQotCU9wZW5TdGVwLgotCU9wZW5CU0QgbGlrZSBOZXRCU0QuCi0JTHlueE9zIGlzIG5vdCBhIGhhcmR3YXJlIHN1cHBsaWVyLgotCi0JKiBjb25maWcuZ3Vlc3M6IENvbnRyaWJ1dGlvbnMgZnJvbSBidWctZ251LXV0aWxzIHRvIGFkZCBzdXBwb3J0IGZvcjoKLSAJT3BlbkJTRCBsaWtlIE5ldEJTRC4KLQlTdHJhdHVzIHN5c3RlbXMuCi0JTW9yZSBQeXJhbWlkIHN5c3RlbXMuCi0JaVtuPjRdODYgSW50ZWwgY2hpcHMuCi0JTTY4MFtuPjRdMCBNb3Rvcm9sYSBjaGlwcy4KLQlVc2UgdW5rbm93biBpbnN0ZWFkIG9mIGx5bnggZm9yIGhhcmR3YXJlIG1hbnVmYWN0dXJlci4KLQotTW9uIE5vdiAxMSAxMDowOTowOCAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGluc3RhbGwuc2ggKGNobW9kY21kKTogU2V0IHRvIG51bGwgaWYgdGhlIERTVCBkaXJlY3RvcnkgYWxyZWFkeQotCWV4aXN0cy4KLQotTW9uIE5vdiAxMSAxMDo0Mzo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyote2VhYmksZWxmLGxpbnV4LHJ0ZW0sc3lzdixzb2xhcmlzfSopOiBEbwotCW5vdCB1c2UgbXQtcHBjIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudCBhbnkgbW9yZS4KLQotU3VuIE5vdiAgMyAxOToxNzowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKTogIEV4Y2x1ZGUgZXZlcnl0aGluZyBidXQgdGhvc2UgZGlycwotCW5lZWRlZCB0byBidWlsZCB3aW5kb3dzLgotCi1UdWUgT2N0IDI5IDE2OjQxOjMxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYnJ4LgotCi1Nb24gT2N0IDI4IDE3OjMyOjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEV4Y2x1ZGUgbW1hbGxvYyBmcm9tIGkzODYtd2luZG93cy4KLQkqIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHJ1bGVzIGZvciBidWlsZGluZyBNU1ZDIG1ha2VmaWxlcy4KLQotVGh1IE9jdCAyNCAwOToyMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBVbmRvIG15IHByZXZpb3VzIGNoYW5nZS4KLQotVGh1IE9jdCAyNCAxMjoxMjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBQYXNzIGRvd24gR0NDX0ZPUl9UQVJHRVQKLQl1bmNvbmRpdGlvbmFsbHkuCi0JKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgKHJldmVydCB0aGlzIHBhcnQgb2YgT2N0b2JlciAxOCBjaGFuZ2UpLgotCi1UaHUgT2N0IDI0IDA5OjAyOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIEFkZCAkKEhPU1RfRkxBR1MpIHRvIGFsbG93IHRoZQotCWhvc3QgdG8gYWRkIGl0J3Mgb3duIGZsYWdzLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhPU1RfRkxBR1MpOiAgU2V0IHNyY3Jvb3QsIHdoaWNoIGlzIG5lZWRlZAotCWZvciBNU1ZDIGJ1aWxkIHByb2NlZHVyZS4KLQotVHVlIE9jdCAyMiAxNToyMDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIEdDQ19GT1JfVEFSR0VUIGxpa2UgQ0NfRk9SX1RBUkdFVC4KLQotRnJpIE9jdCAxOCAxMzozNzoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIHhnY2MsIG5vdCBNYWtlZmlsZS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQkoR0NDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBHQ0NfRk9SX1RBUkdFVC4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogRGVmaW5lIEdDQ19GT1JfVEFSR0VUIGJhc2VkIG9uIHdoZXRoZXIKLQlDQ19GT1JfVEFSR0VUIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQkoTUFLRU9WRVJSSURFUyk6IERvbid0IGRlZmluZS4KLQotVGh1IE9jdCAxNyAxMDoyNzo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG0zMnIpOiBGaXggc3BlbGxpbmcgb2YgbGliZysrIGxpYnMuCi0KLVRodSBPY3QgMTAgMTA6Mzc6MTcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViICgtYXBwbGUqKTogUmVtb3ZlLCBub3cgcmVkdW5kYW50LgotCi1UaHUgT2N0IDEwIDEyOjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgQ1BVLVZFTkRPUi1saW51eC1nbnUuCi0KLQkqIGNvbmZpZ3VyZTogUmV3b3JrIHllc3RlcmRheSdzIHNlZCBzY3JpcHQgcGF0Y2guCi0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1XZWQgT2N0ICA5IDE3OjI0OjU5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRi4KLQotCTE5OTYtMDktMTIgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAZXRoYW5vbC5nbnUuYWkubWl0LmVkdT4KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFVzZSBwYyBpbnN0ZWFkIG9mIHVua25vd24sIGZvciBwYyBjbG9uZSBzeXN0ZW1zLgotICAgICAgICBDaGFuZ2UgbGludXggdG8gbGludXgtZ251LgotCi0JTW9uIEp1bCAxNSAyMzo1MToxMSAxOTk2ICBLYXJsIEhldWVyICA8a3d6aEBnbnUuYWkubWl0LmVkdT4KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IEF2b2lkIG5vbi1wb3J0YWJsZSB0ciBzeW50YXguCi0KLVdlZCBPY3QgIDkgMDY6MDY6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZCAieGFyZ3MiIGZvciBnZGIuCi0KLQkqIGNvbmZpZ3VyZTogQXZvaWQgaHB1eDEwLjIwIHNlZCBidWcuCi0KLVR1ZSBPY3QgIDggMDg6MzI6NDggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdAotCSh0aGF0IGlzIGEgYnVpbGQgZG9uZSB1bmRlciB0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotVHVlIE9jdCAgOCAxMDozOTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCB1c2VzIG9mIHNyY3Jvb3Qgd2l0aCBzLCB0byBzaHJpbmsKLQljb21tYW5kIGxpbmUgbGVuZ3Rocy4KLQotCVBhdGNoZXMgZnJvbSBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+OgotCSogY29uZmlndXJlLmluOiBJZiBjb25maWd1cmluZyBmb3IgbmV3bGliLCBwYXNzIC0td2l0aC1uZXdsaWIgdG8KLQlzdWJkaXJlY3Rvcmllcy4KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogSWYgd2luc3VwL01ha2VmaWxlIGV4aXN0cywgcGFzcyBhCi0JLUJuZXdsaWIvIGFuZCAtTHdpbnN1cCB0byBnY2MuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDcgMTA6NTk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBBZGQgY29uZmlndXJlLgotCi1GcmkgT2N0ICA0IDEyOjIyOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtZGd1eDM4NiBmb3IgaVszNDVdODYtZGctZGd1eCAKLQlob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotVGh1IE9jdCAgMyAwOToyODoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gc2VwYXJhdGUKLQltbjEwMjAwIGFuZCBtbjEwMzAwIGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDIgMjI6Mjc6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsb3RzIG9mIHN0dWZmIHRvIG5vY29uZmlnZGlycyBmb3IKLQl0aGUgbW4xMHgwMCB0YXJnZXRzLgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBtbjEweDAwIHN1cHBvcnQuCi0KLVdlZCBPY3QgIDIgMTU6NTI6MzYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2UtYWxsLmNvbTogQ2FsbCBjb25mLWEtZ2FzLCBub3QgY29uZmlnLWEtZ2FzLgotCi1UdWUgT2N0ICAxIDAxOjI4OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJnbG9zcyBmb3IgYXJtLWNvZmYKLSAJdGFyZ2V0cy4KLQotTW9uIFNlcCAzMCAxNDoyNDowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1SRUFETUU6IEFkZCBtdWNoIG1vcmUgZGV0YWlsIGZvciBuYXRpdmUgUG93ZXJNYWMuCi0JKiBtcHctaW5zdGFsbDogTmV3IGZpbGUuCi0JKiBtcHctY29uZmlndXJlOiBBZGQgLS1ub3JlY3Vyc2lvbiBhbmQgLS1oZWxwIG9wdGlvbnMuCi0JKiBtcHctY29uZmlnLmluOiBUcmFuc2xhdGUgcmVhZG1lIGFuZCBpbnN0YWxsIGZpbGVzIHdoZW4KLQljb3B5aW5nIHRvIG9iamRpci4KLQkqIG1wdy1idWlsZC5pbjogRG9uJ3QgYWx3YXlzIGRlcGVuZCBvbiBieWFjYyBhbmQgZmxleC4KLQkoaW5zdGFsbC1vbmx5LXRvcCk6IE5ldyBhY3Rpb24uCi0KLUZyaSBTZXAgMjcgMTc6Mzk6NDQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgWW91IGNhbiBub3cgY29uZmlndXJlIEdEQiBmb3IgdGhlIHY4NTAuCi0KLVR1ZSBTZXAgMjQgMTk6MDU6MTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSBhbnkgQysrIGRpcnMKLQlpZiB0YXJnZXRpbmcgRDEwVi4KLQotVHVlIFNlcCAxNyAxMjoxNTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtaXBzNjR2cjUwMDAuCi0KLU1vbiBTZXAgMTYgMTc6MDA6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIHNpbmdsZSBsaW5lIGZvciBob3N0X3Rvb2xzIGFuZCBuYXRpdmVfb25seS4KLQotTW9uIFNlcCAgOSAxMjoyMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBlbnRyaWVzIGZvciBtMzJyLgotCi1UaHUgU2VwICA1IDEzOjUyOjQ3IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBEb24ndCBydW4gaW5zdGFsbC1nemlwLgotCi1XZWQgU2VwICA0IDE3OjI2OjEzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIERvbid0IGNvbmZpZyBsb3RzIG9mIHRoaW5ncyBmb3IgKi0qLXdpbmRvd3MqLgotCi1TYXQgQXVnIDMxIDExOjQ1OjU3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgbXB3LXRydWUsIHRydWUsIGFuZCBudWxsLWNvbW1hbmQgc2NyaXB0cy4KLQkoaG9zdF9saWJzLCBob3N0X3Rvb2xzKTogQ29weSBmcm9tIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1jb25maWd1cmU6IERvbid0IGNvbXBsYWluIGFib3V0IGRpcmVjdG9yaWVzIG5vdCBmb3VuZC4KLQotVGh1IEF1ZyAyOSAxNjo0NDo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYpOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKGlbMzQ1Nl04Ni0qLWRndXgqKTogVXNlIGNvbmZpZy9taC1zeXN2IGZvciB0aGUgaG9zdCBjb25maWd1cmF0aW9uCi0JZmlsZS4KLQotCSogY29uZmlnLmd1ZXNzIChpWzM0NV04Nik6IERpdHRvLgotCi1Nb24gQXVnIDI2IDE4OjM0OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgZ2RiIGZvciBEMTBWLgotCi1UaHUgQXVnIDIyIDE3OjEzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbGQsIHRhcmdldC1saWJpbywgdGFyZ2V0LWxpYmcrKywgYW5kCi0JdGFyZ2V0LWxpYnN0ZGMrKyBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIEF1ZyAyMSAxODo1NjozOCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBGaXggdGhyZWUgbG9jYXRpb25zIHdoZXJlIHNoZWxsIHNjcmlwdHMgd2VyZQotCWJlaW5nIHJ1biBkaXJlY3RseSByYXRoZXIgdGhhbiB3aXRoIGNvbmZpZ19zaGVsbC4KLQotVHVlIEF1ZyAyMCAxMzowODo0NyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh2ODUwLSotKik6IFNldCB1cCBpbml0aWFsICRub2NvbmZpZ2RpcnMuCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogUmVjb2duaXplIHY4NTAuCi0KLVRodSBBdWcgMTUgMTI6MTk6MzMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBIYW5kbGUgbXVsdGlwbGUgZW5hYmxlL2Rpc2FibGUgb3B0aW9ucyBhbmQKLQlwYXNzIHRoZW0gZG93biByZWN1cnNpdmVseSwgaGFuZGxlIC1jIGFuZCAtcyBmbGFncyBhcHByb3ByaWF0ZWx5Ci0JZGVwZW5kaW5nIG9uIGNob2ljZSBvZiBjb21waWxlciwgYWRkIGVzY2FwZSBtZWNoYW5pc20gZm9yCi0JcXVvdGVkIGFyZ3VtZW50cyB0byBnQy4KLQotTW9uIEF1ZyAxMiAxMzoxNToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyotKi0qKTogRm9yIGVhYmksIHN5c3RlbSBWLjQsIExpbnV4LCBhbmQKLQlzb2xhcmlzIHRhcmdldHMsIHVzZSBjb25maWcvbXQtcHBjIHRvIHNldCBDeyxYWH1GTEFHU19GT1JfVEFSR0VUUwotCXNvIHRoYXQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSBhcmUgdXNlZC4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IElmIHRhcmdldCBjb21waWxlciBkb2VzCi0Jbm90IHN1cHBvcnQgLS1wcmludC1tdWx0aS1saWIsIGRvbid0IGFib3J0LgotCi1TdW4gQXVnIDExIDIwOjUxOjUwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMiAoQ0ZMQUdTKTogIERlZmluZSBfV0lOMzIgdG8gYmUgY29tcGF0aWJsZQotCXdpdGggbm9ybWFsIFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCi0KLVRodSBBdWcgIDggMTI6MTg6NTkgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2UtYWxsLmNvbTogUnVuIGNvbmZpZy1hLWdhcy4KLQkqIHNldHVwLmNvbTogRG9uJ3QgY29weSBzdWJkaXJlY3RvcnkgZmlsZXMgYXJvdW5kLgotCi1UdWUgSnVsIDMwIDE3OjQ5OjMxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW9zZSk6IFJlbW92ZSBleGNsdXNpb24gb2YgbGliZ2xvc3MgZm9yIHRoaXMKLQl0YXJnZXQsIGl0IG5vdyBjb21waWxlcyBjb3JyZWN0bHkuCi0KLVNhdCBKdWwgMjcgMTU6MTA6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBHZW5lcmF0ZSBNYWMgaW5jbHVkZSBmb3IgZWxmL2R3YXJmMi5oLgotCi1UdWUgSnVsIDIzIDEwOjQ3OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogUmVtb3ZlIGxkIGZyb20gJG5vY29uZmlnZGlycy4gCi0KLU1vbiBKdWwgMjIgMTM6Mjg6NTEgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5hdGl2ZV9vbmx5KTogQWRkIHBybXMuCi0KLU1vbiBKdWwgMjIgMTI6Mjc6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBtYWtlLWFsbC5jb20gYW5kIHNldHVwLmNvbS4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgMTggMTI6NTU6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIG9yIGdkYiB1bnRpbCB0aGUKLQlkMTB2IHN1cHBvcnQgaXMgYWRkZWQuCi0KLVdlZCBKdWwgMTcgMTQ6MzM6MDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsIDE1IDExOjUzOjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChIUCA5MDAwLzgxMSk6IFJlY29nbml6ZSB0aGlzIGFzIGEgUEExLjEKLQltYWNoaW5lLgotCi1GcmkgSnVsIDEyIDIzOjIxOjE3IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG8tdGFyLWd6KTogTmV3IHRhcmdldCwgc3BsaXQgb3V0IGZyb20gdGFpbCBlbmQgb2YKLQl0YXogdGFyZ2V0LiAgUnVuIGVhY2ggY29tbWFuZCBzZXBhcmF0ZWx5LCBkb24ndCB1c2UgcGlwZXMuCi0JKHRheik6IFVzZSBpdC4KLQotRnJpIEp1bCAxMiAxMjowODowNCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IExvb2sgZm9yIGctbXB3LW1ha2Uuc2VkIGluIGNvbmZpZy9tcHcuCi0JKiBtcHctYnVpbGQuaW46IE5vIGJ1aWxkcyBzaG91bGQgZGVwZW5kIG9uIGJ1aWxkaW5nIGJ5YWNjIG9yIGZsZXgsCi0JdGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbnN0YWxsZWQgYWxyZWFkeS4KLQotRnJpIEp1bCAxMiAwOTo1Mjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBTZXQgciBlbnZpcm9ubWVudAotCXZhcmlhYmxlIHRoYXQgQ0NfRk9SX1RBUkdFVCBuZWVkcy4KLQotVGh1IEp1bCAxMSAxMDowOTo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBEZXRlcm1pbmUgaWYgdGhlIG11bHRsaWIKLQlvcHRpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBzdWJkaXJlY3Rvcnkgd2FzCi0JY29uZmlndXJlZCwgYW5kIGlmIGl0IGhhcywgcmVjb25maWd1cmUuCi0JKENMRUFOX1RBUkdFVF9NT0RVTEVTKTogRGVsZXRlIG11bHRpbGliLm91dCBhbmQgdG1wbXVsdGkub3V0LCB3aGljaAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyB1c2VzIHRvIHJlbWVtYmVyIHRoZSBvbGQgbXVsdGlsaWIgb3B0aW9ucy4KLQotV2VkIEp1bCAxMCAxODo1Njo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMsQ1JPU1NfQ0hFQ0tfTU9EVUxFUyxJTlNUQUxMX01PRFVMRVMsCi0JQ0xFQU5fTU9EVUxFUyk6IEFkZCBiYXNoLgotCShhbGwtYmFzaCk6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDggMTc6MzM6MTQgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2Kik6IFVzZSBtaC1pcml4NiBpbnN0ZWFkIG9mIG1oLWlyaXg1LgotCi1Nb24gSnVsICAxIDEzOjMxOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSBkMTB2IGFzIGEgdmFsaWQgcHJvY2Vzc29yLgotCi1GcmkgSnVuIDI4IDEyOjE0OjM1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIC0tYmluZGlyLgotCSogbXB3LWJ1aWxkLmluOiBVc2UgYSBHQ0Mtc3BlY2lmaWMgYnVpbGQgc2NyaXB0IGZvciBHQ0MgYWN0aW9ucy4KLQotV2VkIEp1biAyNiAxNzoyMDoxMiAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBiYXNoLCB0aW1lLCBnYXdrIHRvIGxpc3Qgb2YgaG9zdHRvb2xzIGFuZCB0aGluZ3MKLQl0byBvbmx5IGJ1aWxkIGZvciBuYXRpdmUgdG9vbGNoYWlucwotCi1UdWUgSnVuIDI1IDIzOjA5OjAzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmUuCi0KLVR1ZSBKdW4gMjUgMTk6MDA6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgotCi1Nb24gSnVuIDI0IDIzOjI2OjA3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZGlmZiBhbmQgcGF0Y2ggZm9yIGN5Z3dpbjMyLWhvc3RlZAotCXRvb2xjaGFpbnMuCi0KLU1vbiBKdW4gMjQgMTU6MDE6MTIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1ydGVtcyouCi0KLVN1biBKdW4gMjMgMjI6NDE6NTQgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZW5hYmxlIGRvc3JlbCBmb3IgY3lnd2luMzItaG9zdGVkIGJ1aWxkcywKLSAgICAgICAgICAgICAgICByZW1vdmUgZGlmZiBmcm9tIHRoZSBsaXN0IG9mIHRoaW5ncyBub3QgYnVpbGRhYmxlCi0gICAgICAgICAgICAgICAgdmlhIENhbmFkaWFuIENyb3NzCi0KLVNhdCBKdW4gMjIgMTE6Mzk6MDEgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR0VUX1NVQkRJUik6IE1vdmUgY29tbWVudCB0byBwcmV2aW91cyBsaW5lIHNvIHdlCi0gCWRvbid0IGdldCAiLiAiLgotCi1GcmkgSnVuIDIxIDE3OjI0OjQ4IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogU2V0IG5vY29uZmlnZGlycyBhcHByb3ByaWF0ZWx5LgotCi1UaHUgSnVuIDIwIDE2OjU3OjQwIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogSGFuZGxlIGNhc2Ugd2hlcmUgdGV4M3BhdGNoIGRpZG4ndCBldmVuIGdldAotCWNoZWNrZWQgb3V0LiAgQWxzbywgaWYgaXQgd2FzIGZvdW5kLCBwdXQgdGhlIHN5bWxpbmsgaW4gYSBuZXcgdXRpbAotCXN1YmRpcmVjdG9yeS4KLQotVGh1IEp1biAyMCAxMjoyMDozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyBMaW51eC4KLQotVHVlIEp1biAxOCAxNDoyNDoxMiAxOTk2ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1vcGVudm1zLgotCSogY29uZmlndXJlLmluIChhbHBoYSotKi0qdm1zKik6IFNldCBub2NvbmZpZ2RpcnMuCi0JKiBtYWtlLWFsbC5jb20sIHNldHVwLmNvbTogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDE2OjM0OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IHRleDNwYXRjaCBtb3ZlZCB0byB0ZXhpbmZvL3V0aWwuCi0KLVNhdCBKdW4gMTUgMTc6MTM6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IGVuYWJsZV9nZGJ0az1ubyBmb3IgY3lnd2luMzItaG9zdGVkIHRvb2xjaGFpbnMKLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG1ha2UgZnJvbSBkaXNhYmxlLWlmLUNhbi1Dcm9zcyBsaXN0Ci0JCWVuYWJsZSBnZGIgaWYgJHtob3N0fSBhbmQgJHt0YXJnZXR9IGFyZSBjeWd3aW4zMgotCi1GcmkgSnVuICA3IDE4OjE2OjUyIDE5OTYgIEhhcmxhbiBTdGVubiA8aGFybGFuQHBmY3MuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKGk/ODYtbmNyLXN5c3YqKTogIEVtaXQgbWlub3IgcmVsZWFzZSBudW1iZXJzLgotCVJlY29nbml6ZSB0aGUgTkNSIDQ4NTAgbWFjaGluZSBhbmQgTkNSIFBlbnRpdW0tYmFzZWQgcGxhdGZvcm1zLgotCi1XZWQgSnVuICA1IDAwOjA5OjE3IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckB3b21iYXQuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogIENvbWJpbmUgbWlwcy1taXBzLXJpc2NvcyBjYXNlcywgYW5kIHVzZSBjcHAgdG8KLQlkaXN0aW5ndWlzaCBzeXN2L3N2cjQvYnNkIHZhcmlhbnRzLgotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4uCi0KLUZyaSBKdW4gIDcgMTQ6MjQ6NDkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBjb3B5cmlnaHQgbm90aWNlLgotCSogbW92ZS1pZi1jaGFuZ2U6IEFkZGVkIGNvcHlyaWdodCBub3RpY2UuCi0KLVRodSBKdW4gIDYgMTY6Mjc6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVW50aWwgd2UgZ2V0IHNoYXJlZAotCWxpYnJhcmllcyB3b3JraW5nLCBkb24ndCBidWlsZCBnZGIsIHNpbSwgbWFrZSwgdGNsLCB0aywgb3IKLQlleHBlY3QuCi0KLVR1ZSBKdW4gIDQgMjA6NDE6NDUgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIHdpdGggRlNGOgotCi0JTW9uIEp1biAgMyAwODo0OToxNCAxOTk2ICBLYXJsIEhldWVyICA8a3d6aEBnbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgZ3Vlc3MgZm9yIHNwYXJjLXVua25vd24tbGludXguCi0KLQlGcmkgTWF5IDI0IDE4OjM0OjUzIDE5OTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGRlbGFzeWQuZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IEZpeCB0eXBvIGluIHJlY29nbml6aW5nIG1jODgxMTAuCi0KLQlGcmkgQXByIDEyIDIwOjAzOjU5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBzcGlmZi5nbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzczogIENvbWJpbmUgdHdvIE9TRjEgcnVsZXMuCi0JQWxzbyByZWNvZ25pemUgZmllbGQgdGVzdCB2ZXJzaW9ucy4gIEZyb20gbWpyQHprMy5kZWMuY29tLgotCSogY29uZmlnLmd1ZXNzIChkZ3V4KTogIFVzZSAvdXNyL2Jpbi91bmFtZSByYXRoZXIgdGhhbiB1bmFtZSwKLQliZWNhdXNlIEdOVSB1bmFtZSBkb2VzIG5vdCBzdXBwb3J0IC1wLiAgRnJvbSBwbXJAcGFqYXRvLmNvbS4KLQotVHVlIEp1biAgNCAxMTowNzoyNSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VESVJTKTogUmVtb3ZlZCAkKHRvb2xkaXIpLgotCi1UdWUgTWF5IDI4IDEyOjMwOjUwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogRG9jdW1lbnQgR0NDSW5jbHVkZXMuCi0KLVN1biBNYXkgMjYgMTU6MTY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1saW51eCopOiBTZXQgZW5hYmxlX3NoYXJlZCB0byB5ZXMuCi0KLVR1ZSBNYXkgMjEgMTU6NDE6MzkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBIYW5kbGUgLS1lbmFibGUtRk9PIGFuZCAtLWRpc2FibGUtRk9PLgotCi1Nb24gTWF5IDIwIDEwOjEyOjI5IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWN5Z3dpbjMyKTogQ29uZmlndXJlIG1ha2UuCi0KLVR1ZSBNYXkgIDcgMTQ6MTk6NDIgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBzbnVmZmxlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBRdW90ZSB2YWx1ZSBvZiBJTlNUQUxMX01PRFVMRVMuCi0KLUZyaSBNYXkgIDMgMDg6NTc6MTcgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtcGVybC4KLQotCSogTWFrZWZpbGUuaW4gKGluZXQtaW5zdGFsbCk6IE5ldyB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtdGNsLgotCShhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtc2VuZC1wci4KLQotVHVlIEFwciAzMCAxMzo1NTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBUdXJuIG9mZiB0ayBhbmQgdGNsCi0JdGVtcG9yYXJpbHkuCi0KLVRodSBBcHIgMjUgMTE6NDg6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxkIG9uIEFJWC4KLQotVGh1IEFwciAyNSAwNjozMzozNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVHVybiBvZmYgZ2RiIHRlbXBvcmFyaWx5LgotCi1UdWUgQXByIDIzIDA5OjA3OjM5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1pbmV0LgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2staW5ldC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1pbmV0LgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4taW5ldC4KLQkoYWxsLWluZGVudCk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZGVkIGluZXQuCi0JKG5hdGl2ZV9vbmx5KTogQWRkZWQgaW5ldC4KLQkobm9jb25maWdkaXJzKTogQWRkZWQgaW5ldC4KLQotRnJpIEFwciAxOSAxNTozNToyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxpYmdsb3NzIGlmIHdlIGFyZSBub3QgY29uZmlndXJpbmcKLQluZXdsaWIuCi0KLVdlZCBBcHIgMTcgMTk6MzA6MDEgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGliZ2xvc3MgZm9yIHVuc3VwcG9ydGVkCi0JYXJjaGl0ZWN0dXJlcy4KLQotVHVlIEFwciAxNiAxMToxNzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDTEVBTl9NT0RVTEVTKTogQWRkIGNsZWFuLWFwYWNoZS4KLQotTW9uIEFwciAxNSAxNTowOTowNSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1hcGFjaGUuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLWFwYWNoZS4KLQkoSU5TVEFMTF9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLWFwYWNoZS4KLQkoYWxsLWFwYWNoZSk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgYXBhY2hlIGV2ZXJ5d2hlcmUgcGVybCBpcyBzZWVuLgotCi1Nb24gQXByIDE1IDE0OjU5OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBzdXBwb3J0IGZvciBjbGVhbi17bW9kdWxlfSBhbmQKLQljbGVhbi10YXJnZXQte21vZHVsZX0gcnVsZXMuCi0KLVdlZCBBcHIgMTAgMjE6Mzc6NDEgUERUIDE5OTYgIE1hcmlseW4gRS4gU2FuZGVyIDxtc2FuZGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW9zZSkgZG8gbm90IGJ1aWxkIGxpYmdsb3NzLgotCi1Nb24gQXByICA4IDE2OjE2OjIwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChwcmVwKjpTdW5PUzo1Lio6Kik6IFR1cm4gaW50bwotCXBvd2VycGVsZS11bmtub3duLXNvbGFyaXMyLgotCi1Nb24gQXByICA4IDE0OjQ1OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0KLUZyaSBBcHIgIDUgMDg6MTc6NTcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09c29sYXJpcyk6IFBhc3Mgb25seSB0aGUgZmlyc3Qgd29yZCBvZiAkQ0MKLQl0byAvdXNyL2Jpbi93aGljaCB3aGVuIGNoZWNraW5nIGlmIHdlJ3JlIHVzaW5nIC91c3IvY2NzL2Jpbi9jYy4KLQotRnJpIEFwciAgNSAwMzoxNjoxMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHBhc3MgZG93biAkKE1BS0UpLgotCi1UaHUgTWFyIDI4IDE0OjExOjExIDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLXBlcmwuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLXBlcmwuCi0JKElOU1RBTExfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1wZXJsLgotCShBTExfWDExX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1ndWlsZS4KLQkoQ0hFQ0tfWDExX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLWd1aWxlLgotCShJTlNUQUxMX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLWd1aWxlLgotCShhbGwtcGVybCk6IE5ldyB0YXJnZXQuCi0JKGFsbC1ndWlsZSk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEluY2x1ZGUgcGVybCBhbmQgZ3VpbGUuCi0JKG5hdGl2ZV9vbmx5KTogSW5jbHVkZSBwZXJsIGFuZCBndWlsZS4KLQkobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgZ3VpbGUgYW5kIHBlcmw7IG5vIHBvcnRzIGhhdmUgYmVlbgotCWRvbmUuCi0KLVR1ZSBNYXIgMjYgMjE6MTg6NTAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotICAgICAgICAqIGNvbmZpZ3VyZSAoLS1lbmFibGUtKik6IEhhbmRsZSBxdW90ZWQgb3B0aW9uIGxpc3RzIHN1Y2ggYXMKLSAgICAgICAgLS1lbmFibGUtc2ltLWNmbGFncz0nLWcwIC1PJyBiZXR0ZXIuCi0KLVRodSBNYXIgMjEgMTE6NTM6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoeyxpbnN0fWFsbC10YXJnZXQpOiBOZXcgcnVsZSBzbyB3ZSBjYW4gbWFrZSBhbmQKLQlpbnN0YWxsIGFsbCBvZiB0aGUgdGFyZ2V0IGRpcmVjdG9yaWVzIGVhc2lseS4KLQotV2VkIE1hciAyMCAxODoxMDo1NyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlzc2luZyBnbG9iYWwgZmxhZyBpbiBzZWQgc3Vic3RpdHV0aW9uIHdoZW4KLQlkZWxldGluZyBgdGFyZ2V0LScgZnJvbSAke2NvbmZpZ2RpcnN9LgotCi1UaHUgTWFyIDE0IDE5OjE1OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERPX1gpOiBEb24ndCBnZXQgY29uZnVzZWQgaWYgQ0MgY29udGFpbnMgYD0nIGluIGFuCi0Jb3B0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLW5lYy1zeXN2cjQqKTogVXNlIGEgaG9zdF9tYWtlZmlsZV9mcmFnIG9mCi0JY29uZmlnL21oLW5lY3Y0LgotCi0JKiBpbnN0YWxsLnNoOiBDb3JyZWN0IG1pc3NwZWxsaW5nIG9mIHRyYW5zZm9ybWJhc2VuYW1lLgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtaXBzLSotc3lzdiouCi0KLU1vbiBNYXIgMTEgMTU6MzY6NDIgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbW9uOTYwLgotCi1TdW4gTWFyIDEwIDEzOjE4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZXN0b3JlIENhbmFkaWFuIENyb3NzIGhhbmRsaW5nIG9mIEJJU09OIGFuZCBMRVgsCi0JcmVtb3ZlZCBpbiBGZWIgMjAgY2hhbmdlLgotCi1GcmkgTWFyICA4IDIwOjA3OjA5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBSRUFETUU6ICBTdWdnZXN0aW9ucyBmcm9tIFRvcmJqb3JuIEdyYW5sdW5kIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT46Ci0JTWVudGlvbiBtYWtlIGluc3RhbGwuICBSZW1vdmUgdGhlIG9sZCBjb3B5cmlnaHQgZGF0ZSBhcyB3ZWxsIHRoZQotCWNsdW1zeSBhbmQgcmF0aGVyIHBvaW50bGVzcyBjb3B5cmlnaHQgb24gdGhlIFJFQURNRSBmaWxlLgotCi1GcmkgTWFyICA4IDE3OjUxOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IElmIHRoZXJlIGlzIGEKLQlNYWtlZmlsZSBhZnRlciBydW5uaW5nIHN5bWxpbmstdHJlZSwgdGhlbiBydW4gYG1ha2UgZGlzdGNsZWFuJyB0bwotCWF2b2lkIGNsb2JiZXJpbmcgYW55IGdlbmVyYXRlZCBmaWxlcyBpbiBzcmNkaXIuCi0KLVR1ZSBNYXIgIDUgMDg6MjE6NDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1uZXRic2QqKTogQnVpbGQgZXZlcnl0aGluZyBub3cuCi0KLVdlZCBGZWIgMjggMTI6MjU6NDYgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRml4IHF1b3RpbmcuCi0KLVR1ZSBGZWIgMjcgMTE6MzM6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZXQtKi0qKTogQnVpbGQgZXZlcnl0aGluZyBub3cuCi0KLVR1ZSBGZWIgMjcgMTQ6MzE6NTEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWxpbnV4Kik6IE5ldyBob3N0LgotCi1Nb24gRmViIDI2IDE0OjMyOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBDaGVjayBmb3IgYmlzb24gYmVmb3JlIGJ5YWNjLgotCi1UdWUgRmViIDIwIDIzOjEyOjM1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIGNvbmZpZ3VyZTogIENoYW5nZSB0aGUgd2F5IExFWCBhbmQgQklTT04vWUFDQyBhcmUKLQlzZXQuICBjb25maWd1cmUgbm93IGRlZmluZXMgREVGQVVMVF9MRVggYW5kIERFRkFVTFRfWUFDQyBieQotCXNlYXJjaGluZyBQQVRILiAgVGhlc2UgYXJlIHVzZWQgYXMgZmFsbGJhY2tzIGJ5IE1ha2VmaWxlLmluIGlmCi0JZmxleC9iaXNvbi9ieWFjYyBhcmVuJ3QgaW4gb2JqZGlyLgotCi1Nb24gRmViIDE5IDExOjQ1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgZXZlcnl0aGluZyB3aGljaCBkZXBlbmRzIHVwb24gYWxsLWJmZCBhbHNvCi0JZGVwZW5kIHVwb24gYWxsLW9wY29kZXMsIGluIGNhc2UgLS13aXRoLWNvbW1vbmJmZGxpYiBpcyB1c2VkLgotCi1UaHUgRmViIDE1IDE5OjUwOjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0ICotKi1jeWd3aW4zMik6IERvbid0IGJ1aWxkIGdkYiBpZiB3ZSBhcmUKLQlidWlsZGluZyBOVCBuYXRpdmUgY29tcGlsZXJzIG9uIFVuaXguCi0KLVRodSBGZWIgMTUgMTc6NDI6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGdldCBDQyBmcm9tIHRoZSBob3N0IE1ha2VmaWxlIGZyYWdtZW50IGlmIHdlCi0JY2FuIGZpbmQgZ2NjIGluIFBBVEgsIG9yIGlmIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcy4gIE1vdmUgdGhlCi0JU29sYXJpcyB0ZXN0IGZvciAvdXNyL3VjYi9jYyB0byB0aGUgcG9zdCB0YXJnZXQgc2NyaXB0LCBqdXN0IGFmdGVyCi0JdGhlIGNvbXBpbGVyIHNhbml0eSB0ZXN0LgotCi1XZWQgRmViIDE0IDE2OjU3OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLVR1ZSBGZWIgMTMgMTQ6Mjc6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShSRUFMTFlfU0VUX0xJQl9QQVRIKTogVXNlIGl0LgotCSogY29uZmlndXJlLmluOiBPbiBIUC9VWCwgc2V0IFJQQVRIX0VOVlZBUiB0byBTSExJQl9QQVRILgotCi1Nb24gRmViIDEyIDE1OjI4OjQ5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyY2xldCBjcHUuCi0KLU1vbiBGZWIgMTIgMTU6MzM6NTkgMTk5NiAgQ2hyaXN0aWFuIEJhdWVybmZlaW5kIDxjaHJpc2JmZEB0aGVvcmllMy5waHlzaWsudW5pLWVybGFuZ2VuLmRlPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBTdXBwb3J0IG02OGstY2JtLXN5c3Y0LgotCi1TYXQgRmViIDEwIDEyOjA2OjQyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogR3Vlc3MgbTY4ay11bmtub3duLWxpbnV4IGFuZAotCW02OGstdW5rbm93bi1saW51eGFvdXQgZnJvbSBsaW5rZXIgaGVscCBzdHJpbmcuICBQdXQgcXVvdGVzIGFyb3VuZAotCSRsZF9oZWxwX3N0cmluZy4KLQotVGh1IERlYyAgNyAwOTowMzoyNCAxOTk1ICBUb20gSG9yc2xleSAgPFRvbS5Ib3JzbGV5QG1haWwuaGNzYy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4KTogQWRkIGd1ZXNzIGZvciBwb3J0Ci0JdG8gbmV3IHRhcmdldC4KLQotVGh1IEZlYiAgOCAxNTozNzo1MiAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoVU5BTUVfVkVSU0lPTik6IFJlY29nbml6ZSBYNC54IGFzIGFuIE9TRiB2ZXJzaW9uLgotCi1Nb24gRmViICA1IDE2OjM2OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQsIHNldCBTRVRfTElCX1BBVEggdG8KLQkkKFJFQUxMWV9TRVRfTElCX1BBVEgpIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFNFVF9MSUJfUEFUSCk6IE5ldyB2YXJpYWJsZS4KLQkoUkVBTExZX1NFVF9MSUJfUEFUSCk6IE5ldyB2YXJpYWJsZS4KLQkoJChET19YKSk6IFVzZSAkKFNFVF9MSUJfUEFUSCkuCi0JKGluc3RhbGwuYWxsLCBnY2Mtbm8tZml4ZWRpbmNsdWRlcywgJChBTExfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUyksICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChJTlNUQUxMX01PRFVMRVMpLCAkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChBTExfVEFSR0VUX01PRFVMRVMpLCAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpLCAkKEFMTF9YMTFfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChDSEVDS19YMTFfTU9EVUxFUyksICQoSU5TVEFMTF9YMTFfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoYWxsLWdjYywgYWxsLWJvb3RzdHJhcCwgY2hlY2stZ2NjLCBpbnN0YWxsLWdjYyk6IExpa2V3aXNlLgotCShpbnN0YWxsLWRvc3JlbCk6IExpa2V3aXNlLgotCShhbGwtb3Bjb2Rlcyk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCi0KLVN1biBGZWIgIDQgMTY6NTE6MTEgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqOkNZR1dJTiopOiBOZXcKLQotU2F0IEZlYiAgMyAxMDo0MjozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IEFsbCBhbGwtdGFyZ2V0LWxpYmliZXJ0eS4KLQotRnJpIEZlYiAgMiAxNzo1ODo1NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIG1pc3NpbmcgIyBpbiBmcm9udCBvZiBjb21tZW50LgotCi1UaHUgRmViICAxIDE0OjM4OjEzIDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHNlY29uZCBwYXNzIHRvIHRoaW5ncyBhZGRlZCB0byBub2NvbmZpZ2RpcnMKLQlzbyAqLWdtLW1hZ2ljIGNhbiBleGNsdWRlIGxpYmdsb3NzIHByb3Blcmx5LgotCi1UaHUgRmViICAxIDExOjEwOjE2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZSAoZXh0cmFsaWJzX25hbWUsIHJlel9uYW1lKTogU2V0IGNvcnJlY3RseQotCWZvciBNV0M2OEsgY29tcGlsZXIuCi0KLQkqIG1wdy1SRUFETUU6IEFkZCBtb3JlIGluZm8gb24gdGhlIG5lY2Vzc2FyeSBidWlsZCB0b29scy4KLQotVGh1IEZlYiAgMSAxMDoyMjozOCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjeWd3aW4zMi4KLQotV2VkIEphbiAzMSAxNDoxNzoxMCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViOiBSZWNvZ25pemUgQS9VWC4KLQotV2VkIEphbiAzMSAxMzo1MjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggZ2NjL2NvbmZpZy5zdWIuCi0KLVRodSBKYW4gMjUgMTE6MDE6MTAgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluIChkby1iaW51dGlscyk6IEFkZCBidWlsZCBvZiBzdGFtcHMuCi0KLVRodSBKYW4gMjUgMTc6MDU6MjYgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcuc3ViOiBBZGQgcmVjb2duaXRpb24gZm9yIG1pcHM2NHZyNDEwMCotKiB0YXJnZXRzLgotCi1XZWQgSmFuIDI0IDEyOjQ3OjU1IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogdGVzdC1idWlsZC5tazogQWRkIGNoZWNraW5nIG9mIGBocHV4OScgcmF0aGVyIHRoYW4ganVzdCBgaHB1eCcuCi0JQWRkIGNyZWF0aW9uIG9mIGdjb25maWdhcmdzIHdpdGggYC0tZW5hYmxlLXNoYXJlZCcgdHVybmVkIG9uLgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMi1jb25maWd1cmVkKTogUGFzcyAkKGdjb25maWdhcmdzKS4KLQkoJChob3N0KS1zdGFtcC1zdGFnZTMtY29uZmlndXJlZCk6IExpa2V3aXNlLgotCShIT0xFUyk6IEFkZCBjaGF0ciBhbmQgbGRkLgotCShpMzg2LW5jci1zeXN2NC4zKik6IEFkZCB1c2Ugb2YgL3Vzci9jY3MvYmluIGluIHRoZSBQQVRIIGFuZCBIT0xFX0RJUlMuCi0KLVdlZCBKYW4gMjQgMjA6MzI6MzAgMTk5NiAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQG5vaXN5Lm1hdGVtYXRpay5zdS5zZT4KLQotCSogY29uZmlndXJlOiBQYXNzIC0tbmZwIHRvIHJlY3Vyc2l2ZSBjb25maWd1cmVzLgotCi1Nb24gSmFuIDIyIDEwOjQxOjU2IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChETExUT09MKTogTmV3LgotCShETExUT09MX0ZPUl9UQVJHRVQpOiBOZXcuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBQYXNzIGRvd24gRExMVE9PTC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0JKEVYVFJBX0dDQ19GTEFHUyk6IERpdHRvLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoRE9fWCk6IERpdHRvLgotCSogY29uZmlndXJlOiBBZGQgRExMVE9PTC4KLQotRnJpIEphbiAxOSAxMzozMDoxNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlTQ08gT3BlblNlcnZlciA1IGNoYW5nZXMgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotc2NvMy4ydjUqKTogVXNlIG1oLXN5c3YgaW5zdGVhZCBvZgotCW1oLXNjbywgc2luY2Ugb2xkIHdvcmthcm91bmRzIG5vIGxvbmdlciBuZWVkZWQsIGFuZCBkb24ndAotCWJ1aWxkIGxkLCBzaW5jZSBsaWJyYXJpZXMgaGF2ZSB3ZWFrIHN5bWJvbHMgaW4gQ09GRi4KLQotU3VuIEphbiAxNCAyMzowMTozMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IEFkZCBtaXNzaW5nICc7Jy4KLQotRnJpIEphbiAxMiAxNToyNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzdXJlIHRoYXQgJHtDQ30gY2FuIGJlIHVzZWQgdG8gY29tcGlsZSBhbgotCWV4ZWN1dGFibGUuCi0KLVNhdCBKYW4gIDYgMDc6MjM6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiBEZXBlbmQgb24gJChHREJfVEspLgotCSogY29uZmlndXJlIChHREJfVEspOiBTZXQgR0RCX1RLIHRvIGVpdGhlciAiYWxsLXRjbCBhbGwtdGsiIG9yCi0Jbm90aGluZyBkZXBlbmRpbmcgb24gd2hldGhlciBnZGJ0ayBpcyBiZWluZyBidWlsdC4KLQotV2VkIEphbiAgMyAxNzo1NDo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobmV3bGliLnRhci5neik6IERlbGV0ZSBidWlsZGluZyBvZiBuZXdsaWIncyBpbmZvIGZpbGVzLgotCi1Nb24gSmFuICAxIDE5OjA5OjE0IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFB1dCBsZCBvciBnYXMgaW4gdGhpcyBlYXJseSwgaWYgdGhlCi0JdXNlciBzcGVjaWZpY2FsbHkgdXNlZCAtLXdpdGgtZ251LWxkPW5vIG9yIC0td2l0aC1nbnUtYXM9bm8uCi0KLVNhdCBEZWMgMzAgMTY6MDg6NTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBBZGQgc3VwcG9ydCBmb3IKLQktLWRpc2FibGUte3NvZnRmbG9hdCxtNjg4ODEsbTY4MDAwLG02ODAyMH0gb24gbTY4Ki0qLSouCi0JU2ltcGxpZnkgc2V0dGluZyBvZiBtdWx0aWRpcnMgZnJvbSAtLWRpc2FibGUtZm9vLgotCi1GcmkgRGVjIDI5IDA3OjU2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IElmIGFueSBvZiB0aGUgbWFrZSB2YXJpYWJsZXMKLQlMQU5HVUFHRVMsIEJPT1RfQ0ZMQUdTLCBTVE1QX0ZJWFBST1RPLCBMSU1JVFNfSF9URVNULAotCUxJQkdDQzFfVEVTVCwgTElCR0NDMl9DRkxBR1MsIExJQkdDQzJfSU5DTFVERVMsIGFuZCBFTlFVSVJFIGFyZQotCW5vbi1lbXB0eSwgcGFzcyB0aGVtIG9uIHRvIHRoZSAJR0NDIG1ha2UuCi0JKGFsbC1ib290c3RyYXApOiBOZXcgcnVsZSB0aGF0IGlzIGxpa2UgYWxsLWdjYywgZXhjZXB0IGl0IGV4ZWN1dGVzCi0JdGhlIEdDQyBib290c3RyYXAgcnVsZSBpbnN0ZWFkIG9mIHRoZSBHQ0MgYWxsIHJ1bGUuCi0KLVdlZCBEZWMgMjcgMTU6NTE6NDggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluIChtbF9yZWFsc3JjZGlyKTogTmV3LCB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0KLVR1ZSBEZWMgMjYgMTE6NDU6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVwZGF0ZSBmcm9tIEZTRiB0byBhZGQgcGVudGl1bQotCURHL1VYIHN1cHBvcnQuCi0KLUZyaSBEZWMgMTUgMTA6MDE6MjcgMTk5NSAgU3RhbiBDb3ggIDxjb3hzQGRnLXJ0cC5kZy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGkqODYqKSBDaGFuZ2UgWzM0NV0gdG8gWzM0NTZdCi0KLVdlZCBEZWMgMjAgMTc6NDE6NDAgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBnYXMgb3IgbGQgaWYgLS13aXRoLWdudS1hcz1ubyBvcgotCS0td2l0aC1nbnUtbGQ9bm8uCi0KLVdlZCBEZWMgMjAgMTU6MTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHJzNjAwMCosIHBvd2VycGMqKTogQWRkIHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2gKLQlBSVggbXVsdGlsaWJzIGdldCBidWlsdC4KLQotTW9uIERlYyAxOCAxNzo1NTo0NiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LXdpbjMyKTogRG9uJ3QgYnVpbGQgZXhwZWN0IGlmIHdlJ3JlIG5vdAotCWJ1aWxkaW5nIHRoZSB0Y2wgc3ViZGlyLgotCi1Nb24gRGVjIDE4IDExOjQ3OjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IChjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzLCBhbGwtdGFyZ2V0LWV4YW1wbGVzKToKLQlOZXcgdGFyZ2V0cywgY29uZmlndXJlIGFuZCBidWlsZCBleGFtcGxlIHByb2dyYW1zLgotCi1GcmkgRGVjIDE1IDE2OjEzOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSWYgYW4gbXB3LWNvbmZpZy5pbiBnZW5lcmF0ZWQgYSBmaWxlIG1rLnNlZCwKLQl1c2UgaXQgYXMgaW5wdXQgdG8gc2VkaXQgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUuCi0JKiBtcHctUkVBRE1FOiBBZGQgYSBzdWdnZXN0aW9uIGFib3V0IEdlc3RhbHQuaC4KLQotV2VkIERlYyAxMyAxNjo0Mzo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAqLSotaWVlZSouCi0KLVR1ZSBEZWMgMTIgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogUmVtb3ZlICQoVEFSR0VUX1NVQkRJUikuICBGcm9tCi0JUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNTozMTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1wb3dlcnBjLXBlKTogQWRkIG1hbnkgZGlyZWN0b3JpZXMgdG8gbm9jb25maWdkaXJzCi0JZm9yIHBvd2VycGMtcGUgbmF0aXZlLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgdGNsLCBtYWtlIHRvIG5vY29uZmlnZGlycyBpZiBjYW5hZGlhbiBjcm9zcy4KLQkodGFyZ2V0PT1wb3dlcnBjLXBlKTogZHVwbGljYXRlIGkzODYtd2luMzIgZW50cnkuCi0KLVNhdCBEZWMgIDkgMTQ6NTg6MjggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEV4Y2x1ZGUgdGFyZ2V0LW5ld2xpYiBmb3IgYWxsIHZlcnNpb25zCi0Jb2Ygdnh3b3Jrcywgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotTW9uIERlYyAgNCAxMjowNTo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBleGVjLXByZWZpeC4KLQotTW9uIERlYyAgNCAxMDoyMjo1MCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE2IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEExLjEgcHJvY2Vzc29yLgotCi1Nb24gRGVjICA0IDEyOjM4OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZ25vcmUgbmV3IGF1dG9jb25mIGNvbmZpZ3VyZSBvcHRpb25zLgotCi1UaHUgTm92IDMwIDE0OjQ1OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXY4MTAgKENDX0ZPUl9UQVJHRVQpOiBBZGQgLWFuc2kgZmxhZy4gIE5FQyBjb21waWxlcgotIAlkZWZhdWx0cyB0byBLJlIgbW9kZSwgYnV0IGRvZXNuJ3QgaGF2ZSB2YXJhcmdzLmgsIHNvIHdlIGhhdmUgdG8gCi0JY29tcGlsZSBpbiBBTlNJIG1vZGUuCi0KLVRodSBOb3YgMzAgMTY6NTc6MzMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIFBlbnRpdW0gdW5kZXIgU0NPLgotCUZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotV2VkIE5vdiAyOSAxMzo0OTowOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSB0YXJnZXQtbGliaW8gb24gdjgxMC0qLSouCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCwgQVNfRk9SX1RBUkdFVCwgQVJfRk9SX1RBUkdFVCwKLQlSQU5MSUJfRk9SX1RBUkdFVCk6IFNldCBhcyBhcHByb3ByaWF0ZSBmb3IgTkVDIHY4MTAgdG9vbGNoYWluLgotCi1XZWQgTm92IDI5IDEyOjEyOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgZ2FzIGZvciBhbHBoYS1kZWMtb3NmKi4KLQotVHVlIE5vdiAyOCAxNzoxNjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmYXVsdCB0byAtLXdpdGgtc3RhYnMgZm9yIHNvbWUgdGFyZ2V0cyBmb3Igd2hpY2gKLQlpdCBtYWtlcyBzZW5zZTogbWlwcyotKi0qLCBhbHBoYSotKi1vc2YqLCBpWzM0NV04NiotKi1zeXN2NCogYW5kCi0JaVszNDVdODYqLSotdW5peHdhcmUqLgotCi1Nb24gTm92IDI3IDEzOjQ0OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBHZXQgbGlzdCBvZiBtdWx0aWRpcnMgdXNpbmcgZ2NjIC0tcHJpbnQtbXVsdGktbGliCi0JcmF0aGVyIHRoYW4gYmFzaW5nIGl0IG9uIHRoZSB0YXJnZXQuICBTaW1wbGlmeSBoYW5kbGluZyBvZiBvcHRpb25zCi0JY29udHJvbGxpbmcgd2hpY2ggZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLiAgUmVtb3ZlIGV4dHJhbmVvdXMKLQlzbGFzaCBpbiBtdWx0aS1jbGVhbiB0YXJnZXQuCi0KLUZyaSBOb3YgMjQgMTc6Mjk6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IFByZWZpeCBtb3JlIHZhcmlhYmxlcyB3aXRoIG1sXyBzbyB0aGV5IGRvbid0IGNvbGxpZGUKLQl3aXRoIGNvbmZpZ3VyZSdzLgotCi1XZWQgTm92IDIyIDExOjI3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB0dXJuIC12IGludG8gLS12LgotCi1UdWUgTm92IDIxIDE2OjQ4OjAyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IEZpeCB0eXBvLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHN5bWxpbmstdHJlZS4KLQotVHVlIE5vdiAyMSAxNDowODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgLS1ob3N0IGFuZCAtLXRhcmdldCBvcHRpb25zIGZyb20KLQlDT05GSUdfQVJHVU1FTlRTLCBhbmQgYWx3YXlzIGNvbmZpZ3VyZSBmb3IgLS1ob3N0IG9ubHkuICBBZGQKLQktLXdpdGgtY3Jvc3MtaG9zdCBvcHRpb24gd2hlbiBidWlsZGluZyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIuCi0JKiBjb25maWd1cmU6IENhbm9uaWNhbGl6ZSB0aGUgYXJndW1lbnRzIHB1dCBpbnRvIGNvbmZpZy5zdGF0dXMgYnkKLQlhbHdheXMgdXNpbmcgYD0nIGZvciBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4gIFBhc3MgYSBwcmVzdW1lZAotCS0taG9zdCBvciAtLXRhcmdldCBleHBsaWNpdGx5LgotCi1GcmkgTm92IDE3IDE3OjUwOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgLW1hY29zKiwgLW1hZ2ljKiwgLXBlKiwgYW5kIC13aW4zMiBjYXNlcwotCWludG8gZ2VuZXJhbCBPUyByZWNvZ25pdGlvbiBjYXNlLgotCi1GcmkgTm92IDE3IDE3OjQyOjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jb25maWdkaXJzKTogYWRkIHRhcmdldC13aW5zdXAgb25seQotCWZvciB3aW4zMiB0YXJnZXQgc3lzdGVtcy4KLQotVGh1IE5vdiAxNiAxNDowNDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmdsb3NzKTogRGVwZW5kIHVwb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiwgc2luY2Ugd2hlbiBsaWJnbG9zcyBpcyBidWlsdCBpdCBsb29rcyB0bwotCXNlZSBpZiB0aGUgbmV3bGliIGRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBOb3YgMTUgMTQ6NDc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBVc2UgY29uZmlnLW1sLmluIGluc3RlYWQgb2YKLQljZmctbWwtKi5pbi4KLQotV2VkIE5vdiAxNSAxMTo0NToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIExEIGFuZCBMRF9GT1JfVEFSR0VUIHdoZW4gY29uZmlndXJpbmcgYQotCUNhbmFkaWFuIENyb3NzLgotCi1UdWUgTm92IDE0IDE1OjAzOjEyIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBhZGQgTERfRk9SX1RBUkdFVC4KLQotVHVlIE5vdiAxNCAxNDo1NjoxMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IGFkZCB0YXJnZXQtd2luc3VwLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgcGF0Y2ggZGlmZiBmbGV4IG1ha2UgdG8gJG5vY29uZmlnZGlycy4KLQkodGFyZ2V0PT1wcGNsZS1wZSk6IHJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMTQgMDE6MjU6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IFBhc3MgLS13aXRoLXRhcmdldC1zdWJkaXIuCi0JUHJlc2VydmUgcmVsYXRpdmUgcGF0aCBuYW1lcyBpbiAkc3JjZGlyLiAgQnVpbGQgc3ltbGluayB0cmVlIGlmCi0JY29uZmlndXJpbmcgY3Jvc3MgdGFyZ2V0IGRpciBhbmQgc3JjZGlyPS4gKD0gbm8gVlBBVEggc3VwcG9ydCkuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliZysrKTogRGVwZW5kIG9uIGNvbmZpZ3VyZS10YXJnZXQtbGlicnguCi0JKiBjZmctbWwtY29tLmluLCBjZmctbWwtcG9zLmluOiBEZWxldGVkLgotCSogY29uZmlnLW1sLmluOiBOZXcgZmlsZS4KLQkqIHN5bWxpbmstdHJlZTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IEVuc3VyZSBzcmNkaXI9Ii4iIGlmIHRoYXQncyB3aGF0IGl0IGlzLgotCi1Nb24gTm92IDEzIDEyOjM0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogQ2xhcmlmeSBzb21lIHBocmFzaW5nLCBhZGQgbm90ZXMgYWJvdXQgQ29kZVdhcnJpb3IKLQlpbmNsdWRlcyBhbmQgRkxFWF9TS0VMRVRPTiBzZXR0aW5nLgotCSogbXB3LWNvbmZpZ3VyZSAoLS13aXRoLWdudS1sZCk6IE5ldyBvcHRpb24sIGNvbnRyb2xzIHdoZXRoZXIKLQl0byB1c2UgUFBDTGluayBvciBsZCB3aXRoIFBvd2VyTWFjIEdDQy4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdyZXosIGRvLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCSogbXB3LWNvbmZpZy5pbjogQ29uZmlndXJlIGdyZXogaWYgdGFyZ2V0aW5nIE1hYy4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IHBtYWMgYW5kIHBtYWMtbXB3IGFzIG5hbWVzIGZvciBQb3dlck1hY3MsCi0gCWFjY2VwdCBtcHcgYW5kIG1hYy1tcHcgYXMgbmFtZXMgZm9yIG02OGsgTWFjcywgY2hhbmdlIG1hY29zNyB0bwotIAlqdXN0IG1hY29zLgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZ3JleiByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjLgotCSogTWFrZWZpbGUuaW4gKGFsbC1ncmV6LCBpbnN0YWxsLWdyZXopOiBOZXcgdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxNzozMzo1MSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ1hYIGRlZmF1bHRzIHRvIGdjYywgbm90IGcrKy4gIElmIHdlIGZpbmQKLSAJZ2NjIGluIHRoZSBwYXRoLCBzZXQgQ0MgdG8gZ2NjIC1PMi4KLQotVHVlIE5vdiAgNyAxNTo0NToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCAke2J1aWxkfSBjb3JyZWN0bHkuICBBdm9pZCBwaWNraW5nIHVwIGV4dHJhCi0Jc3BhY2VzIHdoZW4gcmVhZGluZyBDQyBhbmQgQ1hYIGZyb20gTWFrZWZpbGUuICBXaGVuIGRvaW5nIGEKLQlDYW5hZGlhbiBDcm9zcywgdXNlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtZXJvdXMKLQl2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IFdoZW4gZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgZG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIHRvb2xzIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgaGFuZGxlIGl0LgotCi1Nb24gTm92ICA2IDE5OjMyOjE3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoc2gtKi0qKTogQWRkIG0yIGFuZCBtbC9tMiB0byBtdWx0aWRpcnMuCi0KLVN1biBOb3YgIDUgMDA6MTU6NDEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBkdWJpb3VzIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcy4KLQotRnJpIE5vdiAgMyAwODoxNzo1NCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6ICBJZiBzdWJkaXIgaGFzCi0JY29uZmlndXJlIHNjcmlwdCwgcnVuIHRoYXQgaW5zdGVhZCBvZiB0aGlzIGRpcmVjdG9yeSdzIGNvbmZpZ3VyZS4KLQlJbiBlaXRoZXIgY2FzZSwgcHJpbnQgYSBtZXNzYWdlIHRoYXQgd2UncmUgY29uZmlndXJpbmcgdGhlIHN1Yi1kaXIuCi0KLVRodSBOb3YgIDIgMjM6MjM6MzYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQmVmb3JlIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHZhcmlvdXMgZmlsZXMsCi0JdXNlIHNlZCB0byBmaWx0ZXIgb3V0ICJ0YXJnZXQtIi4KLQotVGh1IE5vdiAgMiAxMzoyNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogU3BsaXQgcnVsZSB0byBkZWNyZWFzZSBjb21tYW5kIGxpbmUgbGVuZ3RoCi0JZm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBBUkdfTUFYIHZhbHVlcy4gIEZyb20gcGhkbUBpbmZvLnVjbC5hYy5iZQotCShQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE1OjE4OjM1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXBhdGNoKTogZGVwZW5kIG9uIGFsbC1saWJpYmVydHkuCi0KLVdlZCBOb3YgIDEgMTI6MjM6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHRoZSBvbmx5IGRpcmVjdG9yeSBpbiB0YXJnZXRfY29uZmlnZGlycyB3aGljaAotCWFjdHVhbGx5IGV4aXN0cyBpcyBsaWJpYmVydHksIHRoZW4gc2V0IHRhcmdldF9jb25maWdkaXJzIHRvIGVtcHR5LAotCXRvIGF2b2lkIHRyeWluZyB0byBidWlsZCBhIHRhcmdldCBsaWJpYmVydHkgaW4gYSBnYXMgb3IgZ2RiCi0JZGlzdHJpYnV0aW9uLgotCi1UdWUgT2N0IDMxIDE3OjUyOjM5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BzbGF2ZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IFVzZSBtNjhrLXN1bi1zdW5vcyogaW5zdGVhZAotIAlvZiBtNjhrLXN1bi0qIHdoZW4gc2VsZWN0aW5nIG1oLXN1bjMgdG8gYXZvaWQgbWF0Y2hpbmcgTmV0QlNEL3N1bjMKLSAJc3lzdGVtcy4KLQotVHVlIE9jdCAzMSAxNjo1NzozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29weV9kaXJzKTogVXNlIHN5cy1pbmNsdWRlIGluc3RlYWQgb2YgaW5jbHVkZQotCWZvciAtLXdpdGgtaGVhZGVycyBvcHRpb24uCi0KLVR1ZSBPY3QgMzEgMTA6Mjk6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogTWFrZSB3aW5zdXAgYnVpbGRzIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUuCi0KLU1vbiBPY3QgMzAgMTg6NTc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHRoZSBsaW5rZXIgb24gQUlYLgotCi1Nb24gT2N0IDMwIDEyOjI3OjE2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiAgQWRkICQoVEFSR0VUX1NVQkRJUikKLQl3aGVyZSBuZWVkZWQuCi0KLU1vbiBPY3QgMzAgMTI6NDU6MjUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEZpeCB0eXBvLgotCi1TYXQgT2N0IDI4IDEwOjI3OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiAgRml4IHR5cG8uCi0KLUZyaSBPY3QgMjcgMjM6MTQ6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBsaWJGT08gdG8gdGFyZ2V0LWxpYkZPTywgYW5kIHhpYmVydHkKLQl0byB0YXJnZXQteGliZXJ0eSwgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5LgotCSh0YXJnZXRfc3ViZGlyKTogIERlZmluZS4gIENyZWF0ZSBpZiBjcm9zcy4KLQlTZXQgVEFSR0VUX1NVQkRJUiBpbiBNYWtlZmlsZSB0byAke3RhcmdldF9zdWJkaXJ9LgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgYWxsLWxpYkZPTyAtPiBhbGwtdGFyZ2V0LWxpYkZPTywgYWxsLXhpYmVydHkKLQktPiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSwgY29uZmlndXJlLWxpYkZPTyAtPiBjb25maWd1cmUtdGFyZ2V0LWxpYkZPTywKLQljaGVjay1saWJGT08gLT4gY2hlY2stdGFyZ2V0LWxpYkZPTywgZXRjLgotCSgkKERPX1gpKTogIEl0ZXJhdGUgb3ZlciBUQVJHRVRfQ09ORklHRElSUyBhZnRlciBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpLAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSk6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkoY29uZmlndXJlLXRhcmdldC1YWFgpOiAgRGVwZW5kIG9uICQoQUxMX0dDQyksIG5vdCBhbGwtZ2NjLCB0bwotCWFsbG93IEFMTF9HQ0M9IiIgdG8gb25seSBjb25maWd1cmUuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY2ZnLW1sLWNvbS5pbiBhbmQgY2ZnLW1sLXBvcy5pbi4KLQkoRVRDX1NVUFBPUlQsIEVUQ19TVVBQT1JUX1BGWCk6ICBNZXJnZTsgIHVwZGF0ZSAndGF6JyBhY2NvcmRpbmdseS4KLQkoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBSZW1vdmUgeGliZXJ0eS4KLQotU2F0IE9jdCAyOCAwMTo1Mzo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEJ1aWxkICJpbmZvIiBpbiBldGMgZXhwbGljaXRseS4KLQotRnJpIE9jdCAyNyAwOTozMjozMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIHN1cmUgdGhhdCBDQyBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8KLQludWxsKSBpZiB0b3BsZXZlbC9jb25maWcvbWgte2hvc3R9IGRvZXNuJ3QgZGVmaW5lIGl0LiAgRml4ZXMgYQotCXByb2JsZW0gd2l0aCBhdXRvY29uZiB0cnlpbmcgdG8gY29uZmlndXJlIG9uIGEgaG9zdCB3aXRob3V0IEdDQy4KLQotVGh1IE9jdCAyNiAyMjozNTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IFNldCBob3N0IGFsaWFzIGZyb20gY2hvaWNlIG9mIGhvc3QgY29tcGlsZXIsCi0Jb25seSB1c2UgZ2VuZXJpYyBNUFcgTWFrZWZpbGUgc2VkIGlmIHByZXNlbnQsIGVkaXQgYSBmaWxlCi0JbmFtZWQgImhhY2tlZF9NYWtlZmlsZS5pbiIgaW5zdGVhZCBvZiAiTWFrZWZpbGUuaW4iIGlmIHByZXNlbnQuCi0JKiBtcHctUkVBRE1FOiBBZGQgcHJvYmxlbSBub3RlcyBhYm91dCBDVzYgYW5kIENXNy4KLQotVGh1IE9jdCAyNiAwNTo0NToxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAiOyIgaW5zdGVhZCBvZiAiOzsiLgotCi1XZWQgT2N0IDI1IDE1OjE4OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIEdyZXAgZm9yICdeZGlzdHN0dWZmOicgb3IgJ15pbmZvOicgaW4KLQlzdWItZGlyZWN0b3J5IE1ha2VmaWxlcywgaW5zdGVhZCBvZiB1c2luZyBESVNUU1RVRkZESVJTIGFuZAotCURJU1RET0NESVJTLgotCShESVNUU1RVRkZESVJTLCBESVNURE9DRElSUyk6ICBSZW1vdmVkIC0gbm8gbG9uZ2VyIHVzZWQuCi0JKG5ld2xpYi50YXIuZ3opOiAgRG9uJ3QgcGFzcyBESVNURE9DRElSUyB0byByZWN1cnNpdmUgbWFrZS4KLQotV2VkIE9jdCAyNSAxNDo0Mzo1NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIFJlbW92ZSBsZCBncHJvZiBibnV0aWxzIGdhcyBsaWJnKysgZ2RiCi0JYW5kIGduYXRzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdyBzdWJzdW1lZCBieSBESVNUU1RVRkZESVJTLgotCU1vdmUgYmZkIHRvIERJU1RTVFVGRkRJUlMuCi0KLVR1ZSBPY3QgMjQgMTg6MTk6MDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYMTFfTElCKTogUmVtb3ZlZC4KLQkoWDExX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIG9ubHkgWDExX0VYVFJBX0NGTEFHUyBhbmQgWDExX0VYVFJBX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogbWgtYWl4ICYgbWgtc3VuIHJlbW92ZWQuCi0KLVN1biBPY3QgMjIgMTM6MDQ6NDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IFNob3J0ZW4gc29tZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5Ci0JbmFtZXMuCi0KLUZyaSBPY3QgMjAgMTg6MDI6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi1lYWJpKik6IEFkZCBtY2FsbC1haXhkZXNjIHZhcmllbnRzLgotCi1UaHUgT2N0IDE5IDEwOjQwOjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi13aW4zMik6IEFsd2F5cyBidWlsZCBuZXdsaWIuCi0JRG9uJ3QgY29uZmlndXJlIGN2cywgYXV0b2NvbmYgb3IgdGV4aW5mby4KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogTmV3LgotCShCQVNFX0ZMQUdTX1RPX1BBU1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlQYXNzIGRvd24gTERfRk9SX1RBUkdFVC4KLQotV2VkIE9jdCAxOCAxNTo1Mzo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW5zdXA6IE5ldyBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgd2luc3VwLgotCSogY29uZmlndXJlLmluOiBXaW5zdXAgaXMgY29uZmlndXJlZCB3aGVuIHRhcmdldCBpcyB3aW4zMi4KLQlDYW4gb25seSBidWlsZCB3aW4zMiB0YXJnZXQgR0RCIHdoZW4gbmF0aXZlLgotCQotTW9uIE9jdCAxNiAwOTo0MjozMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhQIG1vZGVsIDgxOSBtYWNoaW5lcyBhcyBoYXZpbmcKLQlhIFBBIDEuMSBwcm9jZXNzb3IuCi0KLU1vbiBPY3QgMTYgMTA6NDk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCBzZWQgbG9vcCB3aGljaCBzdWJzdGl0dXRlcyBmb3IgQ0MgYW5kIENYWCB0bwotCWF2b2lkIGJ1ZyBmb3VuZCBpbiB2YXJpb3VzIHNlZCBpbXBsZW1lbnRhdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTY6MTY6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjLSotZWFiaXNpbSk6IERlbGV0ZSBzZXBhcmF0ZSBydWxlIGZvcgotCXNpbXVsYXRvci4gIFVzZSBzdGFuZGFyZCBwb3dlcnBjLSotZWFiaSouCi0KLU1vbiBPY3QgIDkgMTc6MjE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgcHV0dGluZyBnYXMgYW5kIGJpbnV0aWxzIGluIG5vY29uZmlnZGlycyBmb3IKLQlwb3dlcnBjLSotYWl4KiBhbmQgcnM2MDAwLSotKi4KLQotTW9uIE9jdCAgOSAxMjozODo0MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZwotCS1tY2FsbC1haXhkZXNjIGxpYnJhcmllcy4KLQotRnJpIE9jdCAgNiAxNjoxNzo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5zdWIgKGFybSB8IGFybWVsIHwgYXJtZWIpOiBGaXggc2hlbGwgc3ludGF4LgotCi1GcmkgT2N0ICA2IDE0OjQwOjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoe3Bvd2VycGMscnM2MDAwfS1pYm0tYWl4Kik6IEFkZCBtdWx0aWxpYnMgZm9yCi0JLW1zb2Z0LWZsb2F0IGFuZCAtbWNwdT1jb21tb24gc3VwcG9ydC4KLQkocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyAtbWNhbGwtYWl4Ci0JbGlicmFyaWVzLgotCi1UaHUgT2N0ICA1IDEzOjI2OjM3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBbGxvdyBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBvZiBlbWFjczE5IGZvciB0aGUgYWxwaGEuCi0KLVdlZCBPY3QgIDQgMjI6MDU6MzYgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBHZXQgXkNDLCBub3QganVzdCBhbnkgb2xkIENDLCBmcm9tCi0JJHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1XZWQgT2N0ICA0IDIxOjU1OjAwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKENDKTogVHJ5IHRvIGdldCBDQyBmcm9tIAotCSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30sIG5vdCAke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NDQ6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IGNvbmZpZ3VyZSB0YXJnZXRkaXJzCi0Jb25seSBpZiBpdCBleGlzdHMgaW4gJChzcmNkaXIpLgotCi1XZWQgT2N0ICA0IDExOjUyOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgc2V0Ci0JdGhlbSwgYmFzZWQgb24gZWl0aGVyIGFuIGV4aXN0aW5nIE1ha2VmaWxlIG9yIG9uIHNlYXJjaGluZyBmb3IgZ2NjCi0JaW4gUEFUSC4gIFN1YnN0aXR1dGUgZm9yIENDIGFuZCBDWFggaW4gTWFrZWZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBsaWJtIGZyb20gdGFyZ2V0X2xpYnMuICBTZXBhcmF0ZQotCXRhcmdldF9jb25maWdkaXJzIGZyb20gY29uZmlnZGlycy4gIElmIENDIGlzIG5vdCBzZXQgaW4KLQllbnZpcm9ubWVudCwgdHJ5IHRvIGdldCBpdCBmcm9tIGEgaG9zdCBNYWtlZmlsZSBmcmFnbWVudC4gIFJld3JpdGUKLQljaGFuZ2VzIG9mIGNvbmZpZ2RpcnMgdG8gdXNlIHNraXBkaXJzIGluc3RlYWQuICBBIGZldyBtaW5vcgotCXR3ZWFrcy4gIFRha2UgZGlyZWN0b3JpZXMgb3V0IG9mIHRhcmdldF9jb25maWdkaXJzIGFzIHRoZXkgYXJlCi0JdGFrZW4gb3V0IG9mIGNvbmZpZ2RpcnMuICBSZW1vdmUgZXhpc3RpbmcgTWFrZWZpbGUgZmlsZXMgZnJvbQotCXN1YmRpcmVjdG9yaWVzLiAgU3Vic3RpdHV0ZSBmb3IgVEFSR0VUX0NPTkZJR0RJUlMgYW5kCi0JQ09ORklHX0FSR1VNRU5UUyBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IE5ldyB2YXJpYWJsZSwgYXV0b21hdGljYWxseSBzZXQKLQlieSBjb25maWd1cmUuaW4uCi0JKENPTkZJR19BUkdVTUVOVFMpOiBMaWtld2lzZS4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogTG9vcCBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFzIHdlbGwgYXMgU1VCRElSUy4KLQkoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLWxpYmcrKywgY29uZmlndXJlLWxpYmlvKTogTmV3IHRhcmdldHMuCi0JKGFsbC1saWJnKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliZysrLgotCShhbGwtbGliaW8pOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliaW8uCi0JKGNvbmZpZ3VyZS1saWJnbG9zcywgYWxsLWxpYmdsb3NzKTogTmV3IHRhcmdldHMuCi0JKGNvbmZpZ3VyZS1saWJzdGRjKyspOiBOZXcgdGFyZ2V0LgotCShhbGwtbGlic3RkYysrKTogRGVwZW5kIHVwb24gY29uZmlndXJlLWxpYnN0ZGMrKy4KLQkoY29uZmlndXJlLWxpYnJ4LCBhbGwtbGlicngpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLW5ld2xpYik6IE5ldyB0YXJnZXQuCi0JKGFsbC1uZXdsaWIpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbmV3bGliCi0JKGNvbmZpZ3VyZS14aWJlcnR5KTogTmV3IHRhcmdldC4KLQkoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUteGliZXJ0eS4KLQotU2F0IFNlcCAzMCAwNDozMjo1OSAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6ICBFeHBhbmQgdGhlCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1UaHUgU2VwIDI4IDIxOjE4OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogRml4IHNlZCBjb21tYW5kIGZpbGUgbmFtZS4KLQotVGh1IFNlcCAyOCAxNzozOTo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6IFJlZHVjZSB0aGUgCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1XZWQgU2VwIDI3IDEyOjI0OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQgYW5kIGdkYiBmb3IgcG93ZXJwYyotKi13aW5udCoKLQlvciBwb3dlcnBjKi0qLXBlKiwgc2luY2UgdGhleSBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCi0KLVR1ZSBTZXAgMjYgMTQ6MzA6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JQWRkIFBvd2VyTWFjIHN1cHBvcnQgYW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IG9wdGlvbiAtLWNjIHRvIHNlbGVjdCBjb21waWxlciB0byB1c2UsCi0JcGFzdGUgb3B0aW9ucyBzZXQgYWNjb3JkaW5nIHRvIC0tY2MgaW50byB0aGUgZ2VuZXJhdGVkCi0JTWFrZWZpbGUsIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBieSBzZWQnaW5nIHRoZSBVbml4IE1ha2VmaWxlLmluCi0JaWYgbXB3LW1ha2Uuc2VkIGlzIHByZXNlbnQuCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCB0ZXN0IGZvciBnQzEsIHRlc3QgZm9yIG1wdy10b3VjaCwKLQlhZGQgZm9yd2FyZCBpbmNsdWRlcyBmb3IgUG93ZXJQQyBpbmNsdWRlIGZpbGVzLgotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCB1c2luZyBNYWtlZmlsZS5QUEMgaWYgcHJlc2VudC4KLQkoZG8tYnlhY2MsIGV0Yyk6IFJlbW92ZSBzZXBhcmF0ZSB2ZXJzaW9uIHJlc291cmNlIGJ1aWxkcy4KLQkoZG8tZ2FzKTogQnVpbGQgInN0YW1wcyIgYmVmb3JlICJhbGwiLgotCShkby1nY2MpOiBCdWlsZCAic3RhbXBzLWgiIGFuZCAic3RhbXBzLWMiIGJlZm9yZSAiYWxsIi4KLQkqIG1wdy1SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IC0tY2Mgb3B0aW9uLCBQb3dlck1hYyBzdXBwb3J0LAotCWFuZCByZWNlbnRseS1yZXBvcnRlZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotCi1GcmkgU2VwIDIyIDEyOjE1OjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAobTY4Ki0qLSopOiBPbmx5IGJ1aWxkIG11bHRpbGlicyBmb3IKLQllbWJlZGRlZCBtNjhrIHN5c3RlbXMgKC1hb3V0LCAtY29mZiwgLWVsZiwgLXZ4d29ya3MpLgotCSgtLXdpdGgtbXVsdGlsaWItdG9wKTogUGFzcyB0byByZWN1cnNpdmUgaW52b2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTkgMTM6NTE6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBsaWJnKysgYW5kIGxpYnN0ZGMrKyBvbgotCXY4MTAtKi0qLgotCi1Nb24gU2VwIDE4IDIzOjA4OjI2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGJmZCwgYmludXRpbHMsIGdhcywgZ2NjLAotCWdkYiwgbGQgYW5kIG9wY29kZXMgb24gdjgxMC0qLSouCi0KLVNhdCBTZXAgMTYgMTg6MzE6MDggUERUIDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgPGFuZ2VsYUBjeWdudXMuY29tPgotCQotCSogY29uZmlnL21oLW5jcnN2cjQzOiBSZW1vdmVkIEFSX0ZMQUdTCi0KLVR1ZSBTZXAgMTIgMTg6MDM6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IENoYW5nZSBkby1yZWFsY2xlYW4gdG8gZG8tbWFpbnRhaW5lci1jbGVhbi4KLQkobG9jYWwtbWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCShyZWFsY2xlYW4pOiBKdXN0IGRlcGVuZCB1cG9uIG1haW50YWluZXItY2xlYW4uCi0KLUZyaSBTZXAgIDggMTc6MTE6MTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgZ2RiIG9uIG02OGstKi1uZXRic2QqLgotCi1GcmkgU2VwICA4IDE2OjQ2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBpbiBtaXBzKi0qLWJzZCogY2FzZS4KLQotVGh1IFNlcCAgNyAyMDowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogT1MuICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDA4OjA2OjU4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pc2UgbWlwczY0dnI0MzAwIGFuZCBtaXBzNjR2cjQzMDBlbCBhcyB2YWxpZAotIAl0YXJnZXRzLgotCi1XZWQgQXVnIDMwIDIxOjA2OjUwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRyZWF0IGkzODYtd2luMzIgY2FuYWRpYW4gY3Jvc3MgdGhlIHNhbWUgYXMKLQlpMzg2LWdvMzIgY2FuYWRpYW4gY3Jvc3MuCi0KLVRodSBBdWcgMjQgMTQ6NTM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0pOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQwotCXJ1bm5pbmcgdW5kZXIgdGhlIHNpbXVsYXRvciB0byBidWlsZCBhIHJlZHVjZWQgc2V0IG9mIGxpYnJhcmllcy4KLQkocG93ZXJwYy0qLWVhYmlhaXgpOiBBZGQgZmluZSBncmFpbmVkIG11bHRpbGliIHN1cHBvcnQgYWRkZWQgdG8KLQlvdGhlciBwb3dlcnBjIHRhcmdldHMgeWVzdGVyZGF5LgotCi1XZWQgQXVnIDIzIDA5OjQxOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyopOiBBZGQgc3VwcG9ydCBmb3IgLWRpc2FibGUtYmllbmRpYW4sCi0JLWRpc2FibGUtc29mdGZsb2F0LCAtZGlzYWJsZS1yZWxvY2F0YWJsZSwgLWRpc2FibGUtYWl4LCBhbmQKLQktZGlzYWJsZS1zeXN2IHRvIGNvbnRyb2wgd2hpY2ggbXVsdGlsaWIgbGlicmFyaWVzIGdldCBidWlsdC4KLQotVGh1IEF1ZyAxNyAxNjowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIE1ha2VmaWxlLnRlbSB0byBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSBpbiB0cmFwCi0JaGFuZGxlci4KLQotTW9uIEF1ZyAxNCAxOToyNzo1NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqTGludXgqKTogIEFkZCBtaXNzaW5nICJleGl0InMuCi0JQWxzbywgbmVlZCBzcGVjaWZpYyBjaGVjayBmb3IgYWxwaGEtdW5rbm93bi1saW51eCAodXNlcyBDT0ZGKS4KLQotRnJpIEF1ZyAxMSAxNTozODoyMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlXZWQgSnVuIDI4IDE3OjU3OjI3IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBSVg0KTogTW9yZSByb2J1c3QgcmVsZWFzZSBudW1iZXJpbmcgZGlzY292ZXJ5LgotCi0JVGh1IEp1biAyMiAxOTowMToyNCAxOTk1ICBLZW5uZXRoIFN0YWlsZXkgIChrc3RhaWxleUBlYWdsZS5kb2wtZXNhLmdvdikKLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni1zZXF1ZW50LXB0eCk6IFByb3Blcmx5IGdldCB2ZXJzaW9uIG51bWJlci4KLQotCVRodSBKdW4gMjIgMTg6MzY6NDIgMTk5NSAgVXdlIFNlaW1ldCAgKHNlaW1ldEBpcmlzMS5jaGVtaWUudW5pLWtsLmRlKQotCSogY29uZmlnLmd1ZXNzIChtaXBzOio6NCo6VU1JUFMpOiBOZXcgY2FzZS4KLQotTW9uIEF1ZyAgNyAwOToyMTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtZ28zMiBob3N0KTogRml4IHR5cG8gKGRlamEtZ251IC0+IGRlamFnbnUpLgotCShpMzg2LXdpbjMyIGhvc3QpOiBMaWtld2lzZS4gIERvbid0IGJ1aWxkIHJlYWRsaW5lLgotCi1TYXQgQXVnICA1IDA5OjUxOjQ5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdEQlRLX1NVUFBPUlRfRElSUyk6ICBEZWZpbmUgYW5kIHBhc3MgYXMgcGFydCBvZgotCVNVUFBPUlRfRklMRVMgdG8gc3VibWFrZXMuCi0KLUZyaSBBdWcgIDQgMTM6MDQ6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogQWRkIHV0aWxzLgotCShERVZPX1NVUFBPUlQpOiBBZGQgbXB3LVJFQURNRSwgbXB3LWJ1aWxkLmluLCBtcHctY29uZmlnLmggYW5kCi0JbXB3LWNvbmZpZ3VyZS4KLQotV2VkIEF1ZyAgMiAxNjozMjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogVXNlID0sIG5vdCA9PSwgaW4gdGVzdCBleHByZXNzaW9uIHdoZW4KLQl0cnlpbmcgdG8gYnVpbGQgdGhlIHRleHQgdG8gcHJpbnQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IKLQlTb2xhcmlzIHVzZXJzLgotCi1Nb24gSnVsIDMxIDA5OjU2OjE4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHo4ay0qLWNvZmYpOiBBZGQgJ3N0ZCcgbXVsdGlsaWIgYnVpbGQuCi0KLUZyaSBKdWwgMjggMDA6MTY6MzEgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGx5bngtMi4zLgotCi1UaHUgSnVsIDI3IDE1OjQ3OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKHo4a3NpbSk6IERlbGV0ZWQKLQkoejhrLSotY29mZik6IE5ldywgdGhpcyBpcyB0aGUgb25lIHRydWUgbmFtZSBvZiB0aGUgdGFyZ2V0LgotCi1UaHUgSnVsIDI3IDE0OjMzOjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKGRvdGRvdCk6IFdvcmsgYXJvdW5kIFN1bk9TIHNlZCBidWcuCi0KLVRodSBKdWwgMjcgMTM6MzE6MDUgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBGaXJzdCB0cnkgYXNraW5nIHRoZSBsaW5rZXIgd2hhdCB0aGUKLQlkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyAoZWxmLCBhb3V0LCBvciBjb2ZmKS4gIFRoZW4gaWYgdGhpcwotCWZhaWxzLCB0cnkgcHJldmlvdXMgbWV0aG9kcy4KLQotVGh1IEp1bCAyNyAxMToyODoxNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciAqLSotdnh3b3JrczUuMS4KLQotVGh1IEp1bCAyNyAxMToxODo0NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBhMjlrLSotdnh3b3JrczUuMS4KLQkqIHRlc3QtYnVpbGQubWs6IEFkZCBzZXR0aW5nIG9mIC0td2l0aC1oZWFkZXJzIGZvciBhMjlrLXZ4d29ya3M1LjEuCi0KLVR1ZSBKdWwgMjUgMjE6MjU6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLXBvcy5pbiAoTVVMVElUT1ApOiBUcmltIGV4Y2VzcyB0cmFpbGluZyAiLy4iLgotCi1GcmkgSnVsIDIxIDEwOjQxOjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW46IE5ldyBmaWxlLgotCSogY2ZnLW1sLXBvcy5pbjogTmV3IGZpbGUuCi0KLVdlZCBKdWwgMTkgMDA6Mzc6MjcgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIENPUFlJTkcuTkVXTElCOiBBZGQgSFAgZnJlZSBjb3B5cmlnaHQgdG8gbGlzdC4KLQotVHVlIEp1bCAxOCAxMDo1ODo1MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSogZm9yIHRoZSBzeXN0ZW0sIG5vdCBqdXN0IC1lYWJpLgotCi1Nb24gSnVsICAzIDEzOjQ0OjUxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2ZpbGUuaW4gKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldyBuYW1lLCBwYXNzIGl0IGRvd24uCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4gKHdpbjMyKTogTmV3IHRhcmdldCBhbmQgaG9zdC4KLQotV2VkIEp1biAyOCAyMzo1NzowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LXBlIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gMjMgMTQ6Mjg6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQiBhZnRlciBMRC4KLQotVGh1IEp1biAyMiAxNzoxMDo1MyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBbHdheXMgZm9yd2FyZC1pbmNsdWRlLCBuZWVkZWQKLQlmb3IgR0RCIHRvIGJ1aWxkLgotCi1XZWQgSnVuIDIxIDE1OjE3OjMwIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogdGVzdHN1aXRlOiBOZXcgZGlyZWN0b3J5IGZvciBjdXN0b21lciBhY2NlcHRhbmNlIGFuZCB3aG9sZSB0b29sCi0JY2hhaW4gdGVzdHMuCi0KLVdlZCBKdW4gMjEgMTY6NTA6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBwZXItaG9zdCBsaW5lIGlzbid0IGZvdW5kLCBidXQgQUNfT1VUUFVUIGlzIGZvdW5kCi0JYW5kIGEgY29uZmlndXJlIHNjcmlwdCBleGlzdHMsIHJ1biBpdCBpbnN0ZWFkLgotCi1UaHUgSnVuIDE1IDIxOjA5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YsIGZvciBhbHBoYS1kZWMtd2lubnQzLjUgYW5kICBDcmF5cy4KLQotVHVlIEp1biAxMyAyMTo0MzoyNyAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGJ1aWxkX3tjcHUsdmVuZG9yLG9zLGFsaWFzfSB0byBob3N0IHZhbHVlcyB3aGVuCi0JLS1idWlsZCBpc24ndCBzcGVjaWZpZWQuCi0KLU1vbiBKdW4gIDUgMTg6MjY6MzYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChQSUNGTEFHLCBQSUNGTEFHX0ZPUl9UQVJHRVQpOiBOZXcgbWFjcm9zLgotCShGTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL20/LSpwaWM6IERlZmluZSBQSUNGTEFHKiBpbnN0ZWFkIG9mIExJQipGTEFHUyouCi0KLVdlZCBNYXkgMzEgMjI6Mjc6NDIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmcrKyk6IERlcGVuZCBvbiBhbGwtbGlic3RkYysrLgotCi1UaHUgTWF5IDI1IDIyOjQwOjU5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgYWxsIHBhY2thZ2VzIGZvcgotCSAgaTM4Ni11bmtub3duLW5ldGJzZC4KLQotU2F0IE1heSAyMCAxMzoyMjozMSAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSB0ayBmb3IgaTM4Ni1nbzMyCi0JaG9zdGVkIGJ1aWxkcyAoRE9TIGJ1aWxkcykKLQotVGh1IE1heSAxOCAxODowODo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZvciBBUk0gYmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJpY2hhcmQgRWFybnNoYXc6Ci0JKiBjb25maWcuc3ViOiBIYW5kbGUgYXJtZWIgYW5kIGFybWVsLgotCSogY29uZmlndXJlLmluOiBPbWl0IGFybSBsaW5rZXIgb25seSBmb3IgcmlzY2l4LgotCi1UaHUgTWF5IDExIDE3OjIzOjI2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCi0KLVR1ZSBNYXkgIDkgMTU6NTI6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgdGhlIGxpdHRsZSBlbmRpYW4gdmFyaWVudCBvZgotCXRoZSBQb3dlclBDLiAgUmVjZ29uaXplIHBwYyBhcyBhIFBvd2VyUEMgdmFyaWFudCwgYW5kIHBwY2xlIGFzIGEKLQlwb3dlcnBjbGUgdmFyaWFudC4gIENvbnZlcnQgcGVudGl1bSBpbnRvIGk1ODYsIG5vdCBpNDg2LiAgQWRkIHA1Ci0JYWxpYXMgZm9yIGk1ODYuICBNYXAgbmV3IHg4NiB2YXJpYW50cyBwNiwgazUsIG5leGdlbiBpbnRvIGk1ODYKLQl0ZW1wb3JhcmlseS4KLQotVHVlIE1heSAgMiAxNjoyOTo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQotU3VuIEFwciAzMCAyMTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotVGh1IEFwciAyNyAxMTozMzoyOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IENoZWNrIGZvciB3aGV0aGVyIHRoZSBwcmUtQkZEIGxpbmtlciBpcwotCWluc3RhbGxlZCwgYW5kIGlmIHNvIHJldHVybiBsaW51eG9sZGxkIGFzIHRoZSBzeXN0ZW0gbmFtZS4KLQotV2VkIEFwciAyNiAxMDo1OTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgaHBwYTEuMS1ocC1saXRlcyBzdXBwb3J0LgotCi1UdWUgQXByIDI1IDExOjA4OjExIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBuZXdsaWIgZm9yIG02OGstdnh3b3JrczUuMS4KLQotV2VkIEFwciAxOSAxNzowMjo0MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeDYpOiBVc2UgbWgtaXJpeDUuCi0KLUZyaSBBcHIgMTQgMTU6MjE6MTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IERlcGVuZCBvbiBhbGwtbGQgKGZvciBsaWJnY2MxLXRlc3QpLgotCi1XZWQgQXByIDEyIDE2OjA2OjAxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBJUklYIDUgYW5kCi0gICAgICAgIE9TRi8xLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCSogYnVpbGQtYWxsLm1rOiBTdXBwb3J0IExpbnV4IGFuZCBPU0YvMSAzLjAuICBGaXggY29tcGlsZXIgZmxhZ3MuCi0KLVR1ZSBBcHIgMTEgMTg6NTU6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi4KLQkoc3BhcmMtKi1zdW5vczQqKTogQnVpbGQgc2ltLCBkZWphZ251LCBleHBlY3QsIHRjbCBpZiBjcm9zcyB0YXJnZXQuCi0KLU1vbiBBcHIgMTAgMTQ6Mzg6MjAgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1vdmUge2FsbCxjaGVjayxpbnN0YWxsfS1nZGIgZnJvbSAqX01PRFVMRVMKLQl0byAqX1gxMV9NT0RVTEVTIGR1ZSB0byBnZGJ0ayBuZWVkaW5nIFggaW5jbHVkZSBmaWxlcyBldCBhbC4KLQotTW9uIEFwciAxMCAxMTo0MjoyMiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgZ2VuZXJpYyBpbmNsdWRlIGZvcndhcmRzIGZvciBjcHUtc3BlY2lmaWMKLQlpbmNsdWRlIGZpbGVzIGluIGFvdXQgYW5kIGVsZiBkaXJlY3Rvcmllcy4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkZWQgY29weXJpZ2h0LgotCSogbXB3LWNvbmZpZy5pbjogQ2hlY2sgZm9yIHByZXNlbmNlIG9mIHJlcXVpcmVkIGJ1aWxkIHRvb2xzLgotCSh0YXJnZXRfbGlicyk6IEFkZCBuZXdsaWIuCi0JKHRhcmdldF90b29scyk6IEFkZCBleGFtcGxlcy4KLQkoUmVhZCBNZSk6IEdlbmVyYXRlIGFzICJSZWFkIE1lIGZvciBNUFciIGluc3RlYWQuCi0JKiBtcHctYnVpbGQuaW46IEJhc2Ugc3ViLWJ1aWxkcyBvbiBhbGwtZm9vIGluc3RlYWQgb2YgZG8tZm9vLgotCShhbGwtYnlhY2MsIGRvLWJ5YWNjLCBhbGwtZmxleCwgZG8tZmxleCwgZG8tbmV3bGliKTogTmV3IGFjdGlvbnMuCi0JKGRvLWdhcywgZG8tZ2NjLCBkby1nZGIsIGRvLWxkKTogQnVpbGQgVmVyc2lvbi5yIGZpcnN0LgotCi0JKiBtcHctY29uZmlndXJlOiBSZW1vdmUgc3ViZGlyLXNwZWNpZmljIG1ha2VmaWxlIGhhY2tlcnksCi0JZGVsZXRlIG1rLnRtcCBhZnRlciB1c2luZyBpdC4KLQotCSogbXB3LWJ1aWxkLmluIChhbGwpOiBEaXNwbGF5IHN0YXJ0IGFuZCBlbmQgdGltZXMuCi0KLQkqIG1wdy1jb25maWd1cmUgKGhvc3RfY2Fub25pY2FsKTogU2V0LgotCSh0YXJnZXRfY3B1KTogQWx3YXlzIGFkZCB0byBtYWtlZmlsZXMuCi0JKEFSQ0hERUZTLCBFTVVMKTogQWRkIHRvIG1ha2VmaWxlIG9ubHkgaWYgbm9uZW1wdHkuCi0JKFRNX0ZJTEUsIFhNX0ZJTEUsIE5NX0ZJTEUpOiBObyBsb25nZXIgYWRkIHRvIG1ha2VmaWxlLgotCShtcHctbWgtbXB3KTogTG9vayBmb3IgaW4gc3JjZGlyIGFuZCBzcmNyb290LgotCVVzZSBzZWQgaW5zdGVhZCBvZiBtcHctZWRpdC1wcmVmaXggdG8gZWRpdCBwcmVmaXggZGVmaW5pdGlvbnMuCi0KLQkqIG1wdy1idWlsZC5pbjogKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0KLQkqIG1wdy1jb25maWd1cmUgKGhvc3RfYWxpYXMsIHRhcmdldF9hbGlhcyk6IFJlbmFtZSBmcm9tIGhvc3RhbGlhcwotCWFuZCB0YXJnZXRhbGlhcywgYWRkIGludG8gZ2VuZXJhdGVkIE1ha2VmaWxlLgotCShtay50bXApOiBJZiBwcmVzZW50LCBhZGQgaW50byBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKiBtcHctYnVpbGQuaW4gKGFsbC1nYXMpOiBCdWlsZCBjb25maWcuaCBmaXJzdCBiZWZvcmUgZ2FzIHByb3Blci4KLQotCSogbXB3LWNvbmZpZ3VyZSAoY29uZmlnLnN0YXR1cyk6IFdyaXRlIG9ubHkgaWYgY2hhbmdlZC4KLQkqIG1wdy1jb25maWcuaW4gKHJlYWRsaW5lKTogQ29uZmlndXJlIGl0IChub3QgYnVpbHQsIGp1c3QgdXNlZCBmb3IKLQlkZWZpbml0aW9ucykuCi0KLQkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBZGQgYSBmb3J3YXJkIGluY2x1ZGUuCi0KLQkqIG1wdy1jb25maWcuaW46IEZvcndhcmQtaW5jbHVkZSBtb3N0IC5oIGZpbGVzIGluIGluY2x1ZGUgaW50bwotCWV4dHJhLWluY2x1ZGUuCi0JKHJlYWRsaW5lKTogRG9uJ3QgYnVpbGQuCi0JbXB3LWJ1aWxkLmluIChpbnN0YWxsKTogSW5zdGFsbCBHREIuCi0KLQkqIG1wdy1jb25maWd1cmUgKHByZWZpeCwgbXB3X3ByZWZpeCk6IEhhbmRsZSBpdC4KLQkqIG1wdy1jb25maWcuaW4gKG1tYWxsb2MsIHJlYWRsaW5lKTogRG9uJ3QgY29uZmlndXJlLgotCSogbXB3LWJ1aWxkLmluICh0aGlzc2NyaXB0KTogUmVuYW1lIHRvIFRoaXNTY3JpcHQuCi0JVXNlIG1wdy1idWlsZCBpbnN0ZWFkIG9mIEJ1aWxkUHJvZ3JhbSBldmVyeXdoZXJlLgotCShtbWFsbG9jLCByZWFkbGluZSk6IERvbid0IGJ1aWxkLgotCSogbXB3LVJFQURNRTogTmV3IGZpbGUsIGJhc2ljIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIE1QVyBwb3J0LgotCi0JKiBtcHctY29uZmlnLmluOiBVc2UgZm9yd2FyZC1pbmNsdWRlIHRvIGNyZWF0ZSBpbmNsdWRlIGZpbGVzLgotCi0JKiBtcHctY29uZmlndXJlOiBBZGQgbW9yZSB0aGluZ3MgdG8gdGhlIHRvcCBvZiBlYWNoIGNvbmZpZ3VyZWQKLQlNYWtlZmlsZSwgaW5jbHVkaW5nIGNvbnRlbnRzIG9mIGNvbmZpZy9tcHctbWgtbXB3LgotCSogbXB3LWNvbmZpZy5pbiAoZXh0cmEtaW5jbHVkZSk6IENyZWF0ZSB0aGlzIGRpcmVjdG9yeSBhbmQgZmlsbCBpdAotCXdpdGggUG9zaXgtbGlrZSBpbmNsdWRlIGZpbGVzIHdoZW4gY29uZmlndXJpbmcuCi0KLQkqIGNvbmZpZy5zdWIgKGFwcGxlLCBtYWMsIG1wdyk6IEFkZCB2YXJpb3VzIGFsaWFzZXMuCi0KLQkqIG1wdy1idWlsZC5pbjogTmV3IGZpbGUsIHRvcC1sZXZlbCBidWlsZCBzY3JpcHQgZnJhZ21lbnQgZm9yIE1QVy4KLQkqIG1wdy1jb25maWd1cmU6IE5ldyBmaWxlLCBjb25maWd1cmUgc2NyaXB0IGZvciBNUFcuCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgY29uZmlnIGZyYWdtZW50IGZvciBNUFcuCi0KLUZyaSBBcHIgIDcgMTk6MzM6MTYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9saWJzKTogUmVtb3ZlIGdsb2IsIHNpbmNlIGl0IGlzIGdvbmUgZnJvbSB0aGUKLQlzb3VyY2VzLgotCi1GcmkgTWFyIDMxIDExOjM2OjE3IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIGVtcHR5IEdEQl9OTE1fREVQUyB2YXIuCi0KLQkqIGNvbmZpZ3VyZS5pbih0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IHVzZSBjb25maWcvbXQtbmV0d2FyZQotCWZvciBuZXR3YXJlIHRhcmdldHMuCi0KLVRodSBNYXIgMzAgMTM6NTE6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSBpbiByZWNlbnQgRlNGIGNoYW5nZXMuICBSZW1vdmUgbGludXggc3BlY2lhbAotCWNhc2VzLgotCi1UdWUgTWFyIDI4IDE0OjQ3OjM0IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQlidWlsZC1hbGwubWssY29uZmlnL21oLXNvbGFyaXM6ICByZXZlcnQgdGhlc2UgdHdvIGNoYW5nZXM6Ci0KLQlUdWUgTWFyIDMwIDEwOjAzOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCQkqIGJ1aWxkLWFsbC5tazogVXNlIENDPWNjIC1YcyBvbiBTb2xhcmlzLgotCi0JTW9uIE1hciAyOSAxOTo1OToyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkJKiBjb25maWcvbWgtc29sYXJpczogU3VuUFJPIEMgbmVlZHMgLVhzIHRvIGJlIGFibGUgdG8gZ2V0IGEKLQkJd29ya2luZyB4bWFrZWZpbGUgZm9yIEVtYWNzLgotCi1UdWUgTWFyIDIxIDEwOjQzOjMyIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBnbG9iLyo6IFJlbW92ZWQuICBTY2hhdWVyJ3MgMjQgRmViIDE5OTQgcmVhZGxpbmUgY2hhbmdlIG1hZGUgdXMKLQlzdG9wIHVzaW5nIGl0LgotCSogTWFrZWZpbGUuaW46IE51a2UgYWxsIHJlZmVyZW5jZXMgdG8gZ2xvYiBzdWJkaXJlY3RvcnkuCi0KLVRodSBNYXIgMTYgMTM6MzU6MzAgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IC0tZW5hYmxlLXNoYXJlZCBsb2dpYyBpbiBwZXItaG9zdC4KLQotTW9uIE1hciAxMyAxMjozMzoxNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi1ocC1ocHV4Wzc4XSopOiBVc2UgbWgtaHB1eDguCi0KLU1vbiBNYXIgIDYgMTA6MjE6NTggMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgZ2FzIG9uIEFJWCwgZm9yCi0JcG93ZXJwYyotKi1haXgqIGFzIHdlbGwgYXMgZm9yIHJzNjAwMCotKi1haXgqLgotCi1XZWQgTWFyICAxIDEyOjUxOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBGaXggLS1jYWNoZS1maWxlIHRvIHdvcmsgaWYgdGhlIGZpbGUgYXJndW1lbnQgaXMgYQotCXJlbGF0aXZlIHBhdGguCi0KLVR1ZSBGZWIgMjggMTc6MzY6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIHRoZSAtLWNhY2hlLWZpbGUgaXMgdXNlZCwgcGFzcyBpdCBkb3duIHRvCi0JY29uZmlndXJlIGluIHN1YmRpcmVjdG9yaWVzLgotCi1Nb24gRmViIDI3IDEyOjUyOjQ2IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IGFkZCB2eHdvcmtzMjlrIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMTAgMTY6MTI6MjYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IERvICJkaXN0c3R1ZmYiIHBhcnQgcXVpZXRseS4KLQotU3VuIEZlYiAgNSAxNDoxNjozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNaW5pLW1lcmdlIHdpdGggZ2NjL2NvbmZpZy5zdWIuCi0KLVNhdCBGZWIgIDQgMTI6MTE6MzUgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKElSSVgpOiBTZWQgLSB0byBfLgotCi1GcmkgRmViICAzIDExOjU0OjQyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNvdXJjZS12YXVsdCwgYmluYXJ5LXZhdWx0KTogTmV3IHRhcmdldHMuCi0KLVRodSBKYW4gMjYgMTM6MDA6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSBhcyBhIGJhc2ljIHN5c3RlbSB0eXBlLgotCi1UaHUgSmFuIDEyIDEzOjEzOjIzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVuYWJsZV9zaGFyZWQgc3R1ZmYpOiBGaXggdHlwby4KLQotVGh1IEphbiAxMiAwMTozNjo1MSAxOTk1ICBkZWFubUBtZWR1bGxhLkxBQlMuVEVLLkNPTSAoRGVhbiBNZXNzaW5nKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRml4IHR5cG8gaW4gcGFzc2luZyBMSUJDWFhGTEFHUyouCi0KLVdlZCBKYW4gMTEgMTY6Mjk6NTMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMSUJDWFhGTEFHU19GT1JfVEFSR0VUKTogQWRkIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLgotCi1Nb24gSmFuICA5IDEyOjQ4OjAxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMC0qLSopOiBEb24ndCBidWlsZCBnYXMuCi0KLVdlZCBKYW4gIDQgMjM6NTM6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXNlIC94L3gvIGluc3RlYWQgb2YgL2Jyb2tlbnNlZC9icm9rZW5zZWQvLCB0bwotCXJlZHVjZSBjb21tYW5kIGxpbmUgbGVuZ3RoLgotCShBU19GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIGFzLm5ldywgbm90IE1ha2VmaWxlLgotCShOTV9GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIG5tLm5ldywgbm90IE1ha2VmaWxlLgotCi1XZWQgSmFuICA0IDEzOjAyOjM5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRi4KLQotVGh1IERlYyAxNSAxNzoxMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgdXNlICQgd2hlbiBoYW5kbGluZyBwcm9ncmFtX3N1ZmZpeC4KLQotTW9uIERlYyAxMiAxMjowOTozNyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDb25maWd1cmUgdGsgZm9yIGhwcGEvaHB1eC4KLQotRnJpIERlYyAgMiAxNTo1NTozOCAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExJQkdYWF9TVVBQT1JUX0RJUlMpOiAgQWRkIGxpYnN0ZGMrKy4KLQotVHVlIE5vdiAyOSAxOTozNzo1NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46ICBNb3ZlIC1mbm8taW1wbGljaXQtdGVtcGxhdGUgZnJvbSBDWFhGTEFHUwotCXRvIExJQkNYWEZMQUdTLiAgVGVzdHMgYXJlIGJldHRlciBydW4gd2l0aG91dCBpdC4KLQotV2VkIE5vdiAyMyAxMDoyOToyNSAxOTk0ICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtaXNwZWxsKTogRGVwZW5kIG9uIGFsbC1lbWFjczE5IGluc3RlYWQgb2YgYWxsLWVtYWNzLgotCi1Nb24gTm92IDIxIDExOjE0OjAxIDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSopOiBEb24ndCBjb25maWd1cmUgeGliZXJ0eS4KLQotTW9uIE5vdiAxNCAwODo0OToxNSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZW1vdmUgdGsgZnJvbSBuYXRpdmVfb25seSBsaXN0LgotCi1GcmkgTm92IDExIDE1OjMxOjI2IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBBZGQgbWlwcy1uY2QtZWxmIHRhcmdldCB0byBzdW40IHRhcmdldHMKLQkgIGZvciBzcGVjaWFsIE5DRCBidWlsZC4KLQotTW9uIE5vdiAgNyAyMDo1ODoxNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogUmVtb3ZlIGNvbmZpZ3VyZS5iYXQgYW5kCi0JbWFrZWFsbC5iYXQsIHRoZXkncmUgb25seSB1c2VmdWwgZm9yIGJpbnV0aWxzIHNuYXBzaG90cy4KLQkoYmludXRpbHMudGFyLmd6LCBnYXMrYmludXRpbHMudGFyLmd6KTogQWRkIGNvbmZpZ3VyZS5iYXQgYW5kCi0JbWFrZWFsbC5iYXQgdG8gc3BlY2lmaWVkIFNVUFBPUlRfRklMRVMuCi0KLU1vbiBOb3YgIDcgMTc6MjU6MTggMTk5NCAgQmlsbCBDb3ggIChiaWxsQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBFcmljc3NvbiB0YXJnZXRzIHRvIHN1bjQgYW5kIHNvbGFyaXMKLQkgIGhvc3RzLiAgQWRkICBCTlIncyBzdW40IHRhcmdldCB0byBzb2xhcmlzIGhvc3QsIHNvIHRoZWlyCi0JICBidWlsZC1mcm9tLXNvdXJjZSB3aWxsIGJlIHRlc3RlZCBpbi1ob3VzZSBmaXJzdC4KLQotU2F0IE5vdiAgNSAxODo0MzozMCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQkNGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoTElCQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoTElCQ1hYRkxBR1MpOiBEaXR0by4KLQkoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDWFhGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgdGhlbS4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21bdGhdLSpwaWM6IFN1cHBvcnQgLS1lbmFibGUtc2hhcmVkLgotCi1TYXQgTm92ICA1IDE1OjQ0OjAwIDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogIEluY2x1ZGUgbGlic3RkYysrIGFnYWluLgotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGIChmb3IgRnJlZUJTRCkuCi0KLVRodSBOb3YgIDMgMTY6MzI6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEluY2x1ZGUgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdC4KLQkoRElTVERPQ0RJUlMpOiBBZGQgYGV0YycuCi0JKEVUQ19TVVBQT1JUX1BGWCk6IE5ldyB2YXJpYWJsZS4KLQkodGF6KTogSW5jbHVkZSBhbnl0aGluZyBmcm9tIGV0YyBzdGFydGluZyB3aXRoIGEgd29yZCBpbgotCUVUQ19TVVBQT1JUX1BGWC4KLQotV2VkIE9jdCAyNiAxNjoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFVwZGF0ZSBmb3IgcmVjZW50IEZTRiBjaGFuZ2VzLiAgUmVtb3ZlIG9ic29sZXRlCi0JaDgzMDBoZHMgZW50cnkuICBBZGQgLXdpbmRvd3MqIGFuZCAtb3N4IGFzIGJhc2ljIG9zLiAgTWlub3IKLQlzcGFjaW5nIGNoYW5nZXMuCi0KLVRodSBPY3QgMjAgMTg6NDE6NTYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiAgUmVtb3ZlIGxpYnN0ZGMrKyBmb3IgbGliZysrLTIuNi4xLgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRi4KLQkqIGNvbmZpZ3VyZS5pbjogIE1hdGNoIG9uIGk/ODYtbmNyLXN5c3Y0LjMsIG5vdCBpPzg2LW5jci1zeXN2NDMuCi0KLVRodSBPY3QgMjAgMTk6MjY6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTaW5jZSB0aGUgInRyYXAgMCIgaGFuZGxlciB3aWxsIG92ZXJyaWRlIHRoZSBleGl0Ci0Jc3RhdHVzIG9uIG1hbnkgc3lzdGVtcywgb25seSB1c2UgaXQgZm9yICJleGl0IDEiLCBhbmQgbWFrZSBpdCBzZXQKLQlhIG5vbi16ZXJvIGV4aXQgc3RhdHVzOyByZXNldCBpdCBiZWZvcmUgImV4aXQgMCIuICBBbHNvLCBjaGVjawotCWV4aXQgc3RhdHVzIG9mIGNvbmZpZy5zdWIsIGFuZCBlcnJvciBvdXQgaWYgaXQgZmFpbGVkLgotCi1XZWQgT2N0IDE5IDE4OjQ5OjU1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IChBTExfVEFSR0VUX01PRFVMRVMsSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgQnVpbGQKLQlhbmQgaW5zdGFsbCBsaWJnbG9zcy4KLQotVHVlIE9jdCAxOCAxNToyNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmludXRpbHMpOiBEZXBlbmQgdXBvbiBhbGwtYnlhY2MuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgZW1hY3Mgb24gSXJpeCA1LgotCi1Nb24gT2N0IDE3IDE2OjIyOjEyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSopOiBBZGQgbGliaW8uCi0KLVRodSBPY3QgMTMgMTU6NTE6MjAgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgbGlic3RkYysrLgotCShDSEVDS19UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKFRBUkdFVF9MSUJTKTogRGl0dG8uCi0JKGFsbC1saWJzdGRjKyspOiBOb3RlIGRlcGVuZGVuY2llcy4KLQotVGh1IE9jdCAxMyAwMTo0MzowOCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogQWRkIGdhcy4KLQotVHVlIE9jdCAxMSAxMjoxMjoyOSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogVXNlIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIGluc3RlYWQgb2YKLQktZmV4dGVybmFsLXRlbXBsYXRlcy4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IEFkZCBsaWJzdGRjKysuCi0JKG5vY29uZmlnZGlycyk6IEFkZCBsaWJzdGRjKysgYXMgYXBwcm9wcmlhdGUuCi0KLVRodSBPY3QgIDYgMTg6MDA6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFVwZGF0ZSBmcm9tIEZTRi4KLQotVHVlIE9jdCAgNCAxMjowNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgJHtjb25maWdzdWJ9LgotCi1Nb24gT2N0ICAzIDE0OjI4OjM0IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE5vIGxvbmdlciByZWNvZ25pemUgaDgzMDBoLgotCi1Nb24gT2N0ICAzIDEyOjQwOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIGV4dHJhbmVvdXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25maWcuc3ViIGFuZAotCWdjYy9jb25maWcuc3ViLgotCi1TYXQgT2N0ICAxIDAwOjIzOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkZESVJTKTogQWRkIGdhcy4KLQotVGh1IFNlcCAyMiAxOTowNDo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLk5FV0xJQjogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTkgMTg6MjU6NDAgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoSFAtVVgpOiAgUGF0Y2ggZnJvbSBIYXJsYW4gU3Rlbm4KLQk8aGFybGFuQGxhbmRtYXJrLmNvbT4gdG8gYWxzbyBlbWl0IHJlbGVhc2UgbGV2ZWwuCi0KLVdlZCBTZXAgIDcgMTM6MTU6MjUgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKHN1bjQqOlN1bk9TOio6Kik6IENoYW5nZSAnLUpMJyB0byAnX0pMJy4KLQotVHVlIFNlcCAgNiAyMzoyMzoxOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIE1lcmdlIG5leHRzdGVwIGNsZWFudXAgZnJvbSBGU0YuCi0KLU1vbiBTZXAgIDUgMDU6MDE6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotKik6IERvbid0IGNvbmZpZ3VyZSBsZCBmb3IgdGhpcyB0YXJnZXQuCi0KLVRodSBTZXAgIDEgMDk6MzU6MDAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKTogZG9uJ3QgY29uZmlndXJlIGxpYmcrKywgbGliaW8sCi0JICBsaWJyeCwgb3IgbmV3bGliLgotCi1XZWQgQXVnIDMxIDEzOjUyOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS1kZWMtb3NmKik6IFVzZSBvc2YqLCBub3Qgb3NmMSouICBEb24ndAotCWNvbmZpZ3VyZSBsZC0taXQgd29ya3MsIGJ1dCBpdCBkb2Vzbid0IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLQotU3VuIEF1ZyAyOCAxODoxMzo0NSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzICgqLXVua25vd24tZnJlZWJzZCopOiAgR2V0IHJpZCBvZiBwb3NzaWJsZQotCXRyYWlsaW5nICIoUmVsZWFzZSkiIGluIHZlcnNpb24gc3RyaW5nLgotCVBhdGNoIGZyb20gUGF1bCBSaWNoYXJkcyA8cGF1bEBpc2wuY2YuYWMudWs+LgotCi1TYXQgQXVnIDI3IDE1OjAwOjQ5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBGaXggaTQ4Ni1uY3Itc3lzdjQzIC0+IGk0ODYtbmNyLXN5c3Y0LjMuCi0JRml4IHR5cGU6ICotbmV4dC1uZXN0c3RlcCAtPiAqLW5leHQtbmV4dHN0ZXAuCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGOgotCi0JRnJpIEF1ZyAyNiAxODo0NToyNSAxOTk0ICBQaGlsaXBwZSBEZSBNdXl0ZXIgKHBoZG1AaW5mby51Y2wuYWMuYmUpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHBvd2VycGMtaWJtLWFpeDMuMi41LgotCi0JV2VkIEFwciAyMCAwNjozNjozMiAxOTk0ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIChwaGRtQGluZm8udWNsLmFjLmJlKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBVbml4V2FyZSAxLjEgKFVOQU1FX1NZU1RFTSBpcyBTWVNURU1fVgotCWluc3RlYWQgb2YgVU5JWF9TViBmb3IgVW5peFdhcmUgMS4wKS4KLQotU2F0IEF1ZyAyNyAwMTo1NjozMCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdkYik6ICBBZGQgZGVwZW5kZW5jaWVzIG9uIGFsbC1nY2MgYW5kIGFsbC1sZAotCXRvIG1ha2UgZ2RiL25sbS8qIGJ1aWxkIGFmdGVyIHRoZSBjb21waWxlciBhbmQgbGlua2VyLgotCi1GcmkgQXVnIDI2IDE0OjMwOjA1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKG5ldGJzZCwgZnJlZWJzZCwgbGludXgpOiAgQWNjZXB0IGFueSBtYWNoaW5lLAotCW5vdCBqdXN0IGlbMzRdODYuCi0JKG02OGstYXRhcmktc3lzdjQpOiAgUmVsb2NhdGUgdG8gbWF0Y2ggRlNGIHZlcnNpb24uCi0KLQkqIGNvbmZpZy5ndWVzczogIE1vcmUgbWVyZ2VzIGZyb20gdGhlIEZTRjoKLQotCUFkZCBhIHNwYWNlIGJlZm9yZSBmdW5jdGlvbiBjYWxsIG9yIG1hY3JvIGludm9jYXRpb24uCi0KLQlUdWUgTWF5IDEwIDE2OjUzOjU1IDE5OTQgIFJvbGFuZCBNY0dyYXRoIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgdHJhcCBjbWQgdG8gcmVtb3ZlIGR1bW15LmMgYW5kIGR1bW15IHdoZW4KLQlpbnRlcnJ1cHRlZC4KLQotCVdlZCBBcHIgMjAgMTg6MDc6MTMgMTk5NCAgUm9sYW5kIE1jR3JhdGggKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3MgKGR1bW15LmMpOiBSZWRpcmVjdCBzdGRlcnIgZm9yIGBob3N0aW5mbycgY29tbWFuZC4KLQkoZHVtbXkpOiBSZWRpcmVjdCBzdGRlcnIgZnJvbSBjb21waWxhdGlvbiBvZiBkdW1teS5jLgotCi0JU2F0IEFwciAgOSAxNDo1OToyOCAxOTk0ICBDaHJpc3RpYW4gS3JhbnogIChrcmFuekBzZW50NS51bmktZHVpc2J1cmcuZGUpCi0KLQkqIGNvbmZpZy5ndWVzczogRGlzdGluZ3Vpc2ggYmV0d2VlbiBOZVhUU3RlcCAyLjEgYW5kIDMueC4KLQotRnJpIEF1ZyAyNiAxMzo0MjoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWNjZXB0IGFuZCBpZ25vcmUgLS1jYWNoZSosIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLQluZXcgYXV0b2NvbmYuCi0KLUZyaSBBdWcgMjYgMTM6MDU6MjcgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGOgotCi0JVGh1IEF1ZyAyNSAyMDoyODo1MSAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQG1vbGUuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoUHlyYW1pZCo6T1N4KjoqOiopOiBOZXcgY2FzZS4KLSAgICAgICAgKFBBVEgpOiBBZGQgLy5hdHRiaW4gYXQgZW5kIGZvciBmaW5kaW5nIHVuYW1lLgotICAgICAgICAoZHVtbXkuYyk6IEhhbmRsZSBpODYwLWFsbGlhbnQtYnNkLiAgRm9sbG93IHdoaXRlc3BhY2UgY29udmVudGlvbnMuCi0KLQlXZWQgQXVnIDE3IDE4OjIxOjAyIDE5OTQgIFRvciBFZ2dlICAodGVnZ2VAcHZ2LnVuaXQubm8pCi0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3MgKE04OCo6RG9scGhpbk9TOio6Kik6IE5ldyBjYXNlLgotCi0JVGh1IEF1ZyAxMSAxNzowMDoxMyAxOTk0ICBTdGFuIENveCAgKGNveHNAZGctcnRwLmRnLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogVXNlIFRBUkdFVF9CSU5BUllfSU5URVJGQUNFCi0gICAgICAgIHRvIHNlbGVjdCB3aGV0aGVyIHRvIHVzZSBFTEYgb3IgQ09GRi4KLQotCVN1biBKdWwgMjQgMTY6MjA6NTMgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgPHJtc0Btb2xlLmdudS5haS5taXQuZWR1PgotCi0gICAgICAgICogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTg2MC1zdGFyZGVudC1zeXN2IGFuZCBpODYwLXVua25vd24tc3lzdi4KLQotCVN1biBNYXkgIDEgMTA6MjM6MTAgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzIHRoZSBPUyB2ZXJzaW9uIGZvciBIUFVYLgotCi0JVHVlIE1hciAgMSAyMTo1MzowMyAxOTk0ICBLYXJsIEhldWVyICAoa3d6aEBoYWwuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzcyAoVU5BTUVfVkVSU0lPTik6IFJlY29nbml6ZSBhaXgzLjIuNCBhbmQgYWl4My4yLjUuCi0KLUZyaSBBdWcgMjYgMTE6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSAtLXdpdGgtaGVhZGVycywgLS13aXRoLWxpYnMsIGFuZAotCS0td2l0aG91dC1uZXdsaWIuCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBhbGwtbGQuCi0KLVdlZCBBdWcgMjQgMTI6MzY6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1Nb24gQXVnIDIyIDEwOjU4OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh2ZXJzaW9uKTogQSBmZXcgbW9yZSB0d2Vha3MgdG8gaGVscCBtZXNzYWdlLgotCi1GcmkgQXVnIDE5IDEyOjQwOjI1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAoZm9yIG5vdykgbGlicnggYXMgYSBob3N0IGxpYnJhcnksCi0Jbm93IHRoYXQgd2UncmUgYnVpbGRpbmcgaXQgZm9yIHRhcmdldC4KLQotRnJpIEF1ZyAxOSAxMDo0OToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogRml4IHVwIGhlbHAgbWVzc2FnZTsgZnJvbSBrYXJsQG93bC5ocS5pbGVhZi5jb20KLQkoS2FybCBCZXJyeSkuCi0KLVR1ZSBBdWcgMTYgMTY6MTE6MDggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFsc28gY29uZmlndXJlIGxpYnJ4LgotCi1Nb24gQXVnIDE1IDE2OjUxOjQ1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB2YXJpb3VzIHJ1bGVzIHRvIHJlZmxlY3QgdGhhdCBsaWJyeAotCWlzIG5vdyBuZWVkZWQgZm9yIGxpYmcrKy4KLQotRnJpIEF1ZyAxMiAxODowNzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBtaXBzNjRvcmlvbiBhbmQgbWlwczY0b3Jpb25lbCBhcyBhIENQVSBuYW1lLgotCi1Nb24gQXVnICA4IDExOjM2OjE3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KLQotVGh1IEF1ZyAgNCAxNjoxMjozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU2ltcGxpZnkgSnVuIDIgMTk5NCBjaGFuZ2UuCi0KLVdlZCBBdWcgIDMgMDQ6NTg6MTYgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjaGFuZ2UgQ0MgdG8gL3Vzci9sYXRlc3QvYmluL2djYyBmb3IgbHlueCBob3N0IGJ1aWxkcywgc2luY2UKLQkvYmluL2djYyBpc24ndCBnb29kIGVub3VnaCB0byBidWlsZCBnY2MuCi0KLVdlZCBKdWwgMjcgMDk6MDc6MTQgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9GSUxFUyk6IFJlbW92ZQotCShzZXR1cC1kaXJzLWdkYiwgZ2RiLnRhci5neiwgbWFrZS1nZGIudGFyLmd6KTogIFJlbW92ZSBvbGQgcnVsZXMuCi0JKGdkYi50YXIuZ3opOiBBZGQgbmV3IHJ1bGUgdG8gdXNlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBidWlsZGluZwotCW1lY2hhbmlzbS4KLQotTW9uIEp1bCAyNSAxMToxMDowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBhYm91dCB1c2Ugb2YgL3Vzci91Y2IvY2Mgb24gU29sYXJpcy4gIEZyb20KLQlCaWxsIENveCA8YmlsbEBjeWdudXMuY29tPi4KLQotU2F0IEp1bCAyMyAxMjoxOTo0NiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIElTQy4gIFBhdGNoIGZyb20ga3d6aEBnbnUuYWkubWl0LmVkdS4KLQotRnJpIEp1bCAyMiAxNzo1Mzo1OSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBTZWFyY2ggY3VycmVudCBkaXIgZmlyc3QgaW4gLmdkYmluaXQuCi0KLUZyaSBKdWwgMjIgMTE6Mjg6MzAgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZWNvZ25pemUgZnJlZWJzZCAobWVyZ2VkIGZyb20gZ2NjIGNvbmZpZy5zdWIpLgotCi1UaHUgSnVsIDIxIDE0OjEwOjUyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgUmVmZXIgdG8gTmVYVCdzIG9wZXJhdGluZyBzeXN0ZW0gYXMgbmV4dHN0ZXAuCi0KLQkqIGNvbmZpZy5zdWIgKGNhc2UgJGJhc2ljX21hY2hpbmUpOiAgUmUtb3JkZXIgdGhlIGNhc2VzLCB0byBtYXRjaAotCXRoZSBvcmRlciBpbiB0aGUgRlNGIHZlcnNpb24gKHdoaWNoIGlzIG1vc3RseSBhbHBoYWJldGhpY2FsKS4KLQlNZXJnZSBpbiBzb21lIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyBmcm9tIHRoZSBGU0YuCi0KLVNhdCBKdWwgMTYgMTI6MDM6MDggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtNjhrLWF0YXJpLXN5c3Y0IGFuZCBtODhrLWhhcnJpcy1jc3V4Ny4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjeHV4Ny4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLWN4dXggZm9yIG04OGstaGFycmlzLWN4dXgqLgotCi1Nb24gSnVsIDExIDE0OjM3OjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgRml4IHR5cG8gcG93ZXJwYyAtPiBwb3dlcnBjLSouCi0KLVNhdCBKdWwgIDkgMTM6MDM6NDMgMTk5NCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBibHVlcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYGFsbC1lbWFjczE5JyBkZXBlbmRzIG9uIGBhbGwtYnlhY2MnLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1lbWFjczE5IGFuZCBpbnN0YWxsLWVtYWNzMTkgcnVsZXMgKGluCi0JcGFyYWxsZWwgd2l0aCBhbGwtZW1hY3MgYW5kIGluc3RhbGwtZW1hY3MpLiAgVG9wLWxldmVsIGNvbW1hbmQKLQlgbWFrZSBhbGwtZW1hY3MxOSBDQz1nY2MnIG5vdyBiZWhhdmVzIGFzIGBtYWtlIGFsbC1lbWFjcyBDQz1nY2MnLgotCi1UaHUgSnVuIDMwIDE2OjUzOjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoJChob3N0KS1zdGFtcC1zdGFnZTItaW5zdGFsbGVkKTogUmVtb3ZlCi0JJChyZWxiaW5kaXIpL21ha2UgYmVmb3JlIGRvaW5nIGBgbWFrZSBpbnN0YWxsJycsIGFuZCB1c2UKLQkkKEdOVV9NQUtFKSB3aGlsZSBkb2luZyBpdC4gIEF2b2lkcyBwcm9ibGVtIG9uIFN1bk9TIHdpdGgKLQlpbnN0YWxsaW5nIG92ZXIgcnVubmluZyBtYWtlIGJpbmFyeS4KLQkoJChob3N0KS1zdGFtcC1zdGFnZTMtaW5zdGFsbGVkKTogTGlrZXdpc2UuCi0KLVR1ZSBKdW4gMjggMTM6NDM6MjUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE1hY2guCi0KLU1vbiBKdW4gMjcgMTY6NDE6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoZWNrICR7ZXhlY19wcmVmaXhvcHRpb259LCBub3QgJHtleGVjX3ByZWZpeH0sIHRvCi0Jc2VlIHdoZXRoZXIgLS1leGVjLXByZWZpeCB3YXMgdXNlZC4KLQotU3VuIEp1biAyNiAyMToxNTo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgRXhwbGljaXRseSBtZW50aW9uIGxpYmcrKy9SRUFETUUuICAoWm9vJ3MgaWRlYS4pCi0KLVR1ZSBKdW4gMjEgMTI6NDU6NTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWxpYnJ4IHRhcmdldCBzaW1pbGFyIHRvIGFsbC1saWJwcm9jLgotCi1XZWQgSnVuICA4IDIzOjExOjU1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlYXJyYW5nZSB0ZXN0cyBmb3IgQWxwaGEtT1NGMSB0byBwcm9wZXJseSBkZWFsCi0Jd2l0aCBwb3N0IDEuMiB1bmFtZSBib2dvc2l0eS4KLQotVGh1IEp1biAgOSAwMDoyNzo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyBvbiByZWNlaXB0IG9mIGEgc2lnbmFsLgotCi1UdWUgSnVuICA3IDEyOjA2OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiB0aGVyZSBpcyBhIHBhY2thZ2VfbWFrZWZpbGVfZnJhZywgcmVtb3ZlCi0JJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBhZnRlciBjb3B5aW5nIGl0IGluLgotCi1Nb24gSnVuICA2IDIxOjM1OjAyIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYnVpbGRfYWxsLm1rOiBzdXBwb3J0IHJzNjAwMCBseW54IGlkZW50aWZpZXMgaXRzZWxmIGFzCi0JcnM2MDAwLWx5bngtbHlueG9zMi4yLjIuICBBbHNvLCB1c2UgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCXNpbmNlIC9iaW4vZ2NjIGlzIHRvbyBmZWVibGUgdG8gY29tcGlsZSBhIG1vZGVybiBnY2MuCi0KLU1vbiBKdW4gIDYgMTY6MDY6MzQgMTk5NCAgS2FyZW4gQ2hyaXN0aWFuc2VuIChrYXJlbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYnJvdWdodCBkZXZvL3Rlc3QtYnVpbGQubWsgdXBkYXRlLXRvLWRhdGUgd2l0aCBwcm9ncmVzc2l2ZS8KLQkgIHRlc3QtYnVpbGQubWsuIEFkZCBseW54IHRhcmdldHMgYW5kIGhwcGEgZmxhZyBpbmZvLgotCi1TYXQgSnVuICA0IDE3OjIzOjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbWgtbmNyc3ZyNDMuICBQYXRjaCBmcm9tCi0JVG9tIE1jQ29ubmVsbCA8dG1jY29ubmVAc2Vkb25hLmludGVsLmNvbT4uCi0KLUZyaSBKdW4gIDMgMTc6NDc6MjQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni11bmtub3duLWJzZGkpOiAgTm8gbG9uZ2VyIG5lZWQgdG8KLQljaGVjayAjaWYgZGVmaW5lZChfX2JzZGlfXykgJiYgZGVmaW5lZChfX2kzODZfXykuCi0KLVRodSBKdW4gIDIgMTg6NTY6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFNldCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uIGNvcnJlY3RseS4KLQotVGh1IEp1biAgMiAxMDo1NzowNiAxOTk0ICBLYXJlbiBDaHJpc3RpYW5zZW4gKGthcmVuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBicm91Z2h0IGJ1aWxkLWFsbC5tayB1cGRhdGUtdG8tZGF0ZSB3aXRoIHByb2dyZXNzaXZlIGJ1aWxkLWFsbC5taywKLQkgIGFkZGVkIG5ldyB0YXJnZXRzIGFuZCBocHBhIGluZm8uCi0JCi1UaHUgSnVuICAyIDAwOjEyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiBjb25maWcuZ3Vlc3MgcmVzdWx0IGlzIGEgcHJlZml4IG9mIHRoZSB1c2VyCi0Jc3BlY2lmaWVkIHRhcmdldCwgYXNzdW1lIGEgbmF0aXZlIGJ1aWxkIGFuZCB1c2UgdGhlIHVzZXIgc3BlY2lmaWVkCi0JdGFyZ2V0IGFzIHRoZSBob3N0IGFsaWFzLiAgUmVtb3ZlIFN1bk9TIHBhdGNoIHN1ZmZpeCByZW1vdmFsIGhhY2suCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBTdW5PUyBwYXRjaCBzdWZmaXggcmVtb3ZhbCBoYWNrLgotCi0JKiBNYWtlZmlsZS5pbiAoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IFJlbW92ZSBjaGVjay1mbGV4LCBzaW5jZSBpdCdzCi0JaW4gTkFUSVZFX0NIRUNLX01PRFVMRVMuCi0KLVdlZCBKdW4gIDEgMTA6NDk6NDEgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVuYW1lIEhPU1RfT05MWSB0byBOQVRJVkUuCi0JKiBjb25maWd1cmU6IERlbGV0ZSBTdW5PcyBwYXRjaCBzdWZmaXggZnJvbSBob3N0X2Nhbm9uaWNhbAotCSAgYW5kIGJ1aWxkX2Nhbm9uaWNhbCB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlcGVuZGVkIHRvIE1ha2VmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnRzIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UuCi0KLVR1ZSBNYXkgMzEgMTk6Mzk6NDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWxpYnByb2MgdGFyZ2V0IHNpbWlsYXIgdG8gYWxsLWd1aS4KLQotVHVlIE1heSAzMSAxNzoxNjozMyAxOTk0ICBUb20gTG9yZCAgKGxvcmRAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENIRUNLX01PRFVMRVMpOiBzcGxpdCBpbnRvCi0JSE9TVF9PTkxZX0NIRUNLX01PRFVMRVMgYW5kIENST1NTX0NIRUNLX01PRFVMRVMuCi0KLVR1ZSBNYXkgMzEgMTY6MzY6MzYgMTk5NCAgUGF1bCBFZ2dlcnQgIChlZ2dlcnRAdHdpbnN1bi5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni11bmtub3duLWJzZGkpOiBOZXcgc3lzdGVtIHRvIGd1ZXNzLgotCi1XZWQgTWF5IDI1IDE2OjQ3OjEwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1ndWkgdGFyZ2V0IChidXQgbm90IHlldCBidWlsZCBieSAiYWxsIikuCi0KLVRodSBNYXkgMjYgMDg6NTM6MTkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBNb3ZlIGRlbGV0aW9uIG9mIHBhdGNoIHN1ZmZpeCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZ3VyZS5pbjogVG8gaGVyZSwgYXQgSWFuJ3Mgc3VnZ2VzdGlvbi4gIFRoZSB0b3AtCi0JICBsZXZlbCBzY3JpcHRzIG1pZ2h0IG5lZWQgdG8ga25vdyBvZiBhIHBhdGNoIGxldmVsLgotCi1XZWQgTWF5IDI1IDA5OjE1OjU0IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogU3RyaXAgb2ZmIHBhdGNoIHN1ZmZpeCBzbyBydGwgaXMgcmVjb2duaXplZAotCSAgYXMgYSBzdW5vczQuMS4zIG1hY2hpbmUsIGV2ZW4gdGhvdWdoIGl0J3MgYmVlbiBwYXRjaGVkLgotCi1GcmkgTWF5IDIwIDA4OjI1OjQ5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0xBU1QpOiBEZWxldGUuCi0JKElOU1RBTExfRE9TUkVMKTogTmV3LgotCi1UaHUgTWF5IDE5IDE3OjEyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgbGQgZm9yIGlbMzRdODYtKi1zeXN2NCogYW5kIHNwYXJjLSotc29sYXJpczIqLgotCURvbid0IHNldCB1c2VfZ251X2xkIHRvIG5vIGZvciAqLSotc3lzdjQ7IHRoYXQgb25seSBjb250cm9scwotCXdoZXRoZXIgd2UgcGFzcyBkb3duIC0td2l0aC1nbnUtbGQgYW55aG93LgotCi1UaHUgTWF5IDE5IDA5OjI5OjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0xBU1QpOiBDaGFuZ2Ugb3BlcmF0aW9uIHNvIGl0IHdvcmtzCi0Jb24gbW9yZSBmbGF2b3JzIG9mIG1ha2UuCi0JKiBjb25maWd1cmUuaW4gKGdvMzIpOiBEb24ndCBidWlsZCBsaWJnKysgb3IgbGliaW8uCi0KLUZyaSBNYXkgMTMgMTM6Mjg6MzQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1vdmUgSE9TVF9QUkVGSVhfMSBhbmQgZnJpZW5kcyB1cCBzbwotCXRoZXkgY2FuIGJlIG92ZXJyaWRlbiBieSB0ZW1wbGF0ZXMuCi0KLVNhdCBNYXkgIDcgMTY6NDY6NDQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQ9PWdvMzIpOiBEb24ndCBidWlsZCBnZGIuCi0JKiBkb3NyZWw6IE5ldyBkaXJlY3RvcnkuCi0KLUZyaSBNYXkgIDYgMTQ6MTk6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogQ29uZmlndXJlIGRvc3JlbCB0b28uCi0JKiBNYWtlZmlsZS5pbiAoSU5UQUxMX1RBUkdFVCk6IENhbGwgSU5TVEFMTF9MQVNUIGxhc3QuCi0JKEhPU1RfQ0MsIEhPU1RfUFJFRklYLCBIT1NUX1BSRUZJWF8xKTogVW5kZWZpbmUsIHRoZXkgc2hvdWxkCi0JYmUgc2V0IGJ5IGluY29taW5nIG5hbWVzIG9yIHRlbXBsYXRlcy4KLQkoSU5TVEFMTF9MQVNUKTogTmV3IHJ1bGUuCi0JKiBjb25maWcvbWgtZ28zMjogTmV3IGZyYWdtZW50LgotCi1UaHUgTWF5ICA1IDE3OjM1OjA1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoc3BhcmNsaXRlZnJ3LCBzcGFyY2xpdGVmcndjb21wYXQpOiBEb24ndCBzZXQgdGhlIG9zLgotCi1UaHUgTWF5ICA1IDIwOjA2OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1seW54cnM2azogUmVuYW1lZCBmcm9tIG1oLWx5bnhvc3JzNmssIHRvIG1ha2UgaXQKLQl1bmlxdWUgaW4gOC4zIG5hbWluZyBzY2hlbWVzLgotCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogTmV3IHZhcmlhYmxlLiAgQ3VycmVudGx5IGVtcHR5LCBidXQgd2lsbAotCWJlIHVzZWQgaW4gZ2FzIGRpc3RyaWJ1dGlvbi4gIElmIG5vbmVtcHR5LCBsaXN0cyBhIHNldCBvZgotCWRpcmVjdG9yaWVzIGF0IGxlYXN0IG9uZSBvZiB3aGljaCBtdXN0IGdldCBjb25maWd1cmVkLCBvciB0b3AKLQlsZXZlbCBjb25maWd1cmF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBmYWlsZWQuCi0JKHJzNjAwMC0qLWx5bnhvcyopOiBVc2UgbmV3IGZpbGUgbmFtZS4KLQotVGh1IE1heSAgNSAxMzozODozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlFbGltaW5hdGUgWFRSQUZMQUdTLgotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBJZiBuZXdsaWIgZXhpc3RzLCByZWZlciB0byB0aGUKLQluZXdsaWIgaW5jbHVkZSBmaWxlcyB1c2luZyAtaWRpcmFmdGVyLCBhbmQgYWxzbyB1c2UgLW5vc3RkaW5jLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCShYVFJBRkxBR1MpOiBSZW1vdmVkLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgWFRSQUZMQUdTX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBSZW1vdmUgWFRSQUZMQUdTLgotCShFWFRSQV9UQVJHRVRfRkxBR1MsIEVYVFJBX0dDQ19GTEFHUyk6IExpa2V3aXNlLgotCSgkKERPX1gpKTogRG9uJ3QgcGFzcyBkb3duIFhUUkFGTEFHUy4KLQotVGh1IE1heSAgNSAwMDoxNjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzKi1kZWMtYnNkKik6IE5ldyB0YXJnZXQ7IGRvIGJ1aWxkIGxpbmtlci4KLQkobWlwcyotKi1ic2QqKTogTmV3IHRhcmdldDsgZG9uJ3QgYnVpbGQgbGlua2VyLgotCi1XZWQgTWF5ICA0IDIwOjEwOjEwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBzdXBwb3J0IHJzNjAwMC0qLWx5bnhvcyogY29uZmlndXJhdGlvbi4KLQlzdXBwb3J0IHN1bm9zNCBhcyBhIGNyb3NzIHRhcmdldC4KLQotCSogY29uZmlnLnN1YjogbG9vayBmb3IgbHlueCosIG5vdCBseW54IHNpbmNlIHRoZSBPUyB2ZXJzaW9uIG1heQotCWxlZ2l0aW1hdGVseSBiZSBwYXJ0IG9mIHRoZSBuYW1lLgotCi1UdWUgTWF5ICAzIDIxOjQ4OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbyopOiBNb3ZlIHRvIGJlIHdpdGggb3RoZXIgaTM4NgotCXRhcmdldHMuCi0JKHJvbXAtKi0qKTogTmV3IHRhcmdldC4gIFNraXAgdmFyaW91cyBiaW5hcnkgdXRpbGl0aWVzLgotCSh2YXgtKi0qKTogTmV3IHRhcmdldC4gIERvbid0IGJ1aWxkIG5ld2xpYi4KLQkodmF4LSotdm1zKTogUmVuYW1lZCBmcm9tICotKi12bXMuICBEb24ndCBidWlsZCBvcGNvZGVzIG9yIG5ld2xpYi4KLQotVGh1IEFwciAyOCAxNTowMzowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBzZXQgaG9zdF9tYWtlZmlsZV9mcmFnIGlmIGNvbmZpZwotCWRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBBcHIgMjcgMTI6MTQ6MzAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBJZiAkZHN0ZGlyIGV4aXN0cywgZG9uJ3QgY2hlY2sgd2hldGhlciBlYWNoCi0JY29tcG9uZW50IGRvZXMuCi0KLVR1ZSBBcHIgMjYgMTg6MTE6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZCBzbGVlcDsgdXNlZCBieSByY3Mvc3JjL2NvbmYuc2guCi0KLU1vbiBBcHIgMjUgMTU6MDY6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0gCSogY29uZmlndXJlLmluICgqLSotbHlueG9zKik6IERvbid0IGNvbmZpZ3VyZSBuZXdsaWIgZm9yIGVpdGhlcgotIAluYXRpdmUgb3IgY3Jvc3MgTHlueC4KLQotU2F0IEFwciAxNiAxMTo1ODoxNiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChzcGFyYzY0LWVsZik6IEZpeCBvcy4KLQkoejhrKTogUmVtb3ZlIGR1cGxpY2F0ZS4KLQotVGh1IEFwciAxNCAyMzozMzoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IFRvdWNoIGdjYy9pbmNsdWRlL2ZpeGVkLCBub3QKLQlnY2Mvc3RtcC1maXhwcm90bywgdG8gdHJ5IHRvIHByZXZlbnQgZml4cHJvdG8gZnJvbSBiZWluZyBydW4uCi0KLVdlZCBBcHIgMTMgMTU6MTQ6NTIgMTk5NCAgQmlsbCBDb3ggIChiaWxsQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTWFrZSBmaWxlIGxpbmtzIGNsZWFubHkgZXZlbiBpZiBMeW54IGZhaWxzIG9uCi0gICAgICAgICAgYW4gTkZTIHN5bWxpbmsgKGF0IGxlYXN0IGZhaWwgY2xlYW5seSkuCi0KLU1vbiBBcHIgMTEgMTA6NTg6NTYgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChDQyk6IEZvciBtaXBzLXNnaS1pcml4NCwgY2hhbmdlIC1YTmgxNTAwIHRvCi0JLVhOaDIwMDAuCi0KLVNhdCBBcHIgIDkgMTU6MTA6NDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFVua25vd24gb3B0aW9ucyBhcmUgZmF0YWwgYWdhaW4uCi0KLUZyaSBBcHIgIDggMTI6MDE6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSWdub3JlIC0teC1pbmNsdWRlcyBhbmQgLS14LWxpYnJhcmllcywgZm9yIEF1dG9jb25mCi0JY29tcGF0aWJpbGl0eS4gCi0KLVRodSBBcHIgIDcgMTc6MzE6NDMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBBZGQgYGNsZWFuJyB0YXJnZXQuCi0KLVdlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBBZGQgU0lOSVggc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCi0KLU1vbiBBcHIgIDQgMTc6NDE6NDQgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBEb2N1bWVudCBhbGwgdXNlZnVsIHRhcmdldHMuCi0JSWYgY2Fub25ob3N0IGlzIHNwYXJjLXN1bi1zb2xhcmlzMi4zLCBjaGFuZ2UgaXQgdG8gc3BhcmMtc3VuLXNvbGFyaXMyLgotCUlmIGNhbm9uaG9zdCBpcyBtaXBzLXNnaS1pcml4NC4wLjVILCBjaGFuZ2UgaXQgdG8gbWlwcy1zZ2ktaXJpeDQuCi0KLVRodSBNYXIgMzEgMDQ6NTU6NTcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFN1cHBvcnQgLS1zaWxlbnQsIC0tcXVpZXQuCi0KLVdlZCBNYXIgMzAgMjE6Mzc6MzggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFN1cHBvcnQgLS1kaXNhYmxlLUZFQVRVUkUuCi0KLVR1ZSBNYXIgMjkgMTk6MTU6MDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE5DUiBydW5uaW5nIFNWUjQuMy4KLQotTW9uIE1hciAyOCAxNDo1NToxNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWFrZSBCU0RJIGdlbmVyYXRlIGkzODYtdW5rbm93bi1ic2QzODYuCi0JUGF0Y2ggZnJvbSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4KLQotTW9uIE1hciAyOCAxMjo1NDo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWFpeCopOiBUcmVhdCBsaWtlIHJzNjAwMC0qLSouCi0KLVNhdCBNYXIgMjYgMTE6MjU6NDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IE1ha2UgdW5yZWNvZ25pemVkIG9wdGlvbnMgZ2l2ZSBub25mYXRhbCB3YXJuaW5ncwotCWluc3RlYWQgb2YgZmF0YWwgZXJyb3JzLCBhbmQgcGFzcyB0aGVtIHRvIGFueSBzdWJkaXJlY3RvcnkKLQljb25maWd1cmVzIGluIGNhc2UgdGhleSByZWNvZ25pemUgdGhlbS4KLQlNYWtlIC0teCBlcXVpdmFsZW50IHRvIC0td2l0aC14LgotCi1GcmkgTWFyIDI1IDIxOjUyOjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBZGQgLS1lbmFibGUtKiBvcHRpb25zLiAgQ2xlYW4gdXAgdXNhZ2UgbWVzc2FnZSBhbmQKLQlzb21lIGNvbW1lbnRzLgotCi1UaHUgTWFyIDI0IDA5OjEyOjUzIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogQnVpbGQgdHJlZSB2ZXJzaW9uIGlzIG5vdyBubS5uZXcuCi0KLVN1biBNYXIgMjAgMTE6Mjg6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogRW5hYmxlIGJpbnV0aWxzLgotCi1TYXQgTWFyIDE5IDExOjUwOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgY2lzY28uCi0KLUZyaSBNYXIgMTggMTY6NDI6MzIgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IEFkZCAtZmV4dGVybmFsLXRlbXBsYXRlcy4KLQotVHVlIE1hciAxNSAxMToyNTo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhYm91dCB0YXJnZXQgKi1oaXRhY2hpLWhpdXh3ZTIsIGRvbid0IHByaW50IG1vcmUKLQl0aGFuIG9uZSBjb25maWd1cmF0aW9uIG5hbWUuICBBZGQgY29tbWVudC4KLQotU3VuIE1hciAgNiAyMzoxMzozOCAxOTk0ICBIaXNhc2hpIE1JTkFNSU5PICAobWluYW1pbm9Ac3JhLmNvLmpwKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFib3V0IHRhcmdldCAqLWhpdGFjaGktaGl1eHdlMiwgZml4ZWQKLQltYWNoaW5lIGd1ZXNzaW5nIG9yZGVyLiAgW0hpdGFjaGkncyBDUFVfSVNfSFBfTUM2OEsKLQltYWNybyBpcyBpbmNvcnJlY3QuXQotCi1TdW4gTWFyIDEzIDA5OjEwOjA4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IEp1c3QgYnVpbGQgVEFHUyBpbiBlYWNoIHN1YmRpcmVjdG9yeSwgcmF0aGVyCi0JdGhhbiB0aGUgIm1ha2UgbHMiIHN0dWZmIHdoaWNoIHVzZWQgdG8gYmUgaGVyZS4KLQotRnJpIE1hciAxMSAxMjo1MjozOSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGlbMzRdODYtdW5rbm93bi1mcmVlYnNkLgotCUZyb20gU2hhd24gTSBDYXJleSA8c21jYXJleUByb2Rhbi5zeXIuZWR1Pi4KLQotVGh1IE1hciAgMyAxNDoyNDoyMSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMgZm9yIGFscGhhKTogUmVtb3ZlIGxpYmcrKyBhbmQgbGliaW8uCi0KLVdlZCBNYXIgIDIgMTM6Mjg6NDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQ2hlY2sgZm9yIHB0eC4KLQotTW9uIEZlYiAyOCAxNjo0Njo1MCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBZGQgb3M5ayBjaGVja2luZy4KLQotVGh1IEZlYiAyNCAwNzowOTowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBIYW5kbGUgT1NGMSBydW5uaW5nIG9uIEhQUEEgcHJvY2Vzc29ycwotCi1GcmkgRmViIDE4IDE0OjE0OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiBzdWJkaXIgY29uZmlndXJlIGZhaWxzLCBwcmludCBvdXQgYSBtZXNzYWdlIHdpdGgKLQlzdWJkaXJlY3RvcnkgbmFtZSwgaW4gY2FzZSBzdWJkaXIncyBjb25maWd1cmUgY29kZSBkaWRuJ3QgaWRlbnRpZnkKLQlpdHNlbGYuCi0KLUZyaSBGZWIgMTggMTI6NTA6MTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBlbWJlZGRlZCBuZXdsaW5lcyBmcm9tIGNvbmZpZ2RpcnMuCi0JQXZvaWQgbWlzbWF0Y2hlcyBvZiBzdWJzdHJpbmdzLiAgRml4IG1hdGNoaW5nIHN0cmluZ3MgYXQgZW5kCi0Jb2YgY29uZmlnZGlycy4KLQotRnJpIEZlYiAxMSAxNTozMzozMyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBBZGQgTHlueC9yczYwMDAgY29uZmlnIHN1cHBvcnQuCi0KLVR1ZSBGZWIgIDggMTM6NDE6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YxKiwgYWxwaGEqLSotKik6IEJ1aWxkIGdhcy4KLQotTW9uIEZlYiAgNyAxNTo0MjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotb3NmKik6IFRyZWF0IHRoaXMganVzdCBsaWtlIG1vc3Qgb3RoZXIKLQlQQSBjb25maWd1cmF0aW9ucyAoZWcgbm8gYmludXRpbHMgb3IgbGQpLgotCShocHBhKi0qLSplbGYqKTogVGhlc2UgY29uZmlndXJhdGlvbnMgaGF2ZSBiaW51dGlscyBhbmQgbGQuCi0KLVN1biBGZWIgIDYgMTY6MzU6MDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5zdWIgKGhpdXgpOiBGaXggdHlwby4gIEZyb20gbS1rYXNhaHJAc3JhbWhjLnNyYS5jby5KUC4KLQotU2F0IEZlYiAgNSAwMTowMDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLSotKik6IEJ1aWxkIGdhcy4KLQotV2VkIEZlYiAgMiAxMzo1Nzo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluOiAgQXZvaWQgYnVnIGluIGxvc2luZyBocHV4IHNlZC4KLQotV2VkIEZlYiAgMiAxNDo1MzowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIHRlc3QtYnVpbGQubWs6IFJlbW92ZSBNVU5DSF9OTTsgaXQgd2FzIG9ubHkgbmVlZGVkCi0JZm9yIEdEQiBhbmQgR0RCIGhhcyBiZWVuIGZpeGVkIHRvIG5vdCBuZWVkIGl0LgotCi1Nb24gSmFuIDMxIDE4OjQwOjU1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1seW54b3NyczZrOiAgQWNjb3VudCBmb3IgbGFjayBvZiByYW5saWIhCi0KLVN1biBKYW4gMzAgMTc6NTg6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgdmF4IGhvc3RzLgotCi1GcmkgSmFuIDI4IDE1OjI5OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAod2hpbGUgbG9vcCk6IERvbid0IHVzZSAiYnJlYWsgMiIgaW5zaWRlIGNhc2UKLQlzdGF0ZW1lbnQgLS0gdGhlIGNhc2Ugc3RhdGVtZW50IGlzbid0IGFuIGVuY2xvc2luZyBsb29wLgotCi1Nb24gSmFuIDI0IDE4OjQwOjA2IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBDbGVhbiB1cCBOZVhUIHN1cHBvcnQsIHRvIGFsbG93IG5leHRzdGVwCi0Jb24gSW50ZWwgbWFjaGluZXMuICBNYWtlIE9TIGJlIG5leHRzdGVwLgotCi1TdW4gSmFuIDIzIDE4OjQ3OjIyIDE5OTQgIFJpY2hhcmQgS2VubmVyICAoa2VubmVyQHZsc2kxLnVsdHJhLm55dS5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIGFsdGVybmF0ZSBmb3JtcyBmb3IgQ29udmV4LgotCi1UaHUgSmFuIDIwIDE2OjEzOjQxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENvbXBsZXRlbHkgcmV3cml0ZSBvcHRpb24gcHJvY2Vzc2luZy4gIFRha2UKLQlhZHZhbnRhZ2Ugb2YgcGF0dGVybi1tYXRjaGluZyB0byBhdm9pZCBpbnZva2luZyB0ZXN0IGZyZXF1ZW50bHkuCi0JQWxzbyBjbGVhbiB1cCBob3N0IGFuZCB0YXJnZXQgZGVmYXVsdGluZyBsb2dpYy4KLQotTW9uIEphbiAxNyAxNTowNjo1NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBhbGwgb2NjdXJyYW5jZXMgb2YgInJvb3RtZSIgd2l0aCAiciIgYW5kCi0JIiQke3Jvb3RtZX0iIHdpdGggIiQkciIsIHRvIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIGRvLSoKLQljb21tYW5kcyAocGx1cyB1c2VyIGVudmlyb25tZW50KSB3aWxsIGZpdCBTQ08gbGltaXRzLgotCi1UaHUgSmFuICA2IDExOjIwOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBpc3N1ZSB3YXJuaW5ncyBhYm91dCBkaXJlY3RvcmllcyB3aGljaCBhcmUKLQlub3QgYmVpbmcgY29uZmlndXJlZCBpZiAtbm9yZWN1cnNpb24gaXMgc2V0LiAgQ29ycmVjdCB0ZXN0IGZvcgotCS0td2l0aC1nbnUtYXMgYW5kIC0td2l0aC1nbnUtbGQgdG8gbm90IGdldCBjb25mdXNlZCBieSBzdWJzdHJpbmcKLQltYXRjaGVzLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGdhcyBmb3IgYWxwaGEtZGVjLW9zZjEqLgotCi1UdWUgSmFuICA0IDE3OjEwOjE5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIEJhY2sgb3V0IFBlcidzIGNoYW5nZSBvZiAxMi8xOS8xOTkzLiAgSXQgY2hhbmdlcyB0aGUKLQliZWhhdmlvciBvZiBjb25maWd1cmUgaW4gdW5leHBlY3RlZCBhbmQgY29uZnVzaW5nIHdheXMuCi0KLQlBbHNvLCB1c2UgZGlmZmVyZW50IGRlbGltIGNoYXIgd2hlbiBjYWxjdWxhdGluZwotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUgc28gdGhhdCB0aGUgbmFtZSBjYW4gY29udGFpbiBzbGFzaGVzLgotCi1TYXQgSmFuICAxIDEzOjQ1OjMxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgVlNUYSBtaWNyby1rZXJuZWwuCi0KLVNhdCBEZWMgMjUgMjA6MDA6NDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogTnVrZSBoYWNrcyB3aGljaCB3ZXJlIHVzZWQgdG8gZ2V0IGEgc3BlY2lhbAotCXZlcnNpb24gb2YgR0FTIGZvciBIUFBBIGNvbmZpZ3VyYXRpb25zLgotCi1TdW4gRGVjIDE5IDIwOjQwOjQ0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBJZiBvbmx5ICR7dGFyZ2V0X2FsaWFzfSBpcyBnaXZlbiwgdXNlIHRoYXQKLQlhcyB0aGUgZGVmYXVsdCBmb3IgJHtob3N0X2FsaWFzfS4KLQkqIGNvbmZpZ3VyZTogIEFkZCBtaXNzaW5nIGJhY2stc2xhc2hlcyBiZWZvcmUgbmVzdGVkIHF1b3Rlcy4KLQotV2VkIERlYyAxNSAxODowNzoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBhZGQgWUFDQz0kKEJJU09OKQotCi1UdWUgRGVjIDE0IDIxOjI1OjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgc29tZSBUZWt0cm9uaXggY29uZmlndXJhdGlvbnMuCi0JRnJvbSBLYXZlaCBSLiBHaGF6aSA8Z2hhemlAbm9jLnJ1dGdlcnMuZWR1Pi4KLQotU2F0IERlYyAxMSAxMToxODowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogTWF0Y2ggYW55IGZsYXZvciBvZiBTSC4KLQotVGh1IERlYyAgMiAxNzoxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRyeSB0byBjb25maWd1cmUgbmV3bGliIGZvciBBbHBoYS4KLQotVGh1IERlYyAgMiAxNDozNTo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGQgZm9yIElyaXggNS4gIERvbid0IGJ1aWxkIGdhcywKLQlsaWJnKysgb3IgbGliaW8gZm9yIGFueSBBbHBoYSB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg1Kik6IE5ldyB0YXJnZXQ7IHVzZSBtaC1pcml4NS4KLQkqIGNvbmZpZy9taC1pcml4NS4gTmV3IGZpbGUgZm9yIElyaXggNS4KLQotV2VkIERlYyAgMSAxNzowMDozMyAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdaSVBQUk9HKTogUmVuYW1lZCBmcm9tIEdaSVAsIHdoaWNoIGd6aXAgdXNlcyBmb3IKLQlkZWZhdWx0IGFyZ3VtZW50cyAtLSBzbyBpdCB0cmllZCB0byBjb21wcmVzcyBpdHNlbGYuCi0KLVR1ZSBOb3YgMzAgMTM6NDU6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vdHN1cHApOiBlbnN1cmUgdGhhdCBhIHNwYWNlIGlzIGFsd2F5cyBhdCB0aGUgZW5kCi0JICBvZiB0aGUgY29uZmlnZGlycyBsaXN0LCBzaW5jZSB0aGUgZ3JlcCBjaGVja3MgZm9yIGFuIGV4cGxpY2l0IHNwYWNlCi0KLVR1ZSBOb3YgMTYgMTU6MDQ6MjcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBpMzg2LXN5c3Y0LjIpOiBkb24ndCBidWlsZCBsZCwgc2luY2Ugc3RhdGljCi0JICB2ZXJzaW9ucyBvZiBtYW55IGxpYnJhcmllcyBhcmUgbm90IGF2YWlsYWJsZS4KLQotVHVlIE5vdiAxNiAxNDoyODoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgQXBvbGxvcyAodXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzKS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxkLCBiaW51dGlscywgb3IgZ3Byb2YgZm9yIEFwb2xsby4KLQotVGh1IE5vdiAxMSAxMjowMzo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgU29ueSBuZXdzIG1pcHMgcnVubmluZyBuZXdzb3MuCi0KLVdlZCBOb3YgMTAgMTY6NTc6MDAgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1jeWdudXMsIGJ1aWxkLWN5Z251cyk6ICJmaSBlbHNlIiBuZWVkcyB0byBiZQotCSJmaSA7IGVsc2UiIGZvciBiYXNoLgotCi1UdWUgTm92ICA5IDE1OjU0OjAxIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIFNIRUxMLgotCi1GcmkgTm92ICA1IDA4OjA3OjI3IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWNjZXB0IHVuaXh3YXJlIGFzIGFuIGFsaWFzIGZvciBzdnI0LjIuCi0JRml4IHNvbWUgaW5jb25zaXN0YW5jaWVzIHdpdGggdGhlIGdjYyB2ZXJzaW9uLgotCi1GcmkgTm92ICA1IDE1OjE0OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgQWRkIGdkYi4KLQotRnJpIE5vdiAgNSAxMTo1OTo0MiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIEFkZCBsaWJnKysgYW5kIGxpYmlvLgotCi1GcmkgTm92ICA1IDEwOjM1OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogT25seSBidWlsZCAiaW5mbyIgaW4gRElTVERPQ0RJUlMuCi0JKERJU1RET0NESVJTKTogRG9uJ3QgYXNzdW1lIGxpYmcrKyBhbmQgZ2RiIGZvbGtzIG5lY2Vzc2FyaWx5IHdhbnQKLQl0aGlzIG5vdy4KLQotVGh1IE5vdiAgNCAxODo1ODoyMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IGhpdXgqIGFzIGFuIE9TIG5hbWUuCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgUlVOVEVTVF9GTEFHUyBiYWNrIHRvIFJVTlRFU1RGTEFHUyBwZXIKLQlldGMvbWFrZS1zdGRzLnRleGkuICBUaGUgdW5kZXJzY29yZSBjYW1lIGZyb20gZ2NjLCBhbmQgZGplIG5vdwotCWFncmVlcyB0aGF0IFJVTlRFU1RGTEFHUyBpcyB0aGUgY29ycmVjdCBuYW1lLgotCi1UaHUgTm92ICA0IDEwOjQ5OjAxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiAgUmVtb3ZlICdzZXQgLWUnLiAgSXQgbWFrZXMgYW55IGNvbmRpdGlvbmFscwotCWluIHRoZSBzY3JpcHQgdXNlbGVzcy4KLQotCSogY29uZmlnLmd1ZXNzOiBBdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBhcm0tYWNvcm4tcmlzY2l4Ci0JUGF0Y2ggZnJvbSBSaWNoYXJkIEVhcm5zaGF3IChyd2UxMUBjbC5jYW0uYWMudWspLgotCi1UaHUgTm92IDA0IDA4OjA4OjA0IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotV2VkIE5vdiAgMyAyMjowOTo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6IE5ldyB2YXJpYWJsZS4KLQkodGF6KTogRWRpdCBsb2NhbCBNYWtlZmlsZS5pbiBzb29uZXIsIGluc3RlYWQgb2YgcHJvdG8tdG9wbGV2Ci0JTWFrZWZpbGUuaW4gbGF0ZXIuICBCdWlsZCAiaW5mbyIgYW5kICJkdmkiIGluIERJU1RET0NESVJTLiAgCi0KLVdlZCBOb3YgIDMgMjE6MzE6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEgdGFyZ2V0KTogY2hlY2sgdGhlIHNvdXJjZSBkaXJlY3RvcnkgZm9yIHRoZQotCSAgcGFnYXMgc3ViLWRpcmVjdG9yeQotCi1XZWQgTm92ICAzIDExOjEyOjIyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFsbG93IC1hb3V0KiBhbmQgLWVsZiouCi0KLVdlZCBOb3YgIDMgMTE6MDg6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxkIG9uIGkzODYtc29sYXJpczIsIHNhbWUgYXMgZm9yCi0Jc3BhcmMtc29sYXJpczIuCi0KLVR1ZSBOb3YgIDIgMTQ6MjE6MjUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBBZGQgdGV4aW5mby9sZ3BsLnRleGluZm8gKGZvciBsaWJnKyspLgotCi1UdWUgTm92ICAyIDEzOjM4OjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgQ29uZmlndXJlIGdkYiBmb3IgYWxwaGEuCi0KLU1vbiBOb3YgIDEgMTA6NDI6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IEFkZCAtTy4KLQotV2VkIE9jdCAyNyAxMDo0NTowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkZWQgc3VwcG9ydCBmb3IgREcgQXZpaW9uCi0KLVR1ZSBPY3QgMjYgMTQ6Mzc6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHN1YmRpcmVjdG9yaWVzIG5vdAotCWNvbmZpZ3VyYWJsZSBmb3IgdGhpcyBob3N0L3RhcmdldCBjb21iaW5hdGlvbi4gIERvbid0IHRyeSB0bwotCWNvbmZpZ3VyZSBnZGIgZm9yIHZtcy4KLQotTW9uIE9jdCAyNSAxMToyMjoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFJlcGxhY2UgImJ5YWNjIiB3aXRoICJiaXNvbiAteSIgaW4gdGhlCi0JYXBwcm9wcmlhdGUgZmlsZXMgYmVmb3JlIG1ha2luZyAiZGlzdHN0dWZmIi4KLQkoRElTVEJJU09ORklMRVMpOiBOZXcgdmFyOiBsaXN0IG9mIGZpbGVzIHRvIGJlIGVkaXRlZC4KLQkoRElTVFNUVUZGRElSUyk6IEFkZCBiaW51dGlscy4KLQotRnJpIE9jdCAyMiAyMDozMjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGFsc28gaGFuZGxlIG1pcHNlbCBhbmQgbWlwczY0ZWwgKGZvciBsaXR0bGUgZW5kaWFuIG1pcHMpCi0KLUZyaSBPY3QgMjIgMDc6NTk6MjAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVGh1IE9jdCAyMSAxMTozODoyOCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbmV3bGliIGZvciBMeW54T1MgbmF0aXZlLgotCi1XZWQgT2N0IDIwIDA5OjU2OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBkZWx0YSA4OGsgcnVubmluZyBTVlIzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50IGFib3V0IEhQIGNvbXBpbGVyIHZzLiBlbWFjcy4KLQotVHVlIE9jdCAxOSAxNjowMjoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgbGQgb24gc29sYXJpczIgKG5vdCBhIHZpYWJsZSBvcHRpb24KLQkgIGR1ZSB0byBidWdzIGluIGdldHB3bmFtICYgZ2V0cHd1aWQpCi0KLVR1ZSBPY3QgMTkgMTU6MTM6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBhbHBoYS1kZWMtb3NmMSosIG5vdCBqdXN0IC1vc2YxLCBzaW5jZQotCWNvbmZpZy5ndWVzcyB3aWxsIHByb2R1Y2UgYSBmdWxsIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgT2N0IDE5IDE1OjU4OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsaW5rZXIgYW5kIGJpbnV0aWxzIGZvciBhbHBoYS1kZWMtb3NmMS4KLQotVHVlIE9jdCAxOSAxMTo0MTo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSAtTyBmcm9tIENYWEZMQUdTIGZvciBjb25zaXN0ZW5jeSB3aXRoIENGTEFHUywKLQlhbmQgZ2RiL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbi4KLQotU2F0IE9jdCAgOSAxODozOTowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMtCi0KLUZyaSBPY3QgIDggMTQ6MTU6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBsaW51eCpjb2ZmIGFuZCBsaW51eCplbGYgYXMgb3BlcmF0aW5nCi0Jc3lzdGVtcy4KLQotVGh1IE9jdCAgNyAxMjo1NzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtaXBzNjQsIGFuZCBtaXBzMyBhcyBhbiBhbGlhcyBmb3IgaXQuCi0KLVdlZCBPY3QgIDYgMTM6NTQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBhbHBoYS1kZWMtb3NmKiwgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBub3cgdGhhdAotCWdkYiBrbm93cyBob3cgdG8gaGFuZGxlIE9TRi8xIHNoYXJlZCBsaWJyYXJpZXMuCi0KLVR1ZSBPY3QgIDUgMTE6NTU6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhpdGFjaGkncyBISVVYLgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGgzMDUwciogYW5kIGhwcGFoaXRhY2hpLgotCVJlbW92ZSByZWR1bmRhbnQgY2FzZXMgZm9yIGhwOWtbMjNdKi4KLQotTW9uIE9jdCAgNCAxNjoxNTowOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGVmYXVsdCB0byAnLS13aXRoLWdudS1hcycgYW5kICctLXdpdGgtZ251LWxkJwotCWlmIGdhcyBhbmQgbGQgYXJlIGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgYXJlIGluICR7Y29uZmlnZGlyc30uCi0JSWYgJHt1c2VfZ251X2FzfSBvciAke3VzZV9nbnVfbGR9IGFyZSAnbm8nLCB0aGVuIGRvbid0IHNldCB0aGUKLQl0aGUgLS13aXRoIG9wdGlvbnMgKGJ1dCBzdGlsbCBwYXNzIHRoZW0gZG93biBvbiB0aGUgY29tbWFuZCBsaW5lLAotCWlmIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNwZWNpZmllZCkuCi0KLUZyaSBTZXAgMjQgMTk6MTE6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHN1YnN0aXR1dGUgU0hFTEwgdmFsdWUgaW4gTWFrZWZpbGUuaW4gd2l0aAotCSR7Q09ORklHX1NIRUxMfQotCi1UaHUgU2VwIDIzIDE4OjA1OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBnYXMsIGxkLCBhbmQgYmludXRpbHMgZm9yICotKi1zeXN2NCogYW5kCi0JKi0qLXNvbGFyaXMyKiB0YXJnZXRzLgotCi1TdW4gU2VwIDE5IDE3OjAxOjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBNNCwgYW5kIHBhc3MgaXQgZG93biB0byBzdWItbWFrZXM7Ci0JYWxsLWF1dG9jb25mIG5vdyBkZXBlbmRzIG9uIGFsbC1tNAotCi1TYXQgU2VwIDE4IDAwOjM4OjIzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtBUixSQU5MSUJ9X0ZPUl9UQVJHRVQpOiBtYWtlIGNvbnRpbmdlbnQgb24KLQlwcmVzZW5jZSBvZiB7YXIscmFubGlifSBpbnN0ZWFkIG9mIGEgY29uZmlndXJlZCBkaXJlY3RvcnkKLQotV2VkIFNlcCAxNSAwODo0MTo0NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWNjZXB0IDM0Pz8gYXMgd2VsbCBhcyAzMz8/IGZvciBOQ1IuCi0KLU1vbiBTZXAgMTMgMTI6Mjg6NDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdyYWIgbXQtaHBwYSBmb3IgSFBQQSB0YXJnZXRzOyB1c2UgJ2dhcyAnIGluc3RlYWQKLQlvZiAnZ2FzJyBpbiBzZWQgY29tbWFuZHMsIHNpbmNlICdnYXNoJyBpcyBub3cgaW4gdGhlIHRyZWUgYXMgd2VsbC4KLQotRnJpIFNlcCAxMCAxMToyMzo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZ3JhYiB2YWx1ZXMgZm9yICQoQ0MpIGFuZCAkKENYWCkgZnJvbSB0aGUKLQllbnZpcm9ubWVudCwgc28gdGhhdCBzb21lb25lIGNhbiBkbyAiQ0M9Z2NjIGNvbmZpZ3VyZTsgbWFrZSIgYW5kCi0JaGF2ZSBpdCB3b3JrIHJpZ2h0IChtYXRjaGluZyB0aGUgd2F5IHRoYXQgYXV0b2NvbmYgd29ya3Mgbm93KQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBhZGQgc3VwcG9ydCBmb3IgZ2FzaCwgdGhlIHRjbAotCWludGVyZmFjZSB0byBHYWxheHkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgTmV0QlNEIHZhcmlhbnRzIChocDMwMCwgeDg2KQotCi1UaHUgU2VwICA5IDE2OjQ4OjUyIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBTdXBwb3J0IC1kIG9wdGlvbiAoaW4gdGhlIG1hbm5lciBvZiBTdW5PUyA0IGluc3RhbGwsCi0JYXMgaXQgaXMgbW9yZSBkZXRlcm1pbmlzdGljIHRoYW4gdGhhdCBvZiBHTlUgaW5zdGFsbCkKLQkoY2htb2RjbWQpOiBTZXQgZmlsZSB0byBtb2RlIDc1NSBieSBkZWZhdWx0IChzaG91bGQgYWxzbyBkbyBkZWZhdWx0Ci0JY2hncnAgYW5kIGNob3duLCBidXQgSSBkb24ndCBmZWVsIGxpa2UgZGVhbGluZyB3aXRoIHRoYXQgbm93KQotCi1UdWUgU2VwICA3IDExOjU5OjM5IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlbW92ZSBoODMwMGhobXMgYWxpYXMuCi0KLVR1ZSBBdWcgMzEgMTE6MDA6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggKi0qLXNvbGFyaXMyKiBub3QgKi1zdW4tc29sYXJpczIqLgotCi1Nb24gQXVnIDMwIDE4OjI5OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogdG91Y2ggc3RtcC1maXhwcm90byBhcyB3ZWxsCi0JYXMgc3RtcC1maXhpbmMKLQotV2VkIEF1ZyAyNSAxNjozNTo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlY29nbml6ZSBtODgxMTAtYnVnLWNvZmYuCi0KLVR1ZSBBdWcgMjQgMTA6MjM6MjQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmlvKTogYWxsIGRlcGVuZGVuY2llcyBvbiB0aGUgdG9vbGNoYWluIHVzZWQKLQl0byBidWlsZCB0aGlzIChnY2MsIGdhcywgbGQsIGV0YykKLQotRnJpIEF1ZyAyMCAxNzoyNDoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBEZWFsIHdpdGggT1NGLzEgMS4zIG9uIGFscGhhLgotCi1UaHUgQXVnIDE5IDExOjQzOjA0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogYWRkIHNvbWUgJ2Vsc2UgdHJ1ZScgY2xhdXNlcyBmb3IgcG9ydGFiaWxpdHkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBsaWJpbyBmb3IgaDhbMzVdMDAtKi0qIHRhcmdldHMKLQotVHVlIEF1ZyAxNyAxOTowMjozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgc3VwcG9ydCBmb3IgbmV3IGxpYmlvLgotCi1TdW4gQXVnIDE1IDIwOjQ4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBJZiBvbmUgY29tbWFuZCBmYWlscywgZG9uJ3QgdHJ5IHRoZSByZXN0LiAgRG9uJ3QgdHJ5Ci0JdG8gcmVtb3ZlICRkc3R0bXAgKHZpYSB0cmFwKSB1bmxlc3Mgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgaXQuCi0JSWYgJHNyYyBkb2Vzbid0IGV4aXN0LCBkZXRlY3QgaXQgYW5kIGV4aXQgd2l0aCBhbiBlcnJvci4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgQlNEIG9uIGhwMzAwLgotCi1XZWQgQXVnIDExIDE4OjM1OjEzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNYXAgKDkwMDAvWzM0XT8/OkhQLVVYOio6KikgdG8gbTY4ay1ocC1ocHV4LgotCUJ1ZyByZXBvcnQgZnJvbSAiSGFtaXNoIChILkkuKSBNYWNkb25hbGQiIDxoYW1pc2hAYm5yLmNhPi4KLQotV2VkIEF1ZyAxMSAxNTozNzo1MSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zZW5kLXByKTogZGVwZW5kcyBvbiBhbGwtcHJtcwotCi1XZWQgQXVnIDExIDE2OjU2OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeCB0eXBvICg5MDAwLzg/Pzo0LjNic2QgLT4gOTAwMC83Pz86NC4zYnNkKS4KLQotRnJpIEF1ZyAgNiAxNDo0NTowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRnJvbSBtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhIChNaWNoYWVsIFJlbmRlbGwpOgotCUFkZGVkIHRlc3QgZm9yIG1pcHMtbWlwcy1yaXNjb3M1LgotCi1UaHUgQXVnICA1IDE1OjQ1OjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgbWgtaHAzMDAgZm9yIDY4ayBIUCBob3N0cwotCi1Nb24gQXVnICAyIDExOjU2OjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGQgc3VwcG9ydCBmb3IgQ09ORklHX1NIRUxMLCBzbyB0aGF0IHlvdSBjYW4gdXNlCi0Jc29tZSBhbHRlcm5hdGUgc2hlbGwgZm9yIGV2YWx1YXRpbmcgY29uZmlndXJlIHNjcmlwdHMKLQotU3VuIEF1ZyAgMSAxMTozNjoyNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBTZWQgYnVnIHJlcG9ydGluZyBhZGRyZXNzCi0JaW4gY29uZmlndXJlIHNjcmlwdCB0byBidWctZ2RiQHByZXAuYWkubWl0LmVkdSB3aGVuIGJ1aWxkaW5nCi0JZGlzdHJpYnV0aW9uIGFyY2hpdmUuCi0JKiBNYWtlZmlsZS5pbiAoQ09NUFJFU1MpOiAgUmVtb3ZlIGRlZi4KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLmd6LCBtYWtlLWdkYi50YXIuZ3opOiAgUmVuYW1lZCBmcm9tCi0JZ2RiLnRhci5aIGFuZCBtYWtlLWdkYi50YXIuWiByZXNwZWN0aXZlbHkuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIE5vdyBvbmx5IGJ1aWxkIGd6aXAnZCBhcmNoaXZlLgotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBNaW5vciBjaGFuZ2VzIHRvIG1vdmUgY2xvc2VyCi0JdG8gY29udmVyZ2VuY2Ugd2l0aCAndGF6JyB0YXJnZXQgaW4gTWFrZWZpbGUuaW4uCi0KLUZyaSBKdWwgMzAgMTI6MzQ6NTcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoIChkc3R0bXApOiB1c2UgdHJhcCB0byBlbnN1cmUgdGhhdCB0bXAgZmlsZXMgZ28KLQlhd2F5IG9uIGVycm9yIGNvbmRpdGlvbnMKLQotV2VkIEp1bCAyOCAxMTo1NzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiByZW1vdmUgTE9BRExJQkVTCi0KLVR1ZSBKdWwgMjcgMTI6NDM6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRpcnMpOiBEZWFsIHdpdGggYSBwcmVmaXggbGlrZSAvZ251OwotCWl0cyBwYXJlbnQgaXMgJy8nIG5vdCAnJy4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCBjb21tZW50cyBhYm91dCBDaGFuZ2VMb2cuCi0KLUZyaSBKdWwgMjMgMDk6NTM6MzcgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQHdhaGluaS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGlmICR7bmV3c3JjZGlyfS9jb25maWd1cmUgZG9lc24ndCBleGlzdCwgZG9uJ3QgYXNzdW1lCi0JdGhhdCAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIGRvZXMuCi0KLVR1ZSBKdWwgMjAgMTE6Mjg6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBzdXBwb3J0IGZvciBDT05GSUdfU0hFTEwKLQotTW9uIEp1bCAxOSAyMTo1NDo0NiAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmV0d2FyZSk6ICBBZGQgYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotV2VkIEp1bCAxNCAxMjowMzoxMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IGRlcGVuZCBvbiBjb25maWd1cmUuaW4uICBBbHNvIGRyb3AgdGhlCi0JICAkKHNyY2RpcikvIGZyb20gdGhlIGRlcGVuZGVuY3kgb24gTWFrZWZpbGUuaW4uCi0KLVR1ZSBKdWwgMTMgMjA6MTA6NTggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGg4MzAwaGhtcyBhcyBoODMwMGgtaGl0YWNoaS1obXMuCi0JKGg4MzAwaGhtcyBpcyB0ZW1wb3JhcnkgdW50aWwgbXVsdGktbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCkuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBoODMwMGggdG9vLgotCi1TdW4gSnVsIDExIDE3OjM1OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBkcHgvMiBhcyBtNjhrLWJ1bGwtc3lzdjMuCi0KLVRodSBKdWwgIDggMTg6MjY6MTIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBleHRyYW5lb3VzIG91dHB1dCB3aGVuIGd1ZXNzaW5nIGhvc3QgdHlwZS4KLQkqIGNvbmZpZy5ndWVzczogIFJlbW92ZSBleHRyYW5lb3VzIG91dHB1dCB3aGVuIGd1ZXNzaW5nIHVzaW5nIEMKLQljb21waWxlciByYXRoZXIgdGhhbiB1bmFtZSwgb3Igd2hlbiBndWVzc2luZyBmYWlscy4KLQotV2VkIEp1bCAgNyAxNzo1ODoxNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgYWxsLmNyb3NzIGFuZCBpbnN0YWxsLmNyb3NzIHRhcmdldHMKLQotCSogY29uZmlndXJlOiByZW1vdmUgQ1JPU1M9LURDUk9TU19DT01QSUxFIGFuZCBBTEw9YWxsLmNyb3NzCi0JICBkZWZpbml0aW9ucwotCi1UdWUgSnVsICA2IDEwOjM5OjQ0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IHNoKTogQnVpbGQgZ3Byb2YuCi0KLVRodSBKdWwgIDEgMTY6NTI6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBjaGFuZ2UgLXNvbGFyaXMgdG8gLXNvbGFyaXMyCi0KLVRodSBKdWwgIDEgMTU6NDY6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNvbmZpZy9taC1yaXNjb3MgZm9yIG1pcHMtKi1zeXN2Ki4KLQotV2VkIEp1biAzMCAwOTozMTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ29ycmVjdCBlcnJvciBtZXNzYWdlIGZvciBtaXNzaW5nIE1ha2VmaWxlLmluIHRvCi0JcHJpbnQgY29ycmVjdCBkaXJlY3RvcnkuCi0KLVR1ZSBKdW4gMjkgMTM6NTI6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBrbHVkZ2UgYXJvdW5kIDM4NkJTRCBzaGVsbCBidWcKLQotVHVlIEp1biAyOSAxMzowNjo0OSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBOZVhULgotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGk0ODYtbmNyLXN5c3Y0LgotCSogTWFrZWZpbGUuaW4gKHRheik6ICBybSAkKFRPT0wpLSQkVkVSIGJlZm9yZSBsaW5raW5nLgotCi1UdWUgSnVuIDI5IDEyOjUwOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPRkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIE1BS0VJTkZPIGFzIE1BS0VJTkZPIE1BS0VJTkZPRkxBR1MuCi0JKiBidWlsZC1hbGwubWssIHRlc3QtYnVpbGQubWs6IFBhc3MgZG93biAtLW5vLXNwbGl0IGFzCi0JTUFLRUlORk9GTEFHUyB3aGVuIGhvc3RlZCBvbiBET1MuICBDb21waWxlIERPUyBob3N0ZWQgd2l0aG91dCAtZy4KLQotVGh1IEp1biAyNCAxMzozOToxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiAgQWRkIENPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC5zaC4KLQotV2VkIEp1biAyMyAxMjo1OToyMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJnKysudGFyLnopOiAgTmV3IHJ1bGUuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIFJlcGxhY2UgJ2NvbmZpZ3VyZSAtcm0nIGJ5ICdtYWtlIGRpc3RjbGVhbicuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIE9ubHkgZG8gYSBzaW5nbGUgY2htb2QuCi0KLUZyaSBKdW4gMTggMTI6MDM6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IG1hamlwb29yLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGRvbid0IHVzZSBkaXJuYW1lIGFueW1vcmUgKHJlcGxhY2VkIHdpdGggc2VkIHVzYWdlKQotCi1UaHUgSnVuIDE3IDE4OjQzOjQyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBleHRlbnNpb24gZm9yIGd6aXAnZCBmaWxlcyBmcm9tICcueicgdG8KLQknLmd6JyBwZXIgbmV3IEZTRiBzdGFuZGFyZCB1c2FnZS4KLQotVGh1IEp1biAxNyAxNjo1ODo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgbWFqaXBvb3IuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgZmluYWwgdmFsdWUgb2YgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCi1UdWUgSnVuIDE1IDE2OjQ4OjUxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyBpbnN0YWxsLnNoIHN1cHBvcnQ7IHVwZGF0ZSBpbnN0YWxsLWluZm8gcnVsZXMKLQotV2VkIEp1biAgOSAxMjozMTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZGlmZiBmb3IgY3Jvc3NlcywgYnV0IG5vdCBmb3IgZ28zMiBob3N0LgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdwcm9mIG9ubHkgZm9yIG5hdGl2ZSwgYW5kIGRvbid0IGJ1aWxkIGl0Ci0JZm9yIG1pcHMtKi0qLCByczYwMDAtKi0qLCBvciBpWzM0XTg2LSotc2NvKi4KLQotTW9uIEp1biAgNyAxMzoxMjoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBnYXMsbGQsYmludXRpbHMgb24gZm9yICotKi1zeXN2NAotCi1Nb24gSnVuICA3IDExOjQwOjExIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkIHBybXMuCi0KLUZyaSBKdW4gIDQgMTM6MzA6NDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBnY2MsIGRvIGluc3RhbGxhdGlvbiBvZiAkKElOU1RBTExfTU9EVUxFUykKLQl3aXRoICQoRkxBR1NfVE9fUEFTUykgb24gdGhlIGNvbW1hbmQgbGluZQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbHlueCBhbmQgbHlueG9zCi0KLUZyaSBKdW4gIDQgMTA6NTk6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgLWVjb2ZmKiwgbm90IGp1c3QgLWVjb2ZmLgotCi1UaHUgSnVuICAzIDE3OjM4OjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAuZ3ogc3VmZml4IGluc3RlYWQgb2YgLnouCi0JKGJpbnV0aWxzLnRhci5neiwgZ2FzK2JpbnV0aWxzLnRhci5neiwgZ2FzLnRhci5neik6IEZpeGVkIHRhcmdldAotCW5hbWVzLgotCi1UaHUgSnVuICAzIDAwOjI3OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHZhdWx0LWluc3RhbGwpOiBhZGQgYW4gJ2Vsc2UgdHJ1ZScgKGZvciBVbHRyaXgpCi0KLVdlZCBKdW4gIDIgMTg6MTk6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzKTogIGluc3RhbGwgZ2NjIGxhc3QsIHNvCi0JdGhhdCByZWJ1aWxkcyB0aGF0IG1pZ2h0IGhhcHBlbiBkdXJpbmcgJ21ha2UgaW5zdGFsbCcgZG9uJ3QgZ2V0Ci0JYm9ndXMgZ2NjIGluY2x1ZGUgZmlsZXMKLQotV2VkIEp1biAgMiAxNjoxNDoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlDaGFuZ2UgZnJvbSBVdGFoIGZvciBIUFBBIHN1cHBvcnQ6Ci0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBocHBhMS54LWhwLWJzZC4KLQotV2VkIEp1biAgMiAxMTo1MzozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBzdXBwb3J0IGZvciBNb3Rvcm9sYSBEZWx0YSA2OGssIHVwIHRvIHIzdjcuCi0JUGF0Y2ggZnJvbSBwb3RAZmx5LmNudWNlLmNuci5pdCAoRnJhbmNlc2NvIFBvdG9ydGlgKS4KLQotVHVlIEp1biAgMSAxNzo0ODo0MiAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciByb202OGsgYW5kIGJ1ZyBib290IG1vbml0b3JzLgotCi1Nb24gTWF5IDMxIDA5OjM2OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBhbGwtb3Bjb2RlcyBkZXBlbmQgb24gYWxsLWJmZC4KLQotVGh1IE1heSAyNyAwODowNTozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkZWQgc3BlY2lhbCBjaGVjayBmb3IgaVszNF04Ni11bml2ZWwtc3lzdjQqLgotCi1XZWQgTWF5IDI2IDE2OjMzOjQwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGb3IgaVszNF04Ni11bmtub3duLXN5c3Y0IHVzZSBVTkFNRV9NQUNISU5FIGZvcgotCXRoZSBwcm9jZXNzb3IgcmF0aGVyIHRoYW4gYXNzdW1pbmcgaTQ4Ni4KLQotV2VkIE1heSAyNiAwOTo0MDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgU3VuT1M2IGFzIFNvbGFyaXMzLgotCi1UdWUgTWF5IDI1IDIzOjAzOjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBGaXggdHlwby4gIEF2b2lkICNlbGlmIChub3QgaW4gSyZSIDEpLgotCVJlY29nbml6ZSBTdW5PUyA1Liogb25seSAoYW5kIG5vdCBbNi05XS4qKSBhcyBiZWluZyBTb2xhcmlzMi4KLQotVHVlIE1heSAyNSAxMjo0NDoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tayAoYWxsLWNyb3NzKTogTmV3IHRhcmdldCBmb3IgQ2FuYWRpYW4gQ3Jvc3MuCi0JQWRkZWQgUTIgZ28zMiB0YXJnZXRzLgotCSogdGVzdC1idWlsZC5tazogQ29uZmlndXJlIGdvMzIgY3Jvc3Mgc3BhcmNsaXRlLWFvdXQgYW5kCi0JbWlwcy1pZHQtZWNvZmYgLXdpdGgtZ251LWxkLiAgTW92ZWQgYnVpbGQgYmluYXJ5IGRpcmVjdG9yeSBmcm9tCi0JUEFSVElBTF9IT0xFX0RJUlMgdG8gQlVJTERfSE9MRVNfRElSUy4KLQotTW9uIE1heSAyNCAxNTozMDowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZml4IEFscGhhIEdEQiB0eXBvOyBhbHNvLCBkb24ndCBidWlsZCBEZWphR251IGZvcgotCUdPMzIgaG9zdGVkIHRvb2xjaGFpbnMKLQotTW9uIE1heSAyNCAxNDoxODo0MSAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogY2hhbmdlICBzbyAiLWV4ZWMtcHJlZml4IiBnZXRzIHBhc3NlZCBkb3duIHJhdGhlcgotCXRoYW4gIi1leGVjX3ByZWZpeCIgc28gYXV0b2NvbmYgZ2VuZXJhdGVkIE1ha2VmaWxlcyBnZXQgdGhlCi0JZXhlY19wcmVmaXggc2V0IHJpZ2h0LgotCi1GcmkgTWF5IDIxIDEwOjQyOjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBnZXQgdGhlIFNvbGFyaXMyIG1pbm9yIHZlcnNpb24gbnVtYmVyCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgc3RhbmRhcmRzLnRleGkgYW5kIG1ha2Utc3Rkcy50ZXhpIHRvIEVUQ19TVVBQT1JUCi0KLUZyaSBNYXkgMjEgMDY6MjA6NTIgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBzb21lIFNlcXVlbnQgcGxhdGZvcm1zLgotCi1UaHUgTWF5IDIwIDE0OjMzOjQ4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRoZSB2YXVsdC1pbnN0YWxsIHRhcmdldAotCi0JKiBjb25maWd1cmUuaW46IGFjdHVhbGx5IHVzZSB0aGUgU3VuMyBtYWtlZmlsZSBmcmFnbWVudCB0aGF0J3MgaW4KLQljb25maWcsIGFsc28gYWRkZWQgdGhlIHJlbGVhc2UgZGlyIHRvIGNvbmZpZ2RpcnMKLQotVGh1IE1heSAyMCAxNDoxOToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBGaXggbW9kZXMgb24gc3R1ZmYgaW4gJChUT09MKSBkaXIgYWxzby4KLQotVHVlIE1heSAxOCAyMDoyNjo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHNvbWUgcHJvZ3JhbSBmcm9tIEFscGhhIHRhcmdldHRlZCB0b29sY2hhaW5zCi0KLVR1ZSBNYXkgMTggMTU6MjM6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkZESVJTKTogUmVuYW1lZCBmcm9tIFBST1RPRElSUy4gIEFkZCBsZCBhbmQKLQlncHJvZi4KLQkodGF6KTogUnVuICJtYWtlIGRpc3RzdHVmZiIgaW4gdGhvc2UgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiAibWFrZQotCXByb3RvLWRpciIuICBMb29rIGZvciAiVkVSU0lPTj0iIG9ubHkgYXQgc3RhcnQgb2YgbGluZSBpbiBzdWJkaXIKLQlNYWtlZmlsZS4gIFVzZSAiZ3ppcCAtOSIgZm9yIGNvbXByZXNzaW9uLgotCShURVhJTkZPX1NVUFBPUlQsIERJU1RfU1VQUE9SVCwgQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogTmV3IHZhcnMuCi0JKGJpbnV0aWxzLnRhci56KTogTmV3IHRhcmdldC4KLQotTW9uIE1heSAxNyAxNzowMToxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEluY2x1ZGUgZ3BsLnRleGluZm8uCi0KLUZyaSBNYXkgMTQgMDY6NDg6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzKTogTWVyZ2VkIGludG8gInRheiIgdGFyZ2V0LgotCSh0YXopOiBPbmx5IGRvIGBwcm90by1kaXInIHN0dWZmIGlmIGEgZGlyZWN0b3J5IGlzIGFjdHVhbGx5IG5lZWRlZAotCWZvciB0aGlzIHRhcmdldC4KLQotV2VkIE1heSAxMiAxMzowOTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNVU5DSF9OTSk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCB0byBiZSAkKE5NKS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBNVU5DSF9OTS4KLQkoSE9TVF9DQywgSE9TVF9QUkVGSVgsIEhPU1RfUFJFRklYXzEpOiBOZXcgdmFyaWFibGVzLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBQYXNzIGRvd24gSE9TVF8qIHZhcmlhYmxlcy4KLQkoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBDb3JyZWN0IGZvciBjdXJyZW50IGdjYyBNYWtlZmlsZS4KLQotVHVlIE1heSAxMSAxMDoxNDoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIEFkZCBjb25maWd1cmUsIGNvbmZpZy5ndWVzcywKLQljb25maWcuc3ViLCBhbmQgbW92ZS1pZi1jaGFuZ2UgdG8gZ2RiIHRlc3RzdWl0ZSBkaXN0cmlidXRpb24KLQlhcmNoaXZlLCBzbyB0aGUgdGVzdHN1aXRlIGNhbiBiZSBleHRyYWN0ZWQsIGNvbmZpZ3VyZWQsIGFuZAotCXJ1biBzZXBhcmF0ZWx5IGZyb20gdGhlIGdkYiBkaXN0cmlidXRpb24uICBCbG93IGF3YXkgdGhlIENoaWxsCi0JdGVzdHMgdGhhdCByZXF1aXJlIGEgQ2hpbGwgY29tcGlsZWQgZXhlY3V0YWJsZSwgc2luY2UgR05VIENoaWxsCi0JaXMgbm90IHlldCBwdWJsaWNhbGx5IGF2YWlsYWJsZS4KLQotTW9uIE1heSAxMCAxNzoyMjoyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gYSBzaW5nbGUgY29tbWFuZCwKLQlpbnN0ZWFkIG9mIGEgbGlzdCBvZiBhc3NpZ25tZW50cyBhbmQgZXhwb3J0cwotCi0JKiBjb25maWcuZ3Vlc3M6IHJlY29nbml6ZSBBbHBoYS9PU0YxIHN5c3RlbXMKLQotTW9uIE1heSAxMCAxNDo1NTo1MSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlIGhlbHAgbWVzc2FnZSB0byBwcmVmZXIgLS1vcHRpb25zIHJhdGhlciB0aGFuCi0JICAtb3B0aW9ucy4KLQotTW9uIE1heSAxMCAwNTo1ODozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ29udmVyZ2VudCBUZWNoLiAibWluaWZyYW1lIiB1c2VzIG02ODAxMCwgc2V6Ci0JemlwcHlAZWNzdC5jc3VjaGljby5lZHUuCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtaW5pZnJhbWUuCi0KLVN1biBNYXkgIDkgMTc6NDc6NTcgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0gICAgICAgKiBNYWtlZmlsZS5pbjogVXNlIHNyY3Jvb3QgdG8gZmluZCBydW50ZXN0IHJhdGhlciB0aGFuIHJvb3RtZS4KLSAgICAgICBQYXNzIFJVTlRFU1RGTEFHUyBhbmQgRVhQRUNUIGRvd24gaW4gQkFTRV9GTEFHU19UT19QQVNTLgotCi1GcmkgTWF5ICA3IDE0OjU1OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBzdXBwb3J0IGJ1aWxkaW5nIG9uIGEKLQltYWNoaW5lIG90aGVyIHRoYW4gdGhlIGhvc3QuCi0KLVdlZCBNYXkgIDUgMDg6MzU6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IEZpeCBmb3IgaTM4Ni1haXggYWdhaW4uCi0KLU1vbiBNYXkgIDMgMTk6MDA6MjcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpCi0JdG8gbWF0Y2ggdGhlIEZTRi4KLQotRnJpIEFwciAzMCAxNTo1NToyMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGlbMzRdODYvU1ZSNC4KLQotRnJpIEFwciAzMCAxNTo1Mjo0NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiBnZGIgZGVwZW5kcyBvbiBzaW0uCi0KLVRodSBBcHIgMjkgMjM6MzA6NDggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgTWFrZSBwcm90b3R5cGUgZ2RiIHRlc3RzdWl0ZSBkaXJlY3RvcnkKLQlhdCB0aGUgc2FtZSB0aW1lIHdlIG1ha2UgdGhlIHByb3RvdHlwZSBnZGIgZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIE1ha2UgdGhlIHRlc3RzdWl0ZSBkaXN0cmlidXRpb24KLQlmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBnZGIgYmFzZSByZWxlYXNlIGRpc3RyaWJ1dGlvbi4KLQotVGh1IEFwciAyOSAxMjo1MDozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFVzZSBpbmRpdmlkdWFsIGNoZWNrIHRhcmdldHMgcmF0aGVyIHRoYW4KLQlET19YIHJ1bGUuCi0JKGNoZWNrLWdjYyk6IEFkZGVkLgotCi1UaHUgQXByIDI5IDA5OjUwOjA3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBVc2Ugc3lzdjMuMiBub3Qgc3lzdjMyIGZvciBjYW5vbmljYWwgT1MKLQlmb3IgU3lzdGVtIFYgcmVsZWFzZSAzLjIuCi0KLVRodSBBcHIgMjkgMTA6MzM6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaHBwYW9zZi4KLQkqIGNvbmZpZ3VyZS5pbjogRG8gY29uZmlndXJlIGxkL2JpbnV0aWxzL2dhcyBmb3IgaXQuCi0KLVR1ZSBBcHIgMjcgMDY6MjU6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IEFsdGVyIHN5bnRheCB1c2VkIHRvIHNldCB0aGlzLCBmb3Igc3lzdGVtcwotCXdoZXJlICJcJCIgaXNuJ3QgaGFuZGxlZCByaWdodCwgbGlrZSBpMzg2LWFpeC4KLQotVGh1IEFwciAyMiAwODoxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogUGFzcyBwcm9ncmFtLXRyYW5zZm9ybS1uYW1lLCBub3QKLQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLCB0byByZWN1cnNpdmUgY29uZmlndXJlcy4KLQotVGh1IEFwciAyMiAwMjo1ODoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdhcytiaW51dGlscy50YXIueik6IE5ldyBydWxlIGZvciBidWlsZGluZyBzbmFwc2hvdHMKLQlvZiBnYXMrbGQrYmludXRpbHMuCi0KLU1vbiBBcHIgMTkgMTc6NDE6MzAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBBSVgzLjIgYXMgZGlzdGluY3QgZnJvbSAzLjEuCi0KLVNhdCBBcHIgMTcgMTc6MTk6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbmFtZSBtODhrLW1vdG9yb2xhLW04OGtiY3MgdG8gbTg4ay1tb3Rvcm9sYS1zeXN2Ci0KLQkqIGNvbmZpZy9taC1kZWx0YTg4OiByZW1vdmUgZXh0cmFuZW91cyBHQ0MgcmVmZXJlbmNlcwotCi1UdWUgQXByIDEzIDE2OjUyOjE2IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFBSTVMpOiBTZXQgYmFjayB0byBhbGwtcHJtcy4KLQotU2F0IEFwciAxMCAxMjowNDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IFBhc3MgLXdpdGgtZ251LWFzIGZvciBrbm93biBNSVBTIG5hdGl2ZSBhbmQgTUlQUwotCXRhcmdldHMsIHJhdGhlciB0aGFuIGZvciBNSVBTIGhvc3RzLgotCi1GcmkgQXByICA5IDEzOjUxOjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgY29tbWVudCBmb3IgLS13aXRoLXggZGVmYXVsdCB2YWx1ZXMKLQotCSogY29uZmlnLmd1ZXNzOiBoYW5kbGUgTW90b3JvbGEgRGVsdGE4OCBib3ggZm9yIFNWUjMgYW5kIFNWUjQuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgY2hlY2stKiB0YXJnZXRzIGZvciBlYWNoIG9mIHRoZSBkaXJlY3RvcmllcyBpbgotCXRoZSB0cmVlLiAgQWRkIGEgZGVmaW5pdGlvbiBvZiBSVU5URVNUIHRoYXQgd2lsbCB1c2UgdGhlIG9uZSB3ZQotCWp1c3QgYnVpbHQsIGlmIGl0IGV4aXN0cy4gIFBhc3MgdGhpcyBkb3duIHZpYSBGTEFHU19UT19QQVNTLgotCi1UaHUgQXByICA4IDA5OjIxOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmVkIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gYmZkX3RhcmdldCBhbmQKLQl0YXJnZXRfbWFrZWZpbGVfZnJhZy4KLQotCSogYnVpbGQtYWxsLm1rOiBTZXQgYXNzb3J0ZWQgdGFyZ2V0cyBmb3IgUTIuCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgejhrLXNpbSBhbmQgaDgzMDAtaG1zLgotCSogdGVzdC1idWlsZC5tazogUmVhbGx5IGRvbid0IHBhc3MgaG9zdCB0byBjb25maWd1cmUuCi0JKEhPTEVTKTogQWRkZWQgdW5hbWUuCi0KLVdlZCBBcHIgIDcgMTU6NDg6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBhbiBlbXB0eSBwcm9ncmFtLXByZWZpeCwgcHJvZ3JhbS1zdWZmaXggb3IKLQlwcm9ncmFtLXRyYW5zZm9ybS1uYW1lIGNvcnJlY3RseS4KLQotVHVlIEFwciAgNiAxMzo0ODo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogLUcgOCBubyBsb25nZXIgcmVxdWlyZWQgZm9yIE1JUFMgdGFyZ2V0cy4KLQkqIHRlc3QtYnVpbGQubWs6IERvbid0IHBhc3MgaG9zdCBhcmd1bWVudCB0byBjb25maWd1cmU7IG1ha2UgaXQKLQlndWVzcy4KLQotVHVlIEFwciAgNiAxMDozNjo1MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBGaXggZm9yIGJ1aWxkaW5nIGd6aXAnZCBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ09NUFJFU1MpOiAgTmV3IG1hY3JvLCBsaWtlIEdaSVAuCi0KLUZyaSBBcHIgIDIgMDk6MDI6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBVc2UgLXdpdGgtZ251LWFzIGZvciBtaXBzLXNnaS1pcml4NCBhcyB3ZWxsLgotCi0JKiBidWlsZC1hbGwubWs6IFNldCBHQ0MgdG8gZ2NjIC1PIC1HIDggZm9yIE1JUFMgdGFyZ2V0cywgc2luY2UgZ2NjCi0Jd2l0aCBnYXMgY3VycmVudGx5IGRlZmF1bHRzIHRvIC1HIDAuCi0KLVRodSBBcHIgIDEgMDg6MjU6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWZsZXgpOiBmbGV4IGRlcGVuZHMgb24gYnlhY2MuCi0KLQkqIGJ1aWxkLWFsbC5tazogSWYgaG9zdCBub3Qgc3BlY2lmaWVkLCB1c2UgY29uZmlnLmd1ZXNzLiAgUGFzcyBUQUcKLQl0byB0ZXN0LWJ1aWxkLm1rIGFzIFJFTEVBU0VfVEFHLgotCSogdGVzdC1idWlsZC5tayAoY29uZmlnYXJncyk6IE5ldyB2YXJpYWJsZSBjb250YWluaW5nIGFyZ3VtZW50cyB0bwotCXBhc3MgdG8gY29uZmlndXJlLiAgU2V0IHRvIC13aXRoLWdudS1hcyBvbiBtaXBzLWRlYy11bHRyaXguCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gUkVMRUFTRV9UQUcuCi0KLQkqIGNvbmZpZy5ndWVzczogVXNlIC9iaW4vdW5hbWUgd2hlbiBjaGVja2luZyAtWCBhcmd1bWVudCBvbiBTQ08sCi0JdG8gYXZvaWQgaW52b2tpbmcgR05VIHVuYW1lIHdoaWNoIGRvZXNuJ3QgdW5kZXJzdGFuZCAtWC4KLQotCSogdGVzdC1idWlsZC5tazogRG9uJ3QgdXNlIC91c3IvdW5zdXBwb3J0ZWQvYmluL2FzIG9uIEFJWC4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBnYXMgZm9yIG1pcHMtKi0qLgotCi1XZWQgTWFyIDMxIDIxOjIwOjU4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC5ub3JtYWwpOiBpbnNlcnQgbWlzc2luZyBiYWNrc2xhc2guCi0KLVdlZCBNYXIgMzEgMTI6MzE6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWssIGNvbmZpZy9taC1pcml4NDogQnVtcCAtWE5oIHZhbHVlIHRvIDE1MDAgdG8gbWF0Y2gKLQlnY2MgcmVxdWlyZW1lbnRzLgotCi0JKiBNYWtlZmlsZS5pbjogQ29tcGxldGUgb3ZlcmhhdWwgdG8gbWVyZ2UgbWFueSBhbG1vc3QgaWRlbnRpY2FsCi0JdGFyZ2V0cy4KLQotVHVlIE1hciAzMCAyMDoxNzowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzLWdkYik6IFJlbmFtZWQgZnJvbSBzZXR1cC1kaXJzLgotCShnZGIudGFyLlopOiBBZGp1c3RlZC4KLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMsIHRheik6IE5ldyB0YXJnZXRzOyBzaG91bGQgYmUgZ2VuZXJhbAotCWVub3VnaCB0byBhZGFwdCBmb3IgZ2RiIHNvbWV0aW1lLiAgQnVpbGQgb25seSAueiBmaWxlLgotCShnYXMudGFyLnopOiBOZXcgdGFyZ2V0LgotCi1UdWUgTWFyIDMwIDEwOjAzOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBVc2UgQ0M9Y2MgLVhzIG9uIFNvbGFyaXMuCi0KLU1vbiBNYXIgMjkgMTk6NTk6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3VuMzogY2MgbmVlZHMgLUogdG8gY29tcGlsZSBjcC1wYXJzZS5jIGNvcnJlY3RseQotCi0JKiBjb25maWcvbWgtc29sYXJpczogU3VuUFJPIEMgbmVlZHMgLVhzIHRvIGJlIGFibGUgdG8gZ2V0IGEKLQl3b3JraW5nIHhtYWtlZmlsZSBmb3IgRW1hY3MuCi0KLVRodSBNYXIgMjUgMTU6MTQ6MzAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgSW5jb3Jwb3JhdGUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgd2lsc29uQGN5Z251cy5jb20KLQlmb3IgaGFuZGxpbmcgQklTT04gZm9yIEZTRiByZWxlYXNlcy4KLQotVGh1IE1hciAyNSAwNjoxOTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY3R1YWxseSBpbXBsZW1lbnQgdGhlIGNoYW5nZSB6b28ganVzdCBkb2N1bWVudGVkLgotCi1XZWQgTWFyIDI0IDEzOjAyOjQ0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHdoZW4gdXNpbmcgY29uZmlnLmd1ZXNzLCBvbmx5IHNldCB0YXJnZXRfYWxpYXMgd2hlbgotCWl0J3Mgbm90IGFscmVhZHkgYmVlbiBzZXQgKGllLCBvbiB0aGUgY29tbWFuZCBsaW5lKQotCi1Nb24gTWFyIDIyIDIzOjA3OjM5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0LCBzZXQgUFJNUyB0byBpbnN0YWxsLXBybXMKLQotU3VuIE1hciAyMSAxNjo0NjoxMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkIHN1cHBvcnQgZm9yIHBhY2thZ2VfbWFrZWZpbGVfZnJhZ21lbnQsIGhhbmRsZSB0aGUKLQljYXNlIHdoZXJlIGEgZGlyZWN0b3J5IGhhcyBhIGNvbmZpZ3VyZS5pbiBmaWxlIGJ1dCBubyBNYWtlZmlsZS5pbgotCW1vcmUgZ3JhY2VmdWxseSAod2l0aCBhbiBhY3R1YWwgdW5kZXJzdGFuZGFibGUgZXJyb3IgbWVzc2FnZSwgZXZlbik7Ci0JYWRkIHN1cHBvcnQgZm9yIC0td2l0aG91dCAoYW5kIGFkZCB0aGlzIHRvIHRoZSB1c2FnZSBtZXNzYWdlKTsgYWxzbwotCWV4cGxpY2l0bHkgYWRkIGEgLS1ob3N0PSR7aG9zdF9hbGlhc30gdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuCi0JY29uZmlnLmd1ZXNzIGlzIHVzZWQKLQotU3VuIE1hciAyMSAxMjoxMTo1OCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTXVzdCB1c2UgYm90aCAtLWhvc3QgYW5kIC0tdGFyZ2V0IGluIHJlY3Vyc2l2ZSBjYWxscy4KLQotVGh1IE1hciAxOCAxMjozMTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZGVqYS1nbnUgdG8gZGVqYWdudS4KLQotTW9uIE1hciAxNSAxNTo0NDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaDgzMDAtKi0qLCBoODUwMC0qLSopOiBEb24ndCBidWlsZCBsaWJnKysuCi0KLUZyaSBNYXIgMTIgMTg6MzA6MTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNhbm9uaWNhbGl6ZSBhbGwgaW5zdGFuY2VzIHRvICotKi1zb2xhcmlzMiosCi0JYWxzbyBzdHJpcCBvdXQgYSBudW1iZXIgb2YgdG9vbHMgdG8gbm90IGJ1aWxkIGZvciBnbzMyIGhvc3QKLQotV2VkIE1hciAxMCAxMjowODoyNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkIEdQTC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwgY29uZmlndXJlOiBidW1wCi0JICBjb3B5cmlnaHRzIHRvIDkzLgotCi1XZWQgTWFyIDEwIDA3OjEyOjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRvLWluZm8pOiBSZW1vdmVkIG9ic29sZXRlIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YKLQlsb2NhbGVudiBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotV2VkIE1hciAxMCAwMzoxMTo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhIGNvdXBsZSBvZiAnZWxzZSB0cnVlJyBmb3IgZGVjc3RhdGlvbiwKLQlzdXBwb3J0IGZvciBUY2xYCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIHRjbFggdG9vOyBkb24ndCByZW1vdmUgVGsgb24gUlMvNjAwMCBhbnltb3JlCi0KLVR1ZSBNYXIgIDkgMTY6MDY6MTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzKTogY2hhbmdlIGludm9jYXRpb24gb2YgbWFrZSB0byAkKE1BS0UpLgotCi1Nb24gTWFyICA4IDE0OjUyOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGkzODYtaWJtLWFpeCAoUFMvMikuCi0JKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtYWl4Mzg2IGZpbGUgZm9yIGl0LgotCi1Nb24gTWFyICA4IDExOjEyOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdDQ19GT1JfVEFSR0VUKTogRWxpbWluYXRlZCBkZWZpbml0aW9uOyB1c2UKLQlDQ19GT1JfVEFSR0VUIGluc3RlYWQuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgR0NDX0ZPUl9UQVJHRVQ9JChDQ19GT1JfVEFSR0VUKS4KLQotV2VkIE1hciAgMyAxNjowMDoyOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bvay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNpbSB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlbnQgd2l0aCBnZGIKLQotV2VkIE1hciAgMyAxMTo0MjozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBQdXQgYmFjayBtaXBzLWRlYy1ic2QqIGNhc2UuCi0KLVR1ZSBNYXIgIDIgMjE6MTU6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkoVWx0cml4IDIuMiBzdXBwb3J0IGZyb20gTWljaGFlbCBSZW5kZWxsIDxtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhPikKLQkqIGNvbmZpZ3VyZS5pbiAodmF4LSotdWx0cml4MiopOiAgQWRkIFVsdHJpeCAyLjIgdHJpcGxldC4KLQkqIGNvbmZpZy5ndWVzczogIENoYW5nZSAnVkFYKjpVTFRSSVg6KjoqJyB0byAnVkFYKjpVTFRSSVgqOio6KicuCi0JKiBjb25maWcvbWgtdmF4dWx0MjogIE5ldyBmaWxlLgotCi1UdWUgTWFyICAyIDE4OjExOjAzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbm8tb3AgbWlwcy1kZWMtYnNkKiBpbiAiY2FzZSAkdGFyZ2V0IgotCi0JKiBNYWtlZmlsZS5pbiAoZGlyLmluZm8pOiBvbmx5IHJ1biBnZW4taW5mby1kaXIgaWYgaXQgZXhpc3RzLAotCShpbnN0YWxsLWluZm8pOiBpbnN0YWxsIGRpci5pbmZvIG9ubHkgaWYgaXQgZXhpc3RzLAotCShhbGwtZXhwZWN0LCBpbnN0YWxsLWV4cGVjdCk6IHBhc3MgYWxvbmcgWDExX0ZMQUdTX1RPX1BBU1MKLQotVHVlIE1hciAgMiAwOTowMTozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3Igdm1zIHRhcmdldCwgc2tpcCBiZmQsIGxkLCBiaW51dGlscy4gIERvIGJ1aWxkCi0JZ2FzIGZvciBtaXBzLWRlYy1ic2QuCi0KLVR1ZSBNYXIgIDIgMDg6MzU6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKG1ha2VzcmNkaXIpOiBJZiAke3NyY2Rpcn0gaXMgcmVsYXRpdmUgYW5kIG5vdCAiLiIsCi0JYW5kICR7c3ViZGlyfSBpcyBub3QgIi4iLCBzZXQgbWFrZXNyY2RpciBiYXNlZCBvbiAke2ludnN1YmRpcn0uCi0KLVR1ZSBGZWIgMjMgMTQ6MTg6MjggMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGRlZCAiZGVqYWdudSIgdG8gaG9zdHRvb2xzIGxpc3QuCi0KLU1vbiBGZWIgMjIgMjM6Mjg6MzggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4sIGNvbmZpZy5ndWVzczogIEFkZCBzdXBwb3J0Ci0JZm9yIEJvc3gsIGFuIEFJWCB2YXJpYW50IGZyb20gQnVsbC4KLQlQYXRjaGVzIGZyb20gRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyLgotCi1TdW4gRmViIDIxIDExOjE1OjIyIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGRldm8vZGVqYWdudTogSW5pdGlhbCBjcmVhdGlvbiBvZiBkZXZvL2RlamFnbnUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgc29mdHdhcmUKLQl0b29scyB0byByZXNpZGUgYXMgc3ViZGlyZWN0b3JpZXMsIGN1cnJlbnRseSBjYWxsZWQgInRlc3RzdWl0ZSIsCi0Jd2l0aGluIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHNvZnR3YXJlIHRvb2wuICBNaWdyYXRlZCBhbGwgcHJvZ3JhbXMsCi0Jc3VwcG9ydCBsaWJyYXJpZXMsIGV0Yy4gYmVsb2dpbmcgdG8gZGVqYWdudSBwcm9wZXIgZnJvbQotCWRldm8vZGVqYS1nbnUgdG8gZGV2by9kZWphZ251LglUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKLQl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuCVRoZSBjaGFuZ2VzIHRvIHRoZXNlIGZpbGVzIHdoaWNoIHdpbGwKLQlhbGxvdyB0aGVtIHRvIGNvbmZpZ3VyZSwgYnVpbGQsIGFuZCBleGVjdXRlIHByb3Blcmx5IHdpbGwgYmUgbWFkZQotCWluIGEgZnV0dXJlIHVwZGF0ZS4KLQotRnJpIEZlYiAxOSAyMDoxOTozOSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc2VuZF9wciB0byBzZW5kLXByLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIHNlbmRfcHI6IFJlbmFtZWQgZGlyZWN0b3J5IHRvIHNlbmQtcHIuCi0KLUZyaSBGZWIgMTkgMTk6MDA6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHNvbWUgZXh0cmEgc2VtaS1jb2xvbnMgKG5lZWRlZCBpZiBTSEVMTD1iYXNoKS4KLQotRnJpIEZlYiAxOSAwMDo1OTozMyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVXBkYXRlIGZvciBnZGItNC44IHJlbGVhc2UuCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIEFkZCB0ZXhpbmZvL3RleDNwYXRjaC4gIEJ1aWxkCi0JZ2RiLXh4eC50YXIueiAoZ3ppcCdkKSBmaWxlIGFsc28uCi0KLVRodSBGZWIgMTggMDk6MTY6MTcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBhbGwtZGlmZiBkZXBlbmQgb24gYWxsLWxpYmliZXJ0eQotCi1UdWUgRmViIDE2IDE2OjA2OjMxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCB2YXgtdWx0cml4IGluIHRoZSBzcGlyaXQgb2YgbWlwcy11bHRyaXguCi0KLVR1ZSBGZWIgMTYgMDU6NTc6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBhZGQgaGVsbG8sIHRhciwgZ3ppcCwgcmVjb2RlLCBpbmRlbnQKLQotVHVlIEZlYiAxNiAwMDo1ODoyMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6ICBSZW1vdmUgZXRjIGRpcmVjdG9yeQotCShFVENfU1VQUE9SVCk6ICBPbmx5IGFkZCB0aGUgZmlsZXMgR0RCIHdhbnRzIGZyb20gZXRjLy4KLQkoZ2RiLnRhci5aKTogIFVzZSBFVENfU1VQUE9SVC4gIFVzZSBieWFjYyB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlLgotCi1UaHUgRmViIDExIDIwOjE0OjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBtYWtlaW5mbyBiaW5hcnkgaXMgaW4gYSBuZXcgbG9jYXRpb24KLQotVHVlIEZlYiAgOSAxMjo0MjoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtZWNvZmYgYXMgYW4gT1MuCi0KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgdG8gZWxpbWluYXRlIGEgbGV2ZWwgb2YgbWFrZQotCXJlY3Vyc2lvbiBhbmQgcmVkdWNlIHRoZSByZXF1aXJlZCBjb21tYW5kIGxpbmUgbGVuZ3RoLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBOZXcgdmFyaWFibGUgaG9sZGluZyBmbGFncyBwYXNzZWQgdG8gYWxsCi0Jc3ViLW1ha2VzLgotCShFWFRSQV9IT1NUX0ZMQUdTLCBFWFRSQV9UQVJHRVRfRkxBR1MsIEVYVFJBX0dDQ19GTEFHUyk6IE5ldwotCXZhcmlhYmxlcyBob2xkaW5nIHNldHRpbmdzIGZvciBzcGVjaWZpYyBzdWItbWFrZXMuCi0JKEZMQUdTX1RPX1BBU1MsIFRBUkdFVF9GTEFHU19UT19QQVNTLCBHQ0NfRkxBR1NfVE9fUEFTUyk6IFJld3JvdGUKLQlpbiB0ZXJtcyBvZiBCQVNFX0ZMQUdTX1RPX1BBU1MuCi0JKFRBUkdFVF9MSUJTKTogTmV3IHZhcmlhYmxlIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2hpY2ggdXNlCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0JKHN1YmRpcl9kbyk6IEVsaW1pbmF0ZWQuCi0JKGRvLSopOiBOZXcgc2V0IG9mIHRhcmdldHMgdG8gcmVwbGFjZSBzdWJkaXJfZG8uCi0JKHZhcmlvdXMpOiBBbGwgdGFyZ2V0cyB3aGljaCB1c2VkIHN1YmRpcl9kbyBub3cgZGVwZW5kIG9uIGRvLSouCi0JKGxvY2FsLWNsZWFuKTogUmVuYW1lZCBmcm9tIGRvX2NsZWFuLgotCShsb2NhbC1kaXN0Y2xlYW4pOiBOZXcgdGFyZ2V0LCBkZXBlbmRlbmN5IG9mIGRpc3RjbGVhbiBhbmQKLQlyZWFsY2xlYW4uCi0JKGluc3RhbGwtaW5mbyk6IERvbid0IGNyZWF0ZSBkaXJlY3Rvcmllcy4gIERlcGVuZCBvbiBkaXIuaW5mbwotCXJhdGhlciB0aGFuIGNhbGxpbmcgbWFrZSByZWN1cnNpdmVseS4KLQkoaW5zdGFsbC1kaXIuaW5mbyk6IEVsaW1pbmF0ZWQuCi0JKGluc3RhbGwtaW5mby1kaXJzKTogQ3JlYXRlIGFsbCBpbmZvIGRpcmVjdG9yaWVzIGhlcmUuCi0JKGRpci5pbmZvKTogRGVwZW5kIHVwb24gZG8taW5zdGFsbC1pbmZvLgotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZGVkIGZhbHNlLgotCi1TYXQgRmViICA2IDE0OjA1OjA5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIEJTREkgYW5kIEJTREogKEpvbGl0eiAzODZic2QpLgotCi1UaHUgRmViICA0IDIwOjQ5OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluZm8pOiByZW1vdmUgZGVwZW5kZW5jeSBvbiBhbGwtdGV4aW5mby4gIFRoZQotCXByb2JsZW0gd2FzIHJlYWxseSBpbiB0ZXhpbmZvL0MsIG5vdCBhdCB0aGlzIGxldmVsLgotCi1UaHUgRmViICA0IDEzOjM4OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluZm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGFsbC10ZXhpbmZvIChQUiAyMTEyKS4KLQotVGh1IEZlYiAgNCAwMTo1MDo1MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIENoYW5nZSBCSVNPTiB0byAnYmlzb24gLXknIGZvcgotCUdEQiByZWxlYXNlcy4KLQotV2VkIEZlYiAgMyAxNzoyMjoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSW5jbHVkZSBzcmNkaXIgaW4gbWVzc2FnZSBhYm91dCB0YXJnZXQgb2YgbGluayBub3QKLQliZWluZyBmb3VuZC4gIERvbid0IGNvbnZlcnQgYC0nIHRvIGBfJyBpbiBgd2l0aCcgb3B0aW9ucyBiZWluZwotCXBhc3NlZCB0byBzdWJkaXJzLgotCi1UdWUgRmViICAyIDE4OjU3OjU5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgdXVkZWNvZGUgdG8gaG9zdF90b29scwotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQge2FsbCxpbnN0YWxsfS11dWRlY29kZSB0YXJnZXRzLCBhZGRlZCB0aGVtIHRvCi0JdGhlIGFwcHJvcHJpYXRlIGxpc3RzCi0KLVR1ZSBGZWIgIDIgMTE6NDU6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYWxsLWdhcy4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotKik6IEJ1aWxkIGxkIGFuZCBiaW51dGlscy4KLQotTW9uIEZlYiAgMSAxMjozNTo0MSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogY2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBta2RpciwgcHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQKLQkgIGV4aXQgb24gZmFpbHVyZS4KLQotU2F0IEphbiAzMCAxNjo0MDoyOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIE5ldyBsb2NhdGlvbiBmb3IgdGV4aW5mby50ZXguCi0KLVRodSBKYW4gMjggMTU6MDk6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZGVkIHRhciwgY3BpbyBhbmQgdXVkZWNvZGUuCi0KLVdlZCBKYW4gMjcgMTY6NTA6MzIgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChoODUwMCk6ICBSZWNvZ25pemUgdGhpcyBhcyBhIGNwdSB0eXBlLgotCi1TYXQgSmFuIDIzIDIwOjMyOjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBzb3VyY2UgZGlyZWN0b3J5IG1pc3NpbmcgaXMgbm8gbG9uZ2VyIGEgd2FybmluZwotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpcml4WzM0XSogaW5zdGVhZCBvZiBpcml4WzM0XQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIGFuZCBwYXNzIGRvd24gWDExX0xJQgotCi0JKiBjb25maWcvbWgtc2NvOiBkZWZpbmUgWDExX0xJQiB0byB0aGUgbWVzcyB0aGF0IFNDTyBPRFQgcmVxdWlyZXMKLQotU2F0IEphbiAyMyAxMzo0OTo0MCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZ3Vlc3Mtc3lzdHlwZTogUmVuYW1lZCB0byAuLi4KLQkqIGNvbmZpZy5ndWVzczogIC4uLiBieSBwb3B1bGFyIHJlcXVlc3QuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1UaHUgSmFuIDIxIDEyOjIwOjU1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiAgUGF0Y2hlcyBmcm9tIEpvaG4gRWF0b24gPGp3ZUBjaGUudXRleGFzLmVkdT46Ci0JKyBBZGQgQ29udmV4LCBDcmF5L1VuaWNvcywgYW5kIEVuY29yZS9NdWx0aW1heCBzdXBwb3J0LgotCSsgRXhlY3V0ZSAuL2R1bW15IGluc3RlYWQgb2YgYXNzdW1pbmcgLiBpcyBpbiBQQVRILgotCi1UdWUgSmFuIDE5IDE3OjE4OjA2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiAgTmV3IHNoZWxsIHNjcmlwdC4gIEF0dGVtcHRzIHRvIGd1ZXNzIHRoZQotCWNhbm9uaWNhbCBob3N0IG5hbWUgb2YgdGhlIGV4ZWN1dGluZyBob3N0LgotCU9ubHkgYSBmZXcgaG9zdHMgYXJlIHN1cHBvcnRlZCBzbyBmYXIuCi0JKiBjb25maWd1cmU6ICBDYWxsIGd1ZXNzLXN5c3R5cGUgaWYgbm8gaG9zdCBpcyBzcGVjaWZpZWQuCi0KLVR1ZSBKYW4gMTkgMDg6MjY6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBNYWRlIHRvIHdvcmsgd2l0aCBjdXJyZW50Ci0JZ2NjIE1ha2VmaWxlLgotCi0KLUZyaSBKYW4gMTUgMTA6Mjc6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZMQUdTX1RPX1BBU1MpOiBOZXcgdmFyaWFibGUuCi0JKGFsbC1nY2MsIGluc3RhbGwtZ2NjLCBzdWJkaXJfZG8pOiBVc2UgaXQuCi0KLVdlZCBKYW4gMTMgMTc6MDY6NDUgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVuYW1lIHVuaW5zdGFsbGVkIGdjYyBkcml2ZXIgZnJvbSBnY2MgdG8geGdjYy4KLQotV2VkIEphbiAgNiAyMDoyOToxNiAxOTkzICBNaWtlIFdlcm5lciAgKG10d0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZWQgZXhwbGljaXQgc2V0dGluZyBvZiBTVUJESVJTLiBTVUJESVJTIGlzIG5vdwotCSAgc2V0IGV4Y2x1c2l2ZWx5IGJ5IGNvbmZpZ3VyZSwgdXNpbmcgY29uZmlndXJlLmluIC4KLQotV2VkIEphbiAgNiAxMzo0NDoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHNldCAkUEFUSCBmb3IgYWxsIGJ1aWxkcwotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBUQVJHRVRfRkxBR1NfVE9fUEFTUyBmb3IgeGliZXJ0eSBhbmQgbGlibQotCi1XZWQgSmFuICA2IDExOjAyOjEwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZPUl9UQVJHRVQpOiAgU3VwcGx5IGEgZGVmYXVsdCB0aGF0IG1hdGNoZXMKLQl0aGUgb25lIHVzZWQgaW4gZ2NjL01ha2VmaWxlLmluLCBzbyB0aGF0IGEgbnVsbCBleHBhbnNpb24gZG9lc24ndAotCW92ZXJyaWRlIHRoZSBvbmUgbmVlZGVkIHRvIGJ1aWxkIGdjYyB3aXRoIGEgbmF0aXZlIGNjLgotCi0KLVR1ZSBKYW4gIDUgMDc6NTU6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjY2VwdCAtd2l0aCBhcmd1bWVudHMuCi0KLVN1biBKYW4gIDMgMTU6MTU6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBoODMwMHNpbQotCi1UdWUgRGVjIDI5IDE1OjA2OjAwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNjbzogRG9uJ3Qgb3ZlcnJpZGUgQklTT04gZGVmaW5pdGlvbi4KLQotCSogYnVpbGQtYWxsLm1rOiBJZiBjYW5vbmhvc3QgaXMgaTM4Ni11bmtub3duLXNjbzMuMnY0LCBjaGFuZ2UgaXQKLQl0byBpMzg2LXNjbzMuMnY0LiAgU2V0IFRBUkdFVFMgYW5kIENGTEFHUyBmb3IgaTM4Ni1zY28zLjJ2NC4KLQkoYWxsLWN5Z251cywgbmF0aXZlLCBidWlsZC1jeWdudXMpOiBNYWtlCi0JJChjYW5vbmhvc3QpLXN0YW1wLTNzdGFnZS1kb25lLCBub3QgJChob3N0KS4uLi4KLQkqIHRlc3QtYnVpbGQubWsgKHN0YW1wLTNzdGFnZS1jb21wYXJlZCk6IFVzZSB0YWlsICsxMGMgZm9yCi0JaTM4Ni1zY28zLjJ2NC4gIEFkZGVkIGVsc2UgdHJ1ZSB0byBpZiBjb21tYW5kLgotCi1Nb24gRGVjIDI4IDEyOjA4OjU2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAoZnJvbSBGU0YpIFNlcXVlbnQgdXNlcyBhIEJTRC1saWtlIE9TLgotCi1Nb24gRGVjIDI4IDA4OjMyOjA2IDE5OTIgIE1pbmggVHJhbi1MZSAgKG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1pc2MqKTogYWRkZWQ7IHVzZXMgbWgtc3lzdi4KLQotVGh1IERlYyAyNCAxNzoyNjoyNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgcmVtb3ZlIGJpbnV0aWxzIGZyb20gU29sYXJpcyBidWlsZHMKLQotVGh1IERlYyAyNCAxNDowODozOCAxOTkyIGRhdmlkIGRgem9vJyB6dWhuICAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgcmlkIG9mIGVhcmxpZXIgZGVmaW5pdGlvbnMgZm9yICpjbGVhbiwKLQlhbHNvIGhhbmRsZSB0aGUgcmVjdXJzaXZlIGluZm8gcnVsZSBiZXR0ZXIKLQotVGh1IERlYyAyNCAxMjo0MDoyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCByZWFsY2xlYW4pOiAgRml4IHRvCi0JZG8gbW9yZS1vci1sZXNzIHRoZSByaWdodCB0aGluZy4KLQotV2VkIERlYyAxNiAxMDoyNTozMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGluZXMgZGVmaW5pbmcgQ0MgYW5kIENYWCwgYW5kIHVzZSBDWFggcmF0aGVyCi0JdGhhbiBnY2MgaW4gZGVmaW5pdGlvbnMgb2YgQ1hYX0ZPUl9CVUlMRCBhbmQgQ1hYX0ZPUl9UQVJHRVQuCi0KLVR1ZSBEZWMgMTUgMDA6MzQ6MzIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlIGFsbCAkKGhvc3RfY3B1KS0kKGhvc3RfdmVuZG9yKS0kKGhvc3Rfb3MpIHRvCi0JJChob3N0X2Nhbm9uaWNhbCkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3BsaXQgdGhlIGNvbmZpZ2RpcnMgbGlzdCBpbnRvIDQgY2F0ZWdvcmllcyAobmF0aXZlCi0Jdi4gY3Jvc3MsIGxpYnJhcnkgdi4gdG9vbCkgYW5kIGhhbmRsZSB0aGUgY3Jvc3Mtb25seSBhbmQgbmF0aXZlLQotCW9ubHkgaW4gbW9yZSByZWFzb25hYmxlIChhbmQgY29ycmVjdCEpIHdheS4KLQotTW9uIERlYyAxNCAxNzowNDoyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKik6ICBEb24ndCByZW1vdmUgYmZkIGFuZCBnZGIgZnJvbQotCWNvbmZpZ2RpcnMgYW55bW9yZS4KLQotU3VuIERlYyAxMyAwMDozNzoyNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBleHRlbnNpdmUgY2xlYW51cDo6ICByZW1vdmVkIGFsbCBvZiB0aGUgZXhwbGljaXQKLQljbGVhbi0qIHRhcmdldHMsIGNvbGxhcHNlZCBtYW55IHdyYXBwZXJzIGFyb3VuZCBzdWJkaXJfZG8gaW50bwotCW9uZSwgYWRkZWQgYWRkaXRpb25hbCB0YXJnZXRzIHRvIHNhdGlzZnkgc3RhbmRhcmRzLnRleGksIGRlbGV0ZWQKLQlzb21lIG9sZCB0YXJnZXRzLCBzb21lIGNoYW5nZXMgZm9yIGNvbnNpc3RlbmN5Ci0KLUZyaSBEZWMgMTEgMjA6MTg6MDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBzb21lIHByb2dyYW1zIGFzIGNyb3NzLW9ubHksIGFuZCBvdGhlcnMgYXMKLQluYXRpdmUgb25seQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBoYW5kbGUgcGFydGlhbCBob2xlcyBpbiBhIG1vcmUgZ2VuZXJpYyBtYW5uZXIKLQotCSogTWFrZWZpbGUuaW46IG00IGRlcGVuZHMgb24gbGliaWJlcnR5Ci0KLU1vbiBEZWMgIDcgMDY6NDM6MjcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc2NvOiBkb24ndCBkZWZhdWx0ICQoQ0MpIHRvIGdjYwotCi1UaHUgRGVjICAzIDIxOjUyOjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgbTQsIHRleHR1dGlscywgZmlsZXV0aWxzLCBzZWQsIHNoZWxsdXRpbHMsCi0JdGltZSwgd2RpZmYsIGFuZCBmaW5kIHRvIGNvbmZpZ2RpcnMKLQotCSogTWFrZWZpbGUuaW46IGFsbCwgY2xlYW4sIGFuZCBpbnN0YWxsIHJ1bGVzIGZvciB0aGUgbmV3IHByb2dyYW1zCi0JYWRkZWQgdG8gY29uZmlndXJlLmluCi0KLU1vbiBOb3YgMzAgMTQ6NTQ6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1zdW4gZm9yIGFsbCAqLXN1bi0qIGhvc3RzCi0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiByZXdvcmsgc3RhbmRhcmQgWCBsb2NhdGlvbiB0byB1c2UKLQkkT1BFTldJTkhPTUUsIGlmIGRlZmluZWQuCi0KLQkqIGNvbmZpZy9taC1zdW46IGhhbmRsZSBYMTEgaW5jbHVkZSBsb2NhdGlvbnMKLQotCSogY29uZmlnL21oLWRlY3N0YXRpb246IGRlZmluZSBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzIHRvIDAsIHRvCi0Jd29yayBhcm91bmQgZGFpbi1icmFtYWdlZCBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMKLQotRnJpIE5vdiAyNyAxODozNTo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgZmxhZ3MgZm9yIFgxMSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJ5IGZpbGUKLQlsb2NhdGlvbnMsIHBhc3MgdGhlbSBkb3duIHRvIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgdGhpcyBpbmZvCi0KLQkqIGJ1aWxkLWFsbC5tazogYWRkZWQgYSAnbmF0aXZlJyB0YXJnZXQsIHRvIDNzdGFnZSB0aGUgbmF0aXZlIHRvb2xjaGFpbgotCi0JKiBjb25maWcve21oLWhwdXgsbWgtc29sYXJpc306IGRlZmluZSB0aGUgInN0YW5kYXJkIiBsb2NhdGlvbnMgZm9yCi0JdGhlIHZlbmRvciBzdXBwbGllZCBYMTEgaGVhZGVycyBhbmQgbGlicmFyaWVzCi0KLVN1biBOb3YgMjIgMTg6NTk6MTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHN0YXJ0IGJ1aWxkaW5nIGxpYmcrKyBmb3IgSFAtVVggdGFyZ2V0cwotCi1XZWQgTm92IDE4IDE5OjMzOjExIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgcmVmZXJlbmNlcyB0byBmaWxlcyBtb3ZlZCBpbnRvIGV0Yy8uCi0KLVN1biBOb3YgMTUgMDk6MzY6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGkzODZzb2wyLCBpNDg2c29sMik6ICBpWzM0XTg2LXVua25vd24tc29sYXJpczIuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zb2xhcmlzMiopOiAgVXNlIGNvbmZpZy9taC1zeXN2NC4KLQotVGh1IE5vdiAxMiAwODo1MDo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWNjZXB0IGRhc2ggYXMgd2VsbCBhcyB1bmRlcnNjb3JlIGluIGxvbmcgb3B0aW9uCi0JbmFtZXMgZm9yIEZTRiBjb21wYXRpYmlsaXR5LgotCi1XZWQgTm92IDExIDA4OjA0OjM3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWRkZWQgLXNjbzMuMnY0IHN1cHBvcnQgZnJvbSBGU0YuCi0KLVN1biBOb3YgIDggMjE6MTQ6MzAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGV4cGFuZCB0aGUgc2VjdGlvbiB0aGF0IGFkZHMgb3IgcmVtb3ZlcwotCWRpcmVjdG9yaWVzIGZyb20gdGhlIGxpc3Qgb2YgcHJvZ3JhbXMgdG8gYnVpbGQsIHRvIGhhbmRsZSBuYXRpdmUKLQl2cy4gY3Jvc3MgaW4gYWRkaXRpb24gdG8gaG9zdCB2LiBuYXRpdmUKLQotU2F0IE5vdiAgNyAxODo1MjoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVwbGFjZSBDKysgaW4gbWFjcm8gbmFtZXMgd2l0aCBDWFguCi0JVGhpcyBpcyBsZXNzIGxpa2VseSB0byBicmVhayAuLi4KLQotU2F0IE5vdiAgNyAxNToxNjo1OCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IGFkZCAtdyB0byBHTlVfTUFLRQotCi1GcmkgTm92ICA2IDIzOjEwOjM3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVtb3ZlICdzcGFyYyctLT4nc3BhcmMtc3VuJyBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uLAotCWFkZCAnc3BhcmMnIHRvIGxpc3Qgb2YgcmVjb2duaXplZCBjcHVzLiAgVGhpcyBuZWVkZWQgdG8gbWFrZQotCSdzcGFyYy1hb3V0JyBleHBhbmQgdG8gJ3NwYXJjLXVua25vd24tYW91dCcgaW5zdGVhZCBvZiAnc3BhcmMtc3VuLWFvdXQnLgotCURlbGV0ZSBzb21lIHJlZHVuZGFudCBvc2U2OCB2YXJpYW50cy4gIFJlY29nbml6ZSAtd3JzIGFzIGFuIG9zLAotCXRoZW4gY2hhbmdlcyB0aGF0IGludG8gJENQVS13cnMtdnh3b3Jrcy4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbW9zdCByZWZlcmVuY2VzIHRvIGdkYnRlc3QsIHJlZ3VsYXJpemUKLQl0YXJnZXQgYmFzZWQgcHJvZ3JhbSByZW1vdmFsCi0KLQkqIHRlc3QtYnVpbGQubWs6IGltcG9ydCBmcm9tIHAzIHRyZWUgKG1hbnkgZml4ZXMgYW5kIGNoYW5nZXMpCi0KLUZyaSBOb3YgIDYgMjA6NTk6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBydWxlcyB0byBoYW5kbGUgdGNsLCB0aywgYW5kIGV4cGVjdAotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSB0aG9zZSBkaXJlY3RvcmllcyBpZiB0aGV5IGV4aXN0Ci0KLVRodSBOb3YgIDUgMTQ6MzU6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZW1vdmVkIGJvZ3VzIGhwcGFic2QgYW5kIGhwcGFocHV4IG5hbWVzLCBzaW5jZQotCSJocHBhIiBpcyBub3QgYSB2YWxpZCBjcHUgKGhwcGExLjEgb3IgaHBwYTEuMCBhcmUsIHRob3VnaCkKLQotVGh1IE9jdCAyOSAwMDoxMjo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbGwtZ2NjIG5vdyBkZXBlbmRzIG9uIGFsbC1iaW51dGlscy4gIGFsbC1saWJnKysKLQlkZXBlbmRzIHVwb24gYWxsLXhpYmVydHkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZXMgZnJvbSBwMywgaW5jbHVkaW5nOgotCi0JVGh1IE9jdCAgOCAxNTowMDoxNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBpbmNsdWRlIG5ld2xpYiBkaXJlY3RvcmllcyBpZgotCW5ld2xpYi9NYWtlZmlsZSBleGlzdHMsIHJhdGhlciB0aGFuIGlmIGhvc3QgIT0gdGFyZ2V0LgotCi0JRnJpIFNlcCAyNSAxMzo0MTo1MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtbm9zdGRpbmMgdG8gWFRSQUZMQUdTIGlmIHdlIGFyZSB1c2luZyBnY2MKLQlmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlIGFuZCBub3QgYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlci4gIFRoaXMKLQltYXR0ZXJzIGZvciB0aGUgbGliZysrIGNvbmZpZ3VyYXRpb24gaWYgcmVjb25maWd1cmluZyBhIHRyZWUgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotCi0JVGh1IFNlcCAxMCAxMDozNTo1MSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtSSBmb3IgbmV3bGliL3RhcmctaW5jbHVkZSB0byBYVFJBRkxBR1MsIHRvCi0JcGljayB1cCB0aGUgbWFjaGluZSBhbmQgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIEFTX0ZPUl9UQVJHRVQsIHBhc3NlZCBkb3duIGluCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBBZGRlZCBDQ19GT1JfQlVJTEQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlCi0JdGhlIEMgY29tcGlsZXIgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBhcmUgcnVuIGluIHRoZQotCWJ1aWxkIGVudmlyb25tZW50LCBzZXQgaXQgdG8gZGVmYXVsdCB0byAkKENDKSwgYW5kIHBhc3NlZCBpdCBkb3duCi0JaW4gRkxBR1NfVE9fUEFTUyBhbmQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0KLQlNb24gU2VwICA3IDIyOjM0OjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgJChob3N0KSA9ICQodGFyZ2V0KSB0ZXN0cyBiYWNrIHRvICpfRk9SX1RBUkdFVC4KLQlXZSBuZWVkIHRoZW0gZm9yIHVudXN1YWwgbmF0aXZlIGJ1aWxkcywgbGlrZSBzeXN0ZW1zIHdpdGhvdXQKLQlyYW5saWIuCi0KLQkqIGNvbmZpZ3VyZTogYWxzbyBkZWZpbmUgJChob3N0X2Nhbm9uaWNhbCkgYW5kCi0gICAgICAgICQodGFyZ2V0X2Nhbm9uaWNhbCksIHdoaWNoIGFyZSB0aGUgZnVsbCwgY2Fub25pY2FsIG5hbWVzIGZvciB0aGUKLSAgICAgICAgZ2l2ZW4gaG9zdCBhbmQgdGFyZ2V0Ci0KLVN1biBOb3YgIDEgMTY6Mzg6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgc2VwYXJhdGUgZGVmaW5pdGlvbnMgZm9yIEMrKy4KLQotRnJpIE9jdCAzMCAxMTozNzo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogIEFkZCBkZWphLWdudS4KLQotRnJpIE9jdCAyMyAwMDozOToxOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVXBkYXRlIGZvciBjb25maWd1cmUudGV4aSBhbmQgZ2RiLTQuNyByZWxlYXNlLgotCi1XZWQgT2N0IDIxIDIxOjU0OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1vdmUgImFsbCIgdGFyZ2V0IHRvIHRvcCBvZiBmaWxlLgotCVByZXZpb3VzbHksIGZpcnN0IHRhcmdldCB3YXMgIi5QSE9OWSIgd2hpY2ggY2F1c2VkIEJTRDQuNCBtYWtlCi0JdG8gYnVpbGQgLlBIT05ZIHdoZW4gbWFrZSB3YXMgcnVuIHdpdGhvdXQgYXJndW1lbnRzLgotCi1Nb24gT2N0IDE5IDAxOjE3OjU0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBDT1BZSU5HLkxJQiB0byBHREIgcmVsZWFzZXMsIG5vdyB0aGF0IHRoZXJlJ3MKLQlMaWJyYXJ5LWNvcHlsZWZ0ZWQgY29kZSBpbiBsaWJpYmVydHkuCi0KLVR1ZSBPY3QgMTMgMDE6MjI6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZXBsYWNlIG02OGttb3RlIHdpdGggcGxhaW4gb2xkIG02OGsuCi0KLUZyaSBPY3QgIDkgMDM6MTQ6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHNwYWNlIGZyb20gYmxhbmsgbGluZSwgYXZvaWQgTWFrZSBjb21wbGFpbnRzLgotCi1UaHUgT2N0ICA4IDE4OjQxOjQ1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDb21wbGFpbiBpZiBubyBhcmd1bWVudCBpcyBnaXZlbi4gIEFkZGVkIHN1cHBvcnQgZm9yCi0JMzg2YnNkIGFzIE9TIGFuZCB0YXJnZXQgYWxpYXMuCi0KLVRodSBPY3QgIDggMTU6MDc6MjIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogaW5jbHVkZSBuZXdsaWIgZGlyZWN0b3JpZXMgaWYKLQluZXdsaWIvTWFrZWZpbGUgZXhpc3RzLCByYXRoZXIgdGhhbiBpZiBob3N0ICE9IHRhcmdldC4KLQotTW9uIE9jdCAgNSAwMzowMDowOSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlY29nbml6ZSBzcGFyY2xpdGUtd3JzLXZ4d29ya3MuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXhpYmVydHkpOiBhZGRlZCAqLXhpYmVydHkgbWFrZSBydWxlcyAoZnJvbQotCXAzLikgQWRkZWQgY2xlYW4teGliZXJ0eSB0byBjbGVhbi4KLQotVGh1IE9jdCAgMSAxNzo1OToxOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlICotKi0qIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzIGZvciBob3N0IGFuZCB0YXJnZXQKLQotVHVlIFNlcCAyOSAxNDoxMToxOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtbm9zdGRpbmMgdG8gWFRSQUZMQUdTIGlmIHdlIGFyZSB1c2luZyBnY2MKLQlmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlIGFuZCBub3QgYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlci4gIFRoaXMKLQltYXR0ZXJzIGZvciB0aGUgbGliZysrIGNvbmZpZ3VyYXRpb24gaWYgcmVjb25maWd1cmluZyBhIHRyZWUgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotCi1TZXAgMjAgMDg6NTM6MTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGk0ODZ2L2k0ODZ2NCk6ICBNZXJnZSBpbiBmcm9tIEZTRiB2ZXJzaW9uLgotCi1GcmkgU2VwIDE4IDAwOjMyOjAwIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogb25seSBzZXQgUFdEIGlmIGl0IGlzIGFscmVhZHkgc2V0LgotCi1UaHUgU2VwIDE3IDIzOjA1OjUzIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZToganVzdCBzZXQgUFdEPWBwd2RgIGF0IHRoZSB0b3AsIHNpbmNlIFVsdHJpeCBzaAotCWRvZXNuJ3QgaGF2ZSB1bnNldCBhbmQgYWxsIHN1Y2Nlc3MgcGF0aHMgKGFuZCBtb3N0IGVycm9yIHBhdGhzKQotCW91dCBzZXQgaXQgYW55d2F5LiAoTm90ZTogc2hvdWxkIGNoYW5nZSBhbGwgdXNlcyBvZiAke1BXRD1gcHdkYH0KLQl0byBqdXN0ICR7UFdEfSB0byBhdm9pZCBjb25mdXNpb24uKQotCi1UdWUgU2VwIDE1IDE2OjAwOjU0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhbHdheXMgc2V0ICQodG9vbGRpcikgdG8gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKSwKLQlldmVuIGZvciBhIG5hdGl2ZSBjb21waWxhdGlvbi4KLQotVHVlIFNlcCAxNSAwMjoyMjo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbWFrZSB0aGUgZ2RiLnRhci5aIHJ1bGUgd29yayBiZXR0ZXIuCi0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogIEFkZCBvcGNvZGVzLgotCShERVZPX1NVUFBPUlQpOiAgQWRkIGNvbmZpZ3VyZS50ZXhpLgotCShiZmQtaWxydC50YXIuWik6ICBSZW1vdmUgYW5jaWVudCBydWxlLgotCi1UaHUgU2VwIDEwIDEwOjQzOjE5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1JIGZvciBuZXdsaWIvdGFyZy1pbmNsdWRlIHRvIFhUUkFGTEFHUywgdG8KLQlwaWNrIHVwIHRoZSBtYWNoaW5lIGFuZCBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IGFkZGVkIG5ldyB0YXJnZXQgbTY4MDEwLWFkb2JlLXNjb3V0LAotCXdpdGggYWxpYXMgb2YgYWRvYmU2OGsuICBDaGFuZ2VkIGNvbmZpZ3VyZS5pbiB0byBjaGVjayBmb3IKLQktc2NvdXQgYmVmb3JlIC1zY28qIHRvIGF2b2lkIGEgZmFsc2UgbWF0Y2guCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBBU19GT1JfVEFSR0VULCBwYXNzZWQgZG93biBpbgotCVRBUkdFVF9GTEFHU19UT19QQVNTLiAgQWRkZWQgQ0NfRk9SX0JVSUxELCB3aGljaCBpcyBpbnRlbmRlZCB0byBiZQotCXRoZSBDIGNvbXBpbGVyIHRvIHVzZSB0byBjcmVhdGUgcHJvZ3JhbXMgd2hpY2ggYXJlIHJ1biBpbiB0aGUKLQlidWlsZCBlbnZpcm9ubWVudCwgc2V0IGl0IHRvIGRlZmF1bHQgdG8gJChDQyksIGFuZCBwYXNzZWQgaXQgZG93bgotCWluIEZMQUdTX1RPX1BBU1MgYW5kIFRBUkdFVF9GTEFHU19UT19QQVNTLgotCi1XZWQgU2VwICA5IDEyOjIxOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIFRBUkdFVF9GTEFHU19UT19QQVNTLCBDQ19GT1JfVEFSR0VULAotCUFSX0ZPUl9UQVJHRVQsIFJBTkxJQl9GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VULiAgUGFzcwotCVRBUkdFVF9GTEFHU19UT19QQVNTLCB3aGljaCBkZWZpbmVzIENDLCBBUiwgUkFOTElCIGFuZCBOTSBhcyB0aGUKLQlGT1JfVEFSR0VUIHZhcmlhbnRzLCB0byBuZXdsaWIgYW5kIGxpYmcrKy4KLQotVHVlIFNlcCAgOCAxNzoyODozMCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2FzLCBhbGwtZ2RiKTogUmVxdWlyZSBhbGwtb3Bjb2RlcyB0byBiZSBidWlsdAotCWZpcnN0LgotCi1XZWQgU2VwICAyIDAyOjUwOjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWNjZXB0IGBlbGYnIGFzIGFuIGVudmlyb25tZW50LgotCi1UdWUgU2VwICAxIDE1OjQ4OjMwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLW9wY29kZXMpOiAgY2QgaW50byB0aGUgcmlnaHQgZGlyZWN0b3J5Ci0KLVN1biBBdWcgMzAgMjE6MTI6MTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIC1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIG9wdGlvbiwgdXNlZCBhcwotCWFyZ3VtZW50IHRvIHNlZCB3aGVuIGluc3RhbGxpbmcgcHJvZ3JhbXMuCi0JY29uZmlndXJlLnRleGk6IGFkZGVkIGRvY3VtZW50YXRpb24gZm9yIC1wcm9ncmFtX3ByZWZpeCwKLQktcHJvZ3JhbV9zdWZmaXggYW5kIC1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotCi1UaHUgQXVnIDI3IDIxOjU5OjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWNjZXB0IGk0ODYgd2hlcmUgaTM4NiBvay4KLQotVGh1IEF1ZyAyNyAxMzowNDo0MiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWNjZXB0IHdlMzJrCi0KLU1vbiBBdWcgMjQgMTQ6MDU6MTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0gCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBhY2NlcHQgT1NFNjgwMDAgYW5kIE9TRTY4ay4KLQotCSogTWFrZWZpbGUuaW46IGRvbid0IGNyZWF0ZSBhbGwgZGlyZWN0b3JpZXMgZm9yIGBgbWFrZSBpbnN0YWxsJyc7Ci0JbGV0IHRoZSBzdWJkaXJlY3RvcmllcyBjcmVhdGUgdGhlIG9uZXMgdGhleSBuZWVkLgotCi1UdWUgQXVnIDExIDIzOjEzOjE3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIENPUFlJTkc6IG5ldyBmaWxlLCBHUEwgdjIKLQotVHVlIEF1ZyAgNCAwMToxMjo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgdGhlIG5ldyBnZW4taW5mby1kaXIsIHdoaWNoIG5lZWRzIGEgdGVtcGxhdGUKLQlhcmd1bWVudCAod2hpY2ggYWxzbyBsaXZlcyBpbiB0ZXhpbmZvKQotCi0JKiBjb25maWd1cmUudGV4aSwgc3RhbmRhcmRzLnRleGk6IGZpeCBJTkZPLURJUi1FTlRSWQotCi1Nb24gQXVnICAzIDE1OjQxOjI4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IHJlbW92ZWQgdGhlIC14cyBmcm9tIENGTEFHUyAobGV0IHRoZSBwZW9wbGUKLQl3aXRoIFN1bidzIEMgY29tcGlsZXIgZGVhbCB3aXRoIGl0IHRoZW1zZWx2ZWQpCi0KLU1vbiBBdWcgIDMgMDA6MzQ6MTcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5jcjMwMDApOiAgQ2hhbmdlIGkzODYgdG8gaTQ4Ni4KLQotVGh1IEp1bCAyMyAwMDoxMjoxNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbC1yY3MsIGluc3RhbGwtZ3JlcCB0bwotCWluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcywgcmVtb3ZlZCBpbnN0YWxsLWJpc29uIGFuZCBpbnN0YWxsLWxpYmdjYwotCi1UdWUgSnVsIDIxIDAxOjAxOjUwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ3JhYiB0aGUgSFBVWCBtYWtlZmlsZSBmcmFnbWVudCBpZiBvbiBIUFVYCi0KLU1vbiBKdWwgMjAgMTE6MDI6MDkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXJhZGljYXRlIGJpc29uIHNwb29yIChkaXR0byBsaWJnY2MpLgotCSBjb25maWd1cmUuaW46IHJlY29nbmlzZSBtNjh7aywwMDB9LWVyaWNzc29uLU9TRS4KLQkgZXMxODAwIGlzIGFsaWFzIGZvciBtNjhrLWVyaWNzc29uLU9TRQotCi1TdW4gSnVsIDE5IDE3OjQ5OjAyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWFycmFuZ2UgdGhlIHBhcnRzIHRoYXQgcmVtb3ZlIHByb2dyYW1zIGZyb20KLQljb25maWdkaXJzLCBiYXNlZCBub3cgb24gSE9TVD09VEFSR0VUIG9yIGJ5IGNhbm9uaWNhbCB0cmlwbGUuCi0KLUZyaSBKdWwgMTcgMjI6NTI6NDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiByZWN1cnNlIGV4cGxpY2l0bHkgd2l0aCAtZiB0ZXN0LWJ1aWxkLm1rIHdoZW4KLQkgIGFwcHJvcHJpYXRlLiAgcHJlZGljYXRlIHN0YWdlMyBhbmQgY29tcGFyaXNvbiBvbiB0aGUgZXhpc3RlbmNlCi0JICBvZiBnY2MuICBUaGF0IGlzLCBpZiBnY2MgaXNuJ3QgYXJvdW5kLCB3ZSBhcmVuJ3QgdGhyZWUtc3RhZ2luZy4KLQkgIE9uIHZlcnkgY2xlYW4sIGFsc28gcmVtb3ZlIC4uLnN0YW1wLWNvLiAgQnVpbGQgaW4tcGxhY2UgYmVmb3JlCi0JICBkb2luZyBvdGhlciBidWlsZHMuCi0KLVRodSBKdWwgMTYgMTg6MzM6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGFkZCB0Z2FzCi0KLVRodSBKdWwgMTYgMTY6MDU6MjggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYSBudW1iZXIgb2YgY2hhbmdlcyBtZXJnZWQgaW4gZnJvbSBwcm9ncmVzc2l2ZS4KLQotCSogY29uZmlndXJlLmluOiBhZGQgbGlibS4KLQotCSogLmN2c2lnbm9yZTogaWdub3JlIHNvbWUgc3R1ZmYgdGhhdCBjb21lcyBmcm9tIHRlc3QtYnVpbGQubWsuCi0KLVdlZCBKdWwgIDggMDA6MDE6MzAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNvbGFyaXM6ICBVc2UgLXhzIHdoZW4gY29tcGlsaW5nIHNvIHRoYXQgU3VuLUMgcHV0cwotCWEgc3ltYm9sLXRhYmxlIGludG8gdGhlIGV4ZWN1dGFibGUuCi0KLVR1ZSBKdWwgIDcgMDA6MjQ6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgZXMxODAwIChtNjhrLWVyaWNzc29uLWVzMTgwMCkuCi0KLVR1ZSBKdW4gMzAgMjA6MjQ6NDEgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0JKiBNYWtlZmlsZS5pbjogYWRqdXN0IGRpcmVjdG9yeS1jcmVhdGluZyBzY3JpcHQgZm9yIGxvc2luZyBkZWNzdGF0aW9uCi0KLU1vbiBKdW4gMjIgMjM6NDM6NDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIE1pbm9yICRzdWJkaXItcmVsYXRlZCBmaXhlcy4KLQotTW9uIEp1biAyMiAxODozMDoyNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBmaXggdmFyaW91cyBwcm9ibGVtcyB3aXRoIHByb3BvZ2F0aW5nCi0JbWFrZWZpbGVfdGFyZ2V0X2ZyYWcgaW4gc3ViZGlycy4KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlnIGxpYmdjYyBpZiBpdHMgdGhlcmUKLQotRnJpIEp1biAxOSAxNToxOTo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgSFBQQSBtZXJnZS4KLQotTW9uIEp1biAxNSAxMjozMTo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0KLVN1biBKdW4gMTQgMTA6Mjk6MTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVwbGFjZSBhbGwtYmlzb24gd2l0aCBhbGwtYnlhY2MgaW4gYWxsCi0JZGVwZW5kZW5jeSBsaW5lcyBmb3Igb3RoZXIgdG9vbHMgKHdoaWNoIG5vdyB1c2UgYnlhY2MpLgotCi1GcmkgSnVuIDEyIDIyOjIxOjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIHN1bjRzb2wyID0+IHNwYXJjLXN1bi1zb2xhcmlzMi4KLQotVHVlIEp1biAgOSAxNzoxODoxMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBBZGQgSU5TVEFMTC4KLQotVGh1IEp1biAgNCAxMjowNzozMiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBncHJvZiBydWxlcyBzaW1pbGFyIHRvIGJ5YWNjIHJ1bGVzIChpbnN0ZWFkIG9mCi0JdmVzdGlnYWwgJCh1bnN1YmRpcikgdGhhdCBkaWRuJ3Qgd29yay4uLikKLQotVGh1IEp1biAgNCAwMDozNzowNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3VwcG9ydCBmb3IgTGludXguCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAkKEZMQUdTX1RPX1BBU1MpIG1vcmUgY29uc2lzdGVudGx5Ci0JKGF0IGxlYXN0IGZvciBsaWJnKyspLgotCi1UdWUgSnVuIDAyIDIwOjAzOjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBmaXggZG9jIGZvciB0aGUgLW5mcCBvcHRpb24gdG8gY29uZmlndXJlCi0KLVR1ZSBKdW4gIDIgMTc6MjA6NTIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJpbnV0aWxzKTogYXIgbmVlZHMgZmxleCwgc28gZGVwZW5kIG9uIGFsbC1mbGV4LgotCi1TdW4gTWF5IDMxIDE1OjA0OjA4IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZWQgW14tXSsgdG8gW14tXVteLV0qIHNvIHRoYXQgaXQgd29ya3MgdW5kZXIKLQlTdW4gc2VkLiAoQlNEIDQuMyBzZWQgZG9lc24ndCBoYW5kbGUgW14tXSsgZWl0aGVyLikKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgc29sYXJpcyogaG9zdF9tYWtlZmlsZV9mcmFnIGhvb2suCi0KLVN1biBNYXkgMzEgMDE6MTA6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBjaGFuZ2VkIHJlY29nbml0aW9uIG9mIG02ODAwMCBzbyB0aGF0IHZhcmlvdXMKLQltNjhrIHR5cGVzIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG02ODBbMDEyMzRdMAotCi1TYXQgTWF5IDMwIDIxOjAxOjA2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IGZpeCBzZWQgc28gdGhhdCAnLWZvbycgaXNuJ3QKLQljb21wbGV0ZWx5IHN1YnN0aXR1dGVkIG91dCB3aGlsZSAuKyctZm9vJyBsb3NlcyB0aGUgJy1mb28nCi0KLVdlZCBNYXkgMjcgMjM6MTg6NTIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoJG9zKTogQWRkIC1hb3V0LgotCi1GcmkgTWF5IDIyIDE0OjAwOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBJZiBob3N0X21ha2VmaWxlX2ZyYWcgaXMgYWJzb2x1dGUsIGRvbid0Ci0JcHJlZml4ICR7aW52c3ViZGlyfSAocmVsZXZhbnQgdG8gbGliZysrIGF1dG8tY29uZmlndXJlKS4KLQotVGh1IE1heSAyMSAxODowMDowOSAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodG9vbGRpcik6IERlZmluZSBpdC4KLQkoYWxsLWxkKTogRGVwZW5kIG9uIGFsbC1mbGV4LgotCi1TdW4gTWF5IDEwIDIxOjQ1OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogIEZpeCBsaWJnKysgc3BlY2lhbCBjYXNlLgotCi1GcmkgTWF5ICA4IDA4OjMxOjQxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGRvIG5vdCBidXJ5IGBwd2RgIGludG8gY29uZmlnLnN0YXR1cywgdGh1cyBkbyBmZXdlcgotCSAgcHdkJ3MuCi0KLQkqIGNvbmZpZ3VyZTogcHJpbnQgdGhlICJCdWlsZGluZyBpbiIgbWVzc2FnZSBvbmx5IHdoZW4gYnVpbGRpbmcgaW4KLQkgIG90aGVyIHRoYW4gIi4iIEFORCB2ZXJib3NlLgotCi0JKiBjb25maWd1cmU6IHJlbW92ZSAtcywgcmV3b3JrIC12IHRvIGJldHRlciBhY2NvbW9kYXRlIGd1ZXN0ZWQKLQkgIGNvbmZpZ3VyZXMuCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiB1cGRhdGVkIHRvIDMgbWF5LCBmaXhlZCBsaWJyaWQgPC0+IGxpYmRpciB0eXBvLgotCi1GcmkgTWF5ICAxIDE4OjAwOjUwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFjcm9pemUgZmxhZ3MgcGFzc2VkIG9uIHJlY3Vyc2lvbi4gIHJlbW92ZQotCSAgZmlsZXV0aWxzLgotCi1UaHUgQXByIDMwIDA4OjU2OjIwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGdldCBtYWtlc3JjZGlyIHJpZ2h0IGZvciBzdWJkaXJzIGRlZXBlciB0aGFuIDEuCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIElOU1RBTEwsIElOU1RBTExfREFUQSwgSU5TVEFMTF9QUk9HUkFNIG9uCi0JICBpbnN0YWxsLgotCi1GcmkgQXByIDI0IDE1OjUxOjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgcHJpbnQgc3ViZGlyX2RvIG9yIHJlY3Vyc2lvbiBsaW5lcy4KLQotRnJpIEFwciAyNCAxNToyMjowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IGFkZGVkIG1lbnUgaXRlbS4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGFuZCBpbnN0YWxsIHN0YW5kYXJkcy5pbmZvLgotCi0JKiBzdGFuZGFyZHMudGV4aTogbmV3IGZpbGUuCi0KLVdlZCBBcHIgMjIgMTg6MDY6NTUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHRlc3QgZm9yIGFuZCBtb3ZlIGNvbmZpZy5zdGF0dXMgcGllY2VzIGZyb20KLQkgICR7c3ViZGlyfS8uCi0KLVdlZCBBcHIgMjIgMTQ6Mzg6MzQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1kZWx0YTg4LCBjb25maWcvbWgtbmNyMzAwMDogIFJlcGxhY2UgTUlOVVNfRyB3aXRoCi0JQ0ZMQUdTIHBlciBuZXcgY29uZmlndXJhdGlvbiBzdHJhdGVneS4KLQkqIGNvbmZpZ3VyZTogIFRlc3QgZm9yIGV4aXN0YW5jZSBvZiBmaWxlcyBiZWZvcmUgdHJ5aW5nIHRvIG12Ci0JdGhlbSwgdG8gYXZvaWQgbnVtZXJvdXMgbm9uLWV4aXN0YW5jZSBtZXNzYWdlcy4KLQotVHVlIEFwciAyMSAxMjozMTozMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjb3JyZWN0IGZpbmFsIGxpbmUgb2YgY29uZmlnLnN0YXR1cy4KLQotCSogY29uZmlndXJlOiBwYXRjaCBmcm9tIGVnZ2VydC4gIEF2b2lkcyBhIHByb3RlY3Rpb24gcHJvYmxlbSBpZgotCSAgdGhlIG9yaWdpbmFsIE1ha2VmaWxlLmluIGlzIHJlYWQgb25seS4KLQotCSogY29uZmlndXJlOiB1c2UgbW92ZS1pZi1jaGFuZ2UgZnJvbSBnY2MgdG8gY3JlYXRlIGNvbmZpZy5zdGF0dXMuCi0JICBTb21lIG1ha2VmaWxlcyBkZXBlbmQgb24gY29uZmlnLnN0YXR1cyB0byB0ZWxsIGlmIGEgZGlyZWN0b3J5Ci0JICBoYXMgYmVlbiByZWNvbmZpZ3VyZWQgZm9yIGEgZGlmZmVyZW50IGhvc3QuICBUaGlzIGNoYW5nZQotCSAgcHJldmVudHMgdGhvc2UgZGlyZWN0b3JpZXMgZnJvbSByZW1ha2luZyBldmVyeXRoaW5nIGluIHRoZSBjYXNlCi0JICB3aGVyZSB0aGUgcmVjb25maWcgd2FzIG9ubHkgaW50ZW5kZWQgdG8gcmVidWlsZCBhIE1ha2VmaWxlLgotCi0JKiBjb25maWd1cmU6IHRlc3QgZm9yIGNvbmZpZy5zdWIgd2l0aCAiY29uZmlnLnN1YiBzdW40IiByYXRoZXIKLQkgIHRoYW4gImNvbmZpZy5zdWIgJHtob3N0X2FsaWFzfSIuICBPdGhlcndpc2Ugd2UgY2FuJ3QgdGVsbCBhIGJhZAotCSAgaG9zdCBhbGlhcyBmcm9tIGEgbWlzc2luZyBjb25maWcuc3ViLgotCi1Nb24gQXByIDIwIDE4OjE2OjM2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGV4cGxpY2l0bHkgcGFzcyBDRkxBR1Mgb24gcmVjdXJzaW9uLiBubyBsb25nZXIgcGFzcwotCSAgTUlOVVNfRyAodGhpcyBjYW4gYmUgZG9uZSB3aXRoIENGTEFHUykuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxNyAxODoyNzo1MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBta2RpciAke3N1YmRpcn0gYXMgbmVlZGVkLgotCi1XZWQgQXByIDE1IDE3OjM3OjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbixjb25maWd1cmUuaW46IGFkZGVkIGF1dG9jb25mLgotCi1XZWQgQXByIDE1IDE3OjI3OjM0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5vIGxvbmdlciBwYXNzIGFnYWluc3Qgb24gcmVjdXJzaW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLk5PRVhQT1JUOiBzbyB0aGF0IHN0cmF5IG1ha2VmaWxlX2ZyYWcKLQkgIGRlZmluaXRpb25zIGFyZSBub3QgaW5oZXJpdGVkLgotCi0JKiBjb25maWd1cmU6IGNvcnJlY3QgbWFrZXNyY2RpciB3aGVuIHN1YmRpciBpcyAuCi0KLVR1ZSBBcHIgMTQgMTE6NTY6MDkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIEFkZCBzdXBwb3J0IGZvciAnc3ViZGlycycgdmFyaWFibGUsIHdoaWNoIGlzCi0JbGlrZSAnY29uZmlnZGlycycsIGV4Y2VwdCB0aGF0IGNvbmZpZ3VyZSBkb2Vzbid0IHJlLWludm9rZQotCWl0c2VsZiBmb3Igc3ViZGlycywgaXQganVzdCBjcmVhdGVzIGEgTWFrZWZpbGUgZm9yIGVhY2ggc3ViZGlyLgotCSogY29uZmlndXJlLnRleGk6ICBEb2N1bWVudCBzdWJkaXJzLgotCi1Nb24gQXByIDEzIDE4OjUwOjE2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBmbGV4IHRvIGNvbmZpZ2RpcnMKLQotTW9uIEFwciAxMyAxODo0Mzo1NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBjbGVhbi1zdGFtcHMgZnJvbSBjbGVhbi4KLQotU2F0IEFwciAxMSAwMzo1MjowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGdkYnRlc3QgdG8gY29uZmlnZGlycy4KLQotRnJpIEFwciAxMCAyMzoxMTo0OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgQWRkIG1hY3JvLCBkZWZhdWx0IHRvIC1nLCBwYXNzIG9uCi0JdG8gcmVjdXJzaXZlIG1ha2VzLgotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQotV2VkIEFwciAgOCAyMzowODoxMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCByZWZlcmVuY2VzIHRvIGdkYm0uCi0KLVR1ZSBBcHIgIDcgMTY6NDg6MjAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBEb24ndCBjYW5vbmljYWxpemUgb3MgdmFsdWUKLQluZXdzb3MqIHRvIGJzZCAocmVhZGxpbmUgbmVlZHMgdG8gY2hlY2sgZm9yIG5ld3NvcykuCi0JKFRoaXMgZml4IHdhcyBlYXJsaWVyIG1hZGUgSmFuIDMxLCBidXQgZ290IHJlLWJyb2tlbi4pCi0KLU1vbiBBcHIgIDYgMTQ6MzQ6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgc2NvIGlzIGFuIG9zLCBub3QgYSB2ZW5kb3IhCi0KLQkqIGNvbmZpZ3VyZTogIFF1b3RlICQoIGJldHRlci4gIEtlZXAgdmFyaW91cyBzaGVsbHMgaGFwcHkuCi0KLVR1ZSBNYXIgMzEgMTY6MzI6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBlbGltaW5hdGUgc3RhbXAtZmlsZXMuCi0KLU1vbiBNYXIgMzAgMjI6MjA6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgc2VuZF9wci4gIHJlbW92ZSAiZm9yY2UiIGZyb20gLnN0bXAtZ3Byb2YgcnVsZS4KLQkgIFN1cHJlc3MgZWNob2luZyBvZiBhbGwgdGhlICJpZiBbIC1kIC4uLiAkKE1BS0UpIiBsaW5lcy4KLQotV2VkIE1hciAyNSAxNToyMDowNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgZml4IGlyaXMvaXJpczMuCi0KLVdlZCBNYXIgMjUgMTA6MzQ6MTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogcmUtYWRkIC1ybS4KLQotVHVlIE1hciAyNCAyMzo1MDoxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFza2VmaWxlLmluOiBhZGQgLnN0bXAtcmNzIHRvIGFsbC4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgZ2FzIGZyb20gcnM2MDAwIGJ1aWxkLCB1c2UgYWl4IGhvc3QgZnJhZ21lbnQuCi0KLU1vbiBNYXIgMjMgMTk6NDM6MzUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogcGFzcyBkb3duIHNpdGVfb3B0aW9uIGR1cmluZyByZWN1cnNpb24uCi0KLVRodSBNYXIgMTkgMTY6NDk6MzYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC5jcm9zcyk6ICBBZGQgLnN0bXAtYmZkIC5zdG1wLXJlYWRsaW5lLgotCi1XZWQgTWFyIDE4IDE1OjI5OjMzIDE5OTIgIE1pa2UgU3R1bXAgIChtcnNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGFuZ2UgZXhlY19wcmVmaXggc28gdGhhdCBpdCByZWFsbHkgZGVmYXVsdHMgdG8gcHJlZml4LgotCi1TYXQgTWFyIDE0IDE3OjIwOjM4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiAgQWRkIHN1cHBvcnQgZm9yIG1tYWxsb2MgbGlicmFyeS4KLQotRnJpIE1hciAxMyAxODo0NDoxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzdG1wIGRlcGVuZGVuY2llcyBmb3IgYSBmZXcgbW9yZSB0aGluZ3MuCi0KLVRodSBNYXIgMTIgMDQ6NTY6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRqdXN0ZWQgZXJyb3IgbWVzc2FnZSBvbiBvYmpkaXIvc3JjZGlyIGNvbmZpZ3VyZQotCSAgY29sbGlzaW9uLCBwZXIgam9obidzIHN1Z2dlc3Rpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgbGliaWJlcnR5IHN0bXAgdG8gYWxsIGFuZCBhbGwuY3Jvc3MuCi0KLVdlZCBNYXIgMTEgMDI6MDc6NTIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgZm9yY2UgZGVwZW5kZW5jaWVzLCBhZGQgZ3JlcCB0byBhbGwuCi0KLVR1ZSBNYXIgMTAgMjE6NDk6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQG1hcnMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRyb3AgZmxleC4gIG1ha2Ugc3RhbXAgZmlsZXMgd29yay4KLQotCSogY29uZmlndXJlOiBhZGRlZCB0ZXN0IGZvciBjb25mbGljdGluZyBjb25maWd1cmF0aW9uIGluIHNyY2RpciwKLQkgIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLiAgT3RoZXJ3aXNlIGVtYWNzIGdkYiBtb2RlCi0JICBnZXRzIGNyYW5reS4gIHVzZSByZWxhdGl2ZSBwYXRocyBmb3IgY29uZmlndXJlIGFuZCBzcmNkaXIKLQkgIHdoZW5ldmVyIHBvc3NpYmxlLiAgU2VuZCBzb21lIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciB0aGF0IHdlcmUKLQkgIGdvaW5nIHRvIHN0ZG91dC4KLQotVHVlIE1hciAxMCAxODowMTo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBGaXggbGliZysrIHJ1bGUgdG8gY2hlY2sgZm9yIGdjYyBkaXJlY3RvcnkKLQliZWZvcmUgdXNpbmcgZ2NjL2djYy4gIEFsc28gcGFzcyBYVFJBRkxBR1MuCi0KLVRodSBNYXIgIDUgMjE6NDU6MDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0bXAtZmlsZXMgc28gdGhhdCBkaXJlY3RvcmllcyBhcmVuJ3QgcG9sbGVkCi0JICB3aGVuIHRoZXkgYXJlIGFscmVhZHkgYnVpbHQuCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBmaXhlZCBhIG5vZGUgcG9pbnRlciBwcm9ibGVtLgotCi1UaHUgTWFyICA1IDEyOjA1OjU4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgY29uZmlndXJlLmluIGNvbmZpZy9taC1pcml4NCBnZGIvY29uZmlndXJlLmluCi0JZ2RiL21pcHMtdGRlcC5jIGdkYi9taXBzcmVhZC5jIGdkYi9wcm9jZnMuYyBnZGIvc2lnbmFtZS5oCi0JZ2RiL3RtLWlyaXgzLmggZ2RiL3RtLW1pcHMuaCBnZGIveG0taXJpeDQuaCBnZGIvY29uZmlnL210LWlyaXgzCi0JZ2RiL2NvbmZpZy9taC1pcml4NCB0ZXhpbmZvL2NvbmZpZ3VyZS5pbjogIFBvcnQgdG8gU0dJIElyaXgtNC54LgotCi1XZWQgTWFyICA0IDAyOjU3OjQ2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAtcmVjdXJyaW5nIGJlY29tZXMgLXNpbGVudC4gIGNvcnJlY3RlZCBoZWxwIG1lc3NhZ2UKLQkgIGZvciAtc2l0ZT0gb3B0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogbWtkaXIgJChleGVjX3ByZWZpeCkgYW5kICQodG9vbGRpcikuCi0KLVR1ZSBNYXIgIDMgMTQ6NTE6MjEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHdoZW4gYnVpbGRpbmcgTWFrZWZpbGUgZm9yIGNyb3NzZXMsIHJlcGxhY2UKLQkgIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LiAgZGVmYXVsdCBzcmNkaXIgZnJvbSBsb2NhdGlvbiBvZgotCSAgY29uZmlnLnN1Yi4gIHJlbW92ZSAiZm9yIGhvc3QgaW4gaG9zdHMiIGFuZCAiZm9yIHRhcmdldCBpbgotCSAgdGFyZ2V0cyIgbG9vcHMuCi0KLVdlZCBGZWIgMjYgMTk6NDg6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRG8gbm90IHBhc3MgYmluZGlyIG9yIG1hbmRpciB0byBjdnMuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi0JKiBjb25maWd1cmUudGV4aTogcmVtb3ZlIG1vc3QgcmVmZXJlbmNlcyB0byBtdWx0aXBsZSBob3N0cywKLQkgIG11bHRpcGxlIHRhcmdldHMsIHN1YmRpcnMsIGV0Yy4KLQotCSogY29uZmlndXJlLm1hbjogcmVtb3ZlZCByY3NpZC4gcmVmZXJlbmNlIGNvbmZpZy5zdWIgbm90Ci0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IG1rZGlyICQoaW5mb2Rpcikgb24gaW5zdGFsbC1pbmZvLgotCi1XZWQgRmViIDE5IDE1OjQxOjEzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aTogIEV4cGxhaW4gYmV0dGVyIGFib3V0IC5nZGJpbml0IGFuZCBhYm91dAotCXRoZSBlbnZpcm9ubWVudCB0aGF0IGNvbmZpZ3VyZS5pbiBzZWN0aW9ucyBydW4gaW4uCi0KLUZyaSBGZWIgIDcgMDc6NTU6MDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVsdHJpeCBpcyBvbmx5IGEgZGVjc3RhdGlvbiBpZiBpdCdzIGEgTUlQUy4KLQotRnJpIEphbiAzMSAyMTo1NDo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgRE9DLmNvbmZpZ3VyZSA9PiBjZmctcGFwZXIudGV4aS4KLQotRnJpIEphbiAzMSAyMTo0ODoxOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuZWFyIGNhc2UgJG9zKTogIERvbid0IGNvbnZlcnQgbmV3c29zKiB0byBic2QhCi0KLUZyaSBKYW4gMzEgMDI6Mjc6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVpbnN0YWxsIGNoYW5nZSBmcm9tIGdkYi00LjMgdGhhdCByZWR1Y2VzCi0JdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgQ09QWUlORyB0aGF0IGdvIGludG8gdGhlIEdEQiB0YXIgZmlsZS4KLQotVGh1IEphbiAzMCAxNjoxNzozMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQvY29uZmlndXJlLmluLCBjb25maWcvbWgtc2NvLCBnZGIvY29uZmlnL21oLWkzODZzY28sCi0JZ2RiL2NvbmZpZy9tdC1pMzg2djMyLCBnZGIvY29uZmlndXJlLmluLCByZWFkbGluZS9jb25maWd1cmUuaW46Ci0JRml4IFNDTyBjb25maWd1cmF0aW9uIHN0dWZmLgotCi1UdWUgSmFuIDI4IDIzOjUxOjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEZvciBsaWJnKyssIG1ha2Ugc3VyZSB0aGUgLUkgcG9pbnRpbmcKLQl0byB0aGUgZ2NjIGRpcmVjdG9yeSBnb2VzICphZnRlciogYWxsIHRoZSBsaWJnKystbG9jYWwgLUkgZmxhZ3MuCi0JQWxzbywgbW92ZSBqdXN0LWdjYyBkZXBlbmRlbmN5IGZyb20ganVzdC1saWJnKysgdG8gYWxsLWxpYmcrKy4KLQotVHVlIEphbiAyOCAxMjo1NjoyNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBDaGFuZ2UgLXggdG8gLWYgdG8ga2VlcCBVbHRyaXggL2Jpbi90ZXN0IGhhcHB5LgotCi1TYXQgSmFuIDE4IDE3OjQ1OjExIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBSZW1vdmUgdGV4aW5mbyB0YXJnZXRzLgotCi1TYXQgSmFuIDE4IDE3OjAzOjIxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIHN0cmF0dXMgY29uZmlndXJhdGlvbiBmcmFncy4gIEFsc28KLQlzdWJtaXR0ZWQgdG8gRlNGLgotCi1TYXQgSmFuIDE4IDE1OjM1OjI5IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZfU1VQUE9SVCk6ICBhZGQgY29uZmlndXJlLm1hbi4KLQotCSogY29uZmlnLnN1YihEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljKTogIGFkZCAtbm9uZSouCi0KLUZyaSBKYW4gMTcgMTc6NTg6MDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICByZW1vdmUgZm9ybSBmZWVkcyB0byBtYWtlIFN1bidzIG1ha2UgaGFwcHkuCi0JKERFVk9fU1VQUE9SVCk6ICBET0MuY29uZmlndXJlID0+IGNmZy1wYXBlci50ZXhpLgotCi1TYXQgSmFuICA0IDE2OjExOjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiAgTWFrZSBxdWlldGVyLgotCi1UaHUgSmFuICAyIDIyOjU3OjEyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbGliZysrLgotCSogY29uZmlndXJlOiAgV2hlbiB2ZXJib3NlLCBkb24ndCBvdXRwdXQgdGhlIGNvbW1hbmQgbGluZSBhdCBlYWNoCi0JbGV2ZWw7IGl0IHdpbGwgYmUgdW5yZW1hcmthYmx5IHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uLAotCXdoaWNoIHdpbGwgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgdXNlciB0eXBlZC4KLQotRnJpIERlYyAyNyAxNjoyNjo0NyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogZml4IGNsZWFuLWluZm8sIGFkZCBmbGV4LiAgYWRkCi0JICBmaWxldXRpbHMuCi0KLQkqIGNvbmZpZ3VyZTogYmUgbGVzcyBzZW5zaXRpdmUgdG8gc3BhY2VzIGluIE1ha2VmaWxlLmluLiAgRG8gbm90Ci0JICBsb29rIGZvciBzb3VyY2VzIGluICIuLiIuICBEb2luZyBzbyBicmVha3Mgc3ViZGlyZWN0b3JpZXMgdGhhdAotCSAgbWlnaHQgaGF2ZSB0aGVpciBvd24gY29uZmlndXJlLiAgSWYgYSBzdWJkaXIgaGFzIGl0J3Mgb3duCi0JICBjb25maWd1cmUgc2NyaXB0LCB1c2UgaXQuCi0KLVRodSBEZWMgMjYgMTY6MzA6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNmZy1wYXBlci50ZXhpOiBzb21lIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IHJtcy4KLQotVGh1IERlYyAyNiAxMDoxMzozNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIE1lcmdlIGluIHNvbWUgc21hbGwgYWRkaXRpb25zIGZyb20gdGhlIEZTRiB2ZXJzaW9uLAotCXRha2VuIGZyb20gdGhlIGdjYyBkaXN0cmlidXRpb24sIHRvIGJyaW5nIHRoZSBDeWdudXMgYW5kIEZTRgotCXZlcnNpb25zIGludG8gY2xvc2VyIHN5bmMuCi0KLUZyaSBEZWMgMjAgMTE6MzQ6MTggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZWQgc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi1UaHUgRGVjIDE5IDE1OjU0OjI5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIC1WIGZvciB2ZXJzaW9uIG51bWJlciBvcHRpb24uCi0KLVdlZCBEZWMgMTggMTU6Mzk6MzQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIERPQy5jb25maWd1cmUsIGNmZy1wYXBlci50ZXhpOiByZXZpc2VkLCB1cGRhdGVkLCBhbmQgdGV4aW5mbydkLgotCSAgcmVuYW1lZCBmcm9tIERPQy5jb25maWd1cmUgdG8gY2ZnLXBhcGVyLnRleGkuCi0KLU1vbiBEZWMgMTYgMjM6MDU6MTkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5zdWJyLCBjb25maWcuc3ViOiBjb25maWcuc3ViciBpcyBub3cKLQkgIGNvbmZpZy5zdWIgYWdhaW4uCi0KLUZyaSBEZWMgMTMgMDE6MTc6MDYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBuZXcgZmlsZSwgaW4gcHJvZ3Jlc3MuCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBpbmZvIGZpbGUgYW5kIGluc3RhbGwgdGhlIG1hbiBwYWdlIGZvcgotCSAgY29uZmlndXJlLgotCi0JKiBjb25maWd1cmUubWFuOiBuZXcgZmlsZSwgZmlyc3QgY3V0LgotCi0JKiBjb25maWd1cmU6IGZpbmQgY29uZmlnLnN1YnIgYWdhaW4gbm93IHRoYXQgY29uZmlndXJhdGlvbiAibm9uZSIKLQkgIGhhcyBnb25lLiAgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIHRoZSAtYW5zaSBvcHRpb24uICByZW1vdmVkIGFsbAotCSAgdHJhY2VzIG9mIHRoZSAtbGFuZ3VhZ2VzIG9wdGlvbi4KLQotCSogY29uZmlnLnN1YnI6IHJlc3luYyBmcm9tIHJtcy4KLQotV2VkIERlYyAxMSAyMjoyNToyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YiwgY29uZmlnLnN1YnI6IG1lcmdlIGNvbmZpZy5zdWIgaW50bwotCSAgY29uZmlnLnN1YnIsIGNhbGwgdGhlIHJlc3VsdCBjb25maWcuc3ViciwgcmVtb3ZlIGNvbmZpZy5zdWIsIHVzZQotCSAgY29uZmlnLnN1YnIuCi0KLQkqIE1ha2VmaWxlLmluOiByZXZpc2VkIGluc3RhbGwgZm9yIGRpci5pbmZvLgotCi1UdWUgRGVjIDEwIDAwOjA0OjM1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgZGVjc3RhdGlvbiBob3N0IG1ha2VmaWxlIGZyYWcuCi0KLQkqIE1ha2VmaWxlLmluOiBCSVNPTiBub3cgYmlzb24gLXkgYWdhaW4uICBhbHNvIGluc3RhbGwtZ2NjIG9uCi0JICBpbnN0YWxsLiAgY2xlYW4tZ2RibSBvbiBjbGVhbi4gIGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCSAgTWFrZSBkaXJlY3RvcmllcyBmb3IgaW5mbyBpbnN0YWxsLiAgQnVpbGQgZGlyLmluZm8gaGVyZSB0aGVuCi0JICBpbnN0YWxsIGl0LgotCi1Nb24gRGVjICA5IDE2OjQ4OjMzIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCBmb3IgYmFkIGRpcmVjdG9yeSB0ZXN0cy4KLQotU2F0IERlYyAgNyAwMDoxNzowMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogXHsxLDJcfSBhcHBlYXJzIHRvIGJlIGEgc3lzdidpc20uICBVc2UgYSBkaWZmZXJlbnQKLQkgIHJlZ2V4cC4gIC1zcmNkaXIgcmVsYXRpdmUgd2FzIGJlaW5nIGhhbmRsZWQgaW5jb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluOiB1bndyYXBwZWQgc29tZSBmb3IgbG9vcHMgc28gdGhhdCBwYXJhbGxlbCBtYWtlcwotCSAgd29yayBhZ2FpbiBhbmQgc28gb25lIGNhbiBmb2N1cyBvbmUncyBhdHRlbnRpb24gb24gYSBwYXJ0aWN1bGFyCi0JICBwYWNrYWdlLgotCi1GcmkgRGVjICA2IDAwOjIyOjA4IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGRlZCBQV0QgYXMgYSBzdGFuZCBpbiBmb3IgYHB3ZGAgKGZvciBzcGVlZCkuIHVzZQotCSAgZWxpZiB3aGVyZXZlciBwb3NzaWJsZS4gIG1ha2UgLXNyY2RpciB3b3JrIHdpdGhvdXQgLW9iamRpci4KLQkgIC1vYmpkaXI9IGNvbW1lbnRlZCBvdXQuCi0KLVRodSBEZWMgIDUgMjI6NDY6NTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICtvcHRpb25zIGJlY29tZSAtLW9wdGlvbnMuICAtc3ViZGlycyBjb21tZW50ZWQgb3V0LgotCSAgYWRkZWQgLWhvc3QsIC1kYXRhZGlyLiAgUmVuYW1lZCAtZGVzdGRpciB0byAtcHJlZml4LiAgQ29tbWVudCBpbgotCSAgTWFrZWZpbGUgbm93IGF0IHRvcCBvZiBnZW5lcmF0ZWQgTWFrZWZpbGUuICBSZW1vdmVkIGN2cyBsb2cKLQkgIGVudHJpZXMuICBhZGRlZCAtc3JjZGlyLiAgY3JlYXRlIC5nZGJpbml0IG9ubHkgaWYgdGhlcmUgaXMgb25lCi0JICBpbiAke3NyY2Rpcn0uCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMDc6Mzg6MTEgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBGcmVzaGx5IGNyZWF0ZWQgQ2hhbmdlTG9nLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc2Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzdkN2M4Li4wMDAwMDAwCi0tLSBhL01BSU5UQUlORVJTCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotUGxlYXNlIGZlZWwgZnJlZSB0byBhZGQsIGVkaXQsIGRlbGV0ZSB0aGlzIGZpbGUuCi1QbGVhc2UgZG8gbm90IG1ha2UgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLUNPUFlJTkcsIENPUFlJTkcuTElCLCBSRUFETUUKLQlodHRwOi8vZ251Lm9yZy4KLQotTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluCi0JUGxlYXNlIG5vdGlmeSB0aGUgZm9sbG93aW5nIG9mIGFueSBjb21taXR0ZWQgcGF0Y2hlcy4KLQkJYmludXRpbHNAc291cmNld2FyZS5jeWdudXMuY29tCi0JCWdkYi1wYXRjaGVzQHNvdXJjZXdhcmUuY3lnbnVzLmNvbQotCi1iZmQvLCBiaW51dGlscy8sIGdhcy8sIGdwcm9mLywgbGQvLCBvcGNvZGVzLyAmIEJGRCdzIHBhcnQgb2YgaW5jbHVkZS8KLQliaW51dGlsczogaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9iaW51dGlscy8KLQlQYXRjaGVzIHRvIGJpbnV0aWxzQHNvdXJjZXdhcmUuY3lnbnVzLmNvbS4KLQlQbGVhc2Ugbm90aWZ5IHRoZSBmb2xsb3dpbmcgb2YgYW55IGludGVyZmFjZSBjaGFuZ2VzOgotCQlnZGItcGF0Y2hlc0Bzb3VyY2V3YXJlLmN5Z251cy5jb20KLQotY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViCi0JY29uZmlnOiBodHRwOi8vZ251Lm9yZwotCUNoYW5nZXMgbmVlZCB0byBiZSBkb25lIGluIHRhbmRlbSB3aXRoIHRoZSBvZmZpY2lhbCBDT05GSUcKLQlzb3VyY2VzIG9yIHN1Ym1pdHRlZCB0byB0aGUgbWFzdGVyIGZpbGUgbWFpbnRhaW5lciBhbmQgYnJvdWdodAotCWluIHZpYSBhIG1lcmdlLgotCi1saWJpYmVydHkvICYgbGliaWJlcnR5J3MgcGFydCBvZiBpbmNsdWRlLyAKLQlnY2M6IGh0dHA6Ly9nY2MuZ251Lm9yZwotCUNoYW5nZXMgbmVlZCB0byBiZSBkb25lIGluIHRhbmRlbSB3aXRoIHRoZSBvZmZpY2lhbCBHQ0MKLQlzb3VyY2VzIG9yIHN1Ym1pdHRlZCB0byB0aGUgbWFzdGVyIGZpbGUgbWFpbnRhaW5lciBhbmQgYnJvdWdodAotCWluIHZpYSBhIG1lcmdlLgotCi1sdGNvbmZpZywgbHRtYWluLnNoCi0JbGlidG9vbDogaHR0cDovL2dudS5vcmcKLQlDaGFuZ2VzIG5lZWQgdG8gYmUgZG9uZSBpbiB0YW5kZW0gd2l0aCB0aGUgb2ZmaWNpYWwgTElCVE9PTAotCXNvdXJjZXMgb3Igc3VibWl0dGVkIHRvIHRoZSBtYXN0ZXIgZmlsZSBtYWludGFpbmVyIGFuZCBicm91Z2h0Ci0JaW4gdmlhIGEgbWVyZ2UuCi0KLW1raW5zdGFsbGRpcnMsIG1vdmUtaWYtY2hhbmdlLCBzeW1saW5rLXRyZWUKLQlhdXRvY29uZjogaHR0cDovL2dudS5vcmcKLQlDaGFuZ2UgbmVlZCB0byBiZSBkb25lIGluIHRhbmRlbSB3aXRoIHRoZSBvZmZpY2lhbCBBVVRPQ09ORgotCXNvdXJjZXMgb3Igc3VibWl0dGVkIHRvIHRoZSBtYXN0ZXIgZmlsZSBtYWludGFpbmVyIGFuZCBicm91Z2h0Ci0JaW4gdmlhIGEgbWVyZ2UuCi0KLW5ld2xpYi8sIGxpYmdsb3NzLwotCWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbmV3bGliLwotCVBhdGNoZXMgdG8gbmV3bGliQHNvdXJjZXdhcmUuY3lnbnVzLmNvbS4KLQotZ2RiLywgbW1hbGxvYy8sIHJlYWRsaW5lLywgc2ltLyAmIEdEQidzIHBhcnQgb2YgaW5jbHVkZS8KLQlnZGI6IGh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vZ2RiLwotCVBhdGNoZXMgdG8gZ2RiLXBhdGNoZXNAc291cmNld2FyZS5jeWdudXMuY29tLgotCVNlZSBhbHNvIGdkYi9NQUlOVEFJTkVSUywgc2ltL01BSU5UQUlORVJTLCBtbWFsbG9jL01BSU5UQUlORVJTLgotCi1pdGNsLywgdGNsLywgdGl4LywgdGsvLCBsaWJndWkvCi0JaW5zaWdodDogaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9pbnNpZ2h0LwotCUNvbnRhY3QgaW5zaWdodEBzb3VyY2V3YXJlLmN5Z251cy5jb20uCi0KLXdpbnN1cC8KLQljeWd3aW46IGh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vY3lnd2luCi0JUGF0Y2hlcyB0byBjeWd3aW4tcGF0Y2hlc0Bzb3VyY2V3YXJlLmN5Z251cy5jb20uCi0JR2VuZXJhbCBkaXNjdXNzaW9uIGN5Z3dpbkBzb3VyY2V3YXJlLmN5Z251cy5jb20uCi0JU2VlIGFsc28gd2luc3VwL01BSU5UQUlORVJTLgotCi1leHBlY3QvLCBkZWphZ251LywgY29uZmlnLW1sLmluLCBtcHctUkVBRE1FLCBtcHctYnVpbGQuaW4sCi1tcHctY29uZmlnLmluLCBtcHctY29uZmlndXJlLCBtcHctaW5zdGFsbCwgc2V0dXAuY29tLCB0ZXhpbmZvLywKLW1pc3NpbmcsIG1ha2VmaWxlLnZtcywgdXRpbHMvLCBjb25maWcvLCBjb25maWcuaWYsIG1ha2VmaWxlLnZtcywKLW1pc3NpbmcsIHlsd3JhcCwgbWtkZXAsIGV0Yy8sIGluc3RhbGwtc2gsIGludGwvCi0JPwotCi1tb2R1bGVzIGZpbGUKLQlPYnZpb3VzbHkgY2hhbmdlcyB0byB0aGlzIGZpbGUgc2hvdWxkIG5vdCBnbyB0aHJvdWdoCi0Jb3ZlcnNlZXJzQHNvdXJjZXdhcmUuY3lnbnVzLmNvbS4gIElmIHlvdSB1bmRlcnN0YW5kIHRoZSBmaWxlCi0JZm9ybWF0IChvciBjYW4gY3V0LWFuZC1wYXN0ZSBleGlzdGluZyBlbnRyaWVzKSwgbW9kaWZ5IGl0LiBJZgotCWl0IHNjYXJlcyB5b3UsIGdldCBzb21lb25lIHdobyBkb2VzIHVuZGVyc3RhbmQgaXQgdG8gaGVscCB5b3UuCi0JQmUgcHJlcGFyZWQgdG8gZml4IGl0IGlmIHlvdSBkbyBicmVhayBpdC4KLQotLyogTG9jYWwgdmFyaWFibGVzOiAqLwotLyogY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWU6ICIvZGV2L251bGwiICovCi0vKiBFbmQ6ICovCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFjYmQwLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTkxMyArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBzdWJkaXJzIHRvIGJ1aWxkLgotIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi1zcmNkaXIgPSAuCi0KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLWJpbmRpcj0ke2V4ZWNfcHJlZml4fS9iaW4KLXNiaW5kaXI9JHtleGVjX3ByZWZpeH0vc2JpbgotbGliZXhlY2Rpcj0ke2V4ZWNfcHJlZml4fS9saWJleGVjCi1kYXRhZGlyPSR7cHJlZml4fS9zaGFyZQotc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCi1zaGFyZWRzdGF0ZWRpcj0ke3ByZWZpeH0vY29tCi1sb2NhbHN0YXRlZGlyPSR7cHJlZml4fS92YXIKLWxpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKLWluY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKLW9sZGluY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCi1pbmZvZGlyPSR7cHJlZml4fS9pbmZvCi1tYW5kaXI9JHtwcmVmaXh9L21hbgotZ3h4X2luY2x1ZGVfZGlyPSR7aW5jbHVkZWRpcn0vZysrCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldCkKLQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9Ci0KLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCi1tYW4zZGlyID0gJChtYW5kaXIpL21hbjMKLW1hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAotbWFuNWRpciA9ICQobWFuZGlyKS9tYW41Ci1tYW42ZGlyID0gJChtYW5kaXIpL21hbjYKLW1hbjdkaXIgPSAkKG1hbmRpcikvbWFuNwotbWFuOGRpciA9ICQobWFuZGlyKS9tYW44Ci1tYW45ZGlyID0gJChtYW5kaXIpL21hbjkKLWluZm9kaXIgPSAkKHByZWZpeCkvaW5mbwotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCi0jIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgZXRjLgotbGlic3ViZGlyID0gJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpLyQoZ2NjX3ZlcnNpb24pCi1HREJfTkxNX0RFUFMgPSAKLQotU0hFTEwgPSAvYmluL3NoCi0KLSMgSU5TVEFMTF9QUk9HUkFNX0FSR1MgaXMgY2hhbmdlZCBieSBjb25maWd1cmUuaW4gdG8gdXNlIC14IGZvciBhCi0jIGN5Z3dpbiBob3N0LgotSU5TVEFMTF9QUk9HUkFNX0FSR1MgPQotCi1JTlNUQUxMID0gJChTSEVMTCkgJCRzL2luc3RhbGwtc2ggLWMKLUlOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgJChJTlNUQUxMX1BST0dSQU1fQVJHUykKLUlOU1RBTExfU0NSSVBUID0gJChJTlNUQUxMKQotSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKSAtbSA2NDQKLQotSU5TVEFMTF9ET1NSRUwgPSBpbnN0YWxsLWRvc3JlbC1mYWtlCi0KLUFTID0gYXMKLUFSID0gYXIKLUFSX0ZMQUdTID0gcmMKLUNDID0gY2MKLQotIyBTcGVjaWFsIHZhcmlhYmxlcyBwYXNzZWQgZG93biBpbiBFWFRSQV9HQ0NfRkxBR1MuICBUaGV5IGFyZSBkZWZpbmVkCi0jIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IE1ha2VmaWxlIGZyYWdtZW50cy4KLUhPU1RfQ0MgPSAkKENDX0ZPUl9CVUlMRCkKLUhPU1RfUFJFRklYID0gCi1IT1NUX1BSRUZJWF8xID0gbG9zZXItCi0KLSMgVGhlc2UgZmxhZyB2YWx1ZXMgYXJlIG5vcm1hbGx5IG92ZXJyaWRkZW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi1DRkxBR1MgPSAtZwotQ1hYRkxBR1MgPSAtZyAtTzIKLQotTERGTEFHUyA9IAotTElCQ0ZMQUdTID0gJChDRkxBR1MpCi1DRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTKQotTERGTEFHU19GT1JfVEFSR0VUID0gCi1MSUJDRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTX0ZPUl9UQVJHRVQpCi1QSUNGTEFHID0gCi1QSUNGTEFHX0ZPUl9UQVJHRVQgPSAKLQotQ0hJTExGTEFHUyA9ICQoQ0ZMQUdTKQotQ0hJTExfTElCID0gLWxjaGlsbAotQ1hYID0gYysrCi0KLSMgVXNlIC1PMiB0byBzdHJlc3MgdGVzdCB0aGUgY29tcGlsZXIuCi1MSUJDWFhGTEFHUyA9ICQoQ1hYRkxBR1MpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotQ1hYRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ1hYRkxBR1MpCi1MSUJDWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHU19GT1JfVEFSR0VUKSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyAtZmV4Y2VwdGlvbnMKLQotUkFOTElCID0gcmFubGliCi0KLURMTFRPT0wgPSBkbGx0b29sCi1XSU5EUkVTID0gd2luZHJlcwotCi1OTSA9IG5tCi0KLUxEID0gbGQKLQotQlpJUFBST0cgPSBiemlwMgotTUQ1UFJPRyA9IG1kNXN1bQotCi0jIFRoZXNlIHZhbHVlcyBhcmUgc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlLgotREVGQVVMVF9ZQUNDID0geWFjYwotREVGQVVMVF9MRVggPSBsZXgKLURFRkFVTFRfTTQgPSBtNAotCi1CSVNPTiA9IGBpZiBbIC1mICQkci9iaXNvbi9iaXNvbiBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2Jpc29uL2Jpc29uIC1MICQkcy9iaXNvbi8gOyBcCi0JIGVsc2UgXAotCSAgICBlY2hvIGJpc29uIDsgXAotCSBmaWAKLQotWUFDQyA9IGBpZiBbIC1mICQkci9iaXNvbi9iaXNvbiBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2Jpc29uL2Jpc29uIC15IC1MICQkcy9iaXNvbi8gOyBcCi0JZWxpZiBbIC1mICQkci9ieWFjYy9ieWFjYyBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2J5YWNjL2J5YWNjIDsgXAotCWVsc2UgXAotCSAgICBlY2hvICR7REVGQVVMVF9ZQUNDfSA7IFwKLQlmaWAKLQotTEVYID0gYGlmIFsgLWYgJCRyL2ZsZXgvZmxleCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZmxleC9mbGV4IDsgXAotCWVsc2UgZWNobyAke0RFRkFVTFRfTEVYfSA7IGZpYAotCi1NNCA9IGBpZiBbIC1mICQkci9tNC9tNCBdIDsgXAotCXRoZW4gZWNobyAkJHIvbTQvbTQgOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9NNH0gOyBmaWAKLQotTUFLRUlORk8gPSBgaWYgWyAtZiAkJHIvdGV4aW5mby9tYWtlaW5mby9NYWtlZmlsZSBdIDsgXAotCXRoZW4gZWNobyAkJHIvdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyA7IFwKLQllbHNlIGVjaG8gbWFrZWluZm8gOyBmaWAKLQotIyBUaGlzIGp1c3QgYmVjb21lcyBwYXJ0IG9mIHRoZSBNQUtFSU5GTyBkZWZpbml0aW9uIHBhc3NlZCBkb3duIHRvCi0jIHN1Yi1tYWtlcy4gIEl0IGxldHMgZmxhZ3MgYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSB3aGlsZSBzdGlsbAotIyB1c2luZyB0aGUgbWFrZWluZm8gZnJvbSB0aGUgb2JqZWN0IHRyZWUuCi1NQUtFSU5GT0ZMQUdTID0KLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyL2V4cGVjdC9leHBlY3QgXSA7IFwKLQl0aGVuIGVjaG8gJCRyL2V4cGVjdC9leHBlY3QgOyBcCi0JZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCRzL2RlamFnbnUvcnVudGVzdCBdIDsgXAotCXRoZW4gZWNobyAkJHMvZGVqYWdudS9ydW50ZXN0IDsgXAotCWVsc2UgZWNobyBydW50ZXN0IDsgZmlgCi0KLQotIyBjb21waWxlcnMgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBtdXN0IGJlIHJ1biBpbiB0aGUgYnVpbGQKLSMgZW52aXJvbm1lbnQuCi1DQ19GT1JfQlVJTEQgPSAkKENDKQotQ1hYX0ZPUl9CVUlMRCA9ICQoQ1hYKQotCi1TVUJESVJTID0gInRoaXMgaXMgc2V0IHZpYSBjb25maWd1cmUsIGRvbid0IGVkaXQgdGhpcyIKLU9USEVSUyA9IAotCi0jIFRoaXMgaXMgc2V0IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoCi0jIHNob3VsZCBiZSBidWlsdCB1c2luZyB0aGUgdGFyZ2V0IHRvb2xzLgotCi0KLVRBUkdFVF9DT05GSUdESVJTID0gbGliaWJlcnR5IGxpYmdsb3NzICQoU1BFQ0lBTF9MSUJTKSBuZXdsaWIgbGliaW8gbGlicnggbGlic3RkYysrIGxpYmcrKyB3aW5zdXAgb3Bjb2RlcyBic3AgbGlic3R1YiBjeWdtb24KLQotIyBUYXJnZXQgbGlicmFyaWVzIGFyZSBwdXQgdW5kZXIgdGhpcyBkaXJlY3Rvcnk6Ci0jIENoYW5nZWQgYnkgY29uZmlndXJlIHRvICQodGFyZ2V0X2FsaWFzKSBpZiBjcm9zcy4KLVRBUkdFVF9TVUJESVIgPSAuCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gY29uZmlndXJlLgotQ09ORklHX0FSR1VNRU5UUyA9IAotCi0jIFRoaXMgaXMgc2V0IGJ5IGNvbmZpZ3VyZSB0byBSRUFMTFlfU0VUX0xJQl9QQVRIIGlmIC0tZW5hYmxlLXNoYXJlZAotIyB3YXMgdXNlZC4KLVNFVF9MSUJfUEFUSCA9Ci0KLSMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCBmb3IgdGhlIHBhdGggdG8KLSMgdGhlIGxpYnJhcmllcy4gIFRoaXMgbWF5IGJlIGNoYW5nZWQgYnkgY29uZmlndXJlLmluLgotUlBBVEhfRU5WVkFSID0gTERfTElCUkFSWV9QQVRICi0KLSMgY29uZmlndXJlLmluIHNldHMgU0VUX0xJQl9QQVRIIHRvIHRoaXMgaWYgLS1lbmFibGUtc2hhcmVkIHdhcyB1c2VkLgotUkVBTExZX1NFVF9MSUJfUEFUSCA9IFwKLSAgaWYgWyB4IiQkJChSUEFUSF9FTlZWQVIpIiAhPSB4IF07IHRoZW4gXAotICAgICQoUlBBVEhfRU5WVkFSKT0kJHIvYmZkOiQkci9vcGNvZGVzOiQkJChSUEFUSF9FTlZWQVIpOyBcCi0gIGVsc2UgXAotICAgICQoUlBBVEhfRU5WVkFSKT0kJHIvYmZkOiQkci9vcGNvZGVzOyBcCi0gIGZpOyBcCi0gIGV4cG9ydCAkKFJQQVRIX0VOVlZBUik7Ci0KLUFMTCA9IGFsbC5ub3JtYWwKLUlOU1RBTExfVEFSR0VUID0gaW5zdGFsbGRpcnMgXAotCWluc3RhbGwtZ2NjIFwKLQkkKElOU1RBTExfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9YMTFfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9ET1NSRUwpCi0KLUlOU1RBTExfVEFSR0VUX0NST1NTID0gaW5zdGFsbGRpcnMgXAotCWluc3RhbGwtZ2NjLWNyb3NzIFwKLQkkKElOU1RBTExfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9YMTFfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9ET1NSRUwpCi0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGNhc2UgIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIGluIFwKLSAgICAgICAgaVszNDU2XTg2LSotY3lnd2luKikgXAotICAgICAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUIkKGJ1aWxkX3Rvb2xkaXIpL2Jpbi8gLUIkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvd2luc3VwIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvd2luc3VwL2N5Z3dpbiAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cC93MzJhcGkvbGliIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy93aW5zdXAvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy93aW5zdXAvY3lnd2luL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL3czMmFwaS9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkKGJ1aWxkX3Rvb2xkaXIpL2Jpbi8gLUIkKGJ1aWxkX3Rvb2xkaXIpL2xpYi8gLUIkJHIvZ2NjLyAtaXN5c3RlbSAkKGJ1aWxkX3Rvb2xkaXIpL2luY2x1ZGU7IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0jIElmIENDX0ZPUl9UQVJHRVQgaXMgbm90IG92ZXJyaWRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIHRoaXMKLSMgdmFyaWFibGUgaXMgcGFzc2VkIGRvd24gdG8gdGhlIGdjYyBNYWtlZmlsZSwgd2hlcmUgaXQgaXMgdXNlZCB0bwotIyBidWlsZCBsaWJnY2MyLmEuICBXZSBkZWZpbmUgaXQgaGVyZSBzbyB0aGF0IGl0IGNhbiBpdHNlbGYgYmUKLSMgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgotR0NDX0ZPUl9UQVJHRVQgPSAkJHIvZ2NjL3hnY2MgLUIkKGJ1aWxkX3Rvb2xkaXIpL2Jpbi8gLUIkKGJ1aWxkX3Rvb2xkaXIpL2xpYi8gLUIkJHIvZ2NjLyAtSSQoYnVpbGRfdG9vbGRpcikvaW5jbHVkZQotCi1DSElMTF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1MJCRyL2djYy9jaC9ydW50aW1lLzsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1DWFhfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQoYnVpbGRfdG9vbGRpcikvYmluLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9jeWd3aW4vaW5jbHVkZSAtaWRpcmFmdGVyICQkcy93aW5zdXAvdzMyYXBpL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MvZysrIC1CJChidWlsZF90b29sZGlyKS9iaW4vIC1CJChidWlsZF90b29sZGlyKS9saWIvIC1CJCRyL2djYy8gLUkkKGJ1aWxkX3Rvb2xkaXIpL2luY2x1ZGU7IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENYWCk7IFwKLSAgICBlbHNlIFwKLSAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGMrKyB8IHNlZCAtZSAncy94L3gvJyAkJHQ7IFwKLSAgICBmaTsgXAotICBmaWAKLQotQVNfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nYXMvYXMtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9nYXMvYXMtbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKEFTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGFzIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotTERfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9sZC9sZC1uZXcgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2xkL2xkLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChMRCk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBsZCB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLURMTFRPT0xfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9iaW51dGlscy9kbGx0b29sIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9kbGx0b29sIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKERMTFRPT0wpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZGxsdG9vbCB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVdJTkRSRVNfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9iaW51dGlscy93aW5kcmVzIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy93aW5kcmVzIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFdJTkRSRVMpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gd2luZHJlcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFSX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvYXIgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2JpbnV0aWxzL2FyIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKEFSKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGFyIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotUkFOTElCX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvcmFubGliIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9yYW5saWIgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoUkFOTElCKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHJhbmxpYiB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLU5NX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvbm0tbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9ubS1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTk0pOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbm0gfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0jIFRoZSBmaXJzdCBydWxlIGluIHRoZSBmaWxlIGhhZCBiZXR0ZXIgYmUgdGhpcyBvbmUuICBEb24ndCBwdXQgYW55IGFib3ZlIGl0LgotIyBUaGlzIGxpdmVzIGhlcmUgdG8gYWxsb3cgbWFrZWZpbGUgZnJhZ21lbnRzIHRvIGNvbnRhaW4gZGVwZW5kZW5jaWVzLgotYWxsOiBhbGwubm9ybWFsCi0uUEhPTlk6IGFsbAotCi0jIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbmZpZy9tdC0qLgotIyBUaGUgX1RBUkdFVF8gaXMgYmVjYXVzZSB0aGV5J3JlIHNwZWNpZmllZCBpbiBtdC1mb28uCi0jIFRoZSBfSE9TVF8gaXMgYmVjYXVzZSB0aGV5J3JlIHByb2dyYW1zIHRoYXQgcnVuIG9uIHRoZSBob3N0LgotRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMgPQotRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMgPQotCi0jIyMjIGhvc3QgYW5kIHRhcmdldCBzcGVjaWZpYyBtYWtlZmlsZSBmcmFnbWVudHMgY29tZSBpbiBoZXJlLgotIyMjCi0KLSMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIGFsbCBzdWItbWFrZXMuCi0jIFBsZWFzZSBrZWVwIHRoZXNlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLUJBU0VfRkxBR1NfVE9fUEFTUyA9IFwKLQkiQVJfRkxBR1M9JChBUl9GTEFHUykiIFwKLQkiQVJfRk9SX1RBUkdFVD0kKEFSX0ZPUl9UQVJHRVQpIiBcCi0JIkFTX0ZPUl9UQVJHRVQ9JChBU19GT1JfVEFSR0VUKSIgXAotCSJCSVNPTj0kKEJJU09OKSIgXAotCSJDQ19GT1JfQlVJTEQ9JChDQ19GT1JfQlVJTEQpIiBcCi0JIkNDX0ZPUl9UQVJHRVQ9JChDQ19GT1JfVEFSR0VUKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIkNGTEFHU19GT1JfVEFSR0VUPSQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMRkxBR1M9JChDSElMTEZMQUdTKSIgXAotCSJDSElMTF9GT1JfVEFSR0VUPSQoQ0hJTExfRk9SX1RBUkdFVCkiIFwKLQkiQ0hJTExfTElCPSQoQ0hJTExfTElCKSIgXAotCSJDWFhfRk9SX0JVSUxEPSQoQ1hYX0ZPUl9CVUlMRCkiIFwKLQkiQ1hYRkxBR1M9JChDWFhGTEFHUykiIFwKLQkiQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKENYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIkNYWF9GT1JfVEFSR0VUPSQoQ1hYX0ZPUl9UQVJHRVQpIiBcCi0JIkRMTFRPT0xfRk9SX1RBUkdFVD0kKERMTFRPT0xfRk9SX1RBUkdFVCkiIFwKLQkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCi0JIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKLQkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAotCSJJTlNUQUxMX1NDUklQVD0kKElOU1RBTExfU0NSSVBUKSIgXAotCSJMREZMQUdTPSQoTERGTEFHUykiIFwKLQkiTEVYPSQoTEVYKSIgXAotCSJMRF9GT1JfVEFSR0VUPSQoTERfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAotCSJMSUJDRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJMSUJDWFhGTEFHUz0kKExJQkNYWEZMQUdTKSIgXAotCSJMSUJDWFhGTEFHU19GT1JfVEFSR0VUPSQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTTQ9JChNNCkiIFwKLQkiTUFLRT0kKE1BS0UpIiBcCi0JIk1BS0VJTkZPPSQoTUFLRUlORk8pICQoTUFLRUlORk9GTEFHUykiIFwKLQkiTk1fRk9SX1RBUkdFVD0kKE5NX0ZPUl9UQVJHRVQpIiBcCi0JIlJBTkxJQl9GT1JfVEFSR0VUPSQoUkFOTElCX0ZPUl9UQVJHRVQpIiBcCi0JIlJQQVRIX0VOVlZBUj0kKFJQQVRIX0VOVlZBUikiIFwKLQkiU0hFTEw9JChTSEVMTCkiIFwKLQkiRVhQRUNUPSQoRVhQRUNUKSIgXAotCSJSVU5URVNUPSQoUlVOVEVTVCkiIFwKLQkiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIgXAotCSJUQVJHRVRfU1VCRElSPSQoVEFSR0VUX1NVQkRJUikiIFwKLQkiV0lORFJFU19GT1JfVEFSR0VUPSQoV0lORFJFU19GT1JfVEFSR0VUKSIgXAotCSJZQUNDPSQoWUFDQykiIFwKLQkiYmluZGlyPSQoYmluZGlyKSIgXAotCSJkYXRhZGlyPSQoZGF0YWRpcikiIFwKLQkiZXhlY19wcmVmaXg9JChleGVjX3ByZWZpeCkiIFwKLQkiaW5jbHVkZWRpcj0kKGluY2x1ZGVkaXIpIiBcCi0JImluZm9kaXI9JChpbmZvZGlyKSIgXAotCSJsaWJkaXI9JChsaWJkaXIpIiBcCi0JImxpYmV4ZWNkaXI9JChsaWJleGVjZGlyKSIgXAotCSJsaXNwZGlyPSQobGlzcGRpcikiIFwKLQkibG9jYWxzdGF0ZWRpcj0kKGxvY2Fsc3RhdGVkaXIpIiBcCi0JIm1hbmRpcj0kKG1hbmRpcikiIFwKLQkib2xkaW5jbHVkZWRpcj0kKG9sZGluY2x1ZGVkaXIpIiBcCi0JInByZWZpeD0kKHByZWZpeCkiIFwKLQkic2JpbmRpcj0kKHNiaW5kaXIpIiBcCi0JInNoYXJlZHN0YXRlZGlyPSQoc2hhcmVkc3RhdGVkaXIpIiBcCi0JInN5c2NvbmZkaXI9JChzeXNjb25mZGlyKSIgXAotCSJ0b29sZGlyPSQodG9vbGRpcikiIFwKLQkiZ3h4X2luY2x1ZGVfZGlyPSQoZ3h4X2luY2x1ZGVfZGlyKSIgXAotCSJnY2NfdmVyc2lvbj0kKGdjY192ZXJzaW9uKSIgXAotCSJnY2NfdmVyc2lvbl90cmlnZ2VyPSQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikiIFwKLQkidGFyZ2V0X2FsaWFzPSQodGFyZ2V0X2FsaWFzKSIgXAotCSJsaWJzdWJkaXI9JChsaWJzdWJkaXIpIgotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBtb3N0IHN1Yi1tYWtlcywgaW4gd2hpY2ggd2UncmUgYnVpbGRpbmcgd2l0aAotIyB0aGUgaG9zdCBlbnZpcm9ubWVudC4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfSE9TVF9GTEFHUyA9IFwKLQknQVI9JChBUiknIFwKLQknQVM9JChBUyknIFwKLQknQ0M9JChDQyknIFwKLQknQ1hYPSQoQ1hYKScgXAotCSdETExUT09MPSQoRExMVE9PTCknIFwKLQknTEQ9JChMRCknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQoV0lORFJFUyknCi0KLUZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9IT1NUX0ZMQUdTKQotCi0jIEZsYWdzIHRoYXQgYXJlIGNvbmNlcm5lZCB3aXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgWDExIGluY2x1ZGUgZmlsZXMKLSMgYW5kIGxpYnJhcnkgZmlsZXMKLSMKLSMgTk9URTogdW50aWwgdGhlIHRvcC1sZXZlbCBpcyBnZXR0aW5nIHRoZSB2YWx1ZXMgdmlhIGF1dG9jb25mLCBpdCBvbmx5Ci0jIGNhdXNlcyBwcm9ibGVtcyB0byBoYXZlIHRoaXMgdG9wLWxldmVsIE1ha2VmaWxlIG92ZXJyaWRpbmcgdGhlIGF1dG9jb25mLXNldAotIyB2YWx1ZXMgaW4gY2hpbGQgZGlyZWN0b3JpZXMuICBPbmx5IHZhcmlhYmxlcyB0aGF0IGRvbid0IGNvbmZsaWN0IHdpdGgKLSMgYXV0b2NvbmYnZWQgb25lcyBzaG91bGQgYmUgcGFzc2VkIGJ5IFgxMV9GTEFHU19UT19QQVNTIGZvciBub3cuCi0jCi1YMTFfRkxBR1NfVE9fUEFTUyA9IFwKLQknWDExX0VYVFJBX0NGTEFHUz0kKFgxMV9FWFRSQV9DRkxBR1MpJyBcCi0JJ1gxMV9FWFRSQV9MSUJTPSQoWDExX0VYVFJBX0xJQlMpJwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBtYWtlcyB3aGljaCBhcmUgYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGVudmlyb25tZW50LgotIyBUaGUgZG91YmxlICQgZGVjcmVhc2VzIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZTsgdGhlIHZhcmlhYmxlcwotIyBhcmUgc2V0IGluIEJBU0VfRkxBR1NfVE9fUEFTUywgYW5kIHRoZSBzdWItbWFrZSB3aWxsIGV4cGFuZCB0aGVtLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi1FWFRSQV9UQVJHRVRfRkxBR1MgPSBcCi0JJ0FSPSQkKEFSX0ZPUl9UQVJHRVQpJyBcCi0JJ0FTPSQkKEFTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NDPSQkKENDX0ZPUl9UQVJHRVQpJyBcCi0JJ0NGTEFHUz0kJChDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknQ1hYPSQkKENYWF9GT1JfVEFSR0VUKScgXAotCSdDWFhGTEFHUz0kJChDWFhGTEFHU19GT1JfVEFSR0VUKScgXAotCSdETExUT09MPSQkKERMTFRPT0xfRk9SX1RBUkdFVCknIFwKLQknTEQ9JCQoTERfRk9SX1RBUkdFVCknIFwKLQknTElCQ0ZMQUdTPSQkKExJQkNGTEFHU19GT1JfVEFSR0VUKScgXAotCSdMSUJDWFhGTEFHUz0kJChMSUJDWFhGTEFHU19GT1JfVEFSR0VUKScgXAotCSdOTT0kJChOTV9GT1JfVEFSR0VUKScgXAotCSdSQU5MSUI9JCQoUkFOTElCX0ZPUl9UQVJHRVQpJyBcCi0JJ1dJTkRSRVM9JCQoV0lORFJFU19GT1JfVEFSR0VUKScKLQotVEFSR0VUX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9UQVJHRVRfRkxBR1MpCi0KLSMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIGdjYy4gIGdjYyBidWlsZHMgYSBsaWJyYXJ5LCBsaWJnY2MuYSwgc28gaXQKLSMgdW5mb3J0dW5hdGVseSBuZWVkcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFuZCB0aGUgdGFyZ2V0IGFyIGFuZAotIyByYW5saWIuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLSMgVGhlIEhPU1RfKiB2YXJpYWJsZXMgYXJlIGEgc3BlY2lhbCBjYXNlLCB3aGljaCBhcmUgdXNlZCBmb3IgdGhlIGdjYwotIyBjcm9zcy1idWlsZGluZyBzY2hlbWUuCi1FWFRSQV9HQ0NfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0hPU1RfQ0M9JChDQ19GT1JfQlVJTEQpJyBcCi0JJ0hPU1RfUFJFRklYPSQoSE9TVF9QUkVGSVgpJyBcCi0JJ0hPU1RfUFJFRklYXzE9JChIT1NUX1BSRUZJWF8xKScgXAotCSdOTT0kKE5NKScgXAotCSdSQU5MSUI9JChSQU5MSUIpJyBcCi0JJ1dJTkRSRVM9JCQoV0lORFJFU19GT1JfVEFSR0VUKScgXAotCSJHQ0NfRk9SX1RBUkdFVD0kKEdDQ19GT1JfVEFSR0VUKSIgXAotCSJgZWNobyAnTEFOR1VBR0VTPSQoTEFOR1VBR0VTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdTVE1QX0ZJWFBST1RPPSQoU1RNUF9GSVhQUk9UTyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnTElNSVRTX0hfVEVTVD0kKExJTUlUU19IX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzFfVEVTVD0kKExJQkdDQzFfVEVTVCknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnTElCR0NDMl9DRkxBR1M9JChMSUJHQ0MyX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnTElCR0NDMl9ERUJVR19DRkxBR1M9JChMSUJHQ0MyX0RFQlVHX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnTElCR0NDMl9JTkNMVURFUz0kKExJQkdDQzJfSU5DTFVERVMpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0VOUVVJUkU9JChFTlFVSVJFKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdCT09UX0NGTEFHUz0kKEJPT1RfQ0ZMQUdTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIgotCi1HQ0NfRkxBR1NfVE9fUEFTUyA9ICQoQkFTRV9GTEFHU19UT19QQVNTKSAkKEVYVFJBX0dDQ19GTEFHUykKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotQUxMX01PRFVMRVMgPSBcCi0JYWxsLWFwYWNoZSBcCi0JYWxsLWFzaCBcCi0JYWxsLWF1dG9jb25mIFwKLQlhbGwtYXV0b21ha2UgXAotCWFsbC1iYXNoIFwKLQlhbGwtYmZkIFwKLQlhbGwtYmludXRpbHMgXAotCWFsbC1iaXNvbiBcCi0JYWxsLWJ5YWNjIFwKLQlhbGwtYnppcDIgXAotCWFsbC1jdnNzcmMgXAotCWFsbC1kYiBcCi0JYWxsLWRlamFnbnUgXAotCWFsbC1kaWZmIFwKLQlhbGwtZG9zdXRpbHMgXAotCWFsbC1ldGMgXAotCWFsbC1maWxldXRpbHMgXAotCWFsbC1maW5kdXRpbHMgXAotCWFsbC1maW5kIFwKLQlhbGwtZmxleCBcCi0JYWxsLWdhcyBcCi0JYWxsLWdhd2sgXAotCWFsbC1nZXR0ZXh0IFwKLQlhbGwtZ251c2VydiBcCi0JYWxsLWdwcm9mIFwKLQlhbGwtZ3JlcCBcCi0JYWxsLWdyZXogXAotCWFsbC1nemlwIFwKLQlhbGwtaGVsbG8gXAotCWFsbC1pbmRlbnQgXAotCWFsbC1pbmV0IFwKLQlhbGwtaW50bCBcCi0JYWxsLWlzcGVsbCBcCi0JYWxsLWl0Y2wgXAotCWFsbC1sZCBcCi0JYWxsLWxpYmd1aSBcCi0JYWxsLWxpYmliZXJ0eSBcCi0JYWxsLWxpYnRvb2wgXAotCWFsbC1tNCBcCi0JYWxsLW1ha2UgXAotCWFsbC1tbWFsbG9jIFwKLQlhbGwtb3Bjb2RlcyBcCi0JYWxsLXBhdGNoIFwKLQlhbGwtcGVybCBcCi0JYWxsLXBybXMgXAotCWFsbC1yY3MgXAotCWFsbC1yZWFkbGluZSBcCi0JYWxsLXJlbGVhc2UgXAotCWFsbC1yZWNvZGUgXAotCWFsbC1zZWQgXAotCWFsbC1zZW5kLXByIFwKLQlhbGwtc2hlbGx1dGlscyBcCi0JYWxsLXNpbSBcCi0JYWxsLXRhciBcCi0JYWxsLXRjbCBcCi0JYWxsLXRjbDguMSBcCi0JYWxsLXRleGluZm8gXAotCWFsbC10ZXh0dXRpbHMgXAotCWFsbC10Z2FzIFwKLQlhbGwtdGltZSBcCi0JYWxsLXV1ZGVjb2RlIFwKLQlhbGwtd2RpZmYgXAotCWFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNoZWNrIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLSMKLSMgVGhlIGxpc3QgaXMgaW4gdHdvIHBhcnRzLiAgVGhlIGZpcnN0IGxpc3RzIHRob3NlIHRvb2xzIHdoaWNoCi0jIGFyZSB0ZXN0ZWQgYXMgcGFydCBvZiB0aGUgaG9zdCdzIG5hdGl2ZSB0b29sLWNoYWluLCBhbmQgbm90Ci0jIHRlc3RlZCBpbiBhIGNyb3NzIGNvbmZpZ3VyYXRpb24uCi1OQVRJVkVfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1iaXNvbiBcCi0JY2hlY2stYnlhY2MgXAotCWNoZWNrLWZsZXggXAotCWNoZWNrLXppcAotCi1DUk9TU19DSEVDS19NT0RVTEVTID0gXAotCWNoZWNrLWFwYWNoZSBcCi0JY2hlY2stYXNoIFwKLQljaGVjay1hdXRvY29uZiBcCi0JY2hlY2stYXV0b21ha2UgXAotCWNoZWNrLWJhc2ggXAotCWNoZWNrLWJmZCBcCi0JY2hlY2stYmludXRpbHMgXAotCWNoZWNrLWJ6aXAyIFwKLQljaGVjay1jdnNzcmMgXAotCWNoZWNrLWRiIFwKLQljaGVjay1kZWphZ251IFwKLQljaGVjay1kaWZmIFwKLQljaGVjay1ldGMgXAotCWNoZWNrLWZpbGV1dGlscyBcCi0JY2hlY2stZmluZHV0aWxzIFwKLQljaGVjay1maW5kIFwKLQljaGVjay1nYXMgXAotCWNoZWNrLWdhd2sgXAotCWNoZWNrLWdldHRleHQgXAotCWNoZWNrLWdudXNlcnYgXAotCWNoZWNrLWdwcm9mIFwKLQljaGVjay1ncmVwIFwKLQljaGVjay1nemlwIFwKLQljaGVjay1oZWxsbyBcCi0JY2hlY2staW5kZW50IFwKLQljaGVjay1pbmV0IFwKLQljaGVjay1pbnRsIFwKLQljaGVjay1pc3BlbGwgXAotCWNoZWNrLWl0Y2wgXAotCWNoZWNrLWxkIFwKLQljaGVjay1saWJndWkgXAotCWNoZWNrLWxpYmliZXJ0eSBcCi0JY2hlY2stbGlidG9vbCBcCi0JY2hlY2stbTQgXAotCWNoZWNrLW1ha2UgXAotCWNoZWNrLW1tY2hlY2tvYyBcCi0JY2hlY2stb3Bjb2RlcyBcCi0JY2hlY2stcGF0Y2ggXAotCWNoZWNrLXBlcmwgXAotCWNoZWNrLXBybXMgXAotCWNoZWNrLXJjcyBcCi0JY2hlY2stcmVhZGxpbmUgXAotCWNoZWNrLXJlY29kZSBcCi0JY2hlY2stc2VkIFwKLQljaGVjay1zZW5kLXByIFwKLQljaGVjay1zaGVsbHV0aWxzIFwKLQljaGVjay1zaW0gXAotCWNoZWNrLXRhciBcCi0JY2hlY2stdGNsIFwKLQljaGVjay10ZXhpbmZvIFwKLQljaGVjay10ZXh0dXRpbHMgXAotCWNoZWNrLXRnYXMgXAotCWNoZWNrLXRpbWUgXAotCWNoZWNrLXV1ZGVjb2RlIFwKLQljaGVjay13ZGlmZiBcCi0JJChFWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTKQotCi1DSEVDS19NT0RVTEVTPSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgaW5zdGFsbCB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jIFdlIHB1dCBpbnN0YWxsLW9wY29kZXMgYmVmb3JlIGluc3RhbGwtYmludXRpbHMgYmVjYXVzZSB0aGUgaW5zdGFsbGVkCi0jIGJpbnV0aWxzIG1pZ2h0IGJlIG9uIFBBVEgsIGFuZCB0aGV5IG1pZ2h0IG5lZWQgdGhlIHNoYXJlZCBvcGNvZGVzCi0jIGxpYnJhcnkuCi0jIFdlIHB1dCBpbnN0YWxsLXRjbCBiZWZvcmUgaW5zdGFsbC1pdGNsIGJlY2F1c2UgaXRjbCB3YW50cyB0byBydW4gYQotIyBwcm9ncmFtIG9uIGluc3RhbGxhdGlvbiB3aGljaCB1c2VzIHRoZSBUY2wgbGlicmFyaWVzLgotSU5TVEFMTF9NT0RVTEVTID0gXAotCWluc3RhbGwtYXBhY2hlIFwKLQlpbnN0YWxsLWFzaCBcCi0JaW5zdGFsbC1hdXRvY29uZiBcCi0JaW5zdGFsbC1hdXRvbWFrZSBcCi0JaW5zdGFsbC1iYXNoIFwKLQlpbnN0YWxsLWJmZCBcCi0JaW5zdGFsbC1iemlwMiBcCi0JaW5zdGFsbC1vcGNvZGVzIFwKLQlpbnN0YWxsLWJpbnV0aWxzIFwKLQlpbnN0YWxsLWJpc29uIFwKLQlpbnN0YWxsLWJ5YWNjIFwKLQlpbnN0YWxsLWN2c3NyYyBcCi0JaW5zdGFsbC1kYiBcCi0JaW5zdGFsbC1kZWphZ251IFwKLQlpbnN0YWxsLWRpZmYgXAotCWluc3RhbGwtZG9zdXRpbHMgXAotCWluc3RhbGwtZXRjIFwKLQlpbnN0YWxsLWZpbGV1dGlscyBcCi0JaW5zdGFsbC1maW5kdXRpbHMgXAotCWluc3RhbGwtZmluZCBcCi0JaW5zdGFsbC1mbGV4IFwKLQlpbnN0YWxsLWdhcyBcCi0JaW5zdGFsbC1nYXdrIFwKLQlpbnN0YWxsLWdldHRleHQgXAotCWluc3RhbGwtZ251c2VydiBcCi0JaW5zdGFsbC1ncHJvZiBcCi0JaW5zdGFsbC1ncmVwIFwKLQlpbnN0YWxsLWdyZXogXAotCWluc3RhbGwtZ3ppcCBcCi0JaW5zdGFsbC1oZWxsbyBcCi0JaW5zdGFsbC1pbmRlbnQgXAotCWluc3RhbGwtaW5ldCBcCi0JaW5zdGFsbC1pbnRsIFwKLQlpbnN0YWxsLWlzcGVsbCBcCi0JaW5zdGFsbC10Y2wgXAotCWluc3RhbGwtdGNsOC4xIFwKLQlpbnN0YWxsLWl0Y2wgXAotCWluc3RhbGwtbGQgXAotCWluc3RhbGwtbGliZ3VpIFwKLQlpbnN0YWxsLWxpYmliZXJ0eSBcCi0JaW5zdGFsbC1saWJ0b29sIFwKLQlpbnN0YWxsLW00IFwKLQlpbnN0YWxsLW1ha2UgXAotCWluc3RhbGwtbW1hbGxvYyBcCi0JaW5zdGFsbC1wYXRjaCBcCi0JaW5zdGFsbC1wZXJsIFwKLQlpbnN0YWxsLXBybXMgXAotCWluc3RhbGwtcmNzIFwKLQlpbnN0YWxsLXJlYWRsaW5lIFwKLQlpbnN0YWxsLXJlY29kZSBcCi0JaW5zdGFsbC1zZWQgXAotCWluc3RhbGwtc2VuZC1wciBcCi0JaW5zdGFsbC1zaGVsbHV0aWxzIFwKLQlpbnN0YWxsLXNpbSBcCi0JaW5zdGFsbC10YXIgXAotCWluc3RhbGwtdGV4aW5mbyBcCi0JaW5zdGFsbC10ZXh0dXRpbHMgXAotCWluc3RhbGwtdGdhcyBcCi0JaW5zdGFsbC10aW1lIFwKLQlpbnN0YWxsLXV1ZGVjb2RlIFwKLQlpbnN0YWxsLXdkaWZmIFwKLQlpbnN0YWxsLXppcCBcCi0JJChFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1BTExfWDExX01PRFVMRVMgPSBcCi0JYWxsLWVtYWNzIFwKLQlhbGwtZW1hY3MxOSBcCi0JYWxsLWdkYiBcCi0JYWxsLWV4cGVjdCBcCi0JYWxsLWdhc2ggXAotCWFsbC1ndWlsZSBcCi0JYWxsLXRjbFggXAotCWFsbC10ayBcCi0JYWxsLXRrOC4xIFwKLQlhbGwtdGl4Ci0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNoZWNrIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1DSEVDS19YMTFfTU9EVUxFUyA9IFwKLQljaGVjay1lbWFjcyBcCi0JY2hlY2stZ2RiIFwKLQljaGVjay1ndWlsZSBcCi0JY2hlY2stZXhwZWN0IFwKLQljaGVjay1nYXNoIFwKLQljaGVjay10Y2xYIFwKLQljaGVjay10ayBcCi0JY2hlY2stdGl4Ci0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFgxMV9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfWDExX01PRFVMRVMgPSBcCi0JaW5zdGFsbC1lbWFjcyBcCi0JaW5zdGFsbC1lbWFjczE5IFwKLQlpbnN0YWxsLWdkYiBcCi0JaW5zdGFsbC1ndWlsZSBcCi0JaW5zdGFsbC1leHBlY3QgXAotCWluc3RhbGwtZ2FzaCBcCi0JaW5zdGFsbC10Y2xYIFwKLQlpbnN0YWxsLXRrIFwKLQlpbnN0YWxsLXRrOC4xIFwKLQlpbnN0YWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1RBUkdFVF9NT0RVTEVTID0gXAotCWFsbC10YXJnZXQtbGliaW8gXAotCWFsbC10YXJnZXQtbGlic3RkYysrIFwKLQlhbGwtdGFyZ2V0LWxpYnJ4IFwKLQlhbGwtdGFyZ2V0LWxpYmcrKyBcCi0JYWxsLXRhcmdldC1uZXdsaWIgXAotCWFsbC10YXJnZXQtbGlidGVybWNhcCBcCi0JYWxsLXRhcmdldC13aW5zdXAgXAotCWFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWFsbC10YXJnZXQtbGliaWJlcnR5IFwKLQlhbGwtdGFyZ2V0LWdwZXJmIFwKLQlhbGwtdGFyZ2V0LWV4YW1wbGVzIFwKLQlhbGwtdGFyZ2V0LWxpYnN0dWIgXAotCWFsbC10YXJnZXQtYnNwIFwKLQlhbGwtdGFyZ2V0LWN5Z21vbgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjb25maWd1cmUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoCi0jIGFyZSBjb21waWxlZCB1c2luZyB0aGUgdGFyZ2V0IHRvb2xzLgotQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTID0gXAotCWNvbmZpZ3VyZS10YXJnZXQtbGliaW8gXAotCWNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnJ4IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmcrKyBcCi0JY29uZmlndXJlLXRhcmdldC1uZXdsaWIgXAotCWNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBcCi0JY29uZmlndXJlLXRhcmdldC13aW5zdXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgXAotCWNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5IFwKLQljb25maWd1cmUtdGFyZ2V0LWdwZXJmIFwKLQljb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0dWIgXAotCWNvbmZpZ3VyZS10YXJnZXQtYnNwIFwKLQljb25maWd1cmUtdGFyZ2V0LWN5Z21vbgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfVEFSR0VUX01PRFVMRVMgPSBcCi0JY2hlY2stdGFyZ2V0LWxpYmlvIFwKLQljaGVjay10YXJnZXQtbGlic3RkYysrIFwKLQljaGVjay10YXJnZXQtbGliZysrIFwKLQljaGVjay10YXJnZXQtbmV3bGliIFwKLQljaGVjay10YXJnZXQtd2luc3VwIFwKLQljaGVjay10YXJnZXQtbGliaWJlcnR5IFwKLQljaGVjay10YXJnZXQtZ3BlcmYKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgaW5zdGFsbCB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgotSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLXRhcmdldC1saWJpbyBcCi0JaW5zdGFsbC10YXJnZXQtbGlic3RkYysrIFwKLQlpbnN0YWxsLXRhcmdldC1saWJnKysgXAotCWluc3RhbGwtdGFyZ2V0LW5ld2xpYiBcCi0JaW5zdGFsbC10YXJnZXQtbGlidGVybWNhcCBcCi0JaW5zdGFsbC10YXJnZXQtd2luc3VwIFwKLQlpbnN0YWxsLXRhcmdldC1saWJnbG9zcyBcCi0JaW5zdGFsbC10YXJnZXQtbGliaWJlcnR5IFwKLQlpbnN0YWxsLXRhcmdldC1ic3AgXAotCWluc3RhbGwtdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIHdoaWNoIHdlIGNhbiBkbyBhIGNsZWFuLXt0YXJnZXR9LgotQ0xFQU5fTU9EVUxFUyA9IFwKLQljbGVhbi1hcGFjaGUgXAotCWNsZWFuLWFzaCBcCi0JY2xlYW4tYXV0b2NvbmYgXAotCWNsZWFuLWF1dG9tYWtlIFwKLQljbGVhbi1iYXNoIFwKLQljbGVhbi1iZmQgXAotCWNsZWFuLWJpbnV0aWxzIFwKLQljbGVhbi1iaXNvbiBcCi0JY2xlYW4tYnlhY2MgXAotCWNsZWFuLWJ6aXAyIFwKLQljbGVhbi1jdnNzcmMgXAotCWNsZWFuLWRiIFwKLQljbGVhbi1kZWphZ251IFwKLQljbGVhbi1kaWZmIFwKLQljbGVhbi1kb3N1dGlscyBcCi0JY2xlYW4tZXRjIFwKLQljbGVhbi1maWxldXRpbHMgXAotCWNsZWFuLWZpbmR1dGlscyBcCi0JY2xlYW4tZmluZCBcCi0JY2xlYW4tZmxleCBcCi0JY2xlYW4tZ2FzIFwKLQljbGVhbi1nYXdrIFwKLQljbGVhbi1nZXR0ZXh0IFwKLQljbGVhbi1nbnVzZXJ2IFwKLQljbGVhbi1ncHJvZiBcCi0JY2xlYW4tZ3JlcCBcCi0JY2xlYW4tZ3JleiBcCi0JY2xlYW4tZ3ppcCBcCi0JY2xlYW4taGVsbG8gXAotCWNsZWFuLWluZGVudCBcCi0JY2xlYW4taW5ldCBcCi0JY2xlYW4taW50bCBcCi0JY2xlYW4taXNwZWxsIFwKLQljbGVhbi1pdGNsIFwKLQljbGVhbi1sZCBcCi0JY2xlYW4tbGliZ3VpIFwKLQljbGVhbi1saWJpYmVydHkgXAotCWNsZWFuLWxpYnRvb2wgXAotCWNsZWFuLW00IFwKLQljbGVhbi1tYWtlIFwKLQljbGVhbi1tbWFsbG9jIFwKLQljbGVhbi1vcGNvZGVzIFwKLQljbGVhbi1wYXRjaCBcCi0JY2xlYW4tcGVybCBcCi0JY2xlYW4tcHJtcyBcCi0JY2xlYW4tcmNzIFwKLQljbGVhbi1yZWFkbGluZSBcCi0JY2xlYW4tcmVsZWFzZSBcCi0JY2xlYW4tcmVjb2RlIFwKLQljbGVhbi1zZWQgXAotCWNsZWFuLXNlbmQtcHIgXAotCWNsZWFuLXNoZWxsdXRpbHMgXAotCWNsZWFuLXNpbSBcCi0JY2xlYW4tdGFyIFwKLQljbGVhbi10Y2wgXAotCWNsZWFuLXRleGluZm8gXAotCWNsZWFuLXRleHR1dGlscyBcCi0JY2xlYW4tdGdhcyBcCi0JY2xlYW4tdGltZSBcCi0JY2xlYW4tdXVkZWNvZGUgXAotCWNsZWFuLXdkaWZmIFwKLQljbGVhbi16aXAKLQotIyBBbGwgb2YgdGhlIHRhcmdldCBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1RBUkdFVF9NT0RVTEVTID0gXAotCWNsZWFuLXRhcmdldC1saWJpbyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnJ4IFwKLQljbGVhbi10YXJnZXQtbGliZysrIFwKLQljbGVhbi10YXJnZXQtbmV3bGliIFwKLQljbGVhbi10YXJnZXQtd2luc3VwIFwKLQljbGVhbi10YXJnZXQtbGliZ2xvc3MgXAotCWNsZWFuLXRhcmdldC1saWJpYmVydHkgXAotCWNsZWFuLXRhcmdldC1ncGVyZiBcCi0JY2xlYW4tdGFyZ2V0LWV4YW1wbGVzIFwKLQljbGVhbi10YXJnZXQtbGlic3R1YiBcCi0JY2xlYW4tdGFyZ2V0LWJzcCBcCi0JY2xlYW4tdGFyZ2V0LWN5Z21vbgotCi0jIEFsbCBvZiB0aGUgeDExIG1vZHVsZXMgdGhhdCBjYW4gYmUgY2xlYW5lZAotQ0xFQU5fWDExX01PRFVMRVMgPSBcCi0JY2xlYW4tZW1hY3MgXAotCWNsZWFuLWVtYWNzMTkgXAotCWNsZWFuLWdkYiBcCi0JY2xlYW4tZXhwZWN0IFwKLQljbGVhbi1nYXNoIFwKLQljbGVhbi1ndWlsZSBcCi0JY2xlYW4tdGNsWCBcCi0JY2xlYW4tdGsgXAotCWNsZWFuLXRpeAotCi0jIFRoZSB0YXJnZXQgYnVpbHQgZm9yIGEgbmF0aXZlIGJ1aWxkLgotLlBIT05ZOiBhbGwubm9ybWFsCi1hbGwubm9ybWFsOiBcCi0JJChBTExfTU9EVUxFUykgXAotCSQoQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChBTExfVEFSR0VUX01PRFVMRVMpIFwKLQlhbGwtZ2NjCi0KLSMgRG8gYSB0YXJnZXQgZm9yIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMuICBBIGBgbWFrZSBkby1YJycgd2lsbCBkbyBhCi0jIGBgbWFrZSBYJycgaW4gYWxsIHN1YmRpcmVjdG9yaWVzIChiZWNhdXNlLCBpbiBnZW5lcmFsLCB0aGVyZSBpcyBhCi0jIGRlcGVuZGVuY3kgKGJlbG93KSBvZiBYIHVwb24gZG8tWCwgYSBgYG1ha2UgWCcnIHdpbGwgYWxzbyBkbyB0aGlzLAotIyBidXQgaXQgbWF5IGRvIGFkZGl0aW9uYWwgd29yayBhcyB3ZWxsKS4KLSMgVGhpcyB0YXJnZXQgZW5zdXJlcyB0aGF0ICQoQkFTRV9GTEFHU19UT19QQVNTKSBhcHBlYXJzIG9ubHkgb25jZSwKLSMgYmVjYXVzZSBpdCBpcyBzbyBsYXJnZSB0aGF0IGl0IGNhbiBlYXNpbHkgb3ZlcmZsb3cgdGhlIGNvbW1hbmQgbGluZQotIyBsZW5ndGggbGltaXQgb24gc29tZSBzeXN0ZW1zLgotRE9fWCA9IFwKLQlkby1jbGVhbiBcCi0JZG8tZGlzdGNsZWFuIFwKLQlkby1kdmkgXAotCWRvLWluZm8gXAotCWRvLWluc3RhbGwtaW5mbyBcCi0JZG8taW5zdGFsbGNoZWNrIFwKLQlkby1tb3N0bHljbGVhbiBcCi0JZG8tbWFpbnRhaW5lci1jbGVhbiBcCi0JZG8tVEFHUwotLlBIT05ZOiAkKERPX1gpCi0kKERPX1gpOgotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoU1VCRElSUykgLWR1bW15LTsgZG8gXAotCSAgaWYgWyAtZiAuLyQkaS9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgICAgY2FzZSAkJGkgaW4gXAotCSAgICBnY2MpIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0dDQ19GTEFHUyk7IGRvIFwKLQkJZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInfCJgOyBcCi0JICAgICAgZG9uZTsgXAotCSAgICAgIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUyk7IGRvIFwKLQkJZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInfCJgOyBcCi0JICAgICAgZG9uZTsgXAotCSAgICAgIDs7IFwKLQkgICAgZXNhYyA7IFwKLQkgICAgZXhwb3J0IEFSIEFTIENDIENYWCBMRCBOTSBSQU5MSUIgRExMVE9PTCBXSU5EUkVTOyBcCi0JICAgIGlmIChjZCAuLyQkaTsgXAotCSAgICAgICAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAotCQkJIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCi0JCQkiUkFOTElCPSQke1JBTkxJQn0iIFwKLQkJCSJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAotCQkJJCR7dGFyZ2V0fSk7IFwKLQkgICAgdGhlbiB0cnVlOyBlbHNlIGV4aXQgMTsgZmk7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JQHRhcmdldD1gZWNobyAkQCB8IHNlZCAtZSAncy9eZG8tLy8nYDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZm9yIGkgaW4gJChUQVJHRVRfQ09ORklHRElSUykgLWR1bW15LTsgZG8gXAotCSAgaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQkaS9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICBkb25lOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgJChUQVJHRVRfU1VCRElSKS8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCi0jIEhlcmUgYXJlIHRoZSB0YXJnZXRzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGRvLVggdGFyZ2V0cy4KLQotLlBIT05ZOiBpbmZvIGluc3RhbGxjaGVjayBkdmkgaW5zdGFsbC1pbmZvCi0uUEhPTlk6IGNsZWFuIGRpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbgotLlBIT05ZOiBsb2NhbC1jbGVhbiBsb2NhbC1kaXN0Y2xlYW4gbG9jYWwtbWFpbnRhaW5lci1jbGVhbgotaW5mbzogZG8taW5mbwotaW5zdGFsbGNoZWNrOiBkby1pbnN0YWxsY2hlY2sKLWR2aTogZG8tZHZpCi0KLSMgTWFrZSBzdXJlIG1ha2VpbmZvIGlzIGJ1aWx0IGJlZm9yZSB3ZSBkbyBhIGBtYWtlIGluZm8nLgotZG8taW5mbzogYWxsLXRleGluZm8KLQotaW5zdGFsbC1pbmZvOiBkby1pbnN0YWxsLWluZm8gZGlyLmluZm8KLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JaWYgWyAtZiBkaXIuaW5mbyBdIDsgdGhlbiBcCi0JICAkKElOU1RBTExfREFUQSkgZGlyLmluZm8gJChpbmZvZGlyKS9kaXIuaW5mbyA7IFwKLQllbHNlIHRydWUgOyBmaQotCi1sb2NhbC1jbGVhbjoKLQktcm0gLWYgKi5hIFRFTVAgZXJycyBjb3JlICoubyAqfiBcIyogVEFHUyAqLkUgKi5sb2cKLQotbG9jYWwtZGlzdGNsZWFuOgotCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBtaC1mcmFnIG10LWZyYWcKLQktaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF07IHRoZW4gXAotCSAgcm0gLXJmICQoVEFSR0VUX1NVQkRJUik7IFwKLQllbHNlIHRydWU7IGZpCi0KLWxvY2FsLW1haW50YWluZXItY2xlYW46Ci0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLWNsZWFuOiBkby1jbGVhbiBsb2NhbC1jbGVhbgotbW9zdGx5Y2xlYW46IGRvLW1vc3RseWNsZWFuIGxvY2FsLWNsZWFuCi1kaXN0Y2xlYW46IGRvLWRpc3RjbGVhbiBsb2NhbC1jbGVhbiBsb2NhbC1kaXN0Y2xlYW4KLW1haW50YWluZXItY2xlYW46IGxvY2FsLW1haW50YWluZXItY2xlYW4gZG8tbWFpbnRhaW5lci1jbGVhbiBsb2NhbC1jbGVhbiAKLW1haW50YWluZXItY2xlYW46IGxvY2FsLWRpc3RjbGVhbgotcmVhbGNsZWFuOiBtYWludGFpbmVyLWNsZWFuCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2xlYW4gc3BlY2lmaWMgbW9kdWxlcy4KLS5QSE9OWTogJChDTEVBTl9NT0RVTEVTKSAkKENMRUFOX1gxMV9NT0RVTEVTKSBjbGVhbi1nY2MKLSQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2xlYW4tLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0uUEhPTlk6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0kKENMRUFOX1RBUkdFVF9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLXRhcmdldC0vLydgOyBcCi0Jcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0OyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyAkKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNsZWFuKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWNsZWFuLXRhcmdldDogJChDTEVBTl9UQVJHRVRfTU9EVUxFUykKLQotIyBDaGVjayB0YXJnZXQuCi0KLS5QSE9OWTogY2hlY2sKLWNoZWNrOiAkKENIRUNLX01PRFVMRVMpIFwKLQkkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChDSEVDS19YMTFfTU9EVUxFUykgXAotCWNoZWNrLWdjYwotCi0jIEF1dG9tYXRlZCByZXBvcnRpbmcgb2YgdGVzdCByZXN1bHRzLgotCi13YXJuaW5nLmxvZzogYnVpbGQubG9nCi0JJChzcmNkaXIpL2NvbnRyaWIvd2Fybl9zdW1tYXJ5IGJ1aWxkLmxvZyA+ICRACi0KLW1haWwtcmVwb3J0LmxvZzoKLQlpZiB0ZXN0IHgnJChCT09UX0NGTEFHUyknICE9IHgnJzsgdGhlbiBcCi0JICAgIEJPT1RfQ0ZMQUdTPSckKEJPT1RfQ0ZMQUdTKSc7IGV4cG9ydCBCT09UX0NGTEFHUzsgXAotCWZpOyBcCi0JJChzcmNkaXIpL2NvbnRyaWIvdGVzdF9zdW1tYXJ5IC10ID4kQAotCWNobW9kICt4ICRACi0JZWNobyBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gc2VuZCBlLW1haWwsIHJ1biAuLyRAIG5vdwotCi1tYWlsLXJlcG9ydC13aXRoLXdhcm5pbmdzLmxvZzogd2FybmluZy5sb2cKLQlpZiB0ZXN0IHgnJChCT09UX0NGTEFHUyknICE9IHgnJzsgdGhlbiBcCi0JICAgIEJPT1RfQ0ZMQUdTPSckKEJPT1RfQ0ZMQUdTKSc7IGV4cG9ydCBCT09UX0NGTEFHUzsgXAotCWZpOyBcCi0JJChzcmNkaXIpL2NvbnRyaWIvdGVzdF9zdW1tYXJ5IC10IC1pIHdhcm5pbmcubG9nID4kQAotCWNobW9kICt4ICRACi0JZWNobyBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gc2VuZCBlLW1haWwsIHJ1biAuLyRAIG5vdwotCi0jIEluc3RhbGxhdGlvbiB0YXJnZXRzLgotCi0uUEhPTlk6IGluc3RhbGwgaW5zdGFsbC1jcm9zcyB1bmluc3RhbGwgc291cmNlLXZhdWx0IGJpbmFyeS12YXVsdCB2YXVsdC1pbnN0YWxsCi1pbnN0YWxsOiAkKElOU1RBTExfVEFSR0VUKSAKLWluc3RhbGwtY3Jvc3M6ICQoSU5TVEFMTF9UQVJHRVRfQ1JPU1MpIAotCi11bmluc3RhbGw6Ci0JQGVjaG8gInRoZSB1bmluc3RhbGwgdGFyZ2V0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB0cmVlIgotCi1zb3VyY2UtdmF1bHQ6Ci0JJChNQUtFKSAtZiAuL3JlbGVhc2UvQnVpbGQtQS1SZWxlYXNlIFwKLQkJaG9zdD0kKGhvc3RfYWxpYXMpIHNvdXJjZS12YXVsdAotCi1iaW5hcnktdmF1bHQ6Ci0JJChNQUtFKSAtZiAuL3JlbGVhc2UvQnVpbGQtQS1SZWxlYXNlIFwKLQkJaG9zdD0kKGhvc3RfYWxpYXMpIHRhcmdldD0kKHRhcmdldF9hbGlhcykKLQotdmF1bHQtaW5zdGFsbDoKLQlAaWYgWyAtZiAuL3JlbGVhc2UvdmF1bHQtaW5zdGFsbCBdIDsgdGhlbiBcCi0JICAuL3JlbGVhc2UvdmF1bHQtaW5zdGFsbCAkKGhvc3RfYWxpYXMpICQodGFyZ2V0X2FsaWFzKSA7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotLlBIT05ZOiBpbnN0YWxsLmFsbAotaW5zdGFsbC5hbGw6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkJcj1gcHdkYCA7IGV4cG9ydCByIDsgXAotCQkkKFNFVF9MSUJfUEFUSCkgXAotCQkoY2QgLi9nY2M7IFwKLQkJJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwtaGVhZGVycykgOyBcCi0JZWxzZSBcCi0JCXRydWUgOyBcCi0JZmkKLQotIyBpbmV0LWluc3RhbGwgaXMgdXNlZCBiZWNhdXNlIHRoZSBJKk5ldCB3YW50cyBEZWphR05VIGluc3RhbGxlZCBidXQKLSMgbm90IGJ1aWx0LiAgU2ltaWxhcmx5LCBnemlwIGlzIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkLgotaW5ldC1pbnN0YWxsOgotCSQoTUFLRSkgSU5TVEFMTF9NT0RVTEVTPSJgZWNobyAkKElOU1RBTExfTU9EVUxFUykgfCBzZWQgLWUgJ3MvaW5zdGFsbC1kZWphZ251Ly8nIC1lICdzL2luc3RhbGwtZ3ppcC8vJ2AiIGluc3RhbGwKLQotIyBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMgaXMgdXNlZCBiZWNhdXNlIEN5Z251cyBjYW4gbm90IGRpc3RyaWJ1dGUKLSMgdGhlIGZpeGVkIGhlYWRlciBmaWxlcy4KLS5QSE9OWTogaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzCi1pbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXM6IFwKLQlpbnN0YWxsZGlycyBcCi0JJChJTlNUQUxMX01PRFVMRVMpIFwKLQkkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpIFwKLQkkKElOU1RBTExfWDExX01PRFVMRVMpIFwKLQlnY2Mtbm8tZml4ZWRpbmNsdWRlcyAKLQotIyBJbnN0YWxsIHRoZSBnY2MgaGVhZGVycyBmaWxlcywgYnV0IG5vdCB0aGUgZml4ZWQgaW5jbHVkZSBmaWxlcywKLSMgd2hpY2ggQ3lnbnVzIGlzIG5vdCBhbGxvd2VkIHRvIGRpc3RyaWJ1dGUuICBUaGlzIHJ1bGUgaXMgdmVyeQotIyBkZXBlbmRlbnQgb24gdGhlIHdvcmtpbmdzIG9mIHRoZSBnY2MgTWFrZWZpbGUuaW4uCi0uUEhPTlk6IGdjYy1uby1maXhlZGluY2x1ZGVzCi1nY2Mtbm8tZml4ZWRpbmNsdWRlczoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgIHJtIC1yZiBnY2MvdG1wLWluY2x1ZGU7IFwKLQkgIG12IGdjYy9pbmNsdWRlIGdjYy90bXAtaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCSAgbWtkaXIgZ2NjL2luY2x1ZGU7IFwKLQkgIGNwICQoc3JjZGlyKS9nY2MvZ3N5c2xpbWl0cy5oIGdjYy9pbmNsdWRlL3N5c2xpbWl0cy5oOyBcCi0JICB0b3VjaCBnY2Mvc3RtcC1maXhpbmMgZ2NjL2luY2x1ZGUvZml4ZWQ7IFwKLQkgIHJtIC1mIGdjYy9zdG1wLWhlYWRlcnMgZ2NjL3N0bXAtaW50LWhkcnM7IFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAuL2djYzsgXAotCSAgICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQkgIHJtIC1yZiBnY2MvaW5jbHVkZTsgXAotCSAgbXYgZ2NjL3RtcC1pbmNsdWRlIGdjYy9pbmNsdWRlIDI+L2Rldi9udWxsOyBcCi0JZWxzZSB0cnVlOyBmaQotCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuICBUbwotIyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLSMKLSMgYWxsLWd1aSwgYW5kIGFsbC1saWJwcm9jIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlCi0jIHRoZXkgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgYW5kIGlmIHRoZXkgZmFpbCB0byBidWlsZCwgdGhhdAotIyBzaG91bGRuJ3Qgc3RvcCAibWFrZSBhbGwiLgotLlBIT05ZOiAkKEFMTF9NT0RVTEVTKSBhbGwtZ3VpIGFsbC1saWJwcm9jCi0kKEFMTF9NT0RVTEVTKSBhbGwtZ3VpIGFsbC1saWJwcm9jOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGNoZWNrLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBjaGVjay4gIFNvbWUKLSMgbW9kdWxlcyBhcmUgb25seSB0ZXN0ZWQgaW4gYSBuYXRpdmUgdG9vbGNoYWluLgotCi0uUEhPTlk6ICQoQ0hFQ0tfTU9EVUxFUykgJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUykgJChDUk9TU19DSEVDS19NT0RVTEVTKQotJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUyk6Ci0JQGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0JICBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCSAgaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JICBlbHNlIFwKLQkgICAgdHJ1ZTsgXAotCSAgZmk7IFwKLQlmaQotCi0kKENST1NTX0NIRUNLX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBjaGVjayk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9NT0RVTEVTKQotJChJTlNUQUxMX01PRFVMRVMpOiBpbnN0YWxsZGlycwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlCi0jIHRhcmdldCB0b29scy4KLS5QSE9OWTogJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpCi0kKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jb25maWd1cmUtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1kICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfSBdOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICAkKENDX0ZPUl9UQVJHRVQpIC0tcHJpbnQtbXVsdGktbGliID4gJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAyPiAvZGV2L251bGw7IFwKLQkgIGlmIFsgLXMgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCBdOyB0aGVuIFwKLQkgICAgaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0IF07IHRoZW4gXAotCSAgICAgIGlmIGNtcCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgPiAvZGV2L251bGw7IHRoZW4gXAotCQlybSAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0OyBcCi0JICAgICAgZWxzZSBcCi0JCWVjaG8gIk11bHRpbGlicyBjaGFuZ2VkIGZvciAkJHtkaXJ9LCByZWNvbmZpZ3VyaW5nIjsgXAotCQlybSAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZTsgXAotCQltdiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQ7IFwKLQkgICAgICBmaTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBtdiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQ7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZmk7IGV4aXQgMAkjIGJyZWFrIGNvbW1hbmQgaW50byB0d28gcGllY2VzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jb25maWd1cmUtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbICEgLWQgJChUQVJHRVRfU1VCRElSKSBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbGlmIGVjaG8gIiAkKFRBUkdFVF9DT05GSUdESVJTKSAiIHwgZ3JlcCAiICQke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWYgWyAtZCAkKHNyY2RpcikvJCR7ZGlyfSBdOyB0aGVuIFwKLQkgICAgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXSB8fCBta2RpciAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07XAotCSAgICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAgIEFSPSIkKEFSX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IEFSOyBcCi0JICAgIEFTPSIkKEFTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IEFTOyBcCi0JICAgIENDPSIkKENDX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENDOyBcCi0JICAgIENGTEFHUz0iJChDRkxBR1NfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ0ZMQUdTOyBcCi0JICAgIENYWD0iJChDWFhfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ1hYOyBcCi0JICAgIENYWEZMQUdTPSIkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWEZMQUdTOyBcCi0JICAgIERMTFRPT0w9IiQoRExMVE9PTF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBETExUT09MOyBcCi0JICAgIExEPSIkKExEX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExEOyBcCi0gICAgICAgICAgICBMREZMQUdTPSIkKExERkxBR1NfRk9SX1RBUkdFVCkiOyBleHBvcnQgTERGTEFHUzsgXAotCSAgICBOTT0iJChOTV9GT1JfVEFSR0VUKSI7IGV4cG9ydCBOTTsgXAotCSAgICBSQU5MSUI9IiQoUkFOTElCX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFJBTkxJQjsgXAotCSAgICBXSU5EUkVTPSIkKFdJTkRSRVNfRk9SX1RBUkdFVCkiOyBleHBvcnQgV0lORFJFUzsgXAotCSAgICBlY2hvIENvbmZpZ3VyaW5nIGluICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgXAotCSAgICBjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2FzZSAkKHNyY2RpcikgaW4gXAotCSAgICAvKikgXAotCSAgICAgIHRvcGRpcj0kKHNyY2RpcikgOzsgXAotCSAgICAqKSBcCi0JICAgICAgY2FzZSAiJChUQVJHRVRfU1VCRElSKSIgaW4gXAotCSAgICAgIC4pIHRvcGRpcj0iLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgKikgdG9wZGlyPSIuLi8uLi8kKHNyY2RpcikiIDs7IFwKLQkgICAgICBlc2FjIDs7IFwKLQkgICAgZXNhYzsgXAotCSAgICBpZiBbICIkKHNyY2RpcikiID0gIi4iIF0gOyB0aGVuIFwKLQkgICAgICBpZiBbICIkKFRBUkdFVF9TVUJESVIpIiAhPSAiLiIgXSA7IHRoZW4gXAotCQlpZiAkKFNIRUxMKSAkJHMvc3ltbGluay10cmVlICQke3RvcGRpcn0vJCR7ZGlyfSAibm8tc3VjaC1maWxlIiA7IHRoZW4gXAotCQkgIGlmIFsgLWYgTWFrZWZpbGUgXTsgdGhlbiBcCi0JCSAgICBpZiAkKE1BS0UpIGRpc3RjbGVhbjsgdGhlbiBcCi0JCSAgICAgIHRydWU7IFwKLQkJICAgIGVsc2UgXAotCQkgICAgICBleGl0IDE7IFwKLQkJICAgIGZpOyBcCi0JCSAgZWxzZSBcCi0JCSAgICB0cnVlOyBcCi0JCSAgZmk7IFwKLQkJZWxzZSBcCi0JCSAgZXhpdCAxOyBcCi0JCWZpOyBcCi0JICAgICAgZWxzZSBcCi0JCXRydWU7IFwKLQkgICAgICBmaTsgXAotCSAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9LiI7IFwKLQkgICAgICBsaWJzcmNkaXI9Ii4iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JCR7dG9wZGlyfS8kJHtkaXJ9IjsgXAotCSAgICAgIGxpYnNyY2Rpcj0iJCRzLyQke2Rpcn0iOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgJCR7bGlic3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4gXAotCSAgICAgIHJtIC1mIG5vLXN1Y2gtZmlsZSBza2lwLXRoaXMtZGlyOyBcCi0JICAgICAgQ09ORklHX1NJVEU9bm8tc3VjaC1maWxlICQoU0hFTEwpICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHJtIC1mIG5vLXN1Y2gtZmlsZSBza2lwLXRoaXMtZGlyOyBcCi0JICAgICAgQ09ORklHX1NJVEU9bm8tc3VjaC1maWxlICQoU0hFTEwpICQkcy9jb25maWd1cmUgXAotCQkkKENPTkZJR19BUkdVTUVOVFMpICQke3NyY2Rpcm9wdGlvbn0gXAotCQktLXdpdGgtdGFyZ2V0LXN1YmRpcj0iJChUQVJHRVRfU1VCRElSKSI7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgWyAtZiBza2lwLXRoaXMtZGlyIF0gOyB0aGVuIFwKLQkgICAgICBzaCBza2lwLXRoaXMtZGlyOyBcCi0JICAgICAgcm0gLWYgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIGNkIC4uOyBybWRpciAkJHtkaXJ9IHx8IHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBidWlsZCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgotLlBIT05ZOiAkKEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoQUxMX1RBUkdFVF9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjaGVjayB0aGUgbW9kdWxlcyB3aGljaCB1c2UgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpCi0kKENIRUNLX1RBUkdFVF9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2hlY2spO1wKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlCi0jIFRBUkdFVF9GTEFHU19UT19QQVNTLiAgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFgKLSMgYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfWDExX01PRFVMRVMpCi0kKEFMTF9YMTFfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgotLlBIT05ZOiAkKENIRUNLX1gxMV9NT0RVTEVTKQotJChDSEVDS19YMTFfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgXAotCSAgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKFgxMV9GTEFHU19UT19QQVNTKSBjaGVjayk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfWDExX01PRFVMRVMpCi0kKElOU1RBTExfWDExX01PRFVMRVMpOiBpbnN0YWxsZGlycwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgXAotCSAgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKFgxMV9GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgZ2NjIGlzIHRoZSBvbmx5IG1vZHVsZSB3aGljaCB1c2VzIEdDQ19GTEFHU19UT19QQVNTLgotLlBIT05ZOiBhbGwtZ2NjCi1hbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBCdWlsZGluZyBHQ0MgdXNlcyBzb21lIHRvb2xzIGZvciByZWJ1aWxkaW5nICJzb3VyY2UiIGZpbGVzCi0jIGxpa2UgdGV4aW5mbywgYmlzb24vYnlhY2MsIGV0Yy4gIFNvIHdlIG11c3QgZGVwZW5kIG9uIHRob3NlLgotIwotIyBXaGlsZSBidWlsZGluZyBHQ0MsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcnVuIHZhcmlvdXMgdGFyZ2V0Ci0jIHByb2dyYW1zIGxpa2UgdGhlIGFzc2VtYmxlciwgbGlua2VyLCBldGMuICBTbyB3ZSBkZXBlbmQgb24KLSMgdGhvc2UgdG9vLgotIwotIyBJbiB0aGVvcnksIG9uIGFuIFNNUCBhbGwgdGhvc2UgZGVwZW5kZW5jaWVzIGNhbiBiZSByZXNvbHZlZAotIyBpbiBwYXJhbGxlbC4KLSMKLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuCi1ib290c3RyYXAgYm9vdHN0cmFwLWxlYW4gYm9vdHN0cmFwMiBib290c3RyYXAyLWxlYW4gYm9vdHN0cmFwMyBib290c3RyYXAzLWxlYW4gYm9vdHN0cmFwNCBib290c3RyYXA0LWxlYW46IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQm9vdHN0cmFwcGluZyB0aGUgY29tcGlsZXIiOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICRACi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWNhc2UgIiRAIiBpbiBcCi0JICAqYm9vdHN0cmFwNC1sZWFuICkgXAotCQkJbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzLWxlYW4gOzsgXAotCSAgKmJvb3RzdHJhcDQgKSBtc2c9IkNvbXBhcmluZyBzdGFnZTMgYW5kIHN0YWdlNCBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZTMgOzsgXAotCSAgKi1sZWFuICkJbXNnPSJDb21wYXJpbmcgc3RhZ2UyIGFuZCBzdGFnZTMgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUtbGVhbiA7OyBcCi0JICAqICkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlIDs7IFwKLQllc2FjOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICIkJG1zZyI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgJCRjb21wYXJlCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJ1aWxkaW5nIHJ1bnRpbWUgbGlicmFyaWVzIjsgXAotCSQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpIGFsbAotCi0uUEhPTlk6IGNyb3NzCi1jcm9zczogYWxsLXRleGluZm8gYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyB0aGUgQyBhbmQgQysrIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIgotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwgTEFOR1VBR0VTPSJjIGMrKyIKLQotLlBIT05ZOiBjaGVjay1nY2MKLWNoZWNrLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiBpbnN0YWxsLWdjYwotaW5zdGFsbC1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiBpbnN0YWxsLWdjYy1jcm9zcwotaW5zdGFsbC1nY2MtY3Jvc3M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIExBTkdVQUdFUz0iYyBjKysiIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLSMgRVhQRVJJTUVOVEFMIFNUVUZGCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6IGluc3RhbGwtZG9zcmVsCi1pbnN0YWxsLWRvc3JlbDogaW5zdGFsbGRpcnMgaW5mbwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotaW5zdGFsbC1kb3NyZWwtZmFrZToKLQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIGludGVyLWRlcGVuZGVuY2llcyBhbW9uZyBtb2R1bGVzLgotYWxsLWFwYWNoZToKLWFsbC1hc2g6Ci1hbGwtYXV0b2NvbmY6IGFsbC1tNCBhbGwtdGV4aW5mbwotYWxsLWF1dG9tYWtlOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1iYXNoOgotYWxsLWJmZDogYWxsLWxpYmliZXJ0eSBhbGwtaW50bAotYWxsLWJpbnV0aWxzOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLWZsZXggYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtaW50bAotYWxsLWJpc29uOiBhbGwtdGV4aW5mbwotY29uZmlndXJlLXRhcmdldC1ic3A6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtYnNwOiBjb25maWd1cmUtdGFyZ2V0LWJzcCBhbGwtZ2NjIGFsbC1iaW51dGlscyBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLWJ5YWNjOgotYWxsLWJ6aXAyOgotYWxsLWN2c3NyYzoKLWNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWN5Z21vbjogY29uZmlndXJlLXRhcmdldC1jeWdtb24gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlic3R1YiBhbGwtdGFyZ2V0LWJzcAotYWxsLWRiOgotYWxsLWRlamFnbnU6IGFsbC10Y2wgYWxsLWV4cGVjdCBhbGwtdGsKLWFsbC1kaWZmOiBhbGwtbGliaWJlcnR5Ci1hbGwtZW1hY3M6Ci1hbGwtZW1hY3MxOTogYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWV0YzoKLWNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXM6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZXhhbXBsZXM6IGNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXMKLWFsbC1leHBlY3Q6IGFsbC10Y2wgYWxsLXRrCi1hbGwtZmlsZXV0aWxzOiBhbGwtbGliaWJlcnR5Ci1hbGwtZmluZHV0aWxzOgotYWxsLWZpbmQ6Ci1hbGwtZmxleDogYWxsLWxpYmliZXJ0eSBhbGwtYmlzb24gYWxsLWJ5YWNjCi1hbGwtZ2FzOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLWludGwKLWFsbC1nYXNoOiBhbGwtdGNsCi1hbGwtZ2F3azoKLUFMTF9HQ0MgPSBhbGwtZ2NjCi1hbGwtZ2NjOiBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotYWxsLWJvb3RzdHJhcDogYWxsLWxpYmliZXJ0eSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotR0RCX1RLID0gYWxsLXRrIGFsbC10Y2wgYWxsLWl0Y2wgYWxsLXRpeCBhbGwtbGliZ3VpCi1hbGwtZ2RiOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLW1tYWxsb2MgYWxsLXJlYWRsaW5lIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLXNpbSAkKGdkYm5sbXJlcXVpcmVtZW50cykgJChHREJfVEspCi1hbGwtZ2V0dGV4dDoKLWFsbC1nbnVzZXJ2OgotY29uZmlndXJlLXRhcmdldC1ncGVyZjogJChBTExfR0NDKQotYWxsLXRhcmdldC1ncGVyZjogY29uZmlndXJlLXRhcmdldC1ncGVyZiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotYWxsLWdwcm9mOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMgYWxsLWludGwKLWFsbC1ncmV6OiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC1ndWk6IGFsbC1nZGIgYWxsLWxpYnByb2MgYWxsLXRhcmdldC1saWJyeAotYWxsLWd1aWxlOgotYWxsLWd6aXA6IGFsbC1saWJpYmVydHkKLWFsbC1oZWxsbzogYWxsLWxpYmliZXJ0eQotYWxsLWluZGVudDoKLWFsbC1pbmV0OiBhbGwtdGNsIGFsbC1zZW5kLXByIGFsbC1wZXJsCi1hbGwtaW50bDoKLWFsbC1pc3BlbGw6IGFsbC1lbWFjczE5Ci1hbGwtaXRjbDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC1sZDogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWZsZXggYWxsLWludGwKLWNvbmZpZ3VyZS10YXJnZXQtbGliZysrOiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbGlicngKLWFsbC10YXJnZXQtbGliZysrOiBjb25maWd1cmUtdGFyZ2V0LWxpYmcrKyBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaW8gYWxsLXRhcmdldC1saWJyeCBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotY29uZmlndXJlLXRhcmdldC1saWJnbG9zczogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJnbG9zczogY29uZmlndXJlLXRhcmdldC1saWJnbG9zcyBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotY29uZmlndXJlLXRhcmdldC1saWJpbzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJpbzogY29uZmlndXJlLXRhcmdldC1saWJpbyBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliCi1jaGVjay10YXJnZXQtbGliaW86Ci1hbGwtbGliZ3VpOiBhbGwtdGNsIGFsbC10ayBhbGwtdGNsOC4xIGFsbC10azguMSBhbGwtaXRjbAotYWxsLWxpYmliZXJ0eToKLWNvbmZpZ3VyZS10YXJnZXQtbGlicng6ICQoQUxMX0dDQykgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWFsbC10YXJnZXQtbGlicng6IGNvbmZpZ3VyZS10YXJnZXQtbGlicngKLWNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0ZGMrKzogY29uZmlndXJlLXRhcmdldC1saWJzdGRjKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvCi1jb25maWd1cmUtdGFyZ2V0LWxpYnN0dWI6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGlic3R1YjogY29uZmlndXJlLXRhcmdldC1saWJzdHViCi1hbGwtbGlidG9vbDoKLWFsbC1tNDogYWxsLWxpYmliZXJ0eQotYWxsLW1ha2U6IGFsbC1saWJpYmVydHkKLWFsbC1tbWFsbG9jOgotY29uZmlndXJlLXRhcmdldC1uZXdsaWI6ICQoQUxMX0dDQykKLWNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcDogJChBTExfR0NDKQotYWxsLXRhcmdldC1uZXdsaWI6IGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1nY2MKLWFsbC10YXJnZXQtbGlidGVybWNhcDogY29uZmlndXJlLXRhcmdldC1saWJ0ZXJtY2FwIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1nY2MKLWFsbC1vcGNvZGVzOiBhbGwtYmZkIGFsbC1saWJpYmVydHkKLWFsbC1wYXRjaDogYWxsLWxpYmliZXJ0eQotYWxsLXBlcmw6Ci1hbGwtcHJtczogYWxsLWxpYmliZXJ0eQotYWxsLXJjczoKLWFsbC1yZWFkbGluZToKLWFsbC1yZWNvZGU6IGFsbC1saWJpYmVydHkKLWFsbC1zZWQ6IGFsbC1saWJpYmVydHkKLWFsbC1zZW5kLXByOiBhbGwtcHJtcwotYWxsLXNoZWxsdXRpbHM6Ci1hbGwtc2ltOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMgYWxsLXJlYWRsaW5lCi1hbGwtdGFyOiBhbGwtbGliaWJlcnR5Ci1hbGwtdGNsOgotYWxsLXRjbDguMToKLWFsbC10Y2xYOiBhbGwtdGNsIGFsbC10awotYWxsLXRrOiBhbGwtdGNsCi1hbGwtdGs4LjE6IGFsbC10Y2w4LjEKLWFsbC10ZXhpbmZvOiBhbGwtbGliaWJlcnR5Ci1hbGwtdGV4dHV0aWxzOgotYWxsLXRnYXM6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcwotYWxsLXRpbWU6Ci1hbGwtdGl4OiBhbGwtdGNsIGFsbC10ayBhbGwtdGNsOC4xIGFsbC10azguMQotYWxsLXdkaWZmOgotYWxsLXRhcmdldC13aW5zdXA6IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbGlidGVybWNhcCBjb25maWd1cmUtdGFyZ2V0LXdpbnN1cAotY29uZmlndXJlLXRhcmdldC13aW5zdXA6IGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdXVkZWNvZGU6IGFsbC1saWJpYmVydHkKLWFsbC16aXA6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eTogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldC1saWJpYmVydHk6IGNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5IGFsbC1nY2MgYWxsLWxkIGFsbC10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0OiAkKEFMTF9UQVJHRVRfTU9EVUxFUykKLWluc3RhbGwtdGFyZ2V0OiAkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLWdkYjogaW5zdGFsbC10Y2wgaW5zdGFsbC10ayBpbnN0YWxsLWl0Y2wgaW5zdGFsbC10aXggaW5zdGFsbC1saWJndWkKLSMjIyBvdGhlciBzdXBwb3J0aW5nIHRhcmdldHMKLQotTUFLRURJUlM9IFwKLQkkKHByZWZpeCkgXAotCSQoZXhlY19wcmVmaXgpCi0uUEhPTlk6IGluc3RhbGxkaXJzCi1pbnN0YWxsZGlyczogbWtpbnN0YWxsZGlycwotCSQoU0hFTEwpICQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoTUFLRURJUlMpCi0KLWRpci5pbmZvOiBkby1pbnN0YWxsLWluZm8KLQlpZiBbIC1mICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciBdIDsgdGhlbiBcCi0JICAkKHNyY2RpcikvdGV4aW5mby9nZW4taW5mby1kaXIgJChpbmZvZGlyKSAkKHNyY2RpcikvdGV4aW5mby9kaXIuaW5mby10ZW1wbGF0ZSA+IGRpci5pbmZvLm5ldyA7IFwKLQkgIG12IC1mIGRpci5pbmZvLm5ldyBkaXIuaW5mbyA7IFwKLQllbHNlIHRydWUgOyBcCi0JZmkKLQotZGlzdDoKLQlAZWNobyAiQnVpbGRpbmcgYSBmdWxsIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIHRyZWUgaXNuJ3QgZG9uZSIKLQlAZWNobyAidmlhICdtYWtlIGRpc3QnLiAgQ2hlY2sgb3V0IHRoZSBldGMvIHN1YmRpcmVjdG9yeSIgCi0KLWV0YWdzIHRhZ3M6IFRBR1MKLQotIyBSaWdodCBub3cgdGhpcyBqdXN0IGJ1aWxkcyBUQUdTIGluIGVhY2ggc3ViZGlyZWN0b3J5LiAgZW1hY3MxOSBoYXMgdGhlCi0jIGFiaWxpdHkgdG8gdXNlIHNldmVyYWwgdGFncyBmaWxlcyBhdCBvbmNlLCBzbyB0aGVyZSBpcyBwcm9iYWJseSBubyBuZWVkCi0jIHRvIGNvbWJpbmUgdGhlbSBpbnRvIG9uZSBiaWcgVEFHUyBmaWxlIChsaWtlIENWUyAxLjMgZG9lcykuICBXZSBjb3VsZAotIyAoaWYgd2UgZmVsdCBsaWtlIGl0KSBoYXZlIHRoaXMgTWFrZWZpbGUgd3JpdGUgYSBwaWVjZSBvZiBlbGlzcCB3aGljaAotIyB0aGUgdXNlciBjb3VsZCBsb2FkIHRvIHRlbGwgZW1hY3MxOSB3aGVyZSBhbGwgdGhlIFRBR1MgZmlsZXMgd2UganVzdAotIyBidWlsdCBhcmUuCi1UQUdTOiBkby1UQUdTCi0KLSMgd2l0aCB0aGUgZ251IG1ha2UsIHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlndXJlLmluICQoaG9zdF9tYWtlZmlsZV9mcmFnKSAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKSAkKGdjY192ZXJzaW9uX3RyaWdnZXIpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMKLSMgU3VwcG9ydCBmb3IgYnVpbGRpbmcgbmV0IHJlbGVhc2VzCi0KLSMgRmlsZXMgaW4gZGV2byB1c2VkIGluIGFueSBuZXQgcmVsZWFzZS4KLSMgQ2hhbmdlTG9nIG9taXR0ZWQgYmVjYXVzZSBpdCBtYXkgcmVmZXIgdG8gZmlsZXMgd2hpY2ggYXJlIG5vdCBpbiB0aGlzCi0jIGRpc3RyaWJ1dGlvbiAocGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW5jbHVkZSBpdCBhbnl3YXkpLgotREVWT19TVVBQT1JUPSBSRUFETUUgTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBcCi0JY29uZmlnLmd1ZXNzIGNvbmZpZy5pZiBjb25maWcuc3ViIGNvbmZpZyBtb3ZlLWlmLWNoYW5nZSBcCi0JbXB3LVJFQURNRSBtcHctYnVpbGQuaW4gbXB3LWNvbmZpZy5pbiBtcHctY29uZmlndXJlIG1wdy1pbnN0YWxsIFwKLQlDT1BZSU5HIENPUFlJTkcuTElCIGluc3RhbGwtc2ggY29uZmlnLW1sLmluIHN5bWxpbmstdHJlZSBcCi0JbWtpbnN0YWxsZGlycyBsdGNvbmZpZyBsdG1haW4uc2ggbWlzc2luZyB5bHdyYXAKLQotIyBGaWxlcyBpbiBkZXZvL2V0YyB1c2VkIGluIGFueSBuZXQgcmVsZWFzZS4KLSMgQ2hhbmdlTG9nIG9taXR0ZWQgYmVjYXVzZSBpdCBtYXkgcmVmZXIgdG8gZmlsZXMgd2hpY2ggYXJlIG5vdCBpbiB0aGlzCi0jIGRpc3RyaWJ1dGlvbiAocGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW5jbHVkZSBpdCBhbnl3YXkpLgotRVRDX1NVUFBPUlQ9IE1ha2VmaWxlLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gc3RhbmRhcmRzLnRleGkgXAotCW1ha2Utc3Rkcy50ZXhpIHN0YW5kYXJkcy5pbmZvKgotCi0jIFdoZW4geW91IHVzZSBgbWFrZSBzZXR1cC1kaXJzJyBvciBgbWFrZSB0YXonIHlvdSBzaG91bGQgYWx3YXlzIHJlZGVmaW5lCi0jIHRoaXMgbWFjcm8uCi1TVVBQT1JUX0ZJTEVTID0gbGlzdC1vZi1zdXBwb3J0LWZpbGVzLWZvci10b29sLWluLXF1ZXN0aW9uCi0KLSMgTk9URTogTm8gZG91YmxlIHF1b3RlcyBpbiB0aGUgYmVsb3cuICBJdCBpcyB1c2VkIHdpdGhpbiBzaGVsbCBzY3JpcHQKLSMgYXMgVkVSPSIkKFZFUikiCi1WRVIgPSBgCWlmIGdyZXAgQU1fSU5JVF9BVVRPTUFLRSAkKFRPT0wpL2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgc2VkIDwgJChUT09MKS9jb25maWd1cmUuaW4gLW4gJ3MvQU1fSU5JVF9BVVRPTUFLRVteLF0qLCAqXChbXildKlwpKS9cMS9wJzsgXAotCWVsc2UgXAotCSAgc2VkIDwgJChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJzsgXAotCWZpYAotUEFDS0FHRSA9ICQoVE9PTCkKLQotLlBIT05ZOiB0YXoKLXRhejogJChERVZPX1NVUFBPUlQpICQoU1VQUE9SVF9GSUxFUykgdGV4aW5mby90ZXhpbmZvLnRleAotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tcHJvdG8tdG9wbGV2IFwKLQkJVE9PTD0kKFRPT0wpIFBBQ0tBR0U9IiQoUEFDS0FHRSkiIFZFUj0iJChWRVIpIiBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChTVVBQT1JUX0ZJTEVTKSIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRvLW1kNXN1bSBcCi0JCVRPT0w9JChUT09MKSBQQUNLQUdFPSIkKFBBQ0tBR0UpIiBWRVI9IiQoVkVSKSIgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoU1VQUE9SVF9GSUxFUykiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiBkby10YXItYnoyIFwKLQkJVE9PTD0kKFRPT0wpIFBBQ0tBR0U9IiQoUEFDS0FHRSkiIFZFUj0iJChWRVIpIiBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChTVVBQT1JUX0ZJTEVTKSIKLQotLlBIT05ZOiBnZGItdGF6Ci1nZGItdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiBkby1wcm90by10b3BsZXYgXAotCQlUT09MPSQoVE9PTCkgUEFDS0FHRT0iJChQQUNLQUdFKSIgVkVSPSIkKFZFUikiIFwKLQkJTUQ1UFJPRz0iJChNRDVQUk9HKSIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKFNVUFBPUlRfRklMRVMpIgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tbWQ1c3VtIFwKLQkJVE9PTD0kKFRPT0wpIFBBQ0tBR0U9IiQoUEFDS0FHRSkiIFZFUj0iJChWRVIpIiBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChTVVBQT1JUX0ZJTEVTKSIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRvLWRqdW5wYWNrIFwKLQkJVE9PTD0kKFRPT0wpIFBBQ0tBR0U9IiQoUEFDS0FHRSkiIFZFUj0iJChWRVIpIiBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChTVVBQT1JUX0ZJTEVTKSIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRvLXRhci1iejIgXAotCQlUT09MPSQoVE9PTCkgUEFDS0FHRT0iJChQQUNLQUdFKSIgVkVSPSIkKFZFUikiIFwKLQkJTUQ1UFJPRz0iJChNRDVQUk9HKSIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKFNVUFBPUlRfRklMRVMpIgotCi0uUEhPTlk6IGRvLXByb3RvLXRvcGxldgotZG8tcHJvdG8tdG9wbGV2OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JZWNobyAiPT0+IE1ha2luZyAkKFBBQ0tBR0UpLSQoVkVSKS8iCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JIwotCS1ybSAtZiAkKFBBQ0tBR0UpLSQoVkVSKQotCWxuIC1zIHByb3RvLXRvcGxldiAkKFBBQ0tBR0UpLSQoVkVSKQotCi0uUEhPTlk6IGRvLXRhci1iejIKLWRvLXRhci1iejI6Ci0JZWNobyAiPT0+IE1ha2luZyAkKFBBQ0tBR0UpLSQoVkVSKS50YXIuYnoyIgotCS1ybSAtZiAkKFBBQ0tBR0UpLSQoVkVSKS50YXIuYnoyCi0JZmluZCAkKFBBQ0tBR0UpLSQoVkVSKSAtZm9sbG93IC1uYW1lIENWUyAtcHJ1bmUgLW8gLXR5cGUgZiAtcHJpbnQgXAotCQl8IHRhciBjVGZoIC0gJChQQUNLQUdFKS0kKFZFUikudGFyCi0JJChCWklQUFJPRykgLXYgLTkgJChQQUNLQUdFKS0kKFZFUikudGFyCi0KLS5QSE9OWTogZG8tbWQ1c3VtCi1kby1tZDVzdW06Ci0JZWNobyAiPT0+IEFkZGluZyBtZDUgY2hlY2tzdW0gdG8gdG9wLWxldmVsIGRpcmVjdG9yeSIKLQljZCBwcm90by10b3BsZXYgJiYgZmluZCAqIC1mb2xsb3cgLW5hbWUgQ1ZTIC1wcnVuZSAtbyAtdHlwZSBmIC1wcmludCBcCi0JCXwgeGFyZ3MgJChNRDVQUk9HKSA+IC4uL21kNS5zdW0KLQltdiBtZDUuc3VtIHByb3RvLXRvcGxldgotCi0uUEhPTlk6IGRvLWRqdW5wYWNrCi1kby1kanVucGFjazoKLQllY2hvICI9PT4gQWRkaW5nIHVwZGF0ZWQgZGp1bnBhY2suYmF0IHRvIHRvcC1sZXZlbCBkaXJlY3RvcnkiCi0JZWNobyAtICdzIC9nZGItWzAtOVwuXSovZ2RiLSciJChWRVIpIicvJwotCXNlZCA8IGRqdW5wYWNrLmJhdCA+IGRqdW5wYWNrLm5ldyBcCi0JCS1lICdzL2dkYi1bMC05XVswLTlcLl0qL2dkYi0nIiQoVkVSKSInLycKLQltdiBkanVucGFjay5uZXcgZGp1bnBhY2suYmF0Ci0JLXJtIC1mIHByb3RvLXRvcGxldi9kanVucGFjay5iYXQKLQlsbiAtcyAuLi9kanVucGFjay5iYXQgcHJvdG8tdG9wbGV2L2RqdW5wYWNrLmJhdAotCi1URVhJTkZPX1NVUFBPUlQ9IHRleGluZm8vdGV4aW5mby50ZXgKLURJU1RfU1VQUE9SVD0gJChERVZPX1NVUFBPUlQpICQoVEVYSU5GT19TVVBQT1JUKQotCi0uUEhPTlk6IGdhcy50YXIuYnoyCi1HQVNfU1VQUE9SVF9ESVJTPSBiZmQgaW5jbHVkZSBsaWJpYmVydHkgb3Bjb2RlcyBpbnRsIHNldHVwLmNvbSBtYWtlZmlsZS52bXMgbWtkZXAKLWdhcy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHQVNfU1VQUE9SVF9ESVJTKSBnYXMKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdhcyBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKLQotIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCi0uUEhPTlk6IGJpbnV0aWxzLnRhci5iejIKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcyBta2RlcAotYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBiaW51dGlscwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9YmludXRpbHMgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBnYXMrYmludXRpbHMudGFyLmJ6MgotR0FTQl9TVVBQT1JUX0RJUlM9ICQoR0FTX1NVUFBPUlRfRElSUykgYmludXRpbHMgbGQgZ3Byb2YKLWdhcytiaW51dGlscy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHQVNCX1NVUFBPUlRfRElSUykgZ2FzCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nYXMgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0FTQl9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGxpYmcrKy50YXIuYnoyCi1MSUJHWFhfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGlic3RkYysrIGxpYmlvIGxpYnJ4IGxpYmliZXJ0eQotbGliZysrLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSBsaWJnKysKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWxpYmcrKyBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChMSUJHWFhfU1VQUE9SVF9ESVJTKSIKLQotR05BVFNfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGliaWJlcnR5IHNlbmQtcHIKLWduYXRzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdOQVRTX1NVUFBPUlRfRElSUykgZ25hdHMKLQkkKE1BS0UpIC1mICBNYWtlZmlsZS5pbiB0YXogVE9PTD1nbmF0cyBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHTkFUU19TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGdkYi50YXIuYnoyCi1HREJfU1VQUE9SVF9ESVJTPSBiZmQgaW5jbHVkZSBsaWJpYmVydHkgbW1hbGxvYyBvcGNvZGVzIHJlYWRsaW5lIHNpbSB1dGlscyBpbnRsCi1nZGIudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoR0RCX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiBnZGItdGF6IFRPT0w9Z2RiIFwKLQkJTUQ1UFJPRz0iJChNRDVQUk9HKSIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdEQl9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGRlamFnbnUudGFyLmJ6MgotREVKQUdOVV9TVVBQT1JUX0RJUlM9ICB0Y2wgZXhwZWN0IGxpYmliZXJ0eQotZGVqYWdudS50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChERUpBR05VX1NVUFBPUlRfRElSUykgZGVqYWdudQotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9ZGVqYWdudSBcCi0JCU1ENVBST0c9IiQoTUQ1UFJPRykiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChERUpBR05VX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiK2RlamFnbnUudGFyLmJ6MgotR0RCRF9TVVBQT1JUX0RJUlM9ICQoR0RCX1NVUFBPUlRfRElSUykgdGNsIGV4cGVjdCBkZWphZ251Ci1nZGIrZGVqYWdudS50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJEX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiBnZGItdGF6IFRPT0w9Z2RiIFBBQ0tBR0U9Z2RiK2RlamFnbnUgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0RCRF9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGluc2lnaHQudGFyLmJ6MgotSU5TSUdIVF9TVVBQT1JUX0RJUlM9ICQoR0RCX1NVUFBPUlRfRElSUykgdGNsIHRrIGl0Y2wgdGl4IGxpYmd1aQotaW5zaWdodC50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGdkYi10YXogVE9PTD1nZGIgUEFDS0FHRT1pbnNpZ2h0IFwKLQkJTUQ1UFJPRz0iJChNRDVQUk9HKSIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKElOU0lHSFRfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBpbnNpZ2h0K2RlamFnbnUudGFyLmJ6MgotSU5TSUdIVERfU1VQUE9SVF9ESVJTPSAkKElOU0lHSFRfU1VQUE9SVF9ESVJTKSBleHBlY3QgZGVqYWdudQotaW5zaWdodCtkZWphZ251LnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKElOU0lHSFREX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiBnZGItdGF6IFRPT0w9Z2RiIFBBQ0tBR0U9Imluc2lnaHQrZGVqYWdudSIgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoSU5TSUdIVERfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBuZXdsaWIudGFyLmJ6MgotTkVXTElCX1NVUFBPUlRfRElSUz1saWJnbG9zcwotIyB0YXogY29uZmlndXJlcyBmb3IgdGhlIHN1bjQgdGFyZ2V0IHdoaWNoIHdvbid0IGNvbmZpZ3VyZSBuZXdsaWIuCi0jIFdlIG5lZWQgbmV3bGliIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgLmluZm8gZmlsZXMgYXJlIG1hZGUuCi0jIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb25maWd1cmUgbmV3bGliIHNlcGFyYXRlbHk6Ci0jIHRheiB3aWxsIGJ1aWxkIHRoZSAuaW5mbyBmaWxlcyBidXQgc2luY2UgU1VCRElSUyB3b24ndCBjb250YWluIG5ld2xpYiwKLSMgZGlzdGNsZWFuIHdvbid0IGJlIHJ1biAobGVhdmluZyBNYWtlZmlsZSwgY29uZmlnLnN0YXR1cywgYW5kIHRoZSB0bXAgZmlsZXMKLSMgdXNlZCBpbiBidWlsZGluZyB0aGUgLmluZm8gZmlsZXMsIGVnOiAqLmRlZiwgKi5yZWYpLgotIyBUaGUgcHJvYmxlbSBpc24ndCBzb2x2YWJsZSBob3dldmVyIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayBiZWNhdXNlCi0jIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIHN1YmRpciAkKHRhcmdldF9hbGlhcykgd2hpY2ggZ2V0cyBudWtlZCBkdXJpbmcKLSMgdGhlIG1ha2UgZGlzdGNsZWFuLiAgRm9yIG5vdyBwdW50IG9uIHRoZSBpc3N1ZSBvZiBzaGlwcGluZyBuZXdsaWIgaW5mbyBmaWxlcwotIyB3aXRoIG5ld2xpYiBuZXQgcmVsZWFzZXMgYW5kIHdhaXQgZm9yIGEgZGF5IHdoZW4gc29tZSBuYXRpdmUgdGFyZ2V0IChzdW40PykKLSMgc3VwcG9ydHMgbmV3bGliIChpZiBvbmx5IG1pbmltYWxseSkuCi1uZXdsaWIudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoTkVXTElCX1NVUFBPUlRfRElSUykgbmV3bGliCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1uZXdsaWIgXAotCQlNRDVQUk9HPSIkKE1ENVBST0cpIiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoTkVXTElCX1NVUFBPUlRfRElSUykiIFwKLQkJREVWT19TVVBQT1JUPSIkKERFVk9fU1VQUE9SVCkgQ09QWUlORy5ORVdMSUIiIG5ld2xpYgotCi0uTk9FWFBPUlQ6Ci1NQUtFT1ZFUlJJREVTPQotCi0jIGVuZCBvZiBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjBlNDM2Li4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkJICAgUkVBRE1FIGZvciBHTlUgZGV2ZWxvcG1lbnQgdG9vbHMKLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdmFyaW91cyBHTlUgY29tcGlsZXJzLCBhc3NlbWJsZXJzLCBsaW5rZXJzLCAKLWRlYnVnZ2VycywgZXRjLiwgcGx1cyB0aGVpciBzdXBwb3J0IHJvdXRpbmVzLCBkZWZpbml0aW9ucywgYW5kIGRvY3VtZW50YXRpb24uCi0KLUlmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgYXMgcGFydCBvZiBhIEdEQiByZWxlYXNlLCBzZWUgdGhlIGZpbGUgZ2RiL1JFQURNRS4KLUlmIHdpdGggYSBiaW51dGlscyByZWxlYXNlLCBzZWUgYmludXRpbHMvUkVBRE1FOyAgaWYgd2l0aCBhIGxpYmcrKyByZWxlYXNlLAotc2VlIGxpYmcrKy9SRUFETUUsIGV0Yy4gIFRoYXQnbGwgZ2l2ZSB5b3UgaW5mbyBhYm91dCB0aGlzCi1wYWNrYWdlIC0tIHN1cHBvcnRlZCB0YXJnZXRzLCBob3cgdG8gdXNlIGl0LCBob3cgdG8gcmVwb3J0IGJ1Z3MsIGV0Yy4KLQotSXQgaXMgbm93IHBvc3NpYmxlIHRvIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIGFuZCBidWlsZCBhIHZhcmlldHkgb2YKLXRvb2xzIHdpdGggb25lIGNvbW1hbmQuICBUbyBidWlsZCBhbGwgb2YgdGhlIHRvb2xzIGNvbnRhaW5lZCBoZXJlaW4sCi1ydW4gdGhlIGBgY29uZmlndXJlJycgc2NyaXB0IGhlcmUsIGUuZy46Ci0KLQkuL2NvbmZpZ3VyZSAKLQltYWtlCi0KLVRvIGluc3RhbGwgdGhlbSAoYnkgZGVmYXVsdCBpbiAvdXNyL2xvY2FsL2JpbiwgL3Vzci9sb2NhbC9saWIsIGV0YyksCi10aGVuIGRvOgotCW1ha2UgaW5zdGFsbAotCi0oSWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZGV0ZXJtaW5lIHlvdXIgdHlwZSBvZiBjb21wdXRlciwgZ2l2ZSBpdAotdGhlIG5hbWUgYXMgYW4gYXJndW1lbnQsIGZvciBpbnN0YW5jZSBgYC4vY29uZmlndXJlIHN1bjQnJy4gIFlvdSBjYW4KLXVzZSB0aGUgc2NyaXB0IGBgY29uZmlnLnN1YicnIHRvIHRlc3Qgd2hldGhlciBhIG5hbWUgaXMgcmVjb2duaXplZDsgaWYKLWl0IGlzLCBjb25maWcuc3ViIHRyYW5zbGF0ZXMgaXQgdG8gYSB0cmlwbGV0IHNwZWNpZnlpbmcgQ1BVLCB2ZW5kb3IsCi1hbmQgT1MuKQotCi1JZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvbXBpbGVyIG9uIHlvdXIgc3lzdGVtLCBpdCBpcyBvZnRlbiBiZXN0IHRvCi1leHBsaWNpdGx5IHNldCBDQyBpbiB0aGUgZW52aXJvbm1lbnQgYmVmb3JlIHJ1bm5pbmcgY29uZmlndXJlLCBhbmQgdG8KLWFsc28gc2V0IENDIHdoZW4gcnVubmluZyBtYWtlLiAgRm9yIGV4YW1wbGUgKGFzc3VtaW5nIHNoL2Jhc2gva3NoKToKLQotCUNDPWdjYyAuL2NvbmZpZ3VyZQotCW1ha2UKLQotQSBzaW1pbGFyIGV4YW1wbGUgdXNpbmcgY3NoOgotCi0Jc2V0ZW52IENDIGdjYwotCS4vY29uZmlndXJlCi0JbWFrZQotCi1NdWNoIG9mIHRoZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGVuY2xvc2VkIGlzIGNvcHlyaWdodCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgb3IKLUNPUFlJTkcuTElCIGluIHRoZSB2YXJpb3VzIGRpcmVjdG9yaWVzLCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRlcm1zIHVuZGVyIHdoaWNoIHlvdSBjYW4gY29weSB0aGUgZmlsZXMuCi0KLVJFUE9SVElORyBCVUdTOiBBZ2Fpbiwgc2VlIGdkYi9SRUFETUUsIGJpbnV0aWxzL1JFQURNRSwgZXRjLiwgZm9yIGluZm8KLW9uIHdoZXJlIGFuZCBob3cgdG8gcmVwb3J0IHByb2JsZW1zLgpkaWZmIC0tZ2l0IGEvYmZkL0NPUFlJTkcgYi9iZmQvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9iZmQvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2cgYi9iZmQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGNlZDc5Li4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcxICswLDAgQEAKLTIwMDAtMDYtMDUgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERvbid0IGZsYWcKLQlhbiBlcnJvciB3aGVuIHNlZWluZyBhbiB1bmRlZmluZWQgc3ltYm9sIHdpdGggaGlkZGVuL2ludGVybmFsCi0JYXR0cmlidXRlLiBJdCBpcyBoYW5kbGVkIGluICpfcmVsb2NhdGVfc2VjdGlvbiAoKS4KLQotMjAwMC0wNi0wNSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGZsaW5rLmggKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogRm9sbG93IHRoZSBsaW5rIGZvciB0aGUKLQlpbmRpcmVjdCBzeW1ib2wgZm9yIHRoZSBFTEZfTElOS19OT05fRUxGIGJpdC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IG91dHB1dCB0aGUgaW5kaXJlY3Qgc3ltYm9sIGV2ZW4KLQlpZiB0aGUgRUxGX0xJTktfTk9OX0VMRiBiaXQgaXMgc2V0LgotCi0yMDAwLTA2LTAxICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFjay5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLW5ldGJzZGVsZiopOiBOZXcgdGFyZ2V0LgotCShpWzM0NTZdODYtKi1uZXRic2Rhb3V0Kik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLW5ldGJzZCopOiBBZGQgYmZkX2VsZjMyX2kzODZfdmVjIHRvIHRhcmdfc2VsdmVjcy4KLQkoaVszNDU2XTg2LSotb3BlbmJzZCopOiBMaWtld2lzZS4KLQotVHVlIE1heSAzMCAxNTozOTowNCAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHRyYWQtY29yZS5jOiBGcm9tIGhwdXgtY29yZS5jLCBpbmNsdWRlIDxkaXJlbnQuaD4gb3IKLSAJPHN5cy9uZGlyLmg+IHdoZW4gcG9zc2libGUuCi0KLTIwMDAtMDUtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9waW50bC5oIChfKFN0cmluZykpOiBFeHBsYWluIHdoeSBkZ2V0dGV4dCBpcyB1c2VkIGluc3RlYWQKLQlvZiBnZXR0ZXh0LiAKLQotMjAwMC0wNS0zMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IENvcnJlY3QgcmVhZGluZyBvZiB2ZXJzaW9uCi0JZGVmaW5pdGlvbnMuICBXZSBtdXN0IG5vdCBhc3N1bWUgdGhleSBhcmUgc29ydGVkIGluIHRoZSBmaWxlCi0JYWNjb3JkaW5nIHRvIHRoZWlyIGluZGV4IG51bWJlcnMuCi0KLTIwMDAtMDUtMzEgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIGVsZi1ocHBhLmg6IChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNlIGVfcnNlbCBmaWVsZAotICAgICAgICBzZWxlY3RvciBmb3IgUl9QQVJJU0NfUENSRUwxN1IuICBSX1BBUklTQ19ESVIxN1IgYW5kCi0gICAgICAgIFJfUEFSSVNDX0RJUjE3RiBhcmUgZm9yIGFic29sdXRlIGJyYW5jaGVzOyBIYW5kbGUgdGhlbSBhcyBzdWNoLgotCi0yMDAwLTA1LTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtaTk2MC5jIChzY2FuXzk2MF9tYWNoKTogQWNjZXB0IDgwOTYwS0EsIDgwOTYwS0IsCi0JODA5NjBDQSwgODA5NjBNQyBhcyB2YWxpZCBtYWNoaW5lIG5hbWVzLgotCi0yMDAwLTA1LTMwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBDbGVhciB0aGUKLQl2aXNpYmlsaXR5IGJpdHMgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuIENvcnJlY3RseSBoYW5kbGUKLQl3ZWFrIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggaGlkZGVuIGFuZCBpbnRlcm5hbCBhdHRyaWJ1dGVzLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsd2F5cyB0dXJuIHRoZQotCXN5bWJvbCBpbnRvIGxvY2FsIGlmIGl0IGhhcyB0aGUgaGlkZGVuIG9yIGludGVybmFsIGF0dHJpYnV0ZS4KLQotMjAwMC0wNS0yOSAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogcHBjYm9vdC5jOiAgQWRkIHBhY2tlZCBhdHRyaWJ1dGUgaWYgY29tcGlsaW5nIHdpdGggR0NDLgotCi0yMDAwLTA1LTI5ICBBbmF0b2x5IFZvcm9iZXkgIDxtZWxsb25AcG9ib3guY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIGR5bmxvY2FsLgotCi0yMDAwLTA1LTI2ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGRlcGVuZGVuY2llcyB3aXRoICJtYWtlIGRlcC1hbSIKLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBzeXNkZXAuaCAoZ2V0dGV4dCwgZGdldHRleHQsIGRjZ2V0dGV4dCwgdGV4dGRvbWFpbiwKLQliaW5kdGV4dGRvbWFpbik6IFJlcGxhY2UgZGVmaW5lcyB3aXRoIHRob3NlIGZyb20gaW50bC9saWJnZXR0ZXh0LmgKLQl0byBxdWlldGVuIGdjYyB3YXJuaW5ncy4KLQotMjAwMC0wNS0yNiAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogYW91dHguaCAoZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgSVNfQUJTT0xVVEVfUEFUSC4KLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUsIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lLAotCWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lKSBbSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU1dOiBTdXBwb3J0Ci0JZmlsZSBuYW1lcyB3aXRoIGJhY2tzbGFzaGVzLgotCi0JKiBjYWNoZS5jIChiZmRfb3Blbl9maWxlKSBbX19NU0RPU19fXTogRG9uJ3QgdW5saW5rIHRoZSBmaWxlCi0JYmVmb3JlIG9wZW5pbmcgaXQuCi0KLQkqIHN5c2RlcC5oOiBJbmNsdWRlIGZpbGVuYW1lcy5oLgotCi0yMDAwLTA1LTI2ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlX2FsbF9kb25lKTogTWFzayBmaWxlIHBlcm1zIHdpdGggMDc3NyBub3QgMHg3NzcuCi0KLTIwMDAtMDUtMjYgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxheF9zZWN0aW9uKTogTmV3LgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogT3B0aW1pemUgdGFpbCBjYWxsIGludG8gYnJhbmNoIGFsd2F5cwotCWlmIHBvc3NpYmxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxheF9zZWN0aW9uKTogTmV3LgotCi0yMDAwLTA1LTI2ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgdG8gdW51c2VkIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi0JUmVtb3ZlIHVudXN1ZWQgdmFyaWFibGVzLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hhbmdlIHJfc3ltbmR4IHR5cGUgdG8gdW5zaWduZWQgbG9uZy4KLQkoc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCBzaGFyZWQgbGlicmFyeSBjYXNlIGZyb20KLQlwcmV2aW91cyBmaXgsIHNvIHRoYXQgc2hhcmVkIGxpYnMgcmVhbGx5IGRvbid0IGluZmx1ZW5jZSB0YXJnZXRzCi0JZXh0ZW5zaW9uIG1hc2sgYW5kIG1lbW9yeSBtb2RlbC4KLQotMjAwMC0wNS0yMyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sKLQloLT5yb290Lm90aGVyIG5vdCBoLT5vdGhlci4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBhIHR5cG8uCi0KLTIwMDAtMDUtMjMgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYWxsb3cgdGhlCi0JdW5kZWZpbmVkIHN5bWJvbCB3aXRoIHRoZSBub24tZGVmYXVsdCB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzNzAuYyAoaTM3MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tY29yZS5jIChtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtaWE2NC5jIChlbGY2NF9pYTY0X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMjAwMC0wNS0yMiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtaWE2NC5jIChpYTY0X2hvd3RvX3RhYmxlKTogQWRkIFBDUkVMNjBCLCBQQ1JFTDIxQkksCi0JUENSRUwyMiwgUENSRUw2NEkuICBaZXJvIHNpemUgb2Ygc3BlY2lhbCByZWxvY3MuCi0JKGVsZjY0X2lhNjRfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkoVVNFX0JSTCwgb29yX2JybCwgb29yX2lwKTogTmV3LgotCShlbGY2NF9pYTY0X3JlbGF4X3NlY3Rpb24pOiBOZXcuCi0JKGVsZjY0X2lhNjRfY2hlY2tfcmVsb2NzKTogSGFuZGxlIFBDUkVMNjBCLCBQQ1JFTDIyLCBQQ1JFTDY0SS4KLQkoZWxmNjRfaWE2NF9pbnN0YWxsX3ZhbHVlKTogTGlrZXdpc2UsIHBsdXMgUENSRUwyMUJJLgotCShlbGY2NF9pYTY0X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uKTogTmV3LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0lBNjRfUENSRUwyMUJJKTogTmV3LgotCShCRkRfUkVMT0NfSUE2NF97UENSRUwyMixQQ1JFTDYwQixQQ1JFTDY0SX0pOiBOZXcuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi0yMDAwLTA1LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gOiBBZGQgcGVpZ2VuLmxvIHRvIE1JUFMgUEUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMjAwMC0wNS0yMiAgTW9tY2hpbCBWZWxpa292ICA8dmVsY29AZmFkYXRhLmJnPgotCi0JKiBsaWJiZmQuYyAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBDb21wYXJlIGVuZGlhbmVzcwotCW9ubHkgaWYgaXQgaXMga25vd24gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBiZmRzLiBTZXBhcmF0ZQotCWVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBhcyBpbiBzb21lIGxhbmd1YWdlcywgaXQgbWF5IGJlIG5lY2Vzc2FyeQotCXRvIGNoYW5nZSBtb3JlIHRoYW4gb25lIHBsYWNlIGluIHRoZSBzdHJpbmcgdG8gY2hhbmdlIGJldHdlZW4KLQknYmlnJyBhbmQgJ2xpdHRsZScuIAotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUmVtb3ZlIGlubGluZQotCWVuZGlhbmVzcyBjaGVja3MsIGNhbGwgX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2goKSBpbnN0ZWFkLiAgCi0JCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLiAgCi0KLQkqIGVsZjMyLW1jb3JlLmMgKG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuICAKLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuIFZlcmlmeQotCWVuZGlhbmVzcyBiZWZvcmUgY2hlY2tpbmcgYmZkIGZsYXZvdXJzLiAgCi0KLTIwMDAtMDUtMjIgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2xlYXIgdGhlIHZpc2liaWxpdHkKLQlmaWVsZCBmb3Igc3ltYm9scyBub3QgZGVmaW5lZCBsb2NhbGx5LgotCi0yMDAwLTA1LTE4ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBsaWJocHBhLmggKHJlX2Fzc2VtYmxlXzMsIHJlX2Fzc2VtYmxlXzEyLCByZV9hc3NlbWJsZV8xNiwKLQlyZV9hc3NlbWJsZV8xNywgcmVfYXNzZW1ibGVfMjEsIHJlX2Fzc2VtYmxlXzIyKTogRG9uJ3QgbWFzayBpbnNuLgotCShocHBhX3JlYnVpbGRfaW5zbik6IE1hc2sgaW1tZWRpYXRlIGJpdHMgaGVyZSBpbnN0ZWFkLgotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IE1hc2sgaGVyZSB0b28uCi0KLTIwMDAtMDUtMTggIE1vbWNoaWwgVmVsaWtvdiA8dmVsY29AZmFkYXRhLmJnPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluaywgZWxmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBlbWl0aW5nCi0JcmVsb2NzIGZvciBhbiBleGVjdXRhYmxlLCBlbnN1cmUgdGhhdCB0aGV5IGFyZSB2aXJ0dWFsIGFkZHJlc3Nlcy4KLQotVGh1IE1heSAxOCAxMDo1NTo0NyAyMDAwICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqNjQqLSotaHB1eDExKik6IE5ldyB0YXJnZXQgdHJpcGxldC4KLQotMjAwMC0wNS0xNyAgUy4gQmhhcmFkd2FqIFlhZGF2YWxsaSAgPHNieUBzY3J1Z3MubGtnLmRlYy5jb20+Ci0JICAgIFJpY2sgR29ydG9uCSAgICAgICAgICAgIDxnb3J0b25Ac2NydWdzLmxrZy5kZWMuY29tPgotCQotCSogZWxmbGluay5oOiBBZGQgZW1pdHJlbG9jYXRpb25zIHN1cHBvcnQ6IHdoZW4gZW5hYmxlZCwgcmVsb2NhdGlvbiAKLQlpbmZvcm1hdGlvbiBhbmQgcmVsb2NhdGlvbiBzZWN0aW9ucyBhcmUgcHV0IGludG8gZmluYWwgb3V0cHV0Ci0JZXhlY3V0YWJsZXMuICBJZiB0aGUgZW1pdHJlbG9jYXRpb25zIGZsYWcgaXMgc2V0LCBkbyB0aGUgZm9sbG93aW5nOgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBFbWl0IHJlbG9jYXRpb24gc2VjdGlvbnMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IENvbXB1dGUgcmVsb2NhdGlvbiBzZWN0aW9uIGNvbnRlbnRzLgotCShlbGZfZ2Nfc2VjdGlvbnMpOiBEb24ndCBjbGVhbiByZWxvY2F0aW9uIHNlY3Rpb25zLgotCi0yMDAwLTA1LTE2ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnV4LmNvbT4KLQotCSogc29tLmMgKHNvbV9kZWNvZGVfc3ltY2xhc3MpOiAgUmVjb2duaXplIHdlYWsgc3ltYm9scy4KLQotMjAwMC0wNS0xNiAgU3phYm9sY3MgU3pha2Fjc2l0cyA8c3pha2FARi1TZWN1cmUuY29tPgotCi0JKiBwZWlnZW4uYyAocGVfcHJpbnRfaWRhdGEpOiBVbmRvIHBhcnQgb2YgMjAwMC0wNS0xMiBjaGFuZ2UgdGhhdAotCXJlYWQgaWRhdGEgc2VjdGlvbiBvbmx5IGZyb20gZGF0YW9mZi4KLQkocGVfcHJpbnRfZWRhdGEpOiBDb3JyZWN0bHkgY2hlY2sgZm9yIHZhbGlkIGVhdF9tZW1iZXIuCi0KLVR1ZSBNYXkgMTYgMDA6MDQ6MTEgMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQotMjAwMC0wNS0xNCAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogY29uZmlnLmJmZCAoYXJtZWItKi1lbGYsIGFybSpiLSotbGludXgtZ251Kik6IE5ldyB0YXJnZXRzLgotCi0yMDAwLTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogI2lmZGVmIEJGRDY0IHJzNjAwMGNvZmY2NF92ZWMKLQotCSogcGVpZ2VuLmMgKHBlX3ByaW50X2lkYXRhKTogTG9vayBmb3IgLmlkYXRhIHNlY3Rpb24gYW5kIHByaW50Ci0JaW5mbyBldmVuIGlmIGRhdGEgZGlyZWN0b3J5IGhhcyB6ZXJvIGVudHJpZXMuICBSZWFkIGlkYXRhIHNlY3Rpb24KLQlzdGFydGluZyBmcm9tIGRhdGFvZmYsIGFuZCBhZGp1c3QgYWxsIGRhdGEgb2Zmc2V0cyB0byBzdWl0LiAgQ2FzdAotCWFsbCBiZmRfdm1hIHZhcnMgdG8gdW5zaWduZWQgbG9uZyBiZWZvcmUgcGFzc2luZyB0byBmcHJpbnRmLgotCSogcGVpZ2VuLmMgKHBlX3ByaW50X2VkYXRhKTogU2ltaWxhcmx5LCBsb29rIGZvciAuZWRhdGEgc2VjdGlvbgotCWFuZCBwcmludCBpbmZvIGV2ZW4gaWYgZGF0YSBkaXJlY3RvcnkgaGFzIHplcm8gZW50cmllcy4gIENhc3QKLQlhbGwgYmZkX3ZtYSB2YXJzIHRvIHVuc2lnbmVkIGxvbmcgYmVmb3JlIHBhc3NpbmcgdG8gZnByaW50Zi4KLQotCUZyb20gU3phYm9sY3MgU3pha2Fjc2l0cyA8c3pha2FARi1TZWN1cmUuY29tPgotCSogcGVpZ2VuLmMgKHBlX3ByaW50X2lkYXRhKTogVXNlIGJmZF9zZWN0aW9uX3NpemUgcmF0aGVyIHRoYW4gZGF0YQotCWRpcmVjdG9yeSBzaXplIHdoaWNoIG1heSBiZSBib2d1cy4KLQkqIHBlaWdlbi5jIChwZV9wcmludF9lZGF0YSk6IFNpbWlsYXJseS4KLQotMjAwMC0wNS0wOSAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHNldCB1c2VfcmVsYV9wIGlmIHJlbGEKLQlzZWN0aW9uIGlzIGVtcHR5LgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBbGxvdyBmb3Igc3BhY2UgcG9zc2libHkgdGFrZW4gdXAgYnkgZWxmCi0JaGVhZGVycyB3aGVuIGNhbGN1bGF0aW5nIHNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIGxtYS4KLQotMjAwMC0wNS0wOCAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IEluaXQgc3RyaW5nbGVuIGFuZCBwYXNzXzJfZG9uZS4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IFJldHVybgotCWJmZF9lcnJvcl93cm9uZ19mb3JtYXQgcmF0aGVyIHRoYW4gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLgotCi0JKiBwZWlnZW4uYyAoX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dCk6IFBhc3MgSW1hZ2VCYXNlIHRvCi0JYWRkX2RhdGFfZW50cnkuICBEYXRhRGlyZWN0b3J5IHZpcnR1YWwgYWRkcmVzcyBpcyByZWxhdGl2ZS4KLQkocGVfcHJpbnRfaWRhdGEpOiBBY2NvdW50IGZvciByZWxhdGl2ZSBEYXRhRGlyZWN0b3J5IHZpcnR1YWwKLQlhZGRyZXNzZXMuICBEb24ndCB0cmFzaCBkYXRhc2l6ZSBpbnNpZGUgUE9XRVJQQ19MRV9QRSBjb2RlLgotCShwZV9wcmludF9lZGF0YSk6IFNpbWlsYXJseS4KLQotCUZyb20gU3phYm9sY3MgU3pha2Fjc2l0cyA8c3pha2FARi1TZWN1cmUuY29tPgotCSogcGVpZ2VuLmMgKGRpcl9uYW1lcyk6IEFkZCBEZWxheSBJbXBvcnQgRGlyZWN0b3J5LgotCShwZV9wcmludF9pZGF0YSk6ICBBbHdheXMgc2VhcmNoIGZvciBiZmQgc2VjdGlvbiBjb250YWluaW5nCi0JaWRhdGEgYWRkcmVzcyByYXRoZXIgdGhhbiBsb29raW5nIHVwIHNlY3Rpb24gbmFtZS4gIFByaW50IHRoaXMKLQlzZWN0aW9uIG5hbWUgcmF0aGVyIHRoYW4gLmlkYXRhLgotCShwZV9wcmludF9lZGF0YSk6IFNpbWlsYXJseS4gIEFsc28gcHJpbnQgc29tZSBmaWVsZHMgYXMgJTA4bHguCi0JKF9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24pOiBQcmludCBSZXNlcnZlZDEgZmllbGQgYXMKLQlXaW4zMlZlcnNpb24uCi0KLUZyaSBNYXkgIDUgMjA6NDQ6NDAgMjAwMCAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmLmg6IFJlbmFtZSB0byB4Y29mZi10YXJnZXQuaAotCSogTWFrZWZpbGUuYW06IENoYW5nZSBhbGwgaW5zdGFuY2VzIG9mIHhjb2ZmLmggdG8geGNvZmYtdGFyZ2V0LmgKLQkqIGNvZmYtcnM2MDAwLmM6IERpdHRvLgotCSogY29mZjY0LXJzNjAwMC5jOiBEaXR0by4KLQkqIGNvZmYtcG1hYy5jOiBEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCQotRnJpIE1heSAgNSAxNjo1MTowMyAyMDAwICBDbGludG9uIFBvcGV0eiAgPGNwb3BldHpAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGNvZmZfc2V0X2ZsYWdzKToKLQlDaGFuZ2UgVTgwMlRPQzY0TUFHSUMgdG8gVTgwM1hUT0NNQUdJQy4KLQotMjAwMC0wNS0wNCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQHNlYWRvZy5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZXRfYXJjaF9zaXplKTogTmV3IGZ1bmN0aW9uLCByZXR1cm4gMzIgfCA2NCB8IC0xLgotCSogYmZkLWluLmg6IFByb3RvdHlwZSBiZmRfZWxmX2dldF9hcmNoX3NpemUuCi0JKiBiZmQtaW4yLmg6IFByb3RvdHlwZSBiZmRfZWxmX2dldF9hcmNoX3NpemUuCi0KLTIwMDAtMDUtMDQgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIGxpYmhwcGEuaCAoSFBQQV9SX0NPTlNUQU5UKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfc2lnbmVkX3ZtYS4KLQotMjAwMC0wNS0wMyAgTWFydGluIHYuIEz2d2lzICA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFJlc2V0IGR5bmluZHggZm9yCi0JaGlkZGVuIGFuZCBpbnRlcm5hbCBzeW1ib2xzLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IENsZWFyIE5FRURTX1BMVCBmb3Igc3ltYm9scyB3aXRoCi0JdmlzaWJpbGl0eS4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEbyBub3QKLQlhc3NpZ24gYSBQTFQgb3IgR09UIGVudHJ5IHRvIHN5bWJvbHMgd2l0aCBoaWRkZW4gYW5kCi0JaW50ZXJuYWwgdmlzaWJpbGl0eS4KLQotMjAwMC0wNS0wMyAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogYmZkL2NvZmYtZ28zMi5jIChDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMpOiBBZGQgZW50cnkgZm9yCi0JdGhlIC5ic3Mgc2VjdGlvbi4KLQkqIGJmZC9jb2ZmLXN0Z28zMi5jIChDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMpOiBMaWtld2lzZS4KLQotMjAwMC0wNS0wMiAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogVXNlIEVMRk9TQUJJX05PTkUgaW5zdGVhZCBvZgotCUVMRk9TQUJJX1NZU1YuCi0KLTIwMDAtMDUtMDIgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBSZXN0b3JlIGJmZF9lbGYzMl9ocHBhX3ZlYy4KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IFJlc3RvcmUgZWxmMzItaHBwYS5sby4gIFJlZ2VuZXJhdGUKLQlkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotTW9uIE1heSAgMSAxNjo1Njo0NyAyMDAwICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlZmktYXBwLWlhMzIubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlZmktYXBwLWlhMzIuYy4KLQkoQkZENjRfQkFDS0VORFMpOiBEZWxldGUgY29mZi1pYTY0LmxvLiAgQWRkIGVmaS1hcHAtaWE2NC5sby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogRGVsZXRlIGNvZmYtaWE2NC5jLiAgQWRkIGVmaS1hcHAtaWE2NC5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTIwMDAtMDUtMDIgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIGNvbmZpZy5iZmQ6IFJlLWVuYWJsZSBlbGYzMi1ocHBhLiAgSXQgbm93IGNvbXBpbGVzLCBldmVuIGlmIGl0Ci0JZG9lc24ndCB3b3JrIHZlcnkgd2VsbC4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfaW50ZXJuYWxfc2hkcik6IERlZmluZS4KLQkoZWxmX2hwcGFfZmFrZV9zZWN0aW9ucyk6IGhkciBpcyBlbGZfaHBwYV9pbnRlcm5hbF9zaGRyLgotCVNldCBoZHItPnNfdHlwZSB0byAxIGlmIEFSQ0hfU0laRSA9PSAzMi4KLQkoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEFkZCBwcm90b3R5cGUuCi0JKGVsZl9ocHBhX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfaW5mb190b19ob3d0b19yZWwpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBGdWxseSBpbml0aWFsaXNlIGFsbCBlbnRyaWVzLgotCShfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogQWRkIEFUVFJJQlVURV9VTlVTRUQgdG8gYXJncy4KLQkoZWxmX2hwcGFfaW5mb190b19ob3d0byk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nLCBlbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2ssCi0JZWxmX2hwcGFfdW5tYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzLAotCWVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scywKLQllbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycywgZWxmX2hwcGFfZmluYWxfbGluaywKLQllbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uLCBlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlLAotCWVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBDb21waWxlIG9ubHkgaWYgQVJDSF9TSVpFID09IDY0IHVudGlsCi0JZWxmMzItaHBwYS5jIG1lc3MgaXMgY2xlYW5lZCB1cC4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IE1ha2UgaW5zbiBhbmQgcl90eXBlIHVuc2lnbmVkCi0JaW50LiAgRGVsZXRlIHJfZmllbGQuICBJbiBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMLCBkb24ndCBzZXQKLQlyX2ZpZWxkIHRoZW4gY2FsbCBocHBhX2ZpZWxkX2FkanVzdCBpbmxpbmUgZnVuYyB3aXRoIHZhcmlhYmxlCi0Jcl9maWVsZCBhcmcsIGluc3RlYWQgY2FsbCBocHBhX2ZpZWxkX2FkanVzdCB3aXRoIGZpeGVkIGFyZy4KLQlJbiBjYXNlIFJfUEFSSVNDX1BDUkVMMjJGLCBkb24ndCBzZXQgcl9maWVsZC4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IENoYW5nZSBhcmdzIGFuZCByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAotCWludC4gIENhbGwgcmVfYXNzZW1ibGVfKiBmdW5jcyB0byBkbyB0aGUgd29yay4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRG9uJ3QgYXNzdW1lIDMyIGJpdCB3aGVuCi0Jc2lnbiBleHRlbmRpbmcuCi0KLQkqIGxpYmhwcGEuaCAoSFBQQV9SX0NPTlNUQU5UKTogRG9uJ3QgYXNzdW1lIDMyIGJpdCB3aGVuIHNpZ24KLQlleHRlbmRpbmcuCi0JKHNpZ25fZXh0ZW5kKTogTWFzayBmaXJzdCBiZWZvcmUgc2lnbiBleHRlbmRpbmcuCi0JKGxvd19zaWduX2V4dGVuZCk6IFJld3JpdGUgd2l0aG91dCBjb25kaXRpb24gZXhwcmVzc2lvbi4KLQkob25lcywgZGlzX2Fzc2VtYmxlXzMsIGRpc19hc3NlbWJsZV8xMiwgZGlzX2Fzc2VtYmxlXzE2LAotCWRpc19hc3NlbWJsZV8xNywgZGlzX2Fzc2VtYmxlXzIxLCBkaXNfYXNzZW1ibGVfMjIpOiBEZWxldGUuCi0JKGFzc2VtYmxlXzMsIGFzc2VtYmxlXzYsIGFzc2VtYmxlXzEyLCBhc3NlbWJsZV8xNiwgYXNzZW1ibGVfMTZhLAotCWFzc2VtYmxlXzE3LCBhc3NlbWJsZV8yMSwgc2lnbl91bmV4dCwgbG93X3NpZ25fdW5leHQpOiBSZXR1cm4KLQlyZXN1bHQgYXMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIHRocm91Z2ggcG9pbnRlciBhcmcuCi0JQWNjZXB0IHVuc2lnbmVkIGludCBhcmdzLCBhbmQgcmV0dXJuIHVuc2lnbmVkIGludC4KLQkocmVfYXNzZW1ibGVfMyk6IE5ldy4gIENvbWJpbmVzIGZ1bmN0aW9uIG9mIGRpc19hc3NlbWJsZV8zIHdpdGgKLQlyZS1hc3NlbWJseSBvZiBvcGNvZGUgYW5kIGltbWVkaWF0ZS4KLQkocmVfYXNzZW1ibGVfMTIpOiBMaWtld2lzZS4KLQkocmVfYXNzZW1ibGVfMTYpOiBMaWtld2lzZS4KLQkocmVfYXNzZW1ibGVfMTcpOiBMaWtld2lzZS4KLQkocmVfYXNzZW1ibGVfMjEpOiBMaWtld2lzZS4KLQkocmVfYXNzZW1ibGVfMjIpOiBMaWtld2lzZS4KLQkoaHBwYV9maWVsZF9hZGp1c3QpOiBSZXdyaXRlIGFuZCBkb2N1bWVudCwgcGF5aW5nIGF0dGVudGlvbiB0bwotCXNpemUgb2YgdHlwZXMgYW5kIHNpZ25lZC91bnNpZ25lZCBpc3N1ZXMuCi0JKGdldF9vcGNvZGUpOiBTaGlmdCBiZWZvcmUgbWFza2luZy4KLQkoRkRMVyk6IFJlbmFtZSB0byBGTERXLgotCShiZmRfaHBwYV9pbnNuMmZtdCk6IENoYW5nZSBhcmcgdG8gdW5zaWduZWQgaW50LiAgRGVsZXRlIGZtdC4KLQkoaHBwYV9yZWJ1aWxkX2luc24pOiBDaGFuZ2UgYXJncyBhbmQgcmV0dXJuIHZhbHVlIHRvIHVuc2lnbmVkCi0JaW50LiAgTWFrZSB1c2Ugb2YgcmVfYXNzZW1ibGVfKi4gIENvcnJlY3QgY2FzZSAxMS4KLQkKLQkqIGRlcC1pbi5zZWQ6IEhhbmRsZSAuLi9vcGNvZGVzLy4KLQkqIE1ha2VmaWxlLmFtIChTT1VSQ0VfSEZJTEVTKTogQWRkIGVsZi1ocHBhLmgsIGVsZjMyLWhwcGEuaCwKLQllbGY2NC1ocHBhLmgsIGhwcGFfc3R1YnMuaCwgeGNvZmYuaC4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVzdG9yZSBlbGYzMi1ocHBhLmMuCi0JUmVtb3ZlIGVsZjY0LWhwcGEubG8sIGNwdS1pYTY0LmxvLCBlbGY2NC1pYTY0LmxvLCBlbGZhcm0tb2FiaS5sbywKLQllbGZhcm0tbmFiaS5sbyBkZXBlbmRlbmNpZXMgb3V0c2lkZSBvZiBhdXRvLWRlcGVuZGVuY3kgYXJlYS4KLQlSZWdlbmVyYXRlIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWd1cmUuaW4gKFRSQURfSEVBREVSKTogVGVzdCBub24tbnVsbCBiZWZvcmUKLQlBQ19ERUZJTkVfVU5RVU9URUQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIHJlbG9jLmM6IEZpeCBtaXMtc3BlbGxpbmcgaW4gY29tbWVudC4KLQotMjAwMC0wNS0wMSAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogRml4IEZyaSBBcHIgMjggY2hhbmdlLgotCSogdm1zLmMgKHZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpOiBSZXR1cm4gTlVMTC4KLQotRnJpIEFwciAyOCAyMTozNDo0NCAyMDAwICBDbGludG9uIFBvcGV0eiAgPGNwb3BldHpAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCBDb3B5IGNoYW5nZXMgbWlzdGFrZW5seSBkb25lIHRvIGxpYmNvZmYuaCBpbgotCTQvMjQvMjAwMCBwYXRjaC4gIAkKLQotMjAwMC0wNC0yOSAgQW5kcmVhcyBKYWVnZXIgIDxhakBzdXNlLmRlPgotCi0JKiBsaWJiZmQtaW4uaDogQ29ycmVjdGx5IGNoZWNrIEdDQyB2ZXJzaW9uLgotCSogYmZkLWluLmg6IExpa2V3aXNlLgotCSogbGliaHBwYS5oOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi1GcmkgQXByIDI4IDE0OjU4OjM3IDIwMDAgIENsaW50b24gUG9wZXR6ICA8Y3BvcGV0ekBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZENjRfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZAotCWNvZmZkdS1yczYwMDAue2xvLGN9LgotCShjb2ZmLXBtYWMubG8sIGNvZmYtcnM2MDAwLmxvLCBjb2ZmNjQtcnM2MDAwLmxvKTogQWRkIGRlcGVuZGVuY3kKLQlvbiB4Y29mZi5oCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIHhjb2ZmLmg6IE5ldyBmaWxlLgotCSogY29mZi1wbWFjLmM6IFVzZSB4Y29mZi5oIGluc3RlYWQgb2YgY29mZi1yczYwMDAuYy4KLQkqIGNvZmYtcnM2MDAwLmM6IE1vdmUgYWxsIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5lcyB0aGF0IGFyZQotCWNvbW1vbiB0byB0aGUgeGNvZmYgYmFja2VuZHMgaW50byB4Y29mZi5oCi0JKiBjb2ZmNjQtcnM2MDAwLmM6IERpdHRvLCAJCi0KLUZyaSBBcHIgMjggMDg6MzU6MjEgMjAwMCAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6ICBBZGQgaW5pdGlhbGl6YXRpb24gb2YKLQlfYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXMgaW4gc3RyaW5ncyBhbmQKLQlfYmZkX2NvZmZfZGVidWdfc3RyaW5nX3ByZWZpeF9sZW5ndGggdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0JKiBjb2ZmLXNoLmM6IChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogRGl0dG8uCi0KLUZyaSBBcHIgMjggMDg6MDU6MTIgMjAwMCAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGluaXRpYWxpemF0aW9uIG9mCi0JX2JmZF9jb2ZmX2ZvcmNlX3N5bW5hbWVzIGluIHN0cmluZ3MgYW5kIAotCV9iZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLQotMjAwMC0wNC0yNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19nY19zd2VlcF9ob29rKTogIFJldHVybiBpZiBkeW5vYmogTlVMTC4KLQlDaGVjayBsb2NhbF9nb3RfcmVmY291bnRzIGJlZm9yZSBkZXJlZmVyZW5jaW5nLiAKLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHNwbHQgIT0gTlVMTAotCWJlZm9yZSBkZWNpZGluZyB3ZSBkb24ndCBuZWVkIFJfUFBDX1BMVDMyIHJlbG9jYXRpb24uCi0JKHBwY19lbGZfZ2Nfc3dlZXBfaG9vayk6IENoZWNrIGxvY2FsX2dvdF9yZWZjb3VudHMgYmVmb3JlCi0JZGVyZWZlcmVuY2luZy4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogRml4IGNvbW1lbnQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogUmVmZXJlbmNlIGNvdW50IC5nb3QgYW5kCi0JLnBsdCBlbnRyaWVzLgotCShlbGZfaTM4Nl9nY19zd2VlcF9ob29rKTogR2FyYmFnZSBjb2xsZWN0IC5nb3QgYW5kIC5wbHQgZW50cmllcy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmVjb2duaXplIHVudXNlZCAucGx0IGVudHJpZXMuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBbGxvdyBmb3IgLnBsdCB0byBnbyBtaXNzaW5nLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2Ugc2FtZSB0ZXN0IHRvIGRlY2lkZSBpZiB3ZQotCWNhbiB1c2UgYSByZWxhdGl2ZSByZWxvYyBmb3IgZ290IGFzIGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluayk6IERlZmluZSB0byB1c2UgZ2MgZm9ybSBvZiBmaW5hbCBsaW5rLgotCi1XZWQgQXByIDI2IDE2OjMxOjI4IDIwMDAgIENsaW50b24gUG9wZXR6ICA8Y3BvcGV0ekBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBSZW1vdmUgZXh0cmFuZW91cyBiZmRfcG93ZXJwY182NF9hcmNoLgotCi1Nb24gQXByIDI0IDE1OjIwOjM1IDIwMDAgIENsaW50b24gUG9wZXR6ICA8Y3BvcGV0ekBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY29mZjY0LXJzNjAwMC5sbyk6IE5ldyBydWxlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9ta29iamVjdCwgeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhLAotCXhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUsIHhjb2ZmX3J0eXBlMmhvd3RvLAotCXhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLCB4Y29mZl9zbHVycF9hcm1hcCwgeGNvZmZfYXJjaGl2ZV9wLAotCXhjb2ZmX3JlYWRfYXJfaGRyLCB4Y29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUsIHhjb2ZmX3dyaXRlX2FybWFwLAotCXhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBObyBsb25nZXIgc3RhdGljLCBhbmQgcHJlZml4IHdpdGggX2JmZF8uCi0JKE5PX0NPRkZfU1lNQk9MUyk6IERlZmluZS4KLQkoeGNvZmY2NF9zd2FwX3N5bV9pbiwgeGNvZmY2NF9zd2FwX3N5bV9vdXQsIHhjb2ZmNjRfc3dhcF9hdXhfaW4sCi0JeGNvZmY2NF9zd2FwX2F1eF9vdXQpOiBOZXcgZnVuY3Rpb25zOyBoYW5kbGUgeGNvZmYgc3ltYm9sIHRhYmxlcwotCWludGVybmFsbHkuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoeGNvZmZfaG93dG9fdGFibCwgeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgNjQgYml0IFBPUyAKLQlyZWxvY2F0aW9uLgotCShjb2ZmX1NXQVBfc3ltX2luLCBjb2ZmX1NXQVBfc3ltX291dCwgY29mZl9TV0FQX2F1eF9pbiwgCi0JY29mZl9TV0FQX2F1eF9vdXQpOiBNYXAgdG8gdGhlIG5ldyBmdW5jdGlvbnMuCi0JKiBjb2ZmNjQtcnM2MDAwLmM6IE5ldyBmaWxlLgotCSogbGliY29mZi5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkcyAKLQlfYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXNfaW5fc3RyaW5ncyBhbmQgCi0JX2JmZF9jb2ZmX2RlYnVnX3N0cmluZ19wcmVmaXhfbGVuZ3RoLgotCShiZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzLCAKLQliZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCk6IE5ldyBtYWNyb3MgZm9yIGFib3ZlIGZpZWxkcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIFhDT0ZGNjQgbWFnaWMuCi0JU2V0IG1hY2hpbmUgdG8gNjIwIGZvciBYQ09GRjY0LiAgVXNlIGJmZF9jb2ZmX3N3YXBfc3ltX2luIGluc3RlYWQgCi0Jb2YgdXNpbmcgY29mZl9zd2FwX3N5bV9pbiBkaXJlY3RseS4KLQkoRk9SQ0VfU1lNTkFNRVNfSU5fU1RSSU5HUyk6IE5ldyBtYWNybywgZGVmaW5lZCBmb3IgWENPRkY2NC4KLQkoY29mZl9zZXRfZmxhZ3MpIFNldCBtYWdpYyBmb3IgWENPRkY2NC4JCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIHN5bWJvbCBuYW1lIGxlbmd0aCB0bwotCXN0cmluZyBzZWN0aW9uIGxlbmd0aCBpZiBiZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCBpcwotCXRydWUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZG8gcmVsb2Mgb3ZlcmZsb3cgZm9yIFhDT0ZGNjQuCi0JKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFVzZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbiBpbnN0ZWFkIG9mCi0JdXNpbmcgY29mZl9zd2FwX2xpbmVub19pbiBkaXJlY3RseS4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIF9iZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzCi0JYW5kIF9iZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lLCBjb2ZmX3dyaXRlX3N5bWJvbHMpOiBGb3JjZSAKLQlzeW1ib2wgbmFtZXMgaW50byBzdHJpbmdzIHRhYmxlIHdoZW4gCi0JYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXNfaW5fc3RyaW5ncyBpcyB0cnVlLgotCSogY29mZnN3YXAuaCAoTUFYX1NDTkhEUl9OUkVMT0MsIE1BWF9TQ05IRFJfTkxOTk8sIEdFVF9SRUxPQ19WQUREUiwKLQlTRVRfUkVMT0NfVkFERFIpOiBOZXcgbWFjcm9zLgotCShjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfc3dhcF9yZWxvY19vdXQpOiBVc2UgYWJvdmUgbWFjcm9zLgkKLQkoY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX2F1eF9vdXQpOiBSZW1vdmUgUlM2MDAwQ09GRl9DCi0JY29kZS4KLQkoY29mZl9zd2FwX2FvdXRoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEhhbmRsZSBYQ09GRjY0Ci0JY2hhbmdlcyB3aXRoaW4gUlM2MDAwQ09GRl9DIHNwZWNpZmljIGNvZGUuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFBVVF9TQ05IRFJfTkxOTk8sIFBVVF9TQ05IRFJfTlJFTE9DLCAKLQlNQVhfU0NOSERSX05SRUxPQywgYW5kIE1BWF9TQ05IRFJfTkxOTk8uCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKToKLQlFeHRlbmQgZXhpc3RpbmcgaGFjayBvbiB0YXJnZXQgbmFtZS4KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9YVkVDUCk6IEV4dGVuZCBleGlzdGluZyBoYWNrIG9uCi0JdGFyZ2V0IG5hbWUuCi0JKiBjb2ZmLXRpYzU0eC5jICh0aWNvZik6IEtlZXAgdXAgdG8gZGF0ZSB3aXRoIG5ldyBmaWVsZHMKLQlpbiBiZmRfY29mZl9iYWNrZW5kX2RhdGEuCi0JKiBjb25maWcuYmZkOiBBZGQgYmZkX3Bvd2VycGNfNjRfYXJjaCB0byB0YXJnX2FyY2ggYW5kIGRlZmluZQotCXRhcmdfc2VsdmVjcyB0byBpbmNsdWRlIHJzNjAwMGNvZmY2NF92ZWMgZm9yIHJzNjAwMC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHJzNjAwMGNvZmY2NF92ZWMgY2FzZS4KLQkqIGNwdS1wb3dlcnBjLmM6IE5ldyBiZmRfYXJjaF9pbmZvX3R5cGUuCi0KLU1vbiBBcHIgMjQgMDI6MTc6MzEgMjAwMCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBPbmx5IGRpc2FibGUgZWxmMzItaHBwYSB2ZWN0b3JzLCBub3QgYWxsIG9mIHRoZQotCUJTRCBhbmQgT1NGIGNvbmZpZ3VyYXRpb24gc3VwcG9ydC4gIFByb3ZpZGUgKGRpc2FibGVkKSBjbGF1c2VzCi0JZm9yIFBBNjQgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNsYXVzZSBmb3IgUEE2NCBzdXBwb3J0LgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9ocHBhX3ZlYy4KLQkoYmZkX2VsZjY0X2hwcGFfdmVjKTogRGVjbGFyZS4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LWhwcGEubG8KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LWhwcGEuYwotCShlbGY2NC1ocHBhLmxvKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCi0JKiBlbGY2NC1ocHBhLmMsIGVsZjY0LWhwcGEuaDogTmV3IGZpbGVzIHdpdGggUEE2NCBzdXBwb3J0LgotCi1Nb24gQXByIDI0IDAyOjE0OjI5IDIwMDAgIEphc29uIEVja2hhcmR0ICA8amxlQGN5Z251cy5jb20+Ci0KLQkqIGxpYmhwcGEuaCAoZGlzX2Fzc2VtYmxlXzE2KTogTmV3IGZ1bmN0aW9uLgotCShwYV9hcmNoKTogQWRkZWQgcGEyMHcgZWxlbWVudC4KLQotTW9uIEFwciAyNCAwMTo0OTowMyAyMDAwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oOiBBZGQgcHJvdG90eXBlcyBmb3IgYmZkX2VsZjMyX3dyaXRlX3JlbG9jcywKLQliZmRfZWxmMzJfc2x1cnBfcmVsb2NfdGFibGUsIGJmZF9lbGY2NF93cml0ZV9yZWxvY3MsIGFuZAotCWJmZF9lbGY2NF9zbHVycF9yZWxvY190YWJsZS4KLQotCSogZWxmY29kZS5oIChlbGZfd3JpdGVfcmVsb2NzLCBlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBOZXcKLQlkZWZpbml0aW9ucyB0byBnZXQgZXh0ZXJuYWwgbmFtZXMuCi0JKGVsZl93cml0ZV9yZWxvY3MpOiBSZW5hbWVkIGZyb20gd3JpdGVfcmVsb2NzIGFuZCBtYWtlIGdsb2JhbC4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogTWFrZSBnbG9iYWwuCi0JKF9iZmRfZWxmLHNpemVfaW5mbyk6IFVzZSBlbGZfd3JpdGVfcmVsb2NzIGluc3RlYWQgb2Ygd3JpdGVfcmVsb2NzLgotCi0JKiBhcmNoaXZlLmMgKGhwdXhfdWlkX2dpZF9lbmNvZGUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtKTogVXNlIGl0IGlmIEhQVVhfTEFSR0VfQVJfSURTIGlzCi0JZGVmaW5lZCBhbmQgdGhlIElEIGlzIGdyZWF0ZXIgdGhhbiA5OTk5OS4KLQkoYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IElmIEhQVVhfTEFSR0VfQVJfSURTIGlzIGRlZmluZWQgZGVjb2RlCi0Jc3BlY2lhbCB1aWQvZ2lkIGZpZWxkcyBpbnRvIDMyIGJpdCB2YWx1ZXMuCi0KLTIwMDAtMDQtMjEgIE1hdHRoZXcgR3JlZW4gIDxtcmdAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIE5ldEJTRC9zcGFyYzY0IHN1cHBvcnQuCi0KLUZyaSBBcHIgMjEgMTM6MjA6NTMgMjAwMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQkJCSAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0JCQkgIFRpbW90aHkgV2FsbCA8dHdhbGxAY3lnbnVzLmNvbT4KLQkJCSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCQotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtaWE2NC5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtaWE2NC5jLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBlbGY2NC1pYTY0LmxvLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtaWE2NC5jLgotCShjcHUtaWE2NC5sbywgZWxmNjQtaWE2NC5sbyk6IE5ldyBydWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX2lhNjQuCi0JKGJmZF9pYTY0X2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfaWE2NF9hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlnLmJmZDogKGlhNjQqLSotbGludXgtZ251KiwgaWE2NCotKi1lbGYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogKGlhNjQtKi1saW51eCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjY0X2lhNjRfbGl0dGxlX3ZlYywgYmZkX2VsZjY0X2lhNjRfYmlnX3ZlYywKLQliZmRfZWZpX2FwcF9pYTY0X3ZlYywgYmZkX2VmaV9hcHBfaWE2NF92ZWMpOiBOZXcgdmVjdG9ycy4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfaWE2NC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcmVsb2MuYzogQWRkIElBLTY0IHJlbG9jYXRpb25zLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfaWE2NF9saXR0bGVfdmVjLCBiZmRfZWxmNjRfaWE2NF9iaWdfdmVjKToKLQlEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3QpOiBBZGQgYmZkX2VsZjY0X2lhNjRfbGl0dGxlX3ZlYy4KLQkqIGNwdS1pYTY0LW9wYy5jLCBjcHUtaWE2NC5jLCBlbGY2NC1pYTY0LmM6IE5ldyBmaWxlcy4KLQkKLTIwMDAtMDQtMjEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogRG9uJ3QgbW9kaWZ5IHNlY3Rpb24KLQljb250ZW50cyB3aGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsuCi0JKGJmZF9lbGZfZDMwdl9yZWxvY18yMSk6IExpa2V3aXNlLgotCi0yMDAwLTA0LTIwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFJlc3RyaWN0IDE5OTgtMTItMTAKLQlwYXRjaCB0byBzeW1ib2xzIGRlZmluZWQgYnkgYSBzaGFyZWQgb2JqZWN0LgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFNpbWlsYXJseS4KLQotMjAwMC0wNC0xOSAgTWljaGFlbCBTb2tvbG92ICA8bXNva29sb3ZAaXZhbi5IYXJoYW4uT1JHPgotCi0JSyZSIGNvbXBpbGVyIGZpeGVzLgotCSogZHdhcmYyLmMgKGNvbmNhdF9maWxlbmFtZSk6IEF2b2lkIHN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24uCi0JKiBpZWVlLmMgKGllZWVfZ2V0X3N5bXRhYik6IERvbid0IGluaXRpYWxpc2UgdW5pb24gaW4gc3RydWN0LgotCi1Nb24gQXByIDE3IDE5OjE0OjM2IDIwMDAgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZENjRfQkFDS0VORFMpOiBNZW50aW9uIGNvZmYtaWE2NC5sby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogTWVudGlvbiBjb2ZmLWlhNjQuYwotCShjb2ZmLWlhNjQubG8pOiBBZGQgZGVwZW5kZW5jeS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29mZi1pYTY0LmM6IE5ldyBmaWxlLgotCSogZWZpLWFwcC1pYTMyLmM6IERpdHRvLgotCSogZWZpLWFwcC1pYTY0LmM6IERpdHRvLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBIYW5kbGUgSUE2NE1BR0lDLgotCShjb2ZmX3NldF9mbGFncyk6IERpdHRvLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykgW0lBNjRdOiBTZXQgbWFnaWMgbnVtYmVyIHRvIFpNQUdJQy4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopOiBNZW50aW9uIGJmZF9lZmlfYXBwX2lhMzJfdmVjLgotCSogY29uZmlndXJlLmluIChlbGYpOiBIYW5kbGUgYmZkX2VmaV9hcHBfaWEzMiBhbmQgYmZkX2VmaV9hcHBfaWE2NF92ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBsaWJwZWkuaCAoR0VUX09QVEhEUl9JTUFHRV9CQVNFKTogTmV3IG1hY3JvLgotCShQVVRfT1BUSERSX0lNQUdFX0JBU0UpOiBEaXR0by4KLQkoR0VUX09QVEhEUl9TSVpFX09GX1NUQUNLX1JFU0VSVkUpOiBEaXR0by4KLQkoUFVUX09QVEhEUl9TSVpFX09GX1NUQUNLX1JFU0VSVkUpOiBEaXR0by4KLQkoR0VUX09QVEhEUl9TSVpFX09GX1NUQUNLX0NPTU1JVCk6IERpdHRvLgotCShQVVRfT1BUSERSX1NJWkVfT0ZfU1RBQ0tfQ09NTUlUKTogRGl0dG8uCi0JKEdFVF9PUFRIRFJfU0laRV9PRl9IRUFQX1JFU0VSVkUpOiBEaXR0by4KLQkoUFVUX09QVEhEUl9TSVpFX09GX0hFQVBfUkVTRVJWRSk6IERpdHRvLgotCShHRVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9DT01NSVQpOiBEaXR0by4KLQkoUFVUX09QVEhEUl9TSVpFX09GX0hFQVBfQ09NTUlUKTogRGl0dG8uCi0JKEdFVF9QREFUQV9FTlRSWSk6IERpdHRvLgotCSogcGVpZ2VuLmMgKF9iZmRfcGVpX3N3YXBfYW91dGhkcl9pbikgW0NPRkZfV0lUSF9QRVA2NF06IERvbid0IHJlYWQKLQlkYXRhX3N0YXJ0LiAgVXNlIGFib3ZlIG1hY3JvcyB0byByZWFkIGZpZWxkcyB0aGF0IGFyZSA2NCBiaXQgd2lkZSBmb3IKLQlDT0ZGX1dJVEhfUEVQNjQuICBEb24ndCB0cnVuY2F0ZSBlbnRyeSBhbmQgdGV4dF9zdGFydCB0byAzMiBiaXRzLgotCShfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0KSBbUEVJX0ZPUkNFX01JTklNVU1fQUxJR05NRU5UXTogRm9yY2UKLQlGaWxlQWxpZ25tZW50IGFuZCBTZWN0aW9uQWxpZ25tZW50IHRvIG1pbmltdW0gYWxpZ25tZW50IGlmIHRoZXkKLQlhcmUgemVyby4KLQkoX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dCkgW1BFSV9ERUZBVUxUX1RBUkdFVF9TVUJTWVNURU1dOiBTZXQKLQlTdWJzeXN0ZW0gdG8gZGVmYXVsdCBQRUlfREVGQVVMVF9UQVJHRVRfU1VCU1lTVEVNLgotCShfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0KSBbQ09GRl9XSVRIX1BFUDY0XTogRG9uJ3Qgc2V0IGRhdGFfc3RhcnQuCi0JVXNlIGFib3ZlIG1hY3JvcyB0byB3cml0ZSBmaWVsZHMgdGhhdCBhcmUgNjQgYml0IHdpZGUgZm9yCi0JQ09GRl9XSVRIX1BFUDY0LgotCShwZV9wcmludF9wZGF0YSk6IFNldCBQREFUQV9ST1dfU0laRSB0byAzKjggZm9yIENPRkZfV0lUSF9QRVA2NCwKLQk1KjQgb3RoZXJ3aXNlLiAgVGhpcyBzaG91bGQgYmUgcmlnaHQgZm9yIElBLTMyIGFuZCBJQS02NCwgYnV0IG1heQotCWJlIHdyb25nIGZvciBwbGF0Zm9ybXMuICBVc2UgUERBVEFfUk9XX1NJWkUgaW5zdGVhZCBvZiBoYXJkY29kZWQKLQl2YWx1ZSBvZiAyMCBieXRlcy4gIE1vZGlmeSBwcmludGluZyBmb3IgQ09GRl9XSVRIX1BFUDY0IHRvIHByaW50Ci0JYmVnaW4gYWRkcmVzcywgZW5kIGFkZHJlc3MsIGFuZCB1bndpbmQgaW5mbyBhZGRyZXNzIG9ubHkuICBVc2UKLQlHRVRfUERBVEFfRU5UUlkoKSB0byByZWFkIC5wZGF0YSBlbnRyaWVzLiAgVXNlIGZwcmludGZfdm1hKCkgdG8KLQlwcmludCBhZGRyZXNzZXMuCi0JKHRibCk6IEFkZCBTRUNUSU9OLCBSRUwzMiwgUkVTRVJWRUQxLCBNSVBTX0pNUEFERFIxNiwgRElSNjQsIGFuZAotCUhJR0gzQURKIHJlbG9jYXRpb24gbmFtZXMuCi0JKF9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFByaW50IFN1YnN5c3RlbSBuYW1lIGluIGxlZ2libGUgZm9ybS4KLQkqIHRhcmdldHMuYzogRGVjbGFyZSBiZmRfZWZpX2FwcF9pYTMyX3ZlYyBhbmQKLQliZmRfZWZpX2FwcF9pYTY0X3ZlYy4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBNZW50aW9uIGJmZF9lZmlfYXBwX2lhMzJfdmVjIGFuZAotCWJmZF9lZmlfYXBwX2lhNjRfdmVjLgotCQotMjAwMC0wNC0xNyAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBBZGQgcHJvdG90eXBlcyBmb3IgdGljNTR4IGxvYWQgcGFnZSBhY2Nlc3MuCi0JKiBiZmQtaW4uaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmYtdGljNTR4LmM6IEFkZCBsb2FkIHBhZ2UgZnVuY3Rpb25zOyBhbGxvdyBiZmRfYXJjaF91bmtub3duCi0JaW4gY3VzdG9taXplZCBfc2V0X2FyY2hfbWFjaCBmdW5jdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogU2V0IHNlY3Rpb24gbG9hZCBwYWdlIGlmCi0JdGhlIGFwcHJvcHJpYXRlIG1hY3JvIGlzIGRlZmluZWQuIAotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBSZWFkIHNlY3Rpb24gbG9hZCBwYWdlLgotCQotMjAwMC0wNC0xMyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZWxmMzItaHBwYS5oOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUuCi0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfaTIwX3JlbG9jKTogRG9uJ3QgdXNlIFUgc3VmZml4LgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBbmQgaGVyZS4KLQotCSogZWxmMzItZDMwdi5jIChNQVgzMik6IERvbid0IHVzZSBMTCBzdWZmaXguCi0JKE1JTjMyKTogRGVmaW5lIGluIHRlcm1zIG9mIE1BWDMyLgotCShiZmRfZWxmX2QzMHZfcmVsb2MpOiBNYWtlIHJlbG9jYXRpb24gYSBiZmRfc2lnbmVkX3ZtYS4KLQotCSogY29mZi1hMjlrLmMgKFNJR05fRVhURU5EX0hXT1JEKTogUmVwbGFjZSB3aXRoIG1vcmUgY29uY2lzZQotCWV4cHJlc3Npb24uCi0KLQkqIHBlaWNvZGUuaCAocGVfSUxGX2J1aWxkX2FfYmZkKTogUmVtb3ZlIFVMIGZyb20gaGV4IGNvbnN0YW50cy4KLQotMjAwMC0wNC0xMiAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZGVwLWluLnNlZDogTWF0Y2ggc3BhY2UgYmVmb3JlIGZpbGUgbmFtZSwgbm90IGFmdGVyLgotCSogTWFrZWZpbGUuYW06IFJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBJbiBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZAotCWNhc2UsIGFsbG93IGFkZHJlc3Mgd3JhcC1hcm91bmQgc3R1cGlkbHkgcmVtb3ZlZCAyMDAwLTAzLTE3LiAgU2lnbgotCWV4dGVuZCB3aXRob3V0IGFuIGlmIHN0YXRlbWVudC4KLQotMjAwMC0wNC0xMSAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZ3ByZWxfcmVsb2MpOiBUZXN0IGZvciAxNiBiaXQgcmFuZ2UgdXNpbmcKLQlzaWduZWQgcXVhbnRpdGVzLgotCSogZWxmMzItbWlwcy5jIChncHJlbDE2X3dpdGhfZ3ApOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFRlc3QgcmFuZ2UKLQloZXJlIHVzaW5nIC0weDQwMDAwLCBub3QgKGludCkweGZmZmMwMDAwLgotCShlbGYzMl9ocHBhX3NpemVfb2Zfc3R1Yik6IExpa2V3aXNlLgotCi0yMDAwLTA0LTExICBUaW1vdGh5IFdhbGwgIDx0d2FsbEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzU0eC5jOiBOb3cgYnVpbGRzIHdpdGggYWxsIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5hbTogQWRkIGNvZmYvdGljNTR4LmggdG8gY29mZi10aWM1NHgubyBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogRWxpbWluYXRlIHdhcm5pbmcgb24KLQl1bml0aWFsaXplZCB2YXJpYWJsZS4KLQkKLUZyaSBBcHIgIDcgMTU6NTY6NTcgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdBUk5fQ0ZMQUdTKTogU2V0IHRvIC1XIC1XYWxsIGJ5IGRlZmF1bHQuICBBZGQKLQktLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvcHRpb24uCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTLCBXQVJOX0NGTEFHUyk6IEFkZCBkZWZpbml0aW9ucy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi0yMDAwLTA0LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CTFggYW5kCi0JQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JMWC4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlCi0JUl9BUk1fWFBDMjUgYW5kIFJfQVJNX1RITV9QQzIyLgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fKTogRml4IGRlZmluaXRpb25zIG9mCi0JUl9BUk1fWFBDMjUgYW5kIFJfQVJNX1RITV9YUEMyMi4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IE1ha2UgQkZEX1JFTE9DX3tBUk18VEhVTUJ9X1BDUkVMX0JMWCB0bwotCVJfQVJNX1tYUEMyNXxUSE1fWFBDMjJdLgotCi0JKiBlbGZhcm0tb2FiaS5jOiBEZWZpbmUgT0xEX0FSTV9BQkkgYW5kIGNoYW5nZSBpbmNsdWRlIGZyb20KLQllbGYvYXJtLW9hYmkuaCB0byBlbGYvYXJtLmgKLQotCSogTWFrZWZpbGUuYW06IEZpeCBkZXBlbmRlbmN5IGZvciBlbGZhcm0tb2FiaS5jCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkKLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi0yMDAwLTA0LTA2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAc2VhZG9nLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogcHJlc2VydmUgdmFsdWUgb2YgdGRhdGEgYXQgZW50cnksCi0JYW5kIHJlc3RvcmUgaXQgb24gZmFpbHVyZS4gIFJlbGVhc2UgbmV3bHkgYWxsb2NhdGVkIHRkYXRhIG9uCi0JZmFpbHVyZS4KLQkKLUZyaSBBcHIgIDcgMTE6MzM6NDcgMjAwMCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAoc3RydWN0IGR3YXJmMl9kZWJ1Zyk6IE5ldyBmaWVsZCBkd2FyZl9saW5lX3NpemUuCi0JKGRlY29kZV9saW5lX2luZm8pOiBTZXQgaXQuICBSZXBvcnQgZXJyb3IgaWYgdW5pdC0+bGluZV9vZmZzZXQgaXMKLQllcXVhbCB0byBvciBsYXJnZXIgdGhhbiBpdC4KLQotMjAwMC0wNC0wNyAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jOiBBZGRlZCB2ZWNzIGZvciB0aWM1NHguCi0JKiByZWxvYy5jOiBBZGRlZCByZWxvY3MgZm9yIHRpYzU0eC4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogQWRkIFRJIENPRkYgdmVjcyBmb3IgdGljNTR4LgotCSogY29uZmlndXJlLmluOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogUmVjb2duaXplIG5ldyB0aWM1NHggdGFyZ2V0LgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGRpdGlvbnMgZm9yIFRJIENPRkYgaGFuZGxpbmcuCi0JKiBiZmQtaW4yLmg6IEFkZCB0aWM1NHggdGFyZ2V0IGFuZCByZWxvY2F0aW9ucy4KLQkqIE1ha2VmaWxlLmFtLCBNYWtlZmlsZS5pbjogQWRkIHRpYzU0eCB0YXJnZXQuCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCB0aWM1NHggdGFyZ2V0LgotCSogY29mZi10aWM1NHguYzogTmV3LgotCSogY3B1LXRpYzU0eC5jOiBOZXcuCi0JCi0yMDAwLTA0LTA2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAc2VhZG9nLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogY2FsbCBiYWNrZW5kX29iamVjdF9wIHdoaWNoCi0JdGhlcmVieSBnZXRzIGFuIG9wcG9ydHVuaXR5IHRvIHVwZGF0ZSB0aGUgYXJjaC9tYWNoaW5lIHR5cGUuCi0KLTIwMDAtMDQtMDYgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIENfU1RBVExBQiBzdG9yYWdlCi0JY2xhc3MuICBIYW5kbGUgU0VDX0NMSU5LIGFuZCBTRUNfQkxPQ0sgZmxhZ3MuCi0JKiBzZWN0aW9uLmM6IEFkZCBTRUNfQ0xJTksgYW5kIFNFQ19CTE9DSyBmbGFncy4KLQkqIGJmZC1pbjIuaDogQWRkIFNFQ19DTElOSyBhbmQgU0VDX0JMT0NLIGZsYWdzLgotCi0yMDAwLTA0LTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogT25seSBjaGVjayBmb3IKLQlFRl9JTlRFUldPUksgaWYgdGhpcyBpcyBhbiB1bmtub3duIEVBQkkuCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgRUFCSSB2ZXJzaW9uCi0JbnVtYmVycy4gIE9ubHkgY2hlY2sgRUZfeHh4IGZsYWdzIGlmIHRoZSBFQUJJIHZlcnNpb24gbnVtYmVyCi0JaXMgdW5rbm93bi4KLQkoZWxmMzJfYXJtX2NoZWNrX3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IGNoZWNrIEVGX3h4eCBmbGFncwotCWlmIHRoZSBFQUJJIHZlcnNpb24gbnVtYmVyIGlzIHVua25vd24uCi0JKGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogT25seSBkZWNvZGUgRUZfeHh4IGZsYWdzCi0JaWYgdGhlIEVBQkkgdmVyc2lvbiBudW1iZXIgaXMgdW5rbm93bi4KLQotV2VkIEFwciAgNSAyMjowNDoyMCAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBBZGQgQkZEX1JFTE9DX1NIX0xPT1BfU1RBUlQgYW5kCi0JQkZEX1JFTE9DX1NIX0xPT1BfRU5ELgotCSogZWxmMzItc2guYyAoc2hfZWxmX2hvd3RvX3RhYik6IENoYW5nZSBzcGVjaWFsX2Z1bmMgdG8KLQlzaF9lbGZfaWdub3JlX3JlbG9jIGZvciBhbGwgZW50cmllcyB0aGF0IHNoX2VsZl9yZWxvYyB1c2VkIHRvIGlnbm9yZS4KLQlBZGQgZW50cmllcyBmb3IgUl9TSF9MT09QX1NUQVJUIGFuZCBSX1NIX0xPT1BfRU5ELgotCShzaF9lbGZfcmVsb2NfbG9vcCk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfZWxmX3JlbG9jKTogTm8gbmVlZCB0byB0ZXN0IGZvciBhbHdheXMtdG8tYmUtaWdub3JlZCByZWxvY3MKLQlhbnkgbW9yZS4KLQkoc2hfcmVsKTogQWRkIGVudHJpZXMgZm9yIEJGRF9SRUxPQ19TSF9MT09QX3tTVEFSVCxFTkR9LgotCShzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBCRkRfUkVMT0NfU0hfTE9PUF97U1RBUlQsRU5EfS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDQtMDQgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGUuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgZXh0cmFuZW91cyBta2RlcCBjb21tZW50LgotCShNS0RFUCk6IFVzZSBnY2MgLU1NIHJhdGhlciB0aGFuIG1rZGVwLgotCShERVApOiBRdW90ZSB3aGVuIHBhc3NpbmcgdmFycyB0byBzdWItbWFrZS4gIEFkZCB3YXJuaW5nCi0JbWVzc2FnZSB0byBlbmQuCi0JKERFUDEpOiBSZXdyaXRlIGZvciAiZ2NjIC1NTSIuCi0JKENMRUFORklMRVMpOiBBZGQgREVQMi4KLQlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDQtMDMgIEtldmluIEJ1ZXR0bmVyICA8a2V2aW5iQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY29yZWZpbGUgc3VwcG9ydCBmb3IgQUlYIDQuMy4gIEluIHBhcnRpY3VsYXIsCi0JQUlYX0NPUkVfRFVNUFhfQ09SRSB3aWxsIGJlIGRlZmluZWQgaW4gYWRkaXRpb24gdG8gQUlYX0NPUkUgd2hlbgotCWNvbXBpbGluZyByczYwMDAtY29yZS5jLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotMjAwMC0wNC0wMyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjYWNoZS5jIChiZmRfb3Blbl9maWxlKTogVW5saW5rIHRoZSBvdXRwdXQgZmlsZSBvbmx5IGlmCi0JaXQgaGFzIG5vbi16ZXJvIHNpemUuCi0KLTIwMDAtMDQtMDEgIEtlbiBCbG9jayBVU0cgIDxibG9ja0B6azMuZGVjLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQKLQlyZWxhdGl2ZSByZWxvY2F0aW9ucyBmb3Igbm9uLWxvYWRlZCBzZWN0aW9ucyBpbiBzaGFyZWQgb2JqZWN0cy4KLQkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogU2ltaWxhcmx5LgotCi1Nb24gQXByICAzIDEzOjM3OjE1IDIwMDAgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApKTogQWRkIEJGRF9SRUxPQ184IGFuZAotCUJGRF9SRUxPQ18xNiB0byBzd2l0Y2ggZm9yIGV4dGVuZGVkIHJlbG9jcy4KLQkoTVlfc3dhcF9leHRfcmVsb2NfaW4pOiBOZXcuCi0JKE1ZX3N3YXBfZXh0X3JlbG9jX291dCk6IE5ldy4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFVzZSBNWV9zd2FwX2V4dF9yZWxvY19pbiByYXRoZXIKLQl0aGFuIE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgZm9yIGV4dGVuZGVkIHJlbG9jcy4KLQkoTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSk6IFNpbWlsYXJseSB1c2UKLQlNWV9zd2FwX2V4dF9yZWxvY19vdXQuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogVXNlIE1ZX3B1dF9leHRfcmVsb2MgaWYgZGVmaW5lZC4KLQotMjAwMC0wNC0wMyAgS2F6dSBIaXJhdGEgIDxrYXp1QGh4aS5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEFkZCBic3I6MTYgLT4gYnNyOjggdG8KLQl0aGUgUl9QQ1JXT1JEX0IgY2FzZS4KLQotMjAwMC0wMy0zMSAgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd3JzLmNvbT4KLQotCSogc3JlYy5jIDogU2V0IENIVU5LIHNpemUgdG8gMTYgYnl0ZXMgdG8gcHJldmVudCBkb3dubG9hZCBmYWlsdXJlcwotCW9uIHNvbWUgdGFyZ2V0cy4KLQkqIGloZXguYyA6IERpdHRvLgotCi1XZWQgTWFyIDMwIDE1OjI4OjAwIDIwMDAgIERvbmFsZCBMaW5kc2F5ICA8ZGxpbmRzYXlAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9nZW5lcmljX3JlbG9jKTogbmV3IGZ1bmN0aW9uLiAgQWxsCi0JSE9XVE8gcmVmZXJlbmNlcyB0byBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIHRoYXQgaGF2ZQotCXBhcnRpYWxfaW5wbGFjZSA9PSB0cnVlLCBub3cgdXNlIHRoZSBuZXcgZnVuY3Rpb24uICBUaGUgZnVuY3Rpb24KLQlpcyBiYXNlZCBvbiB0aGUgcmVjZW50IHJld3JpdGUgb2YgbTMycl9lbGZfbG8xNl9yZWxvYygpLCBhbmQKLQlleHRlbmRzIGl0cyBmaXhlcyB0byB0aGUgUl9NMzJSX3sxNiwyNCwzMn0gcmVsb2NzLgotCVRoZSBuZXcgbG9naWMgaW4gbTMycl9lbGZfbG8xNl9yZWxvYygpIGhhcyBiZWVuIHJlbW92ZWQsIGFuZAotCWl0IGluc3RlYWQgY2FsbHMgdGhlIG5ldyByb3V0aW5lIHRvIG9idGFpbiB0aGF0IGZ1bmN0aW9uYWxpdHkuCi0KLTIwMDAtMDMtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIGVsZjMyLWF2ci5jIChlbGYzMl9hdnJfZ2NfbWFya19ob29rLCBlbGYzMl9hdnJfZ2Nfc3dlZXBfaG9vaywKLQllbGYzMl9hdnJfY2hlY2tfcmVsb2NzLCBhdnJfZmluYWxfbGlua19yZWxvY2F0ZSwKLQllbGYzMl9hdnJfcmVsb2NhdGVfc2VjdGlvbiwgYmZkX2VsZl9hdnJfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLQllbGYzMl9hdnJfb2JqZWN0X3ApOiBBZGQgcHJvdG90eXBlcy4KLQkoZWxmMzJfYXZyX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGZvciBoLT5yb290LnR5cGUuCi0JKGJmZF9lbGZfYXZyX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBNYWtlIHN0YXRpYy4KLQotMjAwMC0wMy0yNyAgRGVuaXMgQ2hlcnR5a292ICA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotCSogY3B1LWF2ci5jOiBOZXcgZmlsZS4gIEJGRCBzdXBwb3J0IHJvdXRpbmVzIGZvciBBVlIgYXJjaGl0ZWN0dXJlLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBBVlIgYXJjaGl0ZWN0dXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCByZWZlcmVuY2UgdG8gQVZSIGFyY2hpdGVjdHVyZSBpbmZvLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9hdnIuCi0JKiByZWxvYy5jOiBBZGQgdmFyaW91cyBBVlIgcmVsb2NhdGlvbiBlbnVtcy4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX2F2cl92ZWMpOiBEZWNsYXJlIGFuZCBhZGQgdG8gdGFyZ2V0IHZlY3RvcgotCWxpc3QuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIEFWUiBlbGYuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnLmJmZDogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZTogVGhpcyB0b28uCi0JKiBiZmQtaW4yLmg6IEFuZCB0aGlzLgotCSogbGliYmZkLmg6IEFuZCB0aGlzLgotCi0yMDAwLTAzLTI0ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzKTogQWRkIHByb3RvdHlwZS4KLQkoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMpOiBMaWtld2lzZS4KLQotMjAwMC0wMy0xNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogSW4gY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQlmbGFnIGFuIG92ZXJmbG93IGlmIHRoZSBiaXRmaWVsZCBpcyBvdXRzaWRlIC0yKipuIHRvIDIqKm4tMS4gIFRoZQotCWFsbG93YWJsZSByYW5nZSB1c2VkIHRvIGJlIC0yKioobi0xKSB0byAyKipuLTEuCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogU2FtZSBoZXJlLiAgQWxzbyByZXBsYWNlCi0JImJvb2xlYW4gb3ZlcmZsb3ciIHdpdGggImJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnIi4KLQotMjAwMC0wMy0xNCAgRG91ZyBFdmFucyAgPGRqZUBjYXNleS50cmFuc21ldGEuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2xvMTZfcmVsb2MpOiBSZXdyaXRlLgotCi0yMDAwLTAzLTE0ICBLYXp1IEhpcmF0YSAgPGthenVAaHhpLmNvbT4KLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBDb3VudCB0aGUgdG90YWwgbnVtYmVyCi0Jb2Ygc2hyaW5rcyBwcm9wZXJseSwgaW5jbHVkaW5nIHRoZSBsYXN0IHJlbG9jLgotCi0yMDAwLTAzLTEzICBLYXp1IEhpcmF0YSAgPGthenVAaHhpLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogRml4IHRoZSBzYW5pdHkKLQljaGVjayBmb3IgUl9NT1ZMMi4KLQotMjAwMC0wMy0xMSAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogaWVlZS5jIChpZWVlX2FyY2hpdmVfcCk6IFJldHVybiBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IG9uIAotCWEgZm9ybWF0IG1pc21hdGNoIHJhdGhlciB0aGFuIGFuICJlcnJvciIgZnJvbSBiZmRfcmVhZCBzdWNoIGFzCi0JYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLgotCi0yMDAwLTAzLTEwICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gcHJvcGVyCi0Jc2lnbi1leHRlbnNpb24gYW5kIGJpZy1lbmRpYW4gY29tcGVuc2F0aW9uIGZvcgotCVJfTUlQU182NCBldmVuIGluIGxkIC1yLgotCi0yMDAwLTAzLTEwICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbmV4dF9yZWxvY2F0aW9uKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9uZXh0X2xvMTZfcmVsb2NhdGlvbiwgYW5kIGdlbmVyYWxpemUgdG8gbG9vawotCWZvciBhbnkgcmVsb2NhdGlvbiB0eXBlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IE1ha2UgUl9NSVBTX1BDMTYgcGNyZWxfb2Zmc2V0LgotCShlbGZfbWlwc19nbnVfcmVsX2hpMTYpOiBIb3d0byBmb3IgUl9NSVBTX0dOVV9SRUxfSEkxNi4KLQkoZWxmX21pcHNfZ251X3JlbF9sbzE2KTogSG93dG8gZm9yIFJfTUlQU19HTlVfUkVMX0xPMTYuCi0JKGVsZl9taXBzX2dudV9yZWwxNl9zMik6IEhvd3RvIGZvciBSX01JUFNfR05VX1JFTDE2X1MyLgotCShlbGZfbWlwc19nbnVfcGNyZWw2NCk6IEhvd3RvIGZvciBSX01JUFNfUEM2NC4KLQkoZWxmX21pcHNfZ251X3BjcmVsMzIpOiBIb3d0byBmb3IgUl9NSVBTX1BDMzIuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbmV3IHJlbG9jcy4KLQkobWlwc19ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSRUxfSEkxNi9SRUxfTE8xNiByZWxvY3MKLQlhcmUgcGFpcmVkLiAgVGhlIGFkZGVuZCBmb3IgUl9NSVBTX0dOVV9SRUwxNl9TMgotCWlzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuCi0KLTIwMDAtMDMtMTAgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBVbmRvIGVtYWNzIGZvcm1hdHRpbmcgb2YKLQljb21tZW50LCBhbmQgZW5zdXJlIGl0IGRvZXNuJ3QgaGFwcGVuIGFnYWluLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogU2FtZSBoZXJlLgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogRG9uJ3QgYm90aGVyIGFzc2lnbmluZyB1bnVzZWQgc2lnbm1hc2sKLQlzaGlmdCByZXN1bHQuICBGaXggdHlwb3MgaW4gY29tbWVudHMuCi0JUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgdGhyb3VnaG91dCBmaWxlLgotCi0yMDAwLTAzLTA3ICBEb3VnIEV2YW5zICA8ZGplQGNhc2V5LnRyYW5zbWV0YS5jb20+Ci0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3N0cnVjdCk6IEZpeCBwYXJ0aWFsX2lucGxhY2UgY29tbWVudC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMjAwMC0wMy0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChzdHJ1Y3QgcGVfSUxGX3ZhcnMpOiBBZGQgc3ltX3B0cl90YWJsZSBhbmQKLQlzeW1fcHRyX3B0ciBmaWVsZHMuCi0JKFNJWkVPRl9JTEZfU1lNX1BUUl9UQUJMRSk6IERlZmluZS4KLQkoU0laRU9GX0lMRl9TVFJJTkdTKTogUmVkZWZpbmUuCi0JKHBlX0lMRl9tYWtlX2Ffc3ltYm9sLXJlbG9jKTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlcyBhIHN5bWJvbAotCXJlbGF0aXZlIHJlbG9jLCBhcyBvcHBvc2VkIHRvIGEgc2VjdGlvbiByZWxhdGl2ZSByZWxvYy4KLQkocGVfSUxGX21ha2VfYV9zeW1ib2wpOiBTZXQgdGhlIGNsYXNzIG9mIGxvY2FsIHN5bWJvbHMgdG8gQ19TVEFUCi0Jbm90IENfTEFCRUwuCi0JQWRkIGxlbmd0aCBvZiBzeW1ib2wncyBwcmVmaXggdG8gc3RyaW5nIHBvaW50ZXIuCi0JU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCBwb2ludGVyIHRhYmxlLgotCShwZV9JTEZfYnVpbGRfYV9iZmQpOiBEbyBub3QgYnVpbGQgLmlkYXRhJDIgb3IgLmlkYXRhJDcuCi0JSW5pdGlhbGlzZSB0aGUgc3ltYm9sIHBvaW50ZXIgdGFibGUuCi0JU3RvcmUgdGhlIGhpbnQgaW4gdGhlIEhpbnQvTmFtZSB0YWJsZS4KLQlNYWtlIHRoZSBqdW1wIHJlbG9jIGJlIHN5bWJvbCByZWFsdGl2ZSwgbm90IHNlY3Rpb24gcmVsYXRpdmUuCi0JQ3JlYXRlIGFuIGltcG9ydCBzeW1ib2wgZm9yIGltcG9ydGVkIGNvZGUuCi0KLTIwMDAtMDMtMDYgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6ICBDaGVjayBmb3IgbnVsbCB0eXBlX3B0ci4KLQotMjAwMC0wMy0wMSAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBSZW1vdmUgdW51c2VkCi0JYW5kIHVudXNhYmxlICIjaWYgQ0hPT1NFX1JFTE9DX1NJWkUiLgotCSogcGM1MzItbWFjaC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogRGl0dG8uCi0JKiBuZXRic2QuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERpdHRvLgotCSogaHAzMDBocHV4LmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEaXR0by4KLQkqIGZyZWVic2QuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERpdHRvLgotCSogYW91dC10aWMzMC5jICh0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCi0yMDAwLTAyLTI5ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIHBlaWNvZGUuaCAoanRhYik6IE1ha2UgaXQgc3RhdGljLgotCi0JKiBjb2ZmLXNoLmMgKHNoX2FsaWduX2xvYWRfc3Bhbik6IERlY2xhcmVkIGlmIENPRkZfV0lUSF9QRSBpcwotCWRlZmluZWQgYW5kIENPRkZfSU1BR0VfV0lUSF9QRSBpcyBub3QgZGVmaW5lZC4KLQkoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBEZWZpbmVkIGFzIHNoX2FsaWduX2xvYWRfc3BhbiBpZgotCUNPRkZfV0lUSF9QRSBpcyBkZWZpbmVkIGFuZCBDT0ZGX0lNQUdFX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0KLTIwMDAtMDMtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IE1ha2UKLQknc3ltbmR4JyBzaWduZWQgdG8gcHJldmVudCBjb21waWxlIHRpbWUgd2FybmluZy4KLQotCSogY29mZi1tY29yZS5jOiBSZW1vdmUgdW51c2VkIHByb3RvdHlwZSBmb3IgcGVfb2JqZWN0X3AuCi0KLQkqIGNvZmYtc2guYzogQWRkICIjaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRSIgYXJvdW5kIHN0YXRpYwotCWZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCB3aGVuIENPRkZfSU1BR0VfV0lUSF9QRSBpcwotCWRlZmluZWQuCi0JKHN0cnVjdCBzaF9vcGNvZGUpOiBDaGFuZ2UgdHlwZSBvZiAnZmxhZ3MnIGZpZWxkIHRvIHVuc2lnbmVkCi0JbG9uZyBzbyB0aGF0IGl0IGNhbiBob2xkIHRoZSBVU0VTQVMgZmxhZy4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJbml0aWFsaXNlICd0YXJnZXRfbmFtZScuCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluaXRpYWxpc2UKLQknc3ltX3NlYycuCi0KLQkqIGVsZjMyLWkzNzAuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgdG8gdW51c2VkIGZ1bmN0aW9uCi0JcGFyYW1ldGVycy4KLQlSZW1vdmUgdW51c3VlZCB2YXJpYWJsZXMgYW5kIGNvZGUuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IEZpeCBwcm90b3R5cGUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IEluaXRpYWxpc2UgJ3Nnb3QnIGFuZAotCSdzcmVsZ290Jy4KLQotCSogZWxmMzItbWNvcmUuYyAobWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXNlCi0JJ29sZGluc3QnLiAKLQotCSogZWxmMzItbWlwcy5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCB0byB1bnVzZWQgZnVuY3Rpb24KLQlwYXJhbWV0ZXJzLgotCVJlbW92ZSB1bnVzdWVkIHZhcmlhYmxlcyBhbmQgY29kZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogRml4IHByb3RvdHlwZS4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3NldF9tYWNoX2Zyb21fZmxhZ3MpOiBVc2UgJ2ZsYWdzJy4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCXRvIHVudXNlZCBmdW5jdGlvbiBwYXJhbWV0ZXIuCi0JCi0JKiBwZS1taXBzLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIHRvIHVudXNlZCBmdW5jdGlvbgotCXBhcmFtZXRlcnMuCi0JVXNlIEVNUFRZX0hPV1RPIHRvIGluaXRpYWxpc2UgZW1wdHkgaG93dG8gc2xvdHMuCi0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIHBlaWNvZGUuaCAocGVfSUxGX2J1aWxkX2FfYmZkKTogSW5pdGlhbGlzZSBpZDYuCQotCi0yMDAwLTAzLTAxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFBhc3MgInRydWUiIHRvCi0JdGhlIHVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2suCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVuKToKLQlMaWtld2lzZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1jb3JlLmMgKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXRpYzgwLmMgKGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmLW0xMDIwMC5jIChtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWQxMHYuYyAoZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzcwLmMgKGkzNzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWNvcmUuYyAobWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogcGUtbWlwcy5jIChjb2ZmX3BlX21pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbik6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzICJmYWxzZSIgdG8gdGhlCi0JdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjayB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5IHdpdGgKLQktQnN5bWJvbGljIGFuZCB1bmRlZmluZWQgc3ltYm9scyBhcmUgYWxsb3dlZC4gT3RoZXJ3aXNlLCBwYXNzCi0JInRydWUiLgotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50KTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTIwMDAtMDItMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gYnVpbGQgcGVbaV0te3NofG1pcHN9LmxvIG9iamVjdHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgbWlwcyBhbmQgc2ggcGUgdmVjdG9ycy4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZS4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIGFybS13aW5jZSwgbWlwcy1wZSBhbmQgc2gtcGUKLQl0YXJnZXRzLiAKLQotCSogdGFyZ2V0cy5jOiBBZGQgbWlwcyBhbmQgc2ggcGUgdmVjdG9ycy4KLQotCSogbGlicGVpLmggKGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogT25seSBkZWZpbmUgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgV2luQ0UgbWFnaWMgbnVtYmVycy4KLQotCSogcGVpZ2VuLmMgKHBlX3ByaW50X3JlbG9jKTogVXBkYXRlIGNvbW1lbnQgYW5kIHJlYXJyYW5nZQotCWFwcGVuZGluZyBvZiBuZXdsaW5lIGNoYXJhY3Rlci4KLQotCSogcGVpY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgSW1hZ2UgTGlicmFyeSBGb3JtYXQuCi0JKHBlX0lMRl92YXJzKTogU3RydWN0dXJlIGNvbnRhaW5pbmcgZGF0YSB1c2VkIGJ5IElMRiBjb2RlLgotCShwZV9JTEZfbWFrZV9hX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uICBDcmVhdGUgYSBzZWN0aW9uIGJhc2VkCi0Jb24gSUxGIGRhdGEuCi0JKHBlX0lMRl9tYWtlX2FfcmVsb2MpOiBOZXcgZnVuY3Rpb24uICBDcmVhdGUgYSByZWxvYyBiYXNlZCBvbgotCUlMRiBkYXRhLgotCShwZV9JTEZfbWFrZV9hX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZSBhIHN5bWJvbCBiYXNlZAotCW9uIElMRiBkYXRhLgotCShwZV9JTEZfc2F2ZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uICBTdG9yZSB0aGUgcmVsb2NzIGNyZWF0ZWQKLQlieSBwZV9JTEZfbWFrZV9hX3JlbG9jIGluIGEgc2VjdGlvbi4KLQkocGVfSUxGX2J1aWxkX2FfYmZkKTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlIGEgQkZEIGRlc2NyaWJpbmcKLQlhbiBJTEYgb2JqZWN0LgotCShwZV9JTEZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24uICBSZXR1cm4gYSBiZmRfdGFyZ2V0IHBvaW50ZXIKLQlmb3IgYW4gSUxGIG9iamVjdC4KLQkocGVfYmZkX29iamVjdF9wKTogSWYgYW4gSUxGIG9iamVjdCBpcyBkZXRlY3RlZCBjYWxsCi0JcGVfSUxGX29iamVjdF9wIG9uIGl0LgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgV2luQ0UgcmVsb2NzIHdoaWNoIGFyZSBkaWZmZXJlbnQKLQlmcm9tIG5vcm1hbCBBUk0gQ09GRiByZWxvY3MuCi0JKiBwZS1hcm0uYzogVW5zZXQgVEFSR0VUX1VOREVSU0NPUkUgZm9yIGEgV2luQ0UgdGFyZ2V0LgotCi0JKiBjb2ZmLXNoLmM6IEFkZCBzdXBwb3J0IGZvciBzaC1wZSB0YXJnZXQuCi0JKiBwZS1zaC5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgY29kZSBmb3Igc2gtcGUgdGFyZ2V0LgotCSogcGVpLXNoLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBjb2RlIGZvciBzaC1wZSB0YXJnZXQuCi0KLQkqIHBlLW1pcHMuYzogTmV3IGZpbGUuICBTdXBwb3J0IGNvZGUgZm9yIG1pcHMtcGUgdGFyZ2V0LgotCSogcGVpLW1pcHMuYzogTmV3IGZpbGUuICBTdXBwb3J0IGNvZGUgZm9yIG1pcHMtcGUgdGFyZ2V0LgotCi0yMDAwLTAyLTI3ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGJ1bXAKLQlhcmNoaXRlY3R1cmUgaWYgdGhlIG9iamVjdCBjYXVzaW5nIHRoZSBidW1wIGlzIGR5bmFtaWMuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UsCi0JYW5kIGFsc28gZG9uJ3QgaXQgZm9yIG1lbW9yeSBvcmRlcmluZy4KLQkoc3BhcmM2NF9lbGZfd3JpdGVfcmVsb2NzKTogVGFrZSBzcmNfcmVsYSBvdXQgb2YgdGhlIGxvb3AuCi0KLTIwMDAtMDItMjcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjIuYyAocmVhZF9hYmJyZXZzKTogVXNlIF9yYXdfc2l6ZSBkaXJlY3RseSByYXRoZXIgdGhhbgotCWNhbGxpbmcgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jLgotCShkZWNvZGVfbGluZV9pbmZvKTogTGlrZXdpc2UuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogTGlrZXdpc2UuCi0KLTIwMDAtMDItMjcgIEVsaSBaYXJldHNraWkgIDxlbGl6QGlzLmVsdGEuY28uaWw+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBVc2UgJChMSUJUT09MKSAtLWNvbmZpZyB0byBnZXQgdGhlCi0JbmFtZSBvZiB0aGUgbGlidG9vbCBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEZlYiAyNSAxODozOToyNiAyMDAwICBSb2RuZXkgQnJvd24gKFJvZG5leUJyb3duQHBtc2MuY29tKQotCi0JKiBzb20uYyAoU09NX0hPV1RPKTogRGVmaW5lLgotCShzb21faHBwYV9ob3d0b190YWJsZSk6IFVzZSBpdC4KLQotMjAwMC0wMi0yNSAgQWxleGFuZHJlIE9saXZhICA8b2xpdmFAbHNkLmljLnVuaWNhbXAuYnI+Ci0KLQkqIGNvbmZpZy5iZmQ6IEVuYWJsZSA2NCBiaXQgc3VwcG9ydCBmb3IgR05VL0xpbnV4L3NwYXJjLgotCi0JKiBjb25maWcuYmZkOiBFbmFibGUgNjQgYml0IHN1cHBvcnQgZm9yIFNvbGFyaXM3Ky9zcGFyYy4KLQotMjAwMC0wMi0yNCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fbWlzY19zeW1ib2xfaW5mbyk6ICBBZGQgZmllbGQKLQlzZWNvbmRhcnlfZGVmLiAKLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6ICBJbml0aWFsaXplCi0Jc2Vjb25kYXJ5X2RlZi4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBLZWVwIHRyYWNrCi0Jb2Ygc2Vjb25kYXJ5X2RlZiBmaWVsZC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfV0VBSyBzeW1ib2wgZmxhZwotCWlmIHNlY29uZGFyeV9kZWYgZmllbGQgaXMgc2V0LgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEluaXRpYWxpemUKLQlzZWNvbmRhcnlfZGVmLgotCi0yMDAwLTAyLTIzICBTdGVwaGFuZSBDYXJyZXogIDxzdGNhcnJlekB3b3JsZG5ldC5mcj4KLQotCSogZHdhcmYyLmMgKHJlYWRfYWRkcmVzcyk6IFJlYWQgMTYtYml0cyBhZGRyZXNzZXMuCi0JKHBhcnNlX2NvbXBfdW5pdCk6IEFjY2VwdCBhZGRyX3NpemUgPT0gMi4KLQkKLTIwMDAtMDItMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogYmZkLWluLmg6IFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZS4KLQotMjAwMC0wMi0yMyAgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgotCi0JKiBjcHUtaTM3MC5jOiBOZXcgZmlsZS4KLQkqIGVsZjMyLWkzNzAuYzogIE5ldyBmaWxlLgotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX2kzNzAuCi0JKGJmZF9pMzcwX2FyY2gpOiBOZXcuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9pMzcwX2FyY2guCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX2kzNzAuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIElCTSAzNzAgZWxmLgotCSogY29uZmlnLmJmZDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBMaWtld2lzZS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBMaWtld2lzZS4KLQkqIHRhcmdldHMuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0yMDAwLTAyLTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IEdpdmUgYSB3YXJuaW5nIGZvcgotCWludmFsaWQgcmVsb2NhdGlvbiB0eXBlcywgYW5kIGNoYW5nZSB0aGVtIHRvIFJfMzg2X05PTkUuCi0KLTIwMDAtMDItMjIgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHZlcnNpb24gc3ltYm9sIGlzCi0Jbm90IGRlZmluZWQsIGRvbid0IGFkZCBhIHNlY29uZCBFTEZfVkVSX0NIUi4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIG91dHB1dF9leHRzeW0gZm9yIGdsb2JhbAotCXN5bWJvbHMgY29udmVydGVkIHRvIGxvY2FsIHN5bWJvbHMgZXZlbiB3aGVuIHN0cmlwcGluZyBhbGwKLQlzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogUHJvY2VzcyBnbG9iYWwgc3ltYm9scyBjb252ZXJ0ZWQgdG8KLQlsb2NhbCBzeW1ib2xzIGV2ZW4gaWYgdGhleSBhcmUgYmVpbmcgc3RyaXBwZWQuCi0KLTIwMDAtMDItMjEgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX29jdGV0c19wZXJfYnl0ZSk6IFJldHVybiB1bnNpZ25lZCBpbnQuCi0JKGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlKTogRGl0dG8uCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQsIGJmZF9zZWVrKTogUXVlbGwgc2lnbmVkIHZzLiB1bnNpZ25lZAotCWNvbXBhcmlzb24gd2FybmluZy4KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKTogUXVlbGwgc2lnbmVkCi0JdnMuIHVuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZy4KLQkoYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2MpOiBTYW1lIGhlcmUuICBGaXggcGFyZW50aGVzZXMgdG9vLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENvcnJlY3QgMjAwMC0wMS0yNwotCWNoYW5nZS4gIFdoYXQgd2FzIEkgdGhpbmtpbmc/Ci0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3N3ZWVwKTogU2tpcCBub24tZWxmIGlucHV0IGJmZHMuCi0JKGVsZl9nY19zZWN0aW9ucyk6IFNhbWUgaGVyZS4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEFuZCBoZXJlLgotCi0yMDAwLTAyLTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUVMRiBIUFBBIGRvZXNuJ3Qgd29yayBhdCBwcmVzZW50OyByZW1vdmUgaXQgdW50aWwgaXQgZG9lcy4KLQkqIGNvbmZpZy5iZmQ6IENvbW1lbnQgb3V0IHNldHRpbmcgdGFyZ19kZWZ2ZWMgdG8KLQliZmRfZWxmMzJfaHBwYV92ZWMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIGVsZjMyLWhwcGEubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSBlbGYzMi1ocHBhLmMuCi0JKFNPVVJDRV9IRklMRVMpOiBSZW1vdmUgZWxmMzItaHBwYS5oIGFuZCBocHBhX3N0dWJzLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBDb21tZW50IG91dCBiZmRfZWxmMzJfaHBwYV92ZWMuCi0KLTIwMDAtMDItMTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBVc2UgZnJlZSgpLCBiZWNhdXNlIHRoZXJlCi0JaXMgbm8gYmZkX2ZyZWUoKS4gIFJldmVydCBiZmRfZnJlZSBwYXJ0IG9mIHByZXZpb3VzIGNoYW5nZS4KLQotMjAwMC0wMi0xOCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IERvbid0IHVzZSB2YXJpYWJsZS1zaXplCi0JYXJyYXlzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBiZmRfZnJlZSB0byBwYWlyCi0JYmZkX21hbGxvYy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaG93dG9fdGFibGVfMTYpOiBOZXcgdmFyaWFibGUuCi0JKHhjb2ZmX3J0eXBlMmhvd3RvKTogSGFuZGxlIDE2LWJpdCB2YXJpYW50cyBvZiAzMi1iaXQgcmVsb2NzLgotCi0yMDAwLTAyLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29mZi1yczYwMDAuYyAoWENPRkZBUk1BR0JJRyk6IE5ldyBtYWNyby4KLQkoeGNvZmZfYXJfZmlsZV9oZHJfYmlnKTogTmV3IHN0cnVjdHVyZS4KLQkoU0laRU9GX0FSX0ZJTEVfSERSX0JJRyk6IE5ldyBtYWNyby4KLQkoeGNvZmZfYXJfaGRyX2JpZyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKFNJWkVPRl9BUl9IRFJfQklHKTogTmV3IG1hY3JvLgotCSh4Y29mZl9iaWdfZm9ybWF0X3ApOiBOZXcgbWFjcm8uCi0JKHhjb2ZmX2FyZGF0YV9iaWcpOiBOZXcgbWFjcm8uCi0JKGFyY2hfeGhkcl9iaWcpOiBOZXcgbWFjcm8uCi0JKHhjb2ZmX3NsdXJwX2FybWFwKTogSGFuZGxlIGxhcmdlIGFyY2hpdmVzLgotCSh4Y29mZl9hcmNoaXZlX3ApOiBEZXRlY3QgbGFyZ2UgYXJjaGl2ZXMuCi0JKHhjb2ZmX3JlYWRfYXJfaGRyKTogSGFuZGxlIGxhcmdlIGFyY2hpdmVzLgotCSh4Y29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpOiBIYW5kbGUgbGFyZ2UgYXJjaGl2ZXMuCi0JKHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IEhhbmRsZSBsYXJnZSBhcmNoaXZlcy4KLQkoeGNvZmZfd3JpdGVfYXJtYXBfb2xkKTogUmVuYW1lIGZyb20geGNvZmZfd3JpdGVfYXJtYXAuCi0JKHhjb2ZmX3dyaXRlX2FybWFwX2JpZyk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfd3JpdGVfYXJtYXApOiBOZXcgZnVuY3Rpb24sIGRpc3BhdGNoIHRvIF9vbGQgb3IgX2JpZy4KLQkoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50c19vbGQpOiBSZW5hbWUgZnJvbQotCXhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMuCi0JKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHNfYmlnKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLCBkaXNwYXRjaCB0byBfb2xkIG9yCi0JX2JpZy4KLQotMjAwMC0wMi0xOCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IFJlbW92ZSBjb3B5X2luZGlyZWN0Ci0JYW5kIGhpZGVfc3ltYm9sIG1lbWJlcnMuCi0JKGVsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdCk6IFJlbW92ZS4KLQkoZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbCk6IFJlbW92ZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZWxmX2JhY2tlbmRfY29weV9pbmRpcmVjdF9zeW1ib2wKLQlhbmQgZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9jb3B5X2luZGlyZWN0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX2hpZGVfc3ltYm9sKTogRGVjbGFyZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdCk6IFJlbW92ZSB0YWJsZSBhcmd1bWVudC4KLQkoX2JmZF9lbGZfbGlua19oYXNoX2hpZGVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogRG9uJ3QgaW5pdCBraWxsZWQgbWVtYmVycy4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIHRoZSBiZWQgZnVuY3Rpb24KLQlwb2ludGVycyBub3QgZWxmX2xpbmtfaGFzaF97Y29weV9pbmRpcmVjdCxoaWRlX3N5bWJvbH0uCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sKTogRGVmYXVsdC4KLQkoZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXBkYXRlIGZvciBuZXcgbWVtYmVycy4KLQotMjAwMC0wMi0xNyAgS2V2aW4gQnVldHRuZXIgIDxrZXZpbmJAcmVkaGF0LmNvbT4KLQotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9EQVRBX1NJWkVfRklFTEQsIENPUkVfQ09NTV9GSUVMRCwgU0FWRV9GSUVMRCwKLQlTVEFDS19FTkRfQUREUik6IERlZmluZSBmb3IgbmV3IGNvcmUgZmlsZSBmb3JtYXQuCi0JKExPQURFUl9PRkZTRVRfRklFTEQsIExPQURFUl9SRUdJT05fU0laRSwgQ09SRV9EVU1QKTogTmV3IGRlZmluZXMKLQlmb3IgaGFuZGxpbmcgdGhlIHZhZ2FyaWVzIG9mIHRoZSB2YXJpb3VzIGNvcmUgZmlsZSBzdHJ1Y3R1cmVzIHVzZWQKLQlieSBBSVggb3ZlciB0aGUgeWVhcnMuCi0JKHJzNjAwMGNvZmZfY29yZV9wLCByczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGUsCi0JUnM2a0NvckRhdGEpOiBVc2UgYWJvdmUgZGVmaW5lcyB0byBhZGFwdCBjb2RlIHRvIHVzZSBBSVggNC4zJ3MKLQljb3JlX2R1bXB4IHN0cnVjdHVyZS4KLQotVGh1IEZlYiAxNyAwMDowNDo0OCAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NoMiwgYmZkX21hY2hfc2hfZHNwKTogTmV3IG1hY3Jvcy4KLQkoYmZkX21hY2hfc2gzX2RzcCk6IExpa2V3aXNlLgotCShiZmRfbWFjaF9zaDQpOiBSZWluc3RhdGUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBSZWNvZ25pemUgNzQxMCwgNzcwOCwgNzcyOSBhbmQgNzc1MC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmYtc2guYyAoc3RydWN0IHNoX29wY29kZSk6IGZsYWdzIGlzIG5vIGxvbmdlciBzaG9ydC4KLQkoVVNFU0FTLCBVU0VTQVNfUkVHLCBVU0VTUjgsIFNFVFNBUywgU0VUU0FTX1JFRyk6IE5ldyBtYWNyb3MuCi0JKHNoX29wY29kZTQxLCBzaF9vcGNvZGU0Mik6IEludGVncmF0ZSBhcyBzaF9vcGNvZGU0MS4KLQkoc2hfb3Bjb2RlMDEsIHNoX29wY29kZTAyLCBzaF9vcGNvZGU0MCk6IEFkZCBzaC1kc3Agb3Bjb2Rlcy4KLQkoc2hfb3Bjb2RlNDEsIHNoX29wY29kZTQsIHNoX29wY29kZTgwKTogTGlrZXdpc2UuCi0JKHNoX29wY29kZXMpOiBObyBsb25nZXIgY29uc3QuCi0JKHNoX2RzcF9vcGNvZGVmMCwgc2hfZHNwX29wY29kZWYpOiBOZXcgYXJyYXlzLgotCShzaF9pbnNuX3VzZXNfcmVnKTogQ2hlY2sgZm9yIFVTRVNBUyBhbmQgVVNFU1I4LgotCShzaF9pbnNuX3NldHNfcmVnLCBzaF9pbnNuc19jb25mbGljdCk6IENoZWNrIGZvciBTRVRTQVMuCi0JKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogUmV0dXJuIGVhcmx5IGZvciBTSDQuCi0JTW9kaWZ5IHNoX29wY29kZXMgbG9va3VwIHRhYmxlIGZvciBzaC1kc3AgLyBzaDMtZHNwLgotCVRha2UgaW50byBhY2NvdW50IHRoYXQgZmllbGQgYiBvZiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbgotCWNvdWxkIGJlIG1pc3Rha2VuIGZvciBhIHNlcGFyYXRlIGluc24uCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBhcnJheSBlbGVtZW50cyBmb3IKLQlzaDIsIHNoLWRzcCBhbmQgc2gzLWRzcC4KLQlSZWluc3RhdGUgZWxlbWVudCBmb3Igc2g0LgotCShTSDJfTkVYVCwgU0hfRFNQX05FWFQsIFNIM19EU1BfTkVYVCk6IE5ldyBtYWNyb3MuCi0JKFNINF9ORVhUKTogUmVpbnN0YXRlLgotCShTSDNfTkVYVCwgU0gzRV9ORVhUKTogQWRqdXN0LgotCSogZWxmLWJmZC5oIChfc2hfZWxmX3NldF9tYWNoX2Zyb21fZmxhZ3MpOiBEZWNsYXJlLgotCSogZWxmMzItc2guYyAoc2hfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IGZ1bmN0aW9uLgotCShzaF9lbGZfY29weV9wcml2YXRlX2RhdGEsIHNoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzKTogTGlrZXdpc2UuCi0JKHNoX2VsZl9tZXJnZV9wcml2YXRlX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wLCBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2JmZF9mbGFncyk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB0bwotCXNoX2VsZl9tZXJnZV9wcml2YXRlX2RhdGEuCi0KLTIwMDAtMDItMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgY29weV9pbmRpcmVjdCBhbmQKLQloaWRlX3N5bWJvbCBtZW1iZXJzLgotCShlbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QpOiBOZXcuCi0JKGVsZl9saW5rX2hhc2hfaGlkZV9zeW1ib2wpOiBOZXcuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEJyZWFrIG91dCBjb3B5IGZyb20gCi0JaW5kaXJlY3QgbmV3IG5ldyBzeW1ib2wgdG8gZWxmLmMuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IEJyZWFrIG91dCBwcml2YXRpemF0aW9uIG9mCi0Jbm9uLWV4cG9ydGVkIHN5bWJvbCB0byBlbGYuYy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdCk6IE5ldy4KLQkoX2JmZF9lbGZfbGlua19oYXNoX2hpZGVfc3ltYm9sKTogTmV3LgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXQgY29weV9pbmRpcmVjdCBhbmQgaGlkZV9zeW1ib2wuCi0KLTIwMDAtMDItMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IEFkZCBpbmZvIHBhcmFtZXRlci4KLQlJZiBpdCBwYXNzZWQgYXMgbm9uLU5VTEwsIHVzZSBpdCB0byBjaGVjayB3aGV0aGVyIGFueSBpbnB1dCBCRkQKLQloYXMgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCB1c2VzIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogYmZkLWluLmg6IE1vdmUgZGVjbGFyYXRpb25zIG9mIGJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2dldF9lbGZfcGhkcnMgaW4gZnJvbSBiZmQtaW4yLmgsIGNvcnJlY3RpbmcgcGF0Y2ggb2YKLQkxOTk5LTExLTI5LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0yMDAwLTAyLTEwICBUaW1vdGh5IFdhbGwgIDx0d2FsbEBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc3ltX2luKTogQWRkIGhvb2sgU1dBUF9TWU1fSU5fUE9TVCB0bwotCWFsbG93IGZpbmFsIG1vZGlmaWNhdGlvbnMgb2Ygc3dhcHBlZC1pbiBzeW1ib2wuCi0JKGNvZmZfc3dhcF9zeW1fb3V0KTogRGl0dG8gd2l0aCBTV0FQX1NZTV9PVVRfUE9TVC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogVXNlIG1hY3JvCi0JU0VDVElPTl9SRUxBVElWRV9BQlNPTFVURV9TWU1CT0xfUCBpZiBkZWZpbmVkIHRvIGRldGVybWluZSB3aGV0aGVyCi0Jc3ltYm9sIGluZGV4IHNob3VsZCBiZSBzZXQgdG8gLTEuCi0KLVRodSBGZWIgMTAgMjA6MDc6NTAgR01UIDIwMDAgIFRvc2hpeWFzdSBNb3JpdGEgKHRvc2hpLm1vcml0YUBzZWdhLmNvbSkKLQotCSogY29mZi1zaC5jIChVU0VTMV9SRUcsIFVTRVMyX1JFRywgU0VUUzFfUkVHLCBTRVRTMl9SRUcsCi0JVVNFU0YxX1JFRywgVVNFU0YyX1JFRywgU0VUU0YxX1JFRywgU0VUU0YyX1JFRyk6IE5ldyBtYWNyb3MuCi0JKiAoc2hfaW5zbl9zZXRzX3JlZywgc2hfaW5zbl9zZXRzX2ZyZWcpOiBOZXcgcHJvdG90eXBlcy4KLQkqIChzaF9pbnNuX3NldHNfcmVnLCBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcsIHNoX2luc25zX3NldHNfZnJlZywKLQlzaF9pbnNuc191c2VzX29yX3NldHNfZnJlZyk6IE5ldyBmdW5jdGlvbnMuCi0JKiAoc2hfaW5zbl91c2VzX3JlZywgc2hfaW5zbl91c2VzX2ZyZWcpOiBVc2UgbmV3IG1hY3Jvcy4KLQkqIChzaF9pbnNuc19jb25mbGljdCk6IFVzZSBuZXcgZnVuY3Rpb25zIGFuZCBuZXcgbWFjcm9zIHRvIAotCWRldGVjdCBjb25mbGljdHMgd2hlbiB0d28gaW5zdHJ1Y3Rpb25zIGJvdGggc2V0IHNhbWUgaW50ZWdlciByZWdpc3RlcnMsCi0JYm90aCBzZXQgc2FtZSBmcCByZWdpc3RlciwgYW5kIGJvdGggc2V0IHNwZWNpYWwgcmVnaXN0ZXIuCi0KLTIwMDAtMDItMDkgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IGFyY2gvbWFjaCBpbmZvIHByaW9yIHRvCi0Jc3dhcHBpbmcgaW4gc2VjdGlvbnMsIHNvIHRoYXQgdGhlIHN3YXBwaW5nIHJvdXRpbmVzIGhhdmUgYWNjZXNzIHRvCi0JdGhlIGFyY2gvbWFjaCBpbmZvLgotCi0yMDAwLTAyLTA4IE1hcmsgRWxicmVjaHQgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQkKLQkqIGNvZmYtZ28zMi5jOiBVcGRhdGUgY29tbWVudC4gVXBkYXRlIGNvcHlyaWdodC4KLQotMjAwMC0wMS0yNyAgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd2luZHJpdmVyLmNvbT4KLQotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKQotCVR3byBuZXcgY2xhc3MgY2hhcmFjdGVycyB3ZXJlIGFkZGVkIC0gJ1YnIGFuZCAndicuICBUaGUKLQltZWFuaW5nIG9mICdXJyBpcyBub3cgcmVzdHJpY3RlZCB0byBqdXN0IHdlYWsgbm9uLW9iamVjdAotCXN5bWJvbHMuICBUaGlzIGFsbG93cyBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiwgZm9yIGV4YW1wbGUsCi0Jd2VhayBmdW5jdGlvbnMgdnMgd2VhayBvYmplY3RzLiAgbm0gZm9yIGV4YW1wbGUgbm93IGR1bXBzOgotCSdXJyA9IHdlYWsgZ2xvYmFsCi0JJ3cnID0gd2VhayB1bnJlc29sdmVkCi0JJ1YnID0gd2VhayBnbG9iYWwgb2JqZWN0Ci0JJ3YnID0gd2VhayB1bnJlc29sdmVkIG9iamVjdAotCi0JKGJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm4gdHJ1ZSBpZiB0aGUKLQlnaXZlbiBzeW1ib2wgY2xhc3MgcmVwcmVzZW50cyBhbmQgdW5kZWZpbmVkL3VucmVzb2x2ZWQgc3ltYm9sLgotCQotCShiZmRfc3ltYm9sX2luZm8pOiBVc2UgYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyB0byBjaGVjayBmb3IKLQl1bnJlc29sdmVkIHN5bWJvbHMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIHByb3RvdHlwZSBmb3IgYmZkX2lzX3VuZGVmaW5lZF9zeW1ib2woKS4KLQkKLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlKTogSWYgYSBzeW1ib2wgaGFzIHRoZQotCVNUVF9BUk1fMTZCSVQgZmxhZyBzZXQsIGJ1dCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBkYXRhIG9iamVjdAotCXJldHVybiBTVFRfQVJNXzE2QklUIHNvIHRoYXQgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGNvZGUgYnkgdGhlCi0JZGlzYXNzZW1ibGVyLgotCi0yMDAwLTAxLTI3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgcHJvdG90eXBlLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBBZGQgY29uc3QKLQl0byBuYW1lLiAgVXBkYXRlIGNvcHlyaWdodC4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhc3QgY29yZV9yZWdzZWMKLQlhc3NpZ25tZW50IHRvIGF2b2lkIHdhcm5pbmcuICBVcGRhdGUgY29weXJpZ2h0LgotCi0yMDAwLTAxLTI0ICBSb2JlcnQgTGlwZSAgKHJvYmVydGxAc2NvLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBHZXQgYnVmZiB2aWEgYmZkX21hbGxvYwotCWluc3RlYWQgb2YgdXNpbmcgR05VIEMgZXh0ZW5zaW9uLgotCi0yMDAwLTAxLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQpOiBEbyBub3QgYXR0ZW1wdCB0byBnZXQgYSBuZWdhdGl2bHkgc2l6ZWQKLQlhbW91bnQgZnJvbSBhIGJmZF9pbl9tZW1vcnkgc3RydWN0dXJlLgotCShiZmRfc2Vlayk6IERvIG5vdCBhbGxvdyBzZWVrcyBwYXN0IHRoZSBlbmQgb2YgYSBiZmRfaW5fbWVtb3J5Ci0Jc3RydWN0dXJlLgotCi0yMDAwLTAxLTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogb29wcyAtIGZpeCBpbmNvcnJlY3RseQotCWFwcGxpZWQgcGF0Y2ggZnJvbSBUaW0gV2FsbC4KLQotMjAwMC0wMS0xMyAgVGltb3RoeSBXYWxsICh0d2FsbEB0aWFjLm5ldD4KLQotCSogY29mZmNvZGUuaDogVXNlIGJmZF9jb2ZmX3h4eCBpbnN0ZWFkIG9mIHRoZSBtYWNybyBYWFggKHdoZXJlIHh4eAotCT0gc2NuaHN6LCBmaWxoc3osIHJlbHN6LCBhb3V0c3osIGV0YykKLQotCSAqIGNvZmZzd2FwLmg6IERpdHRvLgotCQotMjAwMC0wMS0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogRml4IG9mZnNldCBpbiBicmFuY2ggdG8KLQlpbnRlcndvcmsgdGh1bWIgdG8gYXJtIHN0dWIuCi0KLTIwMDAtMDEtMTMgIFRpbW90aHkgV2FsbCAodHdhbGxAdGlhYy5uZXQ+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9vY3RldHNfcGVyX2J5dGUpOiBOZXcgZnVuY3Rpb246IFJldHVybgotCXRhcmdldCBieXRlIHNpemUuCi0JKGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlKTogTmV3IGZ1bmN0aW9uOiBSZXR1cm4gdGFyZ2V0Ci0JYnl0ZSBzaXplLgotCi0JKiBzZWN0aW9uLmM6IERpc3Rpbmd1aXNoIGJldHdlZW4gb2N0ZXRzIGFuZCBieXRlcyBmb3IgdXNhZ2Ugb2YKLQlfY29va2VkX3NpemUsICBfcmF3X3NpemUsIGFuZCBvdXRwdXRfb2Zmc2V0LiAgQ2xhcmlmeQotCWRlc2NyaXB0aW9uIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0JKiBjb2ZmZ2VuLmM6IEluZGljYXRlIHRoYXQgdGhlIG9mZnNldCBwYXJhbWV0ZXIgaXMgaW4gYnl0ZXMsIG5vdAotCW9jdGV0cy4KLQkKLQkqIGNvZmZsaW5rLmMgKGJmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGJmZF9vY3RldHNfcGVyX2J5dGUKLQl3aGVyZSBhcHByb3ByaWF0ZSB0byBnZXQgdGhlIG9jdGV0IG9mZnNldCB3aGVuIGNhbGxpbmcKLQliZmRfc2V0X3NlY3Rpb25fY29udGVudHMuCi0JKGJmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBEaXR0by4KLQkKLQkqIGxpbmtlci5jIChiZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogRGl0dG8uCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogRGl0dG8uCi0JCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogIERpc3Rpbmd1aXNoIGJldHdlZW4gb2N0ZXRzCi0JYW5kIGJ5dGVzLiAgVXNlIG9jdGV0cyB3aGVuIGluZGV4aW5nIGludG8gb2N0ZXQgZGF0YTsgdXNlIGJ5dGVzCi0Jd2hlbiBjYWxjdWxhdGluZyB0YXJnZXQgYWRkcmVzc2VzLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogRGl0dG8uCi0JCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc2VjdGlvbik6IERpdHRvLgotCQotMjAwMC0wMS0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBDaGFuZ2UgZnJvbQotCTMgdG8gMi4gIFRoaXMgYWxsb3dzIDQgYnl0ZSBzaXplZCBzZWN0aW9ucywgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvcgotCWRsbHRvb2wgdG8gYnVpbGQgZnVuY2l0b25pbmcgRExMcy4KLQotMjAwMC0wMS0xMCAgUGhpbGlwIEJsdW5kZWxsICA8cGJAZnV0dXJldHYuY29tPgotCi0JKiBjb25maWcuYmZkIChhcm0qLSotbGludXgtZ251Kik6IE1hdGNoIGluc3RlYWQgb2YgYXJtKi0qLWxpbnV4LWdudS4KLQkoYXJtKi0qLWNvbml4Kik6IE5ldyB0YXJnZXQuCi0KLTIwMDAtMDEtMTAgIEVnb3IgRHVkYSAgPGRlb0Bsb2dvcy1tLnJ1PgotCi0JKiBjb25maWcuYmZkOiBJbmNsdWRlIGVsZjMyX2kzODYgdmVjdG9yIHRvIHRhcmdldCBsaXN0IGZvciBjeWd3aW4gCi0JYW5kIG1pbmd3LgotCQotCSogY29uZmlnLmluOiBVbmRlZmluZSBIQVZFX1dJTjMyX1BTVEFUVVNfVC4KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3Igc3RydWN0dXJlIHdpbjMyX3BzdGF0dXNfdCBpbgotCTxzeXMvcHJvY2ZzLmg+Ci0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JCi0JKiBlbGYuYyAoZWxmY29yZV9ncm9rX3dpbjMycHN0YXR1cyk6IE5ldyBmdW5jdGlvbjogcHJvY2VzcwotCXdpbjMyX3BzdGF0dXNfdCBub3RlcyBpbiBlbGYgY29yZSBmaWxlLgotCShlbGZjb3JlX2dyb2tfbm90ZSk6IERldGVjdCB3aW4zMl9wc3RhdHVzIG5vdGVzLgotCi0yMDAwLTAxLTAzICBNYXJ0aW4gdi4gTG9ld2lzICA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogUHJvY2VzcyBzeW1ib2wKLQl2aXNpYmlsaXR5LgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb21iaW5lIHZpc2liaWxpdGllcy4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IEludGVycHJldCBzdF9vdGhlciBhcyB2aXNpYmlsaXR5LgotCi0xOTk5LTEyLTI5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZXhwb3J0IGFsbAotCWlmIG5vIGR5bmFtaWMgc2VjdGlvbnMgY3JlYXRlZC4KLQotMTk5OS0xMi0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9iZmRfb2JqZWN0X3ApOiBPbmx5IGRlZmluZSBmb3IgUEUgZm9ybWF0Ci0JdGFyZ2V0cy4gCi0KLTE5OTktMTItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBEZWxldGUuCi0JKGkzODZjb2ZmX3ZlYyk6IFJlcGxhY2UgcmVmZXJlbmNlIHRvIGkzY29mZl9vYmplY3RfcCB3aXRoIGEKLQlyZWZlcmVuY2UgdG8gY29mZl9vYmplY3RfcC4KLQotCSogY29mZi1tY29yZS5jIChwZV9vYmplY3RfcCk6IERlbGV0ZS4KLQotCSogcGVpY29kZS5oIChwZV9iZmRfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb246IERldGVjdCB0aGUKLQlwcmVzZW5jZSBvZiBhIFBFIGZvcm1hdCBDT0ZGIG9iamVjdCBmaWxlLiAgQWxzbyBkZXRlY3QgYW5kCi0Jd2FybiBhYm91dCB0aGUgcHJlc2VuY2Ugb2YgTElOSzYgZm9ybWF0IEltYWdlIExpYnJhcnkgRm9ybWF0Ci0Jb2JqZWN0IGZpbGVzLgotCQotMTk5OS0xMi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoTlVNX0VMRU0pOiBOZXcgbWFjcm8uCi0JKE5VTV9SRUxPQ1MpOiBOZXcgbWFjcm86IFRoZSBudW1iZXIgb2Yga25vd24gQVJNIHJlbG9jcy4KLQkoUlRZUEUySE9XVE8pOiBSZXR1cm4gTlVMTCBpZiB0aGUgcmVsb2MgdHlwZSBpcyBvdXQgb2YgcmFuZ2UuCi0JKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogIFJldHVybiBOVUxMIGlmIHRoZSByZWxvYyB0eXBlIGlzIG91dAotCW9mIHJhbmdlLgotCShiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBQcm9kdWNlIGEgd2FybmluZyBtZXNzYWdlIGlmCi0JYW4gb3V0IG9mIHJhbmdlIHN5bWJvbCBpbmRleCBpcyBlbmNvdW50ZXJlZC4KLQotMTk5OS0xMi0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChpc19nbG9iYWxfc3ltYm9sX2RlZmluaXRpb24pOiBOZXcgRnVuY3Rpb246IFJldHVybgotCXRydWUgaWZmIHRoZSBzeW1ib2wgaXMgYmVpbmcgZ2l2ZW4gYSBnbG9iYWwgZGVmaW5pdGlvbiBpbiB0aGlzCi0JYmZkLiAKLQkoZWxmX2xpbmtfaXNfZGVmaW5lZF9hcmNoaXZlX3N5bWJvbCk6IERvIG5vdCBib3RoZXIgcHJvY2Vzc2luZwotCXN5bWJvbHMgZm9yIGFuIGFyY2hpdmUgZWxlbWVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQKLQlpbiB0aGUgbGluay4KLQlVc2UgaXNfZ2xvYmFsX3N5bWJvbF9kZWZpbml0aW9uKCkuCi0JCi0xOTk5LTEyLTA5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBzcGFyYy0qLW5ldGJzZGVsZiogYW5kCi0Jc3BhcmMtKi1uZXRic2Rhb3V0Ki4KLQotMTk5OS0xMi0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sKTogQ2hlY2sgdG8gc2VlCi0JaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgY29tbW9uIHNlY3Rpb24uCi0KLTE5OTktMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaXNfZGVmaW5lZF9hcmNoaXZlX3N5bWJvbCk6IE5ldwotCWZ1bmN0aW9uOiBEZWNpZGUgaWYgYSBzeW1ib2wsIGluIGFuIGFyY2hpdmUgbWFwIGlzIHRoZXJlCi0JYmVjYXVzZSBpdCBpcyBkZWZpbmVkIGluIHRoZSBhcmNoaXZlIGVsZW1lbnQsIG9yIGJlY2F1c2UgaXQgaXMKLQlqdXN0IGFub3RoZXIgY29tbW9uIGRlY2xhcmF0aW9uIG9mIGl0LgotCShlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlCi0JZWxmX2xpbmtfaXNfZGVmaW5lZF9hcmNoaXZlX3N5bWJvbCB0byBkZWNpZGUgaWYgYW4gYXJjaGl2ZQotCWVsZW1lbnQgY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbiBzeW1ib2wgc2hvdWxkIGJlCi0JbGlua2VkIGluIG9yIG5vdC4KLQotMTk5OS0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiB0YXJnZXRzLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGxpYmJmZC1pbjIuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogbGliYmZkLmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGVsZnh4LXRhcmdldC5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBhcmNoaXZlLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGFvdXQtdGFyZ2V0Lmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGFvdXQtdGljMzAuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogYmZkLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGNvZmYtYWxwaGEuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogY29mZi1yczYwMDAuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogZWxmNjQtbWlwcy5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBpZWVlLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGxpYmVjb2ZmLmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIG9hc3lzLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIHNvbS5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiB2bXMuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCi0xOTk5LTEyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBBZGQgYW4gYXJjaGl2ZQotCWVsZW1lbnQgZXZlbiBpZiBjb250YWlucyBhIHN5bWJvbCB3aGljaCBpcyBjdXJyZW50bHkgb25seQotCWNvbnNpZGVyZWQgdG8gYmUgYSBjb21tb24uCi0KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9hbGxvd19jb21tb25zX2luX2FybWFwLgotCSogYmZkLWluMi5oOlJlZ2VuZXJhdGUuCi0KLQkqIGxpYmJmZC1pbjIuaCAoX2JmZF9ub2FyY2hpdmVfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6Ci0JRGVmaW5lLgotCSAoX2JmZF9hcmNoaXZlX2JzZF9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZnh4LXRhcmdldC5oOiBJZiB1c2luZyBDT0ZGIGFyY2hpdmUgbWFwLCBvdmVycmlkZQotCWRlZmluaXRpb24gb2YgYWxsb3dfY29tbW9uc19pbl9hcm1hcCBhbmQgcmVwbGFjZSB3aXRoCi0JYmZkX2ZhbHNlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERvIG5vdCBwbGFjZSBjb21tb24KLQlzeW1ib2xzIGludG8gdGhlIGFyY2hpdmUgbWFwIHVubGVzcyBfYmZkX2FsbG93X2NvbW1vbnNfaW5fYXJtYXAKLQlyZXR1cm5zIHRydWUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBhb3V0LXRpYzMwLmggKE1ZX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBiZmQuYyAoYmZkX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBjb2ZmLWFscGhhLmggKGFscGhhX2Vjb2ZmX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5oICh4Y29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogZWxmNjQtbWlwcy5jIChiZmRfZWxmNjRfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9lY29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIHZtcy5jICh2bXNfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQotMTk5OS0xMi0wNyAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBTU0UgcmVnaXN0ZXJzIGluIEVMRiBjb3JlIGZpbGVzLgotCSogZWxmLmMgKGVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZmNvcmVfZ3Jva19wcmZwcmVnKTogVXNlIGl0LgotCShlbGZjb3JlX2dyb2tfcHJ4ZnByZWcpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZmNvcmVfZ3Jva19ub3RlKTogUmVjb2duaXplIExpbnV4IE5UX1BSWEZQUkVHIG5vdGVzLgotCi0xOTk5LTEyLTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERpdmlkZSBSX01JUFNfUEMxNgotCXZhbHVlIGJ5IDQgYmVmb3JlIHN0b3JpbmcgaXQgYmFjayBpbiB0aGUgZmllbGQuICBGcm9tCi0JS291bmRpbnlhLiBLIDxra0BkZGVvcmcuc29mdC5uZXQ+LgotCi1UdWUgTm92IDMwIDIyOjQxOjE0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfYW0zMyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNwdS1tMTAzMDAuYyAoYmZkX2FtMzNfYXJjaCk6IEFkZCB0byB0aGUgbW4xMDMgYXJjaGl0ZWN0dXJlIGxpc3QKLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBhbTMzIGluc3RydWN0aW9ucy4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogSGFuZGxlIGFkZGl0aW9uYWwgcmVnaXN0ZXJzIHNhdmVkIGJ5Ci0JbW92bSBvbiB0aGUgYW0zMy4KLQkoZWxmX21uMTAzMDBfbWFjaCk6IEhhbmRsZSBFX01OMTAzMDBfTUFDSF9BTTMzLgotCShfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUgYmZkX21hY2hfYW0zMy4KLQotMTk5OS0xMS0yOSAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9nZXRfZWxmX3BoZHJzLCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kKTogTmV3Ci0JZnVuY3Rpb25zLgotCSogYmZkLWluMi5oIChiZmRfZ2V0X2VsZl9waGRycywgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCk6IE5ldwotCWRlY2xhcmF0aW9ucy4KLQotMTk5OS0xMS0yNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwpOiBOZXcgcmVsb2NhdGlvbiBmb3IKLQlpbnRlcm5hbCB1c2Ugd2l0aGluIGdhcyBmb3IgYWxwaGEgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYpOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUik6IERpdHRvLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1ApOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XKTogRGl0dG8uCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jX21hcCk6IEFkZCBtYXBwaW5ncyBmb3IKLQlCRkRfUkVMT0NfQUxQSEFfVVNFUl8qLgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0xMS0yNiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZjb3JlX3JlYWRfbm90ZXMpOiBBZGQgcHJvdG90eXBlIGZvciBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW5hbWVkIGZyb20gYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZXBsYWNlbWVudCBmdW5jdGlvbiB0aGF0IGNhbGxzCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciBmb3IgZ2VuZXJpYyBzZWdtZW50IHR5cGVzIGFuZAotCWJhY2tlbmQgZnVjbnRpb24gcG9pbnRlZCB0byBieSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkciBmb3IKLQliYWNrZW5kIHNwZWNpZmljIHNlZ21lbnQgdHlwZXMuCi0JKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBjYWxsIHRvIGVsZmNvcmVfcmVhZF9ub3RlcywKLQlub3cgY2FsbGVkIGJ5IF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIuICBOb3RlIHRoYXQgdGhpcyBmdW5jCi0JaXMgbm93IGp1c3QgYSBzdHViIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZnVuY3Rpb24gcG9pbnRlcgotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWZpbmUgZGVmYXVsdC4KLQkoZWxmTk5fYmVkKTogQWRkIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCi0xOTk5LTExLTI1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6ICBBZGQKLQlTRUNfQ09ERSBhbmQgU0VDX1JFQURPTkxZIGZsYWdzIHRvIGdsdWUgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IEFkZAotCVNFQ19DT0RFIGFuZCBTRUNfUkVBRE9OTFkgZmxhZ3MgdG8gZ2x1ZSBzZWN0aW9ucy4KLQotMTk5OS0xMS0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBwcmV2aW91cwotCWRlbHRhLiAKLQotMTk5OS0xMS0xOSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBGaXggZW5jb2RpbmcuCi0JKGVsZl9jcHUzMl9wbHRfZW50cnkpOiBMaWtld2lzZS4KLQotMTk5OS0xMS0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nCi0JZm9yIFJWQSByZWxvY3MuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpc2UgYWRkZW5kIHRvIDAuCi0JU3BlY2lhbCBjYXNlIHByb2Nlc3Npbmcgb2YgUlZBIHJlbG9jLgotCi0xOTk5LTExLTE3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVvcmRlciBjb2xsZWN0IGFuZAotCXR5cGVfY2hhbmdlX29rOyBhZGQgc2lnbl9leHRlbmRfdm1hLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEpOiBEZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3N5bWJvbF9pbik6IE1pbmQgYmUtPnNpZ25fZXh0ZW5kX3ZtYS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSk6IERlZmF1bHQuCi0JKGVsZk5OX2JlZCk6IEZvbGxvdyBzdHJ1dHVyZSBjaGFuZ2VzLgotCi0xOTk5LTExLTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9yZWFkKTogQ2hlY2sgcmVzdWx0IG9mIHJlYWQgYWdhaW5zdCBkZXNpcmVkIHJlc3VsdAotCXVzaW5nICE9LCBub3QgPC4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IGJmZF9lcnJvciBpZiB0aGUgc2VlayBpcwotCWludmFsaWQgY29tcGFyZWQgdG8gdGhlIHNlY3Rpb24gc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcmlnaHQgaWYgdGhlcmUgaXMgbm8gZGF0YSBwYXJ0LgotCi1UdWUgTm92ICAyIDAxOjQ0OjQxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogSW1wcm92ZSBoYW5kbGluZyBvZiBSX0FVWF9VTldJTkQsCi0JUl9MSU5FVEFCLCBSX0xJTkVUQUJfRVNDLCBhbmQgUl9DT01NRU5ULgotCi0xOTk5LTEwLTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYWtlIGxhc3RfbG9jYWwgc2lnbmVkLgotCi0xOTk5LTEwLTI3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBNYWtlIHN1cmUgLnN0YWJzdHIgc2VjdGlvbgotCXN0YXJ0cyB3aXRoIGEgemVyby4KLQotU2F0IE9jdCAyMyAxNzozNjoxMiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBkZWZpbml0aW9ucyBiZmRfbWFjaF9kMTB2LCBiZmRfbWFjaF9kMTB2X3RzMiBhbmQKLQliZmRfbWFjaF9kMTB2X3RzMy4KLQkqIGNwdS1kMTB2LmMgKGQxMHZfdHMzX2luZm8sIGQxMHZfdHMyX2luZm8pOiBBZGQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JCi0xOTk5LTEwLTE1ICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYxLmMgKHBhcnNlX2RpZSk6IEZhaWwgdG8gcGFyc2UgYSBkaWUgaWYgaXRzIGxlbmd0aCBpcyB6ZXJvLgotCi1TdW4gT2N0IDE3IDE3OjE5OjAwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChiZmRfaHBwYV9pbnNuMmZtdCk6IENoYW5nZSB0byByZXR1cm4gYW4gaW50LgotCi0xOTk5LTEwLTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgd2VhayBzeW1ib2wgd2l0aAotCWEgZGVmaW5lZCBzeW1ib2wgaW4gYSBzaGFyZWQgbGlicmFyeSwgY2xlYXIgdGhlIERFRl9EWU5BTUlDIGZsYWcKLQl0b28uCi0KLUZyaSBPY3QgIDggMTM6MDM6NDUgMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogUl9NSVBTX0xJVEVSQUwKLQlyZWxvY3MgYWxzbyBuZWVkIHRoZSBHUCB2YWx1ZS4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHVucGFpcmVkIExPMTYgcmVsb2NzCi0JcHJvcGVybHkuICBIYW5kbGUgc2lnbi1leHRlbnNpb24gZm9yIFJfTUlQU182NCBjb3JyZWN0bHkuICBDb3JyZWN0Ci0JdGhlIEdQIHZhbHVlIGZvciBSX01JUFNfTElURVJBTCByZWxvY3MgdG9vLiAgSGFuZGxlCi0JUl9NSVBTXzY0IHJlbG9jcyBwcm9wZXJseSBvbiBiaWctZW5kaWFuIE1JUFMuCi0JKG1pcHNfZWxmX3NpZ25fZXh0ZW5kKTogQmVoYXZlIHByb3Blcmx5IHdpdGggJ2xvbmcgbG9uZycuCi0JKG1pcHNfZWxmX2hpZ2hlc3QpOiBDb3JyZWN0IHR5cG8uCi0KLU1vbiBPY3QgIDQgMTc6NDk6NDUgMTk5OSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LW0zMnIuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShiZmRfbTMycl9hcmNoKTogUmVmZXIgdG8gaXQuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogUmVjb2duaXplIEVfTTMyUlhfQVJDSC4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlIGJmZF9tYWNoX20zMnJ4LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTMycngpOiBEZWZpbmUgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMjggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGNpc2NvX2NvcmVfdmVjKTogUmVwbGFjZWQgd2l0aCB0d28gbmV3IHZlY3MgLi4uCi0JKGNpc2NvX2NvcmVfYmlnX3ZlYyk6IEFkZCBuZXcgYmlnZW5kaWFuIHZlYy4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIG5ldyBsaXR0bGUgZW5kaWFuIHZlYy4KLQotCSogY2lzY28tY29yZS5jIChDUkFTSF9JTkZPKTogRml4ZWQgb2Zmc2V0IHJlcGxhY2VkIHdpdGggLi4uCi0JKGNyYXNoX2luZm9fbG9jcyk6IEFkZCBhcnJheSBvZiBwb3NzaWJsZSBvZmZzZXRzLgotCShNQVNLX0FERFIpOiBNYXNrIHRvIGFwcGx5IHRvIGNyYXNoIGluZm8gb2Zmc2V0LgotCShjcmFzaGluZm9fZXh0ZXJuYWwpOiBBZGQgdGV4dGJhc2UsIGRhdGFiYXNlLCBic3NiYXNlIGFuZAotCXR1cm4gaW50byBhIHR5cGVkZWYuCi0JKGNpc2NvX2NvcmVfZmlsZV92YWxpZGF0ZSk6IFJlbmFtZWQgZnJvbSBjaXNjb19jb3JlX2ZpbGVfcC4KLQlNYW55IHNtYWxsIGNoYW5nZXMgdG8gYWNjb3VudCBmb3IgYWRkaXRpb25hbCBoYXJkd2FyZSB2ZXJzaW9ucy4KLQlQaWNrIGEgcmVhc29uYWJsZSBzaXplIGZvciAiLnJlZyIgc2VjdGlvbi4gIEFkZCBhICIuY3Jhc2giCi0Jc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gY3Jhc2hpbmZvX2V4dGVybmFsIHN0cnVjdC4KLQkoY2lzY29fY29yZV9maWxlX3ApOiBOZXcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIHRoYXQKLQlpdGVyYXRlcyBvdmVyIGNyYXNoX2luZm9fbG9jcywgY2FsbGluZyBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUuCi0JKGNpc2NvX2NvcmVfdmVjKTogT2xkIGJpZyBlbmRpYW4gb25seSB2ZWMgcmVwbGFjZWQgd2l0aCAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogQWRkIGJpZyBlbmRpYW4gdmVyc2lvbi4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIGxpdHRsZSBlbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlndXJlLmluIChjaXNjb19jb3JlX3ZlYyk6IFNwbGl0IHRvIHR3byBuZXcgdmVjdG9ycyAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGNpc2NvX2NvcmVfbGl0dGxlX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZCAodGFyZyk6IEZvciBtNjgqLSotYW91dCogdGFyZywgY2hhbmdlIGNpc2NvX2NvcmVfdmVjCi0JdG8gY2lzY29fY29yZV9iaWdfdmVjIGluIHRhcmdfc2VsdmVjcy4KLQotMTk5OS0wOS0yOCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYpOiBVbnVzZWQsIGRlbGV0ZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogVW51c2VkLCBkZWxldGUuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QpOiBVbnVzZWQsIGRlbGV0ZS4KLQotMTk5OS0wOS0yNCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgdHlwZW5hbWUgdmFyaWFibGUuICBVc2UgcF90eXBlCi0JdG8gaW5pdGlhbGl6ZSBpdCB0byBzb21ldGhpbmcgbWVhbmluZ2Z1bC4gIFRoZW4gdXNlIGl0IHRvIGdlbmVyYXRlCi0JbW9yZSB1c2VmdWwgc2VnbWVudCBuYW1lcy4KLQotU3VuIFNlcCAxOSAxMjoxNjo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChOT19QQ1JFTF9NT0RFUyk6IERlZmluZSBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGRlZmluZQotCVJfU0hPUlRfUENSRUxfTU9ERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgYm90aCBzaG9ydCBhbmQgbG9uZyBwY3JlbCBicmFuY2hlcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEVsaW1pbmF0ZSByZWR1bmRhbnQgcGNyZWwgbW9kZSByZWxvY3MuICBIYW5kbGUKLQlSX0xPTkdfUENSRUxfTU9ERSBhbmQgUl9TSE9SVF9QQ1JFTF9NT0RFCi0JKiBsaWJocHBhLmggKGRpc19hc3NlbWJsZV8yMik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2hwcGFfaW5zbjJmbXQpOiBIYW5kbGUgbG9uZyBicmFuY2guCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQpOiBEZWNvZGUgYW5kIGhhbmRsZSBmb3JtYXRzIGZvdW5kCi0JaW4gUEEyLjAuCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFN1cHBvcnQgQkZEX1JFTE9DXzE2LAotCUJGRF9SRUxPQ18xNl9QQ1JFTCwgQkZEX1JFTE9DXzgsIEJGRF9SRUxPQ184X1BDUkVMIHJlbG9jcy4KLQkocmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZSk6IFRpZHkgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UuCi0KLTE5OTktMDktMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IFVuZG8KLQlwcmV2aW91cyBkZWx0YS4gIFNldCBzZWMtPmdjX21hcmsgaW5zdGVhZC4KLQotVGh1IFNlcCAxNiAxMToyMToxMyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfY3B1MzJfcGx0MF9lbnRyeSk6IFVzZSBhMSBpbnN0ZWFkIG9mIGEwLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTYgMTA6NDg6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVHVybiBvbiBUUkFQTklMLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogSWYgdW5hYmxlIHRvIGZpbmQgX19ncCBpbiB0aGUKLQlzeW1ib2wgdGFibGUsIHRoZW4ganVzdCBjb21wdXRlIGEgc3VpdGFibGUgdmFsdWUgKGJ1dCBkbyBub3QKLQljcmVhdGUgYSBfX2dwIHN5bWJvbCkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBBbGxvdyB1bmRlZmluZWQKLQlzeW1ib2xzIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvcnJlY3QgaGFuZGxpbmcgb2YgUENSRUwKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IHVuZGVmaW5lZCBzeW1ib2xzLgotCi0xOTk5LTA5LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBNYXJrCi0JaW50ZXJ3b3JraW5nIHNlY3Rpb25zIGFzIGxpbmtlciBjcmVhdGVkIHNvIHRoYXQgdGhleSB3aWxsIG5vdAotCWJlIHJlbW92ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1XZWQgU2VwIDE1IDAyOjMxOjU3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGluayk6IFJldmFtcCBfX2dwIGhhbmRsaW5nLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29uc2lzdGVudGx5IGNyZWF0ZSBhbiBhYnNvbHV0ZQotCWFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoRUxGX01BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MSAoYXQgcmVxdWVzdCBvZgotCU1pdHN1YmlzaGkpLiAKLQotTW9uIFNlcCAxMyAyMDowMTo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlY29yZF9zZWdtZW50X2FkZHJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB0ZXh0X3NlZ21lbnRfYmFzZSBhbmQKLQlkYXRhX3NlZ21lbnRfYmFzZS4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBTRUdSRUwgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIEhPV1RPLgotCi0xOTk5LTA5LTEzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgQ09NREFUCi0JaGFuZGxpbmcgdG8gc3VwcG9ydCBib3RoIEdOVSBhbmQgTVMgb2JqZWN0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjaGVjayByZWxvY19jb3VudAotCXdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byBzZXQgRl9SRUxGTEcuCi0KLTE5OTktMDktMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEb24ndCByYW5nZS1jaGVjawotCVBDMjQgcmVsb2NzIGlmIHRoZSB0YXJnZXQgaXMgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCShhcm1fYWRkX3RvX3JlbCk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCShlbGYzMl9hcm1fcGx0MF9lbnRyeSk6IENvcnJlY3QgY29tbWVudHMuCi0JCi0xOTk5LTA5LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgZm9yIHRoZV9iZmQgTlVMTCB3aGVuIGhhbmRsaW5nCi0JYW4gYWJzb2x1dGUgc3ltYm9sIGluIFJFTCByZWxvY3MuCi0KLVN1biBTZXAgMTIgMjM6NDc6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFNFQ1JFTDMyLgotCVN0dWIgU0VHUkVMMzIuICBSZXR1cm4gYW4gZXJyb3IgZm9yIGFueSByZWxvY2F0aW9uIG5vdCBoYW5kbGVkLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTG9vayBmb3Igc3BlY2lhbCBNU1ZDIHN0cmluZwotCWNvbnN0YW50IHN5bWJvbHMsIGFuZCBhdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9ycyBvbiB0aGVtLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogUmV3cml0ZSB0byBhdm9pZCBpbmZpbml0ZSBsb29wIGlmIG1vc3QKLQlzaWduaWZpY2FudCBiaXQgaXMgc2V0LgotCi0xOTk5LTA5LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1wcGMuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gUkVMCi0JcmVsb2NzIGFzIHdlIGRvIGZvciBSRUxBIHJlbG9jcy4KLQotMTk5OS0wOS0xMSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxpYnBlaS5oIChfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBEZWNsYXJlLgotCShjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IERlZmluZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0KTogRG9uJ3Qgc2V0IHZhbHVlIGZvciBkYXRhCi0JZGlyZWN0b3J5IGVudHJpZXMgaGVyZS4KLQkoX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBwZWlnZW4uYyAoX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0KTogUmVtb3ZlIGNvZGUgd2hpY2ggc2V0cwotCXNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIHNlY3Rpb24gbmFtZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCB0aGUKLQlnZXQgdGhlIG92ZXJmbG93IG9mIHRoZSBzX25sbm5vIGZpZWxkIGZyb20gdGhlIHNfbnJlbG9jIGZpZWxkLgotCSogcGVpZ2VuLmMgKF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCk6IElmIGRvaW5nIGEgZmluYWwgbGluaywgc3dhcAotCXRoZSBzX25sbm5vIG92ZXJmbG93IG9mIHRoZSAudGV4dCBzZWN0aW9uIGludG8gdGhlIHNfbnJlbG9jCi0JZmllbGQuCi0KLQkqIHBlaWdlbi5jIChhZGRfZGF0YV9lbnRyeSk6IERlY2xhcmUuCi0JKHBlaV9zd2FwX2FvdXRoZHJfb3V0KTogR2V0IGltYWdlIHNpemUgcmlnaHQuICBTZXQgbGlua2VyIHZlcnNpb24KLQltb3JlIGludHVpdGl2ZWx5LgotCShwZWlfc3dhcF9zY25oZHJfb3V0KTogVGVzdCBmb3IgVU5JTklUIHNlY3Rpb24sIG5vdCAuYnNzLgotCShwZV9wcmludF9pZGF0YSk6IENvZGUgY2xlYW51cCwgcHJpbnQgbW9yZSBpbmZvLCBnZXQgcmlkIG9mIChub3cpCi0JZXh0cmFuZW91cyBJbWFnZUJhc2UuCi0JKHBlX3ByaW50X2VkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X3BkYXRhKTogTGlrZXdpc2UuICBQcmludCBleGNlcHRpb24gZW50cmllcy4KLQkocGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4gIFByaW50IE1JUFNfSk1QQUREUi4KLQkodGJsKTogTWFrZSBjb25zdCwgYWRkICJVTktOT1dOIi4KLQkoX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IFByaW50IHRpbWVzdGFtcC4KLQkoX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IERvbid0IGNvcHkgZGVsZXRlZAotCXNlY3Rpb24gZGF0YSBkaXJlY3RvcnkuCi0JKF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHBlX2ZsYWdzLgotCi0JKiBsaWJwZWkuaCAoX2JmZF9wZV9iZmRfZ2V0X3N5bWJvbF9pbmZvKTogRGVjbGFyZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlX2JmZF9nZXRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBwZWljb2RlLmggKGNvZmZfZ2V0X3N5bWJvbF9pbmZvKTogRGVmaW5lLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1pbnRlcml4Kik6IFNldCB0YXJnX2NmbGFncyB0bwotCS1EU1RSSUNUX1BFX0ZPUk1BVC4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogQ2hlY2sgU1RSSUNUX1BFX0ZPUk1BVCByYXRoZXIKLQl0aGFuIF9fSU5URVJJWC4KLQkoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBSZS1yZXZlcnQgMTk5OS0wOC0wOCBwYXRjaCBpZgotCVNUUklDVF9QRV9GT1JNQVQuCi0KLQkqIGxpYnBlaS5oOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBwZWljb2RlLmguCi0JKiBwZWlnZW4uYzogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgcGVpY29kZS5oLgotCSogcGVpY29kZS5oOiBBIGJ1bmNoIG9mIGNvZGUgbW92ZWQgb3V0IHRvIGxpYnBlaS5oIGFuZCBwZWlnZW4uYy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHBlaWdlbi5sbyB0byBsaXN0IG9mIGZpbGVzIHJlcXVpcmVkIGZvciBlYWNoCi0JUEUgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwZWlnZW4ubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwZWlnZW4uYy4KLQkoU09VUkNFX0hGSUxFUyk6IEFkZCBsaWJwZWkuaC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IERvbid0IGNoZWNrIGZvciBhIHNwZWNpYWwKLQlzZWN0aW9uIG5hbWUgb2YgX0JTUzsgY2hlY2sgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKLQlpbnN0ZWFkLiAgRG9uJ3QgY2xlYXIgdGhlIHNfcGFkZHIgZmllbGQgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YQotCXNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCB0aW1lc3RhbXAgZmllbGQgaW4KLQljb2ZmX2RhdGFfdHlwZSB0byBmX3RpbWRhdC4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IExpa2V3aXNlLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogQ2hlY2sgdGhlIE5UIGV4ZWN1dGFibGUgbWFnaWMKLQludW1iZXIgaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBDT0ZGX1dJVEhfUEUsIHNldCBIQVNfREVCVUcKLQl0byB0aGUgcmV2ZXJzZSBvZiBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVELgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEIGlmCi0JdGhlcmUgaXMgbm8gU0VDX0RFQlVHR0lORyBzZWN0aW9uLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IEhBU19ERUJVRyB0byB0aGUgcmV2ZXJzZSBvZgotCUlNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQuCi0KLQkqIHBlLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBjb2Zmc3dhcC5oIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWFybS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWkzODYuYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1tY29yZS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLXBwYy5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBXaGVuIHdyaXRpbmcgb3V0IGEKLQlzeW1ib2wsIHN3aXRjaCBvbiB0aGUgY2xhc3Mgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIG1vZGlmeSB0aGUKLQl2YWx1ZS4gIEZvciBQRSwgZG9uJ3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiBhIENfRkNOIHN5bWJvbCBub3QgbmFtZWQKLQkuYmYuCi0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Fib3J0KTogRGVjbGFyZS4KLQkoYWJvcnQpOiBEZWZpbmUuCi0JKiBiZmQuYyAoX2JmZF9hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IERlbGV0ZSBQT1dFUlBDX0xFX1BFCi0Jc3BlY2lhbCBoYW5kbGluZy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBzeW1ib2wgaXMgc3RyaXBwZWQsCi0JZG9uJ3Qgd3JpdGUgb3V0IHRoZSBhc3NvY2lhdGVkIGxpbmUgbnVtYmVycy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBIYW5kbGUgc2VjdGlvbiBzeW1ib2wKLQlhdXggZW50cmllcy4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCBzeW1ib2wgdHlwZQotCWNoYW5nZXMgd2hlbiB0aGUgYmFzZSB0eXBlIGlzIHVua25vd24uCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBGaXggcHJpbnRpbmcgb2YgYXV4IHJlY29yZCBmb3IKLQlmdW5jdGlvbiBzeW1ib2xzLgotCi0JKiBzeW1zLmMgKEJTRl9ERUJVR0dJTkdfUkVMT0MpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFBFLCBzZXQgQlNGX0RFQlVHR0lORwotCWZvciBDX0ZDTi9DX0VGQ04gc3ltYm9scywgYW5kIHNldCBCU0ZfREVCVUdHSU5HX1JFTE9DIGZvciBzdWNoCi0Jc3ltYm9scyBuYW1lZCAuYmYuCi0JKiBjb2ZmZ2VuLmMgKGZpeHVwX3N5bWJvbF92YWx1ZSk6IFJlbG9jYXRlIGEgc3ltYm9sIHdoaWNoIGhhcwotCUJTRl9ERUJVR0dJTkdfUkVMT0Mgc2V0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWNvZmYuYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBVcGRhdGUgaW5pdGlhbGl6YXRpb24gZm9yIG5ldwotCWNvbWRhdF9pbmZvIGZpZWxkLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHNlY3Rpb24gcGFyYW1ldGVyLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotMTk5OS0wOS0xMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgdGhlIG5ldwotCV9iZmRfZmlsbm1sZW4gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAxMCAwMDozNToxNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDcmVhdGUgLm9wZCBlbnRyaWVzCi0JZm9yIEZQVFIgcmVsb2NzIGludm9sdmluZyBsb2NhbCBzeW1ib2xzLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogR2V0IHRoZSByaWdodAotCXZhbHVlIGZvciB0aGUgc3R1YiBhZGRyZXNzIGluIGEgY2FsbCB0aHJvdWdoIGEgc3R1Yi4KLQlJbnN0YWxsIHRoZSB2YWx1ZSBmb3IgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHkgaW50byB0aGUgRExUCi0JaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgcmVsb2MuICBDb3JyZWN0bHkgaGFuZGxlIEZQVFI2NCByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogQ2FsbCB0aGVtLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZml4X3N5bWJvbF9mbGFncyk6IE1vdmUgd2Vha2RlZiBoYW5kbGluZyBoZXJlLi4uCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAuLi5mcm9tIGhlcmUuCi0KLVdlZCBTZXAgIDggMTc6NTY6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9ob3d0b190YWJsZSk7IFRoZXJlIGlzIG5vIERJUjY0V1IsIERJUjY0RFIKLQlyZWxvY2F0aW9uLCByZW1vdmUgdGhlbS4gIFNFQ1JFTDY0LT5MVE9GRjE2V0YuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRPRkYqIHJlbG9jYXRpb25zLiAgSGFuZGxlCi0JRElSKiByZWxvY2F0aW9ucy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBQTFRPRkYqIHJlbG9jcy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBEUFJFTCogYW5kCi0JR1BSRUwqIHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9saW5rX2ZpbmFsX3JlbG9jYXRlKTogRml4IHR5cG9zLgotCUhhbmRsZSBMVE9GRl9UUCogcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0JQ29uc2lzdGVudGx5IGRlYWwgd2l0aCBhZGRlbmRzLiAgSGFuZGxlIERMVElORDE0RiBhbmQgRExUUkVMMTRGLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRfT0ZGX0ZQVFIqLAotCURJUjMyLCBESVI2NCBhbmQgRlBUUjY0IHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogU2V0IHRoZSB2YWx1ZSBvZiBfX2dwIHRvIHRoZSAgICAgICAgCi0JYWRkcmVzcyBvZiB0aGUgLlBBUklTQy5nbG9iYWwgc2VjdGlvbi4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExvb2t1cCBhbmQgcGFzcyB0aGUgUEE2NCBoYXNoCi0JdGFibGUgZW50cnkgZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZS4gIERvIG5vdCBnaXZlIGEgd2FybmluZwotCWZvciBhIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGhhcyBhIFBBNjQgaGFzaAotCXRhYmxlIGVudHJ5LgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogU2lnbmlmaWNhbnRseSByZXdvcmsuICBIYW5kbGUgICAKLQlETFRJTkQgcmVsb2NhdGlvbnMuICBDb21wdXRlIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgcmVsb2NhdGlvbgotCWJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZSBvZiBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogUmV2YW1wIHRvIGhhbmRsZSBqdXN0IGJpdCB0aXdpZGRsaW5nCi0JcmVsb2NhdGlvbiBzdXBwb3J0LiAgSGFuZGxlIERMVElORCByZWxvY2F0aW9uIHJlcXVlc3RzIGp1c3QgbGlrZQotCURMVFJFTCByZWxvY2F0aW9uIHJlcXVlc3RzLiAgU2ltcGxpZnkgYnJhbmNoIGhhbmRsaW5nLgotCi0xOTk5LTA5LTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENhdGNoIHByb2JsZW1zIHdpdGgKLQlub24tYWxsb2NhdGVkIHNlY3Rpb24gYXMgZG9uZSBpbiBpMzg2IHZlcnNpb24uCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVbmNvbW1lbnQgUl9QQVJJU0NfMTRGIGluIHN3aXRjaAotCXN0YXRlbWVudCBzaW5jZSB0aGlzIGlzIG5vIGtub3cgcmVsb2NhdGlvbi4KLQotVHVlIFNlcCAgNyAxNzoyNToxMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgRExUUkVMMTRGCi0JcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIERMVFJFTDE0V1IgYW5kCi0JRExUUkVMMTRXRCByZWxvY3MuICAKLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBETFRSRUwxNFIgYW5kCi0JRExUUkVMMjFMIHJlbG9jcy4gIFBhc3MgdGhlIG91dHB1dCBiZmQgdG8gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbi4KLQlQYXNzIHRoZSByZWxvY2F0ZSB0eXBlIHJhdGhlciB0aGFuIHRoZSBpbnNuIGZvcm1hdCB0bwotCWVsZl9ocHBhX3JlbG9jYXRlX2luc24uCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBNYWtlIHN3aXRjaCBkZXBlbmRlbnQgb24gcmVsb2NhdGlvbiB0eXBlCi0JcmF0aGVyIHRoYW4gdGhlIG9wY29kZS4gIEhhbmRsZSBETFRSRUwyMUwgYW5kIERMVFJFTDE0UiByZWxvY3MuCi0KLTE5OTktMDktMDcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9maWxubWxlbiBmaWVsZC4KLQkoYmZkX2NvZmZfZmlsbm1sZW4pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogVXNlIGJmZF9jb2ZmX2ZpbG5tbGVuIHJhdGhlcgotCXRoYW4gRklMTk1MRU4uCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb2ZmY29kZS5oIChzb3J0X2J5X3NlY2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc29ydAotCXNlY3Rpb25zIGJ5IFZNQSB3aGVuIGFzc2lnbmluZyB0YXJnZXRfaW5kZXggdmFsdWVzLiAgQWx3YXlzIHNldAotCXZpcnRfc2l6ZS4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBBZGQgcGVfZmxhZ3MgZmllbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaykgW0NPRkZfV0lUSF9QRSB2ZXJzaW9uXTogU2V0Ci0JcGVfZmxhZ3MgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCk6IEFkZCBjb25zdCB0bwotCWRlY2xhcmF0aW9uIHRvIG1hdGNoIGRlZmluaXRpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IEZfQVIzMlcoUik/IGlmCi0JQ09GRl9XSVRIX1BFLgotCi0JKiBjb2ZmLWkzODYuYyAoaW5fcmVsb2NfcCk6IEFkZCBkZWNsYXJhdGlvbi4KLQkoaTM4NmNvZmZfdmVjKTogU2ltcGxpZnkgaW5pdGlhbGl6YXRpb24gb2YKLQlhcHBsaWNhdGlvbl9zZWN0aW9uX2ZsYWdzLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFdyaXRlIHNlcGFyYXRlIENPRkZfV0lUSF9QRQotCXZlcnNpb24uICBNb3ZlIENPRkZfV0lUSF9QRSBzcGVjaWZpYyBjb2RlIHRvIG5ldyB2ZXJzaW9uLgotCShzdHlwZV90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4gIEFkZCBzZWN0aW9uIHBhcmFtZXRlci4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IHRhcmdldF9pbmRleCBiZWZvcmUKLQljYWxsaW5nIHN0eXBfdG9fc2VjX2ZsYWdzLiAgUGFzcyBzZWN0aW9uIHRvIHN0eXBfdG9fc2VjX2ZsYWdzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCBzb21lIFBFL1BFSSBzZWN0aW9uIG5hbWVzLgotCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogUmV0dXJuICd3Jywgbm90ICdVJywgZm9yIGEgd2VhayB1bmRlZmluZWQKLQlzeW1ib2wuCi0JKGJmZF9zeW1ib2xfaW5mbyk6IENoZWNrIGZvciAndycuCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IGJmZF9jb21kYXRfaW5mbyk6IERlZmluZS4KLQkoYXNlY3Rpb24pOiBBZGQgY29tZGF0IGZpZWxkLgotCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgY29tZGF0IGZpZWxkLgotCShiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvcHkgTk9OX0dPVF9SRUYgZmxhZwotCXRvIHZlcnNpb24gc3ltYm9scy4KLQotMTk5OS0wOS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBVc2UgYmZkX3ptYWxsb2MgYW5kCi0JYmZkX3JlYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MgYW5kIHJlYWxsb2MuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY3B1LXBqLmM6IE5ldyBmaWxlLgotCSogZWxmMzItcGouYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChwaiopOiBOZXcgY3B1LgotCShwai0qLSosIHBqbC0qLSopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3BqX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfZWxmMzJfcGpsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfcGopOiBEZWZpbmUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX3BqLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19QSl8qIHJlbG9jYXRpb25zLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfcGpfdmVjLCBiZmRfZWxmMzJfcGpsX3ZlYyk6IERlY2xhcmUgYW5kIGFkZAotCXRvIHRhcmdldCB2ZWN0b3IgbGlzdC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1wai5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtcGouYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItcGoubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1wai5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotMTk5OS0wOS0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfTk9OX0dPVF9SRUYpOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDb3B5IFJFRl9SRUdVTEFSX05PTldFQUsKLQlhbmQgTk9OX0dPVF9SRUYgZnJvbSB3ZWFrIGRlZmluZWQgc3ltYm9sIHRvIHJlYWwgc3ltYm9sLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBTZXQgTk9OX0dPVF9SRUYuCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIE5PTl9HT1RfUkVGIGlzIG5vdCBzZXQsIGRvbid0Ci0JY3JlYXRlIGEgQ09QWSByZWxvYy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IFNldCBOT05fR09UX1JFRi4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgTk9OX0dPVF9SRUYgaXMgbm90IHNldCwKLQlkb24ndCBjcmVhdGUgYSBDT1BZIHJlbG9jLgotCi0xOTk5LTA5LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGNvdW50aW5nIHJlbG9jYXRpb25zLCBkb24ndAotCWNvdW50IHRob3NlIGluIHNlY3Rpb25zIHdlIGFyZSBub3QgaW5jbHVkaW5nIGluIHRoZSBsaW5rLgotCi1UaHUgU2VwICAyIDE3OjQxOjIwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXb3JrIGFyb3VuZCBib2d1cyBTSF9MSU5LCi0JZmllbGQgaW4gaHB1eDExIHNoYXJlZCBsaWJyYXJpZXMuCi0KLTE5OTktMDktMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3JlY29yZF92dGVudHJ5KTogRml4IG1lbW9yeSBsZWFrLgotCi1XZWQgU2VwICAxIDEzOjM0OjI5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfYWRkX3N5bWJvbF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaHBwYV9maW5hbF9saW5rLCBlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBMaWtld2lzZS4KLQotMTk5OS0wOC0zMSAgQWxleGFuZHJlIFBldGl0LUJpYW5jbyAgPGFwYmlhbmNvQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAocmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IFdoZW4gcG9zc2libGUsIGtlZXAgdGhlCi0Jb3JpZ2luYWwgdHlwZSBvZiB0aGUgc3ltYm9sLgotCi1Nb24gQXVnIDMwIDE1OjI2OjQ4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEFsbG93IGJvdGgKLQlSX1BBUklTQ19ESVIzMiBhbmQgUl9QQVJJU0NfRElSNjQgcmVnYXJkbGVzcyBvZiBob3cgdGhlCi0JdG9vbHMgd2VyZSBjb25maWd1cmVkLgotCSogZWxmMzItaHBwYS5oIChfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBEZWNsYXJlLgotCi0xOTk5LTA4LTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgYWxsb2NhdGUgbG9jYWwKLQlHT1QgZW50cmllcyBmb3IgR09UMTYgcmVsb2NhdGlvbnM7IHRoZXkncmUgbm90IHJlcXVpcmVkLgotCi0xOTk5LTA4LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JRnJvbSBhIHBhdGNoIHN1Ym1pdHRlZCBieSBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBiYWFscGVyYXppbS5mcm9iLmNvbT4KLQotCSogY29uZmlnLmJmZCAoYXJtLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGFybW5ldGJzZF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCAmYXJtbmV0YnNkX3ZlYy4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFybW5ldGJzZC5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBhcm1uZXRic2QuYy4KLQkoYXJtbmV0YnNkLmxvKTogTmV3IHJ1bGUgd2l0aCBkZXBzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JCi0JKiBhcm1uZXRic2QuYzogTmV3IGZpbGU6ICBEZWZpbml0aW9ucyBzcGVjaWZpYyB0byBhcm0tbmV0YnNkCi0JdGFyZ2V0LiAKLQotVHVlIEF1ZyAyNCAwMDoyNTo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRml4IHR5cG8gaW4gY29tbWVudC4KLQotRnJpIEF1ZyAyMCAxNzowMToyMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMpOiBDb21wdXRlIHNlY3Rpb24gaW5kaWNlcwotCWhlcmUgaW5zdGVhZCBvZiB1c2luZyBlbGZfc2VjdGlvbl9kYXRhLi4uCi0KLTE5OTktMDgtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAobWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkpOiBOZXcgZnVuY3Rpb246ICBFbWl0Ci0JcmVsb2NhdGlvbnMgaW50byB0aGUgYmFzZSBmaWxlLgotCShjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsIG1jb3JlX2VtaXRfYmFzZV9maWxlX2VudHJ5IGlmCi0Jd2UgYXJlIGJ1aWxkaW5nIGEgYmFzZSBmaWxlLgotCi0xOTk5LTA4LTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoYXJtX2FkZF90b19yZWwpOiBOZXcgZnVuY3Rpb24uICBBZGQgYSB2YWx1ZSB0bwotCWEgUkVMIHN0eWxlIHJlbG9jLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBhcm1fYWRkX3RvX3JlbCB0byBpbmNyZW1lbnQKLQlSRUwgcmVsb2NzIHdoZW4gcGVyZm9ybWluZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4KLQotMTk5OS0wOC0xOCAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGNvZmZsaW5rLmM6IE1vdmUgZGVmaW5pdGlvbnMgb2YgTl9UTUFTSywgZXQuIGFsLiwgb3V0IG9mCi0JX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIGludG8gdG9wIGxldmVsLgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogSGFuZGxlIFJfSU1BR0VCQVNFLgotCShSVFlQRTJIT1dUTyk6IFJldHVybiBOVUxMIGlmIHJlbG9jIHR5cGUgaXMgb3V0IG9mIHJhbmdlLgotCShjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlIGEgLTIgdG8gTl9ERUJVRy4KLQlDb21wbGV0ZWx5IGlnbm9yZSBzeW1ib2xzIHdoaWNoIGFyZSBhbGwgemVyby4KLQkoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IEFkZCByZXR1cm4gMC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFJlbmFtZSBpbm5lciBzY29wZQotCXZhcmlhYmxlIGNvcHkgdG8gbmFtZV9jb3B5IHRvIGF2b2lkIHNoYWRvd2luZyBvdXRlciBzY29wZQotCXZhcmlhYmxlLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSByYXdfc3ltZW50X2NvdW50IGZpZWxkCi0JZnJvbSB1bnNpZ25lZCBpbnQgdG8gdW5zaWduZWQgbG9uZy4gIEFkZCB0aW1lc3RhbXAgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLTE5OTktMDgtMTcgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmMzItaHBwYS5jIChiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBGaXggdHlwbyBpbgotCW1hY3JvIGRlZmluaXRpb24uCi0KLTE5OTktMDgtMTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogU2V0IEJTRl9EWU5BTUlDCi0JZm9yIHNwZWNpYWwgc2VjdGlvbiBzeW1ib2xzLgotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogSWYgd2UgaGF2ZSBubyBvbGQgQkZELCBjaGVjawotCUJTRl9EWU5BTUlDIG9uIHRoZSBzZWN0aW9uIHN5bWJvbCB0byBzZWUgd2hldGhlciB0aGUgb2xkIEJGRCBpcwotCWR5bmFtaWMuCi0KLTE5OTktMDgtMTUgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBGaXggdW5mb3J0dW5hdGUKLQljb2luY2lkZW5jZSBvZiB2YXJpYWJsZSBuYW1lcyBiZXR3ZWVuIG9sZCBhbmQgbmV3IGNvZGUuCi0KLTE5OTktMDgtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fdG9fdGh1bWJfc3R1Yik6ICBNYWtlICdvZmZzZXQnIHBhcmFtZXRlcgotCWludG8gYSBiZmRfdm1hIGFuZCAnYWRkZW5kJyBwYXJhbWV0ZXIgYSAnYmZkX3NpZ25lZF92bWEnLgotCShlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6ICBNYWtlICdvZmZzZXQnIHBhcmFtZXRlciBpbnRvIGEgYmZkX3ZtYQotCWFuZCAnYWRkZW5kJyBwYXJhbWV0ZXIgYSAnYmZkX3NpZ25lZF92bWEnLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IERvIG5vdCBpbnZvbHZlIHN0dWJzIGluCi0JUl9BUk1fVEhNX1BDMjIgcmVsb2NzIHJlbGF0aXZlIHRvIHNlY3Rpb24gc3ltYm9scywgdGhleSBhcmUgbG9uZwotCWp1bXBzLCBub3QgZnVuY3Rpb24gY2FsbHMuCi0KLTE5OTktMDgtMTEgIFJvYmluIEZhcmluZSA8YWR2YW5jQGRpYWwuZXVuZXQuY2g+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IENoZWNrIGZvciBvdmVyZmxvdwotCWluIFJfQVJNX1BDMjQgcmVsb2NzLgotCi1UdWUgQXVnIDEwIDEyOjQ4OjA5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmFrZV9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IERlZmluZS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVwZGF0ZSBmb3IKLQlyZWNlbnQgY2hhbmdlcyB0byB0aGUgYXJjaF9pbmZvIHN0cnVjdHVyZS4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZQotCVJfSFBQQV9TRUdCQVNFIGFuZCBSX0hQUEFfU0VHUkVMMzIuCi0JKiBjcHUtaHBwYS5jIChiZmRfaHBwYTIwd19hcmNoKTogTmV3IGVudHJ5IGluIGFyY2hpdGVjdHVyZSBpbmZvCi0JbGlzdC4KLQotVHVlIEF1ZyAxMCAwMDozNDoyOSAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCSAgICAgICAgICAgICAgICAgIFJhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFsd2F5cwotCW91dHB1dCBEVF9NSVBTX0dPVFNZTS4KLQkoX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSB0aGUgc2FtZSB2YWx1ZSBhcwotCURUX01JUFNfU1lNVEFCTk8gaWYgdGhlcmUgYXJlIG5vIGdsb2JhbCBHT1Qgc3ltYm9scy4KLQotVHVlIEF1ZyAxMCAwMDoyMTowOCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24pOiBDaGFuZ2UKLQlwcm90b3R5cGUuICBIYW5kbGUgbG9jYWwgc3ltYm9scy4gIEFkZCBjb21tZW50YXJ5LgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgbG9jYWwgc3ltYm9scyBpbiBSX01JUFNfMzIKLQlyZWxvY2F0aW9ucy4gCi0JCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFR3ZWFrIGxhc3QgY2hhbmdlLgotCi0xOTk5LTA4LTA5ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbik6IFVzZSB0aGUgY291bnRzIGluIHRoZQotCWVsZi1zZWN0aW9uIGRhdGEgdG8gYWxsb2NhdGUganVzdCB0aGUgcmlnaHQgYW1vdW50IG9mIHJlbG9jYXRpb24KLQlzcGFjZS4gIERvbid0IGFsbG9jYXRlIHRoZSBoYXNoIHNwYWNlIHR3aWNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBzcGFjZSB0byBhbGxvY2F0ZSBpbgotCWVhY2ggcmVsb2NhdGlvbiBzZWN0aW9uLgotCi1Nb24gQXVnICA5IDE3OjM3OjMwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSwgY2FzZSAzMik6IFdoZW4gaW4KLQk2NGJpdCBtb2RlLCBnZW5lcmF0ZSBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSAzMmJpdAotCXdpZGUgcmVsb2NhdGlvbi4KLQkoZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlbGV0ZWQuICBUbyBiZQotCXNoYXJlZCBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBwb3J0LgotCi0xOTk5LTA4LTA5ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRml4IHNyY19tYXNrIGZvcgotCVJfTUlQU19HT1QxNiBhbmQgUl9NSVBTX0NBTEwxNi4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBVc2UgbWlwc19lbGZfaGlnaCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlCi0JdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBwcmVleGlzdGluZyBHT1QgZW50cnkuCi0KLTE5OTktMDgtMDkgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEJhY2sgb3V0IHBhcnQgb2YKLQl0aGUgU2VwLiA0dGgsIDE5OTggY2hhbmdlLiAgZ2xpYmMgMi4wLnggZHluYW1pYyBsaW5rZXIgaGFkIGJ1ZywKLQlub3QgYmludXRpbHMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMDkgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3Qgb3V0cHV0IGEgd2VhawotCXJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQgc3ltYm9sIGp1c3QgYmVjYXVzZSBpdCB3YXMgZGVmaW5lZCB3ZWFrCi0JaW4gYSBzaGFyZWQgb2JqZWN0LgotCi0xOTk5LTA4LTA5ICBFbGkgWmFyZXRza2lpICA8ZWxpekBpcy5lbHRhLmNvLmlsPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBXaGVuIGxvb2tpbmcgZm9yIGZpbGUsIHVzZQotCWxhc3QgYmVzdCBtYXRjaCByYXRoZXIgdGhhbiBmaXJzdC4gIElmIGFkZHJlc3MgaXMgYmV5b25kIGxhc3QgbGluZQotCW51bWJlciByZWNvcmQsIGRvbid0IHJldHVybiB0aGUgbGFzdCBsaW5lIGFzIHRoZSBjb3JyZWN0IHZhbHVlLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc2VjdGlvbi5jIChTRUNfU01BTExfREFUQSk6IFJlbmFtZSBmcm9tIFNFQ19TSE9SVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeSk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbi4KLQkoY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZSk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFVzZSBjb2ZmX3NldF9jdXN0b21lcl9zZWN0aW9uX2FsaWdubWVudC4KLQkqIGNvZmYtZ28zMi5jIChDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMpOiBEZWZpbmUuCi0JKiBjb2ZmLXN0Z28zMi5jIChDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMpOiBEZWZpbmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVuYW1lIC5kZXAqIGZpbGVzIHRvIERFUCouICBDaGFuZ2UgREVQIHZhcmlhYmxlIHRvCi0JTUtERVAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NIQVJFRCk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSGFuZGxlIFNFQ19TSEFSRUQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NsYXNzaWZ5X3N5bWJvbCk6IENvbW1lbnQgb3V0IHBhcnQgb2YKLQkxOTk5LTA4LTA1IGNoYW5nZSB3aGljaCBicmVha3MgY3lnd2luIERMTHMuCi0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IENoYW5nZSAtd2luZG93cyB0byAtd2luZG93cyouCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzZWN0aW9uLmMgKGdsb2JhbF9zeW1zKTogT25seSBpbml0aWFsaXplIHVuaW9uIGZpZWxkIGlmCi0JX19TVERDX18uCi0KLTE5OTktMDgtMDQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ290MTZfZW50cnkpOiBEb24ndCBtdWx0aXBseSBHT1QgaW5kZXggYnkKLQl0aGUgc2l6ZSBvZiBhIEdPVCBlbnRyeSBoZXJlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERvbid0IGNyZWF0ZSBhIGxvY2FsIEdPVCBlbnRyeQotCWZvciB0aGUgc3ltYm9sIGluIGEgR09UMTYgcmVsb2NhdGlvbjsganVzdCBmb3IgaXQncyBoaWdoLW9yZGVyIGJpdAotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdGhpbmtvLgotCi0xOTk5LTA4LTA1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBEb25uIFRlcnJ5IDxkb25uQGludGVyaXguY29tPjoKLQkqIGNvZmZjb2RlLmggKGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbmFtZSBfYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCB0bwotCV9iZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wuICBDaGFuZ2UgcmV0dXJuIHR5cGUuCi0JKGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCk6IFJlbmFtZSBmcm9tIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGNvZmZfY2xhc3NpZnlfc3ltYm9sLgotCShjb2ZmX2NsYXNzaWZ5X3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc3ltX2lzX2dsb2JhbCk6IE5ldmVyIGRlZmluZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIHdpdGggY29mZl9jbGFzc2lmeV9zeW1ib2wuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFVzZQotCWJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCByYXRoZXIgdGhhbiBiZmRfY29mZl9zeW1faXNfZ2xvYmFsLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmMgKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIHdpdGgKLQljb2ZmX2NsYXNzaWZ5X3N5bWJvbC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotV2VkIEF1ZyAgNCAxODowODowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoUl9IUFBBX0xUUFNFTCwgUl9IUFBBX1JUUFNFTCk6IE5ldyBmaWVsZCBzZWxlY3RvcnMKLQkoZV9sdHBzZWwsIGVfcnRwc2VsKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIDIxYml0IGVfbHRwc2VsCi0JYW5kIDE0Yml0IGVydHBzZWwuICBIYW5kbGUgNjRiaXQgcHNlbC4KLQotMTk5OS0wOC0wNCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBUd2VhayBISTE2L0xPMTYKLQloYW5kbGluZyBmb3IgUkVMIHJlbG9jYXRpb25zLiAgQW5kIG9ubHkgbGVmdC1zaGlmdCBSX01JUFMyNgotCXJlbG9jYXRpb24gYWRkZW5kcyB3aGVyZSBuZWNlc3NhcnkuCi0KLTE5OTktMDgtMDMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbmV4dF9sbzE2X2FkZGVuZCk6IFJlbmFtZSB0byAuLi4KLQkobWlwc19lbGZfbmV4dF9sbzE2X3JlbG9jYXRpb24pOiBEb24ndCBjb21wdXRlIHRoZSBhZGRlbmQgaGVyZS4KLQlKdXN0IHJldHVybiB0aGUgcmVsb2NhdGlvbiBmb3VuZC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFB1bGwgdGhlIExPMTYgYWRkZW5kIG91dCBvZiB0aGUKLQlzZWN0aW9uIGl0c2VsZiB3aGVuIHVzaW5nIFJFTCByZWxvY2F0aW9ucy4KLQkKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBSZXN0b3JlCi0JX0RZTkFNSUNfTElOSyBoYW5kbGluZyBhbmQgaGFuZGxpbmcgb2YgdW5kZWZpbmVkIHN5bWJvbHMgaW4gc2hhcmVkCi0JbGlicmFyaWVzLgotCi0xOTk5LTA4LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHVzZSB0aGUgcmVsb2NhdGlvbgotCXZhbHVlIG9mIGEgc3ltYm9sIGluIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uLiAgV2FybiB3aGVuIGRvaW5nIGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gYW4gaW5wdXQgc2VjdGlvbiB3aXRoIG5vIG91dHB1dAotCXNlY3Rpb24uICBGcm9tIERhbmllbCBKYWNvYm93aXR6IDxkcm93QGZhbHNlLm9yZz4uCi0KLQkqIGNvZmYtc3RnbzMyLmMgKGdvMzJfc3R1YmJlZF9jb2ZmX29iamVjdF9wKTogUmVtb3ZlOyBub3QgdXNlZC4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogQ2hhbmdlIHRvIHVzZSBjb25mdGVzdCwgYW5kIHRvCi0JbG9vayBmb3IgZ2VuZXJhdGVkIGZpbGUgY29ycmVjdGx5LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFNfMjYKLQlhbmQgUl9NSVBTMTZfMjYgcmVsb2NhdGlvbnMgY29ycmVjdGx5IHdoZW4gcmVsb2NhdGluZy4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBEb24ndCBhc3N1bWUgdGhhdCBSX01JUFNfQ0FMTF9ISTE2Ci0JYW5kIFJfTUlQU19DQUxMX0xPMTYgYXJlIGZvciBnbG9iYWwgc3ltYm9scy4KLQkKLTE5OTktMDgtMDIgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBDb3B5IHRoZSB3aG9sZSBpc3ltLCBub3QganVzdAotCXNvbWUgZmllbGRzLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfb3V0cHV0X2FyY2hfc3ltcyk6IERlY2xhcmUgdXNlZAotCXZhcmlhYmxlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtLgotCi0xOTk5LTA4LTAxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZQotCXRoZXJlIGFyZSBubyBnbG9iYWwgc3ltYm9scyByZXF1aXJpbmcgR09UIGVudHJpZXMuCi0JKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IFVuZGVmaW5lZCB3ZWFrCi0Jc3ltYm9scyBhcmUgY29uc2lkZXJlZCB0byBoYXZlIHRoZSB2YWx1ZSB6ZXJvLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB0cnkgdG8gcGVyZm9ybSBhCi0JcmVsb2NhdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBBbGxvY2F0ZSBsb2NhdGUgR09UIHNwYWNlIGZvciBsb2NhbAotCUdPVDE2IHJlbG9jYXRpb25zLgotCi0xOTk5LTA3LTMwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2J1aWxkX3BsdCk6IENvc21ldGljIGNoYW5nZSAtIEFCSQotCXdhbnRzIGJhLGEscHQgJXhjYyBpbnN0ZWFkIG9mICVpY2MuCi0JRW1pdCBjb3JyZWN0IC5QTFQwLSguUExUTis0KSBpbml0aWFsIHZhbHVlIGludG8gdGhlIHBvaW50ZXIgc2xvdHMKLQlvZiBsYXJnZSBQTFQgZW50cmllcy4KLQkoc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQpOiBGaXggY2FsY3VsYXRpb24uCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5lZ2F0aXZlIHZhbHVlIG9mIFJfU1BBUkNfSk1QX1NMT1QKLQlhZGRlbmQgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGxvYWQgYWRkcmVzcywgbm90IC5wbHQgc2VjdGlvbiBzdGFydC4KLQkoc3BhcmM2NF9lbGZfc2l6ZV9pbmZvKTogU3BhcmM2NCB1c2VzIDMyYml0IC5oYXNoIGVudHJpZXMuCi0KLTE5OTktMDctMzAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZAotCXByaW50X3N5bWJvbF9hbGwgYW5kIG91dHB1dF9hcmNoX3N5bXMgYmFja2VuZCBtZXRob2RzLgotCSogZWxmeHgtdGFyZ2V0Lmg6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0Jc3BhcmM2NF9lbGZfYWRkX3N5bWJvbF9ob29rLCBzcGFyYzY0X2VsZl9vdXRwdXRfYXJjaF9zeW1zLAotCXNwYXJjNjRfZWxmX2dldF9zeW1ib2xfdHlwZSwgc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExlYXZlIHNwYWNlIGZvciBTVFRfUkVHSVNURVIKLQlzeW1ib2xzIGluIC5keW5zeW0sIGFkZCB0aGVpciBuYW1lcyBpbnRvIC5keW5zdHIuIFB1dCB0aG9zZSBzeW1ib2xzCi0JaW50byBkeW5sb2NhbC4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBGaXggdXAgRFRfU1BBUkNfUkVHSVNURVIKLQlwb2ludGVycyB0byBTVFRfUkVHSVNURVIgc3ltYm9scyBpbiBkeW5zeW0gc2VjdGlvbi4KLQkoc3BhcmM2NF9lbGZfcHJpbnRfc3ltYm9sX2FsbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IEFsbG93IHNwZWNpYWwgYmFja2VuZCBzeW1ib2wKLQlwcmludGluZyB1c2luZyB0aGUgcHJpbnRfc3ltYm9sX2FsbCBob29rLgotCi0xOTk5LTA3LTMwICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiAgVXNlIHJfb2Zmc2V0IGZvcgotCVJfQVJNX0dOVV9WVEVOVFJZLgotCi0xOTk5LTA3LTI5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IE9ubHkgcmUtc29ydCBkeW5zeW1zIGlmCi0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkLgotCi0xOTk5LTA3LTI5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBTcGxpdCBvdXQgc3dpdGNoIHRvIC4uLgotCShtaXBzX3J0eXBlX3RvX2hvd3RvKTogLi4uIG5ldyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIGl0LgotCi0xOTk5LTA3LTI4ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvLgotCi0xOTk5LTA3LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JUGF0Y2ggZ2VuZXJhdGVkIGJ5IEJlcm5kIFNjaG1pZHQuIDxiZXJuZHNAY3lnbnVzLmNvLnVrPgotCQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSk6IENoYW5nZSB0byBzdHJpcAotCW91dCBvbmx5IHN5bWJvbHMgdGhhdCBzdGFydCB3aXRoIExPQ0FMX0xBQkVMX1BSRUZJWCBmb2xsb3dlZCBieSAnTCcuCi0KLTE5OTktMDctMjMgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogQWRkIGNvZmZfbGlua19oYXNoX2ZsYWdzCi0JZmllbGQsIGFuZCBkZWZpbmUgQ09GRl9MSU5LX0hBU0hfUEVfU0VDVElPTl9TWU1CT0wuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBQRSwgaGFuZGxlIHNlY3Rpb24KLQlzeW1ib2xzIHNwZWNpYWxseS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotaW50ZXJpeCopOiBOZXcgdGFyZ2V0LgotCi0xOTk5LTA3LTIxICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTIGFuZAotCUNPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UsIG1hcmsgc2VjdGlvbnMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAotCS5nbnUubGlua29uY2Ugd2l0aCBTRUNfTElOS09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRC4KLQkqIGNvZmYtZ28zMi5jOiAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UpOiBEZWZpbmUuCi0JKiBjb2ZmLXN0Z28zMi5jOiAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UpOiBEZWZpbmUuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogbWFrZWZpbGUuZG9zOiBSZW1vdmU7IG9ic29sZXRlLgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0yMSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi12eHdvcmtzKik6IEFkZCB0YXJnX3VuZGVyc2NvcmU9eWVzLgotCi0xOTk5LTA3LTIxICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElzc3VlIGFuIGVycm9yCi0JbWVzc2FnZQlhbmQgZmFpbCBpZiBhIHN5bWJvbCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogR2V0IHRoZSBHUCB2YWx1ZQotCXdoZW4gbG9va2luZyBhdCBhIFJfTUlQU19HT1QxNiByZWxvY2F0aW9uLgotCi0xOTk5LTA3LTIwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW04OGsuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCi1Nb24gSnVsIDE5IDE0OjAzOjQ0IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogUmVzdG9yZSBzZXR0aW5nIG9mIEdQCi0JcmVtb3ZlZCBpbiBwcmV2aW91cyBjaGFuZ2UuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCBHUCByZWxhdGl2ZSByZWxvY2F0aW9ucwotCWluIHJlbG9jYXRlYWJsZSBvdXRwdXQuCi0KLTE5OTktMDctMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiBJbml0aWFsaXplIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0Ci0Jc3RydWN0dXJlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBtZXJnZSBzeW1ib2xzIGZyb20gdGhlIHNhbWUgQkZECi0JaWYgdGhleSBhcHBlYXIgdG8gYmUgc3BlY2lhbGx5IGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLQotMTk5OS0wNy0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChhbHRlcm5hdGl2ZV90YXJnZXQpOiBOZXcgZmllbGQgaW4gYmZkX3RhcmdldAotCXN0cnVjdHVyZS4KLQkoYmZkX3NlYXJjaF9mb3JfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uOiAgRmluZCBhIHRhcmdldCB0aGF0Ci0Jc2F0aXNpZmllcyBhIHNlYXJjaCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmeHgtdGFyZ2V0Lmg6IEluaXRpYWxpc2UgdGhlIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZCBvZgotCXRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8gdGhlIG90aGVyIHRhcmdldCAoaWYKLQlkZWZpbmVkKS4KLQkqIG5sbS10YXJnZXQuaDogSW5pdGlhbGlzZSB0aGUgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkIG9mCi0JdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlcyB0byBwb2ludCB0byB0aGUgb3RoZXIgdGFyZ2V0IChpZgotCWRlZmluZWQpLgotCQotCSogY29mZmNvZGUuaCAoQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMpOiBOZXcgbWFjcm8uCi0JKENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDKTogTmV3IG1hY3JvLgotCQotCSogYWl4Mzg2LWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuCi0JKiBhb3V0LWFkb2JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLgotCSogYW91dC1hcm0uYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC10YXJnZXQuaDogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC10aWMzMC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBiaW5hcnkuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYm91dC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjaXNjby1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtYTI5ay5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWFscGhhLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtYXBvbGxvLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtYXJtLmM6IFVzZSBDUkVBVEVfe0JJR3xMSVRUTEV9X0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtaDgzMDAuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1oODUwMC5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWkzODYuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1pODYwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtaTk2MC5jOiBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW02OGsuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1tY29yZS5jOiBVc2UgQ1JFQVRFX3tCSUd8TElUVExFfV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW1pcHMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1wcGMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1yczYwMDAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1zaC5jOiAgVXNlIENSRUFURV97QklHfExJVFRMRX1fQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1zcGFyYy5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXRpYzMwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtdGljODAuYzogVXNlIENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi13NjUuYzogICBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXdlMzJrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtejhrLmM6ICAgVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogaHBwYWJzZC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGhwdXgtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpMzg2bXNkb3MuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaTM4Nm9zOWsuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaWVlZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpaGV4LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGlyaXgtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBtaXBzYnNkLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG5ldGJzZC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG9hc3lzLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG9zZi1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHBwY2Jvb3QuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogcHRyYWNlLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogc2NvNS1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHNvbS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBzcmVjLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHRla2hleC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB0cmFkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdmVyc2Fkb3MuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdm1zLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQotMTk5OS0wNy0xOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyByZWxfaGFzaAotCWFuZCByZWxfaGRyLgotCi1TYXQgSnVsIDE3IDAyOjI4OjI4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIGl0LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEZWFsIHdpdGggdGhlIGZhY3QgdGhhdCB0aGVyZSBjYW4gYmUgCi0JdHdvIHJlbG9jYXRpb24gc2VjdGlvbnMgZm9yIGEgc2luZ2xlIHNlY3Rpb24uCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IEdQIGZvciAKLQlhIHJlbG9jYXRlYWJsZSBvYmplY3QuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSByZWxvY2F0ZWFibGUgbGlua3MuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byk6IFVzZSBFTEY2NF9SX1RZUEVfSUQuCi0JKHNwYXJjNjRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCwKLQlzcGFyYzY0X2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwKLQlzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUsIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotCXNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLCBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcywgc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZQotCUVMRjY0X1JfVFlQRV9JRC9EQVRBIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbW92ZQotCURUX1NQQVJDX1BMVEZNVC4KLQotMTk5OS0wNy0xNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wKTogTmV3IHN0YXRpYwotCWZ1bmN0aW9uLgotCShtaXBzX2VsZl9uZXh0X2xvMTZfYWRkZW5kKTogQ2FsbCBiZmRfc2V0X2Vycm9yIG9uIGZhaWx1cmUuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogVXNlIG1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcC4KLQlBbHdheXMgc2V0ICpyZXF1aXJlX2phbHhwLgotCShtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCk6IE1hcmsgYWJmZCBwYXJhbWV0ZXIgYXMgdW51c2VkLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IGxvb2sgZm9yIExPMTYgZm9sbG93aW5nCi0JR09UMTYgaWYgdGhlIEdPVDE2IGlzIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICBEb24ndCByZXR1cm4gZmFsc2UKLQlmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIElmIHRoZXJlIGlzIGFuIG92ZXJmbG93LCBhc3NlcnQgdGhhdCB3ZQotCWhhdmUgYSBuYW1lLgotCi0xOTk5LTA3LTE2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZXMgYGxpbmsnIGFuZCBgZWxmc2VjJy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgb3MnLgotCi1UaHUgSnVsIDE1IDE3OjU1OjMxIDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBEb24ndCByZXF1aXJlCi0JYSBQVF9QSERSIHByb2dyYW0gaGVhZGVycy4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3QgYXNzdW1lIHRoZXJlIGFyZSBnb2luZyB0byBiZQotCXNlY3Rpb24gc3ltYm9scyB3aGVuIHdlJ3JlIG5vdCBidWlsZGluZyBhIHNoYXJlZCBvYmplY3QuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTWFrZSBzdXJlIHdlIGhhdmUgYSBHT1Qgd2hlbgotCXdlIG5lZWQgb25lLgotCi0xOTk5LTA3LTE1ICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFjay5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0xNSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBIYW5kbGUgTUlQUzE2IHN0dWIgZnVuY3Rpb25zLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IGNhbGxpbmcgc2VxdWVuY2UgZm9yCi0JbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYW5kIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogVHVybiBgamFsJyBpbnRvIGBqYWx4JyB3aGVyZQotCXJlcXVpcmVkLgotCi0xOTk5LTA3LTE1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuOS41LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDE1IDAyOjU2OjE1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSwgY2FzZSBSX0hQUEEpOiBIYW5kbGUKLQk2NGJpdCBmb3JtYXQuCi0JKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUsIGNhc2UgUl9HT1RPRkYpOiBVc2UgYmFzZSByZWxvYyB0eXBlCi0JdG8gZGVyaXZlIGZpbmFsIHR5cGUgaW5zdGVhZCBvZiBoYXJkd2lyaW5nIGEgc2VsZWN0aW9uLgotCi0xOTk5LTA3LTE0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29idGFpbl9jb250ZW50cyk6IFN3YXAgMTYtYml0IGhhbHZlcyBvZgotCXRoaW5ncyByZWxvY2F0ZWQgYnkgUl9NSVBTMTZfR1BSRUwuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1XZWQgSnVsIDE0IDE1OjIzOjE5IDE5OTkgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IEFkZCBlbGZfYmFja2VuZF93YW50X2R5bmJzcy4KLQotMTk5OS0wNy0xNCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19nb3RfaW5mbyk6IEFkZCBnbG9iYWxfZ290bm8uCi0JKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IGl0LgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZS1zb3J0OyB2ZXJpZnkgdGhlIGdvdCBkaWQgbm90IGdyb3cuCi0JKG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSk6IFNldCBtYXhfbm9uX2dvdF9keW5pbmRleCBiYXNlZCBvZmYKLQluZXcgYXJndW1lbnQgbWF4X2xvY2FsLgotCi0xOTk5LTA3LTE0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29idGFpbl9jb250ZW50cyk6IFN3YXAgdGhlIDE2LWJpdAotCXN1YndvcmRzIHdoZW4gaGFuZGxpbmcgYW4gUl9NSVBTMTZfMjYgcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYmUgcGFyYW5vaWQgYWJvdXIgcmlnaHQtc2hpZnQKLQlzZW1hbnRpY3MuCi0JCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzMTZfZ3ByZWxfaG93dG8pOiBBZGp1c3Qgc3JjX21hc2sgYW5kCi0JZHN0X21hc2sgdG8gbWF0Y2ggcmVhbGl0eS4KLQkoX2JmZF9taXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogVXNlIGJmZF9nZXQuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA3LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2XzI2LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IGNhbGxpbmcgc2VxdWVuY2UgZm9yIAotCW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogVGFrZSBhZGRpdGlvbmFsIGFyZ3VtZW50LiAgSGFuZGxlCi0JUl9NSVBTMTZfMjYuICBVc2UgYmZkX3B1dCBmb3IgY29udmVuaWVuY2UuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVGhpbmtvIGxhc3QgY2hhbmdlLgotCUFsd2F5cyBvdmVyd3JpdGUgcF9mbGFncy4KLQotMTk5OS0wNy0xMyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB3YW50X2R5bmJzcy4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNyZWF0ZQotCS5keW5ic3MgYW5kIC5yZWxbYV0uYnNzIGlmIHdhbnRfZHluYnNzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzKTogUHJvdmlkZSBkZWZhdWx0LgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IG92ZXJ3cml0ZSBwX2ZsYWdzLgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5KTogTmV3LgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkeW5sb2NhbC4KLQkoX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCk6IFByb3RvdHlwZS4KLQkoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IERlbGV0ZS4KLQkoX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogUHJvdG90eXBlLgotCShfYmZkX2VsZixsaW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCk6IFByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogTmV3IGFsaWFzLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvKTogRGVsZXRlIHJlbW92ZWRfZHluYW1pYy4KLQkoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0Ci0JaW5zdGVhZCBvZiBlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMuCi0JUmVtb3ZlIHJlbW92ZWRfZHluYW1pYyBjb2RlLiAgVXNlIF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogUmVtb3ZlIHJlbW92ZWRfZHluYW1pYyBjb2RlLgotCShlbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogRGVsZXRlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJbnN0YWxsIHNlY3Rpb24gYW5kIGxvY2FsIHN5bWJvbHMgaW50byAuZHluc3ltLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2VjdGlvbiBkeW5pbmRpY2llcy4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCB3cml0ZSBzZWN0aW9uIGR5bnN5bXMuCi0JKiBlbGYzMi1taXBzLmM6IFNpbWlsYXJseS4KLQkqIGVsZjMyLXBwYy5jOiBTaW1pbGFybHkuCi0JKiBlbGYzMi1zcGFyYy5jOiBTaW1pbGFybHkuCi0JKiBlbGY2NC1hbHBoYS5jOiBTaW1pbGFybHkuCi0JKiBlbGY2NC1zcGFyYy5jOiBTaW1pbGFybHkuCi0KLTE5OTktMDctMTMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBEbyBub3QgY29tcGxhaW4KLQl3aGVuIF9ncF9kaXNwIGlzIHVuZGVmaW5lZC4gIERvIG5vdCBjaGVjayBSX01JUFNfTE8xNiBmb3Igb3ZlcmZsb3cKLQl3aGVuIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgX2dwX2Rpc3AuCi0KLTE5OTktMDctMTIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX2F0dHJpYnV0ZSk6IFN1cHBvcnQgRFdfRk9STV9yZWY4LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgbWlwc18zMl9yZWxvY3MKLQl0byBwb3NzaWJseV9keW5hbWljX3JlbG9jcy4gIEFkanVzdCB1c2FnZSB0aHJvdWdob3V0IGNvZGUuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogSGFuZGxlIFJfTUlQU182NCBjb3JyZWN0bHkuCi0JKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFNfNjQgbGlrZSBSX01JUFNfMzIuCi0JQWRqdXN0IGluZGVudGF0aW9uLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQU182NCBpbiAzMi1iaXQgbW9kZS4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgUl9NSVBTXzY0IGxpa2UgUl9NSVBTXzMyLgotCVVzZSBNSVBTX0VMRl9HT1RfU0laRSB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgR09UIGVudHJpZXMuCi0JKiBlbGY2NC1taXBzLmMgKGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3ApOiBEZWZpbmUuCi0KLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYmZkLWluLmg6IFJlbW92ZSB0ZXN0cyBvZiBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgVXNlIEVNUFRZX0hPV1RPIGFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbgotCXN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuICBBZGQgY2FzdHMuCi0JKiByZWxvYy5jIChFTVBUWV9IT1dUTyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFJlbW92ZSB1c2VsZXNzCi0JY29tcGFyaXNvbnMgYWdhaW5zdCAwLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZQotCXByZXZpb3VzX2liZmRfZV9mbGFncyB0byB1bnNpZ25lZCBsb25nLgotCSogdm1zLmggKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCk6IENoYW5nZSBzZWN0aW9uX2NvdW50IHRvCi0JdW5zaWduZWQuCi0JKiB2bXMtZ3NkLmMgKF9iZmRfdm1zX3NsdXJwX2dzZCk6IENoYW5nZSBwc2VjdF9pZHggdG8gdW5zaWduZWQuCi0JKF9iZmRfdm1zX3dyaXRlX2dzZCk6IENoYW5nZSBzeW1udW0gdG8gdW5zaWduZWQuCi0JKiB2bXMtaGRyLmMgKF9iZmRfdm1zX3dyaXRlX2hkcik6IENoYW5nZSBzeW1udW0gdG8gdW5zaWduZWQuCi0JKiB2bXMtdGlyLmMgKGV0aXJfc3RhKTogQ2hhbmdlIHBzZWN0IHRvIHVuc2lnbmVkLgotCShhbGxvY19zZWN0aW9uKTogQ2hhbmdlIGlkeCB0byB1bnNpZ25lZC4KLQkodGlyX3N0YSwgdGlyX2N0bCk6IENoYW5nZSBwc2VjdCB0byB1bnNpZ25lZC4KLQkoX2JmZF92bXNfd3JpdGVfdGlyKTogQ2hhbmdlIGxlbiBhbmQgYmVmb3JlIHRvIGJmZF9zaXplX3R5cGUuCi0JKiB2bXMuYyAocHJpdl9zZWN0aW9uX2NvdW50KTogQ2hhbmdlIHRvIHVuc2lnbmVkLgotCi0xOTk5LTA3LTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEFkZCBzb21lIEFUVFJJQlVURV9VTlVTRUQuCi0JKiBtNjhrbGludXguYzogTGlrZXdpc2UuCi0KLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2VzIHRvIGF2b2lkIGdjYyB3YXJuaW5nczogUmVtb3ZlIHVudXNlZCBsb2NhbAotCXZhcmlhYmxlcy4gIEFkZCBkZWZhdWx0IGNhc2UgdG8gZW51bSBzd2l0Y2hlcy4KLQkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKTogT25seQotCWNvbXBpbGUgaWYgbm90IENPRkZfSU1BR0VfV0lUSF9QRS4KLQkocmVjb3JkX2FybV90b190aHVtYl9nbHVlLCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiBMaWtld2lzZS4KLQkoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLQkoYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlcG9jLXBlaS1hcm0uYzogRG9uJ3QgcmVuYW1lIGJmZF9hcm0gZnVuY3Rpb25zLgotCSogcGVpLWFybS5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERvbid0IGRlY2xhcmUuCi0JKE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKTogQ29ycmVjdCBsYXN0IGNoYW5nZS4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBQdXQgcGFyZW5zIGFyb3VuZCAmIGluIGJvZHkgb2YgPT0uCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogQ29ycmVjdCB0ZXN0IGZvciBlbXB0eSBzdHJpbmcuCi0JKiB2bXMtZ3NkLmM6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIgcmF0aGVyIHRoYW4gZnByaW50ZiB0bwotCXN0ZGVyci4KLQkqIHZtcy1taXNjLmMgKF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCk6IENvcnJlY3Qgc3ByaW50ZgotCWZvcm1hdC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbiBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLiAgQWRkIHZhcmlhYmxlCi0JaW5pdGlhbGl6YXRpb25zLiAgQWRkIGNhc3RzLgotCSogZHdhcmYxLmMgKHBhcnNlX2xpbmVfdGFibGUpOiBDaGFuZ2UgZWFjaExpbmUgdG8gdW5zaWduZWQgbG9uZy4KLQkoZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBsb25nLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9oYXNoKTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIHVuc2lnbmVkIGNoYXIgKiB0bwotCWNoYXIgKi4KLQkqIGVsZi1iZmQuaCAoYmZkX2VsZl9oYXNoKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFJlbW92ZSBjYXN0cwotCXdoZW4gY2FsbGluZyBiZmRfZWxmX2hhc2guCi0KLTE5OTktMDctMTEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfcHV0XzgpOiBNYWtlIGl0IG9mIHR5cGUgYHZvaWQnLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW1pcHMuYyAoTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkpOiBDb25kaXRpb25hbGl6ZQotCWZvciAzMi1iaXQgaG9zdHMuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IEJlIHR5cGUtY29ycmVjdC4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbGludXgtZ251Kik6IE5ldyB0YXJnZXQKLQotMTk5OS0wNy0wNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogQ29uc3RpZnkuCi0JKF9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCQotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfZGF0YSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZjMyX29iamVjdF9wKTogTW92ZSBjb250ZW50cyBpbnRvCi0JX2JmZF9taXBzX2VsZl9vYmplY3RfcC4KLQkobWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzLgotCShtaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcC4KLQkoZWxmX21pcHNfYWJpX25hbWUpOiBDaGFuZ2UgcHJvdG90eXBlLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogTWVyZ2UgaW50bwotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogTWVyZ2UgaW50bwotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmVuYW1lIHRvIF9iZmRfbWlwc19lbGZfZmluYWxfbGluay4gIEludm9rZQotCXRoZSByaWdodCBiYWNrLWVuZCBFTEYgbGlua2VyLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgQ2xlYW4gdXAuICBBZGp1c3QgZm9yIDY0LWJpdCBjb2RlLgotCShtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2suCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb24uCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbmFtZSB0byBfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcy4KLQlBZGp1c3QgZm9yIDY0LWJpdCBjb2RlLiAgVXNlIG1pcHNfZWxmX2dvdF9zZWN0aW9uLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4gIFVzZQotCW1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgVXNlIG1pcHNfZWxmX2dvdF9zZWN0aW9uLgotCUFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucy4gIEFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucy4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2suCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBDb25zdGlmeS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FKTogTmV3IG1hY3JvLgotCShNSVBTX0VMRl9SRUxfU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9EWU5fU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9HT1RfU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9TWU1fU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9MT0dfRklMRV9BTElHTik6IExpa2V3aXNlLgotCShNSVBTX0VMRl9HRVRfV09SRCk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9QVVRfV09SRCk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSk6IExpa2V3aXNlLgotCShTVFVCX0xXKTogQ29uZGl0aW9uYWxpemUgZm9yIDY0LWJpdCB2YWx1ZS4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX0hJR0hFUiBhbmQgUl9NSVBTX0hJR0hFU1QKLQllbnRyaWVzLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBNZXJnZSBlX2lkZW50W0VJX0NMQVNTXS4KLQlDaGVjayBpdCBmb3IgaW5jb25zaXN0ZW5jeS4KLQkoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHJpbnQgQUJJPTY0IGZvciA2NC1iaXQKLQlBQkkuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFJlbW92ZSBkdXBsaWNhdGUgaGFuZGxpbmcgb2YKLQkubXN5bS4gCi0JKG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXgpOiBVc2UgTUlQU19FTEZfR09UX1NJWkUuCi0JKG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCk6IFVzZSBtaXNwX2VsZl9nb3Rfc2VjdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSk6IFVzZSBNSVBTX0VMRl9HT1RfU0laRS4KLQkobWlwc19lbGZfbG9jYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9wYWdlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9pbmZvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24pOiBIYW5kbGUgMzItYml0LzY0LWJpdCBzcGxpdC4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBIYW5kbGUgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOLAotCWluc3RlYWQgb2YgY29uc3RhbnQgYDInLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBUaWR5LiAgVXNlIE1JUFNfRUxGX0dPVF9TSVpFLgotCShtaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uKTogVXNlIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UKLQlNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSwgTUlQU19FTEZfR09UX1NJWkUsCi0JTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkuICBSZW1vdmUgI2lmIDAnZCBjb2RlLgotCUFkanVzdCBhbGwgcmVsZXZlYW50IGVudHJpZXMgaW4gZWxmIGJhY2tlbmQgdGFibGUuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUuCi0JKG1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JQWRqdXN0IGVsZiBiYWNrZW5kIGVudHJpZXMgdG8gdXNlIF9iZmRfbWlwc19lbGYgdmFyaWFudHMgbm93Ci0JcHVibGljbHkgYXZhaWxhYmxlLgotCQotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEhhbmRsZSBub24tc3RhbmRhcmQKLQloYXNoLWVudHJ5IHNpemVzLgotCShzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogZWxmLmM6IChlbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogbGliYmZkLmMgKGJmZF9nZXQpOiBOZXcgbWFjcm8uCi0JKGJmZF9wdXQpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDctMDcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoZWxmX3NpemVfaW5mbyk6IEFkZCBoYXNoX2VudHJ5X3NpemUsCi0JaW50X3JlbHNfcGVyX2V4dF9yZWwsIHN3YXBfZHluX291dCwgc3dhcF9yZWxvY19pbiwgc3dhcF9yZWxvY19vdXQsCi0Jd2FwX3JlbG9jYV9pbiwgYW5kIHN3YXBfcmVsb2NhX291dC4gCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IEFkanVzdCB0byBoYW5kbGUKLQltdWx0aXBsZSBpbnRlcm5hbCByZWxvY2F0aW9ucyBwZXIgZXh0ZXJuYWwgcmVsb2NhdGlvbi4KLQkobGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKGVsZl9nY19tYXJrKTogTGlrZXdpc2UuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfZHluX291dCk6IEFkanVzdCB0eXBlIHRvIG1hdGNoCi0JZWxmX3N3YXBfZHluX2luLgotCShzaXplX2luZm8pOiBBZGQgZW50cmllcyBmb3IgbmV3IGZpZWxkcy4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jX291dCk6IEVuYWJsZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9zaXplX2luZm8pOiBBZGQgZW50cmllcyBmb3IgbmV3IGZpZWxkcy4KLQkKLTE5OTktMDctMDcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEFzc2VydCB0aGF0IHNlY3Rpb24gcmVsb2NfY291bnQKLQlmaWVsZCBlcXVhbHMgdGhlIG5ldyByZWxfY291bnQgZmllbGQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdXNlIHRoZSBuZXcKLQlyZWxfY291bnQgZmllbGQgcmF0aGVyIHRoYW4gdGhlIHJlbG9jX2NvdW50IGZpZWxkLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogUGVybWl0IGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhCi0Jc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdC4KLQotVHVlIEp1bCAgNiAxMDoyMzozOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmV2ZXJ0IEp1bHkgMiwgMTk5OSBwYXRjaC4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IFQgbW9kZSBzZWxlY3RvcnMKLQluZWVkIHRvIGdlbmVyYXRlIERMVElORCByZWxvY2F0aW9ucywgbm90IERMVFJFTCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pc2UgYXJtIDUKLQlhcmNoaXRlY3R1cmVzLiAKLQkoY29mZl9zZXRfZmxhZ3MpOiBSZWNvZ25pc2UgYXJtIDUgYXJjaGl0ZWN0dXJlcy4KLQotCSogY3B1LWFybS5jOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIGFuZCBhcm05IGNwdXMuCi0JQWRkIHN1cHBvcnQgZm9yIGFybXY1IGFyY2hpdGVjdHVyZS4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX2FybV81IGFuZCBiZmRfbWFjaF9hcm1fNVQuCi0JCi0JKiByZWxvYy5jOiBBZGQgbmV3LCBhc3NlbWJsZXIgb25seSwgQVJNIHJlbG9jOgotCUJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUuCi0JCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDctMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGR3YXJmMi5jIChwYXJzZV9jb21wX3VuaXQpOiBBZGQgQUJCUkVWX0xFTkdUSCBwYXJhbWV0ZXIuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIEFERFJfU0laRSBwYXJhbWV0ZXIuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBQYXNzIGl0LgotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChBQklfNjRfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBXZSBhcmUgSVJJWDYtY29tcGF0aWJsZSBpZiBBQklfNjRfUC4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkanVzdCBjYWxsIHRvCi0JX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA3LTAyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkICogYXQgdGhlIGVuZCBvZiBpWzM0NTZdODYtKi11bml4d2FyZS4KLQotRnJpIEp1bCAgMiAxMjoyMToxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoSFBQQV9SX0FSR19SRUxPQyk6IERlbGV0ZS4KLQkoSFBQQV9SX0NPTlNUQU5ULCBIUFBBX1JfQURERU5EKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2NvdW50IGFuZCByZWxfY291bnQyCi0JZmllbGRzLgotCShfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYuYyAoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IFVzZSBiZmRfemFsbG9jLCByYXRoZXIgdGhhbgotCWJmZF9hbGxvYyBmb2xsb3dlZCBieSBtZW1zZXQuCi0JKF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGVyZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEFzc2lnbiBzZWN0aW9uIG51bWJlcnMgZm9yIHRoZSBzZWNvbmQKLQlyZWxvY2F0aW9uIHNlY3Rpb24sIGlmIHJlcXVpcmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGVsZl9saW5rX291dHB1dF9yZWxvY3MuCi0JCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZQotCV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciB0byBpbml0aWFsaXplIHJlbF9oZHIyLgotCi1UaHUgSnVsICAxIDEzOjU4OjQ4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBSX1BDUkVMX0NBTEwKLQl3aXRoIDIyYml0IGZvcm1hdC4KLQotMTk5OS0wNi0yOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3RfaW5mbyk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlCi0JcHJvdG90eXBlcy4gIENoYW5nZSBnbG9iYWxfZ290c3ltIHRvIGJlIGEgcG9pbnRlciB0byBhIGhhc2ggZW50cnksCi0JcmF0aGVyIHRoYW4gYSBudW1iZXIgaW5kZXguCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlIHByb3RvdHlwZXMuCi0JKG1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoZXIpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaGVzdCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgpOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9wYWdlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9hc3NpZ25fZ3ApOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9pbmZvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBkZXNjcmlwdGlvbiBvZiBSX01JUFNfU0NOX0RJU1AuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogVXNlIG1pcHNfZWxmX2Fzc2lnbl9ncC4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IERvbid0IG1vdmUgU0hOX0NPTU1PTiBzeW1ib2xzCi0JaW50byBTSE5fU0NPTU1PTiBhdXRvbWF0aWNhbGx5IG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUsIHVzaW5nCi0JbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYW5kIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbik6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBkZWFsIHdpdGggLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkanVzdCB1c2Ugb2YgZ2xvYmFsX2dvdHN5bS4gIFNldAotCXNlY3Rpb24gZmxhZ3MgYXBwcm9wcmlhdGVseSBmb3IgLmdvdC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIElSSVg2IHJlbG9jYXRpb25zIG1ha2luZyB1c2Ugb2YKLQl0aGUgZ290LiAgQ2FsbCBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgYW5kIGFsbG9jYXRlCi0JbG9jYWwgZ290IHNwYWNlIGFwcHJvcHJpYXRlbHkuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBiZmRfYnl0ZSAqLCBub3QgdW5zaWduZWQKLQljaGFyICouICBSZXdvcmsgY2FsY3VsYXRpb24gb2YgR09UIHNpemUuICBTb3J0IGR5bmFtaWMgc3ltYm9sCi0JdGFibGUgZW50cmllcyBzbyBlbnRyaWVzIHRoYXQgZG8gbm90IHJlcXVpcmUgR09UIGVudHJpZXMgYXBwZWFyIGF0Ci0JdGhlIGJlZ2lubmluZy4gIERvbid0IHVzZSBEVF9NSVBTX0hJUEFHRU5PIG9uIElSSVg2LiAgUmVtb3ZlIGRlYWQKLQljb2RlIGRlYWxpbmcgd2l0aCBEVF9JTklUIGFuZCBEVF9GSU5JLiAgUmVtb3ZlIGZpZGRsaW5nIHdpdGgKLQlnbG9iYWxfZ290c3ltLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgY3JlYXRpb24gb2YgZ2xvYmFsIEdPVAotCWVudHJpZXMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IG9mZi1ieS1vbmUgZXJyb3IKLQlzZXR0aW5nIERUX01JUFNfVU5SRUZFWFROTy4gIEFkanVzdCBzZXR0aW5nIG9mIERUX01JUFNfR09UU1lNIGZvcgotCWNoYW5nZSB0byBnbG9iYWxfZ290c3ltLiAgU2V0IERUX01JUFNfT1BUSU9OUyBvbiBJUklYNi4KLQkJCi0xOTk5LTA2LTMwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IENQSUMgd2hlbiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuICBGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT4uCi0KLTE5OTktMDYtMDQgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTI4ICBKaW0gUGljayAgPGppbUBqaW1waWNrLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogTWluZCBub191bmRlZmluZWQKLQotVHVlIEp1biAyOSAwMjoyNTowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcwotCXJlbG9jYXRpb24gZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogS2lsbCB1bnVzZWQvdW53YW50ZWQgZnVuY3Rpb24uCi0KLTE5OTktMDYtMjcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4gIEFkZCAuc3JkYXRhIHRvIHRoZSBsaXN0Ci0Jb2YgR1AtcmVsYXRpdmUgc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgdGhlbS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBTaGFyZSBjb2RlIGJldHdlZW4gLnNkYXRhIGFuZAotCS5saXQ0Ly5saXQ4IHNlY3Rpb25zLiAgU2V0IGFwcHJvcHJpYXRlIGZsYWdzIGZvciAuc3JkYXRhLgotCShtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IEFkZCBoYW5kbGluZyBmb3IKLQlQVF9NSVBTX09QVElPTlMgc2VnbWVudCBvbiBJUklYNi4KLQkobWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZWl3c2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgRUZfTUlQU19DUElDIHdoZW4gcmVxdWlyZWQgYnkgdGhlIEFCSS4KLQlJbmNsdWRlIHRoZSBvcHRpb25zIHNlY3Rpb25zIG9uIElSSVg2LiAgRG9uJ3QgbG9vayBmb3IgR1AtcmVsYXRpdmUKLQlzZWN0aW9ucyBieSBuYW1lOyB1c2UgU0hGX01JUFNfR1BSRUwgaW5zdGVhZC4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBBZGp1c3QgdG8gdXNlIC91c3IvbGliMzIvbGliYy5zby4xIGZvcgotCXRoZSBOMzIgQUJJLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IG11Y2sgYWJvdXQgd2l0aCBzZWN0aW9uCi0JYWxpZ25tZW50cyBhbmQgc3VjaCBvbiBJUklYNi4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4gQWRqdXN0IHRvIGhhbmRsZSB0aGUKLQlmYWN0IHRoYXQgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgaXMgbm8gbG9uZ2VyIGEgY29uc3RhbnQuICBVc2UKLQliZmRfemFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvYyBhbmQgbWVtc2V0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JRG9uJ3QgYXNzZXJ0IHRoZSBleGlzdGVuY2Ugb2YgLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCQkKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRqdXN0X2R5bmluZHgpOiBSZW1vdmUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4Ci0JaW5zdGVhZC4KLQotMTk5OS0wNi0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zd2FwX21zeW1faW4pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3N3YXBfbXN5bV9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUpOiBOZXcgbWFjcm8uCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rIGZvciAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFJlamVjdCBhbiBTSFRfTUlQU19NU1lNCi0Jc2VjdGlvbiBub3QgbmFtZWQgLm1zeW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSwgbm90Ci0JLm1zeW0gZGlyZWN0bHkuICBTZXQgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBmb3IgdGhlIC5tc3ltCi0Jc2VjdGlvbi4KLQkobWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG1pbl9keW5fcmVsb2NfaW5kZXggZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uCi0Jb24gSVJJWDYuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCi0JLm1zeW0gc2VjdGlvbi4gIEFkZCBhIERUX01JUFNfTVNZTSBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogV3JpdGUgb3V0IGEgLm1zeW0gZW50cnkgZm9yCi0JdGhlIHN5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBBc3NpZ24gYSB2YWx1ZSBmb3IKLQlEVF9NSVBTX01TWU0uICBBZGQgLm1zeW0gZW50cmllcyBmb3IgdGhlIHNlY3Rpb24gc3ltYm9scyBhcyB3ZWxsLgotCi0JKiBlbGYzMi1taXBzLmMgKGlyaXhfY29tcGF0X3QpOiBOZXcgZW51bWVyYXRpb24uCi0JKEFCSV9OMzJfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBMaWtld2lzZS4KLQkoU0dJX0NPTVBBVCk6IEltcGxlbWVudCBpbiB0ZXJtcyBvZiBJUklYX0NPTVBBVC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvLgotCQotMTk5OS0wNi0yNiAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYXJrIG5vbiByZWFkb25seSBCRkQgc2VjdGlvbnMKLQlhcyB3cml0YWJsZSBQRSBzZWN0aW9ucy4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgYXJhbmdlKTogTmV3IHR5cGUuCi0JKHN0cnVjdCBjb21wX3VuaXQpOiBSZXBsYWNlIExPVyBhbmQgSElHSCBieSBtZW1iZXIgQVJBTkdFLgotCShhcmFuZ2VfYWRkKTogTmV3IGZ1bmN0aW9uLgotCShkZWNvZGVfbGluZV9pbmZvKTogS2VlcCB0cmFjayBvZiBhZGRyZXNzIHJhbmdlcyB0aGF0IGEgY29tcGlsYXRpb24KLQl1bml0IGNvdmVycy4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBSZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIGNvbnRhaW5lZAotCWluIF9hbnlfIG9mIHRoZSBhZGRyZXNzIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggYSBjb21waWxhdGlvbiB1bml0LgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IENhbGwgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lCi0Jb24gdGhlIGZpcnN0IGNvbXBfdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBhZGRyZXNzLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBkd2FyZjJfZGVidWcpOiBBZGQgbWVtYmVyIGR3YXJmX2xpbmVfYnVmZmVyLgotCShkZWNvZGVfbGluZV9pbmZvKTogQWRkIHZhcmlhYmxlIFNUQVNIIGFuZCBpbml0aWFsaXplIGl0IHRvIHBvaW50Ci0JdG8gdGhlIHBlci1iZmQgZHdhcmYyX2RlYnVnIGluZm8uICBSZW1vdmUgc3RhdGljIHZhcmlhYmxlCi0JZHdhcmZfbGluZV9idWZmZXIgYW5kIHVzZSBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgaW4gaXRzIHBsYWNlLgotCi0xOTk5LTA2LTI2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSXQncyBPSyBmb3IgYSAtQnN5bWJvbGljCi0Jc2hhcmVkIGxpYnJhcnkgdG8gaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IGxhc3QgcGF0Y2guCi0KLVRodSBKdW4gMjQgMjA6NTk6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5jIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItaHBwYS5jOiBSZW1vdmUgZXZlcnl0aGluZyByZWxhdGVkIHRvIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9ucyAmIHJlY29yZHMuICBVc2UgdGhlIGNvbW1vbiBlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSB1c2VyLXNwZWNpZmllZCBpbml0L2ZpbmkKLQlmdW5jdGlvbnMgaW5zdGVhZCBvZiBfaW5pdC9fZmluaSBpZiByZXF1ZXN0ZWQuCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQXZvaWQgY3Jhc2hpbmcgb24gYSBib2d1cyBzaF9saW5rCi0JZmllbGQuCi0KLTE5OTktMDYtMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdW51c2VkIGR5bmluZHgKLQlmaWVsZCB0byAwLCBub3QgLTEuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBmb3IgcG9zaXRpdmUgc2VjdGlvbgotCWR5bmluZHggZmllbGQsIHJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0IC0xLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IHJldHVybiBmYWxzZSBpZiB1bmRlZmluZWRfc3ltYm9sCi0Jb3IgcmVsb2Nfb3ZlcmZsb3cgZmFpbCwgbm90IGFsd2F5cyB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvci4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChsaW5rX3JlYWRfcmVsb2NzKTogRXhwbGljaXRseSBjYXN0IGV4dGVybmFsX3JlbG9jcyB0bwotCWJmZF9ieXRlICogYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1UdWUgSnVuIDIyIDEzOjA2OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaDogTmV3IGZpbGUuICBDb21tb24gc3R1ZmYgZm9yIGVsZjMyIGFuZCBlbGY2NCBQQQotCXN1cHBvcnQuCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgZWxmLWhwcGEuaC4KLQkoQVJDSF9TSVpFKTogRGVmaW5lLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZS4gIEZvdW5kIGluIHRoZSBjb21tb24gY29kZQotCW5vdy4KLQkoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9ob3d0b190YWJsZSk6IFNpbWlsYXJseS4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBTaW1pbGFybHkuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltaWxhcmx5LgotCSogZWxmMzItaHBwYS5oIChFTEZfSE9XVE9fVEFMQkUsIE5fUEFSSVNDX1JFTE9DUyk6IERlbGV0ZS4KLQotMTk5OS0wNi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2F0Y2ggb3ZlcmZsb3cKLQloYW5kbGluZyBSX1Y4NTBfMjJfUENSRUwgcmVsb2NhdGlvbi4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSk6IEV4cGxpY2l0bHkgZGVjbGFyZSByZXR1cm4KLQl0eXBlLgotCi1TdW4gSnVuIDIwIDE0OjEzOjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogSWdub3JlIHNlY3Rpb25zCi0JRElTQ0FSRGVkIGJ5IHRoZSBsaW5rIHNjcmlwdC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKToKLQlSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHNwcC4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmFzaCBpZgotCXRoZSBlbnRyeSBzeW1ib2wgaXMgbm90IHNldC4KLQotRnJpIEp1biAxOCAwNDoyNDo1NyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYWRqdXN0Ci0JR1BESVNQIG9yIExJVFVTRSBpbiBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBKdW4gMTcgMjE6MjQ6NDMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkd2FyZjEuYyAoYWxsb2NfZHdhcmYxX3VuaXQpOiBBbGxvY2F0ZSB1c2luZyBiZmRfemFsbG9jLgotCSogKGFsbG9jX2R3YXJmMV9mdW5jKTogTGlrZXdpc2UuCi0KLVdlZCBKdW4gMTYgMDM6MDk6NTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IEZpeCB2YXJpb3VzIGZvcm1hdHRpbmcgZXJyb3JzLgotCShhc3NlbWJsZV8zKTsgUmV3cml0ZSB1c2luZyBDQVRFTkFURS4KLQkoYXNzZW1ibGVfMTcpOiBGaXggdmFyaW91cyBidWdzLgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tY29yZS5jIChSX01DT1JFX1JBVyk6IEZpeCBkZWZpbml0aW9uLgotCi0xOTk5LTA2LTE1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TSE9SVCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSBhYmZkIHBhcmFtZXRlci4gIFVzZSBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQuCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRqdXN0IGNhbGxlcnMgYWNjb3JkaW5nbHkuCi0JCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBEZWZpbmUgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6IE5ldwotCWZ1bmN0aW9uLgotCShiZmRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQotMTk5OS0wNi0xMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QQzggZnJvbQotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkIHRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogSGVyZS4gIFVzZSBpdCBmb3IgYm90aCByZWxvY2F0aW9uCi0Jc2VjdGlvbnMuCi0KLTE5OTktMDYtMTIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbik6IERvbid0IGFzc3VtZQotCWFzZWN0LT5yZWxvY19jb3VudCBpcyB2YWxpZC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBQZXJtaXQgYQotCVNIVF9NSVBTX1JFR0lORk8gc2VjdGlvbiB0byBoYXZlIGEgc2l6ZSBvZiAwLgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1mcmVlYnNkKik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLWZyZWVic2QqKTogTm93IGRlZmF1bHRzIHRvIEVMRi4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBQZXJtaXQgYml0ZmllbGQgcmVsb2NhdGlvbnMgdG8KLQl3cmFwIGlmIHRoZSByZWxvY2F0aW9uIGNvdmVycyB0aGUgaGlnaCBiaXQgb2YgYW4gYWRkcmVzcy4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGZpcnN0X3RpbWUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjRfc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBSX1NQQVJDX21heF9zdGQKLQlpbnN0ZWFkIG9mIFJfU1BBUkNfbWF4LgotCShzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBlbGYzMl9zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8pOiBMaWtld2lzZTsgaGFuZGxlIHZ0YWJsZSByZWxvY2F0aW9ucy4KLQotMTk5OS0wNi0wNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBSZW1vdmUgb3V0cHV0Ci0Jc2VjdGlvbnMgd2l0aCBubyBpbml0aWFsIGxpbmtfb3JkZXIuCi0KLTE5OTktMDYtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW04OGsuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDExOjQ5OjQzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKFNPVVJDRV9IRklMRVMpOiBBZGQgbWlzc2luZyBoZWFkZXJzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA2LTA2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9kYXRhKTogUmVjb2duaXplCi0JdGhlIE4zMiBBQkkuCi0KLTE5OTktMDYtMDQgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYmFyZiBvbiBvdXQgb2YKLQlyYW5nZSB1bmRlZndlYWsgc3ltYm9scy4KLQkqIGhhc2guYzogQWRkIG1pc3NpbmcgY29tbWEgYWZ0ZXIgQHhyZWZ7fQotCSogbGlua2VyLmM6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogUHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlCi0JaWYgbm90IGRlZmluZWQuCi0JKiBlbGYzMi1nZW4uYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmMzItaTg2MC5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pOTYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjY0LWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGR3YXJmMS5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGR3YXJmMS5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZXBvYy1hcm0tcGUgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBwZS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBwZWktYXJtLmM6IE9ubHkgcmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIGlmIHRoZXkgaGF2ZQotCW5vdCBhbHJlYWR5IGJlZW4gcmVkZWZpbmVkLgotCSogZXBvYy1wZS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCSogZXBvYy1wZWktYXJtLmM6IFJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyB0byBhdm9pZCBhCi0JbmFtZSBzcGFjZSBjbGFzaC4KLQotMTk5OS0wNi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0LmggKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMHgxMDAwIG5vdCAxLgotCi1GcmkgSnVuICA0IDEwOjA1OjExIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVW5kbyBjaGFuZ2Ugb2YgMTk5OS0wNS0xMC4KLQotRnJpIEp1biAgNCAwMzoxMDo0OSAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBGaXggc2V0dGluZyBvZgotCXN0YXJ0IC8gc3RvcCBmb3IgcmVjYWxjdWxhdGluZyBvZiByX2FkZGVuZCBvZiBSX1NIX1NXSVRDSCouCi0KLUZyaSBKdW4gIDQgMDI6NTM6MTMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIMzIKLQlpbiBvdGhlciB0ZXh0IHNlY3Rpb25zLgotCi1GcmkgSnVuICA0IDAyOjI5OjM0IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogbGliYmZkLmMgKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1zaC5jIChzaF9tZXJnZV9wcml2YXRlX2RhdGEpOiBEZWxldGUuCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdG8KLQlfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaC4KLQkoZWxmMzItc2guYyk6IGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YTogRGVmaW5lLgotCi0xOTk5LTA2LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmg6IEZpeCB0eXBvOiBjaGFuZ2UgRUxGX01BWFBBR0VfU0laRSB0byBFTEZfTUFYUEFHRVNJWkUuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBDb3JyZWN0Ci0JcHJvdG90eXBlLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgbGluZV9pbmZvKTogQWRkIG1lbWJlciBFTkRfU0VRVUVOQ0UgdG8ga2VlcAotCXRyYWNrIG9mIGVuZF9zZXF1ZW5jZSBtYXJrZXJzLgotCShhZGRfbGluZV9pbmZvKTogQWRkIEVORF9TRVFVRU5DRSBhcmcuCi0JKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnkgdG8gaW5mZXIgbG9fcGMgYW5kIGhpX3BjIGZyb20gdGhlCi0JZGVidWctbGluZSBpbmZvLS0taXQgZG9lc24ndCB3b3JrIHJpZ2h0IGlmIGEgY29tcGlsYXRpb24gdW5pdAotCWNvbnNpc3RzIG9mIG11bHRpcGxlIGRpc2NvbnRpZ3VvdXMgY29kZS1zZXF1ZW5jZXMuICBJdCB3b3VsZCBiZQotCXdvcnRod2hpbGUgdG8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhIGNvbXBpbGF0aW9uCi0JdW5pdCByZXN1bHRzIGluIGEgY29udGlndW91cyBzZXQgb2YgY29kZSBzZXF1ZW5jZXMsIGJ1dCB0aGlzIGlzCi0JcXVpdGUgdHJpY2t5IHRvIGdldCByaWdodCBmb3IgYXJiaXRyYXJ5IERXQVJGMiBmaWxlcy4KLQkobG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlKTogRG9uJ3QgdXNlIHRoZSBsYXN0IGxpbmUgZW50cnkKLQlmb3IgYSBjb21waWxhdGlvbiB1bml0IGZvciBhbnl0aGluZyB3aXRoIGFuIGFkZHJlc3MgaGlnaGVyIHRoYW4KLQl0aGlzIGxpbmUgZW50cnkuICBBbHNvLCBjaGVjayBmb3IgZW5kX3NlcXVlbmNlIG1hcmtlcnMgdG8KLQljb3JyZWN0bHkgaGFuZGxlIGRpc2NvbnRpbnVpdGllcy4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBXaGVuIGNoZWNraW5nIHByZXZpb3VzbHkgbG9hZGVkCi0JY29tcGlsYXRpb24gdW5pdHMsIGNoZWNrIGFsbCBjb21waWxhdGlvbiB1bml0cyB3aXRoIGVhY2gtPmhpZ2g9PTAKLQlqdXN0IGxpa2Ugd2hlbiByZWFkaW5nIGNvbXBpbGF0aW9uIHVuaXRzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IEluaXRpYWxpemUgdGFibGUtPmZpbGVzIGFuZAotCXRhYmxlLT5sYXN0X2xpbmUgdG8gTlVMTCB0byBhdm9pZCBzZWdmYXVsdHMgZHVlIHRvIHJhbmRvbQotCXZhbHVlcyBpbiB0aGVzZSBtZW1iZXJzLgotCShjb25jYXRfZmlsZW5hbWUpOiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGZpbGUgbnVtYmVyIGJlZm9yZQotCWluZGV4aW5nIGZpbGVuYW1lIHRhYmxlLiAgU2VnZmF1bHRzIHN1Y2suCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogRG9uJ3QgdHJ1bmNhdGUgYWRkcmVzcyB0byBsZWFzdAotCXNpZ25pZmljYW50IDMyIGJpdHMgKGJyZWFrcyA2NCBiaXQgdGFyZ2V0cykuCi0JKGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlKTogRGl0dG8uCi0JKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzKTogRGl0dG8uCi0KLTE5OTktMDYtMDIgIE1hcmsgTWl0Y2hlbGwgIDxNYXJrIE1pdGNoZWxsIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+PgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19KQUxSLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGEpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLAotCXNwbGl0IG91dCBmcm9tIC4uLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBIZXJlLiAgVXNlIGl0IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhCi0Jc2luZ2xlIHNlY3Rpb24gaGFzIHR3byBhc3NvY2lhdGVkIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0KLTE5OTktMDYtMDIgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFNldCBsbWEgZnJvbSBzX3ZhZGRyIGlmCi0JQ09GRl9XSVRIX1BFIGRlZmluZWQuCi0KLTE5OTktMDYtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlLWFybS5jOiBSZW5hbWUgZ2xvYmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIGF2b2lkIG5hbWUKLQljb2xsaXNpb24gd2hlbiBhbGwgdGFyZ2V0cyBCRkQgaXMgYnVpbHQuCi0JKiBwZWktYXJtLmM6IERpdHRvLgotCi0xOTk5LTA1LTMxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgdXNlX3JlbGFfcC4gIEFkZAotCW1heV91c2VfcmVsX3AsIG1heV91c2VfcmVsYV9wLCBkZWZhdWx0X3VzZV9yZWxhX3AuCi0JKGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHVzZV9yZWxhX3AuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IHVzZV9yZWxhX3AgYXBwcm9wcmlhdGVseS4KLQkoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IExpa2V3aXNlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBtYXlfdXNlX3JlbGFfcCwgZXRjLiwgaW5zdGVhZCBvZgotCXVzZV9yZWxhX3AuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHVzZV9yZWxhX3AuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB1c2UgcmVsYQotCXJlbG9jcyBiYXNlZCBvbiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGhlYWRlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZGVmYXVsdF91c2VfcmVsYV9wCi0JaW5zdGVhZCBvZiB1c2VfcmVsYV9wLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX21heV91c2VfcmVscCk6IE5ldyBtYWNyby4KLQkoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVzZSB0aGVtLgotCi1XZWQgSnVuICAyIDEyOjM4OjQ5IDE5OTkgIE1pb2RyYWcgVmFsbGF0IDxtaW9kcmFnQG11bHRpbWFuaWEuY29tPgotCi0JKiBob3N0cy9hbHBoYWxpbnV4LmggKFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQpOiBFeHBhbmQgdG8gNDA5Ni4KLQotVHVlIEp1biAgMSAxNzo1Nzo1OCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWl0Y2hlbGxAbjAyLmFjbC5sYW5sLmdvdj4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfU1VCKTogTmV3IHJlbG9jYXRpb24uCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNUKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogbGliYmZkLmg6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbi4KLQkoVVNFX1JFTCk6IEFkanVzdCBmb3IgbmV3IGNvbnZlbnRpb25zLgotCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19TVUIuCi0JKG1pcHNfcik6IEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwgTUlQU19HT1RfT0ZTVCwKLQlhbmQgTUlQU19HT1RfRElTUC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rLCBub3Qgc2hfaW5mbywgZm9yIGEKLQkuTUlQUy5jb250ZW50IHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFRyZWF0IGFsbCBzZWN0aW9ucyB0aGF0IGJlZ2luCi0Jd2l0aCAuTUlQUy5jb250ZW50IGFzIC5NSVBTLmNvbnRlbnQgc2VjdGlvbnMuICBTZXQKLQlTSEZfTU5JUFNfTk9TVFJJUCBmb3Igc3VjaCBzZWN0aW9uLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSB0byBtaXBzX2luZm9fdG9faG93dG9fcmVsYS4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19yKTogIEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwKLQlNSVBTX0dPVF9PRlNULCBhbmQgTUlQU19HT1RfRElTUC4KLQotV2VkIEp1biAgMiAxMTo1MToxMiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHZtcy1taXNjLmMgKF9iZmRfdm1zX2hhc2hfbmV3ZnVuYyk6IEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZAotCXZhcmlhYmxlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEF2b2lkIGFtYmlnb3VzCi0JYGVsc2UnLgotCi0xOTk5LTA1LTMwICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWluc3RhdGUgY2hhbmdlIG9mCi0JMTk5My0wMy0yNSAoISEpLiAgVGFrZSBpbnRvIGFjY291bnQgdGhlIGJpdG1hc2tzIGZvciB0aGUgcmVsb2Mgc28KLQl0aGUgYWRkZW5kIGRvZXMgbm90IG92ZXJmbG93IGludG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmQuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBbWVuZCBwcm90b3R5cGUgZm9yCi0JYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIC4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tb2FiaS5jIChOVU1fRUxFTSk6IE5ldyBtYWNybzogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mCi0JZWxlbWVudHMgaW4gYSBmaXhlZCBzaXplZCBhcnJheS4KLQkoQVJNX0VMRl9BQklfVkVSU0lPTik6IERlZmluZS4KLQkoQVJNX0VMRl9PU19BQklfVkVSU0lPTik6IERlZmluZS4KLQkoUl9BUk1fVEhNX0FCUzUpOiBGaXggcmlnaHRzaGlmdCBhbmQgc2l6ZS4KLQkoUl9BUk1fVEhNX1BDMjIpOiBGaXggc2l6ZS4KLQkoUl9BUk1fUExUMzIpOiBEZWZpbmUgSG93dG8uCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IExvY2F0ZSBhIGhvd3RvIGJhc2VkIG9uIGEgcmVsb2MKLQludW1iZXIuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgbmVjZXNzYXJ5LgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogQ2hhbmdlIHR5cGUgb2YgZmllbGQgYmZkX3JlbG9jX3ZhbCB0bwotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcFtdKTogQWRkIGVudHJpZXMgZm9yIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCWFuZCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0KLQkqIGVsZmFybS1uYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShlbGYzMl9hcm1faW5mb190b19ob3d0b19yZWwpOiBSZW5hbWUgdG8gZWxmMzJfYXJtX2luZm9fdG9faG93dG8uCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCi0JKiBlbGYzMi1hcm0uaCAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmV3IGZpZWxkOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF9jcmVhdGUpOiBJbml0aWFsaXNlIG5ldyBmaWVsZCB0byB6ZXJvLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQgbmV3IHBhcmFlbXRlcjoKLQlub19waXBlbGluZV9rbm93bGVkZ2UuICBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gaW5pdGlhbGlzZSB0aGUgZmllbGQKLQlpbiB0aGUgZ2xvYmFscyBkYXRhIHN0cnVjdHVyZS4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IGFkZCBpbiBwaXBlbGluZSBvZmZzZXQgaWYKLQlub19waXBlbGluZV9rbm93bGVkZ2UgaXMgZmFsc2UgYW5kIHRoZSBiaW5hcnkgaXMgZnJvbSBhbiBvbGQKLQl0b29sY2hhaW4uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2RhdGEpOiBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhbiBhdHRlbXB0IGlzCi0JbWFkZSB0byBsaW5sIHRvZ2V0aGVyIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gY29kZS4KLQkoZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogTmV3IGZ1bmN0aW9uOiAgSW5pdGlhbGlzZSB0aGUKLQlFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgRUxGIHByb2dyYW0KLQloZWFkZXIuCi0JKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZDoKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycy4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lIHRvCi0JTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShlbGZOTl9iZWQpOiBJbml0aWFsaXNlIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIGZpZWxkLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogU2V0IHRoZSBFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMKLQl0byB6ZXJvLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDYWxsCi0JZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgaWYgZGVmaW5lZC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgd2hldGhlciBnZXR1aWQgYW5kIGdldGdpZCBleGlzdC4KLQkqIGFyY2hpdmUuYzogRGVmaW5lIGdldHVpZCBhbmQgZ2V0Z2lkIGFzIG1hY3JvcyBpZiBIQVZFX0dFVFVJRCBvcgotCUhBVkVfR0VUR0lEIGFyZSBub3QgZGVmaW5lZCwgcmVzcGVjdGl2ZWx5LgotCShiZmRfd3JpdGVfYXJtYXApOiBEb24ndCBzcGVjaWFsIGNhc2Ugb24gX1dJTjMyIGZvciBnZXR1aWQgYW5kCi0JZ2V0Z2lkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBhY19jdl9mdW5jX2dldHt1Z31pZCBmb3IgKi0qLXdpbmRvd3MqLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGVsZjMyLWk5NjAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX2k5NjAuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZiZmRfZWxmMzJfaTk2MF92ZWMuCi0JKiBjb25maWcuYmZkIChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9pOTYwX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWk5NjAubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1pOTYwLmMuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yCi0JUl9BUk1fUExUMzIuCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IEZpbmQgZW50cmllcyBpbiB0aGUKLQllbGYzMl9hcm1faG93dG9fdGFibGUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgdGhlIGVudHJ5IGNhbm5vdCBiZQotCWNvbXB1dGVkIHNpbXBseS4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIGxvb2t1cCBmb3IKLQlCRkRfUkVMT0NfQVJNX1BMVDMyLgotCi0xOTk5LTA1LTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogYmZkL2VsZjMyLWFybS5oIChlbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlIGFib3ZlIGZ1bmN0aW9uIGFzIHRoZQotCWNvbnN0cnVjdG9yIGZvciBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQXZvaWQgY3Jhc2ggd2hlbiB0aGVyZSBpcyBubyBvdXRwdXQKLQlzZWN0aW9uLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBwYXJhbWV0ZXIgaC4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIHN5bWJvbCBoYXNoIGVudHJ5IHRvIGFib3ZlCi0Jcm91dGluZS4KLQkoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2ssIGVsZjMyX2FybV9jaGVjayByZWxvY3MpOiBDb3JyZWN0Ci0JY29tbWVudHMuCi0KLTE5OTktMDUtMjUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdAotCWJhc2UgZmlsZSBlbnRyaWVzIGZvciBwYy1yZWxhdGl2ZSB2YWx1ZXMuCi0KLTE5OTktMDUtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBXaGVuIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNlY3Rpb24KLQl0byByZWZsZWN0IHRoZSBub3QtdGhlcmUgc2VjdGlvbiBDX1NFQ1RJT04gc3ltYm9scyByZWZlciB0bywKLQljaGFuZ2UgdGhlIHN5bWJvbCBjbGFzcyB0byBDX1NUQVQgYXMgdGhlIHNlY3Rpb24gaXMgbm93IHJlYWxseQotCXRoZXJlLgotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5kbyBjaGFuZ2Ugb2YKLQkxOTk5LTAzLTI1LgotCi1Nb24gTWF5IDE3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogQ2hhbmdlZAotCUZfUElDX0lOVCB0byBGX1BJQy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkZWQgRl9BUk1fMmEsIGFuZAotCUZfQVJNXzNNIGxhYmVscy4gIENoYW5nZWQgRl9QSUNfSU5UIHRvIEZfUElDLgotCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZWluc3RhdGUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NQ09SRV9SVkEpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZW1vdmUgZGVmaW50aW9uLgotCShtY29yZV9jb2ZmX2hvd3RvKTogQWRkIElNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBNYXAgQkZEX1JFTE9DX1JWQSB0bwotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8pOiBBZGQgc3BlY2lhbCBwcm9jZXNzaW5nIGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBzdXBwb3J0IGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKiBlbGYzMi1tY29yZSAobWNvcmVfZWxmX2hvd3RvXyk6IEFkZCBSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBNYXAgQkZEX1JFTE9DX1JWQSB0bwotCVJfTUNPUkVfUkVMQVRJVkUuCi0JKG1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVsZXRlIHJlZHVuZGFudCBjYXNlIGxhYmVscy4KLQotRnJpIE1heSAxNCAxMDo1OTo1NSAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBvcGVyYXRvcgotCXByZWNlZGVuY2UgYmV0d2VlbiBiaXQtYW5kIGFuZCBjb21wYXJpc29uLgotCi1UaHUgTWF5IDEzIDA5OjQ1OjIzIDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04NiotKi1ydGVtcyosIG02OGsqLSotcnRlbXMqKTogQWRkZWQgdG8KLQlsaXN0IG9mIHRhcmdldCBmb3JtYXRzICh0YXJnX3NlbHZlY3MpLgotCShpWzM0NTZdODYqLSotcnRlbXNlbGYqLCBtaXBzKmVsLSotcnRlbXMqKTogTmV3IHRhcmdldHMuCi0JKHBvd2VycGNsZSotKnJ0ZW1zKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfYXJtYXApOiBnaXZlIHRoZSBzeW10YWIgZWxlbWVudCBhCi0JcmVhc29uYWJsZSBtb2RlIHVudGlsICJhciB4IiBpcyBzbWFydCBlbm91Z2ggdG8gc2tpcCBpdCAoZml4ZXMKLQlnY2MvbGliZ2NjLmEgYnVpbGRzIG9uIG1pcHMtZWNvZmYgdGFyZ2V0cwotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IEV4cGxhaW4gaG93IENPTURBVHMgYXJlIHN1cHBvc2VkCi0JdG8gd29yay4gIEhhY2sgdG8gc3VwcG9ydCBNUyBpbXBvcnQgbGlicmFyaWVzLCB3aGljaCB1c2UgZGlmZmVyZW50Ci0JQ09NREFUIHR5cGVzIHRoYW4gR05VLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENfU0VDVElPTiBzeW1ib2xzIGFyZSBsb2NhbDsgdGhleSByZWZlcgotCXRvIGltcGxpZWQgemVyby1sZW5ndGggc2VjdGlvbnMgKHNlZSBwZWljb2RlIGJlbG93KQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFByb3Blcmx5IHJlYWQgbG9uZyBNUwotCWZpbGVuYW1lIHN5bWJvbHMsIHdoaWNoIHVzZSBvbmUgKm9yIG1vcmUqIGF1eGVudHMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogZGl0dG8KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3N5bV9pbik6IEJ1aWxkIHRoZSBpbXBsaWVkIHplcm8tbGVuZ3RoCi0Jc2VjdGlvbnMKLQotVHVlIE1heSAxMSAxNTo1MTo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUpOiBNYWtlIHBhcnRpYWxfaW5wbGFjZSBmYWxzZQotCWZvciBhbGwgcmVsb2NhdGlvbnMuCi0KLTE5OTktMDUtMTAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiAgU3RhdGljCi0JaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLQkqIGNvZmYtYXJtLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChhcm1wZV9saXR0bGVfdmVjKTogUmVtb3ZlIGNvZmYtYXJtLmxvLgotCShhcm1wZV9iaWdfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIGZvciAucmVsLiBhcyBzdGFydCBvZiByZWwKLQlzZWN0aW9uLCBub3QganVzdCAucmVsLiAgU2FtZSBmb3IgLnJlbGEuCi0KLTE5OTktMDUtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVwbGFjZSBhc3NlcnQgYWJvdXQKLQllbmRpYW5pc20gd2l0aCBhbiBlcnJvciBtZXNzYWdlLgotCi1UaHUgTWF5ICA2IDE3OjA5OjA5IDE5OTkgIEZyZWQgRmlzaCAgPGZuZkBiZS5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX2FiYnJldnMpOiBDaGFuZ2UgY2FzdCBvZiBkd2FyZl9hYmJyZXZfYnVmZmVyCi0JYXNzaWdubWVudCBmcm9tICJ1bnNpZ25lZCBjaGFyICoiIHRvICJjaGFyICoiLgotCShkZWNvZGVfbGluZV9pbmZvKTogTGlrZXdpc2UgZm9yIGR3YXJmX2xpbmVfYnVmZmVyIGFzc2lnbm1lbnQuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEFkZCBvbmUgdG8KLQlhZGRyZXNzIG9mIEFSTV9SVkEzMiB0aHVtYiBmdW5jdGlvbnMuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcuCi0JKGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGVsZjMyX202OGtfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoQ1BVMzJfRkxBRyk6IERlZmluZS4KLQkoUExUX0NQVTMyX0VOVFJZX1NJWkUpOiBEZWZpbmUuCi0JKGVsZl9jcHUzMl9wbHQwX2VudHJ5KTogRGVjbGFyZS4KLQkoZWxmX2NwdTMyX3BsdF9lbnRyeSk6IERlY2xhcmUuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGNwdTMyIHBsdCBlbnRyaWVzLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogUmVtb3ZlIGRlZmluaXRpb24uCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQotTW9uIE1heSAgMyAwOToyNDo0OSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZml4dXBfZm9ybWF0cyk6IEZpeCBjb21tZW50cyBmb3IgUl9TSE9SVF9QQ1JFTF9NT0RFCi0JYW5kIFJfTE9OR19QQ1JFTF9NT0RFLgotCi0xOTk5LTA0LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvcy4KLQotRnJpIEFwciAyOCAxNjozNjoxOSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbmNsdWRlIHJlbG9jYXRpb24gYWRkZW5kCi0JaW4gcmVsb2NhdGlvbiBjYWxjdWxhdGlvbi4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlIHJlbG9jcy4KLQotMTk5OS0wNC0yMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogU2NyYXAgdGhlCi0JaW5jb3JyZWN0IHVzZSBFRl9NSVBTX3h4QklUUFRSUy4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGUgaW5zbi4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTcgMjA6NTU6MTUgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmVtb3ZlIEFSTTI2RCB0cmFuc2Zvcm0uCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIEFSTTI2RCB0cmFuc2Zvcm0uICBPbmx5Ci0JY2hhbmdlIHRvIEFSTTI2RCBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQotMTk5OS0wNC0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgRm9yIFJfQVJNX1RITV9BQlM1LAotCXJlZmV0Y2ggYWRkZW5kIGlmIFVTRV9SRUwsIGFkZCBtYW55IGNvbW1lbnRzIHJlZ2FyZGluZyBjdXJyZW50IHN0YXRlLgotCUZvciBSX0FSTV9USE1fUEMyMiwgcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgc2ltcGxpZnkuCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBGb3IgUl9BUk1fVEhNX0FCUzUsIGZpeAotCXNpemUgYW5kIHJpZ2h0c2hpZnQuICBGb3IgUl9BUk1fVEhNX1BDMjIsIGZpeCBiaXRzaXplLgotCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogRGl0dG8uCi0KLVdlZCBBcHIgMTQgMTQ6MzM6MDggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFplcm8gYGRlYnVnJy4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTEzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotVHVlIEFwciAxMyAyMToyNzoxOSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IHJvdXRpbmUuCi0JKEEyVDNfT0ZGU0VUKTogRGVmaW5lLgotCShUMkEzX09GRlNFVCk6IERlZmluZS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBFbWl0IGJhc2UgZmlsZSBlbnRyaWVzIGZvciBpbnRlcndvcmtpbmcKLQlzdHVicy4KLQotMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgZm9yCi0JcmVsb2NzIDE3IHRocm91Z2ggMTkuCi0KLVN1biBBcHIgMTEgMDE6MjU6MTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oOiBSZW1vdmUgZm5tYXRjaC5oLgotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDYWxsIGJhY2sgdG8gbGQKLQlpbnN0ZWFkIG9mIGNhbGxpbmcgZm5tYXRjaC4KLQotCSogY29uZmlnLmJmZCAoaT84Ni0qLWJlb3NlbGYpOiBJbmNsdWRlIHBlIHZlY3MuCi0KLVN1biBBcHIgMTEgMDE6MTQ6MDYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFsbG93IC5wbHQKLQl0byBnbyBtaXNzaW5nLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAotCXdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgZHluYW1pYyBzeW1ib2wgcmVmZXJlbmNlcy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQotU2F0IEFwciAxMCAxNToxMjowOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IE5ldyBmdW5jdGlvbiBtb3ZlZCBmcm9tCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogLi4uIGhlcmUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBVcGRhdGUuCi0KLTE5OTktMDQtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jOiBGaXggaW5jb3JyZWN0IGNhbGxzIHRvIGJmZF9jaGVja19vdmVyZmxvdy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGNwdS1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQkqIGVsZjMyLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgotCSogcGUtbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZSB0YXJnZXQuCi0JKiBwZWktbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZWkgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgYXJjaGl0ZWN0dXJlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmNvZGUuaDogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLXBlIHRhcmdldHMuCi0JKiBlbGYuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLWVsZiB0YXJnZXQuCi0JKiByZWxvYy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgcmVsb2NzLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQotMTk5OS0wNC0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yCi0JUl9BUk1fWFBDMjUgYW5kIFJfQVJNX1RITV9YUEMyMi4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IFJlbW92ZSByZWR1bmRhbnQgZW50cmllcy4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN5c2RlcC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQotMTk5OS0wNC0wNiAgQ2hyaXMgVG9yZWsgIDx0b3Jla0Bic2RpLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogQWRkIGFkZHJzaXplIHBhcmFtZXRlci4gIENoYW5nZQotCWFsbCBjYWxsZXJzLiAgUmV3cml0ZSBjb21wbGV0ZWx5LgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogUmV3cml0ZSBvdmVyZmxvdyBjaGVja2luZy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNC0wNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEdhYnJpZWwgUGF1YmVydCA8cGF1YmVydEBpcmFtLmVzPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IFNldCBSX1BQQ19HT1QxNl9MTywKLQlSX1BQQ19QTFQxNl9MTyBhbmQgUl9QUENfU0VDVE9GRl9MTyB0byBiZSBjb21wbGFpbl9vdmVyZmxvd19kb250LgotCVNldCBSX1BQQ19QTFQxNl9IQSwgUl9QUENfU0VDVE9GRl9IQSBhbmQgUl9QUENfRU1CX05BRERSMTZfSEEgdG8KLQloYXZlIGEgcmlnaHRzaGlmdCBvZiAxNiBhbmQgdXNlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLgotCSogcHBjYm9vdC5jIChwcGNib290X3ZlYyk6IFVzZSBsaXR0bGUgZW5kaWFuIHJvdXRpbmVzIGZvcgotCWhlYWRlcnMuCi0KLQkqIGVsZi5jIChlbGZjb3JlX3N0cm5kdXApOiBPbmx5IGRlZmluZSBpZiBpdCB3aWxsIGJlIHVzZWQuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxheF9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgaXJlbAotCWFuZCBpcmVsZW5kLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KLQkocHBjX2VsZl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCUZyb20gQmVybmQgTml0emxlciA8bml0emxlckBrYWdjcGQwMS5hZzAxLmtvZGFrLkNPTT46Ci0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IEFjY2VwdCBcciBpbiBzeW1ib2wgZGVmaW5pdGlvbnMuCi0JKHNyZWNfb2JqZWN0X3ApOiBTZXQgSEFTX1NZTVMgaWYgd2Ugc2F3IGFueSBzeW1ib2xzLgotCShzeW1ib2xzcmVjX29iamVjdF9wKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMDQgIERvbiBCb3dtYW4gPGRvbkBwaXhzY2kuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbWlwcyplbC0qLXZ4d29ya3MqIGFuZCBtaXBzKi0qLXZ4d29ya3MqLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYxLmMgKHBhcnNlX2xpbmVfdGFibGUpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBsYXN0X3BjIGFuZAotCWxhc3RfbGluZS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyKTogRGVjbGFyZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgaS4KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgdmFsLgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29mZi1hcm0uYzogQWxsb3cgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfVU5ERVJTQ09SRSBhbmQgVVNFUl9MQUJFTF9QUkVGSVguCi0JKiBwZS1hcm0uaDogQWxsb3cgcHJldmlvdXMgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBwZWktYXJtLmg6IEFsbG93IHByZXZpb3VzIGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX0xJVFRMRV9TWU0gYW5kIFRBUkdFVF9CSUdfU1lNLgotCSogZXBvYy1wZS1hcm0uYzogTmV3IGZpbGUuICBTdXBwb3J0IGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGVwb2MtcGVpLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGVpIHRhcmdldC4KLQotMTk5OS0wMy0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzZWN0aW9uCi0Jc3ltYm9scyBhcmUgZ2VuZXJhdGVkIGZvciBjb250ZW50LWxlc3Mgc2VjdGlvbnMgd2hpY2ggYXJlCi0Jbm90IG1hcHBlZCB0byB0aGUgb3V0cHV0IGZpbGUuCi0KLQkqIGxpbmtlci5jOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLQkqIGVsZmxpbmsuaDogUmVwbGFjZSBkaXJlY3QgcmVmZXJlbmNlcyB0byBmaWVsZHMgaW4gQkZEIHN0cnVjdHVyZQotCXdpdGggYWNjZXNzb3IgbWFjcm9zLgotCi0xOTk5LTAzLTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmJmZDogRWxpbWluYXRlIHJlZHVuZGFuY3kgaW4gY2hlY2tzIGZvciBMaW51eC9BUk0uCi0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFRha2UgdGhlIHJpZ2h0c2hpZnQgaW50bwotCWFjY291bnQgd2hlbiBhZGp1c3Rpbmcgc2VjdGlvbiBzeW1ib2xzIGR1cmluZyBhIHBhcnRpYWwgbGluay4KLQotMTk5OS0wMy0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1zcGFyYy5jIChzdHJ1Y3QgY29mZl9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZAotCSAgJ2JmZF9yZWxvY192YWwnIHRvIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4KLQkqIGVsZi1tMTAyMDAuYyAoc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYtbTEwMzAwLmMgKHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItYXJjLmMgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMTB2LmMgKHN0cnVjdCBkMTB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZDMwdi5jIChzdHJ1Y3QgZDMwdl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWZyMzAuYyAoc3RydWN0IGZyMzBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1tMzJyLmMgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc2guYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXNwYXJjLmMgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi12ODUwLmMgKHN0cnVjdCB2ODUwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmNjQtc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1uYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGZhcm0tb2FiaS5jIChzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCk6IERpdHRvLgotCi0xOTk5LTAzLTE3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZWQgdGhpcwotCWZ1bmN0aW9uIHNvIHNvdXJjZS1sZXZlbCBhc3NlbWJseSB3b3Jrcy4gIElmIG11bHRpcGxlIE5fU09zCi0JYXJlIHNlZW4gd2l0aG91dCBhbmQgTl9GVU5zLCBjcmVhdGUgYW4gaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JYSBOVUxMIGZ1bmN0aW9uIG5hbWUuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSkgQWxsb3cgbWVyZ2luZwotCW9mIGNlcnRpYW4gc2ltaWxhciBjcHVzLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUFkZCB0aGUgNTAwMC4gIENoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgNTQwMCB0byBtaXBzNC4KLQkoZWxmX21pcHNfbWFjaCk6IEFkZCByNTAwMC4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUtaTk2MC5jIChzY2FuX2k5NjBfbWFjaCk6IFJlY29nbml6ZSBpOTYwOmthX3NhIGFuZCBpOTYwOmtiX3NiLgotCi0xOTk5LTAzLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2VuZXJhdGUgd2FybmluZyBhYm91dAotCWh1Z2UgZmlsZSBvZmZzZXRzIGZvciBhbnkgc2VjdGlvbiB0aGF0IHdpbGwgb2NjdXB5IGZpbGUgc3BhY2UsIG5vdAotCWp1c3QgdGhvc2UgdGhhdCBhcmUgbG9hZGFibGUuCi0KLTE5OTktMDItMjQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUgYWZ0ZXIgTmljayBDbGlmdG9uJ3MgRmViIDE3IGNoYW5nZXMuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYzogQWRkIHBwY19lbGZfcmVsYXhfc2VjdGlvbigpIGZvciB0aGUgbGQgb3B0aW9uIG1wYzg2MGMwLgotCi1Nb24gRmViIDIyIDE4OjI2OjUxIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmg6IFJldmVydCBhbGwgY2hhbmdlcyBzaW5jZSBGZWIgMTYuICBJbnN0ZWFkOgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmbGFnIGlmCi0JYXBwcm9wcmlhdGUuICBDb3B5IGl0IHRvIHZlcnNpb24gc3ltYm9scy4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmb3Igbm9uIEVMRgotCXN5bWJvbHMgaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmb3Igd2Vha2RlZgotCXN5bWJvbCBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBtYXJrZWQgYXMgdW5kZWZpbmVkLCBhbmQKLQloYXMgbm8gbm9ud2VhayByZWZlcmVuY2VzLCBtYXJrIGl0IGFzIHdlYWsgdW5kZWZpbmVkLgotCi1GcmkgRmViIDE5IDE2OjAxOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgZHluYW1pYwotCWRlZmluaXRpb24gd2l0aCBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbCwgc2V0IE5FRURTX1BMVCBpZiBpdCBpcyBhCi0JZnVuY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNvcHkgdGhlIG90aGVyIGZpZWxkIGlmIHdlCi0JYXJlIG92ZXJyaWRkaW5nLgotCi1UaHUgRmViIDE4IDE4OjA3OjQzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG8gbm90IG1lcmdlIGFueSBzeW1ib2wgZnJvbSBhCi0Jc2hhcmVkIG9iamVjdCB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLgotCi0xOTk5LTAyLTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jOiBTZXQgcGFydGlhbF9pbnBsYWNlIGJhY2sgdG8gZmFsc2UuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogUmUtZW5hYmxlLgotCShVU0VSX0xBQkVMX1BSRUZJWCk6IFNldCB0byAiXyIuCi0KLQlUaGUgZm9sbG93aW5nIHBhdGNoZXMgYXJlIGZyb206IFNjb3R0IEJhbWJyb3VnaAotCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTV9BUk02X05FVEJTRCk6IFNldCB0byAxNDMuCi0KLQkqIHJlbG9jLmM6IEFkZCBBUk0gUElDIHJlbG9jczogICBCRkRfUkVMT0NfQVJNX0dPVDEyLAotCUJGRF9SRUxPQ19BUk1fR09UMzIsIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCBCRkRfUkVMT0NfQVJNX0NPUFksCi0JQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLQlCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiwgQkZEX1JFTE9DX0FSTV9HT1RQQy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogU2V0IHBhcnRpYWxfaW5wbGFjZSB0bwotCSd0cnVlJyBhcyBSRUwgcmVsb2NzIGFyZSBub3cgYmVpbmcgdXNlZC4gIEFkZCBuZXcgUElDIHJlbG9jczoKLQlSX0FSTV9DT1BZLCBSX0FSTV9HTE9CX0RBVCwgUl9BUk1fSlVNUF9TTE9ULCBSX0FSTV9SRUxBVElWRSwKLQlSX0FSTV9HT1RPRkYsIFJfQVJNX0dPVFBDLCBSX0FSTV9HT1QzMiwgUl9BUk1fUExUMzIuCi0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGJ5dGUgb3JkZXIKLQlvZiB0YXJnZXRzLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IENoYW5nZSBwYXJhbWV0ZXJzIHNvIHRoYXQgZW50aXJlCi0JcmVsb2MgaXMgcGFzc2VkLiAgQWRkIHN1cHBvcnQgZm9yIFBJQyByZWxvY3MuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUGFzcyBlbnRpcmUgcmVsb2MgdG8KLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4KLQkoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBuZXcgUElDIHJlbG9jcy4KLQkoZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKEVMRl9NQVhQQUdFX1NJWkUpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogRGVmaW5lLgotCShlbGZfYmFja2VuZF93YW50X2dvdF9wbHQpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSk6IERlZmluZS4KLQotV2VkIEZlYiAxNyAxMjowMjoyNiAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSByZWdpbmZvCi0Jc2VjdGlvbnMgU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1XZWQgRmViIDE3IDEyOjA3OjIzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmYXJtLW9hYmkuYyAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMsCi0JYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0JYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVmaW5lIHRvIGF2b2lkIGNsYXNoCi0Jd2l0aCBlbGZhcm0tbmFiaS5jLgotCi0JKiBlbGYzMi1hcm0uaDogRG9uJ3QgZGVjbGFyZSBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLQkoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIsIGVsZjMyX2FybV90b190aHVtYl9zdHViLAotCWVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE1ha2UgdGhlbSBzdGF0aWMuCi0KLVR1ZSBGZWIgMTYgMjI6NDQ6MzcgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBBZGQgcGZsYWdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgRG8gbm90IG1lcmdlIGEgZGVmaW5pdGlvbiBmcm9tIGEgc2hhcmVkIG9iamVjdCB3aXRoIGEKLQl3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIG9yCi0Jc2l6ZSBpZiB0aGUgb2xkIHN5bWJvbCBvdmVycmlkZXMgdGhlIG5ldyBvbmUuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1Nb24gRmViICA4IDExOjE4OjE0IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChyZWxvY19tYXApOiBVc2UgdGhlIGNvcnJlY3QgdHlwZXMgZm9yIHRoZSBzdHJ1Y3QKLQlmaWVsZHMgaW5zdGVhZCBvZiB1bnNpZ25lZCBjaGFyLgotCi1GcmkgRmViICA1IDAwOjIyOjM2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBGZWIgIDQgMjI6MzA6MTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIFJlbW92ZSBBTV9DWUdXSU4zMi4KLQlDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVCBhbmQgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIHRvIHVzZXMgb2YgQUNfREVGSU5FLgotCSogYWNpbmNsdWRlLm00OiBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBjb25maWcuaW46IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi0xOTk5LTAyLTA0ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IGRvbid0IGNhbGwgZnJlYWQgZm9yIHplcm8gYnl0ZXMuICBUaGlzCi0JY292ZXJzIHVwIGEgYnVnIChvciBtaXN1c2Ugb2YgYmZkKSB0aGF0J3MgZXhwb3NlZCBieSBTb2xhcmlzLgotCi1UaHUgRmViICA0IDEyOjM4OjEwIDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbnN1cmUgdGhhdCB0aGUgdGFyZ2V0Ci0Jb2YgYSBqdW1wIGlzIGluIHRoZSBjdXJyZW50IDI1NiBNQiByZWdpb24uCi0KLVRodSBGZWIgIDQgMTI6MTU6MzggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2hhbmdlIGxhc3QgcGF0Y2ggdG8gb25seQotCXRha2UgZWZmZWN0IGZvciB0aGUgYmluYXJ5IHRhcmdldC4KLQotV2VkIEZlYiAgMyAxOTo0MDoxMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DX0NUT1IuCi0KLVdlZCBGZWIgIDMgMTU6MDI6NDQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldyByb3V0aW5lLgotCi1UdWUgRmViICAyIDIxOjM4OjI4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IElmIHRoZSB0YXJnZXQgd2FzCi0JcHJldmlvdXNseSBzcGVjaWZpZWQsIGRvbid0IGNoZWNrIG90aGVyIHRhcmdldHMgd2hlbiBjaGVja2luZyBmb3IKLQlhbiBhcmNoaXZlIGZpbGUuCi0KLVR1ZSBGZWIgIDIgMTg6MTY6NDMgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIFJlbW92ZWQuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBSZW1vdmVkCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIE5ldy4KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgTmV3LgotCi1Nb24gRmViICAxIDE5OjQ5OjIxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1uZXdhYmkuYy4KLQkqIGVsZmFybS1vYWJpLmM6ICBSZW5hbWVkIGZyb20gZWxmMzItYXJtLW9sZGFiaS5jCi0JKiBNYWtlZmlsZS5hbTogIFVzZSBuZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbmV3IGZpbGVzLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQotMTk5OS0wMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEZlYiAgMSAxMjoyMTo0NyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotCWFuZCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLgotCi1Nb24gRmViICAxIDExOjQ2OjMxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZWxmMzItYXJtLW9sZGFiaS5sbyk6ICBOZXcuCi0JKGVsZjMyLWFybS1uZXdhYmkubG8pOiAgTmV3LgotCSogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZCAodGh1bWItKi1lbGYpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGFyZ191bmRlcnNjb3JlLgotCShhcm0tKi1lbGYpOiAgTGlrZXdpc2UuCi0JKGFybS0qLW9hYmkpOiAgTmV3LgotCSh0aHVtYi0qLW9hYmkpOiAgTmV3LgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYyk6ICBOZXcuCi0JKGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpOiAgTmV3LgotCSogZWxmMzItYXJtLW5ld2FiaS5jOiAgTmV3LgotCSogZWxmMzItYXJtLW9sZGFiaS5jOiAgTmV3LgotCSogZWxmMzItYXJtLmM6ICBSZW1vdmVkLgotCSogZWxmMzItYXJtLmg6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTE6NTI6MTIgMTk5OSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE9taXQgd2FybmluZ3MgZm9yCi0JdW5sb2FkYWJsZSBzZWN0aW9ucy4KLQotMTk5OS0wMS0zMSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS0qLXZ4d29ya3MqKTogQWRkIGFsaWFzZXMgdG8KLQlwb3dlcnBjeyxsZX0tKi1lYWJpLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocmVhZF91bnNpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkqIGR3YXJmMi5jIChyZWFkX3NpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotRnJpIEphbiAyOSAwMDo0NzoyMSAxOTk5ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogT25seSBhZGp1c3QKLQlwX2FsaWduIHdoZW4gbmVlZGVkLgotCi1UaHUgSmFuIDI4IDIwOjA1OjIyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJldHVybiBlYXJseSBmb3IgYQotCW5vbi1sb2FkYWJsZSBzZWN0aW9uLCBpbiBjYXNlIHRoZSBmaXJzdCBzZWN0aW9uIGlzIG5vbi1sb2FkYWJsZS4KLQlEb24ndCBzZXQgdGhlIGxvdyBsbWEgZm9yIGEgU0VDX05FVkVSX0xPQUQgc2VjdGlvbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0KLTE5OTktMDEtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9yZWxvY19tYXApOiBBZGQgUl9GUjMwX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9GUjMwX0dOVV9WVEVOVFJZIHJlbG9jcy4KLQotVGh1IEphbiAyOCAxMTowODoxNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogIFplcm8gc3ltcyB3aGljaCBhcmUKLQlwYXJ0IG9mIHNlY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBleGNsdWRlZC4KLQotV2VkIEphbiAyNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQgRl9QSUMKLQl0byBGX1BJQ19JTlQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlbW92ZWQgRl9BUk1fMmEgYW5kCi0JRl9BUk1fM00gbGFiZWxzLiAgQ2hhbmdlZCBGX1BJQyB0byBGX1BJQ19JTlQuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfaG93dG9fdGFibGUpOiBGaXggbmFtZSBvZiBSX0ZSMzBfNDgKLQlyZWxvY2F0aW9uLgotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2UgY29tcHV0ZWQgdmFsdWUgYXMgcmVzdWx0IG9mCi0JcmVsb2NhdGlvbi4KLQotMTk5OS0wMS0yNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEVtaXQgd2FybmluZyBmb3IKLQlodWdlIGZpbGUgb2Zmc2V0cyBkdWUgdG8gd2lkZWx5LWRpc3BlcnNlZCBzZWN0aW9uIExNQXMuCi0KLU1vbiBKYW4gMTggMDM6MzU6MzUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIG5vdCBEX1BBR0VELAotCWFsaWduIGZpcnN0IHNlY3Rpb24gdG8gbGFyZ2VzdCBzZWN0aW9uIGFsaWdubWVudCwgbm90IGZpcnN0Ci0Jc2VjdGlvbiBhbGlnbm1lbnQuCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLVR1ZSBEZWMgMjIgMTU6MjE6NDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgpOiAgRGVmaW5lLgotCSogYmZkLWluMi5oOiAgTGlrZXdpc2UuCi0JKiBjcHUtaTM4Ni5jIChiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCk6ICBOZXcuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jLGJmZC1pbjIuaCAoYmZkX21hY2hfbWlwczQxMTEpOiBOZXcuCi0JKiBjcHUtbWlwcy5jOiBBZGQgc3VwcG9ydCBmb3IgYW5kIGluZGVwZW5kZW50IDQxMTEuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX21hY2gpOiBFX01JUFNfTUFDSF80MTExIC0+IGJmZF9tYWNoX21pcHM0MTExLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWJmZF9tYWNoX21pcHM0MTExIC0+IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19hYmlfbmFtZSk6IE5ldy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ29tcGFyZSBFRl9NSVBTX0FCSSBmbGFncy4KLQotMTk5OC0xMi0xMiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlIYW5kbGUgYmZkX21hY2hfbWlwczQzMDAuCi0KLTE5OTgtMTItMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmM6IFJlbW92ZSBsZWFrZWQgZGV2ZWxvcG1lbnQgY29kZSBmcm9tIHBhdGNoCi0JMTk5OC0xMi0xMCBieSBSaWNoYXJkIEhlbmRlcnNvbi4KLQotMTk5OC0xMi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZmFpbCByZWxvY2F0aW9ucwotCWluIGRlYnVnIHNlY3Rpb25zIGZvciBzeW1ib2wgZGVmaW5lZCBleHRlcm5hbGx5LgotCi1UaHUgRGVjIDEwIDEwOjU4OjM4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgZm9yCi0JdGVraGV4X3ZlYy4KLQotMTk5OC0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IFNldCBzcmNfbWFzayBmaWVsZHMgdG8gMAotCXNpbmNlIHdlIGFyZSB1c2luZyBSRUxBcy4KLQotVHVlIERlYyAgOCAyMjoxNTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTQ08gT3BlbiBTZXJ2ZXIgUmVsZWFzZSA1IGNvcmUgZmlsZSBzdXBwb3J0LCBmcm9tIEpvdWtlIE51bWFuCi0JPGpudW1hbkBoaXNjb20ubmw+OgotCSogc2NvNS1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1zY28zLjJ2NSopOiBVc2Ugc2NvNS1jb3JlLmxvLgotCShzY281LWNvcmUubG8pOiBEZWZpbmUgU0NPNV9DT1JFIGluIENPUkVGTEFHLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShPUFRJT05BTF9CQUNLRU5EUyk6IEFkZCBzY281LWNvcmUubG8uCi0JKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzY281LWNvcmUuYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBzY281X2NvcmVfZGF0YSBmaWVsZCB0byB0ZGF0YS4KLQkqIHRhcmdldHMuYyAoc2NvNV9jb3JlX3ZlYyk6IEFkZCB0byB0YXJnZXQgbGlzdCBpZiBTQ081X0NPUkUuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTk6Mzg6NDIgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19IRUFERVJfRElSRU5ULgotCShocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaHBwYSotKi1tcGVpeCopOiBOZXcgaG9zdC4KLQkqIGhwdXgtY29yZS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4gIFVzZSBIQVZFX0RJUkVOVF9IIGFuZAotCWZyaWVuZHMgcmF0aGVyIHRoYW4ganVzdCBpbmNsdWRpbmcgPHN5cy9kaXIuaD4uCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgaHBwYV9wcml2X2xldmVsIGFuZCBhcHRvCi0JdGNfZGF0YS4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIGNvbXBfdW5pdCBmaWVsZC4KLQkob2JqX3NvbV9jb21waWxhdGlvbl91bml0KTogRGVmaW5lLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml4KTogRGVjbGFyZS4KLQkqIHNvbS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogQWRkIG5ldyBmaWVsZCBwcml2X2xldmVsLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGN1cnJlbnRfb2Zmc2V0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzZXR1cF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShzb21fb2JqZWN0X3ApOiBGb3IgRVhFQ0xJQk1BR0lDLCByZWFkIHRoZSBsc3QgaGVhZGVyLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBBZGQgY29tcGlsYXRpb25fdW5pdCBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSBvdXQgY29tcGlsYXRpb25fdW5pdC4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFNldCBwcml2X2xldmVsLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBzeW1ib2wgcHJpdl9sZXZlbC4KLQkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuICBTZXQKLQlwcml2X2xldmVsIGludG8gc3ltYm9sX3ZhbHVlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTY6MjE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hhbmdlIGNhbGwgdG8gbm9uZXhpc3RlbnQKLQl3YXJuaW5nIGZ1bmN0aW9uIHRvIGNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGluc3RlYWQuCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0UzMik6IENhc3QgdGhyb3VnaCB1bnNpZ25lZCBsb25nIGFuZCBsb25nIHRvCi0JYXZvaWQgYnVnIGluIG9sZCB2ZXJzaW9uIG9mIGdjYy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW1vdmUuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCi0xOTk4LTEyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBQQyByZWxhdGl2ZQotCXJlbG9jYXRpb25zIHRvIGluY2x1ZGUgb2Zmc2V0IG9mIDIgaW5jbHVkZWQgaW4gdGhlIGluc25zLCBhbmQgdGhlCi0Jb2Zmc2V0IG9mIHRoZSByZWxvY3Mgd2l0aGluIHRoZSBzZWN0aW9uLgotCi1XZWQgRGVjICAyIDE1OjAzOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBEYXZpZCBUYXlsb3IKLQk8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+LCBFZGl0aCBFcHN0ZWluCi0JPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiwgSmltIEJsYW5keQotCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4sIGFuZCBFbGVuYSBaYW5ub25pCi0JPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IHRvIG1lcmdlIGluCi0JY2hhbmdlcyBvcmlnaW5hbGx5IG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZwotCWVudHJpZXMuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbHQgdXNpbmcgbGF0ZXN0Ci0JYXV0b21ha2UgbWFjcm8gbGlicmFyeS4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IHRoaXMgZnVuY3Rpb24gbm93Ci0JdW5kZXJzdGFuZHMgSFBVWCAxMC4zMCB0aHJlYWQgaW5mby4gWWVzLCB0aGUgdGhyZWFkIHN0YWNrcyBjYW4gYmUKLQlmb3VuZCBpbiB0aGUgY29yZWZpbGUhIEFsc28sIGluIGhwdXhfY29yZV9jb3JlX2ZpbGVfcCwgaWYgd2UKLQllbmNvdW50ZXIgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLCBkb24ndCBwdW50LiAgSW5zdGVhZCwKLQlqdXN0IHNraXAgaXQuICBBbHNvLCBjb3VudCB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIG9mIGtub3duIHR5cGUKLQl0aGF0IHdlIGVuY291bnRlci4gIElmIHdlIGVuY291bnRlciBhdCBsZWFzdCBvbmUgZ29vZCBvbmUsIHRoZW4KLQl3ZSdsbCBkZWNsYXJlIHRoYXQgdGhlIGZpbGUgaXMgYSBjb3JlIGZpbGUuICBJZiB3ZSBlbmNvdW50ZXIgYW55Ci0JdW5rbm93biBvbmVzIGJ1dCBzb21lIGtub3duIG9uZXMsIHRoZW4gd2UnbGwgaXNzdWUgYSB3YXJuaW5nIChidXQKLQlzdGlsbCBkZWNsYXJlIGl0IHRvIGJlIGEgY29yZSBmaWxlKS4gQWxzbywgY29ycmVjdGx5IGRlY2lkZSB3aGVuIGEKLQlmaWxlIGlzIG5vdCBhIGNvcmUuCi0JKFBST0NfSU5GT19IQVNfVEhSRUFEX0lEKTogZGVmaW5lIGlmIENPUkVfQU5PTl9TSE1FTSBkZWZpbmVkLgotCShDT1JFX0FOT05fU0hNRU0pOiBkZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGhwdXhfY29yZV9zdHJ1Y3QpOiBhZGQgbWVtYmVycyBsd3BpZCBhbmQgdXNlcl90aWQuCi0JKGNvcmVfa2VybmVsX3RocmVhZF9pZCwgY29yZV91c2VyX3RocmVhZF9pZCk6IG5ldyBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogdXNlIGJmZF9hbGxvYyB0byBhbGxvY2F0ZSByb29tIGZvciBhIGNvcHkgb2YKLQl0aGUgbmFtZSBiZWZvcmUgc3RvcmluZyBpdCBpbiB0aGUgYmZkLgotCShocHV4X2NvcmVfY29yZV9maWxlX3ApOiBoYW5kbGUgdGhyZWFkcy4KLQotCSogbGliaHBwYS5oIChHRVRfRklFTEQpOiBwcm90ZWN0IGFnYWluc3QgcmVkZWZpbml0aW9uLgotCShIUFBBX1dJREUpOiBkZWZpbmUuCi0JKEdFVF9GSUVMRCk6IGRlZmluZS4KLQkoR0VUX0JJVCk6IGRlZmluZS4KLQkoTUFTSyk6IGRlZmluZS4KLQkoQ0FURU5BVEUpOiBkZWZpbmUuCi0JKEVMRVZFTik6IGRlZmluZS4KLQkoc2lnbl9leHRlbmQpOiByZWRlZmluZS4KLQkoYXNzZW1ibGVfNik6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTIpOiByZXdyaXRlLgotCShhc3NlbWJsZV8xNik6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTZhKTogZGVmaW5lLgotCShhc3NlbWJsZV8xNyk6IHJld3JpdGUuCi0JKGFzc2VtYmxlXzIyKTogZGVmaW5lLgotCi0xOTk4LTEyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IFVzaW5nIHNpZ25lZAotCXJlbG9jYXRpb25zIGZvciBzaWduZWQgdmFsdWVzLgotCi1TdW4gRGVjICA2IDE2OjMwOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwc2JzZC5jIChNWShzZXRfYXJjaF9tYWNoKSk6IE1ha2Ugc3RhdGljLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBGb3IgYmZkX2FyY2hfbWlwcywgdXNlCi0JYmZkX21hY2hfbWlwcyogbWFjcm9zIHJhdGhlciB0aGFuIHNpbXBsZSBudW1iZXJzLgotCi0JQ09GRiB3ZWFrIHN5bWJvbCBzdXBwb3J0LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWFyayBFbGJyZWNodAotCTxzbm93YmFsbDNAdXNhLm5ldD46Ci0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSBDX1dFQUtFWFQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBbHdheXMgaW5pdGlhbGl6ZSB0aGUKLQlpbmNsdWRlc19waGRycyBmaWVsZC4KLQotCSogZWxmbGluay5oIChlbGZfZml4X3N5bWJvbF9mbGFncyk6IENoZWNrIGZvciBjYXNlIHdoZXJlIGEgbm9uLUVMRgotCWZpbGUgZGVmaW5lcyBhIHN5bWJvbCBmaXJzdCBtZW50aW9uZWQgaW4gYW4gRUxGIGZpbGUuCi0KLQkqIGJmZC1pbi5oOiBBbHdheXMgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBhbmQgQkZEX0hPU1RfVV82NF9CSVQgaWYKLQlwb3NzaWJsZSwgcmF0aGVyIHRoYW4gb25seSBpZiBCRkQ2NC4KLQkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBKdXN0IGNoZWNrIEJGRF9IT1NUX1VfNjRfQklULAotCW5vdCBfX0dOVUNfXy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ29ycmVjdCB0ZXN0IHRvIGF2b2lkCi0Jc3dpdGNoaW5nIHRvIDQgYnl0ZSBhZGRyZXNzZXMgYWZ0ZXIgc2VlaW5nIGEgc2Vjb25kIHNlY3Rpb24gd2hpY2gKLQlyZXF1aXJlcyAzIGJ5dGUgYWRkcmVzc2VzLiAgRnJvbSBKb2VsIFNjaGFudHoKLQk8am9lbC5zY2hhbnR6QGFyZ29zeXMuYm9laW5nLmNvbT4uCi0KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0KLTE5OTgtMTItMDQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCBsb2dpYyB0bwotCWRlY2lkZSB3aGV0aGVyIHRoZSBvdXRwdXQgZmlsZSBpcyAtbXJlbG9jYXRhYmxlLWxpYiwKLQktbXJlbG9jYXRhYmxlLCBvciBuZWl0aGVyLiAgKGdkYi5iYXNlL25vZGVidWcuZXhwKQotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmM6IEFkZCBzdXBwb3J0IGZvciBSX0ZSMzBfNDggcmVsb2MuCi0JKiByZWxvYy5jOiBBZGQgQkZEX1JFTE9DX0ZSMzBfNDggcmVsb2NhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlCi0KLVdlZCBEZWMgIDIgMDA6NTg6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBXYXJuIG9uIGFuIGF0dGVtcHQgdG8KLQlsaW5rIGFnYWluc3QgYSBkeW5hbWljIHN5bWJvbCB3aXRoIG5vIHR5cGUgb3Igc2l6ZS4KLQotMTk5OC0xMi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoaTM4Nl9jaGVja19yZWxvY3MpIFtSXzM4Nl8zMl06IERvbid0IGVtaXQKLQlyZWxvY2F0aW9uIGZvciBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGdldCBsb2FkZWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pIFtSXzM4Nl8zMl06IExpa2V3aXNlLgotCi1UdWUgRGVjICAxIDExOjMzOjMzIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IE1ha2UgcmVsb2Nfc2l6ZSwKLQlyZWxvY19jb3VudCBhbmQgaSBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIEhhbmRsZSBlcnJvcgotCXJldHVybiBmcm9tIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0KLTE5OTgtMTItMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERldGVjdCB0aGUgYWJzZW5jZSBvZgotCWEgaGFzaCB0YWJsZS4KLQotTW9uIE5vdiAzMCAxNToyODowOSAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKGVsZi9zaC5oKTogSW5jbHVkZS4KLQlzaF9yZWxvY190eXBlOiBEZWxldGUuICBDaGFuZ2VkIGFsbCByZWZlcmVuY2VzIHRvIGVsZl9zaF9yZWxvY190eXBlLgotCShzaF9lbGZfaG93dG9fdGFiKTogQWRkIEhPV1RPIGZvciBSX1NIX1NXSVRDSDguCi0JKHNoX3JlbG9jX21hcCk6IE1hcCBCRkRfUkVMT0NfOF9QQ1JFTCB0byBSX1NIX1NXSVRDSDguCi0JKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBIYW5kbGUgUl9TSF9TV0lUQ0g4LgotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmN5IG9mIGVsZjMyLXNoLmxvIG9uICQoSU5DRElSKS9lbGYvc2guaC4KLQotRnJpIE5vdiAyNyAxNzo1MTozOCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGZsaW5rLmggKGNvbXB1dGVfYnVja2V0X2NvdW50KTogRG9uJ3QgYWxsb3cgbWluc2l6ZT09MCwgaXQKLQljYXVzZXMgZGl2aXNpb24gYnkgemVybyBsYXRlciBvbi4KLQotVGh1IE5vdiAyNiAxMToxOTozNSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcGM5X3JlbG9jLGZyMzBfZWxmX3BjMTJfcmVsb2MpOiBOb3QKLQluZWVkZWQuCi0KLTE5OTgtMTEtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogUmVtb3ZlIGhhY2suICBVc2UgbmV3IGVtdWxhdGlvbgotCWhvb2sgbm93LgotCi1UdWUgTm92IDI0IDEwOjI1OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKLQlmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0JKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkyMCBhbmQgSTMyCi0JcmVsb2NzLgotCShmcjMwX2VsZl9pMzJfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSBJMzIgcmVsb2NzLgotCShmcjMwX2VsZl9wYzlfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSA5X1BDUkVMIHJlbG9jcy4KLQkoZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDEyX1BDUkVMIHJlbG9jcy4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVzZXQgaGkxNnMgcmVsb2MKLQljaGFpbiB0byBlbXB0eS4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgYmFzZWQgb24gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgR2lhbmx1Y2EKLQlNb3JvIDxnbGN0ckBhYmMuaXQ+OgotCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IE9ubHkgdXBkYXRlIGEgaGkxNnMgcmVsb2MgaWYgaXQgaGFzCi0Jbm90IGFscmVhZHkgYmVlbiB1cGRhdGVkLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgcGFyYW1ldGVyICdhbHJlYWR5X2ZvdW5kJwotCXJldHVybnMgc3RhdGUgb2YgcmVtZW1iZXJlZCBoaTE2cyByZWxvYy4KLQkocmVtZW1iZXJfaGkxNnNfcmVsb2MpOiBTZXQgJ2ZvdW5kJyBmaWVsZCB0byBmYWxzZS4KLQkoaGkxNnNfbG9jYXRpb24pOiBBZGQgJ2ZvdW5kJyBmaWVsZC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChiZmRfcGVfZGxsX25vdF9yZWNvZ25pemVkX2hhY2spOiB0aGUgbGlua2VyIHdhbnRzCi0JdG8gc2VlIC5ETEwgZmlsZXMgYXMgdW5yZWNvZ25pemVkLgotCShpM2NvZmZfb2JqZWN0X3ApOiBTb3JyeSwgaGFkIHRvIGhhY2sgaXQgdG8gbm90IHJlY29nbml6ZSB0aGVzZQotCWZpbGVzIChwZWktaTM4Nikgb24gcmVxdWVzdC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChiZmRfbWFrZV9yZWFkYWJsZSk6IG5lZWQgbW9yZSBjbGVhbnVwIGZvciBzeW1ib2xzIGFuZAotCXJlbGVudHMuICBDYWxsIGJmZF9jaGVja19mb3JtYXQgdG8gcmVpbml0aWFsaXplLgotCi1GcmkgTm92IDIwIDE0OjIxOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBzcHVyaW91cwotCXdhcm5pbmdzLgotCi1UaHUgTm92IDE5IDE0OjQyOjE1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgTm92IDE3IDIwOjIzOjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdnRhYmxlX2VudHJpZXNfc2l6ZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IENsZWFyIGl0LgotCSogZWxmbGluay5oIChlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQpOiBDb3B5IGl0LCBhbmQKLQlyZXNwZWN0IGl0IGFzIGFuIHVwcGVyIGJvdW5kIG9uIHdoYXQgbWVtb3J5IHRvIHJlZmVyZW5jZS4KLQkoZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBIYW5kbGUgYXMteWV0IHVuZGVmaW5lZCB2dGFibGVzLiAgU2V0IGFuZAotCXVwZGF0ZSB2dGFibGVfZW50cmllc19zaXplIGFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBOb3YgMTcgMTU6Mjg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlZCBpbnRlZ2VycyB0byBob2xkCi0JcmVsb2MgbnVtYmVyLgotCi1Nb24gTm92IDE2IDIyOjE5OjIxIDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtKTogc3VwcG9ydCBCRkRfSU5fTUVNT1JZCi0JYmZkczsgdGhleSBoYXZlIG5vICJmaWxlIiBzbyB3ZSBmYWtlIGl0LgotCSogYmZkLWluMi5oOiBhZGQgYmZkX21ha2Vfd3JpdGFibGUgYW5kIGJmZF9tYWtlX3JlYWRhYmxlIChyZWdlbikKLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBBbGxvdyB3cml0aW5nIHRvIEJGRF9JTl9NRU1PUlkgYmZkcyBieQotCXJlc2l6aW5nIHRoZSBtZW1vcnkgYnVmZmVyLgotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3dyaXRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSB3cml0ZSBhCi0JYmZkX2NyZWF0ZSdkIGJmZCB0byBhbiBpbi1tZW1vcnkgYnVmZmVyLgotCShiZmRfbWFrZV9yZWFkYWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3UgcmVhZCBiYWNrIHRoYXQgYnVmZmVyCi0JYXMgaWYgaXQgd2VyZSBmcm9tIGJmZF9vcGVuci4gIFVzZWQgdG8gYnVpbGQgZ2VuZXJhdGVkIGFyY2hpdmUKLQltZW1iZXJzICh3aW5zdXAncyBsZCdzIGRsbHRvb2wpCi0KLU1vbiBOb3YgMTYgMTk6MTU6MTkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iZmQucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxMDo1NzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGhpMTZzX2xvY2F0aW9uKTogUmVwbGFjZWQgZml4ZWQgc2l6ZSBhcnJheSB3aXRoCi0JbGlua2VkIGxpc3QuCi0KLVN1biBOb3YgMTUgMjA6Mjg6MjUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFNlYXJjaCBmb3IgdGhlIHByb3BlcgotCWVsZW1lbnQgb2YgdGhlIGdvdGVudHJ5IGxpc3QgZm9yIGxvY2FsIHN5bWJvbHMgdG9vLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5pZnkgbG9jYWwgYW5kIGdsb2JhbCBoYW5kbGluZy4KLQlBc3NlcnQgdGhhdCBnb3RlbnQtPnVzZV9jb3VudCA+IDAuCi0KLVNhdCBOb3YgMTQgMTU6MTY6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHZtc19hbHBoYV92ZWMpOiBSZW5hbWUgZnJvbSBldmF4X2FscGhhX3ZlYywgYW5kCi0JdXBkYXRlIGZvciBmaWxlIG5hbWUgY2hhbmdlcyBvZiBKdWx5IDIsIDE5OTguCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTm92IDEyIDE5OjE5OjU0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTY6MTc6MDYgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00LCBjb25maWcuYmZkOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgTm92IDEwIDE1OjEzOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3IgYmZkX2FyY2hfZnIzMC4KLQotVHVlIE5vdiAxMCAxMzozNzozNiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotCUJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIpOiBkaWRuJ3QgZGVmaW5lIG1hY3JvIHdoZW4gdmFsdWUKLQl3YXMgY2FjaGVkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNDozMTowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChyZWxvY190eXBlKTogIEFkZCBSX0QxMFZfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX0QxMFZfR05VX1ZURU5UUlkgcmVsb2NzLgotCShlbGZfZDEwdl9ob3d0b190YWJsZSk6ICBMaWtld2lzZS4KLQkoZDEwdl9yZWxvY19tYXAgZDEwdl9yZWxvY19tYXApOiAgTGlrZXdpc2UuCi0JKGVsZjMyX2QxMHZfZ2NfbWFya19ob29rKTogIE5ldy4KLQkoZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkoZWxmMzJfZDEwdl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24pOiAgTmV3LgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogIERlZmluZS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQotU2F0IE5vdiAgNyAxODowNzo1MSAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBNb3ZlIHZtcyBmaWxlcyBoZXJlLi4uCi0JKEJGRDY0X0JBQ0tFTkRTKTogLi4uZnJvbSBoZXJlLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBNb3ZlIHZtcyBmaWxlcyBoZXJlLi4uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IC4uLmZyb20gaGVyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgTm92ICA0IDE1OjU4OjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgRlIzMCB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogQWRkIEZSMzAgdGFyZ2V0LgotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiByZWxvYy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCByZWxvY2F0aW9ucy4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAgcmVsb2NhdGlvbnMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogIFJlZ2VuZXJhdGUuCi0JKiBjcHUtZnIzMC5jOiBOZXcgZmlsZS4KLQkqIGVsZjMyLWZyMzAuYzogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMTQ6NTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVN1biBOb3YgIDEgMTk6MzI6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBEbyBub3QgdXNlIGFsbG9jYSwKLQl1c2UgYmZkX21hbGxvYyBhbmQgZnJlZSBpbnN0ZWFkIGFuZCBjaGVjayByZXR1cm4gdmFsdWUgZnJvbSBiZmRfbWFsbG9jLgotCi1TdW4gTm92ICAxIDE2OjIwOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMpOiBDb21tZW50IG91dC4KLQkoU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTKTogTGlrZXdpc2UuCi0JKE1JUFNfVEVYVF9EWU5TWU1fU0VDTik6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfaW5mbyBmaWVsZCBvZiBhIC5oYXNoCi0Jc2VjdGlvbi4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IFJlbW92ZSBkeW5zeW1fc2VjX3N0cmluZGV4Ci0JZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEb24ndCBpbml0aWFsaXplCi0JZHluc3ltX3NlY19zdHJpbmRleC4KLQkobWlwc19lbGZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0byBhdm9pZCB3YXJuaW5nLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBhIHNlY3Rpb24gc3ltYm9sIGZvcgotCWV2ZXJ5IG91dHB1dCBzZWN0aW9uLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENvdW50IGFsbCBzZWN0aW9ucyBmb3IKLQlEVF9NSVBTX1VOUkVGRVhUTk8uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIGR5bmFtaWMgc3ltYm9scyBmb3IgYWxsCi0Jb3V0cHV0IHNlY3Rpb25zLgotCi1TdW4gTm92ICAxIDEyOjQ2OjUzIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEFsbG9jYXRlIHR3byBzbG90cwotCWZvciBsYXRlciBQTFQgZW50cmllcyBpbiBsYXJnZSBQTFRzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFsbG93IGZvciB0aGUgZXh0cmEgc2xvdHMuCi0KLVNhdCBPY3QgMzEgMjA6MTA6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvYWRfc2VjdGlvbik6IEZpeCB0eXBvLgotCi0xOTk4LTEwLTI2IDE1OjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQgZWxmX2hhc2hfdmFsdWUuCi0JKiBlbGZsaW5rLmggKGVsZl9jb2xsZWN0X2hhc2hfY29kZXMpOiBOZXcgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzCi0JY2FsbGVkIGZvciBlYWNoIGV4cG9ydGVkIHN5bWJvbCBhbmQgd2UgY29tcHV0ZSB0aGUgRUxGIGhhc2ggdmFsdWUgZm9yCi0JaXQuCi0JKGNvbXB1dGVfYnVja2V0X3ZhbHVlKTogTmV3IGZ1bmN0aW9uLiAgSXQgaXMgY2FsbGVkIGZyb20KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBoYXNoIHRhYmxlIHNpemUuICBXaGVuIHdlIGFyZQotCW9wdGltaXppbmcgYSBiZXR0ZXIsIGJ1dCBzbG93ZXIsIGFsZ29yaXRobSBpcyB1c2VkLgotCShzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIGNvbXB1dGVfYnVja2V0X3ZhbHVlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9oYXNoKTogT3B0aW1pemUgdGhlIGhhc2ggZnVuY3Rpb24gYSBiaXQuCi0KLU1vbiBPY3QgMTkgMjA6MDM6MjEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNoLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9TSF9HTlVfVlRJTkhFUklUIGFuZAotCVJfU0hfR05VX1ZURU5UUlkuCi0JKHNoX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShzaF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0JKHNoX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1Nb24gT2N0IDE5IDE2OjU3OjA1IDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiB1bmRvIHByZXZpb3VzIGdldHRleHQgY2hhbmdlCi0JKiBhY2xvY2FsLm00OiByZWJ1aWxkIHdpdGggcmlnaHQgdmVyc2lvbiBvZiBhY2xvY2FsLgotCi1Nb24gT2N0IDE5IDAxOjQ3OjIxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00LCBhY2xvY2FsLm00OiBtb3ZlIGdldHRleHQtcmVsYXRlZCBmcmFnbWVudHMgZnJvbQotCWFjbG9jYWwubTQgdG8gYWNpbmNsdWRlLm00LCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgotCi0JKiBlbGZjb3JlLmg6IHJld3JpdGUgZm9yIGJldHRlciBjb3JlZmlsZSBzdXBwb3J0LgotCSogZWxmLmMgKGVsZmNvcmVfKik6IG5ldyBmdW5jdGlvbnMuCi0JKiBlbGYtYmZkLmggKGVsZl9vYmpfdGRhdGEpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0JKiBhY2NvbmZpZy5oLCBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogYWRkIGZlYXR1cmUtdGVzdHMgZm9yCi0JZmxhdm9yIG9mIHByb2Nmcy4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZy5pbiwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZWQuCi0KLUZyaSBPY3QgMTYgMTQ6MDc6NDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX00zMlJfR05VX1ZUSU5IRVJJVAotCWFuZCBSX00zMlJfR05VX1ZURU5UUlkuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0JKG0zMnJfZWxmX2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0JKG0zMnJfZWxmX2djX21hcmtfaG9vayk6ICBOZXcuCi0JKG0zMnJfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3LgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIEhhbmRsZSBWVCByZWxvY3MuCi0KLU1vbiBPY3QgMTIgMTQ6MTg6NDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgcmVkdW5kYW50IHRlc3QuCi0KLQkqIGJmZC1pbjIuaCAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IEltcHJvdmUgY29tbWVudCB0byBtYWtlCi0JY2xlYXQgdGhhdCB0aGUgJ2JpdHNpemUnIGZpZWxkIGlzIHRoZSBzaXplIG9mIHRoZSBiaXRmaWVsZCBBRlRFUgotCXJlbG9jYXRpb24gbm90IGJlZm9yZS4KLQotCSogZWxmMzItbTMyci5jIChSX00zMlJfMThfUENSRUwpOiBGaXggc2l6ZSBvZiBiaXRmaWVsZC4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfaGkpOiBDb3BlIHdpdGggbWlzc2luZyByZWZoaSBvciByZWZsbwotCXJlbG9jcy4KLQotVHVlIE9jdCAgNiAwOToyMDo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NQQVJDX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9TUEFSQ19HTlVfVlRFTlRSWS4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogIEhhbmRsZSB0aGVtLgotCShlbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6ICBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rKTogIE5ldy4KLQkoZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMTQ6NTU6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2ZpbmlzaF93cml0aW5nKTogUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3Mgd2hlbgotCXdyaXRpbmcgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeS4KLQotTW9uIE9jdCAgNSAxMjowMjozMSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYxLmMgOiBOZXcgZmlsZS4gIEFkZHMgX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBjb25maWd1cmUuaW4gKGVsZik6IEFkZCBkd2FyZjEubG8uCi0JKiBlbGZfYmZkLmggKGVsZl9vYl90ZGF0YSk6IEFkZCBkd2FyZjFfZmluZF9saW5lX2luZm8uCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgY2FsbCB0bwotCV9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKToKLQlBZGQgY2FsbCB0byBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE9jdCAgNSAxMDowNjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2Nfc2VjdGlvbnMpOiAgRG8gbm90IGFsbG93IGdhcmJhZ2UKLQljb2xsZWN0aW9uIGlmIGR5bmFtaWMgc2VjdGlvbnMgaGF2ZSBiZWVuIGNyZWF0ZWQuCi0KLU1vbiBPY3QgIDUgMDk6MDc6MzcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYzogQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfVjg1MF9HTlVfVlRJTkhFUklUIGFuZAotCVJfVjg1MF9HTlVfVlRFTlRSWS4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogIEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkgcmVsb2NzLgotCSh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiAgTGlrZXdpc2UuCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgTGlrZXdpc2UuCi0JKHY4NTBfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3IHJvdXRpbmUuCi0JKHY4NTBfZWxmX2djX21hcmtfaG9vayk6ICBOZXcgcm91dGluZS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQotTW9uIE9jdCAgNSAwOTowNDoyNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19nY19zd2VlcF9ob29rKTogIERvbid0IGFzc3VtZQotCXRoYXQgZHlub2JqIGV4aXN0cy4KLQotU3VuIE9jdCAgNCAyMzoyOTozNCAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCURlY2xhcmUgc2l6ZSBhcyBiZmRfc2l6ZV90eXBlLgotCShyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZSBjb3VudCBhcyBiZmRfc2l6ZV90eXBlLgotCi1TdW4gT2N0ICA0IDIwOjM4OjI5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMF9hcmNoKTogRGVmaW5lLiAgTGluayBpdCBpbnRvIHRoZSBiZmRfaHBwYV9hcmNoCi0Jc3RydWN0dXJlLgotCSogc29tLmMgKENQVV9QQV9SSVNDMl8wKTogRGVmaW5lLgotCShfUEFfUklTQzJfMF9JRCk6IExpa2V3aXNlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBVc2UgQ1BVX1BBX1JJU0MyXzAgZm9yIHRoZSBzeXN0ZW1faWQgYXMgbmVlZGVkLgotCi1TdW4gT2N0ICA0IDIxOjE5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbmVkIHN5bWJvbAotCWhhcyBhIGJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBkZWZpbmVkLCBvbmx5IGFkZCB0aGUgcmVmZXJlbmNlZAotCXN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkCi0JYnkgYSByZWd1bGFyIGZpbGUuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgdnRhYmxlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVW5kbyBsYXN0IGNoYW5nZS4KLQotV2VkIFNlcCAyMyAxNjowOTozMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHJlY29yZCBhIGR5bmFtaWMKLQlzeW1ib2wgZm9yIHRoZSBpbmRpcmVjdCBhbGlhcyB0byBhIHZlcnNpb25lZCBzeW1ib2wuCi0KLU1vbiBTZXAgMjEgMTI6MTU6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8pOiBOZXcuCi0JKGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0byk6IE5ldy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiAgUmV0dXJuIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bwotCW9yIGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvICBvbiBsb29rdXAuCi0KLVN1biBTZXAgMjAgMDA6NDg6MDcgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYzogSW5jbHVkZSAiZWxmL202OGsuaCIuICBSZW1vdmUgZGVmaW5pdGlvbiBvZiBlbnVtCi0JcmVsb2NfdHlwZS4gIFJlbmFtZSBSXzY4S19fbWF4IHRvIFJfNjhLX21heC4KLQkoaG93dG9fdGFibGUpOiBVc2UgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiBmb3IgYSBWVEVOVFJZCi0JcmVsb2MuCi0KLVN1biBTZXAgMjAgMDA6MDk6MjUgMTk5OCAgQ2hyaXMgVG9yZWsgIDx0b3Jla0Bic2RpLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRiMzIpOiBSZXdyaXRlIGV4cHJlc3Npb24gdG8gZ2V0IGJldHRlciBjb2RlLgotCShiZmRfZ2V0bDMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9nZXRsX3NpZ25lZF8zMik6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2xvZzIpOiBDYXN0IHRvIGJmZF92bWEgYmVmb3JlIHNoaWZ0aW5nLCBub3QKLQlhZnRlci4KLQotU2F0IFNlcCAxOSAyMjo0MjoyMyAxOTk4ICBEb3VnIFJhYnNvbiAgPGRmckBubHN5c3RlbXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEVuc3VyZSB0aGF0IHRoZSB3YXJuaW5nCi0JbWVzc2FnZSBoYXMgYSBudWxsIGJ5dGUgdGVybWluYXRvci4KLQotRnJpIFNlcCAxOCAxNDozNToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IElnbm9yZSBjb250ZW50cyBvZgotCXdvcmQgc3ViamVjdCB0byBSX1Y4NTBfMzIgcmVsb2NhdGlvbi4KLQotVGh1IFNlcCAxNyAxNzoyMDozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYzogQWRkIGNvbW1lbnQgZGVzY3JpYmluZyBwcm9ibGVtIGNvbXB1dGluZyBsaW5lIG51bWJlcnMKLQlmb3IgdW5kZWZpbmVkIHN5bWJvbHMgYXQgbGluayB0aW1lLgotCi1UaHUgU2VwIDE3IDE2OjAzOjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0Ci0JdHJhbnNmb3JtIGEgZGVmd2VhayBpbnRvIGEgcGx0IGVudHJ5LgotCShlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IHJvb20gZm9yIHNlY29uZGFyeQotCXBsdCBlbnRyeSByZWZlcmVuY2VzIHRvIHJlY2VpdmUgYSBSRUxBVElWRSByZWxvYy4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCB0aGVtIGluLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQXNzZXJ0IHdlIGRvbid0IG92ZXJydW4KLQl0aGUgYWxsb2NhdGVkIHJlbG9jYXRpb24gc3BhY2UuCi0KLVdlZCBTZXAgMTYgMTg6MDM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBBbHdheXMgdHJlYXQgc2VjdGlvbiBzeW1ib2xzIGFzCi0Jc3BlY2lhbCwgZXZlbiBpZiB0aGV5IGFyZSBhdHRhY2hlZCB0byBhIGNvbW1vbiBzZWN0aW9uLgotCi1XZWQgU2VwIDE2IDEwOjM0OjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBNb3ZlIHN5bWJvbHMgaW4KLQlzZWN0aW9ucyB3aXRoIHY4NTAgY29tbW9uIHNlY3Rpb24gYXR0cmlidXRlcyBpbnRvIG5hbWVkIHY4NTAKLQljb21tb24gc2VjdGlvbnMuCi0JKHY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE1vdmUgc3ltYm9scyBpbiBzZWN0aW9ucyB3aXRoIHY4NTAKLQljb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0KLVdlZCBTZXAgMTYgMTE6MjY6NDkgQ0RUIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6ICBSZW1vdmUgcHJpbnQKLQlzdGF0ZW1lbnQuCi0KLTE5OTgtMDktMTUgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXZlcnNlIG91dHB1dF9vZmZzZXQKLQlwYXJ0IG9mIFZsYWRpbWlyJ3MgY2hhbmdlIG9mIDE5OTgtMDgtMTkuICBNYWtlIGEgUl9QUENfU0RBUkVMMTYKLQlyZWxvYyB0byB0aGUgd3Jvbmcgc2VjdGlvbiBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvci4gIC5keW5zYnNzCi0JaXMgbm90IGFuIG91dHB1dCBzZWN0aW9uLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciBpdC4KLQotVHVlIFNlcCAxNSAxMjo0MDowNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oOiAgQWRkIGFyZ3VtZW50IHRvIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQotVHVlIFNlcCAxNSAwODozNDo0MCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiAgUGFzcyB0eXBlIHRvIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkqIGVsZjMyLWFybS5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfQVJNX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9BUk1fR05VX1ZURU5UUlkuCi0JKGVsZjMyX2FybV9nY19tYXJrX2hvb2spOiBOZXcuCi0JKGVsZjMyX2FybV9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogTmV3LgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZCi0JcmVsb2NhdGlvbnMuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQotCXJlbG9jYXRpb25zLgotCi0xOTk4LTA5LTEwICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgZHlub2JqIGlzIE5VTEwsCi0JYXNzdW1lIHRoZXJlIGlzIG5vIFBMVCBvciBHT1QuCi0KLVdlZCBTZXAgIDkgMTQ6MjQ6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbjogIGp1c3QKLQlsaWtlIF9lbGZfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgZXhjZXB0IHRoYXQgU1RUX0FSTV9URlVOQyBpcwotCWFsc28gYWNjZXB0ZWQgYXMgYSBmdW5jdGlvbiBzeW1ib2wgdHlwZS4KLQotTW9uIFNlcCAgNyAxMzoyNDowMyAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKF9MT05HX0xPTkcpOiAgRGVmaW5lIGZvciBBSVggNC54IG9ubHkuCi0KLVNhdCBTZXAgIDUgMjA6NDA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zKTogQ29ycmVjdCBkZWZpbml0aW9uIHRvCi0JbWF0Y2ggZGVmaW5pdGlvbiBvZiBfYmZkX2djX3NlY3Rpb25zIGZpZWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDQgMTM6NTQ6MjMgMTk5OCAgRGF2aWQgTWlsbGVyICA8ZGF2ZW1AZG0uY29iYWx0bWljcm8uY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGVybHkgYWRqdXN0Ci0JdGhlIGFkZGVuZCBvZiBhIGR5bmFtaWMgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBhIHNlY3Rpb24uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCB0aGUgUExUIHJlbG9jYXRpb24gb2Zmc2V0LgotCi1UaHUgU2VwICAzIDE3OjI4OjUwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoYmZkX2VsZk5OX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFZlcmlmeSB0aGF0IHRoZQotCWJlZCBoYXMgYSBzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdC4KLQotTW9uIEF1ZyAzMSAxNDo0OToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvKTogVXNlCi0JX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbi4KLQotTW9uIEF1ZyAzMSAxMDoyMzo0MCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06ICBBZGQgZWxmMzItYXJtLmMuCi0JKiBNYWtlZmlsZS5pbjogIFJlYnVpbGQuCi0JKiBlbGYtYmZkLmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiAgSWYgZGVmaW5lZCwgY2FsbAotCWVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkqIGVsZjMyLWFybS5jOiBEZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCShlbGYzMl9hcm1fZ2V0X3N5bWJvbC10eXBlKTogIE5ldyByb3V0aW5lLgotCShyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiAgQ2hhbmdlIHRvIHVzZSBTVFRfQVJNX1RGVU5DLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiAgQ2hhbmdlIHRvCi0JY2hlY2sgZm9yIFNUVF9BUk1fVEZVTkMuCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0Lmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCi1GcmkgQXVnIDI4IDE5OjQ0OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2FscGhhX2V2WzQ1Nl0pOiBOZXcuCi0JKiBjcHUtYWxwaGEuYzogUmV3b3JrIHRvIG1hdGNoIHRoZXNlIHR5cGVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgQXVnIDI4IDE5OjM4OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IE5ldy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgdGhlbS4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogUGFzcyB0aGVtIG9mZiB0byBnZW5lcmljIGNvZGUuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlbS4KLQkoZWxmX2kzODZfZ2NfbWFya19ob29rLCBlbGZfaTM4Nl9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBUcnVlLgotCi1UaHUgQXVnIDIwIDE1OjAzOjQ1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IENoZWNrIHN5bV9zZWMgaXMgbm90IE5VTEwKLQliZWZvcmUgbG9va2luZyBhdCBvd25lciBmaWVsZC4KLQkoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiBEaXR0by4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wdXRlIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSgpLgotCi1UaHUgQXVnIDIwIDExOjMwOjE3IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jOiBjb21tZW50IGFuZCBmb3JtYXR0aW5nIGNsZWFudXBzLgotCSogZWxmY29yZS5oOiBkaXR0by4KLQotV2VkIEF1ZyAxOSAxNTo0MzoyNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlamVjdCBmaWxlcyBvZiBoZWFkZXIgdHlwZSBFVF9DT1JFCi0JKGNvcmUgZmlsZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBvYmplY3QgZmlsZXMpLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBkZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotCWJmZF9lbGZfbWtjb3JlZmlsZSk6IGFkZCB0byBiZmRfdGFyZ2V0IHZlY3Rvci4KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogc2F2ZSB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUsCi0JYW5kIHNldCB0aGUgYmZkIGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBlbGYgZmlsZSBoZWFkZXIuCi0JKiBlbGYuYyAoYmZkX2VsZl9ta2NvcmVmaWxlKTogbmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyk6IG5ldyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IGFkZCBjYXNlcyBmb3IgaGFuZGxpbmcKLQlQVF9OT1RFIHNlZ21lbnRzLiAgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKToKLQljb3JlIGZpbGVzIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIGFzIGV4ZWMgZmlsZXMuCi0JKHByZXBfaGVhZGVycyk6IGlkZW50aWZ5IGNvcmUgZmlsZXMgYXMgdHlwZSBFVF9DT1JFLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZGVudGlmeSB0aGUgc2VjdGlvbnMgYmVsb25naW5nIHRvCi0JdGhlIFBUX05PVEUgc2VnbWVudC4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JYWRkIGJyZWFrIHN0YXRlbWVudCB0byBkZWZhdWx0IGNhc2UuCi0KLTE5OTgtMDgtMTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgdGhhdCBvdXRwdXQKLQlzZWN0aW9uIChub3QgaW5wdXQpIHdpbGwgYmUgaW4gc2VjdGlvbnMgIi5zYnNzIiwgIi5zYnNzMiIsCi0JIi5zZGF0YSIsIGFuZCAiLnNkYXRhIiBmb3IgUl9QUENfU0RBUkVMMTYsIFJfUFBDX0VNQl9TREEyUkVMLAotCVJfUFBDX0VNQl9TREEyMSwgUl9QUENfRU1CX1JFTFNEQS4gIEluIGFsbCB0aGVzZSBjYXNlcyBhbHNvIGlnbm9yZQotCW91dHB1dF9vZmZzZXQgZm9yIGNvcnJlY3QgZXZhbHVhdGlvbiBvZiBhZGRlbmQuCi0KLVR1ZSBBdWcgMTggMTE6NDg6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jOiBBZGQgcHJlZml4IGJmZF8gdG8gZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLQllbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIGFuZAotCWVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCi1UdWUgQXVnIDE4IDExOjQ2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBbW1lbmQgcHJvdG90eXBlIGZvcgotCWVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIHRvIHJlbW92ZSBzdXJwbHVzIHRoaXJkCi0JYXJndW1lbnQuCi0KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotU2F0IEF1ZyAxNSAyMDo1NTowOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogSGFuZGxlIGluZGlyZWN0IHN5bWJvbHMuCi0KLUZyaSBBdWcgMTQgMDk6MTI6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFVzZSB0aGUgcmVsb2NhdGlvbiBhbHJlYWR5Ci0JY2FsY3VsYXRlZCBmb3IgUkVMT0NfU1BBUkNfUkVWMzIgY2FzZS4KLQotVGh1IEF1ZyAxMyAxNDowMjowMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6ICBBZGQgcHJvdG90eXBlcyBmb3IgZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLQllbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIGFuZAotCWVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCSogYmZkLWluMi5oOiAgUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1hcm0uYyBEZWZpbmUgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZS4KLQkoaW5zZXJ0X3RodW1iX2JyYW5jaCk6IE5ldyByb3V0aW5lLgotCShmaW5kX3RodW1iX2dsdWUpOiBOZXcgcm91dGluZS4KLQkoZmluZF9hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgotCShyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUpOiBOZXcgcm91dGluZS4KLQkocmVjb3JkX3RodW1iX3RvX2FybV9nbHVlKTogTmV3IHJvdXRpbmUuCi0JKGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHJvdXRpbmUuCi0JKGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBOZXcgcm91dGluZS4KLQkoZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucykgTmV3IHJvdXRpbmUuCi0JKGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKSBOZXcgcm91dGluZS4KLQkoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiBOZXcgcm91dGluZS4KLQkoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiBOZXcgcm91dGluZS4KLQkoZWxmMzJfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCB0eXBvLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBBZGQgYXJndW1lbnQgc3ltX3NlYy4KLQlDaGVjayBmb3IgYnJhbmNoZXMgdG8gdGh1bWIgc3ltYm9scyBpbiBjYXNlIFJfQVJNX1BDMjQuCi0JQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIGFybSBzeW1ib2xzIGluIGNhc2UgUl9BUk1fVEhNX1BDMjIuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIFBhc3Mgc3ltYm9sIHNlY3Rpb24gdG8KLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4KLQotV2VkIEF1ZyAxMiAxOTowMDozOSAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSBQTFQKLQllbnRyaWVzIHVubGVzcyB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIGV4ZWN1dGFibGU7IGluCi0JcGFydGljdWxhciwgdW5kZWZpbmVkIHdlYWsgc3ltYm9scyBnZXQgYSBQTFQgZW50cnkuCi0KLVdlZCBBdWcgMTIgMTQ6NDg6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0Lmg6IFJlbW92ZSBuZXN0ZWQgY29tbWVudCB0byBhdm9pZCB3YXJuaW5nLgotCi1XZWQgQXVnIDEyIDA4OjEwOjExIDE5OTggQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZXdvcmsKLQlSX0FSTV9QQzI0IHJlbG9jYXRpb24uCi0KLVR1ZSBBdWcgMTEgMTQ6NDI6MjYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZW1vdmUgdW51c2VkCi0JYXJndW1lbnQgaXNfbG9jYWwuICBBZGQgYXJndW1lbnQgc3ltX2ZsYWdzLiAgQ2hlY2sgc3ltX2ZsYWdzCi0JaW4gUl9BUk1fQUJTMzIgY2FzZS4gIEluY2x1ZGUgYWRkZW5kIGZvciBSX0FSTV9USE1fUEMyMiBjYXNlLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBEb24ndCBwYXNzIGxvY2FsIHN5bSBhbmQgcGFzcwotCXN5bV9mbGFncyB0byBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4KLQotTW9uIEF1ZyAxMCAyMDozODozOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IENvcnJlY3QgbGFzdCBjaGFuZ2UKLQl0byBub3QgY291bnQgdG9vIGZldyByZWxvY3MgZm9yIGR5bmFtaWNseSBsaW5rZWQgZXhlY3V0YWJsZXMuCi0KLU1vbiBBdWcgMTAgMTU6MzU6MzQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBOZXZlciBjb25zaWRlcgotCXN5bWJvbHMgd2l0aG91dCBhIGR5bmFtaWMgaW5kZXggZHluYW1pYy4gIENvbnNpZGVyIGFsbCB3ZWFrCi0Jc3ltYm9scyBkeW5hbWljLgotCShlbGY2NF9hbHBoYV9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogRG9uJ3QgYXNzdW1lIDEtMQotCWNvcnJlc3BvbmRhbmNlIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBzZWN0aW9ucy4KLQotTW9uIEF1ZyAxMCAxNTozMTozOSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogRm9yIGJhY2tlbmRzCi0JdGhhdCB1c2UgYSAuZ290LnBsdCBzZWN0aW9uIHN0YXJ0IHRoZSBnb3Qgb2Zmc2V0IGF0IHplcm8uCi0KLU1vbiBBdWcgMTAgMTc6MzE6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfcHJvY2Vzc29yKTogQ29ycmVjdCB0aGUgcHJvY2Vzc29yIElEIHdyaXR0ZW4KLQlvdXQgZm9yIGJmZF9hcmNoX202OGssIGFjY29tbW9kYXRpbmcgY2hhbmdlIG9mIE1hcmNoIDI1LgotCi1TdW4gQXVnICA5IDIwOjU1OjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0JUl9BUk1fVEhNX1JQQzIyIHJlbG9jYXRpb25zLgotCi1TYXQgQXVnICA4IDE1OjE1OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogVW5kZWYgd2VhayBzeW1ib2xzCi0JYXJlIGFsd2F5cyBkeW5hbWljLgotCShlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGVub3VnaCByb29tIGZvciBSRUxBVElWRQotCS5nb3QgcmVsb2NzIGluIC1Cc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuCi0KLVdlZCBBdWcgIDUgMTU6NDg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmM6IEFkZCBwcml2YXRlIGZsYWdzIHRvIEVMRiBoZWFkZXIuCi0JKGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9jb3B5X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCi1Nb24gQXVnICAzIDE3OjEwOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogUGVybWl0IFdQTFQzMCBhZ2FpbnN0Ci0JYSBsb2NhbCBzeW1ib2wuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAgMiAwMzoxOToyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0IHNnb3QgdG8gTlVMTC4gIENyZWF0ZSB0aGUKLQkuZ290IGlmIGFueSByZWxvY2F0aW9uIHJlZmVycnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHNnb3QgYW5kIHNwbHQgc2VhcmNoIHRvIHRoZSBzdGFydAotCW9mIHRoZSBmdW5jdGlvbi4gIFJlY29nbml6ZSBubyAucGx0IGFzIHN0YXRpYyBsaW5raW5nLgotCi0xOTk4LTA4LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgcGFzcwotCSIubGlibGlzdCIgc3RyaW5nIHRocm91Z2ggZ2V0dGV4dC4KLQotRnJpIEp1bCAzMSAxNjozODoxNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBlbGYzMi1hcm0ubG8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZy5iZmQgKGFybS0qLWVsZik6ICBEZWZpbmUgdGFyZ19kZWZ2ZWMgYW5kIHRhcmdfc2VsdmVjcy4KLQkodGh1bWItKi1lbGYpOiBEZWZpbmUgdGFyZ19kZWZ2ZWMgYW5kIHRhcmdfc2VsdmVjcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYyBhbmQgYmZkX2VsZjMyX2JpZ2FybV92ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBlbGYuYzogKHByZXBfaGVhZGVycyk6ICBTdXBwb3J0IGFyY2hfdHlwZSBvZiBFTV9BUk0uCi0JKiB0YXJnZXRzLmM6ICBTdXBwb3J0IG5ldyB0YXJnZXRzIGJmZF9lbGYzMl9iaWdhcm1fdmVjIGFuZAotCWJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMuCi0JKiBlbGYzMi1hcm0uYzogIE5ldyBmaWxlLgotCi1UdWUgSnVuIDI4IDE5OjA1OjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKE1fU1BBUkNMSVRFX0xFKTogTmV3IG1hY2hpbmUuCi0JKiBzdW5vcy5jIChNQUNIVFlQRV9PSyk6IEFkZCBtYWNoaW5lIE1fU1BBUkNMSVRFX0xFLgotCSogYW91dGYxLmggKHN1bm9zX3NldF9hcmNoX21hY2gpOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KLQkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkIG1hY2hpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBBZGQgcmVsb2NhdGlvbiBSX1NQQVJDX1JFVjMyLgotCShOQU1FKGFvdXQsbWFjaGluZV90eXBlKSkgQWRkIG1hY2hpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IEFkZCBSRUxPQ19TUEFSQ19SRVYzMiBzdXBwb3J0LgotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUsIHNwYXJjX3JlbG9jX21hcCwKLQllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIFJfU1BBUkNfMzJMRSB0byBiZSBSX1NQQVJDX1JFVjMyCi0JKiBsaWJiZmQuaCAoYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lcyk6IFJlbmFtZSBCRkRfUkVMT0NfU1BBUkNfMzJMRSB0bwotCWJlIEJGRF9SRUxPQ19TUEFSQ19SRVYzMi4KLQkqIHJlbG9jLmM6IERpdHRvLgotCSogY29uZmlnLmJmZCAoc3BhcmM4NngtKi1hb3V0KTogTmV3Ci0KLUZyaSBKdWwgMjQgMTM6NTQ6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQWxsb2NhdGUgTlVMTCBzeW1ib2wgYmVmb3JlCi0JYWN0dWFsbHkgbWFwcGluZyB0aGUgb3V0cHV0IHNlY3Rpb25zLgotCi1GcmkgSnVsIDI0IDExOjI0OjI5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2hvd3RvKTogQWRkIFJfTU4xMDMwMF8yNCBlbnRyeS4KLQkobW4xMDMwMF9lbGZfcmVsb2NfbWFwKTogU2ltaWxhcmx5LgotCShtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFJfTU4xMDMwMF8yNC4KLQotRnJpIEp1bCAyNCAxMjozNjowNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgcmVsb2MgdHlwZXMgdXNlZCBvbgotCUlyaXggNi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBkZWZhdWx0IGNhc2UuCi0JKiBlbGY2NC1taXBzLmM6IFJlcGxhY2UgYWxsIHVzZXMgb2YgbWlwc19lbGY2NF9yZWxvY190eXBlIHdpdGgKLQllbGZfbWlwc19yZWxvY190eXBlIGRlZmluZWQgaW4gZWxmL21pcHMuaC4KLQotMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogUmVtb3ZlIHJlbG9jX3R5cGUgZGVmaW5pdGlvbiBjb21wbGV0ZWx5LiAgSXQncyBub3cKLQlpbiBlbGYvbWlwcy5oLgotCi1UaHUgSnVsIDIzIDEzOjMzOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9yZWxvY190eXBlKTogI2lmIDAgb3V0IG1vcmUgcmVsb2NhdGlvbnMKLQlhcyB0aGV5IGFyZSBkZWZpbmVkIGluIGVsZi9taXBzLmggbm93LgotCi1UaHUgSnVsIDIzIDExOjI5OjQzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCi0JKiBSZS1hZGQgbG9zdCBjaGFuZ2U6Ci0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZAotCSJtb3ZtX3N0YWNrX3NpemUiLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5jbHVkZSBzdGFjayBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMKLQlpbiB0aGUgaW1tOCBmaWVsZCBvZiBhICJjYWxsIiBpbnN0cnVjdGlvbi4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQotCXRoZSBtb3ZtIGluc3RydWN0aW9uLiAgRml4IHR5cG8uCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1vdm1fc3RhY2tfc2l6ZS4KLQotVGh1IEp1bCAyMyAxMTozODowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZSBhcyA0LgotCSogZWxmNjQtc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDguCi0KLTE5OTgtMDctMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYzogQ2hhbmdlIHVzZSBvZiBwcF9yZWxvY190eXBlIHRvIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyNzoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmg6IExldCBFTEYgaGVhZGVyIGRlZmluZSB0aGUgZW51bSBjb250YWluaW5nIHRoZQotCWV4dGVybmFsIHJlbG9jIG51bWJlcnMuCi0JKiBlbGYzMi1pMzg2Lmg6IExpa2V3aXNlLgotCi0xOTk4LTA3LTIyIDE0OjU3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLW0xMDMwMC5jOiBMZXQgRUxGIGhlYWRlciBub3cgZGVmaW5lIHRoZSBtYWNyb3MgdG8gZ2V0IHRoZSBlbnVtLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMiAxMzo1Mzo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IENoYW5nZSB0eXBlIG9mICdjbGFzcycgcGFyYW1ldGVyIHRvICd1bnNpZ25lZCBpbnQnIGluCi0JYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcygpLCBpbiBvcmRlciB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eQotCXByYmxlbXMuCi0JKiBiZmQtaW4uaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyk6IENoYW5nZSB0eXBlIG9mICdjbGFzcycKLQlwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgdG8gYXZvaWQgSyZSIGNvbXBhdGFiaWxpdHkgcHJvYmxlbXMuCi0KLVdlZCBKdWwgMjIgMTY6NDM6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfZmluZF9uZWFyZXN0X2xpbmUpOiBDaGFuZ2UgZmlsZW5hbWVfcHRyIGFuZAotCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgY29uc3QuICBDaGFuZ2UgbGluZV9wdHIgdG8gYmUgdW5zaWduZWQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbgotCW1hY3JvIGlzIG5vdCBkZWZpbmVkLiAgQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBiZmRfbGlua19pbmZvCi0JdG8gY29mZl9maW5hbF9saW5rX2luZm8uICBBZGQgcHJvdG90eXBlLgotCShjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IFNpbXBsaWZ5IGhhbmRsaW5nIHdoZW4gbWFjcm8gaXMgbm90Ci0JZGVmaW5lZC4gIEFkZCBwcm90b3R5cGUuCi0KLTE5OTgtMDctMjIgMTM6MDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtbW4xMDMwMC5jOiBCZWZvcmUgaW5jbHVkZSBzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlciBkZWZpbmUKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIGFuZCBFTkRfUkVMT0NfTlVNQkVSUy4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjIgMTM6NDY6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6IENvcHkgVWxyaWNoJ3MgZWxmMzItbWlwcy5jCi0JdGVtcG9yYXJ5IHBhdGNoIG92ZXIgdG8gZWxmNjQtbWlwcy5jIGFzIHdlbGwuCi0KLTE5OTgtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHJlbG9jX3R5cGUpOiBUZW1wb3JhcmlseSBkaXNhYmxlIGRlZmluaXRpb24gb2YKLQlzdGFuZGFyZCByZWxvY2F0aW9uIHNpbmNlIHRoZXkgYXJlIG5vdyBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLVR1ZSBKdWwgMjEgMDk6NDc6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0JTW9kaWZ5IHJhbmdlIHRlc3QgZm9yIGNhc2UgUl9NTjEwMjAwXzguCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0JTW9kaWZ5IHJhbmdlIHRlc3QgZm9yIGNhc2UgUl9NTjEwMzAwXzguCi0KLU1vbiBKdWwgMjAgMTg6NTA6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBnb3RfICYgcGx0X2hlYWRlcl9zaXplLgotCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jLCBlbGY2NC1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBQcm92aWRlIGEgZGVmYXVsdCBvZiB6ZXJvLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBVc2UgZ290X2hlYWRlcl9zaXplLgotCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHJlbW92ZSBhIFBMVAotCWVudHJ5IGZyb20gYW4gZXhlY3V0YWJsZSwgZXZlbiBpZiB0aGUgcGx0IHJlZmNvdW50IGdvZXMgdG8gMC4KLQotTW9uIEp1bCAyMCAxMjo0NzoyNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IEFsc28gcmVtZW1iZXIgdGhlCi0JZGlyZWN0b3J5IG5hbWUgYXQgdGhlIGxpbmUgbnVtYmVyLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGNvbnNpZGVyIHN5bWJvbHMKLQl3aXRoIGFuIHVuc3BlY2lmaWVkIHR5cGUuCi0KLVdlZCBKdWwgMTUgMTE6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jOiBBZGQgdW5kZWYgb2YgdmFsaWQgdG8gYXZvaWQgcHJvYmxlbSBvbiBTdW5PUy4KLQotVHVlIEp1bCAxNCAxNTozMDo1OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpPzg2LXBjLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDExOjIyOjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEFsc28gcmVmZXJlbmNlIGNvdW50Ci0JUl82OEtfUEN4eCBhbmQgUl82OEtfeHggcmVsb2NhdGlvbnMuICBNYWtlIHN1cmUgdGhhdAotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGlzIGFsd2F5cyBzZXQgZm9yIGEgUExUIHJlbG9jIHJlZmVyZW5jZS4KLQkoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IEFsc28gcmVmZXJlbmNlIGNvdW50IFJfNjhLX1BDeHggYW5kCi0JUl82OEtfeHggcmVsb2NhdGlvbnMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IG9mIGEgc3ltYm9sCi0JdGhhdCBoYXMgbm8gcGx0IGVudHJ5LgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZSBwbHQgb2Zmc2V0IGluIGEgc3RhdGljCi0JbGluay4KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IGZvcgotCWFuIGlnbm9yZWQgc3ltYm9sLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogU2V0IHRoZSBnb3Qgb2Zmc2V0cyBhbHNvIGluCi0JYSBzdGF0aWMgbGluay4KLQotCSogZWxmMzItbTY4ay5jIChSXzY4S19HTlVfVlRJTkhFUklULCBSXzY4S19HTlVfVlRFTlRSWSk6IE5ldyByZWxvYwotCXR5cGVzLgotCShob3d0b190YWJsZSwgcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIHRoZW0uCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLiAgSW1wbGVtZW50IHJlZmVyZW5jZQotCWNvdW50aW5nIGZvciBnb3QgYW5kIHBsdCBlbnRyaWVzLgotCShlbGZfbTY4a19nY19tYXJrX2hvb2ssIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBIYW5kbGUgdW5yZWZlcmVuY2VkIHBsdAotCXN5bWJvbHMuCi0JKHJ0eXBlX3RvX2hvd3RvX3JlbCwgZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVsZXRlLgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHRoZSBuZXcgcmVsb2MgdHlwZXMuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluaywgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotCWVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2ssIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgotCWluZGlyZWN0IHJlZmVyZW5jZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcgYWxzbyBjb3B5IHRoZSBwbHQKLQlvZmZzZXQuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogV2hlbiBjbGVhcmluZyB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQKLQlmbGFnIGFsc28gcmVzZXQgdGhlIHBsdCBvZmZzZXQuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogSW5jcmVtZW50IHRoZSBnb3Qgb2Zmc2V0IGJ5Ci0JdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJ5dGVzLgotCShlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAxNCAxMToxODoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYKLQl0aGUgYm90dG9tLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDYWxsIGJmZF9hbGxvYywgbm90Ci0JeG1hbGxvYy4KLQotTW9uIEp1bCAxMyAxMTowNjozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBTdXByZXNzIGRlZmluaXRpb24gb2YgVEFSR0VUX1VOREVSU0NPUkUgYW5kIGFkZCBhCi0JY29tbWVudCBkZXNjcmliaW5nIHdoZW4gaXQgc2hvdWxkIGJlIGVuYWJsZWQuCi0JQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFVTRVJfTEFCRUxfUFJFRklYIHRvICIiLCB0byBmYWxsIGludG8gbGluZQotCXdpdGggR0NDIHNvdXJjZXMuCi0KLU1vbiBKdWwgMTMgMTM6MDY6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEhhbmRsZSBjYWxsIG9wdGltaXphdGlvbgotCWluZm9ybWF0aW9uIEFUTiByZWNvcmRzLgotCi1GcmkgSnVsIDEwIDE2OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUKLQlzZWN0aW9uIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYSBmdWxseSBsaW5rZWQgZmlsZS4gIEJhc2VkIG9uCi0JcGF0Y2ggZnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT4uCi0KLVdlZCBKdWwgIDggMTE6Mjk6NTYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a19zcGVjaWFsX3JlbG9jKTogRG9uJ3QgbG9zZSB0aGUgaW5mb3JtYXRpb24KLQl0aGF0IGEgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVHVlIEp1bCAgNyAyMTo0NzowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gSnVsICA2IDExOjM1OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRG8gbm90IGNvbXBsYWluIGFib3V0Ci0Jb3ZlcmZsb3dzIGluIEFSTV8yNkQgcGF0Y2hlcywgc2luY2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbgotCWltcGxtZW50ZWQuICBQYXRjaCBzdWJtaXR0ZWQgYnkgRHIuIFIuSi4gQmxhY2sgPHJqYkBkY3MuZ2xhLmFjLnVrPgotCi1TYXQgSnVsICA0IDEyOjI1OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBoYXZlIGFueSBsb25nCi0Jc2VjdGlvbiBuYW1lcywgY2FsbCBjb2ZmX3dyaXRlX3N5bWJvbHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCi1GcmkgSnVsICAzIDEzOjExOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgc2V0IHBoZHJfaW5jbHVkZWQgb25jZSBmb3IgYQotCVBUX0xPQUQgc2VnbWVudCwgcmF0aGVyIHRoYW4gb25seSBzZXR0aW5nIGl0IG9uY2UgZm9yIHRoZSBlbnRpcmUKLQlmaWxlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gc2V0dGluZyB0aGUgTE1BLAotCXJhdGhlciB0aGFuIGlnbm9yaW5nIGV2ZXJ5IHBoZHIgd2l0aCBhIHBfcGFkZHIgb2YgMCwgaWdub3JlIGFsbAotCXRoZSBwaGRycyBpZiB0aGV5IGFsbCBoYXZlIGEgcF9wYWRkciBvZiAwLgotCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IENoZWNrIHdoZXRoZXIgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuCi0KLUZyaSBKdWwgIDMgMTQ6Mzk6MDUgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25fdXNlc19mcmVnKTogSWdub3JlIGxvd2VzdCBiaXQgb2YgcmVnaXN0ZXIgbnVtYmVyLgotCi1GcmkgSnVsICAzIDE0OjM1OjQ4IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGgKLQlmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotCi1UaHUgSnVsICAyIDE4OjM3OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCB1bmRlZmluZWQgZ2xvYmFsCi0JZnVuY3Rpb24gc3ltYm9scy4KLQotVGh1IEp1bCAgMiAxNDo1OTo0MiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCU1lcmdlIG9mIHZheC92bXMgKHJlYWQtb25seSkgc3VwcG9ydAotCSogY29uZmlndXJlLmNvbTogU3VwcG9ydCBWYXggdGFyZ2V0LgotCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IFZheCB0YXJnZXQuCi0JKiB2bXMuaDogUmVuYW1lZCBmcm9tIGV2YXguaCwgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkgc3VwcG9ydC4KLQkqIHZtcy5jOiBSZW5hbWVkIGZyb20gZXZheC1hbHBoYS5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtaGRyLmM6IFJlbmFtZWQgZnJvbSBldmF4LWVtaC5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtZ3NkLmM6IFJlbmFtZWQgZnJvbSBldmF4LWVnc2QuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLXRpci5jOiBSZW5hbWVkIGZyb20gZXZheC1ldGlyLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy1taXNjLmM6IFJlbmFtZWQgZnJvbSBldmF4LW1pc2MuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IFVzZSB1bmJ1ZmZlcmVkIHJlYWQgb24gVk1TL1ZheC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIpOiBOZXcgZmxhdm91ci4KLQkodm1zX2FscGhhX3ZlYyk6IFJlbmFtZWQgZnJvbSBldmF4X2FscGhhX3ZlYy4KLQkodm1zX3ZheF92ZWMpOiBOZXcuCi0JKHRhcmdldF92ZWN0b3IpOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi0qdm1zKik6IFVzZSB2bXNfYWxwaGFfdmVjLCBub3QKLQlldmF4X2FscGhhX3ZlYy4KLQkodmF4Ki0qLSp2bXMqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBVcGRhdGUgZm9yIHJlbmFtZWQgZmlsZXMuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLVRodSBKdWwgIDIgMTM6MzE6NTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEZvcmNlIGEgdHJhaWxpbmcgTlVMTAotCXBvaW50ZXIgb24gYWJmZC0+b3V0c3ltYm9scy4KLQkoZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCk6IEhhbmRsZSBOVUxMIHN5bSBwYXJhbWV0ZXIuCi0KLVdlZCBKdWwgIDEgMTc6MDU6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBzdXBwb3J0IGZvciBjaGFuZ2luZyBWTUEgb3IKLQlMTUEgb2Ygc2VjdGlvbnMuCi0KLVdlZCBKdWwgIDEgMTY6NTg6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgYWRkcmVzcyBjb21wYXJpc29ucwotCXdoZW4gaGFuZGxpbmcgMzIgYml0IGltbWVkaWF0ZSByZWxvY3MuCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdW4gMzAgMDk6NTU6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogQWNjb3VudCBmb3IgcmVjZW50bHkgYWRkZWQgZ2NfbWFyawotCWZpZWxkIGluIHN0cnVjdCBhc2VjdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChiZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1UaHUgSnVuIDI1IDE4OjMxOjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlFTEYgU2VjdGlvbi1sZXZlbCBHYXJiYWdlIENvbGxlY3Rpb246Ci0JKiBiZmQuYyAoYmZkX2djX3NlY3Rpb25zKTogTmV3LgotCSogYW91dC1hZG9iZS5jOiBIb29rIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0LXRpYzMwLmMsIGJpbmFyeS5jLCBib3V0LmM6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYywgY29mZmNvZGUuaDogTGlrZXdpc2UuCi0JKiBldmF4LWFscGhhLmMsIGkzODZtc2Rvcy5jLCBpMzg2b3M5ay5jLCBpZWVlLmM6IExpa2V3aXNlLgotCSogaWhleC5jLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIHBwY2Jvb3QuYywgc3JlYy5jOiBMaWtld2lzZS4KLQkqIHRla2hleC5jLCB2ZXJzYWRvcy5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0xJTkspOiBBZGQgX2JmZF9nY19zZWN0aW9ucy4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTogTmV3LgotCShiZmRfZ2VuZXJpY19nY19zZWN0aW9ucyk6IE5ldy4KLQkqIHNlY3Rpb24uYyAoU0VDX0tFRVApOiBOZXcuCi0JKGFzZWN0aW9uKTogQWRkIGdjX21hcmsgbWVtYmVyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nYyopOiBOZXcgbmFtZSByZW1hcHBpbmdzLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgY29udGVudHMgb24gc3RhYnMKLQlzZWN0aW9ucyB0byBiZSBleGNsdWRlZC4KLQkoZWxmX2djX21hcmssIGVsZl9nY19zd2VlcCwgZWxmX2djX3N3ZWVwX3N5bWJvbCk6IE5ldy4KLQkoZWxmX2djX3Byb3BvZ2F0ZV92dGFibGVfZW50cmllc191c2VkKTogTmV3LgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTmV3LgotCShlbGZfZ2Nfc2VjdGlvbnMsIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0LCBlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBOZXcuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBOZXcuCi0JKGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rKTogTmV3LgotCSogZWxmeHgtdGFyZ2V0Lmg6IEFkZCBhbmQgZGVmYXVsdCBnYyBob29rcy4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFN3YXAgZ290X29mZnNldC9wbHRfb2Zmc2V0Ci0JZm9yIHVuaW9ucy4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBMaWtld2lzZSBmb3IgbG9jYWxfZ290X29mZnNldHMuCi0JKiBlbGYuYywgZWxmLWkzODYuYywgZWxmMzItbTY4ay5jLCBlbGYzMi1taXBzLmM6IFVwZGF0ZSBhbGwgdXNlcy4KLQkqIGVsZjMyLXBwYy5jLCBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMsIGVsZmxpbmsuaDogTGlrZXdpc2UuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdnRhYmxlIG1lbWJlcnMuCi0JKEVMRl9MSU5LX0hBU0hfTUFSSyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgR0MgaG9va3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBaZXJvIHZ0YWJsZSBtZW1iZXJzLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyk6IE5ldy4KLQkobW4xMDMwMF9lbGZfZ2NfbWFya19ob29rKTogTmV3LgotCShSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZKTogTmV3LgotCShlbGZfbW4xMDMwMF9ob3d0bywgbW4xMDMwMF9yZWxvY19tYXApOiBIYW5kbGUgdGhlbS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLW1pcHMuYyAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIFJfTUlQU19HTlVfVlRFTlRSWSk6IE5ldy4KLQkoZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bywgZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG8pOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgdGhlbS4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2ssIG1pcHNfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLXBwYy5jIChSX1BQQ19HTlVfVlRJTkhFUklULCBSX1BQQ19HTlVfVlRFTlRSWSk6IE5ldy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBIYW5kbGUgdGhlbS4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZWZlcmVuY2UgY291bnQgLmdvdCBhbmQgLnBsdCBlbnRyaWVzLgotCUhhbmRsZSBuZXcgdnRhYmxlIHJlbG9jcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZWNvZ25pemUgdW51c2VkIC5wbHQgZW50cmllcy4KLQkocHBjX2VsZl9nY19tYXJrX2hvb2ssIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1GcmkgSnVuIDI2IDEwOjQ4OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbW4xMDMwMCk6IERlZmluZS4KLQkqIGVsZi1tMTAzMDAuYzogSW5jbHVkZSBlbGYvbW4xMDMwMC5oCi0JKGVsZl9tbjEwMzAwX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotVGh1IEp1biAyNSAxODozMTowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBISTE2X1MKLQlyZWxvY2F0aW9uLgotCi1XZWQgSnVuIDI0IDE3OjE3OjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMb29wIG92ZXIgaW5wdXRfYmZkcyB1c2luZyB0aGUKLQlsaW5rX25leHQgZmllbGQsIG5vdCB0aGUgbmV4dCBmaWVsZC4KLQotU3VuIEp1biAyMSAxOTozODozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGUgc2VjdGlvbiBhZGRyZXNzCi0JYWdhaW5zdCB0aGUgcGhkciBzaXplIGJvdGggd2l0aCBhbmQgd2l0aG91dCBhIG1vZHVsbyBvZgotCW1heHBhZ2VzaXplLgotCi1GcmkgSnVuIDE5IDE3OjA4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHN0cmlwIGEKLQlsaW5rZXIgY3JlYXRlZCBlbXB0eSBpbnB1dCBzZWN0aW9uIGlmIHRoZSBvdXRwdXQgc2VjdGlvbiBoYXMgdGhlCi0Jc2FtZSBuYW1lLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGlmCi0JX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZhaWxzLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2FsbCBiZmRfc2V0X2Vycm9yIG9uCi0JZmFpbHVyZS4KLQotVHVlIEp1biAxNiAxMTo1NTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJbXByb3ZlIGhhbmRsaW5nIG9mIFNvbGFyaXMKLQluYXRpdmUgbGlua2VyIG91dHB1dC4gIEF2b2lkIHB1dHRpbmcgYW4gZW1wdHkgc2VjdGlvbiBpbiBtb3JlIHRoYW4KLQlvbmUgc2VnbWVudC4KLQotRnJpIEp1biAxMiAxMzozMDoxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxMzozNDowMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IE5ldyBhcmcgcmVsb2NhdGFibGVfcC4KLQlEb24ndCBhZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9scyBmb3IgcmVsb2NhdGFibGUgb3V0cHV0LgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVcGRhdGUgY2FsbCB0bwotCXN3YXBfb3V0X3N5bXMuCi0KLU1vbiBKdW4gIDggMTU6MjA6NTcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBNYWtlIGNvbXBhcmlzb25zCi0JYWdhaW5zdCAnYWRkZW5kJyBiZSBzaWduZWQgcmF0aGVyIHRoYW4gdW5zaWduZWQuCi0KLVNhdCBKdW4gIDYgMDA6MzE6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiBBZGQgcHJvdG90eXBzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotRnJpIEp1biAgNSAxNzoyMTo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX3NvcnRfc2VjdGlvbnMpOiBTb3J0IGJ5IExNQSBmaXJzdCB0aGVuIFZNQSwgc2luY2UgdGhlCi0JTE1BIGlzIHVzZWQgdG8gb3JkZXIgc2VjdGlvbnMgaW4gYSBzZWdtZW50LgotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCUNoYW5nZSB0eXBlIG9mIGFkZGVuZCBwYXJhbWV0ZXIgdG8gYmZkX3ZtYSBpbiB2YXJpb3VzIGZ1bmN0aW9ucy4KLQotRnJpIEp1biAgNSAxODowOTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IENoYW5nZSBSRUxPQ19CQVNFMTMgdG8gdXNlCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkIGluc3RlYWQgb2YgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQuCi0KLUZyaSBKdW4gIDUgMTU6MTE6MTEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZi5jIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBhZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9sIHZhbHVlCi0Jd2hlbiBjb21wYXJpbmcgYWdhaW5zdCAwLgotCi1XZWQgSnVuICAzIDE3OjUyOjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBKdW4gIDMgMTI6MTg6MjQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEdpdmUgYW4KLQllcnJvciBpZiBwcmV2aW91cyBvYmplY3QgZW5kaWFubmVzcyBkb2Vzbid0IG1hdGNoIGN1cnJlbnQgb2JqZWN0LgotCi1UdWUgSnVuICAyIDE3OjUwOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENhbGwKLQlfYmZkX2VsZl9wcmludF9wcml2YXRlKWJmZF9kYXRhICgpLgotCi1UdWUgSnVuICAyIDE1OjI5OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG9uJ3QgYWx3YXlzIHNldCB0eXBlX2NoYW5nZV9vawotCWFuZCBzaXplX2NoYW5nZV9vay4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHR5cGVfY2hhbmdlX29rIGFuZAotCXNpemVfY2hhbmdlX29rIGJlZm9yZSBjYWxsaW5nIGVsZl9tZXJnZV9zeW1ib2wuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHdlIGlzc3VlIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBlcnJvciwgZG9uJ3QgYWxzbyBpc3N1ZSBhbiBvdmVyZmxvdyBlcnJvci4KLQotVHVlIEp1biAgMiAxMzo1MTowMCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVGhlIHRhcmdldCBvZiBhbgotCVJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhbDsgaWYgbm90LCBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgaW5zdGVhZCBvZiBjcmFzaGluZy4KLQotTW9uIEp1biAgMSAxODoyMzoxMiAxOTk4ICBZdWxpIEJhcmNvaGVuICA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2NwdTMyKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogQWRkIGNhc2UgZm9yIDY4MDYwLiAgRml4IDY4MzMyIGNhc2UgdG8gdXNlCi0JYmZkX21hY2hfY3B1MzIuCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG02OGs6Y3B1MzIuCi0JKiBpZWVlLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShpZWVlX29iamVjdF9wKTogUGFyc2Ugb3V0IHByb2Nlc3MgSUQgc3RyaW5nIHRvIG1ha2UgaXQgbW9yZQotCWxpa2VseSB0byBiZSBhY2NlcHRhYmxlIGZvciBiZmRfc2Nhbl9hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gSnVuICAxIDExOjEyOjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsc28gY2FsbAotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoKSBzbyB0aGF0IHRoZSBwcm9ncmFtIGhlYWRlciB3aWxsCi0JYmUgZGlzcGxheWVkLgotCi1Nb24gSnVuICAxIDEyOjE0OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQ2hlY2sgZm9yIENfU0VDVElPTiByYXRoZXIgdGhhbgotCTB4NjguICBSZWluZGVudC4gIEFkZCBzb21lIGNvbW1lbnRzLgotCi1GcmkgTWF5IDI5IDA5OjU4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGp1c3QgcGh5c2ljYWwgYWRkcmVzcyBvZgotCXNlZ21lbnQgaW4gb3V0cHV0IEJGRCB0byBjb250YWluIExNQXMgb2YgaXRzIHNlY3Rpb25zLgotCi1UdWUgTWF5IDI2IDE5OjM3OjQ3IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZGVkIFJfU1BBUkNfMzJMRSBmb3IgbGl0dGxlCi0JZW5kaWFuIGRhdGEgMzIgYml0IHJlbG9jYXRpb25zLgotCShlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgaWYgbGlua2luZyBsaXR0bGUKLQllbmRpYW4gb2JqZWN0cyB3aXRoIGJpZyBlbmRpYW4gb2JqZWN0cy4KLQkoZWxmMzJfc3BhcmNfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX0xFREFUQSBpbiBlX2ZsYWdzLgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBBZGRlZCBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkqIHJlbG9jLmM6IFNhbWUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIHNwYXJjOnNwYXJjbGl0ZV9sZQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCSogYmZkLWluMi5oIChCRkRfUkVMT0NfU1BBUkNfMzJMRSwgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCi1UaHUgTWF5IDIxIDE2OjU5OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBGaXggcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMgaW4gaWYgKCkKLQlzdGF0ZW1lbnQuCi0KLVR1ZSBNYXkgMTkgMTg6NDE6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogTW92ZSBvdmVyIHBhdGNoIHRvIGJmZC1pbjIuaC4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogQWRkIGNhc3RzIGJlZm9yZSBzaGlmdHMgd2hpY2ggbWF5Ci0Jbm90IGZpdCBpbiAzMiBiaXRzLgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgMTggMTQ6NDQ6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IElmIHRoZSBzZWN0aW9uIGhhcyBubyBwcml2YXRlIGRhdGEKLQl0aGVuIGRvIG5vdCBjcmVhdGUgYSBEYXRhIERpY3Rpb25hcnkgZW50cnkgZm9yIGl0LgotCi1Nb24gTWF5IDE4IDAwOjA5OjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZXQgYWdhaW4gb24gY2hhbmdlcy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMsIGVsZjY0X2FscGhhX21lcmdlX2dvdHMsCi0JZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBSZXdyaXRlLCBoYW5kbGluZyBtdWx0aXBsZSBnb3QKLQlzdWJzZWN0aW9ucyBkdXJpbmcgcmVsYXhhdGlvbiBtb3JlIGNvcnJlY3RseS4KLQotVGh1IE1heSAxNCAxNDoyMjo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzICgpLgotCUFkZCBleHRyYSBhcmd1bWVudCB0byBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKCkuCi0JKiBiZmQtaW4uaDogUmVmbGVjdCBjaGFuZ2VzIG1hZGUgaW4gYmZkLWluMi5oLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZQotCWNvZmYgY2xhc3Mgb2YgYSBCRkQgc3ltYm9sLgotCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIFRodW1iIGNvZGUgYW5kCi0Jbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4KLQotU3VuIE1heSAxMCAyMjozMzo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTc6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JSWYgc3lzZGVwLmggaW5jbHVkZXMgYSBoZWFkZXIgZmlsZSwgZG9uJ3QgaW5jbHVkZSBpdCBhZ2FpbjoKLQkqIGFpeDM4Ni1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LCA8c3RkZGVmLmg+LCBvcgotCTxlcnJuby5oPi4KLQkqIGFvdXR4Lmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4gIFVzZSAic3lzZGVwLmgiIHJhdGhlciB0aGFuCi0JPHN5c2RlcC5oPi4KLQkqIGFyY2hpdmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+IG9yIDxlcnJuby5oPi4KLQkqIGV2YXgtYWxwaGEuYzsgRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4uCi0JKiBldmF4LWVnc2QuYzogTGlrZXdpc2UuCi0JKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCi0JKiBldmF4LW1pc2MuYzogTGlrZXdpc2UuCi0JKiBldmF4LWVtaC5jOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGhwcGFic2QtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwgb3IKLQk8ZXJybm8uaD4uCi0JKiBocHV4LWNvcmUuYzogTGlrZXdpc2UuCi0JKiBuZXRic2QtY29yZS5jOiBMaWtld2lzZS4KLQkqIHNvbS5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBubG1jb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KLQkqIG9zZi1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8c3RkaW8uaD4uCi0JKiBwdHJhY2UtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwKLQk8ZXJybm8uaD4sIG9yIDx1bmlzdGQuaD4uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4gb3IgPHN5cy90eXBlcy5oPi4KLQotVGh1IE1heSAgNyAxMzoxMjo1MCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogSWYgdGhlIHZlcnNpb24gbnVtYmVyIGNhbiBub3QgYmUgZm91bmQgaW4KLQljb25maWd1cmUuaW4sIHNldCBpdCB0byAidW5rbm93biIgcmF0aGVyIHRoYW4gIjIuOC4xIi4KLQotV2VkIE1heSAgNiAwOTo0NjowNSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogTmV3LgotCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogVXNlIGVsZl9taXBzX21hY2guCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSB0aGUgbmFtZXMKLQlvZiBtYWNoaW5lcywgcmF0aGVyIHRoYW4gdGhlIG51bWJlcnMuICBTZXQgYm90aCB0aGUgQVJDSAotCWFuZCBNQUNIIGluIGVfZmxhZ3MuICBIYW5kbGUgYSBmZXcgbW9yZSBzcGVjaWZpYyBtYWNoaW5lcy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWVyZ2UgYm90aAotCUVGX01JUFNfQVJDSCBhbmQgRUZfTUlQU19NQUNILgotCi1UdWUgTWF5ICA1IDIxOjAxOjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBEaXNjYXJkIGRlYnVnZ2luZyBzeW1ib2xzLgotCi1UdWUgTWF5ICA1IDIzOjM2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCSogc29tLmg6IERvbid0IGluY2x1ZGUgc3lzZGVwLmguCi0KLVR1ZSBNYXkgIDUgMTg6Mjk6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBzeXNkZXAuaDogTW92ZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGhlcmUuCi0KLVR1ZSBNYXkgIDUgMTY6NDc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHJhdGhlciB0aGFuCi0JYW4gYWQtaG9jIHRlc3QuICBLaWxsIGJvZ3VzICNpZiAwIGNvZGUuCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IENvbnNpZGVyIEJTRl9ERUJVR0dJTkcgc3ltYm9scyBsb2NhbC4KLQotTW9uIE1heSAgNCAxNjoxMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBEb24ndCB1c2UgdGhlIFBMVCBhZGRyZXNzCi0Jd2hlbiBnZW5lcmF0aW5nIGEgbm9ybWFsIGV4ZWN1dGFibGUgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgZmlsZS4gIFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gdGhlIG91dHB1dCBmaWxlLCBhZGp1c3QKLQl0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLgotCi1Nb24gTWF5ICA0IDEwOjA4OjE4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KLQotTW9uIE1heSAgNCAxMTowMjoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hLAotCW5vdCBzaWduZWQuCi0JKiBwZWljb2RlLmggKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBVc2UgUEFSQU1TCi0Jd2hlbiBkZWNsYXJpbmcgcGFyYW1ldGVyIHR5cGVzLgotCShwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyOSAxNTozNTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IElmIHdlIGluY2x1ZGUgYW55IEVMRiB0YXJnZXRzIGluIHRhcmdfZGVmdmVjIGFuZC9vcgotCXRhcmdfc2VsdmVjcywgdGhlbiBhZGQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldHMgdG8gdGFyZ19zZWx2ZWNzLgotCSogZWxmMzItZ2VuLmMgKGR1bW15KTogTmV3IHN0YXRpYyBjb25zdCB2YXJpYWJsZS4KLQkoZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZWxmX2dlbmVyaWNfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsLgotCSogZWxmNjQtZ2VuLmM6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi1nZW4uYy4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRm9yIHRoZSBnZW5lcmljIHRhcmdldCwgaWdub3JlIGEKLQlmYWlsdXJlIG9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBGaXggaW5kZW50YXRpb24gYSBiaXQuCi0KLVR1ZSBBcHIgMjggMjA6MDU6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEFwciAyOCAxMjoxNjo1NyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogIFVwZGF0ZSBPU1I1L1VuaXh3YXJlIHBhdHRlcm5zLgotCi1Nb24gQXByIDI3IDE4OjAyOjI0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWxsb3cgZm9yIGhvbGVzCi0JYmV0d2VlbiBzZWN0aW9ucyBhZGRlZCBieSBhIGxpbmsgc2NyaXB0LgotCi1Nb24gQXByIDI3IDExOjQ5OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZWxmLmMgKGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1TYXQgQXByIDI1IDIwOjA3OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogUmVwbGFjZSBlbGZzeW0gd2l0aCBvdGhlci4KLQlDaGFuZ2UgYWxsIHVzZXJzLgotCi1TYXQgQXByIDI1IDE4OjI5OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogQWRkIHRzZWMgJiBlbGZzeW0gbWVtYmVycy4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEZpbGwgdGhlbSBpbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBJbXBsZW1lbnQgbW9yZSB0aGFuIGEgc3R1Yi4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIG9yIGRlZmF1bHQKLQlhbGlnbm1lbnQgb24gLnNjb21tb24uCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSB1c2UgY291bnRzIGFzIHdlbGwuCi0KLVNhdCBBcHIgMjUgMTQ6MDc6MjkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFVzZSB0aGUgcHJvcGVyIHNlY3Rpb24KLQlmb3IgY2FsY3VsYXRpbmcgYSBsb2NhbCBzeW1ib2wncyBhZGRyZXNzLgotCShlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzKTogU2tpcCBlbnRyaWVzIHdpdGggMCB1c2UgY291bnQuCi0JU2V0IHRoZSAuZ290J3MgY29va2VkIHNpemUgYXMgd2VsbCBhcyB0aGUgcmF3IHNpemUuCi0KLUZyaSBBcHIgMjQgMDk6MTY6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkCi0JaW50ZXJuYXRpb25hbGlzYXRpb24gb2YgcHJpbnRlZCBpbmZvcm1hdGlvbi4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAotCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCi0KLUZyaSBBcHIgMjQgMTI6MDk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBpbmRleGVudHJ5KTogQ2hhbmdlIGRpcmVjdG9yeV9uYW1lLCBmaWxlX25hbWUsCi0JYW5kIGZ1bmN0aW9uX25hbWUgZmllbGRzIHRvIGNoYXIgKi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQ2hhbmdlIGNhY2hlZF9maWxlX25hbWUgZmllbGQgdG8gY2hhciAqLgotCi1UaHUgQXByIDIzIDA4OjEzOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkIG1pc3NpbmcgTl8oKSBtYWNyb3MgdG8gZGlyX25hbWVzIGFycmF5LgotCi1XZWQgQXByIDIyIDEzOjA2OjE1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNzo0ODo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlICQoaW5jbHVkZWRpcikuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oOiBVc2UgYGdldHRleHQnIGFuZCBub3QgYGRnZXR0ZXh0JyBmb3Igbm93LgotCi1XZWQgQXByIDIyIDEyOjUzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZCBmb3IgTmljaydzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjEgMjM6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRml4IGxvc3NhZ2UgaW4gbGFzdAotCWNoYW5nZSB3cnQgbGVuZ3RoID09IG1heF9uYW1lbGVuLgotCi1UdWUgQXByIDIxIDIxOjE5OjM2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBsaWJiZmQtaW4uaDogQWRkZWQgZ2V0dGV4dCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBOZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoU09VUkNFX0hGSUxFUyk6IE5ldyBtYWNyby4KLQkoSEZJTEVTKTogVXNlIGl0LgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JmZC5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxMzozODoxOCAxOTk4IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiAgQ29weSBjb3JlX3Byc3RhdHVzIGZyb20gdGhlIGZpcnN0Ci0JTlRfUFJTVEFUVVMgbm90ZSBzZWN0aW9uIGVuY291bnRlcmVkLCBpdCBjb250YWlucyB0aGUgc3RhdHVzIG9mCi0JdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkIHdoZW4gdGhlIGNvcmUgZmlsZSB3YXMgd3JpdHRlbi4KLQotVHVlIEFwciAyMSAxMDowMDoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLmg6IEFkZCBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gb3ZlcnJpZGVhYmxlIGZ1bmN0aW9uLgotCSogY29mZmxpbmsuYzogUGFzcyBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gZnVuY3Rpb24uCi0JKiBiZmQtaW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIEFSTSBpbnRlcndvcmtpbmcKLQlmdW5jdGlvbnMuCi0JKiBwZWljb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECi0JY29kaW5nIGNvbnZlbnRpb25zLgotCSogY29mZmNvZGUuaDogQVJNIHNwZWNpZmljIGNvZGUgcmVvcmdhbmlzZWQgdG8gY29uZm9ybSB0byBCRkQKLQljb2RpbmcgY29udmVudGlvbnMuCi0JKiBjb2ZmLWFybS5jOiBDb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gdGhlIEJGRCBjb2RpbmcKLQljb252ZW50aW9ucy4gIEdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYW4gQVJNCi0Jc3BlY2lmaWMgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgYW5kIGEgbmV3IGZ1bmN0aW9uOgotCWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKCkgaGFzIGJlZW4gY3JlYXRlZCB3aGljaCBpcwotCWNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cy4KLQotVHVlIEFwciAyMSAwMDoxMTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBTaW1wbGlmeSBlbmQtb2YtbmFtZSB0ZXN0LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyk6IFJlbmFtZWQgZnJvbQotCWVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogUHV0IHNtYWxsIGNvbW1vbnMgaW4gLnNjb21tb24gbm90IC5zYnNzLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IERvbid0IG1lcmdlIC5nb3Qgc2VjdGlvbnMgdHdpY2UuCi0KLVNhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMjI6Mjk6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29tcGxhaW4gYWJvdXQKLQlhbiBvdXQgb2YgcmFuZ2UgcGMtcmVsYXRpdmUganVtcC9jYWxsIHRvIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotVGh1IEFwciAxNiAxMzo0OTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3ApOiBEbyBhbGwgZ3BkaXNwCi0JY29tcGFyaXNvbnMgc2lnbmVkLgotCi1UaHUgQXByIDE2IDExOjQzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiBhIHNsdXJwIHN1YnJvdXRpbmUgcmV0dXJucwotCWFuIGVycm9yIG90aGVyIHRoYW4gYmZkX2Vycm9yX3N5c3RlbV9jYWxsLCBzZXQgdGhlIGVycm9yIHRvCi0JYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3RvcikgW1NFTEVDVF9WRUNTIG5vdCBkZWZpbmVkXTogQWRkCi0JYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMuCi0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBhbGwgdGhlIHBfcGFkZHIgZmllbGRzIGluIHRoZQotCXByb2dyYW0gc2VnbWVudHMgYXJlIHplcm8sIGRvbid0IHNldCBwX3BhZGRyX3ZhbGlkLgotCi1XZWQgQXByIDE1IDIyOjE1OjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmM6IEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgcmVsYXhhdGlvbiAtLQotCShzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB1c2VfY291bnQgbWVtYmVyLgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBJbml0aWFsaXplIGFuZCBpbmNyZW1lbnQgaXQuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzKTogQ2hlY2sgaXQgd2hlbiBjb25zaWRlcmluZyBtZXJnaW5nLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogRHJvcCBlbnRyaWVzIHdpdGggemVybyB1c2UuCi0JKGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IFNwbGl0IG91dCBnb3Qgc2l6aW5nIC4uLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IC4uLiBoZXJlLiAgTmV3IGZ1bmN0aW9uLgotCShlbGY2NF9hbHBoYV9yZWxheF9maW5kX3JlbG9jX29mcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfaG93dG9fdGFibGUpOiBJbXBsZW1lbnQgR1BSRUxISUdIL0xPVyAmIElNTUVEX0dQXzE2LgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMTUgMTY6MDg6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFVzZSBuZXcgRU1fU1BBUkNWOSBzeW1ib2wuCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFDSElORV9DT0RFKTogTGlrZXdpc2UuCi0JKEVMRl9NQUNISU5FX0FMVDEpOiBOZXcuICBTZXQgdG8gRU1fT0xEX1NQQVJDNjQuCi0KLVdlZCBBcHIgMTUgMTE6MzQ6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAtbGtlcm5lbDMyIHRvIFdJTjMyTElCQUREIG9uIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEzIDE2OjQ2OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9sYV9MSUJBREQpOiBBZGQgQFdJTjMyTElCQUREQC4KLQkobGliYmZkX2xhX0xERkxBR1MpOiBBZGQgQFdJTjMyTERGTEFHU0AuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBXSU4zMkxERkxBR1MgYW5kCi0JV0lOMzJMSUJBREQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByIDEwIDEzOjQ0OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNb3ZlIGEgUEUgQ09NREFUIHN5bWJvbAotCWJlZm9yZSBhbnkgb3RoZXIgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi1XZWQgQXByICA4IDE0OjUwOjIzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjKi0qLSopOiBSZW1vdmUgUG93ZXJQQyBOVCBzdXBwb3J0IGZyb20gRUxGCi0Jc3lzdGVtcy4KLQotVHVlIEFwciAgNyAxNjoyNTozMSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKGNvbXBfdW5pdCk6IE1vdmUgaXQgZWFybGllciBpbiB0aGUgc291cmNlLiBBZGQKLQlhZGRyX3NpemUuCi0JKHJlYWRfYWRkcmVzcyk6IFJlcGxhY2UgJ2JkZionIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotCVVzZSBhZGRyX3NpemUgZm9yIGFkZHJlc3Mgc2l6ZSwgcmF0aGVyIHRoYW4gc2l6ZW9mKGJmZF92bWEpLgotCShyZWFkX2F0dHJpYnV0ZSk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JU2NyYXAgb3RoZXIgdW5uZWVkZWQgYXJndW1lbnRzLiAgRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgotCShzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyk6IEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlLgotCShwYXJzZV9jb21wX3VuaXQpOiBXZSBub3cgaGFuZGxlIG1vcmUgdmFsdWVzIGZvciBhZGRyX3NpemUuCi0JU2V0IGFkZHJfc2l6ZSBpbiB1bml0LiAgRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUgYW5kCi0JZGVjb2RlX2xpbmVfaW5mby4KLQotVHVlIEFwciAgNyAxNTo0NDo0NyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocGFyc2VfY29tcF91bml0KTogRHJvcCB1c2Ugb2YgdW5pdC0+bmFtZSB3aGVuIGl0IGlzIG51bGwuCi0KLVR1ZSBBcHIgIDcgMTI6MzU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIG02OGsgY2FzZXMgYmFjayB0byBkZWZhdWx0Ci0Jc3dpdGNoLCByZXZlcnRpbmcgcGF0Y2ggb2YgTWFyY2ggMjUsIHNpbmNlIElFRUUgc3VwcG9ydCBkZXBlbmRzCi0JdXBvbiB0aGVtLgotCi1Nb24gQXByICA2IDE0OjA2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxNjoyMTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEZpeCBjb21wdXRhdGlvbiBvZgotCXNvbV9vZmZzZXQgd2hlbiB3ZSBoYXZlIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJiZmQuYSBleGlzdHMgYmVmb3JlCi0JdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxMTowOTo0MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBzZWN0aW9uCi0Jc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IGFib3ZlIGNvZGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbgotCXN5bWJvbHMuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgYWJvcnQgdG8gQkZEX0FTU0VSVC4KLQotV2VkIEFwciAgMSAxNjowNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogVXNlIEFSTV9SVkEzMiBpbiBwbGFjZSBvZiBjb25zdGFudAotCXZhbHVlIDExLgotCi1XZWQgQXByICAxIDEzOjM2OjU4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24sIGNhc2UgUl82OEtfUExUKk8pOiBGaXgKLQlhc3NlcnRpb24uCi0KLVR1ZSBNYXIgMzEgMDA6MTI6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgaGFuZGxlCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotTW9uIE1hciAzMCAxMjo0NjoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMjoyMDo1MCAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoRU5BQkxFX0NBQ0hJTkcpOiBEZWZpbmUuCi0JKHN0cnVjdCBpbmRleGVudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9jYWNoZSk6IFJlbW92ZS4KLQkoY21waW5kZXhlbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IEFkZCBuZXcgZmllbGRzOiBpbmRleHRhYmxlLAotCWluZGV4dGFibGVzaXplLCBjYWNoZWRfaW5kZXhlbnRyeSwgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsIGFuZAotCWNhY2hlZF9maWxlX25hbWUuICBSZW1vdmUgZmllbGRzOiBmaWxlX2NhY2hlLCBmdW5jdGlvbl9jYWNoZSwgYW5kCi0JbGluZV9jYWNoZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZXdyaXRlIHRvIGJ1aWxkIGEgc29ydGVkCi0JaW5kZXggdGFibGUgYW5kIHNlYXJjaCBpdC4KLQotTW9uIE1hciAzMCAxMDozOTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbAotCWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBvbmNlIHdlJ3ZlIHNlZW4gdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24uCi0KLQkqIGNwdS1taXBzLmM6IFJlbW92ZSB0cmFpbGluZyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRpb24gbGlzdC4KLQotU2F0IE1hciAyOCAxNjozMzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IERlZmluZSBhbGwgZ2xvYmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotCW9ubHkgd2hlbiBDT0ZGX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMpOiBBZGQKLQljb2ZmLWFybS5sby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjowNjowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhb3V0LWFybS5jIChNWShmaXhfcGNyZWxfMjYpKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTGlrZXdpc2UuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTGlrZXdpc2UuCi0JKiBiaW5hcnkuYyAobWFuZ2xlX25hbWUpOiBMaWtld2lzZQotCSogY29mZi1hcm0uYyAoYW91dGFybV9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1zdGdvMzIuYyAoY3JlYXRlX2dvMzJfc3R1Yik6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IExpa2V3aXNlLgotCShtYW5nbGVfbmFtZSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogTGlrZXdpc2UuCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGFvdXQtbnMzMmsuYyAoX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guICBEZWNsYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzIGlmCi0Jd2FybmluZy4KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYyAoY29mZl90aHVtYl9wY3JlbF9jb21tb24pOiBJbml0aWFsaXplIHJlbG9jYXRpb24uCi0JQWRkIGRlZmF1bHQgY2FzZXMgdG8gc3dpdGNoZXMuCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IHJzdGF0LgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2UgZmxhZyB2YXJpYWJsZSB0byB0eXBlCi0JZmxhZ3dvcmQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSB1c2VfbG8uCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoZHVtcF90b2MpOiBDaGFuZ2UgY2F0IHRvIGNvbnN0LCBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5pdGlhbGl6ZSBzdGFydCBhbmQgdm9mZi4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHJfc3ltbmR4LgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGRlY2xhcmUKLQlvbGRfc29mYXIgaWYgQUxJR05fU0VDVElPTlNfSU5fRklMRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplIGNzeW0uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBNYWtlIHR5cGUgYW5kIGNsYXNzIHVuc2lnbmVkLgotCSogY3B1LW5zMzJrLmMgKF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkocmVhZF8yX3NpZ25lZF9ieXRlcywgcmVhZF80X3NpZ25lZF9ieXRlcyk6IENvbW1lbnQgb3V0LgotCShkZWNvZGVfbGluZV9pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3NkYTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBMaWtld2lzZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZi1iZmQuaCAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpOiBNYWtlIGFsaWdubWVudCB1bnNpZ25lZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBNYWtlIGN2ZXJkZWZzIGFuZCBjdmVycmVmcyB1bnNpZ25lZC4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWx3YXlzIHNldCBhZGp1c3QuCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEluaXRpYWxpemUgdG1wX2FkZHIuICBGdWxseQotCXBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWx3YXlzIGluaXRpYWxpemUgaC4KLQkobTMycl9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBsYXN0IGFuZCBkaW5keC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2Ugc3ltY291bnQgYW5kIGkgdG8KLQl1bnNpZ25lZCBsb25nLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGFuZ2UgdmVybnVtIHRvCi0JdW5zaWduZWQgaW50LCBhbmQgaW5pdGlhbGl6ZSBpdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FzdCAtMSB0byBiZmRfc2l6ZV90eXBlCi0Jd2hlbiBzZXR0aW5nIG9yIGNvbXBhcmluZyB0byBzb25hbWVfaW5keC4KLQkoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ2hhbmdlIG51bV9zeW1ib2xzIHRvCi0JdW5zaWduZWQgaW50LgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSBmbGFncyB0byBmbGFnd29yZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJbml0aWFsaXplIGlkeC4gIENoYW5nZSBqIHRvCi0JYmZkX3NpemVfdHlwZS4gIEluaXRpYWxpemUgaGludF9tZW1iZXIuICBSZW1vdmUgdXNlbGVzcyB0ZXN0IHRvCi0JdGltZV9zdGFtcC4KLQkocGVfcHJpbnRfZWRhdGEpOiBDaGFuZ2UgbnVtX2Z1bmN0aW9ucyBhbmQgbnVtX25hbWVzIGluIHN0cnVjdAotCUVEVF90eXBlIHRvIHVuc2lnbmVkIGxvbmcuICBSZW1vdmUgY2FzdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoYW5nZSBpIHRvIHNpemVfdC4KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAotCWludC4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHNocmlua3MgdG8KLQlpbnQgKi4gIFVwZGF0ZSB1c2VzLiAgQ2hhbmdlIGogdG8gbG9uZy4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDEwOjEwOjQ2IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyBSZW1vdmUgZGVmaW5pdGlvbiBvZiBVU0VfUkVMLgotCSh2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBSZW5hbWVkIGZyb20KLQl2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbi4gIFJlbW92ZWQgcmVwbGFjZSBhcmd1bWVudC4KLQkodjg1MF9lbGZfcmVsb2MpOiBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbiB0aGUgYWRkZW5kIGZpZWxkIGluc3RlYWQKLQlvZiB0aGUgaW5zbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBOb3cgY2FsbHMKLQl2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgUmVtb3ZlIGNvZGUgdG8gZ2VuZXJhdGUgUkVMCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBNYXIgMjYgMTM6MzI6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UKLQljbGFzcyBpbiB0aGUgbmF0aXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgZm9yIGEgbmV3IHNlY3Rpb24KLQlzeW1ib2wuCi0KLVRodSBNYXIgMjYgMTA6MTM6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oOiBDaGFpbiB0b2dldGhlciBjYWxscyB0bwotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1XZWQgTWFyIDI1IDE1OjQ1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBwcml2YXRlIGZhbGdzIGV2ZW4gZm9yIGEgUEUKLQlidWlsZC4KLQotCSogcGVpY29kZS5oOiBDYWxsIGFybS1jb2ZmIHByaXZhdGUgZGF0YSBmdW5jdGlvbnMgYWZ0ZXIgaGFuZGxpbmcKLQlwZSBwcml2YXRlIGRhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IFR1cm4gc3RhdGljcyBpbnRvIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQKLQlib3RoIHBlIGFuZCBwZWkgYmFja2VuZHMuCi0KLVdlZCBNYXIgMjUgMTU6MTk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlciB0aGFuCi0JcGxhaW4gbnVtYmVycy4KLQkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMzo1OToyNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTY4Kik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBtNjhrCi0JdmFyaWFudHMuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBSZW1vdmUgbTY4ayBzcGVjaWFsIGNhc2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbWlwc2JzZC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyCi0JdGhhbiBwbGFpbiBudW1iZXJzLgotCSogc3BhcmNseW54LmMgKE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSk6IExpa2V3aXNlLgotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLiAgQWRkIGVudHJ5IGZvcgotCW02OGs6NjgwMDAuCi0JKGJmZF9tNjhrX2FyY2gpOiBTZXQgbWFjaCBmaWVsZCB0byB6ZXJvIHRvIHNpZ25hbCBubyBleHBsaWNpdAotCXNlbGVjdGlvbiwgY2hhbmdlIHByaW50YWJsZV9uYW1lIHRvIGp1c3QgIm02OGsiIGFuZCBtYWtlIHRoYXQgdGhlCi0JZGVmYXVsdCBpbnN0ZWFkIG9mIG02OGs6NjgwMjAuCi0KLQkqIGFvdXQtdGljMzAuYyAoTkFNRSk6IERlZmluZSB0aGlzIHRvIGF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zCi0JZnJvbSBhb3V0eC5oLgotCShNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSBhcyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0JcmF0aGVyIHRoYW4gTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKS4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBGaXggY2FzdC4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X3NldF9hcmNoX21hY2gpOiBPbmx5IGFjY2VwdCBiZmRfYXJjaF9hbHBoYQotCWFuZCBjYWxsIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8gZG8gdGhlIHJlYWwgd29yay4KLQotV2VkIE1hciAyNSAxMDo0MTozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKEJBTFgpOiBJbmNsdWRlIHJldHVybiByZWdpc3RlciBnMTQgYXMgcGFydCBvZiB0aGUgaW5zbi4KLQkoQkFMWF9NQVNLKTogTmV3LgotCShjYWxsanhfY2FsbGJhY2spOiBVc2UgaXQuCi0KLVdlZCBNYXIgMjUgMTE6MTk6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogQ2FzdCB0aGlzIHBhcmFtZXRlciB0byBiZmRfdm1hLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IENoYW5nZQotCWJ5dGVfY291bnQgdG8gdW5zaWduZWQgaW50LgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBpbnRlcm5hbF9yZWxvY3MuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzIGVyIGFuZCBlcjEuCi0KLQkqIGNwdS12ODUwLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzY2FuKTogQ2FzZSBpc2RpZ2l0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIuCi0KLQlGcm9tIFlhbiBNZXJvdGggPFlBTi5NRVJPVEhAc3QuY29tPjoKLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWRkIGV4dGJhc2UgdmFyaWFibGUgc28gdGhhdCBnZXR0aW5nIGFuCi0JZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGRvZXMgbm90IGlnbm9yZSBhbnkgcHJldmlvdXMKLQlleHRlbmRlZCBhZGRyZXNzLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gd3JpdGluZyBvdXQgYW4gZXh0ZW5kZWQgbGluZWFyCi0JYWRkcmVzcyByZWNvcmQsIHplcm8gb3V0IGFueSBwcmV2aW91cyBleHRlbmRlZCBhZGRyZXNzLgotCi1UdWUgTWFyIDI0IDE2OjA5OjQzIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogaWVlZS5jIChkb19vbmUpOiBDaGVjayBzZWN0aW9uIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0LgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlIHdpdGggc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTGlrZXdpc2Ugd2l0aCBhYmZkLT5teV9hcmNoaXZlLgotCi1Nb24gTWFyIDIzIDE4OjUxOjQ3IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQotTW9uIE1hciAyMyAxNDoyMzozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBwZSBiYWNrZW5kcy4KLQotRnJpIE1hciAyMCAxODo0NzoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLUZyaSBNYXIgMjAgMTE6MjU6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEJldHRlciBlcnJvciBtZXNzYWdlcwotCXdoZW4gaW50ZXJvd3JraW5nIGNvbmZsdWN0cyBvY2N1ci4gIENvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbgotCWFuZCBUb255IFRob21wc29uLgotCShhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IEZpeGVkIGJpdHNpemUgZmllbGRzIG9mIHJpZ2h0c2hpZnRlZAotCXJlbG9jYXRpb25zLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255Ci0JVGhvbXBzb24uCi0KLUZyaSBNYXIgMjAgMDI6MjY6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV2ZXJ0Ci0JcGFydCBvZiBGZWIgMjIgY2hhbmdlIGNvbnRyb2xpbmcgd2hlbiB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcKLQlzeW1ib2wgd2l0aCB0aGUgLnBsdCBlbnRyeS4KLQotV2VkIE1hciAxOCAwOToyNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvZmZjb2RlLmggKE9USEVSX0dMT0JBTF9DTEFTUyk6IFN1cHBvcnQgdGh1bWIgZXh0ZXJuYWwKLQlmdW5jdGlvbnMgaW4gUEUgYnVpbGQuCi0KLVN1biBNYXIgIDggMjM6Mzc6MjYgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmNsaXRlLSotZWxmKik6IEFkZGVkLgotCi1Nb24gRmViIDIzIDE5OjMxOjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZWxmLmxvIHRvIGVsZiBzaGVsbCB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmFtIChCRkRfTElCUyk6IFJlbW92ZSBlbGYubG8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IFJlbW92ZSBlbGYuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTAyLTIzIDE1OjUzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBIHBjLXJlbGF0aXZlCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbm9uLWxvY2FsIHN5bWJvbCBzaG91bGQgbm90IGhhdmUgYSBkeW5hbWljCi0JcmVsb2NhdGlvbi4KLQotTW9uIEZlYiAyMyAxNjoxNzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBzZXQgQkZEIGZsYWcgSEFTX1NZTVMgaW4KLQlDT0ZGIGZpbGVoZHIgZmxhZ3MuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBQRSBmbGFncy4gIEZyb20gTWlrZXkKLQk8amVmZmRiQG5ldHpvbmUuY29tPi4KLQotU3VuIEZlYiAyMiAyMDozOTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLQlhIHBsdCBlbnRyeSB3aGVuIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB3ZSBhdXRob3JpdGF0aXZlbHkgZGVmaW5lCi0JdGhlIHN5bWJvbC4KLQotU3VuIEZlYiAyMiAyMDozMzowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENPUkVGSUxFIHNlbGVjdGlvbik6IFJlbW92ZSBzcGFyYy0qLWxpbnV4Ki4gIFRoZXkKLQlkb24ndCBhY3R1YWxseSB1c2UgdHJhZC1jb3JlLCBidXQgYSBTdW5PUy1zdHlsZSBjb3JlIGZpbGUgaGFuZGxlZAotCWJ5IGdkYiBkaXJlY3RseS4KLQkqIGhvc3RzL3NwYXJjbGludXguaDogUmVtb3ZlLgotCi1XZWQgRmViIDE4IDE1OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5pZGF0YSBzZWN0aW9uLCBsb29rCi0JZm9yIHRoZSBpbXBvcnQgdGFibGVzIGluIHNvbWUgb3RoZXIgc2VjdGlvbi4gIE1ha2UgdGhlIGluaXRpYWwKLQlsYWJlbCBsaW5lIHVwIGJldHRlciB3aXRoIHRoZSBkYXRhLiAgUHJpbnQgdGhlIGltcG9ydCBhZGRyZXNzCi0JdGFibGUgZXZlbiBpZiB0aGVyZSBpcyBubyBpbXBvcnQgbmFtZSB0YWJsZS4gIElmIHRoZSBpbXBvcnQKLQlhZGRyZXNzIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMsIHByaW50IHRoZW0uCi0KLVR1ZSBGZWIgMTcgMTI6NTg6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBJZiBmc2VlayBmYWlscywgc2F2ZSBlcnJubyBhcm91bmQgY2FsbCB0bwotCWJmZF90ZWxsLiAgSWYgZXJybm8gaXMgRUlOVkFMLCBzZXQgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLCBub3QKLQliZmRfZXJyb3Jfc3lzdGVtX2NhbGwuCi0KLUZyaSBGZWIgMTMgMTM6MTE6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2xhX0xERkxBR1MpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAxMiAxNzozMToxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIG5ldGJzZC5oIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFVzZSBERUZBVUxUX0FSQ0ggYW5kIERFRkFVTFRfTUlEIHdoZW4KLQljYWxsaW5nIE5fU0VUX01BQ0hUWVBFLCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzd2l0Y2guCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQWRkIE1fUE1BWF9ORVRCU0QsIE1fVkFYX05FVEJTRCwKLQlhbmQgTV9BTFBIQV9ORVRCU0QuCi0JKiBpMzg2bmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG02OGs0a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG02OGtuZXRic2QuYzogKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIG5zMzJrbmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQkqIHNwYXJjbmV0YnNkLmMgKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lLgotCShERUZBVUxUX01JRCk6IERlZmluZS4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogdmF4bmV0YnNkLmM6IE5ldyBmaWxlLgotCSogbmV0YnNkLWNvcmUuYzogQ2xlYW4gdXAuICBSZW1vdmUgdW51c2VkIG1hY3Jvcy4gIFVzZSBuZXRic2QKLQlyYXRoZXIgdGhhbiBuZXRic2RfY29yZS4KLQkqIHRhcmdldHMuYyAodmF4bmV0YnNkX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHZheG5ldGJzZF92ZWMuICBJZiBORVRCU0RfQ09SRSBpcwotCWRlZmluZWQsIGFkZCBuZXRic2RfY29yZV92ZWMuCi0JKiBjb25maWd1cmUuaW46IFNldCBDT1JFRklMRSBmb3IgYWxwaGEqLSotbmV0YnNkKiBhbmQKLQlwb3dlcnBjLSotbmV0YnNkKiB0byBuZXRic2QtY29yZS5sby4gIElmIENPUkVGSUxFIGlzCi0JbmV0YnNkLWNvcmUubG8sIHNldCBDT1JFRkxBRyB0byAtRE5FVEJTRF9DT1JFLgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZheG5ldGJzZC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHZheG5ldGJzZC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSB0aGUgb2xkIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIHN0dWZmLiAgV2UKLQlub3cgdXNlIGxpYnRvb2wgaW5zdGVhZC4KLQotV2VkIEZlYiAxMSAxNzoxMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgdGVraGV4X2luaXQuCi0KLVR1ZSBGZWIgMTAgMTk6MjM6MjggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW46IFRha2Ugc3RhYi1zeW1zLmxvIG91dCBvZiBzcGFyY2xpbnV4X3ZlYyBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViIDEwIDE1OjE2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JKiBlbGYzMi12ODUwLmMgKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogVXNlIHRoZSBhYm92ZSBuZXcgZnVuY3Rpb25zIHRvCi0JbWF0Y2ggdXAgSEk2UyByZWxvY3Mgd2l0aCBMTzE2IHJlbG9jcy4KLQotVHVlIEZlYiAxMCAxNTowMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDkgMTk6NDA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEZpeCBhbm90aGVyCi0JTE8xNi9ISTE2UyBidWcgYW5kIGltcHJvdmUgY29tbWVudHMgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KLQotU2F0IEZlYiAgNyAxNToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDE0OjQ4OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gbWVyZ2luZyB2ODUwIGNvZGUgaW50byB2ODUwZS92ODUwZWEgY29kZS4gIERvIG5vdCBpbml0aWFsaXNlCi0Jb3V0cHV0IGZsYWdzIGlmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUuCi0KLUZyaSBGZWIgIDYgMTE6NTA6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBGb3IgQkZEX1JFTE9DX0NUT1IKLQlnZXQgdGhlIHNpemUgZnJvbSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIGluc3RlYWQgb2YgZGlyZWN0bHkKLQlmcm9tIHRoZSBpc2EuCi0KLVRodSBGZWIgIDUgMTQ6MjE6MzQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChCRkRfQUxJR04pOiBJZiByb3VuZGluZyB1cCB3b3VsZCBjYXVzZSB0aGUgYWRkcmVzcwotCXRvIHdyYXAsIGp1c3QgcmV0dXJuIGFsbCAxJ3MgYml0cyBpbnN0ZWFkLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDUgMTE6NTE6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgQ09GRl9XSVRIX1BFLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBDT0ZGX1dJVEhfUEUsIGRlZmluZSBhcwotCWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc2tpcCBlbXB0eSBzZWN0aW9ucywgdG8gbWF0Y2ggY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuCi0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBTd2FwIG91dCByX2FkZGVuZCwKLQlyYXRoZXIgdGhhbiBzd2FwcGluZyBvdXQgcl9vZmZzZXQgdHdpY2UuICBGcm9tIEx1a2UgRGVsbGVyCi0JPGx1a2VkQGNzZS51bnN3LmVkdS5hdT4uCi0KLVdlZCBGZWIgIDQgMTk6MTE6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KLQlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZAotCXdpdGggbmV3IGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTY6MTA6MjEgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBzdGFiX2NhY2hlKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBSZW1vdmUgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsCi0JY2FjaGVkX3N0ciwgYW5kIGNhY2hlZF9zdHJvZmYgZmllbGRzLiAgQWRkIGZpbGVfY2FjaGUsCi0JZnVuY3Rpb25fY2FjaGUsIGFuZCBsaW5lX2NhY2hlIGZpZWxkcy4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgZXh0ZW5zaXZlIGNhY2hpbmcgdG8KLQlzcGVlZCB1cCBzZWFyY2hlcy4KLQotV2VkIEZlYiAgNCAxMzozNDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDaGVjayBmb3IgaW1wb3J0IG9mIG9yZGluYWwgcmF0aGVyCi0JdGhhbiBuYW1lLgotCShwZV9wcmludF9lZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5lZGF0YSBzZWN0aW9uLCBsb29rIGZvciB0aGUKLQlleHBvcnQgZGF0YSBpbiBzb21lIG90aGVyIHNlY3Rpb24uCi0KLU1vbiBGZWIgIDIgMjA6MDU6NDIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gdG8gMi44LjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gRmViICAyIDE3OjM5OjM5IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjcHUtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBhb3V0LXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29mZi10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3RpYzMwKTogRGVmaW5lLgotCShiZmRfdGljMzBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWMzMF9hcmNoLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWMzMF9hb3V0X3ZlYyBhbmQKLQl0aWMzMF9jb2ZmX3ZlYy4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19USUMzMF9MRFApOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCB0aWMzMCBjYXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwX2FvdXRfdmVjLCB0aWMzMF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3JzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzMwLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS10aWMzMC5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LXRpYzMwLmxvIGFuZCBjb2ZmLXRpYzMwLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC10aWMzMC5jIGFuZCBjb2ZmLXRpYzMwLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEyOjI1OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBBbGxvdyBISTE2X1MgcmVsb2MKLQl0byBsYWcgYmVoaW5kIExPMTYgcmVsb2MgYnkgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gRmViICAyIDE0OjA5OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBBZGQgZHVtbXkgY29tbWFuZCB0byBmb3JjZQotCW1ha2UgdG8gcmVleGFtaW5lIHRoZSBmaWxlIHRpbWVzdGFtcC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oLCAkKHNyY2RkaXIpL2xpYmNvZmYuaCk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBDaGFuZ2UgdG8gMHgxMDAwMCBmcm9tCi0JMHgxMDAwMDAuCi0KLUZyaSBKYW4gMzAgMTk6MDc6MDcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgcHJvY2VkdXJlCi0JdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIHNlY3Rpb25zLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFB1dCBzcGFjZSBmb3Igc21hbGwgZGF0YSB0byBiZQotCWNvcGllZCBmcm9tIGR5bmFtaWMgb2JqZWN0cyBpbnRvIC5zYnNzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN0cmlwIC5yZWxhLnNic3MgaWYgd2UgZG9uJ3QKLQl1c2UgaXQuICBDb3JyZWN0IHR5cG8gb2YgLnJlbGEuc2RhdGEyLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIHJlbG9jIHRvIHdoZXJlIHdlCi0JcHV0IHRoZSBkYXRhLCB3aGljaCBtYXkgbm93IGJlIGluIC5zYnNzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBIFNEQVJFTDE2IHJlbG9jIGNhbiBiZSBpbiBkeW5zYnNzLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZSBhcwotCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGVtaXQgUl9QUENfUkVMKiByZWxvY3MKLQlhZ2FpbnN0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwzMiByZWxvY3MgaW4KLQlzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBNYWtlIHN1cmUgdGhhdCB0aGUKLQl0ZXN0IGZvciBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jIGluIGEgc2hhcmVkIG9iamVjdCBpcyB0aGUKLQlzYW1lIGFzIHRoZSB0ZXN0IGZvciBlbWl0dGluZyBhIHJlbG9jLgotCi1UaHUgSmFuIDI5IDE1OjU1OjM1IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdLSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogYWNpbmNsdWRlLm00IChCRkRfQklOQVJZX09QRU4pOiBDaGVjayBmb3IgbWluZ3czMi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxMzo0MToyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE9ubHkgY2hlY2sgdGhlIHN0cnRhYiBpZiB3ZQotCWhhdmUgYSBiZmRfb2JqZWN0LgotCi1UdWUgSmFuIDI3IDIxOjQzOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlTcGFyYyB2OSBBQkkgY29tcGxpYW50IFBMVDoKLQkqIGVsZjY0LXNwYXJjLmMgKFBMVF9IRUFERVJfU0laRSk6IFY5IEFCSSB1c2VzIDQgZW50cmllcy4KLQkocGx0X3RlbXBsYXRlcywgc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5KTogRGVsZXRlLgotCShMQVJHRV9QTFRfVEhSRVNIT0xEKTogTmV3IGRlZmluZS4KLQkoR09UX1JFU0VSVkVEX0VOVFJJRVMpOiBWOSBBQkkgb25seSB1c2VzIDEuCi0JKHNwYXJjNjRfZWxmX2J1aWxkX3BsdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgaC0+cGx0X29mZnNldCB0bwotCWNvbnRhaW4gdGhlIGluZGV4IGZvciBjb252ZW5pZW5jZS4gIFNraXAgdGhlIGluaXRpYWwgZW50cmllcwotCWluIC5yZWxhLnBsdC4KLQkoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogWmVybyB0aGUgYWxsb2NhdGVkIGNvbnRlbnRzCi0JbWVtb3J5IGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEtpbGwgdGVtcGxhdGUgc3R1ZmYuICBVc2UKLQlzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0ICYgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgZm9yIHJlbG9jLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERUX1BMVEdPVCBwb2ludHMgdG8gLnBsdC4KLQlDYWxsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdC4KLQkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogTm8uCi0JKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IE5vLgotCShlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogOC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uOyBmcmVlIHRoZSBzaHN0cnRhYi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBEZWNsYXJlIGl0LgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCk6IEFycmFuZ2UgZm9yIGl0Ci0JdG8gYmUgY2FsbGVkLgotCi1UdWUgSmFuIDI3IDIxOjQ1OjE1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgTUlQUwotCXByb2Nlc3NvcnMuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHMgdmFyaWFudHMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVR1ZSBKYW4gMjcgMTU6MDY6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFByZXNlcnZlIHRoZSBjb250ZW50cyBvZgotCXQyYTNfYl9pbnNuLgotCi1UdWUgSmFuIDI3IDEyOjQ3OjI3IDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LXNjbzMuMnY1Kik6IEVMRiBub3cgdGhlIGRlZmF1bHQuCi0JKGlbMzQ1Nl04NnNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSmFuIDI2IDE1OjQxOjMwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkIHdpdGggY2hhbmdlcyB0byBjaGV3LS10YWIgZXhwYW5zaW9uLgotCi1UaHUgSmFuIDIyIDIxOjI2OjQ4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yX2hhbmRsZXIpOiBBZGQgb3J0aG9nb25hbCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAyMiAyMToxMzozOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGZvciBubyBzeW1ib2xzLgotCi1XZWQgSmFuIDIxIDIxOjE5OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IElmIENPRkZfV0lUSF9QRSwgZG9uJ3QKLQlhZGp1c3QgYWRkZW5kIGZvciBhbiBvdXRwdXQgY29tbW9uIHN5bWJvbCAoZnJvbSBKaW1teSBCbGFpcgotCTxqaW1teWJAd3JzLmNvbT4pLiAgSWYgQ09GRl9XSVRIX1BFLCBhZGp1c3QgYWRkZW5kIGZvciBQQyByZWxhdGl2ZQotCWRlZmluZWQgc3ltYm9sIHRvIGNvdW50ZXJhY3QgYWRqdXN0bWVudCBtYWRlIGluIGdlbmVyaWMgcmVsb2NhdGlvbgotCWNvZGUuCi0KLQkqIGR3YXJmMi5jOiBJbmNsdWRlIHN5c2RlcC5oLCBub3Qgc3RkaW8uaCBhbmQgc3RkbGliLmguCi0KLVdlZCBKYW4gMjEgMjE6MTY6MDYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkRIUl9OUkVMT0MpOiBGaXggdHlwbyBpbiBtYWNybyBuYW1lLgotCShHRVRfU0NOREhSX05MTk5PKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMTkgMTI6NDk6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvcnJlY3QgbmV4dCBmaWVsZCBvZiBzaDNlLgotCi1XZWQgSmFuIDE0IDE3OjIzOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogQWRkIG1hY3JvcyB0byBoYW5kbGUgTk9QIGluc2VydGlvbi4KLQotV2VkIEphbiAxNCAxNjoxNToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFya19zeW1ib2wpOiBEb24ndCBtYXJrIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCSh4Y29mZl9tYXJrKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1hcmsgYWJzb2x1dGUgc3ltYm9scy4KLQotV2VkIEphbiAxNCAxNjowMzoxMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNvcnQgc3ltYm9scyBiZWZvcmUgb3V0cHV0Ci0JdG8ga2VlcCB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIGFkamFjZW50LgotCShiX291dF9zeW1ib2xfY21wKTogTmV3IGZ1bmN0aW9uLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk2OTcKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTE5MyBiL2JmZC9DaGFuZ2VMb2ctOTE5MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhZjkzMS4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTkxOTMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUxICswLDAgQEAKLUZyaSBEZWMgMzEgMTY6MjM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JTWlub3IgY2xlYW51cHMgc3VnZ2VzdGVkIGJ5IENvZGVDZW50ZXIuCi0JKiBhb3V0eC5oLCBjb2ZmZ2VuLmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlbGYuYywgbGliYmZkLmMsCi0JbGlua2VyLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3JlYy5jOiBBZGRlZCAvKkFSR1NVU0VEKi8gYXMKLQlhcHByb3ByaWF0ZS4KLQkqIGFvdXR4LmggKHN0cnVjdCBleHRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbi4KLQkoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBTZXQgc29tZSB0ZGF0YSBwb2ludGVycyB0byBOVUxMLgotCShhZGp1c3Rfel9tYWdpYyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSBkYXRhX3ZtYS4KLQkoc3RyaW5ndGFiX2luaXQpOiBJbml0aWFsaXplIGhhc2hfemVyby4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFJlbW92ZWQgdW51c2VkIGZvdXJ0aCBhcmd1bWVudC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKLQlyX2FkZGVuZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBBZGRlZCBzb21lIGNhc3RzLgotCSogYXJjaGl2ZS5jIChnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUsIGRvX3NsdXJwX2NvZmZfYXJtYXAsCi0JYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0sIGJzZF93cml0ZV9hcm1hcCwgY29mZl93cml0ZV9hcm1hcCk6Ci0JTWlub3IgY29kZSByZXdyaXRpbmcgdG8gbWFrZSBpdCBtb3JlIEMgbGlrZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwKTogQWRkZWQgc29tZSBjYXN0cy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZQotCXNjbl9iYXNlLgotCShlY29mZl93cml0ZV9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuICBVc2UgIiIgcmF0aGVyIHRoYW4gIlwwIi4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfd3JpdGVfZGVidWcpOiBBZGRlZCBhIGNhc3QuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBpbnRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeQotCWRlY2xhcmF0aW9uLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyKTogQWRkZWQgYSBjYXN0LgotCSogb3BuY2xzLmMgKG5ld19iZmQpOiBSZW1vdmVkIGEgY2FzdC4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0Jc29tZSBjYXN0cy4KLQkqIHNyZWMuYyAoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MKLQl2YXJpYWJsZSBieXRlc193cml0dGVuLgotCi1GcmkgRGVjIDMxIDExOjQ2OjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmMgKE5fVFhUQUREUik6IERvbid0IGRlZmluZSBhZnRlciBhbGwuCi0JKFRFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUgZXhlYyBoZWFkZXIgc2l6ZSBpbiB2YWx1ZS4KLQotVGh1IERlYyAzMCAxNTo0Nzo1NCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEZWZpbmUuCi0KLVRodSBEZWMgMzAgMTM6Mzc6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gbW92ZSB0aGUgYnVsayBvZiB0aGUgbGlua2VyIGludG8gQkZEIHNvIHRoYXQKLQltb3JlIGVmZmljaWVudCBiYWNrZW5kIGNvZGUgY2FuIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIG9iamVjdAotCWZpbGVzLiAgT25seSBleGlzdGluZyBlZmZpY2llbnQgYmFja2VuZCBpcyBhLm91dC4KLQkqIHNlY2xldC5jLCBzZWNsZXQuaDogUmVtb3ZlZC4KLQkqIGhhc2guYywgbGlua2VyLmMsIGdlbmxpbmsuaDogTmV3IGZpbGVzLgotCSogYmZkLWluLmg6IFJlbW92ZWQgYmZkX2Vycm9yX3ZlY3Rvci4gIERlY2xhcmVkIGhhc2ggdGFibGUKLQlzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCi0JKEpVTVBfVEFCTEUpOiBSZW1vdmVkIGJmZF9zZWNsZXRfbGluaywgYWRkZWQKLQliZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgYW5kCi0JYmZkX2ZpbmFsX2xpbmsuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBsaW5rX25leHQgYW5kIGFyY2hpdmVfcGFzcyBmaWVsZHMuCi0JUmVtb3ZlZCBsZF9zeW1ib2xzIGZpZWxkLgotCShiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLAotCWJmZF9lcnJvcl92ZWN0b3IpOiBSZW1vdmVkLgotCShiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFJlbW92ZWQuCi0JKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBQYXNzIGxpbmtfaW5mby4gIFBhc3MKLQlsaW5rX29yZGVyIGluc3RlYWQgb2Ygc2VjbGV0LiAgUGFzcyBzeW1ib2xzLgotCShiZmRfcmVsYXhfc2VjdGlvbik6IFBhc3MgbGlua19pbmZvLgotCShiZmRfc2VjbGV0X2xpbmspOiBSZW1vdmVkLgotCShiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JYmZkX2ZpbmFsX2xpbmspOiBOZXcgbWFjcm9zLgotCSogbGliYmZkLWluLmg6IElmIF9fR05VQ19fIGlzIGRlZmluZWQgYW5kIGFsbG9jYSBpcyBub3QsIGRlZmluZQotCWFsbG9jYSBhcyBfX2J1aWx0aW5fYWxsb2NhLiAgRGVjbGFyZSBpbnRlcm5hbCBsaW5raW5nIGZ1bmN0aW9ucy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogQ29tbWVudCBvdXQgZnNlZWsgYXNzZXJ0aW9uLiAgSXQncyB3b3JrZWQKLQlmb3IgbW9udGhzLgotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZGVkIGVycm9yX21lc3NhZ2UgYXJndW1lbnQgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uIGZpZWxkLiAgQ2hhbmdlZCBhbGwgY2FsbGVycyBhbmQgYWxsIGRlZmluaXRpb25zLgotCShiZmRfZ2V0X3JlbG9jX3NpemUpOiBNYWtlIGFyZ3VtZW50IGEgY29uc3QgcG9pbnRlci4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvIGhvbGQKLQlzdHJpbmcgc2V0IGlmIHJldHVybiB2YWx1ZSBpZiBiZmRfcmVsb2NfZGFuZ2Vyb3VzLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCShfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb25zLgotCSogc2VjdGlvbi5jIChhc2VjdGlvbik6IFJlbmFtZWQgc2VjbGV0c19oZWFkIGFuZCBzZWNsZXRzX3RhaWwgdG8KLQlsaW5rX29yZGVyX2hlYWQgYW5kIGxpbmtfb3JkZXJfdGFpbC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlcGxhY2VkIHNlY2xldCBhcmd1bWVudCB3aXRoIGxpbmtfaW5mbwotCWFuZCBsaW5rX29yZGVyIGFuZCBzeW1ib2xzIGFyZ3VtZW50cyBpbgotCWJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JYmZkX3JlbGF4X3NlY3Rpb24uICBSZW1vdmVkIGJmZF9zZWNsZXRfbGluay4gIEFkZGVkCi0JYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAotCWJmZF9maW5hbF9saW5rLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGRlZCBleHRlcm5hbF9zeW1zLAotCWV4dGVybmFsX3N5bV9jb3VudCwgZXh0ZXJuYWxfc3RyaW5ncywgc3ltX2hhc2hlcyBmaWVsZHMuCi0JKG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCwKLQlvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzLCBvYmpfYW91dF9zeW1faGFzaGVzKTogTmV3IGFjY2Vzc29yCi0JbWFjcm9zLgotCShXUklURV9IRUFERVJTKTogT25seSBvdXRwdXQgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIG5vdCBOVUxMLgotCSogYW91dHguaDogV3JvdGUgbmV3IGJhY2sgZW5kIGxpbmtlciByb3V0aW5lcy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIERvbid0IHVzZQotCWJmZF9lcnJvcl92ZWN0b3IuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgYW5kIGJmZF93cml0ZS4KLQkqIGFvdXQtdGFyZ2V0LmggKGZpbmFsX2xpbmtfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybgotCXZhbHVlIG9mIGFvdXRfMzJfd3JpdGVfc3ltcy4KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBMaWtld2lzZS4KLQkqIGJvdXQuYzogQ2hhbmdlZCBmdW5jdGlvbnMgdG8gdXNlIGxpbmtfaW5mby0+Y2FsbGJhY2tzIHJhdGhlcgotCXRoYW4gYmZkX2Vycm9yX3ZlY3RvciwgYW5kIGxpbmtfb3JkZXJzIHJhdGhlciB0aGFuIHNlY2xldHMuCi0JKiBjb2ZmLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29mZi1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmM6IExpa2V3aXNlLgotCSogY29mZi16OGsuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmM6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTG9vawotCXVwIF9ncCBpbiB0aGUgaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbiBvdXRzeW1ib2xzLgotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBQYXNzIGVycm9ycyBiYWNrIGluIG5ldyBlcnJvcl9tZXNzYWdlCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gcHJpbnRpbmcgdGhlbS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBUYWtlIGxpbmtfaW5mbyBhbmQKLQlsaW5rX29yZGVyIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBzZWNsZXQuICBDaGFuZ2VkIGFsbCB1c2VzIGFuZAotCWRlZmluaXRpb25zLgotCShiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKTogUGFzcyBsaW5rX2luZm8gYXJndW1lbnRzLiAgQ2hhbmdlZAotCWFsbCB1c2VzIGFuZCBkZWZpbml0aW9ucy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9leHRyKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYnkgbGlua2VyLCBidXQKLQlub3QgYnkgRUNPRkYsIG1ha2UgaXQgc2NBYnMuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tIGVjb2ZmX2JmZF9zZWNsZXRfbGluayBhbmQKLQlyZXdyaXR0ZW4uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZW5hbWVkIGZyb20KLQltaXBzX2VsZl9zZWNsZXRfbGluayBhbmQgcmV3cml0dGVuLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBsaW5rX2luZm8KLQlmaWVsZC4KLQkobmV3X3N0dWIsIGFkZF9zdHViX2J5X25hbWUsIGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViLAotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIsIGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6Ci0JQWRkZWQgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBxdWl0IGlmIG91dHN5bWJvbHMgaXMKLQlub3QgTlVMTC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUgcmF0aGVyIHRoYW4KLQl1c2luZyBiZmRfZXJyb3JfdmVjdG9yLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlvYXN5c193cml0ZV9zZWN0aW9ucy4KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgcXNvcnQgb3Igc3RydG9sLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IFJlbW92ZWQgc2VjbGV0Lm8uICBBZGRlZCBoYXNoLm8gYW5kIGxpbmtlci5vLgotCShDRklMRVMpOiBSZW1vdmVkIHNlY2xldC5jLiAgQWRkZWQgaGFzaC5jIGFuZCBsaW5rZXIuYy4KLQkoSEZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuaC4gIEFkZGVkIGdlbmxpbmsuaC4KLQotVGh1IERlYyAzMCAwNzo0MTozNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIFJldHVybiB6ZXJvIGZpbGxlZCBidWZmZXIKLQlpZiBzZWN0aW9uIGhhcyBubyBjb250ZW50cy4KLQotVHVlIERlYyAyOCAxMjo0Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGlzIGlzIG5vdCBhbiBpbnBsYWNlIHJlbG9jLAotCXRoZW4gc2tpcCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGV2ZW4gaWYgdGhlIGFkZGVuZCBpcyBub24temVyby4KLQotVHVlIERlYyAyMSAwOToyMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKSBbU1dBUF9PVVRfUkVMT0NfT0ZGU0VUXTogQ29weQotCWFkZGVuZCB0byByX29mZnNldCBmaWVsZC4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZGVkIGNvZmYtc3BhcmMuYy4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjb2ZmLXNwYXJjLmMgKFNXQVBfSU5fUkVMT0NfT0ZGU0VULCBTV0FQX09VVF9SRUxPQ19PRkZTRVQsCi0JQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IFVzZSBjZF9yZWdzWzBdIGZvciBjb21wdXRpbmcKLQl0aGUgb2Zmc2V0b2YgYmVjYXVzZSBBSVggL2Jpbi9jYyBkb2VzIG5vdCBsaWtlIHRvIHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4gIChGcm9tIE1pbmggVHJhbi1MZS4pCi0KLVRodSBEZWMgMTYgMTM6MDY6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFRodSBEZWMgMTYgMTU6NDE6MDYgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IE1ha2Ugc3VyZSB0byBjb3B5Ci0JdGhlIHJldHVybiBwb2ludGVyIGludG8gJXIyIGlmIG5vIGp1bXAtaW4tY2FsbC1kZWxheS1zbG90Ci0Jb3B0aW1pemF0aW9uIHdhcyBkb25lLgotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiBDb3JyZWN0bHkgaWRlbnRpZnkgNC4zQlNEIHZzIDQuNEJTRC4KLQotV2VkIERlYyAxNSAwODowNDoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICh0aW1lKTogRG9uJ3QgZGVjbGFyZTsgY29uZmxpY3RzIG9uIE1hY2gzLgotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9QQUdFX1NJWkUpOiBTZXQgdG8gMSB0byBhdm9pZCBwYWRkaW5nLgotCShIT1NUX1NFR01FTlRfU0laRSk6IFNldCB0byAwIGZvciBzYW1lIHJlYXNvbi4KLQotCSogaTM4Nm1hY2gzLmMgKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogU2FtZSBjaGFuZ2VzIGFzIGFib3ZlLgotCShURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0LgotCShNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljLCBhZGp1c3Rfel9tYWdpYywgYWRqdXN0X25fbWFnaWMpOgotCU5ldyBmdW5jdGlvbnM7IGNvZGUgbW92ZWQgZnJvbSBhb3V0XzxzaXplPl9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCi0KLVR1ZSBEZWMgMTQgMjE6NDg6MzMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggdGhpbmtvcyBpbiBhdXhpbGlhcnkgaGVhZGVyCi0Jc3VwcG9ydC4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IExpa2V3aXNlLgotCi1Nb24gRGVjIDEzIDIzOjM0OjQ4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlICdUJyBmaWVsZAotCXNlbGVjdG9ycyBmb3IgUElDIGNvZGUuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQgc2VsZWN0b3JzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfRExUX1JFTCwgUl9GU0VMLCBSX1JTRUwsIFJfTFNFTAotCXJlbG9jYXRpb25zIG5lZWRlZCBieSBQSUMuCi0KLVR1ZSBEZWMgIDcgMTU6NDc6NTEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oOiAgRml4ZXMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuLi4KLQotVHVlIERlYyAgNyAxNToxMDo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9uLgotCShubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBEZWMgIDUgMTk6MzI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZsZXNoIG91dCBjb2RlIGZvciBoYW5kbGluZyBzaW1wbGUKLQlhdXhpbGlhcnkgaGVhZGVycy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogQWRkIGZpZWxkcyBmb3IgYXR0YWNoaW5nIHZlcnNpb24gYW5kCi0JY29weXJpZ2h0IGhlYWRlcnMuICBBZGQgYWNjZXNzb3IgbWFjcm9zLgotCi0JKiBzb20uYyAoUl9ETFRfUkVMLCBSX0FVWF9VTldJTkQsIFJfU0VDX1NUTVQpOiBBZGQgcHJvdGVjdGVkCi0JZGVmaW5pdGlvbnMgZm9yIG9sZCB2ZXJzaW9ucyBvZiBIUFVYIHdoaWNoIGZhaWwgdG8gZGVmaW5lIHRoZW0uCi0JKHNvbV9ocHBhX2hvd3RvX3RhbGJlKTogQWRkIFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBhbmQgUl9TRUNfU1RNVAotCW5vdyB0aGF0IHRoZXkncmUgc2FmZS4gIERlbGV0ZSBib2d1cyBSX1NUQVRFTUVOVCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIG1pc3NpbmcgUl9FTkRfVFJZLiAgRGVsZXRlIAotCWV4dHJhIFJfREFUQV9PVkVSUklERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBHZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIHRoZSByb3VuZGluZwotCW1vZGUgc2VsZWN0b3IgaWYgbmVlZGVkLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIHJlcXVlc3RzIGZvciBhIGNoYW5nZSBpbiB0aGUgZGVmYXVsdAotCXJvdW5kaW5nIG1vZGUuICBSb3VuZGluZyBtb2RlcyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcywgYnV0Ci0JYXJlIGp1c3QgbWFya2VycyBtdWNoIGxpa2UgUl9FTlRSWSBhbmQgUl9FWElULgotCi1TYXQgRGVjICA0IDE5OjQwOjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JRnJpIERlYyAgMyAwOTo1NToxNyAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIERvIG5vdCBkbyBjb2RlIHJlb3JkZXJpbmcgd2hlbgotCXRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gYXMgb3JpZ2luYWxseSBiZWVuIG51bGxpZmllZC4KLQlocHBhX2VsZl9yZWxvYyk6ICBBdm9pZCB1c2VsZXNzIGNhbGwgdG8gYmZkX3B1dF8zMiAoKSBpbiB0aGUKLQljYXNlIG9mIG5vIGNvZGUgcmVvcmRlcmluZyBkdWUgdG8gYW4gTERPIGluc3RydWN0aW9uIGluIHRoZQotCWRlbGF5IHNsb3Qgb2YgdGhlIGJyYW5jaC4gIE1ha2Ugc3VyZSB0byByZWxvY2F0ZSB0aGUgY29ycmVjdAotCWluc3RydWN0aW9uLiAgRG8gbm90IHBlcmZvcm0gaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBmb3IgbWlsbGljb2RlCi0JY2FsbHMuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogIENoYW5nZSB0aGUgcmVsb2NhdGlvbiB0eXBlCi0JdG8gUl9IUFBBX1NUVUJfQ0FMTF8xNyB3aGVuIHNwZWNpYWwgcHJvY2Vzc2luZyBtaWdodCBiZSBuZWVkZWQuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBQcmV2ZW50IGNvZGUgcmVvcmRlcmluZyBvbgotCWEgY2FsbCBmcm9tIGEgbGlua2VyIHN0dWIgdG8gYW5vdGhlciBsaW5rZXIgc3R1YiBhbmQgZm9yIG1pbGxpY29kZQotCWNhbGxzLiAgRG8gbm90IHRyYXNoIHRoZSByZXR1cm4gcmVnaXN0ZXIgZm9yIGNhbGxzIGZyb20gb25lIGxpbmtlcgotCXN0dWIgdG8gYSBzZWNvbmQgbGlua2VyIHN0dWIuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogIFBMQUJFTCBhbmQgRExUCi0JcmVsb2NhdGlvbnMgYXJlIG5vdCBwYy1yZWxhdGl2ZS4KLQotCSogaHBwYV9zdHVicy5oOiAoQkxFX05fWFhYXzBfMzEpOiAgTmV3IGluc3RydWN0aW9uIHVzZWQgaW4KLQlsaW5rZXIgc3R1YiBjb2RlLiAKLQkoQ09QWV8yXzMxKTogIExpa2V3aXNlLgotCi1GcmkgRGVjICAzIDE4OjQwOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIREVGSU5FUyk6IFJlbW92ZSAtRGNvbnN0PQotCSogaG9zdHMvc29sYXJpcy5oOiBJZiBub3QgX19HTlVDX18sIGRlZmluZSBjb25zdCBhcyBlbXB0eS4KLQotVGh1IERlYyAgMiAxNTo0MzozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciB0aGUgLnJlZ2luZm8KLQlzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBpZ25vcmVzIGl0LgotCSogZWNvZmZsaW5rLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX2FkZF9ieXRlcyk6IENoYW5nZWQgbmVlZCBhcmd1bWVudCB0byBzaXplX3QuCi0JKGJmZF9lY29mZl9kZWJ1Z19saW5rX290aGVyKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JZWNvZmZfYWRkX3N0cmluZy4KLQotCSogbGliYmZkLWluLmggKG5ld19iZmQpOiBVc2Ugdm9pZCByYXRoZXIgdGhhbiBhbiBlbXB0eSBwYXJhbWV0ZXIKLQlsaXN0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IE5ldyBmaWVsZCBiYWNrZW5kX2RhdGEuCi0JKG5sbV9iYWNrZW5kX2RhdGEsIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCBub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUKLQlub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlKTogU29ydCByZWxvY3MgYnkgYWRkcmVzcyBmb3IgYQotCXBhcnRpY3VsYXIgc3ltYm9sLCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FzdCB0aGUgYXJndW1lbnRzIHRvIHFzb3J0LiAgR2V0IHRoZQotCXZhbHVlIG9mIGEgZGVidWdnaW5nIHN5bWJvbCB0aGUgc2FtZSB3YXkgd2UgZ2V0IHRoZSB2YWx1ZSBvZiBhCi0Jbm9ybWFsIHN5bWJvbC4KLQkqIG5sbTMyLWFscGhhLmM6IFZhcmlvdXMgY2hhbmdlcy4gIFdyaXRlIG91dCBHUCBhbmQgLmxpdGEgcmVsb2NzLgotCVNldCBub191bmluaXRpYWxpemVkX2RhdGEgdG8gdHJ1ZS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKSwgbmxtMzItc3BhcmMuYwotCShubG0zMl9zcGFyY19iYWNrZW5kKTogU2V0IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSBmaWVsZCBmYWxzZS4KLQkqIG5sbXN3YXAuaCAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCk6IFplcm8gb3V0IGRlc3RpbmF0aW9uCi0JYmVmb3JlIGZpbGxpbmcgaXQgaW4uCi0KLVdlZCBEZWMgIDEgMjE6NDc6NTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2VjdGlvbl90eXBlLCBzb21fZGVjb2RlX3N5bWNhbHNzKTogTmV3IGZ1bmN0aW9ucy4KLQkoc29tX2dldF9zeW1ib2xfaW5mbyk6IFVzZSB0aGVtLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzZWN0aW9uIG9mIGNvbW1vbiBhbmQgdW5kZWZpbmVkCi0Jc3ltYm9scyBjb3JyZWN0bHkuCi0KLVdlZCBEZWMgIDEgMTQ6MTU6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXIgTEFTVF9TWU1fSURYLCB0bwotCW1ha2UgZ2NjIGhhcHB5LgotCi0JKiBtaXBzYnNkLmM6IENoYW5nZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBNSVBTX1JFTE9DX0xPMTYgc2hvdWxkIHVzZQotCWNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JKGFvdXRfbWlwc18qX3ZlYyk6IE1ha2UgbmFtZSB1c2UgImEub3V0IiBpbnN0ZWFkIG9mICJhb3V0IiwgdG8KLQltYWtlIGdkYiBoYXBweS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogUmV3b3JkIGludmFsaWQtdGFyZ2V0IG1lc3NhZ2UuCi0KLQkqIGNvbmZpZy5iZmQ6IEZvciBzcGFyYyotKi1jb2ZmLCB1c2Ugc3BhcmMtY29mZi4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNwYXJjY29mZl92ZWMuCi0JKiB0YXJnZXRzLmMgKHNwYXJjY29mZl92ZWMpOiBEZWNsYXJlLgotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCByZWxvY19ob3d0b190eXBlKTogVXBkYXRlIGRvY3VtZW50YXRpb24gb2Ygc2l6ZSBmaWVsZC4KLQotV2VkIERlYyAgMSAxNDozOTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWFscGhhLmM6IE5ldyBmaWxlOyBwcmVsaW1pbmFyeSBBbHBoYSBOZXRXYXJlIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLW5sbS4KLQkqIGNvbmZpZy9hbHBoYS1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yOyB1c2UgbmxtMzItYWxwaGEubywKLQlubG0zMi5vLCBhbmQgbmxtLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGRlZCBubG0zMi1hbHBoYS5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1hbHBoYS5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCSogdGFyZ2V0cy5jIChubG0zMl9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGRzCi0Jb3B0aW9uYWxfcHJlZml4X3NpemUsIG5sbV9iYWNrZW5kX29iamVjdF9wLCBubG1fd3JpdGVfcHJlZml4LAotCW5sbV9zZXRfcHVibGljX3NlY3Rpb24sIG5sbV9nZXRfcHVibGljX29mZnNldC4gIFJlbW92ZWQgdW51c2VkCi0JbmxtX3dyaXRlX3JlbG9jIGZpZWxkLiAgQ2hhbmdlZCBubG1fd3JpdGVfaW1wb3J0IHRvIHJlbW92ZQotCXVubmVjZXNzYXJ5IHN5bWJvbCBhcmd1bWVudC4gIFJlbmFtZWQgbmxtX3dyaXRlX2V4dGVybmFscyB0bwotCW5sbV93cml0ZV9leHRlcm5hbCwgYW5kIGNoYW5nZWQgY291bmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hIHRvCi0JYmZkX3NpemVfdHlwZS4KLQkobmxtX29wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jLAotCW5sbV93cml0ZV9wcmVmaXhfZnVuYywgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jLAotCW5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkobmxtX3dyaXRlX3JlbG9jX2Z1bmMpOiBSZW1vdmVkLgotCShubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IEFkanVzdGVkIGZvciBmaWVsZCByZW5hbWluZy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfaW1wb3J0KTogUmVuYW1lZCBmcm9tCi0JbmxtX2kzODZfd3JpdGVfcmVsb2MuICBSZW1vdmVkIG9sZCBubG1faTM4Nl93cml0ZV9pbXBvcnQgd2hpY2gKLQlqdXN0IGNhbGxlZCBvbGQgbmxtX2kzODZfd3JpdGVfcmVsb2MuCi0JKG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFscy4KLQlEZWNsYXJlZC4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLgotCShubG0zMl9pMzg2X2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX21hbmdsZV9yZWxvY3MpOiBSZW1vdmVkIHVudXNlZCwKLQlpZmRlZmZlZCBvdXQgY29kZS4KLQkobmxtX3NwYXJjX3dyaXRlX2ltcG9ydCk6IFJlbW92ZWQgc2Vjb25kIGFyZ3VtZW50LgotCShubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwpOiBSZW5hbWVkIGZyb20KLQlubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWxzLiAgQ2hhbmdlZCBzZWNvbmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hCi0JdG8gYmZkX3NpemVfdHlwZS4KLQkobmxtMzJfc3BhcmNfYmFja2VuZCk6IEFkanVzdGVkIGZvciBjaGFuZ2VzIHRvIGZpZWxkcyBhbmQgbmFtZXMuCi0JKiBubG1jb2RlLmg6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkobmxtX29iamVjdF9wKTogRG9uJ3QgZGVzdHJveSB0ZGF0YSBwb2ludGVyLiAgQ2FsbAotCWJhY2tlbmRfb2JqZWN0X3AgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgcmNvdW50LiAgQ2FsbAotCXNldF9wdWJsaWNfc2VjdGlvbl9mdW5jIGlmIGl0IGV4aXN0cyBpbnN0ZWFkIG9mIGNoZWNraW5nCi0JTkxNX0hJQklULgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWNjb3VudCBmb3IKLQlvcHRpb25hbF9wcmVmaXhfc2l6ZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFjY291bnQgZm9yIG9wdGlvbmFsX3ByZWZpeF9zaXplLgotCVJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSB3cml0ZV9yZWxvY19mdW5jLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbgotCWFuZCBjYWxsIG9mIHdyaXRlX2ltcG9ydF9mdW5jLiAgQ2FsbCB3cml0ZV9wcmVmaXhfZnVuYyBpZiBpdAotCWV4aXN0cy4gIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcyBsZW4gYW5kIHRlbXAuICBDYWxsCi0JZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyBpZiBpdCBleGlzdHMgcmF0aGVyIHRoYW4gc2V0dGluZyBOTE1fSElCSVQuCi0JKiBubG1zd2FwLmg6IERlY2xhcmUgZnVuY3Rpb25zLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IEZ1bGx5IHBhcmVudGhlc2l6ZQotCWZvciBjbGFyaXR5LgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBVc2UgJWx4LCBub3QgJXguCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBob3N0cy9hbHBoYW9zZi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdIKTogQ2FzdCByZXN1bHRzCi0JdG8gdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdldDY0IGhlcmUsIGFzIHRoZSBzZXR0aW5nIGlzIGlnbm9yZWQuCi0JKiBjb25maWd1cmUuaW4gKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFNldCB0YXJnZXQ2NC4KLQotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFJlbW92ZWQ7IHNldHRpbmcgaG9zdCBwYXJhbWV0ZXJzCi0JaW4gVERFRklORVMgaXMgd3JvbmcuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG91dHB1dF9zZWN0aW9uLgotCi1UdWUgTm92IDMwIDE2OjQ1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaXJpeC1jb3JlLmM6IE5ldyBmaWxlIGZvciBJcml4IDQgYW5kIElyaXggNSBjb3JlIHN1cHBvcnQuCi0JRnVuY3Rpb25zIHRha2VuIG91dCBvZiBjb2ZmLW1pcHMuYy4gIEhhbmRsZSB2bWFwIHR5cGUgVk1BUEZJTEUuCi0JKiBjb2ZmLW1pcHMuYzogSXJpeCA0IGNvcmUgZmlsZSBzdXBwb3J0IG1vdmVkIHRvIGlyaXgtY29yZS5jLgotCSogdGFyZ2V0cy5jOiBJZiBJUklYX0NPUkUgZGVmaW5lZCwgaW5jbHVkZSBpcml4X2NvcmVfdmVjIGluCi0JdGFyZ2V0X3ZlY3Rvci4KLQkqIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBBZGQgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIGNvbmZpZy9pcml4NS5taCAoSERFRklORVMpOiBEZWZpbmUgdG8gYmUgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIGlyaXgtY29yZS5vLiAgUmVtb3ZlZAotCXNjby1jb3JlLm8sIHdoaWNoIG5vIGxvbmdlciBleGlzdHMuCi0JKENGSUxFUyk6IEFkZGVkIGFsbCAqLWNvcmUuYyBmaWxlcy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotV2VkIE5vdiAyNCAwMjowMjo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZXN0b3JlIGNoZWNrIG9mIGZpbGVfc2l6ZSAhPQotCW1lbV9zaXplLCBidXQgb25seSBpZiBTSFRfUFJPR0JJVFMuCi0KLQkqIGVjb2ZmbGluay5jOiBOZXcgZmlsZSB0byBob2xkIEVDT0ZGIGRlYnVnIGluZm9ybWF0aW9uIGxpbmtpbmcKLQlyb3V0aW5lcy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NsZWFyX291dHB1dF9mbGFncywgZWNvZmZfcmVsLCBlY29mZl9kdW1wX3NlY2xldCwKLQllY29mZl9hZGRfc3RyaW5nLCBlY29mZl9nZXRfZGVidWcpOiBSZW1vdmVkLiAgRnVuY3Rpb25hbGl0eSBub3cgaW4KLQllY29mZmxpbmsuYy4KLQkoZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBEb24ndCBzYXZlIHJhd19zaXplLgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBSZXdyb3RlIHRvIHVzZSBlY29mZmxpbmsuYyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IHNldCBFWEVDX1AganVzdAotCWJlY2F1c2UgdGhlcmUgaXMgYSBzdGFydCBhZGRyZXNzLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZXh0ZXJuYWwgc3ltYm9scyBoZXJlLiAgVXNlCi0JZWNvZmZsaW5rLmMgZnVuY3Rpb25zIHRvIHdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbywgbWlwc19lbGZfZ2V0X2V4dHIsCi0JbWlwc19lbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkobWlwc19lbGZfc2VjbGV0X2xpbmspOiBEaXNjYXJkIGVtcHR5IHNlY3Rpb25zLCB0aGUgLm9wdGlvbnMKLQlzZWN0aW9uIGFuZCAuZ3B0YWIgc2VjdGlvbnMuICBIYW5kbGUgbGlua2luZyAubWRlYnVnIHNlY3Rpb24uCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBSZW1vdmVkIHJhd19zaXplIGFuZCBpZmRiYXNlLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZGVkIG1pcHNfZXh0ciB0byB0Y19kYXRhIHVuaW9uLgotCSogYmZkLWluLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIHJvdXRpbmVzIGluIGVjb2ZmbGluay5jIChzb21lIGFyZQotCWNhbGxlZCBieSBnYXMsIHNvIHRoZXkgYXJlIHB1YmxpYykuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBZGRlZCBlY29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkZWQgZWNvZmZsaW5rLmMuCi0JKGVjb2ZmbGluay5vKTogTmV3IHRhcmdldC4gIFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gTm92IDIyIDIyOjI2OjQyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3RfcCk6IEFsc28gcmVjb2duaXplIFNIQVJFRF9NQUdJQ19DTlggYXMKLQlhIHZhbGlkIG1hZ2ljIG51bWJlciBpZiBpdCdzIGJlZW4gZGVmaW5lZC4KLQotTW9uIE5vdiAyMiAxNDoxNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogRG9uJ3QgY3JlYXRlIC5zY29tbW9uIHNlY3Rpb247IGxpbmtlcgotCW5vIGxvbmdlciByZXF1aXJlcyBpdC4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rLCBlY29mZl9zaXplb2ZfaGVhZGVycywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB0cmVhdCAuc2NvbW1vbiBzZWN0aW9uCi0Jc3BlY2lhbGx5LgotCi1Nb24gTm92IDIyIDEwOjU0OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBrZXZAc3B1ZHMuZ2VnLm1vdC5jb20gKEtldmluIEEuIEJ1ZXR0bmVyKToKLQkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFRklORVMpOiBEZWZpbmUgdGhpcyB0byBiZSAtRFBUUkFDRV9DT1JFLgotCSogYmZkL2NvbmZpZy9kZWx0YTg4Lm1oIChIREVQRklMRVMpOiBEZWZpbmVkIHRvIGJlIHB0cmFjZS1jb3JlLm8uCi0JKiBiZmQvcHRyYWNlLWNvcmUuYzogIE5ldyBmaWxlIGZvciBkZWFsaW5nIHdpdGggY29yZSBmaWxlcyB3aXRoCi0Jc3RhcnQgd2l0aCB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIGZvdW5kIG9uIEJDUyBjb21wbGlhbnQgc3lzdGVtcy4KLQkqIGJmZC90YXJnZXRzLmMgKHB0cmFjZV9jb3JlX3ZlYyk6ICBOZXcgdmVjdG9yLgotCi1Nb24gTm92IDIyIDAyOjMzOjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNaW5pbWFsIHN1cHBvcnQgZm9yIHJlYWRpbmcgU09NIGZpeHVwIHN0cmVhbXMuICBBbGxvd3MKLQlvYmpkdW1wIC1yIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlLgotCSogc29tLmMgKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCi0JKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBJbXBsZW1lbnQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbywgc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTmV3IGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAyMSAxMzo0Njo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2x5bnguaCAoRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEKTogRGVmaW5lLgotCSogaG9zdHMvc3BhcmNseW54Lmg6IEluY2x1ZGUgbHlueC5oIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQuCi0KLUZyaSBOb3YgMTkgMTQ6MzQ6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IEZvciBSX0lSRUwsIGRvbid0IGxlZnQgc2hpZnQKLQlzaWduZWRfdmFsdWUgYmVmb3JlIHNpZ24gZXh0ZW5kaW5nIGl0LiAgRG9uJ3Qgc3VidHJhY3Qgb3V0Ci0JcmVsb2NfZW50cnktPmFkZHJlc3MuICBUaGlzIG1ha2VzIGl0IGNvbXBhdGlibGUgd2l0aCB3aGF0IGdhcyBpcwotCWdlbmVyYXRpbmcuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBBY2NlcHQgLnNic3MgYXMgdGhlIG5hbWUgZm9yIGEKLQlTSFRfTk9CSVRTIHNlY3Rpb25zLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGxlYXZlIHRoZSBsb29wIGFmdGVyIHRoZSBmaXJzdAotCVNIVF9OT0JJVFMgc2VjdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBPbmx5IGZvcmNlIHNoX29mZnNldCBhbmQKLQlzaF9hZGRyIHRvIG1hdGNoIG1vZHVsbyBtYXhwYWdlc2l6ZSBmb3IgYSBzZWN0aW9uIHdoaWNoIGlzIG5vdAotCVNIVF9OT0JJVFMuICBDaGFuZ2VkIHRoZSBtZXRob2QgdXNlZCB0byBmb3JjZSBwYWdlIGFsaWdubWVudCBhZnRlcgotCWEgU0hUX05PQklUUyBzZWN0aW9uIHRvIG9ubHkgZG8gaXQgZm9yIHRoZSBsYXN0IHN1Y2ggY29uc2VjdXRpdmUKLQlzZWN0aW9uLCBhbmQgdG8gcmVhbGx5IGZvcmNlIHBhZ2UgYWxpZ25tZW50LgotCi1GcmkgTm92IDE5IDA0OjAyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQcmludCBtb3JlIHZlcmJvc2UgbWVzc2FnZQotCWluIHRoZSBjYXNlIG9mIGFuIHVua25vd24gKG9yIHVuaGFuZGxlZCkgc3RvcmFnZSBjbGFzcy4KLQotCSogY29uZmlnL2kzODYtbHlueC5tdCAoVERFRklORVMpOiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgc2hvdWxkCi0Jbm90IGJlIGRlZmluZWQgaGVyZSwgc2luY2UgaXQgaXMgYSBob3N0IGF0dHJpYnV0ZSwgbm90IGEgdGFyZ2V0Ci0Jb25lLgotCSogY29uZmlnL202OGstbHlueC5tdCwgY29uZmlnL3NwYXJjLWx5bngubXQ6IERpdHRvLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotCSogY29mZi1zcGFyYy5jOiBEZWZpbmUgc29tZSByZWxvY2F0aW9ucywgYmFzZWQgb24gRUxGIHJlbG9jYXRpb25zLgotCShlbnVtIHJlbG9jX3R5cGUsIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIGNvZmZfc3BhcmNfaG93dG9fdGFibGUsCi0Jc3RydWN0IGNvZmZfcmVsb2NfbWFwLCBzcGFyY19yZWxvY19tYXAsCi0JY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6IEJvcnJvd2VkIGZyb20gZWxmMzItc3BhcmMuYyBhbmQKLQllbGYuYywgcmVuYW1lZC4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUgdG8gYmUgY29mZl9zcGFyY19yZWxvY18uLi4uCi0JKHJ0eXBlMmhvd3RvKTogSW5kZXggaW50byBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlIHVzaW5nCi0JZHN0LT5yX3R5cGUuCi0KLVRodSBOb3YgMTggMTE6NDU6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg1Kik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzYmVsZi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NSopIE5ldyBob3N0OyB1c2UgaXJpeDUgKG5vCi0JaG9zdHMvaXJpeDUuaCBjcmVhdGVkOyBqdXN0IHVzZSBzdGQtaG9zdC5oKS4KLQkqIGNvbmZpZy9pcml4NS5taDogTmV3IGZpbGU7IGxpa2UgaXJpeDQubWgsIGJ1dCBkb24ndCB1c2UgLUcgb3IKLQktbG1hbGxvYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmZzd2FwLmg6IENoYW5nZWQgdHlwZSBvZiBpbnRlcm5hbCBwb2ludGVycyBmb3Igc3dhcCBvdXQKLQlmdW5jdGlvbnMgdG8gY29uc3QgKi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3QxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZSBHT1QxNgotCWNvcnJlY3RseSBmb3IgYXNzZW1ibGVyLCBidXQgbGlua2VyIHN1cHBvcnQgbm90IGltcGxlbWVudGVkLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IFVzZSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBmb3IgR09UMTYuCi0JKG1pcHNfZWxmX3N5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb247IGF0IGxlYXN0IG9uIElyaXggNSwgYWxsCi0Jbm9uIHNlY3Rpb24gc3ltYm9scyBhcmUgY29uc2lkZXJlZCBnbG9iYWwuCi0JKGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uICBTZXQgdGhlIE1JUFMKLQlhcmNoaXRlY3R1cmUgbGV2ZWwgY29ycmVjdGx5LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19PUFRJT05TLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IGVudHNpemUgb2YgLm1kZWJ1ZyBvciAucmVnaW5mbwotCXNlY3Rpb24gdG8gMS4gIEhhbmRsZSAub3B0aW9ucyBzZWN0aW9uLgotCShtaXBzX2VsZl9hY29tX3NlY3Rpb24sIG1pcHNfZWxmX2Fjb21fc3ltYm9sLAotCW1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLCB1c2VkIHRvIGJ1aWxkIGEKLQlnZW5lcmljIC5hY29tbW9uIHNlY3Rpb24gdG8gaG9sZCBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMuCi0JKG1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogSGFuZGxlIFNITl9NSVBTX0FDT01NT04gc3ltYm9scyBieQotCXB1dHRpbmcgdGhlbSBhbGwgaW4gYSBnbG9iYWwgLmFjb21tb24gc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBkdW1wIGNvcmUgaWYgdGFyZ2V0Ci0Jc2VjdGlvbiBoYXMgbm8gRUxGIHNlY3Rpb24gZGF0YS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBTZXQgYWRkcmFsaWduIG9mIHJlbG9jIHNlY3Rpb24gdG8gNC4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOglEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCUluIHRoZSBtYWluIGxvb3AsIHNraXAgdGhlIHN5bXRhYiBhbmQgc3RydGFiIHNlY3Rpb25zLCBzaW5jZSB0aGVpcgotCXBvc2l0aW9ucyBhcmUgc2V0IGVsc2V3aGVyZS4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBhZGRyYWxpZ24gb2Ygc3ltdGFiIHNlY3Rpb24gdG8gNC4gIFNldAotCWFkZHJhbGlnbiBvZiBzdHJ0YWIgc2VjdGlvbnMgdG8gMS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIG91dCBzZWN0aW9uIDAuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGZpZWxkcwotCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgYW5kIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogQWRkZWQgY29ycmVzcG9uZGluZyBpbml0aWFsaXplcnMuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKHN5bV9pc19nbG9iYWwpOiBUYWtlIGFiZmQgYXJndW1lbnQuICBDYWxsCi0JZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCBpZiBpdCBpcyBub3QgTlVMTC4KLQkoZWxmX21hcF9zeW1ib2xzKTogUGFzcyBhYmZkIHRvIHN5bV9pc19nbG9iYWwuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCWlmIGl0IGlzIGRlZmluZWQuCi0KLVdlZCBOb3YgMTcgMTg6NDM6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGNvZmYvZWNvZmYuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IE1vdmUgZXh0ZXJuYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0JZmllbGRzIGludG8gYSBzaW5nbGUgZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfc3dhcAotCXN0cnVjdHVyZS4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmllbGRzIGludG8gYSBzaW5nbGUKLQlmaWVsZCBwb2ludGluZyB0byBhbiBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsIGVjb2ZmLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtc3dhcC5oOiBOZXcgZmlsZSB0byBzd2FwIGZpeGVkIGhlYWRlci4gIEluY2x1ZGVkIGJ5IE5MTQotCWJhY2tlbmRzLgotCSogbGlibmxtLmggKHN0cnVjdCByZWxvY19hbmRfc2VjKTogRGVmaW5lLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZml4ZWRfaGVhZGVyX3NpemUsCi0JbmxtX3JlYWRfaW1wb3J0LCBubG1fd3JpdGVfaW1wb3J0LCBubG1fc3dhcF9maGRyX2luLAotCW5sbV9zd2FwX2ZoZHJfb3V0LgotCShubG1fZml4ZWRfaGVhZGVyX3NpemUsIG5sbV9yZWFkX2ltcG9ydF9mdW5jLAotCW5sbV93cml0ZV9pbXBvcnRfZnVuYywgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMsCi0JbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jLCBubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IE5ldwotCWFjY2Vzc29yIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogVXNlIG5ldyBmdW5jdGlvbnMuCi0JKiBubG0zMi1pMzg2LmM6IFByb3ZpZGUgbmV3IGZ1bmN0aW9ucy4KLQkqIG5sbTMyLXNwYXJjLmM6IE5ldyBmaWxlOyBTUEFSQyBOTE0gYmFja2VuZC4KLQotV2VkIE5vdiAxNyAxMzo1NjoxMCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmMgKHN3YXBfc3RkX3JlbG9jX2luLCBzd2FwX2V4dF9yZWxvY19pbik6IElnbm9yZQotCWdhcmJhZ2UgYml0cyBhcHBlYXJpbmcgaW4gdGhlIHVwcGVyIGVuZCBvZiBzeW1ib2xudW1zLgotCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdCAoVERFRklORVMpOiBBZGQgLURGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0KLVR1ZSBOb3YgMTYgMTc6MDM6NDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIGJmZF96YWxsb2MgdG8gYmZkX2FsbG9jLgotCSogbTY4a2x5bnguYzogIERlZmluZSBjb3JlIGZpbGUgbWFjcm9zLgotCSogaG9zdHMvaTM4Nmx5bnguaCwgaG9zdHMvbTY4a2x5bnguaCwgaG9zdHMvbHlueC5oOiAgTW92ZSBhbGwKLQlub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0dWZmIGludG8gbHlueC5oLgotCi1UdWUgTm92IDE2IDE1OjQ1OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpMzg2bGludXguYzogRGVmaW5lIG5ldyBtYWNybyBaTUFHSUNfRElTS19CTE9DS19TSVpFIHRvIDEwMjQsIGFuZAotCWNoYW5nZSBQQUdFX1NJWkUgdG8gNDA5Ni4KLQotTW9uIE5vdiAxNSAxMTo0ODowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkLgotCi1TdW4gTm92IDE0IDIzOjMzOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IERvIG5vdCBjcmVhdGUgZHVtbXkgIi50ZXh0IiwgIi5kYXRhIiwKLQlhbmQgIi5ic3MiIHNlY3Rpb25zLgotCShzZXR1cF9zZWN0aW9ucyk6IERvIG5vdCBzZXQgU0VDX0hBU19DT05URU5UUyBpZiBhIHNlY3Rpb24ncyBzaXplCi0JaXMgemVyby4gIFJlY29nbml6ZSBCU1MgdHlwZSBzZWN0aW9ucyBhbmQgdHVybiBvZmYgU0VDX0xPQUQgYW5kCi0JU0VDX0RBVEEgKHNvIGJpbnV0aWxzL3NpemUgd29ya3MpLiAgU2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgotCWEgc2VjdGlvbidzIF9yYXdfc2l6ZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFByb2dyYW0gZW50cnkgcG9pbnRzLCBhbmQgbWlsbGljb2RlIGFyZQotCWFsc28gZnVuY3Rpb25zLiAgTWFyayB0aGVtIGFzIHN1Y2guICBBbHNvIG1hcmsgTCQqIHN5bWJvbHMgYXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDEzIDE1OjI3OjE1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4gIFJldHVybnMKLQlhIHBvaW50ZXIgdG8gY29uc3RhbnQgZGF0YS4gIERlbGV0ZSBib2d1cyAjZGVmaW5lIHdoaWNoIG1hZGUgdGhlIAotCWZ1bmN0aW9uIHVzZWxlc3MuCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIE5vdiAxMiAxNToyOTozNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCBhYm9ydC4gIEZsZXNoIG91dC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcHJlcF9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4KLQkoc29tX3NldF9hcmNoX21hY2gpOiBEbyBub3QgYWJvcnQuCi0KLQkqIHNvbS5jIChzb21fY291bnRfc3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fY291bnRfc3Vic3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShjb21wYXJlX3N5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9jb21wdXRlX2NoZWNrc3VtKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jICh0cnlfcHJldl9maXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX3NraXApOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19hZGRlbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19jYWxsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQpOiBMaWtld2lzZS4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpeCk6IExpa2V3aXNlLgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IExpa2V3aXNlLgotCi0JKiBzb20uYyAoc29tX2hwcGFfaG93dG9fdGFibGUpOiBTT00gaG93dG8gcmVsb2NhdGlvbiB0YWJsZS4KLQkoaHBwYV9zb21fcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzdHJ1Y3QgcmVsb2NfcXVldWUpOiBOZXcgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YKLQl0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSByZWxvY2F0aW9ucyBlbWl0dGVkLgotCShlbnVtIHBhX3N5bWJvbF90eXBlKTogVHlwZSB0byBmdWxseSBkZXNjcmliZSB0aGUgc3ltYm9sIHR5cGVzCi0JYXNzb2NpYXRlZCB3aXRoIC5pbXBvcnQvLmV4cG9ydCBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotCSogc29tLmM6IEluY2x1ZGUgbGliaHBwYS5oCi0KLQkqIHNvbS5jIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShiZmRfc29tX3NldF9zeW1ib0xfdHlwZSk6IExpa2V3aXNlLgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IExpa2V3aXNlLgotCSogc29tLmg6IERlY2xhcmUgbmV3IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fc3ltYm9sKTogQWRkIG5ldyBmaWVsZHMgdG8gaG9sZCBhZGRpdGlvbmFsCi0JaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkL3dyaXRlIHN5bWJvbCB0YWJsZXMgYW5kIGZpeHVwIHN0cmVhbXMuCi0JKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkoc29tX3N5bWJvbF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvIGZvciBTT00gc3ltYm9sIGluZm9ybWF0aW9uLgotCShSX0hQUEFfKik6IEJhc2ljIHJlbG9jYXRpb24gdHlwZXMgdG8gYmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyLgotCi1GcmkgTm92IDEyIDExOjAwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogSWYgbmV3IGhvb2sKLQlUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgZGVmaW5lZCwgdGhlbiBza2lwIHRoZSBjaGVjayBmb3IgdGhlCi0JY29yZWZpbGUgYmVpbmcgdG9vIGJpZy4KLQkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGl0LgotCi1UaHUgTm92IDExIDE1OjE2OjI4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgaHBwYWJzZF9jb3JlX2RhdGEuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHBwYWJzZF9jb3JlX3ZlYy4KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiBGYWlsIGlmIGFuIHVua25vd24gY29yZQotCXNlY3Rpb24gaXMgZW5jb3VudGVyZWQgZHVyaW5nIGNvcmUgc2VjdGlvbiBzY2FubmluZy4KLQkqIGhwcGFic2QtY29yZS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oOiBFbmFibGUgSFBQQSBCU0QgY29yZSBmaWxlcy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6IFJlbW92ZSBERUZVTiBjcnVkLiAgUmVtb3ZlIGNvZGUKLQl3aGljaCBpcyBlaXRoZXIgY29tbWVudGVkIG91dCBvciBpZmRlZidkIG91dC4gIEFkZCwgdXBkYXRlIGFuZAotCWNsZWFuIGNvbW1lbnRzLiAgRml4IHZhcmlvdXMgaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLiAgSGFuZGxlCi0JcHJvYmxlbXMgcmVsYXRlZCB0byB1c2luZyAiYmxlIiB0byBqdW1wIHRvIGEgc3R1YiByYXRoZXIgdGhhbiAiYmwiCi0JKCVyMzEgaXMgdHJhc2hlZCBieSAiYmxlIiwgYnV0IG5vdCBieSAiYmwiKS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogUHV0IGluc2lkZSBjdXJseSBicmFjZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBGaXggaW5kZW50aW9uIHByb2JsZW1zLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEZpeCBpbmRlbnRpb24gYW5kIHNwYWNpbmcgcHJvYmxlbXMuCi0JQWRkLCB1cGRhdGUgYW5kIGNsZWFuIGNvbW1lbnRzLiAgSGFuZGxlICJibGUiICVyMzEgbG9zc2FnZSBwcm9ibGVtcy4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayk6IFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0byBkZWFsIHdpdGggJXIzMSBsb3NzYWdlCi0JcHJvYmxlbXMuICBEZWxldGUgdW51c2VkIGluc3RydWN0aW9ucy4KLQkKLVR1ZSBOb3YgIDkgMTE6NDA6MjcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrbHlueC5jIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRGVmaW5lLgotCi1UdWUgTm92ICA5IDExOjI2OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2ggYW4gYXJyYXkKLQlvZiBhcmNoaXRlY3R1cmVzLCBnZXQgdGhlIEVMRiBFTV94eHggY29kZSBmcm9tIHRoZSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uICBMZXQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldCBtYXRjaCBhbnkgRU1feHh4IGNvZGUgbm90Ci0JbWF0Y2hlZCBieSBhbm90aGVyIEVMRiB0YXJnZXQuICBDYWxsIGVsZl9iYWNrZW5kX29iamVjdF9wIHRvIGxldAotCXRoZSBiYWNrZW5kIGRvIG1vcmUgY2hlY2tzIGFuZCBzZXQgZ2xvYmFsIGluZm9ybWF0aW9uLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZWxmX21hY2hpbmVfY29kZSBhbmQKLQllbGZfYmFja2VuZF9vYmplY3RfcCBmaWVsZHMuCi0JKHN0cnVjdCBiZmRfZWxmX2FyY2hfbWFwKTogUmVtb3ZlZC4KLQkoYmZkX2VsZl9hcmNoX21hcCwgYmZkX2VsZl9hcmNoX21hcF9zaXplKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogSW5pdGlhbGl6ZSBlbGZfbWFjaGluZV9jb2RlCi0JZmllbGQgd2l0aCBFTEZfTUFDSElORV9DT0RFLiAgSW5pdGlhbGl6ZSBlbGZfYmFja2VuZF9vYmplY3RfcAotCWZpZWxkIHdpdGggZWxmX2JhY2tlbmRfb2JqZWN0X3AgKGlmIGl0IGlzIGRlZmluZWQpLgotCSogZWxmMzItZ2VuLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsCi0JZWxmMzItbTY4ay5jLCBlbGYzMi1tODhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmluZWQuCi0JKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgZWNvZmZzd2FwLmggdG8gZ2V0IEVDT0ZGIHN3YXBwaW5nCi0Jcm91dGluZXMuCi0JKG1pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQuCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lZCB0byBiZSBtaXBzX2VsZl9vYmplY3RfcC4KLQkoZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQgdG8gYmUKLQltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgotCSogZWxmLmMgKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IFJlbW92ZWQuCi0KLQkqIGxpYmJmZC1pbi5oICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGZvcm1hdC5jICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEb24ndCBjb21wbGFpbiBvbiBvdmVyZmxvdwotCWZvciBSX01JUFNfMjYuICBDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUKLQl1cHBlciBmb3VyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLiAgRnJvbSBUZWQgTGVtb24KLQk8bWVsbG9uQHBlcHBlci5uY2QuY29tPi4KLQotCSogYm91dC5jIChiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJldHVybiB0eXBlIHNob3VsZCBwb2ludCB0bwotCWNvbnN0IGRhdGEuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSk6IExpa2V3aXNlLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE1hZGUgaG93dG8gY29uc3QuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogTWFkZSBob3cgY29uc3QuCi0KLQkqIGxpYmVsZi5oOiBBZGRlZCBzb21lIGNvbW1lbnRzLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZC4gIFJlbW92ZWQgdW51c2VkIHdyaXRlX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjMyLXRhcmdldC5oOiBBZGp1c3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uCi0JYWNjb3JkaW5nbHkuCi0JKiBlbGY2NC10YXJnZXQuaDogQ29ycmVjdGVkIGVsZl9iYWNrZW5kX2RhdGEgaW5pdGlhbGl6YXRpb24gdG8KLQlmaWxsIGluIGFsbCBmaWVsZHMgYW5kIHRvIHNldCBlbGZfNjRfcCB0byAxLgotCi1Nb24gTm92ICA4IDE4OjEzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgZHVwbGljYXRlIGFzc2lnbm1lbnQKLQl0byBmaWxlcG9zIGluIFNIVF9TVFJUQUIgY2FzZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBTZXQgQkZEIHNlY3Rpb24gZmlsZXBvcyBhcwotCXdlbGwgYXMgRUxGIHNlY3Rpb24gc2hfb2Zmc2V0LgotCi0JKiByZWxvYy5jOiBVc2UgY29uc3QgaW5zdGVhZCBvZiBDT05TVC4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IE1ha2UgdmFyaWFibGUgaG93dG8gYSBjb25zdCBwb2ludGVyLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotTW9uIE5vdiAgOCAxMjoxOToxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHJlYWxjbGVhbik6IERvbid0IHJlbW92ZSBnZW5lcmF0ZWQgaGVhZGVycy4gIFJldmVydHMKLQljaGFuZ2Ugb2YgMiBKdWwgMTk5My4KLQotTW9uIE5vdiAgOCAwNjowODozMSAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuYmZkOiBtYWtlIHVuaXh3YXJlIGVxdWl2YWxlbnQgdG8gc3lzdjQuCi0KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogYnJpbmcgaW4gZWxmIGNvbmZpZzsgbWFrZSBpdCB0aGUgZGVmYXVsdC4KLQotU3VuIE5vdiAgNyAyMDoyMTozOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliYmZkLmMgKGJmZF9wdXRfOCk6IEFkZCBwYXJlbnMgYXJvdW5kIHJlZmVyZW5jZSB0byAidmFsIgotCWFyZ3VtZW50LgotCi1GcmkgTm92ICA1IDIxOjQ1OjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfU0VHTUVOVF9TSVpFKSwKLQlpMzg2bWFjaDMuYyAoU0VHTUVOVF9TSVpFLCBURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0IHZhbHVlcyAoPykuCi0KLUZyaSBOb3YgIDUgMTU6MTc6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFplcm8gb3V0IGludGVybmFsX2EuCi0KLUZyaSBOb3YgIDUgMTA6NDE6MDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBjYWNoZS5jLCBjb2ZmY29kZS5oLAotCWNvcmUuYywgY3Rvci5jLCBmb3JtYXQuYywgaW5pdC5jLCBsaWJiZmQuYywgb3BuY2xzLmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzoKLQlEb2MgY2xlYW51cCAoc3BlbGxpbmcsIHB1bmN0dWF0aW9uLCBncmFtbWFyLCBmb3JtYXR0aW5nKS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBOb3YgIDQgMTQ6NDY6MTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9jYWNoZWFibGUsIGJmZF9zZXRfY2FjaGVhYmxlKTogIE5ldyBhY2Nlc3NvcnMuCi0JKiBiZmQuYywgb3BuY2xzLmM6ICBJbXByb3ZlIGNvbW1lbnRzIG9uIGZpbGUgZGVzY3JpcHRvciBjYWNoZWluZy4KLQotVGh1IE5vdiAgNCAwODo1NDozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRnJvbSBQZXRlIEhvb2dlbmJvb20gKGhvb2dlbkBjcy51dGFoLmVkdSkKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggbG9naWMgZXJyb3IKLQlpbiBsYXN0IGNoYW5nZS4gIEFsd2F5cyByZWJ1aWxkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiB0aGUgZmlyc3QKLQl0aW1lIHRob3VnaCBpZiBvdXRwdXQgc2VjdGlvbnMgZXhpc3QgKGZpeGVzIGxkIC1yIHByb2JsZW1zKS4KLQotVGh1IE5vdiAwNCAwODowODo0NiAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC5QSE9OWSBmb3IgY2hlY2sgYW5kIGluc3RhbGxjaGVjayBydWxlcy4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLiAgRmlsZSBiZWxvdyBpcyBhIGRlcml2ZWQgZmlsZS4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLgotCi1UdWUgTm92ICAyIDA5OjMyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgYmlnbWlwcyBmb3IgbWlwcyotKi1ic2QqLgotCi1Nb24gTm92ICAxIDE0OjMwOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NhX3RhYmxlLCBlbGZfc2x1cnBfcmVsb2NfdGFibGUpOgotCUhhbmRsZSBzeW1ib2wgbnVtYmVyIG9mIHplcm8uCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTCwgQkZEX1JFTE9DX01JUFNfR09UMTYsCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBIYW5kbGUgbmV3IHJlbG9jcy4KLQkobWlwc19lbGZfaGkxNl9yZWxvYywgbWlwc19lbGZfbG8xNl9yZWxvYyk6IFJlYXJyYW5nZSBfZ3BfZGlzcAotCWNoZWNrcyBzbGlnaHRseS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQsIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZCwKLQlNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXQgW3NpY10pOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zLgotCShNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBNWV9iZmRfcmVsYXhfc2VjdGlvbiwKLQlNWV9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUuCi0JKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAuCi0JKE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZSBmcm9tIE1ZX21ha2VfZGVidWdfc3ltYm9sLgotCShNWSh2ZWMpKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyIHRoYW4gbGlzdGluZyBmdW5jdGlvbnMuCi0JKiBocDMwMGhwdXguYyAoTVlfZ2V0X3N5bXRhYiwgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwKLQlNWV9jYW5vbmljYWxpemVfcmVsb2MsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRlZmluZSBpbgotCXRlcm1zIG9mIE1ZLCBiZWNhdXNlIHRoYXQgY2F1c2VzIGEgcmVjdXNpdmUgaW52b2NhdGlvbiBvZiBDQVQgd2hlbgotCWV4cGFuZGVkIHdpdGhpbiBKVU1QX1RBQkxFLCBhbmQgQU5TSSBjb21waWxlcnMgZG9uJ3QgZXhwYW5kCi0JcmVjdXJzaXZlIG1hY3Jvcy4KLQkqIG1pcHNic2QuYyAoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCwgYW5kIGRvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KLQkoTVlfY2Fub25pY2FsaXplX3JlbG9jKTogRG9uJ3QgZGVmaW5lIGluIHRlcm1zIG9mIE1ZLgotCShhb3V0X21pcHNfbGl0dGxlX3ZlYywgYW91dF9taXBzX2JpZ192ZWMpOiBVc2UgSlVNUF9UQUJMRSByYXRoZXIKLQl0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgotCi1Nb24gTm92ICAxIDA5OjEyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgbTY4ay1lbGYgZm9yIG02OCotKi1zeXN2NCouCi0KLVN1biBPY3QgMzEgMDk6MzU6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogTW92ZSBlbnVtIHRhcmdldF9mbGF2b3VyIG91dHNpZGUgb2Ygc3RydWN0IGFuZCBjaGFuZ2UKLQl0aGUgbmFtZSB0byBlbnVtIGJmZF9mbGF2b3VyLiAgVGhpcyBtZWFucyBiZmQgY2xpZW50cyBjYW4gdXNlIGl0LgotCSogYmZkLWluLmg6IEFkZCBtYWNybyBiZmRfZ2V0X2ZsYXZvdXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHNvbS5jOiBBZGQgY29tbWVudCBhYm91dCBob3cgYWJvcnQoKSBvbiBjb3JydXB0IGV4ZWN1dGFibGUgaXMgZXZpbC4KLQotU2F0IE9jdCAzMCAxMjoyNzowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpOiBBdm9pZCBhIGdvdG8uCi0KLUZyaSBPY3QgMjkgMTY6MDQ6MzMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jLCBsaWJiZmQuYzogZXhpdCgxKSBpbnN0ZWFkIG9mIGV4aXQoLTEpLgotCi1GcmkgT2N0IDI5IDEzOjE3OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEFkZGVkIGNvbW1hbmRzIGZvciBvYmplY3QgZmlsZSBmbGFnIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdHlwZSBpcyBFVF9EWU4sIHNldCBEWU5BTUlDIGZsYWcsCi0Jbm90IEVYRUNfUC4KLQkqIGJvdXQuYywgY29mZi1oODMwMC5jLCBjb2ZmLXNoLmM6IEFkZCBCRkRfSVNfUkVMQVhBQkxFIHRvCi0Jb2JqZWN0X2ZsYWdzIGZpZWxkIGZvciB0YXJnZXQgdmVjdG9yLgotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtYWxwaGEuYywgY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsCi0JY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGNvZmYtbWlwcy5jLAotCWNvZmYtcnM2MDAwLmMsIGNvZmYtc2guYywgY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jLCBocHV4LWNvcmUuYywKLQlpZWVlLmMsIG1pcHNic2QuYywgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBvc2YtY29yZS5jLCBzb20uYywKLQlzcmVjLmMsIHRla2hleC5jLCB0cmFkLWNvcmUuYzoJUmVtb3ZlIERZTkFNSUMgZnJvbSBvYmplY3RfZmxhZ3MKLQlmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KLQotVGh1IE9jdCAyOCAyMDowMjozMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgdGltZTsgY2F1c2VzIGVycm9yIG9uIG1hY2gzLgotCSogY29uZmlndXJlLmluIChpMzg2bWFjaDNfdmVjKTogUmVxdWlyZSBhb3V0MzIubyBzdGFiLXN5bXMuby4KLQotVGh1IE9jdCAyOCAxNjozMzoyNiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQlMeW54T1MgYW5kIFNwYXJjIEx5bnhPUyBjaGFuZ2VzOgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgU3BhcmMgTHlueCB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jIChzcGFyY2x5bnhfYW91dF92ZWMpOiBEZWNsYXJlLgotCShzcGFyY2x5bnhfY29mZl92ZWMpOiBEZWNsYXJlLgotCSh0YXJnZXRfdmVjdG9yKTogQWRkIHRoZW0uCi0JKiBjZi1pMzg2bHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGkzODZseW54LWNmLmMuCi0JKiBjZi1tNjhrbHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG02OGtseW54LWNmLmMuCi0JKiBjZi1zcGFyY2x5bnguYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGNvZmYgaW4gU3BhcmMgTHlueE9TLgotCSogY29mZi1zcGFyYy5jOiBOZXcgZmlsZSwgYmFzaWMgU3BhcmMgY29mZiBzdXBwb3J0LgotCSogc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBhLm91dCBpbiBTcGFyYyBMeW54T1MuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGZpbGVuYW1lcyBhcHByb3ByaWF0ZWx5LCBhZGQgU3BhcmMgcnVsZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlY29nbml6ZSBTcGFyYyBtYWdpYwotCW51bWJlci4KLQkoY29mZl9zZXRfZmxhZ3MpOiBVc2UgTHlueE9TIG1hZ2ljIG51bWJlciBmb3IgaTM4NiwgbTY4aywgYW5kCi0JU3BhcmMgTHlueE9TLCBzZXQgU3BhcmMgbWFnaWMgbnVtYmVyIGZvciBTcGFyY3MuCi0JKiBjb25maWcvbTY4ay1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgotCSogaG9zdHMvaTM4Nmx5bnguaDogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogaG9zdHMvbTY4a2x5bnguaDogQWRkIGlmZGVmcywgI2RlZmluZSBvZiBjZnJlZS4KLQkqIGhvc3RzL3NwYXJjbHlueC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyOCAxNjoyMzo0MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JUmVtb3ZlIHVzZWxlc3Mgc3RhdGVtZW50IHByb2JhYmx5IGxlZnQgYnkgY29kZSBjb3B5LgotCSogY3B1LWk5NjAuYyAoY29tcGF0aWJsZSk6IEZ1bGx5IGJyYWNrZXQgbWF0cml4IGluaXRpYWxpemVyLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSBiZmRfeG1hbGxvYwotCXJhdGhlciB0aGFuIHhtYWxsb2MuICBVc2UgcmVhbGxvYyBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQotCXJhdGhlciB0aGFuIHhyZWFsbG9jLgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBzb21lIGNhc3RzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZS4gIEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCSogaHAzMDBocHV4LmM6IERlY2xhcmUgYW91dF8zMl93cml0ZV9zeW1zLgotCSogaTM4NmJzZC5jLCBpMzg2bGludXguYywgbmV0YnNkMzg2LmMgKE5fU0hBUkVEX0xJQik6IERlZmluZSBhcyAwCi0JKGRlZmluaXRpb24gZnJvbSBhb3V0L2FvdXQ2NC5oIGlzIGFsd2F5cyAwIGFueWhvdykuCi0JKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfaWQpOiBsZW5ndGggY2FuIG5ldmVyIGJlIG5lZ2F0aXZlLgotCShyZWFkX2lkKTogTGlrZXdpc2UuCi0JKGllZWVfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX3BlcmZvcm1fc2xpcCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJlbW92ZSB6ZXJvIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RhdGljIHN0cnVjdHVyZS4KLQkqIHJlbG9jMTYuYzogSW5kZW50YXRpb24gY2hhbmdlLgotCi1XZWQgT2N0IDI3IDE2OjUxOjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9pMzg2LW1hY2gzLm10OiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmF0aW9uCi0JKC0td2l0aC10YXJnZXRzCWFuZCBzbyBvbikuCi0JKiBob3N0cy9pMzg2bWFjaDMuaDogRGVjbGFyZSBlcnJuby4KLQkqIHRhcmdldHMuYzogRGVjbGFyZSBpMzg2bWFjaDNfdmVjLgotCi1XZWQgT2N0IDI3IDEyOjE4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbiwKLQlubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBIYW5kbGUgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQKLQlhbmQgc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMuCi0KLVR1ZSBPY3QgMjYgMTY6MjE6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBTQ09fQ09SRS4gIE9uIFNlcCAxMSAxOTkzLAotCXdlIHN0YXJ0ZWQgdXNpbmcgdHJhZC1jb3JlLmMgZm9yIFNDTyBpbnN0ZWFkLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZS1lbmFibGUgZ2VuZXJpYyBFTEYgYW5kIE5MTSB0YXJnZXRzLgotCi1UdWUgT2N0IDI2IDE2OjUzOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IEFsaWduIHNoX29mZnNldCB0bwotCXNoX2FkZHJhbGlnbiAodGhpcyBpcyB3aGF0IFVuaXhXYXJlIGRvZXMsIGFuZCBpdCBzaG91bGRuJ3QgaHVydCkuCi0KLVR1ZSBPY3QgMjYgMTA6MTY6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlGcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IEFkZCBwcm90b3R5cGUuCi0JKEVMRjMyX0hQUEFfUl9BUkdfUkVMT0MpOiBSZW5hbWVkIHdpdGhvdXQgdGhlIEVMRjMyIHByZWZpeAotCWFuZCBtb3ZlZCBpbnRvIGxpYmhwcGEuaC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKEVMRjMyX0hQUEFfUl9DT05TVEFOVCwgRUxGMzJfSFBQQV9SX0FEREVORCk6IExpa2V3aXNlLgotCShnZXRfb3Bjb2RlIGFuZCBvcGNvZGUgZGVmaW5lcyk6IE1vdmUgaW50byBsaWJocHBhLmgKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaW5zbjJmbXQpOiBSZW5hbWUgYW5kIG1vdmUgaW5mbwotCWxpYmhwcGEuaC4KLQkqIGxpYmhwcGEuaCAoSFBQQV9SXyopOiBNb3ZlZCBoZXJlLiAgUmVmb3JtYXR0ZWQgc2xpZ2h0bHkgdG8gbWFrZQotCWZvciBlYXNpZXIgcmVhZGluZy4KLQkoZ2V0X29wY29kZSk6IE1vdmVkIGhlcmUuICBGSVhNRSEgdGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgQyBmdW5jdGlvbgotCWluc2lkZSB0aGUgb3Bjb2RlIGxpYnJhcnkhCi0JKGJmZF9ocHBhX2luc24yZm10KTogTGlrZXdpc2UuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBlbGYzMi1ocHBhIHZlY3Rvci4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBuZXcgY29tbWVudHMKLQlhbmQgY2xhcmlmeSBleGlzdGluZyBjb21tZW50cy4gIERvIG5vdCB1c2UgREVGVU4gdG8gZGVjbGFyZSB0aGlzCi0JZnVuY3Rpb24uICBGaXggbnVtZXJvdXMgaW5kZW50aW9uIHByb2JsZW1zLiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlcwotCXdoZXJlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBtYXkgbmVlZCB0byBiZSByZWFkIGZyb20gZGlzaywgCi0JcmVhZCBmcm9tIG1lbW9yeSwgb3IgYnVpbHQgdGhlbiByZWFkIGZyb20gbWVtb3J5LgotCi0JKiBlbGYzMi1ocHBhLmg6IFJlZm9ybWF0IHdpdGggZ251LWluZGVudCBhbmQgaGFuZCBmaXggbnVtZXJvdXMKLQlmb3JtYXR0aW5nIGFuZCBpbmRlbnRpb24gcHJvYmxlbXMgZ251LWluZGVudCBjYW4gbm90IGhhbmRsZS4KLQlDbGFyaWZ5IHNvbWUgY29tbWVudHMgYWJvdXQgcmVsb2NhdGlvbiB0eXBlcy4gIENvbW1lbnQgYmFzaWMKLQlyZWxvY2F0aW9uICJjbGFzc2VzIi4gIEdyb3VwIFBBUkFNIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KLQkoSFBQQV9TWFRfe05VTEwsIFNZTU5EWCwgUkdfUkVMT0N9KTogTWFrZSBtZW1iZXJzIG9mIGEgbmV3IAotCWVudW1lcmF0ZWQgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4KLQotVHVlIE9jdCAyNiAwMjo0MDo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3Rfc2V0dXApOiAgU2V0IFNFQ19DT0RFIGZvciAudGV4dCBzZWN0aW9uIHNvCi0JdGhhdCBHREIgY2FuIGZpZ3VyZSBvdXQgdGV4dF9zdGFydCBhbmQgdGV4dF9lbmQuCi0KLU1vbiBPY3QgMjUgMTY6MDU6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRml4IHVwIHdhcm5pbmdzIGZyb20gZ2NjIC1XYWxsOgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbHggYW5kIGNhc3Qgbl92YWx1ZSB0bwotCXVuc2lnbmVkIGxvbmcuICBVc2UgJWxkIGZvciB0YWduZHguICBVc2UgJWx4IGZvciBvZmZzZXQgKyB2bWEgYW5kCi0JY2FzdCBpdCB0byB1bnNpZ25lZCBsb25nLgotCSogZWNvZmYuYyAoZWNvZmZfZW1pdF9hZ2dyZWdhdGUpOiBVc2UgJWxkLgkKLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogVXNlICVsZCwgYW5kIGNhc3QgaW5keCBhbmQgc3ltX2Jhc2UgdG8gbG9uZy4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBTcGVjaWZ5IHJldHVybiB0eXBlLgotCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlKTogSWYgbm90IGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiBvdXQsIHNldAotCWJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlub24tbmVnYXRpdmUsIHNldCBlcnJubyB0byBFTk9TUEMgKGlmIEVOT1NQQyBpcyBkZWZpbmVkKS4KLQkoYmZkX3NlZWspOiBJZiB0aGUgc2VlayBmYWlscywgc2V0IGJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4KLQkoYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGb3IgYSBiYWQgb2Zmc2V0ICsgY291bnQsIHNldAotCWJmZF9lcnJvciB0byBiYWRfdmFsdWUuCi0JKiBzZWNsZXQuYyAocmVsKTogRG9uJ3QgYWJvcnQuICBJbnN0ZWFkLCByZXR1cm4gZmFsc2UuCi0KLU1vbiBPY3QgMjUgMDk6NTk6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLgotCi1GcmkgT2N0IDIyIDIwOjM1OjU0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaGFuZGxlIG1pcHMqLSogaW5zdGVhZCBvZiBtaXBzLSosIHVzZSBtaXBzKmVsCi0JICBpbnN0ZWFkIG9mIG1pcHMtKi0qbAotCi1GcmkgT2N0IDIyIDE0OjAzOjMzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIG02OGstbHlueC5tdCwgaTM4Ni1seW54Lm10IChUREVGSU5FUyk6IHNldAotCUZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCBiZWNhdXNlIHRoZSBvYmpkdW1wLmMgZGVjbGFyYXRpb24gb2YKLQlmcHJpbnRmIGNvbGxpZGVzIHdpdGggdGhlIG5hdGl2ZSBvbmUuCi0KLUZyaSBPY3QgMjIgMTE6NTA6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgTUlQUyBFTEYgdmVjdG9ycy4KLQotRnJpIE9jdCAyMiAwNzo1MTo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVGh1IE9jdCAyMSAxMjoxNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChGSUxFX0FMSUdOKTogUmVuYW1lZCBmcm9tIEVBTElHTiwgdG8gYXZvaWQgY29uZmxpY3QKLQl3aXRoIFVsdHJpeCBoZWFkZXIgZmlsZXMuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBSZW5hbWVkIGZyb20KLQlzb21fc2VjdGlvbl9kYXRhIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggbWFjcm8gYnkgdGhhdCBuYW1lLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiAgVGFyZ2V0IHJlZ2lzdGVyIGZvciBhICdqdW1wCi0JaW4gZGVsYXkgc2xvdCcgb3B0aW1pemF0aW9uIGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb25nIGNhbGwKLQlzdHViIHNob3VsZCBhbHdheXMgYmUgcjMxLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogVG8gYmUgY29uc2lzdGVudAotCWFjcm9zcyBhbGwgcmVsb2NhdGlvbiB0eXBlcywgcmV0cmlldmUgaW5zdHJ1Y3Rpb24gYWRkZW5kcyBmcm9tCi0JdGhlIHJlbG9jYXRpb24gZW50cnkgcmF0aGVyIHRoYW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRml4IGEgcmVsb2NhdGlvbgotCWVycm9yIHRoYXQgb25seSBvY2N1cnJlZCB3aGVuIHRoZSBhZGRlbmQgb2YgYW4gJ2FkZGlsJyBvcgotCSdsZGlsJyB3YXMgbGFyZ2VyIHRoYW4gMjEgYml0cyBhbmQgdmVyeSBjbG9zZSB0byBhIDJLIGJ5dGUKLQlib3VuZGFyeS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2MpOiAgSGFuZGxlIHRoZSBvcHRpbWl6YXRpb24gaW4KLQl3aGljaCBhIGp1bXAgaXMgcGxhY2VkIGluIHRoZSBkZWxheSBzbG90IG9mIGEgZnVuY3Rpb24gY2FsbC4KLQlUaGUganVtcCB3YXMgYmVpbmcgYWNjb21wbGlzaGVkIHZpYSBhbiBhZGp1c3RtZW50IHRvIHRoZQotCXJldHVybiBwb2ludGVyLiAgVGhpcyBvcHRpbWl6YXRpb24gd291bGQgYnJlYWsgdGhlIGxvbmcgY2FsbAotCXN0dWIgY29kZSwgaWYgdGhlcmUgd2FzIGFueS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IENvcnJlY3Rpb25zCi0JdG8gbG9uZyBicmFuY2ggc3R1YnMgdG8gYXZvaWQgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgMi4KLQotCSogaHBwYV9zdHVicy5oOiBOZXcgc3R1YiBpbnN0cnVjdGlvbnMuCi0KLQkqIGVsZmNvZGUuaDogRGVjbGFyZSBiZmRfZWxmX2ZpbmRfc2VjdGlvbi4KLQotCSogc29tLmggKHNvbV9zZWN0aW9uX2RhdGEpOiBBZGQgbmV3ICJzdWJzcGFjZV9pbmRleCIgZmllbGQuCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IFNhdmUgdGhlIG9yaWdpbmFsIFNPTSBzdWJzcGFjZSBpbmRleAotCWluIHRoZSBCRkQgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBzdWJzcGFjZS4gIAotCShzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEltcGxlbWVudC4KLQkoc29tX2dldF9zeW10YWIpOiBJbXBsZW1lbnQuCi0JKHNvbV9wcmludF9zeW1ib2wpOiBJbXBsZW1lbnQuCi0JKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cmluZyB0YWJsZQotCWZyb20gYSBTT00gb2JqZWN0IGZpbGUuCi0JKHNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXgpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZQotCXNlY3Rpb24gd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBTT00gc3Vic3BhY2UgaW5kZXguCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCB0aGUgc3ltYm9sCi0JdGFibGUgZnJvbSBhIFNPTSBvYmplY3QgZmlsZS4KLQkoc29tX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF96YWxsb2MuCi0JKHNvbV9uZXdfc2VjdGlvbl9ob29rKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9pbmRleCBmaWVsZCB0bwotCS0xIGluc3RlYWQgb2YgMC4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBGaXggcG9sYXJpdHkgb2YgdGVzdCB0byBzZXQgSEFTX1JFTE9DLgotCVNldCBFWEVDX1AgZm9yIGV4ZWN1dGFibGVzLgotCShzZXR1cF9zZWN0aW9ucyk6IENvcnJlY3RseSBpZGVudGlmeSB3aGVuIGEgc2VjdGlvbiBoYXMKLQlyZWxvY2F0aW9ucy4KLQkobG9nMik6IE5ldyBmdW5jdGlvbi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgY29udmVydCBiZXR3ZWVuIFNPTSBhbGlnbm1lbnRzIGFuZCBCRkQKLQlhbGlnbm1lbnRzLgotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19BTExPQyBvciBTRUNfTE9BRAotCWZvciBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIFNPTSBzcGFjZXMsIGRvaW5nIHNvIGNvbmZ1c2VzCi0JbWFueSB1dGlsaXRpZXMuICBTZXQgYXNzb3J0ZWQgU0VDXyogZmxhZ3MgZm9yIFNPTSBzdWJzcGFjZXMKLQl3aGljaCBjb3JyZXNwb25kIHRvIEJGRCBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBUaGUgc3RhYgotCXN0cmluZyB0YWJsZSBzaG91bGQgaGF2ZSBzaF90eXBlID09IFNIVF9TVFJUQUIuICBBZGQKLQlwcm9jZXNzaW5nIHRvIG1ha2UgaXQgc28uCi0KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFN0cmluZyB0YWJsZXMgKG90aGVyCi0JdGhhbiAuc3RydGFiKSB3ZXJlIG5vdCBnZXR0aW5nIHRoZSBmaWxlIG9mZnNldHMgcmVjb3JkZWQsIHNvCi0JdGhleSBjb3VsZCBub3QgYmUgcmVhZCBmcm9tIGRpc2suCi0KLQkqIGVsZmNvZGUuaDogKGVsZl9tYWtlX3NlY3Rpb25zKTogIExlYXZlIHRoZSBzaF9hZGRyIGZpZWxkIG9mCi0JdGhlIHNlY3Rpb24gaGVhZGVyIGFuZCB0aGUgdm1hIGZpZWxkIG9mIGEgc2VjdGlvbiBhdCAwIGlmIHRoZQotCXNlY3Rpb24gaXMgbm90IHBhcnQgb2YgdGhlIHByb2dyYW0gZXhlY3V0aW9uIGltYWdlLiAoZS5nLiwKLQkuc3RhYikKLQotCSogc29tLltoY106IENoYW5nZSB0YXJnZXQgdmVjdG9yIHByZWZpeCBmcm9tICJocHBhIiB0byAic29tIi4KLQlDb25zaXN0ZW50bHkgdXNlIG9ial9zb20gcHJlZml4IHRvIGFjY2VzcyBmaWVsZHMgaW4gYmFja2VuZCBkYXRhCi0Jc3RydWN0dXJlcy4gIEZpeCBhbGwgY2FsbGVycy9yZWZlcmVuY2VzLgotCi0JKiBzb20uaDogRG8gbm90IGluY2x1ZGUgZmlsZXMgb25seSBuZWVkZWQgZm9yIGNvcmUgZmlsZSByZWFkaW5nIGhlcmUuCi0JSW5jbHVkZSBhLm91dCBmb3IgYm90aCBIT1NUX0hQUEFIUFVYIGFuZCBIT1NUX0hQUEFCU0QuICBEZWxldGUKLQlmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMsIHRoZXkgYXJlIHVubmVjZXNzYXJ5LgotCShzdHJ1Y3Qgc29tZGF0YSk6IERlbGV0ZSBhdXhfaGRyLCBhbmQgaHBfc3ltYm9sX2VudHJ5X3NpemUgZmllbGRzLgotCUNoYW5nZSAic3ltYm9scyIgdG8gInN5bXRhYiIuICBBZGQgInN0cmluZ3RhYiIgYW5kICJyZWxvY19maWxlcG9zIgotCWZpZWxkcyBmb3IgZnV0dXJlIHVzZS4gIENoYW5nZSBvYmpfc29tXyogbWFjcm9zIGFzIGFwcHJvcHJpYXRlLgotCShzb21fc2VjdGlvbl9kYXRhKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIFNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCWFib3V0IEJGRCBzZWN0aW9ucyAoZm9yIGZ1dHVyZSB1c2UpLgotCi0JKiBzb20uYzogUHJvdmlkZSBQQVJBTVMgZGVjbGFyYXRpb25zIGZvciBhbGwgZnVuY3Rpb25zIGN1cnJlbnRseQotCWluIHRoaXMgZmlsZS4KLQkoc3RydWN0IGNvbnRhaW5lcik6IERlbGV0ZSB1bndhbnRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFkZCBjb21tZW50cy4gIFVzZSBzb21fbWtvYmplY3QgdG8gYWxsb2NhdGUKLQlTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIEJGRDsgdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0JZmlsZSBhbmQgKHBvc3NpYmx5IGVtcHR5KSBhdXhpbGlhcnkgaGVhZGVycyB0byBpbml0aWFsaXplIHRoaXMKLQlpbmZvcm1hdGlvbi4gIERlbGV0ZSByZWR1bmRhbnQgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgImNhbGxzIi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBSZXR1cm4gdHlwZSBpcyBub3cgYm9vbGVhbiwgZml4IHJldHVybiBzdGF0ZW1lbnRzLgotCSJGaXgiIGhhbmRsaW5nIG9mIEJTUyBsaWtlIHN1YnNwYWNlcyBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlCi0JY29udGFpbmluZyBzcGFjZSdzIHNpemUuICBJZiB0aGUgc3Vic3BhY2UgaGFzIHJlbG9jYXRpb25zLCBzZXQgdGhlCi0JYXBwcm9wcmlhdGUgQkZEIHNlY3Rpb24gZmxhZ3MgYW5kIHJlY29yZCB0aGUgaW5kZXggaW50byBhbmQgdGhlCi0Jc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShzb21fb2JqZWN0X3ApOiBTZXQgYmZkX2Vycm9yIGFwcHJvcHJpYXRlbHkgaWYgZXJyb3JzIGFyZSBkZXRlY3RlZAotCWZyb20gYmZkX3tyZWFkLHNlZWt9IGZ1bmN0aW9ucy4gIEhhbmRsZSBFWEVDTElCTUFHSUMgdHlwZSBmaWxlcy4KLQlEbyBub3QgdHJ5IHRvIHJlYWQgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4KLQkoc29tX21rb2JqZWN0KTogRmxlc2ggb3V0LgotCShzb21fc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3BhY2UgdG8gaG9sZCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KLQlhYm91dCBzZWN0aW9ucy4KLQotVGh1IE9jdCAyMSAxMjo0MTozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogY29mZi1oODMwMC5jLCBjb2ZmY29kZS5oOiBDaGFuZ2Ugc2hyaW5rIHBhcmFtZXRlcgotCWluICpfcmVsb2MxNl9lc3RpbWF0ZSB0byB1bnNpZ25lZCB0byBtYXRjaCBwcm90b3R5cGUuCi0JKiBhcmNoaXZlLmM6IEF2b2lkICIvKiIgaW4gY29tbWVudC4KLQotVGh1IE9jdCAyMSAxMzowNToxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRlcC1pbi5zZWQ6IENyZWF0ZSBvdXIgb3duIGxpbmUgYnJlYWtzIGZvciBhIG1vcmUgYWVzdGhldGljCi0JTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYzogSW5jbHVkZSAic2VjbGV0LmgiLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRm9yY2Ugc2l6ZSBvZiAucmVnaW5mbyBzZWN0aW9uIHRvIHNpemVvZgotCUVsZjMyX0V4dGVybmFsX1JlZ0luZm8uCi0JKG1pcHNfZWxmX3NlY2xldF9saW5rKTogTmV3IGZ1bmN0aW9uLiAgTGluayB0aGUgLnJlZ2luZm8gc2VjdGlvbgotCXNwZWNpYWxseSwgYW5kIHBhc3MgZXZlcnl0aGluZyBlbHNlIHRvIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0JKGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUgbWFjcm8uCi0JKiBlbGYzMi10YXJnZXQuaDogSWYgYmZkX2VsZjMyX2JmZF9zZWNsZXRfbGluayBpcyBhbHJlYWR5IGRlZmluZWQsCi0JZG9uJ3Qgb3ZlcnJpZGUgaXQuCi0KLVdlZCBPY3QgMjAgMTI6MjI6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHNpZ25hdHVyZSBmaWVsZC4KLQkobmxtX3NpZ25hdHVyZSk6IE5ldyBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIHRoZSBOTE0KLQlzaWduYXR1cmUgZnJvbSB0aGUgYmFja2VuZCByYXRoZXIgdGhhbiB0aGUgY29uc3RhbnQgTkxNX1NJR05BVFVSRS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKTogSW5pdGlhbGl6ZSBzaWduYXR1cmUgZmllbGQuCi0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IEFjY2VwdCBNX1VOS05PV04uCi0JKE5BTUUoc3Vub3Msc2V0X2FyY2hfbWFjaCkpOiBUcmVhdCBNX1VOS05PV04gYXMgNjgwMDAsIG5vdCA2ODAyMC4KLQotV2VkIE9jdCAyMCAxMDoyODoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmJzZC5oIFtfX2JzZGlfX106IERlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUi4KLQotV2VkIE9jdCAyMCAxMDoxMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IE5ldyB2YXJpYWJsZSwgZm9yIHVzZSBpbiAibWFrZSBkZXAiLgotCSguZGVwKTogRGVwZW5kIG9uICQoQ0ZJTEVTKSBhbmQgJChIRklMRVMpLiAgRGVsZXRlIC5kZXAxIGFuZAotCXJlbWFrZSBpdCwgc28gdGhhdCAiJD8iIGlzIGNvbXBsZXRlLgotCSguZGVwMSk6IERvbid0IG5lZWQgdG8gcmVtb3ZlIC5kZXAxIGZpcnN0LgotCShkZXAuc2VkKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMsIG5vdCBNYWtlZmlsZS4KLQkoQ0ZJTEVTKTogQWRkIG5sbS5jLgotCi1UdWUgT2N0IDE5IDE1OjI2OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jOiBJbXBsZW1lbnRlZCByZWxvYyBoYW5kbGluZyBmb3IgdGhlIGxpbmtlciwgbWFkZQotCXZhcmlvdXMgb3RoZXIgcmVsYXRlZCBjaGFuZ2VzLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgcmRhdGFfaW5fdGV4dCBmaWVsZC4KLQlSZW5hbWVkIGZpbmlzaF9yZWxvYyB0byBhZGp1c3RfcmVsb2NfaW4uICBBZGRlZCBhZGp1c3RfcmVsb2Nfb3V0Ci0JZmllbGQuCi0JKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOgotCUhhbmRsZSAubGl0YSBzZWN0aW9uLgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX0ZJTkkuCi0JZmluaXNoX3JlbG9jIGJhY2tlbmQgZmllbGQgcmVuYW1lZCB0byBhZGp1c3RfcmVsb2NfaW4uCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IEFkanVzdCBudW1iZXIgb2YgYXV4IGVudHJpZXMgdG8KLQlkZWJ1Z19hbGlnbiBib3VuZGFyeS4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgcmRhdGFfaW5fdGV4dCBwdXQKLQkucmRhdGEgc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuICBQdXQgLnBkYXRhCi0Jc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgQWxzbywgY2FsbAotCWFkanVzdF9yZWxvY19vdXQsIGFuZCBoYW5kbGUgLmxpdGEsIC54ZGF0YSwgLnBkYXRhLCAuZmluaSBhbmQKLQlhYnNvbHV0ZSBzZWN0aW9ucyB3aGVuIHdyaXRpbmcgb3V0IHJlbG9jcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBvdXRwdXQgMiBmb3IKLQlibGRyZXYgZmllbGQsIGFzIG9uIEFscGhhIE9TRi8xLiAgUGFkZGluZyBmaWVsZCBpcyBub3cgMiBieXRlcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogQWRkZWQgYXNzZXJ0aW9uLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IFJlbmFtZWQgZnJvbSBtaXBzX2ZpbmlzaF9yZWxvYy4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTmV3IGZ1bmN0aW9uIChkb2VzIG5vdGhpbmcpLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoZWNvZmZfYmZkX2dldF9yZWxvY2F0aW9uX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gYmUKLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGRlZCBjYXN0cyB0byBhdm9pZCBBbHBoYQotCU9TRi8xIGNjIGJ1Zy4KLQotVGh1IE9jdCAxNCAwMToxMDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgY29tbWVudHMgYXR0ZW1wdGluZyB0bwotCWV4cGxhaW4gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRG9uJ3Qgc2V0IFNFQ19ERUJVR0dJTkcgdW50aWwgaXQKLQlpcyBtYWRlIHRvIHdvcmsuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVtb3ZlIGNoZWNrIGZvcgotCVVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuCi0JKiBjb2ZmLWkzODYuYzogRG9uJ3QgZGVmaW5lIFVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuICBCYXNpbmcKLQlpdCBvbiBob3N0IGRlZmluZXMgaXMgd3JvbmcuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IERvbid0IGxpbmsgYSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCByZXF1aXJlIHRoZSAucmVnaW5mbyBzZWN0aW9uCi0JdG8gYmUgYSBwYXJ0aWN1bGFyIHNpemUuCi0KLVdlZCBPY3QgMTMgMTg6Mzk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVwLWluKTogTmV3IHJ1bGUsIGZvciBlZGl0aW5nIGRlcGVuZGVuY2llcyBpbnRvCi0JTWFrZWZpbGUuaW4gaW4gJChzcmNkaXIpLiAgVXNlIG1vdmUtaWYtY2hhbmdlLgotCSguZGVwMSwgZGVwKTogVXNlIG1vdmUtaWYtY2hhbmdlLgotCShDRklMRVMpOiBBZGQgY29mZi1hcG9sbG8uYy4KLQotCVN1biBPY3QgMTAgMTg6MDI6NTYgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuRURVLkFVKQotCi0JKiBNYWtlZmlsZS5pbjogUmVjb2duaXNlIG5ldyBmaWxlLCBjb2ZmLWFwb2xsby5vCi0KLQkqIGNvZmYtYXBvbGxvLmM6IE5ldyBmaWxlCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbmlzZSBhcG9sbG8gbWFnaWMgbnVtYmVycyBhbmQgd3JpdGFibGUgdGV4dAotCi0JKiBjb2Zmc3dhcC5oOiBTd2FwIEFwb2xsbyBvcHRpb25hbCBoZWFkZXIgZW50cmllcwotCi0JKiBjb25maWcuYmZkOiBBZGQgbGluZSBmb3IgQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZXBsYWNlIGFwb2xsbzY4YiBhbmQgYXBvbGxvNjh2IHdpdGggQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGFwb2xsb2NvZmZfdmVjCi0KLQkqIHRhcmdldHMuYzogTGlrZXdpc2UKLQotCSogY29uZmlnL2Fwb2xsby5taCwgY29uZmlnL2Fwb2xsby5tdDogTmV3IGZpbGVzCi0KLQkqIGhvc3RzL2Fwb2xsbzY4Lmg6IFJlbW92ZSBpbmNsdXNpb24gb2Ygc3RyaW5ncy5oCi0KLVdlZCBPY3QgMTMgMTQ6Mjg6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogTm93IHN0YXRpYy4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCk6IE5ldyB0YXJnZXRzLCB0byBtYWtlICJtYWtlIGRlcCIgd29yawotCWJldHRlci4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JKiBtNjhrbHlueC1jZi5jIChPTkxZX0RFQ0xBUkVfUkVMT0NTKTogRGVmaW5lLCB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3RzIHdoZW4gIi0td2l0aC10YXJnZXRzPWFsbCIuCi0JKiBjb2ZmLW02OGsuYyAobTY4a2NvZmZfaG93dG9fdGFibGUsIG02OGtfcnR5cGUyaG93dG8sCi0JbTY4a19ob3d0bzJydHlwZSk6IFJlbmFtZSB2aWEgbWFjcm9zIHRvIGtlZXAgbmFtZXNwYWNlIGNsZWFuLgotCSogY29uZmlndXJlLmluOiBGb3IgbTY4a2x5bnhfY29mZl92ZWMsIGluY2x1ZGUgY29mZi1tNjhrLm8gZm9yCi0Jbm93LgotCi1UdWUgT2N0IDEyIDE3OjAzOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIGRvIHJlbG9jYXRpb25zIGFuZCB0bwotCWhhbmRsZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBQYXNzIGZvdXJ0aCBhcmd1bWVudCB0bwotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0byBwZXJtaXQgaXQgdG8gY29udHJvbCB0aGUKLQlzZWN0aW9uIGluZGV4IHRvIHVzZS4KLQkoZWxmX29ial90ZGF0YSk6IEFkZCBncCBhbmQgZ3Bfc2l6ZSBmaWVsZHMuCi0JKGVsZl9ncCwgZWxmX2dwX3NpemUpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCSogZWxmY29kZS5oOiBSZW1vdmVkIGEgbnVtYmVyIG9mIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2xlYXIgc2VjdGlvbiBoZWFkZXIgYmVmb3JlIGNhbGxpbmcKLQllbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLCBub3QgYWZ0ZXIuCi0JKHByZXBfaGVhZGVycyk6IFJldHVybiB0cnVlIGF0IGVuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFBhc3MgcmV0dmFsIGFyZ3VtZW50IHRvCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKToKLQlBY2NlcHQgYW5kIGlnbm9yZSBuZXcgcmV0dmFsIGFyZ3VtZW50LgotCSogYmZkLmM6IEluY2x1ZGUgbGliZWxmLmguCi0JKGJmZF9zZXRfZ3Bfc2l6ZSk6IEhhbmRsZSBFTEYgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChiZmQubyk6IERlcGVuZHMgdXBvbiBsaWJlbGYuaC4KLQkoZWxmMzItbWlwcy5vKTogRGVwZW5kcyB1cG9uICQoSU5DRElSKS9lbGYvbWlwcy5oLgotCi1Nb24gT2N0IDExIDE3OjI1OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBDaGVjayBiZmRfbWFrZV9zZWN0aW9uIHJldHVybiB2YWx1ZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCi0JZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZHVtbXkgUkVHSU5GTyBzZWN0aW9uLgotCShlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgcmVhZGluZwotCVJFR0lORk8gc2VjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIGZyb20gbWFjcm8KLQlkZWZpbml0aW9uIHRvIGZ1bmN0aW9uIHByb3RvdHlwZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBwcm90b3R5cGUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBlY29mZl9ta29iamVjdF9ob29rLgotCi1GcmkgT2N0ICA4IDE1OjI1OjMzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliYmZkLmMgKGJmZF9nZXQqMzIsIGJmZF9nZXQqNjQpOiAgUHJldmVudCBBTlNJIHNpZ24gZXh0ZW5zaW9uCi0JYnkgY2FzdGluZyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIHRvIGJmZF92bWEuCi0KLUZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBEbyBub3QgZGVmaW5lIFNFTEVDVF9WRUNTLCBTRUxFQ1RfQVJDSElURUNUVVJFUwotCWlmIGNvbmZpZ3VyaW5nIC0td2l0aC10YXJnZXRzPWFsbC4KLQotVGh1IE9jdCAgNyAxNzozNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IENvcnJlY3QgdGhlICJzaXplIiBmaWVsZCBpbiBzb21lCi0JZW50cmllcy4KLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IENoYW5nZSBkb2N1bWVudGF0aW9uIHRvIGRpc3BlbCBhbnkKLQlub3Rpb24gdGhhdCB0aGUgInNpemUiIGZpZWxkIGlzIGEgcG93ZXItb2YtdHdvIGluZGljYXRvci4KLQotVGh1IE9jdCAgNyAxMDo1MDozOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0gICAgICAgKiBjb2Zmc3dhcC5oOiAoYmZkX3N3YXBfcmVsb2NfaW4pOiBhIHN5bW5keCBpcyBzaWduZWQuCi0KLQlNYWtlIHN1cHBvcnQgZm9yIHJlbGF4aW5nIG1vcmUgZ2VuZXJpYy4KLQkqIHJlbG9jMTYuYzogQWRkIG5ldyB0YXJnZXQgZW50cnkgLSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlLAotCWZpeCBiaXQgcm90LgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmg6IGRlY2xhcmF0aW9ucy4gUHJvdG90eXBlcwotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY2FsbHMgdG8KLQljb2ZmX3JlbG9jXzE2X2V4dHJhX2Nhc2VzIGFuZCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUuCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24KLQotVGh1IE9jdCAgNyAxNDoyNDoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoRUFMSUdOKTogRGVmaW5lLCBkZXBlbmRlbnQgb24gQVJDSF9TSVpFLgotCShhbGlnbl9maWxlX3Bvc2l0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbG9jYXRlX3NoKTogRGlzYWJsZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBbGlnbiBwb3NpdGlvbiwKLQl0aGVuIHBsYWNlIHN5bXRhYiwgdGhlbiBkbyBvdGhlciBzZWN0aW9ucy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBbGlnbiBwcm9ncmFtIGhlYWRlci4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiBzZWN0aW9uIGhlYWRlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogQWxpZ24gcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotVHVlIE9jdCAgNSAxMDo0NDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0JQ2hhbmdlIG90aGVyIGhwcGEgZW50cmllcyB0byB1c2UgLSotIG5vdCAtaHAtLgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQotCSogY29mZi1yczYwMDAuYywgY3B1LXJzNjAwMC5jLCByczYwMDAtY29yZS5jOiBDaGFuZ2Ugbm9uLUFTQ0lJCi0JY2hhcmFjdGVycyBpbiBjb21tZW50IHRvIG9jdGFsIGVzY2FwZXMuCi0KLVN1biBPY3QgIDMgMTI6MzU6MTUgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODZseW54LmM6IFJlbW92ZWQsIG5hbWUgdG9vIGxvbmcuCi0JKiBpMzg2bHlueC1jZi5jOiBOZXcgZmlsZSwgd2FzIGNvZmYtaTM4Nmx5bnguYy4KLQkqIGNvbmZpZ3VyZS5pbjogUmVmbGVjdCBmaWxlIG5hbWUgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluOiBNZW50aW9uIEx5bngtcmVsYXRlZCBmaWxlcy4KLQotCSogaTM4Nmx5bnguYyAobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IGdldCByZWxvYyBiaXRzIGluIGkzODYKLQlMeW54LXNwZWNpZmljIHdheS4KLQotCSogbTY4a2x5bngtY2YuYzogTmV3IGZpbGUsIGRlZmluZXMgY29mZiBmb3JtYXQgZm9yIE02OEsgTHlueE9TLgotCSogbTY4a2x5bnguYzogUmVtb3ZlIGNvZmYgdmVjdG9yIGRlZmluaXRpb24sIG5vdyBpbiBtNjhrbHlueC1jZi5jLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFNldCBzZWN0aW9uIGZsYWcgdG8gU1RZUF9JTkZPCi0JZm9yIC5zdGFiLCAuc3RhYnN0ciBhbmQgLmRlYnVnIHNlY3Rpb25zLCBhbmQgc2V0IFNFQ19ERUJVR0dJTkcgZm9yCi0Jc2VjdGlvbnMgb2YgdHlwZSBTVFlQX0lORk8uICAoZnJvbSBNaW5oIFRyYW4tTGUpCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIGRpc2NhcmRlZF9zZWN0aW9uc19jb3VudAotCXRvIGFiZmQtPnNlY3Rpb25fY291bnQsIHdoaWNoIGhlbHBzIGBzdHJpcCcga2VlcCB0aGUgc2l6ZQotCW9mIHRoZSBleGVjdXRhYmxlIGhlYWRlciBjb25zdGFudC4KLQkqIGNvZmYtaTM4Ni5jIChkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQpOiBOZXcgdmFyaWFibGUsIGluaXRpYWxpemVkCi0JdG8gemVyby4gIEZvciB1c2UgYnkgYHN0cmlwJy4gIEN1cnJlbnRseSBiZWluZyB1c2VkIG9ubHkgaW4gYWl4Mzg2Ci0JY29mZiwgYnV0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVyIGNvZmYgc3lzdGVtcy4gIChmcm9tIE1pbmggVHJhbi1MZSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogQWRkZWQgYSBtaXNzaW5nIGNhc3QuCi0KLQkqIGFyY2hpdmUuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogb3BuY2xzLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkobmV3X2JmZCk6IFJlbW92ZWQgcmVkdW5kYW50IHN0cnVjdHVyZSBzbG90IGluaXQuCi0KLVNhdCBPY3QgIDIgMTg6NDg6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9uZXdzLW1pcHMubWgsIGhvc3RzL25ld3MtbWlwcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIG5ld3MtbWlwcyBmb3IgbWlwcy1zb255LWJzZCouCi0KLUZyaSBPY3QgIDEgMTM6MTQ6MTcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODZseW54X2NvZmZfdmVjIHJlcXVpcmVzIGNvZmYtaTM4Nmx5bnguby4KLQkqIGNvZmYtaTM4Nmx5bnguYzogTmV3IGZpbGUsIGRlZmluZXMgTHlueCB0YXJnZXQgdmVjdG9yIGFuZCBuYW1lLAotCWluY2x1ZGVzIGNvZmYtaTM4Ni5jLgotCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IEFsbG93IHJlZGVmaW5pdGlvbiBvZiB0YXJnZXQgdmVjdG9yCi0Jc3ltYm9sIGFuZCBuYW1lLCBpZiBUQVJHRVRfU1lNIGFuZC9vciBUQVJHRVRfTkFNRSBhcmUgZGVmaW5lZC4KLQkqIGkzODZseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uIGVudGlyZWx5LgotCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX2luKTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX2luKTogRGVmaW5lLCBnZXQgcmVsb2MgYml0cyBpbiBpMzg2Ci0JTHlueC1zcGVjaWZpYyB3YXkuCi0JKGx5bnhfMzJfc3dhcF9leHRfcmVsb2Nfb3V0KTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX291dCk6IERlZmluZS4KLQkobHlueF8zMl9zbHVycF9yZWxvY190YWJsZSk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9zcXVpcnRfb3V0X3JlbG9jcyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9jYW5vbmljYWxpemVfcmVsb2MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKFdSSVRFX0hFQURFUlMpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlIHJlZHVuZGFudCB2ZWN0b3IuCi0KLVRodSBTZXAgMzAgMTc6NTA6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIGxpbmthZ2UtdGFibGUgcmVsYXRpdmUKLQlyZWxvY2F0aW9ucyBvZiBzaXplIDgsIDE2LCAzMi4gIFNvcnQgZ2VuZXJpYyByZWxvY3MgYnkgdHlwZSByYXRoZXIKLQl0aGFuIHNpemUuICBBZGRlZCBhIGxpdHRsZSBkb2N1bWVudGF0aW9uIHRvby4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogQWRkIEJBU0UxNiBhbmQgQkFTRTMyIHJlbG9jcy4KLQkoVEFCTEVfU0laRSk6IE5ldyBtYWNyby4KLQkocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX3sxNiwzMn1fQkFTRVJFTCBmb3Igc3RkCi0JcmVsb2NzLgotCShzd2FwX3N0ZF9yZWxvY19vdXQpOiBXcml0ZSBiYXNlcmVsIHJlbG9jcyBjb3JyZWN0bHkuCi0JKHN3YXBfc3RkX3JlbG9jX2luKTogSGFuZGxlIHJfYmFzZXJlbCBmaWVsZC4gIEFzc2VydCB0aGF0Ci0Jcl9qbXB0YWJsZSBhbmQgcl9yZWxhdGl2ZSBmaWVsZHMgYXJlIGNsZWFyLCBhbmQgdGhhdCB0aGUgY29tcHV0ZWQKLQlpbmRleCBkb2VzIHJlZmVyIHRvIGEgZGVmaW5lZCBlbnRyeSBvZiB0aGUgaG93dG8gdGFibGUuCi0KLVR1ZSBTZXAgMjggMTQ6NDc6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBOZXcgZnVuY3Rpb24uCi0JKiBzZWN0aW9uLmM6IENoYW5nZSBjb21tZW50cyB0byBzYXkgc2V2ZXJhbCBzZWN0aW9ucyBjYW4gaGF2ZQotCXRoZSBzYW1lIG5hbWUuCi0JKiBiZmQtaW4yLmg6IFJlLWdlbmVyYXRlIHRvIHJlZmxlY3QgYWJvdmUgY2hhbmdlLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDYWxsIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0JaWYgc3RpbGwgbm8gc2VjdGlvbiBhZnRlciB0aGUgYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2suCi0JKiBjb2ZmY29kZS5oOiBBZGQgY29tbWVudCBhYm91dCBUV09fREFUQV9TRUNTLgotCi1UdWUgU2VwIDI4IDAzOjIyOjI0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6ICBBbHdheXMgZGV0ZXJtaW5lIHJhd19zaXplCi0JZXhwbGljaXRseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzLCBlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6ICBIYW5kbGUKLQkuZmluaSBzZWN0aW9uLgotCi1Nb24gU2VwIDI3IDE4OjI5OjE4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCBjb25maWd1cmUuaG9zdDogTWF0Y2ggb24gKi1seW54b3MqIGZvciBMeW54T1MsCi0JYWRkIG02OCotKi1seW54b3MqLgotCSogY29uZmlndXJlLmluIDogUmVwbGFjZWQgaTM4Nmx5bnhfdmVjIHdpdGggaTM4Nmx5bnhfYW91dF92ZWMKLQlhbmQgaTM4Nmx5bnhfY29mZl92ZWMuCi0JQWRkZWQgbTY4a2x5bnhfYW91dF92ZWMgYW5kIG02OGtseW54X2NvZmZfdmVjLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlZCBpMzg2bHlueF92ZWMsIGFkZGVkCi0Je2kzODYsbTY4a31seW54X3thb3V0LGNvZmZ9X3ZlYy4KLQkqIGkzODZseW54LmM6IEFkZGVkIGNvcHkgb2YgaTM4NmNvZmYuYywgcmVuYW1lZCBiZmQgdGFyZ2V0IHRvCi0JaTM4Nmx5bnhfY29mZl92ZWMuCi0JKiBtNjhrbHlueC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQ6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCi0JYW5kIGkzODZseW54X2NvZmZfdmVjLgotCSogY29uZmlnL202OGstbHlueC5tdDogTmV3IGZpbGUuCi0JKiBob3N0cy9pMzg2bHlueC5oOiBBZGRlZCBkZWZpbml0aW9uIG9mIGNmcmVlIGFzIGZyZWUgKGZyb20gRWljaGluKS4KLQkqIGhvc3RzL202OGtseW54Lmg6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDI3IDE4OjAwOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IERlZmluZSBvZmZzZXRvZiBoZXJlLgotCSogaG9zdHMvKi5oOiBEb24ndCBkZWZpbmUgaXQgaGVyZS4KLQotTW9uIFNlcCAyNyAxOTowOToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IGZpbGVwb3MgZm9yIFNIVF9TVFJUQUIKLQlzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDE1OjQ3OjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQWRkIGNvbW1lbnQgYWJvdXQgaHB1eCB2ZXJzaW9uIDcuCi0KLUZyaSBTZXAgMjQgMTY6NTA6MjYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIHBlci10aHJlYWQgcmVnaXN0ZXIKLQlzZWN0aW9uIG5hbWVzIGZyb20gLnJlZ1hYWCB0byAucmVnL1hYWCB0byBhdm9pZCBwYXJzaW5nIGFtYmlndWl0eQotCWluIGdkYi9jb3JlbG93LmMuICBDcmVhdGUgYWxpYXMgLnJlZyBzZWN0aW9uIGZvciB0aGUgY3VycmVudGx5Ci0JcnVubmluZyB0aHJlYWQuCi0KLUZyaSBTZXAgMjQgMTM6MjI6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGJpZ19tYWdpYyBhbmQKLQlsaXR0bGVfbWFnaWMgZmllbGRzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uCi0Jb2YgYmlnX21hZ2ljIGFuZCBsaXR0bGVfbWFnaWMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2spOiBNYWtlIHN1cmUgbWFnaWMgbnVtYmVyCi0JbWF0Y2hlcyBlbmRpYW5lc3Mgb2YgYmZkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgaW5pdGlhbGl6YXRpb24gb2YgYmlnX21hZ2ljIGFuZAotCWxpdHRsZV9tYWdpYy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBNSVBTIG1hY2hpbmUgbnVtYmVyCi0JYmFzZWQgb24gbWFnaWMgbnVtYmVyLiAgU3VwcG9ydCByNDAwMCBtYWdpYyBudW1iZXJzLgotCShlY29mZl9nZXRfbWFnaWMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBlY29mZl9nZXRfbWFnaWMsIG5vdCBmaWVsZHMgaW4KLQl0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgY2FzZSBmb3IgcjYwMDAuCi0KLQlGb3IgTUlQUyBjb25maWd1cmF0aW9ucyBwdXQgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gdmVyc2lvbnMgaW4KLQl0aGUgbGlzdCBvZiB0YXJnZXRzOyB0aGUgY29kZSBpcyBnZXR0aW5nIGNvbXBpbGVkIGluIGFueWhvdy4KLQkqIGJpZ21pcHMubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0JKiBkZWNzdGF0aW9uLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9iaWdfdmVjLgotCSogbWlwc2JlbGYubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYy4KLQkqIG1pcHNsZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfYml0bWlwc192ZWMuCi0JKiByaXNjb3MubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0KLUZyaSBTZXAgMjQgMDA6NDI6MjMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBvc2YtY29yZS5jOiAgTmV3IGZpbGUgZm9yIE9TRi8xIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUyk6ICBBZGQgLURPU0ZfQ09SRS4KLQkoSERFUEZJTEVTKTogIFNldCB0byBvc2YtY29yZS5vLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgb3NmX2NvcmVfZGF0YSBtZW1iZXIuCi0JKiB0YXJnZXRzLmM6ICBJZiBPU0ZfQ09SRSBpcyBkZWZpbmVkLCBhZGQgb3NmX2NvcmVfdmVjIHRvIHRhcmdldCBsaXN0LgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogIEFkZCBvc2YtY29yZS5vLgotCShvc2YtY29yZS5vKTogIE5ldyBkZXBlbmRlbmN5LgotCi1UaHUgU2VwIDIzIDIxOjA0OjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBUT0RPOiBSZW1vdmUgbm90ZSBhYm91dCBtYWtpbmcgLS13aXRoLWJmZC10YXJnZXRzIHVzZSBjYW5vbmljYWwKLQl0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lIChhbHJlYWR5IGRvbmUpOyByZXdvcmQgaXRlbSBhYm91dAotCXNlcGFyYXRpbmcgcmVhZGluZyBhbmQgd3JpdGluZyBzdHVmZiB0byBub3QgcmVmZXIgdG8gYQotCW5vbi1leGlzdGVudCBpdGVtLgotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBY2NlcHQgTUlQU19NQUdJQ19MSVRUTEUyCi0JYW5kIE1JUFNfTUFHSUNfQklHMi4KLQotVGh1IFNlcCAyMyAxMTowNjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBPdXRwdXQgbmV3bGluZSBhZnRlciBlbmQgb2YgY29tbWVudCwgbm90Ci0JYmVmb3JlLiAgKFJlcG9ydGVkIGJ5IEpvbmF0aGFuIFN0b25lLAotCWpvbmF0aGFuQG9zY2FyLnN0YW5mb3JkLmVkdSkuCi0KLVRodSBTZXAgMjMgMTA6NDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUHV0IHdlYWsgc3ltYm9scyBpbiB0aGUKLQlhcm1hcC4KLQotCSogZWxmY29kZS5oIChmaXhfdXBfc3RydGFicyk6IFNldCBzaF9lbnRzaXplIGZvciB0aGUgLnN0YWIKLQlzZWN0aW9uLCBub3QgdGhlIC5zdGFic3RyIHNlY3Rpb24uICBTZXQgdGhlIHR5cGUgb2YgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB0byBTSFRfU1RSVEFCLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogSGFuZGxlIFNIVF9TVFJUQUIgc2VjdGlvbnMuCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0RFQlVHR0lORyk6IE5ldyBzZWN0aW9uIGZsYWcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIHNlY3Rpb24gaXMgU0hUX1BST0dCSVRTLAotCWFuZCB0aGUgbmFtZSBzdGFydHMgd2l0aCAuZGVidWcsIC5saW5lIG9yIC5zdGFiLCBzZXQKLQlTRUNfREVCVUdHSU5HLiAgSWYgU0hUX1NUUlRBQiwgY2hlY2sgZm9yIC5kZWJ1ZyBhbmQgLnN0YWIuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBlbGY2NC10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIGFuZCBTRUNfQ09ERSB0byBzZWN0aW9uX2ZsYWdzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCi1XZWQgU2VwIDIyIDE2OjM0OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIGx5bnhfY29yZV9kYXRhLgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgZmlsZXBvcyBmb3IKLQlzZWN0aW9ucyB3aXRoIFNFQ19MT0FEIHNldCwgZXZlbiBpZiBTRUNfSEFTX0NPTlRFTlRTIGlzIGNsZWFyLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBzZXQgc2NucHRyIHRvIHplcm8ganVzdAotCWJlY2F1c2Ugc2l6ZSBvZiBzZWN0aW9uIGlzIHplcm8uICBOZWVkZWQgZm9yIElyaXggNC4wLjVGLgotCi1XZWQgU2VwIDIyIDA5OjQ5OjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgaTk2MC1ib3V0LCBub3QgaTk2MC1jb2ZmIGZvciBpOTYwLSotbmluZHkqLgotCi1XZWQgU2VwIDIyIDA3OjM0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgbHlueC1jb3JlLm8uCi0JKiBiZmQtaW4yLmggKHRkYXRhKTogIEFkZCBseW54X2NvcmVfZGF0YTsKLQkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6ICBHZXQgcmlkIG9mIHN1cGVyZmx1b3VzIG5ldGJzZCBhbmQKLQlseW54b3MgZW50cmllcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBseW54LWNvcmUubyB0byBMeW54IGNvbmZpZy4KLQkqIGkzODZseW54LmM6ICBBZGQgZGVmcyBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBseW54LWNvcmUuYzogIE5ldyBmaWxlIHdpdGggTHlueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZseW54Lmg6ICBNb3ZlIGxvdHMgb2YgaG9zdCBzcGVjaWZpYyBpbmNsdWRlcyB0byBoZXJlLgotCUFkZCBkZWYgb2YgSE9TVF9MWU5YLiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlZnMuCi0KLU1vbiBTZXAgMjAgMTk6MTg6MTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE9ubHkgc2V0IFNFQ19EQVRBIGZvciBhCi0JU0hGX1BST0dCSVRTIG9yIFNIVF9TVFJUQUIgc2VjdGlvbiBpZiBTRUNfQUxMT0MgaXMgc2V0LiAgTmV2ZXIgc2V0Ci0JU0VDX0RBVEEgZm9yIGEgU0hGX05PQklUUyBzZWN0aW9uLgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOiBDaGVjayBTRUNfTE9BRCByYXRoZXIKLQl0aGFuIFNFQ19DT0RFIHwgU0VDX0RBVEEuICBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIG5sbWNvZGUuaDogQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZ25vcmUgcmVsb2NzIGZvciBzZWN0aW9ucyB0aGF0IGFyZQotCW5laXRoZXIgY29kZSBub3IgZGF0YS4gIEp1c3QgdXNlIHRoZSBzeW1ib2wgdmFsdWUgZm9yIGRlYnVnZ2luZwotCXN5bWJvbHM7IGRvbid0IG9mZnNldCBieSB0aGUgc2VjdGlvbiB2bWEuCi0KLUZyaSBTZXAgMTcgMTg6MDg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIHdoZW4KLQlwZXJmb3JtaW5nIGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBTaG93IHZhbHVlIG9mIEJTRl9XRUFLIHJhdGhlcgotCXRoYW4gb2Jzb2xldGUgQlNGX0VYUE9SVC4KLQotRnJpIFNlcCAxNyAwMjowNDozMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaG9zdHMve2FscGhhb3NmLmgsIGFtaXguaCwgYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsCi0JZGVjc3RhdGlvbi5oLCBkZWx0YTg4LmgsIGRndXguaCwgZG9zZS5oLCBnbzMyLmgsIGhhcnJpcy5oLAotCWhwMzAwLmgsIGhwMzAwYnNkLmgsIGhwcGFic2QuaCwgaHBwYWhwdXguaCwgaTM4NmFpeC5oLCBpMzg2YnNkLmgsCi0JaTM4NmxpbnV4LmgsIGkzODZseW54LmgsIGkzODZ2LmgsIGkzODZ2NC5oLCBpcml4My5oLCBpcml4NC5oLAotCW1pcHNic2QuaCwgbmNyMzAwMC5oLCByczYwMDAuaCwgcnRic2QuaCwgc29sYXJpczIuaCwgc3BhcmMtbGwuaCwKLQlzdGQtaG9zdC5oLCBzdHJhdHVzLmgsIHN1bjMuaCwgc3lzdjQuaCwgdGFob2UuaCwgdWx0cmEzLmgsCi0JdmF4dWx0LmgsIHZheHVsdDIuaCwgd2UzMmsuaH06ICBNYWtlIHN1cmUgdGhhdCAib2Zmc2V0b2YiIGlzCi0JZGVmaW5lZCBvbiBhbGwgaG9zdHMsIG5vdyB0aGF0IGFyY2hpdmUuYyB1c2VzIGl0LgotCi1UaHUgU2VwIDE2IDE4OjIwOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBDcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwKLQlzZWN0aW9ucywgbm90IGp1c3QgYWxsb2NhdGVkIHNlY3Rpb25zOyBkZWJ1Z2dpbmcgc2VjdGlvbnMgY2FuIGhhdmUKLQlyZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24sIHVzZQotCXRoZSBzZWN0aW9uIGluZGV4IGZyb20gdGhhdCByYXRoZXIgdGhhbiB0aGUgaW5wdXQgc2VjdGlvbi4KLQotVGh1IFNlcCAxNiAxMjoyMDo1MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiBSZWZsZWN0IEpvaG4ncyBjaGFuZ2VzIHRvCi0JbGliYmZkLmgsIHdoaWNoIGlzIHJlZ2VuZXJhdGVkIGZyb20gdGhpcyBmaWxlLgotCi0JKiBiZmQtaW4uaCAoc3ltdHlwZSk6IERlbGV0ZWQgdHlwZWRlZi4KLQotV2VkIFNlcCAxNSAxMTo0ODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0V4eCk6IENhc3QgeCB0byBiZmRfc2lnbmVkX3ZtYSBiZWZvcmUgZG9pbmcgdGhlCi0JeG9yIGFuZCBzdWJ0cmFjdC4gIE90aGVyd2lzZSBpdCB3aWxsIG5vdCBzaWduIGV4dGVuZCBpZiB0aGUgdHlwZQotCW9mIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gaW50LgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4pOiBHZXQgcmVnb2Zmc2V0LCBpb3B0LCBmcmVnb2Zmc2V0Ci0JYW5kIGZyYW1lb2Zmc2V0IGFzIHNpZ25lZCBudW1iZXJzLiAgRnJvbSBQZXRlciBTY2hhdWVyLgotCi1UdWUgU2VwIDE0IDE4OjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgYmZkX2VsZl9nZW5lcmljX3JlbG9jCi0Jc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jIGVudHJpZXMuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGQgU0VDX0NPREUgdG8KLQlzZWN0aW9uX2ZsYWdzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IFJlbW92ZSBkZXNjLCB0eXBlIGFuZCBvdGhlciBmaWVsZHMuCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItKi5vKTogVGhlc2UgZGVwZW5kIHVwb24gZWxmMzItdGFyZ2V0LmguCi0KLVR1ZSBTZXAgMTQgMTQ6MzQ6NDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kCi0JYXJtYXBfZGF0ZXBvcyBoZXJlIHRvby4KLQotTW9uIFNlcCAxMyAyMTowMzoxOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCi0KLQlJbXByb3ZlIHRpbWVzdGFtcCBzdXBwb3J0IGluIEJTRCBhcmNoaXZlIGZpbGVzIHRvIGF2b2lkIGxpbmtlcgotCXdhcm5pbmdzLgotCi0JKiBsaWJiZmQuaCAoc3RydWN0IGFydGRhdGEpOiAgQWRkIGFybWFwX3RpbWVzdGFtcCBhbmQgYXJtYXBfZGF0ZXBvcy4KLQkoYmZkX2ZsdXNoLCBiZmRfc3RhdCk6ICBBZGQgcHJvdG90eXBlcy4KLQkqIGxpYmJmZC5jIChiZmRfZmx1c2gpOiAgQWRkLCBkb2VzIGZmbHVzaCBvbiBhIEJGRC4KLQkoYmZkX3N0YXQpOiAgQWRkLCBkb2VzIGZzdGF0IG9uIGEgQkZELgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IEF0IGVuZCBvZiBmaWxlIHdyaXRpbmcsCi0JdmVyaWZ5IGFuZCBwb3NzaWJseSB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYXJtYXAsIGlmIGEgQlNECi0JYXJjaGl2ZS4gIEZJWE1FISAgS2x1ZGdlIHJlY29nbml6ZXMgQlNEIGFyY2hpdmUsIHJhdGhlciB0aGFuCi0JdmVjdG9yaW5nIHByb3Blcmx5LiAgU2hvdWxkIGFkZCB0byB4dmVjLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6ICBNb3ZlIHByb3RvdHlwZSB0byB0b3AsIGF2b2lkIFBST1RPLgotCShic2Rfd3JpdGVfYXJtYXApOiBTYXZlIHRpbWVzdGFtcCBhbmQgZmlsZSBsb2NhdGlvbiB0aGVyZW9mLCB3aGVuCi0Jd3JpdGluZyB0aGUgYXJtYXAgaW4gYSBCU0QgZmlsZS4KLQkoYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiAgTmV3IGZ1bmN0aW9uIHRvIGNoZWNrIGFuZAotCXJld3JpdGUgdGhlIHRpbWVzdGFtcC4KLQotCSogaG9zdHMvc3RkLWhvc3QuaCAob2Zmc2V0b2YpOiAgRGVmaW5lLCBpZiBub3QgYWxyZWFkeSwgZm9yIGFyY2hpdmUuYy4KLQotU2F0IFNlcCAxMSAxODoxMzo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnNjby5oOiBEZWZpbmUgYSBidW5jaCBvZiBzdHVmZiBmb3IgY29yZSBmaWxlcy4KLQkqIHNjby1jb3JlLmM6IFJlbW92ZSwgcmVwbGFjZSBieSB0cmFkLWNvcmUuYy4KLQkqIHRyYWQtY29yZS5jOiBJZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIgaXMgZGVmaW5lZCwgdXNlIGl0LgotCSogY29uZmlnL2kzODZzY28ubWg6IFVzZSB0cmFkLWNvcmUgbm90IHNjby1jb3JlLgotCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogUmVtb3ZlLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpMzg2c2NvIGZvciBpc2MuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQ6IFJlbW92ZSwgaWRlbnRpY2FsIHRvIGkzODYtY29mZi5tdC4KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpMzg2LWNvZmYgbm90IGkzODYtc2NvLgotCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgaVszNF04Ni0qLXNvbGFyaXMyKiBzcGVjaWZpY2FsbHkgcmF0aGVyCi0JdGhhbiB1c2luZyAqLSotc29sYXJpczIqIChpNDg2LXVua25vd24tc29sYXJpczIgaXMgaTM4Ni1lbGYsIG5vdAotCWk0ODYtZWxmIHdoaWNoIGRvZXNuJ3QgZXhpc3QpLgotCi1GcmkgU2VwIDEwIDEyOjU2OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIEFMUEhBRUNPRkYsIGZvcmNlCi0JcGFkZGluZyBmaWVsZCB0byB6ZXJvLgotCi0JKiBjb25maWcuYmZkIChpWzM0XTg2LSotbmV0YnNkKik6IE5ldyB0YXJnZXQ7IHVzZSBpMzg2LW5ldGJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGJvZ3VzIG5ldGJzZDM4NiBoYW5kbGluZy4KLQotCSogY29mZi1taXBzLmM6IERvbid0IHdhcm4gYWJvdXQgb3ZlcmZsb3cgZm9yIE1JUFNfUl9KTVBBRERSIHJlbG9jLgotCUNvcnJlY3Qgb3ZlcmZsb3cgZGV0ZWN0aW9uIHJlcXVpcmVzIG1hdGNoaW5nIHRoZSB1cHBlciBmb3VyIGJpdHMKLQlvZiB0aGUgZGVzdGluYXRpb24gYWdhaW5zdCB0aGUgUEMuCi0KLVRodSBTZXAgIDkgMTY6NTc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgNjQtYml0IHN0dWZmIHdvcmsgd2l0aCAiLS13aXRoLXRhcmdldHM9YWxsIi4KLQotVHVlIFNlcCAgNyAxNDoxNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIHN3YXBwaW5nIHJvdXRpbmVzIGRlY2xhcmF0aW9ucy4KLQkqIGJmZC1pbi5oOiBBZGRlZCBzd2FwcGluZyByb3V0aW5lIGRlY2xhcmF0aW9ucywgYW5kIHJlbmFtZWQgdGhlbQotCWZyb20gX2RvXyogdG8gYmZkXyouCi0JKiBsaWJiZmQuYzogUmVuYW1lZCBzd2FwcGluZyByb3V0aW5lcyBmcm9tIF9kb18qIHRvIF9iZmRfKi4KLQkqIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gU2VwICA2IDE1OjI4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBTZXQgcGNyZWxfb2Zmc2V0IHRvIHRydWUgZm9yCi0JUl8zODZfUEMzMi4KLQotRnJpIFNlcCAgMyAxMzowNjoxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVvcmdhbml6ZWQgc2V0dGluZyBvZiBtYWtlZmlsZSB2YXJpYWJsZXMgc28KLQk2NC1iaXQgc3R1ZmYgd29ya3MgYWdhaW4uCi0KLQkqIGxpYmJmZC1pbi5oIChfZG9fZ2V0KiwgX2RvX3B1dCopOiBSZW5hbWVkIHZpYSBtYWNyb3MgdG8gY2xlYW4gdXAKLQluYW1lc3BhY2UuCi0KLQkqIGxpYmVsZi5oIChlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBEZWxldGVkCi0JIm5hdGl2ZV9lbGZfc3ltIiBmaWVsZCwgbWVyZ2VkIHRvIG1ha2UgbmV3IHR5cGUgImVsZl9zeW1ib2xfdHlwZSIuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogRmllbGQgc3ltYm9scyBpcyBub3cgZWxmX3N5bWJvbF90eXBlKi4KLQlEZWxldGVkIGZpZWxkIHJhd19zeW1zLgotCShvYmpfc3ltYm9scyk6IFJlbW92ZSBjYXN0LgotCShvYmpfcmF3X3N5bXMpOiBEZWxldGVkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IHJhd19zeW1zIG9yCi0JbmF0aXZlX2VsZl9zeW0gZmllbGRzLgotCSogZWxmMzItaHBwYS5jOiBDaGFuZ2VkIHVzZXMgb2YgZWxmMzJfc3ltYm9sX3R5cGUgdG8KLQllbGZfc3ltYm9sX3R5cGUuCi0KLQlGcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXc6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZS5nLiwgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QKLQlldmVuIGJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGUgc3ltZXh0biBzZWN0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFueSBmdW5jdGlvbiwgcmVnYXJkbGVzcwotCW9mIHNjb3BlIGNhbiBoYXZlIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1Yi4KLQotCSogZWxmMzItaHBwYS5jOiAoRWxmMzJfaHBwYV9TdHViX2Rlc2NyaXB0aW9uKTogIFJlbmFtZSB0aGlzCi0Jc3RydWN0dXJlIGFuZCB0eXBlIHRvIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbi4gIFRoaXMgbWFrZXMKLQlpdCBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ25leHQnIGZpZWxkIHRvIGFsbG93Ci0JbGlua2luZyBvZiBzdHViIGRlc2NyaXB0aW9uIHN0cnVjdHVyZXMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ3N0dWJfbGlzdFAnIGZpZWxkIHRvCi0Ja2VlcCB0cmFjayBvZiBpbmRpdmlkdWFsIHN0dWJzLgotCShFbGYzMl9ocHBhX1N0dWJfbGlzdCwgRWxmMzJfaHBwYV9TdHViX2xpc3Rfc3RydWN0KTogIFJlbW92ZWQuCi0JQ29tYmluZWQgd2l0aCB0aGUgZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uIHN0cnVjdHVyZS4KLQkoZWxmMzJfaHBwYV9zdHViX25hbWVfbGlzdCk6ICBOZXcgdHlwZSB0byBrZWVwIHRyYWNrIG9mCi0JaW5kaXZpZHVhbCBzdHVicy4KLQkoYWRkX3N0dWIpOiAgUmVtb3ZlZC4KLQkoYWRkX3N0dWJfYnlfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQWxsb3cgcmV1c2luZyBzdHVicyB0aGF0Ci0JYWxyZWFkeSBleGlzdC4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGVsZjMyLWhwcGEuYzogKHJldHZhbF9taXNtYXRjaGVzKTogIFRoZSBkaXJlY3Rpb24gb2YgYXJndW1lbnQKLQlyZWxvY2F0aW9uIHdhcyByZXZlcnNlZC4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBSZXR1cm4gYWRkcmVzcyB3YXMgbm90IGJlaW5nCi0JcmVzdG9yZWQuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IEFkZCBhcmd1bWVudCBjb250YWluaW5nIGNhbGxlcgotCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBzbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIHRoZSBjaGVjawotCWZvciBwbGFiZWwgc3R1YnMuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBQYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBBZGQgY2hlY2sgZm9yIHBsYWJlbCBzdHVicyBhbmQKLQlwYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCi1UaHUgU2VwICAyIDAwOjU5OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGhwcGFfZmllbGRfYWRqdXN0KTogUmVtb3ZlIHVudXNlZCBgaW5pdF92YWx1ZScgdmFyaWFibGUuCi0KLQkqIGhvc3RzL2RlbHRhODh2NC5oOiBOZXcgZm9yIFNWUjQuCi0JKiBjb25maWd1cmUuaG9zdHM6IFVzZSBpdC4KLQotV2VkIFNlcCAgMSAxNDoyMzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oLCBuZXRic2QzODYuYzogQ2hhbmdlIE1fSTM4NiB0byBNXzM4Nl9ORVRCU0QuICBNX0kzODYKLQlpcyBhbiBTQ08gcHJlLWRlZmluZS4KLQotVHVlIEF1ZyAzMSAxMjo1MDoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHRoZXJlIGFyZSBleHRlcm5hbAotCXJlZmVyZW5jZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX3tpbixvdXR9KTogVGhlIGNvcHlyaWdodCBsZW5ndGggaXMKLQlvbmx5IG9uZSBieXRlLgotCShubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEluY2x1ZGUgZGVidWdnaW5nIHN5bWJvbHMgaW4gc3ltYm9sCi0JY291bnQuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIHN5bWxlbmd0aCB1bnNpZ25lZC4gIFJlYWQgZGVidWdnaW5nCi0Jc3ltYm9scyBhcyBCRkQgbG9jYWwgc3ltYm9scy4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB3cml0aW5nIG91dCBleHBvcnRlZAotCXN5bWJvbHMgbW9yZSB0aGFuIG9uY2U7IHRoZXkgbm93IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlIG1vcmUKLQl0aGFuIG9uY2UgKHdpdGggYW5kIHdpdGhvdXQgYSBwcmVmaXgpIGlmIG5lY2Vzc2FyeS4gIFNldCBvZmZzZXQKLQl2YWx1ZXMgdG8gYmUgbm9uLXplcm8gYXMgTkxNTElOSyBkb2VzLgotCi1UdWUgQXVnIDMxIDEyOjA3OjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlc3RvcmUgI3VuZGVmcyBvZiBlX2ZzZWwgYW5kIG90aGVyIGVfKiBzeW1ib2xzLgotCi1GcmkgQXVnIDI3IDE2OjQzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTW92ZSBwb3NpdGlvbiBvZiB1c2VyX3NldF92bWEsIGFuZAotCWRvY3VtZW50IGl0LgotCShTRUNfQkFMSUdOKTogRGlzYWJsZSBmb3Igbm93LiAgSSBkb24ndCB0aGluayBpdCdzIGN1cnJlbnRseSB1c2VkLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogTm93IHN0YXRpYy4KLQkoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFAsIGdsb2JhbF92YWx1ZSwgR09UX3ZhbHVlLAotCWdsb2JhbF9zeW1ib2wsIGdsb2JhbF9zeW1fZGVmaW5lZCwgc3ltZXh0bl9jb250ZW50cywKLQlzeW1leHRuX2NvbnRlbnRzX3JlYWxfc2l6ZSwgZWxmX2hwcGFfc3R1Yl9yb290UCwKLQllbGYzMl9ocHBhX3N5bWV4dG5fbWFwLCBlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX3NpemUpOiBSZWx5IG9uCi0JZGVmYXVsdCBpbml0aWFsaXphdGlvbi4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBNYWNybyAiVU5ERUZJTkVEIiBkb2Vzbid0IG5lZWQgYQotCXRyYWlsaW5nIHNlbWljb2xvbi4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogSW50cm9kdWNlIHRlbXBvcmFyaWVzIHRvIG1ha2UKLQljb2RlIG1vcmUgcmVhZGFibGUgaW4gODAgY29sdW1ucy4KLQotCSogbGliaHBwYS5oIChhbGwgZnVuY3Rpb25zKTogTm93IGlubGluZSB1bmRlciBHTlUgQy4KLQotCU1vcmUgcGF0Y2hlcyBmcm9tIEplZmYgTGF3OgotCi0JKiBlbGYzMi1ocHBhLmMgKEFSX1dBUk4pOiBHaXZlIGFyZ3VtZW50IHdoaWNoIGNhdXNlZCB0aGUKLQlpbnZhbGlkIGFyZ3VtZW50IHJlbG9jYXRpb24uCi0JKEFSX1VOSU1QKTogRGVsZXRlIHVudXNlZCBtYWNyby4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF90YWJsZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3Npbmc6IExpa2V3aXNlLgotCi0JKiBzb20uYzogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGhwcGEuYwotCi0JKiBzb20uaDogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGxpYmhwcGEuaAotCi0JKiBocHBhLmM6IERlbGV0ZWQuCi0KLQkqIGxpYmhwcGEuaDogRGVsZXRlIFNPTSBzcGVjaWZpYyBjb2RlLiAgQWRkIGdlbmVyaWMgUEEKLQljb2RlIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgYm90aCBTT00gYW5kIEVMRiBiYWNrZW5kcy4KLQotCSogTWFrZWZpbGUuaW46IFJlcGxhY2UgaHBwYS5jIHdpdGggc29tLmMuICBlbGYzMi1ocHBhLm8KLQlkZXBlbmRzIG9uIGxpYmhwcGEuaCBub3cuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYV92ZWMpOiBOZWVkcyBzb20ubyBtb2R1bGUgaW5zdGVhZCBvZgotCWhwcGEuby4KLQotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4gIERvIG5vdCBkZWZpbmUKLQlCWVRFU19JTl9XT1JELgotCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IERlbGV0ZQotCW5vdyBsaXZlcyBpbiBsaWJocHBhLmguCi0JKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQpOiBMaWtld2lzZS4KLQotCSogaG9zdHMvaHBwYWJzZC5oOiBJbmNsdWRlIDxzdGRsaWIuaD4gYW5kIDx1bmlzdGQuaD4uICBEbyBub3QKLQlkZWZpbmUgbWFsbG9jIG9yIGZyZWUuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiBEb24ndCBkZWZpbmUKLQlTRUxFQ1RfVkVDUy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGVzLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IExpa2V3aXNlLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogTGlrZXdpc2UuCi0JKGVsZl9yZWxvY19tYXApOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgotCShlbGZfaHBwYV9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9tYXhfc2l6ZSk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2dldF9zeW1fZXh0bik6IEFib3J0IGlmIHR5cGUgaXMgYm9ndXMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBBZGQgcHJvY2Vzc2luZwotCW9mIHRoZSAuaHBwYV91bndpbmQgc2VjdGlvbi4KLQotV2VkIEF1ZyAyNSAxNjoxMzo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IHJlY29nbml6ZSBtODgxMTAuCi0KLVR1ZSBBdWcgMjQgMTY6MzI6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEFkZCBkZXRlY3Rpb24gb2YKLQlTSFRfTk9URSBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKToKLQlOZXcgZnVuY3Rpb25zIGZvciBzdXBwb3J0IG9mIGxvbmcgYnJhbmNoIHN0dWJzLgotCShocHBhX2VsZl9zdHViX2NoZWNrLGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6ICBBZGQKLQljaGVjayBmb3IgbG9uZyBicmFuY2ggc3R1YnMuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnMpOiAgVW51c2VkIGZ1bmN0aW9uLiAgUmVtb3ZlZC4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJbXBsZW1lbnQgYSBQQS9FTEYtc3BlY2lmaWMKLQl2ZXJzaW9uIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBPbmx5IG91dHB1dCBkZWJ1Z2dpbmcgZGlhZ25vc3RpY3MKLQl3aGVuIEJGRCBpcyBjb25maWd1cmVkIGZvciBkZWJ1Z2dpbmcuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfZ2V0X3N5bWV4dG5fY2hhaW4pOiAgTmV3IGZ1bmN0aW9uCi0JdG8gcmV0dXJuIGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgaGF2ZSBub24temVybyBhcmd1bWVudAotCXJlbG9jYXRpb24gYml0cy4KLQkoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBNYWtlIHN1cmUgc3R1YiBnZW5lcmF0aW9uIGlzIGRvbmUgb25seQotCW9uY2UuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiAgTmV3IGZ1bmN0aW9uIGZvcgotCWdlbmVyYXRpb24gcmVsb2NhdGlvbiBlbnRyaWVzIHdpdGhpbiBhIHN0dWIuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQ29ycmVjdGlvbnMgdG8gYXJndW1lbnQKLQlyZWxvY2F0aW9uIHN0dWJzLgotCi0JKiBlbGYzMi1ocHBhLmM6IE5ldyAjZGVmaW5lJ3MgZm9yIGFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldwotCWFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBOZXcgbWFjcm8uCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgdGhlIFBGX1ggYml0IGZvciBkYXRhCi0Jc2VnbWVudHMuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogQWRkCi0JUl9IUFBBX1NUVUJfQ0FMTF8xNyBmb3Igc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCShocHBhX2VsZl9yZWxvYyk6IEFkZCBzdXBwb3J0IG9mIFJfSFBQQV9TVFVCX0NBTExfMTcKLQlyZWxvY2F0aW9uIHR5cGUuCi0KLQkqIGVsZjMyLWhwcGEuaDogKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IEFkZAotCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGxpbmtlcgotCXN0dWIgZ2VuZXJhdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBUaGUgb2Zmc2V0cyBpbiBhbgotCXVud2luZCBkZXNjcmlwdG9yIHdlcmUgaW5jb3JyZWN0LgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpOiAgTmV3Ci0JZnVuY3Rpb24gaW4gcGxhY2Ugb2YgZ2xvYmFsX3N5bSBmaWVsZCBpbiBlbGZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywKLQllbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb25zIHRvCi0JcHJvdmlkZSBzdXBwb3J0IG9mIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgYW5kIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBzdHVicy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiAgUmVtb3ZlIGNhbGwgdG8gYWJvcnQoKS4KLQotCSogZWxmMzItdGFyZ2V0Lmg6ICBTdXBwb3J0IGZvciBzcGVjaWFsIHByb2Nlc3NpbmcgYnkgdGhlIGJhY2tlbmQuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogIEFkZGVkIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgYW5kCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZpZWxkcy4KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEFkZCBhIGNoZWNrIGZvcgotCXByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6ICBBZGQgYSBjaGVjayBmb3IgcHJvY2Vzc29yLXNwZWNpZmljCi0Jc2VjdGlvbiB0eXBlcy4KLQkoYmZkX2VsZjMyX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBBZGQgYSBjaGVjayB0byBzZWUgaWYKLQl0aGVyZSBpcyBhbnkgZmluYWwgc2VjdGlvbiBwcm9jZXNzaW5nIHRvIGJlIGRvbmUgYnkgdGhlCi0JYmFja2VuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBBZGQgYSBjaGVjayBmb3IKLQlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBSZW1vdmUgcmVmZXJlbmNlIHRvIGdsb2JhbF9zeW0gaW4gdGhlCi0JZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBjYWxsIHRvCi0JZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcuCi0JKiBsaWJlbGYuaDogUmVtb3ZlIGdsb2JhbF9zeW0gZmllbGQgaW4gdGhlIGVsZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBzZXJpZXMgb2YgYmFja2VuZC1zcGVjaWZpYwotCWZ1bmN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyk6IFRoZSBmb3JtYWwgYXJndW1lbnQKLQlzdHViX3N5bSBzaG91bGQgYmUgY2FsbGVkIHRhcmdldF9zeW0uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmVmZXIgdG8gdGhlIHN0dWIgYmZkIChhYmZkKQotCXJhdGhlciB0aGFuIHRoZSBvdXRwdXQgYmZkIChvdXRwdXRfYmZkKS4KLQkoaHBwYV9lbGZfcmVsb2MpOiBHZXQgcmlkIG9mIHJlZmVyZW5jZXMgdG8gdGhlIGdsb2JhbF9zeW0gZmllbGQgaW4KLQl0aGUgZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayB0aGUgY29ycmVjdCBjb25kaXRpb24gZm9yCi0JLmJzcy4gIEFsc28sIGRldGVjdCB0aGUgZXhpc3RlbmNlIG9mIGEgLm5vdGUgc2VjdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogcl9mb3JtYXQgYXJndW1lbnQgc2hvdWxkCi0JaGF2ZSBiZWVuIHJfZmllbGQuCi0KLQkqIGhvc3RzL2hwcGFic2QuaCAoSE9TVF9NQUNISU5FX0FSQ0gpOiBSZWZlcmVuY2UgdG8gYmZkX2FyY2hfbTY4awotCXNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBiZmRfYXJjaF9ocHBhLgotCi0JKiBocHBhLmMgKGhwcGFfdmVjKTogUmVwbGFjZSBiZmRfZmFsc2Ugd2l0aCBfYmZkX2R1bW15X3RhcmdldCBpbgotCXRoZSBiZmRfY2hlY2tfZm9ybWF0IHN0cnVjdHVyZSB0byBhdm9pZCBhIHR5cGUgbWlzbWF0Y2guCi0KLU1vbiBBdWcgMjMgMTk5MyAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCQkgYW5kIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JQWRkIE5ldEJTRCBzdXBwb3J0OgotCSogbmV0YnNkMzg2LmM6IE5ldyBmaWxlLgotCSogYW91dHguaDogTWFrZSBzeW1faXNfZGVidWdnZXJfaW5mbyB0cnVlIGZvciBOX0ZOLgotCSogTWFrZWZpbGUuaW4sIGFvdXQtdGFyZ2V0LmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUuaW4sCi0JbGliYW91dC5oLCB0YXJnZXRzLmM6IE90aGVyIGNoYW5nZXMuCi0KLUZyaSBBdWcgMjAgMTc6MDQ6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkOiBVc2UgaXQgZm9yIG04OCotKi1zeXN2NCouCi0KLUZyaSBBdWcgMjAgMTU6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9idWlsZF9waGRycyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCShiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBEaXR0by4KLQkod3JpdGVfcmVsb2NzKTogRG9uJ3QgY2hhbmdlIHNlY3Rpb24gY29udGVudHMgZm9yIGFkZGVuZC4KLQkoZWxmX2xvY2F0ZV9zaCk6IFJldHVybiB0eXBlIGlzIG5vdyBhbHdheXMgZWxmX2ludGVybmFsX3NoZHIsCi0Jc2luY2UgdGhlIG90aGVyIHR5cGVzIHdlcmUgcmVhbGx5IGFsaWFzZXMgZm9yIHRoaXMgdHlwZSBhbnl3YXlzLgotCURvbid0IGNvbXBpbGUgdGhpcyBmdW5jdGlvbiwgc2luY2UgaXQgaXMgc3RhdGljIGFuZCBkb2Vzbid0IGFwcGVhcgotCXRvIGJlIHVzZWQgaW4gdGhpcyBmaWxlLgotCShzeW1faXNfZ2xvYmFsKTogUmV0dXJuIG5vbi16ZXJvIGZvciB3ZWFrIHN5bWJvbHMuICBBYm9ydCBpZgotCXNlY3Rpb24gcG9pbnRlciBpcyBudWxsLgotCShzd2FwX291dF9zeW1zKTogUmVvcmRlciB0ZXN0cyBzbyBmdW5jdGlvbiBzeW1ib2xzIGNhbiBiZSB3ZWFrLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIEJTRl9FWFBPUlQuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBNYWtlIFJFTE9DX1BST0NFU1NJTkcgc2VjdGlvbiBzbWFsbGVyIGJ5Ci0JZXh0cmFjdGluZyBvdXQgc29tZSBjb21tb24gY29kZS4gIEFib3J0IGlmIEJGRCBzZWN0aW9uIHN5bWJvbCBoYXMKLQludWxsIG5hbWUuCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IFRyYW5zbGF0ZSBFTEYgc2VjdGlvbiBzeW1ib2xzIGludG8gQkZECi0Jc2VjdGlvbiBzeW1ib2xzLiAgRG9uJ3QgcmVhZCBzZWN0aW9uIGNvbnRlbnRzIHRvIGZpbGwgaW4gYWRkZW5kCi0JZmllbGQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWxsIHBhcnRpYWxfaW5wbGFjZSBmaWVsZHMKLQlzaG91bGQgYmUgInRydWUiLgotCi0JKiBNZXJnZWQgZnJvbSBPU0Y6Ci0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IEVsZl9TeW1fRXh0cmEpOiBOZXcgc3RydWN0dXJlIHRvIGNvbnRhaW4gRUxGCi0Jc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgUHV0IGluIGVsZl9zeW1fbnVtLCB3aGljaAotCWdpdmVzIHRoZSBleHRlcm5hbCBzeW1ib2wgbnVtYmVyIGluIHRoZSBlbGYgb2JqZWN0IGZpbGUsIHNpbmNlCi0JbG9jYWwgc3ltYm9scyBtdXN0IGNvbWUgYmVmb3JlIGdsb2JhbCBzeW1ib2xzLgotCShlbGZfc3ltX2V4dHJhKTogTmV3IG1hY3JvLgotCShlbGZfc3ltdGFiX21hcCk6IERlbGV0ZSwgaW4gZmF2b3Igb2YgdXNpbmcgRWxmX1N5bV9FeHRyYS4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogVXNlIEVsZl9TeW1fRXh0cmEgdG8gbWFwIGludGVybmFsCi0Jc3ltYm9sIG51bWJlciB0byBleHRlcm5hbCBudW1iZXIuICBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUKLQlFbGZfU3ltX0V4dHJhIGZpZWxkIGZvciB0aGUgc3ltYm9sIGluIHRoZSB1ZGF0YSBmaWVsZC4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBvdXQgc3ltYm9scy4KLQotCVN1biBKdW4gMjAgMTY6MzA6MTEgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCB0byBjb3VudCB0aGUgc2l6ZSBvZiB0aGUKLQlhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEJ1bXAgdGhlIG1heCBpbmRleCBvZiB0aGUgc2VjdGlvbiBzeW1ib2xzIHNvCi0JdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgbWVtb3J5LiAgU3RvcmUgdGhlIG1heCBpbmRleCBpbnRvIHRoZQotCWVsZl9vYmpfdGRhdGEgZmllbGQuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycwotCXRvIHRoZSBzZWN0aW9uIHN5bWJvbHMgd2UgY3JlYXRlZC4gIFJlbW92ZSB1bnVzZWQgZmllbGQKLQlpbnRlcm5hbF9zeW1zLgotCShlbGZfbWFwX3N5bWJvbHMpOiBGaWxsIGluIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNlY3Rpb24gc3ltYm9scy4KLQlPbmx5IGNyZWF0ZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgaGF2ZSBTRUNfQUxMT0Mgc2V0LAotCWFuZCBoYXZlIG5vbi16ZXJvIHNpemUuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdWRhdGEgaXMgTlVMTCwgYW5kIHRoaXMgaXMgYQotCXNlY3Rpb24gc3ltYm9sLCBsb29rIHVwIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0IG9mIHNlY3Rpb24KLQlzeW1ib2xzLCBhbmQgc2V0IHRoZSB1ZGF0YSBwb2ludGVyIGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIGlmCi0JdWRhdGEgaXMgc3RpbGwgTlVMTCwgZmFpbCBhbiBhc3NlcnRpb24sIGFuZCB1c2UgMCwgaW5zdGVhZCBvZgotCWRyb3BwaW5nIGNvcmUuCi0KLUZyaSBBdWcgMjAgMTI6MTg6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzLSotZWxmbCosIG1pcHMtKi1lbGYqKTogTmV3IHRhcmdldHMsIHVzaW5nCi0JbWlwc2xlbGYgYW5kIG1pcHNiZWxmIHJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZy9taXBzbGVsZi5tdCwgY29uZmlnL21pcHNiZWxmLm10OiBOZXcgZmlsZXMuCi0JKiBlbGYzMi1taXBzLmM6IEFkZGVkIHNvbWUgcmVsb2MgaW5mb3JtYXRpb24uCi0JKiBjb25maWd1cmUuaW46IEZpeGVkIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVjb2ZmLmMgKEVDT0ZGX0xPTkdfU0laRSk6IFJlbW92ZWQuICBKdXN0IHVzZSBjb25zdGFudHMuCi0KLVRodSBBdWcgMTkgMDk6NDU6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMsIEFMTF9NQUNISU5FUywgQkZEMzJfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTLAotCU9QVElPTkFMX0JBQ0tFTkRTKTogQWxwaGFiZXRpemUgZW50cmllcyBhbmQgYWRkIGEgZmV3IG1pc3Npbmcgb25lcy4KLQkqIGFyY2h1cmVzLmM6IEFscGhhYmV0aXplIGRlY2xzLgotCi0JKiBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogQWRkIG1pc3NpbmcgdmVjdG9ycyB0byB0aGUgdGFibGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKSBbIVNFTEVDVF9WRUNTXTogQWRkIERFRkFVTFRfVkVDVE9SLgotCVJlbW92ZSBocDMwMGJzZF92ZWMgZHVlIHRvIGNsYXNoIHdpdGggc3Vub3NfYmlnX3ZlYy4KLQotVHVlIEF1ZyAxNyAxODoxMjozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnttYWNoMyxvc2YxbWt9Lmg6IE5ldyBmaWxlcywgZm9yIE1hY2ggaG9zdGluZy4KLQkqIGhvc3RzL2kzODZtYWNoLmg6IHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGkzODZvc2YxbWsuaC4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubXQsIGkzODZtYWNoMy5jOiBOZXcgZmlsZXMsIGZvciBNYWNoIGEub3V0IGZvcm1hdC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oOiBJbmNsdWRlIDxzeXMvcGFyYW0uaD4gbm90IDxtYWNoaW5lL3BhcmFtLmg+LgotCi1UdWUgQXVnIDE3IDE1OjE5OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWYgc2VjdGlvbidzIG91dHB1dF9zZWN0aW9uIGlzCi0Jbm90IHlldCBzZXQsIHBvaW50IHRvIGl0c2VsZi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpcwotCWNhbGxlZCBvbiB0aGUgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZS4KLQotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MsIFJUWVBFMkhPV1RPKTogU2V0IGhvd3RvIGZpZWxkIHRvIGEKLQlkdW1teSB2YWx1ZSwgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBOVUxMLgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKTogU2V0IGJmZF9lcnJvciBvbgotCWZhaWx1cmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLgotCi1UdWUgQXVnIDE3IDA5OjQyOjE2IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAoY3B1KTogRXh0cmFjdCBmcm9tIGNhbm9uaWNhbCBuYW1lIHdpdGggc2VkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGl0LgotCi1TdW4gQXVnIDE1IDIwOjQ1OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIHtCWVRFLFdPUkQsTE9OR31fU0laRTsgdGhleSBhcmUgcG9pbnRsZXNzIGFuZAotCUJZVEVfU0laRSBjb25mbGljdHMgd2l0aCBhIE1hY2ggaGVhZGVyLgotCSogZWNvZmYuYzogQ2hhbmdlIExPTkdfU0laRSB0byBFQ09GRl9MT05HX1NJWkUgYW5kIGRlZmluZSBpdC4KLQotCSogY29uZmlndXJlLmhvc3Q6IE1ha2Ugc3VyZSBhbGwgT1MgZmllbGRzIGVuZCBpbiAqLgotCi1GcmkgQXVnIDEzIDE2OjMzOjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBVc2UgYmZkX2Fic19zZWN0aW9uIGZvcgotCVJFTE9DX1NFQ1RJT05fTk9ORSBhbmQgUkVMT0NfU0VDVElPTl9BQlMuICBJZiBhIHJlbG9jIHNlY3Rpb24KLQlkb2Vzbid0IGV4aXN0LCBkb24ndCB0cnkgdG8gY3JlYXRlIGl0LgotCi0JKiBubG1jb2RlLmggKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBwcm9jZWR1cmUgb2Zmc2V0cyBhcmUKLQlmcm9tIHN0YXJ0IG9mIGNvZGUgc2VnbWVudCwgbm90IHN0YXJ0IG9mIGZpbGUuCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQgKERFRkFVTFRfVkVDVE9SKTogSXQncyBubG0zMl9pMzg2X3ZlYywgbm90Ci0JYmZkX25sbTMyX2kzODZfdmVjLgotCSogY29uZmlndXJlLmluIChTRUxFQ1RfVkVDUyBzd2l0Y2gpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAxMiAxMDozMjo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0KTogSWYgdGhlIHRhcmdldCBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0JdGFyZ2V0LCBzZXQgbWF0Y2hfY291bnQgdG8gMSwgdG8gaWdub3JlIGFueSBwcmV2aW91cyBtYXRjaGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3JlYy5vLCBhZGQgcmVsb2MxNi5vLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCByZWxvYzE2Lm8gd2hlbiB3ZSBhZGQKLQljb2ZmLWg4MzAwLm8sIGNvZmYtaDg1MDAubywgY29mZi1zaC5vLCBjb2ZmLXo4ay5vLgotCU1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSByZWxvYzE2Lm8uCi0KLQkqIGNvbmZpZy91NjhrLWNvZmYubXQ6IEZpeCB0eXBvLCBERUZBVUxUX1RBUkdFVCBmb3IKLQlERUZBVUxUX1ZFQ1RPUi4KLQotCSogY29uZmlnL2g4MzAwLWNvZmYubXQsIGg4NTAwLWNvZmYubXQsIHNoLWNvZmYubXQsIHN0MjAwMC5tdCwKLQl6OGstY29mZi5tdCAoREVGQVVMVF9WRUNUT1IpOiBEZWZpbmUuICBEb24ndCBleHBsaWNpdGx5IGFkZAotCVMtcmVjb3JkcyB2aWEgU0VMRUNUX1ZFQ1MuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvciksIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cwotCXN1cHBvcnQgUy1yZWNvcmRzLCBmb3IgY29udmVuaWVuY2UuCi0KLVRodSBBdWcgMTIgMDg6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlLCBhbHBoYV9maW5pc2hfcmVsb2MsCi0JYWxwaGFfZWNvZmZfc3dhcF9yZWxvY197aW4sb3V0fSwgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKToKLQlSZWFkIGFuZCB3cml0ZSBBbHBoYSByZWxvY3MuICBDYW4ndCBwcm9jZXNzIHRoZW0geWV0LgotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZWNvZ25pemUgbmV3IHJlbG9jIHNlY3Rpb25zLgotCUlmIHRoZSBzZWN0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX3tpbixvdXR9KTogSGFuZGxlIG5ldyBmaWVsZHMgZGVmaW5lZAotCW9uIHRoZSBBbHBoYS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgY29uc3RydWN0b3JfcmVsb2MgYW5kCi0JZmluaXNoX3JlbG9jIGZpZWxkcy4KLQkqIGVjb2ZmLmM6IE1vdmUgTUlQUyByZWxvYyBzdXBwb3J0IGZyb20gaGVyZS4uLgotCSogY29mZi1taXBzLmM6IHRvIGhlcmUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBHZXQgY29uc3RydWN0b3IgcmVsb2MgaG93dG8KLQlmcm9tIGJhY2tlbmQuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIHN0dWZmLiAgQ2FsbAotCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgYXNzZXJ0aW9ucy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2ZpbmlzaF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBGaWxsIGluIG5ldyBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBOVUxMIGZvciBuZXcKLQlmaWVsZHMuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGV4dGVybiBmb3IgZWNvZmZhbHBoYV9saXR0bGVfdmVjLgotCi0JKiBiZmQuYyAoX2JmZF9ob3N0X2JpZ19lbmRpYW4pOiBSZW1vdmVkLgotCSogYmZkLWluLmggKEhPU1RfQllURV9PUkRFUl9CSUdfUCwgYmZkX2hlYWRlcl90d2lkZGxlX3JlcXVpcmVkKToKLQlSZW1vdmVkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEF1ZyAxMSAxMjoxMToyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LCBhbmQgdXNlIHN0YW5kYXJkIHRhcmdldCBuYW1lcyBmb3IKLQktLXdpdGgtdGFyZ2V0cywgcmVwbGFjaW5nIC0td2l0aC1iZmQtdGFyZ2V0cy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IEFkZCBiZmRfc2hfYXJjaC4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGNvZmYtbTY4ay5vIGZvciBtNjhrY29mZnVuX3ZlYy4KLQlJbmNsdWRlIG5sbTMyLm8gYW5kIG5sbS5vIGZvciBiZmRfbmxtMzJfaTM4Nl92ZWMuCi0JRml4IGVycm9yIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIG9hc3lzLmM6IE1ha2UgYmZkX2Vycm9yX3ZlY3RvciBleHRlcm4uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBzdGFiLXN5bXMubyBmb3IgYS5vdXQvYi5vdXQgdGFyZ2V0cwotCWFuZCBocDMwMHtic2QsaHB1eH0uCi0KLVdlZCBBdWcgMTEgMDY6NDA6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgdGhlIC5ic3MKLQlzZWN0aW9uIGJlZm9yZSBzZXR0aW5nIG91dHB1dF9oYXNfYmVndW4uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSBhcmd1bWVudCBuYW1lcyBmcm9tCi0JbWFuZ2xlX3JlbG9jc19mdW5jIHByb3RvdHlwZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBzaGFkb3dpbmcgbG9jYWwgdmFyaWFibGUuCi0JRG9uJ3Qgd3JpdGUgb3V0IGRlYnVnZ2luZyBzeW1ib2xzIGlmIGRlYnVnSW5mb09mZnNldCBpcyAtMS4gIEFkZAotCXRoZSBjb2RlSW1hZ2VPZmZzZXQgdG8gdGhlIHN0YXJ0LCBleGl0LCBhbmQgY2hlY2sgcHJvY2VkdXJlCi0Jb2Zmc2V0cy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MsIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOgotCURvbid0IGNoZWNrIHBhcnRpYWxfaW5wbGFjZSBmaWVsZDsgaXRzIHZhbHVlIGlzIGlycmVsZXZhbnQuCi0KLQkqIEJhc2UgdXNlIG9mIHNjby1jb3JlIG9uIGhvc3QsIG5vdCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLXNjbyopOiBVc2UgaTM4NnNjbyByYXRoZXIgdGhhbiBpMzg2di4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRklORVMpOiBSZW1vdmVkLgotCSogY29uZmlnL2kzODZzY28ubWg6IE5ldyBmaWxlIHRvIHVzZSBzY28tY29yZS4KLQkqIGhvc3RzL2kzODZzY28uaDogTmV3IGZpbGU7IGp1c3QgaW5jbHVkZXMgaG9zdHMvaTM4NnYuaC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfe2hkcixleHR9X3tpbixvdXR9KTogVXNlIHNpZ25lZAotCWNvbnZlcnNpb25zIGZvciBzb21lIGZpZWxkcy4KLQotVHVlIEF1ZyAxMCAxMzozMjoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dwcmVsX3JlbG9jKTogSWYgX2dwIGlzIG5vdCBkZWZpbmVkLCBnaXZlIGFuCi0JZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG1hY2ggZmllbGQuCi0JKG5sbV9tYWNoaW5lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IFNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgZnJvbSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgbmV3IG1hY2ggZmllbGQuCi0KLVR1ZSBBdWcgMTAgMDk6MzE6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgY2FsbHMgdG8gc29ydCB3aXRoIHNoZWxsIGNvZGUKLQl0byB1bmlxIHRoZSBsaXN0cy4KLQotVHVlIEF1ZyAxMCAwNjoyMzoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBhb3V0MzIubyBmb3IgYW55IGEub3V0L2Iub3V0IGZvcm1hdHMuCi0KLU1vbiBBdWcgIDkgMDk6Mzc6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGJmZF9lbGYzMl9pMzg2X3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IG02OGtjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9pMzg2LWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGkzODZjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGhwcGFfdmVjLgotCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IHN1bm9zX2JpZ192ZWMuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFNFTEVDVF9WRUNTKTogRG9uJ3QgZGVmaW5lOyBJYW4gc2F5cyBpdCB3YXMKLQlqdXN0IGEgaGFjay4KLQotTW9uIEF1ZyAgOSAxMzoxNTowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWNvZmYubXQgKERFRkFVTFRfVkVDIC0+IERFRkFVTFRfVkVDVE9SKTogcmVuYW1lZC4KLQotTW9uIEF1ZyAgOSAxNDoyNjo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoQlNGX0VYUE9SVCk6IE5vdyBzYW1lIGFzIEJTRl9HTE9CQUwuCi0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBBdWcgIDkgMTE6Mjk6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9hcmNoaXRlY3R1cmUsIGJmZF9nZXRfbWFjaGluZSk6IFJlbW92ZWQKLQlvYnNvbGV0ZSBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX2FybWFwKTogQ29ycmVjdCBidWcgaW4gaW5pdGlhbGl6YXRpb24gb2YKLQlzdHJpbmdiYXNlLgotCi1TdW4gQXVnICA4IDEyOjIxOjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgdW5uZWVkZWQgdGVzdC4KLQotU3VuIEF1ZyAgOCAxMjo0MToyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtkaXN0LHJlYWx9Y2xlYW4pOiBVc2UgJChNQUtFKSwgbm90IG1ha2UuCi0KLVNhdCBBdWcgIDcgMDk6MTQ6MjEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc3QyMDAwLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBNUkk7IG5vdCB1c2VkLgotCi0JKiBQT1JUSU5HLCBUT0RPLCBjb25maWcvUkVBRE1FOiBVcGRhdGUgdG8gcmVmbGVjdCBiZWxvdyBjaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgTUlOSU1JWkUgYW5kIC0td2l0aC1taW5pbWFsLWJmZCB3aXRoCi0JLS13aXRoLWJmZC10YXJnZXRzPSJ0YXJnZXQxLHRhcmdldDIsLi4uIiBhbmQgdGhlIHNwZWNpYWwgdGFyZ2V0Ci0JImFsbCIgdG8gZ2V0IHRoZSBwcmV2aW91cyBkZWZhdWx0IGJlaGF2aW9yLgotCUZpZ3VyZSBvdXQgd2hpY2ggYXJjaGl0ZWN0dXJlIGFuZCBiYWNrZW5kIC5vIGZpbGVzIGFyZSBuZWVkZWQgZnJvbQotCURFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kIFNFTEVDVF9BUkNISVRFQ1RVUkVTIGFzIHNldCBpbgotCXRoZSAubXQgZmlsZXMuICBEZWZpbmUgVERFRkFVTFRTIGJhc2VkIG9uIHRoZW0sIGFsc28uCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBNSU5JTUlaRS4KLQkqIGFyY2h1cmVzLmMsIHRhcmdldHMuYzogRGl0dG8uCi0KLQkqIGNvbmZpZy8qLm10OiBEZWZpbmUgREVGQVVMVF9WRUNUT1IsIFNFTEVDVF9WRUNTLCBhbmQKLQlTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gYXMgLUQgYXJndW1lbnRzIHRvCi0JVERFRkFVTFRTLgotCi0JKiBjb25maWcvYTI5ay1jb2ZmLm10LGFscGhhb3NmLm10LCBpMzg2LXNjby5tdCwgaTk2MC1ib3V0Lm10LAotCWk5NjAtY29mZi5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0IHRoZSBkZWZhdWx0IHZlY3RvciBpbgotCVNFTEVDVF9WRUNTIG1hbnVhbGx5OyBpdCdzIGF1dG9tYXRpYyBub3cuCi0KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0ICZzY29fY29yZV92ZWMgaW4KLQlTRUxFQ1RfVkVDUyBtYW51YWxseTsgLURTQ09fQ09SRSBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgbm93LgotCi0JKiBjb25maWcvaDgzMDAtY29mZi5tdCxoODUwMC1jb2ZmLm10LHNoLWNvZmYubXQsc3QyMDAwLm10LHo4ay1jb2ZmLm10Ci0JKFRERUZBVUxUUyk6IERvbid0IGRlZmluZSBCRkQ7IG5vdCB1c2VkLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgU0VMRUNUX0FSQ0hJVEVDVFVSRVM7Ci0JdGhpcyBpcyBhIGhvc3QsIG5vdCBhIHRhcmdldC4KLQotU2F0IEF1ZyAgNyAwNToyODowMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgQWRkIGNvbW1lbnQgYWJvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uCi0JZG9lcyBhbmQgdG8gd2F0Y2ggb3V0IGZvciBzaWRlIGVmZmVjdHMuICBBZGQgRklYTUUgZm9yIG1lbW9yeSBsZWFrcy4KLQlGaXggY29tbWVudCBhYm91dCBjaGVja2luZyBmb3IgbWF0Y2hpbmcgYnl0ZSBvcmRlci4gIFByZXNlcnZlCi0JcG9pbnRlciB0byBvbGQgdGRhdGEgKGlmIGFueSksIGFuZCByZXN0b3JlIGl0IGlmIHdlIGRvbid0IG1hdGNoCi0JZmlsZSB3aXRoIHRhcmdldCB2ZWN0b3IuICBJZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGdvdG8ncywgdXNlIHRoZW0KLQljb25zaXN0ZW50bHkgYW5kIG1haW50YWluYWJseS4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogIEV4cGFuZCBjb21tZW50cyBhYm91dCBsZWFrZWQgbWVtb3J5Ci0JdG8gbm90ZSB0aGF0IHRoZSBwcm9ibGVtIGlzIGV2ZW4gbW9yZSBzZXJpb3VzIHRoYW4ganVzdCBsZWFrZWQKLQltZW1vcnkuICBSZXBsYWNlIGdvdG8gd2l0aCBtb3JlIHRyYWRpdGlvbmFsIHJldHVybi4KLQotRnJpIEF1ZyAgNiAxMjowMDowMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlGaXggaW5jb3JyZWN0IG9yIHVzZWxlc3MgbWFrZWZpbGUgdmFyaWFibGUgZGVmaW5pdGlvbnM6Ci0JKiBjb25maWcvbmV3cy5tdCwgY29uZmlnL3U2OGstY29mZi5tdCAoVERFRkFVTFRTKTogVXNlIHRoaXMgdG8KLQlkZWZpbmUgREVGQVVMVF9WRUNUT1IsIGluc3RlYWQgb2YgVERFRklORVMuCi0JKiBjb25maWcvaTM4NmFpeC5taCAoTUlOSU1JWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaHBwYW9zZi5taCAoTUlOSU1JWkUpOiBEb24ndCBjb25kaXRpb25hbGl6ZS4KLQkqIGNvbmZpZy9yczYwMDAubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NnYubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZpc2MubWggKEFMTE9DQSksCi0JKiBjb25maWcvZ28zMi5taCAoRVhUUkFMSUJTKTogRG9uJ3QgZGVmaW5lOyBub3QgdXNlZC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW5hbWVkIGZyb20gSF9ERUZJTkVTLgotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFNldCBpdCwgbm90IEhERUZJTkVTLgotCSogY29uZmlnL3o4ay1jb2ZmLm10IChDQyk6IERvbid0IGRlZmluZS4gIEl0J3MgYSB0YXJnZXQsIG5vdCBhIGhvc3QuCi0KLQkqIGNvbmZpZy9SRUFETUU6IE5ldyBmaWxlLCBleHBsYWluaW5nIHRoZSB2YXJpYWJsZXMuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZCBocDMwMF9ic2RfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgaHAzMDBic2QuCi0JKGhwMzAwYnNkLm8pOiBOZXcgcnVsZS4KLQotRnJpIEF1ZyAgNiAxNToxMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChOQU1FKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiwgdGhhdCdzIG5laXRoZXIKLQlmb3IgMzIgYml0cyBub3IgZm9yIDY0LgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLUZyaSBBdWcgIDYgMTI6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZW1vdmVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yCi0Jc2NCc3MgYW5kIHNjU0JzcyBzeW1ib2xzLCBzaW5jZSBpdCB3YXMgd3JvbmcuCi0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubywgY29mZi1hbHBoYS5vKTogRG9uJ3QgZGVwZW5kIG9uCi0JY29mZmNvZGUuaC4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJbnNwaXJlZCBieSBtYkB0dGkuQ09NIChNaWNoYWVsCi0JQmxvb20pOiBPbmx5IHNldCBTVFlQX0JTUyBmb3IgU0VDX0FMTE9DIHNlY3Rpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IEZyb20gQXJuZSBIZW5yaWsgSnV1bAotCTxhcm5lakBrYXJpLmZtLnVuaXQubm8+OiBIYW5kbGUgYSBDT0ZGIHN0eWxlIGFybWFwLgotCi1GcmkgQXVnICA2IDA5OjU5OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCi1UaHUgQXVnICA1IDEzOjIyOjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAobG9nMik6IERlbGV0ZSBpMzg3LXNwZWNpZmljIGNvZGUuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cyBpbmNsdWRlIGVsZi5vLgotCShCRkQzMl9CQUNLRU5EUyk6IERvbid0IGluY2x1ZGUgZWxmLm8gaGVyZS4KLQkob2ZpbGVzKTogRGVsZXRlIHJlZmVyZW5jZXMgdG8gb2ZpbGVzMiBhbmQgb2ZpbGVzMy4KLQkoZG9fY2xlYW4pOiBEZWxldGUgb2ZpbGVzLgotCShCRkRJTl9IKTogQ2hhbmdlZCByZWZlcmVuY2VzIHRvICQoc3JjZGlyKS9iZmQtaW4yLmguCi0JKHN0bXAtYmZkLmgpOiBVc2UgYmZkLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgyLgotCShoZWFkZXJzKTogVXNlIGJmZC1pbjIuaC1uZXcgYXMgdGVtcG9yYXJ5IG5hbWUsIG5vdCBiZmQuaC1uZXcuCi0KLQkqIGJmZC1pbi5oOiBSZXdvcmRlZCBjb21tZW50IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBiZmQtaW4yLmggaXMgYQotCWdlbmVyYXRlZCBmaWxlLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBpMzg2LWVsZiByZWxvYyB0eXBlcwotCShmcm9tIE1laXNzbmVyJ3MgYWRkaXRpb25zIHRvIGJmZC1pbjIuaCkuCi0KLQkqIGVsZjMyLWkzODYuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JTWVyZ2VkOgotCi0JV2VkIEp1biAyMyAwNjowNTo1OCAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZHJvcCBjb3JlIGlmCi0JZWxmX3N5bWJvbF9mcm9tIHJldHVybnMgYSBOVUxMIHBvaW50ZXIgd2hlbiBwcm9jZXNzaW5nIGEgbm9uLWVsZgotCXN5bWJvbCwgdXNlIGEgMCBzaXplIGluc3RlYWQuCi0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogRGVsZXRlIG1hY3JvIG1hcHBpbmcgZWxmX2hhc2ggdG8KLQliZmRfZWxmMzJfaGFzaCwgc2luY2UgdGhlIGhhc2ggdGFibGUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIDMyLzY0Ci0JYml0IHN5c3RlbS4KLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGYzMi1pMzg2LmggKHJlbG9jX3R5cGUpOiBSZWZvcm1hdCBzcGFjaW5nLgotCShlbGZfaG93dG9fdGFibGUpOiBBZGQgdGhlIHJlc3Qgb2YgdGhlIDM4Ni9FTEYgcmVsb2NhdGlvbnMuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBEaXR0by4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBEaXR0by4KLQotVGh1IEF1ZyAgNSAxMDowNzo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogIFRlc3QgcmV0dXJuIHZhbHVlCi0Jb2YgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSBhcyBib29sZWFuLCBub3QgcG9pbnRlci4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6ICBUZXN0IHJldHVybiB2YWx1ZQotCW9mIG5sbV9zbHVycF9yZWxvY19maXh1cHMgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCi0KLVdlZCBBdWcgIDQgMTY6MjI6NTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogcmVtb3ZlIEhERUZJTkVTOyBzaW5jZSBfX01TRE9TX18gYW5kIF9fR08zMl9fCi0JYXJlIG5vdyBwcmVkZWZpbmVkIGJ5IEdDQwotCi1XZWQgQXVnICA0IDE2OjA2OjI5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gdGhlCi0JbGluZSBudW1iZXIgYWRkcmVzcywgc28gaXQncyBwcmludGVkIHRoZSBzYW1lIHdheSBhcyB0aGUgZnVuY3Rpb24KLQlhZGRyZXNzLiAgT25seSBzaG93ZWQgdXAgZm9yIGxpbmUgbnVtYmVycyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlyc3QKLQlzZWN0aW9uICgudGV4dCkuCi0KLVdlZCBBdWcgIDQgMDg6MzM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG5sbV9tYW5nbGVfcmVsb2NzLgotCShubG1fbWFuZ2xlX3JlbG9jc19mdW5jKTogTmV3IG1hY3JvLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9yZWxvYyk6IFJld3JvdGUgY29ycmVjdGx5LgotCShubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTW92ZSBhbGwgY29tbW9uCi0Jc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgdGhlIG1hbmdsZV9yZWxvY3MgZnVuY3Rpb24uCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYW55IGRlZmluZWQKLQlzeW1ib2wgYXMgYW4gaW50ZXJuYWwgcmVsb2MuICBGaXggYnVnIGluIGV4dGVybmFsIHJlbG9jIGNvdW50aW5nLgotCUdldCB0aGUgb2Zmc2V0IGFuZCBkZWJ1Z2dpbmcgdHlwZSByaWdodCBmb3IgLmJzcyBzeW1ib2xzLiAgT25seQotCW91dHB1dCBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgZGVmaW5lZCBzeW1ib2xzLgotCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyIHRoYW4KLQl1c2luZyBwcmludGYuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChUUkFDRSk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUsIHN3YXBfc3RkX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogRG8gYW4gZnByaW50ZiB0byB0aGUgZmlsZQotCWFyZ3VtZW50IHJhdGhlciB0aGFuIHVzaW5nIHByaW50Zi4KLQotVHVlIEF1ZyAgMyAxODoxNzoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmg6IEFkZGVkIG1hY3JvcyB1c2VkIHdoZW4gYWNjZXNzaW5nIHNldmVyYWwgZmllbGRzOwotCWRlZmF1bHQgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLgotCShjb2ZmX3N3YXBfYW91dGhkcl97aW4sb3V0fSk6IEhhbmRsZSB0aGUgQWxwaGEgRUNPRkYgZmllbGRzLgotCSogY29mZi1hbHBoYS5jOiBEZWZpbmVkIG1hY3JvcyB0byB1c2UgdGhlIHJpZ2h0IHNpemVzIGluCi0JY29mZnN3YXAuaC4KLQkqIGxpYmVjb2ZmLmg6IEJhY2tlbmQgaW5mb3JtYXRpb24gaXMgbm93IGluIHRhcmdldCB2ZWN0b3IsIG5vdAotCUJGRC4gIFN0YXJ0IG9mIGJhY2tlbmQgaW5mb3JtYXRpb24gaXMgQ09GRiBiYWNrZW5kIGluZm9ybWF0aW9uLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgotCShBUk1BUF9TVEFSVCk6IENoYW5nZWQgaW50byBiYWNrZW5kIGluZm9ybWF0aW9uLCBzaW5jZSBBbHBoYSB1c2VzCi0JYSBkaWZmZXJlbnQgbmFtZS4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBEb24ndCBvdmVybGF5IGFyY2hpdmUgaGVhZGVyLgotCSogYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi1UdWUgQXVnICAzIDE2OjMzOjExIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggc2ggc3ludGF4IGVycm9yLgotCi0JKiBhb3V0ZjEuaDogTWFrZSBiZmRfZXJyb3JfdHJhcCBleHRlcm47IGl0J3MgZGVmaW5lZCBpbiBiZmQuYy4KLQotVHVlIEF1ZyAgMyAxNToxOTowOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtX3NsdXJwX3N5bWJvbF90YWJsZTogRG9uJ3QgdXNlICcmJyBvbiBhcnJheXMuCi0KLVR1ZSBBdWcgIDMgMTE6MDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBOZXcgZmlsZSBmb3IgZ2VuZXJpYyBFQ09GRiBmdW5jdGlvbnMuCi0JKiBlY29mZnN3YXAuaDogTmV3IGZpbGUgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucyB3aGljaCBkaWZmZXIKLQlvbmx5IHNsaWdodGx5IGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KLQkqIGxpYmVjb2ZmLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIGVjb2ZmLmMgZnVuY3Rpb25zLgotCShlY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlLgotCShlY29mZl90ZGF0YSk6IEFkZGVkIGJhY2tlbmRfZGF0YSBmaWVsZC4gIENoYW5nZWQgZXh0ZXJuYWwgZGF0YQotCXBvaW50ZXJzIHRvIGJlIFBUUiByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgc3RydWN0LgotCShlY29mZl9zeW1ib2xfc3RydWN0KTogTW92ZWQgaW4gZnJvbSBjb2ZmLW1pcHMuYy4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IE1vdmVkIGNvbW1vbiBmdW5jdGlvbnMgaW50byBlY29mZi5jLgotCUFkZGVkIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlcy4gIEluY2x1ZGUgZWNvZmZzd2FwLmguCi0JKiBjb2ZmLW1zeW0uYzogUmVtb3ZlZDsgc3VwZXJzZWRlZCBieSBlY29mZnN3YXAuaC4KLQkqIGJmZC5jOiBJbmNsdWRlIGNvZmYvaW50ZXJuYWwuaC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZWQgY29mZi1taXBzLm8gYW5kIGNvZmYtbXN5bS5vLgotCUFkZGVkIGVjb2ZmLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkZWQgY29mZi1hbHBoYS5vLgotCShDRklMRVMpOiBSZW1vdmVkIGNvZmYtbXN5bS5jLiAgQWRkZWQgZWNvZmYuYy4KLQkoYmZkLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uICQoSU5DRElSKS9jb2ZmL3N5bS5oLgotCShjb2ZmLW1pcHMubyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gZWNvZmZzd2FwLmggYW5kIGNvZmYvZWNvZmYuaC4KLQkoZWNvZmYubywgY29mZi1hbHBoYS5vKTogTmV3IHRhcmdldHMuCi0JKGNvZmYtbXN5bS5vKTogUmVtb3ZlZCB0YXJnZXQuCi0KLU1vbiBBdWcgIDIgMjM6MzM6MzggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuaCwgaG9zdHMvKjogIFJlbW92ZSAob25lIG1vcmUgdGltZSkgYWxsIG9jY3VycmFuY2VzCi0Jb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLiAgSGVhdmUgaG8hCi0KLU1vbiBBdWcgIDIgMTY6NDU6NTcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAgQWRkIGNoZWNrIGZvciBJMzg2TFlOWE1BR0lDLgotCi1Nb24gQXVnICAyIDEyOjE4OjAzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBtb3JlIGNvbmZsaWN0aW5nIGRlY2xzCi0KLU1vbiBBdWcgIDIgMTE6NDg6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYzogIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWYgb2YgTl9IRUFERVJfSU5fVEVYVCwKLQlyZWRlZmluZSBURVhUX1NUQVJUX0FERFIgdG8gYmUgMC4KLQotU3VuIEF1ZyAgMSAyMjo1NDowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLCBob3N0cy9pMzg2bHlueC5oOiAgTHlueC8zODYKLQlob3N0IGFuZCB0YXJnZXQgaW5mby4KLQotRnJpIEp1bCAzMCAxODowODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWkzODYuYzogTmV3IGZpbGUuICBGaXJzdCBjdXQgYXQgaTM4NiBOTE0gY29kZS4KLQkqIGxpYm5sbS5oOiBBZGRlZCBzb21lIG1vcmUgcHJvdG90eXBlcy4KLQkoc3RydWN0IG5sbV9yZWxlbnQpOiBOZXcgc3RydWN0dXJlLgotCShubG1OQU1FKHN5bWJvbF90eXBlKSk6IEFkZGVkIHJjbnQgYW5kIHJlbG9jcyBmaWVsZHMuCi0JKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkZWQgbmV3IGZpZWxkczogbmxtX3N5bWJvbHMsCi0JbmxtX3RleHRfbG93LCBubG1fZGF0YV9sb3csIG5sbV9yZWxvY19maXh1cHMsCi0JbmxtX3JlbG9jX2ZpeHVwX3NlY3MuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZSwgd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0JKiBubG1jb2RlLmg6IFVzZSBOTE1fSElCSVQgcmF0aGVyIHRoYW4gTVNCLgotCShubG1fb2JqZWN0X3ApOiBTZXQgU0VDX1JFTE9DIGZvciAudGV4dCBhbmQgLmRhdGEuICBEb24ndCBzZXQKLQlTRUNfREFUQSBmb3IgLmJzcy4gIFNldCBIQVNfUkVMT0MgYW5kIEhBU19TWU1TIGZvciBhYmZkLiAgU2V0IHRoZQotCWFyY2hpdGVjdHVyZS4KLQkobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwgbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCwKLQlmaW5kX25vbnplcm8sIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IE5ldyBvdXRib3VuZAotCXN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBJbmNsdWRlCi0JZXh0ZXJuYWwgcmVmZXJlbmNlcyBpbiBzeW1ib2wgdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKG5sbV9nZXRfc3ltdGFiLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogRmlsbCBpbiBhbG9jYXRpb24KLQlhcmd1bWVudCBpbiBnZXRfc3ltdGFiIHJhdGhlciB0aGFuIGluIHNsdXJwX3N5bWJvbF90YWJsZS4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNhdmUgc3ltYm9sIGluZm9ybWF0aW9uIGluIHRkYXRhLgotCShubG1fcHJpbnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShubG1fc2x1cnBfcmVsb2NfZml4dXBzLCBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLAotCW5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgcmVsb2NzLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBubG1fc2V0X3NlY3Rpb25fY29udGVudHMsCi0JbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUsIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcKLQlmdW5jdGlvbnMgdG8gY3JlYXRlIE5MTSBmaWxlcy4KLQkqIG5sbS10YXJnZXQuaDogRGVmaW5lIGFsbCB0aGUgbmxtIGZ1bmN0aW9ucyBoZXJlIGVpdGhlciBhcwotCWRlZmF1bHQgdmFsdWVzIG9yIGluIHRlcm1zIG9mIG5sbU5BTUUuICBVc2UgSlVNUF9UQUJMRShubG0pLiAgU2V0Ci0JdGhlIGJhY2tlbmRfZGF0YSBmaWVsZCB0byBUQVJHRVRfQkFDS0VORF9EQVRBLgotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBEb24ndCBkZWZpbmUgZnVuY3Rpb24gbWFjcm9zIGhlcmU7Ci0JdGhleSBhcmUgbm93IGluIG5sbS10YXJnZXQuaC4KLQkoVEFSR0VUX0JBQ0tFTkRfREFUQSk6IERlZmluZSBhcyBOVUxMLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IERvIGFsbG9jYXRlIHRoZSB0ZGF0YSBmaWVsZC4KLQkobmxtX3NldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5sbTMyX2kzODZfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItaTM4Ni5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1pMzg2LmMuCi0JKG5sbTMyLWdlbi5vLCBubG02NC1nZW4ubyk6IERlcGVuZCBvbiBubG0tdGFyZ2V0LmguCi0JKG5sbTMyLWkzODYubyk6IE5ldyB0YXJnZXQuCi0KLVRodSBKdWwgMjkgMjA6MjA6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IHJlbW92ZSBzb21lIGZ1bmN0aW9uIGRlY2xzIHRoYXQgY29uZmxpY3Qgdy8gQU5TSQotCUMsIGFuZCBhcmVuJ3QgbmVlZGVkIGFueXdheSAocmV0dXJuIGludCkKLQotV2VkIEp1bCAyOCAxNTo0NjozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIGNhc3RzIHdpdGggYmZkX2FsbG9jIGFuZCBhbGxvY2EuCi0KLVR1ZSBKdWwgMjcgMTI6NTE6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfUFJFRklYKTogIERlbGV0ZS4KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfSU5JVCk6ICBOZXcgbWFjcm8gdGhhdCB3b3JrcyB3aXRoCi0Jb2xkZXIgY3BwJ3MsIHRoYXQgZG9uJ3QgZG8gYWRkaXRpb25hbCByZXBsYWNlbWVudCBvbiB0aGUgSlVNUF9UQUJMRQotCW1hY3JvJ3MgYXJndW1lbnQuCi0JKiBubG0tdGFyZ2V0LmggKEpVTVBfVEFCTEVfSU5JVCk6ICBVc2UgbmV3IG1hY3JvIGluIHBsYWNlIG9mCi0JSlVNUF9UQUJMRSBtYWNyby4KLQotTW9uIEp1bCAyNiAxNzozOTowMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCVlldCBhbm90aGVyIHRyYWQtY29yZSB2YXJpYW50OgotCSogY29uZmlnL2VzaXgubWgsIGhvc3RzL2VzaXguaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmhvc3RzOiBVc2UgdGhlbS4KLQotTW9uIEp1bCAyNiAxMzoyMjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgdGhlIGNhc2Ugb2YKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgcmlnaHRzaGlmdCA+IGJpdHBvcywgYW5kIGEgbmVnYXRpdmUKLQludW1iZXIuCi0KLU1vbiBKdWwgMjYgMTQ6NDA6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFJlaW1wbGVtZW50IHNlZ21lbnQgd3JpdGluZy4KLQkoZWxmX3dyaXRlX3BoZHJzKTogVXNlIHByZWNvbXB1dGVkIGVfcGhvZmYgcmF0aGVyIHRoYW4gbWFraW5nCi0JYXNzdW1wdGlvbnMuCi0JKGVsZl9idWlsZF9waGRycyk6IERpc2FibGVkLCBmb3Igbm93LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IERvbid0IGNoYW5nZSBmaWxlIG9mZnNldCBmb3IKLQlTSFRfTk9CSVRTLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogTmV3IHR5cGUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogTmV3IGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEZvciBleGVjdXRhYmxlcywgbGVhdmUKLQlzZWN0aW9uIGhlYWRlcnMgJmMgZm9yIGxhc3QsIGFuZCBwcm9wZXJseSBhbGlnbiBhbGwgc2VjdGlvbnMgd2l0aAotCWZsYWcgU0hGX0FMTE9DIHNldC4KLQkocHJlcF9oZWFkZXJzKTogTm8gbG9uZ2VyIGFib3J0IHdoZW4gRVhFQ19QIGlzIHNldC4KLQkod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWxldGVkIGFsbCBjb2RlIHJlbGF0aW5nIHRvIHByb2dyYW0KLQlzZWdtZW50cy4KLQotCSogZWxmY29kZS5oICh2YXJpb3VzKTogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLCBhbmQgZGVidWdnaW5nCi0JIm1hbGxvYygwKSIgY2FsbHMuCi0JKHdyaXRlX3JlbG9jcyk6IENhY2hlIHZhbHVlIG9mIGxhc3Qgc3ltYm9sIGxvb2tlZCB1cCwgdG8gc2F2ZQotCXRpbWUgaWYgdGhlIHN5bWJvbCBpcyByZWZlcnJlZCB0byByZXBlYXRlZGx5LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIG9ubHkgU0VDX1JFTE9DIGZsYWcsIG5vdCBudW1iZXIgb2YKLQlyZWxvY3MuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKG9maWxlcyk6IFN0YXJzIGluIHdpbGRjYXJkcyBiZWxvbmcgb3V0c2lkZSBxdW90ZXMuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCwgbWF4cGFnZXNpemUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkLCBwaGRyLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgbWF4cGFnZXNpemUgZnJvbQotCUVMRl9NQVhQQUdFU0laRS4KLQkoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAxLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCwgRUxGX01BWFBBR0VTSVpFKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IEFsbCByZWxvY3Mgc2hvdWxkIGhhdmUgcGNyZWxfb2Zmc2V0PXRydWUuCi0JTW9zdCBzaG91bGQgaGF2ZSBsZW5ndGggZmllbGQgb2YgYDInLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIDY0LWJpdCByZWxvY3MuCi0KLQkqIGNvbmZpZy9zcGFyYy1hb3V0Lm10IChUQVJHRVRfQkFDS0VORFMpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjYgMDg6NTY6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGxvb2sgaW4gJHtzcmNkaXJ9IGZvciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfTsKLQl0aGUgdG9wIGxldmVsIHNjcmlwdCBoYXMgYWxyZWFkeSBhZGp1c3RlZCBmb3IgaXQuCi0KLU1vbiBKdWwgMjYgMDg6MDk6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiAgR2V0IENSIExGIGluIHRoZSByaWdodCBvcmRlci4KLQotTW9uIEp1bCAyNiAwMjowODo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvdmF4YnNkLmg6IEluY2x1ZGUgc3RkLWhvc3QuaC4gIERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4uCi0KLVNhdCBKdWwgMjQgMTY6MTM6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIGNhc2Ugb2YgcmlnaHRzaGlmdCAhPQotCWJpdHBvcyB3aGVuIG92ZXJmbG93IGNoZWNraW5nLgotCi1GcmkgSnVsIDIzIDEwOjIwOjI3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLCBiZmRfYXNzZXJ0KToKLQlTZW5kIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyci4KLQotVGh1IEp1bCAyMiAxNTo1NzoyOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtezMyLDY0fS10YXJnZXQuaDogIFJlbW92ZS4KLQkqIG5sbS10YXJnZXQuaDogIE5ldyBmaWxlLCBtZXJnZWQgZnJvbSBubG17MzIsNjR9LXRhcmdldC5oCi0JKiBsaWJubG0uaCAoTkxNX0FSQ0hfU0laRSk6ICBEZWZpbmUgdG8gQVJDSF9TSVpFLgotCSogbmxtLmMgKEFSQ0hfU0laRSk6ICBSZW1vdmUgZGVmaW5lIHRvIHplcm8uCi0JKiBubG0zMi1nZW4uYyAoQVJDSF9TSVpFKTogIERlZmluZSB0byAzMi4KLQkqIG5sbTMyLWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWZpbmUgdG8gbmxtMzIuCi0JKiBubG17MzIsNjR9LWdlbi5jIChubG0tdGFyZ2V0LmgpOiAgSW5jbHVkZS4KLQkqIHRhcmdldHMuYywgbGlibmxtLmgsIG5sbS5jLCBubG17MzIsNjR9LWdlbi5jLCBubG17MzIsNjR9LmMsCi0JbmxtY29kZS5oOiAgQ29udmVydCBwcmVmaXhlcyBmcm9tIGJmZF9ubG08c2l6ZT4gdG8ganVzdAotCW5sbTxzaXplPiwgYW5kIHVzZSBtYWNyb3Mgc2VsZWN0IHNpemUuCi0KLVRodSBKdWwgMjIgMTU6NDA6MTQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBhZGQgY29uZmlndXJlLmluLCBkcm9wIHJlZHVuZGFudAotCSAgJChzcmNkaXIpLCBkcm9wIHJlZHVuZGFudCAuLwotCi1UaHUgSnVsIDIyIDEzOjM0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IE5ldyBmaWxlOyBiYWNrZW5kIGZvciBIUC9VWCBzdHlsZSBjb3JlIGZpbGVzLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogUmVuYW1lZCBocHBhX2NvcmVfZGF0YSBmaWVsZCB0bwotCWhwdXhfY29yZV9kYXRhLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCSogaHBwYS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgaHBwYV9jb3JlX2ZpbGVfcCwKLQlocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLAotCWhwcGFfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogTW92ZWQgaW50byBocHV4LWNvcmUuYy4KLQlSZW1vdmVkIGZyb20gdGFyZ2V0IHZlY3Rvci4KLQkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFfY29yZV9zdHJ1Y3QgYW5kIGFjY2Vzc29yIG1hY3Jvcyk6IE1vdmVkCi0JaW50byBocHV4LWNvcmUuYy4KLQkqIHRhcmdldHMuYzogSWYgSFBVWF9DT1JFIGlzIGRlZmluZWQsIGFkZCBocHV4X2NvcmVfdmVjIHRvCi0JdGFyZ2V0IGxpc3QuCi0JKiBjb25maWcvaHAzMDAubWggKEhERUZJTkVTKTogU2V0IHRvIC1ESFBVWF9DT1JFLgotCShIREVQRklMRVMpOiBTZXQgdG8gaHB1eC1jb3JlLm8uCi0JKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnL2hwcGFocHV4Lm1oOiBMaWtld2lzZS4KLQkqIGhvc3RzL2hwMzAwLmggKEhPU1RfSFAzMDBIUFVYKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkZWQgc2NvLWNvcmUubywKLQlhaXgzODYtY29yZS5vLCBocHV4LWNvcmUuby4KLQkoc2NvLWNvcmUubywgYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8pOiBOZXcgZGVwZW5kZW5jaWVzLgotCi0JKiByZWxvYy5jIChlbnVtIGNvbXBsYWluX292ZXJmbG93KTogTmV3IGVudW1lcmF0aW9uIHdpdGggdGhlCi0JdmFyaW91cyBmbGF2b3VycyBvZiBvdmVyZmxvdyBjaGVja2luZy4KLQkoc3J0dWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IENoYW5nZWQgY29tcGxhaW5fb25fb3ZlcmZsb3cgZmllbGQKLQlmcm9tIGJvb2xlYW4gdG8gZW11bSBjb21wbGFpbl9vdmVyZmxvdy4gIFJlbW92ZWQgb2Jzb2xldGUgYWJzb2x1dGUKLQlmaWVsZC4KLQkoSE9XVE8pOiBSZW1vdmVkIGFic29sdXRlIGFyZ3VtZW50LgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gYWxsIHR5cGVzIG9mCi0JZmllbGRzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCSogYWxsIHRhcmdldHM6IFVwZGF0ZWQgaW5pdGlhbGl6YXRpb24gb2YgcmVsb2MgaG93dG8gdGFibGVzLgotCi1XZWQgSnVsIDIxIDIwOjM0OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpOiBEb24ndCB1c2UgQysrIGtleXdvcmQgInRlbXBsYXRlIiBhcyBhIEMKLQl2YXJpYWJsZSBuYW1lLgotCi1UdWUgSnVsIDIwIDE1OjAyOjIzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJydHlwZSk6ICBNYWtlIGFyZyBDT05TVCB0byBtYXRjaCBjYWxsZXJzLgotCi0JKiBlbGZjb2RlLmg6ICBGaXggc2V2ZXJhbCBpbGxlZ2FsIHBvaW50ZXIgY29tYmluYXRpb24gd2FybmluZ3MgZm9yCi0JdXNhZ2VzIG9mIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgotCi0JKiBsaWJubG0uaCAobmxtX29ial90ZGF0YSk6ICBSZW5hbWUgaGlkZGVuIHN0cnVjdCBtZW1iZXJzIHRvIGF2b2lkCi0JYXBwYXJlbnQgU3VuIEMgcHJlcHJvY2Vzc29yIHJlY3Vyc2lvbi4gIEZpeCBhY2Nlc3MgbWFjcm9zLgotCSogbmxtY29kZS5oOiAgUmVtb3ZlIHNwdXJpb3VzICcmJyBiZWZvcmUgc2V2ZXJhbCBhcnJheSByZWZlcmVuY2VzLgotCi1UdWUgSnVsIDIwIDE0OjM2OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBSZW5hbWUgZm9yIERPUyB1bmlxdWVuZXNzOiBjb2ZmLW02OGstdW4uYyAtPiBjb2ZmLXU2OGsuYwotCWNvbmZpZy9tNjhrLWNvZmZ1bi5tdCAtPiB1NjhrLWNvZmYubXQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBKdWwgMjAgMTY6MjE6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgIiYiIGJlZm9yZQotCWZ1bmN0aW9uIG5hbWU7IGl0J3MgdmFsaWQgd2l0aG91dCwgYW5kIHNvbWUgY29tcGlsZXJzIGdpdmUKLQl3YXJuaW5ncyB3aXRoIGl0IHRoZXJlLgotCi1UdWUgSnVsIDIwIDA4OjIxOjE1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEFwcGx5IHNvbWUgb2YgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgdG8gYmZkLWluMi5oLgotCSogYmZkLmMgKHVuaW9uIHRkYXRhKTogIEFkZCBubG1fb2JqX2RhdGE7Ci0JKiB0YXJnZXRzLmMgKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiAgQWRkIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIuCi0KLU1vbiBKdWwgMTkgMjA6NDY6MTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUsIGlbMzRdODYtKi1uZXR3YXJlKTogIE5ldyBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogIEFkZCBubG0ubywgbmxtMzIubywgbmxtMzItZ2VuLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZENjRfQkFDS0VORFMpOiAgQWRkIG5sbTY0Lm8sIG5sbTY0LWdlbi5vLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgbmxtezMyLDY0fS5jLCBubG17MzIsNjR9LWdlbi5jLgotCSogTWFrZWZpbGUuaW4gKG5sbS5vLCBubG17MzIsNjR9Lm8sIG5sbXszMiw2NH0tZ2VuLm86ICBOZXcgdGFyZ2V0cy4KLQkqIGJmZC1pbjIuaCAoSU5MSU5FKTogIERlZmluZXMgbW92ZWQgaGVyZS4KLQkqIHthb3V0eC5oLCBlbGYuYywgZWxmY29kZS5ofTogIE1vdmUgSU5MSU5FIGRlZmluZXMgdG8gYmZkLWluMi5oLgotCSogbGliZWxmLmggKENBVDQpOiAgTW92ZSBkZWZpbmUgdG8gYmZkLWluMi5oLgotCSogYmZkLWluMi5oIChDQVQ0KTogIE1lcmdlIENBVDQgbWFjcm8gd2l0aCBvdGhlciBDQVQgbWFjcm9zLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhLgotCSogYmZkLWluMi5oIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgotCSogdGFyZ2V0cy5jIChiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjKTogIEFkZCBwcm90b3R5cGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjLgotCSogKGxpYm5sbS5oLCBubG0uYywgbmxtY29kZS5oLCBubG17MzIsNjR9LWdlbi5jLAotCW5sbXszMiw2NH0tdGFyZ2V0LmgsIG5sbXszMiw2NH0uYywgY29uZmlnL2kzODYtbmxtLm10KTogIE5ldyBmaWxlcwotCWZvciBOTE0gc3VwcG9ydC4KLQotTW9uIEp1bCAxOSAxNTowOTowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS57aG9zdHMsaW59OiBhZGQgaVszNF04Ni0qLWx5bnhvcyogc3VwcG9ydAotCi1Nb24gSnVsIDE5IDE0OjUzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMsIGVsZmNvZGUuaCwgbGliZWxmLmg6IFNlcmlvdXMgcmVvcmdhbml6YXRpb24uCi0JRGVsZXRlZCBgdGh1bmsnIHN0cnVjdHVyZSwgbWVyZ2VkIGludG8gdGRhdGEsIGR1cGxpY2F0ZSBkYXRhCi0JZWxpbWluYXRlZC4KLQlSZWFycmFuZ2VkIGZ1bmN0aW9ucywgZ3JvdXBpbmcgYnkgZnVuY3Rpb25hbGl0eS4KLQlCcm9rZSB1cCBtYW55IGZ1bmN0aW9ucyBpbiBlbGZjb2RlLmgsIHJlLW9yZGVyZWQgbWFueSBwYXJ0cyBvZgotCWZpbGUgd3JpdGluZyB0byBoYW5kbGUgdW5wcmVkaWN0YWJsZSBzdGF0ZSBvZiBzZWN0aW9uIHJlbG9jYXRpb24KLQl0YWJsZSBhcyBwcm92aWRlZCBieSB2YXJpb3VzIGFwcGxpY2F0aW9ucy4KLQlTdGlsbCBuZWVkcyBjbGVhbnVwOiBNZXJnZSBmdW5jdGlvbnMgYmFjayB0b2dldGhlciwgc3BsaXQgb3V0Ci0JZGF0YSBzdHJ1Y3R1cmUgd2l0aCBvbmx5IGRhdGEgdGhhdCBpcyB1c2VkIG9ubHkgd2hlbiB3cml0aW5nIG91dAotCW9iamVjdCBmaWxlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tCi0JY29mZi1taXBzLmMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBVc2UgaXQsIHRvIHdvcmsgYXJvdW5kCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBsb3NzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBJbmNsdWRlIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0ubywgc28KLQl0aGF0IGdkYiB3aWxsIGxpbmsuCi0JKG9maWxlcyk6IERvbid0IHVzZSBzb3J0IG9yIHVuaXE7IGRvIGl0IHdpdGggc2ggY29uc3RydWN0cy4KLQotU3VuIEp1bCAxOCAxOTo0MjoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0JKiBhb3V0ZjEuaCwgbGliYW91dC5oOiBBZGQgTV8zODZfRFlOSVguCi0JKiB0cmFkLWNvcmUuYyAoVFJBRF9DT1JFX1VTRVJfT0ZGU0VULCBUUkFEX0NPUkVfU1RBQ0tfRklMRVBPUyk6Ci0JTmV3IG1hY3JvczsgdXNlIGl0IGlmIGRlZmluZWQuCi0JKiBjb25maWcvc3ltbWV0cnkubWgsIGhvc3RzL3N5bW1ldHJ5Lmg6IE5ldyBmaWxlcy4KLQotRnJpIEp1bCAxNiAxNDo1NjozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBlbGZ7MzIsNjR9LWdlbmVyaWMuYyB0byAqLWdlbi5jIGZvciAxNCBjaGFyIGZpbGVuYW1lcy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKENGSUxFUyk6IEFkZCBlbGY2NC1nZW4uYy4KLQotRnJpIEp1bCAxNiAwOTo1MzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBVc2UgTUlQU19BT1VUX3tPWn1NQUdJQyByYXRoZXIgdGhhbiB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTY6MDI6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoaG93dG9fdGFibGUpOiBDb3JyZWN0ZWQgYml0c2l6ZSBmb3IgUl9QQ1IyNkwgZnJvbQotCTE2IHRvIDI2LgotCi1XZWQgSnVsIDE0IDE1OjI5OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgW0hPU1RfSFBQQUJTRF06IFVzZSBocHV4LXN0eWxlIGNvcmUgZmlsZXMuCi0JKiBsaWJocHBhLmggW0hPU1RfSFBQQUJTRF06IEluY2x1ZGUgaHB1eCB2ZXJzaW9uIG9mIGNvcmUuaAotCi1XZWQgSnVsIDE0IDA5OjMwOjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC0qLSouCi0KLVR1ZSBKdWwgMTMgMTI6MDM6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODUwMC5jIChyZWxvY19wcm9jZXNzaW5nLCBydHlwZTJob3d0byk6IE5ldyByZWxvY2F0aW9uCi0JdHlwZSBSX0g4NTAwX0hJR0hfMTYuCi0JKiBjb2ZmLXNoLmMgKHJfaW1tMzIpOiBHZXQgdGhlIHdpZHRoIG9mIHRoZSByZWxvYyByaWdodC4KLQotVHVlIEp1bCAxMyAxNjo0ODo1NiAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQotCSogY29uZmlndXJlLmluOiBBZGQgbmV3IHRhcmdldCBtNjhrLWNvZmZ1biB0byB0aGUgZHB4LzIuCi0JKiBjb25maWcvbTY4ay1jb2ZmdW4ubXQ6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gY29uZmlnL2RweDIubXQuCi0KLU1vbiBKdWwgMTIgMTA6NDI6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IE1vdmUgU1BBUkNfQkFTRTEzIHJlbG9jIGludG8KLQlzcGFyYy1hb3V0LXNwZWNpZmljIGxpc3QuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCBgdGh1bmsnLgotCi0JKiBjb25maWcvc3BhcmMtZWxmLm10IChUQVJHRVRfQkFDS0VORFMpOiBOZXcgbWFrZSB2YXJpYWJsZS4KLQotVGh1IEp1bCAgMSAxNDo1Mjo0NyAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQkJCSAgYW5kIEppbSBLaW5nZG9uIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIG1lbXNldCBub3QgYnplcm8uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBpMzg2bGludXguaDogSW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBjb2ZmLW02OGstdW4uYzogbmV3IGZpbGUgdG8gaGFuZGxlIG5hbWVzIHdpdGggdW5kZXJzY29yZXMgb24KLQlzdnIzIG1hY2hpbmVzLgotCSogY29mZi1tNjhrLmMgKG02OGtfcnR5cGUyaG93dG8pOiBhZGRlZCAjaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotCXRvIG5vdCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uIGluIHRoZSBleGVjdXRhYmxlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogbmV3IG1hY3JvcyBuZWVkZWQKLQlieSBjb2ZmLW02OGstdW4uYy4KLQkqIGNvZmZjb2RlLmggKE1DNjhLQkNTTUFHSUMpOiBjYXNlIGFkZGVkLgotCSogdGFyZ2V0cy5jOiBBZGQgbTY4a2NvZmZ1bl92ZWMuCi0JKiBjb25maWd1cmUuaG9zdDogYWRkZWQgc3VwcG9ydCBmb3IgQnVsbCBkcHgvMi4KLQkqIGNvbmZpZy9kcHgyLm1oLCBob3N0cy9kcHgyLmg6IG5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0YXJnZXQgY29mZi1tNjhrLXVuLgotCi1GcmkgSnVsICA5IDAwOjQzOjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaDogQWRkIGRlZmluaXRpb24gb2YgTUFDSFRZUEVfT0suCi0KLVRodSBKdWwgIDggMTQ6Mzc6NDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3Qgc3VidHJhY3QgdGhlIGFkZGVuZAotCWFnYWluIGZvciBjb2ZmLgotCi0JKiBzeW1zLmMsIGJmZC1pbjIuaDogRG9jIGZpeC4KLQotCSogY29mZmNvZGUuaCAoQ0FMQ19BRERFTkQpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb24gdXNpbmcgdGhlCi0Jc2VjdGlvbiBmbGFnIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCBmbGFnLgotCi1UaHUgSnVsICA4IDEzOjQzOjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2YnNkLmg6IENvbmRpdGlvbmFsaXplIEhPU1RfU1RBQ0tfRU5EX0FERFIgb24gX19ic2RpX18uCi0JaTM4NmJzZC5jOiBSZW1vdmUgZGVmaW5lcyBvZiBOX1RYVCo7IHRoZSB2ZXJzaW9ucyBpbiBhb3V0NjQuaCBzaG91bGQKLQliZSBzdWZmaWNpZW50LiAgRGVmaW5lIFRFWFRfU1RBUlRfQUREUi4KLQotV2VkIEp1bCAgNyAxMDo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZW1vdmVkIHN0YXRlcAotCWFyZ3VtZW50LiAgSnVzdCBsZXQgYW4gaW5kaXJlY3Qgc3ltYm9sIHBvaW50IHRvIHRoZSBuZXh0IHN5bWJvbAotCXdpdGhvdXQgZm9yY2luZyB0aGUgbmV4dCBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCSogaHAzMDBocHV4LmMgKHNsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZWQgY2FsbCB0bwotCXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGhwMzAwaHB1eF92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoaHAzMDBocHV4Lm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBKdWwgIDYgMTM6MjQ6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBQdXQgc2ltcGxlIHBvd2VyLW9mLXR3bwotCXJlbG9jcyB0b2dldGhlciwgYW5kIGFkZCA2NC1iaXQgdmVyc2lvbnMuCi0JKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFyZ3VtZW50IHRvIGFsbG9jYQotCWlzIHNpemVfdC4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IE5ldyBmdW5jdGlvbi4KLQkqIG9wbmNscy5jIChiZmRfY2FjaGVfaW5pdCwgYmZkX29wZW5fZmlsZSk6IEFkZCBwcm90b3R5cGVzIHRvCi0JZGVjbGFyYXRpb25zLgotCShvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkobmV3X2JmZCk6IFByb3RvdHlwZS1zdHlsZSBkZWZpbml0aW9uLCB1c2luZyBERUZVTi4KLQkoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MpOiBTaXplCi0JYXJndW1lbnQgaXMgdHlwZSBzaXplX3QsIG5vdCBiZmRfc2l6ZV90eXBlLgotCSogaWVlZS5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkqIGJmZC5jIChiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFByb3RvdHlwZXMuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jLCBiZmRfemFsbG9jLCBiZmRfcmVhbGxvYywKLQliZmRfYWxsb2NfZ3Jvdyk6IEFkanVzdGVkIHByb3RvdHlwZXMgZm9yIGFyZyB0eXBlIGNoYW5nZS4KLQkqIGFyY2hpdmUuYyAoZ2V0X2VsdF9hdF9maWxlcG9zLCBkb19zbHVycF9ic2RfYXJtYXAsIG5vcm1hbGl6ZSwKLQlkb19zbHVycF9jb2ZmX2FybWFwLCBiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOgotCVByb3RvdHlwZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKTogUHJvdG90eXBlcy4KLQkqIGxpYmVsZi5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24sIGVsZl9nZXRfc3RyX3NlY3Rpb24pOgotCVByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBSZW5hbWVkIGZyb20gQkZEX01BQ0hJTkVTLgotCShvZmlsZXMpOiBOZXcgdGFyZ2V0LiAgQnVpbGQgYSBsaXN0IG9mIHVuaXF1ZSBmaWxlIG5hbWVzLCBpbiBjYXNlCi0JYW55IGdvdCBkdXBsaWNhdGVkLgotCShUQVJHRVRMSUIpOiBVc2UgbGlzdCBvZiBmaWxlcyBmcm9tIG9maWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBhbmQgQkZEX0JBQ0tFTkRTIGRlcGVuZGluZyBvbgotCW1pbmltYWwtYmZkIGZsYWcgYW5kIHRhcmdldCBtYWtlZmlsZSBmcmFnIGNvbnRlbnRzLgotCi0JKiBlbGZjb2RlLmggKGVsZl9yZWFkKTogRGVsZXRlIHN0YXRpYyBkZWNsYXJhdGlvbiwgc2luY2UgZnVuY3Rpb24KLQloYXMgbW92ZWQuCi0JKGVsZl9tYXBfc3ltYm9scyk6IFdyaXRlIG91dCBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbCBzZWN0aW9ucywgZm9yCi0Jbm93LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEFsbG93IG1hdGNoIGlmIGJvdGggc3ltYm9scyBhcmUKLQlzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHNlY3Rpb24uCi0JKGVsZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHByaW50IG1lc3NhZ2UsIGp1c3QgcmV0dXJuIGZhbHNlLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCi1Nb24gSnVsICA1IDE2OjQ4OjExIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jIChoODMwMF9zY2FuKTogRml4IHBhcnNpbmcgb2YgYXJjaGl0ZWN0dXJlIHN0cmluZy4KLQotRnJpIEp1bCAgMiAxODoyNzowMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGJmZC5oIGFuZCBzdG1wLWJmZC5oLgotCShyZWFsY2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuCi0KLUZyaSBKdWwgIDIgMTQ6NTE6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50KTogIERlbnkgaWYgZmlsZSBpcyBub3Qgb3BlbmVkIHdpdGgKLQl0aGUgcHJvcGVyIG1vZGUsIHNldCBvdXRwdXRfaGFzX2JlZ3VuIGlmIGZpbGUgaXMgb3BlbmVuZWQgZm9yIHVwZGF0ZS4KLQkqIGFvdXR4LmggKGFvdXRfKl9zZXRfc2VjdGlvbl9jb250ZW50KTogIFJlbW92ZSBjaGVja3MgdGhhdCBhcmUgbm93Ci0JZG9uZSBpbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudC4KLQotRnJpIEp1bCAgMiAwOToyNToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJlbW92ZWQgZGVjbGFyYXRpb25zIG9mIHByaW50ZiwgZnByaW50ZiwKLQlmY250bCwgZnJlYWQgYW5kIGZ3cml0ZS4gIFRoZXkgYXJlIGFsbCBlcnJvciBwcm9uZSBmb3Igb25lIHJlYXNvbgotCW9yIGFub3RoZXIuICBDaGFuZ2VkIGRlY2xhcmF0aW9uIG9mIG1lbWNociBmcm9tIGNoYXIgKiB0byBQVFIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJpc2NvcyopOiBOZXcgdGFyZ2V0OyB1c2UgcmlzY29zLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtKi1yaXNjb3MqKTogTmV3IGhvc3Q7IHVzZSByaXNjb3MuCi0JKiBjb25maWcvcmlzY29zLm1oIChIREVGSU5FUyk6IEFkZCAtRyA0LgotCi0JKiBsaWJhb3V0LmggKEdFVF9TV09SRCk6IFVzZSB0aGUgYmZkX2hfZ2V0X3NpZ25lZCBlbnRyeSBwb2ludHMKLQlyYXRoZXIgdGhhbiBjYXN0aW5nIHRoZSByZXN1bHQgb2YgYmZkX2hfZ2V0LgotCi1GcmkgSnVsICAyIDEwOjEzOjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGhvc3RzL2RlbHRhNjguaCwgY29uZmlnL2RlbHRhNjgubWg6IEFkZCBzdHVmZiBmb3IKLQlNb3Rvcm9sYSBEZWx0YSA2OC4KLQotV2VkIEp1biAzMCAwNjowMjo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X3tiaWcsbGl0dGxlfV9nZW5lcmljX3ZlYyk6IERlY2xhcmUsIGFuZAotCWluY2x1ZGUgaW4gc2VhcmNoIGxpc3QgaWYgQkZENjQgaXMgZGVmaW5lZC4KLQotCSogbGliZWxmLmggKENBVDQpOiBBZGRlZCBhIHZlcnNpb24gZm9yIFNhYmVyLUMsIEFOU0kgbW9kZS4KLQkoYmZkX2VsZjY0XyopOiBEZWNsYXJhdGlvbnMgZm9yIDY0LWJpdCB2ZXJzaW9ucyBvZiBtYW55IHJvdXRpbmVzLgotCi1UdWUgSnVuIDI5IDIyOjUwOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmNjQtdGFyZ2V0LmgsIGVsZjY0LWdlbmVyaWMuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogSW5jbHVkZSBlbGY2NC1nZW5lcmljLm8uCi0JKGVsZjY0LWdlbmVyaWMubyk6IExpc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBNYWtlZmlsZS5pbjogTGlzdCB0YXJnZXQgYGFsbCcgZXhwbGljaXRseSBiZWZvcmUgaG9zdC90YXJnZXQKLQltYWtlZmlsZSBmcmFnbWVudHMgYXJlIGluY2x1ZGVkLCBpbiBjYXNlIHRoZXkgZGVmaW5lIGFueSBuZXcKLQl0YXJnZXRzLgotCi0JKiBlbGZjb2RlLmggKEVMRl9SX0lORk8sIEVMRl9SX1NZTSk6IERlZmluZSBhcyAzMi0gb3IgNjQtYml0Ci0JdmVyc2lvbnMgYXMgYXBwcm9wcmlhdGUuICBVc2VzIHVwZGF0ZWQuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRGVjbGFyZSBiZWZvcmUgdXNlLgotCShlbGZfZGVidWdfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24sIGVsZl9mYWtlX3NlY3Rpb25zKToKLQlBbGlnbm1lbnQgdmFsdWUgaW4gc2VjdGlvbiBoZWFkZXIgaXMgbl9ieXRlcywgbm90IGxvZzIuCi0JKG5ld19zZWN0aW9uX2hvb2spOiBEbyBub3RoaW5nIGZvciBub3cuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBFbGZfRXh0ZXJuYWxfUmVsW2FdLCBub3QgMzItYml0Ci0JdmVyc2lvbiBleHBsaWNpdGx5LgotCShlbGZfY29yZV9maWxlX3ApOiBTaW1wbGlmeSBjaGVjayBmb3IgY29ycmVjdCBjbGFzcyAod29yZCBzaXplKS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMsIGVsZl9mYWtlX3NlY3Rpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlJbml0aWFsaXplIGFsbCBmaWVsZHMgd2hlbiBjcmVhdGluZyBkYXRhIHN0cnVjdHVyZXMuCi0JKGVsZl9sb2NhdGVfc2gpOiBSZW5hbWVkIGZyb20gYmZkX2VsZlhYX2xvY2F0ZV9zaCwgbWFkZSBzdGF0aWMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgY29ycmVjdCBjbGFzcyBpbiBvdXRwdXQKLQlmaWxlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiBzeW1ib2xzIGhhdmUgZW1wdHkgbmFtZXMgaW4KLQlvdXRwdXQgZmlsZS4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jLCB6YWxsb2MpOiBCZSBzdXJlIHRvIGNhc3QgbWFsbG9jLCBtZW1zZXQKLQlhcmdzIHRvIHNpemVfdCBiZWZvcmUgY2FsbC4KLQkoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBDYXN0IHphbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZS4KLQotVHVlIEp1biAyOSAxMDo0OTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHByb2NlZHVyZSBoYXMgbm8gbGluZQotCW51bWJlciBpbmZvcm1hdGlvbiwgcmV0dXJuIDAgZm9yIGxpbmUgbnVtYmVyLgotCi1Nb24gSnVuIDI4IDEwOjQ1OjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJZiAqb2xkcmF3cHRyIGlzIG5vbi1OVUxMLCBjb3B5IGl0Ci0JaW50byAqcmF3cHRyLgotCi1TdW4gSnVuIDI3IDA5OjA1OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9yaXNjb3MuaDogRGVmaW5lIE5CUEcgYW5kIFVQQUdFUy4KLQotU3VuIEp1biAyNyAxNjoyODoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIG9ial9yYXdfc3ltcyBhcwotCWx2YWx1ZTsgaXQgY29udGFpbnMgYSBjYXN0LgotCi1GcmkgSnVuIDI1IDE3OjA5OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaGFzaCwgY29tcGFyZSwgc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgYWRkX3RvX3N0cmluZ3RhYik6Ci0JVXNlIHVuc2lnbmVkIGhhc2ggdmFsdWVzIGZvciBiZXR0ZXIgaGFzaGluZy4KLQkoaGFzaCk6IEhhc2ggaW4gdGhlIHN0cmluZyBsZW5ndGggZm9yIGxvbmcgc3RyaW5ncy4KLQotVGh1IEp1biAyNCAxNTo0Nzo1MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGNvbXBhcmUpOiBSZXBsYWNlIDMgaWYncyB3aXRoIGEgc3VidHJhY3Rpb24uCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzLCBhZGRfdG9fc3RyaW5ndGFiKTogUmVvcmRlciB0ZXN0cwotCWluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc3VjY2VzcywgYXMgYW4gb3B0aW1pemF0aW9uLgotCShoYXNoKTogVGFrZSBhIGxlbmd0aCBhcmc7IGlnbm9yZSBjaGFycyBhZnRlciAjMjUsIGZvciBzcGVlZC4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFBhc3MgbGVuZ3RoIHRvIGhhc2guCi0KLVRodSBKdW4gMjQgMTc6MjU6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXNwYXJjLmMgKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBTUEFSQ19XRElTUDIyIHJlbG9jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9uZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT3V0cHV0IGNvbW1vbiBzeW1ib2xzIHRoZSB3YXkgRUxGCi0Jd2FudHMgdGhlbS4KLQotV2VkIEp1biAyMyAxNjoyMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhIGFuZCBhc3NvY2lhdGVkIG1hY3Jvcyk6IE1vdmVkCi0JaGVyZSBmcm9tIGVsZmNvZGUuaC4gIEEgY291cGxlIG9mIHNpemUtc3BlY2lmaWMgc3RydWN0dXJlIHBvaW50ZXJzCi0Jd2VyZSBjaGFuZ2VkIHRvIFBUUjsgdXNlcyBmaXhlZCBhcHByb3ByaWF0ZWx5LgotCShlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBTZXBhcmF0ZWQgZGVmaW5pdGlvbnMuCi0JKGJmZF9lbGZfbWtvYmplY3QpOiBSZW5hbWVkIGZyb20gYmZkX2VsZjMyX21rb2JqZWN0LgotCShiZmRfZWxmMzJfbWtvYmplY3QsIGJmZF9lbGY2NF9ta29iamVjdCwgZWxmX21rb2JqZWN0KTogTmV3Ci0JdGVtcG9yYXJ5IG1hY3JvcyB0byBlYXNlIG5hbWUgY2hhbmdlLgotCSogZWxmLmMgKGVsZl9yZWFkLCBlbGZfbWtvYmplY3QsIGVsZl9nZXRfc3RyX3NlY3Rpb24sCi0JZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IE1vdmVkIGhlcmUKLQlmcm9tIGVsZmNvZGUuaC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobGliYmZkLmgpOiBQcm9jZXNzIGVsZi5jIHRvby4KLQkqIE1ha2VmaWxlLmluIChlbGYubyk6IE5vdGUgbmV3IGRlcGVuZGVuY2llcy4KLQotCSogZWxmY29kZS5oOiBMb3RzIG9mIHN0dWZmIG1vdmVkIGVsc2V3aGVyZS4gIERlbGV0ZWQgc29tZSB1bnVzZWQKLQljb2RlLCB0d2Vha2VkIHNvbWUgZGVidWcgaG9va3MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAotCXNlY3Rpb24gc3ltYm9scy4KLQotV2VkIEp1biAyMyAxMTozNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvcmlzY29zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDIyIDE0OjM1OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgY2FzZSBTSFRfUFJPR0JJVFMpOiBFdmVuIGlmCi0Jc2VjdGlvbiBhbHJlYWR5IGV4aXN0cywgdXNlIGl0cyBwb2ludGVyIHRvIGZpbGwgaW4gcmF3ZGF0YSBzbG90LgotCi1UdWUgSnVuIDIyIDE2OjM2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZXR1cm4gdmFsdWUgb2YgcHV0cyBhbmQgZnB1dHMgaXMgaW50IG5vdCB2b2lkLgotCi1UdWUgSnVuIDIyIDE0OjI1OjU4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQ29tbWVudCB0aGUgZmllbGQgbmFtZXMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IG1heCBhbmQgbWluIHZhbHVlcy4KLQotTW9uIEp1biAyMSAxODoxOToxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjMyLWhwcGEuYywgZWxmY29kZS5oOiBVc2UgbmV3Ci0Jc2l6ZS1pbmRlcGVuZGVudCBlbGYgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotCSogZWxmY29kZS5oIChwdXRfd29yZCwgZ2V0X3dvcmQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCi0JYXJjaGl0ZWN0dXJlIHdvcmQgc2l6ZS4gIFN0cnVjdHVyZSBzd2FwcGluZyBmdW5jdGlvbnMgY2hhbmdlZCB0bwotCXVzZSB0aGVtIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW46IElmIGNvbXBpbGluZyA2NC1iaXQgYmFjayBlbmRzLCBkbyB0aGVtIGJlZm9yZQotCTMyLWJpdCBvbmVzLgotCi0JKiBsaWJlbGYuaDogVXNlIG5ldyBzaXplLWluZGVwZW5kZW50IHZlcnNpb25zIG9mIGVsZiBpbnRlcm5hbCBkYXRhCi0Jc3RydWN0dXJlcy4KLQkoc3ltYm9sX3R5cGUpOiBSZW9yZGVyZWQgdG8gcHV0IGFueSBmaWVsZHMgZGVwZW5kZW50IG9uIHRhcmdldAotCXNpemUgYXQgdGhlIGVuZC4KLQkoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbmFtZWQgZnJvbSBlbGYjI19iYWNrZW5kX2RhdGEgYW5kIG1hZGUKLQlzaXplLWluZGVwZW5kZW50LgotCShlbGZfc2VjdF90aHVuayk6IE5vdyBzaXplLWluZGVwZW5kZW50LgotCi0JKiBsaWJiZmQuYyAoYmZkX2xvZzIpOiBOb3cgcmV0dXJucyB1bnNpZ25lZCBpbnQuCi0KLU1vbiBKdW4gMjEgMTI6MzA6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBjb25maWcvbTg4ay1hb3V0Lm10IHRvIGNvbmZpZy9ub29wLm10LgotCWNvbmZpZ3VyZS5pbjogVXNlIGl0IGZvciBtaXBzLSotYnNkKi4KLQotU3VuIEp1biAyMCAyMDozMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEVsaW1pbmF0ZSAicGFydGlhbGx5IGJyYWNrZXRlZAotCWluaXRpYWxpemVyIiB3YXJuaW5nIGZyb20gZ2NjLgotCSogY3B1LWg4NTAwLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCi0KLQkqIGNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKLQlob3d0b18qKTogVW51c2VkIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNvbW1lbnRlZCBvdXQuCi0JKiBjcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgaG93dG8qX2NhbGxiYWNrLAotCWhvd3RvXyopOiBMaWtld2lzZS4KLQkqIGNwdS1oODUwMC5jIChjb21wYXRpYmxlKTogTGlrZXdpc2UuCi0JKiBjcHUtc2guYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgotCi0JKiBocDMwMGhwdXguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IGEgdmFsaWQgbGVuZ3RoIHZhbHVlLCBldmVuIGZvciBpbnZhbGlkIGlucHV0LgotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6IFVzZSBzcHJpbnRmX3ZtYS4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gsIGludDY0X3R5cGUsCi0JdWludDY0X3R5cGUpOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMuCi0JKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NCBzdHVmZik6IFJlbW92ZSB0aGVtIGZyb20gaGVyZS4KLQotCSogYmZkLWluLmggKHNwcmludGZfdm1hKTogRGVmaW5lIHBhcmFsbGVsIHRvIGZwcmludGZfdm1hLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlLiAgQWRkZWQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEJlZm9yZSBjYXN0aW5nCi0JcG9pbnRlcnMgdG8gaW50ZWdlcnMsIG1ha2Ugc3VyZSB0aGUgaW50ZWdlciB0eXBlIGlzIHdpZGUgZW5vdWdoLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIGBjb3VudCcgaXMgdW5zaWduZWQsCi0JZG9uJ3QgYm90aGVyIGNvbXBhcmluZyBmb3IgbGVzcy10aGFuLXplcm8uCi0JKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCi0JKiBlbGZjb2RlLmggKGJmZF9hZGRfdG9fc3RydGFiKTogTm93IHN0YXRpYy4KLQkoc3ltX2lzX2dsb2JhbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX21hcF9zeW1ib2xzKTogQ2FsbCBpdC4gIE5vdyByZXR1cm5zIHZvaWQuICBSZW1vdmVkIHVudXNlZAotCWxvY2FsIHZhcmlhYmxlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIHN0cmluZyB0YWJsZXMgb3RoZXIgdGhhbiBmb3Igc2VjdGlvbgotCWFuZCBzeW1ib2wgbmFtZXMgYXMgbm9ybWFsIHNlY3Rpb25zIGhhdmluZyBjb250ZW50cy4KLQkoZml4X3VwX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb247IGZpeGVzIHVwIEVMRiBoZWFkZXIgZmllbGRzIGZvcgotCXN0YWIgc2VjdGlvbnMgd2l0aCBzdHJpbmcgdGFibGVzIGFzc29jaWF0ZWQuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYXAgZml4X3VwX3N0cnRhYnMgb3ZlciBhbGwgQkZECi0Jc2VjdGlvbnMuICBSZW9yZGVyZWQgY29uZGl0aW9uIHRlc3RzIGZvciBzeW1ib2wgZmxhZ3M7IGRlZmF1bHQgdG8KLQlsb2NhbC1vYmplY3QgdmFsdWUgaW5zdGVhZCBvZiBnbG9iYWwtb2JqZWN0LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEhpZCBjb25kaXRpb25hbGx5LXVzZWQgdmFyaWFibGUKLQlpbnNpZGUgY29uZGl0aW9uIHRlc3QuCi0JKGVsZl9wcmludF9zeW1ib2wpOiBVc2UgZnByaW50Zl92bWEuCi0JKGVsZl9pZHhfb2Zfc3ltLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBVbnVzZWQgZnVuY3Rpb25zCi0JY29tbWVudGVkIG91dC4KLQotCSogYmZkLWluLmggKGludDY0X3R5cGUsIHVpbnQ2NF90eXBlKTogRGVmaW5lIHRoZXNlIGlmIHdlIGZhbGwKLQliYWNrIHRvICJsb25nIGxvbmciIGZvciBIT1NUXzY0X0JJVC4KLQotCSogbGliZWxmLmggKGVsZk5BTUUsIEVsZk5BTUUpOiBOZXcgdmVyc2lvbnMgdG8gZ2V0IGRlc2lyZWQgcmVzdWx0cwotCXdpdGhvdXQgdXNpbmcgaW52YWxpZCBBTlNJIEMgcHJlcHJvY2Vzc2luZyB0b2tlbnMuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlbGV0ZSBtYWNyby4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKG5ld19zZWN0aW9uX2hvb2spOiBEZWZpbmUgaGVyZS4KLQotCSogaG9zdHMvc3BhcmMuaCwgaG9zdHMvc3RkLWhvc3QuaCwgaG9zdHMvaTM4NmJzZC5oOiBQcm90ZWN0Ci0JYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi0JKiBob3N0cy9uZXdzLmg6IEluY2x1ZGUgaG9zdHMvc3RkLWhvc3QuaCwgbm90IHBsYWluIHN0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IEdlbmVyYXRlIGludG8gY3VycmVudCBkaXJlY3RvcnkgYnkgZ3JhYmJpbmcKLQk2NC1iaXQgZGVmaW5pdGlvbiAoaWYgYW55KSBmcm9tIHN5c2RlcC5oLgotCSogYmZkLWluLmg6IFB1dCBpbiBtYXJrZXIgZm9yIHN5c2RlcC5oIGluY2x1c2lvbi4KLQotRnJpIEp1biAxOCAxOTo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBDaGVjayBmb3Igb3ZlcmZsb3cgb24KLQlwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBpZiB0aGUgaG93dG8gYXNrZWQgZm9yIGl0LgotCi1GcmkgSnVuIDE4IDE2OjAwOjIwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IElnbm9yZSBub256ZXJvIGV4aXQgc3RhdHVzIGZyb20gZ3JlcC4KLQotRnJpIEp1biAxOCAxNjo1NDoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3Jpc2Nvcy5te2gsdH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS57aG9zdCxpbn06IFVzZSB0aGVtLgotCi1GcmkgSnVuIDE4IDEyOjU1OjEwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmM6IGNvbW1lbnQgY2hhbmdlLiAgVGhpcyBpcyBhIG1pcHMgZmlsZSwgbm90IDg4ay4KLQotTW9uIEp1biAxNCAxNDowMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2luaXQpOiBJbmNyZW1lbnQgb3Blbl9maWxlcyBhbmQgY2FsbCBjbG9zZV9vbmUKLQlpZiBuZWNlc3NhcnkuCi0JKGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBpbmNyZW1lbnQgb3Blbl9maWxlcyBoZXJlLgotCi1GcmkgSnVuIDE4IDEwOjAwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taDogRG9uJ3Qgc2V0IENDLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uCi0JZWxmMzIte21pcHMsbTg4ayxnZW5lcmljfS5jOiBOZXcgZmlsZXMuCi0JdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogSW5jbHVkZSBiZmRfZWxmMzJfe21pcHMsbTg4ayxnZW5lcmljfV92ZWMuCi0JZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBNYXRjaCBlbGYzMi1nZW5lcmljIGZvciBhbGwgbWFjaGluZXMgd2hpY2gKLQlkb24ndCBtYXRjaCBhIGRpZmZlcmVudCB0YXJnZXQuCi0KLUZyaSBKdW4gMTggMDM6MTI6MTIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlFbGltaW5hdGUgImludDhfdHlwZSIsICJpbnQxNl90eXBlIiwgImludDMyX3R5cGUiLCBhbmQgdGhlaXIKLQl2YXJpYW50cyBmcm9tIHRoZSBCRkQgdW5pdmVyc2UuICBMZWF2ZSB0aGUgNjQtYml0IHR5cGVzIGZvciBub3csCi0Jc2luY2UgdGhleSBhcmUgaW4gZmx1eC4KLQotCSogYW91dHguaCwgaHAzMDBocHV4LmM6ICBFbGltaW5hdGUgbmVlZGxlc3MgKGludDMyX3R5cGUpIGNhc3RzLgotCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiAgQ29udmVydCAoaW50MzJfdHlwZSkgdG8gKGludCkuCi0JKiBpZWVlLmM6ICBDb252ZXJ0IHVpbnQ4ZV90eXBlID0+IHVuc2lnbmVkIGNoYXIuCi0JKiBvYXN5cy5jOiAgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gZWxpbWluYXRlIG9ic29sZXRlIHR5cGVzLgotCVRoZXNlIGRlcGVuZCBvbiBjaGFuZ2VzIGluIC4uL2luY2x1ZGUvb2FzeXMuaCBhcyB3ZWxsLgotCSogaG9zdHMvKi5oOiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZiBhbGwgdGhlc2UgdHlwZXMuCi0KLU1vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RlbHRhODguaDogI2lmIDAgb3V0IHNvbWUgZGVjbGFyYXRpb25zIHdoaWNoIGNvbmZsaWN0IHdpdGgKLQlzeXN0ZW0gaGVhZGVycy4KLQotTW9uIEp1biAxNCAxNzowODoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogcmVtb3ZlIHBhcmVudGRpciBjcnVmdAotCi1Nb24gSnVuIDE0IDE5OjA0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgUmVtb3ZlIHJlZHVuZGFudCBjb3B5LgotCSogRXhwdXJnYXRlIHJhbmRvbSBERUZVTnMgdGhhdCBoYXZlIGNyZXB0IGluLgotCi1Nb24gSnVuIDE0IDEwOjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbnN0cnVjdG9yIHNlY3Rpb25zIHNob3VsZAotCW9ubHkgYmUgYWxpZ25lZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KLQotU2F0IEp1biAxMiAxNjoxMzoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaCAoc3RydWN0IGludDY0ZV9zdHJ1Y3QpOiBSZW1vdmUgbmVlZGxlc3MgdHlwZWRlZgotCWtleXdvcmQuCi0KLUZyaSBKdW4gMTEgMTQ6MjU6MzQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMSwgYnJlYWtpbmcKLQkxOTI3IGJ1dCBmaXhpbmcgc29tZSBvdGhlciBpbXBvcnRhbnQgdGhpbmdzLgotCi1UaHUgSnVuIDEwIDIwOjM2OjIyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKGludDY0ZV90eXBlKTogRml4IGRlZmluaXRpb24uCi0KLVRodSBKdW4gMTAgMTE6NDg6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBVc2UgU1RZUF9NSVBTX0lOSVQgZm9yCi0Jc2VjdGlvbiBuYW1lZCBfSU5JVC4gIERvbid0IHNldCBTVFlQX1RFWFQgdW5sZXNzIFNFQ19DT0RFIGlzIHNldC4KLQkoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBUcmVhdCBhIFNUWVBfTUlQU19JTklUIHNlY3Rpb24gbGlrZQotCWEgU1RZUF9URVhUIHNlY3Rpb24uCi0KLVdlZCBKdW4gIDkgMTY6NDg6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaGVhZGVycyk6IGRvbid0IHB1dCBjb21tZW50cyBhZnRlciBhIHRhYgotCWluIHRoZSBhY3Rpb25zIHNlY3Rpb24gb2YgYSBydWxlCi0KLVdlZCBKdW4gIDkgMTU6MDA6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IE1hcmsgWk1BR0lDIGZpbGVzIGFzIERfUEFHRUQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIG5vdCBEX1BBR0VELCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBoZWFkZXJzIHRvIHRleHRfc2l6ZS4gIElmIG5vdCBEX1BBR0VELCBzZXQgdGhlIG1hZ2ljCi0JbnVtYmVyIHRvIE9NQUdJQyByYXRoZXIgdGhhbiBaTUFHSUMuICBJZiBjcmVhdGluZyBhIERfUEFHRUQKLQlleGVjdXRhYmxlLCB0aGUgZXhlY3V0YWJsZSBtdXN0IGZ1bGx5IG9jY3VweSBhbiBldmVuIG51bWJlciBvZgotCXBhZ2VzLgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8sIG1ha2VfYmZkX2FzZWN0aW9uLCBlY29mZl9saXR0bGVfdmVjLAotCWVjb2ZmX2JpZ192ZWMpOiBDb25zaXN0ZW50bHkgc2V0IHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyIHRvIDQsCi0Jc2luY2UgRUNPRkYgc2VjdGlvbnMgc2hvdWxkIGJlIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLQkoZWNvZmZfbGl0dGxlX3ZlYywgZWNvZmZfYmlnX3ZlYyk6IEFkZGVkIERfUEFHRUQgdG8gb2JqZWN0X2ZsYWdzLgotCU1hZGUgYXJfcGFkX2NoYXIgYW5kIGFyX21heF9uYW1lbGVuIGFncmVlIGZvciBib3RoLgotCi1UdWUgSnVuICA4IDIwOjI4OjAyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IHN1YnRyYWN0IHNlY3Rpb24gdm1hIGZyb20KLQlzeW1ib2wgdmFsdWUsIHNpbmNlIGJmZCBzeW1ib2xzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQgRUxGCi0Jc3ltYm9scyBhcmVuJ3QuCi0KLVR1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYywgY3B1LWg4MzAwLmMgKGNvbXBhdGlibGUpOiBNYWtlIHN0YXRpYy4KLQotVHVlIEp1biAgOCAxNDoyNzo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL25ld3MuaCwgY29uZmlnL25ld3MubWg6IE5ldyBmaWxlcy4KLQotVHVlIEp1biAgOCAxMjowODoyNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmgsIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwW2hdKTogbmV3IGRlZmluZXMuCi0JKiBjb2ZmLWg4MzAwLmM6IE1vcmUgYWRkcmVzc2luZyBtb2Rlcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQ29wZSB3aXRoIEg4MzAwIG1hZ2ljCi0JbnVtYmVyLgotCSogY3B1LWg4MzAwLmM6IFJlbW92ZWQgZGlzYXNzZW1ibGUgc3R1ZmYuIChoODMwMF9zY2FuKTogUmVjb2duaXNlCi0JSDgvMzAwSCBuYW1lLiAoY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlYyk6IENvcGUgd2l0aCBtb3JlCi0JYWRkcmVzc2luZyBtb2Rlcy4KLQotVHVlIEp1biAgOCAxMDozMDoxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT25seSByb3VuZCB0byBwYWdlIGJvdW5kYXJpZXMgaWYKLQlEX1BBR0VEIGZsYWcgaXMgc2V0IGZvciB0aGUgb3V0cHV0IEJGRC4KLQotRnJpIEp1biAgNCAxNTo0Nzo1MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChnZXRfaW5kZXgsIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRml4IHBvaW50ZXIKLQljYXN0cyB0byB3b3JrIG9uIG1hY2hpbmUgd2hlcmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihpbnQpICE9Ci0Jc2l6ZW9mKGNoYXIgKikuCi0gICAgICAgICogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IERpdHRvLgotCSogY3B1LWg4MzAwLmMgY29mZi1oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSC4KLQotRnJpIEp1biAgNCAxNToyNDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2xzKTogRm9yIGVtcHR5IHN0cmluZyB0YWJsZSwgd3JpdGUKLQlvdXQgNCBpbiBjb3JyZWN0IGJ5dGUgb3JkZXIuICAoZnJvbSBtaW55YXJkQGJuci5jYSkKLQotCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGxpYmhwcGEuaCBmb3Igbm93OyBkZWZpbmUKLQlCWVRFU19JTl9XT1JEIGluc3RlYWQsIHVudGlsIFV0YWggc2VuZHMgYSBiZXR0ZXIgZml4LgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSB4bWFsbG9jIGFuZCB4cmVhbGxvYyBpbnN0ZWFkCi0Jb2YgbWFsbG9jIGFuZCByZWFsbG9jLgotCi1GcmkgSnVuICA0IDA3OjQ5OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBkZWNzdGF0aW9uLgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZ2V0X2RlYnVnKTogR2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgUERSCi0JZm9yIHRoZSBGRFIsIG5vdCBmcm9tIHRoZSBmaXJzdCBQRFIgaW4gdGhlIGZpbGUuCi0KLVRodSBKdW4gIDMgMTY6NDE6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6ICBOZXcgZnVuYyBuZWVkZWQgZm9yIEpVTVBfVEFCTEUuCi0KLVRodSBKdW4gIDMgMTU6MzM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSnVuICAzIDEzOjA3OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBjcmFzaCBpZiBubyBzeW1ib2xzIGhhdmUgYmVlbgotCWFsbG9jYXRlZCB5ZXQuCi0KLQlGcm9tIFBldGVyIEhvb2dlbmJvb20gKGhvb2dlbkBzY2hhZmVyLmNzLnV0YWguZWR1KToKLQkqIGxpYmhwcGEuaCAoTUFYQ09NTEVOKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KLQkoX1BBX1JJU0NfSUQpOiBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBob3N0cy9taXBzYnNkLmggKEhPU1RfREFUQV9TVEFSVF9BRERSKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLQkqIGVsZjMyLWhwcGEuaCAoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFApOiBEZWxldGUgZGVjbHMuCi0KLVRodSBKdW4gIDMgMDA6MjM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogZGVmaW5lIEVYVFJBTElCRVMgdG8gLWxtIChmb3IgYmludXRpbHMpLCBhbHNvCi0JcmVtb3ZlIGRlZmluZXMgb2YgX19NU0RPU19fIGFuZCBfX0dPMzJfXyAodGhlc2UgYXJlIGluIHRoZQotCWNvbXBpbGVyIG5vdykuCi0KLVdlZCBKdW4gIDIgMTc6NTc6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JRnJvbSBVdGFoOgotCSogaG9zdHMvaHBwYWJzZC5oOiBFbGltaW5hdGUgdXNlIG9mIG9ic29sZXRlIEVYRlVOLgotCSogY29uZmlnL2hwcGFic2QubWg6IERvbid0IHVzZSByYW5saWIuCi0KLVR1ZSBKdW4gIDEgMDQ6MTU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBOZXcgZmlsZSwgZm9yIHdvcmQtc2l6ZSBpbmRlcGVuZGVudCBjb2RlLgotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IE1vdmVkIHRvIHRoZXJlLCByZW5hbWVkIGJmZF9lbGZfaGFzaC4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGVsZi5vIGluIHN0YW5kYXJkIG9iamVjdHMuCi0KLQkqIGJmZC1pbi5oIChDQVQzKTogRGVmaW5lIGhlcmUuCi0JKiBsaWJhb3V0LmgsIGxpYmVsZi5oOiBOb3QgaGVyZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbmUgaGVyZS4KLQkoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJlIGhlcmUuCi0JKiBlbGZjb2RlLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbml0aW9uIGRlbGV0ZWQuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkIEhQUEFfUENSRUxfQ0FMTF8xMi4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgImFsbCIsIG5vdCAiYmZkLmgiLCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuCi0JKHN0bXAtYmZkLmgpOiBOZXcgdGFyZ2V0OyBwcmV2ZW50cyByZWJ1aWxkaW5nIHdvcmxkIGlmIGJmZC5oCi0JaGFzbid0IHJlYWxseSBjaGFuZ2VkLgotCi0JVHVlIE1heSAyNSAxMjoxNToxNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IFByb3ZpZGUgZWxmIHN0YW5kYXJkIGhhc2ggZnVuY3Rpb24uCi0JKHZhcmlvdXMpOiBLZXkgb2ZmIG9mIHRoZSBtYWNoaW5lcyB1c2VfcmVsYV9wIGZpZWxkIHRvIGRldGVybWluZQotCXdoZXRoZXIgdG8gdXNlIFJFTCBvciBSRUxBIHJlbG9jYXRpb25zLgotCShlbGZfc3dhcF9yZWxvY19vdXQsIGVsZl9zd2FwX3JlbG9jX2luKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gaG9sZCBhbGwgZGF0YSBmb3IgYQotCWdpdmVuIHNlY3Rpb24sIGFuZCBjb3B5IGVhY2ggZnJhZ21lbnQgaW50byB0aGUgZGF0YSByZWdpb24uCi0JVXBkYXRlIHRoZSBzZWN0aW9uJ3MgcG9pbnRlciB3aXRoIHRoZSBSRUwgaW1wbGljaXQgYWRkZW5kcyBpZiB0aGUKLQltYWNoaW5lIHVzZXMgUkVMIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSB0bwotCWVsZl9pMzg2X2JmZF9yZWxvY190eXBlX2xvb2t1cCwgYW5kIHVzZSBjcHAgdG8gbWFwIHRoZSBuYW1lIGJhY2sKLQlpbnRvIHdhcyBlbGYzMi10YXJnZXQuaCBleHBlY3RzLgotCShlbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSB0byBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgcmVsb2NhdGlvbiBzdXBwb3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogQWRkIG1pbmltYWwgcmVsb2NhdGlvbiBzdXBwb3J0LgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB1c2VfcmVsYV9wLCBlbGZfNjRfcCwKLQllbGZfaW5mb190b19ob3d0b19yZWwgZmllbGRzLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JlZCk6IEFkZCBzdXBwb3J0IGZvciBuZXcgZmllbGRzIGluCi0JZWxmX2JhY2tlbmRfZGF0YS4KLQotCVN1biBNYXkgMzAgMTY6Mzg6MjQgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGYzMi1ocHBhLmg6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGZjb2RlLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogTmV3IGZ1bmN0aW9uIHRvIGxvY2F0ZSBFTEYKLQlzZWN0aW9uIGhlYWRlci4KLQotCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE1hZGUgbm9uLXN0YXRpYyBkdWUgdG8gYSBjYWxsCi0JZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2lkeF9vZl9zeW0pOiBSZXR1cm4gU1ROX1VOREVGIGluc3RlYWQgb2YgMCB3aGVuCi0JdGhlIHN5bWJvbCBpcyBub3QgZm91bmQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE5vdCBhbGwgc2VjdGlvbgotCWZpbGUgcG9zaXRpb25zIHdlcmUgY29tcHV0ZWQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zZWN0X3RodW5rKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLmMgKHNpZ25fZXh0KTogUmVpbXBsZW1lbnQuCi0KLQkqIGhwcGEuYyAocm91bmRfZG93bixyb3VuZCxyb3VuZF91cCxMLFIsTFMsUlMsTEQsUkQsTFIsUlIpOiBNYWtlCi0JdGhlc2UgZnVuY3Rpb25zIHN0YXRpYy4KLQotVHVlIEp1biAgMSAxNDo0MDo0MSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6ICBNb3ZlIGNsb3NlciB0byBoZWFkZXJzIC0gYW5kIGFmdGVyICdhbGwnIQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogIERvbid0IHNldAotCUJTRl9ERUJVR0dJTkcgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMsIG9ubHkgQlNGX0NPTlNUUlVDVE9SLgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiAgVHJhbnNsYXRlCi0JY29uc3RydWN0b3Igc3ltYm9scyBwcm9wZXJseS4KLQotVGh1IE1heSAyNyAxNjowOTowNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCk6IHVzZSA0IGJ5dGUgYWxpZ25tZW50IGFzIGEKLQltaW5pbXVtLgotCSogYW91dC10YXJnZXQuaCAobWluaW11bV9hbGlnbm1lbnQpOiA4IGJ5dGUgYWxpZ25tZW50IGlzIHJpZ2h0LgotCShmaXggbGQvMjY4MCkKLQotVGh1IE1heSAyNyAxMzozODo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IEJ1aWxkIGJmZC1pbjIuaCBpbiBzb3VyY2UgZGlyZWN0b3J5LAotCWZyb20gYmZkLWluLmggYW5kIC5jIGZpbGVzLiAgQnVpbGQgYmZkLmggaW4gYnVpbGQgZGlyZWN0b3J5LAotCXN1YnN0aXR1dGluZyBpbiByZXF1ZXN0ZWQgdGFyZ2V0IHdvcmQgc2l6ZS4gIEluc2VydCB3b3JkIHNpemUgaW50bwotCW1ha2VmaWxlLCBhbmQgbWF5YmUgZW5hYmxlIDY0LWJpdCB0YXJnZXRzLgotCi0JKiBiZmQtaW4uaCwgbGliYmZkLmMsIGRlbW82NC5jLCB0YXJnZXRzLmM6IERlZmluZSBCRkQ2NCBpZiA2NCBiaXRzCi0JYXJlIGF2YWlsYWJsZS4gIENvbmRpdGlvbmFsaXplIG9uIHRoaXMuICBBc3N1bWUgSE9TVF82NF9CSVQKLQl3aWxsIGJlIGRlZmluZWQgaWYgbmVlZGVkLCBzbyA2NC1iaXQgdGFyZ2V0cyBhcmUgY29uZGl0aW9uYWxpemVkCi0Jb25seSBpbiB0aGUgTWFrZWZpbGUuCi0KLVR1ZSBNYXkgMjUgMTQ6MDM6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoQ09FUkNFNjQpOiBSZXdyaXRlIHRvIGF2b2lkIG91dC1vZi1yYW5nZSB2YWx1ZXMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBQdXQgZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIuCi0JKGV4dHJhX2Nhc2UpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBiZmRfdm1hIHZhbHVlcyB0byBsb25nCi0JYmVmb3JlIGNhbGxpbmcgcHJpbnRmLgotCi0JKiBlbGZjb2RlLmg6IE5ldyBmaWxlLCBhbG1vc3QgY29tcGxldGVseSBkZXJpdmVkIGZyb20gb2xkIGVsZjMyLmMuCi0JKiBlbGYzMi5jOiBOb3cganVzdCBkZWZpbmUgQVJDSF9TSVpFIGFuZCBpbmNsdWRlIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluIChlbGY2NC5vKTogTGlzdCBkZXBlbmRlbmNpZXMsIGRvbid0IGJ1aWxkIGJ5Ci0JZGVmYXVsdC4KLQkoZWxmNjQuYyk6IEFkZCB0byBsaXN0IG9mIHNvdXJjZXMuCi0JKGVsZjMyLm8pOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogZWxmMzItKi5jOiBVcGRhdGVkIHR5cGUvbWFjcm8vc3RydWN0dXJlIG5hbWVzLiAgQ2xlYW5lZCB1cAotCW5hbWVzcGFjZSBwb2xsdXRpb247IHJlbmFtZSB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jLCBjb25maWcvKi1lbGYubXQ6IFVwZGF0ZWQuCi0JKiBBbGwgdXNlcyBvZiAzMi1iaXQgdmVyc2lvbnMgb2Ygc3RydWN0dXJlcywgcm91dGluZXMsIGFuZCBtYWNyb3MKLQlyZW5hbWVkLgotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMubywgdGFyZ2V0cy5vKTogRGVwZW5kIG9uIE1ha2VmaWxlLgotCi1Nb24gTWF5IDI0IDE1OjUzOjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IE5vIGNvbW1hIGFmdGVyIGxhc3QgZW51bWVyYXRvci4KLQotCSogZWxmMzIuYyAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogSGFuZGxlIGluZGV4IG9mIHplcm8KLQlzcGVjaWFsbHkuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IG5lZWQgdG8gZG8KLQlzbyBoZXJlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVsZXRlZCBvbmUgdW51c2VkIHZhcmlhYmxlIGFuZAotCWluaXRpYWxpemVkIGFub3RoZXIgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi1GcmkgTWF5IDIxIDE5OjA0OjIxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmM6ICBOZXcgbW9kdWxlIGZvciBMeW54IHZhcmlhbnQgb2YgYS5vdXQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0JBQ0tFTkRTIENGSUxFUyBkZXBlbmRzKTogIEFkZCBpMzg2bHlueC5jLgotCSogZ2VuLWFvdXQuYzogIEdldCByaWQgb2YgZGVmdW5jdCBlbmRpYW4gc3R1ZmYsIHByaW50IG91dCB0cnVlCi0JcGFnZXNpemUuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQWRkIGkzODZseW54X3ZlYy4KLQotRnJpIE1heSAyMSAxNzowMjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgaTM4Ni1zY28ubXQgZm9yIGlbMzZdODYtKi1pc2MqLgotCi1GcmkgTWF5IDIxIDEzOjQ0OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC10YXJnZXQuaCwgYW91dHguaCwgY29mZi1hbHBoYS5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmZ2VuLmMsIGVsZjMyLmMsIGllZWUuYywgbGliYW91dC5oLCBsaWJjb2ZmLWluLmgsCi0JbGliZWxmLmgsIG1pcHNic2QuYywgb2FzeXMuYywgc2NvLWNvcmUuYywgc3JlYy5jLCB0ZWtoZXguYywKLQl0cmFkLWNvcmUuYzogRGVmaW5lIGEgVEFSR0VUX2dldF9zeW1ib2xfaW5mbyBmdW5jdGlvbiBvciBtYWNyby4KLQlSZW1vdmUgdGhlIGJmZF9wcmludF9zeW1ib2xfbm0gY2FzZSBmcm9tIFRBUkdFVF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC1pbi5oOiBEb24ndCBkZWZpbmUgYmZkX3ByaW50X3N5bWJvbF9ubS4KLQlEZWZpbmUgc3ltYm9sX2luZm8gdHlwZS4KLQkoSlVNUF9UQUJMRSk6IFNldCBfZ2V0X3N5bWJvbF9pbmZvIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUsIGJmZF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBVc2UgY29mZl9zZWN0aW9uX3R5cGUuCi0KLQkqIHRhcmdldHMuYzogQWRkIGJmZF9nZXRfc3ltYm9sX2luZm8gY2FsbC4KLQotV2VkIE1heSAxOSAxNTozMDo1MiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIGF2b2lkCi0JY29tcGxhaW50cyBmcm9tIGFuY2llbnQgZ2NjJ3MuCi0KLVdlZCBNYXkgMTkgMTU6NTE6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jOiAgQ2hlY2sgbWFjcm8gVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRC4KLQlob3N0cy9pMzg2bGludXguaDogIERlZmluZSBpdC4KLQotTW9uIE1heSAxNyAxNTowMDozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogVkVSU0lPTiwgYmZkLWluLmg6IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi4yLgotCi0JKiBocHBhLmMgKGFzc2VtYmxlXzMsIGRpc19hc3NlbWJsZV8zLCBhc3NlbWJsZV8xMiwKLQlkaXNfYXNzZW1ibGVfMTIsIGFzc2VtYmxlXzE3LCBkaXNfYXNzZW1ibGVfMTcsIGFzc2VtYmxlXzIxLAotCWRpc19hc3NlbWJsZV8yMSwgc2lnbl9leHQsIG9uZXMsIHNpZ25fdW5leHQsIGxvd19zaWduX2V4dCwKLQlsb3dfc2lnbl91bmV4dCwgcm91bmRfZG93biwgcm91bmQsIHJvdW5kX3VwLCBMLCBSLCBMUywgUlMsIExELCBSRCwKLQlMUiwgUlIsIGhwcGFfZmllbGRfYWRqdXN0KTogTmV3IGZ1bmN0aW9ucy4KLQotTW9uIE1heSAxNyAxMDowNDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBBZGRlZCBzdXBwb3J0IGZvciBpbmRpcmVjdAotCXN0YWJzIHN5bWJvbHMsIGluY2x1ZGluZyBuZXcgaW5kaXJlY3RfcHRyX3B0ciBhcmd1bWVudC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUGFzcyBuZXcgYXJndW1lbnQgaW4gY2FsbHMgdG8KLQllY29mZl9zZXRfc3ltYm9sX2luZm8uCi0KLUZyaSBNYXkgMTQgMDA6MDU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBtNjhrIHN5c3Ygc3lzdGVtcywgdXNlIG02OGstY29mZi4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBERUZBVUxUX1ZFQ1RPUiBoZXJlLgotCShUREVGQVVMVFMpOiBEZWZpbmUgaXQgaGVyZS4gIFVzZSB0aGUgbmV3IG5hbWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfYmFja2VuZF9kYXRhKTogRGVsZXRlOyByZWx5IG9uIGRlZmF1bHQKLQl2YWx1ZXMgaW5zdGVhZC4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIHNvbWUgSFBQQSByZWxvYyB0eXBlcy4KLQotCSogYWl4Mzg2LWNvcmUuYyAoTk9fR0VUUyk6IEZpeCBQUk9UTyBpbnZvY2F0aW9uIHRvIGhhdmUgY29ycmVjdAotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IEluaXRpYWxpemUgY29yZV9zaXplIHRvIGNvcnJlY3QgdmFsdWUuCi0KLVdlZCBNYXkgMTIgMTQ6Mzk6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLCBzZXQgdG8gJChDQykuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0NfRk9SX0JVSUxELgotCi0JKiBib3V0LmMgKGFvdXQzMl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lIHRvIGJlCi0JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIHJhdGhlciB0aGFuIGJmZF90cnVlLgotCi0JKiBjb2ZmLW1pcHMuYzogSW5jbHVkZSBsaWJhb3V0LmggYW5kIGFvdXQvYW91dDY0LmggdG8gZ2V0Ci0JZGVmaW5pdGlvbnMgZm9yIE5fU0VUW0FUREJdLgotCShlY29mZl9ob3d0b190YWJsZSk6IE1vdmVkIG5lYXIgdG9wIG9mIGZpbGUuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IElmIGEgU1RBQlMgc3ltYm9sIG9mIHR5cGUgTl9TRVRbQVREQl0gaXMKLQlzZWVuLCBjb29rIHVwIGEgY29uc3RydWN0b3Igc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGFuZCBwdXQgaW4gYQotCXJlbG9jIHBvaW50aW5nIHRvIHRoZSBzeW1ib2wuICBUaGlzIGxldHMgdGhlIEdOVSBsaW5rZXIgYnVpbGQKLQlnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyB3aXRob3V0IHVzaW5nIGNvbGxlY3QuCi0KLVR1ZSBNYXkgMTEgMDA6MzM6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChtODhrYmNzX3ZlYyk6ICBTeW1ib2xzIGhhdmUgdW5kZXJiYXJzLgotCi1Nb24gTWF5IDEwIDA1OjU1OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9taW5pZnJhbWUuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGl0LgotCi1TdW4gTWF5ICA5IDE2OjM2OjU5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotYnNkKTogIENoYW5nZSB0byBocHBhKi0qLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ocHV4KTogIENoYW5nZSB0byBocHBhKi0qLWhwdXgqCi0JKiBjb25maWd1cmUuaW4gKG02OCotaHAtYnNkKTogIENoYW5nZSB0byBtNjgqLWhwLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWhwdXgpOiAgQ2hhbmdlIHRvIG02OCotKi1ocHV4KgotCSogY29uZmlndXJlLmluICgqLSotYnNkKTogIENoYW5nZSB0byAqLSotYnNkKgotCi1XZWQgTWF5ICA1IDE2OjA4OjMyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogIENhc3QgZW51bXMgdG8KLQlpbnQsIGZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCi0KLU1vbiBNYXkgIDMgMTQ6Mzc6MDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgY3B1LXNoLmMgYW5kIGNvZmYtc2guYy4KLQotTW9uIE1heSAgMyAxNDowMzoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBHZXQgdGFyZ2V0IG5hbWUgcmlnaHQgZm9yIG02OCotKi1ocHV4LgotCi1TdW4gTWF5ICAyIDExOjM5OjQ0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAoTk9fU0lHTkVEX0dFVCk6ICBOZXcgbWFjcm8uCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBVc2UgbmV3IE5PX1NJR05FRF9HRVQgaW5zdGVhZCBvZgotCXNpZ25lZCBOT19HRVQsIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1saW51eCopOiAgQWRkOyBiZmRfdGFyZ2V0ID0gaTM4Ni1saW51eC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWxpbnV4Kik6ICBSZW1vdmUgdW50aWwgbGludXggcG9ydCBmb3IgYQotCW5vbi1pMzg2L2k0ODYgc3lzdGVtIGlzIGFjdHVhbGx5IGF2YWlsYWJsZS4KLQotRnJpIEFwciAzMCAyMDowNDoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6ICAjdW5kZWYgZV8qIHN5bWJvbHMgd2hpY2ggY29tZSBmcm9tIDxtYWNoaW5lL3NvbS5oPgotCXdoZW4gY29tcGlsaW5nIHVuZGVyIEhQVVguCi0KLUZyaSBBcHIgMzAgMTc6MjU6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS5jIChocHBhX2NvcmVfZmlsZV9wKTogUHJvdmlkZSBhIHRlbXBvcmFyeSBkdW1teSByb3V0aW5lCi0JZm9yIEhPU1RfSFBQQUJTRC4KLQkqIGJmZC9ob3N0cy9ocHBhYnNkLmg6IEZpeCBkZWNsYXJhdGlvbnMgb2YgbWFsbG9jIGFuZCBmcmVlLgotCSogYmZkL2xpYmhwcGEuaDogSW5jbHVkZSBzeXNkZXAgaGVyZS4gIENvbmRpdGlvbmFsaXplCi0JaW5jbHVkZXMgYmFzZWQgb24gSE9TVF9IUFBBSFBVWCBvciBIT1NUX0hQUEFCU0QuCi0JUHJvdmlkZSBkZWZpbml0aW9ucyBmb3IgTUFYQ09NTEVOIGFuZCBfUEFfUklTQ19JRCBzdWl0YWJsZQotCWZvciBCU0QuCi0KLUZyaSBBcHIgMzAgMTc6MzQ6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmM6IERvbid0IGluY2x1ZGUgYS5vdXQuaC4gIEFwcGFyZW50bHkgbm90IGV2ZW4gdGhlCi0JR05VIHZlcnNpb24gaXMgbmVlZGVkLgotCi1GcmkgQXByIDMwIDA5OjM4OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiB1c2UgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyByYXRoZXIgdGhhbiBjYXN0aW5nIGFib3J0LgotCi1UaHUgQXByIDI5IDExOjMwOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgZWxmMzItaHBwYS5vLgotCi0JKiBzeW1zLmMgKEJTRl9GVU5DVElPTik6IE5ldyBzeW1ib2wgZmxhZy4KLQotCSogZWxmMzItaHBwYS5jOiBGaXhlZCB0byB3b3JrIHdpdGggZWxmMzItdGFyZ2V0LmguCi0KLQkqIGhwMzAwaHB1eC5jIChOQU1FLCBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBGaXggZm9yCi0JdHJhZGl0aW9uYWwgQy4KLQkqIGxpYmFvdXQuaCAoTkFNRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGxpYmVsZi5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoZWxmX3N5bWJvbF90eXBlKTogTW92ZWQgaGVyZSwgYWRkZWQgbmV3IGZpZWxkcy4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgYGdsb2JhbF9zeW0nOyBJIHN1c3BlY3QgdGhpcwotCW1heSBiZSBtaXNwbGFjZWQuCi0JKiBlbGYzMi5jIChlbGZfc3ltYm9sX3R5cGUpOiBEZWxldGVkIGZyb20gaGVyZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGRzIHJhd19zeW1zIGFuZCBpbnRlcm5hbF9zeW1zLCB0bwotCXBvaW50IHRvIGJhY2tlbmQgdmVyc2lvbnMgb2Ygc3ltYm9scy4KLQkob2JqX3N5bWJvbHMsIG9ial9yYXdfc3ltcywgb2JqX2ludGVybmFsX3N5bXMpOiBOZXcgbWFjcm9zLgotCShlbGZfc3dhcF9waGRyX291dCwgZWxmX2J1aWxkX3BoZHJzLCBlbGZfd3JpdGVfcGhkcnMpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBXcml0ZSBwcm9ncmFtIGhlYWRlcnMgaWYgYXBwcm9wcmlhdGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVubmFtZWQgc2VjdGlvbnMgZ2V0IGVtcHR5IHN0cmluZyBmb3IKLQluYW1lLCBub3QgInVubmFtZWQiLiAgSGFuZGxlIFNIVF9OT0JJVFMgc2VwYXJhdGVseSBmcm9tCi0JU0hUX1BST0dCSVRTLCBhbmQgc2V0IHNvbWUgZGlmZmVyZW50IGZsYWdzLgotCShlbGZfZmlsZV9wKTogTmV3IHJvdXRpbmUuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogQ2FsbCBpdC4KLQkoZWxmX29iamVjdF9wKTogSGFuZGxlIEVNX0hQUEEuCi0JKGVsZl9zeW1ib2xfZnJvbSwgZWxmX2lkeF9vZl9zeW0pOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IEdldCBzeW1ib2wgbnVtYmVyIHJpZ2h0IGZvciByZWxvY2F0aW9ucy4gIFNldAotCVNIRl9BTExPQywgU0hGX1dSSVRFLCBTSEZfRVhFQ0lOU1RSIHdoZW4gYXBwcm9wcmlhdGUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQlNTIHNlY3Rpb24gc2hvdWxkIGJlIFNIVF9OT0JJVFMsIG5vdAotCVNIVF9QUk9HQklUUy4gIEFsd2F5cyBnZW5lcmF0ZSBzeW10YWIgYW5kIHN0cnRhYiwgbm90IG9ubHkgaWYKLQlyZWxvY2F0aW9ucyBhcmUgbmVlZGVkLiAgU2V0IFNIRl8qIGZsYWdzIGFzIGFwcHJvcHJpYXRlLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlIGJmZF9hcmNoX2hwcGEuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBzeW1ib2wgY291bnQuCi0JU3RvcmUgYSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgc3ltYm9sOyB3cml0ZSB0aGUgc2l6ZSBmaWVsZAotCXByb3Blcmx5OyBtYWtlIHNvbWUgZ3Vlc3NlcyBhYm91dCB0aGUgdHlwZSBmaWVsZC4gIFNldCBzZWN0aW9uCi0JdHlwZSBjb3JyZWN0bHkgZm9yIHN0cmluZyB0YWJsZXMuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDaGVjayBmb3IgYWJzb2x1dGUgYW5kIGNvbW1vbiBzZWN0aW9ucwotCWZpcnN0LgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGl0dG8uCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgZWxmX3N5bWJvbF90eXBlIGluc3RlYWQgb2YgYXN5bWJvbC4KLQlVc2UgZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgInVubmFtZWQiIGZvciBuYW1lbGVzcyBzeW1ib2xzLgotCUhhbmRsZSBTVFRZX0ZVTkMgdHlwZSwgYW5kIHdlaXJkbmVzcyB3aXRoICIkZ2xvYmFsJCIgc3ltYm9sIGZvcgotCUhQUEEgKG9ubHk/KS4gIERvbid0IGZyZWUgcmF3IHN5bWJvbHM7IGtlZXAgdGhlIHBvaW50ZXIgYXJvdW5kIGZvcgotCWxhdGVyLgotCShlbGZfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgotCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IHJldHVybiBmYWxzZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cywgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0Ci0Jb3V0cHV0X2hhc19iZWd1biBmaWVsZCBhZnRlciBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFdyaXRlIHNlY3Rpb24gY29udGVudHMgaW1tZWRpYXRlbHksCi0JcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgd2hvbGUgZmlsZSBhbmQgd3JpdGluZyBpdCBhdCBjbG9zZSB0aW1lLgotCi0JKiBsaWJocHBhLmggKGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBfYWx0LCBlbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19leHByX3R5cGVfYWx0KTogTmV3IGVudW1lcmF0b3IgdHlwZXMuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCwuIGNvbmZpZy9ocHBhb3NmLm1oOiBIUCBQQS9PU0Ygc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlLmhvc3Q6IFVzZSB0aGVtLgotCi1XZWQgQXByIDI4IDIzOjIxOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0Lmg6IEFsbG93IG92ZXJyaWRlcyBvZiBhcm1hcCBkZWZhdWx0cy4KLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IE5ldyBmaWxlcy4KLQotCSogY29uZmlnL2hwMzAwaHB1eC5tdDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMDU6Mzk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBOZXcgbWFjcm87IE5PX0dFVCBmb3Igc2lnbmVkIHZhbHVlcy4KLQkoYWl4Mzg2X2NvcmVfdmVjKTogVXBkYXRlIGZvciBuZXcgZmllbGRzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IENhbGwgdGFyZ2V0LXNwZWNpZmljCi0Jc2x1cnBfYXJtYXAgY29kZSwgaW5zdGVhZCBvZiBiZmRfc2x1cnBfYXJtYXAuCi0JKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERlY2xhcmUgaXQuCi0JKiBhb3V0LXRhcmdldC5oIChBUl9QQURfQ0hBUik6IERlZmluZSBpdCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSh2ZWMpOiBVc2UgaXQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IE5ldyBmaWVsZCBmb3Igc3ViZm9ybWF0LCBmb3IKLQlkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBoaWdobHkgc2ltaWxhciBhLm91dCBmb3JtYXRzLgotCSogYW91dHguaCAoTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogTmV3IG1hY3JvLCBkZWZhdWx0cyB0byBsb2NhbAotCXZlcnNpb24gb2YgZnVuY3Rpb24uCi0JKHN3YXBfZXhlY19oZWFkZXJfaW4pOiBEb24ndCBkZWZpbmUgaWYgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCSogaHAzMDBocHV4LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmM6IFN1cHBvcnQgZm9yCi0JSGl0YWNoaSBTSC4KLQotTW9uIEFwciAyNiAxMzo1NTo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENoZWNrIHRoZSBmaWxlIHNpemUuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSBmdW5jdGlvbiBhbmQgYWRkIHdhcm5pbmdzLgotCi1Nb24gQXByIDI2IDExOjI1OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogQWRkIGluaXRpYWxpemVycyBmb3IgbmV3IHRhcmdldAotCWZpZWxkcy4KLQotU2F0IEFwciAyNCAyMTozMzo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCBbX0xJVF06IFJlY29nbml6ZSAubGl0IHNlY3Rpb24uCi0KLUZyaSBBcHIgMjMgMTk6MDA6MzYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYywgY3B1LWFscGhhLmMsIGNvbmZpZy9hbHBoYW9zZi5tdCwKLQljb25maWcvYWxwaGFvc2YubXQsIGhvc3RzL2FscGhhb3NmLmg6ICBOZXcgZmlsZXMuCi0KLUZyaSBBcHIgMjMgMTY6NDg6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgaW4gSFBQQS9CU0QgY2hhbmdlcyBmcm9tIFV0YWguCi0JKiBocHBhLmM6ICBVc2UgdGhpcyBmb3IgYm90aCBIUFVYICYgQlNELgotCSogdGFyZ2V0cy5jOiAgRW5hYmxlIGhwcGFfdmVjIGZvciBib3RoIEhQVVggJiBCU0QuCi0JKiBjb25maWcvaHBwYWJzZC5tdDogIFRERUZJTkVTID0+IFRERUZBVUxUUy4KLQkqIGhvc3RzL2hwcGFic2QuaDogICNkZWZpbmUgSE9TVF9IUFBBQlNELgotCi1XZWQgQXByIDIxIDAxOjUwOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogIFdoaXRlc3BhY2UgY2hhbmdlcyBhcm91bmQgYnl0ZXN3YXAgbWFjcm9zLgotCSogbGliYmZkLWluLmg6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIGRlY2xhcmF0aW9ucy4KLQotVHVlIEFwciAyMCAxNTo1OTowNyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIERvbid0IGRlZmF1bHQgYmZkX2Vycm9yIHRvCi0Jc3lzdGVtX2Vycm9yIGFueW1vcmUuICBJdCBjb25mdXNlcyBiZmRfY2hlY2tfZm9ybWF0KCkuCi0KLU1vbiBBcHIgMTkgMjM6MDM6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBBZGQgc2dpX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGNvZmYtbWlwcy5jOiAgQWRkIElyaXggNC54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaXJpeDQuaDogICNkZWZpbmUgSE9TVF9JUklYNC4KLQotTW9uIEFwciAxOSAxODo1Mjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIHRoYXQgdGhlCi0Jc3ltYm9sJ3Mgc2VjdGlvbiBkb2VzIGdldCBzZXQuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFplcm8gaW5kZXggbWVhbnMgbnVsbC1zdHJpbmcgbmFtZS4KLQotCSogYW91dHguaCAoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogTmV3Ci0JZGF0YSBzdHJ1Y3R1cmVzLgotCShoYXNoLCBzdHJpbmd0YWJfaW5pdCwgYWRkX3RvX3N0cmluZ3RhYiwgZW1pdF9zdHJ0YWIsIGNvbXBhcmUpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHdyaXRlX3N5bXMpOiBVc2UgdGhlbSwgdG8gcmVkdWNlIHN0cmluZyB0YWJsZSBzaXplLgotCi1Nb24gQXByIDE5IDE2OjQ1OjEyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBBZGQgNiBuZXcgaW5pdGlhbGl6ZXJzIHRvIG1hdGNoCi0JICBuZXcgc2lnbmVkIGdldC9wdXQgZmllbGRzLiAgTWlub3IgcmVmb3JtYXR0aW5nIHRvIGxhYmVsCi0JICBzb21lIGZpZWxkcy4KLQotTW9uIEFwciAxOSAwNjowOTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEluc2VydCBjb21tZW50IGFib3V0IFNWUjMgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGhvc3RzL3tocDMwMCxpMzg2aXNjLGkzODZ2fS5oOiBSZW1vdmUgdW51c2VkICNkZWZpbmVzIG9mIHtyLH1pbmRleAotCShiZmQgdXNlcyBzdHJjaHIgYW5kIHRoZSBicm9rZW4gU1ZSMy4yIGNwcCBsb3NlcyB3aXRoIHRoZSBkZWZpbmVzKS4KLQotCSogbGliYmZkLmM6IGJmZF9wdXQqOiBSZW1vdmUgY2FzdHMgdG8gYmZkX3ZtYS4KLQotRnJpIEFwciAxNiAxNzo0OToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGludGVybmFsX3N1bm9zX2NvcmUpOiBNYWtlIGNfc3RhY2t0b3AgYSBiZmRfdm1hLgotCShzd2FwY29yZV9zcGFyYyk6IE1ha2Ugc3AgYSBiZmRfdm1hLgotCi1UaHUgQXByIDE1IDA5OjA5OjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogQWRkIHNpZ25lZCB2ZXJzaW9ucyBvZiBiZmRfe2hfLH17Z2V0LHB1dH1fc2lnbmVkXzxzaXplPi4KLQlsaWJiZmQuYywgbGliYmZkLWluLmg6IEFkZCBfZG8qc2lnbmVkKi4KLQl0YXJnZXRzLmMsIGFsbCB0YXJnZXRzOiBBZGQgYmZkKnNpZ25lZCouCi0JYmZkLWluLmg6IEFkZCBiZmRfc2lnbmVkX3ZtYS4gIEFkZCBjb21tZW50cy4KLQotCSogYmZkLWluLmggKGJmZF9lcnJvciksIGJmZC5jIChiZmRfZXJybXNncyk6IEFkZCBmaWxlX3RydW5jYXRlZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19lcnJvcik6IENoZWNrIGVycm9yIHJldHVybiBmcm9tCi0JX2JmZF9jaGVja19mb3JtYXQgcm91dGluZXMuCi0KLVdlZCBBcHIgMTQgMjM6NDg6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogSW1wcm92ZSBlcnJvciBjaGVja2luZyBhbmQKLQlyZWNvZ25pemUgLmRhdGEgc2VjdGlvbiBpZiBwcmVzZW50LgotCi1UaHUgQXByIDE1IDAxOjAwOjI5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0XypfYWRqdXN0X3NpemVzX2FuZF92bWFzKTogIEF2b2lkIGBzYW5pdHknCi0JY2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIHNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIEJTUwotCXNlY3Rpb24gKGFuZCB0aGUgZmlsZSBoZWFkZXIgY2FuJ3Qgc3BlY2lmeSB0aGlzKS4gIExldCB0aGUgdXNlcgotCXNldCBpdCB3aGVyZXZlciB0aGV5IHdhbnQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBnb2VzIGluIHRoZSBoZWFkZXIuCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6ICBQYXNzIGFsbCBpZWVlIHNlY3Rpb24gbmFtZXMKLQlzdHJhaWdodCB0aHJvdWdoIGludG8gQkZEIHNlY3Rpb25zLiAgQWRkIGNvbW1lbnRzLgotCi1XZWQgQXByIDE0IDIwOjM0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cCBpbiBwcmVwYXJhdGlvbiBmb3IgYmV0dGVyIDY0LWJpdCBob3N0IHN1cHBvcnQuCi0KLQkqIGJmZC1pbi5oIChiZmRfNjRfdHlwZSk6ICBSZW1vdmUuCi0JKiBsaWJiZmQuYyAoX2RvX2dldGI2NCwgX2RvX3B1dGI2NCk6ICBVc2UgYmZkX3ZtYSwgbm90IGJmZF82NF90eXBlLgotCi0JKiBiZmQtaW4uaCAoYmZkX3NpemUpOiAgUmVtb3ZlLgotCi0JKiBiZmQtaW4uaCAoYmZkX29mZnNldCk6ICBSZW1vdmUsIGFmdGVyIGZpeGluZyBsZC9sZGxhbmcuW2NoXS4KLQotCSogYmZkLWluLmggKGJmZF93b3JkKTogIFJlbW92ZS4KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiAgUmVwbGFjZSBiZmRfd29yZCB3aXRoIGJmZF92bWEuCi0KLQkqIGJmZC1pbi5oIChyYXdkYXRhX29mZnNldCk6ICBSZW1vdmUuCi0JKiByZWxvYy5jIChhcmVsZW50KTogIFJlcGxhY2UgcmF3ZGF0YV9vZmZzZXQgd2l0aCBiZmRfc2l6ZV90eXBlLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogIExpbnQuCi0JKGVudW0gYmZkX3JlbG9jX3N0YXR1cyk6ICBDb21tZW50IGNsZWFudXAuCi0KLQkqIGFvdXQtYWRvYmUuYywgY3B1LWg4MzAwLmMsIG1pcHNic2QuYywgc3JlYy5jOiBsaW50IC1XYWxsLgotCi1UdWUgQXByIDEzIDExOjE5OjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiBHdWVzcyB0aGUgcmlnaHQgdmFsdWUgb2YgVVNSU1RBQ0suCi0KLU1vbiBBcHIgMTIgMTQ6MTg6MDAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmM6ICBDbGVhbiB1cCBvbGQgY29tbWVudHMuCi0KLUZyaSBBcHIgIDkgMTA6NDM6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3VuMy5oOiBTdHJpbmcgYXJndW1lbnQgdG8gZnByaW50ZiBpcyBjb25zdC4KLQotCSogY29mZi1taXBzLmM6IFJlbmFtZWQgUEFHRV9TSVpFIHRvIFJPVU5EX1NJWkUsIHRvIGF2b2lkIGNvbmZ1c2lvbgotCW9uIHN5c3RlbXMgd2hpY2ggZGVmaW5lIFBBR0VfU0laRSBpbiA8bGltaXRzLmg+LgotCi1UaHUgQXByICA4IDEwOjI4OjAwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBVc2UgbmV3IG1hY3JvCi0JVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCB0byBhbGxvdyBob3N0IGZpbGVzIHRvIHNwZWNpZnkKLQl0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oIChUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKTogRGVmaW5lCi0JdG8gc3VwcGx5IHRoZSBjb3JlIGZpbGUgZmFpbGluZyBzaWduYWwuCi0KLVRodSBBcHIgIDggMDk6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IE9ubHkgc2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IKLQlhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0JaXMgZGVmaW5lZC4gIE9uIG1hbnkgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIGFsd2F5cyBTVFlQX05PTE9BRC4KLQkqIGNvZmYtaTM4Ni5oIChCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZKTogRGVmaW5lLgotCi1XZWQgQXByICA3IDExOjMzOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKFBBR0VTSVpFKTogQ29ycmVjdCB2YWx1ZS4KLQotVHVlIEFwciAgNiAxMjowNTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZHJlc3Mgb2YgZmlyc3QgUERSIGlzCi0JYW4gb2Zmc2V0IChwYXRjaCBmcm9tIEplYW4tRGFuaWVsIEZla2V0ZSA8amRmQGxyaS5scmkuZnI+KS4KLQotTW9uIEFwciAgNSAxMjowNzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCVNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbi4gIERvbid0IHNldCBTRUNfTkVWRVJfTE9BRCBmb3IgYQotCVNUWVBfSU5GTyBzZWN0aW9uLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlIHZtYSBhbmQgbG1hIG9mIF9MSUIKLQlzZWN0aW9uIHRvIGJlIHplcm8uCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3VudCBudW1iZXIgb2YgZW50cmllcyBpbiBuZXcgbG1hCi0JZmllbGQsIG5vdCBpbiB2bWEuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEZvcmNlIGxpbmVub19jb3VudCBvZgotCVNFQ19TSEFSRURfTElCUkFSWSBzZWN0aW9uIHRvIGJlIHplcm8sIHNpbmNlIGl0IGlzIG5vbi16ZXJvIG9uIHRoZQotCVNDTyAzLjJ2NCBzaGFyZWQgbGlicmFyeS4KLQkqIHNlY2xldC5jIChyZWwpOiBDb3B5IG92ZXIgYW55IHNlY3Rpb24gd2l0aCBjb250ZW50cywgbm90IGp1c3QKLQlsb2FkYWJsZSBzZWN0aW9ucy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgbmV3bHkgYWxsb2NhdGVkCi0Jc3ltYm9sLgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCXJlbG9jYXRlYWJsZSBvdXRwdXQgY29ycmVjdGx5LgotCShob3d0b190YWJsZSk6IFVzZSBjb2ZmX2kzODZfcmVsb2MgZm9yIGFsbCByZWxvYyB0eXBlcy4KLQkoQ0FMQ19BRERFTkQpOiBVc2UgYSBtb3JlIGVmZmljaWVudCBoYWNrIHRvIGdldCB0aGUgY29ycmVjdCBhZGRlbmQKLQlmb3IgYSBjb21tb24gc3ltYm9sLgotCShpMzg2Y29tbV92YWx1ZSk6IFJlbW92ZWQ7IG5vIGxvbmdlciBuZWVkZWQuCi0KLVN1biBBcHIgIDQgMTU6MDg6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQKLQlzZWN0aW9ucyB3aXRob3V0IGEgZmlsZXBvcy4KLQotRnJpIEFwciAgMiAxNDozNTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBDb3JyZWN0IFNFQ19IQVNfQ09OVEVOVFMgdGVzdC4KLQotV2VkIE1hciAzMSAxNzo0MTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkZWQgZ3Bfc2l6ZSBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBncF9zaXplIHRvIDguCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbXBhcmUgYWdhaW5zdCBncF9zaXplLCBub3QgaGFyZGNvZGVkIDguCi0JU2V0IGZsYWdzIHRvIDAgZm9yIGxhcmdlIGNvbW1vbiBzeW1ib2xzLgotCShlY29mZl9ncHJlbF9yZWxvYyk6IEhhbmRsZSBub24temVybyBhZGRlbmQgZm9yIGV4dGVybmFsIHN5bWJvbHMsCi0Jd2hpY2ggY2FuIG9jY3VyIGZvciBnYXMtZ2VuZXJhdGVkIHJlbG9jcy4KLQkoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgY2FzZS4KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUsIGJmZF9zZXRfZ3Bfc2l6ZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBOb3cgZGVwZW5kcyBvbiBjb2ZmL3N5bS5oIGFuZCBsaWJlY29mZi5oLgotCi1UdWUgTWFyIDMwIDA5OjMzOjE2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgbG1hIGZpZWxkIGZvciBsb2FkCi0JYWRkcmVzcy4KLQkqIHNlY3Rpb24uYzogQWRkIGRlY2xhcmF0aW9uIG9mIGxtYSBmaWVsZCB0byBzZWN0aW9uIHN0cnVjdHVyZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAotCWFkZHJlc3MuCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCBsbWEgYWxvbmcgd2l0aCB2bWEuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBOb3cgaGFuZGxlcyBpbmRpcmVjdAotCXN5bWJvbHMgaW4gYSBiZXR0ZXIgd2F5LiAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZyk6IFNldCB0aGUKLQlOX0lORFIgYml0IHdoZW4gbmVjZXNzYXJ5LiAoYW91dDw+c2x1cnBfc3ltYm9sX3RhYmxlKTogTWFpbnRhaW4KLQlpbmRpcmVjdCBzdGF0ZS4KLQkqIHNlY3Rpb24uYzogQWRkZWQgQkZEX0lORF9TRUNUSU9OX05BTUUgYW5kIGJmZF9pbmRfc2VjdGlvbi4KLQkoYmZkX21ha2Vfc2VjdGlvbik6IENvcGUgd2l0aCBuZXcgYnVpbHRpbiBzZWN0aW9uLgotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogQ2FuIG5vdyBwcmludCBpbmRpcmVjdCBzZWN0aW9uCi0JaW5mby4KLQotV2VkIE1hciAyNCAxMzozNjozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKG9iamVjdF9wKSk6ICBGYWlsIGlmIE1BQ0hUWVBFX09LIGlzCi0JZGVmaW5lZCwgYW5kIHlpZWxkcyBmYWxzZS4KLQkqIGFvdXQtbWlwc2JzZC5jLCBpMzg2YnNkLmM6ICBEZWZpbmUgTUFDSFRZUEVfT0sgYXBwcm9wcmlhdGVseS4KLQotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZHIpOiAgQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgKG9ubHksCi0Jc28gZmFyKSBCU0QtNC40LXN0eWxlIGV4dGVuZGVkIGhlYWRlcnMuCi0JKiBhcmNoaXZlLmM6ICBTb21lIG1vcmUgY29tbWVudHMuCi0KLVdlZCBNYXIgMjQgMDI6MDU6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggcnVsZSBmb3IgZHZpIGFuZCBpbmZvLCBzbyB0aGF0IHRoZSByZWN1cnNpdmUKLQltYWtlcyBkb2VzIHRoZSByaWdodCB0aGluZywgaW5zdGVhZCBvZiBhbHdheXMgaW5mbwotCi1XZWQgTWFyIDI0IDAyOjU2OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRGlzYWJsZSBvcHRpbWl6ZWQgaGFuZGxpbmcgZm9yIGFyY2hpdmVzIGFuZAotCWFyY2hpdmUgbWVtYmVyczsgdGhleSBuZWVkIG1vcmUgc3BlY2lhbCByZWF0bWVudC4gIEZvciBub3csIHZlcmlmeQotCXRoYXQgY29tcHV0ZWQgYW5kIGFjdHVhbCBmaWxlIHBvc2l0aW9ucyBjb3JyZXNwb25kLgotCi1UdWUgTWFyIDIzIDA4OjQ1OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwc2JzZC5jOiBSZW5hbWVkIGZyb20gYW91dC1taXBzYnNkLmMuCi0JKHNldF9hcmNoX21hY2gpOiBEZWxldGUgbm9uLU1JUFMgY29kZS4KLQkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBBZGp1c3RlZC4KLQotCSogbGliYmZkLmMgKGJmZF90ZWxsKTogVXBkYXRlIGB3aGVyZScgZmllbGQuCi0JKGJmZF9zZWVrKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBmaWxlCi0JcG9zaXRpb24uICBJZiBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYIGlzIGRlZmluZWQsIGNoZWNrIGB3aGVyZScKLQlmaWVsZCBhZ2FpbnN0IGEgU0VFS19TRVQgcmVxdWVzdC4gIENhbGwgYmZkX3RlbGwgdG8gcmUtdXBkYXRlCi0JYHdoZXJlJyBmaWVsZCB3aGVuIGRvbmUuCi0JKGJmZF9yZWFkLCBiZmRfd3JpdGUpIFtGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYXTogTWFpbnRhaW4KLQlgd2hlcmUnIGZpZWxkLgotCSogaG9zdHMvc3BhcmMuaDogRGVmaW5lIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVguCi0KLU1vbiBNYXIgMjIgMjM6MTg6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE0OjU3OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbG9jYXRlIGVuY2Fwc3VsYXRlZCBzdGFicwotCWlmIHRoZSB0eXBlIGlzIG5vdCBzdE5pbC4KLQotVHVlIE1hciAxNiAxMDozNToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYyAoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogRGVsZXRlIG5vdy1pbnZhbGlkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERvbid0IHVzZSBDT05TVCBoZXJlLAotCWl0J3MgaW1wbGllZCBieSB0aGUgdHlwZS4KLQotRnJpIE1hciAxMiAxODo1ODowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiByZWNvZ25pemUgc3BhcmMtc3VuLXNvbGFyaXMyKiBpbnN0ZWFkIG9mIHNwYXJjLXN1bi1zb2xhcmlzKgotCi1UdWUgTWFyICA5IDA5OjIzOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jOiBBZGQgLmxkaW5mbyBzZWN0aW9uLgotCi1GcmkgTWFyIDEyIDExOjU3OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0KLUZyaSBNYXIgMTIgMDg6MzI6MTEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogd2hpdGVzcGFjZQotCSogc2VjbGV0LmMgKHNlY2xldF9kdW1wX3NlY2xldCk6IERvbid0IHRyeSBhbmQgZmlsbCBzZWN0aW9ucyB3aXRoCi0Jbm8gY29udGVudHMuCi0KLVRodSBNYXIgMTEgMTk6MjY6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9nbzMyLmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRQotCi1UdWUgTWFyICA5IDEwOjUyOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jIChlbGZfb2JqZWN0X3ApOiAgVXNlIEVMRl9BUkNIIHN0b3JlZCBpbiB4dmVjIHRvIG1hdGNoCi0JYWdhaW5zdCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBzdG9yZWQgaW4gdGhlIEVMRiBoZWFkZXIsIHRvIHJlc29sdmUKLQlhbWJpZ3VpdGllcy4KLQkqIGVsZjMyLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBCZmRfbWFrZV9zZWN0aW9uIGNhbiByZXR1cm4KLQlOVUxMLCBzbyBvbmx5IHVzZSByZXN1bHRzIHdoZW4gbm9uLU5VTEwuCi0JKiB0YXJnZXRzLmMgKGVsZjMyX202OGtfdmVjLCBlbGYzMl9pODYwX3ZlYyk6ICBBZGQgZXh0ZXJuIGRlY2xzCi0JYW5kIGFkZCB0byB2ZWN0b3Igb2YgdGFyZ2V0cy4KLQotTW9uIE1hciAgOCAxNToxMzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBFbmNhcHN1bGF0ZWQgU1RBQlMgc3ltYm9scwotCWFyZSBhbHdheXMganVzdCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiBNb3ZlZCBtYWNyb3MgZnJvbSBoZXJlLi4uCi0JbGliZWNvZmYuaCAoZWNvZmZfW2dzXWV0X3N5bV9pbmRleCk6IC4uLnRvIGhlcmUuCi0KLU1vbiBNYXIgIDggMTQ6NTU6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKF9QQV9SSVNDX0lEKTogRGVmaW5lZCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkIChlLmcuLCBmb3IKLQlocHV4IDcpLiAgUGF0Y2ggZnJvbSBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4KLQkoaHBwYV9vYmplY3RfcCk6IE9ubHkgY2hlY2sgZm9yIERMX01BR0lDIGFuZCBTSExfTUFHSUMgaWYgdGhleSdyZQotCWRlZmluZWQsIHdoaWNoIHRoZXkgYXJlbid0IGluIGhwdXggNy4wLgotCi0JKiBhaXgzODYtY29yZS5jOiBJbmNsdWRlIHVpbmZvLmggYW5kIGNvcmVkdW1wLmguICBQYXRjaCBmcm9tIE1pbmgKLQlUcmFuLUxlLCB0cmFubGVAaW50ZWxsaWNvcnAuY29tLgotCi1GcmkgTWFyICA1IDE0OjU0OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGUgYWRkZW5kIGlzIG5vbi16ZXJvLCBnbwotCWFoZWFkIGFuZCBkbyB0aGUgcmVsb2NhdGlvbi4KLQkoZWNvZmZfcmVmaGlfcmVsb2MpOiBEb24ndCB0byB0aGUgcmVsb2NhdGlvbiBoZXJlLCBqdXN0IHJlbWVtYmVyCi0Jd2hhdCBuZWVkcyB0byBiZSBkb25lLgotCShlY29mZl9yZWZsb19yZWxvYyk6IERvIHRoZSBSRUZISSByZWxvY2F0aW9uIGhlcmUuCi0KLVRodSBNYXIgIDQgMTQ6NDQ6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGRlZCBCRkRfQVNTRVJUIGNhbGxzIHRvIGVuc3VyZQotCXJlbG9jcyBhcmUgcmVhc29uYWJsZS4KLQkqIGNvZmYtbXN5bS5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE1hciAgMiAxNzo1Mjo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmhvc3QgKHZheC0qLXVsdHJpeDIqKTogIEFkZCB0cmlwbGV0LgotCSogaG9zdHMvdmF4dWx0Mi5oOiAgTmV3IGZpbGUuCi0JKiBjb25maWcvdmF4dWx0Mi5taDogIE5ldyBmaWxlLgotCi0JKiBhb3V0eC5oIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJjaHIgYW5kIGZyaWVuZHMuCi0JKiBhcmNoaXZlLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIG1lbWNociBhbmQgZnJpZW5kcy4KLQkqIGVsZjMyLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIHN0cnJjaHIgYW5kIGZyaWVuZHMuCi0KLVNhdCBGZWIgMjcgMDA6NDQ6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogVW51c2VkOyBkZWxldGVkLgotCShNWV9zZXRfc2l6ZXMpOiBVc2Ugc3Vub3M0X3NldF9zaXplcy4KLQotCSogZWxmMzIuYzogUmVuYW1lZCBmcm9tIGVsZi5jLiAgU2V2ZXJhbCBDUFUtc3BlY2lmaWMgZnVuY3Rpb25zCi0JZGVsZXRlZCwgYXMgd2VsbCBhcyBlbGYtYmlnIGFuZCBlbGYtbGl0dGxlIHRhcmdldHMuCi0JKiBsaWJlbGYuaDogTmV3IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jOiBOZXcKLQlmaWxlcywgbmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLyotZWxmLm10LCB0YXJnZXRzLmM6IEFkanVzdGVkLgotCi0JKiBpMzg2bGludXguYyAoVEFSR0VUTkFNRSk6IFVzZSBoeXBoZW5zIGluc3RlYWQgb2YgcGFyZW50aGVzZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QgbmVlZAotCXZhcmlhYmxlICJvbGRfc29mYXIiIGlmIGNvbXBpbGluZyBmb3IgaTk2MC4KLQotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBGaXJzdCBhcmd1bWVudCBpcyBub3cgYQotCWJmZCBwb2ludGVyLgotCSogbGliYmZkLmg6IFVwZGF0ZWQuCi0KLQkqIGllZWUuYyAoZXh0ZW4sIGVudmkpOiAic3RhdGljIiBiZWxvbmdzIGZpcnN0IGluIGRlY2xhcmF0aW9uLgotCi1GcmkgRmViIDI2IDE3OjM3OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmM6IGFkZCBzdXBwb3J0IGZvciBzeW1ib2xzcmVjLCBzcmVjb3JkcyB3aXRoIHN5bWJvbHMgaW4KLQl0aGVtLgotCi1UaHUgRmViIDI1IDExOjQzOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgY2FzdCBhbGwgYXJndW1lbnRzIG9mIGllZWVfd3JpdGVfYnl0ZSB0byBiZmRfYnl0ZQotCXRvIGF2b2lkIGxpbnQgY29tcGxhaW50cy4KLQotVGh1IEZlYiAyNSAwMjoxNTo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiAiLnNoc3RydGFiIiBzaG91bGQgYmUKLQl0eXBlIFNIVF9TVFJUQUIuICBEb24ndCBhbHRlciBmaWxlIG9mZnNldCBmb3Igc2VjdGlvbiAwLgotCShyZWxvY190eXBlX25hbWVzKTogTm93IGFuIGFycmF5IGluc3RlYWQgb2YgYSBtYWNyby4gIFN0aWxsIGluc2lkZQotCSIjaWYgMCIsIHNpbmNlIGl0J3MgdXNlZCBvbmx5IGluIGRlYnVnZ2luZyBjb2RlIGFsc28gaW4gIiNpZiAwIi4KLQkoc3RydWN0IGVsZl9yZWxvY19tYXBfZWx0LCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IE5ldyB0eXBlcy4KLQkoc29ydF9yZWxvY19tYXApOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX3JlbG9jX21hcCk6IE5ldyB2YXJpYWJsZS4KLQkoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEZlYiAyMyAxMjoxNzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFuZAotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbDsgdGhleSB3ZXJlIGFscmVhZHkgaW4gdGhlIHRhcmdldCBzdHJ1Y3R1cmUuCi0JKiBBZGp1c3RlZCBhbGwgdXNlcyBvZiBKVU1QX1RBQkxFLgotCSogY29mZmdlbi5jLCBsaWJjb2ZmLWluLmggKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogUmVuYW1lZAotCWZyb20gY29mZl9tYWtlX2RlYnVnX3N5bWJvbC4KLQkqIGxpYmNvZmYuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQotCSogTWlub3IgY2xlYW51cHMgcHJvdm9rZWQgYnkgZ2NjIHdhcm5pbmdzOgotCSogYW91dHguaCAoTkFNRShhb3V0LCByZWxvY190eXBlX2xvb2t1cCkpLAotCWNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXApLAotCWNwdS16OGsuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoZXMuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCksCi0JaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSksCi0JZWxmLmMgKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywKLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKiBhcmNodXJlcy5jOiBSZW1vdmVkIC8qIGZyb20gd2l0aGluIGNvbW1lbnQuCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogSW5pdGlhbGl6ZSByX2V4dGVybi4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX2RhdGEpOiBJbml0aWFsaXplIGkuCi0KLU1vbiBGZWIgMjIgMTg6NDA6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaWJjb2ZmLmggKG9ial9yYXdfc3ltZW50X2NvdW4pOiAgTmV3IG1hY3JvLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6ICBJbml0aWFsaXplCi0JcmF3X3N5bWVudF9jb3VudC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6ICBOdW1lcm91cyBsaXR0bGUgZml4ZXMuCi0KLU1vbiBGZWIgMjIgMTU6MDM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogc3RCbG9jayBzeW1ib2xzIGFyZSBhbHdheXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQkoZWNvZmZfZ2V0X2RlYnVnKTogT2Zmc2V0IHRoZSBmZHIgYWRyIGJ5IHRoZSBhZHIgb2YgdGhlIGZpcnN0IHBkciwKLQlmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRvb2xzIGZyb20gTUlQUy4KLQotCSogY29uZmlnL2JpZ21pcHMubXQ6IE5ldyBmaWxlOyBkZWZhdWx0IHZlY3RvciBpcyBlY29mZl9iaWdfdmVjLgotCSogY29uZmlnL2lyaXgzLm10LCBjb25maWcvaXJpeDQubXQ6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZik6IE5ldyB0YXJnZXQ7IHVzZXMgYmlnbWlwcy5tdC4KLQkobWlwcy1zZ2ktKiwgbWlwcy1iaWctKik6IFVzZSBiaWdtaXBzIHJhdGhlciB0aGFuIGlyaXgzLgotCi1XZWQgRmViIDE3IDIzOjQwOjQxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiAgQWRkIGdyb3NzIGhhY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UKLQlhcmUgcnVubmluZyBvbiBCU0QgNC4zIG9yIEJTRCA0LjQsIGFuZCB1c2UgYXBwcm9wcmlhdGUgaW5jbHVkZQotCWZpbGVzIChhbmQgc2V0IG90aGVyIHBhcmFtZXRlcnMpIHRvIG1hdGNoLgotCi1XZWQgRmViIDE3IDEyOjI4OjEzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X21ha2VfZW1wdHlfc3ltYm9sKTogd3JhcCBQQVJBTVMgYXJvdW5kIGFuCi0JICBhbnNpIGRlZmluaXRpb24gd2hpY2ggb3RoZXJ3aXNlIGNvbmZ1c2VzIG5vbi1hbnNpIGNvbXBpbGVycy4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogZWxpbWluYXRlIGEgd2FybmluZyBmcm9tIHZheAotCSAgdWx0cml4IGNjIGJ5IGZvcndhcmQgZGVjbGFyaW5nIGdldGVudiBhcyBpcyBkb25lIGluCi0JICBiZmRfZmluZF90YXJnZXQuCi0KLVR1ZSBGZWIgMTYgMTc6NTY6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfaW5mb190b19ob3d0byk6IGNhc3QgYW4gZW51bSBpbnRvIHVuc2lnbmVkIGNoYXIKLQkgIGF2b2lkaW5nIGEgZmF0YWwgZXJyb3IgaW4gdmF4IHVsdHJpeCA0LjIgY2MuCi0KLVR1ZSBGZWIgMTYgMDA6NDQ6NTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oLCBWRVJTSU9OOiAgUm9sbCB0byB2ZXJzaW9uIDIuMS4KLQotTW9uIEZlYiAxNSAyMDo0Mzo1MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIExpbnQuCi0JKiBzcmVjLmM6ICBXaGl0ZXNwYWNlIGNsZWFudXAuCi0KLUZyaSBGZWIgMTIgMTQ6MjM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgY29ycmVjdCB0YWduZHggdmFsdWU7Ci0JY2xlYW5lZCB1cCBvdXRwdXQgZm9ybWF0dGluZyBhIGJpdC4KLQotRnJpIEZlYiAxMiAwODoyODo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAqRklYTUUqIHRoZSBIOC8zMDAgaXMgYWx3YXlzCi0JcmVsYXhhYmxlLiAgU2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZSBlbHNlLgotCi1UaHUgRmViIDExIDE0OjA5OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dC1taXBzYnNkLmM6IEVsaW1pbmF0ZWQgdXNlcyBvZiBERUZVTi4KLQkoYW91dF9taXBzXypfdmVjKTogQWRkZWQgc2VjbGV0X2xpbmsgZWxlbWVudC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUywgQ0ZJTEVTLCBhb3V0LW1pcHNic2Qubyk6IEFkZGVkCi0Jc3VwcG9ydCBmb3IgYW91dC1taXBzYnNkIHRhcmdldC4KLQotCSogYm91dC5jIChnZXRfdmFsdWUpOiBEb24ndCB0cnVuY2F0ZSAzMi1iaXQgYWRkZW5kIHRvIDE2IGJpdHMuCi0KLUZyaSBGZWIgIDUgMDg6MDg6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODUwMC5jIChzY2FuX21hY2gpOiByZXR1cm4gZmFsc2UgaWYgaXQncyBub3QgYW4gSDgvNTAwCi0KLVRodSBGZWIgIDQgMTI6NTI6NDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAotCi0JKiBjb2ZmLWg4NTAwLmMsIGNwdS1oODUwMC5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmMKLQotVGh1IEZlYiAgNCAxMjozNTowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmg6IE5ldyBmaWxlLiAgRGVmaW5lcyBFQ09GRiBiYWNrZW5kIGRhdGEgZm9yIGdkYi4KLQkqIGNvZmYtbWlwcy5jOiBOb3cgaW5jbHVkZXMgbGliZWNvZmYuaC4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZWQgdG8gbGliZWNvZmYuaC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IE1hZGUgZ2xvYmFsbHkgdmlzaWJsZSBzbyB0aGF0IGdkYiBjYW4KLQljYWxsIGl0LiAgSWYgdGhlcmUgaXMgZXZlciBhbm90aGVyIEVDT0ZGIHRhcmdldCwgdGhpcyBhbmQgdGhlCi0Jc3dhcHBpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBhY2Nlc3NlZCB2aWEgYW4gRUNPRkYgc3BlY2lmaWMgdGFyZ2V0Ci0JdmVjdG9yLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtbWlwcy5vKTogRGVwZW5kcyBvbiBsaWJlY29mZi5oLgotCi1XZWQgRmViICAzIDA5OjE0OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzaW5jZSBjb2ZmLW1pcHMuYwotCW5vIGxvbmdlciBpbmNsdWRlcyB0aGlzIGZpbGUuCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2Zkcl9pbiwgZWNvZmZfc3dhcF9leHRfaW4pOiBTZXQgcmVzZXJ2ZWQKLQliaXRzIHRvIDAgdG8gbWFrZSBjb21wYXJpc29uIHRlc3QgdXNlZnVsLgotCi0JKiBjb25maWcvaXJpeDMubWgsIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBTZXQgdG8gLUcgNCB0bwotCWF2b2lkIG92ZXJmbG93aW5nIEdQIGFjY2Vzc2libGUgc2VjdGlvbnMgaW4gYmludXRpbHMvb2JqZHVtcC4KLQotVHVlIEZlYiAgMiAxNTozNjo1NSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiAgTWFkZSBzeW1ib2wKLQlyZWFkaW5nIG1vcmUgcm9idXN0OiAgRmFpbCBpZiBzdHJpbmcgaW5kZXggaXMgb3V0IG9mIHN0cmluZwotCXRhYmxlIHJhbmdlLgotCi1UdWUgRmViICAyIDExOjQzOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2VzIFBDUkVMMjQgYW5kCi0JUENSRUwxMyk6IERvbid0IHRha2UgZHN0X2FkZHJlc3MgaW50byBhY2NvdW50OyB0aGUgaW5wdXQgZmlsZSBoYXMKLQlhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhhdC4KLQotVHVlIEZlYiAgMiAxMTo0MTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBDb21wbGV0ZWQgc3VwcG9ydCBmb3IgbGlua2VyIGFuZCBiaW51dGlscy4KLQotTW9uIEZlYiAgMSAxNDo0NTozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFCUzMyKTogS2VlcAotCW9yaWdpbmFsIGFkZGVuZCBmcm9tIHNlY3Rpb24gY29udGVudHMuCi0KLVRodSBKYW4gMjggMjE6MDE6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlGaXggbWlub3IgYnVncyByZXBvcnRlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQHBhcnJvdC5jcmVpZ2h0b24uZWR1PjoKLQkqIGhvc3RzL2RlbHRhODguaCAoc3RydG9sKTogIEZpeCBwcm90b3R5cGUuCi0JKiBjb25maWcvbTg4ay1jb2ZmLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6ICBGaXggbmFtZS4KLQotV2VkIEphbiAyNyAxNzoxNjo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBHZXQgcmlkIG9mICIjaWZkZWYgc3BhcmMiLgotCShSRUxPQ19UWVBFX05BTUVTKTogTmV2ZXIgdXNlZCAoY3VycmVudGx5KSwgc28gZG9uJ3QgaW5jbHVkZSBpdC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9ob3d0b190YWJsZSwgYW5kIGFsd2F5cwotCXVzZWQuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogVXNlIHJ1bnRpbWUgY29uZGl0aW9uYWxzIG9uIENQVSB0eXBlLCBub3QKLQljb21waWxlIHR5cGUgY29uZGl0aW9uYWxzIG9uIGhvc3QgQ1BVLgotCShlbGZfbGl0dGxlX3ZlYywgZWxmX2JpZ192ZWMpOiBVc2UgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAsCi0Jbm90IG51bGwgcG9pbnRlci4KLQkocmVsb2NfdHlwZSwgUkVMT0NfVFlQRV9OQU1FUyk6IEluY2x1ZGUgaTM4NiB2YWx1ZXMuCi0KLVR1ZSBKYW4gMjYgMTE6NDM6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNFQ19JU19DT01NT04pOiBOZXcgc2VjdGlvbiBmbGFnLCBuZWVkZWQgZm9yIE1JUFMKLQlFQ09GRiB3aGljaCBoYXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4KLQkoYmZkX2NvbV9zZWN0aW9uKTogU2V0IFNFQ19JU19DT01NT04gZmxhZy4KLQkqIGJmZC1pbi5oIChiZmRfaXNfY29tX3NlY3Rpb24pOiBOZXcgbWFjcm8gdG8gdGVzdCBTRUNfSVNfQ09NTU9OLgotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBpZWVlLmMsIG9hc3lzLmMsIHJlbG9jLmMsIHN5bXMuOiBVc2UKLQliZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvCi0JYmZkX2NvbV9zZWN0aW9uLgotCi1Nb24gSmFuIDI1IDE1OjI3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spOiBQYXNzIGFvdXRoZHIgYXJndW1lbnQuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEFjY2VwdCBhb3V0aGRyIGFyZ3VtZW50LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBQYXNzIGFvdXRoZHIgdG8gbWtvYmplY3RfaG9vay4KLQlIYW5kbGUgTlVMTCBhb3V0aGRyIGFyZ3VtZW50LgotCShjb2ZmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgbm8gYW91dGhkciwgcGFzcyBpdCBhcyBOVUxMIHRvCi0JY29mZl9yZWFsX29iamVjdF9wLgotCSogbGliY29mZi5oOiBSZWJ1aWx0IGZvciBta29iamVjdF9ob29rIGNoYW5nZXMuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfYW91dGhkcl9pbik6IFN3YXAKLQlhZGRpdGlvbmFsIE1JUFMgRUNPRkYgZmllbGRzLgotCi1TYXQgSmFuIDIzIDE4OjM2OjIwIFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIG1pcHMtZGVjLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbWlwcy1kZWMtYnNkKgotCSogYW91dC1taXBzYnNkLmM6IG5ldyBmaWxlIGZvciBtaXBzLWRlYy1ic2QqCi0JKiBhb3V0LXRhcmdldC5oOiBkb24ndCBkZWZpbmUgJycgaWYgJ01ZX0JGRF9UQVJHRVQnIGlzIGRlZmluZWQuCi0JKiBhb3V0eC5oOiBhZGRlZCBtaXBzIHN1cHBvcnQuCi0JKiBhcmNodXJlcy5jOiBhZGRlZCBtaXBzIHN1cHBvcnQgdG8gYmZkX2RlZmF1bHRfc2NhbigpLgotCSogY3B1LW1pcHMuYzogYWRkZWQgc3VwcG9ydCBmb3IgUjQwMDAgKHVudGVzdGVkKS4KLQkqIGxpYmFvdXQuaDogYWRkZWQgTUlQUzEgJiBNSVBTMiBtYWdpYyBudW1iZXJzLgotCSogcmVsb2MuYzogZml4IHR5cG8ncyBpbiBjb21tZW50cy4gQWRkZWQgQkZEX1JFTE9DIGVudHJpZXMgd2hpY2ggSQotCQlob3BlIHdpbGwgbWFrZSBpdCBpbnRvIGluY2x1ZGUvYmZkLmguCi0JKiB0YXJnZXRzLmM6IGFkZGVkIGFvdXRfbWlwc18qX3ZlYy4KLQotV2VkIEphbiAyMCAxNzoxNTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm10OiBTZXQgREVGQVVMVF9WRUNUT1IgdG8gZWNvZmZfbGl0dGxlX3ZlYy4KLQotVHVlIEphbiAxOSAwOTowNjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfYXN5bWJvbF92YWx1ZSk6IEFkZCBuZWVkZWQgcGFyZW50aGVzZXMuCi0KLQkqIGxpYmNvZmYtaW4uaDogVXBkYXRlIHByb3RvdHlwZSBmb3IgY29mZl9jb3VudF9saW5lbnVtYmVycy4KLQotRnJpIEphbiAxNSAxODoxMzoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2hkcl9vdXQsIGVjb2ZmX3N3YXBfZmRyX291dCwKLQllY29mZl9zd2FwX3Bkcl9vdXQsIGVjb2ZmX3N3YXBfc3ltX291dCwgZWNvZmZfc3dhcF9leHRfb3V0LAotCWVjb2ZmX3N3YXBfcm5keF9vdXQsIGVjb2ZmX3N3YXBfcmZkX291dCwgZWNvZmZfc3dhcF9vcHRfaW4sCi0JZWNvZmZfc3dhcF9vcHRfb3V0LCBlY29mZl9zd2FwX2Rucl9pbiwgZWNvZmZfc3dhcF9kbnJfb3V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaDogSWYgTk9fQ09GRl9SRUxPQ1MgaXMgZGVmaW5lZCwgZG9uJ3QgZGVmaW5lCi0JYmZkX3N3YXBfcmVsb2NfaW4gb3IgY29mZl9zd2FwX3JlbG9jX291dC4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIGxpbmsgYW5kIHdyaXRlIG91dCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHN3YXAgcmVsb2NzIGluIGFuZCBvdXQuCi0KLVRodSBKYW4gMTQgMTU6NTE6NTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpYmNvZmYuaCwgY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKSwgY29mZmNvZGUuaAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGNvZmZfY291bnRfbGluZW51bWJlcnMgcmV0dXJucyB0aGUKLQludW1iZXIgb2YgbGluZSBudW1iZXIgcmVjb3JkcyBpdCBmb3VuZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogb25seSB3cml0ZSBvdXQgbGluZSBudW1iZXJzCi0JaW4gdGhlIHNlY3Rpb24gdGhleSBiZWxvbmcgdG8uCi0KLU1vbiBKYW4gMTEgMTg6MzI6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQgdG8KLQlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsKLQl0YXJnZXQgdmVjdG9yIGZvciBsaW5rZXIgdXNlLgotCSogYmZkLmMgKGJmZF9zZWNsZXRfbGluayk6IE5ldyBtYWNyby4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgX2JmZF9zZWNsZXRfbGluay4KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCk6IEFkZGVkIHJlbG9jYXRlYWJsZSBhcmd1bWVudAotCWFuZCBib29sZWFuIHJldHVybiB2YWx1ZS4gIE1hZGUgc3RhdGljLgotCShiZmRfZ2VuZXJpY19zZWNsZXRfbGluayk6IFJlbmFtZWQgZnJvbSBzZWNsZXRfZHVtcC4gIEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwgc2F2ZXMgcmVsb2NzKS4KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwKLQlyZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwganVzdCBjYWxscwotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogQWRkZWQgcmVsb2NhdGVhYmxlCi0JYXJndW1lbnQgdG8gcHJvdG90eXBlLgotCSogQWxsIHRhcmdldHM6IFNldCBuZXcgX2JmZF9zZWNsZXRfbGluayB2ZWN0b3IgdG8KLQliZmRfZ2VuZXJpY19zZWNsZXRfbGluay4KLQotU2F0IEphbiAgOSAyMToyOTozMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmM6ICAjaW5jbHVkZSBzZWNsZXQuaC4KLQotU2F0IEphbiAgOSAxOTo0ODoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIEdldCByaWQgb2YgYWxsIGtub3dsZWRnZSBvZiBzdGFicwotCWRlYnVnIGluZm8uICBTZXR1cCBpbmZvIGFib3V0IGxpbmtlciBzeW1ib2xzIG9ubHksIGFuZCB1c2UKLQlzdGFuZGFyZCBiZmQgZmllbGRzIHRvIGhvbGQgdGhlIGluZm8uCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBSZW1vdmUgdW5uZWVkZWQgZGVjbHMuCi0JKiAoaHBwYV9uZXdfc2VjdGlvbl9ob29rKTogIEdldCByaWQgb2YgbW9zdCBvZiB0aGlzLgotCSogbGliaHBwYS5oIChzdHJ1Y3QgaHBwYWRhdGEpOiAgUmVtb3ZlIHRlbiBwb3VuZHMgb2YgdXNlbGVzcyB1Z2x5Ci0JZmF0LiAgUmVtb3ZlIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMsIHJlbW92ZSByZWR1bmRhbnQga25vd2xlZGdlIG9mCi0JbGlua2VyIHN5bWJvbHMuCi0JKiBSZW1vdmUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgZmllbGRzIHdoaWNoIGFyZSBub3cgZ29uZS4KLQotRnJpIEphbiAgOCAxNToyMDowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBhbGxvdyBTRUNfTkVWRVJfTE9BRCB0byB0dXJuIG9uCi0JU1RZUF9OT0xPQUQgYml0LgotCSogY29mZi16OGsuYzogZGVsZXRlIHVudXNlZCByZWxvYyBmdW5jdGlvbnMKLQotRnJpIEphbiAgOCAxNTo0Nzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZGVkIGVjb2ZmX3RkYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogQWRkZWQgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLgotCSogY29mZi1tc3ltLmM6IFVzZSBERUZVTiBmb3IgZnVuY3Rpb24gZGVmaW5pdG9ucy4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIHJlYWQgYW5kIHByaW50IHN5bWJvbHMsIGFuZCB0byBmaW5kCi0JbGluZSBudW1iZXJzLgotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlZCBtYW55IGdlbmVyaWMgZnVuY3Rpb25zIGludG8gY29mZmdlbi5jLiAgTW92ZWQKLQlzd2FwcGluZyBmdW5jdGlvbnMgaW50byBjb2Zmc3dhcC5oIGZvciBFQ09GRiB1c2UuICBNb3ZlZAotCXJlbG9jYXRpb24gZnVuY3Rpb25zLCBvbmx5IHVzZWQgYnkgaDgzMDAgYW5kIHo4aywgaW50byByZWxvYzE2LmMuCi0JQWRkZWQgaG9va3MgZm9yIGNvZmZnZW4uYyBmdW5jdGlvbnMgdG8gYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgYW5kCi0JYWRkZWQgaG9vayBmdW5jdGlvbnMuICBTdGlsbCBtb3JlIGNvdWxkIGJlIGRvbmUuCi0JKiBjb2Zmc3dhcC5oOiBOZXcgZmlsZSB0byBob2xkIENPRkYgc3dhcHBpbmcgcm91dGluZXMuCi0JKiBjb2ZmZ2VuLmM6IE5ldyBmaWxlIHRvIGhvbGQgZ2VuZXJpYyBDT0ZGIGZ1bmN0aW9ucy4KLQkqIHJlbG9jMTYuYzogTmV3IGZpbGUgdG8gaG9sZCBoODMwMCBhbmQgejhrIHNwZWNpZmljIHJlbG9jYXRpb24KLQlmdW5jdGlvbnMuCi0JKiBsaWJjb2ZmLWluLmg6IEFkZGVkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGluIGNvZmZnZW4uYy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdCB0byBpbmNvcnBvcmF0ZSBjaGFuZ2VzLgotCSogY29mZi1oODMwMC5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuCi0JKiBjb2ZmLXo4ay5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuICBVc2UgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0JaG9vayByYXRoZXIgdGhhbiBkZWZpbmluZyBFWFRSQV9DQVNFUy4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBuZXcgZmlsZXMgY29mZmdlbiBhbmQgcmVsb2MxNi4gIEFkZGVkCi0JZGVwZW5kZW5jaWVzIG9mIGNvZmYtKi5vIG9uIGNvZmZzd2FwLmggYW5kIHNlY2xldC5oLgotCi1UaHUgSmFuICA3IDE2OjE2OjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZwotCWFib3V0IGRpc2NhcmRpbmcgY29uc3QuCi0KLVdlZCBKYW4gIDYgMDA6MTY6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIHNlY2xldC5jLCBlbGYuYyB1c2UgYmZkX3htYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MKLQotVHVlIEphbiAgNSAwOTozNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG9zdC10YXJnZXQpOiBJZiAtLXdpdGgtbWluaW1hbC1iZmQgaXMgc3BlY2lmaWVkLAotCXNldCBNSU5JTUlaRT0xLgotCi1Nb24gSmFuICA0IDA3OjIwOjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3Jkcyk6IG9uZSBvZiBteSBib2FyZHMgd2FudHMgYSBDUiBiZXR3ZWVuCi0JcmVjb3Jkcy4KLQotV2VkIERlYyAzMCAxMjo0NjozMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IHNldCBzeW1kZWZfY291bnQgY29ycmVjdGx5Ci0JKGl0IGJyb2tlIGEgY291cGxlIG9mIHdlZWtzIGFnbykuCi0KLVR1ZSBEZWMgMjkgMjE6NDE6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBTd2l0Y2ggYmFjayB0byAic3RydWN0IC4uLiIgZm9yCi0JcmV0dXJuIHR5cGUsIHNvIGxpYmJmZC5oIGRvZXNuJ3QgcmVmZXJlbmNlIHVuZGVmaW5lZCB0eXBlZGVmbmFtZXMuCi0KLVR1ZSBEZWMgMjkgMTM6NTQ6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiB1c2UgbmFtZSBJMzg2QUlYTUFHSUMgcmF0aGVyCi0JdGhhbiBJMzg2U1ZNQUdJQy4KLQkoY29mZl9wb2ludGVyaXplX2F1eCk6IGRvbid0IHBvaW50ZXJpemUgYSBuZWdhdGl2ZSB0YWduZHgKLQkoc29tZXRpbWVzIGdlbmVyYXRlZCBieSBTQ08gMy4ydjQgY2MpLgotCi0JKiBib3V0LmMgKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogd2FybiBpZiByZWxvY2F0aW5nIGFnYWluc3QKLQlhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Nb24gRGVjIDI4IDE0OjMwOjU1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEdldCByaWQgb2YgREVGVU4sIHVzZSBtb3JlIGNvbnZlbnRpb25hbCBwcm9sb2cgc3R1ZmYuCi0JTWFrZSBhIGJ1bmNoIG1vcmUgcm91dGluZXMgYmUgc3RhdGljLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBHZXQgcmlkIG9mIHRoaXMsIHJlcGxhY2Ugd2l0aCBtdWNoIGJldHRlcgotCXdyaXR0ZW4gc2V0dXBfc2VjdGlvbnMoKS4KLQkqIChzZXR1cF9zZWN0aW9ucyk6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgQkZEIHNlY3Rpb25zIGZvciBlYWNoCi0Jc3BhY2UgYW5kIHN1YnNwYWNlIGluIFNPTSBmaWxlcy4KLQkqIChocHBhX29iamVjdF9zZXR1cCk6ICBVc2UgQkZEIHNlY3Rpb25zIGNyZWF0ZWQgYnkKLQlzZXR1cF9zZWN0aW9ucygpIHRvIGxvY2F0ZSBHREIgc3ltYm9sIHRhYmxlIGluZm8uCi0JKiAobWFrZV91bmlxdWVfc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEl0Ci0JZW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZSwgYW5kIHdpbGwgZ2VuZXJhdGUgYSB1bmlxdWUKLQlvbmUgaWYgbmVjZXNzYXJ5LgotCSogKGhwcGFfb2JqZWN0X3ApOiAgQmVjb21lIG11Y2ggbW9yZSBwYXJhbm9pZCBhYm91dCBmaWxlIGhlYWRlci4KLQkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBDYWxsIGJmZF9tYWtlX3NlY3Rpb24gdG8gZG8gdGhlIGRpcnR5Ci0Jd29yay4gIFNpbXBsaWZ5IGNvZGUgc29tZXdoYXQuCi0JKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBVc2UgcHJvcGVyIG5hbWUgZm9yIHN0YWNrIHNlY3Rpb24uCi0JKiBsaWJocHBhLmg6ICBSZW1vdmUgbWlsbGljb2RlX3N0YXJ0LCBtaWxsaWNvZGVfZW5kIGRlY2xzLgotCi1Nb24gRGVjIDI4IDExOjAzOjIyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi13ZTMyay5vLCBjb2ZmLXo4ay5vKTogTm90ZSBkZXBlbmRlbmNpZXMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGb3Igbm9ybWFsIDItIG9yIDQtYnl0ZQotCXJlbG9jcywgZG9uJ3QgYm90aGVyIGRvaW5nIHRoZSBhZGp1c3RtZW50IGlmIHRoZSB2YWx1ZSB0byBhZGQgaXMKLQl6ZXJvLgotCi1TdW4gRGVjIDI3IDE3OjQ1OjA1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9zaXplKTogIE5ldyBmdW5jdGlvbiB0aGF0IGdldHMgYW4gdXBwZXIgYm91bmQKLQlvbiB0aGUgcG9zc2libGUgc2l6ZSBvZiBhbnkgb2JqZWN0IGluIGEgYmZkLgotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAotCWVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIFJld3JpdGUgdG8gYXZvaWQgTlVMTCBwb2ludGVyCi0JZGVyZWZlcmVuY2VzLgotCSogZWxmLmMgKGVsZl9iaWdfdmVjLCBlbGZfbGl0dGxlX3ZlYyk6ICBEb2N1bWVudCBsYXN0IHRocmVlCi0JbWVtYmVycyBpbml0aWFsaXplZCB0byBOVUxMLgotCi1UaHUgRGVjIDI0IDE3OjQ5OjA5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBjaGFuZ2UgYSAnY29uc3QnIHRvICdDT05TVCcsIG9yIGVsc2UgSFAgQyBjb21waWxlciBkaWVzCi0KLU1vbiBEZWMgMjEgMTY6MzM6MzQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAgTmV3IGZpbGUuICBBdHRlbXB0IGF0IGEgZ2VuZXJpYy9kZWZhdWx0Ci0Jc2V0IG9mIGRlZmluaXRpb25zLCB0byBkaXNjb3VyYWdlIHBvcnRpbmcgdG8gbmV3IGhvc3RzIGJ5IGNvcHlpbmcuCi0JKiBob3N0cy9uZXdzLmg6ICBSZW1vdmVkLgotCSogaG9zdHMvc3BhcmMuaDogIFVzZSBzdGQtaG9zdC5oLgotCSogYmZkLWluLmg6ICBOZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91cjsKLQlwZXJoYXBzIHdlIGNhbiBsYXRlciByZW1vdmUgdGhlIHRoZV9iZmQgZmllbGQgZnJvbSBlYWNoIHN5bWJvbC4KLQkqIHN5bXMuYyAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSk6ICBSZW1vdmUgdW51c2VkIGZpZWxkCi0JYXBwX2RhdGEuICBBZGQgY29tbWVudCBub3RpbmcgdGhhdCB0aGVfYmZkIGlzIGFsbW9zdCByZWR1bmRhbnQsCi0JYnV0IG5vdCBxdWl0ZS4KLQkqIGFvdXR4LmgsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmZjb2RlLmg6Ci0JVXNlIG5ldyBtYWNyb3MgYmZkX2FzeW1ib2xfYmZkIGFuZCBiZmRfYXN5bWJvbF9mbGF2b3VyLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBNYWtlIHNsaWdodGx5IG1vcmUgcmVidXN0LgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlICJkZWZhdWx0IiBob3N0LgotCi1Nb24gRGVjIDIxIDE3OjI0OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgQWRkIHN0cnVjdCBocHBhX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGhwcGEuYzogIENvbmRpdGlvbmFsaXplIG9uIEhPU1RfSFBQQUhQVVggaW5zdGVhZCBvZiBocDkwMDBzODAwLgotCUdldCByaWQgb2YgSFBQQS9CU0Qgc3BlY2lmaWMgY29kZS4gIFRoYXQgd2lsbCBnbyBzb21ld2hlcmUgZWxzZQotCXNvbWVkYXkuCi0JKiAoZmlsbF9zcGFjZXMpOiAgRG9uJ3Qgc3BpbiBmb3JldmVyIGFuZCBkaWUgaWYgeW91IGRvbid0IGZpbmQKLQkkTUlMTElDT0RFJCBzdWJzcGFjZS4KLQkqIChocHBhX29iamVjdF9wKTogIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSByZWFsIGhvbmVzdC10by1jdGh1bHUKLQlleGVjIGZpbGUhCi0JKiAoaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6Ci0JTWFrZSB0aGVzZSB3b3JrIGZvciBIUFVYLgotCSogKG1ha2VfYmZkX2FzZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIG1ha2Ugc2VjdGlvbiBjcmVhdGlvbiBhCi0JbGl0dGxlIGVhc2llci4KLQkqIChocHBhX2NvcmVfZmlsZV9wKTogIENvbXBsZXRlbHkgcmV3cml0ZSwgbGVhdmUgb3V0IGJ1Z3MuCi0JKiBsaWJocHBhLmg6ICAjaW5jbHVkZSB0aGUgcmlnaHQgc3lzdGVtIGZpbGVzLiAgUmVkZWZpbmUgYWxsIG9mCi0JdGhlIHN0cnVjdHMvbWFjcm9zIGZvciBoYWNraW5nIGNvcmUgZmlsZXMgdG8gdXNlIG1vcmUgc2Vuc2libGUKLQlIUFVYIGNvcmUgZmlsZSBzdHJ1Y3R1cmVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIENvbmRpdGlvbmFsaXplIGhwcGFfdmVjIG9uCi0JSE9TVF9IUFBBSFBVWCwgbm90IGhwOTAwMHM4MDAuCi0JKiBob3N0cy9ocHBhaHB1eC5oOiAgI2luY2x1ZGUgc3RkbGliLmggdG8gZ2V0IGNvcnJlY3QgZGVjbHMgZm9yCi0JbWFsbG9jIGFuZCByZWFsbG9jLiAgI2RlZmluZSBIT1NUX0hQUEFIUFVYLgotCi1Nb24gRGVjIDIxIDEyOjQwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZSA8bXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20+LgotCSogY29uZmlndXJlLmluIChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgaG9zdHMuCi0JKiBob3N0cy9pMzg2aXNjLmgsIGNvbmZpZy9pMzg2aXNjLm1oOiBOZXcgZmlsZXMgZm9yIEludGVyYWN0aXZlCi0JVW5peC4KLQkqIGhvc3RzL2kzODZhaXguaCwgY29uZmlnL2kzODZhaXgubWg6IE5ldyBmaWxlcyBmb3IgQUlYIG9uIFBTLzIuCi0JKiBhaXgzODYtY29yZS5jOiBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgY29yZSBmaWxlcyBvbiBBSVggb24gUFMvMi4KLQkqIHRhcmdldHMuYzogaWYgQUlYMzg2X0NPUkUsIHVzZSBhaXgzODZfY29yZV92ZWMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBjaGVjayBmb3IgSTM4NlNWTUFHSUMgYXMgd2VsbAotCWFzIEkzODZNQUdJQy4KLQotRnJpIERlYyAxOCAxMDoyMDoyNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMCwgZml4aW5nCi0JMTkyNy4KLQotVGh1IERlYyAxNyAxOTozNTozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0Ci0KLVRodSBEZWMgMTcgMDA6MzY6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgVXNlIHJpZ2h0IG5hbWUgZm9yIHRla2hleCB0ZGF0YSBzdHJ1Y3QuCi0JKiB0ZWtoZXguYzogIEluc2VydCBsZWFkaW5nX2NoYXIgKDApIGludG8gYmZkX3RhcmdldCBzdHJ1Y3QuICBTdHlsZS4KLQkqIGxpYmNvZmYuaDogIFVwZGF0ZWQgdG8gZ2V0IHNwYWNpbmcgY2hhbmdlIGZyb20gY29mZmNvZGUuaC4KLQkqIHRyYWQtY29yZS5jOiAgbGVhZGluZ19jaGFyIGlzIDAgKG5vIHN5bWJvbHMhKSwgbm90ICdfJy4KLQotVHVlIERlYyAxNSAxNTo0MDozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiAgTmV3Ci0JZnVuY3Rpb25zLCB3aXRoIHRoZSAiZ3V0cyIgb2YgdGhlIG9sZCBiZmRfc2x1cnBfYnNkX2FybWFwCi0JYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLCBidXQgYXNzdW1pbmcgd2UndmUgYWxyZWFkeSBjaGVja2VkCi0JaWYgdGhlIGFybWFwIGlzIHByZXNlbnQgb3Igbm90LgotCUFsc28sIHJld3JpdGUgYSBiaXQgdG8gYXZvaWQga2VlcGluZyBhcm91bmQgb2JzdGFjayBkYXRhCi0JdGhhdCB3ZSBkb24ndCBuZWVkLgotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZWFkZXIsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JVmFyaW91cyBmaXhlcyB0byBjb3JyZWN0bHkgaGFuZGxlIENPRkZfc3R5bGUgYXJjaGl2ZXMgbmFtZXMuCi0JKE5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGhhdmUgYSB0cmFpbGluZyAnLycsIHRoZSBuYW1lcyBjYW4KLQloYXZlIGVtYmVkZGVkIHNwYWNlcy4pCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6ICBOZXcgZnVuY3Rpb24sIHJlcGxhY2VzIG9sZAotCWJmZF9zbHVycF9ic2RfYXJtYXAgYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLiAgUmVjb2duaXplcwotCV9laXRoZXJfIGZvcm1hdCwgYW5kIGNhbGxzIGRvX3NsdXJwX2JzZF9hcm1hcCBvcgotCWRvX3NsdXJwX2NvZmZfYXJtYXAgaWYgZWl0aGVyIGZvcm0gb2YgbWFwIGlzIHNlZW4uCi0JKiBsaWJiZmQtaW4uaDogIENoYW5nZWQgYmZkX3NsdXJwX2JzZF9hcm1hcCBhbmQKLQliZmRfc2x1cnBfY29mZl9hcm1hcCBpbnRvIG1hY3JvIHN5bm9ueW1zIGZvciBiZmRfc2x1cnBfYXJtYXAuCi0JKiBlbGYuYyAoZWxmX3NsdXJwX2FybWFwLCBlbGZfd3JpdGVfYXJtYXApOiAgRml4LgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIFVzZSByYyBpbnN0ZWFkIG9mIG5vbi1zdGFuZGFyZCBxYy4KLQotTW9uIERlYyAxNCAxNzowODowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICAjaW5jbHVkZSAic3lzZGVwLmgiLCBub3QgPHN5c2RlcC5oPi4KLQkqIGxpYmhwcGEuaDogIE1ha2UgbWlsbGljb2RlX3N0YXJ0IGFuZCBtaWxsaWNvZGVfZW5kIGJlIHVuc2lnbmVkCi0JaW50IHRvIGJlIHNhbWUgdHlwZSBhcyBDT1JFX0FERFIgaW4gR0RCLiAgV2h5IGFyZSB0aGVzZSBoZXJlPwotCi1TYXQgRGVjIDEyIDE1OjU0OjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKENBTENfQURERU5EKTogaWYgcmVsb2MgaXMgUEMgcmVsYXRpdmUsIGFkZCB0aGUKLQl2YWRkciBvZiB0aGUgc2VjdGlvbiB0byB0aGUgYWRkZW5kLgotCSogdGFyZ2V0cy5jOiBpZiBNSU5JTUlaRSBpcyAxLCBhbmQgU0NPX0NPUkUgaXMgZGVmaW5lZCwgYWRkCi0JU0NPX0NPUkUgdG8gU0VMRUNUX1ZFQ1MuCi0JKHRhcmdldF92ZWN0b3IpOiBhZGQgc2NvX2NvcmVfdmVjLgotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogYWRkIGxlYWRpbmcgdW5kZXJzY29yZSBpbml0aWFsaXplci4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbyopOiB1c2UgdGFyZ2V0IGkzODYtc2NvLgotCSogY29uZmlnL2kzODYtc2NvLm10OiBuZXcgZmlsZTsgZGVmaW5lIFNDT19DT1JFLgotCi1UaHUgRGVjIDEwIDAyOjEzOjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiAgRml4ICFzdHJjbXAgdGhpbmtvLgotCi1GcmkgRGVjICA0IDE0OjAyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KLQotVGh1IERlYyAgMyAxNjo1NDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZsaW51eC5oOiBJbmNsdWRlIHVuaXN0ZC5oLgotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiBhb3V0X3N0YWJfbmFtZSByZXR1cm5zIGEgY29uc3RhbnQKLQlzdHJpbmcuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRml4IHByb3RvdHlwZS4KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZXMpOiBBcnJheSBpcyBub3cgY29uc3QuCi0JKGFvdXRfc3RhYl9uYW1lKTogUmV0dXJuIHZhbHVlIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIGN0b3IuYywgcmVsb2MuYywKLQlzeW1zLmM6IERvYyBmaXhlcy4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQWRkZWQgbmV3IGZpZWxkICJhcHBfZGF0YSIsIGZvciBkYXRhCi0JcGFydGljdWxhciB0byB0aGUgYXBwbGljYXRpb24uICBTb21lIG9mIHRoZSBsaW5rZXIgZmxhZ3Mgb3VnaHQgdG8KLQlnZXQgbW92ZWQgdG8gdGhpcyBmaWVsZCBzb21lZGF5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogUmVjb2duaXplIGEgZmV3IG1vcmUgbnVtYmVyczoKLQk4MDQ4NiwgODA5NjAsIGFuZCA5NjAuCi0KLQkqIGJmZC1pbi5oIChDT0ZGX1NXQVBfVEFCTEUpOiBOZXcgaXMganVzdCBhZGRyZXNzIG9mCi0JYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsIGNhc3QgdG8gUFRSLgotCSogYmZkLmMgKGJmZF9jb2ZmX3N3YXBfKik6IERlbGV0ZWQgbWFjcm9zLgotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IERlbGV0ZWQgQ09GRi1zcGVjaWZpYyBzd2FwcGluZwotCXJvdXRpbmUgcG9pbnRlcnMuCi0JKiBjb2ZmY29kZS5oICh0eXBlIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdHlwZSwKLQljb250YWlucyBwb2ludGVycyB0byB0aGUgQ09GRi1zcGVjaWZpYyBzd2FwcGluZyByb3V0aW5lcy4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUsIHRvIGJlIHVzZWQgd2hlbgotCU5PX0NPRkZfU1lNQk9MUyBhbmQgTk9fQ09GRl9MSU5FTk9TIGFyZSBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3dhcF8qKTogTmV3IG1hY3Jvcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2NvZmZfc3dhcF90YWJsZSk6IE5ldyBkYXRhIHN0cnVjdHVyZS4KLQkoZWNvZmZfYmlnX3ZlYyk6IFVzZSBpdC4KLQkqIEFsbCBDT0ZGIHRhcmdldHM6IE1vdmVkIENPRkZfU1dBUF9UQUJMRSB0byB0YXJnZXQtc3BlY2lmaWMgZGF0YS4KLQkqIEFsbCBvdGhlciB0YXJnZXRzOiBEZWxldGVkIGNvZmYtc3BlY2lmaWMgdmVjdG9yIGVudHJpZXMuCi0KLQkqIHRyYWQtY29yZS5jOiBGaXhlZCBzb21lIGBQQVJBTVMnIHVzZXMgdGhhdCB3ZXJlIG1pc3NpbmcKLQlwYXJlbnRoZXNlcy4KLQotU3VuIE5vdiAyOSAwODozNzoxMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFByb3RlY3QgYXJnIHByb3RvdHlwZSBpbgotCWNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3Agd2l0aCBQQVJBTVMgbWFjcm8gZm9yIG5vbi1BTlNJIGNvbXBpbGVycy4KLQotU2F0IE5vdiAyOCAwNDowMToyMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIHRyYWQtY29yZS5jLCBjb2ZmY29kZS5oLCBsaWJhb3V0LmgsCi0JbGliYmZkLWluLmgsIGJmZC1pbi5oOiBFbGltaW5hdGUgYWxsIFBST1RPIGNhbGxzLCByZXBsYWNlIHdpdGgKLQlQQVJBTVMgZm9yIHJlYWRhYmlsaXR5LgotCi0JKiBhb3V0eC5oOiAgQWRkIHR5cGUgdG8gY2FsbGJhY2sgcGFyYW1ldGVyLgotCSogY29mZi1taXBzLmM6ICBEb24ndCBjYWxsIHRyYWQtY29yZS5oLCBub3QgbmVlZGVkLgotCSogdHJhZC1jb3JlLmM6ICBJbmNvcnBvcmF0ZSB0cmFkLWNvcmUuaCBkZWNsYXJhdGlvbnMuICBGaXggY29tbWVudHMuCi0JKiB0cmFkLWNvcmUuaDogIEVsaW1pbmF0ZSwgdW51c2VkLgotCi1XZWQgTm92IDE4IDEzOjE2OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IGlmIGRlZmF1bHQgdGFyZ2V0IGlzbid0IGZvdW5kCi0JdGhlbiBsb29rIHRocm91Z2ggdGhlIGVudGlyZSBsaXN0IHJhdGhlciB0aGFuIHJldHVybiBlYXJseS4KLQotTW9uIE5vdiAxNiAxNDozMzowMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pOTYwLWNvZmYubXQ6IHJlb3JkZXIgdmVjIHRvIG1hdGNoIGJmZF9jaGVja19mb3JtYXQgKGZyb20gUGVyKQotCi1UaHUgTm92IDEyIDE3OjAxOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGluIEZMQUdTX1RPX1BBU1MKLQotVGh1IE5vdiAxMiAwOTo0Njo0NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYzogY2hlY2twb2ludCwgbW9yZSBhZGRyZXNzaW5nIG1vZGVzIGhhbmRsZWQKLQkqIGNvZmZjb2RlLmggKGdldF92YWx1ZSk6IGRvbid0IHRydW5jYXRlIHJlbG9jLT5hZGRlbmQgZmllbGQsIGl0J3MKLQlhIGxvbmcgbm93LgotCi1XZWQgTm92IDExIDIzOjU3OjU1IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLm10IChUREVGQVVMVFMpOiBVc2Ugd2UzMmtjb2ZmX3ZlYywgbm90IGkzODZjb2ZmX3ZlYy4KLQotVHVlIE5vdiAxMCAxNDowNDozOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtaW5vciB0d2Vha3MgdG8gbWFrZSAkKENDKSBjb21tYW5kIGxpbmVzIG1vcmUgY29uc2lzdGVudAotCi1Nb24gTm92ICA5IDIzOjU4OjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIsIGJmZF9jbG9zZSk6ICBBZGQgZG9jIGFib3V0IGNhY2hlaW5nCi0JYW5kIGFib3V0IHdoZW4gZmlsZSBkZXNjcmlwdG9ycyBhcmUgY2xvc2VkLgotCi1TYXQgTm92ICA3IDAwOjQyOjIwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IE1ha2Ugc3VyZSBhbGlnbm1lbnQgcmVsb2NzIGdldAotCXdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KLQotVGh1IE5vdiAgNSAxNTozNDoxOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYzogTmV3IHNlY3Rpb24gYml0IFNFQ19TSEFSRURfTElCUkFSWS4KLQljb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIFNUWVBfTk9MT0FEICYmIChTVFlQX1RFWFQgfHwKLQlTVFlQX0RBVEEpLCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZLiAgVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvcgotCWkzODYtc3lzdi4KLQotVGh1IE5vdiAgNSAwNDo0MzowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0LmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogIEVsaW1pbmF0ZSB0aGUgU0RFRiBhbmQgU0RFRl9GTVQKLQltYWNyb3M7IHVzZSBQQVJBTVMgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW52b2x2ZWQuCi0KLQkqIGJmZC1pbi5oLCBiZmQuYywgbGliYmZkLmgsIHJlbG9jLmMsIHNlY2xldC5oLCBzZWN0aW9uLmMsCi0JdGFyZ2V0cy5jOiBSZW5hbWUgc3RydWN0IGJmZF9zZWNsZXRfc3RydWN0IHRvIHN0cnVjdCBiZmRfc2VjbGV0LgotCi1UaHUgTm92ICA1IDAyOjU5OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLCB3aXRoIFBBUkFNUy4KLQotCSogYXJjaHVyZXMuYywgcmVsb2MuYywgc2VjdGlvbi5jLCB0ZWtoZXguYzogIFVzZSBQQVJBTVMgaW4KLQlkZWNsYXJpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotCSogY2FjaGUuYywgZWxmLmM6ICBNb3ZlIHN0YXRpYyBmdW5jdGlvbiBkZWNscyB0byB0b3AsIHVzZSBQQVJBTVMuCi0JKiBzZWNsZXQuaDogIERlY2xhcmUgZXh0ZXJuYWwgZnVuY3Rpb24gd2l0aCBQQVJBTVMuCi0KLQkqIGRvYy9jaGV3LmMgKGV4ZnVuc3R1ZmYpOiAgRWxpbWluYXRlLgotCShwYXJhbXN0dWZmKTogIFJlcGxhY2UgZXhmdW5zdHVmZiB3aXRoIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIFBBUkFNUy4KLQkqIGRvYy9wcm90by5zdHI6ICBVc2UgcGFyYW1zdHVmZiByYXRoZXIgdGhhbiBleGZ1bnN0dWZmLgotCi0JKiBsaWJiZmQuaDogIFVwZGF0ZSwgYmFzZWQgb24gY2hhbmdlcyBpbiBzb3VyY2UgY29kZSBhbmQgY2hldy4KLQotV2VkIE5vdiAgNCAyMjo0NzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGliaWVlZS5oOiAgQWRkIEZJWE1FIGFib3V0IHJlbW92aW5nIGxpbWl0IG9uIG51bWJlciBvZiBzZWN0aW9ucy4KLQkqIGJmZC1pbi5oOiAgSW1wcm92ZSBjb21tZW50cyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLmggaXMKLQl0aGUgd3JvbmcgcGxhY2UgdG8gZWRpdCB0aGlzIGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBJbnN0YWxsIGFuc2lkZWNsLmggYW5kIG9ic3RhY2suaCBpbiB0aGUKLQlzYW1lIHBsYWNlcyB3aGVyZSB3ZSBpbnN0YWxsIGJmZC5oLgotCi1XZWQgTm92ICA0IDEzOjQwOjIzIDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX2F1eF9pbik6ICBjaGVjayBmb3IKLQlzeW1ib2wgdHlwZSBiZWZvcmUgYmxpbmRseSBtb2RpZnlpbmcgdGhlIGF1eGVudC4gIFNwZWNpZmljYWxseSwKLQlvbmx5IG1vZGlmeSB0aGUgZW5kbmR4IGZpZWxkcyBmb3IgdHlwZXMgdGhhdCBuZWVkIGl0LCBhbmQgZG9uJ3QKLQlzZXQgdGhlIGFycmF5IGluZm9ybWF0aW9uIGZvciBub24tYXJyYXlzLgotCi1XZWQgTm92ICA0IDA5OjMwOjUwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBTZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIHNldCB1cAotCWNvcnJlY3RseSBhbnl3YXlzOyBkb24ndCBoYXZlIHRvIHNldCB1cCAibmV4dCIgcG9pbnRlcnMgbWFudWFsbHkuCi0KLU1vbiBOb3YgIDIgMTI6MzY6MTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taCwgY29uZmlnL2hwMzAwLm1oLCBjb25maWcvaHBwYWhwdXgubWgsCi0JY29uZmlnL2kzODZ2Lm1oOiByZW1vdmVkIC1EVVNHIGZyb20gSERFRklORVMuCi0JaG9zdHMvZGVsdGE4OC5oLCBob3N0cy9ocDMwMC5oLCBob3N0cy9ocHBhaHB1eC5oLCBob3N0cy9pMzg2di5oOgotCWRlZmluZWQgVVNFX1VUSU1FLgotCWhvc3RzL2kzODZ2Lmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRS4KLQotRnJpIE9jdCAzMCAxNjoxMzo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogbWFrZSBhIHByaXZhdGUgY29weSBvZiB0aGUKLQlzZWN0aW9uJ3MgbmFtZSBiZWZvcmUgdHJ1bmNhdGluZyBpdC4KLQotVGh1IE9jdCAyOSAwODozMDo1MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBhZGQgc3ltYm9sX2xlYWRpbmdfY2hhciBlbnRyeSBpbiB0cmFuc2ZlciB2ZWMKLQotLFdlZCBPY3QgMjggMTY6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IGNhbiBub3cgY29wZSB3aGVuIHR3byBzeW1ib2xzIG9mIGEKLQlkaWZmZXJlbnQgY2xhc3MsIGJ1dCB0aGUgc2FtZSBpbmRleCBudW1iZXIgb2NjdXIgY29uc2VjdXRpdmVseS4KLQkoZ2V0X3NlY3Rpb25fZW50cnkpOiBuaWNlciBuYW1lIGZvciBzZWN0aW9ucyBiZWluZyBmb3J3YXJkCi0JcmVmZXJlbmNlZC4gKGllZWVfYXJjaGl2ZV9wKTogZG9uJ3QgZnJlZSB0aGUgZmlsZW5hbWUgc3RyaW5nLAotCXNpbmNlIGl0IHdhcyBuZXZlciBtYWxsb2NlZC4KLQotV2VkIE9jdCAyOCAxMzo0MjowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgWmVybyB0aW1lc3RhbXAgZmllbGQuCi0KLVR1ZSBPY3QgMjcgMTI6MjQ6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IHNldCB0aGUgZmNuYXJ5IGluZm8gYmVmb3JlCi0Jb3B0aW9uYWxseSBzZXR0aW5nIHRoZSBkaW1lbiBpbmZvLCBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZQotCW1lbW9yeSBsb2NhdGlvbnMuICBBbHNvIHplcm8gb3V0IGV4dGVybmFsIGF1eGVudC4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBkb24ndCB6ZXJvIGV4dGVybmFsIGF1eGVudDsgbm93IGRvbmUgaW4KLQljb2ZmX3N3YXBfYXV4X291dC4KLQotRnJpIE9jdCAyMyAxMzo1NTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIENoZWNrIGZjbG9zZSByZXR1cm4gdmFsdWUgZm9yIGVycm9ycy4KLQlsaWJiZmQuaDogYmZkX2NhY2hlX2Nsb3NlIG5vdyByZXR1cm5zIGEgYm9vbGVhbi4KLQljYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogcmV0dXJuIGZjbG9zZSBzdWNjZXNzIHZhbHVlLgotCShiZmRfY2FjaGVfY2xvc2UpOiByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSByZXR1cm4gdmFsdWUuCi0Jb3BuY2xzLmMgKGJmZF9jbG9zZSwgYmZkX2Nsb3NlX2FsbF9kb25lKTogcmV0dXJuIHJlc3VsdCBvZgotCWJmZF9jYWNoZV9jbG9zZS4KLQotRnJpIE9jdCAyMyAxMDozMjozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IGxvYWQgc2VjdGlvbnMgd2l0aG91dCB0aGUgU0VDX0xPQUQgYml0LgotCi1UaHUgT2N0IDE1IDEwOjE2OjM1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJ0eXBlLCBTRUxFQ1RfUkVMT0MpOiBuZXcgZnVuY3Rpb24gdG8KLQl3b3JrIG91dCBhIGNvZmYgcmVsb2NhdGlvbiB0eXBlIGZyb20gYSBob3d0bydzIGF0dHJpYnV0ZXMgcmF0aGVyCi0JdGhhbiB1c2luZyB0aGUgaW5wdXQgcl90eXBlIGZpZWxkLiBUaGlzIGZpeGVzIFBSMTY3NyBhbmQgYWxsb3dzCi0JY29udmVyc2lvbiBvZiBhLm91dCByZWxvY3MgdG8gY29mZiByZWxvY3MuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogaWYgc3VwcGxpZWQgYSByZWxvY2F0aW9uCi0JcmVsYXRpdmUgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLCB1c2UgdGhlIHJpZ2h0IHN5bWJvbCBpbmRleC4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGRvIGEgcGFydGlhbCBsaW5rIGZvciBjb2ZmCi0JcmVsb2NzIHJpZ2h0LgotCi1GcmkgT2N0IDIzIDA4OjE1OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY2hhbmdlcyB0byBzdXBwb3J0IGkzODYtc3lzdiB3aXRoIHNoYXJlZCBsaWJyYXJpZXM6Ci0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IGlmIFRXT19EQVRBX1NFQ1MgaXMgZGVmaW5lZCwKLQljaGVjayBmb3IgLmRhdGEyOyBpZiBfTElCIGlzIGRlZmluZWQsIGNoZWNrIGZvciBpdDsgbWFwCi0JU0VDX05FVkVSX0xPQUQgdG8gU1RZUF9OT0xPQUQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogbWFwIFNUWVBfTk9MT0FEIHRvIFNFQ19ORVZFUl9MT0FELgotCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBpZiBUV09fREFUQV9TRUNTLCBhY2NlcHQgLmRhdGEyLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGZvcmNlIHZhZGRyIG9mIC5saWIgdG8gMDsgc2V0IHNjbnB0cgotCWlmIHNlY3Rpb24gaGFzIGNvbnRlbnRzLCBub3QganVzdCBpZiBpdCBpcyBsb2FkYWJsZTsgaWYKLQlUV09fREFUQV9TRUNTLCBjaGVjayBmb3IgLmRhdGEyCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBzZXQgdm1hIG9mIC5saWIgc2VjdGlvbiB0byBudW1iZXIgb2YKLQkubGliIHNlY3Rpb25zLgotCSogY29mZi1pMzg2LmM6IGRlZmluZSBUV09fREFUQV9TRUNTOyB1c2UgYSBzcGVjaWFsIENBTENfQURERU5EOwotCWRvbid0IGRlZmluZSBjb2ZmX3dyaXRlX2FybWFwIHRvIGJzZF93cml0ZV9hcm1hcC4KLQkqIGhvc3RzL2kzODZ2Lmg6IGRvbid0IGluY2x1ZGUgPHV0aW1lLmg+LCBzaW5jZSBpdCBpcyBub3QgcHJvdmlkZWQKLQlieSBTVlIzLjIuCi0KLVRodSBPY3QgMjIgMjI6NDA6MjAgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzb2xhcmlzMi5oOiBHZXQgdGhlIGRlZmluaXRpb24gb2YgYWxsb2NhIGZyb20gYWxsb2NhLmggaWYgd2UKLQlhcmVuJ3QgdXNpbmcgZ2NjLgotCi1UaHUgT2N0IDIyIDAzOjA3OjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi17YW91dCxib3V0fSk6ICBTdXBwb3J0IHRoZXNlLgotCi1XZWQgT2N0IDIxIDAzOjQ2OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvYTI5ay1hb3V0Lm10IChERUZBVUxUX1RBUkdFVCk6ICBTZXQgdG8gb25lIHRoYXQgZXhpc3RzLgotCi1UaHUgT2N0IDE1IDE1OjA1OjM5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcG9sbG82OC5oLCBhcG9sbG92NjguaCwgaHAzMDAuaCwgaTM4NnYuaCwgaXJpeDMuaDogUmVtb3ZlCi0Jbm8tbG9uZ2VyLXVzZWQgZGVmaW5pdGlvbnMgb2YgTF9TRVQgYW5kIExfSU5DUi4KLQkqIGkzODZsaW51eC5oOiAgVHdlYWtzIHRvIHNtb290aCBMaW51eCBidWlsZC4KLQotVGh1IE9jdCAxNSAwMTozMjoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0Lmg6ICBBZGQgZW51bSB0YWcgdG8gYmZkX3NlY2xldF9lbnVtX3R5cGUuCi0KLQkqIGJmZC1pbi5oIChmaWxlX3B0cik6ICBVcGRhdGUgY29tbWVudHMsIG1ha2UgRklYTUUgcmUgb2ZmX3QuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dGYxLmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLXJzNjAwMC5jLAotCWNvZmZjb2RlLmgsIGVsZi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsIG9hc3lzLmMsCi0Jc2NvLWNvcmUuYzogIExpbnQ6ICBTZWNvbmQgYXJndW1lbnQgb2YgYmZkX3NlZWsgaXMgYWx3YXlzIGZpbGVfcHRyLgotCVRoaXJkIGFyZ3VtZW50IGlzIFNFRUtfU0VUIG9yIFNFRUtfQ1VSLiAgUmVzdWx0IGlzIGFsd2F5cyAwIG9yIC0xLgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhb3V0eC5oLCBib3V0LmMgY29mZi1tNjhrLmMsIGNvZmYtejhrLmMsCi0JY29mZmNvZGUuaCwgZWxmLmMsIGxpYmFvdXQuaCwgbGliYmZkLWluLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBPY3QgIDkgMDM6NDY6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgTmV3IGZpbGUsIGNvbnRhaW5zIG1hcHBpbmcgb2YgaG9zdCBjb25maWdzCi0JdG8gaG9zdCBzdXBwb3J0IGZpbGUgbmFtZXMgZm9yIGJmZCwgYmludXRpbHMsIG9wY29kZXMuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgaXQuCi0JKiBpMzg2YW91dC5jOiAgQ2xlYW51cCwgZHVtcCBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QLgotCSogaTM4NmJzZC5jOiAgQ2xlYW51cCwgcmVmb3JtYXQuCi0JKiBjb25maWcvaTM4Ni1ic2QubXQ6ICBDb21tZW50IGNoYW5nZXMuCi0JKiBjb25maWcvaTM4NmJzZC5taDogIE5ldyBmaWxlIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZic2QuaDogIE1lcmdlIGNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyLgotCSogYm91dC5jIChBTElHTik6ICBSZW5hbWUgdG8gQUxJR05FUiwgc2luY2Ugc3lzdGVtIGhlYWRlciBmaWxlcwotCW9uIEJTRCA0LjQgZGVmaW5lIEFMSUdOIChzaWdoISkuCi0KLVRodSBPY3QgIDggMjI6MTg6MTAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogYWRkZWQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlmaWVsZC4gRm9yIFpNQUdJQyBmaWxlcyBvbmx5LCB3aGVuIHRleHRfaW5jbHVkZXNfaGVhZGVyIGlzIHNldCwgYnkKLQlkZWZhdWx0IHRoZSBsZW5ndGggb2YgdGhlIGV4ZWMgaGVhZGVyIGlzIGNvdW50ZWQgaW4gdGhlIHRleHQKLQlzZWN0aW9uIHNpemUuIEZvciBnbzMyLCBleGVjIGhlYWRlciBpcyBtYXBwZWQgaW4gYnV0IGRvZXMgKm5vdCoKLQljb250cmlidXRlIHRvIHRoZSBzaXplIG9mIHNlY3Rpb24uCi0JKiBhb3V0eC5oIChhb3V0X2FkanVzdF9zaXplc19hbmRfdm1hcyk6IGlmIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JaXMgbm90IHNldCwgYnV0IHp0aWggaXMsIGFkZCB0aGUgc2l6ZSBvZiB0aGUgZXhlYyBoZWFkZXIgdG8gdGhlCi0JcmVjb3JkZWQgc2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBjbGVhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQkqIGkzODZhb3V0LmMgKGkzODZhb3V0X2JhY2tlbmRfZGF0YSk6IHNldCBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQlBbHNvIHNldCB0ZXh0X2luY2x1ZGVzX2hlYWRlci4KLQkqIGFvdXQtdGFyZ2V0LmggKCpfYmFja2VuZF9kYXRhKTogY2xlYXJlIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JYnkgZGVmYXVsdCBpbiBNWShiYWNrZW5kX2RhdGEpLgotCi1UaHUgT2N0ICA4IDE4OjEyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjayk6IERvbid0IGRlZmluZSB0aGlzIGZ1bmN0aW9uIGlmIGl0IHdvbid0IGJlCi0JdXNlZC4KLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogUmVzdG9yZSBvbGQgYW91dF9kYXRhIHZhbHVlIGlmIHRoaXMKLQl0eXBlIGRvZXNuJ3QgbWF0Y2guICBEb24ndCBsb3NlIGlmIGZpbGUgc2VjdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLQljcmVhdGVkLgotCShzZXRfYXJjaF9tYWNoKTogU2V0IHJlbG9jX2VudHJ5X3NpemUuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBiZmRfaF9nZXRfezE2LDh9IGZvciByZWFlZGluZyBzeW1ib2wgZGF0YS4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGlbMzRdODYtKi1ic2QgaG9zdC4KLQotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2ssIHdyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZXMuCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBVc2UgaXQgYXMgZGVmYXVsdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWxldGVkLgotCShNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpdC4KLQotCSogYW91dHguaCAoYWRqdXN0X3NpemVzX2FuZF92bWFzKTogRG9uJ3QgYm90aGVyIHdpdGggcGFkZGluZyBmb3IKLQlPTUFHSUMgZmlsZXMuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBoZWFkZXIgYnl0ZSBvcmRlciwgbm90IHRhcmdldCBieXRlCi0Jb3JkZXIsIGZvciByZWFkaW5nIHN5bWJvbCBkYXRhLgotCi1UaHUgT2N0ICA4IDE3OjMzOjM5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVbmRvIHNvbWUgYnJhaW4gZGFtYWdlIGluIHRoZSBob3N0IHNlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46ICBSZWZvcm1hdCB0aGUgdGFyZ2V0IHNlY3Rpb24sIHRlc3QgbWFueSBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGBtYWtlIG1ha2UnLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIE1ha2UgZGVmaW5lcyBsaW5lIHVwLgotCi1UaHUgT2N0ICA4IDA4OjUyOjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JTm93IGEgYmZkIGtub3dzIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIG5vcm1hbGx5IHByZXBlbmRlZAotCXRvIHN5bWJvbHMgaW4gaXRzIGZpbGUgZm9ybWF0LgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaDgzMDAuYywKLQljb2ZmLXo4ay5jOiB0YXJnZXRzIHNldCBzbyB0aGV5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlCi0JKiBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW1pcHMuYywgY29mZi1tODhrLmMsCi0JY29mZi1yczYwMDAuYywgY29mZi13ZTMyay5jLCBlbGYuYywgaWVlZS5jLCBzcmVjLmM6IHRhcmdldHMgc2V0Ci0Jd2l0aG91dCBsZWFkaW5nIHVuZGVyc2NvcmUgZmxhZwotCSogdGFyZ2V0cy5jOiBhZGQgc3ltYm9sIGxlYWRpbmcgY2hhciB0byB4dmVjIGRlc2NyaXB0aW9uCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvLgotCi1Nb24gT2N0ICA1IDE0OjMyOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6ICBNYWtlIGVycm5vIGdsb2JhbC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogIElmIHJlYWQgZmFpbHMgKGFuZAotCWVycm5vIT0wKSBzZXQgYmZkX2Vycm9yIHRvIG1hbGZvcm1lZF9hcmNoaXZlIChzaW5jZSB0aGlzIHByb2JhYmx5Ci0JaW5kaWNhdGVzIGEgdHJ1bmNhdGVkIGFyY2hpdmUpLCByYXRoZXIgdGhhbiBzeXN0ZW1fY2FsbF9lcnJvci4KLQotTW9uIE9jdCAgNSAwMzozMzozOSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBydWxlcyBmb3IgaTM4NmJzZC5jCi0JKiBpMzg2YnNkLmM6IG5ldyBmaWxlLCBzdXBwb3J0aW5nIDM4NmJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgdGFyZ2V0LgotCSogY29uZmlnL2kzODYtYnNkLm10OiBuZXcgZmlsZSAtIDM4NmJzZCB0YXJnZXQgY29uZmlndXJhdGlvbi4KLQotVGh1IE9jdCAgMSAxNzo1MTowNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmUtYXJyYW5nZSBob3N0IHNlY3Rpb24gdG8gdXNlICotKi0qIG5vdGF0aW9uLAotCWNsZWFuIHVwIHNvbWUgb2YgdGhlIHRhcmdldCBzZWN0aW9uIGFzIHdlbGwKLQotCSogc2VjbGV0LmM6IGNhc3QgcmVzdWx0IG9mIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5ncwotCi1UdWUgU2VwIDI5IDEzOjI0OjA5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogQ3JlYXRlIHNlY3Rpb24gaWYgaXQgZG9lc24ndAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGJvdXQuYzogUmVtb3ZlZCBzb21lIHVudXNlZCB2YXJpYWJsZXMuCi0KLVR1ZSBTZXAgMjkgMDg6MzA6MjEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBQb3J0YWJpbGl0eSBmaXhlcyBmcm9tIHAzOgotCWNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogcmVtb3ZlZCBzYW5pdHkgY2hlY2sgdW50aWwgaXQKLQl3b3JrcyBvbiBhbGwgdGFyZ2V0cyAocGVyIGFkdmljZSBmcm9tIHNhYykuCi0JY29uZmlnL2hwOTAwMC5taDogbmV3IGZpbGUgdG8gZGVmaW5lIFVTRy4KLQlocHBhLmM6ICN1bmRlZiBocHBhIGJlZm9yZSB0aGUgSlVNUF9UQUJMRS4KLQlob3N0cy9ocHBhaHB1eC5oOiAjZGVmaW5lIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiBpZiBub3QKLQlfX1NURENfXy4KLQl0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCk6IGlmIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiwgbWFrZQotCWxvY2FsIHZhcmlhYmxlIHRhcmdldCB2b2xhdGlsZSB0byBhdm9pZCBteXN0ZXJpb3VzIGJ1ZyBpbgotCUhQOTAwMC83MDAgY2MuCi0KLVNhdCBTZXAgMjYgMDM6NTg6NDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9ocHBhYnNkLm1oLCBjb25maWcuaHBwYWhwdXgubWg6ICBSZW1vdmUgdmFyaW91cyBib2dvc2l0eS4KLQkqIGhvc3RzL2hwcGFocHV4Lmg6ICBSZW1vdmUgYmNvcHkgYW5kIGluZGV4IGNpcmN1bXZlbnRpb25zLgotCi1GcmkgU2VwIDI1IDIyOjM2OjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jIChmdW5jX2RhLCBmdW5jX2pyKTogIExpbnQuCi0JKiBjb2ZmY29kZS5oOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQkqIGVsZi5jOiAgVXNlIG1lbWNweSByYXRoZXIgdGhhbiBiY29weS4KLQkqIHRla2hleC5jOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQotRnJpIFNlcCAyNSAxOToxNDo0OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUFkZCBBZG9iZSBhLm91dCBzdXBwb3J0LgotCi0JKiBhb3V0LWFkb2JlLmM6ICBOZXcgZmlsZS4gIFNvIGZhciwgb25seSByZWFkcyBhLm91dC5hZG9iZS4gIEZJWE1FLgotCSogY29uZmlnL2Fkb2JlLm10OiAgQWRkLgotCSogY29uZmlndXJlLmluICgqLWFkb2JlLSogdGFyZ2V0KTogIEFkZC4KLQkqIHRhcmdldHMuYyAoYV9vdXRfYWRvYmVfdmVjKTogIEFkZC4KLQkqIE1ha2VmaWxlLmluOiAgYWRkIGFvdXQtYWRvYmUuYy4KLQotCSogY29uZmlndXJlLmluOiAgUHV0IHR3byBkYXNoZXMgaW4gYWxsIGVudHJpZXMgdG8gYmUgbWF0Y2hlZC4KLQlBZGQgY29tbWVudHMgdG8gcmVtaW5kIHBlb3BsZSB0byBkbyB0aGlzLgotCVJlb3JkZXIgYWxsIGVudHJpZXMgdGhhdCBtYXRjaCBtYW51ZmFjdHVyZXIgbmFtZXMsIHRvIG9jY3VyCi0JbGFzdCwgc28gdGhleSB3aWxsIG9ubHkgYmUgbWF0Y2hlZCBpZiBubyBtb3JlIHNwZWNpZmljIG1hdGNoCi0Jb2NjdXJzLiAgUmVtb3ZlIG1hbnVmYWN0dXJlcnMgYGFvdXQnLCBgYm91dCcsIGBjb2ZmJywgYW5kIGBlbGYnLgotCi1GcmkgU2VwIDI1IDE1OjAzOjIyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IFJldHVybiBiZmRfYWJzX3NlY3Rpb24sIG5vdCAwLAotCXNpbmNlIHdlIHNob3VsZCBuZXZlciBoYXZlIGEgTlVMTCBzZWN0aW9uLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgc3Rfc2huZHggZG9lc24ndCBtYXRjaCBhbnkgb2Ygb3VyCi0JdGVzdHMsIHNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCi0KLUZyaSBTZXAgMjUgMTE6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmM6IGdldHRpbmcgY2xvc2VyCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IGFsbG93Ci0JRVhUUkFfQ0FTRVMgaG9va3MgZm9yIGRpZmZlcmVudCBhcmNoZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVsb2MKLQl0eXBlcy4KLQkqIHNlY2xldC5oOiAjaWZuZGVmIGFyb3VuZCBpdCB0byBhbGxvdyBtdWx0aXBsZSBpbmNsdXNpb24KLQkqIHNyZWMuYzogbWlub3IgZG9jIGZpeAotCi1Nb24gU2VwIDIxIDE0OjMzOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaHA5MDAwLmgsIGhvc3RzL2lyaXgzLmg6IGNoYW5nZXMgZnJvbSBXUlMuCi0KLVN1biBTZXAgMjAgMDg6NDg6MjUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBpMzg2LWVsZiBmb3IgYWxsIGkzODYvaTQ4NiBzeXN2NCBob3N0cywgbm90Ci0JanVzdCBuY3IuCi0KLVRodSBTZXAgMTcgMDY6NDA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgaG93dG8gZmllbGQgYmVmb3JlCi0JZmlsbGluZyBpbiByZWxvYywgaW4gY2FzZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29kZSBkb2Vzbid0IHNldAotCWl0LgotCi1GcmkgU2VwIDExIDE1OjM3OjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogc2V0IHRoZSBsYXN0IHJlbnVtYmVyZWQKLQlzeW1ib2wgcG9pbnRlciB0byBOVUxMLCBhcyBleHBlY3RlZCBieSBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IGFwcGFyZW50bHkgYSBub24temVybyBhZGRlbmQgaXMgT0sgZm9yIHJlbG9jCi0JdHlwZSBSX0lIQ09OU1QgdXNlZCBvbiB0aGUgMjlrLgotCi1UaHUgU2VwIDEwIDEzOjI4OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmRvcGVuIGZvcgotCXVwZGF0ZSwgYmFzZWQgb24gaG93IHRoZSB1bmRlcmx5aW5nIGZpbGUgd2FzIG9wZW5lZC4gIE9ic29sZXRlcwotCUZBU0NJU1RfRkRPUEVOLgotCSogaG9zdHMvcnM2MDAwLmgsIGhvc3RzL3RhaG9lLmgsIGhvc3RzL3ZheGJzZC5oOiAgUmVtb3ZlCi0JYWxsIEZBU0NJU1RfRkRPUEVOIGNvbmZpZyBkZWZpbmVzLgotCi1UdWUgU2VwICA4IDIxOjM3OjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IE1vdmVkIHRvIG9wY29kZXMgbGlicmFyeSwgbm93IHRoYXQgd2UgaGF2ZSBvbmUuCi0JKiBNYWtlZmlsZTogRG9uJ3QgY29tcGlsZSBpdC4KLQotVHVlIFNlcCAgOCAxMDoxMDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6IGFkanVzdF9zaXplc19hbmRfdm1hcyBkaWQgbm90IHJldHVybiBhbnl0aGluZy4KLQotVGh1IFNlcCAgMyAxOToyOTowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2ZsYWdzKTogIFJlbW92ZSBhIHNhbml0eSBjaGVjay4KLQlJdCBpcyB1bmZvcnR1bmF0ZWx5IGJyb2tlbiwgYW5kIHByZXZlbnRzIHN0cmlwIGZyb20gd29ya2luZy4KLQotVGh1IFNlcCAgMyAxNjoxNDo0MCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChjb25kcik6IFJlbW92ZSBleHRyYW5lb3VzLCBidXQgaGFybWxlc3MsIGJhY2tsYXNoCi0JY3JlYXRlZCBieSBsYXN0IGNoYW5nZS4KLQotVGh1IFNlcCAgMyAxMzo1MjozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBNYWtlIHNpemUgZmllbGQgYmUgdW5zaWduZWQuCi0JKiBiZmQtaW4uaDogIEJ1bXAgdG8gdmVyc2lvbiAyLjAuCi0KLVRodSBTZXAgIDMgMDk6MDU6MzcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjcHUtejhrLmM6ICBVc2UgZW51bXMgd2hlbiBpbml0aWFsaXppbmcgc3RydWN0cyB0byBrZWVwCi0JYnJhaW5kYW1hZ2VkIEhQL0Fwb2xsbyBjb21waWxlciBoYXBweS4KLQotV2VkIFNlcCAgMiAwMjo1MzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmM6ICBGaXggZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IFNFQ19DT0RFIGFuZCBTRUNfREFUQS4KLQkqIHRhcmdldHMuYzogIFVwZGF0ZSBkZXNjcmlwdGlvbiBvZiBzZWFyY2ggZm9yIG1hdGNoaW5nIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbiwgY2xlYW4pOiAgRml4IGluZmFudCBtb3J0YWxpdHkgdHlwby4KLQkoZG9jZGlyKTogIFNldCB0byAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MsIHdoaWNoIGhhcyBubyBtYWtlZmlsZS4KLQkoejhrIGFuZCB3ZTMyayBmaWxlcyk6ICBgKi5vOiAqLmMnOiBhdm9pZCBTdW4gTWFrZSBidWcuCi0KLVdlZCBTZXAgIDIgMDA6MjY6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuL2NsZWFuL2Rpc3RjbGVhbiBydWxlcy4KLQotVHVlIFNlcCAgMSAxMzozODo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIFRha2Ugb3V0IG9hc3lzICh1bmxlc3MgdGhhdCBpcwotCXRoZSBkZWZhdWx0KTogIEJlY2F1c2UgdGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIGluIGFyY2hpdmVzLAotCXRoZXJlIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuCi0KLU1vbiBBdWcgMzEgMTA6MTE6MzcgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogUmlnb3JvdXNseSB1cGRhdGVkIHRvIG1hdGNoIGFyY2hpdGVjdHVyZSBtYW51YWwuCi0KLU1vbiBBdWcgMzEgMDg6MDc6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQ8bj5zd2FwX2V4dF9yZWxvY19vdXQpLCBib3V0LmMKLQkoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBmaXggYnVnIDE1MDYgd2hlcmUgYWJzIHN5bWJvbHMgYXR0YWNoZWQKLQl0byB0aGUgYnVpbHQtaW4gYWJzX3NlY3Rpb24gd2VyZSBub3Qgd3JpdHRlbiBvdXQgY29ycmVjdGx5LgotCi1GcmkgQXVnIDI4IDE2OjI5OjE1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwKTogaWYgdGhlIHN5bWRlZl9jb3VudCBpcyB0b28KLQlsYXJnZSwgYXNzdW1lIHdlJ3JlIHVzaW5nIGEgc3dhcHBlZCBieXRlIG9yZGVyIGFuZCBmYWlsIHdpdGgKLQl3cm9uZ19mb3JtYXQgcmF0aGVyIHRoYW4gZHVtcGluZyBjb3JlLgotCi1GcmkgQXVnIDI4IDE1OjM4OjAzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBSZW5hbWVkIG9wYy1zcGFyYy5jIHRvIHNwYXJjLW9wYy5jIGZvciBzeXN0ZW1zIHdpdGggc2hvcnQKLQlmaWxlbmFtZSBjb25zdHJhaW50cy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlLgotCi1UaHUgQXVnIDI3IDEzOjA1OjI4IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQlBZGQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIHdlMzJrOgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZm9jb2RlLmgsIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOgotCU1pbm9yIGVkaXRzLgotCSogY29mZi13ZTMyay5jLCBjcHUtd2UzMmsuYywgY29uZmlnL3dlMzJrLm10LCBob3N0cy93ZTMyay5oOiBOZXcgZmlsZXMuCi0KLVdlZCBBdWcgMjYgMTQ6MjA6MTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYzogYWRkZWQgc3VwcG9ydCBmb3IgcmVsYXhhYmxlIGFsaWdubWVudCByZWxvY3MuCi0KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCwgc2VjbGV0X2R1bXApOiBnZXQgdGhlIGFwcCB0bwotCXBhc3MgZG93biBwb2ludGVyIHRvIHBsYXkgYXJlYSByYXRoZXIgdGhhbiB1c2UgYWxsb2NhCi0KLQkqIGNwdS16OGsuYyAoY29tcGF0aWJsZSk6IG1hZGUgc3RhdGljIHRvIHJlZHVjZSBuYW1lIHNwYWNlCi0JcG9sdXRpb24uCi0KLVR1ZSBBdWcgMjUgMDg6Mzk6MTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSB6OGs6Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjb25maWd1cmUuaW4sIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCB0YXJnZXRzLmMsCi0KLQkqIHN5bXMuYzogbW92ZSBtaXMtaW5zZXJ0ZWQgcGF0Y2guCi0KLUZyaSBBdWcgMTQgMTU6Mzk6MjkgUERUIDE5OTIgIEhvd2FyZCBDaHUgIChoeWNAaGFuYXVtYS5qcGwubmFzYS5nb3YpCi0KLQlEb2N1bWVudGF0aW9uIGZpeGVzOgotCSogY3RvcnMuYywgZm9ybWF0LmMsIHNlY3Rpb24uYywgcmVsb2MuYzogYXBwZW5kICIgLSIgdG8gaXRlbSB0YWdzLgotCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogYWRkIERPQ0REIGJlZm9yZSBAbm9kZQotCQljb21tZW50cy4KLQkqIHJlbG9jLmM6IGJyZWFrIG91dCBhZGRlbmQgaXRlbSBmcm9tIHN1cnJvdW5kaW5nIHRleHQuCi0KLQkqIGRvYy5zdHIgKERPQ0REKTogRGVmaW5lZC4gQWRkcyB0ZXh0IHRvIG91dHB1dC4KLQkoYm9keXRleHQpOiBQdXQgYnVsbGV0aXplIGJlZm9yZSBraWxsX2JvZ3VzX2xpbmVzLgotCSogY2hldy5jIChidWxsZXRpemUpOiBFbmQgaXRlbWl6YXRpb24gYWZ0ZXIgYSBibGFuayBsaW5lLCB0bwotCXByZXZlbnQgZm9sbG93aW5nIHRleHQgZnJvbSBiZWluZyBzd2FsbG93ZWQgdXAgaW4gYW4gaXRlbS4KLQotTW9uIEF1ZyAyNCAyMDo1MDoyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgc3BhcmNsaXRlIGFzIGEgdGFyZ2V0LgotCi1Nb24gQXVnIDI0IDEyOjA2OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfZ2V0X3N5bXRhYik6IGFsd2F5cyBudWxsIHRlcm1pbmF0ZSB0aGUgc3ltYm9sIGxpc3QsCi0JbGludC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogaWYgc3ltYm9scyBkb24ndCBjb21lCi0JZnJvbSBhIGNvZmYgZmlsZSAoY3N5bSBpcyBudWxsKSwgZG9udCBkZXJlZiB0aGVtCi0KLQkqIGllZWUuYyAocGFyc2VfZXhwcmVzc2lvbik6IGdldCB0aGUgYW5zd2VyIHJpZ2h0IHdoZW4gYWRkaW5nIGFuCi0JYWJzKyhzZWMrb2ZmKSwgKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogY2FsbCBpZWVlX29iamVjdF9wCi0Jb24gZWx0cyBzbyB0aGF0IGZpbGVuYW1lIGlzIGZpbGxlZCBpbi4KLQotVGh1IEF1ZyAyMCAxOTowNTo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChob3d0b19hbGlnbl90YWJsZSk6IE5ldyBzZXQgb2YgcmVsb2NzLCB3aXRoIGVub3VnaAotCWRhdGEgZm9yICJvYmpkdW1wIC1yIiB0byB3b3JrLgotCShiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJlY29nbml6ZSBhbGlnbm1lbnQgcmVsb2NzLgotCi1UdWUgQXVnIDE4IDEyOjU3OjQ1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotIAkqIE1ha2VmaWxlLmluOiBhZGRlZCBGTEFHU19UT19QQVNTLCBhbmQgdXNlZCBpdCBmb3IgYWxsIHJlY3Vyc2l2ZQotCWludm9jYXRpb25zIG9mIG1ha2UuICBBbHNvLCBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbgotCWRpcmVjdG9yaWVzLgotCi0JKiBjb25maWcvYXBvbGxvdjY4Lm1oOiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KLQotTW9uIEF1ZyAxNyAxMzo0MDowOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlY3N0YXRpb24ubWggKEhERUZJTkVTKTogU3BlY2lmeSAiLUcgNCIgdG8gYXZvaWQKLQlvdmVyZmxvd2luZyBncC1vZmZzZXQgcmFuZ2UuCi0KLU1vbiBBdWcgMTcgMTE6NDQ6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IGRvbid0IHdyaXRlIG91dCBzZWN0aW9ucwotCXdpdGhvdXQgdGhlIExPQUQgYW5kIEFMTE9DIGF0dHJpYnV0ZXMKLQotTW9uIEF1ZyAxNyAxMTo1NTowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMsIGNwdS1tNjhrLmMsIGNwdS1zcGFyYy5jOiBVbmRvIDE2IEp1bmUgY2hhbmdlcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogTmV3IGNhbGxiYWNrICJzZXRfc2l6ZXMiLgotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBzZXQgcGFnZS9zZWcgc2l6ZXMuCi0JKG1rb2JqZWN0KTogRGl0dG8uCi0JKHNldF9zaXplcyk6IE5ldyByb3V0aW5lLgotCShiYWNrZW5kX2RhdGEpOiBQb2ludCB0byBpdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfc2V0X3NpemVzKTogSGVlZCBhcmNoaXRlY3R1cmUgd2hlbiBzZXR0aW5nIHNpemVzLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogUG9pbnQgdG8gaXQuCi0JKiBhb3V0eC5oIChzZXRfYXJjaF9tYWNoKTogQ2FsbCBzZXRfc2l6ZXMgY2FsbGJhY2suCi0KLUZyaSBBdWcgMTQgMTk6MjI6MTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZQotCXRoZSBkZWZhdWx0LiAgR2l2ZW4gdGhhdCB3ZSAqd3JpdGUqIHRoZSBzdWNrZXJzIChmb3IgbG9uZwotCWFyY2hpdmUgbWVtYmVyIG5hbWVzKSwgd2UgcmVhbGx5IG91Z2h0IHRvIGJlIGFibGUgdG8gcmVhZCB0aGVtIQotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPi4gIEl0IGRvZXNuJ3QKLQlzZWVtIHRvIGJlIG5lZWRlZCwgYW5kIG1hbnkgbWFjaGluZXMgZG9uJ3QgaGF2ZSBpdC4KLQotVGh1IEF1ZyAxMyAwOTo1MzozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKHZlY3Rvcik6IHJlYWQgYW5kIHdyaXRlIGFyY2hpdmVzIGluIGNvZmYgZm9ybWF0LgotCi1UdWUgQXVnIDExIDEyOjE5OjQyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBvcGMtc3BhcmMuYzogTmV3IGZpbGUuCi0KLVNhdCBBdWcgIDggMjM6MTU6MzUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYmZkX3JlbG9jX3N0YXR1c190eXBlLCBjYWxsal9jYWxsYmFjayk6ICBDYXN0IHZvaWQqCi0JcG9pbnRlcnMgdG8gYmZkX2J5dGUqIGJlZm9yZSBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlbS4gIFN1Y2gKLQl1c2Ugd2l0aCBiYXJlIHZvaWQqIHBvaW50ZXJzIGlzIGEgZ2NjIGV4dGVuc2lvbi4KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9kZWxldGUpOiAgRm9yd2FyZCBkZWNsIHdpdGggcHJvdG90eXBlIGZvcm0uCi0JKiBhcmNoaXZlIChub3JtYWxpemUpOiAgQWRkIHRvIENPTlNUIHRvIG1hdGNoIGFjdHVhbCB1c2FnZXMgd2l0aAotCUNPTlNULgotCi1Nb24gQXVnICAzIDAwOjM1OjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgaTQ4NiBob3N0IGNwdSwgYW5kIHVzZSBpMzg2LWVsZgotCWZvciBpNDg2LW5jci1zeXN2NC4KLQotU2F0IEF1ZyAgMSAxMzo0OTo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N0cmF0dXMubXQgKENDKTogIFJlbW92ZSBkZWZpbml0aW9uLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBUZXN0IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdAotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMIGFuZCBkb24ndCBkZXJlZmVyZW5jZSBpdC4KLQotTW9uIEp1bCAyMCAwMjo0NjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGFkZCBocHBhX2RhdGEgdG8gYmZkIHRkYXRhIChpbmRpcmVjdGx5IHZpYSBzZWYpLgotCi0JKiBjb25maWcvaHBwYWhwdXgubWg6IGhwdXggaXMgLURVU0cgKHBhdGNoIGJ5IHNlZikKLQotU2F0IEp1bCAxOCAxNTo1MDoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6MzI6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgY2FjaGUuYywgY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywKLQkgIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywgZGVtbzY0LmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsCi0JICBvYXN5cy5jLCBvcG5jbHMuYywgc3Vub3MuYywgdGFyZ2V0cy5jOiByZW1vdmVkIHJjc2lkJ3MuCi0KLUZyaSBKdWwgMTcgMTc6MDY6NTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBocHBhKiBpbnN0ZWFkIG9mIGhwcGEKLQotVGh1IEp1bCAxNiAxNjozOToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmM6IGFkZGVkIFJfUkVMTE9OR19ORUcgcmVsb2MgdHlwZSwgYW5kIGNoYW5nZWQKLQlSVFlQRTJIT1dUTyB0byBjb3BlIHdpdGggc2FtZS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBhZGRlZCBzdXBwb3J0IGZvciBzaXplIG9mIC0yCi0JKHN1YnRyYWN0IGEgd29yZCByZWxvYyB0eXBlKS4gVXBkYXRlZCBkb2MuCi0KLVRodSBKdWwgMTYgMTY6Mjg6MDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWVyZ2VkIGNoYW5nZXMgZnJvbSBwcm9ncmVzc2l2ZSwgcmVtb3ZlZCByY3NpZC4KLQotCSogYXJjaHVyZXMuYywgYXJjaGl2ZS5jLCBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCi0KLVRodSBKdWwgMTYgMDg6MDg6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIDogYWRkIEJGRF9JU19SRUxBWEFCTEUgZmxhZwotCSogYm91dC5jIChib3V0X3N3YXBfZXhlY19oZWFkZXJfW2luX291dF0pOiBuZXcgZmllbGQgaW4gZXhlYwotCWhlYWRlciBlX3JlbGF4YWJsZSwgbWFqb3IgaGFja2VyeSBpbiBjYWxsYmFja3MKLQkqIGxpYmFvdXQuaCA6IGFkZCBzcGFjZSBmb3IgYV9yZWxheGFibGUuCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgcmVsYXggZW1wdHkgc2VjdGlvbnMKLQotCi1XZWQgSnVsIDE1IDA3OjU3OjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogYWRkIHNvbWUgY2FzdHMgdG8gdGhlIGluaXRpYWxpemVycyBmb3IKLQlkdW1iIGNvbXBpbGVycwotCi1UdWUgSnVsIDE0IDE0OjA2OjI4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIEdyZWF0bHkgc2ltcGxpZnkgZXhwcmVzc2lvbiwKLQlhbmQgYWRkIGFwcHJvcHJpYXRlIGNhc3RzIHRvIGtlZXAgKHBpY2F5dW5lKSBhaXgtY2MgaGFwcHkuCi0KLU1vbiBKdWwgMTMgMDU6MDY6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE5vdyAybmQgYXJnIGlzIHdoZXJlIHRvIHdyaXRlCi0Jc3ltYm9sIHBvaW50ZXJzLiAgUHVudCBleHBlbnNpdmUgJiB1c2VsZXNzIGJmZF9yZWFsbG9jLiAgVXNlCi0JbWFsbG9jIGZvciByYXcgc3ltYm9scywgYW5kIGZyZWUgaXQgYmVmb3JlIHJldHVybmluZy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERvIG5vdCBzbHVycCBzeW1ib2wgdGFibGUgdW50aWwgcG9saXRlbHkKLQlhc2tlZC4gCURvIG5vdCBldmVuIHNsdXJwIHN0cmluZyB0YWJsZXMuCi0JKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIENvdW50ICdlbSB3aXRob3V0IHJlYWRpbmcgdGhlbS4KLQkoZWxmX2dldF9zeW10YWIpOiAgVGhpcyBpcyBob3cgdG8gcG9saXRlbHkgYXNrLiAgU2NobHVycCEKLQlUaGlzIHNob3VsZCBwcm9iYWJseSBqdXN0ICpiZWNvbWUqIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsIEZJWE1FLgotCi1XZWQgSnVsICA4IDE2OjI0OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IHdyaXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlCi0JYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mCi0JdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMKLQlvdXQgb2YgZGF0ZS4KLQotVHVlIEp1bCAgNyAwMDoyMzoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay1lcmljc3Nvbi0qLgotCi1TYXQgSnVsICA0IDAzOjI5OjQxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1zLmg6ICBEZWZpbmUgQlNGX0ZJTEUsIHVwZGF0ZSBCU0ZfU0VDVElPTl9TWU0gZGVzYy4KLQkqIGVsZi5jOiAgUmVtb3ZlIHVuY29uZGl0aW9uYWwgZGVidWcgcHJpbnRmJ3MuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZGxlCi0JQlNGX1NFQ1RJT05fU1lNIDw9PiBTVFRfU0VDVElPTiwgQlNGX0ZJTEUgPD0+IFNUVF9GSUxFLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmQgb3V0IHN5bWJvbHMgaW4gZm9yd2FyZCwgbm90Ci0JcmV2ZXJzZSBvcmRlci4gIFNpbXBsaWZ5IGR1cGxpY2F0ZSBjb2RlLgotCi1GcmkgSnVsICAzIDIwOjIzOjM0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIFJlbW92ZSAiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZQotCXJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLVR1ZSBKdW4gMzAgMTY6NDk6MTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEFwcGx5IEpvaG4ncyBzdGFuZGFyZCBmaXggdG8gYXZvaWQgImVtcHR5IHRyYW5zbGF0aW9uCi0JdW5pdCIgd2FybmluZ3MgZnJvbSBzb21lIEFOU0ktQyBjb21waWxlcnMuCi0KLVRodSBKdW4gMjUgMDQ6Mzk6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3NvbGFyaXMyLmg6ICBDb25maWd1cmUgc2FtZSBhcyBzeXN2NC4KLQotVHVlIEp1biAyMyAyMTo1NDo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIChiZmRfc2Vlayk6ICBNYWtlIHByb3RvdHlwZSBtYXRjaCBkZWZpbml0aW9uLgotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiAgTWFrZSBjYXN0IG9uIHJldHVybgotCXR5cGUgbWF0Y2ggYWN0dWFsIHJldHVybiB0eXBlLgotCSogZWxmX3ByaW50X3N5bWJvbCAoc2VjdGlvbl9uYW1lKTogIE1ha2UgQ09OU1QuCi0KLU1vbiBKdW4gMjIgMTc6MzU6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGkzODZsaW51eC5jLCBob3N0cy9pMzg2bGludXguaCwgY29uZmlnL2kzODYtbGludXgubXQ6Ci0JTmV3IGZpbGVzLCBmb3IgTGludXggKGEgZnJlZSBVbml4IGNsb25lIGZvciAzODYgbWFjaGluZXMpLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1GcmkgSnVuIDE5IDIwOjIzOjIxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCUxpbnRzIGZvciBiZmRfcmVsb2NfY29kZV90eXBlLT5iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGFuZAotCWNvcnJlY3QgY2FsbGluZyBvZiBob3d0byBzcGVjaWFsIGZ1bmN0aW9ucyBhbmQgZml4ZXMgZnJvbSBSYWVidXJuCi0JZm9yIGdhczw+YmZkbmVzcwotCSogYXJjaHVyZXMuYzogbnVrZSBiZmRfcmVsb2NfY29kZV90eXBlCi0JKiBib3V0LmMsIGNwdS1oODMwMC5jLCBjb2ZmLWk5NjAuYywgY29mZi1tODhrLmM6IHNwZWNpYWwgZnVuY3Rpb24gbGludAotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBTVFlQX0lORk8gaXMgbWFya2VkIGFzCi0JU0VDX05FVkVSX0xPQUQsIHZhcmlvdXMgb3RoZXIgYmZkZ2FzIG5ld25lc3MKLQkqIHJlbG9jLmMtPmxpYmJmZC5oOiBjaGFuZ2UgcHJvdHlwZSBvZiBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCSogdGFyZ2V0cy5jOiBjaGFuZ2UganVtcCB0YWJsZSB2ZWN0b3IgdG8gYWJvdmUKLQotCi1GcmkgSnVuIDE5IDE5OjAwOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiAgTWFyayBhcyBJTlRFUk5BTF9GVU5DVElPTiBzbwotCWl0cyBwcm90b3R5cGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJiZmQuaC4gIENoYW5nZSByZXN1bHQgdHlwZQotCXRvIHN0cnVjdCAqIChyYXRoZXIgdGhhbiBlcXVpdmFsZW50IHR5cGVkZWYpIHNvIGl0IGNhbiBiZSB1c2VkIGluCi0JdGhlIHByb3RvdHlwZSwgd2hlcmUgdGhleSB0eXBlZGVmIHdvbid0IGJlIGtub3duLgotCSogbGliYmZkLmg6ICBVcGRhdGVkIHZlcnNpb24uCi0KLUZyaSBKdW4gMTkgMTU6MjE6NTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvbmZpZ3VyZS5pbiwgY3B1LWhwcGEuYywgaHBwYS5jLCBsaWJocHBhLmgsCi0JdGFyZ2V0cy5jOiAgSFBQQSBtZXJnZS4KLQotRnJpIEp1biAxOSAxMjoyMTozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgU29sYXJpczIgZnJvbSBTWVNWNCBvbiBTUEFSQy4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogIEtsdWRnZSBhcm91bmQgU3VuIGNvbXBpbGVyIGJ1Zy4KLQotV2VkIEp1biAxNyAxNDowMjo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogIENoYW5nZSBkZWZzIG9mIHR3byBiaXRmaWVsZHMgdG8KLQliZSB1bnNpZ25lZCBjaGFycyBpbnN0ZWFkIHRvIGdldCBhcm91bmQgcnM2MDAwIGNvbXBpbGVyIHByb2JsZW0uCi0KLVdlZCBKdW4gMTcgMTM6NTU6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOgotCUNvcnJlY3QgbWlzY29uY2VwdGlvbiB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzeW1ib2wgdGFibGUuCi0JT25seSBjYWxsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUgb24gdGhlIGZ1bGwgc3ltYm9sIHRhYmxlLCBub3QKLQl0aGUgZHluYW1pYyBvbmUgd2hpY2ggaXMgb25seSBhIHN1YnNldCBvZiB0aGUgZnVsbCBvbmUuCi0KLVdlZCBKdW4gMTcgMTU6NTQ6NTcgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yIEk5NjAsCi0JZG9uJ3QgYWxpZ24gc2VjdGlvbnMgaW4gZmlsZS4KLQotVHVlIEp1biAxNiAwNjoyODoyMSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIGZpZWxkIGZvciB0YXJnZXQtc3BlY2lmaWMKLQkoYnV0IG5vdCBmaWxlLXNwZWNpZmljKSBkYXRhLCBmb3IgZGlzdGluZ3Vpc2hpbmcgbWlub3IKLQljaGFyYWN0ZXJpc3RpY3MgYmV0d2VlbiAoZS5nLikgYS5vdXQgZm9ybWF0cy4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTmV3IGZpZWxkIHVzZXJfc2V0X3ZtYSBpbmRpY2F0ZXMgdm1hCi0JZmllbGQgc2hvdWxkIGJlIGhlZWRlZCwgbm90IGFzc3VtZWQgdG8gYmUgdW5zZXQuCi0JKFNURF9TRUNUSU9OKTogSW5pdGlhbGl6ZSB0aGF0IGZpZWxkIG9mIHN0YW5kYXJkIHNlY3Rpb25zIHRvIHplcm8uCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCB1c2VyX3NldF92bWEgdG8gdHJ1ZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBXcml0ZSBvdXQgc3dhcHBlZCByZWxvYywgbm90Ci0JcHJlLXN3YXBwZWQgdmVyc2lvbi4KLQotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBGaXhlZCBvcmRlciBvZiBjb21tZW50IGFuZAotCWZpZWxkIGRlY2wuICBOZXcgZmllbGRzIGluZGljYXRlIHNpemUgb2YgcGFnZSBhbmQgc2VnbWVudCBmb3IKLQlhcmNoaXRlY3R1cmUuCi0JKiBjcHUtbTY4ay5jIChOKTogRmlsbCBpbiB2YWx1ZXMuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IERpdHRvLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IFZhcmlvdXMgYml0cyBvZiBkYXRhIChub3QKLQlhbGwgdXNlZCBjdXJyZW50bHkpIHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEub3V0IGltcGxlbWVudGF0aW9uLgotCUltcG9ydGFudCBmaWVsZCBmb3Igbm93IGlzIHRleHRfaW5jbHVkZXNfaGVhZGVyLCBpbmRpY2F0aW5nIHRoYXQKLQl0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBoZWFkZXIsIHdoaWNoCi0JZ2V0cyBtYXBwZWQgaW4gd2l0aCBpdC4KLQkoc3RydWN0IGFvdXRfZGF0YSk6IE5ldyBmaWVsZHMgaW5kaWNhdGUgd2hldGhlciB2bWEgaGFzIGJlZW4KLQlhZGp1c3RlZCB5ZXQgKG5vdCB5ZXQgdXNlZCksIGFuZCB3aGF0IG1hZ2ljIG51bWJlciB3aWxsIGJlIHVzZWQgaW4KLQl0aGUgb3V0cHV0IGZpbGUgKHNob3VsZCBnbyBhd2F5IGluIGZhdm9yIG9mIHZtYV9hZGp1c3RlZCkuCi0JKFdSSVRFX0hFQURFUlMpOiBDb2RlIGZvciBkZWFsaW5nIHdpdGggc2VjdGlvbiBzaXplcyBhbmQgcmVsYXRlZAotCWhlYWRlciBmaWVsZHMgcmVwbGFjZWQgd2l0aCBjYWxsIHRvIGFkanVzdF9zaXplc19hbmRfdm1hcy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IEZpbGwgaW4gbWFnaWMgbnVtYmVyIGZpZWxkLgotCVNldCBXUF9URVhUIGZsYWcgZm9yIFpNQUdJQyBhcyB3ZWxsIGFzIE5NQUdJQyBmaWxlcy4KLQkoc2V0X2FyY2hfbWFjaCk6IFNldCBwYWdlIHNpemUgYW5kIHNlZ21lbnQgc2l6ZSBvbmNlIENQVQotCXR5cGUgaXMga25vd24uCi0JKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IE5ldyBmdW5jdGlvbjsgaGFzIG11Y2ggY29kZSBtb3ZlZAotCWZyb20gc2V0X3NlY3Rpb25fY29udGVudHMgYW5kIFdSSVRFX0hFQURFUlMuICBTZXRzIG9yIGFkanVzdHMgdm1hCi0JYW5kIHNpemUgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBtYW55IGhlYWRlciBmaWVsZHMsIGFmdGVyIGRlY2lkaW5nCi0Jb24gbWFnaWMgbnVtYmVyIGZvciBvdXRwdXQgZmlsZS4gIENoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGlzCi0JYWRqdXN0bWVudCBoYXMgb25seSBiZWVuIGRvbmUgb25jZS4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIGFkanVzdF9zaXplc19hbmRfdm1hcyBpbnN0ZWFkIG9mCi0JZG9pbmcgbXVjaCBvZiB0aGUgd29yayBoZXJlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9tYWtlX2RlYnVnX3N5bWJvbCwgTVlfYmFja2VuZF9kYXRhKTogUHJvdmlkZQotCWRlZmF1bHQgKG51bGwpIHZhbHVlcyBvZiB0aGVzZSBmaWVsZHMuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IG92ZXJyaWRlIGFfdGV4dAotCXZhbHVlIGluIGV4ZWMgaGVhZGVyLgotCShzdW5vczRfYW91dF9iYWNrZW5kLCBNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUgYmFja2VuZCBkYXRhCi0JaW5kaWNhdGluZyBmaWxlIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0ZXh0IHNlY3Rpb24uCi0KLQkqIGFvdXRmMS5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IEZpeCB0eXBvLgotCi0JKiBob3N0cy9zcGFyYy5oIChhYm9ydCwgZXhpdCk6IEhpZGUgdGhlc2UgbmFtZXMgaWYgY29tcGlsaW5nIHdpdGgKLQlnY2MgdmVyc2lvbiAyLCB0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEp1biAxNSAxMjoyNjo1NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL25jcjMwMDAubWggKElOU1RBTEwsIFJBTkxJQik6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCdzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLiAgVXNlIHNpbXBsZSAidHJ1ZSIgZm9yIFJBTkxJQi4KLQotU2F0IEp1biAxMyAwOToxNjo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG02ODBbMDEyMzRdMC13cnMtKik6IEZpeCB0eXBvIGluIG1hdGNoIHBhdHRlcm4uCi0KLUZyaSBKdW4gMTIgMTk6NDg6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiAgUmVtb3ZlIGV4dHJhIHNlbWljb2xvbiBpbiBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWd1cmUuaW46ICBSZXdyaXRlIHRhcmdldCBwYXJzaW5nIHRvIHVzZSBzaW1wbGUgZm9ybWF0LgotCUhhbmRsZSBzcGFyYy1zdW4tc29sYXJpczIgY29uZmlndXJhdGlvbi4KLQkqIGFvdXQ2NC5oOiAgQXZvaWQgQU5TSSBDIGJyYWluIGRlYXRoIHdhcm5pbmcuCi0JKiBlbGYuYzogIEF2b2lkIHRyaWdyYXBoICg/Pz8pIG9yIC8qIGluIGNvbW1lbnRzLgotCi1GcmkgSnVuIDEyIDE0OjUxOjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N5c3Y0Lm1oOiBuZXcgZmlsZSwgUkFOTElCPWVjaG8KLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgU29sYXJpczIgYXMgLXN5c3Y0IG9yIC1zb2xhcmlzMgotCi1UaHUgSnVuIDExIDAwOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX29ial90ZGF0YSk6ICBNZXJnZSBlbGZfb2JqX3RkYXRhX3N0cnVjdCBhbmQKLQllbGZfY29yZV90ZGF0YV9zdHJ1Y3QgaW50byBhIHNpbmdsZSBjb21tb24gc3RydWN0LiAgQ29yZSBmaWxlcwotCXdvdWxkbid0IGhhdmUgd29ya2VkIGF0IGFsbCB3aXRob3V0IHRoaXMuCi0JKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE5ldyBmdW5jdGlvbiBmb3IgR0RCJ3MgdW5kZXJjb3ZlciB1c2UKLQl0byBmaW5kIHN0cmluZyBzZWN0aW9ucyB0aGF0IEJGRCBoaWRlcyBmcm9tIGl0LgotCShlbGZfZ2V0X3N0cl9zZWN0aW9uKTogIEF2b2lkIG11bHRpcGxlIGFsbG9jJnJlYWRzIGZvciBzYW1lIGRhdGE7Ci0JbGludC4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWxsb2NhdGUgaW50ZXJuYWwgZmlsZSBoZWFkZXIKLQlzdG9yYWdlIGR5bmFtaWNhbGx5LgotCSogYmZkLmMgKHVuaW9uIHsuLi59IHRkYXRhKTogIFJlbW92ZSBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCi0JKiBkZW1vNjQuYzogIFByZXZlbnQgImVtcHR5IHRyYW5zbGF0aW9uIHVuaXQiIHdhcm5pbmdzIGZyb20gaWRpb3RzLgotCi1UdWUgSnVuICA5IDE3OjE1OjI2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve2kzODZ2NC5taCwgbmNyMzAwMC5taH06ICBVcGRhdGUgUkFOTElCLCBhZGQgSU5TVEFMTC4KLQotU2F0IEp1biAgNiAxNzowMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIFNvbGFyaXMyIGFzICotc3VuLXN5c3Y0IG9yIGFzICotc3VuLXN1bm9zNS4KLQotU3VuIE1heSAzMSAwNTo0NTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBtNjgwWzAxMjM0XTAgYXMgYWxpYXNlcyBmb3IgbTY4awotCi1UdWUgTWF5IDI2IDE2OjUwOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYzogZG8gYnl0ZSByZWxvY3MgY29ycmVjdGx5Ci0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IG5ldmVyIGxvYWQgSU5GTyBzZWN0aW9ucwotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbG9jYXRlIElORk8gc2VjdGlvbnMKLQotV2VkIE1heSAyMCAwODoxODoxOCAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogc2VjdGlvbi5jIChiZmRfKl9zeW1ib2wsIGJmZF8qX3NlY3Rpb24pOiBJbml0aWFsaXplIHN0YXRpY2FsbHkuCi0JTWFrZSB0aGUgc3ltYm9scyB1bm1vZGlmaWFibGUuCi0JKGJmZF9zZWN0aW9uX2luaXQpOiBEZWxldGVkLgotCSogaW5pdC5jIChiZmRfaW5pdCk6IERvbid0IGNhbGwgYmZkX3NlY3Rpb25faW5pdC4KLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbnN1cmUgdGhhdCByYW5nZSB0byBiZQotCXdyaXR0ZW4gaXMgd2l0aGluIHNlY3Rpb24gYm91bmRhcmllcy4KLQkoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuICBEb24ndCBib3RoZXIgZGlzcGF0Y2hpbmcgaWYKLQlzaXplIGlzIHplcm8uCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYyk6IFRleHQgb2YgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgY29uc3QuCi0KLQkqIGNvZmYtaTk2MC5jIChob3d0b190YWJsZSk6IERlbGV0ZWQuCi0JKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCwgaG93dG9fb3B0Y2FsbCk6IE5ldyB2YXJzOwotCWludGVyZXN0aW5nIGVudHJpZXMgZnJvbSBvbGQgaG93dG9fdGFibGUuCi0JKFJUWVBFMkhPV1RPKTogQWRqdXN0ZWQgdG8gdXNlIHN3aXRjaC4KLQkoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBhdXgKLQlyZWNvcmRzIGZvciBzZWN0aW9uIHN5bWJvbC4KLQkobWFrZV9hYnNfc2VjdGlvbik6IFVudXNlZDsgZGVsZXRlZC4KLQkocmVudW1iZXJfc3ltYm9scyk6IFJlLW9yZGVyIHN5bWJvbHMgc28gdW5kZWZpbmVkIHN5bWJvbHMgY29tZQotCWxhc3QsIGFzIENPRkYgZm9ybWF0IGRlc2lyZXMuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogUHV0IENfRklMRSBzeW1ib2xzIGluIGRlYnVnIHNlY3Rpb24gYWx3YXlzLgotCShjb2ZmX3NlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uOyBjcmVhdGVzIGEgc3ltYm9sIHdpdGggdGhlCi0Jc2FtZSBuYW1lIGFzIGEgc2VjdGlvbiwgYW5kIHNldHMgdXAgYXV4IHJlY29yZHMgZm9yIGl0LgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb247IGFkZHMgc2VjdGlvbiBzeW1ib2xzIHRvCi0Jc3ltYm9sIHRhYmxlIGlmIHRoZXkgYXJlbid0IHRoZXJlIGFscmVhZHkuICBTaG91bGQgc29tZWRheSBhbHNvCi0JYWRkIGEgZHVtbXkgQ19GSUxFIHN5bWJvbCBpZiBub25lIGlzIHByZXNlbnQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkIG1pc3Npbmcgc3ltYm9scyBiZWZvcmUgcHJlcGFyaW5nCi0Jc3ltYm9sIHRhYmxlIHRvIGJlIHdyaXR0ZW4uCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBWZXJpZnkgdGhhdCBzeW1ib2wgaW5kaWNlcyByZWFkIGluIGFyZQotCWluIGEgcmVhc29uYWJsZSByYW5nZS4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiBOZXcgZmllbGQgY29udl90YWJsZV9zaXplLgotCShvYmpfY29udl90YWJsZV9zaXplKTogQWNjZXNzb3IgbWFjcm8uCi0KLQkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIHRocmVlCi0JcmVsb2MgdHlwZXMgb24gaTk2MC4KLQotCSogYmZkLWluLmggKGJmZF9nZXRfc2VjdGlvbl9uYW1lKTogTmV3IG1hY3JvLiAgTGlrZQotCWJmZF9zZWN0aW9uX25hbWUsIGJ1dCByZXR1cm5zIHJ2YWx1ZSwgbm90IGx2YWx1ZS4KLQkoYmZkX2dldF9zZWN0aW9uX3ZtYSwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCk6IFNpbWlsYXIuCi0JKGJmZF9nZXRfc2VjdGlvbl9mbGFncyk6IE5vdyByZXR1cm5zIHJ2YWx1ZS4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkIHNldmVyYWwgbmV3IHZhbHVlcywgc29tZQotCWdlbmVyYWwsIHNvbWUgc3BlY2lmaWMgdG8gc3BhcmMgb3IgaTk2MC4KLQotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgVk1BIGZvciBlYWNoIHNlY3Rpb24gYmFzZWQKLQlvbiBwcmV2aW91cyBzZWN0aW9uLiAgSWYgdGV4dCBzZWN0aW9uIFZNQSBkb2Vzbid0IGFwcGVhciB0byBoYXZlCi0JYmVlbiBzZXQsIG1ha2UgYSBiZXN0IGd1ZXNzIGZyb20gdGhlIHR5cGUgb2YgZmlsZS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEZWZpbmUgYXMgemVybyBpZgotCW5vdCBkZWZpbmVkLgotCShNWSh2ZWMpKTogSW5pdGlhbGl6ZSByZWxvY190eXBlX2xvb2t1cCBmaWVsZC4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfKik6IEV4cG9ydCBhcyBhb3V0XyNfKl9ob3d0b190YWJsZS4KLQkoYmZkX2Vycm9yX3RyYXAsIGJmZF9lcnJvcl92ZWN0b3IpOiBFeHRlcm4sIG5vdCBjb21tb24uCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIGEKLQlmZXcgdHlwZXMgb2YgcmVsb2NzIGZvciBzcGFyYzsgd2lsbCBuZWVkIGVuaGFuY2VtZW50LgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogVXNlIERFRlVOIG1hY3JvIGluIGRlZmluaXRpb24uCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IExpa2V3aXNlLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZHMgcmVsb2NfdHlwZV9sb29rdXAgYW5kCi0JX2JmZF9tYWtlX2RlYnVnX3N5bWJvbC4gIEFsc28gbWlub3IgY29tbWVudCBjaGFuZ2VzLgotCSogc3ltcy5jIChiZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBOZXcgZGlzcGF0Y2hpbmcgbWFjcm8uCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUYWtlIGEgQkZEIHB0ciBhcyBhcmcgcmF0aGVyCi0JdGhhbiBhcmNoIGluZm8sIGFuZCBkaXNwYXRjaCB3aXRoIEJGRF9TRU5ELiAgQ2FsbGVycyBjaGFuZ2VkLgotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBEZWxldGVkIGZpZWxkCi0JcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjcHUtKi5jOiBEb24ndCBpbml0aWFsaXplIHRoYXQgZmllbGQuCi0KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6IEFkZCBuZXcgdmFsdWUgImJhZF92YWx1ZSIuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBOb3cgY29uc3Q7IGFkZGVkIGVudHJ5IGZvciBiYWRfdmFsdWUuCi0JKGJmZF9lcnJtc2cpOiBOb3cgcmV0dXJucyBwdHIgdG8gY29uc3QuCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyk6IEZpeCBwcm90b3R5cGUuCi0KLQkqIGNhY2hlLmMgKEJGRF9DQUNIRV9NQVhfT1BFTik6IEZpeCB0eXBvIGluIGRvYy4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24pOiBEaXR0by4KLQotCSogc2VjdGlvbi5jIChTZWN0aW9uIE91dHB1dCBkb2MpOiBJbXByb3ZlIGRlc2NyaXB0aW9uIG9mIHVzZSBvZgotCW91dHB1dF9zZWN0aW9uIGFuZCBvdXRwdXRfb2Zmc2V0LgotCi1UdWUgTWF5IDE5IDIzOjQyOjEwIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYzogbmV3IGZpbGUgZnJvbSBuZXQuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGJ1Z2ZpeCBmcm9tIG5ldDoKLQkgIE5vdyB3ZSBoYXZlIHRoZSBoYWlyeSBsaW5rZXIsIGl0J3MgcG9zc2libGUgdG8gbW92ZSBzeW1ib2xzIGZyb20KLQkgIG9uZSBzZWN0aW9uIGludG8gYW5vdGhlci4gIEFjdHVhbGx5IG1ha2UgdGhhdCB3b3JrIQotCi1TYXQgTWF5IDE2IDE3OjU3OjU5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBmaXggZGVjbGFyYXRpb24gb2YgZnJlZS4KLQotVHVlIE1heSAxMiAxNDowODo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKHBlcmZvcm1fcmVsb2MpOiBmaXggYnVnIGluIGptcC9jYWxsIGV2YWx1YXRpb24KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfcHJvY2Vzc2luZyk6IGFsbCByZWxvY3MgYXJlIHJlbGF0aXZlIHRvCi0Jc2VjdGlvbiBzdGFydC4KLQkqIG9wbmNscy5jOiBkb24ndCB1c2UgZmRvcGVuIG9uIERPUyBzeXN0ZW1zCi0KLQlzaG9ydCBwYXRjaGVzIGZyb20gR2xlbm4gS2FzdGVuIChnbGVubkByZWFkeS5jb20pCi0JKiB0YXJnZXQuYzogZW5hYmxlZCBvYXN5cyBzdXBwb3J0Ci0JKiBvYXN5cy5jOiAgSW5zZXJ0IC4gd2hlbiBVTkRFUlNDT1JFX0hBQ0sgaXMgZW5hYmxlZCwKLQlmaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gd2hpY2ggY3Jvc3NlZCBhIG1vZGlmaWNhdGlvbiBieXRlCi0JYm91bmRhcnkgZGlkIG5vdCB3b3JrLiBGaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gbmVhciB0aGUgZW5kCi0Jb2YgYSBkYXRhIHJlY29yZCBkaWQgbm90IHdvcmsuCi0KLQotVHVlIE1heSAgNSAxODoxMToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfY29mZl9hcm1hcCk6IG9sZCB2ZXJzaW9ucyBvZiBCRkQgd3JvdGUKLQlhcmNodmllIGhlYWRlciBzdHJpbmcgY291bnRzIHRoZSBlbmRpYW4gd2F5LCB0aGlzIGhldXJpc3RpYyBzZWVzCi0JaG93IGJpZyBhbiBhcmNoaXZlIHN0cmluZyB0byByZWFkIGJ5IHRyeWluZyBpdCBvbmUgd2F5IGFuZCBpZiB0aGUKLQlzdHJpbmcgdGFibGUgaXMgdW5yZWFzb25hYmx5IGJpZywgdHJ5aW5nIGl0IHRoZSBvdGhlci4gKkZJWE1FKi4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IGNhbid0IGRvIGZkb3BlbnMgb24gVk1TCi0KLVR1ZSBNYXkgIDUgMTQ6MTg6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQotCXdpdGggLi4vYmludXRpbHMuCi0JKiBNYWtlZmlsZS5pbjogIGRvY2RpciBpcyAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MuCi0KLU1vbiBNYXkgIDQgMTE6NDk6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiZmQtaW4uaDogYnVtcCB2ZXJzaW9uIHRvIDEuOTYKLSAgICAgICAgIE1ham9yIGNoYW5nZTsgY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yCi0JIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgc28gdGhhdCBjYWxsZXIgYWxsb2NhdGVzCi0JIG1lbW9yeSBmb3Igc2VjdGlvbiBkYXRhLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwgcmVsb2MuYywKLQlzZWNsZXQuYywgdGFyZ2V0cy5jLCBiZmQuYzogcmVmbGVjdCBuZXcgY29udmVudGlvbi4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogaWYgc3R5cF9mbGFncyBpcyBub3QgYSBzcGVjaWFsCi0JY2FzZSwgdGhlbiB1c2UgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgU0VDXyogZmxhZ3MuCi0KLUZyaSBNYXkgIDEgMTI6NTg6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogdXNlIFJFTFNaIHRvIHdvcmsgb3V0Ci0Jc2l6ZSBvZiBvdXRwdXQgcmVsb2Mgc3RydWN0LgotCSogdGFyZ2V0cy5jLCBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGVraGV4IGZvciB0aGUgbW9tZW50LgotCSogaWVlZS5jOiBpZiBzb21lIHBsYWNlcyB3aGVyZSBudWxsIHBvaW50ZXJzIHdlcmUgdXNlZCBpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IHRhbmRlbSB0YXJnZXQgaXMgc3QyMDAwCi0JKiBjb2ZmLW02OGsuYzogcmVuYW1lIHN0YXRpYyBob3d0b190YWJsZSB0byBnbG9iYWwKLQltNjhrY29mZl9ob3d0b190YWJsZS4KLQkqIGJvdXQuYzogcmVtb3ZlIHVubmVjZXNzYXJ5IGFib3J0Ci0JKiBjb2ZmLWEyOWsuYzogdmFyaW91cyBjaGFuZ2VzIHRvIHRoZSB3YXkgcmVsb2NhdGlvbnMgd29yayB0byBjb3BlCi0Jd2l0aCB0aGUgIm5ldyBvcmRlciIgYW5kIGxhdGVudCBidWdzLgotCSogY29mZmNvZGUuaDogbGludAotCi1XZWQgQXByIDI5IDEyOjM3OjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X3N3YXBfZXh0X3JlbG9jX291dCwgYW91dF9zd2FwX3N0ZF9yZWxvY19vdXQpCi0JYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IHRyZWF0IGFicyBzdW1ib2xzIHRoZSByaWdodCB3YXkuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybS1yZWxvY2F0aW9uKTogZG9uJ3QgcmVsb2NhdGUgcmVmcyB0bwotCWFic29sdXRlIHN5bWJvbHMgaWYgZG9pbmcgYSBwYXJ0aWFsIGxpbmsuCi0KLUZyaSBBcHIgMjQgMDc6MzU6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGEyOWstYW1kLXVkaS4KLQotVGh1IEFwciAyMyAxODozNzo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF88Yml0cz5fc3dhcF9leGVjX2hlYWRlcl9pbik6ICBaZXJvIG91dCB0aGUKLQlpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgdGhhdAotCWFyZSB1c2VkLCBzbyB0aGF0IHRoZSB1bnVzZWQgZmllbGRzIGFyZSBpbiBhIGtub3duIHN0YXRlLgotCi1XZWQgQXByIDIyIDA5OjM2OjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0ZWtoZXguYyAoc3RydWN0IGRhdGFfc3RydWN0KTogIENvbnZlcnQgZnJvbSB0eXBlZGVmIHRoYXQKLQl0eXBlZGVmcyBub3RoaW5nIHRvIGEgbm9ybWFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4KLQkqIHRla2hleC5jIChwYXNzX292ZXIpOiAgUHJvdG90eXBlIGFyZ3MgZm9yIGZ1bmN0aW9uIHRoYXQKLQlzZWNvbmQgYXJnIHBvaW50cyB0by4KLQotTW9uIEFwciAyMCAyMjoyMjo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgb2xkIHN0eWxlIHN0YWdpbmcuICBEbyBub3QgcHJpbnQgcmVjdXJzaW9uCi0JICBsaW5lcy4KLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCBDRkxBR1MgY2FuIGJlIHBhc3NlZCBmcm9tIHRoZQotCSAgTWFrZWZpbGUgY29tbWFuZCBsaW5lLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQkgIFBhc3MgQ0ZMQUdTLgotCi1GcmkgQXByIDE3IDA5OjE1OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgTWFrZWZpbGUuaW46IGFkZGVkIHRla2hleAotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBwYWdlcyBzaG91bGQgYmUgcGFkZGVkIHRvIHRoZQotCXNpemUgb2YgYSBwYWdlLCBub3QgdGhlIHNpemUgb2YgYSBzZWdtZW50LgotCSogY29uZmlndXJlLmluOiBhZGRlZCBnbzMyIGhvc3QgYW5kIGkzODYtYW91dCB0YXJnZXQuCi0JKiBpMzg2YW91dC5jLCBsaWJhb3V0Lmg6IG5vdyB3b3JrcyBmb3IgZ28zMiB0YXJnZXQKLQkqIGllZWUuYzogZml4IGJpdCByb3QuCi0JKiBzZWNsZXQuYzogc3VwcG9ydCBmb3IgcGFkZGluZyBzZWNsZXQgdHlwZS4KLQotV2VkIEFwciAxNSAxODoxMTo1OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6Ci0KLVR1ZSBBcHIgMTQgMTQ6MzQ6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfYWRkX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6ICBDT05TVCBzcHJlYWRzCi0JbGlrZSBvb3plLgotCSogZWxmLmMgKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBSZXR1cm4gYm9vbGVhbiwgbm90IE5VTEwgKHdoaWNoCi0JY2FuIGJlIHZvaWQgKikuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIElmZGVmLW91dCBkZWJ1Z2dpbmcgY29kZS4KLQlBbHNvIGlmZGVmLW91dCBjb2RlIHRoYXQgYWJvcnRzIG9uIHVuaGFuZGxlZCBzZWN0aW9uIHR5cGVzLgotCi1GcmkgQXByIDEwIDIyOjI5OjE4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmNyMzAwMCBjb25maWcKLQkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIFBhc3Mgb24gdG8gcmVjdXJzaXZlIG1ha2VzLgotCSogaG9zdHMvbmNyMzAwMC5oLCBjb25maWcvbmNyMzAwMC5taDogIEFkZCBob3N0IGNvbmZpZyBmaWxlcy4KLQotVGh1IEFwciAgMiAxNzo0Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBOb3cgdGhhdCB3ZSBoYXZlIHN5bS5oIGFuZCBzeW1jb25zdC5oLCBjb21waWxlCi0JY29mZi1tc3ltLmMgb24gYWxsIHN5c3RlbXMuCi0JKiBjb25maWcve2RlY3N0YXRpb24ubWgsIGlyaXgzLm1oLCBpcml4NC5taH06ICBSZW1vdmUgY29mZi1tc3ltLm8gZGVwLgotCSogY29mZi1tc3ltLmM6ICBVcGRhdGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHM7IGFkZCB3ZWFrZXh0IGJpdC4KLQotV2VkIEFwciAgMSAyMzoxNjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBiZmQuYywgYm91dC5jLCBjb2ZmY29kZS5oLCBpbml0LmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzcmVjLmMsIHN5bXMuYywgY29mZi1oODMwMC5jOiAgTGludC4KLQotU3VuIE1hciAyOSAwOTozNzo1OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1pOTYwLmM6ICBMaW50LgotCSogY29uZmlndXJlLmluOiAgQWRkIG5ldyBob3N0IGFuZCB0YXJnZXQgY29uZmlncy4KLQkqIGVsZi5jIChiZmRfcHJzdGF0dXMsIGJmZF9mcHJlZ3NldCk6ICBBdm9pZCB0eXBlbmFtZSBvZiByZWdpc3RlcgotCXN0cnVjdHMsIHdoaWNoIHZhcnk7IGp1c3QgdXNlIG1lbWJlciBuYW1lLgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBMaW50LCBmaXggY29tbWVudHMuCi0JKiBjb25maWcvc3BhcmMtZWxmLm10LCBob3N0cy9zeXN2NC5oOiAgTmV3IGNvbmZpZyBmaWxlcy4KLQotU2F0IE1hciAyOCAxMzowNzowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEZpeCB0byB1c2Ugb25seSBhIHNpbmdsZQotCWxvY2FsLCBkaXNwb3NhYmxlLCBjb3B5IG9mIHRoZSBleHRlcm5hbCBmb3JtIG9mIHNlY3Rpb24gaGVhZGVyCi0JdGFibGUgYW5kIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMuCi0KLVRodSBNYXIgMjYgMTY6NTk6NTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgU2V0IE1JTklNSVpFIGJhY2sgdG8gMCBmb3IgYSByZWFsIHJlbGVhc2UuCi0KLVR1ZSBNYXIgMjQgMTU6NTc6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlnL2lyaXg0Lm1baHRdLCBob3N0cy9pcml4NC5oOiBhZGQgc3VwcG9ydCBmb3IKLQkgIGlyaXg0LgotCi1Nb24gTWFyIDIzIDIyOjM3OjM0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX3JmZF9pbik6ICByZW1vdmUgJiBmb3IgYXJyYXkgcmVmLgotCi1UdWUgTWFyIDE3IDE0OjEyOjI1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6ICBVc2UgQkZEX0FTU0VSVCBtYWNybywKLQlub3QgaW50ZXJuYWwgYmZkX2Fzc2VydCBmdW5jdGlvbiAodHdpY2UpLgotCi1UdWUgTWFyIDE3IDEwOjQ1OjEyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oOiBjaGFuZ2UgYXJfbWF4X25hbWVsZW4gdG8gMTUgKHRoZSByaWdodCB2YWx1ZSkKLQkqIGNvZmYtYTI5aywgY29mZmNvZGUuaDogbW9yZSBoYW5nb3ZlcnMgZnJvbSB0aGUgYmZkX2Fic19zZWN0aW9uCi0JY2hhbmdlCi0KLU1vbiBNYXIgMTYgMTQ6NTc6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogY2hlY2sgZm9yIGJvdXQgYXJjaGl2ZXMgdG9vLgotCSogYm91dC5jOiBtYWtlIGl0IHdvcmsgYWdhaW4uCi0KLVNhdCBNYXIgMTQgMTc6MzA6NDAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZWZpbGVfbm90ZSk6ICBDYWxsIGJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlCi0JbWFsbG9jKCkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAgQ2FsbAotCWJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlIG1hbGxvYygpLgotCi1GcmkgTWFyIDEzIDE1OjQ0OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIE1BS0VJTkZPIG9uIGluZm8uCi0KLUZyaSBNYXIgMTMgMDc6NDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC08Zm9vPiBub3cgPGZvbz4ubXQsIGNvbmZpZy9taC08Zm9vPiBub3cgPGZvbz4ubWguCi0JaG9zdC9oLTxmb28+IG5vdyBqdXN0IDxmb28+LgotCSogY29uZmlndXJlLmluOiByZWZsZWN0IGNoYW5nZXMKLQotVGh1IE1hciAxMiAxMToxNTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHNldF90ZGF0YSk6ICBNYWtlIGNoYW5nZSBvZiBGZWIgMjcgaW4gdGhlCi0JYWN0dWFsIHNvdXJjZSBmaWxlLCBub3QganVzdCB0aGUgZ2VuZXJhdGVkIGxpYmJmZC5oLgotCi1TYXQgTWFyICA3IDEwOjMzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYyk6IGFkZCBDT0ZGX1NXQVBfVEFCTEUgc28gd2UgY2FuIHJ1bgotCWdkYiBvbiBsaXR0bGUtZW5kaWFuIDk2MCBjb2RlLgotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IGluZGlyZWN0IHN5bWJvbHMgc2hvdWxkIGdvCi0JaW50byB0aGUgYXJjaGl2ZSBoZWFkZXIgdG9vLgotCi1GcmkgTWFyICA2IDIxOjU1OjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgTWFyICA1IDIzOjUxOjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYzogIE1vdmUgdGhpcyBmaWxlIGZyb20gZ2RiL2Vjb2ZmLmMuICBJdAotCWhhbmRsZXMgYnl0ZS1zd2FwcGluZyBmb3IgRUNPRkYgKE1JUFMgc3ltYm9sKSBmaWxlcy4KLQkqIGNvbmZpZy9taC1kZWNzdGF0aW9uLCBjb25maWcvbWgtaXJpeDM6ICBBZGQgY29mZi1tc3ltLm8KLQl0byB0aGUgZmlsZXMgYnVpbHQgb24gTUlQUy1iYXNlZCBob3N0cy4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHJ1bGUgZm9yIGNvZmYtbXN5bS4KLQotVGh1IE1hciAgNSAyMTozNjowNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNsZWFuLWluZm8gdGFyZ2V0LiAgTUlOSU1JWkU9MS4KLQotU3VuIE1hciAgMSAyMjozMjo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIE1vdmUgY29yZSBmaWxlIGZ1bmN0aW9ucyBpbnRvIHNlcGFyYXRlCi0JbmV3IGZpbGUgcnM2MDAwLWNvcmUuYy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcmVhZGluZwotCWNvcmUgZmlsZXMgZGVwZW5kcyBvbiBuYXRpdmUgaW5jbHVkZSBmaWxlcyB0aGF0IGNvbmZsaWN0Ci0Jd2l0aCAuLi9pbmNsdWRlL2NvZmYvcnM2MDAwLmguCi0JKiBjb25maWcvbWgtcnM2MDAwOiAgQWRkIHJzNjAwMC1jb3JlLm8gdG8gSERFUEZJTEVTLgotCi1UaHUgRmViIDI3IDIyOjE5OjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6IERvbid0IHByaW50Ci0Jc3ltYm9sIGFkZHJlc3NzIGZvciB1bmRlZmluZWQgc3ltYm9scy4KLQkqIGNvZmYtcnM2MDAwLmM6ICBWYXJpb3VzIHVwZGF0ZXMgKGR1ZSB0byB0YXJnZXQtCi0JaW5kZXBlbmRlbnQgY2hhbmdlcykuCi0JKiBsaWJiZmQuaDogIERpdHRvICh0ZGF0YSBmaWVsZCBpcyBub3cgYSB1bmlvbikuCi0JKiBob3N0cy9oLXNwYXJjLmg6ICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgYm9ndXMgZnVuY3Rpb24KLQknZW1zZXQnIChwcmVzdW1hYmx5IHNob3VsZCBoYXZlIGJlZW4gJ21lbXNldCcgLSB3aGljaCBpcyB0aGVyZSkuCi0KLVRodSBGZWIgMjcgMTE6NDY6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1iaWctKiB0YXJnZXQpOiAgU2FtZSBpcyBJcmlzLgotCi1UaHUgRmViIDI3IDA5OjI0OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogd2hlbiBjcmVhdGluZyBhbgotCWFsaWFzIHN5bWJvbCwgZmlsbCBpbiB0aGUgc2VjdGlvbiBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuCi0JbGVhdmluZyBpdCBibGFuay4gSWYgYW4gb3V0cHV0IHNlY3Rpb24gY2FuJ3QgYmUgZm91bmQgZm9yIGEKLQlzeW1ib2wsIHRoZW4gZG9uJ3QgY29yZSBkdW1wLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotV2VkIEZlYiAyNiAxOTo0MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IGxpbnQKLQkqIGNvZmYtaDgzMDAuYzogZml4IHN0dXBpZCByZWxvYyBzdWJ0cmFjdGlvbiBidWcKLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0KTogb25seSBzd2FwIGEgdHZuZHggYnkgMiBieXRlcywKLQlzaW5jZSB0aGF0J3MgaG93IHdpZGUgaXQgaXMuIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IGFsd2F5cyB6ZXJvIG91dAotCXRoZSBzeW1ib2wuZmxhZ3MgYW5kIGRvbmVfbGluZW5vIGZpZWxkcy4KLQotVHVlIEZlYiAyNSAxNDoyOToyNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2wpOiB3cml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0JYXV4ZW50cy4KLQkqIGNwdS1oODMwMC5jOiBmaXggZGlzYXNzZW1ibHkgYnVnCi0KLUZyaSBGZWIgMjEgMjE6Mzk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZXJybXNnKSwgY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbiwKLQlzZWN0aW9uX2Zyb21fYmZkX2luZGV4KSwgY3B1LWg4MzAwLmMgKGhvd3RvKl9jYWxsYmFjayksCi0JcmVsb2MuYywgc2VjdGlvbi5jIChiZmRfbWFwX292ZXJfc2VjdGlvbnMpLCB0YXJnZXRzLmMKLQkoYmZkX3RhcmdldF9saXN0KTogIFByb3RvbGludC4KLQkqIGxpYmJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIGEgbGliYmZkLWluLmggZnJvbSBhIG1vbnRoIGFnby4KLQotRnJpIEZlYiAyMSAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGxpbnQsIChjb2ZmX3ByaW50X3N5bWJvbCk6IHByaW50cwotCW91dCB0YWduZHggdG9vLgotCSogYW91dHguaCAoc3dhcF9zdGRfcmVsb2Nfb3V0LCBzd2FwX2V4dF9yZWxvY19vdXQpOiB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gb2YgYSBzeW1ib2wgcmF0aGVyIHRoYW4gdGhlIHNlY3Rpb24gb2YgYSByZWZmZWQgc3ltYm9sIHRvCi0JZGV0ZXJtaW5lIHRoZSByX2luZGV4IG9mIGFuIGVtbWl0dGVkIHJlbG9jLgotCi1UaHUgRmViIDIwIDE4OjEwOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBQT1JUSU5HOiBOZXcgKHByZWxpbWluYXJ5KSBwb3J0aW5nIGd1aWRlLgotCi1XZWQgRmViIDE5IDIxOjM5OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKSwgY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpLCBjb2ZmLW04OGsuYwotCShob3d0b19odnJ0MTYpOiAgbGludC4KLQotTW9uIEZlYiAxNyAxMjowMjoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogaHAzMDBic2QuYyAobmV3KSwgY29uZmlnL210LWhwMzAwYnNkOiAgTWFrZSBocDMwMGJzZAotCWEgZnVsbCBjb25maWd1cmF0aW9uICh3aXRoIHBvc3NpYmxlIGNyb3NzLWRldmVsb3BtZW50KSwKLQlpbnN0ZWFkIG9mIHVzaW5nIGhvc3QtYW91dC5jLgotCi1TdW4gRmViIDE2IDEzOjAxOjQ5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpOgotCVNldCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkuCi0JKiBnZW4tYW91dC5jOiAgQ2hhbmdlIHRvIGVtaXQgYSAuYyBmaWxlcywgbm90IGEgLmggZmlsZS4KLQotVGh1IEZlYiAxMyAyMDoxMTo0NyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIG9ic29sZXRlIHVzZSBvZgotCUJTRl9BQlNPTFVURSBhbmQgcmVwbGFjZSB3aXRoIGJmZF9hYnNfc2VjdGlvbiByZWZlcmVuY2UuCi0KLVRodSBGZWIgMTMgMTc6MjI6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGdldF9ub3JtYWxpemVkX3N5bXRhYik6IGZpeGVkIGJ1ZyB3aGVyZSBzeW1ib2xzCi0Jd2l0aCBtb3JlIHRoYW4gb25lIGF1eGVudCBjYW4gY2F1c2UgbmFzdHkgY29yZSBkdW1wcy4KLQotCSogY29mZmNvZGUuaCwgbGliY29mZi5jOiBhZGRlZCBuZXcgZmllbGRlZCB0byBjb2ZmX3N5bWJvbF9zdHJ1Y3QKLQkiZG9uZV9saW5lbm8iIHNvIHRoYXQgYSBzeW1ib2wgd2hpY2ggYXBwZWFycyB0d2ljZSBpbiB0aGUgc3ltYm9sCi0JdGFibGUgb25seSBnZXRzIGl0J3MgbGluZW51bWJlcnMgcmVsb2NhdGVkIG9uY2UuIE1vZGlmZWQKLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKSBhbmQgKGNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpIHRvIG1ha2UKLQl1c2Ugb2YgaXQuCi0KLVR1ZSBGZWIgIDQgMTU6Mzk6NTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6ICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogZml4IGNvbnN0cnVjdG9yCi0Jc3R1ZmYgdG8gdXNlIHRoZSBOZXcgT3JkZXIuCi0KLUZyaSBKYW4gMzEgMDE6MzQ6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgQ2hhbmdlIHR5cGUgb2YgZW52aVtdIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIGZpeCB2YXggdWx0cml4IGNvbmZpZ3VyYXRpb24uCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgRGVhbCB3aXRoIG51bGwgcmV0dXJuIGZyb20KLQliZmRfbWFrZV9zZWN0aW9uKCkuICAoZWxmX29iamVjdF9wKTogIFNlbGVjdCBlbmRpYW5lc3MgcHJvcGVybHkuCi0KLUZyaSBKYW4gMzEgMDE6MTk6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtdGFob2UuaCwgaC12YXhic2QuaDogIEZpeCBzdGFjayBpbiBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDIzOjUxOjA3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGhvc3QtYW91dC5jIGRvZXNuJ3QgZGVwZW5kIG9uIGFvdXQtcGFyYW1zLmguCi0JKiBhb3V0LXRhcmdldC5oOiAgVXNlIFRBUkdFVF9CSUdfRU5ESUFOX1AgdG8gc2V0IHVwIHZlY3Rvci4KLQkqIGhvc3QtYW91dC5jOiAgRG9uJ3QgdXNlIGFvdXQtcGFyYW1zLmg7IGNvbmZpZ3VyZSB0aGVzZSBzeXN0ZW1zCi0JaW4gdGhlaXIgeG0gZmlsZXMsIG5vdCBpbiBhIHJhbmRvbWx5IGdlbmVyYXRlZCBmaWxlLgotCSogaG9zdHMvaC1ocDMwMGJzZC5oLCBoLXRhaG9lLmgsIGgtdmF4YnNkLmgsIGgtdmF4dWx0Lmg6Ci0JU3BlY2lmeSBieXRlIG9yZGVyLgotCSogaG9zdHMvaC12YXhic2QuaDogIERlZmluZSB0aGUgZm9ybSBvZiBleGVjIGFuZCBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDEzOjAyOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtdGFob2UsIGNvbmZpZy9tdC12YXg6ICBDaGFuZ2UgREVGQVVMVF9WRUNUT1IgdG8KLQlob3N0X2FvdXRfdmVjIGhlcmUgYXMgd2VsbC4KLQotVGh1IEphbiAzMCAxMTo0MTo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0LWFvdXQuYzogIENoYW5nZSBUQVJHRVROQU1FIHRvICJhLm91dCIgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0JZ2RiLiAgY29uZmlnL210LWhwMzAwYnNkOiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvIGhvc3RfYW91dF92ZWMKLQl0byBwcmV2ZW50IHVuZGVmaW5lZCBzeW1ib2wuCi0KLVRodSBKYW4gMzAgMDc6MjY6NTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlWYXJpb3VzIGxpbnRzIGZvdW5kIG9uIFBlcnNTb255Ci0JKiBhb3V0eC5oOiBjYXN0IGFuIGVudW0KLQkqIGNvZmYtYTI5ay5jOiBtYW55IGludHMgaW4gcmVsb2Mgc3RydWN0dXJlIHR1cm5lZCB0byBlbnVtCi0JKiBjb2ZmY29kZS5oOiBtb3JlIGVudW1zCi0JKiBjcHUtaDgzMDAuYzogbW9yZSBlbnVtcwotCSogb3BuY2xzLmM6IG1vcmUgZW51bXMKLQotVGh1IEphbiAzMCAwMToxOTo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBUYWhvZSBjb25maWd1cmF0aW9uIHdvcmsgYWdhaW4uCi0JKiBiZmQtaW4uaDogIFJlbW92ZSB0cmFpbGluZyBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCi0JKiBpZWVlLmM6ICBDYW4ndCBwdXQgYnl0ZSB2YWx1ZXMgPjB4N0YgaW50byBhIHNpZ25lZCBjaGFyLgotCi1UdWUgSmFuIDI4IDIxOjEwOjUxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIHZhcmlvdXMgY29mZi0qLm8gZmlsZXMuCi0KLQkqIGVsZi5jOiAgUmVtb3ZlIGV4dHJhbmVvdXMgcGFyZW4gZnJvbSBjb3JlX3BycHNpbmZvIGFuZAotCWNvcmVfcHJwc3RhdHVzIG1hY3JvcywgcmVuYW1lIGNvcmVfcHJwc3RhdHVzIHRvIGNvcmVfcHJzdGF0dXMuCi0JUmVwbGFjZSByZWZlcmVuY2VzIHRvIG9sZCBzZWN0aW9uICJzaXplIiBtZW1iZXIgd2l0aCBuZXcKLQkiX3Jhd19zaXplIiBtZW1iZXIuICBJbXBsZW1lbnQgZWxmX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaAotCWlzIG5vdyB1c2VkLgotCi1UdWUgSmFuIDI4IDE0OjUxOjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jLCBiZmQuYywgLi4vaW5jbHVkZS9iZmQuaDogIFZhcmlvdXMgZml4ZXMgZm9yIFBNQVgKLQljb3JlIHJlYWRpbmcuCi0KLVR1ZSBKYW4gMjggMTA6NDY6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbGF4X3NlY3Rpb24pOiBub3cgc3RhdGljLgotCShiZmRfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiB2YXJpb3VzIHR5cGUgbGludHMuCi0KLU1vbiBKYW4gMjcgMTk6NDQ6MDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlOZXcgZW50cnkgcG9pbnQgaW4gdGhlIHRyYW5zZmVyIHZlY3RvciAtIGJmZF9yZWxheF9zZWN0aW9uLgotCi0JKiBhb3V0LXRhcmdldC5oOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGJmZC1pbi5oOiBhZGQgdG8gdmVjdG9yCi0JKiBiZmQuYzogYWRkICNkZWZpbmUgZm9yIHZlY3RvcgotCSogYm91dC5jOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGNvZmZjb2RlLmg6IGFkZCB0byB2ZWN0b3IsIGFsc28gbm93IGhhcyBjb2ZmIHNwZWNpZmljIHJlbGF4IGNvZGUKLQlmb3IgdGhlIHJlbGF4YWJsZSBIOC8zMDAgcmVsb2NzLiBBbHNvIGNsZWFuIHVwIGFicyBzZWN0aW9uIGNydWZ0LgotCSogZWxmLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogaWVlZS5jOiBjYWxsIG5ldyB2ZWN0b3IsIGNsZWFuIHVwIHNvbWUgYnVncyBkdWUgdG8gdGhlIGNyZWF0aW9uCi0Jb2YgYmZkX2Fic19zZWN0aW9uCi0JKiBsaWJiZmQuaDogYWRkIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24gRVhGVU4KLQkqIG9hc3lzLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogcmVsb2MuYzogaW1wbGVtZW50IGdlbmVyaWNfcmVsYXgKLQkqIHNlY2xldC5jOiBtb3ZlZCBtdWNoIG9mIHRoaXMgaW50byBjb2ZmY29kZS5oCi0JKiBzcmVjLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogdGFyZ2V0cy5jOiBkZWZpbmUgbmV3IHRyYW5zZmVyIHZlY3RvcgotCi1GcmkgSmFuIDI0IDE0OjQwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBldmVyeXRoaW5nOiBub3cgbW9kaWZpZWQgdG8gdXNlIHNtYWxsZXIgcmVsb2MgdHlwZS4gU2VsZiBob3N0cwotCW9uIHN1bjMgJiBzdW40LgotCi1TYXQgSmFuIDE4IDE3OjAwOjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3RyYXR1cywgY29uZmlnL210LWk4NjAtZWxmLCBob3N0cy9oLXN0cmF0dXM6Ci0JTmV3IGZpbGVzIGZvciBzdHJhdHVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgY29uZmlndXJhdGlvbiBmcmFnbWVudHMgZm9yIHN0cmF0dXMuCi0KLVdlZCBKYW4gMTUgMTA6MDI6NDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBEZWNsYXJlIHZhcmlvdXMgZmlsZW5hbWUKLQl2YXJpYWJsZXMgYXMgQ09OU1Qgc2luY2UgdGhleSBhcmUgc2V0IHRvIHBvaW50IHRvIGEgY29uc3QgY2hhcgotCXN0cmluZy4gIEZpeGVzIGNvbXBpbGVyIGNvbXBsYWludHMuCi0KLUZyaSBKYW4gMTAgMTc6NDQ6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtYW1peC5oIGhvc3RzL2gtaTM4NnY0Lmg6ICBDaGFuZ2UgYWJvcnQoKSB0byBhIGZ1bmN0aW9uCi0JcmV0dXJuaW5nIHZvaWQuCi0KLUZyaSBKYW4gMTAgMTQ6MzM6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgUmVjb2duaXplIE5fU09MCi0Jc3ltYm9scywgc28gdGhhdCB3ZSBjYW4gZW1pdCB0aGUgY29ycmVjdCBmaWxlIG5hbWUgZXZlbgotCWlmIGl0J3MgYW4gaW5jbHVkZSBmaWxlLgotCi1UaHUgSmFuICAyIDE2OjQzOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYzogIEFkZCBDT0ZGX1NXQVBfVEFCTEUgdG8gbGl0dGxlX3ZlYyBhcyB3ZWxsIGFzIGJpZ192ZWMuCi0JKFJlcG9ydGVkIGJ5IGpvaG5AbGFidGFtLmxhYnRhbS5vei5hdSAoSm9obiBDYXJleSkpLgotCi1XZWQgSmFuICAxIDA0OjIzOjA2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIENoYW5nZSBhbGwgJyNpZiBIQVZFX1BST0NGUycgdG8gJyNpZmRlZiBIQVZFX1BST0NGUycuCi0KLQkqIGNvbmZpZy9taC1hbWl4LCBjb25maWcvbWgtaTM4NnY0OiAgUmVtb3ZlIEhERUZJTkVTIHRoYXQgd2FzCi0JYmVpbmcgdXNlZCB0byAtREhBVkVfUFJPQ0ZTLgotCi0JKiBob3N0cy9oLWFtaXgsIGhvc3RzL2gtaTM4NnY0OiAgQWRkICcjZGVmaW5lIEhBVkVfUFJPQ0ZTJy4gIE1vdmUKLQknI2luY2x1ZGUgImZvcGVuLXNhbWUuaCInIHRvIGVuZCBvZiBmaWxlIHRvIG1hdGNoIG90aGVyIGgtKiBmaWxlcy4KLQotRnJpIERlYyAyMCAxMjowNjoxNyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4gIEFkZCBjYXNlCi0JInVua25vd24iIGZvciB0YXJnZXQgdmVuZG9yIGFuZCBpbmZlciBzb21lIHRhcmdldHMgYmFzZWQKLQlvbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW0uCi0KLVdlZCBEZWMgMTggMTc6MTc6NTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmgsIGxpYmFvdXQuaDogIEFOU0lmeSBlbnVtcy4KLQotV2VkIERlYyAxOCAxNjoxMjoyNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpOiBjcmVhdGVkIHZlcnNpb24gZm9yIFZNUyB3aGljaCByZW1vdmVzIHRoZQotCVZNUyBkaXJlY3RvcnkgY3JhcCBmcm9tIHRoZSBmcm9udCBhbmQgZW5kIG9mIGEgZmlsZW5hbWUsIGVnIHR1cm4KLQlbLS5mb29dYmFyLm9iajsxMjMgaW50byBiYXIub2JqCi0JKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IG5vdyB3cml0ZXMgaW5kZXggaW50byBhbgotCWV4dGVuZGVkIG5hbWUgdGFibGUgaW4gZGVjaW1hbCAtIHRoZSBzYW1lIGJhc2UgdXNlZCB0byByZWFkIGFuCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotV2VkIERlYyAxOCAxNDo0MDozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC1lbmNhcC5jOiAgRml4IHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogYW91dGYxLmg6ICBVc2Ugc3RhbmRhcmQgTVlfb2JqZWN0X3AgYW5kIE1ZX2NhbGxiYWNrCi0JaW4gYW91dC10YXJnZXQuaC4gIFJlbW92ZSB0YXJnZXQtc3BlY2lmaWMgdmVyc2lvbnMuCi0JKiBob3N0LWFvdXQuYzogIFJlLXdyaXRlIHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogZ2VuLWFvdXQuYzogIE5ldyBmaWxlcyB1c2Ugd2l0aCBob3N0LWFvdXQuYyB0byBnZW5lcmF0ZQotCWhvc3Qtc3BlY2lmaWMgYS5vdXQtcmVsYXRlZCBwYXJhbWV0ZXJzLgotCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQubyBkZXBlbmRzIG9uIGFvdXQtcGFyYW1zLmgsIHdoaWNoIGlzCi0JZ2VuZXJhdGVkIGJ5IGdlbi1hb3V0LgotCSogYW91dC10YXJnZXQuaDogIE1ha2UgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZS4KLQkqIGxpYmFvdXQuaCwgYW91dC10YXJnZXQuaDogIFJlbW92ZWQgV09SS19PVVRfRklMRV9QT1NUSU9OUwotCW1hY3JvLiAgSW5zdGVhZCwgaW5saW5lIGl0IGluIGFvdXQtdGFyZ2V0LmguCi0JKiBuZXdzb3MzLmM6ICBEZWZpbmUgTl9TSEFSRURfTElCKHgpIGFzIDAgdG8gYXZvaWQKLQlhIGdjYyAtV2FsbCB3YXJuaW5nLgotCSogYXJjaGl2ZS5jOiAgQWRkIG1pc3NpbmcgY29tbWFzIGluIERFRlVOIG1hY3JvICgyIHBsYWNlcykuCi0JKiBlbGYuYywgY29mZmNvZGUuaCwgYW91dGYxLmg6ICBVc2UgQU5TSSBmdW5jdGlvbnMgaW5zdGVhZCBvZgotCUJlcmtlbGV5IG9uZXMsIG5vdyB0aGF0IGxpYmliZXJ0eSBoYXMgdGhlbToKLQliY29weS0+bWVtY3B5LCBiemVyby0+bWVtc2V0LCBiY21wLT5tZW1jbXAuCi0JKiBhb3V0eC5oOiAgVmFyaW91cyB0b3VjaC11cHM6ICBSZS1mb3JtYXR0aW5nLCBmaXggYSBjYXN0LAotCXJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLVR1ZSBEZWMgMTcgMTk6NDg6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEVuY2xvc2UgY29yZW5hbWUKLQlhbmQgZXhlY25hbWUgaW5zaWRlIEhBVkVfUFJPQ0ZTIGlmZGVmIHNpbmNlIHRoZXkgYXJlIHVudXNlZAotCXdoZW4gaXQgaXMgbm90IGRlZmluZWQuCi0KLU1vbiBEZWMgMTYgMTI6MDA6MTAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgRmxhZyBhbGwgc2VjdGlvbnMgYXMgZWl0aGVyIGNvZGUgb3IgZGF0YS4gIFdlIGNhbid0Ci0JYmUgc3VyZSB3aGF0IHRoZXkgYXJlIGFueXdheSwgc2luY2UgRUxGIGRvZXNuJ3QgZml0IHRoZQotCXRyYWRpdGlvbmFsIG1vZGVsIG9mIHRleHQrZGF0YStic3MgdmVyeSB3ZWxsLiAgQWRkIG5ldyBsb2NhbAotCWZ1bmN0aW9uIGVsZl9yZWFkKCkgdG8gc2ltcGxpZnkgY29kZS4gIFJlY29yZCBlbnRyeSBwb2ludCBpbgotCXRoZSBiZmQgc3RydWN0dXJlLgotCi1UaHUgRGVjIDEyIDIxOjAxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLSouaDogIENvbmZpZ3VyZSBmb3BlbiB1c2luZyAuLi9pbmNsdWRlL2ZvcGVuLSouaAotCXJhdGhlciB0aGFuIE4gY29waWVzIG9mIHRoZSBzYW1lIGxpbmVzLgotCi1XZWQgRGVjIDExIDE2OjM5OjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYzogZGlzYXNzZW1ibGUgYnJhbmNoIGRpc3BsYWNlbWVudHMgY29ycmVjdGx5Ci0JKiBjb2ZmLWg4MzAwLmM6IHB1dCByZWxvYyBvZmZzZXRzIG91dCBpbiAzMmJpdHMKLQotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IE5ldyBmaWxlcyBmcm9tIERKCi0JKiBjYWNoZS5jOiBmb3BlbiB3aXRoIG5ldyBtYWNyb3MgaXMgbmVlZGVkIGZvciBET1MuCi0JKiBpZWVlLmM6IGVudmlyb24gcmVuYW1lZCB0byBlbnZpIHRvIHN0b3AgYW4gaW5jbHVkZSBmaWxlCi0JY29uZmxpY3QuCi0JKiBvcG5jbHMuYywgY29mZi1yczYwMDAuYzogbW9yZSBmb3BlbnMgd2l0aCBtYWNyb3MuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTY6Mzk6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkgKiBNYWtlZmlsZS5pbjogZml4IHdoZXJlIGRvY2RpciBsaXZlcwotCi0JICogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZi1tODhrLmMsCi0JIGNvZmZjb2RlLmgsIGNvcmUuYywgY3Rvci5jLCBlbGYuYywgZm9ybWF0LmMsIGllZWUuYywgaW5pdC5jLAotCSBsaWJiZmQuYywgbGliYmZkLmgsIGxpYmNvZmYuaCwgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywKLQkgc3JlYy5jLCBzeW1zLmMsIHRhcmdldHMuYyA6IGFsbCBuZXcgZG9jdW1lbnRhdGlvbiBhbmQgbGludAotCSByZW1vdmFsLgotCi0KLVNhdCBEZWMgIDcgMDc6MjI6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBEZWMgIDYgMjI6NTg6NDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB1c2luZyBJTlNUQUxMX0RBVEEsIGFkZGVkIHN0YW5kYXJkcy50ZXh0Ci0JICBzdXBwb3J0LgotCi0JKiBjb25maWd1cmUuaW46IG1hcmsgZGlyZWN0b3J5IGFzIHRhcmdldCBkZXBlbmRlbnQuICBjb25maWd1cmUKLQkgIG5vd3Mgd29ya3MgaW4gb2JqZGlyIGFsd2F5cyBzbyBtYWtlIGZpbGUgZXhpc3RlbmNlIGNoZWNrcwotCSAgYWdhaW5zdCAke3NyY2Rpcn0uCi0KLVRodSBEZWMgIDUgMjI6NDY6MTkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDEwOjE0OjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfPHNpemU+X29iamVjdF9wLCBzdW5vczRfY2FsbGJhY2spOiBtb3ZlZCB0aGUKLQljb21wdXRhdGlvbiBvZiBhcmNoIGFuZCBtYWNoaW5lIHR5cGUgc28gaXQncyB3b3JrZWQgb3V0IGJlZm9yZQotCXNvbWVfYW91dF9vYmplY3RfcCBpcyBjYWxsZWQuCi0JKiBhb3V0eC5oOiAoc29tZV9hb3V0X29iamVjdF9wKTogZG9uJ3Qgc2V0IGFyY2ggYW5kIG1hY2ggdG8KLQl1bmtub3duLgotCSogYXJjaHVyZXMuYzogYWRkIGV4dHJhIGZpZWxkICdzZWN0aW9uX2FsaWduX3Bvd2VyJyB0byBob2xkCi0JZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBpbiBvYmplY3QgZmlsZXMuCi0JKiBjcHUtYTI5ay5jLCBjcHUtaDgzMDAuYywgY3B1LWkzODYuYywgY3B1LWk5NjAuYywgY3B1LW02OGsuYywKLQljcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtcnM2MDAwLmMsIGNwdS1zcGFyYy5jLCBjcHUtdmF4LmM6Ci0JaW5pdGlhbGl6ZSB0aGUgbmV3IGZpZWxkLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IHJlcGxhY2UgdGhlIHRleHQgc2l6ZSwgc2luY2UgYW91dAotCWZyaWVzIHRoZW0uCi0JKiBhb3V0eC5oOiBEb2N1bWVudGF0aW9uIGluIHRoZSBuZXcgc3R5bGUKLQotV2VkIERlYyAgNCAwMjowMDozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfbXRpbWUpOiAgRG9uJ3QgY2FjaGUgbXRpbWUgYW55IG1vcmU7IG9ubHkKLQl1c2UgdGhlIHNhdmVkIHZhbHVlIGlmIG10aW1lX3NldCBpcyBhbHJlYWR5IHNldCAoaW50ZW5kZWQKLQlmb3IgYXJjaGl2ZSBmaWxlcywgdGhvdWdoIGFwcGFyZW50bHkgbm90IHVzZWQgeWV0KS4KLQotVHVlIERlYyAgMyAyMjo1NDo1MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiAgUmV2aXNlIGNvbW1lbnRzIGFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIHRhcmdldAotCXZlY3RvciwgdG8gbWF0Y2ggcmVhbGl0eS4gIFJlbW92ZSBtZW50aW9uIG9mIG9ic29sZXRlIG1ldGhvZHMuCi0JUmVtb3ZlIGxvbmcgbGlzdHMgb2YgY2FwaXRhbGl6ZWQgbWFjcm9zIHRoYXQgdHVybiBpbnRvIHRoZSBzYW1lCi0JdGhpbmcgaW4gbG93ZXJjYXNlLiAgTm9ybWFsIHZlY3RvciBzaW1wbHkgbGlzdHMgYWxsIGtub3duCi0JbG93ZXJjYXNlIHh2ZWMgbmFtZXM7IGFsbCBvdGhlciBjYXNlcyBhcmUgaGFuZGxlZCBieSBTRUxFQ1RfVkVDUy4KLQotCSogY29uZmlnL210LWkzODYtY29mZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byByZWFsIGlkZW50aWZpZXIsCi0Jbm90IG1hY3JvIG5hbWUuCi0KLQkqIGNvbmZpZy9tdC1pOTYwLXtjb2ZmLGJvdXR9OiAgVXNlIFNFTEVDVF9WRUNTIHRvIG1ha2UgYSBzaG9ydAotCWxpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldHMuCi0KLVR1ZSBEZWMgIDMgMTQ6MDY6MTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIFRoZSBwYWQgYnl0ZSBzb21ldGltZXMgYWRkZWQgdG8KLQl0aGUgc3RyaW5nIHRhYmxlIGluIGEgX18uU1lNREVGIG1lbWJlciBpcyBub3cKLQljb3VudGVkIGFzIHBhcnQgb2YgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZS4KLQlUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIHJhbmxpYiwgYXMgd2VsbCBhcyBTdW4ncy4KLQotVHVlIERlYyAgMyAxMDo1MzozMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiBSZXdyb3RlIHRvIGZpeCBtYW55IGJ1Z3M7IG5vdyBnZXRzIHRoZSByZWNvcmQgdHlwZQotCXJpZ2h0LCBkb2Vzbid0IGNob2tlIG9uIGlucHV0LCBzZXRzIHRoZSBzdGFydCBhZGRyZXNzIGluIGFuIFM5IGFuZAotCWZpbGxzIGluIHRoZSBmaWxlbmFtZSBvbiBhbiBTMC4KLQotU2F0IE5vdiAzMCAyMToxOToxNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmM6IEFkZCBzdXBwb3J0IGZvciBNRU1JTkQgYWRkcmVzc2luZyBtb2RlCi0KLQkqIGNvZmYtYTI5ay5jOiBkZWZpbmVkIFJFTE9DX1BST0NFU1NJTkcgdG8gdGFrZSB0aGUgI2lmZGVmIG91dCBvZgotCWNvZmZjb2RlLmgKLQkqIGNvZmZjb2RlLmg6IHVzZSB0aGUgbmV3IG1hY3JvIGlmIGF2YWlsYWJsZQotCi0JKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiBjYXN0IG1hbGxvYyB0byBhdm9pZCB3YXJuaW5nLgotCSogTWFrZWZpbGUuaW46IEZpeGVkIGRlcGVuZGVuY2llcyBkdWUgdG8gZmlsZSByZW5hbWUKLQotCSogYW91dC1lbmNhcC5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtaDgzMDAuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmYtcnM2MDAwLmMsIGNwdS1oMzAwLmMsIGVsZi5jLCBpMzg2YW91dC5jLAotCW5ld29zMy5jLCBzdGFiLXN5bXMuYywgc3ltcy5jOiBBbGwgdGhlc2UgZmlsZXMgaGF2ZSBoYWQgdGhlaXIKLQkjaW5jbHVkZXMgYWx0ZXJlZCB0byBwb2ludCB0byB0aGUgbmV3IHBsYWNlcy4KLQotRnJpIE5vdiAyOSAyMDowNDo0OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWkzODZ2NCwgY29uZmlnL21oLWkzODYtZWxmLCBob3N0cy9oLWkzODZ2NC5oOiAgTmV3IGZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdmVuZG9yICJuY3IiIGFzIHN1cHBvcnRlZCBwZXItdGFyZ2V0IHZlbmRvci4KLQlBZGQgc3ZyNCBjYXNlIGZvciBpMzg2IHBlci1ob3N0IGNhc2UuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBBZGQgbWlzc2luZyAiYnJlYWsiIHRvCi0JRUxGREFUQTJMU0IgY2FzZXMuCi0KLUZyaSBOb3YgMjkgMTI6MTY6NTEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6ICBSZXR1cm4gJ0EnCi0JZm9yIHN5bWJvbHMgdGhhdCBhcmUgYm90aCBhYnNvbHV0ZSBhbmQgZ2xvYmFsLgotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6ICBSZXR1cm4gTlVMTAotCWlmIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIHJldHVybnMgTlVMTC4KLQotVHVlIE5vdiAyNiAwOToxMDo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY29mZi1oODMwMAotCSogY29uZmlndXJlLmluOiBub3cgaDggaXMgYSBjb2ZmIHRhcmdldAotCSogY3B1LWg4MzAwLmM6IGZpeCB2YXJpb3VzIGRpc2Fzc2VtYmx5IHByb2JsZW1zCi0JKiBsaWJjb2ZmLmg6IHRvb2sgb3V0IHNvbWUgY29kZSB3aGljaCBoYXMgYmVlbiAjMGVkIGZvciBhIGxvbmcKLQl0aW1lLgotCSogdGFyZ2V0cy5jOiBhZGRlZCBoOCBjb2ZmCi0JKiBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMKLQlhZGRlZCBuZXcgbWFjcm8gUlRZUEUySE9XVE8gdG8gdGFrZSBhIGxvYWQgb2YgI2lmZGVmcyBvdXQgb2YKLQljb2ZmY29kZS5oCi0JKiBjb2ZmY29kZS5oOiBTdGFydGVkIHRvIGNoYW5nZSB0aGUgd2F5IG1hY2hpbmUgZGVwZW5kZW5jaWVzIGFyZQotCWhhbmRsZWQsIGZyb20gdGhlIG5lc3Qgb2YgI2lmZGVmcyB0byBtYWNyb3MgZGVmaW5lZCBpbiB0aGUKLQlpbmNsdWRpbmcgY29mZi08Zm9vPi5jCi0KLUZyaSBOb3YgMjIgMDg6MTE6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgdGhlIGBleGVjdXRhYmxlJyBiaXQKLQlpZiB0aGUgZW50cnkgcG9pbnQgaXMgY29udGFpbmVkIGluIHRoZSB0ZXh0IHNlZ21lbnQsIGV2ZW4gaWYgdGhlCi0JdGV4dCBzZWdtZW50IGlzIGF0IGxvY2F0aW9uIDAuCi0KLQkqIGNvZmYtbWlwcy5jLCBjb2ZmY29kZS5oOiAgUGV0ZXIgU2NoYXVlcidzIHBhdGNoIHRvIGtsdWRnZSBpbgotCW5vbnN0YW5kYXJkIE1JUFMgc2VjdGlvbnMgKC5yZGF0YSwgLnNkYXRhLCBldGMpLgotCi0JKiBhb3V0eC5oLCBiZmQuYywgY29mZmNvZGUuaCwgaWVlZS5jLCBvYXN5cy5jLCB0YXJnZXRzLmM6IENPTlNUIGxpbnQuCi0JKiBsaWJiZmQtaW4uaCwgbGliYmZkLmgsIGFvdXR4LmgsIGNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0Lmg6Ci0JUmVuYW1lIEFMSUdOIHRvIEJGRF9BTElHTiB0byBhdm9pZCBjb25mbGljdCB3aXRoIEJTRCA8c3lzL3BhcmFtLmg+LgotCSogbGliYmZkLmM6ICBMaW50LgotCSogaG9zdC1hb3V0LmMsIHRyYWQtY29yZS5jOiAgRml4IHdyaXRlX2FybWFwIHByb3RvdHlwZXMuICBMaW50LgotCi1UaHUgTm92IDIxIDE5OjU2OjQwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLXN5bXMuYywgc3ltcy5jOiAgTW92ZWQgYmZkX3N0YWJfbmFtZSgpIGFuZCBiZmRfc3RhYl9uYW1lc1tdCi0JZnJvbSBzeW1zLmMgdG8gbmV3IGZpbGUgc3RhYi1zeW1zLmMuICBBbHNvLCBzaW5jZSBHTlUgZXh0ZW5kZWQKLQl0eXBlIGNvZGVzIHN1Y2ggYXMgTl9TRVRUIGFyZSBubyBsb25nZXIgaW4gLi4vaW5jbHVkZS9zdGFiLmRlZiwKLQlpbmNsdWRlIHRoZW0gbWFudWFsbHkuCi0JKiBzdGFiLXN5bXMuYywgYW91dHguaDogUmVuYW1lZCBiZmRfc3RhYl9uYW1lKCkgYW5kCi0JYmZkX3N0YWJfbmFtZXNbXSB0byBhb3V0X3N0YWJfbmFtZSgpIGFuZCBhb3V0X3N0YWJfbmFtZXNbXS4KLQkqIGxpYmFvdXQuaDogQWRkZWQgcHJvdG90eXBlIGZvciBhb3V0X3N0YWJfbmFtZSgpLgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgTWFrZWZpbGUgZm9yIG5ldyBzdGFiLXN5bXMuW2NvXS4KLQotVGh1IE5vdiAyMSAxMTo1MDo0OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBPbmUgbW9yZSB0cnkgYXQgdGhpcwotCXJhdGhlciBjb21wbGljYXRlZCBzZWVtaW5nIHByb2JsZW0uICBFbGltaW5hdGUgTE9HSUNBTF8gdmVyc2lvbnMsCi0JanVzdCBtYWtlIE5fWFhYIHdvcmsgYnkgZXhjbHVkaW5nIHRoZSBoZWFkZXIgZnJvbSB0aGUgdGV4dCBzZWdtZW50LgotCSogYW91dHguaDogIEZpeCBjb21tZW50cyB0byBtYXRjaC4KLQotVHVlIE5vdiAxOSAxODo0OTowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBVc2UgbmV3IExPR0lDQUxfVFhUQUREUiwKLQlMT0dJQ0FMX1RYVE9GRiwgTE9HSUNBTF9UWFRTSVpFIG1hY3JvcyB0byBmaWd1cmUgb3V0IG51bWJlcnMKLQlmb3IgdGhlICJsb2dpY2FsIiB0ZXh0IHNlZ21lbnQgKGkuZS4gbmV2ZXIgY29uc2lkZXIgdGhlIGV4ZWMKLQloZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50KS4gIFRoaXMgY2hhbmdlIGlzCi0JbmVlZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHZhcmlvdXMgb3RoZXIgcGFydHMgb2YgYmZkIGFuZCBsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb2VfYW91dF9vYmplY3RfcCkpOiAgRml4IGNvbW1lbnQsCi0JYW5kIG1vdmUgY2FsY3VsYXRpb24gb2Ygb2JqX3RleHRzZWMoYWJmZCktPnNpemUgdG8gbGliYW91dC5oLgotCSogYmZkLWluLmg6ICBSZW1vdmVkIGJvZ3VzICc7Jy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgTUlOSU1JWkUgZmxhZyB0byBzZWxlY3QgbGVhbgotCW9yIGJsb2F0ZWQgdGFyZ2V0X3ZlY3Rvci4KLQkqIHRhcmdldHMuYzogIFVzZSBuZXcgTUlOSU1JWkUgbWFjcm8sIGFuZCBhZGQgdHJhZF9jb3JlIGlmIG5lZWRlZC4KLQkqIG5ld3NvczMuYzogIEZpeGVzIHRvIC4uL2luY2x1ZGUvYW91dDY0LmggcmVtb3ZlIG5lZWQKLQlmb3Igc3BlY2lhbCBOX1RYVE9GRiBtYWNybywgYnV0IHJlcXVpcmUgTl9IRUFERVJfSU5fVEVYVC4KLQotTW9uIE5vdiAxOCAxMjowMDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIG5ld3NvczMuYzogIE1ha2UgYW91dC10YXJnZXQuaAotCWhhbmRsZSBib3RoIGxpdHRsZSBhbmQgYmlnLWVuZGlhbiB0YXJnZXRzLCB3aXRoIGxpdHRsZQotCXRoZSBkZWZhdWx0IHVubGVzcyBUQVJHRVRfSVNfQklHX0VORElBTl9QIGlzIGRlZmluZWQuCi0JKiBob3N0LWFvdXQuYzogIEFkZCBGSVhNRSBub3RlLgotCi1TdW4gTm92IDE3IDEzOjI5OjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6ICBNYWtlIHRoZSBkZWZhdWx0IHRhcmdldF92ZWN0b3IgY29udGFpbgotCWp1c3QgJkRFRkFVTFRfVkVDVE9SLiAgVGhpcyBtYWtlcyBleGVjdXRhYmxlcyBhIGxvdCBzbWFsbGVyLgotCU9sZCBiZWhhdmlvciBjYW4gYmUgZ290dGVuIGJ5IGRlZmluaW5nIEFMTF9UQVJHRVRTLgotCSogYW91dGYxLmgsIGRlbW82NC5jLCBpMzg2YW91dC5jLCBuZXdzb3MzLmMsIHN1bm9zLmM6Ci0JRmFjdG9yZWQgb3V0IGNvbW1vbiBjb2RlIGludG8gbmV3IGZpbGUgYW91dC10YXJnZXQuaC4KLQlTYXZlcyBhIGxvdCBvZiBkdXBsaWNhdGUgY29kZSBmb3IgYS5vdXQgdmFyaWFudHMuCi0KLUZyaSBOb3YgMTUgMTM6MDA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQlHZXQgJ21ha2UgaGVhZGVycycgdG8gd29yayB3aGVuIGNvbmZpZ3VyZWQgd2l0aCArc3ViZGlycy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgJChzdWJkaXIpIHRvIGRvY2RpciBwYXRoLgotCSogZG9jL01ha2VmaWxlLmluIChwcm90b3MpOiBBZGQgJChzcmNkaXIpIHByZWZpeAotCXRvIG5hbWUgb2Ygc2VkIHNjcmlwdHMuCi0KLVRodSBOb3YgMTQgMTk6NDk6MTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEZpeCB0aGlua28uCi0JKiBzeW1zLmMgKGJmZF9zdGFiX25hbWVzKTogIFR1cm4gb24gbmV3IEdOVV9FWFRSQV9TVEFCUyBtYWNybwotCXRvIGluY2x1ZGUgbmFtZXMgb2YgTl9TRVRUIGV0Yy4KLQotVGh1IE5vdiAxNCAxOToxMToxMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotICAgIAkqIGVsZi5jOiAgQWRkIG1pbmltYWwgc3VwcG9ydCBmb3IgRUxGIHN5bWJvbCB0YWJsZXMuICBHZW5lcmF0ZXMKLQljYW5vbmljYWwgYmZkIHN5bWJvbCB0YWJsZXMgZnJvbSBFTEYgc3ltYm9sIHRhYmxlcy4gIENoYW5nZSB0aGUKLQluYW1lIG9mIHNvbWUgZnVuY3Rpb25zIGZyb20gYmZkXzxuYW1lPiB0byBlbGZfPG5hbWU+LgotCi0JKiBzeW1zLmM6ICBUcml2aWFsIGZpeCB0byBjb21tZW50IHRvIHJlbW92ZSBhIHJlZHVuZGFudCAidG8iLgotCi1XZWQgTm92IDEzIDE3OjAyOjAxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXtpMzg2LG02OGssbTg4a30uYzogIENoYW5nZSBuYW1lIG9mIGZpbGUgZm9ybWF0IHRvIHN0YW5kYXJkCi0JZm9ybSB0aGF0IEdEQiByZWNvZ25pemVzIGFzIENPRkYuCi0KLVdlZCBOb3YgMTMgMDk6MDk6NDEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogIGNhc3QgTlVMTCBjb3JyZWN0bHkuCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGhhcnJpcyBob3N0Ci0KLQkqIGNvZmYtYTI5ay5jOiBMb3RzIG9mIGNoYW5nZXMsIG1vc3QgZnJvbSBEYXZpZCBXb29kLgotCi1UdWUgTm92IDEyIDA3OjIxOjQxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoY29mZl93cml0ZV9hcm1hcCk6ICBKdXN0ICN1bmRlZiBpdC4KLQotTW9uIE5vdiAxMSAyMDozMDoxOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogc3RhbmRhcmRpemUgb24gTUlOVVNfRyB0byBkaXNhYmxlIGRlYnVnZ2luZwotCSogY29mZi1tODhrLmM6IGNyZWF0ZSBjb2ZmIGFybWFwcyBpbnN0ZWFkIG9mIGJzZCBvbmVzLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSksIChiZmRfY2xvc2UpOiBNYXNrIG91dCByYW5kb20gYml0cwotCXdoZW4gY2FsbGluZyBjaG1vZC4KLQotTW9uIE5vdiAxMSAxOTowNzozMiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBBZGRpdGlvbnMgdG8gc3VwcG9ydCBFTEYgZm9ybWF0IGNvcmUgZmlsZXMuCi0JKiBjb25maWcvbWgtYW1peDogIEFkZCAtREhBVkVfUFJPQ0ZTIHRvIEhERUZJTkVTLCBzaW5jZSBob3N0Ci0JaGFzIHN1cHBvcnQgZm9yIC9wcm9jIChhbGwgdGhlIGluY2x1ZGUgZmlsZXMgaW4gcGFydGljdWxhcikuCi0KLU1vbiBOb3YgMTEgMTg6MzY6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgSGFuZGxlIHRoZSBjYXNlCi0Jb2YgdHdvIE5fU08gc3RhYnMsIG9uZSBmb3IgZGlyZWN0b3J5LCBhbmQgb25lIGZvciBmaWxlbmFtZS4KLQotCSogYmZkLWluLmggKHByaW50X3ZtYSk6ICBGYWN0b3Igb3V0IGR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCi0JRXhpdCBhIGxpdHRsZSBtb3JlIGdyYWNlZnVsbHkgd2hlbiBtYWxsb2MgcmV0dXJucyBOVUxMLgotCSogbGliYmZkLmM6IE5ldyBmdW5jdGlvbiBiZmRfeG1hbGxvYyAobWFsbG9jIHdyYXBwZXIpLgotCSogb3BuY2xzLmMsIHN5bXMuYywgYm91dC5jLCBhb3V0eC5oOiAgUmVwbGFjZSBtYWxsb2MgYnkgYmZkX3htYWxsb2MuCi0JKiBsaWJiZmQuaDogUnJlLWdlbmVyYXRlZCBkdWUgdG8gbGliYmZkLmMgdXBkYXRlLgotCi1TYXQgTm92ICA5IDEzOjQ1OjAxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtbTY4ay1lbGY6ICBEZWZpbmUgREVGQVVMVF9WRUNUT1IgYXMgZWxmX2JpZ192ZWMuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3ApOiAgRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhIGJmZCBzZWN0aW9uIGZvcgotCXRoZSBmaXJzdCBFTEYgc2VjdGlvbiBoZWFkZXIuICBJdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIuCi0KLVNhdCBOb3YgIDkgMDM6MDQ6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmMsIGNvbmZpZy9taC1yczYwMDA6ICBNYWtlIGl0IHdvcmsgb24gYXJjaGl2ZSBhbmQKLQljb3JlIGZpbGVzLCB3aGVuIGNvbXBpbGluZyBuYXRpdmUuCi0JKiBob3N0cy9oLXJzNjAwMC5oOiAgRGVmaW5lIEZBU0NJU1RfRkRPUEVOIGZvciBiZmRfZmRvcGVuci4KLQotCUZJWE1FOiAgVGhlIGFvdXRmMS5oIGNoYW5nZSBiZWxvdyBuZWVkcyB0byBiZSByZXZlcnNlZCBiYWNrCi0JdG8gdGhlIHdheSBpdCB3YXMuCi0KLVRodSBOb3YgIDcgMTE6MDM6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IERlZmluZWQgbmV3IG1hY3JvcyBbUFVUfEdFVF1MSU5FTk9fTE5OTyBmb3IKLQltYW5pcHVsYXRpb24gb2YgbG5ubyBmaWVsZHMgaW4gbGluZW5vIHN0cnVjdHMgaW4gYSBjb2ZmLTxmPi5oCi0JaW5kZXBlbmRlbnQgd2F5LiBPdmVycmlkZSBpdCBpbiBjb2ZmLTxmPi5oIHRvIHlvdXIgZmF2b3VyaXRlCi0JbnVtYmVyIGlmIHlvdSBkb24ndCBoYXZlIGEgMTZiaXQgbG5ubyBmaWVsZC4gKGNvZmZfc3dhcF9saW5lbm9faW4pCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogbW9kaWZpZWQgdG8gdXNlIHRoZSBuZXcgbWFjcm9zLgotCi1Nb24gTm92ICA0IDExOjM4OjMzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY2FsbGJhY2spOiBOb3cgZGVmYXVsdHMgdG8gNjgwMjAgcmF0aGVyIHRoYW4KLQl1bmtub3duIGFyY2ggd2hlbiB0aGUgbWFnaWMgbnVtYmVyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUKLQlhcmNoaXRlY3R1cmUsIHNpbmNlIHNvbWUgT1NzIChlZyBvbGQgc3VuM3MpIGRvbid0IHNldCB0aGUgbnVtYmVyLCBhbmQKLQkwMjAgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGFuc3dlciBhbnl3YXkuCi0KLVN1biBOb3YgIDMgMTI6MDc6MDggMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtbmV3cy5oLCBob3N0cy9oLXJ0YnNkLmg6Ci0JR2V0IHJpZCBvZiBNSVNTSU5HX1ZGUFJJTlRGLCBzaW5jZSBsaWJpYmVydHkgcHJvdmlkZXMgb25lLgotCSogYmZkLWluLmggKGJmZF9wcmludF9zeW1ib2xfdHlwZV9ob3B3IGVudW0pOiAgIEFkZCBuZXcgb3B0aW9uCi0JYmZkX3ByaW50X3N5bWJvbF9ubSwgZm9yIHVzZSBieSBubS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEFkZCBjb2RlIGZvciBuZXcKLQliZmRfcHJpbnRfc3ltYm9sX25tIG9wdGlvbiwgdG8gcHJpbnQgaW4gbm0gZm9ybWF0LgotCSogY29mZmNvZGUuaCAoY29mZl9wcmludF9zeW1ib2wpLCBpZWVlLmMgKGllZWVfcHJpbnRfc3ltYm9sKQotCW9hc3lzLmMgKG9hc3lzX3ByaW50X3N5bWJvbCk6ICBQcm92aWRlIHN0dWIgaW1wbGVtZW50YXRpb25zCi0JZm9yIGJmZF9wcmludF9zeW1ib2xfbm0uCi0JKiBzeW1zLmM6ICBOZXcgZnVuY3Rpb24gYmZkX2RlY29kZV9zeW1jbGFzcywgdXNlZCBieSBubSBwcmludGVyLgotCU5ldyBmdW5jdGlvbiBiZmRfc3RhYl9uYW1lIHRvIGxvb2sgdXAgc3RyaW5nIG5hbWUgb2Ygc3RhYiBjb2RlLgotCi1TYXQgTm92ICAyIDE0OjI2OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGN0b3IuYwotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpIGFkZGVkCi0JYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjb2ZmY29kZS5oOiByZW1vdmVkIGEgbG9hZCBvZiAjaWYgMGVkIGNvZGUuCi0JKGNvZmZfY29tcHV0ZV9maWxlX3NlY3Rpb25fcG9zaXRpb25zKTogbm93IHdvcmtzIG91dCB0aGUgc2VjdGlvbgotCWFsaWdubWVudCBhbmQgc2l6ZSBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLgotCShjb2ZmX2dldF9zeW10YWIpOiBsb29rcyBmb3IgY29uc3RydWN0b3Igc3ltYm9scyBhbmQgY2FsbHMgdGhlCi0JcmlnaHQgZnVuY3Rpb24gd2hlbiB0aGV5J3JlIGZvdW5kLiAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOgotCWtub3dzIHdoZW4gYSBzZWN0aW9uIGlzIGZ1bGwgb2YgY29uc3RydWN0b3JzIGFuZCBkb2VzIHRoZSByaWdodAotCXRoaW5nLgotCSogY3B1LW04OGsuYzogQWRkZWQgZGVmYXVsdF9yZWxvY190eXBlIGxvb2t1cCB0byB0aGUgYXJjaGl0ZWN0dXJlCi0JZGVzY3JpcHRpb24uCi0JKiBsaWJiZmQtaW4uaDogKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKSBkZWZ1biAgYWRkZWQuCi0JKiBsaWJjb2ZmLmg6IHJlbW92ZWQgI2lmIDBlZCBjb2RlCi0JKiByZWxvYy5jOiAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBhZGRlZCBCRkRfUkVMT0NfQ1RPUiBmb3IKLQlhcmNoIGluZGVwZW5kZW50IGNvbnN0cnVjdG9yIHJlbG9jYXRpb24gdHlwZS4KLQkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogcmVtb3ZlZCB0aGUgY29tbWVudCAidGhpcyB3aWxsIGdvIGF3YXkiCi0Jc2luY2UgaXQgd29uJ3QuIChiZmRfaG93dG9fMzIpOiBzdG9sZW4gZnJvbSA4OGssIHRoaXMgaXMgYSAzMmJpdAotCXJlbG9jIHdoaWNoIGlzIHVzZWQgd2hlbiBCRkRfUkVMT0NfQ1RPUiBmYWxscyB0aHJvdWdoIHRvIGdpdmUgYQotCWRlZmF1bHQgMzJiaXQgcmVsb2MgZm9yIGNvbnN0cnVjdG9ycy4KLQkoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBhZGRlZC4KLQkqIGFvdXRmMS5oOiBmaXhlZCBTRUdNRU5UX1NJWkUgdHlwby4KLQotVGh1IE9jdCAzMSAxODoyMzowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIENoYW5nZSBuYW1lIHRvICJhaXhjb2ZmLXJzNjAwMCIsIHRvIGF2b2lkCi0JbWF0Y2hpbmcgcHJlZml4ICJjb2ZmIi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9hdXhfb3V0KTogIEhhbmRsZQotCXJzLzYwMDAgY3NlY3QgcmVjb3Jkcy4KLQotU3VuIE9jdCAyNyAxNjo1Njo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jLCB0YXJnZXRzLmM6IGNoYW5nZSBuYW1lIG9mIG04OGtfYmNzIHRvIG04OGtiY3MKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIG1vdG9yb2xhIGRlbHRhODggY2FzZXMKLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCwgYXJjaGl2ZS5jLCBpZWVlLmMsIGVsZi5jLCBzcmVjLmM6IGZpeAotCXdyaXRlX2FybWFwIHByb3RvdHlwZQotCSogbGliYmZkLmM6IGFkZCBkb2Mgb24gYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQKLQotRnJpIE9jdCAyNSAwMjo0ODoxOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIENPRkYtcmVsYXRlZCBmaWxlcyBpbiBgY29mZi1BUkNILmMnIGZvcm0uCi0JY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jIHRvIGJlIGV4YWN0LgotCi0JKiBNYWtlZmlsZS5pbjogIE9ubHkgc3VwcGx5IFRBUkdFVF9ERUZBVUxUUyB0byB0YXJnZXRzLmMsIHJlZHVjaW5nCi0JbWFrZSBvdXRwdXQgY2x1dHRlci4KLQkqIGNvbmZpZy9tdC0qOiAgRGl0dG8uCi0KLVRodSBPY3QgMjQgMjI6NDA6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIHN1cHBvcnQsIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaPv0bmctVGjlbyBW9SwgYW5kCi0JSm9obiBHaWxtb3JlLiAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNwdS1yczYwMDAuYyBhbmQgcnM2MDAwY29mZi5jLgotCSogY29uZmlndXJlLmluOiAgQWRkIHJzNjAwMCBjYXNlLgotCSogdGFyZ2V0cy5jOiAgQWRkIHJzNjAwMCB2ZWN0b3IuCi0JKiBhcmNodXJlcy5jOiAgQWRkIHJzNjAwMCwgZml4IGNvbW1lbnQgb24gcm9tcC4KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6ICBBZGQgbm9fZGVidWdfc2VjdGlvbiBlcnJvci4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgUmVtb3ZlIHVudXNlZCBzdHJpbmdfdGFibGUuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IgbWVzc2FnZS4KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbik6ICBSZXR1cm4gTlVMTCBvbiBhdHRlbXB0IHRvIGNyZWF0ZQotCWEgc2VjdGlvbiB0d2ljZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9zd2FwX3JlbG9jX2luKTogIEhhbmRsZSByX3R5cGUgYW5kIHJfc2l6ZS4KLQkoYmZkX3N3YXBfYW91dGhkcl9pbik6ICBIYW5kbGUgbG90cyBtb3JlIG1lbWJlcnMuCi0JKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6ICBJZiBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2VlbiwKLQlqdXN0IHJldHVybiBmYWxzZSByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBpdC4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogIFVuZGVyc3RhbmQgaW5jb21pbmcgbWFnaWMgbnVtYmVycy4KLQkoY29mZl9zZXRfZmxhZ3MpOiAgVW5kZXJzdGFuZCBvdXRnb2luZyBtYWdpYyBudW1iZXJzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBvdXRnb2luZyBhb3V0aGRyIG1hZ2ljICMuCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiAgQWRkIGZuIGZvciByZWFkaW5nIGRlYnVnIHN0cmluZyBzZWN0aW9uLgotCShnZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSGFuZGxlIHN5bWJvbCBuYW1lcyBpbiBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KLQlSZW1vdmUgdW51c2VkIG9ial9zdHJpbmdfdGFibGUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZSByczYwMDAtc3BlY2lmaWMgc3RvcmFnZSBjbGFzc2VzLgotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywgTl9TRVQqKTogIENoZWNrIGZvcgotCWV4aXN0aW5nIHNlY3Rpb24gYmVmb3JlIG1ha2luZyBvbmUuCi0JKiBjcHUtcnM2MDAwLmM6ICBOZXcgZmlsZS4KLQkqIHJzNjAwMGNvZmYuYzogIE5ldyBmaWxlLgotCi1UaHUgT2N0IDI0IDAyOjAzOjI0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogQWRkIHBhcnRpYWwgc3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBjb3JlZmlsZXMuIFN0aWxsIG5lZWRzCi0Jc3VwcG9ydCBmb3IgZXh0cmFjdGluZyByZWdpc3RlcnMgZnJvbSBjb3JlZmlsZXMuCi0KLQkqIGNvbmZpZy90LW02OGstZWxmOiAgU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVsZl9iaWdfdmVjLgotCi0JKiBjb25maWcve2gtYW1peCxoLWRndXgsaC1pcml4MyxoLXVsdHJhM306IEZvciBzeXN0ZW1zIHdoZXJlCi0JUkFOTElCIGlzIGRlZmluZWQgYXMgZWNobywgc2VuZCB0aGUgb3V0cHV0IHRvIC9kZXYvbnVsbCB0byBoZWxwCi0JcmVkdWNlIGNsdXR0ZXIgaW4gdGhlIG91dHB1dCBmcm9tIGRvaW5nIGEgbWFrZS4KLQotTW9uIE9jdCAyMSAxNzo0ODo0OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC12YXh1bHQuaDogIFJlbW92ZSBtYWxsb2MvZnJlZSBkZWNscyBjb3ZlcmVkIGluIHN0ZGxpYi5oLgotCUZpeCBIT1NUX1BBR0VfU0laRSBhbmQgSE9TVF9TRUdNRU5UX1NJWkUuICBGcm9tIERhdmlkIFRheWxvci4KLQotTW9uIE9jdCAyMSAwOTozNDoxMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IG1ha2UgaXQgcGFkCi0Jc2VjdGlvbiBzaXplIG91dCBpZiB0aGVyZSBhcmUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBzbyB0aGF0IHRoZQotCWltYWdlIHdpbGwgYmUgb2sgb24gYSBzeXN0ZW0gd2hlcmUgc2VjdGlvbiBwb3NpdGlvbnMgYXJlIHdvcmtlZAotCW91dCBieSBhY2N1bXVsYXRpbmcgc2l6ZXMgcmF0aGVyIHRoYW4gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCSogdGFyZ2V0cy5jIChwcm90byB3cml0ZV9hcm1hcCkuIENoYW5nZWQgb3JsX2NvdW50IHRvIHVuc2lnbmVkLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSkuIEFkZGVkIHNvIHRoYXQgZ2VuZXJhdGl2ZQotCXByb2dyYW1zIGxpa2UgZ2FzIGNhbiBjbG9zZSBhIGJmZCB3aXRob3V0IGNhdXNpbmcgYmZkIGNvbmZ1c2lvbi4KLQkqIGxpYmJmZC5oIChjaGFuZ2VkIGJlY3Vhc2Ugb2YgcHJvdG9zKQotCSogYW1kY29mZi5jOiBtZXNzZWQgd2l0aCB0aGUgd2F5IHRoYXQgam1wIGRpc3BsYWNlbWVudHMgYXJlCi0JY2FsY3VhbGF0ZWQuIFRoaXMgbWF5IG5vdCB5ZXQgYmUgdG90YWxseSBjb3JyZWN0LgotCSogYXJjaGl2ZS5jIChjb2ZmX3dyaXRlX2FybWFwKTogcmV3cm90ZSB0aGUgd2F5IHRoYXQgcmFubGlicyBhcmUKLQl3cml0dGVuIG91dC4KLQkqIGNvZmZjb2RlLmggKGZpeHVwX3N5bWJvbF92YWx1ZSk6IG5vdyBkb2Vzbid0IGNvcmUgZHVtcCBpZiBhIG5vbgotCWFicyBzeW1ib2wgaGFzIG5vIHNlY3Rpb24gKGxpa2UgYSByZWdpc3RlciBzeW1ib2wpLgotCShjb2ZmX3dyaXRlX3N5bWJvbCkgbm93IHplcm9zIGF1eGVudCBiZWZvcmUgZmlsbGluZyBpdCB1cCB0byBoZWxwCi0Jd2l0aCBzZW5zaXRpdmUgYXBwbGljYXRpb25zLgotCSogbGliYmZkLmMgKGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50KTogYWRkZWQuCi0KLVdlZCBPY3QgMTYgMjI6NTg6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhIG1hY3JvIHN0cmVycm9yKCkuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSWYgRkFTQ0lTVF9GRE9QRU4sIHVzZSAiciIsIG5vdCAicisiLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogIFN1cHByZXNzCi0JYXR0ZW1wdCB0byByZWNvdmVyIGNvbW1hbmQsIGlmZGVmIE5PX0NPUkVfQ09NTUFORC4KLQkqIGhvc3RzL2gtdGFob2UuaDogIEFkZCBGQVNDSVNUX0ZET1BFTiBhbmQgTk9fQ09SRV9DT01NQU5EOwotCXJldmFtcCBIT1NUXyosIGV0Yy4KLQkqIGhvc3RzL2gtaTM4NnYuaDogIFVzZSA8dXRpbWUuaD4sIG5vdCA8c3lzL3V0aW1lLmg+LCB1bmxpa2UgUE9TSVguCi0KLVdlZCBPY3QgMTYgMTI6NDM6NDkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FyZ21hcCk6IFRoZSBzaXplIG9mIHRoZSByYW5saWIgc3RydWN0dXJlcwotCXNob3VsZCBub3QgaW5jbHVkZSB0aGUgc2l6ZSBmaWVsZCBpdHNlbGYuCi0JKiBhb3V0eC5oLCBsaWJhb3V0LmggKE5BTUUoYW91dCwgc2l6ZW9mX2hlYWRlcnMpKTogIFVzZQotCWFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgZmllbGQgaW5zdGVhZCBvZiBjb25zdGFudCBtYWNybywKLQliZWNhdXNlIGFvdXR4LmggY29tcGlsZXMgdG8gYSBzaW1wbGUgLm8gZmlsZSBzaGFyZWQgYnkKLQlhbGwgMzItYml0cyBhLm91dCB0YXJnZXRzLgotCi1XZWQgT2N0IDE2IDExOjExOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBpMzg2LXNjby1zeXN2LgotCSogYm91dC5jOiAgUmVtb3ZlIHVudXNlZCBpOTYwX2FsaWduOyBsaW50IGR1bW15IGNvcmUgZmlsZSBoYW5kbGVycy4KLQkqIGNwdS1oODMwMC5jOiAgbGludC4KLQotCSogaG9zdC1hb3V0LmM6ICBOZXcgc3RyYXRlZ3kuICBXZSB1c2UgY29tbW9uIGNvZGUsIGluY2x1ZGUgZmlsZXMsCi0JYW5kIGRhdGEgc3RydWN0dXJlcyB0byBoYW5kbGUgdGhlIGZpbGUsIGJ1dCBzZXQgYSBmZXcgcGFyYW1ldGVycwotCWZyb20gdGhlIGhvc3QncyBjb25maWcgZmlsZSAocGFnZSBzaXplLCB0ZXh0IHN0YXJ0IGFkZHIsIGV0YykuCi0JKiBsaWJhb3V0Lmg6ICBEZWZpbmUgSFAgQlNEIG1hY2hpbmUgdHlwZXMuCi0JKiBhb3V0ZjEuaDogIEhhbmRsZSByZWFkaW5nIGEub3V0cyB3aXRoIHRoZXNlIHR5cGVzLgotCi0JKiB0cmFkLWNvcmUuYzogIFBhc3MgdGhlIHUudV9hcjAgdmFsdWUgYXMgdGhlIG5lZ2F0aXZlIG9mIHRoZQotCXZpcnR1YWwtbWVtb3J5LWFkZHJlc3Mgb2YgdGhlIC5yZWcgc2VjdGlvbi4gIFdlIGNhbid0IGp1c3QgbWFrZSBhCi0Jc2VjdGlvbiBmb3IgImFsbCB0aGUgcmVncyBhbmQgbm90aGluZyBlbHNlIiBiZWNhdXNlIG9ubHkgR0RCIGtub3dzCi0JZXhhY3RseSB3aGVyZSB0aGUgcmVncyBhcmUgKHNjYXR0ZXJlZCBhcm91bmQgdGhlIHVwYWdlIGFuZCBzdGFjaykuCi0JQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRpb24uICBSZW1vdmUgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbgotCXZlY3RvcnMsIHJlcGxhY2Ugd2l0aCBzaW5nbGUgdmVjdG9yOyB0aGlzIG9ubHkgcnVucyBvbiB0aGUgaG9zdCwKLQlpbiBob3N0IGJ5dGUgb3JkZXIuICBSZXBsYWNlIGJ5dGVzd2FwIHJvdXRpbmVzIHdpdGggYWJvcnRzIGluIGNhc2UKLQlhbnlvbmUgY2FsbHMgdGhlbS4KLQkqIHRhcmdldHMuYzogIFRoZXJlJ3Mgb25seSBvbmUgdHJhZF9jb3JlX3ZlYyBub3cuCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgVk1BIG9mIC5yZWcqIG5vdyBuZWVkcyB0byBiZSAwLgotCi1UdWUgT2N0IDE1IDA4OjI5OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLWFtaXguaCAoZnJlZSk6ICBGaXggcHJvdG90eXBlLgotCi0JKiBhb3V0eC5oOiAgRG9uJ3QgdXNlIE5VTEwgYXMgYW4gaW50ZWdlciwgZm9yIGJyYWluZGVhZCBzeXN0ZW1zCi0JdGhhdCBkZWNsYXJlIGl0IGFzICh2b2lkICopMC4gIChGcm9tIFBldGVyIFNjaGF1ZXIuKQotCi1Nb24gT2N0IDE0IDE3OjIwOjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHJlcG9ydGVkCi0JcHJvYmxlbSB3aXRoIGJhZCBVbHRyaXggc3lzdGVtIGhlYWRlcnMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogIFRyeSB0byBoYW5kbGUgdGhlCi0JdmFyaW91cyBraW5kcyBvZiBhbGlnbm1lbnRzIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZgotCW1hZ2ljIG51bWJlcnMuCi0KLU1vbiBPY3QgMTQgMTQ6MjM6MTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZTogIERvbid0IGFzc3VtZSAuIGlzIG9uIHRoZSBwYXRoIChmcm9tIEphbWVzIENsYXJrKS4KLQotRnJpIE9jdCAxMSAyMjo0NToxNCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzLgotCSogdGFyZ2V0cy5jOiAgRGVjbGFyZSB0cmFkX2NvcmUgdmVjdG9ycyBleHRlcm4uCi0KLUZyaSBPY3QgMTEgMTM6MDM6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IE1vdmVkIEFMSUdOIG1hY3JvIHRvIGxpYmJmZC5oLiBSZW1vdmVkIGk5NjBfYWxpZ24uCi0JKiBsaWJiZmQuaDogTW92ZWQgQUxJR04gbWFjcm8gaGVyZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBSZXBsYWNlIGk5NjBfYWxpZ24gYnkgYWxpZ25fcG93ZXIuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogIEFkZGVkIGZpZWxkcyBwYWdlX3NpemUsCi0Jc2VnbWVudF9zaXplIGFuZCBleGVjX2J5dGVzX3NpemUuICBUaGVzZSBoZWxwIGdlbmVyaWMgY29kZQotCShpbiBhb3V0eC5oIGFuZCBsaWJhb3V0LmgpIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gYWxpZ24KLQl0aGUgdmFyaW91cyBzZWdtZW50cyBpbiBhIGRlbWFuZCBwYWdlZCBmaWxlLgotCSogbGliYW91dC5oIChXUklURV9IRUFERVIpOiAgVXNlIG5ldyAoc3RydWN0IGFvdXRkYXRhKSBmaWVsZHMKLQl0byBkZWNpZGUgaWYgdGhlIGV4ZWMgaGVhZGVyIGNvdW50cyBpbiBhX3RleHQgKHRleHQgc2VnbWVudCBzaXplKS4KLQlBbHNvLCBhc3N1bWUgRF9QQUdFRCBmbGFnIGlzIHNldDsgZG9uJ3Qgc2V0IGl0IGhlcmUuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogQWRkIGluaXRpYWxpemF0aW9uIG9mCi0JYWRhdGEgZmllbGRzIHBhZ2Vfc2l6ZSwgc2VnbWVudF9zaXplLCBhbmQgZXhlY19ieXRlc19zaXplLgotCSogaG9zdC1hb3V0LmMgKE5BTUUoaG9zdF9hb3V0LCBjYWxsYmFjaykgYW5kCi0JTkFNRShob3N0X2FvdXQsbWtvYmplY3QpOiBEaXR0by4KLQkqIGkzODZhb3V0LmMgKGFvdXQzODZfY2FsbGJhY2spIGFuZCBuZXcgYW91dDM4Nl9ta29iamVjdCk6IERpdHRvLgotCSogbmV3b3MzLmMgKG5ld3NvczNfY2FsbGJhY2spIGFuZCBuZXcgbmV3c29zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X2NhbGxiYWNrKSBhbmQgbmV3IHN1bm9zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IERvbid0IHN1YnRyYWN0Ci0JRVhFQ19CWVRFU19TSVpFIGZyb20gdGhlIGFfdGVzdCBzaXplOyB0aGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUKLQlmb3Igc29tZSBzeXN0ZW1zIChtYWlubHkgc3Vub3MpLCBzbyBkbyBpdCBpbiB0aGUgY2FsbGJhY2sgaW5zdGVhZC4KLQlTYW1lIHJvdXRpbmU6IEFkZCBzdHVmZiB0byB0aGUgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04gY29tbWVudC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSB0aGUgd2F5Ci0JZmlsZXBvcyBhbmQgc2l6ZSBvZiBzZWN0aW9ucyBhcmUgY2FycmllZCBvdXQgdG8gc3VwcG9ydAotCW9sZGVyIHN0eWxlcyBvZiBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMuCi0KLQotRnJpIE9jdCAxMSAxMjozMzozNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBBZGRlZCBtb3JlIG1hY3JvcyB0byBDT0ZGX1NXQVBfVEFCTEUuCi0JKiBiZmQuYzogQWRkZWQgbWFjcm9zIHRvIGVuYWJsZSBnYXMgdG8gc3dhcCBjb2ZmIHJlY29yZHMuCi0JKiBjb2ZmY29kZS5oOiBNYWtlIHRoZSBjb2ZmX3N3YXBfKl9vdXQgcm91dGluZXMgcmV0dXJuIHRoZSBudW1iZXIKLQlvZiBieXRlcyBzd2FwcGVkLCBhbmQgY2xlYW5lZCB1cCB0aGVpciBwcm90b3R5cGVzLgotCSogY29uZmlndXJlLmluOiBBZGRlZCBlYm1vbi9jb2ZmIHN1cHBvcnQKLQkqIGVjb2ZmLmM6IENoYW5nZWQgbnVsbCBkZWZpbml0aW9ucyBvZiBjb2ZmX3N3YXBfKl9vdXQgdG8gY29uZm9ybQotCXRvIG5ldyBwcm90b3R5cGVzCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5ldyBlbnRyeSBwb2ludHMgZm9yIGNvZmYgc3dhcHBpbmcKLQotRnJpIE9jdCAxMSAwMzowMTo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIGhvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIC1JLiB0byBnZXQgc3lzZGVwLmguICBSZW1vdmUgcmVmcyB0bwotCS4uL2luY2x1ZGUvc3lzZGVwLmguCi0JKiBjcHUtaTk2MC5jOiAgU3RybmNtcCBuZWVkZWQgYSBsZW5ndGggYXJnLgotCSogZWNvZmYuYzogIERvbid0IGV2ZXIgY2FsbCB0cmFkX3VuaXhfY29yZV9maWxlX3AgZnJvbSBoZXJlLgotCSogaTM4NmFvdXQuYzogIFJlbW92ZSBkZWFkIE5fVFhUT0ZGIG92ZXJyaWRlLgotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBkaXNhYmxlIHRoZSB3aG9sZSBmaWxlIGlmIFNVTjRfU1lTLgotCSogY29uZmlnLzogIFJlbmFtZSBzb21lIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB1cCBoLSouaCBuYW1lcy4KLQlSZW1vdmUgYWxsIHRoZSBIT1NUX1NZUyBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0JKiBob3N0cy9oLWFtaXguaCwgaC1pMzg2di5oOiAgRGVmaW5lIFBPU0lYX1VUSU1FLCBub3QgVVNHLgotCSogaG9zdHMvaC1ocDkwMDAuaDogIFJlbW92ZSBVU0cgY29tbWVudC4KLQkqIGhvc3RzL2gtcnM2MDAwLmg6ICBJbmNsdWRlIDxzdGRsaWIuaD4gZm9yIG1hbGxvYy4KLQkqIGhvc3RzL2gtbmV3cy5oLCBoLXNwYXJjLTY0Lmg6ICBOZXcgY29uZmlnIGZpbGVzIHRoYXQgaGFkCi0JcHJldmlvdXNseSBiZWVuIGtsdWRnZWQgaW4gdGhlIDxzeXNkZXAuaD4gZmlsZS4KLQotVGh1IE9jdCAxMCAxNzo1NDowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyo6ICB0cmFkLWNvcmUgc3VwcG9ydCBpcyBIT1NUIGRlcGVuZGVudCwgbm90IHRhcmdldAotCWRlcGVuZGVudC4gIFRhcmdldCBjb25maWcgZmlsZXMgb25seSBzZXQgREVGQVVMVF9WRUNUT1IgYW5kL29yCi0Jb3RoZXIgdmVjdG9yIGVsZW1lbnRzLiAgRXhjZXB0aW9uOiAgd2hlbiBob3N0LWFvdXQuYyBpcyBpbiB1c2UsCi0JaW4gd2hpY2ggY2FzZSB3ZSdyZSBmb3JjZWQgdG8gYXNzdW1lIHdlJ3JlIG5hdGl2ZSAoaHAsIHZheCwKLQl0YWhvZSkuICBSZW5hbWUgWERFUEZJTEVTIHRvIEhERVBGSUxFUy4KLQkqIE1ha2VmaWxlLmluOiAgUmVuYW1lIFhERVBGSUxFUy4KLQkqIGNvbmZpZy9oLXN1bio6ICBEb24ndCBmb3JjZSBzdGF0aWMgbGlua2luZy4KLQkqIHRyYWQtY29yZS5jOiAgRG9jdW1lbnQgaG93IHRvIHVzZSBpdCBub3dhZGF5cy4KLQkqIGkzODZhb3V0LmMsIG5ld3NvczMuYzogIENsZWFuIHVwLgotCSogaTM4NmNvZmYuYzogIEFsbG93IDM4NiBjb2ZmIGZpbGVzIHRvIGJlIHVzZWQgYXMgY29yZSBmaWxlcyB0b28KLQkoZm9yIHJlYWRpbmcgY29yZSBmaWxlcyBmcm9tIGVtYmVkZGVkIHN5c3RlbXMpLgotCi1UdWUgT2N0ICA4IDE1OjMwOjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBBZGQgaTM4NmFvdXQuYyBmb3IgYS5vdXQgc3VwcG9ydCBvbiB0aGUgaTM4Ni4KLQotVHVlIE9jdCAgOCAxMjoxODo1NCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOiBjb3JyZWN0IGluZm8tbm9kZQotCXN0cnVjdHVyZSBpbiAqZG9jKiBjb21tZW50cy4KLQlkb2MvTWFrZWZpbGU6IHN0b3AgaGlkaW5nIGNvbXBsYWludHMgZnJvbSBtYWtlaW5mby4KLQotU3VuIE9jdCAgNiAxOToxMDowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFRha2UgYSB0aGlyZCBwYXJhbWV0ZXIsCi0JdGhlIGludGVybmFsX2V4ZWMgc3RydWN0LCBhbmQgYXZvaWQgZXZlciBsb29raW5nIGF0IGFuCi0JZXh0ZXJuYWxfZXhlYy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gcmVhZCB0aGUgZW50aXJlCi0JZXh0ZXJuYWxfZXhlYyBzdHJ1Y3QsIHN3YXAgYW5kIGNoZWNrIGl0cyBtYWdpYyBudW1iZXIsCi0Jc3dhcCBpbiB0aGUgd2hvbGUgc3RydWN0dXJlLCBhbmQgcGFzcyB0aGUgc3dhcHBlZC1pbiB2ZXJzaW9uIHRvCi0Jc29tZV9hb3V0X29iamVjdF9wLgotCSogYm91dC5jOiAgQnJpbmcgaW50byBtb2Rlcm4gZXJhLiAgVXNlIHNpbmdsZSBfb2JqZWN0X3Agcm91dGluZQotCWZvciBiaWctIGFhbmQgbGl0dGxlLWVuZGlhbi4gIFByb3ZpZGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsCi0JZXhlYyBoZWFkZXIgc3RydWN0cy4gIFVzZSBzZXBhcmF0ZSBzd2FwLWluIGFuZCBzd2FwLW91dCByb3V0aW5lcy4KLQotCSogbGliYW91dC5oOiAgTW92ZSBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBmcm9tIC4uL2luY2x1ZGUvYW91dDY0LmgKLQl0byBoZXJlLiAgQWRkIG9ial9zeW1ib2xfZW50cnlfc2l6ZSB0byBzdHJ1Y3QgYW91dGRhdGEuCi0JKiBhb3V0eC5oICguLi5zb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IG9ial9zeW1ib2xfZW50cnlfc2l6ZS4KLQotCSogLi4vaW5jbHVkZS9hb3V0NjQuaDogIENoYW5nZSBFWFRFUk5BTF9MSVNUX1NJWkUgdG8KLQlFWFRFUk5BTF9OTElTVF9TSVpFLiAgQ2FsbGVycyBjaGFuZ2VkLgotCi1GcmkgT2N0ICA0IDE4OjE4OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIFJlbW92ZSBzdHJlcnJvcigpIHRvIGxpYmliZXJ0eS4KLQotCSogZWxmLmM6ICBSZW1vdmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzLCB1c2UgZ2VuZXJpYyBvbmUuICBMaW50LgotCSogbGliYmZkLWluLmgsIGxpYmJmZC5jOiAgQWRkIGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX3tnZXQsc2V0fV9zZWN0aW9uX2NvbnRlbnRzKTogIENoZWNrIHRoYXQKLQlsYXN0IGJ5dGUgb2YgdHJhbnNmZXIsIG5vdCBmaXJzdCBieXRlLCBpcyB3aXRoaW4gdGhlIHNlY3Rpb24uCi0KLQkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlIGBCU0QnIGFyY2hpdmUgc3VwcG9ydC4gIExpbnQuCi0KLQkqIGFyY2h1cmVzLmM6IFJlbmFtZSBgc3RydWN0IGJmZF9hcmNoX2luZm9fc3RydWN0JyB0byBgc3RydWN0Ci0JYmZkX2FyY2hfaW5mbycuICBSZW5hbWUgYHR5cGVkZWYgYmZkX2FyY2hfaW5mb19zdHJ1Y3RfdHlwZScgdG8KLQlgYmZkX2FyY2hfaW5mb190eXBlJy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0JKiByZWxvYy5jOiAgUmVuYW1lIGBiZmRfcmVsb2Nfc3RhdHVzX2VudW1fdHlwZScgdG8KLQlgYmZkX3JlbG9jX3N0YXR1c190eXBlJy4gIFJlbmFtZSBgYmZkX3JlbG9jX2NvZGVfZW51bV9yZWFsX3R5cGUnCi0JdG8gYGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZScuICAoVGhpcyBzZWVtcyB0byBiZSBhIG1pc25vbWVyLAotCWl0IG5lZWRzIGEgYmV0dGVyIG5hbWUuKSAgQWxsIHVzZXMgY2hhbmdlZC4KLQkqIHRhcmdldHMuYzogIFJlbmFtZSBgZW51bSB0YXJnZXRfZmxhdm91cl9lbnVtJyB0byBgZW51bQotCXRhcmdldF9mbGF2b3VyJywgYW5kIHJlbW92ZSB0aGUgYF9lbnVtJyBmcm9tIGFsbCBvZiB0aGUgZW51bQotCXZhbHVlcyB0aGVtc2VsdmVzLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvaC1pMzg2bWFjaDogIGkzODYgbWFjaCBob3N0LgotCSogY29uZmlnL3QtaTM4Ni1hb3V0OiAgVXNlIGhvc3QtYW91dC5jLgotCi0JKiB0cmFkLWNvcmUuYzogIEdpdmUgaXQgaXRzIG93biB4dmVjJ3MgdG8gbWFrZSBpdCBpbmRlcGVuZGVudAotCW9mIG90aGVyIGZpbGUgZm9ybWF0cy4KLQkqIGVjb2ZmLmMsIGhvc3QtYW91dC5jOiAgUmVtb3ZlIHJlZnMgdG8gdHJhZC1jb3JlLgotCSogY29uZmlnL3QtZGVjMzEwMCwgdC1ocDMwMGJzZCwgdC10YWhvZSwgdC12YXg6ICBEZWZpbmUgVFJBRF9DT1JFLgotCSogdGFyZ2V0cy5jOiAgI2lmZGVmIFRSQURfQ09SRSwgaW5jbHVkZSBpdCBpbiB0aGUgdmVjdG9yLgotCi1GcmkgT2N0ICA0IDE3OjM4OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYzogRXh0ZW5kZWQgTkVXSE9XVE8gbWFjcm8KLQkqIGllZWUuYzogQ2hhbmdlZCB0aGUgd2F5IDhiaXQgcGNyZWwgaXMgZG9uZQotCSogY3B1LWg4MzAwLmM6IGdvdCB0aGUgcmVnaXN0ZXJzIGluIHRoZSByaWdodCBvcmRlcgotCi1UaHUgT2N0ICAzIDE5OjM5OjU1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIGVudW0gYm9vbGVhbiA9PiBlbnVtIGJmZF9ib29sZWFuIGZvciBTVlI0LiAgR3VtYnkncwotCXByZWRpY3Rpb24gaXMgdmluZGljYXRlZCEKLQotCSogYmZkLWluLmgsIGxpYmJmZC1pbi5oLCBkb2MvTWFrZWZpbGUsIGRvYy90b2xpYmJmZCwgZG9jL2ludG9iZmQ6Ci0JUmVtb3ZlIHJlZnMgdG8gaG93dG8uYywgc2luY2UgU3RldmUgZm9yZ290LgotCi1UaHUgT2N0ICAzIDA3OjQ5OjIxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IHRvb2sgdGhlIGFib3J0IG91dCBvZiBzZXRfYXJjaF9tYWNoIHNvIHRoYXQgb2JqZHVtcCAtaSB3aWxsCi0Jc3RpbGwgd29yay4gTm93IGFsbG93cyBhbnkgYXJjaGl0ZWN0dXJlL21hY2hpbmUgdG8gYmUgc2V0LgotCi1XZWQgT2N0ICAyIDEzOjUwOjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG93dG8uYyBkZWxldGVkIGFuZCBtb3ZlZCBjb2RlIHRvIHJlbG9jLmMKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIHJlbW92ZWQgJGlkIHN0dWZmIGZvciByZWFsCi0KLQkqIGNwdS1oODMwMC5jIE1hZGUgaXQgbWF0Y2ggdmFyaW91cyBkaWZmZXJlbnQgc3BlbGxpbmdzIG9mIGg4MzAwLgotCi0JKiBhcmNodXJlcy5jOiBUb29rIG91dCB0aGUgZmlyc3QgY2hhciBmaWx0ZXIgd2hpY2ggbWFkZSBpdCBvbmx5Ci0JbG9vayBmb3IgYSBjcHUvYXJjaCBtYXRjaCB3aGVuIHRoZSBmaXJzdCBjaGFycyBvZiBzdXBwbGllZCBhbmQKLQl0ZXN0ZWQgbmFtZXMgd2VyZSB0aGUgc2FtZS4KLQotCSogdGFyZ2V0cy5jIHJlbW92ZWQgb2FzeXMgc3R1ZmYsIHBlbmRpbmcgc29tZW9uZSB0byBmaXggdGhlIGJ1Z3MKLQlpbiBpdC4KLQotCi1UdWUgT2N0ICAxIDEyOjI5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmMsIGVsZi5jOiAgQWRkIHByZWxpbWluYXJ5Ci0JRUxGIHN1cHBvcnQgZ29vZCBlbm91Z2ggZm9yIEdEQi4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtYW1peCwgY29uZmlnL3QtbTY4ay1lbGY6ICBIYW5kbGUKLQltNjhrLWNibS1zdnI0IGhvc3QgYW5kIHRhcmdldC4KLQkqIGNvbmZpZy90LW02OGstY29mZiwgdC1tODhrLWNvZmYsIHQtbTg4ay1hb3V0OiAgTWFrZSBmaWxlcyBub25lbXB0eQotCXNvIGBkaWZmJyBhbmQgYHBhdGNoJyBjYW4gY29wZS4KLQotVHVlIE9jdCAgMSAxMToyNDozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmM6IHJlbW92ZWQgdGV4aW5mbyBlcnJvcgotCi0JKiBpbml0LmM6IGFkZGVkIHRleGluZm8gaG9va3MsIGFuZCByZW1vdmVkIGluaXRpYWxpemF0aW9uIGVycm9yCi0JbWVzc2FnZS4KLQotCSogbGliY29mZi1pbi5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBmaWVsZCBzbyBjdnMgY2FuIG1lcmdlCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCi1UdWUgT2N0ICAxIDA1OjAyOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jOiAgQXZvaWQgbnVtZXJpY2FsIGNvdW50IG9mIGluaXRpYWxpemVycy4KLQotCVZheCBVbHRyaXggY2hhbmdlcyBmcm9tIERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT46Ci0JKiBob3N0LWFvdXQuYzogIE1ha2UgbGl0dGxlLWVuZGlhbiB2ZWN0b3IgcmVhbGx5IGxpdHRsZS1lbmRpYW4uCi0JKiBjb25maWd1cmUuaW46ICBTZXBhcmF0ZSB2YXggYW5kIHRhaG9lIGNhc2VzLCBoYW5kbGUgdWx0cml4LgotCSogY29uZmlnL3QtdmF4OiAgQWRkIHRyYWQtY29yZS5vLgotCSogY29uZmlnL2gtdmF4dWx0OiAgTmV3IGhvc3Qgc3lzdGVtLgotCi1Nb24gU2VwIDMwIDE1OjEzOjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggVkVSU0lPTiwgY2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDAuMTgsIHRoaXMgbWFrZXMgYQotCWdhcCwgYnV0IG5vdyBpcyB0aGUgc2FtZSBhcyB0aGUgbGlua2VyIHZlcnNpb24gbnVtYmVyLgotCi0JKiBjcHUtYTI5ay5jLCBjcHUtaTM4Ni5jLCBjcHUtbTY4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsCi0JY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsIGNwdS1tODhrLmMsIGNwdS1zcGFyYy5jOiBhZGRlZC4gVGhlc2UKLQlmaWxlcyB3aWxsIGV2ZW50dWFsbHkgY29udGFpbiBwcm9jZXNzb3Igc3BlY2lmaWMgYml0cyBmb3IgYmZkLAotCWxpa2Ugc3RyYW5nZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFuZCBkaXMvYXNzZW1ibHkuICBTbyBmYXIgb25seQotCXRoZSBIOCBoYXMgYmVlbiBldmVuIHBhcnRpYWxseSBkb25lLiAgVGhpcyB3b3JrIGFsc28gdGllcyBpbiB3aXRoCi0JdGhlIGNoYW5nZSBpbiBoYW5kbGluZyBhcmNoaXRlY3R1cmVzLgotCi0JKiBhbWRjb2ZmLmM6IChhMjlrX3JlbG9jKSBmaXggZXJyb3IgbWVzc2FnZS4KLQotCSogYW91dC1mMS5oOiAoY2hvb3NlX3JlbG9jX3NpemUpIG5vdyBjYWxscyBiZmRfZ2V0X2FyY2ggdG8KLQlkaXNjb3ZlciB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBiZmQuIChzdW5vczRfY2FsbGJhY2spIGNhbGxzIHRoZQotCWZ1bmN0aW9uIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlciB0aGFuIHN0dWZmaW5nIHN0dWZmIGRpcmVjdGx5Ci0JaW50byB0aGUgYmZkLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyksIGNoYW5nZWQgbmFtZXMgb2YKLQlhY2Nlc3NvciBmdW5jdGlvbnMuCi0KLQkqIGFvdXR4Lmg6IChzZXRfYXJjaF9tYWNoKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCB0bwotCXNldHVwIHRoZSBlbnZpcm9ubWVudC4KLQotCSogYXJjaGl2ZS5jOiAoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNvZmYgYXJjaGl2ZXMgYWx3YXlzIGhhdmUgdGhlCi0JaGVhZGVycyBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotCWhvc3Qgb3IgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiB0b3RhbGx5IGNoYW5nZWQuIE5vdyBhbiBhcmNoaXRlY3R1cmUgaXMgcmVwcmVzZW50ZWQKLQl3aXRoIGEgcG9pbnRlciB0byBhbiBpbmZvIHN0cnVjdHVyZSByYXRoZXIgdGhhbiBhbiBlbnVtZXJhdGVkIHR5cGUKLQlhbmQgYSBsb25nLiBUaGUgb2xkIGluZm8gaXMgYXZhaWxhYmxlIGFzIHR3byBlbGVtZW50cyBpbiB0aGUKLQlzdHJ1Y3R1cmUuICBGdXR1cmUgZW5oYW5jZW1lbnRzIHRvIGFyY2hpdGVjdXJlIHN1cHBvcnQgd2lsbAotCWludm9sdmUgcG9pbnRlcnMgdG8gbWV0aG9kcyBiZWluZyBwbGFjZWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0KLQkqIGJmZC5jOiBjaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBiZmQgc3RydWN0dXJlIGZvciB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIHN0dWZmLgotCi0JKiBib3V0LmM6IChiX291dF9zZXRfYXJjaF9tYWNoKSBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KLQotCSogY29mZmNvZGUuaDogKGNvZmZfc2V0X2FyY2hfbWFjaCwgY29mZl9zZXRfZmxhZ3MpIGNoYW5nZWQgdG8gdXNlCi0JdGhlIG5ldyBhcmNoaXRlY3R1cmUgbWVjaGFuaXNtLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGg4IHN0dWZmLgotCi0JKiBpZWVlLmM6IHRvbyBtYW55IGNoYW5nZXMgdG8gbm90ZS4gIE5vdyBpZWVlIGZpbGVzIHdyaXR0ZW4gd2l0aAotCWJmZCBnYXMgYW5kIGxkIGNhbiBiZSByZWFkIGJ5IGdsZCBhbmQgaWVlZSBvbmx5IGxpbmtlcnMgYW5kCi0Jc2ltdWxhdG9ycy4KLQotCSogbGliYmZkLmMsIGxpYmJmZC5oOiBjaGFuZ2VkIHByb3RvdHlwZSBvZiBiZmRfd3JpdGUuCi0KLQkqIG5ld3NvczMuYzogKG5ld29zM19jYWxsYmFjaykgbm93IGNhbGxzIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlcgotCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIG9hc3lzLmM6IChvYXN5c19vYmplY3RfcCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggcmF0aGVyCi0JdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogb3BuY2xzLmM6IChuZXdfYmZkKSBtYWtlcyBzdXJlIHRoYXQgYmZkX2luaXQgaGFzIGJlZW4gY2FsbGVkCi0JYmVmb3JlIG9wZW5pbmcgYSBiZmQuCi0KLQkqIHNyZWMuYzogKHNyZWNfc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQlyYXRoZXIgdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogdGFyZ2V0cy5jOiAodGFyZ2V0X3ZlY3Rvcikgbm93IGJ5IGRlZmluaW5nIFNFTEVDVF9WRUNTIChwZXJoYXBzCi0JaW4gdGhlIHQvaG1ha2UgZmlsZSkgYSB1c2VyIGNhbiBzZWxlY3Qgd2hpY2ggYmFja2VuZHMgdGhleSB3YW50Ci0JbGlua2VkIHdpdGggYmZkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNvdXJjZS4KLQotCSogaW5pdC5jOiBuZXcsIGxvb2tzIGFmdGVyIGluaXRpYWxpemluZyBtb2R1bGVzLgotCi0JKiBob3d0by5jOiBmb3IgZnV0dXJlIHVzZSwgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byB3b3JrIG91dAotCXdoYXQgY29va2llIHRvIHVzZSBhcyBhIGhhbmRsZSBvbiBhIHJlbGNvYXRpbyBob3d0by4KLQotTW9uIFNlcCAzMCAxMzozMToxNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiAgQmV0dGVyIGVycm9yIGNoZWNraW5nLCBwYXJ0bHkgZnJvbSBQZXRlciBTY2hhdWVyLgotCShzcmVjX29iamVjdF9wKTogIEF2b2lkIGFzc3VtaW5nIGFueSBmaWxlIHRoYXQgc3RhcnRzIHdpdGggJ1MnIGlzCi0JYW4gUy1yZWNvcmQgZmlsZSEgIChDaGVjayBmb3IgMyB1cHBlcmNhc2UtaGV4IGRpZ2l0cyBhZnRlciBpdC4pCi0JKElTSEVYKTogIERlZmluZSBuZXcgbWFjcm8gZm9yIGNoZWNraW5nIHN1cHBvc2VkbHkgaGV4IGNoYXJhY3RlcnMuCi0JKHBhc3Nfb3Zlcik6ICBUcmVhdCBhcyBFT0YgYW55IFMtcmVjb3JkIGxpbmUgdGhhdDoKLQkgICAgKiAgZG9lc24ndCBoYXZlIGhleCBpbiBlaXRoZXIgc2l6ZSBjaGFyYWN0ZXIKLQkgICAgKiAgcHJvZHVjZXMgYSBzaXplIGxhcmdlciB0aGFuIDB4N0YKLQkgICAgKiAgaGFzIGFuIHVucmVjb2duaXplZCB0eXBlIG51bWJlcgotCi1UaHUgU2VwIDI2IDE1OjI3OjI5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jLCBjb2ZmY29kZS5oLCBob3N0LWFvdXQuYywgb2FzeXMuYywKLQlvcG5jbHMuYzogIExpbnQgKHNhYmVyIGFjdHVhbGx5KS4KLQotVGh1IFNlcCAyNiAxMToyNDoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogU2V0IGhlYWRlcidzIGFfdGV4dCBmaWVsZCBhbHdheXMuCi0JKiBuZXdzb3MzLmM6IEZpeGVkIHR3byB0eXBlczogbmV3b3MzIC0+IG5ld3NvczMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24KLQl0byB1c2UgY29ycmVjdCBzZWdtZW50LgotCi1Nb24gU2VwIDIzIDE4OjI0OjM0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiAgSGFuZGxlIG1pc3Npbmcgc3ltYm9sLT5uYW1lLgotCi1GcmkgU2VwIDIwIDEyOjI2OjAxIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzd2FwY29yZV9zcGFyYyk6ICBDaGFuZ2UgbmFtZSBvZiBVU1JTVEFDSywgZml4IGNvbW1lbnQKLQlhdCB0b3Agb2Ygcm91dGluZS4KLQotVHVlIFNlcCAxNyAxNzoyMzo0OSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5jLCBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWlyaXgzLCBjb25maWcvdC1pcml4MzoKLQlhZGQgc2dpL2lyaXggc3VwcG9ydC4KLQotVGh1IFNlcCAxMiAxNDoyOTowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZvciB0aGUgQU1EIDI5MDAwIFVsdHJhY29tcHV0ZXIgcG9ydCBmcm9tIERhdmlkIFdvb2QuCi0JKHdvb2RAbnl1LmVkdSkuCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBIYW5kbGUgTk9fRkNOVEwuCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBzdWJkaXJzIHdvcmsgYnkgdXNpbmcgJChJTkNESVIpIGluIHRoZQotCWNydWRlIGRlcGVuZGVuY2llcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogIFBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JY3VycmVudCBmaWxlJ3MgY29mZiBzeW1ib2wgZm9ybWF0IHRvIEJGRCB2aWEgdGhlIGNvZmZfZGF0YSBzdHJ1Y3QuCi0JKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgb2JqX2ljb2YgPT4gY29mZl9kYXRhLgotCShjb2ZmX3N3YXBfc3ltX3tpbixvdXR9KTogIENoZWNrIHRoYXQgU1lNTk1MRU4gPT0gRV9TWU1OTUxFTi4KLQkoY29mZl9zd2FwX2F1eF97aW4sb3V0fSk6ICBDaGVjayB0aGF0IEZJTE5NTEVOID09IEVfRklMTk1MRU4KLQlhbmQgRElNTlVNID09IEVfRElNTlVNLgotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzLCBhbmQgdGFyZ2V0cwotCWEyOWstKi1jb2ZmLCBhMjlrLSotYW91dCwgYW5kIGEyOWstKi1zeW0xLgotCSogbGliY29mZi1pbi5oOiAgQWRkIGxvY2FsX25fYnRtYXNrLCBsb2NhbF9uX2J0c2hmdCwKLQlsb2NhbF9uX3RtYXNrLCBsb2NhbF9uX3RzaGlmdCwgbG9jYWxfc3ltZXN6LCBsb2NhbF9hdXhlc3osCi0JbG9jYWxfbGluZXN6IHRvIGBjb2ZmX2RhdGEnICh0ZGF0YSkgc3RydWN0LgotCShjb2ZmX2RhdGEsIGNvZmZfZGF0YV90eXBlLCBjb2ZmX3RkYXRhKTogIFJlbmFtZSBzdHJ1Y3QgaWNvZmRhdGEuCi0JKiBjb25maWcvaC11bHRyYTM6ICBIYW5kbGUgYTI5ay0qLSogaG9zdHMgYXMgVWx0cmFjb21wdXRlcnMuCi0KLVRodSBTZXAgMTIgMTQ6MDc6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAkKE1BS0UpIGZvciBtYWtlLCAkKGRvY2RpcikgZm9yIGRvYwotCSogZG9jL01ha2VmaWxlOiByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZvciBTdW4tbWFrZSBWUEFUSCBidWcKLQotVHVlIFNlcCAxMCAyMDozNDoxMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY29yZV9maWxlX3ApOiAgUmVsZWFzZSB0aGUgcmlnaHQgc3RvcmFnZSBpbgotCWVycm9yIGNhc2UuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgRml4IGhlYWRlciBjb21wYXJpc29uLgotCSogYW91dHguaDogIEF2b2lkIHNoaWZ0cyBvZiAzMiBiaXRzLCB1bmRlZmluZWQgaW4gQy4gIExpbnQuCi0JKiBib3V0LmMsIGljb2ZmLmMsIGllZWUuYywgbGliYmZkLmMsIG9hc3lzLmM6ICBnY2MgLU8gLVcgbGludC4KLQotV2VkIFNlcCAgNCAwMDo0NDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlBbGxvdyBHREIgdG8gcGF0Y2ggb2JqZWN0IGZpbGVzLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgb24gYWxsIHNlY3Rpb25zLgotCSogdHJhZC1jb3JlLmggKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBEaXR0by4KLQkqIGFvdXR4LmggKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiAgT24gZmlyc3Qgb3V0cHV0LCBjaGVjawotCWFiZmQtPmRpcmVjdGlvbiBhbmQgY29tcGxhaW4gaWYgZXJyb25lb3VzLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjcnVkZSBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBTZXAgIDMgMTM6NDY6MTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyogYW91dHguaCBjb25maWd1cmUqIHNob3J0ZW5lZCBhbGwgdGhlIGgvdG1ha2UteHh4eAotCXRvIGgvdC14eHh4IGZpbGVzIHNvIHRoYXQgZXZlcnl0aGluZyB3aWxsIHdvcmsgb24gU3lzdGVtIFYuCi0KLUZyaSBBdWcgMjMgMTM6NTE6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiAgQWRkIGluZm9ybWF0aW9uIG9uIGhvc3QtYW91dC5jIGFuZCBob3cgdG8gY29uZmlndXJlCi0JdG8gdXNlIGl0LCB0byB0aGUgbWFudWFsLgotCSogY29uZmlndXJlLmluOiAgVGl4IHR5cG8uCi0JKiBlY29mZi5jOiAgSWYgY29tcGlsaW5nIGZvciBERUMzMTAwLCB1c2UgdHJhZF91bml4IGNvcmUgZmlsZXMsCi0JZWxzZSBkdW1teSBvdXQgdGhlIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBJZiBIT1NUX0RBVEFfU1RBUlRfQUREUiBpcwotCXNwZWNpZmllZCwgdXNlIGl0IHRvIGxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2xzKTogIERlY2xhcmUgYnVmZmVyIGFzIGJmZF9ieXRlcwotCXJhdGhlciB0aGFuIGFzIGNoYXJzIChsaW50KS4KLQotVGh1IEF1ZyAyMiAyMjoyMDoxOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgY29mZmNvZGUuaDogIHNhYmVyaXplZC4KLQotVGh1IEF1ZyAyMiAxMToyNzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHNvbWUgY2xlYW51cCwgcmVpbmNvcnBvcmF0ZWQgbW9yZSBpbnRybyBtYXR0ZXIgZnJvbQotCWJmZC5kb2MKLQliZmQuYywgdGFyZ2V0cy5jOiBtaW5vciByZXdvcmRpbmcgb2YgZG9jIHNlZ21lbnRzCi0KLQotV2VkIEF1ZyAyMSAxOToxMzoyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgVXNlIEhPU1RfVEVYVF9TVEFSVF9BRERSLAotCWV0YywgcmF0aGVyIHRoYW4gVEVYVF9TVEFSVF9BRERSLgotCSogaG9zdC1hb3V0LmM6ICBSZW1vdmUgI2lmIDAgYXJvdW5kIHdob2xlIHRoaW5nLgotCVVwZGF0ZSB0byBtb2Rlcm4gKDMyLzY0LWJpdCkgYS5vdXQgbmFtaW5nIGNvbnZlbnRpb25zLgotCUluY2x1ZGUgYSBsYXJnZSBjaHVuayBvZiAuLi9pbmNsdWRlL2Eub3V0LmdudS5oIHRvIGdldCBtYWNyb3MgdGhhdAotCWFyZSBub3QgZGVmaW5lZCBieSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuCi0JKGhvc3RfYW91dF97MzIsNjR9X3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBVc2UgdGhlIFdSSVRFX0hFQURFUlMKLQltYWNybyB1c2VkIGJ5IHRoZSBvdGhlciBhLm91dCBpbXBsZW1lbnRhdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogIEdpdmUgZGVwZW5kZW5jaWVzIHRvIE9QVElPTkFMX0JBQ0tFTkRTLgotCi1XZWQgQXVnIDIxIDE0OjMzOjA2IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHRhcmdldHMgImJmZC5kdmkiIGFuZCAiYmZkLnBzIiBpbnN0ZWFkIG9mCi0JdGV4ZG9jIGFuZCBwc2RvYzsgbWFrZSB0aGVzZSBkZXBlbmQgb24gZ2VuZXJhdGVkIC50ZXhpJ3MKLQotCSogc2Nhbml0LCAobmV3KSB1blBST1RPOiB0dXJuIFBST1RPIG1hY3JvcyBpbnRvIEFOU0kgZGVjbGFyYXRpb25zIGluCi0JZG9jCi0KLQkqIGJmZC5jLCByZWxvYy5jLCBzeW1zLmM6IG1pbm9yIHNwZWxsaW5nL3dvcmRpbmcgZml4ZXMgaW4gZG9jCi0JcG9ydGlvbnMKLQotCSogTWFrZWZpbGUuaW4sIGF3a3NjYW4taXAsIGF3a3NjYW4tcCwgaW50b2JmZCwKLQlsaWJiZmQuaCwgbGliY29mZi5oLCB0b2xpYmNvZmY7IG5ldyBiZmQtaW4uaCwgbGliYmZkLWluLmgsCi0JbGliY29mZi1pbi5oOiAoYSkgdXNlIHNlcGFyYXRlIGZpbGVzIGZvciBpbnZhcmlhbnQgcGFydHMgb2YgYmZkLmgsCi0JbGliYmZkLmgsIGFuZCBsaWJjb2ZmLmg7IChiKSBpbiBnZW5lcmF0ZWQgcGFydHMgb2Ygc2FtZSwgdXNlIGxlc3MKLQlvYnRydXNpdmUgbWFya3MgaW5kaWNhdGluZyAuYyBvcmlnaW5zLgotCi0JKiBiZmQudGV4aW5mbzogZ2VuZXJhbGl6ZSBtb3N0IHJlZmVyZW5jZXMgdG8gbGlua2VyCi0KLVR1ZSBBdWcgMjAgMTU6MTg6MDIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmNsdWRlIGNvcmUucCBpbiBQUk9UT1MgKGJ1aWxkaW5nIGJldHRlciBiZmQuaCkKLQkqIGFyY2h1cmVzLmM6IHJlbW92ZSBlbXB0eSBmb28oKSBkZWZpbml0aW9uIChjcmVwdCBpbiBhdCB2bjEuOSkKLQotTW9uIEF1ZyAxOSAxMzo0ODoyMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHVzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24gaW5zdGVhZCBvZiBsb3RzIG9mCi0JQHBhZ2UnczsgbWlub3IgcmVwaHJhc2luZyBpbiBJbnRyb2R1Y3Rpb24uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGJmZC50ZXhpbmZvLCBjYWNoZS5jLAotCWNvZmZjb2RlLmgsIGNvcmUuYywgZm9ybWF0LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsCi0Jb2FzeXMuYywgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmMgKGRvY3VtZW50YXRpb24KLQlzZWdtZW50cyk6IHVzZWQgQkZEIChjYXBzKSBtb3JlIGNvbnNpc3RlbnRseSBhcyBhIG5hbWUgaW4KLQlkaXNjb3Vyc2UsIGZpeGVkIGEgZmV3IG90aGVyIG1pbm9yIHR5cG9zIGFuZCB1c2VzIG9mIGZvbnRzCi0KLQotVGh1IEF1ZyAgOCAxNjo0Nzo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBmaXhlZCBidWcgd2hlcmUgc3RyaW5nIHRhYmxlIHNpemUgd2Fzbid0IGJlaW5nIHN3YXBwZWQuCi0KLVRodSBBdWcgIDEgMTY6MzU6MjggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jOiBhZGRlZCBTRUNfQ09OU1RSVUNUT1JfVEVYVHxEQVRBfEJTUyBmbGFncwotCi0JKiBzeW1zLmM6IGFkZGVkIEJTRl9DT05TVFJVQ1RPUiwgQlNGX1dBUk5JTkcgYW5kIEJTRl9JTkRJUkVDVAotCWZsYWdzLiAoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgbm93IGtub3dzIHdoYXQgdG8gZG8gd2l0aCB0aGUKLQlhYm92ZSBmbGFncy4KLQotCSogYW91dHguaDogbWFkZSB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIGFuZAotCXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIHByb2R1Y2UgdGhlIGFib3ZlIGZsYWdzLgotCi0KLVdlZCBKdWwgMzEgMDk6NTM6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhbGwgZmlsZXM6ICB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMgZm9yIEdQTCB2ZXJzaW9uIDIuCi0JSW5zdGFsbCBoZWFkZXIgY29tbWVudHMgYW5kIGF0dHJpYnV0ZSBtb3N0IG1vZHVsZXMgdG8gdGhlaXIKLQlhdXRob3JzLiAgQkZEJ3MgbmFtZSBpcyBub3cgb2ZmaWNpYWxseSAiQmluYXJ5IEZpbGUgRGVzY3JpcHRvciIsCi0Jc28gcmVtb3ZlIGFueSBjb25mbGljdGluZyBwZWpvcmF0aXZlcy4KLQlhcmNodXJlcy5oOiAgQ29uc2lzdHMgc29sZWx5IG9mIGNvbW1lbnRzOyByZW1vdmUgaXQuCi0KLUZyaSBKdWwgMjYgMTg6MTE6MzQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGJmZC5jOiBNYWRlIGl0IGNvbXBpbGUgYWdhaW4uCi0KLUZyaSBKdWwgMTkgMDg6MTc6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogbmV3c29zMy5jLCB0YXJnZXRzLmMsIGNvZmZjb2RlLmg6IG5ldyBwYXRjaGVzIGZyb20gRGF2aWQgV29vZAotCi0KLU1vbiBKdWwgMTUgMTY6Mjc6NDIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggYXJjaGl2ZS5jIGJmZC5jIGNvZmZjb2RlLmggY29yZS5jIGVjb2ZmLmMgaWVlZS5jCi0JYmZkLnRleGluZm8gb2FzeXMuYyBvcG5jbHMuYyByZWxvYy5jIHNyZWMuYzogTW9yZSBkb2N1bWVudGF0aW9uIG9uCi0JbGludCBmaXhlcy4KLQotCSogYW1kY29mZi5jIGJmZC50ZXhpbmZvIE1ha2VmaWxlLmluIDogRm9sZGVkIGluIGNoYW5nZXMgZm9yIGFtZAotCTI5ayBjb2ZmIGJ5IERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgotCi1UaHUgSnVsICA0IDA5OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIEV2ZXJ5dGhpbmc6IGNyZWF0ZWQgc29tZSBuZXcgZmlsZXMsIGNvcmUuYyBmb3JtYXQuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMgYW5kIHN5bXMuYyB0byBzcGxpdCB0aGUgZnVuY3Rpb25hbGl0eSBhIGJpdCBiZXR0ZXIuCi0JQ2xlYW5lZCB1cCB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgYSBiaXQsIGFuZCBhZGRlZCBzb21lCi0JZG9jdW1lbnRhdGlvbi4KLQotCi1Nb24gSnVsICAxIDEzOjI5OjQ3IDE5OTEgIERhdmlkIFdvb2QgKHdvb2QgYXQgZGF2aWQudWx0cmEubnlhLmVkdSkKLQotCSogb3BuY2xzLmMsIC4uL2luY2x1ZGUvc3lzL2gtc3VuMy5oIC4uL2luY2x1ZGUvc3lzL2gtc3VuNC5oOiBmY250bAotCXJlYWxseSB0YWtlcyAzIGFyZ3VtZW50cywgcGF0Y2hlZCBjb2RlIGFuZCBhbW1lbmRlZCBwcm90b3R5cGVzLgotCi1GcmkgSnVuIDE0IDEzOjE5OjQwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmggKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkZWQgbmV3IGZpZWxkCi0JImFsaWduX3Bvd2VyX21pbiIgd2hpY2ggY29udGFpbnMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciBhCi0Jc2VjdGlvbi4gVGhpcyBpcyB1c2VkIGluIGNvZmZfbmV3X3NlY3Rpb25faG9vay4gVGhlIGZpZWxkCi0JaW5zZXJ0aW9uIG5lY2Vzc2l0YXRlcyBhbiB1cGRhdGUgb2YgYWxsIGJhY2tlbmRzLi4KLQotCSogYW91dGYxLmgganVtcCB0YWJsZSBmaWVsZCBpbnNlcnRlZAotCi0JKiBhcmNoaXZlLmMoc25hcmZfYXJfaGRyKShiZmRfc2x1cnBfY29mZl9hcm1hcCkgY2FuIG5vdyBwYXJzZSBkZ3V4IHN0eWxlIGV4dGVuZGVkCi0JZmlsZW5hbWVzIHRvby4KLQotCSogYm91dC5jKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKSBmaXggdG8gYXNzZXJ0aW9uIHRlc3RzLiBKdW1wCi0JdGFibGUgZmllbGQgaW5zZXJ0ZWQuCi0KLQkqIGNvZmZjb2RlLmgoanVzdCBhYm91dCBldmVyeXRoaW5nKSBOb3cgcGF0Y2hlcyB1cCBzeW1ib2wgdGFibGVzCi0JdXNpbmcgYSBkaWZmZXJlbnQgbWVjaGFuaXNtLiBUaGUgSW50ZWwgbWFqb3IgYnVnIGhhcyBiZWVuIGZpeGVkLAotCWFuZCB0aGUgbGlua2VyIGNhbiBzZWxmIGhvc3Qgb24gdGhlIEF2aWlvbiBhbmQgYmUgZGVidWdnZWQgd2l0aAotCWdkYi4KLQotCSogZWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIGkzODZjb2ZmLmM6IG5ldwotCWluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsICBpY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZQotCXBhdGNoLCBpZWVlLmM6IGNhbiBub3cgcmVhZCBhcmNoaXZlcyBjb250YWluaW5nIGllZWUgbW9kdWxlcy4sCi0JbGliY29mZi5oOiBhZGRlZCAoY29tYmluZWRfZW50cnlfdHlwZSksIGxpYmllZWUuaDogdXBlZCBtYXgKLQlzZWN0aW9ucyB0byAyMCwgbTY4a2NvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsCi0JbTg4a2Jjcy5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgb2FzeXMuYzogdmFyaW91cyBidWdzCi0JZml4ZWQuIG9wbmNscy5jOiBhZGRlZCBiZmRfYWxsb2NfZ3JvdyBhbmQgYmZkX2FsbG9jX2ZpbmlzaC4KLQlzcmVjLmM6IGp1bXAgdGFibGUgcGF0Y2guIHRyYWQtY29kZS5jIGZpeGVkICNJRiB0eXBlbwotCi1GcmkgSnVuICA3IDEyOjM1OjQ2IDE5OTEgIFNlYW4gRmFnYW4gIChzZWYgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLSAJKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkZWQgZWxzZSBjYXNlIHRvIGRlYWwgd2l0aAotIAlmaWxlbmFtZXMgbGVzcyB0aGFuIDkgY2hhcmFjdGVycy4KLQotCi1UaHUgSnVuICA2IDE4OjI3OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvb2FzeXMuaCBvYXN5cy5jIChvYXN5c19hcmNoaXZlX3ApOiBmaXhlZCBzbyBpdCB3b3JrcwotCi0JKiBzcmVjLmM6IG5vdyBhbGxvd3MgYW55IG51bWJlciBvZiBzZWN0aW9ucyB0byBiZSBjcmVhdGVkIGluIGEKLQlmaWxlLiBPdXRwdXRzIGFkZHJlc3NlcyBvZiB0aGUgcmlnaHQgbGVuZ3RoLgotCi1UaHUgTWF5IDMwIDE1OjMwOjEwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfY2hlY2tfZm9ybWF0KTogRml4ZWQgcHJvYmxlbSB3aGVyZSB3aGVuIGEgZGVmYXVsdGVkCi0JdGFyZ2V0IGRpZG4ndCBtYXRjaCwgdGhlIGZvcm1hdCBnb3Qgc2V0IHRvIHRoZSBhdHRlbXB0ZWQgbWF0Y2gsCi0JYnJlYWtpbmcgYSBmdXR1cmUgdGVzdC4KLQotICAgICAgICAqLi4vaW5jbHVkZS9pMzg2Y29mZi5oIDogZml4ZWQgdHlwbyBpbiB0eXBlIGZpZWxkIHdpdGggc2l6ZQotCi0JKiBpMzg2Y29mZi5jIGljb2ZmLmMgbTg4ay1iY3MuYyBlY29mZi5jIC4uL2luY2x1ZGUvYmZkLmggOiBBZGRlZAotCXN1cHBvcnQgaW4gdGhlIGp1bXAgdGFibGUgZm9yIHRoZSBzd2FwcGluZyByb3V0aW5lcyBleHBvcnRlZCB0bwotCWdkYi4gTm93IGdkYiB3b3JrcyB3aXRoIHRoZSAzODYuCi0KLVR1ZSBNYXkgMjggMTc6MjE6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gZ2RiLTMuOTUgcmVsZWFzZS4KLQlNYWtlZmlsZS5pbjogIEFsbG93IGhtYWtlIGFuZCB0bWFrZSBmaWxlcyB0byBhZGQgT0ZJTEVTLgotCWFvdXRmMS5oOgotCWJmZC5jOiAgc3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLiAgV2hlbgotCXNlYXJjaGluZywgdGFrZSBkZWZhdWx0IHRhcmdldCBpbiBwcmVmZXJlbmNlIHRvIG90aGVycy4KLQliZmQuZG9jOiAgdHlwb3MKLQlpZWVlLmMsIG9hc3lzLmM6ICBBdm9pZCB1c2luZyB0aGUgInRkYXRhIiBtYWNyb3MgbGVmdCBvZiBhc3NpZ25tZW50LgotCWxpYmEub3V0Lmg6ICBEb24ndCBoYXJkLWNvZGUgZmlsZSBvZmZzZXRzOyB1c2UgTl8gbWFjcm9zIGZvciB0aGVtLgotCWxpYmJmZC5oOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCW9wbmNscy5jOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCXRhcmdldHMuYzogIFNlYXJjaCBpcyBzaG9ydC1jaXJjdWl0ZWQgaWYgZGVmYXVsdCB0YXJnZXQgbWF0Y2hlcy4KLQlsaWJvYXN5cy5jLCBsaWJpZWVlLmM6ICBVbmRvIGJvdGhuZXIgY2hhbmdlcyB0aGF0IG1ha2UgbWFjcm9zCi0Jd29yayB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50LCBidXQgd2hpY2ggZGVwZW5kIG9uIHRoZQotCXJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgcG9pbnRlciB0eXBlcyBiZWluZyB0aGUgc2FtZS4KLQotRnJpIE1heSAyNCAxODo1Njo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpMzg2Y29mZi5jOiBjcmVhdGVkLgotCSogY29mZmNvZGUuaDogYWRkZWQgc3VwcG9ydCBmb3IgMzg2LgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KLQkqIC4uL2luY2x1ZGUvaTM4NmNvZmYuaDogY3JlYXRlZAotCi1XZWQgTWF5IDIyIDA3OjI2OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IHJlbW92ZWQgYWxsIHB1dF94XzxzaXplcz4KLQkqIGxpYmJmZC5jOiBDaGFuZ2VkICNpZmRlZiBfX0dOVUNfXyB0byAjaWZkZWYgSE9TVF82NF9CSVQsIEFkZGVkCi0JREVGVU5TCi0KLQotVHVlIE1heSAyMSAwODo1ODo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCShib3RobmVyKQotCSogb3BuY2xzLmM6IENoYW5nZWQgb2JzdGFja19jaHVua19hbGxvYyB1c2UgeG1hbGxvYwotCi1Nb24gTWF5IDIwIDE3OjEyOjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGV2ZXJ5dGhpbmc6IFJlbW92ZWQgc3lzZGVwLmggZnJvbSBiZmQuaCBhbmQgcHV0IGJhY2sgaW50byBmaWxlcwotCWZyb20gd2hpY2ggaXQgd2FzIHNwbGl0IG91dC4gTm93IDY0IGJpdCB2ZXJzaW9uIGlzIGJ1aWx0IHdpdGggYQotCS1ESE9TVF82NF9CSVQ9ImxvbmcgbG9uZyIgb24gdGhlIGNvbXBpbGUgbGluZS4KLQotRnJpIE1heSAxNyAxOTozNToyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQ2hhbmdlZCBhbGwgdGhlIFtnZXR8cHV0XVtuYW1lXSByb3V0aW5lcyB0byB1c2UgIFtnZXR8cHV0XV9bc2l6ZQotCWluIGJ5dGVzXS4KLQotCVB1dCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgd29yay4gTm93IHR3byB2ZXJzaW9ucyBvZiBiZmQgbWF5IGJlCi0JZ2VuZXJhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIFRBUkdFVF82NF9CSVQsIG9uZSB3aGljaCBpcwotCTMyIGJpdCBvbmx5LCBhbmQgb25lIHdoaWNoIGlzIDY0LzMyIGJpdHMuCi0JQ3JlYXRlZCBuZXcgYmFjayBlbmQgJ2RlbW82NCcgdG8gdGVzdCA2NCBiaXQgZnVuY3Rpb25hbGl0eS4KLQotCVJlbmFtZWQgc29tZSBmaWxlcyB0byB3b3JrIG9uIERPUy4KLQotCSogYXJjaGl2ZS5jOiBsaW50ICogYmZkLmM6IHByb3RvdHlwZXMgYW5kIGxpbnQuICogZWNvZmYuYzogYWRkZWQKLQk2NGJpdCB0cmFuc2ZlciAJKiBpY29mZi5jOiBhZGRlZCA2NGJpdCB0cmFuc2ZlciAqIGllZWUuYzogbmFtZQotCWNoYWdlLCA2NCBiaXQgdHJhbnNmZXIuICogbGliYS5vdXQuaDogU3BsaXQgb3V0IGNvbW1vbiBjb2RlIGZyb20KLQlzdW5vcyBhbmQgbmV3c29zIGludG8gbGliYS5vdXQuIE5hbWUgY2hhbmdlcyBhbmQgcHJvdG90eXBlIG1vZHMuICoKLQlsaWJiZmQuYzogbGludCBhbmQgcHJvdG90eXBlcywgZXh0cmEgNjRiaXQgc3dhcHMuICogbGliYmZkLmg6Ci0JcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4gKiBsaWJjb2ZmLmg6IGxpbnQgKiBsaWJpZWVlLmg6IG1ha2UKLQl3b3JrIG9uIERPUyAqIGxpYm9hc3lzLmg6IG1ha2Ugd29yayBvbiBET1MgKiBtODhrLWJjcy5jOiBOYW1lCi0JY2hhbmdlIGFuZCA2NGJpdCBzdHVmZi4qIG5ld3NvczMuYzogY29tbW9uIGNvZGUgcmVtb3ZlZCwgbmV3IGp1bXAKLQl0YWJsZS4gKiBvYXN5cy5jOiBOYW1lIGNoYW5nZSAqIG9wbmNscy5jOiBQb3J0YWJpbGl0eSBmaXhlcyAqCi0Jc3JlYy5jOiBOYW1lIGNoYW5nZXMgKiBzdW5vcy5jOiBSZW1vdmVkIGNvbW9uIGNvZGUuICogdGFyZ2V0cy5jOgotCUFkZGVkIGRlbW8gKiBhb3V0MzIsIGFvdXQ2NC5jIGluY2x1ZGUgIGFvdXR4LmggKiBib3V0LmM6IHVzZWQgdG8KLQliZSBjYWxsZWQgYi5vdXQuYyAqIGNvZmZjb2RlLmg6IHVzZWQgdG8gYmUgY2FsbGVkIGNvZmYtY29kZS5oLCBub3cKLQk2NGJpdCBpemVkLiAqIGRlbW82NC5jOiA2NCBiaXQgYS5vdXQgYmFjayBlbmQKLQotVGh1IE1heSAxNiAxNjowMjowNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCWZyb20gYm90aG5lcgotIAkqIGxpYmllZWUuaDogTWFrZSBpZWVlX2RhdGEgYW5kIGllZWVfYXJfZGF0YSBtYWNyb3MgdXNhYmxlCi0Jb24gTEhTIG9mIGFzc2lnbm1lbnQsIGV2ZW4gd2hlbiB1c2luZyBvbGQgY29tcGlsZXJzLgotCSogbGlib2FzeXMuaDogRGl0dG8gZm9yIG9hc3lzX2RhdGEgYW5kIG9hc3lzX2FyX2RhdGEuCi0JKiBtNjhrY29mZi5jOiBBZGQgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgotCSogbmV3c29zMy5jOiBGaXggZGVmaW5pdGlvbnMgb2YgU0VHTUVOVF9TSVpFIGFuZCBURVhUX1NUQVJUX0FERFIuCi0JKiBvcG5jbHMuYzogRGVmaW5lIFNfSVhVU1IsIFNfSVhHUlAsIFNfSVhPVEggaWYgdW5kZWZpbmVkLgotCSogdGFyZ2V0cy5jOiBBZGQgZGVjbGFyYXRpb24gb2YgbmV3c29zM192ZWMuCi0KLU1vbiBNYXkgMTMgMTA6MDM6MjkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dC5jOiBmaXh4ZWQgc29tZSBvZiB0aGUgcHJvYmxlbXMgd2l0aCBmaWxlcG9zIGNhbGN1bGF0aW9uLgotCShzd2FwX2V4dF9yZWxvYyk6IGZpeGVkIHByb2JsZW0gd2l0aCBjcmVhdGlvbiBvZiByZWxvY3MuCi0JKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBmaXhlZCBmaWxlcG9zIHByb2JsZW0KLQotCSogY29mZi1jb2RlLmg6IChzd2FwX2ZpbGVoZHJfaW4sIHN3YXBfZmlsZWhkcl9vdXQpIGFkZC4KLQkoc3dhcF9maWxlaGRyKSBkZWxldGUuIENoYW5nZWQgYWxsIHRoZSB1c2FnZSBvZiBiZmRfaF9wdXRfeC4KLQkoc3dhcF9hb3V0aGRyX2luLCBzd2FwX2FvdXRoZHJfb3V0KSBhZGQuIChzd2FwX2FvdXRoZHIpIGRlbGV0ZS4KLQkoY29mZl9yZWFsX29iamVjdF9wKSBjbGVhbmVkIHVwLCBhZGRlZCBNSVBTLiAoY29mZl9vYmplY3RfcCkKLQljbGVhbmVkIHVwLiAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpIGNsZWFuZWQgdXAuCi0KLQkqIGVjb2ZmLmM6IFRvdGFsbHkgZGlmZmVyZW50LiBOb3cgc3VwcG9ydHMgZWNvZmYgZnVsbHkuCi0KLQkqIGljb2ZmLmM6IGZpeGVkIHByb2JsZW1zIGluIHJlbG9jYXRpb24gY2FsbG91dC4KLQotCSogbGliY29mZi5oOiAoc3RydWN0IGljb2ZkYXRhKSByZW1vdmVkIGhkciBzdHJ1Y3R1cmUgZnJvbSB0ZGF0YS4KLQotCSogbTY4a2NvZmYuYzogdXBkYXRlZCB0YXJnZXQgdmVjdG9yLgotCi0JKiBzdW5vcy5jOiAoY2hvb3NlX3JlbG9jX3NpemUpIGFkZGVkOiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscwotCWNob29zZV9yZWxvY19zaXplLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykgbm93IGNhbGxzCi0JY2hvb3NlX3JlbG9jX3NpemUgc28gb3V0cHV0cyByZWxvY3MgY29ycmVjdGx5LCBhbHNvIGNhbGN1bGF0ZXMgdGhlCi0Jc2l6ZSBvZiB0aGUgc2VjdGlvbnMgY29ycmVjdGx5LgotCi0KLQotRnJpIE1heSAxMCAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlNZXJnZSBQZXIgQm90aG5lcidzIGNoYW5nZXMgdG8gbW9kdWxhcml6ZSBCRkQgYS5vdXQgYSBiaXQuCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiAgQWRkLgotCSogaWVlZS5jOiAgQ2FzdCBlbnVtcyB0byBpbnQgYmVmb3JlIGNvbXBhcmluZyB0aGVtLCBmb3IgYnJhaW4tCi0JZGVhZCBjb21waWxlcnMuCi0JKiBjb2ZmLWNvZGUuaDogIFJlbW92ZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdXNlIHRoZQotCWdlbmVyaWMgb25lIGluc3RlYWQuCi0KLQkqIGFvdXQuYzogIERlcml2ZSBuZXcgbW9kdWxlIGZyb20gc3Vub3MuYywgY29udGFpbmluZyBnZW5lcmljCi0Jc3VwcG9ydCBjb2RlIGZvciBhbGwga2luZHMgb2YgYS5vdXQgZmlsZXMuCi0KLQkqIHN1bm9zLmM6IFJlbW92ZSBhbGwgY29kZSB0aGF0IGdvZXMgaW4gYW91dC5jLiAgU3BsaXQgb3V0Ci0JbWFjaGluZSBkZXBlbmRlbnQgZm9sbG93dXAgaW4gc3Vub3M0X29iamVjdF9wIGludG8KLQlzdW5vczRfY2FsbGJhY2suICBVc2UgSlVNUF9UQUJMRShhb3V0KSBmb3IgdGhlIHRyYW5zdmVyIHZlY3RvciwKLQlhbmQgcmVkZWZpbmUgb25seSB0aGUgbmFtZXMgd2UgQ0hBTkdFLCBub3QgYWxsIHRoZSBuYW1lcy4gIERyb3AKLQl0aGUgbGl0dGxlLWVuZGlhbiB2ZWN0b3IsIGFuZCByZW5hbWUgdGhlIHZlY3RvciBhcyBzdW5vczQgcmF0aGVyCi0JdGhhbiBnZW5lcmljLgotCi0JKiBiLm91dC5jOiAgVXNlIGFvdXQuYyByb3V0aW5lcyBmb3IgbW9zdCBvZiB0aGUgd29yay4gIFNsaWdodAotCWNoYW5nZXMgZm9yIHRoZSBuZXcgcmVnaW1lLiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwIGFuZAotCWdldF9zZWN0aW9uX2NvbnRlbnRzIGluIGZhdm9yIG9mIGdlbmVyaWNzLiAgTmV3IHRyYW5zZmVyIHZlY3RvcgotCXJlZ2ltZS4KLQotCSogbmV3c29zLmM6ICBOZXcgc3VwcG9ydCBmb3IgU29ueSBORVdTLCBhbm90aGVyIGEub3V0IGZvcm1hdC4KLQotCSogZWNvZmYuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cC4gIE5ldyB0dmVjIHJlZ2ltZS4KLQkqIGljb2ZmLmMsIG04OGstYmNzLmM6ICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIGllZWUuYywgb2FzeXMuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCwgYWRkIHdyaXRlX2NvbnRlbnRzCi0JdG8gdHZlYy4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiAgQ2FsbCBmb3JtYXQtZGVwZW5kZW50IHdyaXRlX2NvbnRlbnRzCi0Jcm91dGluZSwgaWYgd3JpdGluZywgYmVmb3JlIGNhbGxpbmcgdGFyZ2V0LWRlcGVuZGVudAotCWNsb3NlX2FuZF9jbGVhbnVwIHJvdXRpbmUgKHdoaWNoIGlzIG5vdyBhbHdheXMgZ2VuZXJpYywgSSB0aGluaykuCi0JKiBzcmVjLmM6ICBVc2UgYmZkX2FsbG9jIGluc3RlYWQgb2YgbWFsbG9jLiAgUmVtb3ZlCi0JY2xvc2VfYW5kX2NsZWFudXAgYW5kIG1vdmUgY29kZSBmcm9tIGl0IHRvCi0Jc3JlY193cml0ZV9vYmplY3RfY29udGVudHMuICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIHRhcmdldHMuYzogIFJlbW92ZSBhLm91dCBsaXR0bGUgdmVjdG9yLCByZXBsYWNlIGEub3V0IGJpZwotCXZlY3RvciB3aXRoIFN1bk9TIHZlY3Rvci4gIEZJWE1FOiAgTmVlZCBWYXggc3VwcG9ydCBhZ2FpbiBub3cuCi0KLQkqIGxpYmJmZC5oOiAgQWRkIHdyaXRlX2NvbnRlbnRzIGZvcm1hdC1kZXBlbmRlbnQtdmVjdG9yIHRvIHRoZQotCWJmZF90YXJnZXQgdmVjdG9yLiAgU3VwcGx5IGEgZ2VuZXJpYyBjbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lLgotCSogbGliYS5vdXQuaDogIEhhbmRsZSB0aGUgbmV3IGFvdXQuYyBzcGxpdC4gIEFkZCBwcm90b3R5cGVzIGZvcgotCWFsbCByb3V0aW5lcyBkZWZpbmVkIGluIGFvdXQuYy4gIFJlbmFtZSAic3Vub3MiIHRoaW5ncyB0byAiYW91dCIKLQl0aGluZ3MuICBBZGQgYSBmZXcgZmllbGRzIHdoZXJlIG5lZWRlZCBmb3IgdmFyaW91cyBmb3JtYXRzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgYW91dC5jIGFuZCBuZXdzb3MuYy4KLQotCSogYXJjaGl2ZS5jLCBpZWVlLmMsIG9hc3lzLmM6ICBMaW50LgotCi1GcmkgTWF5IDEwIDEyOjM0OjQ4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmgKLQljaGFuZ2VkIGZvcndhcmQgZGVjbGFyYXRpb24gc3RydWN0IHN0YXQ7IHRvIHJlZHVjZSB3YXJuaW5ncy4gQ2hhbmdlZAotCWNvbW1lbnQgb24gYmZkX2hfPHg+X3guCi0KLQkqIC4uL2luY2x1ZGUvbTY4a2NvZmYuaCwgLi4vaW5jbHVkZS9pbnRlbC1jb2ZmLmgsCi0JLi4vaW5jbHVkZS9tODhrLWJjcy5oCi0JTm93IHRoZXJlIGFyZSB0d28gaW5jYXJuYXRpb25zIG9mIHJlbG9jcywgbGluZW5vcyBhbmQgc3ltZW50cy4gT25lIGZvcgotCWludGVybmFsIGRpZ2VzdGlvbiwgYW5kIG9uZSBmdWxsIG9mIGNoYXIgYXJyYXlzIGZvciBJL08uIFRoZSBvcmlnaW5hbAotCW5hbWVzIGhhdmUgZ29uZSB0byBkZXRlY3QgZXJyb3JzLgotCi0JKiBNYWtlZmlsZS5pbiwgbTY4a2NvZmYuYywgdGFyZ2V0cy5jCi0JVGVzdCBuZXcgc3RydWN0dXJlIGNvZGUgd2l0aCBhIDY4ayBjb2ZmIGltcGxlbWVudGFpb24KLQotCSogY29mZi1jb2RlLmgsIGljb2ZmLmMsIGNvZmZzd2FwLmMsIGxpYmNvZmYuaAotCUZpeGVkIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCB0aGUgc2l6ZSBhbmQKLQlhbGlnbm1lbnRzIG9mIHN0cnVjdHVyZXMgb24gZGlzayBhbmQgc3RydWN0dXJlcyBpbiBtZW1vcnkuICNpZmVkIG91dAotCWFsbCB0aGUgY29kZSBpbiBjb2Zmc3dhcC5jLCBzaW5jZSBpdCBzaG91bGQgYmUgZG9uZSB1c2luZyB0aGUgdGFyZ2V0Ci0Jc3dhcCByb3V0aW5lcyBub3cuCi0KLVRodSBNYXkgIDkgMTE6MDA6NDUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChkb19vbmUsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogbm93IHN1cHBvcnRzIHRoZSBsb2FkCi0JbXVsdGlwbGUgcmVsb2MgY29tbWFuZC4KLQotCSogc3Vub3MuYyAoc3Vub3M0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTWFkZSBpdCBzbyB0aGF0IHNlY3Rpb25zCi0JYXJlIGFsd2F5cyBwYWRkZWQgdG8gdGhlaXIgYWxpZ25tZW50IHNpemUuCi0KLVNhdCBNYXkgIDQgMTU6NDk6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIGJmZC5jLCBjb2ZmLWNvZGUuaCwgb3BuY2xzLmMsIHN1bm9zLmMsIHRyYWQtY29yZS5jOgotCUNsZWFuIHVwIHR5cGVzIGFuZCBzdWNoIChzYWJlciBDIHByb2JsZW1zKS4KLQkqIGVjb2ZmLmM6ICBDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaC4gIFJlbW92ZSByb3V0aW5lcyB0aGF0IGFyZQotCW5vdCB1c2VkLiAgRml4IHVwIHJlYWRpbmcgYW5kIHN3YXBwaW5nIG9mIHNob3J0cyBmcm9tIGZpbGVzLgotCi0gICBOb3RlcyBvbiBiZmQtMC41LjItcGF0Y2gxYSwgZnJvbSBQZXIgQm90aG5lcjoKLQotCSogYS5vdXQudmF4LmM6IFJlbW92ZSB0d28gYm9ndXMgInN0YXRpYyIgZnJvbSBwcm90b3R5cGVzLgotCi0JKiBlY29mZi5jOiBHb3QgcmlkIG9mIGxvdHMgb2Ygbm9uLXdvcmtpbmcganVuayAodGhhdCBoYWQKLQliZWVuIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvZmYtY29kZS5oKS4KLQlVcGRhdGVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB1cGRhdGVzIHRvIGljb2ZmLmMgYW5kIGNvZmYtY29kZS5oLgotCi0JKiBsaWJiZmQuaDogQWRkZWQgZGVmaW5pdGlvbnMgZm9yIFNfSVhVU1IsIFNfSVhHUlAsIGFuZCBTX0lYT1RICi0JaWYgdGhleSdyZSBtaXNzaW5nIChhcyB0aGV5IGFyZSBpbiAoQkRTLTQuMy1iYXNlZCkgTmV3c09TLTMpLgotCi0JKiBzdW5vcy5jIChuX3R4dG9mZik6IChSZS0pQWRkIHN1cHBvcnQgZm9yIHNvbnkuIFRoaXMgaXMgYSBrbHVkZ2UsCi0JYnV0IHVudGlsIHRoZSB0YXJnZXRfdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLAotCWl0J3MgYXMgZ29vZCBhcyBhbnkuIE5vdGUgdGhhdCB0aGUgdGV4dCBvZmZzZXQgaXMgdGhlIG9ubHkKLQlkaWZmZXJlbmNlIGJldHdlZW4gTmV3c09TIGFuZCBTdW5PcyAoaW5jbHVkaW5nIG1hZ2ljIG51bWJlcnMpLgotCShNb3N0IG9mIHRoZSBzdW5vc18qIHJvdXRpbmVzIHNob3VsZCB0byByZW5hbWVkIGJzZF8qCi0JYW5kIG1vdmUgdG8gYSBic2QuYyBmaWxlLiBUaGVuIChhbmQgd2hlbiB0aGUgdGFyZ2V0X3ZlY3RvcgotCWlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkKSBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGNyZWF0ZQotCWEgc2VwYXJhdGUgU29ueSB0YXJnZXQuKQotCi0JKiBzeXNkZXAuaDogRG9uJ3QgZGVjbGFyZSBmcmVhZCBhbmQgZndyaXRlLiBDYXVzZXMgdHJvdWJsZQotCW9uIHNvbWUgc3lzdGVtcywgYW5kIGRvZXNuJ3QgaGVscCBvbiBvdGhlcnMuCi0JU2ltaWxhcmx5LCBvbmx5IGRlZmluZSBYX09LIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIHN5cy9zdGF0LmggLSBhdCBsZWFzdAotCW9uIE5ld3NPUyAzLCBpdCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLgotCi1UdWUgTWFyICA1IDAxOjQ3OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZi1jb2RlLmggKGJmZF9jb2ZmX3N3YXBfc3ltLCBiZmRfY29mZl9zd2FwX2F1eCwKLQliZmRfY29mZl9zd2FwX2xpbmVubyk6ICBFeHBvcnQgdGhlIHJvdXRpbmVzIHRoYXQgYnl0ZS1zd2FwIENPRkYKLQlzeW1ib2wgdGFibGVzIGlmIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlbSBpbiwgc28gZ2RiIGNhbiB1c2UKLQl0aGVtLiAgQWRkICJiZmRfY29mZl8iIHRvIHRoZSBuYW1lcyBzbyB0aGV5IHdvbid0IGNvbmZsaWN0IHdpdGgKLQluYW1lcyBpbiBjYWxsaW5nIHByb2dyYW1zLiAgRklYTUUtc29vbjogIGlmIGNvZmYtY29kZS5oIGlzCi0JaW5jbHVkZWQgaW4gdHdvIEJGRCBtb2R1bGVzLCB0aGlzIHdpbGwgY2F1c2UgZHVwbGljYXRlCi0JZGVmaW5pdGlvbnM7IHRoZSByb3V0aW5lcyBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gYSBzZXBhcmF0ZSwKLQljb21tb24sIG1vZHVsZSAocHJvYmFibHkgYWxvbmcgd2l0aCBhIG1lc3Mgb2Ygb3RoZXIgb25lcykuCi0KLVNhdCBNYXIgIDIgMTI6MTE6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JSW1wcm92ZSBtb2R0aW1lIHN1cHBvcnQuCi0KLQkqIGJmZC5oOiAgQWRkIGJvb2xlYW4gbXRpbWVfc2V0LCBhbmQgZGVjbGFyZSBiZmRfZ2V0X210aW1lLgotCVJlbW92ZSAjZGVmaW5lIGZvciBiZmRfZ2V0X210aW1lLiAgUmVtb3ZlIGdyYXR1aXRvdXMgY29tbWVudC4KLQkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIE5ldyBmbiwgY2FjaGVzIG10aW1lLCBnZXRzIGlmIG5vdCBjYWNoZWQuCi0JQlVHOiAgYXJjaGl2ZSBtZW1iZXJzIHN0aWxsIGRvIG5vdCBnZXQgY29ycmVjdCBtb2QgdGltZXMuCi0KLQlJbXByb3ZlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMuCi0KLQkqIHN1bm9zLmMgKHN0cnVjdCBjb3JlKTogIENoYW5nZSB2b2lkICpmcGFfZHVtbXkgdG8gZG91YmxlIGZwX3N0dWZmLgotCShzdW5vczRfY29yZV9maWxlX3ApOiAgQ3JlYXRlIGEgc2Vjb25kIHJlZ2lzdGVycyBzZWN0aW9uIGluIHRoZQotCWNvcmUgZmlsZSwgY2FsbGVkICIucmVnMiIsIGZvciB0aGUgZmxvYXQgcmVnaXN0ZXJzLgotCi1UaHUgRmViIDE0IDE1OjQ5OjA2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBtYW55IGNoYW5nZXMgdG8gaW1wcm92ZSBhcmNoaXZlIGhhbmRsaW5nOyBmb3VuZCBhIGxvZ2ljIGZsYXcgaW4KLQkgIGJmZF9jaGVja19mb3JtYXQgd2hpY2ggb25seSBqdXN0IGhhcHBlbmVkIHRvIHdvcmsgYnkgY29vbmNpZGVuY2UuCi0KLVRodSBGZWIgMTQgMDc6NTM6MTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBmaXhlZCB0byB1c2Ugb3V0cHV0X29mZnNldHMKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5oOiBjaGFuZ2VkIHR5cGUgb2YgdWRhdGEgaW4gYXN5bWJvbCB0byB2b2lkICosIGxpa2UgaXQKLQlzaG91bGQgYmUuIEFkZGVkIGJmZF9yZWxvY19kYW5nZXJvdXMgZW51bSBtZW1iZXIuCi0KLQkqIGNvZmYtY29kZS5oOiBGaXhlZCBpdCBzbyB0aGF0IGludGVybmFsbHkgZ2VuZXJhdGVkIHN5bWJvbHMgZ2V0Ci0JdGhlaXIgdmFsdWVzIHJlbG9jYXRlZCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBSZW1vdmVkIGNhbGxzIHRvCi0JeG1hbGxvYy4KLQotCSogaWNvZmYuYzogTm90IHVuZGVyc3RhbmRpbmcgdGhlIGRlc3RpbmF0aW9uIHN5bWJvbCBvZiBhIHJlbG9jIGlzCi0Jbm90IGEgZmFpbHVyZSBhbnkgbW9yZSwganVzdCAnZGFuZ2Vyb3VzJy4gVGhpcyBhbGxvd3MgbGlua2luZyBvZgotCWIub3V0IGFuZCBjb2ZmIGltYWdlcy4KLQotCSogc3Vub3MuYzogQ2xlYW5lZCB1cCB0aGUgd2F5IHRoYXQgWk1BR0lDIHNlY3Rpb24gc2l6ZXMgYXJlCi0JY2FsY3VsYXRlZC4KLQotCi1UdWUgRmViIDEyIDEzOjI1OjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHN1bm9zLmMgKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogZml4ZWQKLQlzeW1fcG9pbnRlci0+bl92YWx1ZSBzbyB0aGF0IHN5bWJvbHMgb24gdGhlIHdheSBvdXQgZ2V0IHRoZWlyCi0Jc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkuCi0KLQkqIGNvZmYtY29kZS5oIChtYW5nbGVfc3ltYm9scyk6IGZpeGVkIHByb2JsZW0gd2hlcmUgdGFncyB3ZXJlIG5vdAotCWJlaW5nIHJlbG9jYXRlZCBmb3Igc3RydWN0cywgZW51bXMsIHVuaW9ucy4gQWxzbyB2YXJpb3VzIGxpbnRzLgotCi1Nb24gRmViIDExIDE5OjUyOjI2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcyk6IHN5c3RlbV9jYWxsX2Vycm9yIHJldHVybmVkCi0JICBpbmNvcnJlY3RseS4KLQotU3VuIEZlYiAxMCAyMzoxODo0MCAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogUmVzb2x2ZSB0aGUgdXNlIG9mIG5vX2Vycm9yIGFuZCBzeXN0ZW1fY2FsbF9lcnJvci4KLQkgIFRoZSBiZmQgbGlicmFyeSBpdHNlbGYgbm93IHdpbGwgbmV2ZXIgc2V0IGJmZF9lcnJvciB0bwotCSAgbm9fZXJyb3IuCi0KLQkgIFRoZSBjb2RlIHN0aWxsIG5lZWRzIHRvIGJlIGNvbWJlZCB0byBtYWtlIHN1cmUgYWxsIHRoZSBlcnJvcgotCSAgY29kZXMgYXJlIGNvcnJlY3QuICBJIHN1c3BlY3QgdGhleSBhcmUgbm90IGFsd2F5cyBzZXQgY29ycmVjdGx5LgotCi0JKiBUaGUgbmFtZXMgb2YgYWxsIHRoZSBtZXNzYWdlcyBoYXZlIF8gcHJlcGVuZGVkIGJlY2F1c2UgdGhlIHN1bgotCSAgYnVuZGxlZCBjb21waWxlciBjYW4ndCBkaXN0aW5ndWlzaCBmcm9tIGEgbWFjcm8gd2hpY2ggdGFrZXMgYW4KLQkgIGFyZ3VtZW50IGFuZCB0aGUgc2FtZSBpZGVudGlmaWVyIGluIGEgbm9uLW1hY3JvIGNvbnRleHQuCi0KLQkqIFRoZSByZWFzb24gZm9yIHRoZSBhYm92ZSBiZWluZyB0aGF0IGVudHJ5IHBvaW50cyB3aGljaCB1c2VkIHRvCi0JICBiZSB0cmFtcG9saW5lIGZ1bmN0aW9ucyBhcmUgbm93IGp1c3QgbWFjcm9zIHdoaWNoIGV4cGFuZCB0byBhCi0JICBkaXJlY3QgY2FsbCB0aHJvdWdoIHRoZSBiZmQncyB4ZmVyIHZlY3Rvci4KLQotCSogKC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oKSBGX0FSMzJXUjogZml4IHRoaXMgY29uc3RhbnQuICBXaHkKLQkgIG11c3QgZ2FzIGhhdmUgaXRzIG93biB2ZXJzaW9uIG9mIGV2ZXJ5dGhpbmcgKHRoZSBnYXMgdmVyc2lvbgotCSAgaGFkIHRoZSBjb3JyZWN0IHZhbHVlKQotCi1UdWUgRmViICA1IDExOjQ2OjUzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGIub3V0LmM6IEFkZGVkIHBhdGNoZXMgc3VwcGxpZWQgYnkgY2hyaXNiQG1pcG9uMi5pbnRlbC5jb20gdG8KLQlwcm9wZXJseSBzdXBwb3J0IGk5NjAgYXJjaGl0ZWN0dXJlIGFuZCBvdXRwdXQgY29ycmVjdCByZWxvYyBzdHVmZi4KLQotCSogYmZkLmg6IGFkZGVkIHByb3RvdHlwZSBmb3IgYmZkX3ByaW50YWJsZV9hcmNoX21hY2gsIGFkZGVkCi0JQkZEX0ZBSUwKLQotCSogY29mZi1jb2RlLmg6IEFwcGxpZWQgcGF0Y2hlcyBmcm9tIGNocmlzYiB0byBzdXBwb3J0IGk5NjAKLQlhcmNoaXRlY3R1cmUsIHplcm8gcmVsb2NzIGFuZCBzd2FwIHRoZW0gY29ycmVjbHkgYW5kIGNvbmRpdGlvbmFsbHkKLQljb21waWxlZCB0aGUgdGltZXN0YW1wLgotCi0JKiBzdW5vcy5jOiBNYWRlIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IDJeMyBzbyB0aGF0IGRvdWJsZXMKLQlhcmUgZG9uZSBwcm9wZXJseS4gRml4ZWQgdGhlIHNhbWUgcmVsb2MgYnVnIHRoYXQgd2FzIGluIGIub3V0LmMKLQotCSogc3lzZGVwLmg6IE5vdyBjb21waWxlcyBvbiBhIFBvc2l4IGJveAotCi1XZWQgSmFuIDMwIDIxOjM2OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWNvZmYuYzogIEZpeCBjb21tZW50IG9uIGJpZy1lbmRpYW4gdmVyc2lvbi4KLQkqIGNvZmYtY29kZS5oOiAgTWFrZSBIQVNfUkVMT0MgcmVhbGx5IHdvcmsgKGl0J3MgYmFja3dhcmRzIGZyb20KLQlGX1JFTEZMRykuICBTZXQgRl9BUjMyV1IgaW4gb3V0cHV0IGZpbGVzIGlmIGxpdHRsZSBlbmRpYW4KLQlhcmNoaXRlY3R1cmUuCi0KLVR1ZSBKYW4gMjkgMjA6NTY6MTAgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNodXJlcy5jIGZpeGVkID0vPT0gdHlwbwotCi0JKiBzdW5vcy5jIGFkZGVkIGFyY2hpdGVjdHVyZSBzdHVmZiBmb3Igb3V0cHV0LiBGaXhlZAotCWJ1ZyB3aGVyZSBmaWxlcyB3aGVyZSB2bWEoZGF0YSkgIT0gc2l6ZSh0ZXh0KQotCXdlcmUgcHJvY2Vzc2VkIHdyb25nLgotCi0JKiBjb2ZmLWNvZGUuaCBhZGRlZCBhIGxpbnQgY2FzdAotCi0JKiAoLi4vaW5jbHVkZS9hLm91dC5zdW40LmgpIGZpeGVkIGl0IHNvIHptYWdpYwotCXdvcmtlZAotCi1Nb24gSmFuIDI4IDE5OjE1OjI5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIHJlbW92ZWQgbG9hZHMgb2YgaW5jbHVkZXMsIGFuZCBmaXhlZCBidWcgd2hlcmUgc3RyaW5nCi0JdGFibGUgZGlkbid0IGhhdmUgYSBudWxsIGF0IHRoZSBlbmQuCi0KLQkqIGJmZC5jIGZpeGVkIGluY2x1ZGVzLCBhZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JY2Fub25pY2FsaXplX3JlbG9jIGVudHJ5IHBvaW50LgotCi0JKiBsaWJiZmQuYyBmaXhlZCBpbmNsdWRlcyBhbmQgYWRkZWQgc29tZSBsaW50IHBhdGNoZXMuCi0KLQkqIHRhcmdldHMuYyBhZGRlZCBib3RoIHNvcnRzIG9mIGludGVsIGNvZmYuCi0KLQkqIGIub3V0LmMgZml4ZWQgaW5jbHVkZWQsIGNoYW5nZWQgd2FzIHRoZSBjYW5vbmljYWwKLQlyZWxvY3Mgd2VyZSBkb25lLgotCi0JKiBpY29mZi5jIGFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIGFuZCBiaWcgYW5kIGxpdHRsZQotCWVuaWRpYW4gdGFibGVzLgotCi0JKiBvcG5jbHMuYyBhZGRlZCBjaG1vZCt4aW5nIGZvciBmaWxlcyB3aXRoIEVYRUNfUCBzZXQuCi0KLQkqIHN1bm9zLmMgZml4ZWQgaW5jbHVkZXMuIENoYW5nZWQgZGVmYXVsdCBzZWN0aW9uCi0JYWxpZ25lbWVudCB0byB3b3Jkcy4gRml4ZWQgcmVsb2NhdGlvbiBzdHVmZiB0byB3b3JrIHdpdGgKLQluZXcgc2NoZW1lCi0KLQkqIGJmZC5oIHZhcmlvdXMgbmV3IHR5cGVzIGFkZGVkLCBwcm90b3R5cGUgZm9yIG5ldwotCXJlbG9jIGNhbGxzLCBjaGFuZ2VkIGJmZC0+aW9zdHJlYW0gdG8gYSB2b2lkICoKLQl0byBpbmNsdWRpbmcgZmlsZXMgZG9uJ3QgbmVlZCBzdGRpby5oLgotCi0JKiBsaWJjb2ZmLmggYWRkZWQgY29udmVyc2lvbiB0YWJsZSB0byB0aWUgcmVsb2NzIHRvCi0JY2Fub25pY2FsIHN5bWJvbHMKLQotCSogc3lzZGVwLmggY3JlYXRlZAotCi0JKiBjb2ZmLWNvZGUuaCBmaXhlZCBpbmNsdWRlcy4gQWRkZWQgY29kZSB0byBzdXBwb3J0Ci0JYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGZvcm1hdHMuIFZhcmlvdXMgbGludHMuIEJldHRlcgotCXByb2Nlc3Npbmcgb2Ygc3ltYm9scy4gQ2hhbmdlZCByZWxvYyBzdHVmZiB0byBuZXcKLQlvcmRlcgotCi0JKiBsaWJiZmQuaCBmaXhlZCBpbmNsdWRlcwotCi0KLU1vbiBKYW4gMjEgMTE6NTM6NTEgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBiZmQuaAljaGFuZ2VkIG5hbWUgb2YgYWxpZ25tZW50IGVudHJ5IGluIHNlY19zdHJ1Y3QgdG8KLQlhbGlnbm1lbnRfcG93ZXIsIGJlY2F1c2Ugb2YgY29uZmxpY3RpbmcgdXNlcyB3aXRoaW4gYmZkLgotCU5vdyBpdCBzaG91bGQgYmUgb2J2aW91cyB0aGF0IGl0J3MgYSAyKipuIGFsaWdubWVudAotCXNwZWNpZmllci4gUmVtb3ZlZCBzdGFydF9wYWQsIGVuZF9hbGlnbm1lbnQsIGJsb2NrLCBtaW5zaXplLAotCW91dHB1dF9maWxlX2FsaWdubWVudCwgc3Vic2VjdGlvbl9hbGlnbm1lbnQgYW5kIG9yaWdpbmFsX3ZtYSBmaWVsZHMuCi0JQWRkZWQgYWxpZ25fcG93ZXIoKSBtYWNyby4gRml4ZWQgYmZkX3NlY3Rpb25fYWxpZ25tZW50Ci0JYWNlc3NvciBtYWNyb3MuIEFkZGVkIGJmZF9zeW1ib2xfc2FtZV90YXJnZXQgbWFjcm8uCi0KLQkqIGIub3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cykgZml4ZWQgdG8gdXNlCi0JbmV3IGFsaWdubWVudCBtZW1iZXIuIEZpeGVkIChjYWxsal9jYWxsYmFjaykgdG8gdXNlIHNlY3Rpb24KLQlyZWxhdGl2ZSBzeW1ib2xzIHByb3Blcmx5LgotCi0JKiBzdW5vcy5jIChzdW5vczRfb2JqZWN0X3ApIGZpeGVkIHRvIHVzZSBuZXcgYWxpZ25tZW50X3Bvd2VyLgotCUZpeGVkICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKSB0byBjb3JyZWN0bHkgbWFrZQotCXN5bWJvbHMgc2VjdGlvbiByZWxhdGl2ZS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2cpIGZpeGVkIHZhcmlvdXMgZW51bSBjYXN0IHByb2JsZW1zLgotCShiZmRfbWFrZV9zZWN0aW9uKSB0b29rIG91dCBpbml0aWFsaXphdGlvbiBvZiBvYnNvbGV0ZSBtZW1iZXJzLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKSBhZGRlZAotCi0JKiBvcG5jbHMuYyAoYmZkX2NyZWF0ZSkgY3JlYXRlZC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vaykgdG9vayBhd2F5IHJlZnMKLQl0byBvYnNvbGV0ZSBtZW1iZXJzLiAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKSBhZGRlZAotCWNvbnZlcnNpb24gYmV0d2VlbiBhbGlnbm1lbnQgdHlwZXMuIChjb2ZmX3N5bWJvbF9mcm9tKQotCWFkZGVkLiAoY29mZl9jb3VudF9saW5lbnVtYmVycykgb25seSBjb3VudHMgbGluZW51bWJlcnMKLQlpZiBzeW1ib2wgaXMgb2YgY29mZi10eXBlLiAoY29mZl9tYW5nbGVfc3ltYm9scykgb25seQotCWhlYXZpbHkgbWFuZ2xlcyBzeW1ib2xzIGlmIHN5bWJvbCBpcyBjb2ZmLXR5cGUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scykgdmFyaW91cyBsaW50cy4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCXZhcmlvdXMgbGludHMgYW5kIG1vZGlmaWNhdGlvbiBmb3IgYWxpZ25tZW50IGNvbnZlcnNpb24uCi0JKGNvZmZfc2x1cnBfcmVsb2NzKSBmaXhlZCBmb3IgdXNlIHdpdGggbmV3IGFzZWN0aW9uIHNoYXBlLgotCi1TYXQgSmFuIDE5IDE2OjEwOjQyIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIGxvdHMgb2YgbGludAotCi0JKiBiLm91dC5jIGFkZGVkIGNhbGxqIHJlbG9jYXRpb24gc3VwcG9ydCwgdXBncmF0ZWQgcmVsb2MgaG93dG8uCi0JRml4ZWQgc28gdGhhdCBhc3ltYm9sIGFuZCByZWxvYyByZWNvcmRzIGFyZSBvdXRwdXQKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5jIGxvdHMgb2YgbGludCwgc3VwcG9ydCBmb3IgbmV3IGJmZCBlbnRyeSBwb2ludAotCWJmZF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC5oIGNoYW5nZWQgZGVmaW5pdGlvbiBvZiBhc3ltYm9sIHRvIGNvbnRhaW4gcG9pbnRlciB0bwotCW93bmluZyBiZmQsIHJlbW92ZWQgdGFyZ2V0IGRlcGVuZGVuY2llcy4KLQotCSogY2FjaGUuYyB0b29rIG91dCBwcmludCBzdGF0ZW1lbnRzLCBwdXQgaW4gQkZEX0FTU0VSVCBjYWxscy4KLQotCSogY29mZi1jb2RlLmggdmFyaW91cyBsaW50cywgY29ycmVjdGVkIGxpbmVudW1iZXIgb3V0cHV0Ci0JZnVuY3Rpb25hbGl0eS4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IHN0eWxlIGFzeW1ib2xzIGFuZAotCWJmZF9wcmludF9zeW1ib2wuIEZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQKLQlyZWxvYyByZWNvcmRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gQWRkZWQgdGltZXN0YW1wLgotCi0JKiBpY29mZi5jIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBob3d0byBzaGFwZS4KLQotCSogbGliYS5vdXQuaCBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCi0JKiBsaWJiZmQuYyB2YXJpb3VzIGxpbnRzCi0KLQkqIGxpYmJmZC5oIHZhcmlvdXMgbGludHMKLQotCSogbGliY29mZi5oIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlLgotCi0JKiBzdW5vcy5jICB2YXJpb3VzIGxpbnRzLiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCWFuZCBiZmRfcHJpbnRfc3ltYm9sLgotCi1XZWQgSmFuIDE2IDIxOjM4OjA5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYi5vdXQuYyByZW1vdmVkIHByb3RvdHlwZSBvZiBzdW5vczRfZW5uYXRpdmF0ZV9zeW10YWIsIGxvdHMgb2YKLQlwb2ludGVyIGxpbnQuIEFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIHJlbG9jYXRpb24uIEZpeGVkIGJ1ZyB3aGVyZQotCXRoZSBsYXN0IDMyIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24gd2VyZSBvdmVyd3JpdHRlbiBieSBkYXRhLiBGaXhlZCBidWcKLQl3aGVyZSBhcmNoaXZlcyBvZiBiLm91dCBkaWRuJ3Qgd29yayBkdWUgYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLQlyZXR1cm5pbmcgZmFsc2UuCi0KLQkqIHN1bm9zLmMgYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZC4gQnJhY2VkIHRoZSBob3d0byB0YWJsZSBzbwotCXRoYXQgaXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGxlbmd0aGluZyBvZiB0aGUgaG93dG8gc3RydWN0IHR5cGVkZWYuCi0JVmFyaW91cyBsaW50cwotCi0JKiBiZmQuaCBhZGRlZCBzdXBwb3J0IGZvciBuX290aGVyIGZpZWxkLCBhZGRlZCBzcGVjaWFsX2Z1bmN0aW9uCi0JcmVsb2MgdHlwZSwgbW9kaWZpZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBwcm90b3R5cGUuIEFkZGVkIGJmZF9oX2dldF94Ci0JbWFjcm9zLgotCi0JKiBiZmQuYyB1cGdyYWRlZCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCB2YXJpb3VzIGxpbnRzLgotCi1XZWQgSmFuIDE2IDAxOjU1OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBydGwpCi0KLQkqIENoYW5nZUxvZzogIFN0YXJ0ZWQgQ2hhbmdlTG9nIGZvciBCRkQuCi0JKiBUb0RvOiAgQ3JlYXRlIGZpbGUgZm9yIHN1Z2dlc3Rpb25zLgotCi0JKiBNYWtlZmlsZTogIFN1cHBvcnQgZWFzeSBsb2FkaW5nIGludG8gU2FiZXIgQy4KLQlBZGQgZGVwZW5kZW5jaWVzIGZvciBpY29mZi5vIGFuZCBiY3M4OGtjb2ZmLm8uCi0JUmVuYW1lIGNvZmYuYyB0byBjb2ZmLWNvZGUuaC4gIENoYW5nZSBjYWxsZXJzLgotCi0JKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBBbGxvdyB0aGUgY2hlY2tfZm9ybWF0IHJvdXRpbmVzCi0JdG8gcmV0dXJuIHRoZSBkZXNpcmVkIHRhcmdldCB2ZWN0b3IsIHJhdGhlciB0aGFuIGp1c3QgYSBCb29sZWFuLgotCWJmZC5oIChiZmRfY2hlY2tfZm9ybWF0KTogIENoYW5nZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybiB0eXBlLgotCWFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogIGNoYW5nZSBjYWxsZWUuCi0JYi5vdXQuYyAoYl9vdXRfbGl0dGxlX29iamVjdF9wLCBiX291dF9iaWdfb2JqZWN0X3AsCi0JYl9vdXRfcmVhbF9vYmplY3RfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWxpYmJmZC5jIChfYmZkX2R1bW15X3RhcmdldCk6ICBEdW1teSByb3V0aW5lIHJlcGxhY2luZyBiZmRfZmFsc2UKLQlpbiBjaGVja19mb3JtYXQgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IG5lZWQgYSBmaWxsZXIuCi0JbGliYmZkLmggKGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXQpOiAgRml4IGRlY2xzLgotCWJjczg4a2NvZmYuYzogIGNoYW5nZSBjYWxsZWUuCi0JY29mZi1jb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCwgY29mZl9iaWdfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KLQlpY29mZi5jOiAgY2hhbmdlIGNhbGxlZS4KLQlzdW5vcy5jIChzdW5vczRfb2JqZWN0X3AsIHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCi0JKiBsaWJiZmQuYyAoemFsbG9jKTogIEl0IHNob3VsZCBhY3R1YWxseSB6ZXJvIHRoZSBzdG9yYWdlIQotCVRoaXMgd2FzIGNvbW1lbnRlZCBvdXQgZm9yIHNvbWUgcmVhc29uLgotCi0JKiBsaWJiZmQuaDogIEFkZCBtYWxsb2MsIHhtYWxsb2MsIG1lbWNweSwgYW5kIGZhdGFsIGRlY2xzLgotCVRoaXMgaXMgc28gY2FsbGVycyBjYW4gYXZvaWQgPHN0ZGxpYi5oPiB3aGljaCBkb2Vzbid0IGV4aXN0Ci0Jb24gb2xkZXIgc3lzdGVtcy4KLQotCSogYmZkLmMgKG1hcF9vdmVyX3NlY3Rpb25zKTogIEFkZCBkZWJ1Z2dpbmcgY29kZSwgc2luY2UgSQotCW5vdGljZWQgdGhlIHNlY3Rpb24gY291bnQgZm9yIHN1bm9zIGNvcmUgZmlsZXMgd2FzIGJhZCwgYnV0IG9ubHkKLQlHREIgaGFkIGRldGVjdGVkIHRoZSBwcm9ibGVtLgotCShiZmRfc2V0X3NlY3Rpb25fbGluZW5vX3NpemUsIGJmZF9zZXRfc2VjdGlvbl9saW5lbm9zLAotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9zKTogIFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbnMuCi0JKGJmZF9hcHBseV9yZWxvY2F0aW9ucyk6ICBVc2UgbG9uZ3MsIG5vdCBpbnRzLCBmb3IgdGhlIG1hdGguCi0KLQkqIGJmZC5oOiAgRGVjbGFyZSBlbnVtIGJvb2xlYW4gYW5kIHN0cnVjdCBiZmRfdGFyZ2V0IGFzIHdlbGwKLQlhcyB0eXBlZGVmcyBmb3IgdGhlbS4gIFJlbW92ZSBvYnNvbGV0ZQotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9fc2l6ZS4KLQotCSogY2FjaGUuYzogIE1ha2UgdGhlICJmZG9wZW4iIHN1cHBvcnQgd29yay4gIEtlZXAgYmV0dGVyIHRyYWNrCi0Jb2YgaG93IG1hbnkgZmlsZXMgYXJlIG9wZW4uICBDZW50cmFsaXplIHRoZSBvcGVuaW5nIG9mIGZpbGVzCi0JYW5kIGJlIHN1cmUgYmZkX29wZW5bcnddIGFjdHVhbGx5IHRyeSB0byBvcGVuIHRoZSBmaWxlLiAgRXZhZGUKLQlsaW5rZWQgbGlzdCBpbml0aWFsaXphdGlvbiBwcm9ibGVtcy4KLQotCSogYi5vdXQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jOiAgbGludC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE51bGwtdGVybWluYXRlIHN5bXRhYiBuYW1lcy4KLQotCSogY3BsdXMtZGVtLmM6ICBEZWxldGUgZmlsZSwgc2luY2UgaXQgaXMgbm90IHBhcnQgb2YgQkZELgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5yKTogIEVsaW1pbmF0ZSBtaXNwbGFjZWQgI2lmIDAgY29kZS4KLQkoYmZkX29wZW5yLCBiZmRfb3BlbncpOiAgQWN0dWFsbHkgb3BlbiB0aGUgZmlsZSwgZ2l2ZSBlcnJvciBub3cuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBTZXQgc2VjdGlvbiBjb3VudC4KLQkoc3Vub3M0X3NldF9zZWN0aW9uX2xpbmVub3MsIHN0YWJfbmFtZXMsIGZwcmludF9uYW1lKTogIEVsaW1pbmlhdGUKLQlvYnNvbGV0ZSBkZWZpbml0aW9ucy4KLQkoX3dyaXRlX3N5bWJvbF90YWJsZSk6ICBJbml0aWFsaXplIDxpZHg+IGNvdW50ZXIuCi0JKGZvb3ApOiAgRWxpbWluYXRlIGRlYnVnZ2luZyBjb2RlLgotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05NDk1IGIvYmZkL0NoYW5nZUxvZy05NDk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY4NTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTQ5NQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQzICswLDAgQEAKLVRodSBEZWMgMjEgMTI6NDM6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgdGhlCi0Jb2xkIHN0eWxlIFRPQzE2IHJlZmVyZW5jZXMgd2l0aG91dCB1c2luZyBSX1BQQ19HT1QuCi0JKHBwY19yZWxvY190eXBlKTogRGl0dG8uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgVE9DMTYuCi0JKHBwY19lbGZfdG9jMTZfaW5uZXIpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl9nb3QxNl9pbm5lci4KLQkocHBjX2VsZl90b2MxNl9yZWxvYyk6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX3RvYzE2X3JlbG9jLgotCShwcGNfZWxmX2dvdDE2X3tpbm5lcixyZWxvY30pOiBTdHVicyBmb3IgcmVhbCBHT1Qgc3VwcG9ydC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24gZm9yIEdPVC9QTFQgc3VwcG9ydCB0aGF0IGlzCi0Jd29yayBpbiBwcm9ncmVzcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KLQkocHBjX2VsZl9hZGp1c3RfZHluaW5keCk6IERpdHRvLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCi0JKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogRGVmaW5lLgotCi1XZWQgRGVjIDIwIDE5OjE0OjE4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogV2hlbiBhdHRhY2hpbmcgc2VjdGlvbnMgdG8KLQlzZWdtZW50cyBpZ25vcmUgc2VjdGlvbnMgdGhhdCB3b24ndCBiZSBhbGxvY2F0ZWQuICBQYXRjaCBmcm9tCi0JQW5kcmVhcyBTY2h3YWIuCi0KLVR1ZSBEZWMgMTkgMjA6MDE6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IE1hdGNoIG9uIG02OGstY2JtLSogb25seSBpZiBPUyBkb2Vzbid0IG1hdGNoCi0JYW55dGhpbmcgZWxzZS4KLQotVHVlIERlYyAxOSAxNjozODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDQUxDX0FEREVORCk6IERlZmluZS4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgdGhlIGlucHV0IHNlY3Rpb24gVk1BIHRvIHRoZQotCWFkZGVuZCBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1TdW4gRGVjIDE3IDIwOjExOjU1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogTXVzdCB0ZXN0IHRoZSBlbnRpcmUgZW50cnkgZm9yIHplcm8KLQl0byBjb3JyZWN0bHkgdGVybWluYXRlLgotCi1GcmkgRGVjIDE1IDEyOjA1OjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9lbmRpYW4pOiBEZWZpbmUuCi0JKGJmZF90YXJnZXQpOiBSZW5hbWUgYnl0ZW9yZGVyX2JpZ19wIHRvIGJ5dGVvcmRlciwgYW5kIGNoYW5nZSBpdAotCWZyb20gYm9vbGVhbiB0byBlbnVtIGJmZF9lbmRpYW4uICBDaGFuZ2UgaGVhZGVyX2J5dGVvcmRlcl9iaWdfcAotCWNvcnJlc3BvbmRpbmdseS4KLQkqIGJmZC1pbi5oIChiZmRfYmlnX2VuZGlhbiwgYmZkX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgotCShiZmRfaGVhZGVyX2JpZ19lbmRpYW4sIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBBbGwgdGFyZ2V0czogQ2hhbmdlIGluaXRpYWxpemF0aW9uIG9mIGJ5dGVvcmRlciBhbmQKLQloZWFkZXJfYnl0ZW9yZGVyIHRvIHVzZSBlbnVtIGJmZF9lbmRpYW4gdmFsdWVzIHJhdGhlciB0aGFuCi0JYm9vbGVhbnMuCi0JKiBBbGwgZmlsZXM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBieXRlb3JkZXJfYmlnX3AgYW5kCi0JaGVhZGVyX2J5dGVvcmRlcl9iaWdfcCB0byB1c2UgbmV3IGJmZF8qX2VuZGlhbiBtYWNyb3MuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IGxtYSB0byBzX3BhZGRyLCBub3QKLQlzX3ZhZGRyLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19wYWRkciB0byBsbWEsIG5vdAotCXZtYS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBEZWMgMTUgMDc6MzI6MDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZSB0byAnXycuCi0KLVRodSBEZWMgMTQgMTM6NDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IExvdHMgb2YgbWlub3IgY2xlYW51cHMuICBNYWtlIG1hbnkgZnVuY3Rpb25zIHJldHVybgotCWVycm9ycyByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LiAgQWxzbzoKLQkoaWVlZV93cml0ZV90d29ieXRlKTogUmVtb3ZlOyBjaGFuZ2UgY2FsbGVycyB0byBjYWxsIGV4aXN0aW5nCi0JaWVlZV93cml0ZV8yYnl0ZXMgZnVuY3Rpb24uCi0JKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IERvbid0IG91dHB1dCB0aGUgc2VjdGlvbiB0d2ljZSB3aGVuCi0Jb3V0cHV0dGluZyBhIGxvY2FsIHN5bWJvbC4gIERvbid0IGVtaXQgYW4gZXh0cmFuZW91cyB6ZXJvIGlmIHRoZXJlCi0JaXMgb25seSBvbmUgdGVybS4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFNldCB0aGUgbG1hIGFzIHdlbGwgYXMgdGhlIHZtYS4KLQkoaWVlZV9hcmNoaXZlX3ApOiBVc2UgYmZkX2FsbG9jX2dyb3cgcmF0aGVyIHRoYW4gYW4gb2JzdGFjay4KLQotCSogaWhleC5jIChpaGV4X3NldF9hcmNoX21hY2gpOiBEb24ndCBhY2NlcHQgYW55IGFyY2hpdGVjdHVyZSwganVzdAotCWEgcmVjb2duaXplZCBvbmUgb3IgYmZkX2FyY2hfdW5rbm93bi4KLQkoaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbCwgdG8gcGVybWl0IG9iamNvcHkKLQl0byBzdWNjZWVkLgotCShpaGV4X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQotV2VkIERlYyAxMyAxNTo0NDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4Lmg6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlKTogRGVmaW5lLgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyk6IERlZmluZS4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSk6IERlZmluZS4KLQkoYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCk6IERlZmluZSBtYWNyby4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGluY2x1ZGVzIGZpZWxkLgotCShhb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEluaXRpYWxpemUgaW5jbHVkZXMgaGFzaCB0YWJsZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBFbGltaW5hdGUgZHVwbGljYXRlIE5fQklOQ0wgZW50cmllcy4KLQotV2VkIERlYyAxMyAxMDo1MjoxNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IE1hdGNoIG9uIG1pcHMtKi0qIGluc3RlYWQgb2YgbWlwcy1pZHQtZWNvZmYuCi0KLVdlZCBEZWMgMTMgMTE6MDc6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiByZW1vdmVkIGRlYnVnZ2luZyBjb2RlLgotCi1UdWUgRGVjIDEyIDE3OjQyOjA2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3JlbG9jKTogTmV3IGZ1bmN0aW9uIHRvIGR1bXAgdGhlIC5yZWxvYyBzZWN0aW9uLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbCBwZV9wcmludF9yZWxvYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogLnJlbG9jIHNlY3Rpb24gYWxpZ25tZW50LgotCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZGVkIG1pc3Npbmcgbm9uLWVsaWdpYmxlIHJlbG9jcy4gU3BpZmZlZAotCXVwIHNvbWUgZGVidWdnaW5nIGFzIHdlbGwuCi0KLVR1ZSBEZWMgMTIgMTE6MzQ6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBIYW5kbGUgc3BhcmMtKi1lbGYqLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLUZyaSBEZWMgIDggMTc6NDc6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzZWN0aW9uX2NvdW50IHRvIDAKLQl3aGVuIHNldHRpbmcgc2VjdGlvbnMgdG8gTlVMTC4KLQotV2VkIERlYyAgNiAxNzowNTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8pOiBBZGQgZXhwb3J0X2RlZmluZWRzCi0JZmllbGQuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgZXhwb3J0X2RlZmluZWRzIHBhcmFtZXRlci4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogSWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldCwgc2V0IFhDT0ZGX0VYUE9SVAotCWZvciBhbGwgc3ltYm9scy4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRGVjICA0IDE2OjQwOjQ3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRmJ3MKLQotTW9uIERlYyAgNCAxMToyNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogSGFuZGxlIHJlY29yZCB0eXBlcyA0IGFuZCA1LgotCShpaGV4X29iamVjdF9wKTogUGVybWl0IHR5cGVzIDQgYW5kIDUuCi0JKGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgY2hlY2sgZm9yIG91dCBvZiByYW5nZQotCWFkZHJlc3Nlcy4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBHZW5lcmF0ZSB0eXBlcyA0IGFuZCA1LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBKdXN0IGlnbm9yZSB3YXJuaW5nIGFuZAotCWluZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBkb24ndCByZWFsbHkgZXhpc3QuCi0KLVN1biBEZWMgIDMgMTk6MDA6MjcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNaW5vciBmb3JtYXQgZml4ZXMKLQkocGVfcHJpbnRfZWRhdGEpOiBOZXcgZnVuY3Rpb24uIFVuZGVyIHByaXZhdGUgcHJpbnRpbmcsIHRoaXMgZm9ybWF0cwotCXRoZSBlZGF0YSBzZWN0aW9uIG9mIGEgUEUgZmlsZS4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIGNhbGwgdG8gcGVfcHJpbnRfZWRhdGEuCi0KLVN1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgS0VFUElUIHRvIGdldCB0aGUgc3ltYm9sCi0JaW5kZXgsIGRvbid0IGNhbGwgc3RvaS4KLQotRnJpIERlYyAgMSAxNDo0Njo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogaWhleC5jOiBOZXcgZmlsZTsgc3VwcG9ydCBmb3IgSW50ZWwgSGV4IGZvcm1hdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ci4KLQkoaWhleF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFsd2F5cyBpbmNsdWRlIGloZXhfdmVjLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGloZXhfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgaWhleC5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBpaGV4LmMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogU29ydCB0aGUgc2VjdGlvbnMgaW4KLQllYWNoIHNlZ21lbnQuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmV0dXJuIHRoZSByaWdodCBzaXplIGlmIHNlZ21lbnRfbWFwIGlzCi0Jbm90IE5VTEwuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzZWN0aW9ucy4KLQotCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfcmVjb3JkX3BoZHIpOiBEZWNsYXJlLgotCSogYmZkX2luMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGJvZ3VzCi0JQkZEX0FTU0VSVC4KLQotCSogbGliYmZkLmMgKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX3ptYWxsb2MpOiBSZXR1cm4gUFRSLCBub3QgY2hhciAqLiAgVGFrZSBzaXplX3QsIG5vdAotCWJmZF9zaXplX3R5cGUuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBEZWNsYXJlLgotCShiZmRfem1hbGxvYyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFueSBmaWxlczogVXNlIGJmZF9tYWxsb2MgYW5kIGJmZF9yZWFsbG9jIHJhdGhlciB0aGFuIG1hbGxvYwotCWFuZCByZWFsbG9jLiAgRG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgdGhleSBmYWlsLgotCi1UaHUgTm92IDMwIDE5OjMyOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jOiBBZGRlZCBtYWNyb3MgdG8gdGlkeSB1cCB0b2MgY2VsbCB0cmVhdG1lbnQuIE51bWVyb3VzCi0JdXNlcyBhcyB3ZWxsLiBBZGRlZCBhIG5ldyBob3d0byB0byBkZWFsIHdpdGggVE9DUkVMMTYgcmVsb2NzIHRoYXQKLQlhcmUgVE9DREVGTiBhcyB3ZWxsLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRXhwYW5kZWQgdHJlYXRtZW50IG9mIEFERFIzMk5CIHJlbG9jcwotCXRvIGhhbmRsZSBSVkEgcmVsb2NzIGZyb20gZGxsdG9vbC4KLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0JKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBjaGVjayBpZGF0YSRYIHNlY3Rpb25zCi0JdG8gZ2V0IHRoZSByaWdodCBzZWN0aW9uIGFsaWdubWVudC4KLQotVGh1IE5vdiAzMCAxNjo0ODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3Qgc2V0IGxtYSBiYXNlZCBvbgotCXBfcGFkZHIgaWYgcF9wYWRkciBpcyB6ZXJvLgotCShtYWtlX21hcHBpbmcpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcnMgZm9yIGZpcnN0Ci0JUFRfTE9BRCBzZWdtZW50LgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBTZXQgaW5jbHVkZXNfcGhkcnMgZm9yIFBUX1BIRFIKLQlzZWdtZW50LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSGFuZGxlIGluY2x1ZGVzX2ZpbGVoZHIgYW5kCi0JaW5jbHVkZXNfcGhkcnMuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIGFuZCBmaXJzdAotCVBUX0xPQUQgc2VnbWVudHMuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRyCi0Jd2hlbiBhcHByb3ByaWF0ZS4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgc2VnbWVudC4KLQlVc2UgYSBtb3JlIGNvbXBsZXggY29uZGl0aW9uIGZvciB3aGVuIGEgc2VjdGlvbiBpcyBpbmNsdWRlZCBpbiBhCi0Jc2VnbWVudCB0byBoYW5kbGUgU29sYXJpcyBsaW5rZXIgb2RkaXRpZXMuCi0KLVRodSBOb3YgMzAgMTE6MTc6MzMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IFJlZm9ybWF0dGVkIGZvciBlYXNpZXIgcmVhZGluZzsKLQlzcGVjaWFsX2Z1bmN0aW9uIG5vdyBwb2ludHMgdG8gbmV3IGZ1bmN0aW9uIG04OGtfc3BlY2lhbF9yZWxvYy4KLQkoaG93dG9faHZydDE2KTogRnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIGZvciBoYW5kbGluZyBIVlJUMTYgcmVsb2NzCi0JcmVtb3ZlZC4KLQkocnR5cGUyaG93dG8pOiBEbyBub3QgYWRkIHJlbG9jJ3Mgcl9vZmZzZXQgdG8gdGhlIGFkZGVuZCwgdGhpcyB3aWxsCi0JYmUgZG9uZSBjb3JyZWN0bHkgYnkgbTg4a19zcGVjaWFsX3JlbG9jLgotCShyZWxvY19wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgUkVMT0NfUFJPQ0VTU0lORy4KLQkoUkVMT0NfUFJPQ0VTU0lORyk6IERlZmluZSB0byBjYWxsIHJlbG9jX3Byb2Nlc3NpbmcuCi0KLVdlZCBOb3YgMjkgMTI6NDI6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2FsbCBtYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy4KLQkocGVfcHJpbnRfcGRhdGEpOiBMaWtld2lzZS4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ieV9zaXplX3QpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZgotCW9ic3RhY2tfYWxsb2MgZmFpbHMuCi0JKGJmZF9hbGxvY19maW5pc2gpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvYnN0YWNrX2ZpbmlzaAotCWZhaWxzLgotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgbWFsbG9jIGZhaWxzLgotCSogTWFueSBmaWxlczogZG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb25lIG9mIHRoZSBhYm92ZQotCXJvdXRpbmVzIGZhaWxzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGFkanVzdCBwX3BhZGRyCi0JaWYgcF9wYWRkcl92YWxpZCBpcyBzZXQuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGaXggY2FzZSB3aGVyZSBleHRyYQotCXByb2dyYW0gaGVhZGVycyB3ZXJlIGFsbG9jYXRlZC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0bwotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbik6IERvbid0IGFib3J0IGlmCi0Jcl9zeW1uZHggaXMgUkVMT0NfU0VDVElPTl9OT05FIGZvciBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYy4KLQlDaGFuZ2UgYSBSRUxPQ19TRUNUSU9OX0xJVEEgc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fQUJTLgotCShhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCk6IENoYW5nZSBSRUxPQ19TRUNUSU9OX0FCUyB0bwotCVJFTE9DX1NFQ1RJT05fTElUQSBmb3IgQUxQSEFfUl9JR05PUkUuCi0JKGFscGhhX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgQUxQSEFfUl9JR05PUkUsIGRvbid0IGNoYW5nZQotCVJFTE9DX1NFQ1RJT05fQUJTIHRvIFJFTE9DX1NFQ1RJT05fTk9ORS4KLQotVHVlIE5vdiAyOCAxNjo1OTo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgc2VnbWVudF9tYXAgZmllbGQuCi0JKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX3NvcnRfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZW1vdmUuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmVtb3ZlIHNvcnRlZF9oZHJzLCBjb3VudCwgYW5kCi0JbWF4cGFnZXNpemUgcGFyYW1ldGVycy4gIFNpbXBsaWZ5LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFdoZW4gZ2VuZXJhdGluZyBhbgotCWV4ZWN1dGFibGUsIHVzZSBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzLgotCShlbGZfc29ydF9oZHJzKTogUmVtb3ZlLgotCShfYmZkX2VsZl9zaXplb2ZfaGVhZGVycyk6IFJlbW92ZSBlbGltaW5hdGVkIHBhcmFtZXRlcnMgZnJvbSBjYWxsCi0JdG8gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCi0KLU1vbiBOb3YgMjcgMTI6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoTVkoY2FsbGJhY2spKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDAuCi0KLVdlZCBOb3YgMjIgMTI6MDI6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIFNUWVBfUkNPTlNULgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBIYW5kbGUgc2NSQ29uc3QuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEhhbmRsZSBzY1JDb25zdC4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgc2NSQ29uc3QuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBIYW5kbGUgLnJjb25zdAotCXNlY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBPbmx5IHNldCB3cml0dGVuIGlmIHRoZQotCURFRl9EWU5BTUlDIGZsYWcgaXMgc2V0LgotCi1UdWUgTm92IDIxIDEzOjI1OjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBob3N0LWFvdXQuYzogSWYgVFJBRF9IRUFERVIgaXMgZGVmaW5lZCwgaW5jbHVkZSBpdC4KLQotVHVlIE5vdiAyMSAxMzowMzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkoQkZEX0JJTkFSWV9GT1BFTik6IFJlcXVpcmUgQUNfQ0FOT05JQ0FMX1NZU1RFTS4KLQkoQkZEX05FRURfREVDTEFSQVRJT04pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KLQkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OXyogaW4gQFRPUEAgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCi0Jc3BlY2lhbF9zZWN0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIHdoZW4gY2FsbGVkIHdpdGggYSBub24gWENPRkYKLQlCRkQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBjb21tb24gc3ltYm9scyB3aXRoCi0JZ2xvYmFsIHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBwYWQgdGhlCi0JcHJldmlvdXMgc2VjdGlvbiB0byBmb3JjZSBmaWxlIGFsaWdubWVudCB3aGVuIGNyZWF0aW5nIGFuCi0JZXhlY3V0YWJsZS4KLQotTW9uIE5vdiAyMCAxNDo1NDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYKLQlSUzYwMDBDT0ZGX0MsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEFkanVzdCB0aGUgVE9DIGFuY2hvciB2YWx1ZQotCWlmIGl0IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgZW50aXJlIFRPQyBhcmVhIHdpdGgKLQlzaWduZWQgMTYgYml0IG9mZnNldHMuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBIYW5kbGUgbmVnYXRpdmUgVE9DIG9mZnNldHMgaW4gZ2xvYmFsCi0JbGlua2FnZSBjb2RlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QgYQotCVRPQyBhbmNob3IgdG8gdXNlIHRoZSBUT0MgdmFsdWUgdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLVNhdCBOb3YgMTggMTg6MDE6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IENhc3QgbWFsbG9jIHJldHVybi4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0KLVNhdCBOb3YgMTggMTk6NDM6MDQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBwZS1hcm0uYzogRml4IHR5cG9zLgotCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCi0KLUZyaSBOb3YgMTcgMTY6MjI6MDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGxpc3RfZWxlKTogQWRkZWQgImNhdCJlZ29yeSBtZW1iZXIuCi0JKHJlY29yZF90b2MpOiBOZXcgY2F0ZWdvcnkgcGFyYW1ldGVyIChwcml2IG9yIHB1YikuCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hlY2sgdG8gc2VlIGlmIHRvYyBib3VuZHMgZXhjZWVkZWQuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlZCBlbWJyaW9uaWMgZGF0YS1pbi10b2MgZnJvbQotCXRoZSBtYWlubGluZS4gSXQgYWRkZXMgZXh0cmEgdG9jIGNlbGxzIGluIGVycm9yLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgotCShkdW1wX3RvYyk6IENhbiBub3cgZGlhZ25vc2UgInZpcnR1YWwgdG9jIiBjaGljYW5lcnkuCi0KLUZyaSBOb3YgMTcgMTA6NDE6MjUgMTk5NSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSB0eXBlIG9mCi0JZHluc3ltY291bnQgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcyBmcm9tIHNpemVfdCB0byBiZmRfc2l6ZV90eXBlLgotCi1GcmkgTm92IDE3IDEwOjAyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogSTk2MCB2ZXJzaW9uOiBkb24ndAotCXBvaW50ZXJpemUgQ19MRUFGU1RBVCBvciBDX0xFQUZFWFQgZW50cmllcy4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE9ubHkgY3JlYXRlCi0JRFRfSU5JVCBhbmQgRFRfRklOSSBlbnRyaWVzIGlmIHRoZSBfaW5pdCBvciBfZmluaSBzeW1ib2wgaXMKLQlkZWZpbmVkIG9yIG1lbnRpb25lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KLQotVGh1IE5vdiAxNiAxNToxNjo0MiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFRPQ0RFRk4gYXR0cmlidXRlCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJFTDI0IGhhbmRsaW5nCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogQ29ycmVjdCBUT0NERUZOIGhhbmRsaW5nCi0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkZWQgbmFtZSBkZXNjcmlwdGlvbnMKLQotVGh1IE5vdiAxNiAwMzozODowMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogVXBkYXRlZCB0byBjeWdudXMtMi42LgotCi1XZWQgTm92IDE1IDE5OjMwOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKG02OGs0a25ldGJzZF92ZWMpOiBEZWNsYXJlLgotCi1XZWQgTm92IDE1IDE4OjA1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIGFyZ3VtZW50IHRvCi0JX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0Ci0JdXNpbmcgUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KLQkqIGJmZC1pbjIsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcGVpY29kZS5oIChwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIHZmaWxlIGZyb20gdm9pZCAqCi0JdG8gUFRSLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcwotCV9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSByYXRoZXIgdGhhbiBjYXN0aW5nCi0JYmZkX3RydWUuCi0KLVdlZCBOb3YgMTUgMDQ6MDk6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNoYW5nZS4gIFJlbW92ZSBhbnkKLQkiRE8gTk9UIERFTEVURSIgbGluZXMgb3IgYmxhbmsgbGluZXMgdGhhdCBta2RlcCB3cml0ZXMgb24gc29tZQotCXN5c3RlbXMuCi0JKEJGRF9MSUJTX0NGSUxFUywgQUxMX01BQ0hJTkVTX0NGSUxFUywgQkZEMzJfQkFDS0VORFNfQ0ZJTEVTLAotCUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUyk6IFVzZSB0aGVtLgotCi1UdWUgTm92IDE0IDExOjUyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgUFBDIFBFLCBzdGFydCBpc2l6ZSBhdCAwLAotCW5vdCBhdCB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQXZvaWQgdXNpbmcKLQl1bnBvcnRhYmxlICNlbGlmLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gZ2VuZXJhdGluZyBhIFBQQyBQRSBleGVjdXRhYmxlCi0Jd2l0aCBubyBzeW1ib2xzLCByb3VuZCB1cCB0aGUgZmlsZSBzaXplIHRvIGEgQ09GRl9QQUdFX1NJWkUKLQlib3VuZGFyeS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsCi0JZG9uJ3Qgd3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogV2hlbiB1c2luZyBhIGRpZmZlcmVudCBzZWN0aW9uCi0JaGVhZGVyLCBwYXNzIHRoZSBuZXcgb25lIHRvIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gYW5kIHNoX2VudHNpemUgZmllbGRzLgotCShlbGZfbWFwX3N5bWJvbHMpOiBBZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9sIHZhbHVlIHdoZW4gY29tcGFyaW5nCi0JYWdhaW5zdCAwLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGJ1aWxkIHN5bWJvbCB0YWJsZQotCWlmIHRoZXJlIGFyZSBzb21lIHN5bWJvbHMuICBTZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZW1vdmUgZG9zeW1zIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBOZXZlciBzZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoTUFQX09ORVNZTVRBQiwgTUFQX0RZTlNZTVRBQiwgTUFQX1NUUlRBQiwgTUFQX1NIU1RSVEFCKTogRGVmaW5lLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3Igc3BlY2lhbCBtYXBwaW5nIG9mIHN0X3NobmR4IGNyZWF0ZWQgYnkKLQljb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuCi0JKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBjb3B5IHJvdXRpbmVzLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVjbGFyZS4KLQotCSogY29uZmlnLmJmZCAoc2gtKi0qKTogU2V0IHRhcmdfZGVmdmVjIHRvIHNoY29mZl92ZWMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFLCBoYW5kbGUKLQlDX05UX1dFQUsuCi0KLQkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBVc2UgX2JmZF9nZW5lcmljX2FyY2hpdmVfcCwgbm90Ci0JX2JmZF9kdW1teV90YXJnZXQsIG1hdGNoaW5nIHRoZSByZWNlbnQgY2hhbmdlIHRvIGFyY2hpdmUKLQlyZWNvZ25pdGlvbi4KLQotTW9uIE5vdiAxMyAxMzoyNDozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXNlIGNhc3RzIHRvIGF2b2lkIGRvaW5nCi0JYXJpdGhtZXRpYyBvbiBQVFIgdHlwZXMuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgbG1hIG9mIHRoZSBzZWN0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IFR1cm4gYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZAotCXN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbi4KLQotTW9uIE5vdiAxMyAwNzozMTozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgc3VwcG9ydCBmb3IgaW5saW5lCi0JZ2x1ZSBmb3IgdGhlIHJlbG9jczogSU1HTFVFIGFuZCBJRkdMVUUuCi0JKHJlY29yZF90b2MpOiBuZXcgZnVuY3Rpb24gLSB0cmFja3MgdG9jIGNvbnRlbnRzCi0JKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogbmV3IGZ1bmN0aW9uIC0gc3VwcG9ydHMgdGhlIElNR0xVRSByZWxvYwotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgc3VwcG9ydCBhbmQgZml4ZXMgZm9yIElNR0xVRS9JRkdMVUUKLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBSZW1vdmVkIGEgZGVidWcgZGVmaW5lIChkdWgpCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBGaXhlZCBpbnZhbGlkIHN0cmNtcCBmb3IgIi5yZWxkYXRhIgotCShwZV9wcmludF9pZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIGlkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIHBkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbHMgdG8gYWJvdmUKLQotU3VuIE5vdiAxMiAxMjoyMzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiZmRfbGlic19oZXJlLCBldGMpOiBQcm92aWRlIGVtcHR5IGRlZmluaXRpb25zLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBBZGQgY29uZGl0aW9uYWwgZGVmaW5lcwotCVRBUkdFVF9TWU0gYW5kIFRBUkdFVF9OQU1FIGZvciB2ZWN0b3IgYW5kIEJGRCBuYW1lLgotCSogY29mZi1wbWFjLmMgKHBtYWNfeGNvZmZfdmVjKTogUmVtb3ZlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBbUE9XRVJNQUNdOiBTZXQgdGhlCi0JbWFjaGluZSB0byAwLCBub3QgYWxsIFBvd2VyTWFjcyBhcmUgNjAxcy4KLQotRnJpIE5vdiAxMCAxMjoxMDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVhZCBpbiBhbnkgcHJvZ3JhbSBoZWFkZXJzLgotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGp1c3Qgc2VjdGlvbiBsbWEKLQliYXNlZCBvbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLCBpZiBhbnkuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgZnJvbSB0aGUgdm1hLCBub3QgdGhlIGxtYS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgcF9wYWRkciBvZiBwcm9ncmFtIGhlYWRlcnMgYmFzZWQgb24KLQl0aGUgbG1hLgotCi1UaHUgTm92ICA5IDEzOjAxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBQcmVzZXJ2ZSB0ZGF0YSBpbiBjYXNlIG9mCi0JZmFpbHVyZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogUmVwb3J0IGEgcmVhc29uYWJsZSBlcnJvciB3aGVuCi0JdHJ5aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBhIG5vbi1hLm91dCBvYmplY3QgZmlsZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUKLQlpbiBhbiBhcmNoaXZlIGV2ZW4gaWYgdGFyZ2V0X2RlZmF1bHRlZCBpcyBzZXQuICBJZiB0aGUgb2JqZWN0IGZpbGUKLQloYXMgdGhlIHdyb25nIHh2ZWMsIHJlamVjdCBpdC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IElmIGEgc2VjdGlvbiBjYW4gbm90Ci0JYmUgcmVwcmVzZW50ZWQsIHJlcG9ydCB0aGUgbmFtZSB2aWEgX2JmZF9lcnJvcl9oYW5kbGVyLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFdyaXRlIFJTNjAwMENPRkZfQyB2ZXJzaW9uCi0Jd2hpY2ggY2hlY2tzIGZvciBTVFlQX09WUkZMTyBzZWN0aW9ucy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQotCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9jb3VudF9saW5lbnVtYmVycyBiZWZvcmUKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIElmIFJTNjAwMENPRkZfQywgaGFuZGxlCi0JcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENvdW50IGxpbmUgbnVtYmVycyBhbmQKLQlyZWxvY3MgYmVmb3JlIGRlYWxpbmcgd2l0aCAucGFkIHNlY3Rpb25zLiAgQ291bnQgb3ZlcmZsb3cgc2VjdGlvbgotCWhlYWRlcnMgd2hlbiBoYW5kbGluZyAucGFkIHNlY3Rpb25zLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhLm91dCB2c3RhbXAgdG8gMQotCWlmIFJTNjAwMENPRkZfQy4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFU0NSSVBUT1IpOiBEZWZpbmUuCi0JKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZGVzY3JpcHRvcl9zZWN0aW9uIGFuZAotCXNwZWNpYWxfc2VjdGlvbnMgZmllbGRzLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IGxpbmthZ2Ugc2VjdGlvbiBhbGlnbm1lbnQuICBDcmVhdGUKLQlkZXNjcmlwdG9yIHNlY3Rpb24uICBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzIChfdGV4dCwgZXRjLiksCi0JYW5kIHJlY29yZCB0aGVtIGluIHNwZWNpYWxfc2VjdGlvbnMgaWYgZm91bmQuICBTZXQKLQlYQ09GRl9ERVNDUklQVE9SIGZsYWcgZm9yIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIHNldCBpdHMKLQlkZXNjcmlwdG9yIGZpZWxkIHRvIHBvaW50IGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGNvZGUgc3ltYm9sLgotCSh4Y29mZl9zd2VlcCk6IEFsd2F5cyBtYXJrIHRoZSBzcGVjaWFsIGRlc2NyaXB0b3Jfc2VjdGlvbi4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRoZSBzeW1ib2wgbWlnaHQgYmUgYQotCWZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBtYXJrIGl0IGlmIGl0IGlzLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIG5ldyBzcGVjaWFsX3NlY3Rpb25zCi0JcGFyYW1ldGVyLCBhbmQgZmlsbCBpdCBpbi4gIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGVzY3JpcHRvcgotCXNlY3Rpb24uCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnIHdoZW4gZGVmaW5pbmcKLQlnbG9iYWwgbGlua2FnZSBjb2RlLiAgSWYgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaXMKLQlleHBvcnRlZCwgYXJyYW5nZSB0byBkZWZpbmUgaXQuICBXYXJuIGFib3V0IGFueSBvdGhlciB1bmRlZmluZWQKLQlleHBvcnRlZCBzeW1ib2wuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENyZWF0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2hlbgotCW5lY2Vzc2FyeS4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UaHUgTm92ICA5IDA4OjQwOjIzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlKTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaGFzaCBlbnRyeSBjb25zdHJ1Y3RvcgotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IGhhc2ggdGFibGUgaW5pdGlhbGl6ZXIKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IGhhc2ggdGFibGUgY29uc3RydWN0b3IKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IHJlbW92ZWQgdG9jX29mZnNldAotCSogbGliY29mZi5oOiBSZWJ1aWxkCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0KLVRodSBOb3YgIDkgMDQ6MDA6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IE1ha2Ugc3VyZSB0aGUgZmlsZSBta2RlcCBpcyB0byB3cml0ZSBleGlzdHMKLQlmaXJzdC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBuZXcgb3B0aW9uIC0td2l0aFtvdXRdLW1tYXAuICBTZXQgVVNFX01NQVAKLQlpZiBpdCBpcyBnaXZlbiBhbmQgbW1lcCBpcyBhdmFpbGFibGUuCi0JKiBhY2NvbmZpZy5oOiBVbmRlZiBVU0VfTU1BUC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4Lmg6IElmIFVTRV9NTUFQIGlzIG5vdCBkZWZpbmVkLCBkbyBhbGwgc3ltYm9sIGFuZCBzdHJpbmcKLQl0YWJsZSBoYW5kbGluZyB0aGUgb2xkIHdheS4KLQkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IGNvbXBsYWluIGlmIGxhc3QgYnl0ZSBvZiBzdHJpbmcKLQl0YWJsZSBpcyBub256ZXJvLgotCSogbGliYmZkLmMgW0hBVkVfTUFEVklTRV06IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9tbWFuLmguCi0JKGJmZF9mcmVlX3dpbmRvdykgWyEgVVNFX01NQVBdOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3csCi0JX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykgWyEgVVNFX01NQVBdOiBBYm9ydC4KLQotV2VkIE5vdiAgOCAyMDowMzo0NCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb2ZmLWEyOWsuYyAoU0lHTl9FWFRFTkRfSFdPUkQpOiBVc2UgfjB4ZmZmZiByYXRoZXIgdGhhbgotCTB4ZmZmZjAwMDAuCi0KLVdlZCBOb3YgIDggMTE6MzE6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IENoYW5nZSBoYW5kbGluZyBvZiBSX0lSRUwgcmVsb2MgdG8gYmUKLQljb21wYXRpYmxlIHdpdGggQU1EIGdlbmVyYXRlZCBDT0ZGIGZpbGVzLiAgVHJ5IHRvIHN1cHBvcnQgYm90aCBBTUQKLQlhbmQgR05VIGZvcm1hdHMgc2ltdWx0YW5lb3VzbHkuCi0JKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHdyaXRhYmxlIHBhcmFtZXRlciBmcm9tCi0JaW50IHRvIGJvb2xlYW47IHVwZGF0ZSBhbGwgY2FsbGVycy4gIFBhc3MgTUFQX1NIQVJFRCBpZiBub3QKLQl3cml0YWJsZS0taXQncyByZXF1aXJlZCBvbiBTb2xhcmlzLiAgQ2FzdCBmcHJpbnRmIGFyZ3VtZW50IHRvCi0JYXZvaWQgd2FybmluZy4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaDogVXBkYXRlIGNhbGxzIHRvIGJmZF9nZXRfZmlsZV93aW5kb3cuCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9ERUZfRFlOQU1JQyk6IFJlbmFtZSBmcm9tIFhDT0ZGX1JFRl9EWU5BTUlDLgotCUNoYW5nZSBhbGwgdXNlcy4KLQkoeGNvZmZfc3dhcF9sZGhkcl9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX3N3YXBfbGRzeW1faW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9maW5kX3JlbG9jKTogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHJlbG9jIGNvcnJlY3RseS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIHdlIGp1c3QgY3JlYXRlZCBhIGRlc2NyaXB0b3IsIHBhc3MgaXQKLQl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgdG8gc2F2ZSBhIGhhc2ggbG9va3VwLgotCUhhbmRsZSBYVFlfRVIvWE1DX1hPIHN5bWJvbHMgY29ycmVjdGx5LgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZXdyaXRlIHRvIHJlYWQgLmxvYWRlciBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBJdCdzIG5vdCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzCi0JYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgYWJzb2x1dGUgdmFsdWUuCi0JKHhjb2ZmX21hcmspOiBXaGVuIGNvbnNpZGVyaW5nIGNhbGxlZCBzeW1ib2xzLCBjaGVjayB3aGV0aGVyIHRoZQotCWRlc2NyaXB0b3IgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCByYXRoZXIgdGhhbiB0aGUgc3ltYm9sCi0JaXRzZWxmLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlDYXN0IHJlYWxsb2MgYW5kIG1hbGxvYyByZXR1cm4gdmFsdWVzLiAgSWYgbWFsbG9jIG9yIHJlYWxsb2MgZmFpbCwKLQlzZXQgYmZkX2Vycm9yX25vX21lbW9yeS4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHR5cGUgdG8gYm9vbGVhbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE5vdiAgNyAxMTo1Mzo0OCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24uCi0JKGluX3JlbG9jX3ApOiBjaGFuZ2VkIHJldHVybiB2YWx1ZS4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IG11Y2ggcmV3b3JrLgotCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBuZXcgZnVuY3Rpb24uCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogbmV3IGZ1bmN0aW9uLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogbmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQWRkZWQgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEFkZGVkIG1vcmUgc2VjdGlvbnMgdG8gdGhlIGRhdGEKLQlkaWN0aW9uYXJ5IGZvciB0aGUgcGUgZmlsZSBoZWFkZXIuIEFsc28gY2hhbmdlZCBsaW5rZXIgdmVyc2lvbgotCW51bWJlciBvbiB0aGUgcHBjIHNpZGUuCi0JKGRpcl9uYW1lcyk6IHNtYWxsIGltcHJvdmVtZW50cyB0byB0aGUgZGljdGlvbmFyeSBwcmludGluZy4KLQkocGVfbWtvYmplY3RfaG9vayk6IHNhdmUgdGhlIGZpbGUgbGV2ZWwgZmxhZ3MuCi0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCi0JKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAotCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybwotCi0JKiBsaWJjb2ZmLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAotCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKLQkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhZGRlZCBob29rIGZvciBQRS4KLQkoY29mZl9ta29iamVjdCk6IGluaXQgZm9yIGxvY2FsX3RvY19zeW1fbWFwCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IHRoZSBpbnRlcm5hbF9hLm1hZ2ljIHRvCi0gICAgICAgIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyB3aGljaCBhcHBlYXJzIHRvIGJlIHdoYXQgb3RoZXIKLQlwcGMgY29tcGlsZXJzIHVzZS4KLQotVHVlIE5vdiAgNyAxMzo0ODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogS2VlcCBsb29raW5nIHRocm91Z2ggc3RhYnMKLQllbnRyaWVzIHVudGlsIGJvdGggdGhlIGxpbmUgbnVtYmVyIGFkZHJlc3MgYW5kIHRoZSBmdW5jdGlvbiBuYW1lCi0JYWRkcmVzcyBhcmUgdG9vIGxhcmdlLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IGRlZmluZSBDQ19GT1JfQlVJTEQgaWYgaXQKLQlpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudC4KLQotVHVlIE5vdiAgNyAxMDo1NzoyNCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lIHRvIHVzZQotCWdlbmVyaWMgdmVyc2lvbi4KLQotTW9uIE5vdiAgNiAxNzoxMzoxNSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGNvZmYtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY29mZi1pMzg2LmMuCi0JKiBjcHUtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY3B1LWkzODYuYy4KLQkqIGhvc3RzL2k4NjBtYWNoMy5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaG9zdHMvaTM4Nm1hY2gzLmguCi0JKiBjb25maWcuYmZkIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSosIGk4NjAtKi1jb2ZmKik6IE5ldwotCXRhcmdldHMsIHVzaW5nIGk4NjBjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqKTogTmV3IGhvc3RzLCB1c2luZwotCXRyYWQtY29yZS5vIGFuZCBob3N0cy9pODYwbWFjaDMuaC4KLQkoaTg2MGNvZmZfdmVjKTogVXNlIGNvZmYtaTg2MC5vIGFuZCBjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LWk4NjAuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1pODYwLm8uCi0JKENGSUxFUyk6IEFkZCBjcHUtaTg2MC5jIGFuZCBjb2ZmLWk4NjAuYy4KLQkqIHRhcmdldHMuYyAoaTg2MGNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmk4NjBjb2ZmX3ZlYy4KLQkqIGFyY2h1cmVzLmMgKGJmZF9pODYwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCAmYmZkX2k4NjBfYXJjaC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEk4NjAgbWFnaWMgbnVtYmVyLgotCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9pODYwLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBJODYwIGEub3V0IG1hZ2ljIG51bWJlci4KLQotTW9uIE5vdiAgNiAxNDozNDowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgb2YKLQl0aGUgY3JlYXRlZCAudGMgc2VjdGlvbiB0byAyLgotCSh4Y29mZl9tYXJrKTogRG9uJ3Qga2VlcCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgY2FsbCB0byBhbgotCXVuZGVmaW5lZCBzeW1ib2wgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGdlbmVyYXRlCi0JZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYSBjYWxsIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLVN1biBOb3YgIDUgMjE6NDQ6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBSZWJ1aWxkIGxpc3QgZnJvbSBCRkRfTElCUywgQUxMX01BQ0hJTkVTLAotCUJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUy4KLQkoLmRlcDEpOiBQdXQgbWtkZXAgb3V0cHV0IGluIGEgc2VwYXJhdGUgZmlsZS4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhc3QgX2JmZF9yZWFkX2FyX2hkciByZXR1cm4KLQl2YWx1ZS4KLQotCVBlcm1pdCB1c2Ugb2YgbW1hcCB3aGVuIGF2YWlsYWJsZToKLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbW1hcCwgbWFkdmlzZSwgbXByb3RlY3QuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGxpYmJmZC5jIChzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWZpbmUgdHlwZS4KLQkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG9rX3RvX21hcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgZm9yIGRlYnVnZ2luZy4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfd2luZG93X2ludGVybmFsKTogRGVjbGFyZSB0eXBlLgotCShiZmRfd2luZG93KTogRGVmaW5lIHR5cGUuCi0JKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogRGVjbGFyZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KToKLQlEZWNsYXJlLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCB0d28gd2luZG93IGZpZWxkcy4KLQkob2JqX2FvdXRfc3ltX3dpbmRvdywgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyk6IE5ldyBtYWNyb3MuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJbml0aWFsaXplIHdpbmRvd3MuCi0JKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBHZXQgc3ltYm9sIGRhdGEgYW5kIHN0cmluZ3MgaW4KLQl3aW5kb3dzIGluc3RlYWQgb2YgZXhwbGljaXRseSBhbGxvY2F0ZWQgYnVmZmVycy4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogRnJlZSB3aW5kb3cgaW5zdGVhZCBvZiBtZW1vcnkuCi0JKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogUmVsZWFzZSB3aW5kb3dzIGluc3RlYWQgb2YgZnJlZWluZyBzdG9yYWdlCi0JZGlyZWN0bHkuCi0JKGFvdXRfbGlua19mcmVlX3N5bWJvbHMpOiBEaXR0by4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIG5ldyBmaWVsZCBmb3IKLQlnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cuCi0JKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMpOiBVcGRhdGVkLgotCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBiaW5hcnkuYywgYm91dC5jLCBjb2ZmLWFscGhhLmMsCi0JY29mZi1taXBzLmMsIGVsZnh4LXRhcmdldC5oLCBpMzg2bXNkb3MuYywgaTM4Nm9zOWsuYywgaWVlZS5jLAotCWxpYmNvZmYtaW4uaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYywgdmVyc2Fkb3MuYzogQWRkZWQgbmV3Ci0JbWFjcm9zIGZvciBnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgZmllbGQuCi0KLVNhdCBOb3YgIDQgMTI6MjM6MjYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYzogUmVuYW1lZCB0byBjb3JlZmlsZS5jCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBDaGFuZ2UgY29yZS5vIHRvIGNvcmVmaWxlLm8KLQkqIE1ha2VmaWxlLmluIChDRklMRVMsIEJGRF9MSUJTKTogVXNlIGNvcmVmaWxlLmMgaW5zdGVhZCBvZiBjb3JlLmMKLQotRnJpIE5vdiAgMyAxNTo1NDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlIHN1YgotCXRvIG8uICBDbG9iYmVyIGFuZCByZXN0b3JlIHRoZSBsaXN0IG9mIG5ldyBjc2VjdHMgYXJvdW5kIHRoZSBjYWxsCi0JdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIGluIGNhc2UgaXQgd2FudHMgdG8gcmVwb3J0IGEKLQlsaW5rZXIgZXJyb3IgYW5kIHRoZSBsaW5rZXIgd2FudHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgUmVzZXQKLQl0aGUgbGluZSBudW1iZXIgY291bnQgb2YgYSByZWFsIHNlY3Rpb24gZXZlbiBpZiBpdCBoYXMgbm8gcmVsb2NzLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogSWYgc2hhcmVkLCBzZXQgdGhlIERZTkFNSUMgZmxhZy4KLQotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBXYXJuIGlmIHRoZSBzdHJpbmcgc2l6ZQotCWlzIHRvbyBzbWFsbC4KLQotVGh1IE5vdiAgMiAyMzoxNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgd2FybiBhYm91dAotCWFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzaGFyZWQgbGluay4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29ycmVjdCB0eXBlIG9mCi0Jb2xkdHlwZSBmcm9tIGJmZF9saW5rX29yZGVyX3R5cGUgdG8gYmZkX2xpbmtfaGFzaF90eXBlLiAgRnJvbQotCXBoZG1AaW5mby51Y2wuYWMuYmUgKFBoaWxpcHBlIERlIE11eXRlcikuCi0KLVdlZCBOb3YgIDEgMTQ6MjY6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChydHlwZTJob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFJUWVBFMkhPV1RPKTogVXNlIGl0IHJhdGhlciB0aGFuIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYwotCXRvIFBBR0VNQUdJQ1BFWEVDUEFHRUQgI2lmIGRlZmluZWQgKE02OCkgJiYgIWRlZmluZWQgKExZTlhPUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbTY4Ki1tb3Rvcm9sYS1zeXN2KiBkb2VzIG5vdCB1c2UgcHRyYWNlLWNvcmUubzsKLQlkZWZpbmUgVFJBRF9IRUFERVIgdG8gbmV3IGZpbGUgaG9zdHMvZGVsdGE2OC5oLgotCW04OCotbW90b3JvbGEtc3lzdiosIGhvd2V2ZXIsIGRvZXMgdXNlIHB0cmFjZS1jb3JlLm8uCi0JKiBob3N0cy9kZWx0YTY4Lmg6IE5ldyBmaWxlLgotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6IGNoYW5nZSBiZmRfem1hbGxvYyB0bwotCWJmZF96YWxsb2M7IHByb3ZpZGUgcHJvcGVyIHBhcm0gYWJmZCB0byBjYWxscyB0byBiZmRfemFsbG9jLgotCi1XZWQgTm92ICAxIDEzOjUxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAoTVkodmVjKSk6IERlY2xhcmUgYmVmb3JlIHVzZS4KLQotV2VkIE5vdiAgMSAxMTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVBhc3MgaW5wdXRfYmZkLCBub3QgaW5fYmZkLCB0byBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlCRkQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9YVkVDUCk6IERlZmluZS4KLQkoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBCRkQgaXMgbm90Ci0Jb2YgdGhlIHJpZ2h0IHR5cGUuCi0JKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogT25seSBjaGVjayB0aGUgcmVsb2Mgc3ltYm9sCi0JdGFibGUgaW5kZXggYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yIGEgYmFzZSByZWxhdGl2ZQotCXJlbG9jLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8KLQlzdGF0aWMgZnVuY3Rpb24uCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFNldAotCWZ1bGxfYW91dGhkciBmbGFnIGhlcmUuLi4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IC4uLm5vdCBoZXJlLgotCi1UdWUgT2N0IDMxIDEyOjUyOjAyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaDogIFJlbmFtZSB0byBlbGYtYmZkLmggdG8gYXZvaWQgY29uZmxpY3Qgd2l0aAotCXN5c3RlbXMgdGhhdCBoYXZlIGEgc3lzdGVtIDxsaWJlbGYuaD4uCi0JKiBNYWtlZmlsZS5pbjogR2xvYmFsbHkgcmVwbGFjZSBsaWJlbGYuaCB3aXRoIGVsZi1iZmQuaC4KLQkqIGJmZC5jLCBlbGYuYywgZWxmMzItYXJjLmMsIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsCi0JZWxmMzItaHBwYS5oLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jLAotCWVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYywgZWxmNjQtc3BhcmMuYywgZWxmY29kZS5oLCBlbGZsaW5rLmMsCi0JZWxmeHgtdGFyZ2V0Lmg6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgotCSogZWxmeHgtdGFyZ2V0Lmg6IENoYW5nZSBsaWJlbGYuaCByZWZlcmVuY2UgdG8gZWxmLWJmZC5oLgotCi1UdWUgT2N0IDMxIDE1OjMwOjA3IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZCBuZXcgcGFyYW1ldGVyIHdlYWsuICBJZgotCXNldCwgc2V0IEJTRl9XRUFLIGluIHN5bWJvbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBTZXQgd2Vha2V4dCBiYXNlZCBvbiBCU0ZfV0VBSy4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgd2Vha2V4dCBpcyBzZXQsIHBhc3MgQlNGX1dFQUsgdG8KLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIHRoYXQgdGhlIHNlY3Rpb24gdGRhdGEgcmVsb2NzCi0JYXJlIG5vdCBOVUxMIGJlZm9yZSB1c2luZyB0aGVtLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLWxpbnV4Kik6IFNldCBDT1JFRklMRSB0byB0cmFkLWNvcmUubyBhbmQKLQlkZWZpbmUgVFJBRF9IRUFERVIgYXMgaG9zdHMvYWxwaGFsaW51eC5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogaG9zdHMvYWxwaGFsaW51eC5oOiBOZXcgZmlsZS4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYXN0IHUudV9hcjAgdG8gYmZkX3ZtYSwKLQlub3QgaW50LgotCi1UdWUgT2N0IDMxIDEyOjM0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBY2NlcHQgQ19CQ09NTSBhbmQKLQlDX0VDT01NIHN0b3JhZ2UgY2xhc3Nlcy4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIHhjb2ZmX21hcmsuCi0JKHhjb2ZmX21hcmspOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbCByYXRoZXIgdGhhbgotCWRvaW5nIGl0IGJ5IGhhbmQuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEJ1aWxkIGEgLmxvYWRlciBzeW1ib2wgZm9yIGFuIGV4cG9ydCBzeW1ib2wuCi0KLU1vbiBPY3QgMzAgMTQ6NTM6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBuZXcgbGluZV9maWxlcG9zCi0JZmllbGQuCi0JKHhjb2ZmX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogVXNlIGl0LgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IGZpbmZvLmxpbmVfZmlsZXBvcy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTC4gIERvbid0Ci0JcmVsb2NhdGUgdGhlIHZhbHVlIG9mIENfREVDTC4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGJvZ3VzIEJGRF9BU1NFUlQuCi0KLVNhdCBPY3QgMjggMDE6MjU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UKLQljYWxsYmFjayBkZWNpZGUgd2hhdCBnb2VzIGluIC5yZWxvY3MuCi0JKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogT25seSBjb3B5IGFvdXRoZHIgaWYKLQl0aGVyZSBpcyBvbmUuCi0KLVNhdCBPY3QgMjggMDE6NTE6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEhhbmRsZSBjc2VjdHMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQotRnJpIE9jdCAyNyAxODoxNDozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBNb3JlIGltcHJvdmVtZW50cywgbW9zdGx5IHRvIGZpeCBoYW5kbGluZyBvZgotCWNvbnN0cnVjdG9ycyBhbmQgYSBmZXcgb3RoZXIgc3BlY2lhbCBjYXNlcy4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgYmFjayB0bwotCXplcm8sIHJldmVydGluZyB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgT2N0IDI3IDE0OjQyOjE1IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIFBPUlRJTkcsIGFvdXQtYXJtLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwKLQlhb3V0eC5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaHAzMDBic2QuYywgaTM4NmFvdXQuYwotCWkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jLCBpMzg2bHlueC5jLCBpMzg2bWFjaDMuYywKLQlpMzg2bmV0YnNkLmMsIG02OGtseW54LmMsIG04OGttYWNoMy5jLCBtaXBzYnNkLmMsIG5ld3NvczMuYywKLQluczMya25ldGJzZC5jLCBwYzUzMi1tYWNoLmMsIHJpc2NpeC5jLCBzcGFyY2x5bnguYywgc3BhcmNuZXRic2QuYzoKLQlDaGFuZ2UgUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCi0KLQkqIG02OGtuZXRic2QuYzogRGl0dG8gYXMgd2VsbCBhcyBhZGQgc3VwcG9ydCBmb3IgdGhlIG02OGs0ayBvYmplY3QKLQlmb3JtYXQuCi0KLQkqIG5ldGJzZC5oOiBEb3VibGUgZGl0dG8gKGluY2wuIG02OGs0ayBzdXBwb3J0KS4gIE5ldEJTRCdzIHRleHQKLQlzZWdtZW50cyBpbmNsdWRlcyB0aGUgYS5vdXQgaGVhZGVyLiAgU2VlIHRvIHRoYXQgdGhlIG1hZ2ljIG51bWJlcgotCSphbHdheXMqIGlzIGJpZy1lbmRpYW4uCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLWhwKi1uZXRic2QqIGNhc2UuICBDcm9zcy1wb2xsaW5hdGUgbTY4ayBhbmQKLQltNjhrNGsgTmV0QlNEIGNvbmZpZ3VyYXRpb25zLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogU2VwYXJhdGUgaTM4NiAmIG1pcHMgTmV0QlNECi0JY29uZmlndXJhdGlvbnMgZnJvbSBvdGhlciBCU0Qgb25lcy4gIERvbid0IGFzc3VtZSBERUMgaXMgdGhlIG9ubHkKLQl0aGluZyBOZXRCU0QvbWlwcyBydW4gb24uICBBZGQge202OGssbnMzMmssc3BhcmN9LSotbmV0YnNkKgotCWNvbmZpZ3VyYXRpb25zLiAgQWRkIHN1cHBvcnQgZm9yIG02OGs0ayBOZXRCU0Qgb2JqZWN0IGZvcm1hdC4KLQotCSogbGliYW91dC5oOiBBZGRlZCBNXzY4SzRLX05FVEJTRCBtYWdpYy4KLQotCSogbTY4azRrbmV0YnNkLmM6IE5ldyBmaWxlLgotCi0JKiBob3N0cy97bTY4ayxzcGFyY31uYnNkLmg6IERvbid0IGRlZmluZSBIT1NUX0JJR19FTkRJQU5fUC4KLQotCSogaG9zdHMvbmJzZC5oOiBEZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AgYWNjb3JkaW5nIHRvCi0JPG1hY2hpbmUvZW5kaWFuLmg+LgotCi0JKiBob3N0cy9taXBzbmJzZC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNiAxNDoxNjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldCBjbG9zZXIgdG8gYSB3b3JraW5nIFhDT0ZGCi0JbGlua2VyLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgZnVsbF9hb3V0aGRyLAotCXRvY19zZWN0aW9uLCBhbmQgZW50cnlfc2VjdGlvbiBmaWVsZHMuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogUmVtb3ZlIGxkcmVsX2NvdW50IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGdlbmVyYXRlCi0JZnVsbCBhLm91dCBoZWFkZXIgaWYgZnVsbF9hb3V0aGRyIGlzIHNldCBpbiB4Y29mZl9kYXRhLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYwotCWJhc2VkIG9uIHNlY3Rpb25zIHN0b3JlZCBpbiB4Y29mZl9kYXRhLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0JKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgdG8gJy4nLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW1ib2xfaW5mbyk6IElmIGZpeF92YWx1ZSBpcyBzZXQsIGZpeCB0aGUKLQl2YWx1ZSBzdG9yZWQgaW4gcmV0IHJhdGhlciB0aGFuIHJldHVybmluZyBhIHBvaW50ZXIgdmFsdWUuCi0KLVdlZCBPY3QgMjUgMjM6MTA6MzkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IFJlbW92ZSBNQUMKLQlmb3JtYXQgZm9yIG5vdy4KLQotV2VkIE9jdCAyNSAxNjoxOToyNyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgdGhlIHN0cmluZ3Mgd2l0aCBtYWxsb2MKLQlzaW5jZSB0aGV5J3JlIGZyZWUnZCBieSBmcmVlX2NhY2hlZF9pbmZvLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2ltaWxhcmx5IGZvciB0aGUgc3ltYm9sIHRhYmxlLgotCi1XZWQgT2N0IDI1IDE0OjU5OjIyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIERvbid0IG1ha2UgaGVhZGVycy4KLQotV2VkIE9jdCAyNSAxMTozMjo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBkbyBhbnl0aGluZyBpZgotCW91dHB1dF9iZmQgaXMgbm90IFN1bk9TLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuICBEb24ndCBzY2FuIHJlbG9jcyBvZgotCW5vbi1TdW5PUyBpbnB1dCBmaWxlcy4KLQotCSogeGNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2luZyBzaGFyZWQgb2JqZWN0cwotCWFuZCBnZW5lcmF0aW5nIGEgLmxvYWRlciBzZWN0aW9uLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgaW1wb3J0X2ZpbGVfaWQgZmllbGQuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGxpbmVub19jb3VudCwgZmlyc3Rfc3ltbmR4LAotCWxhc3Rfc3ltbmR4LCBhbmQgbGRyZWxfY291bnQgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaG93dG9fdGFibGUpOiBDb3JyZWN0IHJlbG9jIG5hbWVzLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgYW55IGZsYWdzIGlmIFNUWVBfUEFECi0JaXMgc2V0LgotCSogYmZkLWluLmggKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE9jdCAyNCAxNzo0NDoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHhjb2ZmbGluay5vIHRvIHBtYWNfeGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbXB3LWNvbmZpZy5pbjogQWRkIHhjb2ZmbGluay5jLm8gdG8gcG93ZXJwYy1hcHBsZS1tYWNvcy4KLQkqIGNvZmYtcG1hYy5jOiBJbmNsdWRlIGNvZmYtcnM2MDAwLmMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdHMKLQljb250ZW50cy4KLQkocG1hY194Y29mZl92ZWMpOiBVcGRhdGUgdG8gdXNlIG5ldyB4Y29mZiBzdXBwb3J0LgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTWFrZSBzdGF0aWMuCi0JKHhjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBidWYgYXMgdW5zaWduZWQgY2hhci4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhIGxvY2FsIGFzIFBUUi4KLQotCSogbXB3LW1ha2Uuc2VkOiBHZW5lcmFsaXplIHN1YmRpcl9kbyBlZGl0LgotCi1UdWUgT2N0IDI0IDEwOjI1OjAxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogSW5pdGlhbGl6ZSBhc2VjdC0+ZmlsZXBvcwotCWNvcnJlY3RseS4gIERvbid0IGluaXRpYWxpemUgYXNlY3QtPnZtYS4KLQotRnJpIE9jdCAyMCAxMzoyMzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IElmIF9iZmRfY2h1bmtzaXplIHdhc24ndCBwcmVzZXQsIHVzZQotCXNvbWV0aGluZyBhIGxpdHRsZSBsZXNzIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KLQotVGh1IE9jdCAxOSAxMzowNjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IENsZWFyICphZGp1c3RlZHAuCi0KLVdlZCBPY3QgMTggMTY6MjA6MDggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgLmJzcyBpcyBiZWZvcmUKLQkuZGF0YSB1cyB0aGF0IGFzIGRhdGFfc3RhcnQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHJlbG9jCi0JY2FsYyBjb3JyZWN0LgotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBfY29va2VkX3NpemUgb2YgZGF0YSBkaXJlY3RvcnkuCi0JKGNvZmZfc3dhcF9vdXRoZHJfb3V0KTogSGFyZHdpcmUgaW4gdmVyc2lvbiBudW1iZXIuCi0KLVdlZCBPY3QgMTggMTY6NTA6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzCi0JbWFqb3IgYW5kIG1pbm9yIHRvICpfdm5vLCBzaW5jZSB0aGUgZm9ybWVyIGFyZSBhbHNvIG1hY3JvcyBpbgotCVN1bk9TIGhlYWRlciBmaWxlcy4gIENhc3QgcmVzdWx0IG9mIGJmZF9hbGxvYyB0byBhcHByb3ByaWF0ZQotCXR5cGUuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENhc3QgdXNlZF9ieV9iZmQgdmFsdWUKLQliZWZvcmUgYXNzaWduaW5nIHRvIHNlY19kYXRhLgotCi1XZWQgT2N0IDE4IDEzOjI1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRoZSBvZmZzZXQgYXJndW1lbnQgaXMKLQlub3cgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24sIG5vdCBhYnNvbHV0ZS4KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogVXNlIHRoZSByaWdodCBzeW1ib2wgdG8KLQlnZXQgdGhlIGZpbGUgbmFtZSB3aGVuIHRoZXJlIGlzIGEgTl9TTyBkaXJlY3RvcnkgbmFtZS4gIFdoZW4KLQloYW5kbGluZyBzdGFicywgcmVtZW1iZXIgdGhhdCBzZWN0aW9uLT52bWEgd2FzIGFkZGVkIHRvIHRoZQotCW9mZnNldC4KLQotVHVlIE9jdCAxNyAxODoyNDo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogQ2FsbCBiZmRfcmVsZWFzZSwgbm90IGZyZWUuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5lZWRlZCBmaWVsZC4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlY29yZCBuZWVkZWQgb2JqZWN0cy4KLQkoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIE9jdCAxNiAxNDo0Mzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgotCi1Nb24gT2N0IDE2IDEwOjUyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCk6IFJlbmFtZSBmcm9tCi0JYmZkX2VsZl9saW5rX25lZWRlZF9saXN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmLmMsIGVsZmxpbmsuaCwgbGliZWxmLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCUFkZCBzdGFydCBhdCBBSVggbGlua2VyIHN1cHBvcnQ7IG5vIHNoYXJlZCBsaWJyYXJpZXMgeWV0LgotCSogeGNvZmZsaW5rLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChyczYwMGNvZmZfdmVjKTogVXNlIHhjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3NlY3RzIGFuZCBkZWJ1Z19pbmRpY2VzCi0JZmllbGRzLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoeGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmM6IENsZWFuIHVwIGEgYml0LgotCSh4Y29mZl9ta29iamVjdCk6IERlZmF1bHQgbW9kdHlwZSB0byAxTCwgbm90IFJFLiAgSW5pdGlhbGl6ZQotCWNwdXR5cGUsIGNzZWN0cywgYW5kIGRlYnVnX2luZGljZXMuCi0JKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgY3B1dHlwZS4KLQkoeGNvZmZfaG93dG9fdGFibGUpOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX2hvd3RvX3RhYmxlLgotCSh4Y29mZl9ydHlwZTJob3d0byk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCi0JKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX3ZlYyk6IEZvciBCRkRfSlVNUF9UQUJMRV9MSU5LLCB1c2UgX2JmZF94Y29mZiwgbm90Ci0JY29mZi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQUlYLAotCWluY3JlbWVudCBzb2ZhciBieSBTTUFMTF9BT1VUU1ogaWYgbm90IGV4ZWN1dGFibGUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQUlYLCBhbHdheXMgb3V0cHV0IGFuIGEub3V0Ci0JaGVhZGVyOyBpZiBub3QgZXhlY3V0YWJsZSwgaGVhZGVyIHNpemUgb2YgU01BTExfQU9VVFNaLgotCSogaGFzaC5jIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKTogQWRkIHhjb2ZmIGZpZWxkLgotCShfYmZkX3N0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSB4Y29mZiBmaWVsZC4KLQkoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zdHJpbmd0YWJfYWRkKTogSW4gWENPRkYgbW9kZSwgbGVhdmUgdHdvIGJ5dGVzIGZvciBsZW5ndGguCi0JKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBJbiBYQ09GRiBtb2RlLCB3cml0ZSBvdXQgbGVuZ3RoLgotCSogbGliYmZkLWluLmggKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHhjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgeGNvZmZsaW5rLmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBTZXQgU0VDX0FMTE9DLCBub3QKLQlTRUNfTk9fRkxBR1MsIGZvciAuYWNvbW1vbiBzZWN0aW9uLiAgRnJvbSBQZXRlciBTY2hhdWVyCi0JPFBldGVyLlNjaGF1ZXJAUmVnZW50LkUtVGVjaG5pay5UVS1NdWVuY2hlbi5ERT4uCi0KLVNhdCBPY3QgMTQgMjE6MzY6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkLCBjbG9uZSBmcm9tIGNvZmYtaTM4Ni5jLgotCi1GcmkgT2N0IDEzIDE3OjQ4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oIChIQVZFX1NZU19QUk9DRlNfSCk6IFVuZGVmLCB3aXRoIGNvbW1lbnQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCi0JKiBvcG5jbHMuYyAoZ2V0cGFnZXNpemUpIFshSEFWRV9HRVRQQUdFU0laRV06IERlZmluZSBhcyAyMDQ4LgotCShfYmZkX2NodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoX2JmZF9uZXdfYmZkKTogU2V0IGl0IHRvIGdldHBhZ2VzaXplKCkgaWYgbmVnYXRpdmUsIGFuZCB1c2UgaXQKLQlmb3Igb2JzdGFjayBjaHVuayBzaXplLgotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZ2V0cGFnZXNpemUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdHJhZC1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgotIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KLQotRnJpIE9jdCAxMyAxMToyMjowMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogTmV3LgotCSogY29mZi1pMzg2LmMgKGluX3JlbG9jX3ApOiBOZXcuCi0JKiBjb2ZmY29kZS5oOiBBbGx3YXlzIGluY2x1ZGUgcGVpY29kZS5oIGlmIENPRkZfV0lUSF9QRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHNldCBoYXNfcmVsb2Nfc2VjdGlvbgotCWlmIFBFX0lNQUdFLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKLQlpbl9yZWxvY19wIHRvIGRlY2lkZSBpZiByZWxvYyBzaG91bGQgYmUgZW1pdHRlZC4KLQkqIGxpYmNvZmYuaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0KTogSW5pdGlhbGl6ZSBpbl9yZWxvY19wLgotCi1XZWQgT2N0IDExIDAwOjQ5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTW92ZSB0byBjb2ZmZ2VuLmMuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBDb3B5IGZyb20gY29mZmdlbi5jLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb3JyZWN0IGNvbmRpdGlvbnMKLQl1bmRlciB3aGljaCB0eXBlIGFuZCBzaXplIGNoYW5nZSB3YXJuaW5ncyBhcmUgaXNzdWVkLgotCi1UdWUgT2N0IDEwIDE4OjMyOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogRG9uJ3QgY291bnQgbGluZSBudW1iZXJzIGZvcgotCWEgc3ltYm9sIHdoaWNoIGlzIG5vdCBpbiBhIHJlYWwgc2VjdGlvbi4KLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCi0JY29mZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBub24tc3RhdGljLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgaXQuCi0JKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBNYWtlIHN0YXRpYy4KLQkqIGxpYmNvZmYtaW4uaCAoKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IGNwdXR5cGUKLQlmaWVsZCBpbiBYQ09GRiB0ZGF0YS4KLQkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDaGVjayBpZmRlZiBSUzYwMDBDT0ZGX0MsIG5vdCBpZmRlZgotCVU4MDJST01BR0lDLCBmb3IgY2xhcml0eS4gIFRyeSB0byBzZXQgYXJjaCBhbmQgbWFjaGluZSBjb3JyZWN0bHkKLQliYXNlZCBvbiBjcHV0eXBlIHN0b3JlZCBpbiBhLm91dCBoZWFkZXIsIG9yIGluIG5fdHlwZSBvZiBpbml0aWFsCi0JLmZpbGUgc3ltYm9sLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBjcHV0eXBlIGNvcnJlY3RseSBpbiBhLm91dAotCWhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgY2FzdHMgdG8gZmlsZV9wdHIgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcCBpbiBjcHV0eXBlIGZpZWxkLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBTd2FwIG91dCBjcHV0eXBlIGZpZWxkLiAgRG9uJ3QgY2xlYXIKLQlvbGQgcmVzdjEgZmllbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjcHV0eXBlIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjcHUtcnM2MDAwLmMgKHJzNjAwMF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX3JzNjAwMF9hcmNoKTogVXNlIGl0LgotCSogY3B1LXBvd2VycGMuYyAocG93ZXJwY19jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IERlZmluZSB2YXJpb3VzIGZsYXZvdXJzIG9mIFBvd2VyUEMuCi0JKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcG93ZXJwY19jb21wYXRpYmxlLiAgUG9pbnQgYXQKLQlhcmNoX2luZm9fc3RydWN0LgotCi1UdWUgT2N0IDEwIDEwOjUwOjQ2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBSZW1vdmUgQklTT04uCi0KLVR1ZSBPY3QgMTAgMDE6Mjg6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQKLQljaGFuZ2luZyB0aGUgc2l6ZSBvciB0eXBlIGlmIHRoZSBvbGQgZGVmaW5pdGlvbiB3YXMgd2Vhay4KLQotTW9uIE9jdCAgOSAxMToyNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBBZGQgZml4X2xpbmUgZmllbGQuCi0JKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gaWYgd2UgdHJ5IHRvIHNldCB0aGUgbGluZW5vIGZpZWxkIG9mCi0JYSBzeW1ib2wgdHdpY2UuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgQ19CSU5DTCBhbmQKLQlDX0VJTkNMIGJ5IHNldHRpbmcgZml4X2xpbmUuICBGaXggQ19CU1RBVCBzeW1ib2wgdmFsdWUuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBIYW5kbGUgZml4X2xpbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogT25seSB1c2UgTl9ERUJVRyBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgZml4X3ZhbHVlIHN5bWJvbHMgaW4gYSB1c2VmdWwgZmFzaGlvbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBEZWZpbmUuCi0JKHhjb2ZmX2RhdGEpOiBEZWZpbmUuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgeGNvZmZfb2JqX2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCi0JKiBiZmQtaW4yLmgsIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX21rb2JqZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9ta29iamVjdCk6IERlZmluZS4KLQkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfVE9DIGNvbXBsYWluX29uX292ZXJmbG93IGZyb20KLQlzaWduZWQgdG8gYml0ZmllbGQuCi0JKHJzNjAwMGNvZmZfdmVjKTogQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSAucGFkIGFuZAotCS5sb2FkZXIgc2VjdGlvbnMgc3BlY2lhbGx5LgotCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIGdldCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSB0aGUgWENPRkYgdGRhdGEgaW5mb3JtYXRpb24uCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IERZTkFNSUMgYmFzZWQgb24KLQlGX1NIUk9CSiwgYW5kIGNvcHkgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZQotCVhDT0ZGIHRkYXRhIHN0cnVjdHVyZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBGX1NIUk9CSiwKLQlGX0RZTkxPQUQgYW5kIHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24uCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9OT1RfQVRfRU5EIGZvciBhIENfRVhUIG9yCi0JQ19ISURFWFQgc3ltYm9sIHdpdGggYXR0YWNoZWQgY3NlY3QgaW5mb3JtYXRpb24uCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IElmIFJTNjAwMENPRkZfQywgc3dhcAotCWluIHRoZSBvX21heGRhdGEgZmllbGQuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IElmIFJTNjAwMENPRkZfQywgc3dhcCBleHRyYSBYQ09GRiBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IERvbid0IG1vdmUgYW55IHN5bWJvbCB0byB0aGUKLQllbmQgaWYgQlNGX05PVF9BVF9FTkQgaXMgc2V0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWUgX2JmZF9yZWFkX2FyX2hkciBmaWVsZCB0bwotCV9iZmRfcmVhZF9hcl9oZHJfZm4uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9yZWFkX2FyX2hkcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyCi0JcmV0dXJuIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiBMaWtld2lzZS4KLQkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IExpa2V3aXNlLgotCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBMaWtld2lzZS4KLQotRnJpIE9jdCAgNiAxNjoxODozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dldF9uZXh0X21hcGVudCk6IFJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTCi0Jd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5LgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlc2VydmUKLQlzcGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBzaW5jZSB3ZSBkb24ndCBvdXRwdXQgdGhlbSBlaXRoZXIuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogUmVtb3ZlZC4KLQotCSogcHRyYWNlLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCi0gCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgotCi1GcmkgT2N0ICA2IDEyOjI0OjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldHVybiBmYWxzZSwgbm90Ci0JTlVMTC4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBBZGQgTlQsIGFuZAotCU1hYyBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1GcmkgT2N0ICA2IDEyOjA0OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IERvbid0IHRyeSB0byBzZXQgdXAgZmlsZQotCWF1eGVudCBpZiB0aGVyZSBpc24ndCBvbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIGZpbGUgYXV4ZW50LCB1c2UgU1lNTk1MRU4KLQlyYXRoZXIgdGhhbiBGSUxOTUxFTiBhcyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9wcmludF9hdXguCi0JKGJmZF9jb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoUlM2MDAwQ09GRl9DIHZlcnNpb24pKTogUG9pbnRlcml6ZSB0aGUKLQlzY25sZW4gZmllbGQgb2YgYW4gWFRZX0xEIGNzZWN0IGF1eCBlbnRyeS4KLQkoY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHBvaW50ZXJpemUgc2NubGVuIGZpZWxkOyBub3cgZG9uZQotCWluIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYWxsIGJmZF9jb2ZmX3ByaW50X2F1eC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbiBBSVgsIGNsZWFyIEZfUkVMRkxHCi0JaWYgdGhlcmUgYXJlIHN5bWJvbHMsIGZvciBuYXRpdmUgQUlYIGxkIGNvbXBhdGliaWxpdHkuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogRGVmaW5lIGFzIGEgZnVuY3Rpb24gaWYgUlM2MDAwQ09GRl9DCi0Jb3IgSTk2MCwgYW5kIGFzIDAgb3RoZXJ3aXNlLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hhbmdlIHBhcmFtZXRlcnMgIHRvIHRha2UKLQlzeW1ib2wgcG9pbnRlciBpbnN0ZWFkIG9mIHR5cGUgYW5kIGNsYXNzLCBhbmQgdG8gdGFrZSBhdXggaW5kZXguCi0JQ2FsbCBfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayBpZiBpdCBpcyBkZWZpbmVkLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IEFsd2F5cyBjYWxsIGNvZmZfcG9pbnRlcml6ZV9hdXguCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWxsIGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLXJzNjAwMC5jOiBBZGQgZnVsbCBzdXBwb3J0IGZvciBBSVggYXJjaGl2ZXMuICBSZXdyaXRlIG9sZAotCXJlYWQtb25seS9ob3N0LW9ubHkgc3VwcG9ydC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQ19ISURFWFQgc3ltYm9scyB0byBiZQotCUJTRl9MT0NBTC4KLQkoT1RIRVJfR0xPQkFMX0NMQVNTKTogRG8gbm90IGRlZmluZSB0byBiZSBDX0hJREVYVCBpZgotCVJTNjAwMENPRkZfQy4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQuICBNb2RpZnkKLQlCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGFjY29yZGluZ2x5LgotCSogbGliYmZkLWluLmggKF9iZmRfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZS4KLQkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IERlY2xhcmUuCi0JKF9iZmRfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCBjYWxsZXJzIG9mIF9iZmRfc25hcmZfYXJfaGRyIHRvIGNhbGwKLQlfYmZkX3JlYWRfYXJfaGRyIGluc3RlYWQuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFJlbmFtZSBmcm9tIF9iZmRfc25hcmZfYXJfaGRyLgotCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmVuYW1lIGZyb20KLQljb21wdXRlX2FuZF93cml0ZV9hcm1hcC4gIE1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYWxsIF9iZmRfcmVhZF9hcl9oZHIgcmF0aGVyCi0JdGhhbiBfYmZkX3NuYXJmX2FyX2hkci4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfYXJfaGRyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogaWVlZS5jIChpZWVlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBPY3QgIDUgMTQ6MDQ6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5jIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IElmIHN5bXB0ciBpcwotCXplcm8sIHRoZXJlIGFyZW4ndCBhbnkgc3ltYm9scywgZXZlbiBpZiBuc3ltcyBpcyBzZXQuCi0KLVRodSBPY3QgIDUgMTE6NDU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGFkanVzdF9oZWFkZXJzCi0JZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCi0Jc2VjdGlvbnMsIGFuZCBzZXQgc3R5cCBjb3JyZWN0bHkgZm9yIHRoZW06IC5nb3QsIC5oYXNoLCAuZHluYW1pYywKLQkubGlibGlzdCwgLnJlbC5keW4sIC5jb25mbGljLCAuZHluc3RyLCAuZHluc3ltLCAuY29tbWVudC4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhIHNlY3Rpb24KLQl0eXBlcy4KLQkoZWNvZmZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgotCVNvcnQgdGhlIHNlY3Rpb25zIGJ5IFZNQSBiZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZW0uICBQdXQgdGhlCi0JZmlyc3Qgbm9uIFNFQ19BTExPQyBzZWN0aW9uIG9uIGEgbmV3IHBhZ2UuICBQdXQgZXZlcnkgU0VDX0FMTE9DCi0Jc2VjdGlvbiBvbiBhbiBhcHByb3ByaWF0ZSBib3VuZGFyeSB3aXRoaW4gdGhlIHBhZ2UuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQotCXNlY3Rpb24gdHlwZXMgd2hlbiBpbmNyZW1lbnRpbmcgdGV4dF9zaXplIGFuZCBkYXRhX3NpemUuICBDYWxsCi0JYWRqdXN0X2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9oZWFkZXJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhZGp1c3RfaGVhZGVycyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IFJlc3RvcmUgZmlsZSBpbmNvcnJlY3RseSBkZWxldGVkIG9uIFNlcCA2LgotCi1XZWQgT2N0ICA0IDE4OjE1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9WRVJTSU9OXzEpOiBVc2UgQ09SRV9WRVJTSU9OXzEgaW5zdGVhZAotCW9mIEFMVEVSTkFURV9BSVhfQ09SRV9GT1JNQVQuCi0JKiBjb25maWd1cmUuaW4gKGFpeDQpOiBObyBsb25nZXIgbmVlZCBDT1JFX0ZMQUdTLgotCSogY29uZmlndXJlOiBVcGRhdGVkLgotCi1XZWQgT2N0ICA0IDE1OjM2OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTlMzMmsgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogYW91dHguaCAoTVlfZmluYWxfbGlua19yZWxvY2F0ZSwgTVlfcmVsb2NhdGVfY29udGVudHMpOiBOZXcKLQltYWNyb3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0LAotCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQ2FsbCB0aGVtIGluc3RlYWQgb2YgX2JmZF8qCi0JdmVyc2lvbnMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IE5ldyBtYWNybywgZGVmYXVsdHMKLQl0byB6ZXJvLgotCShiYWNrZW5kX2RhdGEpOiBVc2UgaXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgemVyby4KLQotCSogYW91dC1uczMyay5jIChDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKTogTmV3IG1hY3JvLgotCShNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSBmb3IgS0VFUElULCBkb24ndCBjYWxsIHN0b2kuCi0KLQkqIG5zMzJrbmV0YnNkLmM6IEluY2x1ZGUgYmZkLmguCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgbWFjcm9zLgotCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWNsYXJlIGZ1bmN0aW9uIHRvby4KLQkqIHBjNTMyLW1hY2guYyAoc2V0X3NpemVzKTogRG9uJ3QgZGVjbGFyZS4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogRGVmaW5lLgotCShiYWNrZW5kX2RhdGEsIE1ZX2JhY2tlbmRfZGF0YSk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnLmJmZDogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLSotbGl0ZXMqIGxpa2UgbnMzMmstKi1uZXRic2QqLgotCi0JKiBob3N0cy9uYnNkLmg6IFN3YXAgb3JkZXIgb2Ygc3lzL3ZtcGFyYW0uaCBhbmQgc3lzL3BhcmFtLmgsIHRvCi0JY29tcGlsZSBvbiBsaXRlcy4KLQotV2VkIE9jdCAgNCAxNDoxNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVzdG9yZSBzZXR0aW5nCi0JZl90aW1kYXQgdG8gMCwgZGVsZXRlZCBvbiBBdWd1c3QgMjIuCi0KLVR1ZSBPY3QgIDMgMTY6Mjg6MzIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLAotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsCi0JY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWZkZWYgdG8gYWxsb3cgb3ZlcnJpZGVzLgotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcKLQkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFN3YXAgYnNzIHNpemUgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc29tZSBuZXdsaW5lcy4KLQotVHVlIE9jdCAgMyAxMTo1MzowNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMuCi0KLU1vbiBPY3QgIDIgMTQ6MDg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGxldCBhIHdlYWsKLQlkeW5hbWljIHN5bWJvbCBvdmVycmlkZSBhIGNvbW1vbiBzeW1ib2wuICBEb24ndCBjaGFuZ2UgdGhlIHNpemUgb3IKLQl0eXBlIGlmIHRoZXkgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90IGEgZGVmaW5pdGlvbi4KLQlXYXJuIGlmIHRoZSBzaXplIG9yIHR5cGUgY2hhbmdlcy4KLQotU3VuIE9jdCAgMSAwMTozNDo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIG9yCi0Jc3ltYm9sCXN0cmluZ3MuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIHRoZW0gaGVyZS4gIFBsYWNlIHRoZW0gYWZ0ZXIgdGhlCi0Jc3Vic3BhY2UgZGF0YSwgYnV0IGJlZm9yZSB0aGUgcmVsb2NzLgotCi1GcmkgU2VwIDI5IDExOjAxOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBKdXN0IHBhc3MgZmFsc2UsIG5vdAotCWluZm8tPnNoYXJlZF9saWJyYXJ5LCB0byBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3Qgd2FybiBhYm91dCBhIHJlbG9jIGluIHRoZSAudGV4dAotCXNlY3Rpb24uCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBSZW1vdmUgLnRleHQgc2VjdGlvbiBhc3NlcnRpb24uCi0KLVRodSBTZXAgMjggMTg6NDg6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgcG93ZXJwYy0qLW1hY29zKiwgcG93ZXJwYy0qLW1wdyouCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogQWRkIHBtYWNfeGNvZmZfdmVjIGNhc2UuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1wbWFjLm8uCi0JKiBjb2ZmLXBtYWMuYzogTmV3IGZpbGUsIFBvd2VyTWFjIFhDT0ZGIHN1cHBvcnQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCBQb3dlck1hYyBjYXNlLgotCSogdGFyZ2V0cy5jIChwbWFjX3hjb2ZmX3ZlYyk6IERlY2xhcmUuCi0KLQkqIG1wdy1jb25maWcuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCi0JYXV0b2NvbmYtYmFzZWQgY29uZmlndXJ5LgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4Ci0JbWFrZWZpbGUgaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIGhvc3RzL21wdy5oOiBSZW1vdmUuCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oOiBJZiBNUFcsIGluY2x1ZGUgdGhlIGZpbGUgdGhhdCBkZWZpbmVzCi0JdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMsIHRoZW4gZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVELgotCi1UaHUgU2VwIDI4IDE3OjA2OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfZ2V0X3N5bXRhYik6IFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCi0JKiBvcG5jbHMuYyAoYmZkX2ZkcGVucik6IENoYW5nZSBXSU4zMiByZXN0cmljdGlvbiB0byBXSU5HREIuCi0KLVRodSBTZXAgMjggMTU6MzA6NDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29mZi1wcGMuYzogUmVmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGdudSBjb252ZW50aW9ucwotCSAgICAgICAgICAgICAgUmVtb3ZlZCBpcnJlbGV2YW50ICJpZiAwIiBjb2RlCi0KLVRodSBTZXAgMjggMTE6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IFRyZWF0IHNlY29uZGFyeSBzeW1ib2xzIGFzIHdlYWsKLQlzeW1ib2xzIHJhdGhlciB0aGFuIGFzIGluZGlyZWN0IHN5bWJvbHMuCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGFib3V0Ci0Jc2Vjb25kYXJ5IHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IE1ha2Ugc3VyZSB0aGF0IHRoZSBhbGlnbm1lbnQKLQlvZiAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucyBpcyBubyBsYXJnZXIgdGhhbiAyLgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNoYW5nZQotCWJmZF9saW5rX2hhc2hfY29tbW9uIHRvIGJmZF9saW5rX2hhc2hfbmV3LCBzaW5jZSBpdCBtYXkgYmUgb24gdGhlCi0JdW5kZWYgbGlzdC4KLQkoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBwdXQgX19EWU5BTUlDIGluIHRoZQotCWR5bmFtaWMgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IEhhbmRsZSByZWxvY3MgY29ycmVjdGx5IHdoZW4gY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgX19EWU5BTUlDIHN5bWJvbCBhcwotCXdyaXR0ZW4gZXZlbiBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFVzZSBwbHRfb2Zmc2V0IGZvciB0aGUgYWRkcmVzcyBvZgotCXRoZSBqdW1wIHRhYmxlIHJlbG9jLiAgQWRkIGFuIGFzc2VydGlvbi4gIFVzZSBSRUxPQ19KTVBfU0xPVAotCXJhdGhlciB0aGFuIHRoZSBjb25zdGFudCAyMi4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEhhbmRsZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgR09UIHRvCi0JemVybyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBfX0RZTkFNSUMsCi0Jd3JpdGUgaXQgb3V0IGF0IHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0uby4KLQotVGh1IFNlcCAyOCAwMDo1ODowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBhcm0tKi1jb2ZmLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCi0JKiB0YXJnZXRzLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IEFsd2F5cyBkZWZpbmUuCi0KLVdlZCBTZXAgMjcgMTA6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF9maW5kX3RhcmdldCk6IFJlbW92ZSBkZWJ1Z2dpbmcgY29kZS4KLQotV2VkIFNlcCAyNyAwNzoyMzozOSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb2ZmLXBwYy5jLCBwZS1wcGMuYywgcGVpLXBwYy5jOiBJbml0aWFsIGJmZCBmb3IgY29mZi9QRQotICAgICAgICBzdXBwb3J0IG9uIHBvd2VycGMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgKi1wcGMgZmlsZXMKLQkqIGNvZmZjb2RlLmg6IHBwYyBNQUdJQywgYW5kIHVzZSBwZWljb2RlLmggcmF0aGVyIHRoYW4gY29mZnN3YXAuaCB0bwotICAgICAgICBhbGxvdyBwZSBiYXNlZCAubydzIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIHRvb2xzIG9uIHBwYy9OVAotCSogY29uZmlnLmJmZDogYWRkZWQgcG93ZXJwY1tsZV0tW3BlfHdpbm50XSBjb25maWcgc3VwcG9ydAotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IGFkZGVkIGJmZF9wb3dlcnBjW2xlXV9wZVtpXV92ZWMKLQkqIHBlaWNvZGUuaDogQWRkZWQgbW9yZSBzZWN0aW9uIGZsYWdzIGZvciBQRSBvbiBwcGMKLQkgICAgICAgICAgICAgQWRkZWQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IHRvIGFsbG93IHBlaWNvZGUuaCB0byBiZQotCQkgICAgIHVzZWQgZm9yIG5vbi1pbWFnZSBQRSBmaWxlcyBvbiBwcGMuCi0JCSAgICAgQ2hlY2sgZm9yIGltYWdlLCBvciBub3QsIGJlZm9yZSBjb3B5aW5nIHBlX29wdGhkcgotCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgYmZkJ3MKLQkqIHRhcmdldHMuYzogUmVtb3ZlZCB0d28gaW5hY3RpdmUgYmZkcyB0aGF0IHNob3VsZG4ndCBoYXZlIG1hZGUgaXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmFyLgotCi1UdWUgU2VwIDI2IDE0OjA2OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19yZWxvY190eXBlKTogUmVuYW1lIGZyb20gcmVsb2NfdHlwZSwgYW5kIHVzZQotCWV4cGxpY2l0IHZhbHVlcyB0byBpbml0aWFsaXplIGFsbCByZWxvY3MuICBDaGFuZ2UgYWxsIHVzZXJzLgotCShwcGNfZWxmX2JydGFrZW5faW5uZXIpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGJyYW5jaCBwcmVkaWNpdGlvbgotCXJlbG9jcy4KLQkocHBjX2VsZl9icnRha2VuX3JlbG9jKTogRGl0dG8uCi0JKHBwY19lbGZfaG93dG9fcmF3KTogVXNlIG5ldyBmdW5jdGlvbnMuICBNYWtlIHN1cmUgYWxsIHVuc3VwcG9ydGVkCi0JcmVsb2NzIHVzZSBwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gZXJyb3IKLQluZWVkcyB0byBiZSByZXBvcnRlZC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogU3VwcG9ydCBicmFuY2ggcHJlZGljdGlvbiByZWxvY3MuCi0KLVR1ZSBTZXAgMjYgMTI6NDg6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IFJlbW92ZSBcbiBmcm9tIHN0cmluZyBwYXNzZWQgdG8KLSAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgotCi0JKiBjb2ZmLWkzODYuYzogKFRXT19EQVRBX1NFQ1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgX2JmZF9tYWtlX3NlY3Rpb25faG9vay4KLQkoYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWZpbmUuCi0JKGNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCi0JKHNlY190b19zdHlwX2ZsYWdzKTogUmVtb3ZlIFRXT19EQVRBX1NFQ1MgY2FzZS4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBEb24ndCBpbml0aWFsaXplIG1ha2Vfc2VjdGlvbl9ob29rCi0JZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEp1c3QgY2FsbAotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5LCBub3QgYmZkX21ha2Vfc2VjdGlvbiBvcgotCWJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWNsYXJlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBEb24ndCBpbml0aWFsaXplCi0JbWFrZV9zZWN0aW9uX2hvb2sgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBzdHVmZgotCXBvaW50ZXJzIGludG8gdmFsdWUgZmllbGQgZm9yIHdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHM7IGp1c3QKLQlsZWF2ZSB0aGUgdmFsdWUgZmllbGQgYWxvbmUuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFVzZSBuZXh0IHN5bWJvbCBmb3IKLQl3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzLCByYXRoZXIgdGhhbiBsb29raW5nIGluIHN5bWJvbCB2YWx1ZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZSBpbmRpcmVjdF9wdHJfcHRyCi0JcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGluZGlyZWN0Ci0Jc3ltYm9sczsgaXQgZGlkbid0IHdvcmsgYW55aG93LgotCShfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZSBpbmRpcmVjdF9wdHIgdmFyaWFibGUuCi0JKiBzeW1zLmM6IENoYW5nZSBjb21tZW50cyBhYm91dCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDI1IDE2OjA0OjA5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIGFsbCAxNC1iaXQgYnJhbmNoIHJlbG9jcywKLQlnbyBiYWNrIHRvIHRlbGxpbmcgdGhlIHRvb2xzIHRoaXMgcmVsb2Mgb3BlcmF0ZXMgb24gMzIgYml0cy4KLQotTW9uIFNlcCAyNSAxMTo0ODowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9jYWxsYmFjayk6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIKLQlyYXRoZXIgdGhhbiBhIGRpcmVjdCBmcHJpbnRmLgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2JhZF9ieXRlKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IExpa2V3aXNlLiAgQWxzbyBjaGFuZ2UgZmlsZSB0byBiZSBjb25zdC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYXNzZXJ0KTogRGVjbGFyZSBmaXJzdCBwYXJhbWV0ZXIgY29uc3QuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IHJldHVybmluZwotCWJmZF9yZWxvY19vdmVyZmxvdyBpcyBlbm91Z2guCi0JKiBjb2ZmLWg4MzAwLmMgKHJ0eXBlMmhvd3RvKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IGp1c3QgYWJvcnQuCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2dldF9saW5lbm8pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0byk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBMaWtld2lzZS4KLQkoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlICNpZiAwIHNlY3Rpb25zLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsaW5lX2J1ZiBmaWVsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBSZW1vdmUgc3RhdGljcyBidWZmZXIKLQlhbmQgZmlsZW5hbWVfYnVmZmVyLiAgSW5zdGVhZCwgdXNlIGEgbWFsbG9jIGJ1ZmZlciBzdG9yZWQgaW4gdGhlCi0JbmV3IGxpbmVfYnVmIGZpZWxkLiAgUmVtb3ZlIGxlbmd0aCByZXN0cmljdGlvbnMuCi0KLQkqIGNvZmZnZW4uYyAoc3RyaW5nX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBBZGQgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQlhbmQgZGVidWdfc3RyaW5nX3NpemVfcCBwYXJhbWV0ZXJzLiAgVXNlIHRoZW0gaW5zdGVhZCBvZiB0aGUKLQlnbG9iYWwgdmFyaWFibGVzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCwgY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEFkZCBsb2NhbCB2YXJpYWJsZXMgdG8gcmVwbGFjZSByZW1vdmVkCi0JZ2xvYmFsIHZhcmlhYmxlcy4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIG9mZnNldCwgaSwKLQlmdW5jdGlvbiwgYW5kIGxpbmVfYmFzZSBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2Ugc2VjdGlvbiB0ZGF0YSB0byBjYWNoZQotCWluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiB1c2luZyBzdGF0aWMgdmFyaWFibGVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IEFkanVzdCBvZmZzZXRzIGluIGFuIE5NQUdJQwotCWZpbGUuICBGcm9tIFBldGVyIERlV29sZiA8cGxkQGFtdC50YXkxLmRlYy5jb20+LgotCi0JKiBpbml0LmMgKGluaXRpYWxpemVkKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoYmZkX2luaXQpOiBEb24ndCBib3RoZXIgc2V0dGluZyBpbml0aWFsaXplZC4KLQkoYmZkX2NoZWNrX2luaXQpOiBSZW1vdmUuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogRG9uJ3QgY2FsbCBiZmRfY2hlY2tfaW5pdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1TYXQgU2VwIDIzIDAxOjIyOjIzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZQotCXNpemUgZm9yIGZ1bGwgY29yZSBkdW1wcy4gQ29weSBjb3JlIGZpbGUgaGVhZGVyIHRvIHByaXZhdGUgZGF0YS4KLQkocnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLAotCXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogIE5ldyBmdW5jdGlvbnMgdG8gZXh0cmFjdAotCXRoZSBmaWxlIG5hbWUgYW5kIHRlcm1pbmF0aW5nIHNpZ25hbCBmcm9tIHRoZSBjb3JlIGZpbGUuCi0JKiBjb2ZmLXJzNjAwMC5jOiAgVXNlIHRoZW0uCi0KLUZyaSBTZXAgMjIgMTc6NDQ6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ2hhbmdlIGFyY2ggaW5mbyB0byBiZSBjb25zdCwgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLgotCSogYXJjaHVyZXMuYzogUmVpbmRlbnQgbWFueSBmdW5jdGlvbnMuICBDaGFuZ2UgQ09OU1QgdG8gY29uc3QuCi0JKGJmZF9hcmNoX2luZm9fdHlwZSk6IE1ha2UgYXJjaF9uYW1lIGNvbnN0LiAgUmVtb3ZlIGRpc2Fzc2VtYmxlOwotCW5vdGhpbmcgc2V0IGl0IGFueWhvdy4gIE1ha2UgbmV4dCBjb25zdC4KLQkoYmZkX2FyY2hfaW5mb19saXN0KTogUmVtb3ZlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IFJlbmFtZSBmcm9tIGFyY2h1cmVzX2luaXRfdGFibGUuICBDaGFuZ2UgZnJvbQotCWEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYSB0YWJsZSBvZiBiZmRfYXJjaF9pbmZvX3R5cGUKLQlzdHJ1Y3R1cmUgYWRkcmVzc2VzLgotCShiZmRfc2Nhbl9hcmNoKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKGJmZF9sb29rdXBfYXJjaCk6IExpa2V3aXNlLgotCShiZmRfc2V0X2FyY2hfaW5mbyk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgYQotCWNvbnN0IHBvaW50ZXIuCi0JKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogTWFrZSBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCwgYmZkX2FyY2hfbGlua2luKTogUmVtb3ZlLgotCShiZmRfZ2V0X2FyY2hfaW5mbyk6IFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfYXJjaF9pbml0LgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTWFrZSBhcmNoX2luZm8gY29uc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogUHV0ICYgYmVmb3JlIGV2ZXJ5dGhpbmcgaW4gJHNlbGFyY2hzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY3B1LSouYzogQ2hhbmdlIGJmZF8qX2FyY2ggZnJvbSBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzCi0JYmZkX2FyY2hfbGlua2luIHRvIGEgY29uc3Qgc3RydWN0dXJlLgotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogTWFrZSBhcmNoIGNvbnN0LgotCi1GcmkgU2VwIDIyIDE2OjIzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCByZWxvY2F0aW9ucyB0byBzdXBwb3J0IGFsbCBvZgotCVBvd2VyUEMgVi40LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIGN1cnJlbnQgZHJhZnQuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogTWFyayAxNCBiaXQgcmVsb2NzIGFzIHNob3J0IHNpemVkIGFuZCBQQwotCXJlbGF0aXZlLiAgVXBkYXRlIG5hbWVzIHRvIGN1cnJlbnQgVi40IGRyYWZ0LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSByZWxvY2F0aW9ucyB0byBtYXRjaCBkcmFmdC4KLQotVGh1IFNlcCAyMSAyMTo1MzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsbG93IG1vZHVsZXMKLQljb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZCB3aXRoIGVpdGhlciBub3JtYWwKLQltb2R1bGVzIG9yIC1tcmVsb2NhdGFibGUgbW9kdWxlcy4KLQotV2VkIFNlcCAyMCAxMjowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYXIgdGhlIHZzdGFtcCBmaWVsZAotCWluIHRoZSBhLm91dCBoZWFkZXIuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogRG9uJ3Qgc2V0IHJfZXh0ZXJuIGZvcgotCWEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgZXZlbiBpZiBpdCdzIG5vdCBhIHNlY3Rpb24uCi0KLVR1ZSBTZXAgMTkgMTc6MDI6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW1vdmUgdW51c2VkIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGFsaWduX3Bvd2VyX21pbi4KLQotVHVlIFNlcCAxOSAxNDowMjoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogR2V0IHNpemVzIGZvciBCU1MgcmlnaHQuCi0KLU1vbiBTZXAgMTggMTQ6MzU6MDEgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBuYXRpdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTUgMTA6MjQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBtZXJnZSBjb21tb24gdHlwZXM6Ci0JKiBjb2ZmbGluay5jIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkZWJ1Z19tZXJnZSBmaWVsZC4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIGFuZCBmcmVlIGRlYnVnX21lcmdlIHRhYmxlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCBhbmQgdW5pb24KLQl0eXBlcy4KLQotVGh1IFNlcCAxNCAxNDo1Mzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDb252ZXJ0IGk5NjAgQ09GRiB0byB1c2UgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBVc2UgYSBjb2ZmX3NlY3Rpb25fZGF0YQotCXN0cnVjdHVyZSB0byBzdG9yZSB0aGUgc3ltYm9sIGJlaW5nIHVzZWQuCi0JKGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGNhbGxiYWNrIGZ1bmN0aW9uCi0JX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCi0JKGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY29mZl9zdGFydF9maW5hbF9saW5rLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTWFrZSBnbG9iYWxseQotCXZpc2libGUuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FsbCBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIGlmIHRoZQotCWZ1bmN0aW9uIGNhbGxiYWNrIGlzIG5vdCBOVUxMLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluIChpY29mZl9iaWdfdmVjKTogQWRkIGNvZmZsaW5rLm8uCi0JKGljb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAxMyAxNzozODoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbi1pbmZvKTogUmVtb3ZlIGV4dHJhbmVvdXMgdGFiIGZyb20gbGluZQotCWZvbGxvd2luZyBhY3Rpb24uCi0KLVdlZCBTZXAgMTMgMTM6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRmFpbCBpZiBhIHNlY3Rpb24gd2l0aCBubwotCWNvbnRlbnRzIGhhcyByZWxvY3MuCi0KLVRodSBTZXAgMTIgMTI6NDU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBLZWVwIHRoZQotCXJhdyBzaXplIHNhZmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtZW1iZXIgaWYgaXQncyBhIHJlbG9jYXRhYmxlCi0JZmlsZS4KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3IG1lbWJlciAnaGFzX3JlbG9jX3NlY3Rpb24nCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IENsZWFyIG5vdC1yZWxvYyBmbGFnCi0JaWYgcmVsb2NhdGFibGUgZmlsZS4gU3dhcCBvdXQgc2F2ZWQgcmF3IHNpemUuCi0KLVR1ZSBTZXAgMTIgMTI6MTQ6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbmFtZSBmcm9tIGRvX3JlYWxjbGVhbi4KLQkobWFpbnRhaW5lci1jbGVhbik6IFJlbmFtZSBmcm9tIHJlYWxjbGVhbiwgcGFzc2luZwotCW1haW50YWluZXItY2xlYW4gZG93biB0byBzdWJkaXJlY3RvcmllcywgYnV0IGxlYXZlIHJlYWxjbGVhbiBhcyBhCi0Jc3lub255bS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBzeW1ib2wgbmFtZSB0bwotCXdhcm5pbmcgY2FsbGJhY2suCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBjb25maWcuaCBmcm9tIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogQ2FsbCBuZXcgZnVuY3Rpb24KLQlzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycy4gIFJldHVybiB0aGUKLQlkeW5hbWljIHN5bWJvbCB0YWJsZSB0byB0aGUgY2FsbGVyLgotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IGFkZF9keW5hbWljX3N5bWJvbHMKLQljYWxsYmFjayB0byBvdmVycmlkZSB0aGUgc3ltYm9scyBiZWluZyByZWFkLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMKLQl0byBhZGRfZHluYW1pY19zeW1ib2xzIGNhbGxiYWNrLgotCi0JRXh0ZW5zaXZlIG1pbm9yIGNoYW5nZXMgdG8gYXZvaWQgdmFyaW91cyBnY2Mgd2FybmluZ3MuICBBbHNvOgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIGNvZmYtYXJtLm8uCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF9pbmZvX3R5cGUpOiBDaGFuZ2UgbWFjaCBmaWVsZCBmcm9tIGxvbmcgdG8KLQl1bnNpZ25lZCBsb25nLgotCShiZmRfbG9va3VwX2FyY2gpOiBDaGFuZ2UgbWFjaGluZSBwYXJhbWV0ZXIgZnJvbSBsb25nIHRvIHVuc2lnbmVkCi0JbG9uZy4KLQotTW9uIFNlcCAxMSAxMDo1NTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IEZpeCBCRkRfQVNTRVJUOiBpdCdzIE9LIHRvIGZpbmQKLQlhIHN5bWJvbCB3aXRoIGEgbm9uLXplcm8gcGx0X29mZnNldC4KLQotRnJpIFNlcCAgOCAxMTo0NzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoYWxpZ25fZmlsZV9wb3NpdGlvbik6IFJlbW92ZTsgbm90IHVzZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBjaGVjayBmb3IgPHN5cy9wcm9jZnMuaD4gb24gYSBuYXRpdmUgc3lzdGVtLAotCWFuZCBtYWtlIHN1cmUgaXQgZGVmaW5lcyBwcnN0YXR1c190LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgU2VwICA3IDEyOjQ4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IG02OGsgYWJvcnQgdGVzdC4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KLQkoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IENyZWF0ZSBzdGFtcC1oIHdoZW4gcmVidWlsZGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAgNiAxNTowMDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSLiAgU3Vic3RpdHV0ZQotCUhPU1RfNjRCSVRfTE9ORy4gIENoZWNrIHRoYXQgdmFyaW91cyBoZWFkZXIgZmlsZXMgZXhpc3QuICBDaGVjawotCXRoYXQgZmNudGwgZXhpc3RzLiAgQ2FsbCBCRkRfQklOQVJZX0ZPUEVOLiAgQ2hlY2sgd2hldGhlciBtYWxsb2MKLQlhbmQvb3IgZnJlZSBuZWVkIHRvIGJlIGRlY2xhcmVkLiAgRG9uJ3QgbWFrZSBhIGxpbmsgdG8gc3lzZGVwLmguCi0JRGVmaW5lIFRSQURfSEVBREVSIGZvciB2YXJpb3VzIGhvc3RzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBteV9ob3N0LiAgQWRkIGRlZmluaXRpb25zIHRha2VuIGZyb20KLQlob3N0IGhlYWRlciBmaWxlcyBmb3IgdmFyaW91cyBlbnRyaWVzLiAgUmVtb3ZlIGVudHJpZXMgd2hpY2ggbm93Ci0JZG8gbm90aGluZy4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KLQkoUkVDT05GSUcpOiBSZW1vdmUuCi0JKExPQ0FMX0hfREVQUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChCRkRfTElCUykpOiBVc2UgJChMT0NBTF9IX0RFUFMpIHJhdGhlciB0aGFuIGxpYmJmZC5oIGFuZAotCSQoUkVDT05GSUcpLgotCSgkKEJGRF9NQUNISU5FUyksICQoQkZEX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCSgkKE9QVElPTkFMX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCShzdG1wLWJmZC5oKTogSnVzdCBzdWJzdGl0dXRlIGZvciBCRkRfSE9TVF82NEJJVF9MT05HLCByYXRoZXIgdGhhbgotCWxvb2tpbmcgdGhyb3VnaCBzeXNkZXAuaC4KLQkqIGJmZC1pbi5oIChCRkRfSE9TVF82NEJJVF9MT05HKTogRGVmaW5lOyBzZXQgYnkgTWFrZWZpbGUuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBiYXNlZCBvbiBCRkRfSE9TVF82NEJJVF9MT05HLgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBMaWtld2lzZS4KLQkoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEb24ndCBkZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhcmNodXJlcy5jLCBiZmQuYywgc3JlYy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkqIGVsZmNvcmUuaDogQ2hlY2sgSEFWRV9TWVNfUFJPQ0ZTX0ggcmF0aGVyIHRoYW4gSEFWRV9QUk9DRlMuCi0JKiBseW54LWNvcmUuYzogSW5jbHVkZSBzdHVmZiBmcm9tIG9sZCBob3N0cy9seW54LmguCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZOQ1RMIGFuZCBkZWZpbmVkIChGX0dFVEZMKSwKLQlyYXRoZXIgdGhhbiBOT19GQ05UTC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogQ2hlY2sgSE9TVF9IUFBBSFBVWCBhbmQgISBfX1NURENfXwotCXJhdGhlciB0aGFuIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUi4KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxlcnJuby5oPi4gIEluY2x1ZGUgVFJBRF9IRUFERVIgaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogaG9zdHMvKi5oOiBSZW1vdmUgYWxsIGhlYWRlciBmaWxlcyB3aGljaCBtZXJlbHkgaW5jbHVkZSwKLQlkZWNsYXJlLCBhbmQgZGVmaW5lIHRoaW5ncy4gIExlYXZlIGhlYWRlciBmaWxlcyB3aGljaCBkZWZpbmUKLQlpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdHJhZC1jb3JlLmMuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBEZWZpbmUuCi0JKEJGRF9DQ19GT1JfQlVJTEQpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfQ0NfRk9SX0JVSUxELgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDE5OjM1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogRG9uJ3QgdHJ5IHRvIGdyZXAgLi4vTWFrZWZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IERvbid0IHNldCB0aGUgYWRkZW5kIHRvIHRoZSB2YWx1ZSBvZgotCWEgZ2xvYmFsIHN5bWJvbC4KLQotVHVlIFNlcCAgNSAxMjo0ODoyNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGkzODZwZV92ZSAtPiBpMzg2cGVfdmVjLgotCi1Nb24gU2VwICA0IDE0OjAyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IEluY29ycG9yYXRlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnRzIGJ5IHNldHRpbmcKLQlzaGVsbCB2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQy4gIFN1YnN0aXR1dGUgQ0ZMQUdTLCBIREVGSU5FUyBhbmQKLQlBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgU3Vic3RpdHV0ZSBDQ19GT1JfQlVJTEQsIGNob29zaW5nIGEKLQl2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIGNvbXBpbGVkIGJ5IGEgY3Jvc3MKLQljb21waWxlci4gIERvbid0IHN1YnN0aXR1dGUgaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUgdG8gZGVmaW5lIGxvY2FsIEFDX1BST0dfQ0MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KLQkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgotCShBUik6IFNldCB0byBAQVJALgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKENDX0ZPUl9CVUlMRCk6IFNldCB0byBAQ0NfRk9SX0JVSUxEQC4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChIREVGSU5FUykgdG8gQEhERUZJTkVTQC4gIE1vdmUgJChDRkxBR1MpCi0JYWZ0ZXIgb3RoZXIgb3B0aW9ucy4KLQkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KLQkqIGNvbmZpZy8qLm1oLCBjb25maWcvUkVBRE1FOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy5iZmQ6IFJld3JpdGUgdG8gaW5jb3Jwb3JhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNYWtlZmlsZQotCWZyYWdtZW50cyBieSBzZXR0aW5nIHNoZWxsIHZhcmlhYmxlcywgcmF0aGVyIHRoYW4gbWVyZWx5IHJldHVybmluZwotCXRoZSBuYW1lIG9mIGEgTWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IGNvbmZpZy5iZmQgcmF0aGVyIHRoYW4KLQlsb29raW5nIGF0IHRoZSB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuICBEb24ndCBzdWJzdGl0dXRlCi0JdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBEbyBzdWJzdGl0dXRlIFRERUZJTkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChUREVGSU5FUykgdG8gQFRERUZJTkVTQC4KLQkqIGNvbmZpZy8qLm10OiBSZW1vdmUuCi0KLU1vbiBTZXAgIDQgMDM6MTM6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IGNoYW5nZXF1b3RlIGxpbmVzIGFyb3VuZCAiaVszNDVdODYiIHBhdHRlcm5zCi0Jc2VjdGlvbiBvZiBjb3JlIGZpbGUgc3VwcG9ydC4KLQotU3VuIFNlcCAgMyAxMTozMTo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0byB1c2UgdGhlCi0JZ2VuZXJpYyB2ZXJzaW9uLgotCi1GcmkgU2VwICAxIDE3OjA4OjQwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBBZGQgSW1hZ2VCYXNlIHRvCi0JZW50cnksIHRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQuCi0KLUZyaSBTZXAgIDEgMTg6MDY6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogUmVtb3ZlICQoVERFUEZJTEVTKS4KLQkqIGNvbmZpZy9hcG9sbG8ubXQgKFRERVBGSUxFUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9SRUFETUU6IFVwZGF0ZS4KLQotCSogY29uZmlndXJlLmluOiBGb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgc2V0IENPUkVGSUxFIGFuZAotCUNPUkVGTEFHIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwgaG9zdCBuYW1lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfQ0ZMQUdTKTogQWRkIEBDT1JFRkxBR0AuCi0JKE9GSUxFUyk6IFJlcGxhY2UgJChIREVQRklMRVMpIHdpdGggQENPUkVGSUxFQC4KLQkqIGNvZmYtcnM2MDAwLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYIGZvciBjb3JlIGZpbGUKLQlzdXBwb3J0IHJvdXRpbmVzLiAgQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KLQkqIGx5bngtY29yZS5jOiBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgotCSogaTM4Nmx5bnguYzogTGlrZXdpc2UuCi0JKiBtNjhrbHlueC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYLgotCSogKi1jb3JlLmM6IENvbW1lbnQgY2hhbmdlcy4KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVQRklMRVMpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgotCSogY29uZmlnL2lyaXgzLm1oIChSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDQubWggKEhERVBGSUxFUywgUkFOTElCKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRElSSVhfQ09SRS4KLQkqIGNvbmZpZy9yaXNjb3MubWggKFJBTkxJQiwgSERFUEZJTEVTKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KLQkqIGNvbmZpZy9uY3IzMDAwLm1oIChBUl9GTEFHUywgUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL3VsdHJhMy5taCAoUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL2FpeDQubWgsIGNvbmZpZy9hbHBoYW9zZi5taCwgY29uZmlnL2FtaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9kZWx0YTY4Lm1oLCBjb25maWcvZGVsdGE4OC5taDogUmVtb3ZlLgotCSogY29uZmlnL2RweDIubWgsIGNvbmZpZy9lc2l4Lm1oLCBjb25maWcvaGFycmlzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocDMwMGJzZC5taCwgY29uZmlnL2hwcGFic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9ocHBhaHB1eC5taCwgY29uZmlnL2hwcGFvc2YubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oLCBjb25maWcvaTM4NmJzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZsaW51eC5taCwgY29uZmlnL2kzODZtYWNoMy5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZzY28ubWgsIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2kzODZ2NC5taDogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg1Lm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc2JzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL21pcHNtYWNoMy5taCwgY29uZmlnL25ld3MtbWlwcy5taDogUmVtb3ZlLgotCSogY29uZmlnL25ld3MubWgsIGNvbmZpZy9wYzUzMm1hY2gubWgsIGNvbmZpZy9yaXNjaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9yczYwMC5taCwgY29uZmlnL3JzNjAwMGx5bngubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCwgY29uZmlnL3N0cmF0dXMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taCwgY29uZmlnL3N5c3Y0Lm1oLCBjb25maWcvdGFob2UubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy92YXhic2QubWgsIGNvbmZpZy92YXh1bHQubWgsIGNvbmZpZy92YXh1bHQyLm1oOiBSZW1vdmUuCi0KLUZyaSBTZXAgIDEgMTU6MTg6NTAgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2hhbmdlIGEgRFRfSU5JVCBvcgotCURUX0ZJTkkgZW50cnkgaWYgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCi0JYW5kIHdhbnRfaGRyX2luX3NlZyBmaWVsZHMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRGVmaW5lIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogSW5pdGlhbGl6ZSBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGFuZAotCXdhbnRfaGRyX2luX3NlZy4KLQkqIGVsZi5jIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgY3JlYXRlX3Byb2dyYW1faGVhZGVycwotCWJhY2tlbmQgcm91dGluZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayB3YW50X2hkcl9pbl9zZWcgYmFja2VuZCBmaWVsZC4gIENhbGwKLQljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgcm91dGluZS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gbm9uIGFsbG9jYXRlZAotCXNlY3Rpb25zIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZS4KLQotCSogZWxmY29kZS5oIChlbGZfc3dhcF9waGRyX2luKTogTWFrZSBub24gc3RhdGljLgotCShlbGZfc3dhcF9waGRyX291dCk6IE1ha2Ugbm9uIHN0YXRpYy4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfY29sbGVjdF9zaHVmZmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAxIDEzOjIwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCB0eXBvLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBpbmRpcmVjdCBhbmQKLQl3YXJuaW5nIHN5bWJvbHMuICBJZiBhbnkgc2VjdGlvbiBpcyBuYW1lZCAuZ251Lndhcm5pbmcuWFhYLCB0cmVhdAotCXRoZSBjb250ZW50cyBhcyBhIHdhcm5pbmcgdG8gYmUgaXNzdWVkIGlmIHRoZSBzeW1ib2wgWFhYIGlzCi0JcmVmZXJlbmNlZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwganVzdAotCW91dHB1dCB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBib3RoZXIgdG8gc2V0IGJmZF9lcnJvcgotCWlmIGJmZF9oYXNoX2FsbG9jYXRlIGZhaWxzLCBzaW5jZSBpdCB3aWxsIGFscmVhZHkgYmUgc2V0LgotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGFyY2hpdmVfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGhhc2hfZW50cnlfYmZkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gd2FybmluZwotCWNhbGxiYWNrLiAgQWxsb2NhdGUgYSBuZXcgd2FybmluZyB1c2luZyB0aGUgaGFzaCB0YWJsZSBuZXdmdW5jLgotCVVzZSBiZmRfaGFzaF9yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsIHJhdGhlcgotCXRoYW4gYXNzdW1pbmcgd2UgY2FuIGNvcHkgdGhlIGZpZWxkcyB3aXRoIHN0cnVjdHVyZSBhc3NpZ25tZW50LgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX3JlcGxhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2hhc2hfcmVwbGFjZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDEgMDg6MTI6NTAgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKnZyNDMwMC0qLWVsZiogdGFyZ2V0LgotCSogY29uZmlnL21pcHNidnI0MzAwLm10OiBBZGRlZC4KLQotVGh1IEF1ZyAzMSAxNjowMDo1MyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogYmZkLWluLmggKFBFIFNUVUZGKTogRGVsZXRlZC4KLQkqIGJmZC5jICh0ZGF0YS0+cGVfb2JqX2RhdGEpOiBOZXcuCi0JKGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZi1pMzg2LmMsIGNvZmYtYXJtLmMgKGNvZmZfKi1ydHlwZV90b19ob3d0byk6IEdldCBpbWFnZSBiYXNlIGZyb20KLQluZXcgcGxhY2UuCi0JKiBsaWJjb2ZmLmgsIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IERlbGV0ZQotCShjb2ZmX21rb2JqZWN0LCBjb2ZmX21rb2JqZWN0X2hvb2spOiBDb25kaXRpb25hbGx5IGJ1aWxkLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExvb2sgaW4gbmV3IHBsYWNlLgotCShhZGRfZGF0YV9lbnRyeSwgZmlsbF9wZV9oZWFkZXJfaW5mbyk6IERlbGV0ZWQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIFBFIHN0dWZmLgotCShjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZnN3YXAuaDogUmVtb3ZlIFBFIHN0dWZmLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldy4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIHBlaWNvZGUuaDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMzEgMTE6NDk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogQWRkIGV4dGVybiAiQyIgaWYgX19jcGx1c3BsdXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb252ZXJ0IGEgcmVsb2MKLQlhZ2FpbnN0IGFuIGFic29sdXRlIHN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uCi0KLVRodSBBdWcgMzEgMDg6MDA6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jKTogRml4IGNvbW1vbiBzaXplIHByb2JsZW0uCi0JKGkzY29mZl9vYmplY3RfcCk6IERlbGV0ZS4KLQotV2VkIEF1ZyAzMCAyMDo0MToyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChkZWxldGVtZWFjb2ZmX2FybV9yZWxvYyk6IERlbGV0ZWQuCi0JKGFybTI2KTogTm90IHBhcnRpYWwgaW5wbGFjZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QKLQlkbyBwYWdlIGFsaWduaW5nIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXBkYXRlIGltYWdlIGJhc2UgY29ycmVjdGx5LgotCi1UdWUgQXVnIDI5IDEzOjUwOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKToKLQlDb21waWxlIGV2ZW4gaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogV3JpdGUKLQliYXNlIGZpbGUgaW5mbyBhcyBydmFzLgotCSogY29mZi1hcm0uYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlYWwgd2l0aCByZWxvYyAxMS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlICNpZjBlZCBjb2RlCi0JT25seSByZW1vdmUgZW1wdHkgc2VjdGlvbnMgaW4gUEUgaW5tYWdlIGZpbGVzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogcmVnZW5lcmF0ZWQuCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvKTogTmV3IGVudHJ5IGF0IDExLgotCShhcm1fcmVsb2NfdHlwZV9sb29rdXApIDogVW5kZXJzdGFuZCB0eXBlIDExLgotCSogY29mZi1pMzg2LmMgKGhvd3RvX3RhYmxlKTogZml4IG5hbWUgb2YgcnZhIHR5cGUuCi0JKGNvZmYtaTM4Nl9ydHlwZV90b19ob3d0byk6IFVuZGVyc3RhbmQgUl9JTUFHRUJBU0UgdHlwZS4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogLmVkYXRhIGlzIGRhdGEuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogR2V0IHBhZ2Ugc2l6ZSByaWdodCBmb3IgUEUuCi0JUGFnZXNpemUgaW5mbyBpcyBvbmx5IHZhbGlkIGluIFBFIGltYWdlIGZpbGVzLgotCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogRml4IGZpZWxkcy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZW5kX29mX2ltYWdlIGNhbGMuCi0JKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogUmVtb3ZlIG9ycGhhbmVkIGNvbW1lbnQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogRG9uJ3QgYWx3YXlzIGFkZCBJTUFHRV9CQVNFLgotCVN3YXAgaW4gUEUgaGVhZGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldHVwIFBFIGZsYWdzIGNvcnJlY3RseS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19SVkEpOiBOZXcgZmllbGQuCi0KLVRodSBBdWcgMjQgMTc6NDk6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgaW5jbHVkZSBsaW5lIG51bWJlcnMgZm9yCi0JYSBzZWN0aW9uIGlmIGl0cyBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCi0KLVdlZCBBdWcgMjMgMTY6NDg6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgcGFyZW50aGVzZXMgdG8gRklYCi0JZXhwcmVzc2lvbiB0byBhdm9pZCBjb21waWxlciBidWcgb24gSFAtVVggOS4wMS4KLQotV2VkIEF1ZyAyMyAwOTo0OTozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBVbmFuc2lmeS4KLQotTW9uIEF1ZyAyMSAxNzo0OToyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtKTogVHVybiBlbnVtIGludG8gI2RlZmluZXMuCi0JKGJmZF9saW5rX3BlX2luZm9fZHZhbCk6IE5ldwotCShiZmRfbGlua19zdGFja19oZWFwKTogUmVuYW1lZCBhbmQgbWFzc2FnZWQgaW50byBiZmRfbGlua19wZV9pbmZvLgotCSogYmZkLWluMi5oOiByZWJ1aWx0LgotCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZWQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWx6ZSBsaW5rX2RhdGEgaWYgbm90IHNldC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfZmluYWxfbGlua19pbmZvKTogUmVtb3ZlIHBlIHJhbmRvbW5lc3MuCi0JKGRvcmVzX2NvbSk6IFVwZGF0ZSBpbmZvIGluIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KLQkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IFVzZSB0aGUgYmZkX2xpbmtfcGVfaW5mb19kdmFsLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFJlbW92ZSBQRSBzdHVmZiwgaW5pdGlhbGl6ZQotCWNvZmZfZGF0YS0+bGlua19pbmZvLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX1thb3V0fGZpbGVoZHJdX291dCk6IFVzZSBpbmRpcmVjdCBQRSBwb2ludGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSByZWFsIGltYWdlYmFzZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUubGlua19pbmZvKTogTmV3IGZpZWxkLgotCi1Nb24gQXVnIDIxIDExOjEwOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogSWYgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSBmb2xsb3dzIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gdW5kZWZpbmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlIGFzIGRlZmluZWQsIGluIGNhc2UgaXQgdHVybnMgaW50byBhIHJlYWwKLQl1bmRlZmluZWQgcmVmZXJlbmNlIGxhdGVyIGluIHRoZSBzYW1lIGFyY2hpdmUuCi0KLVRodSBBdWcgMTcgMTY6Mjk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBDYXN0IHZhbHVlIGZvciB1c2VkX2J5X2JmZCBmaWVsZAotCXRvIFBUUiwgbm90IGNvZmZfc2VjdGlvbl90ZGF0YSBwb2ludGVyLCBzaW5jZSBQVFIgaXMgdGhlIHJlYWwgdHlwZQotCW9mIHRoZSBmaWVsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERpdHRvLgotCi1UaHUgQXVnIDE3IDE0OjQ0OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBsaW5raW5nIFNQQVJDIFN1bk9TIFBJQyBjb21waWxlZCBjb2RlLgotCSogc3Vub3MuYyAoU1BBUkNfUExUX1BJQ19XT1JEMCk6IERlZmluZS4KLQkoU1BBUkNfUExUX1BJQ19XT1JEMSwgU1BBUkNfUExUX1BJQ19XT1JEMik6IERlZmluZS4KLQkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0Ci0JZmllbGRzLgotCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBhbmQKLQlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZHMuCi0JKHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBzdW5vc19zY2FuX3JlbG9jcyBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uCi0JRGVmaW5lIF9fR0xPQkFMX09GRlNFVF9UQUJMRSBpZiBhbnl0aGluZyByZWZlcnJlZCB0byBpdC4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIFVzZQotCXBsdF9vZmZzZXQgZmllbGQ7IG9ubHkgcHV0IHN5bWJvbCBpbiAucGx0IGlmIGl0IGlzIG5vdCBkZWZpbmVkIGJ5Ci0JYSByZWd1bGFyIG9iamVjdC4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuICBIYW5kbGUgYmFzZSByZWxhdGl2ZSByZWxvY3MuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBTdG9yZSBkeW5vYmogaW4gbG9jYWwgdmFyaWFibGUuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcGx0X29mZnNldCByYXRoZXIgdGhhbgotCWNoZWNraW5nIHdoZXRoZXIgc3ltYm9sIGlzIGluIC5wbHQgc2VjdGlvbi4gIElmIHN5bWJvbCBpcyBkZWZpbmVkCi0JaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCB1c2UgU1BBUkNfUExUX1BJQ19XT1JEWzAxMl0sIGFuZCBkb24ndAotCWFkZCBhIEpNUF9UQkwgcmVsb2MuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBBZGQgY29udGVudHMgYW5kIHJlbG9jYXRpb25wIGZpZWxkcy4KLQlJZiBwbHRfb2Zmc2V0IGlzIHNldCwgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBQTFQuICBJZiB0aGlzIGlzIGEKLQliYXNlIHJlbGF0aXZlIHJlbG9jLCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIEdPVC4gIENoZWNrCi0JZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQgcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQKLQlyYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuICBEb24ndCBkaWUgaWYgLm5lZWQgYW5kIC5ydWxlcwotCXNlY3Rpb25zIHdlcmUgbm90IGNyZWF0ZWQuCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBNYXJrIFBDMTAsIFBDMjIsIGFuZCBKTVBfVEJMIGVudHJpZXMKLQlQQyByZWxhdGl2ZS4gIE1hcmsgUEMxMCBjb21wbGFpbl9vdmVyZmxvd19kb250LiAgTWFyayBQQzIyIGFuZAotCUpNUF9UQkwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBpbmZvLT5zaGFyZWQgaXMgc2V0LCBzZXQgRFlOQU1JQy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQ2FsbCBjaGVja19keW5hbWljX3JlbG9jIGZvciBhbGwKLQlyZWxvY3MuICBQYXNzIGNvbnRlbnRzIGFuZCAmcmVsb2NhdGlvbi4gIERvbid0IHdhcm4gYWJvdXQgYW4KLQl1bmRlZmluZWQgc3ltYm9sIHVudGlsIGNoZWNrX2R5bmFtaWNfcmVsb2MgaGFzIGJlZW4gY2FsbGVkLiAgRG9uJ3QKLQl3YXJuIGFib3V0IGFuIHVuZGVmaW5lZCBzeW1ib2wgZm9yIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuICBGb3IgYSBiYXNlIHJlbGF0aXZlCi0JcmVsb2MsIGFsd2F5cyB0cmVhdCByX2luZGV4IGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGNvbnRlbnRzIGFuZAotCXJlbG9jYXRpb24gYXJndW1lbnQgdG8gY2hlY2tfZHluYW1pY19yZWxvYyBlbnRyeSBwb2ludC4KLQkoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCi1XZWQgQXVnIDE2IDAxOjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlLgotCi1Nb24gQXVnIDE0IDExOjM5OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUgYSBtYWNoaW5lIG9mCi0JYmZkX21hY2hfc3BhcmMgb3IgYmZkX21hY2hfc3BhcmM2NC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uLCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGFueSBkeW5hbWljCi0Jb2JqZWN0IG1lbnRpb25zIGl0LiAgSWYgd2UgZG8gYWRkIGl0LCBtYWtlIHN1cmUgd2UgYWRkIHRoZQotCWNvcnJlc3BvbmRpbmcgcmVhbCBzeW1ib2wuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIHdoaWNoIHdlCi0JcHV0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMKLQl0byBpdC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGRvbid0IGFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYQotCWxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGFzc2VydGlvbgotCXRvIGFjY2VwdCBzeW1ib2wgd2l0aCB3ZWFrZGVmIHNldC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJhcnksIGRvbid0IGNvcHkgb3ZlciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAxMyAwMDo0MDo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9CRUdJTl9CUlRBQik6IERlZmluZS4KLQkoUl9IUFBBX0VORF9CUlRBQik6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9CUlRBQiBhbmQgUl9FTkRfQlJUQUIuCi0KLVRodSBBdWcgMTAgMTU6NTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCB0aGUgYXJyYXkgZGltZW5zaW9ucwotCXdoZW5ldmVyIHhfZmNuYXJ5IGlzIG5vdCBiZWluZyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgcmF0aGVyCi0JdGhhbiBvbmx5IGZvciBhbiBhcnJheS4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgOCAxNjozNDo1NyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIG1vc3QKLQlvZiBzcGVjaWFsIGNhc2Ugc3R1ZmYgZm9yIFBFLiAgTm93IGhhbmRsZWQgYnkgcmVsb2NzLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IFNwZWNpYWwgY2FzZSBvZiBQRSB0eXBlIDdzLgotCShob3d0b190YWJsZSk6IFR5cGUgNyBpcyBkaXIzMi1ydmEuCi0KLVR1ZSBBdWcgIDggMTA6MTU6NDMgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgYWl4NCBleHBsaWNpdGx5LgotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9EQVRBX1NJWkVfRklFTEQpOiBOZXcgbWFjcm8gdG8gZ2V0IGEgdGhlIHNpemUKLQlvZiBhIGNvcmUgZHVtcCdzIGRhdGEgc2VjdGlvbi4gIFByb3ZpZGUgYWx0ZXJuYXRlIGRlZmluaXRpb24gZm9yIGFpeDQuCi0JKFNBVkVfRklFTEQpOiBTaW1pbGFybHkgZm9yIHNhdmUgc3RhdGUgZmllbGQgKHJlZ2lzdGVyIGluZm8pLgotCShTVEFDS19FTkRfQUREUik6IFByb3ZpZGUgZGVmaW5pdGlvbiBzdWl0YWJsZSBmb3IgYWl4NC4KLQkqIGNvbmZpZy97YWl4NC5taCxhaXg0Lm10fTogTmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0JKiBob3N0cy9haXg0Lmg6IExpa2V3aXNlLgotCi1Nb24gQXVnICA3IDIzOjAzOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogQ2FzdCBpbml0aWFsaXphdGlvbnMKLQl0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEF1ZyAgNyAxNDo1MTowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9kZWNvZGVfc3ltY2xhc3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9scyBieSBjaGVja2luZwotCXRoZSBTT00gdHlwZSAoc2luY2UgdGhleSB3aWxsIHJhcmVseSBpZiBldmVyIGJlIGluIHRoZSBhYnNvbHV0ZQotCXNlY3Rpb24pLgotCi1XZWQgQXVnICA2IDA5OjEyOjUwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYzY0KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNwdS1zcGFyYy5jIChzcGFyY19hcmNoX2luZm8pOiBSZW5hbWVkIGZyb20gYXJjaF9pbmZvX3N0cnVjdC4KLQkoc3BhcmM2NF9hcmNoX2luZm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShiZmRfc3BhcmNfYXJjaCk6IExpbmsgaW4gc3BhcmM2NF9hcmNoX2luZm8uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl94eHgpOiBSZW5hbWVkIGZyb20gZWxmNjRfeHh4LgotCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lLgotCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfc3BhcmNfdmVjLgotCi1TYXQgQXVnICA1IDAwOjA0OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20gKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gLTEgb24gZXJyb3IuICBDb21wdXRlCi0JcmV0dXJuIHZhbHVlIHdpdGggc2l6ZW9mIChhcmVsZW50ICopLCBub3Qgc2l6ZW9mIChhcmVsZW50KS4KLQotV2VkIEF1ZyAgMiAxMjozMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiB0aGUgc2VjdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotCXNoX2xpbmsgZmllbGQgb2YgYSByZWxvYyBzZWN0aW9uIGlzIG5vdCBhIHN5bWJvbCB0YWJsZSwgYW5kIHRoZQotCWZpbGUgY29udGFpbnMgYSBzaW5nbGUgc3ltYm9sIHRhYmxlLCBjbG9iYmVyIHRoZSBzaF9saW5rIGZpZWxkIG9mCi0JdGhlIHJlbG9jIHNlY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQotVHVlIEF1ZyAgMSAxMDowOTowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChob3d0byByZWxvYyBBUk0yNik6IENoYW5nZSBzaXplIGZyb20gMyB0byAyLgotCShob3d0byByZWxvYyBBUk0yNkQpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAyNCAxNDoxNzo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBVc2UgdGhlIGxpbmUganVzdCBiZWZvcmUKLQl0aGUgb2Zmc2V0LCBub3QgdGhlIG9uZSBqdXN0IGFmdGVyLiAgQnJlYWsgb3V0IG9mIHRoZSBsb29wIGFmdGVyCi0JZmluZGluZyBhIGZ1bmN0aW9uIHBhc3QgdGhlIG9mZnNldCwgbm90IG1lcmVseSB3aGVuIGZpbmRpbmcgYQotCWZ1bmN0aW9uIHdpdGggYSBsaW5lIGRlZmluZWQuCi0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogV2hlbiBoYW5kbGluZyBzdGFiczoKLQljb3JyZWN0IHNldHRpbmcgb2Ygc3ltX3B0cl9lbmQgdG8gY29uc2lkZXIgc3ltYm9scyBza2lwcGVkIHdoZW4KLQlzZXR0aW5nIHN5bV9wdHI7IGRvbid0IGxlYXZlIGxvb3AgZWFybHkgdW5sZXNzIGFuIE5fRlVOIGlzIGZvdW5kCi0Jd2l0aCBhIGxhcmdlciB2YWx1ZS4KLQotCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IE1hcmsgUl9TSF9QQ0RJU1A4QlkyIGFuZCBSX1NIX1BDRElTUAotCWFzIFBDIHJlbGF0aXZlLiAgRGVzY3JpYmUgUl9TSF9JTU0xNi4gIEFkZCBlbnRyaWVzIGZvcgotCVJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIsIFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgYW5kCi0JUl9TSF9BTElHTi4KLQkoU1dBUF9JTl9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCi0JKFNXQVBfT1VUX1JFTE9DX09GRlNFVCk6IERlZmluZS4KLQkoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0JKHNoX3JlbG9jKTogQ2hhbmdlIHN5bV92YWx1ZSBhbmQgYWRkciB0byB0eXBlIGJmZF92bWEuICBTa2lwIHJlbG9jCi0JdHlwZXMgb3RoZXIgdGhhbiBSX1NIX0lNTTMyIGFuZCBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCi0JKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoc2hfcmVsYXhfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgotCShzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsCi0JX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLCBub3QgY29mZl9saW5rX2dldF9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSwgbm90IGNvZmZfcmVhZF9zdHJpbmdfdGFibGUuCi0JKGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KLQkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogVXNlIF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZS4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBVc2UgY2FjaGVkIHNlY3Rpb24gY29udGVudHMgaWYgYXZhaWxhYmxlLgotCVVzZSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IGNhbGwgYmZkX3NlZWsuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChidWlsZF9zdHJpbmdfdGFibGUpOiBSZW1vdmUuCi0JKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKLQljb2ZmX2xpbmtfZ2V0X3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAotCWNvZmZfcmVhZF9zdHJpbmdfdGFibGUgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJtbyBvbGQKLQljb2ZmX2xpbmtfZnJlZV9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scwotCXJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIHN5bWJvbHMgZGlyZWN0bHkuICBUbyBmcmVlIHRoZW0sIGNhbGwKLQlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLiAgVXNlIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSByYXRoZXIKLQl0aGFuIGJ1aWxkX3N0cmluZ190YWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAob2JqX2NvZmZfa2VlcF9zeW1zKTogRGVmaW5lLgotCShvYmpfY29mZl9rZWVwX3N0cmluZ3MpOiBEZWZpbmUuCi0JKGNvZmZfZGF0YV90eXBlKTogQWRkIGZpZWxkcyBrZWVwX3N5bXMgYW5kIGtlZXBfc3RyaW5ncy4KLQkoY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotRnJpIEp1bCAyMSAyMjozMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAotCXJlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkocHBjX2VsZl9nb3QxNl9pbm5lcik6IERpdHRvLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAyMCAxOToxOTowNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgKGlnbm9yZWQpCi0JYXJndW1lbnQuCi0JKiBlbGYzMi1ocHBhLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgSnVsIDIwIDE5OjAxOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKHNldF9hb3V0X3NlY3Rpb25fZGF0YSk6IE5ldyBtYWNyby4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fcmVsb2NzKTogVXNlIGl0LgotCi0JKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVuZGVmIEtFRVBJVCBiZWZvcmUKLQlkZWZpbmluZyBpdC4KLQotVGh1IEp1bCAyMCAxMzo0ODowMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NnY0LmggKGdldGdpZCwgZ2V0dWlkKTogIENoYW5nZSBwcm90b3R5cGVzIHRvIGJlCi0JY29tcGF0aWJsZSB3aXRoIFVuaXh3YXJlIDEueCBhbmQgVW5peHdhcmUgMi54LCBhbmQgcHJvYmFibHkgb3RoZXIKLQlpMzg2IHN2cjQgdmVyc2lvbnMgYXMgd2VsbC4KLQotVGh1IEp1bCAyMCAxMzo0MToyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFNpbmNlIGFybXBlIGFuZCBhcm1wZWkgaGF2ZSBiZWVuCi0Jc3BsaXQgaW50byBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIHZhcmlhbnRzLCBsaXN0IGFsbCBvZiB0aGVtLAotCWluc3RlYWQgb2YgdGhlIG5vdy1ub25leGlzdGFudCBhcm1wZVtpXV92ZWMuCi0KLVRodSBKdWwgMjAgMDA6MDY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogU2V0IGxtYSBiYXNlZCBvbiBwX3BhZGRyLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGJhc2VkIG9uIGxtYSwgbm90IHZtYS4KLQotV2VkIEp1bCAxOSAxNTo1MjowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCSogY29uZmlndXJlLmluIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6ICJyZWdlbmVyYXRlZCIuCi0JKiBwZS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHBlaS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHRhcmdldHMuYyAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogRGVsZXRlZC4KLQkoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYywgYXJtcGVpX2xpdHRsZV92ZWMsIGFybXBlaV9iaWdfdmVjKToKLQlBZGRlZC4KLQkqIGNvbmZpZy9hcm0tcGUubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmYXVsdCBpcyBhcm1wZV9saXR0bGVfdmVjLgotCShTRUxFQ1RfVkVDUyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KLQotV2VkIEp1bCAxOSAxMDo0NzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogQ2xlYW4gdXAgYW5kIGNvbW1lbnQuCi0JKHJfaW1tMzIpOiBSZW1vdmUuCi0JKHNoX2NvZmZfaG93dG9zKTogTmV3IHN0YXRpYyBhcnJheS4KLQkoU0hfQ09GRl9IT1dUT19DT1VOVCk6IERlZmluZS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IE1ha2UgcmVsb2NhdGlvbiBiZmRfdm1hIHJhdGhlciB0aGFuIGxvbmcuCi0JKFJUWVBFMkhPV1RPKTogUmV3cml0ZSB0byB1c2Ugc2hfY29mZl9ob3d0b3MuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBzaF9yZWxvY2F0ZV9zZWN0aW9uLgotCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU2F0IEp1bCAxNSAwMTowMjo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIGdlbmVyaWMgbTY4ayBTVlI0IGhvc3QuCi0KLUZyaSBKdWwgMTQgMTM6MTM6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChLRUVQSVQpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byB1ZGF0YS5pLgotCShLRUVQSVRUWVBFKTogUmVtb3ZlLgotCShOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApKTogQWRkIGNhc2VzIHRvIHRoZQotCWV4dGVuZGVkIHJlbG9jIHR5cGUgc3dpdGNoOiBTUEFSQ19HT1QxMCwgU1BBUkNfR09UMTMsIFNQQVJDX0dPVDIyLAotCVNQQVJDX1BDMTAsIFNQQVJDX1BDMjIsIFNQQVJDX1dQTFQzMC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCBib3RoZXIgdG8gdXNlIHN0b2kgd2hlbgotCXJldHJpZXZpbmcgS0VFUElUIHZhbHVlLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLiAgQWxzbywgb25seSBhZGQgaW4KLQlvdXRwdXQgc2VjdGlvbiBWTUEgZm9yIHNlY3Rpb24gc3ltYm9scywgYW5kIGNoZWNrIEJTRl9TRUNUSU9OX1NZTQotCXRvIGNvbnRyb2wgd2hldGhlciB0byBzZXQgcl9leHRlcm4gdG8gMS4KLQotCSogc3ltcy5jOiBGaXggY29tbWVudHMgc28gdGhhdCBgbWFrZSBpbmZvJyB3b3Jrcy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNldCBTRUNfSEFTX0NPTlRFTlRTCi0JaW4gLm1kZWJ1ZyBzZWN0aW9uLCBpbiBjYXNlIGJhY2tlbmQgbGlua2VyIGhhcyBjbGVhcmVkIGl0LgotCi1GcmkgSnVsIDE0IDExOjU4OjM0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogUmV3cml0ZSB0byB0YWtlIGp1c3Qgb25lCi0JYXJndW1lbnQsIHRoZSBmaW5hbCByZWxvY2F0ZWQgYWRkcmVzcy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBZGp1c3QgcHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIgY2FsbGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAxMyAxNzoyMjowMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hvb3NlIGEgcmVhc29uYWJsZSBmaWVsZAotCXNlbGVjdG9yIHJlbG9jYXRpb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCi1UaHUgSnVsIDEzIDEwOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENhc3QgYXJndW1lbnQgdG8gc2l6ZV90Ci0JZm9yIG1hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1lbW1vdmUuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1lbWNweSBhbmQgbWFsbG9jLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KLQkoZWNvZmZfd3JpdGVfc3ltaGRyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IExpa2V3aXNlLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UsIGZvcgotCXFzb3J0LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwKLQlmb3IgbWFsbG9jLgotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UsIGZvcgotCXJlYWxsb2MgYW5kIG1lbXNldC4KLQkoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLCBmb3IgcmVhbGxvYy4KLQkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvcgotCW1lbWNweS4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IEFkZCBwcm90b3R5cGUuICBDaGFuZ2UgYXJndW1lbnQgdHlwZXMgZnJvbQotCWludCB0byBzaXplX3QuCi0JKGJmZF9yZWFkKTogQ2FzdCByZWFsX3JlYWQgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgotCShiZmRfd3JpdGUpOiBDYXN0IGZ3cml0ZSBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCi0KLQkqIGVsZjY0LWdlbi5jIChlbGZfaW5mb190b19ob3d0byk6IEZpeCBkZWZpbml0aW9uIGZvciByZWNlbnQgZWxmLmMKLQljaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBjaGFuZ2UgeyRlbmFibGV2YWx9IHRvICR7ZW5hYmxldmFsfS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZmxpbmsuby4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcyBfcmVhZF9taW5pc3ltYm9scyBhbmQKLQlfbWluaXN5bWJvbF90b19zeW1ib2wuCi0JKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBBZGQgX3JlYWRfbWluaXN5bWJvbHMgYW5kCi0JX21pbmlzeW1ib2xfdG9fc3ltYm9sLgotCShiZmRfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE1JTklTWU1fVEhSRVNIT0xEKTogRGVmaW5lLgotCShOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBEZWNsYXJlLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoTVlfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBBbGwgdGFyZ2V0czogRGVmaW5lIHJlYWRfbWluaXN5bWJvbHMgYW5kIG1pbmlzeW1ib2xfdG9fc3ltYm9sLgotCi1XZWQgSnVsIDEyIDE3OjU1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQliZmRfYWxsb2MuCi0KLQkqIGVsZmNvZGUuaCAoc2l6ZV9pbmZvKTogRG9uJ3QgdXNlICImIiBiZWZvcmUgZnVuY3Rpb24gbmFtZXMuCi0KLVdlZCBKdWwgMTIgMDA6MTY6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogVXNlIHVuc2lnbmVkLCBub3QgdW5zaWduZWQgY2hhciwKLQlmb3IgYml0ZmllbGRzLgotCi1UdWUgSnVsIDExIDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIGNhc2UgU0hUX1JFTFtBXSwgb25seSBnZXQgdGhlCi0gICAgICAgIEJGRCBzZWN0aW9uIGZvciB0aGUgc2hfbGluayBzZWN0aW9uIGlmIGl0IGlzIGEgU1lNVEFCIHNlY3Rpb24uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IERvbid0IGJvdGhlciB0byBjaGVjawotCXRoYXQgYXJjaGl2ZXMgaG9sZCBhLm91dCBvYmplY3RzLgotCSogY2YtaTM4Nmx5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogZWxmbGluay5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdAotCWFyY2hpdmVzIGhvbGQgRUxGIG9iamVjdHMuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBhbmQKLQl0aGUgdGFyZ2V0IHdhcyBkZWZhdWx0ZWQsIGJ1dCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBhcmNoaXZlIGNhbgotCW5vdCBiZSBtYXRjaGVkIHdpdGggdGhhdCB0YXJnZXQsIHRoZW4gcmV0dXJuIGEgYmFkIGZvcm1hdCBlcnJvci4KLQotCSogZWxmNjQtc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogU2V0IGhvd3RvIGZvciBXRElTUDE2IHRvCi0JZWxmNjRfd2Rpc3AxNl9yZWxvYy4KLQkoZWxmNjRfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjY0X3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvCi0Jc3dhcF9zeW1ib2xfb3V0IGZyb20gY2hhciAqIHRvIFBUUi4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zeW1ib2xfb3V0KTogQ2hhbmdlIHR5cGUgb2YgY2RzdCBmcm9tIGNoYXIgKgotCXRvIFBUUi4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gY2FsbGluZwotCXN3YXBfc3ltYm9sX291dCByb3V0aW5lLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfc3ltKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTEgMTI6Mjk6NDkgMTk5NSAgUmljayBTbGFka2V5ICA8anJzQHdvcmxkLnN0ZC5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUKLQl0aGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLU1vbiBKdWwgMTAgMTE6NDU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBiaW5hcnkubyBhbmQgdGVraGV4Lm8uICBGcm9tIERKCi0JRGVsb3JpZS4KLQotTW9uIEp1bCAxMCAxMTowOTo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChzZXRfc3ltYm9sX2Zyb21faGFzaCk6IGJmZF9saW5rX2hhc2hfbmV3IGNhc2U6IERvbid0Ci0JYWJvcnQ7IGl0IGNhbiBoYXBwZW4gZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgd2hlbiBub3QgYnVpbGRpbmcKLQljb25zdHJ1Y3RvcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDb3JyZWN0IHR5cG86IHVzZSAhIG9uIHN0cmNtcCwKLQlub3Qgb24gc3RyaW5nLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBEb24ndCBkZWNsYXJlLgotCShQQ1JFTE9GRlNFVCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vCi0JKENGSUxFUyk6IEFkZCBjb2ZmLWFybS5jLCBwZS1hcm0uYywgcGVpLWFybS5jLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBBbGxvY2F0ZSBoYXNoIHRhYmxlCi0JdXNpbmcgYmZkX2FsbG9jLCBub3QgbWFsbG9jLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBJZiAtQnN5bWJvbGljLAotCW91dHB1dCBhIERUX1NZTUJPTElDIGR5bmFtaWMgZW50cnkuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBkb24ndCByZXF1aXJlIGEgUExUCi0JZW50cnkgZm9yIGEgbG9jYWxseSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KLQlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKLQlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgotCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQotCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8KLQl3YXJuIGFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhCi0Jc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYQotCVJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQKLQlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogUmVuYW1lIGZyb20gU0VMRUNUX1ZFQ1RPUlMuCi0JQ29ycmVjdCBlbGVtZW50cyB0byBiZSBhY3R1YWwgQkZEIHZlY3RvciBuYW1lcy4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEBmcmFnc0AuCi0KLUZyaSBKdWwgIDcgMTc6MzY6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBzeW1ib2xzIHRoYXQgYXJlCi0JbmVpdGhlciBCU0ZfRlVOQ1RJT04gbm90IEJTRl9OT1RfQVRfRU5EIGp1c3QgYmVmb3JlIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfRlVOQ1RJT04gYXMgd2VsbAotCWFzIEJTRl9OT1RfQVRfRU5ELgotCi1GcmkgSnVsICA3IDE3OjE2OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotVGh1IEp1bCAgNiAxNDozNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVydCBNYXkgMjQgcGF0Y2guCi0gICAgICAgIERvbid0IGNvcHkgUEMzMiByZWxvYyBhZ2FpbnN0IHNlY3Rpb24gaW50byBzaGFyZWQgb2JqZWN0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZGVkIGVsZmxpbmsuYy4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLCBub3QgY29uZmlndXJlLmluLgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldDsgZGVwZW5kIHVwb24gY29uZmlndXJlIGNvbmZpZ3VyZS5ob3N0Ci0JYW5kIGNvbmZpZy5iZmQuCi0KLVdlZCBKdWwgIDUgMjA6MTc6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCwgZWxmbGluay5oLCBlbGZjb2RlLmgsIGVsZi5jLCBlbGZsaW5rLmM6IE1vdmVkIHNvbWUKLSAJcHJpbWFyaWx5IHNpemUtaW5kZXBlbmRlbnQgY29kZSBmcm9tIGVsZmNvZGUuaCB0byBlbGYuYyBhbmQgbmV3Ci0gCWZpbGUgZWxmbGluay5jOyBtb3ZlZCBvdXQgb3RoZXIgY29yZS0gb3IgbGlua2VyLXJlbGF0ZWQgcm91dGluZXMKLSAJaW50byBvdGhlciBuZXcgLmggZmlsZXMgZm9yIGNsYXJpdHkuICBSZW5hbWVkIG1hbnkgcm91dGluZXMgdG8KLSAJc3RhcnQgd2l0aCBiZmRfZWxmIG9yIF9iZmRfZWxmLiAgQWRkZWQgYSBzdHJ1Y3R1cmUgb2YKLSAJc2l6ZS1kZXBlbmRlbnQgYnV0IHRhcmdldC1pbmRlcGVuZGVudCBpbmZvIHRvIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGZsaW5rLm8uICBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbGliZWxmLmg6IFVwZGF0ZWQgc29tZSBkZWNsYXJhdGlvbnMuICBBZGRlZCBhIGRlZmluaXRpb24gZm9yIHRoZQotCW5ldyBzdHJ1Y3R1cmUgaW4gZWxmY29kZS5oLiAgQWRkZWQgbW9yZSBmaWVsZHMgdG8gZWxmIGJhY2tlbmQgZGF0YQotCXN0cnVjdHVyZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZS1kZXBlbmRlbnQgaW5mby4KLQkqIGVsZjMyLSouYzogQ2hhbmdlZCBzb21lIGZ1bmN0aW9uIG5hbWVzLiAgTW92ZWQgY29tbW9uCi0JY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgY29kZSBmcm9tIG02OGssIHNwYXJjLCBhbmQgaTM4NiBzdXBwb3J0Ci0JaW50byBlbGZsaW5rLmMuICBEZWZpbmUgc29tZSBuZXcgbWFjcm9zIHRvIGZpbGwgaW4gbmV3IGZpZWxkcyBvZgotCWJhY2sgZW5kIGRhdGEuICBBbHNvIGNsZWFuIHVwIHNvbWUgImdjYyAtV2FsbCIgd2FybmluZ3MgcmVnYXJkaW5nCi0JdW51c2VkIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBObywgZG9uJ3QgcHV0IGVsZmxpbmsubyBoZXJlLgotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGl0IGhlcmUgd2hlbmV2ZXIgZWxmLm8gaXMgc3BlY2lmaWVkLgotCi1XZWQgSnVsICA1IDEwOjMxOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IFVuY29uZGl0aW9uYWxseSBzZXQKLQllbGZfYmFkX3N5bXRhYiwgc2luY2Ugc29tZXRpbWVzIHRoZSBzeW1ib2wgdGFibGUgaXMgbWVzc2VkIHVwIGFuZAotCXRoZSBsYXN0IHN5bWJvbCBpcyBnbG9iYWwuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICRhY19jb25maWdfc3ViLCBub3QgJGNvbmZpZ3N1Yi4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0KLQlQZXJtaXQgLS1lbmFibGUtdGFyZ2V0cz1pZWVlOgotCSogY29uZmlnLmJmZCAoKi0qLWllZWUqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9pZWVlLm10OiBOZXcgZmlsZS4KLQotV2VkIEp1bCAgNSAwNDoxNjozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2kzODZhaXgubWggKEhERUZJTkVTKTogUmVtb3ZlIC1ERkFTQ0lTVF9GRE9QRU4uCi0KLQlBdXRvY29uZmlzY2F0aW9uOgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBTd2l0Y2ggZnJvbSBDeWdudXMKLQljb25maWd1cmUgdG8gYXV0b2NvbmYgd2F5cyBvZiBwcm9jZXNzaW5nIC0tZW5hYmxlIGFyZ3VtZW50cywKLQlzZXR0aW5nIHVwIHN5bWxpbmtzLCBpbmNvcnBvcmF0aW5nIG1ha2VmaWxlIGZyYWdtZW50cywgcHJpbnRpbmcKLQltZXNzYWdlcyBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNldHRpbmcgdmFyaWFibGVzIGluIE1ha2VmaWxlLgotCURlbGV0ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLiAgQ2hlY2sgZm9yIHJhbmxpYiB2aWEgYXV0b2NvbmYuCi0JRm9yIG5vdywgY29uZmlndXJlIHNjcmlwdCByZW1vdmVzIGRvYy9jb25maWcuc3RhdHVzLgotCSogY29uZmlndXJlOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IFVzZSBAU1JDRElSQCBpbnN0ZWFkIG9mIEBzcmNkaXJALCBzbyBNYWtlZmlsZS5pbgotCWxpbmUgZG9lc24ndCBnZXQgYnJva2VuIGJ5IGNvbmZpZ3VyZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IFJlbW92ZWQuCi0KLVR1ZSBKdWwgIDQgMTI6MjI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBJZgotCUJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBsaW1pdCB0aGUgbGVuZ3RoIG9mIGFsbCBmaWxlIG5hbWVzCi0JdG8gYXJfbWF4X25hbWVsZW4uCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IElmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBjYWxsCi0JYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldmVydCBKdW5lIDEgY2hhbmdlLgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFkZCBwcm92aWRlCi0JYXJndW1lbnQuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLiAgUmVtb3ZlCi0Jc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCi0JaXMgYW4gZW1wdHkgc3RyaW5nLCBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgUmVjb3JkIGFsbCBEVF9ORUVERUQgZW50cmllcyBmb3VuZCBpbiBpbnB1dCBkeW5hbWljCi0Jb2JqZWN0cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIHNhd19uZWVkZWQgd2hlbiBpc3N1aW5nCi0Jd2FybmluZ3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5lZWRlZCwgbm90Ci0Jc2F3X25lZWRlZC4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCk6IERlZmluZS4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGluaXRpYWxpemUKLQlmaW5kX2J1ZmZlciBhbmQgZmRydGFiX2xlbiBmaWVsZHMgb2YgbmV3bHkgYWxsb2NhdGVkCi0JZmluZF9saW5lX2luZm8gc3RydWN0dXJlLgotCi1Nb24gSnVsICAzIDE3OjAzOjUyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgYXJndW1lbnQgInN5bV9kaWZmIiwKLQlub256ZXJvIHdoZW4gd2UncmUgZ2VuZXJhdGluZyByZWxvY2F0aW9ucyBmb3IgYW4gZXhwcmVzc2lvbgotCXVzaW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGZvciBib3RoIFJfSFBQQSBhbmQgUl9DT01QTEVYCi0JY2FzZXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9DT01QMSwgUl9DT01QMiBhbmQgUl9DT0RFX0VYUFIKLQlmaXh1cHMuCi0KLU1vbiBKdWwgIDMgMTM6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAod2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChwZSk6IENoYW5nZWQgdG8gaTM4NndpbjMyLgotCSogY29uZmlnL2kzODZwZS5taDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pMzg2d2luMzIubWg6IE5ldyBmaWxlLgotCi1Nb24gSnVsICAzIDExOjMwOjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHdlIGFsbG9jYXRlCi0JZmluZF9saW5lX2luZm8sIGNsZWFyIHRoZSBmZHJ0YWIgZmllbGQuCi0KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIgaGVyZSwKLQlyYXRoZXIgdGhhbiBpbiBiZmQtaW4yLmguCi0KLQkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IERlZmluZSBiZmRfZXJyb3Jfbm9fYXJtYXAuCi0JKGJmZF9lcnJtc2dzKTogQWRkIHN0cmluZyBmb3IgYmZkX2Vycm9yX25vX2FybWFwLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMgbm8KLQlhcm1hcCwgc2V0IGJmZF9lcnJvcl9ub19hcm1hcCByYXRoZXIgdGhhbiBiZmRfZXJyb3Jfbm9fc3ltYm9scy4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBQZXJtaXQgY29tbW9uIGFuZAotCWluZGlyZWN0IHN5bWJvbHMgaW4gd2Vha2RlZnMgQkZEX0FTU0VSVC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2ltcGxpZnkKLQlCRkRfQVNTRVJUIHRvIHBlcm1pdCBzb21lIGxlZ2FsLCBidXQgb2RkLCBjYXNlcy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB2ZXJzYWRvcy5vLgotCShDRklMRVMpOiBBZGQgcGUtaTM4Ni5jLCBwZWktaTM4Ni5jLCBhbmQgdmVyc2Fkb3MuYy4KLQotU3VuIEp1bCAgMiAxNzo0OTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IGJhc2VfZmlsZQotCXRvIEZJTEUgKiBiZWZvcmUgdXNpbmcgaXQuCi0JKiBzdGFiLXN5bXMuYzogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgotCi1TYXQgSnVsICAxIDEyOjEwOjQyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoc3RkaW8uaCk6ICBJbmNsdWRlIHByaW9yIHRvIGxpYmFvdXQuaCwgd2hpY2gKLQlpbmNsdWRlcyBiZmRsaW5rLmgsIHdoaWNoIG5vdyB1c2VzIEZJTEUuCi0KLVNhdCBKdWwgIDEgMDA6MTE6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oOiBOZXcgZmlsZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGVsZl82NF9wIGZpZWxkLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IERvbid0IHNldCBpdC4KLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW4gKGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCk6IEJ1aWxkIHRoZW0gZnJvbQotCWVsZnh4LXRhcmdldC5oLgotCi1GcmkgSnVuIDMwIDE2OjA3OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wYXJlCi0JdGhlIGZ1bGwgdGV4dCBvZiAucmVsb2Mgb3IgLmVkYXRhIHNlY3Rpb24gbmFtZXMuCi0KLUZyaSBKdW4gMzAgMTU6NDc6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCVJlbW92ZSBleHRyYSAnKycuCi0KLVRodSBKdW4gMjkgMTc6MjQ6NTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi1XZWQgSnVuIDI4IDE4OjA0OjQyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiB2ZXJzYWRvcy5vIGlzIG5vdyBjb25kaXRpb25hbGx5IGJ1aWx0LgotCSogY29mZmNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYW4gdXAuIENhbGN1bGF0ZQotCWRhdGEgZW50cmllcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCS5yZWxvYyBhbmQgLmVkYXRhIHNlY3Rpb25zIGFyZSBJTUFHRV9CQVNFRCB0b28uCi0JSWYgdGhlcmUncyBhIGJhc2VfZmlsZSB0aGVuIHdyaXRlIG91dCBiYXNlIGluZm9ybWF0aW9uLgotCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1wZSk6IE5ldy4KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBPbmx5IHNjYW4gcHJlZml4ZXMuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogVmVyc2Fkb3MgaXMgbm93IGNvbmRpdGlvbmFsbHkKLQlidWlsdC4KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQ6IEJ1aWxkIHZlcnNhZG9zLm8KLQkqIGhvc3RzL2kzODZwZS5oOiBOZXcgZmlsZS4KLQotTW9uIEp1biAyNiAxMzo1Mzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENsb3NlIGNvbW1lbnQgYmVmb3JlCi0JUl9QQVJJU0NfRFBSRUwyMUwgaGFuZGxpbmcuCi0KLVRodSBKdW4gMjIgMTk6Mjg6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGNvbmZpZy9pMzg2LW1vc3MubXQ6IGNyZWF0ZWQuCi0KLVRodSBKdW4gMjIgMDg6NTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjYXNlIGZvciAtdmUgd29yZHMuCi0KLVdlZCBKdW4gMjEgMTM6MTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5bWJvbHMuCi0KLVdlZCBKdW4gMjEgMTA6MTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogU2Vjb25kIHBhc3MvcmV3cml0ZS4KLQotTW9uIEp1biAxOSAwODo0MDo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogQ29tcGFyZSBvbmx5IHRoZSBmcm9udCBwYXJ0Ci0Jb2YgYSBzZWN0aW9uIG5hbWUuCi0KLVNhdCBKdW4gMTcgMDk6NDA6NDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViCi0Jc2VjdGlvbiBpZiB3ZSBnZXQgYW4gZXJyb3IuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvbid0IG1lc3MKLQl3aXRoIHRoZSBvcGVyYW5kcyBvZiBhbiBSX1BBUklTQ19EUFJFTDIxTCByZWxvY2F0aW9uIGlmIHRoZSBpbnNuCi0JaXMgbm90ICJhZGRpbCA8c3ltYm9sPiwlcjI3Ii4KLQotRnJpIEp1biAxNiAxNTowNDo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWNsYXJlIGJ1dCBkb24ndAotCWRlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWZpbmUuCi0KLUZyaSBKdW4gMTYgMDA6MDc6MjUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogVXNlIHRoZSByaWdodAotCXR5cGUgZmllbGQgKHRoZXJlIGFyZSB0d28hKSB3aGVuIGNoZWNraW5nIHRvIHNlZSBpZiAkZ2xvYmFsJCBpcwotCWRlZmluZWQuCi0KLVRodSBKdW4gMTUgMTQ6MDM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oIChiZmRfYm9vbGVhbik6IFJlbmFtZSBiZmRfdHJ1ZSwgYmZkX2ZhbHNlCi0JdG8gYmZkX3R0dHJ1ZSwgYmZkX2ZmZmFsc2Ugc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBSZW1vdmUgdmVyc2lvbiB0aGF0IHdhcwotCWhhY2tlZCBmb3IgTVBXIEMuCi0JKiBtcHctY29uZmlnLmluOiBTZXQgc2hlbGwgdmFycyBpbnN0ZWFkIG9mIHBhc3RpbmcgdG8gbWFrZWZpbGUKLQlmb3IgZWFjaCBjb25maWd1cmF0aW9uLCBlZGl0IGNvZmZzd2FwLmggdG8gbWFrZSBNUFcgQyBub3QgY2hva2UuCi0JKGkzODYtdW5rbm93bi1jb2ZmLCBzaC1oaXRhY2hpLWhtcyk6IFJlY29nbml6ZS4KLQkqIG1wdy1tYWtlLmluIChCRkRfTElCUyk6IEFkZCB2ZXJzYWRvcy5jLm8uCi0KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBQcm9wZXJseSBjYXN0IHJlc3VsdHMgZnJvbSBiZmRfYWxsb2MuCi0KLVdlZCBKdW4gMTQgMTU6Mjc6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE5ldyBmdW5jdGlvbgotCXJlYWRzIGFuZCBoYW5kbGVzIC5kcmVjdHZlIHNlY3Rpb25zIGZvciBQRS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgbmV3IGZ1bmN0aW9uIGlmIFBFLgotCi1Nb24gSnVuIDEyIDEyOjA5OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IENhc2UgdHJ1ZSB0byBhIGJvb2xlYW4uCi0JKGJmZF9zZXRfY2FjaGVhYmxlKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMTI6MjA6MjggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFJld3JpdGUgdG8gYmUgc3ltbWV0cmljYWwuCi0KLUZyaSBKdW4gIDkgMTI6NDk6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHRhcmdldHMuYzogQWRkIGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBhbmQgbGlua19zcGxpdF9zZWN0aW9uCi0JdG8gdGhlIHRhcmdldCB2ZWN0b3IuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCi0JKF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KLQkqIGxpbmtlci5jIChiZl9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbgotCShzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogQWxsIG90aGVyIHRhcmdldHMgdXBkYXRlZCB3aXRoIGRlZmF1bHQgdmVyc2lvbnMgb2YgbmV3IHJvdXRpbmVzLgotCi0JKiBUYWtlIG91dCBteSBicmFpbmRhbWFnZWQgYmZkX3RydWUvYmZkX2ZhbHNlIGNoYW5nZXMgZnJvbSBlYXJsaWVyCi0JdG9kYXkuICBSZXBsYWNlIHdpdGgganVzdDoKLQkqIGJmZC1pbi5oOiAoVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQpOiBEZWZpbmUgdGhpcyBpZgotCWNvbXBpbGluZyB3aXRoIGcrKy0yLjYgb3IgbGF0ZXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMDc6NTQ6MjkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAoc3RydWN0IGVzZCwgZ2V0XzQpOiBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiAgQ29tcGFyZSBvdXRwdXQgc2VjdGlvbiBuYW1lcwotCXdoZW4gY29udmVydGluZyBmb3Igdnh3b3Jrcy4KLQotV2VkIEp1biAgNyAxOTowMTozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogUGVybWl0IC5zY29tbW9uIG9yIENPTU1PTgotCXNlY3Rpb25zIGFzIHJhbmRvbSBTSFRfTk9CSVRTIHNlY3Rpb25zLCBpbiBjYXNlIGEgbGlua2VyIHNjcmlwdCBpcwotCXN0cmFuZ2UuCi0KLVR1ZSBKdW4gIDYgMTc6Mjk6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE1vdmVkIGZyb20gcGUuaAotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IEdldCBQRSByZWxvY3MgcmlnaHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogU2V0IHBlIHRkYXRhIGJpdCB3aGVuIHVzaW5nIFBFLgotCSogY29mZmxpbmsuYyAoQ09GRl9XSVRIX1BFIGNvZGUpOiBUZXN0IG9uIG9ial9wZSBiaXQgcmF0aGVyCi0JdGhhbiBjb25kaXRpb25hbCBjb21waWxlLgotCSogY29uZmlndXJlLmluOiBGaXggUEUgZGVwZW5kZW5jaWVzLgotCSogbGliY29mZi1pbi5oIChvYmpfcGUpOiBOZXcuCi0JKGNvZmZfdGRhdGEpOiBBZGRlZCBwZSBlbnRyeS4KLQkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKdW4gIDUgMDk6MDc6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogQ29tcGxldGVseSBwYXJlbnRoZXNpemUKLQltYWNyby4KLQotTW9uIEp1biAgNSAwMjoxNToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlMaW5rZXIgc3VwcG9ydCBmb3IgbTY4ay1lbGYgZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayBmb3IgTlVMTCB3aGVuCi0JbG9vcGluZyB0aHJvdWdoIHRoZSBzeW1ib2wgaGFzaGVzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGxvb2tpbmcgZm9yIF9pbml0IGFuZCBfZmluaSBkb24ndCB1c2UKLQl0aGUgc3ltYm9sIGlmIGl0IGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBvYmplY3QuCi0JKiBlbGYzMi1tNjhrLmM6IFJlbG9jYXRpb24gdHlwZSBjaGFuZ2VkIGZyb20gUkVMIHRvIFJFTEEuICBSZWd1bGFyCi0JYW5kIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBhZGRlZCwgc2ltaWxhciB0byBvdGhlciBlbGYKLQl0YXJnZXRzLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBVc2UgRUxGIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gIDIgMTg6NTQ6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogTmV3IGZpbGUuCi0JKiBiZmQtaW4yLmggKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogY29uZmlndXJlLmluICh2ZXJzYWRvc192ZWMpOiBOZXcgZmllbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9mbGF2b3IpOiBBZGRlZCB2ZXJzYWRvcy4KLQotVGh1IEp1biAgMSAxMzo1MTo0OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncywgc3R5cF90b19zZWNfZmxhZ3MsIAotCWNvZmZfbmV3X3NlY3Rpb25faG9vayk6ICBBbnkgc2VjdGlvbiB0aGF0IHN0YXJ0cyAiLnN0YWIiCi0JaXMgbm93IG1hcmtlZCBhcyBkZWJ1Z2dpbmcuCi0KLVRodSBKdW4gIDEgMTY6MTU6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEaXNhYmxlIGV4dGVuZGVkIG5hbWUKLQl0YWJsZSB1bnRpbCBpdCBjYW4gYmUgbWFkZSBvcHRpb25hbCwgc28gdGhhdCBuYXRpdmUgQVIgaGFzIGhhbGYgYQotCWNoYW5jZSBvbiBTdW5PUyBhbmQgSFAvVVguCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywgY2FzZQotCWJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOiBBZGQgY2FzdCB0byBjb3JyZWN0IHBvaW50ZXIgdHlwZXMuCi0KLVNhdCBNYXkgMjcgMjE6Mzc6MzEgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtNjhrLWJ1bGwtc3lzdiopOiBBZGRlZCBzdHJpcF91bmRlcnNjb3JlPXllcy4KLQkgIChtNjhrLWVzdC1jb2ZmKTogUmVtb3ZlZC4gIHRhcmdldCBkb2VzIG5vdCBlZmZlY3Qgb2JqZWN0IGZvcm1hdC4KLQotV2VkIE1heSAyNCAxMDo1MjowMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBDb3BlIHdpdGgKLQlpbmRpcmVjdCBzeW1ib2xzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHaXZlIGVycm9yCi0JbWVzc2FnZSB3aGVuIGxpbmtpbmcgdG8gYSBzaGFyZWQgcmVsb2Mgd2hpY2ggaXNuJ3QgdGhlcmUuCi0KLVdlZCBNYXkgMjQgMTA6NDA6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIEFSTS1QRS4KLQotCSogTWFrZWZpbGUuaW4sIGNvZmZjb2RlLmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgcGUtYXJtLmMsCi0JIHBlaS1hcm0uYywgY29mZi1hcm0uYywgcmVsb2MuYywgdGFyZ2V0cy5jLCBjb25maWcvYXJtLXBlLm10OgotCSBTdXBwb3J0IGZvciBBUk0gQ09GRi9QRS4KLQotVHVlIE1heSAyMyAxOToyNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5vdyBhIGZ1bmN0aW9uLAotCXRyaWVzIGNhbGxpbmcgcm91dGluZSBmcm9tIGlucHV0IGJmZCB0YXJnZXQgdmVjdG9yIGZvcgotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgUHV0IGEgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbWlwcy5jIChncHJlbDE2X3dpdGhfZ3ApOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBmcm9tCi0JbWlwc19lbGZfZ3ByZWwxNl9yZWxvYy4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IENhbGwgaXQuICBJZiBvdXRwdXQgYmZkIHRhcmdldCB2ZWN0b3IKLQlpc24ndCBlbGYgZmxhdm91cmVkLCBhYm9ydCwgc2luY2UgaXQncyBhc3N1bWVkIHRvIGJlIGVsZiBpbiBzb21lCi0Jb2YgdGhpcyBjb2RlLCBpbmNsdWRpbmcgdGhlIGNvZGUgdGhhdCBsb29rcyB1cCB0aGUgZ3AgdmFsdWUuCi0JKGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLAotCW1vZGlmaWVkIGZyb20gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvIGRlYWwKLQl3aXRoIHBhc3NpbmcgZ3AgdG8gZ3ByZWwxNl93aXRoX2dwLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBtYWNyby4KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIE1heSAyMyAxNTo1ODoxNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46IEluc3RhbGwgYmZkbGluay5oIHRvby4KLQotU3VuIE1heSAyMSAyMjoyNTowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdW5kZWZpbmVkIGFuZAotCW5vdHN1cHBvcnRlZCByZXR1cm4gY29kZXMgZnJvbSBmaW5hbF9saW5rX3JlbG9jYXRlICh1c2VkIHdoZW4KLQkkZ2xvYmFsJCBpcyB1bmRlZmluZWQgb3Igbm9uZXhpc3RhbnQpLgotCShlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBJZiAkZ2xvYmFsJCBleGlzdHMsIGJ1dCBpcwotCW5vdCBkZWZpbmVkLHRoZW4gcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQuCi0KLUZyaSBNYXkgMTkgMTA6MDA6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmg6IChJTUFHRV9CQVNFKTogRGVmaW5lIHRvIDAgaWYgbm90LgotCi1UaHUgTWF5IDE4IDA0OjI0OjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0YW5kYXJkKTogSWYgZGVmaW5lZCwgY2FsbAotCU1ZX3JlbG9jYXRhYmxlX3JlbG9jIGJlZm9yZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4KLQotCSogYW91dC1hcm0uYzogKFdSSVRFX0hFQURFUlMpOiBEZWxldGUuCi0JKE5BTUUpOiBEZWZpbmUgdmVyc2lvbiB0byBvdmVycmlkZSBkZWZhdWx0IGluIGFvdXR4LmgKLQkoTVkoaG93dG9fdGFibGUpKTogUmVmb3JtYXQuICBBbHRlciBzb21lIGVudHJpZXMgc2xpZ2h0bHkuCi0JKFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0pOiBEZWZpbmUuCi0JKE1ZKHJlbG9jX2hvd3RvKSwgTVkocHV0X3JlbG9jKSwgTVkocmVsb2NhdGFibGVfcmVsb2MpKTogTmV3IGZ1bmN0aW9ucy4KLQkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYywgTVlfcmVsb2NhdGFibGVfcmVsb2MpOiBEZWZpbmUuCi0JKE1ZKGZpeF9wY3JlbF8yNikpOiBSZW5hbWVkIGZyb20gYW91dGFybV9maXhfcGNyZWxfMjYsIHJldHVybgotCWJmZF9yZWxvY19vayBub3QgYmZkX3JlbG9jX2NvbnRpbnVlLgotCShNWShmaXhfcGNyZWxfMjZfZG9uZSkpOiBMaWtld2lzZS4KLQkoTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX3JlbG9jX3R5cGVfbG9va3VwLgotCShNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWxldGUuCi0JKE1ZX3N3YXBfc3RkX3JlbG9jX2luLCBNWV9zd2FwX3N0ZF9yZWxvY19vdXQsIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlEZWZpbmUuCi0JKGFvdXR4LmgpOiBJbmNsdWRlIGl0LgotCShNWShzd2FwX3N0ZF9yZWxvY197aW4sb3V0fSkpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSBSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9IHRvIGV4dHJhY3QgbmVnYXRpdmUgcmVsb2MgYml0LgotCShhb3V0YXJtX3NxdWlydF9vdXRfcmVsb2NzKTogRGVsZXRlLgotIAotCUZyb206IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCi0JKiBhb3V0LWFybS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBhcm17LGVbbGJdfS0qLWFvdXQKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHZldG9yIGZvciBhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjLgotCSogcmVsb2MuYzogTmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIHRoZSBBUk0uCi0JKiB0YXJnZXRzLmMgKGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMpOiBkZWNsYXJlLgotCi1UdWUgTWF5IDE2IDEwOjI5OjUxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3N0YXQpOiBJZiBiZmRfY2FjaGVfbG9va3VwIHJldHVybnMgYW4gZXJyb3IsCi0JcmV0dXJuIGFuIGVycm9yIHRvIHRoZSBjYWxsZXIuICBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZXJyb3JzLgotCi1UdWUgTWF5IDE2IDE0OjQ0OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogTW9kaWZpZWQgcHJvdG90eXBlcyBpbgotCWFjY29yZGFuY2Ugd2l0aCAxMSBNYXkgbGliY29mZi5oIGNoYW5nZS4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogVW5kZXJzdGFuZCB0eXBlIDAgc3ltYm9scy4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCB0eXBvIGluIGZpbmFsIHJlY29yZC4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IGRvbid0IHRyeSBhbmQgb3B0aW1pemUKLQl1bmRlZmluZWQgcmVmcy4gCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogU2VhcmNoIGZvciBicm9rZW4gcmVsb2NzIG9uIHRoZSB3YXkKLQlvdXQgYW5kIGZpeCB0aGVtIHVwLgotCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDYWxjdWxhdGUgYW5kIHJldHVybiBpbmRleCBvZgotCWZpcnN0IHVuZGVmaW5lZCBzeW1ib2wuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgCi0JYW5kIGNvZmZfd3JpdGVfcmVsb2NzIHdpdGggdGhlIG5ldyBhcmdzLgotCSogbGliY29mZi5oOiAoY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOgotCU1vZGlmaWVkIHByb3RvdHlwZXMuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkJCSAgVG9tIEdyaWVzdCA8Z3JpZXN0QGNzLnlhbGUuZWR1PgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBmb3JtYXQuIAotCQotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgY29uZmlndXJlLmluLCBjb25maWcuYmZkOgotCUFkZCBzdXBwb3J0IGZvciBpMzg2LSotd2lubnQgYW5kIGkzODYtKi1wZS4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBVbmRlcnN0YW5kIE5UUEUgZm9ybWF0Ci0JYXJjaGl2ZXMuCi0JKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFR1cm4gXCBpbiBhIGZpbGVuYW1lCi0JaW50byAvLgotCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSwgX2JmZF9saW5rX3N0YWNrX2hlYXApOiBOZXcuCi0JKiBjb2ZmLWkzODYuYyAgKGhvd3RvX3RhYmxlKTogQ29uZGl0aW9uYWxpemUgUENSRUxPRkZTRVQuCi0JKiBjb2ZmY29kZS5oIChJTUFHRV9CQVNFKTogTmV3LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRocm93IGF3YXkgLmp1bmsKLQlzZWN0aW9ucyBmb3IgUEUsIGFsaWduIHN5bWJvbHMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVGhyb3cgYXdheSAuanVuayBzZWN0aW9ucwotCWZvciBQRS4gUmVtZW1iZXIgaW5mbyBvbiAuaWRhdGEgYW5kIC5yc3JjIHNlY3Rpb25zLgotCUZpbGwgaW4gdGhlIFBFIGhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQRSB1c2VzIENfU0VDVElPTiBjbGFzcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogS2VlcCBQRSBpbmZvIHVwIHRvIGRhdGUuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggUEUgcmVsb2NzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3thb3V0L2ZpbGUvc2NuL3N5bX1oZHJfe2luL291dH0pOiAKLQlOZXcgY29kZSBmb3IgUEUgaGVhZGVycy4KLQotVHVlIE1heSAgOSAxNzowMTozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCi0JKiB0YXJnZXRzLmM6IERpdHRvLgotCSogY29uZmlnL3BwY2xlLWVsZi5tdDogTmV3IGZpbGUsIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMKLQlzdXBwb3J0LgotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCBsaXR0bGUgZW5kaWFuIHBvd2VycGMgdG8gdGhlIEJGRAotCXNlbGVjdGlvbiB2ZWN0b3JzLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENvbXBsYWluIGlmCi0JbGlua2luZyBhIGRpZmZlcmVudCBlbmRpYW4gb2JqZWN0IHRoYW4gd2UgZXhwZWN0LgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLCB0byBwcm92aWRlIGxpdHRsZQotCWVuZGlhbiBzdXBwb3J0LgotCi1UdWUgTWF5ICAyIDE2OjMyOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGp1c3QgbGlrZSBocHBhKi0qLSplbGYqLgotCi1UdWUgQXByIDI1IDE5OjM4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSW5pdGlhbGl6ZSBsbWEgc2FtZSBhcwotCXZtYS4KLQotVHVlIEFwciAyNSAxMTowMzoyMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogI2luY2x1ZGUgYW5zaWRlY2wuaCAnY2F1c2UgUFRSIGlzIHVzZWQgaW4KLQlzdGQtaG9zdC5oLgotCi1Nb24gQXByIDI0IDIzOjU2OjQ0IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEb24ndCBkZWZpbmUgaXQuICBBZGRlZCBsZW5ndGh5Ci0JY29tbWVudCBleHBsYWluaW5nIHdoeS4KLQotTW9uIEFwciAyNCAxMDozNDowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogSWYgTk9fUFJPQ0ZTIGlzIGRlZmluZWQsIGRvbid0Ci0JZGVmaW5lIEhBVkVfUFJPQ0ZTLgotCi1Nb24gQXByIDI0IDA4OjMzOjEyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbnRpbnVlCi0JcHJvY2Vzc2luZyB1bmtub3duIHN5bWJvbHMgdG8gcHJldmVudCBhIGNhc2NhZGUgb2YgZXJyb3JzLgotCi1GcmkgQXByIDIxIDEyOjQ4OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSC5KLiBMdSBmb3IgTGludXggRUxGIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBbSEFWRV9QUk9DRlNdOgotCVVzZSBwcnBzaW5mb190IGluc3RlYWQgb2Ygc3RydWN0IHBycHNpbmZvLCBmb3IgY29uc2lzdGVuY3kuCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLVRodSBBcHIgMjAgMDk6MDc6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gYSB1bmRlZmluZWQKLQlzdHJvbmcgc3ltYm9sIGFwcGVhcnMgYWZ0ZXIgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCi1GcmkgQXByIDE0IDE2OjUxOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byByZWxvY2F0ZQotCWEgd2hvbGUgc2VjdGlvbiBmb3IgdGhlIGxpbmtlciwgYnlwYXNzaW5nIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24gdG8gbWFwIHRoZSBCRkQKLQllbnVtZXJhdGlvbiBjb2RlIGludG8gYSBob3d0byBzdHJ1Y3R1cmUuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogUmVuYW1lIGZyb20gcHBjX2VsZl9ob3d0b190YWJsZS4KLQkocHBjX2VsZl9ob3d0b190YWJsZSk6IE5ldyBhcnJheSB0aGF0IG1hcHMgUG93ZXJQQyByZWxvY2F0aW9uCi0JbnVtYmVycyB0byBob3d0byBzdHJ1Y3R1cmVzIHdpdGhvdXQgYSBsaW5lYXIgc2VhcmNoLiAgQ2hhbmdlIGZyb20KLQl1c2luZyBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgdG8gdXNlIHBwY19lbGZfc3RkX3JlbG9jLgotCShwcGNfZWxmX2hvd3RvX2luaXQpOiBJbml0aWFsaXplIHBwY19lbGZfaG93dG9fdGFibGUgZnJvbQotCXBwY19lbGZfaG93dG9fcmF3LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlIGEgY2FzZSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiBhCi0JbG9vcC4KLQkocHBjX2VsZl9zdGRfcmVsb2MpOiBSZXBsYWNlbWVudCBmb3IgYmZkX2VsZl9nZW5lcmljX3JlbG9jLgotCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogUHJpbnQgYSByZWFsIGVycm9yIG1lc3NhZ2UsIGluc3RlYWQKLQlvZiBjYWxsaW5nIGFib3J0LgotCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCi0JcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0Ci0JdG9vLgotCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfZ290MTZfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQotCXBwY19lbGZfZ290MTZfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0IHRvby4KLQkocHBjX2VsZl9nb3QxNl9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tIHBvd2VycGNfaW5mb190b19ob3d0by4KLQotCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IE9taXQgc3BhY2UgaW4gZGVidWdnaW5nCi0Jb3V0cHV0LgotCShlbGZfc3ltYm9sX2ZsYWdzKTogQWRkIGRlYnVnIGZ1bmN0aW9uIHRvIGRlY29kZSBmbGFncyBzbyB0aGF0Ci0JZGVmaW5pbmcgREVCVUcgdG8gYmUgNCB3aWxsIGNvbXBpbGUgYWdhaW4uCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRml4IHR5cG8gaW4gZGVidWcgb3V0cHV0LgotCi1GcmkgQXByIDE0IDE2OjAzOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLSotZWxmKi4KLQkqIGVsZjMyLW02OGsuYzogRmlsbGVkIG91dCBpbXBsZW1lbnRhdGlvbiwgZXhjZXB0IGZvciBkeW5hbWljCi0JbGlua2luZyBzdXBwb3J0LgotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgKl9HT1RfUENSRUwsICpfR09UT0ZGLAotCSpfUExUX1BDUkVMLCAqX1BMVE9GRiwgKl82OEtfKiByZWxvY2F0aW9ucyBmb3IgRUxGLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBBcHIgMTMgMTQ6Mjg6MDQgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbTY4ay5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBDaGFuZ2UgZnJvbQotCTEgdG8gMi4KLQkoYmZkX3RhcmdldCk6IENoYW5nZSBtaW5pbXVtIHNlY3Rpb24gYWxpZ25tZW50IGZyb20gMSB0byAyLgotCi1XZWQgQXByIDEyIDEyOjQwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF9taXBzKTogVHJlYXQgUjgwMDAgbGlrZQotCVI2MDAwIGFuZCBSNDAwMCBmb3Igbm93LgotCi1UdWUgQXByICA0IDEyOjI4OjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0JKiBob3N0cy9tcHcuaDogTmV3IGZpbGUsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9pbikgW01QV19DXToKLQlBbHRlcm5hdGUgdmVyc2lvbnMgd2l0aG91dCBFQ09GRl82NCB0aGF0IGNob2tlcyBNUFcgQy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogQWRkIGFsdGVybmF0aXZlIHZlcnNpb24gd2l0aAotCXBhcnRseS1leHBhbmRlZCBtYWNyb3MuCi0KLVRodSBNYXIgMzAgMTQ6NTY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgotCW92ZXJmbG93IGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgTWFyIDMwIDE0OjMyOjI2IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlicmFyeSB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCi0JQ29tbWVudCBvdXQgRVhUUkFMSUJTLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogUmVtb3ZlLgotCi1XZWQgTWFyIDI5IDEyOjAxOjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENhY2hlIHRoZSBzZWN0aW9uIHN5bWJvbCBpbgotCXRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiB0aGUgc2VjdGlvbiwgdG8gYXZvaWQgbG9vcGluZyBmb3IgZWFjaAotCXJlbG9jLgotCi0JKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KLQkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgotCi1UdWUgTWFyIDI4IDE1OjE0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgU0VDX0NPTlNUUlVDVE9SCi0Jc2VjdGlvbnMuCi0JKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNraXAgY29uc3RydWN0b3IKLQlzeW1ib2xzIHdoaWNoIHRoZSBtYWluIGxpbmtlciBjb2RlIGRpZCBub3QgZG8gYW55dGhpbmcgd2l0aC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2UgdWRhdGEucCBpZiBpdCBpcyBzZXQsCi0JcmF0aGVyIHRoYW4gbG9va2luZyB0aGUgc3ltYm9sIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgSnVzdCBwYXNzCi0JdGhyb3VnaCBjb25zdHJ1Y3RvciBzeW1ib2xzIGZvciB3aGljaCB1ZGF0YS5wIGlzIG5vdCBzZXQuICBJZiB0aGUKLQlsaW5rZXIgZGVmaW5lZCB0aGUgc3ltYm9sLCBjbGVhciB0aGUgY29uc3RydWN0b3IgZmxhZy4KLQotVHVlIE1hciAyMSAxMDo1MDozMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyBmcm9tCi0JUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KLQkqIGxpYmhwcGEuaCAoc2lnbl9leHRlbmQpOiBSZW5hbWVkIGZyb20gc2lnbl9leHQuICBGaXguCi0JKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCi1Nb24gTWFyIDIwIDIyOjM5OjEwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFRpZ2h0ZW4gdGVzdCB0byBkZXRlcm1pbmUKLQl3aGF0IHN5bWJvbHMgYXJlIHNlY3Rpb24gc3ltYm9scy4KLQotU2F0IE1hciAxOCAwMTo1NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KLQotRnJpIE1hciAxNyAxNjoyOTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IEp1c3QgcmV0dXJuIHRydWUgd2hlbgotCWVpdGhlciB0aGUgaW5wdXQgb3Igb3V0cHV0IHNlY3Rpb24gaXNuJ3QgYXR0YWNoZWQgdG8gYSBTT00gQkZELgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNpbWlsYXJseSBmb3IgQkZEIHByaXZhdGUgZGF0YS4KLQotRnJpIE1hciAxNyAxMTo1MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgd2hldGhlciBhIGR5bmFtaWMKLQlvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZCwgYW5kIGlnbm9yZSBpdCB0aGUgc2Vjb25kIHRpbWUuCi0KLVdlZCBNYXIgMTUgMTE6NTY6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMyBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZWxmNjRfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCi0KLVR1ZSBNYXIgMTQgMDU6NTQ6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZSk6IE1vdmVkIGFvdXRfc3RhYl9uYW1lcyB0byBiZSBsb2NhbAotCXRvIHRoaXMgZnVuY3Rpb24uICBSZWNvZGVkIGZ1bmN0aW9uIHRvIHN0b3AgdXNpbmcgdGFibGUsIHRvCi0JaW1wcm92ZSBwZXJmb3JtYW5jZSAob24gaTQ4Ni1uZXRic2QgaG9zdCkuICBMZWZ0IG9sZCB2ZXJzaW9uCi0JaW50YWN0IHVuZGVyICIjaWYgMCIgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgdGVzdGluZy4KLQotTW9uIE1hciAxMyAxMzo0ODo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogTWFrZSBzdGF0aWMuICBVc2UgUFRSIGFyZ3VtZW50IGFzIGEKLQlwb2ludGVyIHRvIGEgYm9vbGVhbiB2YXJpYWJsZSBzZXQgdG8gdHJ1ZSBpZiBzb21ldGhpbmcgZmFpbHMuCi0JQ2FzdCB0byBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgotCShzeW1faXNfZ2xvYmFsKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwsCi0JY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgYW5kIHJldHVybiBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgYm9vbGVhbiB2YXJpYWJsZSB3aGVuCi0JY2FsbGluZyB3cml0ZV9yZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQpOiBEZWZpbmUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRGVjbGFyZSB2YXJpYWJsZXMgaW4gaW5uZXIKLQlibG9ja3MuICBQYXNzIGVsZl9pbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCi0JZWxmX2V4cG9ydF9zeW1ib2wgYW5kIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfaW5mb19mYWlsZWQgcmF0aGVyCi0JdGhhbiBiZmRfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWxmX2ZpbmZvX2ZhaWxlZCk6IERlZmluZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUGFzcyBlbGZfZmluZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKLQllbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9maW5mb19mYWlsZWQKLQlyYXRoZXIgdGhhbiBlbGZfZmluYWxfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgd3JpdGUKLQlvdXQgUExUUkVMU1osIFBMVFJFTCBhbmQgSk1QUkVMIHJlbG9jcyBpZiB0aGVyZSBpcyBhIC5yZWxhLnBsdAotCXNlY3Rpb24uICBTb2xhcmlzIDIuNCBhcHBhcmVudGx5IGRvZXMgbm90IGhhbmRsZSBlbXB0eSByZWxvYwotCWluZm9ybWF0aW9uIGNvcnJlY3RseS4KLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBDYXN0IGdldHVpZCBhbmQgZ2V0Z2lkIHJlc3VsdHMgdG8KLQlsb25nLCBhbmQgcHJpbnQgd2l0aCAlbGQuCi0KLUZyaSBNYXIgMTAgMTY6NDE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IEFsd2F5cyB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gaWYgaXQgaXMgbm90IE5VTEwuCi0KLVRodSBNYXIgIDkgMTU6MDY6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IElmIHRoZSBsaW5lIG51bWJlciBjb3VudCBvcgotCXRoZSByZWxvYyBjb3VudCBkb2VzIG5vdCBmaXQsIHByaW50IGFuIGVycm9yIGFuZCByZXR1cm4gMC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZQotCW9mIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotCSogYmZkLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPiwgZGVwZW5kaW5nIHVwb24KLQlBTlNJX1BST1RPVFlQRVMuCi0JKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpOiBOZXcgZ2xvYmFsIHR5cGUuCi0JKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2Vycm9yX2hhbmRsZXIpOiBOZXcgQkZEIHByaXZhdGUgZ2xvYmFsIHZhcmlhYmxlLgotCShiZmRfc2V0X2Vycm9yX2hhbmRsZXIpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vycm9yX2hhbmRsZXIpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsCi0JYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuICBDaGVjayByX2luZGV4IGFmdGVyCi0Jc2V0dGluZyByX2V4dGVybiBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfSU4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwgYW5kIHVzZSBpdAotCWluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyCi0JdG8gZGVjbGFyYXRpb24uCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogUGFzcwotCWluZm8tPmR5bnN5bV9jb3VudCB0byByZWxvYyBzd2FwIHJvdXRpbmVzLgotCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIuCi0JKiBocDMwMGhwdXguYyAoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYyBzd2FwCi0Jcm91dGluZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQKLQlwYXJhbWV0ZXIuCi0JKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0KLVRodSBNYXIgIDkgMTI6MDQ6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlCi0JY2FsbGVkIGJ5IHRoZSBsaW5rZXIgdG8gbWVyZ2UgYW55IHByaXZhdGUgYmZkIGRhdGEgb2YgdGhlIGlucHV0Ci0JZmlsZXMgYW5kIHRoZSBvdXRwdXQgZmlsZS4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQgdG8KLQljaGVjayB3aGV0aGVyIC1tcmVsb2NhdGFibGUgaXMgdXNlZCBmb3IgYWxsIG1vZHVsZXMuCi0JKGJmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHRoZQotCWFzc2VtYmxlciB0byBzZXQgcHJpdmF0ZSBmbGFncy4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQKLQl0byBzZXQgdGhhdCBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgd2FzIGFzc2VtYmxlZCB3aXRoIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBBZGQgaW50aWlhbGl6YXRpb24gb2YgdGhlCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbgotCXZlY3RvcnMuCi0KLQkqIGJmZC1pbjIuaCwgbGliYmZkLWluLmg6IFJlYnVpbGQgd2l0aCBiZmQuYyBhbmQgdGFyZ2V0cy5jCi0JY2hhbmdlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdG8gc2V0IHRoZQotCUVMRiBlX2ZsYWdzIGZpZWxkLgotCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIGVfZmxhZ3MgZmllbGQgZnJvbSB0aGUKLQlpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgZm9yIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKLQllX2ZsYWdzIGZpZWxkIG9mIGFsbCBvZiB0aGUgbGlua2VyIGlucHV0IGZpbGVzLgotCi0JKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwcGNfZmxhZ3NfaW5pdCBmaWVsZCBzbyB0aGF0IHRoZQotCVBvd2VyUEMgc3VwcG9ydCBjYW4gY2hlY2sgaWYgY29tcGF0YWlibGUgZV9mbGFncyBhcmUgcHJlc2VudC4KLQotCSogYW91dC10YXJnZXQuaDogQWRkIE5PUCBmb3IgdGhlIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0JYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbiB2ZWN0b3JzLgotCSogY29mZmNvZGUuaDogRGl0dG8uCi0JKiBlbGYzMi10YXJnZXQuaDogRGl0dG8uCi0JKiBlbGY2NC10YXJnZXQuaDogRGl0dG8uCi0JKiBsaWJiZmQuaDogRGl0dG8uCi0JKiBsaWJlY29mZi5oOiBEaXR0by4KLQkqIHNvbS5jOiBEaXR0by4KLQotV2VkIE1hciAgOCAwMDo1Mzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczo4MDAwIGVudHJ5LgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBNYXJrIGFuIHVuZGVmaW5lZCBCU0ZfV0VBSyBzeW1ib2wgYXMKLQlTVEJfV0VBSyByYXRoZXIgdGhhbiBTVEJfR0xPQkFMLgotCi1UdWUgTWFyICA3IDEyOjIzOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4LgotCShiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkIHRvCi0JY29mZl9hZGp1c3Rfc3ltbmR4LgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgY29mZl9hZGp1c3Rfc3ltbmR4IGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGNvZmZjb2RlLmguCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBTa2lwIGJpbmFyeV92ZWMgd2hlbgotCXNlYXJjaGluZyB0aHJvdWdoIGJmZF90YXJnZXRfdmVjdG9yLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDaGVjayBTSFRfTk9CSVRTIGJlZm9yZSBjaGVja2luZwotCXNoX3NpemUuCi0KLU1vbiBNYXIgIDYgMjM6MzE6MzYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBLZWVwIFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIKLQkhU0hUX05PQklUUyBvbmVzLgotCi1Nb24gTWFyICA2IDA5OjUzOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjcHUtaHBwYS5jIChhcmNoX2luZm9fc3RydWN0KTogU3VwcG9ydCBib3RoIFBBMS4wIGFuZCBQQTEuMQotCW1hY2hpbmUgdHlwZXMuCi0JKGJmZF9ocHBhX2FyY2gpOiBMaW5rIGluIGJvdGggUEExLjAgYW5kIFBBMS4xIGFyY2hpdGVjdHVyZSBpbmZvCi0Jc3RydWN0dXJlcy4KLQkqIGxpYmhwcGEuaCAoZW51bSBwYV9hcmNoKTogTmV3IGVudW1lcmF0aW9uIHRvIGRlc2NyaWJlIHRoZQotCWRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUgUEEgYXJjaGl0ZWN0dXJlLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBVc2UgbmV3IGVudW1lcmF0aW9uIHRvIHNldCBtYWNoaW5lCi0JdHlwZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogSWYgdGhlIG1hY2hpbmUgdHlwZSBpcyBQQTEuMSwgdGhlbiB1c2UgdGhlCi0JUEExLjEgbWFjaGluZSBpZGVudGlmaWVyIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotVGh1IE1hciAgMiAxNTo1ODoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBUcmVhdCB0aGUgaW5kZXggb2YgYQotICAgICAgICBiYXNlIHJlbGF0aXZlIHJlbG9jIGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSwgcmVnYXJkbGVzcwotICAgICAgICBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogRG91YmxlIGNoZWNrIHRoYXQgdGhlCi0JY2FsbGVyIGlzIHdyaXRpbmcgdG8gYSB2YWxpZCBzZWN0aW9uLgotCi1UaHUgTWFyICAyIDE0OjM3OjU3IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGJpbmFyeS5jOiBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBiaW5hcnkgZmlsZXMuICBMb2FkcyB0aGUgcmF3Ci0JY29udGVudHMgb2YgdGhlIGZpbGUgaW50byBhIGRhdGEgc2VjdGlvbiBhbmQgd3JhcHMgc29tZSBzeW1ib2xzCi0JYXJvdW5kIGl0LiAgVGhlIHN5bWJvbHMgYF9iaW5hcnlfPGZpbGVuYW1lPl9zdGFydCcgYW5kCi0JYF9iaW5hcnlfPGZpbGVuYW1lPl9lbmQnIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhLAotCXdoaWxlIGBfYmluYXJ5XzxmaWxlbmFtZT5fc2l6ZScgaXMgYW4gYWJzb2x1dGUgc3ltYm9sIHdob3NlIHZhbHVlCi0JaXMgdGhlIHNpemUgb2YgdGhlIGRhdGEuICA8ZmlsZW5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBiaW5hcnkKLQlpbnB1dCBmaWxlLCB3aXRoIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgY29udmVydGVkIHRvCi0JdW5kZXJzY29yZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlKTogQXNzdW1lIHVzZXJzIGtub3dzIHdoYXQKLQl0aGV5J3JlIGRvaW5nIGlmIG9uZSBvZiB0aGUgYXJjaGl0ZWN0dXJlcyBpcyBiZmRfYXJjaF91bmtub3duLgotCi1XZWQgTWFyICAxIDE3OjMwOjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBGb3IgcmVsb2NhdGlvbgotCVJfUFBDX0dPVDE2LCBjaGFuZ2UgY29tcGxhaW5fb25fb3ZlcmZsb3cgdG8gYmUKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVdlZCBNYXIgIDEgMTE6NTI6NTUgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgcG93ZXJwYy0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTE6NTc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSBvdXRwdXQgb2YgVERFRkFVTFRTIHRvIGF2b2lkIHJlbHlpbmcgb24KLQlzZW1hbnRpY3Mgb2Ygc2luZ2xlIHF1b3RlcyBpbiBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLgotCi1UdWUgRmViIDI4IDEyOjUzOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogU29ydCBlbXB0eSBzZWN0aW9ucyBiZWZvcmUgbm9uLWVtcHR5Ci0Jc2VjdGlvbnMsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBWTUEuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCi0JKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyNyAxMjo1ODoyNSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBhZGQgYTI5ay0qLXZ4d29ya3MgY29uZmlndXJhdGlvbi4KLQotV2VkIEZlYiAyMiAxNDo0MDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0bwotCXVzZSByZWxvY19ob3d0b190eXBlIHJhdGhlciB0aGFuIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QuCi0KLVR1ZSBGZWIgMjEgMTg6MTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIGFza2VkCi0JZm9yIHJlbG9jYXRpb25zIGZvciB0aGUgLmJzcyBzZWN0aW9uLgotCi1UdWUgRmViIDIxIDE1OjEzOjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBIYW5kbGUgb2JqZWN0cyB3aXRoIG9kZAotCWxlbmd0aHMuCi0KLUZyaSBGZWIgMTcgMTI6MzQ6MzYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2dvdDE2X3JlbG9jKTogTWFrZSBHT1Qgc3R5bGUgcmVsb2NzIGFkZAotCTMyNzY4LCBzbyB0aGUgR09UIHBvaW50ZXIgY2FuIHBvaW50IHRvIDE2Mzg0IHBvaW50ZXJzLCBpbnN0ZWFkIG9mCi0JODE5Mi4KLQotRnJpIEZlYiAxNyAxMTo0NTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL3N5c3Y0Lmg6IEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0ZGxpYi5oPiwgYW5kIDx0aW1lLmg+LgotCU9ubHkgZGVmaW5lIFNFRUtfU0VUIGFuZCBTRUVLX0NVUiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgotCVJlbW92ZSBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBSZXR1cm4gJ1cnIGZvciBhIHdlYWsgc3ltYm9sLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBzdGFydCBhZGRyZXNzIGFuZCBmbGFncwotCWJlZm9yZSBjYWxsaW5nIGNvZmZfbWtvYmplY3RfaG9vay4gIFJlc3RvcmUgdGhlbSBvbiBmYWlsdXJlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9ta29iamVjdF9ob29rKTogSWYgbm90IEVDT0ZGX0FPVVRfWk1BR0lDLAotCWNsZWFyIERfUEFHRUQuCi0KLQkqIGNvZmZnZW4uYzogUmVpbmRlbnRlZC4KLQotVGh1IEZlYiAxNiAxNDozNzoyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCB1c2UgYml0cG9zIGluIG92ZXJmbG93Ci0JY2FsY3VsYXRpb25zLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTYgMTM6MjI6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmUgYWxsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGljaCByZXR1cm4KLQlpbnQgb3Igdm9pZCwgZXhjZXB0IHRoZSBvbmUgZm9yIGZyZWUuCi0KLVdlZCBGZWIgMTUgMTQ6NTQ6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBVc2UgYSBkZXN0aW5hdGlvbiBtYXNrIG9mCi0JMHhmZmZmZmZmZiBmb3IgUl9QUENfUkVMMzIsIG5vdCAwLgotCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkZCBsb3cgMTYgYml0LCBoaWdoIDE2IGJpdCwgYW5kIGhpZ2ggMTYgYml0Ci0JYWRqdXN0ZWQgcmVsb2NhdGlvbnMuCi0KLVR1ZSBGZWIgMTQgMTc6NDc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVmaW5lLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpbmRfbGluZV9pbmZvIGZpZWxkLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSB0byBlY29mZmxpbmsuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4KLQkobWtfZmRydGFiKTogTGlrZXdpc2UuCi0JKGxvb2t1cCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCBjYWxsIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLQl0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgQWxsb2NhdGUgZmluZF9saW5lX2luZm8gaWYgbmVjZXNzYXJ5LgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4gIFVzZSBQVFIgaW5zdGVhZCBvZiB2b2lkICouCi0JKG1rX2ZkcnRhYik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLiAgQWRkIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCi0JYW5kIGxpbmVfaW5mbyBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCi0JKGZkcnRhYl9sb29rdXApOiBNb3ZlIGluIGZyb20gbG9va3VwIGluIGVjb2ZmLmMuICBSZW1vdmUgYWJmZAotCWFyZ3VtZW50LCBhZGQgbGluZV9pbmZvIGFyZ3VtZW50LiAgVXNlIGl0IGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGZyb20gdGhlIG9sZAotCV9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgaW4gZWNvZmYuYy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZSBmaW5kX2J1ZmZlciwgZmRydGFiX2xlbiBhbmQKLQlmZHJ0YWIgZmllbGRzLCByZXBsYWNpbmcgdGhlbSBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBlY29mZi5vIGZvciBiZmRfZWxmMzJfYmlnbWlwc192ZWMgb3IKLQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBGZWIgMTQgMTQ6MDQ6MjIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZWxmX21hY2hpbmVfYWx0MSBhbmQKLQllbGZfbWFjaGluZV9hbHQyIHdoaWNoIHByb3ZpZGUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoZSBtYWNoaW5lCi0JY29kZS4KLQotCSogZWxmMzItcHBjLmMgKEVMRl9NQUNISU5FX0FMVDEsIEVMRl9NQUNISU5FX0FMVDIpOiBEZWZpbmUgdG8KLQlyZWNvZ25pemUgb2xkIHZlcnNpb25zIG9mIHRoZSBQb3dlclBDIG1hY2hpbmUgY29kZS4KLQotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCi0KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogSW4gYWRkaXRpb24gdG8gdGhlCi0JbWFpbiBtYWNoaW5lIGNvZGUgZmllbGQsIGNoZWNrIHRoZSB0d28gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcy4KLQotVHVlIEZlYiAxNCAxMjo0Njo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuICBEb24ndAotCWFjY2VwdCBNX1NQQVJDIGlmIGJmZF9hcmNoX3NwYXJjIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLCBhbmQgZG9uJ3QgYWNjZXB0IGEgNjgweDAgbWFjaGluZSB0eXBlIGlmCi0JYmZkX2FyY2hfbTY4ayBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMuCi0JKiBhb3V0MC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQotTW9uIEZlYiAxMyAyMzoyNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEb24ndCByZXR1cm4gYSBwb2ludGVyCi0JdG8gZ2FyYmFnZSBpZiB0aGUgc3ltYm9sIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi1UaHUgRmViICA5IDE4OjM2OjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2bXNkb3Muby4KLQotVGh1IEZlYiAgOSAxMjowMjozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChORUVEU19TSFJMSUIpOiBEZWZpbmUuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDcmFzaCBpZiBhIE5FRURTX1NIUkxJQiBzeW1ib2wgaXMKLQl1bmRlZmluZWQuICBGcm9tIGhqbEBueW5leHN0LmNvbSAoSC5KLiBMdSkuCi0KLVdlZCBGZWIgIDggMTc6MjY6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFsbG9jYXRlIGNvbW1vbgotCXN5bWJvbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNvbW1vbgotCXN5bWJvbCBzaXplIG92ZXJmbG93LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWRqdXN0IHJlZmVyZW5jZXMKLQl0byBjb21tb24gc3ltYm9sIGluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDggMDk6NTM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUHV0IFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIgIVNIVF9OT0JJVFMuCi0KLVR1ZSBGZWIgIDcgMTY6Mjc6MzMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UsIGRvbid0Ci0JYWJvcnQuCi0KLVR1ZSBGZWIgIDcgMTQ6NDM6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IFJlZm9ybWF0dGVkIHNvbWUgY29tbWVudHMgYW5kIGJyYWNlIGNvbnN0cnVjdHMgaW4KLQlyZWNlbnQgY2hhbmdlcyB0byBHTlUgc3R5bGUuCi0JKGNtcF9mZHJ0YWJfZW50cnksIG1rX2ZkcnRhYiwgbG9va3VwKTogVXNlIG9sZC1zdHlsZSBmdW5jdGlvbgotCWRlZmluaXRpb25zLgotCi1UdWUgRmViICA3IDE0OjIxOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogWmVybyBvdXQgaW50ZXJuIGJlZm9yZSBzZXR0aW5nCi0JYW55IG9mIHRoZSBmaWVsZHMuCi0KLU1vbiBGZWIgIDYgMjA6MDE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBGZWIgIDQgMTQ6MjA6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX291dCk6IGFkZGVkCi0JaW50ZXJuYWxpemluZy9leHRlcm5hbGl6aW5nIG5ldyAicHJvZiIgZmllbGQuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3RkYXRhKTogYWRkZWQgZmRydGFiLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4ZWQuCi0KLU1vbiBGZWIgIDYgMTQ6MjU6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNhd19uZWVkZWQgaWYKLQlEVF9ORUVERUQgc2VlbiBpbiAuZHluYW1pYyBzZWN0aW9uLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogV2FybiBpZiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzCi0Jb25seSByZWZlcmVuY2VkIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIG5vdCBtYWtpbmcgYSBzaGFyZWQKLQlvYmplY3QsIGFuZCBzYXdfbmVlZGVkIGlzIGZhbHNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzYXdfbmVlZGVkLgotCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEb24ndCBkZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNsZWFyIG9yIHNldAotCUVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0KLQlEaXN0aW5ndWlzaCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIHJlZ3VsYXIgZGVmaW5lZCBzeW1ib2wuCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBERUZXLgotCShsaW5rX2FjdGlvbik6IEFkZCBiZmRfbGlua19oYXNoX2RlZndlYWsgY29sdW1uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBERUZXIGNhc2UuICBIYW5kbGUKLQliZmRfbGlua19oYXNoX2RlZndlYWsgaW4gYSBmZXcgb3RoZXIgY2FzZXMuCi0JKiBNYW55IGZpbGVzIChiZmRfbGlua19oYXNoX3VuZGVmd2Vhayk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW5rX2hhc2hfd2Vhay4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBMaWtld2lzZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogTElrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCShiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAgNiAwMzoyMDoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQsIGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU6Ci0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLW1zZG9zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGkzODZtc2Rvc192ZWMpOiBIYW5kbGUgaXQuCi0JKiBpMzg2bXNkb3MuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogTmV3IGZpbGUuCi0JKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBBZGRlZCBuZXcgdmFsdWUgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZy4KLQkoYmZkX2Vycm1zZ3MpOiBBZGRlZCBzdHJpbmcgdG8gdGFibGUuCi0JKiBsaWJhb3V0LmggKHJlbG9jX3R5cGUtbG9va3VwKTogRGVjbGFyZSBpdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ci4KLQkoaTM4Nm1zZG9zX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGl0IHRvIHRoZSBsaXN0LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEZlYiAgMSAwMTozMjoxNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbywgY2FzZSBSX0RBVEFfT05FX1NZTUJPTCk6IElmIHRoZXJlJ3MKLQlub3RoaW5nIGluIFJfREFUQV9PVkVSUklERSwgdGhlbiB0cnkgdG8gZmluZCB0aGUgYWRkZW5kIGluIHRoZQotCXNlY3Rpb24ncyBjb250ZW50cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IElnbm9yZSB0aGUgYWRkZW5kIGluIGEgUl9EQVRBX09ORV9TWU1CT0wgZml4dXAuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTW9yZSBoZXJ1aXN0aWNzIHRvIGRldGVjdCB0aGUKLQlicmFpbmRhbWFnZWQgSFAgT1NGMSBsaW5rZXIuIAotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGZvcmdldCB0byBmcmVlIHN1YnNwYWNlX3NlY3Rpb25zIGlmIHdlIGdldAotCWFuIGVycm9yLgotCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgc3RyaW5ncyBvbiB0aGlzIGJmZCdzIG9ic3RhY2sKLQlyYXRoZXIgdGhhbiBkaXJlY3RseSBvdXQgb2YgdGhlIGhlYXAuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCi0JY2Fub25pY2FsIHN5bWJvbHMuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMgd2hlbiB3ZSdyZQotCWRvbmUgd2l0aCB0aGVtLgotCi1UdWUgSmFuIDMxIDIxOjUzOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBtZW1iZXIgcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQkqIGVsZmNvZGUuaCAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgcGFyYW1ldGVycyBzb3J0ZWRfaGRycywKLQljb3VudCwgYW5kIG1heHBhZ2VzaXplLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQlJZiBzb3J0ZWRfaGRycyBpcyBub24tTlVMTCwgdXNlIGl0IHRvIGNvbXB1dGUgdGhlIG51bWJlciBvZiBzZWdtZW50cy4KLQlTYXZlIHJlc3VsdCBpbiBjYXNlIGNhbGxlZCBhZ2Fpbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IGhlYWRlcnMgYmVmb3JlIGNhbGxpbmcKLQlnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQotVHVlIEphbiAzMSAxNToyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBZGQgc29ydGVkX2hkcnMgcGFyYW1ldGVyLgotCVNlYXJjaCB0aHJvdWdoIGl0IHJhdGhlciB0aGFuIHRocm91Z2ggdW5zb3J0ZWQgc2VjdGlvbiBoZWFkZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFBhc3Mgc29ydGVkX2hkcnMgdG8KLQltYXBfcHJvZ3JhbV9zZWdtZW50cy4KLQotTW9uIEphbiAzMCAyMjowNDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4IHByb2JsZW1zIGluIHJhbmdlCi0JY2hlY2tpbmcuICBFeHBlY3QgYXJndW1lbnQgT0ZGU0VUIHRvIGJlIHNlY3Rpb24tcmVsYXRpdmUuICBGcm9tCi0JRGF2aWQgTW9zYmVyZ2VyLVRhbmcsIGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUuCi0KLU1vbiBKYW4gMzAgMTE6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IERvbid0IGRvCi0JYW55dGhpbmcgaWYgd2UgYXJlIG5vdCBsaW5raW5nIGFuIEVMRiBmaWxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDI4IDEyOjQ4OjU3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoY29tcGFyZV9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24gdG8gc29ydCBzdWJzcGFjZXMgYnkKLQl0aGVpciBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JKHNldHVwX3NlY3Rpb25zKTogV2hlbiBjb21wdXRpbmcgdGhlIGluZGV4IGZvciBlYWNoIHN1YnNwYWNlLAotCWhhbmRsZSBjYXNlIHdoZXJlIHNldHVwX3NlY3Rpb25zIHJlYWRzIHRoZSBzdWJzcGFjZXMgaW4gYQotCWRpZmZlcmVudCBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4KLQkoc29tX2lzX3NwYWNlKTogQWxzbyBleGFtaW5lIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcKLQlzZWN0aW9uLgotCShzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBMaWtld2lzZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBwcmVwYXJlIG9yIHdyaXRlIGZpeHVwcyBoZXJlLiAgV2hlbgotCXdyaXRpbmcgdGhlIHN5bWJvbCBzdHJpbmdzLCB1c2UgdGhlIHVuc29ydGVkIHN5bWJvbCB0YWJsZS4KLQkoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgaGVyZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogUHJlcGFyZSBhbmQgd3JpdGUgdGhlIGZpeHVwcyBoZXJlLiAgTGlrZXdpc2UKLQlmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVuZGVmaW5lZCBzeW1ib2xzIGFsd2F5cyBoYXZlCi0JdHlwZSBTU19VTlNBVCByZWdhcmRsZXNzIG9mIEJTRl9FWFBPUlQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFVucGFjayBhbmQgYXR0YWNoIGFyZ3VtZW50IGxvY2F0aW9uCi0JaW5mb3JtYXRpb24gZm9yIFJfUENSRUxfQ0FMTCBhbmQgUl9BQlNfQ0FMTCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBOZXcgaGV1cmlzdGljIHRvIGRldGVybWluZSBpZiB0aGUKLQllbnRyeSBhbmQgZmxhZ3MgZmllbGRzIGFyZSBzd2l0Y2hlZCBpbiB0aGUgZXhlYyBoZWFkZXIuCi0KLVNhdCBKYW4gMjggMDA6MTY6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSAqc3ltX2hhc2ggaW5zdGVhZAotCW9mIGggaWYgd2UgbWlnaHQgbm90IGJlIGRvaW5nIGFuIEVMRiBsaW5rLgotCi1GcmkgSmFuIDI3IDE2OjEzOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSWYgdGhlIHNpemUgb2YgYW4gaW5wdXQKLQkucmVnaW5mbyBzZWN0aW9uIGlzIHplcm8sIGZvcmNlIGl0IHRvIHRoZSBjb3JyZWN0IHNpemUsIHNpbmNlIHRoZQotCWxpbmtlciBlbXVsYXRpb24gY29kZSBtYXkgaGF2ZSBjbG9iYmVyZWQgaXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENvcnJlY3QgU0hGX0FMTE9DIHRlc3QuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRnJlZSBzb3J0ZWRfaGRycy4KLQotVGh1IEphbiAyNiAwOTowMDoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IG9mZiBieQotCW9uZSBlbmQgYWRkcmVzcyBjYWxjdWxhdGlvbi4KLQotCSogY29uZmlnLmJmZDogKG02OCotZXN0LWNvZmYpOiBOZXcgY29uZmlndXJhdGlvbi4KLQotVGh1IEphbiAyNiAxMTozOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBleGFtaW5lIHdlYWtkZWYgaWYKLQl3ZSBhcmUgdXNpbmcgYW4gRUxGIGhhc2ggdGFibGUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWx3YXlzIHNldCBFWEVDX1AgaWYKLQl0aGUgc3RhcnQgYWRkcmVzcyBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgZXZlbiBpZiBTVEFUX0ZPUl9FWEVDCi0JaXMgc2V0LiAgSnVzdCB1c2UgU1RBVF9GT1JfRVhFQyBhcyBhbiBhZGRpdGlvbmFsIHRlc3QuCi0KLVRodSBKYW4gMjYgMTE6MTI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mCi0JRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogQWRkIGFsbCBTeXN0ZW0gVi40IGFuZCBlQUJJCi0JcmVsb2NhdGlvbnMgY3VycmVudGx5IGRlZmluZWQuCi0JKHBvd2VycGNfcmVsb2NfbWFwKTogQWRqdXN0IHRvIG5ldyByZWxvY2F0aW9uIG5hbWVzLgotCShlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEFkZCBtb3N0IG9mIHRoZSBuZXcgcmVsb2NhdGlvbnMuCi0JKEVMRl9NQUNISU5FX0NPREUpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YgRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCByczYwMDAgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgdG8gdGhlCi0JUG93ZXJQQy4gIEFsc28gYWRkIFhDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKYW4gMjUgMjM6MjY6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENBTENfQURERU5EKTogRG9uJ3QgZGVmaW5lLgotCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLgotCi1UdWUgSmFuIDI0IDE0OjIyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQlFQ09GRiBzeW1ib2wgZnJvbSB0aGUgaGFzaCB0YWJsZSBlbnRyeS4KLQotTW9uIEphbiAyMyAxNDo1MzozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29mZi1zaC5jIChjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3Qgc3VidHJhY3QKLQl2bWEgdHdpY2UuCi0KLU1vbiBKYW4gMjMgMTM6MzM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jKTogRG9uJ3QgaWdub3JlIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBhbgotCVJfU0hfSU1NMzIgcmVsb2MuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFNldCBiZmRfbmFtZSB0byBpMzg2LWdudS4KLQkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2FsbCBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEphbiAyMCAxMTo0NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogT25seSBzZXQgdGhlIHN1bm9zIHNwZWNpZmljCi0JZmllbGRzIGlmIHdlIGFyZSBkb2luZyBhIHN1bm9zIGxpbmsuCi0KLVdlZCBKYW4gMTggMTI6Mjg6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCi0JImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KLQkoaDgzMDBoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwSCIgdG8gImg4MzAwaCIuCi0JKiBjb2ZmLWg4MzAwLmMgKHNwZWNpYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGRpZmYuCi0KLVR1ZSBKYW4gMTcgMTA6NTI6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBEZWZpbmUgaGVyZSwgbm90Li4uCi0JKiByZWxvYy5jIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IGhlcmUuCi0JKiBDaGFuZ2VkIGFsbCBvY2N1cnJlbmNlcyBvZiBgYGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QnJwotCXRvIGJlIGBgcmVsb2NfaG93dG9fdHlwZScnIGluc3RlYWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogRGVmaW5lIG5ldyByZWxvY3MgdXNlZCBvbiBJcml4LgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19NU1lNLAotCVNIVF9NSVBTX0RXQVJGLCBhbmQgU0hUX01JUFNfRVZFTlRTLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIHNlY3Rpb25zIG5hbWVkIC5tc3ltLCAuZGVidWdfKgotCWFuZCAuTUlQUy5ldmVudHMuKi4KLQotCSogc3JlYy5jIChzcmVjX2luaXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0KLVNhdCBKYW4gMTQgMTk6MDk6NDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGFyY2h1cmVzLmMsIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGJmZC1pbjIuaCwgY29mZmNvZGUuaCwKLQljb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGNvbmZpZy93NjUubXQ6IEluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIFc2NS4KLQotU3VuIEphbiAxNSAxMzo1Nzo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ29uZmlndXJlIGZvciBXSU4zMi4KLQotVGh1IEphbiAxMiAxNjozMDo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogSW5jbHVkZSBgaGVhZGVycycuCi0KLQkqIHN1bm9zLmMgKG02OGtfcGx0X2ZpcnN0X2VudHJ5LCBzcGFyY19wbHRfZmlyc3RfZW50cnkpOiBOb3cKLQljb25zdC4KLQkqIHRla2hleC5jIChkaWdzKTogRGl0dG8uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3BsdDBfZW50cnksIGVsZl9pMzg2X3BsdF9lbnRyeSk6IERpdHRvLgotCi0JKiBzcmVjLmMsIHRla2hleC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgRGVsZXRlIHN0YXRpYyBhcnJheQotCWhleF92YWx1ZSBhbmQgcmVwbGFjZSByZWZlcmVuY2VzIHRvIGl0IHdpdGggcmVmZXJlbmNlcyB0bwotCWhleF9pbml0LCBoZXhfcCwgYW5kIGhleF92YWx1ZS4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IE5vdyBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCk6IEFkanVzdGVkIHR5cGUgb2YgbG9jYWwgdmFyIGBwdGFibGUnLgotCi1UaHUgSmFuIDEyIDA5OjMzOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaG9zdHMvc3ltbWV0cnkuaDogIFJlZGVmaW5lIGBzaGFyZWQnIHRvIGVuYWJsZSBjb21waWxhdGlvbgotCXdpdGggdGhlIG5hdGl2ZSBEeW5peCBjYyBjb21waWxlci4KLQkqIGkzODZkeW5peC5jOiAgSW5jbHVkZSBhb3V0eC5oIGluc3RlYWQgb2YgdXNpbmcgcm91dGluZXMKLQlmcm9tIGFvdXQzMi5jLgotCi1XZWQgSmFuIDExIDIxOjMxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBNYWtlIHR5cGVkZWYgaW5jbHVkZSBgY29uc3QnLgotCSogYW91dC1uczMyay5jLCBhb3V0eC5oLCBib3V0LmMsIGNmLW02OGtseW54LmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZmxpbmsuYywgY3B1LW5zMzJrLmMsIGVjb2ZmLmMsCi0JZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGZjb2RlLmgsIGxpYmJmZC1pbi5oLCBsaW5rZXIuYywgbWlwc2JzZC5jLCBubG0zMi1wcGMuYywgb2FzeXMuYywKLQlyZWxvYy5jLCBzb20uYzogRG9uJ3QgdXNlIGBjb25zdCcgaW4gY29tYmluYXRpb24gd2l0aAotCWByZWxvY19ob3d0b190eXBlJy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBlY29mZi5jIChlY29mZl90eXBlX3RvX3N0cmluZyk6IExvY2FsIHZhcmlhYmxlIGBidWZmZXIxJyBkb2Vzbid0Ci0JbmVlZCB0byBiZSBzdGF0aWMuCi0KLVdlZCBKYW4gMTEgMTQ6MzY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNvcmUgZHVtcCBpZiBhIG11bHRpcGxlCi0JZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElnbm9yZQotCXJlZGVmaW5pdGlvbnMgb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lIHZhbHVlLgotCi1Nb24gSmFuICA5IDE1OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJdCdzIHJlYXNvbmFibGUgZm9yIG5vCi0JZmxhZ3MgdG8gYmUgc2V0LCBzbyBkb24ndCBpbnNpc3Qgb3RoZXJ3aXNlLgotCi1GcmkgSmFuICA2IDE2OjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IEJTRl9HTE9CQUwgZm9yIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgSmFuICA0IDE0OjE0OjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSByZXR1cm4gc2VjdGlvbnMgd2hpY2gKLQljb3JyZXNwb25kIHRvIHN1YnNwYWNlcy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZm9yZ2V0IHRvIGJ1bXAgdGhlCi0JdG90YWxfc3Vic3BhY2VzIHdoZW4gd3JpdGluZyB0aGUgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0KLVdlZCBEZWMgMjggMjA6NTQ6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogVXNlIFNFQ19IQVNfQ09OVEVOVFMgdG8gaWRlbnRpZnkKLQlic3MtbGlrZSBzZWN0aW9ucy4KLQkoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDI3IDE0OjAzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciBic3MtbGlrZQotCXNlY3Rpb25zLgotCi1UdWUgRGVjIDIwIDE1OjMwOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBEZWxldGVkLgotCShjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBSZXR1cm4gYWJzb2x1dGUgc2VjdGlvbiBmb3IgZGVidWcKLQlzeW1ib2wuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIENfRklMRSBzeW1ib2xzLiAgSWYKLQlCU0ZfREVCVUdHSU5HIGlzIHNldCwgc2V0IHNlY3Rpb24gdG8gTl9ERUJVRy4KLQkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBVc2UgYWJzb2x1dGUgc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEluIGFzc2VydGlvbiwKLQlmb3JjZSBhbGwgdmFsdWVzIHRvIHRoZSBzYW1lIHR5cGUuCi0KLVR1ZSBEZWMgMjAgMTE6MTE6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFsbCByZWxvY3MgZ2V0IGEgc3BlY2lhbCBmdW5jdGlvbi4KLQkoc3BlY2lhbCk6IE5ldmVyIGRvIGFueXRoaW5nIHdoZW4gbGlua2luZyAtci4KLQotVHVlIERlYyAyMCAxMzo1ODowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIExpbnV4Ci0Jc3BlY2lmaWMgaWYgdGhpcyBpcyBub3QgYSBMaW51eCBoYXNoIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljQGFpYi5jb20+LgotCi0JUGF0Y2hlcyBmcm9tIGtrb2ppbWFAbWl4Lm9yLmpwIChLYXp1bW90byBLb2ppbWEpOgotCSogbWlwc2JzZC5jIChtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENoYW5nZSBzaXplcyBvZiBtZW1vcnkgcmVsb2NzCi0JYXBwbHkgdG8gZnJvbSB0d28gYnl0ZXMgdG8gZm91ciBieXRlcy4KLQkqIE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IGFuZCBleHBhbmQgdGhlCi0JbGlzdCBvZiBjYXNlcyBmb3Igd2hpY2ggcmVsb2NhdGlvbiBuZWVkIG5vdCBiZSBjb21wdXRlZC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotTW9uIERlYyAxOSAyMzowOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBEZWxldGUgZG9fbG9jYWxzIGFuZAotCWRvX2dsb2JhbHMgYXJndW1lbnRzLCBhbHdheXMgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvcgotCWdsb2JhbHMgYW5kIGxvY2Fscy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFJld29yayB0byBvbmx5IHJlYWQgc3ltYm9sIGV4dGVuc2lvbgotCWluZm9ybWF0aW9uIG9uY2UgZm9yIGVhY2ggaW5wdXQgYmZkLiAgMTAlIGltcHJvdmVtZW50IGluIGxpbmtlcgotCXBlcmZvcm1hbmNlLgotCi1GcmkgRGVjIDE2IDEyOjI4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2hlY2sKLQliZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4sIG9ubHkgYWZ0ZXIgY2hlY2tpbmcgZm9yIHRoZSBzZWN0aW9uIGluCi0JdGhlIEJGRCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUgYmFja2VuZCByb3V0aW5lLgotCi1XZWQgRGVjIDE0IDIwOjIxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBPbmx5IHVzZSBzZWN0aW9uIHN5bWJvbHMgd2hvc2UKLQl2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIGNoZWNraW5nIG91dHB1dF9vZmZzZXQgd2hlbgotCXVzaW5nIG91dHB1dF9zZWN0aW9uLiAgV2hlbiBjcmVhdGluZyBhIG5ldyBzeW1ib2wsIHNldCB0aGUgdmFsdWUKLQl0byAwLCBzaW5jZSBCRkQgc3ltYm9sIHZhbHVlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZS4KLQotVHVlIERlYyAxMyAxMzozMTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNwdS16OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE1ha2UgejgwMDIgdGhlIGRlZmF1bHQKLQlhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDkgMTI6NDM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlCi0JYXJjaGl2ZSBpcyBub3QgYW4gRUxGIG9iamVjdCwgcGFzcyB0aGUgYXJjaGl2ZSB0byB0aGUgYWRkX3N5bWJvbHMKLQllbnRyeSBwb2ludCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpcnN0IG9iamVjdC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY0BhaWIuY29tPi4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IFNpbWlsYXIgY2hhbmdlIGlmIHRoZQotCWZpcnN0IG9iamVjdCBpcyBub3QgYW4gYS5vdXQgb2JqZWN0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb21wdXRlCi0JcmVsb2NhdGlvbiBpbiBjYXNlcyB3aGVyZSB3ZSB3b24ndCB1c2UgaXQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgIDggMTQ6MTk6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcGM1MzItbWFjaC5jIChOQU1FKTogRGVmaW5lIHRvIHVzZSBuczMya2FvdXQgcHJlZml4LgotCSogbnMzMmtuZXRic2QuYyAoTkFNRSk6IERpdHRvLgotCShuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gc3RhbmRhcmQgYW91dC0zMgotCXZlcnNpb24uCi0KLUZyaSBEZWMgIDIgMTM6NTY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVhZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19yZWxheF9zZWN0aW9uLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBDYWxsIG1pcHNfcmVhZF9yZWxvY3MuCi0JKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX21uaXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1XZWQgTm92IDMwIDE0OjEyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jOiBVc2UgX2JmZF9kdW1teV90YXJnZXQgaW5zdGVhZCBvZiBub19hcmNoaXZlLgotCi1UdWUgTm92IDI5IDE0OjAwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0AucnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4Ni1ic2QgYXMgYmZkX25hbWUuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2YnNkIGFzIG15X2hvc3QuCi0KLU1vbiBOb3YgMjggMTU6MzY6MDQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4ay1uYnNkLm10IChERUZBVUxUX1ZFQ1RPUik6IHNldCB0byBtNjhrbmV0YnNkX3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGFuY2llcy4KLQkgIChDRklMRVMpOiBBZGRlZCBtNjhrbmV0YnNkLmMuCi0JICAoSEZJTEVTKTogQWRkZWQgbmV0YnNkLmguCi0KLVdlZCBOb3YgMjMgMTk6MjE6NDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShub19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlCi0JbGl0dGxlIGVuZGlhbiBTSC4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNobC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hsY29mZl92ZWMuCi0JKiBjb25maWcvc2gtY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBIYW5kbGUgc2hsX2NvZmZfdmVjLgotCi1XZWQgTm92IDIzIDEwOjUwOjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERvIG5vdCBzdWJ0cmFjdCB0aGUgc2VjdGlvbidzIHZtYSBmcm9tCi0JdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyAubydzLiAgSW5zdGVhZCBhZGQgdGhlIHNlY3Rpb24ncwotCXZtYSB0byB0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkCi0JbGlicmFyeS4KLQotVHVlIE5vdiAyMiAyMzozNDozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG8gbm90IGFkZAotCWlucHV0X3NlY3Rpb24tPnZtYSB0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotTW9uIE5vdiAyMSAxMjozNzoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLgotCShzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoc3JlY192ZWMsIHN5bWJvbHNyZWNfdmVjKTogVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYykuCi0KLVNhdCBOb3YgMTkgMDM6MTA6NTEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1zb2xhcmlzKik6ICBVc2Ugc29sYXJpczIgdG8KLQllbmFibGUgZXh0cmFjdGlvbiBvZiBwcm9jZnMgaW5mbyBmcm9tIGNvcmUgZmlsZSBmb3IgR0RCLgotCi1UaHUgTm92IDE3IDE3OjM3OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbmV3IHZhbHVlIEJGRF9SRUxPQ18xMl9QQ1JFTC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLVRodSBOb3YgMTcgMTM6MTI6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC9lbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGVkKTogVXNlIHRoZQotCXZtYSBmcm9tIHRoZSBvdXRwdXRfc2VjdGlvbiBjb250YWluaW5nICRnbG9iYWwkIHdoZW4gY29tcHV0aW5nCi0JZ2xvYmFsX3ZsYXVlLgotCi1UaHUgTm92IDE3IDE0OjI5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSb3VuZCB1cCB0aGUgYXJjaGl2ZQotCWhlYWRlciBzaXplIG9mIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHRvIGFuIGV2ZW4gbnVtYmVyLgotCi1XZWQgTm92IDE2IDE2OjA4OjA2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogRGVsZXRlZCBzb21lIGNvZGUgdGhhdCB3YXMgY29tbWVudGVkIG91dCBvciBpbnNpZGUKLQkiI2lmIDAiLgotCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvbnZlcnQgbmFtZSB0byBsb3dlcmNhc2UsIGZvcgotCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQotU2F0IE5vdiAxMiAyMzo1MDoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2V4cG9ydF9zeW1ib2wpOiBBbHNvIGV4cG9ydCBzeW1ib2xzIHdoaWNoIGFyZQotCXJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUuCi0KLUZyaSBOb3YgMTEgMTQ6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgaXQuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBOb3YgMTEgMTA6MzU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfc3RydWN0KTogRGVsZXRlIGhhbmRsZXMgZm9yIHRoZQotCWRhdGEsIHJlZyBhbmQgc3RhY2sgc2VjdGlvbnMuICBUaGV5J3JlIG5ldmVyIHVzZWQuICBEZWxldGUKLQlhY2Nlc3NvciBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHNpbmNlIGRlYnVnZ2luZwotCWNvcmVzIGZyb20gZHluYW1pYyBleGVjdXRhYmxlcyBtYXkgaGF2ZSBzZXZlcmFsIHNlY3Rpb25zIHdpdGggdGhlCi0Jc2FtZSBsb2dpY2FsIG5hbWUuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IERvbid0IHNhdmUgaGFuZGxlcyB0byBkYXRhLCByZWcgYW5kCi0Jc3RhY2sgc2VjdGlvbnMuICBIYW5kbGUgQ09SRV9URVhULCBDT1JFX01NRiBhbmQgQ09SRV9TSE0uCi0KLVR1ZSBOb3YgIDggMTM6MDM6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogQWRkIG5ldyBhcmd1bWVudCBzaHJpbmtpbmcuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIEhhbmRsZSByZWxvY3MgYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgY29ycmVjdGx5LiAgSWYgbm90Ci0Jc2hyaW5raW5nLCBkb24ndCBzdWJ0cmFjdCBvdXQgZHN0aWR4OyB0aGUgc3VidHJhY3Rpb24gaXMgYWxyZWFkeQotCWluIHRoZSBvYmplY3QgZmlsZS4KLQotU3VuIE5vdiAgNiAxMjo1MjowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmg6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSA8c2hsLmg+IGFuZCA8ZGwuaD4uCi0KLVRodSBOb3YgIDMgMTg6MTk6MTMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEluY2x1ZGUgbTY4a25ldGJzZC5vLgotCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChFWFRSQUxJQlMpOiBJbmNsdWRlIC1sbS4KLQotCVBhdGNoZXMgZnJvbSBESiBEZWxvcmllOgotCSogY29mZi1nbzMyLmM6IFJlcGxhY2VtZW50IGZpbGUsIHVzZXMgY29mZi1pMzg2LmMgd2l0aCBtaW5vcgotCWNoYW5nZXMuCi0JKiBjb2ZmLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBhbGxvdyBvdGhlciBmaWxlcyB0byBvdmVycmlkZQotCXVuZGVyc2NvcmUgYWxzbwotCSogbWFrZWZpbGUuZG9zOiBkZWwgY3Rvci5vLCBhZGQgY29mZmxpbmsubyBhbmQgZWxmMzIubwotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHVzZXIgc2V0IGRhdGEgc2VjdGlvbiB2bWEsIHVzZSBpdAotCXRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBic3Mgdm1hLiAgUGF0Y2ggZnJvbSBUYWthZGEgSGlyb2FraSwKLQloaXJvQGlzLnMudS10b2t5by5hYy5qcC4KLQkobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX3ZheCk6IFNldCAqdW5rbm93biB0byBmYWxzZS4gIFBhdGNoCi0JZnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgotCi0JKiBjb25maWd1cmUuaW4gKHRiKTogUmVuYW1lIG5zMzJrbmV0YnNkX3ZlYyB0byBwYzUzMm5ldGJzZF92ZWMsCi0Jc2luY2UgdGhhdCdzIHdoYXQgaXQncyBjYWxsZWQuCi0KLVdlZCBOb3YgIDIgMTU6MjQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IENoYW5nZSB0byB0YWtlIGEgQkZEIGFzIGFuIGFyZ3VtZW50LgotCUNoYW5nZSBWTVMgdmVyc2lvbiB0byB1c2UgYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYywgc28gdGhhdCB3ZQotCWRvbid0IGxvc2UgdGhlIG1lbW9yeSBmb3JldmVyLgotCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZQotCWVudHJ5IHdoaWNoIGlzIG5vdCBiZWluZyBleHRlbmRlZCwgYW5kIGNvcnJlY3QgaXQgaWYgaXQgaXMgd3JvbmcuCi0JVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSB0aGUgYXJjaGl2ZSB3YXMgY29uc3RydWN0ZWQgYnkgYW5vdGhlcgotCXByb2dyYW0gd2hpY2ggcHV0IGFuIGVudHJ5IGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHdoaWNoIHdlCi0JZG9uJ3QgcGxhbiB0byBwdXQgaW4gb3Vyc2VsdmVzLiAgRnJvbSBqamNAamNsYXJrLmNvbSAoSmFtZXMKLQlDbGFyaykuCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBub3JtYWxpemUuCi0KLU1vbiBPY3QgMzEgMTQ6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmMgKEVMRjMyX1BBUklTQ19TWF9TSVpFKTogRGVmaW5lLgotCShFTEYzMl9QQVJJU0NfU1hfR0VULCBFTEYzMl9QQVJJU0NfU1hfUFVUKTogRGVmaW5lLgotCShzeW1leHRuX2VudHJ5KTogRG9uJ3QgZGVmaW5lLgotCShzeW1leHRfY2hhaW5fc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCi0JKHN5bWV4dG5fY29udGVudHMpOiBDaGFuZ2UgdHlwZSB0byBiZmRfYnl0ZSAqLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4KLQkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIHR5cGUgb2Ygc2l6ZXAgdG8KLQliZmRfc2l6ZV90eXBlICouCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBDYXN0IHN5bWV4dG5fY29udGVudHMgYXNzaWdubWVudCB0bwotCWJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1BVVCBpbnN0ZWFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuICBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfR0VUIGluc2V0YWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGNvbnRlbnRzLCBhbmQgaXRzCi0JYXNzaWdubWVudCBjYXN0LCB0byBiZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQKLQlvZiBzaXplb2YgKHN5bWV4dG5fZW50cnkpLiAgVXNlIHN5bWV4dF9lbnRyeVMgaW5zdGVhZCBvZgotCXN5bWV4dG5fZW50cnkuICBVc2UgRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnN0ZWFkIG9mIGRpcmVjdAotCWFzc2lnbm1lbnQuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQWRkIHRoZSBhciBwYWRkaW5nCi0JY2hhcmFjdGVyLCBpZiB0aGVyZSBpcyByb29tIGZvciBpdCwgZXZlbiBpZiB0aGUgbmFtZSBpcyB0aGUKLQltYXhpbXVtIGxlbmd0aC4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgdGhlIEVMRgotCWhlYWRlcnMgYnkgc2VjdGlvbiBhZGRyZXNzIHdoZW4gYXNzaWduaW5nIGZpbGUgcG9zaXRpb25zLgotCShlbGZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU3VuIE9jdCAzMCAxODo1Njo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDcmVhdGUgRFRfSU5JVAotCWFuZCBEVF9GSU5JIGR5bmFtaWMgZW50cmllcyBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIF9pbml0IGFuZAotCV9maW5pIHN5bWJvbHMsIG5vdCBvbiB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLiAgVGhpcyBpcwotCWNvbXBhdGlibGUgd2l0aCBzb21lIFNWUjQgbGlua2Vycy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVNhdCBPY3QgMjkgMTI6MTg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1vdmUgYQotCXN5bWJvbCB3aXRoIGEgUExUIGVudHJ5IGludG8gdGhlIC5wbHQgc2VjdGlvbiBpZiBpdCBpcyBkZWZpbmVkIGluCi0JYSByZWd1bGFyIGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJdCdzIG5vdCBhbgotCWVycm9yIGlmIGFuIGVtcHR5IGFyY2hpdmUgaGFzIG5vIHN5bWJvbCB0YWJsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjggMTA6MDg6NDEgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0gICAgICAgIE5ldEJTRC9tNjhrIHN1cHBvcnQsIGJhc2VkIG9uIHdvcmsgYnkgbWlrZWJAc25vdy5kYXRhbWV0cmljcy5jb206IAotCSogY29uZmlnLmJmZCAobTY4Ki0qLW5ldGJzZCopOiBVc2UgbTY4ay1uYnNkIGFzIGJmZF9uYW1lLgotCSogY29uZmlndXJlLmluIChtNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgotCSogdGFyZ2V0cy5jIChiZmRfbTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KLQkqIGhvc3RzL202OGtuYnNkLmgsIGNvbmZpZy9tNjhrLW5ic2QubXQsIG02OGtuZXRic2QuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgbTY4a25ldGJzZC5jLgotCi0JbWlzY2VsbGFuZW91cyBjbGVhbnVwIHJlcXVpcmVkIGJ5IGFsbCBuZXRic2QgdGFyZ2V0cywgYmFzZWQgb24gd29yayAKLQlieSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PjoKLQkqIG5ldGJzZC5oIChOX01BR0lDLCBOX1NFVF9NQUdJQywgTl9HRVRNQUdJQywgTl9HRVRNQUdJQzIsIE5fVFhUQUREUiwKLQkgIE5fVFhUT0ZGLCBOX0FMSUdOLCBOX0RBVEFERFIsIE5fREFUT0ZGKTogUmVtb3ZlZC4gIEdlbmVyaWMgYS5vdXQKLQkgIGRlZmluaXRpb25zIHdvcmsuCi0JKiBpMzg2bmJzZC5jLCBuczMya25ic2QuYywgc3BhcmNuYnNkLmMgKF9fTERQR1NaKTogUmVtb3ZlZC4KLQkgIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIE5ldEJTRCdzIG1hZ2ljIG51bWJlcnMKLQotVGh1IE9jdCAyNyAxNjo1OTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgZHluaW5keC4KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBmaW5hbGl6ZQotCXRoZSAuZHluc3ltLCAuZHluc3RyIG9yIC5oYXNoIHNlY3Rpb25zIHVudGlsIGFmdGVyIHRoZSBiYWNrZW5kCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUsIHNvIHRoYXQgaXQgY2FuIGFkZCBkeW5hbWljIHN5bWJvbHMKLQlpZiBpdCB3YW50cyB0by4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIHRoZQotCXN5bWJvbCB0byBiZSBpbiB0aGUgLnBsdCBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5Ci0JaWYgaXQgaXMgYSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQKLQlzZWN0aW9uLCBzdG9yaW5nIHRoZSBpbmRleCBpbiB0aGUgZHluaW5keCBmaWVsZCBvZiB0aGUgRUxGIHNlY3Rpb24KLQlkYXRhLiAgQWRqdXN0IHRoZSBvdGhlciBkeW5pbmR4IGZpZWxkcyB0byBhY2NvdW50IGZvciB0aGlzLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIGEgc2hhcmVkCi0JbGlicmFyeSwgdXNlIHRoZSBvcmlnaW5hbCBhZGRlbmQgYXMgYXBwcm9wcmlhdGUuICBDb252ZXJ0IGFuCi0JUl9TUEFSQ18zMiByZWxvYyBpbnRvIGFuIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MuICBVc2UgdGhlIGR5bmFtaWMKLQlzeW1ib2wgaW5kZXggb2YgdGhlIG91dHB1dCBzZWN0aW9uLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgaW5kZXguCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc2VjdGlvbiBkb2VzCi0Jbm90IGV4aXN0IHdoZW4gc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGR5bmFtaWMgdGFncy4gIFdyaXRlIG91dAotCWEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCi0KLVdlZCBPY3QgMjYgMDE6MTU6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byByZWFkIG9yIHdyaXRlCi0JdGhlIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi1UdWUgT2N0IDI1IDExOjQ0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0ZWtoZXguby4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBJZiBTRUxFQ1RfVkVDUyBpcyBub3QgZGVmaW5lZCwKLQlpbmNsdWRlIHRla2hleF92ZWMuCi0JKiB0ZWtoZXguYyAoTklCQkxFLCBJU0hFWCk6IENhc3QgYXJyYXkgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGNoYXIuCi0JKGdldHZhbHVlLCBnZXRzeW0sIG91dCk6IExpa2V3aXNlLgotCShmaW5kX2NodW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgotCShmaXJzdF9waGFzZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KLQkocGFzc19vdmVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhZGRyZXNzLgotCSh0ZWtoZXhfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNlY3Rpb24uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tIGJvb2xlYW4gdG8gdm9pZC4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRkYXRhIGFuZAotCWxpc3QuCi0KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIENJTkQuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1dcaW5kciBmcm9tIE1ERUYgdG8gQ1JFRi4gIENoYW5nZQotCUlORFJfUk9XXGNvbW1vbiBmcm9tIE1ERUYgdG8gQ0lORC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJbiBDUkVGIGNhc2UsIGhhbmRsZSBhbgotCWV4aXN0aW5nIHN5bWJvbCB3aGljaCBpcyBpbmRpcmVjdCByYXRoZXIgdGhhbiBkZWZpbmVkLiAgQWRkIG5ldwotCUNJTkQgY2FzZS4KLQotTW9uIE9jdCAyNCAxNTozMzoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgUy1yZWNvcmQgYmFja2VuZCB0byB1c2UgbXVsdGlwbGUgc2VjdGlvbnMgdG8gaGFuZGxlIGdhcHMgaW4KLQlmaWxlLgotCSogc3JlYy5jIChzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QpOiBNb3ZlIGZpZWxkIG5leHQgZnJvbSBsYXN0IHBsYWNlCi0JdG8gZmlyc3QuICBDaGFuZ2UgdHlwZSBvZiBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHN0cnVjdCBzcmVjX3N5bWJvbCk6IERlZmluZS4KLQkodGRhdGFfdHlwZSk6IFJlbW92ZSBkb25lX3N5bWJvbF9yZWFkLCBjb3VudCwgc3RyaW5ncywgc3ltYm9sX2lkeCwKLQlzdHJpbmdfc2l6ZSwgc3RyaW5nX2lkeC4gIENoYW5nZSB0eXBlIG9mIHN5bWJvbHMgdG8gc3RydWN0Ci0Jc3JlY19zeW1ib2wgKi4gIEFkZCBzeW10YWlsIGFuZCBjc3ltYm9scy4KLQkobG93LCBoaWdoKTogUmVtb3ZlLgotCShzaXplX3N5bWJvbHMsIGZpbGx1cF9zeW1ib2xzLCBzaXplX3NyZWMsIGZpbGx1cCk6IFJlbW92ZS4KLQkod2hpdGUsIHNraXB3aGl0ZSwgcGFzc19vdmVyLCBvYmplY3RfcCk6IFJlbW92ZS4KLQkoc3JlY19ta29iamVjdCk6IENhbGwgc3JlY19pbml0LiAgQWRqdXN0IHRkYXRhIGluaXRpYWxpemF0aW9uIGZvcgotCWZpZWxkIGNoYW5nZXMuCi0JKHNyZWNfZ2V0X2J5dGUsIHNyZWNfYmFkX2J5dGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19uZXdfc3ltYm9sLCBzcmVjX3NjYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IENoYW5nZSB0eXBlIG9mIGIgdG8gYmZkX2J5dGUuICBFeHBsaWNpdGx5IHNldAotCXdyb25nX2Zvcm1hdCBlcnJvci4gIENhbGwgc3JlY19ta29iamVjdCBhbmQgc3JlY19zY2FuIGluc3RlYWQgb2YKLQlvYmplY3RfcC4KLQkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIGIgdG8gYmUgb25seSB0d28KLQlieXRlcy4KLQkoc3JlY19yZWFkX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBzcmVjX3JlYWRfc2VjdGlvbiByYXRoZXIgdGhhbgotCXBhc3Nfb3Zlci4gIEhhbmRsZSB6ZXJvIGxlbmd0aCBzZWN0aW9uIGNvcnJlY3RseS4KLQkoc2V0X3NldF9hcmNoX21hY2gpOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byBtYWNyby4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIGRhdGEsIGVuZCBhbmQgc3JjIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIGJ1ZmZlciBhbmQgZHN0IHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfc2VjdGlvbik6IENoYW5nZSBsb2NhdGlvbiB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBDaGFuZ2UgYnVmZmVyIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERvbid0IGNhbGwKLQlzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzLgotCShzcmVjX2dldF9zeW10YWIpOiBSZXdyaXRlLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBTZXQgdWRhdGEuaSB0byAwLCBub3QgTlVMTC4KLQotRnJpIE9jdCAyMSAxNjo0MzoxMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogYWRkZWQgTV82OEtfTkVUQlNEIGFuZCBNX1NQQVJDX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYywgbnMzMmtuZXRic2QuYywgc3BhcmNuZXRic2QuYzogcmVtb3ZlZCBSQ1MgSWQncy4KLQkgIGNoYW5nZWQgaG93IFBBR0VfU0laRSBhbmQgU0VHTUVOVF9TSVpFIGFyZSBkZWZpbmVkIHNvIHRoZXkgYXJlCi0JICBjb25zaXN0YW50IHdpdGggZWFjaCBvdGhlci4KLQkqIG5ldGJzZC5oIChOX0hFQURFUl9JTl9URVhULCBURVhUX1NUQVJUX0FERFIpOiBOZXRCU0QgZml0cyBpdHMKLQkgIGhlYWRlciBpbnRvIHRoZSBzdGFydCBvZiBpdHMgdGV4dCBzZWdtZW50LgotCi1GcmkgT2N0IDIxIDE3OjEzOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIGNhc2UgZm9yCi0JX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgotCShiZmRfdGFyZ2V0KTogQWRkIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCi0JKiBhcmNoaXZlLmMgKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcKLQlmdW5jdGlvbi4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW5hbWVkIGJ5IGFkZGluZyBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuICBBZGRlZCB0cmFpbGluZ19zbGFzaAotCWFyZ3VtZW50LCBhbmQgdXNlZCBpdCBpbnN0ZWFkIG9mIGVsZl9zdHlsZS4gIENoYW5nZWQgdHlwZSBvZgotCXRhYmxlbiB0byBiZmRfc2l6ZV90eXBlICouCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBCRkRfU0VORCB0byBjYWxsCi0JY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuICBVc2UgdGhlIHJldHVybmVkIG5hbWUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCi0JRml4IHRoZSBFTEYgbGlua2VyIHRvIG5vdCByZXF1aXJlIGFuIGludGVycHJldGVyIGlmIG5vIGR5bmFtaWMKLQlvYmplY3RzIHdlcmUgc2VlbiwgZXZlbiB3aGVuIGxpbmtpbmcgUElDIGNvZGUuCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGR5bnN0ciBpZiBpdAotCWRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgZmllbGQsIG5vdCBkeW5vYmogZmllbGQuICBEb24ndCBib3RoZXIgdG8KLQlzZXQgZHlub2JqLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQotCWFscmVhZHkgY3JlYXRlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICBJZiBkeW5vYmogaXMgYWxyZWFkeSBzZXQsIHVzZQotCWl0OyBvdGhlcndpc2UsIHNldCBpdCB0byB0aGUgYmZkIGFyZ3VtZW50LiAgRG9uJ3QgaW5pdGlhbGl6ZQotCWR5bnN5bWNvdW50LiAgT25seSBjcmVhdGUgZHluc3RyIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgU2V0Ci0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHRvIHRydWUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogU2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24KLQlpZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIHRoZQotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcgc2V0LCBsZXQgdGhlIGJhY2tlbmQgYWRqdXN0IGl0LgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGFuZ2UgbW9zdCBkZWNpc2lvbnMgYmFzZWQgb24gZHlub2JqIHRvCi0JY2hlY2sgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGluc3RlYWQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgaWYgYSBkeW5hbWljCi0Jb2JqZWN0IHdhcyBzZWVuLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZXcgZmllbGQKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuICBTZXQgZHluc3ltY291bnQgdG8gMSwgbm90IDAuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbAotCWVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbiBjcmVhdGluZyB0aGUgLmdvdCBhbmQKLQkuZ290LnBsdCBzZWN0aW9ucy4KLQkoZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjYWxsIGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhIHJlbG9jLAotCWZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gIEZvciBhCi0JUl8zODZfUExUMzIgcmVsb2MsIGp1c3Qgc2V0IHRoZQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KLQlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8KLQlkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sCi0Jc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUgLnJlbC5nb3QKLQlzZWN0aW9uIHRvIHplcm8uCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzM4Nl9HT1QzMiByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCi0Jc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIFJfMzg2X0dPVDMyIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVRyZWF0IGEgUl8zODZfUExUMzIgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfMzg2X1BDMzIgcmVsb2MuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUgZHluYW1pYwotCWVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBGaXggUl9TUEFSQ19QQzIyIGJ5Ci0Jc2V0dGluZyByaWdodHNoaWZ0IHRvIDEwLiAgRml4IFJfU1BBUkNfV1BMVDIwIGJ5IHNldHRpbmcKLQlyaWdodHNoaWZ0IHRvIDIsIHNpemUgdG8gMiwgYml0c2l6ZSB0byAzMCwgYW5kIGRzdF9tYXNrIHRvCi0JMHgzZmZmZmZmZi4KLQkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIHNpemUgb2YgdGhlCi0JLnBsdCBzZWN0aW9uLiAgQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljcmVhdGluZyB0aGUgLmdvdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYQotCXJlbG9jLCBmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIC5yZWxhLmdvdCBzZWN0aW9uIHRvIDIuICBGb3IgYQotCVJfU1BBUkNfV1BMVDMwIHJlbG9jLCBqdXN0IHNldCB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCi0JcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8gZHluYW1pYwotCW9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuICBJbml0aWFsaXplIHRoZSBzaXplCi0Jb2YgdGhlIC5wbHQgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUKLQlzZWVuLCBza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZQotCS5yZWxhLmdvdCBzZWN0aW9uIHRvIHplcm8uICBTdHJpcCBlbXB0eSByZWxvYyBzZWN0aW9ucywgYW5kIHN0cmlwCi0JYW4gZW1wdHkgLnBsdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKLQlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JVHJlYXQgYSBSX1NQQVJDX1dQTFQzMCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl9TUEFSQ19XRElTUDMwIHJlbG9jLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlCi0JZHluYW1pYyBlbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgotCi1UaHUgT2N0IDIwIDEzOjI4OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCB3b3JyeSBhYm91dCBzZWN0aW9uIHN5bWJvbHMKLQlpbiBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBTZXBhcmF0ZSBvdXQgbG9vcCB3aGljaCBjYWxscwotCWJhY2tlbmQgcm91dGluZS4gIENoZWNrIGJmZF9zZWN0aW9uIGFuZCBjYWxsIHRoZSBiYWNrZW5kIHJvdXRpbmUKLQlldmVuIGZvciBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZQotCS5hY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBPY3QgMTkgMTM6Mjg6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBNYWtlIG5hbWVzIGZvciBzZWN0aW9uIG51bWJlciBhbmQKLQlzdG9yYWdlIGNsYXNzIHNsaWdodGx5IG1vcmUgdmVyYm9zZS4gIEl0J3Mgbm90IGNsZWFyIGhvdyBtYW55Ci0JY2hhcmFjdGVycyBJIGNhbiBqdXN0aWZ5IHVzaW5nIHVwLCBidXQgYmVmb3JlIHRoaXMgY2hhbmdlIHRoZXkKLQlib3RoIHdlcmUgYWJicmV2aWF0ZWQgInNjIiB3aGljaCBpcyAoSU1ITykgY2xlYXJseSB1bmFjY2VwdGFibGUuCi0KLVdlZCBPY3QgMTkgMDE6MjY6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHRoZSBiYXNlIGZpbGUKLQlwb3NpdGlvbiBmcm9tIHRoZSBsb3dlc3Qgc2VjdGlvbiBWTUEsIG5vdCB0aGUgc3RhcnQgYWRkcmVzcy4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IKLQlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTggMTI6NTY6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weQotCXN1YmZvcm1hdCB0byBhbm90aGVyIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIGZpbGUuCi0KLQkqIGJpbmFyeS5jOiBOZXcgZmlsZSBmb3IgcmF3IGJpbmFyeSBvdXRwdXQgZm9ybWF0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkIGJpbmFyeS5vLgotCShDRklMRVMpOiBBZGQgYmluYXJ5LmMuCi0JKiB0YXJnZXRzLmMgKGJpbmFyeV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmluYXJ5X3ZlYy4KLQotCSogc3JlYy5jICh0ZGF0YV90eXBlKTogQWRkIGZpZWxkIHRhaWwuCi0JKHNyZWNfbWtvYmplY3QpOiBJbml0aWFsaXplIHRhaWwuCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTb3J0IFMgcmVjb3JkIGxpc3QgYnkgYWRkcmVzcy4KLQotTW9uIE9jdCAxNyAxMTozODoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogU29ydCB0aGUgc3ltYm9scyBpbnRvIGEgbmV3IGFycmF5LAotCXJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCBFbGZfU3ltX0V4dHJhLiAgU3RvcmUgdGhlIHN5bWJvbCBpbmRleCBpbgotCXRoZSB1ZGF0YS5pIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogVXNlIG91dGJvdW5kX3N5bXMgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGFzIGFuCi0JYXJyYXkuICBEb24ndCB3b3JyeSBhYm91dCBlbGZfc3ltX251bS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KLQkoRWxmX1N5bV9FeHRyYSk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgc3ltX2V4dHJhIGZpZWxkLgotCShlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCXVkYXRhLmkgcmF0aGVyIHRoYW4gZWxmX3N5bV9leHRyYSBhcnJheS4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQ2hhbmdlIHVkYXRhIGZpZWxkIGludG8gYSB1bmlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFVzZSB1ZGF0YS5wIHJhdGhlcgotCXRoYW4ganVzdCB1ZGF0YS4KLQkqIGJvdXQuYyAocGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoZmlsbHVwX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGdldF9pbmRleCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGp1c3QgdWRhdGEuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKHNldF9pbmRleCk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltX2luZGV4LCBlY29mZl9zZXRfc3ltX2luZGV4KTogTGlrZXdpc2UuCi0JKiBzb20uYyAoY29tcGFyZV9zeW1zKTogTGlrZXdpc2UuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBMaWtld2lzZS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IExpa2V3aXNlLgotCi0JVXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IEVMRiBzeW1ib2wgbmFtZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9uZXdfc3RydGFiLCBiZmRfYWRkX3RvX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6IFJlbW92ZS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIGVsZl9zdHJpbmd0YWJfaW5pdCBvcgotCV9iZmRfc3RyaW5ndGFiX2FkZCwgYW5kIGdldCBzdHJpbmd0YWIgbGVuZ3RocyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX3NpemUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hhbmdlIGlnbm9yZWQgYXJndW1lbnQgdG8gcG9pbnRlciB0bwotCWJvb2xlYW4sIGFuZCBzZXQgdGhlIGJvb2xlYW4gdG8gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBJZiBhbgotCWVycm9yIGhhcyBhbHJlYWR5IG9jY3VycmVkLCBkb24ndCBkbyBhbnl0aGluZy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEp1c3Qgc2V0IHNoX3NpemUsIG5vdCBjb250ZW50cy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQotCWJvb2xlYW4gdG8gZWxmX2Zha2Vfc2VjdGlvbnMuICBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKLQliZmRfc3RydGFiX2hhc2ggdG8gc3dhcF9vdXRfc3ltcy4gIFdyaXRlIG91dCB0aGUgLnN0cnRhYiBzZWN0aW9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGFuZ2Ugc2hzdHJ0YWIgdG8gYmZkX3N0cnRhYl9oYXNoLgotCShzd2FwX291dF9zeW1zKTogVGFrZSBhIHBvaW50ZXIgdG8gYSBiZmRfc3RydGFiX2hhc2ggYXMgYW4KLQlhcmd1bWVudC4gIFNldCBpdCB0byB0aGUgc3ltYm9sIG5hbWVzLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc2VjdGlvbgotCWhlYWRlciBuYW1lcyB1c2luZyBfYmZkX3N0cmluZ3RhYl9lbWl0LgotCShlbGZfZGVidWdfc2VjdGlvbik6IFJlbW92ZSBmaXJzdCBhcmd1bWVudDsgZ2V0IHRoZSBzZWN0aW9uIG5hbWUKLQl2aWEgdGhlIGJmZF9zZWN0aW9uIHBvaW50ZXIuICBDaGFuZ2UgY2FsbGVyLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBuYW1lcyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX2VtaXQuICBMaWtld2lzZSBmb3IgdGhlIC5keW5zdHIgc2VjdGlvbiBjb250ZW50cy4KLQlGcmVlIHRoZSBzeW1ib2wgbmFtZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFJlbW92ZSB0aGUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAotCWZyb20gcmVsb2NhdGVfc2VjdGlvbi4gIFNhdmUgdGhlIG9sZCBzeW1ib2wgY29udGVudHMgYmVmb3JlCi0JY2FsbGluZyBlbGZfbGlua19vdXRwdXRfc3ltLCBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyd2FyZC4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSBkeW5zdHIgZmllbGQgdG8KLQlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCi0JZnJvbSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShzdHJ1Y3Qgc3RydGFiKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IENoYW5nZSBzdHJ0YWJfcHRyIGZpZWxkIHRvIHN0cnVjdAotCWJmZF9zdHJ0YWJfaGFzaC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGxhc3QKLQlhcmd1bWVudCwgb3V0cHV0X25hbWVzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogbGliYmZkLWluLmggKERFRkFVTFRfU1RSSU5HX1NQQUNFX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3NoZHJfaW4pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgotCUNsZWFyIGNvbnRlbnRzIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBTSFRfU1RSVEFCIGNhc2UsIGNoZWNrIGJmZF9zZWN0aW9uLAotCW5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0IHJhd2RhdGEgaWYgZV9zaHN0cm5keC4gIFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlciB0aGFuIHJhd2RhdGEgaW4gY29tbWVudGVkIG91dCBjb2RlLiAgSW4gU0hUX1JFTFtBXSBjYXNlLAotCWRvbid0IGJvdGhlciB0byBjaGVjayBlbGZfc2VjdGlvbl9kYXRhIG9mIHNlY3Rpb24gcmV0dXJuZWQgYnkKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuICBEb24ndCBzZXQKLQlzaXplLgotCShlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBzZXQgZWxmX251bV9zZWN0aW9uX3N5bXMuICBEb24ndCBjcmVhdGUKLQlzZWN0aW9uIHN5bWJvbHMgdGhhdCBhbHJlYWR5IGV4aXN0LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBKdXN0IGNoZWNrIGJmZF9zZWN0aW9uIGZpZWxkLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRG9uJ3QgcHJpbnQgcmF3ZGF0YSwgY29udGVudHMsIG9yIHNpemUuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGVjayByZXR1cm4gdmFsdWUgZnJvbQotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYWdhaW5zdCBOVUxMLCBub3QgYmZkX2lzX2Fic19zZWN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGVjayBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybgotCXZhbHVlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIG51bV9zZWN0aW9uX3N5bXMgZmllbGQuCi0JKGVsZl9udW1fc2VjdGlvbl9zeW1zKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmLmMgKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiBTdG9yZSBzZWN0aW9uIGNvbnRlbnRzIGluIGNvbnRlbnRzCi0JZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdG9yZSBCRkQgc2VjdGlvbiBwb2ludGVyIGluCi0JYmZkX3NlY3Rpb24gZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVyIHRoYW4gcmF3ZGF0YS4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0IHNldAotCXN5bWV4dG5faGRyLT5zaXplOyBqdXN0IHVzZSBzaF9zaXplLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVybiB0aGFuIHJhd2RhdGEuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW1vdmUgcmF3ZGF0YSBjaGVjay4KLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBTZXQgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIFM3LCBTOCBvciBTOS4KLQotRnJpIE9jdCAxNCAxOToxNTo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkIHRvIDIuNS4KLQotRnJpIE9jdCAxNCAxMTowNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBDYXN0IGVuZCB0byBiZSBub24gY29uc3QgYmVmb3JlIHBhc3NpbmcgaXQKLQl0byBzdHJ0b3VsLgotCi1UaHUgT2N0IDEzIDE0OjQwOjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IFBhc3MgZW5kIGFyZ3VtZW50IG9uIHRvIHN0cnRvdWwuCi0KLVdlZCBPY3QgMTIgMTY6NDY6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9yZWFsbG9jKTogRGVsZXRlZCwgc2luY2UgaXQncyBicm9rZW4gYW5kIGZpeGluZyBpdAotCXdvdWxkIG1ha2UgaXQgc2xvdy4gIEJlc2lkZXMsIGl0IGlzbid0IHVzZWQgbXVjaC4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQWx3YXlzIGFsbG9jYXRlIG5ldyBzdG9yYWdlIGZvciB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLVdlZCBPY3QgMTIgMTE6NTQ6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBNYXJrIGxvY2FsIHN0UHJvYywgc3RMYWJlbCBvcgotCXN0YWJzIHN5bWJvbHMgYXMgQlNGX0RFQlVHR0lORy4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNYWtlCi0Jc3RyMSBhbmQgc3RyMiBjb25zdCBwb2ludGVycy4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgotCSogY29uZmlnL1JFQURNRSAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2kzODZ2NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NS5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9uY3J0MzAwMC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQotVHVlIE9jdCAxMSAxMzo1Nzo1NiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYW5kYW50ZS5haWIuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE1ha2Ugc3VyZSB0aGF0IGEgc3ltYm9sCi0Jd2l0aCBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgb3IgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotCWVudHJ5IGlzIGFkZGVkIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMKLQlhbHJlYWR5IGdvdHRlbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LCBjaGFuZ2UgdGhlCi0JZGVmaW5pdGlvbiB0byB0aGUgUExUIGVudHJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTEgMTc6MTI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6IFNQQVJDIEx5bnggYXBwZWFycyB0byBzdGFydAotCWR1bXBpbmcgdGhlIC5kYXRhIHNlY3Rpb24gaW4gYSBjb3JlIGZpbGUgYXQgYSBwYWdlIGJvdW5kYXJ5LgotCi1Nb24gT2N0IDEwIDE2OjI0OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9wdXRfMzIKLQl0byBjb3JyZWN0IHR5cGUuCi0JKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX2dldF8zMiB0byBjb3JyZWN0Ci0JdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhc3QgYXJndW1lbnQgdG8KLQliZmRfZWxmX2hhc2ggdG8gY29ycmVjdCB0eXBlLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBUaGUgUEMxMCwgUEMyMiwgYW5kCi0JV1BMVDMwIHJlbG9jYXRpb25zIGFyZSBQQy1yZWxhdGl2ZS4KLQotVGh1IE9jdCAgNiAxMjo1NzoyNiAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IENvcnJlY3RseSBpbml0aWFsaXplIHZtYSBpZiB0aGUgdm1hIG9mCi0JdGhlIHRleHQgc2VjdGlvbiB3YXMgdXNlci1kZWZpbmVkLgotCi1XZWQgT2N0ICA1IDE0OjQyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBTVlI0IHVzZXMgc2xhc2gKLQluZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZSwgbm90IGp1c3QgbmV3bGluZS4KLQotVHVlIE9jdCAgNCAxMToyMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQKLQlwb3dlciB0byA0LCByYXRoZXIgdGhhbiB1c2luZyBhbGlnbl9wb3dlcl9taW4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHVzZSBhbGlnbl9wb3dlcl9taW47Ci0JdXNlIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiBpbnN0ZWFkLiAgRm9yY2UgdGhlIC5zdGFiCi0JYW5kIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQgdG8gbm8gbW9yZSB0aGFuIDIuICBSZW1vdmUKLQlDT0ZGX1NQQVJDIHNwZWNpYWwgY2FzZXMuCi0JKiBjb2ZmLWEyOWsuYzogRGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KLQkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtZ28zMi5jLCBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jOiBMaWtld2lzZS4KLQkqIGNvZmYtbTg4ay5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gY29udmVydCBhIGxvbmcKLQlmaWxlbmFtZSBpZiB0aGUgb2Zmc2V0IGZpZWxkIGlzIHplcm8uCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IElmIHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0Jd2FzIG5vdCBzZXQsIHVzZSBhIHNlbnNpYmxlIGRlZmF1bHQgcmF0aGVyIHRoYW4gemVyby4KLQotTW9uIE9jdCAgMyAxNjowNDoyOSAxOTk0ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiBIb25vciB1bWFzayB3aGVuIHNldHRpbmcgZXhlY3V0aW9uIGJpdHMuCi0JKGJmZF9jbG9zZV9hbGxfZG9uZSk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICAzIDA0OjQxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZwotCWZvciAuc3RhY2sgYW5kIC5sZGluZm8gc2VjdGlvbnMuIENhc3QgY29yZWRhdGEuY190YWIgdG8gYQotCWZpbGVfcHRyIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gZ2NjLgotCi1GcmkgU2VwIDMwIDEzOjExOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgYXNzZXJ0aW9uIHdoZW4gYSBub24KLSAgICAgICAgU0VDX0lOX01FTU9SWSBzZWN0aW9uIGlzIGZvdW5kIGluIGR5bm9iai4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuCi0JbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4KLQotVGh1IFNlcCAyOSAxNToyMTo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2hhbmdlIHR5cGUgb2YgImRhdGEiIHRvCi0JYmZkX2J5dGUgKiwgdG8gZ28gYWxvbmcgd2l0aCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IE1vdmVkIGhlcmUgZnJvbSBlbGZfcHJpbnRfc3ltYm9sCi0JaW4gZWxmY29kZS5oLiAgKGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGwpOiBQcmludCBzeW1ib2wncyBzaXplCi0JZmllbGQsIGV4Y2VwdCBmb3IgY29tbW9uIHN5bWJvbHM7IHByaW50IHRoZWlyIGFsaWdubWVudC4KLQkqIGVsZmNvZGUuaCAoZWxmX3ByaW50X3N5bWJvbCk6IERlbGV0ZWQuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfZWxmezMyLDY0fV9wcmludF9zeW1ib2wpOiBSZXBsYWNlIGRlY2xhcmF0aW9ucyB3aXRoIG1hY3Jvcy4KLQotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyBCU0ZfTE9DQUwgYW5kIEJTRl9HTE9CQUwKLQlpbiBvbmUgY29sdW1uLiAgVXNlIHRoZSBjb2x1bW4gZnJlZWQgdXAgdG8gc2hvdyBCU0ZfRlVOQ1RJT04gYW5kCi0JQlNGX0ZJTEUuCi0KLVRodSBTZXAgMjkgMTI6Mjk6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCAucmRhdGEgYW5kIC5yb2RhdGEuCi0KLVdlZCBTZXAgMjggMTM6MzU6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2FzdCBkYXRhX3N0YXJ0IHRvIGJmZF9ieXRlICoKLQliZWZvcmUgdHJ5aW5nIHRvIGFkZCB2YWx1ZXMgdG8gaXQuCi0KLVR1ZSBTZXAgMjcgMTY6NDc6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENhc3QKLQlyZXR1cm4gdmFsdWUgZnJvbSBlbGZfc3ltX2V4dHJhLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIG1hbGxvYy4KLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgImFyY2giLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBvZgotCWJmZF9oYXNoX2FsbG9jYXRlLgotCi0JKiByaXNjaXguYyAocmlzY2l4X2NhbGxiYWNrKTogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGUuCi0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBjb3BpZWQKLQlmcm9tIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFkanVzdGVkIGZvciB0aGUgYXNzZW1ibGVyJ3MgbmVlZHMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gU2VwIDI2IDExOjAwOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHRoZQotCXNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBwb3NpdGlvbiBldmVuIGlmIERfUEFHRUQgaXMgbm90IHNldC4KLQotCSogYmZkLWluLmggKGJmZF9zZWVrKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIG5vdCBtYXJrIGZwIGNvbnN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRG9uJ3QgbWFyayBwYXJhbWV0ZXJzIGNvbnN0LCB0byBhdm9pZAotCWNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uLgotCi1GcmkgU2VwIDIzIDE1OjE1OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGFib3J0IGlmIHdlIGFsbG9jYXRlZAotCXRvbyBtdWNoIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXIsIG9ubHkgaWYgd2UgYWxsb2NhdGVkIHRvbwotCWxpdHRsZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTaW1pbGFyIGNoYW5nZS4KLQotVHVlIFNlcCAyMCAxMzoxNzowNyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaDogRml4IGNvbW1lbnQuCi0JKiBuczMya25ic2QuaDogQ2hhbmdlZCBNX05TMzJLX05FVEJTRCB0byBNXzUzMl9ORVRCU0QgdG8gbWF0Y2gKLQkgIGxpYmFvdXQuaC4KLQotVHVlIFNlcCAyMCAxNToyMzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNuZXRic2Quby4KLQkoQ0ZJTEVTKTogQWRkIG5zMzJrbmV0YnNkLmMgYW5kIHNwYXJjbmV0YnNkLmMuCi0JKiB0YXJnZXRzLmM6IG5zMzJrbmV0YnNkX3ZlYyB3YXMgcmVuYW1lZCB0byBwYzUzMm5ldGJzZF92ZWMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBSZW1vdmU7IHVudXNlZC4KLQkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSByc3RhdC4KLQkocmVsb2NfcHJvY2Vzc2luZyk6IENvbW1lbnQgb3V0OyB1bnVzZWQuCi0KLUZyaSBTZXAgMTYgMTI6MTI6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogSWYgaC0+aW5keCBpcyAtMiwgdGhlbgotCWFsd2F5cyB3cml0ZSBpdCBvdXQgZXZlbiBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSBzdHJpcHBlZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogSWYgd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYQotCXN0cmlwcGVkIGdsb2JhbCBzeW1ib2wsIGZvcmNlIGl0IHRvIGJlIHdyaXR0ZW4gb3V0IHJhdGhlciB0aGFuCi0JbWVyZWx5IGNhbGxpbmcgdW5hdHRhY2hlZF9yZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTU6Mzc6MTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCBzb3J0ZWRfc3ltcy4KLQkob2JqX3NvbV9zb3J0ZWRfc3ltcyk6IEFjY2Vzc29yIG1hY3JvLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBJbml0aWFsaXplIHNvcnRlZF9zeW1zIHRvIE5VTEwuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBTb3J0IGEgY29weSBvZiB0aGUgQkZEJ3Mgc3ltYm9sIHRhYmxlOwotCXN0b3JlIHRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlIGluIHNvcnRlZF9zeW1zLgotCShzb21fd3JpdGVfZml4dXBzKTogSW5pdGFsaXplIHRtcF9yZWxvYyB0byBOVUxMIHRvIG1ha2UgR0NDIGhhcHB5LgotCShzb21fYmVnaW5fd3JpdGluZyk6IFNpbWlsYXJseSBmb3IgZXhlY19oZWFkZXIuICBQYXNzIHRoZSBzb3J0ZWQKLQlzeW1ib2wgdGFibGUgdG8gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSB0aGUgc29ydGVkIHN5bWJvbHMgcmF0aGVyCi0JdGhhbiB0aGUgY2Fub25pY2FsIHN5bWJvbCB0YWJsZS4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IEFkZCAic3RyaW5ndGFiX29mZnNldCIgZmllbGQuCi0JKiBzb20uYyAoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogVXNlICJzdHJpbmd0YWJfb2Zmc2V0IgotCXJhdGhlciB0aGFuIGRlc3Ryb3lpbmcgdGhlICJuYW1lIiBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxNTowNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVuYW1lIHNraXBfaW5kaXJlY3QgdG8KLQlza2lwX25leHQuICBJZiB3ZSBmaW5kIGFuIE5fV0FSTklORyBzeW1ib2wgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgotCXdyaXR0ZW4gb3V0LCBzZXQgc2tpcF9uZXh0LgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgZmllbGQgZmluZF9idWZmZXIuCi0JKiBlY29mZi5jOiBJbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBLZWVwIGEgc3ltYm9sIG1hcmtlZCBhcyB3ZWFrCi0JZXZlbiBpZiBpdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb2JqZWN0LgotCi1UdWUgU2VwIDEzIDE3OjU3OjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2ZpeHVwX2Zvcm1hdHMpOiBDYXNlIFJfRU5UUlkgKDB4YjMpLCBzZXQgYm90aAotCSdUJyBhbmQgJ1UnIHRvIGdyYWIgYWxsIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IE1ha2UgJ1UnIHVud2luZCBiaXRzIHBlcnNpc3QgYWNyb3NzCi0JbXVsdGlwbGUgU09NIHJlbG9jYXRpb25zLiAgU2V0IHRoZSBhZGRlbmQgZmllbGQgb2YgYW4gUl9FTlRSWQotCXJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdUJzsgc2V0IHRoZSBhZGRlbmQgZmllbGQgb24gYW4KLQlSX0VYSVQgcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1UnLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVud2luZCBmaWVsZC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGb3IgUl9FTlRSWSBmaXh1cHMsIGdldCAzMmJpdHMgb2YKLQl1bndpbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VOVFJZLCBnZXQgdGhlCi0Jb3RoZXIgMzJiaXRzIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FWElULgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IERlbGV0ZSBmdW5jdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW51c2VkIGEub3V0LXJlbGF0ZWQgZmllbGRzLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVXNlIGJmZF9hYnNfc2VjdGlvbl9wdHIKLQlpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSGFuZGxlIGV4ZWNfZW50cnkgYW5kIGV4ZWNfZmxhZ3MgYmVpbmcKLQlzd2l0Y2hlZCBpbiBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IHRoZSBPU0YxIGxpbmtlci4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0VYSVQganVzdCBsaWtlIHRoZSBSX3tGLEwsUn1TRUwKLQlmaXh1cHMuICBTdXBwb3J0IFJfQUxUX0VOVFJZIChoYW5kbGUganVzdCBsaWtlIFJfRVhJVCkuCi0KLVR1ZSBTZXAgMTMgMTY6MDQ6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IHN5bWVudF9iYXNlIGlzIHVuc2lnbmVkCi0Jc28gY2FuJ3QgY29tcGFyZSAtdmUgbnVtYmVycyB3aXRoIGl0LgotCi1Nb24gU2VwIDEyIDIwOjMxOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc2hjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vIG5vdy4KLQkqIGNvZmYtc2guYzogUmV3cml0dGVuIHRvIHVzZSBuZXcgZmFzdCBjb2ZmIGJhY2tlbmQuCi0KLVR1ZSBTZXAgMTMgMTY6MjM6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhc3N1bWUgdGhhdCBhbGwgdGhlIGlucHV0Ci0gICAgICAgIGZpbGVzIGFyZSBhLm91dC4KLQotVHVlIFNlcCAxMyAxMTowOTozOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLW5ldGJzZCk6IHVzZSBzcGFyY25ic2QuCi0JICAobnMzMmstKi1uZXRic2QpOiB1c2UgbnMzMmtuYnNkLgotCi0JKiBob3N0cy97bmJzZCxpMzg2bmJzZCxuczMya25ic2Qsc3BhcmNuYnNkfS5oOiBOZXcgZmlsZXMsIE5ldEJTRAotCSAgaG9zdCBzdXBwb3J0LgotCi0JKiBzcGFyY25ldGJzZC5jOiBOZXcgZmlsZSwgYWRkcyBzdXBwb3J0IGZvciBOZXRCU0Qvc3BhcmMuCi0JKiBjb25maWcvc3BhcmMtbmJzZC5tdDogTGlrZXdpc2UuCi0KLQkqIG5ldGJzZC5oOiBOZXcgZmlsZSwgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBuZXRic2QgcG9ydHMuCi0JKiBpMzg2bmV0YnNkLmM6IFVzZSBpdC4KLSAgICAgICAgKiBuczMya25ldGJzZC5jOiBVc2UgaXQuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgY29uZmlnL2kzODYtbmJzZC5tdCwKLQkgIGNvbmZpZy9uczMyay1uYnNkLm10OiBjYW5vbmljYWxpemUgbmV0YnNkIHRhcmdldHMgdG8gY29uZm9ybSB0bwotCSAgZmlsZS92YXJpYWJsZSBuYW1pbmcgY29udmVudGlvbnMuCi0JKiBpMzg2bmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkMzg2LmMuCi0JKiBuczMya25ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDUzMi5jLgotCQotTW9uIFNlcCAxMiAyMTo1NjoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9yZWxvY19za2lwKTogQ29ycmVjdCBvZmYtYnktb25lIGVycm9yIGZvciA0LWJ5dGUKLQlSX05PX1JFTE9DQVRJT04gZml4dXBzLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZXR1cm4gdGhlIGFic29sdXRlIHNlY3Rpb24gaWYgdGhlCi0Jc3ltYm9sIGlzbid0IGNvbnRhaW5lZCBpbiBhbnkgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTVF9QUklfUFJPRyBhbmQgU1RfU0VDX1BST0cgc3ltYm9scyBhcmUKLQlub3QgZnVuY3Rpb24gc3ltYm9scyAodGhleSBhcmUgbWFnaWMgY29kZSBsYWJlbHMgd2hpY2ggKmNhbiogYmUgdGhlCi0JdGFyZ2V0cyBvZiBjcm9zcyBzcGFjZSBicmFuY2hlcykuICAkU1RBUlQkIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sLgotCi1Nb24gU2VwIDEyIDExOjQzOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBCi0JdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFNldCB0aGUgdHlwZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gU1RUX0ZVTkMgaWYgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGlzIHNldC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHJfc3ltbmR4IGlzIC0xLCBkb24ndAotCWNoYW5nZSBpdC4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIHJfc3ltbmR4IGlzIC0xLCBpdCBpcyBhbgotCWFic29sdXRlIHJlbG9jLiAgRG9uJ3QgZHVtcCBjb3JlIHVzaW5nIHJfc3ltbmR4IGFzIGFuIGFycmF5IGluZGV4LgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiAoY29weSBvZiBmdW5jdGlvbiBpbgotCWNvZmYtaTM4Ni5jKS4KLQkoY29mZl9tNjhrX2x5bnhydHlwZV90b19ob3d0byk6IHN5bSBhcmd1bWVudCBtYXkgYmUgTlVMTC4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhbiByX3N5bW5keAotCXZhbHVlIG9mIC0xLCBtZWFuaW5nIGFuIGFic29sdXRlIHJlbG9jLgotCi0JKiBjdG9yLmM6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogUmVtb3ZlIGN0b3Iuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGN0b3IuYy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDEyIDAxOjU4OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZXJlIHdhcyBhIGxpbmsKLQllcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scyksIHRoZW4gZG8gbm90Ci0JYXBwbHkgYW55IHJlbG9jcywganVzdCBub3RpZnkgdGhlIHVzZXIgb2YgdGhlIGVycm9ycy4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEbyBub3QgYnVpbGQgYSBzeW1ib2wKLQlleHRlbnNpb24gc2VjdGlvbiBmb3IgYW4gZXhlY3V0YWJsZSAoaXQncyB1c2VsZXNzKS4KLQkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERvIG5vdGhpbmcgaWYgdGhlcmUgd2FzIGEKLQlsaW5rIGVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKS4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogS2x1ZGdlLiAgVHVybiBvZmYgU0VDX0hBU19DT05URU5UUwotCWZvciBhbGwgdGhlIGlucHV0IHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgdG8ga2VlcCB0aGUgZ2VuZXJpYwotCUJGRCBjb2RlIGhhcHB5LiAgVGVtcG9yYXJpbHkgdHVybiBpdCBvbiB0byByZWFkIHRoZSBjb250ZW50cyBvZgotCXRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCi0KLVN1biBTZXAgMTEgMjE6NTg6NTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChSQU5MSUIpOiBEbyBub3Qgc2V0LgotCSogY29uZmlnL2hwcGFic2QubWggKFJBTkxJQik6IExpa2V3aXNlLgotCi1TdW4gU2VwIDExIDIyOjUwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtaTM4Nmx5bnguYzogUmVtb3ZlICNpZiAwIGNvZGUuCi0JKGkzODZfbHlueG9zX2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmCi0JY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIG9ubHkgZGVmaW5lIHRoaXMgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzLCBjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEhhbmRsZQotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIHZpYQotCV9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogU3ltYm9sIHNldHRpbmcgY29kZSBtb3ZlZAotCXRvIHNldF9zeW1ib2xfZnJvbV9oYXNoOyBjYWxsIGl0LgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGQgZ2VuZXJpY19saW5rZXIgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgZmFsc2UsIHNldCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGJhc2VkIG9uCi0JdGhlIGhhc2ggdGFibGUgZW50cmllcy4KLQotRnJpIFNlcCAgOSAxMTo1MTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiKTogUmVpbmRlbnRlZC4gIFJlbW92ZWQgY29tbWVudGVkIG91dAotCWNhbGwgdG8gYmZkX2NvbnN0cnVjdG9yX2VudHJ5LgotCi0JQ29udmVydCBtNjhrIENPRkYgdG8gdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1tNjhrLmMgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCi0JKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a2NvZmZfdmVjKTogQnVpbGQgY29mZmxpbmsuby4KLQkobTY4a2NvZmZ1bl92ZWMsIG02OGtseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDggMTY6MjA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJFTEJZVEUpOiBGbGFnCi0Jb3ZlcmZsb3dzIGNvcnJlY3RseS4KLQotV2VkIFNlcCAgNyAxOTowMTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgb2YKLQllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgdG8gYm9vbGVhbi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgdmFsdWUgb2YKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgcmF0aGVyIHRoYW4gTlVMTC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2FsbCBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suICBTZXQKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENoYW5nZSB0eXBlIG9mCi0Jc2Vjb25kIGFyZ3VtZW50IHRvIGJvb2xlYW4uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlMaWtld2lzZS4KLQotCSogY29mZi1nbzMyLmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KLQkqIGNvZmYtaTk2MC5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCSogY29mZi1tODhrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0KLQlNYWtlIGkzODYgQ09GRiB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLWkzODYuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4NmNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8uCi0JKGkzODZseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8uCi0JKGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgotCShjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIHRvIHVzZSBSVFlQRTJIT1dUTywgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBzZWN0aW9uX2NvdW50ICsgMQotCXNlY3Rpb25faW5mbyBzdHJ1Y3R1cmVzLCBzaW5jZSB0aGUgdGFyZ2V0X2luZGV4IGlzIDEgYmFzZWQuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgKnNlY3BwIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIgZm9yIGEKLQljb21tb24gc3ltYm9sLiAgQWRqdXN0IHJlbF9oYXNoIGJ5IHRoZSBvdXRwdXQgcmVsb2MgY291bnQuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDIzOjI4OjUyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFRyZWF0IHVuZGVmaW5lZCBjb2RlCi0Jc3ltYm9scyBhbmQgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggbm8gdHlwZSBpbiB0aGUgc2FtZSBtYW5uZXIKLQlpZiB0aGUgYXNzb2NpYXRlZCBCRkQgc3ltYm9sIGhhcyBCU0ZfRlVOQ1RJT04gc2V0LiAgRm9yIGEgZGVmaW5lZAotCXN5bWJvbCB3aGljaCBubyB0eXBlLCBzZWxlY3QgYSBTT00gdHlwZSBiYXNlZCBvbiB0aGUgZmxhZ3Mgb2YgdGhlCi0Jc2VjdGlvbiBjb250YWluaW5nIHRoZSBzeW1ib2wuCi0JKHNvbV9zbHVycF9zeW1ib2xfdHlwZSk6IFNldCBCU0ZfRlVOQ1RJT04gZm9yIHVuZGVmaW5lZCBTVF9TVFVCCi0Jb3IgU1RfQ09ERSBzeW1ib2xzIChpbXBvcnRpbmcgYSBub24tZnVuY3Rpb24gY29kZSBzeW1ib2wgaXMKLQltZWFuaW5nbGVzcyBpbiBTT00pLgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBEb24ndCBzZXQgIm9mZnNldCIgdG8gdGhlIHNlY3Rpb24ncyB2bWE7IGl0Ci0Jc2hvdWxkIGFsd2F5cyBzdGFydCBhdCB6ZXJvLgotCi1UdWUgU2VwICA2IDE0OjUxOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUFkZCBuZXcgc3R5bGUgbGlua2VyIHN1cHBvcnQgdG8gQ09GRiBiYWNrZW5kLiAgYTI5ayBvbmx5IGZvciBub3cuCi0JKiBjb2ZmbGluay5jOiBOZXcgZmlsZS4KLQkqIGxpYmNvZmYtaW4uaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMsIG9ial9jb2ZmX3N0cmluZ3MpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKG9ial9jb2ZmX3N5bV9oYXNoZXMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKHN0cnVjdCBjb2ZmX3RkYXRhKTogQWRkIGZpZWxkcyBleHRlcm5hbF9zeW1zLCBzdHJpbmdzLCBhbmQKLQlzeW1faGFzaGVzLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoY29mZl9saW5rX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoY29mZl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzLCBfYmZkX2NvZmZfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIF9iZmRfcmVsc3osCi0JX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4sIF9iZmRfY29mZl9zeW1faXNfZ2xvYmFsLAotCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24uCi0JKGJmZF9jb2ZmX3JlbHN6LCBiZmRfY29mZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lLgotCShiZmRfY29mZl9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgotCShiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgb2JqX3Jhd19zeW1lbnRfY291bnQgYW5kCi0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgdGFyZ2V0X2luZGV4IG9mIGFsbAotCXNlY3Rpb25zLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmllbGQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleDsgbm93IGRvbmUgYnkKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIFJlbW92ZSBvYnNvbGV0ZSBoYW5kbGluZyBvZgotCXNjbl9iYXNlIGFuZCBkYXRhX2Jhc2UuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdCB0YXJnZXRfaW5kZXgKLQlpcyBwb3NpdGl2ZSwgc2luY2UgaXQgYWx3YXlzIGlzLiAgUmVtb3ZlIHVzZSBvZiBwYWQsIHdoaWNoIGlzCi0JYWx3YXlzIHplcm8uICBDaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90IGJmZF9nZXRfc3ltY291bnQsCi0JZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scywgYnV0IG9ubHkgd3JpdGUgdGhlbSBvdXQgaWYKLQliZmRfZ2V0X3N5bWNvdW50IGlzIG5vbi16ZXJvLiAgRG9uJ3QgY2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQKLQl1bnRpbCBhZnRlciBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudCBmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgRG9uJ3Qgc2V0Ci0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9zeW1faXNfZ2xvYmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBvciBtYWNyby4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IENhbGwgY29mZl9zd2FwX3JlbG9jX2luLCBub3QKLQliZmRfc3dhcF9yZWxvY19pbi4KLQkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcwotCWRlZmluZWQsIGRlZmluZSBhcyBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IFNpbWlsYXIgY2hhbmdlLgotCShjb2ZmX2JmZF9maW5hbF9saW5rKTogU2ltaWxhciBjaGFuZ2UuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogRG9uJ3Qgc2V0IG9ial9yYXdfc3ltZW50X2NvdW50Ci0JYW5kIG9ial9jb252X3RhYmxlX3NpemUgaGVyZS4KLQkoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IFJlaW5kZW50LiAgSWYgYmZkX2dldF9zeW1jb3VudCBpcyB6ZXJvLAotCWFkZCB1cCB0aGUgbGluZSBudW1iZXJzIGZyb20gdGhlIHNlY3Rpb25zLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBEb24ndCBwb2ludGVyaXplIGEgbm9ucG9zaXRpdmUgeF9lbmRuZHgKLQlmaWVsZC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYXV4cC0+Zml4X2VuZCwgcHJpbnQgeF9lbmRuZHggdmFsdWUuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBSZW5hbWUgZnJvbSBiZmRfc3dhcF9yZWxvY19pbi4KLQlSZWluZGVudC4gIENoYW5nZSBhcmd1bWVudCB0eXBlIHRvICBQVFIuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW4gKGEyOWtjb2ZmX2JpZ192ZWMpOiBDb21waWxlIGNvZmZsaW5rLm8uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgY29mZmxpbmsuYy4KLQotVHVlIFNlcCAgNiAxNDowMDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sLCBjYXNlIGJmZF9zeW1ib2xfcHJpbnRfYWxsKTogQ2hlY2sKLQlmb3Igc2VjdGlvbiBzeW1ib2wsIGFuZCBwcmludCBpdHMgYXV4IGZpZWxkcyB3aXRoIGFwcHJvcHJpYXRlCi0JbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkZWQgY3B1LWFybS5vLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogUmVjb2duaXplIHRoZSBBUk0gcHJvY2Vzc29yLgotCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGxpYmFvdXQuaCwgcmVsb2MuYywKLQl0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCSogY3B1LWFybS5jLCByaXNjaXguYywgY29uZmlnL3Jpc2NpeC5taCwgY29uZmlnL3Jpc2NpeC5tdDogTmV3IGZpbGVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFibGUpOiBDaGVjayB0aGF0IHN0ciBpc24ndCBhIE5VTEwgcG9pbnRlci4KLQotRnJpIFNlcCAgMiAxNDoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBSZXdyb3RlIGRlZmluaXRpb24gdG8gdXNlCi0JbmV3ICJjaGV3IiBjb21tYW5kcyBmb3Igc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgZW51bWVyYXRvciBhbmQKLQllbnVtZXJhdG9yIG5hbWUgdGFibGUuCi0JKGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBmb3IgcmV0cmlldmluZyBhIHN5bWJvbGljCi0JbmFtZSBhc3NvY2lhdGVkIHdpdGggYW4gZW51bWVyYXRvci4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgQXVnIDMwIDIxOjI0OjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcywgY2FzZSBSX0VOVFJZKTogSGFuZGxlIGNhc2Ugd2hlcmUgbm8KLQl1bndpbmQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0KLVR1ZSBBdWcgMzAgMTE6NDM6MzAgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNvbmFtZQotCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIHNldCBEVF9TT05BTUUgZHluYW1pYyBlbnRyeS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBBdWcgMjYgMTU6NDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBWZXJpZnkgb2JqX3Jhd19zeW1lbnRfY291bnQsIHJhdGhlcgotCXRoYW4gc2V0dGluZyBpdC4KLQotVGh1IEF1ZyAyNSAxMDo0NDo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogUmVtb3ZlIGhvc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogQ2hlY2sgZm9yIF9iZmRfc3RyaW5ndGFiX2FkZCBlcnJvcgotCWJlZm9yZSBhZGRpbmcgQllURVNfSU5fV09SRC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIGJlc3QgQ19GSUxFLAotCW5vdCBtZXJlbHkgdGhlIGZpcnN0LgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgd2UgYXJlIG5vdCB1c2luZyB0aGUKLQlzeW1ib2wsIGNsZWFyIHRoZSBuYW1lIHNvIHRoYXQgaXQgaXMgbm90IHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLVdlZCBBdWcgMjQgMTE6NDk6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBwb2ludGVyIGRpZmZlcmVudCB0byBsb25nCi0JYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQlkc2VjY250LgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZXh0X291dCk6IElmIEVDT0ZGXzY0LCBjbGVhciByZW1haW5pbmcKLQlieXRlcyBpbiBiaXRzMi4KLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLAotCXJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSnVzdCBpZ25vcmUgQlNGX0RFQlVHR0lORyBzeW1ib2xzLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBGaXggZmFpbHVyZSBjaGVjayBvZgotCWJmZF9tYWtlX2VtcHR5X3N5bWJvbC4gIEZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogVXNlIHRoZSBvdXRwdXRfc2VjdGlvbgotCShhbmQgb3V0cHV0X29mZnNldCkgaWYgdGhlcmUgaXMgb25lLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogRGlzY2FyZCB0aGUgc3ltYm9scwotCWlmIHRoZSBhcmNoaXZlIGVsZW1lbnQgd2FzIG5vdCBuZWVkZWQuCi0KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBFbnN1cmUgdGhhdCBhIHplcm8gc3RyaW5nCi0JaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgdXNlIG5hbWUKLQlmcm9tIG9yaWdpbmFsIGhhc2ggdGFibGUgZW50cnksIG5vdCBmcm9tIGVudHJ5IGluICpzeW1faGFzaC4KLQotCSogYW91dHguaCAoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGZpZWxkcyBjb250ZW50cywKLQlyZWxvY3MsIHN5bWJvbF9tYXAgYW5kIG91dHB1dF9zeW1zLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBXb3JrIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUsIHJlbG9jCi0Jc2l6ZSwgYW5kIG51bWJlciBvZiBzeW1ib2xzLiAgVXNlIHRoZW0gdG8gcHJlYWxsb2NhdGUgYnVmZmVycyB0aGF0Ci0JYXJlIGxhcmdlIGVub3VnaCBmb3IgYWxsIGNhc2VzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogVXNlIHByZWFsbG9jYXRlZCBzeW1ib2xfbWFwLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgVXNlCi0JcHJlYWxsb2NhdGVkIG91dHB1dF9zeW1zLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBVc2UgcHJlYWxsb2NhdGVkIGNvbnRlbnRzIGFuZCByZWxvY3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAyMyAxMDo1MTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRG9uJ3QgdXBkYXRlIHRoZQotCXN5bWJvbCBtYXAgdGltZXN0YW1wIGlmIHRoZXJlIGlzIG5vIHN5bWJvbCBtYXAuICBGcm9tCi0Jc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCi0KLU1vbiBBdWcgMjIgMTI6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKGJmZF90YXJnZXQpOiBBZGQgZmllbGQgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCSogYmZkLmMgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLWluLmggKF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlY2xhcmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQ2FsbAotCWJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGluc3RlYWQgb2YgY2hlY2tpbmcgZm9yIGEgQlNEIGFyY2hpdmUKLQlhbmQgY2FsbGluZyBic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogUmVuYW1lIGZyb20KLQlfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuICBEb24ndCBhc3N1bWUgdGhhdCBhcm1hcF9kYXRlcG9zIGlzCi0JYWxyZWFkeSBzZXQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQotCSogaGFzaC5jOiBDb3B5IHN0cmluZyBoYXNoIGZ1bmN0aW9ucyBmcm9tIGFvdXR4LmguCi0JKiBhb3V0eC5oOiBTdHJpbmcgaGFzaCBmdW5jdGlvbnMgbW92ZWQgdG8gaGFzaC5jLiAgUmV0YWluCi0Jc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiBhZGRfdG9fc3RyaW5ndGFiIGFuZCBlbWl0X3N0cmluZ3RhYi4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgc3RydWN0dXJlIG5hbWVzLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RyaW5ndGFiX2luaXQsIF9iZmRfc3RyaW5ndGFiX2ZyZWUpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9zaXplLCBfYmZkX3N0cmluZ3RhYl9hZGQpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnIDIyIDEwOjQ5OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogQ3JlYXRlIGEgZml4dXAgZm9yIGFueQotCWRlZmluZWQgYWJzb2x1dGUgc3ltYm9sLCBub3QganVzdCBHT1Qgb3IgUExUIHN5bWJvbHMuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIHJlZmVyZW5jZXMgdG8gZGVmaW5lZAotCXN5bWJvbHMuCi0KLVRodSBBdWcgMTggMTY6Mjk6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JR2V0IGxkIC14IC1yIHRvIGhhbmRsZSBhLm91dCBzZXQgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHRoZSAuYnNzIFZNQSB3YXMgc2V0IG91dHNpZGUgb2YKLQlCRkQsIHBhZCB0aGUgLmRhdGEgc2VjdGlvbiB1cCB0byB0aGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24uCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IElmIGEgc2V0IHN5bWJvbCBkb2VzIG5vdCBnZXQgbW9kaWZpZWQsCi0JdHJlYXQgaXQgYXMgYSBsb2NhbCBzeW1ib2wuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogU2V0IHRoZSB2YWx1ZSBvZiBzZXQgc3ltYm9scwotCWNvcnJlY3RseS4gIERvbid0IGRpc2NhcmQgc2V0IHN5bWJvbHMgZXZlbiBpZiBkaXNjYXJkaW5nIGxvY2FsCi0Jc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IERvbid0IGFib3J0IG9uIGJmZF9saW5rX2hhc2hfbmV3LAotCXNpbmNlIGl0IGNhbiBub3cgaGFwcGVuIGZvciBzZXQgc3ltYm9scy4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEp1c3QgY2hlY2sgZm9yICIucmVsYSIgYW5kCi0JIi5yZWwiLCBub3QgIi5yZWxhLiIgYW5kICIucmVsLiI7IG1ha2UgdGhpcyB3b3JrIGJ5IGNoZWNraW5nCi0JdXNlX3JlbGFfcC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IgIi5yZWwiLCBub3QKLQkiLnJlbC4iCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvcgotCSIucmVsYSIsIG5vdCAiLnJlbGEuIgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE3IDE2OjU0OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCi0JUEFTUyB0byB0aGUgb2xkIHZhbHVlICsgMS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IElmIGEgQ19GSUxFIHN5bWJvbCBoYXMKLQlubyBhdXggZW50cmllcywgdXNlIHRoZSBzeW1ib2wgbmFtZSBhcyB0aGUgZmlsZSBuYW1lLgotCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIHJpZ2h0IENfRklMRSBzeW1ib2wsIHJhdGhlcgotCXRoYW4gYWx3YXlzIHVzaW5nIHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBhIGRlYnVnZ2luZyBzeW1ib2wKLQlhZnRlciBhIGZ1bmN0aW9uIHN5bWJvbCwgc2tpcCBpdC4gIEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIGxpbmUKLQlvZmZzZXQsIHNpbmNlIGl0IHdhcyBzdWJ0cmFjdGVkIG91dCBpbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUuCi0KLVR1ZSBBdWcgMTYgMTY6NTM6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogSWYgd3JpdGluZyBzb21lIGZvcm0gb2YgYW4gZXhlY3V0YWJsZSwKLQlhbGxvY2F0ZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQgcHJpdmF0ZSBkYXRhLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZpbGwgZmllbGRzIG9mIHRoZSBleGVjIGhlYWRlciBiYXNlZAotCW9uIEJGRCBwcml2YXRlIGRhdGEgaGVyZSAobGlrZSB0aGUgZXhlYyBmbGFncykuICBEbyBub3Qgd3JpdGUKLQl0aGUgZXhlYyBoZWFkZXIgaGVyZS4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgImV4ZWNfaGRyIiBmb3IgdGhlIGV4ZWN1dGFibGUKLQlmaWxlIGhlYWRlci4KLQkob2JqX3NvbV9leGVjX2hkcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQotVHVlIEF1ZyAxNiAwMDoxMjozMSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHNlY3Rpb24KLQluYW1lZCAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShsaW51eF9hZGRfb25lX3N5bWJvbCk6IFVzZSAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxNSAxMjoxNjo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBVc2UgU1RSSU5HX1NJWkVfU0laRSwgbm90IDQuCi0JKGNvZmZfd3JpdGVfc3ltYm9scywgYnVpbGRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCi0KLQkqIGxpYmNvZmYtaW4uaCAob2JqX3N5bWJvbF9zbGV3KTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgY29mZl90ZGF0YSk6IFJlbW92ZSB1bnVzZWQgZmllbGRzIGluZGV4X3NsZXcsIHJhd19saW5lbm9zLAotCWFuZCBmbGFncy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBEb24ndCBpbml0aWFsaXplIHJhd19saW5lbm9zLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBpbml0aWFsaXplIGZsYWdzLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV96bWFnaWNfY29udGlndW91cywgbm90IGhhcmRjb2RlZCAwLgotCSogaTM4NmxpbnV4LmMgKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIGEgU0hUX1NZTVRBQiBzZWN0aW9uIGluIGEKLQlzaGFyZWQgb2JqZWN0IGhhcyBTSEZfQUxMT0Mgc2V0LCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgaXQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUaGVyZSBtYXkgYmUgYSBCRkQgc2VjdGlvbiBmb3IgYQotCVNIVF9TWU1UQUIgc2VjdGlvbi4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudC4gIElmIG5vIGZsYWdzCi0JYXJlIHJlY29nbml6ZWQsIGNob3NlIHNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIG5hbWUuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IF9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vayBmaWVsZDogQWRkCi0JbmFtZSBhcmd1bWVudC4KLQkoYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayk6IEFkZCBuYW1lIGFyZ3VtZW50LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IGFkanVzdCB0aGUgc2VjdGlvbgotCXBvc2l0aW9uIGJ5IENPRkZfUEFHRV9TSVpFIHVubGVzcyBTRUNfQUxMT0MgaXMgc2V0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBQYXNzIHNlY3Rpb24gbmFtZSB0bwotCWJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2suCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHVudXNlZCBuYW1lCi0JYXJndW1lbnQuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQgdG8KLQlwcm90b3R5cGUuCi0KLUZyaSBBdWcgMTIgMTE6MjI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDb3JyZWN0IGNoZWNrIGZvciBpbnZhbGlkCi0Jc2VjdGlvbiBpbmRleC4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLQl0YWJsZSwgdHJ5IHVzaW5nIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzb2xhcmlzMiwgbm90IHN5c3Y0LgotCVRoZSBsaW5rZXIgZGVwZW5kcyB1cG9uIGNvbmZpZ3VyaW5nIGZvciBzb2xhcmlzMi4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IE5ldyBmaWxlOyBpbmNsdWRlIGhvc3RzL3N5c3Y0LmguCi0JKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGNvbmZpZy9zeXN2NC5taC4KLQotV2VkIEF1ZyAxMCAxMzowOTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogTWFrZSBzdXJlIGRhdGEgc2VjdGlvbiBpcyBwYWRkZWQgdG8KLQlwYWdlIGJvdW5kYXJ5IHdoZW4gdGhlIFZNQSBpcyBzZXQgYnkgdGhlIGNhbGxpbmcgcHJvZ3JhbS4gIEZyb20KLQlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLU1vbiBBdWcgIDggMTc6MTg6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JVXBkYXRlIHRvIG5zMzJrIHN1cHBvcnQsIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkuCi0JKiBhb3V0LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCi0JZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCi0JKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MpOiBDaGFuZ2UgZnJvbSBtYWNybyB0byBmdW5jdGlvbi4KLQkobnMzMmtfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LW5zMzJrLmg6IFJlbW92ZS4KLQkqIGNwdS1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQotCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgotCShuczMya19maW5hbF9saW5rX3JlbG9jYXRlKTogQ2FsbCBuczMya19yZWxvY2F0ZV9jb250ZW50cy4KLQkqIG5ldGJzZDUzMi5jOiBSZWZvcm1hdCB0byBzdGFuZGFyZHMsIGFkZCBjb3B5cmlnaHQgbm90aWNlLgotCShBUkNIKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0LW5zMzJrLmgpOiBEb24ndCBpbmNsdWRlLgotCSogcGM1MzItbWFjaC5jOiBEaXR0by4KLQotTW9uIEF1ZyAgOCAxNzo1NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBEb24ndCB0cnkgdG8gY29udmVydCByZWxvY3MKLQlhZ2FpbnN0IGNvbW1vbiBzeW1ib2xzLgotCi1TYXQgQXVnICA2IDIyOjI3OjMwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBJZ25vcmUgc2VjdGlvbnMgdGhhdAotCWFyZSBub3QgY29udGFpbmVkIGluIHRoZSBjb3JlIGZpbGUuCi0KLVRodSBBdWcgIDQgMTE6MzI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKiBjZi1tNjhrbHlueC5jIChfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEZvcmNlIHRoZSB2bWEgb2Ygc2VjdGlvbnMgd2hpY2gKLQlkbyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IHRvIGJlIDAuICBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUKLQlyZWxvY3MgYWdhaW5zdCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0KLVdlZCBBdWcgIDMgMTY6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogUmV3cm90ZSB0byBjaGFuZ2UgcmVsb2NzCi0JYWdhaW5zdCBsb2NhbGx5IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24KLQlzeW1ib2xzLCBmb3IgVnhXb3JrcyA1LjEuCi0KLVdlZCBBdWcgIDMgMTA6MzQ6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBPbmx5IGhhbmRsZQotCVNIQVJBQkxFX0NPTkZMSUNUUyBzcGVjaWFsbHkgaWYgQlNGX0NPTlNUUlVDVE9SIGlzIHNldC4gIFNldCBoYXNocAotCWZvciBhIEdPVCBvciBQTFQgc3ltYm9sLiAgU2V0IGp1bXAgZmllbGQgb2YgZml4dXAgZm9yIGEgUExUIHN5bWJvbC4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENoZWNrIHNlY3Rpb24gb2YgcmVhbCBzeW1ib2wuICBXaGVuIGxvb2tpbmcKLQlmb3IgYSBidWlsdGluIGZpeHVwLCBjaGVjayBidWlsdGluIGFuZCBqdW1wIGZsYWdzLiAgQ3JlYXRlIG5vIG1vcmUKLQl0aGFuIG9uZSBmaXh1cCwgYW5kIGFsd2F5cyBjcmVhdGUgb25lIGlmIHRoZSByZWFsIHN5bWJvbCBpcyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLiAgT25seSBzdHJpcCBhYnNvbHV0ZSBzeW1ib2xzLgotCi1XZWQgQXVnICAzIDA1OjA4OjI0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYyB0bwotCUxZTlhDT0ZGTUFHSUMgd2hlbmV2ZXIgNjhrLCBTUEFSQyBvciBpMzg2IEx5bnhPUwotCSh5ZXMsIHRoZXkgaGF2ZSB0aGUgc2FtZSBtYWdpYyBudW1iZXIhKQotCi1UdWUgQXVnICAyIDEwOjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmMgKEJNQUdJQyk6IERlZmluZSBhcyBIUFVYX0RPVF9PX01BR0lDLCB0byBtYWtlIHRlc3QKLQlpbiBhb3V0eC5oIHdvcmsgY29ycmVjdGx5LgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbi4KLQotCSogbGliYmZkLWluLmg6IE1vdmUgZGVjbGFyYXRpb25zIG9mIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGJmZF9zZWVrLAotCWJmZF90ZWxsLCBiZmRfZmx1c2gsIGFuZCBiZmRfc3RhdCBmcm9tIGhlcmUuLi4KLQkqIGJmZC1pbi5oOiAuLi50byBoZXJlLCB0byBtYWtlIHRoZW0gdmlzaWJsZSB0byBwcm9ncmFtcyB3aGljaAotCWtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHRoYW4gQkZEIGRvZXMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnICAxIDE3OjU1OjUzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6ICBDb252ZXJ0IHphbGxvYyB1c2FnZQotCXRvIGJmZF96YWxsb2MuCi0KLU1vbiBBdWcgIDEgMTI6MDQ6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQlFTEYgbGlua2VyIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfRFlOQU1JQyB0byBTVFRfT0JKRUNULgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBbHdheXMgY3JlYXRlIGhhc2ggdGFibGUKLQllbnRyeS4gIFNldCB0eXBlIHRvIFNUVF9PQkpFQ1QuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBzZXQgdHlwZSBvZiB3ZWFrIGRlZmluZWQgc3ltYm9sIHRvCi0JU1RCX1dFQUsgaWYgc3ltYm9sIHdhcyByZWZlcmVuY2VkLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIERZTkFNSUMgYXMgd2VsbCBhcyBFWEVDX1AuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRSB0byBTVFRfT0JKRUNULgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZ25vcmUgbG9jYWwgUExUMzIgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVHJlYXQgbG9jYWwgUExUMzIgcmVsb2NzIGFzIFBDMzIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENvcnJlY3Qgd2VhayBzeW1ib2wKLQloYW5kbGluZyBhZ2Fpbi4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUgcmVsb2NzCi0JaWYgdGhlcmUgYXJlbid0IGFueS4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHN5c3Y0LCBub3Qgc29sYXJpczIuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUuCi0JKiBjb25maWcvc29sYXJpczIubWg6IFJlbW92ZS4KLQotU3VuIEp1bCAzMSAxNDoyNzowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IFVwZGF0ZSBjb21tZW50IHJlZmxlY3Rpbmcgd2hpY2gKLQlIUFBBIEVMRiBzcGVjIHRoZSBjb2RlIGltcGxlbWVudHMuCi0KLVR1ZSBKdWwgMjYgMTc6Mzg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYyAoTUFYX0FSQ0gpOiBOZXcgbWFjcm8uCi0JKGNvbXBhdGlibGUpOiBVc2UgaXQgaW4gY29tcHV0aW5nIGFycmF5IGJvdW5kcy4gIFB1dCBjb21tYSBhZnRlcgotCWxhc3QgZW50cnkgaW4gYXJyYXksIGZvciByZWd1bGFyaXR5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRqdXN0IHNwYWNpbmcgZm9yIGVhc2llciByZWFkaW5nLgotCi0JKiBjb2ZmLWk5NjAuYyAoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogVXNlCi0JSE9XVE8gbWFjcm8uCi0KLQkqIGNwdS1pOTYwLmMgKEpYKTogRGVmaW5lIGFzIGJmZF9tYWNoX2k5NjBfanguCi0JKHNjYW5fOTYwX21hY2gpOiBSZWNvZ25pemUganggbWFjaGluZS4KLQkoTUFYX0FSQ0gpOiBEZWZpbmUgdG8gYmUgSlguCi0JKGNvbXBhdGlibGUpOiBBZGQgSlggcm93IHRvIGFycmF5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIEpYIGVudHJ5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2p4KTogTmV3IG1hY3JvLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBGb3IgRl9JOTYwSlgsIHNldCBtYWNoaW5lCi0JdG8gYmZkX21hY2hfaTk2MF9qeC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBGb3IgYmZkX21hY2hfaTk2MF9qeCwgc2V0IEZfSTk2MEpYLgotCi1UdWUgSnVsIDI2IDExOjA0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2hlbiBoYW5kbGluZyBhIHdlYWsKLQlzeW1ib2wsIGNvcnJlY3QgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGVxdWl2YWxlbnQgbm9ybWFsIHN5bWJvbAotCXdhcyByZWZlcmVuY2VkLgotCi0JQWRkIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgaTM4NiBFTEYgYW5kIFNQQVJDCi0JRUxGLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgY29weV9vZmZzZXQgZmllbGQuCi0JQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQgZmllbGRzLgotCShFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX05FRURTX0NPUFkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQ2hhbmdlIHJlbG9jcyBmcm9tIFBUUiB0bwotCUVsZl9JbnRlcm5hbF9SZWxhICouCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCShlbGZfbG9jYWxfZ290X29mZnNldHMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB1c2UgdGhlIHNlY3Rpb24gZGF0YQotCXJlbG9jcyBmaWVsZC4KLQkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCkuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHB1dAotCW1ha2UgYWxsIGxvY2FsIHN5bWJvbHMgZHluYW1pYy4gIERvbid0IGJvdGhlciB3aXRoIHRoZQotCURZTkFNSUNfTVVMVElQTEUgZmxhZ3MuICBDYWxsIHRoZSBjaGVja19yZWxvY3MgYmFja2VuZCBmdW5jdGlvbiBpZgotCWl0IGlzIGRlZmluZWQuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKS4gIElmCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0RZTkFNSUMgaXMgYWRkZWQgYXMgYQotCWR5bmFtaWMgc3ltYm9sLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbHdheXMgY3JlYXRlIHN5bWJvbHMsIGFuZCBhbHdheXMgbWFrZSB0aGVtIGR5bmFtaWMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFBlcm1pdCBjcmVhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfcmVhZF9yZWxvY3MgdG8gZ2V0IHRoZSByZWxvY3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplCi0JY29weV9vZmZzZXQuICBJbml0aWFsaXplIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QTFQzMiBhbmQKLQlSXzM4Nl9HT1RQQyB0byBiZSBwY19yZWxhdGl2ZSBhbmQgcGNyZWxfb2Zmc2V0LgotCShlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfcGljX3BsdF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgYSAuZ290LnBsdCBzZWN0aW9uLCBhbmQKLQlkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiBpdC4gIElmIGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLQlkeW5hbWljIHN5bWJvbC4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmX2kzODZfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBSZW1vdmUgYW55IGVtcHR5IHJlbG9jCi0Jb3IgcGx0IHNlY3Rpb25zLiAgT25seSBhZGQgYSBEVF9ERUJVRyBlbnRyeSBpZiBub3QgY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LiAgT25seSBhZGQgYSBEVF9QTFRHT1QgZW50cnkgaWYgdGhlcmUgaXMgYSBQTFQuCi0JQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZiByZXF1aXJlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCi0Jc3BlY2lhbGx5LgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAotCWlzIHNldC4gIElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgYSBQSUMgUExUIGVudHJ5LgotCU9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZCBieSBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzIHNldC4KLQlDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZgotCURUX1JFTFNaIHRvIHNpbXBseSBzdWJ0cmFjdCBvdXQgdGhlIHNpemUgb2YgLnJlbC5wbHQuICBJZiBjcmVhdGluZwotCWEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgUElDIFBMVCBjb2RlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMCwKLQlSX1NQQVJDX0dPVDIyLCBhbmQgUl9TUEFSQ19QQzEwIHRvIG5vdCB3YXJuIGFib3V0IHJlbG9jIG92ZXJmbG93LgotCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLSAgICAgICAgZHluYW1pYyBzeW1ib2wsIGFuZCBzZXQgdGhlIHR5cGUgdG8gU1RUX09CSkVDVC4gIExpa2V3aXNlIGZvcgotICAgICAgICBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEKLSAgICAgICAgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmMzJfc3BhcmNfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBPbmx5IGFkZCBhIERUX0RFQlVHCi0JZW50cnkgaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmCi0JcmVxdWlyZWQuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcwotCXNwZWNpYWxseS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKLQlpcyBzZXQuICBPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQKLQlieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcwotCXNldC4gIENyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBTdG9yZSBkeW5vYmogaW4gYSBsb2NhbAotCXZhcmlhYmxlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjUgMTI6MjE6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBjNTMybWFjaF92ZWMpOiBDaGFuZ2UgdG8gcGM1MzJtYWNoYW91dF92ZWMuCi0JKiBjb25maWcuYmZkIChuczMyay0qLW5ldGJzZCopOiBVc2UgbnMzMmstbmJzZCBhcyBiZmRfbmFtZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW5zMzJrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtbnMzMmsubywgbmV0YnNkNTMyLm8sIG04OGttYWNoMy5vLAotCXBjNTMyLW1hY2guby4KLQkqIHRhcmdldHMuYyAocGM1MzJtYWNoYW91dF92ZWMpOiBVc2UgaW5zdGVhZCBvZiBwYzUzMm1hY2hfdmVjLgotCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKERFRkFVTFRfVkVDVE9SKTogRGl0dG8uCi0JKFNFTEVDVF9WRUNTKTogUmVtb3ZlLgotCSogY29uZmlnL25zMzJrLW5ic2QubXQ6IE5ldyBmaWxlLCB3YXMgbnMzMmstbmV0YnNkLm10LgotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogUmVtb3ZlLCBuYW1lIHRvbyBsb25nLgotCi1GcmkgSnVsIDIyIDExOjA3OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBXaGVuIGNoYW5naW5nIGEKLQlzeW1ib2wgdG8gY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNyZWF0aW5nIGEgY29tbW9uIHN5bWJvbCwKLQlzZXQgdGhlIGFsaWdubWVudC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogV2hlbiBjaGFuZ2luZyBhIHN5bWJvbCB0bwotCWNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlc3RyaWN0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0JdG8gdGhlIGFsaWdubWVudCBwb3dlciBnaXZlbiBieSB0aGUgYXJjaGl0ZWN0dXJlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGFsaWduIGZpZWxkLiAgQWRkCi0JY29weV9vZmZzZXQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIGFsaWdubWVudCBpbgotCW5ldyBiZmRfbGlua19oYXNoX2VudHJ5IGZpZWxkLCBub3QgaW4gZWxmX2xpbmtfaGFzaF9lbnRyeSBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbWlsYXIgY2hhbmdlIHdoZW4gZ2V0dGluZyBhbGlnbm1lbnQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIGFsaWduLiAgRG8KLQlpbml0aWFsaXplIGNvcHlfb2Zmc2V0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQKLQlmaWVsZCByYXRoZXIgdGhhbiBhbGlnbiBmaWVsZC4gIEdldCBhbGlnbm1lbnQgdXNpbmcgYmZkX2xvZzIKLQlyYXRoZXIgdGhhbiBzd2l0Y2guCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0LAotCW5vdCBhbGlnbi4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEp1c3QgY2hlY2sKLQlTVEFUX0ZPUl9FWEVDLCBkb24ndCBjaGVjayBNQUNILgotCSogbTg4a21hY2gzLmMgKE1BQ0gpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaTM4Ni1tYWNoMy5tdCAoVERFRklORVMpOiBEZWZpbmUgU1RBVF9GT1JfRVhFQy4KLQkqIGNvbmZpZy9tODhrLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgotCSogY29uZmlnL21pcHMtbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgMjEgMTc6MjQ6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYzogUmV2ZXJ0ZWQgdG8gdmVyc2lvbiBmcm9tIGJlZm9yZSBKdWwgNSAxOTk0IGNoYW5nZXMuCi0KLVRodSBKdWwgMjEgMTI6MjY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogUmVtb3ZlIHNwZWNpYWxfZnVuY3Rpb24xLgotCUl0J3MgdGhlIHdyb25nIHdheSB0byBkbyB0aGluZ3MuCi0JKEhPV1RPKTogQ2hhbmdlIGFjY29yZGluZ2x5LgotCShIT1dUTzIpOiBSZW1vdmUuCi0JKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0Jc3BlY2lhbF9mdW5jdGlvbjEuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCXNwZWNpYWxfZnVuY3Rpb24xLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIwIDE1OjQ2OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBycGF0aAotCWFyZ3VtZW50LiAgSWYgaXQgaXMgbm90IE5VTEwsIHVzZSBpdCB0byBzZXQgRFRfUlBBVEguCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotU2F0IEp1bCAxNiAyMToxMDozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIHRoZXJlIGlzIG5vCi0JZHluYW1pYyBzeW10YWIsIHJldHVybiBlcnJvci4KLQotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcwotCXdlYWssIHNldCBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzIHdlYWssIG1hcmsgaXQKLQlTVEJfV0VBSy4KLQotCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxvY3MgZmllbGQuCi0JKHNoZHJfbmFtZSk6IFJlbW92ZTsgdW51c2VkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoIFJFTAotCWFuZCBSRUxBIHJlbG9jcy4gIEZyZWUgdXAgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBQZXJtaXQgdGhlIHJlbG9jcwotCXRvIGJlIGNhY2hlZCBpbiB0aGUgc2VjdGlvbl9kYXRhLiAgQ29ycmVjdCB0aGUgcmVsb2MgYWRkcmVzcy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFJlbW92ZS4KLQkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFJld3JvdGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgcmVsb2NzIHRvIGJlIGNhY2hlZCBpbiB0aGUKLQlzZWN0aW9uIGRhdGEuCi0KLVNhdCBKdWwgMTYgMTM6NTU6MzggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtODgqLWhhcnJpcy1jeHV4Kik6IFJlY29nbml6ZS4KLQkqIGhvc3RzL2hhcnJpcy5oIChQT1NJWF9VVElNRSwgSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLWF0YXJpLXN5c3Y0Kik6IE5ldyBob3N0LgotCShtNjgqLWNibS1zeXN2NCopOiBVc2UgbTY4a3Y0IGluc3RlYWQgb2YgYW1peC4KLQkqIGhvc3RzL2FtaXguaDogUmVtb3ZlLgotCSogaG9zdHMvbTY4a3Y0Lmg6IE5ldyBmaWxlLCB3YXMgYW1peC5oLgotCi1UaHUgSnVsIDE0IDE1OjEyOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCwgYmZkX3R5cGUsIHN0cnVjdAotCXJlbG9jX2hvd3RvX3N0cnVjdCwgcmVsb2NfaG93dG9fdHlwZSwgSE9XVE8sIEhPV1RPMik6IENvcGllZAotCWNoYW5nZXMgb3ZlciBmcm9tIGJmZC1pbjIuaCBzbyB0aGV5IGdldCBnZW5lcmF0ZWQgcHJvcGVybHkgbmV4dAotCXRpbWUgc29tZW9uZSBydW5zICJtYWtlIGhlYWRlcnMiLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiB0YXJnZXRzLmMgKG5ldGJzZDUzMl92ZWMsIHBjNTMybWFjaF92ZWMpOiBEZWNsYXJlIGNvbnN0LgotCShtODhrbWFjaDNfdmVjKTogUmVzdG9yZSBkZWxldGVkIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIHRhcmdldCB2ZWN0b3IgbmFtZXMuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubWg6IE5ldyBmaWxlLgotCShIREVQRklMRVMsIEhERUZJTkVTKTogRGVmaW5lIGhlcmUuCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KLQotCVN1biBKdWwgMTAgMDA6MDQ6MjAgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIHBjNTMyLW1hY2guYzogTmV3IEZpbGUuIHBjNTMyLW1hY2ggYS5vdXQgZm9ybWF0LgotCi0JKiBuZXRic2Q1MzIuYzogTmV3IGZpbGUuIHBjNTMyLW5ldGJzZDUzMiBhLm91dCBmb3JtYXQuCi0KLQkqIGhvc3RzL3BjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCBob3N0IHN1cHBvcnQuCi0KLQkqIGNwdS1uczMyay5jOiBOZXcgZmlsZS4gbnMzMmsgc3VwcG9ydCBjcHUgc3BlY2lmaWMgY29kZSByYXRoZXIKLQl0aGFuIGZvcm1hdCBzcGVjaWZpYyBjb2RlLgotCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIHBjNTMyLW1hY2ggdGFyZ2V0LgotCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgbmV0YnNkNTMyIHRhcmdldC4KLQotCSogYW91dC1uczMyay5jLCBhb3V0LW5zMzJrLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIGFvdXQgZm9ybWF0IGZvcgotCW5zMzJrIHNlcmllcy4gCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldGJzZDUzMl92ZWMgYW5kIHBjNTMybWFjaGFvdXRfdmVjIGludG8KLQliZmRfdGFyZ2V0X3ZlY3RvciBhcnJheS4gTW92ZSBuZXRic2QzODZfdmVjIHRvIGFscGhhYmV0aWMgb3JkZXIKLQlsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKSBBZGQgc3VwcG9ydCBmb3IKLQlzcGVjaWFsX2Z1bmN0aW9uMSBpbiBob3d0by4KLQotCSogbGliYW91dC5oOiBhZGQgTV9OUzMyMDMyLCBNX05TMzI1MzIsIE1fNTMyX05FVEJTRCBlbnRyaWVzIGluCi0JbWFjaGluZV90eXBlIGVudW0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHBjNTMybWFjaF92ZWMgYW5kIG5ldGJzZDUzMl92ZWMgZW50cmllcy4KLQotCSogY29uZmlnLmJmZDogYWRkIHBjNTMybWFjaCBob3N0IGVudHJpZXMuIFVzZSBmb3IgYm90aAotCW5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZC4KLQotCSogY29uZmlnLmJmZDogaXQgZG9lc24ndCB3b3JrIHRvIHVzZSBpMzg2LW1hY2gzIGZvciBuczMyayotKi1tYWNoLgotCWFkZCBuczMyay1wYzUzMi1tYWNoKiBhbmQgbnMzMmstKi1uZXRic2QqIGVudHJpZXMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIG5zMzJrIHNwZWNpZmljIHJlbG9jYXRpb25zIHRvIGJmZF9yZWxvY19jb2RlX3JlYWwKLQllbnVtLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBzcGVjaWFsX2Z1bmN0aW9uMSB0byBzdHJ1Y3QgaG93dG8uIENoYW5nZSBIT1dUTwotCWFuZCBORVdIT1dUTyBtYWNyb3MgdG8gbWFrZSBzcGVjaWFsX2Z1bmN0aW9uMSBOVUxMLiBOZXd3IEhPV1RPMgotCW1hY3JvLgotCi0JKiBiZmQtaW4yLmg6IFNwbGl0IGRlZmluaXRpb24gb2Ygc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotCWFuZCBjb3JyZXNwb25kaW5nIHR5cGVkZWYgaW50byB0d28gc3RhdGVtZW50cy4KLQotCSogYmZkLWluMi5oOiBBZGQgZW50cnkgYmZkX2FyY2hfbnMzMmsgdG8gYmZkX2FyY2hpdGVjdHVyZSBlbnVtLgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX25zMzJrX2FyY2ggcHJvdG90eXBlLCBhbmQgZW50cnkgaW4KLQlhcmNodXJlc19pbml0X3RhYmxlLiAKLQotCSogYW91dHguaCAoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAotCU1ZX3B1dF9yZWxvYyBtYWNyby4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQgc3BlY2lhbF9mdW5jdGlvbjEKLQl0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4gCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IEFsbG93IGZvciB0YXJnZXQKLQlkZXBlbmRlbnQgZGV0ZXJtaW5hdGlvbiBvZiByZWxvYyBob3d0by4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKLQlzcGVjaWFsX2Z1bmN0aW9uMSB0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4KLQotCSogYW91dHguaCAoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGV0ZWN0IGJzcyBhbmQgcmV0dXJuIDAuCi0KLQkqIGFvdXR4LmggKHNsdXJwX3JlbG9jX3RhYmxlKTogRGV0ZWN0IGJzcyBhbmQgc3VjY2VzZnVsbHkgcmVhZAotCXplcm8gcmVsb2MgZW50cmllcy4KLQotCSogYW91dHguaCAobWFjaGluZV90eXBlKTogQWRkIGJmZF9hcmNoX25zMzJrIGNhc2UuCi0KLQkqIGFvdXR4Lmg6IFN0YXQgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFibGUgc3RhdHVzIGlmIFNUQVRfRk9SX0VYRUMKLQlpcyBkZWZpbmVkIChub3QganVzdCBNQUNIKS4gVXNlIGZzdGF0IGluc3RlYWQgb2Ygc3RhdCBhbmQgY2hlY2sKLQlmb3IgZnN0YXQgZXJyb3IuCi0KLQkqIGFvdXR4Lmg6IEFsbG93IHRhcmdldCBkZXBlbmRlbnQgc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0uCi0KLQkqIGFvdXR4Lmg6IEFsbG93IENUT1JTIHJlbG9jIGluZm8gdG8gYmUgaW4gdGFyZ2V0IGRlcGVuZGVudCByZWxvYwotCXRhYmxlLgotCi0JKiBhb3V0LXRhcmdldC5oOiBBcHBseSBTV0FQX01BR0lDIChpZiBkZWZpbmVkKSBhZnRlcgotCXN3YXBfZXhlY19oZWFkZXJfaW4sIG90aGVyd2lzZSB3ZSBoYXZlIG1hZ2ljIGluIHRoZSB3cm9uZyBvcmRlci4KLQotVGh1IEp1bCAxNCAxMTo0NzoyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IEhhdmUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KLQotVHVlIEp1bCAxMiAxMjowODoxMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXRmMS5oLCBjaXNjby1jb3JlLmMsIGVsZmNvZGUuaCwgaHBwYWJzZC1jb3JlLmMsCi0JaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBseW54LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywKLQlyczYwMDAtY29yZS5jLCB0cmFkLWNvcmUuYzogIFJlbW92ZSBTRUNfQUxMT0MgZmxhZyBmcm9tIC5yZWcKLQlzZWN0aW9ucywgLnJlZyBzZWN0aW9ucyBhcmUgbm90IGFsbG9jYXRlZCBhbmQgY29udGFpbiBkZWJ1ZwotCWluZm9ybWF0aW9uIG9ubHkuCi0JKiBvc2YtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgb3NmX2NvcmVfY29yZV9maWxlX3ApOiAgVXNlCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgaW5zdGVhZCBvZiBidWlsZGluZyB1bmlxdWUgc2VjdGlvbiBuYW1lcy4KLQotVHVlIEp1bCAxMiAxMTo0MToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luLCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGVfaW5pdCk6IENvcnJlY3QgY2FzdC4KLQotCSogYW91dC1lbmNhcC5jIChBUkNIKTogRG9uJ3QgZGVmaW5lLiAgT2Jzb2xldGUuCi0JKiBhb3V0MC5jLCBhb3V0eC5oLCBnZW4tYW91dC5jLCBocDMwMGJzZC5jLCBocDMwMGhwdXguYzogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jLCBpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYzogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jLCBtNjhrbHlueC5jLCBtaXBzYnNkLmMsIG5ldGJzZDM4Ni5jOiBMaWtld2lzZS4KLQkqIG5ld3NvczMuYywgc3BhcmNseW54LmMsIHN1bm9zLmM6IExpa2V3aXNlLgotCi1Nb24gSnVsIDExIDIwOjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IE1ha2UgdGhlIHNpeHRoIGFyZ3VtZW50IGJvb2xlYW4sIG5vdAotCXRoZSBzZXZlbnRoLiAgRnJvbSBnYXJ5QHR1dmEucGFjc2VtaS5vei5hdSAoZ2FyeSBrb3BmZikuCi0KLVN1biBKdWwgMTAgMDk6MTI6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IENoYW5nZSBuYW1lIG9mIEZSRUUgdG8gQkZDSV9GUkVFCi0JaW4gb3JkZXIgbm90IHRvIGNvbGxpZGUgd2l0aCBMeW54T1MncyBkZWZpbml0aW9uIG9mIEZSRUUgaW4KLQkvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaAotCi1UaHUgSnVsICA3IDE0OjE4OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGNsb2JiZXIgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBmb3IgY29mZi1JbnRlbC1saXR0bGUgb3IgY29mZi1JbnRlbC1iaWcuICBIYWNrIHVwb24gaGFjay4KLQotVGh1IEp1bCAgNyAxMDoxMDozNCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6ICBBZGQgZW50cnkgZm9yIEdPVCByZWxvY2F0aW9ucwotCXdoaWNoIGFyZSBwcmVzZW50IGluIHN1bjMgc2hhcmVkIGxpYnJhcmllcywgdG8gYXZvaWQgYXNzZXJ0aW9ucwotCXdoZW4gcmVhZGluZyB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4KLQotVGh1IEp1bCAgNyAxMDoxOToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRml4IGR1bWIgdHlwby4gCi0KLVdlZCBKdWwgIDYgMTk6MjE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zeXN2NC5oIChxc29ydCwgc3RydG9sKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogRG9uJ3QgY2FsbCBvdXRwdXRfc3ltYm9sX2hvb2sKLQlpZiBpdCBpcyBOVUxMLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgaWdub3JlZCBpbmZvCi0JYXJndW1lbnQgdG8gY29ycmVzcG9uZCB0byByZWNlbnQgbGliZWxmLmggY2hhbmdlLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogIE5ldyBob29rIHRvCi0JYWRkaXRpb25hbGx5IGNvcHkgb2JqZWN0IHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWxwaGEgZmlsZQotCWhlYWRlciB0byB0aGUgQkZEIGZsYWdzLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiAgVXNlIGl0LgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiAgQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogYW91dDY0LmM6ICBGaXggdHlwbyBpbiBjb25kaXRpb25hbCBRTUFHSUMgZGVmaW5pdGlvbi4KLQotV2VkIEp1bCAgNiAwMDoxMzoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IFNhbml0eSBjaGVjayB0aGUKLQl2YWx1ZSBvZiBjbGlja3N6IHRvIGhlbHAgd2VlZCBvdXQgbm9uIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0KLVR1ZSBKdWwgIDUgMTM6MjY6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JTWFjaCAzIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6Ci0JTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBSZWNvZ25pemUKLQkibWFjaDMiIGluc3RlYWQgb2YgIm1hY2giLgotCShtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6IE5ldyBob3N0cy4KLQkqIHRhcmdldHMuYyAobTg4a21hY2gzX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2bWFjaDNfdmVjIGFuZCBtODhrbWFjaDNfdmVjLCBidXQKLQlpbnNpZGUgI2lmIDAuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApIFtNQUNIXTogUmVjb2duaXplIGV4ZWN1dGFibGVzIGJ5Ci0JY2hlY2tpbmcgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbiwgaW5zdGVhZCBvZiBsb29raW5nIGF0IGVudHJ5Ci0JcG9pbnQuCi0JKiBpMzg2bWFjaDMuYzogVXBkYXRlLCBkZWZpbmUgTUFDSCwgTl9UWFRPRkYsIE5fVFhUQUREUiwKLQlOX1NIQVJFRF9MSUIsIGRvbid0IGluY2x1ZGUgYW91dC8qLmggZmlsZXMsIGV0Yy4KLQkqIG04OGttYWNoMy5jOiBOZXcgZmlsZSwgbTg4ayBNYWNoIDMgdGFyZ2V0LgotCSogY29uZmlnL204OGstbWFjaDMubXQsCWNvbmZpZy9taXBzLW1hY2gzLm10OiBOZXcgZmlsZXMsIHRhcmdldAotCW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzbWFjaDMubWg6Ci0JTmV3IGZpbGVzLCBob3N0CW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGhvc3RzL204OGttYWNoMy5oLCBob3N0cy9taXBzbWFjaDMuaDogTmV3IGZpbGVzLCBob3N0IGRlZmluaXRpb25zLgotCi1UdWUgSnVsICA1IDEzOjU2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogR2V0IGFsaWdubWVudCBvZiBjb21tb24gc3ltYm9sIGZyb20KLQlzdF92YWx1ZSBmaWVsZCBvZiBzYXZlZCBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLCBpZiB0aGVyZSBpcyBhbnkuCi0KLU1vbiBKdWwgIDQgMTk6MTM6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KLQkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCi0JKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IERlbGV0ZSBSX1BBUklTQ19TVFVCX0NBTExfMTcuCi0KLUZyaSBKdWwgIDEgMTI6MDc6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFN1cHBvcnQgY29kZSBmb3IgZW5hYmxpbmcgdGhlIG5ldyBzdHlsZSBsaW5rZXIgZm9yIFBBIEVMRi4KLQkqIGVsZmNvZGUuaCAoc3dhcF9zeW1ib2xfaW4sIHN3YXBfc3ltYm9sX291dCk6IEV4dGVybmFsaXplLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyBsaW5rX2luZm8gdG8KLQl0aGUgYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rLgotCShiZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFBhc3MgTlVMTCBmb3IgbmV3IGxpbmtfaW5mbwotCWFyZ3VtZW50IHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KLQkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IEFjY2VwdCBuZXcgImlucHV0X3NlY3Rpb24iIGFyZ3VtZW50IGZvcgotCXRoZSBzeW1ib2xzJ3MgaW5wdXQgc2VjdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBDYWxsIHRoZQotCWxpbmtfb3V0cHV0X3N5bWJvbF9ob29rIGlmIGl0J3MgZGVmaW5lZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsbCB0aGUgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIGlmCi0JaXQncyBkZWZpbmVkLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVjbGFyZS4KLQkoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBuZXcgImluZm8iIGFyZ3VtZW50LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBQcm92aWRlCi0JYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGVsZjMyX2JlZCk6IEFkZCBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KLQkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4KLQkKLQkqIE1ham9yIHJld29yayBvZiB0aGUgUEEgRUxGIGNvZGUuICBVc2VzIHRoZSBuZXcgc3R5bGUgQkZECi0JbGlua2VyLCBtYWpvciBjbGVhbnVwcy4KLQkqIGhwcGFfc3R1YnMuaDogUmV3cml0ZSBmcm9tIHNjcmF0Y2guICBNdWNoIHNtYWxsZXIgYW5kIHNpbXBsZXIuCi0JKiBlbGYzMi1ocHBhLmg6IERlbGV0ZSBhbGwgc3ltYm9sIGV4dGVuc2lvbiByZWxhdGVkIGNvZGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMsIGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZGVjbHMuCi0JKiBlbGYzMi1ocHBhLmM6IFN5bWJvbCBleHRlbnNpb24gc3R1ZmYgbW92ZWQgZm9ybSBlbGYzMi1ocHBhLmgKLQlpbnRvIGVsZjMyLWhwcGEuYy4gIERvIG5vdCBpbmNsdWRlIGFvdXQ2NC5oLgotCSh0eXBkZWYgaHBwYV9zdHViX3R5cGUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3Rfc3RydWN0KTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb25fc3RydWN0KTogRGVsZXRlLgotCShhcmdfcmVsb2NfdHlwZSk6IFVzZSBzaW1wbGVyIGVudW1lcmF0aW9ucy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKGFyZ19sb2NhdGlvbiwgYXJnX3JlbG9jX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zdHJ1Y3QpOiBEZWxldGUuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogRGVsZXRlLgotCShmaW5kX3N0dWJzLCBuZXdfc3R1YnMsIHR5cGVfb2ZfbWlzbWF0Y2gpOiBEZWxldGUuCi0JKGZpbmRfc3R1Yl9ieV9uYW1lLCBhZGRfc3R1Yl9ieV9uYW1lKTogRGVsZXRlLgotCShocHBhX2VsZl9zdHViX2ZpbmlzaCwgaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZCk6IFJlbmFtZWQuICBTaW1wbGlmeS4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIsIGhwcGFfZWxmX2NyZWF0ZV9zdHViX3NlYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBEZWxldGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZS4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlbGV0ZS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogRGVsZXRlLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9idWlsZF9vbmVfc3ViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKGxpbmtlciwgc3R1YiBhbmQgYXJndW1lbnQgaGFzaCB0YWJsZXMpOiBBZGQgYXBwcm9wcmlhdGUKLQlzdHJ1Y3R1cmVzLCBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBhbGwgdGhyZWUKLQloYXNoIHRhYmxlcy4KLQkoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IERvbid0IG5lZWQgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24KLQlpbiB0aGlzIGZ1bmN0aW9uLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogQWNjZXB0IGEgc3ltYm9sJ3MgYXJndW1lbnQgbG9jYXRpb24KLQlpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIGl0c2VsZi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltcGxpZnkuCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3R1YiBzZWN0aW9uIGlzIG5vIGxvbmdlciBzcGVjaWFsLgotCShocHBhX2VsZl9yZWxvYyk6IEdyZWF0bHkgc2ltcGxpZnkuCi0JKGVsZjMyX2hwcGFfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFjY2VwdCBsaW5rX2luZm8gYXJndW1lbnQuCi0JSGFuZGxlIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBCRkQgYmFja2VuZCBsaW5rZXIuCi0JKGVsZjMyX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbG9uZ2VyIGNhbGwgc3R1Yl9maW5pc2guCi0JCi1Nb24gSnVuIDI3IDE4OjA3OjA2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFB1dCBpbiBwYXJlbnMgdG8gZ2V0Ci0JcHJlY2VkZW5jZSByaWdodC4KLQotU3VuIEp1biAyNiAxODowODoyOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliZWxmLmggKHJlbG9jYXRlX3NlY3Rpb24pOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIgYWRkZWQKLQl0byBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIgotCWFkZGVkIHRvIHByb3RvdHlwZSBvZiByZWxvY2F0ZV9zZWN0aW9uLiAgUGFzcyB0aGUgb3V0cHV0IHN5bWJvbAotCW5hbWVzIHRvIHJlbG9jYXRlX3NlY3Rpb24uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgIm91dHB1dF9uYW1lcyIgdG8KLQlkZXRlcm1pbmUgdGhlIG5hbWUgb2YgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyNCAwODoxNTo0MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlBZGQgU29sYXJpcyBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzIGl0IHRvIHJ1bgotCVN1bk9TNCBhLm91dCBmaWxlcykgY29yZSBmaWxlIGhhbmRsaW5nLgotCSogYW91dGYxLmggKGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUsIHN3YXBjb3JlX3NvbGFyaXNfYmNwKToKLQlOZXcgc3RydWN0dXJlIGFuZCBpdHMgc3dhcCBpbiBmdW5jdGlvbi4KLQkoaW50ZXJuYWxfc3Vub3NfY29yZSk6ICBOZXcgbWVtYmVyIGNfZGF0YV9hZGRyLCB0byByZWNlaXZlIHRoZQotCXN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgY29yZSBmaWxlLgotCShzd2FwY29yZV9zdW4zLCBzd2FwY29yZV9zcGFyYywgc3Vub3M0X2NvcmVfZmlsZV9wKTogIFVzZSBpdC4KLQkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlY29nbml6ZSBTb2xhcmlzIEJDUCBjb3JlIGZpbGUuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgQWx3YXlzIGluZGljYXRlIG1hdGNoCi0JZm9yIFNvbGFyaXMgQkNQIGNvcmUgZmlsZXMuCi0KLVRodSBKdW4gMjMgMTU6MzE6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBJZiBEWU5BTUlDLCBzZXQgZV90eXBlIHRvIEVUX0RZTi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LAotCWNyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGZvciBmaXJzdCBpbnB1dCBCRkQgd2l0aCB0aGUgcmlnaHQgZm9ybWF0LgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSAuaW50ZXJwIHNlY3Rpb24KLQlpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBTa2lwIGR5bmFtaWMgc2VjdGlvbnMgaW4gaW5wdXQgZmlsZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgaXQncyBPSyBmb3IKLQlkeW5vYmogdG8gaGF2ZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19JTl9NRU1PUlkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5pbnRlcnAKLQlzZWN0aW9uIGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IERvbid0IHNldCBEWU5BTUlDIGp1c3QgYmVjYXVzZSB0aGVyZQotCWlzIGFuIFNIVF9EWU5BTUlDIHNlY3Rpb24uCi0KLQkqIGNmLWkzODZseW54LmMgKGkzODZjb2ZmX3ZlYyk6IERvbid0IGluY2x1ZGUgRFlOQU1JQyBpbgotCW9iamVjdF9mbGFncy4KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV92ZWMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzZXQgU0VDX1JFTE9DCi0JanVzdCBiZWNhdXNlIERZTkFNSUMgaXMgc2V0LgotCi1UaHUgSnVuIDIzIDEyOjUzOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cyBhbmQKLQktLXdpdGgtNjQtYml0LWJmZCB0byAtLWVuYWJsZS02NC1iaXQtYmZkLgotCSogTWFrZWZpbGUuaW4sIG1wdy1tYWtlLmluLCB0YXJnZXRzLmM6IENoYW5nZSBjb21tZW50cy4KLQotV2VkIEp1biAyMiAxNzo1OTo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZQotCXBvd2VycGMtKi1zeXN2NCouCi0KLQkqIGxpbmtlci5jIChGQUlMKTogVW5kZWZpbmUgbWFjcm8gYmVmb3JlIGRlZmluaW5nIGFzIGVudW0uCi0KLVdlZCBKdW4gMjIgMTA6NTI6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKLQlwYXNzIGZyb20gYWJmZC0+YXJjaGl2ZV9wYXNzLCBhbmQgc2F2ZSBpdCB0aGVyZSBhcyB3ZWxsLgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X2Vycm9yIGlmCi0Jb2JzdGFja19hbGxvYyByZXR1cm5zIE5VTEwgdW5sZXNzIHRoZSBzaXplIGlzIG5vbi16ZXJvLgotCi0JKiBsaW5rZXIuYyAoYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZQotCXJhdGhlciB0aGFuIG9ic3RhY2tfYWxsb2MsIGZvciBjbGFyaXR5LgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBDb3JyZWN0LgotCi0JKiBhb3V0NjQuYyAoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIEZyb20KLQlQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCi0KLQlMaW51eCBaTUFHSUMgc3VwcG9ydCBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGZpZWxkIHptYWdpY19kaXNrX2Jsb2NrX3NpemUuCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBPbmx5IHNldCBhbGlnbm1lbnQgYWNjb3JkaW5nIHRvCi0JYXJjaGl0ZWN0dXJlIGlmIHRoZSBzZWN0aW9uIHNpemVzIGFyZSBhbGlnbmVkIHRvIHRoYXQgYWxpZ25tZW50LAotCWZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCShNWShzZXRfc2l6ZXMpKTogSW5pdGlhbGl6ZSB6bWFnaWNfZGlza19ibG9ja19zaXplIGZpZWxkLgotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBTZXQgenRpaCBpZiB1c2luZyBxX21hZ2ljX2Zvcm1hdC4gIFNldAotCXRleHQgc2VjdGlvbiBmaWxlcG9zIHRvIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgaWYgbm90IHp0aWguICBVc2UgYQotCWRpZmZlcmVudCBwYWRkaW5nIGFsZ29yaXRobSBpZiBub3QgenRpaC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERvbid0IGRlZmluZS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBKdXN0IHNraXAgTl9TVEFCIGFuZCBOX0ZOCi0gICAgICAgIHN5bWJvbHM7IGRvbid0IGxvb2sgdGhlbSB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEZyb20KLSAgICAgICAgcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCi0KLVR1ZSBKdW4gMjEgMTE6NDc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWdvMzIuYyAoZ28zMmNvZmZfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQotCSogc2VjdGlvbi5jIChiZmRfYWJzX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfYWJzX3NlY3Rpb25fcHRyLCBiZmRfaXNfYWJzX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF91bmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF91bmRfc2VjdGlvbl9wdHIsIGJmZF9pc191bmRfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2NvbV9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2NvbV9zZWN0aW9uX3B0cik6IERlZmluZS4KLQkoYmZkX2luZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2luZF9zZWN0aW9uX3B0ciwgYmZkX2lzX2luZF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfYWJzX3N5bWJvbCwgYmZkX2NvbV9zeW1ib2wpOiBNYWtlIGNvbnN0LgotCShiZmRfdW5kX3N5bWJvbCwgYmZkX2luZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZ2xvYmFsX3N5bXMpOiBDYXN0IGluaXRpYWxpemF0aW9uIG9mIHNlY3Rpb24gZmllbGQuCi0JKFNURF9TRUNUSU9OKTogRGVmaW5lIGFzIGNvbnN0LCBhbmQgY2FzdCBpbml0aWFsaXphdGlvbnMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0KLU1vbiBKdW4gMjAgMTE6MDY6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYW55IGZpbGVzOiBjaGFuZ2UgYWxsIGJmZF90YXJnZXQgdmVjdG9ycyB0byBiZSBjb25zdC4gIENoYW5nZQotCWFsbCB1c2VzIG9mIGJmZF90YXJnZXQgKiB0byBiZSBjb25zdCBiZmRfdGFyZ2V0ICouICBDaGFuZ2UKLQliZmRfdGFyZ2V0X3ZlY3RvciBhbmQgYmZkX2RlZmF1bHRfdmVjdG9yIGFycmF5cyB0byBiZSBjb25zdAotCWJmZF90YXJnZXQgKiBjb25zdCAqLgotCi0JKiBlY29mZi5jLCBsaWJlY29mZi5oLCBlY29mZnN3YXAuaCwgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywKLQllbGYzMi1taXBzLmM6IFJlbmFtZWQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcyB3aGljaAotCWFyZSBsb2NhbCB0byBCRkQgdG8gc3RhcnQgd2l0aCBfYmZkX2Vjb2ZmIGluc3RlYWQgb2YganVzdCBlY29mZi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3dhcF90aXJfaW4pOiBDaGFuZ2UgaW5wdXQgYXJndW1lbnQgdG8gY29uc3QuCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBuZXcgYXJndW1lbnRzIHRvIGNvcnJlc3BvbmQgdG8KLQlyZWFkX2RlYnVnX2luZm8gZW50cnkgcG9pbnQgaW4gZWNvZmZfZGVidWdfc3dhcCBzdHJ1Y3R1cmUuCi0JQ2hhbmdlIGFsbCBjYWxscy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF90aXJfaW4sIGVjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3Ci0JZWNvZmZfZGVidWdfc3dhcCBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogVW5kZWZpbmUgUkVBRC4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IEluaXRpYWxpemUgbmV3IGVjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyk6IFVzZSBlY29mZi5vIGFuZAotCWVjb2ZmbGluay5vLgotCShiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpOiBMaWtld2lzZS4KLQkoZWNvZmZfYmlnX3ZlYywgZWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENoZWNrIGZsYXZvdXIgb2Ygc3ViLCBub3QgYWJmZCwKLQl3aGVuIGNvbXB1dGluZyByZWxvYyBzaXplcy4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHRyeSB0byBjb21wdXRlIG1heGltdW0KLQlyZWxvYyBjb3VudCBvciBzaXplIGZvciBhIG5vbi1FTEYgZmlsZS4KLQotCSogbWlwc2JzZC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGhwMzAwaHB1eC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0JKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lOyB1c2VkIGJ5IGFvdXR4LmguCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGFuZ2UgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotCWNhbGxzIHRvIHVzZSBuZXcgcGFyYW1ldGVycy4KLQotRnJpIEp1biAxNyAxNDo0NTozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUgdGV4dCwKLQlkYXRhIGFuZCBic3Mgc2VjdGlvbnMgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBUcmVhdCBhIGNvbW1vbiBzeW1ib2wgZnJvbSBhCi0JZHluYW1pYyBvYmplY3QgYXMgYmVpbmcgaW4gdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LCByYXRoZXIKLQl0aGFuIGFzIGJlaW5nIHVuZGVmaW5lZC4KLQotRnJpIEp1biAxNyAxMToxNjo1MCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChiZmRfaHBwYV9pbnNuMmZtdCwgaHBwYV9yZWJ1aWxkX2luc24pOiBNYWtlIElOTElORS4KLQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGRlY2wuCi0KLVRodSBKdW4gMTYgMjM6MzY6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIHJlYWQgbG9jYWwgc3ltYm9scwotCWlmIHRoZXJlIGFyZW4ndCBhbnkgaW4gdGhlIGlucHV0IGZpbGUuCi0KLVRodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYzogTWFueSBuZXcgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyBmb3IgbGlua2VyCi0Jc3VwcG9ydCBmb3IgTGludXggc2hhcmVkIGxpYnJhcmllcy4KLQkqIGJmZC1pbi5oIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVGh1IEp1biAxNiAxNDoyMzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IElmIHNlY29uZCBhcmd1bWVudCBpcyBgYF8nJywgdGhlbiwgaW5zdGVhZCBvZgotCWVjaG9pbmcgY29uZmlnIGZpbGUgbmFtZSwgZWNobyB3aGV0aGVyIHRhcmdldCB1c2VzIGxlYWRpbmcKLQl1bmRlcnNjb3JlcyBvbiBzeW1ib2wgbmFtZXMuICBBZGQgYXBwcm9wcmlhdGUgc2V0dGluZ3MgdG8KLQlkaWZmZXJlbnQgY2FzZXMuICBVc2VkIGJ5IGJpbnV0aWxzL2NvbmZpZ3VyZS5pbiB0byBzZXQgZGVmYXVsdCBmb3IKLQljKytmaWx0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IElmIHRyeWluZyB0byBnZW5lcmF0ZSBhIHNoYXJlZAotCW9iamVjdCwgd2FybiBhbmQgcmV0dXJuIGZhbHNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFjY2VwdCBCTUFHSUMgb2JqZWN0cwotCWFuZCB0cmVhdCB0aGVtIGFzIE9NQUdJQy4KLQotV2VkIEp1biAxNSAxODowMjoyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRW5hYmxlIHNwYXJjIHY5IHN1cHBvcnQgZm9yIHJlbGVhc2UuICBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhCi0Jd29yayBpbiBwcm9ncmVzcywgcGVuZGluZyByZWxlYXNlIG9mIGFuIEFCSSBzcGVjaWZpY2F0aW9uLgotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmluOiBJbmNsdWRlIHNwYXJjIHY5IGVsZiBjb25maWcuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEhhbmRsZSBzcGFyYyB2OSAoNjQgYml0KS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBOZXcgcmVsb2MgdHlwZXMuCi0JKiBlbGY2NC1zcGFyYy5jOiBJbXBsZW1lbnQgZWxmNjQtc3BhcmMgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYzogVXBkYXRlZC4KLQotV2VkIEp1biAxNSAwMTozNDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCBkdF9uZWVkZWRfbmFtZS4KLQkoZWxmX2R0X25lZWRlZF9uYW1lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKLQlpcyBzZXQsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGZvciB0aGUgRFRfTkVFREVEIGR5bmFtaWMKLQllbnRyeS4KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc2ludGVycHB0cgotCWFyZ3VtZW50LCBhbmQgc2V0IGl0IHRvIHRoZSAuaW50ZXJwIHNlY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogY29mZi1zcGFyYy5jIChTV0FQX09VVF9SRUxPQ19FWFRSQSk6IERlZmluZSB0byBjbGVhciB0aGUgcl9zcGFyZQotCWZpZWxkIG9mIHRoZSByZWxvYyByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIGdhcmJhZ2UuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogUmVjb2duaXplIF9fLlNZTURFRi8gYXMgd2VsbCBhcwotCV9fLlNZTURFRjsgdGhlIGZvcm1lciB3YXMgdXNlZCBpbiBvbGQgTGludXggYXJjaGl2ZXMuICBGcm9tCi0JanJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIGkzODZsaW51eC5jIChpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lOyBsaWtlCi0JTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBpbiBhb3V0LXRhcmdldC5oLCBidXQgc2V0IE1BQ0hUWVBFIHRvCi0JTV8zODYuICBGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBUcmVhdCBOX1NFVFYgc3ltYm9scwotCWFzIE5fREFUQSBzeW1ib2xzLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaDogUmV3cml0ZSBzeW1ib2wgZHVwbGljYXRlIGVsaW1pbmF0aW9uIHRvIHVzZSBCRkQgaGFzaAotCXRhYmxlcy4KLQkoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogUmVtb3ZlLgotCShIQVNITUFYTEVOLCBIQVNIX0NIQVIsIGhhc2gsIGNvbXBhcmUsIGxvZzIsIGVtaXRfc3RydGFiKTogUmVtb3ZlLgotCShzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnksIHN0cnVjdCBzdHJ0YWJfaGFzaCk6IERlZmluZS4KLQkoc3RydGFiX2hhc2hfbmV3ZnVuYywgc3RydGFiX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShzdHJpbmd0YWJfZnJlZSwgZW1pdF9zdHJpbmd0YWIpOiBEZWZpbmUuCi0JKHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiKTogUmV3cml0ZS4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogVXNlIG5ldyBzdHJpbmd0YWIgY29kZS4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvLCBOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMsIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYmZkLWluLmggKEJGRF9UUkFESVRJT05BTF9GT1JNQVQpOiBEZWZpbmUgbmV3IEJGRCBmbGFnIHRvCi0JcmVxdWVzdCBCRkQgdG8gd3JpdGUgb2JqZWN0IGluIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQsIHdoYXRldmVyCi0JdGhhdCBtZWFucyBmb3IgdGhlIHBhcnRpY3VsYXIgYmFja2VuZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IElmIG9ic3RhY2tfYWxsb2MgZmFpbHMsIHNldAotCWJmZF9lcnJvcl9ub19tZW1vcnkuCi0KLVR1ZSBKdW4gMTQgMTM6MDA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBxX21hZ2ljX2Zvcm1hdCB0byBzdWJmb3JtYXQKLQllbnVtLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcyBmdW5jdGlvbgotCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBDb3B5IHN1YmZvcm1hdCBpbmZvcm1hdGlvbi4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIHJhdGhlciB0aGFuIDAuCi0JKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBSZW5hbWUgZnJvbSBmaW5hbF9saW5rX2NhbGxiYWNrLCBhbmQKLQlkZWZpbmUgb25seSBpZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogUmVuYW1lIHVzZSBvZiBmaW5hbF9saW5rX2NhbGxiYWNrIHRvCi0JTVlfZmluYWxfbGlua19jYWxsYmFjay4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSGFuZGxlIFFNQUdJQyBsaWtlCi0JWk1BR0lDLCBidXQgc2V0IHRoZSBzdWJmb3JtYXQgdG8gcV9tYWdpY19mb3JtYXQuICBBYm9ydCBpZiB0aGUKLQltYWdpYyBudW1iZXIgaWYgbm90IHJlY29nbml6ZWQuCi0JKGFkanVzdF96X21hZ2ljKTogVXNlIFFNQUdJQyBpZiBxX21hZ2ljX2Zvcm1hdC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAxLgotCShpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV9iZmRfZmluYWxfbGluayk6IERlZmluZSBhcyBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYm90aCBzZWN0aW9uIGFuZAotCW91dHB1dF9zZWN0aW9uIGFnYWluc3Qgc2VjdGlvbnMgb2YgYWJmZC4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mCi0Jd3JpdHRlbiBmcm9tIGJvb2xlYW4gdG8gY2hhci4gIEFkZCBuZXcgZmllbGQgc21hbGwuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbiB0byAwCi0JcmF0aGVyIHRoYW4gZmFsc2UuICBJbml0aWFsaXplIHNtYWxsIHRvIDAuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIEVDT0ZGIHR5cGUgaXMgc2NTVW5kZWZpbmVkLCBzZXQKLQlzbWFsbC4gIElmIHNtYWxsIGlzIHNldCwgYW5kIGhhc2ggdGFibGUgdHlwZSBpcyBjb21tb24sIGZvcmNlIHRoZQotCXN5bWJvbCBpbnRvIGEgc2VjdGlvbiBuYW1lZCBTQ09NTU9OIGFuZCBjaGFuZ2UgdGhlIEVDT0ZGIHR5cGUgZnJvbQotCXNjQ29tbW9uIHRvIHNjU0NvbW1vbi4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB3cml0dGVuIHRvIDEgcmF0aGVyIHRoYW4gdHJ1ZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IEpNUEFERFIgcmVsb2MKLQlvdmVyZmxvdyBjaGVjayB0byBjb25zaWRlciBzZWN0aW9uIFZNQSBvZiBpbnB1dCBmaWxlLgotCi1Nb24gSnVuIDEzIDE0OjIwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBhCi0JbWFjaGluZSB0eXBlIG9mIDY4MDAwLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHVua25vd24uCi0JU2V0ICp1bmtub3duIHRvIHRydWUgaWYgbWFjaGluZSB0eXBlIGlzIHJlYWxseSB1bmtub3duLCBhcyBvcHBvc2VkCi0JdG8gTV9VTktOT1dOIGZvciB0aGUgNjgwMDAuCi0JKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoYW5nZSBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSBjYWxsCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCXByb3RvdHlwZS4KLQotU3VuIEp1biAxMiAyMDoyMTowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKEVYRUNfQVVYX0lEKTogRGVmaW5lIGJhc2VkIG9uIGF2YWlsYWJsaXR5IG9mIEhQVVhfQVVYX0lECi0Jb3IgSElVWF9BVVhfSUQuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogVXNlIEVYRUNfQVVYX0lEIGluc3RlYWQgb2YgSFBVWF9BVVhfSUQuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSBDUFVfUEFfUklTQzFfMCBhcyB0aGUgbWFnaWMgbnVtYmVyLiAgTm90ZQotCXNvbS5jIGlzIGNhcmVmdWwgdG8gYWx3YXlzIGRlZmluZSBDUFVfUEFfUklTQzFfMC4KLQotU2F0IEp1biAxMSAxNjozMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXR4LmggKHN5bV9pbl90ZXh0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKHN5bV9pbl9kYXRhX3NlY3Rpb24sIHN5bV9pbl9ic3Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShzeW1faXNfdW5kZWZpbmVkLCBzeW1faXNfZ2xvYmFsX2RlZm4pOiBMaWtld2lzZS4KLQkoc3ltX2lzX2RlYnVnZ2VyX2luZm8sIHN5bV9pc19mb3J0cmFuY29tbW9uKTogTGlrZXdpc2UuCi0JKHN5bV9pc19hYnNvbHV0ZSwgc3ltX2lzX2luZGlyZWN0KTogTGlrZXdpc2UuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXdyaXRlIGZvciBjbGFyaXR5LiAgUmVhcnJhbmdlCi0JYXJndW1lbnRzIGFuZCBjaGFuZ2UgY2FsbGVyLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBEb24ndCBpZ25vcmUgd2VhayBzeW1ib2xzLiAgUHVsbAotCW9iamVjdCBpbiBmcm9tIGFyY2hpdmUgaWYgYSB3ZWFrIGRlZmludGlvbiBpcyBmb3VuZCBmb3IgYW4KLQlleGlzdGluZyB1bmRlZmluZWQgc3ltYm9sLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgYWxsIGNhc2VzIGluIHN3aXRjaC4gIFNldCBmbGFncyBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgdG8gMC4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgSnVuIDEwIDEzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBIYW5kbGUgLmJzcyBzZWN0aW9uLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ19DVE9SLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCBhc3N1bWUKLQl0aGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IE5VTEwuCi0KLVdlZCBKdW4gIDggMjM6MTU6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgU2V0IEVYRUNfUCBhbmQgc3RhcnQgYWRkcmVzcyBmb3IgR0RCLgotCi1XZWQgSnVuICA4IDIzOjU3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IHRyeSB0byByZWFkIHRoZQotCXN0cmluZ3MgaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBVc2UgdGhlIG91dHB1dCBzZWN0aW9uIHdoZW4KLQl3b3JraW5nIG91dCB0aGUgdHlwZS4KLQotVHVlIEp1biAgNyAxMzoyNTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFB1dCBzaHN0cnRhYiwgc3ltdGFiIGFuZAotCXN0cnRhYiBzZWN0aW9ucyBhdCBlbmQgb2YgZmlsZS4gIEF2b2lkcyBidWcgaW4gc29tZSB2ZXJzaW9ucyBvZgotCVNWUjQgc3RyaXAuICBGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbD4uCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMgZGVmaW5lZCwKLQlzZXQgU0VDX0RFQlVHR0lORyBmb3IgU1RZUF9JTkZPIHNlY3Rpb25zLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfUEFHRV9TSVpFIGlzCi0JZGVmaW5lZCwgYW5kIERfUEFHRUQgaXMgc2V0LCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gZXF1YWwgdG8gdGhlCi0Jc2VjdGlvbiBWTUEgbW9kdWxvIENPRkZfUEFHRV9TSVpFLgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBJZiBGX0VYRUMgaXMgc2V0LCBzZXQgRF9QQUdFRC4KLQkqIGNvZmYtaTM4Ni5jOiBTZXQgRF9QQUdFRCBpbiBCRkQgdGFyZ2V0LgotCShDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgotCi1Nb24gSnVuICA2IDEwOjU3OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCB0dXJuIGEgcmVsb2Mgc2VjdGlvbgotCWludG8gYSBCRkQgc2VjdGlvbiBqdXN0IGJlY2F1c2UgU0hGX0FMTE9DIGlzIHNldDsgcmVxdWlyZSB0aGF0IGl0Ci0Jbm90IHVzZSB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JQmV0dGVyIGluZGlyZWN0IGFuZCB3YXJuaW5nIHN5bWJvbCBoYW5kbGluZyBpbnNwaXJlZCBieSBTdHVhcnQKLQlRdWljayA8c3R1Y2tAY3MubWFuLmFjLnVrPi4KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIFJFRiwgTUlORCwgQ1dBUk4sIFJFRkMuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIFVOREVGX1JPVy9kZWYgYW5kIFVOREVGV19ST1cvZGVmIGZyb20gTk9BQ1QKLQl0byBSRUYuICBDaGFuZ2UgVU5ERUZfUk9XL2luZHIgYW5kIFVOREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvCi0JUkVGQy4gIENoYW5nZSBERUZfUk9XL2luZHIgYW5kIENPTU1PTl9ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE1ERUYuCi0JQ2hhbmdlIERFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0byBOT0FDVC4gIENoYW5nZSBJTkRSX1JPVy9pbmRyCi0JZnJvbSBNREVGIHRvIE1JTkQuICBDaGFuZ2UgSU5EUl9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFLgotCUNoYW5nZSBXQVJOX1JPVy9kZWYgYW5kIFdBUk5fUk9XL2luZHIgZnJvbSBNV0FSTiB0byBDV0FSTi4gIENoYW5nZQotCVdBUk5fUk9XL2NvbSBmcm9tIE1XQVJOIHRvIFdBUk4uICBDaGFuZ2UgV0FSTl9ST1cvd2FybiBmcm9tIE5PQUNUCi0JdG8gQ1lDTEUuICBDaGFuZ2UgU0VUX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEU+Ci0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSGFuZGxlIFJFRiwgTUlORCwgQ1dBUk4gYW5kCi0JUkVGQy4gIElmIGEgbmV3IGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCBwdXNoIHRoZQotCXJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLiAgRkl4IGhhbmRsaW5nIG9mIFdBUk4uCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogSWYgTl9XQVJOSU5HLCBkb24ndAotCWNsb2JiZXIgZV90eXBlIG9mIG5leHQgc3ltYm9sLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IExvb3Agb24gYmZkX2xpbmtfaGFzaF93YXJuaW5nIGFzIHdlbGwKLQlhcyBiZmRfbGlua19oYXNoX2luZGlyZWN0LgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiB1c2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgd3JpdHRlbi4KLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgbmV3IHRkYXRhIGxpbmtlcgotCWZpZWxkLCByYXRoZXIgdGhhbiBvdXRzeW1ib2xzIGJlaW5nIG5vbi1OVUxMLCB0byBkZWNpZGUgd2hldGhlciB0bwotCW91dHB1dCB0aGUgc3ltYm9scyBhbmQgcmVsb2NzLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCBuZXcgdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0cnkgdG8gY29weQotCWRhdGEgdG8gYSBub24tRUNPRkYgZmlsZS4KLQotCSogbGliYmZkLWluLmg6IEFkZCB3YXJuaW5nIHRoYXQgbGliYmZkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TdW4gSnVuICA1IDE1OjAyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBFTEYgc3RyaXAgYW5kIG9iamNvcHkgb24gZHluYW1pY2FsbHkgbGlua2VkCi0JZmlsZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWRkIHByb3RvdHlwZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gU0hUX0hBU0gKLQlzZWN0aW9uLCBhbmQgZnJvbSBhbiBTSFRfRFlOU1lNIHNlY3Rpb24sIGFuZCBmcm9tIHRoZSBkeW5hbWljCi0Jc3RyaW5nIHRhYmxlIHNlY3Rpb24uCi0JKGVsZl9vYmplY3RfcCk6IFNldCBEX1BBR0VEIGlmIHRoZXJlIGlzIGEgcHJvZ3JhbSBoZWFkZXIuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogUmVtb3ZlLgotCShmaXhfdXBfc3RydGFicyk6IFJlbW92ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfZW50c2l6ZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9saW5rIGFuZCBzaF9pbmZvCi0JZm9yIGFsbCBzZWN0aW9ucy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBEb24ndCBjYWxsIG9ic29sZXRlCi0JZnVuY3Rpb25zIGVsZl9tYWtlX3NlY3Rpb25zIG9yIGZpeF91cF9zdHJ0YWJzLgotCShzd2FwX291dF9zeW1zKTogU2V0IHNoX2FkZHJhbGlnbiB0byBGSUxFX0FMSUdOIHJhdGhlciB0aGFuIDQuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGVybWl0IHdyaXRpbmcgRFlOQU1JQwotCW9iamVjdHMuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUcmVhdCBTSFRfRFlOU1lNIGxpa2Ugb3RoZXIgbm9ybWFsCi0Jc2VjdGlvbnMuICBJZiBhbiBTSFRfUkVMIG9yIFNIVF9SRUxBIHNlY3Rpb24gaXMgYWxsb2NhdGVkIG9yIHVzZXMKLQlhbiB1bnVzdWFsIHN5bWJvbCB0YWJsZSwgcGVybWl0IGEgQkZEIHNlY3Rpb24gdG8gbWFwIHRvIGl0LgotCVBlcm1pdCBtb3N0IFNIVF9TVFJUQUIgc2VjdGlvbnMgdG8gaGF2ZSBhIEJGRCBzZWN0aW9uIG1hcHBlZCB0bwotCXRoZW0uCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzaF9saW5rLCBzaF9pbmZvIG9yIHNoX2VudHNpemUKLQlmaWVsZHMgb2YgZHluYW1pYyBzZWN0aW9ucyBoZXJlOyBkbyBpdCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBBZGQgRF9QQUdFRCB0byBwZXJtaXR0ZWQgb2JqZWN0Ci0JZmxhZ3MuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgaWYKLQlTRUNfTE9BRCBpcyBzZXQsIHJhdGhlciB0aGFuIGNoZWNraW5nIFNFQ19BTExPQy4KLQotCSogbGliYmZkLWluLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCi0KLUZyaSBKdW4gIDMgMTA6NTg6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSB0aGUgZmlsZSBoZWFkZXIncwotCWNoZWNrc3VtIGhlcmUuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCi0JKiBsaWJiZmQuaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KLQotVGh1IEp1biAgMiAxNzozOToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogSW5jbHVkZSA8c3RkbGliLmg+LiAgRG9uJ3QgZGVjbGFyZSBmcmVlLCBleGl0IG9yCi0JZ2V0ZW52LgotCi0JQWRkIGxpbmtlciBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCSogc3Vub3MuYzogSW5jbHVkZSBiZmRsaW5rLmguICBBZGQgbWFueSBuZXcgZnVuY3Rpb25zIGFuZAotCWRlZmluaXRpb25zIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCSogYmZkLWluLmggKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIHRvIGxpYmFvdXQuaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBSZW5hbWUgZnJvbSBhb3V0X2xpbmtfaGFzaF9uZXdmdW5jCi0JYW5kIG1ha2UgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBDYWxsCi0JTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSwgbm90IF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGZhaWwgaWYgbm8gc3ltYm9scy4gIElmIGl0IGV4aXN0cywKLQljYWxsIGFkZF9keW5hbWljX3N5bWJvbHMgYmFja2VuZCBlbnRyeSBwb2ludCBmb3IgZHluYW1pYyBvYmplY3RzLgotCVVzZSBhZGRfb25lX3N5bWJvbCBiYWNrZW5kIGVudHJ5IHBvaW50IGlmIGl0IGV4aXN0cy4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2FsbCBmaW5pc2hfZHluYW1pY19saW5rIGJhY2tlbmQgZW50cnkKLQlwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRm9yIGEgZHluYW1pYyBvYmplY3QsIGNhbGwKLQlsaW5rX2R5bmFtaWNfb2JqZWN0IGJhY2tlbmQgZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENhbGwgd3JpdGVfZHluYW1pY19zeW1ib2wgYmFja2VuZAotCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgcmVhZCB0aGUgcmVsb2NzIGlmIHRoZXkgaGF2ZQotCWFscmVhZHkgYmVlbiByZWFkLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgZm9yIGEKLQlyZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgY2FsbCBjaGVja19keW5hbWljX3JlbG9jIGJhY2tlbmQKLQllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gIEluY2x1ZGUKLQliZmRsaW5rLmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgaW4gZnJvbSBhb3V0eC5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBhZGRfZHluYW1pY19zeW1ib2xzLAotCWFkZF9vbmVfc3ltYm9sLCBsaW5rX2R5bmFtaWNfb2JqZWN0LCB3cml0ZV9keW5hbWljX3N5bWJvbCwKLQljaGVja19keW5hbWljX3JlbG9jLCBhbmQgZmluaXNoX2R5bmFtaWNfbGluay4KLQkoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShhb3V0X3NlY3Rpb25fZGF0YSk6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogRGVjbGFyZS4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgYW91dF9iYWNrZW5kX2RhdGEKLQlmaWVsZHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHplcm8gb3V0IGNhY2hlZAotCXVudGlsIHdlIGtub3cgaXQgaXMgbm9uLU5VTEwuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3Qgc2tpcCBhIHdhcm5pbmcgc3ltYm9sIGV2ZW4gaWYgaXQKLQloYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LiAgSWYgc2tpcHBpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLAotCXNraXAgdGhlIG5leHQgc3ltYm9sIGFzIHdlbGwuCi0KLVdlZCBKdW4gIDEgMTQ6Mzc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IERvbid0IGRlY2xhcmUgcXNvcnQsIG1hbGxvYyBvciByZWFsbG9jLgotCi1UaHUgTWF5IDI2IDEzOjU2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBDYXN0IGJmZF9ieXRlIHBvaW50ZXIKLQl0byBjaGFyIHBvaW50ZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBzcGFjZXMgYmVmb3JlIGNvbG9ucy4KLQotCU1lcmdlZCBjaGFuZ2VzIGJhY2sgaW4gZnJvbSBGU0YgZ2FzIHJlbGVhc2UgMi4zOgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFdyYXAgYGlmJyBibG9jayBhcm91bmQgZ3JlcAotCWludm9jYXRpb24sIHRvIGF2b2lkIGEgYnVnIGluIEJTRCA0LjQgbWFrZS4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGFuCi0JZXJyb3IuCi0JKG1pcHNfZml4X2hpMTZfcyk6IERpdHRvLgotCi0JRnJpIE1heSAxMyAyMToyMTowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogZGVmaW5lIGEgZGVmYXVsdCB0YXJnZXQsIG9yIGFyY2hpdmVzIHdvbid0IHdvcmsKLQkgIGR1ZSB0byBtdWx0aXBsZSBtYXRjaGVzLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCi0JKiBtYWtlZmlsZS5kb3M6IHVwZGF0ZSBmb3IgY29ycmVjdCB0YXJnZXRzIGFuZCBzb3VyY2VzCi0JKiBjb2ZmLWdvMzIuYzogW25ld10gZ28zMidzIENPRkYgZm9ybWF0IChpMzg2Y29mZiB3aXRoIHVuZGVyc2NvcmVzKQotCSogdGFyZ2V0cy5jOiBhZGQgZ28zMmNvZmYgdGFyZ2V0Ci0JKiBtYWtlZmlsZS5pbjogYWRkIGNvZmYtZ28zMi5jIHN1cHBvcnQKLQotVGh1IE1heSAyNiAxMDoxMDoyMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBEbyBub3Qgc2V0IHRoZSBzeXN0ZW1faWQgaGVyZSwgcHJpdmF0ZQotCWJmZCBkYXRhIGhhcyBub3QgYmVlbiBjb3BpZWQgeWV0LgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQotVHVlIE1heSAyNCAxNjoxNzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlNYWtlIE1JUFMgRUxGIHVzZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyLiAgTm8gc2hhcmVkIGxpYnJhcnkKLQlzdXBwb3J0IHlldC4KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX29iamVjdF9wKTogSWYgbGFzdCBzeW1ib2wgaXMgTE9DQUwsIHNldCBlbGZfYmFkX3N5bXRhYi4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9pbmZvIGZpZWxkIGZvciAuZ3B0YWIuKgotCXNlY3Rpb25zLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2VudHNpemUgZm9yIC5ncHRhYi4qIHNlY3Rpb25zLgotCShtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGFuZCBmcmVlIGV4dGVybmFsIHN5bWJvbHMgbGFzdCwKLQlub3QgZmlyc3QsIGZvciBjbGFyaXR5LgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfZ2V0X2V4dHIsIG1pcHNfZWxmX3NldF9pbmRleCk6IFJlbW92ZS4KLQkobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdwdGFiX2NvbXBhcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLCBhbmQgdG8KLQltZXJnZSBncHRhYiBpbmZvcm1hdGlvbiBpbiBpbnB1dCBmaWxlcy4KLQkobWlwc19lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUgYXMgbWFjcm8gYmVmb3JlCi0JaW5jbHVkaW5nIGVsZjMyLXRhcmdldC5oLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KLQllbGZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBjYWxsZXIuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZQotCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIG5ldyBmaWVsZCBiYWRfc3ltdGFiLgotCShlbGZfYmFkX3N5bXRhYik6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KLQkoX2Jld19lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDYWxsIGJhY2tlbmQgb2JqZWN0X3AgaG9vayBhZnRlcgotCXN3YXBwaW5nIGluIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvcnJlY3QgdHlwbzogSW50ZXJuYWwgZm9yIEV4dGVybmFsLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsCi0JdGhlIHN5bWJvbHMuICBTa2lwIFNUQl9MT0NBTCBzeW1ib2xzIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCBhbGxvY2F0ZSBzcGFjZSBmb3IKLQlhbGwgc3ltYm9scywgbm90IGp1c3QgbG9jYWxzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBza2lwIGEgc3ltYm9sIG5vdCBtZW50aW9uZWQgYnkgYQotCXJlZ3VsYXIgZmlsZSBpZiBpdCBpcyBtZW50aW9uZWQgYnkgYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbCB0aGUKLQlzeW1ib2xzLgotCi1GcmkgTWF5IDIwIDEzOjM4OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogRG8gbm90IHNldCBhbnkgcmVsb2NhdGlvbiBpbmZvCi0JZm9yIFNPTSBmaXh1cHMgd2hpY2ggYXJlIG5ldmVyIHBhc3NlZCB0byBCRkQuCi0KLUZyaSBNYXkgMjAgMTE6NTc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIE1JUFNfUl9KTVBBRERSIG92ZXJmbG93Ci0JY2hlY2tpbmcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIERUX0RFQlVHIHRvCi0JdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGRlYnVnZ2VyLgotCUZyb20gUGV0ZXIgU2NoYXVlci4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KLQljb2RlIHJlcGVhdGVkIHRocmVlIHRpbWVzIGluIGJmZF9zZWN0aW9uX2Zyb21fc2hkciBpbiBlbGZjb2RlLmguCi0JKiBsaWJlbGYuaCAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KLQlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMuICBJZiBhCi0JcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlLCBvciBpdCBpcyBwYXJ0IG9mCi0JdGhlIHByb2Nlc3MgaW1hZ2UsIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24sIG5vdCByZWxvY3MuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0KLVRodSBNYXkgMTkgMTE6Mzc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IENoYW5nZSBhcl9tYXhfbmFtZWxlbiB2YWx1ZSBmcm9tCi0JMTUgdG8gMTQgdG8gbWF0Y2ggU1ZSNCBhci4KLQotCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4gIExvb3NlbHkgYmFzZWQgb24gd29yayBieQotCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkcyBmb3IgZHluYW1pYwotCWxpbmtpbmc6IGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCWVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLQllbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0JZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mIGFsaWduIGZpZWxkIHRvCi0JYmZkX3NpemVfdHlwZS4gIEFkZCBmaWVsZHMgZHluaW5keCwgZHluc3RyX2luZGV4LCB3ZWFrZGVmLAotCWVsZl9saW5rX2hhc2hfZmxhZ3MuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkcyBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciwgYnVja2V0Y291bnQuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4sIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luLCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoRWxmX0V4dGVybmFsX0R5bik6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRS4gIE1ha2UgZXh0ZXJuYWxseQotCXZpc2libGUuCi0JKGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZHluX2luLCBlbGZfc3dhcF9keW5fb3V0KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUKLQlhbmQgYXMgbmV3IGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2VjdGlvbiB0eXBlIG9mIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlzZWN0aW9uIG5hbWVzLgotCShlbGZfd3JpdGVfcGhkcnMpOiBSZW1vdmUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWRkIG5ldyBhbGlnbiBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogUmVtb3ZlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBDb21wbGV0ZWx5IHJld3JpdGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3Qgc2V0IGEgZmlsZSBwb3NpdGlvbiBmb3IKLQlzZWN0aW9ucyB3aGljaCBhbHJlYWR5IGhhdmUgb25lLiAgRG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBmaWxlCi0JcG9zaXRpb24gaGVyZS4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEhhbmRsZSBTSFRfSEFTSCBhbmQgU0hUX0RZTkFNSUMKLQlzZWN0aW9uIHR5cGVzLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGZhaWxzLCBqdXN0Ci0JdXNlIGJmZF9hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCi0JKGVsZl9zaXplb2ZfaGVhZGVycyk6IE1ha2UgdXNlZnVsLgotCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgZHluYW1pYyBvYmplY3RzLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9hZGRfZHluYW1pY19lbnRyeSk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FIGFuZCBhcyBuZXcKLQlleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2J1Y2tldHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZHluc3ltX3NlYyBhbmQgaGFzaF9zZWMgZmllbGRzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBIYW5kbGUgZHluYW1pYyBsaW5raW5nLiAgQ3JlYXRlIGEgc2VjdGlvbgotCXN5bWJvbCBmb3IgYWxsIEVMRiBzZWN0aW9ucywgbm90IGFsbCBCRkQgc2VjdGlvbnMuICBTdG9yZSBzZWN0aW9uCi0Jc3ltYm9sIGluZGV4IGluIHRhcmdldF9pbmRleCBmaWVsZCwgbm90IGluZGV4IGZpZWxkLiAgVHJhdmVyc2UKLQlvdmVyIGdsb2JhbCBzeW1ib2xzIGV2ZW4gaWYgc3RyaXBwaW5nLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT3V0cHV0IGR5bmFtaWMgc3ltYm9scy4gIE1hcmsgc3ltYm9scwotCWRlZmluZWQgYnkgZHluYW1pYyBvYmplY3RzIGFzIHVuZGVmaW5lZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWdub3JlIGR5bmFtaWMgb2JqZWN0cy4gIFVzZSB0YXJnZXRfaW5kZXgKLQlmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsIGFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFVzZSB0YXJnZXRfaW5kZXggZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLAotCWFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCSogZWxmLmMgKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZHluaW5keCwgZHluc3RyX2luZGV4LAotCXdlYWtkZWYgYW5kIGVsZl9saW5rX2hhc2hfZmxhZ3MgZmllbGRzLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciBhbmQgYnVja2V0Y291bnQgZmllbGRzLgotCSogZWxmMzItdGFyZ2V0Lmg6IEluaXRpYWxpemUgbmV3IGR5bmFtaWMgbGlua2luZyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuICAKLQkqIGVsZjMyLWkzODYuYzogTmV3IGZ1bmN0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuCi0JKiBlbGYzMi1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgTWF5IDE4IDA4OjI5OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc29tLmM6IERvbid0IGluY2x1ZGUgPHN5cy9kaXIuaD4gb3IgPHN5cy91c2VyLmg+LgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IENhbGwgbWVtY21wIGluc3RlYWQgb2YgYmNtcC4KLQkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCB0byBiZmQgKi4KLQkoY29tcGFyZV9zeW1zKTogQ2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB0byBjb25zdCB2b2lkICouCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIGZvdW5kLgotCShzb21fd3JpdGVfYXJtYXApOiBBZGQgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQgYW5kIGludCBhcmd1bWVudHMuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSAlbGQgYW5kIGNhc3QgdG8gbG9uZyBmb3IgZ2V0dWlkIHJlc3VsdC4KLQotV2VkIE1heSAxOCAwOTowOTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIGFic29sdXRlIGNhbGxzLgotCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRGVsZXRlIGNvbXBsZXggcmVsb2NhdGlvbiB0eXBlcy4KLQotVHVlIE1heSAxNyAxOTozMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYywgaWNvZmZfYmlnX3ZlYyk6IEluZGljYXRlIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEludGVsIHRvb2wgY2hhaW4gKGdudTk2MHYyKS4KLQotTW9uIE1heSAxNiAxMDowOToyMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1ocHBhLmM6IENoYW5nZSAuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicywKLQlsaWtld2lzZSBmb3Igb3RoZXIgUEEgc3BlY2lmaWMgc2VjdGlvbnMuCi0JKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKLQlmdW5jdGlvbi4KLQkoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBDb21wbGV0ZWx5IG5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMgotCWRyYWZ0IFBBIEVMRiBzcGVjLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyBhcHByb3ByaWF0ZWx5Ci0JdGhyb3VnaG91dCBlbGYzMi1ocHBhLmMKLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBSZXdyaXRlIGFuZCBzaW1wbGlmeSBiYXNlZCBvbiA5NC0wMi0wMgotCXNwZWMuCi0JKGhwcGFfZWxmX3JlbG9jKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlCi0JKEVMRl9NQUNISU5FX0NPREUpOiBDaGFuZ2UgdG8gRU1fUEFSSVNDLgotCSogZWxmMzItaHBwYS5oOiBJbmNsdWRlICJlbGYvaHBwYS5oIi4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgCi0JYXBwcm9wcmlhdGVseSB0aHJvdWdob3V0IGVsZjMyLWhwcGEuaC4KLQkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogTmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyIGRyYWZ0IFBBIEVMRgotCXNwZWMuCi0JKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgqLCBSX0hQUEFfVU5XSU5EKTogRGVsZXRlIGRlZmluaXRpb25zLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUEFSSVNDIGluc3RlYWQgb2YgRU1fSFBQQS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBEZWxldGUgdW51c2VkIEhQUEEgcmVsb2NhdGlvbnMuCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KLQotCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IEF2b2lkIGFkZGluZyBjb25zdGFudF92YWx1ZSBpbnRvCi0JdGhlIGZpbmFsIHZhbHVlIHR3aWNlIGZvciBMUiBhbmQgUlIgZmllbGQgc2VsZWN0b3JzLgotCi1TYXQgTWF5IDE0IDA5OjA5OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogVXNlIEJGRF9BU1NFUlQgbm90IGFzc2VydC4gIFRoaXMKLQlhdm9pZHMgX19lcHJpbnRmIHRyb3VibGVzLgotCi1GcmkgTWF5IDEzIDEwOjUxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0KLQkqIGNvbmZpZy9taXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgZWNvZmZfYmlnX3ZlYyBhbmQKLQllY29mZl9saXR0bGVfdmVjIHNpbmNlIElyaXggNSBzdXBwb3J0cyBFQ09GRiBleGVjdXRhYmxlcy4KLQotV2VkIE1heSAxMSAwMDozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIGZkci5hZHIgIT0gcGRyLmFkcgotCWNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBVc2UgfHwgaW5zdGVhZCBvZiA7IHRvIGZvcmNlIFN1bk9TCi0JbWFrZSB0byBpbnZva2UgdGhlIHNoZWxsLgotCi1UdWUgTWF5IDEwIDE0OjIzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTRUNfQ09GRl9TSEFSRURfTElCUkFSWSk6IFJlbmFtZWQgZnJvbQotCVNFQ19TSEFSRURfTElCUkFSWSBmb3IgY2xhcml0eS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIGlzCi0Jc2V0LCBzZXQgU1RZUF9OT0xPQUQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IERvbid0IGdldCBhbiBhc3NlcnRpb24KLQlmYWlsdXJlIGJlY2F1c2Ugb2YgYSBiYWQgc2hhcmVkIGxpYnJhcnkuCi0KLU1vbiBNYXkgIDkgMTg6NTM6NDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkIG1pc3NpbmcgY29tbWVudCB0ZXJtaW5hdG9yLgotCi1Nb24gTWF5ICA5IDExOjUzOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgaGFzaHAgYW5kICpoYXNocAotCWFyZSBub3QgTlVMTCwgYXNzdW1lIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwIHRoZSBzeW1ib2wKLQlpbiB0aGUgaGFzaCB0YWJsZSBhbmQgaGFzIHN0b3JlZCB0aGUgZW50cnkgaW4gKmhhc2hwLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2V0IGggdG8gTlVMTCBiZWZvcmUgY2FsbGluZwotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCi0JcGFnZSBzaGFyZWQgYmV0d2VlbiAuZGF0YSBhbmQgLmJzcyBzZWdtZW50cyB0byBjb250YWluIHplcm9lcy4KLQotCSogZWxmY29kZS5oOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZGVkIHNldmVyYWwgbmV3IGZ1bmN0aW9ucyB0byBkbwotCWxpbmtpbmcuCi0JKEVMRl9SX1RZUEUpOiBEZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RydGFiKTogUmV0dXJuIHVuc2lnbmVkIGxvbmcuICBDaGFuZ2UgY2hlY2sgZm9yCi0JcmVhbGxvYyBmYWlsdXJlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBsaW5rX2luZm8gYXJndW1lbnQuCi0JQ2FsbCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2sgYW5kIHByZXBfaGVhZGVycwotCWhlcmUuICBPbmx5IGNhbGwgc3dhcF9vdXRfc3ltcyBpZiBsaW5rX2luZm8gaXMgTlVMTC4gIFNldCB1cAotCS5zaHN0cnRhYiBzZWN0aW9uIGhlcmUuICBQYXNzIGRvc3ltcyBhcmd1bWVudCB0bwotCWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmxhZy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBZGQgZG9zeW1zCi0JYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gY29udHJvbCBzZXR0aW5nIC5zeW10YWIgYW5kIC5zdHJ0YWIgZmlsZQotCXBvc2l0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBZGQgZG9zeW1zIGFyZ3VtZW50LCBhbmQKLQlwYXNzIGl0IG9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCi0JKHN3YXBfb3V0X3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCB1cCAuc2hzdHJ0YWIgaGVyZS4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTb21lIGNhbGxzIG1vdmVkIGludG8KLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNITl9MT1JFU0VSViBjb3JyZWN0ZWQgdG8gU0hOX0xPUkVTRVJWRS4KLQkqIGxpYmVsZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGNvbGxlY3QsCi0JZWxmX2FkZF9zeW1ib2xfaG9vaywgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbi4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIHJlbF9oYXNoZXMuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIGZpZWxkcyBpbnRlcm5hbF9zeW1zIGFuZCBzeW1ib2xzLgotCUFkZCBmaWVsZCBzeW1faGFzaGVzLgotCShvYmpfc3ltYm9scywgb2JqX2ludGVybmFsX3N5bXMpOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0JKGVsZl9zeW1faGFzaGVzKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShlbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShlbGZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBlbGYuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgbm90IGRlZmluZWQsCi0JZGVmaW5lIGFzIDAgYW5kIHVzZSBnZW5lcmljIGxpbmtlci4gIE90aGVyd2lzZSwgdXNlIEVMRiBiYWNrZW5kCi0JbGlua2VyLgotCShlbGZfYmFja2VuZF9jb2xsZWN0KTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBmYWxzZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyLXRhcmdldC5oLgotCSogZWxmMzItaTM4Ni5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfaW5mb190b19ob3d0byk6IENoYW5nZSB0eXBlIG9mIGRzdCBmcm9tIEVsZjMyX0ludGVybmFsX1JlbGEKLQl0byBFbGZfSW50ZXJuYWxfUmVsYSAodGhleSdyZSB0aGUgc2FtZSB0eXBlIGFueWhvdykuCi0JKGVsZl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9jb2xsZWN0KTogRGVmaW5lLgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IEF2b2lkIHVzZWxlc3MgbWFrZSBlcnJvciBtZXNzYWdlIGluIGEKLQlkaWZmZXJlbnQgd2F5OyB0b3VjaCB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgTWF5ICA2IDEzOjM0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFJld29yayBjdXN0b20gaGVhZGVyCi0JaGFuZGxpbmcgZm9yIGxhdGVzdCBzdWdnZXN0ZWQgZm9ybWF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBMaWtld2lzZS4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCi1GcmkgTWF5ICA2IDExOjExOjUwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBlcnJpY3Nzb24gY29uZmlnIChmb3IgT1NFKS4KLQotVGh1IE1heSAgNSAxNTo0MDo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19maXhfaGkxNl9zKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbi4KLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBDYWxsIG1pcHNfZml4X2ptcF9hZGRyIGZvciBNSVBTX1JFTE9DX0pNUC4KLQotRnJpIE1heSAgNiAxMTo0ODo1NSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogWFggc3VwcG9ydC4KLQotCUZyb20gYmlsbAotCSogTWFrZWZpbGUuaW46IEJ1aWxkIHN5c2RlcC5oIHdpdGhvdXQgY2F1c2luZyB3b3JyeWluZyBidXQKLQloYXJtbGVzcyBlcnJvciBtZXNzYWdlLgotCi1XZWQgTWF5ICA0IDExOjA5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCUNoYW5nZWQgbTY4ay1hb3V0IHRvIHNldCBmbGFncyB0byAwOyBtNjhrLXN1bm9zIHN0aWxsIHVzZXMgMS4KLQkqIGFvdXQwLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChhb3V0MF9iaWdfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYW91dDBfYmlnX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1hb3V0Kik6IFVzZSBtNjhrLTBhb3V0LCBub3QgbTY4ay1hb3V0LgotCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmVkLgotCSogY29uZmlnL202OGstMGFvdXQubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChhb3V0MF9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I6IHVzZSBhb3V0MC5vLAotCWFvdXQzMi5vIGFuZCBzdGFiLXN5bXMuby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dDAuby4KLQkoQ0ZJTEVTKTogQWRkIGFvdXQwLmMuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkIGV4ZWNfaGRyX2ZsYWdzLgotCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JTVkoYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKGFvdXQzMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZAotCWluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXQtZW5jYXAuYyAoZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20KLQliYWNrZW5kIGluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURS4KLQkqIGhwMzAwaHB1eC5jIChNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyAweDIuCi0JKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQKLQlmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KLQkoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0KLVdlZCBNYXkgIDQgMDI6NTY6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGkzODYtKi1nbnUqKTogVHJlYXQgbGlrZSBpMzg2LSotbWFjaCouCi0JKG02OCotYXBvbGxvLSopOiBUcmVhdCBhbGwgQXBvbGxvIGNvbmZpZ3MgdGhlIHNhbWUsIGRvbid0IGhhbmRsZQotCUJTRCBzcGVjaWFsbHkuCi0KLVR1ZSBNYXkgIDMgMTk6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjYWNoZS5jOiBSZXdyb3RlIHRvIHdvcmsgY29ycmVjdGx5LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZmRvcGVucik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEFwciAyOSAxNTowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcyBieQotCWVudW1lcmF0aW5nIHRoZW0sIHNpbmNlIHRoZSByZWxvYyB0eXBlIGNhbiBub3Qgc2VydmUgYXMgYW4gaW5kZXgKLQlpbnRvIHRoZSBtNjhrIENPRkYgaG93dG9fdGFibGUuCi0KLUZyaSBBcHIgMjkgMDk6NDI6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy5iZmQgKCotZ28zMik6IENoYW5nZWQgdG8gY29mZi4KLQkqIGNvZmYtaDgzMDAuYyAoSk1QTDEpOiBHZXQgSE9XVE8gcmlnaHQgZm9yIDI0Yml0IGJyYW5jaGVzLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0Jc3ltYm9scyBhbmQgZG9uJ3Qgc3RpY2sgaW4gZXh0cmEgbnVsbHMuCi0KLVR1ZSBBcHIgMjYgMTU6MDc6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjZi1zcGFyY2x5bnguYyAoTFlOWE9TLCBDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCSogY29mZi1zcGFyYy5jIChCQURNQUcpOiBSZWNvZ25pemUgTFlOWENPRkZNQUdJQy4KLQkoQ09GRl9TUEFSQyk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIENPRkZfU1BBUkMsIHNldCBhbGlnbm1lbnQKLQlwb3dlciBvZiBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gMy4KLQkqIGhvc3RzL2x5bnguaCAoX19MWU5YT1MpOiBEZWZpbmUuCi0KLVR1ZSBBcHIgMjYgMTU6MDQ6MjYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBBZGp1c3QgdGhlIGFkZGVuZCBvZiByZWxvY2F0aW9ucwotCWFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIHRvIGF2b2lkIGxvc2luZyBkdXJpbmcgbGQgLXIuCi0KLVR1ZSBBcHIgMjYgMTI6MTY6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNoc3RydGFiX2xlbmd0aF9maXhlZCk6IFJlbW92ZSB1c2VsZXNzIHN0YXRpYwotCXZhcmlhYmxlLgotCShzdHJ1Y3QgZWxmX3NlY3RfZGF0YSk6IFJlbW92ZSB1bnVzZWQgc3RydWN0dXJlLgotCShlbGZfb2JqZWN0X3ApOiBGcmVlIG1lbW9yeSBpZiBlcnJvciBvY2N1cnMuICBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgSWYgZWxmX2dldF9zdHJfc2VjdGlvbiBmYWlscywKLQlwcmVzZXJ2ZSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHNldHRpbmcgd3JvbmdfZm9ybWF0LgotCShudWxsX3NoZHIpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmVtb3ZlIHNoc3RydGFiX2xlbmd0aF9maXhlZCBhc3NpZ25tZW50LgotCUFsbG9jYXRlIGZpcnN0IHNlY3Rpb24gaGVhZGVyIG9uIEJGRCBvYnN0YWNrIHJhdGhlciB0aGFuIHVzaW5nCi0JbnVsbF9zaGRyLgotCShiZmRfcHJwc2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG5ld3NlY3QuCi0KLU1vbiBBcHIgMjUgMTU6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IFVuZG8gcGF0Y2ggb2YgQXByIDEwOyBicmVha3MgU29sYXJpcy4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQl0byBjcmVhdGUgc2VjdGlvbnMuICBDaGVjayByZXR1cm4gdmFsdWUgb2YgcmVjdXJzaXZlIGNhbGxzLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX21ha2Vfc2VjdGlvbi4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWN0aW9uX2Zyb21fc2hkci4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KLQkoYmZkX3Byc3RhdHVzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfbWFrZV9zZWN0aW9uLgotCShiZmRfZnByZWdzZXQpOiBMaWtld2lzZS4KLQkoYmZkX3BycHNpbmZvKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZiBiZmRfcHJzdGF0dXMsCi0JYmZkX2ZwcmVnc2V0LCBhbmQgYmZkX3BycHNpbmZvLgotCShlbGZfY29yZV9maWxlX3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgZWxmX2NvcmVmaWxlX25vdGUuCi0KLUZyaSBBcHIgMjIgMTE6MDg6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JR2V0IHJpZCBvZiB0aGUgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbiBoYWNrLgotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGNyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZQotCXJlZ2lzdGVyIG1hc2tzLgotCShiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQlGaXggRUNPRkYgb2JqY29weSB0byBhY3R1YWxseSBjb3B5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2dldF9leHRyKTogQXNzdW1lIHRoYXQgYW55IEVDT0ZGIHN5bWJvbCB3aXRoIGxvY2FsIGNsZWFyIGlzCi0JYW4gZXh0ZXJuYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sIGZsYWdzLiAgT25seQotCWNoZWNrIHRoZSBmbGFncyBmb3Igbm9uLUVDT0ZGIHN5bWJvbHMuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IERvbid0IGNyYXNoIGlmIHRoZQotCW91dHB1dF9zZWN0aW9uIGZpZWxkIG9mIHRoZSBzeW1ib2wgc2VjdGlvbiBpcyBOVUxMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUgYXMKLQlmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZyBhcyBtYWNyby4KLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogU2V0IGJmZF9lcnJvcl9nb3Rfd3JvbmdfZm9ybWF0IGlmCi0JYXBwcm9wcmlhdGUuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX3Bvd2VycGNfdmVjLgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBBY2NlcHQgYmZkX2FyY2hfbTY4ayBhcyB3ZWxsIGFzCi0JYmZkX2FyY2hfdW5rbm93bi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCi0JKiBlbGZjb2RlLmggKGVsZl9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgY2hlY2sgYSBsaXN0IG9mIEVMRgotCWFyY2hpdGVjdHVyZXMsIGp1c3Qgc2VlIGlmIHRoZSBkZXNpcmVkIGFyY2hpdGVjdHVyZSBtYXRjaGVzIHdoYXQKLQl0aGUgRUxGIGJhY2tlbmQgcGVybWl0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW5hbWUgU0hNQUdJQyB0bwotCVNIX0FSQ0hfTUFHSUMgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvc2guaC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQotCUZvbGxvdyBjb252ZW50aW9uIGluIHdoaWNoIGVhY2ggTkxNIGhlYWRlciBoYXMgYW4gOCBieXRlIHN0YW1wCi0JZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgbGVuZ3RoLgotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogUmVuYW1lIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQl0byBubG1fY3lnbnVzX2V4dF9oZWFkZXIsIGFuZCBjaGFuZ2UgdHlwZSB0bwotCU5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlci4KLQkobmxtX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20gbmxtX2N5Z251c19zZWN0aW9uX2hlYWRlci4KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBVc2UgQ3lHblVzRXggaW5zdGVhZAotCW9mIEN5R25Vc1NlQ3MuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0byBjeWdudXNfZXh0LiAgUmVxdWlyZQotCWxlbmd0aCB3b3JkIHRvIGJlIDguCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvCi0JY3lnbnVzX2V4dC4gIFNldCBsZW5ndGggd29yZCB0byA4LgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24KLQl0byBjeWdudXNfZXh0LgotCi1UaHUgQXByIDIxIDIyOjU0OjIyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiAgS2VlcCBzZWN0aW9uIHRhYmxlCi0JKGZyb20gQ3lHblVzU2VDcykgaW4gbW9yZSBwZXJtYW5lbnQgbWVtb3J5IHRvIGtlZXAgc2VjdGlvbiBuYW1lcwotCWZyb20gZ2V0dGluZyB0cmFzaGVkLgotCi1UaHUgQXByIDIxIDA5OjI5OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiAgQWRkIG1lbWJlcnMgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0JaGFuZGxpbmcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgotCXRvIHNlbGVjdCBzdGF0aWMgb3IgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIHJldHVybiBudW1iZXIgb2YKLQlzeW1ib2xzIHNsdXJwZWQgb3IgLTEgb24gZXJyb3IuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiKTogIFNldCBiZmQgc3ltY291bnQgZnJvbQotCWVsZl9zbHVycF9zeW1ib2xfdGFibGUgcmVzdWx0LgotCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAotCWVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCAoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6Ci0JQ2hhbmdlIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgcHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zCi0JZm9yIGR5bmFtaWMgcmVsb2NzLgotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkLCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSwKLQlOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCi0JYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiAgSGFuZGxlIHJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUKLQlyZWxvY2F0aW9ucy4KLQotVGh1IEFwciAyMSAxMTo1ODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB1c2VzIG9mIF9iZmRfZHVtbXlfdGFyZ2V0IChmcm9tIFBldGVyIFNjaGF1ZXIpLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogU2V0IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0JKiBubG0tdGFyZ2V0LmggKG5sbV9jb3JlX2ZpbGVfcCk6IERlZmluZSBhcyBfYmZkX2R1bW15X3RhcmdldCwgbm90Ci0JTlVMTC4KLQkqIHNyZWMuYyAoc3JlY192ZWMpOiBVc2UgX2JmZF9kdW1teV90YXJnZXQsIG5vdCBOVUxMLCBpbgotCV9iZmRfY2hlY2tfZm9ybWF0LgotCShzeW1ib2xzcmVjX3ZlYyk6IExpa2V3aXNlLgotCSogdGVraGV4LmMgKHRla2hleF92ZWMpOiBMaWtld2lzZS4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQlmaWVsZC4KLQkobmxtX2N5Z251c19zZWN0aW9uX2hlYWRlcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogRnJlZSBuZXcgdGRhdGEgc3RydWN0dXJlIGlmIGZhaWx1cmUuCi0JQWRkIGZpeGVkIHNlY3Rpb25zIGJlZm9yZSBzd2FwcGluZyBpbiBhdXhpbGlhcnkgaGVhZGVycy4gIEFmdGVyCi0JYWRkaW5nIHNlY3Rpb25zLCB0cmVhdCBlcnJvcnMgYXMgcmVhbCwgbm90IGFzIHdyb25nIGZvcm1hdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBTd2FwIGluIHRoZSBzZWN0aW9ucyBoZWFkZXI7IGFkZAotCXNlY3Rpb25zIHRvIHRoZSBCRkQgZm9yIGVhY2ggc2VjdGlvbiBpdCBkZXNjcmliZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFN3YXAgb3V0IHRoZSBzZWN0aW9ucyBoZWFkZXIuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvciB0aGUgc2l6ZSBvZiB0aGUKLQlzZWN0aW9ucyBoZWFkZXIuCi0KLVdlZCBBcHIgMjAgMTY6NDU6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogQ2hhbmdlIG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvCi0JMiwgc28gdGhhdCBzdGFiIHNlY3Rpb25zIGNhbiBiZSBtdWx0aXBsZXMgb2YgNCBieXRlcyBvbmx5LgotCi0JKiBob3N0cy9pMzg2YWl4Lmg6IENoYW5nZXMgdG8gYXZvaWQgcHJvdG90eXBlcyBjb25mbGljdHMgd2l0aCB0aGUKLQlvbmVzIGRlZmluZWQgaW4gc3RkbGliLmguICAoRnJvbSBNaW5oIFRyYW4tTGUuKQotCi1XZWQgQXByIDIwIDE0OjE1OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItcHBjLmM6IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyB2ZXJzaW9uIG9mIFBvd2VyUEMKLQlOZXRXYXJlLiAgT2xkIGNvZGUgc3RpbGwgcHJlc2VudCwgYnV0IGlmZGVmZmVkIG91dC4KLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IERvbid0IGFzc3VtZSBhCi0JcGFydGljdWxhciBmb3JtYXQgZm9yIHRoZSBjdXN0b21lciBoZWFkZXIuICBBbGxvY2F0ZSBhIGJsb2NrIG9mCi0JbWVtb3J5IGFuZCByZWFkIGl0IGludG8gdGhhdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogV3JpdGUgb3V0IHRoZSBibG9jayBvZiBtZW1vcnkuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJbmNsdWRlIGxlbmd0aCBvZiBjdXN0b21lcgotCWhlYWRlciB3aGVuIGNvbXB1dGluZyBpdHMgc2l6ZS4KLQotTW9uIEFwciAxOCAxNDoyNzoxNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBHZXQgdGhlIHNwYWNlJ3MgbnVtYmVyIGZyb20gdGhlCi0JYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCi0JKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFN0b3JlIHRoZSBzcGFjZSdzIG51bWJlcgotCWluIHRoZSBiYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KLQotCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIHNwYWNlX251bWJlci4KLQotRnJpIEFwciAxNSAxMjoyMjowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChyZWxvY19wcm9jZXNzaW5nKTogQWx3YXlzIHNldCB0aGUgYWRkcmVzcyBvZiBhCi0JUl9JSENPTlNUIHJlbG9jIHRvIHRoYXQgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuCi0JZ2FzIGRvZXMgdGhpcyBhbnlob3csIGJ1dCBzb21lIG90aGVyIGFzc2VtYmxlcnMgc2VlbSB0byBsZWF2ZQotCWdhcmJhZ2UgaW4gdGhlIFJfSUhDT05TVCBhZGRyZXNzIGZpZWxkLgotCi0JKiBiZmQvYXJjaGl2ZS5jOiBDb25zaXN0ZW50bHkgdXNlIEFSRk1BRzsgZnJvbQotCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQVJGTUFHIHJhdGhlciB0aGFuICdgJyBhbmQKLQknXDAxMicuCi0JKGJzZF93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgbG9jYWwKLQlyZWxvY3MgYWdhaW5zdCB0aGUgLnRleHQgc2VjdGlvbiBhcyByZXF1aXJlZC4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFdoZW4gcmVsYXhpbmcsIGFkanVzdAotCVBEUiBhZGRyZXNzZXMgYXMgcmVxdWlyZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVGFrZSBmZHIgYXJndW1lbnQuICBNYXAgZmRyCi0JaW5kZXggdGhyb3VnaCByZmQgbWFwIGlmIGl0IGV4aXN0cy4gIENoZWNrIGZvciBhIGNvdXBsZSBvZiBjYXNlcwotCXdoaWNoIGdkYiBoYW5kbGVzIHNwZWNpYWxseS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBUYWtlIGZkciBhcmd1bWVudCByYXRoZXIgdGhhbiBhdXhfcHRyIGFuZAotCWJpZ2VuZGlhbiBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogSGFuZGxlIHN0U3RydWN0LCBzdFVuaW9uIGFuZCBzdEVudW0uCi0KLVRodSBBcHIgMTQgMTM6MDU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBkdW1teSBlbnRyaWVzIHRvIGFjY291bnQgZm9yCi0JbnVtYmVyaW5nIGNoYW5nZXMgaW4gaW5jbHVkZS9jb2ZmL21pcHMuaC4gIEFkZCBlbnRyaWVzIGZvcgotCU1JUFNfUl9SRUxISSBhbmQgTUlQU19SX1JFTExPLgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBIYW5kbGUgYW4gZXh0cmEgYml0IGZvciB0aGUgcmVsb2MgdHlwZQotCXdoZW4gbGl0dGxlIGVuZGlhbi4gIFRyZWF0IGludGVybmFsIE1JUFNfUl9SRUxMTyBvciBNSVBTX1JfUkVMSEkKLQlyZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILCBhbmQgY29udmVydCByX29mZnNldCBmcm9tIDI0IHRvIDMyCi0JYml0cy4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IEhhbmRsZSBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IKLQlNSVBTX1JfUkVMSEkgcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSC4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWlwc19yZWxoaV9yZWxvYywgbWlwc19yZWxsb19yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGludG8KLQlNSVBTX1JfUkVMSEkgYW5kIHR1cm4gQkZEX1JFTE9DX1BDUkVMX0xPMTYgaW50byBNSVBTX1JfUkVMTE8uCi0JKG1pcHNfcmVsb2NhdGVfaGkpOiBSZW5hbWUgZnJvbSBtaXBzX3JlbG9jYXRlX3JlZmhpLCBhbmQgYWRkIHBjcmVsCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgZ290X3JlZmxvIHRvIGdvdF9sbyBhbmQKLQlyZWZsb19pbnRfcmVsIHRvIGxvX2ludF9yZWwuICBIYW5kbGUgTUlQU19SX1JFTExPIGFuZCBNSVBTX1JfUkVMSEkKLQlyZWxvY3MuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfUkVMSEkvTUlQU19SX1JFTExPIHBhaXJzIHdoZW4KLQlleHBhbmRpbmcgYSBQQyByZWxhdGl2ZSBjYWxsLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotCWFuZCBCRkRfUkVMT0NfUENSRUxfTE8xNi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEFwciAxMyAxMTo1MDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IFNldCBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0byAzLgotCi1UdWUgQXByIDEyIDEzOjM2OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEFsd2F5cyBlbWl0IGF0IGxlYXN0Ci0gICAgICAgIG9uZSByZWxvY2F0aW9uIGZvciBhbnkgbm9uLWJzcyBzZWN0aW9uLgotCi1Nb24gQXByIDExIDE0OjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKLQl0aGUgZmlsZSBhbGlnbm1lbnQgdG8gY29ycmVzcG9uZCB0byB0aGUgcGFnZSBzaXplIHdoZW4gbGlua2luZwotCXdpdGggLU4uCi0KLVN1biBBcHIgMTAgMDE6MDI6MjQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRm9yIHJlbGEgcmVsb2NhdGlvbnMsIGFkanVzdCB0aGUKLQlhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGludm9sdmluZyBzZWN0aW9uIHN5bWJvbHMgdG8gYWNjb3VudAotCWZvciB0aGUgbG9zc2FnZSBvZiAxOjEgbWFwcGluZyBmcm9tIGlucHV0IHNlY3Rpb24gc3ltYm9scyB0bwotCW91dHB1dCBzZWN0aW9uIHN5bWJvbHMuCi0KLUZyaSBBcHIgIDggMTI6MjI6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykKLQlyYXRoZXIgdGhhbiBtYWtpbmcgc2VjdGlvbnMgaW5saW5lLgotCShOQU1FKGFvdXQsbWtvYmplY3QpKTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGRlcmVmZXJlbmNlIG9ial90ZXh0c2VjIChhYmZkKSBvcgotCW9ial9kYXRhc2VjIChhYmZkKSBpZiB0aGV5IGFyZSBOVUxMLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBEZWNsYXJlLgotCSogYm91dC5jIChiX291dF9ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkoYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGkzODZvczlrLmMgKG9zOWtfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkob3M5a193cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkob3M5a19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykpOiBEb24ndCBzZXQgTl9FWFQgaW4gdGFyZ2V0Ci0JaW5kZXguCi0KLVdlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCi0KLVRodSBBcHIgIDcgMTQ6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgTUlQU19SX1NXSVRDSC4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogRm9yIE1JUFNfUl9TV1RJQ0gsIGNvcHkgcl9zeW1uZHggaW50bwotCXJfb2Zmc2V0IGFuZCBzZXQgcl9zeW1uZHggdG8gUkVMT0NfU0VDVElPTl9URVhULgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGdldCB0aGUgcl9zeW1uZHgKLQl2YWx1ZSBmcm9tIHRoZSByX29mZnNldCBmaWVsZC4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBNYXhpbXVtIHJfdHlwZSB2YWx1ZSBpcyBub3cgTUlQU19SX1NXSVRDSC4KLQlGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgcl9vZmZzZXQgZmllbGQgaW50byB0aGUgYWRkZW5kIGZpZWxkLgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgYWRkZW5kIGZpZWxkCi0JaW50byB0aGUgcl9vZmZzZXQgZmllbGQuCi0JKG1pcHNfc3dpdGNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRyYW5zbGF0ZSBCRkRfUkVMT0NfR1BSRUwzMiBpbnRvCi0JTUlQU19SX1NXSVRDSC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfU1dJVENIIG9mZnNldCBpZiBuZWNlc3NhcnkuCi0KLVRodSBBcHIgIDcgMTE6MTA6NTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3VwcG9ydCBjYWxsaW5nIHRoZSBiYWNrZW5kCi0JZnVuY3Rpb24gZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyB3aGVuIGp1c3QgYmVnaW5uaW5nIHRvCi0Jd3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQotCSogZWxmezMyLDY0fS10YXJnZXQuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFByb3ZpZGUKLQlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZWxmezMyLDY0fV9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZy4KLQkKLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbi4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmMgKHN5bWV4dF9jaGFpbl9idWlsdCk6IERlbGV0ZS4KLQkoc3ltZXh0X2NoYWluX3NpemUpOiBSZW5hbWVkIGZyb20gc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSB3cml0ZXMgdG8gdGhlIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9uIHVudGlsIGl0J3MgYmVlbiByZWJ1aWx0IGludGVybmFsbHkuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIGlzIG5vCi0JbG9uZ2VyIHNwZWNpYWwuCi0JKGVsZl9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IFNpbXBsaWZ5IG5vdyB0aGF0IG11Y2ggY29kZSBoYXMKLQltaWdyYXRlZCBpbnRvIGVsZjMyX2hwcGFfYmFja2VuZF97YmVpbmcsZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMTc6MjQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIG5ldyB0YXJnZXQgdmVjdG9ycyB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIGR5bmFtaWMKLQlyZWxvY3MuICBDaGFuZ2UgYS5vdXQgdG8gdXNlIHRoZXNlIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGR5bmFtaWMKLQlzeW1ib2xzIGFuZCByZWxvY3MgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMKLQlfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwKLQlfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAotCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MuCi0JKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogYmZkLmMgKGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogc3Vub3MuYyAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBkeW5zeW1fY291bnQgYW5kCi0JZHlucmVsX2NvdW50IHRvIGxvbmcuICBBZGQgZmllbGRzIGNhbm9uaWNhbF9keW5zeW0gYW5kCi0JY2Fub25pY2FsX2R5bnJlbC4KLQkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayB0aGF0IEJGRCBoYWQgRFlOQU1JQyBmbGFnIHNldC4KLQlDbGVhciBpbmZvLT5jYW5vbmljYWxfZHluc3ltIGFuZCBpbmZvLT5jYW5vbmljYWxfZHlucmVsLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykpOiBSZW1vdmVkLgotCShNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IFJlbW92ZWQuCi0JKHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0Lmg6IERlY2xhcmUgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBhbmQKLQlyZWxvY19zdGRfZXh0ZXJuYWwgdG8gYXZvaWQgcHJvdG90eXBlIHByb2JsZW1zLgotCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZmllbGRzIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAotCXJlYWRfZHluYW1pY19yZWxvY3MuCi0JKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogRGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFJlbmFtZWQgZnJvbQotCXRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgYW5kIG1hZGUgbm9uLXN0YXRpYy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHN5bWJvbHMuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgcmVsb2NzLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IERvbid0IGNvdW50IGR5bmFtaWMgcmVsb2NzLgotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB0bwotCXJlbW92ZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gIFRoZXkgd2lsbCBubyBsb25nZXIgYmUKLQlwcmVzZW50LgotCShNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgdG8KLQlfYmZkX25vZHluYW1pYyB2ZXJzaW9uLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBMaWtld2lzZS4KLQkqIEFsbCBiYWNrZW5kczogQWRkZWQgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyB0byB0YXJnZXQgdmVjdG9yLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGNmLW02OGtseW54LmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLQkqIGhwMzAwaHB1eC5jOiBSZW1vdmVkIHNvbWUgc3BhY2VzIGluIHVzZXMgb2YgTkFNRSB0byBhdm9pZAotCXByb2JsZW1zIHdpdGggdHJhZGl0aW9uYWwgQyBjb21waWxlcnMuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlYXJyYW5nZWQgZmllbGRzIGluIHRhcmdldCB2ZWN0b3IuCi0JUmVtb3ZlZCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIF9iZmRfZGVidWdfaW5mb19lbmQgYW5kCi0JX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIHdoaWNoIHdlcmUgbmV2ZXIgdXNlZC4KLQkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQywgQkZEX0pVTVBfVEFCTEVfQ09QWSk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX0NPUkUsIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTLCBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9XUklURSwgQkZEX0pVTVBfVEFCTEVfTElOSyk6IERlZmluZWQuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgdG8gdXNlIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MKLQlyYXRoZXIgdGhhbiB0aGUgc2luZ2xlIEpVTVBfVEFCTEUgbWFjcm8uICBSZW1vdmVkIG1hbnkgb2YgdGhlCi0Jd2VpcmQgbWFjcm8gZGVmaW5pdGlvbnMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG1vbm9saXRoaWMKLQlKVU1QX1RBQkxFLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBSZW1vdmVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSBhIGJ1bmNoIG9mIG1hY3JvcywgYW5kIGRlY2xhcmUgYSBmZXcKLQlmdW5jdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZWQuCi0JKGJmZF9mYWxzZSk6IFNldCBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKGJmZF9udWxsdm9pZHB0cik6IExpa2V3aXNlLgotCShiZmRfbjEpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IFJlbmFtZWQgZnJvbQotCV9iZmRfZHVtbXlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogU2ltaWxhciByZW5hbWUuICBTZXQKLQliZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWVkIGZyb20KLQliZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbWlsYXIgcmVuYW1lLgotCSogaWVlZS5jOiAjaWYgMCBvdXQgaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCwKLQlpZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCwgaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLiAgVGhleQotCXdlcmUgbmV2ZXIgY2FsbGVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBBcHIgIDUgMjI6MTA6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIENydWRlIHN1cHBvcnQgZm9yIGV4YW1pbmluZyBkeW5hbWljIGxpYnJhcmllcy4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IERZTkFNSUMgZmxhZyBmb3IgU0hMX01BR0lDIGFuZAotCURMX01BR0lDIG9iamVjdHMuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBQcmVzZXJ2ZSB0aGUgc3lzdGVtX2lkIGZvciBEWU5BTUlDIG9iamVjdHMuCi0JVXNlIFNITF9NQUdJQyBhcyB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LgotCVdyaXRlIGV4ZWMgaGVhZGVycyBmb3IgRFlOQU1JQyBvYmplY3RzLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERZTkFNSUMgb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudAotCXJlc3RyaWN0aW9ucyBhcyBEX1BBR0VEIG9iamVjdHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFRyZWF0IERZTkFNSUMgb2JqZWN0cyBsaWtlIEVYRUNfUAotCW9iamVjdHMuCi0JKG9iamVjdF9mbGFncyk6IEFkZCBEWU5BTUlDLgotCi1UdWUgQXByICA1IDE3OjQ4OjUyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYywgc3BhcmNseW54LmMgKE5BTUUpOiBSZW1vdmUgZW1iZWRkZWQgd2hpdGVzcGFjZSBpbgotCW1hY3JvIHVzZXMsIGNvbmZ1c2VzIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzLgotCi1UdWUgQXByICA1IDE1OjUwOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogQWRkIG1pc3NpbmcgUEFSQU1TIGRlY2wuCi0JRG9uJ3QgZnJlZSBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KLQkoc29tX2Nsb3NlX2FuZF9jbGVhbnVwKTogQ2FsbCBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0KLVR1ZSBBcHIgIDUgMTE6MjI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCByZW1vdmUgZW1wdHkgc2VjdGlvbnMuCi0JSXQgdHVybnMgb3V0IG5vdCB0byBiZSByZXF1aXJlZCBvbiBJcml4IDUsIGFuZCBpdCBjYXVzZXMgcHJvYmxlbXMKLQlpZiB0aGUgc2VjdGlvbnMgaGFwcGVuIHRvIGNvbnRhaW4gc3ltYm9scy4KLQotCSogZWxmY29kZS5oICh3cml0ZV9zaGRyc19hbmRfZWhkcik6IENvcnJlY3QgYmZkX3dyaXRlIGNoZWNrLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb24tPnJlbG9jYXRpb24gaXMgTlVMTDsgbWFsbG9jIG1pZ2h0IGhhdmUgcmV0dXJuZWQgTlVMTCB3aGVuCi0JZ2l2ZW4gYSB6ZXJvIHNpemUgaWYgdGhlcmUgd2VyZSBubyByZWxvY2F0aW9ucy4KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9yZWxvY190YWJsZSkpOiBMaWtld2lzZS4gIEFsc28sIGlmIG1hbGxvYwotCXJldHVybnMgTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IElmIG1hbGxvYyByZXR1cm5zCi0JTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogbmxtY29kZS5oIChubG1fc2x1cnBfcmVsb2NfZml4dXBzKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDQgMTU6MzA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRG9uJ3QgZnJlZSBhbnl0aGluZwotCWlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgotCi0JTWFkZSBzdXJlIHRoYXQgZXZlcnkgY2FsbCB0byBiZmRfcmVhZCwgYmZkX3dyaXRlLCBhbmQgYmZkX3NlZWsKLQljaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgaGFuZGxlZCBiZmRfZXJyb3IgY29ycmVjdGx5LiAgVGhlc2UKLQljaGFuZ2VzIGFyZSBub3QgaXRlbWlzZWQuICBBbHNvOgotCSogYW91dHguaCAoZW1pdF9zdHJ0YWIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwgYW5kIHJldHVybgotCWVycm9ycy4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogQ2hlY2sgZW1pdF9zdHJ0YWIgcmV0dXJuIHZhbHVlLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sCi0JYW5kIHJldHVybiBlcnJvcnMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgY29mZl93cml0ZV9yZWxvY3MgcmV0dXJuCi0JdmFsdWUuCi0JKiBpMzg2b3M5ay5jIChvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLgotCShvczlrX29iamVjdF9wKTogQ2hlY2sgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIHJldHVybiB2YWx1ZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZTogQ2hlY2sgb2FzeXNfcmVhZF9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c19vYmplY3RfcCwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0JKG9hc3lzX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShvYXN5c193cml0ZV9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBvYXN5c193cml0ZV9yZWNvcmQKLQlyZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogQ2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjawotCW9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX2VuZCwgb2FzeXNfd3JpdGVfZGF0YSk6IExpa2V3aXNlLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mCi0Jb2FzeXNfd3JpdGVfaGVhZGVyLCBvYXN5c193cml0ZV9zeW1zLCBvYXN5c193cml0ZV9kYXRhLCBhbmQKLQlvYXN5c193cml0ZV9lbmQuCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBzcmVjX3dyaXRlX3JlY29yZAotCXJldHVybiB2YWx1ZS4KLQkoc3JlY193cml0ZV9zZWN0aW9uLCBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBMaWtld2lzZS4KLQkoc3JlY193cml0ZV9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc3JlY193cml0ZV9zeW1ib2xzLCBzcmVjX3dyaXRlX2hlYWRlciwgc3JlY193cml0ZV9zZWN0aW9uLCBhbmQKLQlzcmVjX3dyaXRlX3Rlcm1pbmF0b3IuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEFwciAgNCAxMDo1Njo0NSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQlhc2VjdGlvbiB0byBhc3ltYm9sLgotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYmZkIHRvIGFzeW1ib2wuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWFzZWN0aW9uIHRvIGFzeW1ib2wuCi0KLVN1biBBcHIgIDMgMTg6Mjc6MjkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogVXNlIG1hbGxvYyB0byBhbGxvY2F0ZSBzcGFjZQotCWZvciB0aGUgY2FjaGVkIGNvcHkgb2YgdGhlIG5hdGl2ZSBzdHJpbmcgdGFibGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBzeW1ib2wgdGFibGUuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIGFuZCBnZW5lcmljCi0JcmVsb2NhdGlvbiB0YWJsZXMuCi0JKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEZyZWUgdGhlIGNhY2hlZCBuYXRpdmUgc3RyaW5ncywKLQlzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbnMuICBBbHNvIGZyZWUgdGhlIGNhbm9uaWNhbCBjYWNoZWQKLQlyZWxvY2F0aW9ucy4KLQotRnJpIEFwciAgMSAxMjo0MDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYga2VlcF9tZW1vcnkgaXMgZmFsc2UsIG1ha2UKLQlzdXJlIHRoZSBzeW1ib2wgbmFtZSBpcyBzdG9yZWQgaW4gcGVybWFuZW50IG1lbW9yeSBiZWZvcmUgYWRkaW5nCi0JaXQgdG8gdGhlIHN0cmluZyB0YWJsZS4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBPbmNlIHdlJ3ZlIGZvdW5kIGFuCi0Jb2JqZWN0LCBkb24ndCBib3RoZXIgdG8gbG9vayBmb3IgbW9yZSB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8KLQlidWlsZCBhIG1hcC4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBBZnRlciBhZGRpbmcgdGhlIHN5bWJvbHMgZm9yIGEgQkZELAotCWNhbGwgYmZkX2ZyZWVfY2FjaGVkX2luZm8gb24gaXQuCi0KLQlBZGQgYmZkX2ZyZWVfY2FjaGVkX2luZm8gc3VwcG9ydCB0byBhLm91dCBiYWNrZW5kcy4KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20KLQlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMuICBSZWFkIHN0cmluZ3MgZXZlbiBpZiBzeW1ib2xzIGhhdmUgYmVlbgotCXJlYWQuICBTdG9yZSBzdHJpbmcgc2l6ZSBpbiBvYmpfYW91dF9zdHJpbmdfc2l6ZS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDYWxsIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgdG8KLQlyZWFkIHRoZSBzeW1ib2xzLiAgQWxsb2NhdGUgdGhlIGNhY2hlZCBzeW1ib2xzIHdpdGggbWFsbG9jLCBub3QKLQliZmRfYWxsb2MuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkIHJlbG9jcyB3aXRoCi0JbWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogTmV3IGZ1bmN0aW9uOyBmcmVlIGNhY2hlZAotCXN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGV4dGVybmFsX3N0cmluZ19zaXplIGZpZWxkLgotCShvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkoTkFNRShhb3V0LGNsb3NlX2FuZF9jbGVhbnVwKSk6IERvbid0IGRlY2xhcmUuCi0JKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEZWNsYXJlLgotCShhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0XzY0X2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLAotCWRlZmluZSBhcyBOQU1FKGFvdXQsZnJlZV9jYWNoZWRfaW5mbykuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGFzCi0JTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBib3V0LmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBocDMwMGhwdXguYyAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUgYXMgYmZkX3RydWUuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQKLQlyZWxvY3Mgd2l0aCBtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBpMzg2b3M5ay5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JQWRkIGEgbmV3IGVudHJ5IHBvaW50IHRvIGZyZWUgbWVtb3J5IGNhY2hlZCBieSBhIEJGRC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8gZmllbGQuCi0JKiBiZmQuYyAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBBbGwgYmFja2VuZHM6IEluaXRpYWxpemUgYmZkX2ZyZWVfY2FjaGVkX2luZm8gZW50cnkgcG9pbnQgdG8KLQliZmRfdHJ1ZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IENvcnJlY3QgdHlwZSBvZgotCWZpcnN0LCB1bnVzZWQsIGFyZ3VtZW50LgotCShocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUgaW5zdGVhZCBvZgotCXNvbV9iZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQWRkIHJlbG9jX2VudHJ5LT5hZGRyZXNzIHRvIHZhbHVlIG9mCi0JYWJzb2x1dGUgUl9JUkVMIHJlbG9jLgotCi1UaHUgTWFyIDMxIDExOjUyOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCS5saWIgc2VjdGlvbi4KLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGlmCi0JU1RZUF9FQ09GRl9MSUIgYml0IGlzIHNldC4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUm91bmQgdGhlIGNvbnRlbnRzIG9mIGEKLQkubGliIHNlY3Rpb24gdXAgdG8gdGhlIG5leHQgcGFnZSBib3VuZGFyeS4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiB3ZSBzZWUgYSAubGliIHNlY3Rpb24sIGluY3JlbWVudAotCXRoZSB2bWEgYnkgb25lIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyB3ZSBoYXZlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiB3ZSBzZWUgYQotCVNUWVBfRUNPRkZfTElCIHNlY3Rpb24sIGFuZCBkb24ndCBhZGp1c3QgdGV4dF9zdGFydCBvciBkYXRhX3N0YXJ0Ci0Jb3IgYnNzX3NpemUgZWl0aGVyLgotCi0JKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoYW5nZSB0byBmZXRjaCBvcmlnaW5hbCBzeW1ib2wgdmFsdWUKLQlmcm9tIG9yaWdpbmFsIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgdmFsdWUgb2YgY3VycmVudCBCRkQgc3ltYm9sLgotCU5lZWRlZCBmb3IgbmV3IGxpbmtlci4KLQkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBMaWtld2lzZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHRoZSB0ZXh0X3N0YXJ0IGFuZAotCWRhdGFfc3RhcnQgZW50cmllcyBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyIGNvcnJlY3RseSBldmVuIGlmIGEgdGV4dAotCW9yIGRhdGEgc2VjdGlvbiBzdGFydHMgYXQgbG9jYXRpb24gemVyby4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DXzI2IChmcm9tIHNlZgotCWFuZCByYWVidXJuKS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IE51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wKLQluYW1lLgotCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCk6IFJlaW5kZW50ZWQuICBDaGFuZ2VkIHRvIHJldHVybgotCWJvb2xlYW4sIGFuZCBjaGFuZ2VkIHdyaXR0ZW4gdG8gdW5zaWduZWQgaW50ICouICBDaGVjayBlcnJvcgotCXJldHVybnMgZnJvbSBjYWxsZWQgZnVuY3Rpb25zLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogTGlrZXdpc2UuICBSZXdvcmtlZCBjaGVja3Mgb24gd2hldGhlciB0bwotCXdyaXRlIHN5bWJvbCBuYW1lIHRvIHN0cmluZyB0YWJsZSBmb3IgY2xhcml0eSBhbmQgdG8gYXZvaWQgY29yZQotCWR1bXBpbmcgd2hlbiBnaXZlbiBhIG5vbiBDT0ZGIHN5bWJvbC4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl93cml0ZV9zeW1ib2xzKTogRGVjbGFyZSBhcyByZXR1cm5pbmcgYm9vbGVhbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl93cml0ZV9zeW1ib2xzLgotCi1XZWQgTWFyIDMwIDE2OjI1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbGV0IEJGRCByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuICBUaGV5IG5vdwotCXJldHVybiBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgaW50LCBhbmQgdXNlIC0xIHRvIGluZGljYXRlIGFuCi0JZXJyb3IuICBBbG9uZyB0aGUgd2F5LCByZW5hbWUgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bwotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uCi0JZXJyb3JzLgotCShiZmRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmVuYW1lZCBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZWQgX2dldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KLQlfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGFuZCBjaGFuZ2VkIGl0IGFuZAotCV9iZmRfY2Fub25pY2FsaXplX3N5bXRhYiBhbmQgX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyB0byBhbGwgcmV0dXJuIGxvbmcuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkoTVkoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBnZXRfc3ltYm9sLgotCShpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKLQlmb3IgZXJyb3JzIGZyb20gaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzLgotCShpZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoaWVlZV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkobmxtX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkob2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc3JlY19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHRla2hleC5jICh0ZWtoZXhfZ2V0X3N5bXRhYik6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSh0ZWtoZXhfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkodGVraGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBDaGFuZ2UKLQlkZWNsYXJhdGlvbiB0byByZXR1cm4gbG9uZy4KLQkoTkFNRShhb3V0LGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJubG0uaCAobmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBVc2UgZXJyb3JfcmV0dXJuIGFuZAotCW5vX21lbW9yeV9yZXR1cm4gbGFiZWxzIHJhdGhlciB0aGFuIGZyZWVpbmcgaW5mb3JtYXRpb24gaW4gdmFyaW91cwotCXBsYWNlcy4gIENoYW5nZSBzdG9yYWdlLCBzeW1jb3VudCBhbmQgc3JjX2NvdW50IHRvIGxvbmcuICBDaGVjawotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogYm91dC5jIChiX291dF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHJlbG9jX3NpemUgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBmb3IgZXJyb3JzCi0JZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYyAoYmZkXzBsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKGJmZF8wbCk6IERlY2xhcmUuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgZ2V0X3N5bXRhYiwKLQlnZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8gdXNlIGJmZF8wbCByYXRoZXIKLQl0aGFuIGJmZF8wdS4KLQkqIGNpc2NvLWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jOiBMaWtld2lzZS4KLQkqIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcwotCXRlbXAgYW5kIG5hbWUuCi0KLVdlZCBNYXIgMzAgMDg6MzM6MDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RweDIuaDogRGVmaW5lIFBPU0lYX1VUSU1FLgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaTM4NmR5bml4LmMsIGNvbmZpZy9pMzg2LWR5bml4Lm10OiAgTmV3IGZpbGVzLCBoYW5kbGluZyBEeW5peAotCXZhcmlhbnQgb2YgYS5vdXQuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6ICBVc2UgdGhlbSBmb3IgRHluaXguCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIGkzODZkeW5peC5vLiAKLQkqIHRhcmdldHMuYzogIEFkZCBkZWZpbml0aW9uIGZvciBpMzg2ZHluaXhfdmVjLgotCSogaG9zdHMvc3ltbWV0cnkuaDogIERvIG5vdCBkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGZvciBEeW5peC4KLQlEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgYW5kIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKLQlmb3IgRHluaXguIFJlbW92ZSBpbmNsdXNpb24gb2YgZHluaXgzLmgsIER5bml4IGJmZCBpcyBub3cgaGFuZGxlZCBieQotCWkzODZkeW5peC5jCi0KLU1vbiBNYXIgMjggMTI6NTM6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zcGFyYy5vLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjIGxpa2UKLQliZmRfYXJjaF9yczYwMDAuCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIHJzNjAwMC5tdC4KLQkqIGNvbmZpZy9yczYwMDAubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogQWRkIGJmZF9wb3dlcnBjX2FyY2guCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgU0VDX1JFTE9DIGZsYWcKLQlmb3IgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHNlY3Rpb24uCi0KLVN1biBNYXIgMjcgMTY6MjU6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBhcHByb2FjaCBhdCBkZWFsaW5nIHdpdGggaG9sZXMKLQlpbiBleGVjdXRhYmxlcyBsZWZ0IGJ5IHRoZSBIUCBsaW5rZXIuICBEb2VzIG5vdCByZWx5IG9uIHN1YnNwYWNlCi0JYWxpZ25tZW50cyBhcyBzdWJzcGFjZXMgYXJlICpOT1QqIGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkKLQlhbGlnbmVkIGluIGFuIGV4ZWN1dGFibGUgKGNhbiB5b3UgYmVsaWV2ZSB0aGF0ISkuCi0KLVNhdCBNYXIgMjYgMTA6MjU6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uICBEbyBub3QgdHJ5Ci0JdG8gYWN0dWFsbHkgcmVhZCBkYXRhIGZyb20gYSBzZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIGVpdGhlcgotCVNFQ19MT0FEIG9yIFNFQ19ERUJVR0dJTkcgc2V0IChlZyAkQlNTJCkganVzdCByZXR1cm4gdHJ1ZS4KLQotICAgICAgICAqIGxpYmJmZC5jIChiZmRfcmVhZCk6IFNldCBiZmRfZXJyb3IgYXMgYXBwcm9wcmlhdGUgZm9yIGEgc2hvcnQKLQlyZWFkLiAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsIG9yIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkuCi0KLQkqIHNvbS5jOiBEbyBub3QgYmxpbmRseSBzZXQgYmZkX2Vycm9yX3N5c3RlbV9jYWxsIGFmdGVyIGEKLQlmYWlsaW5nIGJmZF9yZWFkLCBiZmRfd3JpdGUsIG9yIGJmZF9zZWVrLiAgSW4gYSBmZXcgcGxhY2VzCi0JKGxpa2Ugc29tX29iamVjdF9wKSBvdmVycmlkZSB0aGUgZXJyb3Igc3RhdHVzIHNldCBieSBiZmRfcmVhZC4KLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1lbmNhcCxjIGFyY2hpdmUuYywgYm91dC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtcnM2MDAwLmMsIGNvZmZnZW4uYyBlY29mZi5jLCBlbGYuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaCwgaHAzMDBocHV4LmMsIGkzODZseW54LmM6IExpa2V3aXNlLgotCSogbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCBubG0zMi1zcGFyYy5jOiBMaWtld2lzZS4KLQotCSogc29tLmM6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBzZXZlcmFsIGJmZF97c2VlayxyZWFkLHdyaXRlfQotCWNhbGxzIHRoYXQgd2UganVzdCBhc3N1bWVkIHdlcmUgbm90IGZhaWxpbmcuCi0KLUZyaSBNYXIgMjUgMTE6NDQ6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N5c3Y0LmggKEhBVkVfUFJPQ0ZTKTogQWRkIGNvbW1lbnRzIGFib3V0IHB0eDQuCi0JKiBjb25maWcvc3lzdjQubWg6IEFkZCBjb21tZW50LgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oOiBDaGFuZ2UgY29tbWVudC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2Ugc3lzdjQsIG5vdCBzeW1tZXRyeSwgZm9yIGlbMzRdODYtc2VxdWVudC1zeXN2NCouCi0KLUZyaSBNYXIgMjUgMTc6MTA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IGxpbmtlciByZWxheGluZyBvZiBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlIHRvCi0JdXNlIGEgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgZnVuY3Rpb24gY2FsbHMgd2hpY2ggYXJlIG91dCBvZgotCXJhbmdlIG9mIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoZWNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IERvbid0IHJlYWQgb3IgZnJlZQotCXRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZWFkLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogSGFuZGxlIF9jb29rZWRfc2l6ZSBiZWluZyBkaWZmZXJlbnQKLQlmcm9tIF9yYXdfc2l6ZS4gIERvbid0IHJlcmVhZCB0aGUgY29udGVudHMgb3IgdGhlIHJlbG9jcyBpZiB0aGV5Ci0JaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQ2hhbmdlIGJpdHNpemUgb2YgUENSRUwxNiBmcm9tCi0JMTggdG8gMTYuCi0JKFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQpOiBEZWZpbmUuCi0JKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBUYWtlIGFkanVzdCBhcmd1bWVudC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jIG9mZnNldHMgc3RvcmVkIGluIHNlY3Rpb24KLQl1c2VkX2J5X2JmZCBmaWVsZC4gIENhbGwgbWlwc19yZWxheF9wY3JlbDE2IHRvIGhhbmRsZSBkZXRhaWxzIG9mCi0JZXhwYW5kaW5nIGFuIG91dCBvZiByYW5nZSBQQ1JFTDE2LiAgS2VlcCB0cmFjZSBvZiBhZGp1c3RtZW50cwotCXJlcXVpcmVkIGJ5IGV4cGFuc2lvbnMuICBTZXQgcyBhbmQgdW5zZXQgaCB3aGVuIGNvbnZlcnRpbmcgYSByZWxvYwotCWZyb20gdW5kZWZpbmVkIHRvIHNlY3Rpb24uICBDaGFuZ2UgaGFuZGxpbmcgb2YgUEMgcmVsYXRpdmUgcmVsb2NzOgotCWlmIGFnYWluc3QgYSBzZWN0aW9uLCB0aGV5IGFyZSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgaWYKLQlhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19yZWxheF9wY3JlbDE2KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkqIGNvZmYtYWxwaGEuYyAoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgYWRqdXN0bWVudHMKLQlidWlsdCBieSBtaXBzX3JlbGF4X3NlY3Rpb24gd2hlbiB3cml0aW5nIG91dCBhZGRyZXNzZXMuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IENsZWFyIGFkanVzdCBmaWVsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFRoZSBjYWxsZXIgZXhwZWN0cwotCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgc2V0IHRvIGEgc3ltYm9sIG5hbWUsIHNvIHByZXBlbmQKLQlzeW1ib2xfbGVhZGluZ19jaGFyLgotCi1UaHUgTWFyIDI0IDExOjMzOjQ2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEFkZCByZWxheGluZyBpbmZvCi0JZm9yIDE2Yml0IHJlbGF0aXZlIGJyYW5jaGVzLgotCSogY29mZi1oODUwMC5jIChyX2hpZ2g4LCByX2xvdzE2LCByX2hpZ2gxNik6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3cuCi0KLVRodSBNYXIgMjQgMDk6MjE6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSWdub3JlIG5vbi1TT00gb2JqZWN0cy4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYsIHNvbV93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDIzIDE0OjI5OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRGVsZXRlIHRoZSBvbGQgZGVmaW5pdGlvbi4KLQotV2VkIE1hciAyMyAxNDo1ODo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB0aGUgcmVsYXhpbmcgY29kZSBmb3IgdGhlIG5ldyBsaW5rZXIuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JKiBiZmQuYyAoYmZkX3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgbmFtZSBvZiBmb3VydGggYXJndW1lbnQgZnJvbQotCXN5bWJvbHMgdG8gYWdhaW4uCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbgotCWFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIEFsd2F5cyByZXR1cm4gdHJ1ZS4KLQkqIGJvdXQuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGFsaWduY29kZSwgcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KLQkocGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUNoYW5nZWQgYWxsIGNhbGxlcnMuICBHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZQotCWhhc2ggdGFibGUgZW50cnkgdmFsdWUgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgotCShhYnMzMmNvZGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkCi0JYWxsIGNhbGxlcnMuCi0JKGFsaWduY29kZSk6IExpa2V3aXNlLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgU2V0ICphZ2FpbgotCXRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiByZWxvYzE2LmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShiZmRfcGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdmFsdWUKLQlhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLQlTZXQgKmFnYWluIHRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKLQlfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSB0byB0YWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENoYW5nZQotCWRlY2xhcmF0aW9uIHRvIHRha2UgYm9vbGVhbiAqIHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB0YWtlIEJGRCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkqIGNvZmYtaDgzMDAuYyAoaDMwMF9yZWxvYzE2X2VzdGltYXRlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyCi0JdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkIGNhbGxzIHRvIGJmZF9wZXJmb3JtX3NsaXAuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KTogRGVmaW5lLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgaXQuICBVc2UKLQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyBhbmQgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50Ci0JdG8gZ2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFN0b3JlIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeQotCWluIGFzeW1ib2wgdWRhdGEgZmllbGQuCi0KLVR1ZSBNYXIgMjIgMTM6MDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgbmV3IE1JUFNfUl9QQ1JFTDE2Ci0JcmVsb2MsIHVzZWQgaW4gZW1iZWRkZWQgUElDIGNvZGUuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogQ2hhbmdlIHNhbml0eSBjaGVjayB0byBwZXJtaXQgbmV3IHJlbG9jLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMX1MyIGludG8KLQlNSVBTX1JfUENSRUwxNi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlcgotCXJlbG9jcyB3aGVuIGFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgU2V0IFNFQ19SRUxPQyBmbGFnCi0JZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcyByZWxvY3MuICBIYW5kbGUgbGlua19vcmRlciByZWxvY3MgaW4KLQlsaW5rX29yZGVyIGxvb3AuICBVc2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCBmb3IKLQlhZGRfc3ltYmxzIGVudHJ5IHBvaW50LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgcmVsb2NfY291bnQgdG8gMCBiZWZvcmUKLQljb3VudGluZyByZWxvY3MuICBTZXQgU0VDX1JFTE9DIGZsYWcgZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcwotCXJlbG9jcy4KLQotCSogbGlua2VyLmMgKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9kYXRhX2xpbmtfb3JkZXIuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IEp1c3QgY2FsbAotCWdlbmVyaWNfbGlua19hZGRfc3ltYm9scy4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IE5ldyBmdW5jdGlvbiwgbGlrZQotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCBhbHNvIGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZAotCWRlc3RydWN0b3JzIGJ5IG5hbWUgYXMgY29sbGVjdDIgZG9lcy4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBsaWtlIG9sZAotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCB3aXRoIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbmFtZSBjb25zdHJ1Y3RvciBhcmd1bWVudCB0bwotCWNvbGxlY3QuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIE1hciAyMiAxMDowNDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBVc2UgYXJfcGFkY2hhcgotCWZvciBmaXJzdCBjaGFyYWN0ZXIgaW4gYW4gZXh0ZW5kZWQgbmFtZS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogSWYgYXJfcGFkY2hhciA9PSAnLycsIHRoZW4gdXNlCi0JIi8vIiBhcyB0aGUgbmFtZSBvZiB0aGUgc3BlY2lhbCBhcmNoaXZlIG1lbWJlciBob2xkaW5nIHRoZQotCWV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLU1vbiBNYXIgMjEgMTI6Mjg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgbGlua19vcmRlciB0eXBlcyB3aGljaCBnZW5lcmF0ZSByZWxvY3MgaW4gb3JkZXIgdG8KLQlzdXBwb3J0IC1VciBpbiB0aGUgbGlua2VyLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudAotCWZyb20gY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudC4KLQlEb24ndCBwYXNzIGJpdHNpemUgdG8gY29uc3RydWN0b3IgY2FsbCBiYWNrLiAgUGFzcyBCRkRfUkVMT0NfQ1RPUgotCWluc3RlYWQgb2YgYml0c2l6ZSB0byBhZGRfdG9fc2V0IGNhbGwgYmFjay4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IElmIGEgcmVsb2NfbGlua19vcmRlciBpcyBzZWVuIGhlcmUsCi0JYWJvcnQuCi0JKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZQotCWFyZ3VtZW50IGZyb20gZGVjbGFyYXRpb24uCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogRGVjbGFyZS4KLQkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBhZnRlciBoYW5kbGluZyBhbGwKLQlpbnB1dCBCRkRzLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBhIGRlZmluZWQKLQlsaW5rZXIgY3JlYXRlZCBzeW1ib2wgYmFzZWQgb24gdGhlIHNlY3Rpb24gaXQgaXMgaW4uICBDb3JyZWN0Ci0JYmZkX2xpbmtfaGFzaF93ZWFrIGNhc2UgdG8gdXNlIC5zYyByYXRoZXIgdGhhbiAuc3QuCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQotCUJGRF9SRUxPQ19DVE9SLgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZHluc3ltCi0JYW5kIGJ1Zi4KLQotCSogY2lzY28tY29yZS5jIChjaXNjb19jb3JlX2ZpbGVfcCk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8KLQliZmRfem1hbGxvYy4gIEZyZWUgYSBwb2ludGVyLCBub3QgYSB1bmlvbi4KLQkoY2lzY29fYmZkX2lzX2xvY2FsX2xhYmVsKTogQ29ycmVjdCBjYXN0IGZyb20gYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQotU3VuIE1hciAyMCAwOToyNDozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkL3NvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua28gKG9mZiBieSBvbmUgZXJyb3IpLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSB0byBkbyB0aGUgdmFsdWUKLQljb21wYXJpc29uIGZvciBmdW5jdGlvbiBzeW1ib2xzIHdpdGhpbiBleGVjdXRhYmxlcy4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbmFtZWQgZnJvbQotCXNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXguICBQYXNzIGluIGEgbmF0aXZlIFNPTSBzeW1ib2wuCi0JRm9yIGV4ZWN1dGFibGVzLCBpdGVyYXRlIHRocm91Z2ggdGhlIHNlY3Rpb25zIHRvIGZpbmQgb3V0Ci0Jd2hpY2ggY29udGFpbnMgdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCi0Jc3ltYm9sX2luZm8gZmllbGQuICAoc3ltYm9sX2luZm8gaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yCi0JZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBEb24ndCBwYXNzIGFiZmQgdG8KLQliZmRfem1hbGxvYy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IGJyYWlubyAob25lIGNhbGwgdG8gYWxpZ24KLQlzcGFjZS9zdWJzcGFjZSBkYXRhIHdhcyBkb25lIHVuY29uZGl0aW9uYWxseSByYXRoZXIgdGhhbgotCWp1c3QgZm9yIGV4ZWN1dGFibGVzLikKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWxpZ24gdGV4dCBpbiBhbGwgZXhlY3V0YWJsZXMgdG8KLQltYWtlIEhQVVgga2VybmVsIGhhcHB5LiAgRml4ZXMgc3RyaXAvb2JqY29weSBmb3Igc2hhcmVkCi0JZXhlY3V0YWJsZXMuCi0KLVNhdCBNYXIgMTkgMDc6MDY6NTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFjY291bnQgZm9yIGFsaWdubWVudCBuZWVkcyBvZgotCXN1YnNwYWNlcyB0b28gd2hlbiB3cml0aW5nIGV4ZWN1dGFibGVzLiAgTmV2ZXIgcmVxdWVzdCBhIG5lZ2F0aXZlCi0JYnNzIHNpemUuICBGaXhlcyBzb21lIHByb2JsZW1zIHdpdGggZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLAotCXN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIHB1cmUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBleGVjdXRhYmxlcy4KLQotRnJpIE1hciAxOCAxOToxMjo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhbGwgYmZkX3ptYWxsb2Mgbm90Ci0JYmZkX3phbGxvYyBmb3IgcmF3cHRyLCBiZWNhdXNlIGxhdGVyIG9uIHdlIG1heSBjYWxsIGZyZWUsIG5vdAotCWJmZF9yZWxlYXNlLCBvbiBpdC4KLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGNpc2NvX2NvcmVfc3RydWN0IHRvIHRkYXRhIHVuaW9uLgotCSogbGliYmZkLmMgKGJmZF9yZWFkLCBiZmRfc2Vlayk6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgZXJyb3JzLgotCSogY2lzY28tY29yZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBjaXNjb19jb3JlX3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogQWRkIGNpc2NvX2NvcmVfdmVjLgotCSogdGFyZ2V0cy5jOiBBZGQgY2lzY29fY29yZV92ZWMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBNYXIgMTggMTg6MTM6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUKLQljb250YWluaW5nIGFsbCB0aGUgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdoaWNoIG5lZWRzCi0JdG8gYmUgY29waWVkIGZyb20gaW5wdXQgc2VjdGlvbiB0byBvdXRwdXQgc2VjdGlvbiBkdXJpbmcKLQlvYmpjb3B5IG9yIHN0cmlwLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbW92ZSBzZXZlcmFsIGZpZWxkcyBub3cgaW4KLQlzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdC4gIE1ha2UgdGhlIHNwYWNlIGFuZCAKLQlzdWJzcGFjZSBkaWN0aW9uYXJpZXMgYmUgcG9pbnRlcnMgKHRvIHNhdmUgc3BhY2Ugd2hlbgotCW9ubHkgcmVhZGluZyBvYmplY3RzKS4KLQotCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5vdyByZXR1cm5zIGEgYm9vbGVhbjsKLQlzb21lIHJlZmVyZW5jZXMgY2hhbmdlZC4gIEFsbG9jYXRlIGEgY29weWFibGUgZGF0YSBzdHVjdHVyZSBpZgotCW5vbmUgZXhpc3RzLiAgU3RvcmUgaW5mbyBpbnRvIHRoZSBjb3B5YWJsZSBkYXRhIHN0cnVjdHVyZS4KLQkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKHNvbV9pc19zcGFjZSwgc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTmV3IGZ1bmN0aW9ucy4KLQlVc2UgdGhlc2UgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcHJpdmF0ZSBkYXRhLgotCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgaGVyZS4KLQlGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBoZWFkZXJzIGZyb20gdGhlCi0JY29weWFibGUgZGF0YS4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5IHRoZSBzdHVmZgotCXRoYXQgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBvYmpjb3B5IGFuZCBzdHJpcCB3b3JrLiAgQWxsb2NhdGUKLQl0aGUgY29weV9kYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG91dHB1dCBiZmQgYmVmb3JlIGNvcHlpbmcuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBleGVjCi0JaW5mbyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIHdoZW4gcnVubmluZyBvYmpjb3B5L3N0cmlwLgotCShzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBuZXcgImV4ZWNfZGF0YSIgZmllbGQgYW5kIGFjY2Vzc29yCi0JbWFjcm8uICBBZGQgc29tZSBjb21tZW50cyBvbiBob3cgdGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE1ha2UgaXNfc3BhY2UgYW5kIGlzX3N1YnNwYWNlIGJpdGZpZWxkcy4KLQlEZWxldGUgdW51c2VkIHN1YnNwYWNlX2luZGV4LiAgQWxsIHJlZmVyZW5jZXMgbm93IHVzZSB0aGUKLQl0YXJnZXRfaW5kZXggZmllbGQgd2l0aGluIHRoZSBzZWN0aW9uIHN0cnVjdHVyZSBpdHNlbGYuCi0KLQkqIHNvbS5jIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBkZWNsYXJhdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIHNhdmUgZXhlYyBpbmZvcm1hdGlvbgotCXRoYXQgbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBvYmpjb3B5L3N0cmlwLgotCShzb21fbWtvYmplY3QpOiBEbyBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZmlsZSBoZWFkZXIgaGVyZS4KLQlJdCBpcyBub3QgdXNlZCB3aGVuIG9ubHkgcmVhZGluZyBTT00gb2JqZWN0cy4KLQkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIKLQl0byB0aGUgb3V0cHV0IGJmZC4gIEZvciBleGVjdXRhYmxlcywgdXNlIHRoZSBzYXZlZCBzeXN0ZW1faWQKLQl2YWx1ZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ3Vlc3MgdGhlIHJpZ2h0IHZhbHVlLiAgRG8gbm90IGFib3J0Ci0Jd3doZW4gc2V0dGluZyBmaWxlX2hkci0+ZW50cnkqIGZvciBleGVjdXRhYmxlcy4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBGb3IgZXhlY3V0YWJsZXMsIHNldCB0aGUgZXhlY19lbnRyeSBhbmQKLQlleGVjX2ZsYWdzIGZpZWxkcy4KLQkoc29tX2NvcHlfcHJpdmF0ZV9iYWNrZW5kX3NlY3Rpb25fZGF0YSk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogbGliaHBwYS5oIChQQV9QQUdFU0laRSk6IERlZmluZS4KLQotCSogc29tLmMgKFNPTV9BTElHTik6IERlZmluZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBJZiB3cml0aW5nIGFuIGV4ZWN1dGFibGUsIGluaXRpYWxpemUgYWxsCi0JZmllbGRzIGluIHRoZSBleGVjIGhlYWRlciB0byB6ZXJvLiAgVXBkYXRlIGZpZWxkcyBpbiB0aGUgZXhlYwotCWhlYWRlciBhcyBzaXplcyBvZiBsb2FkYWJsZSBzdWJzcGFjZXMgYXJlIGNvbXB1dGVkLiAgQ2FyZWZ1bGx5Ci0JcHJlc2VydmUgYWxpZ25tZW50cyB3aGVuIGJ1aWxkaW5nIGV4ZWN1dGFibGVzLiAgQWN0dWFsbHkgd3JpdGUgdGhlCi0JZXhlYyBhZnRlciBhbGwgdGhlIGZpZWxkcyBhcmUgZmlsbGVkIGluLgotCi0gICAgICAgICogQmV0dGVyIGxvbmctZmlsZW5hbWUgaGFuZGxpbmcuICBSZWFkcyBTT00gQUJJIGNvbXBsaWFudCBleHRlbmRlZAotCW5hbWVzLCBidXQgZG9lc24ndCBxdWl0ZSB3cml0ZSBjb21wbGlhbnQgZXh0ZW5kZWQgbmFtZXMgeWV0LgotCSogc29tLmMgKHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVsZXRlIGZ1bmN0aW9uLiAgVGhlCi0JZ2VuZXJpYyBjb2RlIHdpbGwgaGFuZGxlIHRoaW5ncyBjb3JyZWN0bHkuCi0JKHNvbV9zbHVycF9hcm1hcCk6IFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZW1iZXIuCi0JKG5vcm1hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBUYWtlIHRoZSBzaXplIG9mIHRoZSBleHRlbmRlZAotCW5hbWUgdGFibGUgaW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCi0JU09NIGRpY3Rpb25hcnkuICBNYWtlIHN1cmUgdG8gYWxpZ24gdG8gYW4gZXZlbiBib3VuZGFyeS4KLQkoc29tX3dyaXRlX2FybWFwKTogSW5pdGlhbGl6ZSB0aGUgY2hlY2tzdW0gdG8gemVyby4KLQkoYXJfbWF4Y2hhcnMpOiBGaXguICBPcHBzLgotCi1GcmkgTWFyIDE4IDIwOjM1OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SIG9uIGEgNjQtYml0Ci0JbWFjaGluZS4gIEhhbmRsZSBCRkRfUkVMT0NfU1BBUkMxMyBhbmQgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMy4KLQotVGh1IE1hciAxNyAxODoyNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoQkZEX1ZFUlNJT04pOiBVc2UgQFZFUlNJT05ALgotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogUmVwbGFjZSBpdCB3aXRoIGNvbnRlbnRzIG9mIFZFUlNJT04gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogRml4ZWQgdHlwbyB3aGVyZQotCXRoaXMgd2FzIGFsc28gbmFtZWQgdHJhZF91bml4X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLVRodSBNYXIgMTcgMTA6Mzc6MDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgY29mZi1hbHBoYS5jLCBib3V0LmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLAotCWVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgc29tLmMsIHN1bm9zLmM6IElmIG1hbGxvYygwKQotCXJldHVybnMgTlVMTCwgaXQgaXMgbm90IGFuIGVycm9yLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2YKLQl0aGVzZSBjaGVja3MgYXJlIG5vdCBuZWNlc3NhcnkgKGJlY2F1c2UgdGhlIHNpemUgY2FuIG5ldmVyIGJlCi0JemVybyksIGJ1dCBwdXR0aW5nIGluIHRoZSBjaGVja3MgaXMgdGhlIGNvbnNlcnZhdGl2ZSB0aGluZyB0byBkbwotCWluIGxpZ2h0IG9mIHRoZSBmYWN0IHRoYXQgc29tZSBvZiB0aGVzZSBtYWxsb2MgY2FsbHMgcmVwbGFjZWQKLQl1bmNoZWNrZWQgYWxsb2NhIGNhbGxzLCBpbiB3aGljaCBhIHplcm8gYXJndW1lbnQgd291bGQgd29yayBmaW5lLgotCi1UaHUgTWFyIDE3IDExOjQ0OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbW92ZQotCWR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCShvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGZhaWwKLQlpZiBtYWxsb2MgKDApIGZhaWxzLiAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyByZXR1cm5pbmcgMCBpcyBub3QgYQotCWZhaWx1cmUgaW5kaWNhdGlvbiwgaXQgbWVyZWx5IG1lYW5zIHRoZXJlIGFyZSBubyByZWxvY3MuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB1c2Ugc3BhY2UKLQlhZnRlciBOQU1FLCBzaW5jZSBTdW5PUyAvYmluL2NjIGNhbid0IGhhbmRsZSBpdC4KLQotV2VkIE1hciAxNiAxNjo0MzozMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERvbid0IG51a2UgdGhlIG1hY2hpbmUgaWQgZmllbGQuCi0JRnJvbSBzdWtlc0BnbHVlLnVtZC5lZHUgKFRhc3VraSBIaXJhdGEpLgotCi1XZWQgTWFyIDE2IDA3OjU1OjU0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoNCBwbGFjZXMpOiBVc2UgYSBzaW1wbGUgI2lmIG9uIEFSQ0hfU0laRSwgcmF0aGVyIHRoYW4KLQlhbGwgdGhhdCBjb252b2x1dGVkIHN0dWZmIHdpdGggTkFNRSwgQ0FUMywgZXRjLiAgVGhlIGNvbnZvbHV0ZWQKLQlzdHVmZiBicm9rZSBmb3IgU3VuT1M0IC9iaW4vY2MgKGR1ZSB0byBERUZVTiBlbGltaW5hdGlvbiwgSSBndWVzcykuCi0KLVdlZCBNYXIgMTYgMDA6MDI6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogRGV0ZWN0IHNlY3Rpb24gc3ltYm9scyBiYXNlZAotCW9uIGVpdGhlciB0aGUgbGFjayBvZiBwcml2YXRlIGRhdGEgb3IgdGhlIHN5bWJvbCBmbGFncy4gIERvIG5vdAotCW11bmdlIHNlY3Rpb24gc3ltYm9sIG5hbWVzIGFueW1vcmUgLS0gdGhleSBubyBsb25nZXIgY29uZnVzZSBHREIuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogTGVhdmUgc3BhY2UgZm9yIGFuIGV4ZWMgaGVhZGVyIGlmIHdyaXRpbmcKLQlhbiBleGVjdXRhYmxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVjb2duaXplIGJvdGggZm9ybXMgb2Ygc2VjdGlvbiBzeW1ib2wKLQluYW1lcyAiTCQwXDAwMiIgYW5kICIkPEZPTz4kIi4gIENoYW5nZSB0aGUgbmFtZSBvZiAiTCQwXDAwMiIKLQlzZWN0aW9uIHN5bWJvbHMgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhleSByZXByZXNlbnQuCi0JRGVidWdnaW5nICBzeW1ib2xzIGJlZ2luIHdpdGggIkwkMFwwMDEiLCBub3QganVzdCAiTCQiLgotCi1UdWUgTWFyIDE1IDIyOjU4OjI4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBqdW1wIHRhYmxlCi0JZm9yIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLAotCWFuZCBiZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4KLQkKLQkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogbGliYmZkLWluLmggKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiAqLWNvcmUuYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBuZXcgZnVuY3Rpb25zIGluCi0JdGhlIHRhcmdldCB2ZWN0b3Igd2hpY2ggYWxsIHBvaW50IHRvIGJmZF9mYWxzZS4KLQotCSogYW91dC10YXJnZXQuaCwgY29mZmNvZGUuaCwgZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmgsIGllZWUuYwotCWxpYmFvdXQuaCwgbGliZWNvZmYuaCwgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jCi0JRGVmYXVsdCBuZXcgdmVjdG9ycyBmb3IgY29weWluZyBwcml2YXRlIGJhY2tlbmQgZGF0YSB0byBiZmRfdHJ1ZS4KLQlEZWZhdWx0IG5ldyB2ZWN0b3IgZm9yIGRldGVybWluaW5nIGlmIGEgc3ltYm9sIGlzIGEgbG9jYWwgbGFiZWwKLQl0byBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbC4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBGb3Igbm93IGRlZmF1bHQgdG8gYmZkX3RydWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBNYXIgMTUgMjM6NTU6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IFVzZSBfYmZkX202OGtseW54X2hvd3RvX3RhYmxlLgotCi1UdWUgTWFyIDE1IDA0OjQxOjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogTW9zdCBmaWxlczoKLQlSZXBsYWNlIERFRlVOIGFuZCBERUZVTl9WT0lEIHdpdGggSyZSLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0JSW5kZW50IHNvbWUgb2YgdGhlbSB0byBHTlUgc3RhbmRhcmRzLgotCi0JKiBhb3V0MzIuYywgYXJjaHVyZXMuYywgY29yZS5jLCBjcHUtaDgzMDAuYywgY3B1LWk5NjAuYywKLQljcHUtbTY4ay5jLCBjcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsIGN0b3IuYywgZGVtbzY0LmMsCi0JZWxmMzItaHBwYS5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaW5pdC5jLCBsaWJocHBhLmgsCi0JbGliaWVlZS5oLCBsaWJvYXN5cy5oLCBuZXdzb3MzLmMsIHNvbS5oLCBzdGFiLXN5bXMuYywgc3Vub3MuYzoKLQlVcGRhdGUgY29weXJpZ2h0IHllYXJzLgotCi1Nb24gTWFyIDE0IDExOjQxOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IEEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgdGhlIHNlY3Rpb24KLQlzeW1ib2wgZm9yIHRoZSAqQUJTKiBzZWN0aW9uIGlzIHJlYWxseSBhIHJlbG9jYXRpb24gaW52b2x2aW5nCi0Jbm8gc3ltYm9sLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IHNldCBCU0ZfR0xPQkFMIG9yIEJTRl9FWFBPUlQgZm9yCi0JdW5kZWZpbmVkIHN5bWJvbHMuICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1Z2dlciBzeW1ib2xzCi0JYW5kIHNlY3Rpb24gc3ltYm9scy4KLQotCSogc29tIChzZXR1cF9zZWN0aW9ucyk6IFNldCBTRUNfREVCVUdHSU5HIGFuZCB0aGUgc2VjdGlvbiBhdHRyaWJ1dGVzCi0JZm9yIHNwYWNlcyBhbmQgc3Vic3BhY2VzLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogRml4IHR5cG8uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IEVYRUNfUCwgRF9QQUdFRCwgV1BfVEVYVCwgYW5kCi0JSEFTX1JFTE9DIGJhc2VkIG9uIHRoZSBvYmplY3QncyBtYWdpYyBudW1iZXIuCi0JKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgZnVuY3Rpb24uICBCRkQgYW5kIGl0cyB1c2VycyBhcmUKLQlwcmVwYXJlZCB0byBoYW5kbGUgbXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLgotCShzZXR1cF9zZWN0aW9ucyk6IEFsbG9jYXRlIHNwYWNlIG9uIHRoZSBCRkQncyBvYnN0YWNrIHRvIGhvbGQKLQlzZWN0aW9uIG5hbWVzLiAgVXNlIGJmZF9tYWtlX3NldGlvbl9hbnl3YXkgcmF0aGVyIHRoYW4gdGhlCi0Jb2Jzb2xldGUgbWFrZV91bmlxdWVfc2VjdGlvbi4KLQkoc29tX3ByZXBfaGVhZGVycyk6IENob29zZSB0aGUgY29ycmVjdCBTT00gbWFnaWMgbnVtYmVyIGJhc2VkCi0Jb24gdGhlIEJGRCdzIGZsYWdzLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IFJldHVybiBmYWxzZSwgbm90IE5VTEwgb24gZXJyb3IuCi0KLVNhdCBNYXIgMTIgMDk6NDY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1wcGMuYzogUmVuYW1lZCBmcm9tIGVsZjMyLXBvd2VycGMuYy4KLQkqIG5sbTMyLXBwYy5jOiBSZW5hbWVkIGZyb20gbmxtMzItcG93ZXJwYy5jLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgTWFyIDExIDIyOjI3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcG93ZXJwYy5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1cGRhdGUgdG8gcHJlbGltaW5hcnkgQUJJLgotCi1GcmkgTWFyIDExIDAwOjM0OjU5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiAgQXNzdW1lIHRoYXQgZHluYW1pYyBpbmZvCi0JaXMgYWx3YXlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24gdG8gYWxsb3cKLQlyZWNvdmVyeSBvZiB0aGUgZHluYW1pYyBpbmZvIGZyb20gYSBzdHJpcHBlZCBleGVjdXRhYmxlLgotCSogZWNvZmYuYyAoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlIFNUWVBfUERBVEEsIFNUWVBfWERBVEEKLQlhbmQgU1RZUF9DT01NRU5ULgotCi1XZWQgTWFyICA5IDE3OjE3OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4gIEl0IHdhcyBtaXNzaW5nIHNvbWUgbmVjZXNzYXJ5Ci0JY3J1ZnQgKGxpa2UgdGhlICNwcmFnbWEgYWxsb2NhIGZvciBBSVgpLgotCUluIGFkZGl0aW9uIHRvIHRoYXQgcHJvYmxlbSwgdGhlIEMgYWxsb2NhIGNhbGxzIHhtYWxsb2MsIHdoaWNoCi0JbWVhbnMgY2hlY2tpbmcgZm9yIGJlaW5nIG91dCBvZiBtZW1vcnkgY2FuJ3Qgd29yayByaWdodC4gIFRoZQotCWZvbGxvd2luZyBjaGFuZ2VzIHJlbW92ZSBhbGwgdXNlcyBvZiBhbGxvY2EgZnJvbSBCRkQuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LgotCSogc29tLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggYSBmaXhlZCBzaXplIGF1dG8gYXJyYXkuCi0JKiBhb3V0eC5oLCBlbGZjb2RlLmgsIG5sbWNvZGUuaCwgYm91dC5jLCBjb2ZmLWFscGhhLmMsIGVjb2ZmLmMsCi0JZWNvZmZsaW5rLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgcmVsb2MuYywgc29tLmMsCi0Jc3Vub3MuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBtYWxsb2MgYW5kIGFwcHJvcHJpYXRlIGVycm9yIGNoZWNraW5nIGFuZAotCWZyZWVpbmcuCi0JKiBsaW5rZXIuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBvYnN0YWNrX2FsbG9jLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgIDggMTI6MTA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9MSVRFUkFMIGxpa2UKLQlNSVBTX1JfR1BSRUwuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGYzMi1ocHBhLmgsIGVsZmNvZGUuaDogIFJlcGxhY2UgdXNlcyBvZiBFbGYqX0hhbGYsIEVsZipfV29yZCwKLQlFbGYqX09mZiB0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24sIHRoZSB0eXBlZGVmcyBoYXZlIGJlZW4KLQlyZW1vdmVkIGZyb20gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBTSFRfRFlOQU1JQyBzZWN0aW9uIGxpa2UKLQlTSFRfUFJPR0JJVFMgc2VjdGlvbi4KLQotVGh1IE1hciAgMyAyMDowMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKF9QQV9SSVNDX0lEKTogVHJlYXQgSE9TVF9IUFBBT1NGIGp1c3QgbGlrZSBIT1NUX0hQUEFCU0QuCi0KLVdlZCBNYXIgIDIgMTM6Mjg6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaVszNF04Ni1zZXF1ZW50LSouCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBBIG5vbi16ZXJvLCBub3QgemVybywKLQlyZXR1cm4gZnJvbSBiZmRfc2VlayBpbmRpY2F0ZXMgYW4gZXJyb3IuCi0JTmV3IG1hY3JvIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSB0byByZXBsYWNlCi0JVFJBRF9DT1JFX1NUQUNLX09GRlNFVC4KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6IERlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgYW5kCi0JVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGJ1dCBub3QgSE9TVF9TVEFDS19PRkZTRVQuCi0KLVdlZCBNYXIgIDIgMTE6NTc6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gc29tLmMsIGluc3RlYWQgaW5jbHVkZQotCWl0IGluIHNvbS5oLgotCi0JKiBlbGYzMi1ocHBhLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBlbGYzMi1ocHBhLmMsIGluc3RlYWQKLQlpbmNsdWRlIGl0IGluIGVsZjMyLWhwcGEuaC4KLQotCSogc29tLmMgKGxvZzIpOiBSZXR1cm4gLTEgb24gZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0JKHNldHVwX3NlY3Rpb25zKTogQnViYmxlIHVwIGFuIGVycm9yIGZyb20gbG9nMi4KLQotCSogQ2hhbmdlcyB0byBtYWtlIEhQIEMgY29tcGlsZXIgaGFwcHkgaW4gYm90aCB0cmFkaXRpb25hbAotCWFuZCBBTlNJIG1vZGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgY29ycmVjdCBlbnVtIHR5cGUgZm9yCi0JZmllbGQgcGFyYW1ldGVyLgotCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBVc2UgdW5zaWduZWQgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQgY2hhciB0byBhdm9pZCBHTlUtQyBleHRlbnNpb25zLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogUmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBzdWNjZXNzCi0Jb3IgZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZyBvbiBmYWlsdXJlLgotCi0JKiBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogRml4IHByb3RvdHlwZSB0byBtYXRjaAotCXNvbS5jIGNoYW5nZXMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBBZGQgcHJvdG90eXBlLgotCShocHBhX3NvbS1nZW5fcmVsb2NfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBhIGNvdXBsZSBjYXN0cyB0byBtYWtlIEhQIGNvbXBpbGVyIGhhcHB5LgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEbyBub3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKLQl1bnRpbCByZXN0IG9mIGNvZGUgaXMgcmVhZHkgdG8gaGFuZGxlIGl0LiAgQWJvcnQgZm9yIG5vdy4KLQotVHVlIE1hciAgMSAxODozMzo1OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyICAxIDEzOjA2OjUzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGkzODZvczlrLmM6IHVzZSBuZXcgZnVuY3Rpb25zIGJmZF9zZXRfZXJyb3IgYW5kIGJmZF9nZXRfZXJyb3IuCi0JKiBNYWtlZmlsZS5pbjogZGVsZXRlIGFuIGV4dHJhIGJsYW5rLgotCSogY29uZmlndXJlLmluIDogQWRkIGkzOTZvczlrX3ZlYy4KLQotTW9uIEZlYiAyOCAxNTo0MTowMSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIDogQWRkIGkzODYtb3M5ay4KLQkqIGNvbmZpZy9pMzg2LW9zOWsubXQgOiBOZXdseSBhZGQgb3M5ayB0YXJnZXQgbWFrZWZpbGUuCi0KLQkqIGkzODZvczlrLmMgOiBuZXcgZmlsZSB0byBoYW5kbGUgb3M5ayBmb3JtYXQgYmZkLgotCSogTWFrZWZpbGUuaW4gOiBIYW5kbGUgbmV3IGZpbGUgaTM4Nm9zOWsuYwotCSogdGFyZ2V0cy5jIDogQWRkIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyIGFuZCBpMzg2b3M5a192ZWMuCi0JKiBjYWNoZS5jIDogSW5pdGlhbGl6ZSBjYWNoZV9zZW50aW5lbCB0byAwLgotCi1TdW4gRmViIDI3IDE2OjMwOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogRml4IG1pc21hdGNoCi0JYWN0aW9uIGluIGNhc2Ugd2hlcmUgY2FsbGVyIHNwZWNpZmllZCBubyBhcmd1bWVudCByZWxvY2F0aW9uLgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFRyeSBhZ2FpbiB0byBnZXQgdGhlIHN5bV9wdHJfcHRyCi0JcmlnaHQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gYW5kIHRoZSBzdHViJ3MgcmVsb2NhdGlvbi4KLQotICAgICAgICAqIGVsZjMyLWhwcGEuaCAoaHBwYV9sb29rX2Zvcl9zdHViX2luX3NlY3Rpb24pOiBGaXggdHlwby4gIERlbGV0ZQotCXVudXNlZCBzeW1ib2xzIGFyZ3VtZW50LgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBBY2NlcHQgYXN5bWJvbCAqKiByYXRoZXIKLQl0aGFuIGFzeW1ib2wgKiBmb3Igb3JpZ2luYWwgdGFyZ2V0IHN5bWJvbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBhcHByb3ByaWF0ZWx5LgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFNldCByZWxvYy0+c3ltX3B0cl9wdHIgY29ycmVjdGx5LgotCShocHBhX2VsZl9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTm8gbG9uZ2VyIG5lZWQgc3ltYm9scwotCWFyZ3VtZW50LiAgVXNlIHRoZSBvdXRwdXQgc3ltYm9scyB3aGVuIGNhbm9uaWNhbGl6aW5nIHRoZSByZWxvY3MsCi0JY3JlYXRpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvIG5vdAotCXJlYnVpbGQvY2xvYmJlciB0aGUgb3V0cHV0IHN5bWJvbHMgaWYgdGhleSBhbHJlYWR5IGV4aXN0LgotCi1TdW4gRmViIDI3IDE1OjIyOjM2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChCRkRfU0VORCwgQkZEX1NFTkRfRk1UKTogQWRkIGRlYnVnZ2luZyB2ZXJzaW9ucyB0aGF0Ci0JY2hlY2sgYWxsIHRoZSBwb2ludGVyIGRlcmVmZXJlbmNlcy4gIEVuYWJsZWQgdmlhIERFQlVHX0JGRF9TRU5ELgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBzcmVjLmMgKGhleF92YWx1ZSk6IEFsd2F5cyBzZXQgdG8gYSBzaXplIG9mIDI1NiBieXRlcy4KLQkoc3JlY19pbml0KTogQ29zbWV0aWMgY2hhbmdlcy4KLQotU3VuIEZlYiAyNyAxMToxODo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiBTZWNvbmQgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgTW9yZSBjb21tZW50cywKLQlQQVJBTWl6ZSBhbmQgc3RhdGljaXplIHJlc3Qgb2YgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZAotCWZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIHNvbWUgZnVuY3Rpb25zLgotCUdyb3VwIHN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgaGF2ZQotCWVycm9yIGNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uLgotCUFkZCBGSVhNRXMgZm9yIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBVc2UgZW51bXMgcmF0aGVyIHRoYW4KLQkjZGVmaW5lcyBmb3IgbG90cyBvZiB0aGluZ3MuICBNZXJnZSB0d28gZnVuY3Rpb25zIHdoaWNoIGJ1aWxkCi0JbGlua2VyIHN0dWJzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHNvIHRoZXkgY2FuIGVhc2lseSBzaGFyZSBhCi0JdG9uIG9mIGNvbW1vbiBjb2RlKS4KLQotU2F0IEZlYiAyNiAxMDowMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBBZGp1c3QgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cgdG8KLQlhdm9pZCBkZXBlbmRpbmcgdXBvbiByaWdodCBzaGlmdHMgb2Ygc2lnbmVkIG51bWJlcnMsIGFuZCB0bwotCWNvcnJlY3QgaGFuZGxpbmcgb2Ygc3JjX21hc2sgd2l0aCBsb3dlciBiaXRzIHplcm8uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQkqIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlY29mZnN3YXAuaCwgc3JlYy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYzogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgaSB1bnNpZ25lZDsgcmVtb3ZlIG9sZAotCSNpZiAwIGNvZGUuCi0JKGVsZl93cml0ZV9waGRycyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBNYWtlIGkgYW5kIG5fbGVmdCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKE5BTUUoYmZkLGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IE1ha2UgaW5kZXggYXJndW1lbnQgdW5zaWduZWQuCi0KLUZyaSBGZWIgMjUgMjE6MzQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmguCi0JKHN3YXBfb3V0X3N5bXMpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQWRkIG1pc3NpbmcKLQlicmVhayBpbiBzd2l0Y2guCi0KLQkqIGhvc3RzL2kzODZ2NC5oIChxc29ydCwgc3RydG9sKTogUmVtb3ZlIGluY29ycmVjdCBhbmQgdXNlbGVzcwotCWRlY2xhcmF0aW9ucy4KLQotRnJpIEZlYiAyNSAxNjozNTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlYnVpbGRfaW5zbik6IE1vdmVkIGhlcmUgZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWRkIG5ldyBhcmd1bWVudHMuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IEFkZCBleHRlcm4gZGVjbC4KLQotCSogZWxmMzItaHBwYS5jOiBGaXJzdCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBBZGQvY2xlYW51cCBsb3RzIG9mCi0JY29tbWVudHMuICBQQVJBTWl6ZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucy4KLQlEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBtYW55IGZ1bmN0aW9ucy4gIEdyb3VwCi0Jc3RhdGljIHZhcnMgdG9nZXRoZXIuICBDb2xsYXBzZSBjb21tb24gY2FzZSBzdGF0ZW1lbnRzIHRvZ2V0aGVyCi0JaW4gbWFueSBwbGFjZXMuICBVc2UgZGVmYXVsdCBjYXNlIHdoZW4gcG9zc2libGUgaW5zdGVhZCBvZiBsaXN0aW5nCi0JZWFjaCBjYXNlIHNlcGFyYXRlbHkuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBnZXQgZXJyb3IKLQljb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcy4KLQlBZGQgRklYTUVzIGZvciBzb21lIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBEZWxldGUgaG9wZWxlc3NseSBicm9rZW4gCi0JQ09NUExFWCByZWxvY2F0aW9uIHN1cHBvcnQgKGl0J3MgbmV2ZXIgdXNlZCBhbnl3YXkpLgotCShocHBhX2VsZl9yZWJ1aWxkX2luc24pOiBEZWxldGUuICBNb3ZlZCBpbnRvIGxpYmhwcGEuaC4KLQkoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWNjZXB0IGFuZCB1c2UgbmV3IGFyZ3VtZW50cyAoc3ltZXh0IGNoYWlucykuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IEluaXRpYWxpemUgbWF0Y2hpbmdfdmVjdG9yCi0JdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IEZpeCB0eXBvLgotCi0JKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKLQlub3QgInNpemVvZiAoc29tX3N5bWJvbF90eXBlICopIi4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgotCW5vdCAic2l6ZW9mIChhc3ltYm9sIikuICBPcHBzLgotCi1GcmkgRmViIDI1IDEzOjE5OjA0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IENhbid0IHJldHVybiBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgotCShiZmRfc2V0X2dwX3NpemUpOiAgQ2FuJ3Qgc2V0IGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCi0KLUZyaSBGZWIgMjUgMTI6NTc6MDAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBEb24ndCBza2lwIHRvbyBtYW55IGNoYXJhY3RlcnMgd2hlbgotCWVuZCBvZiBsaW5lIHNlZW4uCi0KLUZyaSBGZWIgMjUgMTE6NDE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zaXplb2ZfaGVhZGVycyk6IEFsaWduIHJlc3VsdCB0byAxNiBieXRlCi0JYm91bmRhcnkuCi0KLVRodSBGZWIgMjQgMDc6MTM6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogRGVyaXZlIHN5bWJvbF9pbmZvCi0JZmllbGQgZm9yIGFic29sdXRlIHN5bWJvbHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHVuZGVmaW5lZAotCWFuZCBjb21tb24gc3ltYm9scy4KLQotVGh1IEZlYiAyNCAwNDoyOToxOSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9wKTogIENoZWNrIGZvciBjb3JlIGZpbGUgZV9tYWNoaW5lIG1hdGNoCi0JbGlrZSBpbiBlbGZfb2JqZWN0X3AuCi0KLVdlZCBGZWIgMjMgMTg6Mjg6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoYWxsb2NhKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IFVzZSBDUFVfUEFfUklTQzFfMCBmb3IgbWFnaWMKLQludW1iZXIgcmF0aGVyIHRoYW4gSFA5MDAwUzgwMF9JRC4gIE5vdGUgc29tLmMgaXMgY2FyZWZ1bAotCXRvIG1ha2Ugc3VyZSBDUFVfUEFfUklTQzFfMCBpcyBhbHdheXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyMSAxMDoxMjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBVc2UgQUxMX0NGTEFHUyB0byBzdXBwbHkKLQlmbGFncyB0byBleHBsaWNpdCBjb21waWxlIGFjdGlvbnMuCi0KLU1vbiBGZWIgMjEgMDk6NTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl93cml0ZV9zeW1oZHIpOiBTZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSBzdXJlIC5ic3Mgc2VjdGlvbgotCWVuZHMgb24gYSBwYWdlIGJvdW5kYXJ5IGlmIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCi0JKiBob3N0cy9ocDMwMC5oOiBJbmNsdWRlIDxzdGRsaWIuaD47IGRvbid0IGRlY2xhcmUgZnJlZS4KLQotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IFVzZSBhIHBvaW50ZXIgYW5kIGFsbG9jYQotCXJhdGhlciB0aGFuIGFuIGFycmF5IG9mIHZhcmlhYmxlIHNpemUuCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgbWFzayBhbmQgc2hpZnQKLQlvcGVyYXRpb24gdG8gYXZvaWQgT1NGIDEuMyBjYyBidWcuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHRleHRfc2l6ZSwgZGF0YV9zaXplCi0JYW5kIGJzc19zaXplIGJmZF9zaXplX3R5cGUgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgTWFrZQotCXRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQgYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWRkX3N0cmluZyk6IFJlbW92ZSBpbmNvcnJlY3QgY2FzdCBvZiByZXR1cm4KLQl2YWx1ZS4KLQotU3VuIEZlYiAyMCAxNjowNjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBDb25zaWRlcgotCXN5bWJvbHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcC4KLQotU2F0IEZlYiAxOSAwMzoxNzozMiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sCi0JYWRkIG1pc3NpbmcgZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQkqIG1pcHNic2QuYyAobWlwc19maXhfaGkxNl9zKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0KLUZyaSBGZWIgMTggMTE6NDE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgUG93ZXJQQyBOZXRXYXJlLgotCSogbmxtMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtbmxtLgotCSogY29uZmlnL3BwYy1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQlubG0zMi1wb3dlcnBjLm8sIG5sbTMyLm8sIG5sbS5vLgotCSogdGFyZ2V0cy5jIChubG0zMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgbmxtMzItcG93ZXJwYy5vLgotCShDRklMRVMpOiBBZGQgbmxtMzItcG93ZXJwYy5jLgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4gIERvbmUgd2l0aG91dCBhbiBBQkksIGFuZAotCXByb2JhYmx5IHRvIGJlIGNoYW5nZWQgd2hlbiBJIGdldCBhbiBBQkkuCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotc3lzdjQqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1lbGYuCi0JKiBjb25maWcvcHBjLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQllbGYzMi1wb3dlcnBjLm8sIGVsZjMyLm8sIGVsZi5vLgotCSogZWxmMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX3Bvd2VycGMgY2FzZS4KLQkoZWxmX3NldF9hcmNoX21hY2gpOiBMaWtld2lzZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1wb3dlcnBjLm8uCi0JKENGSUxFUyk6IEFkZCBlbGYzMi1wb3dlcnBjLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLVRodSBGZWIgMTcgMTU6Mjk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSB6ZXJvIHN5bWJvbHMKLQlyZWFzb25hYmx5LiAgQWxsb2NhdGUgeF9zeW1wIHVzaW5nIGFsbG9jYS4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEVMRiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzCi0JbXVzdCBiZSBzb3J0ZWQgYnkgbG9hZCBhZGRyZXNzLiAgVGhpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbnRyaWVzCi0JaW4gcmV2ZXJzZSBvcmRlci4KLQotCSogc2VjdGlvbi5jIChTRUNfSU5fTUVNT1JZKTogRGVmaW5lLgotCShhc2VjdGlvbik6IFJlbmFtZSB1bnVzZWQgZmllbGQgb3RoZXJ1c2VyZGF0YSB0byBjb250ZW50cywgYW5kCi0JbWFrZSBpdCBjaGFyICouCi0JKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogSW5pdGlhbGl6ZSBjb250ZW50cyBmaWVsZCB0byBOVUxMLgotCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiBTRUNfSU5fTUVNT1JZIGlzIHNldCwgZ2V0IHNlY3Rpb24KLQljb250ZW50cyBmcm9tIGNvbnRlbnRzIGZpZWxkIHJhdGhlciB0aGFuIGZyb20gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVGh1IEZlYiAxNyAwODozMDo1MyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yLCBiZmRfc2V0X2Vycm9yKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2Vycm9yKTogTWFrZSBzdGF0aWMuCi0JKGJmZF9lcnJvcl90eXBlKTogUmVuYW1lZCBmcm9tIGJmZF9lYy4gIFByZXBlbmQgImJmZF9lcnJvcl8iIHRvCi0JYWxsIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwgCi0JYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgCi0JYmZkLmMsIGJvdXQuYywgY2FjaGUuYywgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgCi0JY29mZi1yczYwMDAuYywgY29mZmNvZGUuaCwgY29mZmdlbi5jLCBjb3JlLmMsIGN0b3IuYywgCi0JZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgCi0JZWxmY29kZS5oLCBmb3JtYXQuYywgaGFzaC5jLCBocDMwMGhwdXguYywgaHBwYWJzZC1jb3JlLmMsIAotCWkzODZseW54LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmVsZi5oLCBsaW5rZXIuYywgCi0JbHlueC1jb3JlLmMsIG5sbS5jLCBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIAotCW5sbTMyLXNwYXJjLmMsIG5sbWNvZGUuaCwgb2FzeXMuYywgb3BuY2xzLmMsIG9zZi1jb3JlLmMsIAotCXB0cmFjZS1jb3JlLmMsIHJlbG9jMTYuYywgcnM2MDAwLWNvcmUuYywgc2VjdGlvbi5jLCBzb20uYywgCi0Jc3JlYy5jLCBzdW5vcy5jLCBzeW1zLmMsIHRhcmdldHMuYywgdGVraGV4LmMsIAotCXRyYWQtY29yZS5jOiBDaGFuZ2UgY2FsbGVycy4KLQotVHVlIEZlYiAxNSAyMjoyNzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmM6IFJlbW92ZSBGSVhNRXMgZm9yIHRoaW5ncyB3aGljaCBoYXZlIGJlZW4gZGVhbHQgd2l0aC4KLQotVHVlIEZlYiAxNSAxOTozOToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIHRoaXMgZnVuY3Rpb24gcmVhZHMKLQl1bnJlbG9jYXRlZCBjb250ZW50cywgdGhlIHNlY3Rpb24ncyByYXcgc2l6ZSBpcyBhbHdheXMgdGhlIG9uZSB0bwotCXVzZSBmb3IgYm91bmRzIGNoZWNraW5nLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogSW4gYXNzZXJ0aW9uLCBjb21wYXJlCi0JbGlua19vcmRlciBzaXplIGZpZWxkIGFnYWluc3QgY29va2VkIHNpemUsIG5vdCByYXcgc2l6ZSwgb2YgaW5wdXQKLQlzZWN0aW9uLgotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEZvciBCU1Mgc2VjdGlvbiwganVzdAotCXJldHVybiAwLgotCShhbGlnbmNvZGUpOiBXaGVuIHNocmlua2luZywgdGhlIGFkZGVuZCBzaG91bGQgYmUgc2V0IHRvIHRoZQotCWN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHBsdXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBwYWRkaW5nCi0JdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHJldGFpbmVkLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogSWYgYSBzZWN0aW9uIGNvbnRhaW5zIG5vIHJlbG9jYXRpb25zLCBkb24ndAotCWJvdGhlciBwcm9jZXNzaW5nIHRoZW0uCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFNldCByZWxvY19kb25lLiAgQXNzZXJ0Ci0JdGhhdCBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgcmV0dXJucyB0cnVlLiAgQ2hlY2sgdGhhdCByZWxvY3MgYXJlCi0JcHJvcGVybHkgb3JkZXJlZC4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFMSUdORE9ORSk6IEFzc2VydAotCXRoYXQgcmVsb2MtPmFkZGVuZCBmYWxscyBiZXR3ZWVuIHRoZSBjdXJyZW50IHNvdXJjZSBvZmZzZXQgYW5kIHRoZQotCXJhdyBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgotCi0JKiBjb25maWcuYmZkOiBTdXBwb3J0IGk5NjAgdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCB3aXRoIGNvZmYsIG5vdAotCWJvdXQuICBEZWZhdWx0IHdpdGggbm8gdmVyc2lvbiBudW1iZXIgaXMgc3RpbGwgYm91dC4gIFN1cHBvcnQKLQlleHBsaWNpdCBpOTYwLWNvZmYgdGFyZ2V0IHRvby4KLQotCSogYm91dC5jOiBDaGFuZ2VkIHNvbWUgaW5kZW50YXRpb24sIGRlbGV0ZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKLQlmaXhlZCBzb21lIGNvbW1lbnRzLCByZW1vdmVkIHNvbWUgIiNpZiAxIiBsaW5lcy4KLQkob3V0cHV0X2FkZHIpOiBOZXcgbWFjcm8uCi0JKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssIGdldF92YWx1ZSwgYWJzMzJjb2RlLCBhbGlnbmNvZGUsCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGl0IGZvciByZWFkYWJpbGl0eS4KLQotVHVlIEZlYiAxNSAwOTowMDoxNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJdGVyYXRlIHRocm91Z2ggdGhlIFNPTQotCXN5bWJvbHMsIG5vdCB0aGUgQkZEIHN5bWJvbHMuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTQgMjI6NTU6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IGRpZSBpZiBhIEJGRCBkb2Vzbid0Ci0JaGF2ZSBhbnkgc3ltYm9scy4KLQotCSogRmluaXNoIGJhc2ljIHJlYWQtd3JpdGUgc3VwcG9ydCBmb3IgU09NIGFyY2hpdmUgbGlicmFyaWVzLiAgQnVncwotCXN1cmVseSByZW1haW4gYXMgdGhpcyBoYXNuJ3QgYmVlbiB0ZXN0ZWQgYWxsIHRoYXQgbXVjaC4KLQkqIHNvbS5jIChTT01fTFNUX0hBU0hfU0laRSwgU09NX0xTVF9NT0RVTEVfTElNSVQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIG5lY2Vzc2FyeQotCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0JKHNvbV9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbiB0byBkZXJpdmUgaW5mbyBuZWNlc3NhcnkKLQl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSBuZXcgZnVuY3Rpb24gdG8gZGVyaXZlIG1pc2MKLQlzeW1ib2wgaW5mb3JtYXRpb24uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBVcGRhdGUgYmFja2VuZCBwcml2YXRlIGRhdGEgZm9yIHN5bWJvbHMKLQlhcHByb3ByaWF0ZWx5LgotCShzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3N5bWJvbF9oYXNoKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX2FybWFwKTogRmxlc2ggb3V0LgotCShzb21fdmVjKTogRml4IGFyIHBhZGRpbmcgY2hhcmFjdGVyLgotCi0JKiBzb20uYzogQ29uc2lzdGVudGx5IHVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0KLU1vbiBGZWIgMTQgMTc6MDI6MjggMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIEFkZCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LCB1c2UgSE9TVF9BSVgsIHdoZXJlCi0JYXBwcm9wcmlhdGUuCi0JKiByczYwMDAtY29yZS5jOiAgVXNlIEhPU1RfQUlYIGluc3RlYWQgb2YgQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDAubWg6ICBSZW1vdmUgZGVmcyBvZiBBUkNISVZFU19QTEVBU0UgYW5kCi0JQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgVHVybiBvbiBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvcnM2MDAwLmg6ICAjZGVmaW5lIEhPU1RfQUlYLgotCSogaG9zdHMvcnM2MDAwbHlueC5oOiAgQ3JlYXRlIHRoaXMgdG8gZW5hYmxlIEx5bnggaG9zdCBzdXBwb3J0LgotCi1TdW4gRmViIDEzIDE0OjMwOjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc29tX3N5bWJvbF9kYXRhKTogU2FmZWx5IGFjY2VzcyBiYWNrZW5kIHByaXZhdGUgZGF0YQotCWZvciBCRkQgc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIFJlYWQtb25seSBTT00gYXJjaGl2ZSBzdXBwb3J0LgotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KLQkoc29tX3NsdXJwX2FybWFwKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBTT00gTFNULgotCi0JKiBzb20uaDogSW5jbHVkZSA8bHN0Lmg+IGFuZCA8YXIuaD4uCi0KLVNhdCBGZWIgMTIgMjI6MzQ6MTQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRml4IHR5cG8uCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBwcmVwX2hlYWRlcnMgYW5kCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxMSAxNjo1Njo1MCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKSBbVk1TXTogQ2FsbCBtYWxsb2MsIG5vdCBiZmRfeG1hbGxvYy4KLQkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgcmVzdWx0IG9mIG5vcm1hbGl6ZS4KLQotVHVlIEZlYiAgOCAwODo1NzozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlNYWtlIGFsbCBjYWxsZXJzIG9mIG1hbGxvYyBvciByZWFsbG9jIChpbmNsdWRpbmcgdmlhIG9ic3RhY2tzKQotCWNoZWNrIHRoZSByZXN1bHQgZm9yIE5VTEwuICBNb3N0IHNldCBiZmRfZXJyb3IgdG8gbm9fbWVtb3J5IGFuZAotCXJldHVybiBpbiB0aGF0IGNhc2U7IGEgZmV3IGFyZSBoYXJkZXIgdG8gZml4LCBhbmQgYXJlIG1hcmtlZAotCXdpdGggIkZJWE1FIDxyZXR1cm4gdHlwZT4iLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDaGVjayBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgcmV0dXJuLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERpdHRvCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRGl0dG8uCi0KLQkqIHRla2hleC5jIChmaW5kX2NodW5rIHRla2hleF9ta29iamVjdCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayBiZmRfemFsbG9jLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykgTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIHN0cmluZ2hhc2guYyAoX2JmZF9zdHJpbmd0YWJfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCi0KLQkqIHNyZWMuYzogSW5kZW50LgotCShmaWxsdXBfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIHZvaWQKLQkoc3JlY19ta29iamVjdCBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0Jc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4gCi0JKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgotCShzb21fbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgb2FzeXNfYXJjaGl2ZV9wCi0Jb2FzeXNfbWtvYmplY3Qgb2FzeXNfb2JqZWN0X3Agb2FzeXNfbmV3X3NlY3Rpb25faG9vawotCW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLgotCShvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCi0JKG9hc3lzX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogbmxtY29kZS5oIChubG1fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMKLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotCShhcmNoaXZlX2hhc2hfbmV3ZnVuYwotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGJmZF9uZXdfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBpZWVlLmM6IEluZGVudC4KLQkocmVhZF9pZCBnZXRfc3ltYm9sIGdldF9zZWN0aW9uX2VudHJ5IGllZWVfYXJjaGl2ZV9wIGllZWVfb2JqZWN0X3AKLQlpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBpZWVlX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCi0JKGRvX29uZSk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgaXQuCi0JKGluaXRfZm9yX291dHB1dCk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBpdC4KLQkoZG9fd2l0aF9yZWxvY3MpOiAgQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKTogRGl0dG8uICBGSVhNRSB2b2lkLgotCShpZWVlX21rb2JqZWN0KTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96bWFsbG9jLgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCShocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogRGl0dG8uCi0JKHdyaXRlX3JlbG9jcyk6IERpdHRvLiAgRklYTUUgdm9pZAotCShlbGZfbWFwX3N5bWJvbHMgYXNzaWduX3NlY3Rpb25fbnVtYmVycyBtYXBfcHJvZ3JhbV9zZWdtZW50cyk6Ci0JRGl0dG8uICBSZXR1cm4gYSBib29sZWFuLiAKLQkoc3dhcF9vdXRfc3ltcyk6IERpdHRvLiAgQ2hlY2sgZWxmX21hcF9zeW1ib2xzLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRGl0dG8uCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJldHVybiBhIGJvb2xlYW4uCi0JQ2hlY2sgbWFwX3Byb2dyYW1fc2VnbWVudHMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBpdC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogQ2hlY2sgYmZkX3ptYWxsb2MgYW5kCi0JcmVhbGxvYy4gCi0JKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEaXR0by4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDaGVjayBiZmRfemFsbG9jLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERpdHRvLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBpdC4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVjb2ZmX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQKLQlfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLiAKLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBjdG9yLmMgKGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYSBib29sZWFuLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIGludAotCShjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2hlY2sgYmZkX2FsbG9jLgotCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKiBsaWJjb2ZmLWluLmg6IENoYW5nZSBkZWNscyBvZiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsCi0JY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sKLQljb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0KLQkqIGNvZmZjb2RlLmg6IEluZGVudC4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhCi0JYm9vbGVhbi4gCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXApOiBEaXR0by4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfcmVhbGxvYyB2YWx1ZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJmZF9hbGxvYwotCXJldHVybiB2YWx1ZS4gIFJldHVybiBib29sZWFuIHZhbHVlLgotCShOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpKTogQ2hlY2sgYmZkX3phbGxvYyByZXR1cm4gdmFsdWUuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZfYWxsb2MgYW5kIGJmZF96YWxsb2MKLQlyZXR1cm4gdmFsdWUuCi0JKGFkZF90b19zdHJpbmd0YWIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIHJldHVybiB2YWx1ZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogQ2hlY2sgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRGl0dG8uCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4KLQotCSogb3BuY2xzLmMgKGJmZF96YWxsb2MgYmZkX3JlYWxsb2MpOiBDaGVjayByZXN1bHQgb2YgYmZkX2FsbG9jLgotCi0JKiBvcG5jbHMuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKF9iZmRfbmV3X2JmZCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgotCi0JKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShpZWVlX2FyY2hpdmVfcCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAotCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KLQotCSogaGFzaC5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoYmZkX2hhc2hfdGFibGVfaW5pdF9uKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCi0Jb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgotCShiZmRfaGFzaF9sb29rdXApOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvciBOVUxMIHJldHVybi4KLQotCSogZWNvZmZsaW5rLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBvYnN0YWNrX2FsbG9jLgotCShhZGRfZmlsZV9zaHVmZmxlIGFkZF9tZW1vcnlfc2h1ZmZsZSk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yCi0JTlVMTCByZXR1cm4uICBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCi0JKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYWRkX2ZpbGVfc2h1ZmZsZQotCWFuZCBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLiAKLQkoc3RyaW5nX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZCBiZmRfaGFzaF9uZXdmdW5jLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWNvZmZfYWRkX3N0cmluZyk6IENoZWNrIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uCi0KLQkqIGxpYmJmZC1pbi5oICh4bWFsbG9jLCBiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KToKLQlSZW1vdmUgZGVjbHMuIAotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLUZyaSBGZWIgMTEgMTU6MzU6MzIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgTHlueC9yczYwMDAgc3VwcG9ydC4KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogIEVuYWJsZSBhLm91dCBmaWxlIHN1cHBvcnQuCi0JKiBjb25maWcvcnM2MDAwbHlueC5taDogIEx5bngvcnM2MDAwIGhvc3Qgc3VwcG9ydC4KLQotRnJpIEZlYiAxMSAxNzoyNTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZXdyaXRlIHNvbWV3aGF0IHRvIGltcHJvdmUKLQltZW1vcnkgdXNhZ2UuCi0KLUZyaSBGZWIgMTEgMTM6MTA6NDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byAnXG4nIGluIGFyY2hpdmUgbWFnaWMKLQl0byAnXDAxMicsIGZvciBncmVhdGVyIHBvcnRhYmlsaXR5LgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfYXJtYXApOiBEaXR0by4KLQotVGh1IEZlYiAxMCAxMjo1ODo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bwotCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgotCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8pOiBBZGRlZCBpbmZvCi0JZmllbGQuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KLQlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCi0KLVdlZCBGZWIgIDkgMjE6MzQ6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcmVsb2NfcXVldWVfZmluZCk6IERvIG5vdCBleGFtaW5lIGEgTlVMTCBxdWV1ZSBlbnRyeS4KLQotCSogc29tLmM6IENhc3QgcmV0dXJuIHZhbHVlcyBmcm9tIEJGRCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0bwotCWF2b2lkIHdhcm5pbmdzIGZyb20gdGhlIEhQIGNvbXBpbGVyLgotCi1XZWQgRmViICA5IDEyOjU1OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQWNjZXB0IGEgTElURVJBTAotCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KLQotCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IENhc3Qgc3RhdHVzIGVsZW1lbnRzCi0Jd2hlbiBwYXNzaW5nIHRoZW0gdG8gc3ByaW50Zi4gIFVzZSAlbGQgaW5zdGVhZCBvZiAlZC4KLQotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9ta2FyY2hpdmUpOiBSZXR1cm4gZmFsc2UuCi0JKHJzNjAwMF9jb2ZmX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUgZXJybm87IGl0J3Mgbm90IHVzZWQuCi0JQWxzbyByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBuYW1lbGVuLgotCShyczYwMDBjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBvcmxfY291bnQgYW5kIHN0cmlkeCBwYXJhbWV0ZXJzLgotCi1UdWUgRmViICA4IDE4OjAwOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHhtYWxsb2MpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlciB0eXBlLCB0byBhdm9pZAotCWNvbmZsaWN0cy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgRmViICA4IDE1OjU1OjUwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogTmV3IGZ1bmN0aW9uLgotCShhbHBoYV9ob3d0b190YWJsZSk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uIHRvIHByZXZlbnQgY2VydGFpbgotCXJlbG9jcyBmcm9tIGJlaW5nIGFkanVzdGVkIGJ5IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJR05PUkUKLQlyZWxvYyBzaG91bGQgYmUgcGFydGlhbF9pbnBsYWNlLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBY2NlcHQgYSBMSVRFUkFMCi0JcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmMzItaHBwYS5jIChDVVJSRU5UX1NUVUJfT0ZGU0VULCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENhc3QgdG8gY2hhciAqIGluc3RlYWQgb2YgaW50Ci0JYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1Nb24gRmViICA3IDIwOjU2OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW9zZiopOiBVc2UgYmZkX25hbWUgaHBwYW9zZiBmb3IgdGhpcwotCWNvbmZpZ3VyYXRpb24uCi0JKGhwcGEqLSotKmVsZiopOiBUaGlzIGNvbmZpZ3VyYXRpb24gdXNlZCBocHBhLWVsZiBub3cuCi0KLQkqIHNvbS5jOiBUaGlzIGZpbGUgaXMgYWxzbyB1c2VkIGZvciBIT1NUX0hQUEFPU0YuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBFbmFibGUgc29tX3ZlYyBmb3IgSE9TVF9IUFBBT1NGLgotCi0JKiBob3N0cy9ocHBhb3NmLmg6IE5ldyBob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotCSogY29uZmlnL2hwcGFic2QubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9ocHBhX3ZlYyBhcwotCUJTRCBoYW5kbGVzIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0IGZpbGVzLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEZWxldGUuICBObyBsb25nZXIgbmVlZGVkLgotCShSQU5MSUIpOiBEb2Vzbid0IGRvIGFueXRoaW5nLCBkZWZpbmUgaXQgdG8gYmUgImVjaG8iLgotCi0JKiBjb25maWcvaHBwYW9zZi5tdDogTmV3IHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYSBQQSBydW5uaW5nCi0JT1NGMS4KLQotTW9uIEZlYiAgNyAxNTowMjowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZGVkIGJmZF9hcmNoX3Bvd2VycGMuCi0JKGFyY2h1cmVzX2luaXRfdGFibGUpOiBJZiBTRUxFQ1RfQVJDSElURUNUVVJFUyBpcyBub3QgZGVmaW5lZCwKLQlhZGRlZCBiZmRfcG93ZXJwY19hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY3B1LXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTLCBDRklMRVMpOiBBZGRlZCBjcHUtcG93ZXJwYy5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEdldCB2bWEgYW5kIGFsaWdubWVudF9wb3dlcgotCW9mIGFuIFNIVF9TVFJUQUIgc2VjdGlvbiBmcm9tIHNoX2FkZHIgYW5kIHNoX2FkZHJhbGlnbiwgcmF0aGVyCi0JdGhhbiBqdXN0IHNldHRpbmcgdGhlbSB0byB6ZXJvLgotCi1TdW4gRmViICA2IDIwOjA0OjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMsIHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KLQlmcm9tIGJmZF9uZXdfc3RydGFiLiAKLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGZvciBmYWxzZSByZXR1cm4gZnJvbQotCXN3YXBfb3V0X3N5bXMuIAotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0JZnJvbSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiBzeW1zLmM6IE1ha2UgZXhhbXBsZSBhcHBsaWNhdGlvbiBpbiBkb2MgY2FsbCB4bWFsbG9jLCBub3QKLQliZmRfeG1hbGxvYy4gCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpLAotCWFvdXRfbGlua19nZXRfc3ltYm9scywgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKToKLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUsIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKToKLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiAKLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiAKLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IAotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiAKLQkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IAotCSogZWxmY29kZS5oIChiZmRfbmV3X3N0cnRhYik6IAotCShiZmRfYWRkXzJfdG9fc3RydGFiKTogCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAKLQkoZWxmX2NvcmVmaWxlX25vdGUpOiAKLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IAotCVVzZSBtYWxsb2MgYW5kIGNoZWNrIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgYmZkX3htYWxsb2MuCi0KLVNhdCBGZWIgIDUgMTI6Mzk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFB1dCBtNjgqLSotc3lzdiogbGluZSBhZnRlciBtNjgqLSotc3lzdjQqLgotCi1TYXQgRmViICA1IDA1OjMyOjQ0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6ICBQdXQgQ09OU1Qga2V5d29yZCBmb3IgInNyYyIgYmVmb3JlCi0JInVuc2lnbmVkIiwgc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBpdCBhZnRlciAidW5zaWduZWQiLgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiAgUmVuYW1lICJ2YWx1ZSIgdG8KLQkidmFsIiBpbiBwcm90b3R5cGUgZGVjbGFyYXRpb24gYmVjYXVzZSBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlCi0JYXJndW1lbnRzIHdob3NlIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyB0eXBlcy4KLQotU2F0IEZlYiAgNSAwMToxNDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyCi0Jb2JqZWN0IGZpbGUgZGVmaW5lcyBzeW1ib2wuICBBbHNvLCBpZiBza2lwcGluZyBhIHN5bWJvbCwgc2tpcCB0aGUKLQlzZWNvbmQgc3ltYm9sIG9mIGEgTl9XQVJOSU5HIG9yIE5fSU5EUiBzeW1ib2wgYXMgd2VsbC4KLQotRnJpIEZlYiAgNCAyMzo1NTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgYmFzaWMgc3VwcG9ydCBmb3Igd3JpdGluZyBSUy82MDAwIFhDT0ZGIGZpbGVzLgotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MpOiBSZW1vdmVkLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogRGVmaW5lZCBYQ09GRiByZWxvY3MuCi0JKFJUWVBFMkhPV1RPKTogRGVmaW5lZCB0byB1c2UgcnM2MDAwY29mZl9ydHlwZTJob3d0by4KLQkocnM2MDAwY29mZl9ydHlwZTJob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmVkIHRvIHVzZQotCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuIAotCShyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShTRUxFQ1RfUkVMT0MpOiBEZWZpbmVkIHRvIHNldCByX3R5cGUgYW5kIHJfc2l6ZSBmaWVsZHMuCi0JKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmVkLgotCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IENoYW5nZWQgZml4X3RhZyBhbmQgZml4X2VuZAotCWZpZWxkcyB0byBiaXRmaWVsZHMuICBBZGRlZCBmaWVsZHMgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuLgotCShzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNUWVBfREVCVUcgaXMgZGVmaW5lZCwgdXNlIGl0IHJhdGhlciB0aGFuCi0JU1RZUF9JTkZPIGZvciB0aGUgdHlwZSBvZiBhIHNlY3Rpb24gbmFtZWQgLmRlYnVnLgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUgaWYgUlM2MDAwQ09GRl9DLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgZG9uJ3QgY2FsbAotCWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIHRoZW4gaWYgdGhlIGxhc3QgYXV4Ci0JZW50cnkgaGFzIHR5cGUgU1RZX0xEIGNoYW5nZSB0aGUgeF9zY25sZW4gaW50byBhIHBvaW50ZXIgdG8gYQotCXN5bWJvbCBhbmQgc2V0IGZpeF9zY25sZW4uICBBbHNvLCBmb3IgYSBDX0JTVEFUIHN5bWJvbCwgY2hhbmdlIHRoZQotCXZhbHVlIGludG8gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGFuZCBzZXQgZml4X3ZhbHVlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogUmVpbmRlbnQuICBJZiBmaXhfdmFsdWUgaXMgc2V0LAotCWdldCB0aGUgc3ltYm9sIG9mZnNldC4gTGlrZXdpc2UgZm9yIGZpeF9zY25sZW4uCi0JKHN0cmluZ19zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KLQkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogSWYgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsCi0Jd3JpdGUgdGhlIHN5bWJvbCBuYW1lIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uOyBhc3N1bWUgdGhhdCB0aGUKLQlzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoIHRoZSByaWdodCBzaXplLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJbml0aWFsaXplIGRlYnVnX3N0cmluZ19zaXplIHRvIDAuICBJZgotCWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLCBkb24ndCBwdXQgc3ltYm9sIG5hbWUgaW4KLQl1c3VhbCBzdHJpbmcgdGFibGUuICBBZnRlciB3cml0aW5nIG91dCBhbGwgc3ltYm9scywgaWYKLQlkZWJ1Z19zdHJpbmdfc2l6ZSBpcyBub3QgMCwgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZQotCS5kZWJ1ZyBzZWN0aW9uLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENsZWFyIG5ldyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4KLQlmaWVsZHMuICBJZiB0aGUgc3RyaW5nIG9mZnNldCBpcyAwLCBhbHdheXMgdXNlIGFuIGVtcHR5IHN0cmluZyBhcwotCXRoZSBuYW1lLgotCShjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogV29yayBhcm91bmQgb25lIGdyb3NzIGhhY2sKLQl3aXRoIGFub3RoZXI6IGFjdHVhbGx5IGxvb2sgYXQgdGhlIHRhcmdldCBuYW1lIHRvIGF2b2lkIHRoZSBicm9rZW4KLQlDT0ZGIGNoZWNrLgotCShiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMjYsCi0JQkZEX1JFTE9DX1BQQ19CQTI2IGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgRmViICA0IDE3OjI4OjMyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogQ2FsbCBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4KLQkoYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IEZ1bmN0aW9ucyBkZWxldGVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nIHhtYWxsb2MgYW5kIGRlY2xhcmUKLQl4bWFsbG9jLiAKLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UaHUgRmViICAzIDE2OjQ5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBJZiBhIHNtYWxsIHVuZGVmaW5lZAotCXN5bWJvbCBoYXMgYSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sIGJ1dCBub3QgaW4gdGhlIEJGRCBzeW1ib2wsCi0Ja2VlcCB0aGUgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbC4gIFRoaXMgaGVscHMgZ2FzLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHJlcXVpcmUgdGhhdCBhbGwKLQlyZWZlcmVuY2VzIHRvIGEgY29tbW9uIHN5bWJvbCBiZSB0aGVtc2VsdmVzIGNvbW1vbiBzeW1ib2xzLgotCi0JKiBhb3V0eC5oIChhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24pOiBIYW5kbGUgTl9VTkRGLgotCi1XZWQgRmViICAyIDIwOjM3OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYywgYmZkLWluLmgsIGhvc3RzL2FscGhhb3NmLmgsIGhvc3RzL3NwYXJjLWxsLmgsIGFvdXRmMS5oLAotCXNwYXJjbHlueC5jLCBNYWtlZmlsZS5pbjogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEZlYiAgMiAxMjozMDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSB0eXBlCi0JYW5kIHNpemUgY29ycmVjdGx5LgotCShjb2ZmX3N3YXBfYXV4X2luKTogSWYgUlM2MDAwQ09GRl9DLCBjaGFuZ2UgeF9jc2VjdC54X3NjbmxlbiB0bwotCXhfY3NlY3QueF9zY25sZW4ubCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpLCBjb2ZmLWFscGhhLmMKLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIGNhc3RzIG9mIGF1eF9pbiBhbmQgYXV4X291dAotCWZpZWxkcyB0byBtYXRjaCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFNFTEVDVF9SRUxPQyBpcyBkZWZpbmVkLCBwYXNzCi0JaW4gdGhlIGludGVybmFsX3JlbG9jIGl0c2VsZiwgbm90IHRoZSB0eXBlLgotCSogY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtbTY4ay5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogQ2hhbmdlZAotCWRlZmluaXRpb24gb2YgU0VMRUNUX1JFTE9DIGFjY29yZGluZ2x5LgotCi1UdWUgRmViICAxIDEyOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgbmV3IGFyZ3VtZW50cyB0bwotCV9iZmRfY29mZl9zd2FwX2F1eF9pbiBhbmQgX2JmZF9jb2ZmX3N3YXBfYXV4X291dDogYXV4IGluZGV4IG51bWJlcgotCWFuZCBudW1iZXIgb2YgYXV4IGVudHJpZXMuCi0JKGJmZF9jb2ZmX3N3YXBfYXV4X2luLCBiZmRfY29mZl9zd2FwX2F1eF9vdXQpOiBDaGFuZ2VkCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6IEFjY2VwdCBuZXcKLQlhcmd1bWVudHMuICBJZiBSUzYwMDBDT0ZGX0MsIG9ubHkgdHJlYXQgQ19FWFQgYW5kIENfSElERVhUCi0Jc3BlY2lhbGx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgYXV4IGVudHJ5LgotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCwgY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQYXNzCi0JbmV3IGFyZ3VtZW50cyB0byBzd2FwX2F1eCBmdW5jdGlvbnMuCi0KLVN1biBKYW4gMzAgMTU6MTQ6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IFNldCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gcHJlcHJvY2Vzc29yIG1hY3JvcwotCShvbmx5IHRlc3RpbmcgZm9yIG02OGsgYW5kIHZheCBhdCB0aGUgbW9tZW50KTsgZG8gdmVyaWZ5IHRoYXQgdGhlCi0JcHJlcHJvY2Vzc29yIGRpZG4ndCB0cmFzaCB0aGUgYXJjaCBuYW1lIGluc2lkZSB0aGUgc3RyaW5nIHZlcnNpb24uCi0JRG9uJ3QgcHJpbnQgb3V0ICJwYWdlc2l6ZSA9IiBsaW5lIHRoYXQgcHJldmVudHMgb3V0cHV0IGZyb20KLQljb21waWxpbmcuICBEZXJpdmUgQllURVNfSU5fV09SRCBhbmQgQVJDSCB2YWx1ZXMgZnJvbSBzaXplb2YKLQlyZXN1bHRzLgotCSogTWFrZWZpbGUuaW4gKGFvdXQtcGFyYW1zLmgpOiBQYXNzIGdlbi1hb3V0IGEgZHVtbXkgdGFyZ2V0IG5hbWUuCi0JKGNoZWNrLCBpbnN0YWxsY2hlY2spOiBJZGVudGlmeSBkaXJlY3RvcnkgaW4gIm5vIHRlc3RzdWl0ZXMiCi0JbWVzc2FnZS4KLQotU3VuIEphbiAzMCAxMzoyNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IGNvcnJlY3QgdmFsdWUgZm9yCi0Jb2JqZWN0IGZpbGUgc3ltYm9sLgotCi1GcmkgSmFuIDI4IDE4OjM0OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3ZheGJzZC5oIChIT1NUX1NUQUNLX0VORF9BRERSKTogVmF4IEJTRCBkb2Vzbid0IGRlZmluZQotCUtFUk5CQVNFLCBzbyBoYXJkLWNvZGUgMHg4MDAwMDAwMCBpbnN0ZWFkLgotCi1UaHUgSmFuIDI3IDEzOjU0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBJZiBzeW1ib2wgaXMgY29tbW9uLAotCXNldCB0aGUgQlNGX09MRF9DT01NT04gZmxhZy4KLQotV2VkIEphbiAyNiAxMzo0NzoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBQdXQgdGhlIG5ldyBlbnRyeSBpbiB0aGUKLQljb3JyZWN0IGVsZW1lbnQgb2YgbWF0Y2hpbmdfdmVjdG9yLgotCi1UdWUgSmFuIDI1IDExOjQzOjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzb20uYywgc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcywKLQliZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBDaGFuZ2UgcGFyYW1ldGVycyBmcm9tIGNoYXIKLQl0byBpbnQuICBGb2xsb3dpbmcgYSBwcm90b3R5cGUgd2l0aCBhbiBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbgotCWluIHRoZSBwcmVzZW5jZSBvZiB3aWRlbmVkIHBhcmFtZXRlcnMgaXMgYSBHQ0MtaXNtIG5vdCBzdXBwb3J0ZWQKLQlieSB0aGUgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgotCi1UdWUgSmFuIDI1IDExOjQ2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogU2l6ZSBvZiB0eXBlIC0yIGlzIDQgYnl0ZXMsIG5vdCAyLgotCi0JKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc3ltYm9scwotCWJlZm9yZSB3cml0aW5nIG91dCB0aGUgcmVsb2NzLCBzbyB0aGF0IHRoZSByaWdodCBzeW1ib2wgaW5kaWNlcwotCWFyZSB1c2VkLgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERvIG5vdAotCXRyeSB0byBvdmVybGF5IHRoZSBpbnRlcm5hbCBjYXJzeW1zIG9uIHRoZSBleHRlcm5hbCBzeW1kZWZzLiAgVGhhdAotCWNhbiBub3Qgd29yayBpZiB0aGUgc2l6ZSBvZiBhIGhvc3QgcG9pbnRlciBpcyBsYXJnZXIgdGhhbiA0IGJ5dGVzLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FzdCByZXN1bHQgb2YKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogQXZvaWQgQU5TSSBDIHByb3RvdHlwZS4KLQotCSogYXJjaGl2ZS5jOiBSZWluZGVudGVkIHRvIEdOVSBzdGFuZGFyZHMuCi0KLU1vbiBKYW4gMjQgMTQ6NDE6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkLCBfYmZkX25ld19iZmRfY29udGFpbmVkX2luKTogQWRkCi0JIl9iZmRfIiB0byBmdW5jdGlvbiBuYW1lcy4KLQkqIGFyY2hpdmUuYyAoX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsKSwKLQlsaWJiZmQtaW4uaDogQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFJlbmFtZWQgZnJvbSB6YWxsb2MuCi0JKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpLAotCXRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApLAotCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KSwKLQlwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCksCi0Jb3BuY2xzLmMgKG5ld19iZmQpLCBsaWJiZmQtaW4uaCwKLQlpZWVlLmMgKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpLAotCWVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpLAotCShocHBhX2VsZl9zdHViX3JlbG9jKTogQ2hhbmdlIGNhbGxlcnMuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUpOiBBZGQgIl9iZmRfIiB0byBuYW1lLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyksIAotCWNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKSwgbGliYmZkLWluLmg6Ci0JQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpLCBsaWJiZmQtaW4uaCwgdGFyZ2V0cy5jLAotCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVuYW1lIHRhcmdldF92ZWN0b3IgdG8gYmZkX3RhcmdldF92ZWN0b3IKLQlhbmQgZGVmYXVsdF92ZWN0b3IgdG8gYmZkX2RlZmF1bHRfdmVjdG9yLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfY2hlY2tfZm9ybWF0KTogQ2FsbCBpdC4KLQkoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiByZW1vdmVkLgotCSogdGFyZ2V0cy5jOiBSZXBsYWNlIHRoZSB2ZWN0b3IgYWRkZWQgb24gSmFuIDIxIHdpdGggYSBjb3VudCBvZgotCWVudHJpZXMgaW4gZGVmYXVsdF92ZWN0b3IuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSmFuIDI0IDEyOjM4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4gIFNldCBzaXplIG9mCi0JLnBkYXRhIHNlY3Rpb24gYmFzZWQgb24gbG5ub3B0ciBmaWVsZCwgbm90IHNlY3Rpb24gaGVhZGVyLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGlmIHJfc3ltbmR4ID49IDAsCi0Jc2luY2UgaXQgaXMgdW5zaWduZWQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFVzZSBhbHBoYV9lY29mZl9vYmplY3RfcCByYXRoZXIgdGhhbgotCWNvZmZfb2JqZWN0X3AuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGFsaWdubWVudF9wb3dlciBmaWVsZCBvZgotCS5wZGF0YSBzZWN0aW9uIHRvIDMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNhdmUgdGhlIHNpemUgb2YgdGhlCi0JLnBkYXRhIHNlY3Rpb24gaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCwgYW5kIGFjdHVhbGx5IGFsaWduIHRoZQotCS5wZGF0YSBzZWN0aW9uIHRvIGFuIGFsaWdubWVudCBwb3dlciBvZiA0LgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogU2V0IG91dHB1dF9oYXNfYmVndW4gYWZ0ZXIKLQljYWxsaW5nIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfbG5ub3B0ciBmb3IgdGhlIC5wZGF0YQotCXNlY3Rpb24gZnJvbSB0aGUgbGluZV9maWxlcG9zIGZpZWxkLiAgU2V0IHZzdGFtcCBmb3IgdGhlIG9wdGlvbmFsCi0JaGVhZGVyIGZyb20gdGhlIHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlciB0byB0aGUKLQl2c3RhbXAgdXNlZCBieSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4gdGhlIGxpbmsuCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IEFsaWduIFJGRHMgdG8gZGVidWdfYWxpZ24uCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYWNoaXZlX2VsZW1lbnQpOiBTZXQgU0VDX0FMTE9DIGZsYWcKLQlmb3IgYSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBVc2UgZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0bwotCWdldCB0aGUgaW5kZXggb2YgYSBjb21tb24gc2VjdGlvbiwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nCi0JU0hOX0NPTU1PTiAoTUlQUyBoYXMgbXVsdGlwbGUgY29tbW9uIHNlY3Rpb25zKS4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFR5cG8gKD09IGZvciA9KS4KLQotCSogYmZkL2FvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKLQlhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCi0JcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywKLQlhbHBoYV9yZWxvY2F0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrKTogVXNlIGdldF92YWx1ZSB0byBnZXQKLQl0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGdldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIKLQloYXNoIHRhYmxlLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGb3IgUENSRUwyNCBhbmQgUENSRUwxMwotCXVzZSBnZXRfdmFsdWUgdG8gZ2V0IHRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMKLQl1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogVGhlIHN0cmluZyBpbmRleCAwIGhhcyBhCi0Jc3BlY2lhbCBtZWFuaW5nIGZvciBub3JtYWwgc3ltYm9scywgYnV0IG5vdCBmb3IgZHluYW1pYyBzeW1ib2xzLgotCi1TYXQgSmFuIDIyIDEyOjI2OjAxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjbHlueC5jOiAgU2V0dXAgYXBwcm9wcmlhdGUgbWFjcm9zIHRvIGVuYWJsZSBjb3JlIGZpbGUKLQlzdXBwb3J0LgotCi1GcmkgSmFuIDIxIDE2OjI1OjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiBBZGQgYSB2ZWN0b3Igb2YgbWF0Y2hpbmcgZm9ybWF0IG5hbWVzLgotCSogZm9ybWF0LmMgKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiBpdC4KLQkoYmZkX2NoZWNrX2Zvcm1hdCk6IFNldCBpdC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGJmZC1pbi5oOiBSZW1vdmUgZGVjbHMgb2YgYmZkX2VjIHR5cGUgYW5kIGVycm9yIHByaW50aW5nIGZ1bmN0aW9ucy4KLQlSZW1vdmUgZGVjbCBvZiB0eXBlIHN5bWNsYXNzOyB3YXNuJ3QgdXNlZC4KLQkqIGJmZC5jOiBEb2N1bWVudCBlcnJvciBoYW5kbGluZywgaW5jbHVkaW5nIGNvZGUgZnJhZ21lbnRzCi0JY29udGFpbmluZyB0aGUgZXJyb3IgZGVjbHMgdGhhdCB3ZXJlIGluIGJmZC1pbi5oLgotCVJlbW92ZSBERUZVTnMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oLCBsaWJsbm0uaCwgbmxtMzItYWxwaGEuYyBubG0zMi1pMzg2LmMgbmxtMzItc3BhcmMuYzoKLQlUaGUgc3BhcmMgKGFuZCBwb3NzaWJseSBvdGhlcj8pIE5MTSBmb3JtYXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQKLQl3YXkgdG8gd3JpdGUgZXhwb3J0cywgc28gYWRkIGEgd3JpdGVfZXhwb3J0IGZpZWxkIHRvIHRoZSBiYWNrZW5kCi0JZGF0YSAoYW5kIHNldCBpdCB0byBOVUxMIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3BhcmMpLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdW5vcy5jIChNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENvbXBhcmUgaW5mby0+ZHlucmVsIHdpdGggTlVMTCwKLQlub3QgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMLiAgaW5mby0+ZHlucmVsIGlzIGEgUFRSLCBub3QKLQlhIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLgotCi1GcmkgSmFuIDIxIDA5OjI5OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IFJlbW92ZSBlcnJvciBzdHJpbmdzIGZvciBlcnJvcnMgcmVtb3ZlZCBiZWxvdy4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKSwgYmZkLWluLmggKGJmZF9lYyksCi0Jb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW5hbWUKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uIHRvIG5vbnJlcHJlc2VudGFibGVfc2VjdGlvbi4KLQlOb25lIG9mIHRoZSBvdGhlciBiZmQgZXJyb3IgbmFtZXMgc3RhcnQgd2l0aCAiYmZkX2Vycm9yIi4KLQlSZW1vdmUgZXJyb3JzIHN5bWJvbF9ub3RfZm91bmQgYW5kIG5vX3JlbG9jYXRpb25faW5mbywgd2hpY2ggc2VlbQotCXRvIGJlIHVudXNlZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjEgMDE6MTE6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQWRkZWQgc3VwcG9ydCBmb3IgRUxGLgotCi0JKiBzeW1zLmMgKEJTRl9EWU5BTUlDKTogTmV3IHN5bWJvbCBmbGFnLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyByZWFkX2R5bmFtaWNfc3ltYm9scwotCWFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkoc3RydWN0IGFvdXRkYXRhKTogTmV3IGR5bmFtaWNfaW5mbyBmaWVsZC4KLQkob2JqX2FvdXRfZHluYW1pY19pbmZvKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvLCBNWShyZWFkX2R5bmFtaWNfc3ltYm9scyksCi0JTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JYW5kIHJlbG9jcy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcwotCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IFNFQ19SRUxPQyBmb3IgYm90aCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbnMuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBzZXQgQlNGX0xPQ0FMIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wuCi0JKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBvZgotCXNsdXJwX3N5bWJvbF90YWJsZTsgc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGFwcHJvcHJpYXRlbHkuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogUmVhZCBkeW5hbWljIHN5bWJvbHMsIGlmIGFueS4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFJlYWQgZHluYW1pYyByZWxvY3MsIGlmIGFueS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBJbmNsdWRlIGR5bmFtaWMgcmVsb2MgY291bnQgaW4KLQlyZXR1cm4gdmFsdWUuCi0JKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3Qgd3JpdGUKLQlvdXQgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcyBhZ2FpbnN0IHJlbG9jIHN5bWJvbHMsIHNpbmNlIHRoZXkKLQlhcmUgYWxyZWFkeSBpbiB0aGUgLnRleHQgc2VjdGlvbiBhbmQgd2Ugd291bGRuJ3Qga25vdyB3aGVyZSB0bwotCXdyaXRlIHRoZW0gYW55aG93LgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKLQlyZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplCi0JcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCi1UaHUgSmFuIDIwIDIwOjU3OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NGVfdHlwZSwgdWludDY0X3R5cGUsIGludDY0X3R5cGUpOiBEZWxldGUKLQl0eXBlZGVmcywgc2luY2UgSE9TVF82NF9CSVQgd2lsbCB0YWtlIGNhcmUgb2YgZGVmaW5pbmcgdGhlbSBpbgotCWJmZC5oLgotCi1XZWQgSmFuIDE5IDE3OjI4OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgSE9TVF82NF9CSVQgaGVyZTsKLQl0aGF0J3MgZGVhbHQgd2l0aCBlbHNld2hlcmUuCi0JKiBob3N0cy9hbHBoYW9zZi5oIChzcHJpbnRmX3ZtYSwgZnByaW50Zl92bWEpOiBOZXcgbWFjcm9zLgotCSh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogQ29tbWVudCB3aXRoIEhPU1RfNjRfQklUIHNvCi0JdGhleSBnZXQgY29waWVkIHRvIGJmZC5oLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc29tZSBBbHBoYSByZWxvY2F0aW9uCi0JdHlwZXMuICBSZW9yZ2FuaXplZCBzb21lIG9mIHRoZSBleGlzdGluZyBvbmVzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IENvbnN0cnVjdCA2NC1iaXQgbmVnYXRpdmUgb25lCi0JdmFsdWVzIGluIGNhc2Ugb2YgY29tcGlsYXRpb24gb24gYSAzMi1iaXQgbWFjaGluZS4gIEZpeCBwY3JlbAotCWZpZWxkcyBvZiBzb21lIHJlbG9jIHR5cGVzLgotCShhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbW9yZSByZWxvY2F0aW9uIHR5cGVzLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IFN1cHBseSBkZWZhdWx0Ci0JZGVmaW5pdGlvbnMgd2hlbiBub3QgZGVmaW5lZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVpbnQ2NF90eXBlIGlzCi0JYSBkZWZpbmVkIG1hY3JvIG9yIG5vdC4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogRGVmaW5lIG9ubHkgaWYgZnByaW50Zl92bWEgaXMgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCi1XZWQgSmFuIDE5IDAwOjAyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHR5cGUgb2YgYQotCUJTRl9XQVJOSU5HIHN5bWJvbCB0byBOX1dBUk5JTkcuCi0KLVR1ZSBKYW4gMTggMTY6NDM6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJbmNyZW1lbnQgc3ltX2hhc2ggYXMgd2VsbCBhcyBwCi0JZm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVwZGF0ZSBzeW1faGFzaCB3aXRoIHRoZSB0YXJnZXQgb2YgYW4KLQlpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gIElmIGFuIGluZGlyZWN0IHN5bWJvbCBpcyBkZWZpbmVkLAotCW91dHB1dCB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBhbmQgZG9uJ3Qgb3V0cHV0IHRoZSB0YXJnZXQgc3ltYm9sLgotCi1UdWUgSmFuIDE4IDAzOjU0OjU5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEdpdmUgd2FybmluZyBzeW1ib2xzCi0JYW4gKHVudXNlZCkgbm9uemVybyBzZWN0aW9uIHZhbHVlLCBuZWVkZWQgZm9yIGNoZWNrIGJlbG93LgotCi1Nb24gSmFuIDE3IDE1OjEyOjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywKLQlhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBUcmVhdCBOX1NFVFtBQkRUXSB8IE5fRVhUIGxpa2UKLQlOX1NFVFtBQkRUXS4KLQotRnJpIEphbiAxNCAxNjo0NTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgYSBTSFRfRFlOQU1JQyBzZWN0aW9uLCBzZXQKLQl0aGUgRFlOQU1JQyBmbGFnIGZvciB0aGUgQkZELgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHRyeSB0byB3cml0ZSBvdXQgYQotCUJGRCB3aXRoIHRoZSBEWU5BTUlDIGZsYWcgc2V0LCBzaW5jZSB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgcHJvZ3JhbQotCWhlYWRlciB0YWJsZSBjb3JyZWN0bHkuCi0KLUZyaSBKYW4gMTQgMDE6MDQ6MzYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgRnJlZSB4X3N5bXAgYXQgdGhlIGVuZAotCW9mIHRoZSBmdW5jdGlvbiB0byBhdm9pZCBzdG9yYWdlIGxlYWsuCi0KLVRodSBKYW4gMTMgMjM6MDc6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQW4gaWZkIGNhbiBiZSAtMS4KLQotVGh1IEphbiAxMyAxMjozMzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFByb3ZpZGUgYSBkZWZhdWx0IHN5bWJvbCBmb3IKLQlyZWxvY2F0aW9ucyB3aGljaCBkb24ndCBhY3R1YWxseSBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi0JKiBzb20uYyAoaHBwYV9zb21fcmVsb2MpOiBBZGQgbmV3ICJlcnJvciBtZXNzYWdlIiBhcmd1bWVudC4KLQotV2VkIEphbiAxMiAxMzozNjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlFbmFibGUgZ2RiIHRvIHdyaXRlIHRvIGNvcmUgZmlsZXMgb24gbW9yZSBjb3JlIGZpbGUgcmVhZGVycy4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZW1vdmUgcmFuZ2UgY2hlY2sKLQlmb3Igc2VjdGlvbiBzaXplLCBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0Jd2l0aCBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cuCi0JKiBhaXgzODYtY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLAotCW9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jICgqX3NldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlVc2UgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgaW5zdGVhZCBvZiBiZmRfZmFsc2UuCi0KLVdlZCBKYW4gMTIgMTU6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkZWQgaW5pdGlhbCBkb2N1bWVudGF0aW9uLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogRG9uJ3QgZXhwZWN0IHNwYWNlIGZvcgotCW91dHB1dCByZWxvY2F0aW9ucyBpZiB0aGVyZSBhcmVuJ3QgYW55IGlucHV0IHJlbG9jYXRpb25zLgotCi1UdWUgSmFuIDExIDE0OjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogU2V0IGFfZW50cnkgYmVmb3JlIGNvbXB1dGluZwotCWZpbGUgb2Zmc2V0cy4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogQSBjb21tb24gc3ltYm9sIGlzIFNUVF9PQkpFQ1QsIG5vdAotCVNUVF9OT1RZUEUuCi0KLVR1ZSBKYW4gMTEgMDk6MTA6NTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBFTEYsIG5vdCBDT0ZGIGZvciBtODgqLSotZGd1eCouCi0JQ29tYmluZSBtODhrLSotKiBhbmQgbTg4MTEwLSotKiBjYXNlcyBpbnRvIG04OCotKi0qLgotCi1UdWUgSmFuIDExIDAwOjA3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGNvbXByZXNzIGFuZCBtZXJnZSBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHdyaXRlIHNvbWUgb2Ygb3V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIHNhdmluZwotCWl0IGluIG1lbW9yeS4gIFNldmVyYWwgbmV3IGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcywgYW5kIG5ldwotCWFyZ3VtZW50cyB0byBleGlzdGluZyBmdW5jdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ29tcHV0ZQotCXN5bV9maWxlcG9zIGFzIHdlbGwuCi0JKGVjb2ZmX2dldF9leHRyKTogVXNlIGlmZG1hcCBpbnN0ZWFkIG9mIGlmZGJhc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgc3ltX2ZpbGVwb3MgaGVyZS4KLQlPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGVjb2ZmX2RlYnVnX2luZm8gYW5kCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4gIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGVyZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFVzZSBpZmRtYXAgcmF0aGVyIHRoYW4gaWZkYmFzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBleHRlcm5hbCBzeW1ib2xzCi0JZmlyc3QsIHRvIHB1dCB0aGVtIGluIHRoZSBmaXJzdCBtZW1vcnkgYnVmZmVyLiAgQ2xlYXIgZmRyIGZpZWxkLgotCShtaXBzX2VsZl9nZXRfZXh0cik6IFVzZSBwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gYmZkX2Vjb2ZmIGZ1bmN0aW9ucy4KLQlQcmVzZXJ2ZSAudGV4dCwgLmRhdGEgYW5kIC5ic3MgZXZlbiBpZiB0aGV5IGFyZSBlbXB0eS4gIFNhdmUKLQlwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wgcmF0aGVyIHRoYW4gY29weWluZyBpdC4KLQlEb24ndCBmcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IENoYW5nZSBtaXBzX2V4dHIgdG8gUFRSLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19pbml0LCBiZmRfZWNvZmZfZGVidWdfZnJlZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IFJlbmFtZSBkZWNsYXJhdGlvbiBmcm9tCi0JYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIgYW5kIHVwZGF0ZS4KLQkoYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEphbiAxMCAyMDo0Njo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgIkAiIHdoaWNoIGZvbGxvd3MgYSBiYWNrc2xhc2guICBJbgotCXRoaXMgcG9zaXRpb24gaXQganVzdCBjYXVzZXMgZXJyb3JzLCBub3Qgc3VwcHJlc3NlcyBlY2hvZXMuCi0KLU1vbiBKYW4gMTAgMDk6MDY6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEZpeCBoYW5kbGluZyBvZiBMVCBhbmQgUlQKLQlmaWVsZCBzZWxlY3RvcnMuCi0KLVN1biBKYW4gIDkgMDQ6MzI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2LW5ldGJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBJbmNsdWRlIGkzODZic2RfdmVjLgotCi1GcmkgSmFuICA3IDEwOjI3OjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBEb24ndCBtZXJnZSB0aGUgc3RhcnQgb2YgYnNzIHdpdGggdGhlCi0JZW5kIG9mIGRhdGEgaWYgdGhleSBhcmUgbm90IGNvbnRpZ3VvdXMuCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogQ29tbWVudCB0aGUgZmllbGRzJyBtZWFuaW5ncy4KLQotRnJpIEphbiAgNyAxNTo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZsYWcKLQlmb3IgLnJlZ2luZm8gc2VjdGlvbiBoZXJlLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEphbiAgNyAxMDoyOToyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAgICAJKiBiZmQtaW4uaDogKGJmZF9ib29sZWFuKTogQWRkIHdvcmthcm91bmQgZm9yIHN5c3RlbXMgdGhhdCBhbHNvCi0JZGVmaW5lIHRydWUgYW5kIGZhbHNlIGFzIGVudW1zLgotCShBTE1PU1RfU1REQyk6IEFkZCBhcyBhbHRlcm5hdGl2ZSB0byBfX1NURENfXy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IENvbnZlcnQgYSBQVFIgdG8gRklMRSouCi0KLVRodSBKYW4gIDYgMTQ6MjQ6NDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENhdGNoIHRoZSBjYXNlIHdoZXJlCi0JdGhlcmUgaXMgbm8gb3V0cHV0IHNlY3Rpb24uCi0KLVRodSBKYW4gIDYgMTQ6Mzc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IElmIHdlIGNhbid0IHJlYWQgdGhlIGZpeGVkIGhlYWRlciwKLQljb3VudCBpdCBhcyBhIHdyb25nIGZvcm1hdCBlcnJvciwgbm90IGEgc3lzdGVtIGNhbGwgZXJyb3IsIHNpbmNlCi0JdGhlIG9iamVjdCBmaWxlIG1pZ2h0IHNpbXBseSBiZSB0b28gc21hbGwuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZGVkIG5sbTMyX2FscGhhX3ZlYyBpbnNpZGUgI2lmZGVmCi0JQkZENjQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgbmxtMzItYWxwaGEuby4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGQgbmxtMzItYWxwaGEuby4gIEl0IGRlcGVuZHMgb24gNjQgYml0Ci0Jc3VwcG9ydCwgZXZlbiB0aG91Z2ggaXQgaXMgZm9yIGFuIEFscGhhIGluIDMyIGJpdCBtb2RlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBTZXQgdGFyZ2V0NjQgdG8gdHJ1ZS4KLQotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBSZW1vdmVkLiAgQWxsIG5sbSB0YXJnZXRzIGFyZQotCWRpZmZlcmVudCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8gcHJvdmlkaW5nIGEgZ2VuZXJpYyBvbmUuCi0JKiBsaWJubG0uaDogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBubG1fYmFja2VuZChiZmQpIGJlaW5nIE5VTEwKLQlpbiB0aGUgYmFja2VuZCBhY2Nlc3NvciBtYWNyb3M7IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBwb3NzaWJsZS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgbmxtMzJfYmlnX2dlbmVyaWNfdmVjLAotCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjLgotCSogY29uZmlndXJlLmluIChubG0zMl9iaWdfZ2VuZXJpY192ZWMsIG5sbTMyX2xpdHRsZV9nZW5lcmljX3ZlYywKLQlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYyk6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMsIGFuZAotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtMzItZ2VuLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogUmVtb3ZlZCBubG02NC1nZW4uby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBubG0zMi1nZW4uYyBhbmQgbmxtNjQtZ2VuLmMuCi0KLQkqIGhwMzAwaHB1eC5jIChBUkNIX1NJWkUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBhb3V0eC5oLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IgYW5kCi0JYml0c2l6ZSBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIChhb3V0eC5oKS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvcgotCWFuZCBiaXRzaXplIGFyZ3VtZW50cyB0byBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlY29mZi5jOiBGaXJzdCBjdXQgYXQgbmV3IHN0eWxlIG9mIGxpbmtlciBiYWNrZW5kIGZvcgotCUVDT0ZGLS1hZGRlZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gIEFsc286Ci0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IGZsYWdzIGZvciAucGRhdGEgYW5kIC54ZGF0YS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2FsbCBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2V0IG91dCBxdWlja2x5IGlmIGNvdW50IGlzIHplcm8uCi0JQ2hlY2sgZXJyb3JzIGJldHRlci4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IC54ZGF0YSBzZWN0aW9uIGluIGRhdGEgc2VnbWVudC4KLQlDYWxsIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMuICBEb24ndCBvdXRwdXQgcmVsb2NzIG9yCi0JZXh0ZXJuYWwgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQ29tcGxldGVseSByZXdyaXR0ZW4uCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShlY29mZl9kYXRhX3R5cGUpOiBBZGQgc3ltX2hhc2hlcyBhbmQgc3ltbmR4X3RvX3NlY3Rpb24gZmllbGRzLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KLQkoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogQ2FsbCBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IE1hcmsgQlJBRERSIGFzCi0JcGFydGlhbF9pbnBsYWNlLCBhbmQgc2V0IHRoZSBzcmNfbWFzayB0byAweDFmZmZmZi4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIGdwX3dhcm5lZC4KLQkoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9yZWZoaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQ29ycmVjdGVkIHNpZ25lZCBvdmVyZmxvdwotCWNoZWNraW5nIHdoZW4gdGhlcmUgaXMgYW4gYWRkZW5kLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhYm9ydCB3aGVuIHRyeWluZyB0byBsaW5rCi0JYSBub24gYS5vdXQgZmlsZSwganVzdCBwYXNzIGl0IHRvIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgUEMgcmVsYXRpdmUgbGluawotCWFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgc3VidHJhY3QgdGhlIFZNQSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBSZW5hbWVkIGZyb20KLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlciBhbmQgbWFkZSBzdGF0aWMuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIgdHlwZSwganVzdAotCWNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyIHR5cGUuCi0JKiBnZW5saW5rLmg6IFJlbW92ZWQgZGVjbGFyYXRpb24gb2YKLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlci4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyCi0JdHlwZSwganVzdCBjYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCi1UdWUgSmFuICA0IDIxOjIzOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBCYXNlIHRoZSBuYW1lIG9mCi0JdGhlIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24gb24gdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbAotCWNhbWUgZnJvbS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiAoY2FzZSBCSUcpOiBBIGNvbW1vbiBzeW1ib2wKLQltdXN0IGhhdmUgYSBzZWN0aW9uLCBzbyBkb24ndCBib3RoZXIgdG8gY3JlYXRlIG9uZS4KLQotTW9uIEphbiAgMyAxNTozMjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgRFlOQU1JQyB0byBtYXNrIG9mIG9iamVjdCBmbGFncy4KLQkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOgotCUlmIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LCBzZXQgaXQgaW4gdGhlIGV4ZWMgaGVhZGVyLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCi0JZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgdGhlIERZTkFNSUMgZmxhZyBpbiB0aGUgQkZELgotCSogbGliYW91dC5oIChOX1NFVF9EWU5BTUlDKTogTmV3IG1hY3JvLgotCShOX0RZTkFNSUMpOiBBZGQgbWlzc2luZyAwIGluIG1hc2suCi0KLU1vbiBKYW4gIDMgMTE6NDE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IERvbid0IG91dHB1dCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBiZmQtaW4uaCwgaGFzaC5jOiBDaGFuZ2UgYmZkX2hhc2hfYWxsb2NhdGUgYXJndW1lbnQgZnJvbSBzaXplX3QKLQl0byB1bnNpZ25lZCBpbnQsIGJlY2F1c2Ugc2l6ZV90IG1heSBub3QgYmUgZGVmaW5lZCBpbiBiZmQuaC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogYmZkLWluLmggKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bwotCWJlIGEgY29uc3QgcG9pbnRlci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5jIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KLQliZSBhIGNvbnN0IHBvaW50ZXIuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2Ugc3dhcCBmdW5jdGlvbiBwb2ludGVycwotCWFjY29yZGluZ2x5LgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogQ2hhbmdlIHN3YXAgYWNjb3JkaW5nbHkuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19HRVRTIGFjY29yZGluZ2x5LgotCSogaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywKLQlwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fU0lHTkVEX0dFVAotCWFjY29yZGluZ2x5LgotCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiBBZGRlZCB0ZGF0YSBmaWVsZC4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBEZWNsYXJlLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IERlY2xhcmUuCi0JKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYXJjaGl2ZS5jOiBDbGVhbmVkIHVwIHNvbWUgbW9yZS4KLQkoX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZQotCXBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBSZW5hbWVkIGZyb20gYWRkX2JmZF90b19jYWNoZS4KLQkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IFJlbmFtZWQgZnJvbSBnZXRfZWx0X2F0X2ZpbGVwb3MuCi0JKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLAotCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IE1hZGUgc3RhdGljLgotCSogZWNvZmYuYzogU29tZSBjb21tZW50IGNoYW5nZXMuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogSGFuZGxlIHJlbmFtZSBvZiBzbmFyZl9hcl9oZHIuICBTZXQKLQlhcmRhdGEtPnRkYXRhIHRvIHJhd19hcm1hcC4KLQkoZWNvZmZfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZSBwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IEhhbmRsZSByZW5hbWUgb2YKLQlhZGRfYmZkX3RvX2NhY2hlLgotCi0JKiBoYXNoLmM6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KLQotTW9uIEphbiAgMyAxMTowOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgbmV0YnNkMzg2LmM6IFJlcGxhY2UgTk9fU1dBUF9NQUdJQyB3aXRoIFNXQVBfTUFHSUMsCi0JYW5kIGRvIHRoZSBzd2FwcGluZyBoZXJlIHJhdGhlciB0aGFuIGNhbGxpbmcgbnRvaGwgZnJvbSB0aGUgTl8qCi0JbWFjcm9zLiAgVGhpcyBjbGVhbnMgdXAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgb2YgYSBob3N0IGxvbmcsCi0JdGhlIGV4aXN0ZW5jZSB0byBudG9obCwgZXRjLgotCi1TYXQgSmFuICAxIDEzOjUwOjA1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLiBJdCBjdXJyZW50bHkgdXNlcwotCWkzODYtYW91dC4KLQotU2F0IEphbiAgMSAxMDoxODo1NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KLQkqIGkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTE5MwotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05Njk3IGIvYmZkL0NoYW5nZUxvZy05Njk3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIyYzhjLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTY5NworKysgL2Rldi9udWxsCkBAIC0xLDY3MTEgKzAsMCBAQAotVHVlIERlYyAzMCAxMjo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IElmIC1Cc3ltYm9saWMsIGRvbid0Ci0JYWxsb2NhdGUgc3BhY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBpcwotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkb24ndCBjb3B5IGEgUEMKLQlyZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0JZmlsZS4KLQotTW9uIERlYyAyOSAxODowMjoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEpvbmF0aGFuIFN0b25lIDxqb25hdGhhbkBEU0cuU3RhbmZvcmQuRURVPjoKLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBBZGQgRUNPRkYgdmVjdG9ycyB0bwotCXRhcmdfc2VsdmVjcy4KLQkobWlwcyplbC0qLW5ldGJzZCopOiBMaWtlIG1pcHMtZGVjLW5ldGJzZCouCi0JKG1pcHMqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0KLU1vbiBEZWMgMjkgMTc6MTM6MjggMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENoYW5nZSBlcnJvciBtZXNzYWdlCi0JZnJvbSAidW5kZWZpbmVkIHZlcnNpb24gbmFtZSIgdG8gInVuZGVmaW5lZCB2ZXJzaW9uZWQgc3ltYm9sCi0JbmFtZSIuCi0KLU1vbiBEZWMgMjkgMTE6NDE6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvIGZyb20gcHJldmlvdXMKLQlkZWx0YS4KLQotVHVlIERlYyAyMyAxNzowMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCAucmVsb2Mgc2VjdGlvbiB0byBiZQotCXNoYXJlZC4gIFNldCBzdGFiKiBzZWN0aW9ucyB0byBiZSBzaGFyZWQgYW5kIHJlYWQuICBTZXQgLnJzcmMKLQlzZWN0aW9uIHRvIGJlIHJlYWQgYW5kIHNoYXJlZC4KLQotTW9uIERlYyAyMiAxMzoyMDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGR3YXJmMi5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvZmYtYXJtLmM6IERvbid0IGluY2x1ZGUgb2JzdGFjay5oLgotCi1Nb24gRGVjIDIyIDEzOjA0OjMzIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki1nbzMyLXJ0ZW1zKik6IEZpeCB0byBiZSB0aGUgc2FtZSBhcwotCWlbMzQ1Nl04Ni1nbzMyLgotCi1UaHUgRGVjIDE4IDE2OjAxOjI1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byBnZXQgQFNIRUxMQCBzdWJzdGl0dXRlZC4KLQotV2VkIERlYyAxNyAwOTo0NTowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogT25seSBsb29rIGF0IHNlY3Rpb24KLQlvd25lciBpZiB0aGVyZSBpcyBvbmUuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRmFpbCBpZiB0aGVyZSBpcyBub3QKLQllbm91Z2ggcm9vbSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIERlYyAxNiAwODowOTo1NiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbAotCV9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIGZpcnN0LgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogU2FtZS4KLQkqIGR3YXJmMi5jOiBOZXcgZmlsZTsgaW1wbGVtZW50IF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lLgotCi1Nb24gRGVjIDE1IDE2OjA4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfbWFjaF9tMzJyLgotCi1Nb24gRGVjIDE1IDE2OjExOjIyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogRGVmaW5lIGlmIEk5NjAgbm90IGRlZmluZWQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLQl0byBkZWNpZGUgd2hlbiB0byBhbGlnbiB0aGUgZmlsZSBzZWN0aW9ucyBmb3IgcGFnaW5nLgotCSogY29mZmNvZGUuaCAoQUxJR05fU0VDVElPTlNfSU5fRklMRSk6IFVuZGVmaW5lIGZvciBUSUM4MENPRkYuCi0KLU1vbiBEZWMgMTUgMTU6MDE6MTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9vYmplY3RfcCk6IE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IFBvaW50IHRvIG0zMnJfb2JqZWN0X3AuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBQb2ludCB0bwotCW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IFBvaW50IHRvCi0JbTMycl9lbGZfc2V0X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX20zMnIpOiBBZGQgaWRlbnRpZmllciBmb3IgTTMyUiBhcmNoaXRlY3R1cmUKLQltYWNoaW5lcy4KLQotRnJpIERlYyAxMiAxMTozMDoyOCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYmJmZCBzaGFyZWQgaWYgLS1lbmFibGUtc2hhcmVkJ3MgdmFsdWUKLQl3YXMgYHllcycsIG9yIHdhcyBzZXQgdG8gYCpiZmQqJy4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogTk9URTogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQgaW4gbGlidG9vbC9saWJ0b29sLm00LCB0aGUKLQlvcmlnaW5hbCBzb3VyY2Ugb2YgdGhpcyBiaXQgb2YgY29kZS4gIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIGJlc3QgZml4Ci0Jd291bGQgYmUsIHRob3VnaC4KLQotVGh1IERlYyAxMSAxNzo0ODoxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IEFsd2F5cyBpbml0IHVkYXRhLnAgc28KLQl0aGF0IHRoZSBnZW5lcmljIHJlbGF4YXRpb24gY29kZSBjYW4gZnVuY3Rpb24gd2hlbiBpbnB1dCBhbmQgb3V0cHV0Ci0JZmlsZSBmb3JtYXRzIGFyZSBtaXNtYXRjaGVkLgotCi1UaHUgRGVjIDExIDAxOjAyOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZvciBhIGxvYWRhYmxlCi0Jc2VjdGlvbiwgbWFrZSBzdXJlIHRoYXQgdGhlIGxvYWQgYWRkcmVzcyBpcyBjb3JyZWN0IHJlbGF0aXZlIHRvCi0JdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VnbWVudCBwbHVzIHRoZSBzaXplIG9mIHRoZSBzZWdtZW50IHNvCi0JZmFyLgotCi0JKiBjb2ZmY29kZS5oIChfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBNYWtlIHN0YXRpYy4KLQkoX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTGlrZXdpc2UuCi0KLVdlZCBEZWMgMTAgMjM6Mzc6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBhIHJlbG9jYXRlYWJsZSBsaW5rIGluCi0Jd2hpY2ggYSByZWxvY2F0aW9uIHJlZmVycyB0byBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4KLQotV2VkIERlYyAxMCAxMToxNTo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2NvZmZfZmluYWxfbGluayk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvZmZfYXJtX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBsaWJjb2ZmLmggKHN0cnVjdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkczoKLQlfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAotCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgbmV3IG1hY3JvczoKLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbnNlcnQgY2FsbHMgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmNvZGUuaDogQWRkIHR3byBuZXcgZmllbGRzIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZTogX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biBhbmQKLQlfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0LiAgQWRkIGRlZmF1bHQgaW5pdGlhbGlzZXJzIGZvcgotCXRoZXNlIGZpZWxkcy4gIEFkZCBvdmVycmlkYWJsZSBhbGlhc2VzIGZvciB0aGUgY29mZiBzd2FwIGZ1bmN0aW9ucwotCWluIHRoZSBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLgotCi0JKiBlbGYzMi12ODUwLmM6IFVwZGF0ZSB3aXRoIHBhdGNoZXMgZnJvbSB0aGUgYnJhbmNoIHRvIGZpeAotCUhJMTZfUy9MTzE2IHJlbG9jIHBhaXJzLgotCi1XZWQgRGVjIDEwIDE0OjA2OjQ4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGQzMHZfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQlSRUxBIHJlbG9jYXRpb25zLgotCShVU0VfUkVMKTogRG9uJ3QgZGVmaW5lIGFueSBtb3JlLCBzd2l0Y2ggdG8gdXNpbmcgUkVMQQotCXJlbG9jYXRpb25zLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBhcyBkMzB2X2luZm9fdG9faG93dG9fcmVsYS4KLQotVHVlIERlYyAgOSAxMTozNzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRm9yIDMwMDAgYW5kIDQwMDAgcmVwbGFjZSBtYWdpYyBjb25zdGFudCB3aXRoCi0gCW1hY3JvLgotCi0JKiBjcHUtbWlwcy5jIChOKTogRGVmaW5lLgotCShiZmRfbWlwc19hcmNoLCBhcmNoX2luZm9fc3RydWN0KTogUmUtd3JpdGUgdXNpbmcgbWFjcm8gTiwgcmVwbGFjZQotIAludW1iZXJzIHdpdGggYmZkX21hY2hfbWlwcyogbWFjcm9zLgotCi1GcmkgRGVjICA1IDExOjEzOjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuLAotCXY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggcmVsb2MgYWRkZW5kIGhhbmRsaW5nLgotCSh2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nLAotCXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vaywgdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0Jdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIsIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zCi0JdG8gY3JlYXRlIGFuZCBoYW5kbGUgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggSEkxNiBhbmQgSEkxNl9TIHJlbG9jYXRpb25zCi0Jd2hpY2ggaGF2ZSBkYXRhIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjICAyIDEwOjI2OjE2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfY29mZl9ob3d0b3MpOiBBZGQgUl9TSF9TV0lUQ0g4IGVudHJ5LgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgMjYgMTQ6MTM6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBDaGFuZ2VkIHRvIG1hdGNoIGRlZmluaXRpb24gaW4KLQlnY2MvY29uZmlnL2FybS9zZW1pLmgKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgQVJNIGFuZCBUaHVtYiBzeW1ib2wKLQljbGFzc2VzLgotCi1TdW4gTm92IDIzIDE2OjAyOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZnJlZWJzZC5oIChTV0FQX01BR0lDKTogUmVhZCBtYWdpYyBudW1iZXIgbGl0dGxlIGFuZCBub3QgYmlnCi0gCWVuZGlhbi4KLQotV2VkIE5vdiAyNiAwOTozMDozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBPbmx5IHNldCBwcml2YXRlIGZsYWdzIGZvciBub24KLQlQRSBBUk0gcG9ydHMuCi0KLVR1ZSBOb3YgMjUgMTU6MzM6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEFsc28gaWdub3JlIE5FVkVSX0xPQUQKLQlzZWN0aW9ucy4KLQotVHVlIE5vdiAyNSAxMDo1NTozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdAotCWNvbXBsYWluIGlmIGlub3V0IGFuZCBvdXRwdXQgZm9ybWF0cyBkaWZmZXIuCi0KLVR1ZSBOb3YgMjUgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgdGVraGV4LmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgdGVraGV4LmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgc3JjL01ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudAotCWF1dG9tYWtlIGFuZCBhdXRvY29uZi4KLQotCSogY29mZi1hcm0uYyAoYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IEZpeCB0eXBvCi0JKENPRkZfV0lUSF9QUiB0byBDT0ZGX1dJVEhfUEUpLgotCi1Nb24gTm92IDI0IDE1OjQ3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IE1ha2UgdmFyaWFibGVzIGFuZCBzb21lIGZ1bmN0aW9ucyBzdGF0aWMsIHNvIHRoYXQKLQl0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkIGluIG11bHRpcGxlIG9iamVjdCBmaWxlcy4KLQkoY29mZl9hcm1fYmZkX2ZpbmFsX2xpbmspOiBGaXggbWlub3IgYnVnLgotCi1TYXQgTm92IDIyIDE1OjE2OjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcy4KLQotCSogY29mZmNvZGUuaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgotCi1TYXQgTm92IDIyIDE2OjA2OjU2IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogVXNlIGFsbG9jYSBpbnN0ZWFkIG9mIHN0cmR1cC4KLQotU2F0IE5vdiAyMiAxMjoyOTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgZGVmaW5lZAotCXN5bWJvbCwgc2V0IGl0IHRvIHVuZGVmaW5lZCwgbm90IG5ldy4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGtpbGwgTEFCRUwKLQlyZWxvY3MuCi0KLUZyaSBOb3YgMjEgMTQ6MTQ6MjIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9zZWN0aW9uKTogRm9yY2Ugc2lnbiBleHRlbnRpb24gb2YgVVNFUyByX29mZnNldC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTCByZWxvY3MuCi0KLU1vbiBOb3YgMTcgMTU6MDg6MzggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBGaXggdHlwby4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TYXQgTm92IDE1IDE1OjM2OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogQ2FzdCBzZWNvbmQgYXJnIG9mCi0JYmZkX2hfZ2V0XyogY2FsbHMgdG8gImJmZF9ieXRlICoiLgotCi1UdWUgTm92IDExIDEwOjM3OjIzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQKLQkibW92bV9zdGFja19zaXplIi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0JaW4gdGhlIGltbTggZmllbGQgb2YgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLQl0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtb3ZtX3N0YWNrX3NpemUuCi0KLU1vbiBOb3YgMTAgMTQ6MzI6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBjcmFzaCBpZgotCWEgdmVyc2lvbiBkZXBlbmRlbmN5IGNvdWxkIG5vdCBiZSBmb3VuZC4KLQotVHVlIE5vdiAgNCAxMjowNTo1NiAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbgotCi1GcmkgT2N0IDI0IDExOjE1OjU4IDE5OTcgIEpha3ViIEplbGluZWsgIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKToKLQlOZXcgZnVuY3Rpb24uIEF2b2lkIG1peGluZyBVUzEgYW5kIEhBTCBSMSBjb2RlLgotCVNldCByZXN1bHRpbmcgbWVtb3J5IG9yZGVyaW5nIHRvIHRoZSBzdHJvbmdlc3Qgb25lIHVzZWQuCi0JKHNwYXJjNjRfZWxmX29iamVjdF9wKTogU2V0IGJmZF9tYWNoIGNvcnJlY3RseS4KLQotVGh1IE9jdCAyMyAxNDowOTozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBVQTY0ICYgVUExNi4KLQkoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIHRoZW0uCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4gIEJlZm9yZSBlbWl0dGluZyBhIGR5biByZWxvYywKLQljaGVjayBhbGlnbm1lbnQgYW5kIHRyYW5zbXV0ZSBSX1NQQVJDX3g8LT5SX1NQQVJDX1VBeC4KLQotVGh1IE9jdCAyMyAwMDo1MzoxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1saW51eCopOiBVc2UgdHJhZC1jb3JlIGFuZCAuLi4KLQkqIGhvc3RzL3NwYXJjbGludXguaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjMgMDA6MjU6MjkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHBsdF9hbGlnbm1lbnQgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBTZXQgLmdvdCBhbGlnbm1lbnQgYmFzZWQKLQlvbiBhcmNoX3NpemUuCi0JKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UgZm9yIC5yZWwqIHNlY3Rpb25zLgotCVNldCAucGx0IGFsaWdubWVudCBmcm9tIG5ldyBwbHRfYWxpZ25tZW50LgotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB2ZXJzaW9uIHNlY3Rpb24KLQlhbGlnbm1lbnQgdG8gTE9HX0ZJTEVfQUxJR04uCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IFByb3ZpZGUgZGVmYXVsdC4KLQkoZWxmWFhfYmVkKTogSW5pdCBwbHRfYWxpZ25tZW50LgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLCBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLQlzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRml4IGEgZmV3IG5hbWUgc3RyaW5ncy4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBOZXcgZGVmaW5pdGlvbi4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgcGx0X3RlbXBsYXRlLCBwbHRfKl9oZWFkZXIsIHBsdF8qX2VudHJ5LAotCXNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKToKLQlQTFQgZGVmaW5pdGlvbnMgc3BhcmM2NC1saW51eCBvcmlnaW5hbGx5IGNob29zZS4gIFRoZXNlIHdpbGwgZ28KLQlhd2F5IHNvb24gaW4gZmF2b3VyIG9mIHRoZSBvZmZpY2lhbCBhYmkgZGVmaW5pdGlvbnMuCi0KLVdlZCBPY3QgMjIgMTY6MDg6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKGNvZmZfc21hbGxfb2JqZWN0X3ApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogTmV3IHN0YXRpYyBjb25zdCBzdHJ1Y3R1cmUuCi0JKGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lLgotCShzaGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKHNobGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kCi0Jc2hsY29mZl9zbWFsbF92ZWMuCi0JKiBjb25maWcuYmZkIChzaC0qLWVsZiopOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKLQlzaGxjb2ZmX3NtYWxsX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKHNoLSotKik6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQgc2hsY29mZl9zbWFsbF92ZWMgY2FzZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBPY3QgMjAgMTU6MDE6MjcgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtZWdzZC5jOiBXZWFrIHN5bWJvbHMgYXJlIGdsb2JhbC4KLQotCSogZXZheC1lbWguYzogVXNlIHByb3BlciBjYXN0cy4KLQotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogUmVtb3ZlIHVubmVlZGVkIHVuYW1lLgotCi0JKiBldmF4LWVnc2QuYzogU2VjdGlvbiBuYW1lcyBhbmQgc3ltYm9scyBoYXZlIGRpZmZlcmVudAotCWxlbmd0aCByZXN0cmljdGlvbnMuIEFkZCBsZW5ndGggcGFyYW1ldGVyIHRvCi0JX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbC4KLQkqIGV2YXgtZXRpci5jOiBMaWtld2lzZS4KLQkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQWRkIGxlbmd0aAotCXBhcmFtZXRlci4KLQkqIGV2YXguaCAoRU9CSl9TX0NfU0VDU0laKTogRGVmaW5lLgotCi0JKiBldmF4LWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgdGVzdC4KLQotCSogZXZheC1lbWguYzogU1lTJCBmdW5jdGlvbnMgYXJlIHVwcGVyLWNhc2UuCi0KLQkqIGV2YXgtZWdzZC5jOiBDcmVhdGUgc2VwYXJhdGUgc2VjdGlvbnMgZm9yIGNvbW1vbiBzeW1ib2xzLgotCSogZXZheC1ldGlyLmM6IERvbid0IG91dHB1dCBjb21tb24gc2VjdGlvbi4KLQkqIGV2YXguaDogQnVtcCB1cCBzZWN0aW9uIGNvdW50LgotCi0JKiBjb25maWd1cmUuY29tOiBVc2UgNjRiaXQgaW50ZWdlcnMgd2l0aCBERUMgQy4KLQotCSogZXZheC1lZ3NkLmM6IE1ha2Ugc2VjdGlvbiBmbGFncyBkZWMgYyBjb21wYXRpYmxlLgotCi1Nb24gT2N0IDIwIDA5OjM4OjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKG5vcm1hbGl6ZSk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBOZXcgcGFyYW1ldGVyIGVsZW5ndGguICBBbGwgY2FsbGVycwotCWNoYW5nZWQuICBVc2UgcGFzc2VkIGluIGVsZW5ndGggdG8gZGV0ZXJtaW5lIHNpemUgb2YgdGhlIGV4dGVuZGVkCi0JbmFtZSB0YWJsZSBpbnN0ZWFkIG9mIGNvbXB1dGluZyBpdCBhZ2Fpbi4KLQotU3VuIE9jdCAxOSAyMzozNjoyMSAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgfD0gbm90ID0gdG8gc2V0Ci0JSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbiB1bnJlY29nbml6ZWQgc2VjdGlvbi4KLQotU3VuIE9jdCAxOSAyMTowNDo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEFjY291bnQgZm9yIHRyYWlsaW5nCi0JJy8nIGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1GcmkgT2N0IDE3IDAwOjA0OjEzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogRm9yIGV4cGxpY2l0bHkgdmVyc2lvbmVkCi0Jc3ltYm9scywgY2hlY2sgZ2xvYmFscyBsaXN0IGJlZm9yZSBtYXRjaGluZyBvbiBsb2NhbHMuCi0KLVRodSBPY3QgMTYgMDg6MTc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQscGVfcHJpbnRfaWRhdGEpOiBGaXggbWFuZ2xlZAotCXBhdGNoLgotCi1XZWQgT2N0IDE1IDEzOjQ1OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IERMTCBmbGFnLgotCShwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBETEwgZmxhZy4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JZm9yIC5zdGFiKiBzZWN0aW9ucy4gIFJlcGxhY2Ugc3RybGVuIG9mIGNvbnN0YW50IHN0cmluZ3Mgd2l0aAotCW51bWJlci4KLQotVHVlIE9jdCAxNCAxNTo0Mjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiB0bwotCW1lcmdlIGdvdCBhbmQgcmVsb2MgZW50cmllcyBmcm9tIGluZCBzeW1zIHRvIHRoZWlyIHRhcmdldC4KLQkoZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBPcGVyYXRlIG9uIHRoZSB0YXJnZXQgb2YgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQmFjayBvdXQgSEoncyBjaGFuZ2UsCi0JYXMgaXQgaXMgaW5zdWZmaWNpZW50IHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbiBjaGFuZ2VzIGFzIHdlbGwuCi0KLU1vbiBPY3QgMTMgMjM6MTA6MDggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBmb3IgUkVMQVRJVkUKLQlyZWxvY3MgZm9yIHN5bWJvbHMgaW4gc2hsaWJzIHRoYXQgaGF2ZSBiZWVuIGZvcmNlZCBsb2NhbC4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IE91dHB1dCBSRUxBVElWRXMgaW4gLmdvdCBmb3Igc2FtZS4KLQotTW9uIE9jdCAxMyAyMToyNDowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIHRoZQotCWdvdF9lbnRpZXMgb2YgdGhlIGRlZmF1bHQgc3ltYm9sIGZvciB0aGUgZGVmYXVsdCB2ZXJzaW9uZWQKLQlzeW1ib2wuICBQYXRjaCBmcm9tIGhqbEBnbnUuYWkubWl0LmVkdSwgbW9kaWZpZWQgbm90IHRvIHVzZQotCWFsbG9jYSBpbiB0aGUgbG9vcC4KLQotTW9uIE9jdCAxMyAxNzozNzozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IHVzZSB0aGUgYm90dG9tCi0JMjQgYml0cyBvZiB0aGUgUEMgd2hlbiBjb21wdXRpbmcgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgT2N0IDEwIDE2OjAxOjMwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCUNvcnJlY3QgdmFsdWUgZm9yIG1heGltdW0gcG9zaXRpdmUgMjIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUHJldmVudCBvdmVyZmxvdyBmcm9tIEhJMTZfUyBhbmQKLQlISV8xNiByZWxvY2F0aW9ucy4gIENvcnJlY3QgYml0IGFkanVzdG1lbnQgaW4gVERBIG9mZnNldHMuCi0KLVRodSBPY3QgIDkgMTY6NDM6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmNfZWxmX3toaXgyMixsb3gxMH1fcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IFVzZSB0aGVtIGZvciBISVgyMixMT1gxMCByZWxvY3MuCi0KLVdlZCBPY3QgIDggMTE6Mzg6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiBQZWRhbnRpY2x5LCBhbGlnbm1lbnRfcG93ZXIgc2hvdWxkCi0JYmUgTE9HX0ZJTEVfQUxJR04uCi0KLVdlZCBPY3QgIDggMTE6MzY6MDAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogTWlzc2VkIG9uZSBhbHBoYSogY2hhbmdlLgotCi1UdWUgT2N0ICA3IDEzOjAwOjE3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVtb3ZlIEJGRDY0IHN1cHBvcnQuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBVbmRlZi4KLQkoTUlOVVNfT05FKTogTmV3IG1hY3JvLgotCShzcGFyY19lbGZfbm90c3VwX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBESVNQNjQsUExUNjQsSElYMjIsTE9YMTAsCi0JSDQ0LE00NCxMNDQsUkVHSVNURVIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IExpa2V3aXNlLiAgTWFwIEJGRF9SRUxPQ19DVE9SIHRvIFJfU1BBUkNfNjQuCi0JKGluaXRfaW5zbl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBVc2UgaXQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgZW50cmllcyBmb3IgT0xPMTAsSElYMjIsTE9YMTAuCi0KLVR1ZSBPY3QgIDcgMTE6NDA6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogUmVtb3ZlIHN0YXRpYwotCWZ1bmN0aW9uLCBhbmQgZGVmaW5lIGFzIG1hY3JvIGluc3RlYWQuCi0KLUZyaSBPY3QgIDMgMTQ6MDI6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOyBjb25maWcuZ3Vlc3Mgbm93Ci0JcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCi0JKiBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0KLUZyaSBPY3QgIDMgMTE6MjM6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtcyB3b3JrIG9uIEFJWDoKLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIHRoZSAuZGVidWcKLQlzZWN0aW9uIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIC5kZWJ1ZyBzZWN0aW9uCi0Jc2l6ZSBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IFNFQ19SRUxPQyBvciByZWxfZmlsZXBvcywKLQlhbmQgZG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcywgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgdXAgcmVsb2MgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHdyaXRlIG91dCBzeW1ib2wgb3IgcmVsb2MgaWYgd2UKLQlhcmUgc3RyaXBwaW5nLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGluY2x1ZGUgZWxmLmxvIGFnYWluIGZvciBFTEYgdGFyZ2V0czsgaXQncwotCWFsd2F5cyBpbiB0aGUgbGlicmFyeSBhbnlob3cuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWxmMzItc3BhcmMuYyAoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBDYXN0IHRvIGJmZF9ieXRlICosIG5vdAotCWNoYXIgKiwgd2hlbiBjYWxsaW5nIGJmZF9nZXRfMzIgYW5kIGJmZF9wdXRfMzIuCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogQ2FzdCBjb250ZW50cyB0byBjaGFyICoKLQl3aGVuIGNhbGxpbmcgc3RyY3B5LgotCi1UaHUgT2N0ICAyIDE2OjE1OjUwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IFVzZSBpdC4KLQkoQkZEX1JFTE9DX1NQQVJDX3tESVNQNjQsUExUNjR9KTogTmV3IHJlbG9jcy4KLQkoQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMCxINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBPY3QgIDIgMTM6MTc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fUkVBRCBmb3IgYW4KLQl1bnJlY29nbml6ZWQgc2VjdGlvbi4gIEZyb20gSm9uIFRoYWNrcmF5IDxqb250QGhhcmxlcXVpbi5jby51az4uCi0KLVdlZCBPY3QgIDEgMTQ6MDM6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoJChCRkRfSCkpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLgotIAkoc3RtcC1iZmQtaCk6IFJlbmFtZSBmcm9tIHN0bXAtYmZkLmguCi0gCShCRkRfSF9GSUxFUywgTElCQkZEX0hfRklMRVMsIExJQkNPRkZfSF9GSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtYmluMi1oLgotCShzdG1wLWJpbjItaCk6IE5ldyB0YXJnZXQuCi0JKCQoc3JjZGlyKS9saWJiZmQuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sYmZkLWguCi0JKHN0bXAtbGJmZC1oKTogTmV3IHRhcmdldC4KLQkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sY29mZi1oLgotCShzdG1wLWxjb2ZmLWgpOiBOZXcgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogQ2hhbmdlIHN0bXAtYmZkLmggdG8gc3RtcC1iZmQtaC4gIEFkZCBzdG1wLWJpbjIuaCwKLQlzdG1wLWxiZmQtaCwgYW5kIHN0bXAtbGNvZmYtaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCi0JYXJndW1lbnRzIGFyZSBwYXJzZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMzAgMTQ6MTg6MzIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSX1NQQVJDX0dMT0JfSk1QCi0JcmVuYW1lZCB0byBSX1NQQVJDX1VOVVNFRF80Mi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlIFJfU1BBUkNfR0xPQl9KTVAgZW50cnkuCi0JKiBlbGY2NC1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKLQlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBTZXAgMjUgMTI6MTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEb24ndCBjaGVjayB0aGUgaGFzaCBjcmVhdG9yIHVudGlsCi0JYWZ0ZXIgd2UgaGF2ZSBzZXQgKnN5bV9oYXNoLgotCi1XZWQgU2VwIDI0IDE2OjUyOjI4IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLSplbGYqLgotCi1XZWQgU2VwIDI0IDExOjI3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9hX1NPVVJDRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1RPT0wgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAyMyAxOTowMzoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBFdmVuIGlmIHdlIGFyZSBub3QgZGVtYW5kCi0JcGFnZWQsIGRvbid0IHB1dCBhIGxvYWRhYmxlIHNlY3Rpb24gYWZ0ZXIgYSBub25sb2FkYWJsZSBzZWN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSW5jcmVtZW50IHRoZSBmaWxlIG9mZnNldAotCWZvciBhIHNlY3Rpb24gd2l0aCBjb250ZW50cywgZXZlbiBpZiBpdCBpcyBub3QgbG9hZGFibGUuCi0KLVN1biBTZXAgMjEgMTE6MDM6MjQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQWRkIHJldHVybiBjb2RlCi0JaW5kaWNhdGluZyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuCi0KLVRodSBTZXAgMTggMTU6MDQ6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMTcgMDk6NTQ6NTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLCB2ODUwX2VsZl9yZWxvYywKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jX21hcCwgdjg1MF9lbGZfaG93dG9fdGFibGUpOgotCUFkZCBzdXBwb3J0IGZvciB0aGUgQ0FMTFQgcmVsb2NzLgotCi0JKiByZWxvYy5jIChDT01NRU5UKTogQWRkIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kCi0JQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgY2hlY2tzIHRvIGNhdGNoCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCBub24tZXhpc3RhbnQgc3ltYm9scy4KLQotVHVlIFNlcCAxNiAxNDoyMDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgQkZSX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSwKLQl2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwKTogQWRkIHN1cHBvcnQgZm9yIGEgMTYKLQliaXQgcmVsb2MgaW4gdGhlIHRpbnkgZGF0YSBhcmVhLgotCi1Nb24gU2VwIDE1IDExOjI3OjM2IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBDaGFuZ2UgcGMtcmVsYXRpdmUgcmVsb2NzCi0Jb3ZlciAyXjMyIGJ5dGVzIHRvIGJlIGFic29sdXRlLiAgTmVlZGVkIGJlY2F1c2UgRDMwViBQQyBkb2Vzbid0Ci0JbmVjZXNzYXJpbHkgd3JhcC4KLQotCSogcmVsb2MuYywgZWxmMzItZDMwdi5jIChCRkRfUkVMT0NfRDMwVl85X1BDUkVMLAotCUJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUik6IE5ldyByZWxvY3MuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jXzIxKTogTmV3IGZ1bmN0aW9uLgotCURvIDE1IGFuZCAyMSBiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SKToKLQlOZXcgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkZW5kIG5lZWRzIHRvIGJlCi0JYWRkZWQgdG8gdGhlIHJlbG9jYXRpb24sIG5vdCBvcidkLgotCi1XZWQgU2VwIDEwIDE1OjE3OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MpOiBSZW1vdmUgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAxMCAxMToxNzo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBVc2Ugc3RyY2FzZWNtcC4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggYXJjaF9uYW1lICsgIjoiICsKLSAJcHJpbnRhYmxlX25hbWUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBUZXN0IGZvciBtYXRjaCB3aXRoIHByaW50YWJsZV9uYW1lIC0gIjoiLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIHc2NSwgaDgzMDAsIGg4NTAwLCB6OGssIGk5NjAgc3BlY2lhbAotIAljYXNlcy4gIEVhY2ggaW1wbGVtZW50cyB0aGVpciBvd24gc2NhbiBmdW5jdGlvbi4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IERlbGV0ZSAzODYsIDI5MDAsIDg2MCwgbWlwcyAyMDAwLCBtaXBzIDQ0MDAKLSAJc3BlY2lhbCBjYXNlcy4gIFNpbmNlIGluZm8tPm1hY2ggPT0gMC4gIFRoZSB0ZXN0IG1hY2ggPT0gbnVtYmVyCi0gCWZhaWxzLgotCShiZmRfYXJjaF9saXN0KTogTmV3IGZ1bmN0aW9uLCByZXR1cm4gbmFtZSBvZiBhbGwgdGhlIHN1cHBvcnRlZAotIAlhcmNoaXRlY3R1cmVzLgotCi1UdWUgU2VwICA5IDEwOjIxOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEJyZWFrIGFmdGVyCi0JZGVjb2RpbmcgYXJjaGl0ZWN0dXJlLgotCSh2ODUwX2VsZl9yZWxvYyk6IERvIG5vdCBjb21wbGFpbiBpZiBhIFJfVjg1MF9MTzE2IHJlbG9jIGhhcyBiaXQKLQkxNSBzZXQuCi0KLVN1biBTZXAgIDcgMTI6MjU6MjIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogYmZkL2VsZjY0LWFscGhhLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBGaXggdGhlIGhvd3RvIHRhYmxlLgotCi1UaHUgU2VwICA0IDA5OjQ0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtdjg1MC5jLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLXY4NTAuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiByZWxvYy5jOiBSZW1vdmUgZXh0cmFuZW91cyBjb21tYXMgZnJvbSByZWxvY2F0aW9uIGVudHJpZXMuCi0JUmVtb3ZlIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFB1dCBYVFlfQ00vWE1DX1REIHN5bWJvbHMKLQlpbiBzZWN0aW9ucyBuYW1lZCAudG9jYnNzIHJhdGhlciB0aGFuIC5ic3MuCi0KLVdlZCBTZXAgIDMgMTE6MjM6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZW1vdmVkCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMjA6NDQ6MTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogSGFuZGxlIENfU1lTVEVNIHN5bXMKLQl0aGUgc2FtZSBhcyBDX0VYVCBzeW1zLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEaXR0by4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRGl0dG8uCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBBZGQgc2F2ZV9nbG9iYWxfdG9fc3RhdGljLiAgVXNlCi0JaXQgdG8gcHJlc2VydmUgYW5kIHJlc3RvcmUgc3RhdGUgb2YgZ2xvYmFsX3RvX3N0YXRpYyBmbGFnLgotCi1UdWUgU2VwICAyIDE3OjQ1OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBTZXQgbWFjaGluZSBudW1iZXIgYmFzZWQgb24KLQliaXRzIGluIGVfZmxhZ3MgZmllbGQgcmF0aGVyIHRoYW4gbWFnaWMgbnVtYmVycy4KLQkodjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MsCi0Jdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhLCB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLAotCXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb25zLgotCi1UdWUgU2VwICAyIDE3OjQzOjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBSZW1vdmUgVjg1MEUgbWFnaWMgbnVtYmVyLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRUEgbWFnaWMgbnVtYmVyLgotCi1UdWUgU2VwICAyIDE3OjM1OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcmMuYyAoYXJjX2dldF9tYWNoKTogUHJvcGVybHkgc2NhbiBkZWZpbmVkIG1hY2ggZW50cmllcy4KLQotVHVlIFNlcCAgMiAxODoyOTozNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFBDIHJlbGF0aXZlCi0JaW5zdHJ1Y3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZQotCWN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBTaW1pbGFybHkuCi0KLVR1ZSBTZXAgIDIgMTU6NDU6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYzogVXNlIGEgbWFjcm8gdG8gY29uc3RydWN0IGJmZF9hcmNoX2luZm9fdHlwZQotCWVudHJpZXMuCi0KLQkqIHJlbG9jLmMsIGxpYmJmZC5oLCBiZmQtaW4yLmgsIGVsZjMyLXY4NTAuYzogUmVwbGFjZQotCUJGRF9SRUxPQ19WODUwX3tTREEvVERBL1pEQX1fT0ZGU0VUIHJlbG9jcyB3aXRoIG5ldyBiaXQgcGF0dGVybgotCXNwZWNpZmljIHZlcnNpb25zOiBCRkRfUkVMT0NfVjg1MF97YXJlYX1fe2JpdHN9X09GRlNFVC4KLQotVGh1IEF1ZyAyOCAxNzowMTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmM6IFJlbW92ZSAicGxhaW4iIGZyb20gdjg1MCBwcmludGFibGUgbmFtZS4KLQkoc2Nhbik6IFVzZSBzdHJjYXNlY21wLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoc2Nhbl9tYWNoKTogQ29tcGFyZSB3aXRoIHRhYmxlIGluc3RlYWQgb2YgaGFyZHdpcmVkIHRvCi0gCWp1c3Qgc2gvU0gsIHVzZSBzdHJjYXNlY21wLgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNoMyBldC5hbC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc2gsIC4uLik6IERlZmluZS4KLQotV2VkIEF1ZyAyNyAxNzozMzowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNodXJlc19saXN0KTogQWx3YXlzIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0LgotCi1UdWUgQXVnIDI2IDE3OjI2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1hcmMuYy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1hcmMuYy4KLQkoZWxmMzItYXJjLmxvKTogUmVtb3ZlIGV4cGxpY2l0IGRlcGVuZGVuY3kuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogU2V0IEVYRUVYVF9GT1JfQlVJTEQuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKE1LRE9DKTogVXNlIEVYRUVYVF9GT1JfQlVJTEQsIG5vdCBFWEVFWFQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBdWcgMjUgMTY6MTQ6MzQgMTk5NyAgQ2hyaXN0b3BoZXIgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsYXRlc3QgZGV2byBhdXRvY29uZiBmb3IgTlQgc3VwcG9ydAotCi1Nb24gQXVnIDI1IDE2OjExOjA0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IElmIEIgaXMgYSBkZWZhdWx0IHR5cGUsIHJldHVybiBBLgotCi1Nb24gQXVnIDI1IDE1OjM1OjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmMgKHNjYW4pOiBOZXcgZnVuY3Rpb24uCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBOZXcgc3RydWN0dXJlLgotCShiZmRfdjg1MF9hcmNoKTogQWRkIGxpbmsgaW50byBhcmNoX2luZm9fc3RydWN0dXJlLgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFsbCB2ODUwIHZhcmlhbnRzIHVzZSB0aGUgYmZkX2FyY2hfdjg1MAotCWFyY2hpdGVjdHVyZS4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGUpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgotCi0JKiBlbGYzMi12ODUwLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZhdWx0IHRvIHY4NTBlIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgbWFjaGluZSBudW1iZXIuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZWEpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZWEuCi0KLQkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGVhIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIG1hY2hpbmUgbnVtYmVyLgotCi1Nb24gQXVnIDI1IDE0OjA3OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IENsZWFyIHRoZQotIAljYWNoZWRfc3RhYiBmaWVsZCBpZiB0aGUgb2Zmc2V0IHByZXZlbnRzIHVzIGZyb20gdXNpbmcgdGhlIGNhY2hlLgotCi1Nb24gQXVnIDI1IDEyOjA4OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkodmVjKSk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbgotCWZsYWdzLgotCSogYW91dC1hcm0uYyAoYW91dF9hcm1fbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShhb3V0X2FybV9iaWdfdmVjKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X3ZlY19iaWdfaG9zdCk6IExpa2V3aXNlLgotCShiX291dF92ZWNfbGl0dGxlX2hvc3QpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoYW91dF9taXBzX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoYW91dF9taXBzX2JpZ192ZWMpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAxOSAxMDowOToxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NGTEFHUyk6IERlZmluZSB0byAxLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZ25vcmUgaW5jb21pbmcgU1RZUF9JTkZPCi0JYml0IGluIHNfZmxhZ3MgaWYgQ09GRl9BTElHTl9JTl9TX0ZMQUdTIGlzIGRlZmluZWQuCi0KLVR1ZSBBdWcgMTkgMDg6NDc6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfQUxJR04sIFBVVF9TQ05IRFJfQUxJR04pOiBEZWZpbmUuCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05IRFJfTkxOTk8pOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENvbmRpdGlvbmFsbHkgY29tcGlsZSBpbiBpZgotCUNPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgaXMgZGVmaW5lZC4gIENvbnZlcnQgYWxpZ25tZW50IHRvIHBvd2VyCi0Jb2YgdHdvIGZvciBJOTYwIG9ubHkuCi0JKiBjb2Zmc3dhcC5oIChHRVRfU0NOSERSX05SRUxPQywgUFVUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05ESFJfTkxOTk8sCi0JUFVUX1NDTkhEUl9OTE5OTywgR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IFByb3ZpZGUKLQlkZWZhdWx0IGRlZmluaXRpb25zLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXNlIEdFVF9TQ05IRFJfRkxBR1MsIEdFVF9TQ05IRFJfTlJFTE9DLAotCUdFVF9TQ05IRFJfTkxOTk8sIGFuZCBHRVRfU0NOSERSX0FMSUdOLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBQVVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0FMSUdOLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IERlcGVuZHMgdXBvbiBjb2Zmc3dhcC5oLgotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfRkxBR1MpOiBEZWZpbmUKLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGFsaWdubWVudCBmaWVsZCBpbgotIAlzZWN0aW9uIGhlYWRlciBmb3IgVElDODBDT0ZGIGZpbGVzLgotCi1Nb24gQXVnIDE4IDExOjM2OjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUsIHY4NTBfZWxmX3JlbG9jX21hcCwKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jLAotCXY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIHN1cHBvcnQgZm9yCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoQ09NTUVOVCk6IEFkZCBzdXVwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTAotCXJlbG9jYXRpb24uCi0KLQkqIGxpYmJmZC5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogYmZkLWluMi5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGU6IE5ldyBmaWxlLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYmZkLWluMi5oIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGVhOiBOZXcgZmlsZS4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgQXVnIDE1IDEyOjAxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ29ycmVjdGx5IGhhbmRsZSB0aGUgb2Zmc2V0Ci0JYXJndW1lbnQgYXMgc2VjdGlvbiByZWxhdGl2ZSwgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUgYWRkcmVzcy4KLQlGcm9tIEphbiBIb29nZW5yYWFkIDxob29nZW5yZEBuYXRsYWIucmVzZWFyY2gucGhpbGlwcy5jb20+LgotCi1GcmkgQXVnIDE1IDA0OjU4OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFyYy0qLWVsZiopOiBBZGQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogQWRkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtYXJjLmxvLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1hcmMubG8uCi0JKGNwdS1hcmMubG8sZWxmMzItYXJjLmxvKTogQWRkIHJ1bGVzIGZvci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYyAoYXJjaGl0ZWN0dXJlIGxpc3QpOiBBZGQgYmZkX2FyY2hfYXJjLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfYXJjX2FyY2guCi0JKGJmZF9tYWNoX2FyY19iYXNlKTogRGVmaW5lLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsQkZEX1JFTE9DX0FSQ19CMjYpOiBBZGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0KTogQWRkIHRoZW0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LWFyYy5jLCBlbGYzMi1hcmMuYzogTmV3IGZpbGVzLgotCSogZWxmLmMgKHByZV9oZWFkZXJzKTogUmVjb2duaXplIGJmZF9hcmNoX2FyYy4KLQotVHVlIEF1ZyAxMiAxMTo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIG5vIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUKLQlkYXRhIHNlY3Rpb24gaXMgY29ycmVjdGx5IHJvdW5kZWQgdG8gYSBwYWdlIGluIHRoZSBmaWxlLgotCi1Nb24gQXVnIDExIDEyOjQ1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgZW1pdCB0aGUgc3RyaW5nIHRhYmxlIGlmCi0JdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLVN1biBBdWcgMTAgMTQ6NDU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXN0Z28zMi5jOiBSZW5hbWUgZnJvbSBjb2ZmLXN0dWJnbzMyLmMgdG8gYXZvaWQgb2xkIFN5c3RlbSBWCi0JZmlsZSBzeXN0ZW0gMTQgY2hhcmFjdGVyIGxpbWl0LgotCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxODozNDozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiAoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1kMTB2LmMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEF1ZyAgNiAxODo1Njo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkb2NkaXIpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAyMzowNTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuMS4KLQotTW9uIEF1ZyAgNCAxMjowMDozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBwYXRjaGVzLgotCi1TdW4gQXVnICAzIDA4OjE1OjEyIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiAgTmV3IGZ1bmN0aW9uIHRvIGFkZCBhIHNlY3Rpb24KLQl0byB0aGUgY29yZSBmaWxlIGJmZC4KLQkocnM2MDAwY29mZl9jb3JlX3ApOiAgVXNlIG1ha2VfYmZkX2FzZWN0aW9uIHRvIGFkZCB0aGUgY29yZSBmaWxlCi0Jc2VjdGlvbnMuCi0JVXNlIEJGRCByb3V0aW5lcyB0byBzZWVrLCByZWFkIGFuZCBzdGF0IHRoZSBjb3JlIGZpbGUuCi0JSGFuZGxlIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLQlyZWdpb25zLCB0aGVzZSBhcmUgYXZhaWxhYmxlIGluIEFJWCA0IGNvcmUgZmlsZXMuCi0KLUZyaSBBdWcgIDEgMTI6NTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2luY2x1ZGUubTQ6IE1vdmUgYWNtYWNyb3MubTQgaW4gaGVyZS4gIFJlbW92ZSBBTV9QUk9HX0xJQlRPT0wKLQljb3B5OyB1c2UgYSBwYXRjaGVzIGxpYnRvb2wgaW5zdGVhZC4KLQkqIGFjbWFjcm9zLm00OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDE5OjU1OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY21hY3Jvcy5tNDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUgc2hhcmVkIGxpYnJhcnkKLQloYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UgQUNfQ09ORklHX0hFQURFUiB3aXRoCi0JQU1fQ09ORklHX0hFQURFUi4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLgotCUNhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLCBBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIENoYW5nZSBhbGwKLQkubyBmaWxlcyB0byAubG8uICBSZW1vdmUgc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IENoYW5nZSAubyB0byAubG8uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBWRVJTSU9OOiBSZW1vdmUuCi0KLVRodSBKdWwgMzEgMTI6MDk6MjAgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IFRFWFRSRUwKLSAJaWYgdGhlcmUgaXMgb25seSBhIHJlbG9jYXRpb24gdG8gYSByZWFkLW9ubHkgYnV0IG5vdCBhbGxvY2F0YWJsZQotIAlzZWN0aW9uIChsaWtlIC5zdGFiKS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IENvcnJlY3QgdmFyaW91cyBjb21tZW50cy4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBUaGVzZSBzZWN0aW9ucyBhcmUgbm90Ci0JY3JlYXRlZCBieSB0aGUgbGlua2VyICh0aGF0IGlzLCB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JcHV0dGluZyBkYXRhIGluIHRoZW0pLiBJbiBwYXJ0aWN1bGFyLCB0aGV5IGNhbiBiZSB0aGUgc291cmNlCi0JYW5kIHRhcmdldCBvZiByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGVjayBwb3N0Y29uZGl0aW9uIG9mCi0gCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIEFsaWduIDE2LWJ5dGUgY29tbW9uCi0gCW9iamVjdHMgKGZvciBpbnN0YW5jZSwgJ2xvbmcgZG91YmxlJykgdG8gMTYtYnl0ZSBib3VuZGFyaWVzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2UgdGhlIGNvZGUgdGhhdCBnZW5lcmF0ZXMKLQlzZWN0aW9uIHN5bWJvbHMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3Igc3BhcmMsIHJlZHVjaW5nIHRoZQotCW51bWJlciBvZiBzZWN0aW9uIHN5bWJvbHMgb3V0cHV0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKLQliZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wuICBNYWtlIGRlZmF1bHQgY2FzZSB0aGUKLQlzYW1lIGFzIGNvcnJlc3BvbmRpbmcgY29kZSBmb3Igc3BhcmMsIGZpeGluZyBidWcgaW52b2x2aW5nCi0JLnJlbGEuc3RhYnMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRml4IGNhc2UgaW52b2x2aW5nIEdPVCBzeW1ib2xzCi0gCWZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIHZlcnNpb25pbmcgKGJ5IHJlcGxpY2F0aW5nCi0gCWNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIHNwYXJjKS4gIFRyZWF0IFJfUFBDX1JFTEFUSVZFIFJFTEEgcmVsb2NzCi0gCWFzIHVzdWFsIGluIEVMRiwgbm90IGFzIHBzZXVkby1SRUwgcmVsb2NzIChhcyB0aGUgc3BhcmMgbGlua2VyCi0gCWRvZXMpLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgaGFuZHkgZGVidWdnaW5nIGNvZGUgZm9yIHdoZW4KLSAJYXNzZXJ0aW9uIGZhaWxzLiAgQWRkIHNvbWUgbW9yZSAnc3ltYm9sIG1hZGUgbG9jYWwgYmVjYXVzZSBvZgotIAl2ZXJzaW9uaW5nJyBjYXNlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcGUgd2l0aCBhZGRlbmQgd2hlbgotCXByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbiBhcyByZXF1aXJlZCBieSBBQkkuCi0KLVdlZCBKdWwgMzAgMjE6MzA6MzUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogUmVtb3ZlIGFueQotCXZlcnNpb24gaW5mbyBpZiB0aGlzIHN5bWJvbCBjYW1lIGZyb20gYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHRoZSB2ZXJzaW9uIGluZm8gb2YgYSBzeW1ib2wKLQlvbmx5IGlmIHRoZSBvYmplY3QgYWN0dWFsbHkgY29udGFpbnMgdmVyc2lvbiBkZWZpbml0aW9ucyBhbmQKLQlkZWZpbmVzIHRoaXMgc3ltYm9sLgotCi1Nb24gSnVsIDI4IDE4OjA3OjQzIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IEFkZCBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNyb3MuCi0gICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKLSAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBjaGV3IGV4ZWN1dGFibGUuCi0KLU1vbiBKdWwgMjggMDI6NTA6MjkgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBJZiBDT1JFX1RSVU5DIGlzIHNldCwgcHJpbnQKLQlhIHdhcm5pbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIGVycm9yLgotCi1TdW4gSnVsIDI3IDE5OjU0OjE0IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZCBzZW1pY29sb24gdG8gbWFrZSBNU1ZDIGhhcHB5LgotCi1GcmkgSnVsIDI1IDE0OjUwOjA4IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY2lzY28tY29yZS5jOiBkZWZpbmUgc2lnbmFscyBmb3Igd2luZ2RiLgotCi1GcmkgSnVsIDI1IDE2OjI3OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogT25seSBtZXJnZSBmaWxlcyB3aXRoCi0JdGhlIHNhbWUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzLgotCi1GcmkgSnVsIDI1IDA4OjIyOjE1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXNlIFJfREFUQV9FWFBSIGZvciB0aGUKLQlkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmIHRoZSByZWxvY2F0aW9uIHNpemUgaXMgMzIgYml0cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUi4KLQotV2VkIEp1bCAyMyAxNjowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBEb24ndCBvZmZzZXQgYSBjb21tb24gc3ltYm9sIGJ5Ci0JaXRzIHZhbHVlIGlmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLgotCi1UdWUgSnVsIDIyIDE3OjE5OjQ1IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29mZi1zdHViZ28zMi5jOiBOZXcgZmlsZS4KLQkqIGdvMzJzdHViLmg6IE5ldyBmaWxlLgotCSogY29mZi1pMzg2LmM6IElmIENPRkZfR08zMl9FWEUsIGluY2x1ZGUgY29mZi9nbzMyZXhlLmguCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IEludm9rZQotCUNPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFIGFuZCBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgaWYgdGhleQotCWFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2F1eF9pbik6IEludm9rZSBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9JTl9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogSW52b2tlIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKiB0YXJnZXRzLmMgKGdvMzJzdHViYmVkY29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBnbzMyc3R1YmJlZGNvZmZfdmVjLgotCSogY29uZmlndXJlLmluIChnbzMyY29mZl92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpWzM0NTZdODYtKi1nbzMyKik6IENoYW5nZSB0byBiZSBsaWtlIG5ldyBtc2Rvc2RqZ3BwKi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3R1YmdvMzIuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3R1YmdvMzIuYy4KLQkoSEZJTEVTKTogQWRkIGdvMzJzdHViLmguCi0KLVR1ZSBKdWwgMjIgMTU6MDk6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBmZG9wZW4uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENoZWNrIEhBVkVfRkRPUEVOIHJhdGhlciB0aGFuIFZNUyBvcgotCV9fR08zMl9fLiAgUmVpbmRlbnQgYSBiaXQuCi0KLVN1biBKdWwgMjAgMjA6MDU6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBTRUNfTElOS0VSX0NSRUFURUQKLQlmbGFnIGZvciBuZXdseSBjcmVhdGVkIHNlY3Rpb25zLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGlzY2FyZCBuZXdseSBjcmVhdGVkIHNlY3Rpb25zCi0JaWYgc2hhcmVkIGxpYnJhcnkgaXMgZHlub2JqLgotCi1Nb24gSnVsIDE0IDE1OjMzOjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlcgotCWluY2x1ZGluZyBhIHNlY3Rpb24gaW4gYSBzZWdtZW50IHdvdWxkIGZvcmNlIHVzIHRvIHNraXAgYSBwYWdlLAotCWFsaWduIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHNlZ21lbnQgdG8gYXZvaWQgd3JhcGFyb3VuZAotCXByb2JsZW1zLgotCi1UdWUgSnVsICA4IDEyOjExOjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWxpemUKLSAJdGFyZ2V0IGlkIGZpZWxkIHRvIFRJQzgwX1RBUkdFVF9JRC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFN3YXAgb3V0IHRhcmdldCBpZCBmaWVsZAotIAlpZiB1c2VkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IFN3YXAgaW4gdGFyZ2V0IGlkIGZpZWxkIGlmIHVzZWQuCi0KLU1vbiBKdWwgIDcgMTY6NDE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGkzODZjb2ZmX3ZlYyk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbl9mbGFncy4KLQotTW9uIEp1biAzMCAxNDoyOToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBVc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIG5vdAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgZm9yIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotVGh1IEp1biAyNiAwMToyNjozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb24KLQlpbmRpcmVjdGlvbiBzeW1ib2wgaXMgb3ZlcnJpZGRlbiwgbWFrZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHBvaW50Ci0JYXQgdGhlIHJlYWwgb3ZlcnJpZGluZyBzeW1ib2wuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGludmFsaWQKLQlzdHJpbmcgaW5kZXguCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFVzZSB0aGUgcmlnaHQgc2VjdGlvbiBmb3IgYQotCWNvbW1vbiBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogSWYgYSBjb21tb24KLQlzeW1ib2wgd2FzIGluIC5zY29tbW9uLCBtYXJrIGl0IGFzIFNITl9NSVBTX1NDT01NT04uCi0KLVdlZCBKdW4gMjUgMTI6NDM6MTAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9scyk6IFJlc29sdmUgaW5kaXJlY3QgYW5kIHdhcm5pbmcKLQlzeW1ib2xzIGJlZm9yZSBjaGVja2luZyBmb3IgbmV3IHN5bWJvbHMuCi0KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVmaWxlX25vdGUpOiBNb3ZlIG91dCBvZiBIQVZFX1NZU19QUk9DRlNfSC4KLQotVHVlIEp1biAyNCAxMToyMDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlYWQgdGhlIGZfb3B0aGRyIGJ5dGVzIGZyb20gdGhlCi0JZmlsZSwgbm90IGFvdXRzeiBieXRlcyAodGhleSBhcmUgZGlmZmVyZW50IGluIFhDT0ZGIC5vIGZpbGVzKS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgc3ltYm9scyB0byBiZQotCXJlZGVmaW5lZCBieSBvYmplY3RzIGluY2x1ZGVkIGZyb20gYXJjaGl2ZXMuCi0KLU1vbiBKdW4gMjMgMTg6MDM6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBJbiB0aGUgY2FzZSBvZiBhIG5ldyBkZWZpbmVkCi0Jc3ltYm9sIG92ZXJyaWRpbmcgYW4gb2xkIGRlZmluZWQgc3ltYm9sLCByZXR1cm4gdGhlIGhhc2ggdGFibGUKLQllbnRyeSB3aGljaCB3ZSBtb2RpZnksIGV2ZW4gaWYgaXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCWluZGlyZWN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGUgcmVhbCBuYW1lIG9mIHRoZSBzeW1ib2wgZ2V0cwotCW92ZXJyaWRkZW4sIGNvbnZlcnQgdGhlIHZlcnNpb25lZCBzeW1ib2wgaW50byBhbiBpbmRpcmVjdCBzeW1ib2wKLQl0byB0aGUgcmVhbCBzeW1ib2wuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQllbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGwgaXQuCi0KLVN1biBKdW4gMjIgMTk6NDA6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBoYWNrIHRvCi0JaGFuZGxlIGNhc2Ugd2hlcmUgQ09GRiBmaWxlaGRyIGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdyBQRQotCWhlYWRlci4KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlbW92ZSB1c2VsZXNzIHNlZWsgdG8gY3VycmVudAotCWxvY2F0aW9uLgotCi1XZWQgSnVuIDE4IDE5OjAzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1cvaW5kciB0byBmcm9tIENSRUYgdG8KLQlSRUZDLgotCi1UdWUgSnVuIDE3IDExOjU1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgc3RyaXBwaW5nIGRlYnVnZ2luZwotCXN5bWJvbHMsIHNraXAgTl9BQlMgc3ltYm9scyB3aXRoIGRlYnVnZ2luZyBzdG9yYWdlIGNsYXNzZXMuCi0KLU1vbiBKdW4gMTYgMTg6NTY6MjcgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMKgotCXJlbG9jcyBpbiBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBDb3BlCi0Jd2l0aCBhZGRlbmQgd2hlbiBwcm9jZXNzaW5nIGEgR09UIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY3JlYXRlIHN5bWJvbHMKLQlmb3Igc2VjdGlvbnMgdGhhdCB0aGUgbGlua2VyIGRpZG4ndCBjcmVhdGUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHRyeSB0byB3cml0ZSBvdXQgYSBzZWN0aW9uCi0Jc3ltYm9sIGlmIGl0IHdhcyBjcmVhdGVkIGluIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wbGFpbiBpZiB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgcmVsb2MKLQlyZWxhdGl2ZSB0byBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZG4ndCBvdXRwdXQgYSBzeW1ib2wuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFuIHVwLiAgUExUCi0JcmVsb2NzIGFyZSAncmVsYScgcmVsb2NzLCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4gIC5yZWxhLnBsdCBpcyBub3QKLQlhIHJlYWQtb25seSBzZWN0aW9uLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSBpdC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRW50cmllcyBpbiB0aGUKLQkucmVsYS5ic3Mgc2VjdGlvbiBhcmUgKG9mIGNvdXJzZSkgJ3JlbGEnIHJlbG9jcyBub3QgJ3JlbCcgcmVsb2NzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0aWFsaXNlIHNyZWxnb3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEBnb3Qgb2Zmc2V0cyBhcmUgNCBmcm9tIHN0YXJ0IG9mIHRoZQotCWFjdHVhbCAuZ290IHNlY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFRoZSB0aHJlZSByZXNlcnZlZAotCXdvcmRzIHN0YXJ0IGZyb20gdGhlIHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogJy5yZWxhJyBpcyA1Ci0JY2hhcmFjdGVycywgbm90IDQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZQotCV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiB0byBjcmVhdGUgdGhlIEdPVCByYXRoZXIgdGhhbgotCXBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLiBDcmVhdGUgdGhlICcucmVsYS5nb3QnIHNlY3Rpb24KLQlvdXJzZWx2ZXMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIEdPVCByZWxvY2F0aW9ucyB3aGVuIGEKLQlzeW1ib2wgaGFzIGEgR09UIGVudHJ5LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWNvcmQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIHRocm91Z2gKLQl0aGUgR09ULCBhbmQgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIEdPVCBmb3IgZWFjaCBzdWNoIHN5bWJvbC4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWxldGUgdW51c2VkIC5nb3QucGx0IHN0dWZmLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgTElOS0VSX1NFQ1RJT05fR09UCi0Jc3R1ZmYuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEdPVDE2X0hBIHJlbG9jcyBzaG91bGQgYmUKLQl0cmVhdGVkIGluIGEgc2ltaWxhciB3YXkgdG8gQUREUjE2X0hBIHJlbG9jcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUExUUkVMMjQgcmVsb2NzIGRvIG5vdCBnZXQgY29waWVkIGludG8KLQlzaGFyZWQgb2JqZWN0czsgdGhlIGxpbmtlciBtdXN0IGRlYWwgd2l0aCB0aGVtLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFN0b3Agc2V0dGluZwotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byB0aGUgd3JvbmcgdmFsdWU7IGRlbGV0ZSB1bnVzZWQKLQlMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgQkZEIGNhbGxzIHRvIGdldCBHT1QKLQlzZWN0aW9uLCBub3QgRUxGLXNwZWNpZmljIGNhbGxzLgotCShlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCB0byAxLgotCShlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCk6IFNldCB0byA0LgotCSogZWxmLWJmZC5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkICdwbHRfbm90X2xvYWRlZCcgbWVtYmVyCi0JZm9yIHdoZW4gbGQuc28gZmlsbHMgaW4gdGhlIFBMVDsgYW5kICdnb3Rfc3ltYm9sX29mZnNldCcgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEFwcGx5Ci0JcGx0X25vdF9sb2FkZWQgbWVtYmVyLgotCShfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBcHBseSBnb3Rfc3ltYm9sX29mZnNldC4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCBkZWZhdWx0IHRvCi0JJ2xvYWRlZCcuCi0JKGVsZl9iYWNrZW5kX0dfT19UX29mZnNldCk6IFNldCBkZWZhdWx0IHRvIDAuCi0JKGVsZk5OX2JlZCk6IFNldCBhZGRlZCBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdhcyBzZXR0aW5nCi0JRFRfUkVMRU5UIGluIHNoYXJlZCBvYmplY3RzOyBzaG91bGQgYmUgRFRfUkVMQUVOVC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFByb3BhZ2F0ZQotCVJfUFBDX0FERFIxNl9IQSByZWxvY3MgdG8gc2hhcmVkIG9iamVjdHMuIENvcGUgd2l0aCBjYXNlIHdoZXJlCi0Jc3VjaCBhIHJlbG9jIChpbiBhIG5vbi1zaGFyZWQgb2JqZWN0KSByZWZlcnMgdG8gYSBzeW1ib2wgdGhhdCdzCi0Jbm90IGRlZmluZWQuCi0KLU1vbiBKdW4gMTYgMTQ6NDI6MTQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmY29kZS5oIChwdXRfc2lnbmVkX3dvcmQpOiBEZWZpbmUuCi0JKGdldF9zaWduZWRfd29yZCk6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luKTogVXNlIGdldF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kIGZpZWxkLgotCShlbGZfc3dhcF9yZWxvY2Ffb3V0KTogVXNlIHB1dF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kCi0JZmllbGQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCWJmZF9nZXRfc2lnbmVkXzMyIHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBVc2UKLQliZmRfaF9nZXRfc2lnbmVkXzY0IHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0KLU1vbiBKdW4gMTYgMTI6MzE6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGdlbmVyYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LCBkbyB0aGUgcmVsb2NhdGlvbiBpZiB0aGUgaW5wdXQgc2VjdGlvbiBpcyBub3QKLQlhbGxvY2F0ZWQgaW4gbWVtb3J5LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAotCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENhbGwgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLiAgUGVybWl0IGEgc3ltYm9sIHRvIGJlCi0JZm9yY2VkIGxvY2FsIGV2ZW4gaWYgTkVFRFNfUExUIGlzIHNldC4gIFdoZW4gZm9yY2luZyBhIHN5bWJvbCB0bwotCWJlIGxvY2FsLCBjbGVhciBORUVEU19QTFQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJlZC4KLQotV2VkIEp1biAxMSAyMjo0NDoyMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBOZXcgc3RydWN0dXJlCi0JZm9yIGRlcml2ZWQgZWxmIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICBSZWZlcmVuY2VzIHRvCi0JZWxmX2xpbmtfaGFzaF9lbnRyeSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlKTogTmV3IHN0cnVjdHVyZSBmb3IgZGVyaXZlZCBlbGYKLQlsaW5rZXIgaGFzaCB0YWJsZS4KLQkoZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSGFuZGxlICJjYWxsIiAtPiAiY2FsbHMiLCByZW1vdmFsCi0Jb2YgcHJvbG9ndWUgY29kZSwgYW5kIGNhbGw6MzItPmNhbGw6MTYgcmVsYXhpbmcuCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbzogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lsaW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi1XZWQgSnVuIDExIDAwOjAwOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2FsbCBmaW5pc2hfZHluYW1pY19zeW1ib2wKLQlmb3IgYSBzeW1ib2wgd2hpY2ggaXMgYmVpbmcgZm9yY2VkIHRvIGJlIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV3JpdGUgb3V0IHRoZQotCXJlbG9jYXRpb24gdmFsdWUgZm9yIGEgR09UIHJlbG9jIGZvciBhIHN5bWJvbCB3aGljaCBpcyB0dXJuaW5nCi0JaW50byBhIGxvY2FsIHN5bWJvbC4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEKLQlsb2NhbCBzeW1ib2wsIHdyaXRlIG91dCBhIFJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQKLQlyZWxvYy4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItc3BhcmMuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHZXQgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBpZiB0aGUgc3ltYm9sIGlzIHR1cm5pbmcgaW50byBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk3LTA2LTEwIDIyOjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHNvIHJlYWQgdmVybmVlZAotCWluZm9ybWF0aW9uIGJ5IGNhbGxpbmcgYF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzJy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzIGxvb2sgZm9yCi0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgdmVybmVlZCByZWNvcmRzLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2Ugc29uYW1lIG9mIHNoYXJlZCBvYmplY3QKLQlmb3IgdmVybmVlZCByZWNvcmQgaWYgaXQgaXMgYXZhaWxhYmxlLgotCi1UdWUgSnVuIDEwIDExOjEzOjAzIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNwdS1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGNvbXBhdGlibGUgYW5kIHNjYW4uCi0JKiBjb2ZmbGluay5jOiBBZGQgcHJvdG90eXBlIGZvciBtYXJrX3JlbG9jcy4KLQotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6IENoYW5nZSBmaWxlbmFtZSB0bwotCWNvbnN0IHBvaW50ZXIuICBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICA5IDEyOjM0OjIxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElnbm9yZSByZWxvY2F0aW9ucyBvZgotCXNlY3Rpb25zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQuCi0KLTE5OTctMDYtMDYgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBXaGVuIHNlYXJjaGluZwotCWZvciBrbm93biB2ZXJzaW9uIHN5bWJvbCBza2lwIG5vbi1tYXRjaGluZyB2ZXJkZWYgcmVjb3Jkcywgbm90Ci0JbWF0Y2hpbmcgcmVjb3Jkcy4KLQotVGh1IEp1biAgNSAxNTo1Mjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBhIGxvbmcsCi0Jbm90IGEgYmZkX3ZtYSwgdG8gdGhlIGJhc2UgZmlsZSwgdG8gbWF0Y2ggaG93IGRsbHRvb2wgcmVhZHMgaXQuCi0KLVR1ZSBKdW4gIDMgMTY6NTc6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHRodW1iIHJlbG9jYXRpb25zLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotCSogbGliYmZkLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotTW9uIEp1biAgMiAxMDo0MTo1MiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEZpeCA2ODA2MCBjcHUgbmFtZS4KLQotRnJpIE1heSAzMCAxMjo0NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBkeW5pbmR4Ci0JZm9yIGEgc2VjdGlvbiBldmVuIGlmIGl0IGlzIG5vdCBsb2FkZWQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIFBFIGZpbGUsIGRvbid0IHN1YnRyYWN0Ci0Jc2VjdGlvbiBWTUEuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNlcGFyYXRlIHNlY3Rpb24gVk1BIGhhbmRsaW5nIGZvcgotCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayB3aGV0aGVyIGlucHV0IGZpbGUsCi0Jbm90IG91dHB1dCBmaWxlLCBpcyBhIFBFIGZpbGUuCi0KLVdlZCBNYXkgMjggMTU6NDg6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2Ugc3RhdGljLgotCi1XZWQgTWF5IDI4IDE2OjE2OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IGp1c3QgZXhpdCBpZiB3ZSBzZWUgYW4KLQlSX0lNQUdFQkFTRSByZWxvYy4KLQotV2VkIE1heSAyOCAwOTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGQgdGVzdCBmb3Igc3VwZXJzZXRzIG9mIEFSTQotCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBNYXkgMjcgMTk6NDI6MDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBnbG9iYWxfdG9fc3RhdGljCi0JbWVtYmVyLgotCi1UdWUgTWF5IDI3IDE0OjM0OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2UgZ2xvYmFsLiAgSXQgaXMKLQljYWxsZWQgZGlyZWN0bHkgYnkgZ2FzL2NvbmZpZy90Yy1hcm0uYy4KLQotVHVlIE1heSAyNyAxNTo1ODo1MyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoUExUX0VOVFJZXyopOiBVc2UgYSBuZXcgdGhyZWFkLXNhZmUgZm9ybWF0LgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaWxsIGl0IGluIHByb3Blcmx5LgotCi1Nb24gTWF5IDI2IDE0OjA1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IElmIFBFIGZpbGUsIGRvbid0IGFkZAotCXNlY3Rpb24gVk1BLgotCi1Nb24gTWF5IDI2IDEwOjU3OjQ4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAjdW5kZWYgYmVmb3JlICNkZWZpbmUuCi0JKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBNYWtlIHN0YXRpYy4KLQkoY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogRGl0dG8uCi0JKGNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQotRnJpIE1heSAyMyAxNToxNDo1OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgYm9vbGVhbgotCWdsb2JhbF90b19zdGF0aWMgbWVtYmVyIGZvciBzdXBwb3J0IG9mIHRhc2sgbGlua2luZy4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBwcm90b3R5cGUuCi0JKiBsaWJjb2ZmLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgdG8KLQljaGVjayBSUzYwMDBDT0ZGX0MsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdXNlcwotCWluIHRoaXMgZmlsZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLAotCWNhbGwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscy4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIGZ1bmN0aW9ucyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIHZhcmlhYmxlcyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLXRpYzgwLmMgKFRJQzgwQ09GRik6IERlZmluZSB0aGlzIGluc3RlYWQgb2YganVzdCBUSUM4MC4KLQkoQ19BVVRPQVJHKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1VFWFQuCi0JKENfTEFTVEVOVCk6ICN1bmRlZiBzaW5jZSBpdCBjbGFzaGVzIHdpdGggQ19TVEFUTEFCLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgVElDODBDT0ZGCi0JcmF0aGVyIHRoYW4gVElDODAuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIENfU1lTVEVNLiAgSGlkZSBDX0FVVE9BUkcgdXNlCi0Jd2hlbiBUSUM4MENPRkYgZGVmaW5lZCAoY2xhc2hlcyB3aXRoIENfVUVYVCkuICBFeHBsaWNpdGx5Ci0JcmVjb2duaXplIENfVUVYVCwgQ19TVEFUTEFCLCBhbmQgQ19FWFRMQUIgYXMgdW5zdXBwb3J0ZWQuCi0KLUZyaSBNYXkgMjMgMTI6Mzg6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQ2hhbmdlIG92ZXJmbG93IGNoZWNrIGZvciBtb3N0Ci0JUFAgcmVsb2NhdGlvbnMgdG8gY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQotVGh1IE1heSAyMiAyMDoyMjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUFAgcmVsb2NhdGlvbnMuICBDaGFuZ2UKLQluYW1lIG9mIFJfUkVMTE9ORyB0byAiUkVMTE9ORyIuICBTZXQgcmlnaHRzaGlmdCBhbmQgY29tcGxhaW4gZm9yCi0JTV9QUENSLgotCShwcGJhc2VfcmVsb2MsIGdsb2IxNV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShnbG9iMTZfcmVsb2MsIGxvY2FsMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgYWxsIHJlbG9jYXRpb24gdHlwZXMuCi0JKGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGluY2x1ZGUvY29mZi90aWM4MC5oLgotCi1XZWQgTWF5IDIxIDE3OjE1OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBDT0ZGX1dJVEhfUEUgb3IKLQlDT0ZGX0lNQUdFX1dJVEhfUEUsIGRvbid0IHN1YnRyYWN0IHRoZSBzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wKLQl2YWx1ZS4KLQkqIGNvZmZnZW4uYyAoZml4dXBfc3ltYm9sX3ZhbHVlKTogQWRkIGFiZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkIHNlY3Rpb24gVk1BLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogcGVpY29kZS5oOiBBZGQgJiAweGZmZmZmZmZmIHdoZW4gdXNpbmcgSW1hZ2VCYXNlIGluIGNhc2UgYmZkX3ZtYQotCWlzIDY0IGJpdHMuCi0KLVdlZCBNYXkgMjEgMDk6NTg6MTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAobWFya19yZWxvY3MpOiBBZGQgbmV3IGZ1bmN0aW9uIHRvIG1hcmsgc3ltYm9scyB3aGljaAotCWFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBBZGQgY2FsbCB0byBtYXJrX3JlbG9jcygpIGFuZCBjb2RlIHRvCi0Jc3VwcHJlc3MgdGhlIHNraXBwaW5nIG9mIHN5bWJvbHMgdGhhdCBoYXZlIHRodXMgYmVlbiBtYXJrZWQuCi0KLVR1ZSBNYXkgMjAgMTg6NDU6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLU1vbiBNYXkgMTkgMTQ6NDY6MDAgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmM6IFJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWZzLgotCSogY29uZmlnLmJmZDogU2V0IHRhcmdfdW5kZXJzY29yZSB0byB5ZXMgZm9yIHRpYzgwLgotCi1Nb24gTWF5IDE5IDE0OjI2OjM2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChOQU1FU19IQVZFX1VOREVSU0NPUkUpOiBEZWZpbmUgKGZpeGVzIHByb2JsZW0KLQl3aXRoIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9scyBpbiBHREIpLgotCi1GcmkgTWF5IDE2IDEwOjIzOjAzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX3JlbGF4X3NlY3Rpb24pOiBSZWFkIGluIGFsbAotCXRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEJGRC4KLQkobW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgYWRqdXN0IHRoZSBzYW1lIHN5bWJvbAotCW1vcmUgdGhhbiBvbmNlLgotCSogZWxmLW0xMDIwMC5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLW0zMnIuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zaC5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAxNiAxMjoxMDo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgZGVjcmVhc2UgdGhlCi0JYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbC4gIElmIHR3byBzeW1ib2xzIHRoYXQgbG9vayBsaWtlCi0JY29tbW9uIHN5bWJvbHMgYXJlIGZvdW5kIGluIHR3byBzaGFyZWQgbGlicmFyaWVzLCBhbmQgdGhlIHNpemUgaXMKLQlkaWZmZXJlbnQsIHVzZSB0aGUgbGFyZ2VyIHNpemUsIGFuZCB3YXJuIGlmIC0td2Fybi1jb21tb24uICBJZiBhCi0JY29tbW9uIHN5bWJvbCBvdmVycmlkZXMgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnksIHNldCB0aGUKLQlzaXplIHRvIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4KLQotVGh1IE1heSAxNSAxNDozMToyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiAgQWxsb3cgZGVmYXVsdCBtYWNoaW5lIHRvIGJlIHBvbHltb3JwaGVkCi0JaW50byBhbnkgb3RoZXIgbWFjaGluZSB0eXBlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6ICBJbml0aWFsaXNlIGZsYWdzIHZhcmlhYmxlIHRvIDAuCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIFdoZW4gbWVyZ2luZwotCWRhdGEgaW50byBhbiB1bml0aWFsaXNlZCBkZXN0aW5hdGlvbiBzZXQgaXRzIG1hY2hpbmUgdHlwZSBhcyB3ZWxsLgotCi1UaHUgTWF5IDE1IDE2OjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3JjZSBFTEYgc3ltYm9sIHNpemUKLQl0byBjb21tb24gc3ltYm9sIHNpemUuICBDb25zaXN0ZW50bHkgdHJlYXQgdW5pbml0aWFsaXplZCBzeW1ib2xzCi0JaW4gc2hhcmVkIG9iamVjdHMgYXMgY29tbW9uIHN5bWJvbHMuCi0KLUZyaSBNYXkgIDkgMTA6MTU6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoY29uc3RhbnRzKTogIEFkZGVkIG5ldyBjb25zdGFudHMgdG8gaWRlbnRpZnkgdGhlCi0JdHlwZSBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZTogYmZkX21hY2hfYXJtXzIsIGJmZF9tYWNoX2FybV8yYSwKLQliZmRfbWFjaF9hcm1fMywJYmZkX21hY2hfYXJtXzNNLCBiZmRfbWFjaF9hcm1fNCBhbmQgYmZkX21hY2hfYXJtXzRULgotCi0JKiBiZmQtaW4yLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeQotCXRoZSB0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAotCWJmZF9tYWNoX2FybV8zLCBiZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZAotCWJmZF9tYWNoX2FybV80VC4gIFRoaXMgZmlsZSBpcyBhdXRvLW1hZ2ljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUKLQlhcmNodXJlcy5jIGZpbGUuICBUaGlzIHVwZGF0ZSBpcyBqdXN0IHRvIHNhdmUgd29yay4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzLAotCWNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGRlZCB0aGVzZSBuZXcgZnVuY3Rpb25zLgotCShnbG9iYWwpOiBNYWNybyByZWRlZmluaXRpb25zIHNldCB1cCB0byB1c2UgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogQWRkZWQgY2FsbCB0bwotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncygpLgotCShjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIGNvZGUgdG8gc2V0IG1hY2hpbmUgdHlwZSBiYXNlZCBvbgotCWJpdHMgc3RvcmVkIGluIGludGVybmFsIGZsYWdzLgotICAJKGNvZmZfc2V0X2ZsYWdzKTogQWRkZWQgY29kZSB0byBzZXQgdGhlIG5ldyBiaXRzIGluIHRoZSBmbGFncwotCWZpZWxkIGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4KLQkoZnVuY3Rpb24gZGVmaW5pdGlvbiBtYWNyb3MpOiBNYWRlIGFsbCBmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3JvcwotCWNvbmRpdGlvbmFsIHNvIHRoYXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0YXJnZXQgc3BlY2lmaWMKLQlmaWxlcy4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogQWRkZWQgdGhpcyBmdW5jdGlvbi4gIChhcmNoX2luZm9fc3RydWN0KToKLQlTdHJ1Y3R1cmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSBuZXcgdHlwZXMsIG9uZSBlYWNoIGZvciBBUk12MiwKLQlBUk12MmEsIEFSTXYzLCBBUk12M00sIEFSTXY0IGFuZCBBUk12NFQuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgQWRkZWQgZmxhZ3MgZmllbGQuCi0KLUZyaSBNYXkgIDkgMTc6NDA6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1nbnUqKTogRG9uJ3QgaW5jbHVkZSBNYWNoIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSAjaWYgMCBhcm91bmQgdXNlcyBvZiBob3N0X2FvdXRfdmVjIHRvICNpZgotCUhBVkVfaG9zdF9hb3V0X3ZlYy4KLQotTW9uIE1heSAgNSAxMzo1NzozMiAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgdGhlcmUgYXJlIG5vIHN5bWVudHMsCi0JanVzdCByZXR1cm4gZmFsc2UuCi0KLU1vbiBNYXkgIDUgMTg6MTg6NDUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgotCi0JKiBjb25maWcuYmZkOiBjb3BlIHdpdGggJyotKi1saW51eC1nbnVhb3V0JyB0YXJnZXRzLgotCi1UaHUgTWF5ICAxIDExOjMxOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogQWRkIGV4cGxpY2l0IFxuIGNoYXJhY3RlcnMgdG8gd29yayBhcm91bmQgYnVnIGluCi0JSFAvVVggMTAuMjAgc2VkIHByb2dyYW0uCi0KLVdlZCBBcHIgMzAgMTI6Mjc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ2FzdCBjc2VjcyB0byBhdm9pZCBzaWduCi0JZXh0ZW5zaW9uIHByb2JsZW1zLgotCi1UdWUgQXByIDIyIDEyOjA2OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBEb24ndCByZW1vdmUgYmZkLWluMi5oLgotCi1Nb24gQXByIDIxIDExOjIxOjMxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEZvbGxvdyB0aGUgbGFzdCBjaGFuZ2VzIGluIGVsZjMyLWkzODYuYzoKLQkoc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQsIHN0cnVjdAotCWVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSwgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSwKLQllbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UsIGVsZl9tNjhrX2hhc2hfdGFibGUsCi0JZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMsIGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0JZWxmX202OGtfZGlzY2FyZF9jb3BpZXMsIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6Ci0JTmV3IGRlZmluaXRpb25zLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgZG9uJ3QgY29weQotCVBDIHJlbGF0aXZlIHJlbG9jcyBmb3IgYSBnbG9iYWwgc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyCi0Jb2JqZWN0LCBhbmQgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciBhbnkKLQlnbG9iYWwgc3ltYm9sLgotCShlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywKLQl0cmF2ZXJzZSB3aXRoIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLgotCi1TYXQgQXByIDE5IDIyOjUwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBPbmx5IGNvdW50IFBDIHJlbGF0aXZlCi0JcmVsb2NzLiAgRnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UgdGhlCi0JcG90ZW50aWFsIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZSB0byBiZSB3cml0dGVuIG91dCB3aGVuCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCi1UaHUgQXByIDE3IDEzOjQ2OjU2IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmhvc3QgKG1pcHMqLSotb3BlbmJzZCopOiBOZXcgaG9zdC4KLQotVGh1IEFwciAxNyAxMToxMDo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzdWJ0cmFjdCB0aGUKLQlzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wgdmFsdWUgaWYgdGhpcyBpcyBhIGZ1bGx5IGxpbmtlZCBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5Ci0JUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQotCWdsb2JhbCBzeW1ib2wuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAotCXRyYXZlcnNlIHdpdGggZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMuCi0JKGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBhb3V0ZjEuaCAoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogVXNlIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQotV2VkIEFwciAxNiAxMjo0MzozMiAxOTk3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgc2l6ZSBvZgotCVJfRDMwVl8zMl9OT1JNQUwgdG8gMiAoNCBieXRlcykuCi0KLVdlZCBBcHIgMTYgMTQ6MDI6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBuZXRic2QuaCAoTl9TSEFSRURfTElCKTogRGVmaW5lLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZSAocmV2ZXJ0IGNoYW5nZSBvZgotCUFwcmlsIDExKS4KLQkqIHNwYXJjbmV0YnNkLmMgKFRBUkdFVF9QQUdFX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCAucmVsYS5ic3Mgc2l6ZQotCXRvIHNpemVvZiBSZWxhIHN0cnVjdHVyZSwgbm90IHNpemVvZiBSZWwgc3RydWN0dXJlLiAgRnJvbSBHYXJ5Ci0JVGhvbWFzIDxnLnRob21hc0BvcGVuZ3JvdXAub3JnPi4KLQotVHVlIEFwciAxNSAxMTo1MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IElmIGVudHJ5X2lzX3RleHRfYWRkcmVzcywgYWRqdXN0Ci0Jd2hlbmV2ZXIgZW50cnkgaXMgbGFyZ2VyIHRoYW4gdGV4dCBhZGRyZXNzLCBidXQgb25seSBieSB3aG9sZQotCXBhZ2VzLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UKLQlta2luc3RhbGxkaXJzIHRvIGJ1aWxkICQob2xkaW5jbHVkZWRpcikuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjYWxsIGNoZWNrX3JlbG9jcwotCWlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc2VjdGlvbiB3aGljaCB3ZSBhcmUgc3RyaXBwaW5nLgotCi1Nb24gQXByIDE0IDEyOjM5OjMwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vYmplY3RfcCk6IEFsbG9jYXRlIHRoZQotCWFscGhhLXNwZWNpZmljIHRhcmdldCBkYXRhIHN0cnVjdC4KLQotTW9uIEFwciAxNCAxMTo0NTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDExIDE1OjQzOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogT25seSBzdWJ0cmFjdCB0aGUgc2VjdGlvbgotCVZNQSBpZiB0aGlzIGlzIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBhIHNoYXJlZCBvYmplY3QuCi0KLQkqIHRhcmdldHMuYyAobmV0YnNkX2NvcmVfdmVjKTogRGVjbGFyZS4gIEZyb20gR29yZG9uIFcuIFJvc3MKLQk8Z3dyQG1jLmNvbT4uCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGVudHJ5X2lzX3RleHRfYWRkcmVzcwotCWZpZWxkLgotCSogYW91dC10YXJnZXQuaCAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIHRvIFRBUkdFVF9QQUdFX1NJWkUgYXQgdGhlCi0Jc3RhcnQgb2YgdGhlIGZpbGUuICBSZW1vdmUgdXNlcyBsYXRlciBvbiB3aGljaCBzd2l0Y2ggdXNpbmcKLQlpZmRlZi4KLQkoTVkoY2FsbGJhY2spKTogSGFuZGxlIGVudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQkqIG5ldGJzZC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZS4KLQkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIDB4MjAwMDAuCi0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IEhhbmRsZSBpbXBvcnRpbmcgYSBzeW1ib2wKLQl3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGAuJy4KLQotRnJpIEFwciAxMSAxMTo1NzoxNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBjb25maWcuYmZkOiAoaVszNDU2XTg2LSotb3BlbmJzZCosIG02OCotKi1vcGVuYnNkKiwKLQltaXBzKmVsKi0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLCBuczMyay0qLW9wZW5ic2QqLAotCXBvd2VycGMtKi0qYnNkKiwgc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbWlwcyotKi1vcGVuYnNkKiwKLQltNjgqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosIHBvd2VycGMtKi0qYnNkKiwKLQlzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgIDggMTg6MDk6MjkgMTk5NyAgSmFtaWUgTG9raWVyICA8amFtaWVAcmViZWxsaW9uLmNvLnVrPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8pOiBOZXcgZmllbGQKLQlgY3VtdWxhdGl2ZV9za2lwcycuCi0JKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRmlsbCB0aGUgYWJvdmUgYXJyYXkuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IFVzZSBgY3VtdWxhdGl2ZV9za2lwcycgdG8KLQlzcGVlZCB1cCBvZmZzZXQgY2FsY3VsYXRpb24uCi0KLVR1ZSBBcHIgIDggMDA6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogZWxmLW1uMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvbid0IGZvcmdldCB0aGUKLSAgICAgICAgYWRkZW5kIGZvciBub24gcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1tMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBSZW1vdmUgcHJvdG90eXBlCi0JZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1Nb24gQXByICA3IDE2OjQ3OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBTSExJQl9MSUJTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFNITElCX0xJQlMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJQikpOiBVc2UgJChTSExJQl9MSUJTKS4KLQotTW9uIEFwciAgNyAxMDo1Mzo1MiAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCBiZmQtaW4yLmg6IGFkZCBiZmRfc2VjdGlvbl9sbWEgbWFjcm8gdG8gY29ycmVzcG9uZAotCXdpdGggYmZkX3NlY3Rpb25fdm1hLgotCi1GcmkgQXByICA0IDExOjM3OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVcGRhdGUgZmlsZSBuYW1lcyBmb3IgYmZkX2VsZjMyX21uMTBbMjNdMDBfdmVjLgotCUNvcnJlY3QgQ1BVIGZpbGUgbmFtZXMgZm9yIG1uMTBbMjNdMDAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC5jIChiZmRfcmVjb3JkX3BoZHIpOiBDYXN0IGNvdW50IHRvIHNpemVfdCBiZWZvcmUKLQlzdWJ0cmFjdGlvbi4KLQotCSogY29mZi1wcGMuYyAoZHVtcF90b2MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gU3VuT1MgY2MuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9yZWFkX2FyX2hkcik6IExpa2V3aXNlLgotCSh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTElrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9lZGF0YSwgcGVfcHJpbnRfcGRhdGEsIHBlX3ByaW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBTZXQgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQl0byBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVRodSBBcHIgIDMgMTE6NTE6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogIERvbid0IGNoZWNrIFNFQ19BTExPQyB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgUmVsb2NhdGUgUl9QUENfUkVMQVRJVkUKLQlyZWxvY3MgaW4gdW5hbGxvY2F0ZWQgc2VjdGlvbnMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVsb2NhdGUKLQlSX1NQQVJDX1JFTEFUSVZFIHJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KLQotV2VkIEFwciAgMiAxNjoxOTo0MSAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVW5kbyBNYXJjaCAyNiBjaGFuZ2UgYW5kCi0JYWx3YXlzIGNyZWF0ZSBnb3Qgc2VjdGlvbiBzbyB0aGF0IHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gbGFiZWwKLQlpcyBhbHdheXMgY3JlYXRlZC4KLQotV2VkIEFwciAgMiAxMDo0OTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGV0IGEgY29tbW9uIHN5bWJvbAotCW92ZXJyaWRlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGZyb20gYSBzaGFyZWQgbGlicmFyeSB3aXRoIGEKLQlzbWFsbGVyIHNpemUuCi0KLQkqIGVsZi1tMTAyMDAuYzogUmVuYW1lIGZyb20gZWxmMzItbW4xMDIwMC5jLgotCSogZWxmLW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCi0JKiBjcHUtbTEwMjAwLmM6IFJlbmFtZSBmcm9tIGNwdS1tbjEwMjAwLmMKLQkqIGNwdS1tMTAzMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAzMDAuYwotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShlbGZfbWlwc19pc2EpOiBNb3ZlIHRvIGVhcmxpZXIgaW4gZmlsZS4KLQkobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DX0NUT1IgZW50cnkuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IKLQlzcGVjaWFsbHkuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwczE2X2p1bXBfcmVsb2MpOiBQcmludCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4KLQljYWxsaW5nIGFib3J0LgotCi1UdWUgQXByICAxIDE2OjE4OjA1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCi0KLU1vbiBNYXIgMzEgMjM6Mjg6MzkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGliY29mZi1pbi5oIChwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBEZWNsYXJlLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IERlY2xhcmUgaWYgbm90IGEgbWFjcm8uCi0KLU1vbiBNYXIgMzEgMTY6Mjk6NTAgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1Nb24gTWFyIDMxIDE2OjExOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdXNlIHN5bW5keCBhcyBhCi0Jc3ltYm9sIGluZGV4IGZvciBhIFJfSUhDT05TVCByZWxvYy4KLQotTW9uIE1hciAzMSAxNTo0MDo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBEbyBub3QgdXNlIFwoXCkgcmVjdXJzaXZlbHkuCi0KLUZyaSBNYXIgMjggMTQ6NDQ6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbTY4a2xpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCSogaTM4NmxpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCi1GcmkgTWFyIDI4IDExOjU2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251LmFpLm1pdC5lZHU+OgotCSogc3BhcmNsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGJmZC1pbi5oIChiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1saW51eGFvdXQqLCBzcGFyYy0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChzcGFyY2xpbnV4X3ZlYyk6IEFkZCB0byBsaXN0IG9mIHZlY3RvcnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGludXhfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc3BhcmNsaW51eF92ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHNwYXJjbGludXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHNwYXJjbGludXguYy4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcKLQliZmRfY29mZl9iYWNrZW5kX2RhdGEgZmllbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkOiBBZGQgYmZkX2VsZjY0X3tiaWcsbGl0dGxlfW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcwotCWZvciBtaXBzKmVsKi0qLWxpbnV4KiBhbmQgbWlwcyotKi1saW51eCouICBGcm9tIEguSi4gTHUKLQk8aGpsQGx1Y29uLm9yZz4gYW5kIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4uCi0KLQkqIGJmZC5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKHN0cmVycm9yKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2Vycm1zZyk6IENhbGwgeHN0cmVycm9yIHJhdGhlciB0aGFuIHN0cmVycm9yLgotCi1UaHUgTWFyIDI3IDEyOjU1OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSBhIENPUFkKLQlyZWxvYyBldmVuIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIuCi0JKGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaW1pdCBhbGlnbm1lbnQgb2YgYSBjb21tb24KLQlzeW1ib2wgdG8gdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLQkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotVGh1IE1hciAyNyAwMDo0NTo1NyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IEZpeCBhIHR5cG8gaW4gdGhlCi0JMjEtYml0IGFic29sdXRlIHRoYXQgbWFkZSBpdCBhY3QgYXMgYSByZWxhdGl2ZS4KLQotV2VkIE1hciAyNiAxNDo1MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3Qgc2V0Ci0JYnNzX3NlY3Rpb24gYW5kIHJlbF9zZWN0aW9uIGZyb20gZXhpc3Rpbmcgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE9ubHkgY3JlYXRlIHRoZSBnb3Qgc2VjdGlvbgotCWlmIGl0IGlzIG5lZWRlZC4KLQotVHVlIE1hciAyNSAyMjoyNjo1NiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgQ2hhbmdlIGV4ZWN1dGFibGUgdGVzdCB0byBmaXgKLQlwcm9ibGVtcyB3aXRoIGVtYmVkZGVkIGEub3V0IHN5c3RlbXMuCi0KLVR1ZSBNYXIgMjUgMTQ6MzU6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHRoZSBvZmZzZXQgb2YgYQotCXN0YWIgcmVsb2MuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IENvcHkgb3ZlciB0aGUgZmlyc3QgaGVhZGVyCi0Jc3ltYm9sLiAgQ2hlY2sgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2YgKnBzaW5mby4KLQkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogQWRkIHBzaW5mbyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFNldCB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBzeW1ib2wuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMjQgMjA6MDc6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUl9BQlMgZW50cnkuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfQUJTIHJlbG9jIHR5cGUuICBBbHNvIGFib3J0IG9uIHVuaGFuZGxlZAotCXJlbG9jIHR5cGVzLCByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLgotCi1Nb24gTWFyIDI0IDEzOjQxOjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogVXNlIHRoZSBob2xkIHNwYWNlIHRvIHB1dCB0aGUgI2lmZGVmIGFyb3VuZCB0aGUKLQl0aGUgc3RyaW5nIGNvbnN0YW50LgotCSogdGFyZ2V0cy5jIChVTlNVUFBPUlRFRF9UQVJHRVQpOiBEb24ndCBkZWZpbmUuCi0JKGZpbmRfdGFyZ2V0KTogRG9uJ3QgY2hlY2sgZm9yIFVOU1VQUE9SVEVEX1RBUkdFVC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBieSBjaGVja2luZyBmb3IKLQlkZWZhdWx0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1tMzJyLmMuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tMzJyLmMuCi0JKGVsZjMyLW0zMnIubyk6IFJlbW92ZSBleHBsaWNpdCB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnX3VuZGVyc2NvcmUgZm9yIGlbMzQ1Nl04Ni0qLWdudSogb3IKLQlpWzM0NTZdODYtKi1saW51eCouCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0Ci0JY291bnQgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGUKLQlsaW5rZXIsIG9yIGFyZSBub3QgYWxsb2NhdGFibGUgb3Igbm90IGxvYWRhYmxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE91dHB1dCBvdXRwdXQgc2VjdGlvbgotCXN5bWJvbHMgZm9yIHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1hZGUgc3BhY2UgZm9yIHRoZW0uCi0KLUZyaSBNYXIgMjEgMTM6MDg6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGVyZSBpcwotCW5vIC5yZWxhLnBsdCBzZWN0aW9uLCBkb24ndCBvdXRwdXQgYSBEVF9QTFRHT1QgZHluYW1pYyBlbnRyeS4KLQotRnJpIE1hciAyMSAxMjozNjo0NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIExPMTYuCi0JKG0zMnJfaGkxNl9saXN0KTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobTMycl9lbGZfaGkxNl9yZWxvYyk6IERvbid0IHBlcmZvcm0gcmVsb2MsIGp1c3QgcXVldWUgaXQgdXAuCi0JKG0zMnJfZWxmX2RvX2hpMTZfcmVsb2MpOiBEZWxldGUuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX2xvMTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgSEkxNiByZWxvY3MsIHNjYW4gZm9yIGNvcnJlc3BvbmRpbmcKLQlMTzE2IHJlbG9jLgotCi0JTW9uIE1hciAxMCAxNjowMzozMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEZWxldGUuCi0JKG0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFJld3JpdGUgX1NEQV9CQVNFXyBzdXBwb3J0LgotCShtMzJyX2VsZl9maW5hbF9zZGFfYmFzZSk6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgc2RhdGEgc3VwcG9ydC4KLQkobTMycl9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCi0KLVRodSBNYXIgMjAgMTI6Mzk6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0JKiBjb2ZmLXN2bTY4ay5jOiBOZXcgZmlsZS4gIEp1c3QgZGVmaW5lcyBzb21lIG1hY3JvcyBhbmQgaW5jbHVkZXMKLQljb2ZmLW02OGsuYy4KLQkqIGNvZmYtbTY4ay5jOiBBZGQgZnVuY3Rpb25zIHRvIGhhbmRsZSBjb21tb24gYWRkZW5kcywgbW92ZWQgaW4KLQlmcm9tIGNmLW02OGtseW54LmMuICBDb250cm9sIHRoZW0gdXNpbmcgQ09GRl9DT01NT05fQURERU5EIG1hY3JvLgotCUNvbnRyb2wgd2hldGhlciByZWxvY3MgYXJlIHZpc2libGUgdXNpbmcgU1RBVElDX1JFTE9DUy4KLQkqIGNmLW02OGtseW54LmM6IFNpbXBsaWZ5IGdyZWF0bHk6IGp1c3QgZGVmaW5lIG1hY3JvcyB0byBjb250cm9sCi0JY29mZi1tNjhrLmMuCi0JKiBjb2ZmLWF1eC5jOiBMaWtld2lzZS4gIEp1c3QgbGVhdmUgYWRkX29uZV9zeW1ib2wgcm91dGluZS4KLQkqIHRhcmdldHMuIChtNjhrc3lzdmNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgbTY4a3N5c3Zjb2ZmX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjhrc3lzdmNvZmZfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3ZtNjhrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLXN2bTY4ay5jLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZ2V0IG1pc2xlZCBpZiB0aGUKLSAJZmlyc3Qgc2VjdGlvbiBpcyBub3QgbG9hZGFibGUuICBGcm9tIE1hdHRoZXcgTC4gTWFydGluCi0gCTxtbG1AeGVkaWEuY29tPi4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgdGhlIHZhbHVlIG9mIGEgc2VjdGlvbgotCXN5bWJvbCB0byB0aGUgc2VjdGlvbiBhZGRyZXNzIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UdWUgTWFyIDE4IDIzOjAzOjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLQkucGx0IGVudHJ5IGlmIHdlJ3ZlIHRha2VuIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSBjb2xsZWN0ZWQgZmxhZ3MgaW5mbyBhcyB3ZWxsLgotCi1UdWUgTWFyIDE4IDIyOjQwOjA5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGNwdS1tNjhrLmMgKGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2gpOiBEb24ndCBkZWNsYXJlLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImxpYmNvZmYuaCIgYW5kICJsaWJlY29mZi5oIi4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBDaGFuZ2Ugc3RyZWFtIHBhcmFtZXRlciB0byBQVFIuCi0JKiBwZWljb2RlLmg6IENoYW5nZSBzZXZlcmFsIHZvaWQgKiBwYXJhbWV0ZXJzIHRvIFBUUi4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc3ltYm9sX2luZm8pOiBNYWtlIHN0YXRpYy4KLQkqIHN5bXMuYyAoYmZkX3N5bWJvbF9pc19hYnNvbHV0ZSk6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIE1hciAxOCAxMjo1ODowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbW92ZS4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIGJmZF9tYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLU1vbiBNYXIgMTcgMTE6MzI6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCi0JKHN0cnVjdCBiZmRfaGFzaF90YWJsZSk6IENoYW5nZSBtZW1vcnkgZmllbGQgdG8gUFRSLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3JlbGVhc2UpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBkb24ndCBkZWZpbmUgYXMKLQltYWNyby4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogb3BuY2xzLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShnZXRwYWdlc2l6ZSk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9uZXdfYmZkKTogRG9uJ3Qgc2V0IF9iZmRfY2h1bmtzaXplLgotCShiZmRfb3BlbnIpOiBGcmVlIG5ldyBiZmQgYW5kIG9iamFsbG9jIG9uIGZhaWx1cmUuCi0JKGJmZF9mZG9wZW5yLCBiZmRfb3BlbnN0cmVhbXIsIGJmZF9vcGVudyk6IExpa2V3aXNlLgotCShiZmRfYWxsb2Nfc2l6ZSk6IFJlbW92ZS4KLQkoYmZkX3JlbGVhc2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBoYXNoLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgYWNjdW11bGF0ZSk6IENoYW5nZSBtZW1vcnkgdG8gc3RydWN0IG9iamFsbG9jICouCi0JKiBsaWJvYXN5cy5oIChvYXN5c19kYXRhX3R5cGUpOiBSZW1vdmUgb2FzeXNfb2JzdGFjayBmaWVsZC4KLQkqIGRlcC1pbi5zZWQ6IERvbid0IHJlbW92ZSBvYnN0YWNrLmggZnJvbSBkZXBlbmRlbmN5IGxpc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9IX0RFUFMpOiBSZW1vdmUgb2JzdGFjay5oLgotCShpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBvYnN0YWNrLmguCi0JKiBNYW55IGZpbGVzOiBEb24ndCBpbmNsdWRlICJvYnN0YWNrLmgiLgotCSogVkVSU0lPTjogQnVtcC4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogUmVtb3ZlLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogaWVlZS5jIChpZWVlX2FyY2hpdmVfcCk6IFJld3JpdGUgdG8gbm90IHVzZSBiZmRfYWxsb2NfZ3Jvdy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogUmV3cml0ZSB0byBub3QgdXNlIG9ic3RhY2tfMWdyb3cuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2MpOiBSZW5hbWUgZnJvbSBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmVtb3ZlCi0Jb2xkIHZlcnNpb24gb2YgYmZkX2FsbG9jLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ieV9zaXplX3QpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBTZXZlcmFsIGZpbGVzOiBDYWxsIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi1TYXQgTWFyIDE1IDE1OjI0OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogQWNjZXB0IHRoZSBnZW5lcmljCi0JRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLgotCi1TYXQgTWFyIDE1IDEwOjE2OjQyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotYmVvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYmVvcyopOiBBZGQgY2FzZSB0aGF0IGV4cGxpY2l0bHkKLQlkb2VzIG5vdCBzZXQgQ09SRUZJTEUgZm9yIG5vdy4gIEEgZnV0dXJlIEJlT1MgdmVyc2lvbiBpcwotCWV4cGVjdGVkIHRvIHN1cHBvcnQgY29yZSBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCi1GcmkgTWFyIDE0IDE2OjQzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBHaXZlIGFuIGVycm9yIGlmIENBTEwxNiBpcwotIAlzZWVuIHdpdGggYSBsb2NhbCBzeW1ib2wsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUKLQl2ZXJzaW9uIHN5bWJvbHMgaWYgdGhlcmUgYXJlbid0IGFueS4KLQotVGh1IE1hciAxMyAxNjozODozMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lCi0JKGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8pOiBDbG9uZSBnZW5lcmljIGNvZmYgdmVyc2lvbiBhbmQKLQlhZGQgY29kZSB0byBoYW5kbGUgdGhlIGZ1bmt5IFRJICJpbnRlcm5hbCByZWxvY2F0aW9ucyIuCi0KLVRodSBNYXIgMTMgMTQ6MDg6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQgdHlwZQotCW9yIHNpemUgY2hhbmdlcyBiZWNhdXNlIG9mIGEgd2VhayBzeW1ib2wuCi0KLQkqIGNpc2NvLWNvcmUuYyAoU0lHRU1UKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCi1XZWQgTWFyIDEyIDIxOjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZXh0c3ltb2ZmIHdoZW4KLQlzZXR0aW5nIGV2ZXIuICBTYW5pdHkgY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLiAgU29ydCBvdXQgY29weWluZwotCWZsYWdzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhbiBpbmRpcmVjdCBzeW1ib2wuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUHJlc2VydmUgYW55IGR5bmFtaWMKLQlzeW1ib2xzIGFkZGVkIGJ5IHRoZSBiYWNrZW5kLiAgQ2xlYXIgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUKLQl2ZXJzeW0gc2VjdGlvbi4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEFjY2VwdCBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lciBpbiBhbgotCWFzc2VydC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBhIHNhbml0eSBjaGVjayBvbiB0aGUKLQl2ZXJzaW9uIGNvdW50LiAgQ29ycmVjdCB0aGUgYWxsb2NhdGlvbiBvZiB4X3ZlcnN5bXAuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IHRoZSBvd25lciBvZgotCXRoZSBtYWdpYyBzZWN0aW9ucyB1c2VkIGZvciBTSE5fTUlQU19URVhUIGFuZCBTSE5fTUlQU19EQVRBLgotCURvbid0IHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyIHdoZW4gaW5mby0+c2hhcmVkLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogU2V0IHRoZSBhbGlnbm1lbnQgb2YgLnJ0cHJvYyB0byA0LCBub3QgMTIuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ29ycmVjdCB0eXBlOiBePSBmb3IgJj0uCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlc29sdmUgYW4gaW5kaXJlY3Qgc3ltYm9sIGluCi0Jc3ltX2hhc2hlcy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIFNITl9BQlMgaW50bwotCVNITl9NSVBTX1RFWFQgb3IgU0hOX01JUFNfREFUQS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogVHdlYWsgdmVyc2lvbiBvdXRwdXQgc2xpZ2h0bHkuCi0KLVR1ZSBNYXIgMTEgMDE6Mzg6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChFTEZfTElOS19GT1JDRURfTE9DQUwpOiBEZWZpbmUuCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBDb3JyZWN0IGVycm9ycyBpbiBsYXN0IGNoYW5nZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGNhc2VzIGluIHdoaWNoIGEKLQl2ZXJzaW9uZWQgc3ltYm9sIGFwcGVhcnMgaW4gYm90aCBhIHJlZ3VsYXIgYW5kIGEgc2hhcmVkIG9iamVjdC4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogU2V0IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCB3aGVuCi0JYXBwcm9wcmlhdGUuICBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0JKHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8pOiBSZW5hbWUgZnJvbSBlbGZfZmluZm9fZmFpbGVkLiAgQ2hhbmdlCi0JYWxsIHVzZXMuICBBZGQgbG9jYWxzeW1zIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY2FsbAotCWVsZl9saW5rX291dHB1dF9leHRzeW0gdG8gb3V0cHV0IGFsbCBsb2NhbCBzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSGFuZGxlIHN5bWJvbHMgd2hpY2ggd2VyZSBmb3JjZWQgdG8KLQliZWNvbWUgbG9jYWwuCi0KLVN1biBNYXIgIDkgMjM6MDg6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGQgdmVyc2lvbiBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB2ZXJzaW9uIGZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGNyZWF0aW5nIGFuCi0gCWluZGlyZWN0IHN5bWJvbCBmb3IgYSBkZWZhdWx0IHZlcnNpb24gc3ltYm9sLCBzZXQgREVGX0RZTkFNSUMgaWYKLSAJYXBwcm9wcmlhdGUuICBTZXQgdXAgYW4gaW5kaXJlY3Rpb24gZnJvbSB0aGUgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mCi0JdGhlIHN5bWJvbCBhcyB3ZWxsLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhbGwKLQllbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgdGhlcmUgYXJlIGFueQotCXZlcnNpb25zLiAgQWx3YXlzIHJlY29yZCB0aGUgdmVyc2lvbiBuYW1lIGFzIGEgZHluYW1pYyBzeW1ib2wuCi0JSW5pdGlhbGl6ZSBjb3VudGVycy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQWZ0ZXIgZmluZGluZyBhIHZlcnNpb24sIHNlZSBpZiBhCi0Jc3ltYm9sIHNob3VsZCBiZSBmb3JjZWQgdG8gbG9jYWwgc2NvcGUuICBDcmVhdGUgYSBuZXcgdmVyc2lvbgotCWRlZmluaXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDb3JyZWN0IGluZGlyZWN0IHN5bWJvbCBoYW5kbGluZy4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24uCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFR1cm4gdmVyc2lvbiBzZWN0aW9ucyBpbnRvIEJGRCBzZWN0aW9ucy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBPbmx5IGNvcHkgY3ZlcmRlZnMgYW5kIGN2ZXJyZWZzIGludG8gc2hfaW5mbwotCWlmIHNoX2luZm8gaXMgbm90IGFscmVhZHkgc2V0LgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ29weSBzaF9pbmZvIGZvciB2ZXJzaW9uCi0Jc2VjdGlvbnMuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogVGVsbAotCV9iZmRfc3RyaW5ndGFiX2FkZCB0byBjb3B5IHRoZSBuYW1lIGludG8gcGVybWFuZW50IG1lbW9yeSBpZgotCWFwcHJvcHJpYXRlLgotCi1GcmkgTWFyICA3IDExOjU1OjMxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogRnVsbHkgcGFyZW50aGVzaXplLgotCi1GcmkgTWFyICA3IDEwOjM3OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlCi0JX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB0byByZXR1cm4gYSBib29sZWFuCi0JdmFsdWUuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIElmIHRoZSBzaXplIG9mIHRoZSBsYXN0IHNlY3Rpb24gY2hhbmdlZCwgdGhlbiBvdXRwdXQgYQotCXplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IEFsd2F5cyBhbGxvY2F0ZSBzcGFjZQotCWZvciBhdCBsZWFzdCA2IG91dHB1dCBzeW1ib2xzLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogV2hlbiBlbWl0dGluZyBUT0MgZW50cnkgcmVsb2NzLCBhbHNvCi0JZW1pdCBhIFRDIGNzZWN0IHRvIHJlcHJlc2VudCB0aGUgc3BhY2UgdGhleSB0YWtlIHVwLiAgRm9yIGFuIFhPCi0Jc3ltYm9sLCBqdXN0IGVtaXQgYSByZWZlcmVuY2UsIG5vdCBhIGNzZWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogSnVzdCB1c2UgbG4gLXMsIG5vdCBsbiAtc2YsIHNpbmNlCi0JU29sYXJpcyBkb2Vzbid0IGxpa2UgdGhlIGNvbWJpbmVkIG9wdGlvbnMsIGFuZCB0aGUgLWYgaXMKLQl1bm5lY2Vzc2FyeS4KLQkoc3RhbXAtdHNobGluaywgaW5zdGFsbCk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJfTUlQUzE2XzI2Ci0JaGFuZGxpbmcgd2hlbiBsaXR0bGUgZW5kaWFuLgotCi1UaHUgTWFyICA2IDEzOjUxOjUxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAocmVsb2NfdHlwZSk6IFJlbW92ZSBQQ1JFTHs4LDE2LDMyfV97MSwyfUJZVEUKLQlyZWxvY3MuICBSZXBsYWNlIHRoZW0gd2l0aCBnZW5lcmljIFBDUkVMX3s4LDE2LDMyfSByZWxvY3MuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgTWFyICA2IDEyOjE5OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHJ0eXBlMmhvd3RvKTogSWYgcGFzc2VkIGEgcmVsb2NhdGlvbiB0eXBlIHdlIGRvbid0Ci0JdW5kZXJzdGFuZCwganVzdCBzZXQgdGhlIGhvd3RvIGZpZWxkIHRvIE5VTEwsIGFuZCB0aGUgY2FsbGVyIHdpbGwKLQlwcmludCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFB1bGwgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBhbmQKLQljb2RlIGZyYWdtZW50IG91dCBvZiBib3RoIGxlZ3Mgb2YgI2lmZGVmIFJFTE9DX1BST0NFU1NJTkcgLi4uICNlbmRpZgotCWJsb2NrLiAgVXNlIE5VTEwgZm9yIGluaXRpYWxpemF0aW9ucyBvZiAicHRyIiByYXRoZXIgdGhhbiBiYXJlIDAuCi0JKiBjb2ZmLWg4MzAwLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb2ZmLWg4NTAwLmM6IERpdHRvLgotCSogY29mZi13NjUuYzogRGl0dG8KLQkqIGNvZmYtejhrLmM6IERpdHRvLgotCi1XZWQgTWFyICA1IDEzOjU5OjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jKTogRml4IG92ZXJmbG93IGNhbGMuCi0JKG0zMnJfZWxmX3JlbGF4X3NlY3Rpb24sIG0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcywKLQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGaXJzdCBwYXNzIGF0IHJlbGF4IHN1cHBvcnQuCi0KLU1vbiBNYXIgIDMgMTM6Mjc6MDkgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBjb3JyZWN0IHNoX3NpemUKLQllbnRyeSBmb3IgcmVhZGluZyB2ZXJkZWYgcmVjb3Jkcy4KLQlVc2UgY29ycmVjdCBicmFjZXMgZm9yIGNvbXB1dGluZyBpbmNyZW1lbnRzIG9mIGV4dHZlcmRhdXggYW5kCi0JZXh0ZXZlcmRlZiByZWNvcmQgcG9pbnRlcnMuCi0KLVN1biBNYXIgIDIgMjI6NDc6NTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRoaXMgdG8gMgotCWluc3RlYWQgb2YgNC4KLQotU3VuIE1hciAgMiAxNjoyNTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IENoZWNrIHRoYXQKLQlERUZfUkVHVUxBUiBpcyBub3Qgc2V0IGFzIHdlbGwgYXMgY2hlY2tpbmcgdGhhdCBERUZfRFlOQU1JQyBpcwotCXNldC4KLQotRnJpIEZlYiAyOCAxNjo1Mjo0MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBBZGQgY2FzZSBmb3IgVElDODBfQVJDSF9NQUdJQy4KLQotRnJpIEZlYiAyOCAxNTowNjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX2RlZmF1bHRfdmVjdG9yKTogTWFrZSBub24tY29uc3QuCi0JKGZpbmRfdGFyZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWJmZF9maW5kX3RhcmdldC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2ZpbmRfdGFyZ2V0KTogQ2FsbCBmaW5kX3RhcmdldC4gIFdoZW4gZGVmYXVsdGluZywgdXNlCi0JYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlmIGl0IGlzIG5vdCBOVUxMLgotCSogbGliYmZkLWluLmggKGJmZF9kZWZhdWx0X3ZlY3Rvcik6IEFkanVzdCBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV0dXJuIGZhbHNlIGlmIHRoZSBzeW1ib2wgaGFzIG5vCi0JbmFtZS4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMgYmVnaW5uaW5nCi0Jd2l0aCAuLiBvciBfLkxfIGFzIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBUcmVhdCBzeW1ib2xzCi0JYmVnaW5uaW5nIHdpdGggJCBhcyBsb2NhbC4KLQotVGh1IEZlYiAyNyAxODozNjoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0JcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgaW5mby0+bHByZWZpeC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKLQlfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0KLQkqIGNvZmYtbTg4ay5jIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCShtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGFzCi0JX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKTogQ2hhbmdlIF9iZmRfaXNfbG9jYWxfbGFiZWwKLQl0byBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUuCi0JKGJmZF90YXJnZXQpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lIGFzIGZ1bmN0aW9uLCBub3QgbWFjcm8uCi0JKGJmZF9pc19sb2NhbF9uYW1lKTogRGVmaW5lLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBSZW5hbWUgZnJvbQotCWJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsLCBhbmQgdGFrZSBhIHN0cmluZyByYXRoZXIgdGhhbiBhCi0Jc3ltYm9sLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0gCShiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlIGxvY2FsX2xhYmVsIHRvIGxvY2FsX2xhYmVsX25hbWUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZ290X2luZm8pOiBBZGQgYXNzaWduZWRfZ290bm8gZmllbGQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCURvbid0IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCB6ZXJvIGVudHJ5IGlzIHVuYXNzaWduZWQ7IGluc3RlYWQsIHVzZQotCWFzc2lnbmVkX2dvdG5vLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBJbml0aWFsaXplIGFzc2lnbmVkX2dvdG5vIGZpZWxkLgotCi1XZWQgRmViIDI2IDE1OjE5OjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEFkZCBjb2RlIHRvIGRvIDMyLWJpdAotCXJlbG9jYXRpb25zLgotCi1XZWQgRmViIDI2IDEzOjMzOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBza2lwIHN5bWJvbHMgZnJvbSBzZWN0aW9ucwotCXRoYXQgaGF2ZSBubyBjb250ZW50cyBtZXJlbHkgYmVjYXVzZSBsaW5rZXJfbWFyayBpcyBub3Qgc2V0LgotCi1UdWUgRmViIDI1IDE4OjUxOjM1IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgYXNzZXJ0IGNvbXBhcmUKLQljb250ZW50IGJ5dGVvcmRlciBpbnN0ZWFkIG9mIGhlYWRlciBieXRlb3JkZXIuCi0JKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBOZXcgQkZELCBiaWctZW5kaWFuIGhlYWRlcnMsIGxpdHRsZS1lbmRpYW4KLQlkYXRhLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZl9iaWdsaXR0bGVfdmVjLgotCSogY29uZmlndXJlLmluIChlY29mZl9iaWdsaXR0bGVfdmVjKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQotVHVlIEZlYiAyNSAwMDozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBTSFRfTk9URSBmb3IgYW55IHNlY3Rpb24gd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEFkZCBhIFBUX05PVEUgc2VnbWVudCBmb3IgYW55IGxvYWRhYmxlCi0Jc2VjdGlvbiB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBtaXNhbGlnbmVkCi0JamFsIGFuZCBmb3IgamFsIG92ZXJmbG93LgotCi1Nb24gRmViIDI0IDE3OjUzOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IElmIGEgZGVmYXVsdCBzeW1ib2wgaXMKLQlub3QgZm91bmQsIHRyeSBsb29raW5nIGl0IHVwIGFnYWluIHdpdGhvdXQgdGhlIHZlcnNpb24gbmFtZS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZSBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgV2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljCi0Jb2JqZWN0LCBpbmNsdWRlIHZlcnNpb24gc3RyaW5ncyBpbiBzeW1ib2wgbmFtZXMsIGFuZCBzZXQgdXAKLQl2ZXJzaW9uIGluZm9ybWF0aW9uLiAgQWRkIGluZGlyZWN0IHN5bWJvbHMgZm9yIGRlZmF1bHQgdmVyc2lvbnMuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIHNwZWNpYWwgdmVyc2lvbiBzZWN0aW9ucy4KLQkoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvKTogRGVmaW5lLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCB2ZXJkZWZzIHBhcmFtZXRlci4gIFNldAotCXVwIHZlcnNpb24gc2VjdGlvbnMuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBzeW12ZXJfc2VjIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGZpbmZvLnN5bXZlcl9zZWMuICBEb24ndCBjb3VudAotCWxvY2FsIHN5bWJvbHMgb2YgYSBkeW5hbWljIG9iamVjdC4gIEhhbmRsZSBEVF9WRVIqIGNvbnN0YW50cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbXBsaWZ5IEJGRF9BU1NFUlQgY2hlY2tpbmcgZm9yIGEKLQlkeW5hbWljIG9iamVjdC4gIFNraXAgaW5kaXJlY3Qgc3ltYm9scyBmcm9tIEVMRiBvYmplY3RzLiAgUmVtb3ZlCi0JdGhlIHZlcnNpb24gbmFtZSBiZWZvcmUgY2hvb3NpbmcgYSBoYXNoIGJ1Y2tldC4gIFdyaXRlIG91dCB0aGUKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgRFlOQU1JQywgbm90IEVUX0RZTi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHZlcmluZm8gZmllbGQuCi0JQ2hhbmdlIGVsZl9saW5rX2hhc2hfZmxhZ3MgdG8gdW5zaWduZWQgc2hvcnQuCi0JKEVMRl9MSU5LX0hJRERFTik6IERlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGRzIGR5bnZlcnN5bV9oZHIsIGR5bnZlcnJlZl9oZHIsCi0JZHludmVyZGVmX2hkciwgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLAotCWR5bnZlcnJlZl9zZWN0aW9uLCBjdmVyZGVmcywgY3ZlcnJlZnMsIHZlcmRlZiwgdmVycmVmLgotCShlbGZfZHludmVyc3ltLCBlbGZfZHludmVyZGVmLCBlbGZfZHludmVycmVmKTogRGVmaW5lLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzKTogRGVjbGFyZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luLCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBEVF9WRVIqIGNvbnN0YW50cy4gIFByaW50Ci0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiB0aGVyZSBpcyBhbnkuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB2ZXJpbmZvIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX0dOVV92ZXIqIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIC5nbnUudmVyc2lvbiogc2VjdGlvbiBuYW1lcy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KLQkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgaW5jbHVkZQotCXZlcnNpb24gbmFtZSBpbiBzdHJpbmcgZW50ZXJlZCBpbiBkeW5hbWljIGhhc2ggdGFibGUuCi0JKiBlbGZjb2RlLmg6IEluY2x1ZGUgZm5tYXRjaC5oLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGEgZHluYW1pYwotCXN5bWJvbCB3aGljaCB3YXMgZm9yY2VkIHRvIGJlY29tZSBsb2NhbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBMaWtld2lzZS4KLQotRnJpIEZlYiAyMSAxNjoxNToxOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFNpbXBsaWZ5Ci0Jc29tZXdoYXQuCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgY29tcHV0ZSBhIHN5bWJvbCdzIHZhbHVlCi0Jd2hlbiB0aGUgc3ltYm9sIGlzIGxvY2FsLCBidXQgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgd2UgYXJlCi0JcmVsYXhpbmcuICBJbXBsZW1lbnQgYWJzMjQgLT4gYWJzMTYsIGltbTI0IC0+IGltbTE2IGFuZCBkMjQgLT4gZDE2Ci0JcmVsYXhpbmcuCi0KLUZyaSBGZWIgMjEgMTM6NTU6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLgotCVN0b3JlIGxvd2VyIDE2IGJpdHMgb2YgYWRkZW5kIGluIFJfTTMyUl9ISTE2X1tTVV1MTyBpbnNucy4KLQlBZGQgc21hbGwgZGF0YSBhcmVhIHN1cHBvcnQgKFJfTTMyUl9TREExNikuCi0JKiByZWxvYy5jOiBEb2N1bWVudCBCRkRfUkVMT0NfTTMyUl9TREExNi4KLQkqIGJmZC1pbjIuaCxsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBGZWIgMjAgMjM6NTA6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi1UdWUgRmViIDE4IDE3OjIyOjU5IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBlbGYuYywKLQlyZWxvYy5jLCB0YXJnZXRzLmM6IE5ldyB0YXJnZXQsIGVsZi0qLUQzMFYuCi0KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogY3B1LWQzMHYuYywgZWxmMzItZDMwdi5jOiBOZXcgZmlsZXMuCi0KLVR1ZSBGZWIgMTggMTU6MzE6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBGaXggdHlwbyBpbiBjb21tZW50LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNvZmYtdGljODAuYyAoUlRZUEUySE9XVE8pOiBSZXBsYWNlIGFib3J0IHdpdGggcmVhbCBmdW5jdGlvbi4KLQkocnR5cGUyaG93dG8pOiBBZGQgZnVuY3Rpb24uCi0JKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkLgotCi1UdWUgRmViIDE4IDExOjQxOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogc3lzZGVwLmg6IERvbid0IGRlZmluZSBlcnJubyBpbiBNU1ZDIGlmIGVycm9yLmggaXMgaW5jbHVkZWQuCi0KLVR1ZSBGZWIgMTggMTA6MDQ6MTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIHN1cmUgcl9zeW1uZHgKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgaXQgaXMgdXNlZC4KLQotTW9uIEZlYiAxNyAxMToyODo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogRG9uJ3QgY29udmVydCBhIHNlY29uZGFyeSBjb21tb24KLQlzeW1ib2wgaW50byBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbDsgbGVhdmUgaXQgYXMgYSBjb21tb24gc3ltYm9sLgotCi1GcmkgRmViIDE0IDE5OjA4OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBpc3N1ZSBhIHdhcm5pbmcKLQlhYm91dCBhIHN5bWJvbCBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLQotVGh1IEZlYiAxMyAyMDo1MzoyMiAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogbWFrZWZpbGUudm1zOiBBZGQgZ2NjIGZsYWdzIHRvIGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjCi0Jc25hcHNob3QKLQkodGFyZ21hdGNoLmgpOiBOZXcgZGVwZW5kZW5jeS4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24gZm9yCi0Jb3BlblZNUy9BbHBoYS4KLQkqIGV2YXguaCAoQUxQSEFfUl9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uLgotCSogZXZheC1hbHBoYS5jIChBTFBIQV9SX0NPREVBRERSKTogNjQgYml0IHByb2NlZHVyZSByZWxvY2F0aW9uIGZvcgotCW9wZW5WTVMvQWxwaGEuCi0JKiBldmF4LWV0aXIuYyAoQUxQSEFfUl9DT0RFQUREUik6IE91dHB1dCBvYmplY3QgY29kZSBmb3IgdGhpcwotCXJlbG9jYXRpb24uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JUmVzdHJpY3Qgc3ltYm9sIGxlbmd0aCB0byA2NCBieXRlcywgY2FzZSBwcmVzZXJ2aW5nOgotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IFJlbW92ZSBjYXNlIGhhY2tpbmcuCi0JKiBldmF4LW1pc2MuYyAoX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wpOiBSZW1vdmUuCi0JKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGRlZC4KLQkqIGV2YXgtZXRpci5jIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IENhbGwKLQlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sIGJlZm9yZSBvdXRwdXQgb2Ygc3ltYm9sLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogTGlrZXdpc2UuCi0JKiBldmF4LmggKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpOiBSZW1vdmUuCi0KLQkqIGV2YXgtZW1oLmM6IE91dHB1dCBmaWxlbmFtZSB0byBvYmplY3QgZmlsZSB3aXRob3V0IHBhdGguCi0KLQkqIGV2YXgtZWdzZC5jOiBOZXcgc2VjdGlvbnMgZm9yIGxvY2FsIGFuZCBnbG9iYWwgY29tbW9ucy4KLQotCSogZXZheC1hbHBoYS5jLCBldmF4LWVtaC5jLCBldmF4LWVnc2QuYywgZXZheC1ldGlyLmMsCi0JZXZheC1taXNjLmMsIGV2YXguaDogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMgZnJvbSBjb3B5cmlnaHQKLQlub3RpY2VzLiAgUmVwbGFjZSBBWFAgd2l0aCBBbHBoYS4KLQotV2VkIEZlYiAxMiAxODoxMDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogV2UgbmVlZCB0aGUgZHluYW1pYwotCXNlY3Rpb25zIGlmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UdWUgRmViIDExIDE1OjQ1OjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LXdpbmRvd3MpOiBEb24ndCBzZXQgaG9zdDY0PXRydWUuCi0KLVR1ZSBGZWIgMTEgMTU6Mjc6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfR1BSRUwuCi0JKGVsZl9taXBzMTZfZ3ByZWxfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfZ3ByZWxfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0dQUkVMKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIEZlYiAxMCAyMzoyNTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChlbGZfbTMycl9ob3d0b190YWJsZSk6IENoYW5nZSBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZQotCWZvciBSX00zMlJfezE2LDMyLDI0LEhJMTZfVUxPLEhJMTZfU0xPLExPMTZ9LgotCi1GcmkgRmViICA3IDEyOjM5OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBJZiB3ZSd2ZSBkaXNjYXJkZWQgYSBzZWN0aW9uLAotCXRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uOyBkb24ndCBwcmludCBhbgotCWFzc2VydGlvbiBtZXNzYWdlIGZvciB0aGF0IGNhc2Ugd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UaHUgRmViICA2IDE2OjU1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChGTl9TVFVCLCBDQUxMX1NUVUIsIENBTExfRlBfU1RVQik6IERlZmluZS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGRzIGZuX3N0dWIsCi0JbmVlZF9mbl9zdWIsIGNhbGxfc3R1YiwgYW5kIGNhbGxfZnBfc3R1Yi4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZCBtaXBzMTZfc3R1YnNfc2Vlbi4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlZGlyZWN0IHJlbG9jYXRpb25zIHRvIHVzZSBtaXBzMTYKLQlzdHVicyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBBdHRhY2ggc3R1YiBzZWN0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUKLQlzeW1ib2wuICBTZXQgbmVlZF9mbl9zdHViIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX3N0dWJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERpc2NhcmQgbG9jYWwgc3ltYm9scyB0aGF0IGFyZQotCWF0dGFjaGVkIHRvIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuCi0KLVdlZCBGZWIgIDUgMTM6MjA6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZQotCXN5bWJvbCB2YWx1ZSB3aGVuIGNvbXB1dGluZyB0aGUgYWRkZW5kIGZvciBhIHBjX3JlbGF0aXZlCi0JcGNyZWxfb2Zmc2V0IHJlbG9jLgotCi1Nb24gRmViICAzIDExOjU0OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluaywganVzdCBza2lwIHBjX3JlbGF0aXZlIHBjcmVsX29mZnNldCByZWxvY3MuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IFJldHVybiBhIGRpZmZlcmVudCBob3d0bwotCXN0cnVjdHVyZSBmb3IgYW4gQVJNMjYgcmVsb2Mgd2hpY2ggY2FuIGJlIHJlc29sdmVkLgotCShjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4KTogT25seSBjb252ZXJ0IEFSTTI2IHRvIEFSTTI2RCBpZiB0aGUKLQlyZWxvYyBjYW4gYmUgcmVzb2x2ZWQuCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IENvcnJlY3Qgb2ZmIGJ5IG9uZQotCWVycm9yIGluIG92ZXJmbG93IGNoZWNrIGZvciBSX1JFTEJZVEUuCi0KLUZyaSBKYW4gMzEgMTQ6MDc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogUGljayB1cCB0aGUgc3RhcnQgYWRkcmVzcy4KLQlGcm9tIE1hcmsgUmFzaW4gPG1hcmsucmFzaW5AdGVscmFkLmNvLmlsPi4KLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBEb24ndCBhcHBseSBkaXNjYXJkX2wgdG8KLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotV2VkIEphbiAyOSAwMDowMDo0OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAocmVsb2NfdHlwZSk6IEFkZCAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQotTW9uIEphbiAyNyAxMjowNzozNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHJlbG9jcyBCRkRfUkVMT0NfTTMyUl97SEkxNl9bVVNdTE8sTE8xNn0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW0zMnIuYzogQWRkIHN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKYW4gMjcgMTI6MjU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgcl9sZW5ndGguCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIHBsdC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSB1c2VkCi0Jcl9mb3JtYXQgYW5kIHJfcGNyZWwuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKiByaXNjaXguYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBkdW1teSB2YWx1ZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGNoZWNraW5nIGZvcgotCXJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudCwgbG9vayB1cCB0aGUgb3V0cHV0IG5hbWUgb2YKLQl0aGUgcmVsb2Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDIyIDE1OjQwOjI4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBVc2UgY29ycmVjdCBkYXRhIHB1dC9nZXQKLQlyb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8KLSAJVElDODBfQVJDSF9NQUdJQyBmb3IgVEljODAuCi0KLVR1ZSBKYW4gMjEgMTI6MzI6NDMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IENoYW5nZSB0byBsaXR0bGUgZW5kaWFuIGRhdGEKLQlhcyB0aGUgZGVmYXVsdC4KLQotVGh1IEphbiAxNiAxNzo0NTo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDaGFuZ2UgdHlwZSBvZgotCWF1eGlsaWFyeV9maWx0ZXJzIHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICogY29uc3QgKi4gIEFjY2VwdCBhCi0JTlVMTCB0ZXJtaW5hdGVkIGFycmF5LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMTUgMTE6MjE6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBUcmVhdCBhCi0JTk9UWVBFIHN5bWJvbCBpbiBhIHRleHQgc2VjdGlvbiBhcyBhIEZVTkMgc3ltYm9sLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlCi0JcmVsb2NiYXNlIHRvIGJlIGFsaWduZWQgdG8gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLgotCi1UdWUgSmFuIDE0IDA4OjQ2OjMzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogUmVzZXJ2ZSBzZXZlcmFsIHZhbHVlcyBmb3Igc3BhcmNsZXQuCi0KLU1vbiBKYW4gMTMgMjI6Mzk6MDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0aWM4MC0qLSopOiBEb24ndCByZXF1aXJlICdjb2ZmJy4KLQotTW9uIEphbiAxMyAxOTozNjoyNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUpOiBTZXQgdGhlIHNwZWNpYWxfZnVuY3Rpb24KLQl0YWJsZSB0byB2ODUwX2VsZl9yZWxvYyBmb3IgYWxsIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9ucy4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGNoZWNrIGZvciBoIGJlaW5nIG5vbi1udWxsLgotCSh2ODUwX2VsZl9yZWxvYyk6IEFkZCAgUl9WODUwX1pEQV9PRkZTRVQgc3VwcG9ydC4gIFVzZSBzd2l0Y2gKLQlzdGF0ZW1lbnQgaW5zdGVhZCBvZiBtdWx0aXBsZSBpZnMuCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdXAgZXJyb3IgbWVzc2FnZSwgZG9uJ3QganVzdCBjYWxsCi0JYWJvcnQuCi0KLU1vbiBKYW4gIDYgMTM6Mjg6MzUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVsZl9tbjEwMjAwX2hvd3RvKTogRG9uJ3QgZXZlciBzZXQgcGFydGlhbC1pbnBsYWNlLgotCVVzZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgYXMgc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jcy4KLQkoYmZkX2VsZjMyX21uMTAyMDBfcmVsb2MpOiBSZW1vdmUgdW5uZWNlc3NhcnkgZnVuY3Rpb24uCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBTZXQgcGNyZWxfb2Zmc2V0IGZvcgotCTI0Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCi1GcmkgSmFuICAzIDE2OjMzOjAwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogQWRkIGNvZmZjb2RlLmggdG8gZGVwZW5kZW5jeSBsaXN0LgotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogRGF0YSBieXRlIG9yZGVyIGlzIGJpZyBlbmRpYW4gYW5kCi0JaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbi4gIFVzZSBjb3JyZWN0IGJmZF9nZXQgYW5kCi0JYmZkX3B1dCByb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBoZWFkZXJzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgYXJjaCB0bwotCWJmZF9hcmNoX3RpYzgwIGZvciBUSUM4MF9BUkNIX01BR0lDIG51bWJlci4KLQotRnJpIEphbiAgMyAxNjo1NDowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfMjQuCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCAyNGJpdCBhbmQgcGNyZWwgcmVsb2NzLgotCShlbGZfbW4xMDIwMF9ob3d0bywgbW4xMDIwMF9yZWxvY19tYXApOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1GcmkgSmFuICAzIDE2OjU4OjMxIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JZWxmNjQtYWxwaGEgbXVsdGlwbGUgLmdvdCByZXdyaXRlOgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGFsd2F5c19zaXplX3NlY3Rpb25zIGVudHJ5LgotCShiZmRfZWxmKl9ta29iamVjdCk6IERvbid0IGRlZmluZSBoZXJlIC4uLgotCSogZWxmeHgtdGFyZ2V0Lmg6IC4uLiBidXQgcmF0aGVyIGhlcmUuICBEZWZhdWx0IGFsd2F5c19zaXplX3NlY3Rpb25zCi0JaG9vayB0byBOVUxMLgotCSogZWxmLmMgKGVsZl9ta29iamVjdCk6IFJlbmFtZSB0byBiZmRfZWxmX21rb2JqZWN0LCBzaW5jZSB0aGF0IHdhcwotCXdoYXQgdGhlICNkZWZpbmVzIGluIGVsZi1iZmQuaCB0cmFuc211dGVkIGl0IHRvIGFueXdheS4KLQotCSogc2VjdGlvbi5jOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIGZsYWcuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KLQlyZWxvY2F0aW9uIHNlY3Rpb24gZmxhZ3MuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBTRUNfTElOS0VSX0NSRUFURUQgaW5zdGVhZCBvZgotCVNFQ19JTl9NRU1PUlkgdG8gcmVjb2duaXplIGdlbmVyYXRlZCBiaXRzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MsIGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmssIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uLCBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24sCi0JbWlwc19lbGZfY2hlY2tfcmVsb2NzLCBtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiwKLQlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzLAotCWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIHRvCi0Jc2VjdGlvbiBmbGFncy4KLQkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCB0aGUgYWx3YXlzX3NpemVfc2VjdGlvbnMgaG9vay4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mIFNFQ19JTl9NRU1PUlkKLQl0byBpZGVudGlmeSBnZW5lcmF0ZWQgYml0cy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmM6IFJld3JpdGUgZXZlcnl0aGluZyB0b3VjaGluZyByZWxvY2F0aW9ucy4KLQotRnJpIEphbiAgMyAxMTo0Mjo1MyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoYWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljIHZhcmlhYmxlcyk6IEdvIHRocm91Z2gKLQlhbmQgcmVndWxhcml6ZSBuYW1lcyB0byBiZSBvZiB0aGUgZm9ybSB2ODUwX2VsZl88eHh4Pi4KLQkodG9wbGV2ZWwpOiBJbmNsdWRlIDxlbGYvdjg1MC5oPi4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0byBpbmNsdWRlL2VsZi92ODUwLmguCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBjb21tb24gdmFyaWFibGVzLCBpZiB0aGUgdmFyaWFibGUgaXMKLQlyZWZlcmVuY2VkIGJ5IGEgUl9WODUwX3tTREEsWkRBLFREQX0gcmVsb2NhdGlvbiwgcHV0IHRoZSB2YXJpYWJsZQotCWludG8gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQotVHVlIERlYyAzMSAxNToxNToyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggc29tZSBzcGFjaW5nLgotCi1UdWUgRGVjIDMxIDE0OjQ0OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0JKG1pcHMqLSotbGludXgqKTogTmV3IHRhcmdldC4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDbGVhbiB1cC4KLQlSZXR1cm4gYSB1c2VmdWwgdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCwgbm90Ci0JYWNfY3ZfZnVuY19tbWFwLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIGluc3RlYWQgb2YKLQlhY19jdl9mdW5jX21tYXAgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHBhcmFtZXRlcnMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEhhbmRsZSBEVF9BVVhJTElBUlkgYW5kCi0JRFRfRklMVEVSLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIERlYyAzMCAxODo0ODo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGV4cG9ydGluZyBhbGwgZGVmaW5lZAotCXN5bWJvbHMsIGRvbid0IGV4cG9ydCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGJ5IGFuIG9iamVjdCBpbiBhbgotCWFyY2hpdmUgd2hpY2ggY29udGFpbnMgc2hhcmVkIG9iamVjdHMuCi0KLU1vbiBEZWMgMzAgMTY6MTI6NTggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MAotCWZvciBUSSBUTVMzMjBjODAgKE1WUCkuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWM4MF9hcmNoLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlIGJ5IHJ1bm5pbmcgIm1ha2UgaGVhZGVycyIuCi0KLVN1biBEZWMgMjkgMTY6MTg6NTIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNwdS10aWM4MC5jIChiZmRfdGljODBfYXJjaCk6IEFkZCBzdHJ1Y3QuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IENvcnJlY3QgdHlwbywgInRiIiBub3QgInRwIi4KLQlBbHNvIGFkZCBjb2ZmbGluay5vIGZvciB0aWM4MGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBEZWMgMzAgMTE6NTQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYzogUGF0Y2ggdXAgdGhlIG1tYXAgY29kZSBzbyB0aGF0IGl0IGlzIG9ubHkgYnVpbHQgaWYgQkZECi0JaXMgY29uZmlndXJlZCB3aXRoIC0td2l0aC1tbWFwLgotCi1TdW4gRGVjIDI5IDEwOjQ4OjU3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi10aWM4MC5vCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdGljODAubwotCShjcHUtdGljODAubywgY29mZi10aWM4MC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvZmYtdGljODAuYzogQWRkIHNrZWxldG9uLCBjbG9uZWQgZnJvbSBhbm90aGVyIGNvZmYgY29uZmlnLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8gVElDODBNQUdJQwotIAlmb3IgVEljODAuCi0KLUZyaSBEZWMgMjcgMjA6NTY6NDEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFRPRE86IENvcnJlY3QgYSBtaXNzcGVsbGluZy4KLQkqIGNvZmYtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLQkqIGNwdS10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotCSogY29uZmlndXJlLmluIChjYXNlICR2ZWMpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCSogYXJjaHVyZXMuYyAoYmZkX3RpYzgwX2FyY2gpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfdGljODAuCi0JKiBjb25maWcuYmZkIChjYXNlICR7dGFyZ30pOiBBZGQgdGljODAqLSotY29mZiogdGFyZ2V0LgotCSogdGFyZ2V0cy5jICh0aWM4MGNvZmZfdmVjKTogQWRkIGRlY2wgYXMgZXh0ZXJuIGJmZF90YXJnZXQuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHRpYzgwY29mZl92ZWMgZW50cnkuCi0KLUZyaSBEZWMgMjcgMTE6NDg6MTIgMTk5NiAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2J1Y2tldHMpOiBBZGQgc29tZSBtb3JlIHZhbHVlcyBmb3IgbGFyZ2VyCi0JYmluYXJpZXMuCi0KLVRodSBEZWMgMjYgMTg6MzY6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1vdmUgc3ViZGlyX2RvIG91dCBvZiBjb25kaXRpb25hbC4gRnJvbQotCUZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+LgotCi1XZWQgRGVjIDE4IDEwOjA0OjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChlbnVtIHJlbG9jX3R5cGUpOiBFbmFibGUgYmFzaWMgOCwgMTYsIGFuZAotCTMyIGJpdCByZWxvY3MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTcgMTE6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IEFkZCAxIHRvIHRoZSB2YWx1ZSBvZiBhCi0JbWlwczE2IHN5bWJvbCBkdXJpbmcgdGhlIGxpbmsuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFN1YnRyYWN0IDEgZnJvbSB0aGUgdmFsdWUgb2YgYQotCW1pcHMxNiBzeW1ib2wuCi0JKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEZWZpbmUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHRoZSBzdF9vdGhlciBmaWVsZCBpZiBpdCBpcwotCW5vdCB6ZXJvLgotCi1Nb24gRGVjIDE2IDE0OjM4OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IGNoZWNrIGZvciByZWxvYyBzZWN0aW9ucwotCWFnYWluc3QgU0VDX0RFQlVHR0lORyBzZWN0aW9ucyBoZXJlIChyZXZlcnQgcGF0Y2ggb2YgRGVjZW1iZXIgNSkuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IENoZWNrIGZvciB0aGVtIGhlcmUsIGluc3RlYWQuCi0KLVN1biBEZWMgMTUgMTQ6NDY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEFkZCBkeW5hbWljIHBhcmFtZXRlci4KLQkqIGVsZi5jIChfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBQYXNzIG5ldyBhcmd1bWVudCB0bwotCXNsdXJwX3JlbG9jX3RhYmxlLgotCShfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogVXBkYXRlIGRlY2xhcmF0aW9uIG9mCi0Jc2x1cnBfcmVsb2NfdGFibGUuCi0JKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFVzZSBuZXcgZHluYW1pYyByZWxvYyByb3V0aW5lcyBieSBkZWZhdWx0LgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMKLQlwYXJhbWV0ZXIuCi0KLUZyaSBEZWMgMTMgMTM6MTg6NDkgMTk5NiAgRGFuIFdpbGRlciAgPGRhbkBnYXNib3kuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IFVzZSBNQzY4S0JDU01BR0lDIGZvciBiZmRfYXJjaF9tNjhrCi0JaWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFIGlzIGRlZmluZWQuCi0KLUZyaSBEZWMgMTMgMTE6MTM6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IENoYW5nZSBNX1NQQVJDTEVUIGZyb20gMTQyIHRvIDEzMS4KLQotVGh1IERlYyAxMiAxNTowNzoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE1vdmUgUl9QUENfUExUUkVMMjQgaW50byB0aGUKLQlzdXBwb3J0ZWQgcmVsb2NzLgotCi1UaHUgRGVjIDEyIDE0OjU1OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IGFkZCBhIHdlYWsKLQlzeW1ib2wgaWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JQWZ0ZXIgZmluZGluZyB0aGUgcmVhbCBkZWZpbml0aW9uLCB0aGVuLCBpZiBpdCBpcyBkeW5hbWljLCBhZGQgdGhlCi0Jd2VhayBzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCi0JKiBjb2ZmLWF1eC5jIChjb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KLQotCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBEb24ndCBkZWZpbmU7IGl0J3MgYQotCWZ1bmN0aW9uLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhbgotCWFycmF5LgotCi1UdWUgRGVjIDEwIDIzOjIzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIGJpZyBlbmRpYW4gbW4xMDMwMCByZWxvYwotCXZhcmlhbnRzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlLCBtbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFdyaXRlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCi0JKiByZWxvYy5jOiBSZW1vdmUgbW4xMDMwMCBiaWcgZW5kaWFuIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYzogVXBkYXRlIGZyb20gZWxmMzItbW4xMDMwMC5jLgotCi1GcmkgRGVjICA2IDE1OjE4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZS4KLQotCSogZWxmMzItbW4xMDMwMC5jOiBBZGQgc29tZSBjb21tZW50cy4KLQotRnJpIERlYyAgNiAxNzoxNjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWx3YXlzIGluaXRpYWxpemUgYnVmIGJlZm9yZSBqdW1waW5nIHRvCi0JZXJyb3JfcmV0dXJuLgotCShpaGV4X3JlYWRfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRGVjICA1IDIyOjI5OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfbW4xMDMwMF9ob3d0b190YWJsZSk6IERvbid0IHNldCBwYXJ0aWFsLQotCWlucGxhY2UgZm9yIG1vc3QgcmVsb2NzLgotCi1UaHUgRGVjICA1IDEzOjI0OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsaW5nIGNoZWNrX3JlbG9jcwotCWV2ZW4gaWYgU0VDX0FMTE9DIGlzIG5vdCBzZXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IGNoZWNrIFNFQ19BTExPQwotCXdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHNldCBTRUNfQUxMT0MgaW4gYQotCXJlbG9jIHNlY3Rpb24gaWYgaXQgaXMgbm90IHNldCBpbiB0aGUgc291cmNlIHNlY3Rpb24uCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIGEgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkCi0Jd2l0aCBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiBhcyBTRUNfREVCVUdHSU5HLgotCi1XZWQgRGVjICA0IDE0OjE4OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogI2lmIDAgY29kZSB0aGF0Ci0JZXhwZWN0cyBhIC5nb3QucGx0IHVudGlsIHdlIGFjdHVhbGx5IGNyZWF0ZSBpdC4KLQotTW9uIERlYyAgMiAxMjoxMzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgZm9yIGJmZF9yZWxvY19vdXRvZnJhbmdlLCByYXRoZXIgdGhhbiBhYm9ydGluZy4gIEZyb20KLQlQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIGluCi0JYSByZWxvY2F0ZWFibGUgbGluaywgZG9uJ3QgdHJ5IHRvIHByb2Nlc3MgdGhlbS4gIEZyb20gSGVpbnogV3JvYmVsCi0JPHdyb2JlbEBscHIuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KLQotTW9uIERlYyAgMiAwMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAobW4xMDMwMF9pbmZvX2hvd3RvKTogUmVuYW1lZCBmcm9tCi0JbW4xMDMwMF9pbmZvX2hvd3RvX3JlbC4gIFR3ZWFrIHJlbG9jIGFyZ3VtZW50IHRvIGJlIGFuCi0JRWxmMzJfSW50ZXJuYWxfUmVsYS4KLQkoVVNFX1JFTEEpOiBEZWZpbmUgaW5zdGVhZCBvZiBVU0VfUkVMLgotCShlbGZfaW5mb190b19ob3d0bywgZWxmX2luZm9faG93dG9fcmVsKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1TdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6ICBIYW5kbGUgbWlwcyotc2dpLWlyaXg2Ki4KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiAgQWNjZXB0IENPUkVfTUFHSUNOMzIKLQljb3JlIGZpbGVzLgotCi1XZWQgTm92IDI3IDEyOjEwOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dCBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdpdGggbm8gb3V0cHV0Ci0Jc2VjdGlvbi4KLQotVHVlIE5vdiAyNiAxMTowNzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBEb24ndCByZXF1aXJlIEFDX0NfQ1JPU1MuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgb3RoZXIgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG90aGVyIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogU2V0IHN0X290aGVyIGZyb20gZXhpc3Rpbmcgc3Rfb3RoZXIgZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIHN0X290aGVyIGluIGhhc2gKLQl0YWJsZSBvdGhlciBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNldCB0aGUgb3RoZXIgZmllbGQgZnJvbSB0aGUgZ2xvYmFsIGhhc2gKLQl0YWJsZSBlbnRyeS4KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTUlQUzE2XzI2LgotCShlbGZfbWlwczE2X2p1bXBfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfanVtcF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9KTVAuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfMjYuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfMjYuICBIYW5kbGUgUl9NSVBTXzI2Ci0JdG8gYSBtaXBzMTYgc3ltYm9sLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFMxNl9KTVApOiBBZGQgdG8gbGlzdCBvZiByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzOjE2IGVudHJ5LgotCi1Nb24gTm92IDI1IDExOjIzOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBsb25nIGxvbmcgZm9yIG1pcHMtc2dpLWlyaXg2Ki4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYWtlIGxpbmUgbnVtYmVyIG92ZXJmbG93Ci0Jb25seSBhIHdhcm5pbmcuICBGcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkZW11eXRAdWxiLmFjLmJlPi4KLQotTW9uIE5vdiAyNSAwODo1MjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBtb3JlIHJlbG9jIHR5cGVzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKGVsZjMyX21uMTAzMDBfcmVsb2NfbWFwKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKiByZWxvYy5jOiBBZGQgc29tZSBuZXcgcmVsb2NzIGZvciB0aGUgbW4xMDMwMCBzZXJpZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDIzIDEzOjI2OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgbG9zZSBmb3IgYSBzcGFjZSB3aGljaCBoYXMKLQlubyBkYXRhLCBidXQgc29tZSBzeW1ib2xzLgotCi1GcmkgTm92IDIyIDExOjMyOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfbmVlZGVkLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5nb3Qgc2VjdGlvbiBzaXplIGlmIGl0Ci0JaXMgbm90IGFscmVhZHkgc2V0LiAgU2V0IGdvdF9uZWVkZWQuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQKLQlzZHlucHRyLCBhbmQgb25seSBoYW5kbGUgZHluYW1pYyBzZWN0aW9ucywgaWYgZHluYW1pYyBzZWN0aW9ucyBhcmUKLQluZWVkZWQuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IFBhc3MgZmFsc2UgdG8gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JSW5pdGlhbGl6ZSAuZ290IHNlY3Rpb24uCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFNldCB1cCBQTFQgZW50cnkgZXZlbiBpZiB0aGlzIGlzIG5vdAotCWEgZHluYW1pYyBzeW1ib2wuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQgdXAKLQlkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLgotCi1UaHUgTm92IDIxIDEwOjMxOjMxIDE5OTYgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkZWQgVmVyc2FET1MgZm9ybWF0IHRvIHRoZSBFcmljc3NvbiBjb25maWd1cmF0aW9uLgotCi1XZWQgTm92IDIwIDE2OjMxOjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jOiBSb3VnaCBjdXQgYXQgcmVsb2NzIGZvciB0aGUgbW4xMDMwMC4KLQotV2VkIE5vdiAxMyAwODoxMjozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbGYzMi1kMTB2Lm8pOiBEb24ndCBkZXBlbmQgb24gZWxmL2QxMHYuaAotCWFueW1vcmUuCi0KLVR1ZSBOb3YgMTIgMTM6MzA6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogaWhleC5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3Vub3MuYzogQWRkIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQotTW9uIE5vdiAxMSAxMDozNzowMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSAuZ290LnBsdAotCXNlY3Rpb24uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4gIE1ha2UKLQlhcHByb3ByaWF0ZSByZWxvY2F0aW9ucyBpbiB0aGUgLnNvIGZpbGUgaWYgc2hhcmVkLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVHVlIE9jdCAyOSAxNTowMzowMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQpOiBVc2UKLQljb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZC4KLQotVHVlIE9jdCAyOSAxMjo1Mzo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3dzIGZvciBSX0QxMFZfMTYgYW5kIFJfRDEwVl8xOC4KLQotVHVlIE9jdCAyOSAxMzoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBVc2UgTE1BIHJhdGhlciB0aGFuIFZNQS4KLQkoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoZG9fYXNfcmVwZWF0KTogTGlrZXdpc2UuCi0JKGNvcHlfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCi1GcmkgT2N0IDI1IDE2OjU2OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBDb3JyZWN0bHkgcmVjb3JkIHdoZXRoZXIKLQl0aGVyZSBpcyBhbiBleHRlcm5hbCBwYXJ0LgotCi1UaHUgT2N0IDI0IDE0OjMyOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29ycmVjdGx5Ci0JaGFuZGxlIHRkYSBvZmZzZXRzIGZvciBzbGQudyBhbmQgc3N0LncgaW5zdHJ1Y3Rpb25zLgotCUZpeCBhbGlnbm1lbnQgY2hlY2sgaW4gc2xkLncgYW5kIHNzdC53IHRkYSByZWxvYyBoYW5kbGluZy4KLQotVGh1IE9jdCAyNCAwOTowODo0NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6ICBTZXQgVVNFX0JJTkFSWV9GT1BFTiBmb3IgKi0qLXdpbmRvd3MuCi0KLVdlZCBPY3QgMjMgMDA6NTM6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBjb21tZW50cyBhYm91dCBhc3N1bXB0aW9ucyBhYm91dAotCWNoYXIsIHNob3J0ICYgbG9uZyBzaXplcy4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBzaWduIGV4dGVuc2lvbgotCXByb2JsZW1zIGZvciBzZXZlcmFsIHJlbG9jcy4KLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2hvd3RvX3RhYmxlKTogRml4IHR5cG8gaW4KLQlSX1Y4NTBfU0RBX09GRlNFVCBlbnRyeS4KLQotV2VkIE9jdCAyMyAwMDoyMDozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IERvbid0IGFsbG9jYXRlIGxkc3ltLgotCVN0b3JlIGltcG9ydCBmaWxlIGluZGV4IGluIGxkaW5keC4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogQXNzdW1lIHRoYXQgbGRzeW0gd2FzIG5vdCBwcmV2aW91c2x5Ci0JYWxsb2NhdGVkLiAgRm9yIGFuIGltcG9ydGVkIHN5bWJvbCwgY29weSBsZGluZHggaW50byBsX2lmaWxlLgotCi1UdWUgT2N0IDIyIDE5OjIwOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBvcmRlcmluZyBvZgotCVJfVjg1MF9aREFfT0ZGU0VUIGFuZCBSX1Y4NTBfVERBX09GRlNFVC4gIEZpeCB2YXJpb3VzCi0JZmllbGRzIGluIFJfVjg1MF9UREFfT0ZGU0VULgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogVHdlYWsgcGMtcmVsYXRpdmUKLQlyZWxvY3MgdG8gd29yayBtb3JlIGxpa2Ugb3RoZXIgcmVsb2NzLiAgSGFuZGxlIFJfVjg1MF9UREFfT0ZGU0VUCi0JcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLXY4NTAuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogUmV0dXJuIGFuIGVycm9yIGlmIHdlIGdldCBhIHJlbG9jCi0Jd2UgY2FuJ3QgaGFuZGxlLgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCSh2ODUwX2VsZl9yZWxvY2F0aW9uX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotVHVlIE9jdCAyMiAxNzoyMjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZ25vcmUgc2VjdGlvbnMgd2hpY2gKLQlkb24ndCBoYXZlIFNFQ19MT0FEIGFuZCBTRUNfQUxMT0Mgc2V0LgotCi1Nb24gT2N0IDIxIDEyOjEzOjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQXZvaWQgbG9zaW5nIHN0YXRpYwotCXN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQotTW9uIE9jdCAyMSAxMDo1NDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEZXNjcmliZSBSX01JUFNfNjQuCi0JKG1pcHMzMl82NGJpdF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NfbWFwKTogQWRkIGVudHJ5IGZvciBCRkRfUkVMT0NfNjQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzY0LgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZQotCXdoZW4gYXR0ZW1wdGluZyB0byBkbyBhIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggZGlmZmVyZW50IG9iamVjdAotCWZpbGUgZm9ybWF0cywgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotVGh1IE9jdCAxNyAxMDo0MzoyOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChtMzJyIHJlbG9jcyk6IFJlbmFtZSB0aGVtLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQkobTMycl9lbGZfMTBfcGNyZWxfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMTBfUENSRUwgZW50cnkpOiBVc2UgaXQuCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQgZW50cnkpOiBGaXgge3NyYyxkc3R9X21hc2tzLgotCi1XZWQgT2N0IDE2IDExOjI0OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogU2V0ICJsaW5rZXJfbWFyayIgZm9yCi0JYWxsIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRGlzY2FyZCBzeW1ib2xzIGluIHNlY3Rpb25zCi0Jd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4KLQkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF9TREFfT0ZGU0VULAotCVJfVjg1MF9UREFfT0ZGU0VUIGFuZCBSX1Y4NTBfWkRBX09GRlNFVC4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKGVsZl92ODUwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIHJlbG9jLmM6IEFkZCBhZGRpdGlvbmFsIFY4NTAgcmVsb2NhdGlvbnMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTWFzayBvdXQgYml0cyB3ZQotCW5vIGxvbmdlciB3YW50IGluIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQotVHVlIE9jdCAxNSAyMjoxNzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBEb24ndCBzaWxlbnRseQotCWFjY2VwdCBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5Ym1vbCEKLQotVHVlIE9jdCAxNSAxNjoxNzoyOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6ICBEZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgdG8gYmUgJ18nLgotCi1UdWUgT2N0IDE1IDEyOjQwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogQnVtcCBmb3IgbmV3IHJlbG9jYXRpb24uCi0KLQkqIGhvc3RzL2kzODZic2QuaDogSWYgTkJQRyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIGl0IGFzCi0JUEFHRV9TSVpFLCBmb3IgcmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QuCi0KLU1vbiBPY3QgMTQgMTI6Mzc6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGBsb25nIGxvbmcnIGFzIHRoZSA2NCBiaXQgdHlwZSBvbiBhIFNvbGFyaXMKLQlob3N0LCBzaW5jZSBib3RoIGdjYyBhbmQgdGhlIFN1blBSTyBjb21waWxlcnMgc3VwcG9ydCBpdC4KLQotTW9uIE9jdCAxNCAxMToxNzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogcmVsb2MuYzogQ3JlYXRlIGEgbmV3IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTC4gIEl0IHdhcyBhCi0JbWlzdGFrZSB0byBoYXZlIHJldXNlZCB0aGUgRUNPRkYgTElURVJBTCBmb3IgRUxGIHNpbmNlIHRoZXkgaGF2ZQotCWRpZmZlcmVudCBzZW1hbnRpY3MuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGZfcmVsb2NfbWFwKTogTWFwIGZyb20gRUxGX0xJVEVSQUwuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBUcmFwIC5nb3QKLQlzZWN0aW9uIG92ZXJmbG93LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGVtaXQgYQotCWR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYW4gdW5kZWZ3ZWFrIHN5bWJvbCB3aGVuIHdlIGFyZSBidWlsZGluZwotCWEgc3RhdGljIGV4ZWN1dGFibGUuCi0KLVRodSBPY3QgMTAgMTE6MTU6MDYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKGNvbmZpZy5iZmQsIHRhcmdtYXRjaC5zZWQpOiBFZGl0IHJlZmVyZW5jZXMgdG8KLQlwb2ludCBleHBsaWNpdGx5IHRvIHNyY2Rpci4KLQkodGFyZ21hdGNoLmgpOiBFZGl0IHJlZmVyZW5jZXMgdG8gcG9pbnQgZXhwbGljaXRseSB0byBvYmpkaXIuCi0KLVRodSBPY3QgMTAgMTQ6MTQ6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBXaGVuIHNldHRpbmcgdGFyZ19jcHUsIGRvbid0IGdldCBjb25mdXNlZCBieQotCWxpbnV4LWdudS4KLQotVHVlIE9jdCAgOCAwODo1MToxOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QgKGEgYnVpbGQgZG9uZQotCXVuZGVyIHRoZSBNaWNyb3NvZnQgYnVpbGQgZW52aXJvbm1lbnQpLgotCi1UdWUgT2N0ICA4IDExOjQwOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uIGluIGEgZHluYW1pYyBvYmplY3QsIGFkZCBpdCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLQlpZiBhbnkgZHluYW1pYyBvYmplY3QgbWVudGlvbnMgaXQuICBSZXZlcnRzIHBhcnQgb2YgbGFzdCBwYXRjaC4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfYmFzZSBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZ290X2Jhc2UuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUKLQl0aGFuIDB4MTAwMCBieXRlcywgc2V0IF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gYW5kIGdvdF9iYXNlIHRvCi0JMHgxMDAwLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogU3VidHJhY3QgZ290X2Jhc2UgZnJvbSBhIGJhc2UKLQlyZWxhdGl2ZSByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2lzYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHdhcm4gYWJvdXQgbGlua2luZwotCS1taXBzMSBhbmQgLW1pcHMyIGNvZGUgdG9nZXRoZXIsIG9yIC1taXBzMyBhbmQgLW1pcHM0IGNvZGUuCi0KLU1vbiBPY3QgIDcgMTE6NDQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBPbmx5IHRyZWF0IGFyY2hpdmUgYXMgbGl0dGxlCi0JZW5kaWFuIGZvciBpOTYwIENPRkYuCi0KLUZyaSBPY3QgIDQgMTM6NDk6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCBzb2ZhcgotIAlieSB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIHNlY3Rpb24gd2hlbiBFWEVDX1AgaXMgbm90IHNldC4KLQotCSogY29mZi1tNjhrLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogQWRkIHRoZSBzZWN0aW9uCi0JVk1BIHRvIHRoZSBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJld29yayBiYWNrc2xhc2ggbG9vcCBhIGJpdCB0byBhdm9pZCBidWcgaW4gc2VkIG9uCi0JSFAvVVggMTAuMjAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSAuLi9iZmQvc3lzZGVwLmgsIHNpbmNlIGl0IHdpbGwgYXBwZWFyIHdoZW4KLQlzb20uaCBpcyBpbmNsdWRlZC4KLQotRnJpIE9jdCAgNCAxMTo0MTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGZvciBtbjEwMjAwIGFuZAotCW1uMTAzMDAgZmlsZXMuCi0JKEFMTF9NQUNISU5FX0NGSUxFUyk6IEFkZCBjcHUtbW4xMDIwMC5jIGFuZCBjcHUtbW4xMDMwMC5jLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItbW4xMDIwMC5jIGFuZCBlbGYzMi1tbjEwMzAwLmMKLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNjo1Nzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCBvYmpfY29mZl9rZWVwX3N5bXMKLQlkdXJpbmcgdGhpcyBmdW5jdGlvbi4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBPbmx5IHVzZSBhbiBleGlzdGluZwotCXNlY3Rpb24gaWYgdGhlIGZsYWdzIGFyZSBjb21wYXRpYmxlLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBoYXZldmVjcywgYW5kIHB1dCBpdCBpbiB0ZGVmYXVsdHMuCi0JKiBtcHctY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdtYXRjaC5zZWQ6IE5ldyBmaWxlOyBhIHNlZCBzY3JpcHQgdG8gYnVpbGQgdGFyZ21hdGNoLmggZnJvbQotCWNvbmZpZy5iZmQuCi0JKiBjb25maWcuYmZkOiBBZGQgI2lmLCAjZW5kaWYsIGFuZCBjb21tZW50cyBmb3IgdGFyZ21hdGNoLmguCi0JKiB0YXJnZXRzLmM6IEluY2x1ZGUgImZubWF0Y2guaCIuCi0JKHN0cnVjdCB0YXJnbWF0Y2gpOiBEZWZpbmUuCi0JKGJmZF90YXJnZXRfbWF0Y2gpOiBEZWZpbmUgYnkgaW5jbHVkaW5nIHRhcmdtYXRjaC5oLgotCShiZmRfZmluZF90YXJnZXQpOiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZCBieSBuYW1lLCBzZWFyY2ggZm9yCi0JaXQgYXMgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LWFybS5vLCBhb3V0LXNwYXJjbGUubywgaHAzMDBic2QubywKLQlpMzg2ZHluaXgubywgbTY4azRrbmV0YnNkLm8sIGFuZCByaXNjaXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGFvdXQtYXJtLmMsIGFvdXQtc3BhcmNsZS5jLAotCWhwMzAwYnNkLmMsIGkzODZkeW5peC5jLCBtNjhrNGtuZXRic2QuYywgYW5kIHJpc2NpeC5jLgotCShIRklMRVMpOiBBZGQgdGFyZ21hdGNoLmguICBBbHNvLCBhbHBoYWJldGl6ZSBhbmQgcmVpbmRlbnQuCi0JKENGSUxFUyk6IFJlbW92ZSBpMzg2ZHluaXguYyBhbmQgaHAzMDBic2QuYy4KLQkodGFyZ21hdGNoLmgpOiBOZXcgdGFyZ2V0LgotCShkb19jbGVhbik6IFJlbW92ZSB0YXJnbWF0Y2guaC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KLQkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IElmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLCBkZWNsYXJlIGdldGVudi4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCi1UaHUgT2N0ICAzIDA5OjI5OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMDogUmVtb3ZlZC4KLQkqIGNwdS1tbjEwMjAwLmMsIGNwdS1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KLQkqIGVsZjMyLW1uMTAyMDAuYywgZWxmMzItbW4xMDMwMC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gdHdvIHNlcGFyYXRlCi0JY29uZmlndXJhdGlvbnMsIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0JKiBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLCB0YXJnZXRzLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTU6Mzg6MTkgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRvX2Rpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMTo0MDo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1tbjEweDAwLmMsIGVsZjMyLW1uMTB4MDAuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtbW4xMHgwMC5vLgotCShCRkQzMl9CQUNLRU5EUyk6IFNpbWlsYXJseSBmb3IgZWxmMzItbW4xMHgwMC5vLgotCShlbGYzMi1tbjEweDAwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX21uMTB4MDAuCi0JKGJmZF9tbjEweDAwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfbW4xMHgwMF9hcmNoLgotCSogY29uZmlnLmJmZDogQWRkIG1uMTB4MDAtKi0qLgotCSogY29uZmlndXJlLmluOiBBZGQgYmZkX2VsZjMyX21uMTB4MDBfdmVjLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9tbjEweDAwLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfbW4xMHgwMF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIE9jdCAgMiAxNTo0Njo0NSAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCW9wZW5WTVMvQWxwaGE6IFByb3ZpZGUgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncyB2aWEKLQlzeW1ib2wgdGFibGUgZnJvbSBnYXMuCi0JQWRkIGNhc2VfaGFjayBjb2RlIGZvciBzeW1ib2wgb3V0cHV0IGZyb20gdmF4L3Ztcy4KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9pbml0aWFsaXplKTogUmVtb3ZlIGZpbGVuYW1lIGhhbmRsaW5nLAotCWZpbGVuYW1lIGlzIHByb3ZpZGVkIHZpYSBzeW1ib2wgdGFibGUuCi0JKGV2YXhfZ2V0X3N5bXRhYik6IFVzZSBsb2NhbCBzeW1ib2wgY291bnQgd2hlbiBzZXR0aW5nIHVwIHRhYmxlLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogUHJpbnQgY29ycmVjdCBuYW1lIHdoZW4KLQlkZWJ1Z2dpbmcuCi0JKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogU2tpcCBmaWxlIG5hbWUgc3ltYm9sLgotCSogZXZheC1lbWguYyAoZ2V0X3Ztc190aW1lX3N0cmluZyk6IExvY2FsIGZ1bmN0aW9uIG5vdy4KLQkoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IEV4dHJhY3Qgc291cmNlIGZpbGVuYW1lIGFuZCBjYXNlX2hhY2sgZmxhZ3MKLQlmcm9tIHN5bWJvbCB0YWJsZS4KLQkqIGV2YXhfd3JpdGVfZXRpciAoX2JmZF9ldmF4X3dyaXRlX2V0aXIpOiBQYXNzIGFsbCBzeW1ib2wgbmFtZXMKLQl0aHJvdWdoIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sLgotCSogZXZheC1taXNjLmMgKGhhc2hfc3RyaW5nLCBfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoX2JmZF9ldmF4X2Jhc2VuYW1lKTogUmVtb3ZlZC4KLQkoX2JmZF9nZXRfdm1zX3RpbWVfc3RyaW5nKTogTW92ZWQgdG8gZXZheC1lbWguYy4KLQkqIGV2YXguaCAoZXZheF9wcml2YXRlX2RhdGFfc3RydWN0KTogUmVtb3ZlIGZpbGVuYW1lLgotCShmbGFnX2hhc2hfbG9uZ19uYW1lcywgZmxhZ19zaG93X2FmdGVyX3RydW5jLAotCWZsYWdfbm9faGFzaF9taXhlZF9jYXNlLCB2bXNfbmFtZV9tYXBwaW5nKTogTmV3IGZsYWdzIGZvcgotCXZtc19jYXNlX2hhY2suCi0KLVdlZCBPY3QgIDIgMTI6MDI6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmcmVlYnNkLmggKE5fR0VUX01BR0lDX05FVCk6IERvbid0IHVzZSBudG9obC4KLQkoTl9HRVRNSURfTkVULCBOX0dFVEZMQUdfTkVUKTogTGlrZXdpc2UuCi0JKE5PX1NXQVBfTUFHSUMpOiBEb24ndCBkZWZpbmUuCi0JKFNXQVBfTUFHSUMpOiBEZWZpbmUuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzCi0Jbm8gaGFzaCB0YWJsZSBlbnRyeSBmb3IgYSBnbG9iYWwgc3ltYm9sLgotCi1UdWUgT2N0ICAxIDE2OjE0OjIyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgotCi1UdWUgT2N0ICAxIDEyOjMxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgb3ZlcnJpZGUgYSBtZWFuaW5nZnVsCi0Jc3ltYm9sIHR5cGUgd2l0aCBUX05VTEwuICBXYXJuIGlmIHN5bWJvbCB0eXBlIGNoYW5nZXMuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHB1dCBhIHN5bWJvbCBmcm9tCi0JYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgcmVmZXJlbmNlZAotCW9yIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4KLQotRnJpIFNlcCAyNyAxODo0MTowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX2lzX2xvY2FsX2xhYmVsKTogIE5ldyBmdW5jdGlvbiB0bwotCXJlbW92ZSBkd2FyZiBsb2NhbCBsYWJlbHMuICBTaHJpbmtzIGJpbmFyaWVzIGJ5IGEgZmFjdG9yIG9mIDMhCi0KLU1vbiBTZXAgMjMgMTM6MzM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBDcmVhdGUgdGhlIC5zYnNzIHNlY3Rpb24KLQlieSBoYW5kLCByYXRoZXIgdGhhbiBieSBjYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb24uCi0KLU1vbiBTZXAgMjMgMDk6MjM6NDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IFJlbmFtZSBtMzJyIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQotRnJpIFNlcCAyMCAxMTo0Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rLCBhZGp1c3QgdGhlIHN5bWJvbCBpbmRleCBvZiBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuICBEb24ndAotCWNoYW5nZSB0aGUgYWRkZW5kIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgcGNyZWxfb2Zmc2V0IGlzIHNldC4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBkbyBhbnl0aGluZyBmb3IKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQXBwbHkgdGhlIHJlbG9jYXRpb24gZXZlbiBpZgotCWl0IGlzIHplcm8sIGluIGNhc2Ugc3JjX21hc2sgbWF0dGVycy4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1UaHUgU2VwIDE5IDExOjAzOjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBBbHdheXMgaW5pdGlhbGl6ZQotCWtlZXBfc3ltcy4KLSAJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgdGFyZ2V0X2luZGV4Ci0JdG8gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KLQotVHVlIFNlcCAxNyAxNDoxODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gYWJvdXQgaWxsZWdhbCBzeW1ib2wKLQlpbmRpY2VzLCByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlLiAgQ2hlY2sgd2hldGhlciB0aGUgaG93dG8gZmllbGQKLQlpcyBOVUxMLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGlsbGVnYWwgc3ltYm9sCi0JaW5kZXguCi0KLU1vbiBTZXAgMTYgMTI6Mzk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IENoYW5nZSBkc3RfbWFzayBmb3IgQVJNMjZECi0gCXJlbG9jIHRvIDAuCi0JKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IG11bHRpcGxlIHN5bWJvbHMgb24gYSBzaW5nbGUgbGluZS4KLQlGcm9tIFBhc2NhbCBNYXJ0aW4gPHBtYXJ0aW5AYWxzeXMuY29tPi4KLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAxMyAxNDozMjo0MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBTZXAgMTMgMTU6NTA6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFN3aXRjaCBvbiBvdXRwdXQgQkZEIHJhdGhlcgotCXRoYW4gaW5wdXQgQkZELgotCShiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogc2VjdGlvbi5jIChiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENoZWNrIHRoYXQKLQlib3RoIEJGRCdzIGFyZSB0aGUgcmlnaHQgZmxhdm91ci4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEZpbGwgaW4gc29tZSBmaWVsZHMgZm9yCi0JUl9QQVJJU0NfRElSMzIsIHNvIHRoYXQgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgcGFzc2VzCi0JaXRzIHNhbml0eSBjaGVjay4KLQotVGh1IFNlcCAxMiAxMTo0NTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIG0zMnIgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGNwdS1tMzJyLmMsZWxmMzItbTMyci5jOiBOZXcgZmlsZXMuCi0KLVRodSBTZXAgMTIgMTE6MTA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgZmllbGQgdG8gJ18nLgotCi1XZWQgU2VwIDExIDExOjU3OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogQ2hhbmdlIHR5cGUgcGFyYW1ldGVyIGZyb20gY2hhciB0byBpbnQuCi0JKG91dCk6IExpa2V3aXNlLgotCShwYXNzX292ZXIpOiBDaGFuZ2UgZnVuYyB0byBleHBlY3QgaW50LCBub3QgY2hhci4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUZXN0IFNFQ19BTExPQwotCXJhdGhlciB0aGFuIFNFQ19MT0FEIHdoZW4gYWxpZ25pbmcgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QKLQlzZWN0aW9uIGluIGEgc2VnbWVudC4KLQotVHVlIFNlcCAxMCAxNjoxODozMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IE1ha2UgYXJnIGNvbnN0LgotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSBleHRyYW5lb3VzIGV4dHJhIGFyZwotCXRvIG1ha2VfYmZkX2FzZWN0aW9uKCkuCi0JKiBlbGYtYmZkLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBwcm90b3R5cGUuCi0JKF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0KTogUmVtb3ZlIHByb3RvdHlwZS4KLQotCSogbmV0YnNkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IEFkZCBwcm90b3R5cGUuCi0JKiBhaXgzODYtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYwotCSogaHB1eC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogaXJpeC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogcHRyYWNlLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiB0cmFkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3JlbG9jX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX3N5bV9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfYXV4X2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9saW5lbm9faW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBEaXR0by4KLQkqIGloZXguYyAoaWhleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCSogdGVraGV4LmMgKGdldHN5bSk6IERpdHRvLgotCShmaW5kX2NodW5rKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkoaW5zZXJ0X2J5dGUpOiBEaXR0by4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4KLQkocGFzc19vdmVyKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltdGFiKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfbWtvYmplY3QpOiBEaXR0by4KLQkodGVraGV4X29iamVjdF9wKTogRGl0dG8uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X3NldF9hcmNoX21hY2gpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkod3JpdGV2YWx1ZSk6IERpdHRvLgotCSh3cml0ZXN5bSk6IERpdHRvLgotCShvdXQpOiBEaXR0by4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQkodGVraGV4X3ByaW50X3N5bWJvbCk6IERpdHRvLgotCSogaXJpeC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBEaXR0by4KLQkoaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIHNyZWMuYyAoc3JlY19uZXdfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zZXRfYXJjaF9tYWNoKTogRGl0dG8uCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCShzcmVjX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvLgotCShzcmVjX2dldF9zeW10YWIpOiBEaXR0by4KLQkoc3JlY19wcmludF9zeW1ib2wpOiBEaXR0byBhbmQgbWFrZSBzdGF0aWMuCi0JKiBlbGYuYyAoZWxmX3JlYWQpOiBEaXR0bwotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogRGl0dG8uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRGl0dG8uCi0JKHN5bV9pc19nbG9iYWwpOiBEaXR0by4KLQkoZWxmX21hcF9zeW1ib2xzKTogRGl0dG8uCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogRGl0dG8uCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IERpdHRvLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBEaXR0by4KLQkoZml4dXBfc3ltYm9sX3ZhbHVlKTogRGl0dG8uCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KLQkoY29weV9uYW1lKTogRGl0dG8uCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogRGl0dG8uCi0KLU1vbiBTZXAgIDkgMjI6MzY6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQgYWZ0ZXIgbTMyciBjaGFuZ2VzLgotCi1Nb24gU2VwICA5IDEyOjMxOjIyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQsY29uZmlndXJlLmluLGNvbmZpZ3VyZTogQWRkIG0zMnIgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluLGFyY2h1cmVzLmMsZWxmLmMsdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQ6IEtlZXAgdGFyZ2V0IGxpc3QgYWxwaGFiZXRpY2FsbHkgc29ydGVkLgotCi1Nb24gU2VwICA5IDExOjQ4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYywgY2FzZSBSX1Y4NTBfSEkxNik6IERvbid0IGZvcmdldAotCXRvIGFkZCBpbiB0aGUgY29uc3RhbnQgcGFydCBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCShjYXNlIFJfVjg1MF9ISTE2X1MpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAgNiAxNzowNDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IE1vZGlmeSB0aGUgc2l6ZSBvZiBSX0QxMFZfMTYKLQlhbmQgUl9EMTBWXzE4IHRvIGJlIDEgKHdvcmQpLgotCi1UaHUgU2VwICA1IDE1OjIzOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBJZiB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQKLQlvZiBlaXRoZXIgc2VjdGlvbiBpcyBiZmRfYWJzX3NlY3Rpb24sIHRoZW4gdGhlIGxpbmtlciBpcwotCWRpc2NhcmRpbmcgdGhlIHNlY3Rpb24gYW5kIHdlIHNob3VsZCBub3Qgb3B0aW1pemUgaXQuCi0KLVR1ZSBTZXAgIDMgMTI6MTY6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFvdXQtc3BhcmNsZS5vKTogTmV3IHRhcmdldC4KLQkqIGFvdXRmMS5oIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRG9uJ3QgZGVmaW5lIGlmIGxpdHRsZSBlbmRpYW4uCi0JKiBjb25maWcuYmZkIChzcGFyY2xldC0qLWFvdXQqKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGVfYW91dF92ZWMpOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGVfYW91dF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xlX2FvdXRfdmVjLgotCSogYW91dC1zcGFyY2xlLmM6IE5ldyBmaWxlLgotCi1UdWUgU2VwICAzIDAwOjU3OjAyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZgotCWxvdyBvcmRlciBzaWduIGJpdCBwcm9wb2dhdGlvbiBmb3IgUl9WODUwX0hJMTZfUy4KLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IE5ldyBmdW5jdGlvbiBmb3IKLQloYW5kbGluZyBWODUwIHNwZWNpZmljIHJlbG9jcy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBVc2UgdGhlIG5ldyBmdW5jdGlvbiBmb3Igc29tZQotCXJlbG9jYXRpb25zLiAgVHdpZGRsZSBtYXNrcyAmIHNoaWZ0cyBmb3Igc29tZSByZWxvY3MuCi0JU2V0IHBhcnRpYWxfaW5wbGFjZSB3aGVyZSBuZWVkZWQuCi0KLU1vbiBTZXAgIDIgMTI6MTI6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtbWlwcy5jOiBBZGQgYW4gZXhwbGljaXQgbWlwczozMDAwIGVudHJ5LCBhbmQgY2hhbmdlIHRoZQotCWRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRvIGEgbWFjaGluZSBudW1iZXIgb2YgMC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgbWFjaGluZSBudW1iZXIKLQlmb3IgRV9NSVBTX0FSQ0hfMS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogSWYgdGhlIG1hY2hpbmUgbnVtYmVyIG9mCi0JdGhlIG91dHB1dCBCRkQgaXMgdGhlIGRlZmF1bHQsIHNldCBpdCBmcm9tIHRoZSBmaXJzdCBpbnB1dCBCRkQuCi0KLVN1biBTZXAgIDEgMTg6Mzg6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWxsIHRoZSAxNmJpdCByZWxvY3MKLQlpbnNlcnQgYXQgYml0cG9zIHplcm8uICBUaGUgSEkxNiByZWxvY3MgYXJlIHNoaWZ0ZWQgcmlnaHQKLQlieSAxNiBiaXRzLiAgRml4IHNyY19tYXNrIGZvciBhbGwgcmVsb2NzLgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLiAgVGhlIFY4NTAgaXMKLQlsaXR0bGUgZW5kaWFuIQotCShUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0JJR19OQU1FKTogUmVtb3ZlLiAgVGhlIFY4NTAgaXMgbGl0dGxlCi0JZW5kaWFuIQotCi1TdW4gU2VwICAxIDE1OjQxOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCVJld3JpdGUgdG8gdXNlIEJGRCBmaWxlIHJlYWQgcm91dGluZXMgYW5kIHRvIGF2b2lkIHVzaW5nIGEgZml4ZWQKLQlsZW5ndGggZm9yIHRoZSBmaWxlIG5hbWUuCi0KLVNhdCBBdWcgMzEgMTA6MjI6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfezMyLDE2LDh9LgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciBSX1Y4NTBfezMyLDE2LDh9LgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCB0cmFuc2xhdGlvbiBmcm9tIEJGRF9SRUxPQ197MzIsMTYsOH0KLQl0byBSX1Y4NTBfezMyLDE2LDh9LgotCi1GcmkgQXVnIDMwIDE4OjA2OjA0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX0hJMTZfUy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBZGQgaW5mbyBmb3IgSEkxNl9TIHJlbG9jLgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCBISV8xNl9TIHJlbG9jLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19WODUwXyogcmVsb2NzLgotCi1GcmkgQXVnIDMwIDExOjQ5OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBTSCBFTEYgc3VwcG9ydC4KLQkqIGVsZjMyLXNoLmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9zaC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSGFuZGxlIGFic29sdXRlIHN5bWJvbC4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGVsZmxpbmsuaCAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSk6IFJlbmFtZSBmcm9tCi0JZWxmX2xpbmtfcmVhZF9yZWxvY3MuICBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogR2V0IGV4dGVybmFsIHN5bWJvbHMgZnJvbSBjYWNoZSBpbgotCXN5bXRhYl9oZHItPmNvbnRlbnRzLiAgR2V0IGNvbnRlbnRzIGZyb20gY2FjaGUgaW4KLQllbGZfc2VjdGlvbl9kYXRhLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmRF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbik6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfU0hfKiByZWxvY3MuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBEZWNsYXJlLgotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IEZpeCBhIHJldHVybiB2YWx1ZS4KLQkoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbiwgYnJva2VuCi0Jb3V0IG9mIHNoX2FsaWduX2xvYWQuCi0JKHNoX2FsaWduX2xvYWQpOiBDYWxsIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuLgotCShzaF9zd2FwX2luc25zKTogQ2hhbmdlIHJlbG9jcyBwYXJhbWV0ZXIgdG8gUFRSLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3NoX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zaGxfdmVjKTogRGVjbGFyZS4KLQkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9zaF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX2VsZjMyX3NobF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXNoLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1zaC5jLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQ2hlY2sgdGhhdCBMTUEgZG9lcyBub3Qgc2tpcCBhCi0JcGFnZSBiZWZvcmUgY2hlY2tpbmcgRF9QQUdFRC4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGV4dGJhc2UgdmFyaWFibGUuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIGV4dGJhc2U7IGFsd2F5cyB1c2Ugc2VnYmFzZQotCWluc3RlYWQuCi0KLVRodSBBdWcgMjkgMTY6NTI6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLSopOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotKik6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1kZ3V4Kik6IFJlY29nbml6ZSBhcyBhIHN5bm9ueW0gZm9yIHg4NgotCWVsZi4KLQotVHVlIEF1ZyAyNyAwOToxODoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LgotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LiAgSWYKLQl3ZSBlbmNvdW50ZXIgYW4gUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB0aGF0Ci0Jd2lsbCBoYXZlIGFuIFNUX0NPREUgdHlwZSwgY2hhbmdlIHRoZSBzeW1ib2wncyB0eXBlIHRvIFNUX0RBVEEuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1UdWUgQXVnIDI3IDAwOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBTZXQgZHlub2JqIGlmIG5lZWRlZCBmb3IKLQlSX01JUFNfMzIgYW5kIFJfTUlQU19SRUwzMi4gIFNldCBzZ290IGFuZCBnIGFzIHNvb24gYXMgcG9zc2libGUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlcXVpcmUgLmdvdCB0byBleGlzdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAyMiAxMDo1NDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChITERFTlYpOiBOZXcgdmFyaWFibGUgdG8gc2V0LiAgU2V0IGl0IGZvcgotCSotKi1zeXN2NCosIHNpbmNlIHRob3NlIGxpbmtlcnMgbWF5IG5vdCBzdXBwb3J0IC1SIGJ1dCB0aGV5IGFsd2F5cwotCXN1cHBvcnQgTERfUlVOX1BBVEguCi0KLQkqIGxpYmllZWUuaCAoTlNFQ1RJT05TKTogRG9uJ3QgZGVmaW5lLgotCShpZWVlX2RhdGFfc3RydWN0KTogQ2hhbmdlIHNlY3Rpb25fdGFibGUgdG8gYXNlY3Rpb24gKiouICBBZGQKLQlzZWN0aW9uX3RhYmxlX3NpemUuCi0JKiBpZWVlLmMgKGdldF9zZWN0aW9uX2VudHJ5KTogSWYgdGhlIHRhYmxlIGlzbid0IGJpZyBlbm91Z2gsIG1ha2UKLQlpdCBiaWdnZXIuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBSZW1vdmUgYXNzZXJ0aW9uIGFib3V0IG51bWJlciBvZiBzZWN0aW9ucy4KLQkoaWVlZV9vYmplY3RfcCk6IEFkanVzdCBpbml0aWFsaXphdGlvbiBvZiBpZWVlIHRvIG1hdGNoIGNoYW5nZXMgdG8KLQl0aGUgc3RydWN0dXJlLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFyayk6IERvbid0IGNvcHkgcmVsb2NzIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzIG1lcmVseSBiZWNhdXNlIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IERvbid0IHNldCB1cCBnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LgotCi1UdWUgQXVnIDIwIDE1OjA2OjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS12ODUwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItdjg1MC5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF92ODUwX2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfdjg1MF9hcmNoLgotCSogY29uZmlnLmJmZCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LXY4NTAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF92ODUwLgotCSogZWxmMzItdjg1MC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Y4NTBfdmVjKTogTmV3IHZlY3Rvci4KLQotRnJpIEF1ZyAxNiAxNjoyNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBDcmVhdGUgYW5kIGRlZmluZQotIAlhIGZ1bmN0aW9uIGNvZGUgc3ltYm9sIGZvciBhbiBYTUNfWE8gc3ltYm9sLgotCi1UaHUgQXVnIDE1IDEyOjMzOjI5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVXBkYXRlIGVkaXRpbmcgb2YgYXV0b2NvbmYgdmFycyB0byByZWZsZWN0Ci0JSnVsIDE4IGNvbmZpZ3VyZS5pbiBjaGFuZ2UuCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSBlZGl0aW5nIG9mIGluY2x1ZGUgcGF0aG5hbWVzIHRvIGJlCi0JbW9yZSBnZW5lcmFsLCBhZGQgQERBU0hfQ19GTEFHQCB0byBleHBsaWNpdCBjb21waWxlIHJ1bGUgZWRpdC4KLQotVGh1IEF1ZyAxNSAxMDozNToxMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSk6IFRoZSBzZWN0aW9uIGZyb20KLQl3aGljaCB0byBvZmZzZXQgdG8gZ2V0IHRoZSAucGx0IGVudHJ5IGFkZHJlc3MgaXMgIi5wbHQiLgotCi1UaHUgQXVnIDE1IDE2OjQwOjMwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fVEhVTUJfQURELCBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSwKLQlCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULCBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCk6Ci0gCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgotCSogbGliYmZkLmg6IFJlYnVpbHQKLQkqIGJmZC1pbjIuaDogUmVidWlsdAotCi1XZWQgQXVnIDE0IDE3OjAyOjA5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cG8KLQlpbiBzZWN0aW9uIGR5bmlkeCBzdGFydC4KLQotVHVlIEF1ZyAxMyAxNDozNTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogVHJlYXQgc2VjdGlvbnMgd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UgYXMgU0VDX0xJTktfT05DRS4gIFRoaXMgaXMgYW4KLQlvcHRpbWl6YXRpb24gZm9yIGcrKy4KLQotVHVlIEF1ZyAxMyAxNzowNDo0MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBvbmUgbW9kdWxlIGhhcwotCXRoZSAtbXJlbG9jYXRhYmxlLWxpYiBiaXQgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgY2xlYXIgdGhlCi0JLW1yZWxvY2F0YWJsZS1saWIgYml0IGluIHRoZSBoZWFkZXIuCi0KLVNhdCBBdWcgMTAgMjI6NTk6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCByZXNvbHZlIGEgY29tbW9uCi0Jc3ltYm9sIGFnYWluc3QgYSBTVFRfRlVOQyBzeW1ib2wgaW4gYSBzaGFyZWQgbGlicmFyeS4KLQotRnJpIEF1ZyAgOSAxMjo0NDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBJZiBhIGRlc2NyaXB0b3IKLSAJc3ltYm9sIGlzIGZvdW5kLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgotIAljb2RlLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IHNldCAoKnN5bV9oYXNoKS0+bnVtYXV4Ci0JaWYgc3ltLm5fbnVtYXV4IGlzIG5vdCB6ZXJvLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBQZXJtaXQgdGhlIHN5bWJvbCBhbmQgdGhlIGhhc2ggdGFibGUKLQllbnRyeSB0byBkaXNhZ3JlZSBhYm91dCB0aGUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIGlmIHRoZSBzeW1ib2wKLQloYXMgemVyby4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBDcmVhdGUgdGhlIC5yZWwuZHluCi0Jc2VjdGlvbiBpZiBpdCBtaWdodCBiZSBuZWVkZWQsIG5vdCBqdXN0IGlmIGluZm8tPnNoYXJlZC4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTWFrZSByb29tIGZvciBhIG51bGwgZWxlbWVudCBhdAotCXRoZSBzdGFydCBvZiAucmVsLmR5biBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY2xlYXIgdGhlIGZpcnN0IGVsZW1lbnQKLQlvZiAucmVsLmR5biBpZiB0aGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotVGh1IEF1ZyAgOCAxNjoyNDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIHdlIGFscmVhZHkgY2FsbGVkIHRoZQotCXVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2sgZm9yIGEgc3ltYm9sLCB0aGVuIGRvbid0IGlzc3VlIGFueSBtb3JlCi0Jd2FybmluZ3MgYWJvdXQgbG9hZGVyIHJlbG9jcy4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGRvIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcKLQlhZnRlciBjYWxsaW5nIHRoZSB1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrLgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfTVVMVElQTFlfREVGSU5FRCk6IERlZmluZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbAotCWFzIHRoZSBBSVggbGlua2VyIHNlZW1zIHRvIGRvLgotCi1UaHUgQXVnICA4IDEyOjIxOjU2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYWxwaGFfdmVjKTogQ29ycmVjdGVkIGZsYWdzLCBjbGVhbnVwLgotCShldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZXZheF9yZWxvY190YWJsZS4KLQkoZXZheF9jbG9zZV9hbmRfY2xlYW51cCk6IERpdHRvLgotCShyZWxvY19uaWwpOiBEaXR0by4KLQkoYWxwaGFfaG93dG9fdGFibGUpOiBSZW1vdmUgQUxQSEFfUl9TV1JFTDMyIGFuZCBBTFBIQV9SX1NXUkVMNjQKLQllbnRyaWVzLgotCShldmF4X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogQWRkIGEgZmV3IGNhc3RzOyBzZXQKLQljb29rZWRfc2l6ZSA9PSByYXdfc2l6ZS4KLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF9yZWdpc3Rlcl9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGV2YXgtZXRpci5jIChldGlyX3N0Yyk6IEFsbG93IEVUSVJfU19DX1NUQ194eCBjb21tYW5kcy4KLQkqIGV2YXgtbWlzYy5jIChhZGRfbmV3X2NvbnRlbnRzKTogTWFsbG9jIHNlY3Rpb24gYXQgZnVsbCBzaXplLgotCShfYmZkX3NhdmVfZXZheF9zZWN0aW9uKTogTWVtY3B5IHNlY3Rpb24gY29udGVudHMgZGlyZWN0bHkuCi0JKiBldmF4LmggKEFMUEhBX1JfU1dSRUwzMiwgQUxQSEFfUl9TV1JFTDY0KTogUmVtb3ZlLgotCShldmF4X3JlbG9jX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBob3N0cy9hbHBoYXZtcy5oIChPX0FDQ01PREUpOiBEZWZpbmUgaWYgbmVlZGVkLgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24KLQlBZGQgZXZheC5oIGRlcGVuZGVuY2llcwotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBBZGQgY2FzZSBmb3IgMTYgYnl0ZSByZWxvYy4KLQkoQkZEX1JFTE9DX1NXUkVMMzIsQkZEX1JFTE9DX1NXUkVMNjQpOiBSZW1vdmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogUmVtb3ZlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IEF1ZyAgOCAwODoxNzozMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBJZmRlZiBhcm91bmQgY2FsbHMgdG8gZ2V0dWlkIGFuZAotCWdldGdpZCBpZiBfV0lOMzIgaXMgZGVmaW5lZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBSZW1vdmUgdW5uZWNlc3NhcnkgV0lOR0RCIGlmZGVmLgotCi1XZWQgQXVnICA3IDIzOjE5OjAwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggYmZkLWluLmggYmZkLWluMi5oIG9wbmNscy5jIHJpc2NpeC5jIHNvbS5jIHRhcmdldHMuYzoKLQlDaGFuZ2UgTk9fRkxBR1MgdG8gQkZEX05PX0ZMQUdTIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYW4gSFBVWAotCWluY2x1ZGUgZmlsZS4KLQkqIGxpYmJmZC5jOiAgQ3JlYXRlIGR1bW15IGdldHBhZ2VzaXplKCkgbWFjcm8gaWYgSEFWRV9HRVRQQUdFU0laRQotCWlzbid0IGRlZmluZWQuCi0KLVdlZCBBdWcgIDcgMTQ6MTE6NDQgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVERURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZAotCXJlYWxsb2MuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkocmVhbGxvYyk6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DLgotCi0JKiBhY2xvY2FsLm00IChCRkRfTkVFRF9ERUNMQVJBVElPTik6IEluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuCi0KLQkqIGllZWUuYyAoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhc3QgYmZkX2FsbG9jIHJldHVybi4KLQotV2VkIEF1ZyAgNyAxMjoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1pMzg2LmMgKGk4MDg2X2FyY2gpOiBBcmNoaXRlY3R1cmUgaW5mbyBmb3IgdGhlIGk4MDg2LgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgVmFsZXR0ZSA8dmFsZXR0ZUBjcmYuY2Fub24uZnI+OgotCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgRklSU1RfSU5WQUxJRF9SRUxPQywKLQlMQVNUX0lOVkFMSURfUkVMT0MsIFJfMzg2XzE2LCBSXzM4Nl9QQzE2LCBSXzM4Nl84LCBSXzM4Nl9QQzguCi0JKGVsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogSnVzdCBjYWxsIGFib3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IENoZWNrIHRoYXQgdGhlIHJlbG9jIHR5cGUgaXMgdmFsaWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgNiAxMjo1NDo1NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IEFkZGVkIFJfRDEwVl8zMi4KLQotTW9uIEF1ZyAgNSAxMzo0Mjo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRm9yIGEgbG9hZGFibGUgc2VjdGlvbiwKLQlvbmx5IGdldCB0aGUgTE1BIGZyb20gdGhlIHBoZHIgaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFydCBvZiB0aGUKLQlmaWxlLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogUmV3cml0ZSB0ZXN0cyBmb3Igc3RhcnRpbmcgYQotCW5ldyBzZWdtZW50IHRvIG1ha2UgdGhlbSBtb3JlIGNvbXByZWhlbnNpYmxlLiAgSWYgdGhlIHJlbGF0aW9uc2hpcAotCWJldHdlZW4gdGhlIExNQSBhbmQgdGhlIFZNQSBjaGFuZ2VkLCBzdGFydCBhIG5ldyBzZWdtZW50LiAgRG9uJ3QKLQljaGVjayBkeW5zZWMgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yIGEKLQl3cml0ZWFibGUgc2VjdGlvbjsgLU4gd2lsbCBub3cgaGFuZGxlIHRoaXMuCi0KLVRodSBBdWcgIDEgMjI6NDM6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlbW92ZSAiZXNlbCIgY2hhbmdlcy4gIE5vdCB0aGUgcmlnaHQgYXBwcm9hY2guCi0JKiBzb20uYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVXNlIFNUX0RBVEEgZm9yIHN5bWJvbHMKLQl3aGljaCBkb24ndCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCVJldmVyc2VzIGEgMTk5NCBjaGFuZ2UuCi0KLVdlZCBKdWwgMzEgMTU6NTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtTiBtb3JlIHJlYXNvbmFibGUgZm9yIEVMRjoKLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHNldAotCXBoZHJfaW5fc2VjdGlvbiB0byBmYWxzZSwgYW5kIGFsd2F5cyB1c2UgYSBzaW5nbGUgbG9hZCBzZWdtZW50LgotCShlbGZfc29ydF9zZWN0aW9ucyk6IFNvcnQgc2VjdGlvbnMgYnkgTE1BIGFmdGVyIFZNQS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgZG9uJ3QKLQlhbGlnbiB0byBtYXhwYWdlc2l6ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgYSBzZWN0aW9uIGlzIGxvYWRlZCBidXQgbm90IHBhZ2UKLQlhbGlnbmVkLCBjbGVhciBEX1BBR0VELgotCi1XZWQgSnVsIDMxIDE1OjAwOjEyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fT0ZGU0VUSU1NOCwgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpOgotIAlBZGRlZCwgZm9yIGludGVybmFsIHVzZSBieSB0aGUgQVJNIGdhcy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0Ci0JKiBiZmQtaW4yLmg6IFJlYnVpbHQKLQotVHVlIEp1bCAzMCAxNDoxNDo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoUl9IUFBBX0VTRUwpOiBOZXcgZmllbGQgc2VsZWN0b3IuCi0JKGVfZXNlbCk6IFNpbWlsYXJseS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IElmIHdlIGVuY291bnRlciBhbiBlX2VzZWwsCi0JdGhlbiBnZW5lcmF0ZSBSX0NPTVAyIChQVVNIX1NZTSksIFJfREFUQV9FWFBSIGZpeHVwIHN0cmVhbS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUiBqdXN0IGxpa2UgUl9DT0RFX0VYUFIuCi0KLVR1ZSBKdWwgMzAgMTM6MzE6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvIHRoZSByZWd1bGFyCi0JYXJjaGl2ZSBzZWFyY2ggYmVmb3JlIGxvb2tpbmcgZm9yIHN0cmlwcGVkIGR5bmFtaWMgb2JqZWN0cy4KLQotRnJpIEp1bCAyNiAxNzo1MTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBNYWtlIGV4cG9ydGluZyBhbiB1bmRlZmluZWQKLQlzeW1ib2wgYSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yLgotCi1XZWQgSnVsIDI0IDEyOjAyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUcmFjayB0aGUgdmlydHVhbAotCW1lbW9yeSBwb3NpdGlvbiBzZXBhcmF0ZWx5IGZyb20gdGhlIGZpbGUgcG9zaXRpb24sIGFuZCB1c2UgaXQgdG8KLQljb21wdXRlIHRoZSBhbGlnbm1lbnQgYWRqdXN0bWVudC4KLQotVHVlIEp1bCAyMyAxMDo0MzozMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgYWxsIHJlbG9jcyB0byAibG9uZyIKLSAJYW5kIGZpeGVkIG1hc2sgb24gUl9EMTBWXzEwX1BDUkVMX0wuCi0KLU1vbiBKdWwgMjIgMTU6MzA6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKG1pcHNfZWxmNjRfc2x1cnBfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZjY0X3dyaXRlX2FybWFwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjY0X2FyY2hpdmVfKik6IERlZmluZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYXJjaGl2ZV9wKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCVVzZSBpbnN0ZWFkIG9mIGJmZF9nZW5lcmljX2FyY2hpdmVfcC4KLQkoYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UKLQlpbnN0ZWFkIG9mIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cy4KLQkoYmZkX2VsZk5OX21rZGFyY2hpdmUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UgaW5zdGVhZCBvZgotCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUuCi0JKFRBUkdFVF9CSUdfU1lNKTogSWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zIGlzIGRlZmluZWQsIHVzZQotCWJmZF9lbGZOTl9hcmNoaXZlIGluIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgcmF0aGVyIHRoYW4KLQlfYmZkX2FyY2hpdmVfY29mZi4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogQ2hlY2sgZm9yIGFuZCByZWplY3QgYW4gYXJjaGl2ZSBtYXAKLQluYW1lIG9mIC9TWU02NC8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlCi0JU0hUX01JUFNfTElCTElTVCwgU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kCi0JU0hUX01JUFNfRVZFTlRTIHNlY3Rpb25zLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX0lGQUNFLAotCVNIVF9NSVBTX0NPTlRFTlQsIFNIVF9NSVBTX1NZTUJPTF9MSUIsIGFuZCBTSFRfTUlQU19FVkVOVFMKLQlzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCByZGF0YV9pbl90ZXh0IGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ29weQotCXJkYXRhX2luX3RleHQgZnJvbSBiYWNrZW5kIGluZm8gdG8gdGRhdGEuICBDbGVhciBpdCBpZiBhbnkgZGF0YQotCXNlY3Rpb24gY29tZXMgYmVmb3JlIC5yZGF0YS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgcmRhdGFfaW5fdGV4dCBmaWVsZCBpbgotCXRkYXRhIHJhdGhlciB0aGFuIGJhY2tlbmQgaW5mby4KLQotRnJpIEp1bCAxOSAxODoxNTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHRlc3QgZm9yIHdoZXRoZXIgYSBjb21waWxlciBoYXMgYSA2NCBiaXQKLQl0eXBlLiAgRnJvbSBKaW0gV2lsc29uIDx3aWxzb25AY3lnbnVzLmNvbT4uCi0KLVRodSBKdWwgMTggMTU6Mzk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDYqKTogTmV3IGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIFZFUlNJT04sIEJGRF9IT1NUXzY0QklUX0xPTkcKLQkocmVwbGFjaW5nIEhPU1RfNjRCSVRMT05HKSwgQkZEX0hPU1RfNjRfQklUX0RFRklORUQsCi0JQkZEX0hPU1RfNjRfQklULCBhbmQgQkZEX0hPU1RfVV82NF9CSVQuICBBZGQgYmZkLWluMi5oOmJmZC1pbjIuaAotCXRvIEFDX09VVFBVVCBjYWxsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYmZkLWluLmggKEJGRF9BUkNIX1NJWkUpOiBEZWZpbmUgYXMgQHdvcmRzaXplQCwgbm90IEBXT1JEU0laRUAuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBjb25kaXRpb25hbGx5LgotCShCRkRfSE9TVF9VXzY0X0JJVCk6IERlZmluZSB3aGVuIEJGRF9IT1NUXzY0X0JJVCBpcyBkZWZpbmVkLgotCShiZmRfdm1hKTogVHlwZWRlZiBhcyBCRkRfSE9TVF9VXzY0X0JJVC4KLQkoc3ltdmFsdWUsIGJmZF9zaXplX3R5cGUpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbik6IFJlbW92ZSBiZmQtdG1wLmguCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBiZmQtaW4zLmguCi0JKHN0bXAtYmZkLmgpOiBKdXN0IGRvIGNvcHktaWYtY2hhbmdlIGJmZC1pbjMuaCBiZmQuaC4KLQkoYmZkLWluMy5oKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1zeXN2NCopOiBEb24ndCBidWlsZCBzdW5vc19iaWdfdmVjLiAgRnJvbQotCUFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBJTlNUQUxMX1NITElCLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3Q6IEhhbmRsZSBJcml4IDYgc2hhcmVkIGxpYnJhcnkgbGlrZSBJcml4IDUuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY2hlY2sgYW4gWE1DX1RECi0Jc3ltYm9sIGZvciBhIG1hZ2ljIG5hbWUuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY2hhbmdlIHRoZSByZWxvYyBzeW1ib2wgZm9yIGFuCi0JWE1DX1REIHN5bWJvbC4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGdldCB0aGUgVE9DIG9mZnNldCBmb3IgYW4KLQlYTUNfVEQgc3ltYm9sLgotCi1UaHUgSnVsIDE4IDExOjM2OjMxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIEVMRiBzdXBwb3J0IHRvIG1pcHMgY29uZmlnLCBjcmVhdGUgdGhlCi0JZWxmMzItdGFyZ2V0LmggZmlsZSBpbiB0aGUgb2JqZWN0IGRpci4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBlbGZYWC10YXJnZXQuaCByZWZzIGF0IGJlZ2lubmluZ3Mgb2YgbGluZXMuCi0KLVdlZCBKdWwgMTcgMTg6MDI6MzIgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmM6IFJlZGlkIGRlYnVnIHNjaGVtZSAtIG51bWVyb3VzIGZwcmludGYncyBnb25lLgotCUFsc28gcmVtb3ZlZCBtb3N0IGFib3J0IGNhbGxzLCBpbiBmYXZvciBvZiB1c2luZyBiZmQgcmVwb3J0aW5nLgotCi1XZWQgSnVsIDE3IDE0OjUxOjUyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1kMTB2Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItZDEwdi5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9kMTB2X2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfZDEwdl9hcmNoLgotCSogY29uZmlnLmJmZCAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LWQxMHYuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF9kMTB2LgotCSogZWxmMzItZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLSAJQkZEX1JFTE9DX0QxMFZfMTgsIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTogRGVmaW5lLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfZDEwdl92ZWMpOiBOZXcgdmVjdG9yLgotCi1XZWQgSnVsIDE3IDEwOjU4OjU1IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlZCBib2d1cyBmcHJpbnRmCi0KLVR1ZSBKdWwgMTYgMjM6NDk6MDIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyBiZmQtaW4yLmg6ICBBZGQgYmZkX21hY2hfaTM4Nl9pMzg2IGFuZAotCWJmZF9tYWNoX2kzODZfaTgwODYgbWFjaGluZSB0eXBlcy4KLQotV2VkIEp1bCAxMCAxMjo0Mjo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBTRUNfQ09ERSBmb3IgX0lOSVQKLQlhbmQgX0ZJTkkgc2VjdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTE6MTg6MjEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBL1VYIGRvZXMgbm90IHJlcXVpcmUKLQlzcGVjaWFsIGhhbmRsaW5nIG9mIHRoZSBfTElCIHNlY3Rpb24uCi0KLVR1ZSBKdWwgIDkgMTU6NTI6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBVc2UgdGhlIGNvcnJlY3QKLQl2YWx1ZSBmb3IgUl9SRUxCWVRFLgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IE9ubHkgInNocmlua3MiCi0JYXJyYXkgaWYgb25lIHdhcyBhbGxvY2F0ZWQuCi0KLVR1ZSBKdWwgIDkgMTI6MjE6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAa2suaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGRzCi0JdXNlX3JsZF9vYmpfaGVhZCBhbmQgcmxkX3ZhbHVlLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBNYXJrIF9fcmxkX29ial9oZWFkIHN5bWJvbCBhcwotCWR5bmFtaWMuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIC5ybGRfbWFwIHNlY3Rpb24uICBJZgotCV9fcmxkX29ial9oZWFkIHN5bWJvbCBub3Qgc2VlbiwgY3JlYXRlIGFuIF9fcmxkX21hcCBzeW1ib2wuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2Ugc3BhY2UgaW4gLnJsZF9tYXAgc2VjdGlvbi4KLQlDcmVhdGUgYSBEVF9NSVBTX1JMRF9NQVAgZW50cnkgcmF0aGVyIHRoYW4gYSBEVF9ERUJVRyBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2F2ZSB2YWx1ZSBvZiBfX3JsZF9tYXAgb3IKLQlfX3JsZF9vYmpfaGVhZCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSGFuZGxlIERUX01JUFNfUkxEX01BUC4KLQotTW9uIEp1bCAgOCAxNjoxODowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DXzMyX1BDUkVMIGVudHJ5LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBGb3IgUl9QUENfQUREUjE2X0hBLCB1c2UKLQlwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmLW1pcHMuYyAoc3RydWN0IG1pcHNfaGkpOiBEZWZpbmUuCi0JKG1pcHNfcmVmaGlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0gCShtaXBzX3JlZmhpX2FkZHIsIG1pcHNfcmVmaGlfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX3JlZmhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUZISSByZWxvY3MuCi0JKG1pcHNfcmVmbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVmaGlfbGlzdC4KLQkobWlwc19yZWxoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19yZWxoaV9hZGRyLCBtaXBzX3JlbGhpX2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19yZWxoaV9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgUkVMSEkgcmVsb2NzLgotCShtaXBzX3JlbGxvX3JlbG9jKTogUHJvY2VzcyBtaXBzX3JlbGhpX2xpc3QuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJIG9yCi0JUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBSRUZMTyBvciBSRUxMTyByZWxvYy4KLQotRnJpIEp1bCAgNSAxOToyNzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCByZWxvY19jb3VudCBmaWVsZHMuCi0KLVRodSBKdWwgIDQgMTI6MDA6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIGR5bmFtaWMKLQlzZWN0aW9ucyB1bmxlc3MgdGhpcyBpcyBhIFN1bk9TIGxpbmsuCi0KLQkqIFZFUlNJT046IFNldCB0byAyLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi1XZWQgSnVsICAzIDE0OjU5OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmFvdXQuYzogSW5jbHVkZSAiYW91dC9hb3V0NjQuaCIuCi0gCShpMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIG5ldGJzZC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBzdXJlIHRoYXQKLQlhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaXMgY2FsbGVkIGJlZm9yZSBmaWRkbGluZyB3aXRoIHRoZSBtYWdpYwotCW51bWJlci4KLQotVHVlIEp1bCAgMiAyMzozMDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRml4IGNhc3RzIG9mIHBzaW5mby4KLQotU3VuIEp1biAzMCAxMzozNDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChpdG9zLCBzdG9pKTogRG9uJ3QgZGVmaW5lLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBpMzg2bHlueC5jIChLRUVQSVQpOiBEZWZpbmUgYXMgdWRhdGEuaS4KLQkoTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCB1c2Ugc3RvaS4KLQkoTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4KLQkqIHJpc2NpeC5jIChyaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4KLQlmbGFncy4gIERvbid0IHVzZSBzdG9pLgotCi0JKiBlbGYzMi1taXBzLmMgKEVMRl9NQUdQQUdFU0laRSk6IENoYW5nZSBkZWZpbml0aW9uIHRvIDB4MTAwMC4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IERvbid0IHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yCi0gCWEgd3JpdGFibGUgc2VjdGlvbiBpZiBpdCdzIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIHByZXZpb3VzCi0gCXNlZ21lbnQuICBSZXNldCB0aGUgd3JpdGFibGUgdmFyaWFibGUgZm9yIGEgcmVhZG9ubHkgc2VjdGlvbi4KLQotU2F0IEp1biAyOSAxNjoxODo1MSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IE1pc3NpbmcgaW5pdGlhbGl6YXRpb25zIG9mCi0JZmlyc3RfdGh1bmtfYWRkcmVzcywgdGh1bmtfc2l6ZSwgYW5kIGltcG9ydF90YWJsZV9zaXplLgotCSogcGVpY29kZS5oOiBJbXByb3ZlZCBzb21lIGRpYWdub3N0aWNzIHJlZ2FyZGluZyBlZGF0YSBzZWN0aW9ucy4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEVhcmxpZXIgZXJyb3IgY2hlY2sKLQlvbiBJTUdMVUUgcmVsb2NzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSW1wcm92ZWQgZGlhZ25vc3RpYyBmb3IgbGFyZ2UgVE9DREVGTidzLgotCShUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkIG1pc3NpbmcgRF9QQUdFRC4KLQotRnJpIEp1biAyOCAxMzo0ODo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBBbiB1bmRlZmluZWQgc3ltYm9sCi0Jd2l0aCBYQ09GRl9ERUZfRFlOQU1JQyBzZXQgaXMgcmVhbGx5IGRlZmluZWQuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IGNyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGlmIHVzaW5nIGFuCi0JWENPRkYgaGFzaCB0YWJsZS4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSB4Y29mZi1wb3dlcm1hYyBsaWtlCi0JYWl4Y29mZi1yczYwMDAuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyOCAxMToxNzowMCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgZmxhZ3MKLQlmaWVsZC4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSKTogRGVmaW5lLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSk6IERlZmluZS4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKTogRGVmaW5lLgotCShlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZmxhZ3MgZmllbGQuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IFJlY29yZCB0eXBlcyBvZiBMSVRVU0UgZW50cmllcyB0aGF0Ci0JYXJlIGZvdW5kIGZvciBMSVRFUkFMIHJlbG9jcy4KLQkoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIGl0cyBhZGRyZXNzCi0JdGFrZW4sIHdlIGNhbm5vdCBnZW5lcmF0ZSBhIC5wbHQgZW50cnkgZm9yIHRoZSBzeW1ib2wuCi0KLVRodSBKdW4gMjcgMTE6MjQ6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19JU0NfUE9TSVgsIGFuZCBjaGVjayBmb3Igc2V0aXRpbWVyIGFuZAotCXN5c2NvbmYgZnVuY3Rpb25zIChmb3IgZ3Byb2YpLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVdlZCBKdW4gMjYgMTY6Mjk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2FyY2hpdmVfcCk6IENoZWNrIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbgotCWFuIGFyY2hpdmUgaWYgaXQgaGFzIGEgbWFwLiAgSWYgdGhlIG9iamVjdCBmaWxlIGhhcyB0aGUgd3JvbmcKLQl4dmVjLCByZWplY3QgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYWRqdXN0X3JlbG9jX2luKTogU2V0IHRoZSBhZGRlbmQgZm9yIGEKLQlCUkFERFIsIFNSRUwxNiwgU1JFTDMyLCBvciBTUkVMNjQgcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbAotCXN5bWJvbC4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogVXNlIFJFTFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBVc2UgRklMSFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IFVzZSBTWU1FU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogVXNlIEFVWEVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBVc2UgTElORVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBVc2UgQU9VVFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBTQ05IU1osIG5vdCBzaXplb2YuCi0JKiBwZWljb2RlLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1biAyNSAxNToyODozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ29tbWVudCBvdXQgY29kZQotCWRlYWxpbmcgd2l0aCBtYWtpbmcgR09UIHBvaW50ZXJzIG5lZ2F0aXZlIG9mIHRoZSBHT1Qgc3ltYm9sIGZvcgotCW5vdy4KLQotVHVlIEp1biAyNSAxMTo0MToyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLQlpbmNyZW1lbnQgdGhlIC5yZWxhLnBsdCBzaXplIHVudGlsIGFmdGVyIHdlJ3JlIGRvbmUgY3JlYXRpbmcgdGhlCi0JLnBsdCBlbnRyeS4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIC5wbHQgZW50cnkgdG8gbG9hZCB0aGUKLQkucmVsYS5wbHQgb2Zmc2V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIGl0LgotCi1Nb24gSnVuIDI0IDE3OjE1OjEwIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiwgKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIpOgotCVVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQKLQl2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBEZWxldGVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgdjIuNSBvciBoaWdoZXIuCi0gICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDIyOjUwOjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGaXggdHlwbyBpbiBSX0VORF9UUlkgZm9yIGV4Y2VwdGlvbgotCWhhbmRsaW5nIGNvZGUgPiAxayBhd2F5LgotCi1Nb24gSnVuIDI0IDE4OjQxOjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBJZiBERUJVRyBpcwotCWRlZmluZWQsIG91dHB1dCB3aGVuZXZlciB0aGUgc3ltYm9sIGlzIHVwZGF0ZWQuCi0KLU1vbiBKdW4gMjQgMTc6NTg6MTIgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9hZGRyIG9mIGEgbm9uIFNFQ19BTExPQwotCXNlY3Rpb24gdG8gMCBpZiB1c2VyX3NldF92bWEgaXMgc2V0LgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQotU3VuIEp1biAyMyAyMDo0Mjo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JUGFydGlhbGx5IHVuZG8gcGF0Y2ggb2YgSnVuIDIwLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBVc2UgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgUmUtYWRkIGRlbGV0ZWQgY29kZSwgYnV0Ci0JdXNlICNpZmRlZiBDT0ZGX1dJVEhfUEUsIG5vdCBDT0ZGX09CSl9XSVRIX1BFLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmUtYWRkICNpZmRlZi4KLQotRnJpIEp1biAyMSAxNzozODoxNSAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQotRnJpIEp1biAyMSAxNToxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfYWxwaGEgY2FzZS4KLQotRnJpIEp1biAyMSAxMjozNToyNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KLQkoYWxwaGEtKi1saW51eCosIGFscGhhLSotZWxmKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X2FscGhhX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9hbHBoYV92ZWMgaWYgQkZENjQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfR1BESVNQKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LWFscGhhLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGY2NC1hbHBoYS5jLgotCi1UaHUgSnVuIDIwIDE4OjE0OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYXJtYXBfaGFzaCk6IElmIGhsb2cgaXMgMCwganVzdCByZXR1cm4gMCwgcmF0aGVyCi0JdGhhbiByZWx5aW5nIG9uIGEgcmlnaHQgc2hpZnQgb2YgMzIuCi0KLVRodSBKdW4gMjAgMTE6MDA6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBDaGFuZ2UgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYgdG8gQ09GRl9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgRGVsZXRlIENPRkZfT0JKX1dJVEhfUEUuCi0JKiBwZS17YXJtLGkzODYscHBjfS5jIChDT0ZGX09CSl9XSVRIX1BFKTogRGVsZXRlLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGlmZGVmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLCBhbHdheXMgaW5jbHVkZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6ICIuZHJlY3R2ZSIgZG9lc24ndCBoYXZlIHRyYWlsaW5nIDAuCi0KLVdlZCBKdW4gMTkgMTE6Mzc6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRml4IHVwIHRoZSB0ZXN0IGZvciAtVHRleHQgdG8KLQlhcHByb3hpbWF0ZSB0aGUgY29ycmVjdCBhbnN3ZXIgaWYgU0laRU9GX0hFQURFUlMgd2FzIG5vdCB1c2VkLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHNlY3Rpb24gZmlsZQotCXBvc2l0aW9uIGJhc2VkIG9uIExNQSByYXRoZXIgdGhhbiBWTUEuCi0KLVdlZCBKdW4gMTkgMTE6MTk6MjUgMTk5NiAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUlDNSA2MC8zLzE0MiAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRG9uJ3Qgb3V0cHV0IGFueQotCXN5bWJvbHMgaWYgaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsLgotCi1UdWUgSnVuIDE4IDE1OjE3OjM2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmM6IFJlbW92ZSAjaWYgMCBjb2RlLgotCShjb21wYXRhYmxlKTogRG9uJ3QgYWxsb3cgbWl4aW5nL21hdGNoaW5nIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMHMpOiBBZGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLWg4MzAwLmMgKGZ1bmN2ZWNfaGFzaF9uZXdmdW5jKTogSGFuZGxlIEg4L1MgdG9vLgotCShCQURNQUcpOiBMaWtld2lzZS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IExpa2V3aXNlLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IExpa2V3aXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY3B1LWg4MzAwLmMgKGg4MzAwX3NjYW4pOiBMaWtld2lzZS4KLQlBZGQgSDgvUyB0byBiZmRfaDgzMDBfYXJjaCBsaXN0LgotCi1UdWUgSnVuIDE4IDE0OjQyOjU4IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JQWRkZWQgc3VwcG9ydCBmb3IgQWxwaGEgT3BlblZNUzoKLQkqIGV2YXguaCwgZXZheC1hbHBoYS5jLCBldmF4LWVnc2QuYywgZXZheC1lbWguYzogTmV3IGZpbGVzLgotCSogZXZheC1ldGlyLmMsIGV2YXgtbWlzYy5jLCBob3N0cy9hbHBoYXZtcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGV2YXhfYWxwaGFfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1dSRUwzMiwgQkZEX1JFTE9DX1NXUkVMNjQpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFLCBCRkRfUkVMT0NfQUxQSEFfQkFTRVJFRyk6IERlZmluZS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpOiBEZWZpbmUuCi0JKGV2YXhfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZWNvZmZhbHBoYV9saXR0bGVfdmVjIGFuZCBldmF4X2FscGhhX3ZlYwotCWlmIEJGRDY0IGlzIGRlZmluZWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBldmF4LWFscGhhLm8sIGV2YXgtZWdzZC5vLCBldmF4LWV0aXIubywKLQlldmF4LWVtaC5vLCBhbmQgZXZheC1taXNjLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLAotCWV2YXgtZXRpci5jLCBldmF4LWVtaC5jLCBhbmQgZXZheC1taXNjLmMuCi0JKEhGSUxFUyk6IEFkZCBldmF4LmguCi0KLVR1ZSBKdW4gMTggMTM6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBNYWtlIG5hbWUgYSBjb25zdAotCXBvaW50ZXIuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTcgMTA6MDY6NTAgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNvbS5oIChSX0hQUEFfQkVHSU5fVFJZLCBSX0hQUEFfRU5EX1RSWSk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQkVHSU5fVFJZIGFuZCBSX0VORF9UUlkuCi0KLU1vbiBKdW4gMTcgMTI6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjcmVhdGUgYSByZWxvYwotCWZvciBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMiByZWxvY3MgaWYgbm8gZHluYW1pYyBzZWN0aW9ucyB3ZXJlCi0JY3JlYXRlZC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgLnJlbC5keW4gZm9yIFJfTUlQU19SRUwzMiBhbmQKLQlSX01JUFNfMzIgcmVsb2NzIGlmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVRodSBKdW4gMTMgMjA6MTQ6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlciB0aGFuCi0JX2Nvb2tlZF9zaXplLiAgQ29ycmVzcG9uZHMgdG8gTWF5IDEzIGNoYW5nZSBpbiBjb2ZmY29kZS5oLgotCi1UaHUgSnVuIDEzIDEwOjIzOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB0aGVyZSBhcmUgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGFsd2F5cyBzZXQgdGhlIGZfc3ltcHRyIGZpZWxkLCBldmVuIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRG9uJ3QgY2xlYXIgdGhlIGZfc3ltcHRyIGZpZWxkCi0JaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQltYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IENoZWNrIHRoYXQgdGhlcmUgYXJlIHNvbWUgc3ltYm9scwotCWJlZm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgc3RyaW5nIHRhYmxlIHNpemUuCi0KLVdlZCBKdW4gMTIgMTE6MTY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFdoZW4gY29uc2lkZXJpbmcgd2hldGhlcgotCXRvIHJlcGxhY2UgYSBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aXRoIGEgc3ltYm9sIGZyb20gYW5vdGhlcgotCWR5bmFtaWMgb2JqZWN0LCBkbyB0aGUgcmVwbGFjZW1lbnQgaWYgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcwotCWdsb2JhbCBsaW5rYWdlIGNvZGUuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZXhwbGljaXRseQotCWZvciBfcHRyZ2wsIGFuZCB0cmVhdCBpdCBhcyBnbG9iYWwgbGlua2FnZSBjb2RlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTm90aWNlIGlmIHdlIGZpbmQgYQotCWZpbGVuYW1lIG9yIE5fU08gc3ltYm9sIHBhc3QgdGhlIG9mZnNldCwgYW5kIHVzZSBpdCB0byBpbmRpY2F0ZQotCXRoYXQgdGhlcmUgaXMgbm8gbGluZSBudW1iZXIgb3IgZnVuY3Rpb24gd2hlbiBhcHByb3ByaWF0ZS4KLQotVHVlIEp1biAxMSAxNToyNDo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBTZXQgWENPRkZfREVGX1JFR1VMQVIgZm9yIGEKLQljb21tb24gc3ltYm9sIGRlZmluZWQgYnkgdGhlIGxpbmtlci4gIERvbid0IGV4cG9ydCBmdW5jdGlvbiBjb2RlCi0JZXZlbiBpZiBleHBvcnRfZGVmaW5lZHMgaXMgc2V0LgotCi1Nb24gSnVuIDEwIDExOjU3OjI3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFkZCBuZXcgZW50cmllcyBmb3IgUl9CQ0NfSU5WCi0JYW5kIFJfSk1QX0RFTC4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9CQ0NfSU5WIGFuZCBSX0pNUF9ERUwuCi0JKGg4MzAwX3N5bWJvbF9hZGRyZXNzX3ApOiBOZXcgZnVuY3Rpb24uCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBFbGltaW5hdGUganVtcHMgbWFkZSB1bm5lY2Vzc2FyeSBieQotCXJlbGF4aW5nLgotCi1TdW4gSnVuICA5IDE2OjMwOjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRml4IG1hbnkgbWlub3Igc3BhY2luZwotCXByb2JsZW1zLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlcyBSX0pNUDEsIFJfSk1QMik6IEFkanVzdCAiZG90IgotCWNvcnJlY3RseSBmb3IgdGhlIHR3byB2YXJpYW50cy4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQKLQlpcyAxMjggYnl0ZXMgYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlIFJfUENSV09SRCk6IENvcnJlY3RseSBhZGp1c3QKLQkiZG90IiBhbmQgInZhbHVlIi4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQgaXMgMTI4IGJ5dGVzCi0JYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBLZWVwIHJlbGF4aW5nCi0JdGhlIGdpdmVuIHNlY3Rpb24gdW50aWwgbm90aGluZyBjaGFuZ2VzLgotCi1UaHUgSnVuICA2IDE1OjI0OjQ1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBSZW1vdmUgdGhlIF9QREFUQQotIAlhbGlnbm1lbnQgaGFjay0td2UgY2FuIGdldCB0aGUgbG5ub3B0ciBpbmZvIGFub3RoZXIgd2F5IHdpdGhvdXQKLSAJc3VkZGVubHkgaW5jcmVhc2luZyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gIFNldCB0aGUgZmxhZ3MgZm9yCi0JdGhlIF9QREFUQSBzZWN0aW9uLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEbyBzby4KLQotVGh1IEp1biAgNiAxMToyNDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBQdXQgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUKLQl0byBrZWVwIHRoZSBIUCBlbXVsYXRvciBkYXRhYmFzZSBoYXBweS4KLQotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHBvd2VycGMtKi1saW51eCogYW5kIHBvd2VycGNsZS0qLWxpbnV4Ki4KLQlGcm9tIEtldmluIEJ1ZXR0bmVyIDxrZXZAcHJpbWVuZXQuY29tPi4KLQotV2VkIEp1biAgNSAxNToxNjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgdHJ5IHRvIHByaW50IHRoZQotCW5hbWUgb2YgYSBOVUxMIHNlY3Rpb24uCi0KLVR1ZSBKdW4gIDQgMTg6NTM6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZiBub3RpY2VfYWxsIGlzCi0Jc2V0LCBhbHdheXMgY2FsbCB0aGUgbm90aWNlIGNhbGxiYWNrLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLU1vbiBKdW4gIDMgMTE6MDE6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IFNldCB0byA0LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGRpZmZlcmVudGx5IHNpemVkCi0JdHJhaWxpbmcgYWxpZ25tZW50IHJlbG9jLgotCi0JKiBiZmQtaW4uaDogVXNlICNlcnJvciBpZiBCRkRfSE9TVF82NF9CSVQgY2FuIG5vdCBiZSBkZWZpbmVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBXYXJuIGlmIHRoZXJlIGlzIG5vIGtub3duIDY0IGJpdCB0eXBlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwcGNib290Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwcGNib290LmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBjLgotCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlci5mb2dlbHN0cm9tQG1haWxib3gyMDAuc3dpcG5ldC5zZT4uCi0KLVNhdCBKdW4gIDEgMjE6NDk6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IE1vdmUgZnJvbSBoZXJlLi4uCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IC4uLnRvIGhlcmUuCi0KLUZyaSBNYXkgMzEgMTM6NTE6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEltcHJvdmUgcmVsb2Mgc3BlY2lhbF9mdW5jdGlvbnMgYW5kIGhhbmRsaW5nIG9mCi0JU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2hpMTZfcmVsb2MgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfbG8xNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MKLQlhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShncHJlbDE2X3dpdGhfZ3ApOiBDaGVjayBob3d0by0+c3JjX21hc2sgYmVmb3JlIHVzaW5nIHZhbHVlIGluCi0JaW5zbi4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwzMl9yZWxvYwotCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGdwcmVsMzJfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgZmV0Y2hpbmcgdmFsdWUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogQWNjZXB0IC5NSVBTLm9wdGlvbnMgYXMgYSBuYW1lCi0JZm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogQ29uc2lkZXIgLk1JUFMub3B0aW9ucyB0byBiZSB0aGUKLQluYW1lIG9mIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNldCB0aGUgR1AgdmFsdWUgaW4gYQotCVNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCSogZWxmLWJmZC5oIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCi0JKiBjb2ZmLXc2NS5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmVuYW1lIFJfTU9WQlsxMl0gdG8KLQlSX01PVjE2QlsxMl0sIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL2ludGVybmFsLmguCi0KLVRodSBNYXkgMzAgMTI6Mzg6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydCBmb3IKLQl3cml0aW5nIGZpbGVzIGFuZCBmb3IgZ2FzLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19lbGZfb2JqZWN0X3AuCi0JKG1pcHNfZWxmMzJfb2JqZWN0X3ApOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9vYmplY3RfcDsgY2FsbAotCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZy4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZzsgY2FsbAotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KLQkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIGFzeW1ib2wgcmF0aGVyIHRoYW4KLQlzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5LgotCShfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbQotCWVsZmNvZGUuaDp2YWxpZGF0ZV9yZWxvYy4KLQkqIGVsZmNvZGUuaCAodmFsaWRhdGVfcmVsb2MpOiBSZW1vdmU7IG1vdmVkIGludG8gZWxmLmMgYW5kIHJlbmFtZWQKLQl0byBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEb24ndCBkZWZpbmUKLQlpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2JqZWN0X3ApOiBIYW5kbGUgRV9NSVBTX0FSQ0hfNC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCi1XZWQgTWF5IDI5IDE2OjE1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCTY0LWJpdCBNSVBTIEVMRiBBQkkgb2JqZHVtcCBzdXBwb3J0OgotCSogZWxmNjQtbWlwcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LW1pcHMuby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LW1pcHMuYy4KLQkqIGNvbmZpZy5iZmQgKG1pcHMqZWwtKi1lbGYqKSBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKG1pcHMqLSotZWxmKik6IExpa2V3aXNlLgotCSogY29uZmluZ3VyZS5pbjogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgdG8gdmVjdG9yIHN3aXRjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4gIENhbGwgbmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVwZGF0ZSBuYW1lIG9mIHJlbmFtZWQgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgb2YKLQl3cml0ZV9vdXRfcGhkcnMgdG8gYmUgY29uc3QuICBMaWtld2lzZSBmb3Igc2Vjb25kIHBhcmFtZXRlciBvZgotCXN3YXBfc3ltYm9sX291dC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHJlbF9oZHIyIGZpZWxkLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX291dF9waGRycyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGFzc2VydGlvbiByZXF1aXJpbmcKLQlTSFRfUkVML1NIVF9SRUxBIHRvIG1hdGNoIHVzZV9yZWxhX3AuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVsb2MKLQlzZWN0aW9uIGZvciB0aGUgc2VjdGlvbiwgYWRkIHRoZSBuZXcgb25lIHRvIHJlbF9oZHIyLiAgSW5jcmVtZW50Ci0JcmVsb2NfY291bnQgcmF0aGVyIHRoYW4gc2V0dGluZyBpdC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCVJlbW92ZSBzdGF0aWMgZGVjbGFyYXRpb24uCi0JKGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogRGVjbGFyZS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfc2hkcl9vdXQpOiBEZWNsYXJlLgotCShlbGZfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoZWxmX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9laGRyX2luLCBlbGZfc3dhcF9laGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9waGRyX2luLCBlbGZfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY19pbiwgZWxmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbiwgZWxmX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogUmVuYW1lIGZyb20gd3JpdGVfb3V0X3BoZHJzLiAgQ2hhbmdlIHNlY29uZAotCXBhcmFtZXRlciB0byBiZSBjb25zdC4gIE1ha2Ugbm9uLXN0YXRpYy4KLQkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogUmVuYW1lIGZyb20gd3JpdGVfc2hkcnNfYW5kX2VoZHIuCi0JTWFrZSBub24tc3RhdGljLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBub24tc3RhdGljLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBVcGRhdGUgbmFtZXMgb2YgcmVuYW1lZCBmdW5jdGlvbnMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX3NpemVfaW5mbyk6IExpa2V3aXNlLgotCShlbGZOTl9iZWQpOiBVc2UgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYmlnbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGlmIEJGRDY0IGlzIGRlZmluZWQuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQWRkIGNhc3QgdG8gZnByaW50ZiBhcmd1bWVudC4KLQotVHVlIE1heSAyOCAxMTo0MjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5zZXJ0IG5vcCBpbnN0cnVjdGlvbnMsIG5vdAotCXplcm9lcywgaW4gYWxpZ25tZW50IGhvbGVzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTWFrZSByb29tIGZvciB0aGUKLQlwb3RlbnRpYWwgbGVhZGluZyB1bmRlcnNjb3JlIGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgotCi1GcmkgTWF5IDI0IDE0OjI4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IHB1dCBzbWFsbCBjb21tb24KLQlzeW1ib2xzIGludG8gLnNic3MgaWYgdGhpcyBpcyBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBNYXkgMjMgMTI6MjY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFdhcm4gYWJvdXQKLQl1bmRlZmluZWQgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLUZyaSBNYXkgMTcgMTM6NTQ6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IEFkZCBhIGJ1bmNoIG9mIG5ldyBjb2RlIGFuZCBzdGF0aWMgY29uc3QgYXJyYXlzIHRvCi0Jc3VwcG9ydCBhbGlnbmluZyBsb2FkcyBhbmQgc3RvcmVzIG9uIGZvdXIgYnl0ZSBtZW1vcnkgYm91bmRhcmllcy4KLQlBbHNvOgotCShzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBlbnRyaWVzIGZvciBSX1NIX0NPREUsIFJfU0hfREFUQSBhbmQKLQlSX1NIX0xBQkVMLgotCShzaF9yZWxheF9zZWN0aW9uKTogTG9vayBmb3IgUl9TSF9DT0RFIHJlbG9jcy4gIElmIHdlIGZpbmQgb25lLAotCWNhbGwgc2hfYWxpZ25fbG9hZHMuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IG1hcmsgUl9TSF9DT0RFIG9yIFJfU0hfREFUQSByZWxvY3MKLQlhcyB1bnVzZWQuCi0KLVRodSBNYXkgMTYgMTY6MzQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjYWNoZS5jIChiZmRfb3Blbl9maWxlKTogVW5saW5rIHRoZSBmaWxlIGJlZm9yZSBvcGVuaW5nIGl0IGZvcgotCXdyaXRlLiAgRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogU2V0IG9wZW5lZF9vbmNlLgotCi1UdWUgTWF5IDE0IDEyOjM1OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGV4dGVybmFsX3JlbG9jcyBjYWNoZSBhZnRlcgotCWZyZWVpbmcgaXQuCi0KLQkqIGxpYmJmZC5jOiBSZW1vdmUgI2lmZGVmIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVgsIGFuZCBjb21waWxlCi0JdGhlIGNvZGUgdW5jb25kaXRpb25hbGx5LgotCi1Nb24gTWF5IDEzIDE5OjUxOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUgc3RydWN0dXJlLgotCShwZWlfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc3RvcmUgc19wYWRkciBmaWVsZCBpbiBwZWlfc2VjdGlvbl9kYXRhLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlcgotCXRoYW4gX2Nvb2tlZF9zaXplLCBhbmQgZG9uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHZhbHVlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfT0JKX1dJVEhfUEUsIHNldCBzX3BhZGRyIHRvCi0JMC4gIElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8gcGVpX3NlY3Rpb25fZGF0YS4KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IERlZmluZSBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLSAJKHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQotV2VkIE1heSAgOCAxNjoxMDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zZXRfYXJjaF9tYWNoKTogV3JpdGUgYXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhCi0JbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBhbiBhcmNoaXZlIGhhcwotCW5vIG1hcCwganVzdCBjaGVjayBlYWNoIG1lbWJlciBpbiB0dXJuIHRvIHNlZSB3aGV0aGVyIGl0IGlzCi0JcmVxdWlyZWQuCi0KLVdlZCBNYXkgIDggMDk6MTc6MzQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfb2JqZWN0X3ApOiBDaGVjayBmb3IgdHlwZSAweDQxIGluIHBhcnRpdGlvbgotCXRhYmxlLiAgQ2FsbCBCRkRfQVNTRVJUIHRvIHZhbGlkYXRlIGhlYWRlciBzaXplLCBpbnN0ZWFkIG9mCi0JY2FsbGluZyBmYXRhbC4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFB1dCBxdW90ZXMgYXJvdW5kIHBhcnRpdGlvbgotCW5hbWUuCi0KLVR1ZSBNYXkgIDcgMTY6MTA6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmM6IE5ldyB0YXJnZXQgZm9yIGxvb2tpbmcgYXQgUFBDYnVnIGJvb3QgcmVjb3Jkcy4KLQotCSogY29uZmlne3VyZS5pbiwuYmZkfTogQWRkIHN1cHBvcnQgZm9yIHBwY2Jvb3QgdGFyZ2V0LgotCSogdGFyZ2V0cy5jOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE1heSAgNyAxMToxNToxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggcmVjZW50Ci0JY2hhbmdlcyB0byBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaC4gIEZpeCBtaW5vciBlcnJvcnMgaW4gdGhlCi0JZXhpc3RpbmcgcmVsb2NzLiAgQWRkIFJfTU9WTDEgYW5kIFJfTU9WTDIuCi0JKHJ0eXBlMmhvd3RvKTogU2ltaWxhcmx5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmV3cml0ZSB0byBzaW1wbGlmeSwgZml4IGJ1Z3MgaW4gdGhlCi0JZXhpc3RpbmcgcmVsYXhpbmcgY29kZSAgYW5kIHBlZm9ybSBtb3JlIHJlbGF4aW5nLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgIDYgMTg6MjQ6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogSGFuZGxlIGNvbW1vbgotCXN5bWJvbHMgY29ycmVjdGx5LgotCi1TYXQgTWF5ICA0IDA1OjA4OjQ1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgUmVqZWN0IGdlbmVyaWMgRUxGIHRhcmdldCBpZgotCWVfbWFjaGluZSBtYXRjaGVzIGFuIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUgaW4gYSBzcGVjaWZpYyBiYWNrZW5kLgotCi0JKiBuZXRic2QtY29yZS5jIChuZXRic2RfY29yZV92ZWMpOiAgUmVtb3ZlIGluaXRpYWxpemVyIGZvcgotCW9ic29sZXRlIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIE1heSAgMyAxMzowNzozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZCBob3d0byBlbnRyeSBmb3IKLQlSX1BDUldPUkRfQi4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jXzE2X2VzdGltYXRlKTogTGlrZXdpc2UuICBUcnkgdG8gdHVybiBhIDE2Yml0Ci0JcGMtcmVsYXRpdmUgYnJhbmNoIChSX1BDUldPUkQpIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZQotCWJyYW5jaCAoUl9QQ1dPUkRfQikuCi0KLUZyaSBNYXkgIDMgMTA6NDc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IHRoZSBzZWN0aW9uIGZvcgotCUJTRl9DT05TVFJVQ1RPUiBzeW1ib2xzLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBDb3JyZWN0IHNldHRpbmcgb2YKLQlsYXN0X2JmX2luZGV4LgotCi1XZWQgTWF5ICAxIDE4OjM5OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW4gY29tZGF0IHNlY3Rpb24gbG9va3VwLAotCXN0b3AgbG9va2luZyB3aGVuIHNlY3Rpb24gaXMgZm91bmQuCi0KLVdlZCBNYXkgIDEgMTQ6MTc6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChTVFJJTkdfU0laRV9TSVpFKTogRGVmaW5lLgotCShzdHlwX3RvX3NlY19mbGFncyk6IEhhbmRsZSBsb25nIHN5bWJvbCBuYW1lcyB3aGVuIGxvb2tpbmcgZm9yIHRoZQotCXNlY3Rpb24gc3ltYm9sLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyBmaWVsZC4KLQkoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKTogRGVmaW5lLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEhhbmRsZSBsb25nIHNlY3Rpb24KLQluYW1lcy4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1hcm0uYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1pMzg2LmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktcHBjLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogU2V0IGxtYSBvZiBzZWN0aW9ucy4KLQkoYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFJlbmFtZSBpbl9hYmZkCi0JcGFyYW1ldGVyIHRvIG91dHB1dF9iZmQuICBVc2VkIGlucHV0X2JmZCBpbnN0ZWFkIG9mIG91dHB1dF9iZmQgaW4KLQlzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAzMCAxNzo1NjozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBjcmVhdGUKLQlTRUNfQ09OU1RSVUNUT1Igc2VjdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IGVsZl9ncC4KLQlGcm9tIERvbiBCb3dtYW4gPGJvd21hbkB3YXRlcmxvby5ocC5jb20+LgotCi1UdWUgQXByIDMwIDE3OjA2OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfbGl0dGxlX3ZlYyk6IElmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLCBhZGQKLQlTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTIHRvIHNlY3Rpb25fZmxhZ3MuCi0KLU1vbiBBcHIgMjkgMTM6MTU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKLQltaXBzXzMyX3JlbG9jcyBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1pcHNfMzJfcmVsb2NzIGZpZWxkLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29weSBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMgotCXJlbG9jcyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlmaWxlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBGb3IgYSBSX01JUFNfUkVMMzIgb3IgUl9NSVBTXzMyIHJlbG9jCi0JYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGluY3JlbWVudCBtaXBzXzMyX3JlbG9jcy4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgbWlwc18zMl9yZWxvY3MgaXMgc2V0LCBhbmQKLQl0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBtYWtlIHJvb20gaW4gdGhlCi0JLnJlbC5keW4gc2VjdGlvbi4KLQotRnJpIEFwciAyNiAxODowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRyYWNrIHRoZSByZWFsCi0JZmlsZSBwb3NpdGlvbiBhbmQgdGhlIHZpcnR1YWwgZmlsZSBwb3NpdGlvbiBzZXBhcmF0ZWx5LiAgU2V0Ci0JZmlsZXBvcyBpbmZvcm1hdGlvbiBic2FlZCBvbiB0aGUgcmVhbCBmaWxlIHBvc2l0aW9uLgotCShfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSGFuZGxlIC5saWIgc2VjdGlvbnMgbGlrZSB0aGUKLQlKYW4gMjMgY2hhbmdlIHRvIGNvZmZjb2RlLmguCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzeW1ib2wgY291bnQgdG8gdGhlCi0JbnVtYmVyIG9mIEJGRCBzeW1ib2xzIGNyZWF0ZWQuCi0KLUZyaSBBcHIgMjYgMTI6MzQ6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBGb3J3YXJkIHJlbG9jYXRpb25zIHRvIHRoZQotCW91dHB1dCBmaWxlIGlmIGxpbmtpbmcgc2hhcmVkIG9iamVjdHMuICBMb29wIHRvIGNoZWNrIGFsbCByZWxvY3MsCi0JcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGZhbHNlIG9uIGZpcnN0IGVycm9yLgotCi1UaHUgQXByIDI1IDEzOjI1OjEyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogQWRkIFBMVCBjYXNlLgotCShwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogSWYgLmludGVycCBzZWN0aW9uLCBidW1wICMKLQlvZiBwcm9ncmFtIGhlYWRlcnMgYnkgMS4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBGbGVzaCBvdXQgc3VwcG9ydC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IgLnBsdCBzZWN0aW9uLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFByaW50IG91dCBmaWxlbmFtZSBpbiBkZWJ1ZyBjb2RlLiAgRW5hYmxlCi0JUExUIHN1cHBvcnQuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWRkIHN1cHBvcnQgZm9yIFBMVCdzLCBiZWVmIHVwCi0JZGVidWcgb3V0cHV0LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiB0aGUgb3V0cHV0IHNlY3Rpb24gaXNuJ3QgZGVmaW5lZCwKLQlkb24ndCBhYm9ydCwganVzdCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgc2VjdGlvbgotCWJlaW5nIGNyZWF0ZWQgaXMgLnNkYXRhIG9yIC5zZGF0YTIsIGRvbid0IG1ha2UgdGhlIHN5bWJvbCBkeW5hbWljLgotCi1XZWQgQXByIDI0IDE0OjA0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMb29rIHRocm91Z2ggdGhlCi0JbWVtYmVycyBvZiBhbiBhcmNoaXZlIGZvciBkeW5hbWljIG9iamVjdHMgd2l0aCBubyBzeW1ib2xzLCBhbmQKLQlwYXNzIHRoZW0gZGlyZWN0bHkgdG8gY2hlY2tfYXJjaGl2ZV9lbGVtZW50LgotCSh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBQYXNzIGR5bmFtaWMgb2JqZWN0cyB0bwotCXhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzLgotCSh4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogQ2hhbmdlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLQlmcm9tIF9iZmRfbm9keW5hbWljIHRvIF9iZmRfeGNvZmYuCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9zd2FwX2xkcmVsX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX2R5bmFtaWNfcmVsb2MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBVc2UgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMuCi0KLVR1ZSBBcHIgMjMgMTI6NDg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiBSZXR1cm4gYmZkX3JlbG9jX29rIGV2ZW4KLQlpZiByZWxvY19lbnRyeS0+YWRkZW5kIGlzIG5vdCAwLgotCShDQUxDX0FEREVORCk6IEp1c3Qgc2V0IHRoZSBhZGRlbmQgdG8gcmVsb2Mucl9vZmZzZXQuCi0KLU1vbiBBcHIgMjIgMTg6Mjk6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBGaXggc3BlbGxpbmcgb2YKLQlSX1NQQVJDX0dMT0JfSk1QLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQlBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCShzcGFyY19yZWxvY19tYXApOiBBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCi1Nb24gQXByIDIyIDE1OjA3OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU9wdGltaXplIGxpbmtpbmcgb2Ygc3RhYnMgaW4gc2VjdGlvbnMgYXMgdXNlZCBpbiBFTEYgYW5kIENPRkYuCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUKLQlzdGFiX2luZm8gZmllbGQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgaWYKLQlhcHByb3ByaWF0ZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MKLQloYXNoIHRhYmxlLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIHN0YWJfaW5mbwotCWZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhcHByb3ByaWF0ZSwgY2FsbAotCV9iZmRfbGlua19zZWN0aW9uX3N0YWJzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiByZWxvYy5jIChfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGVjayBhZGRyZXNzIGFnYWluc3QKLQlfcmF3X3NpemUgcmF0aGVyIHRoYW4gX2Nvb2tlZF9zaXplLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBzdGFicy5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFicy5jLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ29ycmVjdCBoYW5kbGluZyBvZgotCUJTRl9OT1RfQVRfRU5EIGNvbW1vbiBzeW1ib2xzLgotCi1GcmkgQXByIDE5IDE5OjIxOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocmVjb3JkX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQkocHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW5yZWFjaGVkIGNvZGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfcHJpbnRfZWRhdGEpOiBMaWtld2lzZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCi1UaHUgQXByIDE4IDE4OjUxOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgbGFzdF9iZl9pbmRleAotCWFuZCBsYXN0X2JmIGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogTGlrZXdpc2UuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04gc3ltYm9scy4KLQlGaXggdXAgLmJmIGVuZG5keCBsaW5rIGZpZWxkcy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQotV2VkIEFwciAxNyAxMjowODoyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBleyxpfS1wcGMuYyAoUFBDX1BFKTogRGVmaW5lIGluc3RlYWQgb2YgUFBDLCBzbyB0aGF0IGNvbXBpbGluZwotCW9uIFNvbGFyaXMgUG93ZXJQQyBzeXN0ZW1zIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkLgotCi0JKiBjY2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgUFBDX1BFLCBub3QKLQkjaWZkZWYgUFBDLgotCi0JKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cywgYmZkX2ZwcmVnc2V0KTogQWRkIHRocmVhZCBhcmd1bWVudC4KLQkoZWxmX2NvcmVmaWxlX25vdGUpOiBJZiBIQVZFX1NZU19QUk9DRlNfSCBpcyBub3QgZGVmaW5lZCwgZG9uJ3QKLQl1cGRhdGUgZGlkX3JlZyBhbmQgZGlkX3JlZzIuCi0KLVdlZCBBcHIgMTcgMTM6MDc6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgVE9DIG92ZXJmbG93LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNhbGxpbmcgdGhlCi0JY2FsbGJhY2sgcm91dGluZXMsIHBhc3MgaC0+cm9vdC5zdHJpbmcgcmF0aGVyIHRoYW4gbmFtZSwgaW4gY2FzZQotCWNvcHkgaXMgdHJ1ZSBhbmQgbmFtZSBpcyB0cmFuc2llbnQuCi0KLVR1ZSBBcHIgMTYgMTY6MzY6MzggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBlbGZjb3JlLmg6ICBBZGQgc3VwcG9ydCBmb3IgY29yZSBmaWxlcyB3aXRoIG11bHRpcGxlIHRocmVhZHMuCi0JKFByaW1hcmlseSBmb3IgU29sYXJpcy4pCi0KLVR1ZSBBcHIgMTYgMTM6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYKLQlzZWN0aW9uLT5vcmVsb2NhdGlvbiBpcyBOVUxMLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX2dldF9zeW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IERlY2xhcmUuCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gQXByIDE1IDE5OjA2OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19oaTE2KTogRGVmaW5lLgotCShtaXBzX2hpMTZfYWRkciwgbWlwc19oaTE2X2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19oaTE2X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX2VsZl9oaTE2X3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBISTE2IHJlbG9jcy4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IFByb2Nlc3MgbWlwc19oaTE2X2xpc3QuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2Ci0JcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBMTzE2IHJlbG9jLgotCi1XZWQgQXByIDEwIDAwOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IENoZWNrIGJmZF9hbGxvYyByZXR1cm4gdmFsdWUuCi0JKHZlcnNhZG9zX29iamVjdF9wKTogQ2hlY2sgYWxsIGJmZF9yZWFkIHJldHVybiB2YWx1ZXMuICBSZXF1aXJlCi0JdGhhdCBsYW5nIGZpZWxkIGJlIGxlc3MgdGhhbiAxMCwgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggSW50ZWwgSGV4Ci0JZmlsZXMuCi0KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFdyaXRlIG91dCB0aGUgcmVsb2NzIGV2ZW4gaWYgdGhlcmUKLQlhcmVuJ3QgYW55IHN5bWJvbHMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IFNldCByX2luZGV4IHRvIE5fQUJTLAotCW5vdCAwLCBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFjY2VwdCBhIGxlbmd0aCBvZiA0IGZvciByZWNvcmQgdHlwZSA1LgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZvciBhIGxhcmdlIHN0YXJ0IGFkZHJlc3MsIG91dHB1dAotCXRoZSBmdWxsIDMyIGJpdCBhZGRyZXNzIGluIHJlY29yZCB0eXBlIDUuCi0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9ieXRlKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBiZmRfYnl0ZQotCXRvIGludCB0byBhdm9pZCBwcm9tb3Rpb24gcHJvYmxlbXMgaW4gcHJvdG90eXBlLgotCi1UdWUgQXByICA5IDExOjQ0OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke3NyY2Rpcn0gd2hlbiBsb29raW5nIGZvciBwaWNmcmFnLgotCi0JKiBjb25maWd1cmUuaG9zdDogU3dpdGNoIG9uICR7bGliZGlyfSwgbm90ICQobGliZGlyKS4gIEZyb20KLQlhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdSAoQWxhbiBNb2RyYSkuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBjYWxsIGFkZF9keW5hbWljX3N5bWJvbHMKLQllbnRyeSBwb2ludCwgbm90IGp1c3QgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBBbHdheXMgY2FsbAotCXN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgSWYgY2FsbGVkIHdpdGggYSBub24gRFlOQU1JQwotCW9iamVjdCwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZS4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCi1Nb24gQXByICA4IDEyOjA5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1MgYW5kIFNITElCX0NGTEFHUyBmb3IgKi1kZWMtb3NmKgotCWhvc3Qgd2hlbiBjb25maWd1cmluZyB3aXRoIC0tZW5hYmxlLXNoYXJkLgotCi1GcmkgQXByICA1IDEyOjI0OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGlbMzQ1XTg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBGb3IgV0FSTl9ST1cvd2FybiwgdXNlIE1XQVJOLCBub3QgQ1lDTEUsCi0JdG8gYXZvaWQgY3Jhc2hpbmcgaW4gYmZkX2hhc2hfcmVwbGFjZS4KLQotCSogc3lzZGVwLmg6IFVzZSAjaWZkZWYsIG5vdCAjaWYuCi0KLVRodSBBcHIgIDQgMjM6MzI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLVRodSBBcHIgIDQgMTg6NDk6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zb255LWJzZCopOiBGaXggdHlwbyBpbiBBQ19ERUZJTkUuCi0JKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaAotCShBQ19IRUFERVJfVElNRSk6IEFkZCBtYWNyby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBVc2UgVElNRV9XSVRIX1NZU19USU1FIGFuZCBIQVZFX1NZU19USU1FX0gKLQl0byBjb250cm9sIHdoYXQgY29tYmluYXRpb24gb2YgPHRpbWU+IGFuZCA8c3lzL3RpbWUuaD4KLQlnZXQgaW5jbHVkZWQuCi0KLVR1ZSBBcHIgIDIgMTM6MTE6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKHN1bm9zXzMyX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgTV9TUEFSQ0xFVC4KLQkoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEhhbmRsZQotCWJmZF9tYWNoX3NwYXJjX3tzcGFyY2xldCxzcGFyY2xpdGV9LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0pOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBVcGRhdGUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBlbnRyaWVzIGZvciBzcGFyY2xldCxzcGFyY2xpdGUuCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQWRkIE1fU1BBUkNMRVQuCi0JKiBzdW5vcy5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBBcHIgIDIgMDA6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGhnb3QgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIGhnb3QgZmllbGQuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFN0b3JlIHRoZQotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSBoZ290IGZpZWxkLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgdGhlIHNpemUgb2YgdGhlCi0JZ2xvYmFsIG9mZnNldCB0YWJsZSBnb2VzIG92ZXIgMHgxMDAwLCBzZXQgdGhlIHZhbHVlIG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIDB4MTAwMCBpbnRvIHRoZSBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogU3VidHJhY3QgdGhlIG9mZnNldCBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB3aGVuIGhhbmRsaW5nIEdPVCByZWxvY2F0aW9ucy4KLQotCSogZWxmY29kZS5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uCi0KLU1vbiBBcHIgIDEgMTA6Mzk6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lZCBmcm9tCi0JZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKiBnZW5saW5rLmggKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmF0aW9uCi0JbW92ZWQgaGVyZSBmcm9tIGxpYmJmZC1pbi5oLgotCSogbGliYmZkLWluLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEFwciAgMSAxMjozNTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gcmVwb3J0aW5nIGFuCi0Jb3ZlcmZsb3cgZXJyb3IsIHVzZSB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGlmCi0JYXZhaWxhYmxlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBjb21tb24gc3ltYm9sIGdvdAotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHNldCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSLgotCi1TdW4gTWFyIDMxIDAxOjU4OjQxIDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGVsZXRlIHRlc3QgZm9yIC5qdW5rLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyOSAxMjo0NDozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX0xJTktfT05DRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFUyk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4KLQlTRUNfTElOS19PTkNFIGludG8gSU1BR0VfU0NOX0xOS19DT01EQVQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9XSVRIX1BFLCB0dXJuIElNQUdFX1NDTl9MTktfUkVNT1ZFCi0JaW50byBTRUNfRVhDTFVERS4gIElmIElNQUdFX1NDTl9MTktfQ09NREFUIGlzIHNldCwgc2V0Ci0JU0VDX0xJTktfT05DRSwgYW5kIGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgc2V0dGluZwotCWZvciBTRUNfTElOS19EVVBMSUNBVEVTLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfV0lUSF9QRSwgaWYgU0VDX0xJTktfT05DRSBpcwotCXNldCBmb3IgYSBzZWN0aW9uLCBmaW5kIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLAotCWFuZCBzZXQgdGhlIGF1eCBlbnRyeSBiYXNlZCBvbiBTRUNfTElOS19EVVBMSUNBVEVTLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCBhIHNwYWNlIGJlZm9yZSAiY2hlY2tzdW0iLgotCSogY29mZi1hcm0uYyAoYXJtY29mZl9iaWdfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAotCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGNvZmYtcHBjLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IExpa2V3aXNlLgotCi0JKiBWRVJTSU9OOiBCdW1wIHRvIDIuNi4xLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBWRVJTSU9OLgotCi1UaHUgTWFyIDI4IDIzOjQ4OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2xpbmtfaGFzaF9jcmVhdGUpOiBBbGxvdyBzcGVjaWZpYyB0YXJnZXRzCi0JdG8gb3ZlcnJpZGUuCi0JKiBjb2ZmLWg4MzAwLmM6IEFkZCB0d28gZGVyaXZlZCBoYXNoIHRhYmxlcyBhbmQgdGhlaXIgYXNzb2NpYXRlZAotCWZ1bnRpb25zIGFuZCAjZGVmaW5lcyBmb3IgdXNlIGJ5IHRoZSBoODMwMCBsaW5rZXIuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNhc2UgUl9NRU1fSU5ESVJFQ1QpOiBDcmVhdGUgZW50cmllcyBpbgotCXRoZSBmdW5jdGlvbiB2ZWN0b3IgYXMgbmVlZGVkLiAgUGxhY2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uCi0JdmVjdG9yIGVudHJ5IGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIFJfTUVNX0lORElSRUNUIHJlbG9jLgotCVJld3JpdGUgdGhlIHZlY3RvcnMgc2VjdGlvbiBjb250ZW50cyBhcyBuZWNlc3NhcnkuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIGZvciB0aGUgaDgzMDAgbGlua2VyLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lIHRvIHVzZSBoODMwMCBzcGVjaWZpYyB2ZXJzaW9uLgotCShjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjggMTc6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJocHBhLmg6IElmIGdjYyAyLjcgb3IgaGlnaGVyLCBkZWNsYXJlIGFsbCB0aGUgZnVuY3Rpb25zIHdpdGgKLQlfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpIHNvIHRoYXQgLVdhbGwgZG9lc24ndCB3YXJuIGFib3V0Ci0JdGhlbS4KLQkoaHBwYV9yZWJ1aWxkX2luc24pOiBQYXNzIHBvaW50ZXIgdG8gY29ycmVjdCB0eXBlIHRvCi0JbG93X3NpZ25fdW5leHQgYW5kIGRpc19hc3NlbWJsZV8yMS4KLQotVGh1IE1hciAyOCAxMTowMDozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LXtzeXN2NCosc29sYXJpczIqfSk6IERlbGV0ZS4KLQlTdGljayB3aXRoIHNwYXJjLSote3N5c3Y0Kixzb2xhcmlzMip9LgotCi1XZWQgTWFyIDI3IDEwOjQzOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCBpbiBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogU3dhcCBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFplcm8gb3V0IGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBJZiBhbnkgb2YgdGhlIGV4dHJhIFBFIHhfc2NuCi0JZmllbGRzIGlzIG5vbi16ZXJvLCBwcmludCB0aGVtLgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IElmZGVmIG91dC4gIFJlbW92ZWQgdW51c2VkCi0JdmFyaWFibGVzLgotCShwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFIGlmZGVmLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSWZkZWYgb3V0LgotCShwZV9wcGNfcmVsb2MpOiBJZmRlZiBvdXQuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZQotCWZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4gIFB1dCBiZWZvcmVfYWRkciBpbgotCURFQlVHX1JFTE9DIGlmZGVmLgotCShkdW1wX3RvYyk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgQWx3YXlzCi0JcmV0dXJuIGEgdmFsdWUuCi0JKHBwY19yZWZsb19yZWxvYyk6IElmZGVmIG91dC4KLQkocHBjX2FkZHIzMm5iX3JlbG9jKTogSWZkZWYgb3V0LgotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcwotCWNvcnJlc3BvbmQuCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IE1vdmUgb3RoZXJ3aXNlIHVudXNlZCB2YXJpYWJsZXMgaW50bwotCXRoZSAjaWZkZWYgd2hlcmUgdGhleSBhcmUgdXNlZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfZWRhdGEpOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMKLQljb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9wZGF0YSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGFkZHJfdmFsdWUuICBBbHdheXMKLQlyZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG9uYWxpbmUuICBNYWtlIGZwcmludGYKLQlzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogUmV0dXJuIHRydWUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTW92ZSBkZWZpbml0aW9uIG9mIHVudXNlZAotCXZhcmlhYmxlIHJlbGEgaW5zaWRlICNpZiAwIHNlY3Rpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQotCSogbnMzMmsuaDogTmV3IGZpbGUuCi0JKiBjcHUtbnMzMmsuaDogSW5jbHVkZSBuczMyay5oLiAgUmVuYW1lIGV4dGVybmFsbHkgdmlzaWJsZQotCWZ1bmN0aW9ucyB0byBzdGFydCB3aXRoIF9iZmRfLgotCSogYW91dC1uczMyay5jOiBJbmNsdWRlIG5zMzJrLmguICBDaGFuZ2UgcmVmZXJlbmNlcyB0byByZW5hbWVkCi0JZnVuY3Rpb25zIGluIGNwdS1uczMyay5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgbnMzMmsuaC4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogQWRkIGxpbmtlcl9tYXJrIGZpZWxkLiAgQ2hhbmdlCi0JdXNlcl9zZXRfdm1hIGFuZCByZWxvY19kb25lIHRvIGJlIHNpbmdsZSBiaXQgZmllbGRzLgotCShTVERfU0VDVElPTik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbgotCXRoZSBsaW5rLgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQKLQlpbiB0aGUgbGluay4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEluY2x1ZGUgc2VjdGlvbiBuYW1lIGluCi0Jb3ZlcmZsb3cgZXJyb3IgbWVzc2FnZXMuCi0KLVR1ZSBNYXIgMjYgMTU6NDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBJZiBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZQotCWlzIG5vdCBzZXQsIHByaW50ICJCRkQ6ICIgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KLQlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDIyIDEyOjE3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRml4IHNjYW4gZm9yIENfQklOQ0wvQ19FSU5DTAotCXN5bWJvbHMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBpZWVlX3ZlYyB0byB0YXJnX3NlbHZlY3MgZm9yIGk5NjAgdGFyZ2V0cyBhbmQKLQltNjhrLWFvdXQsIG02OGstY29mZiwgYW5kIG02OGstZWxmIHRhcmdldHMuCi0KLUZyaSBNYXIgMjIgMTE6MzM6NDQgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBnb29meS5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGllZWUuYzogQ2hhbmdlZCAjaWZkZWYgS0VFUE1JTlVTUENJTklOU1QgdG8gI2lmIEtFRVBNSU5VU1BDSU5JTlNULgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IFJlc3RydWN0dXJlZCB0byBwcmV2ZW50Ci0JaWVlZV9vYmplY3RfcCBmcm9tIGJlaW5nIGNhbGxlZCByZXBlYXRlZGx5LgotCi1UaHUgTWFyIDIxIDExOjAwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIEFsbG9jYXRlCi0JYnVmZmVycyBsYXJnZSBlbm91Z2ggZm9yIGFueSBGSUxFSERSIG9yIEFPVVRIRFIuCi0KLVRodSBNYXIgMjEgMTY6Mjg6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGxvb2t1cF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVuYW1lZCBhbmQKLQlzbGlnaGx5IGNoYW5nZWQgZnJvbSBvbGQgX2JmZF9lY29mZl9sb2NhdGVfbGluZS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IENhY2hlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgVXNlCi0JbG9va3VwX2xpbmUgZm9yIGFjdHVhbCBsb29rdXAuCi0KLVRodSBNYXIgMjEgMTQ6NTk6MTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogV2FybiBpZiB0aGUgLnBkYXRhIHNlY3Rpb24gaXMgbm90IGEKLQltdWx0aXBsZSBvZiAyMCBieXRlcy4KLQotVGh1IE1hciAyMSAxMzo1NDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyB0bwotCWFsbG9jYXRlIGVjb2ZmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGluaXRpYWxpemUgYnkgaGFuZC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyBmb3IKLQltaXBzX2VsZl9maW5kX2xpbmUsIGFuZCBkb24ndCBjYWxsIG1lbXNldC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBub3QKLQlwcm9kdWNpbmcgYSBmaW5hbCBleGVjdXRhYmxlLCBkb24ndCBjb25zaWRlciBzb2ZhciB3aGVuIGFsaWduaW5nCi0JdGhlIHNlY3Rpb24gdG8gdGhlIGNvcnJlY3Qgc2l6ZS4KLQotV2VkIE1hciAyMCAxNjo1MzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IElmZGVmIG91dC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjYWxsIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmZGVmIG91dC4KLQotTW9uIE1hciAxOCAxMjo1NDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IEluaXRpYWxpemUgZ3AgaWYKLQlvdXRwdXRfYmZkIGlzIG5vdCBOVUxMLgotCi1UaHUgTWFyIDE0IDE3OjEyOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2FsbCBiZmRfemFsbG9jIGluc3RlYWQKLQlvZiBiZmRfYWxsb2MgKGZpeGVzIGZpeF9saW5lIG5vdCBiZWluZyBpbml0aWFsaXplZCkuCi0JRGVsZXRlIHplcm9pbmcgb2YgZml4X3t2YWx1ZSx0YWcsZW5kLHNjbmxlbn0gZmllbGRzLgotCi1UaHUgTWFyIDE0IDE2OjA2OjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogQWxsb3cgc3BlY2lmaWMgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlCi0JYmZkX2xpbmtfYWRkX3N5bWJvbHMgcm91dGluZS4KLQotCSogY29mZi1oODMwMC5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoaG93dG9fdGFibGUpOiBBZGQgUl9NRU1fSU5ESVJFQ1QuCi0JKHJ0eXBlMmhvd3RvKTogU3VwcG9ydCBSX01FTV9JTkRJUkVDVC4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX01FTV9JTkRJUkVDVCBsaWtlIFJfUkVMQllURQotCWZvciBub3cuCi0KLVR1ZSBNYXIgMTIgMTI6NDE6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlCi0JaW5mby0+Y2FsbGJhY2tzX3dhcm5pbmcsIHJhdGhlciB0aGFuIF9iZmRfZXJyb3JfaGFuZGxlciwgZm9yCi0JIm11bHRpcGxlIGdwIiB3YXJuaW5nLgotCi1UdWUgTWFyIDEyIDEyOjEwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4gIFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2gKLQl0YWJsZSwgaWYgYW55LCB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLAotCWlmIGFueSwgd2hlbiByZXBvcnRpbmcgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZmRyX2luKTogSWYgRUNPRkZfNjQsIHR1cm4gMHhmZmZmZmZmZgotCWludG8gLTEgZm9yIGludGVybi0+cnNzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTI6Mjg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUuCi0JKGJmZF9nZXRfc3RhYl9uYW1lKTogUmVuYW1lIGZyb20gYW91dF9zdGFiX25hbWUuICBSZXdyaXRlIHRvIHVzZSBhCi0Jc3dpdGNoLgotCSogYmZkLWluLmggKGJmZF9nZXRfc3RhYl9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgc3RhYi1zeW1zLm8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFiLXN5bXMuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3RhYi1zeW1zLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSBzdGFiLXN5bXMuYy4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgbGlzdCBzdGFiLXN5bXMubyBpbiBiZmRfYmFja2VuZHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogQ2FsbCBiZmRfZ2V0X3N0YWJfbmFtZSwKLQlub3QgYW91dF9zdGFiX25hbWUuCi0KLUZyaSBNYXIgIDggMTE6MjY6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFkanVzdCBmaWxlIG9mZnNldAotCWZvciBzZWN0aW9uIGFsaWdubWVudCBldmVuIGlmIFNFQ19MT0FEIGlzIG5vdCBzZXQuCi0KLVR1ZSBNYXIgIDUgMTI6MDI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAotCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IElmIG5vdCBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwKLQlkb24ndCBmaWRkbGUgd2l0aCBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZS4KLQotTW9uIE1hciAgNCAxMjo0OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogVHJlYXQgdW5kZWZpbmVkIGltcG9ydGVkIHN5bWJvbHMgYXMKLQl0aG91Z2ggdGhleSBhcmUgZGVmaW5lZCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgbG9vayBhdCB0aGUgbGluZQotCW51bWJlcnMgZm9yIHRoZSBzZWN0aW9uIGlmIHNlY3Rpb24tPmxpbmVubyBpcyBOVUxMLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFByaW50IGEgdXNlZnVsIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiBjYWxsaW5nIEJGRF9BU1NFUlQuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCV9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wuCi0KLUZyaSBNYXIgIDEgMDk6NDI6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgU0VDX0xPQUQgZmxhZwotCWZvciAuc2JzcyBzZWN0aW9uLgotCi1XZWQgRmViIDI4IDExOjI1OjQ3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05MU0VMCi0JYW5kIFJfSFBQQV9OTFJTRUwuCi0JKGVfbnNlbCwgZV9ubHNlbCwgZV9ubHJzZWwpOiBVbmRlZmluZS4gIEFkZCB0bwotCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCi0JKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbmxzZWwsIGVfbmxyc2VsLiAgRml4IGVfbnNlbCBoYW5kbGluZy4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBOJywgTkwnIE5MUicgZmllbGQKLQlzZWxlY3RvcnMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBGaW5pc2ggaGFuZGxpbmcgb2YgUl9OMFNFTCBhbmQgUl9OMVNFTC4KLQotV2VkIEZlYiAyOCAxMTowMDoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IHRoZSBzZWdtZW50Ci0JbWVtb3J5IHNpemUgZm9yIHRoZSBhbGlnbm1lbnQgb2YgYSBTRUNfQUxMT0Mgc2VjdGlvbiwgbm90IGp1c3QgYQotCVNFQ19MT0FEIHNlY3Rpb24uCi0KLVR1ZSBGZWIgMjcgMTQ6MTc6MzEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGtsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGtsaW51eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1saW51eGFvdXQqLCBtNjgqLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1saW51eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGtsaW51eF92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrbGludXhfdmVjKTogRGVjbGFyZS4KLQkqIGkzODZsaW51eC5jIChiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW51eF9zaXplX2R5bm1pY19zZWN0aW9ucyB0byBhdm9pZCBjbGFzaCB3aXRoIG02OGtsaW51eC5jLgotCSogYmZkLWluLmggKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lCi0JZGVjbGFyYXRpb24gZnJvbSBiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIG02OGtsaW51eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgbTY4a2xpbnV4LmMuCi0KLVR1ZSBGZWIgMjcgMTE6MzE6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKHBhX2FyY2gpOiBBZGQgcGEyMC4KLQkoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogQWRkIFJfSFBQQV9OU0VMLgotCShlX25zZWwpOiBVbmRlZmluZS4gIEFkZCB0byBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LgotCShocHBhX2ZpZWxkX2FkanVzdCk6IEhhbmRsZSBlX25zZWwuCi0JKiBzb20uYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBtYW55IG5ldyByZWxvY3MgZm91bmQgb25seQotCWluIGhwdXgxMCBpbmNsdWRlIGZpbGVzLgotCShzb21fZml4dXBfZm9ybWF0cyk6IEFkZCBzZXZlcmFsIG5ldyByZWxvY3MgZnJvbSBocHV4MTAuCi0JKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIGhwdXgxMCByZWxvY3MuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9OMFNFTCBhbmQgUl9OMVNFTCBocHV4MTAgcmVsb2NzLgotCi1Nb24gRmViIDI2IDEyOjUyOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCByZWNlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCwgYW5kCi0JcnVsZXMgdG8gcmVidWlsZCAuaCBmaWxlcyB1c2luZyBkb2MvY2hldy4KLQotTW9uIEZlYiAyNiAxNDo0ODozOSAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBBWlN0YXJOZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGp1c3QgdGhlIGZpbGUKLQlzaXplIGV2ZW4gb2Ygc2VjdGlvbnMgd2l0aCBubyBjb250ZW50cy4KLQotTW9uIEZlYiAyNiAxNDowMToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFdoZW4gbWVyZ2luZywgc2tpcCBuYW1lcwotCXN0YXJ0aW5nIHdpdGggJyQnIHRoZSB3YXkgd2Ugc2tpcCBuYW1lcyBzdGFydGluZyB3aXRoICcuJy4gIFdoZW4KLQl1cGRhdGluZyB4X2VuZG5keCwgZG9uJ3QgYmUgZm9vbGVkIGJ5IGFuIGluZGV4IHdoaWNoIGhhcyBiZWVuCi0JbWVyZ2VkLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gb3B0aW1pemUgYQotCXN0cnVjdC91bmlvbi9lbnVtIHR5cGUgd2l0aCBubyBlbGVtZW50cy4KLQotU2F0IEZlYiAyNCAxMTozODo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZXJybXNnKTogSGFuZGxlIGEgTlVMTCByZXR1cm4gZnJvbSBzdHJlcnJvci4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQlhcmNoaXZlIGNhbiBub3QgYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QsIGRvbid0IGFzc3VtZSB0aGF0IHRoaXMKLQlpcyB0aGUgd3JvbmcgZm9ybWF0LgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlmb3JtYXQgaXMgbm90IGJmZF9vYmplY3QuCi0JKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IExpa2V3aXNlLgotCi1XZWQgRmViIDIxIDEzOjU4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IHJhbmdlIG9mIFJfU0hfVVNFUwotCXJlbG9jLgotCi1UdWUgRmViIDIwIDE2OjIyOjQ0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIG5ldGJzZF9jb3JlX2RhdGEuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRmViIDIwIDE2OjUwOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoU1VOT1NfQ09OU1RSVUNUT1IpOiBEZWZpbmUuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgbGV0IGEgc3ltYm9sIGZyb20gYSBkeW5hbWljIG9iamVjdAotCW92ZXJyaWRlIGEgY29uc3RydWN0b3Igc3ltYm9sLiAgU2V0IFNVTk9TX0NPTlNUUlVDVE9SIHdoZW4KLQlhcHByb3ByaWF0ZS4KLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGZsYWdzCi0JdG8gZ2V0IHRoZSBzeW1ib2wgaW5kZXgsIG1hdGNoaW5nIDE0IEp1bCA5NSBjaGFuZ2UuCi0KLVR1ZSBGZWIgMjAgMDg6MjY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgZ3AuCi0KLU1vbiBGZWIgMTkgMTI6Mzc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0Ci0JYXNzdW1lIHRoYXQgd2UgY2FuIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZW4gZ2V0IHRoZSBzYW1lIHZhbHVlLAotCXNpbmNlIGl0IHdvbid0IGJlIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIGlzIG5laXRoZXIgRUxGIG5vcgotCUVDT0ZGLgotCSogY29mZi1taXBzLmMgKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogRG9uJ3QgYm90aGVyIHRvIHVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCi0JKG1pcHNfZ3ByZWxfcmVsb2MpOiBEb24ndCBhc3N1bWUgd2UgY2FuIHNldCBhbmQgZ2V0IHRoZSBHUCB2YWx1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IEdldCBncCB2YWx1ZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBBZGQgcGdwIHBhcmFtZXRlci4gIFNldCBpdCB0byB0aGUgR1AgdmFsdWUuCi0JRG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSBCRkQgYmUgRUxGLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20gbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlCi0JR1AgdmFsdWUuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERvbid0IGJvdGhlciB0byB1c2UKLQlfYmZkX2dldF9ncF92YWx1ZSBoZXJlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUpOiBJbml0aWFsaXplIHN2LgotCURvbid0IGNoYW5nZSBlcGRyIGJldHdlZW4gbWFsbG9jIGFuZCBmcmVlLiAgQmUgY2FyZWZ1bCBub3QgdG8gZnJlZQotCU5VTEwgcG9pbnRlcnMuICBaZXJvIG91dCB0aGUgZmlyc3QgUlBEUi4KLQotCSogY29uZmlndXJlLmhvc3Q6IE9uIExpbnV4LCBvbmx5IHBhc3MgLXJwYXRoIG9wdGlvbiBpZiAkKGxpYmRpcikKLQlpcyBuZWl0aGVyIC9saWIgbm9yIC91c3IvbGliLiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5AbXVsbGV0LkxldmVscy5VbmlTQS5FZHUuQXU+LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIGR0X25lZWRlZF9uYW1lIHRvCi0JZHRfbmFtZS4KLQkoZWxmX2R0X25hbWUpOiBSZW5hbWUgZnJvbSBlbGZfZHRfbmVlZGVkX25hbWUuCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4KLQkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4gIFNhdmUgdGhlIFNPTkFNRSBiYWNrIGluIGVsZl9kdF9uYW1lLgotCSogYmZkLWluLmggKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTkgMDI6NTA6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXAuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBVcGRhdGUuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRGVmaW5lLgotCShzcGFyY19yZWxvY19tYXApOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBVc2Ugc3BhcmM2NF9lbGZfaG93dG9fdGFibGUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KLQotU3VuIEZlYiAxOCAxNTowMjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLQl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQotRnJpIEZlYiAxNiAxMjo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChfYmZkX2dldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShfYmZkX3NldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgYW5kIF9iZmRfc2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHJlZmVycmluZwotCWRpcmVjdGx5IHRvIHRoZSBmaWVsZHMgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkobWlwc19ncHJlbF9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBSZWNvZ25pemUgYmZkX21hY2hfaTk2MF9qeC4KLQotVGh1IEZlYiAxNSAxMToyOToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgaW5mb3JtYXRpb24gd2hpY2ggYXV0b2NvbmYgc2hvdWxkCi0JZmlndXJlIG91dCwgbmFtZWx5IENDLCBDRkxBR1MsIExERkxBR1MsIEFSLCBhbmQgUkFOTElCLgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIGdvMzIgYW5kIHdpbjMyIGhvc3QgaW5mb3JtYXRpb24sIHNpbmNlIGl0Ci0Jc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB3ZSBoYXZlIGEgLmR5bmFtaWMgc2VjdGlvbiwKLQl0aGVuIHN0YXJ0IGEgbmV3IHNlZ21lbnQgcmF0aGVyIHRoYW4gcHV0IGEgd3JpdGFibGUgc2VjdGlvbiBpbiBhCi0JcmVhZG9ubHkgc2VnbWVudC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBSUEFUSF9FTlZWQVIuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkCi0JemVyb19zZWN0aW9uIHZhcmlhYmxlLgotCi1UaHUgRmViIDE1IDEwOjM5OjE3IDE5OTYgIEguSi4gTHUgIDxoamxAem9vbS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKHNyY2RpcikvYmZkLWluMi5oKTogUmVuYW1lIHRhcmdldCBmcm9tIGJmZC1pbjIuaC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oKTogUmVuYW1lIGZyb20gbGliYmZkLmguCi0JKCQoc3JjZGlyKS9saWJjb2ZmLmgpOiBSZW5hbWUgZnJvbSBsaWJjb2ZmLmguCi0KLVdlZCBGZWIgMTQgMTY6Mjk6MDcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4cHJlc3Npb24pOiBPbmx5IHVzZSBhbiBSIHZhcmlhYmxlIGZvciBhCi0JbG9jYWwgc3ltYm9sLiAgRG9uJ3Qgb3V0cHV0IGEgemVybyBvZmZzZXQuICBIYW5kbGUgYSB6ZXJvIGFkZHJlc3MuCi0JKFNSQ19NQVNLLCBQQ1JFTF9PRkZTRVQpOiBEZWZpbmUgYmFzZWQgb24gS0VFUE1JTlVTUENJTklOU1QuCi0JKHJlbDMyX2hvd3RvLCByZWwxNl9ob3d0bywgcmVsOF9ob3d0byk6IFVzZSBTUkNfTUFTSyBhbmQKLQlQQ1JFTF9PRkZTRVQuCi0JKHBhcnNlX2V4cHJlc3Npb24pOiBEb24ndCB0cnkgdG8gaGFuZGxlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIGEKLQlQIHZhcmlhYmxlLiAgSGFuZGxlIEkgdmFyaWFibGVzIGRpZmZlcmVudGx5IGZyb20gWCB2YXJpYWJsZXMuICBGaXgKLQl0aGUgb3JkZXIgb2YgbWludXMgZXhwcmVzc2lvbnMuCi0JKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEdlbmVyYXRlIGFuIEkgdmFyaWFibGUgZm9yIGFuIE5OCi0JcmVjb3JkLiAgRml4IGhhbmRsaW5nIG9mIEFUSSBhbmQgQVRYIHJlY29yZHMuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBPbmx5IHNldCBtaW5pbWFsIHNlY3Rpb24gYXR0cmlidXRlcy4KLQlBZGp1c3QgdGhlbSBsYXRlciwgYmFzZWQgb24gdGhlIHNlY3Rpb24gY29udGVudHMuCi0JKGllZWVfb2JqZWN0X3ApOiBSZWFkIGluIHRoZSBmaWxlIHVudGlsIGp1c3QgYWZ0ZXIgdGhlIE1FIHJlY29yZC4KLQlDYWxsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncy4KLQkoZG9fb25lKTogQWRkIGl0ZXJhdGlvbnMgcGFyYW1ldGVyLiAgT25seSByZXBlYXQgdGhlIGZpcnN0IGxvYWQKLQlpdGVtLiAgU2V0IHRoZSBzZWN0aW9uIGFuZCBmaWxlIHJlbG9jIGZsYWdzLgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFNldCBzZWN0aW9uIGZsYWdzLiAgUGFzcyBpdGVyYXRpb25zIHRvCi0JZG9fb25lLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEhhbmRsZSBJIHZhcmlhYmxlcy4KLQkoZG9fd2l0aF9yZWxvY3MpOiBPbmx5IGVtaXQgcmVsb2NhdGlvbiBzaXplIHdoZW4gbmVjZXNzYXJ5LgotCUluY3JlYXNlIE1BWFJVTiB0byAxMjcuICBDaGFuZ2Ugb3YgdG8gYmUgYXNzaWduZWQsIGFuZCB0YWtlCi0Jc3JjX21hc2sgYW5kIHBjcmVsX29mZnNldCBpbnRvIGFjY291bnQuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogU2tpcCBzZWN0aW9ucyB0aGF0IGFyZSBub3QgbG9hZGVkLgotCShpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBEb24ndCBvdXRwdXQgb3B0aW9uYWwgbGFzdCBlbnRyeSBvZiBXWAotCXJlY29yZHMuCi0JKGllZWVfd3JpdGVfbWVfcGFydCk6IE1ha2Ugc2V0dGluZyBvZiBtZV9yZWNvcmQgbmVhdGVyLgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IEdldCB0aGUgc2l6ZSBvZiBhbiBhcmNoaXZlIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoc3R0KTogQWRkIGVudHJpZXMgZm9yIHplcm92YXJzLCB2YXJzLCBhbmQgY29kZS4KLQotCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdyaXRlX3JlbG9jcyk6IENhbGwgdmFsaWRhdGVfcmVsb2MgZm9yIG5vbiBFTEYgcmVsb2NzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKFRBUkdFVF9CSUdfU1lNKTogVXNlIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLgotCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkIChtNjgqLSotcHNvcyopOiBOZXcgdGFyZ2V0LgotCi1UdWUgRmViIDEzIDE1OjU2OjIyIDE5OTYgIEJyeWFuIEZvcmQgIDxiYWZvcmRAc25ha2UuY3MudXRhaC5lZHU+Ci0KLQkqIGkzODZtc2Rvcy5jOiBSZW1vdmUgc29tZSAjaWYgMCBjb2RlLgotCShtc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBpbmNsdWRlIGVtcHR5IHNlY3Rpb25zIGluIHRoZQotCXNpemUgY29tcHV0YXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYWRkcmVzcy4KLQotVHVlIEZlYiAxMyAxNTozNjozNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBzZWdmYXVsdCBpZiBkeW5ib2oKLQlpcyBOVUxMLCBpZSwgdGhlIC1yIHN3aXRjaCBpcyB1c2VkLgotCi1UdWUgRmViIDEzIDE0OjM1OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KTogRGVmaW5lLgotCShCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogTWFwIG5ldyByZWxvY3MuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90Ci0JJChTSExJTkspLgotCi0JKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBTZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgotCShkb193aXRoX3JlbG9jcyk6IElmIEVYRUNfUCBpcyBzZXQgYW5kIHRoZXJlIGFyZSBubyByZWxvY3MsIHVzZSBhCi0Jc2ltcGxlIG51bWJlciBmb3IgdGhlIHNlY3Rpb24gYWRkcmVzcywgcmF0aGVyIHRoYW4gYW4gZXhwcmVzc2lvbi4KLQlMaW1pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gcmVsb2NzIHRvIE1BWFJVTi4KLQkoaWVlZV93cml0ZV9tZV9wYXJ0KTogU2V0IG1lX3JlY29yZCB0byB0aGUgZmlsZSBvZmZzZXQgYWZ0ZXIgdGhlCi0Jc3RhcnQgYWRkcmVzcy4KLQkoaWVlZV93cml0ZV9wcm9jZXNzb3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBpZWVlX3dyaXRlX3Byb2Nlc3Nvci4KLQotRnJpIEZlYiAgOSAxMDo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtDQy1nY2N9IHdoZW4gdGVzdGluZyBmb3IgLXJwYXRoIG9uIFN1bk9TLgotCi0JKiBjb2ZmLWF1eC5jOiBDaGFuZ2UgaW5jbHVkZSBvZiBhdXguaCB0byBhdXgtY29mZi5oLgotCi1UaHUgRmViICA4IDE0OjAxOjAzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzY4S19SRUxBVElWRQotCXJlbG9jYXRpb24gcHV0IHRoZSBhZGRlbmQgYm90aCBpbiB0aGUgcmVsb2MgZW50cnkgYW5kIHRoZSBkYXRhLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4gIE1hc2sgb3V0IG1hcmtlciBpbgotCUdPVCBvZmZzZXQgdmFsdWUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHJlc29sdmUKLQlhIFJfNjhLX1BDeHggcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbCBkaXJlY3RseS4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY291bnQgc3VjaCBhIHJlbG9jLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCi0JYSBQTFR4eCByZWxvYyBhcyBkeW5hbWljLiAgRGlzYWxsb3cgUExUeHhPIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbCBmb3Igbm93LCBvdGhlcndpc2UgYWx3YXlzIHJlY29yZCB0aGUgc3ltYm9sIGFzIGR5bmFtaWMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIHdpdGggYSBQTFR4eCByZWxvYwotCWlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhCi0Jc2hhcmVkIG9iamVjdCwgdGhlbiBkb24ndCBtYWtlIGEgUExUIGVudHJ5LiAgSWYgd2UgZG8gbWFrZSBhIFBMVAotCWVudHJ5LCBtYWtlIHN1cmUgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWNvcmRlZCBhcyBkeW5hbWljLgotCi1XZWQgRmViICA3IDEzOjU2OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksIHNldCBITERGTEFHUyB0bwotCXBhc3MgYW4gYXBwcm9wcmlhdGUgLXJwYXRoIG9wdGlvbi4gIFVzZSB0aGUgbWFrZSB2YXJpYWJsZSBTT05BTUUKLQlhcyB0aGUgc2hhcmVkIGxpYnJhcnkgc29uYW1lLCByYXRoZXIgdGhhbiBjb21wdXRpbmcgaXQgaGVyZS4gIE9uCi0JU3VuT1MsIGJ1aWxkIHN0YW1wLXRzaGxpbmsgaW4gcGxhY2Ugb2YgJChTSExJTkspLgotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJTkspKTogTWFrZSBhIGxpbmsgdG8gdGhlIHRyYW5zZm9ybWVkIG5hbWUsIGFzIHdlbGwuCi0JKHN0YW1wLXRzaGxpbmspOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogU2tpcCBzdGFtcC10c2hsaW5rIGR1cmluZyBpbnN0YWxsLgotCi1XZWQgRmViICA3IDEzOjM3OjM5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IGFzc3VtZSB0aGF0IHRoZQotCWxpbmtlciBzZWN0aW9ucyBoYXZlIGJlZW4gc2V0IHVwIHlldC4KLQotCSogZWxmLmMgKG1ha2VfbWFwcGluZyk6IEFkZCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHN1cHByZXNzCi0JbWFraW5nIHRoZSBmaXJzdCBzZWN0aW9uIGluY2x1ZGUgdGhlIHByb2dyYW0gaGVhZGVycy4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgdGhlIHVzZXIgdXNlZCAtVHRleHQgc3VjaCB0aGF0IHRoZQotCXByb2dyYW0gaGVhZGVycyBhcmUgb24gYSBkaWZmZXJlbnQgcGFnZSwgZG8gbm90IHNldCB0aGUgZmxhZ3MKLQlzYXlpbmcgdGhhdCB0aGlzIHNlY3Rpb24gaW5jbHVkZXMgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIEZlYiAgNiAxNDowNDo0OSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldGJzZCopOiBTZXQgQ09SRUZJTEUgdG8gbmV0YnNkLWNvcmUuYy4KLQlkb24ndCBkZWZpbmUgVFJBRF9IRUFERVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIG5ldGJzZC1jb3JlLmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBOZXRCU0QgY29yZSBmaWxlcy4KLQkqIGhvc3RzLypuYnNkLmg6IFJlbW92ZWQuCi0KLVR1ZSBGZWIgIDYgMTE6NDc6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19bNTY3XSk6IE5ldyByZWxvYyB0eXBlcy4KLQkoQkZEX1JFTE9DX1NQQVJDX0xPNyByZWxvYyB0eXBlKTogRGVsZXRlZC4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KLQliZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCUFkZCBzcGFyYzY0IHJlbG9jcy4KLQkoc3BhcmNfcmVsb2NfbWFwKTogQWRkIHNwYXJjNjQgcmVsb2NzLgotCShzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBIYW5kbGUgUl9TUEFSQ19XRElTUHsxNiwxOX0uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3dkaXNwMTZfcmVsb2MpOiBEZWxldGVkLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRGVsZXRlZC4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQ2hhbmdlIGZyb20gZnVuY3Rpb24gdG8gI2RlZmluZS4KLQotVHVlIEZlYiAgNiAxMjoxMjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIFNITElCX0NGTEFHUyBpbmNsdWRlICQoUElDRkxBRykgb24gYQotCSotKi1ocHV4KiBob3N0LgotCi0JKiBNYWtlZmlsZS5pbiAocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoaW5zdGFsbCk6IFRyYW5zZm9ybSBsaWJyYXJ5IG5hbWUgYmVmb3JlIGluc3RhbGxpbmcgaXQuCi0KLU1vbiBGZWIgIDUgMTA6Mzg6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2h4KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY3B1LWk5NjAuYyAoc2Nhbl85NjBfbWFjaCk6IEFjY2VwdCBtYWNoaW5lICJoeCIuCi0JKE1BVFJJWCk6IEV4cGFuZCBlbnRyaWVzIGZvciBIWC4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBpOTYwOmh4IGVudHJ5LgotCSogYm91dC5jIChiX291dF9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIGJmZF9tYWNoX2k5NjBfaHguCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEhhbmRsZSBGX0k5NjBIWC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGFzIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBhdGNoZXMgZnJvbQotCUFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIHNoYXJlZCBhbmQgY29tbW9uYmZkbGliLgotCU5ldyBzdWJzdGl0dXRpb25zOiBBTExMSUJTLCBQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsCi0JU0hMSUJfQ0ZMQUdTLCBDT01NT05fU0hMSUIsIFBJQ0xJU1QsIFNITElOSy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJZiAtLWVuYWJsZS1zaGFyZWQsIGFkanVzdCBzaGFyZWQgbGlicmFyeSBzdHVmZgotCWJhc2VkIG9uIHRoZSBob3N0LiAgSWYgdGhlIGhvc3QgaXMgU3VuT1MsIGFuZCB0aGUgbGlua2VyIHN1cHBvcnRzCi0JLXJwYXRoLCBzZXQgSExERkxBR1MgdG8gdXNlIGl0LgotCSogTWFrZWZpbGUuaW4gKEFMTExJQlMpOiBOZXcgdmFyaWFibGUuCi0JKFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywgU0hMSUJfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ09NTU9OX1NITElCLCBTSExJTkspOiBOZXcgdmFyaWFibGVzLgotCSguYy5vKTogSWYgUElDRkxBRyBpcyBzZXQsIGNvbXBpbGUgdHdpY2UsIG9uY2UgUElDLCBvbmNlIG5vcm1hbC4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gJChBTExMSUJTKSBhbmQgQFBJQ0xJU1RAIHJhdGhlciB0aGFuCi0JJChUQVJHRVRMSUIpLgotCShzdGFtcC1vZmlsZXMpOiBOZXcgdGFyZ2V0LCBsaWtlIG9sZCBvZmlsZXMgdGFyZ2V0LCBidXQgYnVpbGQKLQl1c2luZyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBtb3ZlLWlmLWNoYW5nZSwgYW5kIHRvdWNoIHN0YW1wLW9maWxlcwotCXdoZW4gZG9uZS4KLQkob2ZpbGVzKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1vZmlsZXMuCi0JKHN0YW1wLXBpY2xpc3QsIHBpY2xpc3QpOiBOZXcgdGFyZ2V0cy4KLQkoJChTSExJQiksICQoU0hMSU5LKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBCdWlsZCB0d2ljZSBpZiBQSUNGTEFHIGlzIHNldC4KLQkoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgcGljLyouby4KLQkoZG9fY2xlYW4pOiBSZW1vdmUgc3RhbXAtb2ZpbGVzLCAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQKLQlzdGFtcC1waWNsaXN0LgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgcGljIGFuZCBzdGFtcC1waWNkaXIuCi0JKGluc3RhbGwpOiBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMuCi0JKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHRhcmdldC4KLQotCSogbGliY29mZi1pbi5oOiBBZGQgY29tbWVudCByZW1pbmRpbmcgcGVvcGxlIHRoYXQgbGliY29mZi5oIGlzIGEKLQlnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGdldCB0aGUKLQlmbGF2b3VyIG9mIGEgc2VjdGlvbiB3aXRoIG5vIG93bmVyLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYXIKLQlFTEZfTElOS19OT05fRUxGIGZsYWcuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGYuYzogUmV2ZXJ0IGxhc3QgY2hhbmdlLCBzaW5jZSBpdCBicmVha3MgZHluYW1pYyBsaW5raW5nLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB3YW50X2hkcl9pbl9zZWcKLQlmaWVsZC4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogRG9uJ3QgaW5pdGlhbGl6ZSB3YW50X2hkcl9pbl9zZWcgZmllbGQuCi0KLVN1biBGZWIgIDQgMjA6NDU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIHRoZSBiYWNrZW5kIGRvZXMKLQlub3Qgd2FudCB0aGUgZWxmIGhlYWRlciBvciB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIHRoZSBhZGRyZXNzCi0Jc3BhY2UsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhbGN1bGF0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBOZXcgaG9vawotCWZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLgotCShwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IERlZmluZSBhcyBhIE5PUCBmdW5jdGlvbiBmb3Igbm93LgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IC5zZGF0YTIgaXMgYSByZWFkLW9ubHkgc2VjdGlvbi4KLQotU2F0IEZlYiAgMyAyMzowMDowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmg6IE1vdmUgdG9kYXkncyBsaWJjb2ZmLmggY2hhbmdlIGludG8gY29mZmNvZGUuaC4KLQotU2F0IEZlYiAgMyAxNTo0Mzo0NCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi5oIChiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29tYmluZSBtYWNybyBhcmdzCi0JYmFjayBpbnRvIG9uZSBsaW5lLiAgU29tZSBjb21waWxlcnMgKHN1bm9zIDQuMS4zIGZvciBleGFtcGxlKQotCXdvbid0IGFjY2VwdCBhcmdzIHNwbGl0IGFjcm9zcyBtb3JlIHRoYW4gb25lIGxpbmUuCi0KLUZyaSBGZWIgIDIgMTE6NDI6MTUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IFVuZGVyc3RhbmQgY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgIDIgMTI6MTI6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0Ci0JdHJ5IHRvIGRvIGFyaXRobWV0aWMgb24gYSB2b2lkICosIGNhc3QgaXQgdG8gYSB1bnNpZ25lZCBjaGFyICogZmlyc3QuCi0KLVRodSBGZWIgIDEgMTY6MDQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX05PTl9FTEYpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBTZXQgZWxmX2xpbmtfaGFzaF9mbGFncyB0bwotCUVMRl9MSU5LX05PTl9FTEYuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFJlc2V0IEVMRl9MSU5LX05PTl9FTEYKLQlmbGFnIGZvciBhIG5ld2x5IGRlZmluZWQgc3ltYm9sLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBMaWtld2lzZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIEVMRl9MSU5LX05PTl9FTEYgaXMgc2V0LCB0cnkgdG8KLQlzZXQgdGhlIERFRiBvciBSRUZfUkVHVUxBUiBmbGFncyBjb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluIChiZmQtaW4yLmgpOiBNYWtlIGJmZC5oLCBub3QgcHJvdG9zLCBpbiBkb2NkaXIuCi0JKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCByZWNvcmQgYSBzeW1ib2wgd2l0aAotCWEgUExUMzIgcmVsb2MgYXMgZHluYW1pYy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVDMyIHJlbG9jCi0JaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKLQlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCi0JZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCi0KLVdlZCBKYW4gMzEgMTc6MjM6MzIgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfMzJfUENSRUwuCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzM0NV04Ni0qLWN5Z3dpbjMyLgotCShwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBHZXQgYWRkcmVzcyBmcm9tIHZtYS4KLQotV2VkIEphbiAzMSAxNjoyMzo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogSWYgdGhlIHN5bWJvbAotCWF0dGFjaGVkIHRvIHRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhbiB1bmRlZmluZWQKLQlzeW1ib2wsIHRyZWF0IGl0IGFzIGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgotCi1XZWQgSmFuIDMxIDE2OjE2OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBvdXRwdXQgaW5pdGlhbCBkdW1teQotCXN5bWJvbCBvciBzZWN0aW9uIHN5bWJvbHMgaWYgc3RyaXBwaW5nIGFsbCBzeW1ib2xzIGFuZCB0aGlzIGlzIG5vdAotCWEgcmVsb2NhdGVhYmxlIGxpbmsuICBEb24ndCBvdXRwdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgaWYKLQl0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkoZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzIHRvIGZsdXNoLgotCi1XZWQgSmFuIDMxIDEyOjU1OjQ5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb2ZmLWF1eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGthdXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGthdXhfY29mZl92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrYXV4X2NvZmZfdmVjKTogRGVjbGFyZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZAotCV9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLgotCShiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogRGVmaW5lLgotCShjb21wYXJlX2FyZWxlbnRfcHRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZiBUQVJHX0FVWC4KLQkoY29mZl93cml0ZV9yZWxvY3MpOiBJZiBUQVJHX0FVWCwgc29ydCB0aGUgcmVsb2NzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBBL1VYIGFvdXRoZHIgbWFnaWMgbnVtYmVyLgotCShjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYWxsCi0JYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCByYXRoZXIgdGhhbgotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogY29mZi1tNjhrLmMgKENPRkZfUEFHRV9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hdXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtYXV4LmMuCi0KLVdlZCBKYW4gMzEgMTE6Mzc6NDYgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBSXzY4S19HT1QqCi0JcmVsb2NhdGlvbjsgaWdub3JlIGFkZGVuZCB3aXRoIFJfNjhLX3tHT1QsUExUfSpPIHJlbG9jYXRpb24uCi0KLVR1ZSBKYW4gMzAgMTI6MDk6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbW92ZSAkKHNyY2RpcikvYmZkLWluMi5oLAotCSQoc3JjZGlyKS9saWJiZmQuaCBhbmQgJChzcmNkaXIpL2xpYmNvZmYuaC4KLQkobWFpbnRhaW5lci1jbGVhbik6IFdhcm4gYWJvdXQgZGVsZXRpbmcgc3BlY2lhbCBmaWxlcy4KLQkoYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oKTogTmV3IHRhcmdldHMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGluZGlyZWN0IGFuZAotCXdhcm5pbmcgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgY2FzdHMgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQotTW9uIEphbiAyOSAxNDoyNzoyNCAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oOiBhbGlnbmVkIG5ld2x5IGV4cG9ydGVkIG5hbWVzIHdpdGggYmZkIG5hbWluZwotCWNvbnZlbnRpb25zLiBSZW1vdmVkIGFuIGVycm9uZW91cyBkZWZpbmUgb2YgUE9XRVJQQ19MRV9QRS4KLSAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jLCBjb2ZmLXBwYy5jOiB0aGUgYWJvdmUgZnVuY3Rpb24gbmFtZSBjaGFuZ2VzCi0KLU1vbiBKYW4gMjkgMTM6MDY6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBCYXNpbSBLYWRoaW0gPGthZGhpbUBzcG9jay5jcy5jb2xvcmFkby5lZHU+OgotCSogZWNvZmYuYyAoc3RydWN0IGV4dHN5bV9pbmZvKTogRGVmaW5lLgotCShfYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rKTogUGFzcyBhIHBvaW50ZXIgdG8gc3RydWN0IGV4dHN5bV9pbmZvCi0JdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEFjY2VwdCBhIHN0cnVjdCBleHRzeW1faW5mbyBwb2ludGVyLgotCVN0cmlwIHN5bWJvbHMgd2hlbiBhcHByb3ByaWF0ZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogc3ltcy5jIChCU0ZfT0JKRUNUKTogRGVmaW5lLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgJ08nIGZvciBCU0ZfT0JKRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9PQkpFQ1QgZm9yIGFuCi0JU1RUX09CSkVDVCBzeW1ib2wuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IE9ubHkgc2V0IHR5cGUgdG8gU1RUX09CSkVDVCBpZiBCU0ZfT0JKRUNUCi0JaXMgc2V0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCB3aGVuCi0JY29weWluZyByZWxvY3MgaW50byBhIHNoYXJlZCBvYmplY3QsIHRyZWF0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sCi0JYXMgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgc2V0IHdlYWtkZWYgdG8gYQotCXJlYWwgZGVmaW5lZCBzeW1ib2wsIG5vdCB0byBhIHdlYWsgZGVmaW5lZCBzeW1ib2wuCi0KLU1vbiBKYW4gMjkgMTE6MzQ6MzYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmM6IHJlbW92ZWQgdGhlIFBPV0VSUENfTEVfUEUgaGFjaywgcHJvbW90ZWQgc29tZSB0eXBlcwotCWFuZCBtYWRlIGEgZmV3IHN0YXRpYyBmdW5jdGlvbnMgZXh0ZXJucy4KLQotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBuZXcgZnVuY3Rpb24sIHJlcGxhY2VzIHRoZQotCVBPV0VSUENfTEVfUEUgaGFjayBpbiBjb2ZmbGluay4KLQotCSogbGliY29mZi1pbi5oOiBwcm9tb3RlZCB0aGUgZm9sbG93aW5nIGZyb20gY29mZmxpbmsuYyB0byBhbGxvdwotCV9iZmRfY29mZl9maW5hbF9saW5rIHRvIGJlIG92ZXJyaWRkZW4gLSAgU1RSSU5HX1NJWkVfU0laRSwKLQljb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQsIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5LCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQsICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvLAotCWNvZmZfZmluYWxfbGlua19pbmZvLCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYywKLQljb2ZmX3dyaXRlX2dsb2JhbF9zeW0sIGNvZmZfbGlua19pbnB1dF9iZmQsIGNvZmZfcmVsb2NfbGlua19vcmRlci4KLQotCSogbGliY29mZi5oOiByZS1nZW4nZAotCi1GcmkgSmFuIDI2IDE4OjMzOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jOiBJbmNsdWRlICJiZmRsaW5rLmgiLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBEZWZpbmUuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZwotCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIEVMRgotCXN5bWJvbCB0YWJsZS4gIEZpbmQgdGhlIGNsb3Nlc3QgU1RUX0ZVTkMgc3ltYm9sLCBub3QgdGhlIGxhc3Qgb25lLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0gCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVHJ5IGNhbGxpbmcKLQlfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBiZWZvcmUgc2VhcmNoaW5nIHRoZSBDT0ZGCi0Jc3ltYm9sIHRhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1GcmkgSmFuIDI2IDE2OjExOjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKFJfUFBDX0VNQl9TREEyMSByZWxvY2F0aW9ucyk6IE1ha2UgcmVsb2NhdGlvbiBzaXplCi0JNCBieXRlcywgc28gd2UgZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gdXBkYXRpbmcgdGhlIHJlZ2lzdGVyCi0JZmllbGQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi1UaHUgSmFuIDI1IDEyOjE0OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBSZW1vdmUgdG9jX3NlY3Rpb24gYW5kCi0JZW50cnlfc2VjdGlvbiBmaWVsZHMuICBBZGQgc250b2MgYW5kIHNuZW50cnkgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBzbnRvYyBhbmQgc25lbnRyeSwKLQlub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24gKHRoZSBDT0ZGIGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkKLQlzZWN0aW9ucyBhdCB0aGlzIHBvaW50KS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgb19zbmVudHJ5IGFuZCBvX3NudG9jIGZyb20KLQlzbmVudHJ5IGFuZCBzbnRvYyByYXRoZXIgdGhhbiBlbnRyeV9zZWN0aW9uIGFuZCB0b2Nfc2VjdGlvbi4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgc250b2MgYW5kCi0Jc25lbnRyeSwgbm90IHRvY19zZWN0aW9uIGFuZCBlbnRyeV9zZWN0aW9uLgotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQKLQllbnRyeV9zZWN0aW9uIGZyb20gaGVudHJ5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIGEgZGVmaW5lZCBzeW1ib2wgaGFzIFhDT0ZGX0VOVFJZIHNldCwKLQlzZXQgc25lbnR5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IFNldCBzbnRvYywgbm90IHRvY19zZWN0aW9uLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogR2V0IHRvY19zZWN0aW9uIGZyb20gc250b2MsIHJhdGhlcgotCXRoYW4gdXNpbmcgdG9jX3NlY3Rpb24gZGlyZWN0bHkuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBtaXNzaW5nIGAuJyBpbiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotc2NvKmVsZiopOiBVc2UgYmZkX2VsZjMyX2kzODZfdmVjLiAgRnJvbQotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLVRodSBKYW4gMjUgMTI6MDg6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgLnJlbGEuc2RhdGF7LDJ9Ci0JdG8gc2VjdGlvbnMgd2UgYWxsb2NhdGUuICBVc2UgYmZkX3phbGxvYyB0byBhbGxvY2F0ZSBpbml0aWFsaWFsCi0Jc2VjdGlvbnMsIG5vdCBiZmRfYWxsb2MuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIEJGRF9BU1NFUlRzIGZvciAhc2hhcmVkIGZyb20KLQlTREF7LDJ9STE2IHJlbG9jYXRpb25zLgotCShwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFVzZSB0aGUgdmFsdWUgb2YgLUcgbm4gdG8gZGV0ZXJtaW5lCi0Jd2hldGhlciB0byBwdXQgc29tZXRoaW5nIGluIC5zYnNzIG9yIG5vdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuICBBZGQKLQlpbiBzZWMtPm91dHB1dF9vZmZzZXQgd2hlcmUgYXBwcm9wcmlhdGUuICBNYWtlIGVycm9yIG1lc3NhZ2VzCi0JaW5jbHVkZSB0aGUgc3ltYm9sIG5hbWUuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTG9va3VwIHN5bWJvbCBiZWZvcmUKLQl0cnlpbmcgdG8gYWRkIGl0IHRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotCWRvZXNuJ3QgZ2V0IHJlZGVmaW5lZCBtZXNzYWdlcyBpZiAtc2hhcmVkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikgT25seSBidW1wIFJFTEEKLQlzZWN0aW9uIGlmIHRoZSByZWxfc2VjdGlvbiBmaWVsZCBoYXMgYmVlbiBzZXQgdXAuCi0KLVdlZCBKYW4gMjQgMjA6NDA6MjYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gaW4gZWFiaQotCXJlbG9jYXRpb25zLgotCi1XZWQgSmFuIDI0IDEwOjM4OjM0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGNoZWNraW5nCi0Jb2YgZmxhZ3MsIG9ubHkgZmxhZ3MgdXNlZCBhcmUgY29udHJvbGxlZCBieSBtYWNoIG51bWJlci4gIEJ1bXAgdXAKLQlvdXRwdXQgZmlsZSBtYWNoIG51bWJlciB0byBoaWdoZXN0IG9mIGlucHV0IGZpbGUgbWFjaCBudW1iZXJzLgotCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFdhdGNoIGZvciBFRl9TUEFSQ19TVU5fVVMxLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX1NVTl9VUzEgaWYgdjhwbHVzYS4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXtzeXN2NCosc29sYXJpczIqfSk6IENvbW1lbnQgb3V0Ci0JYmZkX2VsZjY0X3NwYXJjX3ZlYyBzdXBwb3J0LgotCi1UdWUgSmFuIDIzIDE0OjMzOjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgY29tcGxhaW4gaWYKLQl0aGUgZW1iZWRkZWQgYml0IGlzIHNldCBvbiBzb21lIG9iamVjdHMgYW5kIG5vdCBvbiBvdGhlcnMuICBKdXN0Ci0Jb3IgaXQgdG9nZXRoZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEltcGxlbWVudCBSX1BQQ19FTUJfe1NEQTIxLFJFTFNEQX0KLQlyZWxvY2F0aW9ucy4KLQotVHVlIEphbiAyMyAxNDoyMjo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHRyeSB0byBhbGlnbiB0aGUKLQkuc3RhYnN0ciBzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IHRoZSBoYW5kbGluZyBvZiB0aGUKLQkubGliIHNlY3Rpb24gdG8gd29yayBldmVuIGlmIHRoZSBlbnRpcmUgc2VjdGlvbiBjb250ZW50cyBhcmUKLQl3cml0dGVuIGF0IG9uY2UuICBGcm9tIEd2cmFuIFVkZGVib3JnIDxndnJhbkB1ZGRlYm9yZy5wcC5zZT4gYW5kCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotTW9uIEphbiAyMiAxODo0NTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3QgYWxsb2NhdGUKLQltZW1vcnkgaGVyZSBmb3IgY29udGVudHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBCdW1wIHVwIF9TREFfQkFTRV8gYW5kCi0JX1NEQTJfQkFTRV8gYnkgMzI3NjguCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogI2lmIG91dCBQTFQgY29kZSB3aGljaCB3ZSBoYXZlbid0Ci0Jc3RhcnRlZCB1c2luZy4gIEFsbG9jYXRlIGNvbnRlbnRzIGZvciAuc2RhdGEgYW5kIC5zZGF0YTIgc2VjdGlvbnMKLQlhbHNvLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSBpbiBkZWJ1ZyBtZXNzYWdlLAotCXJhdGhlciB0aGFuIF9uYW1lLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFJlbW92ZSBjb2RlIHRoYXQgYXR0ZW1wdGVkIHRvCi0Jc2l6ZSBfU0RBeywyfV9CQVNFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hhbmdlIGhvdyBzZGF0YXssMn0gcmVsb2NhdGlvbnMgYXJlCi0JZG9uZS4KLQotTW9uIEphbiAyMiAwODo1MjowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaXggdHlwby4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfdjkpOiBSZW5hbWVkIGZyb20gYmZkX21hY2hfc3BhcmM2NC4KLQkoYmZkX21hY2hfc3BhcmNfe3Y4cGx1cyx2OHBsdXNhfSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlhKTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OV9wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4LmggKGFvdXQsbWFjaGluZV90eXBlKTogYmZkX21hY2hfc3BhcmM2NCByZW5hbWVkIHRvCi0JYmZkX21hY2hfc3BhcmNfdjkuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9vYmplY3RfcCk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXN5c3Y0KixzcGFyYzY0LSotc29sYXJpczIqKTogU2V0IHRhcmdfZGVmdmVjCi0JdG8gYmZkX2VsZjMyX3NwYXJjX3ZlYy4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogUmVuYW1lZCBmcm9tIHNwYXJjX2FyY2hfaW5mby4KLQlBZGQgdjhwbHVzeyxhfSBzdXBwb3J0LgotCUFkZCB2OWEgc3VwcG9ydC4KLQkoc3BhcmNfY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXNwYXJjLmg6ICNpbmNsdWRlICJlbGYvc3BhcmMuaCIuCi0JKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZjMyX3NwYXJjX29iamVjdF9wLAotCWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZl9iYWNrZW5kX29iamVjdF9wLAotCWVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0KLU1vbiBKYW4gMjIgMTE6MjE6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkCi0JbGlua2VyX3NlY3Rpb25fcG9pbnRlciBmaWVsZC4KLQkoZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSk6IEVudW1lcmF0aW9uIGZvciBuZXcgd2F5IG9mCi0JY3JlYXRpbmcgbGlua2VyIGR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9saW5rZXJfc2VjdGlvbnssX3BvaW50ZXJzfSk6IE5ldyBzdHJ1Y3R1cmVzIGZvciBjcmVhdGluZwotCWR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgYW5kIGxpbmtlcl9zZWN0aW9uCi0JZmllbGRzLgotCShlbGZfbG9jYWxfcHRyX29mZnNldHMsZWxmX2xpbmtlcl9zZWN0aW9uKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKGJmZF9lbGZ7MzIsNjR9X3tjcmVhdGUsZmluaXNofV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IERpdHRvLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVsZXRlLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byBjcmVhdGUgdGhlCi0Jc2VjdGlvbnMgLmdvdCwgLnNkYXRhLCBhbmQgLnNkYXRhMi4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBaYXAgLnJlbGEue3NkYXRhLHNkYXRhMn0gaWYKLQluZWVkZWQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogU3VwcG9ydCBtb3JlIG9mIHRoZSBlYWJpIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2xzKTogQWRqdXN0IF9TREF7LDJ9X0JBU0VfIGJ5IDMyNzY4Ci0JaWYgdGhlIC5zZGF0YXssMn0gKyAuc2Jzc3ssMn0gc2VjdGlvbiBzaXplIGlzID4gMzJrLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBpbml0aWFsaXplZCBwb2ludGVycyBpbiBkeW5hbWljIGxpbmtlciBzZWN0aW9ucy4KLQkoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQWN0dWFsbHkgaW50aWFsaXplIHRoZQotCXBvaW50ZXJzIGNyZWF0ZWQgYWJvdmUuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2VsZnszMiw2NH1fY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcKLQltYWNyb3MgdG8gcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKLQllbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCi0JKGJmZF9lbGZ7MzIsNjR9X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IG1hY3JvcyB0bwotCXByb3ZpZGUgYm90aCAzMiBhbmQgNjQgYml0IHZlcnNpb25zIG9mCi0JZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIGxpbmtlciBzZWN0aW9uLgotCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaW5kIGEgdW5pcXVlIHBvaW50ZXIgdG8gYQotCWdpdmVuIGFkZHJlc3MgaW4gdGhlIGxpbmtlciBwb2ludGVyIG9mZnNldHMgY3JlYXRlZCBmb3IgYSBnaXZlbgotCXN5bWJvbC4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTWFrZSBhIFJFTEEgc2VjdGlvbgotCWNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBsaW5rZXIgc2VjdGlvbi4KLQotU2F0IEphbiAyMCAwODozNjoxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFDSElORV9BTFQxKTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDE4OjI1OjM0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCBUT0NERUZOIHJlbG9jcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzcGVjaWFsIHZhbHVlcyBmb3IgZ2NjIGJ1aWx0IGRsbHMuCi0JKGR1bXBfdG9jKTogZml4IGRpYWdub3NpbmcgY29kZSB0byBpZGVudGlmeSBvdXQtb2YtdG9jLWJvdW5kcyBlbnRyaWVzLgotCUFsc28gYmVnaW4gdGhlIHRvYyBhdCA0IGFzIGFuIGV5ZSBjYXRjaGVyICgnMzEzMTMxMzEnIG1hcmtzIHRoZSBmaXJzdAotCXRvYyBlbnRyeSBpbiBhbiBvYmpkdW1wKSBmb3Igbm93LgotCShwcGNfZG9fbGFzdCwgcHBjX2dldF9sYXN0KTogTmV3IGZ1bmN0aW9uIC0gbmVlZGVkIHRvIHNhdmUgcHJvY2Vzc2luZwotCXRoZSB0b2Mgb3duZXIgdG8gdGhlIGVuZC4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZWQgYW4gaW5jb3JyZWN0IGhhY2sgZm9yIGRvaW5nIHRoZQotCXRvYyBvd25lciBsYXN0LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEFkZGVkIGEgbmV3IGhhY2sgdG8ga2VlcCB0aGUKLQl0b2Mgb3duZXIgZnJvbSBiZWluZyBkb25lIHRpbGwgbGFzdC4gTXVzdCBkZWZpbmUgUE9XRVJQQ19MRV9QQwotCXRvIGVuYWJsZSBpdC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhbGlnbm1lbnQgc2V0dGluZyBmb3IgLnN0YWIKLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IHNldCBzZWN0aW9uIGZsYWdzIGZvciBzdGFiL3N0cgotCXRvIElORk8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFJlbW92ZWQgYSBub24td29ya2luZyBoYWNrIGZvciBjb21wdXRpbmcgdGhlCi0JU2l6ZU9mSW1hZ2UgZm9yIFBvd2VyUEMuIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgLmp1bmsgc2VjdGlvbi4KLQotVGh1IEphbiAxOCAxNzo0MjoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaDogSW5jbHVkZSA8c2lnbmFsLmg+IGJlZm9yZSA8c3lzL3Byb2Nmcy5oPi4KLQotV2VkIEphbiAxNyAxMjo0MDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1wb3dlcnBjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbGFzdCBlbnRyeSB0byBub3QgcG9pbnQKLQliYWNrIHRvIGZpcnN0LgotCShiZmRfcG93ZXJwY19hcmNoKTogUG9pbnQgYXQgZmlyc3QgZW50cnkgaW4gYXJjaF9pbmZvX3N0cnVjdC4KLQotVHVlIEphbiAxNiAxNToxMDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3QgaW5jcmVtZW50IGZpbGUKLQlvZmZzZXQgZm9yIGEgc2VnbWVudCB3aGljaCBjb250YWlucyBubyBsb2FkYWJsZSBzZWN0aW9ucy4KLQotTW9uIEphbiAxNSAxNzo0NjoyNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBuZXcgUG93ZXJQQyByZWxvY2F0aW9ucy4KLQkqIHtiZmQtaW4yLGxpYmJmZH0uaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIG1vcmUgUFBDIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTG9va3VwIG5ldyByZWxvY2F0aW9ucy4KLQotTW9uIEphbiAxNSAxNDoyOTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IEZpeCBSRUxPQ19CQVNFMTAgYW5kIFJFTE9DX0JBU0UyMgotCWVudHJpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IERvbid0IGZhaWwgYXNzZXJ0IGlmCi0gICAgICAgIGluZm8tPnNoYXJlZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgdHJ5IHRvIGNhY2hlCi0JaW5mb3JtYXRpb24gaW4gc2VjdGlvbnMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IGEgQkZELiAgRnJvbSBSaWNoYXJkCi0JSGVuZGVyc29uIDxyaWNoYXJkQGF0aGVpc3QudGFtdS5lZHU+LgotCi0JKiBlbGYzMi1taXBzLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZHluYW1pYyBsaW5raW5nIGNvZGUsIG1vc3RseQotCWZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4uCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgc3BlY2lhbCBjaGVjayBmb3IKLQlfcmxkX25ld19pbnRlcmZhY2UuCi0KLQkqIGVjb2Zmc3dhcC5oOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotU3VuIEphbiAxNCAyMTozNjowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jKTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBSZW1vdmUgcHBjX2VsZl97dW5zdXBwb3J0ZWQsc3RkfV9yZWxvYwotCXJlZmVyZW5jZXMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBObyBsb25nZXIgYWxsb3cgLnNkYXRhLy5zYnNzIHNlY3Rpb25zCi0JdG8gc2F0aXNmeSBhIFRPQzE2IHJlbG9jYXRpb24uIAlSZXdyaXRlIHVuc3VwcG9ydGVkIHJlbG9jYXRpb24KLQlzdXBwb3J0LiAgQmVnaW4gc3VwcG9ydCBmb3IgUl9QUENfU0RBezIsfVJFTC4KLQotU2F0IEphbiAxMyAwOTozNjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIHRoZSAuZ290IGFuZCAuZ290Lm5lZyBzZWN0aW9ucy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENhbGwgaXQuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU3VwcG9ydCAuZ290Lm5lZywganVzdCBsaWtlIC5nb3QuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGVycm9yIG1lc3NhZ2VzIGZvciByZWxvY2F0aW9ucyB3ZQotCWRvbid0IHlldCBzdXBwb3J0LiAgRG8gbm90IGluY2x1ZGUgUl9QUENfU0RBUkVMMTYgbGlrZSBhIEdPVAotCXJlbG9jYXRpb24uCi0KLUZyaSBKYW4gMTIgMTU6Mjc6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVmaW5lLCBhbmQgaGFuZGxlIHRoZSBuZXcKLQlzZWN0aW9uIGZsYWdzIGZvciBWLjQgYW5kIGVhYmkuCi0KLUZyaSBKYW4gMTIgMTM6NTk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIGEgc2VnbWVudAotCWNvbnRhaW5zIG5vIHNlY3Rpb25zLCBkb24ndCBtYXJrIGl0IGFzIHJlYWRhYmxlLgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRHVtcCBjb250ZW50cyBvZgotCWR5bmFtaWMgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IEFkZCBzd2FwX2R5bl9pbiBmaWVsZC4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIHBhcmFtZXRlciB0byBQVFIuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvCi0JUFRSLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBJbml0aWFsaXplIHN3YXBfZHluX2luIGZpZWxkLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSBhCi0JRFRfVEVYVFJFTCBlbnRyeSBiZWNhdXNlIG9mIC5yZWwucGx0LiAgRnJvbSBNYXJ0aW4gUGlya2VyCi0JPHBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0Pi4KLQotVGh1IEphbiAxMSAxNzowNjoxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30pOiBOZXcgc2VjdGlvbiBmbGFncyBmb3IKLQlQb3dlclBDIFYuNCBhbmQgZWFiaS4KLSAJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoVEFSR0VUX3tCSUcsTElUVExFfV9TWU0pOiBBZGQgbmV3IGZsYWdzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFN1cHBvcnQgU0hUX09SREVSRUQKLQlzZWN0aW9uIHR5cGUgYW5kIFNIRl9FWENMVURFIHNlY3Rpb24gZmxhZywgdHVybmluZyB0aGVtIGludG8gdGhlCi0JYXBwcm9wcmlhdGUgYmZkIHNlY3Rpb24gZmxhZy4KLQotVGh1IEphbiAxMSAxMToyMzozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ3JlYXRlIHRoZSBzcGVjaWFsCi0Jc2VjdGlvbnMgaWYgd2Ugc2VlIGEgRFlOQU1JQyBvYmplY3QsIGluIGNhc2UgdGhhdCBpcyB0aGUgb25seQotCVhDT0ZGIGlucHV0IG9iamVjdCB3ZSBzZWUuCi0KLQkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGNoYW5nZXMgZm9yIGEgc3RhcnQgYXQgZHluYW1pYyBsaW5raW5nCi0Jc3VwcG9ydCwgZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB0eXBlX2NoYW5nZV9vayBmaWVsZC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUKLQllbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGZpZWxkLiAgQWRkCi0JZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgYW5kCi0JZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwIGZpZWxkcy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayk6IERlZmluZSBpZiBub3QKLQlkZWZpbmVkLgotCShlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogQ2hhbmdlIHRvIGFjY291bnQgZm9yIGZpZWxkIGNoYW5nZXMuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IENhbGwgbmV3Ci0JbW9kaWZ5X3NlZ21lbnRfbWFwIGJhY2tlbmQgZnVuY3Rpb24uICBEb24ndCBjYWxsIG9sZAotCWNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbi4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDYWxsIGFkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIHJhdGhlcgotCXRoYW4gY3JlYXRlX3Byb2dyYW1faGVhZGVycy4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCXR5cGVfY2hhbmdlX29rIGZyb20gbmV3IGJhY2tlbmQgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCB3YXJuIGlmIF9ybGRfbmV3X2ludGVyZmFjZSBpcwotCWRlZmluZWQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMKLQlhIHJlbG9jIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbmFtZSBwcGNfZmxhZ3NfaW5pdCBmaWVsZCB0byBmbGFnc19pbml0LgotCShlbGZfZmxhZ3NfaW5pdCk6IFJlbmFtZSBmcm9tIGVsZl9wcGNfZmxhZ3NfaW5pdC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogVXNlIGVsZl9mbGFnc19pbml0LCBub3QKLQllbGZfcHBjX2ZsYWdzX2luaXQuCi0JKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGhvd3RvX3RhYmxlKTogQ2hhbmdlIHNyY19tYXNrIHRvIDAgZm9yIGFsbAotCXJlbG9jYXRpb24gZW50cmllcy4KLQotVHVlIEphbiAgOSAxNToyMjo1MyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEdXJpbmcgZmluYWwgbGluaywgYWxsb3cKLSAJb3V0cHV0IC5saXRhIHNlY3Rpb24gdG8gYmUgYmlnZ2VyIHRoYW4gNjRrIGJ5IGFkanVzdGluZyBncCB2YWx1ZQotIAlvbiBhIHBlci1pbnB1dCBzZWN0aW9uIGJhc2lzLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3RkYXRhKTogQWRkIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nCi0JZmllbGQuCi0JKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGdwIGZpZWxkLgotCi1UdWUgSmFuICA5IDEyOjAwOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUhhbmRsZSBBbHBoYSBFQ09GRiBjaGFuZ2VzIGluIE9TRi8xIDMuMi4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ2V0X2VsdF9hdF9maWxlcG9zCi0JZmllbGQuCi0JKiBjb2ZmLWFscGhhLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJlcXVpcmUgYW4KLQlBTFBIQV9SX0lHTk9SRSByZWxvYyBhZnRlciBhbiBBTFBIQV9SX0dQRElTUCByZWxvYywgc2luY2UgT1NGLzEKLQkzLjIgZG9lc24ndCBnZW5lcmF0ZSBvbmUuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXApOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3dyaXRlX2FybWFwKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKEFSRlpNQUcpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSBmcm9tCi0JX2JmZF9lY29mZiB0byBhbHBoYV9lY29mZi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZSBnZXRfZWx0X2F0X2ZpbGVwb3MKLQlmaWVsZCBmcm9tIGJhY2tlbmQgc3RydWN0dXJlLCByYXRoZXIgdGhhbiBhbHdheXMgY2FsbGluZwotCV9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZQotCWdldF9lbHRfYXRfZmlsZXBvcyBmaWVsZC4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IE5ldyBmdW5jdGlvbiwgY29waWVkCi0JZnJvbSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2l0aCBtaW5vciBjaGFuZ2VzLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBVc2UgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4uaCAoQkZEX0lOX01FTU9SWSk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYmZkX2luX21lbW9yeSk6IERlZmluZS4KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBEb24ndCB0cnkgdG8gbWFwIGEgQkZEX0lOX01FTU9SWSBmaWxlLgotCShiZmRfd3JpdGUsIGJmZF9zdGF0KTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKGJmZF90ZWxsLCBiZmRfZmx1c2gsIGJmZF9zZWVrKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IENoYW5nZSBpb3N0cmVhbSBmaWVsZCBmcm9tIGNoYXIgKiB0byBQVFIuCi0JKGJmZF9nZXRfc2l6ZSk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfY2xvc2UpOiBJZ25vcmUgQkZEX0lOX01FTU9SWSBmaWxlcy4KLQkoYmZkX29wZW5fZmlsZSk6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcgaW9zdHJlYW0uCi0JKGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBzZXR0aW5nCi0JaW9zdHJlYW0uCi0JKGJmZF9vcGVuc3RyZWFtcik6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBPbmx5IGZzdGF0IGlvc3RyZWFtIGlmCi0JQkZEX0lOX01FTU9SWSBpcyBub3Qgc2V0LgotCSogcmlzY2l4LmMgKHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2dldF9lbHRfYXRfaW5kZXggZmllbGQuCi0JKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX2dldF9lbHRfYXRfaW5kZXguCi0JKGJmZF9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IFJlbmFtZSBmcm9tCi0JYmZkX2dldF9lbHRfYXRfaW5kZXguICBDaGFuZ2UgaW5kZXggcGFyYW1ldGVyIGZyb20gaW50IHRvCi0Jc3ltaW5kZXguCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgpOiBEZWNsYXJlLgotCShfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYW91dC10YXJnZXQuaCAoTVlfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCByZXN0cmljdCBsaW5lCi0JbnVtYmVycyB0byB0aGUgLnRleHQgc2VjdGlvbi4KLQotTW9uIEphbiAgOCAxNzowMDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JSWYgdGhlcmUgaXMgYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24sIGdldCB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcGFydCBmcm9tIGl0LgotCShpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3RvcmUgdGhlIGNvbnRlbnRzIG9mIGEgU0VDX0RFQlVHR0lORwotCXNlY3Rpb24gaW4gbWVtb3J5LgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGllZWVfd3JpdGVfZGVidWdfcGFydCByZXR1cm4uCi0KLVRodSBKYW4gIDQgMTc6MTI6MzcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBBZGQgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChpMzg2ZnJlZWJzZF92ZWMpOiBBZGQgdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGkzODZmcmVlYnNkLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBpMzg2ZnJlZWJzZC5jLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLi4KLQkqIGZyZWVic2QuaDogTmV3IGZpbGUuCi0JKiBpMzg2ZnJlZWJzZC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoaTM4NmZyZWVic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaTM4NmZyZWVic2RfdmVjLgotCSogaTM4NmxpbnV4LmMgKFNFR01FTlRfU0laRSk6IERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCi0JKiBpMzg2bmV0YnNkLmMgKFNFR01FTlRfU0laRSk6ICBEZWZpbmUgYXMgVEFSR0VUX1BBR0VfU0laRQotCi1UaHUgSmFuICA0IDE2OjI3OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9vYmplY3RfcCk6IENhbGwgaXQuCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogTGlrZXdpc2UuCi0JKGluaXRfZm9yX291dHB1dCk6IExpa2V3aXNlLgotCi1XZWQgSmFuICAzIDE5OjQyOjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIEBHT1QgcmVsb2NhdGlvbnMKLQl3b3JrLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEp1c3QgdXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBmb3IgYWxsIGhvd3RvCi0JcmVsb2NzLCBzaW5jZSBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gaGFuZGxlcyB0aGUgbGlua2VyIGNhc2UuCi0JKHBwY19lbGZfe2FkZHIxNl9oYSxnb3QxNix0b2MxNixicnRha2VufV9yZWxvYyk6IERlbGV0ZSwgbm8gbG9uZ2VyCi0JdXNlZC4KLQkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X2lubmVyKTogTWVyZ2UgdGhlc2UgaW50bwotCXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBzaW5jZSB0aGF0IGlzIG5vdyB0aGUgb25seSBjYWxsZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1XZWQgSmFuICAzIDE1OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBkb24ndCBrbm93IHRoZQotCXNlY3Rpb24gb2YgdGhlIGVudHJ5IHBvaW50IGZvciBhbiBYQ09GRiBleGVjdXRhYmxlLCBhbHdheXMgc2V0IHRoZQotCWVudHJ5IGFkZHJlc3MgdG8gLTEuCi0KLVR1ZSBKYW4gIDIgMTQ6MTc6MTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRkIHN1cHBvcnQgZm9yIG5vdGUgc2VjdGlvbnMuCi0KLVR1ZSBKYW4gIDIgMTM6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoc3RydWN0IF9zeW1ib2xfaW5mbyk6IEFkZCBzdGFiX3R5cGUgZmllbGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSk6IFNldCBzdGFiX3R5cGUuCi0KLQkqIGVsZjMyLXBwYy5jOiBSZW1vdmUgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGNhbGxzIHRvCi0gICAgICAgIF9iZmRfZXJyb3JfaGFuZGxlci4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogT25seSB3YXJuIGFib3V0IGVuZGlhbm5lc3MKLQlkaWZmZXJlbmNlIGlmIHRhcmdldCBlbmRpYW5uZXNzIGlzIGtub3duLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk0OTUKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9NYWtlZmlsZS5hbSBiL2JmZC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwYjk5My4uMDAwMDAwMAotLS0gYS9iZmQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjMwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBnY2MgLU1NCi0KLVNVQkRJUlMgPSBkb2MgcG8KLQotZG9jZGlyID0gZG9jCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYmJmZC5sYQotCi1XQVJOX0NGTEFHUyA9IEBXQVJOX0NGTEFHU0AKLUFNX0NGTEFHUyA9ICQoV0FSTl9DRkxBR1MpCi0KLSMgYmZkLmggZ29lcyBoZXJlLCBmb3Igbm93Ci1CRkRfSCA9IGJmZC5oCi0KLSMgSmltIEtpbmdkb24gbm90ZXM6Ci0jIFdyaXRpbmcgUy1yZWNvcmRzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgKG9yIGF0IGxlYXN0IG1vc3QpCi0jICotKi1jb2ZmLCAqLSotYW91dCwgZXRjLiwgY29uZmlndXJhdGlvbnMsIGJlY2F1c2UgcGVvcGxlIHdpbGwgd2FudCB0bwotIyBiZSBhYmxlIHRvIHVzZSBvYmpjb3B5IHRvIGNyZWF0ZSBTLXJlY29yZHMuICAoUy1yZWNvcmRzIGFyZSBub3QgdXNlZnVsCi0jIGZvciB0aGUgZGVidWdnZXIsIHNvIGlmIHlvdSBhcmUgZG93bmxvYWRpbmcgdGhpbmdzIGFzIFMtcmVjb3JkcyB5b3UKLSMgbmVlZCB0d28gY29waWVzIG9mIHRoZSBleGVjdXRhYmxlLCBvbmUgdG8gZG93bmxvYWQgYW5kIG9uZSBmb3IgdGhlCi0jIGRlYnVnZ2VyKS4KLUJGRF9MSUJTID0gXAotCWFyY2hpdmUubG8gYXJjaHVyZXMubG8gYmZkLmxvIGNhY2hlLmxvIGNvZmZnZW4ubG8gY29yZWZpbGUubG8gXAotCWZvcm1hdC5sbyBpbml0LmxvIGxpYmJmZC5sbyBvcG5jbHMubG8gcmVsb2MubG8gXAotCXNlY3Rpb24ubG8gc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIFwKLQlzcmVjLmxvIGJpbmFyeS5sbyB0ZWtoZXgubG8gaWhleC5sbyBzdGFicy5sbyBzdGFiLXN5bXMubG8KLQotQkZEX0xJQlNfQ0ZJTEVTID0gXAotCWFyY2hpdmUuYyBhcmNodXJlcy5jIGJmZC5jIGNhY2hlLmMgY29mZmdlbi5jIGNvcmVmaWxlLmMgXAotCWZvcm1hdC5jIGluaXQuYyBsaWJiZmQuYyBvcG5jbHMuYyByZWxvYy5jIFwKLQlzZWN0aW9uLmMgc3ltcy5jIHRhcmdldHMuYyBoYXNoLmMgbGlua2VyLmMgXAotCXNyZWMuYyBiaW5hcnkuYyB0ZWtoZXguYyBpaGV4LmMgc3RhYnMuYyBzdGFiLXN5bXMuYwotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1hdnIubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWlhNjQubG8gXAotCWNwdS1pMzcwLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wai5sbyBcCi0JY3B1LXBvd2VycGMubG8gXAotCWNwdS1yczYwMDAubG8gXAotCWNwdS1zaC5sbyBcCi0JY3B1LXNwYXJjLmxvIFwKLQljcHUtdGljMzAubG8gXAotCWNwdS10aWM1NHgubG8gXAotCWNwdS10aWM4MC5sbyBcCi0JY3B1LXY4NTAubG8gXAotCWNwdS12YXgubG8gXAotCWNwdS13ZTMyay5sbyBcCi0JY3B1LXc2NS5sbyBcCi0JY3B1LXo4ay5sbwotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWF2ci5jIFwKLQljcHUtZDEwdi5jIFwKLQljcHUtZDMwdi5jIFwKLQljcHUtZnIzMC5jIFwKLQljcHUtaDgzMDAuYyBcCi0JY3B1LWg4NTAwLmMgXAotCWNwdS1ocHBhLmMgXAotCWNwdS1pYTY0LmMgXAotCWNwdS1pMzcwLmMgXAotCWNwdS1pMzg2LmMgXAotCWNwdS1pODYwLmMgXAotCWNwdS1pOTYwLmMgXAotCWNwdS1tMzJyLmMgXAotCWNwdS1tNjhrLmMgXAotCWNwdS1tODhrLmMgXAotCWNwdS1tMTAyMDAuYyBcCi0JY3B1LW0xMDMwMC5jIFwKLQljcHUtbWNvcmUuYyBcCi0JY3B1LW1pcHMuYyBcCi0JY3B1LW5zMzJrLmMgXAotCWNwdS1wai5jIFwKLQljcHUtcG93ZXJwYy5jIFwKLQljcHUtcnM2MDAwLmMgXAotCWNwdS1zaC5jIFwKLQljcHUtc3BhcmMuYyBcCi0JY3B1LXRpYzMwLmMgXAotCWNwdS10aWM1NHguYyBcCi0JY3B1LXRpYzgwLmMgXAotCWNwdS12ODUwLmMgXAotCWNwdS12YXguYyBcCi0JY3B1LXdlMzJrLmMgXAotCWNwdS13NjUuYyBcCi0JY3B1LXo4ay5jCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDMyIGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi1CRkQzMl9CQUNLRU5EUyA9IFwKLQlhb3V0LWFkb2JlLmxvIFwKLQlhb3V0LWFybS5sbyBcCi0JYW91dC1uczMyay5sbyBcCi0JYW91dC1zcGFyY2xlLmxvIFwKLQlhb3V0LXRpYzMwLmxvIFwKLQlhb3V0MC5sbyBcCi0JYW91dDMyLmxvIFwKLQlhcm1uZXRic2QubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzU0eC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjEubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWZpLWFwcC1pYTMyLmxvIFwKLQllbGYubG8gXAotCWVsZjMyLWFyYy5sbyBcCi0JZWxmYXJtLW9hYmkubG8gXAotCWVsZmFybS1uYWJpLmxvIFwKLQllbGYzMi1hdnIubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM3MC5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBqLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwZS1zaC5sbyBcCi0JcGVpLXNoLmxvIFwKLQlwZS1taXBzLmxvIFwKLQlwZWktbWlwcy5sbyBcCi0JcGVpZ2VuLmxvIFwKLQlwcGNib290LmxvIFwKLQlyZWxvYzE2LmxvIFwKLQlyaXNjaXgubG8gXAotCXNwYXJjbGludXgubG8gXAotCXNwYXJjbHlueC5sbyBcCi0Jc3BhcmNuZXRic2QubG8gXAotCXN1bm9zLmxvIFwKLQl2YXhuZXRic2QubG8gXAotCXZlcnNhZG9zLmxvIFwKLQl2bXMubG8gXAotCXZtcy1nc2QubG8gXAotCXZtcy1oZHIubG8gXAotCXZtcy1taXNjLmxvIFwKLQl2bXMtdGlyLmxvIFwKLQl4Y29mZmxpbmsubG8KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYXJtbmV0YnNkLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzU0eC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVmaS1hcHAtaWEzMi5jIFwKLQllbGYuYyBcCi0JZWxmMzItYXJjLmMgXAotCWVsZmFybS1vYWJpLmMgXAotCWVsZmFybS1uYWJpLmMgXAotCWVsZjMyLWF2ci5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzcwLmMgXAotCWVsZjMyLWkzODYuYyBcCi0JZWxmMzItaTg2MC5jIFwKLQllbGYzMi1pOTYwLmMgXAotCWVsZjMyLW0zMnIuYyBcCi0JZWxmMzItbTY4ay5jIFwKLQllbGYzMi1tODhrLmMgXAotCWVsZi1tMTAyMDAuYyBcCi0JZWxmLW0xMDMwMC5jIFwKLQllbGYzMi1tY29yZS5jIFwKLQllbGYzMi1taXBzLmMgXAotCWVsZjMyLXBqLmMgXAotCWVsZjMyLXBwYy5jIFwKLQllbGYzMi1zaC5jIFwKLQllbGYzMi1zcGFyYy5jIFwKLQllbGYzMi12ODUwLmMgXAotCWVsZjMyLmMgXAotCWVsZmxpbmsuYyBcCi0JZXBvYy1wZS1hcm0uYyBcCi0JZXBvYy1wZWktYXJtLmMgXAotCWhwMzAwYnNkLmMgXAotCWhwMzAwaHB1eC5jIFwKLQlzb20uYyBcCi0JaTM4NmFvdXQuYyBcCi0JaTM4NmJzZC5jIFwKLQlpMzg2ZHluaXguYyBcCi0JaTM4NmZyZWVic2QuYyBcCi0JaTM4NmxpbnV4LmMgXAotCWkzODZseW54LmMgXAotCWkzODZtc2Rvcy5jIFwKLQlpMzg2bmV0YnNkLmMgXAotCWkzODZtYWNoMy5jIFwKLQlpMzg2b3M5ay5jIFwKLQlpZWVlLmMgXAotCW02OGs0a25ldGJzZC5jIFwKLQltNjhrbGludXguYyBcCi0JbTY4a2x5bnguYyBcCi0JbTY4a25ldGJzZC5jIFwKLQltODhrbWFjaDMuYyBcCi0JbWlwc2JzZC5jIFwKLQluZXdzb3MzLmMgXAotCW5sbS5jIFwKLQlubG0zMi1pMzg2LmMgXAotCW5sbTMyLXNwYXJjLmMgXAotCW5sbTMyLXBwYy5jIFwKLQlubG0zMi5jIFwKLQluczMya25ldGJzZC5jIFwKLQlvYXN5cy5jIFwKLQlwYzUzMi1tYWNoLmMgXAotCXBlLWFybS5jIFwKLQlwZWktYXJtLmMgXAotCXBlLWkzODYuYyBcCi0JcGVpLWkzODYuYyBcCi0JcGUtbWNvcmUuYyBcCi0JcGVpLW1jb3JlLmMgXAotCXBlLXBwYy5jIFwKLQlwZWktcHBjLmMgXAotCXBlLXNoLmMgXAotCXBlaS1zaC5jIFwKLQlwZS1taXBzLmMgXAotCXBlaS1taXBzLmMgXAotCXBlaWdlbi5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAotIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KLUJGRDY0X0JBQ0tFTkRTID0gXAotCWFvdXQ2NC5sbyBcCi0JY29mZi1hbHBoYS5sbyBcCi0JY29mZjY0LXJzNjAwMC5sbyBcCi0JZGVtbzY0LmxvIFwKLQllZmktYXBwLWlhNjQubG8gXAotCWVsZjY0LWFscGhhLmxvIFwKLQllbGY2NC1ocHBhLmxvIFwKLQllbGY2NC1pYTY0LmxvIFwKLQllbGY2NC1nZW4ubG8gXAotCWVsZjY0LW1pcHMubG8gXAotCWVsZjY0LXNwYXJjLmxvIFwKLQllbGY2NC5sbyBcCi0JbmxtMzItYWxwaGEubG8gXAotCW5sbTY0LmxvCi0KLUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0NjQuYyBcCi0JY29mZi1hbHBoYS5jIFwKLQljb2ZmNjQtcnM2MDAwLmMgXAotCWRlbW82NC5jIFwKLQllZmktYXBwLWlhNjQuYyBcCi0JZWxmNjQtYWxwaGEuYyBcCi0JZWxmNjQtaHBwYS5jIFwKLQllbGY2NC1pYTY0LmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi1PUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYWl4Mzg2LWNvcmUuYyBcCi0JaHB1eC1jb3JlLmMgXAotCWlyaXgtY29yZS5jIFwKLQlseW54LWNvcmUuYyBcCi0Jb3NmLWNvcmUuYyBcCi0Jc2NvNS1jb3JlLmMgXAotCXRyYWQtY29yZS5jIFwKLQljaXNjby1jb3JlLmMKLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0jIyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgLmggZmlsZXMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2UgdHJlZS4KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaCBcCi0JZWxmLWJmZC5oIGVsZi1ocHBhLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZjY0LWhwcGEuaCBcCi0JZWxmY29kZS5oIGVsZmNvcmUuaCBlbGZsaW5rLmggZnJlZWJzZC5oIGdlbmxpbmsuaCBnbzMyc3R1Yi5oIFwKLQlocHBhX3N0dWJzLmggbGliYW91dC5oIGxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGxpYmhwcGEuaCBcCi0JbGliaWVlZS5oIGxpYm5sbS5oIGxpYm9hc3lzLmggbGlicGVpLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIFwKLQlubG1jb2RlLmggbmxtc3dhcC5oIG5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oIHhjb2ZmLXRhcmdldC5oCi0KLUhGSUxFUyA9IFwKLQllbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCB0YXJnbWF0Y2guaCBcCi0JJChTT1VSQ0VfSEZJTEVTKQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWRpc3RzdHVmZjogaW5mbwotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQotCXJtIC1mIHRvZmlsZXMKLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQllY2hvICQkZiA+IHRvZmlsZXMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKLQl0b3VjaCBzdGFtcC1vZmlsZXMKLQotb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQotCi1saWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQotbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKLWxpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAotbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAotIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQotIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCi0jIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKLWxpYmJmZF9hX1NPVVJDRVMgPQotCi1zdGFtcC1saWI6IGxpYmJmZC5sYQotCWxpYnRvb2xkaXI9YCQoTElCVE9PTCkgLS1jb25maWcgfCBzZWQgLW4gLWUgJ3MvXm9iamRpcj0vL3AnYDsgXAotCWlmIFsgLWYgJCRsaWJ0b29sZGlyL2xpYmJmZC5hIF07IHRoZW4gXAotCSAgY3AgJCRsaWJ0b29sZGlyL2xpYmJmZC5hIGxpYmJmZC50bXA7IFwKLQkgICQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJiZmQuYTogc3RhbXAtbGliIDsgQHRydWUKLQotIyBUaGlzIGZpbGUgaG9sZHMgYW4gYXJyYXkgYXNzb2NpYXRpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBhbmQKLSMgdmVjdG9yIG5hbWVzLiAgSXQgaXMgYnVpbHQgZnJvbSBjb25maWcuYmZkLiAgSXQgaXMgbm90IGNvbXBpbGVkIGJ5Ci0jIGl0c2VsZiwgYnV0IGlzIGluY2x1ZGVkIGJ5IHRhcmdldHMuYy4KLXRhcmdtYXRjaC5oOiBjb25maWcuYmZkIHRhcmdtYXRjaC5zZWQKLQlybSAtZiB0YXJnbWF0Y2guaAotCXNlZCAtZiAkKHNyY2RpcikvdGFyZ21hdGNoLnNlZCA8ICQoc3JjZGlyKS9jb25maWcuYmZkID4gdGFyZ21hdGNoLm5ldwotCW12IC1mIHRhcmdtYXRjaC5uZXcgdGFyZ21hdGNoLmgKLQotIyBXaGVuIGNvbXBpbGluZyBhcmNodXJlcy5jIGFuZCB0YXJnZXRzLmMsIHN1cHBseSB0aGUgZGVmYXVsdCB0YXJnZXQKLSMgaW5mbyBmcm9tIGNvbmZpZ3VyZS4KLQotdGFyZ2V0cy5sbzogdGFyZ2V0cy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS90YXJnZXRzLmMKLQotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL2FyY2h1cmVzLmMKLQotZWxmMzItdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjMyLXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vMzIvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjMyLXRhcmdldC5uZXcKLQltdiAtZiBlbGYzMi10YXJnZXQubmV3IGVsZjMyLXRhcmdldC5oCi0KLWVsZjY0LXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGY2NC10YXJnZXQuaAotCXNlZCAtZSBzL05OLzY0L2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGY2NC10YXJnZXQubmV3Ci0JbXYgLWYgZWxmNjQtdGFyZ2V0Lm5ldyBlbGY2NC10YXJnZXQuaAotCi1CRkRfSF9ERVBTPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTPSBsaWJiZmQuaCBzeXNkZXAuaCBjb25maWcuaAotJChCRkRfTElCUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9NQUNISU5FUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKE9QVElPTkFMX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLQotIyBJbnN0YWxsIEJGRCBpbmNsdWRlIGZpbGUsIGFuZCBvdGhlcnMgdGhhdCBpdCBuZWVkcy4KLWluc3RhbGwtZGF0YS1sb2NhbDogJChCRkRfSCkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikKLQkkKElOU1RBTExfREFUQSkgJChCRkRfSCkgJChpbmNsdWRlZGlyKS9iZmQuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKGluY2x1ZGVkaXIpL2Fuc2lkZWNsLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2JmZGxpbmsuaCAkKGluY2x1ZGVkaXIpL2JmZGxpbmsuaAotCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBiZmQuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSIkKE1LREVQKSIgREVQMQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+ICRACi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiAkQAotCi1ERVAxOiAkKENGSUxFUykKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQllY2hvICcjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuJyA+PiBERVAyCi0JJChNS0RFUCkgJChJTkNMVURFUykgJChDRkxBR1MpICQ/ID4+IERFUDIKLQltdiAtZiBERVAyICRACi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLU1PU1RMWUNMRUFORklMRVMgPSBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCBvZmlsZXMgc3RhbXAtb2ZpbGVzIFwKLQl0YXJnbWF0Y2guaAotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIERFUCBERVAxIERFUDIgbGliYmZkLmEgc3RhbXAtbGliIFwKLQlzdG1wLWJpbjItaCBzdG1wLWxiZmQtaCBzdG1wLWxjb2ZmLWgKLQotIyBXZSB3YW50IHRvIHJlcnVuIGNvbmZpZ3VyZSBpZiBjb25maWcuYmZkIG9yIGNvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy5iZmQgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaAotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1iZmQubG86IGJmZC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotY29yZWZpbGUubG86IGNvcmVmaWxlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1mb3JtYXQubG86IGZvcm1hdC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotaW5pdC5sbzogaW5pdC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotbGliYmZkLmxvOiBsaWJiZmQuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9vYmphbGxvYy5oCi1yZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaAotc2VjdGlvbi5sbzogc2VjdGlvbi5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9mbm1hdGNoLmggXAotICB0YXJnbWF0Y2guaAotaGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvb2JqYWxsb2MuaAotbGlua2VyLmxvOiBsaW5rZXIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaAotc3JlYy5sbzogc3JlYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi10ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWloZXgubG86IGloZXguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1hcmMubG86IGNwdS1hcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1hcm0ubG86IGNwdS1hcm0uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1hdnIubG86IGNwdS1hdnIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1kMTB2LmxvOiBjcHUtZDEwdi5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWQzMHYubG86IGNwdS1kMzB2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtaDg1MDAubG86IGNwdS1oODUwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtaWE2NC5sbzogY3B1LWlhNjQuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY3B1LWlhNjQtb3BjLmMgXAotICAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9pYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oCi1jcHUtaTM3MC5sbzogY3B1LWkzNzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWk4NjAubG86IGNwdS1pODYwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtaTk2MC5sbzogY3B1LWk5NjAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW02OGsubG86IGNwdS1tNjhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtbTg4ay5sbzogY3B1LW04OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1tY29yZS5sbzogY3B1LW1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIG5zMzJrLmgKLWNwdS1wai5sbzogY3B1LXBqLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1zaC5sbzogY3B1LXNoLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS10aWM1NHgubG86IGNwdS10aWM1NHguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS10aWM4MC5sbzogY3B1LXRpYzgwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS12YXgubG86IGNwdS12YXguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS13ZTMyay5sbzogY3B1LXdlMzJrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtejhrLmxvOiBjcHUtejhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1hb3V0LWFkb2JlLmxvOiBhb3V0LWFkb2JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0eC5oCi1hb3V0MC5sbzogYW91dDAuYyBhb3V0ZjEuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1hb3V0MzIubG86IGFvdXQzMi5jIGFvdXR4LmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWFybW5ldGJzZC5sbzogYXJtbmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotYm91dC5sbzogYm91dC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZ2VubGluay5oICQoSU5DRElSKS9ib3V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaAotY2YtaTM4Nmx5bngubG86IGNmLWkzODZseW54LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLW02OGtseW54LmxvOiBjZi1tNjhrbHlueC5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYTI5ay5sbzogY29mZi1hMjlrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXBvbGxvLmxvOiBjb2ZmLWFwb2xsby5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Fwb2xsby5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXJtLmxvOiBjb2ZmLWFybS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXV4LmxvOiBjb2ZmLWF1eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4NTAwLmxvOiBjb2ZmLWg4NTAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWkzODYubG86IGNvZmYtaTM4Ni5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk4NjAubG86IGNvZmYtaTg2MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWdvMzIubG86IGNvZmYtZ28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk5NjAubG86IGNvZmYtaTk2MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW02OGsubG86IGNvZmYtbTY4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW04OGsubG86IGNvZmYtbTg4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW1pcHMubG86IGNvZmYtbWlwcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1jb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICB4Y29mZi10YXJnZXQuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtcnM2MDAwLmxvOiBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCB4Y29mZi10YXJnZXQuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3NoLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3RnbzMyLmxvOiBjb2ZmLXN0Z28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2dvMzJleGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0gIGdvMzJzdHViLmgKLWNvZmYtc3ZtNjhrLmxvOiBjb2ZmLXN2bTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzU0eC5sbzogY29mZi10aWM1NHguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzU0eC5oICQoSU5DRElSKS9jb2ZmL3RpLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljODAubG86IGNvZmYtdGljODAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdTY4ay5sbzogY29mZi11NjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvd2UzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdzY1LmxvOiBjb2ZmLXc2NS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvdzY1LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtejhrLmxvOiBjb2ZmLXo4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmZsaW5rLmxvOiBjb2ZmbGluay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLWR3YXJmMS5sbzogZHdhcmYxLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubG86IGVjb2ZmLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29iamFsbG9jLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVmaS1hcHAtaWEzMi5sbzogZWZpLWFwcC1pYTMyLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggXAotICBwZWljb2RlLmggbGlicGVpLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmMzItYXZyLmxvOiBlbGYzMi1hdnIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2F2ci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMzB2LmxvOiBlbGYzMi1kMzB2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWhwcGEubG86IGVsZjMyLWhwcGEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgbGliaHBwYS5oIGVsZjMyLWhwcGEuaCBlbGYtaHBwYS5oIGhwcGFfc3R1YnMuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM3MC5sbzogZWxmMzItaTM3MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvaTM3MC5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk5NjAubG86IGVsZjMyLWk5NjAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2k5NjAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW0zMnIubG86IGVsZjMyLW0zMnIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW02OGsubG86IGVsZjMyLW02OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL202OGsuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW04OGsubG86IGVsZjMyLW04OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDIwMC5sbzogZWxmLW0xMDIwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tY29yZS5sbzogZWxmMzItbWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21jb3JlLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1taXBzLmxvOiBlbGYzMi1taXBzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wai5sbzogZWxmMzItcGouYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3BqLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi12ODUwLmxvOiBlbGYzMi12ODUwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi5sbzogZWxmMzIuYyBlbGZjb2RlLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggZWxmY29yZS5oIGVsZmxpbmsuaAotZWxmbGluay5sbzogZWxmbGluay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lcG9jLXBlLWFybS5sbzogZXBvYy1wZS1hcm0uYyBwZS1hcm0uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggXAotICBwZWljb2RlLmggbGlicGVpLmgKLWVwb2MtcGVpLWFybS5sbzogZXBvYy1wZWktYXJtLmMgcGVpLWFybS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotaHAzMDBic2QubG86IGhwMzAwYnNkLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotc29tLmxvOiBzb20uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWkzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2ZHluaXgubG86IGkzODZkeW5peC5jICQoSU5DRElSKS9hb3V0L2R5bml4My5oIGFvdXR4LmggXAotICAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1pMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2bHlueC5sbzogaTM4Nmx5bnguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1pMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2b3M5ay5sbzogaTM4Nm9zOWsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvb3M5ay5oCi1pZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9pZWVlLmggXAotICBsaWJpZWVlLmgKLW02OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1tNjhrbHlueC5sbzogbTY4a2x5bnguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1taXBzYnNkLmxvOiBtaXBzYnNkLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1ubG0zMi1pMzg2LmxvOiBubG0zMi1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggXAotICBubG0tdGFyZ2V0LmgKLW5sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJubG0uaCBcCi0gICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbnMzMmtuZXRic2QubG86IG5zMzJrbmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9vYXN5cy5oIFwKLSAgbGlib2FzeXMuaAotcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtYXJtLmMgXAotICAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBcCi0gIGxpYnBlaS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtYXJtLmMgXAotICAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBcCi0gIGxpYnBlaS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtaTM4Ni5jIFwKLSAgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLWkzODYuYyBcCi0gICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBcCi0gIGxpYnBlaS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY29mZi1tY29yZS5jIFwKLSAgJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBcCi0gIGxpYnBlaS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLW1jb3JlLmMgXAotICAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtcHBjLmMgXAotICAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLXBwYy5jIFwKLSAgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggXAotICBwZWljb2RlLmggbGlicGVpLmgKLXBlLXNoLmxvOiBwZS1zaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3NoLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktc2gubG86IHBlaS1zaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLXNoLmMgXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlLW1pcHMubG86IHBlLW1pcHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvbWlwc3BlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLW1pcHMubG86IHBlaS1taXBzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIHBlLW1pcHMuYyBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHNwZS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlaWdlbi5sbzogcGVpZ2VuLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGxpYnBlaS5oCi1wcGNib290LmxvOiBwcGNib290LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1yZWxvYzE2LmxvOiByZWxvYzE2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbHlueC5sbzogc3BhcmNseW54LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotc3BhcmNuZXRic2QubG86IHNwYXJjbmV0YnNkLmMgbmV0YnNkLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi12bXMubG86IHZtcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgdm1zLmgKLXZtcy1nc2QubG86IHZtcy1nc2QuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHZtcy5oCi12bXMtaGRyLmxvOiB2bXMtaGRyLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICB2bXMuaAotdm1zLW1pc2MubG86IHZtcy1taXNjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICB2bXMuaAotdm1zLXRpci5sbzogdm1zLXRpci5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgdm1zLmgKLXhjb2ZmbGluay5sbzogeGNvZmZsaW5rLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGNvZmZzd2FwLmggZWNvZmZzd2FwLmgKLWNvZmY2NC1yczYwMDAubG86IGNvZmY2NC1yczYwMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNms2NC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggeGNvZmYtdGFyZ2V0LmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWVmaS1hcHAtaWE2NC5sbzogZWZpLWFwcC1pYTY0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgY29mZi1pYTY0LmMgJChJTkNESVIpL2NvZmYvaWE2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggXAotICBwZWljb2RlLmggbGlicGVpLmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYWxwaGEuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBsaWJjb2ZmLmggXAotICBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1ocHBhLmxvOiBlbGY2NC1ocHBhLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGxpYmhwcGEuaCBlbGY2NC1ocHBhLmggZWxmLWhwcGEuaCBlbGY2NC10YXJnZXQuaAotZWxmNjQtaWE2NC5sbzogZWxmNjQtaWE2NC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oICQoSU5DRElSKS9lbGYvaWE2NC5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGY2NC10YXJnZXQuaAotZWxmNjQtZ2VuLmxvOiBlbGY2NC1nZW4uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggXAotICBlY29mZnN3YXAuaCBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQubG86IGVsZjY0LmMgZWxmY29kZS5oICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIFwKLSAgbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotaXJpeC1jb3JlLmxvOiBpcml4LWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLXNjbzUtY29yZS5sbzogc2NvNS1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXRyYWQtY29yZS5sbzogdHJhZC1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmluIGIvYmZkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkyZjMyLi4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE3NjIgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLUJGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLUJGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ09SRUZJTEUgPSBAQ09SRUZJTEVACi1DT1JFRkxBRyA9IEBDT1JFRkxBR0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XSU4zMkxERkxBR1MgPSBAV0lOMzJMREZMQUdTQAotV0lOMzJMSUJBREQgPSBAV0lOMzJMSUJBRERACi1hbGxfYmFja2VuZHMgPSBAYWxsX2JhY2tlbmRzQAotYmZkX2JhY2tlbmRzID0gQGJmZF9iYWNrZW5kc0AKLWJmZF9tYWNoaW5lcyA9IEBiZmRfbWFjaGluZXNACi1sID0gQGxACi10ZGVmYXVsdHMgPSBAdGRlZmF1bHRzQAotd29yZHNpemUgPSBAd29yZHNpemVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUNTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKElOQ0RJUikKLU1LREVQID0gZ2NjIC1NTQotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotV0FSTl9DRkxBR1MgPSBAV0FSTl9DRkxBR1NACi1BTV9DRkxBR1MgPSAkKFdBUk5fQ0ZMQUdTKQotCi0jIGJmZC5oIGdvZXMgaGVyZSwgZm9yIG5vdwotQkZEX0ggPSBiZmQuaAotCi0jIEppbSBLaW5nZG9uIG5vdGVzOgotIyBXcml0aW5nIFMtcmVjb3JkcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIChvciBhdCBsZWFzdCBtb3N0KQotIyAqLSotY29mZiwgKi0qLWFvdXQsIGV0Yy4sIGNvbmZpZ3VyYXRpb25zLCBiZWNhdXNlIHBlb3BsZSB3aWxsIHdhbnQgdG8KLSMgYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byBjcmVhdGUgUy1yZWNvcmRzLiAgKFMtcmVjb3JkcyBhcmUgbm90IHVzZWZ1bAotIyBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBpZiB5b3UgYXJlIGRvd25sb2FkaW5nIHRoaW5ncyBhcyBTLXJlY29yZHMgeW91Ci0jIG5lZWQgdHdvIGNvcGllcyBvZiB0aGUgZXhlY3V0YWJsZSwgb25lIHRvIGRvd25sb2FkIGFuZCBvbmUgZm9yIHRoZQotIyBkZWJ1Z2dlcikuCi1CRkRfTElCUyA9IFwKLQlhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIGNvcmVmaWxlLmxvIFwKLQlmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIFwKLQlzZWN0aW9uLmxvIHN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBcCi0Jc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIGloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCi0KLQotQkZEX0xJQlNfQ0ZJTEVTID0gXAotCWFyY2hpdmUuYyBhcmNodXJlcy5jIGJmZC5jIGNhY2hlLmMgY29mZmdlbi5jIGNvcmVmaWxlLmMgXAotCWZvcm1hdC5jIGluaXQuYyBsaWJiZmQuYyBvcG5jbHMuYyByZWxvYy5jIFwKLQlzZWN0aW9uLmMgc3ltcy5jIHRhcmdldHMuYyBoYXNoLmMgbGlua2VyLmMgXAotCXNyZWMuYyBiaW5hcnkuYyB0ZWtoZXguYyBpaGV4LmMgc3RhYnMuYyBzdGFiLXN5bXMuYwotCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWF2ci5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaWE2NC5sbyBcCi0JY3B1LWkzNzAubG8gXAotCWNwdS1pMzg2LmxvIFwKLQljcHUtaTg2MC5sbyBcCi0JY3B1LWk5NjAubG8gXAotCWNwdS1tMzJyLmxvIFwKLQljcHUtbTY4ay5sbyBcCi0JY3B1LW04OGsubG8gXAotCWNwdS1tMTAyMDAubG8gXAotCWNwdS1tMTAzMDAubG8gXAotCWNwdS1tY29yZS5sbyBcCi0JY3B1LW1pcHMubG8gXAotCWNwdS1uczMyay5sbyBcCi0JY3B1LXBqLmxvIFwKLQljcHUtcG93ZXJwYy5sbyBcCi0JY3B1LXJzNjAwMC5sbyBcCi0JY3B1LXNoLmxvIFwKLQljcHUtc3BhcmMubG8gXAotCWNwdS10aWMzMC5sbyBcCi0JY3B1LXRpYzU0eC5sbyBcCi0JY3B1LXRpYzgwLmxvIFwKLQljcHUtdjg1MC5sbyBcCi0JY3B1LXZheC5sbyBcCi0JY3B1LXdlMzJrLmxvIFwKLQljcHUtdzY1LmxvIFwKLQljcHUtejhrLmxvCi0KLQotQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKLQljcHUtYTI5ay5jIFwKLQljcHUtYWxwaGEuYyBcCi0JY3B1LWFyYy5jIFwKLQljcHUtYXJtLmMgXAotCWNwdS1hdnIuYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaWE2NC5jIFwKLQljcHUtaTM3MC5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljNTR4LmMgXAotCWNwdS10aWM4MC5jIFwKLQljcHUtdjg1MC5jIFwKLQljcHUtdmF4LmMgXAotCWNwdS13ZTMyay5jIFwKLQljcHUtdzY1LmMgXAotCWNwdS16OGsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDMyIGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi1CRkQzMl9CQUNLRU5EUyA9IFwKLQlhb3V0LWFkb2JlLmxvIFwKLQlhb3V0LWFybS5sbyBcCi0JYW91dC1uczMyay5sbyBcCi0JYW91dC1zcGFyY2xlLmxvIFwKLQlhb3V0LXRpYzMwLmxvIFwKLQlhb3V0MC5sbyBcCi0JYW91dDMyLmxvIFwKLQlhcm1uZXRic2QubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzU0eC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjEubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWZpLWFwcC1pYTMyLmxvIFwKLQllbGYubG8gXAotCWVsZjMyLWFyYy5sbyBcCi0JZWxmYXJtLW9hYmkubG8gXAotCWVsZmFybS1uYWJpLmxvIFwKLQllbGYzMi1hdnIubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM3MC5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBqLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwZS1zaC5sbyBcCi0JcGVpLXNoLmxvIFwKLQlwZS1taXBzLmxvIFwKLQlwZWktbWlwcy5sbyBcCi0JcGVpZ2VuLmxvIFwKLQlwcGNib290LmxvIFwKLQlyZWxvYzE2LmxvIFwKLQlyaXNjaXgubG8gXAotCXNwYXJjbGludXgubG8gXAotCXNwYXJjbHlueC5sbyBcCi0Jc3BhcmNuZXRic2QubG8gXAotCXN1bm9zLmxvIFwKLQl2YXhuZXRic2QubG8gXAotCXZlcnNhZG9zLmxvIFwKLQl2bXMubG8gXAotCXZtcy1nc2QubG8gXAotCXZtcy1oZHIubG8gXAotCXZtcy1taXNjLmxvIFwKLQl2bXMtdGlyLmxvIFwKLQl4Y29mZmxpbmsubG8KLQotCi1CRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dC1hZG9iZS5jIFwKLQlhb3V0LWFybS5jIFwKLQlhb3V0LW5zMzJrLmMgXAotCWFvdXQtc3BhcmNsZS5jIFwKLQlhb3V0LXRpYzMwLmMgXAotCWFvdXQwLmMgXAotCWFvdXQzMi5jIFwKLQlhcm1uZXRic2QuYyBcCi0JYm91dC5jIFwKLQljZi1pMzg2bHlueC5jIFwKLQljZi1tNjhrbHlueC5jIFwKLQljZi1zcGFyY2x5bnguYyBcCi0JY29mZi1hMjlrLmMgXAotCWNvZmYtYXBvbGxvLmMgXAotCWNvZmYtYXJtLmMgXAotCWNvZmYtYXV4LmMgXAotCWNvZmYtaDgzMDAuYyBcCi0JY29mZi1oODUwMC5jIFwKLQljb2ZmLWkzODYuYyBcCi0JY29mZi1pODYwLmMgXAotCWNvZmYtZ28zMi5jIFwKLQljb2ZmLWk5NjAuYyBcCi0JY29mZi1tNjhrLmMgXAotCWNvZmYtbTg4ay5jIFwKLQljb2ZmLW1pcHMuYyBcCi0JY29mZi1wbWFjLmMgXAotCWNvZmYtcnM2MDAwLmMgXAotCWNvZmYtc2guYyBcCi0JY29mZi1zcGFyYy5jIFwKLQljb2ZmLXN0Z28zMi5jIFwKLQljb2ZmLXN2bTY4ay5jIFwKLQljb2ZmLXRpYzMwLmMgXAotCWNvZmYtdGljNTR4LmMgXAotCWNvZmYtdGljODAuYyBcCi0JY29mZi11NjhrLmMgXAotCWNvZmYtd2UzMmsuYyBcCi0JY29mZi13NjUuYyBcCi0JY29mZi16OGsuYyBcCi0JY29mZmxpbmsuYyBcCi0JZHdhcmYxLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWZpLWFwcC1pYTMyLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItYXZyLmMgXAotCWVsZjMyLWQxMHYuYyBcCi0JZWxmMzItZDMwdi5jIFwKLQllbGYzMi1mcjMwLmMgXAotCWVsZjMyLWdlbi5jIFwKLQllbGYzMi1ocHBhLmMgXAotCWVsZjMyLWkzNzAuYyBcCi0JZWxmMzItaTM4Ni5jIFwKLQllbGYzMi1pODYwLmMgXAotCWVsZjMyLWk5NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcGouYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQllcG9jLXBlLWFybS5jIFwKLQllcG9jLXBlaS1hcm0uYyBcCi0JaHAzMDBic2QuYyBcCi0JaHAzMDBocHV4LmMgXAotCXNvbS5jIFwKLQlpMzg2YW91dC5jIFwKLQlpMzg2YnNkLmMgXAotCWkzODZkeW5peC5jIFwKLQlpMzg2ZnJlZWJzZC5jIFwKLQlpMzg2bGludXguYyBcCi0JaTM4Nmx5bnguYyBcCi0JaTM4Nm1zZG9zLmMgXAotCWkzODZuZXRic2QuYyBcCi0JaTM4Nm1hY2gzLmMgXAotCWkzODZvczlrLmMgXAotCWllZWUuYyBcCi0JbTY4azRrbmV0YnNkLmMgXAotCW02OGtsaW51eC5jIFwKLQltNjhrbHlueC5jIFwKLQltNjhrbmV0YnNkLmMgXAotCW04OGttYWNoMy5jIFwKLQltaXBzYnNkLmMgXAotCW5ld3NvczMuYyBcCi0JbmxtLmMgXAotCW5sbTMyLWkzODYuYyBcCi0JbmxtMzItc3BhcmMuYyBcCi0JbmxtMzItcHBjLmMgXAotCW5sbTMyLmMgXAotCW5zMzJrbmV0YnNkLmMgXAotCW9hc3lzLmMgXAotCXBjNTMyLW1hY2guYyBcCi0JcGUtYXJtLmMgXAotCXBlaS1hcm0uYyBcCi0JcGUtaTM4Ni5jIFwKLQlwZWktaTM4Ni5jIFwKLQlwZS1tY29yZS5jIFwKLQlwZWktbWNvcmUuYyBcCi0JcGUtcHBjLmMgXAotCXBlaS1wcGMuYyBcCi0JcGUtc2guYyBcCi0JcGVpLXNoLmMgXAotCXBlLW1pcHMuYyBcCi0JcGVpLW1pcHMuYyBcCi0JcGVpZ2VuLmMgXAotCXBwY2Jvb3QuYyBcCi0JcmVsb2MxNi5jIFwKLQlyaXNjaXguYyBcCi0Jc3BhcmNsaW51eC5jIFwKLQlzcGFyY2x5bnguYyBcCi0Jc3BhcmNuZXRic2QuYyBcCi0Jc3Vub3MuYyBcCi0JdmF4bmV0YnNkLmMgXAotCXZlcnNhZG9zLmMgXAotCXZtcy5jIFwKLQl2bXMtZ3NkLmMgXAotCXZtcy1oZHIuYyBcCi0Jdm1zLW1pc2MuYyBcCi0Jdm1zLXRpci5jIFwKLQl4Y29mZmxpbmsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWNvZmY2NC1yczYwMDAubG8gXAotCWRlbW82NC5sbyBcCi0JZWZpLWFwcC1pYTY0LmxvIFwKLQllbGY2NC1hbHBoYS5sbyBcCi0JZWxmNjQtaHBwYS5sbyBcCi0JZWxmNjQtaWE2NC5sbyBcCi0JZWxmNjQtZ2VuLmxvIFwKLQllbGY2NC1taXBzLmxvIFwKLQllbGY2NC1zcGFyYy5sbyBcCi0JZWxmNjQubG8gXAotCW5sbTMyLWFscGhhLmxvIFwKLQlubG02NC5sbwotCi0KLUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0NjQuYyBcCi0JY29mZi1hbHBoYS5jIFwKLQljb2ZmNjQtcnM2MDAwLmMgXAotCWRlbW82NC5jIFwKLQllZmktYXBwLWlhNjQuYyBcCi0JZWxmNjQtYWxwaGEuYyBcCi0JZWxmNjQtaHBwYS5jIFwKLQllbGY2NC1pYTY0LmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotCi1PUFRJT05BTF9CQUNLRU5EUyA9IFwKLQlhaXgzODYtY29yZS5sbyBcCi0JaHB1eC1jb3JlLmxvIFwKLQlpcml4LWNvcmUubG8gXAotCWx5bngtY29yZS5sbyBcCi0Jb3NmLWNvcmUubG8gXAotCXNjbzUtY29yZS5sbyBcCi0JdHJhZC1jb3JlLmxvIFwKLQljaXNjby1jb3JlLmxvCi0KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaCBcCi0JZWxmLWJmZC5oIGVsZi1ocHBhLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZjY0LWhwcGEuaCBcCi0JZWxmY29kZS5oIGVsZmNvcmUuaCBlbGZsaW5rLmggZnJlZWJzZC5oIGdlbmxpbmsuaCBnbzMyc3R1Yi5oIFwKLQlocHBhX3N0dWJzLmggbGliYW91dC5oIGxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGxpYmhwcGEuaCBcCi0JbGliaWVlZS5oIGxpYm5sbS5oIGxpYm9hc3lzLmggbGlicGVpLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIFwKLQlubG1jb2RlLmggbmxtc3dhcC5oIG5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oIHhjb2ZmLXRhcmdldC5oCi0KLQotSEZJTEVTID0gXAotCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKLQkkKFNPVVJDRV9IRklMRVMpCi0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0gCi0KLUJGRF9IX0RFUFMgPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTID0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLQotQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAotCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYwotCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLQotQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCBERVAgREVQMSBERVAyIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gIGJmZC1pbjMuaAotTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGliYmZkX2FfTElCQUREID0gCi1saWJiZmRfYV9PQkpFQ1RTID0gCi1MVExJQlJBUklFUyA9ICAkKGxpYl9MVExJQlJBUklFUykKLQotbGliYmZkX2xhX09CSkVDVFMgPSAgYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBcCi1jb3JlZmlsZS5sbyBmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIHNlY3Rpb24ubG8gXAotc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIHNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBcCi1paGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYmZkLWluMi5oIGNvbmZpZy5pbiBjb25maWd1cmUgXAotY29uZmlndXJlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gdGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQobGliYmZkX2FfU09VUkNFUykgJChsaWJiZmRfbGFfU09VUkNFUykKLU9CSkVDVFMgPSAkKGxpYmJmZF9hX09CSkVDVFMpICQobGliYmZkX2xhX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5sbyAubyAucwotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1jb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLWJmZC1pbjMuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgYmZkLWluMi5oCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kQDpiZmQtaW4yLmggQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoTElCVE9PTCkgIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQlkb25lCi0KLWxpYmJmZC5sYTogJChsaWJiZmRfbGFfT0JKRUNUUykgJChsaWJiZmRfbGFfREVQRU5ERU5DSUVTKQotCSQoTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYmJmZF9sYV9MREZMQUdTKSAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9MSUJBREQpICQoTElCUykKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWRhdGEtbG9jYWwKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoTFRMSUJSQVJJRVMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGxpYmRpcikKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgbW9zdGx5Y2xlYW4tdGFncyBcCi0JCW1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotCQlkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLWNsZWFuLW5vaW5zdExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKLWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgXAotdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBcCi1pbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgXAotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotZGlzdHN0dWZmOiBpbmZvCi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlsaWJ0b29sZGlyPWAkKExJQlRPT0wpIC0tY29uZmlnIHwgc2VkIC1uIC1lICdzL15vYmpkaXI9Ly9wJ2A7IFwKLQlpZiBbIC1mICQkbGlidG9vbGRpci9saWJiZmQuYSBdOyB0aGVuIFwKLQkgIGNwICQkbGlidG9vbGRpci9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0iJChNS0RFUCkiIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiAkQAotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gJEAKLQotREVQMTogJChDRklMRVMpCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JZWNobyAnIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLicgPj4gREVQMgotCSQoTUtERVApICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPyA+PiBERVAyCi0JbXYgLWYgREVQMiAkQAotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotaG9zdC1hb3V0LmxvOiBNYWtlZmlsZQotCi0jIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSBjb25maWcgZmlsZQotIyB3aGljaCBjYW4gYmUgZm9sZGVkIGludG8gYW4gaC1YWFggZmlsZSBmb3IgYSBuZXcgaG9zdCwgd2l0aCBzb21lIGVkaXRpbmcuCi1hb3V0LXBhcmFtcy5oOiBnZW4tYW91dAotCS4vZ2VuLWFvdXQgaG9zdCA+IGFvdXQtcGFyYW1zLmgKLWdlbi1hb3V0OiAkKHNyY2RpcikvZ2VuLWFvdXQuYyBNYWtlZmlsZQotCSQoQ0MpIC1vIGdlbi1hb3V0ICQoQ0ZMQUdTKSAkKExGTEFHUykgJChzcmNkaXIpL2dlbi1hb3V0LmMKLQotJChCRkRfSCk6IHN0bXAtYmZkLWggOyBAdHJ1ZQotCi1zdG1wLWJmZC1oOiBiZmQtaW4zLmgKLQlybSAtZiBiZmQtdG1wLmgKLQljcCBiZmQtaW4zLmggYmZkLXRtcC5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC10bXAuaCAkKEJGRF9IKQotCXJtIC1mIGJmZC10bXAuaAotCXRvdWNoIHN0bXAtYmZkLWgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLSMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWJmZC5sbzogYmZkLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1jYWNoZS5sbzogY2FjaGUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1jb3JlZmlsZS5sbzogY29yZWZpbGUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWZvcm1hdC5sbzogZm9ybWF0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1pbml0LmxvOiBpbml0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1saWJiZmQubG86IGxpYmJmZC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotb3BuY2xzLmxvOiBvcG5jbHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oCi1zZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmgKLXN5bXMubG86IHN5bXMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2ZubWF0Y2guaCBcCi0gIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9vYmphbGxvYy5oCi1saW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZ2VubGluay5oCi1zcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotYmluYXJ5LmxvOiBiaW5hcnkuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotaWhleC5sbzogaWhleC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN0YWJzLmxvOiBzdGFicy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0YWItc3ltcy5sbzogc3RhYi1zeW1zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotY3B1LWEyOWsubG86IGNwdS1hMjlrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWFyYy5sbzogY3B1LWFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWFybS5sbzogY3B1LWFybS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWF2ci5sbzogY3B1LWF2ci5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtZDMwdi5sbzogY3B1LWQzMHYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1mcjMwLmxvOiBjcHUtZnIzMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtaHBwYS5sbzogY3B1LWhwcGEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1pYTY0LmxvOiBjcHUtaWE2NC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjcHUtaWE2NC1vcGMuYyBcCi0gICQoc3JjZGlyKS8uLi9vcGNvZGVzL2lhNjQtb3BjLmggJChJTkNESVIpL29wY29kZS9pYTY0LmgKLWNwdS1pMzcwLmxvOiBjcHUtaTM3MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LWkzODYubG86IGNwdS1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1pOTYwLmxvOiBjcHUtaTk2MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW0zMnIubG86IGNwdS1tMzJyLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1tODhrLmxvOiBjcHUtbTg4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW0xMDIwMC5sbzogY3B1LW0xMDIwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1taXBzLmxvOiBjcHUtbWlwcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbnMzMmsuaAotY3B1LXBqLmxvOiBjcHUtcGouYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1wb3dlcnBjLmxvOiBjcHUtcG93ZXJwYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXNoLmxvOiBjcHUtc2guYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS1zcGFyYy5sbzogY3B1LXNwYXJjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXRpYzU0eC5sbzogY3B1LXRpYzU0eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS12ODUwLmxvOiBjcHUtdjg1MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXZheC5sbzogY3B1LXZheC5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS13NjUubG86IGNwdS13NjUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWNwdS16OGsubG86IGNwdS16OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLWFvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvYWRvYmUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1hcm0ubG86IGFvdXQtYXJtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWFvdXQtbnMzMmsubG86IGFvdXQtbnMzMmsuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIG5zMzJrLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtc3BhcmNsZS5sbzogYW91dC1zcGFyY2xlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCBhb3V0ZjEuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKLWFvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWFvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotYXJtbmV0YnNkLmxvOiBhcm1uZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCi1jZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2YtbTY4a2x5bngubG86IGNmLW02OGtseW54LmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLXNwYXJjbHlueC5sbzogY2Ytc3BhcmNseW54LmMgY29mZi1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcm0ubG86IGNvZmYtYXJtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hdXgubG86IGNvZmYtYXV4LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2F1eC1jb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCBjb2ZmLW02OGsuYyBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODMwMC5sbzogY29mZi1oODMwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZ2VubGluay5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2k4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTk2MC5sbzogY29mZi1pOTYwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTY4ay5sbzogY29mZi1tNjhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTg4ay5sbzogY29mZi1tODhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL204OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbWlwcy5sbzogY29mZi1taXBzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBsaWJjb2ZmLmggXAotICBsaWJlY29mZi5oIGNvZmZzd2FwLmggZWNvZmZzd2FwLmgKLWNvZmYtcG1hYy5sbzogY29mZi1wbWFjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHhjb2ZmLXRhcmdldC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1yczYwMDAubG86IGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHhjb2ZmLXRhcmdldC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zaC5sbzogY29mZi1zaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvc2guaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zcGFyYy5sbzogY29mZi1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvZ28zMmV4ZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLSAgZ28zMnN0dWIuaAotY29mZi1zdm02OGsubG86IGNvZmYtc3ZtNjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljMzAubG86IGNvZmYtdGljMzAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljNTR4LmxvOiBjb2ZmLXRpYzU0eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljNTR4LmggJChJTkNESVIpL2NvZmYvdGkuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWM4MC5sbzogY29mZi10aWM4MC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvdGljODAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi11NjhrLmxvOiBjb2ZmLXU2OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13ZTMyay5sbzogY29mZi13ZTMyay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi93NjUuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi96OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAotZHdhcmYxLmxvOiBkd2FyZjEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZi5oCi1kd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2FvdXQvcmFubGliLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVjb2ZmbGluay5sbzogZWNvZmZsaW5rLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JqYWxsb2MuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWZpLWFwcC1pYTMyLmxvOiBlZmktYXBwLWlhMzIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItYXJtLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1hdnIubG86IGVsZjMyLWF2ci5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYXZyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZnIzMC5sbzogZWxmMzItZnIzMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZ2VuLmxvOiBlbGYzMi1nZW4uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaHBwYS5sbzogZWxmMzItaHBwYS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBsaWJocHBhLmggZWxmMzItaHBwYS5oIGVsZi1ocHBhLmggaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzcwLmxvOiBlbGYzMi1pMzcwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pMzcwLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWkzODYubG86IGVsZjMyLWkzODYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk4NjAubG86IGVsZjMyLWk4NjAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvaTk2MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMjAwLmxvOiBlbGYtbTEwMjAwLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAzMDAubG86IGVsZi1tMTAzMDAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvbWlwcy5oIGVjb2Zmc3dhcC5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBqLmxvOiBlbGYzMi1wai5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvcGouaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBwYy5sbzogZWxmMzItcHBjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNoLmxvOiBlbGYzMi1zaC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNwYXJjLmxvOiBlbGYzMi1zcGFyYy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBlbGZjb3JlLmggZWxmbGluay5oCi1lbGZsaW5rLmxvOiBlbGZsaW5rLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVwb2MtcGUtYXJtLmxvOiBlcG9jLXBlLWFybS5jIHBlLWFybS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotZXBvYy1wZWktYXJtLmxvOiBlcG9jLXBlaS1hcm0uYyBwZWktYXJtLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIFwKLSAgcGVpY29kZS5oIGxpYnBlaS5oCi1ocDMwMGJzZC5sbzogaHAzMDBic2QuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKLSAgYW91dHguaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotaTM4NmFvdXQubG86IGkzODZhb3V0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmJzZC5sbzogaTM4NmJzZC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWkzODZmcmVlYnNkLmxvOiBpMzg2ZnJlZWJzZC5jIGZyZWVic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtc2Rvcy5sbzogaTM4Nm1zZG9zLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWkzODZuZXRic2QubG86IGkzODZuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9vczlrLmgKLWllZWUubG86IGllZWUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2llZWUuaCBcCi0gIGxpYmllZWUuaAotbTY4azRrbmV0YnNkLmxvOiBtNjhrNGtuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtuZXRic2QubG86IG02OGtuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tODhrbWFjaDMubG86IG04OGttYWNoMy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1uZXdzb3MzLmxvOiBuZXdzb3MzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbmxtLmxvOiBubG0uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL25sbS9pMzg2LWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItc3BhcmMubG86IG5sbTMyLXNwYXJjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL25sbS9zcGFyYzMyLWV4dC5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBcCi0gIG5sbS10YXJnZXQuaAotbmxtMzItcHBjLmxvOiBubG0zMi1wcGMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL25sbS9wcGMtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1vYXN5cy5sbzogb2FzeXMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL29hc3lzLmggXAotICBsaWJvYXN5cy5oCi1wYzUzMi1tYWNoLmxvOiBwYzUzMi1tYWNoLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotcGUtYXJtLmxvOiBwZS1hcm0uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY29mZi1hcm0uYyBcCi0gICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlaS1hcm0ubG86IHBlaS1hcm0uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY29mZi1hcm0uYyBcCi0gICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlLWkzODYubG86IHBlLWkzODYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY29mZi1pMzg2LmMgXAotICAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotcGVpLWkzODYubG86IHBlaS1pMzg2LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtaTM4Ni5jIFwKLSAgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlLW1jb3JlLmxvOiBwZS1tY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBjb2ZmLW1jb3JlLmMgXAotICAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLXBlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtbWNvcmUuYyBcCi0gICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotcGUtcHBjLmxvOiBwZS1wcGMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggY29mZi1wcGMuYyBcCi0gICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIFwKLSAgcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktcHBjLmxvOiBwZWktcHBjLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtcHBjLmMgXAotICAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotcGUtc2gubG86IHBlLXNoLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvc2guaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1zaC5sbzogcGVpLXNoLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGNvZmYtc2guYyBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotcGUtbWlwcy5sbzogcGUtbWlwcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvY29mZi9taXBzcGUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktbWlwcy5sbzogcGVpLW1pcHMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggcGUtbWlwcy5jIFwKLSAgJChJTkNESVIpL2NvZmYvbWlwc3BlLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotcGVpZ2VuLmxvOiBwZWlnZW4uYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGlicGVpLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAotcmlzY2l4LmxvOiByaXNjaXguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1zdW5vcy5sbzogc3Vub3MuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBhb3V0ZjEuaCBcCi0gICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi12YXhuZXRic2QubG86IHZheG5ldGJzZC5jIG5ldGJzZC5oICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1hb3V0NjQubG86IGFvdXQ2NC5jIGFvdXR4LmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotY29mZjY0LXJzNjAwMC5sbzogY29mZjY0LXJzNjAwMC5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2azY0LmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCB4Y29mZi10YXJnZXQuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWRlbW82NC5sbzogZGVtbzY0LmMgYW91dGYxLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotZWZpLWFwcC1pYTY0LmxvOiBlZmktYXBwLWlhNjQuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBjb2ZmLWlhNjQuYyAkKElOQ0RJUikvY29mZi9pYTY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBcCi0gIHBlaWNvZGUuaCBsaWJwZWkuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hbHBoYS5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWhwcGEubG86IGVsZjY0LWhwcGEuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgbGliaHBwYS5oIGVsZjY0LWhwcGEuaCBlbGYtaHBwYS5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1pYTY0LmxvOiBlbGY2NC1pYTY0LmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9pYTY0LmggJChJTkNESVIpL2VsZi9pYTY0LmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1taXBzLmxvOiBlbGY2NC1taXBzLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBcCi0gIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2ZpbGVuYW1lcy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggZWxmY29yZS5oIGVsZmxpbmsuaAotbmxtMzItYWxwaGEubG86IG5sbTMyLWFscGhhLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oIFwKLSAgJChJTkNESVIpL25sbS9hbHBoYS1leHQuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggXAotICBubG0tdGFyZ2V0LmgKLW5sbTY0LmxvOiBubG02NC5jIG5sbWNvZGUuaCAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGlibmxtLmggXAotICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMgJChJTkNESVIpL2ZpbGVuYW1lcy5oCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotbHlueC1jb3JlLmxvOiBseW54LWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmgKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyAkKElOQ0RJUikvZmlsZW5hbWVzLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotY2lzY28tY29yZS5sbzogY2lzY28tY29yZS5jICQoSU5DRElSKS9maWxlbmFtZXMuaAotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9QT1JUSU5HIGIvYmZkL1BPUlRJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmZkNzcuLjAwMDAwMDAKLS0tIGEvYmZkL1BPUlRJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0JUHJlbGltaW5hcnkgTm90ZXMgb24gUG9ydGluZyBCRkQKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgJ2hvc3QnIGlzIHRoZSBzeXN0ZW0gYSB0b29sIHJ1bnMgKm9uKi4KLVRoZSAndGFyZ2V0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpmb3IqLCBpLmUuCi1hIHRvb2wgY2FuIHJlYWQvd3JpdGUgdGhlIGJpbmFyaWVzIG9mIHRoZSB0YXJnZXQuCi0KLVBvcnRpbmcgdG8gYSBuZXcgaG9zdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciBob3N0LiBDYWxsIHRoYXQgPGhvc3Q+LgotKDxob3N0PiBtaWdodCBiZSBzdW40LCAuLi4pCi1DcmVhdGUgYSBmaWxlIGhvc3RzLzxob3N0Pi5taC4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciB0YXJnZXQuIENhbGwgdGhhdCA8dGFyZ2V0Pi4KLUNhbGwgdGhlIG5hbWUgZm9yIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSA8Y3B1Pi4KLVlvdSBuZWVkIHRvIGNyZWF0ZSA8dGFyZ2V0Pi5jIGFuZCBjb25maWcvPHRhcmdldD4ubXQsCi1hbmQgYWRkIGEgY2FzZSBmb3IgaXQgdG8gYSBjYXNlIHN0YXRlbWVudHMgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0IGFuZAotYmZkL2NvbmZpZy5iZmQsIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCBjYW5vbmljYWwgaG9zdCB0eXBlIHdpdGggYSBCRkQKLWhvc3QgdHlwZSAodXNlZCBhcyB0aGUgYmFzZSBvZiB0aGUgbWFrZWZpbGUgZnJhZ21lbnQgbmFtZXMpLCBhbmQgdG8gdGhlCi10YWJsZSBpbiBiZmQvY29uZmlndXJlLmluIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCB0YXJnZXQgdmVjdG9yIHdpdGgKLXRoZSAubyBmaWxlcyBpdCB1c2VzLgotCi1jb25maWcvPHRhcmdldD4ubXQgaXMgYSBNYWtlZmlsZSBmcmFnbWVudC4KLVRoZSBmb2xsb3dpbmcgaXMgdXN1YWxseSBlbm91Z2g6Ci1ERUZBVUxUX1ZFQ1RPUj08dGFyZ2V0Pl92ZWMKLVNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF88Y3B1Pl9hcmNoCi0KLVNlZSB0aGUgbGlzdCBvZiBjcHUgdHlwZXMgaW4gYXJjaHVyZXMuYywgb3IgImxzIGNwdS0qLmMiLgotSWYgeW91ciBhcmNoaXRlY3R1cmUgaXMgbmV3LCB5b3UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIHRhYmxlcwotaW4gYmZkL2FyY2h1cmVzLmMsIG9wY29kZXMvY29uZmlndXJlLmluLCBhbmQgYmludXRpbHMvb2JqZHVtcC5jLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAubXQgYW5kIC5taCBmaWxlcywgc2VlIGNvbmZpZy9SRUFETUUuCi0KLVRoZSBmaWxlIDx0YXJnZXQ+LmMgaXMgdGhlIGhhcmQgcGFydC4gIEl0IGltcGxlbWVudHMgdGhlCi1iZmRfdGFyZ2V0IDx0YXJnZXQ+X3ZlYywgd2hpY2ggaW5jbHVkZXMgcG9pbnRlcnMgdG8KLWZ1bmN0aW9ucyB0aGF0IGRvIHRoZSBhY3R1YWwgPHRhcmdldD4tc3BlY2lmaWMgbWV0aG9kcy4KLQotUG9ydGluZyB0byBhIDx0YXJnZXQ+IHRoYXQgdXNlcyB0aGUgYS5vdXQgYmluYXJ5IGZvcm1hdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JbiB0aGlzIGNhc2UsIHRoZSBpbmNsdWRlIGZpbGUgYW91dC10YXJnZXQuaCBwcm9iYWJ5IGRvZXMgbW9zdAotb2Ygd2hhdCB5b3UgbmVlZC4gVGhlIHByb2dyYW0gZ2VuLWFvdXQgZ2VuZXJhdGVzIDx0YXJnZXQ+LmMgZm9yCi15b3UgYXV0b21hdGljYWxseSBmb3IgbWFueSBhLm91dCBzeXN0ZW1zLiAgRG86Ci0JbWFrZSBnZW4tYW91dAotCS4vZ2VuLWFvdXQgPHRhcmdldD4gPiA8dGFyZ2V0Pi5jCi0oVGhpcyBvbmx5IHdvcmtzIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gdGhlIHRhcmdldCAoIm5hdGl2ZSIpLgotSWYgeW91IG11c3QgbWFrZSBhIGNyb3NzLXBvcnQgZnJvbSBzY3JhdGNoLCBjb3B5IHRoZSBtb3N0Ci1zaW1pbGFyIGV4aXN0aW5nIGZpbGUgdGhhdCBpbmNsdWRlcyBhb3V0LXRhcmdldC5oLCBhbmQgZml4IHdoYXQgaXMgd3JvbmcuKQotCi1DaGVjayB0aGUgcGFyYW1ldGVycyBpbiA8dGFyZ2V0Pi5jLCBhbmQgZml4IGFueXRoaW5nIHRoYXQgaXMgd3JvbmcuCi0oQWxzbyBsZXQgdXMga25vdyBhYm91dCBpdDsgcGVyaGFwcyB3ZSBjYW4gaW1wcm92ZSBnZW4tYW91dC5jLikKLQotVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCVNob3VsZCBiZSBkZWZpbmVkIGlmIDx0YXJnZXQ+IGlzIGJpZy1lbmRpYW4uCi0KLU5fSEVBREVSX0lOX1RFWFQoeCkKLQlTZWUgZGlzY3Vzc2lvbiBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0KLUJZVEVTX0lOX1dPUkQKLQlOdW1iZXIgb2YgYnl0ZXMgcGVyIHdvcmQuIChVc3VhbGx5IDQgYnV0IGNhbiBiZSA4LikKLQotQVJDSAotCU51bWJlciBvZiBiaXRzIHBlciB3b3JkLiAgKFVzdWFsbHkgMzIsIGJ1dCBjYW4gYmUgNjQuKQotCi1FTlRSWV9DQU5fQkVfWkVSTwotCURlZmluZSBpZiB0aGUgZXh0cnkgcG9pbnQgKHN0YXJ0IGFkZHJlc3Mgb2YgYW4KLQlleGVjdXRhYmxlIHByb2dyYW0pIGNhbiBiZSAweDAuCi0KLVRFWFRfU1RBUlRfQUREUgotCVRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdlbW50IGluCi0JdmlydHVhbCBtZW1vcnkuICBOb3JtYWxseSwgdGhlIHNhbWUgYXMgdGhlIGVudHJ5IHBvaW50LgotCi1UQVJHRVRfUEFHRV9TSVpFCi0KLVNFR01FTlRfU0laRQotICAgICAgICBVc3VhbGx5LCB0aGUgc2FtZSBhcyB0aGUgVEFSR0VUX1BBR0VfU0laRS4KLSAgICAgICAgQWxpZ25tZW50IG5lZWRlZCBmb3IgdGhlIGRhdGEgc2VnbWVudC4KLQotVEFSR0VUTkFNRQotCVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIGZvciBydW4tdGltZSBsb29rdXBzLgotCVVzdWFsbHkgImEub3V0LTx0YXJnZXQ+IgpkaWZmIC0tZ2l0IGEvYmZkL1JFQURNRSBiL2JmZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2UxMzMuLjAwMDAwMDAKLS0tIGEvYmZkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLUJGRCBpcyBhIGFuIG9iamVjdCBmaWxlIGxpYnJhcnkuICBJdCBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIHByb2Nlc3Mgb2JqZWN0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgZm9ybWF0LgotCi1CRkQgaXMgdXNlZCBieSB0aGUgR05VIGRlYnVnZ2VyLCBhc3NlbWJsZXIsIGxpbmtlciwgYW5kIHRoZSBiaW5hcnkKLXV0aWxpdGllcy4KLQotVGhlIGRvY3VtZW50YXRpb24gb24gdXNpbmcgQkZEIGlzIHNjYW50eSBhbmQgbWF5IGJlIG9jY2FzaW9uYWxseQotaW5jb3JyZWN0LiAgUG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBwcm9ibGVtcywgb3IgYW4gZW50aXJlbHkKLXJld3JpdHRlbiBtYW51YWwsIHdvdWxkIGJlIGFwcHJlY2lhdGVkLgotCi1UaGVyZSBpcyBzb21lIEJGRCBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbiBpbiBkb2MvYmZkaW50LnRleGkgd2hpY2ggbWF5Ci1oZWxwIHByb2dyYW1tZXJzIHdobyB3YW50IHRvIG1vZGlmeSBCRkQuCi0KLUJGRCBpcyBub3JtYWxseSBidWlsdCBhcyBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIFNlZSB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBmb3IgdGhhdCBwYWNrYWdlLCBwcm9iYWJseSBpbiBhIFJFQURNRSBmaWxlIGluIHRoZQotYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1CRkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmUgb3B0aW9uczoKLQotICAtLXRhcmdldD1UQVJHRVQKLQlUaGUgZGVmYXVsdCB0YXJnZXQgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVEFSR0VUIGlzCi0JYSBjb25maWd1cmF0aW9uIHRhcmdldCB0cmlwbGV0LCBzdWNoIGFzIHNwYXJjLXN1bi1zb2xhcmlzLgotICAtLWVuYWJsZS10YXJnZXRzPVRBUkdFVCxUQVJHRVQsVEFSR0VULi4uCi0JQWRkaXRpb25hbCB0YXJnZXRzIHRoZSBsaWJyYXJ5IHNob3VsZCBzdXBwb3J0LiAgVG8gaW5jbHVkZQotCXN1cHBvcnQgZm9yIGFsbCBrbm93biB0YXJnZXRzLCB1c2UgLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQKLQlJbmNsdWRlIHN1cHBvcnQgZm9yIDY0IGJpdCB0YXJnZXRzLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5Ci0JdHVybmVkIG9uIGlmIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYSA2NCBiaXQgdGFyZ2V0LCBidXQgbm90Ci0JZm9yIC0tZW5hYmxlLXRhcmdldHM9YWxsLiAgVGhpcyByZXF1aXJlcyBhIGNvbXBpbGVyIHdpdGggYSA2NAotCWJpdCBpbnRlZ2VyIHR5cGUsIHN1Y2ggYXMgZ2NjLgotICAtLWVuYWJsZS1zaGFyZWQKLQlCdWlsZCBCRkQgYXMgYSBzaGFyZWQgbGlicmFyeS4KLSAgLS13aXRoLW1tYXAKLQlVc2UgbW1hcCB3aGVuIGFjY2Vzc2luZyBmaWxlcy4gIFRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgaG9zdHMsCi0JYnV0IHNsb3dlciBvbiBvdGhlcnMuICBJdCBtYXkgbm90IHdvcmsgb24gYWxsIGhvc3RzLgotCi1SZXBvcnQgYnVncyB3aXRoIEJGRCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuCi0KLVBhdGNoZXMgYXJlIGVuY291cmFnZWQuICBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgYWx3YXlzIHNlbmQgdGhlIG91dHB1dAotb2YgZGlmZiAtdSBvciBkaWZmIC1jIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgRG8gbm90Ci1zZW5kIGRlZmF1bHQgZGlmZiBvdXRwdXQuICBEbyBub3QgbWFrZSB0aGUgZGlmZiBmcm9tIHRoZSBuZXcgZmlsZSB0bwotdGhlIG9yaWdpbmFsIGZpbGUuICBSZW1lbWJlciB0aGF0IGFueSBwYXRjaCBtdXN0IG5vdCBicmVhayBvdGhlcgotc3lzdGVtcy4gIFJlbWVtYmVyIHRoYXQgQkZEIG11c3Qgc3VwcG9ydCBjcm9zcyBjb21waWxhdGlvbiBmcm9tIGFueQotaG9zdCB0byBhbnkgdGFyZ2V0LCBzbyBwYXRjaGVzIHdoaWNoIHVzZSBgYCNpZmRlZiBIT1NUJycgYXJlIG5vdAotYWNjZXB0YWJsZS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGBgUmVwb3J0aW5nIEJ1Z3MnJyBzZWN0aW9uIG9mIHRoZQotZ2NjIG1hbnVhbC4KLQotQnVnIHJlcG9ydHMgd2l0aG91dCBwYXRjaGVzIHdpbGwgYmUgcmVtZW1iZXJlZCwgYnV0IHRoZXkgbWF5IG5ldmVyIGdldAotZml4ZWQgdW50aWwgc29tZWJvZHkgdm9sdW50ZWVycyB0byBmaXggdGhlbS4KZGlmZiAtLWdpdCBhL2JmZC9UT0RPIGIvYmZkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTI3MzUuLjAwMDAwMDAKLS0tIGEvYmZkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1UaGluZ3MgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGRvbmU6IC0qLSBUZXh0IC0qLQotCi0gbyAtIEEgc291cmNlIG9mIHNwYWNlIGxvc3NhZ2UgaXMgdGhhdCBhbGwgdGhlIHRhcmdldC1kZXBlbmRlbnQgY29kZQotICAgICBpcyBpbiBhIHNpbmdsZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gIEhlbmNlIGFsbCB0aGUgY29kZSBmb3IKLSAgICAgKndyaXRpbmcqIG9iamVjdCBmaWxlcyBpcyBzdGlsbCBwdWxsZWQgaW50byBhbGwgdGhlIGFwcGxpY2F0aW9ucwotICAgICB0aGF0IG9ubHkgY2FyZSBhYm91dCAqcmVhZGluZyogKGdkYiwgbm0sIG9iamR1bXApLCB3aGlsZSBnYXMgaGFzCi0gICAgIHRvIGNhcnJ5IGFsb25nIGFsbCB0aGUgdW5uZWVkZWQgYmFnZ2FnZSBmb3IgcmVhZGluZyBvYmplY3RzLiAgQW5kCi0gICAgIHNvIG9uLiAgVGhpcyB3b3VsZCBiZSBhIHN1YnN0YW50aWFsIGNoYW5nZSwgYW5kIHRoZSBwYXlvZmYgd291bGQKLSAgICAgbm90IGFsbCB0aGF0IGdyZWF0IChlc3NlbnRpYWxseSBub25lIGlmIGJmZCBpcyB1c2VkIGFzIGEgc2hhcmVkCi0gICAgIGxpYnJhcnkpLgotCi0gbyAtIFRoZSBzdG9yYWdlIG5lZWRlZCBieSBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGlzIGFsc28gbGFyZ2VyIHRoYW4gc3RyaWN0bHkKLSAgICAgbmVlZGVkLiAgVGhpcyBtYXkgYmUgZGlmZmljdWx0IHRvIGRvIG11Y2ggYWJvdXQuCi0KLSBvIC0gaW1wbGVtZW50IGJmZF9hYm9ydCwgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBiZmQgYnV0IG5vdCBhbHRlciB0aGUKLSAgICAgZmlsZXN5c3RlbS4KLQotIG8gLSB1cGRhdGUgdGhlIGJmZCBkb2M7IHdyaXRlIGEgaG93LXRvLXdyaXRlLWEtYmFja2VuZCBkb2MsIHRha2Ugb3V0Ci0gICAgIHRoZSBzdHVwaWQgcXVpcHMgYW5kIGZpbGwgaW4gYWxsIHRoZSBibGFua3MuCi0KLSBvIC0gdXBncmFkZSB0aGUgcmVsb2MgaGFuZGxpbmcgYXMgcGVyIFN0ZXZlJ3Mgc3VnZ2VzdGlvbi4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2FjaW5jbHVkZS5tNCBiL2JmZC9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzI2ZTguLjAwMDAwMDAKLS0tIGEvYmZkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2xvY2FsLm00IGIvYmZkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWQ0MzIuLjAwMDAwMDAKLS0tIGEvYmZkL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIyICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCA0MCBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIExERkxBR1M9IiRMREZMQUdTIiBMSUJTPSIkTElCUyIgXAotTE5fUz0iJExOX1MiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIE9CSkRVTVA9IiRPQkpEVU1QIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGx0X3RhcmdldCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi1jYXNlICIkdGFyZ2V0IiBpbgotTk9ORSkgbHRfdGFyZ2V0PSIkaG9zdCIgOzsKLSopIGx0X3RhcmdldD0iJHRhcmdldCIgOzsKLWVzYWMKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfRExPUEVOXSwKLVtsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iXSkKLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKLVtsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS13aW4zMi1kbGwiXSkKLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotICBbICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgPSB4bm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi10ZXN0IHgiJHNpbGVudCIgPSB4eWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKLVsqLSotY3lnd2luKiB8ICotKi1taW5ndyopCi0gIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKLSAgOzsKLV0pCi1lc2FjCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKV0pCi0KLSMgQUNfTElCVE9PTF9XSU4zMl9ETEwgLSBkZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgZGxsJ3MKLUFDX0RFRlVOKEFDX0xJQlRPT0xfV0lOMzJfRExMLCBbQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwgW2RubAotZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tIHx8IHRlc3QgLWYgJGFjX2Rpci9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1MSUJNPQotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1iZW9zKiB8ICotKi1jeWd3aW4qKQotICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0KLSAgOzsKLSotbmNyLXN5c3Y0LjMqKQotICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09IiRMSUJNIC1sbSIpCi0gIDs7Ci0qKQotICBBQ19DSEVDS19MSUIobSwgbWFpbiwgTElCTT0iLWxtIikKLSAgOzsKLWVzYWMKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotICBJTkNMVERMPWlmZWxzZSgkIywxLC1JJDEsWyctSSR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sCi0gIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCi0gIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCi0gICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQotICAgZWxzZQotICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gICAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotICBlbHNlCi0gICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGw9bm8iCi0gICAgTElCTFRETD0iLWxsdGRsIgotICAgIElOQ0xUREw9Ci0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi0KLWRubCBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAotaWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL2JmZC9haXgzODYtY29yZS5jIGIvYmZkL2FpeDM4Ni1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjdiMTcuLjAwMDAwMDAKLS0tIGEvYmZkL2FpeDM4Ni1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBSVggb24gUFMvMiBjb3JlIGZpbGVzLgotICAgVGhpcyB3YXMgYmFzZWQgb24gdHJhZC1jb3JlLmMsIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZgotICAgICAgICBDeWdudXMgU3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+LgotICAgQ29udmVydGVkIHRvIGJhY2sgZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiBkZWZpbmVkIChfQUlYKSAmJiBkZWZpbmVkIChfSTM4NikKLSNkZWZpbmUgTk9DSEVDS1MJCS8qIHRoaXMgaXMgZm9yIGNvcmVkdW1wLmggKi8KLSNkZWZpbmUgX2hfVVNFUgkJCS8qIGF2b2lkIGluY2x1ZGluZyB1c2VyLmggZnJvbSBjb3JlZHVtcC5oICovCi0jaW5jbHVkZSA8dWluZm8uaD4KLSNpbmNsdWRlIDxzeXMvaTM4Ni9jb3JlZHVtcC5oPgotI2VuZGlmIC8qIF9BSVggJiYgX0kzODYgKi8KLQotLyogbWF5YmUgdGhpcyBjb3VsZCB3b3JrIG9uIHNvbWUgb3RoZXIgaTM4NiBidXQgSSBoYXZlIG5vdCB0cmllZCBpdAotICogbXRyYW5sZUBwYXJpcyAtIFR1ZSBTZXAgMjQgMTI6NDk6MzUgMTk5MQotICovCi0KLSNpZm5kZWYgQ09SX01BR0lDCi0jIGRlZmluZSBDT1JfTUFHSUMgImNvcmUiCi0jZW5kaWYKLQotLyogbmVlZCB0aGlzIGNhc3QgYmVjYXVzZSBwdHIgaXMgcmVhbGx5IHZvaWQgKiAqLwotI2RlZmluZSBjb3JlX2hkcihiZmQpIFwKLSAgICAoKChiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhKSktPmhkcikKLSNkZWZpbmUgY29yZV9zZWN0aW9uKGJmZCxuKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5zZWN0aW9uc1tuXSkKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5yZWdfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWcyc2VjKGJmZCkgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnMl9zZWN0aW9uKQotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgewotICBzdHJ1Y3QgY29yZWhkciAqaGRyOwkJLyogY29yZSBmaWxlIGhlYWRlciAqLwotICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWcyX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpzZWN0aW9uc1tNQVhfQ09SRV9TRUdTXTsKLX07Ci0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1haXgzODZfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGksbjsKLSAgdW5zaWduZWQgY2hhciBsb25nYnVmWzRdOwkvKiBSYXcgYnl0ZXMgb2YgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCi0gIGludCBjb3JlX3NpemUgPSBzaXplb2YgKHN0cnVjdCBjb3JlaGRyKTsKLSAgc3RydWN0IGNvcmVoZHIgKmNvcmU7Ci0gIHN0cnVjdCBtZXJnZW0gewotICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IGNvcmVkYXRhOwotICAgIHN0cnVjdCBjb3JlaGRyIGludGVybmFsX2NvcmU7Ci0gIH0gKm1lcmdlbTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0gc2l6ZW9mIChsb25nYnVmKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAobG9uZ2J1ZixDT1JfTUFHSUMsNCkpIHJldHVybiAwOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIGZhbHNlKSA8IDApIHJldHVybiAwOwotCi0gIG1lcmdlbSA9IChzdHJ1Y3QgbWVyZ2VtICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWVyZ2VtKSk7Ci0gIGlmIChtZXJnZW0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBjb3JlID0gJm1lcmdlbS0+aW50ZXJuYWxfY29yZTsKLQotICBpZiAoKGJmZF9yZWFkICgoUFRSKSBjb3JlLCAxLCBjb3JlX3NpemUsIGFiZmQpKSAhPSBjb3JlX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzZXRfdGRhdGEgKGFiZmQsICZtZXJnZW0tPmNvcmVkYXRhKTsKLSAgY29yZV9oZHIgKGFiZmQpID0gY29yZTsKLQotICAvKiBjcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIHJlY2xhaW0KLSAgICAgdGhlbSAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29yZV9yZWcyc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZzJzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyMToKLSAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfcmVnc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBmb3IgKGk9MCwgbj0wIDsgKGkgPCBNQVhfQ09SRV9TRUdTKSAmJiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKSA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCxuKSA9Ci0JKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgICAgIGlmIChjb3JlX3NlY3Rpb24gKGFiZmQsbikgPT0gTlVMTCkKLQl7Ci0JICBpbnQgajsKLQkgIGlmIChuID4gMCkKLQkgICAgewotCSAgICAgIGZvciAoaj0wOyBqIDwgbjsgaisrKQotCQliZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9zZWN0aW9uKGFiZmQsIGopKTsKLQkgICAgfQotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKLQkgIGdvdG8gbG9zZXIxOwotCX0KLQotICAgICAgc3dpdGNoIChjb3JlLT5jZF9zZWdzW2ldLmNzX3R5cGUpCi0JewotCWNhc2UgQ09SX1RZUEVfREFUQToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmRhdGEiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKwotCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfU1RBQ0s6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5zdGFjayI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfTE9BRCArCi0JCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9MSUJEQVRBOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIubGliZGF0YSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfV1JJVEU6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi53cml0ZWFibGUiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX01TQzoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLm1pc2MiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIudW5rbm93biI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPl9yYXdfc2l6ZSA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfbGVuOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+dm1hICAgICAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19hZGRyZXNzOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmlsZXBvcyAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQ7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmV4dCAgICAgID0gTlVMTDsKLSAgICAgIGlmIChuID4gMCkKLQljb3JlX3NlY3Rpb24gKGFiZmQsIChuLTEpKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgbik7Ci0KLSAgICAgIGFiZmQtPnNlY3Rpb25fY291bnQgPSArK247Ci0gICAgfQotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnMiI7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9yZWdzKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKGNvcmUtPmNkX2ZwcmVncyk7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAtMTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+dm1hID0gLTE7Ci0KLSAgLyogV2UnbGwgYWNjZXNzIHRoZSByZWdzIGFmcmVzaCBpbiB0aGUgY29yZSBmaWxlLCBsaWtlIGFueSBzZWN0aW9uOiAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsY2RfcmVnc1swXSk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsCi0JCQkJCQkgICAgY2RfZnByZWdzKTsKLQotICAvKiBhZGQgdGhlIDIgcmVnIGZha2Ugc2VjdGlvbnMgdG8gYWJmZCAqLwotICBhYmZkLT5zZWN0aW9uX2NvdW50ICs9IDI7Ci0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZzJzZWMgKGFiZmQpOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9zZWN0aW9uIChhYmZkLCAwKTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY29tbTsKLX0KLQotc3RhdGljIGludAotYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5jZF9jdXJzaWc7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1haXgzODZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMKLQkJCQkgICBwb2ludCAqLwotfQotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChQUk9UTyhiZmRfdm1hLCAoKiksICggICAgICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fR0VUUyAoKFBST1RPKGJmZF9zaWduZWRfdm1hLCAoKiksIChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKChQUk9UTyh2b2lkLCAgICAgICAgKCopLCAoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWMgPQotICB7Ci0gICAgImFpeDM4Ni1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTkdfQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICAgJyAnLAkJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBkYXRhICovCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsIC8qIGhkcnMgKi8KLQotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCBhaXgzODZfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX2NyZWF0ZV9vYmplY3QgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChhaXgzODYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtYWRvYmUuYyBiL2JmZC9hb3V0LWFkb2JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTZjN2UuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtYWRvYmUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0LmFkb2JlIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBCYXNlZCBvbiBib3V0LmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiYW91dC9hZG9iZS5oIgotCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwkJLyogRm9yd2FyZCBkZWNsICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICphb3V0X2Fkb2JlX2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gYW91dF8zMl93cml0ZV9zeW1zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3QpKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLQotdm9pZCBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4KLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCkpOwotCSAKLXZvaWQKLWFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotfQotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPKHZvaWQsIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQsCi0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKSk7Ci12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFvdXRfYWRvYmVfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBjaGFyICp0YXJnOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYW5leGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIC8qIE5vcm1hbGx5IHdlIGp1c3QgY29tcGFyZSBmb3IgdGhlIG1hZ2ljIG51bWJlci4KLSAgICAgSG93ZXZlciwgYSBidW5jaCBvZiBBZG9iZSB0b29scyBhcmVuJ3QgZml4ZWQgdXAgeWV0OyB0aGV5IGdlbmVyYXRlCi0gICAgIGZpbGVzIHVzaW5nIFpNQUdJQyghKS4KLSAgICAgSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdOVVRBUkdFVCBpcyBzZXQgdG8gImEub3V0LmFkb2JlIiwgd2Ugd2lsbAotICAgICB0YWtlIGp1c3QgYWJvdXQgYW55IGEub3V0IGZpbGUgYXMgYW4gQWRvYmUgYS5vdXQgZmlsZS4gIEZJWE1FISAgKi8KLQotICBpZiAoTl9CQURNQUcgKGFuZXhlYykpIHsKLSAgICB0YXJnID0gZ2V0ZW52ICgiR05VVEFSR0VUIik7Ci0gICAgaWYgKHRhcmcgJiYgIXN0cmNtcCAodGFyZywgYV9vdXRfYWRvYmVfdmVjLm5hbWUpKQotICAgICAgOwkJLyogSnVzdCBjb250aW51ZSBhbnl3YXksIGlmIHNwZWNpZmljYWxseSBzZXQgdG8gdGhpcyBmb3JtYXQgKi8KLSAgICBlbHNlCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gIH0KLQotICBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKTsKLSAgcmV0dXJuIGFvdXRfMzJfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCAmYW5leGVjLCBhb3V0X2Fkb2JlX2NhbGxiYWNrKTsKLX0KLQotCi0vKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCi0gICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1hb3V0X2Fkb2JlX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlY3Q7Ci0gIHN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIGV4dFsxXTsKLSAgY2hhciAqc2VjdGlvbl9uYW1lOwotICBjaGFyIHRyeV9hZ2FpblszMF07CS8qIG5hbWUgYW5kIG51bWJlciAqLwotICBjaGFyICpuZXduYW1lOwotICBpbnQgdHJ5bnVtOwotICBmbGFnd29yZCBmbGFnczsKLQotICAvKiBBcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSAtLSB1bmtub3duIGluIHRoaXMgZm9ybWF0LiAgKi8KLSAgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfdW5rbm93biwgMCk7Ci0KLSAgLyogVGhlIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBTdWNrIHVwIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGUsIG9uZSBzZWN0aW9uIGF0IGEgdGltZS4gICovCi0KLSAgZm9yICg7OykgewotICAgIGlmIChiZmRfcmVhZCAoKFBUUikgZXh0LCAxLCBzaXplb2YgKCpleHQpLCBhYmZkKSAhPSBzaXplb2YgKCpleHQpKSB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3dpdGNoIChleHQtPmVfdHlwZVswXSkgewotICAgIGNhc2UgTl9URVhUOgotICAgICAgc2VjdGlvbl9uYW1lID0gIi50ZXh0IjsKLSAgICAgIGZsYWdzID0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9EQVRBOgotICAgICAgc2VjdGlvbl9uYW1lID0gIi5kYXRhIjsKLSAgICAgIGZsYWdzID0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CU1M6Ci0gICAgICBzZWN0aW9uX25hbWUgPSAiLmJzcyI7Ci0gICAgICBmbGFncyA9IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAwOgotICAgICAgZ290byBub19tb3JlX3NlY3Rpb25zOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogVW5rbm93biBzZWN0aW9uIHR5cGUgaW4gYS5vdXQuYWRvYmUgZmlsZTogJXhcbiIpLCAKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGV4dC0+ZV90eXBlWzBdKTsKLSAgICAgIGdvdG8gbm9fbW9yZV9zZWN0aW9uczsKLSAgICB9Ci0KLSAgICAvKiBGaXJzdCBvbmUgaXMgY2FsbGVkICIudGV4dCIgb3Igd2hhdGV2ZXI7IHN1YnNlcXVlbnQgb25lcyBhcmUKLSAgICAgICAiLnRleHQxIiwgIi50ZXh0MiIsIC4uLiAqLwotCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSAgICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbl9uYW1lKTsKLSAgICB0cnludW0gPSAwOwotICAgIHdoaWxlICghc2VjdCkgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX2Vycm9yKQotCXJldHVybiAwOwkvKiBTb21lIG90aGVyIGVycm9yIC0tIHNsaWRlIGludG8gdGhlIHN1bnNldCAqLwotICAgICAgc3ByaW50ZiAodHJ5X2FnYWluLCAiJXMlZCIsIHNlY3Rpb25fbmFtZSwgKyt0cnludW0pOwotICAgICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHRyeV9hZ2Fpbik7Ci0gICAgfQotCi0gICAgLyogRml4IHRoZSBuYW1lLCBpZiBpdCBpcyBhIHNwcmludGYnZCBuYW1lLiAgKi8KLSAgICBpZiAoc2VjdC0+bmFtZSA9PSB0cnlfYWdhaW4pIHsKLSAgICAgIG5ld25hbWUgPSAoY2hhciAqKSBiZmRfemFsbG9jKGFiZmQsIHN0cmxlbiAoc2VjdC0+bmFtZSkpOwotICAgICAgaWYgKG5ld25hbWUgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgc2VjdC0+bmFtZSk7Ci0gICAgICBzZWN0LT5uYW1lID0gbmV3bmFtZTsKLSAgICB9Ci0KLSAgICAvKiBOb3cgc2V0IHRoZSBzZWN0aW9uJ3MgYXR0cmlidXRlcy4gICovCi0gICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0LCBmbGFncyk7Ci0gICAgc2VjdC0+X3Jhd19zaXplID0gKChleHQtPmVfc2l6ZVswXSA8PCA4KQkvKiBBc3N1bWVkIGJpZy1lbmRpYW4gKi8KLQkJICAgICAgfCBleHQtPmVfc2l6ZVsxXSA8PCA4KQotCQkgICAgICB8IGV4dC0+ZV9zaXplWzJdOwotICAgIHNlY3QtPl9jb29rZWRfc2l6ZSA9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICBzZWN0LT52bWEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+ZV92aXJ0YmFzZSk7Ci0gICAgc2VjdC0+ZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT5lX2ZpbGViYXNlKTsKLSAgICAvKiBGSVhNRSBYWFggYWxpZ25tZW50PyAqLwotCi0gICAgLyogU2V0IHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGZpcnN0IHNlY3Rpb24gb2YgZWFjaCB0eXBlLiAgKi8KLSAgICBpZiAodHJ5bnVtID09IDApIHN3aXRjaCAoZXh0LT5lX3R5cGVbMF0pIHsKLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIHNlY3QtPnJlbF9maWxlcG9zID0gTl9UUkVMT0ZGICgqZXhlY3ApOwotICAgICAgc2VjdC0+cmVsb2NfY291bnQgPSBleGVjcC0+YV90cnNpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9EQVRBOgotICAgICAgc2VjdC0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBzZWN0LT5yZWxvY19jb3VudCA9IGV4ZWNwLT5hX2Ryc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotbm9fbW9yZV9zZWN0aW9uczogIAotCi0gIGFkYXRhKGFiZmQpLnJlbG9jX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwpOwotICBhZGF0YShhYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfYWRvYmVfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEuYm91dF9kYXRhID0gcmF3cHRyOwotICBleGVjX2hkciAoYWJmZCkgPSAmcmF3cHRyLT5lOwotCi0gIGFkYXRhKGFiZmQpLnJlbG9jX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwpOwotICBhZGF0YShhYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfYWRvYmVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOwotICBzdGF0aWMgc3RydWN0IGV4dGVybmFsX3NlZ2Rlc2Mgc2VudGluZWxbMV07CS8qIEluaXRpYWxpemVkIHRvIHplcm8gKi8KLSAgYXNlY3Rpb24gKnNlY3Q7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2luZm8gPSBaTUFHSUM7Ci0KLSAgLyogQ2FsY3VsYXRlIHRleHQgc2l6ZSBhcyB0b3RhbCBvZiB0ZXh0IHNlY3Rpb25zLCBldGMuICovCi0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAwOwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplICs9IHNlY3QtPnJlbG9jX2NvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgICB9IGVsc2UgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0RBVEEpCXsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgKz0gc2VjdC0+cmVsb2NfY291bnQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwpOwotICAgIH0gZWxzZSBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MgJiYgIShzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSkgewotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX2JzcyAgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgIH0KLSAgfQotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkKLSAgICAJCQkJKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY19oZHIgKGFiZmQpLCAmc3dhcHBlZF9oZHIpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJnN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgVGV4dCBmaXJzdCwgZGF0YSBuZXh0LCByZXN0Ci0gICAgIGFmdGVyd2FyZC4gICovCi0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgIGFvdXRfYWRvYmVfd3JpdGVfc2VjdGlvbiAoYWJmZCwgc2VjdCk7Ci0gICAgfQotICB9Ci0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOwotICAgIH0KLSAgfQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoIShzZWN0LT5mbGFncyAmIChTRUNfQ09ERXxTRUNfREFUQSkpKSB7Ci0gICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOwotICAgIH0KLSAgfQotCi0gIC8qIFdyaXRlIGZpbmFsIGBzZW50aW5lbGAgc2VjdGlvbiBoZWFkZXIgKHdpdGggdHlwZSBvZiAwKS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNlbnRpbmVsLCAxLCBzaXplb2YgKCpzZW50aW5lbCksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKCpzZW50aW5lbCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkgCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBhb3V0XzMyX3dyaXRlX3N5bXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0RBVEEpCXsKLSAgICAgICAgICBpZiAoIWFvdXRfMzJfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3QpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWFvdXRfYWRvYmVfd3JpdGVfc2VjdGlvbiAoYWJmZCwgc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRSBYWFggKi8KLX0KLQwKLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGZpbGVfcHRyIHNlY3Rpb25fc3RhcnQ7Ci0gIHNlY19wdHIgc2VjdDsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotCi0gICAgLyogQXNzaWduIGZpbGUgb2Zmc2V0cyB0byBzZWN0aW9ucy4gIFRleHQgc2VjdGlvbnMgYXJlIGZpcnN0LCBhbmQKLSAgICAgICBhcmUgY29udGlndW91cy4gIFRoZW4gZGF0YSBzZWN0aW9ucy4gIEV2ZXJ5dGhpbmcgZWxzZSBhdCB0aGUgZW5kLiAgKi8KLQotICAgIHNlY3Rpb25fc3RhcnQgPSBOX1RYVE9GRiAoaWdub3JlPC0tPm1lKTsKLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTICYmCi0JICAhKHNlY3QtPmZsYWdzICYgKFNFQ19DT0RFfFNFQ19EQVRBKSkpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bgotICAgICAgfHwgYXJjaCA9PSBiZmRfYXJjaF9tNjhrKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCAKLWFvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci19Ci0KLQotCi0KLS8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIEFkb2JlIEEuT3V0IGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCB2b2lkICosIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgKChyZWxvY19ob3d0b190eXBlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgYmZkX251bGx2b2lkcHRyKQotCi0jZGVmaW5lCWFvdXRfMzJfc2V0X2FyY2hfbWFjaAkJYW91dF9hZG9iZV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lCWFvdXRfMzJfc2V0X3NlY3Rpb25fY29udGVudHMJYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfMzJfc2l6ZW9mX2hlYWRlcnMJCWFvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYW91dF8zMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsYXhfc2VjdGlvbiAgICAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2djX3NlY3Rpb25zICAgICAgICAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYW91dF8zMl9iZmRfZmluYWxfbGluawkJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCV9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBhX291dF9hZG9iZV92ZWMgPQotewotICAiYS5vdXQuYWRvYmUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgdW5rbm93biAoYmlnIGFzc3VtZWQpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGRyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgKSwKLSAgLyogc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGFvdXRfYWRvYmVfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGFvdXRfYWRvYmVfbWtvYmplY3QsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGFvdXRfYWRvYmVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFybS5jIGIvYmZkL2FvdXQtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjVmOWQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciByYXcgQVJNIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICgoTl9NQUdJQyh4KSA9PSBOTUFHSUMpID8gMHg4MDAwIDogXAotICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDKSA/IDAgOiBcCi0gICAoTl9TSEFSRURfTElCKHgpKSA/ICgoeCkuYV9lbnRyeSAmIH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpKSA6IFwKLSAgIFRFWFRfU1RBUlRfQUREUikKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHg4MDAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg4MDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9hcm0KLQotI2RlZmluZSBNWShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBNWUFSTShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotcmVsb2NfaG93dG9fdHlwZSAJKk1ZQVJNKGJmZF9yZWxvY190eXBlX2xvb2t1cCkKLQkJCQlQQVJBTVMoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIAkJTVlBUk0od3JpdGVfb2JqZWN0X2NvbnRlbnRzKQlQQVJBTVMoKGJmZCAqKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaW5pdGlvbnMgZnJvbSBhb3V0eCBpZiBzdXBwb3J0aW5nIHN0YW5kYXJhZCBhLm91dCAKLSAgIGFzIHdlbGwgYXMgb3VyIG93bi4gICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKGFvdXRhcm0sXzMyXyx5KQotCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhb3V0YXJtX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNl9kb25lKQlQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KQkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgTVkoc3dhcF9zdGRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JCQkJCSAgIGFyZWxlbnQgKiwgYXN5bWJvbCAqKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSkpOwotdm9pZCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIAotCQkJCSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgTVkoaG93dG9fdGFibGUpW10gPQotewotICAvKiB0eXBlIHJzIHNpemUgYnN6IHBjcmVsIGJpdHBvcyBvdnJmIHNmIG5hbWUgcGFydF9pbnBsIHJlYWRtYXNrIHNldG1hc2sKLSAgICAgcGNkb25lICovCi0gIEhPV1RPICgwLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwgdHJ1ZSwKLQkgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMywgMiwgMiwgMjYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgTVkoZml4X3BjcmVsXzI2KSwKLQkgIkFSTTI2IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPICg0LCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoNSwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoNiwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNywgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIE1ZKGZpeF9wY3JlbF8yNl9kb25lKSwgIkFSTTI2RCIsIHRydWUsIDB4MCwgMHgwLAotCSBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPICg5LCAwLCAtMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMTAsIDAsIC0yLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiTkVHMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyAgICAgICgodW5zaWduZWQgaW50KSAweDA4KQotI2RlZmluZSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFICAgKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbF9kb25lOwotICB1bnNpZ25lZCBpbnQgcl9uZWc7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfQklHKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggICAgID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbmVnIAkgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoICAgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICB9Ci0gIGluZGV4ID0gcl9sZW5ndGggKyA0ICogcl9wY3JlbF9kb25lICsgOCAqIHJfbmVnOwotICBpZiAoaW5kZXggPT0gMykKLSAgICAqcl9wY3JlbCA9IDE7Ci0KLSAgcmV0dXJuIE1ZKGhvd3RvX3RhYmxlKSArIGluZGV4OwotfQotIAotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsIFJFTCwgSU4sIEVYLCBQQykgXAotCU1ZKHJlbG9jX2hvd3RvKSAoQkZELCBSRUwsICZJTiwgJkVYLCAmUEMpCi0KLXZvaWQKLU1ZKHB1dF9yZWxvYykoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHZhbHVlLCBob3d0bywgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJfZXh0ZXJuOwotICAgICBpbnQgcl9pbmRleDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9uZWc7Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHZhbHVlLCByZWxvYy0+cl9hZGRyZXNzKTsKLSAgcl9sZW5ndGggPSBob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLQotICAvKiBTcGVjaWFsIGNhc2UgZm9yIGJyYW5jaCByZWxvY2F0aW9ucy4gKi8KLSAgaWYgKGhvd3RvLT50eXBlID09IDMgfHwgaG93dG8tPnR5cGUgPT0gNykKLSAgICByX2xlbmd0aCA9IDM7Ci0KLSAgcl9wY3JlbCAgPSBob3d0by0+dHlwZSAmIDQ7IAkvKiBQQyBSZWxhdGl2ZSBkb25lPyAqLwotICByX25lZyA9IGhvd3RvLT50eXBlICYgODsJLyogTmVnYXRpdmUgcmVsb2NhdGlvbiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfQklHIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0gCi0jZGVmaW5lIE1ZX3B1dF9yZWxvYyhCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykgXAotICBNWShwdXRfcmVsb2MpKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKQotCi12b2lkCi1NWShyZWxvY2F0YWJsZV9yZWxvYykoaG93dG8sIGFiZmQsIHJlbG9jLCBhbW91bnQsIHJfYWRkcikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci0gICAgIGJmZF92bWEgKmFtb3VudDsKLSAgICAgYmZkX3ZtYSByX2FkZHI7Ci17Ci0gIGlmIChob3d0by0+dHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmIChyZWxvYy0+cl90eXBlWzBdIAotCSAgJiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotCSAgICAgPyBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpCi0JewotCSAgLyogVGhlIHJlbG9jIGlzIHN0aWxsIGV4dGVybmFsLCBzbyBkb24ndCBtb2RpZnkgYW55dGhpbmcuICovCi0JICAqYW1vdW50ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmFtb3VudCAtPSByX2FkZHI7Ci0JICAvKiBDaGFuZ2UgdGhlIHJfcGNyZWwgdmFsdWUgLS0gb24gdGhlIEFSTSwgdGhpcyBiaXQgaXMgc2V0IG9uY2UgdGhlCi0JICAgICByZWxvY2F0aW9uIGlzIGRvbmUuICAqLwotCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JICAgIHJlbG9jLT5yX3R5cGVbMF0gfD0gUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOwotCSAgZWxzZQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSA3KQotICAgICphbW91bnQgPSAwOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jYXRhYmxlX3JlbG9jKEhPVywgQkZELCBSRUwsIEFNT1VOVCwgQUREUikgXAotICBNWShyZWxvY2F0YWJsZV9yZWxvYykoSE9XLCBCRkQsIFJFTCwgJihBTU9VTlQpLCBBRERSKQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjYpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9ICh0YXJnZXQgJiAweDAwZmZmZmZmKSA8PCAyOwotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiAweDAyMDAwMDAwKSAtIDB4MDIwMDAwMDA7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0gIGlmIChyZWxvY2F0aW9uICYgMykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIDB4MDIwMDAwMDApCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikgIT0gfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH4weDAzZmZmZmZmKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH4weDAwZmZmZmZmOwotICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMikgJiAweDAwZmZmZmZmOwotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJk1ZKGhvd3RvX3RhYmxlKVs3XTsKLSAgCi0gIHJldHVybiBmbGFnOwotfQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKGJmZF9yZWxvY190eXBlX2xvb2t1cCkoYWJmZCxjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJk1ZKGhvd3RvX3RhYmxlKVtqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIDMpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE1ZKHN3YXBfc3RkX3JlbG9jX2luKQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLS8qICNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKi8KLS8qICNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKi8KLS8qICNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsgKi8KLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfcGNyZWw7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gTVlfcmVsb2NfaG93dG8gKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTICgwKTsKLX0KLQotdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIGlmIChyX2xlbmd0aCA8IDApCi0gICAgewotICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7Ci0gICAgICByX25lZyA9IDE7Ci0gICAgfQotCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLQotICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKLSAgICAgKi8KLQotICBpZiAoZy0+aG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGctPmhvd3RvLT50eXBlID09IDcpCi0gICAgeyAKLSAgICAgIHJfbGVuZ3RoID0gMzsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgIH0KLSAgCi0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRzogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0JIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JIHwgKHJfbmVnICAgID8gICBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9iaWdfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtYXJtLWxpdHRsZSIsICAgICAgICAgICAvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAgIC8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLCAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgJiBhb3V0X2FybV9iaWdfdmVjLAotICAKLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9iaWdfdmVjID0KLXsKLSAgImEub3V0LWFybS1iaWciLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gICYgYW91dF9hcm1fbGl0dGxlX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1lbmNhcC5jIGIvYmZkL2FvdXQtZW5jYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjkwMzcuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtZW5jYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0IGZpbGVzIGVuY2Fwc3VsYXRlZCB3aXRoIENPRkYgaGVhZGVycy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUSElTIE1PRFVMRSBJUyBOT1QgRklOSVNIRUQuICBJVCBQUk9CQUJMWSBET0VTTidUIEVWRU4gQ09NUElMRS4gICovCi0KLSNpZiAwCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8c3lzZGVwLmg+Ci0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSA8YW91dC9hb3V0NjQuaD4KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqZW5jYXBfcmVhbF9jYWxsYmFjayAoKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljYnVmWzRdOyAvKiBSYXcgYnl0ZXMgb2YgbWFnaWMgbnVtYmVyIGZyb20gZmlsZSAqLwotICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogU3dhcHBlZCBtYWdpYyBudW1iZXIgKi8KLSAgc2hvcnQgY29mZl9tYWdpYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpbWFnaWNidWYsIDEsIHNpemVvZiAobWFnaWNidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChtYWdpY2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgY29mZl9tYWdpYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgbWFnaWNidWYpOwotICBpZiAoY29mZl9tYWdpYyAhPSBDT0ZGX01BR0lDKQotICAgIHJldHVybiAwOwkJCS8qIE5vdCBhbiBlbmNhcCBjb2ZmIGZpbGUgKi8KLQotICBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotICAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQotICBtYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbWFnaWNidWYpOwotCi0gIGlmIChOX0JBRE1BRyAoKigoc3RydWN0IGludGVybmFsX2V4ZWMgKikgJm1hZ2ljKSkpIHJldHVybiAwOwotCi0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIGVuY2FwX3JlYWxjYWxsYmFjayk7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhIGVuY2Fwc3VsYXRlZC1jb2ZmIGEub3V0IGZpbGUgaGVhZGVyICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVuY2FwX3JlYWxfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSAgTVkoY2FsbGJhY2spKGFiZmQsIGV4ZWNwKTsKLSAgCi0gIC8qIElmIHdlIGhhdmUgYSBjb2ZmIGhlYWRlciwgaXQgY2FuIGdpdmUgdXMgYmV0dGVyIHZhbHVlcyBmb3IKLSAgICAgdGV4dF9zdGFydCBhbmQgZXhlY19kYXRhX3N0YXJ0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICAgIGZvciByZW1vdGUgZGVidWdnaW5nIG9mIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBpZiAoTl9GTEFHUyhleGVjX2FvdXRoZHIpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKQotICB7Ci0JICBzdHJ1Y3QgY29mZmhlYWRlciBjaDsKLQkgIGludCB2YWw7Ci0JICB2YWwgPSBsc2VlayAoZXhlY2NoYW4sIC0oc2l6ZW9mIChBT1VUSERSKSArIHNpemVvZiAoY2gpKSwgMSk7Ci0JICBpZiAodmFsID09IC0xKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHZhbCA9IG15cmVhZCAoZXhlY2NoYW4sICZjaCwgc2l6ZW9mIChjaCkpOwotCSAgaWYgKHZhbCA8IDApCi0JCSAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOwotCSAgdGV4dF9zdGFydCA9IGNoLnRleHRfc3RhcnQ7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBjaC5kYXRhX3N0YXJ0OwotICB9IGVsc2UKLQkgewotCSAgdGV4dF9zdGFydCA9Ci0JICAgIElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpID8gMCA6IE5fVFhUQUREUiAoZXhlY19hb3V0aGRyKTsKLQkgIGV4ZWNfZGF0YV9zdGFydCA9IElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpCi0JICAgID8gZXhlY19hb3V0aGRyLmFfdGV4dCA6IE5fREFUQUREUiAoZXhlY19hb3V0aGRyKTsKLSAgfQotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsgLyogRklYTUUgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gRW5jYXBzdWxhdGVkIENPRkYgZm9ybWF0LgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1ib29sZWFuCi1lbmNhcF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBkYXRhX3BhZCA9IDA7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotLyoqKioqKiBGSVhNRTogIEZyYWdtZW50cyBmcm9tIHRoZSBvbGQgR05VIExEIHByb2dyYW0gZm9yIGRlYWxpbmcgd2l0aAotICAgICAgICBlbmNhcCBjb2ZmLiAgKi8KLXN0cnVjdCBjb2ZmaGVhZGVyIGNvZmZoZWFkZXI7Ci1pbnQgbmVlZF9jb2ZmX2hlYWRlcjsKLQotICAvKiBEZXRlcm1pbmUgd2hldGhlciB0byBjb3VudCB0aGUgaGVhZGVyIGFzIHBhcnQgb2YKLSAgICAgdGhlIHRleHQgc2l6ZSwgYW5kIGluaXRpYWxpemUgdGhlIHRleHQgc2l6ZSBhY2NvcmRpbmdseS4KLSAgICAgVGhpcyBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHN5c3RlbSBhbmQgb24gdGhlIG91dHB1dCBmb3JtYXQgc2VsZWN0ZWQuICAqLwotCi0gIE5fU0VUX01BR0lDIChvdXRoZWFkZXIsIG1hZ2ljKTsKLSNpZmRlZiBJTklUSUFMSVpFX0hFQURFUgotICBJTklUSUFMSVpFX0hFQURFUjsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGV4ZWMpOwotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKHJlbG9jYXRhYmxlX291dHB1dCA9PSAwICYmIGZpbGVfdGFibGVbMF0uanVzdF9zeW1zX2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICBuZWVkX2NvZmZfaGVhZGVyID0gMTsKLSAgICAgIC8qIHNldCB0aGlzIGZsYWcgbm93LCBzaW5jZSBpdCB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIG9mIE5fVFhUT0ZGLCBldGMgKi8KLSAgICAgIE5fU0VUX0ZMQUdTIChvdXRoZWFkZXIsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAgICAgdGV4dF9zaXplICs9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZW5jYXBzdWxhdGluZyBCU0QgZm9ybWF0IHdpdGhpbiBDT0ZGIGZvcm1hdC4gICovCi0gICAgICBzdHJ1Y3QgY29mZnNjbiAqdHAsICpkcCwgKmJwOwotCi0gICAgICB0cCA9ICZjb2ZmaGVhZGVyLnNjbnNbMF07Ci0gICAgICBkcCA9ICZjb2ZmaGVhZGVyLnNjbnNbMV07Ci0gICAgICBicCA9ICZjb2ZmaGVhZGVyLnNjbnNbMl07Ci0KLSAgICAgIHN0cmNweSAodHAtPnNfbmFtZSwgIi50ZXh0Iik7Ci0gICAgICB0cC0+c19wYWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c192YWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c19zaXplID0gdGV4dF9zaXplOwotICAgICAgdHAtPnNfc2NucHRyID0gc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSAgICAgIHRwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICB0cC0+c19sbm5vcHRyID0gMDsKLSAgICAgIHRwLT5zX25yZWxvYyA9IDA7Ci0gICAgICB0cC0+c19ubG5ubyA9IDA7Ci0gICAgICB0cC0+c19mbGFncyA9IDB4MjA7Ci0gICAgICBzdHJjcHkgKGRwLT5zX25hbWUsICIuZGF0YSIpOwotICAgICAgZHAtPnNfcGFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfdmFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGRwLT5zX3NjbnB0ciA9IHRwLT5zX3NjbnB0ciArIHRwLT5zX3NpemU7Ci0gICAgICBkcC0+c19yZWxwdHIgPSAwOwotICAgICAgZHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBkcC0+c19ucmVsb2MgPSAwOwotICAgICAgZHAtPnNfbmxubm8gPSAwOwotICAgICAgZHAtPnNfZmxhZ3MgPSAweDQwOwotICAgICAgc3RyY3B5IChicC0+c19uYW1lLCAiLmJzcyIpOwotICAgICAgYnAtPnNfcGFkZHIgPSBkcC0+c192YWRkciArIGRwLT5zX3NpemU7Ci0gICAgICBicC0+c192YWRkciA9IGJwLT5zX3BhZGRyOwotICAgICAgYnAtPnNfc2l6ZSA9IGJzc19zaXplOwotICAgICAgYnAtPnNfc2NucHRyID0gMDsKLSAgICAgIGJwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICBicC0+c19sbm5vcHRyID0gMDsKLSAgICAgIGJwLT5zX25yZWxvYyA9IDA7Ci0gICAgICBicC0+c19ubG5ubyA9IDA7Ci0gICAgICBicC0+c19mbGFncyA9IDB4ODA7Ci0KLSAgICAgIGNvZmZoZWFkZXIuZl9tYWdpYyA9IENPRkZfTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnNjbnMgPSAzOwotICAgICAgLyogc3RvcmUgYW4gdW5saWtlbHkgdGltZSBzbyBwcm9ncmFtcyBjYW4KLSAgICAgICAqIHRlbGwgdGhhdCB0aGVyZSBpcyBhIGJzZCBoZWFkZXIKLSAgICAgICAqLwotICAgICAgY29mZmhlYWRlci5mX3RpbWRhdCA9IDE7Ci0gICAgICBjb2ZmaGVhZGVyLmZfc3ltcHRyID0gMDsKLSAgICAgIGNvZmZoZWFkZXIuZl9uc3ltcyA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfb3B0aGRyID0gMjg7Ci0gICAgICBjb2ZmaGVhZGVyLmZfZmxhZ3MgPSAweDEwMzsKLSAgICAgIC8qIGFvdXRoZHIgKi8KLSAgICAgIGNvZmZoZWFkZXIubWFnaWMgPSBaTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLnZzdGFtcCA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLnRzaXplID0gdHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuZHNpemUgPSBkcC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5ic2l6ZSA9IGJwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmVudHJ5ID0gb3V0aGVhZGVyLmFfZW50cnk7Ci0gICAgICBjb2ZmaGVhZGVyLnRleHRfc3RhcnQgPSB0cC0+c192YWRkcjsKLSAgICAgIGNvZmZoZWFkZXIuZGF0YV9zdGFydCA9IGRwLT5zX3ZhZGRyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICBteXdyaXRlICgmY29mZmhlYWRlciwgc2l6ZW9mIGNvZmZoZWFkZXIsIDEsIG91dGRlc2MpOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9FTkNBUFNVTEFURQotICBwYWRmaWxlIChOX1RYVE9GRiAob3V0aGVhZGVyKSAtIHNpemVvZiBvdXRoZWFkZXIsIG91dGRlc2MpOwotI2VuZGlmCi0KLSAgdGV4dF9zaXplIC09IE5fVFhUT0ZGIChvdXRoZWFkZXIpOwotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnQgZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIE1ZX29iamVjdF9wIGVuY2FwX29iamVjdF9wCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LW5zMzJrLmMgYi9iZmQvYW91dC1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFjODRlLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LW5zMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBuczMyayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBEYWxsIChpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAibnMzMmsuaCIKLQotI2RlZmluZSBNWU5TKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOUyhiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOUyh3cml0ZV9vYmplY3RfY29udGVudHMpCi0gIFBBUkFNUygoYmZkICphYmZkKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyZCBhLm91dCBmb3JtYXQocykKLSAqIGFzIHdlbGwgYXMgdGhpcyBvbmUKLSAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQotCi12b2lkIGJmZF9uczMya19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNWShPUCkgTVlOUyhPUCkKLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXMsCi0JCQkgICAgICBhcmVsZW50ICpjYWNoZV9wdHIsIGFzeW1ib2wgKipzeW1ib2xzLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCkpOwotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqZywKLQkJCSAgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHIpKTsKLQotLyogVGhlIG5zMzJrIHNlcmllcyBpcyBhaCwgdW51c3VhbCwgd2hlbiBpdCBjb21lcyB0byByZWxvY2F0aW9uLgotICogVGhlcmUgYXJlIHRocmVlIHN0b3JhZ2UgbWV0aG9kcyBmb3IgcmVsb2NhdGVhYmxlIG9iamVjdHMuICBUaGVyZQotICogYXJlIGRpc3BsYWNlbWVudHMsIGltbWVkaWF0ZSBvcGVyYW5kcyBhbmQgb3JkaW5hcnkgdHdvcyBjb21wbGVtZW50Ci0gKiBkYXRhLiBPZiB0aGVzZSwgb25seSB0aGUgbGFzdCBmaXRzIGludG8gdGhlIHN0YW5kYXJkIHJlbG9jYXRpb24KLSAqIHNjaGVtZS4gIEltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGh1ZmZtYW4gZW5jb2RlZCBhbmQKLSAqIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gKHdoZXJlIGFzIHRoZSBuYXR1cmFsIGJ5dGUKLSAqIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gZm9yIHRoaXMgYWNoaXRlY3R1cmUpLgotCi0gKiBOb3RlIHRoYXQgdGhlIG5zMzJrIGRpc3BsYWNlbWVudCBzdG9yYWdlIG1ldGhvZCBpcyBvcnRob2dvbmFsIHRvCi0gKiB3aGV0aGVyIHRoZSByZWxvY2F0aW9uIGlzIHBjIHJlbGF0aXZlIG9yIG5vdC4gVGhlICJkaXNwbGFjZW1lbnQiCi0gKiBzdG9yYWdlIHNjaGVtZSBpcyB1c2VkIGZvciBlc3NlbnRpYWxseSBhbGwgYWRkcmVzcyBjb25zdGFudHMuIFRoZQotICogZGlzcGxhY2VtZW50IGNhbiBiZSByZWxhdGl2ZSB0byB6ZXJvIChhYnNvbHV0ZSBkaXNwbGFjZW1lbnQpLAotICogcmVsYXRpdmUgdG8gdGhlIHBjIChwYyByZWxhdGl2ZSksIHRoZSBzdGFjayBwb2ludGVyLCB0aGUgZnJhbWUKLSAqIHBvaW50ZXIsIHRoZSBzdGF0aWMgYmFzZSByZWdpc3RlciBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGV0Yy4KLQotICogRm9yIGV4YW1wbGU6Ci0gKgotICogIHN5bTE6IC5sb25nIC4JIyBwYyByZWxhdGl2ZSAyJ3MgY29tcGxlbWVudAotICogIHN5bTE6IC5sb25nIGZvbwkjIDIncyBjb21wbGVtZW50IG5vdCBwYyByZWxhdGl2ZQotICoKLSAqICBzZWxmOiAgbW92ZCBAc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCSAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCi0gKiAgc2VsZjogIG1vdmQgc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqICAgICAgICAgbW92ZCBmb28sIHIwICMgbm9uIHBjIHJlbGF0aXZlIGltbWVkaWF0ZQotICoKLSAqIEluIGFkZGl0aW9uLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlcwotICogaW4gdGhlIGEub3V0IGZvcm1hdCByZWxvY2F0aW9uIGVudHJpZXMgaXMgc3VjaCB0aGF0IGV2ZW4gdGhlIHJlbG9jYXRpb24KLSAqIG1ldGhvZHMgd2hpY2ggYXJlIHN0YW5kYXJkIGFyZSBub3QgZW5jb2RlZCB0aGUgc3RhbmRhcmQgd2F5LgotICoKLSAqLwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0gCi17Ci0gIC8qIG5zMzJrIGltbWVkaWF0ZSBvcGVyYW5kcyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV84LCAwLCAwLCA4LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgICJOUzMyS19JTU1fMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogbnMzMmsgZGlzcGxhY2VtZW50cyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCAwLCAwLCA4LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCi0gIEhPV1RPIChCRkRfUkVMT0NfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICI4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfMTYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0KLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpIChNWShob3d0b190YWJsZSkgKyAxNCkKLQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0JJRyAweDA2Ci0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfTElUVExFIDB4NjAKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9CSUcgMQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSA1Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWw7Ci0gICAgIGludCAqcl9pbmRleDsKLSAgICAgaW50ICpyX2V4dGVybjsKLSAgICAgaW50ICpyX3BjcmVsOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0vKiAgQkZEX0FTU0VSVChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgKnJfaW5kZXggPSAgKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JICAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgICB8ICByZWwtPnJfaW5kZXhbMF0gKTsKLSAgKnJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgKnJfcGNyZWwgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICByX2xlbmd0aCAgPSAgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpCi0JCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotICByX25zMzJrX3R5cGUgID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0xJVFRMRSkKLQkJICAgID4+IFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfTElUVExFKTsKLSAgcmV0dXJuIChNWShob3d0b190YWJsZSkgKyByX2xlbmd0aCArIDMgKiAoKnJfcGNyZWwpICsgNiAqIHJfbnMzMmtfdHlwZSk7Ci19Ci0KLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELFJFTCxJTixFWCxQQykgTVkocmVsb2NfaG93dG8pKEJGRCwgUkVMLCAmSU4sICZFWCwgJlBDKQotCi12b2lkCi1NWShwdXRfcmVsb2MpKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCB2YWx1ZSwgaG93dG8sIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByX2V4dGVybjsKLSAgICAgaW50IHJfaW5kZXg7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbnMzMmtfdHlwZTsKLSAgUFVUX1dPUkQgKGFiZmQsIHZhbHVlLCByZWxvYy0+cl9hZGRyZXNzKTsKLSAgcl9sZW5ndGggPSBob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCAgPSAoaW50KSBob3d0by0+cGNfcmVsYXRpdmU7IC8qIFJlbGF0aXZlIHRvIFBDPyAqLwotICByX25zMzJrX3R5cGUgPSAoaG93dG8gLSBNWShob3d0b190YWJsZSkgKS82OwotLyogIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOyAqLwotICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gIHJlbG9jLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gIHJlbG9jLT5yX3R5cGVbMF0gPQotICAgIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLSAgICAgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpCi0JICB8IChyX25zMzJrX3R5cGUgPDwgIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfTElUVExFKTsKLX0KLQotI2RlZmluZSBNWV9wdXRfcmVsb2MoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpIFwKLSAgTVkocHV0X3JlbG9jKShCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykKLQotI2RlZmluZSBTVEFUX0ZPUl9FWEVDCi0KLSNkZWZpbmUgTVlfZmluYWxfbGlua19yZWxvY2F0ZSBfYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNkZWZpbmUgTVlfcmVsb2NhdGVfY29udGVudHMgX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cwotCi0jaW5jbHVkZSA8YW91dHguaD4KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLQotI2RlZmluZSBFTlRSWShpLGopCWNhc2UgaTogcmV0dXJuICZNWShob3d0b190YWJsZSlbal0KLQotICBpbnQgZXh0ID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFOwotCi0gIEJGRF9BU1NFUlQoZXh0ID09IDApOwotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0JY29kZSA9IEJGRF9SRUxPQ18zMjsKLQlicmVhazsKLSAgICAgIH0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOCwgMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2LCAxKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsIDIpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLCAzKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsIDQpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwgNSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84LCA2KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LCA3KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLCA4KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsIDkpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsIDEwKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLCAxMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOCwgMTIpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2LCAxMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzIsIDE0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ184X1BDUkVMLCAxNSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMTZfUENSRUwsIDE2KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18zMl9QQ1JFTCwgMTcpOwotICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLSN1bmRlZiBFTlRSWQotfQotCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfcGNyZWw7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLQotICBjYWNoZV9wdHItPmhvd3RvID0gTVlfcmVsb2NfaG93dG8oYWJmZCwgYnl0ZXMsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKLQotICBNT1ZFX0FERFJFU1MoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19vdXQgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIAotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUgCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIENoZWNrIGZvciB0aGF0IGhlcmUuICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikgCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0jdW5kZWYgS0VFUElUCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0JICByX2luZGV4ID0gICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLSN1bmRlZiBLRUVQSVQgICAgIAotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7ICAgICAgCi0gICAgfQotCi0gIE1ZX3B1dF9yZWxvYyAoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIGctPmFkZHJlc3MsIGctPmhvd3RvLCBuYXRwdHIpOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBpbnQgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpKSAvIDY7Ci0gIGxvbmcgKCpnZXRfZGF0YSkgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotICBpbnQgKCpwdXRfZGF0YSkgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotCi0gIHN3aXRjaCAocl9uczMya190eXBlKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBnZXRfZGF0YSA9IF9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZTsKLSAgICAgIHB1dF9kYXRhID0gX2JmZF9uczMya19wdXRfaW1tZWRpYXRlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZ2V0X2RhdGEgPSBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQ7Ci0gICAgICBwdXRfZGF0YSA9IF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICBsb2NhdGlvbik7Ci0gICAgICAvKiBOT1QgUkVBQ0hFRCAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLSAgcmV0dXJuIF9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGxvY2F0aW9uLCBnZXRfZGF0YSwgcHV0X2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtc3BhcmNsZS5jIGIvYmZkL2FvdXQtc3BhcmNsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNiMTM2Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LXNwYXJjbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBzcGFyYyBsaXR0bGUtZW5kaWFuIGFvdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbGl0dGxlIgotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbGVfYW91dF8sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1NQQVJDIHx8IChtdHlwZSkgPT0gTV9TUEFSQ0xFVCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jZGVmaW5lIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LXRhcmdldC5oIGIvYmZkL2FvdXQtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjQxN2IuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLyogRGVmaW5lIGEgdGFyZ2V0IHZlY3RvciBhbmQgc29tZSBzbWFsbCByb3V0aW5lcyBmb3IgYSB2YXJpYW50IG9mIGEub3V0LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotLyojaW5jbHVkZSAibGliYW91dC5oIiovCi0KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKiBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLSNpZm5kZWYgTVlfY2FsbGJhY2sKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKGNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShjYWxsYmFjaykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgYXJjaF9hbGlnbl9wb3dlcjsKLSAgdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHBhcnRzIG9mIGEgbmV3bHkgcmVhZCBhb3V0IGhlYWRlciAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogRm9yIHNvbWUgdGFyZ2V0cywgaWYgdGhlIGVudHJ5IHBvaW50IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWdlCi0gICAgIGFzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdGhlbiBhZGp1c3QgdGhlIFZNQSBzbyB0aGF0IGl0IGlzLgotICAgICBGSVhNRTogRG8gdGhpcyB3aXRoIGEgbWFjcm8gbGlrZSBTRVRfQVJDSF9NQUNIIGluc3RlYWQ/ICAqLwotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSAgICAgICYmIGV4ZWNwLT5hX2VudHJ5ID4gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGp1c3Q7Ci0KLSAgICAgIGFkanVzdCA9IGV4ZWNwLT5hX2VudHJ5IC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gICAgICAvKiBBZGp1c3Qgb25seSBieSB3aG9sZSBwYWdlcy4gKi8KLSAgICAgIGFkanVzdCAmPSB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgIH0KLQotICAvKiBTZXQgdGhlIGxvYWQgYWRkcmVzc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0goYWJmZCwgKmV4ZWNwKTsKLSNlbHNlCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgotICAgICBTRVRfQVJDSF9NQUNILiAgSXQgYXNzdW1lcyB0aGF0IFNFVF9BUkNIX01BQ0ggd2lsbCBzZXQKLSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgY29ycmVjdGx5LCBpZiB0aGUgcmVsb2Mgc2l6ZSBpcyBub3QKLSAgICAgUkVMT0NfU1REX1NJWkUuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjcC0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhcmNoaXRlY3R1cmUsIHNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUKLSAgICAgc2VjdGlvbnMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spLAotICAgICBidXQgd2hlbiB0aGUgaW5pdGlhbCBzZWN0aW9ucyB3ZXJlIGNyZWF0ZWQgdGhlIGFyY2hpdGVjdHVyZSBoYWQKLSAgICAgbm90IHlldCBiZWVuIHNldC4gIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBkb24ndAotICAgICBzZXQgdGhlIGFsaWdubWVudCBwb3dlciBhbnkgaGlnaGVyIHRoYW4gYXMgcmVxdWlyZWQgYnkgdGhlIHNpemUKLSAgICAgb2YgdGhlIHNlY3Rpb24uICAqLwotICBhcmNoX2FsaWduX3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotICBhcmNoX2FsaWduID0gMSA8PCBhcmNoX2FsaWduX3Bvd2VyOwotICBpZiAoKEJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0gICAgICAgPT0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgIH0KLQotICAvKiBEb24ndCBzZXQgc2l6ZXMgbm93IC0tIGNhbid0IGJlIHN1cmUgdW50aWwgd2Uga25vdyBhcmNoICYgbWFjaC4KLSAgICAgU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLiAgKi8KLSNpZiAwCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9vYmplY3RfcAotLyogRmluaXNoIHVwIHRoZSByZWFkaW5nIG9mIGFuIGEub3V0IGZpbGUgaGVhZGVyICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShvYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkob2JqZWN0X3ApIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJCS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIC8qIHN3YXBfZXhlY19oZWFkZXJfaW4gcmVhZCBpbiBhX2luZm8gd2l0aCB0aGUgd3JvbmcgYnl0ZSBvcmRlciAqLwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgdGFyZ2V0ID0gTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0jaWZkZWYgRU5UUllfQ0FOX0JFX1pFUk8KLSAgLyogVGhlIE5FV1NPUzMgZW50cnktcG9pbnQgaXMvd2FzIDAsIHdoaWNoIChhbW9uZ3N0IG90aGVyIGxvc3NhZ2UpCi0gICAqIG1lYW5zIHRoYXQgaXQgaXNuJ3Qgb2J2aW91cyBpZiBFWEVDX1Agc2hvdWxkIGJlIHNldC4KLSAgICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlIGZvciBhbiBleGVjdXRhYmxlOgotICAgKiBUaGVyZSBtdXN0IGJlIG5vIHJlbG9jYXRpb25zLCB0aGUgYmZkIGNhbiBiZSBuZWl0aGVyIGFuCi0gICAqIGFyY2hpdmUgbm9yIGFuIGFyY2hpdmUgZWxlbWVudCwgYW5kIHRoZSBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZS4gKi8KLQotICBpZiAoZXhlYy5hX3Ryc2l6ZSArIGV4ZWMuYV9kcnNpemUgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JWFVTUikpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBFTlRSWV9DQU5fQkVfWkVSTyAqLwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0jZGVmaW5lIE1ZX29iamVjdF9wIE1ZKG9iamVjdF9wKQotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBNWShta29iamVjdCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoTkFNRShhb3V0LG1rb2JqZWN0KShhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMCAvKiBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIsIGFmdGVyIHdlIGtub3cKLQkgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9ta29iamVjdCBNWShta29iamVjdCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICBUaGlzIGFjdHVhbGx5IGRvZXMgbm90aGluZyB3aXRoIHRoZQotICAgc2VjdGlvbnMuICBJdCBjb3BpZXMgdGhlIHN1YmZvcm1hdCBmaWVsZC4gIFdlIGNvcHkgaXQgaGVyZSwgYmVjYXVzZQotICAgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFFNQUdJQyBmaWxlIGJlZm9yZSB3ZSBzZXQgdGhlCi0gICBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgY29weV9wcml2YXRlX2JmZF9kYXRhIGlzIG5vdCBjYWxsZWQgdW50aWwKLSAgIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotI2lmbmRlZiBNWV93cml0ZV9vYmplY3RfY29udGVudHMKLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3NldF9zaXplcwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWShzZXRfc2l6ZXMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFpNQUdJQ19ESVNLX0JMT0NLX1NJWkU7Ci0jZWxzZQotICBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3NldF9zaXplcyBNWShzZXRfc2l6ZXMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9leGVjX2hkcl9mbGFncwotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAwCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iYWNrZW5kX2RhdGEKLQotI2lmbmRlZiBNWV96bWFnaWNfY29udGlndW91cwotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIKLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3QgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayAwCi0jZW5kaWYKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gICpwZHJlbG9mZiA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLSAgKnBzeW1vZmYgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIE1ZX2JmZF9maW5hbF9saW5rIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgQkZEIGdlbmVyaWMgYXJjaGl2ZSBmaWxlcy4gICovCi0jaWZuZGVmCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZQlNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBNWV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2VuZGlmCi0jaWZuZGVmCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZQlNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2FybWFwCi0jZGVmaW5lCU1ZX3NsdXJwX2FybWFwCQkJYmZkX3NsdXJwX2JzZF9hcm1hcAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZiBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZglNWV93cml0ZV9hcm1hcAotI2RlZmluZQlNWV93cml0ZV9hcm1hcAkJYnNkX3dyaXRlX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9hcl9oZHIKLSNkZWZpbmUgTVlfcmVhZF9hcl9oZHIJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2VuZGlmCi0jaWZuZGVmCU1ZX3RydW5jYXRlX2FybmFtZQotI2RlZmluZQlNWV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2RlZmluZSBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2VuZGlmCi0KLS8qIE5vIGNvcmUgZmlsZSBkZWZpbmVkIGhlcmUgLS0gY29uZmlndXJlIGluIHRyYWQtY29yZS5jIHNlcGFyYXRlbHkuICAqLwotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAlcCi0JCQkJX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AJCV9iZmRfZHVtbXlfdGFyZ2V0Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19zdGFydAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19lbmQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgTkFNRShhb3V0LGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9zZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2VuZGlmCi0jaWZuZGVmIE1ZX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgTVlfbmV3X3NlY3Rpb25faG9vayBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiIE5BTUUoYW91dCxnZXRfc3ltdGFiKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgTVlfbWFrZV9lbXB0eV9zeW1ib2wgTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3ByaW50X3N5bWJvbAotI2RlZmluZSBNWV9wcmludF9zeW1ib2wgTkFNRShhb3V0LHByaW50X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgTVlfZ2V0X3N5bWJvbF9pbmZvIE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2xpbmVubwotI2RlZmluZSBNWV9nZXRfbGluZW5vIE5BTUUoYW91dCxnZXRfbGluZW5vKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9hcmNoX21hY2gKLSNkZWZpbmUgTVlfc2V0X2FyY2hfbWFjaCBOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBNWV9maW5kX25lYXJlc3RfbGluZSBOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgTVlfc2l6ZW9mX2hlYWRlcnMgTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIE1ZX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBNWV9jbG9zZV9hbmRfY2xlYW51cCBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLS8qIEFvdXQgc3ltYm9scyBub3JtYWxseSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMgKi8KLSNpZm5kZWYgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYykgPQotewotICBUQVJHRVROQU1FLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSNpZmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCi0jZWxzZQotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotI2VuZGlmCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSNlbHNlCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotI2VuZGlmCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQgKi8KLSAgTlVMTCwKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dC10aWMzMC5jIGIvYmZkL2FvdXQtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2YzE1OS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKLSNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQotewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKLSNlbmRpZgotCi0vKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5Ci0gICBhb3V0MzIuYy4gICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCi0gICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgotICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcwotICAgaXQuICovCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpCi19OwotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOwotCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzMwX0xEUDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVszXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsxXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsyXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs1XTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs0XTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9hb3V0X3JlbG9jX2hvd3RvIChhYmZkLCByZWxvY3MsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgaW50IGluZGV4OwotCi0gICpyX3BjcmVsID0gMDsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFswXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFsyXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzBdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZTsKLSAgcmV0dXJuIHRpYzMwX2FvdXRfaG93dG9fdGFibGUgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgY2FsbGJhY2sgZm9yIDE2LWJpdCByZWxvY3MuICBUaGlzIGlzCi0gICByZXF1aXJlZCBmb3IgcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWdtZW50cy4gIEEgbGluZSBpbiBhb3V0eC5oCi0gICByZXF1aXJlcyB0aGF0IGFueSByZWxvY2F0aW9ucyBmb3IgdGhlIGRhdGEgc2VjdGlvbiBzaG91bGQgcG9pbnQgdG8KLSAgIHRoZSBlbmQgb2YgdGhlIGFsaWduZWQgdGV4dCBzZWN0aW9uLCBwbHVzIGFuIG9mZnNldC4gIEJ5IGRlZmF1bHQsCi0gICB0aGlzIGRvZXMgbm90IGhhcHBlbiwgdGhlcmVmb3JlIHRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZgotICAgdGhhdC4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgotICAgYml0IHJlbG9jYXRpb25zLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24gaXMgZGVmaW5lZC4gKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24gYW5kIHR1cm4gaXQgaW50byB0aGUgVE1TMzIwQzMwCi0gICAgIDMyLWJpdCBhZGRyZXNzIGZvcm1hdC4gKi8KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnNlY3Rpb24tPnZtYSA+PiAyKTsKLSAgcmVsb2NhdGlvbiArPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3b3JrIG91dCBwYy1yZWxhdGl2ZSBvZmZzZXRzIGZvciB0aGUKLSAgIFRNUzMyMEMzMC4gIFRoZSBkYXRhIGFscmVhZHkgcGxhY2VkIGJ5IG1kX3BjcmVsX2Zyb20gd2l0aGluIGdhcyBpcwotICAgdXNlbGVzcyBmb3IgYSByZWxvY2F0aW9uLCBzbyB3ZSBqdXN0IGdldCB0aGUgb2Zmc2V0IHZhbHVlIGFuZCBwbGFjZQotICAgYSB2ZXJzaW9uIG9mIHRoaXMgd2l0aGluIHRoZSBvYmplY3QgY29kZS4KLSAgIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZSB3aWxsIHRoZW4gY2FsY3VsYXRlIHRoZSByZXF1aXJlZAotICAgcmVsb2NhdGlvbiB0byBhZGQgb24gdG8gdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgY29kZS4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfcGNyZWxfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKLSAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKLQotICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgotICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLwotICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQotICAgIHJlbG9jYXRpb24gLT0gMzsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gLT0gMTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoZXNlIG1hY3JvcyB3aWxsIGdldCAyNC1iaXQgdmFsdWVzIGZyb20gdGhlIGJmZCBkZWZpbml0aW9uLgotICAgQmlnLWVuZGlhbiBvbmx5LiAqLwotI2RlZmluZSBiZmRfZ2V0Yl8yNChCRkQsQUREUikgKGJmZF9nZXRfOChCRkQsQUREUikgPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9nZXRfOChCRkQsQUREUisxKSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMikpCi0KLSNkZWZpbmUgYmZkX3B1dGJfMjQoQkZELERBVEEsQUREUikgYmZkX3B1dF84KEJGRCwoYmZkX2J5dGUpKChEQVRBID4+IDE2KSAmIDB4RkYpLEFERFIpOyBcCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiA4KSAmIDB4RkYpLEFERFIrMSk7IFwKLQkJICAgICAgICAgCQkJCSAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKShEQVRBICYgMHhGRiksQUREUisyKQotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbjsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYXJjaGl0ZWN0dXJlLCBzZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlCi0gICAgIHNlY3Rpb25zLiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSwKLSAgICAgYnV0IHdoZW4gdGhlIGluaXRpYWwgc2VjdGlvbnMgd2VyZSBjcmVhdGVkIHRoZSBhcmNoaXRlY3R1cmUgaGFkCi0gICAgIG5vdCB5ZXQgYmVlbiBzZXQuICBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UgZG9uJ3QKLSAgICAgc2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgYW55IGhpZ2hlciB0aGFuIGFzIHJlcXVpcmVkIGJ5IHRoZSBzaXplCi0gICAgIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXJjaF9hbGlnbl9wb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgYXJjaF9hbGlnbiA9IDEgPDwgYXJjaF9hbGlnbl9wb3dlcjsKLSAgaWYgKChCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotICAgICAgID09IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplKSkKLSAgICB7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLSAgcmV0dXJuIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRiXzI0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JICAgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgPSAoY2hlY2sgfCAoKGJmZF92bWEpIC0gMSAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0gICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLSAgICAgIGlmICgoYWRkICYgKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spKSAhPSAwKQotCXNpZ25lZF9hZGQgLT0gKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spIDw8IDE7Ci0gICAgICBpZiAoaG93dG8tPmJpdHBvcyA9PSAwKQotCXsKLQkgIGNoZWNrICs9IGFkZDsKLQkgIHNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGlmIChzaWduZWRfYWRkID49IDApCi0JICAgIHNpZ25lZF9jaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrICs9ICgoYWRkID4+IGhvd3RvLT5iaXRwb3MpIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKLQl9Ci0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgIGlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIHsKLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQkgICAgaWYgKGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCSAgICBpZiAoKGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAgJiYgKCgoYmZkX3ZtYSkgc2lnbmVkX2NoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICB7Ci0gICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7CS8qIGR1bW15IHZhcnMgKi8KLSAgICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgICBpZiAoYWRhdGEgKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykKLSAgICAgIE5BTUUgKGFvdXQsIGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0KLSAgICBleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwotICAgIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICAgIGV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKLQotICAgIGlmIChhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID4gMCkKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKGJmZF93cml0ZSAoKFBUUikgJiBleGVjX2J5dGVzLCAxLCBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplLCBhYmZkKSAhPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotCi0gICAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgIT0gKGFzeW1ib2wgKiopIE5VTEwKLQkmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9TWU1PRkYgKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmICghTkFNRSAoYW91dCwgd3JpdGVfc3ltcykgKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1RSRUxPRkYgKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIU5BTUUgKGFvdXQsIHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFOQU1FIChhb3V0LCBzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXRpYzMwX2FvdXRfc2V0X3NpemVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotCi0jaWZkZWYgU0VHTUVOVF9TSVpFCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0jZWxzZQotICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0jaWZkZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQotICBhZGF0YSAoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFpNQUdJQ19ESVNLX0JMT0NLX1NJWkU7Ci0jZWxzZQotICBhZGF0YSAoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLQotLyogQ2FsbGJhY2sgZm9yIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUgdG8gc2V0IHRoZSBzZWN0aW9uIG9mZnNldHMuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1NWV9maW5hbF9saW5rX2NhbGxiYWNrIChhYmZkLCBwdHJlbG9mZiwgcGRyZWxvZmYsIHBzeW1vZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgKnB0cmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcGRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwc3ltb2ZmOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgKnB0cmVsb2ZmID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zICsgZXhlY3AtPmFfZGF0YTsKLSAgKnBkcmVsb2ZmID0gKnB0cmVsb2ZmICsgZXhlY3AtPmFfdHJzaXplOwotICAqcHN5bW9mZiA9ICpwZHJlbG9mZiArIGV4ZWNwLT5hX2Ryc2l6ZTs7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9maW5hbF9saW5rCi0KLS8qIEZpbmFsIGxpbmsgcm91dGluZS4gIFdlIG5lZWQgdG8gdXNlIGEgY2FsbCBiYWNrIHRvIGdldCB0aGUgY29ycmVjdAotICAgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgZmlsZV9wdHIgcG9zOwotICBiZmRfdm1hIHZtYSA9IDA7Ci0gIGludCBwYWQ7Ci0KLSAgLyogU2V0IHRoZSBleGVjdXRhYmxlIGhlYWRlciBzaXplIHRvIDAsIGFzIHdlIGRvbid0IHdhbnQgb25lIGZvciBhbgotICAgICBvdXRwdXQuICovCi0gIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSAwOwotICBwb3MgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICAvKiBUZXh0LiAgKi8KLSAgdm1hID0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPnZtYTsKLSAgcG9zICs9IHZtYTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IHZtYTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOwotICBwb3MgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLSAgICB7Ci0gICAgICBpZiAoaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPm5leHQtPnZtYSA+IDApCi0Jb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+bmV4dC0+dm1hOwotICAgICAgZWxzZQotCW9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIDQpOwotICAgIH0KLSAgaWYgKG9ial9kYXRhc2VjIChhYmZkKS0+dm1hIDwgdm1hKQotICAgIHsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIDQpOwotICAgIH0KLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOwotICB2bWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gdm1hICsgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgZXhlY3AtPmFfdGV4dCA9IHZtYSAtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgLyogU2luY2UgQlNTIGZvbGxvd3MgZGF0YSBpbW1lZGlhdGVseSwgc2VlIGlmIGl0IG5lZWRzIGFsaWdubWVudC4gICovCi0gIHZtYSArPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgcG9zICs9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IHZtYTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0KLSAgLyogV2UgYXJlIGZ1bGx5IHJlc2l6ZWQsIHNvIGRvbid0IHJlYWRqdXN0IGluIGZpbmFsX2xpbmsuICovCi0gIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0KLSAgcmV0dXJuIE5BTUUgKGFvdXQsIGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2VuZGlmCi0KLWVudW0gbWFjaGluZV90eXBlCi10aWMzMF9hb3V0X21hY2hpbmVfdHlwZSAoYXJjaCwgbWFjaGluZSwgdW5rbm93bikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICp1bmtub3duOwotewotICBlbnVtIG1hY2hpbmVfdHlwZSBhcmNoX2ZsYWdzOwotCi0gIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICp1bmtub3duID0gdHJ1ZTsKLQotICBzd2l0Y2ggKGFyY2gpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfdGljMzA6Ci0gICAgICAqdW5rbm93biA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICAgfQotICBpZiAoYXJjaF9mbGFncyAhPSBNX1VOS05PV04pCi0gICAgKnVua25vd24gPSBmYWxzZTsKLSAgcmV0dXJuIGFyY2hfZmxhZ3M7Ci19Ci0KLWJvb2xlYW4KLXRpYzMwX2FvdXRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoIWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBib29sZWFuIHVua25vd247Ci0gICAgICB0aWMzMF9hb3V0X21hY2hpbmVfdHlwZSAoYXJjaCwgbWFjaGluZSwgJnVua25vd24pOwotICAgICAgaWYgKHVua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gIHJldHVybiAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+c2V0X3NpemVzKSAoYWJmZCk7Ci19Ci0KLS8qIFdlIGFzc3VtZSBCRkQgZ2VuZXJpYyBhcmNoaXZlIGZpbGVzLiAgKi8KLSNpZm5kZWYJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIE1ZX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZW5kaWYKLSNpZm5kZWYJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfYXJtYXAKLSNkZWZpbmUJTVlfc2x1cnBfYXJtYXAJCQliZmRfc2x1cnBfYnNkX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZQlNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2VuZGlmCi0jaWZuZGVmCU1ZX3dyaXRlX2FybWFwCi0jZGVmaW5lCU1ZX3dyaXRlX2FybWFwCQlic2Rfd3JpdGVfYXJtYXAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX2FyX2hkcgotI2RlZmluZSBNWV9yZWFkX2FyX2hkcgkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZW5kaWYKLSNpZm5kZWYJTVlfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lCU1ZX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNlbmRpZgotI2lmbmRlZiBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZGVmaW5lIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0jZW5kaWYKLQotLyogTm8gY29yZSBmaWxlIGRlZmluZWQgaGVyZSAtLSBjb25maWd1cmUgaW4gdHJhZC1jb3JlLmMgc2VwYXJhdGVseS4gICovCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCVwKLQkJCQlfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcAkJX2JmZF9kdW1teV90YXJnZXQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0Ci0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBOQU1FKGFvdXQsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZW5kaWYKLSNpZm5kZWYgTVlfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBNWV9uZXdfc2VjdGlvbl9ob29rIE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9zeW10YWIgTkFNRShhb3V0LGdldF9zeW10YWIpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBNWV9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBNWV9tYWtlX2VtcHR5X3N5bWJvbCBOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIE1ZX3ByaW50X3N5bWJvbCBOQU1FKGFvdXQscHJpbnRfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBNWV9nZXRfc3ltYm9sX2luZm8gTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfbGluZW5vCi0jZGVmaW5lIE1ZX2dldF9saW5lbm8gTkFNRShhb3V0LGdldF9saW5lbm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBNWV9zZXRfYXJjaF9tYWNoIHRpYzMwX2FvdXRfc2V0X2FyY2hfbWFjaAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIE1ZX2ZpbmRfbmVhcmVzdF9saW5lIE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBNWV9zaXplb2ZfaGVhZGVycyBOQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgTVlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCB0aWMzMF9hb3V0X3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9yZWFkX21pbmlzeW1ib2xzIE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sIE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvIE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotLyogQW91dCBzeW1ib2xzIG5vcm1hbGx5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlcyAqLwotI2lmbmRlZiBNWV9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0jZW5kaWYKLQotLyogQW91dCBhcmNoaXZlcyBub3JtYWxseSB1c2Ugc3BhY2VzIGZvciBwYWRkaW5nICovCi0jaWZuZGVmIEFSX1BBRF9DSEFSCi0jZGVmaW5lIEFSX1BBRF9DSEFSICcgJwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfQkZEX1RBUkdFVAotY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYyA9Ci17Ci0gIFRBUkdFVE5BTUUsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8CQkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLAkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhCi19OwotI2VuZGlmIC8qIE1ZX0JGRF9UQVJHRVQgKi8KZGlmZiAtLWdpdCBhL2JmZC9hb3V0MC5jIGIvYmZkL2FvdXQwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzdhZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgU3VuT1Mgc3R5bGUgYS5vdXQgd2l0aCBmbGFncyBzZXQgdG8gMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXplcm8tYmlnIgotI2RlZmluZSBNWShPUCkgQ0FUKGFvdXQwX2JpZ18sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAwCi0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKChtdHlwZSkgPT0gTV9VTktOT1dOIHx8IChtdHlwZSkgPT0gTV82ODAxMCB8fCAobXR5cGUpID09IE1fNjgwMjApCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQzMi5jIGIvYmZkL2FvdXQzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM0MGI0Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0MzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgMzItYml0IGEub3V0IGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgImFvdXR4LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDY0LmMgYi9iZmQvYW91dDY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDM2YzguLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQ2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciA2NC1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDY0Ci0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNpZm5kZWYgQk1BR0lDCi0jZGVmaW5lIEJNQUdJQyAwCi0jZW5kaWYKLSNpZm5kZWYgUU1BR0lDCi0jZGVmaW5lIFFNQUdJQyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImFvdXR4LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dGYxLmggYi9iZmQvYW91dGYxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjk1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXRmMS5oCisrKyAvZGV2L251bGwKQEAgLTEsODU5ICswLDAgQEAKLS8qIEEub3V0ICJmb3JtYXQgMSIgZmlsZSBoYW5kbGluZyBjb2RlIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKCgobXR5cGUpID09IE1fU1BBUkMgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgMCkgIT0gTlVMTCkgXAotICAgfHwgKCgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9tNjhrLCAwKSAhPSBOVUxMKSkKLSNlbmRpZgotCi0vKgotVGhlIGZpbGUgQGNvZGV7YW91dGYxLmh9IGNvbnRhaW5zIHRoZSBjb2RlIGZvciBCRkQncwotYS5vdXQgYmFjayBlbmQuIENvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGJhY2sgZW5kIGlzIGdpdmVuIGJ5IHRoZXNlCi10d28gcHJlcHJvY2Vzc29yIG5hbWVzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBBUkNIX1NJWkUKLVRoaXMgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciAzMiBvciA2NCwgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgYW4KLWludCBpbiB0aGUgdGFyZ2V0IGZvcm1hdC4gSXQgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMgd2hpY2gKLXBlcmZvcm0gdGhlIG1lbW9yeS9kaXNrIG1hcHBpbmcgb2Ygc3RydWN0dXJlcy4KLQotVGhlIDY0IGJpdCBiYWNrZW5kIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIGhvc3QgY29tcGlsZXIgc3VwcG9ydHMgNjQKLWludHMgKGVnIGxvbmcgbG9uZyB3aXRoIGdjYyksIGJ5IGRlZmluaW5nIHRoZSBuYW1lIEBjb2Rle0JGRF9IT1NUXzY0X0JJVH0gaW4gQGNvZGV7YmZkLmh9LgotV2l0aCB0aGlzIG5hbWUgZGVmaW5lZCwgQGVtcGh7YWxsfSBiZmQgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHdpdGggNjRiaXQKLWFyaXRobWV0aWMsIG5vdCBqdXN0IHRob3NlIHRvIGEgNjRiaXQgdGFyZ2V0LgotCi1AaXRlbSBUQVJHRVROQU1FCi1UaGUgbmFtZSBwdXQgaW50byB0aGUgdGFyZ2V0IHZlY3Rvci4KLUBpdGVtCi1AZW5kIHRhYmxlCi0KLSovCi0KLS8qU1VQUFJFU1M1NTgqLwotLypTVVBQUkVTUzUyOSovCi0KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgc3Vub3Nfc2V0X2FyY2hfbWFjaCBzdW5vc182NF9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBhb3V0XzY0X3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMKLSNlbHNlCi0jZGVmaW5lIHN1bm9zX3NldF9hcmNoX21hY2ggc3Vub3NfMzJfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHN1bm9zX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIHZvaWQgY2hvb3NlX3JlbG9jX3NpemUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN1bm9zNF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKnN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vczRfc2V0X3NpemVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIE1lcmdlIGJhY2tlbmQgZGF0YSBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHNwYXJjbGV0LWFvdXQgd2hlcmUgd2Ugd2FudCB0aGUgcmVzdWx0YW50IG1hY2hpbmUKLSAgIG51bWJlciB0byBiZSBNX1NQQVJDTEVUIGlmIGFueSBpbnB1dCBmaWxlIGlzIE1fU1BBUkNMRVQuICAqLwotCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9hcmNoX3NwYXJjKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLQliZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBlaXRoZXIgc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCBvciBzdW5vc182NF9zZXRfYXJjaF9tYWNoLAotICAgZGVwZW5kaW5nIHVwb24gQVJDSF9TSVpFLiAgKi8KLQotc3RhdGljIHZvaWQKLXN1bm9zX3NldF9hcmNoX21hY2ggKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1BBUkNMRVQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQ0xJVEVfTEU6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKHN1bm9zLHNldF9hcmNoX21hY2gpKEFCRkQsIE5fTUFDSFRZUEUgKEVYRUMpKTsgXAotICBjaG9vc2VfcmVsb2Nfc2l6ZShBQkZEKTsKLQotLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSwgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSAqLwotc3RhdGljIHZvaWQKLWNob29zZV9yZWxvY19zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gU3VuT1MgZm9ybWF0LiAgU2VjdGlvbiBjb250ZW50cyBoYXZlCi0gICBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZSBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kCi0gICByZWxvY2F0aW9uLiAgVGhlIHJlYWwgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVpdGhlcgotICAgYW91dF82NF9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIG9yCi0gICBhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMsIGRlcGVuZGluZyB1cG9uIEFSQ0hfU0laRS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfbTY4MDAwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfbTY4MDEwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAxMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX21hY2hfbTY4MDIwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0OgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQ0xFVCk7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZToKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkNMSVRFX0xFKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgTl9TRVRfRFlOQU1JQyAoKmV4ZWNwLCBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogY29yZSBmaWxlcyAqLwotCi0jZGVmaW5lIENPUkVfTUFHSUMgMHgwODA0NTYKLSNkZWZpbmUgQ09SRV9OQU1FTEVOIDE2Ci0KLS8qIFRoZSBjb3JlIHN0cnVjdHVyZSBpcyB0YWtlbiBmcm9tIHRoZSBTdW4gZG9jdW1lbnRhdGlvbi4KLSAgVW5mb3J0dW5hdGVseSwgdGhleSBkb24ndCBkb2N1bWVudCB0aGUgRlBBIHN0cnVjdHVyZSwgb3IgYXQgbGVhc3QgSQotICBjYW4ndCBmaW5kIGl0IGVhc2lseS4gIEZvcnR1bmF0ZWx5IHRoZSBjb3JlIGhlYWRlciBjb250YWlucyBpdHMgb3duCi0gIGxlbmd0aC4gIFNvIHRoaXMgc2hvdWxkbid0IGNhdXNlIHByb2JsZW1zLCBleGNlcHQgZm9yIGNfdWNvZGUsIHdoaWNoCi0gIHNvIGZhciB3ZSBkb24ndCB1c2UgYnV0IGlzIGVhc3kgdG8gZmluZCB3aXRoIGEgbGl0dGxlIGFyaXRobWV0aWMuICovCi0KLS8qIEJ1dCB0aGUgcmVnIHN0cnVjdHVyZSBjYW4gYmUgZ290dGVuIGZyb20gdGhlIFNQQVJDIHByb2Nlc3NvciBoYW5kYm9vay4KLSAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGluIGEgR05VIGluY2x1ZGUgZmlsZSB0aG91Z2ggc28gdGhhdCBnZGIgY2FuIHVzZQotICB0aGUgc2FtZSBpbmZvLiAqLwotc3RydWN0IHJlZ3MKLXsKLSAgaW50IHJfcHNyOwotICBpbnQgcl9wYzsKLSAgaW50IHJfbnBjOwotICBpbnQgcl95OwotICBpbnQgcl9nMTsKLSAgaW50IHJfZzI7Ci0gIGludCByX2czOwotICBpbnQgcl9nNDsKLSAgaW50IHJfZzU7Ci0gIGludCByX2c2OwotICBpbnQgcl9nNzsKLSAgaW50IHJfbzA7Ci0gIGludCByX28xOwotICBpbnQgcl9vMjsKLSAgaW50IHJfbzM7Ci0gIGludCByX280OwotICBpbnQgcl9vNTsKLSAgaW50IHJfbzY7Ci0gIGludCByX283OwotfTsKLQotLyogVGFrZW4gZnJvbSBTdW4gZG9jdW1lbnRhdGlvbjogKi8KLQotLyogRklYTUU6ICBJdCdzIHdvcnNlIHRoYW4gd2UgZXhwZWN0LiAgVGhpcyBzdHJ1Y3QgY29udGFpbnMgVFdPIHN1YnN0cnVjdHMKLSAgbmVpdGhlciBvZiB3aG9zZSBzaXplIHdlIGtub3csIFdJVEggU1RVRkYgSU4gQkVUV0VFTiBUSEVNISAgV2UgY2FuJ3QKLSAgZXZlbiBwb3J0YWJseSBhY2Nlc3MgdGhlIHN0dWZmIGluIGJldHdlZW4hICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZQotICB7Ci0gICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KLSNkZWZpbmUJU1BBUkNfQ09SRV9MRU4JNDMyCi0gICAgaW50IGNfcmVnc1sxOV07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLwotICAgIHN0cnVjdCBleHRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KLSAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgotICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50Ci0gICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKLSAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KLSAgfTsKLQotLyogQ29yZSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIEJDUCAodGhlIHBhcnQgb2YgU29sYXJpcyB3aGljaCBhbGxvd3MKLSAgIGl0IHRvIHJ1biBTdW5PUzQgYS5vdXQgZmlsZXMpLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTT0xBUklTX0JDUF9DT1JFX0xFTgk0NTYKLSAgICBpbnQgY19yZWdzWzE5XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCi0gICAgaW50IGNfZXhkYXRhX3ZwOwkJLyogZXhkYXRhIHN0cnVjdHVyZSAqLwotICAgIGludCBjX2V4ZGF0YV90c2l6ZTsKLSAgICBpbnQgY19leGRhdGFfZHNpemU7Ci0gICAgaW50IGNfZXhkYXRhX2JzaXplOwotICAgIGludCBjX2V4ZGF0YV9sc2l6ZTsKLSAgICBpbnQgY19leGRhdGFfbnNobGliczsKLSAgICBzaG9ydCBjX2V4ZGF0YV9tYWNoOwotICAgIHNob3J0IGNfZXhkYXRhX21hZzsKLSAgICBpbnQgY19leGRhdGFfdG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfZG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfbG9mZnNldDsKLSAgICBpbnQgY19leGRhdGFfdHh0b3JnOwotICAgIGludCBjX2V4ZGF0YV9kYXRvcmc7Ci0gICAgaW50IGNfZXhkYXRhX2VudGxvYzsKLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLwotICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCi0gICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKLSAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAotICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLwotICB9OwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTVU4zX0NPUkVfTEVOCTgyNgkvKiBBcyBvZiBTdW5PUyA0LjEuMSAqLwotICAgIGludCBjX3JlZ3NbMThdOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KLSAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCi0gICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KLSAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAotICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0Ci0gICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCi0gIH07Ci0KLXN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotICAgIGxvbmcgY19yZWdzX3BvczsJCS8qIGZpbGUgb2Zmc2V0IG9mIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgICBpbnQgY19yZWdzX3NpemU7CQkvKiBzaXplIG9mIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgYmZkX3ZtYSBjX2RhdGFfYWRkcjsJLyogRGF0YSBzdGFydCAoYWRkcmVzcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGJmZF92bWEgY19zdGFja3RvcDsJCS8qIFN0YWNrIHRvcCAoYWRkcmVzcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgbG9uZyBmcF9zdHVmZl9wb3M7CQkvKiBmaWxlIG9mZnNldCBvZiBleHRlcm5hbCBGUFUgc3RhdGUgKHJlZ3MpICovCi0gICAgaW50IGZwX3N0dWZmX3NpemU7CQkvKiBTaXplIG9mIGl0ICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gIH07Ci0KLXN0YXRpYyB2b2lkIHN3YXBjb3JlX3N1bjMKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotc3RhdGljIHZvaWQgc3dhcGNvcmVfc3BhcmMKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotc3RhdGljIHZvaWQgc3dhcGNvcmVfc29sYXJpc19iY3AKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKikpOwotCi0vKiBieXRlLXN3YXAgaW4gdGhlIFN1bi0zIGNvcmUgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZAotc3dhcGNvcmVfc3VuMyAoYWJmZCwgZXh0LCBpbnRjb3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmV4dDsKLSAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKmV4dGNvcmUgPSAoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSBleHQ7Ci0KLSAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOwotICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKLSAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgYW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZWxzZQotICBhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbmRpZgotICAgIChhYmZkLCAmZXh0Y29yZS0+Y19hb3V0aGRyLCAmaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPSBOX0RBVEFERFIgKGludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCi0gIGludGNvcmUtPmNfdWNvZGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKLSAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKLSAgaW50Y29yZS0+Y19zdGFja3RvcCA9IDB4MEUwMDAwMDA7CS8qIEJ5IGV4cGVyaW1lbnRhdGlvbiAqLwotfQotCi0KLS8qIGJ5dGUtc3dhcCBpbiB0aGUgU3BhcmMgY29yZSBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1zd2FwY29yZV9zcGFyYyAoYWJmZCwgZXh0LCBpbnRjb3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmV4dDsKLSAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICpleHRjb3JlID0gKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgYW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZWxzZQotICBhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbmRpZgotICAgIChhYmZkLCAmZXh0Y29yZS0+Y19hb3V0aGRyLCAmaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPSBOX0RBVEFERFIgKGludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KLSAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCi0gICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KLSAgaW50Y29yZS0+Y191Y29kZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLAotICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOwotCi0gIC8qIFN1cHBvc2VkbHkgdGhlIHVzZXIgc3RhY2sgZ3Jvd3MgZG93bndhcmQgZnJvbSB0aGUgYm90dG9tIG9mIGtlcm5lbCBtZW1vcnkuCi0gICAgIFByZXN1bWluZyB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLCB0aGlzIGRlZmluaXRpb24gd2lsbCB3b3JrLiAgKi8KLSAgLyogTm93IHN1biBoYXMgcHJvdmlkZWQgdXMgd2l0aCBhbm90aGVyIGNoYWxsZW5nZS4gIFRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQKLSAgICAgZm9yIHNwYXJjMiBhbmQgc3BhcmMxMCAoYm90aCBydW5uaW5nIFN1bk9TIDQuMS4zKS4gIFdlIHBpY2sgb25lIG9yCi0gICAgIHRoZSBvdGhlciBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RhY2sgcG9pbnRlci4gIFRoaXMKLSAgICAgbG9zZXMgKGEpIGlmIHRoZSBzdGFjayBwb2ludGVyIGhhcyBiZWVuIGNsb2JiZXJlZCwgb3IgKGIpIGlmIHRoZSBzdGFjawotICAgICBpcyBsYXJnZXIgdGhhbiAxMjggbWVnYWJ5dGVzLgotCi0gICAgIEl0J3MgdGltZXMgbGlrZSB0aGVzZSB5b3UncmUgZ2xhZCB0aGV5J3JlIHN3aXRjaGluZyB0byBFTEYuCi0KLSAgICAgTm90ZSB0aGF0IHVzaW5nIGluY2x1ZGUgZmlsZXMgb3Igbmxpc3Qgb24gL3ZtdW5peCB3b3VsZCBiZSB3cm9uZywKLSAgICAgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBmb3IgdGhpcyBjb3JlIGZpbGUsIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YKLSAgICAgbWFjaGluZSB3ZSB3ZXJlIGNvbXBpbGVkIG9uIG9yIGFyZSBydW5uaW5nIG9uLiAgKi8KLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMyICgoYmZkX3ZtYSkweGY4MDAwMDAwKQotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwICgoYmZkX3ZtYSkweGYwMDAwMDAwKQotICB7Ci0gICAgYmZkX3ZtYSBzcCA9IGJmZF9oX2dldF8zMgotICAgIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmKChzdHJ1Y3QgcmVncyAqKSAmZXh0Y29yZS0+Y19yZWdzWzBdKS0+cl9vNik7Ci0gICAgaWYgKHNwIDwgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCkKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwOwotICAgIGVsc2UKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzI7Ci0gIH0KLX0KLQotLyogYnl0ZS1zd2FwIGluIHRoZSBTb2xhcmlzIEJDUCBjb3JlIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLXN3YXBjb3JlX3NvbGFyaXNfYmNwIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKmV4dGNvcmUgPQotICAgIChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSBleHQ7Ci0KLSAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOwotICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKLSAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+Y19yZWdzKTsKLSAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7Ci0KLSAgLyogVGhlIFNvbGFyaXMgQkNQIGV4ZGF0YSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbiBhX3N5bXMgZmllbGQsCi0gICAgIHNvIHdlIGFyZSB1bmFibGUgdG8gc3ludGhlc2l6ZSBhbiBpbnRlcm5hbCBleGVjIGhlYWRlci4KLSAgICAgTHVja2lseSB3ZSBhcmUgYWJsZSB0byBmaWd1cmUgb3V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlY3Rpb24sCi0gICAgIHdoaWNoIGlzIHRoZSBvbmx5IHRoaW5nIG5lZWRlZCBmcm9tIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciwKLSAgICAgZnJvbSB0aGUgZXhkYXRhIHN0cnVjdHVyZS4KLQotICAgICBBcyBvZiBTb2xhcmlzIDIuMywgQkNQIGNvcmUgZmlsZXMgZm9yIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzCi0gICAgIGFyZSBidWdneS4gVGhlIGV4ZGF0YSBzdHJ1Y3R1cmUgaXMgbm90IHByb3Blcmx5IGZpbGxlZCBpbiwgYW5kCi0gICAgIHRoZSBkYXRhIHNlY3Rpb24gaXMgd3JpdHRlbiBmcm9tIGFkZHJlc3MgemVybyBpbnN0ZWFkIG9mIHRoZSBkYXRhCi0gICAgIHN0YXJ0IGFkZHJlc3MuICAqLwotICBtZW1zZXQgKChQVFIpICZpbnRjb3JlLT5jX2FvdXRoZHIsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgaW50Y29yZS0+Y19kYXRhX2FkZHIgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZXhkYXRhX2RhdG9yZyk7Ci0gIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKLSAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOwotICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7Ci0gIGludGNvcmUtPmNfc3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NzaXplKTsKLSAgbWVtY3B5IChpbnRjb3JlLT5jX2NtZG5hbWUsIGV4dGNvcmUtPmNfY21kbmFtZSwgc2l6ZW9mIChpbnRjb3JlLT5jX2NtZG5hbWUpKTsKLSAgaW50Y29yZS0+ZnBfc3R1ZmZfcG9zID0KLSAgICAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLwotICBpbnRjb3JlLT5jX3Vjb2RlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCi0gICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7Ci0KLSAgLyogU3VwcG9zZWRseSB0aGUgdXNlciBzdGFjayBncm93cyBkb3dud2FyZCBmcm9tIHRoZSBib3R0b20gb2Yga2VybmVsIG1lbW9yeS4KLSAgICAgUHJlc3VtaW5nIHRoYXQgdGhpcyByZW1haW5zIHRydWUsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIHdvcmsuICAqLwotICAvKiBOb3cgc3VuIGhhcyBwcm92aWRlZCB1cyB3aXRoIGFub3RoZXIgY2hhbGxlbmdlLiAgVGhlIHZhbHVlIGlzIGRpZmZlcmVudAotICAgICBmb3Igc3BhcmMyIGFuZCBzcGFyYzEwIChib3RoIHJ1bm5pbmcgU3VuT1MgNC4xLjMpLiAgV2UgcGljayBvbmUgb3IKLSAgICAgdGhlIG90aGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyLiAgVGhpcwotICAgICBsb3NlcyAoYSkgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIGJlZW4gY2xvYmJlcmVkLCBvciAoYikgaWYgdGhlIHN0YWNrCi0gICAgIGlzIGxhcmdlciB0aGFuIDEyOCBtZWdhYnl0ZXMuCi0KLSAgICAgSXQncyB0aW1lcyBsaWtlIHRoZXNlIHlvdSdyZSBnbGFkIHRoZXkncmUgc3dpdGNoaW5nIHRvIEVMRi4KLQotICAgICBOb3RlIHRoYXQgdXNpbmcgaW5jbHVkZSBmaWxlcyBvciBubGlzdCBvbiAvdm11bml4IHdvdWxkIGJlIHdyb25nLAotICAgICBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIGZvciB0aGlzIGNvcmUgZmlsZSwgbm8gbWF0dGVyIHdoYXQga2luZCBvZgotICAgICBtYWNoaW5lIHdlIHdlcmUgY29tcGlsZWQgb24gb3IgYXJlIHJ1bm5pbmcgb24uICAqLwotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzIgKChiZmRfdm1hKTB4ZjgwMDAwMDApCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMTAgKChiZmRfdm1hKTB4ZjAwMDAwMDApCi0gIHsKLSAgICBiZmRfdm1hIHNwID0gYmZkX2hfZ2V0XzMyCi0gICAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICYoKHN0cnVjdCByZWdzICopICZleHRjb3JlLT5jX3JlZ3NbMF0pLT5yX282KTsKLSAgICBpZiAoc3AgPCBTUEFSQ19VU1JTVEFDS19TUEFSQzEwKQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTA7Ci0gICAgZWxzZQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMjsKLSAgfQotfQotCi0vKiBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlIHB0ciBpcyByZWFsbHkgdm9pZCAqICovCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5zdW5fY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnJlZ19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZzJzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnMl9zZWN0aW9uKQotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotc3RydWN0IHN1bl9jb3JlX3N0cnVjdAotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaGRyOwkvKiBjb3JlIGZpbGUgaGVhZGVyICovCi0gIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWcyX3NlY3Rpb247Ci19OwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zdW5vczRfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBsb25nYnVmWzRdOwkvKiBSYXcgYnl0ZXMgb2YgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCi0gIGJmZF9zaXplX3R5cGUgY29yZV9zaXplOwotICB1bnNpZ25lZCBsb25nIGNvcmVfbWFnOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqY29yZTsKLSAgY2hhciAqZXh0Y29yZTsKLSAgc3RydWN0IG1lcmdlbQotICAgIHsKLSAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3Qgc3VuY29yZWRhdGE7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSBpbnRlcm5hbF9zdW5vc19jb3JlOwotICAgICAgY2hhciBleHRlcm5hbF9jb3JlWzFdOwotICAgIH0KLSAgICptZXJnZW07Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChsb25nYnVmKSkKLSAgICByZXR1cm4gMDsKLSAgY29yZV9tYWcgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGxvbmdidWYpOwotCi0gIGlmIChjb3JlX21hZyAhPSBDT1JFX01BR0lDKQotICAgIHJldHVybiAwOwotCi0gIC8qIFN1bk9TIGNvcmUgaGVhZGVycyBjYW4gdmFyeSBpbiBsZW5ndGg7IHNlY29uZCB3b3JkIGlzIHNpemU7ICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobG9uZ2J1ZikpCi0gICAgcmV0dXJuIDA7Ci0gIGNvcmVfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbG9uZ2J1Zik7Ci0gIC8qIFNhbml0eSBjaGVjayAqLwotICBpZiAoY29yZV9zaXplID4gMjAwMDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgbWVyZ2VtID0gKHN0cnVjdCBtZXJnZW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY29yZV9zaXplICsgc2l6ZW9mIChzdHJ1Y3QgbWVyZ2VtKSk7Ci0gIGlmIChtZXJnZW0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBleHRjb3JlID0gbWVyZ2VtLT5leHRlcm5hbF9jb3JlOwotCi0gIGlmICgoYmZkX3JlYWQgKChQVFIpIGV4dGNvcmUsIDEsIGNvcmVfc2l6ZSwgYWJmZCkpICE9IGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBWYWxpZGF0ZSB0aGF0IGl0J3MgYSBjb3JlIGZpbGUgd2Uga25vdyBob3cgdG8gaGFuZGxlLCBkdWUgdG8gc3VuCi0gICAgIGJvdGNoaW5nIHRoZSBwb3NpdGlvbmluZyBvZiByZWdpc3RlcnMgYW5kIG90aGVyIGZpZWxkcyBpbiBhIG1hY2hpbmUKLSAgICAgZGVwZW5kZW50IHdheS4gICovCi0gIGNvcmUgPSAmbWVyZ2VtLT5pbnRlcm5hbF9zdW5vc19jb3JlOwotICBzd2l0Y2ggKGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSBTUEFSQ19DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3NwYXJjIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VOM19DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3N1bjMgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTT0xBUklTX0JDUF9DT1JFX0xFTjoKLSAgICAgIHN3YXBjb3JlX3NvbGFyaXNfYmNwIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwkvKiBGSVhNRSAqLwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJmZC0+dGRhdGEuc3VuX2NvcmVfZGF0YSA9ICZtZXJnZW0tPnN1bmNvcmVkYXRhOwotICBhYmZkLT50ZGF0YS5zdW5fY29yZV9kYXRhLT5oZHIgPSBjb3JlOwotCi0gIC8qIGNyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gcmVjbGFpbQotICAgICB0aGVtICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjE6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9zdGFja3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXIyOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfZGF0YXNlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjE7Ci0gICAgfQotICBjb3JlX3JlZzJzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnMnNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9yZWdzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXIyOwotICAgIH0KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWcyIjsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX3NzaXplOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX2RzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfcmVnc19zaXplOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5mcF9zdHVmZl9zaXplOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSAoY29yZS0+Y19zdGFja3RvcCAtIGNvcmUtPmNfc3NpemUpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBjb3JlLT5jX2RhdGFfYWRkcjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT52bWEgPSAwOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gY29yZS0+Y19sZW4gKyBjb3JlLT5jX2RzaXplOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gY29yZS0+Y19sZW47Ci0gIC8qIFdlJ2xsIGFjY2VzcyB0aGUgcmVncyBhZnJlc2ggaW4gdGhlIGNvcmUgZmlsZSwgbGlrZSBhbnkgc2VjdGlvbjogKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKSBjb3JlLT5jX3JlZ3NfcG9zOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKSBjb3JlLT5mcF9zdHVmZl9wb3M7Ci0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWcyc2VjIChhYmZkKTsKLQotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gNDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+aGRyLT5jX2NtZG5hbWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+aGRyLT5jX3NpZ25vOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBpZiAoY29yZV9iZmQtPnh2ZWMgIT0gZXhlY19iZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU29sYXJpcyBjb3JlIGZpbGVzIGRvIG5vdCBpbmNsdWRlIGFuIGFvdXRoZHIuICovCi0gIGlmICgoY29yZV9oZHIgKGNvcmVfYmZkKS0+aGRyKS0+Y19sZW4gPT0gU09MQVJJU19CQ1BfQ09SRV9MRU4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIChtZW1jbXAgKChjaGFyICopICYoKGNvcmVfaGRyIChjb3JlX2JmZCktPmhkciktPmNfYW91dGhkciksCi0JCSAgKGNoYXIgKikgZXhlY19oZHIgKGV4ZWNfYmZkKSwKLQkJICBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLSNkZWZpbmUgTVlfc2V0X3NpemVzIHN1bm9zNF9zZXRfc2l6ZXMKLXN0YXRpYyBib29sZWFuCi1zdW5vczRfc2V0X3NpemVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotLyogV2UgZGVmYXVsdCB0byBzZXR0aW5nIHRoZSB0b29sdmVyc2lvbiBmaWVsZCB0byAxLCBhcyBpcyByZXF1aXJlZCBieQotICAgU3VuT1MuICAqLwotI2lmbmRlZiBNWV9leGVjX2hkcl9mbGFncwotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAxCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3QgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayAwCi0jZW5kaWYKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBzdW5vczRfYW91dF9iYWNrZW5kID0KLXsKLSAgMCwJCQkJLyogem1hZ2ljIGZpbGVzIGFyZSBub3QgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2x1ZGVzIGhlYWRlciAqLwotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiBkZWZhdWx0IHRleHQgdm1hICovCi0gIHN1bm9zNF9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIGhlYWRlciBpcyBjb3VudGVkIGluIHptYWdpYyB0ZXh0ICovCi0gIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMsCi0gIE1ZX2FkZF9vbmVfc3ltYm9sLAotICBNWV9saW5rX2R5bmFtaWNfb2JqZWN0LAotICBNWV93cml0ZV9keW5hbWljX3N5bWJvbCwKLSAgTVlfY2hlY2tfZHluYW1pY19yZWxvYywKLSAgTVlfZmluaXNoX2R5bmFtaWNfbGluawotfTsKLQwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9wCQkJc3Vub3M0X2NvcmVfZmlsZV9wCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cwlOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhCQkJJnN1bm9zNF9hb3V0X2JhY2tlbmQKLQotI2lmbmRlZiBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0eC5oIGIvYmZkL2FvdXR4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMDk0MGQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMzICswLDAgQEAKLS8qIEJGRCBzZW1pLWdlbmVyaWMgYmFjay1lbmQgZm9yIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCWEub3V0IGJhY2tlbmRzCi0KLQotREVTQ1JJUFRJT04KLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgYS5vdXQgZm9ybWF0LAotCXRob3VnaCB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYXJlIG9ubHkgdGhlIHNpemVzIG9mIHRoZQotCXN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uLgotCi0JVGhlIHN1cHBvcnQgaXMgc3BsaXQgaW50byBhIGJhc2ljIHN1cHBvcnQgZmlsZSBAZmlsZXthb3V0eC5ofQotCWFuZCBvdGhlciBmaWxlcyB3aGljaCBkZXJpdmUgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UuIE9uZQotCWRlcml2YXRpb24gZmlsZSBpcyBAZmlsZXthb3V0ZjEuaH0gKGZvciBhLm91dCBmbGF2b3VyIDEpLCBhbmQKLQlhZGRzIHRvIHRoZSBiYXNpYyBhLm91dCBmdW5jdGlvbnMgc3VwcG9ydCBmb3Igc3VuMywgc3VuNCwgMzg2Ci0JYW5kIDI5ayBhLm91dCBmaWxlcywgdG8gY3JlYXRlIGEgdGFyZ2V0IGp1bXAgdmVjdG9yIGZvciBhCi0Jc3BlY2lmaWMgdGFyZ2V0LgotCi0JVGhpcyBpbmZvcm1hdGlvbiBpcyBmdXJ0aGVyIHNwbGl0IG91dCBpbnRvIG1vcmUgc3BlY2lmaWMgZmlsZXMKLQlmb3IgZWFjaCBtYWNoaW5lLCBpbmNsdWRpbmcgQGZpbGV7c3Vub3MuY30gZm9yIHN1bjMgYW5kIHN1bjQsCi0JQGZpbGV7bmV3c29zMy5jfSBmb3IgdGhlIFNvbnkgTkVXUywgYW5kIEBmaWxle2RlbW82NC5jfSBmb3IgYQotCWRlbW9uc3RyYXRpb24gb2YgYSA2NCBiaXQgYS5vdXQgZm9ybWF0LgotCi0JVGhlIGJhc2UgZmlsZSBAZmlsZXthb3V0eC5ofSBkZWZpbmVzIGdlbmVyYWwgbWVjaGFuaXNtcyBmb3IKLQlyZWFkaW5nIGFuZCB3cml0aW5nIHJlY29yZHMgdG8gYW5kIGZyb20gZGlzayBhbmQgdmFyaW91cwotCW90aGVyIG1ldGhvZHMgd2hpY2ggQkZEIHJlcXVpcmVzLiBJdCBpcyBpbmNsdWRlZCBieQotCUBmaWxle2FvdXQzMi5jfSBhbmQgQGZpbGV7YW91dDY0LmN9IHRvIGZvcm0gdGhlIG5hbWVzCi0JPDxhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgPDxhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgZXRjLgotCi0JQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyB3aGF0IGdvZXMgb24gdG8gbWFrZSB0aGUgYmFjayBlbmQgZm9yIGEKLQlzdW40LCBmcm9tIEBmaWxle2FvdXQzMi5jfToKLQotfAkjZGVmaW5lIEFSQ0hfU0laRSAzMgotfAkjaW5jbHVkZSAiYW91dHguaCIKLQotCVdoaWNoIGV4cG9ydHMgbmFtZXM6Ci0KLXwJLi4uCi18CWFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jCi18CWFvdXRfMzJfZmluZF9uZWFyZXN0X2xpbmUKLXwJYW91dF8zMl9nZXRfbGluZW5vCi18CWFvdXRfMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi18CS4uLgotCi0JZnJvbSBAZmlsZXtzdW5vcy5jfToKLQotfAkjZGVmaW5lIFRBUkdFVF9OQU1FICJhLm91dC1zdW5vcy1iaWciCi18CSNkZWZpbmUgVkVDTkFNRSAgICBzdW5vc19iaWdfdmVjCi18CSNpbmNsdWRlICJhb3V0ZjEuaCIKLQotCXJlcXVpcmVzIGFsbCB0aGUgbmFtZXMgZnJvbSBAZmlsZXthb3V0MzIuY30sIGFuZCBwcm9kdWNlcyB0aGUganVtcCB2ZWN0b3IKLQotfAlzdW5vc19iaWdfdmVjCi0KLQlUaGUgZmlsZSBAZmlsZXtob3N0LWFvdXQuY30gaXMgYSBzcGVjaWFsIGNhc2UuICBJdCBpcyBmb3IgYSBsYXJnZSBzZXQKLQlvZiBob3N0cyB0aGF0IHVzZSBgYG1vcmUgb3IgbGVzcyBzdGFuZGFyZCcnIGEub3V0IGZpbGVzLCBhbmQKLQlmb3Igd2hpY2ggY3Jvc3MtZGVidWdnaW5nIGlzIG5vdCBpbnRlcmVzdGluZy4gIEl0IHVzZXMgdGhlCi0Jc3RhbmRhcmQgMzItYml0IGEub3V0IHN1cHBvcnQgcm91dGluZXMsIGJ1dCBkZXRlcm1pbmVzIHRoZQotCWZpbGUgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSB0ZXh0LCBkYXRhLCBhbmQgQlNTCi0Jc2VjdGlvbnMsIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlLCBhbmQgdGhlCi0JZW50cnkgcG9pbnQgYWRkcmVzcywgaW4gYSBob3N0LWRlcGVuZGVudCBtYW5uZXIuICBPbmNlIHRoZXNlCi0JdmFsdWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkLCBnZW5lcmljIGNvZGUgaXMgdXNlZCB0byBoYW5kbGUKLQl0aGUgIG9iamVjdCBmaWxlLgotCi0JV2hlbiBwb3J0aW5nIGl0IHRvIHJ1biBvbiBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotfCAgICAgICAgSE9TVF9QQUdFX1NJWkUKLXwgICAgICAgIEhPU1RfU0VHTUVOVF9TSVpFCi18ICAgICAgICBIT1NUX01BQ0hJTkVfQVJDSCAgICAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX01BQ0hJTkVfTUFDSElORSAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX1RFWFRfU1RBUlRfQUREUgotfCAgICAgICAgSE9TVF9TVEFDS19FTkRfQUREUgotCi0JaW4gdGhlIGZpbGUgQGZpbGV7Li4vaW5jbHVkZS9zeXMvaC1AdmFye1hYWH0uaH0gKGZvciB5b3VyIGhvc3QpLiAgVGhlc2UKLQl2YWx1ZXMsIHBsdXMgdGhlIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIEBmaWxle2Eub3V0Lmh9IG9uCi0JeW91ciBob3N0IHN5c3RlbSwgd2lsbCBwcm9kdWNlIGEgQkZEIHRhcmdldCB0aGF0IHdpbGwgYWNjZXNzCi0Jb3JkaW5hcnkgYS5vdXQgZmlsZXMgb24geW91ciBob3N0LiBUbyBjb25maWd1cmUgYSBuZXcgbWFjaGluZQotCXRvIHVzZSBAZmlsZXtob3N0LWFvdXQuY30sIHNwZWNpZnk6Ci0KLXwJVERFRkFVTFRTID0gLURERUZBVUxUX1ZFQ1RPUj1ob3N0X2FvdXRfYmlnX3ZlYwotfAlUREVQRklMRVM9IGhvc3QtYW91dC5vIHRyYWQtY29yZS5vCi0KLQlpbiB0aGUgQGZpbGV7Y29uZmlnL0B2YXJ7WFhYfS5tdH0gZmlsZSwgYW5kIG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59Ci0JdG8gdXNlIHRoZQotCUBmaWxle0B2YXJ7WFhYfS5tdH0gZmlsZSAoYnkgc2V0dGluZyAiPDxiZmRfdGFyZ2V0PVhYWD4+Iikgd2hlbiB5b3VyCi0JY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZC4KLQotKi8KLQotLyogU29tZSBhc3N1bXB0aW9uczoKLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgc2V0IGlzIFpNQUdJQywgYW5kIHZpY2UgdmVyc2EuCi0gICAgIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHNldHRpbmcgb2YgV1BfVEVYVCBpcyBvbiBvdXRwdXQsIGJ1dCBpdCdsbAotICAgICBnZXQgc2V0IG9uIGlucHV0LgotICAgKiBBbnkgQkZEIHdpdGggRF9QQUdFRCBjbGVhciBhbmQgV1BfVEVYVCBzZXQgaXMgTk1BR0lDLgotICAgKiBBbnkgQkZEIHdpdGggYm90aCBmbGFncyBjbGVhciBpcyBPTUFHSUMuCi0gICAoSnVzdCB3YW50IHRvIG1ha2UgdGhlc2UgZXhwbGljaXQsIHNvIHRoZSBjb25kaXRpb25zIHRlc3RlZCBpbiB0aGlzCi0gICBmaWxlIG1ha2Ugc2Vuc2UgaWYgeW91J3JlIG1vcmUgZmFtaWxpYXIgd2l0aCBhLm91dCB0aGFuIHdpdGggQkZELikgICovCi0KLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotc3RhdGljIGJvb2xlYW4gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X29fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF96X21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfbl9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotCi0vKgotU1VCU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlIGZpbGUgQGZpbGV7YW91dHguaH0gcHJvdmlkZXMgZm9yIGJvdGggdGhlIEBlbXBoe3N0YW5kYXJkfQotCWFuZCBAZW1waHtleHRlbmRlZH0gZm9ybXMgb2YgYS5vdXQgcmVsb2NhdGlvbiByZWNvcmRzLgotCi0JVGhlIHN0YW5kYXJkIHJlY29yZHMgY29udGFpbiBvbmx5IGFuCi0JYWRkcmVzcywgYSBzeW1ib2wgaW5kZXgsIGFuZCBhIHR5cGUgZmllbGQuIFRoZSBleHRlbmRlZCByZWNvcmRzCi0JKHVzZWQgb24gMjlrcyBhbmQgc3BhcmNzKSBhbHNvIGhhdmUgYSBmdWxsIGludGVnZXIgZm9yIGFuCi0JYWRkZW5kLgotCi0qLwotI2lmbmRlZiBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSURYIDIKLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpICgob2JqX3JlbG9jX2VudHJ5X3NpemUoQkZEKSA9PSBSRUxPQ19FWFRfU0laRSBcCi0JICAgICA/IGhvd3RvX3RhYmxlX2V4dCA6IGhvd3RvX3RhYmxlX3N0ZCkgXAotCSAgICArIENUT1JfVEFCTEVfUkVMT0NfSURYKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2NfaW4KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9leHRfcmVsb2NfaW4KLSNkZWZpbmUgTVlfc3dhcF9leHRfcmVsb2NfaW4gTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0Ci0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9leHRfcmVsb2Nfb3V0Ci0jZGVmaW5lIE1ZX3N3YXBfZXh0X3JlbG9jX291dCBOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfcmVsb2NhdGVfY29udGVudHMKLSNkZWZpbmUgTVlfcmVsb2NhdGVfY29udGVudHMgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgaG93dG9fdGFibGVfZXh0IE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpCi0jZGVmaW5lIGhvd3RvX3RhYmxlX3N0ZCBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKQotCi1yZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlX2V4dFtdID0KLXsKLSAgLyogdHlwZSAgICAgICAgICAgcnMgICBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICAgICAgIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrIHBjZG9uZSAqLwotICBIT1dUTyhSRUxPQ184LCAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICBmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzE2LCAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18zMiwgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDgsICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1A4IiwgCWZhbHNlLCAwLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDE2LCAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1AxNiIsIAlmYWxzZSwgMCwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AzMiwgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMzIiLCAJZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDMwLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AzMCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1dESVNQMjIsMiwgIDIsIAkyMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJXRElTUDIyIiwgCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfSEkyMiwgICAxMCwgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSEkyMiIsCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMjIsICAgICAwLCAgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMjIiLCAgICAgICBmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzEzLCAgICAgMCwgIDIsIAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjEzIiwgICAgICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19MTzEwLCAgIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkxPMTAiLCAgICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRkFfQkFTRSwwLCAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJTRkFfQkFTRSIsIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX09GRjEzLDAsMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX09GRjEzIixmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMCwgMCwgIDIsIAkxMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiQkFTRTEwIiwgICBmYWxzZSwgMCwweDAwMDAwM2ZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMywgMCwgIDIsCTEzLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkJBU0UxMyIsICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMjIsIDEwLCAyLAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0UyMiIsICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19QQzEwLCAgIDAsICAyLAkxMCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiUEMxMCIsCWZhbHNlLCAwLDB4MDAwMDAzZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19QQzIyLCAgIDEwLCAgMiwJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiUEMyMiIsIGZhbHNlLCAwLDB4MDAzZmZmZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19KTVBfVEJMLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiSk1QX1RCTCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NFR09GRjE2LDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0VHT0ZGMTYiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0dMT0JfREFULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiR0xPQl9EQVQiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0pNUF9TTE9ULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1NMT1QiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1JFTEFUSVZFLDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUkVMQVRJVkUiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZGVmaW5lIFJFTE9DX1NQQVJDX1JFVjMyIFJFTE9DX1dESVNQMTkKLSAgSE9XVE8oUkVMT0NfU1BBUkNfUkVWMzIsICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlJfU1BBUkNfUkVWMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBDb252ZXJ0IHN0YW5kYXJkIHJlbG9jIHJlY29yZHMgdG8gImFyZWxlbnQiIGZvcm1hdCAoaW5jbCBieXRlIHN3YXApLiAgKi8KLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9zdGRbXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotSE9XVE8oIDAsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLAkJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi1IT1dUTyggMSwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCAzLAkgICAgICAgMCwgIDQsIAk2NCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjY0IiwJdHJ1ZSwgMHhkZWFkZGVhZCwweGRlYWRkZWFkLCBmYWxzZSksCi1IT1dUTyggNCwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDUsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi1IT1dUTyggNiwJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCA3LAkgICAgICAgMCwgIDQsIAk2NCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1A2NCIsCXRydWUsIDB4ZmVlZGZhY2UsMHhmZWVkZmFjZSwgZmFsc2UpLAotSE9XVE8oIDgsCSAgICAgICAwLCAgMiwgICAgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdPVF9SRUwiLAlmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUhPV1RPKCA5LAkgICAgICAgMCwgIDEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMTYiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKDEwLAkgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMzIiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTygxNiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9UQUJMRSIsIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTygzMiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oNDAsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFUkVMIiwgICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLX07Ci0KLSNkZWZpbmUgVEFCTEVfU0laRShUQUJMRSkJKHNpemVvZihUQUJMRSkvc2l6ZW9mKFRBQkxFWzBdKSkKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIChhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEVYVChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9leHRbal0KLSNkZWZpbmUgU1REKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX3N0ZFtqXQotICBpbnQgZXh0ID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFOwotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0JY29kZSA9IEJGRF9SRUxPQ18zMjsKLQlicmVhazsKLSAgICAgIGNhc2UgNjQ6Ci0JY29kZSA9IEJGRF9SRUxPQ182NDsKLQlicmVhazsKLSAgICAgIH0KLSAgaWYgKGV4dCkKLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JRVhUIChCRkRfUkVMT0NfOCwgMCk7Ci0JRVhUIChCRkRfUkVMT0NfMTYsIDEpOwotCUVYVCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlFWFQgKEJGRF9SRUxPQ19ISTIyLCA4KTsKLQlFWFQgKEJGRF9SRUxPQ19MTzEwLCAxMSk7Ci0JRVhUIChCRkRfUkVMT0NfMzJfUENSRUxfUzIsIDYpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIDcpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDMTMsIDEwKTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgMTQpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0JBU0UxMywgMTUpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCAxNSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMjIsIDE2KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzEwLCAxNyk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUEMyMiwgMTgpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgMTkpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1JFVjMyLCAyNik7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLSAgZWxzZQotICAgIC8qIHN0ZCByZWxvY3MgKi8KLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JU1REIChCRkRfUkVMT0NfMTYsIDEpOwotCVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLQlTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0JU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotCVNURCAoQkZEX1JFTE9DXzE2X0JBU0VSRUwsIDkpOwotCVNURCAoQkZEX1JFTE9DXzMyX0JBU0VSRUwsIDEwKTsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotfQotCi0vKgotU1VCU0VDVElPTgotCUludGVybmFsIGVudHJ5IHBvaW50cwotCi1ERVNDUklQVElPTgotCUBmaWxle2FvdXR4Lmh9IGV4cG9ydHMgc2V2ZXJhbCByb3V0aW5lcyBmb3IgYWNjZXNzaW5nIHRoZQotCWNvbnRlbnRzIG9mIGFuIGEub3V0IGZpbGUsIHdoaWNoIGFyZSBnYXRoZXJlZCBhbmQgZXhwb3J0ZWQgaW4KLQl0dXJuIGJ5IHZhcmlvdXMgZm9ybWF0IHNwZWNpZmljIGZpbGVzIChlZyBzdW5vcy5jKS4KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9pbiwKLSAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIEB2YXJ7cmF3X2J5dGVzfSB0YWtlbgotCWZyb20gYSByYXcgYnl0ZSBzdHJlYW0gbWVtb3J5IGltYWdlIGludG8gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyCi0Jc3RydWN0dXJlIEB2YXJ7ZXhlY3B9LgotKi8KLQotI2lmbmRlZiBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0ICgoUFRSKSBleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotfQotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pCi0jZW5kaWYKLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfb3V0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZQotCUB2YXJ7ZXhlY3B9IGludG8gdGhlIGJ1ZmZlciBAdmFye3Jhd19ieXRlc30gcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4KLSovCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotfQotCi0vKiBNYWtlIGFsbCB0aGUgc2VjdGlvbiBmb3IgYW4gYS5vdXQgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX3RleHRzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnRleHQiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGF0YSIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG9ial9ic3NzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmJzcyIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfdGFyZ2V0ICphb3V0X0B2YXJ7c2l6ZX1fc29tZV9hb3V0X29iamVjdF9wCi0JIChiZmQgKmFiZmQsCi0JICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKCkpOwotCi1ERVNDUklQVElPTgotCVNvbWUgYS5vdXQgdmFyaWFudCB0aGlua3MgdGhhdCB0aGUgZmlsZSBvcGVuIGluIEB2YXJ7YWJmZH0KLQljaGVja2luZyBpcyBhbiBhLm91dCBmaWxlLiAgRG8gc29tZSBtb3JlIGNoZWNraW5nLCBhbmQgc2V0IHVwCi0JZm9yIGFjY2VzcyBpZiBpdCByZWFsbHkgaXMuICBDYWxsIGJhY2sgdG8gdGhlIGNhbGxpbmcKLQllbnZpcm9ubWVudCdzICJmaW5pc2ggdXAiIGZ1bmN0aW9uIGp1c3QgYmVmb3JlIHJldHVybmluZywgdG8KLQloYW5kbGUgYW55IGxhc3QtbWludXRlIHNldHVwLgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1OQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSAoYWJmZCwgZXhlY3AsIGNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHIsICpvbGRyYXdwdHI7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnJlc3VsdDsKLQotICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBvbGRyYXdwdHIgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLQotICAvKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgb2xkIHRkYXRhIHN0cnVjdC4KLSAgICAgSW4gcGFydGljdWxhciwgd2Ugd2FudCB0aGUgc3ViZm9ybWF0LCBzaW5jZSBmb3IgaHB1eCBpdCB3YXMgc2V0IGluCi0gICAgIGhwMzAwaHB1eC5jOnN3YXBfZXhlY19oZWFkZXJfaW4gYW5kIHdpbGwgYmUgdXNlZCBpbgotICAgICBocDMwMGhwdXguYzpjYWxsYmFjay4gICovCi0gIGlmIChvbGRyYXdwdHIgIT0gTlVMTCkKLSAgICAqYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gKm9sZHJhd3B0cjsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyID0gJnJhd3B0ci0+ZTsKLSAgKihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyKSA9ICpleGVjcDsJLyogQ29weSBpbiB0aGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3QgKi8KLSAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOwotCi0gIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KLSAgaWYgKGV4ZWNwLT5hX3N5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gWk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gUU1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICAgIGFkYXRhIChhYmZkKS5zdWJmb3JtYXQgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gTk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBPTUFHSUMKLQkgICB8fCBOX01BR0lDICgqZXhlY3ApID09IEJNQUdJQykKLSAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdpdGggTl9CQURNQUcgYmVmb3JlIHRoaXMgcm91dGluZQotCSB3YXMgY2FsbGVkLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLwotICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gIGJmZF9pbml0X3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2VuZGlmCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IE5VTEw7Ci0KLSAgaWYgKCEgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2RhdGE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9ic3M7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX3Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfZHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQzsKLQotI2lmZGVmIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OCi0gIC8qIFRoZSBjb21tb24gY29kZSBjYW4ndCBmaWxsIGluIHRoZXNlIHRoaW5ncyBiZWNhdXNlIHRoZXkgZGVwZW5kCi0gICAgIG9uIGVpdGhlciB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWdtZW50LCB0aGUgcm91bmRpbmcKLSAgICAgdXAgb2YgdmlydHVhbCBhZGRyZXNzZXMgYmV0d2VlbiBzZWdtZW50cywgb3IgdGhlIHN0YXJ0aW5nIGZpbGUKLSAgICAgcG9zaXRpb24gb2YgdGhlIHRleHQgc2VnbWVudCAtLSBhbGwgb2Ygd2hpY2ggdmFyaWVzIGFtb25nIGRpZmZlcmVudAotICAgICB2ZXJzaW9ucyBvZiBhLm91dC4gICovCi0KLSAgLyogQ2FsbCBiYWNrIHRvIHRoZSBmb3JtYXQtZGVwZW5kZW50IGNvZGUgdG8gZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUKLSAgICAgZmllbGRzIGFuZCBkbyBhbnkgZnVydGhlciBjbGVhbnVwLiAgVGhpbmdzIHRoYXQgc2hvdWxkIGJlIGZpbGxlZAotICAgICBpbiBieSB0aGUgY2FsbGJhY2s6ICAqLwotCi0gIHN0cnVjdCBleGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPnNpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotICAvKiBkYXRhIGFuZCBic3MgYXJlIGFscmVhZHkgZmlsbGVkIGluIHNpbmNlIHRoZXkncmUgc28gc3RhbmRhcmQgKi8KLQotICAvKiBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IE5fVFhUQUREUigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUigqZXhlY3ApOwotICBvYmpfYnNzc2VjICAoYWJmZCktPnZtYSA9IE5fQlNTQUREUigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBzd2l0Y2ggKE5fTUFDSFRZUEUgKCpleGVjX2hkciAoYWJmZCkpKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYWJmZC0+b2JqX2FyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgIGJyZWFrOwotICB9Ci0KLSAgYWRhdGEoYWJmZCktPnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSAgLyogVGhlIGFyY2hpdGVjdHVyZSBpcyBlbmNvZGVkIGluIHZhcmlvdXMgd2F5cyBpbiB2YXJpb3VzIGEub3V0IHZhcmlhbnRzLAotICAgICBvciBpcyBub3QgZW5jb2RlZCBhdCBhbGwgaW4gc29tZSBvZiB0aGVtLiAgVGhlIHJlbG9jYXRpb24gc2l6ZSBkZXBlbmRzCi0gICAgIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBhLm91dCB2YXJpYW50LiAgRmluYWxseSwgdGhlIHJldHVybiB2YWx1ZQotICAgICBpcyB0aGUgYmZkX3RhcmdldCB2ZWN0b3IgaW4gdXNlLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gemVybyBhbmQKLSAgICAgc2V0IGJmZF9lcnJvciB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KLQotICAgICBGb3JtYXRzIHN1Y2ggYXMgYi5vdXQsIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBmaWVsZHMgaW4gdGhlIGEub3V0Ci0gICAgIGhlYWRlciwgc2hvdWxkIGNvcGUgd2l0aCB0aGVtIGluIHRoaXMgY2FsbGJhY2sgYXMgd2VsbC4gICovCi0jZW5kaWYJCQkJLyogRE9DVU1FTlRBVElPTiAqLwotCi0gIHJlc3VsdCA9ICgqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoYWJmZCk7Ci0KLSAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCi0gICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAotICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKLSAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcwotICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikuCi0KLSAgICAgVGhpcyB0ZXN0IGhhZCB0byBiZSBjaGFuZ2VkIHRvIGRlYWwgd2l0aCBzeXN0ZW1zIHdoZXJlIHRoZSB0ZXh0IHNlZ21lbnQKLSAgICAgcnVucyBhdCBhIGRpZmZlcmVudCBsb2NhdGlvbiB0aGFuIHRoZSBkZWZhdWx0LiAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUKLSAgICAgZW50cnkgYWRkcmVzcyBjYW4gYXBwZWFyIHRvIGJlIG91dHNpZGUgdGhlIHRleHQgc2VnbWVudCwgdGh1cyBjYXVzaW5nIGFuCi0gICAgIGVycm9uZW91cyBjb25jbHVzaW9uIHRoYXQgdGhlIGZpbGUgaXNuJ3QgZXhlY3V0YWJsZS4KLQotICAgICBUbyBmaXggdGhpcywgd2Ugbm93IGFjY2VwdCBhbnkgbm9uLXplcm8gZW50cnkgcG9pbnQgYXMgYW4gaW5kaWNhdGlvbiBvZgotICAgICBleGVjdXRhYmlsaXR5LiAgVGhpcyB3aWxsIHdvcmsgbW9zdCBvZiB0aGUgdGltZSwgc2luY2Ugb25seSB0aGUgbGlua2VyCi0gICAgIHNldHMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhhdCBpcyBsaWtlbHkgdG8gYmUgbm9uLXplcm8gZm9yIG1vc3Qgc3lzdGVtcy4gKi8KLQotICBpZiAoZXhlY3AtPmFfZW50cnkgIT0gMAotICAgICAgfHwgKGV4ZWNwLT5hX2VudHJ5ID49IG9ial90ZXh0c2VjKGFiZmQpLT52bWEKLQkgICYmIGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSNpZmRlZiBTVEFUX0ZPUl9FWEVDCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLQotICAgICAgLyogVGhlIG9yaWdpbmFsIGhldXJpc3RpYyBkb2Vzbid0IHdvcmsgaW4gc29tZSBpbXBvcnRhbnQgY2FzZXMuCi0gICAgICAgIFRoZSBhLm91dCBmaWxlIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGV4dCBzdGFydAotICAgICAgICBhZGRyZXNzLiAgRm9yIGZpbGVzIChsaWtlIGtlcm5lbHMpIGxpbmtlZCB0byBub24tc3RhbmRhcmQKLSAgICAgICAgYWRkcmVzc2VzIChsZCAtVHRleHQgbm5uKSB0aGUgZW50cnkgcG9pbnQgbWF5IG5vdCBiZSBiZXR3ZWVuCi0gICAgICAgIHRoZSBkZWZhdWx0IHRleHQgc3RhcnQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpIGFuZAotICAgICAgICAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgKyB0ZXh0IHNpemUuICBUaGlzIGlzIG5vdCBqdXN0IGEgbWFjaAotICAgICAgICBpc3N1ZS4gIE1hbnkga2VybmVscyBhcmUgbG9hZGVkIGF0IG5vbiBzdGFuZGFyZCBhZGRyZXNzZXMuICAqLwotICAgICAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwKLQkgICYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDAKLQkgICYmIChmc3RhdChmaWxlbm8oKEZJTEUgKikgKGFiZmQtPmlvc3RyZWFtKSksICZzdGF0X2J1ZikgPT0gMCkKLQkgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogU1RBVF9GT1JfRVhFQyAqLwotCi0gIGlmIChyZXN1bHQpCi0gICAgewotI2lmIDAgLyogVGhlc2Ugc2hvdWxkIGJlIHNldCBjb3JyZWN0bHkgYW55d2F5cy4gICovCi0gICAgICBhYmZkLT5zZWN0aW9ucyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+bmV4dCA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IG9ial9ic3NzZWMgKGFiZmQpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnJlZSAocmF3cHRyKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IG9sZHJhd3B0cjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9ta29iamVjdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X21rb2JqZWN0LCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlJbml0aWFsaXplIEJGRCBAdmFye2FiZmR9IGZvciB1c2Ugd2l0aCBhLm91dCBmaWxlcy4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxta29iamVjdCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICpyYXdwdHI7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBVc2UgYW4gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGZvciBjbGFyaXR5ICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICYocmF3cHRyLT5lKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X21hY2hpbmVfdHlwZQotCi1TWU5PUFNJUwotCWVudW0gbWFjaGluZV90eXBlICBhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCi0JIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCUtlZXAgdHJhY2sgb2YgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBmb3IKLQlhLm91dCdzLiBSZXR1cm4gdGhlIDw8bWFjaGluZV90eXBlPj4gZm9yIGEgcGFydGljdWxhcgotCWFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSwgb3IgPDxNX1VOS05PV04+PiBpZiB0aGF0IGV4YWN0IGFyY2hpdGVjdHVyZQotCWFuZCBtYWNoaW5lIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGEub3V0IGZvcm1hdC4KLQotCUlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgdW5kZXJzdG9vZCwgbWFjaGluZSB0eXBlIDAgKGRlZmF1bHQpCi0JaXMgYWx3YXlzIHVuZGVyc3Rvb2QuCi0qLwotCi1lbnVtIG1hY2hpbmVfdHlwZQotTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGlmIChtYWNoaW5lID09IDAKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfdjkpCi0gICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQzsKLSAgICBlbHNlIGlmIChtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KQotICAgICAgYXJjaF9mbGFncyA9IE1fU1BBUkNMRVQ7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDoJCSAgYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDAwOiBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyAqdW5rbm93biA9IGZhbHNlOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDogYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOiBhcmNoX2ZsYWdzID0gTV82ODAyMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJCSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV8zODY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzI5SzsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV9BUk07Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ0MDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDYwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTAwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6Ci0gICAgICAvKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIE1JUFMzIG9yIE1JUFM0LiAgKi8KLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6ICAgIAkJYXJjaF9mbGFncyA9IE1fTlMzMjUzMjsgYnJlYWs7Ci0gICAgY2FzZSAzMjAzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzIwMzI7IGJyZWFrOwotICAgIGNhc2UgMzI1MzI6CQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKLSAgICBkZWZhdWx0OgkJYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICB9Ci0KLSAgaWYgKGFyY2hfZmxhZ3MgIT0gTV9VTktOT1dOKQotICAgICp1bmtub3duID0gZmFsc2U7Ci0KLSAgcmV0dXJuIGFyY2hfZmxhZ3M7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGFvdXRfQHZhcntzaXplfV9zZXRfYXJjaF9tYWNoLAotCSAoYmZkICosCi0JICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgbWFjaGluZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JdmFsdWVzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uICBWZXJpZnkgdGhhdCBAdmFye2FiZmR9J3MgZm9ybWF0Ci0JY2FuIHN1cHBvcnQgdGhlIGFyY2hpdGVjdHVyZSByZXF1aXJlZC4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBib29sZWFuIHVua25vd247Ci0KLSAgICAgIE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnkgKi8KLSAgc3dpdGNoIChhcmNoKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8oYWJmZCktPnNldF9zaXplcykgKGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgZmlsZV9wdHIgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkID0gMDsKLQotICAvKiBUZXh0LiAgKi8KLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLQotICBwb3MgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0jaWYgMAkgICAgLyogPz8gRG9lcyBhbGlnbm1lbnQgaW4gdGhlIGZpbGUgaW1hZ2UgcmVhbGx5IG1hdHRlcj8gKi8KLSAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgcG9zICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSNpZiAwCi0gICAgICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gdm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBWTUEgb2YgdGhlIC5ic3Mgc2VjdGlvbiBpcyBzZXQgYnkgdGhlIHRoZSBWTUEgb2YgdGhlCi0gICAgICAgICAuZGF0YSBzZWN0aW9uIHBsdXMgdGhlIHNpemUgb2YgdGhlIC5kYXRhIHNlY3Rpb24uICBXZSBtYXkKLSAgICAgICAgIG5lZWQgdG8gYWRkIHBhZGRpbmcgYnl0ZXMgdG8gbWFrZSB0aGlzIHRydWUuICAqLwotICAgICAgcGFkID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSAtIHZtYTsKLSAgICAgIGlmIChwYWQgPiAwKQotCXsKLQkgIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLQkgIHBvcyArPSBwYWQ7Ci0JfQotICAgIH0KLSAgb2JqX2Jzc3NlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLQotICAvKiBGaXggdXAgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE9NQUdJQyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfel9tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBiZmRfc2l6ZV90eXBlIGRhdGFfcGFkLCB0ZXh0X3BhZDsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSAqYWJkcDsKLSAgaW50IHp0aWg7CQkJLyogTm9uemVybyBpZiB0ZXh0IGluY2x1ZGVzIGV4ZWMgaGVhZGVyLiAgKi8KLSAgCi0gIGFiZHAgPSBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCk7Ci0KLSAgLyogVGV4dC4gICovCi0gIHp0aWggPSAoYWJkcCAhPSBOVUxMCi0JICAmJiAoYWJkcC0+dGV4dF9pbmNsdWRlc19oZWFkZXIKLQkgICAgICB8fCBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KSk7Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gKHp0aWgKLQkJCQk/IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZQotCQkJCTogYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSk7Ci0gIGlmICghIG9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgLyogPz8gRG8gd2UgcmVhbGx5IG5lZWQgdG8gY2hlY2sgZm9yIHJlbG9jcyBoZXJlPyAgKi8KLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKQotCQkJCT8gMAotCQkJCTogKHp0aWgKLQkJCQkgICA/IChhYmRwLT5kZWZhdWx0X3RleHRfdm1hCi0JCQkJICAgICAgKyBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JCQkJICAgOiBhYmRwLT5kZWZhdWx0X3RleHRfdm1hKSk7Ci0gICAgICB0ZXh0X3BhZCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIC50ZXh0IHNlY3Rpb24gaXMgYmVpbmcgbG9hZGVkIGF0IGFuIHVudXN1YWwgYWRkcmVzcy4gIFdlCi0gICAgICAgICBtYXkgbmVlZCB0byBwYWQgaXQgc3VjaCB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIHN0YXJ0cyBhdCBhIHBhZ2UKLSAgICAgICAgIGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmICh6dGloKQotCXRleHRfcGFkID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLQkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7Ci0gICAgICBlbHNlCi0JdGV4dF9wYWQgPSAoKC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0JCSAgICAmIChhZGF0YSAoYWJmZCkucGFnZV9zaXplIC0gMSkpOwotICAgIH0KLQotICAvKiBGaW5kIHN0YXJ0IG9mIGRhdGEuICAqLwotICBpZiAoenRpaCkKLSAgICB7Ci0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyArIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgaWYgcGFnZV9zaXplID09IHptYWdpY19kaXNrX2Jsb2NrX3NpemUsIHRoZW4KLQkgZmlsZXBvcyA9PSBwYWdlX3NpemUsIGFuZCB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgdGhlIHp0aWgKLQkgY2FzZS4gICovCi0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICAgIHRleHRfZW5kICs9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvczsKLSAgICB9Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gIHRleHRfZW5kICs9IHRleHRfcGFkOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGlmIChhYmRwICYmIGFiZHAtPnptYWdpY19tYXBwZWRfY29udGlndW91cykKLSAgICB7Ci0gICAgICB0ZXh0X3BhZCA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gICAgfQotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IChvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotCQkJCSsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gIAotICAvKiBGaXggdXAgZXhlYyBoZWFkZXIgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgaWYgKHp0aWggJiYgKCFhYmRwIHx8IChhYmRwICYmICFhYmRwLT5leGVjX2hlYWRlcl9ub3RfY291bnRlZCkpKQotICAgIGV4ZWNwLT5hX3RleHQgKz0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBxX21hZ2ljX2Zvcm1hdCkKLSAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBRTUFHSUMpOwotICBlbHNlCi0gICAgTl9TRVRfTUFHSUMgKCpleGVjcCwgWk1BR0lDKTsKLQotICAvKiBTcGVjIHNheXMgZGF0YSBzZWN0aW9uIHNob3VsZCBiZSByb3VuZGVkIHVwIHRvIHBhZ2UgYm91bmRhcnkuICAqLwotICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplCi0gICAgPSBhbGlnbl9wb3dlciAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJICAgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSAgZXhlY3AtPmFfZGF0YSA9IEJGRF9BTElHTiAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJCSAgICAgYWRhdGEoYWJmZCkucGFnZV9zaXplKTsKLSAgZGF0YV9wYWQgPSBleGVjcC0+YV9kYXRhIC0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSAob2JqX2RhdGFzZWMoYWJmZCktPnZtYQotCQkJICAgICArIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAvKiBJZiB0aGUgQlNTIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbiBhbmQgZXh0cmEgc3BhY2UKLSAgICAgaW4gdGhlIHBhZ2UgaXMgbGVmdCBhZnRlciB0aGUgZGF0YSBzZWN0aW9uLCBmdWRnZSBkYXRhCi0gICAgIGluIHRoZSBoZWFkZXIgc28gdGhhdCB0aGUgYnNzIHNlY3Rpb24gbG9va3Mgc21hbGxlciBieSB0aGF0Ci0gICAgIGFtb3VudC4gIFdlJ2xsIHN0YXJ0IHRoZSBic3Mgc2VjdGlvbiB0aGVyZSwgYW5kIGxpZSB0byB0aGUgT1MuCi0gICAgIChOb3RlIHRoYXQgYSBsaW5rZXIgc2NyaXB0LCBhcyB3ZWxsIGFzIHRoZSBhYm92ZSBhc3NpZ25tZW50LAotICAgICBjb3VsZCBoYXZlIGV4cGxpY2l0bHkgc2V0IHRoZSBCU1Mgdm1hIHRvIGltbWVkaWF0ZWx5IGZvbGxvdwotICAgICB0aGUgZGF0YSBzZWN0aW9uLikgICovCi0gIGlmIChhbGlnbl9wb3dlciAob2JqX2Jzc3NlYyhhYmZkKS0+dm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgICA9PSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICBleGVjcC0+YV9ic3MgPSAoZGF0YV9wYWQgPiBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUpID8gMCA6Ci0gICAgICBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUgLSBkYXRhX3BhZDsKLSAgZWxzZQotICAgIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9uX21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGZpbGVfcHRyIHBvcyA9IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotICAKLSAgLyogVGV4dC4gICovCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0gIAotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0KLSAgLyogRml4IHVwIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE5NQUdJQyk7Ci19Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCB0ZXh0X3NpemUsIHRleHRfZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZTsKLSAgICAgZmlsZV9wdHIgKnRleHRfZW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgIT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgPQotICAgIGFsaWduX3Bvd2VyKG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0gICp0ZXh0X3NpemUgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgLyogUnVsZSAoaGV1cmlzdGljKSBmb3Igd2hlbiB0byBwYWQgdG8gYSBuZXcgcGFnZS4gIE5vdGUgdGhhdCB0aGVyZQotICAgICBhcmUgKGF0IGxlYXN0KSB0d28gd2F5cyBkZW1hbmQtcGFnZWQgKFpNQUdJQykgZmlsZXMgaGF2ZSBiZWVuCi0gICAgIGhhbmRsZWQuICBNb3N0IEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgc3RhcnQgdGhlIHRleHQgc2VnbWVudCBhdAotICAgICAoVEFSR0VUX1BBR0VfU0laRSkuICBIb3dldmVyLCBuZXdlciB2ZXJzaW9ucyBvZiBTVU5PUyBzdGFydCB0aGUgdGV4dAotICAgICBzZWdtZW50IHJpZ2h0IGFmdGVyIHRoZSBleGVjIGhlYWRlcjsgdGhlIGxhdHRlciBpcyBjb3VudGVkIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQgc2l6ZSwgYW5kIGlzIHBhZ2VkIGluIGJ5IHRoZSBrZXJuZWwgd2l0aCB0aGUgcmVzdCBvZgotICAgICB0aGUgdGV4dC4gKi8KLQotICAvKiBUaGlzIHBlcmhhcHMgaXNuJ3QgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzLCBidXQgbWFkZSBpdCBzaW1wbGVyIGZvciBtZQotICAgICB0byB1bmRlcnN0YW5kIGVub3VnaCB0byBpbXBsZW1lbnQgaXQuICBCZXR0ZXIgd291bGQgcHJvYmFibHkgYmUgdG8gZ28KLSAgICAgcmlnaHQgZnJvbSBCRkQgZmxhZ3MgdG8gYWxpZ25tZW50L3Bvc2l0aW9uaW5nIGNoYXJhY3RlcmlzdGljcy4gIEJ1dCB0aGUKLSAgICAgb2xkIGNvZGUgd2FzIHNsb3BweSBlbm91Z2ggYWJvdXQgaGFuZGxpbmcgdGhlIGZsYWdzLCBhbmQgaGFkIGVub3VnaAotICAgICBvdGhlciBtYWdpYywgdGhhdCBpdCB3YXMgYSBsaXR0bGUgaGFyZCBmb3IgbWUgdG8gdW5kZXJzdGFuZC4gIEkgdGhpbmsKLSAgICAgSSB1bmRlcnN0YW5kIGl0IGJldHRlciBub3csIGJ1dCBJIGhhdmVuJ3QgdGltZSB0byBkbyB0aGUgY2xlYW51cCB0aGlzCi0gICAgIG1pbnV0ZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLSAgICAvKiBXaGV0aGVyIG9yIG5vdCBXUF9URVhUIGlzIHNldCAtLSBsZXQgRF9QQUdFRCBvdmVycmlkZS4gICovCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICBlbHNlCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcgLyogcmVxdWlyZXMgZ2NjMiAqLwotI2lmIF9fR05VQ19fID49IDIKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXMgdGV4dD08JXgsJXgsJXg+IGRhdGE9PCV4LCV4LCV4PiBic3M9PCV4LCV4LCV4PlxuIiwKLQkgICAoeyBjaGFyICpzdHI7Ci0JICAgICAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykgewotCSAgICAgIGNhc2Ugbl9tYWdpYzogc3RyID0gIk5NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugb19tYWdpYzogc3RyID0gIk9NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugel9tYWdpYzogc3RyID0gIlpNQUdJQyI7IGJyZWFrOwotCSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgICBzdHI7Ci0JICAgIH0pLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBvX21hZ2ljOgotICAgICAgYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugel9tYWdpYzoKLSAgICAgIGFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG5fbWFnaWM6Ci0gICAgICBhZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIEJGRF9BT1VUX0RFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXg+XG4iLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbmV3X3NlY3Rpb25faG9vawotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rLAotCSAgIChiZmQgKmFiZmQsCi0JICAgIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIGJ5IHRoZSBCRkQgaW4gcmVzcG9uc2UgdG8gYSBAY29kZXtiZmRfbWFrZV9zZWN0aW9ufQotCXJlcXVlc3QuCi0qLwotYm9vbGVhbgotTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICAvKiBhbGlnbiB0byBkb3VibGUgYXQgbGVhc3QgKi8KLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8oYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gIHsKLSAgICBpZiAob2JqX3RleHRzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIudGV4dCIpKSB7Ci0Jb2JqX3RleHRzZWMoYWJmZCk9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9URVhUOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgaWYgKG9ial9kYXRhc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmRhdGEiKSkgewotCW9ial9kYXRhc2VjKGFiZmQpID0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX0RBVEE7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2Jzc3NlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi5ic3MiKSkgewotCW9ial9ic3NzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fQlNTOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gIH0KLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBvYmpfdGV4dHNlYyAoYWJmZCkKLSAgICAgICYmIHNlY3Rpb24gIT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotCi0gICAgICBjb3VudCA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zIC8gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBpZiAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwKLQkJCSAgICAgICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywKLQkJCSAgICAgICAmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCksIHRydWUpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgLyogV2UgYWxsb2NhdGUgdXNpbmcgbWFsbG9jIHRvIG1ha2UgdGhlIHZhbHVlcyBlYXN5IHRvIGZyZWUKLQkgbGF0ZXIgb24uICBJZiB3ZSBwdXQgdGhlbSBvbiB0aGUgb2JqYWxsb2MgaXQgbWlnaHQgbm90IGJlCi0JIHBvc3NpYmxlIHRvIGZyZWUgdGhlbS4gICovCi0gICAgICBzeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgICBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLSAgICAgIGlmIChzeW1zID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCAmJiBjb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzeW1zLCAxLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywgYWJmZCkKLQkgICAgICAhPSBleGVjX2hkciAoYWJmZCktPmFfc3ltcykpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotI2VuZGlmCi0KLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSBjb3VudDsKLSAgICB9Ci0gICAgICAKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID09IE5VTEwKLSAgICAgICYmIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBzdHJpbmdfY2hhcnNbQllURVNfSU5fV09SRF07Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZ3NpemU7Ci0gICAgICBjaGFyICpzdHJpbmdzOwotCi0gICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBzdHJpbmdfY2hhcnMsIEJZVEVTX0lOX1dPUkQsIDEsIGFiZmQpCi0JICAgICAgIT0gQllURVNfSU5fV09SRCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5nc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBzdHJpbmdfY2hhcnMpOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBzdHJpbmdzaXplLAotCQkJICAgICAgICZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5ncyA9IChjaGFyICopIG9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0cmluZ3NpemUgKyAxKTsKLSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHNwYWNlIGZvciB0aGUgc3RyaW5nIGNvdW50IGluIHRoZSBidWZmZXIgZm9yIGNvbnZlbmllbmNlCi0JIHdoZW4gdXNpbmcgaW5kZXhlcy4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBCWVRFU19JTl9XT1JELCAxLCBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCwKLQkJICAgIGFiZmQpCi0JICAhPSBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCkKLQl7Ci0JICBmcmVlIChzdHJpbmdzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRW5zdXJlIHRoYXQgYSB6ZXJvIGluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuICAqLwotICAgICAgc3RyaW5nc1swXSA9ICdcMCc7Ci0KLSAgICAgIHN0cmluZ3Nbc3RyaW5nc2l6ZSAtIDFdID0gMDsKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpID0gc3RyaW5nc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBhLm91dCBzeW1ib2wgaW50byBhIEJGRCBzeW1ib2wuICBUaGUgZGVzYywgb3RoZXIsIHR5cGUKLSAgIGFuZCBzeW1ib2wtPnZhbHVlIGZpZWxkcyBvZiBDQUNIRV9QVFIgd2lsbCBiZSBzZXQgZnJvbSB0aGUgYS5vdXQKLSAgIG5saXN0IHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgIHN5bWJvbC0+ZmxhZ3MgYW5kIHN5bWJvbC0+c2VjdGlvbiwgYW5kIGFkanVzdGluZyBzeW1ib2wtPnZhbHVlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Ci17Ci0gIGZsYWd3b3JkIHZpc2libGU7Ci0KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX1NUQUIpICE9IDAKLSAgICAgIHx8IGNhY2hlX3B0ci0+dHlwZSA9PSBOX0ZOKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLwotICAgICAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JewotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9GTjoKLQkgIHNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBOgotCSAgc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0JTUzoKLQkgIHNlYyA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgotCSAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IHNlYy0+dm1hOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFsbCB0eXBlcywgc28KLSAgICAgd2UganVzdCBob2xkIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGlmIHdhbnRlZC4gICovCi0gIGlmICgoY2FjaGVfcHRyLT50eXBlICYgTl9FWFQpID09IDApCi0gICAgdmlzaWJsZSA9IEJTRl9MT0NBTDsKLSAgZWxzZQotICAgIHZpc2libGUgPSBCU0ZfR0xPQkFMOwotCi0gIHN3aXRjaCAoY2FjaGVfcHRyLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgTl9BQlM6IGNhc2UgTl9BQlMgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1RFWFQ6IGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5fU0VUViBzeW1ib2xzIHVzZWQgdG8gcmVwcmVzZW50IHNldCB2ZWN0b3JzIHBsYWNlZCBpbiB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgVGhleSBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFRoZW9yZXRpY2FsbHksCi0JIGl0IHdhcyBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBlbnRyaWVzIGFuZCBjb21iaW5lIHRoZW0gd2l0aAotCSBuZXcgb25lcywgYWx0aG91Z2ggSSBkb24ndCBrbm93IGlmIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkKLQkgZG9uZS4gIFVubGVzcyB0aGF0IGZlYXR1cmUgaXMgcmVzdG9yZWQsIHRyZWF0IHRoZW0gYXMgZGF0YQotCSBzeW1ib2xzLiAgKi8KLSAgICBjYXNlIE5fU0VUVjogY2FzZSBOX1NFVFYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQTogY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CU1M6IGNhc2UgTl9CU1MgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0gICAgICB7Ci0JLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8gbWFrZQotICAgICAgICAgICB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdyBoYW5kbGVkIGluCi0gICAgICAgICAgIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQlhc2VjdGlvbiAqc2VjdGlvbjsKLQlhcmVsZW50X2NoYWluICpyZWxvYzsKLQlhc2VjdGlvbiAqaW50b19zZWN0aW9uOwotCi0JLyogVGhpcyBpcyBhIHNldCBzeW1ib2wuICBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBuYW1lCi0JICAgb2YgdGhlIHNldCAoZS5nLiwgX19DVE9SX0xJU1RfXykuICBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbAotCSAgIGlzIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gIFdlIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aAotCSAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCwgYW5kIGFkZCBhIHJlbG9jIHRvIGluc2VydCB0aGUKLQkgICBhcHByb3ByaWF0ZSB2YWx1ZSBpbnRvIHRoZSBzZWN0aW9uLgotCi0JICAgVGhpcyBhY3Rpb24gaXMgYWN0dWFsbHkgb2Jzb2xldGU7IGl0IHVzZWQgdG8gbWFrZSB0aGUKLQkgICBsaW5rZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQgdGhlIGxpbmtlciBubyBsb25nZXIgdXNlcwotCSAgIHRoaXMgZnVuY3Rpb24uICAqLwotCi0Jc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQlpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgewotCSAgICBjaGFyICpjb3B5OwotCi0JICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoY2FjaGVfcHRyLT5zeW1ib2wubmFtZSkgKyAxKTsKLQkgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3RyY3B5IChjb3B5LCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXJlbG9jID0gKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQlpZiAocmVsb2MgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhlIGNvbnN0cnVjdG9yLiAgKi8KLQlzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQkgIHsKLQkgIGNhc2UgTl9TRVRBOgotCSAgICBpbnRvX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0FCUzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VUVDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX1RFWFQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9EQVRBOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9CU1M7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHBvaW50aW5nIGludG8gdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24KLQkgICBwb2ludGluZyBhdCB0aGUgc3ltYm9sIGluIHRoZSBzZXQgdmVjdG9yIHNwZWNpZmllZC4gICovCi0JcmVsb2MtPnJlbGVudC5hZGRlbmQgPSBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZTsKLQljYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gaW50b19zZWN0aW9uOwotCXJlbG9jLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBpbnRvX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgdG8gYmVsb25nIHRvIGEgc2VjdGlvbiBkZXBlbmRpbmcgdXBvbgotCSAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGFuZCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24KLQkgICB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLiBCdWlsZCBhIHJlbG9jIGVudHJ5IHRvCi0JICAgcmVsb2NhdGUgdG8gdGhpcyBzeW1ib2wgYXR0YWNoZWQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQlzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUiB8IFNFQ19SRUxPQzsKLQotCXNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0Jc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotCXJlbG9jLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0Jc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvYzsKLQlyZWxvYy0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0Jc2VjdGlvbi0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7Ci0KLQlyZWxvYy0+cmVsZW50Lmhvd3RvID0gQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhhYmZkKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVREOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0FSTklORzoKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIHRoZSB0ZXh0IG9mIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIG5leHQKLQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdG8gYXNzb2NpYXRlIHRoZSB3YXJuaW5nIHdpdGguICBJZiBhCi0JIHJlZmVyZW5jZSBpcyBtYWRlIHRvIHRoYXQgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9XQVJOSU5HOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9JTkRSOiBjYXNlIE5fSU5EUiB8IE5fRVhUOgotICAgICAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhpcyBjb25zaXN0cyBvZiB0d28gc3ltYm9scyBpbiBhIHJvdy4KLQkgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgaW5kaXJlY3Rpb24uICBUaGUgc2Vjb25kCi0JIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiAgQSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0Ci0JIHN5bWJvbCBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0lORElSRUNUIHwgdmlzaWJsZTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1U6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLRDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS0I6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGZpZWxkcyBvZiBTWU1fUE9JTlRFUiBhY2NvcmRpbmcgdG8gQ0FDSEVfUFRSLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIsIHN5bV9wb2ludGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGNhY2hlX3B0ci0+dmFsdWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgb2ZmOwotCi0gIC8qIE1hc2sgb3V0IGFueSBleGlzdGluZyB0eXBlIGJpdHMgaW4gY2FzZSBjb3B5aW5nIGZyb20gb25lIHNlY3Rpb24KLSAgICAgdG8gYW5vdGhlci4gICovCi0gIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJj0gfk5fVFlQRTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKGNhY2hlX3B0cik7Ci0gIG9mZiA9IDA7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMsIGUuZy4sIGZvciB0aGUgKkRFQlVHKiBzZWN0aW9uIG9mIGEgQ09GRgotCSBmaWxlLiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAKLQkgY2FjaGVfcHRyLT5uYW1lICE9IE5VTEwgPyBjYWNoZV9wdHItPm5hbWUgOiBfKCIqdW5rbm93bioiKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBvZmYgPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9BQlM7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX1RFWFQ7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0RBVEE7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fQlNTOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fSU5EUjsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSBOX1VOREYgfCBOX0VYVDsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHN5bWJvbCBmcm9tIHNlY3Rpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYWdhaW4gKi8KLSAgdmFsdWUgKz0gc2VjLT52bWEgKyBvZmY7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fV0FSTklORzsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgZWxzZSBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9FWFQ7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gKChhb3V0X3N5bWJvbF90eXBlICopIGNhY2hlX3B0ciktPnR5cGU7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9BQlM6CXR5cGUgPSBOX1NFVEE7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9TRVRUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fU0VURDsgYnJlYWs7Ci0JY2FzZSBOX0JTUzoJdHlwZSA9IE5fU0VUQjsgYnJlYWs7Ci0JfQotICAgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IHR5cGU7Ci0gICAgfQotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJiBOX1RZUEUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fV0VBS0E7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9XRUFLVDsgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6CXR5cGUgPSBOX1dFQUtEOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9XRUFLQjsgYnJlYWs7Ci0JY2FzZSBOX1VOREY6CXR5cGUgPSBOX1dFQUtVOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQoYWJmZCwgdmFsdWUsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFvdXRfc3ltYm9sX3R5cGUgICpuZXcgPQotICAgIChhb3V0X3N5bWJvbF90eXBlICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBUcmFuc2xhdGUgYSBzZXQgb2YgaW50ZXJuYWwgc3ltYm9scyBpbnRvIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgKGFiZmQsIGluLCBleHQsIGNvdW50LCBzdHIsIHN0cnNpemUsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYW91dF9zeW1ib2xfdHlwZSAqaW47Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBjaGFyICpzdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dF9lbmQ7Ci0KLSAgZXh0X2VuZCA9IGV4dCArIGNvdW50OwotICBmb3IgKDsgZXh0IDwgZXh0X2VuZDsgZXh0KyssIGluKyspCi0gICAgewotICAgICAgYmZkX3ZtYSB4OwotCi0gICAgICB4ID0gR0VUX1dPUkQgKGFiZmQsIGV4dC0+ZV9zdHJ4KTsKLSAgICAgIGluLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIC8qIEZvciB0aGUgbm9ybWFsIHN5bWJvbHMsIHRoZSB6ZXJvIGluZGV4IHBvaW50cyBhdCB0aGUgbnVtYmVyCi0JIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcgdGFibGUgYnV0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZQotCSBudWxsIHN0cmluZy4gIEZvciB0aGUgZHluYW1pYyBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0JIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBfX0RZTkFNSUMgc3RydWN0dXJlIGFuZCB0aGUKLQkgemVybyBpbmRleCBwb2ludHMgYXQgYW4gYWN0dWFsIHN0cmluZy4gICovCi0gICAgICBpZiAoeCA9PSAwICYmICEgZHluYW1pYykKLQlpbi0+c3ltYm9sLm5hbWUgPSAiIjsKLSAgICAgIGVsc2UgaWYgKHggPCBzdHJzaXplKQotCWluLT5zeW1ib2wubmFtZSA9IHN0ciArIHg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbi0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCAgZXh0LT5lX3ZhbHVlKTsKLSAgICAgIGluLT5kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPmVfZGVzYyk7Ci0gICAgICBpbi0+b3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXh0LT5lX290aGVyKTsKLSAgICAgIGluLT50eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsICBleHQtPmVfdHlwZSk7Ci0gICAgICBpbi0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOwotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBpbikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoZHluYW1pYykKLQlpbi0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi0gICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLSAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvbGRfZXh0ZXJuYWxfc3ltczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICBzaXplX3QgY2FjaGVkX3NpemU7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBvbGRfZXh0ZXJuYWxfc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjYWNoZWRfc2l6ZSA9IChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpCi0JCSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotICBjYWNoZWQgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBiZmRfbWFsbG9jIChjYWNoZWRfc2l6ZSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBjYWNoZWRfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNhY2hlZF9zaXplICE9IDApCi0gICAgbWVtc2V0IChjYWNoZWQsIDAsIGNhY2hlZF9zaXplKTsKLQotICAvKiBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGludGVybmFsLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwgY2FjaGVkLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHsKLSAgICAgIGZyZWUgKGNhY2hlZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICAvKiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFueWJvZHkgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgICAgd2FudCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBzbyBpZiBpdCB3YXMgYWxsb2NhdGVkCi0gICAgIGJlY2F1c2Ugb2Ygb3VyIGNhbGwgdG8gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scywgd2UgZnJlZSBpdCB1cAotICAgICByaWdodCBhd2F5IHRvIHNhdmUgc3BhY2UuICAqLwotICBpZiAob2xkX2V4dGVybmFsX3N5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMCi0gICAgICAmJiBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMgc28gdGhhdCB3ZSBvbmx5IHdyaXRlCi0gICBvdXQgYSBwYXJ0aWN1bGFyIHN0cmluZyBvbmNlLiAgVGhpcyBoZWxwcyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUKLSAgIGxpbmtlciB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZyBlbnRyaWVzLCBiZWNhdXNlIGVhY2ggZGlmZmVyZW50Ci0gICBjb250cmlidXRpbmcgb2JqZWN0IGZpbGUgdGVuZHMgdG8gaGF2ZSBtYW55IGR1cGxpY2F0ZSBzdGFicwotICAgc3RyaW5ncy4KLQotICAgVGhpcyBoYXNoIHRhYmxlIGNvZGUgYnJlYWtzIGRieCBvbiBTdW5PUyA0LjEuMywgc28gd2UgZG9uJ3QgZG8gaXQKLSAgIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYWRkX3RvX3N0cmluZ3RhYgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVtaXRfc3RyaW5ndGFiIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgKi8KLQotc3RhdGljIElOTElORSBiZmRfc2l6ZV90eXBlCi1hZGRfdG9fc3RyaW5ndGFiIChhYmZkLCB0YWIsIHN0ciwgY29weSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICBib29sZWFuIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0KLSAgLyogQW4gaW5kZXggb2YgMCBhbHdheXMgbWVhbnMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIGlmIChzdHIgPT0gMCB8fCAqc3RyID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRG9uJ3QgaGFzaCBpZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgYmVjYXVzZSBTdW5PUyBkYngKLSAgICAgZG9lc24ndCB1bmRlcnN0YW5kIGEgaGFzaGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGhhc2ggPSB0cnVlOwotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KTsKLQotICBpZiAoaW5kZXggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEFkZCBCWVRFU19JTl9XT1JEIHRvIHRoZSByZXR1cm4gdmFsdWUgdG8gYWNjb3VudCBmb3IgdGhlCi0JIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4gICovCi0gICAgICBpbmRleCArPSBCWVRFU19JTl9XT1JEOwotICAgIH0KLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgaXMgYWxyZWFkeSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlCi0gICBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVtaXRfc3RyaW5ndGFiIChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICBiZmRfYnl0ZSBidWZmZXJbQllURVNfSU5fV09SRF07Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBzdGFydHMgd2l0aCB0aGUgc2l6ZS4gICovCi0gIFBVVF9XT1JEIChhYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpICsgQllURVNfSU5fV09SRCwgYnVmZmVyKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBCWVRFU19JTl9XT1JELCBhYmZkKSAhPSBCWVRFU19JTl9XT1JEKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKTsKLX0KLQwKLWJvb2xlYW4KLU5BTUUoYW91dCx3cml0ZV9zeW1zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgOwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLQotICBzdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKmcgPSBnZW5lcmljW2NvdW50XTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBuc3A7Ci0KLSAgICAgIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIsIGctPm5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIFBVVF9XT1JEIChhYmZkLCBpbmR4LCAoYmZkX2J5dGUgKikgbnNwLmVfc3RyeCk7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyKGcpID09IGFiZmQtPnh2ZWMtPmZsYXZvdXIpCi0JewotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5kZXNjLCAgbnNwLmVfZGVzYyk7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+b3RoZXIsICBuc3AuZV9vdGhlcik7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+dHlwZSwgIG5zcC5lX3R5cGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwwLCBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX3R5cGUpOwotCX0KLQotICAgICAgaWYgKCEgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGcsICZuc3ApKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3dyaXRlKChQVFIpJm5zcCwxLEVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCi0JICAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBOQjogYEtFRVBJVCcgY3VycmVudGx5IG92ZXJsYXlzIGB1ZGF0YS5wJywgc28gc2V0IHRoaXMgb25seQotCSBoZXJlLCBhdCB0aGUgZW5kLiAgKi8KLSAgICAgIGctPktFRVBJVCA9IGNvdW50OwotICAgIH0KLQotICBpZiAoISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgc3RydGFiKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyhhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopKCBzeW1iYXNlKyspOwotICAgICpsb2NhdGlvbisrID0wOwotICAgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotDAotLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KLS8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgLyogWFhYIFRoaXMgcmVsaWVzIG9uIHJlbG9jcyBjb21pbmcgZnJvbSBhLm91dCBmaWxlcy4gICovCi0gIHJfYmFzZXJlbCA9IChnLT5ob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0gIHJfam1wdGFibGUgPSAoZy0+aG93dG8tPnR5cGUgJiAxNikgIT0gMDsKLSAgcl9yZWxhdGl2ZSA9IChnLT5ob3d0by0+dHlwZSAmIDMyKSAhPSAwOwotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pbmRleCA9IE5fQUJTOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQlyX2V4dGVybiA9IDE7Ci0Jcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCXwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCi0JIHwgKHJfYmFzZXJlbD8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKLQkgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUc6IDApCi0JICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRzogMCkKLQkgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0gZWxzZSB7Ci0JbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQluYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQluYXRwdHItPnJfdHlwZVswXSA9Ci0JIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JICAgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSAgICB8IChyX2ptcHRhYmxlPyAgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFOiAwKQotCSAgICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRTogMCkKLQkgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgICB9Ci19Ci0KLQotLyogRXh0ZW5kZWQgc3R1ZmYgKi8KLS8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQ7Ci0gIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByX2FkZGVuZCArPSAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0Jcl9leHRlcm4gPSAxOwotICAgICAgZWxzZQotCXJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICgocl9leHRlcm4/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc6IDApCi0gICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgIChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLSAgICAgIHwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gIH0KLQotICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOwotfQotCi0vKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCi0gICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgotICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCi0KLSAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKLSAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKLSAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KLQotCi0jZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAotICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAotICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKLSAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0gICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCi0gICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCi0gICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQToJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBkZWZhdWx0OgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9ICAgICAJCQkJCQkJCVwKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMl07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMl0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0gIH0KLQotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZTsKLQotICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIHN5bWJvbCB0YWJsZSwKLSAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4gIHJfZXh0ZXJuIGp1c3QgcmVmbGVjdHMKLSAgICAgd2hldGhlciB0aGUgc3ltYm9sIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCi0gIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoR0VUX1NXT1JEKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0gIHVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzBdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLSAgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgcl9wY3JlbCAgID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0gICAgcl9qbXB0YWJsZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLSAgICByX3JlbGF0aXZlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotICAgIHJfbGVuZ3RoICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLSAgICAgIAkJCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0gIH0KLQotICBob3d0b19pZHggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCSAgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlOwotICBCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gIEJGRF9BU1NFUlQgKGNhY2hlX3B0ci0+aG93dG8tPnR5cGUgIT0gKHVuc2lnbmVkIGludCkgLTEpOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfYmFzZXJlbCkKLSAgICByX2V4dGVybiA9IDE7Ci0KLSAgaWYgKHJfZXh0ZXJuICYmIHJfaW5kZXggPiBzeW1jb3VudCkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBhcnJhbmdlIHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bAotICAgICAgICAgdG8gc2VlIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYmFkLiAgKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSBleGVjX2hkcihhYmZkKS0+YV90cnNpemU7Ci0gIGVsc2UgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jcyA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPQotCShzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCU1ZX3N3YXBfZXh0X3JlbG9jX2luIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NzKTsKLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjYWNoZV9wdHIgLSByZWxvY19jYWNoZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCB8fCBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU1ZX3N3YXBfZXh0X3JlbG9jX291dCAoYWJmZCwgKmdlbmVyaWMsCi0JCQkgICAgICAgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLQkgICBjb3VudCAhPSAwOwotCSAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLQlNWV9zd2FwX3N0ZF9yZWxvY19vdXQoYWJmZCwgKmdlbmVyaWMsIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopbmF0cHRyKTsKLSAgICB9Ci0KLSAgaWYgKCBiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgewotICAgIGJmZF9yZWxlYXNlKGFiZmQsIG5hdGl2ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUgKi8KLWxvbmcKLU5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmIChzZWN0aW9uID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgICpyZWxwdHIgPSBOVUxMOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghKHRibHB0ciB8fCBOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7Ci0gICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQgKyspIHsKLSAgICAgICpyZWxwdHIgKysgPSAmY2hhaW4tPnJlbGVudDsKLSAgICAgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLSAgICAgIHsKLQkqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICAgIH0KLSAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7Ci0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50KzEpKTsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikKLQkgICAgKiAoKGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkKLQkgICAgICAgKyAxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKQotCSAgICAqICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKQotCSAgICAgICArIDEpKTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgcmV0dXJuIHNpemVvZiAoYXJlbGVudCAqKTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIC0xOwotfQotCi0MCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKShhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSsxKSAqIChzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKkFSR1NVU0VEKi8KLSBhbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgKGlnbm9yZV9hYmZkLCBpZ25vcmVfc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKmlnbm9yZV9zeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIChhbGVudCAqKU5VTEw7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotCi0gIGlmIChyZXQtPnR5cGUgPT0gJz8nKQotICAgIHsKLSAgICAgIGludCB0eXBlX2NvZGUgPSBhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlICYgMHhmZjsKLSAgICAgIGNvbnN0IGNoYXIgKnN0YWJfbmFtZSA9IGJmZF9nZXRfc3RhYl9uYW1lICh0eXBlX2NvZGUpOwotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKHN0YWJfbmFtZSA9PSBOVUxMKQotCXsKLQkgIHNwcmludGYoYnVmLCAiKCVkKSIsIHR5cGVfY29kZSk7Ci0JICBzdGFiX25hbWUgPSBidWY7Ci0JfQotICAgICAgcmV0LT50eXBlID0gJy0nOwotICAgICAgcmV0LT5zdGFiX3R5cGUgPSB0eXBlX2NvZGU7Ci0gICAgICByZXQtPnN0YWJfb3RoZXIgPSAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZik7Ci0gICAgICByZXQtPnN0YWJfZGVzYyA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZik7Ci0gICAgICByZXQtPnN0YWJfbmFtZSA9IHN0YWJfbmFtZTsKLSAgICB9Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotTkFNRShhb3V0LHByaW50X3N5bWJvbCkgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWFmaWxlOwotCi0gIHN3aXRjaCAoaG93KSB7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGlmIChzeW1ib2wtPm5hbWUpCi0gICAgICBmcHJpbnRmKGZpbGUsIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgZnByaW50ZihmaWxlLCIlNHggJTJ4ICUyeCIsKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKSwKLQkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUpKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICB7Ci0gICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZigoUFRSKWZpbGUsc3ltYm9sKTsKLQotICAgICAgZnByaW50ZihmaWxlLCIgJS01cyAlMDR4ICUwMnggJTAyeCIsCi0JICAgICAgc2VjdGlvbl9uYW1lLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSAgJiAweGZmKSk7Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotICAgICAgICBmcHJpbnRmKGZpbGUsIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIElmIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDFNQiB0byBob2xkIHRoZSBnZW5lcmljCi0gICBzeW1ib2xzLCB3ZSB1c2UgdGhlIGdlbmVyaWMgbWluaXN5bWJvbCBtZXRob3JkOiBpdCdzIGZhc3Rlciwgc2luY2UKLSAgIGl0IG9ubHkgdHJhbnNsYXRlcyB0aGUgc3ltYm9scyBvbmNlLCBub3QgbXVsdGlwbGUgdGltZXMuICAqLwotI2RlZmluZSBNSU5JU1lNX1RIUkVTSE9MRCAoMTAwMDAwMCAvIHNpemVvZiAoYXN5bWJvbCkpCi0KLS8qIFJlYWQgbWluaXN5bWJvbHMuICBGb3IgbWluaXN5bWJvbHMsIHdlIHVzZSB0aGUgdW5tb2RpZmllZCBhLm91dAotICAgc3ltYm9scy4gIFRoZSBtaW5pc3ltYm9sX3RvX3N5bWJvbCBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZXNlIGludG8KLSAgIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgLyogV2UgY291bGQgaGFuZGxlIHRoZSBkeW5hbWljIHN5bWJvbHMgaGVyZSBhcyB3ZWxsLCBidXQgaXQncwotICAgICAgICAgZWFzaWVyIHRvIGhhbmQgdGhlbSBvZmYuICAqLwotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLSAgICB9Ci0KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLQotICAqbWluaXN5bXNwID0gKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgLyogQnkgcGFzc2luZyB0aGUgZXh0ZXJuYWwgc3ltYm9scyBiYWNrIGZyb20gdGhpcyByb3V0aW5lLCB3ZSBhcmUKLSAgICAgZ2l2aW5nIHVwIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3J5IGJsb2NrLiAgQ2xlYXIKLSAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcywgc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIGZyZWUgaXQKLSAgICAgb3Vyc2VsdmVzLiAgKi8KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotCi0gICpzaXplcCA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIHJldHVybiBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotfQotCi0vKiBDb252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIEJGRCBhc3ltYm9sLiAgQSBtaW5pc3ltYm9sIGlzIGp1c3QgYW4KLSAgIHVubW9kaWZpZWQgYS5vdXQgc3ltYm9sLiAgVGhlIFNZTSBhcmd1bWVudCBpcyBhIHN0cnVjdHVyZSByZXR1cm5lZAotICAgYnkgYmZkX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaCB3ZSBmaWxsIGluIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmIChkeW5hbWljCi0gICAgICB8fCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLQotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogV2UgY2FsbCB0cmFuc2xhdGVfc3ltYm9sX3RhYmxlIHRvIHRyYW5zbGF0ZSBhIHNpbmdsZSBzeW1ib2wuICAqLwotICBpZiAoISAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpCi0JIChhYmZkLAotCSAgKGFvdXRfc3ltYm9sX3R5cGUgKikgc3ltLAotCSAgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBtaW5pc3ltLAotCSAgKGJmZF9zaXplX3R5cGUpIDEsCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplIChhYmZkKSwKLQkgIGZhbHNlKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHN5bTsKLX0KLQotLyoKLSBwcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlCi0gd2FudGVkIGxvY2F0aW9uLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotICAgICAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICAvKiBSdW4gZG93biB0aGUgZmlsZSBsb29raW5nIGZvciB0aGUgZmlsZW5hbWUsIGZ1bmN0aW9uIGFuZCBsaW5lbnVtYmVyICovCi0gIGFzeW1ib2wgKipwOwotICBDT05TVCBjaGFyICpkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKm1haW5fZmlsZV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICpsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGN1cnJlbnRfZmlsZV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLwotICBDT05TVCBjaGFyICpsaW5lX2RpcmVjdG9yeV9uYW1lID0gTlVMTDsgLyogVmFsdWUgb2YgZGlyZWN0b3J5X25hbWUgYXQgbGluZSBudW1iZXIuICovCi0gIGJmZF92bWEgbG93X2xpbmVfdm1hID0gMDsKLSAgYmZkX3ZtYSBsb3dfZnVuY192bWEgPSAwOwotICBhc3ltYm9sICpmdW5jID0gMDsKLSAgc2l6ZV90IGZpbGVsZW4sIGZ1bmNsZW47Ci0gIGNoYXIgKmJ1ZjsKLQotICAqZmlsZW5hbWVfcHRyID0gYWJmZC0+ZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gMDsKLSAgKmxpbmVfcHRyID0gMDsKLSAgaWYgKHN5bWJvbHMgIT0gKGFzeW1ib2wgKiopTlVMTCkgewotICAgIGZvciAocCA9IHN5bWJvbHM7ICpwOyBwKyspIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgICpxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotICAgIG5leHQ6Ci0gICAgICBzd2l0Y2ggKHEtPnR5cGUpewotICAgICAgY2FzZSBOX1RFWFQ6Ci0JLyogSWYgdGhpcyBsb29rcyBsaWtlIGEgZmlsZSBuYW1lIHN5bWJvbCwgYW5kIGl0IGNvbWVzIGFmdGVyCi0gICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgYnV0IGJlZm9yZSB0aGUKLSAgICAgICAgICAgb2Zmc2V0LCB0aGVuIHdlIGhhdmUgcHJvYmFibHkgbm90IGZvdW5kIHRoZSByaWdodCBsaW5lCi0gICAgICAgICAgIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQKLQkgICAgJiYgKChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEKLQkJICYmIChsaW5lX2ZpbGVfbmFtZSAhPSBOVUxMCi0JCSAgICAgfHwgKmxpbmVfcHRyICE9IDApKQotCQl8fCAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hCi0JCSAgICAmJiBmdW5jICE9IE5VTEwpKSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgICBzeW1uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JICAgIGlmIChzdHJjbXAgKHN5bW5hbWUgKyBzdHJsZW4gKHN5bW5hbWUpIC0gMiwgIi5vIikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JCSAgewotCQkgICAgKmxpbmVfcHRyID0gMDsKLQkJICAgIGxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLQkJICB9Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEpCi0JCSAgZnVuYyA9IE5VTEw7Ci0JICAgICAgfQotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU086Ci0JLyogSWYgdGhpcyBzeW1ib2wgaXMgbGVzcyB0aGFuIHRoZSBvZmZzZXQsIGJ1dCBncmVhdGVyIHRoYW4KLSAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdlIGhhdmUgZm91bmQgc28gZmFyLCB0aGVuIHdlIGhhdmUgbm90Ci0gICAgICAgICAgIGZvdW5kIHRoZSByaWdodCBsaW5lIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICB7Ci0JICAgIGlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JICAgICAgewotCQkqbGluZV9wdHIgPSAwOwotCQlsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JICAgICAgfQotCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQotCSAgICAgIGZ1bmMgPSBOVUxMOwotCSAgfQotCi0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCS8qIExvb2sgYWhlYWQgdG8gbmV4dCBzeW1ib2wgdG8gY2hlY2sgaWYgdGhhdCB0b28gaXMgYW4gTl9TTy4gKi8KLQlwKys7Ci0JaWYgKCpwID09IE5VTEwpCi0JICBicmVhazsKLQlxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotCWlmIChxLT50eXBlICE9IChpbnQpTl9TTykKLQkgIGdvdG8gbmV4dDsKLQotCS8qIEZvdW5kIGEgc2Vjb25kIE5fU08gIEZpcnN0IGlzIGRpcmVjdG9yeTsgc2Vjb25kIGlzIGZpbGVuYW1lLiAqLwotCWRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWlmIChvYmpfdGV4dHNlYyhhYmZkKSAhPSBzZWN0aW9uKQotCSAgZ290byBkb25lOwotCWJyZWFrOwotICAgICAgY2FzZSBOX1NPTDoKLQljdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU0xJTkU6Ci0KLSAgICAgIGNhc2UgTl9EU0xJTkU6Ci0gICAgICBjYXNlIE5fQlNMSU5FOgotCS8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCByZXNvbHZlcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUKLSAgICAgICAgICAgYWxyZWFkeS4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfbGluZV92bWEKLQkgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgIHsKLQkgICAgKmxpbmVfcHRyID0gcS0+ZGVzYzsKLQkgICAgbG93X2xpbmVfdm1hID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICBsaW5lX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCSAgICBsaW5lX2RpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5fRlVOOgotCXsKLQkgIC8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCBpcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUgYWxyZWFkeSAqLwotCSAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuY192bWEgJiYKLQkgICAgICBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KSB7Ci0JICAgIGxvd19mdW5jX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgZnVuYyA9IChhc3ltYm9sICopcTsKLQkgIH0KLQkgIGVsc2UgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKLQkgICAgZ290byBkb25lOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotIGRvbmU6Ci0gIGlmICgqbGluZV9wdHIgIT0gMCkKLSAgICB7Ci0gICAgICBtYWluX2ZpbGVfbmFtZSA9IGxpbmVfZmlsZV9uYW1lOwotICAgICAgZGlyZWN0b3J5X25hbWUgPSBsaW5lX2RpcmVjdG9yeV9uYW1lOwotICAgIH0KLQotICBpZiAobWFpbl9maWxlX25hbWUgPT0gTlVMTAotICAgICAgfHwgSVNfQUJTT0xVVEVfUEFUSCAobWFpbl9maWxlX25hbWUpCi0gICAgICB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgIGZpbGVsZW4gPSAwOwotICBlbHNlCi0gICAgZmlsZWxlbiA9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSk7Ci0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgZnVuY2xlbiA9IDA7Ci0gIGVsc2UKLSAgICBmdW5jbGVuID0gc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChmdW5jKSk7Ci0KLSAgaWYgKGFkYXRhIChhYmZkKS5saW5lX2J1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGFkYXRhIChhYmZkKS5saW5lX2J1Zik7Ci0gIGlmIChmaWxlbGVuICsgZnVuY2xlbiA9PSAwKQotICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChmaWxlbGVuICsgZnVuY2xlbiArIDMpOwotICAgICAgYWRhdGEgKGFiZmQpLmxpbmVfYnVmID0gYnVmOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKElTX0FCU09MVVRFX1BBVEggKG1haW5fZmlsZV9uYW1lKSB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotCSpmaWxlbmFtZV9wdHIgPSBtYWluX2ZpbGVfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzcHJpbnRmIChidWYsICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsIG1haW5fZmlsZV9uYW1lKTsKLQkgICpmaWxlbmFtZV9wdHIgPSBidWY7Ci0JICBidWYgKz0gZmlsZWxlbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IGZ1bmMtPm5hbWU7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBUaGUgY2FsbGVyIGV4cGVjdHMgYSBzeW1ib2wgbmFtZS4gIFdlIGFjdHVhbGx5IGhhdmUgYQotCSBmdW5jdGlvbiBuYW1lLCB3aXRob3V0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUuICBQdXQgdGhlCi0JIHVuZGVyc2NvcmUgYmFjayBpbiwgc28gdGhhdCB0aGUgY2FsbGVyIGdldHMgYSBzeW1ib2wgbmFtZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnKQotCXN0cmNweSAoYnVmLCBmdW5jdGlvbik7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIHN0cmNweSAoYnVmICsgMSwgZnVuY3Rpb24pOwotCX0KLSAgICAgIC8qIEhhdmUgdG8gcmVtb3ZlIDogc3R1ZmYgKi8KLSAgICAgIHAgPSBzdHJjaHIgKGJ1ZiwgJzonKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBidWY7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEKi8KLWludAotTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKSAoYWJmZCwgZXhlY2FibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjYWJsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotfQotCi0vKiBGcmVlIGFsbCBpbmZvcm1hdGlvbiB3ZSBoYXZlIGNhY2hlZCBmb3IgdGhpcyBCRkQuICBXZSBjYW4gYWx3YXlzCi0gICByZWFkIGl0IGFnYWluIGxhdGVyIGlmIHdlIG5lZWQgaXQuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpvOwotCi0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2RlZmluZSBCRkNJX0ZSRUUoeCkgaWYgKHggIT0gTlVMTCkgeyBmcmVlICh4KTsgeCA9IE5VTEw7IH0KLSAgQkZDSV9GUkVFIChvYmpfYW91dF9zeW1ib2xzIChhYmZkKSk7Ci0jaWZkZWYgVVNFX01NQVAKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSAwOwotICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0gIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpKTsKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSAwOwotI2Vsc2UKLSAgQkZDSV9GUkVFIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkpOwotI2VuZGlmCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICBCRkNJX0ZSRUUgKG8tPnJlbG9jYXRpb24pOwotI3VuZGVmIEJGQ0lfRlJFRQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogYS5vdXQgbGluayBjb2RlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+d3JpdHRlbiA9IGZhbHNlOwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBhYmZkLCBuZXdmdW5jKTsKLX0KLQotLyogQ3JlYXRlIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpIChyZXQsIGFiZmQsCi0JCQkJCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIEdpdmVuIGFuIGEub3V0IEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkoYWJmZCwgaW5mbywgYW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGFvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCAhICpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZyZWUgdXAgdGhlIGludGVybmFsIHN5bWJvbHMgcmVhZCBmcm9tIGFuIGEub3V0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMKQotICAgIHsKLSNpZmRlZiBVU0VfTU1BUAotICAgICAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotI2Vsc2UKLSAgICAgIGZyZWUgKChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSNlbmRpZgotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEw7Ci0gICAgfQotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpKTsKLSNlbHNlCi0gICAgICBmcmVlICgoUFRSKSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gKGNoYXIgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIGludGVybmFsIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkCi0gICBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFdlIHNob3VsZCBpbmNsdWRlIHRoaXMgb2JqZWN0IGZpbGUgaWYgaXQKLSAgIGRlZmluZXMgYW55IHN5bWJvbHMgd2hpY2ggYXJlIGN1cnJlbnRseSB1bmRlZmluZWQuICBJZiB0aGlzIG9iamVjdAotICAgZmlsZSBkZWZpbmVzIGEgY29tbW9uIHN5bWJvbCwgdGhlbiB3ZSBtYXkgYWRqdXN0IHRoZSBzaXplIG9mIHRoZQotICAga25vd24gc3ltYm9sIGJ1dCB3ZSBkbyBub3QgaW5jbHVkZSB0aGUgb2JqZWN0IGZpbGUgaW4gdGhlIGxpbmsKLSAgICh1bmxlc3MgdGhlcmUgaXMgc29tZSBvdGhlciByZWFzb24gdG8gaW5jbHVkZSBpdCkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpwZW5kOwotICBjaGFyICpzdHJpbmdzOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scy4gICovCi0gIHAgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgcGVuZCA9IHAgKyBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCk7Ci0gIGZvciAoOyBwIDwgcGVuZDsgcCsrKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIHAtPmVfdHlwZSk7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIElnbm9yZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHRlcm5hbGx5IHZpc2libGUuICBUaGlzIGlzIGFuCi0JIG9wdGltaXphdGlvbiBvbmx5LCBhcyB3ZSBjaGVjayB0aGUgdHlwZSBtb3JlIHRob3JvdWdobHkKLQkgYmVsb3cuICAqLwotICAgICAgaWYgKCgodHlwZSAmIE5fRVhUKSA9PSAwCi0JICAgfHwgKHR5cGUgJiBOX1NUQUIpICE9IDAKLQkgICB8fCB0eXBlID09IE5fRk4pCi0JICAmJiB0eXBlICE9IE5fV0VBS0EKLQkgICYmIHR5cGUgIT0gTl9XRUFLVAotCSAgJiYgdHlwZSAhPSBOX1dFQUtECi0JICAmJiB0eXBlICE9IE5fV0VBS0IpCi0JewotCSAgaWYgKHR5cGUgPT0gTl9XQVJOSU5HCi0JICAgICAgfHwgdHlwZSA9PSBOX0lORFIpCi0JICAgICsrcDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotCSB1bmRlZmluZWQgb3IgY29tbW9uLiAgKi8KLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCXsKLQkgIGlmICh0eXBlID09IChOX0lORFIgfCBOX0VYVCkpCi0JICAgICsrcDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fVEVYVCB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9EQVRBIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0JTUyB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9BQlMgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSkKLQl7Ci0JICAvKiBUaGlzIG9iamVjdCBmaWxlIGRlZmluZXMgdGhpcyBzeW1ib2wuICBXZSBtdXN0IGxpbmsgaXQKLQkgICAgIGluLiAgVGhpcyBpcyB0cnVlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY3VycmVudAotCSAgICAgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBjb21tb24uICBJZiB0aGUKLQkgICAgIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBjb21tb24sIHdlIGhhdmUgYSBjYXNlIGluIHdoaWNoIHdlCi0JICAgICBoYXZlIGFscmVhZHkgc2VlbiBhbiBvYmplY3QgZmlsZSBpbmNsdWRpbmcKLQkgICAgICAgICBpbnQgYTsKLQkgICAgIGFuZCB0aGlzIG9iamVjdCBmaWxlIGZyb20gdGhlIGFyY2hpdmUgaW5jbHVkZXMKLQkgICAgICAgICBpbnQgYSA9IDU7Ci0JICAgICBJbiBzdWNoIGEgY2FzZSB3ZSBtdXN0IGluY2x1ZGUgdGhpcyBvYmplY3QgZmlsZS4KLQotCSAgICAgRklYTUU6IFRoZSBTdW5PUyA0LjEuMyBsaW5rZXIgd2lsbCBwdWxsIGluIHRoZSBhcmNoaXZlCi0JICAgICBlbGVtZW50IGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgLmRhdGEgc2VjdGlvbiwKLQkgICAgIGJ1dCBub3QgaWYgaXQgaXMgZGVmaW5lZCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoYXQKLQkgICAgIHNlZW1zIGEgYml0IGNyYXp5IHRvIG1lLCBhbmQgSSBoYXZlbid0IGltcGxlbWVudGVkIGl0LgotCSAgICAgSG93ZXZlciwgaXQgbWlnaHQgYmUgY29ycmVjdC4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX1VOREYgfCBOX0VYVCkpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgdmFsdWUgPSBHRVRfV09SRCAoYWJmZCwgcC0+ZV92YWx1ZSk7Ci0JICBpZiAodmFsdWUgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGNvbW1vbiBpbiB0aGUgb2JqZWN0IGZyb20gdGhlIGFyY2hpdmUKLQkJIGZpbGUuICAqLwotCSAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCQl7Ci0JCSAgYmZkICpzeW1iZmQ7Ci0JCSAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JCSAgc3ltYmZkID0gaC0+dS51bmRlZi5hYmZkOwotCQkgIGlmIChzeW1iZmQgPT0gKGJmZCAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCBhcyB1bmRlZmluZWQgZnJvbQotCQkJIG91dHNpZGUgQkZELiAgV2UgYXNzdW1lIHRoYXQgd2Ugc2hvdWxkIGxpbmsKLQkJCSBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGRvbmUgZm9yIHRoZSAtdQotCQkJIG9wdGlvbiBpbiB0aGUgbGlua2VyLiAgKi8KLQkJICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLAotCQkJCQkJCQkgICAgIGFiZmQsCi0JCQkJCQkJCSAgICAgbmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkJICAgICAgcmV0dXJuIHRydWU7Ci0JCSAgICB9Ci0JCSAgLyogVHVybiB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpbnRvIGEgY29tbW9uCi0JCSAgICAgc3ltYm9sLiAgSXQgaXMgYWxyZWFkeSBvbiB0aGUgdW5kZWZzIGxpc3QuICAqLwotCQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkJICBoLT51LmMucCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCi0JCQkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JCSAgLyogRklYTUU6IFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQuICBUaGUgbWF4aW11bQotCQkgICAgIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wgc2hvdWxkIGJlIHNldCBieSB0aGUKLQkJICAgICBhcmNoaXRlY3R1cmUgb2YgdGhlIG91dHB1dCBmaWxlLCBub3Qgb2YgdGhlIGlucHV0Ci0JCSAgICAgZmlsZS4gICovCi0JCSAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOwotCQkgIGlmIChwb3dlciA+IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcikKLQkJICAgIHBvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotCQkgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQotCQkgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsCi0JCQkJCQkJCSJDT01NT04iKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbCBpZgotCQkgICAgIG5lY2Vzc2FyeS4gICovCi0JCSAgaWYgKHZhbHVlID4gaC0+dS5jLnNpemUpCi0JCSAgICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IE5fV0VBS0EKLQkgIHx8IHR5cGUgPT0gTl9XRUFLVAotCSAgfHwgdHlwZSA9PSBOX1dFQUtECi0JICB8fCB0eXBlID09IE5fV0VBS0IpCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgd2VhayBidXQgZGVmaW5lZC4gIFdlIG11c3QgcHVsbCBpdCBpbiBpZgotCSAgICAgdGhlIGN1cnJlbnQgbGluayBzeW1ib2wgaXMgdW5kZWZpbmVkLCBidXQgd2UgZG9uJ3Qgd2FudAotCSAgICAgaXQgaWYgdGhlIGN1cnJlbnQgbGluayBzeW1ib2wgaXMgY29tbW9uLiAgKi8KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYWxsIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gKCphZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJICAgICBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLAotCQkJCSAgICAgYm9vbGVhbiwKLQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgYmZkX3NpemVfdHlwZSBzeW1fY291bnQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIGJvb2xlYW4gY29weTsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpwZW5kOwotCi0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgc3ltX2NvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpOwotICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgY29weSA9IGZhbHNlOwotICBlbHNlCi0gICAgY29weSA9IHRydWU7Ci0KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX2R5bmFtaWNfc3ltYm9scyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX2R5bmFtaWNfc3ltYm9scykKLQkgICAgIChhYmZkLCBpbmZvLCAmc3ltcywgJnN5bV9jb3VudCwgJnN0cmluZ3MpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAotICAgICB0byBwYXJ0aWN1bGFyIHN5bWJvbHMuICBXZSBjb3VsZCBqdXN0IGxvb2sgdGhlbSB1cCBpbiB0aGUgaGFzaAotICAgICB0YWJsZSwgYnV0IGtlZXBpbmcgdGhlIGxpc3QgaXMgbW9yZSBlZmZpY2llbnQuICBQZXJoYXBzIHRoaXMKLSAgICAgc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIGluZm8tPmtlZXBfbWVtb3J5LiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKChzaXplX3QpIHN5bV9jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCAmJiBzeW1fY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0KLSAgYWRkX29uZV9zeW1ib2wgPSBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmFkZF9vbmVfc3ltYm9sOwotICBpZiAoYWRkX29uZV9zeW1ib2wgPT0gTlVMTCkKLSAgICBhZGRfb25lX3N5bWJvbCA9IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sOwotCi0gIHAgPSBzeW1zOwotICBwZW5kID0gcCArIHN5bV9jb3VudDsKLSAgZm9yICg7IHAgPCBwZW5kOyBwKyssIHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0KLSAgICAgICpzeW1faGFzaCA9IE5VTEw7Ci0KLSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgcC0+ZV90eXBlKTsKLQotICAgICAgLyogSWdub3JlIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLSAgICAgIHZhbHVlID0gR0VUX1dPUkQgKGFiZmQsIHAtPmVfdmFsdWUpOwotICAgICAgZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICAgICAgc3RyaW5nID0gTlVMTDsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBOX1VOREY6Ci0JY2FzZSBOX0FCUzoKLQljYXNlIE5fVEVYVDoKLQljYXNlIE5fREFUQToKLQljYXNlIE5fQlNTOgotCWNhc2UgTl9GTl9TRVE6Ci0JY2FzZSBOX0NPTU06Ci0JY2FzZSBOX1NFVFY6Ci0JY2FzZSBOX0ZOOgotCSAgLyogSWdub3JlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4gICovCi0JICBjb250aW51ZTsKLQljYXNlIE5fSU5EUjoKLQkgIC8qIElnbm9yZSBsb2NhbCBpbmRpcmVjdCBzeW1ib2wuICAqLwotCSAgKytwOwotCSAgKytzeW1faGFzaDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIGlmICh2YWx1ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgZmxhZ3MgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0FCUyB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQljYXNlIE5fU0VUViB8IE5fRVhUOgotCSAgLyogVHJlYXQgTl9TRVRWIHN5bWJvbHMgYXMgTl9EQVRBIHN5bWJvbDsgc2VlIGNvbW1lbnQgaW4KLQkgICAgIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuICAqLwotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0JTUyB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fSU5EUiB8IE5fRVhUOgotCSAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhlIG5leHQgc3ltYm9sIGlzIHRoZSBzeW1ib2wKLQkgICAgIHdoaWNoIHRoaXMgb25lIHJlYWxseSBpcy4gICovCi0JICBCRkRfQVNTRVJUIChwICsgMSA8IHBlbmQpOwotCSAgKytwOwotCSAgc3RyaW5nID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotCSAgc2VjdGlvbiA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfSU5ESVJFQ1Q7Ci0JICBicmVhazsKLQljYXNlIE5fQ09NTSB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUQTogY2FzZSBOX1NFVEEgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fU0VURDogY2FzZSBOX1NFVEQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRCOiBjYXNlIE5fU0VUQiB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fV0FSTklORzoKLQkgIC8qIEEgd2FybmluZyBzeW1ib2wuICBUaGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuCi0JICAgICBhYm91dC4gICovCi0JICBCRkRfQVNTRVJUIChwICsgMSA8IHBlbmQpOwotCSAgKytwOwotCSAgc3RyaW5nID0gbmFtZTsKLQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9XQVJOSU5HOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtVOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtBOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtUOgotCSAgc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLRDoKLQkgIHNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0I6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghICgoKmFkZF9vbmVfc3ltYm9sKQotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBmYWxzZSwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBSZXN0cmljdCB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sIGJhc2VkIG9uCi0JIHRoZSBhcmNoaXRlY3R1cmUsIHNpbmNlIGEub3V0IGhhcyBubyB3YXkgdG8gcmVwcmVzZW50Ci0JIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgYSBzZWN0aW9uIGluIGEgLm8gZmlsZS4gIEZJWE1FOgotCSBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0OiBpdCBzaG91bGQgdXNlIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlCi0JIG91dHB1dCBmaWxlLCBub3QgdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIGlmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAmJiAoKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlciA+Ci0JICAgICAgYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyKSkKLQkoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0KLQkgIGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHNldCBzeW1ib2wsIGFuZCB3ZSBhcmUgbm90IGJ1aWxkaW5nIHNldHMsIHRoZW4KLQkgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBoYXNoIGVudHJ5IHRvIG5vdCBoYXZlIGJlZW4gc2V0LiAgSW4KLQkgc3VjaCBhIGNhc2UsIHRyZWF0IHRoZSBzeW1ib2wgYXMgbm90IGdsb2JhbGx5IGRlZmluZWQuICAqLwotICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgQkZEX0FTU0VSVCAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKTsKLQkgICpzeW1faGFzaCA9IE5VTEw7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCSsrc3ltX2hhc2g7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQSBoYXNoIHRhYmxlIHVzZWQgZm9yIGhlYWRlciBmaWxlcyB3aXRoIE5fQklOQ0wgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIHRvdGFscyB0aGF0IHdlIGhhdmUgZm91bmQgZm9yIGEgcGFydGljdWxhciBoZWFkZXIKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscwotewotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqbmV4dDsKLSAgYmZkX3ZtYSB0b3RhbDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTGlzdCBvZiB0b3RhbHMgd2UgaGF2ZSBmb3VuZCBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKnRvdGFsczsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19pbmNsdWRlc19sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIER1cmluZyB0aGUgZmluYWwgbGluayBzdGVwIHdlIG5lZWQgdG8gcGFzcyBhcm91bmQgYSBidW5jaCBvZgotICAgaW5mb3JtYXRpb24sIHNvIHdlIGRvIGl0IGluIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgYmZkLiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBSZWxvYyBmaWxlIHBvc2l0aW9ucy4gICovCi0gIGZpbGVfcHRyIHRyZWxvZmYsIGRyZWxvZmY7Ci0gIC8qIEZpbGUgcG9zaXRpb24gb2Ygc3ltYm9scy4gICovCi0gIGZpbGVfcHRyIHN5bW9mZjsKLSAgLyogU3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBIZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZSBpbmNsdWRlczsKLSAgLyogQSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgUFRSIHJlbG9jczsKLSAgLyogQSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHN5bWJvbCBtYXAgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGludCAqc3ltYm9sX21hcDsKLSAgLyogQSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0cHV0X3N5bXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICphb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua193cml0ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQsCi0JICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGZpbGVfcHRyICpyZWxvZmZfcHRyLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZAotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQsCi0JICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplLCBiZmRfYnl0ZSAqY29udGVudHMpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dAotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQsCi0JICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplLCBiZmRfYnl0ZSAqY29udGVudHMpKTsKLXN0YXRpYyBJTkxJTkUgYXNlY3Rpb24gKmFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1hb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50b3RhbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIERvIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICBUaGlzIGlzIGNhbGxlZCBvbiB0aGUgb3V0cHV0IEJGRC4gIFRoZQotICAgSU5GTyBzdHJ1Y3R1cmUgc2hvdWxkIHBvaW50IHRvIGEgbGlzdCBvZiBCRkRzIGxpbmtlZCB0aHJvdWdoIHRoZQotICAgbGlua19uZXh0IGZpZWxkIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmQgZWFjaCBCRkQgd2hpY2ggdGFrZXMgcGFydAotICAgaW4gdGhlIG91dHB1dC4gIEFsc28sIGVhY2ggc2VjdGlvbiBpbiBBQkZEIHNob3VsZCBwb2ludCB0byBhIGxpc3QKLSAgIG9mIGJmZF9saW5rX29yZGVyIHN0cnVjdHVyZXMgd2hpY2ggbGlzdCBhbGwgdGhlIGlucHV0IHNlY3Rpb25zIGZvcgotICAgdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBjYWxsYmFjaykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgdm9pZCAoKmNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotewotICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gYW91dF9pbmZvOwotICBib29sZWFuIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgcmVnaXN0ZXIgYmZkICpzdWI7Ci0gIGJmZF9zaXplX3R5cGUgdHJzaXplLCBkcnNpemU7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgc2l6ZV90IG1heF9yZWxvY3Nfc2l6ZTsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBhc2VjdGlvbiAqbzsKLSAgYm9vbGVhbiBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzOwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBhb3V0X2luZm8uaW5mbyA9IGluZm87Ci0gIGFvdXRfaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgYW91dF9pbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgYW91dF9pbmZvLnJlbG9jcyA9IE5VTEw7Ci0gIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gTlVMTDsKLSAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gTlVMTDsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCwKLQkJCSAgICAgICBhb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYywKLQkJCSAgICAgICAyNTEpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gdHJ1ZTsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IHNlY3Rpb24gc2l6ZS4gIEFsc28sIGlmIGdlbmVyYXRpbmcKLSAgICAgcmVsb2NhdGVhYmxlIG91dHB1dCwgY291bnQgdGhlIHJlbG9jcy4gICovCi0gIHRyc2l6ZSA9IDA7Ci0gIGRyc2l6ZSA9IDA7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X3JlbG9jc19zaXplID0gMDsKLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBpZiAoYmZkX2dldF9mbGF2b3VyIChzdWIpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCSAgICB7Ci0JICAgICAgdHJzaXplICs9IGV4ZWNfaGRyIChzdWIpLT5hX3Ryc2l6ZTsKLQkgICAgICBkcnNpemUgKz0gZXhlY19oZHIgKHN1YiktPmFfZHJzaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2UgbmVlZCB0byBpZGVudGlmeSB0aGUgLnRleHQgYW5kIC5kYXRhIHNlY3Rpb25zCi0JCSBhbmQgY2FsbCBnZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGNhbm9uaWNhbGl6ZV9yZWxvYyB0bwotCQkgd29yayBvdXQgdGhlIG51bWJlciBvZiByZWxvY3MgbmVlZGVkLCBhbmQgdGhlbiBtdWx0aXBseQotCQkgYnkgdGhlIHJlbG9jIHNpemUuICAqLwotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IHJlbG9jYXRlYWJsZSBsaW5rIGZyb20gJXMgdG8gJXMgbm90IHN1cHBvcnRlZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSBzdWItPnh2ZWMtPm5hbWUsIGFiZmQtPnh2ZWMtPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JewotCSAgc3ogPSBiZmRfc2VjdGlvbl9zaXplIChzdWIsIG9ial90ZXh0c2VjIChzdWIpKTsKLQkgIGlmIChzeiA+IG1heF9jb250ZW50c19zaXplKQotCSAgICBtYXhfY29udGVudHNfc2l6ZSA9IHN6OwotCSAgc3ogPSBiZmRfc2VjdGlvbl9zaXplIChzdWIsIG9ial9kYXRhc2VjIChzdWIpKTsKLQkgIGlmIChzeiA+IG1heF9jb250ZW50c19zaXplKQotCSAgICBtYXhfY29udGVudHNfc2l6ZSA9IHN6OwotCi0JICBzeiA9IGV4ZWNfaGRyIChzdWIpLT5hX3Ryc2l6ZTsKLQkgIGlmIChzeiA+IG1heF9yZWxvY3Nfc2l6ZSkKLQkgICAgbWF4X3JlbG9jc19zaXplID0gc3o7Ci0JICBzeiA9IGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZTsKLQkgIGlmIChzeiA+IG1heF9yZWxvY3Nfc2l6ZSkKLQkgICAgbWF4X3JlbG9jc19zaXplID0gc3o7Ci0KLQkgIHN6ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChzdWIpOwotCSAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQkgICAgbWF4X3N5bV9jb3VudCA9IHN6OwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAob2JqX3RleHRzZWMgKGFiZmQpICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXRyc2l6ZSArPSAoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAob2JqX3RleHRzZWMgKGFiZmQpCi0JCQkJCQkgLT5saW5rX29yZGVyX2hlYWQpCi0JCSAgICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICAgIGlmIChvYmpfZGF0YXNlYyAoYWJmZCkgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JZHJzaXplICs9IChfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChvYmpfZGF0YXNlYyAoYWJmZCkKLQkJCQkJCSAtPmxpbmtfb3JkZXJfaGVhZCkKLQkJICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgIH0KLQotICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gdHJzaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gZHJzaXplOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgLyogQWRqdXN0IHRoZSBzZWN0aW9uIHNpemVzIGFuZCB2bWFzIGFjY29yZGluZyB0byB0aGUgbWFnaWMgbnVtYmVyLgotICAgICBUaGlzIHNldHMgYV90ZXh0LCBhX2RhdGEgYW5kIGFfYnNzIGluIHRoZSBleGVjX2hkciBhbmQgc2V0cyB0aGUKLSAgICAgZmlsZXBvcyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHJlbG9jYXRpb24gYW5kIHN5bWJvbCBmaWxlIHBvc2l0aW9ucyBkaWZmZXIgYW1vbmcgYS5vdXQKLSAgICAgdGFyZ2V0cy4gIFdlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayByb3V0aW5lIGZyb20gdGhlIGJhY2tlbmQKLSAgICAgc3BlY2lmaWMgY29kZSB0byBoYW5kbGUgdGhpcy4KLSAgICAgRklYTUU6IEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IGtub3cgaG93IG11Y2ggc3BhY2UgdGhlIHN5bWJvbAotICAgICB0YWJsZSB3aWxsIHJlcXVpcmUuICBUaGlzIHdpbGwgbm90IHdvcmsgZm9yIGFueSAobm9uc3RhbmRhcmQpCi0gICAgIGEub3V0IHRhcmdldCB0aGF0IG5lZWRzIHRvIGtub3cgdGhlIHN5bWJvbCB0YWJsZSBzaXplIGJlZm9yZSBpdAotICAgICBjYW4gY29tcHV0ZSB0aGUgcmVsb2NhdGlvbiBmaWxlIHBvc2l0aW9ucy4gIFRoaXMgbWF5IG9yIG1heSBub3QKLSAgICAgYmUgdGhlIGNhc2UgZm9yIHRoZSBocDMwMGhwdXggdGFyZ2V0LCBmb3IgZXhhbXBsZS4gICovCi0gICgqY2FsbGJhY2spIChhYmZkLCAmYW91dF9pbmZvLnRyZWxvZmYsICZhb3V0X2luZm8uZHJlbG9mZiwKLQkgICAgICAgJmFvdXRfaW5mby5zeW1vZmYpOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gYW91dF9pbmZvLnRyZWxvZmY7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBhb3V0X2luZm8uZHJlbG9mZjsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGFvdXRfaW5mby5zeW1vZmY7Ci0KLSAgLyogV2Uga2VlcCBhIGNvdW50IG9mIHRoZSBzeW1ib2xzIGFzIHdlIG91dHB1dCB0aGVtLiAgKi8KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA9IDA7Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgc3RyaW5nIHRhYmxlIGFzIHdlIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGFvdXRfaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoYW91dF9pbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmZlcnMgdG8gaG9sZCBzZWN0aW9uIGNvbnRlbnRzIGFuZCByZWxvY3MuICAqLwotICBhb3V0X2luZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBhb3V0X2luZm8ucmVsb2NzID0gKFBUUikgYmZkX21hbGxvYyAobWF4X3JlbG9jc19zaXplKTsKLSAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSAoaW50ICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGludCAqKSk7Ci0gIGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9ICgoc3RydWN0IGV4dGVybmFsX25saXN0ICopCi0JCQkgICBiZmRfbWFsbG9jICgobWF4X3N5bV9jb3VudCArIDEpCi0JCQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpKSk7Ci0gIGlmICgoYW91dF9pbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgIT0gMCkKLSAgICAgIHx8IChhb3V0X2luZm8ucmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jc19zaXplICE9IDApCi0gICAgICB8fCAoYW91dF9pbmZvLnN5bWJvbF9tYXAgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiB3ZSBoYXZlIGEgc3ltYm9sIG5hbWVkIF9fRFlOQU1JQywgZm9yY2UgaXQgb3V0IG5vdy4gIFRoaXMgaXMKLSAgICAgcmVxdWlyZWQgYnkgU3VuT1MuICBEb2luZyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gc3Vub3MuYyBpcyBhCi0gICAgIGhhY2ssIGJ1dCBpdCdzIGVhc2llciB0aGFuIGV4cG9ydGluZyBldmVyeXRoaW5nIHdoaWNoIHdvdWxkIGJlCi0gICAgIG5lZWRlZC4gICovCi0gIHsKLSAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICBoID0gYW91dF9saW5rX2hhc2hfbG9va3VwIChhb3V0X2hhc2hfdGFibGUgKGluZm8pLCAiX19EWU5BTUlDIiwKLQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICBpZiAoaCAhPSBOVUxMKQotICAgICAgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgJmFvdXRfaW5mbyk7Ci0gIH0KLQotICAvKiBUaGUgbW9zdCB0aW1lIGVmZmljaWVudCB3YXkgdG8gZG8gdGhlIGxpbmsgd291bGQgYmUgdG8gcmVhZCBhbGwKLSAgICAgdGhlIGlucHV0IG9iamVjdCBmaWxlcyBpbnRvIG1lbW9yeSBhbmQgdGhlbiBzb3J0IG91dCB0aGUKLSAgICAgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuICBVbmZvcnR1bmF0ZWx5LCB0aGF0IHdpbGwKLSAgICAgcHJvYmFibHkgdXNlIHRvbyBtdWNoIG1lbW9yeS4gIEFub3RoZXIgbWV0aG9kIHdvdWxkIGJlIHRvIHN0ZXAKLSAgICAgdGhyb3VnaCBldmVyeXRoaW5nIHRoYXQgY29tcG9zZXMgdGhlIHRleHQgc2VjdGlvbiBhbmQgd3JpdGUgaXQKLSAgICAgb3V0LCBhbmQgdGhlbiBldmVyeXRoaW5nIHRoYXQgY29tcG9zZXMgdGhlIGRhdGEgc2VjdGlvbiBhbmQgd3JpdGUKLSAgICAgaXQgb3V0LCBhbmQgdGhlbiB3cml0ZSBvdXQgdGhlIHJlbG9jcywgYW5kIHRoZW4gd3JpdGUgb3V0IHRoZQotICAgICBzeW1ib2xzLiAgVW5mb3J0dW5hdGVseSwgdGhhdCByZXF1aXJlcyByZWFkaW5nIHN0dWZmIGZyb20gZWFjaAotICAgICBpbnB1dCBmaWxlIHNldmVyYWwgdGltZXMsIGFuZCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGtlZXAgYWxsIHRoZQotICAgICBpbnB1dCBmaWxlcyBvcGVuIHNpbXVsdGFuZW91c2x5LCBhbmQgcmVvcGVuaW5nIHRoZW0gd2lsbCBiZSBzbG93LgotCi0gICAgIFdoYXQgd2UgZG8gaXMgYmFzaWNhbGx5IHByb2Nlc3Mgb25lIGlucHV0IGZpbGUgYXQgYSB0aW1lLiAgV2UgZG8KLSAgICAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIHdpdGggYW4gaW5wdXQgZmlsZSBvbmNlLS1jb3B5IG92ZXIgdGhlCi0gICAgIHNlY3Rpb24gY29udGVudHMsIGhhbmRsZSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYW5kIHdyaXRlCi0gICAgIG91dCB0aGUgc3ltYm9scy0tYW5kIHRoZW4gd2UgdGhyb3cgYXdheSB0aGUgaW5mb3JtYXRpb24gd2UgcmVhZAotICAgICBmcm9tIGl0LiAgVGhpcyBhcHByb2FjaCByZXF1aXJlcyBhIGxvdCBvZiBsc2Vla3Mgb2YgdGhlIG91dHB1dAotICAgICBmaWxlLCB3aGljaCBpcyB1bmZvcnR1bmF0ZSBidXQgc3RpbGwgZmFzdGVyIHRoYW4gcmVvcGVuaW5nIGEgbG90Ci0gICAgIG9mIGZpbGVzLgotCi0gICAgIFdlIHVzZSB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZCBvZiB0aGUgaW5wdXQgQkZEcyB0byBzZWUKLSAgICAgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCBpdC4gICovCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IChiZmQgKikgTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0KLSAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgVGhpcwotICAgICB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkIHRvIGRvIHRoaXMgc28gdGhhdCB3ZQotICAgICBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoIHRoZSBsaW5rZXIgaGFzIGRlY2lkZWQgdG8gbm90Ci0gICAgIGluY2x1ZGUuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+bGlua2VyX21hcmsgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaGF2ZV9saW5rX29yZGVyX3JlbG9jcyA9IGZhbHNlOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQotCSAgICAgIGlucHV0X2JmZCA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgaW5wdXRfYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgYW91dF9saW5rX2lucHV0X2JmZCAoJmFvdXRfaW5mbywgaW5wdXRfYmZkKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGlucHV0X2JmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgLyogVGhlc2UgYXJlIGhhbmRsZWQgYmVsb3cuICAqLwotCSAgICAgIGhhdmVfbGlua19vcmRlcl9yZWxvY3MgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgYW55IHN5bWJvbHMgdGhhdCB3ZSBoYXZlIG5vdCBhbHJlYWR5IHdyaXR0ZW4gb3V0LiAgKi8KLSAgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UgKGFvdXRfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sLAotCQkJICAgKFBUUikgJmFvdXRfaW5mbyk7Ci0KLSAgLyogTm93IGhhbmRsZSBhbnkgcmVsb2NzIHdlIHdlcmUgYXNrZWQgdG8gY3JlYXRlIGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoZXNlIGRpZCBub3QgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgV2UgbXVzdCBkbyB0aGVzZSBhZnRlcgotICAgICB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgc3ltYm9scywgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wKLSAgICAgaW5kaWNlcyB0byB1c2UuICAqLwotICBpZiAoaGF2ZV9saW5rX29yZGVyX3JlbG9jcykKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAoISBhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlciAoJmFvdXRfaW5mbywgbywgcCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYW91dF9pbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLmNvbnRlbnRzKTsKLSAgICAgIGFvdXRfaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoYW91dF9pbmZvLnJlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5yZWxvY3MpOwotICAgICAgYW91dF9pbmZvLnJlbG9jcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoYW91dF9pbmZvLnN5bWJvbF9tYXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8uc3ltYm9sX21hcCk7Ci0gICAgICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IE5VTEw7Ci0gICAgfQotICBpZiAoYW91dF9pbmZvLm91dHB1dF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLm91dHB1dF9zeW1zKTsKLSAgICAgIGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QpOwotICAgICAgaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IGZhbHNlOwotICAgIH0KLQotICAvKiBGaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZyB3ZSBtYXkgYmUgZG9pbmcuICAqLwotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5maW5pc2hfZHluYW1pY19saW5rICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCphb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmZpbmlzaF9keW5hbWljX2xpbmspIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBhYmZkLT5zeW1jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zID0gYWJmZC0+c3ltY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gb2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLCB1bmxlc3MgdGhlcmUgYXJlIG5vIHN5bWJvbHMuICAqLwotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N0cl9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLQkgIHx8ICEgZW1pdF9zdHJpbmd0YWIgKGFiZmQsIGFvdXRfaW5mby5zdHJ0YWIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9PSAwCi0JICAgJiYgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcwotCQkgICAgICsgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEKLQkJICAgICAtIDEpLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYW91dF9pbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoYW91dF9pbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGFvdXRfaW5mby5yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8ucmVsb2NzKTsKLSAgaWYgKGFvdXRfaW5mby5zeW1ib2xfbWFwICE9IE5VTEwpCi0gICAgZnJlZSAoYW91dF9pbmZvLnN5bWJvbF9tYXApOwotICBpZiAoYW91dF9pbmZvLm91dHB1dF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoYW91dF9pbmZvLm91dHB1dF9zeW1zKTsKLSAgaWYgKGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMaW5rIGFuIGEub3V0IGlucHV0IEJGRCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1fY291bnQ7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF9mb3JtYXQgKGlucHV0X2JmZCkgPT0gYmZkX29iamVjdCk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCBpdCBtYXkgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgYW91dF9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPmxpbmtfZHluYW1pY19vYmplY3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKCgqYW91dF9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPmxpbmtfZHluYW1pY19vYmplY3QpCi0JICAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQpKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2xzLiAgV2UgcHJvYmFibHkgaGF2ZSB0aGVtIGFscmVhZHksIHVubGVzcwotICAgICBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UuICAqLwotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGlucHV0X2JmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzIGFuZCBnZXQgYSBtYXAgb2YgdGhlIG5ldyBpbmRpY2VzLiAgVGhlIG1hcAotICAgICBpcyBwbGFjZWQgaW50byBmaW5mby0+c3ltYm9sX21hcC4gICovCi0gIGlmICghIGFvdXRfbGlua193cml0ZV9zeW1ib2xzIChmaW5mbywgaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVsb2NhdGUgYW5kIHdyaXRlIG91dCB0aGUgc2VjdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZQotICAgICBzeW1ib2wgbWFwIGNyZWF0ZWQgYnkgYW91dF9saW5rX3dyaXRlX3N5bWJvbHMuICBUaGUgbGlua2VyX21hcmsKLSAgICAgZmllbGQgd2lsbCBiZSBzZXQgaWYgdGhlc2Ugc2VjdGlvbnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotICAgICBsaW5rLCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHRoZSBjYXNlLiAgKi8KLSAgaWYgKG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5saW5rZXJfbWFyaykKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLAotCQkJCSAgICAgJmZpbmZvLT50cmVsb2ZmLAotCQkJCSAgICAgZXhlY19oZHIgKGlucHV0X2JmZCktPmFfdHJzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAob2JqX2RhdGFzZWMgKGlucHV0X2JmZCktPmxpbmtlcl9tYXJrKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgb2JqX2RhdGFzZWMgKGlucHV0X2JmZCksCi0JCQkJICAgICAmZmluZm8tPmRyZWxvZmYsCi0JCQkJICAgICBleGVjX2hkciAoaW5wdXRfYmZkKS0+YV9kcnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBrZWVwaW5nIG1lbW9yeSwgd2UgZG9uJ3QgbmVlZCB0aGUgc3ltYm9scyBhbnkKLSAgICAgbG9uZ2VyLiAgV2Ugc3RpbGwgbmVlZCB0aGVtIGlmIHdlIGFyZSBrZWVwaW5nIG1lbW9yeSwgYmVjYXVzZSB0aGUKLSAgICAgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBwb2ludCBpbnRvIHRoZW0uICAqLwotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYW5kIHdyaXRlIG91dCB0aGUgc3ltYm9scyBmb3IgYW4gYS5vdXQgZmlsZS4gIFNldCB0aGUgbmV3Ci0gICBzeW1ib2wgaW5kaWNlcyBpbnRvIGEgc3ltYm9sX21hcC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfd3JpdGVfc3ltYm9scyAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1fY291bnQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIGVudW0gYmZkX2xpbmtfc3RyaXAgc3RyaXA7Ci0gIGVudW0gYmZkX2xpbmtfZGlzY2FyZCBkaXNjYXJkOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm91dHN5bTsKLSAgYmZkX3NpemVfdHlwZSBzdHJ0YWJfaW5kZXg7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9lbmQ7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJvb2xlYW4gcGFzczsKLSAgYm9vbGVhbiBza2lwX25leHQ7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGlucHV0X2JmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOwotICBzdHJpcCA9IGZpbmZvLT5pbmZvLT5zdHJpcDsKLSAgZGlzY2FyZCA9IGZpbmZvLT5pbmZvLT5kaXNjYXJkOwotICBvdXRzeW0gPSBmaW5mby0+b3V0cHV0X3N5bXM7Ci0KLSAgLyogRmlyc3Qgd3JpdGUgb3V0IGEgc3ltYm9sIGZvciB0aGlzIG9iamVjdCBmaWxlLCB1bmxlc3Mgd2UgYXJlCi0gICAgIGRpc2NhcmRpbmcgc3VjaCBzeW1ib2xzLiAgKi8KLSAgaWYgKHN0cmlwICE9IHN0cmlwX2FsbAotICAgICAgJiYgKHN0cmlwICE9IHN0cmlwX3NvbWUKLQkgIHx8IGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgaW5wdXRfYmZkLT5maWxlbmFtZSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLSAgICAgICYmIGRpc2NhcmQgIT0gZGlzY2FyZF9hbGwpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIE5fVEVYVCwgb3V0c3ltLT5lX3R5cGUpOwotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9vdGhlcik7Ci0gICAgICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBvdXRzeW0tPmVfZGVzYyk7Ci0gICAgICBzdHJ0YWJfaW5kZXggPSBhZGRfdG9fc3RyaW5ndGFiIChvdXRwdXRfYmZkLCBmaW5mby0+c3RydGFiLAotCQkJCSAgICAgICBpbnB1dF9iZmQtPmZpbGVuYW1lLCBmYWxzZSk7Ci0gICAgICBpZiAoc3RydGFiX2luZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgc3RydGFiX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwKLQkJKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgb2JqX3RleHRzZWMgKGlucHV0X2JmZCktPm91dHB1dF9zZWN0aW9uKQotCQkgKyBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+b3V0cHV0X29mZnNldCksCi0JCW91dHN5bS0+ZV92YWx1ZSk7Ci0gICAgICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICArK291dHN5bTsKLSAgICB9Ci0KLSAgcGFzcyA9IGZhbHNlOwotICBza2lwX25leHQgPSBmYWxzZTsKLSAgc3ltID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3ltX2VuZCA9IHN5bSArIHN5bV9jb3VudDsKLSAgc3ltX2hhc2ggPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0gIG1lbXNldCAoc3ltYm9sX21hcCwgMCwgc3ltX2NvdW50ICogc2l6ZW9mICpzeW1ib2xfbWFwKTsKLSAgZm9yICg7IHN5bSA8IHN5bV9lbmQ7IHN5bSsrLCBzeW1faGFzaCsrLCBzeW1ib2xfbWFwKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGludCB0eXBlOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYm9vbGVhbiBza2lwOwotICAgICAgYXNlY3Rpb24gKnN5bXNlYzsKLSAgICAgIGJmZF92bWEgdmFsID0gMDsKLSAgICAgIGJvb2xlYW4gY29weTsKLQotICAgICAgLyogV2Ugc2V0ICpzeW1ib2xfbWFwIHRvIDAgYWJvdmUgZm9yIGFsbCBzeW1ib2xzLiAgSWYgaXQgaGFzCi0gICAgICAgICBhbHJlYWR5IGJlZW4gc2V0IHRvIC0xIGZvciB0aGlzIHN5bWJvbCwgaXQgbWVhbnMgdGhhdCB3ZSBhcmUKLSAgICAgICAgIGRpc2NhcmRpbmcgaXQgYmVjYXVzZSBpdCBhcHBlYXJzIGluIGEgZHVwbGljYXRlIGhlYWRlciBmaWxlLgotICAgICAgICAgU2VlIHRoZSBOX0JJTkNMIGNvZGUgYmVsb3cuICAqLwotICAgICAgaWYgKCpzeW1ib2xfbWFwID09IC0xKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJbml0aWFsaXplICpzeW1ib2xfbWFwIHRvIC0xLCB3aGljaCBtZWFucyB0aGF0IHRoZSBzeW1ib2wgd2FzCi0gICAgICAgICBub3QgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2Ugd2lsbCBjaGFuZ2UgaXQgbGF0ZXIgaWYKLSAgICAgICAgIHdlIGRvIGNvcHkgdGhlIHN5bWJvbCBvdmVyLiAgKi8KLSAgICAgICpzeW1ib2xfbWFwID0gLTE7Ci0KLSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBzeW0tPmVfdHlwZSk7Ci0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV9zdHJ4KTsKLQotICAgICAgaCA9IE5VTEw7Ci0KLSAgICAgIGlmIChwYXNzKQotCXsKLQkgIC8qIFBhc3MgdGhpcyBzeW1ib2wgdGhyb3VnaC4gIEl0IGlzIHRoZSB0YXJnZXQgb2YgYW4KLQkgICAgIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQkgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7Ci0JICBwYXNzID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoc2tpcF9uZXh0KQotCXsKLQkgIC8qIFNraXAgdGhpcyBzeW1ib2wsIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3QKLQkgICAgIHN5bWJvbCB0aGF0IHdlIGhhdmUgY2hhbmdlZCB0byBubyBsb25nZXIgYmUgYW4gaW5kaXJlY3QKLQkgICAgIHN5bWJvbC4gICovCi0JICBza2lwX25leHQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhyZXNvbHZlOwotCi0JICAvKiBXZSBoYXZlIHNhdmVkIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgaWYKLQkgICAgIHRoZXJlIGlzIG9uZS4gIE5vdGUgdGhhdCB3ZSBjb3VsZCBqdXN0IGxvb2sgaXQgdXAgYWdhaW4KLQkgICAgIGluIHRoZSBoYXNoIHRhYmxlLCBwcm92aWRlZCB3ZSBmaXJzdCBjaGVjayB0aGF0IGl0IGlzIGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wuICovCi0JICBoID0gKnN5bV9oYXNoOwotCi0JICAvKiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaCB0YWJsZSwgaW4gY2FzZSB0aGUgc3ltYm9sIHdhcwotICAgICAgICAgICAgIHdyYXBwZWQuICAqLwotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wsIHRoZW4gY2hhbmdlCi0JICAgICBocmVzb2x2ZSB0byB0aGUgYmFzZSBzeW1ib2wuICBXZSBhbHNvIGNoYW5nZSAqc3ltX2hhc2ggc28KLQkgICAgIHRoYXQgdGhlIHJlbG9jYXRpb24gcm91dGluZXMgcmVsb2NhdGUgYWdhaW5zdCB0aGUgcmVhbAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIGhyZXNvbHZlID0gaDsKLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpKQotCSAgICB7Ci0JICAgICAgaHJlc29sdmUgPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgICAgd2hpbGUgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgICAgIHx8IGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQlocmVzb2x2ZSA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgaHJlc29sdmUtPnJvb3QudS5pLmxpbmspOwotCSAgICAgICpzeW1faGFzaCA9IGhyZXNvbHZlOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIG91dCwgc2tpcCBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nCi0JICAgICAgJiYgaC0+d3JpdHRlbikKLQkgICAgewotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9JTkRSCi0JCSAgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JCXNraXBfbmV4dCA9IHRydWU7Ci0JICAgICAgKnN5bWJvbF9tYXAgPSBoLT5pbmR4OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB3ZSBhcmUgc3RyaXBwaW5nIHRoaXMgc3ltYm9sLiAgKi8KLQkgIHNraXAgPSBmYWxzZTsKLQkgIHN3aXRjaCAoc3RyaXApCi0JICAgIHsKLQkgICAgY2FzZSBzdHJpcF9ub25lOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHN0cmlwX2RlYnVnZ2VyOgotCSAgICAgIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3RyaXBfc29tZToKLQkgICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3RyaXBfYWxsOgotCSAgICAgIHNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc2tpcCkKLQkgICAgewotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJaC0+d3JpdHRlbiA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLQkgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9URVhUCi0JICAgICAgfHwgdHlwZSA9PSBOX1dFQUtUKQotCSAgICBzeW1zZWMgPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0RBVEEKLQkJICAgfHwgdHlwZSA9PSBOX1dFQUtEKQotCSAgICBzeW1zZWMgPSBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKTsKLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0JTUwotCQkgICB8fCB0eXBlID09IE5fV0VBS0IpCi0JICAgIHN5bXNlYyA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9BQlMKLQkJICAgfHwgdHlwZSA9PSBOX1dFQUtBKQotCSAgICBzeW1zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIKLQkJICAgICYmIChocmVzb2x2ZSA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJCXx8IChocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICYmIGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkgICAgJiYgaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpKQotCQkgICB8fCB0eXBlID09IE5fV0FSTklORykKLQkgICAgewotCSAgICAgIC8qIFBhc3MgdGhlIG5leHQgc3ltYm9sIHRocm91Z2ggdW5jaGFuZ2VkLiAgVGhlCi0JCSBjb25kaXRpb24gYWJvdmUgZm9yIGluZGlyZWN0IHN5bWJvbHMgaXMgc28gdGhhdCBpZgotCQkgdGhlIGluZGlyZWN0IHN5bWJvbCB3YXMgZGVmaW5lZCwgd2Ugb3V0cHV0IGl0IHdpdGgKLQkJIHRoZSBjb3JyZWN0IGRlZmluaXRpb24gc28gdGhlIGRlYnVnZ2VyIHdpbGwKLQkJIHVuZGVyc3RhbmQgaXQuICAqLwotCSAgICAgIHBhc3MgPSB0cnVlOwotCSAgICAgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7Ci0JICAgICAgc3ltc2VjID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1NUQUIpICE9IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpOwotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGdldCBoZXJlIHdpdGggYW4gaW5kaXJlY3Qgc3ltYm9sLCBpdCBtZWFucyB0aGF0Ci0JCSB3ZSBhcmUgb3V0cHV0dGluZyBpdCB3aXRoIGEgcmVhbCBkZWZpbml0aW9uLiAgSW4gc3VjaAotCQkgYSBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIG91dHB1dCB0aGUgbmV4dCBzeW1ib2wsCi0JCSB3aGljaCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmRpcmVjdGlvbi4gICovCi0JICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIpCi0JCXNraXBfbmV4dCA9IHRydWU7Ci0KLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGhhc2ggdGFibGUuICBXZSB1c2UKLQkJIGhyZXNvbHZlIHNvIHRoYXQgaWYgd2UgaGF2ZSBkZWZpbmVkIGFuIGluZGlyZWN0Ci0JCSBzeW1ib2wgd2Ugb3V0cHV0IHRoZSBmaW5hbCBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBpZiAoaCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCXsKLQkJICBzd2l0Y2ggKHR5cGUgJiBOX1RZUEUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIE5fU0VUVDoKLQkJICAgICAgc3ltc2VjID0gb2JqX3RleHRzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEQ6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgTl9TRVRCOgotCQkgICAgICBzeW1zZWMgPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgTl9TRVRBOgotCQkgICAgICBzeW1zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHZhbCA9IDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgIHx8IGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogVGhpcyBjYXNlIHVzdWFsbHkgbWVhbnMgYSBjb21tb24gc3ltYm9sIHdoaWNoIHdhcwotCQkgICAgIHR1cm5lZCBpbnRvIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCQkgIGlucHV0X3NlY3Rpb24gPSBocmVzb2x2ZS0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIG91dHB1dF9zZWN0aW9uID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgQkZEX0FTU0VSVCAoYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLQkJCSAgICAgIHx8IG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQkJICB2YWwgPSAoaHJlc29sdmUtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKQotCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBHZXQgdGhlIGNvcnJlY3QgdHlwZSBiYXNlZCBvbiB0aGUgc2VjdGlvbi4gIElmCi0JCSAgICAgdGhpcyBpcyBhIGNvbnN0cnVjdGVkIHNldCwgZm9yY2UgaXQgdG8gYmUKLQkJICAgICBnbG9iYWxseSB2aXNpYmxlLiAgKi8KLQkJICBpZiAodHlwZSA9PSBOX1NFVFQKLQkJICAgICAgfHwgdHlwZSA9PSBOX1NFVEQKLQkJICAgICAgfHwgdHlwZSA9PSBOX1NFVEIKLQkJICAgICAgfHwgdHlwZSA9PSBOX1NFVEEpCi0JCSAgICB0eXBlIHw9IE5fRVhUOwotCi0JCSAgdHlwZSAmPX4gTl9UWVBFOwotCi0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9URVhUCi0JCQkgICAgIDogTl9XRUFLVCk7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0RBVEEKLQkJCSAgICAgOiBOX1dFQUtEKTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9CU1MKLQkJCSAgICAgOiBOX1dFQUtCKTsKLQkJICBlbHNlCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fQUJTCi0JCQkgICAgIDogTl9XRUFLQSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQl2YWwgPSBocmVzb2x2ZS0+cm9vdC51LmMuc2l6ZTsKLQkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQl7Ci0JCSAgdmFsID0gMDsKLQkJICB0eXBlID0gTl9XRUFLVTsKLQkJfQotCSAgICAgIGVsc2UKLQkJdmFsID0gMDsKLQkgICAgfQotCSAgaWYgKHN5bXNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgdmFsID0gKHN5bXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHN5bXNlYy0+b3V0cHV0X29mZnNldAotCQkgICArIChHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpCi0JCSAgICAgIC0gc3ltc2VjLT52bWEpKTsKLQotCSAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wgc2V0IHRoZSB3cml0dGVuIGZsYWcsIGFuZCBpZgotCSAgICAgaXQgaXMgYSBsb2NhbCBzeW1ib2wgc2VlIGlmIHdlIHNob3VsZCBkaXNjYXJkIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGgtPndyaXR0ZW4gPSB0cnVlOwotCSAgICAgIGgtPmluZHggPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotCSAgICB9Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRUCi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEQKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQgotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRBKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChkaXNjYXJkKQotCQl7Ci0JCWNhc2UgZGlzY2FyZF9ub25lOgotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfbDoKLQkJICBpZiAoKHR5cGUgJiBOX1NUQUIpID09IDAKLQkJICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX2FsbDoKLQkJICBza2lwID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChza2lwKQotCQl7Ci0JCSAgcGFzcyA9IGZhbHNlOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQW4gTl9CSU5DTCBzeW1ib2wgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgc3RhYnMKLQkgICAgIGVudHJpZXMgZm9yIGEgaGVhZGVyIGZpbGUuICBXZSBuZWVkIHRvIHNjYW4gYWhlYWQgdG8gdGhlCi0JICAgICBuZXh0IE5fRUlOQ0wgc3ltYm9sLCBpZ25vcmluZyBuZXN0aW5nLCBhZGRpbmcgdXAgYWxsIHRoZQotCSAgICAgY2hhcmFjdGVycyBpbiB0aGUgc3ltYm9sIG5hbWVzLCBub3QgaW5jbHVkaW5nIHRoZSBmaWxlCi0JICAgICBudW1iZXJzIGluIHR5cGVzICh0aGUgZmlyc3QgbnVtYmVyIGFmdGVyIGFuIG9wZW4KLQkgICAgIHBhcmVudGhlc2lzKS4gICovCi0JICBpZiAodHlwZSA9PSBOX0JJTkNMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICppbmNsX3N5bTsKLQkgICAgICBpbnQgbmVzdDsKLQkgICAgICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICppbmNsX2VudHJ5OwotCSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICp0OwotCi0JICAgICAgdmFsID0gMDsKLQkgICAgICBuZXN0ID0gMDsKLQkgICAgICBmb3IgKGluY2xfc3ltID0gc3ltICsgMTsgaW5jbF9zeW0gPCBzeW1fZW5kOyBpbmNsX3N5bSsrKQotCQl7Ci0JCSAgaW50IGluY2xfdHlwZTsKLQotCQkgIGluY2xfdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIGluY2xfc3ltLT5lX3R5cGUpOwotCQkgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG5lc3QgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICAtLW5lc3Q7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCSAgICArK25lc3Q7Ci0JCSAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpzOwotCi0JCSAgICAgIHMgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfc3RyeCk7Ci0JCSAgICAgIGZvciAoOyAqcyAhPSAnXDAnOyBzKyspCi0JCQl7Ci0JCQkgIHZhbCArPSAqczsKLQkJCSAgaWYgKCpzID09ICcoJykKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0JCQkgICAgICArK3M7Ci0JCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCQkrK3M7Ci0JCQkgICAgICAtLXM7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgYSBoZWFkZXIgZmlsZSB3aXRoIHRoZQotICAgICAgICAgICAgICAgICBzYW1lIHZhbHVlLCB0aGVuIHJlcGxhY2UgdGhpcyBvbmUgd2l0aCBhbiBOX0VYQ0wKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBjb3B5ID0gISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnk7Ci0JICAgICAgaW5jbF9lbnRyeSA9IGFvdXRfbGlua19pbmNsdWRlc19sb29rdXAgKCZmaW5mby0+aW5jbHVkZXMsCi0JCQkJCQkgICAgICBuYW1lLCB0cnVlLCBjb3B5KTsKLQkgICAgICBpZiAoaW5jbF9lbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZm9yICh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCQlpZiAodC0+dG90YWwgPT0gdmFsKQotCQkgIGJyZWFrOwotCSAgICAgIGlmICh0ID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgZmlsZSB3aXRoIHRoaXMgc2V0IG9mIHN0YWJzIHN0cmluZ3MuICAqLwotCQkgIHQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICopCi0JCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmZpbmZvLT5pbmNsdWRlcy5yb290LAotCQkJCQkgIHNpemVvZiAqdCkpOwotCQkgIGlmICh0ID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgdC0+dG90YWwgPSB2YWw7Ci0JCSAgdC0+bmV4dCA9IGluY2xfZW50cnktPnRvdGFsczsKLQkJICBpbmNsX2VudHJ5LT50b3RhbHMgPSB0OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50ICppbmNsX21hcDsKLQotCQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgaGVhZGVyIGZpbGUuICBXZSBtdXN0IGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgaXQgdG8gYmUgYW4gTl9FWENMIGVudHJ5LCBhbmQgbWFyayBhbGwgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBzeW1ib2xzIHRvIHByZXZlbnQgb3V0cHV0dGluZyB0aGVtLiAgKi8KLQkJICB0eXBlID0gTl9FWENMOwotCi0JCSAgbmVzdCA9IDA7Ci0JCSAgZm9yIChpbmNsX3N5bSA9IHN5bSArIDEsIGluY2xfbWFwID0gc3ltYm9sX21hcCArIDE7Ci0JCSAgICAgICBpbmNsX3N5bSA8IHN5bV9lbmQ7Ci0JCSAgICAgICBpbmNsX3N5bSsrLCBpbmNsX21hcCsrKQotCQkgICAgewotCQkgICAgICBpbnQgaW5jbF90eXBlOwotCi0JCSAgICAgIGluY2xfdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIGluY2xfc3ltLT5lX3R5cGUpOwotCQkgICAgICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCQl7Ci0JCQkgIGlmIChuZXN0ID09IDApCi0JCQkgICAgewotCQkJICAgICAgKmluY2xfbWFwID0gLTE7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIC0tbmVzdDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCQkrK25lc3Q7Ci0JCSAgICAgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJCSppbmNsX21hcCA9IC0xOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENvcHkgdGhpcyBzeW1ib2wgaW50byB0aGUgbGlzdCBvZiBzeW1ib2xzIHdlIGFyZSBnb2luZyB0bwotCSB3cml0ZSBvdXQuICAqLwotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS0+ZV90eXBlKTsKLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBzeW0tPmVfb3RoZXIpLAotCQkgICBvdXRzeW0tPmVfb3RoZXIpOwotICAgICAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCBiZmRfaF9nZXRfMTYgKGlucHV0X2JmZCwgc3ltLT5lX2Rlc2MpLAotCQkgICAgb3V0c3ltLT5lX2Rlc2MpOwotICAgICAgY29weSA9IGZhbHNlOwotICAgICAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotCXsKLQkgIC8qIG5hbWUgcG9pbnRzIGludG8gYSBzdHJpbmcgdGFibGUgd2hpY2ggd2UgYXJlIGdvaW5nIHRvCi0JICAgICBmcmVlLiAgSWYgdGhlcmUgaXMgYSBoYXNoIHRhYmxlIGVudHJ5LCB1c2UgdGhhdCBzdHJpbmcuCi0JICAgICBPdGhlcndpc2UsIGNvcHkgbmFtZSBpbnRvIG1lbW9yeS4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZQotCSAgICBjb3B5ID0gdHJ1ZTsKLQl9Ci0gICAgICBzdHJ0YWJfaW5kZXggPSBhZGRfdG9fc3RyaW5ndGFiIChvdXRwdXRfYmZkLCBmaW5mby0+c3RydGFiLAotCQkJCSAgICAgICBuYW1lLCBjb3B5KTsKLSAgICAgIGlmIChzdHJ0YWJfaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBzdHJ0YWJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS0+ZV92YWx1ZSk7Ci0gICAgICAqc3ltYm9sX21hcCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICArK291dHN5bTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBvdXRwdXQgc3ltYm9scyB3ZSBoYXZlIGp1c3QgY29uc3RydWN0ZWQuICAqLwotICBpZiAob3V0c3ltID4gZmluZm8tPm91dHB1dF9zeW1zKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgb3V0c3ltX2NvdW50OwotCi0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIGZpbmZvLT5zeW1vZmYsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG91dHN5bV9jb3VudCA9IG91dHN5bSAtIGZpbmZvLT5vdXRwdXRfc3ltczsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGZpbmZvLT5vdXRwdXRfc3ltcywKLQkJICAgICAoYmZkX3NpemVfdHlwZSkgRVhURVJOQUxfTkxJU1RfU0laRSwKLQkJICAgICAoYmZkX3NpemVfdHlwZSkgb3V0c3ltX2NvdW50LCBvdXRwdXRfYmZkKQotCSAgIT0gb3V0c3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmaW5mby0+c3ltb2ZmICs9IG91dHN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzeW1ib2wgdGhhdCB3YXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBhLm91dCBpbnB1dAotICAgb2JqZWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICopIGRhdGE7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgaW50IHR5cGU7Ci0gIGJmZF92bWEgdmFsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Qgb3V0c3ltOwotICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPndyaXRlX2R5bmFtaWNfc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT53cml0ZV9keW5hbWljX3N5bWJvbCkKLQkgICAgIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgaCkpKQotCXsKLQkgIC8qIEZJWE1FOiBObyB3YXkgdG8gaGFuZGxlIGVycm9ycy4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT53cml0dGVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPndyaXR0ZW4gPSB0cnVlOwotCi0gIC8qIEFuIGluZHggb2YgLTIgbWVhbnMgdGhlIHN5bWJvbCBtdXN0IGJlIHdyaXR0ZW4uICAqLwotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICAvKiBBdm9pZCB2YXJpYWJsZSBub3QgaW5pdGlhbGl6ZWQgd2FybmluZ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBmb3Igc2V0IHN5bWJvbHMgd2hlbiBzZXRzIGFyZSBub3QgYmVpbmcKLSAgICAgICAgIGJ1aWx0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQotCXNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JQkZEX0FTU0VSVCAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCSAgICB8fCBzZWMtPm93bmVyID09IG91dHB1dF9iZmQpOwotCWlmIChzZWMgPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCSAgdHlwZSA9IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQgPyBOX1RFWFQgOiBOX1dFQUtUOwotCWVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fREFUQSA6IE5fV0VBS0Q7Ci0JZWxzZSBpZiAoc2VjID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCSAgdHlwZSA9IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQgPyBOX0JTUyA6IE5fV0VBS0I7Ci0JZWxzZQotCSAgdHlwZSA9IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQgPyBOX0FCUyA6IE5fV0VBS0E7Ci0JdHlwZSB8PSBOX0VYVDsKLQl2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCSAgICAgICArIHNlYy0+dm1hCi0JICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSBoLT5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHR5cGUgPSBOX1dFQUtVOwotICAgICAgdmFsID0gMDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBGSVhNRTogSWdub3JlIHRoZXNlIGZvciBub3cuICBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaAotCSB0aGV5IHNob3VsZCBiZSB3cml0dGVuIG91dCBhcmUgbm90IGNsZWFyIHRvIG1lLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLmVfdHlwZSk7Ci0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0uZV9vdGhlcik7Ci0gIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLmVfZGVzYyk7Ci0gIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChvdXRwdXRfYmZkLCBmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAgZmFsc2UpOwotICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIGluZHgsIG91dHN5bS5lX3N0cngpOwotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsLCBvdXRzeW0uZV92YWx1ZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBmaW5mby0+c3ltb2ZmLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlICgoUFRSKSAmb3V0c3ltLCAoYmZkX3NpemVfdHlwZSkgRVhURVJOQUxfTkxJU1RfU0laRSwKLQkJICAgIChiZmRfc2l6ZV90eXBlKSAxLCBvdXRwdXRfYmZkKSAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gaGFuZGxlIGVycm9ycy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgZmluZm8tPnN5bW9mZiArPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotICBoLT5pbmR4ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgKytvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMaW5rIGFuIGEub3V0IHNlY3Rpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9mZl9wdHIsCi0JCQkgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgZmlsZV9wdHIgKnJlbG9mZl9wdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgaW5wdXRfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpbnB1dF9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBmaW5mby0+Y29udGVudHMsCi0JCQkJICAoZmlsZV9wdHIpIDAsIGlucHV0X3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWFkIGluIHRoZSByZWxvY3MgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgaXQuICAqLwotICBpZiAoYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGFvdXRfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgcmVsb2NzID0gYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY3MgPSBmaW5mby0+cmVsb2NzOwotICAgICAgaWYgKHJlbF9zaXplID4gMCkKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsX3NpemUsIGlucHV0X2JmZCkgIT0gcmVsX3NpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkJIHJlbF9zaXplLCBmaW5mby0+Y29udGVudHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJCSByZWxfc2l6ZSwgZmluZm8tPmNvbnRlbnRzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgIChQVFIpIGZpbmZvLT5jb250ZW50cywKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBpbnB1dF9zaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgcmVsb2NzIHdlcmUKLSAgICAgbW9kaWZpZWQsIGFuZCB3ZSBub3cgd3JpdGUgdGhlbSBvdXQuICAqLwotICBpZiAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSAmJiByZWxfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgKnJlbG9mZl9wdHIsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKHJlbG9jcywgKGJmZF9zaXplX3R5cGUpIDEsIHJlbF9zaXplLCBmaW5mby0+b3V0cHV0X2JmZCkKLQkgICE9IHJlbF9zaXplKQotCXJldHVybiBmYWxzZTsKLSAgICAgICpyZWxvZmZfcHRyICs9IHJlbF9zaXplOwotCi0gICAgICAvKiBBc3NlcnQgdGhhdCB0aGUgcmVsb2NzIGhhdmUgbm90IHJ1biBpbnRvIHRoZSBzeW1ib2xzLCBhbmQKLQkgdGhhdCBpZiB0aGVzZSBhcmUgdGhlIHRleHQgcmVsb2NzIHRoZXkgaGF2ZSBub3QgcnVuIGludG8gdGhlCi0JIGRhdGEgcmVsb2NzLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKCpyZWxvZmZfcHRyIDw9IG9ial9zeW1fZmlsZXBvcyAoZmluZm8tPm91dHB1dF9iZmQpCi0JCSAgJiYgKHJlbG9mZl9wdHIgIT0gJmZpbmZvLT50cmVsb2ZmCi0JCSAgICAgIHx8ICgqcmVsb2ZmX3B0cgotCQkJICA8PSBvYmpfZGF0YXNlYyAoZmluZm8tPm91dHB1dF9iZmQpLT5yZWxfZmlsZXBvcykpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgcmVsb2MgaW5kZXguICAqLwotCi1zdGF0aWMgSU5MSU5FIGFzZWN0aW9uICoKLWFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoYWJmZCwgaW5keCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5keDsKLXsKLSAgc3dpdGNoIChpbmR4ICYgTl9UWVBFKQotICAgIHsKLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIHJldHVybiBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gICAgY2FzZSBOX0RBVEE6Ci0gICAgICByZXR1cm4gb2JqX2RhdGFzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9CU1M6Ci0gICAgICByZXR1cm4gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0gICAgY2FzZSBOX0FCUzoKLSAgICBjYXNlIE5fVU5ERjoKLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBhLm91dCBzZWN0aW9uIHVzaW5nIHN0YW5kYXJkIGEub3V0IHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jcywKLQkJCSAgICAgcmVsX3NpemUsIGNvbnRlbnRzKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkJCQkJICBiZmRfdm1hICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsX2VuZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGNoZWNrX2R5bmFtaWNfcmVsb2MgPSBhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPmNoZWNrX2R5bmFtaWNfcmVsb2M7Ci0KLSAgQkZEX0FTU0VSVCAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICAgICA9PSBvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKTsKLQotICByZWxvY2F0ZWFibGUgPSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlOwotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN5bV9oYXNoZXMgPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0KLSAgcmVsb2NfY291bnQgPSByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOwotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyByZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl9hZGRyOwotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl9wY3JlbDsKLSAgICAgIGludCByX2Jhc2VyZWwgPSAwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfYWRkciA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkcmVzcyk7Ci0KLSNpZmRlZiBNWV9yZWxvY19ob3d0bwotICAgICAgaG93dG8gPSBNWV9yZWxvY19ob3d0byhpbnB1dF9iZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotI2Vsc2UgICAgICAKLSAgICAgIHsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0JdW5zaWduZWQgaW50IGhvd3RvX2lkeDsKLQotCWlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLQkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0JICAgIHJfcmVsYXRpdmU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSkpOwotCSAgICByX2ptcHRhYmxlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLQkgIH0KLQotCWhvd3RvX2lkeCA9IChyX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCQkgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlKTsKLQlCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLQlob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIGhvd3RvX2lkeDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCBhbmQgbXVzdAotCSAgICAgbW9kaWZ5IHRoZSByZWxvYyBhY2NvcmRpbmdseS4gICovCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgdGhpcyByZWxvY2F0aW9uIGlzIGFnYWluc3QsCi0JCSBjb252ZXJ0IGl0IGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhpcwotCQkgaXMgd2hhdCB0aGUgbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIENoYW5nZSB0aGUgcl9leHRlcm4gdmFsdWUuICAqLwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc7Ci0JCSAgZWxzZQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU7Ci0KLQkJICAvKiBDb21wdXRlIGEgbmV3IHJfaW5kZXguICAqLwotCQkgIG91dHB1dF9zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fVEVYVDsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9EQVRBOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fQlNTOwotCQkgIGVsc2UKLQkJICAgIHJfaW5kZXggPSBOX0FCUzsKLQotCQkgIC8qIEFkZCB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlCi0JCSAgICAgYWRkZW5kIHN0b3JlZCBpbiB0aGUgY29udGVudHMuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG11c3QgY2hhbmdlIHJfaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wKLQkJICAgICBtYXAuICAqLwotCQkgIHJfaW5kZXggPSBzeW1ib2xfbWFwW3JfaW5kZXhdOwotCi0JCSAgaWYgKHJfaW5kZXggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCQl7Ci0JCQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndC4gIE5vdGUgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJCSAgaWYgKGgtPmluZHggPCAwKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmluZHggPSAtMjsKLQkJCSAgICAgIGgtPndyaXR0ZW4gPSBmYWxzZTsKLQkJCSAgICAgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsCi0JCQkJCQkJCSAgKFBUUikgZmluZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgcl9hZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICByX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBXZSBtdXN0Ci0JCSBhZGp1c3QgYnkgdGhlIGFtb3VudCB0aGF0IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCSAgICByX2FkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgcmVsLT5yX2FkZHJlc3MpOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgKi8KLQkgIGlmIChyX3BjcmVsKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotI2lmZGVmIE1ZX3JlbG9jYXRhYmxlX3JlbG9jCi0JICBNWV9yZWxvY2F0YWJsZV9yZWxvYyAoaG93dG8sIG91dHB1dF9iZmQsIHJlbCwgcmVsb2NhdGlvbiwgcl9hZGRyKTsKLSNlbmRpZgotCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICByID0gTVlfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQlpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCWNvbnRlbnRzICsgcl9hZGRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0KLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUsIGFuZCBtdXN0IGRvIGEgZnVsbAotCSAgICAgcmVsb2NhdGlvbi4gICovCi0JICBodW5kZWYgPSBmYWxzZTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0KLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHVuZGVmID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgICAgIHNlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChyX3BjcmVsKQotCQlyZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICBpZiAoY2hlY2tfZHluYW1pY19yZWxvYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgaWYgKCEgKCgqY2hlY2tfZHluYW1pY19yZWxvYykKLQkJICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwKLQkJICAgICAgKFBUUikgcmVsLCBjb250ZW50cywgJnNraXAsICZyZWxvY2F0aW9uKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc2tpcCkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTm93IHdhcm4gaWYgYSBnbG9iYWwgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIFdlIGNvdWxkIG5vdAotICAgICAgICAgICAgIGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSBjaGVja19keW5hbWljX3JlbG9jIG1pZ2h0IHdhbnQKLSAgICAgICAgICAgICB0byBza2lwIHRoaXMgcmVsb2MuICAqLwotCSAgaWYgKGh1bmRlZiAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQgJiYgISByX2Jhc2VyZWwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJfYWRkciwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAotCQkJCSAgICAgIChiZmRfdm1hKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UgaWYgKHJfZXh0ZXJuKQotCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqczsKLQotCQkgICAgcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgIH0KLQkJaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLAotCQkJKGJmZF92bWEpIDAsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGEub3V0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgYS5vdXQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NzLAotCQkJICAgICByZWxfc2l6ZSwgY29udGVudHMpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJvb2xlYW4gKCpjaGVja19keW5hbWljX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCQkJCQkgIGJmZF92bWEgKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxfZW5kOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgY2hlY2tfZHluYW1pY19yZWxvYyA9IGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+Y2hlY2tfZHluYW1pY19yZWxvYzsKLQotICBCRkRfQVNTRVJUIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19FWFRfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpOwotCi0gIHJlbG9jYXRlYWJsZSA9IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGU7Ci0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3ltX2hhc2hlcyA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLQotICByZWxvY19jb3VudCA9IHJlbF9zaXplIC8gUkVMT0NfRVhUX1NJWkU7Ci0gIHJlbCA9IHJlbG9jczsKLSAgcmVsX2VuZCA9IHJlbCArIHJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX2FkZHI7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gICAgICBiZmRfdm1hIHJfYWRkZW5kOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGFzZWN0aW9uICpyX3NlY3Rpb24gPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOwotCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICByX2FkZGVuZCA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfZXh0KSk7Ci0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIGFuZCBtdXN0Ci0JICAgICBtb2RpZnkgdGhlIHJlbG9jIGFjY29yZGluZ2x5LiAgKi8KLQkgIGlmIChyX2V4dGVybgotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB0aGlzIHJlbG9jYXRpb24gaXMgYWdhaW5zdCwKLQkJIGNvbnZlcnQgaXQgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBUaGlzCi0JCSBpcyB3aGF0IHRoZSBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JCWggPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHOwotCQkgIGVsc2UKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KLQkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fREFUQTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0JTUzsKLQkJICBlbHNlCi0JCSAgICByX2luZGV4ID0gTl9BQlM7Ci0KLQkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQotCQkgICAgIGFkZGVuZC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIFZNQSBvZiB0aGUgZmluYWwKLQkJICAgICBkZXN0aW5hdGlvbi4gIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywKLQkJICAgICB0aGVuIEFEREVORCBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIHNvdXJjZSBWTUEuCi0JCSAgICAgV2Ugd2FudCB0byBzZXQgQURERU5EIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJICAgICB0aGUgZGVzdGluYXRpb24gVk1BIGFuZCB0aGUgc291cmNlIFZNQSwgd2hpY2gKLQkJICAgICBtZWFucyB3ZSBtdXN0IGFkanVzdCBSRUxPQ0FUSU9OIGJ5IHRoZSBjaGFuZ2UgaW4KLQkJICAgICB0aGUgc291cmNlIFZNQS4gIFRoaXMgaXMgZG9uZSBiZWxvdy4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCi0JCSAgICAgbWFwLiAgKi8KLQkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKLQotCQkgIGlmIChyX2luZGV4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQkJewotCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCi0JCQkgIGlmIChoLT5pbmR4IDwgMCkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7Ci0JCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAotCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJICByX2luZGV4ID0gaC0+aW5keDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHJfYWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgcl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gMDsKLQotCQkgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kCi0JCSAgICAgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBzb3VyY2UgVk1BLiAgV2UgbXVzdAotCQkgICAgIGFkanVzdCBpdCBieSB0aGUgY2hhbmdlIGluIHRoZSBzb3VyY2UgVk1BLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgYmVsb3cuICAqLwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAotCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgcl9zZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHJfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kIGlzCi0JCSB0aGUgZGlmZmVyZW5jZSBpbiBWTUEgYmV0d2VlbiB0aGUgZGVzdGluYXRpb24gYW5kIHRoZQotCQkgc291cmNlLiAgV2UgaGF2ZSBqdXN0IGFkanVzdGVkIGZvciB0aGUgY2hhbmdlIGluIFZNQQotCQkgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBtdXN0IGFsc28gYWRqdXN0IGJ5IHRoZQotCQkgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgVGhpcyBpcyBkb25lIGJlbG93LiAgKi8KLQkgICAgfQotCi0JICAvKiBBcyBkZXNjcmliZWQgYWJvdmUsIHdlIG11c3QgYWx3YXlzIGFkanVzdCBhIFBDIHJlbGF0aXZlCi0JICAgICByZWxvYyBieSB0aGUgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgSG93ZXZlciwgaWYKLQkgICAgIHBjcmVsX29mZnNldCBpcyBzZXQsIHRoZW4gdGhlIGFkZGVuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCSAgICAgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IG5lZWQKLQkgICAgIHRvIGFkanVzdCBhbnl0aGluZy4gICovCi0JICBpZiAoaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNfcmVsYXRpdmUKLQkgICAgICAmJiAhIGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjcmVsX29mZnNldCkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkZW5kIGlmIG5lY2Vzc2FyeS4gICovCi0JICBpZiAocmVsb2NhdGlvbiAhPSAwKQotCSAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRlbmQgKyByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHJlbC0+cl9hZGRyZXNzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSwgYW5kIG11c3QgZG8gYSBmdWxsCi0JICAgICByZWxvY2F0aW9uLiAgKi8KLQkgIGh1bmRlZiA9IGZhbHNlOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBodW5kZWYgPSB0cnVlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0JICAgICAgaW50IHR5cGU7Ci0KLQkgICAgICAvKiBGb3IgYmFzZSByZWxhdGl2ZSByZWxvY3MsIHJfaW5kZXggaXMgYWx3YXlzIGFuIGluZGV4Ci0gICAgICAgICAgICAgICAgIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiByX2V4dGVybiBpcyAwLiAgKi8KLQkgICAgICBzeW0gPSBzeW1zICsgcl9pbmRleDsKLQkgICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX3R5cGUpOwotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9URVhUCi0JCSAgfHwgdHlwZSA9PSBOX1dFQUtUKQotCQlyX3NlY3Rpb24gPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9EQVRBCi0JCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JCXJfc2VjdGlvbiA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0JTUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCQlyX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtBKQotCQlyX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJCSAgICAgICAtIHJfc2VjdGlvbi0+dm1hKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJfc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcyB0aGUKLQkJIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHZtYXMsIG9yCi0JCSAgIG9sZF9kZXN0X3NlYyArIG9sZF9kZXN0X29mZiAtIChvbGRfc3JjX3NlYyArIG9sZF9zcmNfb2ZmKQotCQkgd2hlcmUKLQkJICAgb2xkX2Rlc3Rfc2VjID09IHNlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfc2VjID09IGlucHV0X3NlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfb2ZmID09IHJfYWRkcgotCi0JCSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgZXhwZWN0cyBSRUxPQ0FUSU9OICsKLQkJIFJfQURERU5EIHRvIGJlIHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uIG1pbnVzCi0JCSByX2FkZHIgKHRoZSBtaW51cyByX2FkZHIgaXMgYmVjYXVzZSB0aGlzIHJlbG9jYXRpb24KLQkJIGlzIG5vdCBwY3JlbF9vZmZzZXQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZyBhbmQKLQkJIHNob3VsZCwgcGVyaGFwcywgYmUgY2hhbmdlZCksIG9yCi0JCSAgIG5ld19kZXN0X3NlYwotCQkgd2hlcmUKLQkJICAgbmV3X2Rlc3Rfc2VjID09IG91dHB1dF9zZWN0aW9uLT52bWEgKyBvdXRwdXRfb2Zmc2V0Ci0JCSBXZSBhcnJhbmdlIGZvciB0aGlzIHRvIGhhcHBlbiBieSBzZXR0aW5nIFJFTE9DQVRJT04gdG8KLQkJICAgbmV3X2Rlc3Rfc2VjICsgb2xkX3NyY19zZWMgLSBvbGRfZGVzdF9zZWMKLQotCQkgSWYgdGhpcyBpcyBub3QgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcwotCQkgc2ltcGx5IHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBzZXQKLQkJIFJFTE9DQVRJT04gdG8gdGhlIGNoYW5nZSBpbiB0aGUgZGVzdGluYXRpb24gVk1BLCBvcgotCQkgICBuZXdfZGVzdF9zZWMgLSBvbGRfZGVzdF9zZWMKLQkJICovCi0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcl9zZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChob3d0b190YWJsZV9leHRbcl90eXBlXS5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCi0JCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHNraXApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKLSAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50Ci0gICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmIChodW5kZWYKLQkgICAgICAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTEwCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UxMwotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJfYWRkciwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHJfdHlwZSAhPSBSRUxPQ19TUEFSQ19SRVYzMikKLQkgICAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZSwKLQkJCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAotCQkJCQlyX2FkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHg7Ci0KLQkgICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJfYWRkcik7Ci0JICAgICAgeCA9IHggKyByZWxvY2F0aW9uICsgcl9hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dGwzMiAoLyppbnB1dF9iZmQsKi8geCwgY29udGVudHMgKyByX2FkZHIpOwotCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQotCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgIGlmIChoICE9IE5VTEwpCi0JCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQkgICAgZWxzZSBpZiAocl9leHRlcm4KLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JCSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWFzZWN0aW9uICpzOwotCi0JCQlzID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgcyk7Ci0JCSAgICAgIH0KLQkJICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0b190YWJsZV9leHRbcl90eXBlXS5uYW1lLAotCQkJICAgIHJfYWRkZW5kLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIgKGZpbmZvLCBvLCBwKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBhc2VjdGlvbiAqbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnByOwotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgZmlsZV9wdHIgKnJlbG9mZl9wdHIgPSBOVUxMOwotICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHNyZWw7Ci0gIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgZXJlbDsKLSAgUFRSIHJlbF9wdHI7Ci0KLSAgcHIgPSBwLT51LnJlbG9jLnA7Ci0KLSAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChwci0+dS5zZWN0aW9uKSkKLQlyX2luZGV4ID0gTl9BQlMgfCBOX0VYVDsKLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUIChwci0+dS5zZWN0aW9uLT5vd25lciA9PSBmaW5mby0+b3V0cHV0X2JmZCk7Ci0JICByX2luZGV4ID0gcHItPnUuc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKTsKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIGggPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGZpbmZvLT5vdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJIHByLT51Lm5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT5pbmR4ID49IDApCi0Jcl9pbmRleCA9IGgtPmluZHg7Ci0gICAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JewotCSAgLyogV2UgZGVjaWRlZCB0byBzdHJpcCB0aGlzIHN5bWJvbCwgYnV0IGl0IHR1cm5zIG91dCB0aGF0IHdlCi0JICAgICBjYW4ndC4gIE5vdGUgdGhhdCB3ZSBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbgotCSAgICAgaGVyZS4gIEkgZG9uJ3QgdGhpbmsgdGhhdCB3aWxsIGV2ZXIgbWF0dGVyIGZvciBhIGdsb2JhbAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIGgtPmluZHggPSAtMjsKLQkgIGgtPndyaXR0ZW4gPSBmYWxzZTsKLQkgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsIChQVFIpIGZpbmZvKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcl9pbmRleCA9IGgtPmluZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoZmluZm8tPmluZm8sIHByLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcl9pbmRleCA9IDA7Ci0JfQotICAgIH0KLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoZmluZm8tPm91dHB1dF9iZmQsIHByLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobyA9PSBvYmpfdGV4dHNlYyAoZmluZm8tPm91dHB1dF9iZmQpKQotICAgIHJlbG9mZl9wdHIgPSAmZmluZm8tPnRyZWxvZmY7Ci0gIGVsc2UgaWYgKG8gPT0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLSAgICByZWxvZmZfcHRyID0gJmZpbmZvLT5kcmVsb2ZmOwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotI2lmZGVmIE1ZX3B1dF9yZWxvYwotICAgICAgTVlfcHV0X3JlbG9jKGZpbmZvLT5vdXRwdXRfYmZkLCByX2V4dGVybiwgcl9pbmRleCwgcC0+b2Zmc2V0LCBob3d0bywKLQkJICAgJnNyZWwpOwotI2Vsc2UKLSAgICAgIHsKLQlpbnQgcl9wY3JlbDsKLQlpbnQgcl9iYXNlcmVsOwotCWludCByX2ptcHRhYmxlOwotCWludCByX3JlbGF0aXZlOwotCWludCByX2xlbmd0aDsKLQotCXJfcGNyZWwgPSBob3d0by0+cGNfcmVsYXRpdmU7Ci0Jcl9iYXNlcmVsID0gKGhvd3RvLT50eXBlICYgOCkgIT0gMDsKLQlyX2ptcHRhYmxlID0gKGhvd3RvLT50eXBlICYgMTYpICE9IDA7Ci0Jcl9yZWxhdGl2ZSA9IChob3d0by0+dHlwZSAmIDMyKSAhPSAwOwotCXJfbGVuZ3RoID0gaG93dG8tPnNpemU7Ci0KLQlQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHAtPm9mZnNldCwgc3JlbC5yX2FkZHJlc3MpOwotCWlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQkgIHsKLQkgICAgc3JlbC5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkgICAgc3JlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCSAgICBzcmVsLnJfaW5kZXhbMl0gPSByX2luZGV4OwotCSAgICBzcmVsLnJfdHlwZVswXSA9Ci0JICAgICAgKChyX2V4dGVybiA/ICAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogMCkKLQkgICAgICAgfCAocl9wY3JlbCA/ICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRyA6IDApCi0JICAgICAgIHwgKHJfYmFzZXJlbCA/ICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRyA6IDApCi0JICAgICAgIHwgKHJfam1wdGFibGUgPyBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcgOiAwKQotCSAgICAgICB8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKLQkgICAgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHNyZWwucl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JICAgIHNyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgICAgc3JlbC5yX2luZGV4WzBdID0gcl9pbmRleDsKLQkgICAgc3JlbC5yX3R5cGVbMF0gPQotCSAgICAgICgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX2Jhc2VyZWwgPyAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHJlbF9wdHIgPSAoUFRSKSAmc3JlbDsKLQotICAgICAgLyogV2UgaGF2ZSB0byB3cml0ZSB0aGUgYWRkZW5kIGludG8gdGhlIG9iamVjdCBmaWxlLCBzaW5jZQotCSBzdGFuZGFyZCBhLm91dCByZWxvY3MgYXJlIGluIHBsYWNlLiAgSXQgd291bGQgYmUgbW9yZQotCSByZWxpYWJsZSBpZiB3ZSBoYWQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGZpbGUgaGVyZSwKLQkgcmF0aGVyIHRoYW4gYXNzdW1pbmcgemVyb2VzLCBidXQgd2UgY2FuJ3QgcmVhZCB0aGUgZmlsZSBzaW5jZQotCSBpdCB3YXMgb3BlbmVkIHVzaW5nIGJmZF9vcGVudy4gICovCi0gICAgICBpZiAocHItPmFkZGVuZCAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCSAgYmZkX2J5dGUgKmJ1ZjsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQkgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0JICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByID0gTVlfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkgICAgICBwci0+YWRkZW5kLCBidWYpOwotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX29rOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAoZmluZm8tPmluZm8sCi0JCSAgICAgIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgID8gYmZkX3NlY3Rpb25fbmFtZSAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCSAgIHByLT51LnNlY3Rpb24pCi0JCSAgICAgICA6IHByLT51Lm5hbWUpLAotCQkgICAgICBob3d0by0+bmFtZSwgcHItPmFkZGVuZCwgKGJmZCAqKSBOVUxMLAotCQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkJewotCQkgIGZyZWUgKGJ1Zik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChmaW5mby0+b3V0cHV0X2JmZCwgbywKLQkJCQkJIChQVFIpIGJ1ZiwKLQkJCQkJIChmaWxlX3B0cikgcC0+b2Zmc2V0LAotCQkJCQkgc2l6ZSk7Ci0JICBmcmVlIChidWYpOwotCSAgaWYgKCEgb2spCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIE1ZX3B1dF9leHRfcmVsb2MKLSAgICAgIE1ZX3B1dF9leHRfcmVsb2MgKGZpbmZvLT5vdXRwdXRfYmZkLCByX2V4dGVybiwgcl9pbmRleCwgcC0+b2Zmc2V0LAotCQkJaG93dG8sICZlcmVsLCBwci0+YWRkZW5kKTsKLSNlbHNlCi0gICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHAtPm9mZnNldCwgZXJlbC5yX2FkZHJlc3MpOwotCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JewotCSAgZXJlbC5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JICBlcmVsLnJfdHlwZVswXSA9Ci0JICAgICgocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHIDogMCkKLQkgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JICBlcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4OwotCSAgZXJlbC5yX3R5cGVbMF0gPQotCSAgICAocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQkgICAgICB8IChob3d0by0+dHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHByLT5hZGRlbmQsIGVyZWwucl9hZGRlbmQpOwotI2VuZGlmIC8qIE1ZX3B1dF9leHRfcmVsb2MgKi8KLQotICAgICAgcmVsX3B0ciA9IChQVFIpICZlcmVsOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCAqcmVsb2ZmX3B0ciwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKHJlbF9wdHIsIChiZmRfc2l6ZV90eXBlKSAxLAotCQkgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCksCi0JCSAgICAgZmluZm8tPm91dHB1dF9iZmQpCi0JICAhPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnJlbG9mZl9wdHIgKz0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKTsKLQotICAvKiBBc3NlcnQgdGhhdCB0aGUgcmVsb2NzIGhhdmUgbm90IHJ1biBpbnRvIHRoZSBzeW1ib2xzLCBhbmQgdGhhdCBuCi0gICAgIHRoZSB0ZXh0IHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgZGF0YSByZWxvY3MuICAqLwotICBCRkRfQVNTRVJUICgqcmVsb2ZmX3B0ciA8PSBvYmpfc3ltX2ZpbGVwb3MgKGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgICAgICYmIChyZWxvZmZfcHRyICE9ICZmaW5mby0+dHJlbG9mZgotCQkgIHx8ICgqcmVsb2ZmX3B0cgotCQkgICAgICA8PSBvYmpfZGF0YXNlYyAoZmluZm8tPm91dHB1dF9iZmQpLT5yZWxfZmlsZXBvcykpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hcmNoaXZlLmMgYi9iZmQvYXJjaGl2ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA5ZjI2Li4wMDAwMDAwCi0tLSBhL2JmZC9hcmNoaXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjE0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgYXJjaGl2ZSBmaWxlcyAobGlicmFyaWVzKS4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgR3VtYnkgSGVua2VsLVdhbGxhY2UncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotQHNldGZpbGVuYW1lIGFyY2hpdmUtaW5mbwotU0VDVElPTgotCUFyY2hpdmVzCi0KLURFU0NSSVBUSU9OCi0JQW4gYXJjaGl2ZSAob3IgbGlicmFyeSkgaXMganVzdCBhbm90aGVyIEJGRC4gIEl0IGhhcyBhIHN5bWJvbAotCXRhYmxlLCBhbHRob3VnaCB0aGVyZSdzIG5vdCBtdWNoIGEgdXNlciBwcm9ncmFtIHdpbGwgZG8gd2l0aCBpdC4KLQotCVRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGFyY2hpdmUgQkZEIGFuZCBhbiBvcmRpbmFyeSBCRkQKLQlpcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXNuJ3QgaGF2ZSBzZWN0aW9ucy4gIEluc3RlYWQgaXQgaGFzIGEKLQljaGFpbiBvZiBCRkRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaXRzIGNvbnRlbnRzLiAgVGhlc2UgQkZEcyBjYW4KLQliZSBtYW5pcHVsYXRlZCBsaWtlIGFueSBvdGhlci4gIFRoZSBCRkRzIGNvbnRhaW5lZCBpbiBhbgotCWFyY2hpdmUgb3BlbmVkIGZvciByZWFkaW5nIHdpbGwgYWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4gIFlvdQotCW1heSBwdXQgZWl0aGVyIGlucHV0IG9yIG91dHB1dCBCRkRzIGludG8gYW4gYXJjaGl2ZSBvcGVuZWQgZm9yCi0Jb3V0cHV0OyB0aGV5IHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0KLQlVc2UgPDxiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlPj4gdG8gc3RlcCB0aHJvdWdoCi0JdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgb3BlbmVkIGZvciBpbnB1dC4gIFlvdSBkb24ndAotCWhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmUgaWYgeW91IGRvbid0IHdhbnQKLQl0byEgIFJlYWQgaXQgdW50aWwgeW91IGZpbmQgd2hhdCB5b3Ugd2FudC4KLQotCUFyY2hpdmUgY29udGVudHMgb2Ygb3V0cHV0IEJGRHMgYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUKLQk8PG5leHQ+PiBwb2ludGVyIGluIGEgQkZELiAgVGhlIGZpcnN0IG9uZSBpcyBmaW5kYWJsZSB0aHJvdWdoCi0JdGhlIDw8YXJjaGl2ZV9oZWFkPj4gc2xvdCBvZiB0aGUgYXJjaGl2ZS4gIFNldCBpdCB3aXRoCi0JPDxiZmRfc2V0X2FyY2hpdmVfaGVhZD4+IChxLnYuKS4gIEEgZ2l2ZW4gQkZEIG1heSBiZSBpbiBvbmx5IG9uZQotCW9wZW4gb3V0cHV0IGFyY2hpdmUgYXQgYSB0aW1lLgotCi0JQXMgZXhwZWN0ZWQsIHRoZSBCRkQgYXJjaGl2ZSBjb2RlIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIHRoZQotCWFyY2hpdmUgY29kZSBvZiBhbnkgZ2l2ZW4gZW52aXJvbm1lbnQuICBCRkQgYXJjaGl2ZXMgbWF5Ci0JY29udGFpbiBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyAoZS5nLiwgYS5vdXQgYW5kIGNvZmYpIGFuZAotCWV2ZW4gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICBZb3UgbWF5IGV2ZW4gcGxhY2UgYXJjaGl2ZXMKLQlyZWN1cnNpdmVseSBpbnRvIGFyY2hpdmVzIQotCi0JVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBjb25mdXNpb24sIHNpbmNlIHNvbWUgYXJjaGl2ZQotCWZvcm1hdHMgYXJlIG1vcmUgZXhwcmVzc2l2ZSB0aGFuIG90aGVycy4gIEZvciBpbnN0YW5jZSwgSW50ZWwKLQlDT0ZGIGFyY2hpdmVzIGNhbiBwcmVzZXJ2ZSBsb25nIGZpbGVuYW1lczsgU3VuT1MgYS5vdXQgYXJjaGl2ZXMKLQljYW5ub3QuICBJZiB5b3UgbW92ZSBhIGZpbGUgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIHNlY29uZAotCWZvcm1hdCBhbmQgYmFjayBhZ2FpbiwgdGhlIGZpbGVuYW1lIG1heSBiZSB0cnVuY2F0ZWQuCi0JTGlrZXdpc2UsIGRpZmZlcmVudCBhLm91dCBlbnZpcm9ubWVudHMgaGF2ZSBkaWZmZXJlbnQKLQljb252ZW50aW9ucyBhcyB0byBob3cgdGhleSB0cnVuY2F0ZSBmaWxlbmFtZXMsIHdoZXRoZXIgdGhleQotCXByZXNlcnZlIGRpcmVjdG9yeSBuYW1lcyBpbiBmaWxlbmFtZXMsIGV0Yy4gIFdoZW4KLQlpbnRlcm9wZXJhdGluZyB3aXRoIG5hdGl2ZSB0b29scywgYmUgc3VyZSB5b3VyIGZpbGVzIGFyZQotCWhvbW9nZW5lb3VzLgotCi0JQmV3YXJlOiBtb3N0IG9mIHRoZXNlIGZvcm1hdHMgZG8gbm90IHJlYWN0IHdlbGwgdG8gdGhlCi0JcHJlc2VuY2Ugb2Ygc3BhY2VzIGluIGZpbGVuYW1lcy4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiwgYnV0Ci0JY2FuJ3QgYWx3YXlzIGhhbmRsZSB0aGlzIGNhc2UgZHVlIHRvIHJlc3RyaWN0aW9ucyBpbiB0aGUgZm9ybWF0IG9mCi0JYXJjaGl2ZXMuICBNYW55IFVuaXggdXRpbGl0aWVzIGFyZSBicmFpbmRlYWQgaW4gcmVnYXJkcyB0bwotCXNwYWNlcyBhbmQgc3VjaCBpbiBmaWxlbmFtZXMgYW55d2F5LCBzbyB0aGlzIHNob3VsZG4ndCBiZSBtdWNoCi0Jb2YgYSByZXN0cmljdGlvbi4KLQotCUFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8YXJjaGl2ZS5jPj4uCi0KLSovCi0KLS8qIEFzc3VtZXM6Ci0gICBvIC0gYWxsIGFyY2hpdmUgZWxlbWVudHMgc3RhcnQgb24gYW4gZXZlbiBib3VuZGFyeSwgbmV3bGluZSBwYWRkZWQ7Ci0gICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgY2hhciAqOwotICAgbyAtIGFsbCBhcmNoIGhlYWRlcnMgYXJlIHRoZSBzYW1lIHNpemUgKGFjcm9zcyBhcmNoaXRlY3R1cmVzKS4KLSovCi0KLS8qIFNvbWUgZm9ybWF0cyBwcm92aWRlIGEgd2F5IHRvIGNyYW0gYSBsb25nIGZpbGVuYW1lIGludG8gdGhlIHNob3J0Ci0gICAoMTYgY2hhcnMpIHNwYWNlIHByb3ZpZGVkIGJ5IGEgQlNEIGFyY2hpdmUuICBUaGUgdHJpY2sgaXM6IG1ha2UgYQotICAgc3BlY2lhbCAiZmlsZSIgaW4gdGhlIGZyb250IG9mIHRoZSBhcmNoaXZlLCBzb3J0IG9mIGxpa2UgdGhlIFNZTURFRgotICAgZW50cnkuICBJZiB0aGUgZmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0LCBwdXQgaXQgaW4gdGhlIGV4dGVuZGVkCi0gICBuYW1lIHRhYmxlLCBhbmQgdXNlIGl0cyBpbmRleCBhcyB0aGUgZmlsZW5hbWUuICBUbyBwcmV2ZW50Ci0gICBjb25mdXNpb24gcHJlcGVuZCB0aGUgaW5kZXggd2l0aCBhIHNwYWNlLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QKLSAgIGhhdmUgZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIHNwYWNlLCBidXQgdGhlbiBhZ2FpbiwgbWFueSBVbml4Ci0gICB1dGlsaXRpZXMgY2FuJ3QgaGFuZGxlIHRoYXQgYW55d2F5LgotCi0gICBUaGlzIHNjaGVtZSB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHRoYXQgeW91IHN0YW5kIG9uIHlvdXIgaGVhZCBpbgotICAgb3JkZXIgdG8gd3JpdGUgYW4gYXJjaGl2ZSBzaW5jZSB5b3UgbmVlZCB0byBwdXQgYSBtYWdpYyBmaWxlIGF0IHRoZQotICAgZnJvbnQsIGFuZCBuZWVkIHRvIHRvdWNoIGV2ZXJ5IGVudHJ5IHRvIGRvIHNvLiAgQydlc3QgbGEgdmllLgotCi0gICBXZSBzdXBwb3J0IHR3byB2YXJpYW50cyBvZiB0aGlzIGlkZWE6Ci0gICBUaGUgU1ZSNCBmb3JtYXQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQgIi8vIiksCi0gICBhbmQgYW4gZXh0ZW5kZWQgcHNldWRvLUJTRCB2YXJpYW50IChleHRlbmRlZCBuYW1lIHRhYmxlIGlzIG5hbWVkCi0gICAiQVJGSUxFTkFNRVMvIikuICBUaGUgb3JpZ2luIG9mIHRoZSBsYXR0ZXIgZm9ybWF0IGlzIHVuY2VydGFpbi4KLQotICAgQlNEIDQuNCB1c2VzIGEgdGhpcmQgc2NoZW1lOiAgSXQgd3JpdGVzIGEgbG9uZyBmaWxlbmFtZQotICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIGhlYWRlci4gIFRoaXMgYWxsb3dzICdhciBxJyB0byB3b3JrLgotICAgV2UgY3VycmVudGx5IGNhbiByZWFkIEJTRCA0LjQgYXJjaGl2ZXMsIGJ1dCBub3Qgd3JpdGUgdGhlbS4KLSovCi0KLS8qIFN1bW1hcnkgb2YgYXJjaGl2ZSBtZW1iZXIgbmFtZXM6Ci0KLSBTeW1ib2wgdGFibGUgKG11c3QgYmUgZmlyc3QpOgotICJfXy5TWU1ERUYgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgQmVya2VsZXkgc3R5bGUsIHByb2R1Y2VkIGJ5IHJhbmxpYi4KLSAiLyAgICAgICAgICAgICAgICIgLSBTeW1ib2wgdGFibGUsIHN5c3RlbSA1IHN0eWxlLgotCi0gTG9uZyBuYW1lIHRhYmxlIChtdXN0IGJlIGJlZm9yZSByZWd1bGFyIGZpbGUgbWVtYmVycyk6Ci0gIi8vICAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIHRhYmxlLCBTeXN0ZW0gNSBSNCBzdHlsZS4KLSAiQVJGSUxFTkFNRVMvICAgICIgLSBMb25nIG5hbWUgdGFibGUsIG5vbi1zdGFuZGFyZCBleHRlbmRlZCBCU0QgKG5vdCBCU0QgNC40KS4KLQotIFJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggc2hvcnQgbmFtZXM6Ci0gImZpbGVuYW1lLm8vICAgICAiIC0gUmVndWxhciBmaWxlLCBTeXN0ZW0gNSBzdHlsZSAoZW1iZWRkZWQgc3BhY2VzIG9rKS4KLSAiZmlsZW5hbWUubyAgICAgICIgLSBSZWd1bGFyIGZpbGUsIEJlcmtlbGV5IHN0eWxlIChubyBlbWJlZGRlZCBzcGFjZXMpLgotCi0gUmVndWxhciBmaWxlcyB3aXRoIGxvbmcgbmFtZXMgKG9yIGVtYmVkZGVkIHNwYWNlcywgZm9yIEJTRCB2YXJpYW50cyk6Ci0gIi8xOCAgICAgICAgICAgICAiIC0gU1ZSNCBzdHlsZSwgbmFtZSBhdCBvZmZzZXQgMTggaW4gbmFtZSB0YWJsZS4KLSAiIzEvMjMgICAgICAgICAgICIgLSBMb25nIG5hbWUgKG9yIGVtYmVkZGVkIHBhY2VzKSAyMyBjaGFyYWN0ZXJzIGxvbmcsCi0JCSAgICAgIEJTRCA0LjQgc3R5bGUsIGZ1bGwgbmFtZSBmb2xsb3dzIGhlYWRlci4KLQkJICAgICAgSW1wbGVtZW50ZWQgZm9yIHJlYWRpbmcsIG5vdCB3cml0aW5nLgotICIgMTggICAgICAgICAgICAgIiAtIExvbmcgbmFtZSAxOCBjaGFyYWN0ZXJzIGxvbmcsIGV4dGVuZGVkIHBzZXVkby1CU0QuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEdOVTk2MAotI2RlZmluZSBCRkRfR05VOTYwX0FSTUFHKGFiZmQpCShCRkRfQ09GRl9GSUxFX1AoKGFiZmQpKSA/IEFSTUFHIDogQVJNQUdCKQotI2VuZGlmCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBjYWNoZSBvZiBhcmNoaXZlIGZpbGVwb2ludGVycyB0byBhcmNoaXZlIGVsZW1lbnRzIHRvCi0gICBzcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgYnkgZmlsZXBvcy4gIFdlIG9ubHkgYWRkIGFuIGVudHJ5IHRvCi0gICB0aGUgY2FjaGUgd2hlbiB3ZSBhY3R1YWxseSByZWFkIG9uZS4gIFdlIGFsc28gZG9uJ3Qgc29ydCB0aGUgY2FjaGU7Ci0gICBpdCdzIGdlbmVyYWxseSBzaG9ydCBlbm91Z2ggdG8gc2VhcmNoIGxpbmVhcmx5LgotICAgTm90ZSB0aGF0IHRoZSBwb2ludGVycyBoZXJlIHBvaW50IHRvIHRoZSBmcm9udCBvZiB0aGUgYXJfaGRyLCBub3QKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgY29udGVudHMhCi0qLwotc3RydWN0IGFyX2NhY2hlCi17Ci0gIGZpbGVfcHRyIHB0cjsKLSAgYmZkICphcmVsdDsKLSAgc3RydWN0IGFyX2NhY2hlICpuZXh0OwotfTsKLQotI2RlZmluZSBhcl9wYWRjaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX3BhZF9jaGFyKQotI2RlZmluZSBhcl9tYXhuYW1lbGVuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfaGRyKGJmZCkgKChzdHJ1Y3QgYXJfaGRyICopYXJjaF9lbHRkYXRhKGJmZCktPmFyY2hfaGVhZGVyKQotCi1zdGF0aWMgY2hhciAqZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqYXJjaCwKLQkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfYnNkX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfY29mZl9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKmZpbGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYXJlbHRkYXRhICpiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJICAgICBjb25zdCBjaGFyICosCi0JCQkJCQkJICAgICBiZmQgKm1lbWJlcikpOwotDAotYm9vbGVhbgotX2JmZF9nZW5lcmljX21rYXJjaGl2ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSAoKHN0cnVjdCBhcnRkYXRhICopCi0JCQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X25leHRfbWFwZW50Ci0KLVNZTk9QU0lTCi0Jc3ltaW5kZXggYmZkX2dldF9uZXh0X21hcGVudChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pOwotCi1ERVNDUklQVElPTgotCVN0ZXAgdGhyb3VnaCBhcmNoaXZlIEB2YXJ7YWJmZH0ncyBzeW1ib2wgdGFibGUgKGlmIGl0Ci0JaGFzIG9uZSkuICBTdWNjZXNzaXZlbHkgdXBkYXRlIEB2YXJ7c3ltfSB3aXRoIHRoZSBuZXh0IHN5bWJvbCdzCi0JaW5mb3JtYXRpb24sIHJldHVybmluZyB0aGF0IHN5bWJvbCdzIChpbnRlcm5hbCkgaW5kZXggaW50byB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLQlTdXBwbHkgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gYXMgdGhlIEB2YXJ7cHJldmlvdXN9IGVudHJ5IHRvIGdldAotCXRoZSBmaXJzdCBvbmU7IHJldHVybnMgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gd2hlbiB5b3UndmUgYWxyZWFkeQotCWdvdCB0aGUgbGFzdCBvbmUuCi0KLQlBIDw8Y2Fyc3ltPj4gaXMgYSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICBUaGUgb25seQotCXVzZXItdmlzaWJsZSBlbGVtZW50IGlzIGl0cyBuYW1lLCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCi0qLwotCi1zeW1pbmRleAotYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgcHJldiwgZW50cnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggcHJldjsKLSAgICAgY2Fyc3ltICoqZW50cnk7Ci17Ci0gIGlmICghYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgICB9Ci0KLSAgaWYgKHByZXYgPT0gQkZEX05PX01PUkVfU1lNQk9MUykKLSAgICBwcmV2ID0gMDsKLSAgZWxzZQotICAgICsrcHJldjsKLSAgaWYgKHByZXYgPj0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCkKLSAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLQotICAqZW50cnkgPSAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBwcmV2KTsKLSAgcmV0dXJuIHByZXY7Ci19Ci0KLS8qIFRvIGJlIGNhbGxlZCBieSBiYWNrZW5kcyBvbmx5ICovCi0KLWJmZCAqCi1fYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgcmV0dXJuIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hpdmVfaGVhZAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9hcmNoaXZlX2hlYWQoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gb2YKLQlCRkRzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZSBAdmFye291dHB1dH0gdG8gQHZhcntuZXdfaGVhZH0uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0cHV0X2FyY2hpdmUsIG5ld19oZWFkKQotICAgICBiZmQgKm91dHB1dF9hcmNoaXZlOwotICAgICBiZmQgKm5ld19oZWFkOwotewotCi0gIG91dHB1dF9hcmNoaXZlLT5hcmNoaXZlX2hlYWQgPSBuZXdfaGVhZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZCAqCi1fYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaF9iZmQsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaF9iZmQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudDsKLQotICBmb3IgKGN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOyBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnB0ciA9PSBmaWxlcG9zKQotICAgICAgcmV0dXJuIGN1cnJlbnQtPmFyZWx0OwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBLaW5kIG9mIHN0dXBpZCB0byBjYWxsIGNvbnMgZm9yIGVhY2ggb25lLCBidXQgd2UgZG9uJ3QgZG8gdG9vIG1hbnkgKi8KLWJvb2xlYW4KLV9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcywgbmV3X2VsdCkKLSAgICAgYmZkICphcmNoX2JmZCwgKm5ld19lbHQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqbmV3X2NhY2hlID0gKChzdHJ1Y3QgYXJfY2FjaGUgKikKLQkJCQliZmRfemFsbG9jIChhcmNoX2JmZCwKLQkJCQkJICAgIHNpemVvZiAoc3RydWN0IGFyX2NhY2hlKSkpOwotCi0gIGlmIChuZXdfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3X2NhY2hlLT5wdHIgPSBmaWxlcG9zOwotICBuZXdfY2FjaGUtPmFyZWx0ID0gbmV3X2VsdDsKLSAgbmV3X2NhY2hlLT5uZXh0ID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotICBpZiAoYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9PSBOVUxMKQotICAgIGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGUgPSBuZXdfY2FjaGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfY2FjaGUgKmN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOwotCi0gICAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAhPSBOVUxMKQotCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgICAgY3VycmVudC0+bmV4dCA9IG5ld19jYWNoZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgbmFtZSBiZWdpbnMgd2l0aCBzcGFjZS4gIEhlbmNlIHRoZSByZXN0IG9mIHRoZSBuYW1lIGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBzdHJpbmcgdGFibGUuICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYXJjaCwgbmFtZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBsb25nIGluZGV4ID0gMDsKLQotICAvKiBTaG91bGQgZXh0cmFjdCBzdHJpbmcgc28gdGhhdCBJIGNhbiBndWFyYW50ZWUgbm90IHRvIG92ZXJmbG93IGludG8KLSAgICAgdGhlIG5leHQgcmVnaW9uLCBidXQgSSdtIHRvbyBsYXp5LiAqLwotICBlcnJubyA9IDA7Ci0gIC8qIFNraXAgZmlyc3QgY2hhciwgd2hpY2ggaXMgJy8nIGluIFNWUjQgb3IgJyAnIGluIHNvbWUgb3RoZXIgdmFyaWFudHMuICovCi0gIGluZGV4ID0gc3RydG9sIChuYW1lICsgMSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfYXJkYXRhIChhcmNoKS0+ZXh0ZW5kZWRfbmFtZXMgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbnMgcmVhZHMgYW4gYXJjaCBoZWFkZXIgYW5kIHJldHVybnMgYW4gYXJlbHRkYXRhIHBvaW50ZXIsIG9yCi0gICBOVUxMIG9uIGVycm9yLgotCi0gICBQcmVzdW1lcyB0aGUgZmlsZSBwb2ludGVyIGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlIChpZSBwb2ludGluZwotICAgdG8gdGhlIGFyX2hkciBpbiB0aGUgZmlsZSkuICAgTW92ZXMgdGhlIGZpbGUgcG9pbnRlcjsgb24gc3VjY2VzcyBpdAotICAgc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBjb250ZW50czsgb24gZmFpbHVyZSBpdAotICAgY291bGQgaGF2ZSBiZWVuIG1vdmVkIGFyYml0cmFyaWx5LgotKi8KLQotUFRSCi1fYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBBbHBoYSBFQ09GRiB1c2VzIGFuIG9wdGlvbmFsIGRpZmZlcmVudCBBUkZNQUcgdmFsdWUsIHNvIHdlIGhhdmUgYQotICAgdmFyaWFudCBvZiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2hpY2ggYWNjZXB0cyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLVBUUgotX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgbWFnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1hZzsKLXsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIGNoYXIgKmhkcnAgPSAoY2hhciAqKSAmaGRyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IG5hbWVsZW4gPSAwOwotICB1bnNpZ25lZCBpbnQgYWxsb2NzaXplID0gc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGNoYXIgKmFsbG9jcHRyID0gMDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhkcnAsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwCi0gICAgICAmJiAobWFnID09IE5VTEwKLQkgIHx8IHN0cm5jbXAgKGhkci5hcl9mbWFnLCBtYWcsIDIpICE9IDApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBFeHRyYWN0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBhcmNoaXZlIC0gdGhlcmUgYXJlIHR3byB3YXlzIHRvCi0gICAgIHNwZWNpZnkgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSwgZWl0aGVyIHRoZSBmaXJzdCBjaGFyIG9mIHRoZQotICAgICBuYW1lIGlzIGEgc3BhY2UsIG9yIGl0J3MgYSBzbGFzaC4gICovCi0gIGlmICgoaGRyLmFyX25hbWVbMF0gPT0gJy8nCi0gICAgICAgfHwgKGhkci5hcl9uYW1lWzBdID09ICcgJwotCSAgICYmIG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpID09IE5VTEwpKQotICAgICAgJiYgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgKGFiZmQsIGhkci5hcl9uYW1lKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotICAvKiBCU0Q0LjQtc3R5bGUgbG9uZyBmaWxlbmFtZS4KLSAgICAgT25seSBpbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgc28gZmFyISAqLwotICBlbHNlIGlmIChoZHIuYXJfbmFtZVswXSA9PSAnIycKLQkgICAmJiBoZHIuYXJfbmFtZVsxXSA9PSAnMScKLQkgICAmJiBoZHIuYXJfbmFtZVsyXSA9PSAnLycKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaGRyLmFyX25hbWVbM10pKQotICAgIHsKLSAgICAgIC8qIEJTRC00LjQgZXh0ZW5kZWQgbmFtZSAqLwotICAgICAgbmFtZWxlbiA9IGF0b2kgKCZoZHIuYXJfbmFtZVszXSk7Ci0gICAgICBhbGxvY3NpemUgKz0gbmFtZWxlbiArIDE7Ci0gICAgICBwYXJzZWRfc2l6ZSAtPSBuYW1lbGVuOwotCi0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZpbGVuYW1lID0gKGFsbG9jcHRyCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZmlsZW5hbWUsIDEsIG5hbWVsZW4sIGFiZmQpICE9IG5hbWVsZW4pCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBmaWxlbmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UganVkZ2UgdGhlIGVuZCBvZiB0aGUgbmFtZSBieSBsb29raW5nIGZvciAnLycgb3IgJyAnLgotCSBOb3RlOiAgVGhlIFNZU1YgZm9ybWF0ICh0ZXJtaW5hdGVkIGJ5ICcvJykgYWxsb3dzIGVtYmVkZGVkCi0JIHNwYWNlcywgc28gb25seSBsb29rIGZvciAnICcgaWYgd2UgZG9uJ3QgZmluZCAnLycuICovCi0KLSAgICAgIGNoYXIgKmU7Ci0gICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJ1wwJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotICAgICAgaWYgKGUgPT0gTlVMTCkKLQl7Ci0gICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotCSAgaWYgKGUgPT0gTlVMTCkKLSAgICAgICAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnICcsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLQl9Ci0KLSAgICAgIGlmIChlICE9IE5VTEwpCi0JbmFtZWxlbiA9IGUgLSBoZHIuYXJfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgdGhlbiB0aGUgbmFtZQotCSAgICAgbXVzdCBiZSB0aGUgZW50aXJlIGZpZWxkLiAgKi8KLQkgIG5hbWVsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQl9Ci0KLSAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKLSAgICB9Ci0KLSAgaWYgKCFhbGxvY3B0cikKLSAgICB7Ci0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXJlZCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGFsbG9jcHRyOwotCi0gIGFyZWQtPmFyY2hfaGVhZGVyID0gYWxsb2NwdHIgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpOwotICBtZW1jcHkgKChjaGFyICopIGFyZWQtPmFyY2hfaGVhZGVyLCAoY2hhciAqKSAmaGRyLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgYXJlZC0+cGFyc2VkX3NpemUgPSBwYXJzZWRfc2l6ZTsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBhcmVkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgYXJlZC0+ZmlsZW5hbWUgPSBhbGxvY3B0ciArIChzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChuYW1lbGVuKQotCW1lbWNweSAoYXJlZC0+ZmlsZW5hbWUsIGhkci5hcl9uYW1lLCBuYW1lbGVuKTsKLSAgICAgIGFyZWQtPmZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIGFyZWQ7Ci19Ci0MCi0vKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uOyBpdCdzIG1haW5seSB1c2VkIHdoZW4gaW5kZXhpbmcKLSAgIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLCBidXQgYWxzbyB1c2VkIHRvIGdldCB0aGUgbmV4dAotICAgZWxlbWVudCwgc2luY2UgaXQgaGFuZGxlcyB0aGUgYm9va2tlZXBpbmcgc28gbmljZWx5IGZvciB1cy4gICovCi0KLWJmZCAqCi1fYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICpuZXdfYXJlbGRhdGE7Ci0gIGJmZCAqbl9uZmQ7Ci0KLSAgbl9uZmQgPSBfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuX25mZCkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgaWYgKDAgPiBiZmRfc2VlayAoYXJjaGl2ZSwgZmlsZXBvcywgU0VFS19TRVQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICgobmV3X2FyZWxkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYXJjaGl2ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbl9uZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2hpdmUpOwotICBpZiAobl9uZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuX25mZC0+b3JpZ2luID0gYmZkX3RlbGwgKGFyY2hpdmUpOwotICBuX25mZC0+YXJlbHRfZGF0YSA9IChQVFIpIG5ld19hcmVsZGF0YTsKLSAgbl9uZmQtPmZpbGVuYW1lID0gbmV3X2FyZWxkYXRhLT5maWxlbmFtZTsKLQotICBpZiAoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hpdmUsIGZpbGVwb3MsIG5fbmZkKSkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgLyogaHVoPyAqLwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbl9uZmQpOwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCBpbiBBQkZEIGluZGV4ZWQgYnkKLSAgIElOREVYLiAgSU5ERVggc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSBiZmRfZ2V0X25leHRfbWFwZW50LiAgKi8KLQotYmZkICoKLV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLQlhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0JU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcwotCXRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlIHRvIHJldHVybiBhIGNyZWF0ZWQKLQlCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZQotCWFyZSBubyBtb3JlLgotCi0qLwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBpZiAoKGJmZF9nZXRfZm9ybWF0IChhcmNoaXZlKSAhPSBiZmRfYXJjaGl2ZSkgfHwKLSAgICAgIChhcmNoaXZlLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYXJjaGl2ZSwKLQkJICAgb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlLAotCQkgICAoYXJjaGl2ZSwKLQkJICAgIGxhc3RfZmlsZSkpOwotfQotCi1iZmQgKgotYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoIWxhc3RfZmlsZSkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBhcmVsdF9zaXplIChsYXN0X2ZpbGUpOwotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuLi4KLQkgTm90ZSB0aGF0IGxhc3RfZmlsZS0+b3JpZ2luIGNhbiBiZSBvZGQgaW4gdGhlIGNhc2Ugb2YKLQkgQlNELTQuNC1zdHlsZSBlbGVtZW50IHdpdGggYSBsb25nIG9kZCBzaXplLiAqLwotICAgICAgZmlsZXN0YXJ0ID0gbGFzdF9maWxlLT5vcmlnaW4gKyBzaXplOwotICAgICAgZmlsZXN0YXJ0ICs9IGZpbGVzdGFydCAlIDI7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9nZW5lcmljX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmZGVmIEdOVTk2MAotICBpZiAoc3RybmNtcCAoYXJtYWcsIEJGRF9HTlU5NjBfQVJNQUcgKGFiZmQpLCBTQVJNQUcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDAgJiYKLSAgICAgIHN0cm5jbXAgKGFybWFnLCBBUk1BR0IsIFNBUk1BRykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGFyZSBzZXR0aW5nIGJmZF9hcmRhdGEoYWJmZCkgaGVyZSwgYnV0IHNpbmNlIGJmZF9hcmRhdGEKLSAgICAgaW52b2x2ZXMgYSBjYXN0LCB3ZSBjYW4ndCBkbyBpdCBhcyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFzc2lnbm1lbnQuICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKLQkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IFNBUk1BRzsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmNhY2hlID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFyY2hpdmVfaGVhZCA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gTlVMTDsKLQotICBpZiAoIUJGRF9TRU5EIChhYmZkLCBfYmZkX3NsdXJwX2FybWFwLCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSwgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4KLQotCSBUaGlzIGlzIGRvbmUgYmVjYXVzZSBhbnkgbm9ybWFsIGZvcm1hdCB3aWxsIHJlY29nbml6ZSBhbnkKLQkgbm9ybWFsIGFyY2hpdmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGVzLgotCSBXZSBkbyBhY2NlcHQgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBTb21lIGNvbnN0YW50cyBmb3IgYSAzMiBiaXQgQlNEIGFyY2hpdmUgc3RydWN0dXJlLiAgV2UgZG8gbm90Ci0gICBzdXBwb3J0IDY0IGJpdCBhcmNoaXZlcyBwcmVzZW50bHk7IHNvIGZhciBhcyBJIGtub3csIG5vbmUgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3VwcG9ydGluZyB0aGVtIHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlc2UgY29uc3RhbnRzLCBhbmQKLSAgIGNoYW5naW5nIHNvbWUgYmZkX2hfZ2V0XzMyIHRvIGJmZF9oX2dldF82NC4gICovCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIHN5bWRlZiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX1NJWkUgOAotCi0vKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIGEgc3ltZGVmIHN0cnVjdHVyZSB0byB0aGUgZmlsZSBvZmZzZXQuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX09GRlNFVF9TSVpFIDQKLQotLyogVGhlIHNpemUgb2YgdGhlIHN5bWRlZiBjb3VudC4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfQ09VTlRfU0laRSA0Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmcgY291bnQuICAqLwotI2RlZmluZSBCU0RfU1RSSU5HX0NPVU5UX1NJWkUgNAotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBjYXJzeW0gKnNldDsKLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CS8qIERvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCi0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCkgLyBCU0RfU1lNREVGX1NJWkU7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFID4KLSAgICAgIHBhcnNlZF9zaXplIC0gQlNEX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICByYmFzZSA9IHJhd19hcm1hcCArIEJTRF9TWU1ERUZfQ09VTlRfU0laRTsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYmFzZQotCQkrIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0JCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLXN0YXRpYyBib29sZWFuCi1kb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGludCAqcmF3X2FybWFwLCAqcmF3cHRyOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLSAgdW5zaWduZWQgaW50IG5zeW16OwkJLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJtYXAuICovCi0gIGJmZF92bWEgKCpzd2FwKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGNoYXIgaW50X2J1ZltzaXplb2YgKGxvbmcpXTsKLSAgdW5zaWduZWQgaW50IGNhcnN5bV9zaXplLCBwdHJzaXplLCBpOwotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGludF9idWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBJdCBzZWVtcyB0aGF0IGFsbCBudW1lcmljIGluZm9ybWF0aW9uIGluIGEgY29mZiBhcmNoaXZlIGlzIGFsd2F5cwotICAgICBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgbm9tYXR0ZXIgdGhlIGhvc3Qgb3IgdGFyZ2V0LiAqLwotICBzd2FwID0gYmZkX2dldGIzMjsKLSAgbnN5bXogPSBiZmRfZ2V0YjMyICgoUFRSKSBpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gKDQgKiBuc3lteikgLSA0OwotCi0jaWYgMQotICAvKiAuLi4gZXhjZXB0IHRoYXQgc29tZSBhcmNoaXZlIGZvcm1hdHMgYXJlIGJyb2tlbiwgYW5kIGl0IG1heSBiZSBvdXIKLSAgICAgZmF1bHQgLSB0aGUgaTk2MCBsaXR0bGUgZW5kaWFuIGNvZmYgc29tZXRpbWVzIGhhcyBiaWcgYW5kIHNvbWV0aW1lcwotICAgICBsaXR0bGUsIGJlY2F1c2Ugb3VyIHRvb2xzIGNoYW5nZWQuICBIZXJlJ3MgYSBob3JyaWJsZSBoYWNrIHRvIGNsZWFuCi0gICAgIHVwIHRoZSBjcmFwLiAgKi8KLQotICBpZiAoc3RyaW5nc2l6ZSA+IDB4ZmZmZmYKLSAgICAgICYmIGJmZF9nZXRfYXJjaCAoYWJmZCkgPT0gYmZkX2FyY2hfaTk2MAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBUaGlzIGxvb2tzIGRhbmdlcm91cywgbGV0J3MgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQgKi8KLSAgICAgIG5zeW16ID0gYmZkX2dldGwzMiAoKFBUUikgaW50X2J1Zik7Ci0gICAgICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7Ci0gICAgICBzd2FwID0gYmZkX2dldGwzMjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY29mZiBhcm1hcCBtdXN0IGJlIHJlYWQgc2VxdWVudGlhbGx5LiAgU28gd2UgY29uc3RydWN0IGEKLSAgICAgYnNkLXN0eWxlIG9uZSBpbiBjb3JlIGFsbCBhdCBvbmNlLCBmb3Igc2ltcGxpY2l0eS4gKi8KLQotICBjYXJzeW1fc2l6ZSA9IChuc3lteiAqIHNpemVvZiAoY2Fyc3ltKSk7Ci0gIHB0cnNpemUgPSAoNCAqIG5zeW16KTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgcmF3IG9mZnNldHMuICovCi0gIHJhd19hcm1hcCA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gcmVsZWFzZV9zeW1kZWZzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIHJlbGVhc2VfcmF3X2FybWFwOwotICAgIH0KLQotICAvKiBPSywgYnVpbGQgdGhlIGNhcnN5bXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgcmF3cHRyID0gcmF3X2FybWFwICsgaTsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gc3dhcCAoKFBUUikgcmF3cHRyKTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgIGNhcnN5bXMrKzsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gMDsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotCi0gIC8qIENoZWNrIGZvciBhIHNlY29uZCBhcmNoaXZlIGhlYWRlciAoYXMgdXNlZCBieSBQRSkgKi8KLSAgewotICAgIHN0cnVjdCBhcmVsdGRhdGEgKnRtcDsKLQotICAgIGJmZF9zZWVrIChhYmZkLCAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gICAgdG1wID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgaWYgKHRtcCAhPSBOVUxMKQotICAgICAgewotCWlmICh0bXAtPmFyY2hfaGVhZGVyWzBdID09ICcvJwotCSAgICAmJiB0bXAtPmFyY2hfaGVhZGVyWzFdID09ICcgJykKLQkgIHsKLQkgICAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0KLQkgICAgICAodG1wLT5wYXJzZWRfc2l6ZSArIHNpemVvZihzdHJ1Y3QgYXJfaGRyKSArIDEpICYgfjE7Ci0JICB9Ci0JYmZkX3JlbGVhc2UgKGFiZmQsIHRtcCk7Ci0gICAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotcmVsZWFzZV9yYXdfYXJtYXA6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotcmVsZWFzZV9zeW1kZWZzOgotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgKGFyZGF0YSktPnN5bWRlZnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gaGFuZGxlIGVpdGhlciBjb2ZmLXN0eWxlIG9yIGJzZC1zdHlsZSBhcm1hcHMuCi0gICBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1ib29sZWFuCi1iZmRfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRiAgICAgICAiLCAxNikKLSAgICAgIHx8ICFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRi8gICAgICAiLCAxNikpIC8qIG9sZCBMaW51eCBhcmNoaXZlcyAqLwotICAgIHJldHVybiBkb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpOwotICBlbHNlIGlmICghc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpKQotICAgIHJldHVybiBkb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKTsKLSAgZWxzZSBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiL1NZTTY0LyAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICAvKiBJcml4IDYgYXJjaGl2ZS0tbXVzdCBiZSByZWNvZ25pemVkIGJ5IGNvZGUgaW4gZWxmNjQtbWlwcy5jLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotLyogZmxhdm9yIDIgb2YgYSBic2QgYXJtYXAsIHNpbWlsYXIgdG8gYmZkX3NsdXJwX2JzZF9hcm1hcCBleGNlcHQgdGhlCi0gICBoZWFkZXIgaXMgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgb3JkZXIgYW5kIHRoZSBtYXAgbmFtZSBpcyAnLycuCi0gICBUaGlzIGZsYXZvdXIgaXMgdXNlZCBieSBocDMwMGhwdXguICovCi0KLSNkZWZpbmUgSFBVWF9TWU1ERUZfQ09VTlRfU0laRSAyCi0KLWJvb2xlYW4KLWJmZF9zbHVycF9ic2RfYXJtYXBfZjIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIGNhcnN5bSAqc2V0OwotICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYXJjaGl2ZSBoYXMgYXQgbGVhc3QgMTYgYnl0ZXMgaW4gaXQgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAtMTZMLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRiAgICAgICAiLCAxNikKLSAgICAgIHx8ICFzdHJuY21wIChuZXh0bmFtZSwgIl9fLlNZTURFRi8gICAgICAiLCAxNikpIC8qIG9sZCBMaW51eCBhcmNoaXZlcyAqLwotICAgIHJldHVybiBkb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpOwotCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgbWFwZGF0YS0+cGFyc2VkX3NpemUpOwotICBpZiAocmF3X2FybWFwID09IE5VTEwpCi0gICAgewotICAgIGJ5ZWJ5ZToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIG1hcGRhdGEtPnBhcnNlZF9zaXplLCBhYmZkKSAhPQotICAgICAgbWFwZGF0YS0+cGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgYnllYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0gICAgICBnb3RvIGJ5ZWJ5ZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0gICAgICA+IG1hcGRhdGEtPnBhcnNlZF9zaXplIC0gSFBVWF9TWU1ERUZfQ09VTlRfU0laRSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB3ZSdyZSB1c2luZyB0aGUgd3JvbmcgYnl0ZSBvcmRlcmluZy4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGdvdG8gYnllYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPmNhY2hlID0gMDsKLQotICBzdHJpbmdzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXAgKyBIUFVYX1NZTURFRl9DT1VOVF9TSVpFKTsKLSAgLyogc2tpcCBzeW0gY291bnQgYW5kIHN0cmluZyBzeiAqLwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIHJhd19hcm1hcAotCQkrIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUKLQkJKyBCU0RfU1RSSU5HX0NPVU5UX1NJWkUpOwotICByYmFzZSA9IChiZmRfYnl0ZSAqKSBzdHJpbmdiYXNlICsgc3RyaW5nc2l6ZTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogQlNEX1NZTURFRl9TSVpFKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBFeHRlbmRlZCBuYW1lIHRhYmxlLgotCi0gIE5vcm1hbGx5IGFyY2hpdmVzIHN1cHBvcnQgb25seSAxNC1jaGFyYWN0ZXIgZmlsZW5hbWVzLgotCi0gIEludGVsIGhhcyBleHRlbmRlZCB0aGUgZm9ybWF0OiBsb25nZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNwZWNpYWwKLSAgZWxlbWVudCAodGhlIGZpcnN0IGluIHRoZSBhcmNoaXZlLCBvciBzZWNvbmQgaWYgdGhlcmUgaXMgYW4gYXJtYXApOwotICB0aGUgbmFtZSBpbiB0aGUgYXJfaGRyIGlzIHJlcGxhY2VkIGJ5IDxzcGFjZT48aW5kZXggaW50byBmaWxlbmFtZQotICBlbGVtZW50Pi4gIEluZGV4IGlzIHRoZSBQLlIuIG9mIGFuIGludCAoZGVjaW1hbCkuICBEYXRhIEdlbmVyYWwgaGF2ZQotICBleHRlbmRlZCB0aGUgZm9ybWF0IGJ5IHVzaW5nIHRoZSBwcmVmaXggLy8gZm9yIHRoZSBzcGVjaWFsIGVsZW1lbnQgKi8KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLWJvb2xlYW4KLV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbmFtZWRhdGE7Ci0KLSAgLyogRklYTUU6ICBGb3JtYXR0aW5nIHN1Y2tzIGhlcmUsIGFuZCBpbiBjYXNlIG9mIGZhaWx1cmUgb2YgQkZEX1JFQUQsCi0gICAgIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gcmV0dXJuIHRydWUuICAqLwotICBiZmRfc2VlayAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcywgU0VFS19TRVQpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCkgPT0gMTYpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiQVJGSUxFTkFNRVMvICAgICIsIDE2KSAhPSAwICYmCi0JICBzdHJuY21wIChuZXh0bmFtZSwgIi8vICAgICAgICAgICAgICAiLCAxNikgIT0gMCkKLQl7Ci0JICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBuYW1lZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICAgICAgaWYgKG5hbWVkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPQotCWJmZF96YWxsb2MgKGFiZmQsIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSk7Ci0gICAgICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID09IE5VTEwpCi0JewotCWJ5ZWJ5ZToKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBuYW1lZGF0YSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcywgMSwKLQkJICAgIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSwgYWJmZCkgIT0gbmFtZWRhdGEtPnBhcnNlZF9zaXplKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSAoYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzKSk7Ci0JICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCSAgZ290byBieWVieWU7Ci0JfQotCi0gICAgICAvKiBTaW5jZSB0aGUgYXJjaGl2ZSBpcyBzdXBwb3NlZCB0byBiZSBwcmludGFibGUgaWYgaXQgY29udGFpbnMKLQkgdGV4dCwgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIG5ld2xpbmUtcGFkZGVkLCBub3QgbnVsbAotCSBwYWRkZWQuIEluIFNWUjQtc3R5bGUgYXJjaGl2ZXMsIHRoZSBuYW1lcyBhbHNvIGhhdmUgYQotCSB0cmFpbGluZyAnLycuICBET1MvTlQgY3JlYXRlZCBhcmNoaXZlIG9mdGVuIGhhdmUgXCBpbiB0aGVtCi0JIFdlJ2xsIGZpeCBhbGwgcHJvYmxlbXMgaGVyZS4uICAqLwotICAgICAgewotCWNoYXIgKnRlbXAgPSBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXM7Ci0JY2hhciAqbGltaXQgPSB0ZW1wICsgbmFtZWRhdGEtPnBhcnNlZF9zaXplOwotCWZvciAoOyB0ZW1wIDwgbGltaXQ7ICsrdGVtcCkgewotCSAgaWYgKCp0ZW1wID09ICdcMDEyJykKLQkgICAgdGVtcFt0ZW1wWy0xXSA9PSAnLycgPyAtMSA6IDBdID0gJ1wwJzsKLQkgIGlmICgqdGVtcCA9PSAnXFwnKQotCSAgICAqdGVtcCA9ICcvJzsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyArPQotCShiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLSAgICAgIC8qIEZJWE1FLCB3ZSBjYW4ndCByZWxlYXNlIG5hbWVkYXRhIGhlcmUgYmVjYXVzZSBpdCB3YXMgYWxsb2NhdGVkCi0JIGJlbG93IGV4dGVuZGVkX25hbWVzIG9uIHRoZSBvYmphbGxvYy4uLiAqLwotICAgICAgLyogYmZkX3JlbGVhc2UgKGFiZmQsIG5hbWVkYXRhKTsgKi8KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgVk1TCi0KLS8qIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0dWZmIGluIHRoZSBmaWxlbmFtZSBiZXR3ZWVuIGFueSA6XT4gYW5kIGEKLSAgIHNlbWljb2xvbiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIENPTlNUIGNoYXIgKmZpcnN0OwotICBDT05TVCBjaGFyICpsYXN0OwotICBjaGFyICpjb3B5OwotCi0gIGZpcnN0ID0gZmlsZSArIHN0cmxlbiAoZmlsZSkgLSAxOwotICBsYXN0ID0gZmlyc3QgKyAxOwotCi0gIHdoaWxlIChmaXJzdCAhPSBmaWxlKQotICAgIHsKLSAgICAgIGlmICgqZmlyc3QgPT0gJzsnKQotCWxhc3QgPSBmaXJzdDsKLSAgICAgIGlmICgqZmlyc3QgPT0gJzonIHx8ICpmaXJzdCA9PSAnXScgfHwgKmZpcnN0ID09ICc+JykKLQl7Ci0JICBmaXJzdCsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZmlyc3QtLTsKLSAgICB9Ci0KLSAgY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgbGFzdCAtIGZpcnN0ICsgMSk7Ci0gIGlmIChjb3B5ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChjb3B5LCBmaXJzdCwgbGFzdCAtIGZpcnN0KTsKLSAgY29weVtsYXN0IC0gZmlyc3RdID0gMDsKLQotICByZXR1cm4gY29weTsKLX0KLQotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSAoYWJmZCwgZmlsZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLQotCi0jaWZkZWYgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSAgewotICAgIC8qIFdlIGNvdWxkIGhhdmUgZm9vL2JhclxcYmF6LCBvciBmb29cXGJhciwgb3IgZDpiYXIuICAqLwotICAgIGNoYXIgKmJzbGFzaCA9IHN0cnJjaHIgKGZpbGUsICdcXCcpOwotICAgIGlmIChic2xhc2ggPiBmaWxlbmFtZSkKLSAgICAgIGZpbGVuYW1lID0gYnNsYXNoOwotICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMICYmIGZpbGVbMF0gIT0gJ1wwJyAmJiBmaWxlWzFdID09ICc6JykKLSAgICAgIGZpbGVuYW1lID0gZmlsZSArIDE7Ci0gIH0KLSNlbmRpZgotICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBmaWxlbmFtZSsrOwotICBlbHNlCi0gICAgZmlsZW5hbWUgPSBmaWxlOwotICByZXR1cm4gZmlsZW5hbWU7Ci19Ci0jZW5kaWYKLQotLyogQnVpbGQgYSBCRkQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRhYmxvYywgdGFibGVuLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKip0YWJsb2M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKLSAgICAgY29uc3QgY2hhciAqKm5hbWU7Ci17Ci0gICpuYW1lID0gIkFSRklMRU5BTUVTLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCBmYWxzZSwgdGFibG9jLCB0YWJsZW4pOwotfQotCi0vKiBCdWlsZCBhbiBTVlI0IHN0eWxlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiLy8iOwotICByZXR1cm4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdHJ1ZSwgdGFibG9jLCB0YWJsZW4pOwotfQotCi0vKiBGb2xsb3dzIGFyY2hpdmVfaGVhZCBhbmQgcHJvZHVjZXMgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSBpZgotICAgbmVjZXNzYXJ5LiAgUmV0dXJucyAoaW4gdGFibG9jKSBhIHBvaW50ZXIgdG8gYW4gZXh0ZW5kZWQgbmFtZQotICAgdGFibGUsIGFuZCBpbiB0YWJsZW4gdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUuICBJZiBpdCBtYWtlcyBhbiBlbnRyeQotICAgaXQgY2xvYmJlcnMgdGhlIGZpbGVuYW1lIHNvIHRoYXQgdGhlIGVsZW1lbnQgbWF5IGJlIHdyaXR0ZW4gd2l0aG91dAotICAgZnVydGhlciBtYXNzYWdlLiAgUmV0dXJucyB0cnVlIGlmIGl0IHJhbiBzdWNjZXNzZnVsbHksIGZhbHNlIGlmCi0gICBzb21ldGhpbmcgd2VudCB3cm9uZy4gIEEgc3VjY2Vzc2Z1bCByZXR1cm4gbWF5IHN0aWxsIGludm9sdmUgYQotICAgemVyby1sZW5ndGggdGFibGVuISAgKi8KLQotYm9vbGVhbgotX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdHJhaWxpbmdfc2xhc2gsIHRhYmxvYywgdGFibGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gdHJhaWxpbmdfc2xhc2g7Ci0gICAgIGNoYXIgKip0YWJsb2M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKLXsKLSAgdW5zaWduZWQgaW50IG1heG5hbWUgPSBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbjsKLSAgdW5zaWduZWQgaW50IHRvdGFsX25hbWVsZW4gPSAwOwotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKnN0cnB0cjsKLQotICAqdGFibGVuID0gMDsKLQotICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSB0YWJsZSBzaG91bGQgYmUgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5vcm1hbDsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzbGVuOwotCi0gICAgICBub3JtYWwgPSBub3JtYWxpemUgKGN1cnJlbnQsIGN1cnJlbnQtPmZpbGVuYW1lKTsKLSAgICAgIGlmIChub3JtYWwgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHRoaXNsZW4gPSBzdHJsZW4gKG5vcm1hbCk7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZQotCSAgJiYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCXRoaXNsZW4gPSBtYXhuYW1lOwotCi0gICAgICBpZiAodGhpc2xlbiA+IG1heG5hbWUpCi0JewotCSAgLyogQWRkIG9uZSB0byBsZWF2ZSByb29tIGZvciBcbi4gICovCi0JICB0b3RhbF9uYW1lbGVuICs9IHRoaXNsZW4gKyAxOwotCSAgaWYgKHRyYWlsaW5nX3NsYXNoKQotCSAgICB7Ci0JICAgICAgLyogTGVhdmUgcm9vbSBmb3IgdHJhaWxpbmcgc2xhc2guICAqLwotCSAgICAgICsrdG90YWxfbmFtZWxlbjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBpZiAoc3RybmNtcCAobm9ybWFsLCBoZHItPmFyX25hbWUsIHRoaXNsZW4pICE9IDAKLQkgICAgICB8fCAodGhpc2xlbiA8IHNpemVvZiBoZHItPmFyX25hbWUKLQkJICAmJiBoZHItPmFyX25hbWVbdGhpc2xlbl0gIT0gYXJfcGFkY2hhciAoY3VycmVudCkpKQotCSAgICB7Ci0JICAgICAgLyogTXVzdCBoYXZlIGJlZW4gdXNpbmcgZXh0ZW5kZWQgZm9ybWF0IGV2ZW4gdGhvdWdoIGl0Ci0JICAgICAgICAgZGlkbid0IG5lZWQgdG8uICBGaXggaXQgdG8gdXNlIG5vcm1hbCBmb3JtYXQuICAqLwotCSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBub3JtYWwsIHRoaXNsZW4pOwotCSAgICAgIGlmICh0aGlzbGVuIDwgbWF4bmFtZQotCQkgIHx8ICh0aGlzbGVuID09IG1heG5hbWUgJiYgdGhpc2xlbiA8IHNpemVvZiBoZHItPmFyX25hbWUpKQotCQloZHItPmFyX25hbWVbdGhpc2xlbl0gPSBhcl9wYWRjaGFyIChjdXJyZW50KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHRvdGFsX25hbWVsZW4gPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqdGFibG9jID0gYmZkX3phbGxvYyAoYWJmZCwgdG90YWxfbmFtZWxlbik7Ci0gIGlmICgqdGFibG9jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICp0YWJsZW4gPSB0b3RhbF9uYW1lbGVuOwotICBzdHJwdHIgPSAqdGFibG9jOwotCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5vcm1hbDsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzbGVuOwotCi0gICAgICBub3JtYWwgPSBub3JtYWxpemUgKGN1cnJlbnQsIGN1cnJlbnQtPmZpbGVuYW1lKTsKLSAgICAgIGlmIChub3JtYWwgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHRoaXNsZW4gPSBzdHJsZW4gKG5vcm1hbCk7Ci0gICAgICBpZiAodGhpc2xlbiA+IG1heG5hbWUpCi0JewotCSAgLyogV29ya3MgZm9yIG5vdzsgbWF5IG5lZWQgdG8gYmUgcmUtZW5naW5lZXJlZCBpZiB3ZQotCSAgICAgZW5jb3VudGVyIGFuIG9kZGJhbGwgYXJjaGl2ZSBmb3JtYXQgYW5kIHdhbnQgdG8KLQkgICAgIGdlbmVyYWxpc2UgdGhpcyBoYWNrLiAqLwotCSAgc3RydWN0IGFyX2hkciAqaGRyID0gYXJjaF9oZHIgKGN1cnJlbnQpOwotCSAgc3RyY3B5IChzdHJwdHIsIG5vcm1hbCk7Ci0JICBpZiAoISB0cmFpbGluZ19zbGFzaCkKLQkgICAgc3RycHRyW3RoaXNsZW5dID0gJ1wwMTInOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RycHRyW3RoaXNsZW5dID0gJy8nOwotCSAgICAgIHN0cnB0clt0aGlzbGVuICsgMV0gPSAnXDAxMic7Ci0JICAgIH0KLQkgIGhkci0+YXJfbmFtZVswXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgLyogV2Uga25vdyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBlbm91Z2ggcm9vbSAob25lIG9mIHRoZSBmZXcKLQkgICAgIGNhc2VzIHdoZXJlIHlvdSBtYXkgc2FmZWx5IHVzZSBzcHJpbnRmKS4gKi8KLQkgIHNwcmludGYgKChoZHItPmFyX25hbWUpICsgMSwgIiUtZCIsICh1bnNpZ25lZCkgKHN0cnB0ciAtICp0YWJsb2MpKTsKLQkgIC8qIEtpbmRhIEtsdWRneS4gIFdlIHNob3VsZCBqdXN0IHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgb2YKLQkgICAgIHNwcmludGYgYnV0IG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIGdldCB0aGlzIHJpZ2h0ICovCi0JICB7Ci0JICAgIGNoYXIgKnRlbXAgPSBoZHItPmFyX25hbWUgKyAyOwotCSAgICBmb3IgKDsgdGVtcCA8IGhkci0+YXJfbmFtZSArIG1heG5hbWU7IHRlbXArKykKLQkgICAgICBpZiAoKnRlbXAgPT0gJ1wwJykKLQkJKnRlbXAgPSAnICc7Ci0JICB9Ci0JICBzdHJwdHIgKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgICsrc3RycHRyOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogQSBjb3VwbGUgb2YgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhcl9oZHJzICovCi0KLSNpZmRlZiBIUFVYX0xBUkdFX0FSX0lEUwotLyogRnVuY3Rpb24gdG8gZW5jb2RlIGxhcmdlIFVJRC9HSUQgdmFsdWVzIGFjY29yZGluZyB0byBIUC4gICovCi1zdGF0aWMgdm9pZAotaHB1eF91aWRfZ2lkX2VuY29kZSAoc3RyLCBpZCkKLSAgICAgY2hhciBzdHJbNl07Ci0gICAgIGxvbmcgaW50IGlkOwotewotICBpbnQgY250OwotCi0gIHN0cls1XSA9ICdAJyArIChpZCAmIDMpOwotICBpZCA+Pj0gMjsKLQotICBmb3IgKGNudCA9IDQ7IGNudCA+PSAwOyArK2NudCwgaWQgPj49IDYpCi0gICAgc3RyW2NudF0gPSAnICcgKyAoaWQgJiAweDNmKTsKLX0KLSNlbmRpZgkvKiBIUFVYX0xBUkdFX0FSX0lEUyAqLwotCi0jaWZuZGVmIEhBVkVfR0VUVUlECi0jZGVmaW5lIGdldHVpZCgpIDAKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VUR0lECi0jZGVmaW5lIGdldGdpZCgpIDAKLSNlbmRpZgotCi0vKiBUYWtlcyBhIGZpbGVuYW1lLCByZXR1cm5zIGFuIGFyZWx0X2RhdGEgZm9yIGl0LCBvciBOVUxMIGlmIGl0IGNhbid0Ci0gICBtYWtlIG9uZS4gIFRoZSBmaWxlbmFtZSBtdXN0IHJlZmVyIHRvIGEgZmlsZW5hbWUgaW4gdGhlIGZpbGVzeXN0ZW0uCi0gICBUaGUgZmlsZW5hbWUgZmllbGQgb2YgdGhlIGFyX2hkciB3aWxsIE5PVCBiZSBpbml0aWFsaXplZC4gIElmIG1lbWJlcgotICAgaXMgc2V0LCBhbmQgaXQncyBhbiBpbi1tZW1vcnkgYmZkLCB3ZSBmYWtlIGl0LiAqLwotCi1zdGF0aWMgc3RydWN0IGFyZWx0ZGF0YSAqCi1iZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIG1lbWJlcikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYmZkICptZW1iZXI7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXR1czsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqYXJlZDsKLSAgc3RydWN0IGFyX2hkciAqaGRyOwotICBjaGFyICp0ZW1wLCAqdGVtcDE7Ci0KLSAgaWYgKG1lbWJlciAmJiAobWVtYmVyLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogQXNzdW1lIHdlIGp1c3QgIm1hZGUiIHRoZSBtZW1iZXIsIGFuZCBmYWtlIGl0ICovCi0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIG1lbWJlci0+aW9zdHJlYW07Ci0gICAgICB0aW1lKCZzdGF0dXMuc3RfbXRpbWUpOwotICAgICAgc3RhdHVzLnN0X3VpZCA9IGdldHVpZCgpOwotICAgICAgc3RhdHVzLnN0X2dpZCA9IGdldGdpZCgpOwotICAgICAgc3RhdHVzLnN0X21vZGUgPSAwNjQ0OwotICAgICAgc3RhdHVzLnN0X3NpemUgPSBiaW0tPnNpemU7Ci0gICAgfQotICBlbHNlIGlmIChzdGF0IChmaWxlbmFtZSwgJnN0YXR1cykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFyZWQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKGFyZWQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgKCgoY2hhciAqKSBhcmVkKSArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCi0gIC8qIGFyIGhlYWRlcnMgYXJlIHNwYWNlIHBhZGRlZCwgbm90IG51bGwgcGFkZGVkISAqLwotICBtZW1zZXQgKChQVFIpIGhkciwgJyAnLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLQotICBzdHJuY3B5IChoZHItPmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgLyogR29kZGFtbmVkIHNwcmludGYgZG9lc24ndCBwZXJtaXQgTUFYSU1VTSBmaWVsZCBsZW5ndGhzICovCi0gIHNwcmludGYgKChoZHItPmFyX2RhdGUpLCAiJS0xMmxkIiwgKGxvbmcpIHN0YXR1cy5zdF9tdGltZSk7Ci0jaWZkZWYgSFBVWF9MQVJHRV9BUl9JRFMKLSAgLyogSFAgaGFzIGEgdmVyeSAic3BlY2lhbCIgd2F5IHRvIGhhbmRsZSBVSUQvR0lEJ3Mgd2l0aCBudW1lcmljIHZhbHVlcwotICAgICA+IDk5OTk5LiAgKi8KLSAgaWYgKHN0YXR1cy5zdF91aWQgPiA5OTk5OSkKLSAgICBocHV4X3VpZF9naWRfZW5jb2RlIChoZHItPmFyX2dpZCwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotICBlbHNlCi0jZW5kaWYKLSAgICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotI2lmZGVmIEhQVVhfTEFSR0VfQVJfSURTCi0gIC8qIEhQIGhhcyBhIHZlcnkgInNwZWNpYWwiIHdheSB0byBoYW5kbGUgVUlEL0dJRCdzIHdpdGggbnVtZXJpYyB2YWx1ZXMKLSAgICAgPiA5OTk5OS4gICovCi0gIGlmIChzdGF0dXMuc3RfZ2lkID4gOTk5OTkpCi0gICAgaHB1eF91aWRfZ2lkX2VuY29kZSAoaGRyLT5hcl91aWQsIChsb25nKSBzdGF0dXMuc3RfZ2lkKTsKLSAgZWxzZQotI2VuZGlmCi0gIHNwcmludGYgKChoZHItPmFyX2dpZCksICIlbGQiLCAobG9uZykgc3RhdHVzLnN0X2dpZCk7Ci0gIHNwcmludGYgKChoZHItPmFyX21vZGUpLCAiJS04byIsICh1bnNpZ25lZCBpbnQpIHN0YXR1cy5zdF9tb2RlKTsKLSAgc3ByaW50ZiAoKGhkci0+YXJfc2l6ZSksICIlLTEwbGQiLCAobG9uZykgc3RhdHVzLnN0X3NpemUpOwotICAvKiBDb3JyZWN0IGZvciBhIGxvc3NhZ2UgaW4gc3ByaW50ZiB3aGVyZWJ5IGl0IG51bGwtdGVybWluYXRlcy4gIEkgY2Fubm90Ci0gICAgIHVuZGVyc3RhbmQgaG93IHRoZXNlIEMgbG9zZXJzIGNvdWxkIGRlc2lnbiBzdWNoIGEgcmFtc2hhY2tsZSBidW5jaCBvZgotICAgICBJTyBvcGVyYXRpb25zICovCi0gIHRlbXAgPSAoY2hhciAqKSBoZHI7Ci0gIHRlbXAxID0gdGVtcCArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgLSAyOwotICBmb3IgKDsgdGVtcCA8IHRlbXAxOyB0ZW1wKyspCi0gICAgewotICAgICAgaWYgKCp0ZW1wID09ICdcMCcpCi0JKnRlbXAgPSAnICc7Ci0gICAgfQotICBzdHJuY3B5IChoZHItPmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gIGFyZWQtPnBhcnNlZF9zaXplID0gc3RhdHVzLnN0X3NpemU7Ci0gIGFyZWQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRyOwotCi0gIHJldHVybiBhcmVkOwotfQotCi0vKiBUaGlzIGlzIG1hZ2ljIHJlcXVpcmVkIGJ5IHRoZSAiYXIiIHByb2dyYW0uICBTaW5jZSBpdCdzCi0gICAgdW5kb2N1bWVudGVkLCBpdCdzIHVuZG9jdW1lbnRlZC4gIFlvdSBtYXkgdGhpbmsgdGhhdCBpdCB3b3VsZCB0YWtlCi0gICAgYSBzdHJvbmcgc3RvbWFjaCB0byB3cml0ZSB0aGlzLCBhbmQgaXQgZG9lcywgYnV0IGl0IHRha2VzIGV2ZW4gYQotICAgIHN0cm9uZ2VyIHN0b21hY2ggdG8gdHJ5IHRvIGNvZGUgYXJvdW5kIHN1Y2ggYSB0aGluZyEgICovCi0KLXN0cnVjdCBhcl9oZHIgKmJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RydWN0IGFyX2hkciAqCi1iZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSAoYWJmZCwgZmlsZW5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyX2VsdCA9IGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhYmZkLCBmaWxlbmFtZSwgMCk7Ci0gIGlmIChhcl9lbHQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIChzdHJ1Y3QgYXJfaGRyICopIGFyX2VsdC0+YXJjaF9oZWFkZXI7Ci19Ci0KLQotLyogQW5hbG9nb3VzIHRvIHN0YXQgY2FsbCAqLwotaW50Ci1iZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyOwotICBjaGFyICphbG9zZXI7Ci0KLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBoZHIgPSBhcmNoX2hkciAoYWJmZCk7Ci0KLSNkZWZpbmUgZm9vKGFyZWx0LCBzdGVsdCwgc2l6ZSkgIFwKLSAgYnVmLT5zdGVsdCA9IHN0cnRvbCAoaGRyLT5hcmVsdCwgJmFsb3Nlciwgc2l6ZSk7IFwKLSAgaWYgKGFsb3NlciA9PSBoZHItPmFyZWx0KSByZXR1cm4gLTE7Ci0gIC8qIFNvbWUgcGxhdGZvcm1zIHN1cHBvcnQgc3BlY2lhbCBub3RhdGlvbnMgZm9yIGxhcmdlIElEcy4gICovCi0jaWZkZWYgSFBVWF9MQVJHRV9BUl9JRFMKLSMgZGVmaW5lIGZvbzIoYXJlbHQsIHN0ZWx0LCBzaXplKSBcCi0gIGlmIChoZHItPmFyZWx0WzVdID09ICcgJykgeyBmb28gKGFyZWx0LCBzdGVsdCwgc2l6ZSk7IH0gXAotICBlbHNlIHsgXAotICAgIGludCBjbnQ7IFwKLSAgICBmb3IgKGJ1Zi0+c3RlbHQgPSBjbnQgPSAwOyBjbnQgPCA1OyArK2NudCkgXAotICAgICAgeyBcCi0JaWYgKGhkci0+YXJlbHRbY250XSA8ICcgJyB8fCBoZHItPmFyZWx0W2NudF0gPiAnICcgKyAweDNmKSBcCi0JICByZXR1cm4gLTE7IFwKLQlidWYtPnN0ZWx0IDw8PSA2OyBcCi0JYnVmLT5zdGVsdCArPSBoZHItPmFyZWx0W2NudF0gLSAnICc7IFwKLSAgICAgIH0gXAotICAgIGlmIChoZHItPmFyZWx0WzVdIDwgJ0AnIHx8IGhkci0+YXJlbHRbNV0gPiAnQCcgKyAzKSByZXR1cm4gLTE7IFwKLSAgICBidWYtPnN0ZWx0IDw8PSAyOyBcCi0gICAgYnVmLT5zdGVsdCArPSBoZHItPmFyZWx0WzVdIC0gJ0AnOyBcCi0gIH0KLSNlbHNlCi0jIGRlZmluZSBmb28yKGFyZWx0LCBzdGVsdCwgc2l6ZSkgZm9vIChhcmVsdCwgc3RlbHQsIHNpemUpCi0jZW5kaWYKLQotICBmb28gKGFyX2RhdGUsIHN0X210aW1lLCAxMCk7Ci0gIGZvbzIgKGFyX3VpZCwgc3RfdWlkLCAxMCk7Ci0gIGZvbzIgKGFyX2dpZCwgc3RfZ2lkLCAxMCk7Ci0gIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWJmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KLSAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcwotICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQotICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLwotCi0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBzaXplX3QgbGVuZ3RoOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgewotICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7Ci0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotCi0gIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLwotICBpZiAobGVuZ3RoIDwgbWF4bGVuCi0gICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLXZvaWQKLWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0jaWZkZWYgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSAgewotICAgIC8qIFdlIGNvdWxkIGhhdmUgZm9vL2JhclxcYmF6LCBvciBmb29cXGJhciwgb3IgZDpiYXIuICAqLwotICAgIGNoYXIgKmJzbGFzaCA9IHN0cnJjaHIgKHBhdGhuYW1lLCAnXFwnKTsKLSAgICBpZiAoYnNsYXNoID4gZmlsZW5hbWUpCi0gICAgICBmaWxlbmFtZSA9IGJzbGFzaDsKLSAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCAmJiBwYXRobmFtZVswXSAhPSAnXDAnICYmIHBhdGhuYW1lWzFdID09ICc6JykKLSAgICAgIGZpbGVuYW1lID0gcGF0aG5hbWUgKyAxOwotICB9Ci0jZW5kaWYKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBwYXRobmFtZTogbWVldCBwcm9jcnVzdGVzICovCi0gICAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIG1heGxlbik7Ci0gICAgICBsZW5ndGggPSBtYXhsZW47Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCBtYXhsZW4pCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotCi0vKiBTdG9yZSBuYW1lIGludG8gYXIgaGVhZGVyLiAgVHJ1bmNhdGVzIHRoZSBuYW1lIHRvIGZpdC4KLSAgIDE+IHN0cmlwIHBhdGhuYW1lIHRvIGJlIGp1c3QgdGhlIGJhc2VuYW1lLgotICAgMj4gaWYgaXQncyBzaG9ydCBlbnVmIHRvIGZpdCwgc3R1ZmYgaXQgaW4uCi0gICAzPiBJZiBpdCBkb2Vzbid0IGVuZCB3aXRoIC5vLCB0cnVuY2F0ZSBpdCB0byBmaXQKLSAgIDQ+IHRydW5jYXRlIGl0IGJlZm9yZSB0aGUgLm8sIGFwcGVuZCAubywgc3R1ZmYgVEhBVCBpbi4gICovCi0KLS8qIFRoaXMgaXMgd2hhdCBnbnUgYXIgZG9lcy4gIEl0J3MgYmV0dGVyIGJ1dCBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIGJzZCBhci4gKi8KLQotdm9pZAotYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpwYXRobmFtZTsKLSAgICAgY2hhciAqYXJoZHI7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBpbnQgbGVuZ3RoOwotICBDT05TVCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIgKHBhdGhuYW1lLCAnLycpOwotICBpbnQgbWF4bGVuID0gYXJfbWF4bmFtZWxlbiAoYWJmZCk7Ci0KLSNpZmRlZiBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQotICB7Ci0gICAgLyogV2UgY291bGQgaGF2ZSBmb28vYmFyXFxiYXosIG9yIGZvb1xcYmFyLCBvciBkOmJhci4gICovCi0gICAgY2hhciAqYnNsYXNoID0gc3RycmNociAocGF0aG5hbWUsICdcXCcpOwotICAgIGlmIChic2xhc2ggPiBmaWxlbmFtZSkKLSAgICAgIGZpbGVuYW1lID0gYnNsYXNoOwotICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMICYmIHBhdGhuYW1lWzBdICE9ICdcMCcgJiYgcGF0aG5hbWVbMV0gPT0gJzonKQotICAgICAgZmlsZW5hbWUgPSBwYXRobmFtZSArIDE7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsJCQkJLyogcGF0aG5hbWU6IG1lZXQgcHJvY3J1c3RlcyAqLwotICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBtYXhsZW4pOwotICAgICAgaWYgKChmaWxlbmFtZVtsZW5ndGggLSAyXSA9PSAnLicpICYmIChmaWxlbmFtZVtsZW5ndGggLSAxXSA9PSAnbycpKQotCXsKLQkgIGhkci0+YXJfbmFtZVttYXhsZW4gLSAyXSA9ICcuJzsKLQkgIGhkci0+YXJfbmFtZVttYXhsZW4gLSAxXSA9ICdvJzsKLQl9Ci0gICAgICBsZW5ndGggPSBtYXhsZW47Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCAxNikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0MCi0vKiBUaGUgQkZEIGlzIG9wZW4gZm9yIHdyaXRlIGFuZCBoYXMgaXRzIGZvcm1hdCBzZXQgdG8gYmZkX2FyY2hpdmUgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhcmNoKQotICAgICBiZmQgKmFyY2g7Ci17Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqZXRhYmxlID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBlbGVuZ3RoID0gMDsKLSAgY29uc3QgY2hhciAqZW5hbWUgPSBOVUxMOwotICBib29sZWFuIG1ha2VtYXAgPSBiZmRfaGFzX21hcCAoYXJjaCk7Ci0gIGJvb2xlYW4gaGFzb2JqZWN0cyA9IGZhbHNlOwkvKiBpZiBubyAubydzLCBkb24ndCBib3RoZXIgdG8gbWFrZSBhIG1hcCAqLwotICBiZmRfc2l6ZV90eXBlIHdyb3RlOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHRyaWVzOwotCi0gIC8qIFZlcmlmeSB0aGUgdmlhYmlsaXR5IG9mIGFsbCBlbnRyaWVzOyBpZiBhbnkgb2YgdGhlbSBsaXZlIGluIHRoZQotICAgICBmaWxlc3lzdGVtIChhcyBvcHBvc2VkIHRvIGxpdmluZyBpbiBhbiBhcmNoaXZlIG9wZW4gZm9yIGlucHV0KQotICAgICB0aGVuIGNvbnN0cnVjdCBhIGZyZXNoIGFyX2hkciBmb3IgdGhlbS4gICovCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZV9wIChjdXJyZW50KSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICghY3VycmVudC0+YXJlbHRfZGF0YSkKLQl7Ci0JICBjdXJyZW50LT5hcmVsdF9kYXRhID0KLQkgICAgKFBUUikgYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFyY2gsIGN1cnJlbnQtPmZpbGVuYW1lLCBjdXJyZW50KTsKLQkgIGlmICghY3VycmVudC0+YXJlbHRfZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBQdXQgaW4gdGhlIGZpbGUgbmFtZSAqLwotCSAgQkZEX1NFTkQgKGFyY2gsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAoYXJjaCwKLQkJCQkJCSBjdXJyZW50LT5maWxlbmFtZSwKLQkJCQkJICAgICAgKGNoYXIgKikgYXJjaF9oZHIgKGN1cnJlbnQpKSk7Ci0JfQotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewkJCS8qIGRvbid0IGJvdGhlciBpZiB3ZSB3b24ndCBtYWtlIGEgbWFwISAqLwotCSAgaWYgKChiZmRfY2hlY2tfZm9ybWF0IChjdXJyZW50LCBiZmRfb2JqZWN0KSkKLSNpZiAwCQkJCS8qIEZJWE1FIC0tIHRoZXNlIGFyZSBub3Qgc2V0IGNvcnJlY3RseSAqLwotCSAgICAgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkKLSNlbmRpZgotCSAgICApCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFCRkRfU0VORCAoYXJjaCwgX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSwKLQkJIChhcmNoLCAmZXRhYmxlLCAmZWxlbmd0aCwgJmVuYW1lKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYXJjaCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWZkZWYgR05VOTYwCi0gIHdyb3RlID0gYmZkX3dyaXRlIChCRkRfR05VOTYwX0FSTUFHIChhcmNoKSwgMSwgU0FSTUFHLCBhcmNoKTsKLSNlbHNlCi0gIHdyb3RlID0gYmZkX3dyaXRlIChBUk1BRywgMSwgU0FSTUFHLCBhcmNoKTsKLSNlbmRpZgotICBpZiAod3JvdGUgIT0gU0FSTUFHKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIGlmIChfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKSAhPSB0cnVlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZW5ndGggIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZW5hbWUpOwotICAgICAgLyogUm91bmQgc2l6ZSB1cCB0byBldmVuIG51bWJlciBpbiBhcmNoaXZlIGhlYWRlci4gICovCi0gICAgICBzcHJpbnRmICgmKGhkci5hcl9zaXplWzBdKSwgIiUtMTBkIiwKLQkgICAgICAgKGludCkgKChlbGVuZ3RoICsgMSkgJiB+MSkpOwotICAgICAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotCWlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotCSAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLSAgICAgIGlmICgoYmZkX3dyaXRlICgoY2hhciAqKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotCSAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0JICB8fCBiZmRfd3JpdGUgKGV0YWJsZSwgMSwgZWxlbmd0aCwgYXJjaCkgIT0gZWxlbmd0aCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoKGVsZW5ndGggJSAyKSA9PSAxKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKCJcMDEyIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZm9yIChjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotICAgICAgdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGFyZWx0X3NpemUgKGN1cnJlbnQpOwotICAgICAgc3RydWN0IGFyX2hkciAqaGRyID0gYXJjaF9oZHIgKGN1cnJlbnQpOwotCi0gICAgICAvKiB3cml0ZSBhciBoZWFkZXIgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGhkciwgMSwgc2l6ZW9mICgqaGRyKSwgYXJjaCkgIT0gc2l6ZW9mICgqaGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGN1cnJlbnQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgd2hpbGUgKHJlbWFpbmluZykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgYW10ID0gREVGQVVMVF9CVUZGRVJTSVpFOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgZXJybm8gPSAwOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIGFtdCwgMSwgY3VycmVudCkgIT0gYW10KQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBhbXQsIDEsIGFyY2gpICE9IGFtdCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVtYWluaW5nIC09IGFtdDsKLQl9Ci0gICAgICBpZiAoKGFyZWx0X3NpemUgKGN1cnJlbnQpICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChtYWtlbWFwICYmIGhhc29iamVjdHMpCi0gICAgewotICAgICAgLyogVmVyaWZ5IHRoZSB0aW1lc3RhbXAgaW4gdGhlIGFyY2hpdmUgZmlsZS4gIElmIGl0IHdvdWxkIG5vdCBiZQotCSBhY2NlcHRlZCBieSB0aGUgbGlua2VyLCByZXdyaXRlIGl0IHVudGlsIGl0IHdvdWxkIGJlLiAgSWYKLQkgYW55dGhpbmcgb2RkIGhhcHBlbnMsIGJyZWFrIG91dCBhbmQganVzdCByZXR1cm4uICAoVGhlCi0JIEJlcmtlbGV5IGxpbmtlciBjaGVja3MgdGhlIHRpbWVzdGFtcCBhbmQgcmVmdXNlcyB0byByZWFkIHRoZQotCSB0YWJsZS1vZi1jb250ZW50cyBpZiBpdCBpcyA+NjAgc2Vjb25kcyBsZXNzIHRoYW4gdGhlIGZpbGUncwotCSBtb2RpZmllZC10aW1lLiAgVGhhdCBwYWluZnVsIGhhY2sgcmVxdWlyZXMgdGhpcyBwYWluZnVsIGhhY2suICAqLwotICAgICAgdHJpZXMgPSAxOwotICAgICAgZG8KLQl7Ci0JICBpZiAoYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpKQotCSAgICBicmVhazsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiV2FybmluZzogd3JpdGluZyBhcmNoaXZlIHdhcyBzbG93OiByZXdyaXRpbmcgdGltZXN0YW1wXG4iKSk7Ci0JfQotICAgICAgd2hpbGUgKCsrdHJpZXMgPCA2KTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOb3RlIHRoYXQgdGhlIG5hbWlkeCBmb3IgdGhlIGZpcnN0IHN5bWJvbCBpcyAwICovCi0KLWJvb2xlYW4KLV9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci17Ci0gIGNoYXIgKmZpcnN0X25hbWUgPSBOVUxMOwotICBiZmQgKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIGVsdF9ubyA9IDA7Ci0gIHN0cnVjdCBvcmwgKm1hcCA9IE5VTEw7Ci0gIGludCBvcmxfbWF4ID0gMTAyNDsJCS8qIGZpbmUgaW5pdGlhbCBkZWZhdWx0ICovCi0gIGludCBvcmxfY291bnQgPSAwOwotICBpbnQgc3RyaWR4ID0gMDsJCS8qIHN0cmluZyBpbmRleCAqLwotICBhc3ltYm9sICoqc3ltcyA9IE5VTEw7Ci0gIGxvbmcgc3ltc19tYXggPSAwOwotICBib29sZWFuIHJldDsKLQotICAvKiBEdW5ubyBpZiB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIGZvciB0aGlzIGluZm8uLi4gKi8KLSAgaWYgKGVsZW5ndGggIT0gMCkKLSAgICBlbGVuZ3RoICs9IHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGVsZW5ndGggKz0gZWxlbmd0aCAlIDI7Ci0KLSAgbWFwID0gKHN0cnVjdCBvcmwgKikgYmZkX21hbGxvYyAob3JsX21heCAqIHNpemVvZiAoc3RydWN0IG9ybCkpOwotICBpZiAobWFwID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UgcHV0IHRoZSBzeW1ib2wgbmFtZXMgb24gdGhlIGFyY2ggb2JqYWxsb2MsIGFuZCB0aGVuIGRpc2NhcmQKLSAgICAgdGhlbSB3aGVuIGRvbmUuICAqLwotICBmaXJzdF9uYW1lID0gYmZkX2FsbG9jIChhcmNoLCAxKTsKLSAgaWYgKGZpcnN0X25hbWUgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBEcm9wIGFsbCB0aGUgZmlsZXMgY2FsbGVkIF9fLlNZTURFRiwgd2UncmUgZ29pbmcgdG8gbWFrZSBvdXIKLSAgICAgb3duICovCi0gIHdoaWxlIChhcmNoLT5hcmNoaXZlX2hlYWQgJiYKLQkgc3RyY21wIChhcmNoLT5hcmNoaXZlX2hlYWQtPmZpbGVuYW1lLCAiX18uU1lNREVGIikgPT0gMCkKLSAgICBhcmNoLT5hcmNoaXZlX2hlYWQgPSBhcmNoLT5hcmNoaXZlX2hlYWQtPm5leHQ7Ci0KLSAgLyogTWFwIG92ZXIgZWFjaCBlbGVtZW50ICovCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgICAgICBjdXJyZW50ICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgZWx0X25vKyspCi0gICAgewotICAgICAgaWYgKChiZmRfY2hlY2tfZm9ybWF0IChjdXJyZW50LCBiZmRfb2JqZWN0KSA9PSB0cnVlKQotCSAgJiYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGN1cnJlbnQpICYgSEFTX1NZTVMpKSkKLQl7Ci0JICBsb25nIHN0b3JhZ2U7Ci0JICBsb25nIHN5bWNvdW50OwotCSAgbG9uZyBzcmNfY291bnQ7Ci0KLQkgIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoY3VycmVudCk7Ci0JICBpZiAoc3RvcmFnZSA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoc3RvcmFnZSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHN0b3JhZ2UgPiBzeW1zX21heCkKLQkJewotCQkgIGlmIChzeW1zX21heCA+IDApCi0JCSAgICBmcmVlIChzeW1zKTsKLQkJICBzeW1zX21heCA9IHN0b3JhZ2U7Ci0JCSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzeW1zX21heCk7Ci0JCSAgaWYgKHN5bXMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoY3VycmVudCwgc3ltcyk7Ci0JICAgICAgaWYgKHN5bWNvdW50IDwgMCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBOb3cgbWFwIG92ZXIgYWxsIHRoZSBzeW1ib2xzLCBwaWNraW5nIG91dCB0aGUgb25lcyB3ZSB3YW50ICovCi0JICAgICAgZm9yIChzcmNfY291bnQgPSAwOyBzcmNfY291bnQgPCBzeW1jb3VudDsgc3JjX2NvdW50KyspCi0JCXsKLQkJICBmbGFnd29yZCBmbGFncyA9IChzeW1zW3NyY19jb3VudF0pLT5mbGFnczsKLQkJICBhc2VjdGlvbiAqc2VjID0gc3ltc1tzcmNfY291bnRdLT5zZWN0aW9uOwotCi0JCSAgaWYgKChmbGFncyAmIEJTRl9HTE9CQUwgfHwKLQkJICAgICAgIGZsYWdzICYgQlNGX1dFQUsgfHwKLQkJICAgICAgIGZsYWdzICYgQlNGX0lORElSRUNUIHx8Ci0JCSAgICAgICBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0JCSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotCQkgICAgewotCQkgICAgICBzaXplX3QgbmFtZWxlbjsKLQkJICAgICAgc3RydWN0IG9ybCAqbmV3X21hcDsKLQotCQkgICAgICAvKiBUaGlzIHN5bWJvbCB3aWxsIGdvIGludG8gdGhlIGFyY2hpdmUgaGVhZGVyICovCi0JCSAgICAgIGlmIChvcmxfY291bnQgPT0gb3JsX21heCkKLQkJCXsKLQkJCSAgb3JsX21heCAqPSAyOwotCQkJICBuZXdfbWFwID0KLQkJCSAgICAoKHN0cnVjdCBvcmwgKikKLQkJCSAgICAgYmZkX3JlYWxsb2MgKG1hcCwgb3JsX21heCAqIHNpemVvZiAoc3RydWN0IG9ybCkpKTsKLQkJCSAgaWYgKG5ld19tYXAgPT0gKHN0cnVjdCBvcmwgKikgTlVMTCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBtYXAgPSBuZXdfbWFwOwotCQkJfQotCi0JCSAgICAgIG5hbWVsZW4gPSBzdHJsZW4gKHN5bXNbc3JjX2NvdW50XS0+bmFtZSk7Ci0JCSAgICAgIG1hcFtvcmxfY291bnRdLm5hbWUgPSAoKGNoYXIgKiopCi0JCQkJCSAgICAgYmZkX2FsbG9jIChhcmNoLAotCQkJCQkJCXNpemVvZiAoY2hhciAqKSkpOwotCQkgICAgICBpZiAobWFwW29ybF9jb3VudF0ubmFtZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgICoobWFwW29ybF9jb3VudF0ubmFtZSkgPSBiZmRfYWxsb2MgKGFyY2gsIG5hbWVsZW4gKyAxKTsKLQkJICAgICAgaWYgKCoobWFwW29ybF9jb3VudF0ubmFtZSkgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBzdHJjcHkgKCoobWFwW29ybF9jb3VudF0ubmFtZSksIHN5bXNbc3JjX2NvdW50XS0+bmFtZSk7Ci0JCSAgICAgIChtYXBbb3JsX2NvdW50XSkucG9zID0gKGZpbGVfcHRyKSBjdXJyZW50OwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLm5hbWlkeCA9IHN0cmlkeDsKLQotCQkgICAgICBzdHJpZHggKz0gbmFtZWxlbiArIDE7Ci0JCSAgICAgICsrb3JsX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogTm93IGFzayB0aGUgQkZEIHRvIGZyZWUgdXAgYW55IGNhY2hlZCBpbmZvcm1hdGlvbiwgc28gd2UKLQkgICAgIGRvbid0IGZpbGwgYWxsIG9mIG1lbW9yeSB3aXRoIHN5bWJvbCB0YWJsZXMuICAqLwotCSAgaWYgKCEgYmZkX2ZyZWVfY2FjaGVkX2luZm8gKGN1cnJlbnQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIE9LLCBub3cgd2UgaGF2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBkYXRhLCBsZXQncyB3cml0ZSB0aGVtIG91dCAqLwotICByZXQgPSBCRkRfU0VORCAoYXJjaCwgd3JpdGVfYXJtYXAsCi0JCSAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpKTsKLQotICBpZiAoc3ltc19tYXggPiAwKQotICAgIGZyZWUgKHN5bXMpOwotICBpZiAobWFwICE9IE5VTEwpCi0gICAgZnJlZSAobWFwKTsKLSAgaWYgKGZpcnN0X25hbWUgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYXJjaCwgZmlyc3RfbmFtZSk7Ci0KLSAgcmV0dXJuIHJldDsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotYnNkX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIGludCBwYWRpdCA9IHN0cmlkeCAmIDE7Ci0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gb3JsX2NvdW50ICogQlNEX1NZTURFRl9TSVpFOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeCArIHBhZGl0OwotICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgcmFubGlic2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCi0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gcmFubGlic2l6ZSArIHN0cmluZ3NpemUgKyA4OwotICBmaWxlX3B0ciBmaXJzdHJlYWw7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgYmZkICpsYXN0X2VsdCA9IGN1cnJlbnQ7CS8qIGxhc3QgZWxlbWVudCBhcmNoIHNlZW4gKi8KLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZmlyc3RyZWFsID0gbWFwc2l6ZSArIGVsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgU0FSTUFHOwotCi0gIHN0YXQgKGFyY2gtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsIFJBTkxJQk1BRyk7Ci0gIC8qIFJlbWVtYmVyIHRoZSB0aW1lc3RhbXAsIHRvIGtlZXAgaXQgaG9seS4gIEJ1dCBmdWRnZSBpdCBhIGxpdHRsZS4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXAgPSBzdGF0YnVmLnN0X210aW1lICsgQVJNQVBfVElNRV9PRkZTRVQ7Ci0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zID0gKFNBUk1BRwotCQkJCSAgICAgICsgb2Zmc2V0b2YgKHN0cnVjdCBhcl9oZHIsIGFyX2RhdGVbMF0pKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3VpZCwgIiVsZCIsIChsb25nKSBnZXR1aWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfZ2lkLCAiJWxkIiwgKGxvbmcpIGdldGdpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9oX3B1dF8zMiAoYXJjaCwgKGJmZF92bWEpIHJhbmxpYnNpemUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCAxLCBzaXplb2YgKHRlbXApLCBhcmNoKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvcmxfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmW0JTRF9TWU1ERUZfU0laRV07Ci0KLSAgICAgIGlmICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSAhPSBsYXN0X2VsdCkKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgZmlyc3RyZWFsICs9IGFyZWx0X3NpemUgKGN1cnJlbnQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQkgICAgICBmaXJzdHJlYWwgKz0gZmlyc3RyZWFsICUgMjsKLQkgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLQkgICAgfQotCSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKTsKLQl9CQkJLyogaWYgbmV3IGFyY2hpdmUgZWxlbWVudCAqLwotCi0gICAgICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFyY2gsIG1hcFtjb3VudF0ubmFtaWR4LCBidWYpOwotICAgICAgYmZkX2hfcHV0XzMyIChhcmNoLCBmaXJzdHJlYWwsIGJ1ZiArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCBCU0RfU1lNREVGX1NJWkUsIDEsIGFyY2gpICE9IEJTRF9TWU1ERUZfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGJmZF9oX3B1dF8zMiAoYXJjaCwgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDEsIHNpemVvZiAodGVtcCksIGFyY2gpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvcmxfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIHN1bidzIGFyIHdlIHVzZSBhIG51bGwuICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBdCB0aGUgZW5kIG9mIGFyY2hpdmUgZmlsZSBoYW5kbGluZywgdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlCi0gICBmaWxlLCBzbyB0aGUgbGlua2VyIHdpbGwgYWNjZXB0IGl0LgotCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGltZXN0YW1wIHdhcyBPSywgb3IgYW4gdW51c3VhbCBwcm9ibGVtIGhhcHBlbmVkLgotICAgUmV0dXJuIGZhbHNlIGlmIHdlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBzdHJ1Y3Qgc3RhdCBhcmNoc3RhdDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEZsdXNoIHdyaXRlcywgZ2V0IGxhc3Qtd3JpdGUgdGltZXN0YW1wIGZyb20gZmlsZSwgYW5kIGNvbXBhcmUgaXQKLSAgICAgdG8gdGhlIHRpbWVzdGFtcCBJTiB0aGUgZmlsZS4gICovCi0gIGJmZF9mbHVzaCAoYXJjaCk7Ci0gIGlmIChiZmRfc3RhdCAoYXJjaCwgJmFyY2hzdGF0KSA9PSAtMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKF8oIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCS8qIENhbid0IHJlYWQgbW9kIHRpbWUgZm9yIHNvbWUgcmVhc29uICovCi0gICAgfQotICBpZiAoYXJjaHN0YXQuc3RfbXRpbWUgPD0gYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCkKLSAgICByZXR1cm4gdHJ1ZTsJCS8qIE9LIGJ5IHRoZSBsaW5rZXIncyBydWxlcyAqLwotCi0gIC8qIFVwZGF0ZSB0aGUgdGltZXN0YW1wLiAgKi8KLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCA9IGFyY2hzdGF0LnN0X210aW1lICsgQVJNQVBfVElNRV9PRkZTRVQ7Ci0KLSAgLyogUHJlcGFyZSBhbiBBU0NJSSB2ZXJzaW9uIHN1aXRhYmxlIGZvciB3cml0aW5nLiAgKi8KLSAgbWVtc2V0IChoZHIuYXJfZGF0ZSwgMCwgc2l6ZW9mIChoZHIuYXJfZGF0ZSkpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChoZHIuYXJfZGF0ZSk7IGkrKykKLSAgICBpZiAoaGRyLmFyX2RhdGVbaV0gPT0gJ1wwJykKLSAgICAgIChoZHIuYXJfZGF0ZSlbaV0gPSAnICc7Ci0KLSAgLyogV3JpdGUgaXQgaW50byB0aGUgZmlsZS4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zID0gKFNBUk1BRwotCQkJCSAgICAgICsgb2Zmc2V0b2YgKHN0cnVjdCBhcl9oZHIsIGFyX2RhdGVbMF0pKTsKLSAgaWYgKGJmZF9zZWVrIChhcmNoLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKGhkci5hcl9kYXRlLCBzaXplb2YgKGhkci5hcl9kYXRlKSwgMSwgYXJjaCkKLQkgICE9IHNpemVvZiAoaGRyLmFyX2RhdGUpKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogYmZkIGNhbid0IGNhbGwgcGVycm9yLiAgKi8KLSAgICAgIHBlcnJvciAoXygiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIpKTsKLSAgICAgIHJldHVybiB0cnVlOwkJLyogU29tZSBlcnJvciB3aGlsZSB3cml0aW5nICovCi0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJCQkvKiBXZSB1cGRhdGVkIHRoZSB0aW1lc3RhbXAgc3VjY2Vzc2Z1bGx5LiAgKi8KLX0KLQwKLS8qIEEgY29mZiBhcm1hcCBsb29rcyBsaWtlIDoKLSAgIGxBUk1BRwotICAgc3RydWN0IGFyX2hkciB3aXRoIG5hbWUgPSAnLycKLSAgIG51bWJlciBvZiBzeW1ib2xzCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIDAKLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgMQotCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIG4tMQotICAgc3ltYm9sIG5hbWUgMAotICAgc3ltYm9sIG5hbWUgMQotCi0gICBzeW1ib2wgbmFtZSBuLTEKLSovCi0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgc3ltYm9sX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHJhbmxpYiBpcyB0aGUgbnVtYmVyIG9mIGV4cG9ydGVkIHN5bWJvbHMgaW4gdGhlCi0gICAgIGFyY2hpdmUgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgaW50LCArIGFuIGludCBmb3IgdGhlIGNvdW50ICovCi0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gKHN5bWJvbF9jb3VudCAqIDQpICsgNDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHg7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gc3RyaW5nc2l6ZSArIHJhbmxpYnNpemU7Ci0gIGZpbGVfcHRyIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgcGFkaXQgPSBtYXBzaXplICYgMTsKLQotICBpZiAocGFkaXQpCi0gICAgbWFwc2l6ZSsrOwotCi0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBmaXJzdCBvYmplY3QgZmlsZSB3aWxsIGdvIGluIHRoZSBhcmNoaXZlICovCi0gIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyID0gKG1hcHNpemUKLQkJCSAgICAgKyBlbGVuZ3RoCi0JCQkgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJICAgICArIFNBUk1BRyk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBoZHIuYXJfbmFtZVswXSA9ICcvJzsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIChsb25nKSB0aW1lIChOVUxMKSk7Ci0gIC8qIFRoaXMsIGF0IGxlYXN0LCBpcyB3aGF0IEludGVsIGNvZmYgc2V0cyB0aGUgdmFsdWVzIHRvLjogKi8KLSAgc3ByaW50ZiAoKGhkci5hcl91aWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9naWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9tb2RlKSwgIiUtN28iLCAodW5zaWduZWQpIDApOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBXcml0ZSB0aGUgYXIgaGVhZGVyIGZvciB0aGlzIGl0ZW0gYW5kIHRoZSBudW1iZXIgb2Ygc3ltYm9scyAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYXJjaCwgc3ltYm9sX2NvdW50KTsKLQotICAvKiBUd28gcGFzc2VzLCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBvZmZzZXRzIGZvciBlYWNoIHN5bWJvbCAtCi0gICAgIHJlbWVtYmVyaW5nIHRoYXQgZWFjaCBvZmZzZXQgaXMgb24gYSB0d28gYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGVhY2gKLSAgICAgc3ltYm9sLCBhbmQgcmVtZW1iZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyBwYWRkZWQgb3V0LiAgKi8KLQotICBjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICBjb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgTlVMTCAmJiBjb3VudCA8IHN5bWJvbF9jb3VudCkKLSAgICB7Ci0gICAgICAvKiBGb3IgZWFjaCBzeW1ib2wgd2hpY2ggaXMgdXNlZCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCB3cml0ZSBvdXQKLQkgdGhlIG9iamVjdCBmaWxlJ3MgYWRkcmVzcyBpbiB0aGUgYXJjaGl2ZSAqLwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgPT0gY3VycmVudCkKLQl7Ci0JICBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYXJjaCwgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIpOwotCSAgY291bnQrKzsKLQl9Ci0gICAgICAvKiBBZGQgc2l6ZSBvZiB0aGlzIGFyY2hpdmUgZW50cnkgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IChhcmVsdF9zaXplIChjdXJyZW50KQotCQkJCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIC8qIHJlbWVtYmVyIGFib291dCB0aGUgZXZlbiBhbGlnbm1lbnQgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICUgMjsKLSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzeW1ib2xfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIGFyYzk2MCB3ZSB1c2UgYSBudWxsLiAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hcmNodXJlcy5jIGIvYmZkL2FyY2h1cmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmYyYjEuLjAwMDAwMDAKLS0tIGEvYmZkL2FyY2h1cmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTUgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgYXJjaGl0ZWN0dXJlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBKb2huIEdpbG1vcmUgYW5kIFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKgotCi1TRUNUSU9OCi0JQXJjaGl0ZWN0dXJlcwotCi0JQkZEIGtlZXBzIG9uZSBhdG9tIGluIGEgQkZEIGRlc2NyaWJpbmcgdGhlCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhIGF0dGFjaGVkIHRvIHRoZSBCRkQ6IGEgcG9pbnRlciB0byBhCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+Pi4gIAotCi0JUG9pbnRlcnMgdG8gc3RydWN0dXJlcyBjYW4gYmUgcmVxdWVzdGVkIGluZGVwZW5kZW50bHkgb2YgYSBCRkQKLQlzbyB0aGF0IGFuIGFyY2hpdGVjdHVyZSdzIGluZm9ybWF0aW9uIGNhbiBiZSBpbnRlcnJvZ2F0ZWQKLQl3aXRob3V0IGFjY2VzcyB0byBhbiBvcGVuIEJGRC4KLQotCVRoZSBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgZWFjaCBhcmNoaXRlY3R1cmUgcGFja2FnZS4KLQlUaGUgc2V0IG9mIGRlZmF1bHQgYXJjaGl0ZWN0dXJlcyBpcyBzZWxlY3RlZCBieSB0aGUgbWFjcm8KLQk8PFNFTEVDVF9BUkNISVRFQ1RVUkVTPj4uICBUaGlzIGlzIG5vcm1hbGx5IHNldCB1cCBpbiB0aGUKLQlAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fSBmaWxlIG9mIHlvdXIgY2hvaWNlLiAgSWYgdGhlIG5hbWUgaXMgbm90Ci0JZGVmaW5lZCwgdGhlbiBhbGwgdGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBpbmNsdWRlZC4gCi0KLQlXaGVuIEJGRCBzdGFydHMgdXAsIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgY2FsbGVkIHdpdGggYW4KLQlpbml0aWFsaXplIG1ldGhvZC4gIEl0IGlzIHVwIHRvIHRoZSBhcmNoaXRlY3R1cmUgYmFjayBlbmQgdG8KLQlpbnNlcnQgYXMgbWFueSBpdGVtcyBpbnRvIHRoZSBsaXN0IG9mIGFyY2hpdGVjdHVyZXMgYXMgaXQgd2FudHMgdG87Ci0JZ2VuZXJhbGx5IHRoaXMgd291bGQgYmUgb25lIGZvciBlYWNoIG1hY2hpbmUgYW5kIG9uZSBmb3IgdGhlCi0JZGVmYXVsdCBjYXNlIChhbiBpdGVtIHdpdGggYSBtYWNoaW5lIGZpZWxkIG9mIDApLiAKLQotCUJGRCdzIGlkZWEgb2YgYW4gYXJjaGl0ZWN0dXJlIGlzIGltcGxlbWVudGVkIGluCUBmaWxle2FyY2h1cmVzLmN9LgotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoaXRlY3R1cmUKLQotREVTQ1JJUFRJT04KLQlUaGlzIGVudW0gZ2l2ZXMgdGhlIG9iamVjdCBmaWxlJ3MgQ1BVIGFyY2hpdGVjdHVyZSwgaW4gYQotCWdsb2JhbCBzZW5zZS0tLWkuZS4sIHdoYXQgcHJvY2Vzc29yIGZhbWlseSBkb2VzIGl0IGJlbG9uZyB0bz8KLQlBbm90aGVyIGZpZWxkIGluZGljYXRlcyB3aGljaCBwcm9jZXNzb3Igd2l0aGluCi0JdGhlIGZhbWlseSBpcyBpbiB1c2UuICBUaGUgbWFjaGluZSBnaXZlcyBhIG51bWJlciB3aGljaAotCWRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBhcmNoaXRlY3R1cmUsCi0JY29udGFpbmluZywgZm9yIGV4YW1wbGUsIDIgYW5kIDMgZm9yIEludGVsIGk5NjAgS0EgYW5kIGk5NjAgS0IsCi0JYW5kIDY4MDIwIGFuZCA2ODAzMCBmb3IgTW90b3JvbGEgNjgwMjAgYW5kIDY4MDMwLiAKLQotLmVudW0gYmZkX2FyY2hpdGVjdHVyZSAKLS57Ci0uICBiZmRfYXJjaF91bmtub3duLCAgIHsqIEZpbGUgYXJjaCBub3Qga25vd24gKn0KLS4gIGJmZF9hcmNoX29ic2N1cmUsICAgeyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqfQotLiAgYmZkX2FyY2hfbTY4aywgICAgICB7KiBNb3Rvcm9sYSA2OHh4eCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDAwIDEKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAwOCAyCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDIwIDQKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAzMCA1Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDYwIDcKLS4jZGVmaW5lIGJmZF9tYWNoX2NwdTMyICA4Ci0uICBiZmRfYXJjaF92YXgsICAgICAgIHsqIERFQyBWYXggKn0gICAKLS4gIGJmZF9hcmNoX2k5NjAsICAgICAgeyogSW50ZWwgOTYwICp9Ci0uICAgIHsqIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGlzIGltcG9ydGFudC4KLS4gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotLiAgICAgICBvbmx5IGFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIGluc3RydWN0aW9ucwotLiAgICAgICBhdmFpbGFibGUgdG8gbWFjaGluZXMgd2l0aCBoaWdoZXIgbnVtYmVycy4KLS4gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLS4gICAgICAgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVyIG1hY2hpbmVzIGV4Y2VwdCAKLS4gICAgICAgImNvcmUiLiAqfQotLgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jb3JlICAgICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYV9zYSAgICAgMgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9tYyAgICAgICAgNAotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF94YSAgICAgICAgNQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9qeAkgNwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9oeCAgICAgICAgOAotLgotLiAgYmZkX2FyY2hfYTI5aywgICAgICB7KiBBTUQgMjkwMDAgKn0KLS4gIGJmZF9hcmNoX3NwYXJjLCAgICAgeyogU1BBUkMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjCQkJMQotLnsqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdjhwbHVzIGFuZCB2OSBpcyB0aGF0IHY5IGlzIGEgdHJ1ZSA2NCBiaXQgZW52LiAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0CTIKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQkzCi0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXMJCTQKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EJCTUgeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCTYKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5CQk3Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OWEJCTggeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLnsqIE5vbnplcm8gaWYgTUFDSCBoYXMgdGhlIHY5IGluc3RydWN0aW9uIHNldC4gICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OV9wKG1hY2gpIFwKLS4gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0uICBiZmRfYXJjaF9taXBzLCAgICAgIHsqIE1JUFMgUnh4eHggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMzMDAwCQkzMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMzkwMAkJMzkwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAJCTQwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MDEwCQk0MDEwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDEwMAkJNDEwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEJCTQxMTEKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MzAwCQk0MzAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDQwMAkJNDQwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAJCTQ2MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NjUwCQk0NjUwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNTAwMAkJNTAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAJCTYwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM4MDAwCQk4MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTAwMDAJCTEwMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTYJCTE2Ci0uICBiZmRfYXJjaF9pMzg2LCAgICAgIHsqIEludGVsIDM4NiAqfQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTgwODYgMQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCAyCi0uICBiZmRfYXJjaF93ZTMyaywgICAgIHsqIEFUJlQgV0UzMnh4eCAqfQotLiAgYmZkX2FyY2hfdGFob2UsICAgICB7KiBDQ0kvSGFycmlzIFRhaG9lICp9Ci0uICBiZmRfYXJjaF9pODYwLCAgICAgIHsqIEludGVsIDg2MCAqfQotLiAgYmZkX2FyY2hfaTM3MCwgICAgICB7KiBJQk0gMzYwLzM3MCBNYWluZnJhbWVzICp9Ci0uICBiZmRfYXJjaF9yb21wLCAgICAgIHsqIElCTSBST01QIFBDL1JUICp9Ci0uICBiZmRfYXJjaF9hbGxpYW50LCAgIHsqIEFsbGlhbnQgKn0KLS4gIGJmZF9hcmNoX2NvbnZleCwgICAgeyogQ29udmV4ICp9Ci0uICBiZmRfYXJjaF9tODhrLCAgICAgIHsqIE1vdG9yb2xhIDg4eHh4ICp9Ci0uICBiZmRfYXJjaF9weXJhbWlkLCAgIHsqIFB5cmFtaWQgVGVjaG5vbG9neSAqfQotLiAgYmZkX2FyY2hfaDgzMDAsICAgICB7KiBIaXRhY2hpIEg4LzMwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwcyAgMwotLiAgYmZkX2FyY2hfcG93ZXJwYywgICB7KiBQb3dlclBDICp9Ci0uICBiZmRfYXJjaF9yczYwMDAsICAgIHsqIElCTSBSUy82MDAwICp9Ci0uICBiZmRfYXJjaF9ocHBhLCAgICAgIHsqIEhQIFBBIFJJU0MgKn0KLS4gIGJmZF9hcmNoX2QxMHYsICAgICAgeyogTWl0c3ViaXNoaSBEMTBWICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9kMTB2CQkwCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMgkyCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMwkzCi0uICBiZmRfYXJjaF9kMzB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDMwViAqfQotLiAgYmZkX2FyY2hfejhrLCAgICAgICB7KiBaaWxvZyBaODAwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfejgwMDEJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAyCQkyCi0uICBiZmRfYXJjaF9oODUwMCwgICAgIHsqIEhpdGFjaGkgSDgvNTAwICp9Ci0uICBiZmRfYXJjaF9zaCwgICAgICAgIHsqIEhpdGFjaGkgU0ggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotLiNkZWZpbmUgYmZkX21hY2hfc2gyICAgICAgICAweDIwCi0uI2RlZmluZSBiZmRfbWFjaF9zaF9kc3AgICAgIDB4MmQKLS4jZGVmaW5lIGJmZF9tYWNoX3NoMyAgICAgICAgMHgzMAotLiNkZWZpbmUgYmZkX21hY2hfc2gzX2RzcCAgICAweDNkCi0uI2RlZmluZSBiZmRfbWFjaF9zaDNlICAgICAgIDB4M2UKLS4jZGVmaW5lIGJmZF9tYWNoX3NoNCAgICAgICAgMHg0MAotLiAgYmZkX2FyY2hfYWxwaGEsICAgICB7KiBEZWMgQWxwaGEgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NCAgMHgxMAotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY1ICAweDIwCi0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLS4gIGJmZF9hcmNoX2FybSwgICAgICAgeyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8yCQkxCi0uI2RlZmluZSBiZmRfbWFjaF9hcm1fMmEJMgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zTSAJNAotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzQgCTUKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV80VCAJNgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzUgCTcKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV81VAk4Ci0uICBiZmRfYXJjaF9uczMyaywgICAgIHsqIE5hdGlvbmFsIFNlbWljb25kdWN0b3JzIG5zMzIwMDAgKn0KLS4gIGJmZF9hcmNoX3c2NSwgICAgICAgeyogV0RDIDY1ODE2ICp9Ci0uICBiZmRfYXJjaF90aWMzMCwgICAgIHsqIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCAqfQotLiAgYmZkX2FyY2hfdGljNTR4LCAgICB7KiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDNTRYICp9Ci0uICBiZmRfYXJjaF90aWM4MCwgICAgIHsqIFRJIFRNUzMyMGM4MCAoTVZQKSAqfQotLiAgYmZkX2FyY2hfdjg1MCwgICAgICB7KiBORUMgVjg1MCAqfQotLiNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZSAJJ0UnCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZWEJJ0EnCi0uICBiZmRfYXJjaF9hcmMsICAgICAgIHsqIEFyZ29uYXV0IFJJU0MgQ29yZSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotLiAgYmZkX2FyY2hfbTMyciwgICAgICB7KiBNaXRzdWJpc2hpIE0zMlIvRCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTMycgkJMCB7KiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTMycngJCSd4JwotLiAgYmZkX2FyY2hfbW4xMDIwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAyMDAgKn0KLS4gIGJmZF9hcmNoX21uMTAzMDAsICAgeyogTWF0c3VzaGl0YSBNTjEwMzAwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwCQkzMDAKLS4jZGVmaW5lIGJmZF9tYWNoX2FtMzMJCTMzMAotLiAgYmZkX2FyY2hfZnIzMCwKLS4jZGVmaW5lIGJmZF9tYWNoX2ZyMzAJCTB4NDY1MjMzMzAKLS4gIGJmZF9hcmNoX21jb3JlLAotLiAgYmZkX2FyY2hfaWE2NCwgICAgICB7KiBIUC9JbnRlbCBpYTY0ICp9Ci0uICBiZmRfYXJjaF9waiwKLS4gIGJmZF9hcmNoX2F2ciwgICAgICAgeyogQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcnMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjEJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjIJCTIKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjQJCTQKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzNzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcGpfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzU0eF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljODBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3ZheF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3c2NV9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2F2cl9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaWE2NF9hcmNoOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgYmZkX2FyY2h1cmVzX2xpc3RbXSA9Ci17Ci0jaWZkZWYgU0VMRUNUX0FSQ0hJVEVDVFVSRVMKLSAgU0VMRUNUX0FSQ0hJVEVDVFVSRVMsCi0jZWxzZQotICAmYmZkX2EyOWtfYXJjaCwKLSAgJmJmZF9hbHBoYV9hcmNoLAotICAmYmZkX2FyY19hcmNoLAotICAmYmZkX2FybV9hcmNoLAotICAmYmZkX2QxMHZfYXJjaCwKLSAgJmJmZF9kMzB2X2FyY2gsCi0gICZiZmRfaDgzMDBfYXJjaCwKLSAgJmJmZF9oODUwMF9hcmNoLAotICAmYmZkX2hwcGFfYXJjaCwKLSAgJmJmZF9pMzcwX2FyY2gsCi0gICZiZmRfaTM4Nl9hcmNoLAotICAmYmZkX2k4NjBfYXJjaCwKLSAgJmJmZF9pOTYwX2FyY2gsCi0gICZiZmRfbTMycl9hcmNoLAotICAmYmZkX202OGtfYXJjaCwKLSAgJmJmZF9tODhrX2FyY2gsCi0gICZiZmRfbWlwc19hcmNoLAotICAmYmZkX21uMTAyMDBfYXJjaCwKLSAgJmJmZF9tbjEwMzAwX2FyY2gsCi0gICZiZmRfcG93ZXJwY19hcmNoLAotICAmYmZkX3JzNjAwMF9hcmNoLAotICAmYmZkX3NoX2FyY2gsCi0gICZiZmRfc3BhcmNfYXJjaCwKLSAgJmJmZF90aWMzMF9hcmNoLAotICAmYmZkX3RpYzU0eF9hcmNoLAotICAmYmZkX3RpYzgwX2FyY2gsCi0gICZiZmRfdmF4X2FyY2gsCi0gICZiZmRfd2UzMmtfYXJjaCwKLSAgJmJmZF96OGtfYXJjaCwKLSAgJmJmZF9uczMya19hcmNoLAotICAmYmZkX3c2NV9hcmNoLAotICAmYmZkX3Y4NTBfYXJjaCwKLSAgJmJmZF9mcjMwX2FyY2gsCi0gICZiZmRfbWNvcmVfYXJjaCwKLSAgJmJmZF9hdnJfYXJjaCwKLSAgJmJmZF9pYTY0X2FyY2gsCi0jZW5kaWYKLSAgMAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3ByaW50YWJsZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9uYW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWZyb20gdGhlIHBvaW50ZXIgdG8gdGhlIGFyY2hpdGVjdHVyZSBpbmZvIHN0cnVjdHVyZS4KLQotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+cHJpbnRhYmxlX25hbWU7Ci19Ci0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl9hcmNoCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfc2Nhbl9hcmNoKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JRmlndXJlIG91dCBpZiBCRkQgc3VwcG9ydHMgYW55IGNwdSB3aGljaCBjb3VsZCBiZSBkZXNjcmliZWQgd2l0aAotCXRoZSBuYW1lIEB2YXJ7c3RyaW5nfS4gIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gPDxhcmNoX2luZm8+PgotCXN0cnVjdHVyZSBpZiBhIG1hY2hpbmUgaXMgZm91bmQsIG90aGVyd2lzZSBOVUxMLgotCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX3NjYW5fYXJjaCAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBpbnN0YWxsZWQgYXJjaGl0ZWN0dXJlcyAqLwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+c2NhbiAoYXAsIHN0cmluZykpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfbGlzdAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKipiZmRfYXJjaF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkIHZlY3RvciBvZiB0aGUgbmFtZXMKLQlvZiBhbGwgdGhlIHZhbGlkIEJGRCBhcmNoaXRlY3R1cmVzLiAgRG8gbm90IG1vZGlmeSB0aGUgbmFtZXMuCi0KLSovCi0KLWNvbnN0IGNoYXIgKioKLWJmZF9hcmNoX2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGggPSAwOwotICBjb25zdCBjaGFyICoqbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipuYW1lX2xpc3Q7Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHA7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXJjaGl0ZWN0dXJlcyAqLwotICB2ZWNfbGVuZ3RoID0gMDsKLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOwotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgdmVjX2xlbmd0aCsrOwotCX0KLSAgICB9Ci0KLSAgbmFtZV9saXN0ID0gKENPTlNUIGNoYXIgKiopCi0gICAgYmZkX21hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotICBpZiAobmFtZV9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogUG9pbnQgdGhlIGxpc3QgYXQgZWFjaCBvZiB0aGUgbmFtZXMgKi8KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3Q7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgICpuYW1lX3B0ciA9IGFwLT5wcmludGFibGVfbmFtZTsKLQkgIG5hbWVfcHRyKys7Ci0JfQotICAgIH0KLSAgKm5hbWVfcHRyID0gTlVMTDsKLQotICByZXR1cm4gbmFtZV9saXN0OwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9hcmNoX2dldF9jb21wYXRpYmxlKAotCQljb25zdCBiZmQgKmFiZmQsCi0JICAgICAgICBjb25zdCBiZmQgKmJiZmQpOwotCi1ERVNDUklQVElPTgotCURldGVybWluZSB3aGV0aGVyIHR3byBCRkRzJwotCWFyY2hpdGVjdHVyZXMgYW5kIG1hY2hpbmUgdHlwZXMgYXJlIGNvbXBhdGlibGUuICBDYWxjdWxhdGVzCi0JdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgYmV0d2VlbiB0aGUgdHdvIGFyY2hpdGVjdHVyZXMKLQlhbmQgbWFjaGluZSB0eXBlcyBpbXBsaWVkIGJ5IHRoZSBCRkRzIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0bwotCWFuIDw8YXJjaF9pbmZvPj4gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbXBhdGlibGUgbWFjaGluZS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoYWJmZCwgYmJmZCkKLSAgICAgY29uc3QgYmZkICphYmZkOwotICAgICBjb25zdCBiZmQgKmJiZmQ7Ci17Ci0gIC8qIElmIGVpdGhlciBhcmNoaXRlY3R1cmUgaXMgdW5rbm93biwgdGhlbiBhbGwgd2UgY2FuIGRvIGlzIGFzc3VtZQotICAgICB0aGUgdXNlciBrbm93cyB3aGF0IGhlJ3MgZG9pbmcuICAqLwotICBpZiAoYWJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYmJmZC0+YXJjaF9pbmZvOwotICBpZiAoYmJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotCi0gIC8qIE90aGVyd2lzZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBoYXMgdG8gZGVjaWRlLiAgKi8KLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+Y29tcGF0aWJsZSAoYWJmZC0+YXJjaF9pbmZvLCBiYmZkLT5hcmNoX2luZm8pOwotfQotCi0KLS8qCi1JTlRFUk5BTF9ERUZJTklUSU9OCi0JYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QKLQotREVTQ1JJUFRJT04KLQlUaGUgPDxiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdD4+IGlzIGFuIGl0ZW0gb2YKLQk8PGJmZF9hcmNoX2luZm9fdHlwZT4+IHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIGEgZmFpcmx5Ci0JZ2VuZXJpYyBzdGF0ZS4gIEEgQkZEIHN0YXJ0cyBsaWZlIGJ5IHBvaW50aW5nIHRvIHRoaXMKLQlzdHJ1Y3R1cmUsIHVudGlsIHRoZSBjb3JyZWN0IGJhY2sgZW5kIGhhcyBkZXRlcm1pbmVkIHRoZSByZWFsCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBmaWxlLgotCi0uZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0ID0KLXsKLSAgICAzMiwzMiw4LGJmZF9hcmNoX3Vua25vd24sMCwidW5rbm93biIsInVua25vd24iLDIsdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sIAotICAgIDAsCi19OwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9hcmNoX2luZm8oYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBvZiBAdmFye2FiZmR9IHRvIEB2YXJ7YXJnfS4KLSovCi0KLXZvaWQKLWJmZF9zZXRfYXJjaF9pbmZvIChhYmZkLCBhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmc7Ci17Ci0gIGFiZmQtPmFyY2hfaW5mbyA9IGFyZzsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChiZmQgKmFiZmQsCi0JCWVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQl1bnNpZ25lZCBsb25nIG1hY2gpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIEB2YXJ7YWJmZH0KLQl0byBAdmFye2FyY2h9IGFuZCBAdmFye21hY2h9LiAgRmluZCB0aGUgY29ycmVjdAotCXBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSA8PGFyY2hfaW5mbz4+Ci0JcG9pbnRlci4gCi0qLwotCi1ib29sZWFuCi1iZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2gKLQkJICB8fCAobWFjaCA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICB7Ci0JICAgICAgYWJmZC0+YXJjaF9pbmZvID0gYXA7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2gKLQotU1lOT1BTSVMKLQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYmZkX2dldF9hcmNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBlbnVtZXJhdGVkIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlLgotCi0qLwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUKLWJmZF9nZXRfYXJjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmFyY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbWFjaAotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGxvbmcgYmZkX2dldF9tYWNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBsb25nIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JbWFjaGluZS4KLSovCi0KLXVuc2lnbmVkIGxvbmcgIAotYmZkX2dldF9tYWNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gICAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+bWFjaDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfYml0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBvbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9J3MKLQlhcmNoaXRlY3R1cmUncyBieXRlcy4KLQotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2J5dGU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYWRkcmVzc2VzLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2FkZHJlc3M7Ci19Ci0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OIAotCWJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQkoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphLAotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYik7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgZm9yIGNvbXBhdGliaWxpdHkuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYS0+bWFjaCA+IGItPm1hY2gpCi0gICAgcmV0dXJuIGE7Ci0KLSAgaWYgKGItPm1hY2ggPiBhLT5tYWNoKQotICAgIHJldHVybiBiOwotCi0gIHJldHVybiBhOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NjYW4KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NjYW4oY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHdvcmtpbmcgb3V0IHdoZXRoZXIgdGhpcyBpcyBhbgotCWFyY2hpdGVjdHVyZSBoaXQgYW5kIGEgbWFjaGluZSBoaXQuCi0qLwotCi1ib29sZWFuIAotYmZkX2RlZmF1bHRfc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwdHJfc3JjOwotICBjb25zdCBjaGFyICpwdHJfdHN0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lX2NvbG9uOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgbmFtZSAoQVJDSF9OQU1FKSBhbmQgYWxzbyB0aGUKLSAgICAgZGVmYXVsdCBhcmNoaXRlY3R1cmU/ICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSkgPT0gMAotICAgICAgJiYgaW5mby0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRXhhY3QgbWF0Y2ggb2YgdGhlIG1hY2hpbmUgbmFtZSAoUFJJTlRBQkxFX05BTUUpPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAgCi0gIC8qIEdpdmVuIHRoYXQgcHJpbnRhYmxlX25hbWUgY29udGFpbnMgbm8gY29sb24sIGF0dGVtcHQgdG8gbWF0Y2g6Ci0gICAgIEFSQ0hfTkFNRSBbICI6IiBdIFBSSU5UQUJMRV9OQU1FPyAqLwotICBwcmludGFibGVfbmFtZV9jb2xvbiA9IHN0cmNociAoaW5mby0+cHJpbnRhYmxlX25hbWUsICc6Jyk7Ci0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBzdHJsZW5fYXJjaF9uYW1lID0gc3RybGVuIChpbmZvLT5hcmNoX25hbWUpOwotICAgICAgaWYgKHN0cm5jYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSwgc3RybGVuX2FyY2hfbmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc3RyaW5nW3N0cmxlbl9hcmNoX25hbWVdID09ICc6JykKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lICsgMSwKLQkJCSAgICAgIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZyArIHN0cmxlbl9hcmNoX25hbWUsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEdpdmVuIHRoYXQgUFJJTlRBQkxFX05BTUUgaGFzIHRoZSBmb3JtOiA8YXJjaD4gIjoiIDxtYWNoPjsKLSAgICAgQXR0ZW1wdCB0byBtYXRjaDogPGFyY2g+IDxtYWNoPj8gKi8KLSAgaWYgKHByaW50YWJsZV9uYW1lX2NvbG9uICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGNvbG9uX2luZGV4ID0gcHJpbnRhYmxlX25hbWVfY29sb24gLSBpbmZvLT5wcmludGFibGVfbmFtZTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSwgY29sb25faW5kZXgpID09IDAKLQkgICYmIHN0cmNhc2VjbXAgKHN0cmluZyArIGNvbG9uX2luZGV4LAotCQkJIGluZm8tPnByaW50YWJsZV9uYW1lICsgY29sb25faW5kZXggKyAxKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47IERvIG5vdAotICAgICBhdHRlbXB0IHRvIG1hdGNoIGp1c3QgPG1hY2g+LCBpdCBjb3VsZCBiZSBhbWJpZ2lvdXMuICBUaGlzIHRlc3QKLSAgICAgaXMgbGVmdCB1bnRpbCBsYXRlci4gKi8KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4gUGxlYXNlIGRvIG5vdAotICAgICBhZGQgdG8gdGhpcyBjb2RlICovCi0KLSAgLyogU2VlIGhvdyBtdWNoIG9mIHRoZSBzdXBwbGllZCBzdHJpbmcgbWF0Y2hlcyB3aXRoIHRoZQotICAgICBhcmNoaXRlY3R1cmUsIGVnIHRoZSBzdHJpbmcgbTY4azo2ODAyMCB3b3VsZCBtYXRjaCB0aGUgNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKnB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KLSAgICAgUExFQVNFIERPIE5PVCBBREQgVE8gVEhJUyBDT0RFLiAqLwotCi0gIHN3aXRjaCAobnVtYmVyKSAKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBwYXJzZSBJRUVFIG9iamVjdHMuICAqLwotICAgIGNhc2UgNjgwMDA6IAotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDIwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDMwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDQwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDYwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MzMyOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9jcHUzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA3NDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NoOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfc2hfZHNwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDc3MDg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc2g7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9zaDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNzcyOToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG51bWJlciA9IGJmZF9tYWNoX3NoM19kc3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNzc1MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG51bWJlciA9IGJmZF9tYWNoX3NoNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGJmZF9nZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3QgaW4gQHZhcnthYmZkfS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9sb29rdXBfYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2xvb2t1cF9hcmNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLQkJYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlMb29rIGZvciB0aGUgYXJjaGl0ZWN1cmUgaW5mbyBzdHJ1Y3R1cmUgd2hpY2ggbWF0Y2hlcyB0aGUKLQlhcmd1bWVudHMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gQSBtYWNoaW5lIG9mIDAgbWF0Y2hlcyB0aGUKLQltYWNoaW5lL2FyY2hpdGVjdHVyZSBzdHJ1Y3R1cmUgd2hpY2ggbWFya3MgaXRzZWxmIGFzIHRoZQotCWRlZmF1bHQuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSkKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOwotCi0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgaWYgKGFwLT5hcmNoID09IGFyY2gKLQkgICAgICAmJiAoYXAtPm1hY2ggPT0gbWFjaGluZQotCQkgIHx8IChtYWNoaW5lID09IDAgJiYgYXAtPnRoZV9kZWZhdWx0KSkpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKLQkJKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kCi0JbWFjaGluZSB0eXBlLiAKLQotCVRoaXMgcm91dGluZSBpcyBkZXByZWNpYXRlZC4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpOwotCi0gICAgaWYgKGFwKQotICAgICAgcmV0dXJuIGFwLT5wcmludGFibGVfbmFtZTsKLSAgICByZXR1cm4gIlVOS05PV04hIjsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29jdGV0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfb2N0ZXRzX3Blcl9ieXRlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2N0ZXRzICg4LWJpdCBxdWFudGl0aWVzKSBwZXIgdGFyZ2V0IGJ5dGUKLSAgICAgICAgKG1pbmltdW0gYWRkcmVzc2FibGUgdW5pdCkuICBJbiBtb3N0IGNhc2VzLCB0aGlzIHdpbGwgYmUgb25lLCBidXQgc29tZQotICAgICAgICBEU1AgdGFyZ2V0cyBoYXZlIDE2LCAzMiwgb3IgZXZlbiA0OCBiaXRzIHBlciBieXRlLgotCi0qLwotCi11bnNpZ25lZCBpbnQKLWJmZF9vY3RldHNfcGVyX2J5dGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gICAgcmV0dXJuIGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlIChiZmRfZ2V0X2FyY2ggKGFiZmQpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZShlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2VlIGJmZF9vY3RldHNfcGVyX2J5dGUuCi0gICAgICAgIAotICAgICAgICBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgZm9yIHRob3NlIGNhc2VzIHdoZXJlIGEgYmZkICogaXMgbm90Ci0gICAgICAgIGF2YWlsYWJsZQotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAoYXJjaCwgbWFjaCkKLSAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgIAotICAgIGlmIChhcCkKLSAgICAgIHJldHVybiBhcC0+Yml0c19wZXJfYnl0ZSAvIDg7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJtbmV0YnNkLmMgYi9iZmQvYXJtbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmVlNDcuLjAwMDAwMDAKLS0tIGEvYmZkL2FybW5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvQVJNIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAkJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICQliZmRfYXJjaF9hcm0KLSNkZWZpbmUJREVGQVVMVF9NSUQgCQlNX0FSTTZfTkVUQlNECi0vKiNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fQVJNNl9ORVRCU0QpKi8KLQotI2RlZmluZSBNWShPUCkgCQkJQ0FUIChhcm1uZXRic2RfLCBPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgCQkiYS5vdXQtYXJtLW5ldGJzZCIKLQotI2lmIDAKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoYW91dGFybSxfMzJfLHkpCi0KLSNkZWZpbmUgYW91dGFybV8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFvdXRhcm1fYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KLQotQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1NWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbi5oIGIvYmZkL2JmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE3MmJmLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBiZmQuaCBhbmQgYmZkLWluMi5oIGFyZSBHRU5FUkFURUQgZmlsZXMuICBEb24ndCBjaGFuZ2UgdGhlbTsKLSoqIGluc3RlYWQsIGNoYW5nZSBiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoZXNlIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIGJmZC5oIC0tIFRoZSBvbmx5IGhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHVzZXJzIG9mIHRoZSBiZmQgbGlicmFyeSAKLQotVGhlIGJmZC5oIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYmZkLWluLmggYW5kIHZhcmlvdXMgLmMgZmlsZXM7IGlmIHlvdQotY2hhbmdlIGl0LCB5b3VyIGNoYW5nZXMgd2lsbCBwcm9iYWJseSBiZSBsb3N0LgotCi1BbGwgdGhlIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvbGxvd2luZyB0aGUgY29tbWVudCAiVEhFIEZPTExPV0lORwotSVMgRVhUUkFDVEVEIEZST00gVEhFIFNPVVJDRSIgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgZm9yCi1CRkQuICBJZiB5b3UgY2hhbmdlIGl0LCBzb21lb25lIG9uZWRheSB3aWxsIGV4dHJhY3QgaXQgZnJvbSB0aGUgc291cmNlCi1hZ2FpbiwgYW5kIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGxvc3QuICBUbyBzYXZlIHlvdXJzZWxmIGZyb20gdGhpcyBiaW5kLAotY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc291cmNlIGluIHRoZSBiZmQgZGlyZWN0b3J5LiAgVHlwZSAibWFrZQotZG9jcyIgYW5kIHRoZW4gIm1ha2UgaGVhZGVycyIgaW4gdGhhdCBkaXJlY3RvcnksIGFuZCBtYWdpY2FsbHkgdGhpcyBmaWxlCi13aWxsIGNoYW5nZSB0byByZWZsZWN0IHlvdXIgY2hhbmdlcy4KLQotSWYgeW91IGRvbid0IGhhdmUgdGhlIHRvb2xzIHRvIHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24sIHRoZW4geW91IGFyZQotc2FmZSBmcm9tIHNvbWVvbmUgb24geW91ciBzeXN0ZW0gdHJhbXBsaW5nIG92ZXIgeW91ciBoZWFkZXIgZmlsZXMuCi1Zb3Ugc2hvdWxkIHN0aWxsIG1haW50YWluIHRoZSBlcXVpdmFsZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoaXMKLWZpbGUgdGhvdWdoOyBldmVyeSBjaGFuZ2UgeW91IG1ha2UgdG8gdGhlIC5jIGZpbGUgc2hvdWxkIGJlIHJlZmxlY3RlZAotaGVyZS4gICovCi0KLSNpZm5kZWYgX19CRkRfSF9TRUVOX18KLSNkZWZpbmUgX19CRkRfSF9TRUVOX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogVGhlc2UgdHdvIGxpbmVzIGdldCBzdWJzdGl0dXRpb25zIGRvbmUgYnkgY29tbWFuZHMgaW4gTWFrZWZpbGUuaW4uICAqLwotI2RlZmluZSBCRkRfVkVSU0lPTiAgIkBWRVJTSU9OQCIKLSNkZWZpbmUgQkZEX0FSQ0hfU0laRSBAd29yZHNpemVACi0jZGVmaW5lIEJGRF9IT1NUXzY0QklUX0xPTkcgQEJGRF9IT1NUXzY0QklUX0xPTkdACi0jaWYgQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotI2RlZmluZSBCRkRfSE9TVF82NF9CSVQgQEJGRF9IT1NUXzY0X0JJVEAKLSNkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgQEJGRF9IT1NUX1VfNjRfQklUQAotI2VuZGlmCi0KLSNpZiBCRkRfQVJDSF9TSVpFID49IDY0Ci0jZGVmaW5lIEJGRDY0Ci0jZW5kaWYKLQotI2lmbmRlZiBJTkxJTkUKLSNpZiBfX0dOVUNfXyA+PSAyCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9iZmQgYmZkOwotCi0vKiBUbyBzcXVlbGNoIGVycm9uZW91cyBjb21waWxlciB3YXJuaW5ncyAoImlsbGVnYWwgcG9pbnRlcgotICAgY29tYmluYXRpb24iKSBmcm9tIHRoZSBTVlIzIGNvbXBpbGVyLCB3ZSB3b3VsZCBsaWtlIHRvIHR5cGVkZWYKLSAgIGJvb2xlYW4gdG8gaW50IChpdCBkb2Vzbid0IGxpa2UgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBib29sZWFuLgotICAgTWFraW5nIHN1cmUgdGhleSBhcmUgbmV2ZXIgaW1wbGljaXRseSBkZWNsYXJlZCB0byByZXR1cm4gaW50Ci0gICBkb2Vzbid0IHNlZW0gdG8gaGVscCkuICBCdXQgdGhpcyBmaWxlIGlzIG5vdCBjb25maWd1cmVkIGJhc2VkIG9uCi0gICB0aGUgaG9zdC4gICovCi0vKiBHZW5lcmFsIHJ1bGVzOiBmdW5jdGlvbnMgd2hpY2ggYXJlIGJvb2xlYW4gcmV0dXJuIHRydWUgb24gc3VjY2VzcwotICAgYW5kIGZhbHNlIG9uIGZhaWx1cmUgKHVubGVzcyB0aGV5J3JlIGEgcHJlZGljYXRlKS4gICAtLSBiZmQuZG9jICovCi0vKiBJJ20gc3VyZSB0aGlzIGlzIGdvaW5nIHRvIGJyZWFrIHNvbWV0aGluZyBhbmQgc29tZW9uZSBpcyBnb2luZyB0bwotICAgZm9yY2UgbWUgdG8gY2hhbmdlIGl0LiAqLwotLyogdHlwZWRlZiBlbnVtIGJvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOyAqLwotLyogWXVwLCBTVlI0IGhhcyBhICJ0eXBlZGVmIGVudW0gYm9vbGVhbiIgaW4gPHN5cy90eXBlcy5oPiAgLWZuZiAqLwotLyogSXQgZ2V0cyB3b3JzZSBpZiB0aGUgaG9zdCBhbHNvIGRlZmluZXMgYSB0cnVlL2ZhbHNlIGVudW0uLi4gLXN0cyAqLwotLyogQW5kIGV2ZW4gd29yc2UgaWYgeW91ciBjb21waWxlciBoYXMgYnVpbHQtaW4gYm9vbGVhbiB0eXBlcy4uLiAtbGF3ICovCi0jaWYgZGVmaW5lZCAoX19HTlVHX18pICYmIChfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNikpCi0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYKLSNpZmRlZiBNUFcKLS8qIFByZS1lbXB0aXZlIHN0cmlrZSAtIGdldCB0aGUgZmlsZSB3aXRoIHRoZSBlbnVtLiAqLwotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYgLyogTVBXICovCi0jaWZuZGVmIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOwotI2RlZmluZSBCRkRfVFJVRV9GQUxTRQotI2Vsc2UKLS8qIFVzZSBlbnVtIG5hbWVzIHRoYXQgd2lsbCBhcHBlYXIgbm93aGVyZSBlbHNlLiAgKi8KLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7YmZkX2ZmZmFsc2UsIGJmZF90dHRydWV9IGJvb2xlYW47Ci0jZW5kaWYKLQotLyogQSBwb2ludGVyIHRvIGEgcG9zaXRpb24gaW4gYSBmaWxlLiAgKi8KLS8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgdXNpbmcgb2ZmX3QgZnJvbSA8c3lzL3R5cGVzLmg+LgotICAgRm9yIG5vdywgdHJ5IHRvIGF2b2lkIGJyZWFraW5nIHN0dWZmIGJ5IG5vdCBpbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBoZXJlLgotICAgVGhpcyB3aWxsIGJyZWFrIG9uIHN5c3RlbXMgd2l0aCA2NC1iaXQgZmlsZSBvZmZzZXRzIChlLmcuIDQuNEJTRCkuCi0gICBQcm9iYWJseSB0aGUgYmVzdCBsb25nLXRlcm0gYW5zd2VyIGlzIHRvIGF2b2lkIHVzaW5nIGZpbGVfcHRyIEFORCBvZmZfdCAKLSAgIGluIHRoaXMgaGVhZGVyIGZpbGUsIGFuZCB0byBoYW5kbGUgdGhpcyBpbiB0aGUgQkZEIGltcGxlbWVudGF0aW9uCi0gICByYXRoZXIgdGhhbiBpbiBpdHMgaW50ZXJmYWNlLiAgKi8KLS8qIHR5cGVkZWYgb2ZmX3QJZmlsZV9wdHI7ICovCi10eXBlZGVmIGxvbmcgaW50IGZpbGVfcHRyOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgc2l6ZXMgb2YgdGFyZ2V0IGZvcm1hdCBpbnRzIGFuZCBhZGRyZXNzZXMuCi0gICBJZiB0aGUgdHlwZSBgbG9uZycgaXMgYXQgbGVhc3QgNjQgYml0cywgQkZEX0hPU1RfNjRCSVRfTE9ORyB3aWxsIGJlCi0gICBzZXQgdG8gMSBhYm92ZS4gIE90aGVyd2lzZSwgaWYgZ2NjIGlzIGJlaW5nIHVzZWQsIHRoaXMgY29kZSB3aWxsCi0gICB1c2UgZ2NjJ3MgImxvbmcgbG9uZyIgdHlwZS4gIE90aGVyd2lzZSwgQkZEX0hPU1RfNjRfQklUIG11c3QgYmUKLSAgIGRlZmluZWQgYWJvdmUuICAqLwotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotIyBpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcKLSMgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nCi0jIGVsc2UKLSMgIGlmZGVmIF9fR05VQ19fCi0jICAgaWYgX19HTlVDX18gPj0gMgotIyAgICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZyBsb25nCi0jICAgZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgZW5kaWYgLyogISBCRkRfSE9TVF82NEJJVF9MT05HICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLSNpZmRlZiBCRkQ2NAotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotICNlcnJvciBObyA2NCBiaXQgaW50ZWdlciB0eXBlIGF2YWlsYWJsZQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBiZmRfc2lnbmVkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3NpemVfdHlwZTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgc3ltdmFsdWU7Ci0KLSNpZm5kZWYgZnByaW50Zl92bWEKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpCi0jZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpCi0jZWxzZQotI2RlZmluZSBfYmZkX2ludDY0X2xvdyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKQotI2RlZmluZSBfYmZkX2ludDY0X2hpZ2goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkKLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBcCi0gIGZwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgXAotICBzcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogbm90IEJGRDY0ICAqLwotCi0vKiBSZXByZXNlbnQgYSB0YXJnZXQgYWRkcmVzcy4gIEFsc28gdXNlZCBhcyBhIGdlbmVyaWMgdW5zaWduZWQgdHlwZQotICAgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IGFyaXRobWV0aWMgdHlwZXMKLSAgIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfdm1hOwotCi0vKiBBIGdlbmVyaWMgc2lnbmVkIHR5cGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55Ci0gICBhcml0aG1ldGljIHR5cGVzIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgQ2FuIGJlIGFzc3VtZWQgdG8gYmUgY29tcGF0aWJsZQotICAgd2l0aCBiZmRfdm1hIGluIHRoZSBzYW1lIHdheSB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cyBhcmUgY29tcGF0aWJsZQotICAgKGFzIHBhcmFtZXRlcnMsIGluIGFzc2lnbm1lbnQsIGV0YykuICAqLwotdHlwZWRlZiBsb25nIGJmZF9zaWduZWRfdm1hOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltdmFsdWU7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3NpemVfdHlwZTsKLQotLyogUHJpbnQgYSBiZmRfdm1hIHggb24gc3RyZWFtIHMuICAqLwotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIGZwcmludGYocywgIiUwOGx4IiwgeCkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmKHMsICIlMDhseCIsIHgpCi0KLSNlbmRpZiAvKiBub3QgQkZENjQgICovCi0KLSNkZWZpbmUgcHJpbnRmX3ZtYSh4KSBmcHJpbnRmX3ZtYShzdGRvdXQseCkKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ3dvcmQ7CS8qIDMyIGJpdHMgb2YgZmxhZ3MgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBiZmRfYnl0ZTsKLQwKLS8qKiBGaWxlIGZvcm1hdHMgKi8KLQotdHlwZWRlZiBlbnVtIGJmZF9mb3JtYXQgewotCSAgICAgIGJmZF91bmtub3duID0gMCwJLyogZmlsZSBmb3JtYXQgaXMgdW5rbm93biAqLwotCSAgICAgIGJmZF9vYmplY3QsCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLQkgICAgICBiZmRfYXJjaGl2ZSwJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotCSAgICAgIGJmZF9jb3JlLAkJLyogY29yZSBkdW1wICovCi0JICAgICAgYmZkX3R5cGVfZW5kfQkvKiBtYXJrcyB0aGUgZW5kOyBkb24ndCB1c2UgaXQhICovCi0gICAgICAgICBiZmRfZm9ybWF0OwotCi0vKiBWYWx1ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIEJGRC4gIFRoZXNlIGFsc28KLSAgIGFwcGVhciBpbiB0aGUgb2JqZWN0X2ZsYWdzIGZpZWxkIG9mIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZSwgd2hlcmUKLSAgIHRoZXkgaW5kaWNhdGUgdGhlIHNldCBvZiBmbGFncyB1c2VkIGJ5IHRoYXQgYmFja2VuZCAobm90IGFsbCBmbGFncwotICAgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzKSAoRklYTUU6IGF0IHRoZSBtb21lbnQsCi0gICB0aGUgb2JqZWN0X2ZsYWdzIHZhbHVlcyBoYXZlIG1vc3RseSBqdXN0IGJlZW4gY29waWVkIGZyb20gYmFja2VuZAotICAgdG8gYW5vdGhlciwgYW5kIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ycmVjdCkuICAqLwotCi0vKiBObyBmbGFncy4gICovCi0jZGVmaW5lIEJGRF9OT19GTEFHUyAgIAkweDAwCi0KLS8qIEJGRCBjb250YWlucyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotI2RlZmluZSBIQVNfUkVMT0MgICAJMHgwMQotCi0vKiBCRkQgaXMgZGlyZWN0bHkgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEVYRUNfUCAgICAgIAkweDAyCi0KLS8qIEJGRCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKGJhc2ljYWxseSB1c2VkIGZvciBGX0xOTk8gaW4gYQotICAgQ09GRiBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xJTkVOTyAgCTB4MDQKLQotLyogQkZEIGhhcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBIQVNfREVCVUcgICAJMHgwOAotCi0vKiBCRkQgaGFzIHN5bWJvbHMuICAqLwotI2RlZmluZSBIQVNfU1lNUyAgICAJMHgxMAotCi0vKiBCRkQgaGFzIGxvY2FsIHN5bWJvbHMgKGJhc2ljYWxseSB1c2VkIGZvciBGX0xTWU1TIGluIGEgQ09GRgotICAgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MT0NBTFMgIAkweDIwCi0KLS8qIEJGRCBpcyBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRFlOQU1JQyAgICAgCTB4NDAKLQotLyogVGV4dCBzZWN0aW9uIGlzIHdyaXRlIHByb3RlY3RlZCAoaWYgRF9QQUdFRCBpcyBub3Qgc2V0LCB0aGlzIGlzCi0gICBsaWtlIGFuIGEub3V0IE5NQUdJQyBmaWxlKSAodGhlIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0Ci0gICBjbGVhcnMgaXQgZm9yIC1yIG9yIC1OKS4gICovCi0jZGVmaW5lIFdQX1RFWFQgICAgIAkweDgwCi0KLS8qIEJGRCBpcyBkeW5hbWljYWxseSBwYWdlZCAodGhpcyBpcyBsaWtlIGFuIGEub3V0IFpNQUdJQyBmaWxlKSAodGhlCi0gICBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dCBjbGVhcnMgaXQgZm9yIC1yIG9yIC1uIG9yIC1OKS4gICovCi0jZGVmaW5lIERfUEFHRUQgICAgIAkweDEwMAotCi0vKiBCRkQgaXMgcmVsYXhhYmxlICh0aGlzIG1lYW5zIHRoYXQgYmZkX3JlbGF4X3NlY3Rpb24gbWF5IGJlIGFibGUgdG8KLSAgIGRvIHNvbWV0aGluZykgKHNvbWV0aW1lcyBiZmRfcmVsYXhfc2VjdGlvbiBjYW4gZG8gc29tZXRoaW5nIGV2ZW4gaWYKLSAgIHRoaXMgaXMgbm90IHNldCkuICAqLwotI2RlZmluZSBCRkRfSVNfUkVMQVhBQkxFIDB4MjAwCi0KLS8qIFRoaXMgbWF5IGJlIHNldCBiZWZvcmUgd3JpdGluZyBvdXQgYSBCRkQgdG8gcmVxdWVzdCB1c2luZyBhCi0gICB0cmFkaXRpb25hbCBmb3JtYXQuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIHJlcXVlc3QgdGhhdCB3aGVuCi0gICB3cml0aW5nIG91dCBhbiBhLm91dCBvYmplY3QgdGhlIHN5bWJvbHMgbm90IGJlIGhhc2hlZCB0byBlbGltaW5hdGUKLSAgIGR1cGxpY2F0ZXMuICAqLwotI2RlZmluZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIDB4NDAwCi0KLS8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgQkZEIGNvbnRlbnRzIGFyZSBhY3R1YWxseSBjYWNoZWQgaW4KLSAgIG1lbW9yeS4gIElmIHRoaXMgaXMgc2V0LCBpb3N0cmVhbSBwb2ludHMgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCi0jZGVmaW5lIEJGRF9JTl9NRU1PUlkgMHg4MDAKLQwKLS8qIHN5bWJvbHMgYW5kIHJlbG9jYXRpb24gKi8KLQotLyogQSBjb3VudCBvZiBjYXJzeW1zIChjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzKS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltaW5kZXg7Ci0KLS8qIEhvdyB0byBwZXJmb3JtIGEgcmVsb2NhdGlvbi4gICovCi10eXBlZGVmIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZTsKLQotI2RlZmluZSBCRkRfTk9fTU9SRV9TWU1CT0xTICgoc3ltaW5kZXgpIH4wKQotCi0vKiBHZW5lcmFsIHB1cnBvc2UgcGFydCBvZiBhIHN5bWJvbCBYOwotICAgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIGFyZSBpbiBsaWJjb2ZmLmgsIGxpYmFvdXQuaCwgZXRjLiAgKi8KLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbikKLSNkZWZpbmUgYmZkX2dldF9vdXRwdXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uKHgseSkgKCh4KS0+c2VjdGlvbikgPSAoeSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmFzZSh4KSAoKHgpLT5zZWN0aW9uLT52bWEpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX3ZhbHVlKHgpIChiZmRfYXN5bWJvbF9iYXNlKHgpICsgKHgpLT52YWx1ZSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfbmFtZSh4KSAoKHgpLT5uYW1lKQotLypQZXJoYXBzIGZ1dHVyZTogI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+c2VjdGlvbi0+b3duZXIpKi8KLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnRoZV9iZmQpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2ZsYXZvdXIoeCkgKGJmZF9hc3ltYm9sX2JmZCh4KS0+eHZlYy0+Zmxhdm91cikKLQotLyogQSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICAqLwotLyogVGhpcyBpcyBhIHR5cGUgcHVuIHdpdGggc3RydWN0IHJhbmxpYiBvbiBwdXJwb3NlISAqLwotdHlwZWRlZiBzdHJ1Y3QgY2Fyc3ltIHsKLSAgY2hhciAqbmFtZTsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CQkvKiBsb29rIGhlcmUgdG8gZmluZCB0aGUgZmlsZSAqLwotfSBjYXJzeW07CQkJLyogdG8gbWFrZSB0aGVzZSB5b3UgY2FsbCBhIGNhcnN5bW9nZW4gKi8KLQotICAKLS8qIFVzZWQgaW4gZ2VuZXJhdGluZyBhcm1hcHMgKGFyY2hpdmUgdGFibGVzIG9mIGNvbnRlbnRzKS4KLSAgIFBlcmhhcHMganVzdCBhIGZvcndhcmQgZGVmaW5pdGlvbiB3b3VsZCBkbz8gKi8KLXN0cnVjdCBvcmwgewkJCS8qIG91dHB1dCByYW5saWIgKi8KLSAgY2hhciAqKm5hbWU7CQkJLyogc3ltYm9sIG5hbWUgKi8gCi0gIGZpbGVfcHRyIHBvczsJCQkvKiBiZmQqIG9yIGZpbGUgcG9zaXRpb24gKi8KLSAgaW50IG5hbWlkeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSAqLwotfTsKLQwKLQotLyogTGluZW51bWJlciBzdHVmZiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5IHsKLSAgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyOwkvKiBMaW5lbnVtYmVyIGZyb20gc3RhcnQgb2YgZnVuY3Rpb24qLyAgCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW07IC8qIEZ1bmN0aW9uIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogT2Zmc2V0IGludG8gc2VjdGlvbiAqLwotICB9IHU7Ci19IGFsZW50OwotDAotLyogb2JqZWN0IGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotI2RlZmluZQlhbGlnbl9wb3dlcihhZGRyLCBhbGlnbikJXAotCSggKChhZGRyKSArICgoMTw8KGFsaWduKSktMSkpICYgKC0xIDw8IChhbGlnbikpKQotCi10eXBlZGVmIHN0cnVjdCBzZWMgKnNlY19wdHI7Ci0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgKyAwKQotI2RlZmluZSBiZmRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3NpemUoYmZkLCBwdHIpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MocHRyKSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbG1hKGJmZCwgcHRyKSAoKHB0ciktPmxtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGJmZCwgcHRyKSAoKHB0ciktPmZsYWdzICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyKSAoKHB0ciktPnVzZXJkYXRhKQotCi0jZGVmaW5lIGJmZF9pc19jb21fc2VjdGlvbihwdHIpICgoKHB0ciktPmZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnZtYSA9IChwdHIpLT5sbWE9ICh2YWwpKSwgKChwdHIpLT51c2VyX3NldF92bWEgPSAoYm9vbGVhbil0cnVlKSwgdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgPSAodmFsKSksdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnVzZXJkYXRhID0gKHZhbCkpLHRydWUpCi0KLXR5cGVkZWYgc3RydWN0IHN0YXQgc3RhdF90eXBlOyAKLQwKLXR5cGVkZWYgZW51bSBiZmRfcHJpbnRfc3ltYm9sCi17IAotICBiZmRfcHJpbnRfc3ltYm9sX25hbWUsCi0gIGJmZF9wcmludF9zeW1ib2xfbW9yZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9hbGwKLX0gYmZkX3ByaW50X3N5bWJvbF90eXBlOwotICAgIAotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wgdGhhdCBubSBuZWVkcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9zeW1ib2xfaW5mbwotewotICBzeW12YWx1ZSB2YWx1ZTsKLSAgY2hhciB0eXBlOwotICBDT05TVCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzdGFiX3R5cGU7ICAgICAvKiBTdGFiIHR5cGUuICAqLwotICBjaGFyIHN0YWJfb3RoZXI7ICAgICAgICAgICAgIC8qIFN0YWIgb3RoZXIuICovCi0gIHNob3J0IHN0YWJfZGVzYzsgICAgICAgICAgICAgLyogU3RhYiBkZXNjLiAgKi8KLSAgQ09OU1QgY2hhciAqc3RhYl9uYW1lOyAgICAgICAvKiBTdHJpbmcgZm9yIHN0YWIgdHlwZS4gICovCi19IHN5bWJvbF9pbmZvOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzdGFicyB0eXBlIGNvZGUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqYmZkX2dldF9zdGFiX25hbWUgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiBIYXNoIHRhYmxlIHJvdXRpbmVzLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLQotLyogQW4gZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZS4gIE1vc3QgdXNlcyB3aWxsIGFjdHVhbGx5IHVzZSBhIGxhcmdlcgotICAgc3RydWN0dXJlLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBmaWVsZC4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeQotewotICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggYXJyYXkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZQotICAgICBmaXJzdCBlbnRyeSBpcyBpdHNlbGYgYSBwb2ludGVyIHRvIGFuIGVsZW1lbnQuICBXaGVuIHRoaXMKLSAgICAgZnVuY3Rpb24gaXMgZmlyc3QgaW52b2tlZCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgTlVMTC4gIEhvd2V2ZXIsCi0gICAgIGhhdmluZyB0aGUgcG9pbnRlciBwZXJtaXRzIGEgaGllcmFyY2h5IG9mIG1ldGhvZCBmdW5jdGlvbnMgdG8gYmUKLSAgICAgYnVpbHQgZWFjaCBvZiB3aGljaCBjYWxscyB0aGUgZnVuY3Rpb24gaW4gdGhlIHN1cGVyY2xhc3MuICBUaHVzCi0gICAgIGVhY2ggZnVuY3Rpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgb2YgbWVtb3J5Ci0gICAgIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIE5VTEwuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgY29uc3QgY2hhciAqKSk7Ci0gICAvKiBBbiBvYmphbGxvYyBmb3IgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpcyBhIHN0cnVjdCBvYmphbGxvYyAqLAotICAgICBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZiBvYmphbGxvYy5oLiAgKi8KLSAgUFRSIG1lbW9yeTsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZSBzcGVjaWZ5aW5nIGEgc2l6ZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0X24KLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSwKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotCi0vKiBGcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90YWJsZV9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSk7Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgSWYgQ1JFQVRFIGlzIHRydWUsIGEgbmV3IGVudHJ5Ci0gICB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgc3RyaW5nIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiAgVGhlCi0gICBDT1BZIGFyZ3VtZW50IG11c3QgYmUgdHJ1ZSBpZiB0aGlzIHJvdXRpbmUgc2hvdWxkIGNvcHkgdGhlIHN0cmluZwotICAgaW50byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWRkaW5nIGFuIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX2xvb2t1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfcmVwbGFjZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQsCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudykpOwotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHcmFiIHNvbWUgc3BhY2UgZm9yIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gUFRSIGJmZF9oYXNoX2FsbG9jYXRlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCkpOwotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUgaW4gYSByYW5kb20gb3JkZXIsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoCi0gICBlbGVtZW50LiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSB0cmF2ZXJzYWwgc3RvcHMuICBUaGUKLSAgIElORk8gYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJICAgIFBUUiksCi0JCQkJICAgICAgIFBUUiBpbmZvKSk7Ci0MCi0vKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KLSAgIFRoZSBDQVQ0IGhhY2sgaXMgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggc29tZSBzdHJpY3QgQU5TSSBDIHByZXByb2Nlc3NvcnMuCi0gICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbiwgYW5kIHdlIGRvbid0Ci0gICB3YW50IGV4dHJhIHVuZGVyc2NvcmVzIChlLmcuLCAibmxtXzMyXyIpLiAgVGhlIFhDQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlCi0gICBpbm5lciBDQVQgbWFjcm9zIHRvIGJlIGV2YWx1YXRlZCBmaXJzdCwgcHJvZHVjaW5nIHN0aWxsLXZhbGlkIHBwLXRva2Vucy4KLSAgIFRoZW4gdGhlIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotI2lmbmRlZiBDQVQKLSNpZmRlZiBTQUJFUgotI2RlZmluZSBDQVQoYSxiKQlhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpCWEjI2IjI2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhIyNiIyNjIyNkCi0jZWxzZQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENBVChhLGIpIGEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYSMjYiMjYwotI2RlZmluZSBYQ0FUMihhLGIpCUNBVChhLGIpCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJWENBVDIoQ0FUKGEsYiksQ0FUKGMsZCkpCi0jZWxzZQotI2RlZmluZSBDQVQoYSxiKSBhLyoqL2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9TV0FQX1RBQkxFIChQVFIpICZiZmRfY29mZl9zdGRfc3dhcF90YWJsZQotDAotLyogVXNlciBwcm9ncmFtIGFjY2VzcyB0byBCRkQgZmFjaWxpdGllcyAqLwotCi0vKiBEaXJlY3QgSS9PIHJvdXRpbmVzLCBmb3IgcHJvZ3JhbXMgd2hpY2gga25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QKLSAgIGZpbGUgdGhhbiBCRkQgZG9lcy4gIFVzZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMgaWYgcG9zc2libGUuICAqLwotCi1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfcmVhZAotICBQQVJBTVMgKChQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3dyaXRlCi0gIFBBUkFNUyAoKGNvbnN0IFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zZWVrIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmlsZV9wdHIgZnAsIGludCBkaXJlY3Rpb24pKTsKLWV4dGVybiBsb25nIGJmZF90ZWxsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zdGF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHN0YXQgKikpOwotCi0KLS8qIENhc3QgZnJvbSBjb25zdCBjaGFyICogdG8gY2hhciAqIHNvIHRoYXQgY2FsbGVyIGNhbiBhc3NpZ24gdG8KLSAgIGEgY2hhciAqIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgYmZkX2dldF9maWxlbmFtZShhYmZkKSAoKGNoYXIgKikgKGFiZmQpLT5maWxlbmFtZSkKLSNkZWZpbmUgYmZkX2dldF9jYWNoZWFibGUoYWJmZCkgKChhYmZkKS0+Y2FjaGVhYmxlKQotI2RlZmluZSBiZmRfZ2V0X2Zvcm1hdChhYmZkKSAoKGFiZmQpLT5mb3JtYXQpCi0jZGVmaW5lIGJmZF9nZXRfdGFyZ2V0KGFiZmQpICgoYWJmZCktPnh2ZWMtPm5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfZmxhdm91cihhYmZkKSAoKGFiZmQpLT54dmVjLT5mbGF2b3VyKQotI2RlZmluZSBiZmRfYmlnX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9saXR0bGVfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2hlYWRlcl9iaWdfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPmZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPm9iamVjdF9mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5zZWN0aW9uX2ZsYWdzKQotI2RlZmluZSBiZmRfbXlfYXJjaGl2ZShhYmZkKSAoKGFiZmQpLT5teV9hcmNoaXZlKQotI2RlZmluZSBiZmRfaGFzX21hcChhYmZkKSAoKGFiZmQpLT5oYXNfYXJtYXApCi0KLSNkZWZpbmUgYmZkX3ZhbGlkX3JlbG9jX3R5cGVzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnZhbGlkX3JlbG9jX3R5cGVzKQotI2RlZmluZSBiZmRfdXNyZGF0YShhYmZkKSAoKGFiZmQpLT51c3JkYXRhKQotCi0jZGVmaW5lIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyhhYmZkKSAoKGFiZmQpLT5zdGFydF9hZGRyZXNzKQotI2RlZmluZSBiZmRfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotI2RlZmluZSBiZmRfZ2V0X291dHN5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpICgoYWJmZCktPnNlY3Rpb25fY291bnQpCi0KLSNkZWZpbmUgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPnN5bWJvbF9sZWFkaW5nX2NoYXIpCi0KLSNkZWZpbmUgYmZkX3NldF9jYWNoZWFibGUoYWJmZCxib29sKSAoKChhYmZkKS0+Y2FjaGVhYmxlID0gKGJvb2xlYW4pKGJvb2wpKSwgdHJ1ZSkKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3JlY29yZF9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLCBmbGFnd29yZCwgYm9vbGVhbiwgYmZkX3ZtYSwKLQkgICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzZWMgKiopKTsKLQotLyogQnl0ZSBzd2FwcGluZyByb3V0aW5lcy4gICovCi0KLWJmZF92bWEJCWJmZF9nZXRiNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hIAliZmRfZ2V0bDY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQwKLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm87Ci1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcDsKLXN0cnVjdCBlY29mZl9leHRyOwotc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeTsKLXN0cnVjdCBiZmRfbGlua19pbmZvOwotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnk7Ci1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWU7Ci0jZW5kaWYKLWV4dGVybiBiZmRfdm1hIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICogYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgZ3BfdmFsdWUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfcmVnbWFza3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIGdwcm1hc2ssIHVuc2lnbmVkIGxvbmcgZnBybWFzaywKLQkgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrKSk7Ci1leHRlcm4gUFRSIGJmZF9lY29mZl9kZWJ1Z19pbml0Ci0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICBib29sZWFuICgqZ2V0X2V4dHIpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkJc3RydWN0IGVjb2ZmX2V4dHIgKiksCi0JICAgdm9pZCAoKnNldF9pbmRleCkgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUpKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlY29mZl9leHRyICplc3ltKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfZWNvZmZfZGVidWdfc2l6ZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqLCBzdHJ1Y3Qgc2VjICosCi0JICAgY2hhciAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUxGIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmV4dDsKLSAgYmZkICpieTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9lbGZfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9lbGZfZ2V0X2R0X3NvbmFtZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhCi0gICBjb3B5IG9mIEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLiAgUmV0dXJuIC0xIGlmIGFuIGVycm9yCi0gICBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gbG9uZyBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0vKiBDb3B5IEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHRvICpQSERSUy4gIFRoZSBlbnRyaWVzCi0gICB3aWxsIGJlIHN0b3JlZCBhcyBhbiBhcnJheSBvZiBFbGZfSW50ZXJuYWxfUGhkciBzdHJ1Y3R1cmVzLCBhcwotICAgZGVmaW5lZCBpbiBpbmNsdWRlL2VsZi9pbnRlcm5hbC5oLiAgVG8gZmluZCBvdXQgaG93IGxhcmdlIHRoZQotICAgYnVmZmVyIG5lZWRzIHRvIGJlLCBjYWxsIGJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMgcmVhZCwgb3IgLTEgaWYgYW4KLSAgIGVycm9yIG9jY3VyczsgYmZkX2dldF9lcnJvciB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2RlLiAgKi8KLWV4dGVybiBpbnQgYmZkX2dldF9lbGZfcGhkcnMgUEFSQU1TICgoYmZkICphYmZkLCB2b2lkICpwaGRycykpOwotCi0vKiBSZXR1cm4gdGhlIGFyY2hfc2l6ZSBmaWVsZCBvZiBhbiBlbGYgYmZkLCBvciAtMSBpZiBub3QgZWxmLiAgKi8KLWV4dGVybiBpbnQgYmZkX2VsZl9nZXRfYXJjaF9zaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBzZWMgKiopKTsKLQotLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIG1tYXAgaGFja3MgKi8KLQotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgewotICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCi0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5Ci0gICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCi0gICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCi0gICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKLSAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCi0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKLX0gYmZkX3dpbmRvdzsKLQotZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOwotCi0vKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAotCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGludGVybmFsX3N5bWVudDsKLXVuaW9uIGludGVybmFsX2F1eGVudDsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUEUgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRJIENPRkYgbG9hZCBwYWdlIHN1cHBvcnQuICovCi1leHRlcm4gdm9pZCBiZmRfdGljb2ZmX3NldF9zZWN0aW9uX2xvYWRfcGFnZQotICBQQVJBTVMgKChzdHJ1Y3Qgc2VjICosIGludCkpOwotCi1leHRlcm4gaW50IGJmZF90aWNvZmZfZ2V0X3NlY3Rpb25fbG9hZF9wYWdlCi0gIFBBUkFNUyAoKHN0cnVjdCBzZWMgKikpOwotCi0vKiBBbmQgbW9yZSBmcm9tIHRoZSBzb3VyY2UuICAqLwpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbjIuaCBiL2JmZC9iZmQtaW4yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjZkOGMuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC1pbjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNTcgKzAsMCBAQAotLyogTWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIGJmZCBsaWJyYXJ5IC0tIHBvcnRhYmxlIGFjY2VzcyB0byBvYmplY3QgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDYpKQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYQotICAgY29weSBvZiBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4gIFJldHVybiAtMSBpZiBhbiBlcnJvcgotICAgb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotZXh0ZXJuIGxvbmcgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gaW50IGJmZF9nZXRfZWxmX3BoZHJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcGhkcnMpKTsKLQotLyogUmV0dXJuIHRoZSBhcmNoX3NpemUgZmllbGQgb2YgYW4gZWxmIGJmZCwgb3IgLTEgaWYgbm90IGVsZi4gICovCi1leHRlcm4gaW50IGJmZF9lbGZfZ2V0X2FyY2hfc2l6ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIExpbnV4IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBtbWFwIGhhY2tzICovCi0KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbDsKLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIGJmZF93aW5kb3dfaW50ZXJuYWw7Ci0KLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93IHsKLSAgLyogV2hhdCB0aGUgdXNlciBhc2tlZCBmb3IuICAqLwotICBQVFIgZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUaGUgYWN0dWFsIHdpbmRvdyB1c2VkIGJ5IEJGRC4gIFNtYWxsIHVzZXItcmVxdWVzdGVkIHJlYWQtb25seQotICAgICByZWdpb25zIHNoYXJpbmcgYSBwYWdlIG1heSBzaGFyZSBhIHNpbmdsZSB3aW5kb3cgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICBSZWFkLXdyaXRlIHZlcnNpb25zIHNob3VsZG4ndCB1bnRpbCBJJ3ZlIGZpeGVkIHRoaW5ncyB0bwotICAgICBrZWVwIHRyYWNrIG9mIHdoaWNoIHBvcnRpb25zIGhhdmUgYmVlbiBjbGFpbWVkIGJ5IHRoZQotICAgICBhcHBsaWNhdGlvbjsgZG9uJ3Qgd2FudCB0byBnaXZlIHRoZSBzYW1lIHJlZ2lvbiBiYWNrIHdoZW4gdGhlCi0gICAgIGFwcGxpY2F0aW9uIHdhbnRzIHR3byB3cml0YWJsZSBjb3BpZXMhICAqLwotICBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgKmk7Ci19IGJmZF93aW5kb3c7Ci0KLWV4dGVybiB2b2lkIGJmZF9pbml0X3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiB2b2lkIGJmZF9mcmVlX3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9nZXRfZmlsZV93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBiZmRfd2luZG93ICosIGJvb2xlYW4pKTsKLQotLyogWENPRkYgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwKLQkgICBpbnQsIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBzZWMgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIENPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQ7Ci11bmlvbiBpbnRlcm5hbF9hdXhlbnQ7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X3N5bWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X2F1eGVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBpbnQsIHVuaW9uIGludGVybmFsX2F1eGVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFBFIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEVMRiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBUSSBDT0ZGIGxvYWQgcGFnZSBzdXBwb3J0LiAqLwotZXh0ZXJuIHZvaWQgYmZkX3RpY29mZl9zZXRfc2VjdGlvbl9sb2FkX3BhZ2UKLSAgUEFSQU1TICgoc3RydWN0IHNlYyAqLCBpbnQpKTsKLQotZXh0ZXJuIGludCBiZmRfdGljb2ZmX2dldF9zZWN0aW9uX2xvYWRfcGFnZQotICBQQVJBTVMgKChzdHJ1Y3Qgc2VjICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KLXZvaWQgCi1iZmRfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUikpOwotCi1iZmQgKgotYmZkX29wZW53IFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZV9hbGxfZG9uZSBQQVJBTVMgKChiZmQgKikpOwotCi1iZmQgKgotYmZkX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCkpOwotCi1ib29sZWFuIAotYmZkX21ha2Vfd3JpdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV9yZWFkYWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOAotI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLQotI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMTYKLSNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzMyCi0jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF82NAotI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9nZXQoYml0cywgYWJmZCwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfZ2V0XzMyIChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotCi0jZGVmaW5lIGJmZF9wdXQoYml0cywgYWJmZCwgdmFsLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLQotI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotICAgIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wuICBXaGVuIHRoZSBsaW5rZXIKLSAgICBzZWVzIGEgY29tZGF0IHNlY3Rpb24sIGl0IGtlZXBzIG9ubHkgb25lIG9mIHRoZSBzZWN0aW9ucyB3aXRoIGEKLSAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICovCi0KLXN0cnVjdCBiZmRfY29tZGF0X2luZm8KLXsKLSAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAvKiBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICAgIHNwZWNpZmljIGNvZGU7IGl0IGlzIG5vdCBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5Ci0gICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLiAgKi8KLSAgbG9uZyBzeW1ib2w7Ci0KLSAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBiZWluZyBkaXNjYXJkZWQsIHRoZSBsaW5rZXIgdXNlcyB0aGlzIGZpZWxkCi0gICAgIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzIGJlaW5nIGtlcHQuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWM7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzZWMKLXsKLSAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICovCi0KLSAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgICAvKiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKi8KLQotICAgaW50IGluZGV4OwotCi0gICAgICAgICAvKiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqLwotCi0gICAgc3RydWN0IHNlYyAqbmV4dDsKLQotICAgICAgICAgLyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLSAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgb25seS4gKi8KLSNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqLwotI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLSAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKi8KLSNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLQotI2lmIDAgICAgLyogT2Jzb2xldGUgPyAqLwotI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotI2VuZGlmCi0KLSAgICAgICAgIC8qIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotICAgICAgICAgIGRhdGEuICovCi0jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKi8KLSNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLwotI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCi0jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLSAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLSAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLSAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLSAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLSAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICovCi0jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLQotICAgICAgICAgLyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICovCi0jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLSAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0gICAgICAgICAgIHNlY3Rpb25zLiAqLwotI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLSAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotICAgICAgICAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqLwotI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotICAgICAgICAgICBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqLwotI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0gICAgICAgICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0gICAgICAgICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotCi0gICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLSAgICAgICAgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0gICAgICAgICAgdGFibGUuICAqLwotI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLQotICAgICAgICAvKiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotICAgICAgICAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0gICAgICAgICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLSAgICAgICAgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqLwotI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0KLSAgICAgICAgLyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotICAgICAgICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0gICAgICAgICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0gICAgICAgICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotICAgICAgICAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLSAgICAgICAgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotICAgICAgICAgICJuZWFyIiB0aGUgR1AuICAqLwotI2RlZmluZSBTRUNfU01BTExfREFUQSAweDIwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGF0YSB3aGljaCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKLSAgICAgICAgICBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0KLSAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gd2l0aCB0aGlzIGZsYWcgaXMgYmVpbmcgbGlua2VkLCB0aGVuIGlmIHRoZSBzaXplIG9mCi0gICAgICAgICAgdGhlIGlucHV0IHNlY3Rpb24gaXMgbGVzcyB0aGFuIGEgcGFnZSwgaXQgc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UKLSAgICAgICAgICBib3VuZGFyeS4gIElmIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG9uZSBwYWdlIG9yIG1vcmUsIGl0Ci0gICAgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBwYWdlIGJvdW5kYXJ5LiAgKi8KLSNkZWZpbmUgU0VDX0JMT0NLIDB4ODAwMDAwMAotCi0gICAgICAgIC8qIENvbmRpdGlvbmFsbHkgbGluayB0aGlzIHNlY3Rpb247IGRvIG5vdCBsaW5rIGlmIHRoZXJlIGFyZSBubwotICAgICAgICAgIHJlZmVyZW5jZXMgZm91bmQgdG8gYW55IHN5bWJvbCBpbiB0aGUgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFQ19DTElOSyAweDEwMDAwMDAwCi0KLSAgICAgICAgLyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKi8KLQotICAgICAgICAvKiBTb21lIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICovCi0KLSAgICAgICAgLyogU2VlIHRoZSB2bWEgZmllbGQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotCi0gICAgICAgIC8qIFdoZXRoZXIgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gICAgICAgdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgbGlua2VyX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEVuZCBvZiBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotICAgICAgICAgICB1c2VyX3NldF92bWEgZmxhZyBpcyBtYWludGFpbmVkIGJ5IGJmZDsgaWYgaXQncyBub3Qgc2V0LCB0aGUKLSAgICAgICAgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLSAgICAgICAgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgdGFyZ2V0IGFuZCB2YXJpb3VzIGZsYWdzKS4gICovCi0KLSAgIGJmZF92bWEgdm1hOwotCi0gICAgICAgIC8qICBUaGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd291bGQgYmUgaW4gYQotICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLSAgICAgICAgICAgaW5mb3JtYXRpb24uICovCi0KLSAgIGJmZF92bWEgbG1hOwotCi0gICAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBvY3RldHMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotICAgICAgICAgICBDb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKLSAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24uICAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKLQotICAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gb2N0ZXRzLiAgTm9ybWFsbHkgdGhpcwotICAgICAgICAgICB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSwgYnV0IGlmIHNvbWUgcmVsYXhpbmcgaGFzCi0gICAgICAgICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKi8KLQotICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0KLSAgICAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICAgb2Zmc2V0IGluICpieXRlcyogaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlCi0gICAgICAgICAgIGlucHV0IHNlY3Rpb24gKGJ5dGUgPT0+IHNtYWxsZXN0IGFkZHJlc3NhYmxlIHVuaXQgb24gdGhlCi0gICAgICAgICAgIHRhcmdldCkuICBJbiBtb3N0IGNhc2VzLCBpZiB0aGlzIHdhcyBnb2luZyB0byBzdGFydCBhdCB0aGUKLSAgICAgICAgICAgMTAwdGggb2N0ZXQgKDgtYml0IHF1YW50aXR5KSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUKLSAgICAgICAgICAgd291bGQgYmUgMTAwLiAgSG93ZXZlciwgaWYgdGhlIHRhcmdldCBieXRlIHNpemUgaXMgMTYgYml0cwotICAgICAgICAgICAoYmZkX29jdGV0c19wZXJfYnl0ZSBpcyAiMiIpLCB0aGlzIHZhbHVlIHdvdWxkIGJlIDUwLiAqLwotCi0gICBiZmRfdm1hIG91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgICAgIC8qIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICovCi0KLSAgIHN0cnVjdCBzZWMgKm91dHB1dF9zZWN0aW9uOwotCi0gICAgICAgICAvKiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLSAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKi8KLQotICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgICAgLyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KLSAgICAgICAgICAgcmVjb3JkcyBmb3IgdGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uLiAqLwotCi0gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247Ci0KLSAgICAgICAgIC8qIElmIGFuIG91dHB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8KLSAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCi0KLSAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqKm9yZWxvY2F0aW9uOwotCi0gICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqLwotCi0gICB1bnNpZ25lZCByZWxvY19jb3VudDsKLQotICAgICAgICAgLyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqLwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIHNlY3Rpb24gZGF0YSAgICAqLwotCi0gICBmaWxlX3B0ciBmaWxlcG9zOwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyAqLwotCi0gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiBsaW5lIGRhdGEgICAgICAgKi8KLQotICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotCi0gICAgICAgICAvKiBQb2ludGVyIHRvIGRhdGEgZm9yIGFwcGxpY2F0aW9ucyAqLwotCi0gICBQVFIgdXNlcmRhdGE7Ci0KLSAgICAgICAgIC8qIElmIHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGlzIHBvaW50cyB0byB0aGUgYWN0dWFsCi0gICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotCi0gICAgICAgICAvKiBBdHRhY2hlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAqLwotCi0gICBhbGVudCAqbGluZW5vOwotCi0gICAgICAgICAvKiBOdW1iZXIgb2YgbGluZSBudW1iZXIgcmVjb3JkcyAgICovCi0KLSAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0KLSAgICAgICAgIC8qIE9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgQ09NREFUIGVudHJ5OyBOVUxMIGlmIG5vdCBDT01EQVQgKi8KLQotICAgc3RydWN0IGJmZF9jb21kYXRfaW5mbyAqY29tZGF0OwotCi0gICAgICAgICAvKiBXaGVuIGEgc2VjdGlvbiBpcyBiZWluZyBvdXRwdXQsIHRoaXMgdmFsdWUgY2hhbmdlcyBhcyBtb3JlCi0gICAgICAgICAgIGxpbmVudW1iZXJzIGFyZSB3cml0dGVuIG91dCAqLwotCi0gICBmaWxlX3B0ciBtb3ZpbmdfbGluZV9maWxlcG9zOwotCi0gICAgICAgICAvKiBXaGF0IHRoZSBzZWN0aW9uIG51bWJlciBpcyBpbiB0aGUgdGFyZ2V0IHdvcmxkICAqLwotCi0gICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICBQVFIgdXNlZF9ieV9iZmQ7Ci0KLSAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRoZW4gaGVyZSBpcyBhIGxpc3Qgb2YgdGhlCi0gICAgICAgICAgIHJlbG9jYXRpb25zIGNyZWF0ZWQgdG8gcmVsb2NhdGUgaXRlbXMgd2l0aGluIGl0LiAqLwotCi0gICBzdHJ1Y3QgcmVsZW50X2NoYWluICpjb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgICAgICAgLyogVGhlIEJGRCB3aGljaCBvd25zIHRoZSBzZWN0aW9uLiAqLwotCi0gICBiZmQgKm93bmVyOwotCi0gICAgICAgICAvKiBBIHN5bWJvbCB3aGljaCBwb2ludHMgYXQgdGhpcyBzZWN0aW9uIG9ubHkgKi8KLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xfcHRyX3B0cjsKLQotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0gICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXJfdGFpbDsKLX0gYXNlY3Rpb24gOwotCi0gICAgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLSAgICAgICBhbmQgdGFyZ2V0IGJhY2sgZW5kIGFyZSBub3QgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluCi0gICAgICAgdGhlc2Ugc2VjdGlvbnMuICBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBzZWN0aW9uX3B0ciBtYWNyb3MgcmF0aGVyCi0gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0gICAgICAgbWF5IGV2ZW50dWFsbHkgdmFuaXNoLiAgKi8KLSNkZWZpbmUgQkZEX0FCU19TRUNUSU9OX05BTUUgIipBQlMqIgotI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0jZGVmaW5lIEJGRF9DT01fU0VDVElPTl9OQU1FICIqQ09NKiIKLSNkZWZpbmUgQkZEX0lORF9TRUNUSU9OX05BTUUgIipJTkQqIgotCi0gICAgIC8qIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2Fic19zZWN0aW9uOwotI2RlZmluZSBiZmRfYWJzX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX3VuZF9zZWN0aW9uOwotI2RlZmluZSBiZmRfdW5kX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2NvbV9zZWN0aW9uOwotI2RlZmluZSBiZmRfY29tX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbikKLSAgICAgLyogUG9pbnRlciB0byB0aGUgaW5kaXJlY3Qgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2luZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfaW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19pbmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfaW5kX3NlY3Rpb25fcHRyKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9hYnNfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfY29tX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9pbmRfc3ltYm9sOwotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2Moc2VjdGlvbikgXAotICAgICAoKHNlY3Rpb24pLT5yZWxvY19kb25lID8gKGFib3J0ICgpLCAoYmZkX3NpemVfdHlwZSkgMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uKS0+cmVsb2NfZG9uZSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChhYm9ydCAoKSwgKGJmZF9zaXplX3R5cGUpIDEpKQotYXNlY3Rpb24gKgotYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYXNlY3Rpb24gKgotYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLXZvaWQgCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICphYmZkLAotICAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3QsCi0gICAgUFRSIG9iaiksCi0gICAgUFRSIG9iaikpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX3NpemUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfc2l6ZV90eXBlIHZhbCkpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgIFBUUiBkYXRhLAotICAgIGZpbGVfcHRyIG9mZnNldCwKLSAgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sCi0gICAgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGFzZWN0aW9uICppc2VjLCBiZmQgKm9iZmQsIGFzZWN0aW9uICpvc2VjKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQotdm9pZCAKLV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfaTM3MCwgICAgICAgLyogSUJNIDM2MC8zNzAgTWFpbmZyYW1lcyAqLwotICBiZmRfYXJjaF9yb21wLCAgICAgICAvKiBJQk0gUk9NUCBQQy9SVCAqLwotICBiZmRfYXJjaF9hbGxpYW50LCAgICAvKiBBbGxpYW50ICovCi0gIGJmZF9hcmNoX2NvbnZleCwgICAgIC8qIENvbnZleCAqLwotICBiZmRfYXJjaF9tODhrLCAgICAgICAvKiBNb3Rvcm9sYSA4OHh4eCAqLwotICBiZmRfYXJjaF9weXJhbWlkLCAgICAvKiBQeXJhbWlkIFRlY2hub2xvZ3kgKi8KLSAgYmZkX2FyY2hfaDgzMDAsICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwaCAgMgotI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLSAgYmZkX2FyY2hfcG93ZXJwYywgICAgLyogUG93ZXJQQyAqLwotICBiZmRfYXJjaF9yczYwMDAsICAgICAvKiBJQk0gUlMvNjAwMCAqLwotICBiZmRfYXJjaF9ocHBhLCAgICAgICAvKiBIUCBQQSBSSVNDICovCi0gIGJmZF9hcmNoX2QxMHYsICAgICAgIC8qIE1pdHN1YmlzaGkgRDEwViAqLwotI2RlZmluZSBiZmRfbWFjaF9kMTB2ICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfZDEwdl90czIgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX2QxMHZfdHMzICAgICAgMwotICBiZmRfYXJjaF9kMzB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQzMFYgKi8KLSAgYmZkX2FyY2hfejhrLCAgICAgICAgLyogWmlsb2cgWjgwMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfejgwMDEgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAyICAgICAgICAgMgotICBiZmRfYXJjaF9oODUwMCwgICAgICAvKiBIaXRhY2hpIEg4LzUwMCAqLwotICBiZmRfYXJjaF9zaCwgICAgICAgICAvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF9zaDIgICAgICAgIDB4MjAKLSNkZWZpbmUgYmZkX21hY2hfc2hfZHNwICAgICAweDJkCi0jZGVmaW5lIGJmZF9tYWNoX3NoMyAgICAgICAgMHgzMAotI2RlZmluZSBiZmRfbWFjaF9zaDNfZHNwICAgIDB4M2QKLSNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0jZGVmaW5lIGJmZF9tYWNoX3NoNCAgICAgICAgMHg0MAotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hcm1fMyAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzNNICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV80ICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzUgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV81VCAgICAgICAgOAotICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCi0gIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLwotICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KLSAgYmZkX2FyY2hfdGljNTR4LCAgICAgLyogVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzU0WCAqLwotICBiZmRfYXJjaF90aWM4MCwgICAgICAvKiBUSSBUTVMzMjBjODAgKE1WUCkgKi8KLSAgYmZkX2FyY2hfdjg1MCwgICAgICAgLyogTkVDIFY4NTAgKi8KLSNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlICAgICAgICAgJ0UnCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYSAgICAgICAgJ0EnCi0gIGJmZF9hcmNoX2FyYywgICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLwotI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCi0gIGJmZF9hcmNoX20zMnIsICAgICAgIC8qIE1pdHN1YmlzaGkgTTMyUi9EICovCi0jZGVmaW5lIGJmZF9tYWNoX20zMnIgICAgICAgICAgMCAgLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgYmZkX21hY2hfbTMycnggICAgICAgICAneCcKLSAgYmZkX2FyY2hfbW4xMDIwMCwgICAgLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCi0gIGJmZF9hcmNoX21uMTAzMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLwotI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwICAgICAgICAgICAgICAgMzAwCi0jZGVmaW5lIGJmZF9tYWNoX2FtMzMgICAgICAgICAgMzMwCi0gIGJmZF9hcmNoX2ZyMzAsCi0jZGVmaW5lIGJmZF9tYWNoX2ZyMzAgICAgICAgICAgMHg0NjUyMzMzMAotICBiZmRfYXJjaF9tY29yZSwKLSAgYmZkX2FyY2hfaWE2NCwgICAgICAgLyogSFAvSW50ZWwgaWE2NCAqLwotICBiZmRfYXJjaF9waiwKLSAgYmZkX2FyY2hfYXZyLCAgICAgICAgLyogQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcnMgKi8KLSNkZWZpbmUgYmZkX21hY2hfYXZyMSAgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2F2cjIgICAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hdnIzICAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXZyNCAgICAgICAgICA0Ci0gIGJmZF9hcmNoX2xhc3QKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLXsKLSAgaW50IGJpdHNfcGVyX3dvcmQ7Ci0gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotICBpbnQgYml0c19wZXJfYnl0ZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgY29uc3QgY2hhciAqYXJjaF9uYW1lOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICovCi0gIGJvb2xlYW4gdGhlX2RlZmF1bHQ7IAotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqICgqY29tcGF0aWJsZSkKLSAgICAgICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOwotCi0gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLQotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqbmV4dDsKLX0gYmZkX2FyY2hfaW5mb190eXBlOwotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfc2Nhbl9hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9hcmNoX2dldF9jb21wYXRpYmxlIFBBUkFNUyAoKAotICAgIGNvbnN0IGJmZCAqYWJmZCwKLSAgICBjb25zdCBiZmQgKmJiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpKTsKLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotYmZkX2dldF9hcmNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBsb25nIAotYmZkX2dldF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9nZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2xvb2t1cF9hcmNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0gICAgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX29jdGV0c19wZXJfYnl0ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX2FyY2hfbWFjaF9vY3RldHNfcGVyX2J5dGUgUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0gICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLXR5cGVkZWYgZW51bSBiZmRfcmVsb2Nfc3RhdHVzCi17Ci0gICAgICAgIC8qIE5vIGVycm9ycyBkZXRlY3RlZCAqLwotICBiZmRfcmVsb2Nfb2ssCi0KLSAgICAgICAgLyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKi8KLSAgYmZkX3JlbG9jX292ZXJmbG93LAotCi0gICAgICAgIC8qIFRoZSBhZGRyZXNzIHRvIHJlbG9jYXRlIHdhcyBub3Qgd2l0aGluIHRoZSBzZWN0aW9uIHN1cHBsaWVkLiAqLwotICBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwKLQotICAgICAgICAvKiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICovCi0gIGJmZF9yZWxvY19jb250aW51ZSwKLQotICAgICAgICAvKiBVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHNpemUgcmVxdWVzdGVkLiAqLwotICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotCi0gICAgICAgIC8qIFVudXNlZCAqLwotICBiZmRfcmVsb2Nfb3RoZXIsCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICovCi0gIGJmZF9yZWxvY191bmRlZmluZWQsCi0KLSAgICAgICAgLyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IG1heSBub3QgYmUgb2sgLSBwcmVzZW50bHkKLSAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotICAgICAgICAgIHN5bWJvbHMuICBJZiB0aGlzIHR5cGUgaXMgcmV0dXJuZWQsIHRoZSBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50Ci0gICAgICAgICAgdG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB3aWxsIGJlIHNldC4gICovCi0gIGJmZF9yZWxvY19kYW5nZXJvdXMKLSB9Ci0gYmZkX3JlbG9jX3N0YXR1c190eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Ci17Ci0gICAgICAgIC8qIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICovCi0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1fcHRyX3B0cjsKLQotICAgICAgICAvKiBvZmZzZXQgaW4gc2VjdGlvbiAqLwotICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0KLSAgICAgICAgLyogYWRkZW5kIGZvciByZWxvY2F0aW9uIHZhbHVlICovCi0gIGJmZF92bWEgYWRkZW5kOwotCi0gICAgICAgIC8qIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLX0gYXJlbGVudDsKLWVudW0gY29tcGxhaW5fb3ZlcmZsb3cKLXsKLSAgICAgICAgLyogRG8gbm90IGNvbXBsYWluIG9uIG92ZXJmbG93LiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCi0gICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSBiaXRmaWVsZCBvdmVyZmxvd3MsIHdoZXRoZXIgaXQgaXMgY29uc2lkZXJlZAotICAgICAgICAgIGFzIHNpZ25lZCBvciB1bnNpZ25lZC4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgc2lnbmVkCi0gICAgICAgICAgbnVtYmVyLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgYW4KLSAgICAgICAgICB1bnNpZ25lZCBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi19OwotCi1zdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0Ci17Ci0gICAgICAgIC8qICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1lbnRhcnkgdXNlIC0gdGhlIGJhY2sgZW5kIGNhbgotICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotICAgICAgICAgICBleHRlcm5hbCBpZGVhIG9mIHdoYXQgYSByZWxvYyBudW1iZXIgaXMgc3RvcmVkCi0gICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCBhIFBDIHJlbGF0aXZlIHdvcmQgcmVsb2NhdGlvbgotICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0gICAgICAgICAgIHdoYXQgdGhlIG91dHNpZGUgd29ybGQgY2FsbHMgYSBSX1BDUldPUkQgcmVsb2MuICovCi0gIHVuc2lnbmVkIGludCB0eXBlOwotCi0gICAgICAgIC8qICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotICAgICAgICAgICB1bndhbnRlZCBkYXRhIGZyb20gdGhlIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLQotICAgICAgICAvKiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0gICAgICAgICAgIHBvd2VyLW9mLXR3byBtZWFzdXJlLiAgVG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQKLSAgICAgICAgICAgb24gYnkgYSB0eXBlIG9mIHJlbG9jYXRpb24sIHVzZSBiZmRfZ2V0X3JlbG9jX3NpemUuICAqLwotICBpbnQgc2l6ZTsKLQotICAgICAgICAvKiAgVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgdXNlZAotICAgICAgICAgICB3aGVuIGRvaW5nIG92ZXJmbG93IGNoZWNraW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0KLSAgICAgICAgLyogIE5vdGVzIHRoYXQgdGhlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZQotICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAotICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotICAgICAgICAgICBiZWluZyByZWxvY2F0ZWQuICovCi0gIGJvb2xlYW4gcGNfcmVsYXRpdmU7Ci0KLSAgICAgICAgLyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgICAgICAgVGhlIHJlbG9jYXRlZCB2YWx1ZSBpcyBsZWZ0IHNoaWZ0ZWQgYnkgdGhpcyBhbW91bnQuICovCi0gIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0KLSAgICAgICAgLyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0gICAgICAgICAgcmVsb2NhdGluZy4gKi8KLSAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBjb21wbGFpbl9vbl9vdmVyZmxvdzsKLQotICAgICAgICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotICAgICAgICAgIGNhbGxlZCByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyByZWFsbHkKLSAgICAgICAgICBzdHJhbmdlIHJlbG9jYXRpb24gbWV0aG9kcyB0byBiZSBhY2NvbW9kYXRlZCAoZS5nLiwgaTk2MCBjYWxsagotICAgICAgICAgIGluc3RydWN0aW9ucykuICovCi0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAoKnNwZWNpYWxfZnVuY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLSAgICAgICAgLyogVGhlIHRleHR1YWwgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAqLwotICBjaGFyICpuYW1lOwotCi0gICAgICAgIC8qIFNvbWUgZm9ybWF0cyByZWNvcmQgYSByZWxvY2F0aW9uIGFkZGVuZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cwotICAgICAgICAgIHJhdGhlciB0aGFuIHdpdGggdGhlIHJlbG9jYXRpb24uICBGb3IgRUxGIGZvcm1hdHMgdGhpcyBpcyB0aGUKLSAgICAgICAgICBkaXN0aW5jdGlvbiBiZXR3ZWVuIFVTRV9SRUwgYW5kIFVTRV9SRUxBICh0aG91Z2ggdGhlIGNvZGUgY2hlY2tzCi0gICAgICAgICAgZm9yIFVTRV9SRUwgPT0gMS8wKS4gIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIFRSVUUgaWYgdGhlCi0gICAgICAgICAgYWRkZW5kIGlzIHJlY29yZGVkIHdpdGggdGhlIHNlY3Rpb24gY29udGVudHM7IHdoZW4gcGVyZm9ybWluZyBhCi0gICAgICAgICAgcGFydGlhbCBsaW5rIChsZCAtcikgdGhlIHNlY3Rpb24gY29udGVudHMgKHRoZSBkYXRhKSB3aWxsIGJlCi0gICAgICAgICAgbW9kaWZpZWQuICBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBGQUxTRSBpZiBhZGRlbmRzIGFyZQotICAgICAgICAgIHJlY29yZGVkIHdpdGggdGhlIHJlbG9jYXRpb24gKGluIGFyZWxlbnQuYWRkZW5kKTsgd2hlbiBwZXJmb3JtaW5nCi0gICAgICAgICAgYSBwYXJ0aWFsIGxpbmsgdGhlIHJlbG9jYXRpb24gd2lsbCBiZSBtb2RpZmllZC4KLSAgICAgICAgICBBbGwgcmVsb2NhdGlvbnMgZm9yIGFsbCBFTEYgVVNFX1JFTEEgdGFyZ2V0cyBzaG91bGQgc2V0IHRoaXMgZmllbGQKLSAgICAgICAgICB0byBGQUxTRSAodmFsdWVzIG9mIFRSVUUgc2hvdWxkIGJlIGxvb2tlZCBvbiB3aXRoIHN1c3BpY2lvbikuCi0gICAgICAgICAgSG93ZXZlciwgdGhlIGNvbnZlcnNlIGlzIG5vdCB0cnVlOiBub3QgYWxsIHJlbG9jYXRpb25zIG9mIGFsbCBFTEYKLSAgICAgICAgICBVU0VfUkVMIHRhcmdldHMgc2V0IHRoaXMgZmllbGQgdG8gVFJVRS4gIFdoeSB0aGlzIGlzIHNvIGlzIHBlY3VsaWFyCi0gICAgICAgICAgdG8gZWFjaCBwYXJ0aWN1bGFyIHRhcmdldC4gIEZvciByZWxvY3MgdGhhdCBhcmVuJ3QgdXNlZCBpbiBwYXJ0aWFsCi0gICAgICAgICAgbGlua3MgKGUuZy4gR09UIHN0dWZmKSBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoaXMgaXMgc2V0IHRvLiAgKi8KLSAgYm9vbGVhbiBwYXJ0aWFsX2lucGxhY2U7Ci0KLSAgICAgICAgLyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotICAgICAgICAgIGFyZSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uIHN1bS4gIEUuZy4sIGlmIHRoaXMgd2FzIGFuIDggYml0Ci0gICAgICAgICAgYnl0ZSBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQotICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLSAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0gICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKi8KLSAgYmZkX3ZtYSBzcmNfbWFzazsKLQotICAgICAgICAvKiBUaGUgZHN0X21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHJlcGxhY2VkCi0gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZiwgYW5kIHNyY19tYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICAgKi8KLSAgYmZkX3ZtYSBkc3RfbWFzazsKLQotICAgICAgICAvKiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwYyBvZiB0aGUgcGxhY2UgYmVpbmcgcmVsb2NhdGVkIGluIHRoZSBvZmZzZXQKLSAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotICAgICAgICAgIFNvbWUgZm9ybWF0cyBsZWF2ZSB0aGUgZGlzcGxhY2VtZW50IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qLwotICBib29sZWFuIHBjcmVsX29mZnNldDsKLQotfTsKLSNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLSAgeyh1bnNpZ25lZClDLFIsUyxCLCBQLCBCSSwgTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQotI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0KLSNkZWZpbmUgRU1QVFlfSE9XVE8oQykgXAotICBIT1dUTygoQyksMCwwLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LE5VTEwsTlVMTCxmYWxzZSwwLDAsZmFsc2UpCi0KLSNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLSAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXVuc2lnbmVkIGludCAKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci19IGFyZWxlbnRfY2hhaW47Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2NoZWNrX292ZXJmbG93Ci0gUEFSQU1TICgoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0gICAgdW5zaWduZWQgaW50IGJpdHNpemUsCi0gICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0gICAgdW5zaWduZWQgaW50IGFkZHJzaXplLAotICAgIGJmZF92bWEgcmVsb2NhdGlvbikpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgewotICBfZHVtbXlfZmlyc3RfYmZkX3JlbG9jX2NvZGVfcmVhbCwKLQotCi0vKiBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuICovCi0gIEJGRF9SRUxPQ182NCwKLSAgQkZEX1JFTE9DXzMyLAotICBCRkRfUkVMT0NfMjYsCi0gIEJGRF9SRUxPQ18yNCwKLSAgQkZEX1JFTE9DXzE2LAotICBCRkRfUkVMT0NfMTQsCi0gIEJGRF9SRUxPQ184LAotCi0vKiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuICovCi0gIEJGRF9SRUxPQ182NF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzEyX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QQ1JFTCwKLQotLyogRm9yIEVMRi4gKi8KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfR09UT0ZGLAotICBCRkRfUkVMT0NfMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYsCi0gIEJGRF9SRUxPQ184X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUExUT0ZGLAotICBCRkRfUkVMT0NfMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYsCi0gIEJGRF9SRUxPQ184X1BMVE9GRiwKLQotLyogUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLiAqLwotICBCRkRfUkVMT0NfNjhLX0dMT0JfREFULAotICBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLAotCi0vKiBMaW5rYWdlLXRhYmxlIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfMzJfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzhfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX1JWQSwKLQotLyogQWJzb2x1dGUgOC1iaXQgcmVsb2NhdGlvbiwgYnV0IHVzZWQgdG8gZm9ybSBhbiBhZGRyZXNzIGxpa2UgMHhGRm5uLiAqLwotICBCRkRfUkVMT0NfOF9GRm5uLAotCi0vKiBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4gKi8KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMiwKLQotLyogSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4gKi8KLSAgQkZEX1JFTE9DX0hJMjIsCi0gIEJGRF9SRUxPQ19MTzEwLAotCi0vKiBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuICovCi0gIEJGRF9SRUxPQ19HUFJFTDE2LAotICBCRkRfUkVMT0NfR1BSRUwzMiwKLQotLyogUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4gKi8KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEosCi0KLS8qIFNQQVJDIEVMRiByZWxvY2F0aW9ucy4gIFRoZXJlIGlzIHByb2JhYmx5IHNvbWUgb3ZlcmxhcCB3aXRoIG90aGVyCi1yZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4gKi8KLSAgQkZEX1JFTE9DX05PTkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLAotICBCRkRfUkVMT0NfU1BBUkMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzEwLAotICBCRkRfUkVMT0NfU1BBUkNfUEMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0NPUFksCi0gIEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19VQTMyLAotCi0vKiBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLiAqLwotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyLAotCi0vKiBTUEFSQzY0IHJlbG9jYXRpb25zICovCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ182NCBCRkRfUkVMT0NfNjQKLSAgQkZEX1JFTE9DX1NQQVJDXzEwLAotICBCRkRfUkVMT0NfU1BBUkNfMTEsCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LAotICBCRkRfUkVMT0NfU1BBUkNfNywKLSAgQkZEX1JFTE9DX1NQQVJDXzYsCi0gIEJGRF9SRUxPQ19TUEFSQ181LAotI2RlZmluZSBCRkRfUkVMT0NfU1BBUkNfRElTUDY0IEJGRF9SRUxPQ182NF9QQ1JFTAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQsCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsCi0KLS8qIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbiAqLwotICBCRkRfUkVMT0NfU1BBUkNfUkVWMzIsCi0KLS8qIEFscGhhIEVDT0ZGIGFuZCBFTEYgcmVsb2NhdGlvbnMuICBTb21lIG9mIHRoZXNlIHRyZWF0IHRoZSBzeW1ib2wgb3IKLSJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi1Gb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLXdyaXRpbmc7IHdoZW4gcmVhZGluZywgaXQgd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICBUaGUKLWFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi10aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2LAotCi0vKiBGb3IgR1BESVNQX0xPMTYgKCJpZ25vcmUiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBoYW5kbGVkIGFzCi13aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi1yZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi1yZWFkaW5nLCBmb3IgY29udmVuaWVuY2UuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiwKLQotLyogVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLXJlbG9jYXRpb24uICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AsCi0KLS8qIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLXRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhIExEUSBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSBhZGRyZXNzIG9mCi10aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi1UaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotc2VjdGlvbiBzeW1ib2wuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nLCBidXQgaXMgZmlsbGVkCi1pbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotR1BESVNQX0xPMTYgcmVsb2MuCi0KLVRoZSBFTEZfTElURVJBTCByZWxvYyBpcyBzb21ld2hlcmUgYmV0d2VlbiAxNl9HT1RPRkYgYW5kIEdQRElTUF9MTzE2LgotSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi1idXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotc2VjdGlvbiwgYnV0IHJlbGF0aXZlIHRvIHRoZSBHUCB2YWx1ZSBjaG9zZW4gZm9yIHRoZSBmaWxlIGR1cmluZyB0aGUKLWZpbmFsIGxpbmsgc3RhZ2UuCi0KLVRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi1pbmZvcm1hdGlvbiB0byB0aGUgbGlua2VyIHRoYXQgaXQgbWlnaHQgYmUgYWJsZSB0byB1c2UgdG8gb3B0aW1pemUKLWF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLW9mIGluc3RydWN0aW9uIHVzaW5nIHRoZSByZWdpc3RlcjoKLTEgLSAibWVtb3J5IiBmbXQgaW5zbgotMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0zIC0ganNyICh0YXJnZXQgb2YgYnJhbmNoKQotCi1UaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAotCi0vKiBUaGUgQkZEX1JFTE9DX0FMUEhBX1VTRVJfKiByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvCi1wcm9jZXNzIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQKLWludG8gdGhlIG5vcm1hbCByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCwKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1csCi0KLS8qIFRoZSBISU5UIHJlbG9jYXRpb24gaW5kaWNhdGVzIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgZmlsbGVkIGludG8gdGhlCi0iaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLXByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0KLS8qIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsCi0KLS8qIFRoZSBDT0RFQUREUiByZWxvY2F0aW9uIG91dHB1dHMgYSBTVE9fQ0EgaW4gdGhlIG9iamVjdCBmaWxlLAotd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiwKLQotLyogQml0cyAyNy4uMiBvZiB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIHNoaWZ0ZWQgcmlnaHQgMiBiaXRzOwotc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4gKi8KLSAgQkZEX1JFTE9DX01JUFNfSk1QLAotCi0vKiBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfSk1QLAotCi0vKiBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0hJMTYsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLWV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci1iaXRzIGZvcm0gYSBuZWdhdGl2ZSBudW1iZXIsIHdlIG5lZWQgdG8gYWRkIG9uZSB0byB0aGUgaGlnaCB2YWx1ZQotdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuICovCi0gIEJGRF9SRUxPQ19ISTE2X1MsCi0KLS8qIExvdyAxNiBiaXRzLiAqLwotICBCRkRfUkVMT0NfTE8xNiwKLQotLyogTGlrZSBCRkRfUkVMT0NfSEkxNl9TLCBidXQgUEMgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MsCi0KLS8qIExpa2UgQkZEX1JFTE9DX0xPMTYsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYsCi0KLS8qIFJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBwb2ludGVyLiAqLwotI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTCBCRkRfUkVMT0NfR1BSRUwxNgotCi0vKiBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTCwKLQotLyogTUlQUyBFTEYgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYsCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIgQkZEX1JFTE9DX0dQUkVMMzIKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwKLSAgQkZEX1JFTE9DX01JUFNfU1VCLAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSwKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQLAotCi0KLS8qIGkzODYvZWxmIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ18zODZfR09UMzIsCi0gIEJGRF9SRUxPQ18zODZfUExUMzIsCi0gIEJGRF9SRUxPQ18zODZfQ09QWSwKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGLAotICBCRkRfUkVMT0NfMzg2X0dPVFBDLAotCi0vKiBuczMyayByZWxvY2F0aW9ucyAqLwotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLS8qIFBpY29qYXZhIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX1BKX0NPREVfSEkxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfTE8xNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsCi0gIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIsCi0KLS8qIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19QUENfQjI2LAotICBCRkRfUkVMT0NfUFBDX0JBMjYsCi0gIEJGRF9SRUxPQ19QUENfVE9DMTYsCi0gIEJGRF9SRUxPQ19QUENfQjE2LAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2LAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0NPUFksCi0gIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19QUENfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ19QUENfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxLAotICBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEksCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxELAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEsCi0KLS8qIElCTSAzNzAvMzkwIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ19JMzcwX0QxMiwKLQotLyogVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCB0byBidWlsZCBhIGNvbnRydWN0b3IgdGFibGUgLSBhdCB0aGUgbW9tZW50Ci1wcm9iYWJseSBhIDMyIGJpdCB3aWRlIGFic29sdXRlIHJlbG9jYXRpb24sIGJ1dCB0aGUgdGFyZ2V0IGNhbiBjaG9vc2UuCi1JdCBnZW5lcmFsbHkgZG9lcyBtYXAgdG8gb25lIG9mIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAqLwotICBCRkRfUkVMT0NfQ1RPUiwKLQotLyogQVJNIDI2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsCi0KLS8qIEFSTSAyNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCBiaXQgbXVzdCBiZSB6ZXJvIGFuZCBpcwotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgMm5kIGxvd2VzdCBiaXQgY29tZXMgZnJvbSBhIDEgYml0Ci1maWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19BUk1fUENSRUxfQkxYLAotCi0vKiBUaHVtYiAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCBiaXQgbXVzdCBiZSB6ZXJvIGFuZCBpcwotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgMm5kIGxvd2VzdCBiaXQgY29tZXMgZnJvbSBhIDEgYml0Ci1maWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CTFgsCi0KLS8qIFRoZXNlIHJlbG9jcyBhcmUgb25seSB1c2VkIHdpdGhpbiB0aGUgQVJNIGFzc2VtYmxlci4gIFRoZXkgYXJlIG5vdAotKGF0IHByZXNlbnQpIHdyaXR0ZW4gdG8gYW55IG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUsCi0gIEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUsCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fU1dJLAotICBCRkRfUkVMT0NfQVJNX01VTFRJLAotICBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fQURSX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9MRFJfSU1NLAotICBCRkRfUkVMT0NfQVJNX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BUk1fSU5fUE9PTCwKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCwKLSAgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfQURELAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsCi0gIEJGRF9SRUxPQ19BUk1fR09UMTIsCi0gIEJGRF9SRUxPQ19BUk1fR09UMzIsCi0gIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULAotICBCRkRfUkVMT0NfQVJNX0NPUFksCi0gIEJGRF9SRUxPQ19BUk1fR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19BUk1fUExUMzIsCi0gIEJGRF9SRUxPQ19BUk1fUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19BUk1fR09UT0ZGLAotICBCRkRfUkVMT0NfQVJNX0dPVFBDLAotCi0vKiBIaXRhY2hpIFNIIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTTQsCi0gIEJGRF9SRUxPQ19TSF9JTU00QlkyLAotICBCRkRfUkVMT0NfU0hfSU1NNEJZNCwKLSAgQkZEX1JFTE9DX1NIX0lNTTgsCi0gIEJGRF9SRUxPQ19TSF9JTU04QlkyLAotICBCRkRfUkVMT0NfU0hfSU1NOEJZNCwKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LAotICBCRkRfUkVMT0NfU0hfU1dJVENIMzIsCi0gIEJGRF9SRUxPQ19TSF9VU0VTLAotICBCRkRfUkVMT0NfU0hfQ09VTlQsCi0gIEJGRF9SRUxPQ19TSF9BTElHTiwKLSAgQkZEX1JFTE9DX1NIX0NPREUsCi0gIEJGRF9SRUxPQ19TSF9EQVRBLAotICBCRkRfUkVMT0NfU0hfTEFCRUwsCi0gIEJGRF9SRUxPQ19TSF9MT09QX1NUQVJULAotICBCRkRfUkVMT0NfU0hfTE9PUF9FTkQsCi0KLS8qIFRodW1iIDIzLSwgMTItIGFuZCA5LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2hlcy4gIFRoZSBsb3dlc3QgYml0IG11c3QKLWJlIHplcm8gYW5kIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsCi0KLS8qIEFyZ29uYXV0IFJJU0MgQ29yZSAoQVJDKSByZWxvY3MuCi1BUkMgMjIgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjAgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjYKLXRocm91Z2ggNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLAotCi0vKiBBUkMgMjYgYml0IGFic29sdXRlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUgbm90Ci1zdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjQgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjMKLXRocm91Z2ggMC4gKi8KLSAgQkZEX1JFTE9DX0FSQ19CMjYsCi0KLS8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi1UaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLAotCi0vKiBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHJlbG9jCi1leGNlcHQgaXQgaXMgaW4gdGhlIGxlZnQgY29udGFpbmVyLCBpLmUuLAotc2hpZnRlZCBsZWZ0IDE1IGJpdHMuICovCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xOCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMLAotCi0vKiBNaXRzdWJpc2hpIEQzMFYgcmVsb2NzLgotVGhpcyBpcyBhIDYtYml0IGFic29sdXRlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl82LAotCi0vKiBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlCi1yaWdodCAzIGJpdHNhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1LAotCi0vKiBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzIxLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMzItYml0IGFic29sdXRlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl8zMiwKLQotLyogVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgTTMyUiByZWxvY3MuCi1UaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuICovCi0gIEJGRF9SRUxPQ19NMzJSXzI0LAotCi0vKiBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkLiAqLwotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8sCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLiAqLwotICBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0KLS8qIFRoaXMgaXMgYSA5LWJpdCByZWxvYyAqLwotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMjItYml0IHJlbG9jICovCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYW4gOGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNyBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLWJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCi0KLQotLyogVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2Yml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG9wY29kZS4gKi8KLSAgQkZEX1JFTE9DX1RJQzMwX0xEUCwKLQotLyogVGhpcyBpcyBhIDdiaXQgcmVsb2MgZm9yIHRoZSB0bXMzMjBjNTR4LCB3aGVyZSB0aGUgbGVhc3QKLXNpZ25pZmljYW50IDcgYml0cyBvZiBhIDE2IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLXNpZ25pZmljYW50IDcgYml0cyBvZiB0aGUgb3Bjb2RlLiAqLwotICBCRkRfUkVMT0NfVElDNTRYX1BBUlRMUzcsCi0KLS8qIFRoaXMgaXMgYSA5Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzU0eCwgd2hlcmUgdGhlIG1vc3QKLXNpZ25pZmljYW50IDkgYml0cyBvZiBhIDE2IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLXNpZ25pZmljYW50IDkgYml0cyBvZiB0aGUgb3Bjb2RlLiAqLwotICBCRkRfUkVMT0NfVElDNTRYX1BBUlRNUzksCi0KLS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgYWRkcmVzcyAyMy1iaXQgcmVsb2MgZm9yIHRoZSB0bXMzMjBjNTR4LiAqLwotICBCRkRfUkVMT0NfVElDNTRYXzIzLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGZvciB0aGUgdG1zMzIwYzU0eCwgd2hlcmUgdGhlIGxlYXN0IAotc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBhIDIzLWJpdCBleHRlbmRlZCBhZGRyZXNzIGFyZSBwbGFjZWQgaW50byAKLXRoZSBvcGNvZGUuICovCi0gIEJGRF9SRUxPQ19USUM1NFhfMTZfT0ZfMjMsCi0KLS8qIFRoaXMgaXMgYSByZWxvYyBmb3IgdGhlIHRtczMyMGM1NHgsIHdoZXJlIHRoZSBtb3N0Ci1zaWduaWZpY2FudCA3IGJpdHMgb2YgYSAyMy1iaXQgZXh0ZW5kZWQgYWRkcmVzcyBhcmUgcGxhY2VkIGludG8gCi10aGUgb3Bjb2RlLiAqLwotICBCRkRfUkVMT0NfVElDNTRYX01TN19PRl8yMywKLQotLyogVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfNDgsCi0KLS8qIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotdHdvIHNlY3Rpb25zLiAqLwotICBCRkRfUkVMT0NfRlIzMF8yMCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA2IGJpdCB3b3JkIG9mZnNldCBpbgotNCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF82X0lOXzQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byAxMSBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwKLQotLyogTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgcGMgcmVsYXRpdmUKLXNob3J0IG9mZnNldCBpbnRvIDcgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0FWUl83X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDEzIGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gMTIgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0FWUl8xM19QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyAxNyBiaXQgdmFsdWUgKHVzdWFsbHkKLXByb2dyYW0gbWVtb3J5IGFkZHJlc3MpIGludG8gMTYgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0FWUl8xNl9QTSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAodXN1YWxseQotZGF0YSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfTE84X0xESSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAoaGlnaCA4IGJpdAotb2YgZGF0YSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEk4X0xESSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAobW9zdCBoaWdoIDggYml0Ci1vZiBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLSh1c3VhbGx5IGRhdGEgbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIFNVQkkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX05FRywKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0oaGlnaCA4IGJpdCBvZiBkYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZgotU1VCSSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfTkVHLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLShtb3N0IGhpZ2ggOCBiaXQgb2YgcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUKLW9mIExESSBvciBTVUJJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9ORUcsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKHVzdWFsbHkKLWNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfTE84X0xESV9QTSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAoaGlnaCA4IGJpdAotb2YgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlIChtb3N0IGhpZ2ggOCBiaXQKLW9mIGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0odXN1YWxseSBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIFNVQkkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX1BNX05FRywKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0oaGlnaCA4IGJpdCBvZiAxNiBiaXQgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZQotb2YgU1VCSSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE1fTkVHLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLShoaWdoIDYgYml0IG9mIDIyIGJpdCBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlCi12YWx1ZSBvZiBTVUJJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTV9ORUcsCi0KLS8qIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgMjMgYml0IHZhbHVlCi1pbnRvIDIyIGJpdHMuICovCi0gIEJGRF9SRUxPQ19BVlJfQ0FMTCwKLQotLyogVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mCi10aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotdGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKLXRoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKLWluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLVZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCi1saW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQotcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi1yZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCi0KLVZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKLXZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotdGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAotZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQKLWlzIHN0b3JlZCBpbiB0aGUgcmVsb2MncyBhZGRlbmQuICBGb3IgUmVsIGhvc3RzLCB3ZSBhcmUgZm9yY2VkIHRvIHB1dAotdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuICovCi0gIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwKLSAgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwKLQotLyogSW50ZWwgSUE2NCBSZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX0lBNjRfSU1NMTQsCi0gIEJGRF9SRUxPQ19JQTY0X0lNTTIyLAotICBCRkRfUkVMT0NfSUE2NF9JTU02NCwKLSAgQkZEX1JFTE9DX0lBNjRfRElSMzJNU0IsCi0gIEJGRF9SRUxPQ19JQTY0X0RJUjMyTFNCLAotICBCRkRfUkVMT0NfSUE2NF9ESVI2NE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfRElSNjRMU0IsCi0gIEJGRF9SRUxPQ19JQTY0X0dQUkVMMjIsCi0gIEJGRF9SRUxPQ19JQTY0X0dQUkVMNjRJLAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDMyTVNCLAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDMyTFNCLAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDY0TVNCLAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDY0TFNCLAotICBCRkRfUkVMT0NfSUE2NF9MVE9GRjIyLAotICBCRkRfUkVMT0NfSUE2NF9MVE9GRjY0SSwKLSAgQkZEX1JFTE9DX0lBNjRfUExUT0ZGMjIsCi0gIEJGRF9SRUxPQ19JQTY0X1BMVE9GRjY0SSwKLSAgQkZEX1JFTE9DX0lBNjRfUExUT0ZGNjRNU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1BMVE9GRjY0TFNCLAotICBCRkRfUkVMT0NfSUE2NF9GUFRSNjRJLAotICBCRkRfUkVMT0NfSUE2NF9GUFRSMzJNU0IsCi0gIEJGRF9SRUxPQ19JQTY0X0ZQVFIzMkxTQiwKLSAgQkZEX1JFTE9DX0lBNjRfRlBUUjY0TVNCLAotICBCRkRfUkVMT0NfSUE2NF9GUFRSNjRMU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1BDUkVMMjFCLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDIxQkksCi0gIEJGRF9SRUxPQ19JQTY0X1BDUkVMMjFNLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDIxRiwKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUwyMiwKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUw2MEIsCi0gIEJGRF9SRUxPQ19JQTY0X1BDUkVMNjRJLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDMyTVNCLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDMyTFNCLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDY0TVNCLAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDY0TFNCLAotICBCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSMjIsCi0gIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX0ZQVFI2NEksCi0gIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX0ZQVFI2NE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkZfRlBUUjY0TFNCLAotICBCRkRfUkVMT0NfSUE2NF9TRUdCQVNFLAotICBCRkRfUkVMT0NfSUE2NF9TRUdSRUwzMk1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfU0VHUkVMMzJMU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1NFR1JFTDY0TVNCLAotICBCRkRfUkVMT0NfSUE2NF9TRUdSRUw2NExTQiwKLSAgQkZEX1JFTE9DX0lBNjRfU0VDUkVMMzJNU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1NFQ1JFTDMyTFNCLAotICBCRkRfUkVMT0NfSUE2NF9TRUNSRUw2NE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfU0VDUkVMNjRMU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1JFTDMyTVNCLAotICBCRkRfUkVMT0NfSUE2NF9SRUwzMkxTQiwKLSAgQkZEX1JFTE9DX0lBNjRfUkVMNjRNU0IsCi0gIEJGRF9SRUxPQ19JQTY0X1JFTDY0TFNCLAotICBCRkRfUkVMT0NfSUE2NF9MVFYzMk1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfTFRWMzJMU0IsCi0gIEJGRF9SRUxPQ19JQTY0X0xUVjY0TVNCLAotICBCRkRfUkVMT0NfSUE2NF9MVFY2NExTQiwKLSAgQkZEX1JFTE9DX0lBNjRfSVBMVE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfSVBMVExTQiwKLSAgQkZEX1JFTE9DX0lBNjRfRVBMVE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfRVBMVExTQiwKLSAgQkZEX1JFTE9DX0lBNjRfQ09QWSwKLSAgQkZEX1JFTE9DX0lBNjRfVFBSRUwyMiwKLSAgQkZEX1JFTE9DX0lBNjRfVFBSRUw2NE1TQiwKLSAgQkZEX1JFTE9DX0lBNjRfVFBSRUw2NExTQiwKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkZfVFAyMiwKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkYyMlgsCi0gIEJGRF9SRUxPQ19JQTY0X0xEWE1PViwKLSAgQkZEX1JFTE9DX1VOVVNFRCB9OwotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlOwotcmVsb2NfaG93dG9fdHlwZSAqCi0KLWJmZF9yZWxvY190eXBlX2xvb2t1cCAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lICBQQVJBTVMgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLXR5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQotewotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICBpcyBuZWNlc3Nhcnkgc28gdGhhdCBhIGJhY2sgZW5kIGNhbiB3b3JrIG91dCB3aGF0IGFkZGl0aW9uYWwKLSAgICAgICAgICBpbmZvcm1hdGlvbiAoaW52aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIpIGlzIGNhcnJpZWQKLSAgICAgICAgICB3aXRoIHRoZSBzeW1ib2wuCi0KLSAgICAgICAgICBUaGlzIGZpZWxkIGlzICphbG1vc3QqIHJlZHVuZGFudCwgc2luY2UgeW91IGNhbiB1c2Ugc2VjdGlvbi0+b3duZXIKLSAgICAgICAgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotICAgICAgICAgIGJmZF97YWJzLGNvbSx1bmR9X3NlY3Rpb24uICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IG1ha2luZwotICAgICAgICAgIHRoZXNlIGdsb2JhbHMgYmUgcGVyLWJmZCAob3IgcGVyLXRhcmdldC1mbGF2b3IpLiAgRklYTUUuICovCi0KLSAgc3RydWN0IF9iZmQgKnRoZV9iZmQ7ICAvKiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICovCi0KLSAgICAgICAgLyogVGhlIHRleHQgb2YgdGhlIHN5bWJvbC4gVGhlIG5hbWUgaXMgbGVmdCBhbG9uZSwgYW5kIG5vdCBjb3BpZWQ7IHRoZQotICAgICAgICAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICovCi0gIENPTlNUIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGlzIHJlYWxseSBzaG91bGQgYmUgYSB1bmlvbiBvZiBhCi0gICAgICAgICAgbnVtZXJpYyB2YWx1ZSB3aXRoIGEgcG9pbnRlciwgc2luY2Ugc29tZSBmbGFncyBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKi8KLSAgc3ltdmFsdWUgdmFsdWU7Ci0KLSAgICAgICAgLyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKi8KLQotI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKLSAgICAgICAgICBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9MT0NBTCAgICAgIDB4MDEKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGU7IGluaXRpYWxpemVkIGRhdGEgaW4gPDxDPj4uIFRoZQotICAgICAgICAgIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0dMT0JBTCAgICAgMHgwMgotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotICAgICAgICAgIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0VYUE9SVCAgICAgQlNGX0dMT0JBTCAgLyogbm8gcmVhbCBkaWZmZXJlbmNlICovCi0KLSAgICAgICAgLyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgotICAgICAgICAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKLSAgICAgICAgICA8PEJTRl9HTE9CQUw+PiAqLwotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgcmVjb3JkLiBUaGUgdmFsdWUgaGFzIGFuIGFyYml0YXJ5Ci0gICAgICAgICAgbWVhbmluZywgdW5sZXNzIEJTRl9ERUJVR0dJTkdfUkVMT0MgaXMgYWxzbyBzZXQuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HICAweDA4Ci0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQuICBVc2VkIGluIEVMRiwKLSAgICAgICAgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLQotICAgICAgICAvKiBVc2VkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0KLSAgICAgICAgLyogQSB3ZWFrIGdsb2JhbCBzeW1ib2wsIG92ZXJyaWRhYmxlIHdpdGhvdXQgd2FybmluZ3MgYnkKLSAgICAgICAgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKi8KLSNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLQotICAgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKLSAgICAgICAgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB1c2VkIHRvIGJlIGEgY29tbW9uIHN5bWJvbCwgYnV0IG5vdyBpdCBpcwotICAgICAgICAgIGFsbG9jYXRlZC4gKi8KLSNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0KLSAgICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqLwotI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotCi0gICAgICAgIC8qIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLSAgICAgICAgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCi0gICAgICAgICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0gICAgICAgICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotICAgICAgICAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICovCi0KLSNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqLwotI2RlZmluZSBCU0ZfQ09OU1RSVUNUT1IgICAweDgwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLSAgICAgICAgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLSAgICAgICAgICBpZiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dAotICAgICAgICAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqLwotI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGluZGlyZWN0LiAgVGhpcyBzeW1ib2wgaXMgYW4gaW5kaXJlY3QKLSAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKi8KLSNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0KLSAgICAgICAgLyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLQotICAgICAgICAvKiBTeW1ib2wgaXMgZnJvbSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBCU0ZfRFlOQU1JQyAgICAgICAweDgwMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotICAgICAgICAgIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX09CSkVDVCAgICAgICAgMHgxMDAwMAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gIEJTRl9ERUJVR0dJTkcgc2hvdWxkIGJlIHNldAotICAgICAgICAgIGFzIHdlbGwuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HX1JFTE9DIDB4MjAwMDAKLQotICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLSAgICAgICAgICByZWxhdGl2ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgbm9uIE5VTEwsIHRoZXJlIGFyZSBzcGVjaWFsCi0gICAgICAgICAgc2VjdGlvbnMgZm9yIHVuZGVmaW5lZCBhbmQgYWJzb2x1dGUgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0KLSAgICAgICAgLyogQmFjayBlbmQgc3BlY2lhbCBkYXRhLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBQVFIgcDsKLSAgICAgIGJmZF92bWEgaTsKLSAgICB9IHVkYXRhOwotCi19IGFzeW1ib2w7Ci0jZGVmaW5lIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotYm9vbGVhbiAKLWJmZF9pc19sb2NhbF9sYWJlbCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICpuYW1lKSk7Ci0KLSNkZWZpbmUgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYWJmZCwgbmFtZSkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsXAotICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKLWJvb2xlYW4gCi1iZmRfc2V0X3N5bXRhYiAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCkpOwotCi12b2lkIAotYmZkX3ByaW50X3N5bWJvbF92YW5kZiBQQVJBTVMgKChQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sKSk7Ci0KLSNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wsIChhYmZkLCBwdHIsIHNpemUpKQotaW50IAotYmZkX2RlY29kZV9zeW1jbGFzcyBQQVJBTVMgKChhc3ltYm9sICpzeW1ib2wpKTsKLQotYm9vbGVhbiAKLWJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgIFBBUkFNUyAoKGludCBzeW1jbGFzcykpOwotCi12b2lkIAotYmZkX3N5bWJvbF9pbmZvIFBBUkFNUyAoKGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLXN0cnVjdCBfYmZkIAotewotICAgICAvKiBUaGUgZmlsZW5hbWUgdGhlIGFwcGxpY2F0aW9uIG9wZW5lZCB0aGUgQkZEIHdpdGguICAqLwotICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAKLQotICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqLwotICAgIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOwotCi0gICAgIC8qIFRvIGF2b2lkIGRyYWdnaW5nIHRvbyBtYW55IGhlYWRlciBmaWxlcyBpbnRvIGV2ZXJ5IGZpbGUgdGhhdAotICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0gICAgICAgKiIsIGFuZCBNVElNRSBhcyBhICJsb25nIi4gIFRoZWlyIGNvcnJlY3QgdHlwZXMsIHRvIHdoaWNoIHRoZXkKLSAgICAgICBhcmUgY2FzdCB3aGVuIHVzZWQsIGFyZSAiRklMRSAqIiBhbmQgInRpbWVfdCIuICAgIFRoZSBpb3N0cmVhbQotICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0gICAgICAgQkZEX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhlbiBpb3N0cmVhbSBpcyBhY3R1YWxseSBhIHBvaW50ZXIKLSAgICAgICB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSAgICBQVFIgaW9zdHJlYW07Ci0KLSAgICAgLyogSXMgdGhlIGZpbGUgZGVzY3JpcHRvciBiZWluZyBjYWNoZWQ/ICBUaGF0IGlzLCBjYW4gaXQgYmUgY2xvc2VkIGFzCi0gICAgICAgbmVlZGVkLCBhbmQgcmUtb3BlbmVkIHdoZW4gYWNjZXNzZWQgbGF0ZXI/ICAqLwotCi0gICAgYm9vbGVhbiBjYWNoZWFibGU7Ci0KLSAgICAgLyogTWFya3Mgd2hldGhlciB0aGVyZSB3YXMgYSBkZWZhdWx0IHRhcmdldCBzcGVjaWZpZWQgd2hlbiB0aGUKLSAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLSAgICAgICB0byB1c2UgdG8gY2hvb3NlIHRoZSBiYWNrIGVuZC4gKi8KLQotICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLQotICAgICAvKiBUaGUgY2FjaGluZyByb3V0aW5lcyB1c2UgdGhlc2UgdG8gbWFpbnRhaW4gYQotICAgICAgIGxlYXN0LXJlY2VudGx5LXVzZWQgbGlzdCBvZiBCRkRzICovCi0KLSAgICBzdHJ1Y3QgX2JmZCAqbHJ1X3ByZXYsICpscnVfbmV4dDsKLQotICAgICAvKiBXaGVuIGEgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGNhY2hpbmcgcm91dGluZXMsIEJGRCByZXRhaW5zCi0gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKi8KLQotICAgIGZpbGVfcHRyIHdoZXJlOyAgICAgICAgICAgICAgCi0KLSAgICAgLyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqLwotCi0gICAgYm9vbGVhbiBvcGVuZWRfb25jZTsKLQotICAgICAvKiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLSAgICAgICBnZXR0aW5nIGl0IGZyb20gdGhlIGZpbGUgZWFjaCB0aW1lOiAqLwotCi0gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0KLSAgICAgLyogRmlsZSBtb2RpZmllZCB0aW1lLCBpZiBtdGltZV9zZXQgaXMgdHJ1ZTogKi8KLQotICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotCi0gICAgIC8qIFJlc2VydmVkIGZvciBhbiB1bmltcGxlbWVudGVkIGZpbGUgbG9ja2luZyBleHRlbnNpb24uKi8KLQotICAgIGludCBpZmQ7Ci0KLSAgICAgLyogVGhlIGZvcm1hdCB3aGljaCBiZWxvbmdzIHRvIHRoZSBCRkQuIChvYmplY3QsIGNvcmUsIGV0Yy4pICovCi0KLSAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLQotICAgICAvKiBUaGUgZGlyZWN0aW9uIHRoZSBCRkQgd2FzIG9wZW5lZCB3aXRoKi8KLQotICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfZGlyZWN0aW9uID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2RpcmVjdGlvbiA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLQotICAgICAvKiBGb3JtYXRfc3BlY2lmaWMgZmxhZ3MqLwotCi0gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLQotICAgICAvKiBDdXJyZW50bHkgbXlfYXJjaGl2ZSBpcyB0ZXN0ZWQgYmVmb3JlIGFkZGluZyBvcmlnaW4gdG8KLSAgICAgICBhbnl0aGluZy4gSSBiZWxpZXZlIHRoYXQgdGhpcyBjYW4gYmVjb21lIGFsd2F5cyBhbiBhZGQgb2YKLSAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqLwotCi0gICAgZmlsZV9wdHIgb3JpZ2luOyAgICAgICAgICAgICAKLQotICAgICAvKiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLSAgICAgICBmcm9tIGhhcHBlbmluZy4gKi8KLSAgICBib29sZWFuIG91dHB1dF9oYXNfYmVndW47Ci0KLSAgICAgLyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyovCi0gICAgc3RydWN0IHNlYyAgKnNlY3Rpb25zOwotCi0gICAgIC8qIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLQotICAgICAvKiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3Igb2JqZWN0IGZpbGVzOiAKLSAgICAgICBUaGUgc3RhcnQgYWRkcmVzcy4gKi8KLSAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgLyogVXNlZCBmb3IgaW5wdXQgYW5kIG91dHB1dCovCi0gICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotCi0gICAgIC8qIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqLwotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoqb3V0c3ltYm9sczsgICAgICAgICAgICAgCi0KLSAgICAgLyogUG9pbnRlciB0byBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uKi8KLSAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotCi0gICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBhcmNoaXZlczoqLwotICAgIFBUUiBhcmVsdF9kYXRhOyAgICAgICAgICAgICAgCi0gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICAgLyogVGhlIGNvbnRhaW5pbmcgYXJjaGl2ZSBCRkQuICAqLwotICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgIC8qIFRoZSBuZXh0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICAgLyogVGhlIGZpcnN0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLQotICAgICAvKiBBIGNoYWluIG9mIEJGRCBzdHJ1Y3R1cmVzIGludm9sdmVkIGluIGEgbGluay4gICovCi0gICAgc3RydWN0IF9iZmQgKmxpbmtfbmV4dDsKLQotICAgICAvKiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotICAgICAgIGJlIHVzZWQgb25seSBmb3IgYXJjaGl2ZSBlbGVtZW50cy4gICovCi0gICAgaW50IGFyY2hpdmVfcGFzczsKLQotICAgICAvKiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKi8KLQotICAgIHVuaW9uIAotICAgICAgewotICAgICAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKmFvdXRfZGF0YTsKLSAgICAgIHN0cnVjdCBhcnRkYXRhICphb3V0X2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotICAgICAgc3RydWN0IF9vYXN5c19hcl9kYXRhICpvYXN5c19hcl9kYXRhOwotICAgICAgc3RydWN0IGNvZmZfdGRhdGEgKmNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotICAgICAgc3RydWN0IHhjb2ZmX3RkYXRhICp4Y29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBlY29mZl90ZGF0YSAqZWNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotICAgICAgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgKmllZWVfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0ICpzcmVjX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotICAgICAgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdCAqdGVraGV4X2RhdGE7Ci0gICAgICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqZWxmX29ial9kYXRhOwotICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpib3V0X2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0ICpzdW5fY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnRyYWRfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNvbV9kYXRhX3N0cnVjdCAqc29tX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqaHBwYWJzZF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICpzZ2lfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotICAgICAgc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqb3NmX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCAqY2lzY29fY29yZV9kYXRhOwotICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotICAgICAgc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqbmV0YnNkX2NvcmVfZGF0YTsKLSAgICAgIFBUUiBhbnk7Ci0gICAgICB9IHRkYXRhOwotICAKLSAgICAgLyogVXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gaG9sZCBwcml2YXRlIGRhdGEqLwotICAgIFBUUiB1c3JkYXRhOwotCi0gICAvKiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqLCBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZgotICAgICBvYmphbGxvYy5oLiAgKi8KLSAgICBQVFIgbWVtb3J5OwotfTsKLQotdHlwZWRlZiBlbnVtIGJmZF9lcnJvcgotewotICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotICBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLSAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLSAgYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLAotICBiZmRfZXJyb3Jfbm9fbWVtb3J5LAotICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLSAgYmZkX2Vycm9yX25vX2FybWFwLAotICBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcywKLSAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotICBiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCwKLSAgYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCwKLSAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotICBiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLAotICBiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbiwKLSAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLSAgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLAotICBiZmRfZXJyb3JfZmlsZV90b29fYmlnLAotICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi19IGJmZF9lcnJvcl90eXBlOwotCi1iZmRfZXJyb3JfdHlwZSAKLWJmZF9nZXRfZXJyb3IgIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCAKLWJmZF9zZXRfZXJyb3IgIFBBUkFNUyAoKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZykpOwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgIFBBUkFNUyAoKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZykpOwotCi12b2lkIAotYmZkX3BlcnJvciAgUEFSQU1TICgoQ09OU1QgY2hhciAqbWVzc2FnZSkpOwotCi10eXBlZGVmIHZvaWQgKCpiZmRfZXJyb3JfaGFuZGxlcl90eXBlKSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIAotYmZkX3NldF9lcnJvcl9oYW5kbGVyICBQQVJBTVMgKChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCi1iZmRfZ2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKHZvaWQpKTsKLQotbG9uZyAKLWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOwotCi1sb25nIAotYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjLAotICAgIGFyZWxlbnQgKipsb2MsCi0gICAgYXN5bWJvbCAqKnN5bXMpKTsKLQotdm9pZCAKLWJmZF9zZXRfcmVsb2MKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGFyZWxlbnQgKipyZWwsIHVuc2lnbmVkIGludCBjb3VudCkKLSAgICAKLSAgICApOwotCi1ib29sZWFuIAotYmZkX3NldF9maWxlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc3RhcnRfYWRkcmVzcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgdm1hKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X210aW1lIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1sb25nIAotYmZkX2dldF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1pbnQgCi1iZmRfZ2V0X2dwX3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2dwX3NpemUgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgaSkpOwotCi1iZmRfdm1hIAotYmZkX3NjYW5fdm1hIFBBUkFNUyAoKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpKTsKLQotYm9vbGVhbiAKLWJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLQotI2RlZmluZSBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgb2JmZCkpCi1ib29sZWFuIAotYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLQotI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKLWJvb2xlYW4gCi1iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhhYmZkLCBmbGFncykgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywgXAotICAgICAgICAgICAgICAgKGFiZmQsIGZsYWdzKSkKLSNkZWZpbmUgYmZkX3NpemVvZl9oZWFkZXJzKGFiZmQsIHJlbG9jKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQotCi0jZGVmaW5lIGJmZF9maW5kX25lYXJlc3RfbGluZShhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCi0KLSAgICAgICAgLyogRG8gdGhlc2UgdGhyZWUgZG8gYW55dGhpbmcgdXNlZnVsIGF0IGFsbCwgZm9yIGFueSBiYWNrIGVuZD8gICovCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX3N0YXJ0KGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2VuZChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZShhYmZkLCBzZWN0aW9uKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQotCi0KLSNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zdGF0X2FyY2hfZWx0LChhYmZkLCBzdGF0KSkKLQotI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKLSAgICAgICAgQkZEX1NFTkQgKCBhYmZkLCBfYmZkX3NldF9hcmNoX21hY2gsIChhYmZkLCBhcmNoLCBtYWNoKSkKLQotI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVsYXhfc2VjdGlvbiwgKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pKQotCi0jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nY19zZWN0aW9ucywgKGFiZmQsIGxpbmtfaW5mbykpCi0KLSNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19hZGRfc3ltYm9scywgKGFiZmQsIGluZm8pKQotCi0jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5hbF9saW5rLCAoYWJmZCwgaW5mbykpCi0KLSNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8sIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLCAoYWJmZCwgZmlsZSkpCi0KLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwgKGFiZmQsIGFzeW1ib2xzKSkKLQotI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLCAoYWJmZCwgYXJlbHMsIGFzeW1zKSkKLQotZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICAgICAgICBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLXN5bWluZGV4IAotYmZkX2dldF9uZXh0X21hcGVudCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfYXJjaGl2ZV9oZWFkIFBBUkFNUyAoKGJmZCAqb3V0cHV0LCBiZmQgKm5ld19oZWFkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgYmZkICpwcmV2aW91cykpOwotCi1DT05TVCBjaGFyICoKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1pbnQgCi1iZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotCi0jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAgICAgICAgICAgICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkKLQotI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0jdW5kZWYgQkZEX1NFTkQKLSNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpIDogXAotICAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotI2VuZGlmCi0jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotCi0jaWZkZWYgREVCVUdfQkZEX1NFTkQKLSN1bmRlZiBCRkRfU0VORF9GTVQKLSNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLSAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLSAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotI2VuZGlmCi1lbnVtIGJmZF9mbGF2b3VyIHsKLSAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi19OwotCi1lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotCi0gLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19pbmZvIF9iZmRfbGlua19pbmZvOwotCi10eXBlZGVmIHN0cnVjdCBiZmRfdGFyZ2V0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLSAgZW51bSBiZmRfZW5kaWFuIGJ5dGVvcmRlcjsKLSAgZW51bSBiZmRfZW5kaWFuIGhlYWRlcl9ieXRlb3JkZXI7Ci0gIGZsYWd3b3JkIG9iamVjdF9mbGFnczsgICAgICAgCi0gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0gIGNoYXIgc3ltYm9sX2xlYWRpbmdfY2hhcjsKLSAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLSAgdW5zaWduZWQgc2hvcnQgYXJfbWF4X25hbWVsZW47Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICooKl9iZmRfY2hlY2tfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3NldF9mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9HRU5FUklDKE5BTUUpXAotQ0FUKE5BTUUsX2Nsb3NlX2FuZF9jbGVhbnVwKSxcCi1DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLUNBVChOQU1FLF9uZXdfc2VjdGlvbl9ob29rKSxcCi1DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHMpLFwKLUNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0KLSAgIC8qIENhbGxlZCB3aGVuIHRoZSBCRkQgaXMgYmVpbmcgY2xvc2VkIHRvIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cC4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfY2xvc2VfYW5kX2NsZWFudXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9uZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotICAgLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBiZmRfd2luZG93ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgIC8qIEVudHJ5IHBvaW50cyB0byBjb3B5IHByaXZhdGUgZGF0YS4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUFkoTkFNRSlcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSxcCi1DQVQoTkFNRSxfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpXAotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgLyogQ2FsbGVkIHRvIG1lcmdlIEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSkgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICosIHNlY19wdHIpKTsKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIHN5bWJvbCAKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gc2V0IHByaXZhdGUgYmFja2VuZCBmbGFncyAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9zZXRfcHJpdmF0ZV9mbGFncykgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci0KLSAgIC8qIENhbGxlZCB0byBwcmludCBwcml2YXRlIEJGRCBkYXRhICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotICAgLyogQ29yZSBmaWxlIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUkUoTkFNRSlcCi1DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCksXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgaW50ICAgICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0gICAvKiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUoTkFNRSlcCi1DQVQoTkFNRSxfc2x1cnBfYXJtYXApLFwKLUNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi1DQVQoTkFNRSxfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLUNBVChOQU1FLF90cnVuY2F0ZV9hcm5hbWUpLFwKLUNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotQ0FUKE5BTUUsX3JlYWRfYXJfaGRyKSxcCi1DQVQoTkFNRSxfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSxcCi1DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotQ0FUKE5BTUUsX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCksXAotQ0FUKE5BTUUsX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApCi0gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSkKLSAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0gIHZvaWQgICAgICgqX2JmZF90cnVuY2F0ZV9hcm5hbWUpIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGNoYXIgKikpOwotICBib29sZWFuICAoKndyaXRlX2FybWFwKSBQQVJBTVMgKChiZmQgKmFyY2gsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3JsICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLSAgUFRSICgqX2JmZF9yZWFkX2FyX2hkcl9mbikgUEFSQU1TICgoYmZkICopKTsKLSAgYmZkICogICAgKCpvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci0jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLSAgYmZkICogICAgKCpfYmZkX2dldF9lbHRfYXRfaW5kZXgpIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotICBpbnQgICAgICAoKl9iZmRfc3RhdF9hcmNoX2VsdCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEVudHJ5IHBvaW50cyB1c2VkIGZvciBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfZ2V0X3N5bXRhYiksXAotQ0FUKE5BTUUsX21ha2VfZW1wdHlfc3ltYm9sKSxcCi1DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi1DQVQoTkFNRSxfZ2V0X3N5bWJvbF9pbmZvKSxcCi1DQVQoTkFNRSxfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpLFwKLUNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi1DQVQoTkFNRSxfZmluZF9uZWFyZXN0X2xpbmUpLFwKLUNBVChOQU1FLF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpLFwKLUNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi1DQVQoTkFNRSxfbWluaXN5bWJvbF90b19zeW1ib2wpCi0gIGxvbmcgICgqX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoKLSAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHZvaWQgICAgICAgICAgKCpfYmZkX3ByaW50X3N5bWJvbCkgUEFSQU1TICgoYmZkICosIFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLSNkZWZpbmUgYmZkX3ByaW50X3N5bWJvbChiLHAscyxlKSBCRkRfU0VORChiLCBfYmZkX3ByaW50X3N5bWJvbCwgKGIscCxzLGUpKQotICB2b2lkICAgICAgICAgICgqX2JmZF9nZXRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9pbmZvICopKTsKLSNkZWZpbmUgYmZkX2dldF9zeW1ib2xfaW5mbyhiLHAsZSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfc3ltYm9sX2luZm8sIChiLHAsZSkpCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLSAgYm9vbGVhbiAgICAoKl9iZmRfZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlYyAqc2VjdGlvbiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbGluZSkpOwotICAvKiBCYWNrLWRvb3IgdG8gYWxsb3cgZm9ybWF0LWF3YXJlIGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgZGVidWcgc3ltYm9scwotICAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICovCi0gIGFzeW1ib2wgKiAgKCpfYmZkX21ha2VfZGVidWdfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgdm9pZCAqcHRyLAotICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotI2RlZmluZSBiZmRfcmVhZF9taW5pc3ltYm9scyhiLCBkLCBtLCBzKSBcCi0gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotICBsb25nICAoKl9yZWFkX21pbmlzeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0gIEJGRF9TRU5EIChiLCBfbWluaXN5bWJvbF90b19zeW1ib2wsIChiLCBkLCBtLCBmKSkKLSAgYXN5bWJvbCAqKCpfbWluaXN5bWJvbF90b19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLQotICAgLyogUm91dGluZXMgZm9yIHJlbG9jcy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfcmVsb2MpLFwKLUNBVChOQU1FLF9iZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGFyZWxlbnQgKiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgIC8qIFNlZSBkb2N1bWVudGF0aW9uIG9uIHJlbG9jIHR5cGVzLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqCi0gICAgICAgKCpyZWxvY190eXBlX2xvb2t1cCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfV1JJVEUoTkFNRSlcCi1DQVQoTkFNRSxfc2V0X2FyY2hfbWFjaCksXAotQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotICBib29sZWFuICAgICgqX2JmZF9zZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0gICAvKiBSb3V0aW5lcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotQ0FUKE5BTUUsX3NpemVvZl9oZWFkZXJzKSxcCi1DQVQoTkFNRSxfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksXAotQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpLFwKLUNBVChOQU1FLF9iZmRfbGlua19hZGRfc3ltYm9scyksXAotQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiksXAotQ0FUKE5BTUUsX2JmZF9nY19zZWN0aW9ucykKLSAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0gIGJmZF9ieXRlICogKCpfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLQotICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICphZ2FpbikpOwotCi0gICAvKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLSAgICAgc2VjdGlvbiBvZiB0aGUgQkZELiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogU2hvdWxkIHRoaXMgc2VjdGlvbiBiZSBzcGxpdCB1cCBpbnRvIHNtYWxsZXIgcGllY2VzIGR1cmluZyBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLSAgIC8qIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqLwotICBib29sZWFuICgqX2JmZF9nY19zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogUm91dGluZXMgdG8gaGFuZGxlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpLFwKLUNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gKi8KLSAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgIC8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0KLSAgLyogT3Bwb3NpdGUgZW5kaWFuIHZlcnNpb24gb2YgdGhpcyB0YXJnZXQuICAqLyAgCi0gY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKiBhbHRlcm5hdGl2ZV90YXJnZXQ7Ci0gCi0gUFRSIGJhY2tlbmRfZGF0YTsKLSAKLX0gYmZkX3RhcmdldDsKLWJvb2xlYW4gCi1iZmRfc2V0X2RlZmF1bHRfdGFyZ2V0ICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotYmZkX2ZpbmRfdGFyZ2V0IFBBUkFNUyAoKENPTlNUIGNoYXIgKnRhcmdldF9uYW1lLCBiZmQgKmFiZmQpKTsKLQotY29uc3QgY2hhciAqKgotYmZkX3RhcmdldF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotY29uc3QgYmZkX3RhcmdldCAqIAotYmZkX3NlYXJjaF9mb3JfdGFyZ2V0ICBQQVJBTVMgKChpbnQgKCogc2VhcmNoX2Z1bmMpKGNvbnN0IGJmZF90YXJnZXQgKiwgdm9pZCAqKSwgdm9pZCAqKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0LCBjaGFyICoqKm1hdGNoaW5nKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgUEFSQU1TICgoYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC5jIGIvYmZkL2JmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQxNzJmLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExODMgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgbGlicmFyeSBpbnRlcmZhY2UgYW5kIHN1cHBvcnQgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JPDx0eXBlZGVmIGJmZD4+Ci0KLQlBIEJGRCBoYXMgdHlwZSA8PGJmZD4+OyBvYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgdGhlCi0JY29ybmVyc3RvbmUgb2YgYW55IGFwcGxpY2F0aW9uIHVzaW5nIEJGRC4gVXNpbmcgQkZECi0JY29uc2lzdHMgb2YgbWFraW5nIHJlZmVyZW5jZXMgdGhvdWdoIHRoZSBCRkQgYW5kIHRvIGRhdGEgaW4gdGhlIEJGRC4KLQotCUhlcmUgaXMgdGhlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIHR5cGUgPDxiZmQ+Pi4gIEl0Ci0JY29udGFpbnMgdGhlIG1ham9yIGRhdGEgYWJvdXQgdGhlIGZpbGUgYW5kIHBvaW50ZXJzCi0JdG8gdGhlIHJlc3Qgb2YgdGhlIGRhdGEuCi0KLUNPREVfRlJBR01FTlQKLS4KLS5zdHJ1Y3QgX2JmZCAKLS57Ci0uICAgIHsqIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICp9Ci0uICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQganVtcCB0YWJsZS4gICAgICAgICAgICAgKn0KLS4gICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0uCi0uICAgIHsqIFRvIGF2b2lkIGRyYWdnaW5nIHRvbyBtYW55IGhlYWRlciBmaWxlcyBpbnRvIGV2ZXJ5IGZpbGUgdGhhdAotLiAgICAgICBpbmNsdWRlcyBgPDxiZmQuaD4+JywgSU9TVFJFQU0gaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSAiY2hhcgotLiAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQotLiAgICAgICBhcmUgY2FzdCB3aGVuIHVzZWQsIGFyZSAiRklMRSAqIiBhbmQgInRpbWVfdCIuICAgIFRoZSBpb3N0cmVhbQotLiAgICAgICBpcyB0aGUgcmVzdWx0IG9mIGFuIGZvcGVuIG9uIHRoZSBmaWxlbmFtZS4gIEhvd2V2ZXIsIGlmIHRoZQotLiAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgotLiAgICAgICB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKn0KLS4gICAgUFRSIGlvc3RyZWFtOwotLgotLiAgICB7KiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKLS4gICAgICAgbmVlZGVkLCBhbmQgcmUtb3BlbmVkIHdoZW4gYWNjZXNzZWQgbGF0ZXI/ICAqfQotLgotLiAgICBib29sZWFuIGNhY2hlYWJsZTsKLS4KLS4gICAgeyogTWFya3Mgd2hldGhlciB0aGVyZSB3YXMgYSBkZWZhdWx0IHRhcmdldCBzcGVjaWZpZWQgd2hlbiB0aGUKLS4gICAgICAgQkZEIHdhcyBvcGVuZWQuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbWF0Y2hpbmcgYWxnb3JpdGhtCi0uICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqfQotLgotLiAgICBib29sZWFuIHRhcmdldF9kZWZhdWx0ZWQ7Ci0uCi0uICAgIHsqIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCi0uICAgICAgIGxlYXN0LXJlY2VudGx5LXVzZWQgbGlzdCBvZiBCRkRzICp9Ci0uCi0uICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OwotLgotLiAgICB7KiBXaGVuIGEgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGNhY2hpbmcgcm91dGluZXMsIEJGRCByZXRhaW5zCi0uICAgICAgIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGhlcmU6ICp9Ci0uCi0uICAgIGZpbGVfcHRyIHdoZXJlOyAgICAgICAgICAgICAgCi0uCi0uICAgIHsqIGFuZCBoZXJlOiAoYGBvbmNlJycgbWVhbnMgYXQgbGVhc3Qgb25jZSkgKn0KLS4KLS4gICAgYm9vbGVhbiBvcGVuZWRfb25jZTsKLS4KLS4gICAgeyogU2V0IGlmIHdlIGhhdmUgYSBsb2NhbGx5IG1haW50YWluZWQgbXRpbWUgdmFsdWUsIHJhdGhlciB0aGFuCi0uICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICp9Ci0uCi0uICAgIGJvb2xlYW4gbXRpbWVfc2V0OwotLgotLiAgICB7KiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqfQotLgotLiAgICBsb25nIG10aW1lOyAgICAgICAgICAKLS4KLS4gICAgeyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qfQotLgotLiAgICBpbnQgaWZkOwotLgotLiAgICB7KiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKn0KLS4KLS4gICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0uCi0uICAgIHsqIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqfQotLgotLiAgICBlbnVtIGJmZF9kaXJlY3Rpb24ge25vX2RpcmVjdGlvbiA9IDAsCi0uICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAotLiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2RpcmVjdGlvbiA9IDIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgYm90aF9kaXJlY3Rpb24gPSAzfSBkaXJlY3Rpb247Ci0uCi0uICAgIHsqIEZvcm1hdF9zcGVjaWZpYyBmbGFncyp9Ci0uCi0uICAgIGZsYWd3b3JkIGZsYWdzOyAgICAgICAgICAgICAgCi0uCi0uICAgIHsqIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bwotLiAgICAgICBhbnl0aGluZy4gSSBiZWxpZXZlIHRoYXQgdGhpcyBjYW4gYmVjb21lIGFsd2F5cyBhbiBhZGQgb2YKLS4gICAgICAgb3JpZ2luLCB3aXRoIG9yaWdpbiBzZXQgdG8gMCBmb3Igbm9uIGFyY2hpdmUgZmlsZXMuICAgKn0KLS4KLS4gICAgZmlsZV9wdHIgb3JpZ2luOyAgICAgICAgICAgICAKLS4KLS4gICAgeyogUmVtZW1iZXIgd2hlbiBvdXRwdXQgaGFzIGJlZ3VuLCB0byBzdG9wIHN0cmFuZ2UgdGhpbmdzCi0uICAgICAgIGZyb20gaGFwcGVuaW5nLiAqfQotLiAgICBib29sZWFuIG91dHB1dF9oYXNfYmVndW47Ci0uCi0uICAgIHsqIFBvaW50ZXIgdG8gbGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMqfQotLiAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7Ci0uCi0uICAgIHsqIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgKn0KLS4gICAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0uCi0uICAgIHsqIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAotLiAgICAgICBUaGUgc3RhcnQgYWRkcmVzcy4gKn0KLS4gICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotLgotLiAgICB7KiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Kn0KLS4gICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotLgotLiAgICB7KiBTeW1ib2wgdGFibGUgZm9yIG91dHB1dCBCRkQgKHdpdGggc3ltY291bnQgZW50cmllcykgKn0KLS4gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKLS4KLS4gICAgeyogUG9pbnRlciB0byBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uKn0KLS4gICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hfaW5mbzsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOip9Ci0uICAgIFBUUiBhcmVsdF9kYXRhOyAgICAgICAgICAgICAgCi0uICAgIHN0cnVjdCBfYmZkICpteV9hcmNoaXZlOyAgICAgeyogVGhlIGNvbnRhaW5pbmcgYXJjaGl2ZSBCRkQuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbmV4dDsgICAgICAgICAgIHsqIFRoZSBuZXh0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICphcmNoaXZlX2hlYWQ7ICAgeyogVGhlIGZpcnN0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICp9Ci0uICAgIGJvb2xlYW4gaGFzX2FybWFwOyAgICAgICAgICAgCi0uCi0uICAgIHsqIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmxpbmtfbmV4dDsKLS4KLS4gICAgeyogQSBmaWVsZCB1c2VkIGJ5IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICBUaGlzIHdpbGwKLS4gICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKn0KLS4gICAgaW50IGFyY2hpdmVfcGFzczsKLS4KLS4gICAgeyogVXNlZCBieSB0aGUgYmFjayBlbmQgdG8gaG9sZCBwcml2YXRlIGRhdGEuICp9Ci0uCi0uICAgIHVuaW9uIAotLiAgICAgIHsKLS4gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBhcnRkYXRhICphb3V0X2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IF9vYXN5c19kYXRhICpvYXN5c19vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IGNvZmZfdGRhdGEgKmNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IHBlX3RkYXRhICpwZV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBlY29mZl90ZGF0YSAqZWNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QgKmllZWVfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOwotLiAgICAgIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0ICpzcmVjX2RhdGE7Ci0uICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKmloZXhfZGF0YTsKLS4gICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKLS4gICAgICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqZWxmX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBubG1fb2JqX3RkYXRhICpubG1fb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0ICpzdW5fY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpzY281X2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNvbV9kYXRhX3N0cnVjdCAqc29tX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKmhwdXhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICpzZ2lfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBseW54X2NvcmVfc3RydWN0ICpseW54X2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCAqY2lzY29fY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdCAqdmVyc2Fkb3NfZGF0YTsKLS4gICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOwotLiAgICAgIFBUUiBhbnk7Ci0uICAgICAgfSB0ZGF0YTsKLS4gIAotLiAgICB7KiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSp9Ci0uICAgIFBUUiB1c3JkYXRhOwotLgotLiAgeyogV2hlcmUgYWxsIHRoZSBhbGxvY2F0ZWQgc3R1ZmYgdW5kZXIgdGhpcyBCRkQgZ29lcy4gIFRoaXMgaXMgYQotLiAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCi0uICAgICBvYmphbGxvYy5oLiAgKn0KLS4gICAgUFRSIG1lbW9yeTsKLS59OwotLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotI3VuZGVmIG9ial9zeW1ib2xzCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQwKLS8qIHByb3ZpZGUgc3RvcmFnZSBmb3Igc3Vic3lzdGVtLCBzdGFjayBhbmQgaGVhcCBkYXRhIHdoaWNoIG1heSBoYXZlIGJlZW4KLSAgIHBhc3NlZCBpbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgTGQgcHV0cyB0aGlzIGRhdGEgaW50byBhIGJmZF9saW5rX2luZm8KLSAgIHN0cnVjdCB3aGljaCB1bHRpbWF0ZWx5IGdldHMgcGFzc2VkIGluIHRvIHRoZSBiZmQuICBXaGVuIGl0IGFycml2ZXMsIGNvcHkKLSAgIGl0IHRvIHRoZSBmb2xsb3dpbmcgc3RydWN0IHNvIHRoYXQgdGhlIGRhdGEgd2lsbCBiZSBhdmFpbGFibGUgaW4gY29mZmNvZGUuaAotICAgd2hlcmUgaXQgaXMgbmVlZGVkLiAgVGhlIHR5cGVkZWYncyB1c2VkIGFyZSBkZWZpbmVkIGluIGJmZC5oICovCi0KLQotDAotLyoKLVNFQ1RJT04KLQlFcnJvciByZXBvcnRpbmcKLQotCU1vc3QgQkZEIGZ1bmN0aW9ucyByZXR1cm4gbm9uemVybyBvbiBzdWNjZXNzIChjaGVjayB0aGVpcgotCWluZGl2aWR1YWwgZG9jdW1lbnRhdGlvbiBmb3IgcHJlY2lzZSBzZW1hbnRpY3MpLiAgT24gYW4gZXJyb3IsCi0JdGhleSBjYWxsIDw8YmZkX3NldF9lcnJvcj4+IHRvIHNldCBhbiBlcnJvciBjb25kaXRpb24gdGhhdCBjYWxsZXJzCi0JY2FuIGNoZWNrIGJ5IGNhbGxpbmcgPDxiZmRfZ2V0X2Vycm9yPj4uCi0gICAgICAgIElmIHRoYXQgcmV0dXJucyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LCB0aGVuIGNoZWNrCi0JPDxlcnJubz4+LgotCi0JVGhlIGVhc2llc3Qgd2F5IHRvIHJlcG9ydCBhIEJGRCBlcnJvciB0byB0aGUgdXNlciBpcyB0bwotCXVzZSA8PGJmZF9wZXJyb3I+Pi4KLQotU1VCU0VDVElPTgotCVR5cGUgPDxiZmRfZXJyb3JfdHlwZT4+Ci0KLQlUaGUgdmFsdWVzIHJldHVybmVkIGJ5IDw8YmZkX2dldF9lcnJvcj4+IGFyZSBkZWZpbmVkIGJ5IHRoZQotCWVudW1lcmF0ZWQgdHlwZSA8PGJmZF9lcnJvcl90eXBlPj4uCi0KLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX2Vycm9yCi0uewotLiAgYmZkX2Vycm9yX25vX2Vycm9yID0gMCwKLS4gIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLS4gIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCi0uICBiZmRfZXJyb3Jfbm9fbWVtb3J5LAotLiAgYmZkX2Vycm9yX25vX3N5bWJvbHMsCi0uICBiZmRfZXJyb3Jfbm9fYXJtYXAsCi0uICBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcywKLS4gIGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSwKLS4gIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCwKLS4gIGJmZF9lcnJvcl9ub19jb250ZW50cywKLS4gIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCi0uICBiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9iYWRfdmFsdWUsCi0uICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV90b29fYmlnLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZQotLn0gYmZkX2Vycm9yX3R5cGU7Ci0uCi0qLwotCi1zdGF0aWMgYmZkX2Vycm9yX3R5cGUgYmZkX2Vycm9yID0gYmZkX2Vycm9yX25vX2Vycm9yOwotCi1DT05TVCBjaGFyICpDT05TVCBiZmRfZXJybXNnc1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vIGVycm9yIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiU3lzdGVtIGNhbGwgZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJJbnZhbGlkIGJmZCB0YXJnZXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGluIHdyb25nIGZvcm1hdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgb3BlcmF0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWVtb3J5IGV4aGF1c3RlZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vIHN5bWJvbHMiKSwKLQkJCU5fKCJBcmNoaXZlIGhhcyBubyBpbmRleDsgcnVuIHJhbmxpYiB0byBhZGQgb25lIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk1hbGZvcm1lZCBhcmNoaXZlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTZWN0aW9uIGhhcyBubyBjb250ZW50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vbnJlcHJlc2VudGFibGUgc2VjdGlvbiBvbiBvdXRwdXQiKSwKLQkJCU5fKCJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIpLAotCQkJTl8oIkJhZCB2YWx1ZSIpLAotCQkJTl8oIkZpbGUgdHJ1bmNhdGVkIiksCi0JCQlOXygiRmlsZSB0b28gYmlnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiIzxJbnZhbGlkIGVycm9yIGNvZGU+IikKLSAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9lcnJvcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl90eXBlIGJmZF9nZXRfZXJyb3IgKHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgY3VycmVudCBCRkQgZXJyb3IgY29uZGl0aW9uLgotKi8KLQotYmZkX2Vycm9yX3R5cGUKLWJmZF9nZXRfZXJyb3IgKCkKLXsKLSAgcmV0dXJuIGJmZF9lcnJvcjsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9lcnJvcgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBjb25kaXRpb24gdG8gYmUgQHZhcntlcnJvcl90YWd9LgotKi8KLQotdm9pZAotYmZkX3NldF9lcnJvciAoZXJyb3JfdGFnKQotICAgICBiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWc7Ci17Ci0gIGJmZF9lcnJvciA9IGVycm9yX3RhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Vycm1zZwotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9lcnJtc2cgKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yIEB2YXJ7ZXJyb3JfdGFnfSwgb3IKLQl0aGUgc3lzdGVtIGVycm9yIGlmIEB2YXJ7ZXJyb3JfdGFnfSBpcyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LgotKi8KLQotQ09OU1QgY2hhciAqCi1iZmRfZXJybXNnIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSNpZm5kZWYgZXJybm8KLSAgZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotICBpZiAoZXJyb3JfdGFnID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICByZXR1cm4geHN0cmVycm9yIChlcnJubyk7Ci0KLSAgaWYgKCgoKGludCllcnJvcl90YWcgPChpbnQpIGJmZF9lcnJvcl9ub19lcnJvcikgfHwKLSAgICAgICAoKGludCllcnJvcl90YWcgPiAoaW50KWJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUpKSkKLSAgICBlcnJvcl90YWcgPSBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlOy8qIHNhbml0eSBjaGVjayAqLwotCi0gIHJldHVybiBfKGJmZF9lcnJtc2dzIFsoaW50KWVycm9yX3RhZ10pOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcGVycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfcGVycm9yIChDT05TVCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlQcmludCB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlCi0JbGFzdCBCRkQgZXJyb3IgdGhhdCBvY2N1cnJlZCwgb3IgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGlmCi0JdGhlIGxhc3QgQkZEIGVycm9yIHdhcyBhIHN5c3RlbSBjYWxsIGZhaWx1cmUuICBJZiBAdmFye21lc3NhZ2V9Ci0JaXMgbm9uLU5VTEwgYW5kIG5vbi1lbXB0eSwgdGhlIGVycm9yIHN0cmluZyBwcmludGVkIGlzIHByZWNlZGVkCi0JYnkgQHZhcnttZXNzYWdlfSwgYSBjb2xvbiwgYW5kIGEgc3BhY2UuICBJdCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUuCi0qLwotCi12b2lkCi1iZmRfcGVycm9yIChtZXNzYWdlKQotICAgICBDT05TVCBjaGFyICptZXNzYWdlOwotewotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgcGVycm9yKChjaGFyICopbWVzc2FnZSk7ICAgICAgICAgICAgLyogbXVzdCBiZSBzeXN0ZW0gZXJyb3IgdGhlbi4uLiAqLwotICBlbHNlIHsKLSAgICBpZiAobWVzc2FnZSA9PSBOVUxMIHx8ICptZXNzYWdlID09ICdcMCcpCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIGVsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgbWVzc2FnZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICB9Ci19Ci0KLS8qCi1TVUJTRUNUSU9OCi0JQkZEIGVycm9yIGhhbmRsZXIKLQotCVNvbWUgQkZEIGZ1bmN0aW9ucyB3YW50IHRvIHByaW50IG1lc3NhZ2VzIGRlc2NyaWJpbmcgdGhlCi0JcHJvYmxlbS4gIFRoZXkgY2FsbCBhIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgVGhpcwotCWZ1bmN0aW9uIG1heSBiZSBvdmVycmlkZW4gYnkgdGhlIHByb2dyYW0uCi0KLQlUaGUgQkZEIGVycm9yIGhhbmRsZXIgYWN0cyBsaWtlIHByaW50Zi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0uCi0qLwotCi0vKiBUaGUgcHJvZ3JhbSBuYW1lIHVzZWQgd2hlbiBwcmludGluZyBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqX2JmZF9lcnJvcl9wcm9ncmFtX25hbWU7Ci0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgcm91dGluZSB0byBoYW5kbGUgQkZEIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciBQQVJBTVMgKChjb25zdCBjaGFyICpzLCAuLi4pKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIChjb25zdCBjaGFyICpzLCAuLi4pCi17Ci0gIHZhX2xpc3QgcDsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCwgcyk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZWxzZSAvKiAhIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgKi8KLQotc3RhdGljIHZvaWQgX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKCk7Ci0KLXN0YXRpYyB2b2lkCi1fYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICB2YV9saXN0IHA7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgaWYgKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIkJGRDogIik7Ci0KLSAgdmFfc3RhcnQgKHApOwotCi0gIHMgPSB2YV9hcmcgKHAsIGNvbnN0IGNoYXIgKik7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIHMsIHApOwotCi0gIHZhX2VuZCAocCk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi0vKiBUaGlzIGlzIGEgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcm91dGluZSB3aGljaCBzaG91bGQgaGFuZGxlIEJGRAotICAgZXJyb3IgbWVzc2FnZXMuICBJdCBpcyBjYWxsZWQgd2hlbiBhIEJGRCByb3V0aW5lIGVuY291bnRlcnMgYW4KLSAgIGVycm9yIGZvciB3aGljaCBpdCB3YW50cyB0byBwcmludCBhIG1lc3NhZ2UuICBHb2luZyB0aHJvdWdoIGEKLSAgIGZ1bmN0aW9uIHBvaW50ZXIgcGVybWl0cyBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgQkZEIHRvIGludGVyY2VwdAotICAgdGhlIG1lc3NhZ2VzIGFuZCBkZWFsIHdpdGggdGhlbSBpdHNlbGYuICAqLwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlciA9IF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyOwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yX2hhbmRsZXIKLQotU1lOT1BTSVMKLQliZmRfZXJyb3JfaGFuZGxlcl90eXBlIGJmZF9zZXRfZXJyb3JfaGFuZGxlciAoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBCRkQgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4gIFJldHVybnMgdGhlIHByZXZpb3VzCi0JZnVuY3Rpb24uCi0qLwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlCi1iZmRfc2V0X2Vycm9yX2hhbmRsZXIgKHBuZXcpCi0gICAgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcG5ldzsKLXsKLSAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwb2xkOwotCi0gIHBvbGQgPSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0gIF9iZmRfZXJyb3JfaGFuZGxlciA9IHBuZXc7Ci0gIHJldHVybiBwb2xkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZQotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKGNvbnN0IGNoYXIgKik7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBwcm9ncmFtIG5hbWUgdG8gdXNlIHdoZW4gcHJpbnRpbmcgYSBCRkQgZXJyb3IuICBUaGlzCi0JaXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQKLQlzcGFjZS4gIFRoZSBzdHJpbmcgbXVzdCBub3QgYmUgY2hhbmdlZCBhZnRlciBpdCBpcyBwYXNzZWQgdG8KLQl0aGlzIGZ1bmN0aW9uLgotKi8KLQotdm9pZAotYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lID0gbmFtZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yX2hhbmRsZXIKLQotU1lOT1BTSVMKLQliZmRfZXJyb3JfaGFuZGxlcl90eXBlIGJmZF9nZXRfZXJyb3JfaGFuZGxlciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBCRkQgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9nZXRfZXJyb3JfaGFuZGxlciAoKQotewotICByZXR1cm4gX2JmZF9lcnJvcl9oYW5kbGVyOwotfQotDAotLyoKLVNFQ1RJT04KLQlTeW1ib2xzCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3QpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZQotCXJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHNlY3Rpb24gQHZhcntzZWN0fQotCWF0dGFjaGVkIHRvIGJmZCBAdmFye2FiZmR9LiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuCi0KLSovCi0KLQotbG9uZwotYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkLCBhc2VjdCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfY2Fub25pY2FsaXplX3JlbG9jCi0gICAgICAgIAkoYmZkICphYmZkLAotCQlhc2VjdGlvbiAqc2VjLAotCQlhcmVsZW50ICoqbG9jLAotCQlhc3ltYm9sCSoqc3ltcyk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgYmFjayBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIEJGRAotCUB2YXJ7YWJmZH0gYW5kIHRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIEB2YXJ7c2VjfSBpbnRvIHRoZSBpbnRlcm5hbCBjYW5vbmljYWwKLQlmb3JtLiAgUGxhY2UgdGhlIHRhYmxlIGludG8gbWVtb3J5IGF0IEB2YXJ7bG9jfSwgd2hpY2ggaGFzCi0JYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvCi0JPDxiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kPj4uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvcgotCS0xIG9uIGVycm9yLgotCi0JVGhlIEB2YXJ7c3ltc30gdGFibGUgaXMgYWxzbyBuZWVkZWQgZm9yIGhvcnJpYmxlIGludGVybmFsIG1hZ2ljCi0JcmVhc29ucy4KLQotCi0qLwotbG9uZwotYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0JCSAgIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9yZWxvYwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9yZWxvYwotCSAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCVNldCB0aGUgcmVsb2NhdGlvbiBwb2ludGVyIGFuZCBjb3VudCB3aXRoaW4KLQlzZWN0aW9uIEB2YXJ7c2VjfSB0byB0aGUgdmFsdWVzIEB2YXJ7cmVsfSBhbmQgQHZhcntjb3VudH0uCi0JVGhlIGFyZ3VtZW50IEB2YXJ7YWJmZH0gaXMgaWdub3JlZC4KLQotKi8KLS8qQVJHU1VTRUQqLwotdm9pZAotYmZkX3NldF9yZWxvYyAoaWdub3JlX2FiZmQsIGFzZWN0LCBsb2NhdGlvbiwgY291bnQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci17Ci0gIGFzZWN0LT5vcmVsb2NhdGlvbiA9IGxvY2F0aW9uOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9maWxlX2ZsYWdzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2ZpbGVfZmxhZ3MoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBmbGFnIHdvcmQgaW4gdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZSB2YWx1ZSBAdmFye2ZsYWdzfS4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl93cm9uZ19mb3JtYXQ+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBub3Qgb2Ygb2JqZWN0IGZvcm1hdC4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBUaGUgdGFyZ2V0IGJmZCB3YXMgb3BlbiBmb3IgcmVhZGluZy4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVRoZSBmbGFnIHdvcmQgY29udGFpbmVkIGEgYml0IHdoaWNoIHdhcyBub3QgYXBwbGljYWJsZSB0byB0aGUKLQl0eXBlIG9mIGZpbGUuICBFLmcuLCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHNldCB0aGUgPDxEX1BBR0VEPj4gYml0Ci0Jb24gYSBCRkQgZm9ybWF0IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgZGVtYW5kIHBhZ2luZy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9maWxlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpID0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi1yZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotYmZkX2Fzc2VydCAoZmlsZSwgbGluZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci17Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIiksIGZpbGUsIGxpbmUpOwotfQotCi0vKiBBIG1vcmUgb3IgbGVzcyBmcmllbmRseSBhYm9ydCBtZXNzYWdlLiAgSW4gbGliYmZkLmggYWJvcnQgaXMKLSAgIGRlZmluZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLiAgKi8KLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUKLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKLSNlbmRpZgotCi12b2lkCi1fYmZkX2Fib3J0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZuOwotewotICBpZiAoZm4gIT0gTlVMTCkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgIChfKCJCRkQgaW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIpLAotICAgICAgIGZpbGUsIGxpbmUsIGZuKTsKLSAgZWxzZQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIiksCi0gICAgICAgZmlsZSwgbGluZSk7Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3RhcnRfYWRkcmVzcwotCi1TWU5PUFNJUwotIAlib29sZWFuIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyhiZmQgKmFiZmQsIGJmZF92bWEgdm1hKTsKLQotREVTQ1JJUFRJT04KLQlNYWtlIEB2YXJ7dm1hfSB0aGUgZW50cnkgcG9pbnQgb2Ygb3V0cHV0IEJGRCBAdmFye2FiZmR9LgotCi1SRVRVUk5TCi0JUmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zdGFydF9hZGRyZXNzKGFiZmQsIHZtYSkKLWJmZCAqYWJmZDsKLWJmZF92bWEgdm1hOwotewotICBhYmZkLT5zdGFydF9hZGRyZXNzID0gdm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X210aW1lCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X210aW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIChhcyByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtLCBvcgotCWZyb20gdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhcmNoaXZlIG1lbWJlcnMpLgotCi0qLwotCi1sb25nCi1iZmRfZ2V0X210aW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKGFiZmQtPm10aW1lX3NldCkKLSAgICByZXR1cm4gYWJmZC0+bXRpbWU7Ci0KLSAgZnAgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKDAgIT0gZnN0YXQgKGZpbGVubyAoZnApLCAmYnVmKSkKLSAgICByZXR1cm4gMDsKLQotICBhYmZkLT5tdGltZSA9IGJ1Zi5zdF9tdGltZTsJCS8qIFNhdmUgdmFsdWUgaW4gY2FzZSBhbnlvbmUgd2FudHMgaXQgKi8KLSAgcmV0dXJuIGJ1Zi5zdF9tdGltZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zaXplCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X3NpemUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgc2l6ZSAoYXMgcmVhZCBmcm9tIGZpbGUgc3lzdGVtKSBmb3IgdGhlIGZpbGUKLQlhc3NvY2lhdGVkIHdpdGggQkZEIEB2YXJ7YWJmZH0uCi0KLQlUaGUgaW5pdGlhbCBtb3RpdmF0aW9uIGZvciwgYW5kIHVzZSBvZiwgdGhpcyByb3V0aW5lIGlzIG5vdAotCXNvIHdlIGNhbiBnZXQgdGhlIGV4YWN0IHNpemUgb2YgdGhlIG9iamVjdCB0aGUgQkZEIGFwcGxpZXMgdG8sIHNpbmNlCi0JdGhhdCBtaWdodCBub3QgYmUgZ2VuZXJhbGx5IHBvc3NpYmxlIChhcmNoaXZlIG1lbWJlcnMgZm9yIGV4YW1wbGUpLgotCUl0IHdvdWxkIGJlIGlkZWFsIGlmIHNvbWVvbmUgY291bGQgZXZlbnR1YWxseSBtb2RpZnkKLQlpdCBzbyB0aGF0IHN1Y2ggcmVzdWx0cyB3ZXJlIGd1YXJhbnRlZWQuCi0KLQlJbnN0ZWFkLCB3ZSB3YW50IHRvIGFzayBxdWVzdGlvbnMgbGlrZSAiaXMgdGhpcyBOTk4gYnl0ZSBzaXplZAotCW9iamVjdCBJJ20gYWJvdXQgdG8gdHJ5IHJlYWQgZnJvbSBmaWxlIG9mZnNldCBZWVkgcmVhc29uYWJsZT8iCi0JQXMgYXMgZXhhbXBsZSBvZiB3aGVyZSB3ZSBtaWdodCBkbyB0aGlzLCBzb21lIG9iamVjdCBmb3JtYXRzCi0JdXNlIHN0cmluZyB0YWJsZXMgZm9yIHdoaWNoIHRoZSBmaXJzdCA8PHNpemVvZihsb25nKT4+IGJ5dGVzIG9mIHRoZQotCXRhYmxlIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlIGl0c2VsZiwgaW5jbHVkaW5nIHRoZSBzaXplIGJ5dGVzLgotCUlmIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHJlYWQgd2hhdCBpdCB0aGlua3MgaXMgb25lIG9mIHRoZXNlCi0Jc3RyaW5nIHRhYmxlcywgd2l0aG91dCBzb21lIHdheSB0byB2YWxpZGF0ZSB0aGUgc2l6ZSwgYW5kIGZvcgotCXNvbWUgcmVhc29uIHRoZSBzaXplIGlzIHdyb25nIChieXRlIHN3YXBwaW5nIGVycm9yLCB3cm9uZyBsb2NhdGlvbgotCWZvciB0aGUgc3RyaW5nIHRhYmxlLCBldGMuKSwgdGhlIG9ubHkgY2x1ZSBpcyBsaWtlbHkgdG8gYmUgYSByZWFkCi0JZXJyb3Igd2hlbiBpdCB0cmllcyB0byByZWFkIHRoZSB0YWJsZSwgb3IgYSAidmlydHVhbCBtZW1vcnkKLQlleGhhdXN0ZWQiIGVycm9yIHdoZW4gaXQgdHJpZXMgdG8gYWxsb2NhdGUgMTUgYmF6aWxsb24gYnl0ZXMKLQlvZiBzcGFjZSBmb3IgdGhlIDE1IGJhemlsbG9uIGJ5dGUgdGFibGUgaXQgaXMgYWJvdXQgdG8gcmVhZC4KLQlUaGlzIGZ1bmN0aW9uIGF0IGxlYXN0IGFsbG93cyB1cyB0byBhbnN3ZXIgdGhlIHF1ZXNpb24sICJpcyB0aGUKLQlzaXplIHJlYXNvbmFibGU/Ii4KLSovCi0KLWxvbmcKLWJmZF9nZXRfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBGSUxFICpmcDsKLSAgc3RydWN0IHN0YXQgYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGFiZmQtPmlvc3RyZWFtKS0+c2l6ZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBidWYuc3Rfc2l6ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9nZXRfZ3Bfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUAotCXJlZ2lzdGVyIHVuZGVyIE1JUFMgRUNPRkYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkgdGhlIDw8LUc+PgotCWFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLWludAotYmZkX2dldF9ncF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2dwX3NpemUoYmZkICphYmZkLCBpbnQgaSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgRUNPRkYgb3IgTUlQUyBFTEYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkKLQl0aGUgPDwtRz4+IGFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLXZvaWQKLWJmZF9zZXRfZ3Bfc2l6ZSAoYWJmZCwgaSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaTsKLXsKLSAgLyogRG9uJ3QgdHJ5IHRvIHNldCBHUCBzaXplIG9uIGFuIGFyY2hpdmUgb3IgY29yZSBmaWxlISAqLwotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUgPSBpOwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwX3NpemUgKGFiZmQpID0gaTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZS4gIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSBzb21lIG9mIHRoZQotICAgcmVsb2NhdGlvbiBzcGVjaWFsX2Z1bmN0aW9uIHJvdXRpbmVzIG9uIHRhcmdldHMgd2hpY2ggc3VwcG9ydCBhIEdQCi0gICByZWdpc3Rlci4gICovCi0KLWJmZF92bWEKLV9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQlyZXR1cm4gZWxmX2dwIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlLiAgKi8KLQotdm9pZAotX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIHYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gdjsKLSAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIGVsZl9ncCAoYWJmZCkgPSB2OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl92bWEKLQotU1lOT1BTSVMKLQliZmRfdm1hIGJmZF9zY2FuX3ZtYShDT05TVCBjaGFyICpzdHJpbmcsIENPTlNUIGNoYXIgKiplbmQsIGludCBiYXNlKTsKLQotREVTQ1JJUFRJT04KLQlDb252ZXJ0LCBsaWtlIDw8c3RydG91bD4+LCBhIG51bWVyaWNhbCBleHByZXNzaW9uCi0JQHZhcntzdHJpbmd9IGludG8gYSA8PGJmZF92bWE+PiBpbnRlZ2VyLCBhbmQgcmV0dXJuIHRoYXQgaW50ZWdlci4KLQkoVGhvdWdoIHdpdGhvdXQgYXMgbWFueSBiZWxscyBhbmQgd2hpc3RsZXMgYXMgPDxzdHJ0b3VsPj4uKQotCVRoZSBleHByZXNzaW9uIGlzIGFzc3VtZWQgdG8gYmUgdW5zaWduZWQgKGkuZS4sIHBvc2l0aXZlKS4KLQlJZiBnaXZlbiBhIEB2YXJ7YmFzZX0sIGl0IGlzIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGNvbnZlcnNpb24uCi0JQSBiYXNlIG9mIDAgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byBpbnRlcnByZXQgdGhlIHN0cmluZwotCWluIGhleCBpZiBhIGxlYWRpbmcgIjB4IiBvciAiMFgiIGlzIGZvdW5kLCBvdGhlcndpc2UKLQlpbiBvY3RhbCBpZiBhIGxlYWRpbmcgemVybyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGluIGRlY2ltYWwuCi0KLQlPdmVyZmxvdyBpcyBub3QgZGV0ZWN0ZWQuCi0qLwotCi1iZmRfdm1hCi1iZmRfc2Nhbl92bWEgKHN0cmluZywgZW5kLCBiYXNlKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci0gICAgIENPTlNUIGNoYXIgKiplbmQ7Ci0gICAgIGludCBiYXNlOwotewotICBiZmRfdm1hIHZhbHVlOwotICBpbnQgZGlnaXQ7Ci0KLSAgLyogTGV0IHRoZSBob3N0IGRvIGl0IGlmIHBvc3NpYmxlLiAgKi8KLSAgaWYgKHNpemVvZihiZmRfdm1hKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0gICAgcmV0dXJuIChiZmRfdm1hKSBzdHJ0b3VsIChzdHJpbmcsIChjaGFyICoqKSBlbmQsIGJhc2UpOwotCi0gIC8qIEEgbmVnYXRpdmUgYmFzZSBtYWtlcyBubyBzZW5zZSwgYW5kIHdlIG9ubHkgbmVlZCB0byBnbyBhcyBoaWdoIGFzIGhleC4gICovCi0gIGlmICgoYmFzZSA8IDApIHx8IChiYXNlID4gMTYpKQotICAgIHJldHVybiAoYmZkX3ZtYSkgMDsKLQotICBpZiAoYmFzZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdbMF0gPT0gJzAnKQotCXsKLQkgIGlmICgoc3RyaW5nWzFdID09ICd4JykgfHwgKHN0cmluZ1sxXSA9PSAnWCcpKQotCSAgICBiYXNlID0gMTY7Ci0JICAvKiBYWFggc2hvdWxkIHdlIGFsc28gYWxsb3cgIjBiIiBvciAiMEIiIHRvIHNldCBiYXNlIHRvIDI/ICovCi0JICBlbHNlCi0JICAgIGJhc2UgPSA4OwotCX0KLSAgICAgIGVsc2UKLQliYXNlID0gMTA7Ci0gICAgfQotICBpZiAoKGJhc2UgPT0gMTYpICYmCi0gICAgICAoc3RyaW5nWzBdID09ICcwJykgJiYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpKQotICAgIHN0cmluZyArPSAyOwotICAvKiBYWFggc2hvdWxkIHdlIGFsc28gc2tpcCBvdmVyICIwYiIgb3IgIjBCIiBpZiBiYXNlIGlzIDI/ICovCi0gICAgCi0vKiBTcGVlZCBjb3VsZCBiZSBpbXByb3ZlZCB3aXRoIGEgdGFibGUgbGlrZSBoZXhfdmFsdWVbXSBpbiBnYXMuICAqLwotI2RlZmluZSBIRVhfVkFMVUUoYykgXAotICAoaXN4ZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKQkJCQkJXAotICAgPyAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCVwKLSAgICAgID8gKGMgLSAnMCcpCQkJCQkJXAotICAgICAgOiAoMTAgKyBjIC0gKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpKQlcCi0gICA6IDQyKQotCi0gIGZvciAodmFsdWUgPSAwOyAoZGlnaXQgPSBIRVhfVkFMVUUoKnN0cmluZykpIDwgYmFzZTsgc3RyaW5nKyspCi0gICAgewotICAgICAgdmFsdWUgPSB2YWx1ZSAqIGJhc2UgKyBkaWdpdDsKLSAgICB9Ci0KLSAgaWYgKGVuZCkKLSAgICAqZW5kID0gc3RyaW5nOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUgCi0JdGhlIEJGRCBAdmFye29iZmR9LiAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4KLQlQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoYmZkICppYmZkLCBiZmQgKm9iZmQpOwotCi1ERVNDUklQVElPTgotCU1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgb3V0cHV0IGZpbGUgQkZEIEB2YXJ7b2JmZH0gd2hlbiBsaW5raW5nLiAgUmV0dXJuIDw8dHJ1ZT4+Ci0Jb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgcHJpdmF0ZSBCRkQgZmxhZyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywgXAotLgkJKGFiZmQsIGZsYWdzKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0Jc3R1ZmYKLQotREVTQ1JJUFRJT04KLQlTdHVmZiB3aGljaCBzaG91bGQgYmUgZG9jdW1lbnRlZDoKLQotLiNkZWZpbmUgYmZkX3NpemVvZl9oZWFkZXJzKGFiZmQsIHJlbG9jKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zaXplb2ZfaGVhZGVycywgKGFiZmQsIHJlbG9jKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5kX25lYXJlc3RfbGluZShhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluZF9uZWFyZXN0X2xpbmUsICAoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpKQotLgotLiAgICAgICB7KiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKn0KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX3N0YXJ0KGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2VuZChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZShhYmZkLCBzZWN0aW9uKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIChhYmZkLCBzZWN0aW9uKSkKLS4KLS4KLS4jZGVmaW5lIGJmZF9zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotLgotLiNkZWZpbmUgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaClcCi0uICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotLgotLiNkZWZpbmUgYmZkX3JlbGF4X3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0uCi0uI2RlZmluZSBiZmRfZ2Nfc2VjdGlvbnMoYWJmZCwgbGlua19pbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfYWRkX3N5bWJvbHMoYWJmZCwgaW5mbykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfZmluYWxfbGluayhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9mcmVlX2NhY2hlZF9pbmZvKGFiZmQpIFwKLS4gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoYWJmZCwgZmlsZSlcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoYWJmZCwgYXN5bWJvbHMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyhhYmZkLCBhcmVscywgYXN5bXMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotLgotLmV4dGVybiBiZmRfYnl0ZSAqYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotLglQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLS4JCSAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0uCQkgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmFiZmQyOwotICBiZmRfYnl0ZSAqKCpmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkJCSAgIGFzeW1ib2wgKiopKTsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBhYmZkMiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gICAgICBpZiAoYWJmZDIgPT0gMCkKLQlhYmZkMiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgYWJmZDIgPSBhYmZkOwotICBmbiA9IGFiZmQyLT54dmVjLT5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50czsKLQotICByZXR1cm4gKCpmbikgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKTsKLX0KLQotLyogUmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGFuIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9yZWNvcmRfcGhkciAoYWJmZCwgdHlwZSwgZmxhZ3NfdmFsaWQsIGZsYWdzLCBhdF92YWxpZCwgYXQsCi0JCSBpbmNsdWRlc19maWxlaGRyLCBpbmNsdWRlc19waGRycywgY291bnQsIHNlY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotICAgICBib29sZWFuIGZsYWdzX3ZhbGlkOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYm9vbGVhbiBhdF92YWxpZDsKLSAgICAgYmZkX3ZtYSBhdDsKLSAgICAgYm9vbGVhbiBpbmNsdWRlc19maWxlaGRyOwotICAgICBib29sZWFuIGluY2x1ZGVzX3BoZHJzOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjczsKLXsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCSAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgKyAoKHNpemVfdCkgY291bnQgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5wX3R5cGUgPSB0eXBlOwotICBtLT5wX2ZsYWdzID0gZmxhZ3M7Ci0gIG0tPnBfcGFkZHIgPSBhdDsKLSAgbS0+cF9mbGFnc192YWxpZCA9IGZsYWdzX3ZhbGlkOwotICBtLT5wX3BhZGRyX3ZhbGlkID0gYXRfdmFsaWQ7Ci0gIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSBpbmNsdWRlc19maWxlaGRyOwotICBtLT5pbmNsdWRlc19waGRycyA9IGluY2x1ZGVzX3BoZHJzOwotICBtLT5jb3VudCA9IGNvdW50OwotICBpZiAoY291bnQgPiAwKQotICAgIG1lbWNweSAobS0+c2VjdGlvbnMsIHNlY3MsIGNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0KLSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotICAgIDsKLSAgKnBtID0gbTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9iaW5hcnkuYyBiL2JmZC9iaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5ODBiMC4uMDAwMDAwMAotLS0gYS9iZmQvYmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBiaW5hcnkgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgYmluYXJ5IG9iamVjdHMuCi0gICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdAotICAgdGhpcyBtYXkgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvCi0gICBnZW5lcmF0ZSByYXcgYmluYXJ5IGRhdGEuCi0KLSAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCi0gICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCi0gICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKLSAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAotICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBBbnkgYmZkIHdlIGNyZWF0ZSBieSByZWFkaW5nIGEgYmluYXJ5IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6Ci0gICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLwotI2RlZmluZSBCSU5fU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIGJpbmFyeV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJpbmFyeV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgbG9uZyBiaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBiaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBiaW5hcnlfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogQ3JlYXRlIGEgYmluYXJ5IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbnkgZmlsZSBtYXkgYmUgY29uc2lkZXJlZCB0byBiZSBhIGJpbmFyeSBmaWxlLCBwcm92aWRlZCB0aGUgdGFyZ2V0Ci0gICB3YXMgbm90IGRlZmF1bHRlZC4gIFRoYXQgaXMsIGl0IG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMKLSAgIGJlaW5nIGJpbmFyeS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJpbmFyeV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIGlmIChhYmZkLT50YXJnZXRfZGVmYXVsdGVkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0gQklOX1NZTVM7Ci0KLSAgLyogRmluZCB0aGUgZmlsZSBzaXplLiAgKi8KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT25lIGRhdGEgc2VjdGlvbi4gICovCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGF0YSIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHNlYy0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT52bWEgPSAwOwotICBzZWMtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgc2VjLT5maWxlcG9zID0gMDsKLQotICBhYmZkLT50ZGF0YS5hbnkgPSAoUFRSKSBzZWM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLSNkZWZpbmUgYmluYXJ5X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBiaW5hcnlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGJpbmFyeV9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLS8qIEdldCBjb250ZW50cyBvZiB0aGUgb25seSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotYmluYXJ5X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKEJJTl9TWU1TICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIENyZWF0ZSBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBiZmQncyBmaWxlbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1hbmdsZV9uYW1lIChhYmZkLCBzdWZmaXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3VmZml4OwotewotICBpbnQgc2l6ZTsKLSAgY2hhciAqYnVmOwotICBjaGFyICpwOwotCi0gIHNpemUgPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkgICsgc3RybGVuIChzdWZmaXgpCi0JICArIHNpemVvZiAiX2JpbmFyeV9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfYmluYXJ5XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLWJpbmFyeV9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBhYmZkLT50ZGF0YS5hbnk7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIEJJTl9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSU5fU1lNUzsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IHN5bXMrKzsKLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIEJJTl9TWU1TOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLWJpbmFyeV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotI2RlZmluZSBiaW5hcnlfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotCi0vKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotYmluYXJ5X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLSNkZWZpbmUgYmluYXJ5X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmluYXJ5X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBiaW5hcnlfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmluYXJ5X2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgYmluYXJ5X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgYmluYXJ5X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIGJpbmFyeV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgYmluYXJ5X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBiaW5hcnlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIG9mIGEgYmluYXJ5IGZpbGUuICAqLwotI2RlZmluZSBiaW5hcnlfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAotCi0vKiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIG9mIGEgYmluYXJ5IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZF9sb3c7Ci0gICAgICBiZmRfdm1hIGxvdzsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBUaGUgbG93ZXN0IHNlY3Rpb24gTE1BIHNldHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgdXNlIHRoaXMgdG8gc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIGFsbCB0aGUKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLSAgICAgIGZvdW5kX2xvdyA9IGZhbHNlOwotICAgICAgbG93ID0gMDsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgoKHMtPmZsYWdzCi0JICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX05FVkVSX0xPQUQpKQotCSAgICAgPT0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICAgICYmICghIGZvdW5kX2xvdyB8fCBzLT5sbWEgPCBsb3cpKQotCSAgewotCSAgICBsb3cgPSBzLT5sbWE7Ci0JICAgIGZvdW5kX2xvdyA9IHRydWU7Ci0JICB9Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIHMtPmZpbGVwb3MgPSBzLT5sbWEgLSBsb3c7Ci0KLQkgIC8qIFNraXAgZm9sbG93aW5nIHdhcm5pbmcgY2hlY2sgZm9yIHNlY3Rpb25zIHRoYXQgd2lsbCBub3QKLQkgICAgIG9jY3VweSBmaWxlIHNwYWNlLiAgKi8gCi0JICBpZiAoKHMtPmZsYWdzCi0JICAgICAgICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCi0JICAgICAgIT0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBhIGJpbmFyeSBmaWxlIGZyb20gYSBiZmQgd2l0aAotCSAgICAgTE1BJ3MgYWxsIG92ZXIgdGhlIHBsYWNlLCBodWdlIChzcGFyc2U/KSBiaW5hcnkgZmlsZXMgbWF5Ci0JICAgICByZXN1bHQuICBUaGlzIGNvbmRpdGlvbiBhdHRlbXB0cyB0byBkZXRlY3QgdGhpcyBzaXR1YXRpb24KLQkgICAgIGFuZCBwcmludCBhIHdhcm5pbmcuICBCZXR0ZXIgaGV1cmlzdGljcyB3b3VsZCBiZSBuaWNlIHRvCi0JICAgICBoYXZlLiAqLwotCi0JICBpZiAocy0+ZmlsZXBvcyA8IDApCi0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgIChfKCJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIiksCi0JICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHMtPmZpbGVwb3MpOwotCX0KLQotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IGFueXRoaW5nIGZvciBhIHNlY3Rpb24gdGhhdCBpcyBuZWl0aGVyCi0gICAgIGxvYWRlZCBub3IgYWxsb2NhdGVkLiAgVGhlIGNvbnRlbnRzIG9mIHN1Y2ggYSBzZWN0aW9uIGFyZSBub3QKLSAgICAgbWVhbmluZ2Z1bCBpbiB0aGUgYmluYXJ5IGZvcm1hdC4gICovCi0gIGlmICgoc2VjLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19ORVZFUl9MT0FEKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotLyogTm8gc3BhY2UgaXMgcmVxdWlyZWQgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWJpbmFyeV9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiaW5hcnlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYmluYXJ5X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjID0KLXsKLSAgImJpbmFyeSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBieXRlb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGJpbmFyeV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiaW5hcnlfbWtvYmplY3QsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX3RydWUsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2JvdXQuYyBiL2JmZC9ib3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzBlMTguLjAwMDAwMDAKLS0tIGEvYmZkL2JvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgYi5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJib3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0KLXN0YXRpYyBpbnQgYWxpZ25jb2RlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBhcmVsZW50ICpyLCB1bnNpZ25lZCBpbnQgc2hyaW5rKSk7Ci1zdGF0aWMgdm9pZCBwZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBiZmRfdm1hIHZhbHVlKSk7Ci1zdGF0aWMgYm9vbGVhbiBiX291dF9zcXVpcnRfb3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYl9vdXRfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY2FsbGp4X2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhcmVsZW50ICosIFBUUiBzcmMsIFBUUiBkc3QsCi0JICAgYXNlY3Rpb24gKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjYWxsal9jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXJlbGVudCAqLCBQVFIgZGF0YSwKLQkgICB1bnNpZ25lZCBpbnQgc3JjaWR4LCB1bnNpZ25lZCBpbnQgZHN0aWR4LCBhc2VjdGlvbiAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYmZkX3ZtYSBnZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgYXNlY3Rpb24gKikpOwotc3RhdGljIGludCBhYnMzMmNvZGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gYl9vdXRfYmZkX3JlbGF4X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKmJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotYm91dF9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX3Rsb2FkICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90bG9hZCk7Ci0gIGV4ZWNwLT5hX2Rsb2FkICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kbG9hZCk7Ci0gIGV4ZWNwLT5hX3RhbGlnbiA9IGJ5dGVzLT5lX3RhbGlnblswXTsKLSAgZXhlY3AtPmFfZGFsaWduID0gYnl0ZXMtPmVfZGFsaWduWzBdOwotICBleGVjcC0+YV9iYWxpZ24gPSBieXRlcy0+ZV9iYWxpZ25bMF07Ci0gIGV4ZWNwLT5hX3JlbGF4YWJsZSA9IGJ5dGVzLT5lX3JlbGF4YWJsZVswXTsKLX0KLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQotICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLwotCi1QUk9UTyh2b2lkLCBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0LAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotdm9pZAotYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Rsb2FkICwgYnl0ZXMtPmVfdGxvYWQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGxvYWQgLCBieXRlcy0+ZV9kbG9hZCk7Ci0gIGJ5dGVzLT5lX3RhbGlnblswXSA9IGV4ZWNwLT5hX3RhbGlnbjsKLSAgYnl0ZXMtPmVfZGFsaWduWzBdID0gZXhlY3AtPmFfZGFsaWduOwotICBieXRlcy0+ZV9iYWxpZ25bMF0gPSBleGVjcC0+YV9iYWxpZ247Ci0gIGJ5dGVzLT5lX3JlbGF4YWJsZVswXSA9IGV4ZWNwLT5hX3JlbGF4YWJsZTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iX291dF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBhbmV4ZWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0KLSAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKTsKLSAgcmV0dXJuIGFvdXRfMzJfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCAmYW5leGVjLCBiX291dF9jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYl9vdXRfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBsb25nIGJzc19zdGFydDsKLQotICAvKiBBcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSAqLwotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLAotCQkgICAgYmZkX2FyY2hfaTk2MCwgLyogQi5vdXQgb25seSB1c2VkIG9uIGk5NjAgKi8KLQkJICAgIGJmZF9tYWNoX2k5NjBfY29yZSAvKiBEZWZhdWx0ICovCi0JCSAgICApOwotCi0gIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGFsaWdubWVudHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfdGFsaWduOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2RhbGlnbjsKLSAgb2JqX2Jzc3NlYyAgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9iYWxpZ247Ci0KLSAgLyogVGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX3Rsb2FkOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0KLSAgLyogQW5kIHJlbG9hZCB0aGUgc2l6ZXMsIHNpbmNlIHRoZSBhb3V0IG1vZHVsZSB6YXBzIHRoZW0gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OwotCi0gIGJzc19zdGFydCA9IGV4ZWNwLT5hX2Rsb2FkICsgZXhlY3AtPmFfZGF0YTsgLyogQlNTID0gZW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gYWxpZ25fcG93ZXIgKGJzc19zdGFydCwgZXhlY3AtPmFfYmFsaWduKTsKLQotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9ICBOX0RST0ZGKCpleGVjcCk7Ci0KLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gMTsJLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgaWYgKGV4ZWNwLT5hX3JlbGF4YWJsZSkKLSAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCB7Ci0gICAgc3RydWN0IGFvdXRkYXRhIGE7Ci0gICAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1iX291dF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0KSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEuYm91dF9kYXRhID0gcmF3cHRyOwotICBleGVjX2hkciAoYWJmZCkgPSAmcmF3cHRyLT5lOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotYl9vdXRfc3ltYm9sX2NtcCAoYSwgYikKLSAgICAgc3RydWN0IGFvdXRfc3ltYm9sICoqYSwgKipiOwotewotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfdm1hIGF2LCBidjsKLQotICAvKiBQcmltYXJ5IGtleSBpcyBhZGRyZXNzICovCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoJigqYSktPnN5bWJvbCk7Ci0gIGF2ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgKCphKS0+c3ltYm9sLnZhbHVlOwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCYoKmIpLT5zeW1ib2wpOwotICBidiA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArICgqYiktPnN5bWJvbC52YWx1ZTsKLQotICBpZiAoYXYgPCBidikKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChhdiA+IGJ2KQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlY29uZGFyeSBrZXkgcHV0cyBDQUxMTkFNRSBzeW1zIGxhc3QgYW5kIEJBTE5BTUUgc3ltcyBmaXJzdCwgc28KLSAgICAgdGhhdCB0aGV5IGhhdmUgdGhlIGJlc3QgY2hhbmNlIG9mIGJlaW5nIGNvbnRpZ3VvdXMuICAqLwotICBpZiAoSVNfQkFMTkFNRSAoKCphKS0+b3RoZXIpIHx8IElTX0NBTExOQU1FICgoKmIpLT5vdGhlcikpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoSVNfQ0FMTE5BTUUgKCgqYSktPm90aGVyKSB8fCBJU19CQUxOQU1FICgoKmIpLT5vdGhlcikpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1iX291dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgc3dhcHBlZF9oZHI7Ci0KLSAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2luZm8gPSBCTUFHSUM7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JzcyA9IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKHN0cnVjdCBubGlzdCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90YWxpZ24gPSBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhbGlnbiA9IG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfYmFsaWduID0gb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGxvYWQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Rsb2FkID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0KLSAgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY19oZHIgKGFiZmQpLCAmc3dhcHBlZF9oZHIpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJnN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHtDQUxMLEJBTH1OQU1FIHN5bWJvbHMgcmVtYWluIGFkamFjZW50IG9uIG91dHB1dAotCSBieSBzb3J0aW5nLiAgVGhpcyBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IHN0YWJzIGFyZQotCSBhbHNvIG9yZGVyZWQuICBTb2x2ZSB0aGlzIGJ5IHNoaWZ0aW5nIGFsbCBzdGFicyB0byB0aGUgZW5kCi0JIGluIG9yZGVyLCB0aGVuIHNvcnRpbmcgdGhlIHJlc3QuICAqLwotCi0gICAgICBhc3ltYm9sICoqb3V0c3ltcywgKipwLCAqKnE7Ci0KLSAgICAgIG91dHN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICAgICAgcCA9IG91dHN5bXMgKyBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICAgICAgZm9yIChxID0gcC0tOyBwID49IG91dHN5bXM7IHAtLSkKLQl7Ci0JICBpZiAoKCpwKS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqdCA9ICotLXE7Ci0JICAgICAgKnEgPSAqcDsKLQkgICAgICAqcCA9IHQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChxID4gb3V0c3ltcykKLQlxc29ydCAob3V0c3ltcywgcSAtIG91dHN5bXMsIHNpemVvZihhc3ltYm9sKiksIGJfb3V0X3N5bWJvbF9jbXApOwotCi0gICAgICAvKiBCYWNrIHRvIHlvdXIgcmVndWxhcmx5IHNjaGVkdWxlZCBwcm9ncmFtLiAgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBhb3V0XzMyX3dyaXRlX3N5bXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIFNvbWUgcmVsb2MgaGFja2VyeSAqLwotCi0jZGVmaW5lIENBTExTCSAgMHg2NjAwMzgwMAkvKiBUZW1wbGF0ZSBmb3IgJ2NhbGxzJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUwJICAweDBiMDAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFsJyBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBCQUxfTUFTSyAgMHgwMGZmZmZmZgotI2RlZmluZSBCQUxYCSAgMHg4NWYwMDAwMAkvKiBUZW1wbGF0ZSBmb3IgJ2JhbHgnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTFhfTUFTSyAweDAwMDdmZmZmCi0jZGVmaW5lIENBTEwgICAgICAweDA5MDAwMDAwCi0jZGVmaW5lIFBDUkVMMTNfTUFTSyAweDFmZmYKLQotCi0jZGVmaW5lIG91dHB1dF9hZGRyKHNlYykgKChzZWMpLT5vdXRwdXRfb2Zmc2V0KyhzZWMpLT5vdXRwdXRfc2VjdGlvbi0+dm1hKQotCi0vKiBNYWdpYyB0byB0dXJuIGNhbGx4IGludG8gY2FsbGp4ICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jYWxsanhfY2FsbGJhY2sgKGFiZmQsIGxpbmtfaW5mbywgcmVsb2NfZW50cnksIHNyYywgZHN0LCBpbnB1dF9zZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgc3JjOwotICAgICBQVFIgZHN0OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMpOwotICBhc3ltYm9sICpzeW1ib2xfaW4gPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IGFvdXRfc3ltYm9sIChzeW1ib2xfaW4pOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvY19lbnRyeSwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICBpZiAoSVNfQ0FMTE5BTUUgKHN5bWJvbC0+b3RoZXIpKQotICAgIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgKmJhbHN5bSA9IHN5bWJvbCsxOwotICAgICAgaW50IGluc3QgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLTQpOwotICAgICAgLyogVGhlIG5leHQgc3ltYm9sIHNob3VsZCBiZSBhbiBOX0JBTE5BTUUgKi8KLSAgICAgIEJGRF9BU1NFUlQgKElTX0JBTE5BTUUgKGJhbHN5bS0+b3RoZXIpKTsKLSAgICAgIGluc3QgJj0gQkFMWF9NQVNLOwotICAgICAgaW5zdCB8PSBCQUxYOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zdCwgKGJmZF9ieXRlICopIGRzdC00KTsKLSAgICAgIHN5bWJvbCA9IGJhbHN5bTsKLSAgICAgIHZhbHVlID0gKHN5bWJvbC0+c3ltYm9sLnZhbHVlCi0JICAgICAgICsgb3V0cHV0X2FkZHIgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24pKTsKLSAgICB9Ci0KLSAgd29yZCArPSB2YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCBkc3QpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLS8qIE1hZ2ljIHRvIHR1cm4gY2FsbCBpbnRvIGNhbGxqICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jYWxsal9jYWxsYmFjayAoYWJmZCwgbGlua19pbmZvLCByZWxvY19lbnRyeSwgIGRhdGEsIHNyY2lkeCwgZHN0aWR4LAotCQlpbnB1dF9zZWN0aW9uLCBzaHJpbmtpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgc3JjaWR4OwotICAgICB1bnNpZ25lZCBpbnQgZHN0aWR4OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiBzaHJpbmtpbmc7Ci17Ci0gIGludCB3b3JkID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBzcmNpZHgpOwotICBhc3ltYm9sICpzeW1ib2xfaW4gPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IGFvdXRfc3ltYm9sIChzeW1ib2xfaW4pOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvY19lbnRyeSwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICBpZiAoSVNfT1RIRVIoc3ltYm9sLT5vdGhlcikpCi0gICAgewotICAgICAgLyogQ2FsbCB0byBhIHN5c3RlbSBwcm9jZWR1cmUgLSByZXBsYWNlIGNvZGUgd2l0aCBzeXN0ZW0KLQkgcHJvY2VkdXJlIG51bWJlci4gICovCi0gICAgICB3b3JkID0gQ0FMTFMgfCAoc3ltYm9sLT5vdGhlciAtIDEpOwotICAgIH0KLSAgZWxzZSBpZiAoSVNfQ0FMTE5BTUUoc3ltYm9sLT5vdGhlcikpCi0gICAgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAqYmFsc3ltID0gc3ltYm9sKzE7Ci0KLSAgICAgIC8qIFRoZSBuZXh0IHN5bWJvbCBzaG91bGQgYmUgYW4gTl9CQUxOQU1FLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQoSVNfQkFMTkFNRShiYWxzeW0tPm90aGVyKSk7Ci0gICAgICAKLSAgICAgIC8qIFdlIGFyZSBjYWxsaW5nIGEgbGVhZiwgc28gcmVwbGFjZSB0aGUgY2FsbCBpbnN0cnVjdGlvbiB3aXRoIGEKLQkgYmFsLiAgKi8KLSAgICAgIHdvcmQgPSBCQUwgfCAoKHdvcmQKLQkJICAgICArIG91dHB1dF9hZGRyIChiYWxzeW0tPnN5bWJvbC5zZWN0aW9uKQotCQkgICAgICsgYmFsc3ltLT5zeW1ib2wudmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0JCSAgICAgLSBkc3RpZHgKLQkJICAgICAtIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJICAgICYgQkFMX01BU0spOwotICAgIH0KLSAgZWxzZSBpZiAoKHN5bWJvbC0+c3ltYm9sLmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEEgY2FsbGogYWdhaW5zdCBhIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uIGlzIGEgZnVsbHkKLSAgICAgICAgIHJlc29sdmVkIHJlbGF0aXZlIGNhbGwuICBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUuCi0gICAgICAgICBJZiB0aGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgc2FtZSBzZWN0aW9uLCBJJ20gbm90IHN1cmUgd2hhdAotICAgICAgICAgdG8gZG87IGZvcnR1bmF0ZWx5LCB0aGlzIGNhc2Ugd2lsbCBwcm9iYWJseSBuZXZlciBhcmlzZS4gICovCi0gICAgICBCRkRfQVNTRVJUICghIHNocmlua2luZyk7Ci0gICAgICBCRkRfQVNTRVJUIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmQgPSBDQUxMIHwgKCgod29yZCAmIEJBTF9NQVNLKQotCQkgICAgICArIHZhbHVlCi0JCSAgICAgICsgcmVsb2NfZW50cnktPmFkZGVuZAotCQkgICAgICAtIChzaHJpbmtpbmcgPyBkc3RpZHggOiAwKQotCQkgICAgICAtIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJICAgICAmIEJBTF9NQVNLKTsKLSAgICB9Ci0gIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgKGJmZF9ieXRlICopIGRhdGEgKyBkc3RpZHgpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiB0eXBlIHJzaGlmdCBzaXplICBiaXRzaXplICAJcGNyZWwJYml0cG9zICBhYnNvbHV0ZSBvdmVyZmxvdyBjaGVjayovCi0KLSNkZWZpbmUgQUJTMzJDT0RFIDAKLSNkZWZpbmUgQUJTMzJDT0RFX1NIUlVOSyAxCi0jZGVmaW5lIFBDUkVMMjQgMgotI2RlZmluZSBDQUxMSiAzCi0jZGVmaW5lIEFCUzMyIDQKLSNkZWZpbmUgUENSRUwxMyA1Ci0jZGVmaW5lIEFCUzMyX01BWUJFX1JFTEFYQUJMRSAxCi0jZGVmaW5lIEFCUzMyX1dBU19SRUxBWEFCTEUgMgotCi0jZGVmaW5lIEFMSUdORVIgMTAKLSNkZWZpbmUgQUxJR05ET05FIDExCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19jYWxsaiA9Ci1IT1dUTyhDQUxMSiwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwiY2FsbGoiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLGZhbHNlKTsKLXN0YXRpYyAgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19hYnMzMiA9Ci1IT1dUTyhBQlMzMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJhYnMzMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19wY3JlbDI0ID0KLUhPV1RPKFBDUkVMMjQsIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwicGNyZWwyNCIsIHRydWUsIDB4MDBmZmZmZmYsMHgwMGZmZmZmZixmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX3BjcmVsMTMgPQotSE9XVE8oUENSRUwxMywgMCwgMiwgMTMsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJwY3JlbDEzIiwgdHJ1ZSwgMHgwMDAwMWZmZiwweDAwMDAxZmZmLGZhbHNlKTsKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19hYnMzMmNvZGVzaHJ1bmsgPQotSE9XVE8oQUJTMzJDT0RFX1NIUlVOSywgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwiY2FsbHgtPmNhbGxqIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZixmYWxzZSk7Ci0KLXN0YXRpYyAgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19hYnMzMmNvZGUgPQotSE9XVE8oQUJTMzJDT0RFLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsImNhbGx4IiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fYWxpZ25fdGFibGVbXSA9IHsKLSAgSE9XVE8gKEFMSUdORVIsIDAsIDB4MSwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJhbGlnbjE2IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORVIsIDAsIDB4MywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJhbGlnbjMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORVIsIDAsIDB4NywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJhbGlnbjY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORVIsIDAsIDB4ZiwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJhbGlnbjEyOCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19kb25lX2FsaWduX3RhYmxlW10gPSB7Ci0gIEhPV1RPIChBTElHTkRPTkUsIDB4MSwgMHgxLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjE2IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHgzLCAweDMsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweDcsIDB4NywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ242NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4ZiwgMHhmLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjEyOCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iX291dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfY2FsbGo7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfYWJzMzI7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUENSRUw6Ci0gICAgICByZXR1cm4gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgYWxsIHRoZSByZWxvYyBlbnRyaWVzLCBwbHVzIHBvaW50ZXJzIHRvIHRoZW0gYWxsICovCi0KLXN0YXRpYyBib29sZWFuCi1iX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJwdHI7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyIDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyIDsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCBjYWxsal9tYXNrLCBsZW5ndGhfc2hpZnQ7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IHNpemVfbWFzazsKLSAgYmZkX3ZtYSBwcmV2X2FkZHIgPSAwOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHNpemVfdCAgcmVsb2Nfc2l6ZTsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghYW91dF8zMl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKSB7Ci0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKSB7Ci0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gMDsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLSBkb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoYXNlY3QtPnJlbF9maWxlcG9zKSwgIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgY291bnQgPSByZWxvY19zaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotICByZWxvY3MgPSAoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jICgoY291bnQrMSkgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKCFyZWxvY19jYWNoZSkgewotICAgIGlmIChyZWxvY3MgIT0gTlVMTCkKLSAgICAgIGZyZWUgKChjaGFyKilyZWxvY3MpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKSB7Ci0gICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgIGlmIChyZWxvY3MgIT0gTlVMTCkKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgLyogYmlnLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHg4MDsKLSAgICBleHRlcm5fbWFzayA9IDB4MTA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDA4OwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBzaXplX21hc2sgPSAgIDB4MjA7Ci0gICAgbGVuZ3RoX3NoaWZ0ID0gNTsKLSAgfSBlbHNlIHsKLSAgICAvKiBsaXR0bGUtZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDAxOwotICAgIGV4dGVybl9tYXNrID0gMHgwODsKLSAgICBpbmNvZGVfbWFzayA9IDB4MTA7Ci0gICAgY2FsbGpfbWFzayAgPSAweDQwOwotICAgIHNpemVfbWFzayAgID0gMHgwMjsKLSAgICBsZW5ndGhfc2hpZnQgPSAxOwotICB9Ci0KLSAgZm9yIChycHRyID0gcmVsb2NzLCBjYWNoZV9wdHIgPSByZWxvY19jYWNoZSwgY291bnRlciA9IDA7Ci0gICAgICAgY291bnRlciA8IGNvdW50OwotICAgICAgIGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKnJhdyA9ICh1bnNpZ25lZCBjaGFyICopcnB0cjsKLSAgICB1bnNpZ25lZCBpbnQgc3ltbnVtOwotICAgIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3ICsgMCk7Ci0gICAgY2FjaGVfcHRyLT5ob3d0byA9IDA7Ci0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgc3ltbnVtID0gKHJhd1s0XSA8PCAxNikgfCAocmF3WzVdIDw8IDgpIHwgcmF3WzZdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3ltbnVtID0gKHJhd1s2XSA8PCAxNikgfCAocmF3WzVdIDw8IDgpIHwgcmF3WzRdOwotICAgIH0KLQotICAgIGlmIChyYXdbN10gJiBleHRlcm5fbWFzaykKLSAgICB7Ci0gICAgICAvKiBpZiB0aGlzIGlzIHNldCB0aGVuIHRoZSByX2luZGV4IGlzIGEgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlOwotICAgICAgICogaWYgdGhlIGJpdCBpcyBub3Qgc2V0IHRoZW4gcl9pbmRleCBjb250YWlucyBhIHNlY3Rpb24gbWFwLgotICAgICAgICogd2UgZWl0aGVyIGZpbGwgaW4gdGhlIHN5bSBlbnRyeSB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLAotICAgICAgICogb3IgcG9pbnQgdG8gdGhlIGNvcnJlY3Qgc2VjdGlvbgotICAgICAgICovCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHN5bW51bTsKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAvKiBpbiBhLm91dCBzeW1ib2xzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICogZmlsZSByYXRoZXIgdGhhbiBzZWN0aW9ucyA/Ci0gICAgICAgKiAobG9vayBpbiB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKQotICAgICAgICogdGhlIHJlbG9jIGVudHJ5IGFkZGVuZCBoYXMgYWRkZWQgdG8gaXQgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAgICogZmlsZSBvZiB0aGUgZGF0YSwgc28gc3VidHJhY3QgdGhlIGJhc2UgdG8gbWFrZSB0aGUgcmVsb2MKLSAgICAgICAqIHNlY3Rpb24gcmVsYXRpdmUgKi8KLSAgICAgIGludCBzOwotICAgICAgewotCS8qIHNpZ24tZXh0ZW5kIHN5bW51bSBmcm9tIDI0IGJpdHMgdG8gd2hhdGV2ZXIgaG9zdCB1c2VzICovCi0JcyA9IHN5bW51bTsKLQlpZiAocyAmICgxIDw8IDIzKSkKLQkgIHMgfD0gKH4wKSA8PCAyNDsKLSAgICAgIH0KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKilOVUxMOwotICAgICAgc3dpdGNoIChzKQotICAgICAgewotICAgICAgIGNhc2UgTl9URVhUOgotICAgICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial90ZXh0c2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fREFUQToKLSAgICAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotCWNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAtIG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0JTUzoKLSAgICAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gIC0gb2JqX2Jzc3NlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9BQlM6Ci0gICAgICAgY2FzZSBOX0FCUyB8IE5fRVhUOgotCWNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIC0yOiAvKiAuYWxpZ24gKi8KLQlpZiAocmF3WzddICYgcGNyZWxfbWFzaykKLQkgIHsKLQkgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19hbGlnbl90YWJsZVsocmF3WzddID4+IGxlbmd0aF9zaGlmdCkgJiAzXTsKLQkgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogLm9yZz8gKi8KLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotCWJyZWFrOwotICAgICAgIGRlZmF1bHQ6Ci0JQkZEX0FTU0VSVCgwKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIHRoZSBpOTYwIG9ubHkgaGFzIGEgZmV3IHJlbG9jYXRpb24gdHlwZXM6Ci0gICAgICAgYWJzIDMyLWJpdCBhbmQgcGNyZWwgMjRiaXQuICAgZXhjZXB0IGZvciBjYWxsaidzISAgKi8KLSAgICBpZiAoY2FjaGVfcHRyLT5ob3d0byAhPSAwKQotICAgICAgOwotICAgIGVsc2UgaWYgKHJhd1s3XSAmIGNhbGxqX21hc2spCi0gICAgewotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19jYWxsajsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHJhd1s3XSAmIHBjcmVsX21hc2spCi0gICAgewotICAgICAgaWYgKHJhd1s3XSAmIHNpemVfbWFzaykKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMTM7Ci0gICAgICBlbHNlCi0gICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19wY3JlbDI0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHJhd1s3XSAmIGluY29kZV9tYXNrKQotICAgICAgewotCWNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCWNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChjYWNoZV9wdHItPmFkZHJlc3MgPCBwcmV2X2FkZHIpCi0gICAgewotICAgICAgLyogT3VjaCEgdGhpcyByZWxvYyBpcyBvdXQgb2Ygb3JkZXIsIGluc2VydCBpbnRvIHRoZSByaWdodCBwbGFjZQotICAgICAgICovCi0gICAgICBhcmVsZW50IHRtcDsKLSAgICAgIGFyZWxlbnQgKmN1cnNvciA9IGNhY2hlX3B0ci0xOwotICAgICAgYmZkX3ZtYSBzdG9wID0gY2FjaGVfcHRyLT5hZGRyZXNzOwotICAgICAgdG1wICA9ICpjYWNoZV9wdHI7Ci0gICAgICB3aGlsZSAoY3Vyc29yLT5hZGRyZXNzID4gc3RvcCAmJiBjdXJzb3IgPj0gcmVsb2NfY2FjaGUpCi0gICAgICB7Ci0JY3Vyc29yWzFdID0gY3Vyc29yWzBdOwotCWN1cnNvci0tOwotICAgICAgfQotICAgICAgY3Vyc29yWzFdID0gdG1wOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJldl9hZGRyID0gY2FjaGVfcHRyLT5hZGRyZXNzOwotICAgIH0KLSAgfQotCi0KLSAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgaW50IHJfZXh0ZXJuID0gMDsKLSAgaW50IHJfaWR4OwotICBpbnQgaW5jb2RlX21hc2s7Ci0gIGludCBsZW5fMTsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IG5hdHNpemUgPSBjb3VudCAqIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0gIGludCBleHRlcm5fbWFzaywgcGNyZWxfbWFzaywgIGxlbl8yLCBjYWxsal9tYXNrOwotICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGdlbmVyaWMgICA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotICBuYXRpdmUgPSAoKHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKikgYmZkX21hbGxvYyAobmF0c2l6ZSkpOwotICBpZiAoIW5hdGl2ZSAmJiBuYXRzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICB7Ci0gICAgLyogQmlnLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHg4MDsKLSAgICBleHRlcm5fbWFzayA9IDB4MTA7Ci0gICAgbGVuXzIgICAgICAgPSAweDQwOwotICAgIGxlbl8xICAgICAgID0gMHgyMDsKLSAgICBjYWxsal9tYXNrICA9IDB4MDI7Ci0gICAgaW5jb2RlX21hc2sgPSAweDA4OwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8qIExpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGxlbl8yICAgICAgID0gMHgwNDsKLSAgICBsZW5fMSAgICAgICA9IDB4MDI7Ci0gICAgY2FsbGpfbWFzayAgPSAweDQwOwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgfQotCi0gIGZvciAobmF0cHRyID0gbmF0aXZlOyBjb3VudCA+IDA7IC0tY291bnQsICsrbmF0cHRyLCArK2dlbmVyaWMpCi0gIHsKLSAgICBhcmVsZW50ICpnID0gKmdlbmVyaWM7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKiluYXRwdHI7Ci0gICAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0KLSAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGctPmFkZHJlc3MsIHJhdyk7Ci0gICAgLyogRmluZCBhIHR5cGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgd2hpY2ggbWF0Y2hlcyB0aGUgaW5wdXQgaG93dG8gLQotICAgICAqIGF0IHRoZSBtb21lbnQgd2UgYXNzdW1lIGlucHV0IGZvcm1hdCA9PSBvdXRwdXQgZm9ybWF0IEZJWE1FISEKLSAgICAgKi8KLSAgICByX2lkeCA9IDA7Ci0gICAgLyogRklYTUU6ICBOZWVkIGNhbGxqIHN0dWZmIGhlcmUsIGFuZCB0byBjaGVjayB0aGUgaG93dG8gZW50cmllcyB0bwotICAgICAgIGJlIHN1cmUgdGhleSBhcmUgcmVhbCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICAqLwotICAgIGlmIChnLT5ob3d0bz09ICZob3d0b19yZWxvY19jYWxsaikKLSAgICB7Ci0gICAgICByYXdbN10gPSBjYWxsal9tYXNrICsgcGNyZWxfbWFzayArIGxlbl8yOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfcGNyZWwyNCkKLSAgICB7Ci0gICAgICByYXdbN10gPSBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDEzKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX2FiczMyY29kZSkKLSAgICB7Ci0gICAgICByYXdbN10gPSBsZW5fMiArIGluY29kZV9tYXNrOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA+PSBob3d0b19hbGlnbl90YWJsZQotCSAgICAgJiYgZy0+aG93dG8gPD0gKGhvd3RvX2FsaWduX3RhYmxlCi0JCQkgICAgKyBzaXplb2YgKGhvd3RvX2FsaWduX3RhYmxlKSAvIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGVbMF0pCi0JCQkgICAgLSAxKSkKLSAgICAgIHsKLQkvKiBzeW1udW0gPT0gLTI7IGV4dGVybl9tYXNrIG5vdCBzZXQsIHBjcmVsX21hc2sgc2V0ICovCi0Jcl9pZHggPSAtMjsKLQlyX2V4dGVybiA9IDA7Ci0JcmF3WzddID0gKHBjcmVsX21hc2sKLQkJICB8ICgoZy0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSkgPDwgMSkpOwotICAgICAgfQotICAgIGVsc2UgewotICAgICAgcmF3WzddID0gbGVuXzI7Ci0gICAgfQotCi0gICAgaWYgKHJfaWR4ICE9IDApCi0gICAgICAvKiBhbHJlYWR5IG11Y2tlZCB3aXRoIHJfZXh0ZXJuLCByX2lkeCAqLzsKLSAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLQkgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLQotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pZHggPSAwOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQotCXJfZXh0ZXJuID0gMTsKLQlyX2lkeCA9ICgqZy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2lkeCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gIDgpOwotICAgICAgcmF3WzZdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgcmF3WzZdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAxNik7Ci0gICAgICByYXdbNV0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4Pj4gIDgpOwotICAgICAgcmF3WzRdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCAgICAgKTsKLSAgICB9Ci0gICAgaWYgKHJfZXh0ZXJuKQotICAgICByYXdbN10gfD0gZXh0ZXJuX21hc2s7Ci0gIH0KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpIHsKLSAgICBmcmVlKChQVFIpbmF0aXZlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZnJlZSAoKFBUUiluYXRpdmUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUgKi8KLXN0YXRpYyBsb25nCi1iX291dF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uID09IE5VTEwKLQkgICYmICEgYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotCXJldHVybiAtMTsKLQotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBsb25nCi1iX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopICogKGFzZWN0LT5yZWxvY19jb3VudCArIDEpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikgKgotCSAgICAoKGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZSAvIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpCi0JICAgICArMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikgKgotCSAgICAoKGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZSAvIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpCi0JICAgICArMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotICAgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotICAgIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIH0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0KLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikJLyogVW5rbm93biBtYWNoaW5lIGFyY2ggaXMgT0sgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfaTk2MCkJLyogaTk2MCBkZWZhdWx0IGlzIE9LICovCi0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9tYzoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfeGE6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfang6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2h4OgotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotYl9vdXRfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJmZF92bWEKLWdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBiZmRfdm1hIHZhbHVlOwotICBhc3ltYm9sICpzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0KLSAgLyogQSBzeW1ib2wgaG9sZHMgYSBwb2ludGVyIHRvIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldCBmcm9tIHRoZQotICAgICBiYXNlIG9mIHRoZSBzZWN0aW9uLiAgVG8gcmVsb2NhdGUsIHdlIGZpbmQgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbAotICAgICBsaXZlIGluIHRoZSBvdXRwdXQgYW5kIGFkZCB0aGF0IGluICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBCRkQuICBMb29rIGl0IHVwIGluIHRoZQotCSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBGSVhNRTogVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCi0JIHdlIGNvbnZlcnQgYi5vdXQgdG8gdXNlIGEgc3BlY2lmaWMgZmluYWxfbGluayBmdW5jdGlvbiBhbmQKLQkgY2hhbmdlIHRoZSBpbnRlcmZhY2UgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8gbm90IHJlcXVpcmUgdGhlCi0JIGdlbmVyaWMgc3ltYm9scy4gICovCi0gICAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoaW5wdXRfc2VjdGlvbi0+b3duZXIsIGxpbmtfaW5mbywKLQkJCQkJYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJCQkJZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JdmFsdWUgPSBoLT51LmRlZi52YWx1ZSArIG91dHB1dF9hZGRyIChoLT51LmRlZi5zZWN0aW9uKTsKLSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl2YWx1ZSA9IGgtPnUuYy5zaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJICBpbnB1dF9zZWN0aW9uLT5vd25lciwgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MsCi0JCSAgdHJ1ZSkpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgb3V0cHV0X2FkZHIgKHN5bWJvbC0+c2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9zbGlwIChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykKLSAgewotICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLSAgICAgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotICAgICAgewotCXAtPnZhbHVlIC09c2xpcDsKLQlpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JICAgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHMrKzsKLQotICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSB3b3JrcyBvdXQgaWYgdGhlIHRoaW5nIHdlIHdhbnQgdG8gZ2V0IHRvIGNhbiBiZQotICAgcmVhY2hlZCB3aXRoIGEgMjRiaXQgb2Zmc2V0IGluc3RlYWQgb2YgYSAzMiBiaXQgb25lLgotICAgSWYgaXQgY2FuLCB0aGVuIGl0IGNoYW5nZXMgdGhlIGFtb2RlICovCi0KLXN0YXRpYyBpbnQKLWFiczMyY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWUgPSBnZXRfdmFsdWUgKHIsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0KLSAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDJeMjMgYnl0ZXMgb2Ygd2hlcmUKLSAgICAgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0gICAgIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0KLQotICBpZiAoLTE8PDIzIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDE8PDIzICkKLSAgewotICAgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDMyYml0Y29kZSBwb3NzaWJsZSAyNCwgdG8gMjRiaXQKLSAgICAgICBwb3NzaWJsZSAzMiAqLwotCi0gICAgci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rOwotICAgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgZm91ciBieXRlcyAqLwotICAgIHItPmFkZHJlc3MgLT00OwotCi0gICAgLyogVGhpcyB3aWxsIGJlIGZvdXIgYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLSAgICBzaHJpbmsgKz0gNCA7Ci0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCByLT5hZGRyZXNzLXNocmluayArIDQpOwotICB9Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotewotICBiZmRfdm1hIGRvdCA9IG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSArIHItPmFkZHJlc3M7Ci0gIGJmZF92bWEgZ2FwOwotICBiZmRfdm1hIG9sZF9lbmQ7Ci0gIGJmZF92bWEgbmV3X2VuZDsKLSAgaW50IHNocmlua19kZWx0YTsKLSAgaW50IHNpemUgPSByLT5ob3d0by0+c2l6ZTsKLQotICAvKiBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGFsaWdubWVudCBzbyB0aGF0IGl0J3Mgc3RpbGwgYWxpZ25lZCBidXQKLSAgICAgc21hbGxlciAgLSB0aGUgY3VycmVudCBzaXplIGlzIGFscmVhZHkgdGhlIHNhbWUgc2l6ZSBhcyBvciBiaWdnZXIKLSAgICAgdGhhbiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwYWRkaW5nIGJlZm9yZSB3ZSBvcHRpbWl6ZSAqLwotICBvbGRfZW5kID0gKChkb3QgKyBzaXplICkgJiB+c2l6ZSkgKyBzaXplKzE7Ci0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBuZXcgZW5kIHdpbGwgYmUgLSByZW1lbWJlciB0aGF0IHdlJ3JlIHNtYWxsZXIKLSAgICAgdGhhbiB3ZSB1c2VkIHRvIGJlICovCi0gIG5ld19lbmQgPSAoKGRvdCAtIHNocmluayArIHNpemUpICYgfnNpemUpOwotCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBlbmQgKi8KLSAgZ2FwID0gb2xkX2VuZCAtICgoZG90ICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgc2hyaW5rX2RlbHRhID0gKG9sZF9lbmQgLSBuZXdfZW5kKSAtIHNocmluazsKLQotICBpZiAoc2hyaW5rX2RlbHRhKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyBzbyB0aGF0IGl0IGtub3dzIGhvdyBmYXIgdG8gYWxpZ24gdG8gKi8KLSAgICByLT5ob3d0byA9IGhvd3RvX2RvbmVfYWxpZ25fdGFibGUgKyAoci0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSk7Ci0KLSAgICAvKiBFbmNvZGUgdGhlIHN0dWZmIGludG8gdGhlIGFkZGVuZCAtIGZvciBmdXR1cmUgdXNlIHdlIG5lZWQgdG8KLSAgICAgICBrbm93IGhvdyBiaWcgdGhlIHJlbG9jIHVzZWQgdG8gYmUgKi8KLSAgICByLT5hZGRlbmQgPSBvbGRfZW5kIC0gZG90ICsgci0+YWRkcmVzczsKLQotICAgIC8qIFRoaXMgd2lsbCBiZSBOIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuLCBhZGp1c3QgYWxsIHRoZSBzeW1ib2xzICovCi0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCBzaHJpbmtfZGVsdGEsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3MgLSBzaHJpbmspOwotICAgIHNocmluayArPSBzaHJpbmtfZGVsdGE7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgc2hyaW5rID0gMCA7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGlucHV0X2JmZCwKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBvbmx5IHJ1biB0aGlzIHJlbGF4YXRpb24gb25jZS4gIEl0IG1pZ2h0IHdvcmsgdG8gcnVuIGl0Ci0gICAgIG11bHRpcGxlIHRpbWVzLCBidXQgaXQgaGFzbid0IGJlZW4gdGVzdGVkLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUpCi0gICAgewotICAgICAgbG9uZyByZWxvY19jb3VudDsKLQotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICAgICAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgICAgIHJlbG9jX2NvdW50ID0KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhcmVsZW50ICoqcGFyZW50OwotCSAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqciA9ICpwYXJlbnQ7Ci0JICAgICAgc3dpdGNoIChyLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFMSUdORVI6Ci0JCSAgLyogQW4gYWxpZ25tZW50IHJlbG9jICovCi0JCSAgc2hyaW5rID0gYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERToKLQkJICAvKiBBIDMyYml0IHJlbG9jIGluIGFuIGFkZHJlc3NpbmcgbW9kZSAqLwotCQkgIHNocmluayA9IGFiczMyY29kZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssCi0JCQkJICAgICAgbGlua19pbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMkNPREVfU0hSVU5LOgotCQkgIHNocmluays9NDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplIC0gc2hyaW5rOwotCi0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1iX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSAxOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgQkZEX0FTU0VSVCAodHJ1ZSA9PSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQlkYXRhLAotCQkJCQkJMCwKLQkJCQkJCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKQotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRyZXNzID49IHNyY19hZGRyZXNzKTsKLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLQotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBBQlMzMkNPREU6Ci0JCSAgY2FsbGp4X2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsCi0JCQkJICAgc3JjX2FkZHJlc3MgKyBkYXRhLCBkc3RfYWRkcmVzcyArIGRhdGEsCi0JCQkJICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzI6Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHNyY19hZGRyZXNzKQotCQkJICAgICAgICsgZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSksCi0JCQkgICAgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgIHNyY19hZGRyZXNzKz00OwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIGJyZWFrOwotCQljYXNlIENBTExKOgotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcywgZHN0X2FkZHJlc3MsIGlucHV0X3NlY3Rpb24sCi0JCQkJICBmYWxzZSk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUxJR05ET05FOgotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPj0gc3JjX2FkZHJlc3MpOwotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPD0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBzcmNfYWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgZHN0X2FkZHJlc3MgPSAoKGRzdF9hZGRyZXNzICsgcmVsb2MtPmhvd3RvLT5zaXplKQotCQkJCSAmIH5yZWxvYy0+aG93dG8tPnNpemUpOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY2FsbHgsIGJ1dCB3ZSd2ZSBmb3VuZCBvdXQgdGhhdCBhCi0JCSAgICAgY2FsbGogd2lsbCByZWFjaCwgc28gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkJICBjYWxsal9jYWxsYmFjayAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIHJlbG9jLCBkYXRhLAotCQkJCSAgc3JjX2FkZHJlc3MgKyA0LCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHRydWUpOwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIHNyY19hZGRyZXNzKz04OwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMjQ6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgfkJBTF9NQVNLKQotCQkJICAgIHwgKCgod29yZCAmIEJBTF9NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKQotCQkJCSsgcmVsb2MtPmFkZGVuZCkKLQkJCSAgICAgICAmIEJBTF9NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBQQ1JFTDEzOgotCQkgIHsKLQkJICAgIGxvbmcgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQlkYXRhICsgc3JjX2FkZHJlc3MpOwotCQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCQkgICAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQkgICAgd29yZCA9ICgod29yZCAmIH5QQ1JFTDEzX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgUENSRUwxM19NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQkrIHJlbG9jLT5hZGRlbmQKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJCSAgICAgICAmIFBDUkVMMTNfTUFTSykpOwotCi0JCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHdvcmQsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgICBkc3RfYWRkcmVzcys9NDsKLQkJICAgIHNyY19hZGRyZXNzKz00OwotCi0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQoKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9ycyBmb3IgQmlnIGFuZCBMaXR0bGUtRW5kaWFuIEIuT1VUIGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYl9vdXRfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiX291dF9iZmRfZ2Nfc2VjdGlvbnMgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdDsKLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQotewotICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLSAgCi0gIChQVFIpIDAsCi19OwotCi0KLWNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0ID0KLXsKLSAgImIub3V0LmxpdHRsZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYl9vdXRfdmVjX2JpZ19ob3N0LAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jYWNoZS5jIGIvYmZkL2NhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYjZjNjEuLjAwMDAwMDAKLS0tIGEvYmZkL2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgLS0gY2FjaGluZyBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgKHN0ZXZlQGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JRmlsZSBjYWNoaW5nCi0KLQlUaGUgZmlsZSBjYWNoaW5nIG1lY2hhbmlzbSBpcyBlbWJlZGRlZCB3aXRoaW4gQkZEIGFuZCBhbGxvd3MKLQl0aGUgYXBwbGljYXRpb24gdG8gb3BlbiBhcyBtYW55IEJGRHMgYXMgaXQgd2FudHMgd2l0aG91dAotCXJlZ2FyZCB0byB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtJ3MgZmlsZSBkZXNjcmlwdG9yCi0JbGltaXQgKG9mdGVuIGFzIGxvdyBhcyAyMCBvcGVuIGZpbGVzKS4gIFRoZSBtb2R1bGUgaW4KLQk8PGNhY2hlLmM+PiBtYWludGFpbnMgYSBsZWFzdCByZWNlbnRseSB1c2VkIGxpc3Qgb2YKLQk8PEJGRF9DQUNIRV9NQVhfT1BFTj4+IGZpbGVzLCBhbmQgZXhwb3J0cyB0aGUgbmFtZQotCTw8YmZkX2NhY2hlX2xvb2t1cD4+LCB3aGljaCBydW5zIGFyb3VuZCBhbmQgbWFrZXMgc3VyZSB0aGF0Ci0JdGhlIHJlcXVpcmVkIEJGRCBpcyBvcGVuLiBJZiBub3QsIHRoZW4gaXQgY2hvb3NlcyBhIGZpbGUgdG8KLQljbG9zZSwgY2xvc2VzIGl0IGFuZCBvcGVucyB0aGUgb25lIHdhbnRlZCwgcmV0dXJuaW5nIGl0cyBmaWxlCi0JaGFuZGxlLiAKLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgdm9pZCBpbnNlcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNuaXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNsb3NlX29uZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBiZmRfY2FjaGVfZGVsZXRlIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCUJGRF9DQUNIRV9NQVhfT1BFTiBtYWNybwotCi1ERVNDUklQVElPTgotCVRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB3aGljaCB0aGUgY2FjaGUgd2lsbCBrZWVwIG9wZW4gYXQKLQlvbmUgdGltZS4KLQotLiNkZWZpbmUgQkZEX0NBQ0hFX01BWF9PUEVOIDEwCi0KLSovCi0KLS8qIFRoZSBudW1iZXIgb2YgQkZEIGZpbGVzIHdlIGhhdmUgb3Blbi4gICovCi0KLXN0YXRpYyBpbnQgb3Blbl9maWxlczsKLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2xhc3RfY2FjaGUKLQotU1lOT1BTSVMKLQlleHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotREVTQ1JJUFRJT04KLQlaZXJvLCBvciBhIHBvaW50ZXIgdG8gdGhlIHRvcG1vc3QgQkZEIG9uIHRoZSBjaGFpbi4gIFRoaXMgaXMKLQl1c2VkIGJ5IHRoZSA8PGJmZF9jYWNoZV9sb29rdXA+PiBtYWNybyBpbiBAZmlsZXtsaWJiZmQuaH0gdG8KLQlkZXRlcm1pbmUgd2hlbiBpdCBjYW4gYXZvaWQgYSBmdW5jdGlvbiBjYWxsLgotKi8KLQotYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotLyoKLSAgSU5URVJOQUxfRlVOQ1RJT04KLSAgCWJmZF9jYWNoZV9sb29rdXAKLSAKLSAgREVTQ1JJUFRJT04KLSAJQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1aXJlZCBCRkQgaXMgdGhlIHNhbWUgYXMgdGhlIGxhc3Qgb25lCi0gCWxvb2tlZCB1cC4gSWYgc28sIHRoZW4gaXQgY2FuIHVzZSB0aGUgc3RyZWFtIGluIHRoZSBCRkQgd2l0aAotIAlpbXB1bml0eSwgc2luY2UgaXQgY2FuJ3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGxvb2t1cDsKLSAJb3RoZXJ3aXNlLCBpdCBoYXMgdG8gcGVyZm9ybSB0aGUgY29tcGxpY2F0ZWQgbG9va3VwIGZ1bmN0aW9uLgotIAotICAuI2RlZmluZSBiZmRfY2FjaGVfbG9va3VwKHgpIFwKLSAgLiAgICAoKHgpPT1iZmRfbGFzdF9jYWNoZT8gXAotICAuICAgICAgKEZJTEUqKShiZmRfbGFzdF9jYWNoZS0+aW9zdHJlYW0pOiBcCi0gIC4gICAgICAgYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoeCkpCi0gCi0gCi0gKi8KLQotLyogSW5zZXJ0IGEgQkZEIGludG8gdGhlIGNhY2hlLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1pbnNlcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9sYXN0X2NhY2hlID09IE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+bHJ1X25leHQgPSBhYmZkOwotICAgICAgYWJmZC0+bHJ1X3ByZXYgPSBhYmZkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFiZmQtPmxydV9uZXh0ID0gYmZkX2xhc3RfY2FjaGU7Ci0gICAgICBhYmZkLT5scnVfcHJldiA9IGJmZF9sYXN0X2NhY2hlLT5scnVfcHJldjsKLSAgICAgIGFiZmQtPmxydV9wcmV2LT5scnVfbmV4dCA9IGFiZmQ7Ci0gICAgICBhYmZkLT5scnVfbmV4dC0+bHJ1X3ByZXYgPSBhYmZkOwotICAgIH0KLSAgYmZkX2xhc3RfY2FjaGUgPSBhYmZkOwotfQotCi0vKiBSZW1vdmUgYSBCRkQgZnJvbSB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXNuaXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+bHJ1X3ByZXYtPmxydV9uZXh0ID0gYWJmZC0+bHJ1X25leHQ7Ci0gIGFiZmQtPmxydV9uZXh0LT5scnVfcHJldiA9IGFiZmQtPmxydV9wcmV2OwotICBpZiAoYWJmZCA9PSBiZmRfbGFzdF9jYWNoZSkKLSAgICB7Ci0gICAgICBiZmRfbGFzdF9jYWNoZSA9IGFiZmQtPmxydV9uZXh0OwotICAgICAgaWYgKGFiZmQgPT0gYmZkX2xhc3RfY2FjaGUpCi0JYmZkX2xhc3RfY2FjaGUgPSBOVUxMOwotICAgIH0KLX0KLQotLyogV2UgbmVlZCB0byBvcGVuIGEgbmV3IGZpbGUsIGFuZCB0aGUgY2FjaGUgaXMgZnVsbC4gIEZpbmQgdGhlIGxlYXN0Ci0gICByZWNlbnRseSB1c2VkIGNhY2hlYWJsZSBCRkQgYW5kIGNsb3NlIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNsb3NlX29uZSAoKQotewotICByZWdpc3RlciBiZmQgKmtpbGw7Ci0KLSAgaWYgKGJmZF9sYXN0X2NhY2hlID09IE5VTEwpCi0gICAga2lsbCA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGtpbGwgPSBiZmRfbGFzdF9jYWNoZS0+bHJ1X3ByZXY7Ci0JICAgISBraWxsLT5jYWNoZWFibGU7Ci0JICAga2lsbCA9IGtpbGwtPmxydV9wcmV2KQotCXsKLQkgIGlmIChraWxsID09IGJmZF9sYXN0X2NhY2hlKQotCSAgICB7Ci0JICAgICAga2lsbCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChraWxsID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIG5vIG9wZW4gY2FjaGVhYmxlIEJGRCdzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBraWxsLT53aGVyZSA9IGZ0ZWxsICgoRklMRSAqKSBraWxsLT5pb3N0cmVhbSk7Ci0KLSAgcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgKGtpbGwpOwotfQotCi0vKiBDbG9zZSBhIEJGRCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNhY2hlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJmZF9jYWNoZV9kZWxldGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKGZjbG9zZSAoKEZJTEUgKikgYWJmZC0+aW9zdHJlYW0pID09IDApCi0gICAgcmV0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJldCA9IGZhbHNlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICB9Ci0KLSAgc25pcCAoYWJmZCk7Ci0KLSAgYWJmZC0+aW9zdHJlYW0gPSBOVUxMOwotICAtLW9wZW5fZmlsZXM7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2NhY2hlX2luaXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jYWNoZV9pbml0IChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUFkZCBhIG5ld2x5IG9wZW5lZCBCRkQgdG8gdGhlIGNhY2hlLgotKi8KLQotYm9vbGVhbgotYmZkX2NhY2hlX2luaXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgQkZEX0FTU0VSVCAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTCk7Ci0gIGlmIChvcGVuX2ZpbGVzID49IEJGRF9DQUNIRV9NQVhfT1BFTikKLSAgICB7Ci0gICAgICBpZiAoISBjbG9zZV9vbmUgKCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaW5zZXJ0IChhYmZkKTsKLSAgKytvcGVuX2ZpbGVzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2NhY2hlX2Nsb3NlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2FjaGVfY2xvc2UgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVtb3ZlIHRoZSBCRkQgQHZhcnthYmZkfSBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGF0dGFjaGVkIGZpbGUgaXMgb3BlbiwKLQl0aGVuIGNsb3NlIGl0IHRvby4KLQotUkVUVVJOUwotCTw8ZmFsc2U+PiBpcyByZXR1cm5lZCBpZiBjbG9zaW5nIHRoZSBmaWxlIGZhaWxzLCA8PHRydWU+PiBpcwotCXJldHVybmVkIGlmIGFsbCBpcyB3ZWxsLgotKi8KLQotYm9vbGVhbgotYmZkX2NhY2hlX2Nsb3NlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5pb3N0cmVhbSA9PSBOVUxMCi0gICAgICB8fCAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIChhYmZkKTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX29wZW5fZmlsZQotCi1TWU5PUFNJUwotCUZJTEUqIGJmZF9vcGVuX2ZpbGUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBPUyB0byBvcGVuIGEgZmlsZSBmb3IgQHZhcnthYmZkfS4gIFJldHVybiB0aGUgPDxGSUxFICo+PgotCShwb3NzaWJseSA8PE5VTEw+PikgdGhhdCByZXN1bHRzIGZyb20gdGhpcyBvcGVyYXRpb24uICBTZXQgdXAgdGhlCi0JQkZEIHNvIHRoYXQgZnV0dXJlIGFjY2Vzc2VzIGtub3cgdGhlIGZpbGUgaXMgb3Blbi4gSWYgdGhlIDw8RklMRSAqPj4KLQlyZXR1cm5lZCBpcyA8PE5VTEw+PiwgdGhlbiBpdCB3b24ndCBoYXZlIGJlZW4gcHV0IGluIHRoZQotCWNhY2hlLCBzbyBpdCB3b24ndCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSBpdC4KLSovCi0KLUZJTEUgKgotYmZkX29wZW5fZmlsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT5jYWNoZWFibGUgPSB0cnVlOwkvKiBBbGxvdyBpdCB0byBiZSBjbG9zZWQgbGF0ZXIuICovCi0KLSAgaWYgKG9wZW5fZmlsZXMgPj0gQkZEX0NBQ0hFX01BWF9PUEVOKQotICAgIHsKLSAgICAgIGlmICghIGNsb3NlX29uZSAoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3dpdGNoIChhYmZkLT5kaXJlY3Rpb24pCi0gICAgewotICAgIGNhc2UgcmVhZF9kaXJlY3Rpb246Ci0gICAgY2FzZSBub19kaXJlY3Rpb246Ci0gICAgICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fUkIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGlmIChhYmZkLT5vcGVuZWRfb25jZSA9PSB0cnVlKQotCXsKLQkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9SVUIpOwotCSAgaWYgKGFiZmQtPmlvc3RyZWFtID09IE5VTEwpCi0JICAgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XVUIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDcmVhdGUgdGhlIGZpbGUuCi0KLQkgICAgIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgd29uJ3QgbGV0IHVzIG92ZXJ3cml0ZSBhIHJ1bm5pbmcKLQkgICAgIGJpbmFyeS4gIEZvciB0aGVtLCB3ZSB3YW50IHRvIHVubGluayB0aGUgZmlsZSBmaXJzdC4KLQotCSAgICAgSG93ZXZlciwgZ2NjIDIuOTUgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIHVzaW5nCi0JICAgICBPX0VYQ0wgYW5kIHRpZ2h0IHBlcm1pc3Npb25zIHRvIHByZXZlbnQgb3RoZXIgdXNlcnMgZnJvbQotCSAgICAgc3Vic3RpdHV0aW5nIG90aGVyIC5vIGZpbGVzIGR1cmluZyB0aGUgY29tcGlsYXRpb24uICBnY2MKLQkgICAgIHdpbGwgdGhlbiB0ZWxsIHRoZSBhc3NlbWJsZXIgdG8gdXNlIHRoZSBuZXdseSBjcmVhdGVkCi0JICAgICBmaWxlIGFzIGFuIG91dHB1dCBmaWxlLiAgSWYgd2UgdW5saW5rIHRoZSBmaWxlIGhlcmUsIHdlCi0JICAgICBvcGVuIGEgYnJpZWYgd2luZG93IHdoZW4gYW5vdGhlciB1c2VyIGNvdWxkIHN0aWxsCi0JICAgICBzdWJzdGl0dXRlIGEgZmlsZS4KLQotCSAgICAgU28gd2UgdW5saW5rIHRoZSBvdXRwdXQgZmlsZSBpZiBhbmQgb25seSBpZiBpdCBoYXMKLQkgICAgIG5vbi16ZXJvIHNpemUuICAqLwotI2lmbmRlZiBfX01TRE9TX18KLQkgIC8qIERvbid0IGRvIHRoaXMgZm9yIE1TRE9TOiBpdCBkb2Vzbid0IGNhcmUgYWJvdXQgb3ZlcndyaXRpbmcKLQkgICAgIGEgcnVubmluZyBiaW5hcnksIGJ1dCBpZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBvcGVuIGJ5Ci0JICAgICBhbm90aGVyIEJGRCwgd2Ugd2lsbCBiZSBpbiBkZWVwIHRyb3VibGUgaWYgd2UgZGVsZXRlIGFuCi0JICAgICBvcGVuIGZpbGUuICBJbiBmYWN0LCBvYmpkdW1wIGRvZXMganVzdCB0aGF0IGlmIGludm9rZWQgd2l0aAotCSAgICAgdGhlIC0taW5mbyBvcHRpb24uICAqLwotCSAgc3RydWN0IHN0YXQgczsKLQotCSAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmcykgPT0gMCAmJiBzLnN0X3NpemUgIT0gMCkKLQkgICAgdW5saW5rIChhYmZkLT5maWxlbmFtZSk7Ci0jZW5kaWYKLQkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XQik7Ci0JICBhYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jYWNoZV9pbml0IChhYmZkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChGSUxFICopIGFiZmQtPmlvc3RyZWFtOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfbG9va3VwX3dvcmtlcgotCi1TWU5PUFNJUwotCUZJTEUgKmJmZF9jYWNoZV9sb29rdXBfd29ya2VyKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIHdoZW4gdGhlIG1hY3JvIDw8YmZkX2NhY2hlX2xvb2t1cD4+IGZhaWxzIHRvIGZpbmQgYQotCXF1aWNrIGFuc3dlci4gIEZpbmQgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIEB2YXJ7YWJmZH0uICBJZgotCW5lY2Vzc2FyeSwgaXQgb3BlbiBpdC4gIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vcmUgdGhhbgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMgb3BlbiwgaXQgdHJpZXMgdG8gY2xvc2Ugb25lIGZpcnN0LCB0bwotCWF2b2lkIHJ1bm5pbmcgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAKLSovCi0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUpIAotICAgIGFiZmQgPSBhYmZkLT5teV9hcmNoaXZlOwotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE1vdmUgdGhlIGZpbGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjYWNoZS4gICovCi0gICAgICBpZiAoYWJmZCAhPSBiZmRfbGFzdF9jYWNoZSkKLQl7Ci0JICBzbmlwIChhYmZkKTsKLQkgIGluc2VydCAoYWJmZCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfb3Blbl9maWxlIChhYmZkKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKGZzZWVrICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSwgYWJmZC0+d2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19CmRpZmYgLS1naXQgYS9iZmQvY2YtaTM4Nmx5bnguYyBiL2JmZC9jZi1pMzg2bHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE0YmRlLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1pMzg2bHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBMeW54T1MgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TWU0JaTM4Nmx5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtaTM4Ni1seW54IgotCi0jZGVmaW5lIExZTlhPUwotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NmLW02OGtseW54LmMgYi9iZmQvY2YtbTY4a2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3NGYxYi4uMDAwMDAwMAotLS0gYS9iZmQvY2YtbTY4a2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTTY4SyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1seW54IgotI2RlZmluZSBMWU5YT1MKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY2Ytc3BhcmNseW54LmMgYi9iZmQvY2Ytc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGEwOTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLXNwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0Jc3BhcmNseW54X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLXNwYXJjLWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zcGFyYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL2Npc2NvLWNvcmUuYyBiL2JmZC9jaXNjby1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTJlNzUuLjAwMDAwMDAKLS0tIGEvYmZkL2Npc2NvLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIENJU0NPIGNyYXNoIGR1bXBzLgotCi1Db3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKiBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcmV0dXJucyBhIGhvc3Qgc2lnbmFsICh0aGlzIHByb2JhYmx5IHNob3VsZAotICAgYmUgZml4ZWQpLiAgKi8KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogZm9yIE1TVkMgYnVpbGRzICovCi0jaWZuZGVmIFNJR1RSQVAKLSMgZGVmaW5lIFNJR1RSQVAgNQotI2VuZGlmCi0jaWZuZGVmIFNJR0VNVAotIyBkZWZpbmUgU0lHRU1UIDYKLSNlbmRpZgotI2lmbmRlZiBTSUdCVVMKLSMgZGVmaW5lIFNJR0JVUyAxMAotI2VuZGlmCi0MCi1pbnQgY3Jhc2hfaW5mb19sb2NzW10gPSB7Ci0gIDB4MDI1MCwJLyogbWlwcywgcHBjLCB4ODYsIGk5NjAgKi8KLSAgMHgwNDAwLAkvKiBtNjhrLCBtaXBzLCB4ODYsIGk5NjAgKi8KLSAgMHgwRkZDLAkvKiBtNjhrLCBtaXBzLCBwcGMsIHg4NiwgaTk2MCAqLwotICAweDMwMDAsCS8qIHBwYyAqLwotICAweDRGRkMsCS8qIG02OGsgKi8KLSAgLTEKLX07Ci0KLSNkZWZpbmUgQ1JBU0hfTUFHSUMJMHhkZWFkMTIzNAotI2RlZmluZSBNQVNLX0FERFIoeCkJKCh4KSAmIDB4MGZmZmZmZmYpCS8qIE1hc2sgY3Jhc2ggaW5mbyBhZGRyZXNzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQgPSAwLAotICAgIENSQVNIX1JFQVNPTl9FWENFUFRJT04gPSAxLAotICAgIENSQVNIX1JFQVNPTl9DT1JSVVBUID0gMiwKLX0gY3Jhc2hyZWFzb247Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciBtYWdpY1s0XTsJCS8qIE1hZ2ljIG51bWJlciAqLwotICBjaGFyIHZlcnNpb25bNF07CQkvKiBWZXJzaW9uIG51bWJlciAqLwotICBjaGFyIHJlYXNvbls0XTsJCS8qIENyYXNoIHJlYXNvbiAqLwotICBjaGFyIGNwdV92ZWN0b3JbNF07CQkvKiBDUFUgdmVjdG9yIGZvciBleGNlcHRpb25zICovCi0gIGNoYXIgcmVnaXN0ZXJzWzRdOwkJLyogUG9pbnRlciB0byBzYXZlZCByZWdpc3RlcnMgKi8KLSAgY2hhciByYW1iYXNlWzRdOwkJLyogQmFzZSBvZiBSQU0gKG5vdCBpbiBWMSBjcmFzaCBpbmZvKSAqLwotICBjaGFyIHRleHRiYXNlWzRdOwkJLyogQmFzZSBvZiAudGV4dCBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLSAgY2hhciBkYXRhYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmRhdGEgc2VjdGlvbiAobm90IGluIFYzIGNyYXNoIGluZm8pICovCi0gIGNoYXIgYnNzYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmJzcyBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLX0gY3Jhc2hpbmZvX2V4dGVybmFsOwotDAotc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0Ci17Ci0gIGludCBzaWc7Ci19OwotDAotLyogRXhhbWluZSB0aGUgZmlsZSBmb3IgYSBjcmFzaCBpbmZvIHN0cnVjdCBhdCB0aGUgb2Zmc2V0IGdpdmVuIGJ5Ci0gICBDUkFTSF9JTkZPX0xPQy4gKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3ZhbGlkYXRlIChhYmZkLCBjcmFzaF9pbmZvX2xvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY3Jhc2hfaW5mb19sb2M7Ci17Ci0gIGNoYXIgYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgY3Jhc2hpbmZvX29mZnNldDsKLSAgY3Jhc2hpbmZvX2V4dGVybmFsIGNyYXNoaW5mbzsKLSAgaW50IG5yZWFkOwotICB1bnNpZ25lZCBpbnQgbWFnaWM7Ci0gIHVuc2lnbmVkIGludCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgcmFtYmFzZTsKLSAgc2VjX3B0ciBhc2VjdDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNyYXNoX2luZm9fbG9jLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkIChidWYsIDEsIDQsIGFiZmQpOwotICBpZiAobnJlYWQgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGNyYXNoaW5mb19vZmZzZXQgPSBNQVNLX0FERFIgKGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZikpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgewotICAgICAgLyogTW9zdCBsaWtlbHkgd2UgZmFpbGVkIGJlY2F1c2Ugb2YgYSBib2d1cyAoaHVnZSkgb2Zmc2V0ICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBucmVhZCA9IGJmZF9yZWFkICgmY3Jhc2hpbmZvLCAxLCBzaXplb2YgKGNyYXNoaW5mbyksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChjcmFzaGluZm8pKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBtYWdpYyA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5tYWdpYyk7Ci0gIGlmIChtYWdpYyAhPSBDUkFTSF9NQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB2ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnZlcnNpb24pOwotICBpZiAodmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCi0gICAgewotICAgICAgLyogVjEgY29yZSBkdW1wcyBkb24ndCBzcGVjaWZ5IHRoZSBkdW1wIGJhc2UsIGFzc3VtZSAwICovCi0gICAgICByYW1iYXNlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByYW1iYXNlID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJhbWJhc2UpOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUuICAqLwotCi0gIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKikKLSAgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoICgoY3Jhc2hyZWFzb24pIGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWFzb24pKQotICAgIHsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9OT1RDUkFTSEVEOgotICAgICAgLyogQ3Jhc2ggZmlsZSBwcm9iYWJseSBjYW1lIGZyb20gd3JpdGUgY29yZS4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9DT1JSVVBUOgotICAgICAgLyogVGhlIGNyYXNoIGNvbnRleHQgYXJlYSB3YXMgY29ycnVwdCAtLSBwcm9jZWVkIHdpdGggY2F1dGlvbi4KLQkgV2UgaGF2ZSBubyB3YXkgb2YgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGNhbGxlci4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9FWENFUFRJT046Ci0gICAgICAvKiBDcmFzaCBvY2N1cmVkIGR1ZSB0byBDUFUgZXhjZXB0aW9uLiAgKi8KLQotICAgICAgLyogVGhpcyBpcyA2OGstc3BlY2lmaWM7IGZvciBNSVBTIHdlJ2xsIG5lZWQgdG8gaW50ZXJwcmV0Ci0JIGNwdV92ZWN0b3IgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uCi0JIChzaW5jZSBDSVNDTyBjb3JlIGZpbGVzIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgcHJvY2Vzc29yCi0JIGVuY29kZWQgaW4gdGhlbSkuICAqLwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5jcHVfdmVjdG9yKSkKLQl7Ci0JICAgLyogYnVzIGVycm9yICAgICAgICAgICAqLwotCWNhc2UgMiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBhZGRyZXNzIGVycm9yICAgICAgICovCi0JY2FzZSAzIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLQljYXNlIDQgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIGNoayBpbnN0cnVjdGlvbiAgICAgKi8KLQljYXNlIDYgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogdHJhcHYgaW5zdHJ1Y3Rpb24gICAqLwotCWNhc2UgNyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCi0JY2FzZSA4IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdTRUdWOyBicmVhazsKLQkgICAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCi0JY2FzZSA5IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMDEwIGVtdWxhdG9yICAqLwotCWNhc2UgMTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMTExIGVtdWxhdG9yICAqLwotCWNhc2UgMTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0KLQkgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQotCSAgICAgdGhpcyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlLiAgQ2FsbCBpdCBhIFNJR0JVUy4gICovCi0JY2FzZSAxMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7ICBicmVhazsKLQotCSAgLyogaW50ZXJydXB0ICAgICAgICAgICAqLwotCWNhc2UgMzE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSU5UOyAgYnJlYWs7Ci0JICAvKiBicmVha3BvaW50ICAgICAgICAgICovCi0JY2FzZSAzMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0KLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ4OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDk6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1MDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHVuZGVyZmxvdyAgICAgICAgICAgKi8KLQljYXNlIDUxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogb3BlcmFuZCBlcnJvciAgICAgICAqLwotCWNhc2UgNTI6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogb3ZlcmZsb3cgICAgICAgICAgICAqLwotCWNhc2UgNTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBOQU4gICAgICAgICAgICAgICAgICovCi0JY2FzZSA1NDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQlkZWZhdWx0OgotI2lmbmRlZiBTSUdFTVQKLSNkZWZpbmUgU0lHRU1UIFNJR1RSQVAKLSNlbmRpZgotCSAgLyogInNvZnR3YXJlIGdlbmVyYXRlZCIqLwotCSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdFTVQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3Jhc2ggcmVhc29uLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gIC8qIENyZWF0ZSBhICIucmVnIiBzZWN0aW9uIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2F2ZWQKLSAgICAgcmVnaXN0ZXJzLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIucmVnIjsKLSAgYXNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgYXNlY3QtPnZtYSA9IDA7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlZ2lzdGVycykgLSByYW1iYXNlOwotICAvKiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBzYXZlZCByZWdpc3RlciBpbmZvLAotICAgICBjaG9vc2UgYSByZWdpc3RlciBzZWN0aW9uIHNpemUgdGhhdCBpcyBlaXRoZXIgdGhlIHJlbWFpbmluZyBwYXJ0Ci0gICAgIG9mIHRoZSBmaWxlLCBvciAxMDI0LCB3aGljaGV2ZXIgaXMgc21hbGxlci4gKi8KLSAgbnJlYWQgPSBzdGF0YnVmLnN0X3NpemUgLSBhc2VjdC0+ZmlsZXBvczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IChucmVhZCA8IDEwMjQpID8gbnJlYWQgOiAxMDI0OwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5jcmFzaCIgc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIHNhdmVkCi0gICAgIGNyYXNoIGluZm9ybWF0aW9uLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuY3Jhc2giOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBhc2VjdC0+dm1hID0gMDsKLSAgYXNlY3QtPmZpbGVwb3MgPSBjcmFzaGluZm9fb2Zmc2V0OwotICBhc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChjcmFzaGluZm8pOwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5kYXRhIiBzZWN0aW9uIHRoYXQgbWFwcyB0aGUgZW50aXJlIGZpbGUsIHdoaWNoIGlzCi0gICAgIGVzc2VudGlhbGx5IGEgZHVtcCBvZiB0aGUgdGFyZ2V0IHN5c3RlbSdzIFJBTS4gKi8KLQotICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoYXNlY3QgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYXNlY3QtPm5hbWUgPSAiLmRhdGEiOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIC8qIFRoZSBzaXplIG9mIG1lbW9yeSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIGl0c2VsZi4gICovCi0gIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIGFzZWN0LT52bWEgPSByYW1iYXNlOwotICBhc2VjdC0+ZmlsZXBvcyA9IDA7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotICAvKiBHZXQgaGVyZSBpZiB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZCBmaWxsaW5nIG91dCB0aGUgQkZECi0gICAgIGFuZCB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIGtpbmQuICovCi0KLSBlcnJvcl9yZXR1cm46Ci0gIHsKLSAgICBzZWNfcHRyIG5leHRzZWN0OwotICAgIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3QgIT0gTlVMTDspCi0gICAgICB7Ci0JbmV4dHNlY3QgPSBhc2VjdC0+bmV4dDsKLQlmcmVlIChhc2VjdCk7Ci0JYXNlY3QgPSBuZXh0c2VjdDsKLSAgICAgIH0KLSAgICBmcmVlIChhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNpc2NvX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCAqY3Jhc2hfaW5mb19sb2NwOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOwotCi0gIGZvciAoY3Jhc2hfaW5mb19sb2NwID0gY3Jhc2hfaW5mb19sb2NzOwotICAgICAgICpjcmFzaF9pbmZvX2xvY3AgIT0gLTEgICYmICB0YXJnZXQgPT0gTlVMTDsKLSAgICAgICBjcmFzaF9pbmZvX2xvY3ArKykKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUgKGFiZmQsICpjcmFzaF9pbmZvX2xvY3ApOwotICAgIH0KLSAgcmV0dXJuICh0YXJnZXQpOwotfQotCi1jaGFyICoKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludAotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZzsKLX0KLQotYm9vbGVhbgotY2lzY29fY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfYmlnX3ZlYyA9Ci0gIHsKLSAgICAiY2lzY28taW9zLWNvcmUtYmlnIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBjaXNjb19jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNpc2NvKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgICYgY2lzY29fY29yZV9saXR0bGVfdmVjLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjID0KLSAgewotICAgICJjaXNjby1pb3MtY29yZS1saXR0bGUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gICAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGNpc2NvX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY2lzY28pLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgJmNpc2NvX2NvcmVfYmlnX3ZlYywKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYTI5ay5jIGIvYmZkL2NvZmYtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQzYzY0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFNRCAyOTAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBXb29kIGF0IE5ldyBZb3JrIFVuaXZlcnNpdHkgNy84LzkxLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQTI5SyAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2EyOWsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgbG9uZyBnZXRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhMjlrX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJvb2xlYW4gKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLQotI2RlZmluZSBJTlNFUlRfSFdPUkQoV09SRCxIV09SRCkJXAotICAgICgoKFdPUkQpICYgMHhmZjAwZmYwMCkgfCAoKChIV09SRCkgJiAweGZmMDApIDw8IDgpIHwgKChIV09SRCkmIDB4ZmYpKQotI2RlZmluZSBFWFRSQUNUX0hXT1JEKFdPUkQpIFwKLSAgICAoKCgoV09SRCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoV09SRCkgJiAweGZmKSkKLSNkZWZpbmUgU0lHTl9FWFRFTkRfSFdPUkQoSFdPUkQpIFwKLSAgICAoKChIV09SRCkgXiAweDgwMDApIC0gMHg4MDAwKQotCi0vKiBQcm92aWRlZCB0aGUgc3ltYm9sLCByZXR1cm5zIHRoZSB2YWx1ZSByZWZmZWQgKi8KLXN0YXRpYyBsb25nCi1nZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2wpICAgICAgIAotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgewotICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIGVsc2UgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlICsKLSAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLSAgICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICByZXR1cm4ocmVsb2NhdGlvbik7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSAyOWsgcmVsb2NhdGlvbnMgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYTI5a19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGxvbmcgc2lnbmVkX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzIDsgLyorIGlucHV0X3NlY3Rpb24tPnZtYSovCi0gIGJmZF9ieXRlICAqaGl0X2RhdGEgPWFkZHIgKyAoYmZkX2J5dGUgKikoZGF0YSk7Ci0JCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCkgewotICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICB7Ci0gICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgIGlmIChyX3R5cGUgPT0gUl9JSElIQUxGKSAKLSAgICB7Ci0gICAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLSAgICAgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotICAgIH0KLSAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gIH0KLQotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gUl9JSENPTlNUKSkgCi0gIHsKLSAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIElIQ09OU1QiKTsKLSAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkgCi0gIHsKLSAgIGNhc2UgUl9JUkVMOiAJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBUYWtlIHRoZSB2YWx1ZSBpbiB0aGUgZmllbGQgYW5kIHNpZ24gZXh0ZW5kIGl0ICovCi0gICAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRChzaWduZWRfdmFsdWUpOwotICAgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotICAgIC8qIFNlZSB0aGUgbm90ZSBvbiB0aGUgUl9JUkVMIHJlbG9jIGluIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgICBpZiAoc2lnbmVkX3ZhbHVlID09IC0gKGxvbmcpIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotICAgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotICAgIHNpZ25lZF92YWx1ZSArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIGlmICgoc2lnbmVkX3ZhbHVlICYgfjB4M2ZmZmYpID09IDApCi0gICAgewkJCQkvKiBBYnNvbHV0ZSBqbXAvY2FsbCAqLwotICAgICAgaW5zbiB8PSAoMTw8MjQpOwkJLyogTWFrZSBpdCBhYnNvbHV0ZSAqLwotICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2Ugcl90eXBlIHRvIFJfSUFCUyAqLwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBSZWxhdGl2ZSBqbXAvY2FsbCwgc28gc3VidHJhY3QgZnJvbSB0aGUgdmFsdWUgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIHdlJ3JlIGNvbWluZyBmcm9tICovCi0gICAgICBzaWduZWRfdmFsdWUgLT0gKHJlbG9jX2VudHJ5LT5hZGRyZXNzCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoc2lnbmVkX3ZhbHVlPjB4MWZmZmYgfHwgc2lnbmVkX3ZhbHVlPC0weDIwMDAwKSAKLSAgICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICB9Ci0gICAgc2lnbmVkX3ZhbHVlID4+PSAyOwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24gLGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUxPSEFMRjogCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQoaW5zbik7Ci0gICAgdW5zaWduZWRfdmFsdWUgKz0gIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0lISUhBTEY6Ci0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMSAKLSAgICAgICBKdXN0IGdldCB0aGUgc3ltYm9sIHZhbHVlIHRoYXQgaXMgcmVmZXJlbmNlZCAqLwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgIHBhcnQxX2NvbnN0aF92YWx1ZSA9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgLyogRG9uJ3QgbW9kaWZ5IGluc24gdW50aWwgUl9JSENPTlNUICovCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhDT05TVDoJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMiAKLSAgICAgICBOb3cgcmVsb2NhdGUgdGhlIHJlZmVyZW5jZSAqLwotICAgIGlmIChwYXJ0MV9jb25zdGhfYWN0aXZlID09IGZhbHNlKSB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhJSEFMRiIpOwotICAgICAgcmV0dXJuKGJmZF9yZWxvY19kYW5nZXJvdXMpOwotICAgIH0KLSAgICAvKiBzeW1fcHRyX3B0ciA9IHJfc3ltbmR4LCBpbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKCkgKi8KLSAgICB1bnNpZ25lZF92YWx1ZSA9IDA7CQkvKkVYVFJBQ1RfSFdPUkQoaW5zbikgPDwgMTY7Ki8KLSAgICB1bnNpZ25lZF92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOyAvKiByX3N5bW5keCAqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHBhcnQxX2NvbnN0aF92YWx1ZTsKLSAgICB1bnNpZ25lZF92YWx1ZSA9IHVuc2lnbmVkX3ZhbHVlID4+IDE2OwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfQllURToKLSAgICBpbnNuID0gYmZkX2dldF84KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmZmYwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfOChhYmZkLCB1bnNpZ25lZF92YWx1ZSwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9IV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8xNihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gaW5zbiArIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CQotICAgIGlmICh1bnNpZ25lZF92YWx1ZSAmIDB4ZmZmZjAwMDApCi0gICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICBiZmRfcHV0XzE2KGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsgIAotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAqZXJyb3JfbWVzc2FnZSA9IF8oIlVucmVjb2duaXplZCByZWxvYyIpOwotICAgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHJldHVybihiZmRfcmVsb2Nfb2spOwkKLX0KLQotLyogICAgICB0eXBlCSAgIHJpZ2h0c2hpZnQKLQkJICAgICAgIHNpemUKLQkJCSAgYml0c2l6ZQotCQkJICAgICAgIHBjLXJlbGF0aXZlCi0JCQkJICAgICBiaXRwb3MKLQkJCQkJIGFic29sdXRlCi0JCQkJCSAgICAgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJCQkJCSAgc3BlY2lhbF9mdW5jdGlvbgotCQkJCQkJICAgIHJlbG9jYXRpb24gbmFtZQotCQkJCQkJCSAgICAgICBwYXJ0aWFsX2lucGxhY2UgCi0JCQkJCQkJCSAgICAgIHNyY19tYXNrCi0qLwotCi0vKkZJWE1FOiBJJ20gbm90IHJlYWwgc3VyZSBhYm91dCB0aGlzIHRhYmxlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIHtSX0FCUywgICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYTI5a19yZWxvYywiQUJTIiwgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgRU1QVFlfSE9XVE8gKDYpLAotICBFTVBUWV9IT1dUTyAoNyksCi0gIEVNUFRZX0hPV1RPICg4KSwKLSAgRU1QVFlfSE9XVE8gKDkpLAotICBFTVBUWV9IT1dUTyAoMTApLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotICBFTVBUWV9IT1dUTyAoMTMpLAotICBFTVBUWV9IT1dUTyAoMTQpLAotICBFTVBUWV9IT1dUTyAoMTUpLAotICBFTVBUWV9IT1dUTyAoMTYpLAotICBFTVBUWV9IT1dUTyAoMTcpLAotICBFTVBUWV9IT1dUTyAoMTgpLAotICBFTVBUWV9IT1dUTyAoMTkpLAotICBFTVBUWV9IT1dUTyAoMjApLAotICBFTVBUWV9IT1dUTyAoMjEpLAotICBFTVBUWV9IT1dUTyAoMjIpLAotICBFTVBUWV9IT1dUTyAoMjMpLAotICB7Ul9JUkVMLCAgICAwLCAzLCAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCxhMjlrX3JlbG9jLCJJUkVMIiwgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX0lBQlMsICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIklBQlMiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUxPSEFMRiwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklMT0hBTEYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfSUhJSEFMRiwgMCwgMywgMTYsIHRydWUsICAxNiwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSElIQUxGIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0lIQ09OU1QsIDAsIDMsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSENPTlNUIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0JZVEUsICAgIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiQllURSIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2V9LAotICB7Ul9IV09SRCwgICAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJIV09SRCIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtSX1dPUkQsICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIldPUkQiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLX07Ci0KLSNkZWZpbmUgQkFETUFHKHgpIEEyOUtCQURNQUcoeCkKLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQscmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gICAgc3RhdGljIGJmZF92bWEgaWhpaGFsZl92YWRkciA9IChiZmRfdm1hKSAtMTsKLQotICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwkJCi0gICAgcmVsZW50LT5ob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsb2MtPnJfdHlwZTsKLSAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lIQ09OU1QpIAotICAgIHsJCQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gUl9JSENPTlNUIHNob3VsZCBhbHdheXMgYmUgdGhlIGFkZHJlc3Mgb2YKLQkgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuICByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotCSBhcmUgY29ycmVjdCwgYnV0IHJlbG9jcyBnZW5lcmF0ZWQgYnkgSGlnaCBDIGFyZSBkaWZmZXJlbnQgKEkKLQkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IHRoZSBhZGRyZXNzIG1lYW5zIGZvciBIaWdoIEMpLiAgV2UgY2FuCi0JIGhhbmRsZSBib3RoIGdhcyBhbmQgSGlnaCBDIGJ5IGlnbm9yaW5nIHRoZSBhZGRyZXNzIGhlcmUsIGFuZAotCSBzaW1wbHkgcmV1c2luZyB0aGUgYWRkcmVzcyBzYXZlZCBmb3IgUl9JSElIQUxGLiAgKi8KLSAgICAgICAgaWYgKGloaWhhbGZfdmFkZHIgPT0gKGJmZF92bWEpIC0xKQotCSAgYWJvcnQgKCk7Ci0JcmVsZW50LT5hZGRyZXNzID0gaWhpaGFsZl92YWRkcjsKLQlpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCXJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfc3ltbmR4OwkJCi0JcmVsZW50LT5zeW1fcHRyX3B0cj0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgYXN5bWJvbCAqcHRyOwotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotCi0gICAgICBwdHIgPSAqKHJlbGVudC0+c3ltX3B0cl9wdHIpOwotCi0gICAgICBpZiAocHRyIAotCSAgJiYgYmZkX2FzeW1ib2xfYmZkKHB0cikgPT0gYWJmZAkJCi0KLQkgICYmICgocHRyLT5mbGFncyAmIEJTRl9PTERfQ09NTU9OKT09IDApKQkKLSAgICAgIHsJCQkJCQkKLQkgIHJlbGVudC0+YWRkZW5kID0gMDsKLSAgICAgIH0JCQkJCQkKLSAgICAgIGVsc2UKLSAgICAgIHsJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwkJCQotICAgICAgfQkJCQotICAgICAgcmVsZW50LT5hZGRyZXNzLT0gc2VjdGlvbi0+dm1hOwotICAgICAgaWYgKHJlbG9jLT5yX3R5cGUgPT0gUl9JSElIQUxGKQotCWloaWhhbGZfdmFkZHIgPSByZWxlbnQtPmFkZHJlc3M7Ci0gICAgICBlbHNlIGlmIChpaGloYWxmX3ZhZGRyICE9IChiZmRfdm1hKSAtMSkKLQlhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0KLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgbG9uZyBzaWduZWRfdmFsdWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0KLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KLSAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW0tPm5fdmFsdWUKLQkJCSAtIHNlYy0+dm1hKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGYgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBSX0lSRUw6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCi0JICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLwotCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKLQkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgotCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgotCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCi0JICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKLQkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKLQkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCi0JICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKLQkgICAgICAgICAudGV4dAotCQkgbm9wCi0JCSBqbXAgaS00Ci0JICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQotCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KLQotCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKLQkgICAgIGNoZWNrLiAgKi8KLQotCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKLQkgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCi0JICBzaWduZWRfdmFsdWUgKz0gdmFsOwotCi0JICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KLQkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLwotCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKLQkJewotCQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBzaWduZWRfdmFsdWUgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7Ci0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lMT0hBTEY6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lISUhBTEY6Ci0JICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCi0JICBoaWhhbGYgPSB0cnVlOwotCSAgaGloYWxmX3ZhbCA9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lIQ09OU1Q6Ci0JICBpZiAoISBoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGZfdmFsID0gMDsKLQkgICAgfQotCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKLQkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGhpaGFsZiA9IGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9CWVRFOgotCWNhc2UgUl9IV09SRDoKLQljYXNlIFJfV09SRDoKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKLQkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKLQkgICAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgbmFtZSA9IGJ1ZjsKLQkgICAgfQotCi0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0Ci0gICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmliZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX0lIQ09OU1QpCi0gICAgKmFkanVzdGVkcCA9IHRydWU7Ci0gIGVsc2UKLSAgICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGEyOWtjb2ZmX2JpZ192ZWMsICJjb2ZmLWEyOWstYmlnIiwgMCwgU0VDX1JFQURPTkxZLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hbHBoYS5jIGIvYmZkL2NvZmYtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliODAyMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFMUEhBIEV4dGVuZGVkLUNvZmYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLW1pcHMuYyBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+IGFuZAotICAgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICphbHBoYV9lY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyBQVFIgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJmZF9ieXRlICphbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYmZkX3ZtYSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgc3RydWN0IGV4dGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX2FkanVzdF9oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci1zdGF0aWMgUFRSIGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIGVjb2ZmIG5hbWVzLiAgRGVmaW5lIHNvbWUKLSAgIGFjY2Vzc29yIG1hY3JvcyBmb3IgdGhlIGxhcmdlIHNpemVzIHVzZWQgZm9yIEFscGhhIEVDT0ZGLiAgKi8KLQotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF82NAotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZCBieSBpdHNlbGYuICBIb3dldmVyLCBpdCBhcHBlYXJzIGFmdGVyIGEKLSAgICAgR1BESVNQIHJlbG9jIHRvIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbG93IG9yZGVyIDE2IGJpdHMKLSAgICAgb2YgdGhlIGdwIHJlZ2lzdGVyIGFyZSBsb2FkZWQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0MCi0vKiBSZWNvZ25pemUgYW4gQWxwaGEgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFscGhhX2Vjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyZXQ7Ci0KLSAgcmV0ID0gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci0KLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIEFscGhhIEVDT0ZGIGhhcyBhIC5wZGF0YSBzZWN0aW9uLiAgVGhlIGxubm9wdHIgZmllbGQgb2YgdGhlCi0JIC5wZGF0YSBzZWN0aW9uIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpdCBjb250YWlucy4gIEVhY2gKLQkgZW50cnkgdGFrZXMgdXAgOCBieXRlcy4gIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyByZXF1aXJlZAotCSBzaW5jZSB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gIFdoZW4gd2UKLQkgbGluayAucGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlCi0JIGFsaWdubWVudCBieXRlcy4gIFdlIGhhbmRsZSB0aGlzIG9uIGlucHV0IGJ5IGZha2luZyB0aGUgc2l6ZQotCSBvZiB0aGUgLnBkYXRhIHNlY3Rpb24gdG8gcmVtb3ZlIHRoZSB1bndhbnRlZCBhbGlnbm1lbnQgYnl0ZXMuCi0JIE9uIG91dHB1dCB3ZSB3aWxsIHNldCB0aGUgbG5ub3B0ciBmaWVsZCBhbmQgZm9yY2UgdGhlCi0JIGFsaWdubWVudC4gICovCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX1BEQVRBKTsKLSAgICAgIGlmIChzZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBzaXplID0gc2VjLT5saW5lX2ZpbGVwb3MgKiA4OwotCSAgQkZEX0FTU0VSVCAoc2l6ZSA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgICAgIHx8IHNpemUgKyA4ID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQUxQSEFfRUNPRkZfQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgUFRSCi1hbHBoYV9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgUFRSIGVjb2ZmOwotCi0gIGVjb2ZmID0gX2JmZF9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKTsKLQotICBpZiAoZWNvZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gICAgICAvKiBTZXQgYWRkaXRpb25hbCBCRkQgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZQotCSBtYWNoaW5lIHNwZWNpZmljIGZpbGUgaGVhZGVyIGZsYWdzLiAgKi8KLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSykKLQl7Ci0JY2FzZSBGX0FMUEhBX1NIQVJBQkxFOgotCSAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQkgIGJyZWFrOwotCWNhc2UgRl9BTFBIQV9DQUxMX1NIQVJFRDoKLQkgIC8qIEFsd2F5cyBleGVjdXRhYmxlIGlmIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMgYXMgdGhlIHJ1biB0aW1lCi0JICAgICBsb2FkZXIgbWlnaHQgcmVzb2x2ZSB1bmRlZmluZWQgcmVmZXJlbmNlcy4gICovCi0JICBhYmZkLT5mbGFncyB8PSAoRFlOQU1JQyB8IEVYRUNfUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gZWNvZmY7Ci19Ci0MCi0vKiBSZWxvYyBoYW5kbGluZy4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBjb25zdCBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGV4dF9wdHI7Ci0KLSAgaW50ZXJuLT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaW50ZXJuLT5yX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGludGVybi0+cl90eXBlID0gKChleHQtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgaW50ZXJuLT5yX29mZnNldCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gIGludGVybi0+cl9zaXplID0gKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgLyogSGFuZGxlIHRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3Mgc3BlY2lhbGx5LiAgSXRzIHN5bW5keAotCSB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXgsIGJ1dCBpcyBpbnN0ZWFkIGEKLQkgc3BlY2lhbCBjb2RlLiAgV2UgcHV0IHRoZSBjb2RlIGluIHRoZSByX3NpemUgZmllbGQsIGFuZAotCSBjbG9iYmVyIHRoZSBzeW1uZHguICAqLwotICAgICAgaWYgKGludGVybi0+cl9zaXplICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9OT05FOwotICAgIH0KLSAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0gICAgewotICAgICAgLyogVGhlIElHTk9SRSByZWxvYyBnZW5lcmFsbHkgZm9sbG93cyBhIEdQRElTUCByZWxvYywgYW5kIGlzCi0JIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc2VjdGlvbiBpcyBpcnJlbGV2YW50LiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYKLQkgIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JYWJvcnQgKCk7Ci0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuICYmIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9MSVRBKQotCWludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICB9Ci19Ci0KLS8qIFN3YXAgYSByZWxvYyBvdXQuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyBzeW1uZHg7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLQotICAvKiBVbmRvIHRoZSBoYWNrZXJ5IGRvbmUgaW4gc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfSUdOT1JFCi0JICAgJiYgISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAgJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLSAgICB7Ci0gICAgICBzeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBzaXplID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX2V4dGVybgotCSAgICAgIHx8IChpbnRlcm4tPnJfc3ltbmR4ID49IDAgJiYgaW50ZXJuLT5yX3N5bW5keCA8PSAxNCkpOwotCi0gIGJmZF9oX3B1dF82NCAoYWJmZCwgaW50ZXJuLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQtPnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBleHQtPnJfYml0c1swXSA9ICgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpCi0JCSAgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LT5yX2JpdHNbMV0gPSAoKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgIHwgKChpbnRlcm4tPnJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LT5yX2JpdHNbMl0gPSAwOwotICBleHQtPnJfYml0c1szXSA9ICgoc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpOwotfQotCi0vKiBGaW5pc2ggY2Fub25pY2FsaXppbmcgYSByZWxvYy4gIFBhcnQgb2YgdGhpcyBpcyBnZW5lcmljIHRvIGFsbAotICAgRUNPRkYgdGFyZ2V0cywgYW5kIHRoYXQgcGFydCBpcyBpbiBlY29mZi5jLiAgVGhlIHJlc3QgaXMgZG9uZSBpbgotICAgdGhpcyBiYWNrZW5kIHJvdXRpbmUuICBJdCBtdXN0IGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBBTFBIQV9SX0dQVkFMVUUpCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3dpdGNoIChpbnRlcm4tPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoaXMgcmVsb2NzIGFwcGVhciB0byBiZSBmdWxseSByZXNvbHZlZCB3aGVuIHRoZXkgYXJlIGFnYWluc3QKLSAgICAgICAgIGludGVybmFsIHN5bWJvbHMuICBBZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIEJSQUREUiBhdCBsZWFzdAotICAgICAgICAgYXBwZWFycyB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCi0JcnB0ci0+YWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQlycHRyLT5hZGRlbmQgPSAtIChpbnRlcm4tPnJfdmFkZHIgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0gICAgICAvKiBDb3B5IHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZGRlbmQsIHRvCi0JIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29uZnVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuKQotCXJwdHItPmFkZGVuZCArPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfb2Zmc2V0IDw9IDI1NiAmJiBpbnRlcm4tPnJfc2l6ZSA8PSAyNTYpOwotICAgICAgcnB0ci0+YWRkZW5kID0gKGludGVybi0+cl9vZmZzZXQgPDwgOCkgKyBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogU2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gdGhlIG5ldyBHUCB2YWx1ZS4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc3ltbmR4ICsgZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcnB0ci0+YWRkcmVzcyA9IGludGVybi0+cl92YWRkcjsKLSAgICAgIHJwdHItPmFkZGVuZCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBycHRyLT5ob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIFdoZW4gd3JpdGluZyBvdXQgYSByZWxvYyB3ZSBuZWVkIHRvIHB1bGwgc29tZSB2YWx1ZXMgYmFjayBvdXQgb2YKLSAgIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgcmVsb2MuICBUaGlzIGlzIHJvdWdobHkgdGhlIHJldmVyc2Ugb2YKLSAgIGFscGhhX2FkanVzdF9yZWxvY19pbiwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgY2hhbmdlcyB3ZSBkbwotICAgbm90IG5lZWQgdG8gdW5kby4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIGludGVybi0+cl92YWRkciA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgZm9yIHRoZSByZWxvY2F0aW9uIGV2YWx1YXRvci4gICovCi0jZGVmaW5lIFJFTE9DX1NUQUNLU0laRSAoMTApCi0KLS8qIEFscGhhIEVDT0ZGIHJlbG9jcyBoYXZlIGEgYnVpbHQgaW4gZXhwcmVzc2lvbiBldmFsdWF0b3IgYXMgd2VsbCBhcwotICAgb3RoZXIgaW50ZXJkZXBlbmRlbmNpZXMuICBSYXRoZXIgdGhhbiB1c2UgYSBidW5jaCBvZiBzcGVjaWFsCi0gICBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIHdlIHVzZSBhIHNpbmdsZSByb3V0aW5lIHRvIGRvIGFsbAotICAgdGhlIHJlbG9jYXRpb24gZm9yIGEgc2VjdGlvbi4gIEkgaGF2ZW4ndCB5ZXQgd29ya2VkIG91dCBob3cgdGhlCi0gICBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gaGFuZGxlIHRoaXMuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgYmZkICpvdXRwdXRfYmZkID0gcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTDsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKLSAgaW50IHRvcyA9IDA7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGRhdGEsCi0JCQkJICAoZmlsZV9wdHIpIDAsIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHNlY3Rpb24gc2l6ZSBpcyBub3QgZ29pbmcgdG8gY2hhbmdlLiAgKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLCBzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKHJlbG9jX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICAvKiBHZXQgdGhlIEdQIHZhbHVlIGZvciB0aGUgb3V0cHV0IEJGRC4gICovCi0gIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgYmZkX3ZtYSBsbzsKLQotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGxvID0gKGJmZF92bWEpIC0xOwotCSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPnZtYSA8IGxvCi0JCSAgJiYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ0IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ4IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXRhIikgPT0gMCkpCi0JCWxvID0gc2VjLT52bWE7Ci0JICAgIH0KLQkgIGdwID0gbG8gKyAweDgwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yICg7ICpyZWxvY192ZWN0b3IgIT0gKGFyZWxlbnQgKikgTlVMTDsgcmVsb2NfdmVjdG9yKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjaGFyICplcnI7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY192ZWN0b3I7Ci0gICAgICByID0gYmZkX3JlbG9jX29rOwotICAgICAgc3dpdGNoIChyZWwtPmhvd3RvLT50eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9CUkFERFI6Ci0JY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JY2FzZSBBTFBIQV9SX1NSRUwxNjoKLQljYXNlIEFMUEhBX1JfU1JFTDMyOgotCWNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0JICBpZiAocmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCgqcmVsLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0JICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKLQkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0Ci0JICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICBUaGUgb3JpZ2luYWwgR1AgdmFsdWUgaXMgc3RvcmVkIGluIHRoZQotCSAgICAgYWRkZW5kLiAgV2UgYWRqdXN0IHRoZSBhZGRlbmQgYW5kIGxldAotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggdGhlIGpvYi4gICovCi0JICByZWwtPmFkZGVuZCAtPSBncDsKLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGlmIChyID09IGJmZF9yZWxvY19vayAmJiBncF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgICBlcnIgPSAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQotCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAotCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCi0JICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgotCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKLQkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQotCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KLQkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgotCi0JICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAotCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5Ci0JICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KLQkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcwotCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhCi0JICAgICAgIGxkcSBvciBsZGwgaW5zdHJ1Y3Rpb24sIHNvIGNoZWNrIG15IGFzc3VtcHRpb24uICAqLwotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKLQkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKLQotCSAgICByZWwtPmFkZGVuZCAtPSBncDsKLQkgICAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCQlvdXRwdXRfYmZkLCAmZXJyKTsKLQkgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCXIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCQllcnIgPQotCQkgIChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQotCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zaXplIGJ5dGVzCi0JICAgICBhaGVhZDsgaXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYywKLQkgICAgIGJ1dCB0aGF0IG5vIGxvbmdlciBoYXBwZW5zIGluIE9TRi8xIDMuMi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotCSAgICBiZmRfdm1hIGFkZGVuZDsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOwotCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCi0KLQkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCi0JICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7Ci0JICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKLQkgICAgICB7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkgICAgICB9Ci0JICAgIGlmIChpbnNuMiAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgLT0gMHgxMDAwMDsKLQotCSAgICAvKiBUaGUgZXhpc3RpbmcgYWRkZW5kIGluY2x1ZGVzIHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgU3VidHJhY3QgdGhpcyBvdXQuICAqLwotCSAgICBhZGRlbmQgLT0gKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT52bWEgKyByZWwtPmFkZHJlc3MpKTsKLQotCSAgICAvKiBOb3cgYWRkIGluIHRoZSBmaW5hbCBncCB2YWx1ZSwgYW5kIHN1YnRyYWN0IG91dCB0aGUKLQkgICAgICAgZmluYWwgYWRkcmVzcy4gICovCi0JICAgIGFkZGVuZCArPSAoZ3AKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgcmVsLT5hZGRyZXNzKSk7Ci0KLQkgICAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbnMsIGFjY291bnRpbmcgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiwgYW5kIHdyaXRlIHRoZW0gb3V0LiAgKi8KLQkgICAgaWYgKGFkZGVuZCAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQkgICAgaW5zbjEgPSAoaW5zbjEgJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZik7Ci0JICAgIGluc24yID0gKGluc24yICYgMHhmZmZmMDAwMCkgfCAoYWRkZW5kICYgMHhmZmZmKTsKLQotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMSwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24yLAotCQkJZGF0YSArIHJlbC0+YWRkcmVzcyArIHJlbC0+YWRkZW5kKTsKLQotCSAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID49IFJFTE9DX1NUQUNLU0laRSkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MrK10gPSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICAvKiBTdG9yZSBhIHZhbHVlIGZyb20gdGhlIHJlbG9jIHN0YWNrIGludG8gYSBiaXRmaWVsZC4gICovCi0JICB7Ci0JICAgIGJmZF92bWEgdmFsOwotCSAgICBpbnQgb2Zmc2V0LCBzaXplOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICAvKiBUaGUgb2Zmc2V0IGFuZCBzaXplIGZvciB0aGlzIHJlbG9jIGFyZSBlbmNvZGVkIGludG8gdGhlCi0JICAgICAgIGFkZGVuZCBmaWVsZCBieSBhbHBoYV9hZGp1c3RfcmVsb2NfaW4uICAqLwotCSAgICBvZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotCSAgICBzaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotCi0JICAgIHZhbCA9IGJmZF9nZXRfNjQgKGFiZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICB2YWwgJj1+ICgoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQpOwotCSAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmICgoMSA8PCBzaXplKSAtIDEpKSA8PCBvZmZzZXQ7Ci0JICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCSAgLyogU3VidHJhY3QgYSB2YWx1ZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdIC09IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdID4+PSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgotCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgIGdwID0gcmVsLT5hZGRlbmQ7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcy4gICovCi0JICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9IHJlbDsKLQkgIG9zLT5yZWxvY19jb3VudCsrOwotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKSAKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWwtPnN5bV9wdHJfcHRyKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MsIHRydWUpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czogCi0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAobGlua19pbmZvLCBlcnIsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAotCQkgICAgICByZWwtPmhvd3RvLT5uYW1lLCByZWwtPmFkZGVuZCwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh0b3MgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpbnQgYWxwaGFfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGTE9ORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQUkVMMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0xJVFVTRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BESVNQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9JR05PUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0JSQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9ISU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDY0OwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFVTSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfU1RPUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BTVUI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BSU0hJRlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQVkFMVUU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gd2hpY2ggY29udmVydHMgYW4KLSAgIGV4dGVybmFsIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgUmV0dXJucyB0aGUKLSAgIHJlbG9jYXRpb24gYW1vdW50LiAgKi8KLQotc3RhdGljIGJmZF92bWEKLWFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgZXh0X3JlbCwgaCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0IHRoZSByZWxvYyBmcm9tCi0JIGJlaW5nIGFnYWluc3QgdGhlIHN5bWJvbCB0byBiZWluZyBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogQ2xlYXIgdGhlIHJfZXh0ZXJuIGJpdC4gICovCi0gICAgICBleHRfcmVsLT5yX2JpdHNbMV0gJj1+IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEU7Ci0KLSAgICAgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgaHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCi0gICAgICByX3N5bW5keCA9IC0xOwotICAgICAgc3dpdGNoIChuYW1lWzFdKQotCXsKLQljYXNlICdBJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0JICBicmVhazsKLQl9Ci0JCSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yCi0JIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgICAgIHJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQl7Ci0JICAvKiBDYWxsZXIgbXVzdCBnaXZlIGFuIGVycm9yLiAgKi8KLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICByZWxvY2F0aW9uID0gMDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICBiZmRfaF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIHJfc3ltbmR4LAotCQkoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOwotCi0gIHJldHVybiByZWxvY2F0aW9uOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgVGhpcyBpcwotICAgcXVpdGUgc2ltaWxhciB0byBnZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBQZXJoYXBzIHRoZXkKLSAgIGNvdWxkIGJlIGNvbWJpbmVkIHNvbWVob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb24sICpsaXRhX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJvb2xlYW4gZ3BfdW5kZWZpbmVkOwotICBiZmRfdm1hIHN0YWNrW1JFTE9DX1NUQUNLU0laRV07Ci0gIGludCB0b3MgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbF9lbmQ7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnhkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1BEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5wZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1JDT05TVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmNvbnN0Iik7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIC8qIE9uIHRoZSBBbHBoYSwgdGhlIC5saXRhIHNlY3Rpb24gbXVzdCBiZSBhZGRyZXNzYWJsZSBieSB0aGUgZ2xvYmFsCi0gICAgIHBvaW50ZXIuICBUbyBzdXBwb3J0IGxhcmdlIHByb2dyYW1zLCB3ZSBuZWVkIHRvIGFsbG93IG11bHRpcGxlCi0gICAgIGdsb2JhbCBwb2ludGVycy4gIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBlYWNoIGlucHV0IC5saXRhIHNlY3Rpb24KLSAgICAgaXMgPDY0S0IgYmlnLiAgVGhpcyBpbXBsaWVzIHRoYXQgd2hlbiBwcm9kdWNpbmcgcmVsb2NhdGFibGUKLSAgICAgb3V0cHV0LCB0aGUgLmxpdGEgc2VjdGlvbiBpcyBsaW1pdGVkIHRvIDY0S0IuIC4gKi8KLQotICBsaXRhX3NlYyA9IHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV07Ci0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgbGl0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqbGl0YV9zZWNfZGF0YTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIGRhdGEgc3RydWN0dXJlIHRvIHdoaWNoIHdlIGNhbgotCSBoYW5nIG9uIHRvIHRoZSBncCB2YWx1ZSB3ZSBwaWNrIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBsaXRhX3NlY19kYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKTsKLSAgICAgIGlmIChsaXRhX3NlY19kYXRhID09IE5VTEwpCi0JewotCSAgbGl0YV9zZWNfZGF0YSA9ICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikKLQkJCSAgIGJmZF96YWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBsaXRhX3NlYykgPSBsaXRhX3NlY19kYXRhOwotCX0KLQotICAgICAgaWYgKGxpdGFfc2VjX2RhdGEtPmdwICE9IDApCi0JewotCSAgLyogSWYgd2UgYWxyZWFkeSBhc3NpZ25lZCBhIGdwIHRvIHRoaXMgc2VjdGlvbiwgd2UgYmV0dGVyCi0JICAgICBzdGljayB3aXRoIHRoYXQgdmFsdWUuICAqLwotCSAgZ3AgPSBsaXRhX3NlY19kYXRhLT5ncDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBsaXRhX3ZtYTsKLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwotCi0JICBsaXRhX3ZtYSA9IGxpdGFfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgbGl0YV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X2Nvb2tlZF9zaXplOwotCSAgaWYgKGxpdGFfc2l6ZSA9PSAwKQotCSAgICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X3Jhd19zaXplOwotCi0JICBpZiAoZ3AgPT0gMAotCSAgICAgIHx8IGxpdGFfdm1hIDwgIGdwIC0gMHg4MDAwCi0JICAgICAgfHwgbGl0YV92bWEgKyBsaXRhX3NpemUgPj0gZ3AgKyAweDgwMDApCi0JICAgIHsKLQkgICAgICAvKiBFaXRoZXIgZ3AgaGFzbid0IGJlZW4gc2V0IGF0IGFsbCBvciB0aGUgY3VycmVudCBncAotCQkgY2Fubm90IGFkZHJlc3MgdGhpcyAubGl0YSBzZWN0aW9uLiAgSW4gYm90aCBjYXNlcyB3ZQotCQkgcmVzZXQgdGhlIGdwIHRvIHBvaW50IGludG8gdGhlICJtaWRkbGUiIG9mIHRoZQotCQkgY3VycmVudCBpbnB1dCAubGl0YSBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZ3AgJiYgIWVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5pc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZykKLQkJewotCQkgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywKLQkJCQkJICAgICAgIF8oInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpLAotCQkJCQkgICAgICAgKGNoYXIgKikgTlVMTCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nID0gdHJ1ZTsKLQkJfQotCSAgICAgIGlmIChsaXRhX3ZtYSA8IGdwIC0gMHg4MDAwKQotCQlncCA9IGxpdGFfdm1hICsgbGl0YV9zaXplIC0gMHg4MDAwOwotCSAgICAgIGVsc2UKLQkJZ3AgPSBsaXRhX3ZtYSArIDB4ODAwMDsKLQotCSAgICB9Ci0KLQkgIGxpdGFfc2VjX2RhdGEtPmdwID0gZ3A7Ci0JfQotCi0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotICAgIH0KLQotICBncF91bmRlZmluZWQgPSAoZ3AgPT0gMCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSk7Ci0KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl92YWRkcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfb2Zmc2V0OwotICAgICAgaW50IHJfc2l6ZTsKLSAgICAgIGJvb2xlYW4gcmVsb2NhdGVwOwotICAgICAgYm9vbGVhbiBhZGp1c3RfYWRkcnA7Ci0gICAgICBib29sZWFuIGdwX3VzZWRwOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotICAgICAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfc3ltbmR4KTsKLQotICAgICAgcl90eXBlID0gKChleHRfcmVsLT5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkJPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICAgICAgcl9leHRlcm4gPSAoZXh0X3JlbC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gKChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAgICAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gICAgICByX3NpemUgPSAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQk+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgICAgIHJlbG9jYXRlcCA9IGZhbHNlOwotICAgICAgYWRqdXN0X2FkZHJwID0gdHJ1ZTsKLSAgICAgIGdwX3VzZWRwID0gZmFsc2U7Ci0gICAgICBhZGRlbmQgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIC8qIFRoaXMgcmVsb2MgYXBwZWFycyBhZnRlciBhIEdQRElTUCByZWxvYy4gIE9uIGVhcmxpZXIKLQkgICAgIHZlcnNpb25zIG9mIE9TRi8xLCBJdCBtYXJrZWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQKLQkgICAgIGluc3RydWN0aW9uIHRvIGJlIGFsdGVyZWQgYnkgdGhlIEdQRElTUCByZWxvYywgYnV0IGl0IGlzCi0JICAgICBub3Qgb3RoZXJ3aXNlIHVzZWQgZm9yIGFueXRoaW5nLiAgRm9yIHNvbWUgcmVhc29uLCB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIGluY2x1ZGUgdGhlCi0JICAgICBzZWN0aW9uIFZNQSwgdW5saWtlIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgcl92YWRkciwKLQkJCSAgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9ISU5UOgotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0JSQUREUjoKLQljYXNlIEFMUEhBX1JfU1JFTDE2OgotCWNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0JY2FzZSBBTFBIQV9SX1NSRUw2NDoKLQkgIGlmIChyX2V4dGVybikKLQkgICAgYWRkZW5kICs9IC0gKHJfdmFkZHIgKyA0KTsKLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFJFTDMyOgotCSAgLyogVGhpcyByZWxvY2F0aW9uIGlzIHVzZWQgaW4gYSBzd2l0Y2ggdGFibGUuICBJdCBpcyBhIDMyCi0JICAgICBiaXQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgR1AgdmFsdWUuICBXZSBtdXN0IGFkanVzdCBpdAotCSAgICAgYnkgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IEdQIHZhbHVlLiAgKi8KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElURVJBTDoKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHZhbHVlLCBnZW5lcmFsbHkKLQkgICAgIChhbHdheXM/KSBpbiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgR1AKLQkgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24uICBTb21ldGltZXMgdGhlIHN1YnNlcXVlbnQgcmVsb2MgaXMgYQotCSAgICAgTElUVVNFIHJlbG9jLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRoaXMgcmVsb2MgaXMgdXNlZC4KLQkgICAgIFRoaXMgc29tZXRpbWVzIHBlcm1pdHMgcmV3cml0aW5nIHRoZSB0d28gaW5zdHJ1Y3Rpb25zCi0JICAgICByZWZlcnJlZCB0byBieSB0aGUgTElURVJBTCBhbmQgdGhlIExJVFVTRSBpbnRvIGRpZmZlcmVudAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCByZWZlciB0byAubGl0YS4gIFRoaXMgY2FuIHNhdmUKLQkgICAgIGEgbWVtb3J5IHJlZmVyZW5jZSwgYW5kIHBlcm1pdHMgcmVtb3ZpbmcgYSB2YWx1ZSBmcm9tCi0JICAgICAubGl0YSB0aHVzIHNhdmluZyBHUCByZWxhdGl2ZSBzcGFjZS4KLQotCSAgICAgV2UgZG8gbm90IHRoZXNlIG9wdGltaXphdGlvbnMuICBUbyBkbyB0aGVtIHdlIHdvdWxkIG5lZWQKLQkgICAgIHRvIGFycmFuZ2UgdG8gbGluayB0aGUgLmxpdGEgc2VjdGlvbiBmaXJzdCwgc28gdGhhdCBieQotCSAgICAgdGhlIHRpbWUgd2UgZ290IGhlcmUgd2Ugd291bGQga25vdyB0aGUgZmluYWwgdmFsdWVzIHRvCi0JICAgICB1c2UuICBUaGlzIHdvdWxkIG5vdCBiZSBwYXJ0aWN1bGFybHkgZGlmZmljdWx0LCBidXQgaXQgaXMKLQkgICAgIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCi0JICAvKiBJIGJlbGlldmUgdGhhdCB0aGUgTElURVJBTCByZWxvYyB3aWxsIG9ubHkgYXBwbHkgdG8gYSBsZHEKLQkgICAgIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgIGNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI5Ci0JCQl8fCAoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOCk7Ci0JICB9Ci0KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIC8qIFRoaXMgbWFya3MgdGhlIGxkYWggb2YgYW4gbGRhaC9sZGEgcGFpciB3aGljaCBsb2FkcyB0aGUKLQkgICAgIGdwIHJlZ2lzdGVyIHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGdwIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICBUaGUgc2Vjb25kIG9mIHRoZSBwYWlyIGlzIHJfc3ltbmR4Ci0JICAgICBieXRlcyBhaGVhZC4gIEl0IHVzZWQgdG8gYmUgbWFya2VkIHdpdGggYW4gQUxQSEFfUl9JR05PUkUKLQkgICAgIHJlbG9jLCBidXQgT1NGLzEgMy4yIG5vIGxvbmdlciBkb2VzIHRoYXQuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBpbnNuMiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkoY29udGVudHMKLQkJCQkgKyByX3ZhZGRyCi0JCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgcl9zeW1uZHgpKTsKLQotCSAgICBCRkRfQVNTRVJUICgoKGluc24xID4+IDI2KSAmIDB4M2YpID09IDB4MDkpOyAvKiBsZGFoICovCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjIgPj4gMjYpICYgMHgzZikgPT0gMHgwOCk7IC8qIGxkYSAqLwotCi0JICAgIC8qIEdldCB0aGUgZXhpc3RpbmcgYWRkZW5kLiAgV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24gZG9uZSBieSBsZGEgYW5kIGxkYWguICAqLwotCSAgICBhZGRlbmQgPSAoKGluc24xICYgMHhmZmZmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZmYpOwotCSAgICBpZiAoaW5zbjEgJiAweDgwMDApCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGFkZGVuZCAtPSAweDEwMDAwMDAwMCB3aXRob3V0IGNhdXNpbmcgYW4KLQkJICAgaW50ZWdlciBvdmVyZmxvdyBvbiBhIDMyIGJpdCBob3N0LiAgKi8KLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCSAgICAgIH0KLQkgICAgaWYgKGluc24yICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOwotCi0JICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgV2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAgICAgICBmaW5hbCBHUCBhbmQgdGhlIGZpbmFsIGFkZHJlc3MuICAqLwotCSAgICBhZGRlbmQgKz0gKGdwCi0JCSAgICAgICAtIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpKTsKLQotCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLwotCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOwotCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOwotCi0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLAotCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCi0JCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyByX3N5bW5keCk7Ci0KLQkgICAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIC8qIE1hbmlwdWxhdGUgdmFsdWVzIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgVGhlCi0JICAgICByX3ZhZGRyIGZpZWxkIGlzIG5vdCBhbiBhZGRyZXNzIGluIGlucHV0X3NlY3Rpb24sIGl0IGlzCi0JICAgICB0aGUgY3VycmVudCB2YWx1ZSAoaW5jbHVkaW5nIGFueSBhZGRlbmQpIG9mIHRoZSBvYmplY3QKLQkgICAgIGJlaW5nIHVzZWQuICAqLwotCSAgaWYgKCEgcl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0JICAgICAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICAgIGFkZGVuZCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0IC0gcy0+dm1hOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIGFkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogTm90ZSB0aGF0IHdlIHBhc3MgdGhlIGFkZHJlc3MgYXMgMCwgc2luY2Ugd2UKLQkJCSBkbyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgbnVtYmVyIGZvciB0aGUKLQkJCSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24gdGhhdCBpcyBiZWluZwotCQkJIHJlbG9jYXRlZC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwLCB0cnVlKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGFkZGVuZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgICYmIGgtPmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIFBhc3MKLQkJCSB0aGUgYWRkcmVzcyBhcyAwLCBhcyB3aXRoIHVuZGVmaW5lZF9zeW1ib2wsCi0JCQkgYWJvdmUuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCAoYmZkX3ZtYSkgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgYWRkZW5kID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJCSBleHRfcmVsLCBoKTsKLQkJfQotCSAgICB9Ci0KLQkgIGFkZGVuZCArPSByX3ZhZGRyOwotCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgLyogQWRqdXN0IHJfdmFkZHIgYnkgdGhlIGFkZGVuZC4gICovCi0JICAgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsIGFkZGVuZCwKLQkJCSAgICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCQkgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zKytdID0gYWRkZW5kOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCQkgIGlmICh0b3MgPT0gMCkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcyAtIDFdIC09IGFkZGVuZDsKLQkJICBicmVhazsKLQotCQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkJICBpZiAodG9zID09IDApCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MgLSAxXSA+Pj0gYWRkZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgSWYKLQkgICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFsbCB3ZSBkbyBpcwotCSAgICAgYWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG1hc2s7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAodG9zID09IDApCi0JCWFib3J0ICgpOwotCi0JICAgICAgLyogR2V0IHRoZSByZWxvY2F0aW9uIG1hc2suICBUaGUgc2VwYXJhdGUgc3RlcHMgYW5kIHRoZQotCQkgY2FzdHMgdG8gYmZkX3ZtYSBhcmUgYXR0ZW1wdHMgdG8gYXZvaWQgYSBidWcgaW4gdGhlCi0JCSBBbHBoYSBPU0YgMS4zIEMgY29tcGlsZXIuICBTZWUgcmVsb2MuYyBmb3IgbW9yZQotCQkgZGV0YWlscy4gICovCi0JICAgICAgbWFzayA9IDE7Ci0JICAgICAgbWFzayA8PD0gKGJmZF92bWEpIHJfc2l6ZTsKLQkgICAgICBtYXNrIC09IDE7Ci0KLQkgICAgICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBvdmVyZmxvdyBjaGVja2luZywKLQkJIGlmIGFueSwgc2hvdWxkIGJlIGRvbmUgaGVyZS4gICovCi0JICAgICAgdmFsID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLAotCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgdmFsICY9fiBtYXNrIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmIG1hc2spIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbCwKLQkJCSAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BWQUxVRToKLQkgIC8qIEkgcmVhbGx5IGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZy4gICovCi0JICBncCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwICsgcl9zeW1uZHg7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlcCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCSAgYXNlY3Rpb24gKnMgPSBOVUxMOwotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLQotCSAgaG93dG8gPSAmYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MKLQkJIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QKLQkJIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCQlzID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0Ci0JCSBjb252ZXJ0IHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICAgICAgaWYgKHJfZXh0ZXJuKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICAmJiBoLT5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIGluZm8sCi0JCQkJCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBleHRfcmVsLAotCQkJCQkJCSAgICAgaCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIEFkanVzdAotCQkgICAgIHRoZSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQKLQkJCQktIHMtPnZtYSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoaXMgaXMgUEMgcmVsYXRpdmUsIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZQotCQkgYXBwZWFycyB0byBhbHJlYWR5IGhhdmUgdGhlIHJlbG9jIHdvcmtlZCBvdXQuICBXZQotCQkgbXVzdCBzdWJ0cmFjdCBvdXQgdGhlIG9sZCB2YWx1ZSBhbmQgYWRkIGluIHRoZSBuZXcKLQkJIG9uZS4gICovCi0JICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIFB1dCBpbiBhbnkgYWRkZW5kLiAgKi8KLQkgICAgICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIHJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgICAgIGlmIChyX2V4dGVybikKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSBzLT52bWEpOwotCi0JCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUKLQkJICAgICByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWN0aW9uLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JCX0KLQotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLAotCQkJCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJCSAgICBhZGRlbmQpOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAocl9leHRlcm4pCi0JCSAgICAgIG5hbWUgPSBzeW1faGFzaGVzW3Jfc3ltbmR4XS0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XSk7Ci0JCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGluZm8sIG5hbWUsIGFscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkJCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIGFkanVzdF9hZGRycCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCi0JCQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyByX3ZhZGRyKSwKLQkJCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQl9Ci0KLSAgICAgIGlmIChncF91c2VkcCAmJiBncF91bmRlZmluZWQpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAoaW5mbywgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICBncCA9IDQ7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAodG9zICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byB0aGUgZmlsZWhkciBhbmQgdGhlIGFvdXRoZHIuICBUaGlzIHJvdXRpbmUKLSAgIHNldHMgdGhlIGR5bmFtaWMgYml0cyBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9hZGp1c3RfaGVhZGVycyAoYWJmZCwgZmhkciwgYWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmhkcjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFoZHI7Ci17Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRFlOQU1JQyB8IEVYRUNfUCkpID09IChEWU5BTUlDIHwgRVhFQ19QKSkKLSAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfQ0FMTF9TSEFSRUQ7Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgZmhkci0+Zl9mbGFncyB8PSBGX0FMUEhBX1NIQVJBQkxFOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBJbiBPU0YvMSAob3IgRGlnaXRhbCBVbml4KSB2My4yLCBEaWdpdGFsCi0gICBpbnRyb2R1Y2VkIGFyY2hpdmUgcGFja2luZywgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGluIGFuIGFyY2hpdmUgYXJlCi0gICBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYSBzaW1wbGUgZGljdGlvbmFyeSBzY2hlbWUuICBXZSBrbm93Ci0gICBob3cgdG8gcmVhZCBzdWNoIGFyY2hpdmVzLCBidXQgd2UgZG9uJ3Qgd3JpdGUgdGhlbS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXAgX2JmZF9lY29mZl9zbHVycF9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUgX2JmZF9lY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXAgX2JmZF9lY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotLyogQSBjb21wcmVzc2VkIGZpbGUgdXNlcyB0aGlzIGluc3RlYWQgb2YgQVJGTUFHLiAgKi8KLQotI2RlZmluZSBBUkZaTUFHICJaXDAxMiIKLQotLyogUmVhZCBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaXMgbGlrZSB0aGUgc3RhbmRhcmQgcm91dGluZSwgYnV0IGl0Ci0gICBhbHNvIGFjY2VwdHMgQVJGWk1BRy4gICovCi0KLXN0YXRpYyBQVFIKLWFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLSAgc3RydWN0IGFyX2hkciAqaDsKLQotICByZXQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBBUkZaTUFHKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGggPSAoc3RydWN0IGFyX2hkciAqKSByZXQtPmFyY2hfaGVhZGVyOwotICBpZiAoc3RybmNtcCAoaC0+YXJfZm1hZywgQVJGWk1BRywgMikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBhYls4XTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNvbXByZXNzZWQgZmlsZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIGNvcnJlY3RseS4KLSAgICAgICAgIFRoZSBzaXplIGlzIHRoZSBlaWdodCBieXRlcyBhZnRlciB0aGUgZHVtbXkgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBGSUxIU1osIFNFRUtfQ1VSKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYWIsIDEsIDgsIGFiZmQpICE9IDgKLQkgIHx8IGJmZF9zZWVrIChhYmZkLCAtIChGSUxIU1ogKyA4KSwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIGFiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogR2V0IGFuIGFyY2hpdmUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBmaWxlIHBvc2l0aW9uLiAgVGhpcyBpcyB3aGVyZQotICAgd2UgdW5jb21wcmVzcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGJmZCAqbmJmZCA9IE5VTEw7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnRkYXRhOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGJmZF9ieXRlIGFiWzhdOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpidWYsICpwOwotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIG5iZmQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKChuYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgQkZELiAgKi8KLSAgICAgIHJldHVybiBuYmZkOwotICAgIH0KLQotICB0ZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIG5iZmQtPmFyZWx0X2RhdGE7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopIHRkYXRhLT5hcmNoX2hlYWRlcjsKLSAgaWYgKHN0cm5jbXAgKGhkci0+YXJfZm1hZywgQVJGWk1BRywgMikgIT0gMCkKLSAgICByZXR1cm4gbmJmZDsKLQotICAvKiBXZSBtdXN0IHVuY29tcHJlc3MgdGhpcyBlbGVtZW50LiAgV2UgZG8gdGhpcyBieSBjb3B5aW5nIGl0IGludG8gYQotICAgICBtZW1vcnkgYnVmZmVyLCBhbmQgbWFraW5nIGJmZF9yZWFkIGFuZCBiZmRfc2VlayB1c2UgdGhhdCBidWZmZXIuCi0gICAgIFRoaXMgY2FuIHVzZSBhIGxvdCBvZiBtZW1vcnksIGJ1dCBpdCdzIHNpbXBsZXIgdGhhbiBnZXR0aW5nIGEKLSAgICAgdGVtcG9yYXJ5IGZpbGUsIG1ha2luZyB0aGF0IHdvcmsgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGNhY2hpbmcKLSAgICAgY29kZSwgYW5kIG1ha2luZyBzdXJlIHRoYXQgaXQgaXMgZGVsZXRlZCBhdCBhbGwgYXBwcm9wcmlhdGUKLSAgICAgdGltZXMuICBJdCBjYW4gYmUgY2hhbmdlZCBpZiBpdCBldmVyIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotICAvKiBUaGUgY29tcHJlc3NlZCBmaWxlIHN0YXJ0cyB3aXRoIGEgZHVtbXkgRUNPRkYgZmlsZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3NlZWsgKG5iZmQsIEZJTEhTWiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIG5leHQgZWlnaHQgYnl0ZXMgYXJlIHRoZSByZWFsIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfcmVhZCAoYWIsIDEsIDgsIG5iZmQpICE9IDgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHNpemUgPSBiZmRfaF9nZXRfNjQgKG5iZmQsIGFiKTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7Ci0gICAgICBiZmRfYnl0ZSBkaWN0WzQwOTZdOwotICAgICAgdW5zaWduZWQgaW50IGg7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChuYmZkLCBzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHAgPSBidWY7Ci0KLSAgICAgIGxlZnQgPSBzaXplOwotCi0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGUgbmV4dCBlaWdodCBieXRlcyBhcmUgZm9yLiAqLwotICAgICAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgdW5jb21wcmVzc2lvbiBhbGdvcml0aG0uICBJdCdzIGEgc2ltcGxlCi0JIGRpY3Rpb25hcnkgYmFzZWQgc2NoZW1lIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGlzIHByZWRpY3RlZAotCSBieSBhIGhhc2ggb2YgdGhlIHByZXZpb3VzIHRocmVlIGNoYXJhY3RlcnMuICBBIGNvbnRyb2wgYnl0ZQotCSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIHByZWRpY3RlZCBvciB3aGV0aGVyIGl0Ci0JIGFwcGVhcnMgaW4gdGhlIGlucHV0IHN0cmVhbTsgZWFjaCBjb250cm9sIGJ5dGUgbWFuYWdlcyB0aGUKLQkgbmV4dCBlaWdodCBieXRlcyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gICovCi0gICAgICBtZW1zZXQgKGRpY3QsIDAsIHNpemVvZiBkaWN0KTsKLSAgICAgIGggPSAwOwotICAgICAgd2hpbGUgKGJmZF9yZWFkICgmYiwgMSwgMSwgbmJmZCkgPT0gMSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYiA+Pj0gMSkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIG47Ci0KLQkgICAgICBpZiAoKGIgJiAxKSA9PSAwKQotCQluID0gZGljdFtoXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBiZmRfcmVhZCAoJm4sIDEsIDEsIG5iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZGljdFtoXSA9IG47Ci0JCX0KLQotCSAgICAgICpwKysgPSBuOwotCi0JICAgICAgLS1sZWZ0OwotCSAgICAgIGlmIChsZWZ0ID09IDApCi0JCWJyZWFrOwotCi0JICAgICAgaCA8PD0gNDsKLQkgICAgICBoIF49IG47Ci0JICAgICAgaCAmPSBzaXplb2YgZGljdCAtIDE7Ci0JICAgIH0KLQotCSAgaWYgKGxlZnQgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhlIHVuY29tcHJlc3NlZCBmaWxlIGNvbnRlbnRzIGFyZSBpbiBidWYuICAqLwotICBiaW0gPSAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopCi0JIGJmZF9hbGxvYyAobmJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpKTsKLSAgaWYgKGJpbSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiaW0tPnNpemUgPSBzaXplOwotICBiaW0tPmJ1ZmZlciA9IGJ1ZjsKLQotICBuYmZkLT5tdGltZV9zZXQgPSB0cnVlOwotICBuYmZkLT5tdGltZSA9IHN0cnRvbCAoaGRyLT5hcl9kYXRlLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gIG5iZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICBCRkRfQVNTRVJUICghIG5iZmQtPmNhY2hlYWJsZSk7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChuYmZkICE9IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChuYmZkKTsKLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBhcmNoaXZlZCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgZmlsZV9wdHIgZmlsZXN0YXJ0OwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFyZWx0ZGF0YSAqdDsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHVzZSBhcmVsdF9zaXplIGhlcmUsIGJlY2F1c2UgdGhhdCB1c2VzIHBhcnNlZF9zaXplLAotICAgICAgICAgd2hpY2ggaXMgdGhlIHVuY29tcHJlc3NlZCBzaXplLiAgV2UgbmVlZCB0aGUgY29tcHJlc3NlZCBzaXplLiAgKi8KLSAgICAgIHQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBsYXN0X2ZpbGUtPmFyZWx0X2RhdGE7Ci0gICAgICBoID0gKHN0cnVjdCBhcl9oZHIgKikgdC0+YXJjaF9oZWFkZXI7Ci0gICAgICBzaXplID0gc3RydG9sIChoLT5hcl9zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogT3BlbiB0aGUgYXJjaGl2ZSBmaWxlIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGFybWFwLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0MCi0vKiBUaGlzIGlzIHRoZSBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoZSBiYWNrZW5kIGZpZWxkIG9mIHRoZQotICAgdGFyZ2V0IHZlY3RvciBwb2ludHMgdG8gdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhIGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgRklMTk1MRU4sIHRydWUsIGZhbHNlLCA0LCBmYWxzZSwgMiwKLSAgICBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbiwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbiwgTlVMTCwKLSAgICBhbHBoYV9lY29mZl9iYWRfZm9ybWF0X2hvb2ssIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICAgIGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2ssIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MsCi0gICAgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTAotICB9LAotICAvKiBTdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgYmZkX2FyY2hfYWxwaGEsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX182NCIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgyMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgdHJ1ZSwKLSAgLyogQml0c2l6ZSBvZiBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgNjQsCi0gIC8qIFJlbG9jIHRvIHVzZSBmb3IgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gICZhbHBoYV9ob3d0b190YWJsZVtBTFBIQV9SX1JFRlFVQURdLAotICB7Ci0gICAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gICAgbWFnaWNTeW0yLAotICAgIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgICA4LAotICAgIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgICBlY29mZl9zd2FwX29wdF9pbiwKLSAgICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gICAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gICAgZWNvZmZfc3dhcF9leHRfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbwotICB9LAotICAvKiBFeHRlcm5hbCByZWxvYyBzaXplLiAgKi8KLSAgUkVMU1osCi0gIC8qIFJlbG9jIHN3YXBwaW5nIGZ1bmN0aW9ucy4gICovCi0gIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICAvKiBCYWNrZW5kIHJlbG9jIHR3ZWFraW5nLiAgKi8KLSAgYWxwaGFfYWRqdXN0X3JlbG9jX2luLAotICBhbHBoYV9hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uLAotICAvKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byBmaWxlaGRyIGFuZCBhb3V0aGRyLiAgKi8KLSAgYWxwaGFfYWRqdXN0X2hlYWRlcnMsCi0gIC8qIFJlYWQgYW4gZWxlbWVudCBmcm9tIGFuIGFyY2hpdmUgYXQgYSBnaXZlbiBmaWxlIHBvc2l0aW9uLiAgKi8KLSAgYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBBbHBoYSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBTbyBpcyBnZXR0aW5nIHJlbG9jYXRlZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotY29uc3QgYmZkX3RhcmdldCBlY29mZmFscGhhX2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtbGl0dGxlYWxwaGEiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBhbHBoYV9lY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKGFscGhhX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgJmFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFwb2xsby5jIGIvYmZkL2NvZmYtYXBvbGxvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzVkNTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYXBvbGxvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBcG9sbG8gNjgwMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBUcm95IFJvbGxvICh0cm95QGNibWUudW5zdy5lZHUuYXUpCi0gICBCYXNlZCBvbiBtNjhrIHN0YW5kYXJkIENPRkYgdmVyc2lvbiBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2Fwb2xsby5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgYXBvbGxvY29mZl9ob3d0b190YWJsZVtdOwotI2Vsc2UKLXJlbG9jX2hvd3RvX3R5cGUgYXBvbGxvY29mZl9ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9OR19ORUcsCSAgICAgICAwLCAgLTIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiLTMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBNNjhLQkFETUFHKHgpCi0jZW5kaWYKLSNkZWZpbmUgQVBPTExPX002OCAxCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHZvaWQgYXBvbGxvX3J0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKmludGVybmFsLCBpbnQgcmVsb2NlbnRyeSkpOwotZXh0ZXJuIGludCBhcG9sbG9faG93dG8ycnR5cGUgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0jZWxzZQotdm9pZAotYXBvbGxvX3J0eXBlMmhvd3RvKGludGVybmFsLCByZWxvY2VudHJ5KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgaW50IHJlbG9jZW50cnk7Ci17Ci0gIHN3aXRjaCAocmVsb2NlbnRyeSkgCi0gIHsKLSAgIGNhc2UgUl9SRUxCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMDsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDE7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkc6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAyOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMzsgYnJlYWs7Ci0gICBjYXNlIFJfUENSV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDQ7IGJyZWFrOwotICAgY2FzZSBSX1BDUkxPTkc6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA1OyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HX05FRzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDY7IGJyZWFrOwotICB9Ci19Ci0KLWludCAKLWFwb2xsb19ob3d0bzJydHlwZSAoaW50ZXJuYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmludGVybmFsOwotewotICBpZiAoaW50ZXJuYWwtPnBjX3JlbGF0aXZlKSAKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAotICAgIHsKLSAgICAgY2FzZSAzMjogcmV0dXJuIFJfUENSTE9ORzsKLSAgICAgY2FzZSAxNjogcmV0dXJuIFJfUENSV09SRDsKLSAgICAgY2FzZSA4OiByZXR1cm4gUl9QQ1JCWVRFOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKQotICAgICB7Ci0gICAgICBjYXNlIDMyOiByZXR1cm4gUl9SRUxMT05HOwotICAgICAgY2FzZSAxNjogcmV0dXJuIFJfUkVMV09SRDsKLSAgICAgIGNhc2UgODogcmV0dXJuIFJfUkVMQllURTsKLSAgICAgfQotICB9Ci0gIHJldHVybiBSX1JFTExPTkc7ICAgIAotfQotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIFwKLSAgYXBvbGxvX3J0eXBlMmhvd3RvKGludGVybmFsLCAocmVsb2NlbnRyeSktPnJfdHlwZSkKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoZXh0ZXJuYWwsIGludGVybmFsKSBcCi0gIGV4dGVybmFsLnJfdHlwZSA9IGFwb2xsb19ob3d0bzJydHlwZShpbnRlcm5hbCk7Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9TWU0KLSNkZWZpbmUgVEFSR0VUX1NZTSBhcG9sbG9jb2ZmX3ZlYwotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX05BTUUKLSNkZWZpbmUgVEFSR0VUX05BTUUgImFwb2xsby1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgMCwgMCwgJ18nLCBOVUxMKQotI2Vsc2UKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgMCwgMCwgMCwgTlVMTCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXJtLmMgYi9iZmQvY29mZi1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4OWI4NC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI1NTIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBNYWNyb3MgZm9yIG1hbmlwdWxhdGlvbiB0aGUgYml0cyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlIGNvZmYgZGF0YQotICAgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgQVBDU18yNl9GTEFHKCAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTXzI2KQotI2RlZmluZSBBUENTX0ZMT0FUX0ZMQUcoICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0FQQ1NfRkxPQVQpCi0jZGVmaW5lIFBJQ19GTEFHKCAgICAgICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfUElDKQotI2RlZmluZSBBUENTX1NFVCggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0FQQ1NfU0VUKQotI2RlZmluZSBTRVRfQVBDU19GTEFHUyggICAgIGFiZmQsIGZsZ3MpCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyA9IFwKLQkJCQkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgfiAoRl9BUENTXzI2IHwgRl9BUENTX0ZMT0FUIHwgRl9QSUMpKSBcCi0JCQkJCSB8IChmbGdzIHwgRl9BUENTX1NFVCkpCi0jZGVmaW5lIElOVEVSV09SS19GTEFHKCAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SSykKLSNkZWZpbmUgSU5URVJXT1JLX1NFVCggICAgICBhYmZkICkgCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfSU5URVJXT1JLX1NFVCkKLSNkZWZpbmUgU0VUX0lOVEVSV09SS19GTEFHKCBhYmZkLCBmbGcgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gRl9JTlRFUldPUkspIFwKLQkJCQkJIHwgKGZsZyB8IEZfSU5URVJXT1JLX1NFVCkpCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgKChzaXplb2YgKGEpKSAvIHNpemVvZiAoKGEpWzBdKSkKLSNlbmRpZgotICAgICAKLXR5cGVkZWYgZW51bSB7YnVua25vd24sIGI5LCBiMTIsIGIyM30gdGh1bWJfcGNyZWxfYnJhbmNodHlwZTsKLS8qIHNvbWUgdHlwZWRlZnMgZm9yIGhvbGRpbmcgaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotCi0gICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVwaWQgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8yMwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8xMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF85Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2FybV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCSAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAlib29sZWFuICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogY29mZl9hcm1fcnR5cGVfdG9faG93dG8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF9jb21tb24KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqLAotCSAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUpKTsKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICogY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotI2VuZGlmCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAgICovCi0gICAKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfYXJtX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIElmIFVTRVJfTEFCRUxfUFJFRklYIGlzIGRlZmluZWQgYXMgIl8iIChzZWUgY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSgpCi0gICBpbiB0aGlzIGZpbGUpLCB0aGVuIFRBUkdFVF9VTkRFUlNDT1JFIHNob3VsZCBiZSBkZWZpbmVkLCBvdGhlcndpc2UgaXQKLSAgIHNob3VsZCBub3QuICAqLwotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNlbmRpZgotCi0vKiBUaGVzZSBtb3N0IGNlcnRhaW5seSBiZWxvbmcgc29tZXdoZXJlIGVsc2UuIEp1c3QgaGFkIHRvIGdldCByaWQgb2YKLSAgIHRoZSBtYW5pZmVzdCBjb25zdGFudHMgaW4gdGhlIGNvZGUuICAqLwotI2RlZmluZSBBUk1fOCAgICAgICAgMAotI2RlZmluZSBBUk1fMTYgICAgICAgMQotI2RlZmluZSBBUk1fMzIgICAgICAgMgotI2RlZmluZSBBUk1fMjYgICAgICAgMwotI2RlZmluZSBBUk1fRElTUDggICAgNAotI2RlZmluZSBBUk1fRElTUDE2ICAgNQotI2RlZmluZSBBUk1fRElTUDMyICAgNgotI2RlZmluZSBBUk1fMjZEICAgICAgNwotLyogOCBpcyB1bnVzZWQgKi8KLSNkZWZpbmUgQVJNX05FRzE2ICAgIDkKLSNkZWZpbmUgQVJNX05FRzMyICAgMTAKLSNkZWZpbmUgQVJNX1JWQTMyICAgMTEKLSNkZWZpbmUgQVJNX1RIVU1COSAgMTIKLSNkZWZpbmUgQVJNX1RIVU1CMTIgMTMKLSNkZWZpbmUgQVJNX1RIVU1CMjMgMTQKLQotI2lmZGVmIEFSTV9XSU5DRQotI3VuZGVmICBBUk1fMzIKLSN1bmRlZiAgQVJNX1JWQTMyCi0jdW5kZWYgIEFSTV8yNgotI3VuZGVmICBBUk1fVEhVTUIxMgotI3VuZGVmICBBUk1fMjZECi0KLSNkZWZpbmUgQVJNXzMyICAgICAgIDEKLSNkZWZpbmUgQVJNX1JWQTMyICAgIDIKLSNkZWZpbmUgQVJNXzI2CSAgICAgMwotI2RlZmluZSBBUk1fVEhVTUIxMiAgNAotI2RlZmluZSBBUk1fMjZEICAgICAgNQotI2RlZmluZSBBUk1fU0VDVElPTiAgMTQKLSNkZWZpbmUgQVJNX1NFQ1JFTCAgIDE1Ci0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYW91dGFybV9zdGRfcmVsb2NfaG93dG9bXSA9IAotewotICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCi0jaWZkZWYgQVJNX1dJTkNFCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPIChBUk1fMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyAoQVJNX1JWQTMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9SVkEzMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8gKEFSTV8yNiwKLQkyLAotCTIsCi0JMjQsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQlhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCi0JIkFSTV8yNiIsCi0JZmFsc2UsCi0JMHgwMGZmZmZmZiwKLQkweDAwZmZmZmZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPIChBUk1fVEhVTUIxMiwKLQkxLAotCTEsCi0JMTEsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzEyICwKLQkiQVJNX1RIVU1CMTIiLAotCWZhbHNlLAotCTB4MDAwMDA3ZmYsCi0JMHgwMDAwMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyAoQVJNXzI2RCwgIAotCTIsIAotCTIsCi0JMjQsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19kb250LAotCWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUsIAotCSJBUk1fMjZEIiwKLQl0cnVlLAotCTB4MDBmZmZmZmYsCi0JMHgwLAotCWZhbHNlKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8gKEFSTV9TRUNUSU9OLCAgCi0JMCwgCi0JMSwgCi0JMTYsIAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8xNiIsIAotCXRydWUsCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPIChBUk1fU0VDUkVMLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8zMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSNlbHNlIC8qIG5vdCBBUk1fV0lOQ0UgKi8KLSAgSE9XVE8oQVJNXzgsCQkJLyogdHlwZSAqLwotCTAsCQkJLyogcmlnaHRzaGlmdCAqLwotCTAsCQkJLyogc2l6ZSAqLwotCTgsCQkJLyogYml0c2l6ZSAqLwotCWZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JMCwJCQkvKiBiaXRwb3MgKi8KLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQljb2ZmX2FybV9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkiQVJNXzgiLAkJLyogbmFtZSAqLwotICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCTB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCTB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCVBDUkVMT0ZGU0VUCQkvKiBwY3JlbF9vZmZzZXQgKi8pLAotICBIT1dUTyhBUk1fMTYsICAKLQkwLCAKLQkxLCAKLQkxNiwgCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzE2IiwgCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNXzMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8zMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNXzI2LAotCTIsCi0JMiwKLQkyNCwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWFvdXRhcm1fZml4X3BjcmVsXzI2ICwKLQkiQVJNXzI2IiwKLQlmYWxzZSwKLQkweDAwZmZmZmZmLAotCTB4MDBmZmZmZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNX0RJU1A4LCAgICAgICAgCi0JMCwKLQkwLAotCTgsIAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fRElTUDgiLCAgCi0JdHJ1ZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDE2LCAKLQkwLAotCTEsCi0JMTYsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMTYiLAotCXRydWUsCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNX0RJU1AzMiwKLQkwLAotCTIsCi0JMzIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0gCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fRElTUDMyIiwKLQl0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV8yNkQsICAKLQkyLCAKLQkyLAotCTI0LAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQlhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lLCAKLQkiQVJNXzI2RCIsCi0JdHJ1ZSwKLQkweDAwZmZmZmZmLAotCTB4MCwKLQlmYWxzZSksCi0gIC8qIDggaXMgdW51c2VkICovCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPKCBBUk1fTkVHMTYsCi0JMCwKLQktMSwKLQkxNiwKLQlmYWxzZSwKLQkwLCAKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzE2IiwKLSAgICAgICAgdHJ1ZSwgCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLCAKLQlmYWxzZSksCi0gIEhPV1RPKCBBUk1fTkVHMzIsIAotCTAsIAotCS0yLAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ORUczMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9SVkEzMiwgCi0JMCwKLQkyLCAKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fUlZBMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUI5LAotCTEsCi0JMSwKLQk4LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF85ICwKLQkiQVJNX1RIVU1COSIsCi0JZmFsc2UsCi0JMHgwMDAwMDBmZiwKLQkweDAwMDAwMGZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIxMiwKLQkxLAotCTEsCi0JMTEsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzEyICwKLQkiQVJNX1RIVU1CMTIiLAotCWZhbHNlLAotCTB4MDAwMDA3ZmYsCi0JMHgwMDAwMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyggQVJNX1RIVU1CMjMsCi0JMSwKLQkyLAotCTIyLAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF8yMyAsCi0JIkFSTV9USFVNQjIzIiwKLQlmYWxzZSwKLQkweDA3ZmYwN2ZmLAotCTB4MDdmZjA3ZmYsIAotCVBDUkVMT0ZGU0VUKQotI2VuZGlmIC8qIG5vdCBBUk1fV0lOQ0UgKi8KLX07Ci0KLSNkZWZpbmUgTlVNX1JFTE9DUyBOVU1fRUxFTSAoYW91dGFybV9zdGRfcmVsb2NfaG93dG8pCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaW5fcmVsb2NfcCAoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotewotICByZXR1cm4gIWhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBBUk1fUlZBMzI7Ci19ICAgICAKLSNlbmRpZgotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KQkJXAotICAoY2FjaGVfcHRyKS0+aG93dG8gPQkJCQlcCi0gICAgKGRzdCktPnJfdHlwZSA8IE5VTV9SRUxPQ1MJCQlcCi0gICAgPyBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIChkc3QpLT5yX3R5cGUJXAotICAgIDogTlVMTAotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9hcm1fcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9hcm1fcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0KLSAgaWYgKHJlbC0+cl90eXBlID49IE5VTV9SRUxPQ1MpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IEFSTV9SVkEzMikKLSAgICAqYWRkZW5kcCAtPSBwZV9kYXRhIChzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWFvdXRhcm1fZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2NfY29udGludWUgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmVsb2NhdGlvbiA9ICh0YXJnZXQgJiAweDAwZmZmZmZmKSA8PCAyOwotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiAweDAyMDAwMDAwKSAtIDB4MDIwMDAwMDA7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0gIAotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZhb3V0YXJtX3N0ZF9yZWxvY19ob3d0b1tBUk1fMjZEXTsKLQotICByZXR1cm4gZmxhZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYnR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUgYnR5cGU7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIGRzdG1zazsKLSAgYmZkX3ZtYSBvZmZtc2s7Ci0gIGJmZF92bWEgc2lnbmJpdDsKLQotICAvKiBOT1RFOiBUaGlzIHJvdXRpbmUgaXMgY3VycmVudGx5IHVzZWQgYnkgR0FTLCBidXQgbm90IGJ5IHRoZSBsaW5rCi0gICAgIHBoYXNlLiAgKi8KLQotICBzd2l0Y2ggKGJ0eXBlKQotICAgIHsKLSAgICBjYXNlIGI5OgotICAgICAgZHN0bXNrICA9IDB4MDAwMDAwZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDAwMDFmZTsKLSAgICAgIHNpZ25iaXQgPSAweDAwMDAwMTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIxMjoKLSAgICAgIGRzdG1zayAgPSAweDAwMDAwN2ZmOwotICAgICAgb2ZmbXNrICA9IDB4MDAwMDBmZmU7Ci0gICAgICBzaWduYml0ID0gMHgwMDAwMDgwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMjM6Ci0gICAgICBkc3Rtc2sgID0gMHgwN2ZmMDdmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwN2ZmZmZmOwotICAgICAgc2lnbmJpdCA9IDB4MDA0MDAwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2NfY29udGludWUgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgc3dpdGNoIChidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiOToKLSAgICBjYXNlIGIxMjoKLSAgICAgIHJlbG9jYXRpb24gPSAoKHRhcmdldCAmIGRzdG1zaykgPDwgMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjIzOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlyZWxvY2F0aW9uID0gKCh0YXJnZXQgJiAweDdmZikgPDwgMSkgIHwgKCh0YXJnZXQgJiAweDA3ZmYwMDAwKSA+PiA0KTsKLSAgICAgIGVsc2UKLQlyZWxvY2F0aW9uID0gKCh0YXJnZXQgJiAweDdmZikgPDwgMTIpIHwgKCh0YXJnZXQgJiAweDA3ZmYwMDAwKSA+PiAxNSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gc2lnbmJpdCkgLSBzaWduYml0OyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotCi0gIGlmIChyZWxvY2F0aW9uICYgMSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIHNpZ25iaXQpCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfm9mZm1zaykgIT0gfm9mZm1zaykKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH5vZmZtc2spCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfmRzdG1zazsKLSAgc3dpdGNoIChidHlwZSkKLSAgIHsKLSAgIGNhc2UgYjk6Ci0gICBjYXNlIGIxMjoKLSAgICAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDEpOwotICAgICBicmVhazsKLQotICAgY2FzZSBiMjM6Ci0gICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZmKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgICYgMHgwN2ZmMDAwMCk7Ci0gICAgIGVsc2UKLSAgICAgICB0YXJnZXQgfD0gKChyZWxvY2F0aW9uICYgMHhmZmUpIDw8IDE1KSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZik7Ci0gICAgIGJyZWFrOwotCi0gICBkZWZhdWx0OgotICAgICBhYm9ydCAoKTsKLSAgIH0KLQotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJiBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byBbQVJNXzI2RF07Ci0gIAotICAvKiBUT0RPOiBXZSBzaG91bGQgcG9zc2libHkgaGF2ZSBET05FIGVudHJpZXMgZm9yIHRoZSBUSFVNQiBQQ1JFTCByZWxvY2F0aW9ucyAqLwotICByZXR1cm4gZmxhZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF8yMyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGIyMyk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfMTIgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMTIpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzkgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiOSk7Ci19Ci0KLQotc3RhdGljIENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgICBiZmQgKiBhYmZkOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIGoKLSAgCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotI2lmZGVmIEFSTV9XSU5DRQotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBBUk1fMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgICAgICAgICBBUk1fUlZBMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBBUk1fMjYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBBUk1fVEhVTUIxMik7Ci0jZWxzZQotICAgICAgQVNURCAoQkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBBUk1fOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIEFSTV8xNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIEFSTV8zMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIEFSTV8yNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgICAgICAgICAgICAgIEFSTV9ESVNQOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsICAgICAgICAgICAgIEFSTV9ESVNQMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgQVJNX1JWQTMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgQVJNX1RIVU1COSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsIEFSTV9USFVNQjEyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgQVJNX1RIVU1CMjMpOwotI2VuZGlmICAgICAgCi0gICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgQVJNQkFETUFHKHgpCi0jZGVmaW5lIEFSTSAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogRXh0ZW5kIHRoZSBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUgd2l0aCBhIGZldyBBUk0gc3BlY2lmaWMgZmllbGRzLgotICAgVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgZ2xvYmFsIGRhdGEgaGVyZSB3aXRob3V0IGFjdHVhbGx5IGNyZWF0aW5nIGFueQotICAgZ2xvYmFsIHZhcmlhYmxlcywgd2hpY2ggaXMgYSBuby1ubyBpbiB0aGUgQkZEIHdvcmxkLiAgKi8KLXN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG9yaWdpbmFsIGNvZmZfbGlua19oYXNoX3RhYmxlIHN0cnVjdHVyZS4gIE1VU1QgYmUgZmlyc3QgZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUJcm9vdDsKLSAgCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gIGxvbmcgaW50IAkJCXRodW1iX2dsdWVfc2l6ZTsKLSAgCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBBUk0tdG8tVGh1bWIgZ2x1ZS4gICovCi0gIGxvbmcgaW50IAkJCWFybV9nbHVlX3NpemU7Ci0KLSAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgYmZkICoJCQkJYmZkX29mX2dsdWVfb3duZXI7Ci0KLSAgLyogU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQsIG5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuICovCi0gIGludCAJCQkJc3VwcG9ydF9vbGRfY29kZTsKLX07Ci0KLS8qIEdldCB0aGUgQVJNIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX2FybV9oYXNoX3RhYmxlKGluZm8pIFwKLSAgKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBDcmVhdGUgYW4gQVJNIGNvZmYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIHJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgICAgICgmIHJldC0+cm9vdCwgYWJmZCwgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT50aHVtYl9nbHVlX3NpemUgICA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSAgICAgPSAwOwotICByZXQtPmJmZF9vZl9nbHVlX293bmVyID0gTlVMTDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIHZvaWQKLWFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgcmVsb2Nfb2Zmc2V0OwotewotICBiZmRfdm1hIGFkZHIgPSByZWxvY19vZmZzZXQKLSAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotICAgICBhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0KLX0KLQwKLS8qIFRoZSB0aHVtYiBmb3JtIG9mIGEgbG9uZyBicmFuY2ggaXMgYSBiaXQgZmluaWNreSwgYmVjYXVzZSB0aGUgb2Zmc2V0Ci0gICBlbmNvZGluZyBpcyBzcGxpdCBvdmVyIHR3byBmaWVsZHMsIGVhY2ggaW4gaXQncyBvd24gaW5zdHJ1Y3Rpb24uIFRoZXkKLSAgIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXIuIFNvIGdpdmVuIGEgdGh1bWIgZm9ybSBvZiBsb25nIGJyYW5jaCwgYW5kIGFuIAotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uIAotCi0gICBJdCB0YWtlcyB0d28gdGh1bWIgaW5zdHJ1Y3Rpb25zIHRvIGVuY29kZSB0aGUgdGFyZ2V0IGFkZHJlc3MuIEVhY2ggaGFzIAotICAgMTEgYml0cyB0byBpbnZlc3QuIFRoZSB1cHBlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gb25lIChpZGVudGlmZWQgYnkKLSAgIEgtMC4uIHNlZSBiZWxvdyksIHRoZSBsb3dlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIG90aGVyIChpZGVudGlmaWVkIAotICAgYnkgSC0xKS4gCi0KLSAgIENvbWJpbmUgdG9nZXRoZXIgYW5kIHNoaWZ0ZWQgbGVmdCBieSAxIChpdCdzIGEgaGFsZiB3b3JkIGFkZHJlc3MpIGFuZCAKLSAgIHRoZXJlIHlvdSBoYXZlIGl0LgotCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgICAgT3A6IDExMTEgPSBGLAotICAgICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAotCi0gICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0IAotICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCi0KLSAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKLSAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCi0gICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKLSAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKLSAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCi0jZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCi0KLXN0YXRpYyBpbnNuMzIKLWluc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCi0gICAgIGluc24zMiBicl9pbnNuOwotICAgICBpbnQgcmVsX29mZjsKLXsKLSAgdW5zaWduZWQgaW50IGxvd19iaXRzOwotICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOwotCi0KLSAgQkZEX0FTU0VSVCgocmVsX29mZiAmIDEpICE9IDEpOwotCi0gIHJlbF9vZmYgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLwotICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOyAgICAgICAgICAgIC8qIHRoZSBib3R0b20gMTEgYml0cyAqLwotICBoaWdoX2JpdHMgPSAocmVsX29mZiA+PiAxMSkgJiAweDAwMDAwN0ZGOyAgIC8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQoKTsgLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLQwKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0gIAotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIG15aDsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0gIAotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gIEFSTS0+VGh1bWIgZ2x1ZToKLQotICAgICAgIC5hcm0KLSAgICAgICBfX2Z1bmNfZnJvbV9hcm06Ci0JICAgICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotCSAgICAgYnggIHIxMgotICAgICAgIF9fZnVuY19hZGRyOgotICAgICAgICAgICAgLndvcmQgZnVuYyAgICBAIGJlaGF2ZSBhcyBpZiB5b3Ugc2F3IGEgQVJNXzMyIHJlbG9jCi0qLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiAgICAgICA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gICAgPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06CQkJCVRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYgkJCQkudGh1bWIKLSAgIC5hbGlnbiAyCQkJCS5hbGlnbiAyCi0gICAgICBfX2Z1bmNfZnJvbV90aHVtYjoJCSAgIF9fZnVuY19mcm9tX3RodW1iOgotCSAgIGJ4IHBjCQkJCXB1c2gge3I2LCBscn0KLQkgICBub3AJCQkJCWxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtCQkJCQkJbW92ICBsciwgcGMKLSAgICAgIF9fZnVuY19jaGFuZ2VfdG9fYXJtOgkJCWJ4ICAgcjYKLQkgICBiIGZ1bmMgICAJCQkuYXJtCi0JCQkJCSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgCQkgIAkJCQlsZG1pYSByMTMhIHtyNiwgbHJ9Ci0gICAJCQkJCSAgICAgICAgYnggICAgbHIKLSAgIAkJCQkJICAgX19mdW5jX2FkZHI6Ci0JCQkJCSAgICAgICAgLndvcmQJZnVuYyAKLSovCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDIwIDogOCkKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Owotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiAgPSAweDQ2YzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuICAgICA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gID0gMHhiNTQwOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX2xkcl9pbnNuICAgPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gICA9IDB4NDZmZTsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuICAgID0gMHg0NzMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuICAgPSAweGU4YmQ0MDQwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE2X2J4X2luc24gICAgPSAweGUxMmZmZjFlOwotCi0vKiBUT0RPOgotICAgICBXZSBzaG91bGQgcmVhbGx5IGNyZWF0ZSBuZXcgbG9jYWwgKHN0YXRpYykgc3ltYm9scyBpbiBkZXN0aW5hdGlvbgotICAgICBvYmplY3QgZm9yIGVhY2ggc3R1YiB3ZSBjcmVhdGUuICBXZSBzaG91bGQgYWxzbyBjcmVhdGUgbG9jYWwKLSAgICAgKHN0YXRpYykgc3ltYm9scyB3aXRoaW4gdGhlIHN0dWJzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZAotICAgICBUaHVtYiBjb2RlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBkZWJ1Z2dlciBhbmQgZGlzYXNzZW1ibGVyCi0gICAgIGNhbiBwcmVzZW50IGEgYmV0dGVyIHZpZXcgb2Ygc3R1YnMuCi0KLSAgICAgV2UgY2FuIHRyZWF0IHN0dWJzIGxpa2UgbGl0ZXJhbCBzZWN0aW9ucywgYW5kIGZvciB0aGUgVEhVTUI5IG9uZXMKLSAgICAgKHNob3J0IGFkZHJlc3NpbmcgcmFuZ2UpIHdlIHNob3VsZCBiZSBhYmxlIHRvIGluc2VydCB0aGUgc3R1YnMKLSAgICAgYmV0d2VlbiBzZWN0aW9ucy4gaS5lLiB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggKHNpbmNlIHJlbG9jYXRpb25zCi0gICAgIGFyZSBkb25lIG9uIGEgc2VjdGlvbiBiYXNpcykgaXMgdG8gZHVtcCB0aGUgc3R1YnMgYXQgdGhlIGVuZCBvZgotICAgICBwcm9jZXNzaW5nIGEgc2VjdGlvbi4gVGhhdCB3YXkgd2UgY2FuIGFsd2F5cyB0cnkgYW5kIG1pbmltaXNlIHRoZQotICAgICBvZmZzZXQgdG8gYW5kIGZyb20gYSBzdHViLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IG1hcCB3ZWxsIG9udG8KLSAgICAgdGhlIHdheSB0aGF0IHRoZSBsaW5rZXIvQkZEIGRvZXMgaXRzIHdvcms6IG1hcHBpbmcgYWxsIGlucHV0Ci0gICAgIHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucyB2aWEgdGhlIGxpbmtlciBzY3JpcHQgYmVmb3JlIGRvaW5nCi0gICAgIGFsbCB0aGUgcHJvY2Vzc2luZy4KLQotICAgICBVbmZvcnR1bmF0ZWx5IGl0IG1heSBiZSBlYXNpZXIgdG8ganVzdCB0byBkaXNhbGxvdyBzaG9ydCByYW5nZQotICAgICBUaHVtYi0+QVJNIHN0dWJzIChpLmUuIG5vIGNvbmRpdGlvbmFsIGludGVyLXdvcmtpbmcgYnJhbmNoZXMsCi0gICAgIG9ubHkgYnJhbmNoLWFuZC1saW5rIChCTCkgY2FsbHMuICBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIHByb2Nlc3NpbmcKLSAgICAgc2luY2Ugd2UgY2FuIHRoZW4gcHV0IGFsbCBvZiB0aGUgc3R1YnMgaW50byB0aGVpciBvd24gc2VjdGlvbi4KLQotICBUT0RPOgotICAgICBPbiBhIGRpZmZlcmVudCBzdWJqZWN0LCByYXRoZXIgdGhhbiBjb21wbGFpbmluZyB3aGVuIGEKLSAgICAgYnJhbmNoIGNhbm5vdCBmaXQgaW4gdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgIGluc3RydWN0aW9uIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHRyYW1wb2xpbmUgc3R1YiAobmVlZGVkIHRvCi0gICAgIGFkZHJlc3MgdGhlIGNvbXBsZXRlIDMyYml0IGFkZHJlc3Mgc3BhY2UpLiAgKi8KLQotLyogVGhlIHN0YW5kYXJkIENPRkYgYmFja2VuZCBsaW5rZXIgZG9lcyBub3QgY29wZSB3aXRoIHRoZSBzcGVjaWFsIAotICAgVGh1bWIgQlJBTkNIMjMgcmVsb2NhdGlvbi4gIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBzcGxpdCB0aGUKLSAgIEJSQU5DSDIzIGludG8gc2VwZXJhdGUgSEkyMyBhbmQgTE8yMyByZWxvY2F0aW9ucy4gSG93ZXZlciwgaXQgaXMgYQotICAgYml0IHNpbXBsZXIgc2ltcGx5IHByb3ZpZGluZyBvdXIgb3duIHJlbG9jYXRpb24gZHJpdmVyLiAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgQVJNL1RodW1iIENPRkYgbGlua2VyLiAgTk9URToKLSAgIFRoaXMgY29kZSBpcyBhIHZlcnkgc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gIEl0IHdvdWxkIGJlIGEgbXVjaCBtb3JlCi0gICBtYWludGFpbmFibGUgc29sdXRpb24gdG8gaGF2ZSBhIE1BQ1JPIHRoYXQgY291bGQgYmUgZXhwYW5kZWQgd2l0aGluCi0gICBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIHRoYXQgd291bGQgb25seSBiZSBwcm92aWRlZCBmb3IKLSAgIEFSTS9UaHVtYiBidWlsZHMuICBJdCBpcyBvbmx5IHRoZSBjb2RlIG1hcmtlZCBUSFVNQkVYVEVOU0lPTiB0aGF0Ci0gICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDA7Ci0gICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogICAgICAgc3ltOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgICAgcnN0YXQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgaF92YWw7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0KLSAgICAgIGhvd3RvID0gY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSByZWxvY2F0aW9uX3NlY3Rpb24gZnVuY3Rpb24gd2lsbCBza2lwIHBjcmVsX29mZnNldCByZWxvY3MKLSAgICAgICAgIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY29udmVydAotICAgICAgICAgQVJNMjYgdG8gQVJNMjZEIHJlbG9jcyBpZiBwb3NzaWJsZS4gIFdlIHJldHVybiBhIGZha2UgaG93dG8gaW4KLSAgICAgICAgIHRoaXMgY2FzZSB3aXRob3V0IHBjcmVsX29mZnNldCBzZXQsIGFuZCBhZGp1c3QgdGhlIGFkZGVuZCB0bwotICAgICAgICAgY29tcGVuc2F0ZS4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNXzI2Ci0gICAgICAgICAgJiYgaCAhPSBOVUxMCi0gICAgICAgICAgJiYgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmYWtlX2FybTI2X3JlbG9jID0gCi0JICAgIEhPV1RPIChBUk1fMjYsCi0gICAgCSAgICAgICAyLAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDI0LAotICAgIAkgICAgICAgdHJ1ZSwKLSAgICAJICAgICAgIDAsCi0gICAgCSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0gICAgCSAgICAgICBhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCi0gICAgCSAgICAgICAiQVJNXzI2IiwKLSAgICAJICAgICAgIGZhbHNlLAotICAgIAkgICAgICAgMHgwMGZmZmZmZiwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsIAotICAgIAkgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgYWRkZW5kIC09IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgICAgICBob3d0byA9ICZmYWtlX2FybTI2X3JlbG9jOwotICAgICAgICB9Ci0KLSNpZmRlZiBBUk1fV0lOQ0UKLSAgICAgIC8qIE1TIEFSTS1DRSBtYWtlcyB0aGUgcmVsb2MgcmVsYXRpdmUgdG8gdGhlIG9wY29kZSdzIHBjLCBub3QKLQkgdGhlIG5leHQgb3Bjb2RlJ3MgcGMsIHNvIGlzIG9mZiBieSBvbmUuICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmICFpbmZvLT5yZWxvY2F0ZWFibGUpCi0JYWRkZW5kIC09IDg7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCi0gICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5Ci0gICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKLSAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0gICAgICAgICAgICBhZGRlbmQgKz0gc3ltLT5uX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgICAgIC8qIFdlIGRvbid0IG91dHB1dCB0aGUgc3R1YnMgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYQotICAgICAgICAgICAgIHJlbG9jYXRhYmxlIG91dHB1dCBmaWxlLCBzaW5jZSB3ZSBtYXkgYXMgd2VsbCBsZWF2ZSB0aGUKLSAgICAgICAgICAgICBzdHViIGdlbmVyYXRpb24gdG8gdGhlIGZpbmFsIGxpbmtlciBwYXNzLiBJZiB3ZSBmYWlsIHRvCi0JICAgICB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBpcyBkZWZpbmVkLCB3ZSdsbCB0cnkgdG8gYnVpbGQgc3R1YnMKLQkgICAgIGZvciBhbiB1bmRlZmluZWQgbmFtZS4uLiAqLwotICAgICAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgICAgICYmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgICAgICAgICB7Ci0JICAgICAgYXNlY3Rpb24gKiAgIGhfc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lICA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgCi0JICAgICAgLyogaCBsb2NhdGVzIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2MuICAqLwotCSAgICAgIGhfdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaF9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaF9zZWMtPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICAgICAgICAgIGlmIChob3d0by0+dHlwZSA9PSBBUk1fMjYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJICAgIHsKLQkJICAgICAgLyogQXJtIGNvZGUgY2FsbGluZyBhIFRodW1iIGZ1bmN0aW9uICovCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgICAgICAgICAgICB0bXA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQ7Ci0JCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICBzOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X29mZnNldDsKLQkJICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsgCi0JCSAgICAgIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCQkgICAgICAKLQkJICAgICAgbXloID0gZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLQkJICAgICAgaWYgKG15aCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQkJCQotCQkgICAgICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIAotCQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCAKLQkJCQkJCSAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0JCSAgICAgIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLQkJCXsKLQkJCSAgaWYgKGhfc2VjLT5vd25lciAhPSBOVUxMCi0JCQkgICAgICAmJiBJTlRFUldPUktfU0VUIChoX3NlYy0+b3duZXIpCi0JCQkgICAgICAmJiAhIElOVEVSV09SS19GTEFHIChoX3NlYy0+b3duZXIpKQotCQkJICAgIHsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChoX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgIH0KLQotCQkJICAtLW15X29mZnNldDsKLQkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkJICAKLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0Ml9ieF9yMTJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCQkJICAKLQkJCSAgLyogSXQncyBhIHRodW1iIGFkZHJlc3MuICBBZGQgdGhlIGxvdyBvcmRlciBiaXQuICAqLwotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoX3ZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQgKyA4KTsKLQotCQkJfQotCi0JCSAgICAgIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotCQkgICAgICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgCi0JCSAgICAgIHRtcCA9IHRtcCAmIDB4RkYwMDAwMDA7Ci0KLQkJICAgICAgLyogU29tZWhvdyB0aGVzZSBhcmUgYm90aCA0IHRvbyBmYXIsIHNvIHN1YnRyYWN0IDguICovCi0JCSAgICAgIHJldF9vZmZzZXQgPQotCQkJcy0+b3V0cHV0X29mZnNldAotCQkJKyBteV9vZmZzZXQgCi0JCQkrIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCS0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSAKLQkJCSAgICsgcmVsLT5yX3ZhZGRyKQotCQkJLSA4OwotCi0JCSAgICAgIHRtcCA9IHRtcCB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpOwotCQkgICAgICAKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCSAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICBkb25lID0gMTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgCi0jaWZuZGVmIEFSTV9XSU5DRQotCSAgICAgIC8qIE5vdGU6IFdlIHVzZWQgdG8gY2hlY2sgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyICovCi0gICAgICAgICAgICAgIGVsc2UgaWYgKGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX0VYVCAKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19TVEFUCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfTEFCRUwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLQkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQ7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICAgbXloOwotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogIGdsb2JhbHM7Ci0KLQkJICAgICAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotCQkgICAgICBpZiAobXloID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIAotCQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCAKLQkJCQkJCSAgIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIAotCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChoX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJKF8oIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiKSk7Ci0JCQkgICAgfQotCQkJICAKLQkJCSAgLS0gbXlfb2Zmc2V0OwotCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLQkJCSAgaWYgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUpCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9wdXNoX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX2xkcl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTNfbW92X2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhNF9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNik7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTVfcG9wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdDJhNl9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMTIpOwotCQkJICAgICAgCi0JCQkgICAgICAvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGxhc3Qgd29yZCBvZiB0aGUgc3R1Yi4gICovCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoX3ZhbCwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCBteV9vZmZzZXQgKyAxNik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCQkgICAgICAKLQkJCSAgICAgIHJldF9vZmZzZXQgPQotCQkJCSgoYmZkX3NpZ25lZF92bWEpIGhfdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCi0JCQkJLSAoKGJmZF9zaWduZWRfdm1hKQotCQkJCSAgIChzLT5vdXRwdXRfb2Zmc2V0IAkJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgbXlfb2Zmc2V0CQkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkJCQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSAJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JCQkJICAgKyA0CQkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KLQkJCQkgICArIDgpOwkJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotCQkgICAgICAvKiBOb3cgZ28gYmFjayBhbmQgZml4IHVwIHRoZSBvcmlnaW5hbCBCTCBpbnNuIHRvIHBvaW50Ci0JCQkgdG8gaGVyZS4gICovCi0JCSAgICAgIHJldF9vZmZzZXQgPQotCQkJcy0+b3V0cHV0X29mZnNldAotCQkJKyBteV9vZmZzZXQKLQkJCS0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgcmVsLT5yX3ZhZGRyKQotCQkJLTQ7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCSAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkJCQkgIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotCSAgCi0gICAgICAgICAgLyogSWYgdGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgZGVzdGluYXRpb24gc3ltYm9sIGRvZXMgbm90Ci0gICAgICAgICAgICAgZmFsbCBpbnRvIG9uZSBvZiB0aGUgYWJvdmUgY2F0ZWdvcmllcywgdGhlbiB3ZSBjYW4ganVzdAotICAgICAgICAgICAgIHBlcmZvcm0gYSBkaXJlY3QgbGluay4gKi8KLQotCSAgaWYgKGRvbmUpCi0JICAgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZSAKLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLwotCSAgICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLQl7Ci0JICAvKiBFbWl0IGEgcmVsb2MgaWYgdGhlIGJhY2tlbmQgdGhpbmtzIGl0IG5lZWRzIGl0LiAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wKG91dHB1dF9iZmQsIGhvd3RvKSkKLSAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyKTsKLQl9Ci0gIAotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgIGlmIChkb25lKQotCXJzdGF0ID0gYmZkX3JlbG9jX29rOwotI2lmbmRlZiBBUk1fV0lOQ0UKLSAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLwotICAgICAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAgJiYgaG93dG8tPnR5cGUgPT0gQVJNX1RIVU1CMjMpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBUaGlzIGlzIHByZXR0eSBtdWNoIGEgY29weSBvZiB3aGF0IHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGFuZCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gICAgICAgICAgICAgcm91dGluZXMgZG8gdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24sIHdpdGggc3BlY2lhbAotICAgICAgICAgICAgIHByb2Nlc3NpbmcgZm9yIHRoZSBzcGxpdCBhZGRyZXNzaW5nIG9mIHRoZSBUaHVtYiBCTAotICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgQWdhaW4sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHNpbXBsZXIgYWRkaW5nIGEKLSAgICAgICAgICAgICBUaHVtYkJSQU5DSDIzIHNwZWNpZmljIG1hY3JvIGV4cGFuc2lvbiBpbnRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgY29kZS4gICovCi0JICAKLSAgICAgICAgICBiZmRfdm1hIGFkZHJlc3MgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAKLSAgICAgICAgICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgICAgICAgICByZWxvY2F0aW9uICAgICAgID0gdmFsICsgYWRkZW5kOwotCSAgICAgIGludCAgICAgICAgICAgICBzaXplICAgICAgICAgICAgID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICAgICAgYm9vbGVhbiAgICAgICAgIG92ZXJmbG93ICAgICAgICAgPSBmYWxzZTsKLQkgICAgICBiZmRfYnl0ZSAqICAgICAgbG9jYXRpb24gICAgICAgICA9IGNvbnRlbnRzICsgYWRkcmVzczsKLQkgICAgICBiZmRfdm1hICAgICAgICAgeCAgICAgICAgICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCSAgICAgIGJmZF92bWEgICAgICAgICBzcmNfbWFzayAgICAgICAgID0gMHgwMDdGRkZGRTsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQkgICAgICBiZmRfdm1hICAgICAgICAgY2hlY2s7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHNpZ25lZF9jaGVjazsKLQkgICAgICBiZmRfdm1hICAgICAgICAgYWRkOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc2l6ZSA9PSA0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjX3JlbGF0aXZlIHNob3VsZCBiZSBUUlVFIGZvciB0eXBlIDE0IEJSQU5DSDIzICovCi0gICAgICAgICAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjcmVsX29mZnNldCBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0JICAgICAgCi0JICAgICAgLyogTm8gbmVlZCB0byBuZWdhdGUgdGhlIHJlbG9jYXRpb24gd2l0aCBCUkFOQ0gyMy4gKi8KLQkgICAgICAvKiBob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkIGZvciBCUkFOQ0gyMy4gICovCi0JICAgICAgLyogaG93dG8tPnJpZ2h0c2hpZnQgPT0gMSAqLwotCSAgICAgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCi0JICAgICAgCi0JICAgICAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCQkKLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkJIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JCXNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgICAgIGVsc2UKLQkJc2lnbmVkX2NoZWNrID0gKGNoZWNrCi0JCQkJfCAoKGJmZF92bWEpIC0gMQotCQkJCSAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOwotCSAgICAgIAotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJewotCQkgIGFkZCA9ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gNCkgfCAoKCh4KSAmIDB4N2ZmKSA8PCAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFkZCA9ICgoKCh4KSAmIDB4N2ZmKSA8PCAxMikgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE1KSk7Ci0JCX0KLQotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBhbiBhcHByb3ByaWF0ZSBzaWduLgotCQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKLQkJIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JCSBhZGRpbmcsIGl0IGlzIG5lZ2F0aXZlLCBhbmQgd2Ugc3VidHJhY3Qgb3V0IHRoYXQgbnVtYmVyIHRpbWVzCi0JCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKLQkJIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCQkgc2lnbmVkX2FkZCBuZWVkcyBubyBhZGp1c3RtZW50IHRvIGJlY29tZSBuZWdhdGl2ZSBpbiB0aGF0Ci0JCSBjYXNlLiAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfYWRkID0gYWRkOwotCSAgICAgIAotCSAgICAgIGlmICgoYWRkICYgKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykpICE9IDApCi0JCXNpZ25lZF9hZGQgLT0gKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykgPDwgMTsKLQkgICAgICAKLQkgICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQotCQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLQkgICAgICAvKiBob3d0by0+Yml0cG9zID09IDAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQkgICAgICByZWxvY2F0aW9uICs9IHNpZ25lZF9hZGQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKTsKLQotCSAgICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgICAgaWYgKCAgIHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJICB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgCi0JICAgICAgLyogUHV0IFJFTE9DQVRJT04gaW50byB0aGUgY29ycmVjdCBiaXRzOiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgJiAweDA3ZmYwMDAwKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSBjb3JyZWN0IGJpdHMgb2YgWDogICovCi0JICAgICAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgcmVsb2NhdGlvbik7Ci0KLQkgICAgICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0KLQkgICAgICByc3RhdCA9IG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCBhZGRlbmQpOwotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgIC8qIEZJWE1FOiAKLQkgSXMgdGhpcyB0aGUgYmVzdCB3YXkgdG8gZml4IHVwIHRodW1iIGFkZHJlc3Nlcz8ga3JrQGN5Z251cy5jb20KLQkgUHJvYmFibHkgbm90LCBidXQgaXQgd29ya3MsIGFuZCBpZiBpdCB3b3JrcyBpdCBkb24ndCBuZWVkIGZpeGluZyEgIG5pY2tjQGN5Z251cy5jb20gKi8KLSAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLwotICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiAocmVsLT5yX3R5cGUgPT0gQVJNXzMyIHx8IHJlbC0+cl90eXBlID09IEFSTV9SVkEzMikpCi0JewotCSAgLyogRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gc2V0IHRoZSBib3R0b20gYml0IG9mIGEgcmVsb2NhdGVkIGFkZHJlc3MKLQkgICAgIGJlY2F1c2UgdGhlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgYSBUaHVtYiBjb2RlIHN5bWJvbC4gICovCi0JICAgICAKLQkgIGludCBwYXRjaGl0ID0gZmFsc2U7Ci0JICAKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiAoICAgaC0+Y2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgfHwgaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpKQotCSAgICB7Ci0JICAgICAgcGF0Y2hpdCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bSAhPSBOVUxMCi0JCSAgICYmIHN5bS0+bl9zY251bSA+IE5fVU5ERUYpCi0JICAgIHsKLQkgICAgICAvKiBObyBoYXNoIGVudHJ5IC0gdXNlIHRoZSBzeW1ib2wgaW5zdGVhZC4gICovCi0KLQkgICAgICBpZiAoICAgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICB8fCBzeW0tPm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DKQotCQlwYXRjaGl0ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBpZiAocGF0Y2hpdCkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlICogbG9jYXRpb24gPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgICBiZmRfdm1hICAgIHggICAgICAgID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0KLQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHggfCAxLCBsb2NhdGlvbik7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8gICAgICAKLSAgICAgIAotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1ib29sZWFuCi1iZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoaW5mbykgCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgIHM7Ci0gIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICAgICBmb287Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotI2lmIDAKLSAgc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2hhciA9ICcxJzsKLSNlbmRpZgotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmFybV9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLSNpZiAwCi0gICAgICBtZW1zZXQgKGZvbywgdGVzdF9jaGFyLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIGlmIChnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotI2lmIDAKLSAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgICBpbmZvOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICBzOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICBteWg7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0gIAotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIAotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOyAvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgLyogVGhlIG9ubHkgdHJpY2sgaGVyZSBpcyB1c2luZyBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplIGFzIHRoZSB2YWx1ZS4gRXZlbgotICAgICB0aG91Z2ggdGhlIHNlY3Rpb24gaXNuJ3QgYWxsb2NhdGVkIHlldCwgdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIGJlIHB1dHRpbmcKLSAgICAgaXQuICAqLwotCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfR0xPQkFMLCAKLQkJCQlzLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICsgMSwKLQkJCQlOVUxMLCB0cnVlLCBmYWxzZSwgCi0JCQkJKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmIG15aCk7Ci0gIAotICBmcmVlICh0bXBfbmFtZSk7Ci0gIAotICBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICs9IEFSTTJUSFVNQl9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgICBpbmZvOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqICAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICAgbXloOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogIGdsb2JhbHM7Ci0KLSAgCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJQlNGX0dMT0JBTCwgcywgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICsgMSwKLQkJCQlOVUxMLCB0cnVlLCBmYWxzZSwgCi0JCQkJKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmIG15aCk7Ci0gIAotICAvKiBJZiB3ZSBtYXJrIGl0ICd0aHVtYicsIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBkbyBhIGJldHRlciBqb2IuICAqLwotICBteWgtPmNsYXNzID0gQ19USFVNQkVYVEZVTkM7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIC8qIEFsbG9jYXRlIGFub3RoZXIgc3ltYm9sIHRvIG1hcmsgd2hlcmUgd2Ugc3dpdGNoIHRvIGFybSBtb2RlLiAgKi8KLSAgICAgIAotI2RlZmluZSBDSEFOR0VfVE9fQVJNICJfXyVzX2NoYW5nZV90b19hcm0iCi0jZGVmaW5lIEJBQ0tfRlJPTV9BUk0gIl9fJXNfYmFja19mcm9tX2FybSIKLSAgCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQ0hBTkdFX1RPX0FSTSkgKyAxKTsKLSAgCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLSAgCi0gIHNwcmludGYgKHRtcF9uYW1lLCBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlID8gQkFDS19GUk9NX0FSTSA6IENIQU5HRV9UT19BUk0sIG5hbWUpOwotCi0gIG15aCA9IE5VTEw7Ci0gIAotICBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJQlNGX0xPQ0FMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUKLQkJCQkrIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlID8gOCA6IDQpLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7ICAKLSAgCi0gIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSArPSBUSFVNQjJBUk1fR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotLyogU2VsZWN0IGEgQkZEIHRvIGJlIHVzZWQgdG8gaG9sZCB0aGUgc2VjdGlvbnMgdXNlZCBieSB0aGUgZ2x1ZSBjb2RlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdHMgaW4gbGQvZW11bHRlbXBsLwotICAge2FybWNvZmYvcGV9LmVtICAqLwotCi1ib29sZWFuCi1iZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICogCQkgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLSAgZmxhZ3dvcmQgICAJCQkgICAgZmxhZ3M7Ci0gIGFzZWN0aW9uICogCQkJICAgIHNlYzsKLSAgICAKLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gIAotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotICAgICAgCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLSAgICAgIAotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciB1c2UuICAqLwotICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBpbmZvLCBzdXBwb3J0X29sZF9jb2RlKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBpbnQJCSAgICAgc3VwcG9ydF9vbGRfY29kZTsKLXsKLSAgYXNlY3Rpb24gKiBzZWM7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICB0byBjb25zdHJ1Y3QgYW55IGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgLyogSGVyZSB3ZSBoYXZlIGEgYmZkIHRoYXQgaXMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGxpbmsuICBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gICovCi0KLSAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKTsKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlID0gc3VwcG9ydF9vbGRfY29kZTsKLSAgCi0gIC8qIFJ1bW1hZ2UgYXJvdW5kIGFsbCB0aGUgcmVsb2NzIGFuZCBtYXAgdGhlIGdsdWUgdmVjdG9ycy4gICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKDsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiBpOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLQljb250aW51ZTsKLQotICAgICAgLyogTG9hZCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIC8qIEZJWE1FOiB0aGVyZSBtYXkgYmUgYSBzdG9yYWdlIGxlYWsgaGVyZS4gKi8KLSAgICAgIAotICAgICAgaSA9IF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgc2VjLCAxLCAwLCAwLCAwKTsKLSAgICAKLSAgICAgIEJGRF9BU1NFUlQgKGkgIT0gMCk7Ci0KLSAgICAgIGZvciAocmVsID0gaTsgcmVsIDwgaSArIHNlYy0+cmVsb2NfY291bnQ7ICsrcmVsKSAKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlICA9IHJlbC0+cl90eXBlOwotCSAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOwotCi0JICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBub3QgYWdhaW5zdCBhIHN5bWJvbCBpdCBjYW5ub3QgY29uY2VybiB1cy4gKi8KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgaW5kZXggaXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2Ygb3VyIHRhYmxlLCBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcuICAqLwotCSAgaWYgKHN5bW5keCA+PSBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSkKLQkgICAgewotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IGlsbGVnYWwgc3ltYm9sIGluZGV4IGluIHJlbG9jOiAlZCIpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bW5keCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bW5keF07Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBzdGF0aWMgc3ltYm9sIGl0IG11c3QgYmUgd2l0aGluCi0JICAgICB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBzbyBjYW5ub3QgYmUgYSBjcm9zcyBBUk0vVGh1bWIgcmVsb2NhdGlvbi4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBBUk1fMjY6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkJIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCQkgaW5zZXJ0IGdsdWUuICAqLwotCSAgICAgIAotCSAgICAgIGlmIChoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChpbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLSNpZm5kZWYgQVJNX1dJTkNFCi0JICAgIGNhc2UgQVJNX1RIVU1CMjM6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIHVzZWQgdG8gbG9vawotCQkgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyIGFzIHdlbGwuICBXZSBuZWVkIHRvIGxvb2sKLQkJIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGFuIGFybSB0YXJnZXQsIHdlCi0JCSBpbnNlcnQgZ2x1ZS4gIElmIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZQotCQkgZ2l2ZW4gYSBjbGFzcyBvZiBDX0VYVCBhbmQgc28gd2Ugd2lsbCBnZW5lcmF0ZSBhIHN0dWIKLQkJIGZvciBpdC4gIFRoaXMgaXMgbm90IHJlYWxseSBhIHByb2JsZW0sIHNpbmNlIHRoZSBsaW5rCi0JCSBpcyBkb29tZWQgYW55d2F5LiAgKi8KLQotCSAgICAgIHN3aXRjaCAoaC0+Y2xhc3MpCi0JCXsKLQkJY2FzZSBDX0VYVDoKLQkJY2FzZSBDX1NUQVQ6Ci0JCWNhc2UgQ19MQUJFTDoKLQkJICByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIDsKLQkJfQotCSAgICAgIGJyZWFrOwotI2VuZGlmCi0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChDT0ZGX0lNQUdFX1dJVEhfUEUpICovCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgCQljb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gCQkJY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIAkJY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHgJCQljb2ZmX2FybV9hZGp1c3Rfc3ltbmR4Ci0jZGVmaW5lIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIAkJY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0jZGVmaW5lIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0CQljb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCQljb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgICAgICBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgICAgICAgICBjb2ZmX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQkJY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0KLS8qIFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2Ugd2FudCB0byBjb252ZXJ0IEFSTTI2IHJlbG9jcwotICAgaW50byBBUk0yNkQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSAzKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gc2VjLT5vdXRwdXRfc2VjdGlvbikKLQlpcmVsLT5yX3R5cGUgPSA3OwotICAgIH0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gbWVyZ2luZyB0aGUgcHJpdmF0ZSBkYXRhIGFyZWFzIG9mIHR3byBCRkRzLgotICAgVGhpcyBpcyBpbXBvcnRhbnQgYXMgaXQgYWxsb3dzIHVzIHRvIGRldGVjdCBpZiB3ZSBhcmUKLSAgIGF0dGVtcHRpbmcgdG8gbWVyZ2UgYmluYXJpZXMgY29tcGlsZWQgZm9yIGRpZmZlcmVudCBBUk0KLSAgIHRhcmdldHMsIGVnIGRpZmZlcmVudCBDUFVzIG9yIGRpZmZlcmVudHMgQVBDUydzLiAgICAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqICAgaWJmZDsKLSAgICAgYmZkICogICBvYmZkOwotewotICBCRkRfQVNTRVJUIChpYmZkICE9IE5VTEwgJiYgb2JmZCAhPSBOVUxMKTsKLQotICBpZiAoaWJmZCA9PSBvYmZkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSB0d28gZm9ybWF0cyBhcmUgZGlmZmVyZW50IHdlIGNhbm5vdCBtZXJnZSBhbnl0aGluZy4KLSAgICAgVGhpcyBpcyBub3QgYW4gZXJyb3IsIHNpbmNlIGl0IGlzIHBlcm1pc3NhYmxlIHRvIGNoYW5nZSB0aGUKLSAgICAgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgaWYgKCAgIGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgdGhlIEFQQ1MgaXMgdGhlIHNhbWUgZm9yIHRoZSB0d28gQkZEcyAqLwotICBpZiAoQVBDU19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChBUENTX1NFVCAob2JmZCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBBUENTIGZsYWcgYml0cyBzZXQsIGZhaWwuICAqLwotCSAgaWYgKEFQQ1NfMjZfRkxBRyAob2JmZCkgIT0gQVBDU18yNl9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJKF8oIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgQVBDU18yNl9GTEFHIChpYmZkKSA/IDI2IDogMzIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgQVBDU18yNl9GTEFHIChvYmZkKSA/IDI2IDogMzIKLQkJICk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAob2JmZCkgIT0gQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotCSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgcmVnaXN0ZXJzIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGludGVnZXIgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgZmxvYXQgcmVnaXN0ZXJzIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAob2JmZCkgIT0gUElDX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChQSUNfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIGFic29sdXRlIHBvc2l0aW9uIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudCIpOwotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfQVBDU19GTEFHUyAob2JmZCwgQVBDU18yNl9GTEFHIChpYmZkKSB8IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkgfCBQSUNfRkxBRyAoaWJmZCkpOwotCSAgCi0JICAvKiBTZXQgdXAgdGhlIGFyY2ggYW5kIGZpZWxkcyBhcyB3ZWxsIGFzIHRoZXNlIGFyZSBwcm9iYWJseSB3cm9uZy4gICovCi0JICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0aGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgZGlmZmVyIGluIHRoZWlyIGludGVyd29ya2luZyBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgaWYgKElOVEVSV09SS19GTEFHIChvYmZkKSAhPSBJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbXNnOwotCi0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgc3VwcG9ydHMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMgbm90LiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iKTsKLQkgICAgICAKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChvYmZkLCBJTlRFUldPUktfRkxBRyAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0gIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJXg6IiksIGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzKTsKLSAgCi0gIGlmIChBUENTX1NFVCAoYWJmZCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6IEFQQ1MgaXMgQVJNIFByb2RlY3VyZSBDYWxsIFN0YW5kYXJkLCBpdCBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIiBbQVBDUy0lZF0iLCBBUENTXzI2X0ZMQUcgKGFiZmQpID8gMjYgOiAzMik7Ci0KLSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgICAgIGlmIChQSUNfRkxBRyAoYWJmZCkpCi0JZnByaW50ZiAoZmlsZSwgXygiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iKSk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZmlsZSwgXygiIFthYnNvbHV0ZSBwb3NpdGlvbl0iKSk7Ci0gICAgfQotICAKLSAgaWYgKCEgSU5URVJXT1JLX1NFVCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgZmxhZyBub3QgaW5pdGlhbGlzZWRdIikpOwotICBlbHNlIGlmIChJTlRFUldPUktfRkxBRyAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIG5vdCBzdXBwb3J0ZWRdIikpOwotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ29waWVzIHRoZSBnaXZlbiBmbGFncyBpbnRvIHRoZSBjb2ZmX3RkYXRhLmZsYWdzIGZpZWxkLgotICAgVHlwaWNhbGx5IHRoZXNlIGZsYWdzIGNvbWUgZnJvbSB0aGUgZl9mbGFnc1tdIGZpZWxkIG9mCi0gICB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgaW1wb3J0YW50LAotICAgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLgotICAgTm90ZTogQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBzdGF0aWMsIGl0IGlzIGV4cGxpY2l0bHkKLSAgIGNhbGxlZCBmcm9tIGJvdGggY29mZmNvZGUuaCBhbmQgcGVpY29kZS5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLV9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotCWJmZCAqCSAgIGFiZmQ7Ci0JZmxhZ3dvcmQgICBmbGFnczsKLXsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0FQQ1MyNikgPyBGX0FQQ1NfMjYgOiAwOwotICAKLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIEFQQ1MgZmllbGQgaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHRvIHRoZSBvcHBvc2l0ZQotICAgICB2YWx1ZS4gICovCi0gIGlmIChBUENTX1NFVCAoYWJmZCkKLSAgICAgICYmICggICAoQVBDU18yNl9GTEFHICAgIChhYmZkKSAhPSBmbGFnKQotCSAgfHwgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkgIT0gKGZsYWdzICYgRl9BUENTX0ZMT0FUKSkKLQkgIHx8IChQSUNfRkxBRyAgICAgICAgKGFiZmQpICE9IChmbGFncyAmIEZfUElDKSkKLQkgICkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZsYWcgfD0gKGZsYWdzICYgKEZfQVBDU19GTE9BVCB8IEZfUElDKSk7Ci0gIAotICBTRVRfQVBDU19GTEFHUyAoYWJmZCwgZmxhZyk7Ci0KLSAgZmxhZyA9IChmbGFncyAmIEZfSU5URVJXT1JLKTsKLSAgCi0gIC8qIElmIHRoZSBCRkQgaGFzIGFscmVhZHkgaGFkIGl0cyBpbnRlcndvcmtpbmcgZmxhZyBzZXQsIGJ1dCBpdAotICAgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgdGhhdCB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gc2V0LAotICAgICB0aGVuIGFzc3VtZSB0aGF0IHRoYXQgbWVyZ2VkIGNvZGUgd2lsbCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcKLSAgICAgYW5kIHNldCB0aGUgZmxhZyBhY2NvcmRpbmdseS4gICovCi0gIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpICE9IGZsYWcpKQotICAgIHsKLSAgICAgIGlmIChmbGFnKQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfKCJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGZsYWcgPSAwOwotICAgIH0KLQotICBTRVRfSU5URVJXT1JLX0ZMQUcgKGFiZmQsIGZsYWcpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcHkgdGhlIGltcG9ydGFudCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGRhdGEKLSAgIGZyb20gb25lIGluc3RhbmNlIG9mIGEgQkZEIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCi0gICAgIGJmZCAqICBzcmM7Ci0gICAgIGJmZCAqICBkZXN0OwotewotICBCRkRfQVNTRVJUIChzcmMgIT0gTlVMTCAmJiBkZXN0ICE9IE5VTEwpOwotIAotICBpZiAoc3JjID09IGRlc3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHNvdXJjZSwgZG8gbm90IGRvCi0gICAgIHRoZSBjb3B5LiAgKi8KLSAgaWYgKHNyYy0+eHZlYyAhPSBkZXN0LT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGNvcHkgdGhlIGZsYWdzIGZpZWxkICovCi0gIGlmIChBUENTX1NFVCAoc3JjKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKGRlc3QpICE9IEFQQ1NfMjZfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChkZXN0KSAhPSBBUENTX0ZMT0FUX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKFBJQ19GTEFHIChkZXN0KSAhPSBQSUNfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlTRVRfQVBDU19GTEFHUyAoZGVzdCwgQVBDU18yNl9GTEFHIChzcmMpIHwgQVBDU19GTE9BVF9GTEFHIChzcmMpCi0JCQl8IFBJQ19GTEFHIChzcmMpKTsKLSAgICB9Ci0KLSAgaWYgKElOVEVSV09SS19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzIHRoZW4gdHVybgotCSAgICAgb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAoZGVzdCkgIT0gSU5URVJXT1JLX0ZMQUcgKHNyYykpCi0JICAgIHsKLQkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBfYmZkX2Vycm9yX2hhbmRsZXIgKCgiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBiaXQgb2YgJXMsIGJlY2F1c2UgdGhlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBjb3BpZWQgaW50byBpdCIpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGRlc3QpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNyYykpOwotCQl9Ci0JICAgICAgCi0JICAgICAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfSU5URVJXT1JLX0ZMQUcgKGRlc3QsIElOVEVSV09SS19GTEFHIChzcmMpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOb3RlOiAgdGhlIGRlZmluaXRpb25zIGhlcmUgb2YgTE9DQUxfTEFCRUxfUFJFRklYIGFuZCBVU0VSX0xBQkVMX1BSRUlGWAotICptdXN0KiBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gZ2NjL2NvbmZpZy9hcm0vY29mZi5oIGFuZCBzZW1pLmggKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxfUFJFRklYICIuIgotI2lmbmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAiXyIKLSNlbmRpZgotCi0vKiBMaWtlIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lLCBidXQKLSAgIGEpIHRlc3QgYWdhaW5zdCBVU0VSX0xBQkVMX1BSRUZJWCwgdG8gYXZvaWQgc3RyaXBwaW5nIGxhYmVscyBrbm93biB0byBiZQotICAgICAgbm9uLWxvY2FsLgotICAgYikgQWxsb3cgb3RoZXIgcHJlZml4ZXMgdGhhbiAiLiIsIGUuZy4gYW4gZW1wdHkgcHJlZml4IHdvdWxkIGNhdXNlIGFsbAotICAgICAgbGFiZWxzIG9mIHRoZSBmb3JtIEx4eHggdG8gYmUgc3RyaXBwZWQuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotewotI2lmZGVmIFVTRVJfTEFCRUxfUFJFRklYCi0gIGlmIChVU0VSX0xBQkVMX1BSRUZJWFswXSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCBVU0VSX0xBQkVMX1BSRUZJWCwgc3RybGVuIChVU0VSX0xBQkVMX1BSRUZJWCkpID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgTE9DQUxfTEFCRUxfUFJFRklYCi0gIC8qIElmIHRoZXJlIGlzIGEgcHJlZml4IGZvciBsb2NhbCBsYWJlbHMgdGhlbiBsb29rIGZvciB0aGlzLgotICAgICBJZiB0aGUgcHJlZml4IGV4aXN0cywgYnV0IGl0IGlzIGVtcHR5LCB0aGVuIGlnbm9yZSB0aGUgdGVzdC4gKi8KLSAgCi0gIGlmIChMT0NBTF9MQUJFTF9QUkVGSVhbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChMT0NBTF9MQUJFTF9QUkVGSVgpOwotICAgICAgCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgTE9DQUxfTEFCRUxfUFJFRklYLCBsZW4pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBQZXJmb3JtIHRoZSBjaGVja3MgYmVsb3cgZm9yIHRoZSByZXN0IG9mIHRoZSBuYW1lLiAgKi8KLSAgICAgIG5hbWUgKz0gbGVuOwotICAgIH0KLSNlbmRpZgotICAKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJ0wnOwotfQotCi0vKiBUaGlzIHBpZWNlIG9mIG1hY2hpbmVyeSBleGlzdHMgb25seSB0byBndWFyYW50ZWUgdGhhdCB0aGUgYmZkIHRoYXQgaG9sZHMKLSAgIHRoZSBnbHVlIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKLQotICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQotICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAotCi0gICBrcmtAY3lnbnVzLmNvbSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1biAoc3ViLCBpbmZvKQotICAgICBiZmQgKiBzdWI7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIHJldHVybiAoc3ViLT5vdXRwdXRfaGFzX2JlZ3VuCi0JICB8fCBzdWIgPT0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mby0+aW5mbyktPmJmZF9vZl9nbHVlX293bmVyKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKHBmaW5mby0+aW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICAKLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChwZmluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gYXJtY29mZl9saXR0bGVfdmVjCi0jZW5kaWYKLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9OQU1FCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAiY29mZi1hcm0tbGl0dGxlIgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNIGFybWNvZmZfYmlnX3ZlYwotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9CSUdfTkFNRQotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgImNvZmYtYXJtLWJpZyIKLSNlbmRpZgotCi0jaWZuZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFIDAKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIEVYVFJBX1NfRkxBR1MgKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKQotI2Vsc2UKLSNkZWZpbmUgRVhUUkFfU19GTEFHUyAwCi0jZW5kaWYKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgdXNlIGluaXRpYWxpc2luZyBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gOwotCi0vKiBUYXJnZXQgdmVjdG9ycy4gICovCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSwgRF9QQUdFRCwgRVhUUkFfU19GTEFHUywgVEFSR0VUX1VOREVSU0NPUkUsICYgVEFSR0VUX0JJR19TWU0pCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9CSUdfTkFNRSwgRF9QQUdFRCwgRVhUUkFfU19GTEFHUywgVEFSR0VUX1VOREVSU0NPUkUsICYgVEFSR0VUX0xJVFRMRV9TWU0pCi0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWF1eC5jIGIvYmZkL2NvZmYtYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjYzOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBcHBsZSBNNjhLIENPRkYgQS9VWCAzLnggZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGthdXhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1hdXgiCi0KLSNpZm5kZWYgVEFSR19BVVgKLSNkZWZpbmUgVEFSR19BVVgKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogNGsgcGFnZXMgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIE9uIEFVWCwgYSBTVFlQX05PTE9BRHxTVFlQX0JTUyBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzaGFyZWQgbGlicmFyeS4gKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLQotI2RlZmluZSBDT0ZGX0NPTU1PTl9BRERFTkQKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIAotICAgICAgICAgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sIAotICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0jZGVmaW5lIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCBjb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wKLQotI2luY2x1ZGUgImNvZmYvYXV4LWNvZmYuaCIgIC8qIG92ZXJyaWRlIGNvZmYvaW50ZXJuYWwuaCBhbmQgY29mZi9tNjhrLmggKi8KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKLQotLyogV2UgbmVlZCBub24tYWJzb2x1dGUgc3ltYm9scyB0byBvdmVycmlkZSBhYnNvbHV0ZSBzeW1ib2xzLiAgVGhpcwotICAgbWlycm9ycyBBcHBsZSdzICJzb2x1dGlvbiIgdG8gbGV0IGEgc3RhdGljIGxpYnJhcnkgc3ltYm9sIG92ZXJyaWRlCi0gICBhIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbC4gIE9uIHRoZSB3aG9sZSBub3QgYSBnb29kIHRoaW5nLCBnaXZlbiBob3cKLSAgIHNoYXJlZCBsaWJyYXJpZXMgd29yayBoZXJlLCBidXQgY2FuIHdvcmsgaWYgeW91IGFyZSBjYXJlZnVsIHdpdGgKLSAgIHdoYXQgeW91IGluY2x1ZGUgaW4gdGhlIHNoYXJlZCBvYmplY3QuICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwKLQkJCQkgICBzdHJpbmcsIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICgoZmxhZ3MgJiAoQlNGX1dBUk5JTkcgfCBCU0ZfQ09OU1RSVUNUT1IgfCBCU0ZfV0VBSykpID09IDAgJiYKLSAgICAgICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pICYmCi0gICAgICAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV3IHN5bWJvbCBpcyBhIGRlZmluaXRpb24gb3IgYW4gaW5kaXJlY3QgZGVmaW5pdGlvbiAqLwotCi0gICAgICAvKiBUaGlzIGJpdCBjb3BpZWQgZnJvbSBsaW5rZXIuYyAqLwotICAgICAgaWYgKGhhc2hwICE9IE5VTEwgJiYgKmhhc2hwICE9IE5VTEwpCi0JewotCSAgaCA9ICpoYXNocDsKLQkgIEJGRF9BU1NFUlQgKHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsIG5hbWUpID09IDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkJKmhhc2hwID0gTlVMTDsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5ub3RpY2VfaGFzaCAhPSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwKLQkgICYmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKSkKLQl7Ci0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+bm90aWNlKSAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaGFzaHAgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKQotCSpoYXNocCA9IGg7Ci0gICAgICAvKiBlbmQgZHVwbGljYXRpb24gZnJvbSBsaW5rZXIuYyAqLwotCi0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQl7Ci0JICBhc2VjdGlvbiAqbXNlYzsKLQotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgICBtc2VjID0gaC0+dS5kZWYuc2VjdGlvbjsKLQkgIGVsc2UKLQkgICAgbXNlYyA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0KLQkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG1zZWMpICYmICFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IHNlY3Rpb247Ci0JICAgICAgaC0+dS5kZWYudmFsdWUgPSB2YWx1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSkKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgZXhpdCBlYXJseSwgZmluaXNoIHByb2Nlc3NpbmcgaW4gdGhlIGdlbmVyaWMgcm91dGluZSAqLwotICByZXR1cm4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgICBoYXNocCk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29mZi1nbzMyLmMgYi9iZmQvY29mZi1nbzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGY0YmUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtZ28zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcyAoREpHUFAgdmFyaWFudCkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCQlnbzMyY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJCSJjb2ZmLWdvMzIiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotI2RlZmluZSBDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFCi0KLSNkZWZpbmUgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnRleHQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5ic3MiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmdudS5saW5rb25jZS5kIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSCAoIi5nbnUubGlua29uY2UudCIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuZ251LmxpbmtvbmNlLnIiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi1oODMwMC5jIGIvYmZkL2NvZmYtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0YmNkZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvMzAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODMwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi0vKiBXZSBkZXJpdmUgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGJhc2ljIEJGRCBoYXNoIHRhYmxlIHRvCi0gICBob2xkIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEFzaWRlIGZyb20gdGhlIAotICAgaW5mbyBzdG9yZWQgYnkgdGhlIGJhc2ljIGhhc2ggdGFibGUsIHdlIG5lZWQgdGhlIG9mZnNldAotICAgb2YgYSBwYXJ0aWN1bGFyIGVudHJ5IHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzCi0gICB0aGUgb2Zmc2V0IHdoZXJlIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgdmVjdG9ycyBzZWN0aW9uIHdoZXJlCi0gICAgIHRoaXMgZW50cnkgbGl2ZXMuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLX07Ci0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLQotICBiZmQgKmFiZmQ7Ci0KLSAgLyogT2Zmc2V0IGF0IHdoaWNoIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1mdW5jdmVjX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICosIGJmZCAqLAotICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLS8qIFRvIGxvb2t1cCBhIHZhbHVlIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIGZ1bmN2ZWNfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoZSBkZXJpdmVkIGg4MzAwIENPRkYgbGlua2VyIHRhYmxlLiAgTm90ZSBpdCdzIGRlcml2ZWQgZnJvbQotICAgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUsIG5vdCB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBoYXNoCi0gICB0YWJsZSEgIFdlIHVzZSB0aGlzIHRvIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEgc3RydWN0dXJlcyB3ZQotICAgbmVlZCB3aGlsZSBsaW5raW5nIG9uIHRoZSBoODMwMC4gICovCi1zdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFNlY3Rpb24gZm9yIHRoZSB2ZWN0b3JzIHRhYmxlLiAgVGhpcyBnZXRzIGF0dGFjaGVkIHRvIGEKLSAgICAgcmFuZG9tIGlucHV0IGJmZCwgd2Uga2VlcCBpdCBoZXJlIGZvciBlYXN5IGFjY2Vzcy4gICovCi0gIGFzZWN0aW9uICp2ZWN0b3JzX3NlYzsKLQotICAvKiBIYXNoIHRhYmxlIG9mIHRoZSBmdW5jdGlvbnMgd2UgbmVlZCB0byBlbnRlciBpbnRvIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICAqLwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZXQgdGhlIEg4LzMwMCBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBoODMwMF9jb2ZmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKGNvZmZfaGFzaF90YWJsZSAocCkpKSkKLQotLyogSW5pdGlhbGl6ZSBmaWVsZHMgd2l0aGluIGEgZnVuY3ZlYyBoYXNoIHRhYmxlIGVudHJ5LiAgQ2FsbGVkIHdoZW5ldmVyCi0gICBhIG5ldyBlbnRyeSBpcyBhZGRlZCB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1mdW5jdmVjX2hhc2hfbmV3ZnVuYyAoZW50cnksIGdlbl90YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmdlbl90YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpyZXQ7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKnRhYmxlOwotCi0gIHJldCA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIGVudHJ5OwotICB0YWJsZSA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICopIGdlbl90YWJsZTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoZ2VuX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikKLSAgICAgICAgIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCBnZW5fdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBOb3RlIHdoZXJlIHRoaXMgZW50cnkgd2lsbCByZXNpZGUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0gIHJldC0+b2Zmc2V0ID0gdGFibGUtPm9mZnNldDsKLQotICAvKiBCdW1wIHRoZSBvZmZzZXQgYXQgd2hpY2ggd2Ugc3RvcmUgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24KLSAgICAgdmVjdG9yLiAgV2UnZCBsaWtlIHRvIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbiwKLSAgICAgYnV0IGl0J3Mgbm90IGVhc2lseSBhdmFpbGFibGUgaGVyZS4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMCkKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDI7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDQ7Ci0gIGVsc2UKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFdmVyeXRoaW5nIHdlbnQgT0suICAqLwotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLXsKLSAgLyogSW5pdGlhbGl6ZSBvdXIgbG9jYWwgZmllbGRzLCB0aGVuIGNhbGwgdGhlIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24KLSAgICAgcm91dGluZS4gICovCi0gIHRhYmxlLT5vZmZzZXQgPSAwOwotICB0YWJsZS0+YWJmZCA9IGFiZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSBhIGRlcml2ZWQgaGFzaCB0YWJsZQotICAgYmFzaWNhbGx5IHRvIGhvbGQgInN0YXRpYyIgaW5mb3JtYXRpb24gZHVyaW5nIGFuIGg4LzMwMCBjb2ZmIGxpbmsKLSAgIHdpdGhvdXQgdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1oODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0gIHJldCA9ICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopCi0gICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdC5yb290LCBhYmZkLCBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgb3VyIGRhdGEuICAqLwotICByZXQtPnZlY3RvcnNfc2VjID0gTlVMTDsKLSAgcmV0LT5mdW5jdmVjX2hhc2hfdGFibGUgPSBOVUxMOwotCi0gIC8qIE9LLiAgRXZlcnl0aGluZydzIGludGlhbGl6ZWQsIHJldHVybiB0aGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgSDgvMzAwIHJlbG9jcy4KLSAgIFdlIG9ubHkgY29tZSBoZXJlIGZvciBwY3JlbCBzdHVmZiBhbmQgcmV0dXJuIG5vcm1hbGx5IGlmIG5vdCBhbiAtciBsaW5rLgotICAgV2hlbiBkb2luZyAtciwgd2UgY2FuJ3QgZG8gYW55IGFyaXRobWV0aWMgZm9yIHRoZSBwY3JlbCBzdHVmZiwgYmVjYXVzZQotICAgdGhlIGNvZGUgaW4gcmVsb2MuYyBhc3N1bWVzIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIHRhcmdldHMgb2YKLSAgIHRoZSBwY3JlbCBicmFuY2hlcy4gIFRoaXMgaXNuJ3Qgc28sIHNpbmNlIHRoZSBIOC8zMDAgY2FuIGRvIHJlbGF4aW5nLCAKLSAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdhcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBlbm91Z2ggdG8KLSAgIGNvbnRhaW4gdGhlIG9mZnNldCByZXF1aXJlZCBmb3IgdGhlIGJyYW5jaCwgc28gd2UgaGF2ZSB0byB1c2UgdGhlIG9ubHkKLSAgIHRoZSBhZGRlbmQgdW50aWwgdGhlIGZpbmFsIGxpbmsgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BlY2lhbCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfUkVMQllURSwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1BDUkJZVEUsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JXT1JELCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JMT05HLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9NT1YxNkIxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhhYmxlIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMTZCMiwgMCwgMSwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBtb3YuYjoxNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNi9wY3JlbCIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjcmVjbC8xNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUEwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMjQvcGNyZWxsIiwgZmFsc2UsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjOC8yNCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjEsIDAsIDEsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MjQiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YyNEIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjI0IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICAvKiBBbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbi4gIFRoaXMgY2F1c2VzIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MKLSAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciBpbiBsby1tZW0gYW5kIHB1dHMgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGZ1bmN0aW9uIHZlY3RvcidzIGVudHJ5IGluIHRoZSBqc3IgaW5zdHJ1Y3Rpb24uICAqLwotICBIT1dUTyAoUl9NRU1fSU5ESVJFQ1QsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjgvaW5kaXJlY3QiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIC8qIEludGVybmFsIHJlbG9jIGZvciByZWxheGluZy4gIFRoaXMgaXMgY3JlYXRlZCB3aGVuIGEgMTZiaXQgcGMtcmVsYXRpdmUKLSAgICAgYnJhbmNoIGlzIHR1cm5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfUENSV09SRF9CLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgYkNDOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9NT1ZMMSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGVjaWFsLCAiMzIvMjQgcmVsYXhhYmxlIG1vdmUiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwyLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMzIvMjQgcmVsYXhlZCBtb3ZlIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9CQ0NfSU5WLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQOCBpbnZlcnRlZCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLQotICBIT1dUTyAoUl9KTVBfREVMLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJEZWxldGVkIGp1bXAiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi19OwotCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIFwKLSAgeyB4LnJfdHlwZSA9IHNlbGVjdF9yZWxvYyhob3d0byk7IH0KLQotI2RlZmluZSBCQURNQUcoeCkgKEg4MzAwQkFETUFHKHgpICYmIEg4MzAwSEJBRE1BRyh4KSAmJiBIODMwMFNCQURNQUcoeCkpCi0jZGVmaW5lIEg4MzAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1ZMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIFNlYXJjaCBhbGwgdGhlIHN5bWJvbHMgZm9yIG9uZSBpbiBJTlBVVF9TRUNUSU9OIHdpdGgKLSAgICAgYWRkcmVzcyBBRERSRVNTLiAgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uCi0JICAmJiAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgcC0+dmFsdWUpID09IGFkZHJlc3MpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIElmIFJFTE9DIHJlcHJlc2VudHMgYSByZWxheGFibGUgaW5zdHJ1Y3Rpb24vcmVsb2MsIGNoYW5nZSBpdCBpbnRvCi0gICB0aGUgcmVsYXhlZCByZWxvYywgbm90aWZ5IHRoZSBsaW5rZXIgdGhhdCBzeW1ib2wgYWRkcmVzc2VzCi0gICBoYXZlIGNoYW5nZWQgKGJmZF9wZXJmb3JtX3NsaXApIGFuZCByZXR1cm4gaG93IG11Y2ggdGhlIGN1cnJlbnQKLSAgIHNlY3Rpb24gaGFzIHNocnVuayBieS4KLQotICAgRklYTUU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBrbm93bGVkZ2Ugb2YgdGhlIG9yZGVyaW5nIG9mIGVudHJpZXMKLSAgIGluIHRoZSBob3d0byB0YWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuICAqLwotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotICBzdGF0aWMgYXNlY3Rpb24gKmxhc3RfaW5wdXRfc2VjdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBhcmVsZW50ICpsYXN0X3JlbG9jID0gTlVMTDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rIC0gYnV0IHdlIGRvbid0IGNoYW5nZSByZWxvYy0+YWRkcmVzcyBoZXJlLAotICAgICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgICB1bmNvb2tlZCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0KLSAgaWYgKGlucHV0X3NlY3Rpb24gIT0gbGFzdF9pbnB1dF9zZWN0aW9uKQotICAgIGxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIE9ubHkgZXhhbWluZSB0aGUgcmVsb2NzIHdoaWNoIG1pZ2h0IGJlIHJlbGF4YWJsZS4gICovCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYvMjQgYml0IGFic29sdXRlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9KTVAxOgotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3MpOwotCi0gICAgICAvKiBBZGp1c3QgZm9yIFJfSk1QMSB2cyBSX0pNUEwxLiAgKi8KLSAgICAgIGRvdCArPSAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfSk1QMSA/IDEgOiAyKTsKLQotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0gIAotICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAtMTI4Li4rMTI4IGluY2x1c2l2ZSwgdGhlbiB3ZSBjYW4gcmVsYXgKLQkgdGhpcyBqdW1wLiAgKzEyOCBpcyB2YWxpZCBzaW5jZSB0aGUgdGFyZ2V0IHdpbGwgbW92ZSB0d28gYnl0ZXMKLQkgY2xvc2VyIGlmIHdlIGRvIHJlbGF4IHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgoaW50KWdhcCA+PSAtMTI4ICYmIChpbnQpZ2FwIDw9IDEyOCApCi0JeyAKLQotCSAgLyogSXQncyBwb3NzaWJsZSB3ZSBtYXkgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcyBicmFuY2ggZW50aXJlbHk7Ci0JICAgICBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYXJvdW5kIHRoaXMgaW5zdHJ1Y3Rpb24sCi0JICAgICBhbmQgdGhlcmUncyBubyBsYWJlbCBhdCB0aGlzIGluc3RydWN0aW9uLCB0aGVuIHdlIGNhbiByZXZlcnNlCi0JICAgICB0aGUgY29uZGl0aW9uIG9uIHRoZSBwcmV2aW91cyBicmFuY2ggYW5kIGVsaW1pbmF0ZSB0aGlzIGp1bXAuCi0KLQkgICAgICAgb3JpZ2luYWw6CQkJbmV3OgotCQkgYkNDIGxhYjEJCQliQ0MnIGxhYjIKLQkJIGptcCBsYWIyCi0JCWxhYjE6CQkJCWxhYjE6Ci0JCi0JICAgICBUaGlzIHNhdmVzIDQgYnl0ZXMgaW5zdGVhZCBvZiB0d28sIGFuZCBzaG91bGQgYmUgcmVsYXRpdmVseQotCSAgICAgY29tbW9uLiAgKi8KLQotCSAgaWYgKGdhcCA8PSAxMjYKLQkgICAgICAmJiBsYXN0X3JlbG9jCi0JICAgICAgJiYgbGFzdF9yZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9QQ1JCWVRFKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlOwotCSAgICAgIGxhc3RfdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAobGFzdF9yZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pICsgMTsKLQotCSAgICAgIGlmIChsYXN0X3ZhbHVlID09IGRvdCArIDIKLQkJICAmJiBsYXN0X3JlbG9jLT5hZGRyZXNzICsgMSA9PSByZWxvYy0+YWRkcmVzcwotCQkgICYmICEgaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgZG90IC0gMikpCi0JCXsKLQkJICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE5OwotCQkgIGxhc3RfcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLQkJICBsYXN0X3JlbG9jLT5zeW1fcHRyX3B0ciA9IHJlbG9jLT5zeW1fcHRyX3B0cjsKLQkJICBsYXN0X3JlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkZW5kOwotCQkgIHNocmluayArPSA0OwotCQkgIGJmZF9wZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgdGhlIDE2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0Ci0gICAgICAgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLCBhZGQgb25lIHRvIHRoZSB2YWx1ZQotICAgICAgICAgYmVjYXVzZSB0aGUgYWRkZW5kIGZpZWxkIGluIFBDcmVsIGp1bXBzIGlzIG9mZiBieSAtMS4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pICsgMTsKLQkKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpZiB3ZSB3ZXJlIHRvIHJlbGF4LiAgKi8KLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbnNuIHRvIHRoZSBicmFuY2ggdGFyZ2V0LiAgKi8KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgYSAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iIGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiA4IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmMDAuLjB4ZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwIG9yCi0JIDB4ZmZmZjAwLi4weGZmZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwaCwgdGhlbiB3ZSBjYW4KLQkgcmVsYXggdGhpcyBtb3YuYiAgKi8KLSAgICAgIGlmICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMAotCSAgICYmIHZhbHVlID49IDB4ZmYwMAotCSAgICYmIHZhbHVlIDw9IDB4ZmZmZikKLQkgIHx8ICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkgICAgICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAgICAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICAgICAmJiB2YWx1ZSA8PSAweGZmZmZmZikpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iLiAgTm90ZSB0aGF0Ci0gICAgICAgaWYgd2UgY2FuJ3QgcmVsYXggdGhpcyBpbnRvIGFuIDggYml0IGFic29sdXRlLCB3ZSdsbCBmYWxsIHRocm91Z2gKLSAgICAgICBhbmQgdHJ5IHRvIHJlbGF4IGl0IGludG8gYSAxNmJpdCBhYnNvbHV0ZS4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdi5iIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogVGhlIGFkZHJlc3MgaXMgaW4gMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLAotCSB0aGVuIHdlIGNhbiByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IGZvdXIgYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDQ7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCi0JICAvKiBEb25lIHdpdGggdGhpcyByZWxvYy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEZBTExUSFJPVUdIIGFuZCB0cnkgdG8gdHVybiB0aGUgMzIvMjQgYml0IHJlbG9jIGludG8gYSAxNiBiaXQKLQkgcmVsb2MuICAqLwotCi0gICAgLyogVGhpcyBpcyBhIDI0LzMyIGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92IGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByaWdodCByYW5nZS4gICovCi0gICAgY2FzZSBSX01PVkwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgaW4gMHgwMDAwLi4weDdmZmYgaW5jbHVzaXZlIG9yCi0gICAgICAgICAweGZmODAwMC4uMHhmZmZmZmYgaW5jbHVzaXZlLCB0aGVuIGl0IGNhbiBiZSByZWxheGVkLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweDdmZmYgfHwgdmFsdWUgPj0gMHhmZjgwMDApCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTm8gb3RoZXIgcmVsb2MgdHlwZXMgcmVwcmVzZW50IHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0KLSAgbGFzdF9yZWxvYyA9IHJlbG9jOwotICBsYXN0X2lucHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uOwotICByZXR1cm4gc2hyaW5rOwotfQotCi0KLS8qIEhhbmRsZSByZWxvY2F0aW9ucyBmb3IgdGhlIEg4LzMwMCwgaW5jbHVkaW5nIHJlbG9jcyBmb3IgcmVsYXhlZAotICAgaW5zdHJ1Y3Rpb25zLgotCi0gICBGSVhNRTogTm90IGFsbCByZWxvY2F0aW9ucyBjaGVjayBmb3Igb3ZlcmZsb3chICAqLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmRfdm1hIHZhbHVlOwotICBiZmRfdm1hIGRvdDsKLSAgaW50IGdhcCx0bXA7Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotCi0gICAgLyogR2VuZXJpYyA4Yml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzKys7Ci0gICAgICBzcmNfYWRkcmVzcysrOwotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIEdlbmVyaWMgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA+IDMyNzY2IHx8IGdhcCA8IC0zMjc2OCkKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyA4Yml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGlzIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPD0gMHhmZgotCSAgfHwgKHZhbHVlID49IDB4MDAwMGZmMDAgJiYgdmFsdWUgPD0gMHgwMDAwZmZmZikKLSAgCSAgfHwgKHZhbHVlID49IDB4MDBmZmZmMDAgJiYgdmFsdWUgPD0gMHgwMGZmZmZmZikKLQkgIHx8ICh2YWx1ZSA+PSAweGZmZmZmZjAwICYmIHZhbHVlIDw9IDB4ZmZmZmZmZmYpKQotCXsKLQkgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSAgICAgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0JICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGRzdF9hZGRyZXNzICs9IDE7Ci0JICBzcmNfYWRkcmVzcyArPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAxNmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogVmFyaW91cyBzaW1wbGUgMjQvMzJiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgIGNhc2UgUl9NT1ZMMToKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQW5vdGhlciAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgdmFsdWUgPSAoKHZhbHVlICYgMHgwMGZmZmZmZikKLQkgICAgICAgfCAoYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIHNyY19hZGRyZXNzKSAmIDB4ZmYwMDAwMDApKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gNDsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJvbHV0ZSByZWxvY2F0aW9uIHRoYXQgd2FzIGZvcm1lcmxseSBhIDI0LzMyYml0Ci0gICAgICAgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX01PVkwyOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPD0gMHg3ZmZmIHx8IHZhbHVlID49IDB4ZmY4MDAwKQotCXsKLQkgIC8qIEluc2VydCB0aGUgMTZiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JICAvKiBGaXggdGhlIG9wY29kZS4gIEZvciBhbGwgdGhlIG1vdmUgaW5zbnMsIHdlIHNpbXBseQotCSAgICAgbmVlZCB0byB0dXJuIG9mZiBiaXQgMHgyMCBpbiB0aGUgcHJldmlvdXMgYnl0ZS4gICovCi0gICAgICAgICAgZGF0YVtkc3RfYWRkcmVzcyAtIDFdICY9IH4weDIwOwotCSAgZHN0X2FkZHJlc3MgKz0gMjsKLQkgIHNyY19hZGRyZXNzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uIGl0c2VsZi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAxXSkKLQl7Ci0JY2FzZSAweDVlOgotCSAgLyoganNyIC0+IGJzciAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDU1LCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSA4Yml0IHZhbHVlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0gICAgICBkc3RfYWRkcmVzcyArPSAxOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMzsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0aGF0IGlzIG5vdyBhbiA4LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgLSAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtkc3RfYWRkcmVzcyAtIDJdKQotCXsKLQljYXNlIDB4NTg6Ci0JICAvKiBiQ0M6MTYgLT4gYkNDOjggKi8KLQkgIC8qIEdldCB0aGUgY29uZGl0aW9uIGNvZGUgZnJvbSB0aGUgb3JpZ2luYWwgaW5zbi4gICovCi0JICB0bXAgPSBkYXRhW2RzdF9hZGRyZXNzIC0gMV07Ci0JICB0bXAgJj0gMHhmMDsKLQkgIHRtcCA+Pj0gNDsKLQotCSAgLyogTm93IG9yIGluIHRoZSBoaWdoIG5pYmJsZSBvZiB0aGUgb3Bjb2RlLiAgKi8KLQkgIHRtcCB8PSAweDQwOwotCi0JICAvKiBXcml0ZSBpdC4gICovCi0JICBiZmRfcHV0XzggKGFiZmQsIHRtcCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMik7Ci0JICBicmVhazsKLQljYXNlIDB4NWM6Ci0JICAvKiBic3I6MTYgLT4gYnNyOjggKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLQkvKiBPdXRwdXQgdGhlIHRhcmdldC4gICovCi0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotCi0JLyogV2UgZG9uJ3QgYWR2YW5jZSBkc3RfYWRkcmVzcyAtLSB0aGUgOGJpdCByZWxvYyBpcyBhcHBsaWVkIGF0Ci0JICAgZHN0X2FkZHJlc3MgLSAxLCBzbyB0aGUgbmV4dCBpbnNuIHNob3VsZCBiZWdpbiBhdCBkc3RfYWRkcmVzcy4gICovCi0Jc3JjX2FkZHJlc3MgKz0gMjsKLQotCWJyZWFrOwotICAgICAgCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0Yml0IGFic29sdXRlIHRoYXQgaXMgbm93IDggYml0cy4gICovCi0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMik7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBGaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtzcmNfYWRkcmVzc10pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyArIDEpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBtb3YuYiB0aGF0IGlzIG5vdyBhbiA4Yml0IGFic29sdXRlIG1vdi5iLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MDA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBtb3YuYiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MjA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGEwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgKyAxOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNikKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEZpeCB0aGUgY29uZGl0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiwgYXBwbHkKLQkgdGhlIHJlbG9jYXRpb24sIGFuZCB1cGRhdGUgdGhlIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfZ2V0XzggKGFiZmQsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpIF4gMSwKLQkJIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcysrOwotICAgICAgc3JjX2FkZHJlc3MrKzsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFuIDhiaXQgbWVtb3J5IGluZGlyZWN0IGluc3RydWN0aW9uIChqbXAvanNyKS4KLQotICAgICAgIFRoZXJlJ3Mgc2V2ZXJhbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gaGFuZGxlCi0gICAgICAgdGhpcyByZWxvY2F0aW9uLgotCi0gICAgICAgSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbCwgdGhlbgotICAgICAgIHdlIHNob3VsZCBoYW5kbGUgaXQganVzdCBSX1JFTEJZVEUuICBMaWtld2lzZSBpZiBpdCdzCi0gICAgICAgZm9yIGEgc3ltYm9sIHdpdGggYSB2YWx1ZSBnZSAwIGFuZCBsZSAweGZmLgotCi0gICAgICAgT3RoZXJ3aXNlIGl0J3MgYSBqdW1wL2NhbGwgdGhyb3VnaCB0aGUgZnVuY3Rpb24gdmVjdG9yLAotICAgICAgIGFuZCB0aGUgbGlua2VyIGlzIGV4cGVjdGVkIHRvIHNldCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yCi0gICAgICAgYW5kIHB1dCB0aGUgcmlnaHQgdmFsdWUgaW50byB0aGUganVtcC9jYWxsIGluc3RydWN0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgewotCS8qIFdlIG5lZWQgdG8gZmluZCB0aGUgc3ltYm9sIHNvIHdlIGNhbiBkZXRlcm1pbmUgaXQncwotCSAgIGFkZHJlc3MgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0JYXN5bWJvbCAqc3ltYm9sOwotCWJmZF92bWEgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpoOwotCWFzZWN0aW9uICp2ZWN0b3JzX3NlYyA9IGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+dmVjdG9yc19zZWM7Ci0KLQkvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbAotCSAgIG9yIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIG5vbm5lZ2F0aXZlIHZhbHVlIDw9IDB4ZmYuICAqLwotCXN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQl2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQlpZiAoc3ltYm9sID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgICB8fCB2YWx1ZSA8PSAweGZmKQotCSAgewotCSAgICAvKiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGluIGEgbWFubmVyIHZlcnkgc2ltaWxhciB0bwotCSAgICAgICBSX1JFTEJZVEVTLiAgIElmIHRoZSB2YWx1ZSBpcyBpbiByYW5nZSwgdGhlbiBqdXN0IHNsYW0KLQkgICAgICAgdGhlIHZhbHVlIGludG8gdGhlIHJpZ2h0IGxvY2F0aW9uLiAgRWxzZSB0cmlnZ2VyIGEKLQkgICAgICAgcmVsb2Mgb3ZlcmZsb3cgY2FsbGJhY2suICAqLwotCSAgICBpZiAodmFsdWUgPD0gMHhmZikKLQkgICAgICB7Ci0JCWJmZF9wdXRfOCAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCWRzdF9hZGRyZXNzICs9IDE7Ci0JCXNyY19hZGRyZXNzICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJCXJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCQlpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCQkgIGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBUaGlzIGlzIGEganVtcC9jYWxsIHRocm91Z2ggYSBmdW5jdGlvbiB2ZWN0b3IsIGFuZCB3ZSdyZQotCSAgIGV4cGVjdGVkIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIG91cnNlbHZlcy4gCi0KLQkgICBGaXJzdCBsb29rIHVwIHRoaXMgc3ltYm9sIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAtLSB3ZSBuZWVkCi0JICAgdGhlIGRlcml2ZWQgbGlua2VyIHN5bWJvbCB3aGljaCBob2xkcyB0aGlzIHN5bWJvbCdzIGluZGV4Ci0JICAgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gICovCi0JbmFtZSA9IHN5bWJvbC0+bmFtZTsKLQlpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLQkgIHsKLQkgICAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0JICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0cmNweSAobmV3X25hbWUsIG5hbWUpOwotCSAgICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCSAgICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCSAgICBuYW1lID0gbmV3X25hbWU7Ci0JICB9Ci0KLQloID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChsaW5rX2luZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBUaGlzIHNob3VsZG4ndCBldmVyIGhhcHBlbi4gIElmIGl0IGRvZXMgdGhhdCBtZWFucyB3ZSd2ZSBnb3QKLQkgICBkYXRhIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kLiAgQWJvcnRpbmcgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUKLQkgICB0aGluayB0byBkbyBoZXJlLiAgKi8KLQlpZiAoaCA9PSBOVUxMIHx8IHZlY3RvcnNfc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQotCS8qIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB2ZWN0b3IgZW50cnkgaW50byB0aGUKLQkgICByZWxvYydzIGFkZHJlc3MuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwKLQkJICAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQgKyBoLT5vZmZzZXQsCi0JCSAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0KLQlkc3RfYWRkcmVzcysrOwotCXNyY19hZGRyZXNzKys7Ci0KLQkvKiBOb3cgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaXRzZWxmLiAgKi8KLQlpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDApCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZSBpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBoCi0JCSB8fCBiZmRfZ2V0X21hY2ggKGlucHV0X3NlY3Rpb24tPm93bmVyKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICBiZmRfcHV0XzMyIChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBHcm9zcy4gIFdlJ3ZlIGFscmVhZHkgd3JpdHRlbiB0aGUgY29udGVudHMgb2YgdGhlIHZlY3RvciBzZWN0aW9uCi0JICAgYmVmb3JlIHdlIGdldCBoZXJlLi4uICBTbyB3ZSB3cml0ZSBpdCBhZ2FpbiB3aXRoIHRoZSBuZXcgZGF0YS4gICovCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzICh2ZWN0b3JzX3NlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgdmVjdG9yc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICB2ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci19Ci0KLQotLyogUm91dGluZSBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgdGhlIHNwZWNpYWwgUl9NRU1fSU5ESVJFQ1QKLSAgIHJlbG9jcyBvbiB0aGUgaDgzMDAuICBJdCdzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgdmVjdG9ycwotICAgc2VjdGlvbiBhbmQgYXR0YWNoaW5nIGl0IHRvIGFuIGlucHV0IGJmZCBhcyB3ZWxsIGFzIHNpemluZwotICAgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEl0IGFsc28gY3JlYXRlcyBvdXIgdmVjdG9ycyBoYXNoIHRhYmxlLgotCi0gICBJdCB1c2VzIHRoZSBnZW5lcmljIGxpbmtlciByb3V0aW5lcyB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMuCi0gICBmcm9tIHRoaXMgQkZEIHRvIHRoZSBiZmQgbGlua2VyIGhhc2ggdGFibGUuICBJdCBtYXkgYWRkIGEgZmV3Ci0gICBzZWxlY3RlZCBzdGF0aWMgc3ltYm9scyB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGNyZWF0ZWQgYSB2ZWN0b3JzIHNlY3Rpb24sIGRvIHNvIG5vdy4gICovCi0gIGlmICghaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXJlIHNldCwgaW5jbHVkaW5nIFNFQ19JTl9NRU1PUlkuICAqLwotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19SRUFET05MWSk7Ci0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJCSAgICAiLnZlY3RvcnMiKTsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gd2Fzbid0IGNyZWF0ZWQsIG9yIHdlIGNvdWxkbid0IHNldCB0aGUgZmxhZ3MsCi0JIHF1aXQgcXVpY2tseSBub3csIHJhdGhlciB0aGFuIGRpZWluZyBhIHBhaW5mdWwgZGVhdGggbGF0ZXIuICAqLwotICAgICAgaWYgKCEgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZShpbmZvKS0+dmVjdG9yc19zZWMsCi0JCQkJICAgICAgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWxzbyBjcmVhdGUgdGhlIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZ1bmN2ZWNfaGFzaF90YWJsZSA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlKSkpOwotCi0gICAgICBpZiAoIWZ1bmN2ZWNfaGFzaF90YWJsZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGVfaW5pdCAoZnVuY3ZlY19oYXNoX3RhYmxlLCBhYmZkLAotCQkJCSAgICBmdW5jdmVjX2hhc2hfbmV3ZnVuYykpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGZ1bmN2ZWNfaGFzaF90YWJsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBhd2F5IGEgcG9pbnRlciB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IGZ1bmN2ZWNfaGFzaF90YWJsZTsKLSAgICB9Ci0KLSAgLyogTG9hZCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotICBmdW5jdmVjX2hhc2hfdGFibGUgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2xzIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICAqLwotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgLyogTm93IHNjYW4gdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGlzIGJmZDsgY3JlYXRlCi0gICAgIGFkZGl0aW9uYWwgc3BhY2UgaW4gdGhlIC52ZWN0b3JzIHNlY3Rpb24gYXMgbmVlZGVkLiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudCwgaTsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLQotICAgICAgLyogU3VjayBpbiB0aGUgcmVsb2NzLCBzeW1ib2xzICYgY2Fub25pY2FsaXplIHRoZW0uICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAocmVsb2Nfc2l6ZSA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxvY3MgPSAoYXJlbGVudCAqKiliZmRfbWFsbG9jICgoc2l6ZV90KXJlbG9jX3NpemUpOwotICAgICAgaWYgKCFyZWxvY3MpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgc3ltYm9scyBzaG91bGQgaGF2ZSBiZWVuIHJlYWQgaW4gYnkgX2JmZF9nZW5lcmljIGxpbmtfYWRkX3N5bWJvbHMKLQkgY2FsbCBhYm92ZWMsIHNvIHdlIGNhbiBjaGVhdCBhbmQgdXNlIHRoZSBwb2ludGVyIHRvIHRoZW0gdGhhdCB3YXMKLQkgc2F2ZWQgaW4gdGhlIGFib3ZlIGNhbGwuICAqLwotICAgICAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbG9jcywgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPD0gMCkKLQl7Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOb3cgd2FsayB0aHJvdWdoIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jID0gcmVsb2NzW2ldOwotCSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogV2UndmUgZ290IGFuIGluZGlyZWN0IHJlbG9jLiAgU2VlIGlmIHdlIG5lZWQgdG8gYWRkIGl0Ci0JICAgICB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUKLQkgICAgIHRvIGFkZCBhIG5ldyBlbnRyeSBmb3IgZWFjaCB1bmlxdWUgc3ltYm9sIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFuIFJfTUVNX0lORElSRUNUIHJlbG9jYXRpb24gZXhjZXB0IGZvciBhIHJlbG9jCi0JICAgICBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBpZiAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfTUVNX0lORElSRUNUCi0JICAgICAgJiYgc3ltYm9sICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQotCSAgICB7Ci0JICAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JCXsKLQkJICBjaGFyICpuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyA5KTsKLQotCQkgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCQkgICAoaW50KXN5bWJvbC0+c2VjdGlvbik7Ci0JCSAgbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0KLQkgICAgICAvKiBMb29rIHRoaXMgc3ltYm9sIHVwIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSwKLQkJCQkgICAgICAgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCi0JICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSwgYWRkCi0JCSBpdCBhbmQgYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJCSAgIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIEJ1bXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEVhY2ggdmVjdG9yCi0JCSAgICAgdGFrZXMgMiBieXRlcyBvbiB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMgb24gdGhlIGg4MzAwaC4gICovCi0JCSAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDApCi0JCSAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICs9IDI7Ci0JCSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkJCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSA0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgcmVsb2NhdGlvbnMsIHJlbGVhc2UgdGhlbS4gICovCi0gICAgICBmcmVlIChyZWxvY3MpOwotICAgIH0KLQotICAvKiBOb3cgYWN0dWFsbHkgYWxsb2NhdGUgc29tZSBzcGFjZSBmb3IgdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEl0J3MKLSAgICAgd2FzdGVmdWwgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSwgYnV0IHRoaXMgaXMgZWFzaWVyLiAgKi8KLSAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBGcmVlIHRoZSBvbGQgY29udGVudHMuICAqLwotICAgICAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cykKLQlmcmVlIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBuZXcgY29udGVudHMuICAqLwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzCi0JPSBiZmRfbWFsbG9jIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMKLSNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4MzAwY29mZl92ZWMsICJjb2ZmLWg4MzAwIiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWVhYTUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvNTAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODUwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSDg1MDBfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMTYgPQotSE9XVE8gKFJfSDg1MDBfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMjQgPQotSE9XVE8gKFJfSDg1MDBfSU1NMjQsIDAsIDEsIDI0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSDg1MDBfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoOCA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfbG93MTYgPQotSE9XVE8gKFJfSDg1MDBfTE9XMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9sb3cxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDggPQotSE9XVE8gKFJfSDg1MDBfUENSRUw4LCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsOCIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWwxNiA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDE2LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDE2IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDE2ID0KLUhPV1RPIChSX0g4NTAwX0hJR0gxNiwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDE2IiwgdHJ1ZSwgMHgwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBIODUwMEJBRE1BRyh4KQotI2RlZmluZSBIODUwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9sb3cxNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGJmZF9ieXRlICpkID0gZGF0YSsqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGQpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgPj4gMTYpLAotCQkgZCApOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkICApOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgID4+MTYpLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWludCBvID0gYmZkX2dldF8zMihpbl9hYmZkLCBkYXRhKyAqZHN0X3B0ciAtMSk7Ci0JdiA9ICh2ICYgMHgwMGZmZmZmZikgfCAobyAmIDB4ZmYwMDAwMCk7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0ciAtMSk7Ci0JKCpkc3RfcHRyKSArPTM7Ci0JKCpzcmNfcHRyKSs9Mzs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpICs9NDsKLQkoKnNyY19wdHIpKz00OzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAzMjc2NyB8fCBnYXAgPCAtMzI3NjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzE2IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSs9MjsKLQkoKnNyY19wdHIpKz0yOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4NTAwY29mZl92ZWMsICJjb2ZmLWg4NTAwIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTM4Ni5jIGIvYmZkL2NvZmYtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ0ZDE0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9HTzMyX0VYRQotI2luY2x1ZGUgImNvZmYvZ28zMmV4ZS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pMzg2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpMzg2IENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTM4Nl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltdmFsdWUgZGlmZjsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbHNlCi0gICAgICAvKiBJbiBQRSBtb2RlLCB3ZSBkbyBub3Qgb2Zmc2V0IHRoZSBjb21tb24gc3ltYm9sLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5Ci0JIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZwotCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDM4NgotCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIC8qIEZJWE1FOiBIb3cgc2hvdWxkIHRoaXMgY2FzZSBiZSBoYW5kbGVkPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICBkaWZmIC09IHBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotI2VuZGlmCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYwotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TICgoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gISBob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnR5cGUgIT0gUl9JTUFHRUJBU0U7Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBFTVBUWV9IT1dUTyAoMCksCi0gIEVNUFRZX0hPV1RPICgxKSwKLSAgRU1QVFlfSE9XVE8gKDIpLAotICBFTVBUWV9IT1dUTyAoMyksCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBIT1dUTyAoUl9ESVIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiZGlyMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBQRSBJTUFHRV9SRUxfSTM4Nl9ESVIzMk5CIHJlbG9jYXRpb24gKDcpLgkqLwotICBIT1dUTyAoUl9JTUFHRUJBU0UsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJ2YTMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgRU1QVFlfSE9XVE8gKDAxMCksCi0gIEVNUFRZX0hPV1RPICgwMTEpLAotICBFTVBUWV9IT1dUTyAoMDEyKSwKLSAgRU1QVFlfSE9XVE8gKDAxMyksCi0gIEVNUFRZX0hPV1RPICgwMTQpLAotICBFTVBUWV9IT1dUTyAoMDE1KSwKLSAgRU1QVFlfSE9XVE8gKDAxNiksCi0gIC8qIEJ5dGUgcmVsb2NhdGlvbiAoMDE3KS4gICovCi0gIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiOCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiAxNi1iaXQgd29yZCByZWxvY2F0aW9uICgwMjApLiAgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMTYiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogMzItYml0IGxvbmd3b3JkIHJlbG9jYXRpb24gKDAyMSkuCSovCi0gIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjMyIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEJ5dGUgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiAoMDIyKS4JICovCi0gIEhPV1RPIChSX1BDUkJZVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiAxNi1iaXQgd29yZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uICgwMjMpLgkqLwotICBIT1dUTyAoUl9QQ1JXT1JELAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiAzMi1iaXQgbG9uZ3dvcmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiAoMDI0KS4gICovCi0gIEhPV1RPIChSX1BDUkxPTkcsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBJMzg2QkFETUFHKHgpCi0jZGVmaW5lIEkzODYgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpCQkJCQlcCi0gICgoY2FjaGVfcHRyKS0+aG93dG8gPQkJCQkJCQlcCi0gICAoKGRzdCktPnJfdHlwZSA8IHNpemVvZiAoaG93dG9fdGFibGUpIC8gc2l6ZW9mIChob3d0b190YWJsZVswXSkJXAotICAgID8gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlCQkJCQlcCi0gICAgOiBOVUxMKSkKLQotLyogRm9yIDM4NiBDT0ZGIGEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBPbiBzb21lIG90aGVyIENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBub3JtYWxseQotICAgU1RZUF9OT0xPQUQuICAqLwotI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgRm9yIG5vcm1hbCBpMzg2IENPRkYsIHdlCi0gICBjYW4gdXNlIHRoZSBnZW5lcmljIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gIEZvciBQRSwgd2UgbmVlZCBvdXIKLSAgIG93biByb3V0aW5lLiAgKi8KLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi0jZWxzZSAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogVGhlIFBFIHJlbG9jYXRlIHNlY3Rpb24gcm91dGluZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCi0gICBhbmQgdGhlIHJlZ3VsYXIgcm91dGluZSBpcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgZm9yIGEKLSAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkgICAgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQkgICAgIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpOwotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotCi0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIENvbnZlcnQgYW4gcnR5cGUgdG8gaG93dG8gZm9yIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBpZiAocmVsLT5yX3R5cGUgPiBzaXplb2YgKGhvd3RvX3RhYmxlKSAvIHNpemVvZiAoaG93dG9fdGFibGVbMF0pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGhvd3RvID0gaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAvKiBDYW5jZWwgb3V0IGNvZGUgaW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gICphZGRlbmRwID0gMDsKLSNlbmRpZgotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBJIHRoaW5rIHdlICpkbyogd2FudCB0byBieXBhc3MgdGhpcy4gIElmIHdlIGRvbid0LCBJIGhhdmUKLQkgc2VlbiBzb21lIGRhdGEgcGFyYW1ldGVycyBnZXQgdGhlIHdyb25nIHJlbG9jYXRpb24gYWRkcmVzcy4KLQkgSWYgSSBsaW5rIHR3byB2ZXJzaW9ucyB3aXRoIGFuZCB3aXRob3V0IHRoaXMgc2VjdGlvbiBieXBhc3NlZAotCSBhbmQgdGhlbiBkbyBhIGJpbmFyeSBjb21wYXJpc29uLCB0aGUgYWRkcmVzc2VzIHdoaWNoIGFyZQotCSBkaWZmZXJlbnQgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgbWFwLiAgVGhlIGNhc2UgaW4gd2hpY2gKLQkgdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAotCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwLiAgKi8KLSAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSNlbmRpZgotICAgIH0KLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCi0gICAgIGNvbW1vbiBzeW1ib2wuICAqLwotICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSA0OwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyaWMgY29kZSBpcyBnb2luZyB0bwotICAgICAgICAgYWRkIGJhY2sgdGhlIHN5bWJvbCB2YWx1ZSBpbiBvcmRlciB0byBjYW5jZWwgb3V0IGFuCi0gICAgICAgICBhZGp1c3RtZW50IGl0IG1hZGUgdG8gdGhlIGFkZGVuZC4gIEhvd2V2ZXIsIHdlIHNldCB0aGUgYWRkZW5kCi0gICAgICAgICB0byAwIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBhZGp1c3QgaGVyZSwKLSAgICAgICAgIHRvIGF2b2lkIHRoZSBhZGp1c3RtZW50IHRoZSBnZW5lcmljIGNvZGUgd2lsbCBtYWtlLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIGdldHRpbmcgYSBiaXQgaGFja2lzaC4gICovCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICBpZiAocmVsLT5yX3R5cGUgPT0gUl9JTUFHRUJBU0UpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX0lNQUdFQkFTRTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfRElSMzI7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1BDUkxPTkc7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1JFTFdPUkQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1BDUldPUkQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUkVMQllURTsKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9QQ1JCWVRFOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfRkFJTCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLQotLyogSWYgaTM4NiBnY2MgdXNlcyB1bmRlcnNjb3JlcyBmb3Igc3ltYm9sIG5hbWVzLCB0aGVuIGl0IGRvZXMgbm90IHVzZQotICAgYSBsZWFkaW5nIGRvdCBmb3IgbG9jYWwgbGFiZWxzLCBzbyBpZiBUQVJHRVRfVU5ERVJTQ09SRSBpcyBkZWZpbmVkCi0gICB3ZSB0cmVhdCBhbGwgc3ltYm9scyBzdGFydGluZyB3aXRoIEwgYXMgbG9jYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnTCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNlbmRpZiAvKiBUQVJHRVRfVU5ERVJTQ09SRSAqLwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpMzg2Y29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pMzg2IiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMKLSNlbmRpZgotICAgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk4NjAuYyBiL2JmZC9jb2ZmLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzYmI1Zi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA4NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBtb3N0bHkgYnkgc3Vic3RpdHV0aW5nICI4NjAiIGZvciAiMzg2IiBpbiBjb2ZmLWkzODYuYwotICAgSGFycnkgRG9sYW4gPGRvbGFuQHNzZC5pbnRlbC5jb20+LCBPY3RvYmVyIDE5OTUKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2k4NjAuaCIKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2k4NjBfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTg2MF9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0vKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLQotLyogRm9yIHNvbWUgcmVhc29uIHdoZW4gdXNpbmcgaTg2MCBDT0ZGIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbiBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzCi0gICBhbnkgZGVzaXJlZCBvZmZzZXQuICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4gICovCi0KLS8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgbmVlZCB0byBkbyBzb21lCi0gICBhZGp1c3RtZW50cyB0byB0aGUgb2JqZWN0IGZpbGUgdGhhdCBhcmUgbm90IGRvbmUgYnkgdGhlCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXZlcnkKLSAgIHJlbG9jIHR5cGUgdG8gbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX2k4NjBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciA4NjAKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLSNpZm5kZWYgUENSRUxPRkZTRVQKLSNkZWZpbmUgUENSRUxPRkZTRVQgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIEVNUFRZX0hPV1RPICgwKSwKLSAgRU1QVFlfSE9XVE8gKDEpLAotICBFTVBUWV9IT1dUTyAoMiksCi0gIEVNUFRZX0hPV1RPICgzKSwKLSAgRU1QVFlfSE9XVE8gKDQpLAotICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPIChSX0RJUjMyLCAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiZGlyMzIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIHs3fSwgKi8KLSAgSE9XVE8gKFJfSU1BR0VCQVNFLCAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAicnZhMzIiLAkgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICBFTVBUWV9IT1dUTyAoMDEwKSwKLSAgRU1QVFlfSE9XVE8gKDAxMSksCi0gIEVNUFRZX0hPV1RPICgwMTIpLAotICBFTVBUWV9IT1dUTyAoMDEzKSwKLSAgRU1QVFlfSE9XVE8gKDAxNCksCi0gIEVNUFRZX0hPV1RPICgwMTUpLAotICBFTVBUWV9IT1dUTyAoMDE2KSwKLSAgSE9XVE8gKFJfUkVMQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjgiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjE2IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIzMiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUkJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQOCIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMTYiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUkxPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgSTg2MEJBRE1BRyh4KQotI2RlZmluZSBJODYwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0JICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKLQotLyogRm9yIDg2MCBDT0ZGIGEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBPbiBzb21lIG90aGVyIENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBub3JtYWxseQotICAgU1RZUF9OT0xPQUQuICAqLwotI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGhvd3RvID0gaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotIAotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCi0gICAgICAvKiBJIHRoaW5rIHdlICpkbyogd2FudCB0byBieXBhc3MgdGhpcy4gIElmIHdlIGRvbid0LCBJIGhhdmUgc2VlbiBzb21lIGRhdGEKLQkgcGFyYW1ldGVycyBnZXQgdGhlIHdyb25nIHJlbGNhdGlvbiBhZGRyZXNzLiAgSWYgSSBsaW5rIHR3byB2ZXJzaW9ucwotCSB3aXRoIGFuZCB3aXRob3V0IHRoaXMgc2VjdGlvbiBieXBhc3NlZCBhbmQgdGhlbiBkbyBhIGJpbmFyeSBjb21wYXJpc29uLAotCSB0aGUgYWRkcmVzc2VzIHdoaWNoIGFyZSBkaWZmZXJlbnQgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgbWFwLiAgVGhlIAotCSBjYXNlIGluIHdoaWNoIHRoaXMgc2VjdGlvbiBoYXMgYmVlbiBieXBhc3NlZCBoYXMgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQKLQkgdG8gdmFsdWVzIEkgY2FuIGZpbmQgaW4gdGhlIG1hcCAqLwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSAKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfaTg2MF9ydHlwZV90b19ob3d0bwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaTNjb2ZmX29iamVjdF9wKGEpCi0gICAgIGJmZCAqYTsKLXsKLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AoYSk7Ci19Ci0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgaTg2MGNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtaTg2MCIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGkzY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgaTNjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1pOTYwLmMgYi9iZmQvY29mZi1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzdmYWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgOTYwIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBJOTYwIDEKLSNkZWZpbmUgQkFETUFHKHgpIEk5NjBCQURNQUcoeCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaTk2MC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCQkvKiB0byBhbGxvdyBlYXNpZXIgYWJzdHJhY3Rpb24tYnJlYWtpbmcgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBvcHRjYWxsX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2k5NjBfcmVsb2NhdGUKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYm9vbGVhbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotI2RlZmluZSBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIDEKLQotI2RlZmluZSBHRVRfU0NOSERSX0FMSUdOIGJmZF9oX2dldF8zMgotI2RlZmluZSBQVVRfU0NOSERSX0FMSUdOIGJmZF9oX3B1dF8zMgotCi0vKiBUaGUgaTk2MCBkb2VzIG5vdCBzdXBwb3J0IGFuIE1NVSwgc28gQ09GRl9QQUdFX1NJWkUgY2FuIGJlCi0gICBhcmJpdHJhcmlseSBzbWFsbC4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDEKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIFRoaXMgc2V0IG9mIGxvY2FsIGxhYmVsIG5hbWVzIGlzIHRha2VuIGZyb20gZ2FzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIChuYW1lWzBdID09ICdMJwotCSAgfHwgKG5hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgKG5hbWVbMV0gPT0gJ0MnCi0JCSAgfHwgbmFtZVsxXSA9PSAnSScKLQkJICB8fCBuYW1lWzFdID09ICcuJykpKTsKLX0KLQotLyogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHVzdWFsIENBTENfQURERU5ELCBidXQgaXQgaW5jbHVkZXMgdGhlCi0gICBzZWN0aW9uIFZNQSBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSNpZm5kZWYgQ0FMQ19BRERFTkQKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IDI1IHx8IHJlbG9jLnJfdHlwZSA9PSAyNykpCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQ0FMTFMJIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMCSAweDBiMDAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFsJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUxfTUFTSyAweDAwZmZmZmZmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1vcHRjYWxsX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgaXRlbSBoYXMgYWxyZWFkeSBiZWVuIHJlbG9jYXRlZCBjb3JyZWN0bHksIGJ1dCB3ZSBtYXkgYmUKLSAgICogYWJsZSB0byBwYXRjaCBpbiB5ZXQgYmV0dGVyIGNvZGUgLSBkb25lIGJ5IGRpZ2dpbmcgb3V0IHRoZQotICAgKiBjb3JyZWN0IGluZm8gb24gdGhpcyBzeW1ib2wgKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJlc3VsdDsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3MgPSBjb2Zmc3ltYm9sKHN5bWJvbF9pbik7Ci0KLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBzeW1ib2xzIHdoaWNoIGFyZW4ndCB0aWVkIHVwIHlldCwKLSAgICAgZXhjZXB0IG1vdmUgdGhlIHJlbG9jLiAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjcy0+c3ltYm9sLnNlY3Rpb24pKSB7Ci0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICB9Ci0gICAgCi0gIC8qIFNvIHRoZSB0YXJnZXQgc3ltYm9sIGhhcyB0byBiZSBvZiBjb2ZmIHR5cGUsIGFuZCB0aGUgc3ltYm9sIAotICAgICBoYXMgdG8gaGF2ZSB0aGUgY29ycmVjdCBuYXRpdmUgaW5mb3JtYXRpb24gd2l0aGluIGl0ICovCi0gIGlmICgoYmZkX2FzeW1ib2xfZmxhdm91cigmY3MtPnN5bWJvbCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgICB8fCAoY3MtPm5hdGl2ZSA9PSAoY29tYmluZWRfZW50cnlfdHlwZSAqKU5VTEwpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgaW50ZXJlc3RpbmcsIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIG91dHB1dHRpbmcgY29mZgotCSBmcm9tIGEgbWl4IG4gbWF0Y2ggaW5wdXQsIGxpbmtpbmcgZnJvbSBjb2ZmIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCSBib3V0IGZpbGUgd2lsbCBjYXVzZSB0aGlzIG1hdGNoIHRvIGJlIHRydWUuIFNob3VsZCBJIGNvbXBsYWluPyAgVGhpcwotCSB3aWxsIG9ubHkgd29yayBpZiB0aGUgYm91dCBzeW1ib2wgaXMgbm9uIGxlYWYuICAqLwotICAgICAgKmVycm9yX21lc3NhZ2UgPQotCShjaGFyICopIF8oInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIpOwotICAgICAgcmVzdWx0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgc3dpdGNoIChjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcykgCi0gICAgICB7Ci0gICAgICBjYXNlIENfTEVBRlNUQVQ6Ci0gICAgICBjYXNlIENfTEVBRkVYVDoKLSAgCS8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmUsIHJlcGxhY2UgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbAotCSAgIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgKi8KLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eCA9ICYoKGNzLT5uYXRpdmUrMiktPnUuYXV4ZW50KTsKLQkgIGludCB3b3JkID0gYmZkX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCSAgaW50IG9sZiA9IChhdXgtPnhfYmFsLnhfYmFsbnRyeSAtIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgQkZEX0FTU0VSVChjcy0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eD09Mik7Ci0KLQkgIC8qIFdlIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbCB0bwotCSAgICAgdGhlIGJhbCBlbnRyeSBwb2ludCAtIHRoZSBvZmZzZXQgb2Ygd2hpY2ggaXMgZGVzY3JpYmVkIGluCi0JICAgICB0aGUgMm5kIGF1eGVudCBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sLiBXZSBrZWVwIHRoZSBuYXRpdmUKLQkgICAgIHN5bSBhbmQgYXV4ZW50cyB1bnRvdWNoZWQsIHNvIHRoZSBkZWx0YSBiZXR3ZWVuIHRoZSB0d28KLQkgICAgIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJhbCBlbnRyeSBwb2ludC4gICovCi0JICB3b3JkID0gKCh3b3JkICsgIG9sZikgICYgQkFMX01BU0spIHwgQkFMOwotICAJICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICAJfQotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIGNhc2UgQ19TQ0FMTDoKLQkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIHN5c3RlbSBjYWxsLCByZXBsYWNlIHdpdGggYSBjYWxscyB0byAjICovCi0JQkZEX0FTU0VSVCgwKTsKLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90Ci0gICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKLSAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKLSAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGhlcmUKLSAgIGJ5IGNvbnZlcnRpbmcgYWxsIHJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcwotICAgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wsIHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQKLSAgIGZpbGUuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSBub3QgdXNpbmcgdGhlIENPRkYKLSAgIHNwZWNpZmljIGJhY2tlbmQgbGlua2VyLiAgSXQgb25seSBkb2VzIHNvbWV0aGluZyB3aGVuIGRvaW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgZmFpbCB3aGVuIG5vdAotICAgZ2VuZXJhdGluZyBDT0ZGIGk5NjAgb3V0cHV0LCBzbyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IG5vIGxvbmdlcgotICAgdXNlZnVsLiAgSXQgd2FzIHVzZWQgYmVmb3JlIHRoaXMgdGFyZ2V0IHdhcyBjb252ZXJ0ZWQgdG8gdXNlIHRoZQotICAgQ09GRiBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1jb2ZmX2k5NjBfcmVsb2NhdGUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNlY3Rpb24gKm9zZWM7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb3QgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKLSAgICB7Ci0gICAgICAvKiBTeW1ib2wgaXMgbm90IGRlZmluZWQsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXQuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKLSAgICB7Ci0gICAgICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhlIHJpZ2h0IGFjdGlvbiBpcyBmb3IgYSBjb21tb24KLSAgICAgICAgIHN5bWJvbC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRoZSByZWxvYyB0byB1c2UgdGhlIHNlY3Rpb24gc3ltYm9sLiAgRklYTUU6IFRoaXMgbWV0aG9kCi0gICAgIGlzIHJpZGljdWxvdXMuICAqLwotICBvc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpLT5vdXRwdXRfc2VjdGlvbjsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPnN5bV9wdHJfcHRyID0KLSAgICAgIChhc3ltYm9sICoqKSBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjX25hbWU7Ci0gICAgICBhc3ltYm9sICoqc3ltcywgKipzeW1fZW5kOwotCi0gICAgICBzZWNfbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBvc2VjKTsKLSAgICAgIHN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotICAgICAgc3ltX2VuZCA9IHN5bXMgKyBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgIGZvciAoOyBzeW1zIDwgc3ltX2VuZDsgc3ltcysrKQotCXsKLQkgIGlmIChiZmRfYXN5bWJvbF9uYW1lICgqc3ltcykgIT0gTlVMTAotCSAgICAgICYmICgqc3ltcyktPnZhbHVlID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqc3ltcyktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5uYW1lLAotCQkJIHNlY19uYW1lKSA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzeW1zID49IHN5bV9lbmQpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9IHN5bXM7Ci0KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgPT0gTlVMTCkKLQl7Ci0JICBvc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCX0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGEgPSAoUFRSKSBzeW1zOwotICAgIH0KLQotICAvKiBMZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBkbyBpdHMgdGhpbmcsIHdoaWNoIHdpbGwgaW5jbHVkZQotICAgICBzdHVmZmluZyB0aGUgc3ltYm9sIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbGxvbmcgPQotICBIT1dUTyAoKHVuc2lnbmVkIGludCkgUl9SRUxMT05HLCAwLCAyLCAzMixmYWxzZSwgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGNvZmZfaTk2MF9yZWxvY2F0ZSwicmVsbG9uZyIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDApOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9faXBybWVkID0KLSAgSE9XVE8gKFJfSVBSTUVELCAwLCAyLCAyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgY29mZl9pOTYwX3JlbG9jYXRlLCAiaXBybWVkICIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDApOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fb3B0Y2FsbCA9Ci0gIEhPV1RPIChSX09QVENBTEwsIDAsMiwyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgb3B0Y2FsbF9jYWxsYmFjaywgIm9wdGNhbGwiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgQkZEX1JFTE9DX0k5NjBfQ0FMTEo6Ci0gICAgICByZXR1cm4gJmhvd3RvX29wdGNhbGw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsbG9uZzsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9faXBybWVkOwotICAgIH0KLX0KLQotLyogVGhlIHJlYWwgY29kZSBpcyBpbiBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLXsJCQkJCQkJXAotICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG9fcHRyOwkJCQlcCi0gICBzd2l0Y2ggKChkc3QpLT5yX3R5cGUpIHsJCQkJXAotICAgICBjYXNlIDE3OiBob3d0b19wdHIgPSAmaG93dG9fcmVsbG9uZzsgYnJlYWs7CVwKLSAgICAgY2FzZSAyNTogaG93dG9fcHRyID0gJmhvd3RvX2lwcm1lZDsgYnJlYWs7CQlcCi0gICAgIGNhc2UgMjc6IGhvd3RvX3B0ciA9ICZob3d0b19vcHRjYWxsOyBicmVhazsJXAotICAgICBkZWZhdWx0OiBob3d0b19wdHIgPSAwOyBicmVhazsJCQlcCi0gICAgIH0JCQkJCQkJXAotICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fcHRyOwkJCVwKLSB9Ci0KLS8qIGk5NjAgQ09GRiBpcyB1c2VkIGJ5IFZ4V29ya3MgNS4xLiAgSG93ZXZlciwgVnhXb3JrcyA1LjEgZG9lcyBub3QKLSAgIGFwcGVhciB0byBjb3JyZWN0bHkgaGFuZGxlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZQotICAgc2FtZSBvYmplY3QgZmlsZS4gIEl0IGFwcGVhcnMgdG8gc2ltcGx5IGRpc2NhcmQgc3VjaCByZWxvY3MsIHJhdGhlcgotICAgdGhhbiBhZGRpbmcgdGhlaXIgdmFsdWVzIGludG8gdGhlIG9iamVjdCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgYnkKLSAgIGNvbnZlcnRpbmcgYWxsIHJlbG9jcyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzIGludG8gcmVsb2NzIGFnYWluc3QKLSAgIGludGVybmFsIHN5bWJvbHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgVGhpcyByb3V0aW5lIGlzCi0gICBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5raW5nIHByb2Nlc3MsIGFuZCBpdCBjcmVhdGVzIHRoZQotICAgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgYXNlY3Rpb24gKm87Ci0gIGJmZF9ieXRlICplc3ltOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlc3ltID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN5bWVzeik7Ci0gIGlmIChlc3ltID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQotICAgICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBvLT5uYW1lLCBTWU1OTUxFTik7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAwOwotICAgICAgaXN5bS5uX3NjbnVtID0gby0+dGFyZ2V0X2luZGV4OwotICAgICAgaXN5bS5uX3R5cGUgPSBUX05VTEw7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19TVEFUOwotICAgICAgaXN5bS5uX251bWF1eCA9IDA7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmlzeW0sIChQVFIpIGVzeW0pOwotCi0gICAgICBpZiAoYmZkX3dyaXRlIChlc3ltLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKLQl7Ci0JICBmcmVlIChlc3ltKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSArPSAxOwotICAgIH0KLQotICBmcmVlIChlc3ltKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIG9wdGltaXplZCBDT0ZGIGxpbmtlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgYm9vbGVhbiBkb25lOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgMTc6IGhvd3RvID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwotCWNhc2UgMjU6IGhvd3RvID0gJmhvd3RvX2lwcm1lZDsgYnJlYWs7Ci0JY2FzZSAyNzogaG93dG8gPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgZG9uZSA9IGZhbHNlOwotCi0gICAgICBpZiAoaG93dG8tPnR5cGUgPT0gUl9PUFRDQUxMICYmICEgaW5mby0+cmVsb2NhdGVhYmxlICYmIHN5bW5keCAhPSAtMSkKLQl7Ci0JICBpbnQgY2xhc3M7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIGNsYXNzID0gaC0+Y2xhc3M7Ci0JICBlbHNlCi0JICAgIGNsYXNzID0gc3ltLT5uX3NjbGFzczsKLQotCSAgc3dpdGNoIChjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhcHBhcmVudGx5IG5vdCBmcm9tIGEgQ09GRiBpbnB1dCBmaWxlLgotICAgICAgICAgICAgICAgICBXZSB3YXJuLCBhbmQgdGhlbiBhc3N1bWUgdGhhdCBpdCBpcyBub3QgYSBsZWFmCi0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywKLQkJICAgICAgXygidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIiksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgotCSAgICBjYXNlIENfTEVBRkVYVDoKLQkgICAgICAvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlOyB1c2UgdGhlIGJhbAotICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgewotCQlsb25nIG9sZjsKLQkJdW5zaWduZWQgbG9uZyB3b3JkOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgewotCQkgICAgQkZEX0FTU0VSVCAoaC0+bnVtYXV4ID09IDIpOwotCQkgICAgb2xmID0gaC0+YXV4WzFdLnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBiZmRfYnl0ZSAqZXN5bXM7Ci0JCSAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JCSAgICBCRkRfQVNTRVJUIChzeW0tPm5fbnVtYXV4ID09IDIpOwotCQkgICAgZXN5bXMgPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLQkJICAgIGVzeW1zICs9IChzeW1uZHggKyAyKSAqIGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLQkJICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW1zLCBzeW0tPm5fdHlwZSwKLQkJCQkJICBzeW0tPm5fc2NsYXNzLCAxLCBzeW0tPm5fbnVtYXV4LAotCQkJCQkgIChQVFIpICZhdXgpOwotCQkgICAgb2xmID0gYXV4LnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0KLQkJd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkgICAoY29udGVudHMKLQkJCQkgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQl3b3JkID0gKCh3b3JkICsgb2xmIC0gdmFsKSAmIEJBTF9NQVNLKSB8IEJBTDsKLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIHdvcmQsCi0JCQkgICAgKGNvbnRlbnRzCi0JCQkgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJZG9uZSA9IHRydWU7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfU0NBTEw6Ci0JICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkgICAgYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsCi0JCQkJCSAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCSAgICB2YWwsIGFkZGVuZCk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGFueSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB0bwotICAgaW5zdGVhZCBiZSBhIHJlbG9jIGFnYWluc3QgdGhlIGludGVybmFsIHN5bWJvbCB3ZSBjcmVhdGVkIHNwZWNpYWxseQotICAgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotCi0gIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gIGlmIChoID09IE5VTEwKLSAgICAgIHx8IChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpcmVsLT5yX3N5bW5keCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleCAtIDE7Ci0gICphZGp1c3RlZHAgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KLQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci0KLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDIChpY29mZl9saXR0bGVfdmVjLCAiY29mZi1JbnRlbC1saXR0bGUiLCAwLCAwLCAnXycsICYgaWNvZmZfYmlnX3ZlYykKLQotY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjID0KLXsKLSAgImNvZmYtSW50ZWwtYmlnIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLWJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLWJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBpY29mZl9saXR0bGVfdmVjLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaWE2NC5jIGIvYmZkL2NvZmYtaWE2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjg2N2U3Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWlhNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQL0ludGVsIElBLTY0IENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9pYTY0LmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgezB9LAotfTsKLQotI2RlZmluZSBCQURNQUcoeCkgSUE2NEJBRE1BRyh4KQotI2RlZmluZSBJQTY0IDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFUDY0Ci0jIHVuZGVmIEFPVVRTWgotIyBkZWZpbmUgQU9VVFNaCQlQRVA2NEFPVVRTWgotIyBkZWZpbmUgUEVBT1VUSERSCVBFUDY0QU9VVEhEUgotI2VuZGlmCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCi0gICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gMDsJCQkvKiBXZSBkb24ndCBkbyByZWxvY3MgZm9yIG5vdy4uLiAqLwotfSAgICAgCi0jZW5kaWYKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWlhNjRjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIFdlIG5lZWQgdG8gaGFjayBiYWRseSB0byBoYW5kbGUgYSBQRSBpbWFnZSBjb3JyZWN0bHkuICBJbiBQRQotICAgICBpbWFnZXMgY3JlYXRlZCBieSB0aGUgR05VIGxpbmtlciwgdGhlIG9mZnNldCB0byB0aGUgQ09GRiBoZWFkZXIKLSAgICAgaXMgYWx3YXlzIHRoZSBzaXplLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gaW1hZ2VzCi0gICAgIGdlbmVyYXRlZCBieSBvdGhlciBQRSBsaW5rZXJzLiAgVGhlIFBFIGZvcm1hdCBzdG9yZXMgYSBmb3VyIGJ5dGUKLSAgICAgb2Zmc2V0IHRvIHRoZSBQRSBzaWduYXR1cmUganVzdCBiZWZvcmUgdGhlIENPRkYgaGVhZGVyIGF0Ci0gICAgIGxvY2F0aW9uIDB4M2Mgb2YgdGhlIGZpbGUuICBXZSBwaWNrIHVwIHRoYXQgb2Zmc2V0LCB2ZXJpZnkgdGhhdAotICAgICB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZXJlLCBhbmQgdGhlbiBzZXQgb3Vyc2VsdmVzIHVwIHRvIHJlYWQgaW4KLSAgICAgdGhlIENPRkYgaGVhZGVyLiAgKi8KLSAgewotICAgIGJmZF9ieXRlIGV4dF9vZmZzZXRbNF07Ci0gICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgIGJmZF9ieXRlIGV4dF9zaWduYXR1cmVbNF07Ci0gICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4M2MsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9vZmZzZXQsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfb2Zmc2V0KTsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X3NpZ25hdHVyZSwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9zaWduYXR1cmUpOwotCi0gICAgaWYgKHNpZ25hdHVyZSAhPSAweDQ1NTApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAvKiBIZXJlIGlzIHRoZSBoYWNrLiAgY29mZl9vYmplY3RfcCB3YW50cyB0byByZWFkIGZpbGhzeiBieXRlcyB0bwotICAgICAgIHBpY2sgdXAgdGhlIENPRkYgaGVhZGVyLiAgV2UgYWRqdXN0IHNvIHRoYXQgdGhhdCB3aWxsIHdvcmsuICAyMAotICAgICAgIGlzIHRoZSBzaXplIG9mIHRoZSBDT0ZGIGZpbGVoZHIuICAqLwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgIChiZmRfdGVsbCAoYWJmZCkKLQkJICAgLSBiZmRfY29mZl9maWxoc3ogKGFiZmQpCi0JCSAgICsgMjApLAotCQkgIFNFRUtfU0VUKQotCSE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpYTY0Y29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pYTY0IiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGlhNjRjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpYTY0Y29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW02OGsuYyBiL2JmZC9jb2ZmLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxMzhjMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoaXMgc291cmNlIGZpbGUgaXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHZhcmlvdXMgbTY4ayBDT0ZGCi0gICB2YXJpYW50cy4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyb2wgaXRzIGJlaGF2aW91cjoKLQotICAgVEFSR0VUX1NZTQotICAgICBUaGUgQyBuYW1lIG9mIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4gIFRoZSBkZWZhdWx0IGlzIG02OGtjb2ZmX3ZlYy4KLSAgIFRBUkdFVF9OQU1FCi0gICAgIFRoZSB1c2VyIHZpc2libGUgdGFyZ2V0IG5hbWUuICBUaGUgZGVmYXVsdCBpcyAiY29mZi1tNjhrIi4KLSAgIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQotICAgICBXaGV0aGVyIHN5bWJvbCBuYW1lcyBoYXZlIGFuIHVuZGVyc2NvcmUuCi0gICBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0gICAgIE9ubHkgZGVjbGFyZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheS4gIERvbid0IGFjdHVhbGx5IGNvbXBpbGUKLSAgICAgaXQuICBUaGUgYWN0dWFsIGFycmF5IHdpbGwgYmUgcGlja2VkIHVwIGluIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUKLSAgICAgZmlsZS4KLSAgIFNUQVRJQ19SRUxPQ1MKLSAgICAgTWFrZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheSwgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25zLCBzdGF0aWMuCi0gICBDT0ZGX0NPTU1PTl9BRERFTkQKLSAgICAgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBjb21tb24KLSAgICAgc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgdGhlIHZhbHVlICh0aGUgc2l6ZSkgb2YgdGhlIGNvbW1vbgotICAgICBzeW1ib2wuICBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYQotICAgICBjb21tb24gc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgemVyby4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotCi0jaWZuZGVmIENPRkZfUEFHRV9TSVpFCi0vKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgyMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiAwCi0jZWxzZQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLSNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIE9uIHRoZSBkZWx0YSwgYSBzeW1ib2wgc3RhcnRpbmcgd2l0aCBMJSBpcyBsb2NhbC4gIFdlIHdvbid0IHNlZQotICAgc3VjaCBhIHN5bWJvbCBvbiBvdGhlciBwbGF0Zm9ybXMsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGFsd2F5cwotICAgY29uc2lkZXIgaXQgbG9jYWwgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJScpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotI2lmbmRlZiBTVEFUSUNfUkVMT0NTCi0vKiBDbGVhbiB1cCBuYW1lc3BhY2UuICAqLwotI2RlZmluZSBtNjhrY29mZl9ob3d0b190YWJsZQlfYmZkX202OGtjb2ZmX2hvd3RvX3RhYmxlCi0jZGVmaW5lIG02OGtfcnR5cGUyaG93dG8JX2JmZF9tNjhrY29mZl9ydHlwZTJob3d0bwotI2RlZmluZSBtNjhrX2hvd3RvMnJ0eXBlCV9iZmRfbTY4a2NvZmZfaG93dG8ycnR5cGUKLSNkZWZpbmUgbTY4a19yZWxvY190eXBlX2xvb2t1cAlfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiByZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW107Ci0jZWxzZQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1yZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKLSNlbmRpZgotI2RlZmluZSBNNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiB2b2lkIG02OGtfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7Ci1leHRlcm4gaW50IG02OGtfaG93dG8ycnR5cGUgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqbTY4a19yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0jZWxzZQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi12b2lkCi1tNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCByZWxvY2VudHJ5KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgaW50IHJlbG9jZW50cnk7Ci17Ci0gIHN3aXRjaCAocmVsb2NlbnRyeSkgCi0gIHsKLSAgIGNhc2UgUl9SRUxCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOwotICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOwotICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7Ci0gICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HX05FRzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKLSAgfQotfQotCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLWludCAKLW02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKLXsKLSAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICB7Ci0gICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7Ci0gICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7Ci0gICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKLSAgICB9Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAotICAgICB7Ci0gICAgICBjYXNlIDMyOiByZXR1cm4gUl9SRUxMT05HOwotICAgICAgY2FzZSAxNjogcmV0dXJuIFJfUkVMV09SRDsKLSAgICAgIGNhc2UgODogcmV0dXJuIFJfUkVMQllURTsKLSAgICAgfQotICB9Ci0gIHJldHVybiBSX1JFTExPTkc7ICAgIAotfQotCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXJlbG9jX2hvd3RvX3R5cGUgKgotbTY4a19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6CQkJcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOwotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7Ci0gICAgICAvKiBGSVhNRTogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgY29kZSBmb3IgUl9SRUxMT05HX05FRy4gICovCi0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBtNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCAocmVsb2NlbnRyeSktPnJfdHlwZSkKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoZXh0ZXJuYWwsIGludGVybmFsKSBcCi0gIGV4dGVybmFsLnJfdHlwZSA9IG02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG02OGtfcmVsb2NfdHlwZV9sb29rdXAKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKSAqLwotDAotI2lmZGVmIENPRkZfQ09NTU9OX0FEREVORAotCi0vKiBJZiBDT0ZGX0NPTU1PTl9BRERFTkQgaXMgZGVmaW5lZCwgdGhlbiB3aGVuIHVzaW5nIG02OGsgQ09GRiB0aGUKLSAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24KLSAgIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMgYW55IGRlc2lyZWQgb2Zmc2V0LiAgKHRha2VuIGZyb20KLSAgIHdvcmsgZG9uZSBieSBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgZm9yIEkzODYgQ09GRikuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltdmFsdWUgZGlmZjsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciAzODYKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgaWYgKGRpZmYgIT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPnNpemUpCi0JewotCWNhc2UgMDoKLQkgIHsKLQkgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgMToKLQkgIHsKLQkgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIHsKLQkgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gUl9QQ1JCWVRFCQkJXAotCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JXT1JECQkJXAotCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JMT05HKSkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotI2lmbmRlZiBjb2ZmX3J0eXBlX3RvX2hvd3RvCi0KLS8qIGNvZmYtbTY4ay5jIHVzZXMgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gIFdlIG5lZWQgdG8KLSAgIGFkanVzdCBjb21tb24gc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0jZW5kaWYgLyogQ09GRl9DT01NT05fQURERU5EICovCi0MCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gbTY4a2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgRF9QQUdFRCwgMCwgJ18nLCBOVUxMKQotI2Vsc2UKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgRF9QQUdFRCwgMCwgMCwgTlVMTCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbTg4ay5jIGIvYmZkL2NvZmYtbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgzNzdhLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIDg4MDAwIENPRkYgIkJpbmFyeSBDb21wYXRhYmlsaXR5IFN0YW5kYXJkIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgTTg4IDEJCS8qIEN1c3RvbWl6ZSB2YXJpb3VzIGluY2x1ZGUgZmlsZXMgKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL204OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYm9vbGVhbiBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtODhrX3NwZWNpYWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGFzeW1ib2wgKiosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8zMgotCi0vKiBPbiBjb2ZmLW04OGssIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICdAJy4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotc3RhdGljIGJvb2xlYW4KLW04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICdAJzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW04OGtfc3BlY2lhbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCi0gIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9IVlJUMTY6Ci0gICAgY2FzZSBSX0xWUlQxNjoKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKLQkgICAgIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KLQkgICAgIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLQkgIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCSAgYmZkX3ZtYSB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQkgIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0JICBsb25nIHJlbG9jYXRpb24gPSAwOwotCi0JICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0JICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLQkgIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLQkgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0JICBpZiAob3V0cHV0X2JmZCkKLQkgICAgb3V0cHV0X2Jhc2UgPSAwOwotCSAgZWxzZQotCSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLQkgIHJlbG9jYXRpb24gKz0gKChyZWxvY19lbnRyeS0+YWRkZW5kIDw8IGhvd3RvLT5iaXRzaXplKSArIHgpOwotCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQotCSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0JICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotCSAgaWYgKHJlbG9jYXRpb24pCi0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOwotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0JIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICAqLwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlCi0JICAgICByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuCi0JICAgICBNb2RpZnkgdGhlIHJlbG9jIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8gKFJfUENSMTZMLAkJCS8qIHR5cGUgKi8KLQkgMDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUjE2TCIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUENSMjZMLAkJCS8qIHR5cGUgKi8KLQkgMDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUjI2TCIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDNmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwM2ZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfVlJUMTYsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0hWUlQxNiwJCQkvKiB0eXBlICovCi0JIDE2LAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTFZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTFZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9WUlQzMiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJWUlQzMiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBDb2RlIHRvIHR1cm4gYW4gZXh0ZXJuYWwgcl90eXBlIGludG8gYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZQotICAgYWJvdmUgaG93dG8gdGFibGUuICAqLwotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgaWYgKGRzdC0+cl90eXBlID49IFJfUENSMTZMICYmIGRzdC0+cl90eXBlIDw9IFJfVlJUMzIpCi0gICAgewotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgZHN0LT5yX3R5cGUgLSBSX1BDUjE2TDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgwKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jIG9mZnNldCAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgYmZkX2hfZ2V0XzE2Ci0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMTYKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKQlcCi0gIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLSNkZWZpbmUgQkFETUFHKHgpIE1DODhCQURNQUcoeCkKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jdW5kZWYgY29mZl93cml0ZV9hcm1hcAotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAobTg4a2Jjc192ZWMsICJjb2ZmLW04OGtiY3MiLCAwLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1tY29yZS5jIGIvYmZkL2NvZmYtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljYmVhMS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTUNvcmUgQ09GRi9QRQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tY29yZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgQkFETUFHCi0jdW5kZWYgQkFETUFHCi0jZW5kaWYKLSNkZWZpbmUgQkFETUFHKHgpIE1DT1JFQkFETUFHKHgpCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oQSkgKHNpemVvZiAoQSkgLyBzaXplb2YgKEEpWzBdKQotI2VuZGlmCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBtb3JlIHRoYW4gb25jZSwgYnV0IHdlIG9ubHkgY29tcGlsZSB0aGUKLSAgIGZpbmFsX2xpbmsgcm91dGluZSBvbmNlLiAgKi8KLWV4dGVybiBib29sZWFuIG1jb3JlX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9tY29yZV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICBtY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuICAgICAgICAgICAgICAgICAgICAgIGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgY29mZl9tY29yZV9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYmZkX3ZtYSAqKSk7Ci0MCi0vKiBUaGUgTlQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8KLSAgIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdAotICAgZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAyCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgYmFzZSBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICByZWxvY19vZmZzZXQ7Ci17Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAotICAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci19Ci0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0gIAotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KLSNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAotIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsgCi0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUlZBKTsKLSAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0gIChjYWNoZV9wdHIpLT5ob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bTsKLSAgICAgYmZkX3ZtYSAqIGFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLQotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fRUxFTSAobWNvcmVfY29mZl9ob3d0b190YWJsZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gSU1BR0VfUkVMX01DT1JFX1JWQSkKLSAgICAqIGFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAKLSAgZWxzZSBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICogYWRkZW5kcCA9IHNlYy0+dm1hIC0gMjsgLyogWFhYIGd1ZXNzIC0gaXMgdGhpcyByaWdodCA/ICovCi0gICAgICAKLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqIGFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgICogYWRkZW5kcCA9IDA7Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgaW4gcGVfbWtvYmplY3QgaW4gcGVpY29kZS5oLiAgKi8KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCSAgLyogWFhYIGZpeG1lIC0gc2hvdWxkbid0IHRoaXMgYmUgbGlrZSB0aGUgY29kZSBmb3IgdGhlIFJWQSByZWxvYyA/ICovCi0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUlZBOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkgICAgKGhvd3RvLCBpbnB1dF9iZmQsCi0JICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCSAgICAgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgbWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIAotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbXlfbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlO30KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgIDB4MTAwMAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gaW5pdGlhbGlzZSBhbHRlcmJhdGl2ZV90YXJnZXQgZmllbGQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksIDAsICYgVEFSR0VUX0xJVFRMRV9TWU0pCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSwgRF9QQUdFRCwgKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwgMCwgJiBUQVJHRVRfQklHX1NZTSkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YWNlNS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgT3JpZ2luYWwgdmVyc2lvbiBieSBQZXIgQm90aG5lci4KLSAgIEZ1bGwgc3VwcG9ydCBhZGRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gbWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgICAgICBQVFIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgIGFyZWxlbnQgKikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCSBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJIFBUUiBkYXRhLAotCQkJCQkJCSBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQkgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCSBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWZoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWZsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19ncHJlbF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWxoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19yZWxsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19zd2l0Y2hfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJCWFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCWFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQlQVFIgZGF0YSwKLQkJCQkJCQlhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQliZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX3JlbG9jYXRlX2hpIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGksCi0JCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWZsbywKLQkJCQkgICAgICBiZmQgKmlucHV0X2JmZCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0JCQkJICAgICAgc2l6ZV90IGFkanVzdCwKLQkJCQkgICAgICBiZmRfdm1hIHJlbG9jYXRpb24sCi0JCQkJICAgICAgYm9vbGVhbiBwY3JlbCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYmZkX2J5dGUgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlYWRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbGF4X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxheF9wY3JlbDE2IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCQkgICBhc2VjdGlvbiAqLAotCQkJCQkgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLQwKLS8qIEVDT0ZGIGhhcyBDT0ZGIHNlY3Rpb25zLCBidXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KLSAgIGEgY29tcGxldGVseSBkaWZmZXJlbnQgZm9ybWF0LiAgRUNPRkYgdGFyZ2V0cyB1c2Ugc29tZSBvZiB0aGUKLSAgIHN3YXBwaW5nIHJvdXRpbmVzIGZyb20gY29mZnN3YXAuaCwgYW5kIHNvbWUgb2YgdGhlIGdlbmVyaWMgQ09GRgotICAgcm91dGluZXMgaW4gY29mZmdlbi5jLCBidXQsIHVubGlrZSB0aGUgcmVhbCBDT0ZGIHRhcmdldHMsIGRvIG5vdAotICAgdXNlIGNvZmZjb2RlLmggaXRzZWxmLgotCi0gICBHZXQgdGhlIGdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZXhjZXB0IGZvciB0aGUgcmVsb2MsCi0gICBzeW1ib2wsIGFuZCBsaW5lbm8gb25lcy4gIEdpdmUgdGhlbSBFQ09GRiBuYW1lcy4gICovCi0jZGVmaW5lIE1JUFNFQ09GRgotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfaW4gbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX2luIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9vdXQgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfMzIKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jcyB0eXBlcy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkLiAgVGhlIHJlbG9jIHJlYWRpbmcgY29kZSBlbnN1cmVzIHRoYXQKLSAgICAgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgLmFicyBzZWN0aW9uLCB3aGljaCB3aWxsIGNhdXNlCi0gICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gZG8gbm90aGluZy4gICovCi0gIEhPV1RPIChNSVBTX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGSEFMRiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZIQUxGIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLCBub3JtYWxseSBmcm9tIGEgZGF0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZXT1JELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRldPUkQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjYgYml0IGFic29sdXRlIGp1bXAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChNSVBTX1JfSk1QQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKTVBBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggMTYgYml0cyBvZiBhIHN5bWJvbCB2YWx1ZS4gIEhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgIG1pcHNfcmVmaGlfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhJLAkJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVmaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19yZWZsb19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE8iLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhbiBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICBIYW5kbGVkIGJ5IHRoZQotICAgICBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9HUFJFTCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dwcmVsX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGEgbGl0ZXJhbCB1c2luZyBhbiBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuCi0gICAgIEhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dwcmVsX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDgpLAotICBFTVBUWV9IT1dUTyAoOSksCi0gIEVNUFRZX0hPV1RPICgxMCksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgYSAxNiBiaXQgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2MgcmlnaHRzaGlmdGVkIHR3aWNlIGFzIHVzZWQgaW4gdGhlIE1JUFMgYnJhbmNoCi0gICAgIGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChNSVBTX1JfUENSRUwxNiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGhpZ2ggMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIG5leHQgcmVsb2MgbXVzdCBiZQotICAgICBNSVBTX1JfUkVMTE8sIGFuZCB0aGUgYWRkZW5kIGlzIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIHRoZQotICAgICB0d28gaW5zdHJ1Y3Rpb25zLCBqdXN0IGFzIGluIE1JUFNfUl9SRUZISSBhbmQgTUlQU19SX1JFRkxPLiAgVGhlCi0gICAgIGZpbmFsIHZhbHVlIGlzIGFjdHVhbGx5IFBDIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCBub3QgdGhlIE1JUFNfUl9SRUxISSByZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVMSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxISSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2MgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCByZXByZXNlbnRzIHRoZSBsb3cgMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIEVNUFRZX0hPV1RPICgyMCksCi0gIEVNUFRZX0hPV1RPICgyMSksCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgYW4gZW50cnkgaW4KLSAgICAgYSBzd2l0Y2ggdGFibGUsIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHN5bWJvbHMgaW4KLSAgICAgdGhlIC50ZXh0IHNlY3Rpb24uICBUaGUgc3ltbmR4IGlzIGFjdHVhbGx5IHRoZSBvZmZzZXQgZnJvbSB0aGUKLSAgICAgcmVsb2MgYWRkcmVzcyB0byB0aGUgc3VidHJhaGVuZC4gIFNlZSBpbmNsdWRlL2NvZmYvbWlwcy5oIGZvcgotICAgICBtb3JlIGRldGFpbHMuICAqLwotICBIT1dUTyAoTUlQU19SX1NXSVRDSCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3N3aXRjaF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1dJVENIIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBNSVBTX0hPV1RPX0NPVU5UIFwKLSAgKHNpemVvZiBtaXBzX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIG1pcHNfaG93dG9fdGFibGVbMF0pCi0KLS8qIFdoZW4gdGhlIGxpbmtlciBpcyBkb2luZyByZWxheGluZywgaXQgbWF5IGNoYW5nZSBhIGV4dGVybmFsIFBDUkVMMTYKLSAgIHJlbG9jLiAgVGhpcyB0eXBpY2FsbHkgcmVwcmVzZW50cyBhbiBpbnN0cnVjdGlvbiBsaWtlCi0gICAgICAgYmFsIGZvbwotICAgV2UgY2hhbmdlIGl0IHRvCi0gICAgICAgLnNldCAgbm9yZW9yZGVyCi0gICAgICAgYmFsICAgJEwxCi0gICAgICAgbHVpICAgJGF0LCVoaShmb28gLSAkTDEpCi0gICAgICRMMToKLSAgICAgICBhZGRpdSAkYXQsJWxvKGZvbyAtICRMMSkKLSAgICAgICBhZGR1ICAkYXQsJGF0LCQzMQotICAgICAgIGphbHIgICRhdAotICAgUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoaXMgY2hhbmdlcyB0aGUKLSAgIGluc3RydWN0aW9uIGJ5LiAgKi8KLQotI2RlZmluZSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UICg0ICogNCkKLQwKLS8qIFNlZSB3aGV0aGVyIHRoZSBtYWdpYyBudW1iZXIgbWF0Y2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCi0gICAgewotICAgIGNhc2UgTUlQU19NQUdJQ18xOgotICAgICAgLyogSSBkb24ndCBrbm93IHdoYXQgZW5kaWFubmVzcyB0aGlzIGltcGxpZXMuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUcyOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUczOgotICAgICAgcmV0dXJuIGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEU6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTM6Ci0gICAgICByZXR1cm4gYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0vKiBSZWxvYyBoYW5kbGluZy4gIE1JUFMgRUNPRkYgcmVsb2NzIGFyZSBwYWNrZWQgaW50byA4IGJ5dGVzIGluCi0gICBleHRlcm5hbCBmb3JtLiAgVGhleSB1c2UgYSBiaXQgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN5bWJvbAotICAgaXMgZXh0ZXJuYWwuICAqLwotCi0vKiBTd2FwIGEgcmVsb2MgaW4uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBjb25zdCBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGV4dF9wdHI7Ci0KLSAgaW50ZXJuLT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5yX3N5bW5keCA9ICgoKGludCkgZXh0LT5yX2JpdHNbMF0KLQkJCSAgIDw8IFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0JJRykKLQkJCSAgfCAoKGludCkgZXh0LT5yX2JpdHNbMV0KLQkJCSAgICAgPDwgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfQklHKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1syXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9CSUcpKTsKLSAgICAgIGludGVybi0+cl90eXBlID0gKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfQklHKQotCQkJPj4gUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcpOwotICAgICAgaW50ZXJuLT5yX2V4dGVybiA9IChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX0VYVEVSTl9CSUcpICE9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5yX3N5bW5keCA9ICgoKGludCkgZXh0LT5yX2JpdHNbMF0KLQkJCSAgIDw8IFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkKLQkJCSAgfCAoKGludCkgZXh0LT5yX2JpdHNbMV0KLQkJCSAgICAgPDwgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfTElUVExFKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1syXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpKTsKLSAgICAgIGludGVybi0+cl90eXBlID0gKCgoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJCSA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJCXwgKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpCi0JCQkgICA8PCBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFKSk7Ci0gICAgICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHJfc3ltbmR4IGlzIGFjdHVhbGx5IHRoZSBvZmZzZXQgZnJvbSB0aGUKLSAgICAgcmVsb2MgYWRkcmVzcyB0byB0aGUgYmFzZSBvZiB0aGUgZGlmZmVyZW5jZSAoc2VlCi0gICAgIGluY2x1ZGUvY29mZi9taXBzLmggZm9yIG1vcmUgZGV0YWlscykuICBXZSBjb3B5IHN5bW5keCBpbnRvIHRoZQotICAgICByX29mZnNldCBmaWVsZCBzbyBhcyBub3QgdG8gY29uZnVzZSBlY29mZl9zbHVycF9yZWxvY190YWJsZSBpbgotICAgICBlY29mZi5jLiAgSW4gYWRqdXN0X3JlbG9jX2luIHdlIHRoZW4gY29weSByX29mZnNldCBpbnRvIHRoZSByZWxvYwotICAgICBhZGRlbmQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTwotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISSkpKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKCEgaW50ZXJuLT5yX2V4dGVybik7Ci0gICAgICBpbnRlcm4tPnJfb2Zmc2V0ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIGlmIChpbnRlcm4tPnJfb2Zmc2V0ICYgMHg4MDAwMDApCi0JaW50ZXJuLT5yX29mZnNldCAtPSAweDEwMDAwMDA7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotICAgIH0KLX0KLQotLyogU3dhcCBhIHJlbG9jIG91dC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBpbnRlcm4sIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKmV4dCA9IChSRUxPQyAqKSBkc3Q7Ci0gIGxvbmcgcl9zeW1uZHg7Ci0KLSAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX2V4dGVybgotCSAgICAgIHx8IChpbnRlcm4tPnJfc3ltbmR4ID49IDAgJiYgaW50ZXJuLT5yX3N5bW5keCA8PSAxMikpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IKLSAgICAgTUlQU19SX1JFTEhJIHJlbG9jLCB3ZSBhY3R1YWxseSB3YW50IHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZgotICAgICByX29mZnNldCBvdXQgYXMgdGhlIHN5bWJvbCBpbmRleC4gIFRoaXMgdW5kb2VzIHRoZSBjaGFuZ2UgbWFkZSBieQotICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4uICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgIT0gTUlQU19SX1NXSVRDSAotICAgICAgJiYgKGludGVybi0+cl9leHRlcm4KLQkgIHx8IChpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkgICAgICAmJiBpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLSAgICByX3N5bW5keCA9IGludGVybi0+cl9zeW1uZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fVEVYVCk7Ci0gICAgICByX3N5bW5keCA9IGludGVybi0+cl9vZmZzZXQgJiAweGZmZmZmZjsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPnJfYml0c1swXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+cl9iaXRzWzFdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5yX2JpdHNbMl0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPnJfYml0c1szXSA9ICgoKGludGVybi0+cl90eXBlIDw8IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkJICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCQl8IChpbnRlcm4tPnJfZXh0ZXJuID8gUkVMT0NfQklUUzNfRVhURVJOX0JJRyA6IDApKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPnJfYml0c1swXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+cl9iaXRzWzFdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5yX2JpdHNbMl0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPnJfYml0c1szXSA9ICgoKGludGVybi0+cl90eXBlIDw8IFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFKQotCQkJICYgUkVMT0NfQklUUzNfVFlQRV9MSVRUTEUpCi0JCQl8ICgoaW50ZXJuLT5yX3R5cGUgPj4gUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRQotCQkJICAgICYgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSkpCi0JCQl8IChpbnRlcm4tPnJfZXh0ZXJuID8gUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSA6IDApKTsKLSAgICB9Ci19Ci0KLS8qIEZpbmlzaCBjYW5vbmljYWxpemluZyBhIHJlbG9jLiAgUGFydCBvZiB0aGlzIGlzIGdlbmVyaWMgdG8gYWxsCi0gICBFQ09GRiB0YXJnZXRzLCBhbmQgdGhhdCBwYXJ0IGlzIGluIGVjb2ZmLmMuICBUaGUgcmVzdCBpcyBkb25lIGluCi0gICB0aGlzIGJhY2tlbmQgcm91dGluZS4gIEl0IG11c3QgZmlsbCBpbiB0aGUgaG93dG8gZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2NfaW4gKGFiZmQsIGludGVybiwgcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLSAgICAgYXJlbGVudCAqcnB0cjsKLXsKLSAgaWYgKGludGVybi0+cl90eXBlID4gTUlQU19SX1NXSVRDSCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuCi0gICAgICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0dQUkVMCi0JICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfTElURVJBTCkpCi0gICAgcnB0ci0+YWRkZW5kICs9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLQotICAvKiBJZiB0aGUgdHlwZSBpcyBNSVBTX1JfSUdOT1JFLCBtYWtlIHN1cmUgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotICAgICB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzbyB0aGF0IHRoZSByZWxvYyBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9JR05PUkUpCi0gICAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQotICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTEhJIG9yCi0gICAgIE1JUFNfUl9SRUxMTyByZWxvYywgd2Ugd2FudCB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBCRkQgcmVsb2N0bwotICAgICBob2xkIHRoZSB2YWx1ZSB3aGljaCB3YXMgb3JpZ2luYWxseSBpbiB0aGUgc3ltbmR4IGZpZWxkIG9mIHRoZQotICAgICBpbnRlcm5hbCBNSVBTIEVDT0ZGIHJlbG9jLiAgVGhpcyB2YWx1ZSB3YXMgY29waWVkIGludG8KLSAgICAgaW50ZXJuLT5yX29mZnNldCBieSBtaXBzX3N3YXBfcmVsb2NfaW4sIGFuZCBoZXJlIHdlIGNvcHkgaXQgaW50bwotICAgICB0aGUgYWRkZW5kIGZpZWxkLiAgKi8KLSAgaWYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9TV0lUQ0gKLSAgICAgIHx8ICghIGludGVybi0+cl9leHRlcm4KLQkgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkgICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfUkVMTE8pKSkKLSAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfb2Zmc2V0OwotCi0gIHJwdHItPmhvd3RvID0gJm1pcHNfaG93dG9fdGFibGVbaW50ZXJuLT5yX3R5cGVdOwotfQotCi0vKiBNYWtlIGFueSBhZGp1c3RtZW50cyBuZWVkZWQgdG8gYSByZWxvYyBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBOb25lCi0gICBhcmUgbmVlZGVkIGZvciBNSVBTLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfYWRqdXN0X3JlbG9jX291dCAoYWJmZCwgcmVsLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICAvKiBGb3IgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSBtdXN0IGNvcHkgcmVsLT5hZGRlbmQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0LiAgVGhpcyB3aWxsIHRoZW4gYmUgd3JpdHRlbiBvdXQgYXMgdGhlIHN5bWJvbAotICAgICBpbmRleCBieSBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LiAgVGhpcyBvcGVyYXRpb24gcGFyYWxsZWxzIHRoZQotICAgICBhY3Rpb24gb2YgbWlwc19hZGp1c3RfcmVsb2NfaW4uICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIGludGVybi0+cl9vZmZzZXQgPSByZWwtPmFkZGVuZDsKLX0KLQotLyogRUNPRkYgcmVsb2NzIGFyZSBlaXRoZXIgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLCBvciBhZ2FpbnN0Ci0gICBzZWN0aW9ucy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHRoZSByZWxvYwotICAgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nIGhhcyBnaXZlbiB1cyBhbnkKLSAgIGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbyBiZSBhZ2FpbnN0IHRoZQotICAgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcKLSAgIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwgYWxsIGJlIGRvbmUgYXQKLSAgIGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZSBpbnRvCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRG8gYSBSRUZISSByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGEKLSAgIFJFRkxPIHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgUkVGTE8gdG8gdGhlIFJFRkhJLgotICAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZSBhY3R1YWwKLSAgIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIFJFRkxPLiAgTUlQUyBFQ09GRiByZXF1aXJlcyB0aGF0IHRoZQotICAgUkVGTE8gaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBSRUZISS4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0Ci0gICBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJIHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8KLSAgIHJlbG9jLiAgVGhpcyBleHRlbnNpb24gcGVybWl0cyBnY2MgdG8gb3V0cHV0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0gICBpdHNlbGYuICAqLwotCi1zdHJ1Y3QgbWlwc19oaQotewotICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaSAqbWlwc19yZWZoaV9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlZmhpX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkgKm47Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IFJFRkxPIGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG1pcHNfaGkgKikgYmZkX21hbGxvYyAoc2l6ZW9mICpuKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIG4tPmFkZHIgPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBuLT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICBuLT5uZXh0ID0gbWlwc19yZWZoaV9saXN0OwotICBtaXBzX3JlZmhpX2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIERvIGEgUkVGTE8gcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0IGlucGxhY2UKLSAgIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZSBSRUZISQotICAgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlZmxvX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG1pcHNfcmVmaGlfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpICpsOwotCi0gICAgICBsID0gbWlwc19yZWZoaV9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLQotCSAgLyogRG8gdGhlIFJFRkhJIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKLQkgICAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgUkVGTE8gaXRzZWxmLCBleGNlcHQKLQkgICAgIHdoZXJlIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZQotCSAgICAgUkVGSEkuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfcmVmaGlfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgUkVGTE8gcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBtaXBzX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogRG8gYSBHUFJFTCByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCB2YWx1ZSB3aGljaCBtdXN0IGJlY29tZQotICAgdGhlIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZ3ByZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3ZtYSBncDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUNPRkYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgcmVsb2NhdGVhYmxlID09IGZhbHNlKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIFdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgZ3AgdmFsdWUsIHNvIHRoYXQgd2UgY2FuIGFkanVzdCB0aGUKLSAgICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfZ3AgaW4gdGhlIG91dHB1dAotICAgICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFQ09GRgotICAgICB0YXJnZXQgZGF0YS4gIFdlIGRvbid0IG5lZWQgdG8gYWRqdXN0IHRoZSBzeW1ib2wgdmFsdWUgZm9yIGFuCi0gICAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKGdwID09IDAKLSAgICAgICYmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBncCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDB4NDAwMDsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBjb3VudDsKLQkgIGFzeW1ib2wgKipzeW07Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQkgIHN5bSA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0KLQkgIGlmIChzeW0gPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JICAgIGkgPSBjb3VudDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW0rKykKLQkJewotCQkgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnN5bSk7Ci0JCSAgaWYgKCpuYW1lID09ICdfJyAmJiBzdHJjbXAgKG5hbWUsICJfZ3AiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBncCA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqc3ltKTsKLQkJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaSA+PSBjb3VudCkKLQkgICAgewotCSAgICAgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICAqZXJyb3JfbWVzc2FnZSA9Ci0JCShjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICAvKiBTZXQgdmFsIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvciBzeW1ib2wuICAqLwotICB2YWwgPSAoKGluc24gJiAweGZmZmYpICsgcmVsb2NfZW50cnktPmFkZGVuZCkgJiAweGZmZmY7Ci0gIGlmICh2YWwgJiAweDgwMDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKLSAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCi0gICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAodmFsICYgMHhmZmZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIE1ha2Ugc3VyZSBpdCBmaXQgaW4gMTYgYml0cy4gICovCi0gIGlmICgobG9uZykgdmFsID49IDB4ODAwMCB8fCAobG9uZykgdmFsIDwgLTB4ODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpICpuOwotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHdlJ3JlIHJlbG9jYXRpbmcsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVMTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gIG1pcHNfcmVsaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUxMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgUEMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZSBSRUxISQotICAgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlbGxvX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG1pcHNfcmVsaGlfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpICpsOwotCi0gICAgICBsID0gbWlwc19yZWxoaV9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLQotCSAgLyogRG8gdGhlIFJFTEhJIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKLQkgICAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgUkVMTE8gaXRzZWxmLCBleGNlcHQKLQkgICAgIHdoZXJlIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZQotCSAgICAgUkVMSEkuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgbWFrZSB2YWwgUEMgcmVsYXRpdmUuICBJZiB0aGUKLQkgICAgIHN5bWJvbCBpcyBub3QgZGVmaW5lZCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJlY2F1c2UKLQkgICAgIHdlIGRvbid0IHdhbnQgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSB0byBpbmNvcnBvcmF0ZQotCSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKQotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotCSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfcmVsaGlfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvZXMgbm90IGhhbmRsZSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbnMKLSAgICAgY29ycmVjdGx5IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBzbyBoYW5kbGUgdGhlbQotICAgICBkaXJlY3RseSBoZXJlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIFJFTExPIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBNSVBTX1JfU1dJVENIIHJlbG9jLiAgVGhpcwotICAgc3BlY2lhbCByZWxvYyBpcyBub3JtYWxseSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIG9ubHkKLSAgIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiByZWxheGluZy4gIFdlIGRvbid0IHdhbnQKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gdGFtcGVyIHdpdGggaXQgYXQgYWxsLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3N3aXRjaF9yZWxvYyAoYWJmZCwKLQkJICAgcmVsb2NfZW50cnksCi0JCSAgIHN5bWJvbCwKLQkJICAgZGF0YSwKLQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwKLQkJICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1BDUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMSEk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTExPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9TV0lUQ0g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmbWlwc19ob3d0b190YWJsZVttaXBzX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIFJFRkhJCi0gICBhbmQgUkVMSEkgcmVsb2NhdGlvbnMuICBUaGUgUkVGSEkgcmVsb2NhdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKLSAgIFJFRkxPIHJlbG9jYXRpb24gKGFuZCBSRUxISSBieSBhIFJFTExPKSwgYW5kIHRoZSBhZGRlbmQgdXNlZCBpcwotICAgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgYm90aCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19yZWxvY2F0ZV9oaSAocmVmaGksIHJlZmxvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGp1c3QsCi0JCSAgcmVsb2NhdGlvbiwgcGNyZWwpCi0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGk7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzaXplX3QgYWRqdXN0OwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0KLSAgaWYgKHJlZmhpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJICAgICBjb250ZW50cyArIGFkanVzdCArIHJlZmhpLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLSAgaWYgKHJlZmxvID09IE5VTEwpCi0gICAgdmFsbG8gPSAwOwotICBlbHNlCi0gICAgdmFsbG8gPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JICAgICAmIDB4ZmZmZik7Ci0gCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0gIHZhbCArPSByZWxvY2F0aW9uOwotCi0gIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgdmFsdWUuCi0gICAgIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMgcmVxdWlyZXMgYW4KLSAgICAgYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAgICAgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UgdG9vayBmcm9tIHRoZSBkYXRhLAotICAgICBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0gIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgKyAocmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyBhZGp1c3QpKTsKLQotICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLSAgICB2YWwgKz0gMHgxMDAwMDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sCi0JICAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGEgTUlQUyBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYm9vbGVhbiBnb3RfbG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBsb19pbnRfcmVsOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IE5VTEw7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICBpZiAoZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwpCi0gICAgb2Zmc2V0cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBvZmZzZXRzID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5vZmZzZXRzOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHVzZV9sbyA9IGZhbHNlOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnMgPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIGlmICghIGdvdF9sbykKLQltaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGlucHV0X2JmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGludF9yZWwgPSBsb19pbnRfcmVsOwotCSAgZ290X2xvID0gZmFsc2U7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZQotCQkgIDwgc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSk7Ci0KLSAgICAgIC8qIFRoZSBSRUZISSBhbmQgUkVMSEkgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICB0aGV5Ci0JIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBSRUZMTyBvciBSRUxMTyByZWxvYywgcmVzcGVjdGl2ZWx5LCBhbmQKLQkgdGhlIGFkZGVuZCBpcyBmb3JtZWQgZnJvbSBib3RoIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpsb19leHRfcmVsOwotCi0JICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJCi0gICAgICAgICAgICAgb3IgUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgUkVGTE8gb3IgUkVMTE8gcmVsb2MuICBUaGlzCi0gICAgICAgICAgICAgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLwotCSAgZm9yIChsb19leHRfcmVsID0gZXh0X3JlbCArIDE7Ci0JICAgICAgIGxvX2V4dF9yZWwgPCBleHRfcmVsX2VuZDsKLQkgICAgICAgbG9fZXh0X3JlbCsrKQotCSAgICB7Ci0JICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGxvX2V4dF9yZWwsCi0JCQkJCSZsb19pbnRfcmVsKTsKLQkgICAgICBpZiAobG9faW50X3JlbC5yX3R5cGUgIT0gaW50X3JlbC5yX3R5cGUpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQKLQkgICAgICAmJiAobG9faW50X3JlbC5yX3R5cGUKLQkJICA9PSAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JCSAgICAgID8gTUlQU19SX1JFRkxPCi0JCSAgICAgIDogTUlQU19SX1JFTExPKSkKLQkgICAgICAmJiBpbnRfcmVsLnJfZXh0ZXJuID09IGxvX2ludF9yZWwucl9leHRlcm4KLQkgICAgICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IGxvX2ludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgICB1c2VfbG8gPSB0cnVlOwotCSAgICAgIGlmIChsb19leHRfcmVsID09IGV4dF9yZWwgKyAxKQotCQlnb3RfbG8gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludF9yZWwucl90eXBlXTsKLQotICAgICAgLyogVGhlIFNXSVRDSCByZWxvYyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhpcyByZWxvYyBpcwotCSBtYXJrcyB0aGUgbG9jYXRpb24gb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvcnRpb25zIG9mIGFuCi0JIG9iamVjdCBmaWxlLiAgVGhlIHN5bWJvbCBpbmRleCBkb2VzIG5vdCByZWZlcmVuY2UgYSBzeW1ib2wsCi0JIGJ1dCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlbG9jIHRvIHRoZSBzdWJ0cmFoZW5kCi0JIG9mIHRoZSBkaWZmZXJlbmNlLiAgVGhpcyByZWxvYyBpcyBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwKLQkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgYWRqdXN0bWVudCwgdW5sZXNzIHdlIGFyZSByZWxheGluZy4gIElmCi0JIHdlIGFyZSByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRkIGluIGFuIG9mZnNldC4gIFNpbmNlIG5vCi0JIHN5bWJvbHMgYXJlIGludm9sdmVkIGluIHRoaXMgcmVsb2MsIHdlIGhhbmRsZSBpdCBjb21wbGV0ZWx5Ci0JIGhlcmUuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9TV0lUQ0gpCi0JewotCSAgaWYgKG9mZnNldHMgIT0gTlVMTAotCSAgICAgICYmIG9mZnNldHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgIChiZmRfdm1hKSBvZmZzZXRzW2ldLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIGFkanVzdAotCQkJCQkgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHIgPT0gYmZkX3JlbG9jX29rKTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnRfcmVsLnJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW2ludF9yZWwucl9zeW1uZHhdOwotCSAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdCBhIGRlYnVnZ2luZwotCSAgICAgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludF9yZWwucl9zeW1uZHggPCAwIHx8IGludF9yZWwucl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCSAgICBzID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW2ludF9yZWwucl9zeW1uZHhdOwotCi0JICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBUaGUgR1BSRUwgcmVsb2MgdXNlcyBhbiBhZGRlbmQ6IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBHUAotCSB2YWx1ZXMuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9HUFJFTAotCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX0xJVEVSQUwpCi0JYWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKLQkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKLQkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCi0JCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sLiAgVGhlCi0JCSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2ltcGx5IHRoZQotCQkgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseSB6ZXJvKS4gIFdlCi0JCSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoaXMgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0JCSBkZWZpbmVkIHN5bWJvbCwgc28gd2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8gaG9sZAotCQkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZiB0aGUKLQkJIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZSBHUAotCQkgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBvciBjb21tb24KLQkJIHN5bWJvbC4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQkJIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseQotCQkgemVybykuICBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UKLQkJIGFyZW4ndCBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUKLQkJIHRoZSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBtaXBzX3JlbGF4X3NlY3Rpb24gbWF5IGhhdmUgc2V0Ci0JIG9mZnNldHNbaV0gdG8gc29tZSB2YWx1ZS4gIEEgdmFsdWUgb2YgMSBtZWFucyB3ZSBtdXN0IGV4cGFuZAotCSBhIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gb2Ygc2VxdWVuY2UsCi0JIGFuZCBhbnkgb3RoZXIgdmFsdWUgaXMgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICYmIG9mZnNldHNbaV0gIT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNgotCQkgICAgICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgIGlmIChvZmZzZXRzW2ldICE9IDEpCi0JICAgIGFkZGVuZCArPSBvZmZzZXRzW2ldOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKmhlcmU7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfZXh0ZXJuCi0JCQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB1cC4gICovCi0JICAgICAgaGVyZSA9IChjb250ZW50cwotCQkgICAgICArIGFkanVzdAotCQkgICAgICArIGludF9yZWwucl92YWRkcgotCQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgbWVtbW92ZSAoaGVyZSArIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQsIGhlcmUsCi0JCSAgICAgICAoc2l6ZV90KSAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplCi0JCQkJIC0gKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJICAgICAgIAotCSAgICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJaCwgaGVyZSwKLQkJCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCQkgKyAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJCQkJICsgYWRqdXN0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG11c3QgYWRqdXN0IGV2ZXJ5dGhpbmcgZWxzZSB1cCBhIG5vdGNoLiAgKi8KLQkgICAgICBhZGp1c3QgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotCSAgICAgIC8qIG1pcHNfcmVsYXhfcGNyZWwxNiBoYW5kbGVzIGFsbCB0aGUgZGV0YWlscyBvZiB0aGlzCi0JCSByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIC50ZXh0Ci0JIHNlZ21lbnQsIHdlIG1heSBuZWVkIHRvIGFkanVzdCBpdCBpZiBzb21lIGJyYW5jaGVzIGhhdmUgYmVlbgotCSBleHBhbmRlZC4gIFRoZSByZWxvYyB0eXBlcyB3aGljaCBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZQotCSAudGV4dCBzZWN0aW9uIGFyZSBoYW5kbGVkIGVmZmljaWVudGx5IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiwKLQkgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCAhPSBOVUxMCi0JICAmJiAhIGludF9yZWwucl9leHRlcm4KLQkgICYmIGludF9yZWwucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUCi0JICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJICAgICAgIi50ZXh0IikgIT0gMAotCSAgICAgIHx8IChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUENSRUwxNgotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQl7Ci0JICBiZmRfdm1hIGFkcjsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmE7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBhZGRlbmQgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IHRoZSBhZGRyZXNzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZXT1JEKTsKLQotCSAgYWRyID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIGFkanVzdAotCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCi0JICBmb3IgKGEgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLQkgICAgICAgYSAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhID0gYS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChhZHIgPj0gYS0+c3RhcnQgJiYgYWRyIDwgYS0+ZW5kKQotCQlhZGRlbmQgKz0gYS0+YWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0IGNvbnZlcnQKLQkgICAgIHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQKLQkJICAgICB0aGUgcmVsb2MgZnJvbSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcKLQkJICAgICBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotCQkgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotCQkgIGludF9yZWwucl9leHRlcm4gPSAwOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0JCSAgcyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0KLQkJICBpbnRfcmVsLnJfc3ltbmR4ID0gLTE7Ci0JCSAgc3dpdGNoIChuYW1lWzFdKQotCQkgICAgewotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBGb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCB0aGUgb2JqZWN0IGZpbGUKLQkJICAgICBjdXJyZW50bHkgaG9sZHMganVzdCB0aGUgYWRkZW5kLiAgV2UgbXVzdCBhZGp1c3QKLQkJICAgICBieSB0aGUgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByZWxvY2F0aW9uIC09IGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotCQkgICAgICAvKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIFJFTEhJIG9yIFJFTExPIHJlbG9jCi0JCQkgZnJvbSBiZWluZyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0bwotCQkJIGJlaW5nIGFnYWluc3QgYSBzZWN0aW9uLCB3ZSBtdXN0IHB1dCBhCi0JCQkgc3BlY2lhbCB2YWx1ZSBpbnRvIHRoZSByX29mZnNldCBmaWVsZC4gIFRoaXMKLQkJCSB2YWx1ZSBpcyB0aGUgb2xkIGFkZGVuZC4gIFRoZSByX29mZnNldCBmb3IKLQkJCSBib3RoIHRoZSBSRUxISSBhbmQgUkVMTE8gcmVsb2NzIGFyZSB0aGUgc2FtZSwKLQkJCSBhbmQgd2Ugc2V0IGJvdGggd2hlbiB3ZSBzZWUgUkVMSEkuICAqLwotCQkgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCQkJewotCQkJICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCQkJICBhZGRoaSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgICArIGFkanVzdAotCQkJCQkgICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JCQkgIGFkZGhpICY9IDB4ZmZmZjsKLQkJCSAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQkJICAgIGFkZGhpIC09IDB4MTAwMDA7Ci0JCQkgIGFkZGhpIDw8PSAxNjsKLQotCQkJICBpZiAoISB1c2VfbG8pCi0JCQkgICAgYWRkbG8gPSAwOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQkgIChjb250ZW50cwotCQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJCSAgICsgbG9faW50X3JlbC5yX3ZhZGRyCi0JCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCQkJICAgICAgaWYgKGFkZGxvICYgMHg4MDAwKQotCQkJCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkJCSAgICAgIGxvX2ludF9yZWwucl9vZmZzZXQgPSBhZGRoaSArIGFkZGxvOwotCQkJICAgIH0KLQotCQkJICBpbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGggPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IgdGhlCi0JCSAgICAgb3V0cHV0IEJGRC4gICovCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaW50X3JlbC5yX3N5bW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QgdGhlCi0JCSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSG93ZXZlciwgZXh0ZXJuYWwgUkVMSEkKLQkgICAgIGFuZCBSRUxMTyByZWxvY3MgYXJlIFBDIHJlbGF0aXZlLCBidXQgZG9uJ3QgaW5jbHVkZSBhbnkKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcy4gIFRoZSBhZGRlbmQgaXMgbWVyZWx5IGFuCi0JICAgICBhZGRlbmQuICAqLwotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZQotCSAgICAgICYmICghIGludF9yZWwucl9leHRlcm4KLQkJICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAoY29udGVudHMKLQkJCQkJICAgICArIGFkanVzdAotCQkJCQkgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQkgICAgdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICBhZGp1c3QsIHJlbG9jYXRpb24sCi0JCQkJICAgIGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcy4gICovCi0JICBpbnRfcmVsLnJfdmFkZHIgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBTYXZlIHRoZSBjaGFuZ2VkIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGlucHV0X2JmZCwgJmludF9yZWwsIChQVFIpIGV4dF9yZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcy0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcy0+dm1hKTsKLQotCSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaXMgYWxyZWFkeSBjb3JyZWN0IGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBNYWtlIGl0IGxvb2sgbGlrZSBhIHBjcmVsX29mZnNldCByZWxvY2F0aW9uIGJ5Ci0JCSBhZGRpbmcgaW4gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJIHx8ICEgdXNlX2xvKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiArPSBsb19pbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRkhJCi0JICAgICAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJKQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywKLQkJCQkJICAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgYWRqdXN0KSwKLQkJCQkJICByZWxvY2F0aW9uLAotCQkJCQkgIGFkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQl1c2VfbG8gPyAmbG9faW50X3JlbCA6IE5VTEwsCi0JCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkJCXJlbG9jYXRpb24sCi0JCQkJaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBNSVBTX1JfSk1QQUREUiByZXF1aXJlcyBwZWN1bGlhciBvdmVyZmxvdyBkZXRlY3Rpb24uICBUaGUKLQkgaW5zdHJ1Y3Rpb24gcHJvdmlkZXMgYSAyOCBiaXQgYWRkcmVzcyAodGhlIHR3byBsb3dlciBiaXRzIGFyZQotCSBpbXBsaWNpdCB6ZXJvZXMpIHdoaWNoIGlzIGNvbWJpbmVkIHdpdGggdGhlIHVwcGVyIGZvdXIgYml0cwotCSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKLQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9KTVBBRERSCi0JICAmJiAoKChyZWxvY2F0aW9uCi0JCSsgYWRkZW5kCi0JCSsgKGludF9yZWwucl9leHRlcm4gPyAwIDogcy0+dm1hKSkKLQkgICAgICAgJiAweGYwMDAwMDAwKQotCSAgICAgICE9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCQkgICArIGFkanVzdCkKLQkJICAmIDB4ZjAwMDAwMDApKSkKLQlyID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaW50X3JlbC5yX2V4dGVybikKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotCi0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gIGlmIChzZWN0aW9uX3RkYXRhID09IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgICBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotCi0gICAgICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IChlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZQotCQkJICAgICAgKiBzZWMtPnJlbG9jX2NvdW50KTsKLQotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MsIDEsCi0JCQlleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsYXggYSBzZWN0aW9uIHdoZW4gbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLCB3aGljaCBhbHdheXMgdXNlcyBQQyByZWxhdGl2ZSBicmFuY2hlcyB3aGljaAotICAgb25seSBoYXZlIGFuIDE4IGJpdCByYW5nZSBvbiBNSVBTLiAgSWYgYSBicmFuY2ggaXMgbm90IGluIHJhbmdlLCB3ZQotICAgZ2VuZXJhdGUgYSBsb25nIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXBlbnNhdGUuICBFYWNoIHRpbWUgd2UKLSAgIGZpbmQgYSBicmFuY2ggdG8gZXhwYW5kLCB3ZSBoYXZlIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXJzIGFnYWluIHRvCi0gICBtYWtlIHN1cmUgdGhleSBhcmUgc3RpbGwgaW4gcmFuZ2UuICBUaGlzIGlzIHNsb3csIGJ1dCBpdCBvbmx5IGhhcwotICAgdG8gYmUgZG9uZSB3aGVuIC1yZWxheCBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGZpZ3VyZXMgb3V0IHdoaWNoIGJyYW5jaGVzIG5lZWQgdG8gZXhwYW5kOyB0aGUgYWN0dWFsCi0gICBleHBhbnNpb24gaXMgZG9uZSBpbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gd2hlbiB0aGUgc2VjdGlvbgotICAgY29udGVudHMgYXJlIHJlbG9jYXRlZC4gIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9mZnNldHMKLSAgIGZpZWxkIG9mIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gIEFuIG9mZnNldCBvZiAxIG1lYW5zCi0gICB0aGF0IHRoZSBicmFuY2ggbXVzdCBiZSBleHBhbmRlZCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCAoc3VjaCBhbiBvZmZzZXQgd2lsbCBvbmx5IG9jY3VyIGZvciBhIFBDIHJlbGF0aXZlCi0gICBicmFuY2ggdG8gYW4gZXh0ZXJuYWwgc3ltYm9sKS4gIEFueSBvdGhlciBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlCi0gICBvZiBmb3VyLCBhbmQgaXMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIGJyYW5jaCBieSAoc3VjaCBhbiBvZmZzZXQKLSAgIHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2ggd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24pLgotCi0gICBXZSBkbyBub3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHJlbG9jcyBvciBjb250ZW50cyB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgIGlmIG1lbW9yeSB1c2FnZSBiZWNvbWVzIGFuIGlzc3VlIHdlIGNhbiBkaXNjYXJkIHRoZW0gYW5kIHJlYWQgdGhlbQotICAgYWdhaW4uICBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSBtdXN0IHNhdmUgaW4gbWVtb3J5IGJldHdlZW4gdGhpcwotICAgcm91dGluZSBhbmQgdGhlIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lIGlzIHRoZSB0YWJsZSBvZgotICAgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBBc3N1bWUgd2UgYXJlIG5vdCBnb2luZyB0byBuZWVkIGFub3RoZXIgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhbiBFQ09GRiBmaWxlLCB0aGlzIGlzIG11Y2ggdG9vCi0gICAgIGNvbmZ1c2luZyB0byBkZWFsIHdpdGguICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY3MsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUEMgcmVsYXRpdmUgcmVsb2NzLCBhbmQgd2h5IHdvdWxkIHRoZXJlCi0gICAgIGV2ZXIgYmUgb25lIGZyb20gYW55dGhpbmcgYnV0IHRoZSAudGV4dCBzZWN0aW9uPyAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGV4dCIpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHRoZW0uICAqLwotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgfQotCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBfY29va2VkX3NpemUgb25seSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUKLQkgY2FsbGVkLiAgKi8KLSAgICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIGNvbnRlbnRzID0gc2VjdGlvbl90ZGF0YS0+Y29udGVudHM7Ci0gIG9mZnNldHMgPSBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzOwotCi0gIC8qIExvb2sgZm9yIGFueSBleHRlcm5hbCBQQyByZWxhdGl2ZSByZWxvY3MuICBJbnRlcm5hbCBQQyByZWxhdGl2ZQotICAgICByZWxvY3MgYXJlIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNvIHRoZXkgY2VydGFpbmx5Ci0gICAgIGNhbiBub3Qgb3ZlcmZsb3cuICAqLwotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphZGpfZXh0X3JlbDsKLSAgICAgIHVuc2lnbmVkIGludCBhZGpfaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKmFkal9oX3B0cjsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHJfZW5kOwotICAgICAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyByZWxvYywgd2UgY2VydGFpbmx5IGRvbid0Ci0JIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICAgICAgaWYgKG9mZnNldHMgIT0gKGxvbmcgKikgTlVMTCAmJiBvZmZzZXRzW2ldID09IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFF1aWNrbHkgY2hlY2sgdGhhdCB0aGlzIHJlbG9jIGlzIGV4dGVybmFsIFBDUkVMMTYuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSA9PSAwCi0JICAgICAgfHwgKCgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCSAgID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkgICE9IE1JUFNfUl9QQ1JFTDE2KSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBleHRfcmVsLCAmaW50X3JlbCk7Ci0KLSAgICAgIGggPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhlc2Ugd2lsbCBwcmVzdW1hYmx5Ci0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBsYXRlciBpbiB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpKTsKLQotICAgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gdGhlIG5vcm1hbCBjYXNlCi0JIG9mIGBgYmFsIHN5bWJvbCcnLCB0aGUgYWRkZW5kIHdpbGwgYmUgLTQuICBJdCB3aWxsIG9ubHkgYmUKLQkgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mIGBgYmFsIHN5bWJvbCtjb25zdGFudCcnLiAgVG8gYXZvaWQKLQkgYWx3YXlzIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdlIGRvbid0IGNoZWNrIHRoZQotCSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlICh3ZSBjb3VsZCBlYXNpbHkgY2hlY2sgdGhlIGNvbnRlbnRzCi0JIGlmIHdlIGhhcHBlbiB0byBoYXZlIGFscmVhZHkgcmVhZCB0aGVtIGluLCBidXQgSSBmZWFyIHRoYXQKLQkgdGhpcyBjb3VsZCBiZSBjb25mdXNpbmcpLiAgVGhpcyBtZWFucyB3ZSB3aWxsIHNjcmV3IHVwIGlmCi0JIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgaW4gcmFuZ2UsIGJ1dCBhZGRlZCB0bwotCSBhIGNvbnN0YW50IHdoaWNoIHB1dHMgaXQgb3V0IG9mIHJhbmdlOyBpbiBzdWNoIGEgY2FzZSB0aGUKLQkgbGluayB3aWxsIGZhaWwgd2l0aCBhIHJlbG9jIG92ZXJmbG93IGVycm9yLiAgU2luY2UgdGhlCi0JIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgc3VjaCBjb2RlLCBpdCBzaG91bGQgYmUgZWFzeQotCSBlbm91Z2ggdG8gd29yayBhcm91bmQgaXQgYnkgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgaW4gdGhlCi0JIHNvdXJjZSBmaWxlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gNDsKLQotICAgICAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIG51bWJlciB3ZSB3YW50IHRvIHB1dCBpbiB0aGUgb2JqZWN0Ci0JIGZpbGUuICBTZWUgd2hldGhlciBpdCBmaXRzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0aW9uID49IC0weDIwMDAwICYmIHJlbG9jYXRpb24gPCAweDIwMDAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgcmVsb2MgbmVlZHMgd29yaywgd2hpY2ggd2lsbCByYXJlbHkKLQkgaGFwcGVuLCBnbyBhaGVhZCBhbmQgZ3JhYiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNlYy0+X3Jhd19zaXplKTsKLQkgIGVsc2UKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotCi0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGJhbCBpbnN0cnVjdGlvbi4gIEl0IHdvdWxkIGJlCi0JIHBvc3NpYmxlIHRvIGhhbmRsZSBvdGhlciBQQyByZWxhdGl2ZSBicmFuY2hlcywgYnV0IHNvbWUgb2YKLQkgdGhlbSAodGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKSB3b3VsZCByZXF1aXJlIGEgZGlmZmVyZW50Ci0JIGxlbmd0aCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aGljaCB3b3VsZCBjb21wbGljYXRlIGJvdGggdGhpcwotCSByb3V0aW5lIGFuZCBtaXBzX3JlbGF4X3BjcmVsMTYuICBJdCBjb3VsZCBiZSB3cml0dGVuIGlmCi0JIHNvbWVib2R5IGZlbHQgaXQgd2VyZSBpbXBvcnRhbnQuICBJZ25vcmluZyB0aGlzIHJlbG9jIHdpbGwKLQkgcHJlc3VtYWJseSBjYXVzZSBhIHJlbG9jIG92ZXJmbG93IGVycm9yIGxhdGVyIG9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKQotCSAgIT0gMHgwNDExZmZmZikgLyogYmdlemFsICQwLC4gPT0gYmFsIC4gKi8KLQljb250aW51ZTsKLQotICAgICAgLyogQm90aGVyLiAgV2UgbmVlZCB0byBleHBhbmQgdGhpcyByZWxvYywgYW5kIHdlIHdpbGwgbmVlZCB0bwotCSBtYWtlIGFub3RoZXIgcmVsYXhhdGlvbiBwYXNzIHNpbmNlIHRoaXMgY2hhbmdlIG1heSBwdXQgb3RoZXIKLQkgcmVsb2NzIG91dCBvZiByYW5nZS4gIFdlIG5lZWQgdG8gZXhhbWluZSB0aGUgbG9jYWwgYnJhbmNoZXMKLQkgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG9mZnNldHMgd2UgbXVzdAotCSBhZGQgdG8gdGhlbS4gIFdlIGFsc28gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZiBhbGwKLQkgc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgZm9sbG93aW5nIHRoaXMgbG9jYXRpb24uICAqLwotCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSArPSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQl7Ci0JICBzaXplX3Qgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGxvbmcpOwotCSAgb2Zmc2V0cyA9IChsb25nICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAob2Zmc2V0cyA9PSAobG9uZyAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAob2Zmc2V0cywgMCwgc2l6ZSk7Ci0JICBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzID0gb2Zmc2V0czsKLQl9Ci0KLSAgICAgIG9mZnNldHNbaV0gPSAxOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIFBDIHJlbGF0aXZlIHJlZmVyZW5jZXMgdGhhdCBjcm9zcyB0aGlzIHJlbG9jCi0JIGFuZCBhZGp1c3QgdGhlaXIgb2Zmc2V0cy4gICovCi0gICAgICBhZGpfZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yIChhZGpfaSA9IDA7IGFkal9leHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGFkal9leHRfcmVsKyssIGFkal9pKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGFkal9pbnRfcmVsOwotCSAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgIGludCBjaGFuZ2U7Ci0KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgYWRqX2V4dF9yZWwsICZhZGpfaW50X3JlbCk7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgbG9jYWwgcmVmZXJlbmNlcy4gIEV4dGVybmFsIG9uZXMKLQkJIHdpbGwgYmUgcmVsb2NhdGVkIGNvcnJlY3RseSBhbnlob3cuICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2l0aGluCi0JCSB0aGlzIHNlY3Rpb24uICBGSVhNRTogQ3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZQotCQkgcmVsb2NzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHk7IGRvZXMgYW55Ym9keQotCQkgY2FyZT8gICovCi0JICAgICAgaWYgKGFkal9pbnRfcmVsLnJfc3ltbmR4ICE9IFJFTE9DX1NFQ1RJT05fVEVYVCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHI7Ci0KLQkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCi0JICAgICAgc3RvcCA9IChpbnNuICYgMHhmZmZmKSA8PCAyOwotCSAgICAgIGlmICgoc3RvcCAmIDB4MjAwMDApICE9IDApCi0JCXN0b3AgLT0gMHg0MDAwMDsKLQkgICAgICBzdG9wICs9IGFkal9pbnRfcmVsLnJfdmFkZHIgKyA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIHJlbGxvOwotCSAgICAgIGxvbmcgYWRkaGksIGFkZGxvOwotCi0JICAgICAgLyogVGhlIG5leHQgcmVsb2MgbXVzdCBiZSBNSVBTX1JfUkVMTE8sIGFuZCB3ZSBoYW5kbGUKLQkJIHRoZW0gdG9nZXRoZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGFkal9leHRfcmVsICsgMSA8IGV4dF9yZWxfZW5kKTsKLQotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgKGFkal9leHRfcmVsICsgMSksICZyZWxsbyk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChyZWxsby5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgICAgICAKLQkgICAgICBhZGRoaSA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGhpICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkaGkgJiAweDgwMDApCi0JCWFkZGhpIC09IDB4MTAwMDA7Ci0JICAgICAgYWRkaGkgPDw9IDE2OwotCi0JICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHJlbGxvLnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJYWRkbG8gLT0gMHgxMDAwMDsKLQotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJewotCQkgIC8qIFRoZSB2YWx1ZSB3ZSB3YW50IGhlcmUgaXMKLQkJICAgICAgIHN5bSAtIFJFTExPYWRkciArIGFkZGVuZAotCQkgICAgIHdoaWNoIHdlIGNhbiBleHByZXNzIGFzCi0JCSAgICAgICBzeW0gLSAoUkVMTE9hZGRyIC0gYWRkZW5kKQotCQkgICAgIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZXhwYW5kaW5nIHRoZSBhcmVhIGJldHdlZW4KLQkJICAgICBSRUxMT2FkZHIgYW5kIFJFTExPYWRkciAtIGFkZGVuZCB3ZSBtdXN0IGFkanVzdAotCQkgICAgIHRoZSBhZGRlbmQuICBUaGlzIGlzIGFkbWl0dGVkbHkgYW1iaWd1b3VzLCBzaW5jZQotCQkgICAgIHdlIG1pZ2h0IG1lYW4gKHN5bSArIGFkZGVuZCkgLSBSRUxMT2FkZHIsIGJ1dCBpbgotCQkgICAgIHByYWN0aWNlIHdlIGRvbid0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZQotCQkgICAgIHRoYXQgY2FzZSBjb3JyZWN0bHkgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBoYXZlCi0JCSAgICAgbm8gaWRlYSB3aGV0aGVyIGFueSByZWxvYyBpcyBiZWluZyBleHBhbmRlZAotCQkgICAgIGJldHdlZW4gc3ltIGFuZCBzeW0gKyBhZGRlbmQuICAqLwotCQkgIHN0YXJ0ID0gcmVsbG8ucl92YWRkciAtIChhZGRoaSArIGFkZGxvKTsKLQkJICBzdG9wID0gcmVsbG8ucl92YWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFuIGludGVybmFsIFJFTEhJL1JFTExPIHBhaXIgcmVwcmVzZW50cyB0aGUKLQkJICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcywgJExDMCAtIGZvby4KLQkJICAgICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlCi0JCSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgJExDMC4gIFRoaXMgbGV0cyB1cwotCQkgICAgIGNvbXB1dGUgJExDMCwgYW5kLCBieSBjb25zaWRlcmluZyB0aGUgYWRkZW5kLAotCQkgICAgIGZvby4gIElmIHRoZSByZWxvYyB3ZSBhcmUgZXhwYW5kaW5nIGZhbGxzIGJldHdlZW4KLQkJICAgICB0aG9zZSB0d28gcmVsb2NzLCB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kLiAgQXQKLQkJICAgICB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGluIHRoZQotCQkgICAgIHJfb2Zmc2V0IGZpZWxkLCB3aGVyZSBpdCB3YXMgcHV0IGJ5Ci0JCSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkJICBzdG9wID0gc3RhcnQgKyBhZGRoaSArIGFkZGxvOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCSAgICB7Ci0JICAgICAgLyogQSBNSVBTX1JfU1dJVENIIHJlbG9jIHJlcHJlc2VudHMgYSB3b3JkIG9mIHRoZSBmb3JtCi0JCSAgIC53b3JkICRMMy0kTFMxMgotCQkgVGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSBpcyBjb3JyZWN0LCBhc3N1bWluZyB0aGUKLQkJIG9yaWdpbmFsIHZhbHVlIG9mICRMMy4gIFRoZSBzeW1uZHggdmFsdWUgaXMgYWN0dWFsbHkKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMUzEyLgotCQkgVGhpcyBsZXRzIHVzIGNvbXB1dGUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMUzEyIGFzCi0JCSAgIHZhZGRyIC0gc3ltbmR4Ci0JCSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBhcwotCQkgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotCQkgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIEF0Ci0JCSB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGZvdW5kIGluIHRoZQotCQkgcl9vZmZzZXQgZmllbGQsIHNpbmNlIGl0IHdhcyBtb3ZlZCBieQotCQkgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkgICAgICBzdG9wID0gc3RhcnQgKyBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCQkgKGNvbnRlbnRzCi0JCQkJCSAgKyBhZGpfaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgLSBzZWMtPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgcmFuZ2UgZXhwcmVzc2VkIGJ5IHRoaXMgcmVsb2MsIHdoaWNoIGlzIHRoZQotCSAgICAgZGlzdGFuY2UgYmV0d2VlbiBTVEFSVCBhbmQgU1RPUCBjcm9zc2VzIHRoZSByZWxvYyB3ZSBhcmUKLQkgICAgIGV4cGFuZGluZywgd2UgbXVzdCBhZGp1c3QgdGhlIG9mZnNldC4gIFRoZSBzaWduIG9mIHRoZQotCSAgICAgYWRqdXN0bWVudCBkZXBlbmRzIHVwb24gdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgcmFuZ2UKLQkgICAgIGNyb3NzZXMgdGhlIHJlbG9jIGJlaW5nIGV4cGFuZGVkLiAgKi8KLQkgIGlmIChzdGFydCA8PSBpbnRfcmVsLnJfdmFkZHIgJiYgc3RvcCA+IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQkgIGVsc2UgaWYgKHN0YXJ0ID4gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPD0gaW50X3JlbC5yX3ZhZGRyKQotCSAgICBjaGFuZ2UgPSAtIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlCi0JICAgIGNoYW5nZSA9IDA7Ci0KLQkgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQotCSAgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JICAgIHsKLQkgICAgICBhZGpfZXh0X3JlbCsrOwotCSAgICAgIGFkal9pKys7Ci0JICAgICAgb2Zmc2V0c1thZGpfaV0gKz0gY2hhbmdlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbiBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKLQkgYW5kIGFkanVzdCB0aGVpciB2YWx1ZXMuICBOb3RlIHRoYXQgd2UgZGVjaWRlIHdoZXRoZXIgdG8KLQkgYWRqdXN0IHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFQ09GRiBFWFRSCi0JIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIG1heQotCSBoYXZlIGJlZW4gY2hhbmdlZCBieSBhbiBlYXJsaWVyIGV4cGFuZGVkIHJlbG9jIGFuZCB0aHVzIG1heQotCSBubyBsb25nZXIgY29ycmVjdGx5IGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBiZWZvcmUgb3IKLQkgYWZ0ZXIgdGhlIGV4cGFuZGVkIHJlbG9jLiAgKi8KLSAgICAgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotICAgICAgYWRqX2hfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0gICAgICBhZGpfaF9wdHJfZW5kID0gYWRqX2hfcHRyICsgZXh0X2NvdW50OwotICAgICAgZm9yICg7IGFkal9oX3B0ciA8IGFkal9oX3B0cl9lbmQ7IGFkal9oX3B0cisrKQotCXsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmFkal9oOwotCi0JICBhZGpfaCA9ICphZGpfaF9wdHI7Ci0JICBpZiAoYWRqX2ggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGFkal9oLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIGFkal9oLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgYWRqX2gtPmVzeW0uYXN5bS52YWx1ZSA+IGludF9yZWwucl92YWRkcikKLQkgICAgYWRqX2gtPnJvb3QudS5kZWYudmFsdWUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhbiBlbnRyeSB0byB0aGUgc3ltYm9sIHZhbHVlIGFkanVzdCBsaXN0LiAgVGhpcyBpcyB1c2VkCi0JIGJ5IGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIHRvIGFkanVzdCB0aGUgdmFsdWVzIG9mCi0JIGludGVybmFsIHN5bWJvbHMgYW5kIEZEUidzLiAgKi8KLSAgICAgIGFkanVzdCA9ICgoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCkpKTsKLSAgICAgIGlmIChhZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRqdXN0LT5zdGFydCA9IGludF9yZWwucl92YWRkcjsKLSAgICAgIGFkanVzdC0+ZW5kID0gc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGFkanVzdC0+YWRqdXN0ID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotICAgICAgYWRqdXN0LT5uZXh0ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0OwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0ID0gYWRqdXN0OwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCAmJiAhIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gYSBQQwotICAgcmVsYXRpdmUgcmVsb2MgbXVzdCBiZSBleHBhbmRlZCBpbnRvIHRoZSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlLgotICAgSXQgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGV4cGFuc2lvbiwgaW5jbHVkaW5nIHJlc29sdmluZwotICAgdGhlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsYXhfcGNyZWwxNiAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLCBsb2NhdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIEZJTE5NTEVOLCB0cnVlLCBmYWxzZSwgNCwgZmFsc2UsIDIsCi0gICAgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfaW4sIG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX2luLAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfaW4sIE5VTEwsCi0gICAgbWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2ssIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICAgIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vaywgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncywKLSAgICBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMCi0gIH0sCi0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBiZmRfYXJjaF9taXBzLAotICAvKiBJbml0aWFsIHBvcnRpb24gb2YgYXJtYXAgc3RyaW5nLiAgKi8KLSAgIl9fX19fX19fX18iLAotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIDB4MTAwMCwKLSAgLyogVHJ1ZSBpZiB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgQWxwaGEuICBGYWxzZSBpZiAucmRhdGEgaXMgcGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgTUlQUy4gICovCi0gIGZhbHNlLAotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAzMiwKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgJm1pcHNfaG93dG9fdGFibGVbTUlQU19SX1JFRldPUkRdLAotICB7Ci0gICAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gICAgbWFnaWNTeW0sCi0gICAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICAgIDQsCi0gICAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICAgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX2luLAotICAgIGVjb2ZmX3N3YXBfZG5yX2luLAotICAgIGVjb2ZmX3N3YXBfcGRyX2luLAotICAgIGVjb2ZmX3N3YXBfc3ltX2luLAotICAgIGVjb2ZmX3N3YXBfb3B0X2luLAotICAgIGVjb2ZmX3N3YXBfZmRyX2luLAotICAgIGVjb2ZmX3N3YXBfcmZkX2luLAotICAgIGVjb2ZmX3N3YXBfZXh0X2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gICAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgICBlY29mZl9zd2FwX29wdF9vdXQsCi0gICAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIH0sCi0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBSRUxTWiwKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLAotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICAvKiBCYWNrZW5kIHJlbG9jIHR3ZWFraW5nLiAgKi8KLSAgbWlwc19hZGp1c3RfcmVsb2NfaW4sCi0gIG1pcHNfYWRqdXN0X3JlbG9jX291dCwKLSAgLyogUmVsb2NhdGUgc2VjdGlvbiBjb250ZW50cyB3aGlsZSBsaW5raW5nLiAgKi8KLSAgbWlwc19yZWxvY2F0ZV9zZWN0aW9uLAotICAvKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byBmaWxlaGRyIGFuZCBhb3V0aGRyLiAgKi8KLSAgTlVMTCwKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICAqLwotICBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcwotfTsKLQotLyogTG9va2luZyB1cCBhIHJlbG9jIHR5cGUgaXMgTUlQUyBzcGVjaWZpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIEdldHRpbmcgcmVsb2NhdGVkIHNlY3Rpb24gY29udGVudHMgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBIYW5kbGluZyBmaWxlIHdpbmRvd3MgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBSZWxheGluZyBzZWN0aW9ucyBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBtaXBzX3JlbGF4X3NlY3Rpb24KLQotLyogR0Mgb2Ygc2VjdGlvbnMgaXMgbm90IGRvbmUuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9iaWdfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgZWNvZmZfYmlnX3ZlYywKLSAgCi0gIChQVFIpICZtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBlY29mZl9iaWdfdmVjID0KLXsKLSAgImVjb2ZmLWJpZ21pcHMiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl9ta29iamVjdCwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgZWNvZmZfbGl0dGxlX3ZlYywKLSAgCi0gIChQVFIpICZtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBlY29mZl9iaWdsaXR0bGVfdmVjID0KLXsKLSAgImVjb2ZmLWJpZ2xpdHRsZW1pcHMiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl9ta29iamVjdCwgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcG1hYy5jIGIvYmZkL2NvZmYtcG1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAxNjBiLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXBtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgZXQgYWwgUG93ZXJQQyBNYWMgIlhDT0ZGIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVHdlYWsgY29mZmNvZGUuaCBiYXNlZCBvbiB0aGlzIGJlaW5nIGEgUG93ZXJNYWMgaW5zdGVhZCBvZiBSUy82MDAwLiAqLwotCi0jZGVmaW5lIFBPV0VSTUFDCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlwbWFjX3hjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkieGNvZmYtcG93ZXJtYWMiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9yczYwMDAuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAieGNvZmYtdGFyZ2V0LmgiCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcHBjLmMgYi9iZmQvY29mZi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNjk1ZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsIHZlcnNpb24gcGllY2VkIHRvZ2V0aGVyIGJ5IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0KLSAgIFRoZXJlIGlzIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uIFRoaXMgZmlsZSBkcmF3cyBhIGxvdCBvbiBvdGhlcgotICAgY29mZiBmaWxlcywgaW4gcGFydGljdWxhciwgdGhvc2UgZm9yIHRoZSBycy82MDAwLCBhbHBoYSwgbWlwcywgYW5kIAotICAgaW50ZWwgYmFja2VuZHMsIGFuZCB0aGUgUEUgd29yayBmb3IgdGhlIGFybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ3VycmVudCBTdGF0ZToKLSAgIC0gb2JqZHVtcCB3b3JrcwotICAgLSByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotICAgLSBsZCB3aWxsIGxpbmsgZmlsZXMsIGJ1dCB0aGV5IGRvIG5vdCBydW4uCi0gICAtIGRsbHRvb2wgd2lsbCBub3QgcHJvZHVjZSBjb3JyZWN0IG91dHB1dCBpbiBzb21lIC5yZWxvYyBjYXNlcywgYW5kIHdpbGwgCi0gICAgIG5vdCBwcm9kdWNlIHRoZSByaWdodCBnbHVlIGNvZGUgZm9yIGRsbCBmdW5jdGlvbiBjYWxscy4KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3Bvd2VycGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotCi0jZGVmaW5lIEJBRE1BRyh4KSBQUENCQURNQUcoeCkKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGR1bXBfdG9jIFBBUkFNUyAoKFBUUikpOwotCi0vKiBUaGUgdG9jIGlzIGEgc2V0IG9mIGJmZF92bWEgZmllbGRzLiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB2YWxpZCAgICAgICAgICovCi0vKiBhZGRyZXNzZXMgYXJlIGV2ZW4gKGkuZS4gdGhlIGJpdCByZXByZXNlbnRpbmcgIjEiIGlzIG9mZikgdG8gYWxsb3cgICAgICovCi0vKiB1cyB0byBlbmNvZGUgYSBsaXR0bGUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICovCi0vKiAtIFVuYWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgaW50aWFsaXplZCB0byAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtIEFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGV2ZW4gbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3cml0ZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9jIGluIHRoZSBiZmQsICAgICovCi0vKiB3ZSB3YW50IHRvIHJlY29yZCB0aGF0IGZhY3QgaW4gYSBmaXh1cCBmaWxlIChpZiBpdCBpcyBhc2tlZCBmb3IpLCBzbyAgICovCi0vKiB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFuIGFkZHJlc3MgaGFzIGJlZW4gd3JpdHRlbiBieSBtYXJraW5nICovCi0vKiB0aGUgbG93IG9yZGVyIGJpdCB3aXRoIGEgIjEiIHVwb24gd3JpdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgU0VUX1VOQUxMT0NBVEVEKHgpICAoKHgpID0gMSkKLSNkZWZpbmUgSVNfVU5BTExPQ0FURUQoeCkgICAoKHgpID09IDEpCi0KLSNkZWZpbmUgSVNfV1JJVFRFTih4KSAgICAgICAoKHgpICYgMSkKLSNkZWZpbmUgTUFSS19BU19XUklUVEVOKHgpICAoKHgpIHw9IDEpCi0jZGVmaW5lIE1BS0VfQUREUl9BR0FJTih4KSAgKCh4KSAmPSB+MSkKLQotCi0vKiBUdXJuIG9uIHRoaXMgY2hlY2sgaWYgeW91IHN1c3BlY3Qgc29tZXRoaW5nIGFtaXNzIGluIHRoZSBoYXNoIHRhYmxlcyAqLwotI2lmZGVmIERFQlVHX0hBU0gKLQotLyogTmVlZCBhIDcgY2hhciBzdHJpbmcgZm9yIGFuIGV5ZSBjYXRjaGVyICovCi0jZGVmaW5lIEVZRSAia3JranVuayIKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTCBjaGFyIGV5ZV9jYXRjaGVyWzhdOwotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KSAgICAgIHN0cmNweShyZXQtPmV5ZV9jYXRjaGVyLCBFWUUpCi0jZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikgXAotIGlmIChzdHJjbXAoYWRkci0+ZXllX2NhdGNoZXIsIEVZRSkgIT0gMCkgXAotICB7IFwKLSAgICBmcHJpbnRmKHN0ZGVycixcCi0gICAgXygiRmlsZSAlcywgbGluZSAlZCwgSGFzaCBjaGVjayBmYWlsdXJlLCBiYWQgZXllICU4c1xuIiksIFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGFkZHItPmV5ZV9jYXRjaGVyKTsgXAotICAgIGFib3J0KCk7IFwKLSB9Ci0KLQotI2Vsc2UKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTAotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpCi0KLSNlbmRpZgotCi0vKiBJbiBvcmRlciBub3QgdG8gYWRkIGFuIGludCB0byBldmVyeSBoYXNoIHRhYmxlIGl0ZW0gZm9yIGV2ZXJ5IGNvZmYKLSAgIGxpbmtlciwgd2UgZGVmaW5lIG91ciBvd24gaGFzaCB0YWJsZSwgZGVyaXZlZCBmcm9tIHRoZSBjb2ZmIG9uZSAqLwotCi0vKiBQRSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgICovCi0KLSAgLyogQXMgd2Ugd29uZGVyIGFyb3VuZCB0aGUgcmVsb2NzLCB3ZSdsbCBrZWVwIHRoZSBhc3NpZ25lZCB0b2Nfb2Zmc2V0Ci0gICAgIGhlcmUgKi8KLSAgYmZkX3ZtYSB0b2Nfb2Zmc2V0OyAgICAgICAgICAgICAgIC8qIE91ciBhZGRpdGlvbiwgYXMgcmVxdWlyZWQgKi8KLSAgaW50IHN5bWJvbF9pc19nbHVlOwotICB1bnNpZ25lZCBsb25nIGludCBnbHVlX2luc247Ci0KLSAgSEFTSF9DSEVDS19EQ0wKLX07Ci0KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1wcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCAKLQkJCSBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpKTsKLQotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgCi0JCQkJICAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIFNFVF9VTkFMTE9DQVRFRChyZXQtPnRvY19vZmZzZXQpOwotICAgICAgcmV0LT5zeW1ib2xfaXNfZ2x1ZSA9IDA7Ci0gICAgICByZXQtPmdsdWVfaW5zbiA9IDA7Ci0KLSAgICAgIEhBU0hfQ0hFQ0tfSU5JVChyZXQpOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBOb3csIHRhaWxvciBjb2ZmY29kZS5oIHRvIHVzZSBvdXIgaGFzaCBzdHVmZiAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0MCi0vKiBUaGUgbnQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8gKi8KLS8qIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdCAqLwotLyogZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICAgICAgICAgICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogdGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZ28gaW4gYSBoZWFkZXIgZmlsZSBzb21ld2hlcmUuLi4gKi8KLQotLyogTk9QICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgICAgICAgICAgMHgwMDAwCi0KLS8qIDY0LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgICAgICAgICAgMHgwMDAxCi0KLS8qIDMyLWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgICAgICAgICAgMHgwMDAyCi0KLS8qIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgICAgICAgICAgIDB4MDAwMwotCi0vKiAxNi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgICAgICAgICAgIDB4MDAwNAotCi0vKiAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAgICAgICAgICAweDAwMDUKLQotLyogMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwyNCAgICAgICAgICAgICAweDAwMDYKLQotLyogMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMTQgICAgICAgICAgICAgMHgwMDA3Ci0KLS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2ICAgICAgICAgIDB4MDAwOAotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgICAgICAgICAgMHgwMDA5Ci0KLS8qIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyTkIgICAgICAgICAgMHgwMDBBCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAgICAgICAgICAweDAwMEIKLQotLyogc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAgICAgICAgICAweDAwMEMKLQotLyogc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgICAgICAgICAgIDB4MDAwRAotCi0vKiBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JTUdMVUUgICAgICAgICAgICAweDAwMEUKLQotLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgICAgICAgICAgMHgwMDBGCi0KLS8qIHN0dWZmIHRvIGhhbmRsZSBpbW1lZGlhdGUgZGF0YSB3aGVuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgKi8KLS8qIGRhdGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkICovCi0vKiBXZSBuZWVkIHRvIGRvICh1c3VhbGx5KSAzMiBiaXQgYXJpdGhtZXRpYyBvbiAxNiBiaXQgY2h1bmtzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyCi0KLS8qIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdG9jcmVsMTYsIHdpdGggVE9DREVGTiBhc3N1bWVkICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAgICAgMHgwMDEzCi0KLS8qICBGbGFnIGJpdHMgaW4gSU1BR0VfUkVMT0NBVElPTi5UWVBFICovCi0KLS8qIHN1YnRyYWN0IHJlbG9jIHZhbHVlIHJhdGhlciB0aGFuIGFkZGluZyBpdCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgICAgICAgICAgMHgwMjAwCi0KLS8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gICAgICAgICAgMHgwNDAwCi0KLS8qIHRvYyBzbG90IGRlZmluZWQgaW4gZmlsZSAob3IsIGRhdGEgaW4gdG9jKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gICAgICAgICAgIDB4MDgwMAotCi0vKiBtYXNrcyB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAgICAgICAgICAweDAwRkYKLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSyAgICAgICAgICAweDBGMDAKLQotI2RlZmluZSBFWFRSQUNUX1RZUEUoeCkgICAgICAgICAgICAgICAgICgoeCkgJiBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLKQotI2RlZmluZSBFWFRSQUNUX0ZMQUdTKHgpICgoeCkgJiBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKQotI2RlZmluZSBFWFRSQUNUX0pVTksoeCkgIFwKLSAgICAgICAgICAgKCh4KSAmIH4oSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyB8IElNQUdFX1JFTF9QUENfRkxBR01BU0spKQotCi0MCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHJlbG9jYXRpb24gd29yayAqLwotLyogKFdvcmsgSW4gUHJvZ3Jlc3MpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19wYWlyX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgIGNoYXIgKiplcnJvcikpOwotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY190b2MxNl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLQotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2FkZHIzMm5iX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWN0aW9uX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWNyZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2ltZ2x1ZV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLQotCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TKChiZmQgKmFiZmQsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvKSk7Ci0KLQwKLS8qIEZJWE1FOiBJdCdsbCB0YWtlIGEgd2hpbGUgdG8gZ2V0IHRocm91Z2ggYWxsIG9mIHRoZXNlLiBJIG9ubHkgbmVlZCBhIGZldyB0bwotICAgZ2V0IHVzIHN0YXJ0ZWQsIHNvIHRob3NlIEknbGwgbWFrZSBzdXJlIHdvcmsuIFRob3NlIG1hcmtlZCBGSVhNRSBhcmUgZWl0aGVyCi0gICBjb21wbGV0ZWx5IHVudmVyaWZpZWQgb3IgaGF2ZSBhIHNwZWNpZmljIHVua25vd24gbWFya2VkIGluIHRoZSBjb21tZW50ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbG9jYXRpb24gZW50cmllcyBmb3IgV2luZG93cy9OVCBvbiBQb3dlclBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZyb20gdGhlIGRvY3VtZW50ICIiIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBsaXN0ZWQgYXMgdXNlZCByZWxvY3M6ICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUJTT0xVVEUgICAgICAgOiBUaGUgbm9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUREUls2NHwzMnwxNl0gOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBkYXRhIGZpZWxkcyBvciB0aGUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIG9uIGEgbG9hZC9zdG9yZS4gICAgICAgICAgICAgKi8KLS8qICAgQUREUlsyNHwxNF0gICAgOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBicmFuY2ggYW5kIGNvbmQgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBicmFuY2hlcy4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3Nlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBUaGUgbG93IG9yZGVyIDIgYml0cyBhcmUgcHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUkVMWzI0fDE0XSAgICAgOiBicmFuY2hlcyByZWxhdGl2ZSB0byB0aGUgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3NlcywgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBhcyBiZWZvcmUuIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB3aWxsIGJlIHplcm8sIGFuZCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgU1lNIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbGluayB0aW1lLiAgKi8KLS8qICAgVE9DUkVMMTYgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIHJlZmVycmluZyB0byBhIHNsb3QgaW4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0b2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVE9DUkVMMTQgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkLCBzaW1pbGFyIHRvIFJFTDE0IG9yIEFERFIxNC4gKi8KLS8qICAgQUREUjMyTkIgICAgICAgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KLS8qICAgU0VDUkVMICAgICAgICAgOiBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzeW1ib2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgU0VDVElPTiAgICAgICAgOiBhY2Nlc3MgdG8gdGhlIGhlYWRlciBjb250YWluaW5nIHRoZSBpdGVtLiBTdXBwb3J0cyB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb2RldmlldyBkZWJ1Z2dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgICAgICAgICAgKi8KLS8qIHJlbG9jYXRpb25zIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAgTk9QICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUJTT0xVVEUsIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjY0IDB4MDAwMSAgNjQtYml0IGFkZHJlc3MgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyhJTUFHRV9SRUxfUFBDX0FERFI2NCwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTMsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCTY0LAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAJIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkiQUREUjY0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JdHJ1ZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JTUlOVVNfT05FLAkgCSAvKiBzcmNfbWFzayAqLwotCU1JTlVTX09ORSwgICAgICAgIAkgLyogZHN0X21hc2sgKi8KLQlmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMiAweDAwMDIgIDMyLWJpdCBhZGRyZXNzICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMjQgMHgwMDAzICAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSAgLyogdGhlIExJIGZpZWxkIGlzIGluIGJpdCA2IHRocm91Z2ggYml0IDI5IGlzIDI0IGJpdHMsICsgMiBmb3IgdGhlIHNoaWZ0ICovCi0gIC8qIE9mIGNvdXJzZSwgVGhhdCdzIHRoZSBJQk0gYXBwcm92ZWQgYml0IG51bWJlcmluZywgd2hpY2ggaXMgbm90IHdoYXQgKi8KLSAgLyogYW55b25lIGVsc2UgdXNlcy4uLi4gVGhlIGxpIGZpZWxkIGlzIGluIGJpdCAyIHRocnUgMjUgKi8gCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIyNCwgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjI0IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwN2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTYgMHgwMDA0ICAxNi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTYsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNCAweDAwMDUgKi8KLSAgLyogIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMjQgMHgwMDA2ICovCi0gIC8qICAgMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVMMjQsICAgLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVMMjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMTQgMHgwMDA3ICovCi0gIC8qICAgMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0gIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCi0gIC8qIEZJWE1FOiBob3cgZG9lcyBpdCBrbm93IGhvdyBmYXIgdG8gc2hpZnQ/ICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAweDAwMDggKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3RvYzE2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJUT0NSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTQiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAqLwotICAvKiAgIDMyLWJpdCBhZGRyIHcvIGltYWdlIGJhc2UgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzJOQiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyTkIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMIDB4MDAwQiAqLwotICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfc2VjcmVsX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gMHgwMDBDICovCi0gIC8qICAgc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNUSU9OLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3Rpb25fcmVsb2MsICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNUSU9OIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JRkdMVUUgMHgwMDBEICovCi0gIC8qICAgc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JRkdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJJRkdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JTUdMVUUgMHgwMDBFICovCi0gIC8qICAgc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSU1HTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19pbWdsdWVfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSU1HTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAweDAwMEYgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZISSwgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGSEkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkxPLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSRUZMTyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19QQUlSLCAgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19wYWlyX3JlbG9jLCAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUEFJUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAweDAwMTMgKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHdpdGhvdXQgY2F1c2luZyBhIGRlZmluaXRpb24gKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKCAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiB8IElNQUdFX1JFTF9QUENfVE9DREVGTiksIC8qIHR5cGUgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYsIFRPQ0RFRk4iLCAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLQotDAotCi0vKiBTb21lIHJlYWxseSBjaGVlenkgbWFjcm9zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiB0byB0ZXN0IHN0ZGVyciA6LSkgKi8KLQotI2lmZGVmIERFQlVHX1JFTE9DCi0jZGVmaW5lIFVOX0lNUEwoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHN0YXRpYyBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAoaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZnByaW50ZihzdGRlcnIsXygiVW5pbXBsZW1lbnRlZCBSZWxvY2F0aW9uIC0tICVzXG4iKSx4KTsgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEVU1QX1JFTE9DKG4scikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIGFkZHIgJWQsIGFkZGVuZCAlZFxuIiwgXAotCSAgIG4sICgqKHItPnN5bV9wdHJfcHRyKSktPm5hbWUsICAgICAgICAgICAgIFwKLQkgICByLT5hZGRyZXNzLCByLT5hZGRlbmQpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEdpdmVuIGEgcmVsb2MgbmFtZSwgbiwgYW5kIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbF9yZWxvYywgCi0gICBkdW1wIG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgCi0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLSovCi0KLSNkZWZpbmUgRFVNUF9SRUxPQzIobixyKSAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIHJfdmFkZHIgJWQgJXNcbiIsIFwKLQkgICBuLCByLT5yX3N5bW5keCwgci0+cl92YWRkcixcCi0JICAgKCgoci0+cl90eXBlKSAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgPT0gMCkgXAotCSAgID8iICI6IiBUT0NERUZOIiAgKTsgICAgICBcCi19Ci0KLSNlbHNlCi0jZGVmaW5lIFVOX0lNUEwoeCkKLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikKLSNlbmRpZgotCi0KLQwKLS8qIHRvYyBjb25zdHJ1Y3Rpb24gYW5kIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG9uZQotICAgb2YgdGhlIGNvbXBpbGF0aW9ucy4gIEZJWE1FOiBUaGlzIGlzIGNvbmZ1c2luZyBhbmQgd2VpcmQuICBBbHNvLAotICAgQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotZXh0ZXJuIGJmZCogYmZkX29mX3RvY19vd25lcjsKLWV4dGVybiBsb25nIGludCBnbG9iYWxfdG9jX3NpemU7Ci0KLWV4dGVybiBsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWV4dGVybiBsb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotZXh0ZXJuIGxvbmcgaW50IHRodW5rX3NpemU7Ci0KLWVudW0gdG9jX3R5cGUKLXsKLSAgZGVmYXVsdF90b2MsCi0gIHRvY18zMiwKLSAgdG9jXzY0Ci19OwotCi1lbnVtIHJlZl9jYXRlZ29yeQotewotICBwcml2LAotICBwdWIsCi0gIGRhdGEKLX07Ci0KLXN0cnVjdCBsaXN0X2VsZQotewotICBzdHJ1Y3QgbGlzdF9lbGUgKm5leHQ7Ci0gIGJmZF92bWEgYWRkcjsKLSAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OwotICBpbnQgb2Zmc2V0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF90b2MKLSAgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBlbnVtIHJlZl9jYXRlZ29yeSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdG9jICh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIGNhdCwgbmFtZSkKLSAgICAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotICAgICBpbnQgb3VyX3RvY19vZmZzZXQ7Ci0gICAgIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogYWRkIHRoaXMgZW50cnkgdG8gb3VyIHRvYyBhZGRyLW9mZnNldC1uYW1lIGxpc3QgKi8KLSAgc3RydWN0IGxpc3RfZWxlICp0OwotICB0ID0gKHN0cnVjdCBsaXN0X2VsZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2VsZSkpOwotICBpZiAodCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICB0LT5uZXh0ID0gMDsKLSAgdC0+b2Zmc2V0ID0gb3VyX3RvY19vZmZzZXQ7Ci0gIHQtPm5hbWUgPSBuYW1lOwotICB0LT5jYXQgPSBjYXQ7Ci0gIHQtPmFkZHIgPSB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCi0gIGlmIChoZWFkID09IDApCi0gICAgewotICAgICAgaGVhZCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YWlsLT5uZXh0ID0gdDsKLSAgICAgIHRhaWwgPSB0OwotICAgIH0KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfcmVjb3JkX3RvY19lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50LCBlbnVtIHRvY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIHN5bSwgdG9jX2tpbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaW50ICpsb2NhbF9zeW1zOwotCi0gIGggPSAwOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0gIGlmIChoICE9IDApCi0gICAgewotICAgICAgSEFTSF9DSEVDSyhoKTsKLSAgICB9Ci0KLSAgaWYgKGggPT0gMCkgCi0gICAgeyAKLSAgICAgIGxvY2FsX3N5bXMgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgLyogYWxsb2NhdGUgYSB0YWJsZSAqLwotCSAgbG9jYWxfc3ltcyA9IAotCSAgICAoaW50ICopIGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCW9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpICogc2l6ZW9mKGludCkpOwotCSAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpID0gbG9jYWxfc3ltczsKLQkgIGZvciAoaSA9IDA7IGkgPCBvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKTsgKytpKQotCSAgICB7Ci0JICAgICAgU0VUX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoSVNfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tzeW1dKSkgCi0JewotCSAgbG9jYWxfc3ltc1tzeW1dID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPiA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHRvYyBzbG90IGFsbG9jYXRlZC4gSWYgbm90LCBkbyBpdAotCSBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgaW4gcmVsb2NhdGVfc2VjdGlvbiAqLwotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGgtPnRvY19vZmZzZXQpKQotCXsKLQkgIGgtPnRvY19vZmZzZXQgPSBnbG9iYWxfdG9jX3NpemU7Ci0JICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKLQotCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+PSA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLwotc3RhdGljIHZvaWQKLXBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHN5bSwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW07Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0KLSAgSEFTSF9DSEVDSyhoKTsKLQotICBoLT5zeW1ib2xfaXNfZ2x1ZSA9IDE7Ci0gIGgtPmdsdWVfaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAmcmVsLT5yX3ZhZGRyKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQwKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAKLSAgICAoISBob3d0by0+cGNfcmVsYXRpdmUpIAotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfQUREUjMyTkIpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lNR0xVRSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lGR0xVRSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNUSU9OKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMMTYpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZISSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkxPKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pIDsKLX0gICAgIAotCi0jaWYgMAotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBwZXJmb3JtaW5nIGFsbCB0aGUgcHBjIFBFIHJlbG9jYXRpb25zICovCi0vKiBEb24ndCB5ZXQga25vdyBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgdGhpcyBwYXJ0aWN1bGFyIHdheSAuLi4gKGtyaykgICovCi0vKiBGSVhNRTogKGl0IGlzIG5vdCB5ZXQgZW5hYmxlZCkgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGVfcHBjX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiB0aGUgY29uc3RoIHJlbG9jYXRpb24gY29tZXMgaW4gdHdvIHBhcnRzLCB3ZSBoYXZlIHRvIHJlbWVtYmVyCi0gICAgIHRoZSBzdGF0ZSBiZXR3ZWVuIGNhbGxzLCBpbiB0aGVzZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGljIGJvb2xlYW4gcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0MV9jb25zdGhfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSAKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmcgLSBkbyBub3RoaW5nICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsgCi0gICAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIEtlZXAgdGhlIHN0YXRlIG1hY2hpbmUgaGFwcHkgaW4gY2FzZSB3ZSdyZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19SRUZISSkgCi0JewotCSAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0JICBwYXJ0MV9jb25zdGhfdmFsdWUgID0gMDsKLQl9Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gICAgfQotICAKLSAgaWYgKChwYXJ0MV9jb25zdGhfYWN0aXZlKSAmJiAocl90eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBQQUlSIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotICAKLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IDA7Ci0gIAotICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKLSAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBoaWhhbGYgPSBmYWxzZTsKLSAgaGloYWxmX3ZhbCA9IDA7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqbG9jOwotCi0gICAgICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0gIAotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLSAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogY2hlY2sgYm91bmRzIG9uIHJfdHlwZSAqLwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICAgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XSk7Ci0JICBpZiAoaCAhPSAwKSAKLQkgICAgewotCSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0JICAgIH0KLQotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUgJiYgaCA9PSAwKQotCXsKLQkgIC8qIEFuIElNR0xVRSByZWxvYyBtdXN0IGhhdmUgYSBuYW1lLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogRklYTUU6IFBBSVIgdW5zdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgSEFTSF9DSEVDSyhoKTsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICAgIC8qIEVhY2ggY2FzZSBtdXN0IGRvIGl0cyBvd24gcmVsb2NhdGlvbiwgc2V0dGluZyByc3RhdCBhcHByb3ByaWF0ZWx5ICovCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgb3VyX3RvY19vZmZzZXQ7Ci0JICAgIGludCBmaXhpdDsKLQotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAodG9jX3NlY3Rpb24gPT0gMCkgCi0JICAgICAgewotCQl0b2Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfdG9jX293bmVyLCAKLQkJCQkJCSAgICAgICBUT0NfU0VDVElPTl9OQU1FKTsKLQotCQlpZiAoIHRvY19zZWN0aW9uID09IE5VTEwgKSAKLQkJICB7Ci0JCSAgICAvKiBUaGVyZSBpcyBubyB0b2Mgc2VjdGlvbi4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCSAgICBhYm9ydCgpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogCi0JICAgICAqICBBbWF6aW5nIGJpdCB0cmlja3MgcHJlc2VudC4gQXMgd2UgbWF5IGhhdmUgc2VlbiBlYXJsaWVyLCB3ZQotCSAgICAgKiAgdXNlIHRoZSAxIGJpdCB0byB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IGEgdG9jIG9mZnNldCBoYXMgYmVlbgotCSAgICAgKiAgYWxsb2NhdGVkLiBOb3cgdGhhdCB0aGV5J3ZlIGFsbCBiZWVuIGFsbG9jYXRlZCwgd2Ugd2lsbCB1c2UKLQkgICAgICogIHRoZSAxIGJpdCB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHdyaXR0ZW4gdGhpcyBwYXJ0aWN1bGFyIHRvYwotCSAgICAgKiAgZW50cnkgb3V0LgotCSAgICAgKi8KLQkgICAgZml4aXQgPSBmYWxzZTsKLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJaW50ICpsb2NhbF90b2NfdGFibGU7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQotCQlsb2NhbF90b2NfdGFibGUgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoaW5wdXRfYmZkKTsKLQkJb3VyX3RvY19vZmZzZXQgPSBsb2NhbF90b2NfdGFibGVbc3ltbmR4XTsKLQotCQlpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCAKLQkJCSAgICAgICBvdXJfdG9jX29mZnNldCwgCi0JCQkgICAgICAgcHJpdiwgCi0JCQkgICAgICAgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAotCQkJICAgICAgIHZhbCwKLQkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7Ci0KLQkJICAgIE1BUktfQVNfV1JJVFRFTihsb2NhbF90b2NfdGFibGVbc3ltbmR4XSk7Ci0JCSAgICBmaXhpdCA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJb3VyX3RvY19vZmZzZXQgPSBoLT50b2Nfb2Zmc2V0OwotCi0JCWlmICgocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgCi0JCSAgICA9PSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgaXMgdW5iZWxpZXZhYmxlIGNoZWVzZS4gU29tZSBrbm93bGVkZ2FibGUgYXNtIAotCQkgICAgICAgaGFja2VyIGhhcyBkZWNpZGVkIHRvIHVzZSByMiBhcyBhIGJhc2UgZm9yIGxvYWRpbmcgCi0JCSAgICAgICBhIHZhbHVlLiBIZS9TaGUgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHRvY2RlZm4gYml0LCAKLQkJICAgICAgIGFuZCBub3Qgc3VwcGx5aW5nIGEgdG9jIGRlZmluaXRpb24uIFRoZSBiZWhhdmlvdXIgaXMgCi0JCSAgICAgICB0aGVuIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiB0aGUgCi0JCSAgICAgICBzeW1ib2wgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YgdGhlIHRvYyBhcyB0aGUgdG9jIAotCQkgICAgICAgaW5kZXguIAotCi0JCSAgICAgICBJbiBmYWN0LCB3aGF0IGlzIHVzdWFsbHkgaGFwcGVuaW5nIGlzLCBiZWNhdXNlIHRoZQotCQkgICAgICAgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgbWFwcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotCQkgICAgICAgdGhlIHRvYywgc29tZSB0cmlwcHkgbGlicmFyeSBjb2RlIHRyeWluZyBmb3Igc3BlZWQgb24KLQkJICAgICAgIGRsbCBsaW5rYWdlLCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdCBhbmQgY29uc2lkZXJzIAotCQkgICAgICAgdGhlIElBVCB0byBiZSBwYXJ0IG9mIHRoZSB0b2MsIHRodXMgc2F2aW5nIGEgbG9hZC4KLQkJICAgICovCi0KLQkJICAgIG91cl90b2Nfb2Zmc2V0ID0gdmFsIC0gCi0JCSAgICAgICh0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgICAgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgICAvKiBUaGUgc2l6ZSBtdXN0IHN0aWxsIGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JCSAgICBpZiAob3VyX3RvY19vZmZzZXQgPj0gNjU1MzUpCi0JCSAgICAgIHsKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiJXM6IFJlbG9jYXRpb24gZm9yICVzIG9mICV4IGV4Y2VlZHMgVG9jIHNpemUgbGltaXQiKSwgCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBuYW1lLCBvdXJfdG9jX29mZnNldCk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOwotCQkgIH0KLQkJZWxzZSBpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0KLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGgtPnRvY19vZmZzZXQpOwotCQkgICAgLyogVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyB0aGF0ICovCi0JCSAgICAvKiBuZWVkcyBhIC5yZWxvYyBlbnRyeSBmb3IgaXQgKi8KLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChmaXhpdCAmJiBpbmZvLT5iYXNlX2ZpbGUpIAotCSAgICAgIHsKLQkJLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkJICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCi0KLQkJLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKLQkJICAgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJICAgdG8gYSBmaWxlICovCi0KLQkJYmZkX3ZtYSBhZGRyID0gIHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCQkgICAgCi0JCWlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotCQlmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0JICAgICAgfQotCi0KLQkgICAgLyogRklYTUU6IHRoaXMgdGVzdCBpcyBjb25zZXJ2YXRpdmUgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICYmCi0JCW91cl90b2Nfb2Zmc2V0ID4gdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogUmVsb2NhdGlvbiBleGNlZWRzIGFsbG9jYXRlZCBUT0MgKCV4KSIpLCAKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIE5vdyB3ZSBrbm93IHRoZSByZWxvY2F0aW9uIGZvciB0aGlzIHRvYyByZWZlcmVuY2UgKi8KLQkgICAgcmVsb2NhdGlvbiA9ICBvdXJfdG9jX29mZnNldCArIFRPQ19MT0FEX0FESlVTVE1FTlQ7Ci0JICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgICBpbnB1dF9iZmQsIAotCQkJCQkgICAgcmVsb2NhdGlvbiwgCi0JCQkJCSAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKLQkgIHsKLQkgICAgLyogVG8gc29sdmUgdGhpcywgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgKi8KLQkgICAgLyogYXBwZWFyaW5nIG9uIHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIGEgZ2x1ZSBmdW5jdGlvbiBvciBub3QuICovCi0JICAgIC8qIEEgZ2x1ZSBmdW5jdGlvbiBtdXN0IGFubm91bmNlIGl0c2VsZiB2aWEgYSBJTUdMVUUgcmVsb2MsIGFuZCAqLwotCSAgICAvKiB0aGUgcmVsb2MgY29udGFpbnMgdGhlIHJlcXVpcmVkIHRvYyByZXN0b3JlIGluc3RydWN0aW9uICovCi0JICAKLQkgICAgYmZkX3ZtYSB4OwotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoaCAhPSAwKQotCSAgICAgIHsKLQkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCQkgIHsKLQkJICAgIHggPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbG9jKTsKLQkJICAgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCBoLT5nbHVlX2luc24sIGxvYyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIEZvciBmYXN0IGFjY2VzcyB0byB0aGUgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIAotCSAgICAgY29udGFpbmluZyB0aGUgaXRlbS4gKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0JICAvKiBJcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSByZWxhdGl2ZQotCSAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotCSAgICAgc3ltYm9sICovCi0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUJTT0xVVEU6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoID09IDApCi0JCW15X25hbWUgPSAoc3ltcytzeW1uZHgpLT5fbi5fbl9uYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmKHN0ZGVyciwgCi0JCSAgICBfKCJXYXJuaW5nOiB1bnN1cHBvcnRlZCByZWxvYyAlcyA8ZmlsZSAlcywgc2VjdGlvbiAlcz5cbiIpLCAKLQkJICAgIGhvd3RvLT5uYW1lLAotCQkgICAgYmZkX2dldF9maWxlbmFtZShpbnB1dF9iZmQpLAotCQkgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgZnByaW50ZihzdGRlcnIsInN5bSAlbGQgKCVzKSwgcl92YWRkciAlbGQgKCVseClcbiIsIAotCQkgICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKLQkJICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotCSAgewotCSAgICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4gVGhpcyByZWxvYyB3YXMgbm90ZWQgaW4gdGhlIGZpcnN0Ci0JICAgICAgIHBhc3Mgb3ZlciB0aGUgcmVsb2NzLCBhbmQgdGhlIGdsdWUgaW5zdHJ1Y3Rpb24gZXh0cmFjdGVkICovCi0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKLQkgICAgICBicmVhazsKLQkgICAgbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiJXM6IE91dCBvZiBvcmRlciBJTUdMVUUgcmVsb2MgZm9yICVzIiksIAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBteV9uYW1lKTsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOwotCSAgICBjb25zdCBjaGFyICpuYW1lID0gMDsKLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKHN0cm5jbXAoIi5pZGF0YSQyIixpbnB1dF9zZWN0aW9uLT5uYW1lLDgpID09IDAgJiYgZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCSAgICAgIHsKLQkJLyogc2V0IG1hZ2ljIHZhbHVlcyAqLwotCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQlzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCi0JCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQotCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCi0JCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChoID09IDApCi0JICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCi0JCXN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp0YXJnZXQgPSAwOwotCi0JCW5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWlmIChzdHJjbXAoIi5pZGF0YSQyIiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTJfbWFnaWNfXyI7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDQiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhNF9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNSIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE1X21hZ2ljX18iOwotCi0JCWlmICh0YXJnZXQgIT0gMCkKLQkJICB7Ci0JCSAgICBteWggPSAwOwotCi0JCSAgICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgdGFyZ2V0LAotCQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICBpZiAobXloID09IDApIAotCQkgICAgICB7Ci0JCQkvKiBNaXNzaW5nIG1hZ2ljIGNvb2tpZXMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICB2YWwgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkgICAgaWYgKGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKLQkJICAgICAgewotCQkJaW50IGlkYXRhNW9mZnNldDsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQkKLQkJCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJCi0JCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJICAgICAgCSAgICAgIGlucHV0X2JmZCwgCi0JCQkgICAgICB2YWwgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UsCi0JCQkgICAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0JICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQkgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLCAKLQkJCQkJICB2YWwsIAotCQkJCQkgIGxvYyk7Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCBpbmZvLT5iYXNlX2ZpbGUgKQotCXsKLQkgIC8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCi0JICAgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJIHRvIGEgZmlsZSAqLwotCSAgICAgIGJmZF92bWEgYWRkciA9IHJlbC0+cl92YWRkciAKLQkJLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgICAgICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLQkJewotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJfQotCSAgICAgIGZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCW5hbWUgPSBidWY7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgCi0JCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCX0KLQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLS8qIEZJWE1FOiBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIHNoYXJlZC4gIFRoaXMgaXMgY29uZnVzaW5nIGFuZAotICAgd2VpcmQuICAqLwotCi1sb25nIGludCBnbG9iYWxfdG9jX3NpemUgPSA0OwotCi1iZmQqIGJmZF9vZl90b2Nfb3duZXIgPSAwOwotCi1sb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWxvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7Ci1sb25nIGludCB0aHVua19zaXplOwotCi1zdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1zdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyBjaGFyICoKLWgxID0gTl8oIlxuXHRcdFx0VE9DIE1BUFBJTkdcblxuIik7Ci1zdGF0aWMgY2hhciAqCi1oMiA9IE5fKCIgVE9DICAgIGRpc2Fzc2VtYmx5ICBDb21tZW50cyAgICAgICBOYW1lXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgzID0gTl8oIiBPZmZzZXQgIHNwZWxsaW5nICAgICAgICAgICAgICAgICAgIChpZiBwcmVzZW50KVxuIik7Ci0KLXZvaWQKLWR1bXBfdG9jICh2ZmlsZSkKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLQotICBmcHJpbnRmKGZpbGUsIF8oaDEpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgyKSk7Ci0gIGZwcmludGYoZmlsZSwgXyhoMykpOwotCi0gIGZvcih0ID0gaGVhZDsgdCAhPSAwOyB0PXQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqY2F0ID0gIiI7Ci0KLSAgICAgIGlmICh0LT5jYXQgPT0gcHJpdikKLQljYXQgPSBfKCJwcml2YXRlICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IHB1YikKLQljYXQgPSBfKCJwdWJsaWMgICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IGRhdGEpCi0JY2F0ID0gXygiZGF0YS1pbi10b2MgICAiKTsKLQotICAgICAgaWYgKHQtPm9mZnNldCA+IGdsb2JhbF90b2Nfc2l6ZSkKLQl7Ci0JICBpZiAodC0+b2Zmc2V0IDw9IGdsb2JhbF90b2Nfc2l6ZSArIHRodW5rX3NpemUpCi0JICAgIGNhdCA9IF8oIklBVCByZWZlcmVuY2UgIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIioqKiogZ2xvYmFsX3RvY19zaXplICVsZCglbHgpLCB0aHVua19zaXplICVsZCglbHgpXG4iKSwKLQkJICAgICAgZ2xvYmFsX3RvY19zaXplLCBnbG9iYWxfdG9jX3NpemUsIHRodW5rX3NpemUsIHRodW5rX3NpemUpOwotCSAgICAgIGNhdCA9IF8oIk91dCBvZiBib3VuZHMhIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICUwNGx4ICAgICglZCkiLCAodW5zaWduZWQgbG9uZykgdC0+b2Zmc2V0LCB0LT5vZmZzZXQgLSAzMjc2OCk7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIiAgICAlcyAlc1xuIiwKLQkgICAgICBjYXQsIHQtPm5hbWUpOwotCi0gICAgfQotCi0gIGZwcmludGYoZmlsZSwgIlxuIik7Ci19Ci0KLWJvb2xlYW4KLXBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoaW5mbykgCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyX0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19JTUdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBJTUFHRV9SRUxfUFBDX0lGR0xVRSk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjE2KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CMjYsICAgICAgSU1BR0VfUkVMX1BQQ19SRUwyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQkEyNiwgICAgIElNQUdFX1JFTF9QUENfQUREUjI0KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19UT0MxNiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzJOQik7Ci0gICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgIHBwY19jb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyB2b2lkIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYKLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9wcGNfcnR5cGVfdG9faG93dG8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgICAgICAgICAgcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRTogVGhpcyBubyBsb25nZXIgd29ya3MuICAqLwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotLyogRklYTUU6IFRoaXMgY29udHJvbHMgc29tZSBjb2RlIHRoYXQgdXNlZCB0byBiZSBpbiBwZWljb2RlLmggYW5kIGlzCi0gICBub3cgaW4gcGVpZ2VuLmMuICBJdCB3aWxsIG5vdCBjb250cm9sIHRoZSBjb2RlIGluIHBlaWdlbi5jLiAgSWYKLSAgIGFueWJvZHkgd2FudHMgdG8gZ2V0IHRoaXMgd29ya2luZywgeW91IHdpbGwgbmVlZCB0byBmaXggdGhhdC4gICovCi0jZGVmaW5lIFBPV0VSUENfTEVfUEUKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQyIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAwIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkMyIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmlkYXRhJDQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQ1IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkNiIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMSB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnJlbG9jIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAxIH0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQwKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIEZJWE1FOgotICAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyBhbGxvY2F0ZSBhIHRvYyBzZWN0aW9uIChlYXJseSksIGFuZCBhdHRhY2ggCi0gICBpdCB0byB0aGUgbGFzdCBiZmQgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGF2b2lkcyB0aGUgcHJvYmxlbSBvZiBoYXZpbmcgYSB0b2MKLSAgIHdyaXR0ZW4gb3V0IGJlZm9yZSBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcwotICAgYSB0b2Mgc2VjdGlvbiBmb3IgZXZlcnkgZmlsZSwgYW5kIHJlY29yZHMgdGhlIGxhc3Qgb25lIHNlZW4uIFRoZXJlIGFyZQotICAgYXQgbGVhc3QgdHdvIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaDoKLSAgIDEuIFdlIGFsbG9jYXRlIHdob2xlIGJ1bmNoZXMgb2YgdG9jIHNlY3Rpb25zIHRoYXQgYXJlIGlnbm9yZWQsIGJ1dCBhdAotICAgICAgYXQgbGVhc3Qgd2Ugd2lsbCBub3QgYWxsb2NhdGUgYSB0b2MgaWYgbm8gLnRvYyBpcyBwcmVzZW50LgotICAgMi4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCBiZWluZyB0aGUgbGFzdCBiZmQgcmVhZCBuZWNlc3NhcmlseSBtZWFucwotICAgICAgdGhhdCB5b3UgYXJlIHRoZSBsYXN0IGJmZCBjbG9zZWQuCi0gICAzLiBEb2luZyBpdCBvbiBhICJzd2FwIGluIiBob29rIGRlcGVuZHMgb24gd2hlbiB0aGUgInN3YXAgaW4iIGlzIGNhbGxlZCwKLSAgICAgIGFuZCBob3cgb2Z0ZW4sIGV0Yy4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUgaGVyZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW4xOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgIT0gMCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAoaW4tPl9uLl9uX25hbWUsICIudG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBhYmZkICwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0gICAgICBpZiAocyAhPSBOVUxMKSAKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCi0JICBhYm9ydCgpOwotCX0KLQotICAgICAgLyogc2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBiZmRfb2ZfdG9jX293bmVyID0gYWJmZDsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyBib29sZWFuIHBwY19kb19sYXN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICpwcGNfZ2V0X2xhc3QgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2RvX2xhc3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQgPT0gYmZkX29mX3RvY19vd25lcikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZCAqCi1wcGNfZ2V0X2xhc3QoKQotewotICByZXR1cm4gYmZkX29mX3RvY19vd25lcjsKLX0KLQotLyogdGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgdG9jIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKLQotICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQotICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAotCi0gICBUaGlzIGlzIG90aGVyd2lzZSBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMgCi0gICBjb2ZmbGluay5jOl9iZmRfY29mZl9maW5hbF9saW5rKCkuIEl0IGlzIHNwZWNpZmljYWxseSBkaWZmZXJlbnQgb25seSAKLSAgIHdoZXJlIHRoZSBQT1dFUlBDX0xFX1BFIG1hY3JvIG1vZGlmaWVzIHRoZSBjb2RlLiBJdCBpcyBsZWZ0IGluIGFzIGEgCi0gICBwcmVjaXNlIGZvcm0gb2YgY29tbWVudC4ga3JrQGN5Z251cy5jb20KLSovCi0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLXBwY19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0KLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0jaWZkZWYgUE9XRVJQQ19MRV9QRQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1biAmJiAhcHBjX2RvX2xhc3Qoc3ViKSkKLSNlbHNlCi0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotI2VuZGlmCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgewotICAgIGJmZCogbGFzdF9vbmUgPSBwcGNfZ2V0X2xhc3QoKTsKLSAgICBpZiAobGFzdF9vbmUpCi0gICAgICB7Ci0JaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIGxhc3Rfb25lKSkKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgfQotICAgIGxhc3Rfb25lLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0MCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBieSBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTTsKLSNlbmRpZgotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAkJLyogbmFtZSBvciBjb2ZmLWFybS1saXR0bGUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIAotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAKLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0gIAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlX3RhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcnM2MDAwLmMgYi9iZmQvY29mZi1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4OTQwMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvcnM2MDAwLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2RlZmluZSBUQVJHRVRfTkFNRSAiYWl4Y29mZi1yczYwMDAiCi0jZGVmaW5lIFRBUkdFVF9TWU0gcnM2MDAwY29mZl92ZWMKLSNpbmNsdWRlICJ4Y29mZi10YXJnZXQuaCIKLQotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemVfZmlsZW5hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogV2UgdXNlIG91ciBvd24gdGRhdGEgdHlwZS4gIEl0cyBmaXJzdCBmaWVsZCBpcyB0aGUgQ09GRiB0ZGF0YSB0eXBlLAotICAgc28gdGhlIENPRkYgcm91dGluZXMgYXJlIGNvbXBhdGlibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID0KLSAgICAoKHN0cnVjdCB4Y29mZl90ZGF0YSAqKQotICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl90ZGF0YSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLSAgLyogV2Ugc2V0IGNwdXR5cGUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgbm90IGJlZW4KLSAgICAgaW5pdGlhbGl6ZWQuICAqLwotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSA9IC0xOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBOVUxMOwotICB4Y29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5kaWNlcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgWENPRkYgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX3RkYXRhICppeCwgKm94OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGl4ID0geGNvZmZfZGF0YSAoaWJmZCk7Ci0gIG94ID0geGNvZmZfZGF0YSAob2JmZCk7Ci0gIG94LT5mdWxsX2FvdXRoZHIgPSBpeC0+ZnVsbF9hb3V0aGRyOwotICBveC0+dG9jID0gaXgtPnRvYzsKLSAgaWYgKGl4LT5zbnRvYyA9PSAwKQotICAgIG94LT5zbnRvYyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbnRvYyk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0Jb3gtPnNudG9jID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c250b2MgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBpZiAoaXgtPnNuZW50cnkgPT0gMCkKLSAgICBveC0+c25lbnRyeSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbmVudHJ5KTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c25lbnRyeSA9IDA7Ci0gICAgICBlbHNlCi0Jb3gtPnNuZW50cnkgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBveC0+dGV4dF9hbGlnbl9wb3dlciA9IGl4LT50ZXh0X2FsaWduX3Bvd2VyOwotICBveC0+ZGF0YV9hbGlnbl9wb3dlciA9IGl4LT5kYXRhX2FsaWduX3Bvd2VyOwotICBveC0+bW9kdHlwZSA9IGl4LT5tb2R0eXBlOwotICBveC0+Y3B1dHlwZSA9IGl4LT5jcHV0eXBlOwotICBveC0+bWF4ZGF0YSA9IGl4LT5tYXhkYXRhOwotICBveC0+bWF4c3RhY2sgPSBpeC0+bWF4c3RhY2s7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJIGRvbid0IHRoaW5rIFhDT0ZGIHJlYWxseSBoYXMgYSBub3Rpb24gb2YgbG9jYWwgbGFiZWxzIGJhc2VkIG9uCi0gICBuYW1lLiAgVGhpcyB3aWxsIG1lYW4gdGhhdCBsZCAtWCBkb2Vzbid0IGFjdHVhbGx5IHN0cmlwIGFueXRoaW5nLgotICAgVGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMgbm90IGhhdmUgYSAtWCBvcHRpb24sIGFuZCBpdCBpZ25vcmVzIHRoZQotICAgLXggb3B0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0KLQotdm9pZAotX2JmZF94Y29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotCi0gIGlmKGV4dC0+ZS5lX25hbWVbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IAotCSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gICAgfQotCi0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOyAKLSAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7Ci0gIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOwotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfeGNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLQotICBpZihpbi0+X24uX25fbmFtZVswXSAhPSAwKQotICAgIHsKLSAgICAgIG1lbWNweShleHQtPmUuZV9uYW1lLCBpbi0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5fbi5fbl9uLl9uX29mZnNldCwgCi0JICAgICAgKGJmZF9ieXRlICopICBleHQtPmUuZS5lX29mZnNldCk7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdmFsdWUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fc2NsYXNzICwgZXh0LT5lX3NjbGFzcyk7Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9udW1hdXggLCBleHQtPmVfbnVtYXV4KTsKLSAgcmV0dXJuIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci19Ci0KLSNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgUFVUQllURSBiZmRfaF9wdXRfOAotI2RlZmluZSBHRVRXT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRIQUxGIGJmZF9oX2dldF8xNgotI2RlZmluZSBHRVRCWVRFIGJmZF9oX2dldF84Ci0KLXZvaWQKLV9iZmRfeGNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgICBpZiAoZXh0LT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0JICBpbi0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICBpbi0+eF9maWxlLnhfbi54X29mZnNldCA9IAotCSAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLQl9IGVsc2UgewotCSAgICBpZiAobnVtYXV4ID4gMSkKLQkgICAgICB7Ci0JCWlmIChpbmR4ID09IDApCi0JCSAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsCi0JCQkgIG51bWF1eCAqIHNpemVvZiAoQVVYRU5UKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGdvdG8gZW5kOwotCi0gICAgICAvKiBSUy82MDAwICJjc2VjdCIgYXV4ZW50cyAqLwotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX0hJREVYVDoKLSAgICAgIGlmIChpbmR4ICsgMSA9PSBudW1hdXgpCi0JewotCSAgaW4tPnhfY3NlY3QueF9zY25sZW4ubCA9IAotCSAgICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc2NubGVuKTsKLQkgIGluLT54X2NzZWN0LnhfcGFybWhhc2ggPSBiZmRfaF9nZXRfMzIgKGFiZmQsCi0JCQkJCQkgZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCSAgaW4tPnhfY3NlY3QueF9zbmhhc2ggICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25oYXNoKTsKLQkgIC8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICAgIGRlZmluZWQgYnkgc2hpZnRzLWFuZC1hbmRzLCB3aGljaCBhcmUgZXF1aXZhbGVudCBvbiBhbGwKLQkgICAgIGJ5dGUgb3JkZXJzLiAgKi8KLQkgIGluLT54X2NzZWN0Lnhfc210eXAgICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQkgIGluLT54X2NzZWN0Lnhfc21jbGFzICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtY2xhcyk7Ci0JICBpbi0+eF9jc2VjdC54X3N0YWIgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPnhfY3NlY3QueF9zdGFiKTsKLQkgIGluLT54X2NzZWN0Lnhfc25zdGFiICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3Nuc3RhYik7Ci0JICBnb3RvIGVuZDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19MRUFGU1RBVDoKLSAgICBjYXNlIENfSElEREVOOgotICAgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0JICBpbi0+eF9zY24ueF9zY25sZW4gPSBiZmRfaF9nZXRfMzIoYWJmZCwgCi0JCSAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pOwotCSAgaW4tPnhfc2NuLnhfbnJlbG9jID0gYmZkX2hfZ2V0XzE2KGFiZmQsIAotCQkgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbnJlbG9jKTsKLQkgIGluLT54X3Njbi54X25saW5ubyA9IGJmZF9oX2dldF8xNihhYmZkLCAKLQkJICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubyk7Ci0JICAvKiBQRSBkZWZpbmVzIHNvbWUgZXh0cmEgZmllbGRzOyB3ZSB6ZXJvIHRoZW0gb3V0IGZvcgotICAgICAgICAgICAgIHNhZmV0eS4gICovCi0JICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgIGluLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0KLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0gIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopCi0JICAgICAgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopCi0JICAgICAgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotICBpZiAoSVNGQ04odHlwZSkpIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikKLQkgICAgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKQotCSAgICBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKTsKLSAgfQotCi1lbmQ6IDsKLSAgLyogdGhlIHNlbWljb2xvbiBpcyBiZWNhdXNlIE1TVkMgZG9lc24ndCBsaWtlIGxhYmVscyBhdAotICAgICBlbmQgb2YgYmxvY2suICovCi0KLX0KLQotCi0KLXVuc2lnbmVkIGludAotX2JmZF94Y29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICAgKmFiZmQ7Ci0gICAgIFBUUiAJaW5wOwotICAgICBpbnQgICB0eXBlOwotICAgICBpbnQgICBjbGFzczsKLSAgICAgaW50ICAgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgICBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIHN3aXRjaCAoY2xhc3MpCi0gICAgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApCi0gICAgICB7Ci0gICAgICBQVVRXT1JEKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgUFVUV09SRChhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICBtZW1jcHkgKGV4dC0+eF9maWxlLnhfZm5hbWUsIGluLT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotICAgICAgfQotICAgIGdvdG8gZW5kOwotCi0gIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCi0gIGNhc2UgQ19FWFQ6Ci0gIGNhc2UgQ19ISURFWFQ6Ci0gICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKLSAgICAgIHsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3Njbmxlbi5sLGV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCwJZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25oYXNoLAlleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCS8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgYnl0ZSBvcmRlcnMuICAqLwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc210eXAsCWV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtY2xhcywJZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3N0YWIsCWV4dC0+eF9jc2VjdC54X3N0YWIpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25zdGFiLAlleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCWdvdG8gZW5kOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ19TVEFUOgotICBjYXNlIENfTEVBRlNUQVQ6Ci0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3Njbmxlbik7Ci0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25yZWxvYyk7Ci0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubyk7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBQVVRXT1JEKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0gIFBVVFdPUkQoYWJmZCwgaW4tPnhfc3ltLnhfdHZuZHggLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cik7Ci0gICAgICBQVVRXT1JEKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCwgCi0JICAgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOICh0eXBlKSkKLSAgICBQVVRXT1JEIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUsCi0JICAgICAoYmZkX2J5dGUgKikgIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgCi0JICAgICAgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyk7Ci0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLCAKLQkgICAgICAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKTsKLSAgICB9Ci0KLWVuZDoKLSAgcmV0dXJuIGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCk7Ci19Ci0KLQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORSAgICAgICAoKChiZmRfdm1hKTApIC0gMSkKLQotcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoNyksCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoOSksCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoMHhiKSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweGUpLAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweDEwKSwKLSAgRU1QVFlfSE9XVE8gKDB4MTEpLAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPICgwLCAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDY0LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9QT1MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICBNSU5VU19PTkUsICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBmaXJzdCB0d28gbGlrZSB0aGUgYWJvdmUgYnV0IGZvciAxNi1iaXQgcmVsb2NzLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2hvd3RvX3RhYmxlXzE2W10gPQotewotICAvKiBTdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgwLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9QT1NfMTYiLCAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLCBidXQgc3RvcmUgbmVnYXRpdmUgdmFsdWUuICAqLwotICBIT1dUTyAoMSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgLTIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX05FR18xNiIsICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMXzE2IiwgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICB9OwotICAKLXZvaWQKLV9iZmRfeGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMQotICAgICAgJiYgKGludGVybmFsLT5yX3R5cGUgCi0JICA8IHNpemVvZih4Y29mZl9ob3d0b190YWJsZV8xNikvc2l6ZW9mKHhjb2ZmX2hvd3RvX3RhYmxlXzE2WzBdKSkpCi0gICAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlXzE2ICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1yZWxvY19ob3d0b190eXBlICoKLV9iZmRfeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVsweGFdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVs4XTsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVsweDFjXTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0MCi0vKiBYQ09GRiBhcmNoaXZlIHN1cHBvcnQuICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNvZGUgd2FzIGJ5Ci0gICBEYW1vbiBBLiBQZXJtZXplbC4gIEl0IHdhcyBlbmhhbmNlZCB0byBwZXJtaXQgY3Jvc3Mgc3VwcG9ydCwgYW5kCi0gICB3cml0aW5nIGFyY2hpdmUgZmlsZXMsIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBYQ09GRiB1c2VzIGl0cyBvd24gYXJjaGl2ZSBmb3JtYXQuICBFdmVyeXRoaW5nIGlzIGhvb2tlZCB0b2dldGhlcgotICAgd2l0aCBmaWxlIG9mZnNldCBsaW5rcywgc28gaXQgaXMgcG9zc2libGUgdG8gcmFwaWRseSB1cGRhdGUgYW4KLSAgIGFyY2hpdmUgaW4gcGxhY2UuICBPZiBjb3Vyc2UsIHdlIGRvbid0IGRvIHRoYXQuICBBbiBYQ09GRiBhcmNoaXZlCi0gICBoYXMgYSByZWFsIGZpbGUgaGVhZGVyLCBub3QganVzdCBhbiBBUk1BRyBzdHJpbmcuICBUaGUgc3RydWN0dXJlIG9mCi0gICB0aGUgZmlsZSBoZWFkZXIgYW5kIG9mIGVhY2ggYXJjaGl2ZSBoZWFkZXIgYXBwZWFyIGJlbG93LgotCi0gICBBbiBYQ09GRiBhcmNoaXZlIGFsc28gaGFzIGEgbWVtYmVyIHRhYmxlLCB3aGljaCBpcyBhIGxpc3Qgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBhcmNoaXZlICh5b3UgY2FuIGdldCB0aGF0IGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgIGxpbmtlZCBsaXN0LCBidXQgeW91IGhhdmUgdG8gcmVhZCBhIGxvdCBtb3JlIG9mIHRoZSBmaWxlKS4gIFRoZQotICAgbWVtYmVyIHRhYmxlIGhhcyBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcwotICAgbm9ybWFsbHkgKGFuZCBwZXJoYXBzIG11c3QgYmUpIHRoZSBzZWNvbmQgdG8gbGFzdCBlbnRyeSBpbiB0aGUKLSAgIGFyY2hpdmUuICBUaGUgbWVtYmVyIHRhYmxlIGRhdGEgaXMgYWxtb3N0IHByaW50YWJsZSBBU0NJSS4gIEl0Ci0gICBzdGFydHMgd2l0aCBhIDEyIGNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZS4gIEZvciBlYWNoIGVudHJ5IGl0IGhhcyBhIDEyIGNoYXJhY3RlciBkZWNpbWFsCi0gICBzdHJpbmcgd2hpY2ggaXMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBvZiB0aGF0IG1lbWJlci4gIFRoZXNlCi0gICBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aGljaAotICAgYXJlIHRoZSBtZW1iZXIgbmFtZXMgZm9yIGVhY2ggZW50cnkuCi0KLSAgIEZpbmFsbHksIGFuIFhDT0ZGIGFyY2hpdmUgaGFzIGEgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgd2hhdAotICAgd2UgY2FsbCB0aGUgYXJtYXAuICBUaGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZQotICAgaGVhZGVyIHdpdGggYW4gZW1wdHkgbmFtZS4gIEl0IGlzIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKQotICAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgc3RhcnQgd2l0aCBhIGZvdXIgYnl0ZQotICAgYmluYXJ5IG51bWJlciB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5Ci0gICBhIHRoYXQgbWFueSBmb3VyIGJ5dGUgYmluYXJ5IG51bWJlcnM7IGVhY2ggaXMgdGhlIGZpbGUgb2Zmc2V0IG9mIGFuCi0gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gIFRoZXNlIG51bWJlcnMgYXJlIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgd2hpY2ggYXJlIHN5bWJvbCBuYW1lcy4KLQotICAgQUlYIDQuMyBpbnRyb2R1Y2VkIGEgbmV3IGFyY2hpdmUgZm9ybWF0IHdoaWNoIGNhbiBoYW5kbGUgbGFyZ2VyCi0gICBmaWxlcyBhbmQgYWxzbyAzMi0gYW5kIDY0LWJpdCBvYmplY3RzIGluIHRoZSBzYW1lIGFyY2hpdmUuICBUaGUKLSAgIHRoaW5ncyBzYWlkIGFib3ZlIHJlbWFpbiB0cnVlIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vdyBtb3JlIHRoYW4KLSAgIG9uZSBnbG9iYWwgc3ltYm9sIHRhYmxlLiAgVGhlIG9uZSBpcyB1c2VkIHRvIGluZGV4IDMyLWJpdCBvYmplY3RzLAotICAgdGhlIG90aGVyIGZvciA2NC1iaXQgb2JqZWN0cy4KLQotICAgVGhlIG5ldyBhcmNoaXZlcyAocmVjb2duaXphYmxlIGJ5IHRoZSBuZXcgQVJNQUcgc3RyaW5nKSBoYXMgbGFyZ2VyCi0gICBmaWVsZCBsZW5ndGhzIHNvIHRoYXQgd2UgY2Fubm90IHJlYWxseSBzaGFyZSBhbnkgY29kZS4gIEFsc28gd2UgaGF2ZQotICAgdG8gdGFrZSBjYXJlIHRoYXQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIHRoZSBuZXcgZm9ybSBvZiBhcmNoaXZlcwotICAgb24gQUlYIDQuMiBvciBlYXJsaWVyIHN5c3RlbXMuICAqLwotCi0vKiBYQ09GRiBhcmNoaXZlcyB1c2UgdGhpcyBhcyBhIG1hZ2ljIHN0cmluZy4gIE5vdGUgdGhhdCBib3RoIHN0cmluZ3MKLSAgIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKi8KLQotI2RlZmluZSBYQ09GRkFSTUFHICAgICI8YWlhZmY+XDAxMiIKLSNkZWZpbmUgWENPRkZBUk1BR0JJRyAiPGJpZ2FmPlwwMTIiCi0jZGVmaW5lIFNYQ09GRkFSTUFHICAgOAotCi0vKiBUaGlzIHRlcm1pbmF0ZXMgYW4gWENPRkYgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gICovCi0KLSNkZWZpbmUgWENPRkZBUkZNQUcgImBcMDEyIgotI2RlZmluZSBTWENPRkZBUkZNQUcgMgotCi0vKiBYQ09GRiBhcmNoaXZlcyBzdGFydCB3aXRoIHRoaXMgKHByaW50YWJsZSkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyCi17Ci0gIC8qIE1hZ2ljIHN0cmluZy4gICovCi0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbWVtYmVyIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzEyXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSICg1ICogMTIgKyBTWENPRkZBUk1BRykKLQotLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGJpZyBhcmNoaXZlIGZvcm1hdC4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcl9iaWcKLXsKLSAgLyogTWFnaWMgc3RyaW5nLiAgKi8KLSAgY2hhciBtYWdpY1tTWENPRkZBUk1BR107Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBtZW1iZXIgdGFibGUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbWVtb2ZmWzIwXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgZm9yIDMyLWJpdCBvYmplY3RzIChkZWNpbWFsIEFTQ0lJCi0gICAgIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGZvciA2NC1iaXQgb2JqZWN0cyAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBzeW1vZmY2NFsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMjBdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzIwXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyAoNiAqIDIwICsgU1hDT0ZGQVJNQUcpCi0KLQotLyogRWFjaCBYQ09GRiBhcmNoaXZlIG1lbWJlciBzdGFydHMgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHIKLXsKLSAgLyogRmlsZSBzaXplIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzaXplWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBuZXh0IGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG5leHRvZmZbMTJdOwotCi0gIC8qIEZpbGUgb2Zmc2V0IG9mIHByZXZpb3VzIGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHByZXZvZmZbMTJdOwotCi0gIC8qIEZpbGUgbXRpbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZGF0ZVsxMl07Ci0KLSAgLyogRmlsZSBVSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgdWlkWzEyXTsKLQotICAvKiBGaWxlIEdJRCAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBnaWRbMTJdOwotCi0gIC8qIEZpbGUgbW9kZSAob2N0YWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbW9kZVsxMl07Ci0KLSAgLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuYW1sZW5bNF07Ci0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZS4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIG5hbWxlbiBmaWVsZC4gIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMKLSAgICAgb2RkLCB0aGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIFRoZSBuYW1lIGFuZCBvcHRpb25hbAotICAgICBudWxsIGJ5dGUgYXJlIGZvbGxvd2VkIGJ5IFhDT0ZGQVJGTUFHLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4KLSAgICAgbmFtbGVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBmb2xsb3c7IHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgaXMgZ2l2ZW4gaW4gdGhlIHNpemUgZmllbGQuICAqLwotfTsKLQotI2RlZmluZSBTSVpFT0ZfQVJfSERSICg3ICogMTIgKyA0KQotCi0vKiBUaGUgZXF1aXZhbGVudCBmb3IgdGhlIGJpZyBhcmNoaXZlIGZvcm1hdC4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnCi17Ci0gIC8qIEZpbGUgc2l6ZSBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgc2l6ZVsyMF07Ci0KLSAgLyogRmlsZSBvZmZzZXQgb2YgbmV4dCBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuZXh0b2ZmWzIwXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBwcmV2aW91cyBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBwcmV2b2ZmWzIwXTsKLQotICAvKiBGaWxlIG10aW1lIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGRhdGVbMTJdOwotCi0gIC8qIEZpbGUgVUlEIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHVpZFsxMl07Ci0KLSAgLyogRmlsZSBHSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZ2lkWzEyXTsKLQotICAvKiBGaWxlIG1vZGUgKG9jdGFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1vZGVbMTJdOwotCi0gIC8qIExlbmd0aCBvZiBmaWxlIG5hbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbmFtbGVuWzRdOwotCi0gIC8qIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgICBuYW1lIGlzIGdpdmVuIGluIHRoZSBuYW1sZW4gZmllbGQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzCi0gICAgIG9kZCwgdGhlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGUgbmFtZSBhbmQgb3B0aW9uYWwKLSAgICAgbnVsbCBieXRlIGFyZSBmb2xsb3dlZCBieSBYQ09GRkFSRk1BRywgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCi0gICAgIG5hbWxlbi4gIFRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgZm9sbG93OyB0aGUgbnVtYmVyIG9mCi0gICAgIGJ5dGVzIGlzIGdpdmVuIGluIHRoZSBzaXplIGZpZWxkLiAgKi8KLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0hEUl9CSUcgKDMgKiAyMCArIDQgKiAxMiArIDQpCi0KLQotLyogV2Ugb2Z0ZW4gaGF2ZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBvbGQgYW5kIGJpZyBmaWxlIGZvcm1hdC4KLSAgIE1ha2UgaXQgYSBiaXQgY2xlYW5lci4gIFdlIGNhbiB1c2UgYHhjb2ZmX2FyZGF0YScgaGVyZSBiZWNhdXNlIHRoZQotICAgYGhkcicgbWVtYmVyIGhhcyB0aGUgc2FtZSBzaXplIGFuZCBwb3NpdGlvbiBpbiBib3RoIGZvcm1hdHMuICAqLwotI2RlZmluZSB4Y29mZl9iaWdfZm9ybWF0X3AoYWJmZCkgXAotICAoeGNvZmZfYXJkYXRhIChhYmZkKS0+bWFnaWNbMV0gPT0gJ2InKQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2ZpbGVfaGRyIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUKLSAgIGFydGRhdGEgc3RydWN0dXJlLiAgU2ltaWxhciBmb3IgdGhlIGJpZyBhcmNoaXZlLiAgKi8KLSNkZWZpbmUgeGNvZmZfYXJkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhKQotI2RlZmluZSB4Y29mZl9hcmRhdGFfYmlnKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHJfYmlnICopIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9oZHIgaW4gdGhlIGFyZWx0X2RhdGEgZmllbGQgb2YgYW4KLSAgIGFyY2hpdmUgZWxlbWVudC4gIFNpbWlsYXIgZm9yIHRoZSBiaWcgYXJjaGl2ZS4gICovCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSAoKGJmZCktPmFyZWx0X2RhdGEpKQotI2RlZmluZSBhcmNoX3hoZHIoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBhcmNoX2VsdGRhdGEgKGJmZCktPmFyY2hfaGVhZGVyKQotI2RlZmluZSBhcmNoX3hoZHJfYmlnKGJmZCkgXAotICAoKHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnICopIGFyY2hfZWx0ZGF0YSAoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLS8qIFJlYWQgaW4gdGhlIGFybWFwIG9mIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIG9mZjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgYmZkX3NpemVfdHlwZSBzejsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqY2VuZDsKLSAgdW5zaWduZWQgaW50IGMsIGk7Ci0gIGNhcnN5bSAqYXJzeW07Ci0gIGJmZF9ieXRlICpwOwotCi0gIGlmICh4Y29mZl9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfYmlnX2Zvcm1hdF9wIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGZvciB0aGUgb2xkIGZvcm1hdC4gICovCi0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLQotICAgICAgb2ZmID0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFiZmQpLT5zeW1vZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBpZiAob2ZmID09IDApCi0JewotCSAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2ZmLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgc3RhcnRzIHdpdGggYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2tpcCB0aGUgbmFtZSAobm9ybWFsbHkgZW1wdHkpLiAgKi8KLSAgICAgIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKChuYW1sZW4gKyAxKSAmIH4xKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeiA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBmb3IgdGhlIG5ldyBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IHhjb2ZmX2FyX2hkcl9iaWcgaGRyOwotCi0gICAgICBvZmYgPSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YV9iaWcgKGFiZmQpLT5zeW1vZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBpZiAob2ZmID09IDApCi0JewotCSAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2ZmLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgc3RhcnRzIHdpdGggYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSX0JJRywgMSwgYWJmZCkKLQkgICE9IFNJWkVPRl9BUl9IRFJfQklHKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2tpcCB0aGUgbmFtZSAobm9ybWFsbHkgZW1wdHkpLiAgKi8KLSAgICAgIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKChuYW1sZW4gKyAxKSAmIH4xKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBYWFggVGhpcyBhY3R1YWxseSBoYXMgdG8gYmUgYSBjYWxsIHRvIHN0cnRvbGwgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGggbW9yZQotCSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIHN6ID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZS4gICovCi0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3opOwotICBpZiAoY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIHN6LCBhYmZkKSAhPSBzeikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIGZvdXIgYnl0ZSBjb3VudC4gICovCi0gIGMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzKTsKLQotICBpZiAoYyAqIDQgPj0gc3opCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gKChjYXJzeW0gKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFmdGVyIHRoZSBjb3VudCBjb21lcyBhIGxpc3Qgb2YgZm91ciBieXRlIGZpbGUgb2Zmc2V0cy4gICovCi0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMsIHAgPSBjb250ZW50cyArIDQ7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IDQpCi0gICAgYXJzeW0tPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQotICAvKiBBZnRlciB0aGUgZmlsZSBvZmZzZXRzIGNvbWUgbnVsbCB0ZXJtaW5hdGVkIHN5bWJvbCBuYW1lcy4gICovCi0gIGNlbmQgPSBjb250ZW50cyArIHN6OwotICBmb3IgKGkgPSAwLCBhcnN5bSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICAgICAgIGkgPCBjOwotICAgICAgICsraSwgKythcnN5bSwgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMSkKLSAgICB7Ci0gICAgICBpZiAocCA+PSBjZW5kKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGFyc3ltLT5uYW1lID0gKGNoYXIgKikgcDsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCA9IGM7Ci0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiB0aGlzIGlzIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfeGNvZmZfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbWFnaWMsIFNYQ09GRkFSTUFHLCAxLCBhYmZkKSAhPSBTWENPRkZBUk1BRykKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAgKG1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRykgIT0gMAotICAgICAgJiYgc3RybmNtcCAobWFnaWMsIFhDT0ZGQVJNQUdCSUcsIFNYQ09GRkFSTUFHKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBzZXR0aW5nIGJmZF9hcmRhdGEoYWJmZCkgaGVyZSwgYnV0IHNpbmNlIGJmZF9hcmRhdGEKLSAgICAgaW52b2x2ZXMgYSBjYXN0LCB3ZSBjYW4ndCBkbyBpdCBhcyB0aGUgbGVmdCBvcGVyYW5kIG9mCi0gICAgIGFzc2lnbm1lbnQuICAqLwotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPQotICAgIChzdHJ1Y3QgYXJ0ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IChzdHJ1Y3QgYXJ0ZGF0YSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0KLSAgLyogTm93IGhhbmRsZSB0aGUgdHdvIGZvcm1hdHMuICAqLwotICBpZiAobWFnaWNbMV0gIT0gJ2InKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIG9sZCBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGhkcjsKLQotICAgICAgLyogQ29weSBvdmVyIHRoZSBtYWdpYyBzdHJpbmcuICAqLwotICAgICAgbWVtY3B5IChoZHIubWFnaWMsIG1hZ2ljLCBTWENPRkZBUk1BRyk7Ci0KLSAgICAgIC8qIE5vdyByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlIGhlYWRlci4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIubWVtb2ZmLCBTSVpFT0ZfQVJfRklMRV9IRFIgLSBTWENPRkZBUk1BRywgMSwKLQkJICAgIGFiZmQpICE9IFNJWkVPRl9BUl9GSUxFX0hEUiAtIFNYQ09GRkFSTUFHKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBzdHJ0b2wgKGhkci5maXJzdG1lbW9mZiwKLQkJCQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gICAgICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhLCAmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIG5ldyBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyX2JpZyBoZHI7Ci0KLSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbWFnaWMgc3RyaW5nLiAgKi8KLSAgICAgIG1lbWNweSAoaGRyLm1hZ2ljLCBtYWdpYywgU1hDT0ZGQVJNQUcpOwotCi0gICAgICAvKiBOb3cgcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLm1lbW9mZiwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyAtIFNYQ09GRkFSTUFHLCAxLAotCQkgICAgYWJmZCkgIT0gU0laRU9GX0FSX0ZJTEVfSERSX0JJRyAtIFNYQ09GRkFSTUFHKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFhYWCBUaGlzIGFjdHVhbGx5IGhhcyB0byBiZSBhIGNhbGwgdG8gc3RydG9sbCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGQgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aCBtb3JlCi0JIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IHN0cnRvbCAoaGRyLmZpcnN0bWVtb2ZmLAotCQkJCQkJICAgICAgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyk7Ci0gICAgICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhLCAmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFJfQklHKTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF94Y29mZl9zbHVycF9hcm1hcCAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IChzdHJ1Y3QgYXJ0ZGF0YSAqKSBOVUxMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBSZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotUFRSCi1fYmZkX3hjb2ZmX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNpemVfdCBuYW1sZW47Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgeGNvZmZfYmlnX2Zvcm1hdF9wIChhYmZkKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUikKLQl7Ci0JICBmcmVlIChyZXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBoZHJwID0gKHN0cnVjdCB4Y29mZl9hcl9oZHIgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkJU0laRU9GX0FSX0hEUiArIG5hbWxlbiArIDEpOwotICAgICAgaWYgKGhkcnAgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChyZXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgbWVtY3B5IChoZHJwLCAmaGRyLCBTSVpFT0ZfQVJfSERSKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFIsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuKQotCXsKLQkgIGZyZWUgKHJldCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICAoKGNoYXIgKikgaGRycClbU0laRU9GX0FSX0hEUiArIG5hbWxlbl0gPSAnXDAnOwotCi0gICAgICByZXQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRycDsKLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcmV0LT5maWxlbmFtZSA9IChjaGFyICopIGhkcnAgKyBTSVpFT0ZfQVJfSERSOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnIGhkcjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnICpoZHJwOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFJfQklHLCAxLCBhYmZkKQotCSAgIT0gU0laRU9GX0FSX0hEUl9CSUcpCi0JewotCSAgZnJlZSAocmV0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgaGRycCA9IChzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCQkgICAgU0laRU9GX0FSX0hEUl9CSUcKLQkJCQkJCSAgICArIG5hbWxlbiArIDEpOwotICAgICAgaWYgKGhkcnAgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChyZXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgbWVtY3B5IChoZHJwLCAmaGRyLCBTSVpFT0ZfQVJfSERSX0JJRyk7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChjaGFyICopIGhkcnAgKyBTSVpFT0ZfQVJfSERSX0JJRywgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4pCi0JewotCSAgZnJlZSAocmV0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgICgoY2hhciAqKSBoZHJwKVtTSVpFT0ZfQVJfSERSX0JJRyArIG5hbWxlbl0gPSAnXDAnOwotCi0gICAgICByZXQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRycDsKLSAgICAgIC8qIFhYWCBUaGlzIGFjdHVhbGx5IGhhcyB0byBiZSBhIGNhbGwgdG8gc3RydG9sbCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGQgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aCBtb3JlCi0JIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgICAgcmV0LT5wYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICByZXQtPmZpbGVuYW1lID0gKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFJfQklHOwotICAgIH0KLQotICAvKiBTa2lwIG92ZXIgdGhlIFhDT0ZGQVJGTUFHIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKG5hbWxlbiAmIDEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBPcGVuIHRoZSBuZXh0IGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLWJmZCAqCi1fYmZkX3hjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYXJjaGl2ZSkpCi0gICAgewotICAgICAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotCWZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gICAgICBlbHNlCi0JZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHIgKGxhc3RfZmlsZSktPm5leHRvZmYsIChjaGFyICoqKSBOVUxMLAotCQkJICAgIDEwKTsKLQotICAgICAgaWYgKGZpbGVzdGFydCA9PSAwCi0JICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5tZW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApCi0JICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGFzdF9maWxlID09IE5VTEwpCi0JZmlsZXN0YXJ0ID0gYmZkX2FyZGF0YSAoYXJjaGl2ZSktPmZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgICAgIGVsc2UKLQkvKiBYWFggVGhlc2UgYWN0dWFsbHkgaGF2ZSB0byBiZSBhIGNhbGxzIHRvIHN0cnRvbGwgKGF0IGxlYXN0Ci0JICAgb24gMzItYml0IG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kCi0JICAgdGhlcmUgbnVtYmVycyB3aXRoIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0JZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHJfYmlnIChsYXN0X2ZpbGUpLT5uZXh0b2ZmLCAoY2hhciAqKikgTlVMTCwKLQkJCSAgICAxMCk7Ci0KLSAgICAgIC8qIFhYWCBUaGVzZSBhY3R1YWxseSBoYXZlIHRvIGJlIGNhbGxzIHRvIHN0cnRvbGwgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGggbW9yZQotCSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIGlmIChmaWxlc3RhcnQgPT0gMAotCSAgfHwgZmlsZXN0YXJ0ID09IHN0cnRvbCAoeGNvZmZfYXJkYXRhX2JpZyAoYXJjaGl2ZSktPm1lbW9mZiwKLQkJCQkgIChjaGFyICoqKSBOVUxMLCAxMCkKLQkgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YV9iaWcgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOwotfQotCi0vKiBTdGF0IGFuIGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLWludAotX2JmZF94Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnM7Ci17Ci0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfYmlnX2Zvcm1hdF9wIChhYmZkKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICpoZHJwID0gYXJjaF94aGRyIChhYmZkKTsKLQotICAgICAgcy0+c3RfbXRpbWUgPSBzdHJ0b2wgKGhkcnAtPmRhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBzLT5zdF91aWQgPSBzdHJ0b2wgKGhkcnAtPnVpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIHMtPnN0X2dpZCA9IHN0cnRvbCAoaGRycC0+Z2lkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcy0+c3RfbW9kZSA9IHN0cnRvbCAoaGRycC0+bW9kZSwgKGNoYXIgKiopIE5VTEwsIDgpOwotICAgICAgcy0+c3Rfc2l6ZSA9IGFyY2hfZWx0ZGF0YSAoYWJmZCktPnBhcnNlZF9zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnICpoZHJwID0gYXJjaF94aGRyX2JpZyAoYWJmZCk7Ci0KLSAgICAgIHMtPnN0X210aW1lID0gc3RydG9sIChoZHJwLT5kYXRlLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcy0+c3RfdWlkID0gc3RydG9sIChoZHJwLT51aWQsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBzLT5zdF9naWQgPSBzdHJ0b2wgKGhkcnAtPmdpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIHMtPnN0X21vZGUgPSBzdHJ0b2wgKGhkcnAtPm1vZGUsIChjaGFyICoqKSBOVUxMLCA4KTsKLSAgICAgIHMtPnN0X3NpemUgPSBhcmNoX2VsdGRhdGEgKGFiZmQpLT5wYXJzZWRfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vcm1hbGl6ZSBhIGZpbGUgbmFtZSBmb3IgaW5jbHVzaW9uIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemVfZmlsZW5hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFybWFwLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJtYXBfb2xkIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICBiZmQgKnN1YjsKLSAgZmlsZV9wdHIgZmlsZW9mZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgbWVtc2V0ICgmaGRyLCAwLCBzaXplb2YgaGRyKTsKLSAgc3ByaW50ZiAoaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDQgKyBvcmxfY291bnQgKiA0ICsgc3RyaWR4KSk7Ci0gIHNwcmludGYgKGhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKLSAgbWVtY3B5IChoZHIucHJldm9mZiwgeGNvZmZfYXJkYXRhIChhYmZkKS0+bWVtb2ZmLCAxMik7Ci0gIHNwcmludGYgKGhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZoZHI7IHAgPCAoY2hhciAqKSAmaGRyICsgU0laRU9GX0FSX0hEUjsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgYmZkX3dyaXRlIChYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKSAhPSBTWENPRkZBUkZNQUcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgb3JsX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgZmlsZW9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgaSA9IDA7Ci0gIHdoaWxlIChzdWIgIT0gTlVMTCAmJiBpIDwgb3JsX2NvdW50KQotICAgIHsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2ldKS5wb3MpID09IHN1YikKLQl7Ci0JICBiZmRfaF9wdXRfMzIgKGFiZmQsIGZpbGVvZmYsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsraTsKLQl9Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSk7Ci0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLSAgICAgIGZpbGVvZmYgKz0gKFNJWkVPRl9BUl9IRFIKLQkJICArIG5hbWxlbgotCQkgICsgU1hDT0ZGQVJGTUFHCi0JCSAgKyBhcmVsdF9zaXplIChzdWIpKTsKLSAgICAgIGZpbGVvZmYgPSAoZmlsZW9mZiArIDEpICZ+IDE7Ci0gICAgICBzdWIgPSBzdWItPm5leHQ7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9ICptYXBbaV0ubmFtZTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChzdHJpZHggJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcm1hcF9iaWcgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyBoZHI7Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICBiZmQgKnN1YjsKLSAgZmlsZV9wdHIgZmlsZW9mZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgbWVtc2V0ICgmaGRyLCAwLCBzaXplb2YgaGRyKTsKLSAgLyogWFhYIFRoaXMgY2FsbCBhY3R1YWxseSBzaG91bGQgdXNlICVsbGQgKGF0IGxlYXN0IG9uIDMyLWJpdAotICAgICBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLSAgICAgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgc3ByaW50ZiAoaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDQgKyBvcmxfY291bnQgKiA0ICsgc3RyaWR4KSk7Ci0gIHNwcmludGYgKGhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKLSAgbWVtY3B5IChoZHIucHJldm9mZiwgeGNvZmZfYXJkYXRhIChhYmZkKS0+bWVtb2ZmLCAxMik7Ci0gIHNwcmludGYgKGhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZoZHI7IHAgPCAoY2hhciAqKSAmaGRyICsgU0laRU9GX0FSX0hEUl9CSUc7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFJfQklHLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSX0JJRwotICAgICAgfHwgYmZkX3dyaXRlIChYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKSAhPSBTWENPRkZBUkZNQUcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgb3JsX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgZmlsZW9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUl9CSUc7Ci0gIGkgPSAwOwotICB3aGlsZSAoc3ViICE9IE5VTEwgJiYgaSA8IG9ybF9jb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtpXSkucG9zKSA9PSBzdWIpCi0JewotCSAgYmZkX2hfcHV0XzMyIChhYmZkLCBmaWxlb2ZmLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICArK2k7Ci0JfQotICAgICAgbmFtbGVuID0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpOwotICAgICAgbmFtbGVuID0gKG5hbWxlbiArIDEpICZ+IDE7Ci0gICAgICBmaWxlb2ZmICs9IChTSVpFT0ZfQVJfSERSX0JJRwotCQkgICsgbmFtbGVuCi0JCSAgKyBTWENPRkZBUkZNQUcKLQkJICArIGFyZWx0X3NpemUgKHN1YikpOwotICAgICAgZmlsZW9mZiA9IChmaWxlb2ZmICsgMSkgJn4gMTsKLSAgICAgIHN1YiA9IHN1Yi0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG9ybF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICBuYW1lID0gKm1hcFtpXS5uYW1lOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHN0cmlkeCAmIDEpICE9IDApCi0gICAgewotICAgICAgY2hhciBiOwotCi0gICAgICBiID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF94Y29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYWJmZCkpCi0gICAgcmV0dXJuIHhjb2ZmX3dyaXRlX2FybWFwX29sZCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCk7Ci0gIGVsc2UKLSAgICByZXR1cm4geGNvZmZfd3JpdGVfYXJtYXBfYmlnIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFyY2hpdmUuICBXZSBhbHdheXMgd3JpdGUgYW4gZW50aXJlIGFyY2hpdmUsCi0gICByYXRoZXIgdGhhbiBmdXNzaW5nIHdpdGggdGhlIGZyZWVsaXN0IGFuZCBzbyBmb3J0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzX29sZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgZmhkcjsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgdG90YWxfbmFtbGVuOwotICBmaWxlX3B0ciAqb2Zmc2V0czsKLSAgYm9vbGVhbiBtYWtlbWFwOwotICBib29sZWFuIGhhc29iamVjdHM7Ci0gIGZpbGVfcHRyIHByZXZvZmYsIG5leHRvZmY7Ci0gIGJmZCAqc3ViOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBhaGRyOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgZGVjYnVmWzEzXTsKLQotICBtZW1zZXQgKCZmaGRyLCAwLCBzaXplb2YgZmhkcik7Ci0gIHN0cm5jcHkgKGZoZHIubWFnaWMsIFhDT0ZGQVJNQUcsIFNYQ09GRkFSTUFHKTsKLSAgc3ByaW50ZiAoZmhkci5maXJzdG1lbW9mZiwgIiVkIiwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgc3ByaW50ZiAoZmhkci5mcmVlb2ZmLCAiJWQiLCAwKTsKLQotICBjb3VudCA9IDA7Ci0gIHRvdGFsX25hbWxlbiA9IDA7Ci0gIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0KQotICAgIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICB0b3RhbF9uYW1sZW4gKz0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpICsgMTsKLSAgICB9Ci0gIG9mZnNldHMgPSAoZmlsZV9wdHIgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoZmlsZV9wdHIpKTsKLSAgaWYgKG9mZnNldHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBTSVpFT0ZfQVJfRklMRV9IRFIsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFiZmQpOwotICBoYXNvYmplY3RzID0gZmFsc2U7Ci0gIHByZXZvZmYgPSAwOwotICBuZXh0b2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZCwgaSA9IDA7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmFoZHJwOwotICAgICAgYmZkX3NpemVfdHlwZSByZW1haW5pbmc7Ci0KLSAgICAgIGlmIChtYWtlbWFwICYmICEgaGFzb2JqZWN0cykKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoc3ViLCBiZmRfb2JqZWN0KSkKLQkgICAgaGFzb2JqZWN0cyA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gbm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLQotICAgICAgaWYgKHN1Yi0+YXJlbHRfZGF0YSAhPSBOVUxMKQotCWFoZHJwID0gYXJjaF94aGRyIChzdWIpOwotICAgICAgZWxzZQotCWFoZHJwID0gTlVMTDsKLQotICAgICAgaWYgKGFoZHJwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHN0YXQgczsKLQotCSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotCSAgYWhkcnAgPSAmYWhkcjsKLQkgIGlmIChzdGF0IChiZmRfZ2V0X2ZpbGVuYW1lIChzdWIpLCAmcykgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHNwcmludGYgKGFoZHJwLT5zaXplLCAiJWxkIiwgKGxvbmcpIHMuc3Rfc2l6ZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+ZGF0ZSwgIiVsZCIsIChsb25nKSBzLnN0X210aW1lKTsKLQkgIHNwcmludGYgKGFoZHJwLT51aWQsICIlbGQiLCAobG9uZykgcy5zdF91aWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmdpZCwgIiVsZCIsIChsb25nKSBzLnN0X2dpZCk7Ci0JICBzcHJpbnRmIChhaGRycC0+bW9kZSwgIiVvIiwgKHVuc2lnbmVkIGludCkgcy5zdF9tb2RlKTsKLQotCSAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ViLT5hcmVsdF9kYXRhID0gYmZkX2FsbG9jIChzdWIsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGFyY2hfZWx0ZGF0YSAoc3ViKS0+cGFyc2VkX3NpemUgPSBzLnN0X3NpemU7Ci0JfQotCi0gICAgICBzcHJpbnRmIChhaGRycC0+cHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgICAgIHNwcmludGYgKGFoZHJwLT5uYW1sZW4sICIlbGQiLCAobG9uZykgbmFtbGVuKTsKLQotICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyBvZGQsIHdlIHdyaXRlIG91dCB0aGUgbnVsbCBieXRlCi0gICAgICAgICBhZnRlciB0aGUgbmFtZSBhcyB3ZWxsLiAgKi8KLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotCi0gICAgICByZW1haW5pbmcgPSBhcmVsdF9zaXplIChzdWIpOwotICAgICAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICAgICAgKyBuYW1sZW4KLQkgICAgICArIFNYQ09GRkFSRk1BRwotCSAgICAgICsgcmVtYWluaW5nKTsKLQotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotCi0gICAgICBvZmZzZXRzW2ldID0gbmV4dG9mZjsKLQotICAgICAgcHJldm9mZiA9IG5leHRvZmY7Ci0gICAgICBuZXh0b2ZmICs9IHNpemUgKyAoc2l6ZSAmIDEpOwotCi0gICAgICBzcHJpbnRmIChhaGRycC0+bmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICAgICAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgICAgIGZvciAocCA9IChjaGFyICopIGFoZHJwOyBwIDwgKGNoYXIgKikgYWhkcnAgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0JaWYgKCpwID09ICdcMCcpCi0JICAqcCA9ICcgJzsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYWhkcnAsIDEsIFNJWkVPRl9BUl9IRFIsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4KLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCi0JICAgICAgIT0gU1hDT0ZGQVJGTUFHKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoc3ViLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGFtdDsKLQkgIGJmZF9ieXRlIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotCi0JICBhbXQgPSBzaXplb2YgYnVmZmVyOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIDEsIGFtdCwgc3ViKSAhPSBhbXQKLQkgICAgICB8fCBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgYW10LCBhYmZkKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotCi0gICAgICBpZiAoKHNpemUgJiAxKSAhPSAwKQotCXsKLQkgIGJmZF9ieXRlIGI7Ci0KLQkgIGIgPSAnXDAnOwotCSAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHNwcmludGYgKGZoZHIubGFzdG1lbW9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIG1lbWJlciB0YWJsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICBzcHJpbnRmIChmaGRyLm1lbW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0gIHNwcmludGYgKGFoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoMTIgKyBjb3VudCAqIDEyICsgdG90YWxfbmFtbGVuKSk7Ci0gIHNwcmludGYgKGFoZHIucHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgc3ByaW50ZiAoYWhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICBzaXplID0gKFNJWkVPRl9BUl9IRFIKLQkgICsgMTIKLQkgICsgY291bnQgKiAxMgotCSAgKyB0b3RhbF9uYW1sZW4KLQkgICsgU1hDT0ZGQVJGTUFHKTsKLQotICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmFoZHI7IHAgPCAoY2hhciAqKSAmYWhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZhaGRyLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgIT0gU1hDT0ZGQVJGTUFHKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIGNvdW50KTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgb2Zmc2V0c1tpXSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZSAmIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJtYXAsIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQotICBpZiAoISBtYWtlbWFwIHx8ICEgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVkIiwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gICAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IChQVFIpICZmaGRyOwotICAgICAgaWYgKCEgX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFyY2hpdmUgZmlsZSBoZWFkZXIuICAqLwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZmaGRyOyBwIDwgKGNoYXIgKikgJmZoZHIgKyBTSVpFT0ZfQVJfRklMRV9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJmZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkgIT0KLQkgIFNJWkVPRl9BUl9GSUxFX0hEUikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50c19iaWcgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyX2JpZyBmaGRyOwotICBzaXplX3QgY291bnQ7Ci0gIHNpemVfdCB0b3RhbF9uYW1sZW47Ci0gIGZpbGVfcHRyICpvZmZzZXRzOwotICBib29sZWFuIG1ha2VtYXA7Ci0gIGJvb2xlYW4gaGFzb2JqZWN0czsKLSAgZmlsZV9wdHIgcHJldm9mZiwgbmV4dG9mZjsKLSAgYmZkICpzdWI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyBhaGRyOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgZGVjYnVmWzEzXTsKLQotICBtZW1zZXQgKCZmaGRyLCAwLCBzaXplb2YgZmhkcik7Ci0gIHN0cm5jcHkgKGZoZHIubWFnaWMsIFhDT0ZGQVJNQUdCSUcsIFNYQ09GRkFSTUFHKTsKLSAgc3ByaW50ZiAoZmhkci5maXJzdG1lbW9mZiwgIiVkIiwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyk7Ci0gIHNwcmludGYgKGZoZHIuZnJlZW9mZiwgIiVkIiwgMCk7Ci0KLSAgY291bnQgPSAwOwotICB0b3RhbF9uYW1sZW4gPSAwOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICArK2NvdW50OwotICAgICAgdG90YWxfbmFtbGVuICs9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKSArIDE7Ci0gICAgfQotICBvZmZzZXRzID0gKGZpbGVfcHRyICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGZpbGVfcHRyKSk7Ci0gIGlmIChvZmZzZXRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1ha2VtYXAgPSBiZmRfaGFzX21hcCAoYWJmZCk7Ci0gIGhhc29iamVjdHMgPSBmYWxzZTsKLSAgcHJldm9mZiA9IDA7Ci0gIG5leHRvZmYgPSBTSVpFT0ZfQVJfRklMRV9IRFJfQklHOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZCwgaSA9IDA7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnICphaGRycDsKLSAgICAgIGJmZF9zaXplX3R5cGUgcmVtYWluaW5nOwotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHN1YiwgYmZkX29iamVjdCkpCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQlhaGRycCA9IGFyY2hfeGhkcl9iaWcgKHN1Yik7Ci0gICAgICBlbHNlCi0JYWhkcnAgPSBOVUxMOwotCi0gICAgICBpZiAoYWhkcnAgPT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3Qgc3RhdCBzOwotCi0JICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0JICBhaGRycCA9ICZhaGRyOwotCSAgLyogWFhYIFRoaXMgc2hvdWxkIGFjdHVhbGx5IGJlIGEgY2FsbCB0byBzdGF0NjQgKGF0IGxlYXN0IG9uCi0JICAgICAzMi1iaXQgbWFjaGluZXMpLiAgKi8KLQkgIGlmIChzdGF0IChiZmRfZ2V0X2ZpbGVuYW1lIChzdWIpLCAmcykgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFhYWCBUaGlzIGNhbGwgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLQkgICAgIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aAotCSAgICAgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLQkgIHNwcmludGYgKGFoZHJwLT5zaXplLCAiJWxkIiwgKGxvbmcpIHMuc3Rfc2l6ZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+ZGF0ZSwgIiVsZCIsIChsb25nKSBzLnN0X210aW1lKTsKLQkgIHNwcmludGYgKGFoZHJwLT51aWQsICIlbGQiLCAobG9uZykgcy5zdF91aWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmdpZCwgIiVsZCIsIChsb25nKSBzLnN0X2dpZCk7Ci0JICBzcHJpbnRmIChhaGRycC0+bW9kZSwgIiVvIiwgKHVuc2lnbmVkIGludCkgcy5zdF9tb2RlKTsKLQotCSAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ViLT5hcmVsdF9kYXRhID0gYmZkX2FsbG9jIChzdWIsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGFyY2hfZWx0ZGF0YSAoc3ViKS0+cGFyc2VkX3NpemUgPSBzLnN0X3NpemU7Ci0JfQotCi0gICAgICAvKiBYWFggVGhlc2UgY2FsbHMgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLQkgbWFjaGluZXMpIHNpbmNlIHRoZSBmaWVsZHMncyB3aWR0aCBpcyAyMCBhbmQgdGhlcmUgbnVtYmVycyB3aXRoCi0JIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0gICAgICBzcHJpbnRmIChhaGRycC0+cHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgICAgIHNwcmludGYgKGFoZHJwLT5uYW1sZW4sICIlbGQiLCAobG9uZykgbmFtbGVuKTsKLQotICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyBvZGQsIHdlIHdyaXRlIG91dCB0aGUgbnVsbCBieXRlCi0gICAgICAgICBhZnRlciB0aGUgbmFtZSBhcyB3ZWxsLiAgKi8KLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotCi0gICAgICByZW1haW5pbmcgPSBhcmVsdF9zaXplIChzdWIpOwotICAgICAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSX0JJRwotCSAgICAgICsgbmFtbGVuCi0JICAgICAgKyBTWENPRkZBUkZNQUcKLQkgICAgICArIHJlbWFpbmluZyk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLQotICAgICAgb2Zmc2V0c1tpXSA9IG5leHRvZmY7Ci0KLSAgICAgIHByZXZvZmYgPSBuZXh0b2ZmOwotICAgICAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgICAgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gICAgICBmb3IgKHAgPSAoY2hhciAqKSBhaGRycDsgcCA8IChjaGFyICopIGFoZHJwICsgU0laRU9GX0FSX0hEUl9CSUc7IHArKykKLQlpZiAoKnAgPT0gJ1wwJykKLQkgICpwID0gJyAnOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBhaGRycCwgMSwgU0laRU9GX0FSX0hEUl9CSUcsIGFiZmQpCi0JICAhPSBTSVpFT0ZfQVJfSERSX0JJRwotCSAgfHwgYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4sIGFiZmQpICE9IG5hbWxlbgotCSAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICAgICAhPSBTWENPRkZBUkZNQUcpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChzdWIsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgYW10OwotCSAgYmZkX2J5dGUgYnVmZmVyW0RFRkFVTFRfQlVGRkVSU0laRV07Ci0KLQkgIGFtdCA9IHNpemVvZiBidWZmZXI7Ci0JICBpZiAoYW10ID4gcmVtYWluaW5nKQotCSAgICBhbXQgPSByZW1haW5pbmc7Ci0JICBpZiAoYmZkX3JlYWQgKGJ1ZmZlciwgMSwgYW10LCBzdWIpICE9IGFtdAotCSAgICAgIHx8IGJmZF93cml0ZSAoYnVmZmVyLCAxLCBhbXQsIGFiZmQpICE9IGFtdCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVtYWluaW5nIC09IGFtdDsKLQl9Ci0KLSAgICAgIGlmICgoc2l6ZSAmIDEpICE9IDApCi0JewotCSAgYmZkX2J5dGUgYjsKLQotCSAgYiA9ICdcMCc7Ci0JICBpZiAoYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogWFhYIFRoaXMgY2FsbCBhY3R1YWxseSBzaG91bGQgdXNlICVsbGQgKGF0IGxlYXN0IG9uIDMyLWJpdAotICAgICBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLSAgICAgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgc3ByaW50ZiAoZmhkci5sYXN0bWVtb2ZmLCAiJWxkIiwgKGxvbmcpIHByZXZvZmYpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgbWVtYmVyIHRhYmxlLiAgKi8KLQotICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gIC8qIFhYWCBUaGlzIGNhbGwgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLSAgICAgbWFjaGluZXMpIHNpbmNlIHRoZSBmaWVsZHMncyB3aWR0aCBpcyAyMCBhbmQgdGhlcmUgbnVtYmVycyB3aXRoCi0gICAgIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0gIHNwcmludGYgKGZoZHIubWVtb2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotCi0gIG1lbXNldCAoJmFoZHIsIDAsIHNpemVvZiBhaGRyKTsKLSAgLyogWFhYIFRoZSBuZXh0IHR3byBjYWxscyBhY3R1YWxseSBzaG91bGQgdXNlICVsbGQgKGF0IGxlYXN0IG9uIDMyLWJpdAotICAgICBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLSAgICAgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgc3ByaW50ZiAoYWhkci5zaXplLCAiJWxkIiwgKGxvbmcpICgxMiArIGNvdW50ICogMTIgKyB0b3RhbF9uYW1sZW4pKTsKLSAgc3ByaW50ZiAoYWhkci5wcmV2b2ZmLCAiJWxkIiwgKGxvbmcpIHByZXZvZmYpOwotICBzcHJpbnRmIChhaGRyLmRhdGUsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIuZ2lkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5tb2RlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIHNpemUgPSAoU0laRU9GX0FSX0hEUl9CSUcKLQkgICsgMTIKLQkgICsgY291bnQgKiAxMgotCSAgKyB0b3RhbF9uYW1sZW4KLQkgICsgU1hDT0ZGQVJGTUFHKTsKLQotICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIC8qIFhYWCBUaGlzIGNhbGwgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLSAgICAgICBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLSAgICAgICBtb3JlIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmFoZHI7IHAgPCAoY2hhciAqKSAmYWhkciArIFNJWkVPRl9BUl9IRFJfQklHOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYWhkciwgMSwgU0laRU9GX0FSX0hEUl9CSUcsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFJfQklHCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgIT0gU1hDT0ZGQVJGTUFHKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIGNvdW50KTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgb2Zmc2V0c1tpXSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZSAmIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJtYXAsIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQotICBpZiAoISBtYWtlbWFwIHx8ICEgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVkIiwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gICAgICAvKiBYWFggVGhpcyBjYWxsIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aAotCSBtb3JlIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSAoUFRSKSAmZmhkcjsKLSAgICAgIGlmICghIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBhcmNoaXZlIGZpbGUgaGVhZGVyLiAgKi8KLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmZmhkcjsgcCA8IChjaGFyICopICZmaGRyICsgU0laRU9GX0FSX0ZJTEVfSERSX0JJRzsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmZmhkciwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRywgMSwgYWJmZCkgIT0KLQkgIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotX2JmZF94Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYWJmZCkpCi0gICAgcmV0dXJuIHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHNfb2xkIChhYmZkKTsKLSAgZWxzZQotICAgIHJldHVybiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzX2JpZyAoYWJmZCk7Ci19Ci0MCi0vKiBXZSBjYW4ndCB1c2UgdGhlIHVzdWFsIGNvZmZfc2l6ZW9mX2hlYWRlcnMgcm91dGluZSwgYmVjYXVzZSBBSVgKLSAgIGFsd2F5cyB1c2VzIGFuIGEub3V0IGhlYWRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBGSUxIU1o7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNpemUgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7Ci0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0MCi0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNoLmMgYi9iZmQvY29mZi1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc4ZWY0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBTdXBlci1IIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotICAgUmVsYXhpbmcgY29kZSB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3NoLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljIGJvb2xlYW4gc2hfYWxpZ25fbG9hZF9zcGFuIAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBib29sZWFuICgqKSAoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSksCi0JICAgUFRSLCBiZmRfdm1hICoqLCBiZmRfdm1hICosIGJmZF92bWEsIGJmZF92bWEsIGJvb2xlYW4gKikpOwotCi0jZGVmaW5lIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIHNoX2FsaWduX2xvYWRfc3BhbgotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc2hfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBnZXRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpzaF9pbnNuX2luZm8gUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci0jZW5kaWYKLXN0YXRpYyBib29sZWFuIHNoX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIENhbid0IGJ1aWxkIGltcG9ydCB0YWJsZXMgd2l0aCAyKio0IGFsaWdubWVudC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUgkyCi0jZWxzZQotLyogRGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LiAgKi8KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSCTQKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBBbGlnbiBQRSBleGVjdXRhYmxlcy4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotI2VuZGlmCi0KLS8qIEdlbmVyYXRlIGxvbmcgZmlsZSBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcCAoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotewotICByZXR1cm4gISBob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnR5cGUgIT0gUl9TSF9JTUFHRUJBU0U7Ci19ICAgICAKLSNlbmRpZgotCi0vKiBUaGUgc3VwcG9ydGVkIHJlbG9jYXRpb25zLiAgVGhlcmUgYXJlIGEgbG90IG9mIHJlbG9jYXRpb25zIGRlZmluZWQKLSAgIGluIGNvZmYvaW50ZXJuYWwuaCB3aGljaCB3ZSBkbyBub3QgZXhwZWN0IHRvIGV2ZXIgc2VlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNoX2NvZmZfaG93dG9zW10gPQotewotICBFTVBUWV9IT1dUTyAoMCksCi0gIEVNUFRZX0hPV1RPICgxKSwKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogV2luZG93cyBDRSAqLwotICBIT1dUTyAoUl9TSF9JTU0zMkNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTMyY2UiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotI2Vsc2UKLSAgRU1QVFlfSE9XVE8gKDIpLAotI2VuZGlmCi0gIEVNUFRZX0hPV1RPICgzKSwgLyogUl9TSF9QQ1JFTDggKi8KLSAgRU1QVFlfSE9XVE8gKDQpLCAvKiBSX1NIX1BDUkVMMTYgKi8KLSAgRU1QVFlfSE9XVE8gKDUpLCAvKiBSX1NIX0hJR0g4ICovCi0gIEVNUFRZX0hPV1RPICg2KSwgLyogUl9TSF9JTU0yNCAqLwotICBFTVBUWV9IT1dUTyAoNyksIC8qIFJfU0hfTE9XMTYgKi8KLSAgRU1QVFlfSE9XVE8gKDgpLAotICBFTVBUWV9IT1dUTyAoOSksIC8qIFJfU0hfUENESVNQOEJZNCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUDhCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjZGlzcDhieTIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoMTEpLCAvKiBSX1NIX1BDRElTUDggKi8KLQotICBIT1dUTyAoUl9TSF9QQ0RJU1AsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNkaXNwMTJieTIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxMyksCi0KLSAgSE9XVE8gKFJfU0hfSU1NMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfaW1tMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxNSksCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIEhPV1RPIChSX1NIX0lNQUdFQkFTRSwgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLCAgICAgICAJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAicnZhMzIiLAkgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotI2Vsc2UKLSAgRU1QVFlfSE9XVE8gKDE2KSwgLyogUl9TSF9JTU04ICovCi0jZW5kaWYKLSAgRU1QVFlfSE9XVE8gKDE3KSwgLyogUl9TSF9JTU04QlkyICovCi0gIEVNUFRZX0hPV1RPICgxOCksIC8qIFJfU0hfSU1NOEJZNCAqLwotICBFTVBUWV9IT1dUTyAoMTkpLCAvKiBSX1NIX0lNTTQgKi8KLSAgRU1QVFlfSE9XVE8gKDIwKSwgLyogUl9TSF9JTU00QlkyICovCi0gIEVNUFRZX0hPV1RPICgyMSksIC8qIFJfU0hfSU1NNEJZNCAqLwotCi0gIEhPV1RPIChSX1NIX1BDUkVMSU1NOEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY3JlbGltbThieTIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTQsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNyZWxpbW04Ynk0IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfSU1NMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfaW1tMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2gxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3N3aXRjaDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9VU0VTLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3VzZXMiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9DT1VOVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9jb3VudCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQUxJR04sCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfYWxpZ24iLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0NPREUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfY29kZSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfREFUQSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9kYXRhIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9MQUJFTCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9sYWJlbCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3N3aXRjaDgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIFNIX0NPRkZfSE9XVE9fQ09VTlQgKHNpemVvZiBzaF9jb2ZmX2hvd3RvcyAvIHNpemVvZiBzaF9jb2ZmX2hvd3Rvc1swXSkKLQotLyogQ2hlY2sgZm9yIGEgYmFkIG1hZ2ljIG51bWJlci4gICovCi0jZGVmaW5lIEJBRE1BRyh4KSBTSEJBRE1BRyh4KQotCi0vKiBDdXN0b21pemUgY29mZmNvZGUuaCAodGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQpLiAgKi8KLSNkZWZpbmUgU0ggMQotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIHNldCBoZXJlLiAgKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0vKiBTd2FwIHRoZSByX29mZnNldCBmaWVsZCBpbiBhbmQgb3V0LiAgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0KLS8qIFN3YXAgb3V0IGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkJXAotICBkbwkJCQkJCVwKLSAgICB7CQkJCQkJXAotICAgICAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOwkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsJCQlcCi0gICAgfQkJCQkJCVwKLSAgd2hpbGUgKDApCi0jZW5kaWYKLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgd2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBsb25nCi1nZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2wpICAgICAgIAotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHJlbG9jYXRpb24gPSAoc3ltYm9sLT52YWx1ZSArCi0JCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHJldHVybiByZWxvY2F0aW9uOwotfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0vKiBDb252ZXJ0IGFuIHJ0eXBlIHRvIGhvd3RvIGZvciB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4KLSAgIENvcGllZCBmcm9tIGNvZmYtaTM4Ni4gICovCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9zaF9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3NoX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW07Ci0gICAgIGJmZF92bWEgKiBhZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0KLSAgaG93dG8gPSBzaF9jb2ZmX2hvd3RvcyArIHJlbC0+cl90eXBlOwotCi0gICphZGRlbmRwID0gMDsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSA0OwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyaWMgY29kZSBpcyBnb2luZyB0bwotICAgICAgICAgYWRkIGJhY2sgdGhlIHN5bWJvbCB2YWx1ZSBpbiBvcmRlciB0byBjYW5jZWwgb3V0IGFuCi0gICAgICAgICBhZGp1c3RtZW50IGl0IG1hZGUgdG8gdGhlIGFkZGVuZC4gIEhvd2V2ZXIsIHdlIHNldCB0aGUgYWRkZW5kCi0gICAgICAgICB0byAwIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBhZGp1c3QgaGVyZSwKLSAgICAgICAgIHRvIGF2b2lkIHRoZSBhZGp1c3RtZW50IHRoZSBnZW5lcmljIGNvZGUgd2lsbCBtYWtlLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIGdldHRpbmcgYSBiaXQgaGFja2lzaC4gICovCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICBpZiAocmVsLT5yX3R5cGUgPT0gUl9TSF9JTUFHRUJBU0UpCi0gICAgKmFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIFBFIHJlbG9jcy4gICovCi1zdHJ1Y3Qgc2hjb2ZmX3JlbG9jX21hcAotewotICB1bnNpZ25lZCBjaGFyIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgc2hjb2ZmX3JlbG9jX3ZhbDsKLX07Ci0KLS8qIEFuIGFycmF5IG1hcHBpbmcgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIFBFIHJlbG9jcy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoY29mZl9yZWxvY19tYXAgc2hfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9JTU0zMkNFIH0sCi0gIHsgQkZEX1JFTE9DX1JWQSwgUl9TSF9JTUFHRUJBU0UgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TSF9JTU0zMkNFIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIFBFIHJlbG9jLiAgKi8KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJc2hfY29mZl9yZWxvY190eXBlX2xvb2t1cAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zaF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3Qgc2hjb2ZmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2hfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNoX2NvZmZfaG93dG9zWyhpbnQpIHNoX3JlbG9jX21hcFtpXS5zaGNvZmZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiU0ggRXJyb3I6IHVua25vd24gcmVsb2MgdHlwZSAlZFxuIiwgY29kZSk7Ci0gIHJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gY29mZmNvZGUuaCB0byBnZXQgdGhlIGhvd3RvIGNvcnJlc3BvbmRpbmcgdG8KLSAgIGFuIGludGVybmFsIHJlbG9jLiAgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhyZWxlbnQsIGludGVybmFsKQkJXAotICAoKHJlbGVudCktPmhvd3RvID0JCQkJXAotICAgKChpbnRlcm5hbCktPnJfdHlwZSA8IFNIX0NPRkZfSE9XVE9fQ09VTlQJXAotICAgID8gJnNoX2NvZmZfaG93dG9zWyhpbnRlcm5hbCktPnJfdHlwZV0JXAotICAgIDogKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkpCi0KLS8qIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIG1hY3JvIGluIGNvZmZjb2RlLmgsIGV4Y2VwdCB0aGF0IGl0IGNvcGllcwotICAgcl9vZmZzZXQgaW50byByZWxvY19lbnRyeS0+YWRkZW5kIGZvciBzb21lIHJlbG9jcy4gICovCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDgJCQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMTYJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0gzMgkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1VTRVMJCQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfQ09VTlQJCQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfQUxJR04pCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAocmVsb2MpLnJfb2Zmc2V0OwkJCVwKLSAgfQotCi0vKiBUaGlzIGlzIHRoZSBob3d0byBmdW5jdGlvbiBmb3IgdGhlIFNIIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9TSF9JTU0zMgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgICAgJiYgcl90eXBlICE9IFJfU0hfSU1NMzJDRQotICAgICAgJiYgcl90eXBlICE9IFJfU0hfSU1BR0VCQVNFCi0jZW5kaWYKLSAgICAgICYmIChyX3R5cGUgIT0gUl9TSF9QQ0RJU1AKLQkgIHx8IChzeW1ib2xfaW4tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbF9pbik7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9JTU0zMjoKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICBjYXNlIFJfU0hfSU1NMzJDRToKLSNlbmRpZgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgIGNhc2UgUl9TSF9JTUFHRUJBU0U6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSAoc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZAotCSAgICAgICAtIHBlX2RhdGEgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2UpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIFJfU0hfUENESVNQOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaAotCi0vKiBXZSBjYW4gZG8gcmVsYXhpbmcuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIHNoX3JlbGF4X3NlY3Rpb24KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gc2hfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIHVzZSBzcGVjaWFsIGNvZGUgdG8gZ2V0IHRoZSByZWxvY2F0ZWQKLSAgIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBvbiB0aGUgU0guCi0KLSAgIEZ1bmN0aW9uIGNhbGxzIG9uIHRoZSBTSCBsb29rIGxpa2UgdGhpczoKLQotICAgICAgIG1vdmwgIEwxLHIwCi0gICAgICAgLi4uCi0gICAgICAganNyICAgQHIwCi0gICAgICAgLi4uCi0gICAgIEwxOgotICAgICAgIC5sb25nIGZ1bmN0aW9uCi0KLSAgIFRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIHdpbGwgY29vcGVyYXRlIHRvIGNyZWF0ZSBSX1NIX1VTRVMKLSAgIHJlbG9jcyBvbiB0aGUganNyIGluc3RydWN0aW9ucy4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUKLSAgIFJfU0hfVVNFUyByZWxvYyBpcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyICh0aGUgcl9vZmZzZXQgZmllbGQgaXMgY29tcHV0ZWQgYXMgdGhvdWdoIGl0Ci0gICB3ZXJlIGEganVtcCBpbnN0cnVjdGlvbiwgc28gdGhlIG9mZnNldCB2YWx1ZSBpcyBhY3R1YWxseSBmcm9tIGZvdXIKLSAgIGJ5dGVzIHBhc3QgdGhlIGluc3RydWN0aW9uKS4gIFRoZSBsaW5rZXIgY2FuIHVzZSB0aGlzIHJlbG9jIHRvCi0gICBkZXRlcm1pbmUganVzdCB3aGljaCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQsIGFuZCB0aHVzIGRlY2lkZQotICAgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4KLQotICAgSWYgbXVsdGlwbGUgZnVuY3Rpb24gY2FsbHMgYXJlIGFsbCBiYXNlZCBvbiBhIHNpbmdsZSByZWdpc3RlciBsb2FkCi0gICAoaS5lLiwgdGhlIHNhbWUgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzKSwgdGhlIGNvbXBpbGVyCi0gICBndWFyYW50ZWVzIHRoYXQgZWFjaCBmdW5jdGlvbiBjYWxsIHdpbGwgaGF2ZSBhbiBSX1NIX1VTRVMgcmVsb2MuCi0gICBUaGVyZWZvcmUsIGlmIHRoZSBsaW5rZXIgaXMgYWJsZSB0byBjb252ZXJ0IGVhY2ggUl9TSF9VU0VTIHJlbG9jCi0gICB3aGljaCByZWZlcnMgdG8gdGhhdCBhZGRyZXNzLCBpdCBjYW4gc2FmZWx5IGVsaW1pbmF0ZSB0aGUgcmVnaXN0ZXIKLSAgIGxvYWQuCi0KLSAgIFdoZW4gdGhlIGFzc2VtYmxlciBjcmVhdGVzIGFuIFJfU0hfVVNFUyByZWxvYywgaXQgZXhhbWluZXMgaXQgdG8KLSAgIGRldGVybWluZSB3aGljaCBhZGRyZXNzIGlzIGJlaW5nIGxvYWRlZCAoTDEgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgotICAgSXQgdGhlbiBjb3VudHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoYXQgYWRkcmVzcywgYW5kCi0gICBjcmVhdGVzIGFuIFJfU0hfQ09VTlQgcmVsb2MgYXQgdGhhdCBhZGRyZXNzLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mCi0gICB0aGUgUl9TSF9DT1VOVCByZWxvYyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcy4gIElmIHRoZQotICAgbGlua2VyIGlzIGFibGUgdG8gZWxpbWluYXRlIGEgcmVnaXN0ZXIgbG9hZCwgaXQgY2FuIHVzZSB0aGUKLSAgIFJfU0hfQ09VTlQgcmVsb2MgdG8gc2VlIHdoZXRoZXIgaXQgY2FuIGFsc28gZWxpbWluYXRlIHRoZSBmdW5jdGlvbgotICAgYWRkcmVzcy4KLQotICAgU0ggcmVsYXhpbmcgYWxzbyBoYW5kbGVzIGFub3RoZXIsIHVucmVsYXRlZCwgbWF0dGVyLiAgT24gdGhlIFNILCBpZgotICAgYSBsb2FkIG9yIHN0b3JlIGluc3RydWN0aW9uIGlzIG5vdCBhbGlnbmVkIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LAotICAgdGhlIG1lbW9yeSBjeWNsZSBpbnRlcmZlcmVzIHdpdGggdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBmZXRjaCwKLSAgIGNhdXNpbmcgYSBvbmUgY3ljbGUgYnViYmxlIGluIHRoZSBwaXBlbGluZS4gIFRoZXJlZm9yZSwgd2UgdHJ5IHRvCi0gICBhbGlnbiBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgb24gZm91ciBieXRlIGJvdW5kYXJpZXMgaWYgd2UKLSAgIGNhbiwgYnkgc3dhcHBpbmcgdGhlbSB3aXRoIG9uZSBvZiB0aGUgYWRqYWNlbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgbGlua19pbmZvLT5rZWVwX21lbW9yeSwKLQkJICAgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGhhdmVfY29kZSA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBsYWRkciwgcGFkZHIsIHN5bXZhbDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGluc247Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBmb2ZmOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfQ09ERSkKLQloYXZlX2NvZGUgPSB0cnVlOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBSX1NIX1VTRVMgcmVsb2Mgd2lsbCBwb2ludCB1cyB0bwotICAgICAgICAgdGhlIHJlZ2lzdGVyIGxvYWQuICBUaGUgNCBpcyBiZWNhdXNlIHRoZSByX29mZnNldCBmaWVsZCBpcwotICAgICAgICAgY29tcHV0ZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBqdW1wIG9mZnNldCwgd2hpY2ggYXJlIGJhc2VkCi0gICAgICAgICBmcm9tIDQgYnl0ZXMgYWZ0ZXIgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgbGFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0OwotICAgICAgLyogQ2FyZWZ1bCB0byBzaWduIGV4dGVuZCB0aGUgMzItYml0IG9mZnNldC4gICovCi0gICAgICBsYWRkciArPSAoKGlyZWwtPnJfb2Zmc2V0ICYgMHhmZmZmZmZmZikgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDA7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIsCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBsYWRkcik7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgbW92LmwgTk4sck4sIHdlIGRvbid0IGtub3cgd2hhdCB0byBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkciwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSByZWxvYyBmb3IgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMKLSAgICAgICAgIGJlaW5nIGxvYWRlZC4gIFRoaXMgcmVsb2Mgd2lsbCB0ZWxsIHVzIHdoaWNoIGZ1bmN0aW9uIGlzCi0gICAgICAgICBhY3R1YWxseSBiZWluZyBjYWxsZWQuICAqLwotICAgICAgcGFkZHIgKz0gc2VjLT52bWE7Ci0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl92YWRkciA9PSBwYWRkcgotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgICAmJiAoaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTU0zMgotCQl8fCBpcmVsZm4tPnJfdHlwZSA9PSBSX1NIX0lNTTMyQ0UKLQkJfHwgaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTUFHRUJBU0UpKQotCi0jZWxzZQotCSAgICAmJiBpcmVsZm4tPnJfdHlwZSA9PSBSX1NIX0lNTTMyKQotI2VuZGlmCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsZm4gPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCSAgICAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgKGlyZWxmbi0+cl9zeW1uZHgKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCSAgICAmc3ltKTsKLSAgICAgIGlmIChzeW0ubl9zY251bSAhPSAwICYmIHN5bS5uX3NjbnVtICE9IHNlYy0+dGFyZ2V0X2luZGV4KQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICBzeW12YWwgPSAoc3ltLm5fdmFsdWUKLQkJICAgIC0gc2VjLT52bWEKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW2lyZWxmbi0+cl9zeW1uZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIgLSBzZWMtPnZtYSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIHNob3J0ZW5lZC4gICovCi0gICAgICBmb2ZmID0gKHN5bXZhbAotCSAgICAgIC0gKGlyZWwtPnJfdmFkZHIKLQkJIC0gc2VjLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gICAgICAvKiBSZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0KLSAgICAgIC8qIENoYW5nZSB0aGUgUl9TSF9VU0VTIHJlbG9jIGludG8gYW4gUl9TSF9QQ0RJU1AgcmVsb2MsIGFuZAotICAgICAgICAgcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotICAgICAgaXJlbC0+cl90eXBlID0gUl9TSF9QQ0RJU1A7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IGlyZWxmbi0+cl9zeW1uZHg7Ci0gICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIFBDRElTUAotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCX0KLQotICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgUl9TSF9VU0VTIHJlbG9jIHJlZmVycmluZyB0byB0aGUgc2FtZQotICAgICAgICAgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxlbmQ7IGlyZWxzY2FuKyspCi0JaWYgKGlyZWxzY2FuLT5yX3R5cGUgPT0gUl9TSF9VU0VTCi0JICAgICYmIGxhZGRyID09IGlyZWxzY2FuLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0ICsgaXJlbHNjYW4tPnJfb2Zmc2V0KQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl92YWRkciA9PSBwYWRkcgotCSAgICAmJiBpcmVsY291bnQtPnJfdHlwZSA9PSBSX1NIX0NPVU5UKQotCSAgYnJlYWs7Ci0KLSAgICAgIC8qIERlbGV0ZSB0aGUgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIsCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9vZmZzZXQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgaXJlbGZuLT5yX3ZhZGRyIC0gc2VjLT52bWEsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCAmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgICAgICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfb2Zmc2V0KSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5yYWRkciwgc3RvcDsKLSAgICAgIGJmZF92bWEgc3RhcnQgPSAwOwotICAgICAgaW50IGluc24gPSAwOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBpbnQgb2ZmLCBhZGp1c3QsIG9pbnNuOwotICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZiA9IDA7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotCi0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIG5yYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGlmICgoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA8IHRvYWRkcikKLQkgIHx8IChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgICAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCBhZGRyICsgY291bnQKLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9EQVRBCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9MQUJFTCkKLQlpcmVsLT5yX3R5cGUgPSBSX1NIX1VOVVNFRDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCBzZWUgaWYgdGhlIHJhbmdlIGl0IGNvdmVycwotICAgICAgICAgaW5jbHVkZXMgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZC4gICovCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBSX1NIX1BDRElTUDoKLQljYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0lNTTMyOgotI2lmZGVmIENPRkZfV0lUSF9QRQotCWNhc2UgUl9TSF9JTU0zMkNFOgotCWNhc2UgUl9TSF9JTUFHRUJBU0U6Ci0jZW5kaWYKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgIH0KLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBpZiAob2ZmICYgMHg4MCkKLQkgICAgb2ZmIC09IDB4MTAwOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDoKLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb2ZmID0gaW5zbiAmIDB4ZmZmOwotCSAgICAgIGlmIChvZmYgJiAweDgwMCkKLQkJb2ZmIC09IDB4MTAwMDsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0IC0gKGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgICAgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAgICAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGNvdW50OwotCSAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLQotCSAgc3RhcnQgPSBzdG9wOwotCi0JICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydAotCQkJICAgICsgKGxvbmcpIGlyZWwtPnJfb2Zmc2V0Ci0JCQkgICAgKyA0KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IGNvdW50OwotICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IC0gY291bnQ7Ci0gICAgICBlbHNlCi0JYWRqdXN0ID0gMDsKLQotICAgICAgaWYgKGFkanVzdCAhPSAwKQotCXsKLQkgIG9pbnNuID0gaW5zbjsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICAgICAgQkZEX0FTU0VSVCAoYWRqdXN0ID09IGNvdW50IHx8IGNvdW50ID49IDQpOwotCSAgICAgIGlmIChjb3VudCA+PSA0KQotCQlpbnNuICs9IGFkanVzdCAvIDQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChpcmVsLT5yX3ZhZGRyICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIODoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IDAgfHwgdm9mZiA+PSAweGZmKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDE2OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgLSAweDgwMDAgfHwgdm9mZiA+PSAweDgwMDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8xNiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9VU0VTOgotCSAgICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGFkanVzdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlyZWwtPnJfdmFkZHIgPSBucmFkZHIgKyBzZWMtPnZtYTsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMuICBJZiB0aGVyZSBjb250YWluIGFueSBJTU0zMgotICAgICByZWxvY3MgYWdhaW5zdCBpbnRlcm5hbCBzeW1ib2xzIHdoaWNoIHdlIGFyZSBub3QgZ29pbmcgdG8gYWRqdXN0Ci0gICAgIGJlbG93LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGFkZGVuZHMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbHNjYW4sICppcmVsc2NhbmVuZDsKLSAgICAgIGJmZF9ieXRlICpvY29udGVudHM7Ci0KLSAgICAgIGlmIChvID09IHNlYwotCSAgfHwgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHJlbG9jcy4gIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzCi0gICAgICAgICBmYWxzZSwgd2Ugc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywgd2hlbiB3ZQotICAgICAgICAgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jb250ZW50cyA9IE5VTEw7Ci0gICAgICBpcmVsc2NhbmVuZCA9IGludGVybmFsX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsc2NhbmVuZDsgaXJlbHNjYW4rKykKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgaWYgKGlyZWxzY2FuLT5yX3R5cGUgIT0gUl9TSF9JTU0zMgotCSAgICAgICYmIGlyZWxzY2FuLT5yX3R5cGUgIT0gUl9TSF9JTUFHRUJBU0UKLQkgICAgICAmJiBpcmVsc2Nhbi0+cl90eXBlICE9IFJfU0hfSU1NMzJDRSkKLSNlbHNlCi0JICBpZiAoaXJlbHNjYW4tPnJfdHlwZSAhPSBSX1NIX0lNTTMyKQotI2VuZGlmCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWxzY2FuLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICAgICAmJiBzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgICAgICYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPD0gYWRkcgotCQkgIHx8IChiZmRfdm1hKSBzeW0ubl92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl92YWRkciAtIG8tPnZtYSk7Ci0JICAgICAgdmFsICs9IHN5bS5uX3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsCi0JCQkgICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOwotCi0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0aW5nIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHdpbGwgbm90IHdvcmsgaWYgc29tZXRoaW5nIGhhcwotICAgICBhbHJlYWR5IHJldHJpZXZlZCB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8KLSAgICAgbWFrZSB0aGlzIHdvcmsgYnkgYWRqdXN0aW5nIHRoZSBnZW5lcmljIHN5bWJvbHMgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgSG93ZXZlciwgdGhpcyBjYXNlIHNob3VsZCBub3QgYXJpc2UgaW4gbm9ybWFsIHVzYWdlLiAgKi8KLSAgaWYgKG9ial9zeW1ib2xzIChhYmZkKSAhPSBOVUxMCi0gICAgICB8fCBvYmpfcmF3X3N5bWVudHMgKGFiZmQpICE9IE5VTEwpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICgiJXM6IGZhdGFsOiBnZW5lcmljIHN5bWJvbHMgcmV0cmlldmVkIGJlZm9yZSByZWxheGluZyIsCi0JYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgJiYgKGJmZF92bWEpIGlzeW0ubl92YWx1ZSA+IGFkZHIKLQkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5uX3ZhbHVlIC09IGNvdW50OwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKLQotCSAgaWYgKCpzeW1faGFzaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID49IGFkZHIKLQkJCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpOwotCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBpc3ltLm5fbnVtYXV4ICsgMTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAotICAgICByX3ZhZGRyIGZvciBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGlyZWxhbGlnbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWxpZ250bywgYWxpZ25hZGRyOwotCi0gICAgICBhbGlnbnRvID0gQkZEX0FMSUdOICh0b2FkZHIsIDEgPDwgaXJlbGFsaWduLT5yX29mZnNldCk7Ci0gICAgICBhbGlnbmFkZHIgPSBCRkRfQUxJR04gKGlyZWxhbGlnbi0+cl92YWRkciAtIHNlYy0+dm1hLAotCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOwotICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQotCXsKLQkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KLQkgIHJldHVybiBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWxpZ25hZGRyLAotCQkJCQlhbGlnbnRvIC0gYWxpZ25hZGRyKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBTSCBvcGNvZGUgdGFibGUsIHVzZWQgdG8gcmFwaWRseQotICAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCi0KLS8qIFRoZSBvcGNvZGUgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUKLSAgIGFycmF5IGlzIGluZGV4ZWQgYnkgdGhlIGhpZ2ggb3JkZXIgZm91ciBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0cnVjdCBzaF9tYWpvcl9vcGNvZGUKLXsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0LiAgVGhpcyBpcyBhbiBhcnJheSB3aGljaAotICAgICBjb250YWlucyBhbGwgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgbWFqb3Igb3Bjb2RlLiAgKi8KLSAgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSAqbWlub3Jfb3Bjb2RlczsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtaW5vcl9vcGNvZGVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY291bnQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBzZXQgb2YgU0ggb3Bjb2Rlcy4gIFRoZQotICAgaW5zdHJ1Y3Rpb24gY29kZSBpcyBhbmRlZCB3aXRoIHRoZSBtYXNrIHZhbHVlLCBhbmQgdGhlIHJlc3VsdGluZwotICAgdmFsdWUgaXMgdXNlZCB0byBzZWFyY2ggdGhlIG9yZGVyIG9wY29kZSBsaXN0LiAgKi8KLQotc3RydWN0IHNoX21pbm9yX29wY29kZQotewotICAvKiBUaGUgc29ydGVkIG9wY29kZSBsaXN0LiAgKi8KLSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3Bjb2RlczsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBvcGNvZGVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY291bnQ7Ci0gIC8qIFRoZSBtYXNrIHZhbHVlIHRvIHVzZSB3aGVuIHNlYXJjaGluZyB0aGUgb3Bjb2RlIGxpc3QuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtYXNrOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGFuIFNIIGluc3RydWN0aW9uLiAgQW4gYXJyYXkKLSAgIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgc29ydGVkIGluIG9yZGVyIGJ5IG9wY29kZS4gICovCi0KLXN0cnVjdCBzaF9vcGNvZGUKLXsKLSAgLyogVGhlIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIGFmdGVyIGl0IGhhcyBiZWVuIGFuZGVkIHdpdGggdGhlCi0gICAgIG1hc2sgdmFsdWUgaW4gdGhlIHNoX21ham9yX29wY29kZSBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIC8qIEZsYWdzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEZsYWcgd2hpY2ggYXBwZWFyIGluIHRoZSBzaF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLQotLyogVGhpcyBpbnN0cnVjdGlvbiBsb2FkcyBhIHZhbHVlIGZyb20gbWVtb3J5LiAgKi8KLSNkZWZpbmUgTE9BRCAoMHgxKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHN0b3JlcyBhIHZhbHVlIHRvIG1lbW9yeS4gICovCi0jZGVmaW5lIFNUT1JFICgweDIpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2guICAqLwotI2RlZmluZSBCUkFOQ0ggKDB4NCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgREVMQVkgKDB4OCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMSAoMHgxMCkKLSNkZWZpbmUgVVNFUzFfUkVHKHgpICgoeCAmIDB4MGYwMCkgPj4gOCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMiAoMHgyMCkKLSNkZWZpbmUgVVNFUzJfUkVHKHgpICgoeCAmIDB4MDBmMCkgPj4gNCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU1IwICgweDQwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMxICgweDgwKQotI2RlZmluZSBTRVRTMV9SRUcoeCkgKCh4ICYgMHgwZjAwKSA+PiA4KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMyICgweDEwMCkKLSNkZWZpbmUgU0VUUzJfUkVHKHgpICgoeCAmIDB4MDBmMCkgPj4gNCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBTRVRTUjAgKDB4MjAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgYSBzcGVjaWFsIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgU0VUU1NQICgweDQwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFVTRVNTUCAoMHg4MDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTRjEgKDB4MTAwMCkKLSNkZWZpbmUgVVNFU0YxX1JFRyh4KSAoKHggJiAweDBmMDApID4+IDgpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTRjIgKDB4MjAwMCkKLSNkZWZpbmUgVVNFU0YyX1JFRyh4KSAoKHggJiAweDAwZjApID4+IDQpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBmbG9hdGluZyBwb2ludCByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU0YwICgweDQwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTRjEgKDB4ODAwMCkKLSNkZWZpbmUgU0VUU0YxX1JFRyh4KSAoKHggJiAweDBmMDApID4+IDgpCi0KLSNkZWZpbmUgVVNFU0FTICgweDEwMDAwKQotI2RlZmluZSBVU0VTQVNfUkVHKHgpICgoKCgoeCkgPj4gOCkgLSAyKSAmIDMpICsgMikKLSNkZWZpbmUgVVNFU1I4ICgweDIwMDAwKQotI2RlZmluZSBTRVRTQVMgKDB4NDAwMDApCi0jZGVmaW5lIFNFVFNBU19SRUcoeCkgVVNFU0FTX1JFRyAoeCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19yZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl9zZXRzX3JlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX2ZyZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl9zZXRzX2ZyZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX29yX3NldHNfZnJlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuc19jb25mbGljdAotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50LAotCSAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfbG9hZF91c2UKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLSNlbmRpZgotLyogVGhlIG9wY29kZSBtYXBzLiAgKi8KLQotI2RlZmluZSBNQVAoYSkgYSwgc2l6ZW9mIGEgLyBzaXplb2YgYVswXQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMFtdID0KLXsKLSAgeyAweDAwMDgsIFNFVFNTUCB9LAkJCS8qIGNscnQgKi8KLSAgeyAweDAwMDksIDAgfSwJCQkvKiBub3AgKi8KLSAgeyAweDAwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIHJ0cyAqLwotICB7IDB4MDAxOCwgU0VUU1NQIH0sCQkJLyogc2V0dCAqLwotICB7IDB4MDAxOSwgU0VUU1NQIH0sCQkJLyogZGl2MHUgKi8KLSAgeyAweDAwMWIsIDAgfSwJCQkvKiBzbGVlcCAqLwotICB7IDB4MDAyOCwgU0VUU1NQIH0sCQkJLyogY2xybWFjICovCi0gIHsgMHgwMDJiLCBCUkFOQ0ggfCBERUxBWSB8IFNFVFNTUCB9LAkvKiBydGUgKi8KLSAgeyAweDAwMzgsIFVTRVNTUCB8IFNFVFNTUCB9LAkJLyogbGR0bGIgKi8KLSAgeyAweDAwNDgsIFNFVFNTUCB9LAkJCS8qIGNscnMgKi8KLSAgeyAweDAwNTgsIFNFVFNTUCB9CQkJLyogc2V0cyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDFbXSA9Ci17Ci0gIHsgMHgwMDAzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIHwgU0VUU1NQIH0sCS8qIGJzcmYgcm4gKi8KLSAgeyAweDAwMGEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2gscm4gKi8KLSAgeyAweDAwMWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2wscm4gKi8KLSAgeyAweDAwMjMsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGJyYWYgcm4gKi8KLSAgeyAweDAwMjksIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogbW92dCBybiAqLwotICB7IDB4MDAyYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgcHIscm4gKi8KLSAgeyAweDAwNWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwdWwscm4gKi8KLSAgeyAweDAwNmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwc2NyLHJuIC8gc3RzIGRzcixybiAqLwotICB7IDB4MDA4MywgTE9BRCB8IFVTRVMxIH0sCQkJLyogcHJlZiBAcm4gKi8KLSAgeyAweDAwN2EsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGEwLHJuICovCi0gIHsgMHgwMDhhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyB4MCxybiAqLwotICB7IDB4MDA5YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgeDEscm4gKi8KLSAgeyAweDAwYWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIHkwLHJuICovCi0gIHsgMHgwMGJhLCBTRVRTMSB8IFVTRVNTUCB9CQkJLyogc3RzIHkxLHJuICovCi19OwotCi0vKiBUaGVzZSBzaXh0ZWVuIGluc3RydWN0aW9ucyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9uZSB0YWJsZSBlbnRyeSBiZWxvdy4gICovCi0jaWYgMAotICB7IDB4MDAwMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3Iscm4gKi8KLSAgeyAweDAwMTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIGdicixybiAqLwotICB7IDB4MDAyMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgdmJyLHJuICovCi0gIHsgMHgwMDMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzc3Iscm4gKi8KLSAgeyAweDAwNDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNwYyxybiAqLwotICB7IDB4MDA1MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgbW9kLHJuICovCi0gIHsgMHgwMDYyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBycyxybiAqLwotICB7IDB4MDA3MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcmUscm4gKi8KLSAgeyAweDAwODIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIwX2Jhbmsscm4gKi8KLSAgeyAweDAwOTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIxX2Jhbmsscm4gKi8KLSAgeyAweDAwYTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIyX2Jhbmsscm4gKi8KLSAgeyAweDAwYjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIzX2Jhbmsscm4gKi8KLSAgeyAweDAwYzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI0X2Jhbmsscm4gKi8KLSAgeyAweDAwZDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI1X2Jhbmsscm4gKi8KLSAgeyAweDAwZTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI2X2Jhbmsscm4gKi8KLSAgeyAweDAwZjIsIFNFVFMxIHwgVVNFU1NQIH0JCQkvKiBzdGMgcjdfYmFuayxybiAqLwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAyW10gPQotewotICB7IDB4MDAwMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgPHNwZWNpYWxfcmVnPixybiAqLwotICB7IDB4MDAwNCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA1LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lncgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDYsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YubCBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbXVsLmwgcm0scm4gKi8KLSAgeyAweDAwMGMsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBkLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmwgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMubCBAcm0rLEBybisgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTBbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUwMCksIDB4ZmZmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMDEpLCAweGYwZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTAyKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTEwW10gPQotewotICB7IDB4MTAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0JLyogbW92Lmwgcm0sQChkaXNwLHJuKSAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTEwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTIwW10gPQotewotICB7IDB4MjAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBybSxAcm4gKi8KLSAgeyAweDIwMDEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92Lncgcm0sQHJuICovCi0gIHsgMHgyMDAyLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIHJtLEBybiAqLwotICB7IDB4MjAwNCwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92LmIgcm0sQC1ybiAqLwotICB7IDB4MjAwNSwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lncgcm0sQC1ybiAqLwotICB7IDB4MjAwNiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lmwgcm0sQC1ybiAqLwotICB7IDB4MjAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBkaXYwcyAqLwotICB7IDB4MjAwOCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogdHN0IHJtLHJuICovCi0gIHsgMHgyMDA5LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFuZCBybSxybiAqLwotICB7IDB4MjAwYSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB4b3Igcm0scm4gKi8KLSAgeyAweDIwMGIsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogb3Igcm0scm4gKi8KLSAgeyAweDIwMGMsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9zdHIgcm0scm4gKi8KLSAgeyAweDIwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeHRyY3Qgcm0scm4gKi8KLSAgeyAweDIwMGUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bHUudyBybSxybiAqLwotICB7IDB4MjAwZiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CQkvKiBtdWxzLncgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTJbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUyMCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUzMFtdID0KLXsKLSAgeyAweDMwMDAsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9lcSBybSxybiAqLwotICB7IDB4MzAwMiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hzIHJtLHJuICovCi0gIHsgMHgzMDAzLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ2Ugcm0scm4gKi8KLSAgeyAweDMwMDQsIFNFVFNTUCB8IFVTRVNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJLyogZGl2MSBybSxybiAqLwotICB7IDB4MzAwNSwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHUubCBybSxybiAqLwotICB7IDB4MzAwNiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hpIHJtLHJuICovCi0gIHsgMHgzMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ3Qgcm0scm4gKi8KLSAgeyAweDMwMDgsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogc3ViIHJtLHJuICovCi0gIHsgMHgzMDBhLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogc3ViYyBybSxybiAqLwotICB7IDB4MzAwYiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIHN1YnYgcm0scm4gKi8KLSAgeyAweDMwMGMsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogYWRkIHJtLHJuICovCi0gIHsgMHgzMDBkLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBkbXVscy5sIHJtLHJuICovCi0gIHsgMHgzMDBlLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogYWRkYyBybSxybiAqLwotICB7IDB4MzAwZiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0JLyogYWRkdiBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlM1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTMwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQwW10gPQotewotICB7IDB4NDAwMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsbCBybiAqLwotICB7IDB4NDAwMSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsciBybiAqLwotICB7IDB4NDAwMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2gsQC1ybiAqLwotICB7IDB4NDAwNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90bCBybiAqLwotICB7IDB4NDAwNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90ciBybiAqLwotICB7IDB4NDAwNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNoICovCi0gIHsgMHg0MDA4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDIgcm4gKi8KLSAgeyAweDQwMDksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyMiBybiAqLwotICB7IDB4NDAwYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjaCAqLwotICB7IDB4NDAwYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyoganNyIEBybiAqLwotICB7IDB4NDAxMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogZHQgcm4gKi8KLSAgeyAweDQwMTEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogY21wL3B6IHJuICovCi0gIHsgMHg0MDEyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgbWFjbCxALXJuICovCi0gIHsgMHg0MDE0LCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIHNldHJjIHJtICovCi0gIHsgMHg0MDE1LCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9wbCBybiAqLwotICB7IDB4NDAxNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNsICovCi0gIHsgMHg0MDE4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDggcm4gKi8KLSAgeyAweDQwMTksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyOCBybiAqLwotICB7IDB4NDAxYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjbCAqLwotICB7IDB4NDAxYiwgTE9BRCB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiB0YXMuYiBAcm4gKi8KLSAgeyAweDQwMjAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYWwgcm4gKi8KLSAgeyAweDQwMjEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYXIgcm4gKi8KLSAgeyAweDQwMjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBwcixALXJuICovCi0gIHsgMHg0MDI0LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNsIHJuICovCi0gIHsgMHg0MDI1LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNyIHJuICovCi0gIHsgMHg0MDI2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLHByICovCi0gIHsgMHg0MDI4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDE2IHJuICovCi0gIHsgMHg0MDI5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjE2IHJuICovCi0gIHsgMHg0MDJhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxwciAqLwotICB7IDB4NDAyYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyogam1wIEBybiAqLwotICB7IDB4NDA1MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIGZwdWwsQC1ybiAqLwotICB7IDB4NDA1NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHVsICovCi0gIHsgMHg0MDVhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLGZwdWwgKi8KLSAgeyAweDQwNjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHNjciAvIGRzcixALXJuICovCi0gIHsgMHg0MDY2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGZwc2NyIC8gZHNyICovCi0gIHsgMHg0MDZhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxmcHNjciAvIGxkcyBybSxkc3IgKi8KLSAgeyAweDQwNzIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBhMCxALXJuICovCi0gIHsgMHg0MDc2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGEwICovCi0gIHsgMHg0MDdhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLGEwICovCi0gIHsgMHg0MDgyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgeDAsQC1ybiAqLwotICB7IDB4NDA4NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyx4MCAqLwotICB7IDB4NDA4YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSx4MCAqLwotICB7IDB4NDA5MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIHgxLEAtcm4gKi8KLSAgeyAweDQwOTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSsseDEgKi8KLSAgeyAweDQwOWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzLmwgcm0seDEgKi8KLSAgeyAweDQwYTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCB5MCxALXJuICovCi0gIHsgMHg0MGE2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLHkwICovCi0gIHsgMHg0MGFhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLHkwICovCi0gIHsgMHg0MGIyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgeTEsQC1ybiAqLwotICB7IDB4NDBiNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyx5MSAqLwotICB7IDB4NDBiYSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkcy5sIHJtLHkxICovCi0jaWYgMCAvKiBUaGVzZSBncm91cHMgc2l4dGVlbiBpbnNucyBjYW4gYmUKLSAgICAgICAgIGhhbmRsZWQgd2l0aCBvbmUgdGFibGUgZW50cnkgZWFjaCBiZWxvdy4gICovCi0gIHsgMHg0MDAzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3IsQC1ybiAqLwotICB7IDB4NDAxMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIGdicixALXJuICovCi0gIHsgMHg0MDIzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgdmJyLEAtcm4gKi8KLSAgeyAweDQwMzMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzc3IsQC1ybiAqLwotICB7IDB4NDA0MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNwYyxALXJuICovCi0gIHsgMHg0MDUzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgbW9kLEAtcm4gKi8KLSAgeyAweDQwNjMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBycyxALXJuICovCi0gIHsgMHg0MDczLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgcmUsQC1ybiAqLwotICB7IDB4NDA4MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHIwX2JhbmssQC1ybiAqLwotICAuLgotICB7IDB4NDBmMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHI3X2JhbmssQC1ybiAqLwotCi0gIHsgMHg0MDA3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNyICovCi0gIHsgMHg0MDE3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLGdiciAqLwotICB7IDB4NDAyNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyx2YnIgKi8KLSAgeyAweDQwMzcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3NyICovCi0gIHsgMHg0MDQ3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNwYyAqLwotICB7IDB4NDA1NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxtb2QgKi8KLSAgeyAweDQwNjcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscnMgKi8KLSAgeyAweDQwNzcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscmUgKi8KLSAgeyAweDQwODcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscjBfYmFuayAqLwotICAuLgotICB7IDB4NDBmNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxyN19iYW5rICovCi0KLSAgeyAweDQwMGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNyICovCi0gIHsgMHg0MDFlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxnYnIgKi8KLSAgeyAweDQwMmUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHZiciAqLwotICB7IDB4NDAzZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3NyICovCi0gIHsgMHg0MDRlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzcGMgKi8KLSAgeyAweDQwNWUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLG1vZCAqLwotICB7IDB4NDA2ZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0scnMgKi8KLSAgeyAweDQwN2UsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZGMgcm0scmUgKi8KLSAgeyAweDQwOGUsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZGMgcm0scjBfYmFuayAqLwotICAuLgotICB7IDB4NDBmZSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkYyBybSxyN19iYW5rICovCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQxW10gPQotewotICB7IDB4NDAwMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIDxzcGVjaWFsX3JlZz4sQC1ybiAqLwotICB7IDB4NDAwNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyw8c3BlY2lhbF9yZWc+ICovCi0gIHsgMHg0MDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHNoYWQgcm0scm4gKi8KLSAgeyAweDQwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogc2hsZCBybSxybiAqLwotICB7IDB4NDAwZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sPHNwZWNpYWxfcmVnPiAqLwotICB7IDB4NDAwZiwgTE9BRHxTRVRTMXxTRVRTMnxTRVRTU1B8VVNFUzF8VVNFUzJ8VVNFU1NQIH0sIC8qIG1hYy53IEBybSssQHJuKyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTQwKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU0MSksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU1MFtdID0KLXsKLSAgeyAweDUwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0JLyogbW92LmwgQChkaXNwLHJtKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTUwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTYwW10gPQotewotICB7IDB4NjAwMCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5iIEBybSxybiAqLwotICB7IDB4NjAwMSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IEBybSxybiAqLwotICB7IDB4NjAwMiwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIEBybSxybiAqLwotICB7IDB4NjAwMywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG1vdiBybSxybiAqLwotICB7IDB4NjAwNCwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YuYiBAcm0rLHJuICovCi0gIHsgMHg2MDA1LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi53IEBybSsscm4gKi8KLSAgeyAweDYwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmwgQHJtKyxybiAqLwotICB7IDB4NjAwNywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5vdCBybSxybiAqLwotICB7IDB4NjAwOCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAuYiBybSxybiAqLwotICB7IDB4NjAwOSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAudyBybSxybiAqLwotICB7IDB4NjAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBuZWdjIHJtLHJuICovCi0gIHsgMHg2MDBiLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbmVnIHJtLHJuICovCi0gIHsgMHg2MDBjLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS5iIHJtLHJuICovCi0gIHsgMHg2MDBkLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS53IHJtLHJuICovCi0gIHsgMHg2MDBlLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0cy5iIHJtLHJuICovCi0gIHsgMHg2MDBmLCBTRVRTMSB8IFVTRVMyIH0JCQkvKiBleHRzLncgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTZbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU2MCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU3MFtdID0KLXsKLSAgeyAweDcwMDAsIFNFVFMxIHwgVVNFUzEgfQkJLyogYWRkICNpbW0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTdbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU3MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU4MFtdID0KLXsKLSAgeyAweDgwMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgcjAsQChkaXNwLHJuKSAqLwotICB7IDB4ODEwMCwgU1RPUkUgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyByMCxAKGRpc3Ascm4pICovCi0gIHsgMHg4MjAwLCBTRVRTU1AgfSwJCQkvKiBzZXRyYyAjaW1tICovCi0gIHsgMHg4NDAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFUzIgfSwJLyogbW92LmIgQChkaXNwLHJtKSxyMCAqLwotICB7IDB4ODUwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi53IEAoZGlzcCxybikscjAgKi8KLSAgeyAweDg4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJLyogY21wL2VxICNpbW0scjAgKi8KLSAgeyAweDg5MDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYnQgbGFiZWwgKi8KLSAgeyAweDhiMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYmYgbGFiZWwgKi8KLSAgeyAweDhjMDAsIFNFVFNTUCB9LAkJCS8qIGxkcnMgQChkaXNwLHBjKSAqLwotICB7IDB4OGQwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfSwJLyogYnQvcyBsYWJlbCAqLwotICB7IDB4OGUwMCwgU0VUU1NQIH0sCQkJLyogbGRyZSBAKGRpc3AscGMpICovCi0gIHsgMHg4ZjAwLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9CS8qIGJmL3MgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZThbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU4MCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU5MFtdID0KLXsKLSAgeyAweDkwMDAsIExPQUQgfCBTRVRTMSB9CS8qIG1vdi53IEAoZGlzcCxwYykscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTlbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU5MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVhMFtdID0KLXsKLSAgeyAweGEwMDAsIEJSQU5DSCB8IERFTEFZIH0JLyogYnJhIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVhW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYjBbXSA9Ci17Ci0gIHsgMHhiMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJzciBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWIwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWMwW10gPQotewotICB7IDB4YzAwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMTAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LncgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMyMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzMwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkJLyogdHJhcGEgI2ltbSAqLwotICB7IDB4YzQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmIgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNjAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzcwMCwgU0VUU1IwIH0sCQkJCS8qIG1vdmEgQChkaXNwLHBjKSxyMCAqLwotICB7IDB4YzgwMCwgU0VUU1NQIHwgVVNFU1IwIH0sCQkJLyogdHN0ICNpbW0scjAgKi8KLSAgeyAweGM5MDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIGFuZCAjaW1tLHIwICovCi0gIHsgMHhjYTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiB4b3IgI2ltbSxyMCAqLwotICB7IDB4Y2IwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogb3IgI2ltbSxyMCAqLwotICB7IDB4Y2MwMCwgTE9BRCB8IFNFVFNTUCB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiB0c3QuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2QwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIGFuZC5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZTAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogeG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNmMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9CS8qIG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVjMCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVkMFtdID0KLXsKLSAgeyAweGQwMDAsIExPQUQgfCBTRVRTMSB9CQkvKiBtb3YubCBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVkW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZDApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZTBbXSA9Ci17Ci0gIHsgMHhlMDAwLCBTRVRTMSB9CQkvKiBtb3YgI2ltbSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWUwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYwW10gPQotewotICB7IDB4ZjAwMCwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmYWRkIGZtLGZuICovCi0gIHsgMHhmMDAxLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZzdWIgZm0sZm4gKi8KLSAgeyAweGYwMDIsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZm11bCBmbSxmbiAqLwotICB7IDB4ZjAwMywgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmZGl2IGZtLGZuICovCi0gIHsgMHhmMDA0LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZXEgZm0sZm4gKi8KLSAgeyAweGYwMDUsIFNFVFNTUCB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmNtcC9ndCBmbSxmbiAqLwotICB7IDB4ZjAwNiwgTE9BRCB8IFNFVFNGMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIGZtb3YucyBAKHIwLHJtKSxmbiAqLwotICB7IDB4ZjAwNywgU1RPUkUgfCBVU0VTMSB8IFVTRVNGMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgZm0sQChyMCxybikgKi8KLSAgeyAweGYwMDgsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB9LAkJLyogZm1vdi5zIEBybSxmbiAqLwotICB7IDB4ZjAwOSwgTE9BRCB8IFNFVFMyIHwgU0VUU0YxIHwgVVNFUzIgfSwJLyogZm1vdi5zIEBybSssZm4gKi8KLSAgeyAweGYwMGEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfSwJCS8qIGZtb3YucyBmbSxAcm4gKi8KLSAgeyAweGYwMGIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNGMiB9LAkvKiBmbW92LnMgZm0sQC1ybiAqLwotICB7IDB4ZjAwYywgU0VUU0YxIHwgVVNFU0YyIH0sCQkJLyogZm1vdiBmbSxmbiAqLwotICB7IDB4ZjAwZSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIHwgVVNFU0YwIH0JLyogZm1hYyBmMCxmbSxmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZjFbXSA9Ci17Ci0gIHsgMHhmMDBkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZnN0cyBmcHVsLGZuICovCi0gIHsgMHhmMDFkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZmxkcyBmbixmcHVsICovCi0gIHsgMHhmMDJkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZmxvYXQgZnB1bCxmbiAqLwotICB7IDB4ZjAzZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZ0cmMgZm4sZnB1bCAqLwotICB7IDB4ZjA0ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZuZWcgZm4gKi8KLSAgeyAweGYwNWQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmYWJzIGZuICovCi0gIHsgMHhmMDZkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZnNxcnQgZm4gKi8KLSAgeyAweGYwN2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHN0L25hbiBmbiAqLwotICB7IDB4ZjA4ZCwgU0VUU0YxIH0sCQkvKiBmbGRpMCBmbiAqLwotICB7IDB4ZjA5ZCwgU0VUU0YxIH0JCS8qIGZsZGkxIGZuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVmW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZjApLCAweGYwMGYgfSwKLSAgeyBNQVAgKHNoX29wY29kZWYxKSwgMHhmMGZmIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlIHNoX29wY29kZXNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUwKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUzKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU2KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTgpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU5KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVjKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmKSB9Ci19OwotCi0vKiBUaGUgZG91YmxlIGRhdGEgdHJhbnNmZXIgLyBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc25zIGFyZSBub3QKLSAgIGRlc2NyaWJlZCBoZXJlLiAgVGhpcyB3aWxsIGNhdXNlIHNoX2FsaWduX2xvYWRfc3BhbiB0byBsZWF2ZSB0aGVtIGFsb25lLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfZHNwX29wY29kZWYwW10gPQotewotICB7IDB4ZjQwMCwgVVNFU0FTIHwgU0VUU0FTIHwgTE9BRCB8IFNFVFNTUCB9LAkvKiBtb3ZzLnggQC1hcyxkcyAqLwotICB7IDB4ZjQwMSwgVVNFU0FTIHwgU0VUU0FTIHwgU1RPUkUgfCBVU0VTU1AgfSwJLyogbW92cy54IGRzLEAtYXMgKi8KLSAgeyAweGY0MDQsIFVTRVNBUyB8IExPQUQgfCBTRVRTU1AgfSwJCS8qIG1vdnMueCBAYXMsZHMgKi8KLSAgeyAweGY0MDUsIFVTRVNBUyB8IFNUT1JFIHwgVVNFU1NQIH0sCQkvKiBtb3ZzLnggZHMsQGFzICovCi0gIHsgMHhmNDA4LCBVU0VTQVMgfCBTRVRTQVMgfCBMT0FEIHwgU0VUU1NQIH0sCS8qIG1vdnMueCBAYXMrLGRzICovCi0gIHsgMHhmNDA5LCBVU0VTQVMgfCBTRVRTQVMgfCBTVE9SRSB8IFVTRVNTUCB9LAkvKiBtb3ZzLnggZHMsQGFzKyAqLwotICB7IDB4ZjQwYywgVVNFU0FTIHwgU0VUU0FTIHwgTE9BRCB8IFNFVFNTUCB8IFVTRVNSOCB9LAkvKiBtb3ZzLnggQGFzK3I4LGRzICovCi0gIHsgMHhmNDBkLCBVU0VTQVMgfCBTRVRTQVMgfCBTVE9SRSB8IFVTRVNTUCB8IFVTRVNSOCB9CS8qIG1vdnMueCBkcyxAYXMrcjggKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX2RzcF9vcGNvZGVmW10gPQotewotICB7IE1BUCAoc2hfZHNwX29wY29kZWYwKSwgMHhmYzBkIH0KLX07Ci0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBHaXZlbiBhbiBpbnN0cnVjdGlvbiwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwotICAgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gIFJldHVybiBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqCi1zaF9pbnNuX2luZm8gKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICBjb25zdCBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlICptYWo7Ci0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbiwgKm1pbmVuZDsKLQotICBtYWogPSAmc2hfb3Bjb2Rlc1soaW5zbiAmIDB4ZjAwMCkgPj4gMTJdOwotICBtaW4gPSBtYWotPm1pbm9yX29wY29kZXM7Ci0gIG1pbmVuZCA9IG1pbiArIG1hai0+Y291bnQ7Ci0gIGZvciAoOyBtaW4gPCBtaW5lbmQ7IG1pbisrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AsICpvcGVuZDsKLQotICAgICAgbCA9IGluc24gJiBtaW4tPm1hc2s7Ci0gICAgICBvcCA9IG1pbi0+b3Bjb2RlczsKLSAgICAgIG9wZW5kID0gb3AgKyBtaW4tPmNvdW50OwotCi0gICAgICAvKiBTaW5jZSB0aGUgb3Bjb2RlcyB0YWJsZXMgYXJlIHNvcnRlZCwgd2UgY291bGQgdXNlIGEgYmluYXJ5Ci0gICAgICAgICBzZWFyY2ggaGVyZSBpZiB0aGUgY291bnQgd2VyZSBhYm92ZSBzb21lIGN1dG9mZiB2YWx1ZS4gICovCi0gICAgICBmb3IgKDsgb3AgPCBvcGVuZDsgb3ArKykKLQlpZiAob3AtPm9wY29kZSA9PSBsKQotCSAgcmV0dXJuIG9wOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsgIAotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIG9yIHNldHMgYSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaW5zbiwgb3AsIHJlZykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotewotICBpZiAoc2hfaW5zbl91c2VzX3JlZyAoaW5zbiwgb3AsIHJlZykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIHNoX2luc25fc2V0c19yZWcgKGluc24sIG9wLCByZWcpOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19yZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICBpZiAoKGYgJiBVU0VTMSkgIT0gMAotICAgICAgJiYgVVNFUzFfUkVHIChpbnNuKSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVMyKSAhPSAwCi0gICAgICAmJiBVU0VTMl9SRUcgKGluc24pID09IHJlZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU1IwKSAhPSAwCi0gICAgICAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU0FTKSAmJiByZWcgPT0gVVNFU0FTX1JFRyAoaW5zbikpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNSOCkgJiYgcmVnID09IDgpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiBzZXRzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fc2V0c19yZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICBpZiAoKGYgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgU0VUUzFfUkVHIChpbnNuKSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFNFVFMyKSAhPSAwCi0gICAgICAmJiBTRVRTMl9SRUcgKGluc24pID09IHJlZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgU0VUU0FTKSAmJiByZWcgPT0gU0VUU0FTX1JFRyAoaW5zbikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIG9yIHNldHMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbl91c2VzX29yX3NldHNfZnJlZyAoaW5zbiwgb3AsIHJlZykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotewotICBpZiAoc2hfaW5zbl91c2VzX2ZyZWcgKGluc24sIG9wLCByZWcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzaF9pbnNuX3NldHNfZnJlZyAoaW5zbiwgb3AsIHJlZyk7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHVzZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfZnJlZyAoaW5zbiwgb3AsIGZyZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGZyZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgLyogV2UgY2FuJ3QgdGVsbCBpZiB0aGlzIGlzIGEgZG91YmxlLXByZWNpc2lvbiBpbnNuLCBzbyBqdXN0IHBsYXkgc2FmZQotICAgICBhbmQgYXNzdW1lIHRoYXQgaXQgbWlnaHQgYmUuICBTbyBub3Qgb25seSBoYXZlIHdlIHRlc3QgRlJFRyBhZ2FpbnN0Ci0gICAgIGl0c2VsZiwgYnV0IGFsc28gZXZlbiBGUkVHIGFnYWluc3QgRlJFRysxIC0gaWYgdGhlIHVzaW5nIGluc24gdXNlcwotICAgICBqdXN0IHRoZSBsb3cgcGFydCBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgLSBidXQgYWxzbyBhbiBvZGQKLSAgICAgRlJFRyBhZ2FpbnN0IEZSRUctMSAtICBpZiB0aGUgc2V0dGluZyBpbnNuIHNldHMganVzdCB0aGUgbG93IHBhcnQKLSAgICAgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlLgotICAgICBTbyB3aGF0IHRoaXMgYWxsIGJvaWxzIGRvd24gdG8gaXMgdGhhdCB3ZSBoYXZlIHRvIGlnbm9yZSB0aGUgbG93ZXN0Ci0gICAgIGJpdCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgCi0gIGlmICgoZiAmIFVTRVNGMSkgIT0gMAotICAgICAgJiYgKFVTRVNGMV9SRUcgKGluc24pICYgMHhlKSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMikgIT0gMAotICAgICAgJiYgKFVTRVNGMl9SRUcgKGluc24pICYgMHhlKSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMCkgIT0gMAotICAgICAgJiYgZnJlZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gc2V0cyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fc2V0c19mcmVnIChpbnNuLCBvcCwgZnJlZykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgZnJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICAvKiBXZSBjYW4ndCB0ZWxsIGlmIHRoaXMgaXMgYSBkb3VibGUtcHJlY2lzaW9uIGluc24sIHNvIGp1c3QgcGxheSBzYWZlCi0gICAgIGFuZCBhc3N1bWUgdGhhdCBpdCBtaWdodCBiZS4gIFNvIG5vdCBvbmx5IGhhdmUgd2UgdGVzdCBGUkVHIGFnYWluc3QKLSAgICAgaXRzZWxmLCBidXQgYWxzbyBldmVuIEZSRUcgYWdhaW5zdCBGUkVHKzEgLSBpZiB0aGUgdXNpbmcgaW5zbiB1c2VzCi0gICAgIGp1c3QgdGhlIGxvdyBwYXJ0IG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSAtIGJ1dCBhbHNvIGFuIG9kZAotICAgICBGUkVHIGFnYWluc3QgRlJFRy0xIC0gIGlmIHRoZSBzZXR0aW5nIGluc24gc2V0cyBqdXN0IHRoZSBsb3cgcGFydAotICAgICBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUuCi0gICAgIFNvIHdoYXQgdGhpcyBhbGwgYm9pbHMgZG93biB0byBpcyB0aGF0IHdlIGhhdmUgdG8gaWdub3JlIHRoZSBsb3dlc3QKLSAgICAgYml0IG9mIHRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICAgICAKLSAgaWYgKChmICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiAoU0VUU0YxX1JFRyAoaW5zbikgJiAweGUpID09IChmcmVnICYgMHhlKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGluc3RydWN0aW9ucyBJMSBhbmQgSTIgY29uZmxpY3QsIGFzc3VtaW5nIEkxIGNvbWVzCi0gICBiZWZvcmUgSTIuICBPUDEgYW5kIE9QMiBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgc2hfb3Bjb2RlIHN0cnVjdHVyZXMuCi0gICBUaGlzIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCBvciBmYWxzZSBpZiB0aGUKLSAgIGluc3RydWN0aW9ucyBjYW4gYmUgc3dhcHBlZCBzYWZlbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbnNfY29uZmxpY3QgKGkxLCBvcDEsIGkyLCBvcDIpCi0gICAgIHVuc2lnbmVkIGludCBpMTsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AxOwotICAgICB1bnNpZ25lZCBpbnQgaTI7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMjsKLXsKLSAgdW5zaWduZWQgaW50IGYxLCBmMjsKLQotICBmMSA9IG9wMS0+ZmxhZ3M7Ci0gIGYyID0gb3AyLT5mbGFnczsKLQotICAvKiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuCi0gICAgIEZJWE1FOiBzaG91bGRuJ3QgdGVzdCByYXcgb3Bjb2RlcyBoZXJlLiAgKi8KLSAgaWYgKCgoaTEgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTIgJiAweGYwMDApID09IDB4ZjAwMCkKLSAgICAgIHx8ICgoaTIgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTEgJiAweGYwMDApID09IDB4ZjAwMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDAKLSAgICAgIHx8IChmMiAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCgoZjEgfCBmMikgJiBTRVRTU1ApCi0gICAgICAmJiAoZjEgJiAoU0VUU1NQIHwgVVNFU1NQKSkKLSAgICAgICYmIChmMiAmIChTRVRTU1AgfCBVU0VTU1ApKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUUzEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTIsIG9wMiwgU0VUUzFfUkVHIChpMSkpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTIsIG9wMiwgU0VUUzJfUkVHIChpMSkpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGkyLCBvcDIsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU0FTKQotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnIChpMiwgb3AyLCBTRVRTQVNfUkVHIChpMSkpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19mcmVnIChpMiwgb3AyLCBTRVRTRjFfUkVHIChpMSkpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjIgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnIChpMSwgb3AxLCBTRVRTMV9SRUcgKGkyKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTMikgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnIChpMSwgb3AxLCBTRVRTMl9SRUcgKGkyKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTEsIG9wMSwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTQVMpCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGkxLCBvcDEsIFNFVFNBU19SRUcgKGkyKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX2ZyZWcgKGkxLCBvcDEsIFNFVFNGMV9SRUcgKGkyKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBkbyBub3QgY29uZmxpY3QuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEkxIGlzIGEgbG9hZCBpbnN0cnVjdGlvbiwgYW5kIEkyIGlzIHNvbWUgb3RoZXIgaW5zdHJ1Y3Rpb24uICBSZXR1cm4KLSAgIHRydWUgaWYgSTEgbG9hZHMgYSByZWdpc3RlciB3aGljaCBJMiB1c2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2xvYWRfdXNlIChpMSwgb3AxLCBpMiwgb3AyKQotICAgICB1bnNpZ25lZCBpbnQgaTE7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKLSAgICAgdW5zaWduZWQgaW50IGkyOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Ci17Ci0gIHVuc2lnbmVkIGludCBmMTsKLQotICBmMSA9IG9wMS0+ZmxhZ3M7Ci0KLSAgaWYgKChmMSAmIExPQUQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIGJvdGggU0VUUzEgYW5kIFNFVFNTUCBhcmUgc2V0LCB0aGF0IG1lYW5zIGEgbG9hZCB0byBhIHNwZWNpYWwKLSAgICAgcmVnaXN0ZXIgdXNpbmcgcG9zdGluY3JlbWVudCBhZGRyZXNzaW5nIG1vZGUsIHdoaWNoIHdlIGRvbid0IGNhcmUKLSAgICAgYWJvdXQgaGVyZS4gICovCi0gIGlmICgoZjEgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgKGYxICYgU0VUU1NQKSA9PSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVHJ5IHRvIGFsaWduIGxvYWRzIGFuZCBzdG9yZXMgd2l0aGluIGEgc3BhbiBvZiBtZW1vcnkuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgYm90aCB0aGUgRUxGIGFuZCB0aGUgQ09GRiBzaCB0YXJnZXRzLiAgQUJGRCBhbmQgU0VDIGFyZQotICAgdGhlIEJGRCBhbmQgc2VjdGlvbiB3ZSBhcmUgZXhhbWluaW5nLiAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mCi0gICB0aGUgc2VjdGlvbi4gIFNXQVAgaXMgdGhlIHJvdXRpbmUgdG8gY2FsbCB0byBzd2FwIHR3byBpbnN0cnVjdGlvbnMuCi0gICBSRUxPQ1MgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCB0byBiZQotICAgcGFzc2VkIHRvIFNXQVAuICBQTEFCRUwgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhYmVsIGluIGEKLSAgIHNvcnRlZCBsaXN0IG9mIGxhYmVsczsgTEFCRUxfRU5EIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBTVEFSVCBhbmQKLSAgIFNUT1AgYXJlIHRoZSByYW5nZSBvZiBtZW1vcnkgdG8gZXhhbWluZS4gIElmIGEgc3dhcCBpcyBtYWRlLAotICAgKlBTV0FQUEVEIGlzIHNldCB0byB0cnVlLiAgKi8KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWJvb2xlYW4KLV9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzd2FwLCByZWxvY3MsCi0JCQkgcGxhYmVsLCBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKCpzd2FwKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF92bWEgKipwbGFiZWw7Ci0gICAgIGJmZF92bWEgKmxhYmVsX2VuZDsKLSAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgYmZkX3ZtYSBzdG9wOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgaW50IGRzcCA9IChhYmZkLT5hcmNoX2luZm8tPm1hY2ggPT0gYmZkX21hY2hfc2hfZHNwCi0JICAgICB8fCBhYmZkLT5hcmNoX2luZm8tPm1hY2ggPT0gYmZkX21hY2hfc2gzX2RzcCk7Ci0gIGJmZF92bWEgaTsKLQotICAvKiBUaGUgU0g0IGhhcyBhIEhhcnZhcmQgYXJjaGl0ZWN0dXJlLCBoZW5jZSBhbGlnbmluZyBsb2FkcyBpcyBub3QKLSAgICAgZGVzaXJhYmxlLiAgSW4gZmFjdCwgaXQgaXMgY291bnRlci1wcm9kdWN0aXZlLCBzaW5jZSBpdCBpbnRlcmZlcmVzCi0gICAgIHdpdGggdGhlIHNjaGVkdWxlcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLiAgKi8KLSAgaWYgKGFiZmQtPmFyY2hfaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9zaDQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgc2hbM10tZHNwIGNvZGUsIHN3YXAgdGhlIEZQVSBpbnN0cnVjdGlvbnMgZm9yIERTUAotICAgICBpbnN0cnVjdGlvbnMuICAqLwotICBpZiAoZHNwKQotICAgIHsKLSAgICAgIHNoX29wY29kZXNbMHhmXS5taW5vcl9vcGNvZGVzID0gc2hfZHNwX29wY29kZWY7Ci0gICAgICBzaF9vcGNvZGVzWzB4Zl0uY291bnQgPSBzaXplb2Ygc2hfZHNwX29wY29kZWYgLyBzaXplb2Ygc2hfZHNwX29wY29kZWY7Ci0gICAgfQotCi0gIC8qIEluc3RydWN0aW9ucyBzaG91bGQgYmUgYWxpZ25lZCBvbiAyIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmICgoc3RhcnQgJiAxKSA9PSAxKQotICAgICsrc3RhcnQ7Ci0KLSAgLyogTm93IGxvb2sgdGhyb3VnaCB0aGUgdW5hbGlnbmVkIGFkZHJlc3Nlcy4gICovCi0gIGkgPSBzdGFydDsKLSAgaWYgKChpICYgMikgPT0gMCkKLSAgICBpICs9IDI7Ci0gIGZvciAoOyBpIDwgc3RvcDsgaSArPSA0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgICB1bnNpZ25lZCBpbnQgcHJldl9pbnNuID0gMDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXZfb3AgPSBOVUxMOwotCi0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpKTsKLSAgICAgIG9wID0gc2hfaW5zbl9pbmZvIChpbnNuKTsKLSAgICAgIGlmIChvcCA9PSBOVUxMCi0JICB8fCAob3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2FkIG9yIHN0b3JlIHdoaWNoIGlzIG5vdCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgICAgIHdoaWxlICgqcGxhYmVsIDwgbGFiZWxfZW5kICYmICoqcGxhYmVsIDwgaSkKLQkrKypwbGFiZWw7Ci0KLSAgICAgIGlmIChpID4gc3RhcnQpCi0JewotCSAgcHJldl9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gMik7Ci0JICAvKiBJZiBJTlNOIGlzIHRoZSBmaWVsZCBiIG9mIGEgcGFyYWxsZWwgcHJvY2Vzc2luZyBpbnNuLCBpdCBpcyBub3QKLQkgICAgIGEgbG9hZCAvIHN0b3JlIGFmdGVyIGFsbC4gIE5vdGUgdGhhdCB0aGUgdGVzdCBoZXJlIG1pZ2h0IG1pc3Rha2UKLQkgICAgIHRoZSBmaWVsZF9iIG9mIGEgcGNvcHkgaW5zbiBmb3IgdGhlIHN0YXJ0aW5nIGNvZGUgb2YgYSBwYXJhbGxlbAotCSAgICAgcHJvY2Vzc2luZyBpbnNuOyB0aGlzIG1pZ2h0IG1pc3MgYSBzd2FwcGluZyBvcHBvcnR1bml0eSwgYnV0IGF0Ci0JICAgICBsZWFzdCB3ZSdyZSBvbiB0aGUgc2FmZSBzaWRlLiAgKi8KLQkgIGlmIChkc3AgJiYgKHByZXZfaW5zbiAmIDB4ZmMwMCkgPT0gMHhmODAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQ2hlY2sgaWYgcHJldl9pbnNuIGlzIGFjdHVhbGx5IHRoZSBmaWVsZCBiIG9mIGEgcGFyYWxsZWwKLQkgICAgIHByb2Nlc3NpbmcgaW5zbi4gIEFnYWluLCB0aGlzIGNhbiBnaXZlIGEgc3B1cmlvdXMgbWF0Y2gKLQkgICAgIGFmdGVyIGEgcGNvcHkuICAqLwotCSAgaWYgKGRzcCAmJiBpIC0gMiA+IHN0YXJ0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgcHByZXZfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDQpOwotCQotCSAgICAgIGlmICgocHByZXZfaW5zbiAmIDB4ZmMwMCkgPT0gMHhmODAwKQotCQlwcmV2X29wID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXByZXZfb3AgPSBzaF9pbnNuX2luZm8gKHByZXZfaW5zbik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJldl9vcCA9IHNoX2luc25faW5mbyAocHJldl9pbnNuKTsKLQotCSAgLyogSWYgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgaW4gYSBkZWxheSBzbG90LCB3ZQotCSAgICAgY2FuJ3Qgc3dhcC4gICovCi0JICBpZiAocHJldl9vcCA9PSBOVUxMCi0JICAgICAgfHwgKHByZXZfb3AtPmZsYWdzICYgREVMQVkpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChpID4gc3RhcnQKLQkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpKQotCSAgJiYgcHJldl9vcCAhPSBOVUxMCi0JICAmJiAocHJldl9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgJiYgISBzaF9pbnNuc19jb25mbGljdCAocHJldl9pbnNuLCBwcmV2X29wLCBpbnNuLCBvcCkpCi0JewotCSAgYm9vbGVhbiBvazsKLQotCSAgLyogVGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhIGxhYmVsLCBhbmQKLQkgICAgIHRoZXJlIGlzIGEgcHJldmlvdXMgaW5zdHJ1Y3Rpb247IFBSRVZfSU5TTiBpcyBub3QKLQkgICAgIGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sIGFuZCBQUkVWX0lOU04gYW5kCi0JICAgICBJTlNOIGRvIG5vdCBjb25mbGljdC4gICovCi0KLQkgIG9rID0gdHJ1ZTsKLQotCSAgaWYgKGkgPj0gc3RhcnQgKyA0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHByZXYyX2luc247Ci0JICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqcHJldjJfb3A7Ci0KLQkgICAgICBwcmV2Ml9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gNCk7Ci0JICAgICAgcHJldjJfb3AgPSBzaF9pbnNuX2luZm8gKHByZXYyX2luc24pOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaGFzIGEgZGVsYXkKLQkJIHNsb3QtLXRoYXQgaXMsIFBSRVZfSU5TTiBpcyBpbiBhIGRlbGF5IHNsb3QtLXdlCi0JCSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIGlmIChwcmV2Ml9vcCA9PSBOVUxMCi0JCSAgfHwgKHByZXYyX29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQotCQlvayA9IGZhbHNlOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaXMgYSBsb2FkLAotCQkgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaCBJTlNOIHVzZXMsIHRoZW4KLQkJIHB1dHRpbmcgSU5TTiBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbAotCQkgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IHRvCi0JCSBtYWtpbmcgdGhlIHN3YXAuICAqLwotCSAgICAgIGlmIChvawotCQkgICYmIChwcmV2Ml9vcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwCi0JCSAgJiYgc2hfbG9hZF91c2UgKHByZXYyX2luc24sIHByZXYyX29wLCBpbnNuLCBvcCkpCi0JCW9rID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKG9rKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpIC0gMikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcHN3YXBwZWQgPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkgKyAyKQotCSsrKnBsYWJlbDsKLQotICAgICAgaWYgKGkgKyAyIDwgc3RvcAotCSAgJiYgKCpwbGFiZWwgPj0gbGFiZWxfZW5kIHx8ICoqcGxhYmVsICE9IGkgKyAyKSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbmV4dF9pbnNuOwotCSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqbmV4dF9vcDsKLQotCSAgLyogVGhlcmUgaXMgYW4gaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGxvYWQvc3RvcmUKLQkgICAgIGluc3RydWN0aW9uLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSBhIGxhYmVsLiAgKi8KLQkgIG5leHRfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDIpOwotCSAgbmV4dF9vcCA9IHNoX2luc25faW5mbyAobmV4dF9pbnNuKTsKLQkgIGlmIChuZXh0X29wICE9IE5VTEwKLQkgICAgICAmJiAobmV4dF9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgICAgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKGluc24sIG9wLCBuZXh0X2luc24sIG5leHRfb3ApKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBvazsKLQotCSAgICAgIC8qIE5FWFRfSU5TTiBpcyBub3QgaXRzZWxmIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwKLQkJIGFuZCBpdCBkb2VzIG5vdCBjb25mbGljdCB3aXRoIElOU04uICAqLwotCi0JICAgICAgb2sgPSB0cnVlOwotCi0JICAgICAgLyogSWYgUFJFVl9JTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlcgotCQkgd2hpY2ggTkVYVF9JTlNOIHVzZXMsIHRoZW4gcHV0dGluZyBORVhUX0lOU04KLQkJIGltbWVkaWF0ZWx5IGFmdGVyIFBSRVZfSU5TTiB3aWxsIGNhdXNlIGEgcGlwZWxpbmUKLQkJIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgdGhpcyBzd2FwLiAgKi8KLQkgICAgICBpZiAocHJldl9vcCAhPSBOVUxMCi0JCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAotCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2X2luc24sIHByZXZfb3AsIG5leHRfaW5zbiwgbmV4dF9vcCkpCi0JCW9rID0gZmFsc2U7Ci0KLQkgICAgICAvKiBJZiBJTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaAotCQkgdGhlIGluc24gYWZ0ZXIgTkVYVF9JTlNOIHVzZXMsIHRoZW4gZG9pbmcgdGhlCi0JCSBzd2FwIHdpbGwgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vCi0JCSByZWFzb24gdG8gbWFrZSB0aGUgc3dhcC4gIEhvd2V2ZXIsIGlmIHRoZSBpbnNuCi0JCSBhZnRlciBORVhUX0lOU04gaXMgaXRzZWxmIGEgbG9hZCBvciBzdG9yZQotCQkgaW5zdHJ1Y3Rpb24sIHRoZW4gaXQgaXMgbWlzYWxpZ25lZCwgc28KLQkJIG9wdGltaXN0aWNhbGx5IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHN3YXBwZWQKLQkJIGl0c2VsZiwgYW5kIGp1c3QgbGl2ZSB3aXRoIHRoZSBwaXBlbGluZSBidWJibGUgaWYKLQkJIGl0IGlzbid0LiAgKi8KLQkgICAgICBpZiAob2sKLQkJICAmJiBpICsgNCA8IHN0b3AKLQkJICAmJiAob3AtPmZsYWdzICYgTE9BRCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGludCBuZXh0Ml9pbnNuOwotCQkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHQyX29wOwotCi0JCSAgbmV4dDJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDQpOwotCQkgIG5leHQyX29wID0gc2hfaW5zbl9pbmZvIChuZXh0Ml9pbnNuKTsKLQkJICBpZiAoKG5leHQyX29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JCSAgICAgICYmIHNoX2xvYWRfdXNlIChpbnNuLCBvcCwgbmV4dDJfaW5zbiwgbmV4dDJfb3ApKQotCQkgICAgb2sgPSBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKG9rKQotCQl7Ci0JCSAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICAqcHN3YXBwZWQgPSB0cnVlOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIG5vdCBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotLyogTG9vayBmb3IgbG9hZHMgYW5kIHN0b3JlcyB3aGljaCB3ZSBjYW4gYWxpZ24gdG8gZm91ciBieXRlCi0gICBib3VuZGFyaWVzLiAgU2VlIHRoZSBsb25nZXIgY29tbWVudCBhYm92ZSBzaF9yZWxheF9zZWN0aW9uIGZvciB3aHkKLSAgIHRoaXMgaXMgZGVzaXJhYmxlLiAgVGhpcyBzZXRzICpQU1dBUFBFRCBpZiBzb21lIGluc3RydWN0aW9uIHdhcwotICAgc3dhcHBlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKLSAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7Ci0KLSAgKnBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLwotICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGlmIChsYWJlbHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbGFiZWxfZW5kID0gbGFiZWxzOwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0xBQkVMKQotCXsKLQkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICArK2xhYmVsX2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIGN1cnJlbnRseSBhbHdheXMgb3V0cHV0cyByZWxvY3MgaW4KLSAgICAgYWRkcmVzcyBvcmRlci4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbCBuZWVkIHRvIHNvcnQKLSAgICAgdGhlIGxhYmVsIHZhbHVlcyBhbmQgdGhlIHJlbG9jcy4gICovCi0KLSAgbGFiZWwgPSBsYWJlbHM7Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFKQotCWNvbnRpbnVlOwotCi0gICAgICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQotICAgICAgZm9yIChpcmVsKys7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0RBVEEpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsIDwgaXJlbGVuZCkKLQlzdG9wID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotICAgICAgZWxzZQotCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX3N3YXBfaW5zbnMsCi0JCQkJICAgICAoUFRSKSBpbnRlcm5hbF9yZWxvY3MsICZsYWJlbCwKLQkJCQkgICAgIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobGFiZWxzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxhYmVscyAhPSBOVUxMKQotICAgIGZyZWUgKGxhYmVscyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCB0d28gU0ggaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3N3YXBfaW5zbnMgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIHJlbG9jczsKLSAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotCi0gIC8qIFN3YXAgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLSAgaTEgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBpMiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMiwgY29udGVudHMgKyBhZGRyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTEsIGNvbnRlbnRzICsgYWRkciArIDIpOwotCi0gIC8qIEFkanVzdCBhbGwgcmVsb2MgYWRkcmVzc2VzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZSwgYWRkOwotCi0gICAgICAvKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCB0eXBlcyBvZiByZWxvY3MgdGhhdCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICBhZGp1c3QuICBUaGVzZSByZWxvY3MgZG8gbm90IGFwcGx5IHRvIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsCi0gICAgICAgICBidXQgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSBpcmVsLT5yX3R5cGU7Ci0gICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCi0JICB8fCB0eXBlID09IFJfU0hfQ09ERQotCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKLQkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZwotICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcwotICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZwotICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCi0gICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWwtPnJfb2Zmc2V0OwotCSAgaWYgKG9mZiA9PSBhZGRyKQotCSAgICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgZWxzZSBpZiAob2ZmID09IGFkZHIgKyAyKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSAyOwotCX0KLQotICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyKQotCXsKLQkgIGlyZWwtPnJfdmFkZHIgKz0gMjsKLQkgIGFkZCA9IC0yOwotCX0KLSAgICAgIGVsc2UgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyICsgMikKLQl7Ci0JICBpcmVsLT5yX3ZhZGRyIC09IDI7Ci0JICBhZGQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQlhZGQgPSAwOwotCi0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX2J5dGUgKmxvYzsKLQkgIHVuc2lnbmVkIHNob3J0IGluc24sIG9pbnNuOwotCSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotCSAgbG9jID0gY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKLSAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCi0gICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCi0gICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCi0gICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKLSAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCi0JICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKLQkJewotCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCQkgIG9pbnNuID0gaW5zbjsKLQkJICBpbnNuICs9IGFkZCAvIDI7Ci0JCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIsCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIGEgbW9kaWZpY2F0aW9uIG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHdoaWNoCi0gICB3aWxsIGhhbmRsZSBTSCByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkgICAgIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QKLSAgICAgICAgIGJlIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgIT0gUl9TSF9JTU0zMgotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgJiYgcmVsLT5yX3R5cGUgIT0gUl9TSF9JTU0zMkNFCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX0lNQUdFQkFTRQotI2VuZGlmCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX1BDRElTUCkKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBpZiAoc3ltbmR4IDwgMAotCSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCWFkZGVuZCAtPSA0OwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPj0gU0hfQ09GRl9IT1dUT19DT1VOVCkKLQlob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaG93dG8gPSAmc2hfY29mZl9ob3d0b3NbcmVsLT5yX3R5cGVdOwotCi0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX0lNQUdFQkFTRSkKLQlhZGRlbmQgLT0gcGVfZGF0YSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSNlbmRpZgotICAgICAgCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZm9yIGFuIGludGVybmFsIFBDRElTUCByZWxvYy4gICovCi0JICBpZiAocmVsLT5yX3R5cGUgPT0gUl9TSF9QQ0RJU1ApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLAotCQkJCQlyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCXZhbCwgYWRkZW5kKTsKLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzID09IDAKLQkJICAgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgICAgbmFtZSA9IG9ial9jb2ZmX3N0cmluZ3MgKGlucHV0X2JmZCkgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotIAkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCW5hbWUgPSBidWY7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgc2hfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1zaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQlkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikgPT0gTlVMTAotICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiktPmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIG1lbWNweSAoZGF0YSwgY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiktPmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGlucHV0X2JmZCk7Ci0gICAgICBiZmRfYnl0ZSAqZXN5bSwgKmVzeW1lbmQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGZhbHNlLCAoYmZkX2J5dGUgKikgTlVMTCwKLQkJCSAgZmFsc2UsIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKQotCQkJCSAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBzeW1lc3o7Ci0gICAgICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JewotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPm5fc2NudW0gIT0gMCkKLQkgICAgKnNlY3BwID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5uX3NjbnVtKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpc3ltcC0+bl92YWx1ZSA9PSAwKQotCQkqc2VjcHAgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGVsc2UKLQkJKnNlY3BwID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgfQotCi0JICBlc3ltICs9IChpc3ltcC0+bl9udW1hdXggKyAxKSAqIHN5bWVzejsKLQkgIHNlY3BwICs9IGlzeW1wLT5uX251bWF1eCArIDE7Ci0JICBpc3ltcCArPSBpc3ltcC0+bl9udW1hdXggKyAxOwotCX0KLQotICAgICAgaWYgKCEgc2hfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVGhlIHRhcmdldCB2ZWN0b3JzLiAgKi8KLQotI2lmbmRlZiBUQVJHRVRfU0hMX1NZTQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKHNoY29mZl92ZWMsICJjb2ZmLXNoIiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfU0hMX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIFRBUkdFVF9TSExfU1lNCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfU1lNIHNobGNvZmZfdmVjCi0jZW5kaWYKLSAgICAgCi0jaWZuZGVmIFRBUkdFVF9TSExfTkFNRQotI2RlZmluZSBUQVJHRVRfU0hMX05BTUUgImNvZmYtc2hsIgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfU0hMX05BTUUsIEJGRF9JU19SRUxBWEFCTEUsCi0JCQkgICAgICAgU0VDX0NPREUgfCBTRUNfREFUQSwgJ18nLCBOVUxMKTsKLSNlbHNlCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX1NITF9OQU1FLCBCRkRfSVNfUkVMQVhBQkxFLAotCQkJICAgICAgIDAsICdfJywgTlVMTCkKLSNlbmRpZgotCi0jaWZuZGVmIFRBUkdFVF9TSExfU1lNCi0vKiBTb21lIHBlb3BsZSB3YW50IHZlcnNpb25zIG9mIHRoZSBTSCBDT0ZGIHRhcmdldCB3aGljaCBkbyBub3QgYWxpZ24KLSAgIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4gIFdlIGltcGxlbWVudCB0aGF0IGJ5IGFkZGluZyBhIGNvdXBsZSBvZiBuZXcKLSAgIHRhcmdldCB2ZWN0b3JzLiAgVGhlc2UgYXJlIGp1c3QgbGlrZSB0aGUgb25lcyBhYm92ZSwgYnV0IHRoZXkKLSAgIGNoYW5nZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4gIFRvIGdlbmVyYXRlIHRoZW0gaW4gdGhlCi0gICBhc3NlbWJsZXIsIHVzZSAtc21hbGwuICBUbyB1c2UgdGhlbSBpbiB0aGUgbGlua2VyLCB1c2UgLWIKLSAgIGNvZmYtc2h7bH0tc21hbGwgYW5kIC1vZm9ybWF0IGNvZmYtc2h7bH0tc21hbGwuCi0KLSAgIFllcywgdGhpcyBpcyBhIGhvcnJpYmxlIGhhY2suICBBIGdlbmVyYWwgc29sdXRpb24gZm9yIHNldHRpbmcKLSAgIHNlY3Rpb24gYWxpZ25tZW50IGluIENPRkYgaXMgcmF0aGVyIGNvbXBsZXguICBFTEYgaGFuZGxlcyB0aGlzCi0gICBjb3JyZWN0bHkuICAqLwotCi0vKiBPbmx5IHJlY29nbml6ZSB0aGUgc21hbGwgdmVyc2lvbnMgaWYgdGhlIHRhcmdldCB3YXMgbm90IGRlZmF1bHRlZC4KLSAgIE90aGVyd2lzZSB3ZSB3b24ndCByZWNvZ25pemUgdGhlIG5vbiBkZWZhdWx0IGVuZGlhbm5lc3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX3NtYWxsX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50YXJnZXRfZGVmYXVsdGVkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLS8qIFNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoZSBzbWFsbCB2ZXJzaW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGlmICghIGNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG11c3QgYWxpZ24gdG8gYXQgbGVhc3QgYSBmb3VyIGJ5dGUgYm91bmRhcnksIGJlY2F1c2UgbG9uZ3dvcmQKLSAgICAgYWNjZXNzZXMgbXVzdCBiZSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPT0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY29waWVkIGZyb20gYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUgc28gdGhhdCB3ZSBjYW4gY2hhbmdlCi0gICB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBwb3dlci4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEgYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSA9Ci17Ci0gIGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9zeW1faW4sIGNvZmZfc3dhcF9saW5lbm9faW4sCi0gIGNvZmZfc3dhcF9hdXhfb3V0LCBjb2ZmX3N3YXBfc3ltX291dCwKLSAgY29mZl9zd2FwX2xpbmVub19vdXQsIGNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIGNvZmZfc3dhcF9maWxlaGRyX291dCwgY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICBjb2ZmX3N3YXBfc2NuaGRyX291dCwKLSAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osIEZJTE5NTEVOLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIDIsCi0jaWZkZWYgQ09GRl9GT1JDRV9TWU1CT0xTX0lOX1NUUklOR1MKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9ERUJVR19TVFJJTkdfV0lERV9QUkVGSVgKLSAgNCwKLSNlbHNlCi0gIDIsCi0jZW5kaWYKLSAgY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfc2NuaGRyX2luLAotICBjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX2NsYXNzaWZ5X3N5bWJvbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jZGVmaW5lIGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXAgXAotICBjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8gXAotICBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNoLXNtYWxsIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNobGNvZmZfc21hbGxfdmVjLAotICAKLSAgKFBUUikgJmJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaGwtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNoY29mZl9zbWFsbF92ZWMsCi0gIAotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3BhcmMuYyBiL2JmZC9jb2ZmLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTE5ZGEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNwYXJjIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvc3BhcmMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFNQQVJDTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gTFlOWENPRkZNQUdJQykKLQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMDAKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSX1NQQVJDX05PTkUgPSAwLAotICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKLSAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKLSAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKLSAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCi0gICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKLSAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKLSAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKLSAgICBSX1NQQVJDX1dQTFQzMCwKLSAgICBSX1NQQVJDX0NPUFksCi0gICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKLSAgICBSX1NQQVJDX1JFTEFUSVZFLAotICAgIFJfU1BBUkNfVUEzMiwKLSAgICBSX1NQQVJDX21heAotICB9OwotCi0jaWYgMAotc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Ci17Ci0gICJSX1NQQVJDX05PTkUiLAotICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKLSAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAotICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCi0gICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCi0gICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAotICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAotICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCi0gICJSX1NQQVJDX1dQTFQzMCIsCi0gICJSX1NQQVJDX0NPUFkiLAotICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKLSAgIlJfU1BBUkNfUkVMQVRJVkUiLAotICAiUl9TUEFSQ19VQTMyIiwKLX07Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBzdG9sZW4gcHJldHR5IGRpcmVjdGx5IGZyb20gZWxmLmMuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQlhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfY29mZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGNvZmZfc3BhcmNfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotfTsKLQotc3RydWN0IGNvZmZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgY29mZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGNvZmZfcmVsb2NfbWFwIHNwYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9TUEFSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TUEFSQ18xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9TUEFSQ184IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfU1BBUkNfRElTUDggfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TUEFSQ18zMiB9LCAvKiBAQCBBc3N1bWVzIDMyIGJpdHMuICAqLwotICB7IEJGRF9SRUxPQ18zMiwgUl9TUEFSQ18zMiB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9TUEFSQ19ESVNQMzIgfSwKLSAgeyBCRkRfUkVMT0NfSEkyMiwgUl9TUEFSQ19ISTIyIH0sCi0gIHsgQkZEX1JFTE9DX0xPMTAsIFJfU1BBUkNfTE8xMCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsIFJfU1BBUkNfV0RJU1AzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzIyLCBSX1NQQVJDXzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMTMsIFJfU1BBUkNfMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTAsIFJfU1BBUkNfR09UMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTMsIFJfU1BBUkNfR09UMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMjIsIFJfU1BBUkNfR09UMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMxMCwgUl9TUEFSQ19QQzEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMjIsIFJfU1BBUkNfUEMyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIFJfU1BBUkNfV1BMVDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0NPUFksIFJfU1BBUkNfQ09QWSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwgUl9TUEFSQ19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwgUl9TUEFSQ19KTVBfU0xPVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwgUl9TUEFSQ19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCBSX1NQQVJDX1dESVNQMjIgfSwKLSAgLyogIHsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgY29mZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5jb2ZmX3JlbG9jX3ZhbF07Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cAotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBCRkRfQVNTRVJUIChkc3QtPnJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW2RzdC0+cl90eXBlXTsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVAliZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCWJmZF9oX3B1dF8zMgotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpIFwKLSAgY2FjaGVfcHRyLT5hZGRlbmQgPSByZWxvYy5yX29mZnNldDsKLQotLyogQ2xlYXIgdGhlIHJfc3BhcmUgZmllbGQgaW4gcmVsb2NzLiAgKi8KLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxzcmMsZHN0KSBcCi0gIGRvIHsgXAotICAgICAgIGRzdC0+cl9zcGFyZVswXSA9IDA7IFwKLSAgICAgICBkc3QtPnJfc3BhcmVbMV0gPSAwOyBcCi0gICAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLS8qIEVuYWJsZSBTcGFyYy1zcGVjaWZpYyBoYWNrcyBpbiBjb2ZmY29kZS5oLiAqLwotCi0jZGVmaW5lIENPRkZfU1BBUkMKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIHNwYXJjY29mZl92ZWMKLSNlbmRpZgotCi0jaWZuZGVmIFRBUkdFVF9OQU1FCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJjb2ZmLXNwYXJjIgotI2VuZGlmCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgRF9QQUdFRCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3RnbzMyLmMgYi9iZmQvY29mZi1zdGdvMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlN2Q2Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdGdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQgd2l0aCBhIHN0dWIpLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJvYmVydCBIb2VobmUuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhhbmRsZXMgbm93IGFsc28gc3R1YmJlZCBjb2ZmIGltYWdlcy4gVGhlIHN0dWIgaXMgYSBzbWFsbAotICAgRE9TIGV4ZWN1dGFibGUgcHJvZ3JhbSBiZWZvcmUgdGhlIGNvZmYgaW1hZ2UgdG8gbG9hZCBpdCBpbiBtZW1vcnkKLSAgIGFuZCBleGVjdXRlIGl0LiBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBET1MgY2Fubm90IHJ1biBjb2ZmIGZpbGVzLgotCi0gICBBbGwgdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucwotICAgZnJvbSBjb2Zmc3dhcC5oLgotICAgVGhlIG9ubHkgdGhpbmcgd2hhdCB0aGV5IGRvIGlzIHRvIGFkanVzdCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluCi0gICB0aGUgQ09GRiBmaWxlIHdoaWNoIGFyZSBvZmZzZXQgaW50byB0aGUgZmlsZS4KLSAgIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERKR1BQIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgd2F5IHRvIGxvYWQgYW5kIHJ1bgotICAgdGhlIGNvZmYgaW1hZ2UuIEl0IGxvYWRzIHRoZSBpbWFnZSBpbiBtZW1vcnkgYW5kIGFzc3VtZXMgdGhlbiwgdGhhdCB0aGUKLSAgIGltYWdlIGhhZCBubyBzdHViIGJ5IHVzaW5nIHRoZSBmaWxlcG9pbnRlcnMgYXMgcG9pbnRlcnMgaW4gdGhlIGNvZmYKLSAgIGltYWdlIGFuZCBOT1QgaW4gdGhlIGZpbGUuCi0KLSAgIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgZXhpc3RpbmcgZXhlY3V0YWJsZXMgSSBoYXZlIGZpeGVkIHRoaXMKLSAgIGhlcmUgYW5kIE5PVCBpbiB0aGUgREpHUFAgc3RhcnR1cCBjb2RlLgotICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMnN0dWJiZWRjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMi1leGUiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotI2RlZmluZSBDT0ZGX0dPMzJfRVhFCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5kYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIudGV4dCIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmJzcyIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogQXQgZmlyc3QgdGhlIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIHNyYywgUFRSIGRzdCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dCwgUFRSIGluKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dDEsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgIGludCBudW1hdXgsIFBUUiBpbjEpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLS8qCi0gICBBbGwgdGhhdCAuLi5fUFJFIGFuZCAuLi5QT1NUIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGNvZmZfc3dhcC4uLiBmdW5jdGlvbnMuIFRoZSAuLi5QUkUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgLi4uUE9TVCBmdW5jdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3dhcCByb3V0aW5lcy4KLSAqLwotCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBhZGp1c3RfZmlsZWhkcl9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhZGp1c3RfZmlsZWhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBhZGp1c3Rfc2NuaGRyX2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYWRqdXN0X3Njbmhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBhZGp1c3Rfc2NuaGRyX291dF9wb3N0Ci0KLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgYWRqdXN0X2F1eF9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFkanVzdF9hdXhfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgYWRqdXN0X2F1eF9vdXRfcG9zdAotCi1zdGF0aWMgYm9vbGVhbgotICBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqIGliZmQsIGJmZCAqIG9iZmQpKTsKLQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCi0KLS8qIEkgaG9sZCBpbiB0aGUgdXNyZGF0YSB0aGUgc3R1YiAqLwotI2RlZmluZSBiZmRfY29mZl9nbzMyc3R1YiBiZmRfdXNyZGF0YQotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQsIGJlY2F1c2UgSSBjYW5ub3QgYXNzdW1lIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi0gICBob3N0IHN5c3RlbSAqLwotI2RlZmluZSBfSChpbmRleCkgKGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikoaGVhZGVyK2luZGV4KjIpKSkKLQotLyogVGhlc2UgYnl0ZXMgYXJlIGEgMjA0OC1ieXRlIERPUyBleGVjdXRhYmxlLCB3aGljaCBsb2FkcyB0aGUgQ09GRgotICAgaW1hZ2UgaW50byBtZW1vcnkgYW5kIHRoZW4gcnVucyBpdC4gSXQgaXMgY2FsbGVkICdzdHViJyAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzdHViX2J5dGVzW1NUVUJTSVpFXSA9Ci17Ci0jaW5jbHVkZSAiZ28zMnN0dWIuaCIKLX07Ci0KLS8qCi0gICBJIGhhdmUgbm90IGNvbW1lbnRlZCBlYWNoIHN3YXAgZnVuY3Rpb24gYmVsb3csIGJlY2F1c2UgdGhlCi0gICB0ZWNobmlxdWUgaXMgaW4gYW55IGZ1bmN0aW9uIHRoZSBzYW1lLiBGb3IgdGhlIC4uLmluIGZ1bmN0aW9uLAotICAgYWxsIHRoZSBwb2ludGVycyBhcmUgYWRqdXN0ZWQgYnkgYWRkaW5nIFNUVUJTSVpFIGFuZCBmb3IgdGhlCi0gICAuLi5vdXQgZnVuY3Rpb24sIGl0IGlzIHN1YnRyYWN0ZWQgZmlyc3QgYW5kIGFmdGVyIGNhbGxpbmcgdGhlCi0gICBzdGFuZGFyZCBzd2FwIGZ1bmN0aW9uIGl0IGlzIHJlc2V0IHRvIHRoZSBvbGQgdmFsdWUgKi8KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBhZGp1c3RpbmcgdGhlIGZpbGVwb2ludGVycywgd2hpY2gKLSAgIGlzIGRvbmUgb25seSwgaWYgdGhlIHBvaW50ZXIgaXMgbm9uemVybyAqLwotCi0jZGVmaW5lIEFESlVTVF9WQUwodmFsLGRpZmYpIFwKLSAgaWYgKHZhbCAhPSAwKSB2YWwgKz0gZGlmZgotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCAgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLQotICBBREpVU1RfVkFMIChmaWxlaGRyX2RzdC0+Zl9zeW1wdHIsIFNUVUJTSVpFKTsKLQotICAvKiBTYXZlIG5vdyB0aGUgc3R1YiB0byBiZSB1c2VkIGxhdGVyICovCi0gIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgU1RVQlNJWkUpOwotCi0gIC8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBubyBzdGF0dXMsIEkgZG8gbm90IHNldCBoZXJlCi0gICAgIGFueSBiZmRfZXJyb3JfLi4uCi0gICAgIFRoYXQgbWVhbnMsIGJlZm9yZSB0aGUgdXNlIG9mIGJmZF9jb2ZmX2dvMzJzdHViICgpLCB0aGlzIHZhbHVlCi0gICAgIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzICE9IE5VTEwgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGZpbGVoZHJfc3JjLT5zdHViLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKSBvdXQ7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIHN0dWIgKi8KLSAgY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCk7Ci0KLSAgLyogQ29weSB0aGUgc3R1YiB0byB0aGUgZmlsZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSAhPSBOVUxMKQotICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgU1RVQlNJWkUpOwotICBlbHNlCi0gICAgLyogdXNlIHRoZSBkZWZhdWx0ICovCi0gICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1Yiwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCAtU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGluOwotICAvKiB1bmRvIHRoZSBhYm92ZSBjaGFuZ2UgKi8KLSAgQURKVVNUX1ZBTCAoZmlsZWhkcl9pbi0+Zl9zeW1wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfaW5fcG9zdCAgKGFiZmQsIGV4dCwgaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIC1TVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCAtU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIC1TVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wb3N0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfaW5fcG9zdCAgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBleHQxIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgY2xhc3M7Ci0gICAgIGludCBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGluMTsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW4xOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW5wOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBleHRwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGlucDsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCAtU1RVQlNJWkUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3Bvc3QgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbnA7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgY2xhc3M7Ci0gICAgIGludCBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGV4dHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW5wOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLS8qCi0gICBUaGF0J3MgdGhlIGZ1bmN0aW9uLCB3aGljaCBjcmVhdGVzIHRoZSBzdHViLiBUaGVyZSBhcmUKLSAgIGRpZmZlcmVudCBjYXNlcyBmcm9tIHdoZXJlIHRoZSBzdHViIGlzIHRha2VuLgotICAgQXQgZmlyc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoR08zMlNUVUIpIGlzIGNoZWNrZWQgYW5kIHRoZW4KLSAgICQoU1RVQikgaWYgaXQgd2FzIG5vdCBzZXQuCi0gICBJZiBpdCBleGlzdHMgYW5kIHBvaW50cyB0byBhIHZhbGlkIHN0dWIgdGhlIHN0dWIgaXMgdGFrZW4gZnJvbQotICAgdGhhdCBmaWxlLiBUaGlzIGZpbGUgY2FuIGJlIGFsc28gYSB3aG9sZSBleGVjdXRhYmxlIGZpbGUsIGJlY2F1c2UKLSAgIHRoZSBzdHViIGlzIGNvbXB1dGVkIGZyb20gdGhlIGV4ZSBpbmZvcm1hdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhhdAotICAgZmlsZS4KLQotICAgSWYgdGhlcmUgd2FzIGFueSBlcnJvciwgdGhlIHN0YW5kYXJkIHN0dWIgKGNvbXBpbGVkIGluIHRoaXMgZmlsZSkKLSAgIGlzIHRha2VuLgotICovCi0KLXN0YXRpYyB2b2lkCi1jcmVhdGVfZ28zMl9zdHViIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIERvIGl0IG9ubHkgb25jZSAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqc3R1YjsKLSAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgaW50IGY7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclsxMF07Ci0gICAgICBjaGFyIG1hZ2ljWzhdOwotICAgICAgdW5zaWduZWQgbG9uZyBjb2ZmX3N0YXJ0LCBleGVfc3RhcnQ7Ci0KLSAgICAgIC8qIENoZWNrIGF0IGZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKEdPMzJTVFVCKSAqLwotICAgICAgc3R1YiA9IGdldGVudiAoIkdPMzJTVFVCIik7Ci0gICAgICAvKiBOb3cgY2hlY2sgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoU1RVQikgKi8KLSAgICAgIGlmIChzdHViID09IE5VTEwpCi0Jc3R1YiA9IGdldGVudiAoIlNUVUIiKTsKLSAgICAgIGlmIChzdHViID09IE5VTEwpCi0JZ290byBzdHViX2VuZDsKLSAgICAgIGlmIChzdGF0IChzdHViLCAmc3QpICE9IDApCi0JZ290byBzdHViX2VuZDsKLSNpZmRlZiBPX0JJTkFSWQotICAgICAgZiA9IG9wZW4gKHN0dWIsIE9fUkRPTkxZIHwgT19CSU5BUlkpOwotI2Vsc2UKLSAgICAgIGYgPSBvcGVuIChzdHViLCBPX1JET05MWSk7Ci0jZW5kaWYKLSAgICAgIGlmIChmIDwgMCkKLQlnb3RvIHN0dWJfZW5kOwotICAgICAgaWYgKHJlYWQgKGYsICZoZWFkZXIsIHNpemVvZiAoaGVhZGVyKSkgPCAwKQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgaWYgKF9IICgwKSAhPSAweDVhNGQpCS8qIGl0IGlzIG5vdCBhbiBleGUgZmlsZSAqLwotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc3R1YiAoaXQgaXMgZXZlcnkgdGhpbmcgdXAKLSAgICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvZmYgaW1hZ2UpICovCi0gICAgICBjb2ZmX3N0YXJ0ID0gKGxvbmcpIF9IICgyKSAqIDUxMkw7Ci0gICAgICBpZiAoX0ggKDEpKQotCWNvZmZfc3RhcnQgKz0gKGxvbmcpIF9IICgxKSAtIDUxMkw7Ci0KLSAgICAgIC8qIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5IGEgZml4ZWQgc3R1YiBzaXplIG9mIDIwNDggYnl0ZXMKLSAgICAgICAgIHN1cHBvcnRlZCAqLwotICAgICAgaWYgKGNvZmZfc3RhcnQgIT0gMjA0OCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGV4ZV9zdGFydCA9IF9IICg0KSAqIDE2OwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBsc2VlayAoZiwgZXhlX3N0YXJ0LCBTRUVLX1NFVCkgIT0gZXhlX3N0YXJ0KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgaWYgKHJlYWQgKGYsICZtYWdpYywgOCkgIT0gOCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChtZW1jbXAgKG1hZ2ljLCAiZ28zMnN0dWIiLCA4KSAhPSAwKQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgLyogTm93IHdlIGZvdW5kIGEgY29ycmVjdCBzdHViIChob3BlZnVsbHkpICovCi0gICAgICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGNvZmZfc3RhcnQpOwotICAgICAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsc2VlayAoZiwgMEwsIFNFRUtfU0VUKTsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgcmVhZCAoZiwgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBjb2ZmX3N0YXJ0KQotCSAgIT0gY29mZl9zdGFydCkKLQl7Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpKTsKLQkgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IE5VTEw7Ci0JfQotICAgICAgY2xvc2UgKGYpOwotICAgIH0KLXN0dWJfZW5kOgotICAvKiBUaGVyZSB3YXMgc29tZXRoaW5nIHdyb25nIGFib3ZlLCBzbyB1c2Ugbm93IHRoZSBzdGFuZGFyZCBidWlsdGluCi0gICAgIHN0dWIgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgU1RVQlNJWkUpOwotICAgICAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotCXsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBzdHViX2J5dGVzLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi0vKiBJZiBpYmZkIHdhcyBhIHN0dWJiZWQgY29mZiBpbWFnZSwgY29weSB0aGUgc3R1YiBmcm9tIHRoYXQgYmZkCi0gICB0byB0aGUgbmV3IG9iZmQuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLWdvMzJfc3R1YmJlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgLyogY2hlY2sgaWYgYm90aCBhcmUgdGhlIHNhbWUgdGFyZ2V0cyAqLwotICBpZiAoaWJmZC0+eHZlYyAhPSBvYmZkLT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGNoZWNrIGlmIGJvdGggaGF2ZSBhIHZhbGlkIHN0dWIgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChpYmZkKSA9PSBOVUxMCi0gICAgICB8fCBiZmRfY29mZl9nbzMyc3R1YiAob2JmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBOb3cgY29weSB0aGUgc3R1YiAqLwotICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChvYmZkKSwgYmZkX2NvZmZfZ28zMnN0dWIgKGliZmQpLCBTVFVCU0laRSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zdm02OGsuYyBiL2JmZC9jb2ZmLXN2bTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJhNWE3Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXN2bTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBzeXN2NjgKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrc3lzdmNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstc3lzdiIKLSNkZWZpbmUgU1RBVElDX1JFTE9DUwotI2RlZmluZSBDT0ZGX0NPTU1PTl9BRERFTkQKLQotI2luY2x1ZGUgImNvZmYtbTY4ay5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdGljMzAuYyBiL2JmZC9jb2ZmLXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NzFmNzYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBjb2ZmIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3RpYzMwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLXJlbG9jX2hvd3RvX3R5cGUgdGljMzBfY29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfVElDMzBfQUJTMTYsIDIsIDEsIDE2LCBmYWxzZSwgMCwgMCwgTlVMTCwKLQkgIjE2IiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfQUJTMjQsIDIsIDIsIDI0LCBmYWxzZSwgOCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIyNCIsIGZhbHNlLCAweEZGRkZGRjAwLCAweEZGRkZGRjAwLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0xEUCwgMTgsIDAsIDI0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICJMRFAiLCBmYWxzZSwgMHgwMEZGMDAwMCwgMHgwMDAwMDBGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9BQlMzMiwgMiwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjMyIiwgZmFsc2UsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfUEMxNiwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgTlVMTCwKLQkgIlBDUkVMIiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKLSAgRU1QVFlfSE9XVE8gKC0xKQotfTsKLQotI2lmbmRlZiBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCB0aWMzMF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIEZvciB0aGUgY2FzZSBzdGF0ZW1lbnQgdXNlIHRoZSBjb2RlIHZhbHVlcyB1c2VkIGluIHRjX2dlbl9yZWxvYyB0bwotICAgbWFwIHRvIHRoZSBob3d0byB0YWJsZSBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhvc2UgaW4gYm90aCB0aGUgYW91dAotICAgYW5kIGNvZmYgaW1wbGVtZW50YXRpb25zLiAqLwotcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbM107Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQKLWNvZmZfdGljMzBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBUSUMzMEJBRE1BRyh4KQotI2RlZmluZSBUSUMzMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLWRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlLiAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfQUJTMjQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9BQlMzMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0xEUDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX1BDMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVs0XTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgdGljMzBfY29mZl92ZWMgPQotewotICAiY29mZi10aWMzMCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdGljNTR4LmMgYi9iZmQvY29mZi10aWM1NHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlNjJlMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWM1NHguYworKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEM1NFggY29mZiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFRpbW90aHkgV2FsbCAodHdhbGxAY3lnbnVzLmNvbSkKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3RpYzU0eC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSN1bmRlZiBGX0xTWU1TCi0jZGVmaW5lCUZfTFNZTVMJCUZfTFNZTVNfVElDT0ZGCi0KLS8qCi0gIDMyLWJpdCBvcGVyYXRpb25zCi0gIFRoZSBvY3RldCBvcmRlciBpcyBzY3Jld3kuICB3b3JkcyBhcmUgTFNCIGZpcnN0IChMUyBvY3RldCwgYWN0dWFsbHkpLCBidXQKLSAgbG9uZ3dvcmRzIGFyZSBNU1cgZmlyc3QuICBGb3IgZXhhbXBsZSwgMHgxMjM0NTY3OCBpcyBlbmNvZGVkIDB4NTY3OCBpbiB0aGUKLSAgZmlyc3Qgd29yZCBhbmQgMHgxMjM0IGluIHRoZSBzZWNvbmQuICBXaGVuIGxvb2tpbmcgYXQgdGhlIGRhdGEgYXMgc3RvcmVkIGluCi0gIHRoZSBDT0ZGIGZpbGUsIHlvdSB3b3VsZCBzZWUgdGhlIG9jdGV0cyBvcmRlcmVkIGFzIDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIuCi0gIERvbid0IGJvdGhlciB3aXRoIDY0LWJpdHMsIGFzIHRoZXJlIGFyZW4ndCBhbnkuCi0gKi8KLXN0YXRpYyBiZmRfdm1hCi10aWM1NHhfZ2V0bDMyKGFkZHIpCi0gIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclsyXTsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDI0OwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aWM1NHhfcHV0bDMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzJdID0gKGJmZF9ieXRlKWRhdGE7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi10aWM1NHhfZ2V0bF9zaWduZWRfMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMjQ7Ci0jZGVmaW5lIENPRVJDRTMyKHgpIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpICh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0gIHJldHVybiBDT0VSQ0UzMiAodik7Ci19Ci0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9sb2FkX3BhZ2UgYmZkX3RpY29mZl9nZXRfc2VjdGlvbl9sb2FkX3BhZ2UKLSNkZWZpbmUgY29mZl9zZXRfc2VjdGlvbl9sb2FkX3BhZ2UgYmZkX3RpY29mZl9zZXRfc2VjdGlvbl9sb2FkX3BhZ2UKLQotdm9pZCAKLWJmZF90aWNvZmZfc2V0X3NlY3Rpb25fbG9hZF9wYWdlIChzZWN0LCBwYWdlKQotICBhc2VjdGlvbiAqc2VjdDsKLSAgaW50IHBhZ2U7Ci17Ci0gIHNlY3QtPmxtYSA9IChzZWN0LT5sbWEgJiBBRERSX01BU0spIHwgUEdfVE9fRkxBRyhwYWdlKTsKLX0KLQotCi1pbnQKLWJmZF90aWNvZmZfZ2V0X3NlY3Rpb25fbG9hZF9wYWdlIChzZWN0KQotICBhc2VjdGlvbiAqc2VjdDsKLXsKLSAgaW50IHBhZ2U7Ci0KLSAgLyogUHJvdmlkZSBtZWFuaW5nZnVsIGRlZmF1bHRzIGZvciBwcmVkZWZpbmVkIHNlY3Rpb25zLiAqLwotICBpZiAoc2VjdCA9PSAmYmZkX2NvbV9zZWN0aW9uKQotICAgIHBhZ2UgPSBQR19EQVRBOwotCi0gIGVsc2UgaWYgKHNlY3QgPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgfHwgc2VjdCA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBzZWN0ID09ICZiZmRfaW5kX3NlY3Rpb24pCi0gICAgcGFnZSA9IFBHX1BST0c7Ci0KLSAgZWxzZQotICAgIHBhZ2UgPSBGTEFHX1RPX1BHIChzZWN0LT5sbWEpOwotCi0gIHJldHVybiBwYWdlOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhcHByb3ByaWF0ZWx5LiAgQWxsb3cgdW5rb3duIGFyY2hpdGVjdHVyZXMKLSAgIChlLmcuIGJpbmFyeSkuICovIAotc3RhdGljIGJvb2xlYW4KLXRpYzU0eF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IGJmZF9hcmNoX3RpYzU0eDsKLQotICBlbHNlIGlmIChhcmNoICE9IGJmZF9hcmNoX3RpYzU0eCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWM1NHhfcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKLSAJIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KLSAJIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1yZWxvY19ob3d0b190eXBlIHRpYzU0eF9ob3d0b190YWJsZVtdID0KLXsKLS8qIHR5cGUscmlnaHRzaGlmdCxzaXplICgwPWJ5dGUsIDE9c2hvcnQsIDI9bG9uZyksCi0gICBiaXQgc2l6ZSwgcGNfcmVsYXRpdmUsIGJpdHBvcywgZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdywKLSAgIHNwZWNpYWxfZnVuY3Rpb24sIG5hbWUsIHBhcnRpYWxfaW5wbGFjZSwgc3JjX21hc2ssIGRzdF9tYXNrLCBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBOT1JNQUwgQkFOSyAqLwotICAvKiAxNi1iaXQgZGlyZWN0IHJlZmVyZW5jZSB0byBzeW1ib2wncyBhZGRyZXNzICovCi0gIEhPV1RPIChSX1JFTFdPUkQsMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiUkVMMTYiLGZhbHNlLDB4RkZGRiwweEZGRkYsZmFsc2UpLAotCi0gIC8qIDcgTFNCcyBvZiBhbiBhZGRyZXNzICovCi0gIEhPV1RPIChSX1BBUlRMUzcsMCwxLDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgICAgICAgdGljNTR4X3JlbG9jYXRpb24sIkxTNyIsZmFsc2UsMHgwMDdGLDB4MDA3RixmYWxzZSksCi0KLSAgLyogOSBNU0JzIG9mIGFuIGFkZHJlc3MgKi8KLSAgLyogVEkgYXNzZW1ibGVyIGRvZXNuJ3Qgc2hpZnQgaXRzIGVuY29kaW5nLCBhbmQgaXMgdGh1cyBpbmNvbXBhdGlibGUgKi8KLSAgSE9XVE8gKFJfUEFSVE1TOSw3LDEsOSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiTVM5IixmYWxzZSwweDAxRkYsMHgwMUZGLGZhbHNlKSwKLQotICAvKiAyMy1iaXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9FWFRXT1JELDAsMiwyMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiUkVMRVhUIixmYWxzZSwweDdGRkZGRiwweDdGRkZGRixmYWxzZSksCi0KLSAgLyogMTYgYml0cyBvZiAyMy1iaXQgZXh0ZW5kZWQgYWRkcmVzcyAqLwotICBIT1dUTyAoUl9FWFRXT1JEMTYsMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICAgICAgIHRpYzU0eF9yZWxvY2F0aW9uLCJSRUxFWFQxNiIsZmFsc2UsMHg3RkZGRkYsMHg3RkZGRkYsZmFsc2UpLAotCi0gIC8qIHVwcGVyIDcgYml0cyBvZiAyMy1iaXQgZXh0ZW5kZWQgYWRkcmVzcyAqLwotICBIT1dUTyAoUl9FWFRXT1JETVM3LDE2LDEsNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiUkVMRVhUTVM3IixmYWxzZSwweDdGLDB4N0YsZmFsc2UpLAotCi0gIC8qIEFCU09MVVRFIEJBTksgKi8KLSAgLyogMTYtYml0IGRpcmVjdCByZWZlcmVuY2UgdG8gc3ltYm9sJ3MgYWRkcmVzcywgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAKLSAgICAgICAgIHRpYzU0eF9yZWxvY2F0aW9uLCJBUkVMMTYiLGZhbHNlLDB4RkZGRiwweEZGRkYsZmFsc2UpLAotCi0gIC8qIDcgTFNCcyBvZiBhbiBhZGRyZXNzLCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9QQVJUTFM3LDAsMSw3LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICAgICAgIHRpYzU0eF9yZWxvY2F0aW9uLCJBTFM3IixmYWxzZSwweDAwN0YsMHgwMDdGLGZhbHNlKSwKLQotICAvKiA5IE1TQnMgb2YgYW4gYWRkcmVzcywgYWJzb2x1dGUgKi8KLSAgLyogVEkgYXNzZW1ibGVyIGRvZXNuJ3Qgc2hpZnQgaXRzIGVuY29kaW5nLCBhbmQgaXMgdGh1cyBpbmNvbXBhdGlibGUgKi8KLSAgSE9XVE8gKFJfUEFSVE1TOSw3LDEsOSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiQU1TOSIsZmFsc2UsMHgwMUZGLDB4MDFGRixmYWxzZSksCi0KLSAgLyogMjMtYml0IGRpcmVjdCByZWZlcmVuY2UsIGFic29sdXRlICovCi0gIEhPV1RPIChSX0VYVFdPUkQsMCwyLDIzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICAgICAgIHRpYzU0eF9yZWxvY2F0aW9uLCJBUkVMRVhUIixmYWxzZSwweDdGRkZGRiwweDdGRkZGRixmYWxzZSksCi0KLSAgLyogMTYgYml0cyBvZiAyMy1iaXQgZXh0ZW5kZWQgYWRkcmVzcywgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfRVhUV09SRDE2LDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiQVJFTEVYVDE2IixmYWxzZSwweDdGRkZGRiwweDdGRkZGRixmYWxzZSksCi0KLSAgLyogdXBwZXIgNyBiaXRzIG9mIDIzLWJpdCBleHRlbmRlZCBhZGRyZXNzLCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9FWFRXT1JETVM3LDE2LDEsNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgICAgICB0aWM1NHhfcmVsb2NhdGlvbiwiQVJFTEVYVE1TNyIsZmFsc2UsMHg3RiwweDdGLGZhbHNlKSwKLQotICAvKiAzMi1iaXQgcmVsb2NhdGlvbiBleGNsdXNpdmVseSBmb3Igc3RhYnMgKi8KLSAgSE9XVE8gKFJfUkVMTE9ORywwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgICAgICAgdGljNTR4X3JlbG9jYXRpb24sIlNUQUIiLGZhbHNlLDB4RkZGRkZGRkYsMHhGRkZGRkZGRixmYWxzZSksCi0KLX07Ci0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgdGljNTR4X2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogRm9yIHRoZSBjYXNlIHN0YXRlbWVudCB1c2UgdGhlIGNvZGUgdmFsdWVzIHVzZWQgdGNfZ2VuX3JlbG9jIChkZWZpbmVkIGluCi0gICBiZmQvcmVsb2MuYykgdG8gbWFwIHRvIHRoZSBob3d0byB0YWJsZSBlbnRyaWVzICovCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzU0eF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzU0eF9ob3d0b190YWJsZVswXTsKLSAgICBjYXNlIEJGRF9SRUxPQ19USUM1NFhfUEFSVExTNzoKLSAgICAgIHJldHVybiAmdGljNTR4X2hvd3RvX3RhYmxlWzFdOwotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzU0WF9QQVJUTVM5OgotICAgICAgcmV0dXJuICZ0aWM1NHhfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDNTRYXzIzOgotICAgICAgcmV0dXJuICZ0aWM1NHhfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDNTRYXzE2X09GXzIzOgotICAgICAgcmV0dXJuICZ0aWM1NHhfaG93dG9fdGFibGVbNF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDNTRYX01TN19PRl8yMzoKLSAgICAgIHJldHVybiAmdGljNTR4X2hvd3RvX3RhYmxlWzVdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuICZ0aWM1NHhfaG93dG9fdGFibGVbMTJdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZS4gCi0gICBDYWxsZWQgYWZ0ZXIgc29tZSBpbml0aWFsIGNoZWNraW5nIGJ5IHRoZSB0aWM1NHhfcnR5cGVfdG9faG93dG8gZm4gYmVsb3cgKi8KLXN0YXRpYyB2b2lkCi10aWM1NHhfbG9va3VwX2hvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGk7Ci0gIGludCBiYW5rID0gKGRzdC0+cl9zeW1uZHggPT0gLTEpID8gSE9XVE9fQkFOSyA6IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdGljNTR4X2hvd3RvX3RhYmxlL3NpemVvZiB0aWM1NHhfaG93dG9fdGFibGVbMF07IGkrKykKLSAgICB7Ci0gICAgICBpZiAodGljNTR4X2hvd3RvX3RhYmxlW2ldLnR5cGUgPT0gZHN0LT5yX3R5cGUpCi0JewotCSAgaW50ZXJuYWwtPmhvd3RvID0gdGljNTR4X2hvd3RvX3RhYmxlICsgaSArIGJhbms7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiKSwKLQkJCSAodW5zaWduZWQgaW50KSBkc3QtPnJfdHlwZSk7Ci0gIGFib3J0KCk7Ci19Ci0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhSRUxFTlQsUkVMT0MsU1lNUyxBQkZELFNFQ1QpXAotIHRpYzU0eF9yZWxvY19wcm9jZXNzaW5nKFJFTEVOVCxSRUxPQyxTWU1TLEFCRkQsU0VDVCkKLQotc3RhdGljIHZvaWQgdGljNTR4X3JlbG9jX3Byb2Nlc3NpbmcoKTsKLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfdGljNTR4X3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfdGljNTR4X3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgaWYgKHJlbC0+cl9zeW1uZHggPT0gLTEgJiYgYWRkZW5kcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbiIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlbG9jYXRpb24KLQkgYW1vdW50IGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBiZWluZyByZWxvY2F0ZWQKLQkgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAqLwotICAgICAgKmFkZGVuZHAgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KSAtIHNlYy0+dm1hOwotICAgIH0KLQotICB0aWM1NHhfbG9va3VwX2hvd3RvICgmZ2VucmVsLCByZWwpOwotCi0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10aWNvZmYwX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQ09GRjBfQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGljb2ZmMV9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKENPRkYxX0JBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogcmVwbGFjZSB0aGUgc3RvY2sgX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgdG8gcmVjb2duaXplIFRJIENPRkYgbG9jYWwKLSAgIGxhYmVscyAqLwotc3RhdGljIGJvb2xlYW4gCi10aWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoVElDT0ZGX0xPQ0FMX0xBQkVMX1AobmFtZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIHRpY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0vKiBDdXN0b21pemUgY29mZmNvZGUuaDsgdGhlIGRlZmF1bHQgY29mZl8gZnVuY3Rpb25zIGFyZSBzZXQgdXAgdG8gdXNlIENPRkYyOyAKLSAgIGNvZmZfYmFkX2Zvcm1hdF9ob29rIHVzZXMgQkFETUFHLCBzbyBzZXQgdGhhdCBmb3IgQ09GRjIuICBUaGUgQ09GRjEKLSAgIGFuZCBDT0ZGMCB2ZWN0b3JzIHVzZSBjdXN0b20gX2JhZF9mb3JtYXRfaG9vayBwcm9jcyBpbnN0ZWFkIG9mIHNldHRpbmcKLSAgIEJBRE1BRy4gCi0gKi8gCi0jZGVmaW5lIEJBRE1BRyh4KSBDT0ZGMl9CQURNQUcoeCkKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgYm9vbGVhbgotdGljNTR4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICByZXR1cm4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBieXRlc190b19kbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aWM1NHhfcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXN5bWJvbCAqcHRyOwotCi0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICAKLSAgaWYgKHJlbG9jLT5yX3N5bW5keCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2MtPnJfc3ltbmR4IDwgMCB8fCByZWxvYy0+cl9zeW1uZHggPj0gb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCByZWxvYy0+cl9zeW1uZHgpOwotICAgICAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgICAgICBwdHIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gKHN5bWJvbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF0pOwotICAgICAgICAgIHB0ciA9ICoocmVsZW50LT5zeW1fcHRyX3B0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBwdHIgPSAqKHJlbGVudC0+c3ltX3B0cl9wdHIpOwotICAgIH0KLSAgCi0gIC8qIFRoZSBzeW1ib2xzIGRlZmluaXRpb25zIHRoYXQgd2UgaGF2ZSByZWFkIGluIGhhdmUgYmVlbgotICAgICByZWxvY2F0ZWQgYXMgaWYgdGhlaXIgc2VjdGlvbnMgc3RhcnRlZCBhdCAwLiBCdXQgdGhlIG9mZnNldHMKLSAgICAgcmVmZXJpbmcgdG8gdGhlIHN5bWJvbHMgaW4gdGhlIHJhdyBkYXRhIGhhdmUgbm90IGJlZW4KLSAgICAgbW9kaWZpZWQsIHNvIHdlIGhhdmUgdG8gaGF2ZSBhIG5lZ2F0aXZlIGFkZGVuZCB0byBjb21wZW5zYXRlLgotICAgICAKLSAgICAgTm90ZSB0aGF0IHN5bWJvbHMgd2hpY2ggdXNlZCB0byBiZSBjb21tb24gbXVzdCBiZSBsZWZ0IGFsb25lICovCi0gIAotICAvKiBDYWxjdWxhdGUgYW55IHJlbG9jIGFkZGVuZCBieSBsb29raW5nIGF0IHRoZSBzeW1ib2wgKi8KLSAgQ0FMQ19BRERFTkQgKGFiZmQsIHB0ciwgKnJlbG9jLCByZWxlbnQpOwotICAKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogISEgICAgIHJlbGVudC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOyovCi0gIAotICAvKiBGaWxsIGluIHRoZSByZWxlbnQtPmhvd3RvIGZpZWxkIGZyb20gcmVsb2MtPnJfdHlwZSAqLwotICB0aWM1NHhfbG9va3VwX2hvd3RvIChyZWxlbnQsIHJlbG9jKTsKLX0KLQotLyogQ09GRjAgZGlmZmVycyBpbiBmaWxlL3NlY3Rpb24gaGVhZGVyIHNpemUgYW5kIHJlbG9jYXRpb24gZW50cnkgc2l6ZSAqLwotc3RhdGljIENPTlNUIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSB0aWNvZmYwX3N3YXBfdGFibGUgPSAKLXsKLSAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKLSAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAotICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCi0gIGNvZmZfU1dBUF9zY25oZHJfb3V0LAotICBGSUxIU1pfVjAsIEFPVVRTWiwgU0NOSFNaX1YwMSwgU1lNRVNaLCBBVVhFU1osIFJFTFNaX1YwLCBMSU5FU1osIEZJTE5NTEVOLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9GT1JDRV9TWU1CT0xTX0lOX1NUUklOR1MKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9ERUJVR19TVFJJTkdfV0lERV9QUkVGSVgKLSAgNCwKLSNlbHNlCi0gIDIsCi0jZW5kaWYKLSAgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLAotICBjb2ZmX1NXQVBfZmlsZWhkcl9pbiwgY29mZl9TV0FQX2FvdXRoZHJfaW4sIGNvZmZfU1dBUF9zY25oZHJfaW4sCi0gIGNvZmZfU1dBUF9yZWxvY19pbiwgdGljb2ZmMF9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfY2xhc3NpZnlfc3ltYm9sLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLS8qIENPRkYxIGRpZmZlcnMgaW4gc2VjdGlvbiBoZWFkZXIgc2l6ZSAqLwotc3RhdGljIENPTlNUIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSB0aWNvZmYxX3N3YXBfdGFibGUgPSAKLXsKLSAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKLSAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAotICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCi0gIGNvZmZfU1dBUF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaX1YwMSwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osIEZJTE5NTEVOLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiwKLSNpZmRlZiBDT0ZGX0ZPUkNFX1NZTUJPTFNfSU5fU1RSSU5HUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0RFQlVHX1NUUklOR19XSURFX1BSRUZJWAotICA0LAotI2Vsc2UKLSAgMiwKLSNlbmRpZgotICBjb2ZmX1NXQVBfZmlsZWhkcl9pbiwgY29mZl9TV0FQX2FvdXRoZHJfaW4sIGNvZmZfU1dBUF9zY25oZHJfaW4sCi0gIGNvZmZfU1dBUF9yZWxvY19pbiwgdGljb2ZmMV9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfY2xhc3NpZnlfc3ltYm9sLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLQotLyogVEkgQ09GRiB2MCwgRE9TIHRvb2xzIChsaXR0bGUtZW5kaWFuIGhlYWRlcnMpICovCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMF92ZWMgPQotewotICAiY29mZjAtYzU0eCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIChET1MgdG9vbHMpICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIHRpYzU0eF9nZXRsMzIsIHRpYzU0eF9nZXRsX3NpZ25lZF8zMiwgdGljNTR4X3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGljNTR4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLSAgTlVMTCwKLQotICAoUFRSKSZ0aWNvZmYwX3N3YXBfdGFibGUKLX07Ci0KLS8qIFRJIENPRkYgdjAsIFNQQVJDIHRvb2xzIChiaWctZW5kaWFuIGhlYWRlcnMpICovCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMF9iZWhfdmVjID0KLXsKLSAgImNvZmYwLWJlaC1jNTR4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUICksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgdGljNTR4X2dldGwzMiwgdGljNTR4X2dldGxfc2lnbmVkXzMyLCB0aWM1NHhfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh0aWM1NHgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICZ0aWM1NHhfY29mZjBfdmVjLAotCi0gIChQVFIpJnRpY29mZjBfc3dhcF90YWJsZQotfTsKLQotLyogVEkgQ09GRiB2MSwgRE9TIHRvb2xzIChsaXR0bGUtZW5kaWFuIGhlYWRlcnMpICovCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMV92ZWMgPQotewotICAiY29mZjEtYzU0eCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIChET1MgdG9vbHMpICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIHRpYzU0eF9nZXRsMzIsIHRpYzU0eF9nZXRsX3NpZ25lZF8zMiwgdGljNTR4X3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGljNTR4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmdGljNTR4X2NvZmYwX2JlaF92ZWMsCi0KLSAgKFBUUikmdGljb2ZmMV9zd2FwX3RhYmxlCi19OwotCi0vKiBUSSBDT0ZGIHYxLCBTUEFSQyB0b29scyAoYmlnLWVuZGlhbiBoZWFkZXJzKSAqLwotY29uc3QgYmZkX3RhcmdldCB0aWM1NHhfY29mZjFfYmVoX3ZlYyA9Ci17Ci0gICJjb2ZmMS1iZWgtYzU0eCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIHRpYzU0eF9nZXRsMzIsIHRpYzU0eF9nZXRsX3NpZ25lZF8zMiwgdGljNTR4X3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGljNTR4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmdGljNTR4X2NvZmYxX3ZlYywKLQotICAoUFRSKSZ0aWNvZmYxX3N3YXBfdGFibGUKLX07Ci0KLS8qIFRJIENPRkYgdjIsIFRJIERPUyB0b29scyBvdXRwdXQgKGxpdHRsZS1lbmRpYW4gaGVhZGVycykgKi8KLWNvbnN0IGJmZF90YXJnZXQgdGljNTR4X2NvZmYyX3ZlYyA9Ci17Ci0gICJjb2ZmMi1jNTR4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKERPUyB0b29scykgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUICksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgdGljNTR4X2dldGwzMiwgdGljNTR4X2dldGxfc2lnbmVkXzMyLCB0aWM1NHhfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh0aWM1NHgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICZ0aWM1NHhfY29mZjFfYmVoX3ZlYywKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07Ci0KLS8qIFRJIENPRkYgdjIsIFRJIFNQQVJDIHRvb2xzIG91dHB1dCAoYmlnLWVuZGlhbiBoZWFkZXJzKSAqLwotY29uc3QgYmZkX3RhcmdldCB0aWM1NHhfY29mZjJfYmVoX3ZlYyA9Ci17Ci0gICJjb2ZmMi1iZWgtYzU0eCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIHRpYzU0eF9nZXRsMzIsIHRpYzU0eF9nZXRsX3NpZ25lZF8zMiwgdGljNTR4X3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGljNTR4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmdGljNTR4X2NvZmYyX3ZlYywKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWM4MC5jIGIvYmZkL2NvZmYtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhZGUzMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzgwIE11bHRpbWVkaWEgVmlkZW8gUHJvY2Vzc29yIChNVlApLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKLQotICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCi0gICBjb2ZmIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0ZMQUdTIDEKLQotI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8xNgotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8xNgotCi1zdGF0aWMgdm9pZCBydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICpjYWNoZV9wdHIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwYmFzZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ2xvYjE1X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGxvY2FsMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHRpYzgwX2hvd3RvX3RhYmxlW10gPQotewotCi0gIEhPV1RPIChSX1JFTExPTkcsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMT05HIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01QUENSLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTVBQQ1IiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQUJTLAkJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFCUyIsCQkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQQkFTRSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBiYXNlX3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIFNwZWNpYWwgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90Ci0gICBpdHNlbGYgYSBDT0ZGIFRJYzgwIGZpbGUuICAqLwotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGJhc2UgYWRkcmVzcyB0eXBlCi0gICByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwYmFzZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNSBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBnbG9iYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ2xvYjE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgbG9jYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbG9jYWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgaG93dG9fdGFibGUuCi0gICBJZiBwYXNzZWQgYW4gcl90eXBlIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgYWJvcnQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFpbGluZwotICAgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdGljODBfaG93dG9fdGFibGUgLyBzaXplb2YgdGljODBfaG93dG9fdGFibGVbMF07IGkrKykKLSAgICB7Ci0gICAgICBpZiAodGljODBfaG93dG9fdGFibGVbaV0udHlwZSA9PSBkc3QtPnJfdHlwZSkKLQl7Ci0JICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyBpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnJlY29nbml6ZWQgcmVsb2MgdHlwZSAweCV4IiksCi0JCQkgKHVuc2lnbmVkIGludCkgZHN0LT5yX3R5cGUpOwotICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyAwOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl90aWM4MF9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgaWYgKHJlbCAtPiByX3N5bW5keCA9PSAtMSAmJiBhZGRlbmRwICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFRJICJpbnRlcm5hbCByZWxvY2F0aW9uIiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVsb2NhdGlvbgotCSBhbW91bnQgaXMgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGJlaW5nIHJlbG9jYXRlZAotCSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICovCi0gICAgICAqYWRkZW5kcCA9IChzZWMgLT4gb3V0cHV0X3NlY3Rpb24gLT4gdm1hICsgc2VjIC0+IG91dHB1dF9vZmZzZXQpIC0gc2VjIC0+IHZtYTsKLSAgICB9Ci0gIFJUWVBFMkhPV1RPICgmZ2VucmVsLCByZWwpOwotICByZXR1cm4gZ2VucmVsLmhvd3RvOwotfQotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgVElDODBCQURNQUcoeCkKLSNlbmRpZgotDAotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHJlbG9jYXRpb24gcm91dGluZSB0byBoYW5kbGUgdGhlIFBQIHJlbG9jcy4gIE1vc3QKLSAgIG9mIHRoaXMgaXMgYSBjb3B5IG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkgICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF92bWEgYWRkcjsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgYWRkciA9IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogRklYTUU6IFRoaXMgY29kZSBhc3N1bWVzIGxpdHRsZSBlbmRpYW4sIGJ1dCB0aGUgUFAgY2FuCi0gICAgICAgICBhcHBhcmVudGx5IGJlIGJpLWVuZGlhbi4gIEkgZG9uJ3Qga25vdyBpZiB0aGUgYmktZW5kaWFubmVzcwotICAgICAgICAgYXBwbGllcyB0byB0aGUgaW5zdHJ1Y3Rpb24gc2V0IG9yIGp1c3QgdG8gdGhlIGRhdGEuICAqLwotICAgICAgc3dpdGNoIChob3d0by0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFJfQUJTOgotCWNhc2UgUl9SRUxMT05HWDoKLQljYXNlIFJfUFBMMTU6Ci0JY2FzZSBSX1BQTDE1VzoKLQljYXNlIFJfUFBMMTVIOgotCWNhc2UgUl9QUExOMTU6Ci0JY2FzZSBSX1BQTE4xNVc6Ci0JY2FzZSBSX1BQTE4xNUg6Ci0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE1OgotCWNhc2UgUl9QUDE1VzoKLQljYXNlIFJfUFAxNUg6Ci0JY2FzZSBSX1BQTjE1OgotCWNhc2UgUl9QUE4xNVc6Ci0JY2FzZSBSX1BQTjE1SDoKLQkgIC8qIE9mZnNldCB0aGUgYWRkcmVzcyBzbyB0aGF0IHdlIGNhbiB1c2UgNCBieXRlIHJlbG9jYXRpb25zLiAgKi8KLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMgKyAyLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE2QjoKLQljYXNlIFJfUFBOMTZCOgotCSAgewotCSAgICAvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc3RvcmVkIGluIGJpdCA2LiAgKi8KLQkgICAgYmZkX2J5dGUgaG9sZDsKLQotCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDRdOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gJj1+IDB4MjA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSB8PSAoY29udGVudHNbYWRkcl0gPj4gMSkgJiAweDIwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMgKyAyLCBhZGRyLAotCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7Ci0JICAgIGNvbnRlbnRzW2FkZHJdICY9fiAweDQwOwotCSAgICBjb250ZW50c1thZGRyXSB8PSAoY29udGVudHNbYWRkciArIDRdIDw8IDEpICYgMHg0MDsKLQkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gaG9sZCAmIDB4MjA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSX1BQTDE2QjoKLQljYXNlIFJfUFBMTjE2QjoKLQkgIHsKLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgMjguICAqLwotCSAgICBiZmRfYnl0ZSBob2xkOwotCi0JICAgIGhvbGQgPSBjb250ZW50c1thZGRyICsgMV07Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IChjb250ZW50c1thZGRyICsgM10gPDwgMykgJiAweDgwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIGFkZHIsCi0JCQkJCSAgICAgIHZhbCwgYWRkZW5kKTsKLQkgICAgY29udGVudHNbYWRkciArIDNdICY9IH4weDEwOwotCSAgICBjb250ZW50c1thZGRyICsgM10gfD0gKGNvbnRlbnRzW2FkZHIgKyAxXSA+PiAzKSAmIDB4MTA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IGhvbGQgJiAweDgwOwotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlIFJfUFBCQVNFOgotCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLwotCSAgY29udGVudHNbYWRkcl0gJj1+IDB4MzsKLQkgIGlmICh2YWwgPj0gMHgxMDAwMDAwICYmIHZhbCA8IDB4MTAwMDgwMCkKLQkgICAgY29udGVudHNbYWRkcl0gfD0gMHgzOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyXSB8PSAweDI7Ci0JICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQTEJBU0U6Ci0JICAvKiBQYXJhbWV0ZXIgUkFNIGlzIGZyb20gMHgxMDAwMDAwIHRvIDB4MTAwMDgwMC4gICovCi0JICBjb250ZW50c1thZGRyICsgMl0gJj0gfjB4YzA7Ci0JICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCi0JICAgIGNvbnRlbnRzW2FkZHIgKyAyXSB8PSAweGMwOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHg4MDsKLQkgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBUSUM4MENPRkYgMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSN1bmRlZiBDX0FVVE9BUkcJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfVUVYVCAqLwotI3VuZGVmIENfTEFTVEVOVAkJLyogQ2xhc2hlcyB3aXRoIFRJYzgwJ3MgQ19TVEFUTEFCICovCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKHRpYzgwY29mZl92ZWMsICJjb2ZmLXRpYzgwIiwgRF9QQUdFRCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdTY4ay5jIGIvYmZkL2NvZmYtdTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VhNzNmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXU2OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcyBoYXZpbmcgdW5kZXJzY29yZSB3aXRoIG5hbWUuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtjb2ZmdW5fdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstdW4iCi0KLSNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0KLS8qIGRlZmluZSB0aGlzIHRvIG5vdCBoYXZlIG11bHRpcGxlIGNvcHkgb2YgbTY4a19ydHlwZTJob3d0bwotICAgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0KLS8qIFRoaXMgbWFnaWMgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lcyBoYXZlIHVuZGVyc2NvcmVzLgotICAgT3RoZXIgNjhrIG1hZ2ljIG51bWJlcnMgaW5kaWNhdGUgdGhhdCB0aGUgbmFtZXMgZG8gbm90IGhhdmUKLSAgIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBNQzY4S0JDU01BR0lDKQotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi13NjUuYyBiL2JmZC9jb2ZmLXc2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc5YmZiLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgV0RDIDY1ODE2IENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi93NjUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9XNjVfQUJTOCwgICAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMjQsICAgMCwgIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMyNCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTOCwgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTMTYsIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2UzgsIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiPmFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTMTYsMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9QQ1I4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWw4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1c2NV9QQ1IxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X0RQLCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiZHAiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoVzY1QkFETUFHKHgpKQotI2RlZmluZSBXNjUgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGUgOwotfQotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIDE7Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikmKGJmZF9hYnNfc3ltYm9sKTsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLQotc3RhdGljIGludAotaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmRfdm1hIHZhbHVlOyAgCi0gIGJmZF92bWEgZG90OwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgdGhlIHNpemUgb2YgdGhlIHNocmluayAgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgdW5jb29rZWQgc2VjdGlvbiAqLwotCi0gIC8qICByZWxvYy0+YWRkcmVzcyAtPSBzaHJpbms7ICAgY29uY2VwdHVhbCAqLwotCi0gIGJmZF92bWEgYWRkcmVzcyA9IHJlbG9jLT5hZGRyZXNzIC0gc2hyaW5rOwotICAKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7ICAgICAKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIHNocmluays9MjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGluZyBpcyBhIG1vdmUgb25lIGJ5dGUgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAweGZmMDApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMTZiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMTYgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGUgcGxhY2UgdG8gcmVsYyBtb3ZlcyBiYWNrIGJ5IG9uZSAqLwotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0gICAgICAKLQotICAgICAgYnJlYWs7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSAyNCBiaXQgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdHRlciwgCi0gICAgICAgdGhlIHJlbG9jYXRpb24gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbnNuLCBub3QgdGhlCi0gICAgICAgYWN0dWFsIGRhdGEgKi8KLQotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCi0gICAgICBkb3QgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzczsKLSAgCi0gICAgICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMTI3IGJ5dGVzIG9mIHdoZXJlCi0JIHdlIGFyZSwgaWYgc28gdGhlbiB3ZSBjYW4gdXNlIGEgc21hbGwgYnJhbmNoIHJhdGhlciB0aGFuIHRoZQotCSBqdW1wIHdlIHdlcmUgZ29pbmcgdG8gKi8KLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3QgOwotICAKLSAgICAgIGlmICgtMTIwIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDEyMCApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMjRiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMzIgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QMToKLQotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIChkb3QgLSBzaHJpbmspOwotICAKLQotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0KLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgCi0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogRmlyc3QgcGhhc2Ugb2YgYSByZWxheGluZyBsaW5rICovCi0KLS8qIFJlbG9jIHR5cGVzCi0gICBsYXJnZQkJc21hbGwKLSAgIFJfTU9WMTZCMQkJUl9NT1YxNkIyCW1vdi5iIHdpdGggMTZiaXQgb3IgOCBiaXQgYWRkcmVzcwotICAgUl9KTVAxCQlSX0pNUDIJCWptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfSk1QTDEJCVJfSk1QTF9COAkyNGptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfTU9WMjRCMQkJUl9NT1YyNEIyCTI0IG9yIDggYml0IHJlbG9jIGZvciBtb3YuYgotCi0qLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVzY1X0FCUzg6Ci0gICAgY2FzZSBSX1c2NV9EUDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9BQlM4UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49MTY7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2Uzg6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0gODsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlMxNjoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSAxNjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzI0OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXA+PjE2LCBkYXRhK2RzdF9hZGRyZXNzKzIpOwotCWRzdF9hZGRyZXNzICs9IDM7Ci0Jc3JjX2FkZHJlc3MgKz0gMzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1I4OgotICAgICAgewotCWludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCWdhcCAtPSBkb3QgKyAxOwotCWlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNykgewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCgpOwotCX0KLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfUENSMTY6Ci0gICAgICB7Ci0JYmZkX3ZtYSBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCi0JLyogVGhpcyB3cmFwcyB3aXRoaW4gdGhlIHBhZ2UsIHNvIGlnbm9yZSB0aGUgcmVsYXRpdmVuZXNzLCBsb29rIGF0IHRoZQotCSAgIGhpZ2ggcGFydCAqLwotCWlmICgoZ2FwICYgMHhmMDAwMCkgIT0gKGRvdCAmIDB4ZjAwMDApKSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCi0JZ2FwIC09IGRvdCArIDI7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYoXygiaWdub3JpbmcgcmVsb2MgJXNcbiIpLCByZWxvYy0+aG93dG8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcwotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAodzY1X3ZlYywgImNvZmYtdzk1IiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtd2UzMmsuYyBiL2JmZC9jb2ZmLXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTlhZDcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtd2UzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igd2UzMmsgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi93ZTMyay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gICAgRU1QVFlfSE9XVE8gKDApLAotICAgIEVNUFRZX0hPV1RPICgxKSwKLSAgICBFTVBUWV9IT1dUTyAoMiksCi0gICAgRU1QVFlfSE9XVE8gKDMpLAotICAgIEVNUFRZX0hPV1RPICg0KSwKLSAgICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPKFJfRElSMzIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImRpcjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gICAgRU1QVFlfSE9XVE8gKDcpLAotICAgIEVNUFRZX0hPV1RPICgwMTApLAotICAgIEVNUFRZX0hPV1RPICgwMTEpLAotICAgIEVNUFRZX0hPV1RPICgwMTIpLAotICAgIEVNUFRZX0hPV1RPICgwMTMpLAotICAgIEVNUFRZX0hPV1RPICgwMTQpLAotICAgIEVNUFRZX0hPV1RPICgwMTUpLAotICAgIEVNUFRZX0hPV1RPICgwMTYpLAotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIFdFMzJLQkFETUFHKHgpCi0jZGVmaW5lIFdFMzJLCTEKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jZGVmaW5lIGNvZmZfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDICh3ZTMya2NvZmZfdmVjLCAiY29mZi13ZTMyayIsIDAsIDAsIDAsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi16OGsuYyBiL2JmZC9jb2ZmLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWYyOWE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgWmlsb2cgWjgwMG4gQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi96OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9Ci1IT1dUTyAoUl9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsCi0gICAgICAgMHhmZmZmZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTRsID0KLUhPV1RPIChSX0lNTTRMLCAwLCAxLCA0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tNGwiLCB0cnVlLCAweGYsIDB4ZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2RhID0KLUhPV1RPIChSX0lNTTE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2RhIiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwKLSAgICAgICBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9Ci1IT1dUTyAoUl9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCi0gICAgICAgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2pyID0KLUhPV1RPIChSX0pSLCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0gICAgICAgInJfanIiLCB0cnVlLCAwLCAwLCB0cnVlKTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfejhrX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl96OGtfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIFo4S0JBRE1BRyh4KQotI2RlZmluZSBaOEsgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICogaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTg7Ci0gICAgICBicmVhazsKLSAgICAgY2FzZSBSX0lNTTE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfZGE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSlI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9qcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tNGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZCAKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGJmZF9wdXRfMzIgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDQ7Ci0gICAgICAoKnNyY19wdHIpICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJICgoYmZkX2dldF84IChpbl9hYmZkLCBkYXRhICsgKmRzdF9wdHIpICYgMHhmMCkgCi0JCSAgfCAoMHgwZgotCQkgICAgICYgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uKSkpLAotCQkgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pSOgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCQkgICAgICAgKyAqZHN0X3B0cgotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCAmIDEpCi0JICBhYm9ydCAoKTsKLQlnYXAgLz0gMjsKLQlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpKys7Ci0JKCpzcmNfcHRyKSsrOwotCWJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGV4dHJhX2Nhc2UKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQotI3VuZGVmICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDICh6OGtjb2ZmX3ZlYywgImNvZmYtejhrIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmY2NC1yczYwMDAuYyBiL2JmZC9jb2ZmNjQtcnM2MDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWM1MDEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmY2NC1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIElCTSBSUy82MDAwICJYQ09GRjY0IiBmaWxlcy4KLSAgIENvcHlyaWdodCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gQ2xpbnRvbiBQb3BldHouCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBJbnRlcm5hbGNvZmYuaCBhbmQgY29mZmNvZGUuaCBtb2RpZnkgdGhlbXNlbHZlcyBiYXNlZCBvbiB0aGVzZSBmbGFncy4gICovCi0jZGVmaW5lIFhDT0ZGNjQgCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9yczZrNjQuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLQotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgTUFYX1NDTkhEUl9OUkVMT0MgMHhmZmZmZmZmZgotI2RlZmluZSBQVVRfU0NOSERSX05SRUxPQyBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgR0VUX1NDTkhEUl9OTE5OTyBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgTUFYX1NDTkhEUl9OTE5OTyAweGZmZmZmZmZmCi0jZGVmaW5lIFBVVF9TQ05IRFJfTkxOTk8gYmZkX2hfcHV0XzMyCi0jZGVmaW5lIEdFVF9SRUxPQ19WQUREUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1JFTE9DX1ZBRERSIGJmZF9oX3B1dF82NAotCi0jZGVmaW5lIENPRkZfRk9SQ0VfU1lNQk9MU19JTl9TVFJJTkdTCi0jZGVmaW5lIENPRkZfREVCVUdfU1RSSU5HX1dJREVfUFJFRklYCi0KLQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QoQUJGRCxJTlQsRVhUKSBcCi1kbyB7IFwKLSAgbWVtc2V0ICgoKFNDTkhEUiAqKUVYVCktPnNfcGFkLCAwLCBzaXplb2YgKCgoU0NOSERSICopRVhUKS0+c19wYWQpKTtcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0KLSNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19pbiB4Y29mZjY0X3N3YXBfbGluZW5vX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9fb3V0IHhjb2ZmNjRfc3dhcF9saW5lbm9fb3V0Ci0KLSNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgUFVUQllURSBiZmRfaF9wdXRfOAotI2RlZmluZSBHRVRXT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRIQUxGIGJmZF9oX2dldF8xNgotI2RlZmluZSBHRVRCWVRFIGJmZF9oX2dldF84Ci0KLQotLyogRm9yIFhDT0ZGNjQsIHRoZSBlZmZlY3RpdmUgd2lkdGggb2Ygc3ltbmR4IGNoYW5nZXMgZGVwZW5kaW5nIG9uIAotICAgd2hldGhlciB3ZSBhcmUgdGhlIGZpcnN0IGVudHJ5LiAgU2lnaC4gICovCi1zdGF0aWMgdm9pZAoteGNvZmY2NF9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9sbm5vID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSAgaWYgKGluLT5sX2xubm8gPT0gMCkKLSAgICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gCi0JICAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotICBlbHNlCi0gICAgaW4tPmxfYWRkci5sX3N5bW5keCA9IAotCSAgICBiZmRfaF9nZXRfNjQoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAoteGNvZmY2NF9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBQVVRXT1JEKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQotCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmxfbG5ubywgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSAgaWYgKGluLT5sX2xubm8gPT0gMCkKLSAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKWV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgZWxzZQotICAgIGJmZF9oX3B1dF82NCAoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotCi0gIHJldHVybiBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotfQotCi0KLXN0YXRpYyB2b2lkIHhjb2ZmNjRfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHhjb2ZmNjRfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgeGNvZmY2NF9zd2FwX2F1eF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCB4Y29mZjY0X3N3YXBfYXV4X291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotCi1zdGF0aWMgdm9pZAoteGNvZmY2NF9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotCi0gIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX29mZnNldCk7Ci0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzY0KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZV92YWx1ZSk7IAotICBpbi0+bl9zY251bSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICBpbi0+bl9zY2xhc3MgPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfc2NsYXNzKTsKLSAgaW4tPm5fbnVtYXV4ID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX251bWF1eCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXhjb2ZmNjRfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZV9vZmZzZXQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgIGluLT5uX3ZhbHVlICwgKGJmZF9ieXRlICopIGV4dC0+ZS5lX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fc2NsYXNzICwgZXh0LT5lX3NjbGFzcyk7Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9udW1hdXggLCBleHQtPmVfbnVtYXV4KTsKLSAgcmV0dXJuIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14Y29mZjY0X3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgCSAgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgICBpbmR4OwotICAgICBpbnQJICAgICAgbnVtYXV4OwotICAgICBQVFIgCSAgICAgIGluMTsKLXsKLSAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7Ci0KLSAgc3dpdGNoIChjbGFzcykgewotICAgIGNhc2UgQ19GSUxFOgotICAgICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotCSAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotCSAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPSAKLQkgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKG51bWF1eCA+IDEpCi0JICAgICAgewotCQlpZiAoaW5keCA9PSAwKQotCSAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsCi0JCQkgIG51bWF1eCAqIHNpemVvZiAoQVVYRU5UKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGdvdG8gZW5kOwotCi0gICAgICAvKiBSUy82MDAwICJjc2VjdCIgYXV4ZW50cyAqLwotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX0hJREVYVDoKLSAgICAgIGlmIChpbmR4ICsgMSA9PSBudW1hdXgpCi0JewotCSAgaW4tPnhfY3NlY3QueF9zY25sZW4ubCA9IAotCSAgICAgIGJmZF9oX2dldF8zMihhYmZkLCBleHQtPnhfY3NlY3QueF9zY25sZW5fbG8pOwotCSAgLyogRklYTUU6IElmIHdlIHdhbnQgc2VjdGlvbiBsZW5ndGhzIGxhcmdlciB0aGFuIDMyIGJpdHMsIHdlIG5lZWQgCi0JICAgICB0byBtb2RpZnkgdGhlIGludGVybmFsIGNvZmYgc3RydWN0dXJlcyB0byBzdXBwb3J0IGl0LiAgKi8KLQkgIGluLT54X2NzZWN0LnhfcGFybWhhc2ggPSBiZmRfaF9nZXRfMzIgKGFiZmQsCi0JCQkJCQkgZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCSAgaW4tPnhfY3NlY3QueF9zbmhhc2ggICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25oYXNoKTsKLQkgIC8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICAgIGRlZmluZWQgYnkgc2hpZnRzLWFuZC1hbmRzLCB3aGljaCBhcmUgZXF1aXZhbGVudCBvbiBhbGwKLQkgICAgIGJ5dGUgb3JkZXJzLiAgKi8KLQkgIGluLT54X2NzZWN0Lnhfc210eXAgICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQkgIGluLT54X2NzZWN0Lnhfc21jbGFzICAgPSBiZmRfaF9nZXRfOCAgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NtY2xhcyk7Ci0JICBnb3RvIGVuZDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19MRUFGU1RBVDoKLSAgICBjYXNlIENfSElEREVOOgotICAgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0JICAvKiBQRSBkZWZpbmVzIHNvbWUgZXh0cmEgZmllbGRzOyB3ZSB6ZXJvIHRoZW0gb3V0IGZvcgotICAgICAgICAgICAgIHNhZmV0eS4gICovCi0JICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgIGluLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0KLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gYmZkX2hfZ2V0XzY0KGFiZmQsIChiZmRfYnl0ZSAqKQotCSAgICAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKQotCSAgICAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpOwotICAgIH0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZnNpemUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikKLQkgICAgZXh0LT54X3N5bS54X2ZjbmFyeS54X2xuc3oueF9sbm5vKTsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopCi0JICAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9sbnN6Lnhfc2l6ZSk7Ci0gIH0KLQotZW5kOiA7Ci0gIC8qIHRoZSBzZW1pY29sb24gaXMgYmVjYXVzZSBNU1ZDIGRvZXNuJ3QgbGlrZSBsYWJlbHMgYXQKLSAgICAgZW5kIG9mIGJsb2NrLiAqLwotCi19Ci0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci14Y29mZjY0X3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICAqYWJmZDsKLSAgICAgUFRSIAlpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIJZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSAgbWVtc2V0KChQVFIpZXh0LCAwLCBiZmRfY29mZl9hdXhlc3ogKGFiZmQpKTsKLSAgc3dpdGNoIChjbGFzcykKLSAgICB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChpbi0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkKLSAgICAgIHsKLSAgICAgIFBVVFdPUkQoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X3plcm9lcyk7Ci0gICAgICBQVVRXT1JEKGFiZmQsCi0JICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQsCi0JICAgICAgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0gICAgICB9Ci0gICAgUFVUQllURSAoYWJmZCwgX0FVWF9GSUxFLCAoYmZkX2J5dGUgKikgZXh0LT54X2F1eHR5cGUueF9hdXh0eXBlKTsKLSAgICBnb3RvIGVuZDsKLQotICAvKiBSUy82MDAwICJjc2VjdCIgYXV4ZW50cyAqLwotICBjYXNlIENfRVhUOgotICBjYXNlIENfSElERVhUOgotICAgIGlmIChpbmR4ICsgMSA9PSBudW1hdXgpCi0gICAgICB7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9zY25sZW4ubCwgZXh0LT54X2NzZWN0Lnhfc2NubGVuX2xvKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3Bhcm1oYXNoLAlleHQtPnhfY3NlY3QueF9wYXJtaGFzaCk7Ci0JUFVUSEFMRiAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbmhhc2gsCWV4dC0+eF9jc2VjdC54X3NuaGFzaCk7Ci0JLyogV2UgZG9uJ3QgaGF2ZSB0byBoYWNrIGJpdGZpZWxkcyBpbiB4X3NtdHlwIGJlY2F1c2UgaXQncwotCSAgIGRlZmluZWQgYnkgc2hpZnRzLWFuZC1hbmRzLCB3aGljaCBhcmUgZXF1aXZhbGVudCBvbiBhbGwKLQkgICBieXRlIG9yZGVycy4gICovCi0JUFVUQllURSAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbXR5cCwJZXh0LT54X2NzZWN0Lnhfc210eXApOwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc21jbGFzLAlleHQtPnhfY3NlY3QueF9zbWNsYXMpOwotICAgIAlQVVRCWVRFIChhYmZkLCBfQVVYX0NTRUNULCAoYmZkX2J5dGUgKikgZXh0LT54X2F1eHR5cGUueF9hdXh0eXBlKTsKLQlnb3RvIGVuZDsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENfU1RBVDoKLSAgY2FzZSBDX0xFQUZTVEFUOgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzY0KGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCAKLQkgICAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOwotICAgICAgUFVUQllURSAoYWJmZCwgX0FVWF9GQ04sIChiZmRfYnl0ZSAqKSBleHQtPnhfYXV4dHlwZS54X2F1eHR5cGUpOwotICAgICAgUFVUV09SRChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KTsKLSAgICB9Ci0gIGlmIChJU0ZDTiAodHlwZSkpCi0gICAgUFVUV09SRCAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZnNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgCi0JICAgICAgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X2ZjbmFyeS54X2xuc3oueF9sbm5vKTsKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIAotCSAgICAgIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9mY25hcnkueF9sbnN6Lnhfc2l6ZSk7Ci0gICAgfQotCi1lbmQ6Ci0gIHJldHVybiBiZmRfY29mZl9hdXhlc3ogKGFiZmQpOwotfQotCi0KLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiB4Y29mZjY0X3N3YXBfc3ltX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9zeW1fb3V0IHhjb2ZmNjRfc3dhcF9zeW1fb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfaW4geGNvZmY2NF9zd2FwX2F1eF9pbgotI2RlZmluZSBjb2ZmX1NXQVBfYXV4X291dCB4Y29mZjY0X3N3YXBfYXV4X291dAotCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJhaXhjb2ZmNjQtcnM2MDAwIgotI2RlZmluZSBUQVJHRVRfU1lNIHJzNjAwMGNvZmY2NF92ZWMKLQotI2luY2x1ZGUgInhjb2ZmLXRhcmdldC5oIgotCmRpZmYgLS1naXQgYS9iZmQvY29mZmNvZGUuaCBiL2JmZC9jb2ZmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM4NjIwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIyNSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0qLwotLyoKLQotU0VDVElPTgotCWNvZmYgYmFja2VuZHMKLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgY29mZiBmb3JtYXQuCi0JVGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gZm9ybWF0cyBhcmUgdGhlIHNpemVzIGFuZAotCWFsaWdubWVudHMgb2YgZmllbGRzIGluIHN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBvY2Nhc2lvbmFsCi0JZXh0cmEgZmllbGQuCi0KLQlDb2ZmIGluIGFsbCBpdHMgdmFyaWV0aWVzIGlzIGltcGxlbWVudGVkIHdpdGggYSBmZXcgY29tbW9uCi0JZmlsZXMgYW5kIGEgbnVtYmVyIG9mIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGZpbGVzLiBGb3IKLQlleGFtcGxlLCBUaGUgODhrIGJjcyBjb2ZmIGZvcm1hdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgZmlsZQotCUBmaWxle2NvZmYtbTg4ay5jfS4gVGhpcyBmaWxlIEBjb2RleyNpbmNsdWRlfXMKLQlAZmlsZXtjb2ZmL204OGsuaH0gd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlIG9mIHRoZQotCWNvZmYgZm9ybWF0IGZvciB0aGUgODhrLCBhbmQgQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSB3aGljaAotCWRlZmluZXMgdGhlIGludGVybmFsIHN0cnVjdHVyZS4gQGZpbGV7Y29mZi1tODhrLmN9IGFsc28KLQlkZWZpbmVzIHRoZSByZWxvY2F0aW9ucyB1c2VkIGJ5IHRoZSA4OGsgZm9ybWF0Ci0JQHhyZWZ7UmVsb2NhdGlvbnN9LgotCi0JVGhlIEludGVsIGk5NjAgcHJvY2Vzc29yIHZlcnNpb24gb2YgY29mZiBpcyBpbXBsZW1lbnRlZCBpbgotCUBmaWxle2NvZmYtaTk2MC5jfS4gVGhpcyBmaWxlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMKLQlAZmlsZXtjb2ZmLW04OGsuY30sIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIEBmaWxle2NvZmYvaTk2MC5ofQotCXJhdGhlciB0aGFuIEBmaWxle2NvZmYtbTg4ay5ofS4KLQotU1VCU0VDVElPTgotCVBvcnRpbmcgdG8gYSBuZXcgdmVyc2lvbiBvZiBjb2ZmCi0KLQlUaGUgcmVjb21tZW5kZWQgbWV0aG9kIGlzIHRvIHNlbGVjdCBmcm9tIHRoZSBleGlzdGluZwotCWltcGxlbWVudGF0aW9ucyB0aGUgdmVyc2lvbiBvZiBjb2ZmIHdoaWNoIGlzIG1vc3QgbGlrZSB0aGUgb25lCi0JeW91IHdhbnQgdG8gdXNlLiAgRm9yIGV4YW1wbGUsIHdlJ2xsIHNheSB0aGF0IGkzODYgY29mZiBpcwotCXRoZSBvbmUgeW91IHNlbGVjdCwgYW5kIHRoYXQgeW91ciBjb2ZmIGZsYXZvdXIgaXMgY2FsbGVkIGZvby4KLQlDb3B5IEBmaWxle2kzODZjb2ZmLmN9IHRvIEBmaWxle2Zvb2NvZmYuY30sIGNvcHkKLQlAZmlsZXsuLi9pbmNsdWRlL2NvZmYvaTM4Ni5ofSB0byBAZmlsZXsuLi9pbmNsdWRlL2NvZmYvZm9vLmh9LAotCWFuZCBhZGQgdGhlIGxpbmVzIHRvIEBmaWxle3RhcmdldHMuY30gYW5kIEBmaWxle01ha2VmaWxlLmlufQotCXNvIHRoYXQgeW91ciBuZXcgYmFjayBlbmQgaXMgdXNlZC4gQWx0ZXIgdGhlIHNoYXBlcyBvZiB0aGUKLQlzdHJ1Y3R1cmVzIGluIEBmaWxley4uL2luY2x1ZGUvY29mZi9mb28uaH0gc28gdGhhdCB0aGV5IG1hdGNoCi0Jd2hhdCB5b3UgbmVlZC4gWW91IHdpbGwgcHJvYmFibHkgYWxzbyBoYXZlIHRvIGFkZAotCUBjb2RleyNpZmRlZn1zIHRvIHRoZSBjb2RlIGluIEBmaWxle2NvZmYvaW50ZXJuYWwuaH0gYW5kCi0JQGZpbGV7Y29mZmNvZGUuaH0gaWYgeW91ciB2ZXJzaW9uIG9mIGNvZmYgaXMgdG9vIHdpbGQuCi0KLQlZb3UgY2FuIHZlcmlmeSB0aGF0IHlvdXIgbmV3IEJGRCBiYWNrZW5kIHdvcmtzIHF1aXRlIHNpbXBseSBieQotCWJ1aWxkaW5nIEBmaWxle29iamR1bXB9IGZyb20gdGhlIEBmaWxle2JpbnV0aWxzfSBkaXJlY3RvcnksCi0JYW5kIG1ha2luZyBzdXJlIHRoYXQgaXRzIHZlcnNpb24gb2Ygd2hhdCdzIGdvaW5nIG9uIGFuZCB5b3VyCi0JaG9zdCBzeXN0ZW0ncyBpZGVhIChhc3N1bWluZyBpdCBoYXMgdGhlIHByZXR0eSBzdGFuZGFyZCBjb2ZmCi0JZHVtcCB1dGlsaXR5LCB1c3VhbGx5IGNhbGxlZCBAY29kZXthdHQtZHVtcH0gb3IganVzdAotCUBjb2Rle2R1bXB9KSBhcmUgdGhlIHNhbWUuICBUaGVuIGNsZWFuIHVwIHlvdXIgY29kZSwgYW5kIHNlbmQKLQl3aGF0IHlvdSd2ZSBkb25lIHRvIEN5Z251cy4gVGhlbiB5b3VyIHN0dWZmIHdpbGwgYmUgaW4gdGhlCi0JbmV4dCByZWxlYXNlLCBhbmQgeW91IHdvbid0IGhhdmUgdG8ga2VlcCBpbnRlZ3JhdGluZyBpdC4KLQotU1VCU0VDVElPTgotCUhvdyB0aGUgY29mZiBiYWNrZW5kIHdvcmtzCi0KLVNVQlNVQlNFQ1RJT04KLQlGaWxlIGxheW91dAotCi0JVGhlIENvZmYgYmFja2VuZCBpcyBzcGxpdCBpbnRvIGdlbmVyaWMgcm91dGluZXMgdGhhdCBhcmUKLQlhcHBsaWNhYmxlIHRvIGFueSBDb2ZmIHRhcmdldCBhbmQgcm91dGluZXMgdGhhdCBhcmUgc3BlY2lmaWMKLQl0byBhIHBhcnRpY3VsYXIgdGFyZ2V0LiAgVGhlIHRhcmdldC1zcGVjaWZpYyByb3V0aW5lcyBhcmUKLQlmdXJ0aGVyIHNwbGl0IGludG8gb25lcyB3aGljaCBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGZvciBhbGwKLQlDb2ZmIHRhcmdldHMgZXhjZXB0IHRoYXQgdGhleSB1c2UgdGhlIGV4dGVybmFsIHN5bWJvbCBmb3JtYXQKLQlvciB1c2UgZGlmZmVyZW50IHZhbHVlcyBmb3IgY2VydGFpbiBjb25zdGFudHMuCi0KLQlUaGUgZ2VuZXJpYyByb3V0aW5lcyBhcmUgaW4gQGZpbGV7Y29mZmdlbi5jfS4gIFRoZXNlIHJvdXRpbmVzCi0Jd29yayBmb3IgYW55IENvZmYgdGFyZ2V0LiAgVGhleSB1c2Ugc29tZSBob29rcyBpbnRvIHRoZSB0YXJnZXQKLQlzcGVjaWZpYyBjb2RlOyB0aGUgaG9va3MgYXJlIGluIGEgQGNvZGV7YmZkX2NvZmZfYmFja2VuZF9kYXRhfQotCXN0cnVjdHVyZSwgb25lIG9mIHdoaWNoIGV4aXN0cyBmb3IgZWFjaCB0YXJnZXQuCi0KLQlUaGUgZXNzZW50aWFsbHkgc2ltaWxhciB0YXJnZXQtc3BlY2lmaWMgcm91dGluZXMgYXJlIGluCi0JQGZpbGV7Y29mZmNvZGUuaH0uICBUaGlzIGhlYWRlciBmaWxlIGluY2x1ZGVzIGV4ZWN1dGFibGUgQyBjb2RlLgotCVRoZSB2YXJpb3VzIENvZmYgdGFyZ2V0cyBmaXJzdCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBDb2ZmCi0JaGVhZGVyIGZpbGUsIG1ha2UgYW55IHNwZWNpYWwgZGVmaW5lcyB0aGF0IGFyZSBuZWVkZWQsIGFuZAotCXRoZW4gaW5jbHVkZSBAZmlsZXtjb2ZmY29kZS5ofS4KLQotCVNvbWUgb2YgdGhlIENvZmYgdGFyZ2V0cyB0aGVuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHJvdXRpbmVzIGluCi0JdGhlIHRhcmdldCBzb3VyY2UgZmlsZSBpdHNlbGYuCi0KLQlGb3IgZXhhbXBsZSwgQGZpbGV7Y29mZi1pOTYwLmN9IGluY2x1ZGVzCi0JQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSBhbmQgQGZpbGV7Y29mZi9pOTYwLmh9LiAgSXQgdGhlbgotCWRlZmluZXMgYSBmZXcgY29uc3RhbnRzLCBzdWNoIGFzIEBjb2Rle0k5NjB9LCBhbmQgaW5jbHVkZXMKLQlAZmlsZXtjb2ZmY29kZS5ofS4gIFNpbmNlIHRoZSBpOTYwIGhhcyBjb21wbGV4IHJlbG9jYXRpb24KLQl0eXBlcywgQGZpbGV7Y29mZi1pOTYwLmN9IGFsc28gaW5jbHVkZXMgc29tZSBjb2RlIHRvCi0JbWFuaXB1bGF0ZSB0aGUgaTk2MCByZWxvY3MuICBUaGlzIGNvZGUgaXMgbm90IGluCi0JQGZpbGV7Y29mZmNvZGUuaH0gYmVjYXVzZSBpdCB3b3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIKLQl0YXJnZXQuCi0KLVNVQlNVQlNFQ1RJT04KLQlCaXQgdHdpZGRsaW5nCi0KLQlFYWNoIGZsYXZvdXIgb2YgY29mZiBzdXBwb3J0ZWQgaW4gQkZEIGhhcyBpdHMgb3duIGhlYWRlciBmaWxlCi0JZGVzY3JpYmluZyB0aGUgZXh0ZXJuYWwgbGF5b3V0IG9mIHRoZSBzdHJ1Y3R1cmVzLiBUaGVyZSBpcyBhbHNvCi0JYW4gaW50ZXJuYWwgZGVzY3JpcHRpb24gb2YgdGhlIGNvZmYgbGF5b3V0LCBpbgotCUBmaWxle2NvZmYvaW50ZXJuYWwuaH0uIEEgbWFqb3IgZnVuY3Rpb24gb2YgdGhlCi0JY29mZiBiYWNrZW5kIGlzIHN3YXBwaW5nIHRoZSBieXRlcyBhbmQgdHdpZGRsaW5nIHRoZSBiaXRzIHRvCi0JdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmVzIGludG8gdGhlIG5vcm1hbAotCWludGVybmFsIGZvcm0uIFRoaXMgaXMgYWxsIHBlcmZvcm1lZCBpbiB0aGUKLQlAY29kZXtiZmRfc3dhcH1fQGl7dGhpbmd9X0Bpe2RpcmVjdGlvbn0gcm91dGluZXMuIFNvbWUKLQllbGVtZW50cyBhcmUgZGlmZmVyZW50IHNpemVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mCi0JY29mZjsgaXQgaXMgdGhlIGR1dHkgb2YgdGhlIGNvZmYgdmVyc2lvbiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKLQl0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbnMgb2YgdmFyaW91cyBwYWNraW5nIHJvdXRpbmVzIGluCi0JQGZpbGV7Y29mZmNvZGUuaH0uIEUuZy4sIHRoZSBzaXplIG9mIGxpbmUgbnVtYmVyIGVudHJ5IGluIGNvZmYgaXMKLQlzb21ldGltZXMgMTYgYml0cywgYW5kIHNvbWV0aW1lcyAzMiBiaXRzLiBAY29kZXsjZGVmaW5lfWluZwotCUBjb2Rle1BVVF9MTlNaX0xOTk99IGFuZCBAY29kZXtHRVRfTE5TWl9MTk5PfSB3aWxsIHNlbGVjdCB0aGUKLQljb3JyZWN0IG9uZS4gTm8gZG91YnQsIHNvbWUgZGF5IHNvbWVvbmUgd2lsbCBmaW5kIGEgdmVyc2lvbiBvZgotCWNvZmYgd2hpY2ggaGFzIGEgdmFyeWluZyBmaWVsZCBzaXplIG5vdCBjYXRlcmVkIHRvIGF0IHRoZQotCW1vbWVudC4gVG8gcG9ydCBCRkQsIHRoYXQgcGVyc29uIHdpbGwgaGF2ZSB0byBhZGQgbW9yZSBAY29kZXsjZGVmaW5lc30uCi0JVGhyZWUgb2YgdGhlIGJpdCB0d2lkZGxpbmcgcm91dGluZXMgYXJlIGV4cG9ydGVkIHRvCi0JQGNvZGV7Z2RifTsgQGNvZGV7Y29mZl9zd2FwX2F1eF9pbn0sIEBjb2Rle2NvZmZfc3dhcF9zeW1faW59Ci0JYW5kIEBjb2Rle2NvZmZfc3dhcF9saW5lbm9faW59LiBAY29kZXtHREJ9IHJlYWRzIHRoZSBzeW1ib2wKLQl0YWJsZSBvbiBpdHMgb3duLCBidXQgdXNlcyBCRkQgdG8gZml4IHRoaW5ncyB1cC4gIE1vcmUgb2YgdGhlCi0JYml0IHR3aWRkbGVycyBhcmUgZXhwb3J0ZWQgZm9yIEBjb2Rle2dhc307Ci0JQGNvZGV7Y29mZl9zd2FwX2F1eF9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfc3ltX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX2xpbmVub19vdXR9LCBAY29kZXtjb2ZmX3N3YXBfcmVsb2Nfb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfZmlsZWhkcl9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfYW91dGhkcl9vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9zY25oZHJfb3V0fS4gQGNvZGV7R2FzfSBjdXJyZW50bHkga2VlcHMgdHJhY2sKLQlvZiBhbGwgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVsb2MgZHJ1ZGdlcnkgaXRzZWxmLCB0aGVyZWJ5Ci0Jc2F2aW5nIHRoZSBpbnRlcm5hbCBCRkQgb3ZlcmhlYWQsIGJ1dCB1c2VzIEJGRCB0byBzd2FwIHRoaW5ncwotCW9uIHRoZSB3YXkgb3V0LCBtYWtpbmcgY3Jvc3MgcG9ydHMgbXVjaCBzYWZlci4gIERvaW5nIHNvIGFsc28KLQlhbGxvd3MgQkZEIChhbmQgdGh1cyB0aGUgbGlua2VyKSB0byB1c2UgdGhlIHNhbWUgaGVhZGVyIGZpbGVzCi0JYXMgQGNvZGV7Z2FzfSwgd2hpY2ggbWFrZXMgb25lIGF2ZW51ZSB0byBkaXNhc3RlciBkaXNhcHBlYXIuCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgcmVhZGluZwotCi0JVGhlIHNpbXBsZSBjYW5vbmljYWwgZm9ybSBmb3Igc3ltYm9scyB1c2VkIGJ5IEJGRCBpcyBub3QgcmljaAotCWVub3VnaCB0byBrZWVwIGFsbCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIGEgY29mZiBzeW1ib2wKLQl0YWJsZS4gVGhlIGJhY2sgZW5kIGdldHMgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBrZWVwaW5nIHRoZSBvcmlnaW5hbAotCXN5bWJvbCB0YWJsZSBhcm91bmQsICJiZWhpbmQgdGhlIHNjZW5lcyIuCi0KLQlXaGVuIGEgc3ltYm9sIHRhYmxlIGlzIHJlcXVlc3RlZCAodGhyb3VnaCBhIGNhbGwgdG8KLQlAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0pLCBhIHJlcXVlc3QgZ2V0cyB0aHJvdWdoIHRvCi0JQGNvZGV7Y29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWJ9LiBUaGlzIHJlYWRzIHRoZSBzeW1ib2wgdGFibGUgZnJvbQotCXRoZSBjb2ZmIGZpbGUgYW5kIHN3YXBzIGFsbCB0aGUgc3RydWN0dXJlcyBpbnNpZGUgaW50byB0aGUKLQlpbnRlcm5hbCBmb3JtLiBJdCBhbHNvIGZpeGVzIHVwIGFsbCB0aGUgcG9pbnRlcnMgaW4gdGhlIHRhYmxlCi0JKHJlcHJlc2VudGVkIGluIHRoZSBmaWxlIGJ5IG9mZnNldHMgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluCi0JdGhlIHRhYmxlKSBpbnRvIHBoeXNpY2FsIHBvaW50ZXJzIHRvIGVsZW1lbnRzIGluIHRoZSBuZXcKLQlpbnRlcm5hbCB0YWJsZS4gVGhpcyBpbnZvbHZlcyBzb21lIHdvcmsgc2luY2UgdGhlIG1lYW5pbmdzIG9mCi0JZmllbGRzIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiBjb250ZXh0OiBhIGZpZWxkIHRoYXQgaXMgYQotCXBvaW50ZXIgdG8gYW5vdGhlciBzdHJ1Y3R1cmUgaW4gdGhlIHN5bWJvbCB0YWJsZSBhdCBvbmUgbW9tZW50Ci0JbWF5IGJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc3RydWN0dXJlIGF0IHRoZSBuZXh0LiAgQW5vdGhlcgotCXBhc3MgaXMgbWFkZSBvdmVyIHRoZSB0YWJsZS4gQWxsIHN5bWJvbHMgd2hpY2ggbWFyayBmaWxlIG5hbWVzCi0JKDw8Q19GSUxFPj4gc3ltYm9scykgYXJlIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGludGVybmFsCi0Jc3RyaW5nIHBvaW50cyB0byB0aGUgdmFsdWUgaW4gdGhlIGF1eGVudCAodGhlIHJlYWwgZmlsZW5hbWUpCi0JcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCi0JKEBjb2RleyIuZmlsZSJ9KS4KLQotCUF0IHRoaXMgdGltZSB0aGUgc3ltYm9sIG5hbWVzIGFyZSBtb3ZlZCBhcm91bmQuIENvZmYgc3RvcmVzCi0JYWxsIHN5bWJvbHMgbGVzcyB0aGFuIG5pbmUgY2hhcmFjdGVycyBsb25nIHBoeXNpY2FsbHkKLQl3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZTsgbG9uZ2VyIHN0cmluZ3MgYXJlIGtlcHQgYXQgdGhlIGVuZCBvZgotCXRoZSBmaWxlIGluIHRoZSBzdHJpbmcgCXRhYmxlLiBUaGlzIHBhc3MgbW92ZXMgYWxsIHN0cmluZ3MKLQlpbnRvIG1lbW9yeSBhbmQgcmVwbGFjZXMgdGhlbSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzdHJpbmdzLgotCi0KLQlUaGUgc3ltYm9sIHRhYmxlIGlzIG1hc3NhZ2VkIG9uY2UgYWdhaW4sIHRoaXMgdGltZSB0byBjcmVhdGUKLQl0aGUgY2Fub25pY2FsIHRhYmxlIHVzZWQgYnkgdGhlIEJGRCBhcHBsaWNhdGlvbi4gRWFjaCBzeW1ib2wKLQlpcyBpbnNwZWN0ZWQgaW4gdHVybiwgYW5kIGEgZGVjaXNpb24gbWFkZSAodXNpbmcgdGhlCi0JQGNvZGV7c2NsYXNzfSBmaWVsZCkgYWJvdXQgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gc2V0IGluIHRoZQotCUBjb2Rle2FzeW1ib2x9LiAgQHhyZWZ7U3ltYm9sc30uIFRoZSBnZW5lcmF0ZWQgY2Fub25pY2FsIHRhYmxlCi0Jc2hhcmVzIHN0cmluZ3Mgd2l0aCB0aGUgaGlkZGVuIGludGVybmFsIHN5bWJvbCB0YWJsZS4KLQotCUFueSBsaW5lbnVtYmVycyBhcmUgcmVhZCBmcm9tIHRoZSBjb2ZmIGZpbGUgdG9vLCBhbmQgYXR0YWNoZWQKLQl0byB0aGUgc3ltYm9scyB3aGljaCBvd24gdGhlIGZ1bmN0aW9ucyB0aGUgbGluZW51bWJlcnMgYmVsb25nIHRvLgotCi1TVUJTVUJTRUNUSU9OCi0JU3ltYm9sIHdyaXRpbmcKLQotCVdyaXRpbmcgYSBzeW1ib2wgdG8gYSBjb2ZmIGZpbGUgd2hpY2ggZGlkbid0IGNvbWUgZnJvbSBhIGNvZmYKLQlmaWxlIHdpbGwgbG9zZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGUgQGNvZGV7YXN5bWJvbH0KLQlzdHJ1Y3R1cmUgcmVtZW1iZXJzIHRoZSBCRkQgZnJvbSB3aGljaCB0aGUgc3ltYm9sIHdhcyB0YWtlbiwgYW5kIG9uCi0Jb3V0cHV0IHRoZSBiYWNrIGVuZCBtYWtlcyBzdXJlIHRoYXQgdGhlIHNhbWUgZGVzdGluYXRpb24gdGFyZ2V0IGFzCi0Jc291cmNlIHRhcmdldCBpcyBwcmVzZW50LgotCi0JV2hlbiB0aGUgc3ltYm9scyBoYXZlIGNvbWUgZnJvbSBhIGNvZmYgZmlsZSB0aGVuIGFsbCB0aGUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkLgotCi0JU3ltYm9sIHRhYmxlcyBhcmUgcHJvdmlkZWQgZm9yIHdyaXRpbmcgdG8gdGhlIGJhY2sgZW5kIGluIGEKLQl2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gcG9pbnRlcnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyBsaWtlCi0JdGhlIGxpbmtlciB0byBhY2N1bXVsYXRlIGFuZCBvdXRwdXQgbGFyZ2Ugc3ltYm9sIHRhYmxlcwotCXdpdGhvdXQgaGF2aW5nIHRvIGRvIHRvbyBtdWNoIGJ5dGUgY29weWluZy4KLQotCVRoaXMgZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kCi0JcGF0Y2hlcyBlYWNoIHN5bWJvbCBtYXJrZWQgYXMgYSBmaWxlIHBsYWNlIGhvbGRlcgotCShAY29kZXtDX0ZJTEV9KSB0byBwb2ludCB0byB0aGUgbmV4dCBmaWxlIHBsYWNlIGhvbGRlciBpbiB0aGUKLQlsaXN0LiBJdCBhbHNvIG1hcmtzIGVhY2ggQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgbGlzdCB3aXRoCi0JdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgb2YgdGhlIGN1cnJlbnQgc3ltYm9sLgotCi0JQW5vdGhlciBmdW5jdGlvbiBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byB0dXJuIHRoZSBjYW5vbmljYWwKLQl2YWx1ZSBmb3JtIG9mIEJGRCBpbnRvIHRoZSBmb3JtIHVzZWQgYnkgY29mZi4gSW50ZXJuYWxseSwgQkZECi0JZXhwZWN0cyBzeW1ib2wgdmFsdWVzIHRvIGJlIG9mZnNldHMgZnJvbSBhIHNlY3Rpb24gYmFzZTsgc28gYQotCXN5bWJvbCBwaHlzaWNhbGx5IGF0IDB4MTIwLCBidXQgaW4gYSBzZWN0aW9uIHN0YXJ0aW5nIGF0Ci0JMHgxMDAsIHdvdWxkIGhhdmUgdGhlIHZhbHVlIDB4MjAuIENvZmYgZXhwZWN0cyBzeW1ib2xzIHRvCi0JY29udGFpbiB0aGVpciBmaW5hbCB2YWx1ZSwgc28gc3ltYm9scyBoYXZlIHRoZWlyIHZhbHVlcwotCWNoYW5nZWQgYXQgdGhpcyBwb2ludCB0byByZWZsZWN0IHRoZWlyIHN1bSB3aXRoIHRoZWlyIG93bmluZwotCXNlY3Rpb24uICBUaGlzIHRyYW5zZm9ybWF0aW9uIHVzZXMgdGhlCi0JPDxvdXRwdXRfc2VjdGlvbj4+IGZpZWxkIG9mIHRoZSBAY29kZXthc3ltYm9sfSdzCi0JQGNvZGV7YXNlY3Rpb259IEB4cmVme1NlY3Rpb25zfS4KLQotCW8gPDxjb2ZmX21hbmdsZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRob3VnaCB0aGUgcHJvdmlkZWQgc3ltYm9sIHRhYmxlIGFuZCB1c2VzCi0JdGhlIG9mZnNldHMgZ2VuZXJhdGVkIGJ5IHRoZSBwcmV2aW91cyBwYXNzIGFuZCB0aGUgcG9pbnRlcnMKLQlnZW5lcmF0ZWQgd2hlbiB0aGUgc3ltYm9sIHRhYmxlIHdhcyByZWFkIGluIHRvIGNyZWF0ZSB0aGUKLQlzdHJ1Y3R1cmVkIGhpZXJhY2h5IHJlcXVpcmVkIGJ5IGNvZmYuIEl0IGNoYW5nZXMgZWFjaCBwb2ludGVyCi0JdG8gYSBzeW1ib2wgaW50byB0aGUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBhc3ltYm9sLgotCi0JbyA8PGNvZmZfd3JpdGVfc3ltYm9scz4+Ci0KLQlUaGlzIHJvdXRpbmUgcnVucyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYW5kIHBhdGNoZXMgdXAgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZWlyIGludGVybmFsIGZvcm0gaW50byB0aGUgY29mZiB3YXksIGNhbGxzIHRoZQotCWJpdCB0d2lkZGxlcnMsIGFuZCB3cml0ZXMgb3V0IHRoZSB0YWJsZSB0byB0aGUgZmlsZS4KLQotKi8KLQotLyoKLUlOVEVSTkFMX0RFRklOSVRJT04KLQljb2ZmX3N5bWJvbF90eXBlCi0KLURFU0NSSVBUSU9OCi0JVGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgYW4gPDxhc3ltYm9sPj4gaXMgZGVzY3JpYmVkIGluIGEKLQk8PGNvbWJpbmVkX2VudHJ5X3R5cGU+PjoKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfcHRyX3N0cnVjdAotLnsKLS4KLS4gICAgICAgeyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotLiAgICAgICAgICB0aGlzIHN5bWJvbC4gR2VuZXJhdGVkIGJ5IGNvZmZfcmVudW1iZXJfc3ltYm9scy4gKn0KLS51bnNpZ25lZCBpbnQgb2Zmc2V0OwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotLiAgICAgICAgICBYQ09GRiBDX0JTVEFUIHN5bWJvbHMuICBTZXQgYnkgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfdmFsdWUgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF90YWcgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9lbmQgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLS4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQotLnVuc2lnbmVkIGludCBmaXhfc2NubGVuIDogMTsKLS4KLS4gICAgICAgeyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0uICAgICAgICAgIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBTZXQgYnkKLS4gICAgICAgICAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0uCi0uICAgICAgIHsqIFRoZSBjb250YWluZXIgZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlIGFzIHJlYWQgYW5kIHRyYW5zbGF0ZWQKLS4gICAgICAgICAgIGZyb20gdGhlIGZpbGUuICp9Ci0uCi0udW5pb24gewotLiAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0uICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0uIH0gdTsKLS59IGNvbWJpbmVkX2VudHJ5X3R5cGU7Ci0uCi0uCi0ueyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzOiAqfQotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotLnsKLS4gICB7KiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqfQotLmFzeW1ib2wgc3ltYm9sOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqfQotLmNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLS4KLS4gICB7KiBBIHBvaW50ZXIgdG8gdGhlIGxpbmVudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotLgotLiAgIHsqIEhhdmUgdGhlIGxpbmUgbnVtYmVycyBiZWVuIHJlbG9jYXRlZCB5ZXQgPyAqfQotLmJvb2xlYW4gZG9uZV9saW5lbm87Ci0ufSBjb2ZmX3N5bWJvbF90eXBlOwotCi0KLSovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJwZWljb2RlLmgiCi0jZWxzZQotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0jZW5kaWYKLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi1zdGF0aWMgbG9uZyBzZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgZmxhZ3dvcmQgc3R5cF90b19zZWNfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIFBUUiwgY29uc3QgY2hhciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGNvbnN0IHN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5ICosCi0JICAgY29uc3QgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgc2hvcnQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIFBUUiBidXlfYW5kX3JlYWQgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBpbnQsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9saW5lX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gY29mZl9jbGFzc2lmeV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLSNpZm5kZWYgY29mZl9ta29iamVjdF9ob29rCi1zdGF0aWMgUFRSIGNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCAgUFRSKSk7Ci0jZW5kaWYKLQwKLS8qIHZvaWQgd2FybmluZygpOyAqLwotCi0vKiBSZXR1cm4gYSB3b3JkIHdpdGggU1RZUF8qIChzY25oZHIuc19mbGFncykgZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudAotICAgdGhlIGluY29taW5nIFNFQ18qIGZsYWdzLiAgVGhlIGludmVyc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcwotICAgc3R5cF90b19zZWNfZmxhZ3MoKS4gIE5PVEU6IElmIHlvdSBhZGQgdG8vY2hhbmdlIHRoaXMgcm91dGluZSwgeW91Ci0gICBzaG91bGQgcHJvYmFibHkgbWlycm9yIHRoZSBjaGFuZ2VzIGluIHN0eXBfdG9fc2VjX2ZsYWdzKCkuICAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotCi1zdGF0aWMgbG9uZwotc2VjX3RvX3N0eXBfZmxhZ3MgKHNlY19uYW1lLCBzZWNfZmxhZ3MpCi0gICAgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotICAgICBmbGFnd29yZCBzZWNfZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cF9mbGFncyA9IDA7Ci0KLSAgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfVEVYVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfREFUQSkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREFUQTsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQlNTKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9CU1M7Ci0jaWZkZWYgX0NPTU1FTlQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQ09NTUVOVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZiAvKiBfQ09NTUVOVCAqLwotI2lmZGVmIF9MSUIKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElCKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSUI7Ci0jZW5kaWYgLyogX0xJQiAqLwotI2lmZGVmIF9MSVQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSVQ7Ci0jZW5kaWYgLyogX0xJVCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsICIuZGVidWciKSkKLSAgICB7Ci0jaWZkZWYgU1RZUF9ERUJVRwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREVCVUc7Ci0jZWxzZQotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHNlY19uYW1lLCAiLnN0YWIiLCA1KSkKLSAgICB7Ci0jaWZkZWYgQ09GRl9BTElHTl9JTl9TX0ZMQUdTCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EU0VDVDsKLSNlbHNlCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1BBRCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfUEFEOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MT0FERVIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xPQURFUjsKLSAgICB9Ci0jZW5kaWYKLSAgLyogVHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQgc2hvdWxkIGJlICovCi0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfREFUQSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHsKLSNpZmRlZiBTVFlQX0xJVAkJCS8qIDI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiAqLwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotICAgIH0KLQotI2lmZGVmIFNUWVBfQ0xJTksKLSAgaWYgKHNlY19mbGFncyAmIFNFQ19DTElOSykKLSAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfQ0xJTks7Ci0jZW5kaWYKLQotI2lmZGVmIFNUWVBfQkxPQ0sKLSAgaWYgKHNlY19mbGFncyAmIFNFQ19CTE9DSykKLSAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfQkxPQ0s7Ci0jZW5kaWYKLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc3R5cF9mbGFnczsKLX0KLQotI2Vsc2UgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFRoZSBQRSB2ZXJzaW9uOyBzZWUgYWJvdmUgZm9yIHRoZSBnZW5lcmFsIGNvbW1lbnRzLiAgVGhlIG5vbi1QRQotICAgY2FzZSBzZWVtcyB0byBiZSBtb3JlIGd1ZXNzaW5nLCBhbmQgYnJlYWtzIFBFIGZvcm1hdDsgc3BlY2lmaWNhbGx5LAotICAgLnJkYXRhIGlzIHJlYWRvbmx5LCBidXQgaXQgc3VyZSBhaW4ndCB0ZXh0LiAgUmVhbGx5LCBhbGwgdGhpcwotICAgc2hvdWxkIGJlIHNldCB1cCBwcm9wZXJseSBpbiBnYXMgKG9yIHdoYXRldmVyIGFzc2VtYmxlciBpcyBpbiB1c2UpLAotICAgYW5kIGhvbm9yIHdoYXRldmVyIG9iamNvcHkvc3RyaXAsIGV0Yy4gc2VudCB1cyBhcyBpbnB1dC4gICovCi0KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgY29uc3QgY2hhciAqc2VjX25hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgc2VjX2ZsYWdzOwotewotICBsb25nIHN0eXBfZmxhZ3MgPSAwOwotCi0gIC8qIGNhdXRpb246IHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZSBncm91cHMgb2Ygc3ltYm9scyB0aGF0IGhhdmUKLSAgICAgdmVyeSBzaW1pbGFyIGJpdHMgYW5kIG1lYW5pbmdzOiBJTUFHRV9TQ04qLCBTRUNfKiwgYW5kIFNUWVBfKi4KLSAgICAgU0VDXyogYXJlIHRoZSBCRkQgaW50ZXJuYWwgZmxhZ3MsIHVzZWQgZm9yIGdlbmVyaWMgQkZECi0gICAgIGluZm9ybWF0aW9uLiAgU1RZUF8qIGFyZSB0aGUgQ09GRiBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBDT0ZGIGZpbGVzLiAgSU1BR0VfU0NOXyogYXJlIHRoZSBQRSBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBQRSBmaWxlcy4gIFRoZSBTVFlQXyogZmxhZ3MgYW5kIHRoZSBJTUFHRV9TQ05fKiBmbGFncyBvdmVybGFwLAotICAgICBidXQgdGhlcmUgYXJlIG1vcmUgSU1BR0VfU0NOXyogZmxhZ3MuICAqLwotCi0gIC8qIHNraXAgTE9BRCAqLwotICAvKiBSRUFET05MWSBsYXRlciAqLwotICAvKiBza2lwIFJFTE9DICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0NPREU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0RBVEEpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEE7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0FMTE9DKSAhPSAwICYmIChzZWNfZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBOyAgLyogPT1TVFlQX0JTUyAqLwotICAvKiBza2lwIFJPTSAqLwotICAvKiBza2lwIENPTlNUUlVDVE9SICovCi0gIC8qIHNraXAgQ09OVEVOVFMgKi8KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoKHNlY19mbGFncyAmIChTRUNfTkVWRVJfTE9BRCB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOwotI2VuZGlmCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19SRU1PVkU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTE5LX1JFTU9WRTsKLSAgLyogc2tpcCBJTl9NRU1PUlkgKi8KLSAgLyogc2tpcCBTT1JUICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOyAKLSAgLyogc2tpcCBMSU5LX0RVUExJQ0FURVMgKi8KLSAgLyogc2tpcCBMSU5LRVJfQ1JFQVRFRCAqLwotCi0gIC8qIEZvciBub3csIHRoZSByZWFkL3dyaXRlIGJpdHMgYXJlIG1hcHBlZCBvbnRvIFNFQ19SRUFET05MWSwgZXZlbgotICAgICB0aG91Z2ggdGhlIHNlbWFudGljcyBkb24ndCBxdWl0ZSBtYXRjaC4gIFRoZSBiaXRzIGZyb20gdGhlIGlucHV0Ci0gICAgIGFyZSByZXRhaW5lZCBpbiBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyAqLwotCi0gIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEOyAgICAgICAvKiBhbHdheXMgcmVhZGFibGUuICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsgICAgLyogSW52ZXJ0IFJFQURPTkxZIGZvciB3cml0ZSAqLwotICBpZiAoc2VjX2ZsYWdzICYgU0VDX0NPREUpCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0VYRUNVVEU7ICAvKiBDT0RFLT5FWEVDVVRFICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfU0hBUkVEKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9TSEFSRUQ7ICAgLyogU2hhcmVkIHJlbWFpbnMgbWVhbmluZ2Z1bCAqLwotCi0gIHJldHVybiBzdHlwX2ZsYWdzOyAKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBSZXR1cm4gYSB3b3JkIHdpdGggU0VDXyogZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgU1RZUF8qCi0gICBmbGFncyAoZnJvbSBzY25oZHIuc19mbGFncykuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICBzZWNfdG9fc3R5cF9mbGFncygpLiAgTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UKLSAgIHNob3VsZCBwcm9iYWJseSBtaXJyb3IgdGhlIGNoYW5nZXMgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLXN0YXRpYyBmbGFnd29yZAotc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSNpZmRlZiBTVFlQX0JMT0NLCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9CTE9DSykKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQkxPQ0s7Ci0jZW5kaWYgIAotCi0jaWZkZWYgU1RZUF9DTElOSwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQ0xJTkspCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NMSU5LOwotI2VuZGlmICAKLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX05PTE9BRCAqLwotCi0gIC8qIEZvciAzODYgQ09GRiwgYXQgbGVhc3QsIGFuIHVubG9hZGFibGUgdGV4dCBvciBkYXRhIHNlY3Rpb24gaXMKLSAgICAgYWN0dWFsbHkgYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX1RFWFQpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9CU1MpCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfSU5GTykKLSAgICB7Ci0gICAgICAvKiBXZSBtYXJrIHRoZXNlIGFzIFNFQ19ERUJVR0dJTkcsIGJ1dCBvbmx5IGlmIENPRkZfUEFHRV9TSVpFIGlzCi0JIGRlZmluZWQuICBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB1c2VzCi0JIENPRkZfUEFHRV9TSVpFIHRvIGVuc3VyZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUKLQkgc2VjdGlvbiBWTUEgYW5kIHRoZSBmaWxlIG9mZnNldCBtYXRjaC4gIElmIHdlIGRvbid0IGtub3cKLQkgQ09GRl9QQUdFX1NJWkUsIHdlIGNhbid0IGVuc3VyZSB0aGUgY29ycmVjdCBjb3JyZXNwb25kZW5jZSwKLQkgYW5kIGRlbWFuZCBwYWdlIGxvYWRpbmcgb2YgdGhlIGZpbGUgd2lsbCBmYWlsLiAgKi8KLSNpZiBkZWZpbmVkIChDT0ZGX1BBR0VfU0laRSkgJiYgIWRlZmluZWQgKENPRkZfQUxJR05fSU5fU19GTEFHUykKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9QQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRlYnVnIikgPT0gMAotI2lmZGVmIF9DT01NRU5UCi0JICAgfHwgc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMAotI2VuZGlmCi0JICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIF9MSUIKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCKSA9PSAwKQotICAgIDsKLSNlbmRpZgotI2lmZGVmIF9MSVQKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTElUCQkJLyogQTI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiB0eXBlICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfTElUKSA9PSBTVFlQX0xJVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFkpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX0xJVCAqLwotI2lmZGVmIFNUWVBfT1RIRVJfTE9BRAkJLyogT3RoZXIgbG9hZGVkIHNlY3Rpb25zICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9PVEhFUl9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IChTRUNfTE9BRCB8IFNFQ19BTExPQyk7Ci0gICAgfQotI2VuZGlmIC8qIFNUWVBfU0RBVEEgKi8KLQotI2lmIGRlZmluZWQgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKSAmJiBkZWZpbmVkIChDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKQotICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGlmIHRoZSBuYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UsIHdlCi0gICAgIG9ubHkgbGluayBhIHNpbmdsZSBjb3B5IG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKLSAgICAgZysrLiAgZysrIHdpbGwgZW1pdCBlYWNoIHRlbXBsYXRlIGV4cGFuc2lvbiBpbiBpdHMgb3duIHNlY3Rpb24uCi0gICAgIFRoZSBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBhcyB3ZWFrLCBzbyB0aGF0IG11bHRpcGxlIGRlZmluaXRpb25zCi0gICAgIGFyZSBwZXJtaXR0ZWQuICBUaGUgR05VIGxpbmtlciBleHRlbnNpb24gaXMgdG8gYWN0dWFsbHkgZGlzY2FyZAotICAgICBhbGwgYnV0IG9uZSBvZiB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUubGlua29uY2UiLCBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLSNlbmRpZgotCi0gIHJldHVybiBzZWNfZmxhZ3M7Ci19Ci0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgdmVyc2lvbjsgc2VlIGFib3ZlIGZvciB0aGUgZ2VuZXJhbCBjb21tZW50cy4KLQotICAgU2luY2UgdG8gc2V0IHRoZSBTRUNfTElOS19PTkNFIGFuZCBhc3NvY2lhdGVkIGZsYWdzLCB3ZSBoYXZlIHRvCi0gICBsb29rIGF0IHRoZSBzeW1ib2wgdGFibGUgYW55d2F5LCB3ZSByZXR1cm4gdGhlIHN5bWJvbCB0YWJsZSBpbmRleAotICAgb2YgdGhlIHN5bWJvbCBiZWluZyB1c2VkIGFzIHRoZSBDT01EQVQgc3ltYm9sLiAgVGhpcyBpcyBhZG1pdHRlZGx5Ci0gICB1Z2x5LCBidXQgdGhlcmUncyByZWFsbHkgbm93aGVyZSBlbHNlIHRoYXQgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlCi0gICByZXF1aXJlZCBpbmZvcm1hdGlvbi4gIEZJWE1FOiBJcyB0aGUgQ09NREFUIHN5bWJvbCBpbmRleCB1c2VkIGZvcgotICAgYW55IHB1cnBvc2Ugb3RoZXIgdGhhbiBvYmpkdW1wPyAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi1zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RTRUNUKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0jaWZkZWYgU0VDX05FVkVSX0xPQUQKLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX05PTE9BRCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0jZW5kaWYKLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0dST1VQKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIC8qIHNraXAgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9DT1BZKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0NOVF9DT0RFKQotICAgIHNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfT1RIRVIpCi0gICAgYWJvcnQgKCk7ICAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1ZFUikKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfUkVNT1ZFKQotICAgIHNlY19mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fU0hBUkVEKQotICAgIHNlY19mbGFncyB8PSBTRUNfU0hBUkVEOwotICAvKiBDT01EQVQ6IHNlZSBiZWxvdyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEKQotICAgIGFib3J0ICgpOy8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fTk9UX1BBR0VEKQotICAgIGFib3J0ICgpOyAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLQotICAvKiBXZSBpbmZlciBmcm9tIHRoZSBkaXN0aW5jdCByZWFkL3dyaXRlL2V4ZWN1dGUgYml0cyB0aGUgc2V0dGluZ3MKLSAgICAgb2Ygc29tZSBvZiB0aGUgYmZkIGZsYWdzOyB0aGUgYWN0dWFsIHZhbHVlcywgc2hvdWxkIHdlIG5lZWQgdGhlbSwKLSAgICAgYXJlIGFsc28gaW4gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnBlX2ZsYWdzLiAgKi8KLQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fRVhFQ1VURSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPREU7ICAgLyogUHJvYmFibHkgcmVkdW5kYW50ICovCi0gIC8qIElNQUdFX1NDTl9NRU1fUkVBRCBpcyBzaW1wbHkgaWdub3JlZCwgYXNzdW1pbmcgaXQgYWx3YXlzIHRvIGJlIHRydWUuICovCi0gIGlmICgoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fV1JJVEUpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQotICAvKiBDT01EQVQgZ2V0cyB2ZXJ5IHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0NPTURBVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRTsKLQotICAgICAgLyogVW5mb3J0dW5hdGVseSwgdGhlIFBFIGZvcm1hdCBzdG9yZXMgZXNzZW50aWFsIGluZm9ybWF0aW9uIGluCi0gICAgICAgICB0aGUgc3ltYm9sIHRhYmxlLCBvZiBhbGwgcGxhY2VzLiAgV2UgbmVlZCB0byBleHRyYWN0IHRoYXQKLSAgICAgICAgIGluZm9ybWF0aW9uIG5vdywgc28gdGhhdCBvYmpkdW1wIGFuZCB0aGUgbGlua2VyIHdpbGwga25vdyBob3cKLSAgICAgICAgIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBzeW1ib2xzLiAgV2UKLSAgICAgICAgIGNhbid0IGNhbGwgc2x1cnBfc3ltdGFiLCBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lc24ndCB3YW50IHRoZQotICAgICAgICAgc3dhcHBlZCBzeW1ib2xzLiAgKi8KLQotICAgICAgLyogQ09NREFUIHNlY3Rpb25zIGFyZSBzcGVjaWFsLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgc2VjdGlvbgotCSBzeW1ib2wsIHdoaWNoIHRlbGxzIHdoYXQga2luZCBvZiBDT01EQVQgc2VjdGlvbiBpdCBpcy4gIFRoZQotCSBzZWNvbmQgc3ltYm9sIGlzIHRoZSAiY29tZGF0IHN5bWJvbCIgLSB0aGUgb25lIHdpdGggdGhlCi0JIHVuaXF1ZSBuYW1lLiAgR05VIHVzZXMgdGhlIHNlY3Rpb24gc3ltYm9sIGZvciB0aGUgdW5pcXVlCi0JIG5hbWU7IE1TIHVzZXMgIi50ZXh0IiBmb3IgZXZlcnkgY29tZGF0IHNlY3Rpb24uICBTaWdoLiAgLSBESiAqLwotCi0gICAgICAvKiBUaGlzIGlzIG5vdCBtaXJyb3JlZCBpbiBzZWNfdG9fc3R5cF9mbGFncygpLCBidXQgdGhlcmUKLQkgZG9lc24ndCBzZWVtIHRvIGJlIGEgbmVlZCB0bywgZWl0aGVyLCBhbmQgaXQgd291bGQgYXQgYmVzdCBiZQotCSByYXRoZXIgbWVzc3kuICAqLwotCi0gICAgICBpZiAoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQl7Ci0JICBiZmRfYnl0ZSAqZXN5bXN0YXJ0LCAqZXN5bSwgKmVzeW1lbmQ7Ci0JICBpbnQgc2Vlbl9zdGF0ZSA9IDA7Ci0JICBjaGFyICp0YXJnZXRfbmFtZSA9IE5VTEw7Ci0KLQkgIGVzeW1zdGFydCA9IGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0JICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLQkgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQkgICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0JICAgICAgaWYgKHNpemVvZiAoaW50ZXJuYWxfcy0+c19uYW1lKSA+IFNZTU5NTEVOKQotCQl7Ci0JCSAgLyogVGhpcyBjYXNlIGltcGxpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgc3ltYm9sIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltLm5fc2NudW0gPT0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4KQotCQl7Ci0JCSAgLyogQWNjb3JkaW5nIHRvIHRoZSBNU1ZDIGRvY3VtZW50YXRpb24sIHRoZSBmaXJzdAotCQkgICAgIFRXTyBlbnRyaWVzIHdpdGggdGhlIHNlY3Rpb24gIyBhcmUgYm90aCBvZgotCQkgICAgIGludGVyZXN0IHRvIHVzLiAgVGhlIGZpcnN0IG9uZSBpcyB0aGUgInNlY3Rpb24KLQkJICAgICBzeW1ib2wiIChzZWN0aW9uIG5hbWUpLiAgVGhlIHNlY29uZCBpcyB0aGUgY29tZGF0Ci0JCSAgICAgc3ltYm9sIG5hbWUuICBIZXJlLCB3ZSd2ZSBmb3VuZCB0aGUgZmlyc3QKLQkJICAgICBxdWFsaWZ5aW5nIGVudHJ5OyB3ZSBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZQotCQkgICAgIHNlY29uZCB3aXRoIGEgc3RhdGUgZmxhZy4KLQotCQkgICAgIEluIHRoZSBjYXNlIG9mIGdhcy1nZW5lcmF0ZWQgKGF0IGxlYXN0IHVudGlsIHRoYXQKLQkJICAgICBpcyBmaXhlZCkgLm8gZmlsZXMsIGl0IGlzbid0IG5lY2Vzc2FyaWx5IHRoZQotCQkgICAgIHNlY29uZCBvbmUuICBJdCBtYXkgYmUgc29tZSBvdGhlciBsYXRlciBzeW1ib2wuCi0KLQkJICAgICBTaW5jZSBnYXMgYWxzbyBkb2Vzbid0IGZvbGxvdyBNUyBjb252ZW50aW9ucyBhbmQKLQkJICAgICBlbWl0cyB0aGUgc2VjdGlvbiBzaW1pbGFyIHRvIC50ZXh0JDxuYW1lPiwgd2hlcmUKLQkJICAgICA8c29tZXRoaW5nPiBpcyB0aGUgbmFtZSB3ZSdyZSBsb29raW5nIGZvciwgd2UKLQkJICAgICBkaXN0aW5ndWlzaCB0aGUgdHdvIGFzIGZvbGxvd3M6Ci0KLQkJICAgICBJZiB0aGUgc2VjdGlvbiBuYW1lIGlzIHNpbXBseSBhIHNlY3Rpb24gbmFtZSAobm8KLQkJICAgICAkKSB3ZSBwcmVzdW1lIGl0J3MgTVMtZ2VuZXJhdGVkLCBhbmQgbG9vayBhdAotCQkgICAgIHByZWNpc2VseSB0aGUgc2Vjb25kIHN5bWJvbCBmb3IgdGhlIGNvbWRhdCBuYW1lLgotCQkgICAgIElmIHRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJCwgd2UgYXNzdW1lIGl0J3MKLQkJICAgICBnYXMtZ2VuZXJhdGVkLCBhbmQgbG9vayBmb3IgPHNvbWV0aGluZz4gKHdoYXRldmVyCi0JCSAgICAgZm9sbG93cyB0aGUgJCkgYXMgdGhlIGNvbWRhdCBzeW1ib2wuICAqLwotCi0JCSAgLyogQWxsIDMgYnJhbmNoZXMgdXNlIHRoaXMgKi8KLQkJICBzeW1uYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmaXN5bSwgYnVmKTsKLQotCQkgIGlmIChzeW1uYW1lID09IE5VTEwpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIHN3aXRjaCAoc2Vlbl9zdGF0ZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgewotCQkJLyogVGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUgc3ltYm9sLiAgKi8KLQkJCXVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJCXNlZW5fc3RhdGUgPSAxOwotCi0JCQkvKiBJZiBpdCBpc24ndCB0aGUgc3R1ZmYgd2UncmUgZXhwZWN0aW5nLCBkaWU7Ci0JCQkgICBUaGUgTVMgZG9jdW1lbnRhdGlvbiBpcyB2YWd1ZSwgYnV0IGl0Ci0JCQkgICBhcHBlYXJzIHRoYXQgdGhlIHNlY29uZCBlbnRyeSBzZXJ2ZXMgQk9USAotCQkJICAgYXMgdGhlIGNvbWRhdCBzeW1ib2wgYW5kIHRoZSBkZWZpbmluZwotCQkJICAgc3ltYm9sIHJlY29yZCAoZWl0aGVyIENfU1RBVCBvciBDX0VYVCwKLQkJCSAgIHBvc3NpYmx5IHdpdGggYW4gYXV4IGVudHJ5IHdpdGggZGVidWcKLQkJCSAgIGluZm9ybWF0aW9uIGlmIGl0J3MgYSBmdW5jdGlvbi4pICBJdAotCQkJICAgYXBwZWFycyB0aGUgb25seSB3YXkgdG8gZmluZCB0aGUgc2Vjb25kIG9uZQotCQkJICAgaXMgdG8gY291bnQuICAoT24gSW50ZWwsIHRoZXkgYXBwZWFyIHRvIGJlCi0JCQkgICBhZGphY2VudCwgYnV0IG9uIEFscGhhLCB0aGV5IGhhdmUgYmVlbgotCQkJICAgZm91bmQgc2VwYXJhdGVkLikKLQotCQkJICAgSGVyZSwgd2UgdGhpbmsgd2UndmUgZm91bmQgdGhlIGZpcnN0IG9uZSwKLQkJCSAgIGJ1dCB0aGVyZSdzIHNvbWUgY2hlY2tpbmcgd2UgY2FuIGRvIHRvIGJlCi0JCQkgICBzdXJlLiAgKi8KLQotCQkJaWYgKCEgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JCQkgICAgICAgJiYgaXN5bS5uX3R5cGUgPT0gVF9OVUxMCi0JCQkgICAgICAgJiYgaXN5bS5uX3ZhbHVlID09IDApKQotCQkJICBhYm9ydCAoKTsKLQotCQkJLyogRklYTUUgTEFURVI6IE1TVkMgZ2VuZXJhdGVzIHNlY3Rpb24gbmFtZXMKLQkJCSAgIGxpa2UgLnRleHQgZm9yIGNvbWRhdHMuICBHYXMgZ2VuZXJhdGVzCi0JCQkgICBuYW1lcyBsaWtlIC50ZXh0JGZvb19fRnYgKGluIHRoZSBjYXNlIG9mIGEKLQkJCSAgIGZ1bmN0aW9uKS4gIFNlZSBjb21tZW50IGFib3ZlIGZvciBtb3JlLiAgKi8KLQotCQkJaWYgKHN0cmNtcCAobmFtZSwgc3ltbmFtZSkgIT0gMCkKLQkJCSAgYWJvcnQgKCk7Ci0gIAotCQkJLyogVGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgKGVzeW0gKyBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJCQkJICAgICAgaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsCi0JCQkJCSAgICAgIDAsIGlzeW0ubl9udW1hdXgsIChQVFIpICZhdXgpOwotCi0JCQl0YXJnZXRfbmFtZSA9IHN0cmNociAobmFtZSwgJyQnKTsKLQkJCWlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQotCQkJICB7Ci0JCQkgICAgLyogR2FzIG1vZGUuICAqLwotCQkJICAgIHNlZW5fc3RhdGUgPSAyOwotCQkJICAgIC8qIFNraXAgdGhlIGAkJy4gICovCi0JCQkgICAgdGFyZ2V0X25hbWUgKz0gMTsKLQkJCSAgfQotCi0JCQkvKiBGSVhNRTogTWljcm9zb2Z0IHVzZXMgTk9EVVBMSUNBVEVTIGFuZAotCQkJICAgQVNTT0NJQVRJVkUsIGJ1dCBnbnUgdXNlcyBBTlkgYW5kCi0JCQkgICBTQU1FX1NJWkUuICBVbmZvcnR1bmF0ZWx5LCBnbnUgZG9lc24ndCBkbwotCQkJICAgdGhlIGNvbWRhdCBzeW1ib2xzIHJpZ2h0LiAgU28sIHVudGlsIHdlIGNhbgotCQkJICAgZml4IGl0IHRvIGRvIHRoZSByaWdodCB0aGluZywgd2UgYXJlCi0JCQkgICB0ZW1wb3JhcmlseSBkaXNhYmxpbmcgY29tZGF0cyBmb3IgdGhlIE1TCi0JCQkgICB0eXBlcyAodGhleSdyZSB1c2VkIGluIERMTHMgYW5kIEMrKywgYnV0IHdlCi0JCQkgICBkb24ndCBzdXBwb3J0ICp0aGVpciogQysrIGxpYnJhcmllcyBhbnl3YXkKLQkJCSAgIC0gREouICAqLwotCi0JCQkvKiBDeWd3aW4gZG9lcyBub3QgZm9sbG93IHRoZSBNUyBzdHlsZSwgYW5kCi0JCQkgICB1c2VzIEFOWSBhbmQgU0FNRV9TSVpFIHdoZXJlIE5PRFVQTElDQVRFUwotCQkJICAgYW5kIEFTU09DSUFUSVZFIHNob3VsZCBiZSB1c2VkLiAgRm9yCi0JCQkgICBJbnRlcml4LCB3ZSBqdXN0IGRvIHRoZSByaWdodCB0aGluZyB1cAotCQkJICAgZnJvbnQuICAqLwotCi0JCQlzd2l0Y2ggKGF1eC54X3Njbi54X2NvbWRhdCkKLQkJCSAgewotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOgotI2lmZGVmIFNUUklDVF9QRV9GT1JNQVQgCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7Ci0jZWxzZQotCQkJICAgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlk6Ci0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOgotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRTsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g6Ci0JCQkgICAgLyogTm90IHlldCBmdWxseSBpbXBsZW1lbnRlZCA/Pz8gKi8KLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIC8qIGRlYnVnJFMgZ2V0cyB0aGlzIGNhc2U7IG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2F0aW9ucyA/Pz8gKi8KLQotCQkJICAvKiBUaGVyZSBtYXkgYmUgbm8gc3ltYm9sLi4uIHdlJ2xsIHNlYXJjaAotCQkJICAgICB0aGUgd2hvbGUgdGFibGUuLi4gSXMgdGhpcyB0aGUgcmlnaHQKLQkJCSAgICAgcGxhY2UgdG8gcGxheSB0aGlzIGdhbWU/IE9yIHNob3VsZCB3ZSBkbwotCQkJICAgICBpdCB3aGVuIHJlYWRpbmcgaXQgaW4uICAqLwotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkU6Ci0jaWZkZWYgU1RSSUNUX1BFX0ZPUk1BVAotCQkJICAgIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZWxzZQotCQkJICAgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICAgIGJyZWFrOwotCi0JCQkgIGRlZmF1bHQ6ICAvKiAwIG1lYW5zICJubyBzeW1ib2wiICovCi0JCQkgICAgLyogZGVidWckRiBnZXRzIHRoaXMgY2FzZTsgb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNhdGlvbnMgPz8/ICovCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCSAJICAgICAgfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAyOgotCQkgICAgICAvKiBHYXMgbW9kZTogdGhlIGZpcnN0IG1hdGNoaW5nIG9uIHBhcnRpYWwgbmFtZS4gICovCi0KLSNpZm5kZWYgVEFSR0VUX1VOREVSU0NPUkUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgMAotI2VuZGlmCi0JCSAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgd2UncmUgbG9va2luZyBmb3I/ICovCi0JCSAgICAgIGlmIChzdHJjbXAgKHRhcmdldF9uYW1lLCAKLQkJCQkgIHN5bW5hbWUgKyAoVEFSR0VUX1VOREVSU0NPUkUgPyAxIDogMCkpICE9IDApCi0JCQl7Ci0JCQkgICAgLyogTm90IHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0JICAgICAgICAgICAgICAgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCQkJICAgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgY2FzZSAxOiAKLQkJICAgICAgLyogTVNWQyBtb2RlOiB0aGUgbGV4aWNhbGx5IHNlY29uZCBzeW1ib2wgKG9yCi0JCQkgZHJvcCB0aHJvdWdoIGZyb20gdGhlIGFib3ZlKS4gICovCi0JCSAgICAgIHsKLQkJICAgICAgICBjaGFyICpuZXduYW1lOwotCi0JCQkvKiBUaGlzIG11c3QgdGhlIHRoZSBzZWNvbmQgc3ltYm9sIHdpdGggdGhlCi0JCQkgICBzZWN0aW9uICMuICBJdCBpcyB0aGUgYWN0dWFsIHN5bWJvbCBuYW1lLgotCQkJICAgSW50ZWwgcHV0cyB0aGUgdHdvIGFkamFjZW50LCBidXQgQWxwaGEgKGF0Ci0JCQkgICBsZWFzdCkgc3ByZWFkcyB0aGVtIG91dC4gICovCi0KLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQgPSAKLQkJCSAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfY29tZGF0X2luZm8pKTsKLQkJICAgICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ID09IE5VTEwpCi0JCSAgICAgICAgICBhYm9ydCAoKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPnN5bWJvbCA9Ci0JCQkgIChlc3ltIC0gZXN5bXN0YXJ0KSAvIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLQkJICAgICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN5bW5hbWUpICsgMSk7Ci0JCSAgICAgICAgaWYgKG5ld25hbWUgPT0gTlVMTCkKLQkJICAgICAgICAgIGFib3J0ICgpOwotCi0JCSAgICAgICAgc3RyY3B5IChuZXduYW1lLCBzeW1uYW1lKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPm5hbWUgPSBuZXduYW1lOwotCi0JCSAgICAgIH0KLQotCQkgICAgICBnb3RvIGJyZWFrbG9vcDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQkgICAgfQotCSAgYnJlYWtsb29wOgotCX0KLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUykgJiYgZGVmaW5lZCAoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSkKLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotCi0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0KLSNkZWZpbmUJZ2V0X2luZGV4KHN5bWJvbCkJKChzeW1ib2wpLT51ZGF0YS5pKQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCi1DT0RFX0ZSQUdNRU5UCi0KLS57KiBDT0ZGIHN5bWJvbCBjbGFzc2lmaWNhdGlvbnMuICAqfQotLgotLmVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24KLS57Ci0uICB7KiBHbG9iYWwgc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0dMT0JBTCwKLS4gIHsqIENvbW1vbiBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfQ09NTU9OLAotLiAgeyogVW5kZWZpbmVkIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9VTkRFRklORUQsCi0uICB7KiBMb2NhbCBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfTE9DQUwsCi0uICB7KiBQRSBzZWN0aW9uIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OCi0ufTsKLS4KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZGIgdG8gc3dhcCBpbiBjb2ZmIHN5bWJvbCB0YWJsZSBwYXJ0czoKLS50eXBlZGVmIHN0cnVjdAotLnsKLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0uICAgICAgIGludCAgICAgICAgICAgICBjbGFzcywKLS4gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAotLiAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdhcyB0byBzd2FwIG91dCBjb2ZmIHBhcnRzOgotCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAJKmFiZmQsCi0uICAgICAgIFBUUglpbiwKLS4gICAgICAgaW50ICAgIAl0eXBlLAotLiAgICAgICBpbnQgICAgCWNsYXNzLAotLiAgICAgICBpbnQgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotLiAgICAgIGJmZCAgICAgICphYmZkLAotLiAgICAgIFBUUglpbiwKLS4gICAgICBQVFIJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAgICphYmZkLAotLiAgICAgCVBUUglzcmMsCi0uCVBUUglkc3QpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSIAlvdXQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgCSphYmZkLAotLglQVFIgCWluLAotLglQVFIJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4gICAgICAJUFRSCWluLAotLglQVFIJb3V0KSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZW5lcmljIENPRkYgcm91dGluZXMgdG8gY2FsbCB0YXJnZXQKLWRlcGVuZGVudCBDT0ZGIHJvdXRpbmVzOgotCi0uIHVuc2lnbmVkIGludCBfYmZkX2ZpbGhzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3N5bWVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfbGluZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9maWxubWxlbjsKLS4gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7Ci0uIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lczsKLS4gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotLiBib29sZWFuIF9iZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzOwotLiB1bnNpZ25lZCBpbnQgX2JmZF9jb2ZmX2RlYnVnX3N0cmluZ19wcmVmaXhfbGVuZ3RoOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0uIFBUUiAoKl9iZmRfY29mZl9ta29iamVjdF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2FvdXRoZHIpKTsKLS4gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkciwKLS4gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLS4gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLS4gdm9pZCAoKl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4KSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfcHJpbnRfYXV4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBGSUxFICpmaWxlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCkpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0uICAgICAgIGFyZWxlbnQgKnJlbG9jLAotLiAgICAgICBiZmRfYnl0ZSAqZGF0YSwKLS4gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIpKTsKLS4gaW50ICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBhcmVsZW50ICpyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci0uIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gKCpfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmlucHV0X2JmZCwKLS4gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCi0uICAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnMpKTsKLS4gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotLiAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSwKLS4gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmliZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0uICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb25zdCBjaGFyICpuYW1lLAotLiAgICAgICBmbGFnd29yZCBmbGFncywgCi0uICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotLiAgICAgICBiZmRfdm1hIHZhbHVlLAotLiAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0uICAgICAgIGJvb2xlYW4gY29weSwKLS4gICAgICAgYm9vbGVhbiBjb2xsZWN0LCAKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotLgotLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgUEFSQU1TICgoCi0uCWJmZCAqIGFiZmQsCi0uICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgUEFSQU1TICgoCi0uCWJmZCAqIGFiZmQsCi0uCXN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotLgotLn0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotLgotLiNkZWZpbmUgY29mZl9iYWNrZW5kX2luZm8oYWJmZCkgKChiZmRfY29mZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9pbikgKGEsZSx0LGMsaW5kLG51bSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX2luKSAoYSxlLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKCBhKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSAoYSxlLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSAoYSxpLHQsYyxpbmQsbnVtLG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCi0uI2RlZmluZSBiZmRfY29mZl9hb3V0c3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hb3V0c3opCi0uI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0uI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCi0uI2RlZmluZSBiZmRfY29mZl9hdXhlc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hdXhlc3opCi0uI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbG5tbGVuKGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsbm1sZW4pCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAotLiAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcykKLS4jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotLgkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4oYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19pbihhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayhhYmZkLCBmaWxlaGRyKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKGFiZmQsIGZpbGVoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spXAotLiAgICAgICAgIChhYmZkLCBzY25oZHIsIG5hbWUsIHNlY3Rpb24pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rKGFiZmQsIHNlYywgc2NuaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgKGFiZmQsIHNlYywgc2NuaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZShhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIChhYmZkLCBzeW0pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXNfaW5fc3RyaW5ncyhhYmZkKVwKLS4gICAgCShjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfZGVidWdfc3RyaW5nX3ByZWZpeF9sZW5ndGgoYWJmZClcCi0uICAgIAkoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVidWdfc3RyaW5nX3ByZWZpeF9sZW5ndGgpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3ByaW50X2F1eClcCi0uICAgICAgICAgKGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyhhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcylcCi0uICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLS4gICAgICAgICAoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbChhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wpXAotLiAgICAgICAgIChhYmZkLCBzeW0pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKGFiZmQpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotLiAgICAgICAgIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChvYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspXAotLiAgICAgICAgIChvYmZkLCBpbmZvKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoaWJmZCktPl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKVwKLS4gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgbywgY29uLCByZWwsIGlzeW1zLCBzZWNzKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ydHlwZV90b19ob3d0bylcCi0uICAgICAgICAgKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApKQotLiNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keClcCi0uICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApKQotLiNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbClcCi0uICAgICAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLCBjcCwgY29sbCwgaGFzaHApKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKGEscCkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIChhLHApKQotLiNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIChhLHApKQotLgotKi8KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIGlmIChCQURNQUcgKCppbnRlcm5hbF9mKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogaWYgdGhlIG9wdGlvbmFsIGhlYWRlciBpcyBOVUxMIG9yIG5vdCB0aGUgY29ycmVjdCBzaXplIHRoZW4KLSAgICAgcXVpdDsgdGhlIG9ubHkgZGlmZmVyZW5jZSBJIGNhbiBzZWUgYmV0d2VlbiBtODhrIGRndXggaGVhZGVycyAoTUM4OERNQUdJQykKLSAgICAgYW5kIEludGVsIDk2MCByZWFkd3JpdGUgaGVhZGVycyAoSTk2MFdSTUFHSUMpIGlzIHRoYXQgdGhlCi0gICAgIG9wdGlvbmFsIGhlYWRlciBpcyBvZiBhIGRpZmZlcmVudCBzaXplLgotCi0gICAgIEJ1dCB0aGUgbWlwcyBrZWVwcyBleHRyYSBzdHVmZiBpbiBpdCdzIG9wdGhkciwgc28gZG9udCBjaGVjawotICAgICB3aGVuIGRvaW5nIHRoYXQKLSAgICAgKi8KLQotI2lmIGRlZmluZWQoTTg4KSB8fCBkZWZpbmVkKEk5NjApCi0gIGlmIChpbnRlcm5hbF9mLT5mX29wdGhkciAhPSAwICYmIGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCkgIT0gaW50ZXJuYWxfZi0+Zl9vcHRoZHIpCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgdGhpcyBzZWN0aW9uIHVzZXMgYW4gYWxpZ25tZW50IG90aGVyIHRoYW4gdGhlCi0gICBkZWZhdWx0LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjdGlvbiwgYWxpZ25tZW50X3RhYmxlLCB0YWJsZV9zaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5ICphbGlnbm1lbnRfdGFibGU7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGludCB0YWJsZV9zaXplOwotewotICBjb25zdCB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnQgPSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplOyArK2kpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChhbGlnbm1lbnRfdGFibGVbaV0uY29tcGFyaXNvbl9sZW5ndGggPT0gKHVuc2lnbmVkIGludCkgLTEKLQkgID8gc3RyY21wIChhbGlnbm1lbnRfdGFibGVbaV0ubmFtZSwgc2VjbmFtZSkgPT0gMAotCSAgOiBzdHJuY21wIChhbGlnbm1lbnRfdGFibGVbaV0ubmFtZSwgc2VjbmFtZSwKLQkJICAgICBhbGlnbm1lbnRfdGFibGVbaV0uY29tcGFyaXNvbl9sZW5ndGgpID09IDApCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoaSA+PSB0YWJsZV9zaXplKQotICAgIHJldHVybjsKLQotICBpZiAoYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21pbiAhPSBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWQotICAgICAgJiYgZGVmYXVsdF9hbGlnbm1lbnQgPCBhbGlnbm1lbnRfdGFibGVbaV0uZGVmYXVsdF9hbGlnbm1lbnRfbWluKQotICAgIHJldHVybjsKLQotICBpZiAoYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21heCAhPSBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWQotICAgICAgJiYgZGVmYXVsdF9hbGlnbm1lbnQgPiBhbGlnbm1lbnRfdGFibGVbaV0uZGVmYXVsdF9hbGlnbm1lbnRfbWF4KQotICAgIHJldHVybjsKLQotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBhbGlnbm1lbnRfdGFibGVbaV0uYWxpZ25tZW50X3Bvd2VyOwotfQotCi0vKiBDdXN0b20gc2VjdGlvbiBhbGlnbm1lbnQgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeQotY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZVtdID0KLXsKLSNpZmRlZiBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMKLSAgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTLAotI2VuZGlmCi0gIC8qIFRoZXJlIG11c3Qgbm90IGJlIGFueSBnYXBzIGJldHdlZW4gLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotICB7IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuc3RhYnN0ciIpLAotICAgIDEsIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAwIH0sCi0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uIG11c3QgYmUgYWxpZ25lZCB0byAyKioyIGF0IG1vc3QsIHRvIGF2b2lkIGdhcHMuICAqLwotICB7IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuc3RhYiIpLAotICAgIDMsIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sCi0gIC8qIFNpbWlsYXJseSBmb3IgdGhlIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb25zLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5jdG9ycyIpLAotICAgIDMsIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sCi0gIHsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuZHRvcnMiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGVfc2l6ZSA9Ci0gIHNpemVvZiBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlIC8gc2l6ZW9mIGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGVbMF07Ci0KLS8qIEluaXRpYWxpemUgYSBzZWN0aW9uIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIHBlY3VsaWFyIHRvIHRoaXMKLSAgIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgQ09GRi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLQotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVI7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLnRleHQiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyOwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXIgIT0gMAotICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksICIuZGF0YSIpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXI7Ci0jZW5kaWYKLQotICAvKiBBbGxvY2F0ZSBhdXggcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2xzLCB0byBzdG9yZSBzaXplIGFuZAotICAgICByZWxhdGVkIGluZm8uCi0KLSAgICAgQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuYXRpdmUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKSk7Ci0gIGlmIChuYXRpdmUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgbl9uYW1lLCBuX3ZhbHVlLCBvciBuX3NjbnVtIGluIHRoZSBuYXRpdmUKLSAgICAgc3ltYm9sIGluZm9ybWF0aW9uLCBzaW5jZSB0aGV5J2xsIGJlIG92ZXJyaWRlbiBieSB0aGUgQkZEIHN5bWJvbAotICAgICBhbnlob3cuICBIb3dldmVyLCB3ZSBkbyBuZWVkIHRvIHNldCB0aGUgdHlwZSBhbmQgc3RvcmFnZSBjbGFzcywKLSAgICAgaW4gY2FzZSB0aGlzIHN5bWJvbCB3aW5kcyB1cCBnZXR0aW5nIHdyaXR0ZW4gb3V0LiAgVGhlIHZhbHVlIDAKLSAgICAgZm9yIG5fbnVtYXV4IGlzIGFscmVhZHkgY29ycmVjdC4gICovCi0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLSAgY29mZnN5bWJvbCAoc2VjdGlvbi0+c3ltYm9sKS0+bmF0aXZlID0gbmF0aXZlOwotCi0gIGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjdGlvbiwKLQkJCQkgICAgIGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGUsCi0JCQkJICAgICBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlX3NpemUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUgotCi0vKiBTZXQgdGhlIGFsaWdubWVudCBvZiBhIEJGRCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNpZmRlZiBJOTYwCi0gIC8qIEV4dHJhY3QgQUxJR04gZnJvbSAyKipBTElHTiBzdG9yZWQgaW4gc2VjdGlvbiBoZWFkZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgaWYgKCgxIDw8IGkpID49IGhkci0+c19hbGlnbikKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgVElDODBDT0ZGCi0gIC8qIFRJIHRvb2xzIHB1dHMgdGhlIGFsaWdubWVudCBwb3dlciBpbiBiaXRzIDgtMTEgKi8KLSAgaSA9IChoZHItPnNfZmxhZ3MgPj4gOCkgJiAweEYgOwotI2VuZGlmCi0jaWZkZWYgQ09GRl9ERUNPREVfQUxJR05NRU5UCi0gIGkgPSBDT0ZGX0RFQ09ERV9BTElHTk1FTlQoaGRyLT5zX2ZsYWdzKTsKLSNlbmRpZgotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBpOwotCi0jaWZkZWYgY29mZl9zZXRfc2VjdGlvbl9sb2FkX3BhZ2UKLSAgY29mZl9zZXRfc2VjdGlvbl9sb2FkX3BhZ2UgKHNlY3Rpb24sIGhkci0+c19wYWdlKTsKLSNlbmRpZgotfQotCi0jZWxzZSAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogYSBjb3VwbGUgb2YgbWFjcm9zIHRvIGhlbHAgc2V0dGluZyB0aGUgYWxpZ25tZW50IHBvd2VyIGZpZWxkICovCi0jZGVmaW5lIEFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgaWYgKCgoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKVwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotI2RlZmluZSBFTElGQUxJR05fU0VUKGZpZWxkLHgseSkgXAotICBlbHNlIGlmICgoIChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApIFwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLQotICBBTElHTl9TRVQgICAgIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl82NEJZVEVTLCA2KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTLCA1KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTLCA0KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl84QllURVMsICAzKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl80QllURVMsICAyKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8yQllURVMsICAxKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xQllURVMsICAwKQotCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgV2UgYWxzbyBrZWVwCi0gICAgIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGZsYWcgdmFsdWUsIHNpbmNlIG5vdCBldmVyeSBiaXQgY2FuIGJlCi0gICAgIG1hcHBlZCBvbnRvIGEgZ2VuZXJpYyBCRkQgc2VjdGlvbiBiaXQuICAqLwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JewotCSAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQl7Ci0JICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemUgPSBoZHItPnNfcGFkZHI7Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyA9IGhkci0+c19mbGFnczsKLQotICBzZWN0aW9uLT5sbWEgPSBoZHItPnNfdmFkZHI7Ci19Ci0jdW5kZWYgQUxJR05fU0VUCi0jdW5kZWYgRUxJRkFMSUdOX1NFVAotCi0jZWxzZSAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0vKiBXZSBncm9zc2x5IGFidXNlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIFhDT0ZGIG92ZXJmbG93IGhlYWRlcnMuCi0gICBXaGVuIHdlIHNlZSBvbmUsIHdlIGNvcnJlY3QgdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudHMgaW4gdGhlCi0gICByZWFsIGhlYWRlciwgYW5kIHJlbW92ZSB0aGUgc2VjdGlvbiB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIGFzZWN0aW9uICpyZWFsX3NlYzsKLSAgYXNlY3Rpb24gKipwczsKLQotICBpZiAoKGhkci0+c19mbGFncyAmIFNUWVBfT1ZSRkxPKSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaGRyLT5zX25yZWxvYyk7Ci0gIGlmIChyZWFsX3NlYyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYy0+cmVsb2NfY291bnQgPSBoZHItPnNfcGFkZHI7Ci0gIHJlYWxfc2VjLT5saW5lbm9fY291bnQgPSBoZHItPnNfdmFkZHI7Ci0KLSAgZm9yIChwcyA9ICZhYmZkLT5zZWN0aW9uczsgKnBzICE9IE5VTEw7IHBzID0gJigqcHMpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHMgPT0gc2VjdGlvbikKLQl7Ci0JICAqcHMgPSAoKnBzKS0+bmV4dDsKLQkgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNlbHNlIC8qICEgUlM2MDAwQ09GRl9DICovCi0KLSNkZWZpbmUgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi0KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotI2VuZGlmIC8qICEgQ09GRl9XSVRIX1BFICovCi0jZW5kaWYgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0KLSNpZm5kZWYgY29mZl9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID0gKHN0cnVjdCBjb2ZmX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9kYXRhX3R5cGUpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICBjb2ZmLT5zeW1ib2xzID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgY29mZi0+Y29udmVyc2lvbl90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgTlVMTDsKLSAgY29mZi0+cmF3X3N5bWVudHMgPSAoc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqKSBOVUxMOwotICBjb2ZmLT5yZWxvY2Jhc2UgPSAwOwotICBjb2ZmLT5sb2NhbF90b2Nfc3ltX21hcCA9IDA7Ci0KLS8qICBtYWtlX2Fic19zZWN0aW9uKGFiZmQpOyovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIKLWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLQotICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBjb2ZmLT5sb2NhbF9hdXhlc3ogPSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpOwotICBjb2ZmLT5sb2NhbF9saW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotCi0gIGNvZmYtPnRpbWVzdGFtcCA9IGludGVybmFsX2YtPmZfdGltZGF0OwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCkpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2EgPQotCShzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBhb3V0aGRyOwotICAgICAgc3RydWN0IHhjb2ZmX3RkYXRhICp4Y29mZjsKLQotICAgICAgeGNvZmYgPSB4Y29mZl9kYXRhIChhYmZkKTsKLSAgICAgIHhjb2ZmLT5mdWxsX2FvdXRoZHIgPSB0cnVlOwotICAgICAgeGNvZmYtPnRvYyA9IGludGVybmFsX2EtPm9fdG9jOwotICAgICAgeGNvZmYtPnNudG9jID0gaW50ZXJuYWxfYS0+b19zbnRvYzsKLSAgICAgIHhjb2ZmLT5zbmVudHJ5ID0gaW50ZXJuYWxfYS0+b19zbmVudHJ5OwotICAgICAgeGNvZmYtPnRleHRfYWxpZ25fcG93ZXIgPSBpbnRlcm5hbF9hLT5vX2FsZ250ZXh0OwotICAgICAgeGNvZmYtPmRhdGFfYWxpZ25fcG93ZXIgPSBpbnRlcm5hbF9hLT5vX2FsZ25kYXRhOwotICAgICAgeGNvZmYtPm1vZHR5cGUgPSBpbnRlcm5hbF9hLT5vX21vZHR5cGU7Ci0gICAgICB4Y29mZi0+Y3B1dHlwZSA9IGludGVybmFsX2EtPm9fY3B1dHlwZTsKLSAgICAgIHhjb2ZmLT5tYXhkYXRhID0gaW50ZXJuYWxfYS0+b19tYXhkYXRhOwotICAgICAgeGNvZmYtPm1heHN0YWNrID0gaW50ZXJuYWxfYS0+b19tYXhzdGFjazsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEFSTSAKLSAgLyogU2V0IHRoZSBmbGFncyBmaWVsZCBmcm9tIHRoZSBDT0ZGIGhlYWRlciByZWFkIGluICovCi0gIGlmICghIF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGludGVybmFsX2YtPmZfZmxhZ3MpKQotICAgIGNvZmYtPmZsYWdzID0gMDsKLSNlbmRpZgotICAKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEknbSBub3Qgc3VyZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQsIHNpbmNlIHBlaWNvZGUuaAotICAgICBkZWZpbmVzIGNvZmZfbWtvYmplY3RfaG9vay4gICovCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQpID09IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0RFQlVHOwotI2VuZGlmCi0KLSAgcmV0dXJuIChQVFIpIGNvZmY7Ci19Ci0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4gIEZJWE1FOiBUaGlzIGlzIHRhcmdldAotICAgZGVwZW5kZW50IGJlY2F1c2UgdGhlIG1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gdGhlIHRhcmdldAotICAgZGVwZW5kZW50IGhlYWRlciBmaWxlcy4gIEJ1dCB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIG5lZWQgZm9yIHRoaXMuCi0gICBJZiB0aGUgbWFnaWMgbnVtYmVycyB3ZXJlIG1vdmVkIHRvIGEgc2VwYXJhdGUgZmlsZSwgdGhpcyBmdW5jdGlvbgotICAgd291bGQgYmUgdGFyZ2V0IGluZGVwZW5kZW50IGFuZCB3b3VsZCBhbHNvIGJlIG11Y2ggbW9yZSBzdWNjZXNzZnVsCi0gICBhdCBsaW5raW5nIHRvZ2V0aGVyIENPRkYgZmlsZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBsb25nIG1hY2hpbmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIG1hY2hpbmUgPSAwOwotICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCi0gICAgewotI2lmZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBQUENNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotICAgICAgbWFjaGluZSA9IDA7IC8qIHdoYXQgZG9lcyB0aGlzIG1lYW4/IChrcmspICovCi0gICAgICBicmVhazsgCi0jZW5kaWYKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICBjYXNlIEkzODZNQUdJQzoKLSAgICBjYXNlIEkzODZQVFhNQUdJQzoKLSAgICBjYXNlIEkzODZBSVhNQUdJQzoJCS8qIERhbmJ1cnkgUFMvMiBBSVggQyBDb21waWxlciAqLwotICAgIGNhc2UgTFlOWENPRkZNQUdJQzoJLyogc2hhZG93cyB0aGUgbTY4ayBMeW54IG51bWJlciBiZWxvdywgc2lnaCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSUE2NE1BR0lDCi0gICAgY2FzZSBJQTY0TUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaWE2NDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBMjlLX01BR0lDX0JJRwotICAgIGNhc2UgQTI5S19NQUdJQ19CSUc6Ci0gICAgY2FzZSBBMjlLX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBBUk1NQUdJQzoKLSAgICBjYXNlIEFSTVBFTUFHSUM6Ci0gICAgY2FzZSBUSFVNQlBFTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYXJtOwotICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9BUk1fQVJDSElURUNUVVJFX01BU0spCi0JewotICAgICAgICBjYXNlIEZfQVJNXzI6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzI7ICBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV8yYTogbWFjaGluZSA9IGJmZF9tYWNoX2FybV8yYTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fMzogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMzsgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlIEZfQVJNXzNNOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzNNOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV80OiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV80OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNFQ6IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNFQ7IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzU6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzU7ICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE1DNjhNQUdJQwotICAgIGNhc2UgTUM2OE1BR0lDOgotICAgIGNhc2UgTTY4TUFHSUM6Ci0jaWZkZWYgTUM2OEtCQ1NNQUdJQwotICAgIGNhc2UgTUM2OEtCQ1NNQUdJQzoKLSNlbmRpZgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgIGNhc2UgQVBPTExPTTY4S01BR0lDOgotI2VuZGlmCi0jaWZkZWYgTFlOWENPRkZNQUdJQwotICAgIGNhc2UgTFlOWENPRkZNQUdJQzoKLSNlbmRpZgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzg4TUFHSUMKLSAgICBjYXNlIE1DODhNQUdJQzoKLSAgICBjYXNlIE1DODhETUFHSUM6Ci0gICAgY2FzZSBNQzg4T01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX204OGs7Ci0gICAgICBtYWNoaW5lID0gODgxMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFo4S01BR0lDCi0gICAgY2FzZSBaOEtNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF96OGs7Ci0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX01BQ0hNQVNLKQotCXsKLQljYXNlIEZfWjgwMDE6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDE7Ci0JICBicmVhazsKLQljYXNlIEZfWjgwMDI6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTg2MAotICAgIGNhc2UgSTg2ME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2k4NjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk5NjAKLSNpZmRlZiBJOTYwUk9NQUdJQwotICAgIGNhc2UgSTk2MFJPTUFHSUM6Ci0gICAgY2FzZSBJOTYwUldNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pOTYwOwotICAgICAgc3dpdGNoIChGX0k5NjBUWVBFICYgaW50ZXJuYWxfZi0+Zl9mbGFncykKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEZfSTk2MENPUkU6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBLQjoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBNQzoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBYQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBDQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBLQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBKWDoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2p4OwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBIWDoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2h4OwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jaWZkZWYgWENPRkY2NAotICAgIGNhc2UgVTgwM1hUT0NNQUdJQzoKLSNlbHNlCi0gICAgY2FzZSBVODAyUk9NQUdJQzoKLSAgICBjYXNlIFU4MDJXUk1BR0lDOgotICAgIGNhc2UgVTgwMlRPQ01BR0lDOgotI2VuZGlmCi0gICAgICB7Ci0JaW50IGNwdXR5cGU7Ci0KLQlpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgIT0gLTEpCi0JICBjcHV0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgJiAweGZmOwotCWVsc2UKLQkgIHsKLQkgICAgLyogV2UgZGlkIG5vdCBnZXQgYSB2YWx1ZSBmcm9tIHRoZSBhLm91dCBoZWFkZXIuICBJZiB0aGUKLQkgICAgICAgZmlsZSBoYXMgbm90IGJlZW4gc3RyaXBwZWQsIHdlIG1heSBiZSBhYmxlIHRvIGdldCB0aGUKLQkgICAgICAgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpcnN0IHN5bWJvbCwgaWYgaXQKLQkgICAgICAgaXMgYSAuZmlsZSBzeW1ib2wuICAqLwotCSAgICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID09IDApCi0JICAgICAgY3B1dHlwZSA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF9ieXRlICpidWY7Ci0JCXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JCWJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChiZmRfY29mZl9zeW1lc3ogKGFiZmQpKTsKLQkJaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCQkgICAgfHwgKGJmZF9yZWFkIChidWYsIDEsIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCksIGFiZmQpIAotCQkJIT0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpCi0JCSAgewotCQkgICAgZnJlZSAoYnVmKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCWJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBidWYsIChQVFIpICZzeW0pOwotCQlpZiAoc3ltLm5fc2NsYXNzID09IENfRklMRSkKLQkJICBjcHV0eXBlID0gc3ltLm5fdHlwZSAmIDB4ZmY7Ci0JCWVsc2UKLQkJICBjcHV0eXBlID0gMDsKLQkJZnJlZSAoYnVmKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBGSVhNRTogV2UgZG9uJ3QgaGFuZGxlIGFsbCBjYXNlcyBoZXJlLiAgKi8KLQlzd2l0Y2ggKGNwdXR5cGUpCi0JICB7Ci0JICBkZWZhdWx0OgotCSAgY2FzZSAwOgotI2lmZGVmIFBPV0VSTUFDCi0JICAgIC8qIFBvd2VyUEMgTWFjcyB1c2UgdGhlIHNhbWUgbWFnaWMgbnVtYmVycyBhcyBSUy82MDAwCi0JICAgICAgIChiZWNhdXNlIHRoYXQncyBob3cgdGhleSB3ZXJlIGJvb3RzdHJhcHBlZCBvcmlnaW5hbGx5KSwKLQkgICAgICAgYnV0IHRoZXkgYXJlIGFsd2F5cyBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gMDsKLSNlbHNlCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0jaWZkZWYgWENPRkY2NAotCSAgICBtYWNoaW5lID0gNjIwOwotI2Vsc2UKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0jZW5kaWYKLSNlbmRpZiAvKiBQT1dFUk1BQyAqLwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYwMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6IC8qIDY0IGJpdCBQb3dlclBDICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gNjIwOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFdFMzJLTUFHSUMKLSAgICBjYXNlIFdFMzJLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwME1BR0lDCi0gICAgY2FzZSBIODMwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBITUFHSUMKLSAgICBjYXNlIEg4MzAwSE1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwaDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwU01BR0lDCi0gICAgY2FzZSBIODMwMFNNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMHM7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSF9BUkNIX01BR0lDX0JJRwotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19CSUc6Ci0gICAgY2FzZSBTSF9BUkNIX01BR0lDX0xJVFRMRToKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfV0lOQ0U6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNfQVJDSF9NQUdJQ19XSU5DRQotICAgIGNhc2UgTUlQU19BUkNIX01BR0lDX1dJTkNFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBIODUwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4NTAwOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgU1BBUkNNQUdJQzoKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBUSUMzME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQ09GRjBNQUdJQwotI2lmZGVmIFRJQ09GRl9UQVJHRVRfQVJDSAotICAgICAgLyogdGhpcyBUSSBDT0ZGIHNlY3Rpb24gc2hvdWxkIGJlIHVzZWQgYnkgYWxsIG5ldyBUSSBDT0ZGIHYwIHRhcmdldHMgKi8KLSAgICBjYXNlIFRJQ09GRjBNQUdJQzoKLSAgICAgIGFyY2ggPSBUSUNPRkZfVEFSR0VUX0FSQ0g7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUSUNPRkYxTUFHSUMKLSAgICAgIC8qIHRoaXMgVEkgQ09GRiBzZWN0aW9uIHNob3VsZCBiZSB1c2VkIGJ5IGFsbCBuZXcgVEkgQ09GRiB2MS8yIHRhcmdldHMgKi8KLSAgICAgIC8qIFRJIENPRkYxIGFuZCBDT0ZGMiB1c2UgdGhlIHRhcmdldF9pZCBmaWVsZCB0byBzcGVjaWZ5IHdoaWNoIGFyY2ggKi8KLSAgICBjYXNlIFRJQ09GRjFNQUdJQzoKLSAgICBjYXNlIFRJQ09GRjJNQUdJQzoKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl90YXJnZXRfaWQpCi0gICAgICAgIHsKLSNpZmRlZiBUSV9UQVJHRVRfSUQKLSAgICAgICAgY2FzZSBUSV9UQVJHRVRfSUQ6Ci0gICAgICAgICAgYXJjaCA9IFRJQ09GRl9UQVJHRVRfQVJDSDsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIlVucmVjb2duaXplZCBUSSBDT0ZGIHRhcmdldCBpZCAnMHgleCciKSwgCi0gICAgICAgICAgICAgaW50ZXJuYWxfZi0+Zl90YXJnZXRfaWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfQVJDSF9NQUdJQwotICAgIGNhc2UgVElDODBfQVJDSF9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF90aWM4MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNQ09SRU1BR0lDCi0gICAgY2FzZSBNQ09SRU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21jb3JlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgkJCS8qIFVucmVhZGFibGUgaW5wdXQgZmlsZSB0eXBlICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBTWU1OQU1FX0lOX0RFQlVHCi0KLXN0YXRpYyBib29sZWFuIHN5bW5hbWVfaW5fZGVidWdfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1zeW1uYW1lX2luX2RlYnVnX2hvb2sgKGFiZmQsIHN5bSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci17Ci0gIHJldHVybiBTWU1OQU1FX0lOX0RFQlVHIChzeW0pID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0jZWxzZQotCi0jZGVmaW5lIHN5bW5hbWVfaW5fZGVidWdfaG9vayBcCi0gIChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSkpIGJmZF9mYWxzZQotCi0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0jaWZkZWYgWENPRkY2NAotI2RlZmluZSBGT1JDRV9TWU1OQU1FU19JTl9TVFJJTkdTCi0jZW5kaWYKLSAgCi0vKiBIYW5kbGUgdGhlIGNzZWN0IGF1eGVudCBvZiBhIENfRVhUIG9yIENfSElERVhUIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vawotICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Ci17Ci0gIGludCBjbGFzcyA9IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3M7Ci0KLSAgaWYgKChjbGFzcyA9PSBDX0VYVCB8fCBjbGFzcyA9PSBDX0hJREVYVCkKLSAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfTEQpCi0JewotCSAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgPQotCSAgICB0YWJsZV9iYXNlICsgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICBhdXgtPmZpeF9zY25sZW4gPSAxOwotCX0KLQotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBub3QgZG8gYW55Ci0gICAgICAgICBmdXJ0aGVyIHdvcmsgb24gdGhpcyBhdXhlbnQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYXV4ZW50IHNob3VsZCBiZSBoYW5kbGVkIGJ5Ci0gICAgIHRoZSBjYWxsZXIuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbHNlCi0jaWZkZWYgSTk2MAotCi0vKiBXZSBkb24ndCB3YW50IHRvIHBvaW50ZXJpemUgYmFsIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogUmV0dXJuIHRydWUgaWYgd2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIHRoaXMgYXV4IGVudHJ5LCB3aGljaAotICAgICBpcyB0aGUgY2FzZSBmb3IgdGhlIGxhc3RmaXJzdCBhdXggZW50cnkgZm9yIGEgQ19MRUFGUFJPQyBzeW1ib2wuICAqLwotICByZXR1cm4gKGluZGF1eCA9PSAxCi0JICAmJiAoc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0xFQUZQUk9DCi0JICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0xFQUZTVEFUCi0JICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0xFQUZFWFQpKTsKLX0KLQotI2Vsc2UgLyogISBJOTYwICovCi0KLSNkZWZpbmUgY29mZl9wb2ludGVyaXplX2F1eF9ob29rIDAKLQotI2VuZGlmIC8qICEgSTk2MCAqLwotI2VuZGlmIC8qICEgUlM2MDAwQ09GRl9DICovCi0KLS8qIFByaW50IGFuIGF1eCBlbnRyeS4gIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IGhhcyBwcmludGVkIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wcmludF9hdXgKLSAgUEFSQU1TICgoYmZkICosIEZJTEUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgY29tYmluZWRfZW50cnlfdHlwZSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcHJpbnRfYXV4IChhYmZkLCBmaWxlLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRklMRSAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19FWFQKLSAgICAgICB8fCBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfSElERVhUKQotICAgICAgJiYgaW5kYXV4ICsgMSA9PSBzeW1ib2wtPnUuc3ltZW50Lm5fbnVtYXV4KQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjc2VjdCBlbnRyeS4gICovCi0gICAgICBmcHJpbnRmIChmaWxlLCAiQVVYICIpOwotICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgIT0gWFRZX0xEKQotCXsKLQkgIEJGRF9BU1NFUlQgKCEgYXV4LT5maXhfc2NubGVuKTsKLQkgIGZwcmludGYgKGZpbGUsICJ2YWwgJTVsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoZmlsZSwgImluZHggIik7Ci0JICBpZiAoISBhdXgtPmZpeF9zY25sZW4pCi0JICAgIGZwcmludGYgKGZpbGUsICIlNGxkIiwgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmwpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsCi0JCSAgICAgKGxvbmcpIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucCAtIHRhYmxlX2Jhc2UpKTsKLQl9Ci0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiIHBybWhzaCAlbGQgc25oc2ggJXUgdHlwICVkIGFsZ24gJWQgY2xzcyAldSBzdGIgJWxkIHNuc3RiICV1IiwKLQkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0LnhfcGFybWhhc2gsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NuaGFzaCwKLQkgICAgICAgU01UWVBfU01UWVAgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtdHlwKSwKLQkgICAgICAgU01UWVBfQUxJR04gKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtdHlwKSwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc21jbGFzLAotCSAgICAgICBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zdGFiLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbnN0YWIpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gd2FzIHRha2VuLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKgotU1VCU1VCU0VDVElPTgotCVdyaXRpbmcgcmVsb2NhdGlvbnMKLQotCVRvIHdyaXRlIHJlbG9jYXRpb25zLCB0aGUgYmFjayBlbmQgc3RlcHMgdGhvdWdoIHRoZQotCWNhbm9uaWNhbCByZWxvY2F0aW9uIHRhYmxlIGFuZCBjcmVhdGUgYW4KLQlAY29kZXtpbnRlcm5hbF9yZWxvY30uIFRoZSBzeW1ib2wgaW5kZXggdG8gdXNlIGlzIHJlbW92ZWQgZnJvbQotCXRoZSBAY29kZXtvZmZzZXR9IGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgc3VwcGxpZWQuICBUaGUKLQlhZGRyZXNzIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIHN1bSBvZiB0aGUgc2VjdGlvbiBiYXNlCi0JYWRkcmVzcyBhbmQgdGhlIHJlbG9jYXRpb24gb2Zmc2V0OyB0aGUgdHlwZSBpcyBkdWcgZGlyZWN0bHkKLQlmcm9tIHRoZSBob3d0byBmaWVsZC4gIFRoZW4gdGhlIEBjb2Rle2ludGVybmFsX3JlbG9jfSBpcwotCXN3YXBwZWQgaW50byB0aGUgc2hhcGUgb2YgYW4gQGNvZGV7ZXh0ZXJuYWxfcmVsb2N9IGFuZCB3cml0dGVuCi0Jb3V0IHRvIGRpc2suCi0KLSovCi0KLSNpZmRlZiBUQVJHX0FVWAotCi1zdGF0aWMgaW50IGNvbXBhcmVfYXJlbGVudF9wdHIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogQVVYJ3MgbGQgd2FudHMgcmVsb2NhdGlvbnMgdG8gYmUgc29ydGVkICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX2FyZWxlbnRfcHRyICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIGNvbnN0IGFyZWxlbnQgKiphID0gKGNvbnN0IGFyZWxlbnQgKiopIHg7Ci0gIGNvbnN0IGFyZWxlbnQgKipiID0gKGNvbnN0IGFyZWxlbnQgKiopIHk7Ci0gIGJmZF9zaXplX3R5cGUgYWFkciA9ICgqYSktPmFkZHJlc3M7Ci0gIGJmZF9zaXplX3R5cGUgYmFkciA9ICgqYiktPmFkZHJlc3M7Ci0KLSAgcmV0dXJuIChhYWRyIDwgYmFkciA/IC0xIDogYmFkciA8IGFhZHIgPyAxIDogMCk7Ci19Ci0KLSNlbmRpZiAvKiBUQVJHX0FVWCAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9yZWxvY3MgKGFiZmQsIGZpcnN0X3VuZGVmKQotICAgICBiZmQgKiBhYmZkOwotICAgICBpbnQgZmlyc3RfdW5kZWY7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyBkc3Q7Ci0gICAgICBhcmVsZW50ICoqcDsKLQotI2lmbmRlZiBUQVJHX0FVWAotICAgICAgcCA9IHMtPm9yZWxvY2F0aW9uOwotI2Vsc2UKLSAgICAgIC8qIHNvcnQgcmVsb2NhdGlvbnMgYmVmb3JlIHdlIHdyaXRlIHRoZW0gb3V0ICovCi0gICAgICBwID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgICAgIGlmIChwID09IE5VTEwgJiYgcy0+cmVsb2NfY291bnQgPiAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbWNweSAocCwgcy0+b3JlbG9jYXRpb24sIHMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgICAgIHFzb3J0IChwLCBzLT5yZWxvY19jb3VudCwgc2l6ZW9mIChhcmVsZW50ICopLCBjb21wYXJlX2FyZWxlbnRfcHRyKTsKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cmVsb2NfY291bnQ7IGkrKykKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgbjsKLQkgIGFyZWxlbnQgKnEgPSBwW2ldOwotCSAgbWVtc2V0ICgoUFRSKSAmIG4sIDAsIHNpemVvZiAobikpOwotCi0JICAvKiBOb3cgd2UndmUgcmVudW1iZXJlZCB0aGUgc3ltYm9scyB3ZSBrbm93IHdoZXJlIHRoZQotCSAgICAgdW5kZWZpbmVkIHN5bWJvbHMgbGl2ZSBpbiB0aGUgdGFibGUuICBDaGVjayB0aGUgcmVsb2MKLQkgICAgIGVudHJpZXMgZm9yIHN5bWJvbHMgd2hvJ3Mgb3V0cHV0IGJmZCBpc24ndCB0aGUgcmlnaHQgb25lLgotCSAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCAod2hpY2ggbWVhbnMKLQkgICAgIHRoYXQgYWxsIHRoZSBwb2ludGVycyBhcmUgbmV2ZXIgbWFkZSB0byBwb2ludCB0byB0aGUgc2FtZQotCSAgICAgcGxhY2UpLiBUaGlzIGlzIGEgYmFkIHRoaW5nLCdjYXVzZSB0aGUgc3ltYm9scyBhdHRhY2hlZAotCSAgICAgdG8gdGhlIG91dHB1dCBiZmQgYXJlIGluZGV4ZWQsIHNvIHRoYXQgdGhlIHJlbG9jYXRpb24KLQkgICAgIGVudHJpZXMga25vdyB3aGljaCBzeW1ib2wgaW5kZXggdGhleSBwb2ludCB0by4gIFNvIHdlCi0JICAgICBoYXZlIHRvIGxvb2sgdXAgdGhlIG91dHB1dCBzeW1ib2wgaGVyZS4gKi8KLQotCSAgaWYgKHEtPnN5bV9wdHJfcHRyWzBdLT50aGVfYmZkICE9IGFiZmQpCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQkgICAgICBjb25zdCBjaGFyICpzbmFtZSA9IHEtPnN5bV9wdHJfcHRyWzBdLT5uYW1lOwotCSAgICAgIGFzeW1ib2wgKipvdXRzeW1zID0gYWJmZC0+b3V0c3ltYm9sczsKLQkgICAgICBmb3IgKGkgPSBmaXJzdF91bmRlZjsgb3V0c3ltc1tpXTsgaSsrKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqaW50YWJsZSA9IG91dHN5bXNbaV0tPm5hbWU7Ci0JCSAgaWYgKHN0cmNtcCAoaW50YWJsZSwgc25hbWUpID09IDApIHsKLQkJICAgIC8qIGdvdCBhIGhpdCwgc28gcmVwb2ludCB0aGUgcmVsb2MgKi8KLQkJICAgIHEtPnN5bV9wdHJfcHRyID0gb3V0c3ltcyArIGk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCX0KLQkgICAgfQotCi0JICBuLnJfdmFkZHIgPSBxLT5hZGRyZXNzICsgcy0+dm1hOwotCi0jaWZkZWYgUl9JSENPTlNUCi0JICAvKiBUaGUgMjlrIGNvbnN0L2NvbnN0aCByZWxvYyBwYWlyIGlzIGEgcmVhbCBrbHVkZ2UuICBUaGUgY29uc3RoCi0JICAgICBwYXJ0IGRvZXNuJ3QgaGF2ZSBhIHN5bWJvbDsgaXQgaGFzIGFuIG9mZnNldC4gIFNvIHJlYnVpbHQKLQkgICAgIHRoYXQgaGVyZS4gICovCi0JICBpZiAocS0+aG93dG8tPnR5cGUgPT0gUl9JSENPTlNUKQotCSAgICBuLnJfc3ltbmR4ID0gcS0+YWRkZW5kOwotCSAgZWxzZQotI2VuZGlmCi0JICAgIGlmIChxLT5zeW1fcHRyX3B0cikKLQkgICAgICB7Ci0jaWZkZWYgU0VDVElPTl9SRUxBVElWRV9BQlNPTFVURV9TWU1CT0xfUAotICAgICAgICAgICAgICAgIGlmIChTRUNUSU9OX1JFTEFUSVZFX0FCU09MVVRFX1NZTUJPTF9QIChxLHMpKQotI2Vsc2UKLQkJaWYgKHEtPnN5bV9wdHJfcHRyID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyKQotI2VuZGlmCi0JCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGFic29sdXRlIHN5bWJvbC4gICovCi0JCSAgbi5yX3N5bW5keCA9IC0xOwotCQllbHNlCi0JCSAgewotCQkgICAgbi5yX3N5bW5keCA9IGdldF9pbmRleCAoKCoocS0+c3ltX3B0cl9wdHIpKSk7Ci0JCSAgICAvKiBUYWtlIG5vdGljZSBpZiB0aGUgc3ltYm9sIHJlbG9jIHBvaW50cyB0byBhIHN5bWJvbAotCQkgICAgICAgd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc3ltYm9sIHRhYmxlLiAgV2hhdCBzaG91bGQgd2UKLQkJICAgICAgIGRvIGZvciB0aGlzPz8gICovCi0JCSAgICBpZiAobi5yX3N5bW5keCA+IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0JICBuLnJfb2Zmc2V0ID0gcS0+YWRkZW5kOwotI2VuZGlmCi0KLSNpZmRlZiBTRUxFQ1RfUkVMT0MKLQkgIC8qIFdvcmsgb3V0IHJlbG9jIHR5cGUgZnJvbSB3aGF0IGlzIHJlcXVpcmVkICovCi0JICBTRUxFQ1RfUkVMT0MgKG4sIHEtPmhvd3RvKTsKLSNlbHNlCi0JICBuLnJfdHlwZSA9IHEtPmhvd3RvLT50eXBlOwotI2VuZGlmCi0JICBjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbiwgJmRzdCk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGRzdCwgMSwgYmZkX2NvZmZfcmVsc3ogKGFiZmQpLCBhYmZkKQotCSAgICAgICE9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotI2lmZGVmIFRBUkdfQVVYCi0gICAgICBpZiAocCAhPSBOVUxMKQotCWZyZWUgKHApOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgZmxhZ3MgYW5kIG1hZ2ljIG51bWJlciBvZiBhIGNvZmYgZmlsZSBmcm9tIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotICAgdHlwZS4gIFJlc3VsdCBpcyB0cnVlIGlmIHdlIGNhbiByZXByZXNlbnQgdGhlIGFyY2gmdHlwZSwgZmFsc2UgaWYgbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2ZsYWdzIChhYmZkLCBtYWdpY3AsIGZsYWdzcCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICptYWdpY3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgc2hvcnQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotI2lmZGVmIFo4S01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF96OGs6Ci0gICAgICAqbWFnaWNwID0gWjhLTUFHSUM7Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfejgwMDE6Ci0JICAqZmxhZ3NwID0gRl9aODAwMTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfejgwMDI6Ci0JICAqZmxhZ3NwID0gRl9aODAwMjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBJOTYwUk9NQUdJQwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotCi0gICAgICB7Ci0JdW5zaWduZWQgZmxhZ3M7Ci0JKm1hZ2ljcCA9IEk5NjBST01BR0lDOwotCS8qCi0JICAoKGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAmIFdQX1RFWFQpID8gSTk2MFJPTUFHSUMgOgotCSAgSTk2MFJXTUFHSUMpOyAgIEZJWE1FPz8/Ci0JICAqLwotCXN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQkgIHsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9jb3JlOgotCSAgICBmbGFncyA9IEZfSTk2MENPUkU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgotCSAgICBmbGFncyA9IEZfSTk2MEtCOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9tYzoKLQkgICAgZmxhZ3MgPSBGX0k5NjBNQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfeGE6Ci0JICAgIGZsYWdzID0gRl9JOTYwWEE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2NhOgotCSAgICBmbGFncyA9IEZfSTk2MENBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKLQkgICAgZmxhZ3MgPSBGX0k5NjBLQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfang6Ci0JICAgIGZsYWdzID0gRl9JOTYwSlg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2h4OgotCSAgICBmbGFncyA9IEZfSTk2MEhYOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkqZmxhZ3NwID0gZmxhZ3M7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVElDMzBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfdGljMzA6Ci0gICAgICAqbWFnaWNwID0gVElDMzBNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0KLSNpZmRlZiBUSUNPRkZfREVGQVVMVF9NQUdJQwotICAgIGNhc2UgVElDT0ZGX1RBUkdFVF9BUkNIOgotICAgICAgLyogaWYgdGhlcmUncyBubyBpbmRpY2F0aW9uIG9mIHdoaWNoIHZlcnNpb24gd2Ugd2FudCwgdXNlIHRoZSBkZWZhdWx0ICovCi0gICAgICBpZiAoIWFiZmQtPnh2ZWMgKQotICAgICAgICAqbWFnaWNwID0gVElDT0ZGX0RFRkFVTFRfTUFHSUM7Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSBtYXkgd2FudCB0byBvdXRwdXQgaW4gYSBkaWZmZXJlbnQgQ09GRiB2ZXJzaW9uICovCi0gICAgICAgICAgc3dpdGNoIChhYmZkLT54dmVjLT5uYW1lWzRdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgICptYWdpY3AgPSBUSUNPRkYwTUFHSUM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICptYWdpY3AgPSBUSUNPRkYxTUFHSUM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgICptYWdpY3AgPSBUSUNPRkYyTUFHSUM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfQVJDSF9NQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfdGljODA6Ci0gICAgICAqbWFnaWNwID0gVElDODBfQVJDSF9NQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jaWZkZWYgQVJNTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2FybToKLSNpZmRlZiBBUk1fV0lOQ0UKLSAgICAgICogbWFnaWNwID0gQVJNUEVNQUdJQzsKLSNlbHNlCi0gICAgICAqIG1hZ2ljcCA9IEFSTU1BR0lDOwotI2VuZGlmCi0gICAgICAqIGZsYWdzcCA9IDA7Ci0gICAgICBpZiAoQVBDU19TRVQgKGFiZmQpKQotCXsKLQkgIGlmIChBUENTXzI2X0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX0FQQ1MyNjsKLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfQVBDU19GTE9BVDsKLQkgIAotCSAgaWYgKFBJQ19GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9QSUM7Ci0JfQotICAgICAgaWYgKElOVEVSV09SS19TRVQgKGFiZmQpICYmIElOVEVSV09SS19GTEFHIChhYmZkKSkKLQkqIGZsYWdzcCB8PSBGX0lOVEVSV09SSzsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMjogICogZmxhZ3NwIHw9IEZfQVJNXzI7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8yYTogKiBmbGFnc3AgfD0gRl9BUk1fMmE7IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzM6ICAqIGZsYWdzcCB8PSBGX0FSTV8zOyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fM006ICogZmxhZ3NwIHw9IEZfQVJNXzNNOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV80OiAgKiBmbGFnc3AgfD0gRl9BUk1fNDsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzRUOiAqIGZsYWdzcCB8PSBGX0FSTV80VDsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNTogICogZmxhZ3NwIHw9IEZfQVJNXzU7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV81VDogKiBmbGFnc3AgfD0gRl9BUk1fNTsgIGJyZWFrOyAvKiBYWFggLSB3ZSBkbyBub3QgaGF2ZSBhbiBGX0FSTV81VCAqLwotCX0KLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jaWZkZWYgUFBDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICAqbWFnaWNwID0gUFBDTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTM4Nk1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgKm1hZ2ljcCA9IEkzODZNQUdJQzsKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJODYwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2k4NjA6Ci0gICAgICAqbWFnaWNwID0gSTg2ME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIElBNjRNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaWE2NDoKLSAgICAgICptYWdpY3AgPSBJQTY0TUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgICAgKm1hZ2ljcCA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2Vsc2UKLSAgICAgIC8qIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBtYXkgYmUgZGVmaW5lZCBieSBjb2ZmLXU2OGsuYy4gICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgICAqbWFnaWNwID0gTUM2OEtCQ1NNQUdJQzsKLSNlbHNlCi0gICAgICAqbWFnaWNwID0gTUM2OE1BR0lDOwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgICptYWdpY3AgPSBNQzg4T01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEg4MzAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgKm1hZ2ljcCA9IEg4MzAwTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgICptYWdpY3AgPSBIODMwMEhNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgKm1hZ2ljcCA9IEg4MzAwU01BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgICptYWdpY3AgPSBTSF9BUkNIX01BR0lDX1dJTkNFOwotI2Vsc2UKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfQklHOwotICAgICAgZWxzZQotCSptYWdpY3AgPSBTSF9BUkNIX01BR0lDX0xJVFRMRTsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUlQU19BUkNIX01BR0lDX1dJTkNFCi0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgICAgKm1hZ2ljcCA9IE1JUFNfQVJDSF9NQUdJQ19XSU5DRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNQQVJDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgKm1hZ2ljcCA9IFNQQVJDTUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgICptYWdpY3AgPSBIODUwME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IEEyOUtfTUFHSUNfTElUVExFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgV0UzMktNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfd2UzMms6Ci0gICAgICAqbWFnaWNwID0gV0UzMktNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotI2lmbmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSNlbmRpZgotI2lmZGVmIFhDT0ZGNjQKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IDYyMCAmJiAhc3RybmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwiYWl4IiwgMykpCi0JKm1hZ2ljcCA9IFU4MDNYVE9DTUFHSUM7IAotICAgICAgZWxzZQotI2Vsc2UKLSAgICAJKm1hZ2ljcCA9IFU4MDJUT0NNQUdJQzsgCi0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DT1JFTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgKiBtYWdpY3AgPSBNQ09SRU1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSAgICAgIAotICAgIGRlZmF1bHQ6CQkJLyogVW5rbm93biBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIC8qIHJldHVybiBmYWxzZTsgIC0tIGZhbGwgdGhyb3VnaCB0byAicmV0dXJuIGZhbHNlIiBiZWxvdywgdG8gYXZvaWQKLSAgICAgICAic3RhdGVtZW50IG5ldmVyIHJlYWNoZWQiIGVycm9ycyBvbiB0aGUgb25lIGJlbG93LiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICB1bnNpZ25lZCBkdW1teTE7Ci0gIHVuc2lnbmVkIHNob3J0IGR1bW15MjsKLQotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93biAmJgotICAgICAgY29mZl9zZXRfZmxhZ3MgKGFiZmQsICZkdW1teTEsICZkdW1teTIpICE9IHRydWUpCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoaXMgdHlwZSAqLwotCi0gIHJldHVybiB0cnVlOwkJCS8qIFdlJ3JlIGVhc3kgLi4uICovCi19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhpcyBpcyB1c2VkIHRvIHNvcnQgc2VjdGlvbnMgYnkgVk1BLCBhcyByZXF1aXJlZCBieSBQRSBpbWFnZQotICAgZmlsZXMuICAqLwotCi1zdGF0aWMgaW50IHNvcnRfYnlfc2VjYWRkciBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY2FkZHIgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqYiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKGEtPnZtYSA8IGItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGEtPnZtYSA+IGItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCi0KLS8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbiBmb3IgZWFjaCBzZWN0aW9uLiAqLwotCi0jaWZuZGVmIEk5NjAKLSNkZWZpbmUgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0jaWYgZGVmaW5lZChUSUM4MENPRkYpIHx8IGRlZmluZWQoVElDT0ZGKQotI3VuZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBhc2VjdGlvbiAqcHJldmlvdXMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgZmlsZV9wdHIgc29mYXIgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotICBib29sZWFuIGFsaWduX2FkanVzdDsKLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSNlbmRpZgotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIC8qIE9uIFhDT0ZGLCBpZiB3ZSBoYXZlIHN5bWJvbHMsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3o7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGksIHN5bWNvdW50OwotICAgICAgYXN5bWJvbCAqKnN5bXA7Ci0KLSAgICAgIHN6ID0gMDsKLSAgICAgIHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBmb3IgKHN5bXAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IHN5bWNvdW50OyBzeW1wKyssIGkrKykKLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjZjsKLQotCSAgY2YgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCAqc3ltcCk7Ci0JICBpZiAoY2YgIT0gTlVMTAotCSAgICAgICYmIGNmLT5uYXRpdmUgIT0gTlVMTAotCSAgICAgICYmIFNZTU5BTUVfSU5fREVCVUcgKCZjZi0+bmF0aXZlLT51LnN5bWVudCkpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lICgqc3ltcCkpOwotCSAgICAgIGlmIChsZW4gPiBTWU1OTUxFTiB8fCBiZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzIChhYmZkKSkKLQkJc3ogKz0gbGVuICsgMSArIGJmZF9jb2ZmX2RlYnVnX3N0cmluZ19wcmVmaXhfbGVuZ3RoIChhYmZkKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzeiA+IDApCi0JewotCSAgYXNlY3Rpb24gKmRzZWM7Ci0KLQkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGVidWciKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgZHNlYy0+X3Jhd19zaXplID0gc3o7Ci0JICBkc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBpbnQgcGFnZV9zaXplOwotICBpZiAoY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvKSAKLSAgICB7Ci0gICAgICBwYWdlX3NpemUgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkZpbGVBbGlnbm1lbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgcGFnZV9zaXplID0gUEVfREVGX0ZJTEVfQUxJR05NRU5UOwotI2Vsc2UKLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICBpbnQgcGFnZV9zaXplID0gQ09GRl9QQUdFX1NJWkU7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qICBBIHN0YXJ0IGFkZHJlc3MgbWF5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgb3JpZ2luYWwgZmlsZS4gSW4gdGhpcwotCSAgY2FzZSBpdCB3aWxsIG5lZWQgYW4gb3B0aW9uYWwgaGVhZGVyIHRvIHJlY29yZCBpdC4gICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBzb2ZhciArPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNvZmFyICs9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzb2ZhciArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLQotICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBYQ09GRiBoYW5kbGVzIG92ZXJmbG93cyBpbiB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50IGZpZWxkcwotICAgICBieSBhbGxvY2F0aW5nIGEgbmV3IHNlY3Rpb24gaGVhZGVyIHRvIGhvbGQgdGhlIGNvcnJlY3QgY291bnRzLiAgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID49IDB4ZmZmZiB8fCBjdXJyZW50LT5saW5lbm9fY291bnQgPj0gMHhmZmZmKQotICAgICAgc29mYXIgKz0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIHsKLSAgICAvKiBQRSByZXF1aXJlcyB0aGUgc2VjdGlvbnMgdG8gYmUgaW4gbWVtb3J5IG9yZGVyIHdoZW4gbGlzdGVkIGluCi0gICAgICAgdGhlIHNlY3Rpb24gaGVhZGVycy4gIEl0IGFsc28gZG9lcyBub3QgbGlrZSBlbXB0eSBsb2FkYWJsZQotICAgICAgIHNlY3Rpb25zLiAgVGhlIHNlY3Rpb25zIGFwcGFyZW50bHkgZG8gbm90IGhhdmUgdG8gYmUgaW4gdGhlCi0gICAgICAgcmlnaHQgb3JkZXIgaW4gdGhlIGltYWdlIGZpbGUgaXRzZWxmLCBidXQgd2UgZG8gbmVlZCB0byBnZXQgdGhlCi0gICAgICAgdGFyZ2V0X2luZGV4IHZhbHVlcyByaWdodC4gICovCi0KLSAgICBpbnQgY291bnQ7Ci0gICAgYXNlY3Rpb24gKipzZWN0aW9uX2xpc3Q7Ci0gICAgaW50IGk7Ci0gICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgICsrY291bnQ7Ci0KLSAgICAvKiBXZSBhbGxvY2F0ZSBhbiBleHRyYSBjZWxsIHRvIHNpbXBsaWZ5IHRoZSBmaW5hbCBsb29wLiAgKi8KLSAgICBzZWN0aW9uX2xpc3QgPSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBhc2VjdGlvbiAqKSAqIChjb3VudCArIDEpKTsKLSAgICBpZiAoc2VjdGlvbl9saXN0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIHsKLQlzZWN0aW9uX2xpc3RbaV0gPSBjdXJyZW50OwotCSsraTsKLSAgICAgIH0KLSAgICBzZWN0aW9uX2xpc3RbaV0gPSBOVUxMOwotCi0gICAgcXNvcnQgKHNlY3Rpb25fbGlzdCwgY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksIHNvcnRfYnlfc2VjYWRkcik7Ci0KLSAgICAvKiBSZXRocmVhZCB0aGUgbGlua2VkIGxpc3QgaW50byBzb3J0ZWQgb3JkZXI7IGF0IHRoZSBzYW1lIHRpbWUsCi0gICAgICAgYXNzaWduIHRhcmdldF9pbmRleCB2YWx1ZXMuICAqLwotICAgIHRhcmdldF9pbmRleCA9IDE7Ci0gICAgYWJmZC0+c2VjdGlvbnMgPSBzZWN0aW9uX2xpc3RbMF07Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICB7Ci0JY3VycmVudCA9IHNlY3Rpb25fbGlzdFtpXTsKLQljdXJyZW50LT5uZXh0ID0gc2VjdGlvbl9saXN0W2kgKyAxXTsKLQotCS8qIExhdGVyLCBpZiB0aGUgc2VjdGlvbiBoYXMgemVybyBzaXplLCB3ZSdsbCBiZSB0aHJvd2luZyBpdAotCSAgIGF3YXksIHNvIHdlIGRvbid0IHdhbnQgdG8gbnVtYmVyIGl0IG5vdy4gIE5vdGUgdGhhdCBoYXZpbmcKLQkgICBhIHplcm8gc2l6ZSBhbmQgaGF2aW5nIHJlYWwgY29udGVudHMgYXJlIGRpZmZlcmVudAotCSAgIGNvbmNlcHRzOiAuYnNzIGhhcyBubyBjb250ZW50cywgYnV0ICh1c3VhbGx5KSBub24temVybwotCSAgIHNpemUuICAqLwotCWlmIChjdXJyZW50LT5fcmF3X3NpemUgPT0gMCkKLQkgIHsKLQkgICAgLyogRGlzY2FyZC4gIEhvd2V2ZXIsIGl0IHN0aWxsIG1pZ2h0IGhhdmUgKHZhbGlkKSBzeW1ib2xzCi0JICAgICAgIGluIGl0LCBzbyBhcmJpdHJhcmlseSBzZXQgaXQgdG8gc2VjdGlvbiAxIChpbmRleGluZyBpcwotCSAgICAgICAxLWJhc2VkIGhlcmU7IHVzdWFsbHkgLnRleHQpLiAgX19lbmRfXyBhbmQgb3RoZXIKLQkgICAgICAgY29udGVudHMgb2YgLmVuZHNlY3Rpb24gcmVhbGx5IGhhdmUgdGhpcyBoYXBwZW4uCi0JICAgICAgIEZJWE1FOiBUaGlzIHNlZW1zIHNvbWV3aGF0IGR1YmlvdXMuICAqLwotCSAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSAxOwotCSAgfQotCWVsc2UKLQkgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICAgICAgfQotCi0gICAgZnJlZSAoc2VjdGlvbl9saXN0KTsKLSAgfQotI2Vsc2UgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLSAgewotICAgIC8qIFNldCB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICAgdGFyZ2V0X2luZGV4ID0gMTsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICB9Ci0jZW5kaWYgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotICBhbGlnbl9hZGp1c3QgPSBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBXaXRoIFBFIHdlIGhhdmUgdG8gcGFkIGVhY2ggc2VjdGlvbiB0byBiZSBhIG11bHRpcGxlIG9mIGl0cwotCSBwYWdlIHNpemUgdG9vLCBhbmQgcmVtZW1iZXIgYm90aCBzaXplcy4gICovCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY3VycmVudC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjdXJyZW50LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPT0gMCkKLQlwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotI2VuZGlmCi0KLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIHNlY3Rpb25zIHdoaWNoIGhhdmUgY29udGVudHMuICAqLwotICAgICAgaWYgKCEoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLQljb250aW51ZTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogTWFrZSBzdXJlIHdlIHNraXAgZW1wdHkgc2VjdGlvbnMgaW4gYSBQRSBpbWFnZS4gICovCi0gICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDApCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICBJOTYwIGRvZXNuJ3QKLQkgZG8gdGhpcyAoRklYTUUpIHNvIHdlIGNhbiBzdGF5IGluIHN5bmMgd2l0aCBJbnRlbC4gIDk2MAotCSBkb2Vzbid0IHlldCBwYWdlIGZyb20gZmlsZXMuLi4gKi8KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotCXsKLQkgIC8qIG1ha2Ugc3VyZSB0aGlzIHNlY3Rpb24gaXMgYWxpZ25lZCBvbiB0aGUgcmlnaHQgYm91bmRhcnkgLSBieQotCSAgICAgcGFkZGluZyB0aGUgcHJldmlvdXMgc2VjdGlvbiB1cCBpZiBuZWNlc3NhcnkgKi8KLQotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGlmIChwcmV2aW91cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIHByZXZpb3VzLT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JICAgIH0KLQl9Ci0KLSNlbmRpZgotCi0gICAgICAvKiBJbiBkZW1hbmQgcGFnZWQgZmlsZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBmaWxlIG9mZnNldAotCSBtdXN0IG1hdGNoIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzLiAgKi8KLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcGFnZV9zaXplOwotI2VuZGlmCi0gICAgICBjdXJyZW50LT5maWxlcG9zID0gc29mYXI7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFNldCB0aGUgcGFkZGVkIHNpemUuICAqLwotICAgICAgY3VycmVudC0+X3Jhd19zaXplID0gKGN1cnJlbnQtPl9yYXdfc2l6ZSArIHBhZ2Vfc2l6ZSAtMSkgJiAtcGFnZV9zaXplOwotI2VuZGlmCi0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBvbGRfc2l6ZTsKLQotCSAgb2xkX3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKGN1cnJlbnQtPl9yYXdfc2l6ZSwKLQkJCQkJICAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBjdXJyZW50LT5fcmF3X3NpemUgIT0gb2xkX3NpemU7Ci0JICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemUgLSBvbGRfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGFsaWduX2FkanVzdCA9IHNvZmFyICE9IG9sZF9zb2ZhcjsKLQkgIGN1cnJlbnQtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogRm9yIFBFIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHBhZCBvdXQgdG8gdGhlIGFsaWduZWQKLSAgICAgICAgIF9yYXdfc2l6ZSwgaW4gY2FzZSB0aGUgY2FsbGVyIG9ubHkgd3JpdGVzIG91dCBkYXRhIHRvIHRoZQotICAgICAgICAgdW5hbGlnbmVkIF9yYXdfc2l6ZS4gICovCi0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA8IGN1cnJlbnQtPl9yYXdfc2l6ZSkKLQlhbGlnbl9hZGp1c3QgPSB0cnVlOwotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBGb3JjZSAubGliIHNlY3Rpb25zIHRvIHN0YXJ0IGF0IHplcm8uICBUaGUgdm1hIGlzIHRoZW4KLQkgaW5jcmVtZW50ZWQgaW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cy4gIFRoaXMgaXMgcmlnaHQgZm9yCi0JIFNWUjMuMi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCWJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQsIDApOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICB9Ci0KLSAgLyogSXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgd2UgbmVlZGVkIGFuCi0gICAgIGFsaWdubWVudCBhZGp1c3RtZW50IGZvciB0aGUgbGFzdCBzZWN0aW9uLCB0aGVuIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIHRoZXJlIGlzIGEgYnl0ZSBhdCBvZmZzZXQgc29mYXIuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBhbmQgbm8KLSAgICAgcmVsb2NzLCB0aGVuIG5vdGhpbmcgZm9sbG93cyB0aGUgbGFzdCBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgZm9yY2UKLSAgICAgdGhlIGxhc3QgYnl0ZSBvdXQsIHRoZW4gdGhlIGZpbGUgbWF5IGFwcGVhciB0byBiZSB0cnVuY2F0ZWQuICAqLwotICBpZiAoYWxpZ25fYWRqdXN0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb2ZhciAtIDEsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgYWxpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbWFrZQotICAgICBzdXJlIHRoYXQgdGhpcyBieXRlIGV4aXN0cywgYmVjYXVzZSBpdCB3aWxsIG9ubHkgbWF0dGVyIGlmIHRoZXJlCi0gICAgIHJlYWxseSBhcmUgcmVsb2NzLiAgKi8KLSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik7Ci0KLSAgb2JqX3JlbG9jYmFzZSAoYWJmZCkgPSBzb2ZhcjsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgY2FuIG5ldmVyIHdvcmssIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHRvbyBsYXRlLS1hZnRlciB0aGUKLSAgIHNlY3Rpb24gcG9zaXRpb25zIGhhdmUgYmVlbiBzZXQuICBJIGNhbid0IGZpZ3VyZSBvdXQgd2hhdCBpdCBpcwotICAgZm9yLCBzbyBJIGFtIGdvaW5nIHRvIGRpc2FibGUgaXQtLUlhbiBUYXlsb3IgMjAgTWFyY2ggMTk5Ni4gICovCi0KLS8qIElmIC5maWxlLCAudGV4dCwgLmRhdGEsIC5ic3Mgc3ltYm9scyBhcmUgbWlzc2luZywgYWRkIHRoZW0uICAqLwotLyogQEAgU2hvdWxkIHdlIG9ubHkgYmUgYWRkaW5nIG1pc3Npbmcgc3ltYm9scywgb3Igb3ZlcnJpZGluZyB0aGUgYXV4Ci0gICB2YWx1ZXMgZm9yIGV4aXN0aW5nIHNlY3Rpb24gc3ltYm9scz8gICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcHAgPSBhYmZkLT5vdXRzeW1ib2xzOwotICBhc3ltYm9sICoqc3ltcHAyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IG5lZWRfdGV4dCA9IDEsIG5lZWRfZGF0YSA9IDEsIG5lZWRfYnNzID0gMSwgbmVlZF9maWxlID0gMTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltcHBbaV0pOwotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgIGlmIChjc3ltKQotCXsKLQkgIC8qIG9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIGNvZmYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0Ci0JICAgc3ltYm9sICovCi0JICBpZiAoY3N5bS0+bmF0aXZlICYmIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgbmVlZF9maWxlID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgbmFtZSA9IGNzeW0tPnN5bWJvbC5uYW1lOwotCSAgaWYgKCFuYW1lKQotCSAgICBjb250aW51ZTsKLQkgIGlmICghc3RyY21wIChuYW1lLCBfVEVYVCkpCi0JICAgIG5lZWRfdGV4dCA9IDA7Ci0jaWZkZWYgQVBPTExPX002OAotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi53dGV4dCIpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2VuZGlmCi0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfREFUQSkpCi0JICAgIG5lZWRfZGF0YSA9IDA7Ci0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfQlNTKSkKLQkgICAgbmVlZF9ic3MgPSAwOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBpID09IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpLiAgKi8KLSAgLyogQEAgRm9yIG5vdywgZG9uJ3QgZGVhbCB3aXRoIC5maWxlIHN5bWJvbC4gICovCi0gIG5lZWRfZmlsZSA9IDA7Ci0KLSAgaWYgKCFuZWVkX3RleHQgJiYgIW5lZWRfZGF0YSAmJiAhbmVlZF9ic3MgJiYgIW5lZWRfZmlsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgbnN5bXMgKz0gbmVlZF90ZXh0ICsgbmVlZF9kYXRhICsgbmVlZF9ic3MgKyBuZWVkX2ZpbGU7Ci0gIHN5bXBwMiA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKCFzeW1wcDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHN5bXBwMiwgc3ltcHAsIGkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAobmVlZF9maWxlKQotICAgIHsKLSAgICAgIC8qIEBAIEdlbmVyYXRlIGZha2UgLmZpbGUgc3ltYm9sLCBpbiBzeW1wcDJbaV0sIGFuZCBpbmNyZW1lbnQgaS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChuZWVkX3RleHQpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfVEVYVCk7Ci0gIGlmIChuZWVkX2RhdGEpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfREFUQSk7Ci0gIGlmIChuZWVkX2JzcykKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9CU1MpOwotICBCRkRfQVNTRVJUIChpID09IG5zeW1zKTsKLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXBwMiwgbnN5bXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogU1VQUFJFU1MgNTU4ICovCi0vKiBTVVBQUkVTUyA1MjkgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGJvb2xlYW4gaGFzcmVsb2NzID0gZmFsc2U7Ci0gIGJvb2xlYW4gaGFzbGlubm8gPSBmYWxzZTsKLSAgYm9vbGVhbiBoYXNkZWJ1ZyA9IGZhbHNlOwotICBmaWxlX3B0ciBzY25fYmFzZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgZmlsZV9wdHIgbGluZW5vX2Jhc2U7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIGxubm9fc2l6ZSA9IDA7Ci0gIGJvb2xlYW4gbG9uZ19zZWN0aW9uX25hbWVzOwotICBhc2VjdGlvbiAqdGV4dF9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqZGF0YV9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqYnNzX3NlYyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgc2l6ZV90IHN0cmluZ19zaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogTWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGNvdW50IGxpbmUgbnVtYmVyIGVudHJpZXMgYW5kCi0gICAgIHB1dCB0aGVtIGludG8gdGhlIGNvcnJlY3QgYXNlY3Rpb25zICovCi0KLSAgbG5ub19zaXplID0gY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbG9jX2Jhc2UgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgYW5kIGxpbm5vIGFyZWFzICovCi0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9Ci0gICAgICAgY3VycmVudC0+bmV4dCkKLSAgICByZWxvY19zaXplICs9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotCi0gIGxpbmVub19iYXNlID0gcmVsb2NfYmFzZSArIHJlbG9jX3NpemU7Ci0gIHN5bV9iYXNlID0gbGluZW5vX2Jhc2UgKyBsbm5vX3NpemU7Ci0KLSAgLyogSW5kaWNhdGUgaW4gZWFjaCBzZWN0aW9uLT5saW5lX2ZpbGVwb3MgaXRzIGFjdHVhbCBmaWxlIGFkZHJlc3MgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9Ci0gICAgICAgY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+bGluZW5vX2NvdW50KQotCXsKLQkgIGN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGxpbmVub19iYXNlOwotCSAgY3VycmVudC0+bW92aW5nX2xpbmVfZmlsZXBvcyA9IGxpbmVub19iYXNlOwotCSAgbGluZW5vX2Jhc2UgKz0gY3VycmVudC0+bGluZW5vX2NvdW50ICogYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gMDsKLQl9Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQpCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsb2NfYmFzZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgc2VjdGlvbiBoZWFkZXJzIHRvIHRoZSBmaWxlLiAgKi8KLSAgaW50ZXJuYWxfZi5mX25zY25zID0gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotICAgIHNjbl9iYXNlID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKSArIGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzY25fYmFzZSA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLQlzY25fYmFzZSArPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgICAgZWxzZQotCXNjbl9iYXNlICs9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNjbl9iYXNlLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbG9uZ19zZWN0aW9uX25hbWVzID0gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNlY3Rpb247Ci0gICAgICBib29sZWFuIGlzX3JlbG9jX3NlY3Rpb24gPSBmYWxzZTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgIi5yZWxvYyIpID09IDApCi0JewotCSAgaXNfcmVsb2Nfc2VjdGlvbiA9IHRydWU7Ci0JICBoYXNyZWxvY3MgPSB0cnVlOwotCSAgcGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0KLSAgICAgIHN0cm5jcHkgKHNlY3Rpb24uc19uYW1lLCBjdXJyZW50LT5uYW1lLCBTQ05OTUxFTik7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAgICAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBpbiBQRS4gIFRoaXMgbXVzdCBiZSBjb21wYXRpYmxlCi0gICAgICAgICB3aXRoIHRoZSBjb2RlIGluIGNvZmZfd3JpdGVfc3ltYm9scyBhbmQgX2JmZF9jb2ZmX2ZpbmFsX2xpbmsuICAqLwotICAgICAgewotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBzdHJsZW4gKGN1cnJlbnQtPm5hbWUpOwotCWlmIChsZW4gPiBTQ05OTUxFTikKLQkgIHsKLQkgICAgbWVtc2V0IChzZWN0aW9uLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICBzcHJpbnRmIChzZWN0aW9uLnNfbmFtZSwgIi8lbHUiLCAodW5zaWduZWQgbG9uZykgc3RyaW5nX3NpemUpOwotCSAgICBzdHJpbmdfc2l6ZSArPSBsZW4gKyAxOwotCSAgICBsb25nX3NlY3Rpb25fbmFtZXMgPSB0cnVlOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBBbHdheXMgc2V0IHNfdmFkZHIgb2YgLmxpYiB0byAwLiAgVGhpcyBpcyByaWdodCBmb3IgU1ZSMy4yCi0JIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHNlY3Rpb24uc192YWRkciA9IGN1cnJlbnQtPnZtYTsKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKLSAgICAgIHNlY3Rpb24uc19zaXplID0gIGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSNpZmRlZiBjb2ZmX2dldF9zZWN0aW9uX2xvYWRfcGFnZQotICAgICAgc2VjdGlvbi5zX3BhZ2UgPSBjb2ZmX2dldF9zZWN0aW9uX2xvYWRfcGFnZSAoY3VycmVudCk7IAotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFJlbWluZGVyOiBzX3BhZGRyIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMCi0JICAmJiBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMKQotCXNlY3Rpb24uc19wYWRkciA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemU7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotCi0gICAgICAvKgotCSBJZiB0aGlzIHNlY3Rpb24gaGFzIG5vIHNpemUgb3IgaXMgdW5sb2FkYWJsZSB0aGVuIHRoZSBzY25wdHIKLQkgd2lsbCBiZSAwIHRvbwotCSAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwIHx8Ci0JICAoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKSkgPT0gMCkKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0JfQotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogSW4gUEVJLCByZWxvY3MgY29tZSBpbiB0aGUgLnJlbG9jIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ICE9IDApCi0JaGFzcmVsb2NzID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCAhPSAwKQotCWhhc2xpbm5vID0gdHJ1ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JICAmJiAhIGlzX3JlbG9jX3NlY3Rpb24pCi0JaGFzZGVidWcgPSB0cnVlOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DIAotI2lmbmRlZiBYQ09GRjY0Ci0gICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOwotCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOwotCX0KLSNlbmRpZgotI2VuZGlmCi0KLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IHNlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLCBjdXJyZW50LT5mbGFncyk7Ci0KLSAgICAgIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfVEVYVCkpCi0JewotCSAgdGV4dF9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9EQVRBKSkKLQl7Ci0JICBkYXRhX3NlYyA9IGN1cnJlbnQ7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0JTUykpCi0JewotCSAgYnNzX3NlYyA9IGN1cnJlbnQ7Ci0JfQotCi0jaWZkZWYgSTk2MAotICAgICAgc2VjdGlvbi5zX2FsaWduID0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcgotCQkJID8gMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA6IDApOwotI2VuZGlmCi0jaWZkZWYgVElDODBDT0ZGIAotICAgICAgLyogVEkgQ09GRiBwdXRzIHRoZSBhbGlnbm1lbnQgcG93ZXIgaW4gYml0cyA4LTExIG9mIHRoZSBmbGFncyAqLwotICAgICAgc2VjdGlvbi5zX2ZsYWdzIHw9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIgJiAweEYpIDw8IDg7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0VOQ09ERV9BTElHTk1FTlQKLSAgICAgIENPRkZfRU5DT0RFX0FMSUdOTUVOVChzZWN0aW9uLCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIpOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkCi0JIGluY2x1ZGVzIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplCi0JIGFzc2lnbmVkIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24KLQkgaGVhZGVycyBhcmUgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdAotCSBuZWVkZWQuICBTZWUgYWxzbyBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gICAgICBpZiAoc2VjdGlvbi5zX3NpemUgPT0gMCkKLQlpbnRlcm5hbF9mLmZfbnNjbnMtLTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIFNDTkhEUiBidWZmOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2VjdGlvbiwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICgmYnVmZiksIDEsIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCksIGFiZmQpCi0JICAgICAgICAgICAhPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBQRSBzdG9yZXMgQ09NREFUIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICB0aGlzIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBzb21lIENPTURBVCBpbmZvLCB0cmFjayBkb3duCi0gICAgICAgICB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vZGlmeSBpdC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaSwgY291bnQ7Ci0JICBhc3ltYm9sICoqcHN5bTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBOVUxMOwotCSAgYXN5bWJvbCAqKnBzeW1zZWM7Ci0KLQkgIHBzeW1zZWMgPSBOVUxMOwotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoaSA9IDAsIHBzeW0gPSBhYmZkLT5vdXRzeW1ib2xzOyBpIDwgY291bnQ7IGkrKywgcHN5bSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN5bSktPnNlY3Rpb24gIT0gY3VycmVudCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChwc3ltc2VjID09IE5VTEwpCi0JCXBzeW1zZWMgPSBwc3ltOwotCi0JICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc3RyY21wICgoKnBzeW0pLT5uYW1lLCBjdXJyZW50LT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpwc3ltKTsKLQkJICBpZiAoY3N5bSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPCAxCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19TVEFUCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogSGVyZSAqUFNZTSBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIENVUlJFTlQuICAqLwotCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEaWQgd2UgZmluZCBpdD8KLQkgICAgIE5vdGUgdGhhdCB3ZSBtaWdodCBub3QgaWYgd2UncmUgY29udmVydGluZyB0aGUgZmlsZSBmcm9tCi0JICAgICBzb21lIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0JICBpZiAoaSA8IGNvdW50KQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotCi0JICAgICAgLyogV2UgZG9uJ3QgdG91Y2ggdGhlIHhfY2hlY2tzdW0gZmllbGQuICBUaGUKLQkJIHhfYXNzb2NpYXRlZCBmaWVsZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gICovCi0KLQkgICAgICBhdXggPSBjc3ltLT5uYXRpdmUgKyAxOwotCSAgICAgIHN3aXRjaCAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQotCQl7Ci0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgQ09NREFUIHN5bWJvbCBtdXN0IGJlIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICB3b3JrLCB3ZSBtb3ZlIHRoZSBDT01EQVQgc3ltYm9sIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgc3ltYm9sIHdlIGZvdW5kIGluIHRoZSBzZWFyY2ggYWJvdmUuICBJdCdzIE9LIHRvCi0gICAgICAgICAgICAgICAgIHJlYXJyYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgY29mZl9yZW51bWJlcl9zeW1ib2xzIGlzIGdvaW5nIHRvIHJlYXJyYW5nZSBpdAotICAgICAgICAgICAgICAgICBmdXJ0aGVyIGFuZCBmaXggdXAgYWxsIHRoZSBhdXggZW50cmllcy4gICovCi0JICAgICAgaWYgKHBzeW0gIT0gcHN5bXNlYykKLQkJewotCQkgIGFzeW1ib2wgKmhvbGQ7Ci0JCSAgYXN5bWJvbCAqKnBjb3B5OwotCi0JCSAgaG9sZCA9ICpwc3ltOwotCQkgIGZvciAocGNvcHkgPSBwc3ltOyBwY29weSA+IHBzeW1zZWM7IHBjb3B5LS0pCi0JCSAgICBwY29weVswXSA9IHBjb3B5Wy0xXTsKLQkJICAqcHN5bXNlYyA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLSAgICB9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0JICBTQ05IRFIgYnVmZjsKLQotCSAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0JICBzdHJuY3B5ICgmKHNjbmhkci5zX25hbWVbMF0pLCBjdXJyZW50LT5uYW1lLCA4KTsKLQkgIHNjbmhkci5zX3BhZGRyID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBzY25oZHIuc192YWRkciA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLQkgIHNjbmhkci5zX3NpemUgPSAwOwotCSAgc2NuaGRyLnNfc2NucHRyID0gMDsKLQkgIHNjbmhkci5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCSAgc2NuaGRyLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLQkgIHNjbmhkci5zX25yZWxvYyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX25sbm5vID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX09WUkZMTzsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNjbmhkciwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBiZmRfY29mZl9zY25oc3ogKGFiZmQpLCBhYmZkKQotCSAgICAgICAgICAgIT0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAvKiBPSywgbm93IHNldCB1cCB0aGUgZmlsZWhkci4uLiAqLwotCi0gIC8qIERvbid0IGluY2x1ZGUgdGhlIGludGVybmFsIGFicyBzZWN0aW9uIGluIHRoZSBzZWN0aW9uIGNvdW50ICovCi0KLSAgLyoKLSAgICAgV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeSB0aW1lIHlvdQotICAgICBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtIHNvcnJ5LiAgVGhpcwotICAgICBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28gaXQgY29tcGFyZXMgdGhlCi0gICAgIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0gZ251QGN5Z251cy5jb20KLSAgICAgKi8KLSAgaW50ZXJuYWxfZi5mX3RpbWRhdCA9IDA7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gMDsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gMDsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgICAgZWxzZQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFoYXNyZWxvY3MpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfUkVMRkxHOwotICBpZiAoIWhhc2xpbm5vKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xOTk87Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBpZiAoISBoYXNkZWJ1ZykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRDsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotI2VuZGlmCi0KLSNpZmRlZiBUSV9UQVJHRVRfSUQKLSAgLyogdGFyZ2V0IGlkIGlzIHVzZWQgaW4gVEkgQ09GRiB2MSBhbmQgbGF0ZXI7IENPRkYwIHdvbid0IHVzZSB0aGlzIGZpZWxkLAotICAgICBidXQgaXQgZG9lc24ndCBodXJ0IHRvIHNldCBpdCBpbnRlcm5hbGx5ICovCi0gIGludGVybmFsX2YuZl90YXJnZXRfaWQgPSBUSV9UQVJHRVRfSUQ7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgaW50ZXJuYWxfZi5mX3RhcmdldF9pZCA9IFRJQzgwX1RBUkdFVF9JRDsKLSNlbmRpZgotCi0gIC8qCi0gICAgIEZJWE1FLCBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IHRoZSBvdGhlciBieXRlIG9yZGVycyBhbmQKLSAgICAgYXJjaGl0ZWN0dXJlcy4KLSAgICAgKi8KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9TSFJPQko7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX0xPQURFUikgIT0gTlVMTCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9EWU5MT0FEOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgmaW50ZXJuYWxfYSwgMCwgc2l6ZW9mIGludGVybmFsX2EpOwotCi0gIC8qIFNldCB1cCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHN0dWZmICovCi0KLSAgewotICAgIHVuc2lnbmVkIGludCBtYWdpYyA9IDA7Ci0gICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSAwOwotICAgIGNvZmZfc2V0X2ZsYWdzIChhYmZkLCAmbWFnaWMsICZmbGFncyk7Ci0gICAgaW50ZXJuYWxfZi5mX21hZ2ljID0gbWFnaWM7Ci0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IGZsYWdzOwotICAgIC8qIC4uLmFuZCB0aGUgIm9wdCJoZHIuLi4gKi8KLQotI2lmZGVmIEEyOUsKLSNpZmRlZiBVTFRSQTMJCQkvKiBOWVUncyBtYWNoaW5lICovCi0gICAgLyogRklYTUU6IFRoaXMgaXMgYSBib2d1cyBjaGVjay4gIEkgcmVhbGx5IHdhbnQgdG8gc2VlIGlmIHRoZXJlCi0gICAgICogaXMgYSAuc2hic3Mgb3IgYSAuc2hkYXRhIHNlY3Rpb24sIGlmIHNvIHRoZW4gc2V0IHRoZSBtYWdpYwotICAgICAqIG51bWJlciB0byBpbmRpY2F0ZSBhIHNoYXJlZCBkYXRhIGV4ZWN1dGFibGUuCi0gICAgICovCi0gICAgaWYgKGludGVybmFsX2YuZl9uc2NucyA+PSA3KQotICAgICAgaW50ZXJuYWxfYS5tYWdpYyA9IFNITUFHSUM7IC8qIFNoYXJlZCBtYWdpYyAqLwotICAgIGVsc2UKLSNlbmRpZiAvKiBVTFRSQTMgKi8KLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBOTUFHSUM7IC8qIEFzc3VtZSBzZXBhcmF0ZSBpL2QgKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogQTI5SyAqLwotI2lmZGVmIFRJQ09GRl9BT1VUX01BR0lDCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFRJQ09GRl9BT1VUX01BR0lDOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotICAgIGludGVybmFsX2EubWFnaWMgPSBUSUM4MF9BUkNIX01BR0lDOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBUSUM4MCAqLwotI2lmZGVmIEk4NjAKLSAgICAvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnMgZm9yIHRoZSBpODYwPyAgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gMDsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTg2MCAqLwotI2lmZGVmIEk5NjAKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKG1hZ2ljID09IEk5NjBST01BR0lDID8gTk1BR0lDIDogT01BR0lDKTsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTk2MCAqLwotI2lmIE04OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDQkNTOwotI2VuZGlmIC8qIE04OCAqLwotCi0jaWYgQVBPTExPX002OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTTY4KSB8fCBkZWZpbmVkKFdFMzJLKSB8fCBkZWZpbmVkKE02OEspCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2Vsc2UKLSNpZiBkZWZpbmVkKFRBUkdfQVVYKQotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEID8gUEFHRU1BR0lDUEVYRUNQQUdFRCA6Ci0JCQlhYmZkLT5mbGFncyAmIFdQX1RFWFQgPyBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgOgotCQkJUEFHRU1BR0lDRVhFQ1NXQVBQRUQpOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChQQUdFTUFHSUNQRVhFQ1BBR0VEKQotICAgIGludGVybmFsX2EubWFnaWMgPSBQQUdFTUFHSUNQRVhFQ1BBR0VEOwotI2VuZGlmCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBNNjggfHwgV0UzMksgfHwgTTY4SyAqLwotCi0jaWYgZGVmaW5lZChBUk0pCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBaTUFHSUM7Ci0jZW5kaWYgCi0KLSNpZiBkZWZpbmVkKFBQQ19QRSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBNQ09SRV9QRQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChJMzg2KQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlICAvKiBMWU5YT1MgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIEkzODYgKi8KLQotI2lmIGRlZmluZWQoSUE2NCkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFpNQUdJQzsKLSNlbmRpZiAvKiBJQTY0ICovCi0KLSNpZiBkZWZpbmVkKFNQQVJDKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBTUEFSQyAqLwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA/IFJTNktfQU9VVEhEUl9aTUFHSUMgOgotICAgIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpID8gUlM2S19BT1VUSERSX05NQUdJQyA6Ci0gICAgUlM2S19BT1VUSERSX09NQUdJQzsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTSCkgJiYgZGVmaW5lZChDT0ZGX1dJVEhfUEUpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBTSF9QRV9NQUdJQzsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNSVBTKSAmJiBkZWZpbmVkKENPRkZfV0lUSF9QRSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IE1JUFNfUEVfTUFHSUM7Ci0jZW5kaWYKLQotI2lmbmRlZiBfX0FfTUFHSUNfU0VUX18KLSNpbmNsdWRlICJZb3VyIGFvdXRoZHIgbWFnaWMgbnVtYmVyIGlzIG5vdCBiZWluZyBzZXQhIgotI2Vsc2UKLSN1bmRlZiBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZgotICB9Ci0KLSAgLyogRklYTUU6IERvZXMgYW55Ym9keSBldmVyIHNldCB0aGlzIHRvIGFub3RoZXIgdmFsdWU/ICAqLwotICBpbnRlcm5hbF9hLnZzdGFtcCA9IDA7Ci0KLSAgLyogTm93IHNob3VsZCB3cml0ZSByZWxvY3MsIHN0cmluZ3MsIHN5bXMgKi8KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IHN5bV9iYXNlOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBmaXJzdHVuZGVmOwotI2lmIDAKLSAgICAgIGlmICghY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgICAgIGlmICghY29mZl9yZW51bWJlcl9zeW1ib2xzIChhYmZkLCAmZmlyc3R1bmRlZikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgY29mZl9tYW5nbGVfc3ltYm9scyAoYWJmZCk7Ci0gICAgICBpZiAoISBjb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGVsc2UgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGxvbmcgc2VjdGlvbiBuYW1lcyB3ZSBoYXZlIHRvIHdyaXRlIG91dCB0aGUgc3RyaW5nCi0gICAgICAgICB0YWJsZSBldmVuIGlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotI2lmZGVmIFBQQ19QRQotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgLyogUG93ZXJQQyBQRSBhcHBlYXJzIHRvIHJlcXVpcmUgdGhhdCBhbGwgZXhlY3V0YWJsZSBmaWxlcyBiZQotICAgICAgICAgcm91bmRlZCB1cCB0byB0aGUgcGFnZSBzaXplLiAgKi8KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgQkZEX0FMSUdOIChzeW1fYmFzZSwgQ09GRl9QQUdFX1NJWkUpIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIC8qIElmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDAsIHRoZW4gd2UgYXJlIG5vdCB1c2luZyB0aGUgQ09GRgotICAgICBiYWNrZW5kIGxpbmtlciwgYW5kIG9ial9yYXdfc3ltZW50X2NvdW50IGlzIG5vdCB2YWxpZCB1bnRpbCBhZnRlcgotICAgICBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBzeW1fYmFzZTsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIC8qIEFJWCBhcHBlYXJzIHRvIHJlcXVpcmUgdGhhdCBGX1JFTEZMRyBub3QgYmUgc2V0IGlmIHRoZXJlIGFyZQotICAgICAgICAgbG9jYWwgc3ltYm9scyBidXQgbm8gcmVsb2NhdGlvbnMuICAqLwotICAgICAgaW50ZXJuYWxfZi5mX2ZsYWdzICY9fiBGX1JFTEZMRzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsb25nX3NlY3Rpb25fbmFtZXMpCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotICAgICAgZWxzZQotCWludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gICAgfQotCi0gIGlmICh0ZXh0X3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLnRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jICh0ZXh0X3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSBpbnRlcm5hbF9hLnRzaXplID8gdGV4dF9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoZGF0YV9zZWMpCi0gICAgewotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gaW50ZXJuYWxfYS5kc2l6ZSA/IGRhdGFfc2VjLT52bWEgOiAwOwotICAgIH0KLSAgaWYgKGJzc19zZWMpCi0gICAgewotICAgICAgaW50ZXJuYWxfYS5ic2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoYnNzX3NlYyk7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS5ic2l6ZSAmJiBic3Nfc2VjLT52bWEgPCBpbnRlcm5hbF9hLmRhdGFfc3RhcnQpCi0JaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gYnNzX3NlYy0+dm1hOwotICAgIH0KLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgaW50ZXJuYWxfZi5mX25zeW1zID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHsKLSAgICAgIGJmZF92bWEgdG9jOwotICAgICAgYXNlY3Rpb24gKmxvYWRlcl9zZWM7Ci0KLSAgICAgIGludGVybmFsX2EudnN0YW1wID0gMTsKLQotICAgICAgaW50ZXJuYWxfYS5vX3NuZW50cnkgPSB4Y29mZl9kYXRhIChhYmZkKS0+c25lbnRyeTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLm9fc25lbnRyeSA9PSAwKQotCWludGVybmFsX2EuZW50cnkgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIGlmICh0ZXh0X3NlYyAhPSBOVUxMKQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSB0ZXh0X3NlYy0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgdGV4dF9zZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc250ZXh0ID0gMDsKLQkgIGludGVybmFsX2Eub19hbGdudGV4dCA9IDA7Ci0JfQotICAgICAgaWYgKGRhdGFfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IGRhdGFfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBkYXRhX3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbmRhdGEgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ25kYXRhID0gMDsKLQl9Ci0gICAgICBsb2FkZXJfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gICAgICBpZiAobG9hZGVyX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IGxvYWRlcl9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25sb2FkZXIgPSAwOwotICAgICAgaWYgKGJzc19zZWMgIT0gTlVMTCkKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSBic3Nfc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfYS5vX3NuYnNzID0gMDsKLQotICAgICAgdG9jID0geGNvZmZfZGF0YSAoYWJmZCktPnRvYzsKLSAgICAgIGludGVybmFsX2Eub190b2MgPSB0b2M7Ci0gICAgICBpbnRlcm5hbF9hLm9fc250b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+c250b2M7Ci0KLSAgICAgIGludGVybmFsX2Eub19tb2R0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPm1vZHR5cGU7Ci0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgIT0gLTEpCi0JaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0JICAgICAgaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0JICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gMCkKLQkJaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSAzOwotCSAgICAgIGVsc2UKLQkJaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgaW50ZXJuYWxfYS5vX21heHN0YWNrID0geGNvZmZfZGF0YSAoYWJmZCktPm1heHN0YWNrOwotICAgICAgaW50ZXJuYWxfYS5vX21heGRhdGEgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4ZGF0YTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBub3cgd3JpdGUgdGhlbSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgewotICAgIGNoYXIgKiBidWZmOwotICAgIGJmZF9zaXplX3R5cGUgYW1vdW50OwotICAgIAotICAgIGJ1ZmYgPSBiZmRfbWFsbG9jIChiZmRfY29mZl9maWxoc3ogKGFiZmQpKTsKLSAgICBpZiAoYnVmZiA9PSBOVUxMKSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfZiwgKFBUUikgYnVmZik7Ci0gICAgYW1vdW50ID0gYmZkX3dyaXRlICgoUFRSKSBidWZmLCAxLCBiZmRfY29mZl9maWxoc3ogKGFiZmQpLCBhYmZkKTsKLSAgICAKLSAgICBmcmVlIChidWZmKTsKLSAgICAKLSAgICBpZiAoYW1vdW50ICE9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgcGVpY29kZS5oIGZpbGxzIGluIGEgUEVBT1VUSERSLCBub3QgYW4gQU9VVEhEUi4gCi0JIGluY2x1ZGUvY29mZi9wZS5oIHNldHMgQU9VVFNaID09IHNpemVvZihQRUFPVVRIRFIpKSAqLwotICAgICAgY2hhciAqIGJ1ZmY7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGFtb3VudDsKLQotICAgICAgYnVmZiA9IGJmZF9tYWxsb2MgKGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCkpOwotICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfYSwgKFBUUikgYnVmZik7Ci0gICAgICBhbW91bnQgPSBiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCksIGFiZmQpOwotICAgICAgCi0gICAgICBmcmVlIChidWZmKTsKLSAgICAgIAotICAgICAgaWYgKGFtb3VudCAhPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UKLSAgICB7Ci0gICAgICBBT1VUSERSIGJ1ZmY7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgLyogWENPRkYgc2VlbXMgdG8gYWx3YXlzIHdyaXRlIGF0IGxlYXN0IGEgc21hbGwgYS5vdXQgaGVhZGVyLiAgKi8KLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIChQVFIpICZidWZmKTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNpemUgPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgICAgZWxzZQotCXNpemUgPSBTTUFMTF9BT1VUU1o7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYnVmZiwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgewotICAgICAgaWYgKCEgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9MSUIpICYmICFkZWZpbmVkKFRBUkdfQVVYKQotCi0gICAvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBmaWVsZCBvZiBhIC5saWIgc2VjdGlvbiBpcyB1c2VkIHRvIGhvbGQgdGhlCi0gICAgICBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyBpbiB0aGUgc2VjdGlvbi4gIFRoaXMgY29kZSBjb3VudHMgdGhlCi0gICAgICBudW1iZXIgb2Ygc2VjdGlvbnMgYmVpbmcgd3JpdHRlbiwgYW5kIGluY3JlbWVudHMgdGhlIGxtYSBmaWVsZAotICAgICAgd2l0aCB0aGUgbnVtYmVyLgotCi0gICAgICBJIGhhdmUgZm91bmQgbm8gZG9jdW1lbnRhdGlvbiBvbiB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLgotICAgICAgRXhwZXJpbWVudGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHplcm8gb3IgbW9yZQotICAgICAgcmVjb3JkcywgZWFjaCBvZiB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0KLSAgICAgIC0gYSAoZm91ciBieXRlKSB3b3JkIGhvbGRpbmcgdGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZCwgaW4gd29yZHMsCi0gICAgICAtIGEgd29yZCB0aGF0IGFsd2F5cyBzZWVtcyB0byBiZSBzZXQgdG8gIjIiLAotICAgICAgLSB0aGUgcGF0aCB0byBhIHNoYXJlZCBsaWJyYXJ5LCBudWxsLXRlcm1pbmF0ZWQgYW5kIHRoZW4gcGFkZGVkCi0gICAgICAgIHRvIGEgd2hvbGUgd29yZCBib3VuZGFyeS4KLQotICAgICAgYmZkX2Fzc2VydCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgdG8gYWxlcnQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gICAgICB0byB3cml0ZSBhIHNlY3Rpb24gd2hpY2ggZG9lc24ndCBmb2xsb3cgdGhlc2UgYXNzdW1wdGlvbnMuICBUaGUKLSAgICAgIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIElTQyA0LjEgYnkgbWUsIGFuZCBvbiBTQ08gYnkgUm9iZXJ0IExpcGUKLSAgICAgIDxyb2JlcnRsQGFybmV0LmNvbT4gKFRoYW5rcyEpLgotICAKLSAgICAgIEd2cmFuIFVkZGVib3JnIDxndnJhbkB1ZGRlYm9yZy5wcC5zZT4gKi8KLQotICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSUIpID09IDApCi0gICAgICB7Ci0JYmZkX2J5dGUgKnJlYywgKnJlY2VuZDsKLQotCXJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKLQlyZWNlbmQgPSByZWMgKyBjb3VudDsKLQl3aGlsZSAocmVjIDwgcmVjZW5kKQotCSAgewotCSAgICArK3NlY3Rpb24tPmxtYTsKLQkgICAgcmVjICs9IGJmZF9nZXRfMzIgKGFiZmQsIHJlYykgKiA0OwotCSAgfQotCi0JQkZEX0FTU0VSVCAocmVjID09IHJlY2VuZCk7Ci0gICAgICB9Ci0KLSNlbmRpZgotCi0gIC8qIERvbid0IHdyaXRlIG91dCBic3Mgc2VjdGlvbnMgLSBvbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8KLSAgICAgICBzZWUgaWYgdGhlIGZpbGVwb3MgaGFzIG5vdCBiZWVuIHNldC4gKi8KLSAgaWYgKHNlY3Rpb24tPmZpbGVwb3MgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jaWYgMAotc3RhdGljIGJvb2xlYW4KLWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFiZmRfcmVhZF9wIChhYmZkKSkKLSAgICBzd2l0Y2ggKGFiZmQtPmZvcm1hdCkKLSAgICAgIHsKLSAgICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0JaWYgKCFfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfb2JqZWN0OgotCWlmICghY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAvKiBXZSBkZXBlbmQgb24gYmZkX2Nsb3NlIHRvIGZyZWUgYWxsIHRoZSBtZW1vcnkgb24gdGhlIG9iamFsbG9jLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgUFRSCi1idXlfYW5kX3JlYWQgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbiwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLSAgICAgaW50IHNlZWtfZGlyZWN0aW9uOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIGFyZWEgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoIWFyZWEpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgc2Vla19kaXJlY3Rpb24pICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChhcmVhLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHJldHVybiAoYXJlYSk7Ci19CQkJCS8qIGJ1eV9hbmRfcmVhZCgpICovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyBsaW5lbnVtYmVycwotCi0JQ3JlYXRpbmcgdGhlIGxpbmVudW1iZXIgdGFibGUgaXMgZG9uZSBieSByZWFkaW5nIGluIHRoZSBlbnRpcmUKLQljb2ZmIGxpbmVudW1iZXIgdGFibGUsIGFuZCBjcmVhdGluZyBhbm90aGVyIHRhYmxlIGZvciBpbnRlcm5hbCB1c2UuCi0KLQlBIGNvZmYgbGluZW51bWJlciB0YWJsZSBpcyBzdHJ1Y3R1cmVkIHNvIHRoYXQgZWFjaCBmdW5jdGlvbgotCWlzIG1hcmtlZCBhcyBoYXZpbmcgYSBsaW5lIG51bWJlciBvZiAwLiBFYWNoIGxpbmUgd2l0aGluIHRoZQotCWZ1bmN0aW9uIGlzIGFuIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmdW5jdGlvbi4gVGhlCi0JYmFzZSBvZiB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB0YWJsZSBpcyBzdG9yZWQgaW4KLQl0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCi0KLQlOb3RlOiBUaGUgUEUgZm9ybWF0IHVzZXMgbGluZSBudW1iZXIgMCBmb3IgYSBmbGFnIGluZGljYXRpbmcgYQotCW5ldyBzb3VyY2UgZmlsZS4KLQotCVRoZSBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgZXh0ZXJuYWwgdG8gdGhlIGludGVybmFsCi0JdGFibGUsIGFuZCBlYWNoIHN5bWJvbCB3aGljaCBtYXJrcyBhIGZ1bmN0aW9uIGlzIG1hcmtlZCBieQotCXBvaW50aW5nIGl0cy4uLgotCi0JSG93IGRvZXMgdGhpcyB3b3JrID8KLQotKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotewotICBMSU5FTk8gKm5hdGl2ZV9saW5lbm87Ci0gIGFsZW50ICpsaW5lbm9fY2FjaGU7Ci0KLSAgQkZEX0FTU0VSVCAoYXNlY3QtPmxpbmVubyA9PSAoYWxlbnQgKikgTlVMTCk7Ci0KLSAgbmF0aXZlX2xpbmVubyA9IChMSU5FTk8gKikgYnV5X2FuZF9yZWFkIChhYmZkLAotCQkJCQkgICBhc2VjdC0+bGluZV9maWxlcG9zLAotCQkJCQkgICBTRUVLX1NFVCwKLQkJCQkJICAgKHNpemVfdCkgKGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkgKgotCQkJCQkJICAgICBhc2VjdC0+bGluZW5vX2NvdW50KSk7Ci0gIGxpbmVub19jYWNoZSA9Ci0gICAgKGFsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgKHNpemVfdCkgKChhc2VjdC0+bGluZW5vX2NvdW50ICsgMSkgKiBzaXplb2YgKGFsZW50KSkpOwotICBpZiAobGluZW5vX2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYWxlbnQgKmNhY2hlX3B0ciA9IGxpbmVub19jYWNoZTsKLSAgICAgIExJTkVOTyAqc3JjID0gbmF0aXZlX2xpbmVubzsKLQotICAgICAgd2hpbGUgKGNvdW50ZXIgPCBhc2VjdC0+bGluZW5vX2NvdW50KQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gZHN0OwotCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0JICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gZHN0LmxfbG5ubzsKLQotCSAgaWYgKGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gd2FybmVkOwotCSAgICAgIGxvbmcgc3ltbmR4OwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bTsKLQotCSAgICAgIHdhcm5lZCA9IGZhbHNlOwotCSAgICAgIHN5bW5keCA9IGRzdC5sX2FkZHIubF9zeW1uZHg7Ci0JICAgICAgaWYgKHN5bW5keCA8IDAKLQkJICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5sX2FkZHIubF9zeW1uZHgpOwotCQkgIHN5bW5keCA9IDA7Ci0JCSAgd2FybmVkID0gdHJ1ZTsKLQkJfQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhc3RpbmcgYmV0d2VlbiBpbnRzIGFuZAotICAgICAgICAgICAgICAgICBwb2ludGVycyBsaWtlIHRoaXMuICAqLwotCSAgICAgIHN5bSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQotCQkgICAgICgoc3ltbmR4ICsgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSkKLQkJICAgICAgLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcykpOwotCSAgICAgIGNhY2hlX3B0ci0+dS5zeW0gPSAoYXN5bWJvbCAqKSBzeW07Ci0JICAgICAgaWYgKHN5bS0+bGluZW5vICE9IE5VTEwgJiYgISB3YXJuZWQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgYmZkX2FzeW1ib2xfbmFtZSAoJnN5bS0+c3ltYm9sKSk7Ci0JCX0KLQkgICAgICBzeW0tPmxpbmVubyA9IGNhY2hlX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT51Lm9mZnNldCA9IGRzdC5sX2FkZHIubF9wYWRkcgotCQktIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOwotCSAgICB9CQkJLyogSWYgbm8gbGluZW51bWJlciBleHBlY3QgYSBzeW1ib2wgaW5kZXggKi8KLQotCSAgY2FjaGVfcHRyKys7Ci0JICBzcmMrKzsKLQkgIGNvdW50ZXIrKzsKLQl9Ci0gICAgICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gMDsKLQotICAgIH0KLSAgYXNlY3QtPmxpbmVubyA9IGxpbmVub19jYWNoZTsKLSAgLyogRklYTUUsIGZyZWUgbmF0aXZlX2xpbmVubyBoZXJlLCBvciB1c2UgYWxsb2NhIG9yIHNvbWV0aGluZy4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNsdXJwIGluIHRoZSBzeW1ib2wgdGFibGUsIGNvbnZlcnRpbmcgaXQgdG8gZ2VuZXJpYyBmb3JtLiAgTm90ZQotICAgdGhhdCBpZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgdGhlIGxpbmtlciB3aWxsIHJlYWQKLSAgIHN5bWJvbHMgdmlhIGNvZmZfbGlua19hZGRfc3ltYm9scywgcmF0aGVyIHRoYW4gdmlhIHRoaXMgcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlX3N5bWJvbHM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNhY2hlZF9hcmVhOwotICB1bnNpZ25lZCBpbnQgKnRhYmxlX3B0cjsKLQotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3N5bWJvbHMgPSAwOwotCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlICovCi0gIGlmICgobmF0aXZlX3N5bWJvbHMgPSBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQkJCQkvKiBvbiBlcnJvciAqLwotCi0gIC8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gY2FjaGVkIGZvcm0gKi8KLSAgY2FjaGVkX2FyZWEgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JCQkgICAgICogc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSkpKTsKLQotICBpZiAoY2FjaGVkX2FyZWEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlX3B0ciA9ICgodW5zaWduZWQgaW50ICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpKSk7Ci0KLSAgaWYgKHRhYmxlX3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmRzdCA9IGNhY2hlZF9hcmVhOwotICAgICAgdW5zaWduZWQgaW50IGxhc3RfbmF0aXZlX2luZGV4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKHRoaXNfaW5kZXggPCBsYXN0X25hdGl2ZV9pbmRleCkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzcmMgPSBuYXRpdmVfc3ltYm9scyArIHRoaXNfaW5kZXg7Ci0JICB0YWJsZV9wdHJbdGhpc19pbmRleF0gPSBudW1iZXJfb2Zfc3ltYm9sczsKLQkgIGRzdC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0JICBkc3QtPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgKHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgLyogV2UgdXNlIHRoZSBuYXRpdmUgbmFtZSBmaWVsZCB0byBwb2ludCB0byB0aGUgY2FjaGVkIGZpZWxkLiAgKi8KLQkgIHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAobG9uZykgZHN0OwotCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgc3JjLT51LnN5bWVudC5uX3NjbnVtKTsKLQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGRzdC0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLQotCSAgc3dpdGNoIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzKQotCSAgICB7Ci0jaWZkZWYgSTk2MAotCSAgICBjYXNlIENfTEVBRkVYVDoKLSNpZiAwCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLSNlbmRpZgotCSAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UgKi8KLQotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWYgZGVmaW5lZCBBUk0KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVDoKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVEZVTkM6Ci0jZW5kaWYKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0hJREVYVDoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0JICAgIGNhc2UgQ19TWVNURU06CS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICAgICAgIC8qIEluIFBFLCAweDY4ICgxMDQpIGRlbm90ZXMgYSBzZWN0aW9uIHN5bWJvbCAqLwotICAgICAgICAgICAgY2FzZSBDX1NFQ1RJT046Ci0JICAgIC8qIEluIFBFLCAweDY5ICgxMDUpIGRlbm90ZXMgYSB3ZWFrIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0JICAgICAgc3dpdGNoIChjb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnNyYy0+dS5zeW1lbnQpKQotCQl7Ci0JCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQkgIGlmIChJU0ZDTiAoKHNyYy0+dS5zeW1lbnQubl90eXBlKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEEgZnVuY3Rpb24gZXh0IGRvZXMgbm90IGdvIGF0IHRoZSBlbmQgb2YgYQotCQkJIGZpbGUuICAqLwotCQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCSAgYnJlYWs7IAotCi0JCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkJICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfRVhQT1JUIHwgQlNGX1NFQ1RJT05fU1lNOwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJICBpZiAoSVNGQ04gKChzcmMtPnUuc3ltZW50Lm5fdHlwZSkpKQotCQkgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0JCSAgYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICAgIC8qIEEgc3ltYm9sIHdpdGggYSBjc2VjdCBlbnRyeSBzaG91bGQgbm90IGdvIGF0IHRoZSBlbmQuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTlRfV0VBSykKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1NFQ1RJT04KLQkJICAmJiBzcmMtPnUuc3ltZW50Lm5fc2NudW0gPiAwKQotCQl7Ci0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCX0KLSNlbmRpZgotCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX1NUQVQ6CS8qIHN0YXRpYwkJCSAqLwotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgkvKiBzdGF0aWMgbGVhZiBwcm9jZWR1cmUgICAgICAgICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkIEFSTSAKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVQ6ICAgLyogVGh1bWIgc3RhdGljICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkxBQkVMOiAgLyogVGh1bWIgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVRGVU5DOi8qIFRodW1iIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgKi8KLSNlbmRpZgotCSAgICBjYXNlIENfTEFCRUw6CS8qIGxhYmVsCQkJICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY251bSA9PSBOX0RFQlVHKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCSAgICAgIGlmIChkc3QtPnN5bWJvbC5zZWN0aW9uKQotCQl7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTU9TOgkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCSAqLwotCSAgICBjYXNlIENfRU9TOgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkgKi8KLSNpZmRlZiBOT1RERUYJCQkvKiBDX0FVVE9BUkcgaGFzIHRoZSBzYW1lIHZhbHVlICovCi0jaWZkZWYgQ19HTEJMUkVHCi0JICAgIGNhc2UgQ19HTEJMUkVHOgkvKiBBMjlrLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19SRUdQQVJNOgkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSAqLwotCSAgICBjYXNlIENfUkVHOgkvKiByZWdpc3RlciB2YXJpYWJsZQkJICovCi0gICAgICAgICAgICAgIC8qIENfQVVUT0FSRyBjb25mbGljdGVzIHdpdGggVEkgQ09GRiBDX1VFWFQgKi8KLSNpZiAhZGVmaW5lZCAoVElDODBDT0ZGKSAmJiAhZGVmaW5lZCAoVElDT0ZGKQotI2lmZGVmIENfQVVUT0FSRwotCSAgICBjYXNlIENfQVVUT0FSRzoJLyogOTYwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19UUERFRjoJLyogdHlwZSBkZWZpbml0aW9uCQkgKi8KLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX0FVVE86CS8qIGF1dG9tYXRpYyB2YXJpYWJsZSAqLwotCSAgICBjYXNlIENfRklFTEQ6CS8qIGJpdCBmaWVsZCAqLwotCSAgICBjYXNlIENfRU5UQUc6CS8qIGVudW1lcmF0aW9uIHRhZwkJICovCi0JICAgIGNhc2UgQ19NT0U6CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkgKi8KLQkgICAgY2FzZSBDX01PVToJLyogbWVtYmVyIG9mIHVuaW9uCQkgKi8KLQkgICAgY2FzZSBDX1VOVEFHOgkvKiB1bmlvbiB0YWcJCQkgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRklMRToJLyogZmlsZSBuYW1lCQkJICovCi0JICAgIGNhc2UgQ19TVFJUQUc6CS8qIHN0cnVjdHVyZSB0YWcJCSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfR1NZTToKLQkgICAgY2FzZSBDX0xTWU06Ci0JICAgIGNhc2UgQ19QU1lNOgotCSAgICBjYXNlIENfUlNZTToKLQkgICAgY2FzZSBDX1JQU1lNOgotCSAgICBjYXNlIENfU1RTWU06Ci0JICAgIGNhc2UgQ19CQ09NTToKLQkgICAgY2FzZSBDX0VDT01NOgotCSAgICBjYXNlIENfREVDTDoKLQkgICAgY2FzZSBDX0VOVFJZOgotCSAgICBjYXNlIENfRlVOOgotCSAgICBjYXNlIENfRVNUQVQ6Ci0jZW5kaWYKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfQklOQ0w6CS8qIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgICAgICovCi0JICAgIGNhc2UgQ19FSU5DTDoJLyogZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAgICAgICAgKi8KLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBwb2ludGVyIGludG8gdGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIGxvY2F0ZSB0aGUgbGluZSBudW1iZXIgZW50cnksIGFuZAotICAgICAgICAgICAgICAgICBzZXQgdGhlIHNlY3Rpb24gdG8gdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgaXQsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGluIHRoYXQgc2VjdGlvbi4gICovCi0JICAgICAgewotCQlhc2VjdGlvbiAqc2VjOwotCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkJZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkJICBpZiAoc2VjLT5saW5lX2ZpbGVwb3MgPD0gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJICAgICAgJiYgKChmaWxlX3B0cikgKHNlYy0+bGluZV9maWxlcG9zCi0JCQkJICAgICAgKyBzZWMtPmxpbmVub19jb3VudCAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpCi0JCQkgID4gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUpKQotCQkgICAgYnJlYWs7Ci0JCWlmIChzZWMgPT0gTlVMTCkKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gc2VjOwotCQkgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCQkgIC0gc2VjLT5saW5lX2ZpbGVwb3MpCi0JCQkJCSAvIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotCQkgICAgc3JjLT5maXhfbGluZSA9IDE7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfQlNUQVQ6Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0JICAgICAgLyogVGhlIHZhbHVlIGlzIGFjdHVhbGx5IGEgc3ltYm9sIGluZGV4LiAgU2F2ZSBhIHBvaW50ZXIKLQkJIHRvIHRoZSBzeW1ib2wgaW5zdGVhZCBvZiB0aGUgaW5kZXguICBGSVhNRTogVGhpcwotCQkgc2hvdWxkIHVzZSBhIHVuaW9uLiAgKi8KLQkgICAgICBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkobG9uZykgKG5hdGl2ZV9zeW1ib2xzICsgc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBzcmMtPmZpeF92YWx1ZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotCSAgICBjYXNlIENfQkxPQ0s6CS8qICIuYmIiIG9yICIuZWIiCQkgKi8KLQkgICAgY2FzZSBDX0ZDTjoJCS8qICIuYmYiIG9yICIuZWYiIChvciBQRSAiLmxmIikJICovCi0JICAgIGNhc2UgQ19FRkNOOgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JICovCi0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkgICAgICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLQkJIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBpZiAoc3RyY21wIChkc3QtPnN5bWJvbC5uYW1lLCAiLmJmIikgIT0gMCkKLQkJewotCQkgIC8qIFBFIHVzZXMgZnVubnkgdmFsdWVzIGZvciAuZWYgYW5kIC5sZjsgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRlIHRoZW0uICAqLwotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkJfQotCSAgICAgIGVsc2UKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0RFQlVHR0lOR19SRUxPQzsKLSNlbHNlCi0JICAgICAgLyogQmFzZSB0aGUgdmFsdWUgYXMgYW4gaW5kZXggZnJvbSB0aGUgYmFzZSBvZiB0aGUKLQkJIHNlY3Rpb24uICAqLwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19TVEFUTEFCOgkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0gICAgICAgICAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotICAgICAgICAgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19OVUxMOgotCSAgICAgIC8qIFBFIERMTHMgc29tZXRpbWVzIGhhdmUgemVyb2VkIG91dCBzeW1ib2xzIGZvciBzb21lCi0gICAgICAgICAgICAgICAgIHJlYXNvbi4gIEp1c3QgaWdub3JlIHRoZW0gd2l0aG91dCBhIHdhcm5pbmcuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fdHlwZSA9PSAwCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3ZhbHVlID09IDAKLQkJICAmJiBzcmMtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBDX0VYVERFRjoJLyogZXh0ZXJuYWwgZGVmaW5pdGlvbgkJICovCi0JICAgIGNhc2UgQ19VTEFCRUw6CS8qIHVuZGVmaW5lZCBsYWJlbAkJICovCi0JICAgIGNhc2UgQ19VU1RBVElDOgkvKiB1bmRlZmluZWQgc3RhdGljCQkgKi8KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gICAgICAgICAgICAvKiBDX0xJTkUgaW4gcmVndWxhciBjb2ZmIGlzIDB4NjguICBOVCBoYXMgdGFrZW4gb3ZlciB0aGlzIHN0b3JhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gc3ltYm9sICovCi0JICAgIGNhc2UgQ19MSU5FOgkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0JICAgICAgLyogTlQgdXNlcyAweDY3IGZvciBhIHdlYWsgc3ltYm9sLCBub3QgQ19BTElBUy4gICovCi0JICAgIGNhc2UgQ19BTElBUzoJLyogZHVwbGljYXRlIHRhZwkJICovCi0jZW5kaWYKLQkgICAgICAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSSBDT0ZGICovIAotI2lmIGRlZmluZWQoVElDODBDT0ZGKSB8fCBkZWZpbmVkKFRJQ09GRikKLQkgICAgY2FzZSBDX1VFWFQ6CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX0VYVExBQjoJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19ISURERU46CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNyYy0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSBkc3QtPnN5bWJvbC5zZWN0aW9uLT5uYW1lLCBkc3QtPnN5bWJvbC5uYW1lKTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0vKiAgICAgIEJGRF9BU1NFUlQoZHN0LT5zeW1ib2wuZmxhZ3MgIT0gMCk7Ki8KLQotCSAgZHN0LT5uYXRpdmUgPSBzcmM7Ci0KLQkgIGRzdC0+c3ltYm9sLnVkYXRhLmkgPSAwOwotCSAgZHN0LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLQkgIHRoaXNfaW5kZXggKz0gKHNyYy0+dS5zeW1lbnQubl9udW1hdXgpICsgMTsKLQkgIGRzdCsrOwotCSAgbnVtYmVyX29mX3N5bWJvbHMrKzsKLQl9CQkJLyogd2FsayB0aGUgbmF0aXZlIHN5bXRhYiAqLwotICAgIH0JCQkJLyogYmZkaXplIHRoZSBuYXRpdmUgc3ltdGFiICovCi0KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkX2FyZWE7Ci0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBuYXRpdmVfc3ltYm9sczsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bWJlcl9vZl9zeW1ib2xzOwotICBvYmpfY29udmVydCAoYWJmZCkgPSB0YWJsZV9wdHI7Ci0gIC8qIFNsdXJwIHRoZSBsaW5lIHRhYmxlcyBmb3IgZWFjaCBzZWN0aW9uIHRvbyAqLwotICB7Ci0gICAgYXNlY3Rpb24gKnA7Ci0gICAgcCA9IGFiZmQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChwKQotICAgICAgewotCWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgcCk7Ci0JcCA9IHAtPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CQkJCS8qIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKCkgKi8KLQotLyogQ2xhc3NpZnkgYSBDT0ZGIHN5bWJvbC4gIEEgY291cGxlIG9mIHRhcmdldHMgaGF2ZSBnbG9iYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIHdoaWNoIGFyZSBub3QgY2xhc3MgQ19FWFQsIGFuZCB0aGlzIGhhbmRsZXMgdGhvc2UuICBJdCBhbHNvCi0gICByZWNvZ25pemVzIHNvbWUgc3BlY2lhbCBQRSBjYXNlcy4gICovCi0KLXN0YXRpYyBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi1jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWVudDsKLXsKLSAgLyogRklYTUU6IFRoaXMgcGFydGlhbGx5IGR1cGxpY2F0ZXMgdGhlIHN3aXRjaCBpbgotICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi0gIHN3aXRjaCAoc3ltZW50LT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBJOTYwCi0gICAgY2FzZSBDX0xFQUZFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBBUk0KLSAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgY2FzZSBDX1RIVU1CRVhURlVOQzoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0gICAgY2FzZSBDX1NZU1RFTToKLSNlbmRpZgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfVU5ERUZJTkVEOwotCSAgZWxzZQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfQ09NTU9OOwotCX0KLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9HTE9CQUw7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU1RBVCkKLSAgICB7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgLyogVGhlIE1pY3Jvc29mdCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIHRoZXNlIGlmIGEKLSAgICAgICAgICAgICBzbWFsbCBzdGF0aWMgZnVuY3Rpb24gaXMgaW5saW5lZCBldmVyeSB0aW1lIGl0IGlzIHVzZWQuCi0gICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRpc2NhcmRlZCwgYnV0IHRoZSBzeW1ib2wgdGFibGUgZW50cnkKLSAgICAgICAgICAgICByZW1haW5zLiAgKi8KLQkgIHJldHVybiBDT0ZGX1NZTUJPTF9MT0NBTDsKLQl9Ci0KLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gICAgICAvKiBUaGlzIGlzIGNvcnJlY3QgZm9yIE1pY3Jvc29mdCBnZW5lcmF0ZWQgb2JqZWN0cywgYnV0IGl0Ci0gICAgICAgICBicmVha3MgZ2FzIGdlbmVyYXRlZCBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bWVudC0+bl9zY251bSk7Ci0JICBpZiAoc2VjICE9IE5VTEwKLQkgICAgICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpCi0JCSAgPT0gMCkpCi0JICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotCX0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci0gICAgfQotCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICAvKiBJbiBzb21lIGNhc2VzIGluIGEgRExMIGdlbmVyYXRlZCBieSB0aGUgTWljcm9zb2Z0IGxpbmtlciwgdGhlCi0gICAgICAgICBuX3ZhbHVlIGZpZWxkIHdpbGwgY29udGFpbiBnYXJiYWdlLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgICAgICBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHRoZSBzd2FwcGluZyBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JcmV0dXJuIENPRkZfU1lNQk9MX1VOREVGSU5FRDsKLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotICAgIH0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotICAvKiBJZiBpdCBpcyBub3QgYSBnbG9iYWwgc3ltYm9sLCB3ZSBwcmVzdW1lIGl0IGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQotICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0gICAgewotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIndhcm5pbmc6ICVzOiBsb2NhbCBzeW1ib2wgYCVzJyBoYXMgbm8gc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpOwotICAgIH0KLQotICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyByZWxvY2F0aW9ucwotCi0JQ29mZiByZWxvY2F0aW9ucyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gdGhlIGludGVybmFsIEJGRCBmb3JtCi0JKEBjb2Rle2FyZWxlbnR9KS4KLQotCVJlYWRpbmcgYSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKLQotCW8gUmVhZCB0aGUgZW50aXJlIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpbnRvIG1lbW9yeS4KLQotCW8gUHJvY2VzcyBlYWNoIHJlbG9jYXRpb24gaW4gdHVybjsgZmlyc3Qgc3dhcCBpdCBmcm9tIHRoZQotCWV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbCBmb3JtLgotCi0JbyBUdXJuIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHN5bWJvbCBpbmRleAotCWludG8gYSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0JVGhpcyB0YWJsZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4gVGhlIGJhY2sgZW5kIHdpbGwgY2FsbCB0aGF0Ci0Jcm91dGluZSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGlmIGEgY2Fub25pY2FsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lLgotCi0JbyBUaGUgcmVsb2MgaW5kZXggaXMgdHVybmVkIGludG8gYSBwb2ludGVyIHRvIGEgaG93dG8KLQlzdHJ1Y3R1cmUsIGluIGEgYmFjayBlbmQgc3BlY2lmaWMgd2F5LiBGb3IgaW5zdGFuY2UsIHRoZSAzODYKLQlhbmQgOTYwIHVzZSB0aGUgQGNvZGV7cl90eXBlfSB0byBkaXJlY3RseSBwcm9kdWNlIGFuIGluZGV4Ci0JaW50byBhIGhvd3RvIHRhYmxlIHZlY3RvcjsgdGhlIDg4ayBzdWJ0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUKLQlAY29kZXtyX3R5cGV9IGZpZWxkIGFuZCBjcmVhdGVzIGFuIGFkZGVuZCBmaWVsZC4KLQotCi0qLwotCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIFJFTE9DICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmF0aXZlX3JlbG9jcyA9Ci0gICAgKFJFTE9DICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCSAgICBhc2VjdC0+cmVsX2ZpbGVwb3MsCi0JCQkgICAgU0VFS19TRVQsCi0JCQkgICAgKHNpemVfdCkgKGJmZF9jb2ZmX3JlbHN6IChhYmZkKSAqCi0JCQkJICAgICAgYXNlY3QtPnJlbG9jX2NvdW50KSk7Ci0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpIChhc2VjdC0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0KLSAgaWYgKHJlbG9jX2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBhc2VjdC0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBkc3Q7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnNyYzsKLSNpZm5kZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgYXN5bWJvbCAqcHRyOwotI2VuZGlmCi0KLSAgICAgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlICsgaWR4OwotICAgICAgc3JjID0gbmF0aXZlX3JlbG9jcyArIGlkeDsKLQotICAgICAgY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsICZkc3QpOwotCi0jaWZkZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgUkVMT0NfUFJPQ0VTU0lORyAoY2FjaGVfcHRyLCAmZHN0LCBzeW1ib2xzLCBhYmZkLCBhc2VjdCk7Ci0jZWxzZQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gZHN0LnJfdmFkZHI7Ci0KLSAgICAgIGlmIChkc3Qucl9zeW1uZHggIT0gLTEpCi0JewotCSAgaWYgKGRzdC5yX3N5bW5keCA8IDAgfHwgZHN0LnJfc3ltbmR4ID49IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3N5bW5keCk7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHB0ciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoc3ltYm9scwotCQkJCQkrIG9ial9jb252ZXJ0IChhYmZkKVtkc3Qucl9zeW1uZHhdKTsKLQkgICAgICBwdHIgPSAqKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHB0ciA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBUaGUgc3ltYm9scyBkZWZpbml0aW9ucyB0aGF0IHdlIGhhdmUgcmVhZCBpbiBoYXZlIGJlZW4KLQkgcmVsb2NhdGVkIGFzIGlmIHRoZWlyIHNlY3Rpb25zIHN0YXJ0ZWQgYXQgMC4gQnV0IHRoZSBvZmZzZXRzCi0JIHJlZmVyaW5nIHRvIHRoZSBzeW1ib2xzIGluIHRoZSByYXcgZGF0YSBoYXZlIG5vdCBiZWVuCi0JIG1vZGlmaWVkLCBzbyB3ZSBoYXZlIHRvIGhhdmUgYSBuZWdhdGl2ZSBhZGRlbmQgdG8gY29tcGVuc2F0ZS4KLQotCSBOb3RlIHRoYXQgc3ltYm9scyB3aGljaCB1c2VkIHRvIGJlIGNvbW1vbiBtdXN0IGJlIGxlZnQgYWxvbmUgKi8KLQotICAgICAgLyogQ2FsY3VsYXRlIGFueSByZWxvYyBhZGRlbmQgYnkgbG9va2luZyBhdCB0aGUgc3ltYm9sICovCi0gICAgICBDQUxDX0FEREVORCAoYWJmZCwgcHRyLCBkc3QsIGNhY2hlX3B0cik7Ci0KLSAgICAgIGNhY2hlX3B0ci0+YWRkcmVzcyAtPSBhc2VjdC0+dm1hOwotLyogISEgICAgIGNhY2hlX3B0ci0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOyovCi0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGNhY2hlX3B0ci0+aG93dG8gZmllbGQgZnJvbSBkc3Qucl90eXBlICovCi0gICAgICBSVFlQRTJIT1dUTyAoY2FjaGVfcHRyLCAmZHN0KTsKLSNlbmRpZgkvKiBSRUxPQ19QUk9DRVNTSU5HICovCi0KLSAgICAgIGlmIChjYWNoZV9wdHItPmhvd3RvID09IE5VTEwpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3R5cGUsIChsb25nKSBkc3Qucl92YWRkcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLSNpZmRlZiBSVFlQRTJIT1dUTwotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSByZWxvYy4gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBmaWxlCi0gICBpbmNsdWRpbmcgdGhpcyBvbmUgZGVmaW5lcyBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gdG8gYmUKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHNvIGl0IGlzIE9LIGlmIGl0IGRvZXMgbm90Ci0gICBhbHdheXMgd29yay4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW5jbHVkaW5nIGZpbGUgdG8KLSAgIG1ha2Ugc3VyZSBpdCBpcyByZWFzb25hYmxlIGlmIGl0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgUlRZUEUySE9XVE8gKCZnZW5yZWwsIHJlbCk7Ci0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBOVUxMCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFJUWVBFMkhPV1RPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlLiAgKi8KLXN0YXRpYyBsb25nCi1jb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKiogcmVscHRyOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgLyogdGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgdGhleSBhcmUgbm90IGluIHRoZQotICAgICAgIGZpbGUsIHNvIHRha2UgdGhlbSBvdXQgb2YgdGhlaXIgY2hhaW4gYW5kIHBsYWNlIHRoZW0gaW50bwotICAgICAgIHRoZSBkYXRhIGFyZWEgcHJvdmlkZWQgKi8KLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQkqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotCi0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0jaWZkZWYgR05VOTYwCi1maWxlX3B0cgotY29mZl9zeW1fZmlsZXBvcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gb2JqX3N5bV9maWxlcG9zIChhYmZkKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotCi1zdGF0aWMgaW50IGR1bW15X3JlbG9jMTZfZXN0aW1hdGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgdW5zaWduZWQgaW50LAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGludAotZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IHNocmluayBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotLyogVGhpcyB3b3JrcyBldmVuIGlmIGFib3J0IGlzIG5vdCBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYXJlbGVudCAqLAotCSAgIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfYnl0ZSAqZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcyBkZWZpbmVkLCB3ZSBjYW4gdXNlIHRoZSBvcHRpbWl6ZWQgQ09GRgotICAgYmFja2VuZCBsaW5rZXIuICBPdGhlcndpc2Ugd2UgbXVzdCBjb250aW51ZSB0byB1c2UgdGhlIG9sZCBsaW5rZXIuICAqLwotI2lmZGVmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBOVUxMCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotI2lmbmRlZiBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9zdGFydF9maW5hbF9saW5rIE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLQotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAoYWJmZCwgaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYWJmZC0+b3V0cHV0X2hhc19iZWd1bjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0KLXN0YXRpYyBib29sZWFuIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfaW4gY29mZl9zd2FwX2F1eF9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1faW4KLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiBjb2ZmX3N3YXBfc3ltX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19pbgotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX2luIGNvZmZfc3dhcF9saW5lbm9faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X291dAotI2RlZmluZSBjb2ZmX1NXQVBfYXV4X291dCBjb2ZmX3N3YXBfYXV4X291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1fb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zeW1fb3V0IGNvZmZfc3dhcF9zeW1fb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19vdXQgY29mZl9zd2FwX2xpbmVub19vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfcmVsb2Nfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19vdXQgY29mZl9zd2FwX3JlbG9jX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX291dCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc2NuaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX291dCBjb2ZmX3N3YXBfc2NuaGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19pbgotI2RlZmluZSBjb2ZmX1NXQVBfcmVsb2NfaW4gY29mZl9zd2FwX3JlbG9jX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2ZpbGVoZHJfaW4gY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfYW91dGhkcl9pbiBjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX3Njbmhkcl9pbiBjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSA9Ci17Ci0gIGNvZmZfU1dBUF9hdXhfaW4sIGNvZmZfU1dBUF9zeW1faW4sIGNvZmZfU1dBUF9saW5lbm9faW4sCi0gIGNvZmZfU1dBUF9hdXhfb3V0LCBjb2ZmX1NXQVBfc3ltX291dCwKLSAgY29mZl9TV0FQX2xpbmVub19vdXQsIGNvZmZfU1dBUF9yZWxvY19vdXQsCi0gIGNvZmZfU1dBUF9maWxlaGRyX291dCwgY29mZl9TV0FQX2FvdXRoZHJfb3V0LAotICBjb2ZmX1NXQVBfc2NuaGRyX291dCwKLSAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osIEZJTE5NTEVOLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiwgCi0jaWZkZWYgQ09GRl9GT1JDRV9TWU1CT0xTX0lOX1NUUklOR1MKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9ERUJVR19TVFJJTkdfV0lERV9QUkVGSVgKLSAgNCwKLSNlbHNlCi0gIDIsCi0jZW5kaWYKLSAgY29mZl9TV0FQX2ZpbGVoZHJfaW4sIGNvZmZfU1dBUF9hb3V0aGRyX2luLCBjb2ZmX1NXQVBfc2NuaGRyX2luLAotICBjb2ZmX1NXQVBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX2NsYXNzaWZ5X3N5bWJvbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jaWZuZGVmIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUJY29mZl9jbG9zZV9hbmRfY2xlYW51cCAgICAgICAgICAgICAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzICAgICAgICAgICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAgICAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAgICAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQkgICAgX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBjb2ZmX3JlYWRfbWluaXN5bWJvbHMJCSAgICBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCSAgICBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSNlbmRpZgotCi0vKiBUaGUgcmVsb2MgbG9va3VwIHJvdXRpbmUgbXVzdCBiZSBzdXBwbGllZCBieSBlYWNoIGluZGl2aWR1YWwgQ09GRgotICAgYmFja2VuZC4gICovCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCSAgICBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCQkgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgY29mZl9iZmRfZ2Nfc2VjdGlvbnMJCSAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0KLSNkZWZpbmUgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMoVkFSLCBOQU1FLCBFWFRSQV9PX0ZMQUdTLCBFWFRSQV9TX0ZMQUdTLCBVTkRFUiwgQUxURVJOQVRJVkUpCVwKLWNvbnN0IGJmZF90YXJnZXQgVkFSID0JCQkJCQkJXAotewkJCQkJCQkJCVwKLSAgTkFNRSAsCQkJCQkJCQlcCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkJCQkJCVwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCQlcCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCQlcCi0gIC8qIG9iamVjdCBmbGFncyAqLwkJCQkJCQlcCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwJCQlcCi0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRVhUUkFfT19GTEFHUyksCQkJXAotICAvKiBzZWN0aW9uIGZsYWdzICovCQkJCQkJCVwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IEVYVFJBX1NfRkxBR1MpLFwKLSAgVU5ERVIsCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwkJXAotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCQkJXAotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8JCQlcCi0gIAkJCQkJCQkJCVwKLSAgLyogRGF0YSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwJCQkJXAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCQkJCVwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkJCQlcCi0gIAkJCQkJCQkJCVwKLSAgLyogSGVhZGVyIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8JCQkJCVwKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAkJCQlcCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwJCQkJXAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCQkJCVwKLQkJCQkJCQkJCVwKLQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCQkJCQkJXAotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCQlcCi0gICAgX2JmZF9kdW1teV90YXJnZXQgfSwJCQkJCQlcCi0JLyogYmZkX3NldF9mb3JtYXQgKi8JCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2UgfSwJXAotCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwkJCQkJXAotICB7IGJmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywJXAotICAgIGJmZF9mYWxzZSB9LAkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCQkJCVwKLSAgCQkJCQkJCQkJXAotICBBTFRFUk5BVElWRSwJCQkJCQkJCVwKLSAgCQkJCQkJCQkJXAotICBDT0ZGX1NXQVBfVEFCTEUJCQkJCQkJXAotfTsKLQotI2RlZmluZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyhWQVIsIE5BTUUsIEVYVFJBX09fRkxBR1MsIEVYVFJBX1NfRkxBR1MsIFVOREVSLCBBTFRFUk5BVElWRSkJXAotY29uc3QgYmZkX3RhcmdldCBWQVIgPQkJCQkJCQlcCi17CQkJCQkJCQkJXAotICBOQU1FICwJCQkJCQkJCVwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQkJCQkJXAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8JCVwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8JXAotCS8qIG9iamVjdCBmbGFncyAqLwkJCQkJCVwKLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAkJCVwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBFWFRSQV9PX0ZMQUdTKSwJCQlcCi0JLyogc2VjdGlvbiBmbGFncyAqLwkJCQkJCVwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IEVYVFJBX1NfRkxBR1MpLFwKLSAgVU5ERVIsCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwkJXAotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCQkJXAotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8JCQlcCi0JCQkJCQkJCQlcCi0gIC8qIERhdGEgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCQkJCVwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAkJCQlcCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJCQkJXAotICAvKiBIZWFkZXIgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCQkJCVwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAkJCQlcCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJCQkJXAotCS8qIGJmZF9jaGVja19mb3JtYXQgKi8JCQkJCQlcCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJCVwKLSAgICBfYmZkX2R1bW15X3RhcmdldCB9LAkJCQkJCVwKLSAgICAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZSB9LAlcCi0JLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAlcCi0gICAgYmZkX2ZhbHNlIH0sCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwJCQkJXAotCQkJCQkJCQkJXAotICBBTFRFUk5BVElWRSwJCQkJCQkJCVwKLSAgCQkJCQkJCQkJXAotICBDT0ZGX1NXQVBfVEFCTEUJCQkJCQkJXAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmZ2VuLmMgYi9iZmQvY29mZmdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjdmODYyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDU1ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIENPRkYsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tLgotICAgU3BsaXQgb3V0IG9mIGNvZmZjb2RlLmggYnkgSWFuIFRheWxvciwgaWFuQGN5Z251cy5jb20uICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgQ09GRiBjb2RlIHRoYXQgaXMgbm90IGRlcGVuZGVudCBvbiBhbnkKLSAgIHBhcnRpY3VsYXIgQ09GRiB0YXJnZXQuICBUaGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbgotICAgbGliYmZkLmEsIHNvIG5vIHRhcmdldCBzcGVjaWZpYyBjb2RlIG1heSBiZSBwdXQgaW4gaGVyZS4gIE9yLCB0bwotICAgcHV0IGl0IGFub3RoZXIgd2F5LAotCi0gICAqKioqKioqKioqIERPIE5PVCBQVVQgVEFSR0VUIFNQRUNJRklDIENPREUgSU4gVEhJUyBGSUxFICoqKioqKioqKioKLQotICAgSWYgeW91IG5lZWQgdG8gYWRkIHNvbWUgdGFyZ2V0IHNwZWNpZmljIGJlaGF2aW91ciwgYWRkIGEgbmV3IGhvb2sKLSAgIGZ1bmN0aW9uIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YS4KLQotICAgU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGFsc28gY2FsbGVkIGJ5IHRoZSBFQ09GRiByb3V0aW5lcy4KLSAgIFRob3NlIGZ1bmN0aW9ucyBtYXkgbm90IHVzZSBhbnkgQ09GRiBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc3VjaCBhcwotICAgY29mZl9kYXRhIChhYmZkKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgdm9pZCBjb2ZmX2ZpeF9zeW1ib2xfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIHVuc2lnbmVkIGludCAqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9hbGllbl9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGNvZmZfc3ltYm9sX3R5cGUgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3BvaW50ZXJpemVfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfcmVhbF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQsIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosIAotCSAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKLXN0YXRpYyB2b2lkIGZpeHVwX3N5bWJvbF92YWx1ZQotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLXN0YXRpYyBjaGFyICpidWlsZF9kZWJ1Z19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqY29weV9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIGludCkpOwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFRha2UgYSBzZWN0aW9uIGhlYWRlciByZWFkIGZyb20gYSBjb2ZmIGZpbGUgKGluIEhPU1QgYnl0ZSBvcmRlciksCi0gICBhbmQgbWFrZSBhIEJGRCAic2VjdGlvbiIgb3V0IG9mIGl0LiAgVGhpcyBpcyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsIGhkciwgdGFyZ2V0X2luZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkcjsKLSAgICAgdW5zaWduZWQgaW50IHRhcmdldF9pbmRleDsKLXsKLSAgYXNlY3Rpb24gKnJldHVybl9zZWN0aW9uOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBOVUxMOwotCi0gIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotICAgICAgJiYgaGRyLT5zX25hbWVbMF0gPT0gJy8nKQotICAgIHsKLSAgICAgIGNoYXIgYnVmW1NDTk5NTEVOXTsKLSAgICAgIGxvbmcgc3RyaW5kZXg7Ci0gICAgICBjaGFyICpwOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nczsKLQotICAgICAgbWVtY3B5IChidWYsIGhkci0+c19uYW1lICsgMSwgU0NOTk1MRU4gLSAxKTsKLSAgICAgIGJ1ZltTQ05OTUxFTiAtIDFdID0gJ1wwJzsKLSAgICAgIHN0cmluZGV4ID0gc3RydG9sIChidWYsICZwLCAxMCk7Ci0gICAgICBpZiAoKnAgPT0gJ1wwJyAmJiBzdHJpbmRleCA+PSAwKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRklYTUU6IEZvciBleHRyYSBzYWZldHksIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdAotICAgICAgICAgICAgIHN0cmluZGV4IGRvZXMgbm90IHJ1biB1cyBwYXN0IHRoZSBlbmQsIGJ1dCByaWdodCBub3cgd2UKLSAgICAgICAgICAgICBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBzdHJpbmdzICs9IHN0cmluZGV4OwotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzdHJpbmdzKSArIDEpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChuYW1lLCBzdHJpbmdzKTsKLQl9Ci0gICAgfQotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgLyogQXNzb3J0ZWQgd2FzdGFnZSB0byBudWxsLXRlcm1pbmF0ZSB0aGUgbmFtZSwgdGhhbmtzIEFUJlQhICovCi0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGhkci0+c19uYW1lKSArIDEpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJuY3B5IChuYW1lLCAoY2hhciAqKSAmaGRyLT5zX25hbWVbMF0sIHNpemVvZiAoaGRyLT5zX25hbWUpKTsKLSAgICAgIG5hbWVbc2l6ZW9mIChoZHItPnNfbmFtZSldID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmIChyZXR1cm5fc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm5fc2VjdGlvbi0+dm1hID0gaGRyLT5zX3ZhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+bG1hID0gaGRyLT5zX3BhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+X3Jhd19zaXplID0gaGRyLT5zX3NpemU7Ci0gIHJldHVybl9zZWN0aW9uLT5maWxlcG9zID0gaGRyLT5zX3NjbnB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbF9maWxlcG9zID0gaGRyLT5zX3JlbHB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbG9jX2NvdW50ID0gaGRyLT5zX25yZWxvYzsKLQotICBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHJldHVybl9zZWN0aW9uLCBoZHIpOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lX2ZpbGVwb3MgPSBoZHItPnNfbG5ub3B0cjsKLQotICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gaGRyLT5zX25sbm5vOwotICByZXR1cm5fc2VjdGlvbi0+dXNlcmRhdGEgPSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdGFyZ2V0X2luZGV4OwotICByZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgPSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rIChhYmZkLCBoZHIsIG5hbWUsCi0JCQkJCQkJICAgcmV0dXJuX3NlY3Rpb24pOwotCi0gIC8qIEF0IGxlYXN0IG9uIGkzODYtY29mZiwgdGhlIGxpbmUgbnVtYmVyIGNvdW50IGZvciBhIHNoYXJlZCBsaWJyYXJ5Ci0gICAgIHNlY3Rpb24gbXVzdCBiZSBpZ25vcmVkLiAgKi8KLSAgaWYgKChyZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKLSAgICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gMDsKLQotICBpZiAoaGRyLT5zX25yZWxvYyAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBjaGVjayAnaGRyLT5zX3NpemUgPiAwJyAqLwotICBpZiAoaGRyLT5zX3NjbnB0ciAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiBhIENPRkYgb2JqZWN0IGFuZCBtYWtlIGl0IGludG8gYSBCRkQuICBUaGlzIGlzIHVzZWQgYnkKLSAgIEVDT0ZGIGFzIHdlbGwuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCBpbnRlcm5hbF9mLCBpbnRlcm5hbF9hKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIG5zY25zOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2E7Ci17Ci0gIGZsYWd3b3JkIG9mbGFncyA9IGFiZmQtPmZsYWdzOwotICBiZmRfdm1hIG9zdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIFBUUiB0ZGF0YTsKLSAgc2l6ZV90IHJlYWRzaXplOwkJLyogbGVuZ3RoIG9mIGZpbGVfaW5mbyAqLwotICB1bnNpZ25lZCBpbnQgc2NuaHN6OwotICBjaGFyICpleHRlcm5hbF9zZWN0aW9uczsKLQotICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9SRUxGTEcpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xOTk8pKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk87Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xTWU1TKSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTE9DQUxTOwotCi0gIC8qIEZJWE1FOiBIb3cgY2FuIHdlIHNldCBEX1BBR0VEIGNvcnJlY3RseT8gICovCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRVhFQykgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gaW50ZXJuYWxfZi0+Zl9uc3ltczsKLSAgaWYgKGludGVybmFsX2YtPmZfbnN5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGludGVybmFsX2EtPmVudHJ5OwotICBlbHNlCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IDA7Ci0KLSAgLyogU2V0IHVwIHRoZSB0ZGF0YSBhcmVhLiAgRUNPRkYgdXNlcyBpdHMgb3duIHJvdXRpbmUsIGFuZCBvdmVycmlkZXMKLSAgICAgYWJmZC0+ZmxhZ3MuICAqLwotICB0ZGF0YSA9IGJmZF9jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YsIChQVFIpIGludGVybmFsX2EpOwotICBpZiAodGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICByZWFkc2l6ZSA9IG5zY25zICogc2NuaHN6OwotICBleHRlcm5hbF9zZWN0aW9ucyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgcmVhZHNpemUpOwotICBpZiAoIWV4dGVybmFsX3NlY3Rpb25zKQotICAgIGdvdG8gZmFpbDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dGVybmFsX3NlY3Rpb25zLCAxLCByZWFkc2l6ZSwgYWJmZCkgIT0gcmVhZHNpemUpCi0gICAgZ290byBmYWlsOwotCi0gIC8qIFNldCB0aGUgYXJjaC9tYWNoICpiZWZvcmUqIHN3YXBwaW5nIGluIHNlY3Rpb25zOyBzZWN0aW9uIGhlYWRlciBzd2FwcGluZwotICAgICBtYXkgZGVwZW5kIG9uIGFyY2gvbWFjaCBpbmZvLiAqLwotICBpZiAoYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCAoUFRSKSBpbnRlcm5hbF9mKSA9PSBmYWxzZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogTm93IGNvcHkgZGF0YSBhcyByZXF1aXJlZDsgY29uc3RydWN0IGFsbCBhc2VjdGlvbnMgZXRjICovCi0gIGlmIChuc2NucyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zY25zOyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciB0bXA7Ci0JICBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwKLQkJCQkgICAoUFRSKSAoZXh0ZXJuYWxfc2VjdGlvbnMgKyBpICogc2NuaHN6KSwKLQkJCQkgICAoUFRSKSAmIHRtcCk7Ci0JICBpZiAoISBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsICZ0bXAsIGkgKyAxKSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0KLSAgLyogIG1ha2VfYWJzX3NlY3Rpb24gKGFiZmQpOyAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZmFpbDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHRkYXRhKTsKLSAgYWJmZC0+ZmxhZ3MgPSBvZmxhZ3M7Ci0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBvc3RhcnQ7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi0vKiBUdXJuIGEgQ09GRiBmaWxlIGludG8gYSBCRkQsIGJ1dCBmYWlsIHdpdGggYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBpZiBpdCBpcwotICAgbm90IGEgQ09GRiBmaWxlLiAgVGhpcyBpcyBhbHNvIHVzZWQgYnkgRUNPRkYuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGZpbGhzejsKLSAgdW5zaWduZWQgaW50IGFvdXRzejsKLSAgaW50IG5zY25zOwotICBQVFIgZmlsZWhkcjsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLQotICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHRvIHJlYWQgKi8KLSAgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLQotICBmaWxlaGRyID0gYmZkX2FsbG9jIChhYmZkLCBmaWxoc3opOwotICBpZiAoZmlsZWhkciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBpZiAoYmZkX3JlYWQgKGZpbGVoZHIsIDEsIGZpbGhzeiwgYWJmZCkgIT0gZmlsaHN6KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBmaWxlaGRyLCAmaW50ZXJuYWxfZik7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBmaWxlaGRyKTsKLQotICBpZiAoYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCAmaW50ZXJuYWxfZikgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIG5zY25zID0gaW50ZXJuYWxfZi5mX25zY25zOwotCi0gIGlmIChpbnRlcm5hbF9mLmZfb3B0aGRyKQotICAgIHsKLSAgICAgIFBUUiBvcHRoZHI7Ci0KLSAgICAgIG9wdGhkciA9IGJmZF9hbGxvYyAoYWJmZCwgYW91dHN6KTsKLSAgICAgIGlmIChvcHRoZHIgPT0gTlVMTCkKLQlyZXR1cm4gMDs7Ci0gICAgICBpZiAoYmZkX3JlYWQgKG9wdGhkciwgMSwgaW50ZXJuYWxfZi5mX29wdGhkciwgYWJmZCkKLQkgICE9IGludGVybmFsX2YuZl9vcHRoZHIpCi0JewotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBvcHRoZHIsIChQVFIpICZpbnRlcm5hbF9hKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsICZpbnRlcm5hbF9mLAotCQkJICAgICAoaW50ZXJuYWxfZi5mX29wdGhkciAhPSAwCi0JCQkgICAgICA/ICZpbnRlcm5hbF9hCi0JCQkgICAgICA6IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBOVUxMKSk7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIHNlY3Rpb24gZnJvbSBhIENPRkYgc3ltYm9sIHNlY3Rpb24gbnVtYmVyLiAgKi8KLQotYXNlY3Rpb24gKgotY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIHN0cnVjdCBzZWMgKmFuc3dlciA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChpbmRleCA9PSBOX0FCUykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgaWYgKGluZGV4ID09IE5fVU5ERUYpCi0gICAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX0RFQlVHKQotICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gIHdoaWxlIChhbnN3ZXIpCi0gICAgewotICAgICAgaWYgKGFuc3dlci0+dGFyZ2V0X2luZGV4ID09IGluZGV4KQotCXJldHVybiBhbnN3ZXI7Ci0gICAgICBhbnN3ZXIgPSBhbnN3ZXItPm5leHQ7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBub3QgcmVhY2ggdGhpcyBwb2ludCwgYnV0IHRoZSBTQ08gMy4ydjQgL2xpYi9saWJjX3MuYQotICAgICBoYXMgYSBiYWQgc3ltYm9sIHRhYmxlIGluIGJpZ2xpdHBvdy5vLiAgKi8KLSAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci19Ci0KLS8qIEdldCB0aGUgdXBwZXIgYm91bmQgb2YgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUgKikpOwotfQotCi0KLS8qIENhbm9uaWNhbGl6ZSBhIENPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotbG9uZwotY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBzeW1iYXNlID0gb2JqX3N5bWJvbHMgKGFiZmQpOwotICBjb3VudGVyID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudGVyLS0gPiAwKQotICAgICpsb2NhdGlvbisrID0gc3ltYmFzZSsrOwotCi0gICpsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2wuICBUaGUgY2FsbGVyIG11c3QgcGFzcyBpbiBhIGJ1ZmZlciBvZiBzaXplCi0gICA+PSBTWU1OTUxFTiArIDEuICAqLwotCi1jb25zdCBjaGFyICoKLV9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgc3ltLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBjaGFyICpidWY7Ci17Ci0gIC8qIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB0aGlzIHdpbGwgd29yayBjb3JyZWN0bHkgaWYgc2l6ZW9mCi0gICAgIChfbl96ZXJvZXMpICE9IDQuICAqLwotICBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0gICAgICB8fCBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgbWVtY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHN5bS0+X24uX25fbi5fbl9vZmZzZXQgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0gICAgICBzdHJpbmdzID0gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0gICAgICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmV0dXJuIHN0cmluZ3MgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotICAgIH0KLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgcmVsb2NzLiAgVGhpcyByZXR1cm5zIGEgYnVmZmVyIGhvbGRpbmcgdGhlCi0gICByZWxvY3MgZm9yIHNlY3Rpb24gU0VDIGluIGZpbGUgQUJGRC4gIElmIENBQ0hFIGlzIHRydWUgYW5kCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgTlVMTCwgdGhlIHJlbG9jcyByZWFkIGluIHdpbGwgYmUgc2F2ZWQgaW4gY2FzZQotICAgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2Fpbi4gIElmIEVYVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQKLSAgIGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB1bnN3YXBwZWQgcmVsb2NzLiAgSWYKLSAgIElOVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQgaXMgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKLSAgIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIFJFUVVJUkVfSU5URVJOQUwgaXMgdHJ1ZSwgdGhlbiB0aGUgcmV0dXJuCi0gICB2YWx1ZSBtdXN0IGJlIElOVEVSTkFMX1JFTE9DUy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgb24gZXJyb3IuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgotX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGJmZF9zaXplX3R5cGUgcmVsc3o7Ci0gIGJmZF9ieXRlICpmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX2ludGVybmFsID0gTlVMTDsKLSAgYmZkX2J5dGUgKmVyZWw7Ci0gIGJmZF9ieXRlICplcmVsX2VuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQlyZXR1cm4gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsKLSAgICAgIG1lbWNweSAoaW50ZXJuYWxfcmVsb2NzLCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzLAotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAgICAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWVfZXh0ZXJuYWwgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgICAgIGlmIChmcmVlX2V4dGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBmcmVlX2V4dGVybmFsOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgcmVsc3osIHNlYy0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAhPSByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2ludGVybmFsID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQKLQkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICAgICAgaWYgKGZyZWVfaW50ZXJuYWwgPT0gTlVMTCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IGZyZWVfaW50ZXJuYWw7Ci0gICAgfQotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gICovCi0gIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0gIGVyZWxfZW5kID0gZXJlbCArIHJlbHN6ICogc2VjLT5yZWxvY19jb3VudDsKLSAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLSAgZm9yICg7IGVyZWwgPCBlcmVsX2VuZDsgZXJlbCArPSByZWxzeiwgaXJlbCsrKQotICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGVyZWwsIChQVFIpIGlyZWwpOwotCi0gIGlmIChmcmVlX2V4dGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9leHRlcm5hbCk7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGNhY2hlICYmIGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBOVUxMOwotCX0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICBpZiAoZnJlZV9pbnRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfaW50ZXJuYWwpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IGxpbmVub19jb3VudCBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucyBvZiBhIENPRkYgZmlsZS4gICovCi0KLWludAotY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbGltaXQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0b3RhbCA9IDA7Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGltaXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1heSBiZSBmcm9tIHRoZSBiYWNrZW5kIGxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAgICAgIGxpbmVub19jb3VudCBpbiB0aGUgc2VjdGlvbnMgaXMgY29ycmVjdC4gICovCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl0b3RhbCArPSBzLT5saW5lbm9fY291bnQ7Ci0gICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIEJGRF9BU1NFUlQgKHMtPmxpbmVub19jb3VudCA9PSAwKTsKLQotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpxX21heWJlID0gKnA7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChxX21heWJlKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpxID0gY29mZnN5bWJvbCAocV9tYXliZSk7Ci0KLQkgIC8qIFRoZSBBSVggNC4xIGNvbXBpbGVyIGNhbiBzb21ldGltZXMgZ2VuZXJhdGUgbGluZSBudW1iZXJzCi0gICAgICAgICAgICAgYXR0YWNoZWQgdG8gZGVidWdnaW5nIHN5bWJvbHMuICBXZSB0cnkgdG8gc2ltcGx5IGlnbm9yZQotICAgICAgICAgICAgIHRob3NlIGhlcmUuICAqLwotCSAgaWYgKHEtPmxpbmVubyAhPSBOVUxMCi0JICAgICAgJiYgcS0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXJzLiAgSW5jcmVtZW50IHRoZSBvd25pbmcKLQkgICAgICAgICBzZWN0aW9uJ3MgbGluZW51bWJlciBjb3VudC4gICovCi0JICAgICAgYWxlbnQgKmwgPSBxLT5saW5lbm87Ci0KLQkgICAgICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCSAgICAgICsrdG90YWw7Ci0JICAgICAgKytsOwotCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlciAhPSAwKQotCQl7Ci0JCSAgKyt0b3RhbDsKLQkJICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCQkgICsrbDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdG90YWw7Ci19Ci0KLS8qIFRha2VzIGEgYmZkIGFuZCBhIHN5bWJvbCwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvZmYgc3BlY2lmaWMKLSAgIGFyZWEgb2YgdGhlIHN5bWJvbCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvZmZfc3ltYm9sX3R5cGUgKgotY29mZl9zeW1ib2xfZnJvbSAoaWdub3JlX2FiZmQsIHN5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bWJvbCktPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gKGNvZmZfZGF0YV90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0KLSAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIHN5bWJvbDsKLX0KLQotc3RhdGljIHZvaWQKLWZpeHVwX3N5bWJvbF92YWx1ZSAoYWJmZCwgY29mZl9zeW1ib2xfcHRyLCBzeW1lbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1lbnQ7Ci17Ci0KLSAgLyogTm9ybWFsaXplIHRoZSBzeW1ib2wgZmxhZ3MgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgLyogYSBjb21tb24gc3ltYm9sIGlzIHVuZGVmaW5lZCB3aXRoIGEgdmFsdWUgKi8KLSAgICAgIHN5bWVudC0+bl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkgICAmJiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gMDsKLSAgICB9Ci0gIC8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBoZXJlPyAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKQotCXsKLQkgIHN5bWVudC0+bl9zY251bSA9Ci0JICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0KLQkgIHN5bWVudC0+bl92YWx1ZSA9IChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZQotCQkJICAgICArIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3ltZW50LT5uX3ZhbHVlICs9IChzeW1lbnQtPm5fc2NsYXNzID09IENfU1RBVExBQikKLSAgICAgICAgICAgICAgICA/IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5sbWEKLSAgICAgICAgICAgICAgICA6IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICAgICAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgLyogVGhpcyBjYW4gaGFwcGVuLCBidXQgSSBkb24ndCBrbm93IHdoeSB5ZXQgKHN0ZXZlQGN5Z251cy5jb20pICovCi0JICBzeW1lbnQtPm5fc2NudW0gPSBOX0FCUzsKLQkgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB3b3JrIG91dCB3aGF0Ci0gICB0aGVpciBpbmRleGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aWxsIGJlIHdoZW4gb3V0cHV0LgotCi0gICBDb2ZmIHJlcXVpcmVzIHRoYXQgZWFjaCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgbmV4dCBvbmUgaW4gdGhlCi0gICBjaGFpbiwgYW5kIHRoYXQgdGhlIGxhc3Qgb25lIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiBXZQotICAgZG8gdGhhdCBoZXJlIHRvby4gICovCi0KLWJvb2xlYW4KLWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYmZkX3B0ciwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqYmZkX3B0cjsKLSAgICAgaW50ICpmaXJzdF91bmRlZjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgbmF0aXZlX2luZGV4ID0gMDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqbGFzdF9maWxlID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICAvKiBDT0ZGIGRlbWFuZHMgdGhhdCB1bmRlZmluZWQgc3ltYm9scyBjb21lIGFmdGVyIGFsbCBvdGhlciBzeW1ib2xzLgotICAgICBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGltcG9zZSB0aGlzIGV4dHJhIGtub3dsZWRnZSBvbiBhbGwgb3VyCi0gICAgIGNsaWVudCBwcm9ncmFtcywgZGVhbCB3aXRoIHRoYXQgaGVyZS4gIFNvcnQgdGhlIHN5bWJvbCB0YWJsZTsKLSAgICAganVzdCBtb3ZlIHRoZSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGUgZW5kLCBsZWF2aW5nIHRoZSByZXN0Ci0gICAgIGFsb25lLiAgVGhlIE8nUmVpbGx5IGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMgY29tZQotICAgICBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMsIHNvIHdlIGRvIHRoYXQgaGVyZSBhcwotICAgICB3ZWxsLiAgKi8KLSAgLyogQEAgRG8gd2UgaGF2ZSBzb21lIGNvbmRpdGlvbiB3ZSBjb3VsZCB0ZXN0IGZvciwgc28gd2UgZG9uJ3QgYWx3YXlzCi0gICAgIGhhdmUgdG8gZG8gdGhpcz8gIEkgZG9uJ3QgdGhpbmsgcmVsb2NhdGFiaWxpdHkgaXMgcXVpdGUgcmlnaHQsIGJ1dAotICAgICBJJ20gbm90IGNlcnRhaW4uICBbcmFlYnVybjoxOTkyMDUwOC4xNzExRVNUXSAgKi8KLSAgewotICAgIGFzeW1ib2wgKipuZXdzeW1zOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGJmZF9wdHIsCi0JCQkJICAgICAgc2l6ZW9mIChhc3ltYm9sICopICogKHN5bWJvbF9jb3VudCArIDEpKTsKLSAgICBpZiAoIW5ld3N5bXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYmZkX3B0ci0+b3V0c3ltYm9scyA9IG5ld3N5bXM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwCi0JCSAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgPT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCi0JICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICYmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JCSAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgIT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICAqZmlyc3RfdW5kZWYgPSBuZXdzeW1zIC0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLSAgICAqbmV3c3ltcyA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB9Ci0KLSAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9IGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotICAgICAgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XS0+dWRhdGEuaSA9IHN5bWJvbF9pbmRleDsgCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKLQkgIGludCBpOwotCi0JICBpZiAocy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMKQotCQlsYXN0X2ZpbGUtPm5fdmFsdWUgPSBuYXRpdmVfaW5kZXg7Ci0JICAgICAgbGFzdF9maWxlID0gJihzLT51LnN5bWVudCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCi0JICAgICAgLyogTW9kaWZ5IHRoZSBzeW1ib2wgdmFsdWVzIGFjY29yZGluZyB0byB0aGVpciBzZWN0aW9uIGFuZAotCSAgICAgICAgIHR5cGUgKi8KLQotCSAgICAgIGZpeHVwX3N5bWJvbF92YWx1ZSAoYmZkX3B0ciwgY29mZl9zeW1ib2xfcHRyLCAmKHMtPnUuc3ltZW50KSk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eCArIDE7IGkrKykKLQkgICAgc1tpXS5vZmZzZXQgPSBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlX2luZGV4Kys7Ci0JfQotICAgIH0KLSAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYmZkX3B0cikgPSBuYXRpdmVfaW5kZXg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJ1biB0aG9yb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFnYWluLCBhbmQgZml4IGl0IHNvIHRoYXQgYWxsCi0gICBwb2ludGVycyB0byBlbnRyaWVzIGFyZSBjaGFuZ2VkIHRvIHRoZSBlbnRyaWVzJyBpbmRleCBpbiB0aGUgb3V0cHV0Ci0gICBzeW1ib2wgdGFibGUuICAqLwotCi12b2lkCi1jb2ZmX21hbmdsZV9zeW1ib2xzIChiZmRfcHRyKQotICAgICBiZmQgKmJmZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0KLSAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGludCBpOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCi0JICBpZiAocy0+Zml4X3ZhbHVlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgYSB1bmlvbiBoZXJlLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKChjb21iaW5lZF9lbnRyeV90eXBlICopIHMtPnUuc3ltZW50Lm5fdmFsdWUpLT5vZmZzZXQ7Ci0JICAgICAgcy0+Zml4X3ZhbHVlID0gMDsKLQkgICAgfQotCSAgaWYgKHMtPmZpeF9saW5lKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcwotICAgICAgICAgICAgICAgICBmb3IgdGhlIHN5bWJvbCdzIHNlY3Rpb24uICBPbiBvdXRwdXQsIHRoZSBzeW1ib2wncwotICAgICAgICAgICAgICAgICBzZWN0aW9uIHNob3VsZCBiZSBOX0RFQlVHLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJICsgcy0+dS5zeW1lbnQubl92YWx1ZSAqIGJmZF9jb2ZmX2xpbmVzeiAoYmZkX3B0cikpOwotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24gPQotCQljb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGJmZF9wdHIsIE5fREVCVUcpOwotCSAgICAgIEJGRF9BU1NFUlQgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORyk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eDsgaSsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYSA9IHMgKyBpICsgMTsKLQkgICAgICBpZiAoYS0+Zml4X3RhZykKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF90YWcgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9lbmQpCi0JCXsKLQkJICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAtPm9mZnNldDsKLQkJICBhLT5maXhfZW5kID0gMDsKLQkJfQotCSAgICAgIGlmIChhLT5maXhfc2NubGVuKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sID0KLQkJICAgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9zY25sZW4gPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkgICAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhlbnQ7Ci0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKSAoc3ltYm9sLT5uYW1lKTsKLQotICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGNvZmYgc3ltYm9scyBhbHdheXMgaGF2ZSBuYW1lcywgc28gd2UnbGwgbWFrZSBvbmUgdXAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICJzdHJhbmdlIjsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBzeW1ib2wtPm5hbWU7Ci0gICAgfQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0gICAgICAmJiBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgZmlsbm1sZW47Ci0KLSAgICAgIGlmIChiZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzIChhYmZkKSkKLQl7Ci0gICAgICAgICAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IAotCSAgICAgICgqc3RyaW5nX3NpemVfcCArIFNUUklOR19TSVpFX1NJWkUpOwotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAqc3RyaW5nX3NpemVfcCArPSA2OyAgLyogc3RybGVuKCIuZmlsZSIpICsgMSAqLwotCX0KLSAgICAgIGVsc2UKLSAgCXN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgIi5maWxlIiwgU1lNTk1MRU4pOwotCi0gICAgICBhdXhlbnQgPSAmKG5hdGl2ZSArIDEpLT51LmF1eGVudDsKLQotICAgICAgZmlsbm1sZW4gPSBiZmRfY29mZl9maWxubWxlbiAoYWJmZCk7Ci0KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyAoYWJmZCkpCi0JewotCSAgaWYgKG5hbWVfbGVuZ3RoIDw9IGZpbG5tbGVuKQotCSAgICB7Ci0JICAgICAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgZmlsbm1sZW4pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQgPSAqc3RyaW5nX3NpemVfcCArIFNUUklOR19TSVpFX1NJWkU7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLQkgICAgICAqc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgZmlsbm1sZW4pOwotCSAgaWYgKG5hbWVfbGVuZ3RoID4gZmlsbm1sZW4pCi0JICAgIG5hbWVbZmlsbm1sZW5dID0gJ1wwJzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG5hbWVfbGVuZ3RoIDw9IFNZTU5NTEVOICYmICFiZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzIChhYmZkKSkKLQl7Ci0JICAvKiBUaGlzIG5hbWUgd2lsbCBmaXQgaW50byB0aGUgc3ltYm9sIG5lYXRseSAqLwotCSAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCBzeW1ib2wtPm5hbWUsIFNZTU5NTEVOKTsKLQl9Ci0gICAgICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQpKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAoKnN0cmluZ19zaXplX3AKLQkJCQkJCSsgU1RSSU5HX1NJWkVfU0laRSk7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBmaWxlcG9zOwotCSAgYmZkX2J5dGUgYnVmWzRdOwotCSAgaW50IHByZWZpeF9sZW4gPSBiZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCAoYWJmZCk7Ci0KLQkgIC8qIFRoaXMgbmFtZSBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSAuZGVidWcgc2VjdGlvbi4gIEZvcgotCSAgICAgc29tZSByZWFzb24gZWFjaCBuYW1lIGlzIHByZWNlZGVkIGJ5IGEgdHdvIGJ5dGUgbGVuZ3RoCi0JICAgICBhbmQgYWxzbyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIEZJWE1FOiBXZSBhc3N1bWUgdGhhdAotCSAgICAgdGhlIC5kZWJ1ZyBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kIHRoYXQgaXQKLQkgICAgIGlzIGxhcmdlIGVub3VnaC4gICovCi0JICBpZiAoKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLQkgIGZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICBpZiAocHJlZml4X2xlbiA9PSA0KQotCSAgICBiZmRfcHV0XzMyIChhYmZkLCBuYW1lX2xlbmd0aCArIDEsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIG5hbWVfbGVuZ3RoICsgMSwgYnVmKTsKLQotCSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJIChQVFIpIGJ1ZiwKLQkJCQkJIChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AsCi0JCQkJCSAoYmZkX3NpemVfdHlwZSkgcHJlZml4X2xlbikKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkJCSAgICAoUFRSKSBzeW1ib2wtPm5hbWUsCi0JCQkJCSAgICAoKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcAotCQkJCQkgICAgICsgcHJlZml4X2xlbiksCi0JCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbmFtZV9sZW5ndGggKyAxKSkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAKLQkgICAgICAqZGVidWdfc3RyaW5nX3NpemVfcCArIHByZWZpeF9sZW47Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMSArIHByZWZpeF9sZW47Ci0JfQotICAgIH0KLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzeW1ib2wgaW5kZXggc28gdGhhdCB3aGVuIHdlIHdyaXRlIG91dAotICAgdGhlIHJlbG9jcyB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBmb3IgYSBzeW1ib2wuICBUaGlzIG1ldGhvZCBpcyBhCi0gICBoYWNrLiAgRklYTUUuICAqLwotCi0jZGVmaW5lIHNldF9pbmRleChzeW1ib2wsIGlkeCkJKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdyaXRlIGEgc3ltYm9sIG91dCB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCSAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICB1bnNpZ25lZCBpbnQgbnVtYXV4ID0gbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsKLSAgaW50IHR5cGUgPSBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKLSAgaW50IGNsYXNzID0gbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLSAgUFRSIGJ1ZjsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotICAgIHN5bWJvbC0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcKLSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX0RFQlVHOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fQUJTOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIGNvZmZfZml4X3N5bWJvbF9uYW1lIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgc3RyaW5nX3NpemVfcCwKLQkJCWRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltZXN6KTsKLSAgaWYgKCFidWYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZuYXRpdmUtPnUuc3ltZW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIHN5bWVzeiwgYWJmZCkgIT0gc3ltZXN6KQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgYXV4ZXN6OwotICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAgIGF1eGVzeiA9IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCk7Ci0gICAgICBidWYgPSBiZmRfYWxsb2MgKGFiZmQsIGF1eGVzeik7Ci0gICAgICBpZiAoIWJ1ZikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsgaisrKQotCXsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwKLQkJCQkgJigobmF0aXZlICsgaiArIDEpLT51LmF1eGVudCksCi0JCQkJIHR5cGUsCi0JCQkJIGNsYXNzLAotCQkJCSBqLAotCQkJCSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4LAotCQkJCSBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCBhdXhlc3osIGFiZmQpICE9IGF1eGVzeikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBidWYpOwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgaW5kZXggZm9yIHVzZSB3aGVuIHdlIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgc2V0X2luZGV4IChzeW1ib2wsICp3cml0dGVuKTsKLQotICAqd3JpdHRlbiArPSBudW1hdXggKyAxOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3ltYm9sIHRvIGEgQ09GRiBmaWxlIHRoYXQgZG9lcyBub3QgY29tZSBmcm9tIGEgQ09GRgotICAgZmlsZSBvcmlnaW5hbGx5LiAgVGhpcyBzeW1ib2wgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIsCi0gICBvciB3ZSBtYXkgYmUgbGlua2luZyBhIG5vbiBDT0ZGIGZpbGUgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9hbGllbl9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSBkdW1teTsKLQotICBuYXRpdmUgPSAmZHVtbXk7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAwOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0gICAgewotICAgICAgLyogVGhlcmUgaXNuJ3QgbXVjaCBwb2ludCB0byB3cml0aW5nIG91dCBhIGRlYnVnZ2luZyBzeW1ib2wKLSAgICAgICAgIHVubGVzcyB3ZSBhcmUgcHJlcGFyZWQgdG8gY29udmVydCBpdCBpbnRvIENPRkYgZGVidWdnaW5nCi0gICAgICAgICBmb3JtYXQuICBTbywgd2UganVzdCBpZ25vcmUgdGhlbS4gIFdlIG11c3QgY2xvYmJlciB0aGUgc3ltYm9sCi0gICAgICAgICBuYW1lIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBwdXQgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gICAgICBzeW1ib2wtPm5hbWUgPSAiIjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gKHN5bWJvbC0+dmFsdWUKLQkJCQkgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0gICAgICAgICBGSVhNRTogV2h5PyAgKi8KLSAgICAgIHsKLQljb2ZmX3N5bWJvbF90eXBlICpjID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQlpZiAoYyAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQotCSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gYmZkX2FzeW1ib2xfYmZkICgmYy0+c3ltYm9sKS0+ZmxhZ3M7Ci0gICAgICB9Ci0gICAgfQotCi0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gMDsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKLSAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBvYmpfcGUgKGFiZmQpID8gQ19OVF9XRUFLIDogQ19XRUFLRVhUOwotICBlbHNlCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfRVhUOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID0gMDsKLQotICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJICAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOwotfQotCi0vKiBXcml0ZSBhIG5hdGl2ZSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlID0gc3ltYm9sLT5uYXRpdmU7Ci0gIGFsZW50ICpsaW5lbm8gPSBzeW1ib2wtPmxpbmVubzsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gYXNzb2NpYXRlZCBsaW5lIG51bWJlciwgd2UgbXVzdCBzdG9yZSB0aGUKLSAgICAgc3ltYm9sIGluZGV4IGluIHRoZSBsaW5lIG51bWJlciBmaWVsZC4gIFdlIGFsc28gdGFnIHRoZSBhdXhlbnQgdG8KLSAgICAgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBsaW5lbm8gdGFibGUuICAqLwotICBpZiAobGluZW5vICYmICFzeW1ib2wtPmRvbmVfbGluZW5vICYmIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLSAgICAgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgPSAqd3JpdHRlbjsKLSAgICAgIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYSA9ICYoKG5hdGl2ZSArIDEpLT51LmF1eGVudCk7Ci0KLQkgIGEtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zOwotCX0KLQotICAgICAgLyogQ291bnQgYW5kIHJlbG9jYXRlIGFsbCBvdGhlciBsaW5lbnVtYmVycy4gICovCi0gICAgICBjb3VudCsrOwotICAgICAgd2hpbGUgKGxpbmVub1tjb3VudF0ubGluZV9udW1iZXIgIT0gMCkKLQl7Ci0jaWYgMAotCSAgLyogMTMgYXByaWwgOTIuIHNhYyAKLQkgICAgIEkndmUgYmVlbiB0b2xkIHRoaXMsIGJ1dCBzdGlsbCBuZWVkIHByb29mOgotCSAgICAgPiBUaGUgc2Vjb25kIGJ1ZyBpcyBhbHNvIGluIGBiZmQvY29mZmNvZGUuaCcuICBUaGlzIGJ1ZwotCSAgICAgPiBjYXVzZXMgdGhlIGxpbmtlciB0byBzY3JldyB1cCB0aGUgcGMtcmVsb2NhdGlvbnMgZm9yCi0JICAgICA+IGFsbCB0aGUgbGluZSBudW1iZXJzIGluIENPRkYgY29kZS4gIFRoaXMgYnVnIGlzbid0IG9ubHkKLQkgICAgID4gc3BlY2lmaWMgdG8gQTI5SyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCBhZmZlY3RzIGFsbAotCSAgICAgPiBzeXN0ZW1zIHVzaW5nIENPRkYgZm9ybWF0IGJpbmFyaWVzLiAgTm90ZSB0aGF0IGluIENPRkYKLQkgICAgID4gb2JqZWN0IGZpbGVzLCB0aGUgbGluZSBudW1iZXIgY29yZSBvZmZzZXRzIG91dHB1dCBieQotCSAgICAgPiB0aGUgYXNzZW1ibGVyIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgZWFjaAotCSAgICAgPiBwcm9jZWR1cmUsIG5vdCB0byB0aGUgc3RhcnQgb2YgdGhlIC50ZXh0IHNlY3Rpb24uICBUaGlzCi0JICAgICA+IHBhdGNoIHJlbG9jYXRlcyB0aGUgbGluZSBudW1iZXJzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgPiBgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlJyBpbnN0ZWFkIG9mIHRoZSBzZWN0aW9uCi0JICAgICA+IHZpcnR1YWwgYWRkcmVzcy4KLQkgICAgID4gbW9kdWxhciFvbHNvbkBjcy5hcml6b25hLmVkdSAoSm9uIE9sc29uKQotCSAgICovCi0JICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9IG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9Ci0JICAgIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICArIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0JICBjb3VudCsrOwotCX0KLSAgICAgIHN5bWJvbC0+ZG9uZV9saW5lbm8gPSB0cnVlOwotCi0gICAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bW92aW5nX2xpbmVfZmlsZXBvcyArPQotCWNvdW50ICogYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCAmKHN5bWJvbC0+c3ltYm9sKSwgbmF0aXZlLCB3cml0dGVuLAotCQkJICAgIHN0cmluZ19zaXplX3AsIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkgICAgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgQ09GRiBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3RyaW5nX3NpemU7Ci0gIGFzZWN0aW9uICpkZWJ1Z19zdHJpbmdfc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19zdHJpbmdfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW1pdCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgd3JpdHRlbiA9IDA7Ci0gIGFzeW1ib2wgKipwOwotCi0gIHN0cmluZ19zaXplID0gMDsKLSAgZGVidWdfc3RyaW5nX3NlY3Rpb24gPSBOVUxMOwotICBkZWJ1Z19zdHJpbmdfc2l6ZSA9IDA7Ci0KLSAgLyogSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLCB0aGV5IG11c3QgYmUgcHV0IGludG8KLSAgICAgdGhlIHN0cmluZyB0YWJsZS4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IFBFLiAgVGhpcyBjb2RlIG11c3QKLSAgICAgaGFuZGxlIHNlY3Rpb24gbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluCi0gICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIGxlbiA9IHN0cmxlbiAoby0+bmFtZSk7Ci0JICBpZiAobGVuID4gU0NOTk1MRU4pCi0JICAgIHN0cmluZ19zaXplICs9IGxlbiArIDE7Ci0JfQotICAgIH0KLQotICAvKiBTZWVrIHRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPdXRwdXQgYWxsIHRoZSBzeW1ib2xzIHdlIGhhdmUgKi8KLQotICB3cml0dGVuID0gMDsKLSAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltYm9sID0gKnA7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0KLSAgICAgIGlmIChjX3N5bWJvbCA9PSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCi0JICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IChjb21iaW5lZF9lbnRyeV90eXBlICopIE5VTEwpCi0JewotCSAgaWYgKCFjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCAmd3JpdHRlbiwgJnN0cmluZ19zaXplLAotCQkJCQkmZGVidWdfc3RyaW5nX3NlY3Rpb24sCi0JCQkJCSZkZWJ1Z19zdHJpbmdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIGNfc3ltYm9sLCAmd3JpdHRlbiwKLQkJCQkJICZzdHJpbmdfc2l6ZSwgJmRlYnVnX3N0cmluZ19zZWN0aW9uLAotCQkJCQkgJmRlYnVnX3N0cmluZ19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gd3JpdHRlbjsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHN0cmluZ3MgKi8KLQotICBpZiAoc3RyaW5nX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IHN0cmluZ19zaXplICsgU1RSSU5HX1NJWkVfU0laRTsKLSAgICAgIGJmZF9ieXRlIGJ1ZmZlcltTVFJJTkdfU0laRV9TSVpFXTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzaXplLCBidWZmZXIpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCkgIT0gc2l6ZW9mIChidWZmZXIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4gIFRoaXMgY29kZSBtdXN0IGhhbmRsZSBzZWN0aW9uCi0JIG5hbWVzIGp1c3QgYXMgdGhleSBhcmUgaGFuZGxlZCBpbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKLQkgICAgICBpZiAobGVuID4gU0NOTk1MRU4pCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlIChvLT5uYW1lLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOwotCSAgIGkgPCBsaW1pdDsKLQkgICBpKyssIHArKykKLQl7Ci0JICBhc3ltYm9sICpxID0gKnA7Ci0JICBzaXplX3QgbmFtZV9sZW5ndGggPSBzdHJsZW4gKHEtPm5hbWUpOwotCSAgY29mZl9zeW1ib2xfdHlwZSAqY19zeW1ib2wgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBxKTsKLQkgIHNpemVfdCBtYXhsZW47Ci0KLQkgIC8qIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgc3ltYm9sIG5hbWUgc2hvdWxkIGdvIGluIHRoZSBzdHJpbmcKLQkgICAgIHRhYmxlLiAgU3ltYm9sIG5hbWVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhcmUgc3RvcmVkCi0JICAgICBkaXJlY3RseSBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIEZpbGUgbmFtZXMgcGVybWl0IGEKLQkgICAgIGRpZmZlcmVudCwgbG9uZ2VyLCBsZW5ndGggaW4gdGhlIHN5bWVudCBzdHJ1Y3R1cmUuICBPbgotCSAgICAgWENPRkYsIHNvbWUgc3ltYm9sIG5hbWVzIGFyZSBzdG9yZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCi0JICAgICByYXRoZXIgdGhhbiBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQotCSAgaWYgKGNfc3ltYm9sID09IE5VTEwKLQkgICAgICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5vdCBhIENPRkYgc3ltYm9sLCBzbyBpdCBjZXJ0YWlubHkgaXMgbm90IGEKLQkgICAgICAgICBmaWxlIG5hbWUsIG5vciBkb2VzIGl0IGdvIGluIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0JICAgICAgbWF4bGVuID0gYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXNfaW5fc3RyaW5ncyAoYWJmZCkgPyAwIDogU1lNTk1MRU47Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsCi0JCQkJCSAgICAgICZjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbi4KLQkgICAgICAgICBEb24ndCB3cml0ZSBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgICAgIG1heGxlbiA9IG5hbWVfbGVuZ3RoOwotCSAgICB9Ci0JICBlbHNlIGlmIChjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKLQkJICAgJiYgY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9jb2ZmX2ZvcmNlX3N5bW5hbWVzX2luX3N0cmluZ3MgKGFiZmQpKSAKLSAgICAgIAkJYmZkX3dyaXRlICgiLmZpbGUiLCAxLCA2LCBhYmZkKTsKLQkgICAgICBtYXhsZW4gPSBiZmRfY29mZl9maWxubWxlbiAoYWJmZCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbWF4bGVuID0gYmZkX2NvZmZfZm9yY2Vfc3ltbmFtZXNfaW5fc3RyaW5ncyAoYWJmZCkgPyAwIDogU1lNTk1MRU47Ci0KLQkgIGlmIChuYW1lX2xlbmd0aCA+IG1heGxlbikKLQkgICAgewotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChxLT5uYW1lKSwgMSwgbmFtZV9sZW5ndGggKyAxLCBhYmZkKQotCQkgICE9IG5hbWVfbGVuZ3RoICsgMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG5vdCB3cml0ZSBhbnl0aGluZyBoZXJlLCBidXQgd2UnbGwgd3JpdGUKLSAgICAgICAgIG91dCA0IHNvIHRoYXQgYW55IHN0dXBpZCBjb2ZmIHJlYWRlciB3aGljaCB0cmllcyB0byByZWFkIHRoZQotICAgICAgICAgc3RyaW5nIHRhYmxlIGV2ZW4gd2hlbiB0aGVyZSBpc24ndCBvbmUgd29uJ3QgY3JvYWsuICAqLwotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkKLQkgICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIC5kZWJ1ZyBzZWN0aW9uIHdhcyBjcmVhdGVkIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUuCi0gICAgIFdlIHNob3VsZCBjcmVhdGUgaXQgb3Vyc2VsdmVzIG9uIHRoZSBmbHksIGJ1dCB3ZSBkb24ndCBiZWNhdXNlCi0gICAgIEJGRCB3b24ndCBsZXQgdXMgd3JpdGUgdG8gYW55IHNlY3Rpb24gdW50aWwgd2Uga25vdyBob3cgbGFyZ2UgYWxsCi0gICAgIHRoZSBzZWN0aW9ucyBhcmUuICBXZSBjb3VsZCBzdGlsbCBkbyBpdCBieSBtYWtpbmcgYW5vdGhlciBwYXNzCi0gICAgIG92ZXIgdGhlIHN5bWJvbHMuICBGSVhNRS4gICovCi0gIEJGRF9BU1NFUlQgKGRlYnVnX3N0cmluZ19zaXplID09IDAKLQkgICAgICB8fCAoZGVidWdfc3RyaW5nX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwKLQkJICAmJiAoQkZEX0FMSUdOIChkZWJ1Z19zdHJpbmdfc2l6ZSwKLQkJCQkgMSA8PCBkZWJ1Z19zdHJpbmdfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCQkgICAgICA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbikpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBQVFIgYnVmZjsKLQotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBidWZmID0gYmZkX2FsbG9jIChhYmZkLCBsaW5lc3opOwotICBpZiAoIWJ1ZmYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmxpbmVub19jb3VudCkKLQl7Ci0JICBhc3ltYm9sICoqcSA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZpbmQgYWxsIHRoZSBsaW5lbnVtYmVycyBpbiB0aGlzIHNlY3Rpb24gKi8KLQkgIHdoaWxlICgqcSkKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnAgPSAqcTsKLQkgICAgICBpZiAocC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gcykKLQkJewotCQkgIGFsZW50ICpsID0KLQkJICBCRkRfU0VORCAoYmZkX2FzeW1ib2xfYmZkIChwKSwgX2dldF9saW5lbm8sCi0JCQkgICAgKGJmZF9hc3ltYm9sX2JmZCAocCksIHApKTsKLQkJICBpZiAobCkKLQkJICAgIHsKLQkJICAgICAgLyogRm91bmQgYSBsaW5lbnVtYmVyIGVudHJ5LCBvdXRwdXQgKi8KLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBvdXQ7Ci0JCSAgICAgIG1lbXNldCAoKFBUUikgJiBvdXQsIDAsIHNpemVvZiAob3V0KSk7Ci0JCSAgICAgIG91dC5sX2xubm8gPSAwOwotCQkgICAgICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBsKys7Ci0JCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJCXsKLQkJCSAgb3V0LmxfbG5ubyA9IGwtPmxpbmVfbnVtYmVyOwotCQkJICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgbCsrOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgcSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCAqLwotYWxlbnQgKgotY29mZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubzsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scywgd2hpY2ggaGFzIGJlZW4KLSAgIGRpc2FibGVkLiAgKi8KLQotYXN5bWJvbCAqCi1jb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOwotICBhc3ltYm9sICpzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNzeW07Ci0KLSAgc3ltID0gc2VjLT5zeW1ib2w7Ci0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmU7Ci0gIC8qIE1ha2Ugc3VyZSBiYWNrLWVuZCBDT0ZGIHN0dWZmIGlzIHRoZXJlLiAgKi8KLSAgaWYgKGNzeW0gPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZm9vCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSBzeW07Ci0JICAvKiBAQEZJWE1FIFRoaXMgc2hvdWxkbid0IHVzZSBhIGZpeGVkIHNpemUhISAgKi8KLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgZVsxMF07Ci0JfTsKLSAgICAgIHN0cnVjdCBmb28gKmY7Ci0gICAgICBmID0gKHN0cnVjdCBmb28gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpmKSk7Ci0gICAgICBpZiAoIWYpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgZiwgMCwgc2l6ZW9mICgqZikpOwotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlID0gY3N5bSA9IGYtPmU7Ci0gICAgfQotICBjc3ltWzBdLnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBjc3ltWzBdLnUuc3ltZW50Lm5fbnVtYXV4ID0gMTsKLS8qICBTRl9TRVRfU1RBVElDUyAoc3ltKTsgICAgICAgQEAgPz8/ICovCi0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9zY25sZW4gPSBzZWMtPl9yYXdfc2l6ZTsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25yZWxvYyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ubGlubm8gPSBzZWMtPmxpbmVub19jb3VudDsKLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPm91dHB1dF9vZmZzZXQgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3ltOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIG9mZnNldHMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGludG8KLSAgIHBvaW50ZXJzIHRvIHN5bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eGVudDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGUgPSBzeW1ib2wtPnUuc3ltZW50Lm5fdHlwZTsKLSAgdW5zaWduZWQgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKLSAgICB7Ci0gICAgICBpZiAoKCpjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotCSAgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGlmIHRoaXMgaXMgYSBmaWxlIG9yIGEgc2VjdGlvbiAqLwotICBpZiAoY2xhc3MgPT0gQ19TVEFUICYmIHR5cGUgPT0gVF9OVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGNsYXNzID09IENfRklMRSkKLSAgICByZXR1cm47Ci0KLSAgLyogT3RoZXJ3aXNlIHBhdGNoIHVwICovCi0jZGVmaW5lIE5fVE1BU0sgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdAotICBpZiAoKElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpIHx8IGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04pCi0gICAgICAmJiBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X2VuZCA9IDE7Ci0gICAgfQotICAvKiBBIG5lZ2F0aXZlIHRhZ25keCBpcyBtZWFuaW5nbGVzcywgYnV0IHRoZSBTQ08gMy4ydjQgY2MgY2FuCi0gICAgIGdlbmVyYXRlIG9uZSwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGlnbm9yZSBpdC4gICovCi0gIGlmIChhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X3RhZyA9IDE7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlICIuZGVidWciIHNlY3Rpb24sIGFuZCByZWFkIGl0LgotICAgV2UgZGlkIG5vdCByZWFkIHRoZSBkZWJ1ZyBzZWN0aW9uIHVudGlsIG5vdywgYmVjYXVzZQotICAgd2UgZGlkbid0IHdhbnQgdG8gZ28gdG8gdGhlIHRyb3VibGUgdW50aWwgc29tZW9uZSBuZWVkZWQgaXQuICovCi0KLXN0YXRpYyBjaGFyICoKLWJ1aWxkX2RlYnVnX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqZGVidWdfc2VjdGlvbjsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBhc2VjdGlvbiAqc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0KLSAgaWYgKCFzZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBkZWJ1Z19zZWN0aW9uID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpOwotICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYC5kZWJ1Zycgc2VjdGlvbiBhbmQgcmVhZCBpdC4gCi0gICAgIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZmlyc3Q7IGl0IGlzIG5lZWRlZCBieSBvdXIgY2FsbGVyLgotICAgICBUaGVuIHJlYWQgZGVidWcgc2VjdGlvbiBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlci4gICovCi0KLSAgcG9zaXRpb24gPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdC0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoZGVidWdfc2VjdGlvbiwKLQkJICAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCksIDEsIGFiZmQpCi0JICAhPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKQotICAgICAgfHwgYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGRlYnVnX3NlY3Rpb247Ci19Ci0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIG1hbGxvYydkIGNvcHkgb2YgJ25hbWUnLiAgJ25hbWUnIG1heSBub3QgYmUKLSAgIFwwLXRlcm1pbmF0ZWQsIGJ1dCB3aWxsIG5vdCBleGNlZWQgJ21heGxlbicgY2hhcmFjdGVycy4gIFRoZSBjb3B5ICp3aWxsKgotICAgYmUgXDAtdGVybWluYXRlZC4gICovCi1zdGF0aWMgY2hhciAqCi1jb3B5X25hbWUgKGFiZmQsIG5hbWUsIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbWF4bGVuOwotewotICBpbnQgbGVuOwotICBjaGFyICpuZXduYW1lOwotCi0gIGZvciAobGVuID0gMDsgbGVuIDwgbWF4bGVuOyArK2xlbikKLSAgICB7Ci0gICAgICBpZiAobmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoKG5ld25hbWUgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpKSA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHN0cm5jcHkgKG5ld25hbWUsIG5hbWUsIGxlbik7Ci0gIG5ld25hbWVbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiBuZXduYW1lOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzaXplX3Qgc2l6ZTsKLSAgUFRSIHN5bXM7Ci0KLSAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotCi0gIHN5bXMgPSAoUFRSKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChzeW1zLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChzeW1zICE9IE5VTEwpCi0JZnJlZSAoc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3RyaW5ncy4gIFRoZSBzdHJpbmdzIGFyZSBub3QgbG9hZGVkIHVudGlsCi0gICB0aGV5IGFyZSBuZWVkZWQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mCi0gICBkZXRlY3RpbmcgYSBtaXNzaW5nIHN0cmluZyB0YWJsZSBpbiBhbiBhcmNoaXZlLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBleHRzdHJzaXplW1NUUklOR19TSVpFX1NJWkVdOwotICBzaXplX3Qgc3Ryc2l6ZTsKLSAgY2hhciAqc3RyaW5nczsKLQotICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0KLSAgaWYgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoZXh0c3Ryc2l6ZSwgc2l6ZW9mIGV4dHN0cnNpemUsIDEsIGFiZmQpICE9IHNpemVvZiBleHRzdHJzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN0cnNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIHN0cnNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHRzdHJzaXplKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotICAgIH0KLQotICBpZiAoc3Ryc2l6ZSA8IFNUUklOR19TSVpFX1NJWkUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc3RyaW5nIHRhYmxlIHNpemUgJWx1IiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAodW5zaWduZWQgbG9uZykgc3Ryc2l6ZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3Ryc2l6ZSk7Ci0gIGlmIChzdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkIChzdHJpbmdzICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmdzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0KLSAgcmV0dXJuIHN0cmluZ3M7Ci19Ci0KLS8qIEZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3MgcmVhZCBmcm9tIGEgQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGZyZWUgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBzeW1ib2wgdGFibGUgaW50byBmcmVzaGx5IGJmZF9hbGxvY2F0ZWQgbWVtb3J5LCBzd2FwIGl0LCBhbmQKLSAgIGtuaXQgdGhlIHN5bWJvbCBuYW1lcyBpbnRvIGEgbm9ybWFsaXplZCBmb3JtLiAgQnkgbm9ybWFsaXplZCBoZXJlIEkKLSAgIG1lYW4gdGhhdCBhbGwgc3ltYm9scyBoYXZlIGFuIG5fb2Zmc2V0IHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBudWxsLQotICAgdGVybWluYXRlZCBzdHJpbmcuICAqLwotCi1jb21iaW5lZF9lbnRyeV90eXBlICoKLWNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsOwotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX2VuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGNoYXIgKnJhd19zcmM7Ci0gIGNoYXIgKnJhd19lbmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ190YWJsZSA9IE5VTEw7Ci0gIGNoYXIgKmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0KLSAgaWYgKG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKTsKLSAgaW50ZXJuYWwgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpbnRlcm5hbF9lbmQgPSBpbnRlcm5hbCArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJhd19zcmMgPSAoY2hhciAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBtYXJrIHRoZSBlbmQgb2YgdGhlIHN5bWJvbHMgKi8KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgcmF3X2VuZCA9IChjaGFyICopIHJhd19zcmMgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgLyogRklYTUUgU09NRURBWS4gIEEgc3RyaW5nIHRhYmxlIHNpemUgb2YgemVybyBpcyB2ZXJ5IHdlaXJkLCBidXQKLSAgICAgcHJvYmFibHkgcG9zc2libGUuICBJZiBvbmUgc2hvd3MgdXAsIGl0IHdpbGwgcHJvYmFibHkga2lsbCB1cy4gICovCi0KLSAgLyogU3dhcCBhbGwgdGhlIHJhdyBlbnRyaWVzICovCi0gIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gICAgICAgcmF3X3NyYyA8IHJhd19lbmQ7Ci0gICAgICAgcmF3X3NyYyArPSBzeW1lc3osIGludGVybmFsX3B0cisrKQotICAgIHsKLQotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCSAgICAoUFRSKSAmIGludGVybmFsX3B0ci0+dS5zeW1lbnQpOwotICAgICAgc3ltYm9sX3B0ciA9IGludGVybmFsX3B0cjsKLQotICAgICAgZm9yIChpID0gMDsKLQkgICBpIDwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0JICAgaSsrKQotCXsKLQkgIGludGVybmFsX3B0cisrOwotCSAgcmF3X3NyYyArPSBzeW1lc3o7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3R5cGUsCi0JCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCQkJaSwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJJihpbnRlcm5hbF9wdHItPnUuYXV4ZW50KSk7Ci0JICBjb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCBpbnRlcm5hbCwgc3ltYm9sX3B0ciwgaSwKLQkJCSAgICAgICBpbnRlcm5hbF9wdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB0aGUgcmF3IHN5bWJvbHMsIGJ1dCBub3QgdGhlIHN0cmluZ3MgKGlmIHdlIGhhdmUgdGhlbSkuICAqLwotICBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpID0gdHJ1ZTsKLSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsgaW50ZXJuYWxfcHRyIDwgaW50ZXJuYWxfZW5kOwotICAgICAgIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCSAgJiYgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JewotCSAgLyogbWFrZSBhIGZpbGUgc3ltYm9sIHBvaW50IHRvIHRoZSBuYW1lIGluIHRoZSBhdXhlbnQsIHNpbmNlCi0JICAgICB0aGUgdGV4dCAiLmZpbGUiIGlzIHJlZHVuZGFudCAqLwotCSAgaWYgKChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X3plcm9lcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogdGhlIGZpbGVuYW1lIGlzIGEgbG9uZyBvbmUsIHBvaW50IGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkoKGxvbmcpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgc2hvcnQgZmlsZW5hbWUsIHB1dCBpbnRvIG1lbW9yeSBhbnl3YXkuICBUaGUKLSAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFBFIHRvb2xzIHNvbWV0aW1lcyBzdG9yZSBhIGZpbGVuYW1lIGluCi0gICAgICAgICAgICAgICAgIG11bHRpcGxlIEFVWCBlbnRyaWVzLiAgKi8KLQkgICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDEKLQkJICAmJiBjb2ZmX2RhdGEgKGFiZmQpLT5wZSkKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggKiBzeW1lc3opKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWJmZF9jb2ZmX2ZpbG5tbGVuIChhYmZkKSkpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSAic2hvcnQiIG5hbWUuICBNYWtlIGl0IGxvbmcuICAqLwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0JICAgICAgY2hhciAqbmV3c3RyaW5nID0gTlVMTDsKLQotCSAgICAgIC8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyB3aXRob3V0IHdhbGtpbmcgaW50byBtZW1vcnkKLQkgICAgICAgICB0aGF0IGlzbid0IG91cnMuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JCXsKLQkJICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lW2ldID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogaWYgZW5kIG9mIHN0cmluZyAqLwotCQl9CQkvKiBwb3NzaWJsZSBsZW5ndGhzIG9mIHRoaXMgc3RyaW5nLiAqLwotCi0JICAgICAgaWYgKChuZXdzdHJpbmcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsICsraSkpID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JICAgICAgbWVtc2V0IChuZXdzdHJpbmcsIDAsIGkpOwotCSAgICAgIHN0cm5jcHkgKG5ld3N0cmluZywgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lLCBpIC0gMSk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgbmV3c3RyaW5nOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpICIiOwotCSAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZpbnRlcm5hbF9wdHItPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBhbHJlYWR5LiAgUG9pbnQgc3ltYm9sIGF0IHRoZSBzdHJpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIHRhYmxlLiAgKi8KLQkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZyBpbnQpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBpbiBkZWJ1ZyBzZWN0aW9uLiAgVmVyeSBzaW1pbGFyLiAgKi8KLQkgICAgICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotCQlkZWJ1Z19zZWN0aW9uID0gYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkKLQkJKGRlYnVnX3NlY3Rpb24gKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICAgIGludGVybmFsX3B0ciArPSBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gaW50ZXJuYWw7Ci0gIEJGRF9BU1NFUlQgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCSAgICAgID09ICh1bnNpZ25lZCBpbnQpIChpbnRlcm5hbF9wdHIgLSBpbnRlcm5hbCkpOwotCi0gIHJldHVybiAoaW50ZXJuYWwpOwotfQkJCQkvKiBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYigpICovCi0KLWxvbmcKLWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLWFzeW1ib2wgKgotY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gIG5ldy0+bmF0aXZlID0gMDsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHN6KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyBzeiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgLyogQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuZXctPm5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCk7Ci0gIGlmICghbmV3LT5uYXRpdmUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLypBUkdTVVNFRCAqLwotdm9pZAotY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgIT0gTlVMTAotICAgICAgJiYgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT5maXhfdmFsdWUpCi0gICAgewotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqcHN5bTsKLQotICAgICAgcHN5bSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKQotCSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0gICAgICByZXQtPnZhbHVlID0gKGJmZF92bWEpIChwc3ltIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIENPRkYgc3ltZW50IGZvciBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bWJvbCwgcHN5bWVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW07Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0gIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnBzeW1lbnQgPSBjc3ltLT5uYXRpdmUtPnUuc3ltZW50OwotCi0gIGlmIChjc3ltLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICBwc3ltZW50LT5uX3ZhbHVlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBzeW1lbnQtPm5fdmFsdWUKLQkJCS0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgZml4X2xpbmUgaGVyZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBhdXhlbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltYm9sLCBpbmR4LCBwYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IGluZHg7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50OwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gIGlmIChjc3ltID09IE5VTEwKLSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0gICAgICB8fCBpbmR4ID49IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50ID0gY3N5bS0+bmF0aXZlICsgaW5keCArIDE7Ci0KLSAgKnBhdXhlbnQgPSBlbnQtPnUuYXV4ZW50OwotCi0gIGlmIChlbnQtPmZpeF90YWcpCi0gICAgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9zeW0ueF90YWduZHgucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgaWYgKGVudC0+Zml4X2VuZCkKLSAgICBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfc2NubGVuKQotICAgIHBhdXhlbnQtPnhfY3NlY3QueF9zY25sZW4ubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IENPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvZmYgJXMgJXMiLAotCSAgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgaW50IGF1eDsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNvbWJpbmVkID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcm9vdCA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0JICBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotCi0JICBmcHJpbnRmIChmaWxlLCAiWyUzbGRdIiwgKGxvbmcpIChjb21iaW5lZCAtIHJvb3QpKTsKLQotCSAgaWYgKCEgY29tYmluZWQtPmZpeF92YWx1ZSkKLQkgICAgdmFsID0gKHVuc2lnbmVkIGxvbmcpIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgZWxzZQotCSAgICB2YWwgPSAoKHVuc2lnbmVkIGxvbmcpCi0JCSAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBjb21iaW5lZC0+dS5zeW1lbnQubl92YWx1ZQotCQkgICAgLSByb290KSk7Ci0KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICIoc2VjICUyZCkoZmwgMHglMDJ4KSh0eSAlM3gpKHNjbCAlM2QpIChueCAlZCkgMHglMDhseCAlcyIsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbnVtLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9mbGFncywKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXgsCi0JCSAgIHZhbCwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQotCSAgZm9yIChhdXggPSAwOyBhdXggPCBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXg7IGF1eCsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4cCA9IGNvbWJpbmVkICsgYXV4ICsgMTsKLQkgICAgICBsb25nIHRhZ25keDsKLQotCSAgICAgIGlmIChhdXhwLT5maXhfdGFnKQotCQl0YWduZHggPSBhdXhwLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wIC0gcm9vdDsKLQkgICAgICBlbHNlCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotCSAgICAgIGlmIChiZmRfY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHJvb3QsIGNvbWJpbmVkLCBhdXhwLCBhdXgpKQotCQljb250aW51ZTsKLQotCSAgICAgIHN3aXRjaCAoY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzKQotCQl7Ci0JCWNhc2UgQ19GSUxFOgotCQkgIGZwcmludGYgKGZpbGUsICJGaWxlICIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQ19TVEFUOgotCQkgIGlmIChjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkJICAgIC8qIHByb2JhYmx5IGEgc2VjdGlvbiBzeW1ib2w/ICovCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggc2NubGVuIDB4JWx4IG5yZWxvYyAlZCBubG5ubyAlZCIsCi0JCQkgICAgICAgKGxvbmcpIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vKTsKLQkJICAgICAgaWYgKGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0gIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQgIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2NvbWRhdCAhPSAwKQotCQkJZnByaW50ZiAoZmlsZSwgIiBjaGVja3N1bSAweCVseCBhc3NvYyAlZCBjb21kYXQgJWQiLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2NoZWNrc3VtLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIENfRVhUOgotCQkgIGlmIChJU0ZDTiAoY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSkpCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsCi0JCQkgICAgICAgXygiQVVYIHRhZ25keCAlbGQgdHRsc2l6IDB4JWx4IGxubm9zICVsZCBuZXh0ICVsZCIpLAotCQkJICAgICAgIHRhZ25keCwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkgICAgICAgKGF1eHAtPmZpeF9lbmQKLQkJCQk/ICgobG9uZykKLQkJCQkgICAoYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucAotCQkJCSAgICAtIHJvb3QpKQotCQkJCTogYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGZpbGUsICJBVVggbG5ubyAlZCBzaXplIDB4JXggdGFnbmR4ICVsZCIsCi0JCQkgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJICAgdGFnbmR4KTsKLQkJICBpZiAoYXV4cC0+Zml4X2VuZCkKLQkJICAgIGZwcmludGYgKGZpbGUsICIgZW5kbmR4ICVsZCIsCi0JCQkgICAgICgobG9uZykKLQkJCSAgICAgIChhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0JCQkgICAgICAgLSByb290KSkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4lcyA6IiwgbC0+dS5zeW0tPm5hbWUpOwotCSAgICAgIGwrKzsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIpCi0JCXsKLQkJICBmcHJpbnRmIChmaWxlLCAiXG4lNGQgOiAweCVseCIsCi0JCQkgICBsLT5saW5lX251bWJlciwKLQkJCSAgICgodW5zaWduZWQgbG9uZykKLQkJCSAgICAobC0+dS5vZmZzZXQgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYSkpKTsKLQkJICBsKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzICVzICVzIiwKLQkJICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCQkgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIiwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBJbiBDT0ZGLAotICAgbG9jYWwgc3ltYm9scyBnZW5lcmFsbHkgc3RhcnQgd2l0aCBgYC5MJycuICBNb3N0IHRhcmdldHMgdXNlIHRoaXMKLSAgIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUgbWF5Ci0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnOwotfQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgKGluIGJ5dGVzLCBub3Qgb2N0ZXRzKSBpbnRvIHRoZQotICAgc2VjdGlvbiwgY2FsY3VsYXRlIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZQotICAgbmVhcmVzdCB0byB0aGUgd2FudGVkIGxvY2F0aW9uLiAgKi8KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW5lX2Jhc2U7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2YgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICAvKiBSdW4gdGhyb3VnaCB0aGUgcmF3IHN5bWVudHMgaWYgYXZhaWxhYmxlICovCi0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnA7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBlbmQ7Ci0gIGFsZW50ICpsOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNfZGF0YTsKLQotICAvKiBCZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUsIHRyeSB0byB1c2UgYSAuc3RhYgotICAgICBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmY29mZl9kYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqZmlsZW5hbWVfcHRyID0gMDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotCi0gIC8qIERvbid0IHRyeSBhbmQgZmluZCBsaW5lIG51bWJlcnMgaW4gYSBub24gY29mZiBmaWxlICovCi0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IENfRklMRSBzeW1ib2wuICAqLwotICBwID0gY29mLT5yYXdfc3ltZW50czsKLSAgaWYgKCFwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZW5kID0gcCArIGNvZi0+cmF3X3N5bWVudF9jb3VudDsKLSAgd2hpbGUgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGlmIChwLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JYnJlYWs7Ci0gICAgICBwICs9IDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLSAgICB9Ci0KLSAgaWYgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjX3ZtYTsKLSAgICAgIGJmZF92bWEgbWF4ZGlmZjsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBDX0ZJTEUgc3ltYm9scyB0byBmaW5kIHRoZSBiZXN0IG9uZS4gICovCi0gICAgICBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0gICAgICBtYXhkaWZmID0gKGJmZF92bWEpIDAgLSAoYmZkX3ZtYSkgMTsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnAyOwotCi0JICBmb3IgKHAyID0gcCArIDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLQkgICAgICAgcDIgPCBwZW5kOwotCSAgICAgICBwMiArPSAxICsgcDItPnUuc3ltZW50Lm5fbnVtYXV4KQotCSAgICB7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbnVtID4gMAotCQkgICYmIChzZWN0aW9uCi0JCSAgICAgID09IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgIHAyLT51LnN5bWVudC5uX3NjbnVtKSkpCi0JCWJyZWFrOwotCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgcDIgPSBwZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgdXNlIDw9IE1BWERJRkYgaGVyZSBzbyB0aGF0IGlmIHdlIGdldCBhIHplcm8gbGVuZ3RoCi0gICAgICAgICAgICAgZmlsZSwgd2UgYWN0dWFsbHkgdXNlIHRoZSBuZXh0IGZpbGUgZW50cnkuICAqLwotCSAgaWYgKHAyIDwgcGVuZAotCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgPj0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSAtIChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZSA8PSBtYXhkaWZmKQotCSAgICB7Ci0JICAgICAgKmZpbGVuYW1lX3B0ciA9IChjaGFyICopIHAtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0OwotCSAgICAgIG1heGRpZmYgPSBvZmZzZXQgKyBzZWNfdm1hIC0gcDItPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogQXZvaWQgZW5kbGVzcyBsb29wcyBvbiBlcnJvbmVvdXMgZmlsZXMgYnkgZW5zdXJpbmcgdGhhdAotCSAgICAgd2UgYWx3YXlzIG1vdmUgZm9yd2FyZCBpbiB0aGUgZmlsZS4gICovCi0JICBpZiAocCAtIGNvZi0+cmF3X3N5bWVudHMgPj0gcC0+dS5zeW1lbnQubl92YWx1ZSkKLQkgICAgYnJlYWs7Ci0KLQkgIHAgPSBjb2YtPnJhd19zeW1lbnRzICsgcC0+dS5zeW1lbnQubl92YWx1ZTsKLQkgIGlmIChwID4gcGVuZCB8fCBwLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHdhbmRlciB0aG91Z2ggdGhlIHJhdyBsaW5lbnVtYmVycyBvZiB0aGUgc2VjdGlvbiAqLwotICAvKiBJZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIG9uIHRoaXMgc2VjdGlvbiBiZWZvcmUsIGFuZCB0aGUgb2Zmc2V0IHdlCi0gICAgIHdhbnQgaXMgZnVydGhlciBkb3duIHRoZW4gd2UgY2FuIHByaW1lIHRoZSBsb29rdXAgbG9vcC4gICovCi0gIHNlY19kYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc2VjX2RhdGEgIT0gTlVMTAotICAgICAgJiYgc2VjX2RhdGEtPmkgPiAwCi0gICAgICAmJiBvZmZzZXQgPj0gc2VjX2RhdGEtPm9mZnNldCkKLSAgICB7Ci0gICAgICBpID0gc2VjX2RhdGEtPmk7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IHNlY19kYXRhLT5mdW5jdGlvbjsKLSAgICAgIGxpbmVfYmFzZSA9IHNlY19kYXRhLT5saW5lX2Jhc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaSA9IDA7Ci0gICAgICBsaW5lX2Jhc2UgPSAwOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+bGluZW5vICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlID0gMDsKLQotICAgICAgbCA9ICZzZWN0aW9uLT5saW5lbm9baV07Ci0KLSAgICAgIGZvciAoOyBpIDwgc2VjdGlvbi0+bGluZW5vX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCB0aGlzIGxpbmUgbnVtYmVyIHBvaW50cyBhdCAqLwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmYgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSAobC0+dS5zeW0pOwotCSAgICAgIGlmIChjb2ZmLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gY29mZi0+c3ltYm9sLm5hbWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGNvZmYtPnN5bWJvbC52YWx1ZTsKLQkgICAgICBpZiAoY29mZi0+bmF0aXZlKQotCQl7Ci0JCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmYtPm5hdGl2ZTsKLQkJICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKLQotCQkgIC8qIEluIFhDT0ZGIGEgZGVidWdnaW5nIHN5bWJvbCBjYW4gZm9sbG93IHRoZQotCQkgICAgIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0JCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKLQkJICAgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogUyBzaG91bGQgbm93IHBvaW50IHRvIHRoZSAuYmYgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9udW1hdXgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsaW5lbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgYXV4ZW50LiAgKi8KLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigocyArIDEpLT51LmF1eGVudCk7Ci0JCSAgICAgIGxpbmVfYmFzZSA9IGEtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCQkgICAgICAqbGluZV9wdHIgPSBsaW5lX2Jhc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGwtPnUub2Zmc2V0ID4gb2Zmc2V0KQotCQlicmVhazsKLQkgICAgICAqbGluZV9wdHIgPSBsLT5saW5lX251bWJlciArIGxpbmVfYmFzZSAtIDE7Ci0JICAgIH0KLQkgIGwrKzsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGxvb3AsIHRoZW4gYXNzdW1lIHRoYXQgdGhpcwotCSBzeW1ib2wgaGFzIG5vIGxpbmUgbnVtYmVyIGluZm8uICBPdGhlcndpc2UsIHN5bWJvbHMgd2l0aCBubwotCSBsaW5lIG51bWJlciBpbmZvIGdldCByZXBvcnRlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLQkgbGFzdCBsaW5lIG9mIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBkb2VzIGhhdmUgbGluZSBudW1iZXIKLQkgaW5mby4gIFdlIHVzZSAweDEwMCBhcyBhIHNsb3AgdG8gYWNjb3VudCBmb3IgY2FzZXMgd2hlcmUgdGhlCi0JIGxhc3QgbGluZSBoYXMgZXhlY3V0YWJsZSBjb2RlLiAgKi8KLSAgICAgIGlmIChpID49IHNlY3Rpb24tPmxpbmVub19jb3VudAotCSAgJiYgbGFzdF92YWx1ZSAhPSAwCi0JICAmJiBvZmZzZXQgLSBsYXN0X3ZhbHVlID4gMHgxMDApCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotCSAgKmxpbmVfcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KLSAgaWYgKHNlY19kYXRhID09IE5VTEwgJiYgc2VjdGlvbi0+b3duZXIgPT0gYWJmZCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0gICAgICBzZWNfZGF0YSA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICAgIH0KLSAgaWYgKHNlY19kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgc2VjX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKLSAgICAgIHNlY19kYXRhLT5pID0gaTsKLSAgICAgIHNlY19kYXRhLT5mdW5jdGlvbiA9ICpmdW5jdGlvbm5hbWVfcHRyOwotICAgICAgc2VjX2RhdGEtPmxpbmVfYmFzZSA9IGxpbmVfYmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgc2l6ZV90IHNpemU7Ci0KLSAgaWYgKHJlbG9jID09IGZhbHNlKQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgICB9Ci0KLSAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIENoYW5nZSB0aGUgY2xhc3Mgb2YgYSBjb2ZmIHN5bWJvbCBoZWxkIGJ5IEJGRC4gICovCi1ib29sZWFuCi1iZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBzeW1ib2wsIGNsYXNzKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiAgICAgc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgIGNsYXNzOwotewotICBjb2ZmX3N5bWJvbF90eXBlICogY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhbGllbiBzeW1ib2wgd2hpY2ggbm8gbmF0aXZlIGNvZmYgYmFja2VuZCBkYXRhLgotCSBXZSBjaGVhdCBoZXJlIGJ5IGNyZWF0aW5nIGEgZmFrZSBuYXRpdmUgZW50cnkgZm9yIGl0IGFuZAotCSB0aGVuIGZpbGxpbmcgaW4gdGhlIGNsYXNzLiAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoYXQgaW4KLQkgY29mZl93cml0ZV9hbGllbl9zeW1ib2woKS4gICovCi0gICAgICAKLSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBuYXRpdmU7Ci0KLSAgICAgIG5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgaWYgKG5hdGl2ZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0IChuYXRpdmUsIDAsIHNpemVvZiAoKiBuYXRpdmUpKTsKLSAgICAgIAotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICAgIAotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0JICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIAotCSAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0JICAgICBGSVhNRTogV2h5PyAgKi8KLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJiBjc3ltLT5zeW1ib2wpLT5mbGFnczsKLQl9Ci0gICAgICAKLSAgICAgIGNzeW0tPm5hdGl2ZSA9IG5hdGl2ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmbGluay5jIGIvYmZkL2NvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOWY2NjUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEwICswLDAgQEAKLS8qIENPRkYgc3BlY2lmaWMgbGlua2VyIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqZG9yZXNfY29tIFBBUkFNUyAoKGNoYXIgKiwgYmZkICosIGludCkpOwotc3RhdGljIGNoYXIgKmdldF9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotc3RhdGljIGludCBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgbWFya19yZWxvY3MgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci0KLS8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCB0aGUgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4KLSAgIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBpbiB0ZXJtcyBvZgotICAgTl9UTUFTSywgZXRjLiAgVGhlc2UgZGVmaW5pdGlvbnMgcmVxdWlyZSBhIHVzZXIgdG8gZGVmaW5lIGxvY2FsCi0gICB2YXJpYWJsZXMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZXMsIGFuZCB3aXRoIHZhbHVlcyBmcm9tIHRoZQotICAgY29mZl9kYXRhIChhYmZkKSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotI2RlZmluZSBOX0JUTUFTSyBuX2J0bWFzawotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnR5cGUgPSBUX05VTEw7Ci0gICAgICByZXQtPmNsYXNzID0gQ19OVUxMOwotICAgICAgcmV0LT5udW1hdXggPSAwOwotICAgICAgcmV0LT5hdXhiZmQgPSBOVUxMOwotICAgICAgcmV0LT5hdXggPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEdpdmVuIGEgQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAgKGFiZmQsIGluZm8sIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGEgQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBjbGFzc2lmaWNhdGlvbiA9IGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0gICAgICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JICB8fCBjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9DT01NT04pCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgQ09GRiBsaW5rZXJzIGRvIG5vdCBicmluZyBpbiBhbiBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzCi0JICAgICBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBpbnQgbl9idG1hc2sgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzazsKLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0gIGJvb2xlYW4gZGVmYXVsdF9jb3B5OwotICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgLyogS2VlcCB0aGUgc3ltYm9scyBkdXJpbmcgdGhpcyBmdW5jdGlvbiwgaW4gY2FzZSB0aGUgbGlua2VyIG5lZWRzCi0gICAgIHRvIHJlYWQgdGhlIGdlbmVyaWMgc3ltYm9scyBpbiBvcmRlciB0byByZXBvcnQgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb247Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGFiZmQsICZzeW0pOwotICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uICE9IENPRkZfU1lNQk9MX0xPQ0FMKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgIGJmZF92bWEgdmFsdWU7Ci0JICBib29sZWFuIGFkZGl0OwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIHZhbHVlID0gc3ltLm5fdmFsdWU7Ci0KLQkgIHN3aXRjaCAoY2xhc3NpZmljYXRpb24pCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgICBmbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCQl2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgZmxhZ3MgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ09GRl9TWU1CT0xfQ09NTU9OOgotCSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLQkgICAgICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX1BFX1NFQ1RJT046Ci0JICAgICAgZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgICAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKQotCSAgICBmbGFncyA9IEJTRl9XRUFLOwotCi0JICBhZGRpdCA9IHRydWU7Ci0KLQkgIC8qIEluIHRoZSBQRSBmb3JtYXQsIHNlY3Rpb24gc3ltYm9scyBhY3R1YWxseSByZWZlciB0byB0aGUKLSAgICAgICAgICAgICBzdGFydCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBXZSBoYW5kbGUgdGhlbSBzcGVjaWFsbHkKLSAgICAgICAgICAgICBoZXJlLiAgKi8KLQkgIGlmIChvYmpfcGUgKGFiZmQpICYmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgewotCSAgICAgICpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIGlmICgoKCpzeW1faGFzaCktPmNvZmZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MKSA9PSAwCi0JCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoIldhcm5pbmc6IHN5bWJvbCBgJXMnIGlzIGJvdGggc2VjdGlvbiBhbmQgbm9uLXNlY3Rpb24iLAotCQkgICAgICAgbmFtZSk7Ci0KLQkJICBhZGRpdCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgLyogVGhlIE1pY3Jvc29mdCBWaXN1YWwgQyBjb21waWxlciBkb2VzIHN0cmluZyBwb29saW5nIGJ5Ci0JICAgICBoYXNoaW5nIHRoZSBjb25zdGFudHMgdG8gYW4gaW50ZXJuYWwgc3ltYm9sIG5hbWUsIGFuZAotCSAgICAgcmVseWluZyBvbiB0aGUgdGhlIGxpbmtlciBjb21kYXQgc3VwcG9ydCB0byBkaXNjYXJkCi0JICAgICBkdXBsaWNhdGUgbmFtZXMuICBIb3dldmVyLCBpZiBvbmUgc3RyaW5nIGlzIGEgbGl0ZXJhbCBhbmQKLQkgICAgIG9uZSBpcyBhIGRhdGEgaW5pdGlhbGl6ZXIsIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24gYW5kIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBUaGUKLQkgICAgIE1pY3Jvc29mdCBsaW5rZXIgd2lsbCBjb21iaW5lIHRoZW0gaW50byB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24sIHdoaWNoIHNlZW1zIHRvIGJlIHdyb25nIHNpbmNlIGl0IG1pZ2h0IGNhdXNlIHRoZQotCSAgICAgbGl0ZXJhbCB0byBjaGFuZ2UuCi0KLQkgICAgIEFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlCi0JICAgICBzeW1ib2xzLCB3aGljaCB0aGVyZSBzaG91bGRuJ3QgYmUsIHdlIGNhbiB0cmVhdCB0aGUgLmRhdGEKLQkgICAgIGFuZCAucmRhdGEgaW5zdGFuY2VzIGFzIHNlcGFyYXRlIHN5bWJvbHMuICBUaGUgY29tZGF0Ci0JICAgICBjb2RlIGluIHRoZSBsaW5rZXIgd2lsbCBkbyB0aGUgYXBwcm9wcmlhdGUgbWVyZ2luZy4gIEhlcmUKLQkgICAgIHdlIGF2b2lkIGdldHRpbmcgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yIGZvciBvbmUgb2YKLQkgICAgIHRoZXNlIHNwZWNpYWwgc3ltYm9scy4KLQotCSAgICAgRklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIHdvcmsgaW4gdGhlIGNhc2Ugd2hlcmUKLQkgICAgIHRoZXJlIGFyZSB0d28gb2JqZWN0IGZpbGVzIHdoaWNoIHVzZSB0aGUgY29uc3RhbnRzIGFzIGEKLQkgICAgIGxpdGVyYWwgYW5kIHR3byBvYmplY3QgZmlsZXMgd2hpY2ggdXNlIGl0IGFzIGEgZGF0YQotCSAgICAgaW5pdGlhbGl6ZXIuICBPbmUgb3IgdGhlIG90aGVyIG9mIHRoZSBzZWNvbmQgb2JqZWN0IGZpbGVzCi0JICAgICBpcyBnb2luZyB0byB3aW5kIHVwIHdpdGggYW4gaW5hcHByb3ByaWF0ZSByZWZlcmVuY2UuICAqLwotCSAgaWYgKG9ial9wZSAoYWJmZCkKLQkgICAgICAmJiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JCSAgfHwgY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTikKLQkgICAgICAmJiBzZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICI/P18iLCAzKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChuYW1lLCBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCSpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgIG5hbWUsIGZhbHNlLCBjb3B5LCBmYWxzZSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCAhPSBOVUxMCi0JCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAoKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29tZGF0LT5uYW1lLAotCQkJICAgICBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JCWFkZGl0ID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGFkZGl0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLCBjb3B5LCBmYWxzZSwKLQkJICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBpZiAob2JqX3BlIChhYmZkKSAmJiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JICAgICgqc3ltX2hhc2gpLT5jb2ZmX2xpbmtfaGFzaF9mbGFncyB8PQotCSAgICAgIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MOwotCi0JICAvKiBMaW1pdCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCB0byB0aGUgcG9zc2libGUKLSAgICAgICAgICAgICBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLiAgVGhlcmUgaXMgbm8gcG9pbnQgdG8gcGVybWl0dGluZwotICAgICAgICAgICAgIGEgaGlnaGVyIGFsaWdubWVudCBmb3IgYSBjb21tb24gc3ltYm9sOiB3ZSBjYW4gbm90Ci0gICAgICAgICAgICAgZ3VhcmFudGVlIGl0LCBhbmQgaXQgbWF5IGNhdXNlIHVzIHRvIGFsbG9jYXRlIGV4dHJhIHNwYWNlCi0gICAgICAgICAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIKLQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIKLQkJICA+IGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIgKGFiZmQpKSkKLQkgICAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCSAgICAgID0gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCk7Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBzeW1ib2wgaW5mb3JtYXRpb24gY3VycmVudGx5IGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLCBvciBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCB0aGVuIHVwZGF0ZSB0aGUgc3ltYm9sIGNsYXNzIGFuZCB0eXBlIGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgCSAgICAgIGlmICgoKCpzeW1faGFzaCktPmNsYXNzID09IENfTlVMTAotICAJCSAgICYmICgqc3ltX2hhc2gpLT50eXBlID09IFRfTlVMTCkKLSAgCQkgIHx8IHN5bS5uX3NjbnVtICE9IDAKLSAgCQkgIHx8IChzeW0ubl92YWx1ZSAhPSAwCi0gIAkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gIAkJewotICAJCSAgKCpzeW1faGFzaCktPmNsYXNzID0gc3ltLm5fc2NsYXNzOwotICAJCSAgaWYgKHN5bS5uX3R5cGUgIT0gVF9OVUxMKQotICAJCSAgICB7Ci0gIAkJICAgICAgLyogV2Ugd2FudCB0byB3YXJuIGlmIHRoZSB0eXBlIGNoYW5nZWQsIGJ1dCBub3QKLSAgCQkJIGlmIGl0IGNoYW5nZWQgZnJvbSBhbiB1bnNwZWNpZmllZCB0eXBlLgotICAJCQkgVGVzdGluZyB0aGUgd2hvbGUgdHlwZSBieXRlIG1heSB3b3JrLCBidXQgdGhlCi0gIAkJCSBjaGFuZ2UgZnJvbSAoZS5nLikgYSBmdW5jdGlvbiBvZiB1bnNwZWNpZmllZAotICAJCQkgdHlwZSB0byBmdW5jdGlvbiBvZiBrbm93biB0eXBlIGFsc28gd2FudHMgdG8KLSAgCQkJIHNraXAgdGhlIHdhcm5pbmcuICAqLwotICAJCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+dHlwZSAhPSBUX05VTEwKLSAgCQkJICAmJiAoKnN5bV9oYXNoKS0+dHlwZSAhPSBzeW0ubl90eXBlCi0gIAkJICAgICAgICAgICYmICEoRFRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBEVFlQRSAoc3ltLm5fdHlwZSkKLSAgCQkgICAgICAgICAgICAgICAmJiAoQlRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBUX05VTEwKLSAgCQkgICAgICAgICAgICAgICAgICAgfHwgQlRZUEUgKHN5bS5uX3R5cGUpID09IFRfTlVMTCkpKQotICAJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgCQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLSAgCQkJICAgbmFtZSwgKCpzeW1faGFzaCktPnR5cGUsIHN5bS5uX3R5cGUsCi0gIAkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAJCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGZyb20gYSBtZWFuaW5nZnVsCi0gIAkJCSBiYXNlIHR5cGUgdG8gYSBudWxsIG9uZSwgYnV0IGlmIHdlIGtub3cKLSAgCQkJIG5vdGhpbmcsIHRha2Ugd2hhdCBsaXR0bGUgd2UgbWlnaHQgbm93IGtub3cuICAqLwotICAJCSAgICAgIGlmIChCVFlQRSAoc3ltLm5fdHlwZSkgIT0gVF9OVUxMCi0gIAkJCSAgfHwgKCpzeW1faGFzaCktPnR5cGUgPT0gVF9OVUxMKQotCQkJKCpzeW1faGFzaCktPnR5cGUgPSBzeW0ubl90eXBlOwotICAJCSAgICB9Ci0gIAkJICAoKnN5bV9oYXNoKS0+YXV4YmZkID0gYWJmZDsKLQkJICBpZiAoc3ltLm5fbnVtYXV4ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYWxsb2M7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBiZmRfYnl0ZSAqZWF1eDsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppYXV4OwotCi0JCSAgICAgICgqc3ltX2hhc2gpLT5udW1hdXggPSBzeW0ubl9udW1hdXg7Ci0JCSAgICAgIGFsbG9jID0gKCh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikKLQkJCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJICAoc3ltLm5fbnVtYXV4Ci0JCQkJCQkgICAqIHNpemVvZiAoKmFsbG9jKSkpKTsKLQkJICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgZm9yIChpID0gMCwgZWF1eCA9IGVzeW0gKyBzeW1lc3osIGlhdXggPSBhbGxvYzsKLQkJCSAgIGkgPCBzeW0ubl9udW1hdXg7Ci0JCQkgICBpKyssIGVhdXggKz0gc3ltZXN6LCBpYXV4KyspCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgZWF1eCwgc3ltLm5fdHlwZSwKLQkJCQkJICAgICAgc3ltLm5fc2NsYXNzLCBpLCBzeW0ubl9udW1hdXgsCi0JCQkJCSAgICAgIChQVFIpIGlhdXgpOwotCQkgICAgICAoKnN5bV9oYXNoKS0+YXV4ID0gYWxsb2M7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotCSAgICAgICYmICgqc3ltX2hhc2gpLT5udW1hdXggIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgUEUgc2VjdGlvbnMgKHN1Y2ggYXMgLmJzcykgaGF2ZSBhIHplcm8gc2l6ZSBpbgotICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBoZWFkZXIsIGJ1dCBhIG5vbi16ZXJvIHNpemUgaW4gdGhlIEFVWAotICAgICAgICAgICAgICAgICByZWNvcmQuICBDb3JyZWN0IHRoYXQgaGVyZS4KLQotCQkgRklYTUU6IFRoaXMgaXMgbm90IGF0IGFsbCB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gdGhpcy4KLQkJIEZvciBleGFtcGxlLCBpdCB3b24ndCBoZWxwIG9iamR1bXAuICBUaGlzIG5lZWRzIHRvIGJlCi0JCSBkb25lIHdoZW4gd2Ugc3dhcCBpbiB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotCi0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPm51bWF1eCA9PSAxKTsKLQkgICAgICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCXNlY3Rpb24tPl9yYXdfc2l6ZSA9ICgqc3ltX2hhc2gpLT5hdXhbMF0ueF9zY24ueF9zY25sZW47Ci0KLQkgICAgICAvKiBGSVhNRTogV2UgY291bGQgdGVzdCB3aGV0aGVyIHRoZSBzZWN0aW9uIHNpemVzCi0gICAgICAgICAgICAgICAgIG1hdGNoZXMgdGhlIHNpemUgaW4gdGhlIGF1eCBlbnRyeSwgYnV0IGFwcGFyZW50bHkKLSAgICAgICAgICAgICAgICAgdGhhdCBzb21ldGltZXMgZmFpbHMgdW5leHBlY3RlZGx5LiAgKi8KLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYW55IC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGluZm8tPnRyYWRpdGlvbmFsX2Zvcm1hdAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpCi0gICAgICAmJiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2RlYnVnZ2VyKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3RhYiwgKnN0YWJzdHI7Ci0KLSAgICAgIHN0YWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpZiAoc3RhYiAhPSBOVUxMKQotCXsKLQkgIHN0YWJzdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLQkgIGlmIChzdGFic3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotCSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY2RhdGE7Ci0KLQkgICAgICBzZWNkYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHN0YWIpOwotCSAgICAgIGlmIChzZWNkYXRhID09IE5VTEwpCi0JCXsKLQkJICBzdGFiLT51c2VkX2J5X2JmZCA9Ci0JCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCQkgIGlmIChzdGFiLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzdGFiKTsKLQkJfQotCi0JICAgICAgdGFibGUgPSBjb2ZmX2hhc2hfdGFibGUgKGluZm8pOwotCi0JICAgICAgaWYgKCEgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgKGFiZmQsICZ0YWJsZS0+c3RhYl9pbmZvLAotCQkJCQkgICAgIHN0YWIsIHN0YWJzdHIsCi0JCQkJCSAgICAgJnNlY2RhdGEtPnN0YWJfaW5mbykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIGJvb2xlYW4gZGVidWdfbWVyZ2VfYWxsb2NhdGVkOwotICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmdsb2JhbF90b19zdGF0aWMgPSBmYWxzZTsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7Ci0KLSAgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQgKCZmaW5mby5kZWJ1Z19tZXJnZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IHRydWU7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlcnMgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotCSAgJiYgc3RybGVuIChvLT5uYW1lKSA+IFNDTk5NTEVOKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiBoYXMgYSBsb25nIG5hbWUgd2hpY2ggbXVzdCBnbyBpbiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgdGFibGUuICBUaGlzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgY29kZSBpbgotICAgICAgICAgICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHdoaWNoIHB1dHMgdGhlIHN0cmluZyBpbmRleAotICAgICAgICAgICAgIGludG8gdGhlIHNfbmFtZSBmaWVsZCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIuICBUaGF0IGlzIHdoeQotICAgICAgICAgICAgIHdlIHBhc3MgaGFzaCBhcyBmYWxzZS4gICovCi0JICBpZiAoX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby5zdHJ0YWIsIG8tPm5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcG9pbnRlcnMgd2UKLSAgICAgbmVlZCB0byBrZWVwLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogV2UgdXNlIHNlY3Rpb25fY291bnQgKyAxLCByYXRoZXIgdGhhbiBzZWN0aW9uX2NvdW50LCBiZWNhdXNlCi0gICAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPQotCSgoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKLQkgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbykpKTsKLSAgICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwKQotCW8tPmxpbmVfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+bGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotCSAgbGluZV9maWxlcG9zICs9IG8tPmxpbmVub19jb3VudCAqIGxpbmVzejsKLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQotICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAotICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCi0gICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgotICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQotICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCi0KLQkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgotCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnksCi0JICAgICBidXQgb25seSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUKLQkgICAgIGNvbW1vbiBjYXNlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPQotCSAgICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCi0JICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKLQkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gICovCi0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zZWNfcHRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCQkgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQotCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKLSAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50Ci0JCQkJICAgICAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7Ci0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudAotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc2VjX3B0cnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zeW1faW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgZmluZm8ub3V0c3ltcyA9PSBOVUxMCi0gICAgICB8fCAoZmluZm8ubGluZW5vcyA9PSBOVUxMICYmIG1heF9saW5lbm9fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgPiAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY19jb3VudCA+IDApCi0gICAgICB8fCAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICYmIGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMCi0JICAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IDA7Ci0KLSAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgJiBmaW5mbykpCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsICYgZmluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAKLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIChsZCAtLXRhc2stbGluaykgdGhlbiBtYWtlIGEgcGFzcyB0aHJvdWdoIHRoZQotICAgICBnbG9iYWwgc3ltYm9scywgd3JpdGluZyBvdXQgYW55IHRoYXQgYXJlIGRlZmluZWQsIGFuZCBtYWtpbmcgdGhlbQotICAgICBzdGF0aWMuICovCi0gIGlmIChpbmZvLT50YXNrX2xpbmspCi0gICAgewotICAgICAgZmluZm8uZmFpbGVkID0gZmFsc2U7Ci0gICAgICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscywKLQkJCSAgICAgICAoUFRSKSAmZmluZm8pOwotICAgICAgaWYgKGZpbmZvLmZhaWxlZCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwIHx8IGxvbmdfc2VjdGlvbl9uYW1lcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQkgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCSAgICAoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlYnVnX21lcmdlX2FsbG9jYXRlZCkKLSAgICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogcGFyc2Ugb3V0IGEgLWhlYXAgPHJlc2VydmVkPiw8Y29tbWl0PiBsaW5lICovCi0KLXN0YXRpYyBjaGFyICoKLWRvcmVzX2NvbSAocHRyLCBvdXRwdXRfYmZkLCBoZWFwKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgaW50IGhlYXA7Ci17Ci0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKSAKLSAgICB7Ci0gICAgICBpbnQgdmFsID0gc3RydG91bCAocHRyLCAmcHRyLCAwKTsKLSAgICAgIGlmIChoZWFwKQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZIZWFwUmVzZXJ2ZSA9dmFsOwotICAgICAgZWxzZQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZTdGFja1Jlc2VydmUgPXZhbDsKLQotICAgICAgaWYgKHB0clswXSA9PSAnLCcpIAotCXsKLQkgIGludCB2YWwgPSBzdHJ0b3VsIChwdHIrMSwgJnB0ciwgMCk7Ci0JICBpZiAoaGVhcCkKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZkhlYXBDb21taXQgPXZhbDsKLQkgIGVsc2UKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZlN0YWNrQ29tbWl0ID12YWw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGNoYXIgKmdldF9uYW1lKHB0ciwgZHN0KQotY2hhciAqcHRyOwotY2hhciAqKmRzdDsKLXsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotICAqZHN0ID0gcHRyOwotICB3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKLSAgICBwdHIrKzsKLSAgKnB0ciA9IDA7Ci0gIHJldHVybiBwdHIrMTsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFnaWMgZW1iZWRkZWQgY29tbWFuZHMgaW4gYSBzZWN0aW9uIGNhbGxlZCAuZHJlY3R2ZSAqLwotCQkJCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBpbmZvLCAgYWJmZCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kcmVjdHZlIik7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmU7Ci0gIGNoYXIgKmNvcHk7Ci0gIGlmICghc2VjKSAKLSAgICByZXR1cm4gMTsKLSAgCi0gIGNvcHkgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmICghY29weSkgCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLCBzZWMsIGNvcHksIDAsIHNlYy0+X3Jhd19zaXplKSkgCi0gICAgewotICAgICAgZnJlZSAoY29weSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGUgPSBjb3B5ICsgc2VjLT5fcmF3X3NpemU7Ci0gIGZvciAocyA9IGNvcHk7ICBzIDwgZSA7ICkgCi0gICAgewotICAgICAgaWYgKHNbMF0hPSAnLScpIHsKLQlzKys7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAocywiLWF0dHIiLCA1KSA9PSAwKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICBjaGFyICphdHRyaWJzOwotCSAgYXNlY3Rpb24gKmFzZWM7Ci0KLQkgIGludCBsb29wID0gMTsKLQkgIGludCBoYWRfd3JpdGUgPSAwOwotCSAgaW50IGhhZF9yZWFkID0gMDsKLQkgIGludCBoYWRfZXhlYz0gMDsKLQkgIGludCBoYWRfc2hhcmVkPSAwOwotCSAgcyArPSA1OwotCSAgcyA9IGdldF9uYW1lKHMsICZuYW1lKTsKLQkgIHMgPSBnZXRfbmFtZShzLCAmYXR0cmlicyk7Ci0JICB3aGlsZSAobG9vcCkgewotCSAgICBzd2l0Y2ggKCphdHRyaWJzKyspIAotCSAgICAgIHsKLQkgICAgICBjYXNlICdXJzoKLQkJaGFkX3dyaXRlID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUic6Ci0JCWhhZF9yZWFkID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUyc6Ci0JCWhhZF9zaGFyZWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdYJzoKLQkJaGFkX2V4ZWMgPSAxOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlsb29wID0gMDsKLQkgICAgICB9Ci0JICB9Ci0JICBhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGFzZWMpIHsKLQkgICAgaWYgKGhhZF9leGVjKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICBpZiAoIWhhZF93cml0ZSkKLQkgICAgICBhc2VjLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLWhlYXAiLCA1KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNSwgb3V0cHV0X2JmZCwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLXN0YWNrIiwgNikgPT0gMCkKLQl7Ci0JICBzID0gZG9yZXNfY29tIChzKzYsIG91dHB1dF9iZmQsIDApOwotCX0KLSAgICAgIGVsc2UgCi0JcysrOwotICAgIH0KLSAgZnJlZSAoY29weSk7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQbGFjZSBhIG1hcmtlciBhZ2FpbnN0IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotICAgVGhpcyBtYXJrZXIgY2FuIGJlIHBpY2tlZCB1cCBieSB0aGUgJ2RvIHdlIHNraXAgdGhpcyBzeW1ib2wgPycKLSAgIGxvb3AgaW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKCkgYW5kIHVzZWQgdG8gcHJldmVudCBza2lwcGluZwotICAgdGhhdCBzeW1ib2wuIAotICAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKglmaW5mbzsKLSAgICAgYmZkICogCQkJCWlucHV0X2JmZDsKLXsKLSAgYXNlY3Rpb24gKiBhOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChpbnB1dF9iZmQpICYgSEFTX1NZTVMpID09IDApCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChhID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWlyZWxlbmQ7Ci0KLSAgICAgIAotICAgICAgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCB8fCBhLT5yZWxvY19jb3VudCAgPCAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JKGlucHV0X2JmZCwgYSwgZmFsc2UsCi0JIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JICA/IChmaW5mby0+c2VjdGlvbl9pbmZvWyBhLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IF0ucmVsb2NzICsgYS0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCSAgOiBmaW5mby0+aW50ZXJuYWxfcmVsb2NzKQotCSk7Ci0gICAgICAKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCAgICAgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBpcmVsZW5kICA9IGlyZWwgKyBhLT5yZWxvY19jb3VudDsKLQotICAgICAgLyogUGxhY2UgYSBtYXJrIGluIHRoZSBzeW1faW5kaWNlcyBhcnJheSAod2hvc2UgZW50cmllcyBoYXZlCi0JIGJlZW4gaW5pdGlhbGlzZWQgdG8gMCkgZm9yIGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGFyZSB1c2VkCi0JIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgVGhpcyB3aWxsIHRoZW4gYmUgcGlja2VkIHVwIGluIHRoZQotCSBza2lwL2Rvbid0IHBhc3MgKi8KLSAgICAgIAotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgZmluZm8tPnN5bV9pbmRpY2VzWyBpcmVsLT5yX3N5bW5keCBdID0gLTE7Ci0JfQotICAgIH0KLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBpbnQgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotI2lmIDAKLSAgdW5zaWduZWQgaW50IG5fYnRtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0bWFzazsKLSNlbmRpZgotICBib29sZWFuICgqYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICBhc2VjdGlvbiAqKnNlY3BwOwotICBsb25nICppbmRleHA7Ci0gIHVuc2lnbmVkIGxvbmcgb3V0cHV0X2luZGV4OwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHNlY3BwID0gZmluZm8tPnNlY19wdHJzOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQotICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgaWYgKCEgcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSByZWxvY2F0aW9ucyBhbmQgYWxzbyBzdHJpcC9kaXNjYXJkIHNvbWUgc3ltYm9scwotICAgICB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0cmlwL2Rpc2NhcmQgdGhvc2Ugc3ltYm9scyB0aGF0IGFyZQotICAgICBnb2luZyB0byBiZSBpbnZvbHZlZCBpbiB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgaWYgKCggICBmaW5mby0+aW5mby0+c3RyaXAgICAhPSBzdHJpcF9ub25lCi0gICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotICAgICAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBtYXJrIHRoZSBzeW1ib2wgYXJyYXkgYXMgJ25vdC11c2VkJyAqLwotICAgICAgbWVtc2V0IChpbmRleHAsIDAsIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc2l6ZW9mICogaW5kZXhwKTsgCi0gICAgICAgCi0gICAgICBtYXJrX3JlbG9jcyAoZmluZm8sIGlucHV0X2JmZCk7Ci0gICAgfQotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICAgYm9vbGVhbiBkb250X3NraXBfc3ltYm9sOwotICAgICAgaW50IGFkZDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGlucHV0X2JmZCwgJmlzeW0pOwotICAgICAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCSAgKnNlY3BwID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChpbnB1dF9iZmQsIGlzeW0ubl9zY251bSk7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkgICpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkgICpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEKLSAgICAgICAgIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCSAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKLQkgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JZG9udF9za2lwX3N5bWJvbCA9ICppbmRleHA7Ci0gICAgICBlbHNlCi0JZG9udF9za2lwX3N5bWJvbCA9IGZhbHNlOwotICAgICAgCi0gICAgICAqaW5kZXhwID0gLTE7Ci0KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIGdsb2JhbCA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9DT01NT046Ci0JICAgIGNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gIEdsb2JhbCBzeW1ib2xzIGNvbWUgYXQgdGhlCi0JCSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwgc28gc2tpcCB0aGVtIGZvciBub3cuCi0JCSBMb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gc3ltYm9scywgaG93ZXZlciwgYXJlIGFuCi0JCSBleGNlcHRpb24sIGFuZCBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgaWYgKCEgSVNGQ04gKGlzeW0ubl90eXBlKSkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgLyogVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGxlZnQgZm9yIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9MT0NBTDoKLQkgICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgU2tpcCBpdCBpZiB3ZSBhcmUgZGlzY2FyZGluZwotICAgICAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwgJiYgISBkb250X3NraXBfc3ltYm9sKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICBGSVhNRTogZ2FzIHNldHMgdGhlIHNlY3Rpb24gdG8gTl9BQlMKLSAgICAgICAgIGZvciBzb21lIHR5cGVzIG9mIGRlYnVnZ2luZyBzeW1ib2xzOyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgYSBidWcgb3Igbm90LiAgSW4gYW55IGNhc2UsIHdlIGhhbmRsZSBpdCBoZXJlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgJiYgISBkb250X3NraXBfc3ltYm9sCi0JICAmJiAoaXN5bS5uX3NjbnVtID09IE5fREVCVUcKLQkgICAgICB8fCAoaXN5bS5uX3NjbnVtID09IE5fQUJTCi0JCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19BVVRPCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUcKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PUwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9FCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT1UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0FSRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfUkVHUEFSTQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRklFTEQKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0VPUykpKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZG9udF9za2lwX3N5bWJvbAotCSAgICAgICYmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkJICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsCi0JCQkJICAgIGZhbHNlKSA9PSBOVUxMKSkKLQkJICAgfHwgKCEgZ2xvYmFsCi0JCSAgICAgICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkpCi0JICAgIHNraXAgPSB0cnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBlbnVtLCBzdHJ1Y3QsIG9yIHVuaW9uIHRhZywgc2VlIGlmIHdlIGhhdmUKLSAgICAgICAgIGFscmVhZHkgb3V0cHV0IGFuIGlkZW50aWNhbCB0eXBlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+b3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSA9PSAwCi0JICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VOVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1NUUlRBRwotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19VTlRBRykKLQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKm1oOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXQ7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqKmVwcDsKLQkgIGJmZF9ieXRlICplc2wsICplc2xlbmQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc2xwOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZ25vcmUgZmFrZSBuYW1lcyBpbnZlbnRlZCBieSBjb21waWxlcjsgdHJlYXQgdGhlbSBhbGwgYXMKLSAgICAgICAgICAgICB0aGUgc2FtZSBuYW1lLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAnficgfHwgKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJwotCSAgICAgIHx8ICgqbmFtZSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGlucHV0X2JmZCkKLQkJICAmJiAobmFtZVsxXSA9PSAnficgfHwgbmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAnJCcpKSkKLQkgICAgbmFtZSA9ICIiOwotCi0JICBtaCA9IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAgKCZmaW5mby0+ZGVidWdfbWVyZ2UsIG5hbWUsCi0JCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAobWggPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0eXBlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyB0dXJucwotICAgICAgICAgICAgIG91dCB0byBiZSBhIGR1cGxpY2F0ZSwgd2UgcGFzcyB0aGlzIGFkZHJlc3MgdG8KLSAgICAgICAgICAgICBiZmRfcmVsZWFzZS4gICovCi0JICBtdCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqKQotCQliZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSkpKTsKLQkgIGlmIChtdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtdC0+Y2xhc3MgPSBpc3ltLm5fc2NsYXNzOwotCi0JICAvKiBQaWNrIHVwIHRoZSBhdXggZW50cnksIHdoaWNoIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSB0YWcKLSAgICAgICAgICAgICBlbnRyaWVzLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc3ltICsgaXN5bWVzeiksCi0JCQkJaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsIDAsIGlzeW0ubl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0KLQkgIC8qIEdhdGhlciB0aGUgZWxlbWVudHMuICAqLwotCSAgZXBwID0gJm10LT5lbGVtZW50czsKLQkgIG10LT5lbGVtZW50cyA9IE5VTEw7Ci0JICBpc2xwID0gaXN5bXAgKyAyOwotCSAgZXNsID0gZXN5bSArIDIgKiBpc3ltZXN6OwotCSAgZXNsZW5kID0gKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpCi0JCSAgICArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICogaXN5bWVzeik7Ci0JICB3aGlsZSAoZXNsIDwgZXNsZW5kKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqZWxlbmFtZTsKLQkgICAgICBjaGFyIGVsZWJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNoYXIgKm5hbWVfY29weTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzbCwgKFBUUikgaXNscCk7Ci0KLQkgICAgICAqZXBwID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICopCi0JCSAgICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCSBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpKSk7Ci0JICAgICAgaWYgKCplcHAgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZWxlbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBpc2xwLAotCQkJCQkJCWVsZWJ1Zik7Ci0JICAgICAgaWYgKGVsZW5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbmFtZV9jb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgIHN0cmxlbiAoZWxlbmFtZSkgKyAxKTsKLQkgICAgICBpZiAobmFtZV9jb3B5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJjcHkgKG5hbWVfY29weSwgZWxlbmFtZSk7Ci0KLQkgICAgICAoKmVwcCktPm5hbWUgPSBuYW1lX2NvcHk7Ci0JICAgICAgKCplcHApLT50eXBlID0gaXNscC0+bl90eXBlOwotCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gMDsKLQkgICAgICBpZiAoaXNscC0+bl9udW1hdXggPj0gMQotCQkgICYmIGlzbHAtPm5fdHlwZSAhPSBUX05VTEwKLQkJICAmJiBpc2xwLT5uX3NjbGFzcyAhPSBDX0VPUykKLQkJewotCQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBlbGVhdXg7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzbCArIGlzeW1lc3opLAotCQkJCQlpc2xwLT5uX3R5cGUsIGlzbHAtPm5fc2NsYXNzLCAwLAotCQkJCQlpc2xwLT5uX251bWF1eCwgKFBUUikgJmVsZWF1eCk7Ci0JCSAgaW5keCA9IGVsZWF1eC54X3N5bS54X3RhZ25keC5sOwotCi0JCSAgLyogRklYTUU6IElmIHRoaXMgdGFnbmR4IGVudHJ5IHJlZmVycyB0byBhIHN5bWJvbAotCQkgICAgIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLQkJICAgICBIYW5kbGluZyB0aGlzIGNvcnJlY3RseSB3b3VsZCBiZSB0ZWRpb3VzLCBhbmQgbWF5Ci0JCSAgICAgbm90IGJlIHJlcXVpcmVkLiAgKi8KLQotCQkgIGlmIChpbmR4ID4gMAotCQkgICAgICAmJiAoaW5keAotCQkJICA8ICgoZXN5bSAtCi0JCQkgICAgICAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCSAgICAgLyAobG9uZykgaXN5bWVzeikpKQotCQkgICAgewotCQkgICAgICAoKmVwcCktPnRhZ25keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKCgqZXBwKS0+dGFnbmR4IDwgMCkKLQkJCSgqZXBwKS0+dGFnbmR4ID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVwcCA9ICYoKmVwcCktPm5leHQ7Ci0JICAgICAgKmVwcCA9IE5VTEw7Ci0KLQkgICAgICBlc2wgKz0gKGlzbHAtPm5fbnVtYXV4ICsgMSkgKiBpc3ltZXN6OwotCSAgICAgIGlzbHAgKz0gaXNscC0+bl9udW1hdXggKyAxOwotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIHdoaWNoIG1hdGNoZXMgdGhpcwotICAgICAgICAgICAgIHR5cGUuICBXZSBhbHdheXMgb3V0cHV0IHRoZSB0eXBlIGlmIGl0IGhhcyBubyBlbGVtZW50cywKLSAgICAgICAgICAgICBmb3Igc2ltcGxpY2l0eS4gICovCi0JICBpZiAobXQtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm10bDsKLQotCSAgICAgIGZvciAobXRsID0gbWgtPnR5cGVzOyBtdGwgIT0gTlVMTDsgbXRsID0gbXRsLT5uZXh0KQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbWUsICptZWw7Ci0KLQkJICBpZiAobXRsLT5jbGFzcyAhPSBtdC0+Y2xhc3MpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGZvciAobWUgPSBtdC0+ZWxlbWVudHMsIG1lbCA9IG10bC0+ZWxlbWVudHM7Ci0JCSAgICAgICBtZSAhPSBOVUxMICYmIG1lbCAhPSBOVUxMOwotCQkgICAgICAgbWUgPSBtZS0+bmV4dCwgbWVsID0gbWVsLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RyY21wIChtZS0+bmFtZSwgbWVsLT5uYW1lKSAhPSAwCi0JCQkgIHx8IG1lLT50eXBlICE9IG1lbC0+dHlwZQotCQkJICB8fCBtZS0+dGFnbmR4ICE9IG1lbC0+dGFnbmR4KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAobWUgPT0gTlVMTCAmJiBtZWwgPT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAobXRsID09IE5VTEwgfHwgKGJmZF9zaXplX3R5cGUpIG10bC0+aW5keCA+PSBzeW1lbnRfYmFzZSkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGRlZmluaXRpb24gb2YgdGhpcyB0eXBlLiAgKi8KLQkJICBtdC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkJICBtdC0+bmV4dCA9IG1oLT50eXBlczsKLQkJICBtaC0+dHlwZXMgPSBtdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gd2hpY2ggY2FuIGJlIG1lcmdlZC4gICovCi0JCSAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCQkgICppbmRleHAgPSBtdGwtPmluZHg7Ci0JCSAgYWRkID0gKGVzbGVuZCAtIGVzeW0pIC8gaXN5bWVzejsKLQkJICBza2lwID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgY2hlY2sKLQkJIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcuICBUaGF0IGlzIG9ubHkgdHJ1ZSBmb3IKLQkJIFhDT0ZGLCBhbmQgWENPRkYgcmVxdWlyZXMgZGlmZmVyZW50IGxpbmtpbmcgY29kZQotCQkgYW55aG93LiAgKi8KLQkgICAgICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgbmFtZSwgaGFzaCwgY29weSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoaXN5bS5uX3NjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfQVVUTzoKLQkgICAgY2FzZSBDX01PUzoKLQkgICAgY2FzZSBDX0VPUzoKLQkgICAgY2FzZSBDX01PRToKLQkgICAgY2FzZSBDX01PVToKLQkgICAgY2FzZSBDX1VOVEFHOgotCSAgICBjYXNlIENfU1RSVEFHOgotCSAgICBjYXNlIENfRU5UQUc6Ci0JICAgIGNhc2UgQ19UUERFRjoKLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX1VTVEFUSUM6Ci0JICAgIGNhc2UgQ19SRUc6Ci0JICAgIGNhc2UgQ19SRUdQQVJNOgotCSAgICBjYXNlIENfRklFTEQ6Ci0JICAgICAgLyogVGhlIHN5bWJvbCB2YWx1ZSBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRkNOOgotCSAgICAgIGlmIChvYmpfcGUgKGlucHV0X2JmZCkKLQkJICAmJiBzdHJjbXAgKGlzeW0ubl9uYW1lLCAiLmJmIikgIT0gMAotCQkgICYmIGlzeW0ubl9zY251bSA+IDApCi0JCXsKLQkJICAvKiBGb3IgUEUsIC5sZiBhbmQgLmVmIGdldCB0aGVpciB2YWx1ZSBsZWZ0IGFsb25lLAotCQkgICAgIHdoaWxlIC5iZiBnZXRzIHJlbG9jYXRlZC4gIEhvd2V2ZXIsIHRoZXkgYWxsIGhhdmUKLQkJICAgICAicmVhbCIgc2VjdGlvbiBudW1iZXJzLCBhbmQgbmVlZCB0byBiZSBtb3ZlZCBpbnRvCi0JCSAgICAgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLQkJICBpc3ltLm5fc2NudW0gPSAoKnNlY3BwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgQ19MQUJFTDogIC8qIE5vdCBjb21wbGV0ZWx5IHN1cmUgYWJvdXQgdGhlc2UgMiAqLwotCSAgICBjYXNlIENfRVhUREVGOgotCSAgICBjYXNlIENfQkxPQ0s6Ci0JICAgIGNhc2UgQ19FRkNOOgotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1NUQVQ6Ci0JICAgIGNhc2UgQ19TRUNUSU9OOgotCSAgICBjYXNlIENfTlRfV0VBSzoKLQkgICAgICAvKiBDb21wdXRlIG5ldyBzeW1ib2wgbG9jYXRpb24uICAqLwotCSAgICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgICB7Ci0JCWlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQlpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9vZmZzZXQ7Ci0JCWlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJICBpc3ltLm5fdmFsdWUgLT0gKCpzZWNwcCktPnZtYTsKLQkJaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JCSAgaXN5bS5uX3ZhbHVlICs9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0ZJTEU6Ci0JICAgICAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mCi0JCSB0aGUgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggdG8gdGhlIGZpcnN0IGV4dGVybmFsCi0JCSBzeW1ib2wgKGFjdHVhbGx5LCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgZG9lcyBub3QgZ2V0Ci0JCSB0aGlzIHJpZ2h0LS1pdCBqdXN0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIHRvIHplcm8tLWFuZCBub2JvZHkgaGFzIGV2ZXIgY29tcGxhaW5lZCBhYm91dAotCQkgaXQpLiAgV2UgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2UKLQkJIHdyaXRlIHRoZSBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5Ci0JCSBoYXZlIHRvIHdyaXRlIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotICAgICAgICAgICAgICAgICAgICAgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQgbm9ybWFsIGdsb2JhbCBmdW5jdGlvbiBzeW1ib2xzIHRvCi0JICAgICBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi0JICBpZiAoZmluZm8tPmluZm8tPnRhc2tfbGluawotCSAgICAgICYmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JCSAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkJICB8fCAob2JqX3BlIChpbnB1dF9iZmQpICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkpCi0JICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLQkgIC8qIE91dHB1dCB0aGUgc3ltYm9sLiAgKi8KLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLQotCSAgKmluZGV4cCA9IG91dHB1dF9pbmRleDsKLQotCSAgaWYgKGdsb2JhbCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3ZXJlIGVycm9ycyBlYXJsaWVyIGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgbGluay4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICBvdXRwdXRfaW5kZXggKz0gYWRkOwotCSAgb3V0c3ltICs9IGFkZCAqIG9zeW1lc3o7Ci0JfQotCi0gICAgICBlc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICArK3NlY3BwOwotICAgICAgKytpbmRleHA7Ci0gICAgICBmb3IgKC0tYWRkOyBhZGQgPiAwOyAtLWFkZCkKLQl7Ci0JICAqc2VjcHArKyA9IE5VTEw7Ci0JICAqaW5kZXhwKysgPSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEZpeCB1cCB0aGUgYXV4IGVudHJpZXMuICBUaGlzIG11c3QgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHBhc3MsCi0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcyB1bnRpbCB3ZSBoYXZlCi0gICAgIGFscmVhZHkgZGVjaWRlZCB3aGljaCBzeW1ib2xzIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGFkZCA9IDEgKyBpc3ltcC0+bl9udW1hdXg7Ci0KLSAgICAgIGlmICgoKmluZGV4cCA8IDAKLQkgICB8fCAoYmZkX3NpemVfdHlwZSkgKmluZGV4cCA8IHN5bWVudF9iYXNlKQotCSAgJiYgKCpzeW1faGFzaCA9PSBOVUxMCi0JICAgICAgfHwgKCpzeW1faGFzaCktPmF1eGJmZCAhPSBpbnB1dF9iZmQpKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBpbnQgaTsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoKmluZGV4cCA8IDApCi0JICAgIHsKLQkgICAgICBoID0gKnN5bV9oYXNoOwotCi0JICAgICAgLyogVGhlIG02OGstbW90b3JvbGEtc3lzdiBhc3NlbWJsZXIgd2lsbCBzb21ldGltZXMKLSAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdHdvIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgb25seSBvbmUKLSAgICAgICAgICAgICAgICAgd2lsbCBoYXZlIGF1eCBlbnRyaWVzLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPT0gMAotCQkJICB8fCBoLT5udW1hdXggPT0gaXN5bXAtPm5fbnVtYXV4KTsKLQkgICAgfQotCi0JICBlc3ltICs9IGlzeW1lc3o7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICAvKiBIYW5kbGUgdGhlIGF1eCBlbnRyaWVzLiAgVGhpcyBoYW5kbGluZyBpcyBiYXNlZCBvbgotCSAgICAgY29mZl9wb2ludGVyaXplX2F1eC4gIEkgZG9uJ3Qga25vdyBpZiBpdCBhbHdheXMgY29ycmVjdC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlhdXhwID0gaC0+YXV4ICsgaTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCBpc3ltcC0+bl90eXBlLAotCQkJCQlpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJKFBUUikgJmF1eCk7Ci0JCSAgYXV4cCA9ICZhdXg7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogSWYgdGhpcyBpcyBhIGxvbmcgZmlsZW5hbWUsIHdlIG11c3QgcHV0IGl0IGluIHRoZQotCQkgICAgIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eHAtPnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMAotCQkgICAgICAmJiBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoYXV4cC0+eF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0OwotCQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBmaWxlbmFtZSwKLQkJCQkJCSBoYXNoLCBjb3B5KTsKLQkJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCQkgICAgICBpZiAoaW5keCA+IDAKLQkJCSAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICAvKiBXZSBsb29rIGZvcndhcmQgdGhyb3VnaCB0aGUgc3ltYm9sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3ltYm9sIHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlbHkgcmlnaHQuICAqLwotCQkJICB3aGlsZSAoKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgIHx8ICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdCi0JCQkJICAgICAgPCBzeW1lbnRfYmFzZSkpCi0JCQkJICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICArK2luZHg7Ci0JCQkgIGlmIChpbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgIGluZHggPSBvdXRwdXRfaW5kZXg7Ci0JCQkgIGVsc2UKLQkJCSAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkJICBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXhwLT54X3N5bS54X3RhZ25keC5sOwotCQkgIGlmIChpbmR4ID4gMCAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgc3ltaW5keDsKLQotCQkgICAgICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoc3ltaW5keCA8IDApCi0JCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJICAgICAgZWxzZQotCQkJYXV4cC0+eF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGUgLmJmIHN5bWJvbHMgYXJlIHN1cHBvc2VkIHRvIGJlIGxpbmtlZCB0aHJvdWdoCi0JCSAgICAgdGhlIGVuZG5keCBmaWVsZC4gIFdlIG5lZWQgdG8gY2FycnkgdGhpcyBsaXN0Ci0JCSAgICAgYWNyb3NzIG9iamVjdCBmaWxlcy4gICovCi0JCSAgaWYgKGkgPT0gMAotCQkgICAgICAmJiBoID09IE5VTEwKLQkJICAgICAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfRkNOCi0JCSAgICAgICYmIChpc3ltcC0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotCQkJICB8fCBpc3ltcC0+X24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMF0gPT0gJy4nCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzFdID09ICdiJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVsyXSA9PSAnZicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbM10gPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGZpbmZvLT5sYXN0X2JmX2luZGV4ICE9IC0xKQotCQkJewotCQkJICBmaW5mby0+bGFzdF9iZi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJCSAgICAqaW5kZXhwOwotCi0JCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfYmZfaW5kZXgKLQkJCSAgICAgID49IHN5bWVudF9iYXNlKQotCQkJICAgIHsKLQkJCSAgICAgIFBUUiBhdXhvdXQ7Ci0KLQkJCSAgICAgIC8qIFRoZSBsYXN0IC5iZiBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dAotCQkJCSBmaWxlLiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGlmIHRoZQotCQkJCSBhc3NlbWJsZXIgZGlkIG5vdCBzZXQgdXAgdGhlIC5iZgotCQkJCSBlbmRuZHggc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCQkJICAgICAgYXV4b3V0ID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCSAgICAgICsgKChmaW5mby0+bGFzdF9iZl9pbmRleAotCQkJCQkJICAtIHN5bWVudF9iYXNlKQotCQkJCQkJICogb3N5bWVzeikpOwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfYmYsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3R5cGUsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3NjbGFzcywKLQkJCQkJCSAgICAgMCwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkJICAgICBhdXhvdXQpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJmIGF1eCBlbnRyeS4gIFdlIG5lZWQgdG8gd3JpdGUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBhZ2Fpbi4gIFdlIGJvcnJvdyAqb3V0c3ltCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcmlseS4gIEZJWE1FOiBUaGlzIGNhc2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBtYWRlIGZhc3Rlci4gICovCi0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKLQkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKLQkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAotCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCQkgICAgICsgZmluZm8tPmxhc3RfYmZfaW5kZXggKiBvc3ltZXN6KSwKLQkJCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkJICB8fCBiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwKLQkJCQkJCW91dHB1dF9iZmQpICE9IG9zeW1lc3opCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCAhPSAwKQotCQkJZmluZm8tPmxhc3RfYmZfaW5kZXggPSAtMTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBUaGUgZW5kbmR4IGZpZWxkIG9mIHRoaXMgYXV4IGVudHJ5IG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXBkYXRlZCB3aXRoIHRoZSBzeW1ib2wgbnVtYmVyIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC5iZiBzeW1ib2wuICAqLwotCQkJICBmaW5mby0+bGFzdF9iZiA9ICphdXhwOwotCQkJICBmaW5mby0+bGFzdF9iZl9pbmRleCA9ICgoKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKQotCQkJCQkJICAgLyBvc3ltZXN6KQotCQkJCQkJICArIHN5bWVudF9iYXNlKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bXAtPm5fdHlwZSwKLQkJCQkJIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJICBvdXRzeW0gKz0gb3N5bWVzejsKLQkJfQotCi0JICAgICAgZXN5bSArPSBpc3ltZXN6OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmRleHAgKz0gYWRkOwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgc3ltX2hhc2ggKz0gYWRkOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZyB0aGVtLiAgKi8KLSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0gICAgICB8fCBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgKmVsaW5lOwotCSAgYmZkX2J5dGUgKmVsaW5lZW5kOwotCSAgYmZkX2J5dGUgKm9lbGluZTsKLQkgIGJvb2xlYW4gc2tpcHBpbmc7Ci0KLQkgIC8qIEZJWE1FOiBJZiBTRUNfSEFTX0NPTlRFTlRTIGlzIG5vdCBmb3IgdGhlIHNlY3Rpb24sIHRoZW4KLQkgICAgIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIHdpbGwgbm90IGhhdmUgY3JlYXRlZCBhCi0JICAgICBsaW5rIG9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgc2VlbiB0aGlzCi0JICAgICBpbnB1dCBzZWN0aW9uIGluIF9iZmRfY29mZl9maW5hbF9saW5rLCB3aGljaCBtZWFucyB0aGF0Ci0JICAgICB3ZSB3aWxsIG5vdCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVycyBvZgotCSAgICAgdGhpcyBzZWN0aW9uLiAgSSBkb24ndCB0aGluayBsaW5lIG51bWJlcnMgY2FuIGJlCi0JICAgICBtZWFuaW5nZnVsIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZQotCSAgICAgU0VDX0hBU19DT05URU5UUyBzZXQsIGJ1dCwgaWYgdGhleSBkbywgdGhpcyBtdXN0IGJlCi0JICAgICBjaGFuZ2VkLiAgKi8KLQkgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMAotCSAgICAgIHx8IChvLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAotCQkJICAgaW5wdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBlbGluZSA9IGZpbmZvLT5saW5lbm9zOwotCSAgb2VsaW5lID0gZmluZm8tPmxpbmVub3M7Ci0JICBlbGluZWVuZCA9IGVsaW5lICsgbGluZXN6ICogby0+bGluZW5vX2NvdW50OwotCSAgc2tpcHBpbmcgPSBmYWxzZTsKLQkgIGZvciAoOyBlbGluZSA8IGVsaW5lZW5kOyBlbGluZSArPSBsaW5lc3opCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGlsaW5lOwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgZWxpbmUsIChQVFIpICZpbGluZSk7Ci0KLQkgICAgICBpZiAoaWxpbmUubF9sbm5vICE9IDApCi0JCWlsaW5lLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkgICAgICBlbHNlIGlmIChpbGluZS5sX2FkZHIubF9zeW1uZHggPj0gMAotCQkgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKSBpbGluZS5sX2FkZHIubF9zeW1uZHgKLQkJCSAgIDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpKQotCQl7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbGluZS5sX2FkZHIubF9zeW1uZHhdOwotCi0JCSAgaWYgKGluZHggPCAwKQotCQkgICAgewotCQkgICAgICAvKiBUaGVzZSBsaW5lIG51bWJlcnMgYXJlIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0JCQkgd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4gIFdlIG11c3QgZGlzY2FyZCB0aGUKLQkJCSBsaW5lIG51bWJlcnMgYmVjYXVzZSByZWFkaW5nIHRoZW0gYmFjayB3aXRoCi0JCQkgbm8gYXNzb2NpYXRlZCBzeW1ib2wgKG9yIGFzc29jaWF0aW5nIHRoZW0gYWxsCi0JCQkgd2l0aCBzeW1ib2wgIzApIHdpbGwgZmFpbC4gIFdlIGNhbid0IHJlZ2FpbgotCQkJIHRoZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUsIGJ1dCBhdCBsZWFzdAotCQkJIHRoZXkncmUgZGVuc2UuICAqLwotCQkgICAgICBza2lwcGluZyA9IHRydWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzOwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgaWE7Ci0KLQkJICAgICAgLyogRml4IHVwIHRoZSBsbm5vcHRyIGZpZWxkIGluIHRoZSBhdXggZW50cnkgb2YKLQkJCSB0aGUgc3ltYm9sLiAgSXQgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QgZG8KLQkJCSB0aGlzIHdoZW4gd2UgbW9kaWZ5IHRoZSBzeW1ib2wgYXV4IGVudHJpZXMsCi0JCQkgYmVjYXVzZSBnYXMgc29tZXRpbWVzIHNjcmV3cyB1cCB0aGUgbG5ub3B0cgotCQkJIGZpZWxkIGFuZCBtYWtlcyBpdCBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQKLQkJCSBvZiB0aGUgbGluZSBudW1iZXJzIHJhdGhlciB0aGFuIGFuIGFic29sdXRlCi0JCQkgZmlsZSBpbmRleC4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICArICgoaW5keCAtIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgKiBvc3ltZXN6KSksCi0JCQkJCSAgICAoUFRSKSAmaXMpOwotCQkgICAgICBpZiAoKElTRkNOIChpcy5uX3R5cGUpCi0JCQkgICB8fCBpcy5uX3NjbGFzcyA9PSBDX0JMT0NLKQotCQkJICAmJiBpcy5uX251bWF1eCA+PSAxKQotCQkJewotCQkJICBQVFIgYXV4cHRyOwotCi0JCQkgIGF1eHB0ciA9IChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UgKyAxKQotCQkJCQkgICAgICogb3N5bWVzeikpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAob3V0cHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJaXMubl90eXBlLCBpcy5uX3NjbGFzcywKLQkJCQkJCTAsIGlzLm5fbnVtYXV4LCAoUFRSKSAmaWEpOwotCQkJICBpYS54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCQkJICAgIChvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzegotCQkJICAgICArIGVsaW5lIC0gZmluZm8tPmxpbmVub3MpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpYSwKLQkJCQkJCSBpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLCAwLAotCQkJCQkJIGlzLm5fbnVtYXV4LCBhdXhwdHIpOwotCQkJfQotCi0JCQlza2lwcGluZyA9IGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWxpbmUubF9hZGRyLmxfc3ltbmR4ID0gaW5keDsKLQkJfQotCi0JICAgICAgaWYgKCFza2lwcGluZykKLQkgICAgICAgIHsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpbGluZSwKLQkJCQkJICAgIChQVFIpIG9lbGluZSk7Ci0JCSAgb2VsaW5lICs9IGxpbmVzejsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCShvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KSwKLQkJCVNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPmxpbmVub3MsIDEsIG9lbGluZSAtIGZpbmZvLT5saW5lbm9zLAotCQkJICAgICBvdXRwdXRfYmZkKQotCQkgICE9IChiZmRfc2l6ZV90eXBlKSAob2VsaW5lIC0gZmluZm8tPmxpbmVub3MpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9Ci0JICAgIChvZWxpbmUgLSBmaW5mby0+bGluZW5vcykgLyBsaW5lc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGFkanVzdF9zeW1uZHggPSBjb2ZmX2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHg7Ci0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICAgc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjZGF0YTsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NzIGluIHNlY3Rpb24gYCVzJywgYnV0IGl0IGhhcyBubyBjb250ZW50cyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pOwotICAgICAgaWYgKHNlY2RhdGEgIT0gTlVMTCAmJiBzZWNkYXRhLT5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gc2VjZGF0YS0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBpbnQgdGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0JICB0YXJnZXRfaW5kZXggPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmYWxzZSwgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JCQkgICAgICAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAgICAgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCQkJICAgICAgIDogZmluZm8tPmludGVybmFsX3JlbG9jcykpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIGZpbmZvLT5zZWNfcHRycykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0KLQkgICAgICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgICAgICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgcmVsX2hhc2ggPSAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCQkgIGJvb2xlYW4gYWRqdXN0ZWQ7Ci0KLQkJICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JCSAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JCSAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkJICBpZiAoaXJlbC0+cl9zeW1uZHggPT0gLTEpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChhZGp1c3Rfc3ltbmR4KQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmFkanVzdF9zeW1uZHgpIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgICAgaW5wdXRfYmZkLCBvLCBpcmVsLAotCQkJCQkgICAgICAmYWRqdXN0ZWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoYWRqdXN0ZWQpCi0JCQljb250aW51ZTsKLQkJICAgIH0KLQotCQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lyZWwtPnJfc3ltbmR4XTsKLQkJICBpZiAoaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JpdHRlbiBhdCB0aGUgZW5kCi0JCQkgICAgIG9mIHRoZSBmaWxlLCBhbmQgd2UgZG8gbm90IHlldCBrbm93IHRoZQotCQkJICAgICBzeW1ib2wgaW5kZXguICBXZSBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJICAgICBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSByZWxfaGFzaCBsaXN0LgotCQkJICAgICBXZSBzZXQgdGhlIGluZHggZmllbGQgdG8gLTIgdG8gaW5kaWNhdGUKLQkJCSAgICAgdGhhdCB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBzdHJpcHBlZC4gICovCi0JCQkgICpyZWxfaGFzaCA9IGg7Ci0JCQkgIGgtPmluZHggPSAtMjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2lyZWwtPnJfc3ltbmR4XTsKLQkJICAgICAgaWYgKGluZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkJCSAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcHBpbmcuICBUaGlzIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZAotCQkJICAgICBieSB0aGUgJ2RvbnRfc2tpcF9zeW1ib2wnIGNvZGUgaW4gdGhlIHdoaWxlCi0JCQkgICAgIGxvb3AgYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uLiAqLwotCQkJICAKLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIGlyZWwtPnJfc3ltbmR4OwotCi0JCQkgIG5hbWUgPSAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0JCQkJICAoaW5wdXRfYmZkLCBpcywgYnVmKSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvLAotCQkJCSAgaXJlbC0+cl92YWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKHNlY2RhdGEgPT0gTlVMTCB8fCBzZWNkYXRhLT5zdGFiX2luZm8gPT0gTlVMTCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoby0+b3V0cHV0X29mZnNldCAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vY3RldHNfcGVyX2J5dGUgKG91dHB1dF9iZmQpKSwKLQkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0JCSAob3V0cHV0X2JmZCwgJmNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zdGFiX2luZm8sCi0JCSAgbywgJnNlY2RhdGEtPnN0YWJfaW5mbywgY29udGVudHMpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgZ2xvYmFsIHN5bWJvbC4gIENhbGxlZCB2aWEgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0KLSAgaWYgKGgtPmluZHggPj0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0KLQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JICBpc3ltLm5fc2NudW0gPSBOX0FCUzsKLQllbHNlCi0JICBpc3ltLm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQlpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCWlmICghIG9ial9wZSAoZmluZm8tPm91dHB1dF9iZmQpKQotCSAgaXN5bS5uX3ZhbHVlICs9IHNlYy0+dm1hOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEp1c3QgaWdub3JlIHRoZXNlLiAgVGhleSBjYW4ndCBiZSBoYW5kbGVkIGFueWhvdy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIGhhc2g7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGhhc2ggPSB0cnVlOwotICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JaGFzaCA9IGZhbHNlOwotICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywgaGFzaCwKLQkJCQkgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXsKLQkgIGZpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotICAgIH0KLQotICBpc3ltLm5fc2NsYXNzID0gaC0+Y2xhc3M7Ci0gIGlzeW0ubl90eXBlID0gaC0+dHlwZTsKLQotICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX05VTEwpCi0gICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotCi0gIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZyBhbmQgdGhpcyBpcyB0aGUgcGFzcyB3aGVyZSB3ZSBjb252ZXJ0Ci0gICAgIGRlZmluZWQgZ2xvYmFscyB0byBzdGF0aWNzLCB0aGVuIGRvIHRoYXQgY29udmVyc2lvbiBub3cuICBJZiB0aGUKLSAgICAgc3ltYm9sIGlzIG5vdCBiZWluZyBjb252ZXJ0ZWQsIGp1c3QgaWdub3JlIGl0IGFuZCBpdCB3aWxsIGJlCi0gICAgIG91dHB1dCBkdXJpbmcgYSBsYXRlciBwYXNzLiAqLwotICBpZiAoZmluZm8tPmdsb2JhbF90b19zdGF0aWMpCi0gICAgewotICAgICAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19XRUFLRVhUCi0JICAmJiAoISBvYmpfcGUgKG91dHB1dF9iZmQpIHx8IGlzeW0ubl9zY2xhc3MgIT0gQ19OVF9XRUFLKSkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19TVEFUOwotICAgIH0KLQotICBpc3ltLm5fbnVtYXV4ID0gaC0+bnVtYXV4OwotICAKLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZmluZm8tPm91dHN5bXMpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKiBzeW1lc3opLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgc3ltZXN6LCAxLCBvdXRwdXRfYmZkKSAhPSBzeW1lc3opCi0gICAgewotICAgICAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGgtPmluZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgKytvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IGFueSBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzLiAgTW9zdCBvZiB0aGUgYXV4IGVudHJpZXMKLSAgICAgd2lsbCBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkLiAgV2UgaGF2ZSB0bwotICAgICBoYW5kbGUgc2VjdGlvbiBhdXggZW50cmllcyBoZXJlLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBmaW5hbAotICAgICByZWxvY2F0aW9uIGFuZCBsaW5lIG51bWJlciBjb3VudHMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgaXN5bS5uX251bWF1eDsgaSsrKQotICAgIHsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKLQotICAgICAgYXV4cCA9IGgtPmF1eCArIGk7Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgc2VjdGlvbiBhdXggZW50cnkgaGVyZSB1c2luZyB0aGUgc2FtZSB0ZXN0cyB0aGF0Ci0gICAgICAgICBjb2ZmX3N3YXBfYXV4X291dCB1c2VzLiAgKi8KLSAgICAgIGlmIChpID09IDAKLQkgICYmIChpc3ltLm5fc2NsYXNzID09IENfU1RBVAotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19ISURERU4pCi0JICAmJiBpc3ltLm5fdHlwZSA9PSBUX05VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGF1eHAtPnhfc2NuLnhfc2NubGVuID0gKHNlYy0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkgICAgICA/IHNlYy0+X2Nvb2tlZF9zaXplCi0JCQkJICAgICAgOiBzZWMtPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICAvKiBGb3IgUEUsIGFuIG92ZXJmbG93IG9uIHRoZSBmaW5hbCBsaW5rIHJlcG9ydGVkbHkgZG9lcwotICAgICAgICAgICAgICAgICBub3QgbWF0dGVyLiAgRklYTUU6IFdoeSBub3Q/ICAqLwotCi0JICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiAweGZmZmYKLQkJICAmJiAoISBvYmpfcGUgKG91dHB1dF9iZmQpCi0JCSAgICAgIHx8IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWMpLAotCQkgICBzZWMtPnJlbG9jX2NvdW50KTsKLQotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IDB4ZmZmZgotCQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkKLQkJICAgICAgfHwgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkpCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlYyksCi0JCSAgIHNlYy0+bGluZW5vX2NvdW50KTsKLQotCSAgICAgIGF1eHAtPnhfc2NuLnhfbnJlbG9jID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgICBhdXhwLT54X3Njbi54X25saW5ubyA9IHNlYy0+bGluZW5vX2NvdW50OwotCSAgICAgIGF1eHAtPnhfc2NuLnhfY2hlY2tzdW0gPSAwOwotCSAgICAgIGF1eHAtPnhfc2NuLnhfYXNzb2NpYXRlZCA9IDA7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9jb21kYXQgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpIGF1eHAsIGlzeW0ubl90eXBlLAotCQkJICAgICBpc3ltLm5fc2NsYXNzLCBpLCBpc3ltLm5fbnVtYXV4LAotCQkJICAgICAoUFRSKSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgc3ltZXN6LCAxLCBvdXRwdXRfYmZkKSAhPSBzeW1lc3opCi0JewotCSAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGFzayBnbG9iYWwgc3ltYm9scywgY29udmVydGluZyB0aGVtIHRvIHN0YXRpY3MuICBDYWxsZWQKLSAgIHZpYSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gIENhbGxzIGJmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0gdG8gZG8KLSAgIHRoZSBkaXJ0eSB3b3JrLCBpZiB0aGUgc3ltYm9sIHdlIGFyZSBwcm9jZXNzaW5nIG5lZWRzIGNvbnZlcnNpb24uICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gcnRudmFsID0gdHJ1ZTsKLSAgYm9vbGVhbiBzYXZlX2dsb2JhbF90b19zdGF0aWM7Ci0KLSAgaWYgKGgtPmluZHggPCAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCXsKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYyA9IGZpbmZvLT5nbG9iYWxfdG9fc3RhdGljOwotCSAgZmluZm8tPmdsb2JhbF90b19zdGF0aWMgPSB0cnVlOwotCSAgcnRudmFsID0gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0gKGgsIGRhdGEpOwotCSAgZmluZm8tPmdsb2JhbF90b19zdGF0aWMgPSBzYXZlX2dsb2JhbF90b19zdGF0aWM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCi0vKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgZmluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGZpbmZvLT5pbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgaG93dG8tPm5hbWUsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLAotCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5rX29yZGVyLT5vZmZzZXQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfb2N0ZXRzX3Blcl9ieXRlIChvdXRwdXRfYmZkKSksIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGluIHRoZSByaWdodCBwbGFjZS4gIEl0IHdpbGwgZ2V0Ci0gICAgIHN3YXBwZWQgYW5kIHdyaXR0ZW4gb3V0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsX2xpbmsgcm91dGluZS4gICovCi0KLSAgaXJlbCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbG9jcwotCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotICByZWxfaGFzaF9wdHIgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCi0gIG1lbXNldCAoaXJlbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0KLSAgaXJlbC0+cl92YWRkciA9IG91dHB1dF9zZWN0aW9uLT52bWEgKyBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNvbWVob3cgbG9jYXRlIGEgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLiAgVGhlCi0gICAgICAgICBzeW1ib2wgbXVzdCBlaXRoZXIgaGF2ZSBhIHZhbHVlIG9mIHplcm8sIG9yIHdlIG11c3QgYWRqdXN0Ci0gICAgICAgICB0aGUgYWRkZW5kIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgRklYTUU6IFdyaXRlIHRoaXMKLSAgICAgICAgIHdoZW4gd2UgbmVlZCBpdC4gIFRoZSBvbGQgbGlua2VyIGNvdWxkbid0IGhhbmRsZSB0aGlzIGFueWhvdy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBpZiAoaC0+aW5keCA+PSAwKQotCSAgICBpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIC0yIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvIGdldAotCQkgd3JpdHRlbiBvdXQuICAqLwotCSAgICAgIGgtPmluZHggPSAtMjsKLQkgICAgICAqcmVsX2hhc2hfcHRyID0gaDsKLQkgICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaXJlbC0+cl9zeW1uZHggPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogRklYTUU6IElzIHRoaXMgYWx3YXlzIHJpZ2h0PyAgKi8KLSAgaXJlbC0+cl90eXBlID0gaG93dG8tPnR5cGU7Ci0KLSAgLyogcl9zaXplIGlzIG9ubHkgdXNlZCBvbiB0aGUgUlMvNjAwMCwgd2hpY2ggbmVlZHMgaXRzIG93biBsaW5rZXIKLSAgICAgcm91dGluZXMgYW55aG93LiAgcl9leHRlcm4gaXMgb25seSB1c2VkIGZvciBFQ09GRi4gICovCi0KLSAgLyogRklYTUU6IFdoYXQgaXMgdGhlIHJpZ2h0IHZhbHVlIGZvciByX29mZnNldD8gIElzIHplcm8gT0s/ICAqLwotCi0gICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIGJhc2ljIHJlbG9jIGhhbmRsaW5nIHJvdXRpbmUgd2hpY2ggbWF5IGJlIHVzZWQgYnkgcHJvY2Vzc29ycyB3aXRoCi0gICBzaW1wbGUgcmVsb2NzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJCSAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bW5keCA8IDAKLQkgICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHN5bW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlbiB3ZSBjYW4ganVzdCBpZ25vcmUKLSAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgdGhhdCBpcyBwY3JlbF9vZmZzZXQuICBJdCB3aWxsIGFscmVhZHkKLSAgICAgICAgIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLAotICAgICAgICAgdGhlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+cGNyZWxfb2Zmc2V0KQotCXsKLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSAgICBhZGRlbmQgKz0gc3ltLT5uX3ZhbHVlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChpbnB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLQl7Ci0JICAvKiBFbWl0IGEgcmVsb2MgaWYgdGhlIGJhY2tlbmQgdGhpbmtzIGl0IG5lZWRzIGl0LiAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotCSAgICB7Ci0JICAgICAgLyogUmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2ggaXNuJ3QKLQkJIGFic29sdXRlLiAgV2Ugb3V0cHV0IHRoZSBhZGRyZXNzIGhlcmUgdG8gYSBmaWxlLgotCQkgVGhpcyBmaWxlIGlzIHRoZW4gcmVhZCBieSBkbGx0b29sIHdoZW4gZ2VuZXJhdGluZyB0aGUKLQkJIHJlbG9jIHNlY3Rpb24uICBOb3RlIHRoYXQgdGhlIGJhc2UgZmlsZSBpcyBub3QKLQkJIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gIFdlIHdyaXRlIG91dCBhIGxvbmcgaGVyZSwKLQkJIGFuZCBkbGx0b29sIHJlYWRzIGluIGEgbG9uZy4gICovCi0JICAgICAgbG9uZyBhZGRyID0gKHJlbC0+cl92YWRkciAKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hIAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0JCWFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkgICAgICBpZiAoZndyaXRlICgmYWRkciwgMSwgc2l6ZW9mIChsb25nKSwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKQotCQkgICE9IHNpemVvZiAobG9uZykpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotICAKLSAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2Zmc3dhcC5oIGIvYmZkL2NvZmZzd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjAxMWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZzd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MTMgKzAsMCBAQAotLyogR2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIHN3YXAgQ09GRiBkYXRhLiAgSXQgaXMgYSBoZWFkZXIKLSAgIGZpbGUgYmVjYXVzZSB0aGUgZGV0YWlscyBvZiBzd2FwcGluZyBkZXBlbmQgb24gdGhlIGRldGFpbHMgb2YgdGhlCi0gICBzdHJ1Y3R1cmVzIHVzZWQgYnkgZWFjaCBDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBpbmNsdWRlZCBieQotICAgY29mZmNvZGUuaCwgYXMgd2VsbCBhcyBieSB0aGUgRUNPRkYgYmFja2VuZC4KLQotICAgQW55IGZpbGUgd2hpY2ggdXNlcyB0aGlzIG11c3QgZmlyc3QgaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIiBhbmQKLSAgICJjb2ZmL0NQVS5oIi4gIFRoZSBmdW5jdGlvbnMgd2lsbCB0aGVuIGJlIGNvcnJlY3QgZm9yIHRoYXQgQ1BVLiAgKi8KLQotI2RlZmluZSBQVVRXT1JEIGJmZF9oX3B1dF8zMgotI2RlZmluZSBQVVRIQUxGIGJmZF9oX3B1dF8xNgotI2RlZmluZQlQVVRCWVRFIGJmZF9oX3B1dF84Ci0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0KLSNpZm5kZWYgR0VUX0ZDTl9FTkRORFgKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0KLSNpZm5kZWYgUFVUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgUFVUV09SRChhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotI2lmbmRlZiBQVVRfRkNOX0VORE5EWAotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBQVVRXT1JEKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTlJFTE9DCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8xNgotI2VuZGlmCi0jaWZuZGVmIE1BWF9TQ05IRFJfTlJFTE9DCi0jZGVmaW5lIE1BWF9TQ05IRFJfTlJFTE9DIDB4ZmZmZgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05IRFJfTlJFTE9DIGJmZF9oX3B1dF8xNgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTkxOTk8KLSNkZWZpbmUgR0VUX1NDTkhEUl9OTE5OTyBiZmRfaF9nZXRfMTYKLSNlbmRpZgotI2lmbmRlZiBNQVhfU0NOSERSX05MTk5PCi0jZGVmaW5lIE1BWF9TQ05IRFJfTkxOTk8gMHhmZmZmCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9OTE5OTwotI2RlZmluZSBQVVRfU0NOSERSX05MTk5PIGJmZF9oX3B1dF8xNgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfRkxBR1MKLSNkZWZpbmUgR0VUX1NDTkhEUl9GTEFHUyBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0ZMQUdTCi0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotI2lmbmRlZiBHRVRfUkVMT0NfVkFERFIKLSNkZWZpbmUgR0VUX1JFTE9DX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9SRUxPQ19WQUREUgotI2RlZmluZSBQVVRfUkVMT0NfVkFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hb3V0aGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zY25oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2ZpbGVoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9maWxlaGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLwotI2lmbmRlZiBOT19DT0ZGX1NZTUJPTFMKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2F1eF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfYXV4X291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfU1lNQk9MUyAqLwotI2lmbmRlZiBOT19DT0ZGX0xJTkVOT1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfTElORU5PUyAqLwotCi0jaWZuZGVmIE5PX0NPRkZfUkVMT0NTCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIFJFTE9DICpyZWxvY19zcmMgPSAoUkVMT0MgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgZHN0OwotCi0gIHJlbG9jX2RzdC0+cl92YWRkciA9IEdFVF9SRUxPQ19WQUREUiAoYWJmZCwgKGJmZF9ieXRlICopcmVsb2Nfc3JjLT5yX3ZhZGRyKTsKLSAgcmVsb2NfZHN0LT5yX3N5bW5keCA9IGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9zeW1uZHgpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzgoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUpOwotICByZWxvY19kc3QtPnJfc2l6ZSA9IGJmZF9oX2dldF84KGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplKTsKLSNlbHNlCi0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfdHlwZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCi0gIHJlbG9jX2RzdC0+cl9vZmZzZXQgPSBTV0FQX0lOX1JFTE9DX09GRlNFVChhYmZkLAotCQkJCQkgICAgIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfb2Zmc2V0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJc3JjOwotICAgICBQVFIJZHN0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX3NyYyA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKilzcmM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKWRzdDsKLSAgUFVUX1JFTE9DX1ZBRERSIChhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3NpemUpOwotI2Vsc2UKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotI2VuZGlmCi0KLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19PRkZTRVQKLSAgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQlyZWxvY19zcmMtPnJfb2Zmc2V0LAotCQkJKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9vZmZzZXQpOwotI2VuZGlmCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfRVhUUkEKLSAgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxyZWxvY19zcmMsIHJlbG9jX2RzdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9SRUxPQ1MgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUgKGFiZmQsIHNyYywgZHN0KTsKLSNlbmRpZgotICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfbWFnaWMpOwotICBmaWxlaGRyX2RzdC0+Zl9uc2NucyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnNjbnMpOwotICBmaWxlaGRyX2RzdC0+Zl90aW1kYXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RpbWRhdCk7Ci0gIGZpbGVoZHJfZHN0LT5mX3N5bXB0ciA9Ci0gICAgR0VUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfc3ltcHRyKTsKLSAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zeW1zKTsKLSAgZmlsZWhkcl9kc3QtPmZfb3B0aGRyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotI2lmZGVmIFRJQzgwX1RBUkdFVF9JRAotICBmaWxlaGRyX2RzdC0+Zl90YXJnZXRfaWQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RhcmdldF9pZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgKGFiZmQsIHNyYywgZHN0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKLSAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKilvdXQ7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX3RpbWRhdCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RpbWRhdCk7Ci0gIFBVVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF92bWEpIGZpbGVoZHJfaW4tPmZfc3ltcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfc3ltcHRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfbnN5bXMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc3ltcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX29wdGhkciwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX29wdGhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX2ZsYWdzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfZmxhZ3MpOwotI2lmZGVmIFRJQzgwX1RBUkdFVF9JRAotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl90YXJnZXRfaWQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90YXJnZXRfaWQpOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotfQotCi0KLSNpZm5kZWYgTk9fQ09GRl9TWU1CT0xTCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgU1lNRU5UICpleHQgPSAoU1lNRU5UICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOwotCi0gIGlmKCBleHQtPmUuZV9uYW1lWzBdID09IDApIHsKLSAgICBpbi0+X24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLSAgaW4tPm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7IAotICBpbi0+bl9zY251bSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMil7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBpbi0+bl9zY2xhc3MgPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfc2NsYXNzKTsKLSAgaW4tPm5fbnVtYXV4ID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX251bWF1eCk7Ci0jaWZkZWYgQ09GRl9BREpVU1RfU1lNX0lOX1BPU1QKLSAgQ09GRl9BREpVU1RfU1lNX0lOX1BPU1QgKGFiZmQsIGV4dDEsIGluMSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIGlucCwgZXh0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJZXh0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWlucDsKLSAgU1lNRU5UICpleHQgPShTWU1FTlQgKilleHRwOwotICBpZihpbi0+X24uX25fbmFtZVswXSA9PSAwKSB7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX3plcm9lcyk7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5fbi5fbl9uLl9uX29mZnNldCwgKGJmZF9ieXRlICopICBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShleHQtPmUuZV9uYW1lLCBpbi0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgICB7Ci0JYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICAgIH0KLSAgZWxzZQotICAgICAgewotCWJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgICB9Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9zY2xhc3MgLCBleHQtPmVfc2NsYXNzKTsKLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX251bWF1eCAsIGV4dC0+ZV9udW1hdXgpOwotI2lmZGVmIENPRkZfQURKVVNUX1NZTV9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9TWU1fT1VUX1BPU1QgKGFiZmQsIGlucCwgZXh0cCk7Ci0jZW5kaWYKLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9JTl9QUkUKLSAgQ09GRl9BREpVU1RfQVVYX0lOX1BSRSAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgICBpZiAoZXh0LT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0JICBpbi0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICBpbi0+eF9maWxlLnhfbi54X29mZnNldCA9IAotCSAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLQl9IGVsc2UgewotI2lmIEZJTE5NTEVOICE9IEVfRklMTk1MRU4KLQkgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0JICAgIGlmIChudW1hdXggPiAxKQotCSAgICAgIHsKLQkJaWYgKGluZHggPT0gMCkKLQkJICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwKLQkJCSAgbnVtYXV4ICogc2l6ZW9mIChBVVhFTlQpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW1lbWNweSAoaW4tPnhfZmlsZS54X2ZuYW1lLCBleHQtPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0JICAgICAgfQotI2VuZGlmCi0JICB9Ci0gICAgICBnb3RvIGVuZDsKLQotICAgIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgICBjYXNlIENfSElEREVOOgotICAgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0JICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotCSAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLQkgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0KLQkgIC8qIFBFIGRlZmluZXMgc29tZSBleHRyYSBmaWVsZHM7IHdlIHplcm8gdGhlbSBvdXQgZm9yCi0gICAgICAgICAgICAgc2FmZXR5LiAgKi8KLQkgIGluLT54X3Njbi54X2NoZWNrc3VtID0gMDsKLQkgIGluLT54X3Njbi54X2Fzc29jaWF0ZWQgPSAwOwotCSAgaW4tPnhfc2NuLnhfY29tZGF0ID0gMDsKLQotCSAgZ290byBlbmQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci0KLWVuZDogOwotICAvKiB0aGUgc2VtaWNvbG9uIGlzIGJlY2F1c2UgTVNWQyBkb2Vzbid0IGxpa2UgbGFiZWxzIGF0Ci0gICAgIGVuZCBvZiBibG9jay4gKi8KLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgICphYmZkOwotICAgICBQVFIgCWlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50ICAgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUglleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWlucDsKLSAgQVVYRU5UICpleHQgPSAoQVVYRU5UICopZXh0cDsKLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApOwotI2VuZGlmCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIFBVVFdPUkQoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X3plcm9lcyk7Ci0gICAgICBQVVRXT1JEKGFiZmQsCi0JICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQsCi0JICAgICAgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0gICAgfQotICAgIGVsc2UgewotI2lmIEZJTE5NTEVOICE9IEVfRklMTk1MRU4KLSAgICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7Ci0jZWxzZQotICAgICAgbWVtY3B5IChleHQtPnhfZmlsZS54X2ZuYW1lLCBpbi0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLSNlbmRpZgotICAgIH0KLSAgICBnb3RvIGVuZDsKLQotICBjYXNlIENfU1RBVDoKLSNpZmRlZiBDX0xFQUZTVEFUCi0gIGNhc2UgQ19MRUFGU1RBVDoKLSNlbmRpZgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgUFVUX1NDTl9TQ05MRU4oYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCBleHQpOwotICAgICAgUFVUX1NDTl9OUkVMT0MoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCBleHQpOwotICAgICAgUFVUX1NDTl9OTElOTk8oYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCBleHQpOwotICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgUFVUV09SRChhYmZkLCBpbi0+eF9zeW0ueF90YWduZHgubCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotI2lmbmRlZiBOT19UVk5EWAotICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc3ltLnhfdHZuZHggLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLSNlbmRpZgotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIFBVVF9GQ05fTE5OT1BUUihhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgZXh0KTsKLSAgICAgIFBVVF9GQ05fRU5ETkRYKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTiAodHlwZSkpCi0gICAgUFVUV09SRCAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLWVuZDoKLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApOwotI2VuZGlmCi0gIHJldHVybiBBVVhFU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX1NZTUJPTFMgKi8KLQotI2lmbmRlZiBOT19DT0ZGX0xJTkVOT1MKLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBMSU5FTk8gKmV4dCA9IChMSU5FTk8gKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbjE7Ci0KLSAgaW4tPmxfYWRkci5sX3N5bW5keCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotICBpbi0+bF9sbm5vID0gR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCBpbnAsIG91dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCW91dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmV4dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopb3V0cDsKLSAgUFVUV09SRChhYmZkLCBpbi0+bF9hZGRyLmxfc3ltbmR4LCAoYmZkX2J5dGUgKikKLQkgIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLQotICBQVVRfTElORU5PX0xOTk8gKGFiZmQsIGluLT5sX2xubm8sIGV4dCk7Ci0gIHJldHVybiBMSU5FU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX0xJTkVOT1MgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIEFPVVRIRFIgICAgICAgICphb3V0aGRyX2V4dCA9IChBT1VUSERSICopIGFvdXRoZHJfZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkcl9pbnQxOwotCi0gIGFvdXRoZHJfaW50LT5tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm1hZ2ljKTsKLSAgYW91dGhkcl9pbnQtPnZzdGFtcCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZzdGFtcCk7Ci0gIGFvdXRoZHJfaW50LT50c2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dHNpemUpOwotICBhb3V0aGRyX2ludC0+ZHNpemUgPQotICAgIEdFVF9BT1VUSERSX0RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmJzaXplID0KLSAgICBHRVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5ic2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5lbnRyeSA9Ci0gICAgR0VUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZW50cnkpOwotICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50ZXh0X3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZGF0YV9zdGFydCk7Ci0KLSNpZmRlZiBJOTYwCi0gIGFvdXRoZHJfaW50LT50YWdlbnRyaWVzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIEFQT0xMT19NNjgKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX2lubGliLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm9faW5saWIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPm9fc3JpLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm9fc3JpKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT52aWRbMF0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dmlkKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT52aWRbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dmlkICsgNCk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jaWZkZWYgWENPRkY2NAotICBhb3V0aGRyX2ludC0+b190b2MgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPm9fdG9jKTsKLSNlbHNlCi0gIGFvdXRoZHJfaW50LT5vX3RvYyA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b190b2MpOwotI2VuZGlmCi0gIGFvdXRoZHJfaW50LT5vX3NuZW50cnkgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT5vX3NudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRleHQpOwotICBhb3V0aGRyX2ludC0+b19zbmRhdGEgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fc250b2MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc250b2MpOwotICBhb3V0aGRyX2ludC0+b19zbmxvYWRlciA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmxvYWRlcik7Ci0gIGFvdXRoZHJfaW50LT5vX3NuYnNzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NuYnNzKTsKLSAgYW91dGhkcl9pbnQtPm9fYWxnbnRleHQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fYWxnbnRleHQpOwotICBhb3V0aGRyX2ludC0+b19hbGduZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGduZGF0YSk7Ci0gIGFvdXRoZHJfaW50LT5vX21vZHR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fbW9kdHlwZSk7Ci0gIGFvdXRoZHJfaW50LT5vX2NwdXR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fY3B1dHlwZSk7Ci0jaWZkZWYgWENPRkY2NAotICBhb3V0aGRyX2ludC0+b19tYXhzdGFjayA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+b19tYXhzdGFjayk7Ci0gIGFvdXRoZHJfaW50LT5vX21heGRhdGEgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4ZGF0YSk7Ci0jZWxzZQotICBhb3V0aGRyX2ludC0+b19tYXhzdGFjayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b19tYXhzdGFjayk7Ci0gIGFvdXRoZHJfaW50LT5vX21heGRhdGEgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4ZGF0YSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgTUlQU0VDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzBdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMV0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1syXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1syXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICBhb3V0aGRyX2ludC0+YnNzX3N0YXJ0ID0gYmZkX2hfZ2V0XzY0KGFiZmQsIGFvdXRoZHJfZXh0LT5ic3Nfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+Z3BfdmFsdWUgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmdwX3ZhbHVlKTsKLSAgYW91dGhkcl9pbnQtPmdwcm1hc2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmdwcm1hc2spOwotICBhb3V0aGRyX2ludC0+ZnBybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+ZnBybWFzayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKLSAgQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoQU9VVEhEUiAqKW91dDsKLQotICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+bWFnaWMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+bWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+dnN0YW1wLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnZzdGFtcCk7Ci0gIFBVVF9BT1VUSERSX1RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT50c2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50c2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5kc2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kc2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0JTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5ic2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0VOVFJZIChhYmZkLCBhb3V0aGRyX2luLT5lbnRyeSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5lbnRyeSk7Ci0gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGV4dF9zdGFydCk7Ci0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZGF0YV9zdGFydCk7Ci0KLSNpZmRlZiBJOTYwCi0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT50YWdlbnRyaWVzLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSNpZmRlZiBYQ09GRjY0Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgYW91dGhkcl9pbi0+b190b2MsIGFvdXRoZHJfb3V0LT5vX3RvYyk7Ci0jZWxzZQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fdG9jLCBhb3V0aGRyX291dC0+b190b2MpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmVudHJ5LCBhb3V0aGRyX291dC0+b19zbmVudHJ5KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NudGV4dCwgYW91dGhkcl9vdXQtPm9fc250ZXh0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuZGF0YSwgYW91dGhkcl9vdXQtPm9fc25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NudG9jLCBhb3V0aGRyX291dC0+b19zbnRvYyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmxvYWRlciwgYW91dGhkcl9vdXQtPm9fc25sb2FkZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25ic3MsIGFvdXRoZHJfb3V0LT5vX3NuYnNzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2FsZ250ZXh0LCBhb3V0aGRyX291dC0+b19hbGdudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGduZGF0YSwgYW91dGhkcl9vdXQtPm9fYWxnbmRhdGEpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbW9kdHlwZSwgYW91dGhkcl9vdXQtPm9fbW9kdHlwZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19jcHV0eXBlLCBhb3V0aGRyX291dC0+b19jcHV0eXBlKTsKLSNpZmRlZiBYQ09GRjY0Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhzdGFjaywgYW91dGhkcl9vdXQtPm9fbWF4c3RhY2spOwotICBiZmRfaF9wdXRfNjQgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4ZGF0YSwgYW91dGhkcl9vdXQtPm9fbWF4ZGF0YSk7Ci0jZWxzZQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4c3RhY2ssIGFvdXRoZHJfb3V0LT5vX21heHN0YWNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX21heGRhdGEsIGFvdXRoZHJfb3V0LT5vX21heGRhdGEpOwotI2VuZGlmCi0gIG1lbXNldCAoYW91dGhkcl9vdXQtPm9fcmVzdjIsIDAsIHNpemVvZiBhb3V0aGRyX291dC0+b19yZXN2Mik7Ci0jaWZkZWYgWENPRkY2NAotICBtZW1zZXQgKGFvdXRoZHJfb3V0LT5vX2RlYnVnZ2VyLCAwLCBzaXplb2YgYW91dGhkcl9vdXQtPm9fZGVidWdnZXIpOwotICBtZW1zZXQgKGFvdXRoZHJfb3V0LT5vX3Jlc3YzLCAwLCBzaXplb2YgYW91dGhkcl9vdXQtPm9fcmVzdjMpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1swXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzJdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1szXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICAvKiBGSVhNRTogV2hhdCBkb2VzIGJsZHJldiBtZWFuPyAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAyLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJsZHJldik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5wYWRkaW5nKTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmZwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZnBybWFzayk7Ci0jZW5kaWYKLQotICByZXR1cm4gQU9VVFNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPQotICAgIEdFVF9TQ05IRFJfRkxBR1MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPQotICAgIEdFVF9TQ05IRFJfTlJFTE9DIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICBHRVRfU0NOSERSX05MTk5PIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jaWZkZWYgSTk2MAotICBzY25oZHJfaW50LT5zX2FsaWduID0KLSAgICBHRVRfU0NOSERSX0FMSUdOIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgbWVtY3B5KHNjbmhkcl9leHQtPnNfbmFtZSwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0KLSAgUFVUX1NDTkhEUl9WQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c192YWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotCi0gIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcGFkZHIsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc2NuaGRyX2ludC0+c19zaXplLAotCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLSAgUFVUX1NDTkhEUl9GTEFHUyAoYWJmZCwgc2NuaGRyX2ludC0+c19mbGFncywKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSNpZiBkZWZpbmVkKE04OCkKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIFBVVFdPUkQoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0jZWxzZQotICBpZiAoc2NuaGRyX2ludC0+c19ubG5ubyA8PSBNQVhfU0NOSERSX05MTk5PKQotICAgIFBVVF9TQ05IRFJfTkxOTk8oYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgCi0JICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSArIDFdOwotCi0gICAgICBtZW1jcHkgKGJ1Ziwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICAgICAgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKV0gPSAnXDAnOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSBidWYsIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotICAgICAgUFVUX1NDTkhEUl9OTE5OTyhhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgICB9Ci0gIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSBNQVhfU0NOSERSX05SRUxPQykKLSAgICBQVVRfU0NOSERSX05SRUxPQyhhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywgCi0JICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIGJ1Ziwgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIFBVVF9TQ05IRFJfTlJFTE9DKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIHJldCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBJOTYwCi0gIFBVVF9TQ05IRFJfQUxJR04gKGFiZmQsIHNjbmhkcl9pbnQtPnNfYWxpZ24sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2FsaWduKTsKLSNlbmRpZgotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmJmZCBiL2JmZC9jb25maWcuYmZkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRhMTY4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuYmZkCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLSMgY29uZmlnLmJmZAotIyBDb252ZXJ0IGEgY2Fub25pY2FsIGhvc3QgdHlwZSBpbnRvIGEgQkZEIGhvc3QgdHlwZS4KLSMgU2V0IHNoZWxsIHZhcmlhYmxlIHRhcmcgdG8gY2Fub25pY2FsIHRhcmdldCBuYW1lLCBhbmQgcnVuCi0jIHVzaW5nIGBgLiBjb25maWcuYmZkJycuCi0jIFNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2RlZnZlYwkJRGVmYXVsdCB2ZWN0b3IgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX3NlbHZlY3MJCVZlY3RvcnMgdG8gYnVpbGQgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX2FyY2hzCQlBcmNoaXRlY3R1cmVzIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19jZmxhZ3MJCSQoQ0ZMQUdTKSBmb3IgdGhpcyB0YXJnZXQgKEZJWE1FOiBwcmV0dHkgYm9ndXMpCi0jICB0YXJnX3VuZGVyc2NvcmUJV2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZDogeWVzIG9yIG5vCi0KLSMgUGFydCBvZiB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRhcmdtYXRjaC5zZWQgdG8gZ2VuZXJhdGUgdGhlCi0jIHRhcmdtYXRjaC5oIGZpbGUuICBUaGUgI2lmZGVmIGFuZCAjZW5kaWYgbGluZXMgdGhhdCBhcHBlYXIgYmVsb3cgYXJlCi0jIGNvcGllZCBkaXJlY3RseSBpbnRvIHRhcmdtYXRjaC5oLgotCi0jIFRoZSBiaW51dGlscyBjKytmaWx0IHByb2dyYW0gd2FudHMgdG8ga25vdyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZQotIyBzdHJpcHBlZCBvciBub3QuICBUaGF0IGlzIHdoeSB3ZSBzZXQgdGFyZ191bmRlcnNjb3JlLiAgYysrZmlsdCB1c2VzCi0jIHRoaXMgaW5mb3JtYXRpb24gdG8gY2hvb3NlIGEgZGVmYXVsdC4gIFRoaXMgaW5mb3JtYXRpb24gaXMKLSMgZHVwbGljYXRlZCBpbiB0aGUgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCBvZiB0aGUgQkZEIHRhcmdldAotIyB2ZWN0b3IsIGJ1dCBjKytmaWx0IGRvZXMgbm90IGRlYWwgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGlzIG5vdAotIyBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuYS4gIEl0IGlzIG5vdCB0ZXJyaWJseSBpbXBvcnRhbnQgdGhhdCBjKytmaWx0Ci0jIGdldCB0aGlzIHJpZ2h0OyBpdCBpcyBqdXN0IGNvbnZlbmllbnQuCi0KLXRhcmdfZGVmdmVjPQotdGFyZ19zZWx2ZWNzPQotdGFyZ19jZmxhZ3M9Ci10YXJnX3VuZGVyc2NvcmU9bm8KLQotdGFyZ19jcHU9YGVjaG8gJHRhcmcgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotY2FzZSAiJHt0YXJnX2NwdX0iIGluCi1hbHBoYSopIHRhcmdfYXJjaHM9YmZkX2FscGhhX2FyY2ggOzsKLWFybSopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci1zdHJvbmdhcm0qKSB0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotdGh1bWIqKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotYzMwKikJdGFyZ19hcmNocz1iZmRfdGljMzBfYXJjaCA7OwotYzU0eCopCXRhcmdfYXJjaHM9YmZkX3RpYzU0eF9hcmNoIDs7Ci1ocHBhKikJdGFyZ19hcmNocz1iZmRfaHBwYV9hcmNoIDs7Ci1pWzM0NTZdODYpIHRhcmdfYXJjaHM9YmZkX2kzODZfYXJjaCA7OwotaTM3MCkgICB0YXJnX2FyY2hzPWJmZF9pMzcwX2FyY2ggOzsKLW02OCopCXRhcmdfYXJjaHM9YmZkX202OGtfYXJjaCA7OwotbTg4KikJdGFyZ19hcmNocz1iZmRfbTg4a19hcmNoIDs7Ci1taXBzKikJdGFyZ19hcmNocz1iZmRfbWlwc19hcmNoIDs7Ci1waiopCXRhcmdfYXJjaHM9ImJmZF9wal9hcmNoIGJmZF9pMzg2X2FyY2giOzsKLXBvd2VycGMqKSB0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXJzNjAwMCkJdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7Ci1zcGFyYyopIHRhcmdfYXJjaHM9YmZkX3NwYXJjX2FyY2ggOzsKLXY4NTAqKQl0YXJnX2FyY2hzPWJmZF92ODUwX2FyY2ggOzsKLXo4ayopCXRhcmdfYXJjaHM9YmZkX3o4a19hcmNoIDs7Ci0qKQl0YXJnX2FyY2hzPWJmZF8ke3RhcmdfY3B1fV9hcmNoIDs7Ci1lc2FjCi0KLQotIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgotIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91Ci0jICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCi0jICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgotCi1jYXNlICIke3Rhcmd9IiBpbgotIyBTVEFSVCBPRiB0YXJnbWF0Y2guaAotI2lmZGVmIEJGRDY0Ci0gIGFscGhhKi0qLW5ldGJzZCogfCBhbHBoYSotKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1ubG0zMl9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eGVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4LWdudSogfCBhbHBoYSotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgaWE2NCotKi1saW51eC1nbnUqIHwgaWE2NCotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9pYTY0X2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGY2NF9pYTY0X2JpZ192ZWMgYmZkX2VmaV9hcHBfaWE2NF92ZWMiCi0gICAgOzsKLSAgc3BhcmM2NC0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0jZW5kaWYgLyogQkZENjQgKi8KLQotICBhcmMtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcmNfdmVjCi0gICAgOzsKLQotICBhcm0tKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWFybW5ldGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotcmlzY2l4KikKLSAgICB0YXJnX2RlZnZlYz1yaXNjaXhfdmVjCi0gICAgOzsKLSAgYXJtLWVwb2MtcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybV9lcG9jX3BlX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVfYmlnX3ZlYyBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9bm8KLSAgICA7OwotICBhcm0td2luY2UtcGUgfCBhcm0tKi13aW5jZSkKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgdGFyZ19jZmxhZ3M9LURBUk1fV0lOQ0UKLSAgICA7OwotICBhcm0tKi1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KQkKLSAgICB0YXJnX2RlZnZlYz1hb3V0X2FybV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFvdXRfYXJtX2JpZ192ZWMKLSAgICA7OwotICBhcm1lYi0qLWFvdXQpCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9hcm1fYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hb3V0X2FybV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYXJtLSotY29mZikKLSAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGFybWViLSotZWxmIHwgYXJtKmItKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgOzsKLSAgYXJtLSotZWxmIHwgYXJtKi0qLWxpbnV4LWdudSogfCBhcm0qLSotY29uaXgqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgOzsKLSAgYXJtLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotCi0gIHRodW1iLSotY29mZikKLSAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHRodW1iLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotICB0aHVtYi0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHRodW1iLWVwb2MtcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybV9lcG9jX3BlX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVfYmlnX3ZlYyBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9bm8KLSAgICA7OwotICB0aHVtYi0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGEyOWstKi1lYm1vbiogfCBhMjlrLSotdWRpKiB8IGEyOWstKi1jb2ZmKiB8IGEyOWstKi1zeW0xKiB8IFwKLSAgYTI5ay0qLXZ4d29ya3MqIHwgYTI5ay0qLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPWEyOWtjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhMjlrLSotYW91dCogfCBhMjlrLSotYnNkKiB8IGEyOWstKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgYXZyLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYXZyX3ZlYwotICAgIDs7Ci0KLSAgYzMwLSotKmFvdXQqIHwgdGljMzAtKi0qYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfYW91dF92ZWMKLSAgICA7OwotICBjMzAtKi0qY29mZiogfCB0aWMzMC0qLSpjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz10aWMzMF9jb2ZmX3ZlYwotICAgIDs7Ci0KLSAgYzU0eCotKi0qY29mZiogfCB0aWM1NHgtKi0qY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9dGljNTR4X2NvZmYxX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0idGljNTR4X2NvZmYxX2JlaF92ZWMgdGljNTR4X2NvZmYyX3ZlYyB0aWM1NHhfY29mZjJfYmVoX3ZlYyB0aWM1NHhfY29mZjBfdmVjIHRpYzU0eF9jb2ZmMF9iZWhfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGQxMHYtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMTB2X3ZlYwotICAgIDs7Ci0KLSAgZDMwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QzMHZfdmVjCi0gICAgOzsKLQotICBmcjMwLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9mcjMwX3ZlYwotICAgIDs7Ci0KLQotICBoODMwMCotKi0qKQotICAgIHRhcmdfZGVmdmVjPWg4MzAwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBoODUwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDg1MDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGhwcGEqLSotKmVsZiogfCBocHBhKi0qLWxpbnV4LWdudSogfCBocHBhKi0qLWxpdGVzKiB8IGhwcGEqLSotc3lzdjQqIHwgaHBwYSotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNpZmRlZiBCRkQ2NCAKLSAgaHBwYSo2NCotKi1ocHV4MTEqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9ocHBhX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1ESFBVWF9MQVJHRV9BUl9JRFMKLSAgICA7OwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU1QRUlYKQotICBocHBhKi0qLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaHBwYV92ZWMKLSAgICA7OwotICBocHBhKi0qLWhwdXgqIHwgaHBwYSotKi1oaXV4KiB8IGhwcGEqLSotbXBlaXgqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICA7OwotICBocHBhKi0qLW9zZiopCi0gICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaHBwYV92ZWMKLSAgICA7OwotI2VuZGlmIC8qIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSAqLwotCi0gIGkzNzAtKi0qKSAKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM3MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9pMzcwX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSpjb2ZmKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NCogfCBpWzM0NTZdODYtKi11bml4d2FyZSogfCBpWzM0NTZdODYtKi1zb2xhcmlzMiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWVsZiB8IGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KiB8IFwKLSAgaVszNDU2XTg2LSotZGd1eCogfCBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXJ0ZW1zZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbXNkb3NkamdwcCogfCBpWzM0NTZdKi0qLWdvMzIqIHwgaVszNDU2XTg2LWdvMzItcnRlbXMqICkKLSAgICB0YXJnX2RlZnZlYz1nbzMyY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImdvMzJzdHViYmVkY29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3YqIHwgaVszNDU2XTg2LSotaXNjKiB8IGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1jb2ZmIHwgXAotICBpWzM0NTZdODYtKi1haXgqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04NiotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfaTM4Nl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2ZHluaXhfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZnJlZWJzZGFvdXQqIHwgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0uKiB8IFwKLSAgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0pCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmZyZWVic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXRic2RlbGYqKSAKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4Nm5ldGJzZF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXRic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2kzODZfdmVjIGkzODZic2RfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX2kzODZfdmVjIGkzODZjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbGludXgqYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmxpbnV4X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZsaW51eF92ZWMgYmZkX2VmaV9hcHBfaWEzMl92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWFjaCogfCBpWzM0NTZdODYtKi1vc2YxbWsqKQotICAgIHRhcmdfZGVmdmVjPWkzODZtYWNoM192ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotb3M5aykKLSAgICB0YXJnX2RlZnZlYz1pMzg2b3M5a192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2RvcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZtc2Rvc192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tb3NzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZtc2Rvc192ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NwZSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zZWxmKiB8IGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1pbnRlcml4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyIKLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIGNoZWNrZWQgYXQgcnVudGltZS4KLSAgICB0YXJnX2NmbGFncz0tRFNUUklDVF9QRV9GT1JNQVQKLSAgICA7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKiB8IGlbMzQ1Nl04Ni0qLWN5Z3dpbiogfCBpWzM0NTZdODYtKi13aW5udCB8IGlbMzQ1Nl04Ni0qLXBlKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMgYmZkX2VsZjMyX2kzODZfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1ub25lLSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYW91dCogfCBpWzM0NTZdODYqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKiB8IGk4NjAtKi1jb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1pODYwY29mZl92ZWMKLSAgICA7OwotICBpODYwLSotc3lzdjQqIHwgaTg2MC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2k4NjBfdmVjCi0gICAgOzsKLQotICBpOTYwLSotdnh3b3JrczQqIHwgaTk2MC0qLXZ4d29ya3M1LjApCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotdnh3b3JrczUuKiB8IGk5NjAtKi1jb2ZmKiB8IGk5NjAtKi1zeXN2KiB8IGk5NjAtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9aWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaWNvZmZfYmlnX3ZlYyBiX291dF92ZWNfbGl0dGxlX2hvc3QgYl9vdXRfdmVjX2JpZ19ob3N0IGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotdnh3b3JrcyogfCBpOTYwLSotYW91dCogfCBpOTYwLSotYm91dCogfCBpOTYwLSotbmluZHkqKQotICAgIHRhcmdfZGVmdmVjPWJfb3V0X3ZlY19saXR0bGVfaG9zdAotICAgIHRhcmdfc2VsdmVjcz0iYl9vdXRfdmVjX2JpZ19ob3N0IGljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyBpZWVlX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaTk2MC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2k5NjBfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMiCi0gICAgOzsKLQotICBtMzJyLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTMycl92ZWMKLSAgICA7OwotCi0gIG02OCotYXBvbGxvLSopCi0gICAgdGFyZ19kZWZ2ZWM9YXBvbGxvY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWJ1bGwtc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZ1bl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrc3lzdmNvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki1ocC1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwYnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dDBfYmlnX3ZlYwotICAgICMgV2UgaW5jbHVkZSBjaXNjb19jb3JlX2JpZ192ZWMgaGVyZSwgcmF0aGVyIHRoYW4gbWFraW5nIGEgc2VwYXJhdGUgY2lzY28KLSAgICAjIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQgY2lzY28tY29yZS5jIGdldHMgcm91dGluZWx5IHRlc3RlZCBhdAotICAgICMgbGVhc3QgZm9yIGNvbXBpbGF0aW9uLgotICAgIHRhcmdfc2VsdmVjcz0iY2lzY29fY29yZV9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotZWxmKiB8IG02OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMgYW91dDBfYmlnX3ZlYyIKLSAgICA7OwotICBtNjgqLSotY29mZiogfCBtNjgqLSotc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgdmVyc2Fkb3NfdmVjIGllZWVfdmVjIgotICAgIDs7Ci0gIG02OCotKi1ocHV4KikKLSAgICB0YXJnX2RlZnZlYz1ocDMwMGhwdXhfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2xpbnV4X3ZlYwotICAgIDs7Ci0gIG02OCotKi1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgICMgdGFyZ19zZWx2ZWNzPW02OGttYWNoM192ZWMKLSAgICAjIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG02OCotKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPW02OGtseW54X2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW02OGtseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgbTY4Ki1ocCotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrNGtuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGs0a25ldGJzZF92ZWMgaHAzMDBic2RfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1zdW5vcyogfCBtNjgqLSotb3M2OGsqIHwgbTY4Ki0qLXZ4d29ya3MqIHwgbTY4Ki1uZXR4LSogfCBcCi0gIG02OCotKi1ic2QqIHwgbTY4Ki0qLXZzdGEqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1lcmljc3Nvbi0qKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgdGVraGV4X3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1jYm0tKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2NvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotICAgIHRhcmdfZGVmdmVjPW02OGthdXhfY29mZl92ZWMKLSAgICA7OwotICBtNjgqLSotcHNvcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWllZWVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgbTg4Ki1oYXJyaXMtY3h1eCogfCBtODgqLSotZGd1eCogfCBtODgqLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tODhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tODhrYmNzX3ZlYwotICAgIDs7Ci0gIG04OCotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a21hY2gzX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG04OCotKi0qKQotICAgIHRhcmdfZGVmdmVjPW04OGtiY3NfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgbWNvcmUtKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21jb3JlX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9tY29yZV9iaWdfdmVjIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1jb3JlLSotcGUpCi0gICAgdGFyZ19kZWZ2ZWM9bWNvcmVfcGVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibWNvcmVfcGVfYmlnX3ZlYyBtY29yZV9wZV9saXR0bGVfdmVjIG1jb3JlX3BlaV9iaWdfdmVjIG1jb3JlX3BlaV9saXR0bGVfdmVjIgotICAgIDs7Ci0KLSAgbWlwcyotYmlnLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcy1kZWMtbmV0YnNkKiB8IG1pcHMqZWwqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSBtaXBzKi0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgZWNvZmZfYmlnX3ZlYyBlY29mZl9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1pcHMqLWRlYy1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWFvdXRfbWlwc19saXR0bGVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG1pcHMqLWRlYy1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi1kZWMtKiB8IG1pcHMqZWwtKi1lY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9iaWdfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1lY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg1KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotc2dpLSogfCBtaXBzKi0qLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1sbmV3cyopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbWFjaDMqKQotICAgIHRhcmdfZGVmdmVjPWFvdXRfbWlwc19saXR0bGVfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbWlwcyotKi1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9bWlwc2xwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im1pcHNscGVpX3ZlYyBtaXBzbHBlaV92ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtaXBzKi0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2KiB8IG1pcHMqLSotcmlzY29zKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKmVsLSotZWxmKiB8IG1pcHMqZWwtKi1ydGVtcyogfCBtaXBzKmVsLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWVsZiogfCBtaXBzKi0qLXJ0ZW1zKiB8IG1pcHMqLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLW5vbmUpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKmVsKi0qLWxpbnV4LWdudSogfCBtaXBzKmVsKi0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbGludXgtZ251KiB8IG1pcHMqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtbjEwMjAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbW4xMDIwMF92ZWMKLSAgICA7OwotCi0gIG1uMTAzMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotICAgIDs7Ci0KLSAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJtYWNoYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1saXRlcyogfCBuczMyay0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXBjNTMybmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHBqLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfcGpfdmVjIGJmZF9lbGYzMl9wamxfdmVjIgotICAgIDs7Ci0KLSAgcGpsLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpsX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3BqbF92ZWMgYmZkX2VsZjMyX3BqX3ZlYyBiZmRfZWxmMzJfaTM4Nl92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjLSotYWl4KiB8IHBvd2VycGMtKi1iZW9zKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZjY0X3ZlYyIKLSAgICA7OwotICBwb3dlcnBjLSotKmJzZCogfCBwb3dlcnBjLSotZWxmKiB8IHBvd2VycGMtKi1zeXN2NCogfCBwb3dlcnBjLSotZWFiaSogfCBcCi0gIHBvd2VycGMtKi1zb2xhcmlzMiogfCBwb3dlcnBjLSotbGludXgtZ251KiB8IHBvd2VycGMtKi1ydGVtcyogfCBcCi0gIHBvd2VycGMtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9InJzNjAwMGNvZmZfdmVjIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjIHBwY2Jvb3RfdmVjIgotICAgIDs7Ci0gIHBvd2VycGMtKi1tYWNvcyogfCBwb3dlcnBjLSotbXB3KikKLSAgICB0YXJnX2RlZnZlYz1wbWFjX3hjb2ZmX3ZlYwotICAgIDs7Ci0gIHBvd2VycGMtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3Bvd2VycGNfdmVjIHJzNjAwMGNvZmZfdmVjIgotICAgIDs7Ci0gIHBvd2VycGNsZS0qLWVsZiogfCBwb3dlcnBjbGUtKi1zeXN2NCogfCBwb3dlcnBjbGUtKi1lYWJpKiB8IFwKLSAgcG93ZXJwY2xlLSotc29sYXJpczIqIHwgcG93ZXJwY2xlLSotbGludXgtZ251KiB8IHBvd2VycGNsZS0qLXZ4d29ya3MqIHxcCi0gIHBvd2VycGNsZS0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZl92ZWMgYmZkX2VsZjMyX3Bvd2VycGNfdmVjIHBwY2Jvb3RfdmVjIgotICAgIDs7Ci0KLSAgcG93ZXJwY2xlLSotcGUgfCBwb3dlcnBjbGUtKi13aW5udCogfCBwb3dlcnBjbGUtKi1jeWd3aW4qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9wb3dlcnBjbGVfcGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfcG93ZXJwY2xlX3BlaV92ZWMgYmZkX3Bvd2VycGNfcGVpX3ZlYyBiZmRfcG93ZXJwY2xlX3BlX3ZlYyBiZmRfcG93ZXJwY19wZV92ZWMiCi0gICAgOzsKLQotICByczYwMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPXJzNjAwMGNvZmZfdmVjCi0gICAgOzsKLQotICBzaC0qLWVsZiogfCBzaC0qLXJ0ZW1zZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc2hfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc2hsX3ZlYyBzaGNvZmZfdmVjIHNobGNvZmZfdmVjIHNoY29mZl9zbWFsbF92ZWMgc2hsY29mZl9zbWFsbF92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNoLSotcGUpCi0gICAgdGFyZ19kZWZ2ZWM9c2hscGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzaGxwZV92ZWMgc2hscGVpX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc2gtKi0qIHwgc2gtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c2hjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHNwYXJjbGV0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2xlX2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjODZ4LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyY2xpdGUtKi1lbGYqIHwgc3BhcmM4NngtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzcGFyY2xpbnV4X3ZlYyBiZmRfZWxmNjRfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSAgc3BhcmMtKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBzcGFyYy0qLW5ldGJzZGVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY25ldGJzZF92ZWMKLSAgICA7OwotICBzcGFyYy0qLW5ldGJzZGFvdXQqIHwgc3BhcmMtKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNuZXRic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotZWxmKiB8IHNwYXJjLSotc29sYXJpczIuWzAtNl0gfCBzcGFyYy0qLXNvbGFyaXMyLlswLTZdLiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCi0gICAgOzsKLSNpZmRlZiBCRkQ2NAotICBzcGFyYy0qLXNvbGFyaXMyKiB8IHNwYXJjdjktKi1zb2xhcmlzMiogfCBzcGFyYzY0LSotc29sYXJpczIqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGY2NF9zcGFyY192ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotI2VuZGlmCi0gIHNwYXJjLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0jaWZkZWYgQkZENjQKLSAgc3BhcmM2NC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmM2NC0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjNjQtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7ICAgIAotI2VuZGlmIC8qIEJGRDY0ICovCi0gIHNwYXJjKi0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjY29mZl92ZWMKLSAgICA7OwotICBzcGFyYyotKi0qIHwgc3BhcmMqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYwotICB0YWhvZS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aG9zdF9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotI2VuZGlmCi0KLSAgdGljODAqLSotKikKLSAgICB0YXJnX2RlZnZlYz10aWM4MGNvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLQotICB2ODUwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotICB2ODUwZS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSAgdjg1MGVhLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYwotICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLSAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0jZW5kaWYKLQotICB2YXgqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX3ZheF92ZWMKLSAgICA7OwotCi0gIHdlMzJrLSotKikKLSAgICB0YXJnX2RlZnZlYz13ZTMya2NvZmZfdmVjCi0gICAgOzsKLQotICB3NjUtKi0qKQotICAgIHRhcmdfZGVmdmVjPXc2NV92ZWMKLSAgICA7OwotCi0gIHo4ayotKi0qKQotICAgIHRhcmdfZGVmdmVjPXo4a2NvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi0qLWllZWUqKQotICAgIHRhcmdfZGVmdmVjPWllZWVfdmVjCi0gICAgOzsKLQotICAqLWFkb2JlLSopCi0gICAgdGFyZ19kZWZ2ZWM9YV9vdXRfYWRvYmVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi1zb255LSopCi0gICAgdGFyZ19kZWZ2ZWM9bmV3c29zM192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLXRhbmRlbS0qKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pZWVlX3ZlYwotICAgIDs7Ci0jIEVORCBPRiB0YXJnbWF0Y2guaAotICAqKQotICAgIGVjaG8gMT4mMiAiKioqIEJGRCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9LiIKLSAgICBlY2hvIDE+JjIgIioqKiBMb29rIGluIGJmZC9jb25maWcuYmZkIGZvciBzdXBwb3J0ZWQgdGFyZ2V0cy4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotIyBJZiB3ZSBzdXBwb3J0IGFueSBFTEYgdGFyZ2V0LCB0aGVuIGF1dG9tYXRpY2FsbHkgYWRkIHN1cHBvcnQgZm9yIHRoZQotIyBnZW5lcmljIEVMRiB0YXJnZXRzLiAgVGhpcyBwZXJtaXRzIGFuIG9iamR1bXAgd2l0aCBzb21lIEVMRiBzdXBwb3J0Ci0jIHRvIGJlIHVzZWQgb24gYW4gYXJiaXRyYXJ5IEVMRiBmaWxlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuCi0jIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi1jYXNlICIke3RhcmdfZGVmdmVjfSAke3Rhcmdfc2VsdmVjc30iIGluCi0gICpiZmRfZWxmNjQqKQotICAgIHRhcmdfc2VsdmVjcz0iJHt0YXJnX3NlbHZlY3N9IGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYyBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCi0gICAgOzsKLSAgKmJmZF9lbGYzMiopCi0gICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjIgotICAgIDs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmluIGIvYmZkL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4MzY1Ni4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAgKi8KLSN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNudGwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRkNOVEwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmZG9wZW4gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRkRPUEVOCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGdpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRHSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHVpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRVSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01BRFZJU0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NUFJPVEVDVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGl0aW1lciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRJVElNRVIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNjb25mIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NZU0NPTkYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1REREVGX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRklMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wcm9jZnMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BST0NGU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAqLwotI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4KLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgbWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIERlZmluZSBpZiByZWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQwotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9QUlNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJzdGF0dXNfdC5wcl93aG8uICovCi0jdW5kZWYgSEFWRV9QUlNUQVRVU19UX1BSX1dITwotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX1BTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBycHNpbmZvX3QuICovCi0jdW5kZWYgSEFWRV9QUlBTSU5GT19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHNpbmZvX3QuICovCi0jdW5kZWYgSEFWRV9QU0lORk9fVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC5wcl9jb250ZXh0LiAqLwotI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LnByX3JlZy4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UX1BSX1JFRwotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHdpbjMyX3BzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX1dJTjMyX1BTVEFUVVNfVAotCi0vKiBOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy4gKi8KLSN1bmRlZiBUUkFEX0hFQURFUgotCi0vKiBVc2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT8gKi8KLSN1bmRlZiBVU0VfTU1BUAotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlIGIvYmZkL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjU2N2FlNS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNjEwMiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcykiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtbW1hcCAgICAgICAgICAgICB0cnkgdXNpbmcgbW1hcCBmb3IgQkZEIGlucHV0IGZpbGVzIGlmIGF2YWlsYWJsZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIGlmIGdjYyBpcyB1c2VkIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1saWJiZmQuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjMyOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NTA6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDc5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjgwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MzA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MzU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4OTU6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODE6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzODogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9YmZkCi0KLVZFUlNJT049Mi45LjUKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg0OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEzNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKLWZpCi1maQotQVI9IiRhY19jdl9wcm9nX0FSIgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD1ubwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5MjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzk1OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDMwOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQ2OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm0gfHwgdGVzdCAtZiAkYWNfZGlyL25tJGFjX2V4ZWV4dCA7IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODI6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWNhc2UgIiR0YXJnZXQiIGluCi1OT05FKSBsdF90YXJnZXQ9IiRob3N0IiA7OwotKikgbHRfdGFyZ2V0PSIkdGFyZ2V0IiA7OwotZXNhYwotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgOgotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiA9IHhubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLXRlc3QgeCIkc2lsZW50IiA9IHh5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkbHRfdGFyZ2V0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTMxICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotCi1lc2FjCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIExERkxBR1M9IiRMREZMQUdTIiBMSUJTPSIkTElCUyIgXAotTE5fUz0iJExOX1MiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIE9CSkRVTVA9IiRPQkpEVU1QIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGx0X3RhcmdldCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnQ2ND1mYWxzZQotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tbWFwIG9yIC0td2l0aG91dC1tbWFwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tbWFwK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX21tYXAiCi0gIGNhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBCRkQgd2l0aC1tbWFwIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnRfbW1hcD1mYWxzZQotZmkKLQotYnVpbGRfd2FybmluZ3M9Ii1XIC1XYWxsIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7Ci0gICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotICAgICAgICBidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OwotICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKLSAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKLSAgKikgICAgYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKLWZpCi1maQotV0FSTl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcyA7IHRoZW4KLSAgICBXQVJOX0NGTEFHUz0iJHtidWlsZF93YXJuaW5nc30iCi1maQotCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzYwOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4MzogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNjogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgyODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODQ3OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjAxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNDY6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA4OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxNDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxNjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODg6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxOTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjkyOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyOTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzgxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwNzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQwOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NzU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTA4OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzM6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NTg6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc0OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODAyOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5ODg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDE4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNzU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTM3OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE3MDogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTkwOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDk6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMzY6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjY0OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyOTk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzczOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDY0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTM2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2OTY6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MjQ6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzczNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgxMjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotCi0KLQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5NTogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkyMzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM5MzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk2MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM5NzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAwMDogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl90aW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAxNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMzk6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNzc6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMTg6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTM3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZmNudGwgZ2V0cGFnZXNpemUgc2V0aXRpbWVyIHN5c2NvbmYgZmRvcGVuIGdldHVpZCBnZXRnaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNjI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMjU6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjcyOiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mjk4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzMTk6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzY2OiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzkyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDEzOiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDM5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotICBpMzcwLSotKikJCQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM3MGxpbnV4LmgiJwotCTs7Ci0KLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotICBpWzM0NTZdODYtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLSAgcnM2MDAwLSotYWl4NC5bMy05XSogfCBwb3dlcnBjLSotYWl4NC5bMy05XSopCi0gICAgICAgIENPUkVGSUxFPXJzNjAwMC1jb3JlLmxvCi0JQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFX0RVTVBYX0NPUkUiCi0JOzsKLSAgcnM2MDAwLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLSopCQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotKmJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1iZW9zKikJOzsKLSAgcG93ZXJwYy0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICB0YWhvZS0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy90YWhvZS5oIicKLQk7OwotICB2YXgtKi11bHRyaXgyKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheGJzZC5oIicKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAiJENPUkVGSUxFIiBpbgotICBhaXgzODYtY29yZS5sbykJQ09SRUZMQUc9LURBSVgzODZfQ09SRSA7OwotICBocHBhYnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ESFBQQUJTRF9DT1JFIDs7Ci0gIGhwdXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESFBVWF9DT1JFIDs7Ci0gIGlyaXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESVJJWF9DT1JFIDs7Ci0gIGx5bngtY29yZS5sbykJCUNPUkVGTEFHPS1ETFlOWF9DT1JFIDs7Ci0gIG5ldGJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tRE5FVEJTRF9DT1JFIDs7Ci0gIG9zZi1jb3JlLmxvKQkJQ09SRUZMQUc9LURPU0ZfQ09SRSA7OwotICBwdHJhY2UtY29yZS5sbykJQ09SRUZMQUc9LURQVFJBQ0VfQ09SRSA7OwotICByczYwMDAtY29yZS5sbykJQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFIiA7OwotICBzY281LWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EU0NPNV9DT1JFIiA7OwotICB0cmFkLWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EVFJBRF9DT1JFIiA7OwotICBlc2FjCi0KLSAgIyBFTEYgY29yZWZpbGUgc3VwcG9ydCBoYXMgc2V2ZXJhbCBmbGF2b3JzLCBidXQgYWxsIG9mCi0gICMgdGhlbSB1c2Ugc29tZXRoaW5nIGNhbGxlZCA8c3lzL3Byb2Nmcy5oPgotICBmb3IgYWNfaGRyIGluIHN5cy9wcm9jZnMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NDk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjU5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2ODc6IGNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcyMTogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfd2hvCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDczMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8gPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8iIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzU1OiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc2NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3ODk6IGNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODAxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJQU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDgyMzogY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4NTc6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4OTE6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfY29udGV4dAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MjU6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3JlZwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5Mzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWciIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3aW4zMl9wc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTU5OiBjaGVja2luZyBmb3Igd2luMzJfcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV93aW4zMl9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXdpbjMyX3BzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk3MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV93aW4zMl9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV93aW4zMl9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV93aW4zMl9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1dJTjMyX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfd2luMzJfcHN0YXR1c190IiAxPiY2Ci0KLSAgZmkKLWZpCi0KLQotaWYgdGVzdCAtbiAiJFRSQURfSEVBREVSIjsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi1maQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotCi0KLQotIyB0YXJnZXQgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLWRlZnZlYz0KLXNlbHZlY3M9Ci1zZWxhcmNocz0KLVRERUZJTkVTPQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyL2NvbmZpZy5iZmQKLQlpZiB0ZXN0ICJ4JHRhcmciID0gIngkdGFyZ2V0IjsgdGhlbgotCSAgICBkZWZ2ZWM9JHRhcmdfZGVmdmVjCi0JZmkKLQlzZWx2ZWNzPSIkc2VsdmVjcyAkdGFyZ19kZWZ2ZWMgJHRhcmdfc2VsdmVjcyIKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotCVRERUZJTkVTPSIkVERFRklORVMgJHRhcmdfY2ZsYWdzIgotICAgIGZpCi1kb25lCi0KLQotIyBUaGlzIHByb2Nlc3Npbmcgc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBpZiB3ZSdyZSB0byBkZWNpZGUgcHJvcGVybHkgd2hldGhlcgotIyA2NC1iaXQgc3VwcG9ydCBuZWVkcyB0byBiZSBjb21waWxlZCBpbi4gIEN1cnJlbnRseSwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpZgotIyB0aGUgZGVmYXVsdCBvciBhbnkgb3RoZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgdGFyZ2V0IHJlcXVpcmVzIGl0OyBpdAotIyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBvbiBhIDMyLWJpdCBob3N0IGlmIG5vIDY0LWJpdCB0YXJnZXQgaXMgcmVxdWVzdGVkLCBhbmQKLSMgbm8gIi0td2l0aC02NC1iaXQtYmZkIiBvcHRpb24gaXMgZ2l2ZW4sIGV2ZW4gaWYgIi0tZW5hYmxlLXRhcmdldHM9YWxsIiBpcwotIyB1c2VkLgotCi0jIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsdmVjcyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWx2ZWNzPSIkZiIKLQotCi0jIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsYXJjaHMgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsYXJjaHM9IiRmIgotCi0jIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgotdGI9Ci0KLWVsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKLQotZm9yIHZlYyBpbiAkc2VsdmVjcwotZG8KLSAgICBjYXNlICIkdmVjIiBpbgotICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCi0gICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtbmV0YnNkX3ZlYykJCXRiPSIkdGIgYXJtbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1wZV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhb3V0MF9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0MC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fYmlnX3ZlYykJCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2xpdHRsZV92ZWMpCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19iaWdfdmVjKQkJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfbGl0dGxlX3ZlYykJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcG9sbG9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hcG9sbG8ubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2JpZ19ob3N0KQkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiX291dF92ZWNfbGl0dGxlX2hvc3QpCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYmZkX2VmaV9hcHBfaWEzMl92ZWMpCXRiPSIkdGIgZWZpLWFwcC1pYTMyLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWZpX2FwcF9pYTY0X3ZlYykJdGI9IiR0YiBlZmktYXBwLWlhNjQubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIgotICAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9hbHBoYV92ZWMpCXRiPSIkdGIgZWxmNjQtYWxwaGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2hwcGFfdmVjKQkJdGI9IiR0YiBlbGY2NC1ocHBhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9pYTY0X2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmNjQtaWE2NC5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfaWE2NF9iaWdfdmVjKQl0Yj0iJHRiIGVsZjY0LWlhNjQubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2F2cl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWF2ci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzNzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzcwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3BqX3ZlYykgICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wamxfdmVjKSAgICAgICAgICB0Yj0iJHRiIGVsZjMyLXBqLmxvIGVsZjMyLmxvICRlbGYiOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY192ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3NoX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zaGxfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl92ODUwX3ZlYykJCXRiPSIkdGIgZWxmMzItdjg1MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGNpc2NvX2NvcmVfYmlnX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBjaXNjb19jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKLSAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OwotICAgIG1pcHNscGVfdmVjKQkJdGI9IiR0YiBwZS1taXBzLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtaXBzbHBlaV92ZWMpCQl0Yj0iJHRiIHBlaS1taXBzLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGVpLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIHJzNjAwMGNvZmY2NF92ZWMpCQl0Yj0iJHRiIGNvZmY2NC1yczYwMDAubG8geGNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7Ci0gICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMpICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHBwY2Jvb3RfdmVjKQkJdGI9IiR0YiBwcGNib290LmxvIiA7OwotICAgIHNoY29mZl92ZWMpCQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNoY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hscGVfdmVjKQkJCXRiPSIkdGIgcGUtc2gubG8gY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxwZWlfdmVjKQkJCXRiPSIkdGIgcGVpLXNoLmxvIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc29tX3ZlYykJCQl0Yj0iJHRiIHNvbS5sbyIgOzsKLSAgICBzcGFyY2xlX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXNwYXJjbGUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbGludXhfdmVjKQkJdGI9IiR0YiBzcGFyY2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIHNwYXJjbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2Ytc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBzcGFyY25ldGJzZF92ZWMpCQl0Yj0iJHRiIHNwYXJjbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNwYXJjLmxvIiA7OwotICAgIHNyZWNfdmVjKQkJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICBzdW5vc19iaWdfdmVjKQkJdGI9IiR0YiBzdW5vcy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3ltYm9sc3JlY192ZWMpCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgdGVraGV4X3ZlYykJCQl0Yj0iJHRiIHRla2hleC5sbyIgOzsKLSAgICB0aWMzMF9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC10aWMzMC5sbyIgOzsKLSAgICB0aWMzMF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWMzMC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjBfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjBfYmVoX3ZlYykJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjFfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjFfYmVoX3ZlYykJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjJfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM1NHhfY29mZjJfYmVoX3ZlYykJdGI9IiR0YiBjb2ZmLXRpYzU0eC5sbyIgOzsKLSAgICB0aWM4MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzgwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHZlcnNhZG9zX3ZlYykJCXRiPSIkdGIgdmVyc2Fkb3MubG8iIDs7Ci0gICAgdm1zX2FscGhhX3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIgotIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgdm1zX3ZheF92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIgOzsKLSAgICB3NjVfdmVjKQkJCXRiPSIkdGIgY29mZi13NjUubG8gcmVsb2MxNi5sbyIgOzsKLSAgICB3ZTMya2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXdlMzJrLmxvIiA7OwotICAgIHo4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXo4ay5sbyByZWxvYzE2LmxvIiA7OwotCi0gICAgIiIpCQkJOzsKLSAgICAqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICoqKiB1bmtub3duIHRhcmdldCB2ZWN0b3IgJHZlYyIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCi0jIEEgY291cGxlIG9mIENQVXMgdXNlIHNob3J0ZXIgZmlsZSBuYW1lcyB0byBhdm9pZCBwcm9ibGVtcyBvbiBET1MKLSMgZmlsZXN5c3RlbXMuCi10YT1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgcy9iZmRfL2NwdS0vZyAtZSBzL19hcmNoLy5sby9nIC1lIHMvbW4xMDIwMC9tMTAyMDAvIC1lIHMvbW4xMDMwMC9tMTAzMDAvYAotCi0jIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLWY9IiIKLWZvciBpIGluICR0YiA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi10Yj0iJGYiCi0KLWY9IiIKLWZvciBpIGluICR0YSA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi10YT0iJGYiCi0KLWJmZF9iYWNrZW5kcz0iJHRiIgotYmZkX21hY2hpbmVzPSIkdGEiCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWUgOyB0aGVuCi0gIGJmZF9iYWNrZW5kcz0iJHtiZmRfYmFja2VuZHN9IicgJChBTExfQkFDS0VORFMpJwotICBiZmRfbWFjaGluZXM9IiR7YmZkX21hY2hpbmVzfSInICQoQUxMX01BQ0hJTkVTKScKLSAgc2VsdmVjcz0KLSAgaGF2ZXZlY3M9Ci0gIHNlbGFyY2hzPQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgIyBPbmx5IHNldCB0aGVzZSBpZiB0aGV5IHdpbGwgYmUgbm9uZW1wdHksIGZvciB0aGUgY2xldmVyIGVjaG8uCi0gIGhhdmV2ZWNzPQotICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKLSAgICBoYXZldmVjcz1gZWNobyAkc2VsdmVjcyB8IHNlZCAtZSAncy9eLy1ESEFWRV8vJyAtZSAncy8gXCguXCkvIC1ESEFWRV9cMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgc2VsdmVjcz1gZWNobyAkc2VsdmVjcyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotICB0ZXN0IC1uICIkc2VsYXJjaHMiICYmCi0gICAgc2VsYXJjaHM9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCi1maQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLQotY2FzZSAke2hvc3Q2NH0tJHt0YXJnZXQ2NH0tJHt3YW50NjR9IGluCi0gICp0cnVlKikKLSAgICB3b3Jkc2l6ZT02NAotICAgIGFsbF9iYWNrZW5kcz0nJChCRkQ2NF9CQUNLRU5EUykgJChCRkQzMl9CQUNLRU5EUyknCi0gICAgaWYgdGVzdCAteiAiJEdDQyIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0QklUX0xPTkciID0gIjAiICYmIHRlc3QgIiRCRkRfSE9TVF82NF9CSVRfREVGSU5FRCIgPSAiMCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogWW91IGhhdmUgcmVxdWVzdGVkIGEgNjQgYml0IEJGRCBjb25maWd1cmF0aW9uLCBidXQiIDE+JjIKLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogeW91ciBjb21waWxlciBtYXkgbm90IGhhdmUgYSA2NCBiaXQgaW50ZWdyYWwgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgOzsKLSAgZmFsc2UtZmFsc2UtZmFsc2UpCi0gICAgd29yZHNpemU9MzIKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZEMzJfQkFDS0VORFMpJwotICAgIDs7Ci1lc2FjCi0KLQotCi0KLQotCi10ZGVmYXVsdHM9IiIKLXRlc3QgLW4gIiR7ZGVmdmVjfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURERUZBVUxUX1ZFQ1RPUj0ke2RlZnZlY30iCi10ZXN0IC1uICIke3NlbHZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9WRUNTPScke3NlbHZlY3N9JyIKLXRlc3QgLW4gIiR7c2VsYXJjaHN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPScke3NlbGFyY2hzfSciCi10ZXN0IC1uICIke2hhdmV2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gJHtoYXZldmVjc30iCi0KLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzNTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MzU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzYwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzODk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzOTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ0MjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTQ1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIG1hZHZpc2UgbXByb3RlY3QKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2MjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotY2FzZSAke3dhbnRfbW1hcH0rJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkfSBpbgotICB0cnVlK3llcyApICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX01NQVAgMQotRU9GCi0gOzsKLWVzYWMKLQotcm0gLWYgZG9jL2NvbmZpZy5zdGF0dXMKLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBkb2MvTWFrZWZpbGUgYmZkLWluMy5oOmJmZC1pbjIuaCBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKLXMlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZwotcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKLXMlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQENPUkVGSUxFQCUkQ09SRUZJTEUlZwotcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKLXMlQHdvcmRzaXplQCUkd29yZHNpemUlZwotcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKLXMlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCi1zJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZwotcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5jb20gYi9iZmQvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5OTc3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotJCEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kaWYgYXJjaCAuZXFzLiAiQWxwaGEiCi0kdGhlbgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgQWxwaGEgdGFyZ2V0IgotJCB0YXJnZXQgPSAiYWxwaGEiCi0kIQotJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKLSRERUNLCi0hCi0hICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKLSEKLSEKLSAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FNX0lOSVRfQVVUT01BS0UoYmZkLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLQotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAVkVSU0lPTkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzAnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwotICAgICAgU1BMSVRfTElORTsKLSAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQKLSRlbHNlCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgotJCB0YXJnZXQgPSAidmF4IgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCczMicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kZW5kaWYKLSQKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBiZmQuaCcgZnJvbSBgYmZkLWluMi5oJy4iCi0kIQotJCEKLSQhIGNyZWF0ZSB0YXJnbWF0Y2guaAotJCEKLSQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCi0kIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgotJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKLSQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgotJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCi0kIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCi0kIHdyaXRlIHRmaWxlICIjZW5kaWYiCi0kIHdyaXRlIHRmaWxlICJ9LCIKLSQgY2xvc2UgdGZpbGUKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGB0YXJnbWF0Y2guaCciCi0kIQotJCEKLSQhIGNyZWF0ZSBjb25maWcuaAotJCEKLSQgY3JlYXRlIFtdY29uZmlnLmgKLS8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi0vKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwotLyogI3VuZGVmIFRSQURfSEVBREVSICovCi0vKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLS8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwotLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwotLyogI3VuZGVmIFVTRV9NTUFQICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01BRFZJU0UgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1RJTUVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmhvc3QgYi9iZmQvY29uZmlndXJlLmhvc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTM5MWMuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgdG9vbHMgYW5kCi0jIGZsYWdzIHVzZWQgb24gYSBob3N0IHNwZWNpZmljIGJhc2lzLgotCi0jIFNpbmNlIHRoZSAiYmZkL2hvc3RzIiBkaXJlY3RvcnkgaXMgc2hhcmVkIGJ5IHRoZSBiZmQsIG9wY29kZXMsIGFuZAotIyBiaW51dGlscyBkaXJlY3RvcmllcyAoYXQgbGVhc3QpLCB0aGUgaW5kZXggdG8gaXQgaXMgYWxzbyBzaGFyZWQuCi0jIFRoaXMgaXMgdGhhdCBpbmRleC4gIEVhY2ggY29uZmlndXJlLmluIGZpbGUgc2hvdWxkIHNvdXJjZSB0aGlzIGZpbGUKLSMgaW4gaXRzIHBlci1ob3N0IHBhcnQuCi0KLSMgVGhpcyBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgb3B0aW9ucwotIyAgaG9zdDY0CQlzZXQgdG8gdHJ1ZSBpZiA2NCBiaXQgdHlwZXMgYXJlIGFzIGZhc3QgYXMgMzIgYml0Ci0jICBIT1NUXzY0QklUX1RZUEUJaG9zdCA2NCBiaXQgdHlwZQotIyAgSE9TVF9VXzY0QklUX1RZUEUJdW5zaWduZWQgNjQgYml0IHR5cGUgKG5vdCBuZWVkZWQgaWYgNjRCSVRfVFlQRSBpcyBsb25nKQotCi1IREVGSU5FUz0KLWhvc3Q2ND1mYWxzZQotSE9TVF82NEJJVF9UWVBFPQotSE9TVF9VXzY0QklUX1RZUEU9Ci0KLWNhc2UgIiR7aG9zdH0iIGluCi0KLWFscGhhKi0qLSopCQlob3N0NjQ9dHJ1ZTsgSE9TVF82NEJJVF9UWVBFPWxvbmcgOzsKLQotaHBwYSotKi1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1oaXV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1tcGVpeCopCQlIREVGSU5FUz0tREhPU1RfSFBQQU1QRUlYIDs7Ci1ocHBhKi0qLWJzZCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUJTRCA7OwotaHBwYSotKi1vc2YqKQkJSERFRklORVM9LURIT1NUX0hQUEFPU0YgOzsKLQotaWE2NC0qLWxpbnV4KikJCWhvc3Q2ND10cnVlOyBIT1NUXzY0QklUX1RZUEU9bG9uZyA7OwotCi1pWzM0NTZdODYtc2VxdWVudC1ic2QqKQlIREVGSU5FUz0tRHNoYXJlZD1nZW5zaGFyZWQgOzsKLWlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLWlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQlIREVGSU5FUz0tRHNoYXJlZD1nZW5zaGFyZWQgOzsKLQotbWlwcyotZGVjLW5ldGJzZCopCTs7Ci1taXBzKi0qLW9wZW5ic2QqKQk7OwotbWlwcyotZGVjLSopCQlIREVGSU5FUz0iLUcgNCIJOzsKLW1pcHMqLXNnaS1pcml4MyopCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotc2dpLWlyaXg0KikJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi1zZ2ktaXJpeDYqKQlob3N0NjQ9dHJ1ZQotCQkJSE9TVF82NEJJVF9UWVBFPSJsb25nIGxvbmciOwotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0JCQk7OwotbWlwcyotKi1zeXN2NCopCQk7OwotbWlwcyotKi1zeXN2KikJCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotKi1yaXNjb3MqKQlIREVGSU5FUz0iLUcgNCIgOzsKLQotbTY4Ki1ocC1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUDMwMEhQVVggOzsKLQotKi0qLXNvbGFyaXMqKQkJSE9TVF82NEJJVF9UWVBFPSJsb25nIGxvbmciCi0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgbG9uZyBsb25nIgotCQkJOzsKLQotKi0qLXdpbmRvd3MqKQotCQkJSE9TVF82NEJJVF9UWVBFPV9faW50NjQKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBfX2ludDY0IgotIyBUaGUgZm9sbG93aW5nIGtyb2NrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbid0IHJ1biB0aGUgYnVpbGQgY29tcGlsZXIKLSMgKE1TVkMpIG9uIHRoZSBjb25maWd1cmUgaG9zdCwgc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IHNldCB0aGUgdmFsdWVzIGhlcmUuCi0jIE5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgbmV2ZXIgcnVuIHRocm91Z2ggYXV0b2NvbmYsIHNvIHdlIGNhbid0IHVzZSBhbnkKLSMgYXV0b2NvbmYgbWFjcm9zIGhlcmUuICBCZWNhdXNlIG9mIHRoaXMsIHdlIGhhdmUgdG8gbXVjayB3aXRoIGF1dG9jb25mCi0jIHZhcmlhYmxlcyBleHBsaWNpdGx5LgotCQkJYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotCQkJYWNfY3ZfaGVhZGVyX3RpbWU9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0cGFnZXNpemU9bm8KLQkJCWFjX2N2X2Z1bmNfbWFkdmlzZT1ubwotCQkJYWNfY3ZfZnVuY19tcHJvdGVjdD1ubwotCQkJYWNfY3ZfZnVuY19nZXR1aWQ9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0Z2lkPW5vCi0JCQlhY19jdl9oZWFkZXJfc3lzX2ZpbGVfaD1ubwotCQkJYWNfY3ZfaGVhZGVyX3N5c190aW1lX2g9bm8KLQkJCWFjX2N2X2hlYWRlcl91bmlzdGRfaD1ubwotCQkJOzsKLWVzYWMKZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUuaW4gYi9iZmQvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2M4NGRlLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLQotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKGxpYmJmZC5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi1BQ19JU0NfUE9TSVgKLQotQU1fSU5JVF9BVVRPTUFLRShiZmQsIDIuOS41KQotCi1kbmwgVGhlc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTCwgYmVjYXVzZSBpdCBtYXkgd2FudAotZG5sIHRvIGNhbGwgQUNfQ0hFQ0tfUFJPRy4KLUFDX0NIRUNLX1RPT0woQVIsIGFyKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLQotZG5sIERlZmF1bHQgdG8gYSBub24gc2hhcmVkIGxpYnJhcnkuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZQotZG5sIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2hhcmVkLgotQU1fRElTQUJMRV9TSEFSRUQKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUoNjQtYml0LWJmZCwKLVsgIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIDY0LWJpdC1iZmQgb3B0aW9uKSA7OwotZXNhY10sW3dhbnQ2ND1mYWxzZV0pZG5sCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKGNvbW1vbmJmZGxpYiwKLVsgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKFtiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbl0pIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19XSVRIKG1tYXAsCi1bICAtLXdpdGgtbW1hcCAgICAgICAgICAgICB0cnkgdXNpbmcgbW1hcCBmb3IgQkZEIGlucHV0IGZpbGVzIGlmIGF2YWlsYWJsZV0sCi1bY2FzZSAiJHt3aXRodmFsfSIgaW4KLSAgeWVzKSAgd2FudF9tbWFwPXRydWUgOzsKLSAgbm8pICAgd2FudF9tbWFwPWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgQkZEIHdpdGgtbW1hcCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudF9tbWFwPWZhbHNlXSlkbmwKLQotYnVpbGRfd2FybmluZ3M9Ii1XIC1XYWxsIgotQUNfQVJHX0VOQUJMRShidWlsZC13YXJuaW5ncywKLVsgIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIGlmIGdjYyBpcyB1c2VkXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJOzsKLSAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OwotICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKLSAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKLSAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0gICAgICAgIGJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7Ci0gICopICAgIGJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCi1maV0pZG5sCi1XQVJOX0NGTEFHUz0iIgotaWYgdGVzdCAieCR7YnVpbGRfd2FybmluZ3N9IiAhPSB4IC1hICJ4JEdDQyIgPSB4eWVzIDsgdGhlbgotICAgIFdBUk5fQ0ZMQUdTPSIke2J1aWxkX3dhcm5pbmdzfSIKLWZpCi1BQ19TVUJTVChXQVJOX0NGTEFHUykKLQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotQUNfQVJHX1BST0dSQU0KLQotQU1fTUFJTlRBSU5FUl9NT0RFCi1BQ19FWEVFWFQKLQotaG9zdDY0PWZhbHNlCi10YXJnZXQ2ND1mYWxzZQotCi0jIGhvc3Qgc3R1ZmY6Ci0KLUFDX1BST0dfQ0MKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0jIFBlcm1pdCBob3N0IHNwZWNpZmljIHNldHRpbmdzLgotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19QUk9HX0lOU1RBTEwKLQotQkZEX0hPU1RfNjRCSVRfTE9ORz0wCi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRD0wCi1CRkRfSE9TVF82NF9CSVQ9Ci1CRkRfSE9TVF9VXzY0X0JJVD0KLWlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iID0gInhsb25nIjsgdGhlbgotICBCRkRfSE9TVF82NEJJVF9MT05HPTEKLWVsaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgIT0gIngiOyB0aGVuCi0gIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTEKLSAgQkZEX0hPU1RfNjRfQklUPSR7SE9TVF82NEJJVF9UWVBFfQotICBCRkRfSE9TVF9VXzY0X0JJVD0ke0hPU1RfVV82NEJJVF9UWVBFfQotZmkKLUFDX1NVQlNUKEJGRF9IT1NUXzY0QklUX0xPTkcpCi1BQ19TVUJTVChCRkRfSE9TVF82NF9CSVRfREVGSU5FRCkKLUFDX1NVQlNUKEJGRF9IT1NUXzY0X0JJVCkKLUFDX1NVQlNUKEJGRF9IT1NUX1VfNjRfQklUKQotCi1CRkRfQ0NfRk9SX0JVSUxECi0KLUFDX0NIRUNLX0hFQURFUlMoc3RkZGVmLmggc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCB1bmlzdGQuaCkKLUFDX0NIRUNLX0hFQURFUlMoZmNudGwuaCBzeXMvZmlsZS5oIHN5cy90aW1lLmgpCi1BQ19IRUFERVJfVElNRQotQUNfSEVBREVSX0RJUkVOVAotQUNfQ0hFQ0tfRlVOQ1MoZmNudGwgZ2V0cGFnZXNpemUgc2V0aXRpbWVyIHN5c2NvbmYgZmRvcGVuIGdldHVpZCBnZXRnaWQpCi0KLUJGRF9CSU5BUllfRk9QRU4KLQotQkZEX05FRURfREVDTEFSQVRJT04oc3Ryc3RyKQotQkZEX05FRURfREVDTEFSQVRJT04obWFsbG9jKQotQkZEX05FRURfREVDTEFSQVRJT04ocmVhbGxvYykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGZyZWUpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpCi0KLSMgSWYgd2UgYXJlIGNvbmZpZ3VyZWQgbmF0aXZlLCBwaWNrIGEgY29yZSBmaWxlIHN1cHBvcnQgZmlsZS4KLUNPUkVGSUxFPQotQ09SRUZMQUc9Ci1UUkFEX0hFQURFUj0KLWlmIHRlc3QgIiR7dGFyZ2V0fSIgPSAiJHtob3N0fSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgYWxwaGEqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2FscGhhbGludXguaCInCi0JOzsKLSAgYWxwaGEqLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgYWxwaGEqLSotKikJCUNPUkVGSUxFPW9zZi1jb3JlLmxvIDs7Ci0gIGFybS0qLXJpc2NpeCkJCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBocHBhKi0qLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1oaXV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotbXBlaXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1ic2QqKQkJQ09SRUZJTEU9ImhwdXgtY29yZS5sbyBocHBhYnNkLWNvcmUubG8iCi0JCQlDT1JFRkxBRz0iLURIUFVYX0NPUkUgLURIUFBBQlNEX0NPUkUiIDs7Ci0gIGkzNzAtKi0qKQkJCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzcwbGludXguaCInCi0JOzsKLQotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWJzZCogfCBpWzM0NTZdODYtKi1mcmVlYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZic2QuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtZXNpeC1zeXN2MyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9lc2l4LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9c2NvNS1jb3JlLmxvCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbWFjaDMqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4Nm1hY2gzLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1saW51eC1nbnUqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmxpbnV4LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIHJzNjAwMC0qLWFpeDQuWzMtOV0qIHwgcG93ZXJwYy0qLWFpeDQuWzMtOV0qKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgICBDT1JFRklMRT1yczYwMDAtY29yZS5sbwotCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRV9EVU1QWF9DT1JFIgotCTs7Ci0gIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYmVvcyopCTs7Ci0gIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgdGFob2UtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4MiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRDT1JFRklMRSIgaW4KLSAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKLSAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OwotICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OwotICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OwotICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OwotICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OwotICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKLSAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKLSAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKLSAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKLSAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKLSAgZXNhYwotCi0gICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgotICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcHJvY2ZzLmgpCi0gIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIocHJzdGF0dXNfdCwgcHJfd2hvKQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBycHNpbmZvX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShsd3BzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9jb250ZXh0KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIobHdwc3RhdHVzX3QsIHByX3JlZykKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUod2luMzJfcHN0YXR1c190KQotICBmaQotZmkKLUFDX1NVQlNUKENPUkVGSUxFKQotQUNfU1VCU1QoQ09SRUZMQUcpCi1pZiB0ZXN0IC1uICIkVFJBRF9IRUFERVIiOyB0aGVuCi0gIEFDX0RFRklORV9VTlFVT1RFRChUUkFEX0hFQURFUiwgJFRSQURfSEVBREVSLAotICAgIFtOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy5dKQotZmkKLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4gLWxrZXJuZWwzMiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLUFDX1NVQlNUKFRERUZJTkVTKQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiIGlzCi0jIHVzZWQuCi0KLSMgdW5pcSB0aGUgZGVmYXVsdCBhbmQgc2VsZWN0ZWQgdmVjdG9ycyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWx2ZWNzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbHZlY3M9IiRmIgotCi0KLSMgdW5pcSB0aGUgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWxhcmNocyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWxhcmNocz0iJGYiCi0KLSMgVGFyZ2V0IGJhY2tlbmQgLm8gZmlsZXMuCi10Yj0KLQotZWxmPSJlbGYubG8gZWxmbGluay5sbyBkd2FyZjIubG8gZHdhcmYxLmxvIgotCi1mb3IgdmVjIGluICRzZWx2ZWNzCi1kbwotICAgIGNhc2UgIiR2ZWMiIGluCi0gICAgIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0gICAgIyB3aXRoIHRoZSB0d28gdmVjdG9yIGxpc3RzIGluIHRhcmdldHMuYy4KLSAgICBhMjlrY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWEyOWsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYV9vdXRfYWRvYmVfdmVjKQkJdGI9IiR0YiBhb3V0LWFkb2JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1jb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1jb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1uZXRic2RfdmVjKQkJdGI9IiR0YiBhcm1uZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWZpX2FwcF9pYTMyX3ZlYykJdGI9IiR0YiBlZmktYXBwLWlhMzIubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lZmlfYXBwX2lhNjRfdmVjKQl0Yj0iJHRiIGVmaS1hcHAtaWE2NC5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iCi0gIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2FscGhhX3ZlYykJdGI9IiR0YiBlbGY2NC1hbHBoYS5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfaHBwYV92ZWMpCQl0Yj0iJHRiIGVsZjY0LWhwcGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2lhNjRfbGl0dGxlX3ZlYykJdGI9IiR0YiBlbGY2NC1pYTY0LmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9pYTY0X2JpZ192ZWMpCXRiPSIkdGIgZWxmNjQtaWE2NC5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfYXZyX3ZlYykJCXRiPSIkdGIgZWxmMzItYXZyLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKSB0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjKQl0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfZDEwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQxMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZDMwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQzMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZnIzMF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWZyMzAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaHBwYV92ZWMpCQl0Yj0iJHRiIGVsZjMyLWhwcGEubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTM3MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWkzNzAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWkzODYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTg2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk4NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTk2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk5NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX20zMnJfdmVjKQkJdGI9IiR0YiBlbGYzMi1tMzJyLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX202OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tNjhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX204OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tODhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMjAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMjAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAzMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAzMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcGpfdmVjKSAgICAgICAgICAgdGI9IiR0YiBlbGYzMi1wai5sbyBlbGYzMi5sbyAkZWxmIjs7Ci0gICAgYmZkX2VsZjMyX3BqbF92ZWMpICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfc2hfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NobF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLXNwYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Y4NTBfdmVjKQkJdGI9IiR0YiBlbGYzMi12ODUwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgY2lzY29fY29yZV9iaWdfdmVjKQkJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGNpc2NvX2NvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGRlbW9fNjRfdmVjKQkJdGI9IiR0YiBkZW1vNjQubG8gYW91dDY0LmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBlY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfYmlnbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLWFscGhhLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZ28zMmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgZ28zMnN0dWJiZWRjb2ZmX3ZlYykJdGI9IiR0YiBjb2ZmLXN0Z28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBoODMwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4MzAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaDg1MDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODUwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGhvc3RfYW91dF92ZWMpCQl0Yj0iJHRiIGhvc3QtYW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBic2RfdmVjKQkJdGI9IiR0YiBocDMwMGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBocHV4X3ZlYykJCXRiPSIkdGIgaHAzMDBocHV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YW91dF92ZWMpCQl0Yj0iJHRiIGkzODZhb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YnNkX3ZlYykJCXRiPSIkdGIgaTM4NmJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmR5bml4X3ZlYykJCXRiPSIkdGIgaTM4NmR5bml4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2ZnJlZWJzZF92ZWMpCQl0Yj0iJHRiIGkzODZmcmVlYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bXNkb3NfdmVjKQkJdGI9IiR0YiBpMzg2bXNkb3MubG8iIDs7Ci0gICAgaTM4NnBlX3ZlYykJCQl0Yj0iJHRiIHBlLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZwZWlfdmVjKQkJdGI9IiR0YiBwZWktaTM4Ni5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWlwc2xwZV92ZWMpCQl0Yj0iJHRiIHBlLW1pcHMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1pcHNscGVpX3ZlYykJCXRiPSIkdGIgcGVpLW1pcHMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG5ld3NvczNfdmVjKQkJdGI9IiR0YiBuZXdzb3MzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBubG0zMl9pMzg2X3ZlYykJCXRiPSIkdGIgbmxtMzItaTM4Ni5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcnM2MDAwY29mZjY0X3ZlYykJCXRiPSIkdGIgY29mZjY0LXJzNjAwMC5sbyB4Y29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKLSAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY2xlX3BlX3ZlYykgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNfcGVpX3ZlYykgICAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgcHBjYm9vdF92ZWMpCQl0Yj0iJHRiIHBwY2Jvb3QubG8iIDs7Ci0gICAgc2hjb2ZmX3ZlYykJCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxwZV92ZWMpCQkJdGI9IiR0YiBwZS1zaC5sbyBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobHBlaV92ZWMpCQkJdGI9IiR0YiBwZWktc2gubG8gY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzb21fdmVjKQkJCXRiPSIkdGIgc29tLmxvIiA7OwotICAgIHNwYXJjbGVfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtc3BhcmNsZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNsaW51eF92ZWMpCQl0Yj0iJHRiIHNwYXJjbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1zcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIHNwYXJjbmV0YnNkX3ZlYykJCXRiPSIkdGIgc3BhcmNuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3BhcmMubG8iIDs7Ci0gICAgc3JlY192ZWMpCQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHN1bm9zX2JpZ192ZWMpCQl0Yj0iJHRiIHN1bm9zLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzeW1ib2xzcmVjX3ZlYykJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICB0ZWtoZXhfdmVjKQkJCXRiPSIkdGIgdGVraGV4LmxvIiA7OwotICAgIHRpYzMwX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXRpYzMwLmxvIiA7OwotICAgIHRpYzMwX2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzMwLmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMF92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMF9iZWhfdmVjKQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMV92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMV9iZWhfdmVjKQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzU0eF9jb2ZmMl9iZWhfdmVjKQl0Yj0iJHRiIGNvZmYtdGljNTR4LmxvIiA7OwotICAgIHRpYzgwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljODAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgdmVyc2Fkb3NfdmVjKQkJdGI9IiR0YiB2ZXJzYWRvcy5sbyIgOzsKLSAgICB2bXNfYWxwaGFfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iCi0gCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICB2bXNfdmF4X3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIiA7OwotICAgIHc2NV92ZWMpCQkJdGI9IiR0YiBjb2ZmLXc2NS5sbyByZWxvYzE2LmxvIiA7OwotICAgIHdlMzJrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtd2UzMmsubG8iIDs7Ci0gICAgejhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtejhrLmxvIHJlbG9jMTYubG8iIDs7Ci0KLSAgICAiIikJCQk7OwotICAgICopIEFDX01TR19FUlJPUigqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMpIDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCi0jIEEgY291cGxlIG9mIENQVXMgdXNlIHNob3J0ZXIgZmlsZSBuYW1lcyB0byBhdm9pZCBwcm9ibGVtcyBvbiBET1MKLSMgZmlsZXN5c3RlbXMuCi10YT1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgcy9iZmRfL2NwdS0vZyAtZSBzL19hcmNoLy5sby9nIC1lIHMvbW4xMDIwMC9tMTAyMDAvIC1lIHMvbW4xMDMwMC9tMTAzMDAvYAotCi0jIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLWY9IiIKLWZvciBpIGluICR0YiA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi10Yj0iJGYiCi0KLWY9IiIKLWZvciBpIGluICR0YSA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi10YT0iJGYiCi0KLWJmZF9iYWNrZW5kcz0iJHRiIgotYmZkX21hY2hpbmVzPSIkdGEiCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWUgOyB0aGVuCi0gIGJmZF9iYWNrZW5kcz0iJHtiZmRfYmFja2VuZHN9IicgJChBTExfQkFDS0VORFMpJwotICBiZmRfbWFjaGluZXM9IiR7YmZkX21hY2hpbmVzfSInICQoQUxMX01BQ0hJTkVTKScKLSAgc2VsdmVjcz0KLSAgaGF2ZXZlY3M9Ci0gIHNlbGFyY2hzPQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgIyBPbmx5IHNldCB0aGVzZSBpZiB0aGV5IHdpbGwgYmUgbm9uZW1wdHksIGZvciB0aGUgY2xldmVyIGVjaG8uCi0gIGhhdmV2ZWNzPQotICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKLSAgICBoYXZldmVjcz1gZWNobyAkc2VsdmVjcyB8IHNlZCAtZSAncy9eLy1ESEFWRV8vJyAtZSAncy8gXCguXCkvIC1ESEFWRV9cMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgc2VsdmVjcz1gZWNobyAkc2VsdmVjcyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotICB0ZXN0IC1uICIkc2VsYXJjaHMiICYmCi0gICAgc2VsYXJjaHM9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCi1maQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLQotY2FzZSAke2hvc3Q2NH0tJHt0YXJnZXQ2NH0tJHt3YW50NjR9IGluCi0gICp0cnVlKikKLSAgICB3b3Jkc2l6ZT02NAotICAgIGFsbF9iYWNrZW5kcz0nJChCRkQ2NF9CQUNLRU5EUykgJChCRkQzMl9CQUNLRU5EUyknCi0gICAgaWYgdGVzdCAteiAiJEdDQyIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0QklUX0xPTkciID0gIjAiICYmIHRlc3QgIiRCRkRfSE9TVF82NF9CSVRfREVGSU5FRCIgPSAiMCI7IHRoZW4KLSAgICAgIEFDX01TR19XQVJOKFtZb3UgaGF2ZSByZXF1ZXN0ZWQgYSA2NCBiaXQgQkZEIGNvbmZpZ3VyYXRpb24sIGJ1dF0pCi0gICAgICBBQ19NU0dfV0FSTihbeW91ciBjb21waWxlciBtYXkgbm90IGhhdmUgYSA2NCBiaXQgaW50ZWdyYWwgdHlwZV0pCi0gICAgZmkKLSAgICA7OwotICBmYWxzZS1mYWxzZS1mYWxzZSkKLSAgICB3b3Jkc2l6ZT0zMgotICAgIGFsbF9iYWNrZW5kcz0nJChCRkQzMl9CQUNLRU5EUyknCi0gICAgOzsKLWVzYWMKLQotQUNfU1VCU1Qod29yZHNpemUpCi1BQ19TVUJTVChhbGxfYmFja2VuZHMpCi1BQ19TVUJTVChiZmRfYmFja2VuZHMpCi1BQ19TVUJTVChiZmRfbWFjaGluZXMpCi0KLXRkZWZhdWx0cz0iIgotdGVzdCAtbiAiJHtkZWZ2ZWN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRERFRkFVTFRfVkVDVE9SPSR7ZGVmdmVjfSIKLXRlc3QgLW4gIiR7c2VsdmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX1ZFQ1M9JyR7c2VsdmVjc30nIgotdGVzdCAtbiAiJHtzZWxhcmNoc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JyR7c2VsYXJjaHN9JyIKLXRlc3QgLW4gIiR7aGF2ZXZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAke2hhdmV2ZWNzfSIKLUFDX1NVQlNUKHRkZWZhdWx0cykKLQotZG5sIEFDX0NIRUNLX0hFQURFUlMoc3lzL21tYW4uaCkKLUFDX0ZVTkNfTU1BUAotQUNfQ0hFQ0tfRlVOQ1MobWFkdmlzZSBtcHJvdGVjdCkKLWNhc2UgJHt3YW50X21tYXB9KyR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZH0gaW4KLSAgdHJ1ZSt5ZXMgKSAgQUNfREVGSU5FKFVTRV9NTUFQLCAxLCBbVXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/XSkgOzsKLWVzYWMKLQotcm0gLWYgZG9jL2NvbmZpZy5zdGF0dXMKLUFDX09VVFBVVChNYWtlZmlsZSBkb2MvTWFrZWZpbGUgYmZkLWluMy5oOmJmZC1pbjIuaCBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9iZmQvY29yZWZpbGUuYyBiL2JmZC9jb3JlZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJmNTE5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb3JlZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIENvcmUgZmlsZSBnZW5lcmljIGludGVyZmFjZSByb3V0aW5lcyBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlDb3JlIGZpbGVzCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgYXJlIGZ1bmN0aW9ucyBwZXJ0YWluaW5nIHRvIGNvcmUgZmlsZXMuCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotU1lOT1BTSVMKLQlDT05TVCBjaGFyICpiZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHJlYWQtb25seSBzdHJpbmcgZXhwbGFpbmluZyB3aGljaCBwcm9ncmFtIHdhcyBydW5uaW5nCi0Jd2hlbiBpdCBmYWlsZWQgYW5kIHByb2R1Y2VkIHRoZSBjb3JlIGZpbGUgQHZhcnthYmZkfS4KLQotKi8KLQotQ09OU1QgY2hhciAqCi1iZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLCAoYWJmZCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIGNhdXNlZCB0aGUgY29yZSBkdW1wIHdoaWNoCi0JZ2VuZXJhdGVkIHRoZSBmaWxlIHRoZSBCRkQgQHZhcnthYmZkfSBpcyBhdHRhY2hlZCB0by4KLSovCi0KLWludAotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsIChhYmZkKSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiA8PHRydWU+PiBpZiB0aGUgY29yZSBmaWxlIGF0dGFjaGVkIHRvIEB2YXJ7Y29yZV9iZmR9Ci0Jd2FzIGdlbmVyYXRlZCBieSBhIHJ1biBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGF0dGFjaGVkIHRvCi0JQHZhcntleGVjX2JmZH0sIDw8ZmFsc2U+PiBvdGhlcndpc2UuCi0qLwotYm9vbGVhbgotY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgICBpZiAoKGNvcmVfYmZkLT5mb3JtYXQgIT0gYmZkX2NvcmUpIHx8IChleGVjX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpKSB7Ci0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgcmV0dXJuIEJGRF9TRU5EIChjb3JlX2JmZCwgX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCwKLQkJICAgICAoY29yZV9iZmQsIGV4ZWNfYmZkKSk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LWEyOWsuYyBiL2JmZC9jcHUtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyNWE0Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBTUQgMjkwMDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2EyOWtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2EyOWssCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAiYTI5ayIsCi0gICAgImEyOWsiLAotICAgIDQsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFscGhhLmMgYi9iZmQvY3B1LWFscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTkwMGIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBbHBoYSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihCSVRTX1dPUkQsIEJJVFNfQUREUiwgTlVNQkVSLCBQUklOVCwgREVGQVVMVCwgTkVYVCkgXAotICB7CQkJCQkJCVwKLSAgICBCSVRTX1dPUkQsIC8qIGJpdHMgaW4gYSB3b3JkICovCQkJXAotICAgIEJJVFNfQUREUiwgLyogYml0cyBpbiBhbiBhZGRyZXNzICovCQkJXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQkJXAotICAgIGJmZF9hcmNoX2FscGhhLAkJCQkJXAotICAgIE5VTUJFUiwJCQkJCQlcCi0gICAgImFscGhhIiwJCQkJCQlcCi0gICAgUFJJTlQsCQkJCQkJXAotICAgIDMsCQkJCQkJCVwKLSAgICBERUZBVUxULAkJCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJCQlcCi0gICAgTkVYVCwJCQkJCQlcCi0gIH0KLQotI2RlZmluZSBOTihpbmRleCkgKCZhcmNoX2luZm9fc3RydWN0W2luZGV4XSkKLQotLyogVGhlc2UgZXhpc3Qgb25seSBzbyB0aGF0IHdlIGNhbiByZXNvbmFibHkgZGlzYXNzZW1ibGUgUEFMY29kZS4gICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NCwgImFscGhhOmV2NCIsIGZhbHNlLCBOTigxKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY1LCAiYWxwaGE6ZXY1IiwgZmFsc2UsIE5OKDIpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjYsICJhbHBoYTpldjYiLCBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FscGhhX2FyY2ggPQotICBOICg2NCwgNjQsIDAsICJhbHBoYSIsIHRydWUsIE5OKDApKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtYXJjLmMgYi9iZmQvY3B1LWFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2U1OWQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFSQyBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkMobWFjaCwgcHJpbnRfbmFtZSwgZGVmYXVsdF9wLCBuZXh0KSBcCi17CQkJCQlcCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCQlcCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJXAotICAgIGJmZF9hcmNoX2FyYywJCQlcCi0gICAgbWFjaCwJCQkJXAotICAgICJhcmMiLAkJCQlcCi0gICAgcHJpbnRfbmFtZSwJCQkJXAotICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCVwKLSAgICBkZWZhdWx0X3AsCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCVwKLSAgICBuZXh0LAkJCQlcCi0gIH0KLQotI2lmIDAgLyogPz8/IE5vdCBjdXJyZW50bHkgbmVlZGVkLCBidXQga2VlcCBpbiBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIEFSQyAoYmZkX21hY2hfYXJjX2ZvbywgImFyYy1mb28iLCBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMV0pLAotICBBUkMgKGJmZF9tYWNoX2FyY19iYXIsICJhcmMtYmFyIiwgZmFsc2UsIDApLAotfTsKLSNlbmRpZgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoID0KLSAgQVJDIChiZmRfbWFjaF9hcmNfYmFzZSwgImFyYy1iYXNlIiwgdHJ1ZSwgMCAvKiZhcmNoX2luZm9fc3RydWN0WzBdKi8pOwotDAotLyogVXRpbGl0eSByb3V0aW5lcy4gICovCi0KLS8qIEdpdmVuIGNwdSB0eXBlIE5BTUUsIHJldHVybiBpdHMgYmZkX21hY2hfYXJjX3h4eCB2YWx1ZS4KLSAgIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1hcmNfZ2V0X21hY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcDsKLQotICBmb3IgKHAgPSAmYmZkX2FyY19hcmNoOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIC8qICs0OiBza2lwIG92ZXIgImFyYy0iICovCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCBwLT5wcmludGFibGVfbmFtZSArIDQpID09IDApCi0JcmV0dXJuIHAtPm1hY2g7Ci0gICAgfQotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFybS5jIGIvYmZkL2NwdS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhOWM0NC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQVJNIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpjb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc2NhbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgd2hpY2ggQVJNCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBhOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBiOwotewotICAvKiBJZiBhICYgYiBhcmUgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgd2UgY2FuIGRvIG5vdGhpbmcgKi8KLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gIC8qIElmIGEgJiBiIGFyZSBmb3IgdGhlIHNhbWUgbWFjaGluZSB0aGVuIGFsbCBpcyB3ZWxsICovCi0gIGlmIChhLT5tYWNoID09IGItPm1hY2gpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogT3RoZXJ3aXNlIGlmIGVpdGhlciBhIG9yIGIgaXMgdGhlICdkZWZhdWx0JyBtYWNoaW5lIHRoZW4KLSAgICAgaXQgY2FuIGJlIHBvbHltb3JwaGVkIGludG8gdGhlIG90aGVyICovCi0gIGlmIChhLT50aGVfZGVmYXVsdCkKLSAgICByZXR1cm4gYjsKLSAgCi0gIGlmIChiLT50aGVfZGVmYXVsdCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBTbyBmYXIgYWxsIG5ld2VyIEFSTSBhcmNoaXRlY3R1cmUgY29yZXMgYXJlIHN1cGVyc2V0cyBvZiBwcmV2aW91cyBjb3JlcyAqLwotICBpZiAoYS0+bWFjaCA8IGItPm1hY2gpCi0gICAgcmV0dXJuIGI7Ci0gIGVsc2UgaWYgKGEtPm1hY2ggPiBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE5ldmVyIHJlYWNoZWQhICovCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0Ci17Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBjaGFyICogICAgICAgICAgICAgICAgbmFtZTsKLX0KLXByb2Nlc3NvcnNbXSA9Ci17Ci0gIHsgYmZkX21hY2hfYXJtXzIsICAiYXJtMiIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzJhLCAiYXJtMjUwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzJhLCAiYXJtMyIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNiIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNjAiICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNjAwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNjEwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNyIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNzEwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtNzUwMCIgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtN2QiICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzMsICAiYXJtN2RpIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzNNLCAiYXJtN2RtIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzNNLCAiYXJtN2RtaSIgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzRULCAiYXJtN3RkbWkiIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAiYXJtOCIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAiYXJtODEwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAiYXJtOSIgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAiYXJtOTIwIiAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzRULCAiYXJtOTIwdCIgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzRULCAiYXJtOXRkbWkiIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAic2ExIiAgICAgIH0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAic3Ryb25nYXJtIn0sCi0gIHsgYmZkX21hY2hfYXJtXzQsICAic3Ryb25nYXJtMTEwIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybTExMDAiIH0sCi19OwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBpbnQgIGk7Ci0KLSAgLyogRmlyc3QgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTmV4dCBjaGVjayBmb3IgYSBwcm9jZXNzb3IgbmFtZSBpbnN0ZWFkIG9mIGFuIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gIGZvciAoaSA9IHNpemVvZiAocHJvY2Vzc29ycykgLyBzaXplb2YgKHByb2Nlc3NvcnNbMF0pOyBpLS07KQotICAgIHsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIHByb2Nlc3NvcnNbIGkgXS5uYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSAhPSAtMSAmJiBpbmZvLT5hcmNoID09IHByb2Nlc3NvcnNbIGkgXS5hcmNoKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpbmFsbHkgY2hlY2sgZm9yIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCAiYXJtIikgPT0gMCkKLSAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX2FybSwgbnVtYmVyLCAiYXJtIiwgcHJpbnQsIDQsIGRlZmF1bHQsIGNvbXBhdGlibGUsIHNjYW4sIG5leHQgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKCBiZmRfbWFjaF9hcm1fMiwgICJhcm12MiIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzFdICksCi0gIE4oIGJmZF9tYWNoX2FybV8yYSwgImFybXYyYSIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzMsICAiYXJtdjMiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFszXSApLAotICBOKCBiZmRfbWFjaF9hcm1fM00sICJhcm12M20iLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzRdICksCi0gIE4oIGJmZF9tYWNoX2FybV80LCAgImFybXY0IiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNV0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzRULCAiYXJtdjR0IiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs2XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNSwgICJhcm12NSIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzddICksCi0gIE4oIGJmZF9tYWNoX2FybV81VCwgImFybXY1dCIsIGZhbHNlLCBOVUxMICkKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2ggPQotICBOKCAwLCAiYXJtIiwgdHJ1ZSwgJiBhcmNoX2luZm9fc3RydWN0WzBdICk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWF2ci5jIGIvYmZkL2NwdS1hdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YjEzZi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWF2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIEFWUiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEZW5pcyBDaGVydHlrb3YgPGRlbmlzY0BvdmVydGEucnU+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmNvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLQotI2RlZmluZSBOKGFkZHJfYml0cywgbWFjaGluZSwgcHJpbnQsIGRlZmF1bHQsIG5leHQpCQlcCi17CQkJCQkJCQlcCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIHdvcmQgKi8JCVwKLSAgYWRkcl9iaXRzLAkJCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwlcCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKLSAgYmZkX2FyY2hfYXZyLAkJCQkJCQlcCi0gIG1hY2hpbmUsCQkJLyogbWFjaGluZSAqLwkJCVwKLSAgImF2ciIsCQkJLyogYXJjaF9uYW1lICAqLwkJXAotICBwcmludCwJCQkvKiBwcmludGFibGUgbmFtZSAqLwkJXAotICAxLAkJCQkvKiBzZWN0aW9uIGFsaWduIHBvd2VyICovCVwKLSAgZGVmYXVsdCwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCVwKLSAgY29tcGF0aWJsZSwJCQkJCQkJXAotICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJCVwKLSAgbmV4dAkJCQkJCQkJXAotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIC8qIEFUOTBTMTIwMCAqLwotICBOICgxNiwgYmZkX21hY2hfYXZyMSwgImF2cjoxIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0KLSAgLyogQVQ5MFMyeHh4LCBBVDkwUzR4eHgsIEFUOTBTODF4eCwgQVR0aW55MjIgKi8KLSAgTiAoMTYsIGJmZF9tYWNoX2F2cjIsICJhdnI6MiIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMl0pLAotCi0gIC8qIEFUbWVnYTEwMywgQVRtZWdhNjAzICovCi0gIE4gKDIyLCBiZmRfbWFjaF9hdnIzLCAiYXZyOjMiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzNdKSwKLQotICAvKiBBVG1lZ2ExNjEgKi8KLSAgTiAoMTYsIGJmZF9tYWNoX2F2cjQsICJhdnI6NCIsIGZhbHNlLCBOVUxMKQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hdnJfYXJjaCA9Ci0gIE4gKDE2LCBiZmRfbWFjaF9hdnIyLCAiYXZyIiwgdHJ1ZSwgJiBhcmNoX2luZm9fc3RydWN0WzBdKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgd2hpY2ggQVZSCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGI7Ci17Ci0gIC8qIElmIGEgJiBiIGFyZSBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMgd2UgY2FuIGRvIG5vdGhpbmcuICAqLwotICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNwZWNpYWwgY2FzZSBmb3IgQVRtZWdhWzE2XTAzIChhdnI6MykgYW5kIEFUbWVnYTE2MSAoYXZyOjQpLiAgKi8KLSAgaWYgKChhLT5tYWNoID09IDMgJiYgYi0+bWFjaCA9PSA0KQotICAgICAgfHwgKGEtPm1hY2ggPT0gNCAmJiBiLT5tYWNoID09IDMpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNvIGZhciBhbGwgbmV3ZXIgQVZSIGFyY2hpdGVjdHVyZSBjb3JlcyBhcmUgc3VwZXJzZXRzIG9mIHByZXZpb3VzCi0gICAgIGNvcmVzLiAgKi8KLSAgaWYgKGEtPm1hY2ggPD0gYi0+bWFjaCkKLSAgICByZXR1cm4gYjsKLQotICAvKiBOZXZlciByZWFjaGVkISAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LWQxMHYuYyBiL2JmZC9jcHUtZDEwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZjM2I3Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZDEwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBEMTBWIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgZDEwdl90czNfaW5mbyA9IAotewkJCQkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICBiZmRfYXJjaF9kMTB2LAotICBiZmRfbWFjaF9kMTB2X3RzMywJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdjp0czMiLAkJCQkKLSAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gIGZhbHNlLAkJCQkKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkKLSAgMCwJCQkJCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGQxMHZfdHMyX2luZm8gPSAKLXsKLSAgMTYsCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCQkKLSAgMTYsCS8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkKLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCi0gIGJmZF9hcmNoX2QxMHYsCi0gIGJmZF9tYWNoX2QxMHZfdHMyLAkJCi0gICJkMTB2IiwJCQkJCi0gICJkMTB2OnRzMiIsCQkJCQotICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwkKLSAgZmFsc2UsCQkJCQotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQotICBiZmRfZGVmYXVsdF9zY2FuLAkJCQotICAmZDEwdl90czNfaW5mbywJCQkJCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2QxMHZfYXJjaCA9IAotewkJCQkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICBiZmRfYXJjaF9kMTB2LAotICBiZmRfbWFjaF9kMTB2LAkJCi0gICJkMTB2IiwJCQkJCi0gICJkMTB2IiwJCQkJCi0gIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCQotICB0cnVlLAkJCQkKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkKLSAgJmQxMHZfdHMyX2luZm8sCQkJCQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtZDMwdi5jIGIvYmZkL2NwdS1kMzB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWRmZWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE1pdHN1YmlzaGkgRDMwViBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2QzMHZfYXJjaCA9Ci17Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfZDMwdiwKLSAgICAwLAotICAgICJkMzB2IiwKLSAgICAiZDMwdiIsCi0gICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8KLSAgICB0cnVlLAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtZnIzMC5jIGIvYmZkL2NwdS1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjA4ZjguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1mcjMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEZSMzAgcHJvY2Vzc29yLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9mcjMwX2FyY2ggPQotewotICAzMiwJCQkJLyogYml0cyBwZXIgd29yZCAqLwotICAzMiwJCQkJLyogYml0cyBwZXIgYWRkcmVzcyAqLwotICA4LAkJCQkvKiBiaXRzIHBlciBieXRlICovCi0gIGJmZF9hcmNoX2ZyMzAsCQkvKiBhcmNoaXRlY3R1cmUgKi8KLSAgYmZkX21hY2hfZnIzMCwJCS8qIG1hY2hpbmUgKi8KLSAgImZyMzAiLAkJCS8qIGFyY2hpdGVjdHVyZSBuYW1lICovCi0gICJmcjMwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICA0LAkJCQkvKiBzZWN0aW9uIGFsaWduIHBvd2VyICovCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0ID8gKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwJLyogYXJjaGl0ZWN0dXJlIGNvbXBhcmlzb24gZm4gKi8KLSAgYmZkX2RlZmF1bHRfc2NhbiwJCS8qIHN0cmluZyB0byBhcmNoaXRlY3R1cmUgY29udmVydCBmbiAqLwotICBOVUxMCQkJCS8qIG5leHQgaW4gbGlzdCAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaDgzMDAuYyBiL2JmZC9jcHUtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3YjdkZi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1pbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCAoKTsKLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX3NjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKCpzdHJpbmcgIT0gJ2gnICYmICpzdHJpbmcgIT0gJ0gnKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzgnKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgPT0gJy8nKQotICAgIHN0cmluZysrOwotCi0gIGlmICgqc3RyaW5nICE9ICczJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyAhPSAnMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICctJykKLSAgICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgPT0gJ2gnIHx8ICpzdHJpbmcgPT0gJ0gnKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMGgpOwotICAgIH0KLSAgZWxzZSBpZiAoKnN0cmluZyA9PSAncycgfHwgKnN0cmluZyA9PSAnUycpCi0gICAgewotICAgICAgcmV0dXJuIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDA7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSAKLSAgIG1hY2hpbmUgd2hpY2ggd291bGQgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGggYW5kIHJldHVybnMgYSBwb2ludGVyCi0gICB0byBpdHMgaW5mbyBzdHJ1Y3R1cmUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChpbiwgb3V0KQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBpbjsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogb3V0OwotewotICAvKiBJdCdzIHJlYWxseSBub3QgYSBnb29kIGlkZWEgdG8gbWl4IGFuZCBtYXRjaCBtb2Rlcy4gICovCi0gIGlmIChpbi0+bWFjaCAhPSBvdXQtPm1hY2gpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW47Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaDgzMDBfaW5mb19zdHJ1Y3QgPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4MzAwLAotICBiZmRfbWFjaF9oODMwMCwKLSAgImg4MzAwIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBjb21wYXRpYmxlLAotICBoODMwMF9zY2FuLAotLyogICAgbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCAqLwotICAwLAotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBoODMwMGhfaW5mb19zdHJ1Y3QgPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4MzAwLAotICBiZmRfbWFjaF9oODMwMGgsCi0gICJoODMwMGgiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4MzAwaCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgZmFsc2UsCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBjb21wYXRpYmxlLAotICBoODMwMF9zY2FuLAotLyogICAgbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCAqLwotICAmaDgzMDBfaW5mb19zdHJ1Y3QsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4MzAwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4MzAwLAotICBiZmRfbWFjaF9oODMwMHMsCi0gICJoODMwMHMiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4MzAwcyIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgZmFsc2UsCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBjb21wYXRpYmxlLAotICBoODMwMF9zY2FuLAotLyogICAgbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCAqLwotICAmaDgzMDBoX2luZm9fc3RydWN0LAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaDg1MDAuYyBiL2JmZC9jcHUtaDg1MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNDJlMy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWg4NTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIEg4LzUwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWYgMAotCi0vKiAKLVJlbG9jYXRpb25zIGZvciB0aGUgWjhLCi0KLSovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLQotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYoYWJmZCwgeCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzhfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzgoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X0ZGbm5fY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgYWJvcnQoKTsKLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzgoYWJmZCwgeCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X3BjcmVsX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgYWJvcnQoKTsKLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzgoYWJmZCwgeCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fMTYKLSAgPSBORVdIT1dUTyhob3d0bzE2X2NhbGxiYWNrLCJhYnMxNiIsMSxmYWxzZSxmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184Ci0gID0gTkVXSE9XVE8oaG93dG84X2NhbGxiYWNrLCJhYnM4IiwwLGZhbHNlLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOF9GRm5uCi0gID0gTkVXSE9XVE8oaG93dG84X0ZGbm5fY2FsbGJhY2ssImZmMDArYWJzOCIsMCxmYWxzZSxmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfcGNyZWwKLSAgPSBORVdIT1dUTyhob3d0bzhfcGNyZWxfY2FsbGJhY2ssInBjcmVsOCIsMCxmYWxzZSx0cnVlKTsKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1sb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFyY2gsIGNvZGUpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgIHJldHVybiAmaG93dG9fMTY7Ci0gIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKLSAgICByZXR1cm4gJmhvd3RvXzhfRkZubjsKLSAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICByZXR1cm4gJmhvd3RvXzg7Ci0gIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0gICAgcmV0dXJuICZob3d0b184X3BjcmVsOwotICB9Ci0gIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci19Ci0jZW5kaWYKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2goKTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoc3RyY21wKHN0cmluZywiaDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIOC81MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4NTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAgLyogbm90IHVzZWQgY3VycmVudGx5ICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgotICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IGEtPm1hY2ggIT0gYi0+bWFjaCkKLSAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLSNlbmRpZgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4NTAwX2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4NTAwLAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAiaDg1MDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4NTAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWhwcGEuYyBiL2JmZC9jcHUtaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzE3NzQzLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBIUCBQcmVjaXNpb24gQXJjaGl0ZWN0dXJlIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTEwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDEwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTEuMCIsCi0gIDMsCi0gIHRydWUsCQkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci0KLS8qIFBBMi4wIGluIG5hcnJvdyBtb2RlICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhMjBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMjAsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjAgPSAxMCAqLwotICAiaHBwYSIsCi0gICJocHBhMi4wIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogVW5sZXNzIHdlIHVzZSAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGExMF9hcmNoLAotfTsKLQotLyogUEEyLjAgaW4gd2lkZSBtb2RlICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhMjB3X2FyY2ggPQotewotICA2NCwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgNjQsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDI1LAkJCQkvKiA/Pz8gSG93IGJlc3QgdG8gZGVzY3JpYmUgd2lkZSBtb2RlIGhlcmU/ICAqLwotICAiaHBwYSIsCi0gICJocHBhMi4wdyIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMjBfYXJjaCwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYV9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAxMSwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMSA9IDExICovCi0gICJocHBhIiwKLSAgImhwcGExLjEiLAotICAzLAotICBmYWxzZSwJCQkvKiAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgdXNlZCAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaHBwYTIwd19hcmNoLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTM3MC5jIGIvYmZkL2NwdS1pMzcwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzFlZWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pMzcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiBCRkQgaTM3MCBDUFUgZGVmaW5pdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotICAgSGFja2VkIGJ5IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4gaW4gMTk5OCwgMTk5OQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIGNvbW1vbiBpMzYwLzM3MCBhcmNoaXRlY3R1cmUgY29tZXMgaW4gbWFueSBmb3JtcyAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqaTM3MF9jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWkzNzBfY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfaTM3MCk7Ci0gIHN3aXRjaCAoYi0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2FyY2hfaTM3MDoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgLyogaGFjayBhbGVydDogb2xkIG9sZCBtYWNoaW5lcyBhcmUgcmVhbGx5IDE2IGFuZCAyNCBiaXQgYXJjaCAuLi4gKi8KLSAgewotICAgIDMyLCAvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLCAvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LCAgLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2kzNzAsCi0gICAgMzYwLCAvKiBmb3IgdGhlIDM2MCAqLwotICAgICJpMzcwIiwKLSAgICAiaTM3MDozNjAiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGkzNzBfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdCi0gIH0sCi0gIHsKLSAgICAzMiwgLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9pMzcwLAotICAgIDM3MCwgLyogZm9yIHRoZSAzNzAgKi8KLSAgICAiaTM3MCIsCi0gICAgImkzNzA6MzcwIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBpMzcwX2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwCi0gIH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzNzBfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9pMzcwLAotICAgIDAsICAvKiBmb3IgdGhlIDM2MC8zNzAgY29tbW9uIGFyY2hpdGVjdHVyZSAqLwotICAgICJpMzcwIiwKLSAgICAiaTM3MDpjb21tb24iLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIGRlZmF1bHQgKi8KLSAgICBpMzcwX2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFswXQotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pMzg2LmMgYi9iZmQvY3B1LWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViOWIxOC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgMzg2IGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgsCi0gICJpMzg2OmludGVsIiwKLSAgImkzODY6aW50ZWwiLAotICAzLAotICB0cnVlLAotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gIDAsCi19Owotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBpODA4Nl9hcmNoID0KLXsKLSAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKHdlbGwsIG5vdCByZWFsbHkpICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pODA4NiwKLSAgImk4MDg2IiwKLSAgImk4MDg2IiwKLSAgMywKLSAgZmFsc2UsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9pMzg2X2FyY2hfaW50ZWxfc3ludGF4LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pMzg2X2FyY2ggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIGJmZF9tYWNoX2kzODZfaTM4NiwKLSAgImkzODYiLAotICAiaTM4NiIsCi0gIDMsCi0gIHRydWUsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmk4MDg2X2FyY2gsCi19OwotCmRpZmYgLS1naXQgYS9iZmQvY3B1LWk4NjAuYyBiL2JmZC9jcHUtaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M4NjdjLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCA4NjAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNwdS1pMzg2LmMKLSAgIEhhcnJ5IERvbGFuIDxkb2xhbkBzc2QuaW50ZWwuY29tPiwgT2N0b2JlciAxOTk1Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2k4NjAsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAiaTg2MCIsCi0gICAgImk4NjAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWk5NjAuYyBiL2JmZC9jcHUtaTk2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc0YjJmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBpOTYwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCBhIHN0cmluZywgYW5kIHRyaWVzIHRvIHdvcmsgb3V0IGlmIGl0Ci0gICBjb3VsZCBwb3NzaWJseSByZWZlciB0byB0aGUgaTk2MCBtYWNoaW5lIHBvaW50ZWQgYXQgaW4gdGhlCi0gICBpbmZvX3N0cnVjdCBwb2ludGVyICovCi0KLXN0YXRpYyBib29sZWFuCi1zY2FuXzk2MF9tYWNoIChhcCwgc3RyaW5nKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLSAgaW50IGk7Ci0gIGludCBmYWlsX2JlY2F1c2Vfbm90XzgwOTYwID0gZmFsc2U7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChzdHJpbmcpOyBpICsrKQotICAgIHN0cmluZ1tpXSA9IHRvbG93ZXIgKHN0cmluZ1tpXSk7Ci0KLSAgLyogTG9vayBmb3IgdGhlIHN0cmluZyBpOTYwIGF0IHRoZSBmcm9udCBvZiB0aGUgc3RyaW5nLiAgKi8KLSAgaWYgKHN0cm5jbXAgKCJpOTYwIiwgc3RyaW5nLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIHN0cmluZyArPSA0OwotCi0gICAgICAvKiBpOTYwIG9uIGl0J3Mgb3duIG1lYW5zIGNvcmUgdG8gdXMuICAqLwotICAgICAgaWYgKCogc3RyaW5nID09IDApCi0JcmV0dXJuIGFwLT5tYWNoID09IGJmZF9tYWNoX2k5NjBfY29yZTsKLSAgICAgIAotICAgICAgLyogImk5NjA6KiIgaXMgdmFsaWQsIGFueXRoaW5nIGVsc2UgaXMgbm90LiAgKi8KLSAgICAgIGlmICgqIHN0cmluZyAhPSAnOicpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzdHJpbmcgKys7Ci0gICAgfQotICAvKiBJbiBzb21lIGJmZHMgdGhlIGNwdS1pZCBpcyB3cml0dGVuIGFzICI4MDk2MEtBIiwgIjgwOTYwS0IiLAotICAgICAiODA5NjBDQSIgb3IgIjgwOTYwTUMiLiAgKi8KLSAgZWxzZSBpZiAoc3RybmNtcCAoIjgwOTYwIiwgc3RyaW5nLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIHN0cmluZyArPSA1OwotCi0gICAgICAvKiBTZXR0IGhpcyB0byB0cnVlIGhlcmUuICBJZiBhIGNvcnJlY3QgbWF0Y2hpbmcgcG9zdGZpeAotCSBpcyBkZXRlY3RlZCBiZWxvdyBpdCB3aWxsIGJlIHJlc2V0IHRvIGZhbHNlLiAgKi8KLSAgICAgIGZhaWxfYmVjYXVzZV9ub3RfODA5NjAgPSB0cnVlOwotICAgIH0KLSAgLyogTm8gbWF0Y2gsIGNhbid0IGJlIHVzLiAgKi8KLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmICgqIHN0cmluZyA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnbycgJiYgc3RyaW5nWzJdID09ICdyJyAmJgotICAgICAgc3RyaW5nWzNdID09ICdlJyAmJiBzdHJpbmdbNF0gPT0gJ1wwJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImthX3NhIikgPT0gMCkKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLSAgZWxzZSBpZiAoc3RyY21wIChzdHJpbmcsICJrYl9zYiIpID09IDApCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1sxXSA9PSAnXDAnIHx8IHN0cmluZ1syXSAhPSAnXDAnKSAvKiByZXN0IGFyZSAyLWNoYXIuICAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQotICAgIHsgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7IGZhaWxfYmVjYXVzZV9ub3RfODA5NjAgPSBmYWxzZTsgfQotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnbScgJiYgc3RyaW5nWzFdID09ICdjJykKLSAgICB7IG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOyBmYWlsX2JlY2F1c2Vfbm90XzgwOTYwID0gZmFsc2U7IH0KLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICd4JyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgeyBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsgZmFpbF9iZWNhdXNlX25vdF84MDk2MCA9IGZhbHNlOyB9Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICB7IG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOyBmYWlsX2JlY2F1c2Vfbm90XzgwOTYwID0gZmFsc2U7IH0KLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2onICYmIHN0cmluZ1sxXSA9PSAneCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaCcgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmFpbF9iZWNhdXNlX25vdF84MDk2MCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAobWFjaGluZSA9PSBhcC0+bWFjaCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSBpOTYwCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLQotICAvKiBUaGUgaTk2MCBoYXMgZGlzdGluY3Qgc3Vic3BlY2llcyB3aGljaCBtYXkgbm90IGludGVyYnJlZWQ6Ci0JQ09SRSBDQSAgICAgICAgICAKLQlDT1JFIEtBIEtCIE1DIFhBCi0JQ09SRSBIWCBKWAotICAgICBBbnkgYXJjaGl0ZWN0dXJlIG9uIHRoZSBzYW1lIGxpbmUgaXMgY29tcGF0aWJsZSwgdGhlIG9uZSBvbgotICAgICB0aGUgcmlnaHQgaXMgdGhlIGxlYXN0IHJlc3RyaWN0aXZlLiAgCi0gICAgIAotICAgICBXZSByZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbiBhcnJheSwgZWFjaCBtYWNoaW5lIHRvIGEgc2lkZSAqLwotCi0jZGVmaW5lIEVSUk9SCTAKLSNkZWZpbmUgQ09SRQliZmRfbWFjaF9pOTYwX2NvcmUgIC8qMSovICAKLSNkZWZpbmUgS0EgCWJmZF9tYWNoX2k5NjBfa2Ffc2EgLyoyKi8gCi0jZGVmaW5lIEtCIAliZmRfbWFjaF9pOTYwX2tiX3NiIC8qMyovCi0jZGVmaW5lIE1DIAliZmRfbWFjaF9pOTYwX21jICAgIC8qNCovCi0jZGVmaW5lIFhBIAliZmRfbWFjaF9pOTYwX3hhICAgIC8qNSovCi0jZGVmaW5lIENBIAliZmRfbWFjaF9pOTYwX2NhICAgIC8qNiovCi0jZGVmaW5lIEpYCWJmZF9tYWNoX2k5NjBfanggICAgLyo3Ki8KLSNkZWZpbmUgSFgJYmZkX21hY2hfaTk2MF9oeCAgICAvKjgqLwotI2RlZmluZSBNQVhfQVJDSCAoKGludClIWCkKLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgbG9uZyBtYXRyaXhbTUFYX0FSQ0grMV1bTUFYX0FSQ0grMV0gPSAKLSAgICB7Ci0gICAgICB7IEVSUk9SLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBDT1JFLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBLQSwJS0EsCUtBLAlLQiwJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgS0IsCUtCLAlLQiwJS0IsCU1DLAlYQSwJRVJST1IsIAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBNQywJTUMsCU1DLAlNQywJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgWEEsCVhBLAlYQSwJWEEsCVhBLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IENBLAlDQSwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUNBLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBKWCwJSlgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwgIEpYLAlIWCB9LAotICAgICAgeyBIWCwJSFgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJSFgsCUhYIH0sCi0gICAgfTsKLQotCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdID09IEVSUk9SKSAKLSAgICB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICByZXR1cm4gKGEtPm1hY2ggID09ICBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0pID8gIGEgOiBiOwotICAgIH0KLX0KLQotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0jZGVmaW5lIE4oYSxiLGQsbikgXAoteyAzMiwgMzIsIDgsYmZkX2FyY2hfaTk2MCxhLCJpOTYwIixiLDMsZCxjb21wYXRpYmxlLHNjYW5fOTYwX21hY2gsbix9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17IAotICBOKGJmZF9tYWNoX2k5NjBfa2Ffc2EsImk5NjA6a2Ffc2EiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfaTk2MF9rYl9zYiwiaTk2MDprYl9zYiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9pOTYwX21jLCAgICJpOTYwOm1jIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbM10pLAotICBOKGJmZF9tYWNoX2k5NjBfeGEsICAgImk5NjA6eGEiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfaTk2MF9jYSwgICAiaTk2MDpjYSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2p4LCAgICJpOTYwOmp4IiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNl0pLAotICBOKGJmZF9tYWNoX2k5NjBfaHgsCSJpOTYwOmh4IiwgICBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaCA9Ci0gIE4oYmZkX21hY2hfaTk2MF9jb3JlLCAiaTk2MDpjb3JlIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pYTY0LW9wYy5jIGIvYmZkL2NwdS1pYTY0LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzBkYmU3Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaWE2NC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogTG9naWNhbGx5LCB0aGlzIGNvZGUgc2hvdWxkIGJlIHBhcnQgb2YgbGlib3Bjb2RlIGJ1dCBzaW5jZSBzb21lIG9mCi0gICB0aGUgb3BlcmFuZCBpbnNlcnRpb24vZXh0cmFjdGlvbiBmdW5jdGlvbnMgaGVscCBiZmQgdG8gaW1wbGVtZW50Ci0gICByZWxvY2F0aW9ucywgdGhpcyBjb2RlIGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgZWxmNjQtaWE2NC5jLiAgVGhpcwotICAgYXZvaWRzIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGxpYm9wY29kZSBhbmQgbGliYmZkIGFuZCBhbHNvCi0gICBvYnZpYXRlcyB0aGUgbmVlZCBmb3IgYXBwbGljYXRpb25zIHRvIGxpbmsgaW4gbGlib3Bjb2RlIHdoZW4gYWxsCi0gICB0aGV5IHJlYWxseSB3YW50IGlzIGxpYmJmZC4KLQotICAgLS1kYXZpZG0gTW9uIEFwciAxMyAyMjoxNDowMiAxOTk4ICovCi0KLSNpbmNsdWRlICIuLi9vcGNvZGVzL2lhNjQtb3BjLmgiCi0KLSNkZWZpbmUgTkVMRU1TKGEpICAoKGludCkgKHNpemVvZiAoYSkgLyBzaXplb2YgKChhKVswXSkpKQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19yc3ZkIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgcmV0dXJuICJpbnRlcm5hbCBlcnJvci0tLXRoaXMgc2hvdWxkbid0IGhhcHBlbiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X3JzdmQgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLCBpYTY0X2luc24gKnZhbHVlcCkKLXsKLSAgcmV0dXJuICJpbnRlcm5hbCBlcnJvci0tLXRoaXMgc2hvdWxkbid0IGhhcHBlbiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotaW5zX2NvbnN0IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2NvbnN0IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19yZWcgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICBpZiAodmFsdWUgPj0gMXUgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykKLSAgICByZXR1cm4gInJlZ2lzdGVyIG51bWJlciBvdXQgb2YgcmFuZ2UiOwotCi0gICpjb2RlIHw9IHZhbHVlIDw8IHNlbGYtPmZpZWxkWzBdLnNoaWZ0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfcmVnIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gICp2YWx1ZXAgPSAoKGNvZGUgPj4gc2VsZi0+ZmllbGRbMF0uc2hpZnQpCi0JICAgICAmICgoMXUgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykgLSAxKSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19pbW11IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgaWE2NF9pbnNuIG5ldyA9IDA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBORUxFTVMgKHNlbGYtPmZpZWxkKSAmJiBzZWxmLT5maWVsZFtpXS5iaXRzOyArK2kpCi0gICAgewotICAgICAgbmV3IHw9ICgodmFsdWUgJiAoKCgoaWE2NF9pbnNuKSAxKSA8PCBzZWxmLT5maWVsZFtpXS5iaXRzKSAtIDEpKQotCSAgICAgIDw8IHNlbGYtPmZpZWxkW2ldLnNoaWZ0KTsKLSAgICAgIHZhbHVlID4+PSBzZWxmLT5maWVsZFtpXS5iaXRzOwotICAgIH0KLSAgaWYgKHZhbHVlKQotICAgIHJldHVybiAiaW50ZWdlciBvcGVyYW5kIG91dCBvZiByYW5nZSI7Ci0KLSAgKmNvZGUgfD0gbmV3OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfaW1tdSAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIGNvZGUsIGlhNjRfaW5zbiAqdmFsdWVwKQotewotICBCRkRfSE9TVF9VXzY0X0JJVCB2YWx1ZSA9IDA7Ci0gIGludCBpLCBiaXRzID0gMCwgdG90YWwgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBORUxFTVMgKHNlbGYtPmZpZWxkKSAmJiBzZWxmLT5maWVsZFtpXS5iaXRzOyArK2kpCi0gICAgewotICAgICAgYml0cyA9IHNlbGYtPmZpZWxkW2ldLmJpdHM7Ci0gICAgICB2YWx1ZSB8PSAoKGNvZGUgPj4gc2VsZi0+ZmllbGRbaV0uc2hpZnQpCi0JCSYgKCgoKEJGRF9IT1NUX1VfNjRfQklUKSAxKSA8PCBiaXRzKSAtIDEpKSA8PCB0b3RhbDsKLSAgICAgIHRvdGFsICs9IGJpdHM7Ci0gICAgfQotICAqdmFsdWVwID0gdmFsdWU7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19pbW11czggKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICBpZiAodmFsdWUgJiAweDcpCi0gICAgcmV0dXJuICJ2YWx1ZSBub3QgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiA4IjsKLSAgcmV0dXJuIGluc19pbW11IChzZWxmLCB2YWx1ZSA+PiAzLCBjb2RlKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfaW1tdXM4IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBleHRfaW1tdSAoc2VsZiwgY29kZSwgdmFsdWVwKTsKLSAgaWYgKHJlc3VsdCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gICp2YWx1ZXAgPSAqdmFsdWVwIDw8IDM7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19pbW1zX3NjYWxlZCAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIHZhbHVlLAotCQkgaWE2NF9pbnNuICpjb2RlLCBpbnQgc2NhbGUpCi17Ci0gIEJGRF9IT1NUXzY0X0JJVCBzdmFsdWUgPSB2YWx1ZSwgc2lnbl9iaXQ7Ci0gIGlhNjRfaW5zbiBuZXcgPSAwOwotICBpbnQgaTsKLQotICBzdmFsdWUgPj49IHNjYWxlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBORUxFTVMgKHNlbGYtPmZpZWxkKSAmJiBzZWxmLT5maWVsZFtpXS5iaXRzOyArK2kpCi0gICAgewotICAgICAgbmV3IHw9ICgoc3ZhbHVlICYgKCgoKGlhNjRfaW5zbikgMSkgPDwgc2VsZi0+ZmllbGRbaV0uYml0cykgLSAxKSkKLQkgICAgICA8PCBzZWxmLT5maWVsZFtpXS5zaGlmdCk7Ci0gICAgICBzaWduX2JpdCA9IChzdmFsdWUgPj4gKHNlbGYtPmZpZWxkW2ldLmJpdHMgLSAxKSkgJiAxOwotICAgICAgc3ZhbHVlID4+PSBzZWxmLT5maWVsZFtpXS5iaXRzOwotICAgIH0KLSAgaWYgKCghc2lnbl9iaXQgJiYgc3ZhbHVlICE9IDApIHx8IChzaWduX2JpdCAmJiBzdmFsdWUgIT0gLTEpKQotICAgIHJldHVybiAiaW50ZWdlciBvcGVyYW5kIG91dCBvZiByYW5nZSI7Ci0KLSAgKmNvZGUgfD0gbmV3OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfaW1tc19zY2FsZWQgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLAotCQkgaWE2NF9pbnNuICp2YWx1ZXAsIGludCBzY2FsZSkKLXsKLSAgaW50IGksIGJpdHMgPSAwLCB0b3RhbCA9IDAsIHNoaWZ0OwotICBCRkRfSE9TVF82NF9CSVQgdmFsID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTkVMRU1TIChzZWxmLT5maWVsZCkgJiYgc2VsZi0+ZmllbGRbaV0uYml0czsgKytpKQotICAgIHsKLSAgICAgIGJpdHMgPSBzZWxmLT5maWVsZFtpXS5iaXRzOwotICAgICAgdmFsIHw9ICgoY29kZSA+PiBzZWxmLT5maWVsZFtpXS5zaGlmdCkKLQkgICAgICAmICgoKChCRkRfSE9TVF9VXzY0X0JJVCkgMSkgPDwgYml0cykgLSAxKSkgPDwgdG90YWw7Ci0gICAgICB0b3RhbCArPSBiaXRzOwotICAgIH0KLSAgLyogc2lnbiBleHRlbmQ6ICovCi0gIHNoaWZ0ID0gOCpzaXplb2YgKHZhbCkgLSB0b3RhbDsKLSAgdmFsID0gKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQ7Ci0KLSAgKnZhbHVlcCA9ICh2YWwgPDwgc2NhbGUpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfaW1tcyAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIHZhbHVlLCBpYTY0X2luc24gKmNvZGUpCi17Ci0gIHJldHVybiBpbnNfaW1tc19zY2FsZWQgKHNlbGYsIHZhbHVlLCBjb2RlLCAwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfaW1tc3U0IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgaWYgKHZhbHVlID09IChCRkRfSE9TVF9VXzY0X0JJVCkgMHgxMDAwMDAwMDApCi0gICAgdmFsdWUgPSAwOwotICBlbHNlCi0gICAgdmFsdWUgPSAoKChCRkRfSE9TVF82NF9CSVQpdmFsdWUgPDwgMzIpID4+IDMyKTsKLQotICByZXR1cm4gaW5zX2ltbXNfc2NhbGVkIChzZWxmLCB2YWx1ZSwgY29kZSwgMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2ltbXMgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLCBpYTY0X2luc24gKnZhbHVlcCkKLXsKLSAgcmV0dXJuIGV4dF9pbW1zX3NjYWxlZCAoc2VsZiwgY29kZSwgdmFsdWVwLCAwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfaW1tc20xIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgLS12YWx1ZTsKLSAgcmV0dXJuIGluc19pbW1zX3NjYWxlZCAoc2VsZiwgdmFsdWUsIGNvZGUsIDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19pbW1zbTF1NCAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIHZhbHVlLAotCSAgICAgIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgaWYgKHZhbHVlID09IChCRkRfSE9TVF9VXzY0X0JJVCkgMHgxMDAwMDAwMDApCi0gICAgdmFsdWUgPSAwOwotICBlbHNlCi0gICAgdmFsdWUgPSAoKChCRkRfSE9TVF82NF9CSVQpdmFsdWUgPDwgMzIpID4+IDMyKTsKLQotICAtLXZhbHVlOwotICByZXR1cm4gaW5zX2ltbXNfc2NhbGVkIChzZWxmLCB2YWx1ZSwgY29kZSwgMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2ltbXNtMSAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIGNvZGUsIGlhNjRfaW5zbiAqdmFsdWVwKQotewotICBjb25zdCBjaGFyICpyZXMgPSBleHRfaW1tc19zY2FsZWQgKHNlbGYsIGNvZGUsIHZhbHVlcCwgMCk7Ci0KLSAgKysqdmFsdWVwOwotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLWluc19pbW1zMSAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIHZhbHVlLCBpYTY0X2luc24gKmNvZGUpCi17Ci0gIHJldHVybiBpbnNfaW1tc19zY2FsZWQgKHNlbGYsIHZhbHVlLCBjb2RlLCAxKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfaW1tczEgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLCBpYTY0X2luc24gKnZhbHVlcCkKLXsKLSAgcmV0dXJuIGV4dF9pbW1zX3NjYWxlZCAoc2VsZiwgY29kZSwgdmFsdWVwLCAxKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfaW1tczQgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICByZXR1cm4gaW5zX2ltbXNfc2NhbGVkIChzZWxmLCB2YWx1ZSwgY29kZSwgNCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2ltbXM0IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gIHJldHVybiBleHRfaW1tc19zY2FsZWQgKHNlbGYsIGNvZGUsIHZhbHVlcCwgNCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotaW5zX2ltbXMxNiAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIHZhbHVlLCBpYTY0X2luc24gKmNvZGUpCi17Ci0gIHJldHVybiBpbnNfaW1tc19zY2FsZWQgKHNlbGYsIHZhbHVlLCBjb2RlLCAxNik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2ltbXMxNiAoY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCAqc2VsZiwgaWE2NF9pbnNuIGNvZGUsIGlhNjRfaW5zbiAqdmFsdWVwKQotewotICByZXR1cm4gZXh0X2ltbXNfc2NhbGVkIChzZWxmLCBjb2RlLCB2YWx1ZXAsIDE2KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfY2ltbXUgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICBpYTY0X2luc24gbWFzayA9ICgoKGlhNjRfaW5zbikgMSkgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykgLSAxOwotICByZXR1cm4gaW5zX2ltbXUgKHNlbGYsIHZhbHVlIF4gbWFzaywgY29kZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2NpbW11IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdDsKLSAgaWE2NF9pbnNuIG1hc2s7Ci0KLSAgbWFzayA9ICgoKGlhNjRfaW5zbikgMSkgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykgLSAxOwotICByZXN1bHQgPSBleHRfaW1tdSAoc2VsZiwgY29kZSwgdmFsdWVwKTsKLSAgaWYgKCFyZXN1bHQpCi0gICAgewotICAgICAgbWFzayA9ICgoKGlhNjRfaW5zbikgMSkgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykgLSAxOwotICAgICAgKnZhbHVlcCBePSBtYXNrOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfY250IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgLS12YWx1ZTsKLSAgaWYgKHZhbHVlID49ICgoQkZEX0hPU1RfVV82NF9CSVQpIDEpIDw8IHNlbGYtPmZpZWxkWzBdLmJpdHMpCi0gICAgcmV0dXJuICJjb3VudCBvdXQgb2YgcmFuZ2UiOwotCi0gICpjb2RlIHw9IHZhbHVlIDw8IHNlbGYtPmZpZWxkWzBdLnNoaWZ0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfY250IChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gICp2YWx1ZXAgPSAoKGNvZGUgPj4gc2VsZi0+ZmllbGRbMF0uc2hpZnQpCi0JICAgICAmICgoKChCRkRfSE9TVF9VXzY0X0JJVCkgMSkgPDwgc2VsZi0+ZmllbGRbMF0uYml0cykgLSAxKSkgKyAxOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1pbnNfY250MmIgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICAtLXZhbHVlOwotCi0gIGlmICh2YWx1ZSA+IDIpCi0gICAgcmV0dXJuICJjb3VudCBtdXN0IGJlIGluIHJhbmdlIDEuLjMiOwotCi0gICpjb2RlIHw9IHZhbHVlIDw8IHNlbGYtPmZpZWxkWzBdLnNoaWZ0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1leHRfY250MmIgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLCBpYTY0X2luc24gKnZhbHVlcCkKLXsKLSAgKnZhbHVlcCA9ICgoY29kZSA+PiBzZWxmLT5maWVsZFswXS5zaGlmdCkgJiAweDMpICsgMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotaW5zX2NudDJjIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsIGlhNjRfaW5zbiAqY29kZSkKLXsKLSAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgl2YWx1ZSA9IDA7IGJyZWFrOwotICAgIGNhc2UgNzoJdmFsdWUgPSAxOyBicmVhazsKLSAgICBjYXNlIDE1Ogl2YWx1ZSA9IDI7IGJyZWFrOwotICAgIGNhc2UgMTY6CXZhbHVlID0gMzsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJcmV0dXJuICJjb3VudCBtdXN0IGJlIDAsIDcsIDE1LCBvciAxNiI7Ci0gICAgfQotICAqY29kZSB8PSB2YWx1ZSA8PCBzZWxmLT5maWVsZFswXS5zaGlmdDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2NudDJjIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gY29kZSwgaWE2NF9pbnNuICp2YWx1ZXApCi17Ci0gIGlhNjRfaW5zbiB2YWx1ZTsKLQotICB2YWx1ZSA9IChjb2RlID4+IHNlbGYtPmZpZWxkWzBdLnNoaWZ0KSAmIDB4MzsKLSAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgY2FzZSAwOiB2YWx1ZSA9ICAwOyBicmVhazsKLSAgICBjYXNlIDE6IHZhbHVlID0gIDc7IGJyZWFrOwotICAgIGNhc2UgMjogdmFsdWUgPSAxNTsgYnJlYWs7Ci0gICAgY2FzZSAzOiB2YWx1ZSA9IDE2OyBicmVhazsKLSAgICB9Ci0gICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotaW5zX2luYzMgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiB2YWx1ZSwgaWE2NF9pbnNuICpjb2RlKQotewotICBCRkRfSE9TVF82NF9CSVQgdmFsID0gdmFsdWU7Ci0gIEJGRF9IT1NUX1VfNjRfQklUIHNpZ24gPSAwOwotCi0gIGlmICh2YWwgPCAwKQotICAgIHsKLSAgICAgIHNpZ24gPSAweDQ7Ci0gICAgICB2YWx1ZSA9IC12YWx1ZTsKLSAgICB9Ci0gIHN3aXRjaCAodmFsdWUpCi0gICAgewotICAgIGNhc2UgIDE6CXZhbHVlID0gMzsgYnJlYWs7Ci0gICAgY2FzZSAgNDoJdmFsdWUgPSAyOyBicmVhazsKLSAgICBjYXNlICA4Ogl2YWx1ZSA9IDE7IGJyZWFrOwotICAgIGNhc2UgMTY6CXZhbHVlID0gMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJcmV0dXJuICJjb3VudCBtdXN0IGJlICsvLSAxLCA0LCA4LCBvciAxNiI7Ci0gICAgfQotICAqY29kZSB8PSAoc2lnbiB8IHZhbHVlKSA8PCBzZWxmLT5maWVsZFswXS5zaGlmdDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZXh0X2luYzMgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLCBpYTY0X2luc24gKnZhbHVlcCkKLXsKLSAgQkZEX0hPU1RfNjRfQklUIHZhbDsKLSAgaW50IG5lZ2F0ZTsKLQotICB2YWwgPSAoY29kZSA+PiBzZWxmLT5maWVsZFswXS5zaGlmdCkgJiAweDc7Ci0gIG5lZ2F0ZSA9IHZhbCAmIDB4NDsKLSAgc3dpdGNoICh2YWwgJiAweDMpCi0gICAgewotICAgIGNhc2UgMDogdmFsID0gMTY7IGJyZWFrOwotICAgIGNhc2UgMTogdmFsID0gIDg7IGJyZWFrOwotICAgIGNhc2UgMjogdmFsID0gIDQ7IGJyZWFrOwotICAgIGNhc2UgMzogdmFsID0gIDE7IGJyZWFrOwotICAgIH0KLSAgaWYgKG5lZ2F0ZSkKLSAgICB2YWwgPSAtdmFsOwotCi0gICp2YWx1ZXAgPSB2YWw7Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIENTVAlJQTY0X09QTkRfQ0xBU1NfQ1NUCi0jZGVmaW5lIFJFRwlJQTY0X09QTkRfQ0xBU1NfUkVHCi0jZGVmaW5lIElORAlJQTY0X09QTkRfQ0xBU1NfSU5ECi0jZGVmaW5lIEFCUwlJQTY0X09QTkRfQ0xBU1NfQUJTCi0jZGVmaW5lIFJFTAlJQTY0X09QTkRfQ0xBU1NfUkVMCi0KLSNkZWZpbmUgU0RFQwlJQTY0X09QTkRfRkxBR19ERUNJTUFMX1NJR05FRAotI2RlZmluZSBVREVDCUlBNjRfT1BORF9GTEFHX0RFQ0lNQUxfVU5TSUdORUQKLQotY29uc3Qgc3RydWN0IGlhNjRfb3BlcmFuZCBlbGY2NF9pYTY0X29wZXJhbmRzW0lBNjRfT1BORF9DT1VOVF0gPQotICB7Ci0gICAgLyogY29uc3RhbnRzOiAqLwotICAgIHsgQ1NULCBpbnNfY29uc3QsIGV4dF9jb25zdCwgIk5JTCIsCQl7eyAwLCB9fSwgMCwgIjxub25lPiIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICJhci5jY3YiLAl7eyAwLCB9fSwgMCwgImFyLmNjdiIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICJhci5wZnMiLAl7eyAwLCB9fSwgMCwgImFyLnBmcyIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICIxIiwJCXt7IDAsIH19LCAwLCAiMSIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICI4IiwJCXt7IDAsIH19LCAwLCAiMSIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICIxNiIsCQl7eyAwLCB9fSwgMCwgIjE2IiB9LAotICAgIHsgQ1NULCBpbnNfY29uc3QsIGV4dF9jb25zdCwgInIwIiwJCXt7IDAsIH19LCAwLCAicjAiIH0sCi0gICAgeyBDU1QsIGluc19jb25zdCwgZXh0X2NvbnN0LCAiaXAiLAkJe3sgMCwgfX0sIDAsICJpcCIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICJwciIsCQl7eyAwLCB9fSwgMCwgInByIiB9LAotICAgIHsgQ1NULCBpbnNfY29uc3QsIGV4dF9jb25zdCwgInByLnJvdCIsCXt7IDAsIH19LCAwLCAicHIucm90IiB9LAotICAgIHsgQ1NULCBpbnNfY29uc3QsIGV4dF9jb25zdCwgInBzciIsCQl7eyAwLCB9fSwgMCwgInBzciIgfSwKLSAgICB7IENTVCwgaW5zX2NvbnN0LCBleHRfY29uc3QsICJwc3IubCIsCXt7IDAsIH19LCAwLCAicHNyLmwiIH0sCi0gICAgeyBDU1QsIGluc19jb25zdCwgZXh0X2NvbnN0LCAicHNyLnVtIiwJe3sgMCwgfX0sIDAsICJwc3IudW0iIH0sCi0KLSAgICAvKiByZWdpc3RlciBvcGVyYW5kczogKi8KLSAgICB7IFJFRywgaW5zX3JlZywgICBleHRfcmVnLAkiYXIiLCB7eyA3LCAyMH19LCAwLAkJLyogQVIzICovCi0gICAgICAiYW4gYXBwbGljYXRpb24gcmVnaXN0ZXIiIH0sCi0gICAgeyBSRUcsIGluc19yZWcsICAgZXh0X3JlZywJICJiIiwge3sgMywgIDZ9fSwgMCwJCS8qIEIxICovCi0gICAgICAiYSBicmFuY2ggcmVnaXN0ZXIiIH0sCi0gICAgeyBSRUcsIGluc19yZWcsICAgZXh0X3JlZywJICJiIiwge3sgMywgMTN9fSwgMCwJCS8qIEIyICovCi0gICAgICAiYSBicmFuY2ggcmVnaXN0ZXIifSwKLSAgICB7IFJFRywgaW5zX3JlZywgICBleHRfcmVnLAkiY3IiLCB7eyA3LCAyMH19LCAwLAkJLyogQ1IgKi8KLSAgICAgICJhIGNvbnRyb2wgcmVnaXN0ZXIifSwKLSAgICB7IFJFRywgaW5zX3JlZywgICBleHRfcmVnLAkgImYiLCB7eyA3LCAgNn19LCAwLAkJLyogRjEgKi8KLSAgICAgICJhIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIiB9LAotICAgIHsgUkVHLCBpbnNfcmVnLCAgIGV4dF9yZWcsCSAiZiIsIHt7IDcsIDEzfX0sIDAsCQkvKiBGMiAqLwotICAgICAgImEgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIiIH0sCi0gICAgeyBSRUcsIGluc19yZWcsICAgZXh0X3JlZywJICJmIiwge3sgNywgMjB9fSwgMCwJCS8qIEYzICovCi0gICAgICAiYSBmbG9hdGluZy1wb2ludCByZWdpc3RlciIgfSwKLSAgICB7IFJFRywgaW5zX3JlZywgICBleHRfcmVnLAkgImYiLCB7eyA3LCAyN319LCAwLAkJLyogRjQgKi8KLSAgICAgICJhIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIiB9LAotICAgIHsgUkVHLCBpbnNfcmVnLCAgIGV4dF9yZWcsCSAicCIsIHt7IDYsICA2fX0sIDAsCQkvKiBQMSAqLwotICAgICAgImEgcHJlZGljYXRlIHJlZ2lzdGVyIiB9LAotICAgIHsgUkVHLCBpbnNfcmVnLCAgIGV4dF9yZWcsCSAicCIsIHt7IDYsIDI3fX0sIDAsCQkvKiBQMiAqLwotICAgICAgImEgcHJlZGljYXRlIHJlZ2lzdGVyIiB9LAotICAgIHsgUkVHLCBpbnNfcmVnLCAgIGV4dF9yZWcsCSAiciIsIHt7IDcsICA2fX0sIDAsCQkvKiBSMSAqLwotICAgICAgImEgZ2VuZXJhbCByZWdpc3RlciIgfSwKLSAgICB7IFJFRywgaW5zX3JlZywgICBleHRfcmVnLAkgInIiLCB7eyA3LCAxM319LCAwLAkJLyogUjIgKi8KLSAgICAgICJhIGdlbmVyYWwgcmVnaXN0ZXIiIH0sCi0gICAgeyBSRUcsIGluc19yZWcsICAgZXh0X3JlZywJICJyIiwge3sgNywgMjB9fSwgMCwJCS8qIFIzICovCi0gICAgICAiYSBnZW5lcmFsIHJlZ2lzdGVyIiB9LAotICAgIHsgUkVHLCBpbnNfcmVnLCAgIGV4dF9yZWcsCSAiciIsIHt7IDIsIDIwfX0sIDAsCQkvKiBSM18yICovCi0gICAgICAiYSBnZW5lcmFsIHJlZ2lzdGVyIHIwLXIzIiB9LAotCi0gICAgLyogaW5kaXJlY3Qgb3BlcmFuZHM6ICovCi0gICAgeyBJTkQsIGluc19yZWcsICAgZXh0X3JlZywJImNwdWlkIiwge3s3LCAyMH19LCAwLAkJLyogQ1BVSURfUjMgKi8KLSAgICAgICJhIGNwdWlkIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJkYnIiLCAgIHt7NywgMjB9fSwgMCwJCS8qIERCUl9SMyAqLwotICAgICAgImEgZGJyIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJkdHIiLCAgIHt7NywgMjB9fSwgMCwJCS8qIERUUl9SMyAqLwotICAgICAgImEgZHRyIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJpdHIiLCAgIHt7NywgMjB9fSwgMCwJCS8qIElUUl9SMyAqLwotICAgICAgImFuIGl0ciByZWdpc3RlciIgfSwKLSAgICB7IElORCwgaW5zX3JlZywgICBleHRfcmVnLAkiaWJyIiwgICB7ezcsIDIwfX0sIDAsCQkvKiBJQlJfUjMgKi8KLSAgICAgICJhbiBpYnIgcmVnaXN0ZXIiIH0sCi0gICAgeyBJTkQsIGluc19yZWcsICAgZXh0X3JlZywJIiIsICAgICAge3s3LCAyMH19LCAwLAkJLyogTVIzICovCi0gICAgICAiYW4gaW5kaXJlY3QgbWVtb3J5IGFkZHJlc3MiIH0sCi0gICAgeyBJTkQsIGluc19yZWcsICAgZXh0X3JlZywJIm1zciIsICAge3s3LCAyMH19LCAwLAkJLyogTVNSX1IzICovCi0gICAgICAiYW4gbXNyIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJwa3IiLCAgIHt7NywgMjB9fSwgMCwJCS8qIFBLUl9SMyAqLwotICAgICAgImEgcGtyIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJwbWMiLCAgIHt7NywgMjB9fSwgMCwJCS8qIFBNQ19SMyAqLwotICAgICAgImEgcG1jIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJwbWQiLCAgIHt7NywgMjB9fSwgMCwJCS8qIFBNRF9SMyAqLwotICAgICAgImEgcG1kIHJlZ2lzdGVyIiB9LAotICAgIHsgSU5ELCBpbnNfcmVnLCAgIGV4dF9yZWcsCSJyciIsICAgIHt7NywgMjB9fSwgMCwJCS8qIFJSX1IzICovCi0gICAgICAiYW4gcnIgcmVnaXN0ZXIiIH0sCi0KLSAgICAvKiBpbW1lZGlhdGUgb3BlcmFuZHM6ICovCi0gICAgeyBBQlMsIGluc19jaW1tdSwgZXh0X2NpbW11LCAwLCB7eyA1LCAyMCB9fSwgVURFQywJCS8qIENDTlQ1ICovCi0gICAgICAiYSA1LWJpdCBjb3VudCAoMC0zMSkiIH0sCi0gICAgeyBBQlMsIGluc19jbnQsICAgZXh0X2NudCwgICAwLCB7eyAyLCAyNyB9fSwgVURFQywJCS8qIENOVDJhICovCi0gICAgICAiYSAyLWJpdCBjb3VudCAoMS00KSIgfSwKLSAgICB7IEFCUywgaW5zX2NudDJiLCBleHRfY250MmIsIDAsIHt7IDIsIDI3IH19LCBVREVDLAkJLyogQ05UMmIgKi8KLSAgICAgICJhIDItYml0IGNvdW50ICgxLTMpIiB9LAotICAgIHsgQUJTLCBpbnNfY250MmMsIGV4dF9jbnQyYywgMCwge3sgMiwgMzAgfX0sIFVERUMsCQkvKiBDTlQyYyAqLwotICAgICAgImEgY291bnQgKDAsIDcsIDE1LCBvciAxNikiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyA1LCAxNH19LCBVREVDLAkJLyogQ05UNSAqLwotICAgICAgImEgNS1iaXQgY291bnQgKDAtMzEpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tdSwgIGV4dF9pbW11LCAgMCwge3sgNiwgMjd9fSwgVURFQywJCS8qIENOVDYgKi8KLSAgICAgICJhIDYtYml0IGNvdW50ICgwLTYzKSIgfSwKLSAgICB7IEFCUywgaW5zX2NpbW11LCBleHRfY2ltbXUsIDAsIHt7IDYsIDIwfX0sIFVERUMsCQkvKiBDUE9TNmEgKi8KLSAgICAgICJhIDYtYml0IGJpdCBwb3MgKDAtNjMpIiB9LAotICAgIHsgQUJTLCBpbnNfY2ltbXUsIGV4dF9jaW1tdSwgMCwge3sgNiwgMTR9fSwgVURFQywJCS8qIENQT1M2YiAqLwotICAgICAgImEgNi1iaXQgYml0IHBvcyAoMC02MykiIH0sCi0gICAgeyBBQlMsIGluc19jaW1tdSwgZXh0X2NpbW11LCAwLCB7eyA2LCAzMX19LCBVREVDLAkJLyogQ1BPUzZjICovCi0gICAgICAiYSA2LWJpdCBiaXQgcG9zICgwLTYzKSIgfSwKLSAgICB7IEFCUywgaW5zX2ltbXMsICBleHRfaW1tcywgIDAsIHt7IDEsIDM2fX0sIFNERUMsCQkvKiBJTU0xICovCi0gICAgICAiYSAxLWJpdCBpbnRlZ2VyICgtMSwgMCkiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyAyLCAxM319LCBVREVDLAkJLyogSU1NVTIgKi8KLSAgICAgICJhIDItYml0IHVuc2lnbmVkICgwLTMpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tdSwgIGV4dF9pbW11LCAgMCwge3sgNywgMTN9fSwgMCwJCS8qIElNTVU3YSAqLwotICAgICAgImEgNy1iaXQgdW5zaWduZWQgKDAtMTI3KSIgfSwKLSAgICB7IEFCUywgaW5zX2ltbXUsICBleHRfaW1tdSwgIDAsIHt7IDcsIDIwfX0sIDAsCQkvKiBJTU1VN2IgKi8KLSAgICAgICJhIDctYml0IHVuc2lnbmVkICgwLTEyNykiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyA3LCAxM319LCBVREVDLAkJLyogU09GICovCi0gICAgICAiYSBmcmFtZSBzaXplIChyZWdpc3RlciBjb3VudCkiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyA3LCAyMH19LCBVREVDLAkJLyogU09MICovCi0gICAgICAiYSBsb2NhbCByZWdpc3RlciBjb3VudCIgfSwKLSAgICB7IEFCUywgaW5zX2ltbXVzOCxleHRfaW1tdXM4LDAsIHt7IDQsIDI3fX0sIFVERUMsCQkvKiBTT1IgKi8KLSAgICAgICJhIHJvdGF0aW5nIHJlZ2lzdGVyIGNvdW50IChpbnRlZ2VyIG11bHRpcGxlIG9mIDgpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tcywgIGV4dF9pbW1zLCAgMCwJCQkJLyogSU1NOCAqLwotICAgICAge3sgNywgMTN9LCB7IDEsIDM2fX0sIFNERUMsCi0gICAgICAiYW4gOC1iaXQgaW50ZWdlciAoLTEyOC0xMjcpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tc3U0LCAgZXh0X2ltbXMsICAwLAkJCQkvKiBJTU04VTQgKi8KLSAgICAgIHt7IDcsIDEzfSwgeyAxLCAzNn19LCBTREVDLAotICAgICAgImFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyIGZvciAzMi1iaXQgdW5zaWduZWQgY29tcGFyZSAoLTEyOC0xMjcpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tc20xLCAgZXh0X2ltbXNtMSwgIDAsCQkJCS8qIElNTThNMSAqLwotICAgICAge3sgNywgMTN9LCB7IDEsIDM2fX0sIFNERUMsCi0gICAgICAiYW4gOC1iaXQgaW50ZWdlciAoLTEyNy0xMjgpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tc20xdTQsICBleHRfaW1tc20xLCAgMCwJCQkvKiBJTU04TTFVNCAqLwotICAgICAge3sgNywgMTN9LCB7IDEsIDM2fX0sIFNERUMsCi0gICAgICAiYW4gOC1iaXQgaW50ZWdlciBmb3IgMzItYml0IHVuc2lnbmVkIGNvbXBhcmUgKC0xMjctKC0xKSwxLTEyOCwweDEwMDAwMDAwMCkiIH0sCi0gICAgeyBBQlMsIGluc19pbW1zbTEsICBleHRfaW1tc20xLCAgMCwJCQkJLyogSU1NOE0xVTggKi8KLSAgICAgIHt7IDcsIDEzfSwgeyAxLCAzNn19LCBTREVDLAotICAgICAgImFuIDgtYml0IGludGVnZXIgZm9yIDY0LWJpdCB1bnNpZ25lZCBjb21wYXJlICgtMTI3LSgtMSksMS0xMjgsMHgxMDAwMDAwMDAwMDAwMDAwMCkiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyAyLCAzM30sIHsgNywgMjB9fSwgMCwJLyogSU1NVTkgKi8KLSAgICAgICJhIDktYml0IHVuc2lnbmVkICgwLTUxMSkiIH0sCi0gICAgeyBBQlMsIGluc19pbW1zLCAgZXh0X2ltbXMsICAwLAkJCQkvKiBJTU05YSAqLwotICAgICAge3sgNywgIDZ9LCB7IDEsIDI3fSwgeyAxLCAzNn19LCBTREVDLAotICAgICAgImEgOS1iaXQgaW50ZWdlciAoLTI1Ni0yNTUpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tcywgIGV4dF9pbW1zLCAwLAkJCQkvKiBJTU05YiAqLwotICAgICAge3sgNywgMTN9LCB7IDEsIDI3fSwgeyAxLCAzNn19LCBTREVDLAotICAgICAgImEgOS1iaXQgaW50ZWdlciAoLTI1Ni0yNTUpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tcywgIGV4dF9pbW1zLCAwLAkJCQkvKiBJTU0xNCAqLwotICAgICAge3sgNywgMTN9LCB7IDYsIDI3fSwgeyAxLCAzNn19LCBTREVDLAotICAgICAgImEgMTQtYml0IGludGVnZXIgKC04MTkyLTgxOTEpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tczEsIGV4dF9pbW1zMSwgMCwJCQkJLyogSU1NMTcgKi8KLSAgICAgIHt7IDcsICA2fSwgeyA4LCAyNH0sIHsgMSwgMzZ9fSwgMCwKLSAgICAgICJhIDE3LWJpdCBpbnRlZ2VyICgtNjU1MzYtNjU1MzUpIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tdSwgIGV4dF9pbW11LCAgMCwge3syMCwgIDZ9LCB7IDEsIDM2fX0sIDAsCS8qIElNTVUyMSAqLwotICAgICAgImEgMjEtYml0IHVuc2lnbmVkIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tcywgIGV4dF9pbW1zLCAgMCwJCQkJLyogSU1NMjIgKi8KLSAgICAgIHt7IDcsIDEzfSwgeyA5LCAyN30sIHsgNSwgMjJ9LCB7IDEsIDM2fX0sIFNERUMsCi0gICAgICAiYSAyMi1iaXQgaW50ZWdlciIgfSwKLSAgICB7IEFCUywgaW5zX2ltbXUsICBleHRfaW1tdSwgIDAsCQkJCS8qIElNTVUyNCAqLwotICAgICAge3syMSwgIDZ9LCB7IDIsIDMxfSwgeyAxLCAzNn19LCAwLAotICAgICAgImEgMjQtYml0IHVuc2lnbmVkIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tczE2LGV4dF9pbW1zMTYsMCwge3syNywgIDZ9LCB7IDEsIDM2fX0sIDAsCS8qIElNTTQ0ICovCi0gICAgICAiYSA0NC1iaXQgdW5zaWduZWQgKGxlYXN0IDE2IGJpdHMgaWdub3JlZC96ZXJvZXMpIiB9LAotICAgIHsgQUJTLCBpbnNfcnN2ZCwgIGV4dF9yc3ZkLAkwLCB7ezAsICAwfX0sIDAsCQkvKiBJTU1VNjIgKi8KLSAgICAgICJhIDYyLWJpdCB1bnNpZ25lZCIgfSwgICAgICAgIAotICAgIHsgQUJTLCBpbnNfcnN2ZCwgIGV4dF9yc3ZkLAkwLCB7ezAsICAwfX0sIDAsCQkvKiBJTU1VNjQgKi8KLSAgICAgICJhIDY0LWJpdCB1bnNpZ25lZCIgfSwKLSAgICB7IEFCUywgaW5zX2luYzMsICBleHRfaW5jMywgIDAsIHt7IDMsIDEzfX0sIFNERUMsCQkvKiBJTkMzICovCi0gICAgICAiYW4gaW5jcmVtZW50ICgrLy0gMSwgNCwgOCwgb3IgMTYpIiB9LAotICAgIHsgQUJTLCBpbnNfY250LCAgIGV4dF9jbnQsICAgMCwge3sgNCwgMjd9fSwgVURFQywJCS8qIExFTjQgKi8KLSAgICAgICJhIDQtYml0IGxlbmd0aCAoMS0xNikiIH0sCi0gICAgeyBBQlMsIGluc19jbnQsICAgZXh0X2NudCwgICAwLCB7eyA2LCAyN319LCBVREVDLAkJLyogTEVONiAqLwotICAgICAgImEgNi1iaXQgbGVuZ3RoICgxLTY0KSIgfSwKLSAgICB7IEFCUywgaW5zX2ltbXUsICBleHRfaW1tdSwgIDAsIHt7IDQsIDIwfX0sCTAsCQkvKiBNQlRZUEU0ICovCi0gICAgICAiYSBtaXggdHlwZSAoQHJldiwgQG1peCwgQHNodWYsIEBhbHQsIG9yIEBicmNzdCkiIH0sCi0gICAgeyBBQlMsIGluc19pbW11LCAgZXh0X2ltbXUsICAwLCB7eyA4LCAyMH19LAkwLAkJLyogTUJUWVBFOCAqLwotICAgICAgImFuIDgtYml0IG1peCB0eXBlIiB9LAotICAgIHsgQUJTLCBpbnNfaW1tdSwgIGV4dF9pbW11LCAgMCwge3sgNiwgMTR9fSwgVURFQywJCS8qIFBPUzYgKi8KLSAgICAgICJhIDYtYml0IGJpdCBwb3MgKDAtNjMpIiB9LAotICAgIHsgUkVMLCBpbnNfaW1tczQsIGV4dF9pbW1zNCwgMCwge3sgNywgIDZ9LCB7IDIsIDMzfX0sIDAsCS8qIFRBRzEzICovCi0gICAgICAiYSBicmFuY2ggdGFnIiB9LAotICAgIHsgUkVMLCBpbnNfaW1tczQsIGV4dF9pbW1zNCwgMCwge3sgOSwgMjR9fSwgMCwJCS8qIFRBRzEzYiAqLwotICAgICAgImEgYnJhbmNoIHRhZyIgfSwKLSAgICB7IFJFTCwgaW5zX2ltbXM0LCBleHRfaW1tczQsIDAsIHt7MjAsICA2fSwgeyAxLCAzNn19LCAwLAkvKiBUR1QyNSAqLwotICAgICAgImEgYnJhbmNoIHRhcmdldCIgfSwKLSAgICB7IFJFTCwgaW5zX2ltbXM0LCBleHRfaW1tczQsIDAsCQkJCS8qIFRHVDI1YiAqLwotICAgICAge3sgNywgIDZ9LCB7MTMsIDIwfSwgeyAxLCAzNn19LCAwLAotICAgICAgImEgYnJhbmNoIHRhcmdldCIgfSwKLSAgICB7IFJFTCwgaW5zX2ltbXM0LCBleHRfaW1tczQsIDAsIHt7MjAsIDEzfSwgeyAxLCAzNn19LCAwLAkvKiBUR1QyNWMgKi8KLSAgICAgICJhIGJyYW5jaCB0YXJnZXQiIH0sICAgICAgICAgCi0gICAgeyBSRUwsIGluc19yc3ZkLCBleHRfcnN2ZCwgMCwge3swLCAwfX0sIDAsICAgICAgICAgICAgICAgICAgLyogVEdUNjQgICovIAotICAgICAgImEgYnJhbmNoIHRhcmdldCIgfSwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaWE2NC5jIGIvYmZkL2NwdS1pYTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjliMWEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pYTY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIGlhNjQgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2lhNjRfYXJjaCA9Ci0gIHsKLSAgICA2NCwJLyogNjQgYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogNjQgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2lhNjQsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAiaWE2NCIsCi0gICAgImlhNjQiLAotICAgIDMsCS8qIGxvZzIgb2Ygc2VjdGlvbiBhbGlnbm1lbnQgKi8KLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKLQotI2luY2x1ZGUgImNwdS1pYTY0LW9wYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMTAyMDAuYyBiL2JmZC9jcHUtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NzguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQotICB7Ci0gICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDIwMCwKLSAgICAyMDAsCi0gICAgIm1uMTAyMDAiLAotICAgICJtbjEwMjAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDI4ZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FtMzNfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMzMCwKLSAgICAiYW0zMyIsCi0gICAgImFtMzMiLAotICAgIDIsCi0gICAgZmFsc2UsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbW4xMDMwMF9hcmNoID0KLSAgewotICAgIDMyLCAvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLCAvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LCAgLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgMzAwLAotICAgICJtbjEwMzAwIiwKLSAgICAibW4xMDMwMCIsCi0gICAgMiwKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZiZmRfYW0zM19hcmNoLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMzJyLmMgYi9iZmQvY3B1LW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1YWQ0MS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTTMyUiBwcm9jZXNzb3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4obnVtYmVyLCBwcmludCwgZGVmYXVsdCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTMyciwgbnVtYmVyLCAibTMyciIsIHByaW50LCA0LCBkZWZhdWx0LCBcCi0gICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIGJmZF9kZWZhdWx0X3NjYW4sIG5leHQgfQotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOIChiZmRfbWFjaF9tMzJyeCwgIm0zMnJ4IiwgZmFsc2UsIE5VTEwpCi19OwotCi0jdW5kZWYgTkVYVAotI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTMycl9hcmNoID0KLSAgTiAoYmZkX21hY2hfbTMyciwgIm0zMnIiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTY4ay5jIGIvYmZkL2NwdS1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDE4MmQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihuYW1lLCBwcmludCxkLG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX202OGssIG5hbWUsICJtNjhrIixwcmludCwyLGQsYmZkX2RlZmF1bHRfY29tcGF0aWJsZSxiZmRfZGVmYXVsdF9zY2FuLCBuZXh0LCB9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsgCi0gIE4oYmZkX21hY2hfbTY4MDAwLCAibTY4azo2ODAwMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfbTY4MDA4LCAibTY4azo2ODAwOCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsyXSksCi0gIE4oYmZkX21hY2hfbTY4MDEwLCAibTY4azo2ODAxMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCi0gIE4oYmZkX21hY2hfbTY4MDIwLCAibTY4azo2ODAyMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfbTY4MDMwLCAibTY4azo2ODAzMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs1XSksCi0gIE4oYmZkX21hY2hfbTY4MDQwLCAibTY4azo2ODA0MCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCi0gIE4oYmZkX21hY2hfY3B1MzIsICAibTY4azpjcHUzMiIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs3XSksCi0gIE4oYmZkX21hY2hfbTY4MDYwLCAibTY4azo2ODA2MCIsIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTY4a19hcmNoID0KLSAgTigwLCAibTY4ayIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTg4ay5jIGIvYmZkL2NwdS1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzE2YzUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIG04OGsgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX204OGssCi0gICAgODgxMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgIm04OGsiLAotICAgICJtODhrOjg4MTAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tY29yZS5jIGIvYmZkL2NwdS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjBiY2RlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIE1vdG9yb2xhJ3MgTUNvcmUgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2ggPQotewotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCSAgCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX21jb3JlLCAJCS8qIEFyY2hpdGVjdHVyZSAqLwotICAwLAkJICAJCS8qIE1hY2hpbmUgbnVtYmVyIC0gMCBmb3Igbm93ICovCi0gICJNQ29yZSIsCSAgCQkvKiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiTUNvcmUiLAkgIAkJLyogUHJpbnRhYmxlIG5hbWUgKi8KLSAgMywJCSAgCQkvKiBTZWN0aW9uIGFsaWduIHBvd2VyICovCi0gIHRydWUsCQkgIAkJLyogSXMgdGhpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgPyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBBcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmdW5jdGlvbiAqLwotICBiZmRfZGVmYXVsdF9zY2FuLAkgICAJLyogU3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJzaW9uICovCi0gIE5VTEwJCQkgICAJLyogTmV4dCBpbiBsaXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1taXBzLmMgYi9iZmQvY3B1LW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzM2I4Yy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbWlwcyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihCSVRTX1dPUkQsIEJJVFNfQUREUiwgTlVNQkVSLCBQUklOVCwgREVGQVVMVCwgTkVYVCkJCVwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiAgYml0cyBpbiBhIHdvcmQgKi8JCQlcCi0gICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCi0gICAgYmZkX2FyY2hfbWlwcywJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJtaXBzIiwJCQkJCQlcCi0gICAgUFJJTlQsCQkJCQkJXAotICAgIDMsCQkJCQkJCVwKLSAgICBERUZBVUxULAkJCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJCQlcCi0gICAgTkVYVCwJCQkJCQlcCi0gIH0KLQotZW51bSB7Ci1JX21pcHMzMDAwLCAKLUlfbWlwczM5MDAsIAotSV9taXBzNDAwMCwgCi1JX21pcHM0MDEwLCAKLUlfbWlwczQxMDAsIAotSV9taXBzNDExMSwKLUlfbWlwczQzMDAsIAotSV9taXBzNDQwMCwgCi1JX21pcHM0NjAwLCAKLUlfbWlwczQ2NTAsIAotSV9taXBzNTAwMCwgCi1JX21pcHM2MDAwLCAKLUlfbWlwczgwMDAsIAotSV9taXBzMTAwMDAsCi1JX21pcHMxNgotfTsKLQotCi0jZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbKGluZGV4KSsxXSkKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzAwMCwgIm1pcHM6MzAwMCIsIGZhbHNlLCBOTihJX21pcHMzMDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczM5MDAsICJtaXBzOjM5MDAiLCBmYWxzZSwgTk4oSV9taXBzMzkwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDAwLCAibWlwczo0MDAwIiwgZmFsc2UsIE5OKElfbWlwczQwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDAxMCwgIm1pcHM6NDAxMCIsIGZhbHNlLCBOTihJX21pcHM0MDEwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMDAsICJtaXBzOjQxMDAiLCBmYWxzZSwgTk4oSV9taXBzNDEwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MTExLCAibWlwczo0MTExIiwgZmFsc2UsIE5OKElfbWlwczQxMTEpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDMwMCwgIm1pcHM6NDMwMCIsIGZhbHNlLCBOTihJX21pcHM0MzAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ0MDAsICJtaXBzOjQ0MDAiLCBmYWxzZSwgTk4oSV9taXBzNDQwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjAwLCAibWlwczo0NjAwIiwgZmFsc2UsIE5OKElfbWlwczQ2MDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDY1MCwgIm1pcHM6NDY1MCIsIGZhbHNlLCBOTihJX21pcHM0NjUwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczUwMDAsICJtaXBzOjUwMDAiLCBmYWxzZSwgTk4oSV9taXBzNTAwMCkpLAotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHM2MDAwLCAibWlwczo2MDAwIiwgZmFsc2UsIE5OKElfbWlwczYwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzODAwMCwgIm1pcHM6ODAwMCIsIGZhbHNlLCBOTihJX21pcHM4MDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczEwMDAwLCAibWlwczoxMDAwMCIsIGZhbHNlLCBOTihJX21pcHMxMDAwMCkpLAotCi0KLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTYsICAgIm1pcHM6MTYiLCAgIGZhbHNlLCAwKSwKLX07Ci0KLS8qIFRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyBtaXBzOjMwMDAsIGJ1dCB3aXRoIGEgbWFjaGluZSBudW1iZXIgb2YKLSAgIHplcm8uICBUaGlzIGxldHMgdGhlIGxpbmtlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZGVmYXVsdCBzZXR0aW5nCi0gICBvZiBtaXBzLCBhbmQgYW4gZXhwbGljaXQgc2V0dGluZyBvZiBtaXBzOjMwMDAuICAqLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaCA9Ci1OICgzMiwgMzIsIDAsICJtaXBzIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1uczMyay5jIGIvYmZkL2NwdS1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRlMjViLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIG5zMzJrIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDk0LCA5NSwgOTYsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQWxtb3N0IHRvdGFsbHkgcmV3cml0dGVuIGJ5IElhbiBEYWxsIGZyb20gaW5pdGlhbCB3b3JrCi0gICBieSBBbmRyZXcgQ2FnbmV5LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJuczMyay5oIgotCi0jZGVmaW5lIE4obWFjaGluZSwgcHJpbnRhYmxlLCBkLCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9uczMyaywgbWFjaGluZSwgIm5zMzJrIixwcmludGFibGUsMyxkLGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCwgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKDMyNTMyLCJuczMyazozMjUzMiIsdHJ1ZSwgMCksIC8qIHRoZSB3b3JkIG5zMzJrIHdpbGwgbWF0Y2ggdGhpcyB0b28gKi8KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaCA9Ci0gIE4oMzIwMzIsIm5zMzJrOjMyMDMyIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwotCi1zdGF0aWMgbG9uZwotbnMzMmtfc2lnbl9leHRlbmQodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKLSAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQotCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCi0JICA6IHZhbHVlKTsKLX0KLQotbG9uZwotX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQgKCpidWZmZXIsIDcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4N2Y7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodmFsdWUgPCAtODE5MiB8fCB2YWx1ZSA+IDgxOTEpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4M2ZmZjsKLSAgICAgIHZhbHVlfD0weDgwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmICh2YWx1ZSA8IC0weDFmMDAwMDAwIHx8IHZhbHVlID49IDB4MjAwMDAwMDApCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWV8PTB4YzAwMDAwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4yNCk7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4xNik7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSAoYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGxvbmcgdmFsdWUgPSAwOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMzoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSAodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0ICsgc2l6ZSAtIDE7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMzoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAxOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBwZXJmb3JtX3JlbG9jYXRpb24gZXhjZXB0IHdlCi0gKiB1c2UgZ2V0X2RhdGEgYW5kIHB1dF9kYXRhIHdoaWNoIGtub3cgYWJvdXQgdGhlIG5zMzJrCi0gKiBzdG9yYWdlIG1ldGhvZHMuCi0gKiBUaGlzIGlzIHByb2JhYmx5IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBuZWVkcyB0byBiZSEKLSAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UsIGdldF9kYXRhLCBwdXRfZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgbG9uZyAoKmdldF9kYXRhKSgpOwotICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKLXsKLSAgaW50IG92ZXJmbG93ID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwKQotCSAgICB7Ci0jaWYgMQotCSAgICAgIC8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0JCSByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLQkJIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGNoZWNrOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGlvbiwgYnV0Ci0JIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiB6ZXJvLiAgKi8KLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MpCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpOwotICAgICAgZWxzZQotCWNoZWNrID0gcmVsb2NhdGlvbiA8PCAoaG93dG8tPmJpdHBvcyAtIGhvd3RvLT5yaWdodHNoaWZ0KTsKLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQotCSAgICAvKiBUaGUgYWJvdmUgcmlnaHQgc2hpZnQgaXMgaW5jb3JyZWN0IGZvciBhIHNpZ25lZCB2YWx1ZS4KLQkgICAgICAgRml4IGl0IHVwIGJ5IGZvcmNpbmcgb24gdGhlIHVwcGVyIGJpdHMuICAqLwotCSAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSYmIChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IDApCi0JICAgICAgY2hlY2sgfD0gKChiZmRfdm1hKSAtIDEKLQkJCSYgfigoYmZkX3ZtYSkgLSAxCi0JCQkgICAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCXx8IChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKGJmZF92bWEpIGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKCgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkgICAgICB7Ci0JCS8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkCi0JCSAgIHZhbHVlLiAgU2VlIGlmIHR1cm5pbmcgb24gdGhlIHVwcGVyIGJpdHMgZml4ZXMgdGhlCi0JCSAgIG92ZXJmbG93LiAgKi8KLQkJaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcwotCQkgICAgJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkJICB7Ci0JCSAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJICAgICAgJiB+KChiZmRfdm1hKSAtIDEKLQkJCQkgID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpKSk7Ci0JCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpCi0JCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JCSAgfQotCQllbHNlCi0JCSAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCAxKTsKLQlET0lUICh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAocmVsb2NhdGlvbikKLQl7Ci0JICBzaG9ydCB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDIpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEsIGFkZHIsIDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGxvbmcgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA0KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA0KTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgIHggPSBnZXRfZGF0YShkYXRhLCBhZGRyLCA0KTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEgLCBhZGRyLCA0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGJmZF92bWEgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA4KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA4KTsKLQl9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLSAgaWYgKChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkgJiYgb3ZlcmZsb3cpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyogUmVsb2NhdGUgYSBnaXZlbiBsb2NhdGlvbiB1c2luZyBhIGdpdmVuIHZhbHVlIGFuZCBob3d0by4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoIGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uLAotCQkJICAgICAgZ2V0X2RhdGEsIHB1dF9kYXRhKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICB4ID0gZ2V0X2RhdGEgKGxvY2F0aW9uLCAwLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICAgIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJICAgIHwgKChiZmRfdm1hKSAtIDEKLQkJCSAgICAgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgYWRkID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSB3aXRoIGFuIGFwcHJvcHJpYXRlIHNpZ24uCi0JIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JIGFkZGluZywgaXQgaXMgbmVnYXRpdmUsIGFuZCB3ZSBzdWJ0cmFjdCBvdXQgdGhhdCBudW1iZXIgdGltZXMKLQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCSBzaWduZWRfYWRkIG5lZWRzIG5vIGFkanVzdG1lbnQgdG8gYmVjb21lIG5lZ2F0aXZlIGluIHRoYXQKLQkgY2FzZS4gICovCi0gICAgICBzaWduZWRfYWRkID0gYWRkOwotICAgICAgaWYgKChhZGQgJiAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykpICE9IDApCi0Jc2lnbmVkX2FkZCAtPSAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykgPDwgMTsKLQotICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChob3d0by0+Yml0cG9zID09IDApCi0JewotCSAgY2hlY2sgKz0gYWRkOwotCSAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCi0JICAvKiBGb3IgdGhlIHNpZ25lZCBjYXNlIHdlIHVzZSBBREQsIHJhdGhlciB0aGFuIFNJR05FRF9BREQsCi0JICAgICB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuICBUaGlzIGlzIE9LIHNpbmNlIHdlCi0JICAgICBleHBsaWN0bHkgaGFuZGxlIHRoZSBzaWduIGJpdHMuICAqLwotCSAgaWYgKHNpZ25lZF9hZGQgPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgKz0gKChhZGQgPj4gaG93dG8tPmJpdHBvcykKLQkJCSAgICAgfCAoKGJmZF92bWEpIC0gMQotCQkJCSYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5iaXRwb3MpKSk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0KLQkgICAgaWYgKHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcwotCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KLQkgICAgICAgYmZkX3ZtYS4gICovCi0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKChiZmRfdm1hKSBzaWduZWRfY2hlY2sgJiB+cmVsb2NfYml0cykKLQkJICAgICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogUHV0IFJFTE9DQVRJT04gaW4gdGhlIHJpZ2h0IGJpdHMuICAqLwotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSByaWdodCBiaXRzIG9mIFguICAqLwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykKLSAgICAgICB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLQotICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgODoKLSNlbmRpZgotICAgICAgcHV0X2RhdGEoeCwgbG9jYXRpb24sIDAsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jX2Rpc3AgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGRvX25zMzJrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsCi0JCQkgX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50LAotCQkJIF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19yZWxvY19pbW0gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlLAotCQkJIF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQlhZGRyZXNzLCB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bwotICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKLSAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLwotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0KLSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KLSAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKLSAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKLSAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCi0gICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKLSAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKLSAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBqLmMgYi9iZmQvY3B1LXBqLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGRkMzMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1wai5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIFBpY28gSmF2YSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLiBzYWNAcG9ib3guY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcGosCi0gICAgMCwKLSAgICAicGoiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAicGoiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICAwLAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wal9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9waiwKLSAgMCwKLSAgInBqIiwJCQkJLyogYXJjaF9uYW1lICAqLwotICAicGoiLAkJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgJmFyY2hfaW5mb19zdHJ1Y3QgWzBdCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1wb3dlcnBjLmMgYi9iZmQvY3B1LXBvd2VycGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjOGY1OS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXBvd2VycGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKiBCRkQgUG93ZXJQQyBDUFUgZGVmaW5pdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgY29tbW9uIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUlMvNjAwMC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnBvd2VycGNfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1wb3dlcnBjX2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcG93ZXJwYyk7Ci0gIHN3aXRjaCAoYi0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIGlmIChhLT5tYWNoID09IDApCi0JcmV0dXJuIGE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDMsIC8qIGZvciB0aGUgbXBjNjAzICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMyIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNjA0LCAvKiBmb3IgdGhlIG1wYzYwNCAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo2MDQiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsyXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDQwMywgLyogZm9yIHRoZSA0MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NDAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDEsIC8qIGZvciB0aGUgbXBjNjAxICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMSIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzRdCi0gIH0sCi0gIHsgCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIDY0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYyMCwgLyogZm9yIHRoZSBtcGM2MjAgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjIwIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMAotICB9Ci19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgMCwgLyogZm9yIHRoZSBQT1dFUi9Qb3dlclBDIGNvbW1vbiBhcmNoaXRlY3R1cmUgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6Y29tbW9uIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzBdCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXJzNjAwMC5jIGIvYmZkL2NwdS1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MmFlOS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXJzNjAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciByczYwMDAgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBSUy82MDAwIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFBvd2VyUEMgY29tbW9uCi0gICBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpyczYwMDBfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1yczYwMDBfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9yczYwMDApOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYi0+bWFjaCA9PSAwKQotCXJldHVybiBiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcnM2MDAwLAotICAgIDYwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInJzNjAwMCIsCi0gICAgInJzNjAwMDo2MDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICByczYwMDBfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNoLmMgYi9iZmQvY3B1LXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTRlN2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpLVNIIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgU0hfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFswXQotI2RlZmluZSBTSDJfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsxXQotI2RlZmluZSBTSF9EU1BfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsyXQotI2RlZmluZSBTSDNfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFszXQotI2RlZmluZSBTSDNfRFNQX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbNF0KLSNkZWZpbmUgU0gzRV9ORVhUICZhcmNoX2luZm9fc3RydWN0WzVdCi0jZGVmaW5lIFNINF9ORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gyLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDIiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICBTSDJfTkVYVAotICB9LAotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaF9kc3AsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoLWRzcCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIX0RTUF9ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoMywKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzX05FWFQKLSAgfSwKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gzX2RzcCwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzLWRzcCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM19EU1BfTkVYVAotICB9LAotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaDNlLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDNlIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzRV9ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoNCwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2g0IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0g0X05FWFQKLSAgfSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfc2gsCi0gIGJmZF9tYWNoX3NoLAotICAic2giLAkJCQkvKiBhcmNoX25hbWUgICovCi0gICJzaCIsCQkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICBTSF9ORVhUCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zcGFyYy5jIGIvYmZkL2NwdS1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiZDkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIERvbid0IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBmaWxlcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnNwYXJjX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotc3BhcmNfY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5iaXRzX3Blcl93b3JkICE9IGItPmJpdHNfcGVyX3dvcmQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xldCIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGl0ZSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1cyIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzNdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OHBsdXNhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNF0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlX2xlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNV0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzZdLAotICB9LAotICB7Ci0gICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjlhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5YSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH0KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyYywKLSAgICAic3BhcmMiLAotICAgICJzcGFyYyIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0sCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzMwLmMgYi9iZmQvY3B1LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzIzZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF90aWMzMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInRpYzMwIiwKLSAgInRtczMyMGMzMCIsCi0gIDIsCi0gIHRydWUsCQkJCS8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzU0eC5jIGIvYmZkL2NwdS10aWM1NHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1ZTJjMy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXRpYzU0eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDNTRYIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTk5LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM1NHhfYXJjaCA9Ci17Ci0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzIChleGNlcHQgJzU0OCkgKi8KLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3RpYzU0eCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInRpYzU0eCIsCi0gICJ0bXMzMjBjNTR4IiwKLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIG9uZSBhbmQgb25seSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBiZmRfZGVmYXVsdF9zY2FuLCAgICAgICAgICAgICAKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzgwLmMgYi9iZmQvY3B1LXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjg2NmUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIHN1cHBvcnQgKGZuZkBjeWdudXMuY29tKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM4MF9hcmNoID0KLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfdGljODAsCQkvKiBiZmRfYXJjaGl0ZWN0dXJlIGVudW0gKi8KLSAgICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ0aWM4MCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgICAidGljODAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMiwJCQkJLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8KLSAgICB0cnVlLAkJCS8qIGRlZmF1bHQgbWFjaGluZSBmb3IgYXJjaGl0ZWN0dXJlICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICBOVUxMLAkJCQkvKiBQb2ludGVyIHRvIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdjg1MC5jIGIvYmZkL2NwdS12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTQxM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBORUMgVjg1MCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyBib29sZWFuIAotc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnB0cl9zcmM7Ci0gIGNvbnN0IGNoYXIgKnB0cl90c3Q7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBGaXJzdCB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCi0gICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSBtNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKiBwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1iZXIpIAotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX3Y4NTAsIG51bWJlciwgInY4NTAiLCBwcmludCwgMiwgZGVmYXVsdCwgXAotICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotI2RlZmluZSBORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoYmZkX21hY2hfdjg1MGUsICAidjg1MGUiLCAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTiAoYmZkX21hY2hfdjg1MGVhLCAidjg1MGVhIiwgZmFsc2UsIE5VTEwpCi19OwotCi0jdW5kZWYgTkVYVAotI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoID0KLSAgTiAoYmZkX21hY2hfdjg1MCwgInY4NTAiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdmF4LmMgYi9iZmQvY3B1LXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM2ZDM5Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIHZheCBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdmF4X2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF92YXgsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAidmF4IiwKLSAgICAidmF4IiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS13NjUuYyBiL2JmZC9jcHUtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjY4YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBXREMgNjU4MTYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1YmxpdzY1ZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3UgdzY1b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGFib3J0ICgpOwotICBIT1dUT19QUkVQQVJFIChyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzggKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYWJvcnQgKCk7Ci0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci09IE5FV0hPV1RPIChob3d0bzE2X2NhbGxiYWNrLCAiYWJzMTYiLCAxLCBmYWxzZSwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotPSBORVdIT1dUTyAoaG93dG84X2NhbGxiYWNrLCAiYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotPSBORVdIT1dUTyAoaG93dG84X0ZGbm5fY2FsbGJhY2ssICJmZjAwK2FiczgiLCAwLCBmYWxzZSwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi09IE5FV0hPV1RPIChob3d0bzhfcGNyZWxfY2FsbGJhY2ssICJwY3JlbDgiLCAwLCBmYWxzZSwgdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJmhvd3RvXzE2OwotICAgIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKLSAgICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICByZXR1cm4gJmhvd3RvXzg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAxIikgPT0gMCB8fCBzdHJjbXAgKHN0cmluZywgIno4ayIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAxID09IGluZm8tPm1hY2g7Ci0gICAgfQotICBpZiAoc3RyY21wIChzdHJpbmcsICJ6ODAwMiIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAyID09IGluZm8tPm1hY2g7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHszMiwgMzIsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDEsICJ6OGsiLCAiejgwMDEiLCAxLCBmYWxzZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAwLH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoID0KLXsKLSAgMzIsIDE2LCA4LCBiZmRfYXJjaF96OGssIGJmZF9tYWNoX3o4MDAyLCAiejhrIiwgIno4MDAyIiwgMSwgdHJ1ZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLX07CmRpZmYgLS1naXQgYS9iZmQvZGVtbzY0LmMgYi9iZmQvZGVtbzY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTM4MWQuLjAwMDAwMDAKLS0tIGEvYmZkL2RlbW82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGRlbW9uc3RyYXRpb24gNjQtYml0IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNkZWZpbmUgTVkoT1ApIENBVChkZW1vXzY0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAgImRlbW82NCIKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9kZXAtaW4uc2VkIGIvYmZkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzgxZjIuLjAwMDAwMDAKLS0tIGEvYmZkL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvLi4vb3Bjb2RlcyEkKHNyY2RpcikvLi4vb3Bjb2RlcyFnCi1zIUBTUkNESVJALyEhZwotcyEgaG9zdHMvW14gXSpcLmghICFnCi1zLyBzeXNkZXAuaC8vZwotcyEgXC5cLi9iZmQvc3lzZGVwLmghIWcKLXMvIGxpYmJmZC5oLy9nCi1zLyBjb25maWcuaC8vZwotcyEgXCQoSU5DRElSKS9mb3Blbi1bXiBdKlwuaCEhZwotcyEgXCQoSU5DRElSKS9hbnNpZGVjbFwuaCEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi1zLyAqOi86L2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9iZmQvZG9jL0NoYW5nZUxvZyBiL2JmZC9kb2MvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM3MjY1Li4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLVdlZCBNYXkgMjQgMTI6MDM6MjUgMjAwMCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5jb20+Ci0KLQkqIGJmZGludC50ZXhpIChCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZCk6IEFkZCBwYXJhZ3JhcGggYWJvdXQKLQl0YXJnZXQgbmVjZXNzaXRpZXMgZm9yIHJlYWRlbGYuCi0KLTIwMDAtMDQtMzAgIEJlbiBFbGxpc3RvbiAgPGJqZUByZWRoYXQuY29tPgotCi0JKiBiZmRpbnQudGV4aSAoQkZEIGdlbmVyYXRlZCBmaWxlcyk6IEZpeCBhbm90aGVyIHR5cG8uCi0KLTIwMDAtMDQtMTcgIEJlbiBFbGxpc3RvbiAgPGJqZUByZWRoYXQuY29tPgotCi0JKiBiZmRpbnQudGV4aSAoQkZEX0pVTVBfVEFCTEUgbWFjcm9zKTogRml4IHR5cG8uCi0KLUZyaSBBcHIgIDcgMTc6NTQ6MzggMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0KLVRodSBGZWIgIDQgMjM6MjE6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0KLVRodSBKdWwgMjMgMDk6MzY6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkaW50LnRleGkgKEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkKTogQWRkIHBhcmFncmFwaAotCWRlc2NyaWJpbmcgdGhlIG5lY2Vzc2l0eSB0byBjcmVhdGUgImluY2x1ZGUvZWxmL0NQVS5oIi4KLQotVGh1IE1heSAgNyAxNDo0NTo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGV3Lm8pOiBBZGQgLUkgb3B0aW9ucyBmb3IgaW50bCBzcmNkaXIgYW5kCi0Jb2JqZGlyLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgMjcgMjA6MTk6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRpbnQudGV4aTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X1RFWElORk9TKTogTmV3IHZhcmlhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTMgMTY6NDg6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAgNiAxNDowNjo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgotCShDTEVBTkZJTEVTKTogRG9uJ3QgcmVtb3ZlICQoU1RBR0VTVFVGRikuCi0JKERJU1RDTEVBTkZJTEVTLCBNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjoyNToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNoZXcuYyAoc2tpcF93aGl0ZV9hbmRfc3RhcnRzKTogUmVtb3ZlIHVudXNlZCBkZWNsYXJhdGlvbi4KLQkoc2tpcF93aGl0ZV9hbmRfc3RhcnMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKHNraXBfdHJhaWxpbmdfbmV3bGluZXMsIHBhcmFtc3R1ZmYsIGNvdXJpZXJpemUpOiBMaWtld2lzZS4KLQkoYnVsbGV0aXplLCBkb19mYW5jeV9zdHVmZiwgaXNjb21tYW5kKTogTGlrZXdpc2UuCi0JKGtpbGxfYm9ndXNfbGluZXMsIG5leHR3b3JkLCBtYWluKTogTGlrZXdpc2UuCi0JKG1hbmdsZWNvbW1lbnRzKTogQ29tbWVudCBvdXQuCi0JKG91dHB1dGRvdHMsIGtpbGxfYm9ndXNfbGluZXMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkocGVyZm9ybSwgY29tcGlsZSk6IExpa2V3aXNlLgotCShjb3VyaWVyaXplKTogRnVsbHkgcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCi0JKGNvcHlfcGFzdF9uZXdsaW5lKTogRGVjbGFyZSByZXR1cm4gdmFsdWUuCi0JKHByaW50KTogQ2hhbmdlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgotCShtYWluKTogQ2FsbCB1c2FnZSBmb3IgYW4gdW5yZWNvZ25pemVkIG9wdGlvbi4KLQotRnJpIEZlYiAxMyAxNDozNzoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBKYW4gMjYgMTU6Mzg6MzYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGRvYy5zdHIgKGJvZHl0ZXh0KTogRG9uJ3Qgb3V0cHV0IEAqIGF0IHRoZSBlbmQuCi0JKiBjaGV3LmMgKGtpbGxfYm9ndXNfbGluZXMpOiBNYWtlIHN1cmUgdGhhdCBhIHBlcmlvZCBhdCB0aGUKLQliZWdpbm5pbmcgaXMgcmVjb2duaXplZC4KLQkoaW5kZW50KTogRG9uJ3QgcHV0IGluZGVudGF0aW9uIGF0IHRoZSBlbmQuCi0JKGNvcHlfcGFzdF9uZXdsaW5lKTogRXhwYW5kIHRhYnMuCi0JKiBNYWtlZmlsZS5hbSAocy1yZWxvYywgcy1zeW1zKTogRGVwZW5kIG9uIGRvYy5zdHIuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIE9jdCAgMSAxNDo0MToyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJiZmQuaCk6IERvbid0IHVzZSBjcHUtaDgzMDAuYywgY3B1LWk5NjAuYywgb3IKLQllbGZjb2RlLmggYXMgaW5wdXQgZmlsZXM7IHRoZXkgZG9uJ3QgY29udHJpYnV0ZSBhbnl0aGluZy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnIDE1IDA0OjU1OjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJiZmQuaCwgbGliY29mZi5oKTogSW52b2tlICQoTUtET0MpIGFzIC4vJChNS0RPQykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgMSAxMjo1OTo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDQ19GT1JfQlVJTEQpOiBEb24ndCBzZXQgZXhwbGljaXRseS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDIwOjAwOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0KLVR1ZSBKdWwgMjIgMTQ6NDQ6MDAgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIHN0YW1wLSogZmlsZXMgdG8gcy0qIGZpbGVzLiAgVXNlIGJmZHQudGV4aQotCXJhdGhlciB0aGFuIGJmZC50ZXhpLgotIAkoRE9DRklMRVMpOiBDaGFuZ2UgYmZkLnRleGkgdG8gYmZkdC50ZXhpLgotCSogYmZkLnRleGluZm86IEluY2x1ZGUgYmZkdC50ZXhpLCBub3QgYmZkLnRleGkuCi0KLU1vbiBKdW4gMTYgMTU6MzM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0MsIENGTEFHUyk6IFN1YnN0aXR1dGUgZnJvbSBjb25maWd1cmUgc2NyaXB0LgotCUZyb20gSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KLQotVHVlIEFwciAxNSAxMjozNzo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBVc2UgbWtpbnN0YWxsZGlycyB0byBidWlsZAotCSQoaW5mb2RpcikuCi0KLVR1ZSBBcHIgIDggMTI6NDk6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogUGVybWl0IGluZm8gZmlsZXMgdG8gYmUgaW4gc3JjZGlyLgotCShzdGFtcC0qKTogQWRkIGEgc3RhbXAtWCB0YXJnZXQgZm9yIGVhY2ggWC50ZXhpIHRhcmdldC4KLQkoKi50ZXhpKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1YLgotCShjbGVhbik6IFJlbW92ZSBzdGFtcC0qLgotCShkaXN0Y2xlYW4pOiBEZXBlbmQgdXBvbiBtb3N0bHljbGVhbi4gIFJlbW92ZSBzdGFtcC0qLiAgRG9uJ3QKLQlyZW1vdmUgJChET0NGSUxFUykuCi0KLU1vbiBBcHIgIDcgMTU6MjM6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlICouaW5mbyBmaWxlcy4KLQotVGh1IEZlYiAxMyAyMDo1MDowMiAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQotVHVlIEp1biAxOCAxODozMjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNoZXcuYyAoa2lsbF9ib2d1c19saW5lcyk6IFJlc2V0IHNsIHdoZW4gbm90IGF0IHRoZSBzdGFydCBvZiBhCi0JbGluZS4gIEZyb20gVXdlIE9oc2UgPHV3ZUB0aXJrYS5ndW4uZGU+LgotCi1UdWUgSmFuIDMwIDE0OjEwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IERlcGVuZCB1cG9uIHByb3RvLnN0ci4KLQkobGliY29mZi5oLCBiZmQuaCk6IExpa2V3aXNlLgotCi1GcmkgTm92ICAzIDE0OjQ2OjQ4IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU1JDRE9DLCBTUkNQUk9ULCBjb3JlLnRleGksIGJmZC5oKTogIFVzZSBjb3JlZmlsZS5jLCAKLQlyZW5hbWVkIGZyb20gY29yZS5jLgotCi1XZWQgTm92ICAxIDE0OjI4OjIzIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjaGV3LmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCi1GcmkgT2N0ICA2IDE2OjIzOjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogT25seSByZW1ha2UgdGhpcyBNYWtlZmlsZS4KLQotV2VkIE9jdCAgNCAxNTo1MTowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotVHVlIFNlcCAxMiAxODoxNDo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotVGh1IEF1ZyAzMSAxMjoxODo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IEFkZCBhZGRpdGlvbmFsICNlbmRpZiBhdCBlbmQgb2YgYmZkLmggaWYKLQlfX2NwbHVzcGx1cyBpcyBkZWZpbmVkLgotCi1UdWUgTm92IDI5IDE2OjEzOjM0IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNoZXcuYyAod3JpdGVfYnVmZmVyKTogTmV3IGFyZ3VtZW50IGBmJywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoc3Rkb3V0LCBzdGRlcnIsIHByaW50LCBkcm9wLCBpZHJvcCk6IE5ldyBmb3J0aCB3b3Jkcy4KLQkqIHByb3RvLnN0ciAoQ09NTUVOVCk6IE5ldyBjb21tYW5kLgotCSogZG9jLnN0ciAoQ09NTUVOVCk6IExpa2V3aXNlLgotCi1Nb24gU2VwIDEyIDExOjQ0OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERPQ0ZJTEVTKTogUmVtb3ZlIGN0b3IudGV4aS4KLQkoSVBST1RPUyk6IFJlbW92ZSBjdG9yLmlwLgotCShTUkNJUFJPVCk6IFJlbW92ZSAkKHNyY2RpcikvLi4vY3Rvci5jLgotCShjdG9yLnRleGkpOiBSZW1vdmUgdGFyZ2V0LgotCShsaWJiZmQuaCk6IFJlbW92ZSBkZXBlbmRlbmN5IG9uICQoc3JjZGlyKS8uLi9jdG9yLmMuICBSZW1vdmUKLQkkKE1LRE9DKSBydW4gb24gJChzcmNkaXIpLy4uL2N0b3IuYy4KLQkqIGJmZC50ZXhpbmZvIChDb25zdHJ1Y3RvcnMpOiBSZW1vdmUgc2VjdGlvbi4KLQotRnJpIFNlcCAgMiAxMzozMzo0NCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IEluY2x1ZGUgYXNzZXJ0LmguICBBZGRlZCBwcm90b3R5cGVzIGZvciBtb3N0IGZ1bmN0aW9ucy4KLQlDaGFuZ2VkIG1vc3QgdXNlcyBvZiBpbnQgdG8gbG9uZy4gIERvIGJvdW5kcyBjaGVja2luZyBvbiB0aGUKLQlzdGFja3MuICBBZGRlZCBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgZG9jdW1lbnRpbmcgbW9zdCBvZiB0aGUKLQlpbnRyaW5zaWNzLiAgTG90cyBvZiB3aGl0ZXNwYWNlIGNoYW5nZXMuICBSZS1vcmRlcmVkIHNvbWUKLQlmdW5jdGlvbnMuCi0JKGRpZSwgY2hlY2tfcmFuZ2UsIGljaGVja19yYW5nZSk6IE5ldyBmdW5jdGlvbnMuCi0JKHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzLCBwcmludF9zdGFja19sZXZlbCk6IE5ldyBmdW5jdGlvbnMuCi0JKHRyYW5zbGF0ZWNvbW1lbnRzKTogRG9uJ3QgaW5zZXJ0IHRhYiBiZWZvcmUgIi8qIi4KLQkoaXNjb21tYW5kKTogTWluaW11bSBjb21tYW5kIGxlbmd0aCBpcyBub3cgNC4KLQkobmV4dHdvcmQpOiBIYW5kbGUgc29tZSBcLXNlcXVlbmNlcy4KLQkocHVzaF9hZGRyKTogRGVsZXRlZC4KLQkobWFpbik6IEFkZCBuZXcgaW50cmluc2ljcyBzdHJpcF90cmFpbGluZ19uZXdsaW5lcyBhbmQKLQlwcmludF9zdGFja19sZXZlbC4gIENvbXBsYWluIGF0IGVuZCBpZiBzdGFjayBjb250YWlucyBtb3JlIHRoYW4KLQlvbmUgZWxlbWVudCwgb3IgbGVzcy4KLQkocmVtY2hhcik6IE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSBiZWZvcmUgY2hvcHBpbmcgb2ZmIGEKLQljaGFyYWN0ZXIuCi0KLQkqIGRvYy5zdHIsIHByb3RvLnN0cjogSGFuZGxlIG5ldyBjb21tYW5kcyBTRU5VTSwgRU5VTSwgRU5VTVgsCi0JRU5VTUVRLCBFTlVNRVFYLCBFTlVNRE9DLgotCi1XZWQgSmFuIDEyIDE4OjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IEFkZGVkIExpbmtlciBGdW5jdGlvbnMgbm9kZS4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBBZGRlZCBsaW5rZXIudGV4aS4KLQkoU1JDRE9DKTogQWRkZWQgbGlua2VyLmMuCi0JKGxpbmtlci50ZXhpKTogTmV3IHRhcmdldC4KLQotVHVlIEphbiAgNCAxMDo1Mjo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogRG9uJ3QgcmVseSBvbiBhIGNvcnJlY3QgZGVjbGFyYXRpb24gb2YgZXhpdC4KLQkoY2hld19leGl0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGp1c3QgY2FsbHMgZXhpdC4KLQkobWFpbik6IFVzZSBpdC4KLQotTW9uIEphbiAgMyAxMTo0MDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBBZGRlZCBIYXNoIFRhYmxlcyBub2RlLgotCSogTWFrZWZpbGUuaW4gKERPQ0ZJTEVTKTogQWRkZWQgaGFzaC50ZXhpLgotCShTUkNET0MpOiBBZGRlZCBoYXNoLmMuCi0JKGhhc2gudGV4aSk6IE5ldyB0YXJnZXQuCi0KLVRodSBEZWMgMzAgMTY6NTc6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byBzZWNsZXQuYywgc2luY2UgaXQncyBqdXN0Ci0JYmVlbiBkZWxldGVkLiAgRG9uJ3QgbWVudGlvbiBoYXNoLmMsIGxpbmtlci5jLCBvciBnZW5saW5rLmggeWV0LAotCXNpbmNlIHRoZXkgZG9uJ3QgY29udGFpbiBkb2N1bWVudGF0aW9uIHlldCAoaGludCwgaGludCEpLgotCi1GcmkgTm92ICA1IDEwOjU4OjUzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IFNtYWxsIGNsZWFudXBzLgotCi1GcmkgTm92IDE5IDAzOjQ2OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFyY2h1cmVzLnRleGkpOiBEZXBlbmRzIG9uICQoTUtET0MpLgotCi1UdWUgQXVnIDEwIDE0OjIyOjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm8gKEJGRCBiYWNrIGVuZCk6IERvbid0IGluY2x1ZGUgZWxmY29kZS50ZXhpLCBzaW5jZQotCWl0J3MgZW1wdHkgbm93IGFuZCB0aGF0IHRyaWdnZXJzIGEgbWFrZWluZm8gYnVnLgotCi1Nb24gQXVnICA5IDE2OjI3OjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm8gKEJGRCBiYWNrIGVuZCk6IE5ldyBzZWN0aW9uIG9uIEVMRiwgaW5jbHVkZXMKLQllbGYudGV4aSBhbmQgZWxmY29kZS50ZXhpLgotCSogTWFrZWZpbGUuaW4gKERPQ0ZJTEVTKTogSW5jbHVkZSBlbGYudGV4aSwgZWxmY29kZS50ZXhpLgotCShTUkNET0MpOiBJbmNsdWRlIGVsZmNvZGUuaCwgZWxmLmMuCi0JKGVsZi50ZXhpLCBlbGZjb2RlLnRleGkpOiBOZXcgaW50ZXJtZWRpYXRlIHRhcmdldHMuCi0KLVRodSBKdW4gMjQgMTM6NDg6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoLmMubywgY2hldy5vKTogUHV0IENGTEFHUyBsYXN0LgotCSogYmZkc3VtbS50ZXhpOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBiZmQudGV4aW5mbywgdG8gc2hhcmUKLQl3aXRoIGxkLnRleGluZm8uCi0KLU1vbiBKdW4gMTQgMTI6MDc6MDcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogcmVtb3ZlIHBhcmVudGRpciBjcnVmdCwgCi0KLVdlZCBKdW4gIDkgMTY6MDA6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjaGV3Lm8uCi0KLVR1ZSBNYXkgMjUgMTQ6NDY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBVc2UgZWxmY29kZS5oLCBub3QgZWxmMzIuYy4KLQotTW9uIE1heSAyNCAxNTo1MDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY2hldy5jIChjb21waWxlKTogQWRkIGEgY291cGxlIG9mIG1pc3NpbmcgY2FzdHMuCi0KLVdlZCBNYXkgMTIgMTQ6NDU6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLCBkZWZpbmUgdG8gYmUgJChDQykuCi0JKGNoZXcubywgJChNS0RPQykpOiBCdWlsZCB1c2luZyBDQ19GT1JfQlVJTEQgcmF0aGVyIHRoYW4gQ0MsIHNpbmNlCi0JaXQgbXVzdCBydW4gb24gdGhlIGJ1aWxkIG1hY2hpbmUuCi0KLVR1ZSBBcHIgIDYgMjI6Mzg6MTAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGV3KTogIERvbid0IGNvbXBpbGUgZnJvbSAuYyB0byBleGVjdXRhYmxlIGluIGEKLQlzaW5nbGUgc3RlcDsgaXQgcHV0cyBhIHRlbXBvcmFyeSAubyBmaWxlbmFtZSBpbnRvIHRoZSBleGVjdXRhYmxlLAotCXdoaWNoIG1ha2VzIG11bHRpLXN0YWdlIGNvbXBhcmlzb25zIGZhaWwuICBDb21waWxlIGNoZXcuYyB0bwotCWNoZXcubywgYW5kIGxpbmsgdGhhdCwgd2hpY2ggbWFrZXMgaWRlbnRpY2FsIGV4ZWN1dGFibGVzIGV2ZXJ5IHRpbWUuCi0KLVdlZCBNYXIgMjQgMTc6MjY6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggdHlwbyAoYmZkLnRleGluZm8gbm90IGJmZC50ZXhpbm8pCi0KLUZyaSBNYXIgMTkgMDE6MTM6MDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBTaW5jZSBCRkQgdmVyc2lvbiBudW1iZXIgaGFzIGJlZW4gYnVtcGVkLCBkbyBzYW1lCi0JdG8gInZlcnNpb24gbnVtYmVyIiBvbiB0aXRsZSBwYWdlLCBhbmQgZWxzZXdoZXJlLiAgU2hvdWxkIGJlCi0JZml4ZWQgdG8gZXh0cmFjdCByZWFsIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgTWFyIDE2IDEyOjE1OjEzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgKmNsZWFuIHJ1bGVzLgotCi1Nb24gSmFuIDExIDE4OjQzOjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogUmVtb3ZlZCBkdXBsaWNhdGUgaW5pdC5jIGFuZCBsaWJiZmQuYy4KLQlBZGRlZCBzZWNsZXQuYy4KLQkoYmZkLmgpOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGJmZC5jIGFuZCBzZWNsZXQuYy4gIEFkZGVkIHNlY2xldC5jCi0JdG8gYnVpbGQuCi0KLVRodSBEZWMgMTcgMTk6MzU6NDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldCwgZGVmaW5lIGFuZCB1c2UgJChURVhJMkRWSSkKLQotVGh1IERlYyAgMyAxNzo0Mjo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChURVhJRElSKTogTmV3IHZhcmlhYmxlLgotCShiZmQuZHZpKTogTG9vayBmb3IgYmZkLnRleGluZm8gaW4gJChzcmNkaXIpLiAgR2VuZXJhdGUgaW5kZXguCi0KLQkqIGJmZC50ZXhpbmZvOiBNaW5vciBkb2MgZml4ZXMuCi0KLVRodSBOb3YgIDUgMDM6MTM6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbnVwOiAgUmVwbGFjZSBhbGwgdXNlcyBvZiBFWEZVTiBpbiB0aGUgQkZEIHNvdXJjZXMsIHdpdGggUEFSQU1TLgotCi0gCSogZG9jL2NoZXcuYyAoZXhmdW5zdHVmZik6ICBFbGltaW5hdGUuCi0JKHBhcmFtc3R1ZmYpOiAgUmVwbGFjZSBleGZ1bnN0dWZmIHdpdGggZnVuY3Rpb24gdG8gZ2VuZXJhdGUgUEFSQU1TLgotCSogZG9jL3Byb3RvLnN0cjogIFVzZSBwYXJhbXN0dWZmIHJhdGhlciB0aGFuIGV4ZnVuc3R1ZmYuCi0KLU1vbiBBdWcgMTcgMTI6NDA6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogdmFyaW91cyBwYXRjaGVzIHByb3ZpZGVkIGJ5IEhvd2FyZCBDaHUuCi0KLUZyaSBKdW4gMTkgMTg6NTk6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6ICBBZGQgZWxmLmMgYXMgYSBzb3VyY2Ugb2YgcHJvdG90eXBlcy4KLQotTW9uIE1heSAxMSAxODo1NTo1OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiAgZXhpdCgpIHNob3VsZCBiZSBkZWNsYXJlZCBieSBjb25maWcgZmlsZXMsIG5vdCBieQotCXBvcnRhYmxlIHNvdXJjZSBjb2RlLiAgSXRzIHR5cGUgY291bGQgYmUgaW50IG9yIHZvaWQgZnVuY3Rpb24uCQotCi1Nb24gTWF5ICA0IDEzOjQ1OjU3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFub3RoZXIgQ0ZMQUdTIGNvcnJlY3Rpb24uCi0KLVR1ZSBBcHIgMjggMTA6MjE6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRG8gdGhlIENGTEFHUyB0aGluZy4KLQotRnJpIEFwciAxMCAyMjozNDo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgQWRkIG1hY3JvIGFuZCBkZWZhdWx0IHRvIC1nLgotCi1GcmkgTWFyICA2IDE4OjUzOjE4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IG5vdyBoYXMgLXcgc3dpdGNoIHR1cm4gb24gd2FybmluZ3MKLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVR1ZSBEZWMgMTAgMjI6MTE6MDUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYnVpbGQgY2hldyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIENvbXBsZXRlCi0JICB0aGUgTUtET0MgbWFjcm8gdHJhbnNpdGlvbi4KLQotVHVlIERlYyAxMCAwODoyNjoyOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBkb24ndCBjb3JlIGR1bXAgd2hlbiBjYW4ndCBvcGVuIGZpbGUKLQkqIE1ha2VmaWxlLmluOiBnZXQgcHJvdG8uc3RyIGZyb20gdGhlIHJpZ2h0IHBsYWNlIHdoZW4gYnVpbHQgaW4KLQlvZGQgZGlyZWN0b3JpZXMKLQotVHVlIERlYyAxMCAwNDowNzoyNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotU2F0IERlYyAgNyAxNzowMToyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBNdWNoIG1vZGlmaWVkCi0JKiBwcm90by5zdHIsIGRvYy5zdHI6IE5ldyBmaWxlcyBmb3IgZXh0cmFjdGluZyB0byBwcm9kdWN0Ci0JcHJvdG90eXBlcyBhbmQgZG9jdW1lbnRzIHJlc3BlY3RpdmVseS4KLQotCi1GcmkgRGVjICA2IDIyOjU3OjEyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQsIGhvc3Qvc2l0ZS90YXJnZXQKLQkgIGluY2x1c2lvbiBob29rcywgaW5zdGFsbCB1c2luZyBJTlNUQUxMX0RBVEEgcmF0aGVyIHRoYW4gY3AsCi0JICBkb24ndCBlY2hvIG9uIGluc3RhbGwuCi0KLVRodSBEZWMgIDUgMjI6NDY6MTcgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmFtIGIvYmZkL2RvYy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1MjY4ZS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1ET0NGSUxFUyA9IGFvdXR4LnRleGkgIGFyY2hpdmUudGV4aSBhcmNodXJlcy50ZXhpIFwKLQliZmR0LnRleGkgIGNhY2hlLnRleGkgY29mZmNvZGUudGV4aSBcCi0JY29yZS50ZXhpIGVsZi50ZXhpIGVsZmNvZGUudGV4aSAgZm9ybWF0LnRleGkgIGxpYmJmZC50ZXhpICBcCi0Jb3BuY2xzLnRleGkgIHJlbG9jLnRleGkgIHNlY3Rpb24udGV4aSAgXAotCXN5bXMudGV4aSAgdGFyZ2V0cy50ZXhpIGluaXQudGV4aSBoYXNoLnRleGkgbGlua2VyLnRleGkKLQotUFJPVE9TID0gYXJjaGl2ZS5wIGFyY2h1cmVzLnAgYmZkLnAgXAotCSBjb3JlLnAgZm9ybWF0LnAgXAotCWxpYmJmZC5wIG9wbmNscy5wIHJlbG9jLnAgXAotCXNlY3Rpb24ucCBzeW1zLnAgdGFyZ2V0cy5wICBcCi0JZm9ybWF0LnAgIGNvcmUucCBpbml0LnAKLQotSVBST1RPUyA9IGNhY2hlLmlwIGxpYmJmZC5pcCByZWxvYy5pcCBpbml0LmlwIGFyY2h1cmVzLmlwIGNvZmZjb2RlLmlwCi0KLSMgU1JDRE9DLCBTUkNQUk9ULCBTUkNJUFJPVCBvbmx5IHVzZWQgdG8gc2lkZXN0ZXAgU3VuIE1ha2UgYnVnIGluIGludGVyYWN0aW9uIAotIyBiZXR3ZWVuIFZQQVRIIGFuZCBzdWZmaXggcnVsZXMuICBJZiB5b3UgdXNlIEdOVSBNYWtlLCBwZXJoYXBzIG90aGVyIE1ha2VzLAotIyB5b3UgZG9uJ3QgbmVlZCB0aGVzZSB0aHJlZToKLVNSQ0RPQyA9ICQoc3JjZGlyKS8uLi9hb3V0eC5oICAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jIFwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvLi4vYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oIFwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvLi4vZWxmLmMgXAotCSQoc3JjZGlyKS8uLi9lbGZjb2RlLmggICQoc3JjZGlyKS8uLi9mb3JtYXQuYyBcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS8uLi9vcG5jbHMuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMgICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgXAotCSQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpLy4uL2xpbmtlci5jCi0KLVNSQ1BST1QgPSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvLi4vcmVsb2MuYyBcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvLi4vc3ltcy5jIFwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS8uLi9pbml0LmMKLQotU1JDSVBST1QgPSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS8uLi9jcHUtaDgzMDAuYyBcCi0JJChzcmNkaXIpLy4uL2NwdS1pOTYwLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9pbml0LmMKLQotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi8uLi90ZXhpbmZvL2ZzZgotCi1pbmZvX1RFWElORk9TID0gYmZkLnRleGluZm8KLQotTUtET0MgPSBjaGV3JChFWEVFWFRfRk9SX0JVSUxEKQotCi0kKE1LRE9DKTogY2hldy5vCi0JJChDQ19GT1JfQlVJTEQpIC1vICQoTUtET0MpIGNoZXcubyAkKExPQURMSUJFUykgJChMREZMQUdTKQotCi1jaGV3Lm86IGNoZXcuYwotCSQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4uIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vLi4vaW50bCAtSS4uLy4uL2ludGwgJChIX0NGTEFHUykgJChDRkxBR1MpICQoc3JjZGlyKS9jaGV3LmMKLQotcHJvdG9zOiBsaWJiZmQuaCBsaWJjb2ZmLmggYmZkLmgKLQotYmZkLmluZm8gYmZkLmR2aTogJChET0NGSUxFUykgYmZkc3VtbS50ZXhpIGJmZC50ZXhpbmZvCi0KLSMgV2UgY2FuJ3QgcmVwbGFjZSB0aGVzZSBydWxlcyB3aXRoIGFuIGltcGxpY2l0IHJ1bGUsIGJlY2F1c2UKLSMgbWFrZXMgd2l0aG91dCBWUEFUSCBzdXBwb3J0IGNvdWxkbid0IGZpbmQgdGhlIC5oIGZpbGVzIGluIGAuLicuCi0KLSMgV2UgdXNlIHMtWFhYIHRhcmdldHMgc28gdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZSB0aGUgaW5mbyBmaWxlcywKLSMgYW5kIHBlcm1pdCBwZW9wbGUgdG8gcmVidWlsZCB0aGVtLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWFrZWluZm8KLSMgcHJvZ3JhbS4gIElmIHNvbWVib2R5IHRyaWVzIHRvIHJlYnVpbGQgaW5mbywgYnV0IG5vbmUgb2YgdGhlIC50ZXhpCi0jIGZpbGVzIGhhdmUgY2hhbmdlZCwgdGhlbiB0aGlzIE1ha2VmaWxlIHdpbGwgYnVpbGQgY2hldywgYW5kIHdpbGwKLSMgYnVpbGQgYWxsIG9mIHRoZSBzdGFtcCBmaWxlcywgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGhhdmUgdG8gcmVidWlsZAotIyBiZmQuaW5mby4KLQotcy1hb3V0eDogJChNS0RPQykgJChzcmNkaXIpLy4uL2FvdXR4LmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYW91dHguaCA+YW91dHgudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFvdXR4LnRtcCBhb3V0eC50ZXhpCi0JdG91Y2ggcy1hb3V0eAotYW91dHgudGV4aTogcy1hb3V0eAotCi1zLWFyY2hpdmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID5hcmNoaXZlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNoaXZlLnRtcCBhcmNoaXZlLnRleGkKLQl0b3VjaCBzLWFyY2hpdmUKLWFyY2hpdmUudGV4aTogcy1hcmNoaXZlCi0KLXMtYXJjaHVyZXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID5hcmNodXJlcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaHVyZXMudG1wIGFyY2h1cmVzLnRleGkKLQl0b3VjaCBzLWFyY2h1cmVzCi1hcmNodXJlcy50ZXhpOiBzLWFyY2h1cmVzCi0KLSMgV2UgdXNlIGJmZHQudGV4aSwgcmF0aGVyIHRoYW4gYmZkLnRleGksIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKLSMgYmZkLnRleGluZm8gb24gYW4gOC4zIGZpbGVzeXN0ZW0uCi1zLWJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9iZmQuYyA+YmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQudG1wIGJmZHQudGV4aQotCXRvdWNoIHMtYmZkCi1iZmR0LnRleGk6IHMtYmZkCi0KLXMtY2FjaGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID5jYWNoZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY2FjaGUudG1wIGNhY2hlLnRleGkKLQl0b3VjaCBzLWNhY2hlCi1jYWNoZS50ZXhpOiBzLWNhY2hlCi0KLXMtY29mZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPmNvZmZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb2ZmY29kZS50bXAgY29mZmNvZGUudGV4aQotCXRvdWNoIHMtY29mZmNvZGUKLWNvZmZjb2RlLnRleGk6IHMtY29mZmNvZGUKLQotcy1jb3JlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID5jb3JlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb3JlLnRtcCBjb3JlLnRleGkKLQl0b3VjaCBzLWNvcmUKLWNvcmUudGV4aTogcy1jb3JlCi0KLXMtZWxmOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmLmMgPmVsZi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmLnRtcCBlbGYudGV4aQotCXRvdWNoIHMtZWxmCi1lbGYudGV4aTogcy1lbGYKLQotcy1lbGZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZmNvZGUuaCA+ZWxmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmY29kZS50bXAgZWxmY29kZS50ZXhpCi0JdG91Y2ggcy1lbGZjb2RlCi1lbGZjb2RlLnRleGk6IHMtZWxmY29kZQotCi1zLWZvcm1hdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID5mb3JtYXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGZvcm1hdC50bXAgZm9ybWF0LnRleGkKLQl0b3VjaCBzLWZvcm1hdAotZm9ybWF0LnRleGk6IHMtZm9ybWF0Ci0KLXMtbGliYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID5saWJiZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLnRleGkKLQl0b3VjaCBzLWxpYmJmZAotbGliYmZkLnRleGk6IHMtbGliYmZkCi0KLXMtb3BuY2xzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyICA8JChzcmNkaXIpLy4uL29wbmNscy5jID5vcG5jbHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIG9wbmNscy50bXAgb3BuY2xzLnRleGkKLQl0b3VjaCBzLW9wbmNscwotb3BuY2xzLnRleGk6IHMtb3BuY2xzCi0KLXMtcmVsb2M6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3JlbG9jLmMgPnJlbG9jLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSByZWxvYy50bXAgcmVsb2MudGV4aQotCXRvdWNoIHMtcmVsb2MKLXJlbG9jLnRleGk6IHMtcmVsb2MKLQotcy1zZWN0aW9uOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+c2VjdGlvbi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc2VjdGlvbi50bXAgc2VjdGlvbi50ZXhpCi0JdG91Y2ggcy1zZWN0aW9uCi1zZWN0aW9uLnRleGk6IHMtc2VjdGlvbgotCi1zLXN5bXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zeW1zLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc3ltcy5jID5zeW1zLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzeW1zLnRtcCBzeW1zLnRleGkKLQl0b3VjaCBzLXN5bXMKLXN5bXMudGV4aTogcy1zeW1zCi0KLXMtdGFyZ2V0czogJChNS0RPQykgJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPnRhcmdldHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRhcmdldHMudG1wIHRhcmdldHMudGV4aQotCXRvdWNoIHMtdGFyZ2V0cwotdGFyZ2V0cy50ZXhpOiBzLXRhcmdldHMKLQotcy1pbml0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaW5pdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2luaXQuYyA+aW5pdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaW5pdC50bXAgaW5pdC50ZXhpCi0JdG91Y2ggcy1pbml0Ci1pbml0LnRleGk6IHMtaW5pdAotCi1zLWhhc2g6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaGFzaC5jID5oYXNoLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBoYXNoLnRtcCBoYXNoLnRleGkKLQl0b3VjaCBzLWhhc2gKLWhhc2gudGV4aTogcy1oYXNoCi0KLXMtbGlua2VyOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGlua2VyLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vbGlua2VyLmMgPmxpbmtlci50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGlua2VyLnRtcCBsaW5rZXIudGV4aQotCXRvdWNoIHMtbGlua2VyCi1saW5rZXIudGV4aTogcy1saW5rZXIKLQotbGliYmZkLmg6ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2luaXQuYwkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliYmZkLWluLmggPmxpYmJmZC5oIAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vaW5pdC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2VsZi5jID4+bGliYmZkLmgKLQotbGliY29mZi5oOiAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oCVwKLQkkKHNyY2RpcikvLi4vY29mZmNvZGUuaAkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oID5saWJjb2ZmLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPj5saWJjb2ZmLmgKLQotYmZkLmg6ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCAJCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jIAkJXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgCQlcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL3N5bXMuYwkJXAotCSQoc3JjZGlyKS8uLi9iZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNoaXZlLmMJCVwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYwkJXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMJCVwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2JmZC1pbi5oID5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vaW5pdC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL29wbmNscy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2xpYmJmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3JlbG9jLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc3ltcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2JmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+PmJmZC5oCQotCWVjaG8gIiNpZmRlZiBfX2NwbHVzcGx1cyIgPj5iZmQuaAotCWVjaG8gIn0iID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQotbm9pbnN0X1RFWElORk9TID0gYmZkaW50LnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoTUtET0MpICoubwotCi1DTEVBTkZJTEVTID0gcy0qICoucCAqLmlwCi0KLURJU1RDTEVBTkZJTEVTID0gYmZkLj8/IGJmZC4/Pz8gYmZkLmggbGliYmZkLmggbGliY29mZi5oIHRleHB1dC5sb2cKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSAkKERPQ0ZJTEVTKQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9NYWtlZmlsZS5pbiBiL2JmZC9kb2MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWFiNDguLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4uCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLUJGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLUJGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ09SRUZJTEUgPSBAQ09SRUZJTEVACi1DT1JFRkxBRyA9IEBDT1JFRkxBR0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XQVJOX0NGTEFHUyA9IEBXQVJOX0NGTEFHU0AKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1ET0NGSUxFUyA9IGFvdXR4LnRleGkgIGFyY2hpdmUudGV4aSBhcmNodXJlcy50ZXhpIFwKLQliZmR0LnRleGkgIGNhY2hlLnRleGkgY29mZmNvZGUudGV4aSBcCi0JY29yZS50ZXhpIGVsZi50ZXhpIGVsZmNvZGUudGV4aSAgZm9ybWF0LnRleGkgIGxpYmJmZC50ZXhpICBcCi0Jb3BuY2xzLnRleGkgIHJlbG9jLnRleGkgIHNlY3Rpb24udGV4aSAgXAotCXN5bXMudGV4aSAgdGFyZ2V0cy50ZXhpIGluaXQudGV4aSBoYXNoLnRleGkgbGlua2VyLnRleGkKLQotCi1QUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCi0JIGNvcmUucCBmb3JtYXQucCBcCi0JbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCi0Jc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKLQlmb3JtYXQucCAgY29yZS5wIGluaXQucAotCi0KLUlQUk9UT1MgPSBjYWNoZS5pcCBsaWJiZmQuaXAgcmVsb2MuaXAgaW5pdC5pcCBhcmNodXJlcy5pcCBjb2ZmY29kZS5pcAotCi0jIFNSQ0RPQywgU1JDUFJPVCwgU1JDSVBST1Qgb25seSB1c2VkIHRvIHNpZGVzdGVwIFN1biBNYWtlIGJ1ZyBpbiBpbnRlcmFjdGlvbiAKLSMgYmV0d2VlbiBWUEFUSCBhbmQgc3VmZml4IHJ1bGVzLiAgSWYgeW91IHVzZSBHTlUgTWFrZSwgcGVyaGFwcyBvdGhlciBNYWtlcywKLSMgeW91IGRvbid0IG5lZWQgdGhlc2UgdGhyZWU6Ci1TUkNET0MgPSAkKHNyY2RpcikvLi4vYW91dHguaCAgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyBcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpLy4uL2JmZC5jIFwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCBcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpLy4uL2VsZi5jIFwKLQkkKHNyY2RpcikvLi4vZWxmY29kZS5oICAkKHNyY2RpcikvLi4vZm9ybWF0LmMgXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvLi4vb3BuY2xzLmMgXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jICAkKHNyY2RpcikvLi4vc2VjdGlvbi5jIFwKLQkkKHNyY2RpcikvLi4vc3ltcy5jICAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jIFwKLQkkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS8uLi9saW5rZXIuYwotCi0KLVNSQ1BST1QgPSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvLi4vcmVsb2MuYyBcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvLi4vc3ltcy5jIFwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS8uLi9pbml0LmMKLQotCi1TUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKLQkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vLi4vdGV4aW5mby9mc2YKLQotaW5mb19URVhJTkZPUyA9IGJmZC50ZXhpbmZvCi0KLU1LRE9DID0gY2hldyQoRVhFRVhUX0ZPUl9CVUlMRCkKLQotbm9pbnN0X1RFWElORk9TID0gYmZkaW50LnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoTUtET0MpICoubwotCi1DTEVBTkZJTEVTID0gcy0qICoucCAqLmlwCi0KLURJU1RDTEVBTkZJTEVTID0gYmZkLj8/IGJmZC4/Pz8gYmZkLmggbGliYmZkLmggbGliY29mZi5oIHRleHB1dC5sb2cKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSAkKERPQ0ZJTEVTKQotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBiZmQuaW5mbwotRFZJUyA9IGJmZC5kdmkKLVRFWElORk9TID0gYmZkLnRleGluZm8KLURJU1RfQ09NTU9OID0gIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IHRhcgotR1pJUF9FTlYgPSAtLWJlc3QKLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0KLWJmZC5pbmZvOiBiZmQudGV4aW5mbwotYmZkLmR2aTogYmZkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYmZkLmF1eCBiZmQuY3AgYmZkLmNwcyBiZmQuZHZpIGJmZC5mbiBiZmQuZm5zIGJmZC5reSBiZmQua3lzIFwKLQkgIGJmZC5wcyBiZmQubG9nIGJmZC5wZyBiZmQudG9jIGJmZC50cCBiZmQudHBzIGJmZC52ciBiZmQudnJzIFwKLQkgIGJmZC5vcCBiZmQudHIgYmZkLmN2IGJmZC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLXRhZ3M6IFRBR1MKLVRBR1M6Ci0KLQotZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0KLXN1YmRpciA9IGRvYwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1hbQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1hbQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stYW0KLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLWluc3RhbGwtZXhlYy1hbToKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi11bmluc3RhbGwtYW06Ci11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLWFtCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQkJZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQotLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLWRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIHRhZ3MgZGlzdGRpciBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi0kKE1LRE9DKTogY2hldy5vCi0JJChDQ19GT1JfQlVJTEQpIC1vICQoTUtET0MpIGNoZXcubyAkKExPQURMSUJFUykgJChMREZMQUdTKQotCi1jaGV3Lm86IGNoZXcuYwotCSQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4uIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vLi4vaW50bCAtSS4uLy4uL2ludGwgJChIX0NGTEFHUykgJChDRkxBR1MpICQoc3JjZGlyKS9jaGV3LmMKLQotcHJvdG9zOiBsaWJiZmQuaCBsaWJjb2ZmLmggYmZkLmgKLQotYmZkLmluZm8gYmZkLmR2aTogJChET0NGSUxFUykgYmZkc3VtbS50ZXhpIGJmZC50ZXhpbmZvCi0KLSMgV2UgY2FuJ3QgcmVwbGFjZSB0aGVzZSBydWxlcyB3aXRoIGFuIGltcGxpY2l0IHJ1bGUsIGJlY2F1c2UKLSMgbWFrZXMgd2l0aG91dCBWUEFUSCBzdXBwb3J0IGNvdWxkbid0IGZpbmQgdGhlIC5oIGZpbGVzIGluIGAuLicuCi0KLSMgV2UgdXNlIHMtWFhYIHRhcmdldHMgc28gdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZSB0aGUgaW5mbyBmaWxlcywKLSMgYW5kIHBlcm1pdCBwZW9wbGUgdG8gcmVidWlsZCB0aGVtLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWFrZWluZm8KLSMgcHJvZ3JhbS4gIElmIHNvbWVib2R5IHRyaWVzIHRvIHJlYnVpbGQgaW5mbywgYnV0IG5vbmUgb2YgdGhlIC50ZXhpCi0jIGZpbGVzIGhhdmUgY2hhbmdlZCwgdGhlbiB0aGlzIE1ha2VmaWxlIHdpbGwgYnVpbGQgY2hldywgYW5kIHdpbGwKLSMgYnVpbGQgYWxsIG9mIHRoZSBzdGFtcCBmaWxlcywgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGhhdmUgdG8gcmVidWlsZAotIyBiZmQuaW5mby4KLQotcy1hb3V0eDogJChNS0RPQykgJChzcmNkaXIpLy4uL2FvdXR4LmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYW91dHguaCA+YW91dHgudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFvdXR4LnRtcCBhb3V0eC50ZXhpCi0JdG91Y2ggcy1hb3V0eAotYW91dHgudGV4aTogcy1hb3V0eAotCi1zLWFyY2hpdmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID5hcmNoaXZlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNoaXZlLnRtcCBhcmNoaXZlLnRleGkKLQl0b3VjaCBzLWFyY2hpdmUKLWFyY2hpdmUudGV4aTogcy1hcmNoaXZlCi0KLXMtYXJjaHVyZXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID5hcmNodXJlcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaHVyZXMudG1wIGFyY2h1cmVzLnRleGkKLQl0b3VjaCBzLWFyY2h1cmVzCi1hcmNodXJlcy50ZXhpOiBzLWFyY2h1cmVzCi0KLSMgV2UgdXNlIGJmZHQudGV4aSwgcmF0aGVyIHRoYW4gYmZkLnRleGksIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKLSMgYmZkLnRleGluZm8gb24gYW4gOC4zIGZpbGVzeXN0ZW0uCi1zLWJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9iZmQuYyA+YmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQudG1wIGJmZHQudGV4aQotCXRvdWNoIHMtYmZkCi1iZmR0LnRleGk6IHMtYmZkCi0KLXMtY2FjaGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID5jYWNoZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY2FjaGUudG1wIGNhY2hlLnRleGkKLQl0b3VjaCBzLWNhY2hlCi1jYWNoZS50ZXhpOiBzLWNhY2hlCi0KLXMtY29mZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPmNvZmZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb2ZmY29kZS50bXAgY29mZmNvZGUudGV4aQotCXRvdWNoIHMtY29mZmNvZGUKLWNvZmZjb2RlLnRleGk6IHMtY29mZmNvZGUKLQotcy1jb3JlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID5jb3JlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb3JlLnRtcCBjb3JlLnRleGkKLQl0b3VjaCBzLWNvcmUKLWNvcmUudGV4aTogcy1jb3JlCi0KLXMtZWxmOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmLmMgPmVsZi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmLnRtcCBlbGYudGV4aQotCXRvdWNoIHMtZWxmCi1lbGYudGV4aTogcy1lbGYKLQotcy1lbGZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZmNvZGUuaCA+ZWxmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmY29kZS50bXAgZWxmY29kZS50ZXhpCi0JdG91Y2ggcy1lbGZjb2RlCi1lbGZjb2RlLnRleGk6IHMtZWxmY29kZQotCi1zLWZvcm1hdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID5mb3JtYXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGZvcm1hdC50bXAgZm9ybWF0LnRleGkKLQl0b3VjaCBzLWZvcm1hdAotZm9ybWF0LnRleGk6IHMtZm9ybWF0Ci0KLXMtbGliYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID5saWJiZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLnRleGkKLQl0b3VjaCBzLWxpYmJmZAotbGliYmZkLnRleGk6IHMtbGliYmZkCi0KLXMtb3BuY2xzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyICA8JChzcmNkaXIpLy4uL29wbmNscy5jID5vcG5jbHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIG9wbmNscy50bXAgb3BuY2xzLnRleGkKLQl0b3VjaCBzLW9wbmNscwotb3BuY2xzLnRleGk6IHMtb3BuY2xzCi0KLXMtcmVsb2M6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3JlbG9jLmMgPnJlbG9jLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSByZWxvYy50bXAgcmVsb2MudGV4aQotCXRvdWNoIHMtcmVsb2MKLXJlbG9jLnRleGk6IHMtcmVsb2MKLQotcy1zZWN0aW9uOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+c2VjdGlvbi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc2VjdGlvbi50bXAgc2VjdGlvbi50ZXhpCi0JdG91Y2ggcy1zZWN0aW9uCi1zZWN0aW9uLnRleGk6IHMtc2VjdGlvbgotCi1zLXN5bXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zeW1zLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc3ltcy5jID5zeW1zLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzeW1zLnRtcCBzeW1zLnRleGkKLQl0b3VjaCBzLXN5bXMKLXN5bXMudGV4aTogcy1zeW1zCi0KLXMtdGFyZ2V0czogJChNS0RPQykgJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPnRhcmdldHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRhcmdldHMudG1wIHRhcmdldHMudGV4aQotCXRvdWNoIHMtdGFyZ2V0cwotdGFyZ2V0cy50ZXhpOiBzLXRhcmdldHMKLQotcy1pbml0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaW5pdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2luaXQuYyA+aW5pdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaW5pdC50bXAgaW5pdC50ZXhpCi0JdG91Y2ggcy1pbml0Ci1pbml0LnRleGk6IHMtaW5pdAotCi1zLWhhc2g6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaGFzaC5jID5oYXNoLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBoYXNoLnRtcCBoYXNoLnRleGkKLQl0b3VjaCBzLWhhc2gKLWhhc2gudGV4aTogcy1oYXNoCi0KLXMtbGlua2VyOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGlua2VyLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vbGlua2VyLmMgPmxpbmtlci50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGlua2VyLnRtcCBsaW5rZXIudGV4aQotCXRvdWNoIHMtbGlua2VyCi1saW5rZXIudGV4aTogcy1saW5rZXIKLQotbGliYmZkLmg6ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2luaXQuYwkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliYmZkLWluLmggPmxpYmJmZC5oIAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vaW5pdC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2VsZi5jID4+bGliYmZkLmgKLQotbGliY29mZi5oOiAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oCVwKLQkkKHNyY2RpcikvLi4vY29mZmNvZGUuaAkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oID5saWJjb2ZmLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPj5saWJjb2ZmLmgKLQotYmZkLmg6ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCAJCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jIAkJXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgCQlcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL3N5bXMuYwkJXAotCSQoc3JjZGlyKS8uLi9iZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNoaXZlLmMJCVwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYwkJXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMJCVwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2JmZC1pbi5oID5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vaW5pdC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL29wbmNscy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2xpYmJmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3JlbG9jLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc3ltcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2JmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+PmJmZC5oCQotCWVjaG8gIiNpZmRlZiBfX2NwbHVzcGx1cyIgPj5iZmQuaAotCWVjaG8gIn0iID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmQudGV4aW5mbyBiL2JmZC9kb2MvYmZkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGY4N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi1caW5wdXQgdGV4aW5mby50ZXgKLUBzZXRmaWxlbmFtZSBiZmQuaW5mbwotQGMgJElkJAotQHRleAotJSBOT1RFIExPQ0FMIEtMVUdFIFRPIEFWT0lEIFRPTyBNVUNIIFdISVRFU1BBQ0UKLVxnbG9iYWxcbG9uZ1xkZWZcZXhhbXBsZXslCi1cYmVnaW5ncm91cAotXGxldFxhYm92ZWVudmJyZWFrPVxwYXIKLVxsZXRcYWZ0ZXJlbnZicmVhaz1ccGFyCi1ccGFyc2tpcD0wcHQKLVxsaXNwfQotXGdsb2JhbFxsb25nXGRlZlxFZXhhbXBsZXslCi1cRWxpc3AKLVxlbmRncm91cAotXHZza2lwIC1ccGFyc2tpcCUgdG8gY2FuY2VsIG91dCBlZmZlY3Qgb2YgZm9sbG93aW5nIFxwYXIKLX0KLUBlbmQgdGV4Ci1Ac3luaW5kZXggZm4gY3AKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmZkOiAoYmZkKS4gICAgICAgICAgICAgICAgICAgVGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEJGRCBsaWJyYXJ5LgotCi1Db3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBjQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb24KLUBjQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIExJQiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnkKLUB0aXRsZXBhZ2UKLUB0aXRsZXtsaWJiZmR9Ci1Ac3VidGl0bGV7VGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgTGlicmFyeX0KLUBzcCAxCi1Ac3VidGl0bGUgRmlyc3QgRWRpdGlvbi0tLUJGRCB2ZXJzaW9uIDwgMy4wCi1Ac3VidGl0bGUgQXByaWwgMTk5MQotQGF1dGhvciB7U3RldmUgQ2hhbWJlcmxhaW59Ci1AYXV0aG9yIHtDeWdudXMgU3VwcG9ydH0KLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgc2FjXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgQkZEfSwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgYmluYXJ5IGZpbGUgZGVzY3JpcHRvciBsaWJyYXJ5IGxpYmJmZC4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjoJCQlPdmVydmlldyBvZiBCRkQKLSogQkZEIGZyb250IGVuZDo6CQlCRkQgZnJvbnQgZW5kCi0qIEJGRCBiYWNrIGVuZHM6OgkJQkZEIGJhY2sgZW5kcwotKiBJbmRleDo6CQkJSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBPdmVydmlldywgQkZEIGZyb250IGVuZCwgVG9wLCBUb3AKLUBjaGFwdGVyIEludHJvZHVjdGlvbgotQGNpbmRleCBCRkQKLUBjaW5kZXggd2hhdCBpcyBpdD8KLUJGRCBpcyBhIHBhY2thZ2Ugd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzIHdoYXRldmVyIHRoZSBvYmplY3QgZmlsZQotZm9ybWF0LiAgQSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5Ci1jcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZyBpdCB0byB0aGUgbGlicmFyeS4KLQotQkZEIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzOiB0aGUgZnJvbnQgZW5kLCBhbmQgdGhlIGJhY2sgZW5kcyAob25lIGZvcgotZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQpLgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gVGhlIGZyb250IGVuZCBvZiBCRkQgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgdXNlci4gSXQgbWFuYWdlcwotbWVtb3J5IGFuZCB2YXJpb3VzIGNhbm9uaWNhbCBkYXRhIHN0cnVjdHVyZXMuIFRoZSBmcm9udCBlbmQgYWxzbwotZGVjaWRlcyB3aGljaCBiYWNrIGVuZCB0byB1c2UgYW5kIHdoZW4gdG8gY2FsbCBiYWNrIGVuZCByb3V0aW5lcy4KLUBpdGVtIFRoZSBiYWNrIGVuZHMgcHJvdmlkZSBCRkQgaXRzIHZpZXcgb2YgdGhlIHJlYWwgd29ybGQuIEVhY2ggYmFjawotZW5kIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxzIHdoaWNoIHRoZSBCRkQgZnJvbnQgZW5kIGNhbiB1c2UgdG8gbWFpbnRhaW4KLWl0cyBjYW5vbmljYWwgZm9ybS4gVGhlIGJhY2sgZW5kcyBhbHNvIG1heSBrZWVwIGFyb3VuZCBpbmZvcm1hdGlvbiBmb3IKLXRoZWlyIG93biB1c2UsIGZvciBncmVhdGVyIGVmZmljaWVuY3kuCi1AZW5kIGl0ZW1pemUKLUBtZW51Ci0qIEhpc3Rvcnk6OgkJCUhpc3RvcnkKLSogSG93IEl0IFdvcmtzOjoJCUhvdyBJdCBXb3JrcwotKiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvOjoJV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGVuZCBtZW51Ci0KLUBub2RlIEhpc3RvcnksIEhvdyBJdCBXb3JrcywgT3ZlcnZpZXcsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBIaXN0b3J5Ci0KLU9uZSBzcHVyIGJlaGluZCBCRkQgd2FzIHRoZSBkZXNpcmUsIG9uIHRoZSBwYXJ0IG9mIHRoZSBHTlUgOTYwIHRlYW0gYXQKLUludGVsIE9yZWdvbiwgZm9yIGludGVyb3BlcmFiaWxpdHkgb2YgYXBwbGljYXRpb25zIG9uIHRoZWlyIENPRkYgYW5kCi1iLm91dCBmaWxlIGZvcm1hdHMuICBDeWdudXMgd2FzIHByb3ZpZGluZyBHTlUgc3VwcG9ydCBmb3IgdGhlIHRlYW0sIGFuZAotd2FzIGNvbnRyYWN0ZWQgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4KLQotVGhlIG5hbWUgY2FtZSBmcm9tIGEgY29udmVyc2F0aW9uIERhdmlkIFdhbGxhY2Ugd2FzIGhhdmluZyB3aXRoIFJpY2hhcmQKLVN0YWxsbWFuIGFib3V0IHRoZSBsaWJyYXJ5OiBSTVMgc2FpZCB0aGF0IGl0IHdvdWxkIGJlIHF1aXRlIGhhcmQtLS1EYXZpZAotc2FpZCBgYEJGRCcnLiAgU3RhbGxtYW4gd2FzIHJpZ2h0LCBidXQgdGhlIG5hbWUgc3R1Y2suCi0KLUF0IHRoZSBzYW1lIHRpbWUsIFJlYWR5IFN5c3RlbXMgd2FudGVkIG11Y2ggdGhlIHNhbWUgdGhpbmcsIGJ1dCBmb3IKLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzOiBJRUVFLTY5NSwgT2FzeXMsIFNyZWNvcmRzLCBhLm91dCBhbmQgNjhrCi1jb2ZmLgotCi1CRkQgd2FzIGZpcnN0IGltcGxlbWVudGVkIGJ5IG1lbWJlcnMgb2YgQ3lnbnVzIFN1cHBvcnQ7IFN0ZXZlCi1DaGFtYmVybGFpbiAoQGNvZGV7c2FjQEBjeWdudXMuY29tfSksIEpvaG4gR2lsbW9yZQotKEBjb2Rle2dudUBAY3lnbnVzLmNvbX0pLCBLLiAgUmljaGFyZCBQaXhsZXkgKEBjb2Rle3JpY2hAQGN5Z251cy5jb219KQotYW5kIERhdmlkIEhlbmtlbC1XYWxsYWNlIChAY29kZXtndW1ieUBAY3lnbnVzLmNvbX0pLgotCi0KLQotQG5vZGUgSG93IEl0IFdvcmtzLCBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCBIaXN0b3J5LCBPdmVydmlldwotQHNlY3Rpb24gSG93IFRvIFVzZSBCRkQKLQotVG8gdXNlIHRoZSBsaWJyYXJ5LCBpbmNsdWRlIEBmaWxle2JmZC5ofSBhbmQgbGluayB3aXRoIEBmaWxle2xpYmJmZC5hfS4JCi0KLUJGRCBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gdGhlIHBhcnRzIG9mIGFuIG9iamVjdCBmaWxlCi1mb3IgYSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAKLQotV2hlbiBhbiBhcHBsaWNhdGlvbiBzdWNlc3NmdWxseSBvcGVucyBhIHRhcmdldCBmaWxlIChvYmplY3QsIGFyY2hpdmUsIG9yCi13aGF0ZXZlciksIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuIFRoaXMgcG9pbnRlcgotcG9pbnRzIHRvIGEgc3RydWN0dXJlIGNhbGxlZCBAY29kZXtiZmR9LCBkZXNjcmliZWQgaW4KLUBmaWxle2JmZC5ofS4gIE91ciBjb252ZW50aW9uIGlzIHRvIGNhbGwgdGhpcyBwb2ludGVyIGEgQkZELCBhbmQKLWluc3RhbmNlcyBvZiBpdCB3aXRoaW4gY29kZSBAY29kZXthYmZkfS4gIEFsbCBvcGVyYXRpb25zIG9uCi10aGUgdGFyZ2V0IG9iamVjdCBmaWxlIGFyZSBhcHBsaWVkIGFzIG1ldGhvZHMgdG8gdGhlIEJGRC4gIFRoZSBtYXBwaW5nIGlzCi1kZWZpbmVkIHdpdGhpbiBAY29kZXtiZmQuaH0gaW4gYSBzZXQgb2YgbWFjcm9zLCBhbGwgYmVnaW5uaW5nCi13aXRoIEBzYW1we2JmZF99IHRvIHJlZHVjZSBuYW1lc3BhY2UgcG9sbHV0aW9uLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBkb2VzIHdoYXQgeW91IHdvdWxkIHByb2JhYmx5IGV4cGVjdDoKLXJldHVybiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGF0dGFjaGVkIHRvIGEgQkZECi1AY29kZXthYmZkfS4gCi0KLUBsaXNwCi1AYyBAY2FydG91Y2hlCi0jaW5jbHVkZSAiYmZkLmgiCi0KLXVuc2lnbmVkIGludCBudW1iZXJfb2Zfc2VjdGlvbnMoYWJmZCkKLWJmZCAqYWJmZDsKLUB7Ci0gIHJldHVybiBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCk7Ci1AfQotQGMgQGVuZCBjYXJ0b3VjaGUKLUBlbmQgbGlzcAotCi1UaGUgYWJzdHJhY3Rpb24gdXNlZCB3aXRoaW4gQkZEIGlzIHRoYXQgYW4gb2JqZWN0IGZpbGUgaGFzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYSBoZWFkZXIsCi1AaXRlbQotYSBudW1iZXIgb2Ygc2VjdGlvbnMgY29udGFpbmluZyByYXcgZGF0YSAoQHB4cmVme1NlY3Rpb25zfSksCi1AaXRlbQotYSBzZXQgb2YgcmVsb2NhdGlvbnMgKEBweHJlZntSZWxvY2F0aW9uc30pLCBhbmQKLUBpdGVtCi1zb21lIHN5bWJvbCBpbmZvcm1hdGlvbiAoQHB4cmVme1N5bWJvbHN9KS4KLUBlbmQgaXRlbWl6ZQotQG5vaW5kZW50Ci1BbHNvLCBCRkRzIG9wZW5lZCBmb3IgYXJjaGl2ZXMgaGF2ZSB0aGUgYWRkaXRpb25hbCBhdHRyaWJ1dGUgb2YgYW4gaW5kZXgKLWFuZCBjb250YWluIHN1Ym9yZGluYXRlIEJGRHMuIFRoaXMgYXBwcm9hY2ggaXMgZmluZSBmb3IgYS5vdXQgYW5kIGNvZmYsCi1idXQgbG9zZXMgZWZmaWNpZW5jeSB3aGVuIGFwcGxpZWQgdG8gZm9ybWF0cyBzdWNoIGFzIFMtcmVjb3JkcyBhbmQKLUlFRUUtNjk1LgotCi1Abm9kZSBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCAgLCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLQotQG5vZGUgQkZEIGZyb250IGVuZCwgQkZEIGJhY2sgZW5kcywgT3ZlcnZpZXcsIFRvcAotQGNoYXB0ZXIgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgYmZkdC50ZXhpCi0KLUBtZW51Ci0qIE1lbW9yeSBVc2FnZTo6Ci0qIEluaXRpYWxpemF0aW9uOjoKLSogU2VjdGlvbnM6OgotKiBTeW1ib2xzOjoKLSogQXJjaGl2ZXM6OgotKiBGb3JtYXRzOjoKLSogUmVsb2NhdGlvbnM6OgotKiBDb3JlIEZpbGVzOjoKLSogVGFyZ2V0czo6Ci0qIEFyY2hpdGVjdHVyZXM6OgotKiBPcGVuaW5nIGFuZCBDbG9zaW5nOjoKLSogSW50ZXJuYWw6OgotKiBGaWxlIENhY2hpbmc6OgotKiBMaW5rZXIgRnVuY3Rpb25zOjoKLSogSGFzaCBUYWJsZXM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1lbW9yeSBVc2FnZSwgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQsIEJGRCBmcm9udCBlbmQKLUBzZWN0aW9uIE1lbW9yeSB1c2FnZQotQkZEIGtlZXBzIGFsbCBvZiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlcyBpbiBvYnN0YWNrcy4gVGhlcmUgaXMgb25lIG9ic3RhY2sKLXBlciBvcGVuIEJGRCBmaWxlLCBpbnRvIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRlIGlzIHN0b3JlZC4gV2hlbiBhIEJGRCBpcwotY2xvc2VkLCB0aGUgb2JzdGFjayBpcyBkZWxldGVkLCBhbmQgc28gZXZlcnl0aGluZyB3aGljaCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IEJGRCBmb3IgdGhlIGNsb3NpbmcgZmlsZSBpcyB0aHJvd24gYXdheS4KLQotQkZEIGRvZXMgbm90IGZyZWUgYW55dGhpbmcgY3JlYXRlZCBieSBhbiBhcHBsaWNhdGlvbiwgYnV0IHBvaW50ZXJzIGludG8KLUBjb2Rle2JmZH0gc3RydWN0dXJlcyBiZWNvbWUgaW52YWxpZCBvbiBhIEBjb2Rle2JmZF9jbG9zZX07IGZvciBleGFtcGxlLAotYWZ0ZXIgYSBAY29kZXtiZmRfY2xvc2V9IHRoZSB2ZWN0b3IgcGFzc2VkIHRvCi1AY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gaXMgc3RpbGwgYXJvdW5kLCBzaW5jZSBpdCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IHRoZSBkYXRhIHRoYXQgaXQgcG9pbnRlZCB0byBhcmUKLWxvc3QuCi0KLVRoZSBnZW5lcmFsIHJ1bGUgaXMgdG8gbm90IGNsb3NlIGEgQkZEIHVudGlsIGFsbCBvcGVyYXRpb25zIGRlcGVuZGVudAotdXBvbiBkYXRhIGZyb20gdGhlIEJGRCBoYXZlIGJlZW4gY29tcGxldGVkLCBvciBhbGwgdGhlIGRhdGEgZnJvbSB3aXRoaW4KLXRoZSBmaWxlIGhhcyBiZWVuIGNvcGllZC4gVG8gaGVscCB3aXRoIHRoZSBtYW5hZ2VtZW50IG9mIG1lbW9yeSwgdGhlcmUKLWlzIGEgZnVuY3Rpb24gKEBjb2Rle2JmZF9hbGxvY19zaXplfSkgd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1pbiBvYnN0YWNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIEJGRC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvCi1zZWxlY3QgdGhlIGdyZWVkaWVzdCBvcGVuIEJGRCwgY2xvc2UgaXQgdG8gcmVjbGFpbSB0aGUgbWVtb3J5LCBwZXJmb3JtCi1zb21lIG9wZXJhdGlvbiBhbmQgcmVvcGVuIHRoZSBCRkQgYWdhaW4sIHRvIGdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBub2RlIEluaXRpYWxpemF0aW9uLCBTZWN0aW9ucywgTWVtb3J5IFVzYWdlLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaW5pdC50ZXhpCi0KLUBub2RlIFNlY3Rpb25zLCBTeW1ib2xzLCBJbml0aWFsaXphdGlvbiwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIHNlY3Rpb24udGV4aQotCi1Abm9kZSBTeW1ib2xzLCBBcmNoaXZlcywgU2VjdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzeW1zLnRleGkKLQotQG5vZGUgQXJjaGl2ZXMsIEZvcm1hdHMsIFN5bWJvbHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNoaXZlLnRleGkKLQotQG5vZGUgRm9ybWF0cywgUmVsb2NhdGlvbnMsIEFyY2hpdmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgZm9ybWF0LnRleGkKLQotQG5vZGUgUmVsb2NhdGlvbnMsIENvcmUgRmlsZXMsIEZvcm1hdHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICByZWxvYy50ZXhpCi0KLUBub2RlIENvcmUgRmlsZXMsIFRhcmdldHMsIFJlbG9jYXRpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgY29yZS50ZXhpCi0KLUBub2RlIFRhcmdldHMsIEFyY2hpdGVjdHVyZXMsIENvcmUgRmlsZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICB0YXJnZXRzLnRleGkKLQotQG5vZGUgQXJjaGl0ZWN0dXJlcywgT3BlbmluZyBhbmQgQ2xvc2luZywgVGFyZ2V0cywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGFyY2h1cmVzLnRleGkKLQotQG5vZGUgT3BlbmluZyBhbmQgQ2xvc2luZywgSW50ZXJuYWwsIEFyY2hpdGVjdHVyZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBvcG5jbHMudGV4aQotCi1Abm9kZSBJbnRlcm5hbCwgRmlsZSBDYWNoaW5nLCBPcGVuaW5nIGFuZCBDbG9zaW5nLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgbGliYmZkLnRleGkKLQotQG5vZGUgRmlsZSBDYWNoaW5nLCBMaW5rZXIgRnVuY3Rpb25zLCBJbnRlcm5hbCwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNhY2hlLnRleGkKLQotQG5vZGUgTGlua2VyIEZ1bmN0aW9ucywgSGFzaCBUYWJsZXMsIEZpbGUgQ2FjaGluZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpbmtlci50ZXhpCi0KLUBub2RlIEhhc2ggVGFibGVzLCAsIExpbmtlciBGdW5jdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBoYXNoLnRleGkKLQotQG5vZGUgQkZEIGJhY2sgZW5kcywgSW5kZXgsIEJGRCBmcm9udCBlbmQsIFRvcAotQGNoYXB0ZXIgQkZEIGJhY2sgZW5kcwotQG1lbnUKLSogV2hhdCB0byBQdXQgV2hlcmU6OgotKiBhb3V0IDo6CWEub3V0IGJhY2tlbmRzCi0qIGNvZmYgOjoJY29mZiBiYWNrZW5kcwotKiBlbGYgIDo6CWVsZiBiYWNrZW5kcwotQGlnbm9yZQotKiBvYXN5cyA6OglvYXN5cyBiYWNrZW5kcwotKiBpZWVlIDo6CWllZWUgYmFja2VuZAotKiBzcmVjb3JkIDo6CXMtcmVjb3JkIGJhY2tlbmQKLUBlbmQgaWdub3JlCi1AZW5kIG1lbnUKLUBub2RlIFdoYXQgdG8gUHV0IFdoZXJlLCBhb3V0LCBCRkQgYmFjayBlbmRzLCBCRkQgYmFjayBlbmRzCi1BbGwgb2YgQkZEIGxpdmVzIGluIG9uZSBkaXJlY3RvcnkuCi0KLUBub2RlIGFvdXQsIGNvZmYsIFdoYXQgdG8gUHV0IFdoZXJlLCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgYW91dHgudGV4aQotCi1Abm9kZSBjb2ZmLCBlbGYsIGFvdXQsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBjb2ZmY29kZS50ZXhpCi0KLUBub2RlIGVsZiwgICwgY29mZiwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGVsZi50ZXhpCi1AYyBMZWF2ZSB0aGlzIG91dCB1bnRpbCB0aGUgZmlsZSBoYXMgc29tZSBhY3R1YWwgY29udGVudHMuLi4KLUBjIEBpbmNsdWRlICBlbGZjb2RlLnRleGkKLQotQG5vZGUgSW5kZXgsICAsIEJGRCBiYWNrIGVuZHMgLCBUb3AKLUB1bm51bWJlcmVkIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9iZmQvZG9jL2JmZGludC50ZXhpIGIvYmZkL2RvYy9iZmRpbnQudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0ZmE5MS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZGludC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OSArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGJmZGludC5pbmZvCi0KLUBzZXR0aXRsZSBCRkQgSW50ZXJuYWxzCi1AaWZ0ZXgKLUB0aXRsZXBhZ2UKLUB0aXRsZXtCRkQgSW50ZXJuYWxzfQotQGF1dGhvcntJYW4gTGFuY2UgVGF5bG9yfQotQGF1dGhvcntDeWdudXMgU29sdXRpb25zfQotQHBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wIEJGRCBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGJmZCBpbnRlcm5hbHMKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBCRkQgaW50ZXJuYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCi1oZWxwZnVsIHdoZW4gd29ya2luZyBvbiBCRkQuICBJdCBpcyB2ZXJ5IGluY29tcGxldGUuCi0KLVRoaXMgZG9jdW1lbnQgaXMgbm90IHVwZGF0ZWQgcmVndWxhcmx5LCBhbmQgbWF5IGJlIG91dCBvZiBkYXRlLiAgSXQgd2FzCi1sYXN0IG1vZGlmaWVkIG9uICREYXRlJC4KLQotVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IKLUBlbWFpbHtpYW5AQGN5Z251cy5jb219LgotCi1AbWVudQotKiBCRkQgb3ZlcnZpZXc6OgkJQkZEIG92ZXJ2aWV3Ci0qIEJGRCBndWlkZWxpbmVzOjoJCUJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi0qIEJGRCB0YXJnZXQgdmVjdG9yOjoJCUJGRCB0YXJnZXQgdmVjdG9yCi0qIEJGRCBnZW5lcmF0ZWQgZmlsZXM6OgkJQkZEIGdlbmVyYXRlZCBmaWxlcwotKiBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zOjoJRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECi0qIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nOjoJQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLSogQkZEIEVMRiBzdXBwb3J0OjoJCUJGRCBFTEYgc3VwcG9ydAotKiBCRkQgZ2xvc3Nhcnk6OgkJR2xvc3NhcnkKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIG92ZXJ2aWV3Ci1Ac2VjdGlvbiBCRkQgb3ZlcnZpZXcKLQotQkZEIGlzIGEgbGlicmFyeSB3aGljaCBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUKLW9iamVjdCBmaWxlcywgZXhlY3V0YWJsZXMsIGFyY2hpdmUgZmlsZXMsIGFuZCBjb3JlIGZpbGVzIGluIGFueSBmb3JtYXQuCi0KLUBtZW51Ci0qIEJGRCBsaWJyYXJ5IGludGVyZmFjZXM6OglCRkQgbGlicmFyeSBpbnRlcmZhY2VzCi0qIEJGRCBsaWJyYXJ5IHVzZXJzOjoJCUJGRCBsaWJyYXJ5IHVzZXJzCi0qIEJGRCB2aWV3OjoJCQlUaGUgQkZEIHZpZXcgb2YgYSBmaWxlCi0qIEJGRCBibGluZG5lc3M6OgkJQkZEIGxvc2VzIGluZm9ybWF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotCi1PbmUgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIGZvdXIgcGFydHMgYnkKLXR5cGUgb2YgaW50ZXJmYWNlLgotCi1UaGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgd2hpY2ggcHJvZ3JhbXMgdXNpbmcKLXRoZSBCRkQgbGlicmFyeSB3aWxsIGNhbGwuICBUaGVzZSBnZW5lcmljIGZ1bmN0aW9uIG5vcm1hbGx5IHRyYW5zbGF0ZQotZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnRvIGNhbGxzIHRvIHJvdXRpbmVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIE1hbnkgb2YgdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMgYXJlCi1hY3R1YWxseSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBAZmlsZXtiZmQuaH0uICBUaGVzZSBmdW5jdGlvbnMgY29tcHJpc2UKLXRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgc2Vjb25kIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIHRhcmdldAotdmVjdG9ycy4gIFRoaXMgaXMgdGhlIGJ1bGsgb2YgdGhlIGNvZGUgaW4gQkZELiAgQSB0YXJnZXQgdmVjdG9yIGlzIGEgc2V0Ci1vZiBmdW5jdGlvbiBwb2ludGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCi10YXJnZXQgdmVjdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmljIEJGRCBmdW5jdGlvbnMuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IsIGFuZCBhcmUgbmV2ZXIKLWNhbGxlZCBkaXJlY3RseS4gIFRoZSB0YXJnZXQgdmVjdG9yIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gQHJlZntCRkQKLXRhcmdldCB2ZWN0b3J9LiAgVGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhcgotdGFyZ2V0IHZlY3RvciBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIEJGRCBiYWNrZW5kLgotCi1UaGUgdGhpcmQgaW50ZXJmYWNlIGlzIGEgc2V0IG9mIG9kZGJhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSB0eXBpY2FsbHkKLXNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQsIGFyZSBub3QgZ2VuZXJpYyBmdW5jdGlvbnMsCi1hbmQgYXJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlc2UgYXJlIHVzZWQgYXMgaG9va3MKLWJ5IHRoZSBsaW5rZXIgYW5kIHRoZSBhc3NlbWJsZXIgd2hlbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0Ci1yZXF1aXJlcyBzb21lIGFjdGlvbiB3aGljaCB0aGUgQkZEIGdlbmVyaWMgaW50ZXJmYWNlIGRvZXMgbm90IHByb3ZpZGUuCi1UaGVzZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBkZWNsYXJlZCBpbiBAZmlsZXtiZmQuaH0sIGJ1dCBpbiBtYW55Ci1jYXNlcyB0aGV5IGFyZSBvbmx5IHByb3ZpZGVkIHdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgd2l0aCBzdXBwb3J0IGZvciBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluIGEgZ3JleSBhcmVhLCBhbmQKLWFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UuCi0KLVRoZSBmb3VydGggaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgQkZEIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQotY2FsbGVkIGJ5IHRoZSBvdGhlciBCRkQgZnVuY3Rpb25zLiAgVGhlc2UgbWFuYWdlIGlzc3VlcyBsaWtlIG1lbW9yeQotYWxsb2NhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGZpbGUgYWNjZXNzLCBoYXNoIHRhYmxlcywgc3dhcHBpbmcsIGFuZCB0aGUKLWxpa2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1Abm9kZSBCRkQgbGlicmFyeSB1c2VycwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgdXNlcnMKLQotQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGUgQkZEIGxpYnJhcnkgaXMgdG8gZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMKLWJ5IHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZC4KLQotVGhlIGZpcnN0IHVzZSBpcyB0byByZWFkIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHJlYWRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dkYn0sIEBzYW1we25tfSwgQHNhbXB7b2JqZHVtcH0sIGFuZCBAc2FtcHtvYmpjb3B5fS4KLVRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8gdmlldyBhbiBvYmplY3QgZmlsZSBpbiBhIGdlbmVyaWMgZm9ybS4gIFRoZQotb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpcyBub3JtYWxseSBmdWxseSBhZGVxdWF0ZSBmb3IgdGhlc2UgcHJvZ3JhbXMuCi0KLVRoZSBzZWNvbmQgdXNlIGlzIHRvIHdyaXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHdyaXRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dhc30gYW5kIEBzYW1we29iamNvcHl9LiAgVGhlc2UgcHJvZ3JhbXMgdXNlIEJGRCB0bwotY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgYWRlcXVhdGUKLWZvciB0aGVzZSBwcm9ncmFtcywgYnV0IGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGFzc2VtYmxlciBuZWVkcwotc29tZSBhZGRpdGlvbmFsIGhvb2tzIGluIG9yZGVyIHRvIHNldCBwYXJ0aWN1bGFyIGZsYWdzIG9yIG90aGVyCi1pbmZvcm1hdGlvbi4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5Ci1wcml2YXRlIGluZm9ybWF0aW9uIGZyb20gb25lIG9iamVjdCBmaWxlIHRvIGFub3RoZXIsIGFuZCB0aGVzZSBmdW5jdGlvbnMKLWFyZSB1c2VkIGJ5IEBzYW1we29iamNvcHl9IHRvIGF2b2lkIGluZm9ybWF0aW9uIGxvc3MuCi0KLVRoZSB0aGlyZCB1c2UgaXMgdG8gbGluayBvYmplY3QgZmlsZXMuICBUaGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgZmlsZQotbGlua2VyLCBAc2FtcHtsZH0uICBPcmlnaW5hbGx5LCBAc2FtcHtsZH0gd2FzIGFuIG9iamVjdCBmaWxlIHJlYWRlciBhbmQKLWFuIG9iamVjdCBmaWxlIHdyaXRlciwgYW5kIGl0IGRpZCB0aGUgbGluayBvcGVyYXRpb24gdXNpbmcgdGhlIGdlbmVyaWMKLUJGRCBzdHJ1Y3R1cmVzLiAgSG93ZXZlciwgdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBzbG93IGFuZCB0b28gbWVtb3J5Ci1pbnRlbnNpdmUuCi0KLVRoZSBvZmZpY2lhbCBCRkQgbGlua2VyIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcGVybWl0IHNwZWNpZmljIEJGRAotYmFja2VuZHMgdG8gcGVyZm9ybSB0aGUgbGluayB3aXRob3V0IHRyYW5zbGF0aW5nIHRocm91Z2ggdGhlIGdlbmVyaWMKLXN0cnVjdHVyZXMsIGluIHRoZSBub3JtYWwgY2FzZSB3aGVyZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBvdXRwdXQgZmlsZQotaGF2ZSB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQuICBOb3QgYWxsIG9mIHRoZSBiYWNrZW5kcyBjdXJyZW50bHkKLWltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHRoZXJlIGFyZSBkZWZhdWx0IGxpbmtpbmcgZnVuY3Rpb25zCi13aXRoaW4gQkZEIHdoaWNoIHVzZSB0aGUgZ2VuZXJpYyBzdHJ1Y3R1cmVzIGFuZCB3aGljaCB3b3JrIHdpdGggYWxsCi1iYWNrZW5kcy4KLQotRm9yIHNldmVyYWwgb2JqZWN0IGZpbGUgZm9ybWF0cyB0aGUgbGlua2VyIG5lZWRzIGFkZGl0aW9uYWwgaG9va3Mgd2hpY2gKLWFyZSBub3QgcHJvdmlkZWQgYnkgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UsIHBhcnRpY3VsYXJseSBmb3IgZHluYW1pYwotbGlua2luZyBzdXBwb3J0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGxpbmtlcgotZW11bGF0aW9uIHRlbXBsYXRlLgotCi1Abm9kZSBCRkQgdmlldwotQHN1YnNlY3Rpb24gVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotCi1CRkQgdXNlcyBnZW5lcmljIHN0cnVjdHVyZXMgdG8gbWFuYWdlIGluZm9ybWF0aW9uLiAgSXQgdHJhbnNsYXRlcyBkYXRhCi1pbnRvIHRoZSBnZW5lcmljIGZvcm0gd2hlbiByZWFkaW5nIGZpbGVzLCBhbmQgb3V0IG9mIHRoZSBnZW5lcmljIGZvcm0KLXdoZW4gd3JpdGluZyBmaWxlcy4KLQotQkZEIGRlc2NyaWJlcyBhIGZpbGUgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHtiZmR9IHR5cGUuICBBIEBzYW1we2JmZH0KLWlzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuICBUaGUgQkZEIGluZm9ybWF0aW9uIGNhbiBiZQotZGlzcGxheWVkIHVzaW5nIHRoZSBAc2FtcHtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdmFyaW91cyBvcHRpb25zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGdlbmVyYWwgaW5mb3JtYXRpb24KLVRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGEgZmV3IGdlbmVyYWwgZmxhZ3MsIHRoZSBzdGFydCBhZGRyZXNzLgotQGl0ZW0gYXJjaGl0ZWN0dXJlCi1UaGUgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgYm90aCBhIGdlbmVyYWwgcHJvY2Vzc29yIHR5cGUgKG02OGssIE1JUFMKLWV0Yy4pIGFuZCBhIHNwZWNpZmljIG1hY2hpbmUgbnVtYmVyIChtNjgwMDAsIFI0MDAwLCBldGMuKS4KLUBpdGVtIHNlY3Rpb25zCi1BIGxpc3Qgb2Ygc2VjdGlvbnMuCi1AaXRlbSBzeW1ib2xzCi1BIHN5bWJvbCB0YWJsZS4KLUBlbmQgdGFibGUKLQotQkZEIHJlcHJlc2VudHMgYSBzZWN0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXNlY3Rpb259IHR5cGUuICBFYWNoCi1zZWN0aW9uIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQKLWJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgU2VjdGlvbnMgYWxzbyBoYXZlCi1hc3NvY2lhdGVkIGZsYWdzLCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MsIGEgbG9hZCBtZW1vcnkgYWRkcmVzcywgYQotcmVxdWlyZWQgYWxpZ25tZW50LCBhIGxpc3Qgb2YgcmVsb2NhdGlvbnMsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4KLQotQkZEIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXJlbGVudH0gdHlwZS4gIEEKLXJlbG9jYXRpb24gZGVzY3JpYmVzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB0byBtb2RpZnkgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgUmVsb2NhdGlvbnMgaGF2ZSBhIHN5bWJvbCwgYW4gYWRkcmVzcywgYW4gYWRkZW5kLCBhbmQKLWEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgaG93IHRvIHBlcmZvcm0gdGhlCi1yZWxvY2F0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotQkZEIHJlcHJlc2VudHMgYSBzeW1ib2wgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHthc3ltYm9sfSB0eXBlLiAgQQotc3ltYm9sIGhhcyBhIG5hbWUsIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuIG9mZnNldCB3aXRoaW4gdGhhdAotc2VjdGlvbiwgYW5kIHNvbWUgZmxhZ3MuCi0KLUFyY2hpdmUgZmlsZXMgZG8gbm90IGhhdmUgYW55IHNlY3Rpb25zIG9yIHN5bWJvbHMuICBJbnN0ZWFkLCBCRkQKLXJlcHJlc2VudHMgYW4gYXJjaGl2ZSBmaWxlIGFzIGEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKLUBzYW1we2JmZH1zLiAgQkZEIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAsIGFzIGEKLWxpc3Qgb2Ygc3ltYm9sIG5hbWVzLiAgQkZEIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBAc2FtcHtiZmR9Ci13aXRoaW4gdGhlIGFyY2hpdmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudHJ5IGluIHRoZQotYXJjaGl2ZSBzeW1ib2wgbWFwLgotCi1Abm9kZSBCRkQgYmxpbmRuZXNzCi1Ac3Vic2VjdGlvbiBCRkQgbG9zZXMgaW5mb3JtYXRpb24KLQotTW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50IGluCi1pdHMgZ2VuZXJpYyBmb3JtLCBhdCBsZWFzdCBhcyBjdXJyZW50bHkgZGVmaW5lZC4KLQotVGhlcmUgaXMgb2Z0ZW4gZXhwbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50LiAgRm9yCi1leGFtcGxlLCB0aGUgQ09GRiB2ZXJzaW9uIHN0YW1wLCBvciB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMuICBCRkQKLXByb3ZpZGVzIHNwZWNpYWwgaG9va3MgdG8gaGFuZGxlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb3B5aW5nLAotcHJpbnRpbmcsIG9yIGxpbmtpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGUgQkZEIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhcgotb2JqZWN0IGZpbGUgZm9ybWF0IHdpbGwgbm9ybWFsbHkgc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGRhdGEKLWFuZCBoYW5kbGUgaXQgdXNpbmcgdGhlIHNwZWNpYWwgaG9va3MuCi0KLUluIHNvbWUgY2FzZXMgdGhlcmUgaXMgYWxzbyBpbXBsaWNpdCBpbmZvcm1hdGlvbiB3aGljaCBCRkQgY2FuIG5vdAotcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIHByb2Nlc3NvciBkaXN0aW5ndWlzaGVzIHNtYWxsIGFuZAotbGFyZ2Ugc3ltYm9scywgYW5kIHJlcXVpcmVzIHRoYXQgYWxsIHNtYWxsIHN5bWJscyBiZSB3aXRoaW4gMzJLIG9mIHRoZQotR1AgcmVnaXN0ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JUFMgYXNzZW1ibGVyIG11c3QgYmUgYWJsZSB0byBtYXJrCi12YXJpYWJsZXMgYXMgZWl0aGVyIHNtYWxsIG9yIGxhcmdlLCBhbmQgdGhlIE1JUFMgbGlua2VyIG11c3Qga25vdyB0byBwdXQKLXNtYWxsIHN5bWJvbHMgd2l0aGluIHJhbmdlIG9mIHRoZSBHUCByZWdpc3Rlci4gIFNpbmNlIEJGRCBjYW4gbm90Ci1yZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiwgdGhpcyBtZWFucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlcgotbXVzdCBoYXZlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUgQkZEIGxpYnJhcnkuCi0KLVRoaXMgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbmRpY2F0ZXMgYXJlYXMgd2hlcmUgdGhlIEJGRCBwYXJhZGlnbSBicmVha3MKLWRvd24uICBJdCBpcyBub3QgYWN0dWFsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBteXJpYWQgZGlmZmVyZW5jZXMKLWFtb25nIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNpbmcgYSBzaW5nbGUgZ2VuZXJpYyBpbnRlcmZhY2UsIGF0IGxlYXN0IG5vdAotaW4gdGhlIG1hbm5lciB3aGljaCBCRkQgZG9lcyBpdCB0b2RheS4KLQotTmV2ZXJ0aGVsZXNzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLCBhbmQgcGFydGljdWxhciBwcm9ibGVtcyBjYXVzZWQgYnkgaW5mb3JtYXRpb24gbG9zcwotY2FuIG5vcm1hbGx5IGJlIHNvbHZlZCB1c2luZyBzb21lIHNvcnQgb2YgcmVsYXRpdmVseSBjb25zdHJhaW5lZCBob29rCi1pbnRvIHRoZSBsaWJyYXJ5LgotCi0KLQotQG5vZGUgQkZEIGd1aWRlbGluZXMKLUBzZWN0aW9uIEJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IGJmZCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IHByb2dyYW1taW5nIGd1aWRlbGluZXMgZm9yIGJmZAotQGNpbmRleCBndWlkZWxpbmVzLCBiZmQgcHJvZ3JhbW1pbmcKLQotVGhlcmUgaXMgYSBsb3Qgb2YgcG9vcmx5IHdyaXR0ZW4gYW5kIGNvbmZ1c2luZyBjb2RlIGluIEJGRC4gIE5ldyBCRkQKLWNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSBoaWdoZXIgc3RhbmRhcmQuICBNZXJlbHkgYmVjYXVzZSBzb21lIEJGRAotY29kZSBpcyB3cml0dGVuIGluIGEgcGFydGljdWxhciBtYW5uZXIgZG9lcyBub3QgbWVhbiB0aGF0IHlvdSBzaG91bGQKLWVtdWxhdGUgaXQuCi0KLUhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZvbGxvdyB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1Bdm9pZCBnbG9iYWwgdmFyaWFibGVzLiAgV2UgaWRlYWxseSB3YW50IEJGRCB0byBiZSBmdWxseSByZWVudHJhbnQsIHNvCi10aGF0IGl0IGNhbiBiZSB1c2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBBbGwgdXNlcyBvZiBnbG9iYWwgb3Igc3RhdGljCi12YXJpYWJsZXMgaW50ZXJmZXJlIHdpdGggdGhhdC4gIEluaXRpYWxpemVkIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgT0ssCi1hbmQgdGhleSBzaG91bGQgYmUgZXhwbGljaXRseSBtYXJrZWQgd2l0aCBjb25zdC4gIEluc3RlYWQgb2YgZ2xvYmFsCi12YXJpYWJsZXMsIHVzZSBkYXRhIGF0dGFjaGVkIHRvIGEgQkZEIG9yIHRvIGEgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBpdGVtCi1BbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBuYW1lcyB3aGljaCBzdGFydCB3aXRoCi1Ac2FtcHtiZmRffS4gIEFsbCBzdWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc29tZSBoZWFkZXIgZmlsZSwKLXR5cGljYWxseSBAZmlsZXtiZmQuaH0uICBTZWUsIGZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBkZWNsYXJhdGlvbnMgbmVhcgotdGhlIGVuZCBvZiBAZmlsZXtiZmQtaW4uaH0sIHdoaWNoIG1vc3RseSBkZWNsYXJlIGZ1bmN0aW9ucyByZXF1aXJlZCBieQotc3BlY2lmaWMgbGlua2VyIGVtdWxhdGlvbnMuCi0KLUBpdGVtCi1BbGwgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdmlzaWJsZSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIgd2l0aGluCi1CRkQsIGJ1dCBzaG91bGQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBCRkQsIHNob3VsZCBzdGFydCB3aXRoCi1Ac2FtcHtfYmZkX30uICBBbHRob3VnaCBleHRlcm5hbCBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffSBhcmUKLXByb2hpYml0ZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIGluIHByYWN0aWNlIHRoaXMgdXNhZ2Ugd2lsbCBhbHdheXMKLXdvcmssIGFuZCBpdCBpcyByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1BbHdheXMgcmVtZW1iZXIgdGhhdCBwZW9wbGUgY2FuIGNvbXBpbGUgdXNpbmcgQHNhbXB7LS1lbmFibGUtdGFyZ2V0c30gdG8KLWJ1aWxkIHNldmVyYWwsIG9yIGFsbCwgdGFyZ2V0cyBhdCBvbmNlLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBsaW5rCi10b2dldGhlciB0aGUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzLgotCi1AaXRlbQotQkZEIGNvZGUgc2hvdWxkIGNvbXBpbGUgd2l0aCBmZXcgb3Igbm8gd2FybmluZ3MgdXNpbmcgQHNhbXB7Z2NjIC1XYWxsfS4KLVNvbWUgd2FybmluZ3MgYXJlIE9LLCBsaWtlIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi13aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgV2FybmluZ3MgYWJvdXQKLWFtYmlndW91cyBleHByZXNzaW9ucyBhbmQgdGhlIGxpa2Ugc2hvdWxkIGFsd2F5cyBiZSBmaXhlZC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvcgotQHNlY3Rpb24gQkZEIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggYmZkIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciBpbiBiZmQKLQotQkZEIHN1cHBvcnRzIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdHMgYnkgdXNpbmcgdGhlIEBkZm57dGFyZ2V0Ci12ZWN0b3J9LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50Ci1iZWhhdmlvdXIgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1JbiB0aGlzIHNlY3Rpb24gSSBsaXN0IGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQKLWRlc2NyaWJlIHdoYXQgdGhleSBkby4KLQotQG1lbnUKLSogQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91czo6CU1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXA6OgkJU3dhcHBpbmcgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdDo6CQlGb3JtYXQgdHlwZSBkZXBlbmRlbnQgZnVuY3Rpb25zCi0qIEJGRF9KVU1QX1RBQkxFIG1hY3Jvczo6CQlCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLSogQkZEIHRhcmdldCB2ZWN0b3IgZ2VuZXJpYzo6CQlHZW5lcmljIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3B5OjoJCUNvcHkgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmU6OgkJQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmU6OgkJQXJjaGl2ZSBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3Igc3ltYm9sczo6CQlTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jczo6CQlSZWxvY2F0aW9uIHN1cHBvcnQKLSogQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGU6OgkJT3V0cHV0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rOjoJCUxpbmtlciBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYzo6CQlEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZnVuY3Rpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91cwotQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb25zdGFudHMKLQotVGhlIHRhcmdldCB2ZWN0b3Igc3RhcnRzIHdpdGggYSBzZXQgb2YgY29uc3RhbnRzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyBpcwotaG93IHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIGluIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0b29scyB3aGljaAotdXNlIEJGRCwgc3VjaCBhcyB0aGUgQHNhbXB7LW9mb3JtYXR9IGxpbmtlciBvcHRpb24uCi0KLUBpdGVtIGZsYXZvdXIKLUEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0YXJnZXQuICBUaGUgZm9sbG93aW5nIGZsYXZvdXJzIGFyZQotY3VycmVudGx5IGRlZmluZWQ6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIKLVVuZGVmaW5lZCBvciB1bmtub3duLgotQGl0ZW0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLWEub3V0LgotQGl0ZW0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLUNPRkYuCi1AaXRlbSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLUVDT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotRUxGLgotQGl0ZW0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIKLUlFRUUtNjk1LgotQGl0ZW0gYmZkX3RhcmdldF9ubG1fZmxhdm91cgotTkxNLgotQGl0ZW0gYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyCi1PQVNZUy4KLUBpdGVtIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIKLVRla3Ryb25peCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIKLU1vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyCi1JbnRlbCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotU09NICh1c2VkIG9uIEhQL1VYKS4KLUBpdGVtIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyCi1vczkwMDAuCi1AaXRlbSBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIKLVZFUlNBZG9zLgotQGl0ZW0gYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyCi1NUy1ET1MuCi1AaXRlbSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotb3BlblZNUy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBkYXRhIGluIHRoZSBvYmplY3QgZmlsZS4gIE9uZSBvZgotQHNhbXB7QkZEX0VORElBTl9CSUd9LCBAc2FtcHtCRkRfRU5ESUFOX0xJVFRMRX0sIG9yCi1Ac2FtcHtCRkRfRU5ESUFOX1VOS05PV059LiAgVGhlIGxhdHRlciB3b3VsZCBiZSB1c2VkIGZvciBhIGZvcm1hdCBzdWNoCi1hcyBTLXJlY29yZHMgd2hpY2ggZG8gbm90IHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhLgotCi1AaXRlbSBoZWFkZXJfYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgTm9ybWFsbHkgdGhlCi1zYW1lIGFzIHRoZSBAc2FtcHtieXRlb3JkZXJ9IGZpZWxkLCBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMgd2hlcmUgaXQKLW1heSBiZSBkaWZmZXJlbnQuCi0KLUBpdGVtIG9iamVjdF9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgQkZEIHdpdGggdGhpcwotZm9ybWF0LgotCi1AaXRlbSBzZWN0aW9uX2ZsYWdzCi1GbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBAc2FtcHtmbGFnc30gZmllbGQgb2YgYSBzZWN0aW9uIHdpdGhpbiBhCi1CRkQgd2l0aCB0aGlzIGZvcm1hdC4KLQotQGl0ZW0gc3ltYm9sX2xlYWRpbmdfY2hhcgotQSBjaGFyYWN0ZXIgd2hpY2ggdGhlIEMgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBiZWZvcmUgYSBzeW1ib2wuICBGb3IKLWV4YW1wbGUsIGFuIGEub3V0IGNvbXBpbGVyIHdpbGwgdHlwaWNhbGx5IGdlbmVyYXRlIHRoZSBzeW1ib2wKLUBzYW1we19mb299IGZvciBhIGZ1bmN0aW9uIG5hbWVkIEBzYW1we2Zvb30gaW4gdGhlIEMgc291cmNlLCBpbiB3aGljaAotY2FzZSB0aGlzIGZpZWxkIHdvdWxkIGJlIEBzYW1we199LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGFyYWN0ZXIsIHRoaXMKLWZpZWxkIHdpbGwgYmUgQHNhbXB7MH0uCi0KLUBpdGVtIGFyX3BhZF9jaGFyCi1UaGUgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdXNlIGF0IHRoZSBlbmQgb2YgYW4gYXJjaGl2ZSBuYW1lLiAgTm9ybWFsbHkKLUBzYW1wey99LgotCi1AaXRlbSBhcl9tYXhfbmFtZWxlbgotVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2hvcnQgbmFtZSBpbiBhbiBhcmNoaXZlLiAgTm9ybWFsbHkgQHNhbXB7MTR9LgotCi1AaXRlbSBiYWNrZW5kX2RhdGEKLUEgcG9pbnRlciB0byBjb25zdGFudCBiYWNrZW5kIGRhdGEuICBUaGlzIGlzIHVzZWQgYnkgYmFja2VuZHMgdG8gc3RvcmUKLXdoYXRldmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHNpbWlsYXIgdGFyZ2V0Ci12ZWN0b3JzIHdoaWNoIHVzZSB0aGUgc2FtZSBzZXRzIG9mIGZ1bmN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igc3dhcAotQHN1YnNlY3Rpb24gU3dhcHBpbmcgZnVuY3Rpb25zCi0KLUV2ZXJ5IHRhcmdldCB2ZWN0b3IgaGFzIGZ1Y3Rpb24gcG9pbnRlcnMgdXNlZCBmb3Igc3dhcHBpbmcgaW5mb3JtYXRpb24KLWluIGFuZCBvdXQgb2YgdGhlIHRhcmdldCByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gc2V0cyBvZgotZnVuY3Rpb25zOiBvbmUgZm9yIGRhdGEgaW5mb3JtYXRpb24sIGFuZCBvbmUgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4KLUVhY2ggc2V0IGhhcyB0aHJlZSBzaXplczogNjQtYml0LCAzMi1iaXQsIGFuZCAxNi1iaXQuICBFYWNoIHNpemUgaGFzCi10aHJlZSBhY3R1YWwgZnVuY3Rpb25zOiBwdXQsIGdldCB1bnNpZ25lZCwgYW5kIGdldCBzaWduZWQuCi0KLVRoZXNlIDE4IGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0Ci1yZXByZXNlbnRhdGlvbnMuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdAotQHN1YnNlY3Rpb24gRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlCi1pbmRleGVkIGJ5IHRoZSBCRkQgZm9ybWF0IHR5cGUuICBUaGUgQkZEIGZvcm1hdCB0eXBlcyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfdW5rbm93bgotVW5rbm93biBmb3JtYXQuICBOb3QgdXNlZCBmb3IgYW55dGhpbmcgdXNlZnVsLgotQGl0ZW0gYmZkX29iamVjdAotT2JqZWN0IGZpbGUuCi1AaXRlbSBiZmRfYXJjaGl2ZQotQXJjaGl2ZSBmaWxlLgotQGl0ZW0gYmZkX2NvcmUKLUNvcmUgZmlsZS4KLUBlbmQgdGFibGUKLQotVGhlIHRocmVlIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfY2hlY2tfZm9ybWF0Ci1DaGVjayB3aGV0aGVyIHRoZSBCRkQgaXMgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCAob2JqZWN0IGZpbGUsIGFyY2hpdmUKLWZpbGUsIG9yIGNvcmUgZmlsZSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIGNhbGxlZAotYnkgdGhlIEBzYW1we2JmZF9jaGVja19mb3JtYXR9IGZ1bmN0aW9uIHdoZW4gZXhhbWluaW5nIGFuIGV4aXN0aW5nIEJGRC4KLUlmIHRoZSBCRkQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmb3JtYXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFueQotZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIEBzYW1we3RkYXRhfSBmaWVsZCBvZiB0aGUgQkZELgotVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9uCi1vbiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgotCi1AaXRlbSBiZmRfc2V0X2Zvcm1hdAotU2V0IHRoZSBmb3JtYXQgb2YgYSBCRkQgd2hpY2ggd2FzIGNyZWF0ZWQgZm9yIG91dHB1dC4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci10aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBCRkQgd2l0aCBhCi1mdW5jdGlvbiBzdWNoIGFzIEBzYW1we2JmZF9vcGVud30uICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBmb3JtYXQKLXNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHdyaXRlIG91dCBhbiBvYmplY3QgZmlsZSBvciB3aGF0ZXZlciBvZgotdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQKLXRhcmdldCB2ZWN0b3IgZnVuY3Rpb24gb24gYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KLQotQGl0ZW0gYmZkX3dyaXRlX2NvbnRlbnRzCi1Xcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCRkQgaW4gdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgaXMgY2FsbGVkCi1ieSBAc2FtcHtiZmRfY2xvc2V9IGZ1bmN0aW9uIGZvciBhIEJGRCBvcGVuZWQgZm9yIHdyaXRpbmcuICBUaGlzIHJlYWxseQotc2hvdWxkIG5vdCBiZSBhbiBhcnJheSBzZWxlY3RlZCBieSBmb3JtYXQgdHlwZSwgYXMgdGhlCi1Ac2FtcHtiZmRfc2V0X2Zvcm1hdH0gZnVuY3Rpb24gcHJvdmlkZXMgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KLUluIGZhY3QsIEJGRCB3aWxsIGZhaWwgaWYgYSBkaWZmZXJlbnQgZm9ybWF0IGlzIHVzZWQgd2hlbiBjYWxsaW5nCi10aHJvdWdoIHRoZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kIHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9Ci1hcnJheXM7IGZvcnR1bmF0ZWx5LCBzaW5jZSBAc2FtcHtiZmRfY2xvc2V9IGdldHMgaXQgcmlnaHQsIHRoaXMgaXMgYQotZGlmZmljdWx0IGVycm9yIHRvIG1ha2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRF9KVU1QX1RBQkxFIG1hY3JvcwotQHN1YnNlY3Rpb24gQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvcwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRX0KLQotTW9zdCB0YXJnZXQgdmVjdG9ycyBhcmUgZGVmaW5lZCB1c2luZyBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zLgotVGhlc2UgbWFjcm9zIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIGEgcHJlZml4IGFwcGxpZWQgdG8gYSBzZXQKLW9mIGZ1bmN0aW9ucy4gIFRoZSBtYWNyb3MgYXJlIHRoZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLgotCi1Gb3IgZXhhbXBsZSwgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gZGVmaW5lcyB0aHJlZQotZnVuY3Rpb25zOiBAc2FtcHtfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kfSwgQHNhbXB7X2Nhbm9uaWNhbGl6ZV9yZWxvY30sCi1hbmQgQHNhbXB7X2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBBIHJlZmVyZW5jZSBsaWtlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGZvbyl9IHdpbGwgZXhwYW5kIGludG8gdGhyZWUgZnVuY3Rpb25zCi1wcmVmaXhlZCB3aXRoIEBzYW1we2Zvb306IEBzYW1we2Zvb19nZXRfcmVsb2NfdXBwZXJfYm91bmR9LCBldGMuICBUaGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gd2lsbCBiZSBwbGFjZWQgc3VjaCB0aGF0IHRob3NlIHRocmVlCi1mdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4KLQotVGhpcyBpcyBkb25lIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnMgY2FuCi1zaGFyZSBjZXJ0YWluIGNsYXNzZXMgb2YgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGFyY2hpdmVzIGFyZSBzaW1pbGFyCi1vbiBtb3N0IHBsYXRmb3Jtcywgc28gbW9zdCB0YXJnZXQgdmVjdG9ycyBjYW4gdXNlIHRoZSBzYW1lIGFyY2hpdmUKLWZ1bmN0aW9ucy4gIFRob3NlIHRhcmdldCB2ZWN0b3JzIGFsbCB1c2UgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0KLXdpdGggdGhlIHNhbWUgYXJndW1lbnQsIGNhbGxpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGlzIGRlZmluZWQgaW4KLUBmaWxle2FyY2hpdmUuY30uCi0KLUVhY2ggb2YgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MgaXMgbWVudGlvbmVkIGJlbG93IGFsb25nIHdpdGgKLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaXQgZGVmaW5lcy4gIFRoZSBmdW5jdGlvbgotcG9pbnRlcnMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgdGhlIG5hbWUgd2l0aG91dCB0aGUgcHJlZml4IHdoaWNoIHRoZQotQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvIGRlZmluZXMuICBUaGlzIG5hbWUgaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMKLXRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUuICBBbnkgZGlmZmVyZW5jZXMKLXdpbGwgYmUgbm90ZWQuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWMKLUBzdWJzZWN0aW9uIEdlbmVyaWMgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0dFTkVSSUN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfSBtYWNybyBpcyB1c2VkIGZvciBzb21lIGNhdGNoIGFsbAotZnVuY3Rpb25zIHdoaWNoIGRvbid0IGVhc2lseSBmaXQgaW50byBvdGhlciBjYXRlZ29yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jbG9zZV9hbmRfY2xlYW51cAotRnJlZSBhbnkgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZELiAgVGhpcyBpcwotY2FsbGVkIHdoZW4gYW55IEJGRCBpcyBjbG9zZWQgKHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IGZ1bmN0aW9uCi1tZW50aW9uZWQgZWFybGllciBpcyBvbmx5IGNhbGxlZCBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nKS4gIE1vc3QKLXRhcmdldHMgdXNlIEBzYW1we2JmZF9hbGxvY30gdG8gYWxsb2NhdGUgYWxsIHRhcmdldCBzcGVjaWZpYwotaW5mb3JtYXRpb24sIGFuZCB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHR5cGljYWxseSBzZXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cH0sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9iZmRfZnJlZV9jYWNoZWRfaW5mbwotRnJlZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIHdoaWNoIGNhbiBiZQotcmVjcmVhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQotY29uc3VtcHRpb24gcmVxdWlyZWQgYnkgcHJvZ3JhbXMgdXNpbmcgQkZELiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgdmlhCi10aGUgQHNhbXB7YmZkX2ZyZWVfY2FjaGVkX2luZm99IG1hY3JvLiAgSXQgaXMgdXNlZCBieSB0aGUgZGVmYXVsdAotYXJjaGl2ZSByb3V0aW5lcyB3aGVuIGNvbXB1dGluZyB0aGUgYXJjaGl2ZSBtYXAuICBNb3N0IHRhcmdldHMgZG8gbm90Ci1kbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzIGVudHJ5IHBvaW50LCBhbmQganVzdCBzZXQgaXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19mcmVlX2NhY2hlZF9pbmZvfSwgd2hpY2ggc2ltcGx5IHJldHVybnMgdHJ1ZS4KLQotQGl0ZW0gX25ld19zZWN0aW9uX2hvb2sKLVRoaXMgaXMgY2FsbGVkIGZyb20gQHNhbXB7YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXl9IHdoZW5ldmVyIGEgbmV3Ci1zZWN0aW9uIGlzIGNyZWF0ZWQuICBNb3N0IHRhcmdldHMgdXNlIGl0IHRvIGluaXRpYWxpemUgc2VjdGlvbiBzcGVjaWZpYwotaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdGlvbgotY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIHNlY3Rpb24gaW4gYW4gYWN0dWFsIEJGRC4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzCi1HZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uICBNb3N0IHRhcmdldHMgc2V0IHRoaXMgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGRvZXMgYSBAc2FtcHtiZmRfc2Vla30KLWJhc2VkIG9uIHRoZSBzZWN0aW9uJ3MgQHNhbXB7ZmlsZXBvc30gZmllbGQgYW5kIGEgQHNhbXB7YmZkX3JlYWR9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotU2V0IGEgQHNhbXB7YmZkX3dpbmRvd30gdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcwotY2FsbGVkIGZyb20gQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uICBUaGUKLUBzYW1we2JmZF93aW5kb3d9IGlkZWEgbmV2ZXIgcmVhbGx5IGNhdWdodCBvbiwgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcwotZXZlciBjYWxsZWQuICBQcmV0dHkgbXVjaCBhbGwgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBhcwotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fSwgd2hpY2ggdXNlcwotQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfSB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29weQotQHN1YnNlY3Rpb24gQ29weSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09QWX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCB3aGVuIGNvcHlpbmcgQkZEcywgYW5kIGZvciBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoCi1pbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHdoZW4gY29weWluZyBhIEJGRCwgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LgotSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgQkZEcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgdGhpcyB3aWxsIGNvcHkgYW55Ci1wcml2YXRlIGluZm9ybWF0aW9uIG92ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMKLWhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbgotdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGxpbmtpbmcsIHZpYSBAc2FtcHtiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YX0uICBJdAotZ2l2ZXMgdGhlIGJhY2tlbmQgbGlua2VyIGNvZGUgYSBjaGFuY2UgdG8gc2V0IGFueSBzcGVjaWFsIGZsYWdzIGluIHRoZQotb3V0cHV0IGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlLiAgT25seSBhIGZldyB0YXJnZXRzCi1kbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLVRoaXMgaXMgc2ltaWxhciB0byBAc2FtcHtfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YX0sIGJ1dCBpdCBpcyBjYWxsZWQKLWZvciBlYWNoIHNlY3Rpb24sIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YX0uICBUaGlzCi1mdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFueSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuLiAgT25seQotYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGF9LCBidXQgSSBkb24ndAotdGhpbmsgYW55dGhpbmcgYWN0dWFsbHkgY2FsbHMgaXQuICBJZiBpdCB3ZXJlIGRlZmluZWQsIGl0IGNvdWxkIGJlIHVzZWQKLXRvIGNvcHkgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gIEhvd2V2ZXIsIG1vc3QgQkZEcwotc3RvcmUgZXh0cmEgc3ltYm9sIGluZm9ybWF0aW9uIGJ5IGFsbG9jYXRpbmcgc3BhY2Ugd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLXRoZSBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmUgYW5kIHN0b3JpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWV4dHJhIHNwYWNlLiAgU2luY2UgQHNhbXB7b2JqY29weX0gYW5kIG90aGVyIHByb2dyYW1zIGNvcHkgc3ltYm9sCi1pbmZvcm1hdGlvbiBieSBjb3B5aW5nIHBvaW50ZXJzIHRvIEBzYW1we2FzeW1ib2x9IHN0cnVjdHVyZXMsIHRoZQotcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBjb3BpZWQgYXMgd2VsbC4gIE1vc3QKLXRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2V0X3ByaXZhdGVfZmxhZ3N9LiAgSXQgaXMgYmFzaWNhbGx5IGEgaG9vawotZm9yIHRoZSBhc3NlbWJsZXIgdG8gc2V0IG1hZ2ljIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBQb3dlclBDCi1FTEYgYXNzZW1ibGVyIHVzZXMgaXQgdG8gc2V0IGZsYWdzIHdoaWNoIGFwcGVhciBpbiB0aGUgZV9mbGFncyBmaWVsZCBvZgotdGhlIEVMRiBoZWFkZXIuICBNb3N0IHRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgYnkgQHNhbXB7b2JqZHVtcH0gd2hlbiB0aGUgQHNhbXB7LXB9IG9wdGlvbiBpcyB1c2VkLiAgSXQKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3ByaW50X3ByaXZhdGVfZGF0YX0uICBJdCBwcmludHMgYW55IGludGVyZXN0aW5nCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQkZEIHdoaWNoIGNhbiBub3QgYmUgb3RoZXJ3aXNlIHJlcHJlc2VudGVkIGJ5IEJGRAotYW5kIHRodXMgY2FuIG5vdCBiZSBwcmludGVkIGJ5IEBzYW1we29iamR1bXB9LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbwotYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29yZQotQHN1YnNlY3Rpb24gQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBjb3JlIGZpbGVzLiAgT2J2aW91c2x5LCB0aGVzZSBmdW5jdGlvbnMgb25seSBkbyBzb21ldGhpbmcKLWludGVyZXN0aW5nIGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgY29yZSBmaWxlIHN1cHBvcnQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLUdpdmVuIGEgY29yZSBmaWxlLCB0aGlzIHJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggd2FzIHJ1biB0byBwcm9kdWNlIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIHByb2R1Y2VkIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi1HaXZlbiBhIGNvcmUgZmlsZSBhbmQgYSBCRkQgZm9yIGFuIGV4ZWN1dGFibGUsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZQotY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmUKLUBzdWJzZWN0aW9uIEFyY2hpdmUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBhcmNoaXZlIGZpbGVzLiAgTW9zdCB0YXJnZXRzIHVzZSBDT0ZGIHN0eWxlIGFyY2hpdmUgZmlsZXMKLShpbmNsdWRpbmcgRUxGIHRhcmdldHMpLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9jb2ZmfSBhcyB0aGUKLWFyZ3VtZW50IHRvIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9LiAgU29tZSB0YXJnZXRzIHVzZSBCU0QvYS5vdXQKLXN0eWxlIGFyY2hpdmVzLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9ic2R9LiAgKFRoZSBtYWluCi1kaWZmZXJlbmNlIGJldHdlZW4gQlNEIGFuZCBDT0ZGIGFyY2hpdmVzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUKLXN5bWJvbCB0YWJsZSkuICBUYXJnZXRzIHdpdGggbm8gYXJjaGl2ZSBzdXBwb3J0IHVzZQotQHNhbXB7X2JmZF9ub2FyY2hpdmV9LiAgRmluYWxseSwgYSBmZXcgdGFyZ2V0cyBoYXZlIHVudXN1YWwgYXJjaGl2ZQotaGFuZGxpbmcuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NsdXJwX2FybWFwCi1SZWFkIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcwotaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIGFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NsdXJwX2FybWFwfS4KLQotQGl0ZW0gX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLVJlYWQgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lLAotc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKLWFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZX0uCi0KLUBpdGVtIGNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi1CdWlsZCBhbmQgcmV0dXJuIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYgb25lIGlzIG5lZWRlZCB0byB3cml0ZSBvdXQKLXRoZSBhcmNoaXZlLiAgVGhpcyBhbHNvIGFkanVzdHMgdGhlIGFyY2hpdmUgaGVhZGVycyB0byByZWZlciB0byB0aGUKLWV4dGVuZGVkIG5hbWUgdGFibGUgYXBwcm9wcmlhdGVseS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBfdHJ1bmNhdGVfYXJuYW1lCi1UaGlzIGNvcGllcyBhIGZpbGUgbmFtZSBpbnRvIGFuIGFyY2hpdmUgaGVhZGVyLCB0cnVuY2F0aW5nIGl0IGFzCi1yZXF1aXJlZC4gIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfQotcm91dGluZS4gIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBpbnRlcmVzdGluZyBpbiB0YXJnZXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBleHRlbmRlZCBuYW1lIHRhYmxlcywgYnV0IEkgdGhpbmsgdGhlIEdOVSBAc2FtcHthcn0gcHJvZ3JhbQotYWx3YXlzIHVzZXMgZXh0ZW5kZWQgbmFtZSB0YWJsZXMgYW55aG93LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdHJ1bmNhdGVfYXJuYW1lfS4KLQotQGl0ZW0gX3dyaXRlX2FybWFwCi1Xcml0ZSBvdXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVzaW5nIGNhbGxzIHRvIEBzYW1we2JmZF93cml0ZX0uCi1UaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLgotVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7d3JpdGVfYXJtYXB9Ci0obm8gbGVhZGluZyB1bmRlcnNjb3JlKS4KLQotQGl0ZW0gX3JlYWRfYXJfaGRyCi1SZWFkIGFuZCBwYXJzZSBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaGFuZGxlcyBleHBhbmRpbmcgdGhlIGFyY2hpdmUKLWhlYWRlciBuYW1lIGludG8gdGhlIHJlYWwgZmlsZSBuYW1lIHVzaW5nIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgVGhpcwotaXMgY2FsbGVkIGJ5IHJvdXRpbmVzIHdoaWNoIHJlYWQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIG9yIHRoZSBhcmNoaXZlCi1pdHNlbGYuICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9yZWFkX2FyX2hkcl9mbn0uCi0KLUBpdGVtIF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLUdpdmVuIGFuIGFyY2hpdmUgYW5kIGEgQkZEIHJlcHJlc2VudGluZyBhIGZpbGUgc3RvcmVkIHdpdGhpbiB0aGUKLWFyY2hpdmUsIHJldHVybiBhIEJGRCBmb3IgdGhlIG5leHQgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7b3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlfSAobm8gbGVhZGluZwotdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9nZXRfZWx0X2F0X2luZGV4Ci1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgQkZEIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQotY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX2dldF9lbHRfYXRfaW5kZXh9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2VsdF9hdF9pbmRleH0uCi0KLUBpdGVtIF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLURvIGEgc3RhdCBvbiBhbiBlbGVtZW50IG9mIGFuIGFyY2hpdmUsIHJldHVybmluZyBpbmZvcm1hdGlvbiByZWFkIGZyb20KLXRoZSBhcmNoaXZlIGhlYWRlciAobW9kaWZpY2F0aW9uIHRpbWUsIHVpZCwgZ2lkLCBmaWxlIG1vZGUsIHNpemUpLiAgVGhpcwotaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc3RhdF9hcmNoX2VsdH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zdGF0X2FyY2hfZWx0fS4KLQotQGl0ZW0gX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLUFmdGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBoYXZlIGJlZW4gd3JpdHRlbiBvdXQsIHVwZGF0ZQotdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdG8gYmUgbmV3ZXIgdGhhbiB0aGF0IG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGEub3V0IHN0eWxlIGFyY2hpdmVzLiAgVGhpcyBpcyBub3JtYWxseQotY2FsbGVkIGJ5IHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcKLWZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCB0YWJsZSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfU1lNQk9MU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHN5bWJvbHMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cyByZXR1cm4gdGhlCi1hbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yIGFsbCB0aGUKLXN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzeW1ib2wKLWluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfZ2V0X3N5bXRhYgotUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4KLQotQGl0ZW0gX21ha2VfZW1wdHlfc3ltYm9sCi1DcmVhdGUgYW4gZW1wdHkgc3ltYm9sIGZvciB0aGUgQkZELiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBtb3N0IHRhcmdldHMKLXN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIHdpdGggZWFjaCBzeW1ib2wgYnkgYWxsb2NhdGluZyBhIHN0cnVjdHVyZQotbGFyZ2VyIHRoYW4gYW4gQHNhbXB7YXN5bWJvbH0gYW5kIHN0b3JpbmcgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGF0IHRoZQotZW5kLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LCBhbmQgcmV0dXJuCi13aGF0IGxvb2tzIGxpa2UgYSBwb2ludGVyIHRvIGFuIGVtcHR5IEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfbWFrZV9lbXB0eV9zeW1ib2x9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfbWFrZV9lbXB0eV9zeW1ib2x9LgotCi1AaXRlbSBfcHJpbnRfc3ltYm9sCi1QcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcHJpbnRfc3ltYm9sfS4gIE9uZSBvZiB0aGUgYXJndW1lbnRzIGluZGljYXRlcyB3aGF0IHNvcnQgb2YKLWluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfbmFtZQotSnVzdCBwcmludCB0aGUgc3ltYm9sIG5hbWUuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX21vcmUKLVByaW50IHRoZSBzeW1ib2wgbmFtZSBhbmQgc29tZSBpbnRlcmVzdGluZyBmbGFncy4gIEkgZG9uJ3QgdGhpbmsKLWFueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcy4KLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfYWxsCi1QcmludCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgdXNlZCBieSBAc2FtcHtvYmpkdW1wfQotd2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LXR9IG9wdGlvbi4KLUBlbmQgdGFibGUKLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3ByaW50X3N5bWJvbH0uCi0KLUBpdGVtIF9nZXRfc3ltYm9sX2luZm8KLVJldHVybiBhIHN0YW5kYXJkIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfc3ltYm9sX2luZm99LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X3N5bWJvbF9pbmZvfS4KLQotQGl0ZW0gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi1SZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHdvdWxkIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUgbmFtZSBvZiBhCi1sb2NhbCBsYWJlbC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfaXNfbG9jYWxfbGFiZWx9IGFuZAotQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsX25hbWV9LiAgTG9jYWwgbGFiZWxzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQgYnkKLXRoZSBhc3NlbWJsZXIuICBJbiB0aGUgbGlua2VyLCB0aGlzIGRlZmluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLUBzYW1wey14fSBhbmQgQHNhbXB7LVh9IG9wdGlvbnMuCi0KLUBpdGVtIF9nZXRfbGluZW5vCi1SZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLWZvciBhIENPRkYgdGFyZ2V0LiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB3cml0aW5nIG91dCBDT0ZGIGxpbmUgbnVtYmVycy4KLQotQGl0ZW0gX2ZpbmRfbmVhcmVzdF9saW5lCi1HaXZlbiBhbiBhZGRyZXNzIHdpdGhpbiBhIHNlY3Rpb24sIHVzZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGZpbmQKLXRoZSBtYXRjaGluZyBmaWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZCBsaW5lIG51bWJlciwgaWYgYW55LiAgVGhpcyBpcwotY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluZF9uZWFyZXN0X2xpbmV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZmluZF9uZWFyZXN0X2xpbmV9LgotCi1AaXRlbSBfYmZkX21ha2VfZGVidWdfc3ltYm9sCi1NYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIENPRkYgdGFyZ2V0LAotd2hlcmUgaXQgc2ltcGx5IHJldHVybnMgYSBzeW1ib2wgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHtOX0RFQlVHfSBzZWN0aW9uIHdoZW4gaXQgaXMgd3JpdHRlbiBvdXQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9tYWtlX2RlYnVnX3N5bWJvbH0uCi0KLUBpdGVtIF9yZWFkX21pbmlzeW1ib2xzCi1NaW5pc3ltYm9scyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJvZ3JhbXMgbGlrZQotQHNhbXB7bm19LiAgQSBtaW5pc3ltYm9sIGlzIGEgY29va2llIHBvaW50aW5nIHRvIGludGVybmFsIHN5bWJvbAotaW5mb3JtYXRpb24gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlIHRvIGV4dHJhY3QgY29tcGxldGUgc3ltYm9sCi1pbmZvcm1hdGlvbi4gIFRoaXMgcGVybWl0cyBCRkQgdG8gbm90IGNvbnZlcnQgYWxsIHRoZSBzeW1ib2xzIGludG8KLWdlbmVyaWMgZm9ybSwgYnV0IHRvIGluc3RlYWQgY29udmVydCB0aGVtIG9uZSBhdCBhIHRpbWUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9yZWFkX21pbmlzeW1ib2xzfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgaW1wbGVtZW50IHRoaXMsCi1hbmQganVzdCB1c2UgZ2VuZXJpYyBzdXBwb3J0IHdoaWNoIGlzIGJhc2VkIG9uIHVzaW5nIHN0YW5kYXJkCi1Ac2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBfbWluaXN5bWJvbF90b19zeW1ib2wKLUNvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgc3RhbmRhcmQgQHNhbXB7YXN5bWJvbH0uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9taW5pc3ltYm9sX3RvX3N5bWJvbH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jcwotQHN1YnNlY3Rpb24gUmVsb2NhdGlvbiBzdXBwb3J0Ci1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggcmVsb2NhdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4gIEluIHByYWN0aWNlIG1vc3QKLXRhcmdldHMgcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0KLXBvaW50ZXJzIGZvciBhbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kCi1zdG9yZSB0aGUgYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfcmVsb2MKLVJldHVybiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3JlbG9jfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uCi0KLUBpdGVtIF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLUdpdmVuIGEgcmVsb2NhdGlvbiBjb2RlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlCi0oQHB4cmVme0JGRCByZWxvY2F0aW9uIGNvZGVzfSkuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciB3cml0ZQotQHN1YnNlY3Rpb24gT3V0cHV0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1dSSVRFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCB3cml0aW5nIG91dCBhIEJGRC4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfc2V0X2FyY2hfbWFjaAotU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgbnVtYmVyIGZvciBhIEJGRC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3NldF9hcmNoX21hY2h9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCB0aGlzIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2h9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X2FyY2hfbWFjaH0uCi0KLUBpdGVtIF9zZXRfc2VjdGlvbl9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGxpbmsKLUBzdWJzZWN0aW9uIExpbmtlciBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfTElOS30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi1saW5rZXIuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NpemVvZl9oZWFkZXJzCi1SZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBCRkQuICBUaGlzIGlzCi11c2VkIHRvIGltcGxlbWVudCB0aGUgQHNhbXB7U0laRU9GX0hFQURFUlN9IGxpbmtlciBzY3JpcHQgZnVuY3Rpb24uICBJdAotaXMgbm9ybWFsbHkgdXNlZCB0byBhbGlnbiB0aGUgZmlyc3Qgc2VjdGlvbiBhdCBhbiBlZmZpY2llbnQgcG9zaXRpb24gb24KLXRoZSBwYWdlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30uICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfc2l6ZW9mX2hlYWRlcnN9LgotCi1AaXRlbSBfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGFuZCBhcHBseSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLVRoaXMgaGFuZGxlcyBib3RoIGEgZmluYWwgbGluayBhbmQgYSByZWxvY2F0ZWFibGUgbGluazsgaW4gdGhlIGxhdHRlcgotY2FzZSwgaXQgYWRqdXN0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCBpdCBieQotY2FsbGluZyBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LgotCi1AaXRlbSBfYmZkX3JlbGF4X3NlY3Rpb24KLVRyeSB0byB1c2UgcmVsYXhhdGlvbiB0byBzaHJpbmsgdGhlIHNpemUgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBsaW5rZXIgd2hlbiB0aGUgQHNhbXB7LXJlbGF4fSBvcHRpb24gaXMgdXNlZC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3JlbGF4X3NlY3Rpb259LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0IGFueSBzb3J0IG9mCi1yZWxheGF0aW9uLgotCi1AaXRlbSBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLUNyZWF0ZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgdG8gdXNlIGZvciB0aGUgbGlua2VyLiAgVGhpcyBsaW5rZXIgaG9vawotcGVybWl0cyB0aGUgYmFja2VuZCB0byBjb250cm9sIHRoZSBzaXplIGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudHMKLWluIHRoZSBsaW5rZXIgc3ltYm9sIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlfS4KLQotQGl0ZW0gX2JmZF9saW5rX2FkZF9zeW1ib2xzCi1HaXZlbiBhbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlLCBhZGQgYWxsIHN5bWJvbHMgaW50byB0aGUgbGlua2VyCi1zeW1ib2wgaGFzaCB0YWJsZS4gIFVzZSBjYWxsYmFja3MgdG8gdGhlIGxpbmtlciB0byBpbmNsdWRlIGFyY2hpdmUKLWVsZW1lbnRzIGluIHRoZSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9saW5rX2FkZF9zeW1ib2xzfS4KLQotQGl0ZW0gX2JmZF9maW5hbF9saW5rCi1GaW5pc2ggdGhlIGxpbmtpbmcgcHJvY2Vzcy4gIFRoZSBsaW5rZXIgY2FsbHMgdGhpcyBob29rIGFmdGVyIGFsbCBvZiB0aGUKLWlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGZpbmlzaCB0aGUgbGluayBhbmQKLWdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluYWxfbGlua30uCi0KLUBpdGVtIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi1JIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIE5vdGhpbmcgc2VlbXMgdG8gY2FsbCBpdC4gIFRoZSBvbmx5Ci1ub24tdHJpdmlhbCBkZWZpbml0aW9uIGlzIGluIEBmaWxle3NvbS5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYwotQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9EWU5BTUlDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJlYWQKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbAotc3ltYm9sIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotUmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4KLQotQGl0ZW0gX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgSW4gcHJhY3RpY2UgbW9zdCB0YXJnZXRzCi1yZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBAc2FtcHthcmVsZW50fSBwb2ludGVycyBmb3IKLWFsbCB0aGUgcmVsb2NhdGlvbnMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlCi1hY3R1YWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLVJlYWQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBzZWN0aW9uIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBjaW5kZXggZ2VuZXJhdGVkIGZpbGVzIGluIGJmZAotQGNpbmRleCBiZmQgZ2VuZXJhdGVkIGZpbGVzCi0KLUJGRCBjb250YWlucyBzZXZlcmFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlbS4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIHdoZW4geW91Ci1jb25maWd1cmUgQkZELiAgU29tZSBmaWxlcyBhcmUgY3JlYXRlZCBhdCBtYWtlIHRpbWUsIHdoZW4geW91IGJ1aWxkCi1CRkQuICBTb21lIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlYnVpbHQgYXQgbWFrZSB0aW1lLCBidXQgb25seSBpZgoteW91IGNvbmZpZ3VyZSB3aXRoIHRoZSBAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbi4gIFNvbWUKLWZpbGVzIGxpdmUgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnktLS10aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggeW91IHJ1bgotY29uZmlndXJlLS0tYW5kIHNvbWUgbGl2ZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIEFsbCBmaWxlcyB0aGF0IGxpdmUKLWluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjaGVja2VkIGludG8gdGhlIENWUyByZXBvc2l0b3J5LgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGJmZC5oCi1AY2luZGV4IEBmaWxle2JmZC5ofQotQGNpbmRleCBAZmlsZXtiZmQtaW4zLmh9Ci1MaXZlcyBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgYXQgbWFrZSB0aW1lIGZyb20KLUBmaWxle2JmZC1pbjIuaH0gdmlhIEBmaWxle2JmZC1pbjMuaH0uICBAZmlsZXtiZmQtaW4zLmh9IGlzIGNyZWF0ZWQgYXQKLWNvbmZpZ3VyZSB0aW1lIGZyb20gQGZpbGV7YmZkLWluMi5ofS4gIFRoZXJlIGFyZSBhdXRvbWF0aWMgZGVwZW5kZW5jaWVzCi10byByZWJ1aWxkIEBmaWxle2JmZC1pbjMuaH0gYW5kIGhlbmNlIEBmaWxle2JmZC5ofSBpZiBAZmlsZXtiZmQtaW4yLmh9Ci1jaGFuZ2VzLCBzbyB5b3UgY2FuIG5vcm1hbGx5IGlnbm9yZSBAZmlsZXtiZmQtaW4zLmh9LCBhbmQganVzdCB0aGluawotYWJvdXQgQGZpbGV7YmZkLWluMi5ofSBhbmQgQGZpbGV7YmZkLmh9LgotCi1AZmlsZXtiZmQuaH0gaXMgYnVpbHQgYnkgcmVwbGFjaW5nIGEgZmV3IHN0cmluZ3MgaW4gQGZpbGV7YmZkLWluMi5ofS4KLVRvIHNlZSB0aGVtLCBzZWFyY2ggZm9yIEBzYW1we0BAfSBpbiBAZmlsZXtiZmQtaW4yLmh9LiAgVGhleSBtYWlubHkKLWNvbnRyb2wgd2hldGhlciBCRkQgaXMgYnVpbHQgZm9yIGEgMzIgYml0IHRhcmdldCBvciBhIDY0IGJpdCB0YXJnZXQuCi0KLUBpdGVtIGJmZC1pbjIuaAotQGNpbmRleCBAZmlsZXtiZmQtaW4yLmh9Ci1MaXZlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIENyZWF0ZWQgZnJvbSBAZmlsZXtiZmQtaW4uaH0gYW5kIHNldmVyYWwKLW90aGVyIEJGRCBzb3VyY2UgZmlsZXMuICBJZiB5b3UgY29uZmlndXJlIHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiwgQGZpbGV7YmZkLWluMi5ofSBpcyByZWJ1aWx0Ci1hdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgotCi1AaXRlbSBlbGYzMi10YXJnZXQuaAotQGl0ZW14IGVsZjY0LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2VsZjMyLXRhcmdldC5ofQotQGNpbmRleCBAZmlsZXtlbGY2NC10YXJnZXQuaH0KLUxpdmUgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9LgotVGhlc2UgZmlsZXMgYXJlIHZlcnNpb25zIG9mIEBmaWxle2VsZnh4LXRhcmdldC5ofSBjdXN0b21pemVkIGZvciBlaXRoZXIKLWEgMzIgYml0IEVMRiB0YXJnZXQgb3IgYSA2NCBiaXQgRUxGIHRhcmdldC4KLQotQGl0ZW0gbGliYmZkLmgKLUBjaW5kZXggQGZpbGV7bGliYmZkLmh9Ci1MaXZlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIENyZWF0ZWQgZnJvbSBAZmlsZXtsaWJiZmQtaW4uaH0gYW5kCi1zZXZlcmFsIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMuICBJZiB5b3UgY29uZmlndXJlIHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiwgQGZpbGV7bGliYmZkLmh9IGlzIHJlYnVpbHQKLWF1dG9tYXRpY2FsbHkgd2hlbiBhIHNvdXJjZSBmaWxlIGNoYW5nZXMuCi0KLUBpdGVtIGxpYmNvZmYuaAotQGNpbmRleCBAZmlsZXtsaWJjb2ZmLmh9Ci1MaXZlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIENyZWF0ZWQgZnJvbSBAZmlsZXtsaWJjb2ZmLWluLmh9IGFuZAotQGZpbGV7Y29mZmNvZGUuaH0uICBJZiB5b3UgY29uZmlndXJlIHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiwgQGZpbGV7bGliY29mZi5ofSBpcyByZWJ1aWx0Ci1hdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgotCi1AaXRlbSB0YXJnbWF0Y2guaAotQGNpbmRleCBAZmlsZXt0YXJnbWF0Y2guaH0KLUxpdmVzIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBhdCBtYWtlIHRpbWUgZnJvbQotQGZpbGV7Y29uZmlnLmJmZH0uICBUaGlzIGZpbGUgaXMgdXNlZCB0byBtYXAgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBpbnRvCi1CRkQgdGFyZ2V0IHZlY3RvciB2YXJpYWJsZSBuYW1lcyBhdCBydW4gdGltZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIG11bHRpcGxlIGNvbXBpbGF0aW9ucwotQHNlY3Rpb24gRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECi1TZXZlcmFsIGZpbGVzIGluIEJGRCBhcmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMuICBCeSB0aGlzIEkgbWVhbiB0aGF0Ci10aGVyZSBhcmUgaGVhZGVyIGZpbGVzIHdoaWNoIGNvbnRhaW4gZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGVzZSBoZWFkZXIKLWZpbGVzIGFyZSBpbmNsdWRlZCBieSBvdGhlciBmaWxlcywgYW5kIHRodXMgdGhlIGZ1bmN0aW9ucyBhcmUgY29tcGlsZWQKLW9uY2UgcGVyIGZpbGUgd2hpY2ggaW5jbHVkZXMgdGhlbS4KLQotUHJlcHJvY2Vzc29yIG1hY3JvcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb21waWxhdGlvbiwgc28gdGhhdCBlYWNoCi10aW1lIHRoZSBmaWxlcyBhcmUgY29tcGlsZWQgdGhlIHJlc3VsdGluZyBmdW5jdGlvbnMgYXJlIHNsaWdodGx5Ci1kaWZmZXJlbnQuICBOYXR1cmFsbHksIGlmIHRoZXkgd2VyZW4ndCBkaWZmZXJlbnQsIHRoZXJlIHdvdWxkIGJlIG5vCi1yZWFzb24gdG8gY29tcGlsZSB0aGVtIG11bHRpcGxlIHRpbWVzLgotCi1UaGlzIGlzIGEgbm90IGEgcGFydGljdWxhcmx5IGdvb2QgcHJvZ3JhbW1pbmcgdGVjaG5pcXVlLCBhbmQgZnV0dXJlIEJGRAotd29yayBzaG91bGQgYXZvaWQgaXQuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1TaW5jZSB0aGlzIHRlY2huaXF1ZSBpcyByYXJlbHkgdXNlZCwgZXZlbiBleHBlcmllbmNlZCBDIHByb2dyYW1tZXJzIGZpbmQKLWl0IGNvbmZ1c2luZy4KLQotQGl0ZW0KLUl0IGlzIGRpZmZpY3VsdCB0byBkZWJ1ZyBwcm9ncmFtcyB3aGljaCB1c2UgQkZELCBzaW5jZSB0aGVyZSBpcyBubyB3YXkKLXRvIGRlc2NyaWJlIHdoaWNoIHZlcnNpb24gb2YgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHlvdSBhcmUgbG9va2luZyBhdC4KLQotQGl0ZW0KLVByb2dyYW1zIHdoaWNoIHVzZSBCRkQgd2luZCB1cCBpbmNvcnBvcmF0aW5nIHR3byBvciBtb3JlIHNsaWdodGx5Ci1kaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgZnVuY3Rpb24sIHdoaWNoIHdhc3RlcyBzcGFjZSBpbiB0aGUKLWV4ZWN1dGFibGUuCi0KLUBpdGVtCi1UaGlzIHRlY2huaXF1ZSBpcyBuZXZlciByZXF1aXJlZCBub3IgaXMgaXQgZXNwZWNpYWxseSBlZmZpY2llbnQuICBJdCBpcwotYWx3YXlzIHBvc3NpYmxlIHRvIHVzZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHN0cnVjdHVyZXMgaG9sZGluZwotZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG1hZ2ljIGNvbnN0YW50cyBpbnN0ZWFkLgotQGVuZCBpdGVtaXplCi0KLVRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gYW91dC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXthb3V0LXRhcmdldC5ofQotRGVzY3JpYmVzIGEgZmV3IGZ1bmN0aW9ucyBhbmQgdGhlIHRhcmdldCB2ZWN0b3IgZm9yIGEub3V0IHRhcmdldHMuICBUaGlzCi1pcyB1c2VkIGJ5IGluZGl2aWR1YWwgYS5vdXQgdGFyZ2V0cyB3aXRoIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZgotQHNhbXB7Tl9UWFRBRERSfSBhbmQgc2ltaWxhciBhLm91dCBtYWNyb3MuCi0KLUBpdGVtIGFvdXRmMS5oCi1AY2luZGV4IEBmaWxle2FvdXRmMS5ofQotSW1wbGVtZW50cyBzdGFuZGFyZCBTdW5PUyBhLm91dCBmaWxlcy4gIEluIHByaW5jaXBsZSBpdCBzdXBwb3J0cyA2NCBiaXQKLWEub3V0IHRhcmdldHMgYmFzZWQgb24gdGhlIHByZXByb2Nlc3NvciBtYWNybyBAc2FtcHtBUkNIX1NJWkV9LCBidXQKLXNpbmNlIGFsbCBrbm93biBhLm91dCB0YXJnZXRzIGFyZSAzMiBiaXRzLCB0aGlzIGNvZGUgbWF5IG9yIG1heSBub3QKLXdvcmsuICBUaGlzIGZpbGUgaXMgb25seSBpbmNsdWRlZCBieSBhIGZldyBvdGhlciBmaWxlcywgYW5kIGl0IGlzCi1kaWZmaWN1bHQgdG8ganVzdGlmeSBpdHMgZXhpc3RlbmNlLgotCi1AaXRlbSBhb3V0eC5oCi1AY2luZGV4IEBmaWxle2FvdXR4Lmh9Ci1JbXBsZW1lbnRzIGJhc2ljIGEub3V0IHN1cHBvcnQgcm91dGluZXMuICBUaGlzIGZpbGUgY2FuIGJlIGNvbXBpbGVkIGZvcgotZWl0aGVyIDMyIG9yIDY0IGJpdCBzdXBwb3J0LiAgU2luY2UgYWxsIGtub3duIGEub3V0IHRhcmdldHMgYXJlIDMyIGJpdHMsCi10aGUgNjQgYml0IHN1cHBvcnQgbWF5IG9yIG1heSBub3Qgd29yay4gIEkgYmVsaWV2ZSB0aGUgb3JpZ2luYWwKLWludGVudGlvbiB3YXMgdGhhdCB0aGlzIGZpbGUgd291bGQgb25seSBiZSBpbmNsdWRlZCBieSBAc2FtcHthb3V0MzIuY30KLWFuZCBAc2FtcHthb3V0NjQuY30sIGFuZCB0aGF0IG90aGVyIGEub3V0IHRhcmdldHMgd291bGQgc2ltcGx5IHJlZmVyIHRvCi10aGUgZnVuY3Rpb25zIGl0IGRlZmluZWQuICBVbmZvcnR1bmF0ZWx5LCBzb21lIG90aGVyIGEub3V0IHRhcmdldHMKLXN0YXJ0ZWQgaW5jbHVkaW5nIGl0IGRpcmVjdGx5LCBsZWFkaW5nIHRvIGEgc29tZXdoYXQgY29uZnVzZWQgc3RhdGUgb2YKLWFmZmFpcnMuCi0KLUBpdGVtIGNvZmZjb2RlLmgKLUBjaW5kZXggQGZpbGV7Y29mZmNvZGUuaH0KLUltcGxlbWVudHMgYmFzaWMgQ09GRiBzdXBwb3J0IHJvdXRpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5Ci1DT0ZGIHRhcmdldC4gIEl0IGltcGxlbWVudHMgY29kZSB3aGljaCBoYW5kbGVzIENPRkYgbWFnaWMgbnVtYmVycyBhcwotd2VsbCBhcyB2YXJpb3VzIGhvb2sgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgZ2VuZXJpYyBDT0ZGIGZ1bmN0aW9ucyBpbgotQGZpbGV7Y29mZmdlbi5jfS4gIFRoaXMgZmlsZSBpcyBjb250cm9sbGVkIGJ5IGEgbnVtYmVyIG9mIGRpZmZlcmVudAotbWFjcm9zLCBhbmQgbW9yZSBhcmUgYWRkZWQgcmVndWxhcmx5LgotCi1AaXRlbSBjb2Zmc3dhcC5oCi1AY2luZGV4IEBmaWxle2NvZmZzd2FwLmh9Ci1JbXBsZW1lbnRzIENPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkKLUBmaWxle2NvZmZjb2RlLmh9LCBhbmQgdGh1cyBieSBldmVyeSBDT0ZGIHRhcmdldC4gIEl0IGltcGxlbWVudHMgdGhlCi1yb3V0aW5lcyB3aGljaCBzd2FwIENPRkYgc3RydWN0dXJlcyBiZXR3ZWVuIGludGVybmFsIGFuZCBleHRlcm5hbAotZm9ybWF0LiAgVGhlIG1haW4gY29udHJvbCBmb3IgdGhpcyBmaWxlIGlzIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmUKLWRlZmluaXRpb25zIGluIHRoZSBmaWxlcyBpbiB0aGUgQGZpbGV7aW5jbHVkZS9jb2ZmfSBkaXJlY3RvcnkuICBBIENPRkYKLXRhcmdldCBmaWxlIHdpbGwgaW5jbHVkZSBvbmUgb2YgdGhvc2UgZmlsZXMgYmVmb3JlIGluY2x1ZGluZwotQGZpbGV7Y29mZmNvZGUuaH0gYW5kIHRodXMgQGZpbGV7Y29mZnN3YXAuaH0uICBUaGVyZSBhcmUgYSBmZXcgb3RoZXIKLW1hY3JvcyB3aGljaCBhZmZlY3QgQGZpbGV7Y29mZnN3YXAuaH0gYXMgd2VsbCwgbW9zdGx5IGRlc2NyaWJpbmcgd2hldGhlcgotY2VydGFpbiBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIGV4dGVybmFsIHN0cnVjdHVyZXMuCi0KLUBpdGVtIGVjb2Zmc3dhcC5oCi1AY2luZGV4IEBmaWxle2Vjb2Zmc3dhcC5ofQotSW1wbGVtZW50cyBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoaXMgaXMgbGlrZSBAZmlsZXtjb2Zmc3dhcC5ofSwgYnV0Ci1mb3IgRUNPRkYuICBJdCBpcyBpbmNsdWRlZCBieSB0aGUgRUNPRkYgdGFyZ2V0IGZpbGVzIChvZiB3aGljaCB0aGVyZSBhcmUKLW9ubHkgdHdvKS4gIFRoZSBjb250cm9sIGlzIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7RUNPRkZfMzJ9IG9yCi1Ac2FtcHtFQ09GRl82NH0uCi0KLUBpdGVtIGVsZmNvZGUuaAotQGNpbmRleCBAZmlsZXtlbGZjb2RlLmh9Ci1JbXBsZW1lbnRzIEVMRiBmdW5jdGlvbnMgdGhhdCB1c2UgZXh0ZXJuYWwgc3RydWN0dXJlIGRlZmluaXRpb25zLiAgVGhpcwotZmlsZSBpcyBpbmNsdWRlZCBieSB0d28gb3RoZXIgZmlsZXM6IEBmaWxle2VsZjMyLmN9IGFuZCBAZmlsZXtlbGY2NC5jfS4KLUl0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIEBzYW1we0FSQ0hfU0laRX0gbWFjcm8gd2hpY2ggaXMgZGVmaW5lZCB0byBiZQotQHNhbXB7MzJ9IG9yIEBzYW1wezY0fSBiZWZvcmUgaW5jbHVkaW5nIGl0LiAgVGhlIEBzYW1we05BTUV9IG1hY3JvIGlzCi11c2VkIGludGVybmFsbHkgdG8gZ2l2ZSB0aGUgZnVuY3Rpb25zIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byB0YXJnZXQKLXNpemVzLgotCi1AaXRlbSBlbGZjb3JlLmgKLUBjaW5kZXggQGZpbGV7ZWxmY29yZS5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byBFTEYgY29yZQotZmlsZXMuICBUaGlzIGlzIGluY2x1ZGVkIG9ubHkgYnkgQGZpbGV7ZWxmY29kZS5ofS4KLQotQGl0ZW0gZWxmbGluay5oCi1AY2luZGV4IEBmaWxle2VsZmxpbmsuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBmdW5jdGlvbnMgdXNlZCBieSB0aGUgRUxGIGxpbmtlci4gIFRoaXMKLWlzIGluY2x1ZGVkIG9ubHkgYnkgQGZpbGV7ZWxmY29kZS5ofS4KLQotQGl0ZW0gZWxmeHgtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9Ci1UaGlzIGZpbGUgaXMgdGhlIHNvdXJjZSBmb3IgdGhlIGdlbmVyYXRlZCBmaWxlcyBAZmlsZXtlbGYzMi10YXJnZXQuaH0KLWFuZCBAZmlsZXtlbGY2NC10YXJnZXQuaH0sIG9uZSBvZiB3aGljaCBpcyBpbmNsdWRlZCBieSBldmVyeSBFTEYgdGFyZ2V0LgotSXQgZGVmaW5lcyB0aGUgRUxGIHRhcmdldCB2ZWN0b3IuCi0KLUBpdGVtIGZyZWVic2QuaAotQGNpbmRleCBAZmlsZXtmcmVlYnNkLmh9Ci1QcmVzdW1hYmx5IGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGJ5IGFsbCBGcmVlQlNEIHRhcmdldHMsIGJ1dCBpbiBmYWN0Ci10aGVyZSBpcyBvbmx5IG9uZSBzdWNoIHRhcmdldCwgQHNhbXB7aTM4Ni1mcmVlYnNkfS4gIFRoaXMgZGVmaW5lcyBhCi1mdW5jdGlvbiB1c2VkIHRvIHNldCB0aGUgcmlnaHQgbWFnaWMgbnVtYmVyIGZvciBGcmVlQlNELCBhcyB3ZWxsIGFzCi12YXJpb3VzIG1hY3JvcywgYW5kIGluY2x1ZGVzIEBmaWxle2FvdXQtdGFyZ2V0Lmh9LgotCi1AaXRlbSBuZXRic2QuaAotQGNpbmRleCBAZmlsZXtuZXRic2QuaH0KLUxpa2UgQGZpbGV7ZnJlZWJzZC5ofSwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgZmlsZXMgd2hpY2ggaW5jbHVkZQotaXQuCi0KLUBpdGVtIG5sbS10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtubG0tdGFyZ2V0Lmh9Ci1EZWZpbmVzIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBhIHN0YW5kYXJkIE5MTSB0YXJnZXQuCi0KLUBpdGVtIG5sbWNvZGUuaAotQGNpbmRleCBAZmlsZXtubG1jb2RlLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgTkxNIHRhcmdldHMuICBUaGlzIGlzIG9ubHkgaW5jbHVkZWQgYnkKLUBmaWxle25sbTMyLmN9IGFuZCBAZmlsZXtubG02NC5jfSwgYm90aCBvZiB3aGljaCBkZWZpbmUgdGhlIG1hY3JvCi1Ac2FtcHtBUkNIX1NJWkV9IHRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlLiAgVGhlcmUgYXJlIG5vIDY0IGJpdCBOTE0KLXRhcmdldHMgYW55aG93LCBzbyB0aGlzIGlzIHNvcnQgb2YgdXNlbGVzcy4KLQotQGl0ZW0gbmxtc3dhcC5oCi1AY2luZGV4IEBmaWxle25sbXN3YXAuaH0KLUxpa2UgQGZpbGV7Y29mZnN3YXAuaH0sIGJ1dCBmb3IgTkxNIHRhcmdldHMuICBUaGlzIGlzIGluY2x1ZGVkIGJ5IGVhY2gKLU5MTSB0YXJnZXQsIGJ1dCBJIHRoaW5rIGl0IHdpbmRzIHVwIGNvbXBpbGluZyB0byB0aGUgZXhhY3Qgc2FtZSBjb2RlIGZvcgotZXZlcnkgdGFyZ2V0LCBhbmQgYXMgc3VjaCBpcyBmYWlybHkgdXNlbGVzcy4KLQotQGl0ZW0gcGVpY29kZS5oCi1AY2luZGV4IEBmaWxle3BlaWNvZGUuaH0KLVByb3ZpZGVzIHN3YXBwaW5nIHJvdXRpbmVzIGFuZCBvdGhlciBob29rcyBmb3IgUEUgdGFyZ2V0cy4KLUBmaWxle2NvZmZjb2RlLmh9IHdpbGwgaW5jbHVkZSB0aGlzIHJhdGhlciB0aGFuIEBmaWxle2NvZmZzd2FwLmh9IGZvciBhCi1QRSB0YXJnZXQuICBUaGlzIGRlZmluZXMgUEUgc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIENPRkYgc3dhcHBpbmcKLXJvdXRpbmVzLCBhbmQgYWxzbyBkZWZpbmVzIHNvbWUgbWFjcm9zIHdoaWNoIGNvbnRyb2wgQGZpbGV7Y29mZmNvZGUuaH0KLWl0c2VsZi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLUBzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi1AY2luZGV4IGJmZCByZWxvY2F0aW9uIGhhbmRsaW5nCi1AY2luZGV4IHJlbG9jYXRpb25zIGluIGJmZAotCi1UaGUgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbnMgaXMgb25lIG9mIHRoZSBtb3JlIGNvbmZ1c2luZyBhc3BlY3RzIG9mIEJGRC4KLVJlbG9jYXRpb24gaGFuZGxpbmcgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gdmFyaW91cyBkaWZmZXJlbnQgd2F5cywgYWxsCi1zb21ld2hhdCBpbmNvbXBhdGlibGUsIG5vbmUgcGVyZmVjdC4KLQotQG1lbnUKLSogQkZEIHJlbG9jYXRpb24gY29uY2VwdHM6OglCRkQgcmVsb2NhdGlvbiBjb25jZXB0cwotKiBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnM6OglCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKLSogQkZEIHJlbG9jYXRpb24gY29kZXM6OglCRkQgcmVsb2NhdGlvbiBjb2RlcwotKiBCRkQgcmVsb2NhdGlvbiBmdXR1cmU6OglCRkQgcmVsb2NhdGlvbiBmdXR1cmUKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBjb25jZXB0cwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLQotQSByZWxvY2F0aW9uIGlzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB3aGVuIGxpbmtpbmcuICBJdAotZGVzY3JpYmVzIGEgY2hhbmdlIHRvIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGUgY2hhbmdlIGlzIG5vcm1hbGx5Ci1iYXNlZCBvbiB0aGUgZmluYWwgdmFsdWUgb2Ygb25lIG9yIG1vcmUgc3ltYm9scy4gIFJlbG9jYXRpb25zIGFyZQotY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgY3JlYXRlcyBhbiBvYmplY3QgZmlsZS4KLQotTW9zdCByZWxvY2F0aW9ucyBhcmUgc2ltcGxlLiAgQSB0eXBpY2FsIHNpbXBsZSByZWxvY2F0aW9uIGlzIHRvIHNldCAzMgotYml0cyBhdCBhIGdpdmVuIG9mZnNldCBpbiBhIHNlY3Rpb24gdG8gdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgVGhpcyB0eXBlCi1vZiByZWxvY2F0aW9uIHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgY29kZSBsaWtlIEBjb2Rle2ludCAqcCA9ICZpO30gd2hlcmUKLUBzYW1we3B9IGFuZCBAc2FtcHtpfSBhcmUgZ2xvYmFsIHZhcmlhYmxlcy4gIEEgcmVsb2NhdGlvbiBmb3IgdGhlIHN5bWJvbAotQHNhbXB7aX0gd291bGQgYmUgZ2VuZXJhdGVkIHN1Y2ggdGhhdCB0aGUgbGlua2VyIHdvdWxkIGluaXRpYWxpemUgdGhlCi1hcmVhIG9mIG1lbW9yeSB3aGljaCBob2xkcyB0aGUgdmFsdWUgb2YgQHNhbXB7cH0gdG8gdGhlIHZhbHVlIG9mIHRoZQotc3ltYm9sIEBzYW1we2l9LgotCi1TbGlnaHRseSBtb3JlIGNvbXBsZXggcmVsb2NhdGlvbnMgbWF5IGluY2x1ZGUgYW4gYWRkZW5kLCB3aGljaCBpcyBhCi1jb25zdGFudCB0byBhZGQgdG8gdGhlIHN5bWJvbCB2YWx1ZSBiZWZvcmUgdXNpbmcgaXQuICBJbiBzb21lIGNhc2VzIGEKLXJlbG9jYXRpb24gd2lsbCByZXF1aXJlIGFkZGluZyB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZSBleGlzdGluZyBjb250ZW50cwotb2YgdGhlIHNlY3Rpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gb3RoZXJzIHRoZSByZWxvY2F0aW9uIHdpbGwgc2ltcGx5Ci1yZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiB3aXRoIHRoZSBzeW1ib2wgdmFsdWUuICBTb21lCi1yZWxvY2F0aW9ucyBhcmUgUEMgcmVsYXRpdmUsIHNvIHRoYXQgdGhlIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXNlY3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgYW5kIHRoZSBmaW5hbAotYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQotSW4gZ2VuZXJhbCwgcmVsb2NhdGlvbnMgY2FuIGJlIGFyYml0cmFyaWx5IGNvbXBsZXguICBGb3IgZXhhbXBsZSwKLXJlbG9jYXRpb25zIHVzZWQgaW4gZHluYW1pYyBsaW5raW5nIHN5c3RlbXMgb2Z0ZW4gcmVxdWlyZSB0aGUgbGlua2VyIHRvCi1hbGxvY2F0ZSBzcGFjZSBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIGFuZCB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhhdAotc2VjdGlvbiBhcyB0aGUgdmFsdWUgdG8gc3RvcmUuICBJbiB0aGUgSUVFRSBvYmplY3QgZmlsZSBmb3JtYXQsCi1yZWxvY2F0aW9ucyBtYXkgaW52b2x2ZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMuCi0KLVdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlIGxpbmtlciBtYXkgb3IgbWF5IG5vdCBoYXZlIHRvIGRvCi1hbnl0aGluZyB3aXRoIGEgcmVsb2NhdGlvbiwgZGVwZW5kaW5nIHVwb24gdGhlIGRlZmluaXRpb24gb2YgdGhlCi1yZWxvY2F0aW9uLiAgU2ltcGxlIHJlbG9jYXRpb25zIGdlbmVyYWxseSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lhbAotYWN0aW9uLgotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGZ1bmN0aW9ucwotCi1JbiBCRkQsIGVhY2ggc2VjdGlvbiBoYXMgYW4gYXJyYXkgb2YgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEVhY2gKLXN0cnVjdHVyZSBoYXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sLCBhbiBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiwgYW4KLWFkZGVuZCwgYW5kIGEgcG9pbnRlciB0byBhIEBzYW1we3JlbG9jX2hvd3RvX3N0cnVjdH0gc3RydWN0dXJlLiAgVGhlCi1ob3d0byBzdHJ1Y3R1cmUgaGFzIGEgYnVuY2ggb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIHJlbG9jLCBpbmNsdWRpbmcgYQotdHlwZSBmaWVsZC4gIFRoZSB0eXBlIGZpZWxkIGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKLWJhY2tlbmQ7IG5vbmUgb2YgdGhlIGdlbmVyaWMgY29kZSBpbiBCRkQgZXhhbWluZXMgaXQuCi0KLU9yaWdpbmFsbHksIHRoZSBmdW5jdGlvbiBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSB3YXMgc3VwcG9zZWQgdG8KLWhhbmRsZSBhbGwgcmVsb2NhdGlvbnMuICBJbiB0aGVvcnksIG1hbnkgcmVsb2NhdGlvbnMgd291bGQgYmUgc2ltcGxlCi1lbm91Z2ggdG8gYmUgZGVzY3JpYmVkIGJ5IHRoZSBmaWVsZHMgaW4gdGhlIGhvd3RvIHN0cnVjdHVyZS4gIEZvciB0aG9zZQotdGhhdCB3ZXJlbid0LCB0aGUgaG93dG8gc3RydWN0dXJlIGluY2x1ZGVkIGEgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0KLWZpZWxkIHRvIHVzZSBhcyBhbiBlc2NhcGUuCi0KLVdoaWxlIHRoaXMgc2VlbXMgcGxhdXNpYmxlLCBhIGxvb2sgYXQgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLXNob3dzIHRoYXQgaXQgZmFpbGVkLiAgVGhlIGZ1bmN0aW9uIGhhcyBvZGQgc3BlY2lhbCBjYXNlcy4gIFNvbWUgb2YgdGhlCi1maWVsZHMgaW4gdGhlIGhvd3RvIHN0cnVjdHVyZSwgc3VjaCBhcyBAc2FtcHtwY3JlbF9vZmZzZXR9LCB3ZXJlIG5vdAotYWRlcXVhdGVseSBkb2N1bWVudGVkLgotCi1UaGUgbGlua2VyIHVzZXMgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gdG8gZG8gYWxsIHJlbG9jYXRpb25zIHdoZW4KLXRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgaGF2ZSBkaWZmZXJlbnQgZm9ybWF0cyAoZS5nLiwgd2hlbiBnZW5lcmF0aW5nCi1TLXJlY29yZHMpLiAgVGhlIGdlbmVyaWMgbGlua2VyIGNvZGUsIHdoaWNoIGlzIHVzZWQgYnkgYWxsIHRhcmdldHMgd2hpY2gKLWRvIG5vdCBkZWZpbmUgdGhlaXIgb3duIHNwZWNpYWwgcHVycG9zZSBsaW5rZXIsIHVzZXMKLUBzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LCB3aGljaCBmb3IgbW9zdCB0YXJnZXRzIHR1cm5zCi1pbnRvIGEgY2FsbCB0byBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LCB3aGljaAotY2FsbHMgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uICBTbyBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotaXMgc3RpbGwgd2lkZWx5IHVzZWQsIHdoaWNoIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBjaGFuZ2UsIHNpbmNlIGl0IGlzCi1kaWZmaWN1bHQgdG8gdGVzdCBhbGwgcG9zc2libGUgY2FzZXMuCi0KLVRoZSBhc3NlbWJsZXIgdXNlZCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBmb3IgYSB3aGlsZS4gIFRoaXMKLXR1cm5lZCBvdXQgdG8gYmUgdGhlIHdyb25nIHRoaW5nIHRvIGRvLCBzaW5jZQotQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gd2FzIHdyaXR0ZW4gdG8gaGFuZGxlIHJlbG9jYXRpb25zIG9uIGFuCi1leGlzdGluZyBvYmplY3QgZmlsZSwgd2hpbGUgdGhlIGFzc2VtYmxlciBuZWVkZWQgdG8gY3JlYXRlIHJlbG9jYXRpb25zCi1pbiBhIG5ldyBvYmplY3QgZmlsZS4gIFRoZSBhc3NlbWJsZXIgd2FzIGNoYW5nZWQgdG8gdXNlIHRoZSBuZXcgZnVuY3Rpb24KLUBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IGluc3RlYWQsIGFuZCBAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufQotd2FzIGNyZWF0ZWQgYXMgYSBjb3B5IG9mIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LgotCi1VbmZvcnR1bmF0ZWx5LCB0aGUgd29yayBkaWQgbm90IHByb2dyZXNzIGFueSBmYXJ0aGVyLCBzbwotQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gcmVtYWlucyBhIHNpbXBsZSBjb3B5IG9mCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSwgd2l0aCBhbGwgdGhlIG9kZCBzcGVjaWFsIGNhc2VzIGFuZAotY29uZnVzaW5nIGNvZGUuICBUaGlzIGFnYWluIGlzIGRpZmZpY3VsdCB0byBjaGFuZ2UsIGJlY2F1c2UgYWdhaW4gYW55Ci1jaGFuZ2UgY2FuIGFmZmVjdCBhbnkgYXNzZW1ibGVyIHRhcmdldCwgYW5kIHNvIGlzIGRpZmZpY3VsdCB0byB0ZXN0LgotCi1UaGUgbmV3IGxpbmtlciwgd2hlbiB1c2luZyB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIGFsbCBpbnB1dAotZmlsZXMgYW5kIHRoZSBvdXRwdXQgZmlsZSwgZG9lcyBub3QgY29udmVydCByZWxvY2F0aW9ucyBpbnRvCi1Ac2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLCBzbyBpdCBjYW4gbm90IHVzZQotQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gYXQgYWxsLiAgSW5zdGVhZCwgdXNlcnMgb2YgdGhlIG5ldyBsaW5rZXIKLWFyZSBleHBlY3RlZCB0byB3cml0ZSBhIEBzYW1we3JlbG9jYXRlX3NlY3Rpb259IGZ1bmN0aW9uIHdoaWNoIHdpbGwKLWhhbmRsZSByZWxvY2F0aW9ucyBpbiBhIHRhcmdldCBzcGVjaWZpYyBmYXNoaW9uLgotCi1UaGVyZSBhcmUgdHdvIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9uOgotQHNhbXB7X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlfSBhbmQgQHNhbXB7X2JmZF9yZWxvY2F0ZV9jb250ZW50c30uCi1UaGVzZSBmdW5jdGlvbnMgdXNlIGEgaG93dG8gc3RydWN0dXJlLCBidXQgdGhleSBAZW1waHtkbyBub3R9IHVzZSB0aGUKLUBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkLiAgU2luY2UgdGhlIGZ1bmN0aW9ucyBhcmUgbm9ybWFsbHkgY2FsbGVkCi1mcm9tIHRhcmdldCBzcGVjaWZpYyBjb2RlLCB0aGUgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0gZmllbGQgYWRkcwotbGl0dGxlOyBhbnkgcmVsb2NhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIGNhbiBiZSBoYW5kbGVkCi13aXRob3V0IGNhbGxpbmcgdGhvc2UgZnVuY3Rpb25zLgotCi1TbywgaWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IHRhcmdldCwgb3IgYWRkIGEgbmV3IHJlbG9jYXRpb24gdG8gYW4KLWV4aXN0aW5nIHRhcmdldCwgeW91IG5lZWQgdG8gZG8gdGhlIGZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLU1ha2Ugc3VyZSB5b3UgY2xlYXJseSB1bmRlcnN0YW5kIHdoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNob3VsZAotbG9vayBsaWtlIGFmdGVyIGFzc2VtYmx5LCBhZnRlciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgYWZ0ZXIgYSBmaW5hbAotbGluay4gIE1ha2Ugc3VyZSB5b3UgY2xlYXJseSB1bmRlcnN0YW5kIHRoZSBvcGVyYXRpb25zIHRoZSBsaW5rZXIgbXVzdAotcGVyZm9ybSBkdXJpbmcgYSByZWxvY2F0ZWFibGUgbGluayBhbmQgZHVyaW5nIGEgZmluYWwgbGluay4KLQotQGl0ZW0KLVdyaXRlIGEgaG93dG8gc3RydWN0dXJlIGZvciB0aGUgcmVsb2NhdGlvbi4gIFRoZSBob3d0byBzdHJ1Y3R1cmUgaXMKLWZsZXhpYmxlIGVub3VnaCB0byByZXByZXNlbnQgYW55IHJlbG9jYXRpb24gd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYnkKLXNldHRpbmcgYSBjb250aWd1b3VzIGJpdGZpZWxkIGluIHRoZSBkZXN0aW5hdGlvbiB0byB0aGUgdmFsdWUgb2YgYQotc3ltYm9sLCBwb3NzaWJseSB3aXRoIGFuIGFkZGVuZCwgcG9zc2libHkgYWRkaW5nIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlCi12YWx1ZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGRlc3RpbmF0aW9uLgotCi1AaXRlbQotQ2hhbmdlIHRoZSBhc3NlbWJsZXIgdG8gZ2VuZXJhdGUgeW91ciByZWxvY2F0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsCi1jYWxsIEBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259LCBzbyB5b3VyIGhvd3RvIHN0cnVjdHVyZSBoYXMgdG8gYmUKLWFibGUgdG8gaGFuZGxlIHRoYXQuICBZb3UgbWF5IG5lZWQgdG8gc2V0IHRoZSBAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufQotZmllbGQgdG8gaGFuZGxlIGFzc2VtYmx5IGNvcnJlY3RseS4gIEJlIGNhcmVmdWwgdG8gZW5zdXJlIHRoYXQgYW55IGNvZGUKLXlvdSB3cml0ZSB0byBoYW5kbGUgdGhlIGFzc2VtYmxlciB3aWxsIGFsc28gd29yayBjb3JyZWN0bHkgd2hlbiBkb2luZyBhCi1yZWxvY2F0ZWFibGUgbGluay4gIEZvciBleGFtcGxlLCBzZWUgQHNhbXB7YmZkX2VsZl9nZW5lcmljX3JlbG9jfS4KLQotQGl0ZW0KLVRlc3QgdGhlIGFzc2VtYmxlci4gIENvbnNpZGVyIHRoZSBjYXNlcyBvZiByZWxvY2F0aW9uIGFnYWluc3QgYW4KLXVuZGVmaW5lZCBzeW1ib2wsIGEgY29tbW9uIHN5bWJvbCwgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUKLWluIHRoZSBzYW1lIHNlY3Rpb24sIGFuZCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBvYmplY3QgZmlsZSBpbiBhCi1kaWZmZXJlbnQgc2VjdGlvbi4gIFRoZXNlIGNhc2VzIG1heSBub3QgYWxsIGJlIGFwcGxpY2FibGUgZm9yIHlvdXIKLXJlbG9jLgotCi1AaXRlbQotSWYgeW91ciB0YXJnZXQgdXNlcyB0aGUgbmV3IGxpbmtlciwgd2hpY2ggaXMgcmVjb21tZW5kZWQsIGFkZCBhbnkKLXJlcXVpcmVkIGhhbmRsaW5nIHRvIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbiBmdW5jdGlvbi4gIEluIHNpbXBsZQotY2FzZXMgdGhpcyB3aWxsIGp1c3QgaW52b2x2ZSBhIGNhbGwgdG8gQHNhbXB7X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlfQotb3IgQHNhbXB7X2JmZF9yZWxvY2F0ZV9jb250ZW50c30sIGRlcGVuZGluZyB1cG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotcmVsb2NhdGlvbiBhbmQgd2hldGhlciB0aGUgbGluayBpcyByZWxvY2F0ZWFibGUgb3Igbm90LgotCi1AaXRlbQotVGVzdCB0aGUgbGlua2VyLiAgVGVzdCB0aGUgY2FzZSBvZiBhIGZpbmFsIGxpbmsuICBJZiB0aGUgcmVsb2NhdGlvbiBjYW4KLW92ZXJmbG93LCB1c2UgYSBsaW5rZXIgc2NyaXB0IHRvIGZvcmNlIGFuIG92ZXJmbG93IGFuZCBtYWtlIHN1cmUgdGhlCi1lcnJvciBpcyByZXBvcnRlZCBjb3JyZWN0bHkuICBUZXN0IGEgcmVsb2NhdGVhYmxlIGxpbmssIHdoZXRoZXIgdGhlCi1zeW1ib2wgaXMgZGVmaW5lZCBvciB1bmRlZmluZWQgaW4gdGhlIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBGb3IgYm90aCB0aGUKLWZpbmFsIGFuZCByZWxvY2F0ZWFibGUgbGluaywgdGVzdCB0aGUgY2FzZSB3aGVuIHRoZSBzeW1ib2wgaXMgYSBjb21tb24KLXN5bWJvbCwgd2hlbiB0aGUgc3ltYm9sIGxvb2tlZCBsaWtlIGEgY29tbW9uIHN5bWJvbCBidXQgYmVjYW1lIGEgZGVmaW5lZAotc3ltYm9sLCB3aGVuIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSwgYW5kIHdoZW4KLXRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0KLUluIG9yZGVyIGZvciBsaW5raW5nIHRvIGFub3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LCBzdWNoIGFzIFMtcmVjb3JkcywKLXRvIHdvcmsgY29ycmVjdGx5LCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBoYXMgdG8gZG8gdGhlIHJpZ2h0Ci10aGluZyBmb3IgdGhlIHJlbG9jYXRpb24uICBZb3UgbWF5IG5lZWQgdG8gc2V0IHRoZQotQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0gZmllbGQgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5LiAgVGVzdCB0aGlzIGJ5Ci1kb2luZyBhIGxpbmsgaW4gd2hpY2ggdGhlIG91dHB1dCBvYmplY3QgZmlsZSBmb3JtYXQgaXMgUy1yZWNvcmRzLgotCi1AaXRlbQotVXNpbmcgdGhlIGxpbmtlciB0byBnZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IGluIGEgZGlmZmVyZW50IG9iamVjdAotZmlsZSBmb3JtYXQgaXMgaW1wb3NzaWJsZSBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBzbyB5b3UgZ2VuZXJhbGx5IGRvbid0Ci1oYXZlIHRvIHdvcnJ5IGFib3V0IHRoYXQuICBMaW5raW5nIGlucHV0IGZpbGVzIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZQotZm9ybWF0cyB0b2dldGhlciBpcyBxdWl0ZSB1bnVzdWFsLCBidXQgaWYgeW91J3JlIHJlYWxseSBkZWRpY2F0ZWQgeW91Ci1tYXkgd2FudCB0byBjb25zaWRlciB0ZXN0aW5nIHRoaXMgY2FzZSwgYm90aCB3aGVuIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUKLWZvcm1hdCBpcyB0aGUgc2FtZSBhcyB5b3VyIGZvcm1hdCwgYW5kIHdoZW4gaXQgaXMgZGlmZmVyZW50LgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGNvZGVzCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBjb2RlcwotCi1CRkQgaGFzIGFub3RoZXIgd2F5IG9mIGRlc2NyaWJpbmcgcmVsb2NhdGlvbnMgYmVzaWRlcyB0aGUgaG93dG8KLXN0cnVjdHVyZXMgZGVzY3JpYmVkIGFib3ZlOiB0aGUgZW51bSBAc2FtcHtiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGV9LgotCi1FdmVyeSBrbm93biByZWxvY2F0aW9uIHR5cGUgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIHZhbHVlIGluIHRoaXMKLWVudW1lcmF0aW9uLiAgVGhlIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1hbnkgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb25zLAotYnV0IHdoZXJlIHR3byBvciBtb3JlIHRhcmdldHMgaGF2ZSB0aGUgc2FtZSByZWxvY2F0aW9uLCBhIHNpbmdsZSBjb2RlIGlzCi11c2VkLiAgRm9yIGV4YW1wbGUsIHRoZSBzaW5nbGUgdmFsdWUgQHNhbXB7QkZEX1JFTE9DXzMyfSBpcyB1c2VkIGZvciBhbGwKLXNpbXBsZSAzMiBiaXQgcmVsb2NhdGlvbiB0eXBlcy4KLQotVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHJlbG9jYXRpb24gY29kZSBpcyB0byBnaXZlIHRoZSBhc3NlbWJsZXIgc29tZQotbWVjaGFuaXNtIHRvIGNyZWF0ZSBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgSW4gb3JkZXIgZm9yIHRoZQotYXNzZW1ibGVyIHRvIGNyZWF0ZSBhbiBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmUsIGl0IGhhcyB0byBiZSBhYmxlIHRvCi1vYnRhaW4gYSBob3d0byBzdHJ1Y3R1cmUuICBUaGUgZnVuY3Rpb24gQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSwKLXdoaWNoIHNpbXBseSBjYWxscyB0aGUgdGFyZ2V0IHZlY3RvciBlbnRyeSBwb2ludAotQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LCB0YWtlcyBhIHJlbG9jYXRpb24gY29kZSBhbmQgcmV0dXJucyBhIGhvd3RvCi1zdHJ1Y3R1cmUuCi0KLVRoZSBmdW5jdGlvbiBAc2FtcHtiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZX0gcmV0dXJucyB0aGUgbmFtZSBvZiBhCi1yZWxvY2F0aW9uIGNvZGUuICBUaGlzIGlzIG1haW5seSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLgotCi1Vc2luZyBib3RoIGhvd3RvIHN0cnVjdHVyZXMgYW5kIHJlbG9jYXRpb24gY29kZXMgY2FuIGJlIHNvbWV3aGF0Ci1jb25mdXNpbmcuICBUaGVyZSBhcmUgbWFueSBwcm9jZXNzb3Igc3BlY2lmaWMgcmVsb2NhdGlvbiBjb2Rlcy4KLUhvd2V2ZXIsIHRoZSByZWxvY2F0aW9uIGlzIG9ubHkgZnVsbHkgZGVmaW5lZCBieSB0aGUgaG93dG8gc3RydWN0dXJlLgotVGhlIHNhbWUgcmVsb2NhdGlvbiBjb2RlIHdpbGwgbWFwIHRvIGRpZmZlcmVudCBob3d0byBzdHJ1Y3R1cmVzIGluCi1kaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciBleGFtcGxlLCB0aGUgYWRkZW5kIGhhbmRsaW5nIG1heSBiZQotZGlmZmVyZW50LgotCi1Nb3N0IG9mIHRoZSByZWxvY2F0aW9uIGNvZGVzIGFyZSBub3QgcmVhbGx5IGdlbmVyYWwuICBUaGUgYXNzZW1ibGVyIGNhbgotbm90IHVzZSB0aGVtIHdpdGhvdXQgYWxyZWFkeSB1bmRlcnN0YW5kaW5nIHdoYXQgc29ydHMgb2YgcmVsb2NhdGlvbnMgY2FuCi1iZSB1c2VkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LiAgSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUKLXJlbG9jYXRpb24gY29kZXMgd2l0aCBzb21ldGhpbmcgc2ltcGxlci4KLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gZnV0dXJlCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBmdXR1cmUKLQotQ2xlYXJseSB0aGUgY3VycmVudCBCRkQgcmVsb2NhdGlvbiBzdXBwb3J0IGlzIGluIGJhZCBzaGFwZS4gIEEKLXdob2xlc2NhbGUgcmV3cml0ZSB3b3VsZCBiZSB2ZXJ5IGRpZmZpY3VsdCwgYmVjYXVzZSBpdCB3b3VsZCByZXF1aXJlCi10aG9yb3VnaCB0ZXN0aW5nIG9mIGV2ZXJ5IEJGRCB0YXJnZXQuICBTbyBzb21lIHNvcnQgb2YgaW5jcmVtZW50YWwKLWNoYW5nZSBpcyByZXF1aXJlZC4KLQotTXkgdmFndWUgdGhvdWdodHMgb24gdGhpcyB3b3VsZCBpbnZvbHZlIGRlZmluaW5nIGEgbmV3LCBjbGVhcmx5IGRlZmluZWQsCi1ob3d0byBzdHJ1Y3R1cmUuICBTb21lIG1lY2hhbmlzbSB3b3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0eXBlCi1vZiBob3d0byBzdHJ1Y3R1cmUgd2FzIGJlaW5nIHVzZWQgYnkgYSBwYXJ0aWN1bGFyIGZvcm1hdC4KLQotVGhlIG5ldyBob3d0byBzdHJ1Y3R1cmUgd291bGQgY2xlYXJseSBkZWZpbmUgdGhlIHJlbG9jYXRpb24gYmVoYXZpb3VyIGluCi10aGUgY2FzZSBvZiBhbiBhc3NlbWJseSwgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIGEgZmluYWwgbGluay4gIEF0Ci1sZWFzdCBvbmUgc3BlY2lhbCBmdW5jdGlvbiB3b3VsZCBiZSBkZWZpbmVkIGFzIGFuIGVzY2FwZSwgYW5kIGl0IG1pZ2h0Ci1tYWtlIHNlbnNlIHRvIGRlZmluZSBtb3JlLgotCi1PbmUgb3IgbW9yZSBnZW5lcmljIGZ1bmN0aW9ucyBzaW1pbGFyIHRvIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci13b3VsZCBiZSB3cml0dGVuIHRvIGhhbmRsZSB0aGUgbmV3IGhvd3RvIHN0cnVjdHVyZS4KLQotVGhpcyBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSB0byB3cml0ZSBhIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgcmVsb2NhdGUKLXNlY3Rpb24gZnVuY3Rpb25zIHVzZWQgYnkgdGhlIG5ldyBsaW5rZXIuICBUaGUgdGFyZ2V0IHNwZWNpZmljIGNvZGUKLXdvdWxkIHByb3ZpZGUgc29tZSBtZWNoYW5pc20gKGEgZnVuY3Rpb24gcG9pbnRlciBvciBhbiBpbml0aWFsCi1jb252ZXJzaW9uKSB0byBjb252ZXJ0IHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9ucyBpbnRvIGhvd3RvCi1zdHJ1Y3R1cmVzLgotCi1JZGVhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGdlbmVyaWMgcmVsb2NhdGUgc2VjdGlvbgotZnVuY3Rpb24gZm9yIHRoZSBnZW5lcmljIGxpbmtlciBhcyB3ZWxsLiAgVGhhdCBpcywgaXQgd291bGQgcmVwbGFjZSB0aGUKLUBzYW1we2JmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50c30gZnVuY3Rpb24gd2hpY2ggaXMKLWN1cnJlbnRseSBub3JtYWxseSB1c2VkLgotCi1Gb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBFTEYgZHluYW1pYyBsaW5raW5nLCBtb3JlIGNvbnNpZGVyYXRpb24gbmVlZHMgdG8KLWJlIGdpdmVuIHRvIHdyaXRpbmcgRUxGIHNwZWNpZmljIGJ1dCBFTEYgdGFyZ2V0IGdlbmVyaWMgY29kZSB0byBoYW5kbGUKLXNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcyBzdWNoIGFzIEdPVCBhbmQgUExULgotCi1Abm9kZSBCRkQgRUxGIHN1cHBvcnQKLUBzZWN0aW9uIEJGRCBFTEYgc3VwcG9ydAotQGNpbmRleCBlbGYgc3VwcG9ydCBpbiBiZmQKLUBjaW5kZXggYmZkIGVsZiBzdXBwb3J0Ci0KLVRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGlzIGRlZmluZWQgaW4gdHdvIHBhcnRzOiBhIGdlbmVyaWMgQUJJIGFuZCBhCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4gIFRoZSBFTEYgc3VwcG9ydCBpbiBCRkQgaXMgc3BsaXQgaW4gYQotc2ltaWxhciBmYXNoaW9uLiAgVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IGlzIGxhcmdlbHkga2VwdCB3aXRoaW4KLWEgc2luZ2xlIGZpbGUuICBUaGUgZ2VuZXJpYyBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IHNldmVyYWwgb3RoZXIgZmlsZXMuCi1UaGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kCi1jb25zdGFudHMgdXNlZCBieSB0aGUgZ2VuZXJpYyBzdXBwb3J0LgotCi1AbWVudQotKiBCRkQgRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50czo6CUVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHMKLSogQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQ6OgkJQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKLSogQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydDo6CUJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLSogQkZEIEVMRiBjb3JlIGZpbGVzOjoJCQlCRkQgRUxGIGNvcmUgZmlsZXMKLSogQkZEIEVMRiBmdXR1cmU6OgkJCUJGRCBFTEYgZnV0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHMKLUBzdWJzZWN0aW9uIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHMKLQotVGhlIEVMRiBBQkkgcGVybWl0cyBhIGZpbGUgdG8gaGF2ZSBlaXRoZXIgc2VjdGlvbnMgb3Igc2VnbWVudHMgb3IgYm90aC4KLVJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZXMgY29udmVudGlvbmFsbHkgaGF2ZSBvbmx5IHNlY3Rpb25zLgotRXhlY3V0YWJsZXMgY29udmVudGlvbmFsbHkgaGF2ZSBib3RoLiAgQ29yZSBmaWxlcyBjb252ZW50aW9uYWxseSBoYXZlCi1vbmx5IHByb2dyYW0gc2VnbWVudHMuCi0KLUVMRiBzZWN0aW9ucyBhcmUgc2ltaWxhciB0byBzZWN0aW9ucyBpbiBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzOiB0aGV5Ci1oYXZlIGEgbmFtZSwgYSBWTUEsIGZpbGUgY29udGVudHMsIGZsYWdzLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cwotaW5mb3JtYXRpb24uICBFTEYgcmVsb2NhdGlvbnMgYXJlIHN0b3JlZCBpbiBzZWN0aW9ucyBvZiBhIHBhcnRpY3VsYXIKLXR5cGU7IEJGRCBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIHRoZXNlIHNlY3Rpb25zIGludG8gaW50ZXJuYWwgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uCi0KLUVMRiBwcm9ncmFtIHNlZ21lbnRzIGFyZSBpbnRlbmRlZCBmb3IgZmFzdCBpbnRlcnByZXRhdGlvbiBieSBhIHN5c3RlbQotbG9hZGVyLiAgVGhleSBoYXZlIGEgdHlwZSwgYSBWTUEsIGFuIExNQSwgZmlsZSBjb250ZW50cywgYW5kIGEgY291cGxlIG9mCi1vdGhlciBmaWVsZHMuICBXaGVuIGFuIEVMRiBleGVjdXRhYmxlIGlzIHJ1biBvbiBhIFVuaXggc3lzdGVtLCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBleGFtaW5lIHRoZSBwcm9ncmFtIHNlZ21lbnRzIHRvIGRlY2lkZSBob3cgdG8gbG9hZAotaXQuICBUaGUgbG9hZGVyIHdpbGwgaWdub3JlIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgTG9hZGFibGUgcHJvZ3JhbQotc2VnbWVudHMgKHR5cGUgQHNhbXB7UFRfTE9BRH0pIGFyZSBkaXJlY3RseSBsb2FkZWQgaW50byBtZW1vcnkuICBPdGhlcgotcHJvZ3JhbSBzZWdtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGxvYWRlciwgYW5kIGdlbmVyYWxseSBwcm92aWRlCi1keW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uCi0KLVdoZW4gYW4gRUxGIGZpbGUgaGFzIGJvdGggcHJvZ3JhbSBzZWdtZW50cyBhbmQgc2VjdGlvbnMsIGFuIEVMRiBwcm9ncmFtCi1zZWdtZW50IG1heSBlbmNvbXBhc3Mgb25lIG9yIG1vcmUgRUxGIHNlY3Rpb25zLCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUKLXBvcnRpb24gb2YgdGhlIGZpbGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHByb2dyYW0gc2VnbWVudCBtYXkgaW5jbHVkZQotdGhlIHBvcnRpb25zIG9mIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9yIG1vcmUgc2VjdGlvbnMuICBXaGVuCi10aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNlY3Rpb24gaW4gYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQsIHRoZQotcmVsYXRpdmUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGluIHRoZSBmaWxlIG11c3QgY29ycmVzcG9uZAotdG8gdGhlIHJlbGF0aXZlIHBvc2l0aW9ucyB0aGV5IHNob3VsZCBob2xkIHdoZW4gdGhlIHByb2dyYW0gc2VnbWVudCBpcwotbG9hZGVkLiAgVGhpcyByZXF1aXJlbWVudCBzaG91bGQgYmUgb2J2aW91cyBpZiB5b3UgY29uc2lkZXIgdGhhdCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGFuIGVudGlyZSBwcm9ncmFtIHNlZ21lbnQgYXQgYSB0aW1lLgotCi1PbiBhIHN5c3RlbSB3aGljaCBzdXBwb3J0cyBkeW5hbWljIHBhZ2luZywgc3VjaCBhcyBhbnkgbmF0aXZlIFVuaXgKLXN5c3RlbSwgdGhlIGNvbnRlbnRzIG9mIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50IG11c3QgYmUgYXQgdGhlIHNhbWUKLW9mZnNldCBpbiB0aGUgZmlsZSBhcyBpbiBtZW1vcnksIG1vZHVsbyB0aGUgbWVtb3J5IHBhZ2Ugc2l6ZSB1c2VkIG9uIHRoZQotc3lzdGVtLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzeXN0ZW0gbG9hZGVyIHdpbGwgbWFwIHRoZSBmaWxlIGludG8gbWVtb3J5Ci1zdGFydGluZyBhdCB0aGUgc3RhcnQgb2YgYSBwYWdlLiAgVGhlIHN5c3RlbSBsb2FkZXIgY2FuIGVhc2lseSByZW1hcAotZW50aXJlIHBhZ2VzIHRvIHRoZSBjb3JyZWN0IGxvYWQgYWRkcmVzcy4gIEhvd2V2ZXIsIGlmIHRoZSBjb250ZW50cyBvZgotdGhlIGZpbGUgd2VyZSBub3QgY29ycmVjdGx5IGFsaWduZWQgd2l0aGluIHRoZSBwYWdlLCB0aGUgc3lzdGVtIGxvYWRlcgotd291bGQgaGF2ZSB0byBzaGlmdCB0aGUgY29udGVudHMgYXJvdW5kIHdpdGhpbiB0aGUgcGFnZSwgd2hpY2ggaXMgdG9vCi1leHBlbnNpdmUuICBGb3IgZXhhbXBsZSwgaWYgdGhlIExNQSBvZiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCBpcwotQHNhbXB7MHg0MDA4MH0gYW5kIHRoZSBwYWdlIHNpemUgaXMgQHNhbXB7MHgxMDAwfSwgdGhlbiB0aGUgcG9zaXRpb24gb2YKLXRoZSBzZWdtZW50IGNvbnRlbnRzIHdpdGhpbiB0aGUgZmlsZSBtdXN0IGVxdWFsIEBzYW1wezB4ODB9IG1vZHVsbwotQHNhbXB7MHgxMDAwfS4KLQotQkZEIGhhcyBvbmx5IGEgc2luZ2xlIHNldCBvZiBzZWN0aW9ucy4gIEl0IGRvZXMgbm90IHByb3ZpZGUgYW55IGdlbmVyaWMKLXdheSB0byBleGFtaW5lIGJvdGggc2VjdGlvbnMgYW5kIHNlZ21lbnRzLiAgV2hlbiBCRkQgaXMgdXNlZCB0byBvcGVuIGFuCi1vYmplY3QgZmlsZSBvciBleGVjdXRhYmxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwgcmVwcmVzZW50IEVMRiBzZWN0aW9ucy4KLVdoZW4gQkZEIGlzIHVzZWQgdG8gb3BlbiBhIGNvcmUgZmlsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsIHJlcHJlc2VudAotRUxGIHByb2dyYW0gc2VnbWVudHMuCi0KLVdoZW4gQkZEIGlzIHVzZWQgdG8gZXhhbWluZSBhbiBvYmplY3QgZmlsZSBvciBleGVjdXRhYmxlLCBhbnkgcHJvZ3JhbQotc2VnbWVudHMgd2lsbCBiZSByZWFkIHRvIHNldCB0aGUgTE1BIG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgYmVjYXVzZQotRUxGIHNlY3Rpb25zIG9ubHkgaGF2ZSBhIFZNQSwgd2hpbGUgRUxGIHByb2dyYW0gc2VnbWVudHMgaGF2ZSBib3RoIGEgVk1BCi1hbmQgYW4gTE1BLiAgQW55IHByb2dyYW0gc2VnbWVudHMgd2lsbCBiZSBjb3BpZWQgYnkgdGhlCi1Ac2FtcHtjb3B5X3ByaXZhdGV9IGVudHJ5IHBvaW50cy4gIFRoZXkgd2lsbCBiZSBwcmludGVkIGJ5IHRoZQotQHNhbXB7cHJpbnRfcHJpdmF0ZX0gZW50cnkgcG9pbnQuICBPdGhlcndpc2UsIHRoZSBwcm9ncmFtIHNlZ21lbnRzIGFyZQotaWdub3JlZC4gIEluIHBhcnRpY3VsYXIsIHByb2dyYW1zIHdoaWNoIHVzZSBCRkQgY3VycmVudGx5IGhhdmUgbm8gZGlyZWN0Ci1hY2Nlc3MgdG8gdGhlIHByb2dyYW0gc2VnbWVudHMuCi0KLVdoZW4gQkZEIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUsIHRoZSBwcm9ncmFtIHNlZ21lbnRzIHdpbGwgYmUKLWNyZWF0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZG9uZSBpbgotdGhlIGZ1bmN0aW9uIEBzYW1we2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHN9IGluIEBmaWxle2VsZi5jfS4KLVRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gdHdlYWtlZCBtYW55IHRpbWVzLCBhbmQgcHJvYmFibHkgc3RpbGwgaGFzCi1wcm9ibGVtcyB0aGF0IGFyaXNlIGluIHBhcnRpY3VsYXIgY2FzZXMuCi0KLVRoZXJlIGlzIGEgaG9vayB3aGljaCBtYXkgYmUgdXNlZCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgcHJvZ3JhbQotc2VnbWVudHMgd2hlbiBjcmVhdGluZyBhbiBleGVjdXRhYmxlOiB0aGUgQHNhbXB7YmZkX3JlY29yZF9waGRyfQotZnVuY3Rpb24gaW4gQGZpbGV7YmZkLmN9LiAgSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIEJGRCB3aWxsIG5vdAotY3JlYXRlIHByb2dyYW0gc2VnbWVudHMgaXRzZWxmLCBidXQgd2lsbCBvbmx5IGNyZWF0ZSB0aGUgcHJvZ3JhbQotc2VnbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIuICBUaGUgbGlua2VyIHVzZXMgdGhpcyBmdW5jdGlvbiB0bwotaW1wbGVtZW50IHRoZSBAc2FtcHtQSERSU30gbGlua2VyIHNjcmlwdCBjb21tYW5kLgotCi1Abm9kZSBCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydAotQHN1YnNlY3Rpb24gQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKLQotSW4gZ2VuZXJhbCwgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCByZWFkIGV4dGVybmFsIGRhdGEgZnJvbSB0aGUgRUxGIGZpbGUKLWFyZSBmb3VuZCBpbiBAZmlsZXtlbGYuY30uICBUaGV5IG9wZXJhdGUgb24gdGhlIGludGVybmFsIGZvcm1zIG9mIHRoZQotRUxGIHN0cnVjdHVyZXMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIEBmaWxle2luY2x1ZGUvZWxmL2ludGVybmFsLmh9LiAgVGhlCi1pbnRlcm5hbCBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIEBzYW1we2JmZF92bWF9LCBhbmQgc28gbWF5Ci1iZSB1c2VkIGZvciBib3RoIDMyIGJpdCBhbmQgNjQgYml0IEVMRiB0YXJnZXRzLgotCi1UaGUgZmlsZSBAZmlsZXtlbGZjb2RlLmh9IGNvbnRhaW5zIGZ1bmN0aW9ucyB3aGljaCBvcGVyYXRlIG9uIHRoZQotZXh0ZXJuYWwgZGF0YS4gIEBmaWxle2VsZmNvZGUuaH0gaXMgY29tcGlsZWQgdHdpY2UsIG9uY2UgdmlhCi1AZmlsZXtlbGYzMi5jfSB3aXRoIEBzYW1we0FSQ0hfU0laRX0gZGVmaW5lZCBhcyBAc2FtcHszMn0sIGFuZCBvbmNlIHZpYQotQGZpbGV7ZWxmNjQuY30gd2l0aCBAc2FtcHtBUkNIX1NJWkV9IGRlZmluZWQgYXMgQHNhbXB7NjR9LgotQGZpbGV7ZWxmY29kZS5ofSBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gc3dhcCB0aGUgRUxGIHN0cnVjdHVyZXMgaW4gYW5kCi1vdXQgb2YgZXh0ZXJuYWwgZm9ybSwgYXMgd2VsbCBhcyBhIGZldyBtb3JlIGNvbXBsZXggZnVuY3Rpb25zLgotCi1MaW5rZXIgc3VwcG9ydCBpcyBmb3VuZCBpbiBAZmlsZXtlbGZsaW5rLmN9IGFuZCBAZmlsZXtlbGZsaW5rLmh9LiAgVGhlCi1sYXR0ZXIgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgZm9yIGJvdGggMzIgYW5kIDY0IGJpdCBzdXBwb3J0LiAgVGhlCi1saW5rZXIgc3VwcG9ydCBpcyBvbmx5IHVzZWQgaWYgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBmaWxlIGRlZmluZXMKLUBzYW1we2VsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb259LCB3aGljaCBpcyByZXF1aXJlZCB0byByZWxvY2F0ZSB0aGUKLXNlY3Rpb24gY29udGVudHMuICBJZiB0aGF0IG1hY3JvIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2VuZXJpYyBsaW5rZXIgY29kZQotaXMgdXNlZCwgYW5kIHJlbG9jYXRpb25zIGFyZSBoYW5kbGVkIHZpYSBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4KLQotVGhlIGNvcmUgZmlsZSBzdXBwb3J0IGlzIGluIEBmaWxle2VsZmNvcmUuaH0sIHdoaWNoIGlzIGNvbXBpbGVkIHR3aWNlLAotZm9yIGJvdGggMzIgYW5kIDY0IGJpdCBzdXBwb3J0LiAgVGhlIG1vcmUgaW50ZXJlc3RpbmcgY2FzZXMgb2YgY29yZSBmaWxlCi1zdXBwb3J0IG9ubHkgd29yayBvbiBhIG5hdGl2ZSBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBAZmlsZXtzeXMvcHJvY2ZzLmh9Ci1oZWFkZXIgZmlsZS4gIFdpdGhvdXQgdGhhdCBmaWxlLCB0aGUgY29yZSBmaWxlIHN1cHBvcnQgZG9lcyBsaXR0bGUgbW9yZQotdGhhbiByZWFkIHRoZSBFTEYgcHJvZ3JhbSBzZWdtZW50cyBhcyBCRkQgc2VjdGlvbnMuCi0KLVRoZSBCRkQgaW50ZXJuYWwgaGVhZGVyIGZpbGUgQGZpbGV7ZWxmLWJmZC5ofSBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uCi1hbW9uZyB0aGVzZSBmaWxlcyBhbmQgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBmaWxlcy4KLQotVGhlIGRlZmF1bHQgZW50cmllcyBmb3IgdGhlIEJGRCBFTEYgdGFyZ2V0IHZlY3RvciBhcmUgZm91bmQgbWFpbmx5IGluCi1AZmlsZXtlbGYuY30uICBTb21lIGZ1bmN0aW9ucyBhcmUgZm91bmQgaW4gQGZpbGV7ZWxmY29kZS5ofS4KLQotVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBmaWxlcyBtYXkgb3ZlcnJpZGUgcGFydGljdWxhciBlbnRyaWVzIGluIHRoZQotdGFyZ2V0IHZlY3RvciwgYnV0IG1vc3QgZG8gbm90LCB3aXRoIG9uZSBleGNlcHRpb246IHRoZQotQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSBlbnRyeSBwb2ludCBpcyBhbHdheXMgcHJvY2Vzc29yIHNwZWNpZmljLgotCi1Abm9kZSBCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci1Ac3Vic2VjdGlvbiBCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0KLUJ5IGNvbnZlbnRpb24sIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3Nvcgotd2lsbCBiZSBmb3VuZCBpbiBAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30sIHdoZXJlIEB2YXJ7bm59IGlzCi1laXRoZXIgMzIgb3IgNjQsIGFuZCBAdmFye2NwdX0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2Nlc3Nvci4KLQotQG1lbnUKLSogQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQ6OglSZXF1aXJlZCBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotKiBCRkQgRUxGIHByb2Nlc3NvciBsaW5rZXI6OglQcm9jZXNzb3Igc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQKLSogQkZEIEVMRiBwcm9jZXNzb3Igb3RoZXI6OglPdGhlciBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBvcHRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQKLUBzdWJzdWJzZWN0aW9uIFJlcXVpcmVkIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0KLVdoZW4gd3JpdGluZyBhIEBmaWxle2VsZkB2YXJ7bm59LUB2YXJ7Y3B1fS5jfSBmaWxlLCB5b3UgbXVzdCBkbyB0aGUKLWZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLURlZmluZSBlaXRoZXIgQHNhbXB7VEFSR0VUX0JJR19TWU19IG9yIEBzYW1we1RBUkdFVF9MSVRUTEVfU1lNfSwgb3IKLWJvdGgsIHRvIGEgdW5pcXVlIEMgbmFtZSB0byB1c2UgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBuYW1lIHNob3VsZAotYXBwZWFyIGluIHRoZSBsaXN0IG9mIHRhcmdldCB2ZWN0b3JzIGluIEBmaWxle3RhcmdldHMuY30sIGFuZCB3aWxsIGFsc28KLWhhdmUgdG8gYXBwZWFyIGluIEBmaWxle2NvbmZpZy5iZmR9IGFuZCBAZmlsZXtjb25maWd1cmUuaW59LiAgRGVmaW5lCi1Ac2FtcHtUQVJHRVRfQklHX1NZTX0gZm9yIGEgYmlnLWVuZGlhbiBwcm9jZXNzb3IsCi1Ac2FtcHtUQVJHRVRfTElUVExFX1NZTX0gZm9yIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3IsIGFuZCBkZWZpbmUgYm90aAotZm9yIGEgYmktZW5kaWFuIHByb2Nlc3Nvci4KLUBpdGVtCi1EZWZpbmUgZWl0aGVyIEBzYW1we1RBUkdFVF9CSUdfTkFNRX0gb3IgQHNhbXB7VEFSR0VUX0xJVFRMRV9OQU1FfSwgb3IKLWJvdGgsIHRvIGEgc3RyaW5nIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIHRoZQotbmFtZSB3aGljaCBhIHVzZXIgb2YgdGhlIEJGRCB0b29sIHdvdWxkIHVzZSB0byBzcGVjaWZ5IHRoZSBvYmplY3QgZmlsZQotZm9ybWF0LiAgSXQgd291bGQgbm9ybWFsbHkgYXBwZWFyIGluIGEgbGlua2VyIGVtdWxhdGlvbiBwYXJhbWV0ZXJzCi1maWxlLgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfQVJDSH0gdG8gdGhlIEJGRCBhcmNoaXRlY3R1cmUgKGFuIGVsZW1lbnQgb2YgdGhlCi1Ac2FtcHtiZmRfYXJjaGl0ZWN0dXJlfSBlbnVtLCB0eXBpY2FsbHkgQHNhbXB7YmZkX2FyY2hfQHZhcntjcHV9fSkuCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9NQUNISU5FX0NPREV9IHRvIHRoZSBtYWdpYyBudW1iZXIgd2hpY2ggc2hvdWxkIGFwcGVhcgotaW4gdGhlIEBzYW1we2VfbWFjaGluZX0gZmllbGQgb2YgdGhlIEVMRiBoZWFkZXIuICBBcyBvZiB0aGlzIHdyaXRpbmcsCi10aGVzZSBtYWdpYyBudW1iZXJzIGFyZSBhc3NpZ25lZCBieSBTQ087IGlmIHlvdSB3YW50IHRvIGdldCBhIG1hZ2ljCi1udW1iZXIgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IsIHRyeSBzZW5kaW5nIGEgbm90ZSB0bwotQGVtYWlse3JlZ2lzdHJ5QEBzY28uY29tfS4gIEluIHRoZSBCRkQgc291cmNlcywgdGhlIG1hZ2ljIG51bWJlcnMgYXJlCi1mb3VuZCBpbiBAZmlsZXtpbmNsdWRlL2VsZi9jb21tb24uaH07IHRoZXkgaGF2ZSBuYW1lcyBiZWdpbm5pbmcgd2l0aAotQHNhbXB7RU1ffS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX01BWFBBR0VTSVpFfSB0byB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmlydHVhbCBwYWdlIGluCi1tZW1vcnkuICBUaGlzIGNhbiBub3JtYWxseSBiZSBmb3VuZCBhdCB0aGUgc3RhcnQgb2YgY2hhcHRlciA1IGluIHRoZQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuICBGb3IgYSBwcm9jZXNzb3Igd2hpY2ggd2lsbCBvbmx5IGJlIHVzZWQKLWluIGFuIGVtYmVkZGVkIHN5c3RlbSwgb3Igd2hpY2ggaGFzIG5vIG1lbW9yeSBtYW5hZ2VtZW50IGhhcmR3YXJlLCB0aGlzCi1jYW4gc2ltcGx5IGJlIEBzYW1wezF9LgotQGl0ZW0KLUlmIHRoZSBmb3JtYXQgc2hvdWxkIHVzZSBAc2FtcHtSZWx9IHJhdGhlciB0aGFuIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zLAotZGVmaW5lIEBzYW1we1VTRV9SRUx9LiAgVGhpcyBpcyBub3JtYWxseSBkZWZpbmVkIGluIGNoYXB0ZXIgNCBvZiB0aGUKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LgotCi1JbiB0aGUgYWJzZW5jZSBvZiBhIHN1cHBsZW1lbnQsIGl0J3MgZWFzaWVyIHRvIHdvcmsgd2l0aCBAc2FtcHtSZWxhfQotcmVsb2NhdGlvbnMuICBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucyB3aWxsIHJlcXVpcmUgbW9yZSBzcGFjZSBpbiBvYmplY3QKLWZpbGVzIChidXQgbm90IGluIGV4ZWN1dGFibGVzLCBleGNlcHQgd2hlbiB1c2luZyBkeW5hbWljIGxpbmtpbmcpLgotSG93ZXZlciwgdGhpcyBpcyBvdXR3ZWlnaGVkIGJ5IHRoZSBzaW1wbGljaXR5IG9mIGFkZGVuZCBoYW5kbGluZyB3aGVuCi11c2luZyBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucy4gIFdpdGggQHNhbXB7UmVsfSByZWxvY2F0aW9ucywgdGhlIGFkZGVuZAotbXVzdCBiZSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdoaWNoIG1ha2VzIHJlbG9jYXRlYWJsZSBsaW5rcwotbW9yZSBjb21wbGV4LgotCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgQyBjb2RlIGxpa2UgQGNvZGV7aSA9IGFbMTAwMF07fSB3aGVyZSBAc2FtcHthfSBpcwotYSBnbG9iYWwgYXJyYXkuICBUaGUgaW5zdHJ1Y3Rpb25zIHdoaWNoIGxvYWQgdGhlIHZhbHVlIG9mIEBzYW1we2FbMTAwMF19Ci13aWxsIG1vc3QgbGlrZWx5IHVzZSBhIHJlbG9jYXRpb24gd2hpY2ggcmVmZXJzIHRvIHRoZSBzeW1ib2wKLXJlcHJlc2VudGluZyBAc2FtcHthfSwgd2l0aCBhbiBhZGRlbmQgdGhhdCBnaXZlcyB0aGUgb2Zmc2V0IGZyb20gdGhlCi1zdGFydCBvZiBAc2FtcHthfSB0byBlbGVtZW50IEBzYW1wezEwMDB9LiAgV2hlbiB1c2luZyBAc2FtcHtSZWx9Ci1yZWxvY2F0aW9ucywgdGhhdCBhZGRlbmQgbXVzdCBiZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLgotSWYgeW91IGFyZSBhZGRpbmcgc3VwcG9ydCBmb3IgYSBSSVNDIGNoaXAgd2hpY2ggdXNlcyB0d28gb3IgbW9yZQotaW5zdHJ1Y3Rpb25zIHRvIGxvYWQgYW4gYWRkcmVzcywgdGhlbiB0aGUgYWRkZW5kIG1heSBub3QgZml0IGluIGEgc2luZ2xlCi1pbnN0cnVjdGlvbiwgYW5kIHdpbGwgaGF2ZSB0byBiZSBzb21laG93IHNwbGl0IGFtb25nIHRoZSBpbnN0cnVjdGlvbnMuCi1UaGlzIG1ha2VzIGxpbmtpbmcgYXdrd2FyZCwgcGFydGljdWxhcmx5IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluawotaW4gd2hpY2ggdGhlIGFkZGVuZCBtYXkgaGF2ZSB0byBiZSB1cGRhdGVkLiAgSXQgY2FuIGJlIGRvbmUtLS10aGUgTUlQUwotRUxGIHN1cHBvcnQgZG9lcyBpdC0tLWJ1dCBpdCBzaG91bGQgYmUgYXZvaWRlZCB3aGVuIHBvc3NpYmxlLgotCi1JdCBpcyBwb3NzaWJsZSwgdGhvdWdoIHNvbWV3aGF0IGF3a3dhcmQsIHRvIHN1cHBvcnQgYm90aCBAc2FtcHtSZWx9IGFuZAotQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMgZm9yIGEgc2luZ2xlIHRhcmdldDsgQGZpbGV7ZWxmNjQtbWlwcy5jfSBkb2VzIGl0Ci1ieSBvdmVycmlkaW5nIHRoZSByZWxvY2F0aW9uIHJlYWRpbmcgYW5kIHdyaXRpbmcgcm91dGluZXMuCi1AaXRlbQotRGVmaW5lIGhvd3RvIHN0cnVjdHVyZXMgZm9yIGFsbCB0aGUgcmVsb2NhdGlvbiB0eXBlcy4KLUBpdGVtCi1EZWZpbmUgYSBAc2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9IHJvdXRpbmUuICBUaGlzIG11c3QgYmUgbmFtZWQKLUBzYW1we2JmZF9lbGZAdmFye25ufV9iZmRfcmVsb2NfdHlwZV9sb29rdXB9LCBhbmQgbWF5IGJlIGVpdGhlciBhCi1mdW5jdGlvbiBvciBhIG1hY3JvLiAgSXQgbXVzdCB0cmFuc2xhdGUgYSBCRkQgcmVsb2NhdGlvbiBjb2RlIGludG8gYQotaG93dG8gc3RydWN0dXJlLiAgVGhpcyBpcyBub3JtYWxseSBhIHRhYmxlIGxvb2t1cCBvciBhIHNpbXBsZSBzd2l0Y2guCi1AaXRlbQotSWYgdXNpbmcgQHNhbXB7UmVsfSByZWxvY2F0aW9ucywgZGVmaW5lIEBzYW1we2VsZl9pbmZvX3RvX2hvd3RvX3JlbH0uCi1JZiB1c2luZyBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucywgZGVmaW5lIEBzYW1we2VsZl9pbmZvX3RvX2hvd3RvfS4KLUVpdGhlciB3YXksIHRoaXMgaXMgYSBtYWNybyBkZWZpbmVkIGFzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2hpY2gKLXRha2VzIGFuIEBzYW1we2FyZWxlbnR9IGFuZCBhIEBzYW1we1JlbH0gb3IgQHNhbXB7UmVsYX0gc3RydWN0dXJlLCBhbmQKLXNldHMgdGhlIEBzYW1we2hvd3RvfSBmaWVsZCBvZiB0aGUgQHNhbXB7YXJlbGVudH0gYmFzZWQgb24gdGhlCi1Ac2FtcHtSZWx9IG9yIEBzYW1we1JlbGF9IHN0cnVjdHVyZS4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlcwotQHNhbXB7RUxGQHZhcntubn1fUl9UWVBFfSB0byBnZXQgdGhlIEVMRiByZWxvY2F0aW9uIHR5cGUgYW5kIHVzZXMgaXQgYXMKLWFuIGluZGV4IGludG8gYSB0YWJsZSBvZiBob3d0byBzdHJ1Y3R1cmVzLgotQGVuZCBpdGVtaXplCi0KLVlvdSBtdXN0IGFsc28gYWRkIHRoZSBtYWdpYyBudW1iZXIgZm9yIHRoaXMgcHJvY2Vzc29yIHRvIHRoZQotQHNhbXB7cHJlcF9oZWFkZXJzfSBmdW5jdGlvbiBpbiBAZmlsZXtlbGYuY30uCi0KLVlvdSBtdXN0IGFsc28gY3JlYXRlIGEgaGVhZGVyIGZpbGUgaW4gdGhlIEBmaWxle2luY2x1ZGUvZWxmfSBkaXJlY3RvcnkKLWNhbGxlZCBAZmlsZXtAdmFye2NwdX0uaH0uICBUaGlzIGZpbGUgc2hvdWxkIGRlZmluZSBhbnkgdGFyZ2V0IHNwZWNpZmljIAotaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlIG5lZWRlZCBvdXRzaWRlIG9mIHRoZSBCRkQgY29kZS4gIEluIHBhcnRpY3VsYXIKLWl0IHNob3VsZCB1c2UgdGhlIEBzYW1we1NUQVJUX1JFTE9DX05VTUJFUlN9LCBAc2FtcHtSRUxPQ19OVU1CRVJ9LAotQHNhbXB7RkFLRV9SRUxPQ30sIEBzYW1we0VNUFRZX1JFTE9DfSBhbmQgQHNhbXB7RU5EX1JFTE9DX05VTUJFUlN9Ci1tYWNyb3MgdG8gY3JlYXRlIGEgdGFibGUgbWFwcGluZyB0aGUgbnVtYmVyIHVzZWQgdG8gaW5kZW50aWZ5IGEKLXJlbG9jYXRpb24gdG8gYSBuYW1lIGRlc2NyaWJpbmcgdGhhdCByZWxvY2F0aW9uLgotCi1XaGlsZSBub3QgYSBCRkQgY29tcG9uZW50LCB5b3UgcHJvYmFibHkgYWxzbyB3YW50IHRvIG1ha2UgdGhlIGJpbnV0aWxzCi1wcm9ncmFtIEBzYW1we3JlYWRlbGZ9IHBhcnNlIHlvdXIgRUxGIG9iamVjdHMuICBGb3IgdGhpcywgeW91IG5lZWQgdG8gYWRkCi1jb2RlIGZvciBAY29kZXtFTV9AdmFye2NwdX19IGFzIGFwcHJvcHJpYXRlIGluIEBmaWxle2JpbnV0aWxzL3JlYWRlbGYuY30uCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIGxpbmtlcgotQHN1YnN1YnNlY3Rpb24gUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0KLVRoZSBsaW5rZXIgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGlmIHlvdSBkZWZpbmUgYSByZWxvY2F0ZSBzZWN0aW9uCi1mdW5jdGlvbi4gIFRoaXMgd2lsbCBwZXJtaXQgQkZEIHRvIHVzZSB0aGUgRUxGIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0LgotCi1JZiB5b3UgZG8gbm90IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIEJGRCBtdXN0IHVzZSB0aGUKLWdlbmVyaWMgbGlua2VyIHN1cHBvcnQsIHdoaWNoIHJlcXVpcmVzIGNvbnZlcnRpbmcgYWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9ucyBpbnRvIEJGRCBAc2FtcHthc3ltYm9sfSBhbmQgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluCi10aGlzIGNhc2UsIHJlbG9jYXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBjYWxsaW5nCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSwgd2hpY2ggd2lsbCB1c2UgdGhlIGhvd3RvIHN0cnVjdHVyZXMgeW91Ci1oYXZlIGRlZmluZWQuICBAeHJlZntCRkQgcmVsb2NhdGlvbiBoYW5kbGluZ30uCi0KLUluIG9yZGVyIHRvIHN1cHBvcnQgbGlua2luZyBpbnRvIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcwotUy1yZWNvcmRzLCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBtdXN0IHdvcmsgY29ycmVjdGx5IHdpdGggeW91cgotaG93dG8gc3RydWN0dXJlcywgc28geW91IGNhbid0IHNraXAgdGhhdCBzdGVwLiAgSG93ZXZlciwgaWYgeW91IGRlZmluZQotdGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIHRoZW4gaW4gdGhlIG5vcm1hbCBjYXNlIG9mIGxpbmtpbmcgaW50bwotYW4gRUxGIGZpbGUgdGhlIGxpbmtlciB3aWxsIG5vdCBuZWVkIHRvIGNvbnZlcnQgc3ltYm9scyBhbmQgcmVsb2NhdGlvbnMsCi1hbmQgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1UbyB1c2UgYSByZWxvY2F0aW9uIHNlY3Rpb24gZnVuY3Rpb24sIGRlZmluZSB0aGUgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb259IGFzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2hpY2ggd2lsbAotdGFrZSB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLCBhcyB3ZWxsIGFzIHJlbG9jYXRpb24sIHN5bWJvbCwgYW5kIG90aGVyCi1pbmZvcm1hdGlvbiwgYW5kIG1vZGlmeSB0aGUgc2VjdGlvbiBjb250ZW50cyBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLiAgSW4gc2ltcGxlIGNhc2VzLCB0aGlzIGlzIGxpdHRsZSBtb3JlIHRoYW4gYSBsb29wIG92ZXIgdGhlCi1yZWxvY2F0aW9ucyB3aGljaCBjb21wdXRlcyB0aGUgdmFsdWUgb2YgZWFjaCByZWxvY2F0aW9uIGFuZCBjYWxscwotQHNhbXB7X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlfS4gIFRoZSBmdW5jdGlvbiBtdXN0IGNoZWNrIGZvciBhCi1yZWxvY2F0ZWFibGUgbGluaywgYW5kIGluIHRoYXQgY2FzZSBub3JtYWxseSBuZWVkcyB0byBkbyBub3RoaW5nIG90aGVyCi10aGFuIGFkanVzdCB0aGUgYWRkZW5kIGZvciByZWxvY2F0aW9ucyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wuCi0KLVRoZSBjb21wbGV4IGNhc2VzIGdlbmVyYWxseSBoYXZlIHRvIGRvIHdpdGggZHluYW1pYyBsaW5rZXIgc3VwcG9ydC4gIEdPVAotYW5kIFBMVCByZWxvY2F0aW9ucyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBhbmQgdGhlIGxpbmtlciBub3JtYWxseQotYXJyYW5nZXMgdG8gc2V0IHVwIHRoZSBHT1QgYW5kIFBMVCBzZWN0aW9ucyB3aGlsZSBoYW5kbGluZyByZWxvY2F0aW9ucy4KLVdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCByYW5kb20gcmVsb2NhdGlvbnMgbXVzdCBub3JtYWxseSBiZQotY29waWVkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LCBvciBjb252ZXJ0ZWQgdG8gUkVMQVRJVkUgcmVsb2NhdGlvbnMKLXdoZW4gcG9zc2libGUuCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlciBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBvcHRpb25zCi0KLVRoZXJlIGFyZSBtYW55IG90aGVyIG1hY3JvcyB3aGljaCBtYXkgYmUgZGVmaW5lZCBpbgotQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LiAgVGhlc2UgbWFjcm9zIG1heSBiZSBmb3VuZCBpbgotQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9LgotCi1NYWNyb3MgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZSBvZiB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0IHZlY3RvcgotZnVuY3Rpb25zLgotCi1TZXZlcmFsIHByb2Nlc3NvciBzcGVjaWZpYyBob29rIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgZGVmaW5lZCBhcwotbWFjcm9zLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3VuZCBhcyBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUKLUBzYW1we2VsZl9iYWNrZW5kX2RhdGF9IHN0cnVjdHVyZSBkZWZpbmVkIGluIEBmaWxle2VsZi1iZmQuaH0uICBJbgotZ2VuZXJhbCwgYSBob29rIGZ1bmN0aW9uIGlzIHNldCBieSBkZWZpbmluZyBhIG1hY3JvCi1Ac2FtcHtlbGZfYmFja2VuZF9AdmFye25hbWV9fS4KLQotVGhlcmUgYXJlIGEgZmV3IHByb2Nlc3NvciBzcGVjaWZpYyBjb25zdGFudHMgd2hpY2ggbWF5IGFsc28gYmUgZGVmaW5lZC4KLVRoZXNlIGFyZSBhZ2FpbiBmb3VuZCBpbiB0aGUgQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlLgotCi1JIHdpbGwgbm90IGRlZmluZSB0aGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBoZXJlOyBzZWUgdGhlCi1jb21tZW50cyBpbiBAZmlsZXtlbGYtYmZkLmh9LgotCi1Ob3JtYWxseSBhbnkgb2RkIGNoYXJhY3RlcmlzdGljIG9mIGEgcGFydGljdWxhciBFTEYgcHJvY2Vzc29yIGlzIGhhbmRsZWQKLXZpYSBhIGhvb2sgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgdGhlIHNwZWNpYWwgQHNhbXB7U0hOX01JUFNfU0NPTU1PTn0KLXNlY3Rpb24gbnVtYmVyIGZvdW5kIGluIE1JUFMgRUxGIGlzIGhhbmRsZWQgdmlhIHRoZSBob29rcwotQHNhbXB7c2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9ufSwgQHNhbXB7c3ltYm9sX3Byb2Nlc3Npbmd9LAotQHNhbXB7YWRkX3N5bWJvbF9ob29rfSwgYW5kIEBzYW1we291dHB1dF9zeW1ib2xfaG9va30uCi0KLUR5bmFtaWMgbGlua2luZyBzdXBwb3J0LCB3aGljaCBpbnZvbHZlcyBwcm9jZXNzb3Igc3BlY2lmaWMgcmVsb2NhdGlvbnMKLXJlcXVpcmluZyBzcGVjaWFsIGhhbmRsaW5nLCBpcyBhbHNvIGltcGxlbWVudGVkIHZpYSBob29rIGZ1bmN0aW9ucy4KLQotQG5vZGUgQkZEIEVMRiBjb3JlIGZpbGVzCi1Ac3Vic2VjdGlvbiBCRkQgRUxGIGNvcmUgZmlsZXMKLUBjaW5kZXggZWxmIGNvcmUgZmlsZXMKLQotT24gbmF0aXZlIEVMRiBVbml4IHN5c3RlbXMsIGNvcmUgZmlsZXMgYXJlIGdlbmVyYXRlZCB3aXRob3V0IGFueQotc2VjdGlvbnMuICBJbnN0ZWFkLCB0aGV5IG9ubHkgaGF2ZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIHJlYWQgYW4gRUxGIGNvcmUgZmlsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsCi1hY3R1YWxseSByZXByZXNlbnQgcHJvZ3JhbSBzZWdtZW50cy4gIFNpbmNlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGRvIG5vdAotaGF2ZSBuYW1lcywgQkZEIHdpbGwgaW52ZW50IG5hbWVzIGxpa2UgQHNhbXB7c2VnbWVudEB2YXJ7bn19IHdoZXJlCi1AdmFye259IGlzIGEgbnVtYmVyLgotCi1BIHNpbmdsZSBFTEYgcHJvZ3JhbSBzZWdtZW50IG1heSBpbmNsdWRlIGJvdGggYW4gaW5pdGlhbGl6ZWQgcGFydCBhbmQgYW4KLXVuaW5pdGlhbGl6ZWQgcGFydC4gIFRoZSBzaXplIG9mIHRoZSBpbml0aWFsaXplZCBwYXJ0IGlzIGdpdmVuIGJ5IHRoZQotQHNhbXB7cF9maWxlc3p9IGZpZWxkLiAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHNlZ21lbnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX21lbXN6fSBmaWVsZC4gIElmIEBzYW1we3BfbWVtc3p9IGlzIGxhcmdlciB0aGFuIEBzYW1we3BfZmlsZXN6fSwKLXRoZW4gdGhlIGV4dHJhIHNwYWNlIGlzIHVuaW5pdGlhbGl6ZWQsIG9yLCBtb3JlIHByZWNpc2VseSwgaW5pdGlhbGl6ZWQKLXRvIHplcm8uCi0KLUJGRCB3aWxsIHJlcHJlc2VudCBzdWNoIGEgcHJvZ3JhbSBzZWdtZW50IGFzIHR3byBkaWZmZXJlbnQgc2VjdGlvbnMuCi1UaGUgZmlyc3QsIG5hbWVkIEBzYW1we3NlZ21lbnRAdmFye259YX0sIHdpbGwgcmVwcmVzZW50IHRoZSBpbml0aWFsaXplZAotcGFydCBvZiB0aGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIHNlY29uZCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1ifSwKLXdpbGwgcmVwcmVzZW50IHRoZSB1bmluaXRpYWxpemVkIHBhcnQuCi0KLUVMRiBjb3JlIGZpbGVzIHN0b3JlIHNwZWNpYWwgaW5mb3JtYXRpb24gc3VjaCBhcyByZWdpc3RlciB2YWx1ZXMgaW4KLXByb2dyYW0gc2VnbWVudHMgd2l0aCB0aGUgdHlwZSBAc2FtcHtQVF9OT1RFfS4gIEJGRCB3aWxsIGF0dGVtcHQgdG8KLWludGVycHJldCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlc2Ugc2VnbWVudHMsIGFuZCB3aWxsIGNyZWF0ZSBhZGRpdGlvbmFsCi1zZWN0aW9ucyBob2xkaW5nIHRoZSBpbmZvcm1hdGlvbi4gIFNvbWUgb2YgdGhpcyBpbnRlcnByZXRhdGlvbiByZXF1aXJlcwotaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIGhvc3QgaGVhZGVyIGZpbGUgQGZpbGV7c3lzL3Byb2Nmcy5ofSwgYW5kIHNvCi13aWxsIG9ubHkgd29yayB3aGVuIEJGRCBpcyBidWlsdCBvbiBhIG5hdGl2ZSBzeXN0ZW0uCi0KLUJGRCBkb2VzIG5vdCBjdXJyZW50bHkgcHJvdmlkZSBhbnkgd2F5IHRvIGNyZWF0ZSBhbiBFTEYgY29yZSBmaWxlLiAgSW4KLWdlbmVyYWwsIEJGRCBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGNyZWF0ZSBjb3JlIGZpbGVzLiAgVGhlIHdheSB0bwotaW1wbGVtZW50IHRoaXMgd291bGQgYmUgdG8gd3JpdGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGFuZAotQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lcyBmb3IgdGhlIEBzYW1we2JmZF9jb3JlfSB0eXBlOyBzZWUKLUByZWZ7QkZEIHRhcmdldCB2ZWN0b3IgZm9ybWF0fS4KLQotQG5vZGUgQkZEIEVMRiBmdXR1cmUKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZnV0dXJlCi0KLVRoZSBjdXJyZW50IGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGhhcyB0b28gbXVjaCBjb2RlIGR1cGxpY2F0aW9uLgotV2hpbGUgZWFjaCBwcm9jZXNzb3IgaGFzIHBhcnRpY3VsYXIgZGlmZmVyZW5jZXMsIG11Y2ggb2YgdGhlIGR5bmFtaWMKLWxpbmtpbmcgc3VwcG9ydCBpcyBxdWl0ZSBzaW1pbGFyIGZvciBlYWNoIHByb2Nlc3Nvci4gIFRoZSBHT1QgYW5kIFBMVAotYXJlIGhhbmRsZWQgaW4gZmFpcmx5IHNpbWlsYXIgd2F5cywgdGhlIGRldGFpbHMgb2YgLUJzeW1ib2xpYyBsaW5raW5nCi1hcmUgZ2VuZXJhbGx5IHNpbWlsYXIsIGV0Yy4gIFRoaXMgY29kZSBzaG91bGQgYmUgcmV3b3JrZWQgdG8gdXNlIG1vcmUKLWdlbmVyaWMgZnVuY3Rpb25zLCBlbGltaW5hdGluZyB0aGUgZHVwbGljYXRpb24uCi0KLVNpbWlsYXJseSwgdGhlIHJlbG9jYXRpb24gaGFuZGxpbmcgaGFzIHRvbyBtdWNoIGR1cGxpY2F0aW9uLiAgTWFueSBvZgotdGhlIEBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSBhbmQgQHNhbXB7aW5mb190b19ob3d0b30gZnVuY3Rpb25zIGFyZQotcXVpdGUgc2ltaWxhci4gIFRoZSByZWxvY2F0ZSBzZWN0aW9uIGZ1bmN0aW9ucyBhcmUgYWxzbyBvZnRlbiBxdWl0ZQotc2ltaWxhciwgYm90aCBpbiB0aGUgc3RhbmRhcmQgbGlua2VyIGhhbmRsaW5nIGFuZCB0aGUgZHluYW1pYyBsaW5rZXIKLWhhbmRsaW5nLiAgTWFueSBvZiB0aGUgQ09GRiBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZHMgc2hhcmUgYSBzaW5nbGUKLXJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24gKEBzYW1we19iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb259KSwKLWFuZCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBmb3IgdGhlIEVMRiB0YXJnZXRzCi1hcyB3ZWxsLgotCi1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIG1hZ2ljIG51bWJlciBpbgotQHNhbXB7cHJlcF9oZWFkZXJzfSBpbiBAZmlsZXtlbGYuY30gaXMgc29tZXdoYXQgYm9ndXMuICBJdCBzaG91bGQgYmUKLXBvc3NpYmxlIHRvIGFkZCBzdXBwb3J0IGZvciBhIG5ldyBwcm9jZXNzb3Igd2l0aG91dCBjaGFuZ2luZyB0aGUgZ2VuZXJpYwotc3VwcG9ydC4KLQotVGhlIHByb2Nlc3NvciBmdW5jdGlvbiBob29rcyBhbmQgY29uc3RhbnRzIGFyZSBhZCBob2MgYW5kIG5lZWQgYmV0dGVyCi1kb2N1bWVudGF0aW9uLgotCi1XaGVuIGEgbGlua2VyIHNjcmlwdCB1c2VzIEBzYW1we1NJWkVPRl9IRUFERVJTfSwgdGhlIEVMRiBiYWNrZW5kIG11c3QKLWd1ZXNzIGF0IHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cyB3aGljaCB3aWxsIGJlIHJlcXVpcmVkLCBpbgotQHNhbXB7Z2V0X3Byb2dyYW1faGVhZGVyX3NpemV9LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsaW5rZXIgY2FsbHMKLUBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30gYmVmb3JlIGl0IGtub3dzIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgYW5kCi1zaXplcy4gIFRoZSBFTEYgYmFja2VuZCBtYXkgbGF0ZXIgZGlzY292ZXIsIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbQotc2VnbWVudHMsIHRoYXQgbW9yZSBwcm9ncmFtIHNlZ21lbnRzIGFyZSByZXF1aXJlZC4gIFRoaXMgaXMgY3VycmVudGx5Ci1yZXBvcnRlZCBhcyBhbiBlcnJvciBpbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfS4KLQotSW4gcHJhY3RpY2UgdGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gdXNlIEBzYW1we1NJWkVPRl9IRUFERVJTfSBleGNlcHQKLXdpdGggYSBjYXJlZnVsbHkgZGVmaW5lZCBsaW5rZXIgc2NyaXB0LiAgVW5mb3J0dW5hdGVseSwKLUBzYW1we1NJWkVPRl9IRUFERVJTfSBpcyByZXF1aXJlZCBmb3IgZmFzdCBwcm9ncmFtIGxvYWRpbmcgb24gYSBuYXRpdmUKLXN5c3RlbSwgc2luY2UgaXQgcGVybWl0cyB0aGUgaW5pdGlhbCBjb2RlIHNlY3Rpb24gdG8gYXBwZWFyIG9uIHRoZSBzYW1lCi1wYWdlIGFzIHRoZSBwcm9ncmFtIHNlZ21lbnRzLCBzYXZpbmcgYSBwYWdlIHJlYWQgd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMKLXJ1bm5pbmcuICBGb3J0dW5hdGVseSwgbmF0aXZlIHN5c3RlbXMgcGVybWl0IGNhcmVmdWwgZGVmaW5pdGlvbiBvZiB0aGUKLWxpbmtlciBzY3JpcHQuICBTdGlsbCwgaWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgcmVsYXhhdGlvbiB0bwotY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gc2VnbWVudHMuCi0KLUBub2RlIEJGRCBnbG9zc2FyeQotQHNlY3Rpb24gQkZEIGdsb3NzYXJ5Ci1AY2luZGV4IGdsb3NzYXJ5IGZvciBiZmQKLUBjaW5kZXggYmZkIGdsb3NzYXJ5Ci0KLVRoaXMgaXMgYSBzaG9ydCBnbG9zc2FyeSBvZiBzb21lIEJGRCB0ZXJtcy4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBhLm91dAotVGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBvcmlnaW5hbCBVbml4IG9iamVjdCBmaWxlIGZvcm1hdC4KLVN0aWxsIHVzZWQgb24gU3VuT1MsIHRob3VnaCBub3QgU29sYXJpcy4gIFN1cHBvcnRzIG9ubHkgdGhyZWUgc2VjdGlvbnMuCi0KLUBpdGVtIGFyY2hpdmUKLUEgY29sbGVjdGlvbiBvZiBvYmplY3QgZmlsZXMgcHJvZHVjZWQgYW5kIG1hbmlwdWxhdGVkIGJ5IHRoZSBAc2FtcHthcn0KLXByb2dyYW0uCi0KLUBpdGVtIGJhY2tlbmQKLVRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gQkZEIG9mIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUKLXNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhciB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBCRkQKLVRoZSBCRkQgbGlicmFyeSBpdHNlbGYuICBBbHNvLCBlYWNoIG9iamVjdCBmaWxlLCBhcmNoaXZlLCBvciBleGVjdGFibGUKLW9wZW5lZCBieSB0aGUgQkZEIGxpYnJhcnkgaGFzIHRoZSB0eXBlIEBzYW1we2JmZCAqfSwgYW5kIGlzIHNvbWV0aW1lcwotcmVmZXJyZWQgdG8gYXMgYSBiZmQuCi0KLUBpdGVtIENPRkYKLVRoZSBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBVbml4IFNWUjMuICBVc2VkIGJ5IHNvbWUKLWVtYmVkZGVkIHRhcmdldHMsIGFsdGhvdWdoIEVMRiBpcyBub3JtYWxseSBiZXR0ZXIuCi0KLUBpdGVtIERMTAotQSBzaGFyZWQgbGlicmFyeSBvbiBXaW5kb3dzLgotCi1AaXRlbSBkeW5hbWljIGxpbmtlcgotV2hlbiBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBpcyBydW4sIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBsaWJyYXJ5IGFuZCBhcnJhbmdlIHRvIHNvbWVob3cKLWluY2x1ZGUgaXQgaW4gdGhlIHJ1bm5pbmcgaW1hZ2UuCi0KLUBpdGVtIGR5bmFtaWMgb2JqZWN0Ci1Bbm90aGVyIG5hbWUgZm9yIGFuIEVMRiBzaGFyZWQgbGlicmFyeS4KLQotQGl0ZW0gRUNPRkYKLVRoZSBFeHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBbHBoYSBEaWdpdGFsIFVuaXgKLShmb3JtZXJseSBPU0YvMSksIGFzIHdlbGwgYXMgVWx0cml4IGFuZCBJcml4IDQuICBBIHZhcmlhbnQgb2YgQ09GRi4KLQotQGl0ZW0gRUxGCi1UaGUgRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQuICBUaGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgb24gbW9zdAotbW9kZXJuIFVuaXggc3lzdGVtcywgaW5jbHVkaW5nIEdOVS9MaW51eCwgU29sYXJpcywgSXJpeCwgYW5kIFNWUjQuICBBbHNvCi11c2VkIG9uIG1hbnkgZW1iZWRkZWQgc3lzdGVtcy4KLQotQGl0ZW0gZXhlY3V0YWJsZQotQSBwcm9ncmFtLCB3aXRoIGluc3RydWN0aW9ucyBhbmQgc3ltYm9scywgYW5kIHBlcmhhcHMgZHluYW1pYyBsaW5raW5nCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGEgbGlua2VyLgotCi1AaXRlbSBMTUEKLUxvYWQgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIGEgc2VjdGlvbiB3aWxsIGJlCi1sb2FkZWQuICBDb21wYXJlIHdpdGggVk1BLCBiZWxvdy4KLQotQGl0ZW0gTkxNCi1OZXRXYXJlIExvYWRhYmxlIE1vZHVsZS4gIFVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3Qgd2hpY2gKLWJlIGxvYWRlZCBpbnRvIE5ldFdhcmUsIHdoaWNoIGlzIHNvbWUga2luZCBvZiBQQyBiYXNlZCBuZXR3b3JrIHNlcnZlcgotcHJvZ3JhbS4KLQotQGl0ZW0gb2JqZWN0IGZpbGUKLUEgYmluYXJ5IGZpbGUgaW5jbHVkaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBOb3JtYWxseSBwcm9kdWNlZCBieSBhbiBhc3NlbWJsZXIuCi0KLUBpdGVtIG9iamVjdCBmaWxlIGZvcm1hdAotVGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZS4gIFR5cGljYWxseSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzCi1mb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0LCBhbHRob3VnaCBleGVjdXRhYmxlcwotd2lsbCBub3QgY29udGFpbiBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gUEUKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCB1c2VkIGZvcgotV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgb2JqZWN0IGZpbGVzLiAgSXQgaXMgYmFzZWQgY2xvc2VseSBvbgotQ09GRiwgYnV0IGhhcyBhIGZldyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4KLQotQGl0ZW0gUEVJCi1UaGUgUG9ydGFibGUgRXhlY3V0YWJsZSBJbWFnZSBmb3JtYXQuICBUaGlzIGlzIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKLXVzZWQgZm9yIFdpbmRvd3MgKHNwZWNpZmljYWxseSwgV2luMzIpIGV4ZWN1dGFibGVzLiAgSXQgaXMgdmVyeSBzaW1pbGFyCi10byBQRSwgYnV0IGluY2x1ZGVzIHNvbWUgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uCi0KLUBpdGVtIHJlbG9jYXRpb25zCi1JbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gYWRqdXN0IHNlY3Rpb24gY29udGVudHMuICBBbHNvIGNhbGxlZAotcmVsb2NzLgotCi1AaXRlbSBzZWN0aW9uCi1PYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGUgYXJlIGNvbXBvc2VkIG9mIHNlY3Rpb25zLiAgU2VjdGlvbnMgaGF2ZQotb3B0aW9uYWwgZGF0YSBhbmQgb3B0aW9uYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gc2hhcmVkIGxpYnJhcnkKLUEgbGlicmFyeSBvZiBmdW5jdGlvbnMgd2hpY2ggbWF5IGJlIHVzZWQgYnkgbWFueSBleGVjdXRhYmxlcyB3aXRob3V0Ci1hY3R1YWxseSBiZWluZyBsaW5rZWQgaW50byBlYWNoIGV4ZWN1dGFibGUuICBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQKLWltcGxlbWVudGF0aW9ucyBvZiBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGhhdmluZyBzbGlnaHRseSBkaWZmZXJlbnQKLWZlYXR1cmVzLgotCi1AaXRlbSBzeW1ib2wKLUVhY2ggb2JqZWN0IGZpbGUgYW5kIGV4ZWN1dGFibGUgbWF5IGhhdmUgYSBsaXN0IG9mIHN5bWJvbHMsIG9mdGVuCi1yZWZlcnJlZCB0byBhcyB0aGUgc3ltYm9sIHRhYmxlLiAgQSBzeW1ib2wgaXMgYmFzaWNhbGx5IGEgbmFtZSBhbmQgYW4KLWFkZHJlc3MuICBUaGVyZSBtYXkgYWxzbyBiZSBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSB0aGUgdHlwZSBvZgotc3ltYm9sLCBhbHRob3VnaCB0aGUgdHlwZSBvZiBhIHN5bWJvbCBpcyBub3JtYWxseSBzb21ldGhpbmcgc2ltcGxlIGxpa2UKLWZ1bmN0aW9uIG9yIG9iamVjdCwgYW5kIHNob3VsZCBiZSBjb25mdXNlZCB3aXRoIHRoZSBtb3JlIGNvbXBsZXggQwotbm90aW9uIG9mIHR5cGUuICBUeXBpY2FsbHkgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiBhIEMKLXByb2dyYW0gd2lsbCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi1AaXRlbSB0YXJnZXQgdmVjdG9yCi1BIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggaW1wbGVtZW50IHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBvYmplY3QgZmlsZQotZm9ybWF0LiAgVGhlIEBzYW1we2JmZF90YXJnZXR9IHN0cnVjdHVyZS4KLQotQGl0ZW0gV2luMzIKLVRoZSBjdXJyZW50IFdpbmRvd3MgQVBJLCBpbXBsZW1lbnRlZCBieSBXaW5kb3dzIDk1IGFuZCBsYXRlciBhbmQgV2luZG93cwotTlQgMy41MSBhbmQgbGF0ZXIsIGJ1dCBub3QgYnkgV2luZG93cyAzLjEuCi0KLUBpdGVtIFhDT0ZGCi1UaGUgZVh0ZW5kZWQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdC4gIFVzZWQgb24gQUlYLiAgQSB2YXJpYW50IG9mCi1DT0ZGLCB3aXRoIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uLgotCi1AaXRlbSBWTUEKLVZpcnR1YWwgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGEgc2VjdGlvbiB3aWxsIGhhdmUgd2hlbgotYW4gZXhlY3V0YWJsZSBpcyBydW4uICBDb21wYXJlIHdpdGggTE1BLCBhYm92ZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkc2VjIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvYmZkc3VtbS50ZXhpIGIvYmZkL2RvYy9iZmRzdW1tLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDUzMWEuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmRzdW1tLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotQGMgVGhpcyBzdW1tYXJ5IG9mIEJGRCBpcyBzaGFyZWQgYnkgdGhlIEJGRCBhbmQgTEQgZG9jcy4KLVdoZW4gYW4gb2JqZWN0IGZpbGUgaXMgb3BlbmVkLCBCRkQgc3Vicm91dGluZXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgVGhleSB0aGVuIGJ1aWxkIGEgZGVzY3JpcHRvciBpbgotbWVtb3J5IHdpdGggcG9pbnRlcnMgdG8gcm91dGluZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mCi10aGUgb2JqZWN0IGZpbGUncyBkYXRhIHN0cnVjdHVyZXMuCi0KLUFzIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0aGUgb2JqZWN0IGZpbGVzIGlzIHJlcXVpcmVkLAotQkZEIHJlYWRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zIG9mIHRoZSBmaWxlIGFuZCBwcm9jZXNzZXMgdGhlbS4KLUZvciBleGFtcGxlLCBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbiBmb3IgdGhlIGxpbmtlciBpcyBwcm9jZXNzaW5nIHN5bWJvbAotdGFibGVzLiAgRWFjaCBCRkQgYmFjayBlbmQgcHJvdmlkZXMgYSByb3V0aW5lIGZvciBjb252ZXJ0aW5nCi1iZXR3ZWVuIHRoZSBvYmplY3QgZmlsZSdzIHJlcHJlc2VudGF0aW9uIG9mIHN5bWJvbHMgYW5kIGFuIGludGVybmFsCi1jYW5vbmljYWwgZm9ybWF0LiBXaGVuIHRoZSBsaW5rZXIgYXNrcyBmb3IgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBvYmplY3QKLWZpbGUsIGl0IGNhbGxzIHRocm91Z2ggYSBtZW1vcnkgcG9pbnRlciB0byB0aGUgcm91dGluZSBmcm9tIHRoZQotcmVsZXZhbnQgQkZEIGJhY2sgZW5kIHdoaWNoIHJlYWRzIGFuZCBjb252ZXJ0cyB0aGUgdGFibGUgaW50byBhIGNhbm9uaWNhbAotZm9ybS4gIFRoZSBsaW5rZXIgdGhlbiBvcGVyYXRlcyB1cG9uIHRoZSBjYW5vbmljYWwgZm9ybS4gV2hlbiB0aGUgbGluayBpcwotZmluaXNoZWQgYW5kIHRoZSBsaW5rZXIgd3JpdGVzIHRoZSBvdXRwdXQgZmlsZSdzIHN5bWJvbCB0YWJsZSwKLWFub3RoZXIgQkZEIGJhY2sgZW5kIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHRha2UgdGhlIG5ld2x5Ci1jcmVhdGVkIHN5bWJvbCB0YWJsZSBhbmQgY29udmVydCBpdCBpbnRvIHRoZSBjaG9zZW4gb3V0cHV0IGZvcm1hdC4KLQotQG1lbnUKLSogQkZEIGluZm9ybWF0aW9uIGxvc3M6OglJbmZvcm1hdGlvbiBMb3NzCi0qIENhbm9uaWNhbCBmb3JtYXQ6OgkJVGhlIEJGRAljYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0IAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBpbmZvcm1hdGlvbiBsb3NzCi1Ac3Vic2VjdGlvbiBJbmZvcm1hdGlvbiBMb3NzCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBvdXRwdXQufSBUaGUgb3V0cHV0IGZvcm1hdHMKLXN1cHBvcnRlZCBieSBCRkQgZG8gbm90IHByb3ZpZGUgaWRlbnRpY2FsIGZhY2lsaXRpZXMsIGFuZAotaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIGRlc2NyaWJlZCBpbiBvbmUgZm9ybSBoYXMgbm93aGVyZSB0byBnbyBpbgotYW5vdGhlciBmb3JtYXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgYWxpZ25tZW50IGluZm9ybWF0aW9uIGluCi1AY29kZXtiLm91dH0uIFRoZXJlIGlzIG5vd2hlcmUgaW4gYW4gQGNvZGV7YS5vdXR9IGZvcm1hdCBmaWxlIHRvIHN0b3JlCi1hbGlnbm1lbnQgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRhaW5lZCBkYXRhLCBzbyB3aGVuIGEgZmlsZSBpcyBsaW5rZWQKLWZyb20gQGNvZGV7Yi5vdXR9IGFuZCBhbiBAY29kZXthLm91dH0gaW1hZ2UgaXMgcHJvZHVjZWQsIGFsaWdubWVudAotaW5mb3JtYXRpb24gd2lsbCBub3QgcHJvcGFnYXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4gKFRoZSBsaW5rZXIgd2lsbAotc3RpbGwgdXNlIHRoZSBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW50ZXJuYWxseSwgc28gdGhlIGxpbmsgaXMgcGVyZm9ybWVkCi1jb3JyZWN0bHkpLgotCi1Bbm90aGVyIGV4YW1wbGUgaXMgQ09GRiBzZWN0aW9uIG5hbWVzLiBDT0ZGIGZpbGVzIG1heSBjb250YWluIGFuCi11bmxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBlYWNoIG9uZSB3aXRoIGEgdGV4dHVhbCBzZWN0aW9uIG5hbWUuIElmCi10aGUgdGFyZ2V0IG9mIHRoZSBsaW5rIGlzIGEgZm9ybWF0IHdoaWNoIGRvZXMgbm90IGhhdmUgbWFueSBzZWN0aW9ucyAoZS5nLiwKLUBjb2Rle2Eub3V0fSkgb3IgaGFzIHNlY3Rpb25zIHdpdGhvdXQgbmFtZXMgKGUuZy4sIHRoZSBPYXN5cyBmb3JtYXQpLCB0aGUKLWxpbmsgY2Fubm90IGJlIGRvbmUgc2ltcGx5LiBZb3UgY2FuIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtIGJ5Ci1kZXNjcmliaW5nIHRoZSBkZXNpcmVkIGlucHV0LXRvLW91dHB1dCBzZWN0aW9uIG1hcHBpbmcgd2l0aCB0aGUgbGlua2VyIGNvbW1hbmQKLWxhbmd1YWdlLgotCi1AZW1waHtJbmZvcm1hdGlvbiBjYW4gYmUgbG9zdCBkdXJpbmcgY2Fub25pY2FsaXphdGlvbi59IFRoZSBCRkQKLWludGVybmFsIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBleHRlcm5hbCBmb3JtYXRzIGlzIG5vdCBleGhhdXN0aXZlOyB0aGVyZQotYXJlIHN0cnVjdHVyZXMgaW4gaW5wdXQgZm9ybWF0cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGlyZWN0Ci1yZXByZXNlbnRhdGlvbiBpbnRlcm5hbGx5LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBCRkQgYmFjayBlbmRzCi1jYW5ub3QgbWFpbnRhaW4gYWxsIHBvc3NpYmxlIGRhdGEgcmljaG5lc3MgdGhyb3VnaCB0aGUgdHJhbnNmb3JtYXRpb24KLWJldHdlZW4gZXh0ZXJuYWwgdG8gaW50ZXJuYWwgYW5kIGJhY2sgdG8gZXh0ZXJuYWwgZm9ybWF0cy4KLQotVGhpcyBsaW1pdGF0aW9uIGlzIG9ubHkgYSBwcm9ibGVtIHdoZW4gYW4gYXBwbGljYXRpb24gcmVhZHMgb25lCi1mb3JtYXQgYW5kIHdyaXRlcyBhbm90aGVyLiAgRWFjaCBCRkQgYmFjayBlbmQgaXMgcmVzcG9uc2libGUgZm9yCi1tYWludGFpbmluZyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCB0aGUgaW50ZXJuYWwgQkZECi1jYW5vbmljYWwgZm9ybSBoYXMgc3RydWN0dXJlcyB3aGljaCBhcmUgb3BhcXVlIHRvIHRoZSBCRkQgY29yZSwKLWFuZCBleHBvcnRlZCBvbmx5IHRvIHRoZSBiYWNrIGVuZHMuIFdoZW4gYSBmaWxlIGlzIHJlYWQgaW4gb25lIGZvcm1hdCwKLXRoZSBjYW5vbmljYWwgZm9ybSBpcyBnZW5lcmF0ZWQgZm9yIEJGRCBhbmQgdGhlIGFwcGxpY2F0aW9uLiBBdCB0aGUKLXNhbWUgdGltZSwgdGhlIGJhY2sgZW5kIHNhdmVzIGF3YXkgYW55IGluZm9ybWF0aW9uIHdoaWNoIG1heSBvdGhlcndpc2UKLWJlIGxvc3QuIElmIHRoZSBkYXRhIGlzIHRoZW4gd3JpdHRlbiBiYWNrIGluIHRoZSBzYW1lIGZvcm1hdCwgdGhlIGJhY2sKLWVuZCByb3V0aW5lIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGNhbm9uaWNhbCBmb3JtIHByb3ZpZGVkIGJ5IHRoZQotQkZEIGNvcmUgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gaXQgcHJlcGFyZWQgZWFybGllci4gIFNpbmNlCi10aGVyZSBpcyBhIGdyZWF0IGRlYWwgb2YgY29tbW9uYWxpdHkgYmV0d2VlbiBiYWNrIGVuZHMsCi10aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBsb3N0IHdoZW4KLWxpbmtpbmcgb3IgY29weWluZyBiaWcgZW5kaWFuIENPRkYgdG8gbGl0dGxlIGVuZGlhbiBDT0ZGLCBvciBAY29kZXthLm91dH0gdG8KLUBjb2Rle2Iub3V0fS4gIFdoZW4gYSBtaXh0dXJlIG9mIGZvcm1hdHMgaXMgbGlua2VkLCB0aGUgaW5mb3JtYXRpb24gaXMKLW9ubHkgbG9zdCBmcm9tIHRoZSBmaWxlcyB3aG9zZSBmb3JtYXQgZGlmZmVycyBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLQotQG5vZGUgQ2Fub25pY2FsIGZvcm1hdAotQHN1YnNlY3Rpb24gVGhlIEJGRCBjYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLVRoZSBncmVhdGVzdCBwb3RlbnRpYWwgZm9yIGxvc3Mgb2YgaW5mb3JtYXRpb24gb2NjdXJzIHdoZW4gdGhlcmUgaXMgdGhlIGxlYXN0Ci1vdmVybGFwIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UgZm9ybWF0LCB0aGF0Ci1zdG9yZWQgYnkgdGhlIGNhbm9uaWNhbCBmb3JtYXQsIGFuZCB0aGF0IG5lZWRlZCBieSB0aGUKLWRlc3RpbmF0aW9uIGZvcm1hdC4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY2Fub25pY2FsIGZvcm0gbWF5IGhlbHAKLXlvdSB1bmRlcnN0YW5kIHdoaWNoIGtpbmRzIG9mIGRhdGEgeW91IGNhbiBjb3VudCBvbiBwcmVzZXJ2aW5nIGFjcm9zcwotY29udmVyc2lvbnMuCi1AY2luZGV4IEJGRCBjYW5vbmljYWwgZm9ybWF0Ci1AY2luZGV4IGludGVybmFsIG9iamVjdC1maWxlIGZvcm1hdAotCi1AdGFibGUgQGVtcGgKLUBpdGVtIGZpbGVzCi1JbmZvcm1hdGlvbiBzdG9yZWQgb24gYSBwZXItZmlsZSBiYXNpcyBpbmNsdWRlcyB0YXJnZXQgbWFjaGluZQotYXJjaGl0ZWN0dXJlLCBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGZvcm1hdCB0eXBlLCBhIGRlbWFuZCBwYWdlYWJsZQotYml0LCBhbmQgYSB3cml0ZSBwcm90ZWN0ZWQgYml0LiAgSW5mb3JtYXRpb24gbGlrZSBVbml4IG1hZ2ljIG51bWJlcnMgaXMKLW5vdCBzdG9yZWQgaGVyZS0tLW9ubHkgdGhlIG1hZ2ljIG51bWJlcnMnIG1lYW5pbmcsIHNvIGEgQGNvZGV7Wk1BR0lDfQotZmlsZSB3b3VsZCBoYXZlIGJvdGggdGhlIGRlbWFuZCBwYWdlYWJsZSBiaXQgYW5kIHRoZSB3cml0ZSBwcm90ZWN0ZWQKLXRleHQgYml0IHNldC4gIFRoZSBieXRlIG9yZGVyIG9mIHRoZSB0YXJnZXQgaXMgc3RvcmVkIG9uIGEgcGVyLWZpbGUKLWJhc2lzLCBzbyB0aGF0IGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzIG1heSBiZSB1c2VkIHdpdGggb25lCi1hbm90aGVyLgotCi1AaXRlbSBzZWN0aW9ucwotRWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLCB0aGUKLXNlY3Rpb24ncyBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBvYmplY3QgZmlsZSwgc2l6ZSBhbmQgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiwgdmFyaW91cyBmbGFncywgYW5kIHBvaW50ZXJzIGludG8gb3RoZXIgQkZEIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBpdGVtIHN5bWJvbHMKLUVhY2ggc3ltYm9sIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBvYmplY3QgZmlsZQotd2hpY2ggb3JpZ2luYWxseSBkZWZpbmVkIGl0LCBpdHMgbmFtZSwgaXRzIHZhbHVlLCBhbmQgdmFyaW91cyBmbGFnCi1iaXRzLiAgV2hlbiBhIEJGRCBiYWNrIGVuZCByZWFkcyBpbiBhIHN5bWJvbCB0YWJsZSwgaXQgcmVsb2NhdGVzIGFsbAotc3ltYm9scyB0byBtYWtlIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gd2hlcmUgdGhleSB3ZXJlCi1kZWZpbmVkLiAgRG9pbmcgdGhpcyBlbnN1cmVzIHRoYXQgZWFjaCBzeW1ib2wgcG9pbnRzIHRvIGl0cyBjb250YWluaW5nCi1zZWN0aW9uLiAgRWFjaCBzeW1ib2wgYWxzbyBoYXMgYSB2YXJ5aW5nIGFtb3VudCBvZiBoaWRkZW4gcHJpdmF0ZSBkYXRhCi1mb3IgdGhlIEJGRCBiYWNrIGVuZC4gIFNpbmNlIHRoZSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCBmaWxlLCB0aGUKLXByaXZhdGUgZGF0YSBmb3JtYXQgZm9yIHRoYXQgc3ltYm9sIGlzIGFjY2Vzc2libGUuICBAY29kZXtsZH0gY2FuCi1vcGVyYXRlIG9uIGEgY29sbGVjdGlvbiBvZiBzeW1ib2xzIG9mIHdpbGRseSBkaWZmZXJlbnQgZm9ybWF0cyB3aXRob3V0Ci1wcm9ibGVtcy4KLQotTm9ybWFsIGdsb2JhbCBhbmQgc2ltcGxlIGxvY2FsIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gb3V0cHV0LCBzbyBhbgotb3V0cHV0IGZpbGUgKG5vIG1hdHRlciBpdHMgZm9ybWF0KSB3aWxsIHJldGFpbiBzeW1ib2xzIHBvaW50aW5nIHRvCi1mdW5jdGlvbnMgYW5kIHRvIGdsb2JhbCwgc3RhdGljLCBhbmQgY29tbW9uIHZhcmlhYmxlcy4gIFNvbWUgc3ltYm9sCi1pbmZvcm1hdGlvbiBpcyBub3Qgd29ydGggcmV0YWluaW5nOyBpbiBAY29kZXthLm91dH0sIHR5cGUgaW5mb3JtYXRpb24gaXMKLXN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIGxvbmcgc3ltYm9sIG5hbWVzLiAgVGhpcyBpbmZvcm1hdGlvbiB3b3VsZAotYmUgdXNlbGVzcyB0byBtb3N0IENPRkYgZGVidWdnZXJzOyB0aGUgbGlua2VyIGhhcyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLXRvIGFsbG93IHVzZXJzIHRvIHRocm93IGl0IGF3YXkuCi0KLVRoZXJlIGlzIG9uZSB3b3JkIG9mIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBzeW1ib2wsIHNvIGlmIHRoZQotZm9ybWF0IHN1cHBvcnRzIHN5bWJvbCB0eXBlIGluZm9ybWF0aW9uIHdpdGhpbiBzeW1ib2xzIChmb3IgZXhhbXBsZSwgQ09GRiwKLUlFRUUsIE9hc3lzKSBhbmQgdGhlIHR5cGUgaXMgc2ltcGxlIGVub3VnaCB0byBmaXQgd2l0aGluIG9uZSB3b3JkCi0obmVhcmx5IGV2ZXJ5dGhpbmcgYnV0IGFnZ3JlZ2F0ZXMpLCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmVzZXJ2ZWQuCi0KLUBpdGVtIHJlbG9jYXRpb24gbGV2ZWwKLUVhY2ggY2Fub25pY2FsIEJGRCByZWxvY2F0aW9uIHJlY29yZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB0bwotcmVsb2NhdGUgdG8sIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVsb2NhdGUsIHRoZSBzZWN0aW9uIHRoZSBkYXRhCi1pcyBpbiwgYW5kIGEgcG9pbnRlciB0byBhIHJlbG9jYXRpb24gdHlwZSBkZXNjcmlwdG9yLiBSZWxvY2F0aW9uIGlzCi1wZXJmb3JtZWQgYnkgcGFzc2luZyBtZXNzYWdlcyB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIHR5cGUKLWRlc2NyaXB0b3IgYW5kIHRoZSBzeW1ib2wgcG9pbnRlci4gVGhlcmVmb3JlLCByZWxvY2F0aW9ucyBjYW4gYmUgcGVyZm9ybWVkCi1vbiBvdXRwdXQgZGF0YSB1c2luZyBhIHJlbG9jYXRpb24gbWV0aG9kIHRoYXQgaXMgb25seSBhdmFpbGFibGUgaW4gb25lIG9mIHRoZQotaW5wdXQgZm9ybWF0cy4gRm9yIGluc3RhbmNlLCBPYXN5cyBwcm92aWRlcyBhIGJ5dGUgcmVsb2NhdGlvbiBmb3JtYXQuCi1BIHJlbG9jYXRpb24gcmVjb3JkIHJlcXVlc3RpbmcgdGhpcyByZWxvY2F0aW9uIHR5cGUgd291bGQgcG9pbnQKLWluZGlyZWN0bHkgdG8gYSByb3V0aW5lIHRvIHBlcmZvcm0gdGhpcywgc28gdGhlIHJlbG9jYXRpb24gbWF5IGJlCi1wZXJmb3JtZWQgb24gYSBieXRlIGJlaW5nIHdyaXR0ZW4gdG8gYSA2OGsgQ09GRiBmaWxlLCBldmVuIHRob3VnaCA2OGsgQ09GRgotaGFzIG5vIHN1Y2ggcmVsb2NhdGlvbiB0eXBlLgotCi1AaXRlbSBsaW5lIG51bWJlcnMKLU9iamVjdCBmb3JtYXRzIGNhbiBjb250YWluLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBzb21lIGZvcm0gb2YgbWFwcGluZwotYmV0d2VlbiBzeW1ib2xzLCBzb3VyY2UgbGluZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLVRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIHJlbG9jYXRlZCBhbG9uZyB3aXRoIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24uCi1FYWNoIHN5bWJvbCB3aXRoIGFuIGFzc29jaWF0ZWQgbGlzdCBvZiBsaW5lIG51bWJlciByZWNvcmRzIHBvaW50cyB0byB0aGUKLWZpcnN0IHJlY29yZCBvZiB0aGUgbGlzdC4gIFRoZSBoZWFkIG9mIGEgbGluZSBudW1iZXIgbGlzdCBjb25zaXN0cyBvZiBhCi1wb2ludGVyIHRvIHRoZSBzeW1ib2wsIHdoaWNoIGFsbG93cyBmaW5kaW5nIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUKLWZ1bmN0aW9uIHdob3NlIGxpbmUgbnVtYmVyIGlzIGJlaW5nIGRlc2NyaWJlZC4gVGhlIHJlc3Qgb2YgdGhlIGxpc3QgaXMKLW1hZGUgdXAgb2YgcGFpcnM6IG9mZnNldHMgaW50byB0aGUgc2VjdGlvbiBhbmQgbGluZSBudW1iZXJzLiBBbnkgZm9ybWF0Ci13aGljaCBjYW4gc2ltcGx5IGRlcml2ZSB0aGlzIGluZm9ybWF0aW9uIGNhbiBwYXNzIGl0IHN1Y2Nlc3NmdWxseQotYmV0d2VlbiBmb3JtYXRzIChDT0ZGLCBJRUVFIGFuZCBPYXN5cykuCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9iZmQvZG9jL2NoZXcuYyBiL2JmZC9kb2MvY2hldy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE2OWMyLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvY2hldy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3OSArMCwwIEBACi0vKiBjaGV3Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgc3RldmUgY2hhbWJlcmxhaW4gQGN5Z251cwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlldCBhbm90aGVyIHdheSBvZiBleHRyYWN0aW5nIGRvY3VtZW50YXRpb24gZnJvbSBzb3VyY2UuCi0gICBObywgSSBoYXZlbid0IGZpbmlzaGVkIGl0IHlldCwgYnV0IEkgaG9wZSB5b3UgcGVvcGxlIGxpa2UgaXQgYmV0dGVyCi0gICB0aGFuIHRoZSBvbGQgd2F5Ci0gIAotICAgc2FjCi0KLSAgIEJhc2ljYWxseSwgdGhpcyBpcyBhIHNvcnQgb2Ygc3RyaW5nIGZvcnRoLCBtYXliZSB3ZSBzaG91bGQgY2FsbCBpdAotICAgc3RydXRoPwotCi0gICBZb3UgZGVmaW5lIG5ldyB3b3JkcyB0aHVzOgotICAgOiA8bmV3d29yZD4gPG9sZHdvcmRzPiA7Ci0KLSovCi0KLS8qIFByaW1pdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIHByb2dyYW06Ci0KLSAgIFR3byBzdGFja3MgYXJlIHByb3ZpZGVkLCBhIHN0cmluZyBzdGFjayBhbmQgYW4gaW50ZWdlciBzdGFjay4KLQotICAgSW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzOgotCWludGVybmFsX3dhbnRlZCAtIGluZGljYXRlcyB3aGV0aGVyIGAtaScgd2FzIHBhc3NlZAotCWludGVybmFsX21vZGUgLSB1c2VyLXNldHRhYmxlCi0KLSAgIENvbW1hbmRzOgotCXB1c2hfdGV4dAotCSEgLSBwb3AgdG9wIG9mIGludGVnZXIgc3RhY2sgZm9yIGFkZHJlc3MsIHBvcCBuZXh0IGZvciB2YWx1ZTsgc3RvcmUKLQlAIC0gdHJlYXQgdmFsdWUgb24gaW50ZWdlciBzdGFjayBhcyB0aGUgYWRkcmVzcyBvZiBhbiBpbnRlZ2VyOyBwdXNoCi0JCXRoYXQgaW50ZWdlciBvbiB0aGUgaW50ZWdlciBzdGFjayBhZnRlciBwb3BwaW5nIHRoZSAiYWRkcmVzcyIKLQloZWxsbyAtIHByaW50ICJoZWxsb1xuIiB0byBzdGRvdXQKLQlzdGRvdXQgLSBwdXQgc3Rkb3V0IG1hcmtlciBvbiBUT1MKLQlzdGRlcnIgLSBwdXQgc3RkZXJyIG1hcmtlciBvbiBUT1MKLQlwcmludCAtIHByaW50IFRPUy0xIG9uIFRPUyAoZWc6ICJoZWxsb1xuIiBzdGRvdXQgcHJpbnQpCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljYXRzdHIgLSBmbiBpY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgLSBhcHBlbmQgaW5wdXQsIHVwIHRvIGFuZCBpbmNsdWRpbmcgbmV3bGluZSBpbnRvIFRPUwotCWR1cCAtIGZuIG90aGVyX2R1cAotCWRyb3AgLSBkaXNjYXJkIFRPUwotCWlkcm9wIC0gZGl0dG8KLQlyZW1jaGFyIC0gZGVsZXRlIGxhc3QgY2hhcmFjdGVyIGZyb20gVE9TCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlkb19mYW5jeV9zdHVmZiAtIHRyYW5zbGF0ZSA8PGZvbz4+IHRvIEBjb2Rle2Zvb30gaW4gVE9TCi0JYnVsbGV0aXplIC0gaWYgIm8iIGxpbmVzIGZvdW5kLCBwcmVwZW5kIEBpdGVtaXplIEBidWxsZXQgdG8gVE9TCi0JCWFuZCBAaXRlbSB0byBlYWNoICJvIiBsaW5lOyBhcHBlbmQgQGVuZCBpdGVtaXplCi0JY291cmllcml6ZSAtIHB1dCBAZXhhbXBsZSBhcm91bmQgLiBhbmQgfCBsaW5lcywgdHJhbnNsYXRlIHsqICp9IHsgfQotCWV4aXQgLSBmbiBjaGV3X2V4aXQKLQlzd2FwCi0Jb3V0cHV0ZG90cyAtIHN0cmlwIG91dCBsaW5lcyB3aXRob3V0IGxlYWRpbmcgZG90cwotCXBhcmFtc3R1ZmYgLSBjb252ZXJ0IGZ1bGwgZGVjbGFyYXRpb24gaW50byAiUEFSQU1TIiBmb3JtIGlmIG5vdCBhbHJlYWR5Ci0JbWF5YmVjYXRzdHIgLSBkbyBjYXRzdHIgaWYgaW50ZXJuYWxfbW9kZSA9PSBpbnRlcm5hbF93YW50ZWQsIGRpc2NhcmQKLQkJdmFsdWUgaW4gYW55IGNhc2UKLQl0cmFuc2xhdGVjb21tZW50cyAtIHR1cm4geyogYW5kICp9IGludG8gY29tbWVudCBkZWxpbWl0ZXJzCi0Ja2lsbF9ib2d1c19saW5lcyAtIGdldCByaWQgb2YgZXh0cmEgbmV3bGluZXMKLQlpbmRlbnQKLQlpbnRlcm5hbG1vZGUgLSBwb3AgZnJvbSBpbnRlZ2VyIHN0YWNrLCBzZXQgYGludGVybmFsbW9kZScgdG8gdGhhdCB2YWx1ZQotCXByaW50X3N0YWNrX2xldmVsIC0gcHJpbnQgY3VycmVudCBzdGFjayBkZXB0aCB0byBzdGRlcnIKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcyAtIGdvIGFoZWFkLCBndWVzcy4uLgotCVtxdW90ZWQgc3RyaW5nXSAtIHB1c2ggc3RyaW5nIG9udG8gc3RyaW5nIHN0YWNrCi0JW3dvcmQgc3RhcnRpbmcgd2l0aCBkaWdpdF0gLSBwdXNoIGF0b2woc3RyKSBvbnRvIGludGVnZXIgc3RhY2sKLQotICAgQSBjb21tYW5kIG11c3QgYmUgYWxsIHVwcGVyLWNhc2UsIGFuZCBhbG9uZSBvbiBhIGxpbmUuCi0KLSAgIEZvby4gICovCi0KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jZGVmaW5lIERFRl9TSVpFIDUwMDAKLSNkZWZpbmUgU1RBQ0sgNTAKLQotaW50IGludGVybmFsX3dhbnRlZDsKLWludCBpbnRlcm5hbF9tb2RlOwotCi1pbnQgd2FybmluZzsKLQotLyogSGVyZSBpcyBhIHN0cmluZyB0eXBlIC4uLiAqLwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXIgCi17Ci0gIGNoYXIgKnB0cjsKLSAgdW5zaWduZWQgbG9uZyB3cml0ZV9pZHg7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLX0gc3RyaW5nX3R5cGU7Ci0KLQotI2lmZGVmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBpbml0X3N0cmluZ193aXRoX3NpemUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBpbml0X3N0cmluZyAoc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgaW50IGZpbmQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB3cml0ZV9idWZmZXIgKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCBkZWxldGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBjaGFyICphZGRyIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGNoYXIgYXQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBjYXRjaGFyIChzdHJpbmdfdHlwZSAqLCBpbnQpOwotc3RhdGljIHZvaWQgb3ZlcndyaXRlX3N0cmluZyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBjYXRidWYgKHN0cmluZ190eXBlICosIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdHRleHQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBjYXRzdHIgKHN0cmluZ190eXBlICosIHN0cmluZ190eXBlICopOwotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgREVGVU4oaW5pdF9zdHJpbmdfd2l0aF9zaXplLChidWZmZXIsIHNpemUpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHNpemUgKQotewotICAgIGJ1ZmZlci0+d3JpdGVfaWR4ID0gMDsKLSAgICBidWZmZXItPnNpemUgPSBzaXplOwotICAgIGJ1ZmZlci0+cHRyID0gbWFsbG9jKHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGluaXRfc3RyaW5nX3dpdGhfc2l6ZShidWZmZXIsIERFRl9TSVpFKTsKLQotfQotCi1zdGF0aWMgaW50IERFRlVOKGZpbmQsIChzdHIsIHdoYXQpLAotCSAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkgIGNoYXIgKndoYXQpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgY2hhciAqcDsKLSAgICBwID0gd2hhdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLT53cml0ZV9pZHggJiYgKnA7IGkrKykgCi0gICAgewotCWlmICgqcCA9PSBzdHItPnB0cltpXSkKLQkgcCsrOwotCWVsc2UKLQkgcCA9IHdoYXQ7Ci0gICAgfQotICAgIHJldHVybiAoKnAgPT0gMCk7Ci0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKHdyaXRlX2J1ZmZlciwoYnVmZmVyLCBmKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIEZJTEUgKmYpCi17Ci0gICAgZndyaXRlKGJ1ZmZlci0+cHRyLCBidWZmZXItPndyaXRlX2lkeCwgMSwgZik7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4oZGVsZXRlX3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGZyZWUoYnVmZmVyLT5wdHIpOwotfQotCi0KLXN0YXRpYyBjaGFyICpERUZVTihhZGRyLCAoYnVmZmVyLCBpZHgpLAotCSAgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHJldHVybiBidWZmZXItPnB0ciArIGlkeDsKLX0KLQotc3RhdGljIGNoYXIgREVGVU4oYXQsKGJ1ZmZlciwgcG9zKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIHVuc2lnbmVkIGludCBwb3MpIAotewotICBpZiAocG9zID49IGJ1ZmZlci0+d3JpdGVfaWR4KSAKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJ1ZmZlci0+cHRyW3Bvc107Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGNoYXIsKGJ1ZmZlciwgY2gpLCAKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGludCBjaCkKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ID09IGJ1ZmZlci0+c2l6ZSkgCi0gICAgewotICAgICAgYnVmZmVyLT5zaXplICo9MjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyhidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0KLSAgYnVmZmVyLT5wdHJbYnVmZmVyLT53cml0ZV9pZHggKysgXSA9IGNoOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOKG92ZXJ3cml0ZV9zdHJpbmcsKGRzdCwgICBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgICBmcmVlKGRzdC0+cHRyKTsKLSAgICBkc3QtPnNpemUgPSBzcmMtPnNpemU7Ci0gICAgZHN0LT53cml0ZV9pZHggPSBzcmMtPndyaXRlX2lkeDsKLSAgICBkc3QtPnB0ciA9IHNyYy0+cHRyOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXRidWYsKGJ1ZmZlciwgYnVmLCBsZW4pLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgY2hhciAqYnVmIEFORAotCSAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gIGlmIChidWZmZXItPndyaXRlX2lkeCArIGxlbiA+PSBidWZmZXItPnNpemUpCi0gICAgewotICAgICAgd2hpbGUgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLQlidWZmZXItPnNpemUgKj0gMjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyAoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgfQotICBtZW1jcHkgKGJ1ZmZlci0+cHRyICsgYnVmZmVyLT53cml0ZV9pZHgsIGJ1ZiwgbGVuKTsKLSAgYnVmZmVyLT53cml0ZV9pZHggKz0gbGVuOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXR0ZXh0LChidWZmZXIsIHN0cmluZyksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpzdHJpbmcpCi17Ci0gIGNhdGJ1ZiAoYnVmZmVyLCBzdHJpbmcsICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAoc3RyaW5nKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHN0ciwoZHN0LCBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgY2F0YnVmIChkc3QsIHNyYy0+cHRyLCBzcmMtPndyaXRlX2lkeCk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCAKLURFRlVOKHNraXBfd2hpdGVfYW5kX3N0YXJzLChzcmMsIGlkeCksCi0gICAgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgY2hhciBjOwotICB3aGlsZSAoKGMgPSBhdChzcmMsaWR4KSksCi0JIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKQotCSB8fCAoYyA9PSAnKicKLQkgICAgIC8qIERvbid0IHNraXAgcGFzdCBlbmQtb2YtY29tbWVudCBvciBzdGFyIGFzIGZpcnN0Ci0JCWNoYXJhY3RlciBvbiBpdHMgbGluZS4gICovCi0JICAgICAmJiBhdChzcmMsaWR4ICsxKSAhPSAnLycKLQkgICAgICYmIGF0KHNyYyxpZHggLTEpICE9ICdcbicpKSAKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cmluZ190eXBlIHN0YWNrW1NUQUNLXTsKLXN0cmluZ190eXBlICp0b3M7Ci0KLXVuc2lnbmVkIGludCBpZHggPSAwOyAvKiBQb3MgaW4gaW5wdXQgYnVmZmVyICovCi1zdHJpbmdfdHlwZSAqcHRyOyAvKiBhbmQgdGhlIGJ1ZmZlciAqLwotdHlwZWRlZiB2b2lkICgqc3RpbnN0X3R5cGUpKCk7Ci1zdGluc3RfdHlwZSAqcGM7Ci1zdGluc3RfdHlwZSBzc3RhY2tbU1RBQ0tdOwotc3RpbnN0X3R5cGUgKnNzcCA9ICZzc3RhY2tbMF07Ci1sb25nIGlzdGFja1tTVEFDS107Ci1sb25nICppc3AgPSAmaXN0YWNrWzBdOwotCi10eXBlZGVmIGludCAqd29yZF90eXBlOwotCi0KLQotc3RydWN0IGRpY3Rfc3RydWN0Ci17Ci0gICAgY2hhciAqd29yZDsKLSAgICBzdHJ1Y3QgZGljdF9zdHJ1Y3QgKm5leHQ7Ci0gICAgc3RpbnN0X3R5cGUgKmNvZGU7Ci0gICAgaW50IGNvZGVfbGVuZ3RoOwotICAgIGludCBjb2RlX2VuZDsKLSAgICBpbnQgdmFyOwotICAgIAotfTsKLXR5cGVkZWYgc3RydWN0IGRpY3Rfc3RydWN0IGRpY3RfdHlwZTsKLSNkZWZpbmUgV09SRCh4KSBzdGF0aWMgdm9pZCB4KCkKLQotc3RhdGljIHZvaWQKLWRpZSAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtc2cpOwotICBleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmICh0b3MgPCBzdGFjaykKLSAgICBkaWUgKCJ1bmRlcmZsb3cgaW4gc3RyaW5nIHN0YWNrIik7Ci0gIGlmICh0b3MgPj0gc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLX0KLQotc3RhdGljIHZvaWQKLWljaGVja19yYW5nZSAoKQotewotICBpZiAoaXNwIDwgaXN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci0gIGlmIChpc3AgPj0gaXN0YWNrICsgU1RBQ0spCi0gICAgZGllICgib3ZlcmZsb3cgaW4gaW50ZWdlciBzdGFjayIpOwotfQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGV4ZWMgKGRpY3RfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhbGwgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtY2hhciAodm9pZCksIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICh2b2lkKSwgcHVzaF9udW1iZXIgKHZvaWQpOwotc3RhdGljIHZvaWQgcHVzaF90ZXh0ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9ub25jb21tZW50cyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGFja19sZXZlbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwYXJhbXN0dWZmICh2b2lkKSwgdHJhbnNsYXRlY29tbWVudHMgKHZvaWQpOwotc3RhdGljIHZvaWQgb3V0cHV0ZG90cyAodm9pZCksIGNvdXJpZXJpemUgKHZvaWQpLCBidWxsZXRpemUgKHZvaWQpOwotc3RhdGljIHZvaWQgZG9fZmFuY3lfc3R1ZmYgKHZvaWQpOwotc3RhdGljIGludCBpc2NvbW1hbmQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgaW50IGNvcHlfcGFzdF9uZXdsaW5lIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQsIHN0cmluZ190eXBlICopOwotc3RhdGljIHZvaWQgaWNvcHlfcGFzdF9uZXdsaW5lICh2b2lkKSwga2lsbF9ib2d1c19saW5lcyAodm9pZCksIGluZGVudCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBnZXRfc3R1ZmZfaW5fY29tbWFuZCAodm9pZCksIHN3YXAgKHZvaWQpLCBvdGhlcl9kdXAgKHZvaWQpOwotc3RhdGljIHZvaWQgZHJvcCAodm9pZCksIGlkcm9wICh2b2lkKTsKLXN0YXRpYyB2b2lkIGljYXRzdHIgKHZvaWQpLCBza2lwX3Bhc3RfbmV3bGluZSAodm9pZCksIGludGVybmFsbW9kZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBtYXliZWNhdHN0ciAodm9pZCk7Ci1zdGF0aWMgY2hhciAqbmV4dHdvcmQgKGNoYXIgKiwgY2hhciAqKik7Ci1kaWN0X3R5cGUgKmxvb2t1cF93b3JkIChjaGFyICopOwotc3RhdGljIHZvaWQgcGVyZm9ybSAodm9pZCk7Ci1kaWN0X3R5cGUgKm5ld2VudHJ5IChjaGFyICopOwotdW5zaWduZWQgaW50IGFkZF90b19kZWZpbml0aW9uIChkaWN0X3R5cGUgKiwgc3RpbnN0X3R5cGUpOwotdm9pZCBhZGRfaW50cmluc2ljIChjaGFyICosIHZvaWQgKCopKCkpOwotdm9pZCBhZGRfdmFyIChjaGFyICopOwotdm9pZCBjb21waWxlIChjaGFyICopOwotc3RhdGljIHZvaWQgYmFuZyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBhdHNpZ24gKHZvaWQpOwotc3RhdGljIHZvaWQgaGVsbG8gKHZvaWQpOwotc3RhdGljIHZvaWQgc3Rkb3V0XyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRlcnJfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHByaW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlYWRfaW4gKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCB1c2FnZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBjaGV3X2V4aXQgKHZvaWQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIERFRlVOKGV4ZWMsKHdvcmQpLAotCQkgIGRpY3RfdHlwZSAqd29yZCkKLXsKLSAgcGMgPSB3b3JkLT5jb2RlOwotICB3aGlsZSAoKnBjKSAKLSAgICAoKnBjKSgpOwotfQotV09SRChjYWxsKQotewotICAgIHN0aW5zdF90eXBlICpvbGRwYyA9IHBjOwotICAgIGRpY3RfdHlwZSAqZTsKLSAgICBlID0gIChkaWN0X3R5cGUgKikocGMgWzFdKTsKLSAgICBleGVjKGUpOwotICAgIHBjID0gb2xkcGMgKyAyOwotICAgIAotfQotCi1XT1JEKHJlbWNoYXIpCi17Ci0gIGlmICh0b3MtPndyaXRlX2lkeCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOyAgICAKLSAgcGMrKzsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICgpCi17Ci0gIHdoaWxlICgoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkpCi0JICB8fCBhdCAodG9zLCB0b3MtPndyaXRlX2lkeCAtIDEpID09ICdcbicpCi0JICYmIHRvcy0+d3JpdGVfaWR4ID4gMCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOwotICBwYysrOwotfQotCi1XT1JEKHB1c2hfbnVtYmVyKQotewotICAgIGlzcCsrOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotICAgICppc3AgPSAobG9uZykoKnBjKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHB1c2hfdGV4dCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIHBjKys7Ci0gICAgY2F0dGV4dCh0b3MsKigoY2hhciAqKilwYykpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGV2ZXJ5dGhpbmcgbm90IGluc2lkZSBjb21tZW50cyBzdGFydGluZyBvbgotICAgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgZnJvbSB0aGUgIHN0cmluZywgYWxzbyB3aGVuIGNvcHlpbmcKLSAgIGNvbW1lbnRzLCByZW1vdmVzIGJsYW5rIHNwYWNlIGFuZCBsZWFkaW5nIConcy4KLSAgIEJsYW5rIGxpbmVzIGFyZSB0dXJuZWQgaW50byBvbmUgYmxhbmsgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkIAotREVGVU4ocmVtb3ZlX25vbmNvbW1lbnRzLChzcmMsZHN0KSwKLQkgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotCSAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHNyYyxpZHgpKSAKLSAgICB7Ci0JLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgY29tbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgKi8KLQlpZiAoYXQoc3JjLGlkeCkgPT0gJ1xuJyAKLQkgICAgJiYgYXQoc3JjLGlkeCsxKSA9PSAgJy8nIAotCSAgICAmJiBhdChzcmMsaWR4KzIpID09ICcqJykgCi0JewotCSAgICBpZHgrPTM7Ci0JICAgIAotCSAgICBpZHggPSBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsaWR4KTsKLQotCSAgICAvKiBSZW1vdmUgbGVhZGluZyBkb3QgKi8KLQkgICAgaWYgKGF0KHNyYywgaWR4KSA9PSAnLicpCi0JICAgICBpZHgrKzsKLQkgICAgCi0JICAgIC8qIENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgb3IgdGlsbCB0aGUgZW5kIG9mIHRoZQotCSAgICAgICBjb21tZW50ICovCi0JICAgIHdoaWxlIChhdChzcmMsIGlkeCkpCi0JICAgIHsKLQkJaWYgKGF0KHNyYywgaWR4KSA9PSAnXG4nKSAKLQkJewotCQkgICAgLyogZW5kIG9mIGxpbmUsIGVjaG8gYW5kIHNjcmFwZSBvZiBsZWFkaW5nIGJsYW5rcyAgKi8KLQkJICAgIGlmIChhdChzcmMsaWR4ICsxKSA9PSAnXG4nKQotCQkgICAgIGNhdGNoYXIoZHN0LCdcbicpOwotCQkgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBpZHgrKzsKLQkJICAgIGlkeCA9ICAgc2tpcF93aGl0ZV9hbmRfc3RhcnMoc3JjLCBpZHgpOwotCQl9Ci0JCWVsc2UgaWYgKGF0KHNyYywgaWR4KSA9PSAnKicgJiYgYXQoc3JjLGlkeCsxKSA9PSAnLycpIAotCQl7Ci0JCSAgICBpZHggKz0yIDsKLQkJICAgIGNhdHRleHQoZHN0LCJcbkVOREREXG4iKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWVsc2UgCi0JCXsKLQkJICAgIGNhdGNoYXIoZHN0LCBhdChzcmMsIGlkeCkpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCX0KLQllbHNlIGlkeCsrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YWNrX2xldmVsICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImN1cnJlbnQgc3RyaW5nIHN0YWNrIGRlcHRoID0gJWQsICIsIHRvcyAtIHN0YWNrKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBpbnRlZ2VyIHN0YWNrIGRlcHRoID0gJWRcbiIsIGlzcCAtIGlzdGFjayk7Ci0gIHBjKys7Ci19Ci0KLS8qIHR1cm46Ci0gICAgIGZvb2JhciBuYW1lKHN0dWZmKTsKLSAgIGludG86Ci0gICAgIGZvb2JhcgotICAgICBuYW1lIFBBUkFNUyAoKHN0dWZmKSk7Ci0gICBhbmQgYSBibGFuayBsaW5lLgotICovCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEKHBhcmFtc3R1ZmYpCi17Ci0gICAgdW5zaWduZWQgaW50IG9wZW5wOwotICAgIHVuc2lnbmVkIGludCBmbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgaWR4OwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGl0J3Mgbm90IGFscmVhZHkgcGFyYW0nZCBvciBwcm90bydkICovCi0gICAgaWYoZmluZCh0b3MsIlBBUkFNUyIpIHx8IGZpbmQodG9zLCJQUk9UTyIpIHx8ICFmaW5kKHRvcywiKCIpKSB7Ci0JICAgIGNhdHN0cigmb3V0LHRvcyk7Ci0JfQotICAgIGVsc2UgCi0gICAgewotCS8qIEZpbmQgdGhlIG9wZW4gcGFyZW4gKi8KLQlmb3IgKG9wZW5wID0gMDsgYXQodG9zLCBvcGVucCkgIT0gJygnICAmJiBhdCh0b3Msb3BlbnApOyBvcGVucCsrKQotCSA7Ci0KLQlmbmFtZSA9IG9wZW5wOwotCS8qIFN0ZXAgYmFjayB0byB0aGUgZm5hbWUgKi8KLQlmbmFtZS0tOwotCXdoaWxlIChmbmFtZSAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGZuYW1lKSkpCi0JIGZuYW1lIC0tOwotCXdoaWxlIChmbmFtZQotCSAgICAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGZuYW1lKSkKLQkgICAgICAgJiYgYXQodG9zLGZuYW1lKSAhPSAnKicpCi0JIGZuYW1lLS07Ci0KLQlmbmFtZSsrOwotCQotCWZvciAoaWR4ID0gMDsgaWR4IDwgZm5hbWU7IGlkeCsrKSAJLyogT3V0cHV0IHR5cGUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLSAgICAKLSAgICAgICAgY2F0dGV4dCgmb3V0LCAiXG4iKTsJLyogSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIHR5cGUgYW5kIGZubmFtZSAqLwotCi0JZm9yIChpZHggPSBmbmFtZTsgaWR4IDwgb3BlbnA7IGlkeCsrKSAJCS8qIE91dHB1dCBmbm5hbWUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLQotCWNhdHRleHQoJm91dCwiIFBBUkFNUyAoIik7Ci0KLQl3aGlsZSAoYXQodG9zLGlkeCkgJiYgYXQodG9zLGlkeCkgIT0nOycpIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0JY2F0dGV4dCgmb3V0LCIpO1xuXG4iKTsKLSAgICB9Ci0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOyAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0KLQotLyogdHVybiB7KgotICAgYW5kICp9IGludG8gY29tbWVudHMgKi8KLQotV09SRCh0cmFuc2xhdGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIi8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiB0dXJuIGV2ZXJ5dGhpbmcgbm90IHN0YXJ0aW5nIHdpdGggYSAuIGludG8gYSBjb21tZW50ICovCi0KLVdPUkQobWFuZ2xlY29tbWVudHMpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiCS8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2VuZGlmCi0KLS8qIE1vZCB0b3Mgc28gdGhhdCBvbmx5IGxpbmVzIHdpdGggbGVhZGluZyBkb3RzIHJlbWFpbiAqLwotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQob3V0cHV0ZG90cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnLicpIAotCXsKLQkgIGNoYXIgYzsKLQkgIGlkeCArPSAyOwotCSAgICAKLQkgICAgd2hpbGUgKChjID0gYXQodG9zLCBpZHgpKSAmJiBjICE9ICdcbicpCi0JICAgIHsKLQkgICAgICBpZiAoYyA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiIC8qIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjID09ICcqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCQkgICAgaWR4Kz0yOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgICBjYXRjaGFyKCZvdXQsIGMpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCSAgICBjYXRjaGFyKCZvdXQsJ1xuJyk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQkKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBGaW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggLiBhbmQgfCBhbmQgcHV0IGV4YW1wbGUgYXJvdW5kIHRoZW0gb24gdG9zICovCi1XT1JEKGNvdXJpZXJpemUpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIGludCBjb21tYW5kID0gMDsKLSAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCSAgICAmJiAoYXQodG9zLCBpZHggKzEgKSA9PSAnLicKLQkJfHwgYXQodG9zLGlkeCsxKSA9PSAnfCcpKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiXG5AZXhhbXBsZVxuIik7Ci0JICAgIGRvIAotCSAgICB7Ci0JCWlkeCArPSAyOwotCQkKLQkJd2hpbGUgKGF0KHRvcywgaWR4KSAmJiBhdCh0b3MsIGlkeCkhPSdcbicpCi0JCXsKLQkJICAgIGlmIChhdCh0b3MsaWR4KT09J3snICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYgKGF0KHRvcyxpZHgpPT0nKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiovIik7Ci0JCQlpZHgrPTI7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ3snICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAeyIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ30nICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAfSIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIAotCQkgICAgewotCQkJaWYgKGF0KHRvcyxpZHgpID09ICdAJykKLQkJCSAgICBjb21tYW5kID0gMTsKLQkJCWVsc2UgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHgpKQotCQkJCSB8fCBhdCh0b3MsaWR4KSA9PSAnfScpCi0JCQkgICAgY29tbWFuZCA9IDA7Ci0JCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIAotCQl9Ci0JCWNhdGNoYXIoJm91dCwnXG4nKTsKLQkgICAgfSAgCi0JICAgIHdoaWxlIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAKLQkJICAgJiYgKChhdCh0b3MsIGlkeCsxKSA9PSAnLicpCi0JCSAgICAgICB8fCAoYXQodG9zLGlkeCsxKSA9PSAnfCcpKSkKLQkgICAgICA7Ci0JICAgIGNhdHRleHQoJm91dCwiQGVuZCBleGFtcGxlIik7Ci0JfQotCWVsc2UgCi0JeyAgICAKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfSAgICAKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotCi0gICAgCi19Ci0KLS8qIEZpbmRzIGFueSBsaW5lcyBzdGFydGluZyB3aXRoICJvICIsIGlmIHRoZXJlIGFyZSBhbnksIHRoZW4gdHVybnMKLSAgIG9uIEBpdGVtaXplIEBidWxsZXQsIGFuZCBAaXRlbXMgZWFjaCBvZiB0aGVtLiBUaGVuIGVuZHMgd2l0aCBAZW5kCi0gICBpdGVtaXplLCBpbnBsYWNlIGF0IFRPUyovCi0KLQotV09SRChidWxsZXRpemUpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IG9uID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ0AnICYmCi0JICAgIGF0KHRvcywgaWR4KzEpID09ICcqJykgCi0JewotCSAgY2F0dGV4dCgmb3V0LCIqIik7Ci0JICBpZHgrPTI7Ci0JfQotCQotCWVsc2UKLQkgICAgaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCWF0KHRvcywgaWR4KzEpID09ICdvJyAmJgotCQlpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGlkeCArMikpKQotCSAgICB7Ci0JCWlmICghb24pIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIlxuQGl0ZW1pemUgQGJ1bGxldFxuIik7Ci0JCSAgICBvbiA9IDE7Ci0JCSAgICAKLQkJfQotCQljYXR0ZXh0KCZvdXQsIlxuQGl0ZW1cbiIpOwotCQlpZHgrPTM7Ci0JICAgIH0KLQkgICAgZWxzZSAKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlmIChvbiAmJiBhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMikgIT0gJ28nKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsICJAZW5kIGl0ZW1pemUiKTsKLQkJICAgIG9uID0gMDsKLQkJfQotCQlpZHgrKzsKLQkJCi0JICAgIH0KLQl9Ci0gICAgaWYgKG9uKSAKLSAgICB7Ci0JY2F0dGV4dCgmb3V0LCJAZW5kIGl0ZW1pemVcbiIpOwotICAgIH0JCi0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBUdXJuIDw8Zm9vPj4gaW50byBAY29kZXtmb299IGluIHBsYWNlIGF0IFRPUyovCi0gICAKLQotV09SRChkb19mYW5jeV9zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJzwnIAotCSAgICAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnPCcKLQkgICAgJiYgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHggKyAyKSkpIAotCXsKLQkgICAgLyogVGhpcyBxdWFsaWZpZXMgYXMgYSA8PCBzdGFydHVwICovCi0JICAgIGlkeCArPTI7Ci0JICAgIGNhdHRleHQoJm91dCwiQGNvZGV7Iik7Ci0JICAgIHdoaWxlKGF0KHRvcyxpZHgpICYmCi0JCSAgYXQodG9zLGlkeCkgIT0gJz4nICkKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCSAgICBjYXR0ZXh0KCZvdXQsIn0iKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0vKiBBIGNvbW1hbmQgaXMgYWxsIHVwcGVyIGNhc2UsYW5kIGFsb25lIG9uIGEgbGluZSAqLwotc3RhdGljIGludCAKLURFRlVOKCBpc2NvbW1hbmQsKHB0ciwgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpwdHIgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotICAgIHdoaWxlIChhdChwdHIsaWR4KSkgewotCSAgICBpZiAoaXN1cHBlcigodW5zaWduZWQgY2hhcikgYXQocHRyLGlkeCkpIHx8IGF0KHB0cixpZHgpID09ICcgJyB8fAotCQlhdChwdHIsaWR4KSA9PSAnXycpIAotCSAgICB7Ci0JICAgICBsZW4rKzsKLQkgICAgIGlkeCsrOwotCSB9Ci0JICAgIGVsc2UgaWYoYXQocHRyLGlkeCkgPT0gJ1xuJykKLQkgICAgewotCQlpZiAobGVuID4gMykgcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGVsc2UgcmV0dXJuIDA7Ci0JfQotICAgIHJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIGludAotREVGVU4oY29weV9wYXN0X25ld2xpbmUsKHB0ciwgaWR4LCBkc3QpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHggQU5ECi0gICAgICBzdHJpbmdfdHlwZSAqZHN0KQotewotICAgIGludCBjb2x1bW4gPSAwOwotCi0gICAgd2hpbGUgKGF0KHB0ciwgaWR4KSAmJiBhdChwdHIsIGlkeCkgIT0gJ1xuJykgCi0gICAgewotCWlmIChhdCAocHRyLCBpZHgpID09ICdcdCcpCi0JICB7Ci0JICAgIC8qIEV4cGFuZCB0YWJzLiAgTmVpdGhlciBtYWtlaW5mbyBub3IgVGVYIGNhbiBjb3BlIHdlbGwgd2l0aAotCSAgICAgICB0aGVtLiAgKi8KLQkgICAgZG8KLQkgICAgICBjYXRjaGFyIChkc3QsICcgJyk7Ci0JICAgIHdoaWxlICgrK2NvbHVtbiAmIDcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0JICAgIGNvbHVtbisrOwotCSAgfQotCWlkeCsrOwotCQotICAgIH0gICAgCi0gICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0gICAgaWR4Kys7Ci0gICAgcmV0dXJuIGlkeDsKLQotfQotCi1XT1JEKGljb3B5X3Bhc3RfbmV3bGluZSkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGlkeCA9IGNvcHlfcGFzdF9uZXdsaW5lKHB0ciwgaWR4LCB0b3MpOwotICAgIHBjKys7CQotfQotCi0vKiBpbmRlbnQKLSAgIFRha2UgdGhlIHN0cmluZyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgZG8gc29tZSBwcmV0dHlpbmcgKi8KLQotCi1XT1JEKGtpbGxfYm9ndXNfbGluZXMpCi17Ci0gICAgaW50IHNsIDsKLSAgICAKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgYzsKLSAgICBpbnQgZG90ID0gMCAgICA7Ci0gICAgCi0gICAgc3RyaW5nX3R5cGUgb3V0OyAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAvKiBEcm9wIGxlYWRpbmcgbmwgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkgPT0gJ1xuJykKLSAgICB7Ci0JaWR4Kys7Ci0gICAgfQotICAgIGMgPSBpZHg7Ci0gICAgCi0gICAgLyogSWYgdGhlIGZpcnN0IGNoYXIgaXMgYSAnLicgcHJlcGVuZCBhIG5ld2xpbmUgc28gdGhhdCBpdCBpcwotICAgICAgIHJlY29nbml6ZWQgcHJvcGVybHkgbGF0ZXIuICAqLwotICAgIGlmIChhdCAodG9zLCBpZHgpID09ICcuJykKLSAgICAgIGNhdGNoYXIgKCZvdXQsICdcbicpOwotCi0gICAgLyogRmluZCB0aGUgbGFzdCBjaGFyICovCi0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgCi0gICAgLyogZmluZCB0aGUgbGFzdCBub24gd2hpdGUgYmVmb3JlIHRoZSBubCAqLwotICAgIGlkeC0tOwotICAgIAotICAgIHdoaWxlIChpZHggJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpKQotICAgICBpZHgtLTsKLSAgICBpZHgrKzsKLSAgICAKLSAgICAvKiBDb3B5IGJ1ZmZlciB1cHRvIGxhc3QgY2hhciwgYnV0IGJsYW5rIGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIKLSAgICAgICBkb3RzIGRvbid0IGNvdW50ICovCi0gICAgc2wgPSAxOwotCi0gICAgd2hpbGUgKGMgPCBpZHgpCi0gICAgewotCWlmIChhdCh0b3MsYykgPT0gJ1xuJyAKLQkgICAgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCSAgICAmJiBhdCh0b3MsYysyKSA9PSAnLicpIAotCXsKLQkgICAgLyogSWdub3JlIHR3byBuZXdsaW5lcyBiZWZvcmUgYSBkb3QqLwotCSAgICBjKys7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnLicgJiYgc2wpCi0JewotCSAgICAvKiByZW1lbWJlciB0aGF0IHRoaXMgbGluZSBzdGFydGVkIHdpdGggYSBkb3QgKi8KLQkgICAgZG90PTI7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCQkgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCQkgJiYgZG90KQotCXsKLQkgICAgYysrOwotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIHdoZW4gbGFzdCBsaW5lIHdhcyBkb3QgKi8KLQl9Ci0KLQljYXRjaGFyKCZvdXQsIGF0KHRvcyxjKSk7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nKQotCXsKLQkgICAgc2wgPSAxOwotCSAgICAKLQkgICAgaWYgKGRvdCA9PSAyKWRvdD0xO2Vsc2UgZG90ID0gMDsKLQl9Ci0JZWxzZQotCSAgc2wgPSAwOwotCQotCWMrKzsJCi0KLSAgICB9Ci0gICAgCi0gICAgLyogQXBwZW5kIG5sKi8KLSAgICBjYXRjaGFyKCZvdXQsICdcbicpOwotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgCi0gICAgCi19Ci0KLVdPUkQoaW5kZW50KQotewotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbnQgdGFiID0gMDsKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb2wgPTA7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKSB7Ci0JICAgIHN3aXRjaCAoYXQodG9zLGlkeCkpIAotCSAgICB7Ci0JICAgICAgY2FzZSAnXG4nOgotCQljYXR0ZXh0KCZvdXQsIlxuIik7Ci0JCWlkeCsrOwotCQlpZiAodGFiICYmIGF0KHRvcyxpZHgpKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICAiKTsKLQkJfQotCQlvbCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJygnOgotCQl0YWIrKzsKLQkJaWYgKG9sID09IDApCi0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICIpOwotCQlpZHgrKzsKLQkJY2F0dGV4dCgmb3V0LCIoIik7Ci0JCW9sID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKSc6Ci0JCXRhYi0tOwotCQljYXR0ZXh0KCZvdXQsIikiKTsKLQkJaWR4Kys7Ci0JCW9sPTE7Ci0JCQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQljYXRjaGFyKCZvdXQsYXQodG9zLGlkeCkpOwotCQlvbD0xOwotCQkKLQkJaWR4Kys7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0KLX0KLQotCi1XT1JEKGdldF9zdHVmZl9pbl9jb21tYW5kKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpKSB7Ci0JICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKSAgYnJlYWs7Ci0JICAgIGlkeCA9ICAgY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0JfQotICAgIHBjKys7ICAgIAotfQotCi1XT1JEKHN3YXApCi17Ci0gICAgc3RyaW5nX3R5cGUgdDsKLSAgICAKLSAgICB0ID0gdG9zWzBdOwotICAgIHRvc1swXSA9IHRvc1stMV07Ci0gICAgdG9zWy0xXSA9dDsgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotV09SRChvdGhlcl9kdXApCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLSAgICBjYXRzdHIodG9zLCB0b3MtMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChkcm9wKQotewotICB0b3MtLTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWRyb3ApCi17Ci0gIGlzcC0tOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWNhdHN0cikKLXsKLSAgICB0b3MtLTsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBjYXRzdHIodG9zLCB0b3MrMSk7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MrMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChza2lwX3Bhc3RfbmV3bGluZSkKLXsKLSAgICB3aGlsZSAoYXQocHRyLGlkeCkgCi0JICAgJiYgYXQocHRyLGlkeCkgIT0gJ1xuJykKLSAgICAgaWR4Kys7Ci0gICAgaWR4Kys7Ci0gICAgcGMrKzsKLX0KLQotCi1XT1JEKGludGVybmFsbW9kZSkKLXsKLSAgICBpbnRlcm5hbF9tb2RlID0gKihpc3ApOwotICAgIGlzcC0tOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotfQotCi1XT1JEKG1heWJlY2F0c3RyKQotewotICAgIGlmIChpbnRlcm5hbF93YW50ZWQgPT0gaW50ZXJuYWxfbW9kZSkgCi0gICAgewotCWNhdHN0cih0b3MtMSwgdG9zKTsKLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLWNoYXIgKgotREVGVU4obmV4dHdvcmQsKHN0cmluZywgd29yZCksCi0gICAgICBjaGFyICpzdHJpbmcgQU5ECi0gICAgICBjaGFyICoqd29yZCkKLXsKLSAgICBjaGFyICp3b3JkX3N0YXJ0OwotICAgIGludCBpZHg7Ci0gICAgY2hhciAqZHN0OwotICAgIGNoYXIgKnNyYzsKLSAgICAKLSAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAKLSAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykgfHwgKnN0cmluZyA9PSAnLScpIHsKLQkgICAgaWYgKCpzdHJpbmcgPT0gJy0nKSAKLQkgICAgewotCQl3aGlsZSAoKnN0cmluZyAmJiAqc3RyaW5nICE9ICdcbicpIAotCQkgc3RyaW5nKys7Ci0JCQotCSAgICB9Ci0JICAgIGVsc2UgewotCQkgICAgc3RyaW5nKys7Ci0JCX0KLQl9Ci0gICAgaWYgKCEqc3RyaW5nKSByZXR1cm4gMDsKLSAgICAKLSAgICB3b3JkX3N0YXJ0ID0gc3RyaW5nOwotICAgIGlmICgqc3RyaW5nID09ICciJykgCi0gICAgICB7Ci0JZG8KLQkgIHsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCSAgICBpZiAoKnN0cmluZyA9PSAnXFwnKQotCSAgICAgIHsKLQkJc3RyaW5nICs9IDI7Ci0JCWxlbmd0aCArPSAyOwotCSAgICAgIH0KLQkgIH0KLQl3aGlsZSAoKnN0cmluZyAhPSAnIicpOwotICAgICAgfQotICAgIGVsc2UgICAgIAotICAgICAgewotCXdoaWxlICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpIAotCXsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCQotCX0KLSAgICB9Ci0gICAgCi0gICAgKndvcmQgPSBtYWxsb2MobGVuZ3RoICsgMSk7Ci0KLSAgICBkc3QgPSAqd29yZDsKLSAgICBzcmMgPSB3b3JkX3N0YXJ0OwotCi0KLSAgICBmb3IgKGlkeD0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykgCi0gICAgICB7Ci0JaWYgKHNyY1tpZHhdID09ICdcXCcpCi0JICBzd2l0Y2ggKHNyY1tpZHgrMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKmRzdCsrID0gJ1xuJzsKLQkgICAgICBpZHgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgICAqZHN0KysgPSBzcmNbaWR4KzFdOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgICpkc3QrKyA9ICdcXCc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlCi0JICAqZHN0KysgPSBzcmNbaWR4XTsKLSAgICB9Ci0gICAgKmRzdCsrID0gMDsKLQotCi0KLQotCi0gICAgaWYoKnN0cmluZykgICAgCi0gICAgIHJldHVybiBzdHJpbmcgKyAxOwotICAgIGVsc2UgCi0gICAgIHJldHVybiAwOwotICAgIAotfQotZGljdF90eXBlICpyb290OwotZGljdF90eXBlICoKLURFRlVOKGxvb2t1cF93b3JkLCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gIGRpY3RfdHlwZSAqcHRyID0gcm9vdDsKLSAgd2hpbGUgKHB0cikgewotICAgICAgaWYgKHN0cmNtcChwdHItPndvcmQsIHdvcmQpID09IDApIHJldHVybiBwdHI7Ci0gICAgICBwdHIgPSBwdHItPm5leHQ7Ci0JICAgIAotICAgIH0KLSAgaWYgKHdhcm5pbmcpCi0gICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3QgZmluZCAlc1xuIix3b3JkKTsKLSAgcmV0dXJuIDA7Ci0gICAgCi0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQocGVyZm9ybSkKLXsKLSAgdG9zID0gc3RhY2s7Ci0gICAgCi0gIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLSAgICAgIC8qIEl0J3Mgd29ydGggbG9va2luZyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpc3QgKi8KLSAgICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKQotICAgICAgewotCWNoYXIgKm5leHQ7Ci0JZGljdF90eXBlICp3b3JkIDsKLQkJCi0JKHZvaWQpCQluZXh0d29yZChhZGRyKHB0ciwgaWR4KSwgJm5leHQpOwotCi0KLQl3b3JkID0gbG9va3VwX3dvcmQobmV4dCk7Ci0KLQotCQkKLQotCWlmICh3b3JkKSAKLQl7Ci0JICBleGVjKHdvcmQpOwotCX0KLQllbHNlCi0JewotCSAgaWYgKHdhcm5pbmcpCi0JICAgZnByaW50ZihzdGRlcnIsIndhcm5pbmcsICVzIGlzIG5vdCByZWNvZ25pc2VkXG4iLCAgbmV4dCk7Ci0JICBza2lwX3Bhc3RfbmV3bGluZSgpOwotCX0KLQkJCi0gICAgICB9Ci0gICAgICBlbHNlIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0KLSAgICB9Ci19Ci0KLWRpY3RfdHlwZSAqCi1ERUZVTihuZXdlbnRyeSwod29yZCksCi0gICAgICBjaGFyICp3b3JkKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gKGRpY3RfdHlwZSAqKW1hbGxvYyhzaXplb2YoZGljdF90eXBlKSk7Ci0gICAgbmV3LT53b3JkID0gd29yZDsKLSAgICBuZXctPm5leHQgPSByb290OwotICAgIHJvb3QgPSBuZXc7Ci0gICAgbmV3LT5jb2RlID0gKHN0aW5zdF90eXBlICopbWFsbG9jKHNpemVvZihzdGluc3RfdHlwZSApKTsKLSAgICBuZXctPmNvZGVfbGVuZ3RoID0gMTsKLSAgICBuZXctPmNvZGVfZW5kID0gMDsKLSAgICByZXR1cm4gbmV3OwotICAgIAotfQotCi0KLXVuc2lnbmVkIGludAotREVGVU4oYWRkX3RvX2RlZmluaXRpb24sKGVudHJ5LCB3b3JkKSwgCi0gICAgICBkaWN0X3R5cGUgKmVudHJ5IEFORAotICAgICAgc3RpbnN0X3R5cGUgd29yZCkKLXsKLSAgICBpZiAoZW50cnktPmNvZGVfZW5kID09IGVudHJ5LT5jb2RlX2xlbmd0aCkgCi0gICAgewotCWVudHJ5LT5jb2RlX2xlbmd0aCArPSAyOwotCWVudHJ5LT5jb2RlID0KLQkgKHN0aW5zdF90eXBlICopIHJlYWxsb2MoKGNoYXIgKikoZW50cnktPmNvZGUpLAotCQkJICAgICAgIGVudHJ5LT5jb2RlX2xlbmd0aCAqc2l6ZW9mKHdvcmRfdHlwZSkpOwotICAgIH0KLSAgICBlbnRyeS0+Y29kZVtlbnRyeS0+Y29kZV9lbmRdID0gd29yZDsKLSAgICAKLXJldHVybiAgICAgZW50cnktPmNvZGVfZW5kKys7ICAKLX0KLQotCi0KLQotCi0KLQotdm9pZAotREVGVU4oYWRkX2ludHJpbnNpYywobmFtZSwgZnVuYyksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgdm9pZCAoKmZ1bmMpKCkpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSBuZXdlbnRyeShuYW1lKTsKLSAgICBhZGRfdG9fZGVmaW5pdGlvbihuZXcsIGZ1bmMpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgMCk7Ci19Ci0KLXZvaWQKLURFRlVOKGFkZF92YXIsKG5hbWUpLAotICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgcHVzaF9udW1iZXIpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgKHN0aW5zdF90eXBlKSgmKG5ldy0+dmFyKSkpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywwKTsKLX0KLQotCi12b2lkIAotREVGVU4oY29tcGlsZSwgKHN0cmluZyksIAotICAgICAgY2hhciAqc3RyaW5nKQotewotICAgIC8qIGFkZCB3b3JkcyB0byB0aGUgZGljdGlvbmFyeSAqLwotICAgIGNoYXIgKndvcmQ7Ci0gICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0gICAgd2hpbGUgKHN0cmluZyAmJiAqc3RyaW5nICYmIHdvcmRbMF0pIAotICAgIHsKLQlpZiAoc3RyY21wKHdvcmQsInZhciIpPT0wKSAKLQl7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgCi0JICBhZGRfdmFyKHdvcmQpOwotIHN0cmluZz1uZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci1lbHNlCQotCSAgICAKLQlpZiAod29yZFswXSA9PSAnOicpCi0JewotCSAgICBkaWN0X3R5cGUgKnB0cjsKLQkgICAgLyogQ29tcGlsZSBhIHdvcmQgYW5kIGFkZCB0byBkaWN0aW9uYXJ5ICovCi0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICAKLQkgICAgcHRyID0gbmV3ZW50cnkod29yZCk7Ci0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICB3aGlsZSAod29yZFswXSAhPSAnOycgKSAKLQkgICAgewotCQkgc3dpdGNoICh3b3JkWzBdKSAKLQkJIHsKLQkJICAgY2FzZSAnIic6Ci0JCSAgICAgLyogZ290IGEgc3RyaW5nLCBlbWJlZCBtYWdpYyBwdXNoIHN0cmluZwotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfdGV4dCk7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpKHdvcmQrMSkpOwotCQkgICAgIGJyZWFrOwotCQkgICBjYXNlICcwJzoKLQkJICAgY2FzZSAnMSc6Ci0JCSAgIGNhc2UgJzInOgotCQkgICBjYXNlICczJzoKLQkJICAgY2FzZSAnNCc6Ci0JCSAgIGNhc2UgJzUnOgotCQkgICBjYXNlICc2JzoKLQkJICAgY2FzZSAnNyc6Ci0JCSAgIGNhc2UgJzgnOgotCQkgICBjYXNlICc5JzoKLQkJICAgICAvKiBHb3QgYSBudW1iZXIsIGVtYmVkZCB0aGUgbWFnaWMgcHVzaCBudW1iZXIKLQkJCWZ1bmN0aW9uICovCi0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBwdXNoX251bWJlcik7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpYXRvbCh3b3JkKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGRlZmF1bHQ6Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBjYWxsKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlsb29rdXBfd29yZCh3b3JkKSk7Ci0JCSB9Ci0KLQkJc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CQkgICAgIAotCSAgICB9Ci0JICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwwKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBmcHJpbnRmKHN0ZGVyciwic3ludGF4IGVycm9yIGF0ICVzXG4iLHN0cmluZy0xKTsKLQl9CSAgICAKLSAgICB9Ci0KLX0KLQotIAotc3RhdGljIHZvaWQgREVGVU5fVk9JRChiYW5nKQotewotICAqKGxvbmcgKikoKGlzcFswXSkpID0gaXNwWy0xXTsKLSAgaXNwLT0yOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoYXRzaWduKQotewotICAgIGlzcFswXSA9ICoobG9uZyAqKShpc3BbMF0pOwotICAgIHBjKys7Ci19Ci0KLVdPUkQoaGVsbG8pCi17Ci0gIHByaW50ZigiaGVsbG9cbiIpOwotICBwYysrOyAgICAKLX0KLQotV09SRChzdGRvdXRfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMTsKLSAgcGMrKzsKLX0KLQotV09SRChzdGRlcnJfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMjsKLSAgcGMrKzsKLX0KLQotV09SRChwcmludCkKLXsKLSAgaWYgKCppc3AgPT0gMSkKLSAgICB3cml0ZV9idWZmZXIgKHRvcywgc3Rkb3V0KTsKLSAgZWxzZSBpZiAoKmlzcCA9PSAyKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRlcnIpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAicHJpbnQ6IGlsbGVnYWwgcHJpbnQgZGVzdGluYXRpb24gYCVsZCdcbiIsICppc3ApOwotICBpc3AtLTsKLSAgdG9zLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ocmVhZF9pbiwgKHN0ciwgZmlsZSksIAotCSAgIHN0cmluZ190eXBlICpzdHIgQU5ECi0JCSAgRklMRSAqZmlsZSkKLXsKLSAgICBjaGFyIGJ1ZmZbMTAwMDBdOyAgICAKLSAgICB1bnNpZ25lZCBpbnQgcjsKLSAgICBkbyAKLSAgICB7Ci0JciA9IGZyZWFkKGJ1ZmYsIDEsIHNpemVvZihidWZmKSwgZmlsZSk7Ci0JY2F0YnVmKHN0ciwgYnVmZiwgcik7Ci0gICAgfQotICAgIHdoaWxlIChyKTsKLSAgICBidWZmWzBdID0gMDsKLSAgICAKLSAgICBjYXRidWYoc3RyLCBidWZmLDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQodXNhZ2UpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsInVzYWdlOiAtW2R8aXxnXSA8ZmlsZSA+ZmlsZVxuIik7Ci0gICAgZXhpdCgzMyk7ICAgIAotfQotCi0vKiBUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGVjbGFyZSBleGl0LiAgU29tZXRpbWVzIGl0IHJldHVybnMKLSAgIGludCwgYW5kIHNvbWV0aW1lcyBpdCByZXR1cm5zIHZvaWQuICBTb21ldGltZXMgaXQgY2hhbmdlcyBiZXR3ZWVuCi0gICBPUyByZWxlYXNlcy4gIFRyeWluZyB0byBnZXQgaXQgZGVjbGFyZWQgY29ycmVjdGx5IGluIHRoZSBob3N0cyBmaWxlCi0gICBpcyBhIHBvaW50bGVzcyB3YXN0ZSBvZiB0aW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZXdfZXhpdCAoKQotewotICBleGl0ICgwKTsKLX0KLQotaW50IERFRlVOKG1haW4sKGFjLGF2KSwKLWludCBhYyBBTkQKLWNoYXIgKmF2W10pCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJpbmdfdHlwZSBidWZmZXI7Ci0gIHN0cmluZ190eXBlIHBwdHI7Ci0KLSAgaW5pdF9zdHJpbmcoJmJ1ZmZlcik7Ci0gIGluaXRfc3RyaW5nKCZwcHRyKTsKLSAgaW5pdF9zdHJpbmcoc3RhY2srMCk7Ci0gIHRvcz1zdGFjaysxOwotICBwdHIgPSAmcHB0cjsKLSAgICAKLSAgYWRkX2ludHJpbnNpYygicHVzaF90ZXh0IiwgcHVzaF90ZXh0KTsKLSAgYWRkX2ludHJpbnNpYygiISIsIGJhbmcpOwotICBhZGRfaW50cmluc2ljKCJAIiwgYXRzaWduKTsKLSAgYWRkX2ludHJpbnNpYygiaGVsbG8iLGhlbGxvKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZG91dCIsc3Rkb3V0Xyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJzdGRlcnIiLHN0ZGVycl8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygicHJpbnQiLHByaW50KTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInNraXBfcGFzdF9uZXdsaW5lIiwgc2tpcF9wYXN0X25ld2xpbmUgKTsKLSAgYWRkX2ludHJpbnNpYygiY2F0c3RyIiwgaWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJjb3B5X3Bhc3RfbmV3bGluZSIsIGljb3B5X3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJkdXAiLCBvdGhlcl9kdXAgKTsKLSAgYWRkX2ludHJpbnNpYygiZHJvcCIsIGRyb3ApOwotICBhZGRfaW50cmluc2ljKCJpZHJvcCIsIGlkcm9wKTsKLSAgYWRkX2ludHJpbnNpYygicmVtY2hhciIsIHJlbWNoYXIgKTsKLSAgYWRkX2ludHJpbnNpYygiZ2V0X3N0dWZmX2luX2NvbW1hbmQiLCBnZXRfc3R1ZmZfaW5fY29tbWFuZCApOwotICBhZGRfaW50cmluc2ljKCJkb19mYW5jeV9zdHVmZiIsIGRvX2ZhbmN5X3N0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoImJ1bGxldGl6ZSIsIGJ1bGxldGl6ZSApOwotICBhZGRfaW50cmluc2ljKCJjb3VyaWVyaXplIiwgY291cmllcml6ZSApOwotICAvKiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgZ2l2ZXMgYW4gZXJyb3IsIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlCi0gICAgIC4uL2hvc3RzL2Zvby5oIGZpbGUgZm9yIHRoaXMgaG9zdC4gIEZpeCBpdCB0aGVyZSwgbm90IGhlcmUhICAqLwotICAvKiBObywgZG9uJ3QgZml4IGl0IGFueXdoZXJlOyBzZWUgY29tbWVudCBvbiBjaGV3X2V4aXQtLUlhbiBUYXlsb3IuICAqLwotICBhZGRfaW50cmluc2ljKCJleGl0IiwgY2hld19leGl0ICk7Ci0gIGFkZF9pbnRyaW5zaWMoInN3YXAiLCBzd2FwICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm91dHB1dGRvdHMiLCBvdXRwdXRkb3RzICk7Ci0gIGFkZF9pbnRyaW5zaWMoInBhcmFtc3R1ZmYiLCBwYXJhbXN0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm1heWJlY2F0c3RyIiwgbWF5YmVjYXRzdHIgKTsKLSAgYWRkX2ludHJpbnNpYygidHJhbnNsYXRlY29tbWVudHMiLCB0cmFuc2xhdGVjb21tZW50cyApOwotICBhZGRfaW50cmluc2ljKCJraWxsX2JvZ3VzX2xpbmVzIiwga2lsbF9ib2d1c19saW5lcyk7Ci0gIGFkZF9pbnRyaW5zaWMoImluZGVudCIsIGluZGVudCk7Ci0gIGFkZF9pbnRyaW5zaWMoImludGVybmFsbW9kZSIsIGludGVybmFsbW9kZSk7Ci0gIGFkZF9pbnRyaW5zaWMoInByaW50X3N0YWNrX2xldmVsIiwgcHJpbnRfc3RhY2tfbGV2ZWwpOwotICBhZGRfaW50cmluc2ljKCJzdHJpcF90cmFpbGluZ19uZXdsaW5lcyIsIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzKTsKLSAgICAKLSAgLyogUHV0IGEgbmwgYXQgdGhlIHN0YXJ0ICovCi0gIGNhdGNoYXIoJmJ1ZmZlciwnXG4nKTsKLQotICByZWFkX2luKCZidWZmZXIsIHN0ZGluKTsgCi0gIHJlbW92ZV9ub25jb21tZW50cygmYnVmZmVyLCBwdHIpOwotICBmb3IgKGk9IDE7IGkgPCAodW5zaWduZWQgaW50KSBhYzsgaSsrKSAKLSAgewotICAgIGlmIChhdltpXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGF2W2ldWzFdID09ICdmJykKLSAgICAgIHsKLQlzdHJpbmdfdHlwZSBiOwotCUZJTEUgKmY7Ci0JaW5pdF9zdHJpbmcoJmIpOwotCi0JZiAgPSBmb3BlbihhdltpKzFdLCJyIik7Ci0JaWYgKCFmKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiB0aGUgaW5wdXQgZmlsZSAlc1xuIixhdltpKzFdKTsKLQkgIHJldHVybiAzMzsKLQl9Ci0KLQlyZWFkX2luKCZiLCBmKTsKLQljb21waWxlKGIucHRyKTsKLQlwZXJmb3JtKCk7CQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ2knKSAKLSAgICAgIHsKLQlpbnRlcm5hbF93YW50ZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ3cnKSAKLSAgICAgIHsKLQl3YXJuaW5nID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQl1c2FnZSAoKTsKLSAgICB9Ci0gIH0gICAgICAKLSAgd3JpdGVfYnVmZmVyKHN0YWNrKzAsIHN0ZG91dCk7Ci0gIGlmICh0b3MgIT0gc3RhY2spCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZmluaXNoaW5nIHdpdGggY3VycmVudCBzdGFjayBsZXZlbCAlZFxuIiwgdG9zIC0gc3RhY2spOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9kb2MvZG9jLnN0ciBiL2JmZC9kb2MvZG9jLnN0cgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNzZmZS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2RvYy5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotOiBET0NERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBjYXRzdHIKLQk7Ci0KLTogRU5EREQKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLQotOiBFWEFNUExFCi0Jc2tpcF9wYXN0X25ld2xpbmUJCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBkb19mYW5jeV9zdHVmZiB0cmFuc2xhdGVjb21tZW50cyAKLQljb3VyaWVyaXplIGNhdHN0cgotCi0JOwotCi06IElOT0RFIAotCSJAbm9kZSAiIGNhdHN0ciBza2lwX3Bhc3RfbmV3bGluZSBjb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIgCi0JOwotCi06IENPREVfRlJBR01FTlQKLQlFWEFNUExFIAotCTsKLQotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRyb3AKLQk7Ci0KLTogU1lOT1BTSVMKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAc3Ryb25ne1N5bm9wc2lzfVxuIiBjYXRzdHIKLQkiQGV4YW1wbGVcbiIgY2F0c3RyCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQgIAotCWtpbGxfYm9ndXNfbGluZXMKLQlpbmRlbnQKLQljYXRzdHIKLQkiQGVuZCBleGFtcGxlXG4iIGNhdHN0cgotCi0JOwotCi06IGZ1bmMKLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogRlVOQ1RJT04KLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogYm9keXRleHQKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAKLQlidWxsZXRpemUKLQlraWxsX2JvZ3VzX2xpbmVzCi0JZG9fZmFuY3lfc3R1ZmYKLQljb3VyaWVyaXplCi0JY2F0c3RyCi0JIlxuIiBjYXRzdHIKLQk7Ci0KLTogYXNlY3Rpb24KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lIAkKLQlkb19mYW5jeV9zdHVmZiBjYXRzdHIgCQotCWJvZHl0ZXh0CQotCTsKLQotOiBTRUNUSU9OIAotCSJAc2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU0VDVElPTgotCSJAc3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU1VCU0VDVElPTgotCSJAc3Vic3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogc3ViaGVhZAotCXNraXBfcGFzdF9uZXdsaW5lCi0JYm9keXRleHQKLQk7Ci0KLQotCi0JCi06IERFU0NSSVBUSU9OIAotCSJAc3Ryb25ne0Rlc2NyaXB0aW9ufUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBSRVRVUk5TCi0JIkBzdHJvbmd7UmV0dXJuc31AKlxuIiBjYXRzdHIgc3ViaGVhZCA7Ci0KLTogSU5URVJOQUxfRlVOQ1RJT04KLQlmdW5jIDsKLQotCi06IElOVEVSTkFMX0RFRklOSVRJT04gCi0JZnVuYyA7Ci0KLQotOiBJTlRFUk5BTAotCWZ1bmMgOwotCi06IFRZUEVERUYKLQlGVU5DVElPTiA7Ci0KLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJIZXJlIGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBAY29kZXtlbnVtICIKLQljb3B5X3Bhc3RfbmV3bGluZSByZW1jaGFyIGNhdHN0cgotCSJ9OlxuXG4iIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU1YCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0JOwotOiBFTlVNRVEKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLTogRU5VTUVRWAotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbngge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0cgotCWNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRE9DCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JY2F0c3RyCi0JIlxuQGVuZCBkZWZmblxuIiBjYXRzdHIKLQk7CmRpZmYgLS1naXQgYS9iZmQvZG9jL21ha2VmaWxlLnZtcyBiL2JmZC9kb2MvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1N2MwLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DRkxBR1MgPSAvbm9vcHQvaW5jbHVkZT0oW10sWy1dLFstLi0uaW5jbHVkZV0pCi1MREZMQUdTID0gL25vbWFwCi1MRExJQlMgPSAsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotCi1hbGw6IGNoZXcuZXhlCmRpZmYgLS1naXQgYS9iZmQvZG9jL3Byb3RvLnN0ciBiL2JmZC9kb2MvcHJvdG8uc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMxYzE2Li4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvcHJvdG8uc3RyCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQJCi0JcGFyYW1zdHVmZgotCWluZGVudAotCW1heWJlY2F0c3RyCi07Ci0KLTogaWdub3JlCi0Jc2tpcF9wYXN0X25ld2xpbmUgCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlvdXRwdXRkb3RzCi0JbWF5YmVjYXRzdHIKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCWlnbm9yZSA7Ci0KLTogZXh0ZXJuYWwKLQkwIGludGVybmFsbW9kZSBpZ25vcmUgOwotCi06IGludGVybmFsIAotCTEgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLS0gaW5wdXQgc3RhY2sgeyBhIGIgfSBvdXRwdXQgYiBpZiBpbnRlcm5hbCwgYSBpZiBleHRlcm5hbAotOiBpZmludGVybmFsCi0JIiIgc3dhcCAxIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQkiIiBzd2FwIDAgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0JY2F0c3RyCi0JOwotCi0tIFB1dCBub3RlIGluIG91dHB1dCBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuYWwgbW9kZS4KLTogQ09NTUVOVAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQl0cmFuc2xhdGVjb21tZW50cwotCWNhdHN0cgotCTsKLQotLSBTRU5VTSAgICBlbnVtLXR5cGUtbmFtZQotLSBFTlVNICAgICBlbnVtLW5hbWUKLS0gRU5VTVggICAgYWRkbC1lbnVtLW5hbWUKLS0gRU5VTURPQyAgZG9jIGZvciBwcmVjZWRpbmcgZW51bXMKLS0gRU5EU0VOVU0gbWF4LWVudW0tbmFtZQotCi06IG1ha2VfZW51bV9oZWFkZXIKLQlkdXAKLQkiZW51bSAiIHN3YXAgY2F0c3RyCi0JIiB7XG4iIGNhdHN0cgotCXN3YXAgIiAgX2R1bW15X2ZpcnN0XyIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIixcbiIgY2F0c3RyCi0JOwotOiBtYWtlX3N0cmluZ190YWJsZV9oZWFkZXIKLQlkdXAKLQkiI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV8iIHN3YXAgY2F0c3RyIHN3YXAKLQkiXG5cbnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAiIHN3YXAgY2F0c3RyIGNhdHN0cgotCSJfbmFtZXNbXSA9IHsgXCJAQHVuaW5pdGlhbGl6ZWRAQFwiLFxuIiBjYXRzdHIKLQk7Ci06IFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1faGVhZGVyCi0Jc3dhcAotCW1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cyA7Ci06IEVORFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZSBzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCWR1cAotCSIgICIgc3dhcCBjYXRzdHIgIiB9O1xuIiBjYXRzdHIJc3dhcAotCSIgXCJAQG92ZXJmbG93OiAiIHN3YXAgY2F0c3RyICJAQFwiLFxufTtcbiNlbmRpZlxuXG4iIGNhdHN0cgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcgotCSIgICIgc3dhcCBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQkiICBcIiIgc3dhcCBjYXRzdHIKLQkiXCIsXG4iIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlyZW1jaGFyCi0JZHVwCi0JbWFrZV9lbnVtZXJhdG9yCi0Jc3dhcAotCW1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQlpZmludGVybmFsCi0JOwotOiBFTlVNWCBFTlVNIGNhdHN0ciA7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIiNkZWZpbmUgIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIKLQljYXRzdHIKLQkiICIKLQljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQk7Ci06IEVOVU1FUVggRU5VTUVRIGNhdHN0ciA7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQkiXG57KiAiIHN3YXAgY2F0c3RyICIgKn1cbiIgY2F0c3RyCi0JdHJhbnNsYXRlY29tbWVudHMKLQktIGRpc2NhcmQgaXQgaWYgd2UncmUgZG9pbmcgaW50ZXJuYWwgbW9kZQotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQlzd2FwCi0JY2F0c3RyIGNhdHN0cgotCTsKLTogRU5EREQgZXh0ZXJuYWwgOwotOiBTRUNUSU9OIGlnbm9yZSA7Ci06IFNVQlNFQ1RJT04gaWdub3JlIDsKLTogU1VCU1VCU0VDVElPTiBpZ25vcmUgOwotOiBJTlRFUk5BTF9ERUZJTklUSU9OIGludGVybmFsIDsKLTogREVTQ1JJUFRJT04gaWdub3JlIDsKLTogRlVOQ1RJT04gZXh0ZXJuYWwgOwotOiBSRVRVUk5TIGlnbm9yZSA7Ci06IFRZUEVERUYgZXh0ZXJuYWwgOwotOiBJTlRFUk5BTF9GVU5DVElPTiBpbnRlcm5hbCA7Ci06IElOVEVSTkFMIGludGVybmFsIDsKLTogSU5PREUgaWdub3JlIDsKZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjEuYyBiL2JmZC9kd2FyZjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExODRjYy4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyogRFdBUkYgMSBmaW5kIG5lYXJlc3QgbGluZSAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpLgotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVdyaXR0ZW4gYnkgR2F2aW4gUm9taWctS29jaCBvZiBDeWdudXMgU29sdXRpb25zIChnYXZpbkBjeWdudXMuY29tKS4gIAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmLmgiCi0KLS8qIGR3YXJmMV9kZWJ1ZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFsbCBkd2FyZjEgaW5mby4gKi8KLQotc3RydWN0IGR3YXJmMV9kZWJ1ZyB7Ci0KLSAgLyogVGhlIGJmZCB3ZSBhcmUgd29ya2luZyB3aXRoLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogTGlzdCBvZiBhbHJlYWR5IHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBsYXN0VW5pdDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uIAotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWcgc2VjdGlvbiBmYWlsZWQgdG8gbG9hZC4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbjsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGJ1ZmZlciBmb3IgdGhlIC5saW5lIHNlY3Rpb24uICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbjsKLQotICAvKiBFbmQgb2YgdGhhdCBidWZmZXIuICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGN1cnJlbnQgb3IgbmV4dCB1bnJlYWQgZGllIHdpdGhpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICovCi0gIGNoYXIqIGN1cnJlbnREaWU7Ci19OwotCi0vKiBPbmUgZHdhcmYxX3VuaXQgZm9yIGVhY2ggcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGllLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX3VuaXQgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBzdGFzaC0+bGFzdFVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogcHJldjsKLQotICAvKiBOYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotCi0gIC8qIERvZXMgdGhpcyB1bml0IGhhdmUgYSBzdGF0ZW1lbnQgbGlzdD8gKi8KLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgLyogSWYgYW55LCB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpbiB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotCi0gIC8qIElmIG5vbi16ZXJvLCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgdW5pdC4gKi8KLSAgY2hhciogZmlyc3RfY2hpbGQ7Ci0KLSAgLyogSG93IG1hbnkgbGluZSBlbnRyaWVzPyAqLwotICB1bnNpZ25lZCBsb25nIGxpbmVfY291bnQ7Ci0KLSAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIgdGFibGUgKGxpbmVfY291bnQgZW50cmllcykuICovCi0gIHN0cnVjdCBsaW5lbnVtYmVyKiBsaW5lbnVtYmVyX3RhYmxlOwotCi0gIC8qIFRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBpbiB0aGlzIHVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfZnVuYyogZnVuY19saXN0OwotfTsKLQotCi0KLS8qIE9uZSBkd2FyZjFfZnVuYyBmb3IgZWFjaCBwYXJzZWQgZnVuY3Rpb24gZGllLiAgKi8KLQotc3RydWN0IGR3YXJmMV9mdW5jIHsKLSAgLyogTGlua2VkIHN0YXJ0aW5nIGZyb20gYVVuaXQtPmZ1bmNfbGlzdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBwcmV2OwotICAKLSAgLyogTmFtZSBvZiBmdW5jdGlvbi4gKi8KLSAgY2hhciogbmFtZTsKLSAgCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotfTsKLQotCi0vKiBVc2VkIHRvIHJldHVybiBpbmZvIGFib3V0IGEgcGFyc2VkIGRpZS4gKi8KLXN0cnVjdCBkaWVfaW5mbyB7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICB1bnNpZ25lZCBsb25nIHNpYmxpbmc7Ci0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RtdF9saXN0X29mZnNldDsKLSAgCi0gIGNoYXIqIG5hbWU7IAotICAKLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdGFnOwotfTsKLQotCi0vKiBQYXJzZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi1zdHJ1Y3QgbGluZW51bWJlciB7Ci0gIC8qIEZpcnN0IGFkZHJlc3MgaW4gdGhlIGxpbmUuICovCi0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLQotICAvKiBUaGUgbGluZSBudW1iZXIuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZW51bWJlcjsKLX07Ci0KLQotLyogRmluZCB0aGUgZm9ybSBvZiBhbiBhdHRyLCBmcm9tIHRoZSBhdHRyIGZpZWxkLiAqLwotI2RlZmluZSBGT1JNX0ZST01fQVRUUihhdHRyKQkoKGF0dHIpICYgMHhGKQkvKiBJbXBsaWNpdGx5IHNwZWNpZmllZCAqLwotCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfdW5pdC4gIEl0IHNob3VsZCBiZSBjbGVhcmVkIGFuZAotICAgdGhlbiBhdHRhY2hlZCBpbnRvIHRoZSAnc3Rhc2gnIGF0ICdzdGFzaC0+bGFzdFVuaXQnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV91bml0KgotYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLXsKLSAgc3RydWN0IGR3YXJmMV91bml0KiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfdW5pdCopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfdW5pdCkpOwotICB4LT5wcmV2ID0gc3Rhc2gtPmxhc3RVbml0OwotICBzdGFzaC0+bGFzdFVuaXQgPSB4OwotCi0gIHJldHVybiB4OwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgZHdhcmYxX2Z1bmMuICBJdCBtdXN0IGJlIGNsZWFyZWQgYW5kCi0gICBhdHRhY2hlZCBpbnRvICdhVW5pdCcgYXQgJ2FVbml0LT5mdW5jX2xpc3QnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV9mdW5jKgotYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLCBhVW5pdCkKLSAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZnVuYyogeCA9IAotICAgIChzdHJ1Y3QgZHdhcmYxX2Z1bmMqKSBiZmRfemFsbG9jIChzdGFzaC0+YWJmZCwgCi0JCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2Z1bmMpKTsKLSAgeC0+cHJldiA9IGFVbml0LT5mdW5jX2xpc3Q7Ci0gIGFVbml0LT5mdW5jX2xpc3QgPSB4OwotICAKLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIHBhcnNlX2RpZSAtIHBhcnNlIGEgRHdhcmYxIGRpZS4KLSAgIFBhcnNlIHRoZSBkaWUgc3RhcnRpbmcgYXQgJ2FEaWVQdHInIGludG8gJ2FEaWVJbmZvJy4KLSAgICdhYmZkJyBtdXN0IGJlIHRoZSBiZmQgZnJvbSB3aGljaCB0aGUgc2VjdGlvbiB0aGF0ICdhRGllUHRyJwotICAgcG9pbnRzIHRvIHdhcyBwdWxsZWQgZnJvbS4gCi0KLSAgIFJldHVybiBmYWxzZSBpZiB0aGUgZGllIGlzIGludmFsaWRseSBmb3JtYXR0ZWQ7IHRydWUgb3RoZXJ3aXNlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfZGllIChhYmZkLCBhRGllSW5mbywgYURpZVB0cikKLSAgICAgYmZkKiBhYmZkOwotICAgICBzdHJ1Y3QgZGllX2luZm8qIGFEaWVJbmZvOwotICAgICBjaGFyKiAgICAgICAgICAgIGFEaWVQdHI7Ci17Ci0gIGNoYXIqIHRoaXNfZGllID0gYURpZVB0cjsKLSAgY2hhciogeHB0ciA9IHRoaXNfZGllOwotCi0gIG1lbXNldCAoYURpZUluZm8sMCxzaXplb2YoKmFEaWVJbmZvKSk7Ci0KLSAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgYURpZUluZm8tPmxlbmd0aCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDQ7Ci0gIGlmIChhRGllSW5mby0+bGVuZ3RoID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYURpZUluZm8tPmxlbmd0aCA8IDYpCi0gICAgewotICAgICAgLyogSnVzdCBwYWRkaW5nIGJ5dGVzLiAqLwotICAgICAgYURpZUluZm8tPnRhZyA9IFRBR19wYWRkaW5nOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIHRhZy4gKi8KLSAgYURpZUluZm8tPnRhZyA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDI7Ci0gICAgICAKLSAgLyogVGhlbiB0aGUgYXR0cmlidXRlcy4gKi8KLSAgd2hpbGUgKHhwdHIgPCAodGhpc19kaWUgKyBhRGllSW5mby0+bGVuZ3RoKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBhdHRyOwotICAgICAgCi0gICAgICAvKiBQYXJzZSB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyBmb3JtLiAgVGhpcyBzZWN0aW9uIAotICAgICAgICAgbXVzdCBoYW5kbGUgYWxsIGR3YXJmMSBmb3JtcywgYnV0IG5lZWQgb25seSBoYW5kbGUgdGhlCi0JIGFjdHVhbCBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KLQotICAgICAgYXR0ciA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICAgICAgeHB0ciArPSAyOwotICAgICAgCi0gICAgICBzd2l0Y2ggKEZPUk1fRlJPTV9BVFRSIChhdHRyKSkKLQl7Ci0JY2FzZSBGT1JNX0RBVEEyOgotCSAgeHB0ciArPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE0OgotCWNhc2UgRk9STV9SRUY6Ci0JICBpZiAoYXR0ciA9PSBBVF9zaWJsaW5nKQotCSAgICBhRGllSW5mby0+c2libGluZyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9zdG10X2xpc3QpCi0JICAgIHsKLQkgICAgICBhRGllSW5mby0+c3RtdF9saXN0X29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgICAgIGFEaWVJbmZvLT5oYXNfc3RtdF9saXN0ID0gMTsKLQkgICAgfQotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE4OgotCSAgeHB0ciArPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0FERFI6Ci0JICBpZiAoYXR0ciA9PSBBVF9sb3dfcGMpCi0JICAgIGFEaWVJbmZvLT5sb3dfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGVsc2UgaWYgKGF0dHIgPT0gQVRfaGlnaF9wYykKLQkgICAgYURpZUluZm8tPmhpZ2hfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzI6Ci0JICB4cHRyICs9IDIgKyBiZmRfZ2V0XzE2IChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzQ6Ci0JICB4cHRyICs9IDQgKyBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9TVFJJTkc6Ci0JICBpZiAoYXR0ciA9PSBBVF9uYW1lKQotCSAgICBhRGllSW5mby0+bmFtZSA9IHhwdHI7Ci0JICB4cHRyICs9IHN0cmxlbiAoeHB0cikgKyAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBkd2FyZjEgbGluZSBudW1iZXIgdGFibGUgZm9yICdhVW5pdC0+c3RtdF9saXN0X29mZnNldCcKLSAgIGludG8gJ2FVbml0LT5saW5lbnVtYmVyX3RhYmxlJy4gIFJldHVybiBmYWxzZSBpZiBhbiBlcnJvciAKLSAgIG9jY3VyczsgdHJ1ZSBvdGhlcndpc2UuICovCi0gIAotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIGNoYXIqIHhwdHI7Ci0KLSAgLyogTG9hZCB0aGUgIi5saW5lIiBzZWN0aW9uIGZyb20gdGhlIGJmZCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICovIAotICBpZiAoc3Rhc2gtPmxpbmVfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0YXNoLT5hYmZkLCAiLmxpbmUiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JcmV0dXJuIGZhbHNlOwotCSAgCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+bGluZV9zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdGFzaC0+YWJmZCwgbXNlYywgc3Rhc2gtPmxpbmVfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+bGluZV9zZWN0aW9uX2VuZCA9IHN0YXNoLT5saW5lX3NlY3Rpb24gKyBzaXplOwotICAgIH0KLQotICB4cHRyID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0OwotICBpZiAoeHB0ciA8IHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZWFjaExpbmU7Ci0KLSAgICAgIGNoYXIqIHRibGVuZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsKLQotICAgICAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgICAgIHRibGVuZCA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKSArIHhwdHI7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIFRoZW4gdGhlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSB0YWJsZS4gKi8KLSAgICAgIGJhc2UgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIEhvdyBtYW55IGxpbmUgZW50cnlzPwotCSAxMCA9IDQgKGxpbmUgbnVtYmVyKSArIDIgKHBvcyBpbiBsaW5lKSArIDQgKGFkZHJlc3MgaW4gbGluZSkgKi8KLSAgICAgIGFVbml0LT5saW5lX2NvdW50ID0gKHRibGVuZCAtIHhwdHIpIC8gMTA7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFuIGFycmF5IGZvciB0aGUgZW50cmllcy4gKi8KLSAgICAgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlID0gKHN0cnVjdCBsaW5lbnVtYmVyKikKLQliZmRfYWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJICAgc2l6ZW9mIChzdHJ1Y3QgbGluZW51bWJlcikgKiBhVW5pdC0+bGluZV9jb3VudCk7Ci0JCi0gICAgICBmb3IgKGVhY2hMaW5lID0gMDsgZWFjaExpbmUgPCBhVW5pdC0+bGluZV9jb3VudDsgZWFjaExpbmUrKykKLQl7Ci0JICAvKiBBIGxpbmUgbnVtYmVyLiAqLwotCSAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbZWFjaExpbmVdLmxpbmVudW1iZXIKLQkgICAgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0KLQkgIC8qIFNraXAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgbGluZS4gKi8KLQkgIHhwdHIgKz0gMjsKLQotCSAgLyogQW5kIGZpbmFsbHkgdGhlIGFkZHJlc3MuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0uYWRkciAKLQkgICAgPSBiYXNlICsgYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGVhY2ggZnVuY3Rpb24gZGllIGluIGEgY29tcGlsYXRpb24gdW5pdCAnYVVuaXQnLgotICAgVGhlIGZpcnN0IGNoaWxkIGRpZSBvZiAnYVVuaXQnIHNob3VsZCBiZSBpbiAnYVVuaXQtPmZpcnN0X2NoaWxkJywKLSAgIHRoZSByZXN1bHQgaXMgcGxhY2VkIGluICdhVW5pdC0+ZnVuY19saXN0Jy4KLSAgIFJldHVybiBmYWxzZSBpZiBlcnJvcjsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9mdW5jdGlvbnNfaW5fdW5pdCAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogZWFjaERpZTsKLQotICBpZiAoYVVuaXQtPmZpcnN0X2NoaWxkKQotICAgIGZvciAoZWFjaERpZSA9IGFVbml0LT5maXJzdF9jaGlsZDsKLQkgZWFjaERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZDsKLQkgKQotICAgICAgewotCXN0cnVjdCBkaWVfaW5mbyBlYWNoRGllSW5mbzsKLQkKLQlpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmZWFjaERpZUluZm8sIGVhY2hEaWUpKQotCSAgcmV0dXJuIGZhbHNlOwotCQotCWlmIChlYWNoRGllSW5mby50YWcgPT0gVEFHX2dsb2JhbF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2lubGluZWRfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2VudHJ5X3BvaW50KQotCSAgewotCSAgICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGFGdW5jID0gYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLGFVbml0KTsKLQkgICAgCi0JICAgIGFGdW5jLT5uYW1lID0gZWFjaERpZUluZm8ubmFtZTsKLQkgICAgYUZ1bmMtPmxvd19wYyA9IGVhY2hEaWVJbmZvLmxvd19wYzsKLQkgICAgYUZ1bmMtPmhpZ2hfcGMgPSBlYWNoRGllSW5mby5oaWdoX3BjOwotCSAgfQotCQotCS8qIE1vdmUgdG8gbmV4dCBzaWJsaW5nLCBpZiBub25lLCBlbmQgbG9vcCAqLwotCWlmIChlYWNoRGllSW5mby5zaWJsaW5nKQotCSAgZWFjaERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgZWFjaERpZUluZm8uc2libGluZzsKLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gJ2FkZHInIGluICdhVW5pdCcuCi0gICBSZXR1cm4gd2hldGhlciB3ZSBmb3VuZCB0aGUgbGluZSAob3IgYSBmdW5jdGlvbikgd2l0aG91dCBlcnJvci4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkgICAgICAgbGluZW51bWJlcl9wdHIpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0gIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBpbnQgbGluZV9wID0gZmFsc2U7Ci0gIGludCBmdW5jX3AgPSBmYWxzZTsKLQotICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLSAgICB7Ci0gICAgICBpZiAoYVVuaXQtPmhhc19zdG10X2xpc3QpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpOwotCSAgc3RydWN0IGR3YXJmMV9mdW5jKiBlYWNoRnVuYzsKLQotCSAgaWYgKCEgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISBwYXJzZV9saW5lX3RhYmxlIChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgYVVuaXQtPmZ1bmNfbGlzdCkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGFVbml0LT5saW5lX2NvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaV0uYWRkciA8PSBhZGRyCi0JCSAgJiYgYWRkciA8IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2krMV0uYWRkcikKLQkJewotCQkgICpmaWxlbmFtZV9wdHIgPSBhVW5pdC0+bmFtZTsKLQkJICAqbGluZW51bWJlcl9wdHIgPSBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5saW5lbnVtYmVyOwotCQkgIGxpbmVfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKGVhY2hGdW5jID0gYVVuaXQtPmZ1bmNfbGlzdDsgCi0JICAgICAgIGVhY2hGdW5jOyAKLQkgICAgICAgZWFjaEZ1bmMgPSBlYWNoRnVuYy0+cHJldikKLQkgICAgewotCSAgICAgIGlmIChlYWNoRnVuYy0+bG93X3BjIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgZWFjaEZ1bmMtPmhpZ2hfcGMpCi0JCXsKLQkJICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hGdW5jLT5uYW1lOwotCQkgIGZ1bmNfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLQotCi0KLS8qIFRoZSBEV0FSRiAxIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLwotCi1ib29sZWFuCi1fYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGVhY2hVbml0OwotCi0gIC8qIFdoYXQgYWRkcmVzcyBhcmUgd2UgbG9va2luZyBmb3I/ICovCi0gIGJmZF92bWEgYWRkciA9IG9mZnNldCArIHNlY3Rpb24tPnZtYTsKLQotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotICAKLQotICBpZiAoISBzdGFzaCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICAgIAotICAgICAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjFfZmluZF9saW5lX2luZm8gPQotCShzdHJ1Y3QgZHdhcmYxX2RlYnVnKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2RlYnVnKSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgIC8qIE5vIGR3YXJmMSBpbmZvLiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN0YXNoCi0JICAgICBoYXMgYmVlbiBhbGxvY2F0ZWQsIGJ1dCBjb250YWlucyB6ZXJvcywgdGhpcyBsZXRzCi0JICAgICBmdXR1cmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBmYWlsIHF1aWNrZXIuICovCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gKHVuc2lnbmVkIGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgc3Rhc2gtPmRlYnVnX3NlY3Rpb24sIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgc2l6ZTsKLSAgICAgIHN0YXNoLT5jdXJyZW50RGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb247Ci0gICAgICBzdGFzaC0+YWJmZCA9IGFiZmQ7Ci0gICAgfQotCi0gIC8qIEEgbnVsbCBkZWJ1Z19zZWN0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBubyBkd2FyZjEgaW5mbwotICAgICBvciB0aGF0IGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgc3Rhc2guICovCi0KLSAgaWYgKCEgc3Rhc2gtPmRlYnVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLQotICAvKiBMb29rIGF0IHRoZSBwcmV2aW91c2x5IHBhcnNlZCB1bml0cyB0byBzZWUgaWYgYW55IGNvbnRhaW4KLSAgICAgdGhlIGFkZHIuICovCi0gIGZvciAoZWFjaFVuaXQgPSBzdGFzaC0+bGFzdFVuaXQ7IGVhY2hVbml0OyBlYWNoVW5pdCA9IGVhY2hVbml0LT5wcmV2KQotICAgIHsKLSAgICAgIGlmIChlYWNoVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGVhY2hVbml0LT5oaWdoX3BjKQotCXJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGVhY2hVbml0LCBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICAgIH0KLQotICB3aGlsZSAoc3Rhc2gtPmN1cnJlbnREaWUgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGRpZV9pbmZvIGFEaWVJbmZvOwotCi0gICAgICBpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmYURpZUluZm8sIHN0YXNoLT5jdXJyZW50RGllKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby50YWcgPT0gVEFHX2NvbXBpbGVfdW5pdCkKLQl7Ci0JICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0Ci0JICAgID0gYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKTsKLQkgIAotCSAgYVVuaXQtPm5hbWUgPSBhRGllSW5mby5uYW1lOwotCSAgYVVuaXQtPmxvd19wYyA9IGFEaWVJbmZvLmxvd19wYzsKLQkgIGFVbml0LT5oaWdoX3BjID0gYURpZUluZm8uaGlnaF9wYzsKLQkgIGFVbml0LT5oYXNfc3RtdF9saXN0ID0gYURpZUluZm8uaGFzX3N0bXRfbGlzdDsKLQkgIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0ID0gYURpZUluZm8uc3RtdF9saXN0X29mZnNldDsKLQkgIAotCSAgLyogQSBkaWUgaGFzIGEgY2hpbGQgaWYgaXQncyBmb2xsb3dlZCBieSBhIGRpZSB0aGF0IGlzCi0JICAgICBub3QgaXQncyBzaWJsaW5nLiAqLwotCSAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0JICAgICAgICAgICAgIT0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBhRGllSW5mby5zaWJsaW5nKQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aDsKLQkgIGVsc2UKLQkgICAgYVVuaXQtPmZpcnN0X2NoaWxkID0gMDsKLQotCSAgaWYgKGFVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgYVVuaXQtPmhpZ2hfcGMpCi0JICAgIHJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGFVbml0LCBhZGRyLCAKLQkJCQkJCSAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJCSAgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJCQkgIGxpbmVudW1iZXJfcHRyKTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby5zaWJsaW5nICE9IDApCi0Jc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmc7Ci0gICAgICBlbHNlCi0Jc3Rhc2gtPmN1cnJlbnREaWUgKz0gYURpZUluZm8ubGVuZ3RoOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9iZmQvZHdhcmYyLmMgYi9iZmQvZHdhcmYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDI5MTIuLjAwMDAwMDAKLS0tIGEvYmZkL2R3YXJmMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzNCArMCwwIEBACi0vKiBEV0FSRiAyIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBBZGFwdGVkIGZyb20gZ2RiL2R3YXJmMnJlYWQuYyBieSBHYXZpbiBLb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMKLSAgIChnYXZpbkBjeWdudXMuY29tKS4KLQotICAgRnJvbSB0aGUgZHdhcmYycmVhZC5jIGhlYWRlcjoKLSAgIEFkYXB0ZWQgYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pLCBJbnRyZXBpZCBUZWNobm9sb2d5LAotICAgSW5jLiAgd2l0aCBzdXBwb3J0IGZyb20gRmxvcmlkYSBTdGF0ZSBVbml2ZXJzaXR5ICh1bmRlciBjb250cmFjdAotICAgd2l0aCB0aGUgQWRhIEpvaW50IFByb2dyYW0gT2ZmaWNlKSwgYW5kIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAgIEluaXRpYWwgY29udHJpYnV0aW9uIGJ5IEJyZW50IEJlbnNvbiwgSGFycmlzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4sCi0gICBiYXNlZCBvbiBGcmVkIEZpc2gncyAoQ3lnbnVzIFN1cHBvcnQpIGltcGxlbWVudGF0aW9uIG9mIERXQVJGIDEKLSAgIHN1cHBvcnQgaW4gZHdhcmZyZWFkLmMKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVGhlIGRhdGEgaW4gdGhlIC5kZWJ1Z19saW5lIHN0YXRlbWVudCBwcm9sb2d1ZSBsb29rcyBsaWtlIHRoaXMuICAqLwotc3RydWN0IGxpbmVfaGVhZAotICB7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICAgIHVuc2lnbmVkIGludCBwcm9sb2d1ZV9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBjaGFyIGRlZmF1bHRfaXNfc3RtdDsKLSAgICBpbnQgbGluZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgbGluZV9yYW5nZTsKLSAgICB1bnNpZ25lZCBjaGFyIG9wY29kZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzOwotICB9OwotCi0vKiBBdHRyaWJ1dGVzIGhhdmUgYSBuYW1lIGFuZCBhIHZhbHVlICovCi1zdHJ1Y3QgYXR0cmlidXRlCi0gIHsKLSAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOwotICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOwotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqc3RyOwotCXN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOwotCXVuc2lnbmVkIGludCB1bnNuZDsKLQlpbnQgc25kOwotCWJmZF92bWEgYWRkcjsKLSAgICAgIH0KLSAgICB1OwotICB9OwotCi0vKiBHZXQgYXQgcGFydHMgb2YgYW4gYXR0cmlidXRlIHN0cnVjdHVyZSAqLwotCi0jZGVmaW5lIERXX1NUUklORyhhdHRyKSAgICAoKGF0dHIpLT51LnN0cikKLSNkZWZpbmUgRFdfVU5TTkQoYXR0cikgICAgICgoYXR0ciktPnUudW5zbmQpCi0jZGVmaW5lIERXX0JMT0NLKGF0dHIpICAgICAoKGF0dHIpLT51LmJsaykKLSNkZWZpbmUgRFdfU05EKGF0dHIpICAgICAgICgoYXR0ciktPnUuc25kKQotI2RlZmluZSBEV19BRERSKGF0dHIpCSAgICgoYXR0ciktPnUuYWRkcikKLQotLyogQmxvY2tzIGFyZSBhIGJ1bmNoIG9mIHVudHlwZWQgYnl0ZXMuICovCi1zdHJ1Y3QgZHdhcmZfYmxvY2sKLSAgewotICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgIGNoYXIgKmRhdGE7Ci0gIH07Ci0KLQotc3RydWN0IGR3YXJmMl9kZWJ1ZyB7Ci0KLSAgLyogQSBsaXN0IG9mIGFsbCBwcmV2aW91c2x5IHJlYWQgY29tcF91bml0cy4gKi8KLSAgc3RydWN0IGNvbXBfdW5pdCogYWxsX2NvbXBfdW5pdHM7Ci0KLSAgLyogVGhlIG5leHQgdW5yZWFkIGNvbXBpbGF0aW9uIHVuaXQgd2l0aGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGhhcyBub3QgYmVlbiBsb2FkZWQKLSAgICAgaW50byBhIGJ1ZmZlciB5ZXQuKi8KLSAgY2hhciogaW5mb19wdHI7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIG1lbW9yeSBidWZmZXIuICovCi0gIGNoYXIqIGluZm9fcHRyX2VuZDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gbG9hZGVkIGludG8gbWVtb3J5LiAqLwotICBjaGFyKiBkd2FyZl9hYmJyZXZfYnVmZmVyOwotCi0gIC8qIExlbmd0aCBvZiB0aGUgbG9hZGVkIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBkd2FyZl9hYmJyZXZfc2l6ZTsKLQotICAvKiBCdWZmZXIgZm9yIGRlY29kZV9saW5lX2luZm8uICAqLwotICBjaGFyICpkd2FyZl9saW5lX2J1ZmZlcjsKLQotICAvKiBMZW5ndGggb2YgdGhlIGxvYWRlZCAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkd2FyZl9saW5lX3NpemU7Ci19OwotCi1zdHJ1Y3QgYXJhbmdlIHsKLSAgc3RydWN0IGFyYW5nZSAqbmV4dDsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogQSBtaW5pbWFsIGRlY29kaW5nIG9mIERXQVJGMiBjb21waWxhdGlvbiB1bml0cy4gIFdlIG9ubHkgZGVjb2RlCi0gICB3aGF0J3MgbmVlZGVkIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi0KLXN0cnVjdCBjb21wX3VuaXQgewotCi0gIC8qIENoYWluIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIG5leHRfdW5pdDsKLQotICAvKiBLZWVwIHRoZSBiZGYgY29udmVuaWVudCAoZm9yIG1lbW9yeSBhbGxvY2F0aW9uKS4gKi8KLSAgYmZkKiBhYmZkOwotCi0gIC8qIFRoZSBsb3dlc3QgYW5kIGhpZ2VzdCBhZGRyZXNzZXMgY29udGFpbmVkIGluIHRoaXMgY29tcGlsYXRpb24KLSAgICAgdW5pdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiAqLwotICBzdHJ1Y3QgYXJhbmdlIGFyYW5nZTsKLQotICAvKiBUaGUgRFdfQVRfbmFtZSBhdHRyaWJ1dGUgKGZvciBlcnJvciBtZXNzYWdlcykuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGFiYnJldiBoYXNoIHRhYmxlLiAqLwotICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOwotCi0gIC8qIE5vdGUgdGhhdCBhbiBlcnJvciB3YXMgZm91bmQgYnkgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lLiAqLwotICBpbnQgZXJyb3I7Ci0KLSAgLyogVGhlIERXX0FUX2NvbXBfZGlyIGF0dHJpYnV0ZSAqLwotICBjaGFyKiBjb21wX2RpcjsKLQotICAvKiBUcnVlIGlmIHRoZXJlIGlzIGEgbGluZSBudW1iZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcC4gdW5pdC4gKi8KLSAgaW50IHN0bXRsaXN0OwotICAKLSAgLyogVGhlIG9mZnNldCBpbnRvIC5kZWJ1Z19saW5lIG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lX29mZnNldDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBjaGlsZCBkaWUgZm9yIHRoZSBjb21wIHVuaXQuICovCi0gIGNoYXIgKmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0KLSAgLyogVGhlIGVuZCBvZiB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICplbmRfcHRyOwotCi0gIC8qIFRoZSBkZWNvZGVkIGxpbmUgbnVtYmVyLCBOVUxMIGlmIG5vdCB5ZXQgZGVjb2RlZC4gKi8KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogbGluZV90YWJsZTsKLQotICAvKiBBIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmb3VuZCBpbiB0aGlzIGNvbXAuIHVuaXQuICovCi0gIHN0cnVjdCBmdW5jaW5mbyogZnVuY3Rpb25fdGFibGU7IAotCi0gIC8qIEFkZHJlc3Mgc2l6ZSBmb3IgdGhpcyB1bml0IC0gZnJvbSB1bml0IGhlYWRlciAqLwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLX07Ci0KLQotCi0vKiBWRVJCQVRJTSAKLSAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdXAgdG8gdGhlIEVORCBWRVJCQVRJTSBtYXJrIGFyZSAKLSAgIGNvcGllZCBkaXJlY3RseSBmcm9tIGR3YXJmMnJlYWQuYy4gKi8KLQotLyogcmVhZCBkd2FyZiBpbmZvcm1hdGlvbiBmcm9tIGEgYnVmZmVyICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMV9ieXRlIChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgaW50Ci1yZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfNF9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9zdHJpbmcgKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIHN0cmluZywgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgc3RyaW5nIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICBpZiAoKmJ1ZiA9PSAnXDAnKQotICAgIHsKLSAgICAgICpieXRlc19yZWFkX3B0ciA9IDE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICpieXRlc19yZWFkX3B0ciA9IHN0cmxlbiAoYnVmKSArIDE7Ci0gIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOwotewotICB1bnNpZ25lZCBpbnQgIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50ICBudW1fcmVhZDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCAgID0gMDsKLSAgc2hpZnQgICAgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0gIAotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgICAgYnVmICsrOwotICAgICAgbnVtX3JlYWQgKys7Ci0gICAgICByZXN1bHQgfD0gKChieXRlICYgMHg3ZikgPDwgc2hpZnQpOwotICAgICAgc2hpZnQgKz0gNzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0gIAotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1yZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqIGJ5dGVzX3JlYWRfcHRyOwotewotICBpbnQgICAgICAgICAgIHJlc3VsdDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgaW50ICAgICAgICAgICBudW1fcmVhZDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCA9IDA7Ci0gIHNoaWZ0ID0gMDsKLSAgbnVtX3JlYWQgPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gIGlmICgoc2hpZnQgPCAzMikgJiYgKGJ5dGUgJiAweDQwKSkKLSAgICByZXN1bHQgfD0gLSgxIDw8IHNoaWZ0KTsKLQotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBFTkQgVkVSQkFUSU0gKi8KLQotc3RhdGljIGJmZF92bWEKLXJlYWRfYWRkcmVzcyAodW5pdCwgYnVmKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBjaGFyICpidWY7Ci17Ci0gIHN3aXRjaCAodW5pdC0+YWRkcl9zaXplKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gYmZkX2dldF82NCAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGJmZF9nZXRfMzIgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBiZmRfZ2V0XzE2ICh1bml0LT5hYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0KLQotCi0KLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIGFuIGFiYnJldi4gKi8KLXN0cnVjdCBhYmJyZXZfaW5mbwotICB7Ci0gICAgdW5zaWduZWQgaW50IG51bWJlcjsJLyogbnVtYmVyIGlkZW50aWZ5aW5nIGFiYnJldiAqLwotICAgIGVudW0gZHdhcmZfdGFnIHRhZzsJCS8qIGR3YXJmIHRhZyAqLwotICAgIGludCBoYXNfY2hpbGRyZW47CQkvKiBib29sZWFuICovCi0gICAgdW5zaWduZWQgaW50IG51bV9hdHRyczsJLyogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKi8KLSAgICBzdHJ1Y3QgYXR0cl9hYmJyZXYgKmF0dHJzOwkvKiBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgZGVzY3JpcHRpb25zICovCi0gICAgc3RydWN0IGFiYnJldl9pbmZvICpuZXh0OwkvKiBuZXh0IGluIGNoYWluICovCi0gIH07Ci0KLXN0cnVjdCBhdHRyX2FiYnJldgotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgfTsKLQotI2lmbmRlZiBBQkJSRVZfSEFTSF9TSVpFCi0jZGVmaW5lIEFCQlJFVl9IQVNIX1NJWkUgMTIxCi0jZW5kaWYKLSNpZm5kZWYgQVRUUl9BTExPQ19DSFVOSwotI2RlZmluZSBBVFRSX0FMTE9DX0NIVU5LIDQKLSNlbmRpZgotCi0vKiBMb29rdXAgYW4gYWJicmV2X2luZm8gc3RydWN0dXJlIGluIHRoZSBhYmJyZXYgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8gKgotbG9va3VwX2FiYnJldiAobnVtYmVyLGFiYnJldnMpCi0gICAgIHVuc2lnbmVkIGludCBudW1iZXI7Ci0gICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoX251bWJlcjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0KLSAgaGFzaF9udW1iZXIgPSBudW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICBhYmJyZXYgPSBhYmJyZXZzW2hhc2hfbnVtYmVyXTsKLQotICB3aGlsZSAoYWJicmV2KQotICAgIHsKLSAgICAgIGlmIChhYmJyZXYtPm51bWJlciA9PSBudW1iZXIpCi0JcmV0dXJuIGFiYnJldjsKLSAgICAgIGVsc2UKLQlhYmJyZXYgPSBhYmJyZXYtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW4gRFdBUkYgdmVyc2lvbiAyLCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcwotICAgc3RvcmVkIGluIGEgc2VwYXJhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgQmVmb3JlIHdlIHJlYWQgYW55Ci0gICBkaWVzIGZyb20gYSBzZWN0aW9uIHdlIHJlYWQgaW4gYWxsIGFiYnJldmlhdGlvbnMgYW5kIGluc3RhbGwgdGhlbQotICAgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyoqCi1yZWFkX2FiYnJldnMgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLXsKLSAgc3RydWN0IGFiYnJldl9pbmZvICoqYWJicmV2czsKLSAgY2hhciAqYWJicmV2X3B0cjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICpjdXJfYWJicmV2OwotICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgYWJicmV2X25hbWU7Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfZm9ybSwgaGFzaF9udW1iZXI7Ci0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoOwotCi0gIHN0YXNoID0gZWxmX3RkYXRhKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1Z19hYmJyZXYiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSA9IG1zZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyID0gKGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSk7Ci0gICAgICBpZiAoISBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLQkgIHJldHVybiAwOwotICAgICAgCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyLCAwLAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPiBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQWJicmV2IG9mZnNldCAoJXUpIGJpZ2dlciB0aGFuIGFiYnJldiBzaXplICgldSkuIiksIAotCQkJICAgICBvZmZzZXQsIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSApOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJicmV2cyA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mKHN0cnVjdCBhYmJyZXZfaW5mbyopICogQUJCUkVWX0hBU0hfU0laRSk7Ci0KLSAgYWJicmV2X3B0ciA9IHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyICsgb2Zmc2V0OwotICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIGxvb3AgdW50aWwgd2UgcmVhY2ggYW4gYWJicmV2IG51bWJlciBvZiAwICovCi0gIHdoaWxlIChhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgIGN1cl9hYmJyZXYgPSAoc3RydWN0IGFiYnJldl9pbmZvKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhYmJyZXZfaW5mbykpOwotCi0gICAgICAvKiByZWFkIGluIGFiYnJldiBoZWFkZXIgKi8KLSAgICAgIGN1cl9hYmJyZXYtPm51bWJlciA9IGFiYnJldl9udW1iZXI7Ci0gICAgICBjdXJfYWJicmV2LT50YWcgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgY3VyX2FiYnJldi0+aGFzX2NoaWxkcmVuID0gcmVhZF8xX2J5dGUgKGFiZmQsIGFiYnJldl9wdHIpOwotICAgICAgYWJicmV2X3B0ciArPSAxOwotCi0gICAgICAvKiBub3cgcmVhZCBpbiBkZWNsYXJhdGlvbnMgKi8KLSAgICAgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHdoaWxlIChhYmJyZXZfbmFtZSkKLQl7Ci0JICBpZiAoKGN1cl9hYmJyZXYtPm51bV9hdHRycyAlIEFUVFJfQUxMT0NfQ0hVTkspID09IDApCi0JICAgIHsKLQkgICAgICBjdXJfYWJicmV2LT5hdHRycyA9IChzdHJ1Y3QgYXR0cl9hYmJyZXYgKikKLQkJYmZkX3JlYWxsb2MgKGN1cl9hYmJyZXYtPmF0dHJzLAotCQkJICAgICAoY3VyX2FiYnJldi0+bnVtX2F0dHJzICsgQVRUUl9BTExPQ19DSFVOSykKLQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBhdHRyX2FiYnJldikpOwotCSAgICAgIGlmICghIGN1cl9hYmJyZXYtPmF0dHJzKQotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgY3VyX2FiYnJldi0+YXR0cnNbY3VyX2FiYnJldi0+bnVtX2F0dHJzXS5uYW1lID0gYWJicmV2X25hbWU7Ci0JICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnMrK10uZm9ybSA9IGFiYnJldl9mb3JtOwotCSAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCSAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotCX0KLQotICAgICAgaGFzaF9udW1iZXIgPSBhYmJyZXZfbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKLSAgICAgIGN1cl9hYmJyZXYtPm5leHQgPSBhYmJyZXZzW2hhc2hfbnVtYmVyXTsKLSAgICAgIGFiYnJldnNbaGFzaF9udW1iZXJdID0gY3VyX2FiYnJldjsKLQotICAgICAgLyogR2V0IG5leHQgYWJicmV2aWF0aW9uLgotICAgICAgICAgVW5kZXIgSXJpeDYgdGhlIGFiYnJldmlhdGlvbnMgZm9yIGEgY29tcGlsYXRpb24gdW5pdCBhcmUgbm90Ci0JIGFsd2F5cyBwcm9wZXJseSB0ZXJtaW5hdGVkIHdpdGggYW4gYWJicmV2IG51bWJlciBvZiAwLgotCSBFeGl0IGxvb3AgaWYgd2UgZW5jb3VudGVyIGFuIGFiYnJldmlhdGlvbiB3aGljaCB3ZSBoYXZlCi0JIGFscmVhZHkgcmVhZCAod2hpY2ggbWVhbnMgd2UgYXJlIGFib3V0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGlvbnMKLQkgZm9yIHRoZSBuZXh0IGNvbXBpbGUgdW5pdCkgb3IgaWYgdGhlIGVuZCBvZiB0aGUgYWJicmV2aWF0aW9uCi0JIHRhYmxlIGlzIHJlYWNoZWQuICAqLwotICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChhYmJyZXZfcHRyIC0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0JICAgID49IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKLQlicmVhazsKLSAgICAgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsYWJicmV2cykgIT0gTlVMTCkKLQlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiYnJldnM7Ci19Ci0KLS8qIFJlYWQgYW4gYXR0cmlidXRlIGRlc2NyaWJlZCBieSBhbiBhYmJyZXZpYXRlZCBhdHRyaWJ1dGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2F0dHJpYnV0ZSAoYXR0ciwgYWJicmV2LCB1bml0LCBpbmZvX3B0cikKLSAgICAgc3RydWN0IGF0dHJpYnV0ZSAgICphdHRyOwotICAgICBzdHJ1Y3QgYXR0cl9hYmJyZXYgKmFiYnJldjsKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAgICp1bml0OwotICAgICBjaGFyICAgICAgICAgICAgICAgKmluZm9fcHRyOwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsKLSAgc3RydWN0IGR3YXJmX2Jsb2NrICpibGs7Ci0KLSAgYXR0ci0+bmFtZSA9IGFiYnJldi0+bmFtZTsKLSAgYXR0ci0+Zm9ybSA9IGFiYnJldi0+Zm9ybTsKLSAgc3dpdGNoIChhYmJyZXYtPmZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICAgIERXX0FERFIgKGF0dHIpID0gcmVhZF9hZGRyZXNzICh1bml0LCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSB1bml0LT5hZGRyX3NpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgICBEV19TVFJJTkcgKGF0dHIpID0gcmVhZF9zdHJpbmcgKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZmxhZzoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgICAgRFdfU05EIChhdHRyKSA9IHJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9zdHJwOgotICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDoKLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogSW52YWxpZCBvciB1bmhhbmRsZWQgRk9STSB2YWx1ZTogJWQuIiksCi0JCQkgICAgIGFiYnJldi0+Zm9ybSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICB9Ci0gIHJldHVybiBpbmZvX3B0cjsKLX0KLQotCi0vKiBTb3VyY2UgbGluZSBpbmZvcm1hdGlvbiB0YWJsZSByb3V0aW5lcy4gKi8KLQotI2RlZmluZSBGSUxFX0FMTE9DX0NIVU5LIDUKLSNkZWZpbmUgRElSX0FMTE9DX0NIVU5LIDUKLQotc3RydWN0IGxpbmVfaW5mbyB7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIHByZXZfbGluZTsKLQotICBiZmRfdm1hIGFkZHJlc3M7Ci0gIGNoYXIqIGZpbGVuYW1lOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgdW5zaWduZWQgaW50IGNvbHVtbjsKLSAgaW50IGVuZF9zZXF1ZW5jZTsJCS8qIGVuZCBvZiAoc2VxdWVudGlhbCkgY29kZSBzZXF1ZW5jZSAqLwotfTsKLQotc3RydWN0IGZpbGVpbmZvIHsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGRpcjsKLSAgdW5zaWduZWQgaW50IHRpbWU7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotc3RydWN0IGxpbmVfaW5mb190YWJsZSB7Ci0gIGJmZCogYWJmZDsKLQotICB1bnNpZ25lZCBpbnQgbnVtX2ZpbGVzOwotICB1bnNpZ25lZCBpbnQgbnVtX2RpcnM7Ci0KLSAgY2hhciogY29tcF9kaXI7Ci0gIGNoYXIqKiBkaXJzOwotICBzdHJ1Y3QgZmlsZWluZm8qIGZpbGVzOwotICBzdHJ1Y3QgbGluZV9pbmZvKiBsYXN0X2xpbmU7Ci19OwotCi1zdGF0aWMgdm9pZCAKLWFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBlbmRfc2VxdWVuY2UpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgIGNoYXIqIGZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IGNvbHVtbjsKLSAgICAgaW50IGVuZF9zZXF1ZW5jZTsKLXsKLSAgc3RydWN0IGxpbmVfaW5mbyogaW5mbyA9IChzdHJ1Y3QgbGluZV9pbmZvKikKLSAgICBiZmRfYWxsb2MgKHRhYmxlLT5hYmZkLCBzaXplb2YgKHN0cnVjdCBsaW5lX2luZm8pKTsKLQotICBpbmZvLT5wcmV2X2xpbmUgPSB0YWJsZS0+bGFzdF9saW5lOwotICB0YWJsZS0+bGFzdF9saW5lID0gaW5mbzsKLQotICBpbmZvLT5hZGRyZXNzID0gYWRkcmVzczsKLSAgaW5mby0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaW5mby0+bGluZSA9IGxpbmU7Ci0gIGluZm8tPmNvbHVtbiA9IGNvbHVtbjsKLSAgaW5mby0+ZW5kX3NlcXVlbmNlID0gZW5kX3NlcXVlbmNlOwotfQotCi1zdGF0aWMgY2hhciogCi1jb25jYXRfZmlsZW5hbWUgKHRhYmxlLCBmaWxlKQotICAgICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLSAgICAgdW5zaWduZWQgaW50IGZpbGU7Ci17Ci0gIGNoYXIqIGZpbGVuYW1lOwotCi0gIGlmIChmaWxlIC0gMSA+PSB0YWJsZS0+bnVtX2ZpbGVzKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uIChiYWQgZmlsZSBudW1iZXIpLiIpKTsKLSAgICAgIHJldHVybiAiPHVua25vd24+IjsKLSAgICB9Ci0KLSAgZmlsZW5hbWUgPSB0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLm5hbWU7Ci0gIGlmICgqZmlsZW5hbWUgPT0gJy8nKQotICAgIHJldHVybiBmaWxlbmFtZTsKLQotICBlbHNlCi0gICAgewotICAgICAgY2hhciogZGlybmFtZSA9ICh0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLmRpcgotCQkgICAgICAgPyB0YWJsZS0+ZGlyc1t0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLmRpciAtIDFdCi0JCSAgICAgICA6IHRhYmxlLT5jb21wX2Rpcik7Ci0gICAgICByZXR1cm4gKGNoYXIqKSBjb25jYXQgKGRpcm5hbWUsICIvIiwgZmlsZW5hbWUsIE5VTEwpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFyYW5nZV9hZGQgKHVuaXQsIGxvd19wYywgaGlnaF9wYykKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLSAgICAgYmZkX3ZtYSBsb3dfcGM7Ci0gICAgIGJmZF92bWEgaGlnaF9wYzsKLXsKLSAgc3RydWN0IGFyYW5nZSAqYXJhbmdlOwotCi0gIC8qIGZpcnN0IHNlZSBpZiB3ZSBjYW4gY2hlYXBseSBleHRlbmQgYW4gZXhpc3RpbmcgcmFuZ2U6ICovCi0gIGFyYW5nZSA9ICZ1bml0LT5hcmFuZ2U7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGxvd19wYyA9PSBhcmFuZ2UtPmhpZ2gpCi0JewotCSAgYXJhbmdlLT5oaWdoID0gaGlnaF9wYzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaGlnaF9wYyA9PSBhcmFuZ2UtPmxvdykKLQl7Ci0JICBhcmFuZ2UtPmxvdyA9IGxvd19wYzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhcmFuZ2UgPSBhcmFuZ2UtPm5leHQ7Ci0gICAgfQotICB3aGlsZSAoYXJhbmdlKTsKLQotICBpZiAodW5pdC0+YXJhbmdlLmhpZ2ggPT0gMCkKLSAgICB7Ci0gICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBhZGRyZXNzIHJhbmdlOiBzdG9yZSBpdCBpbiB1bml0LT5hcmFuZ2U6ICovCi0gICAgICB1bml0LT5hcmFuZ2UubmV4dCA9IDA7Ci0gICAgICB1bml0LT5hcmFuZ2UubG93ID0gbG93X3BjOwotICAgICAgdW5pdC0+YXJhbmdlLmhpZ2ggPSBoaWdoX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGFyYW5nZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGFyYW5nZSBsaXN0OiAqLwotICBhcmFuZ2UgPSBiZmRfemFsbG9jICh1bml0LT5hYmZkLCBzaXplb2YgKCphcmFuZ2UpKTsKLSAgYXJhbmdlLT5sb3cgPSBsb3dfcGM7Ci0gIGFyYW5nZS0+aGlnaCA9IGhpZ2hfcGM7Ci0KLSAgYXJhbmdlLT5uZXh0ID0gdW5pdC0+YXJhbmdlLm5leHQ7Ci0gIHVuaXQtPmFyYW5nZS5uZXh0ID0gYXJhbmdlOwotfQotCi0vKiBEZWNvZGUgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBVTklULiAqLwotCi1zdGF0aWMgc3RydWN0IGxpbmVfaW5mb190YWJsZSoKLWRlY29kZV9saW5lX2luZm8gKHVuaXQpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQgKnVuaXQ7Ci17Ci0gIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7Ci0KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2g7Ci0KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0KLSAgY2hhciAqbGluZV9wdHI7Ci0gIGNoYXIgKmxpbmVfZW5kOwotICBzdHJ1Y3QgbGluZV9oZWFkIGxoOwotICB1bnNpZ25lZCBpbnQgaSwgYnl0ZXNfcmVhZDsKLSAgY2hhciAqY3VyX2ZpbGUsICpjdXJfZGlyOwotICB1bnNpZ25lZCBjaGFyIG9wX2NvZGUsIGV4dGVuZGVkX29wLCBhZGpfb3Bjb2RlOwotCi0gIHN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIGlmICghIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlcikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLQotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2xpbmUiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBzdGFzaC0+ZHdhcmZfbGluZV9zaXplID0gbXNlYy0+X3Jhd19zaXplOwotICAgICAgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdGFzaC0+ZHdhcmZfbGluZV9zaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlcikKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIsIDAsCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2xpbmVfc2l6ZSkpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBvdWdodCB0byBhcHBseSB0aGUgcmVsb2NzIGFnYWluc3QgdGhpcyBzZWN0aW9uIGJlZm9yZQotCSB3ZSBwcm9jZXNzIGl0Li4uLiAqLwotICAgIH0KLQotICAvKiBTaW5jZSB3ZSBhcmUgdXNpbmcgdW4tcmVsb2NhdGVkIGRhdGEsIGl0IGlzIHBvc3NpYmxlIHRvIGdldCBhIGJhZCB2YWx1ZQotICAgICBmb3IgdGhlIGxpbmVfb2Zmc2V0LiAgVmFsaWRhdGUgaXQgaGVyZSBzbyB0aGF0IHdlIHdvbid0IGdldCBhIHNlZ2ZhdWx0Ci0gICAgIGJlbG93LiAgKi8KLSAgaWYgKHVuaXQtPmxpbmVfb2Zmc2V0ID49IHN0YXNoLT5kd2FyZl9saW5lX3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogTGluZSBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBsaW5lIHNpemUgKCV1KS4iKSwKLQkJCSAgICAgdW5pdC0+bGluZV9vZmZzZXQsIHN0YXNoLT5kd2FyZl9saW5lX3NpemUpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgdGFibGUgPSAoc3RydWN0IGxpbmVfaW5mb190YWJsZSopIGJmZF9hbGxvYyAoYWJmZCwgCi0JCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBsaW5lX2luZm9fdGFibGUpKTsKLSAgdGFibGUtPmFiZmQgPSBhYmZkOwotICB0YWJsZS0+Y29tcF9kaXIgPSB1bml0LT5jb21wX2RpcjsKLQotICB0YWJsZS0+bnVtX2ZpbGVzID0gMDsKLSAgdGFibGUtPmZpbGVzID0gTlVMTDsKLQotICB0YWJsZS0+bnVtX2RpcnMgPSAwOwotICB0YWJsZS0+ZGlycyA9IE5VTEw7Ci0KLSAgdGFibGUtPmZpbGVzID0gTlVMTDsKLSAgdGFibGUtPmxhc3RfbGluZSA9IE5VTEw7Ci0KLSAgbGluZV9wdHIgPSBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgKyB1bml0LT5saW5lX29mZnNldDsKLQotICAvKiByZWFkIGluIHRoZSBwcm9sb2d1ZSAqLwotICBsaC50b3RhbF9sZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gNDsKLSAgbGluZV9lbmQgPSBsaW5lX3B0ciArIGxoLnRvdGFsX2xlbmd0aDsKLSAgbGgudmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAyOwotICBsaC5wcm9sb2d1ZV9sZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gNDsKLSAgbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGggPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5kZWZhdWx0X2lzX3N0bXQgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5saW5lX2Jhc2UgPSByZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgubGluZV9yYW5nZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLm9wY29kZV9iYXNlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHMgPSAodW5zaWduZWQgY2hhciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgbGgub3Bjb2RlX2Jhc2UgKiBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLQotICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1swXSA9IDE7Ci0gIGZvciAoaSA9IDE7IGkgPCBsaC5vcGNvZGVfYmFzZTsgKytpKQotICAgIHsKLSAgICAgIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzW2ldID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgICAgIGxpbmVfcHRyICs9IDE7Ci0gICAgfQotCi0gIC8qIFJlYWQgZGlyZWN0b3J5IHRhYmxlICAqLwotICB3aGlsZSAoKGN1cl9kaXIgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKCh0YWJsZS0+bnVtX2RpcnMgJSBESVJfQUxMT0NfQ0hVTkspID09IDApCi0JewotCSAgdGFibGUtPmRpcnMgPSAoY2hhciAqKikKLQkgICAgYmZkX3JlYWxsb2MgKHRhYmxlLT5kaXJzLAotCQkJICh0YWJsZS0+bnVtX2RpcnMgKyBESVJfQUxMT0NfQ0hVTkspICogc2l6ZW9mIChjaGFyICopKTsKLQkgIGlmICghIHRhYmxlLT5kaXJzKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICB0YWJsZS0+ZGlyc1t0YWJsZS0+bnVtX2RpcnMrK10gPSBjdXJfZGlyOwotICAgIH0KLSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBSZWFkIGZpbGUgbmFtZSB0YWJsZSAqLwotICB3aGlsZSAoKGN1cl9maWxlID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCkpICE9IE5VTEwpCi0gICAgewotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmICgodGFibGUtPm51bV9maWxlcyAlIEZJTEVfQUxMT0NfQ0hVTkspID09IDApCi0JewotCSAgdGFibGUtPmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQotCSAgICBiZmRfcmVhbGxvYyAodGFibGUtPmZpbGVzLAotCQkJICh0YWJsZS0+bnVtX2ZpbGVzICsgRklMRV9BTExPQ19DSFVOSykKLQkJCSAqIHNpemVvZiAoc3RydWN0IGZpbGVpbmZvKSk7Ci0JICBpZiAoISB0YWJsZS0+ZmlsZXMpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5uYW1lID0gY3VyX2ZpbGU7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uZGlyID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10udGltZSA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnNpemUgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5udW1fZmlsZXMrKzsKLSAgICB9Ci0gIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogUmVhZCB0aGUgc3RhdGVtZW50IHNlcXVlbmNlcyB1bnRpbCB0aGVyZSdzIG5vdGhpbmcgbGVmdC4gICovCi0gIHdoaWxlIChsaW5lX3B0ciA8IGxpbmVfZW5kKQotICAgIHsKLSAgICAgIC8qIHN0YXRlIG1hY2hpbmUgcmVnaXN0ZXJzICAqLwotICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gMDsKLSAgICAgIGNoYXIqIGZpbGVuYW1lID0gY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgMSk7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZSA9IDE7Ci0gICAgICB1bnNpZ25lZCBpbnQgY29sdW1uID0gMDsKLSAgICAgIGludCBpc19zdG10ID0gbGguZGVmYXVsdF9pc19zdG10OwotICAgICAgaW50IGJhc2ljX2Jsb2NrID0gMDsKLSAgICAgIGludCBlbmRfc2VxdWVuY2UgPSAwLCBuZWVkX2xvd19wYyA9IDE7Ci0gICAgICBiZmRfdm1hIGxvd19wYyA9IDA7Ci0KLSAgICAgIC8qIERlY29kZSB0aGUgdGFibGUuICovCi0gICAgICB3aGlsZSAoISBlbmRfc2VxdWVuY2UpCi0JewotCSAgb3BfY29kZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0JICBsaW5lX3B0ciArPSAxOwotCSAgc3dpdGNoIChvcF9jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgotCSAgICAgIGxpbmVfcHRyICs9IDE7CS8qIGlnbm9yZSBsZW5ndGggKi8KLQkgICAgICBleHRlbmRlZF9vcCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0JICAgICAgbGluZV9wdHIgKz0gMTsKLQkgICAgICBzd2l0Y2ggKGV4dGVuZGVkX29wKQotCQl7Ci0JCWNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKLQkJICBlbmRfc2VxdWVuY2UgPSAxOwotCQkgIGFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLAotCQkJCSBlbmRfc2VxdWVuY2UpOwotCQkgIGlmIChuZWVkX2xvd19wYykKLQkJICAgIHsKLQkJICAgICAgbmVlZF9sb3dfcGMgPSAwOwotCQkgICAgICBsb3dfcGMgPSBhZGRyZXNzOwotCQkgICAgfQotCQkgIGFyYW5nZV9hZGQgKHVuaXQsIGxvd19wYywgYWRkcmVzcyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotCQkgIGFkZHJlc3MgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGxpbmVfcHRyKTsKLQkJICBsaW5lX3B0ciArPSB1bml0LT5hZGRyX3NpemU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFdfTE5FX2RlZmluZV9maWxlOgotCQkgIGN1cl9maWxlID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICBpZiAoKHRhYmxlLT5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQotCQkgICAgewotCQkgICAgICB0YWJsZS0+ZmlsZXMgPSAoc3RydWN0IGZpbGVpbmZvICopCi0JCQliZmRfcmVhbGxvYyAodGFibGUtPmZpbGVzLAotCQkJCSAgICAgKHRhYmxlLT5udW1fZmlsZXMgKyBGSUxFX0FMTE9DX0NIVU5LKQotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOwotCQkgICAgICBpZiAoISB0YWJsZS0+ZmlsZXMpCi0JCQlyZXR1cm4gMDsKLQkJICAgIH0KLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10ubmFtZSA9IGN1cl9maWxlOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5kaXIgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10udGltZSA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5zaXplID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPm51bV9maWxlcysrOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IG1hbmdsZWQgbGluZSBudW1iZXIgc2VjdGlvbi4iKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfY29weToKLQkgICAgICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgMCk7Ci0JICAgICAgYmFzaWNfYmxvY2sgPSAwOwotCSAgICAgIGlmIChuZWVkX2xvd19wYykKLQkJewotCQkgIG5lZWRfbG93X3BjID0gMDsKLQkJICBsb3dfcGMgPSBhZGRyZXNzOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2FkdmFuY2VfcGM6Ci0JICAgICAgYWRkcmVzcyArPSBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aAotCQkqIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2FkdmFuY2VfbGluZToKLQkgICAgICBsaW5lICs9IHJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19zZXRfZmlsZToKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBmaWxlOwotCi0JCS8qIFRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgdGFibGVzIGFyZSAwIGJhc2VkLCB0aGUgcmVmZXJlbmNlcwotCQkgICBhcmUgMSBiYXNlZC4gICovCi0JCWZpbGUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJZmlsZW5hbWUgPSBjb25jYXRfZmlsZW5hbWUgKHRhYmxlLCBmaWxlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIGNvbHVtbiA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX25lZ2F0ZV9zdG10OgotCSAgICAgIGlzX3N0bXQgPSAoIWlzX3N0bXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19zZXRfYmFzaWNfYmxvY2s6Ci0JICAgICAgYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JICAgICAgYWRkcmVzcyArPSBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aAotCQkgICAgICAqICgoMjU1IC0gbGgub3Bjb2RlX2Jhc2UpIC8gbGgubGluZV9yYW5nZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGM6Ci0JICAgICAgYWRkcmVzcyArPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLQkgICAgICBsaW5lX3B0ciArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgkJLyogc3BlY2lhbCBvcGVyYW5kICovCi0JICAgICAgYWRqX29wY29kZSA9IG9wX2NvZGUgLSBsaC5vcGNvZGVfYmFzZTsKLQkgICAgICBhZGRyZXNzICs9IChhZGpfb3Bjb2RlIC8gbGgubGluZV9yYW5nZSkKLQkJKiBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKLQkgICAgICBsaW5lICs9IGxoLmxpbmVfYmFzZSArIChhZGpfb3Bjb2RlICUgbGgubGluZV9yYW5nZSk7Ci0JICAgICAgLyogYXBwZW5kIHJvdyB0byBtYXRyaXggdXNpbmcgY3VycmVudCB2YWx1ZXMgKi8KLQkgICAgICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgMCk7Ci0JICAgICAgYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGlmIChuZWVkX2xvd19wYykKLQkJewotCQkgIG5lZWRfbG93X3BjID0gMDsKLQkJICBsb3dfcGMgPSBhZGRyZXNzOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0YWJsZTsKLX0KLQotCi0vKiBJZiBBRERSIGlzIHdpdGhpbiBUQUJMRSBzZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHJ1ZSwKLSAgIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuICBUaGUgb3V0cHV0IHBhcmFtZXRlcnMsIEZJTEVOQU1FX1BUUiBhbmQKLSAgIExJTkVOVU1CRVJfUFRSLCBhcmUgcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMgdG8gYmUgZmlsbGVkIGluLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlICh0YWJsZSwgCi0JCQkJICAgYWRkciwKLQkJCQkgICBmaWxlbmFtZV9wdHIsIAotCQkJCSAgIGxpbmVudW1iZXJfcHRyKQotICAgICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBzdHJ1Y3QgbGluZV9pbmZvKiBuZXh0X2xpbmUgPSB0YWJsZS0+bGFzdF9saW5lOwotICBzdHJ1Y3QgbGluZV9pbmZvKiBlYWNoX2xpbmU7Ci0gIAotICBpZiAoIW5leHRfbGluZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWFjaF9saW5lID0gbmV4dF9saW5lLT5wcmV2X2xpbmU7Ci0KLSAgd2hpbGUgKGVhY2hfbGluZSAmJiBuZXh0X2xpbmUpCi0gICAgewotICAgICAgaWYgKCFlYWNoX2xpbmUtPmVuZF9zZXF1ZW5jZQotCSAgJiYgYWRkciA+PSBlYWNoX2xpbmUtPmFkZHJlc3MgJiYgYWRkciA8IG5leHRfbGluZS0+YWRkcmVzcykKLQl7Ci0JICAqZmlsZW5hbWVfcHRyID0gZWFjaF9saW5lLT5maWxlbmFtZTsKLQkgICpsaW5lbnVtYmVyX3B0ciA9IGVhY2hfbGluZS0+bGluZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIG5leHRfbGluZSA9IGVhY2hfbGluZTsKLSAgICAgIGVhY2hfbGluZSA9IGVhY2hfbGluZS0+cHJldl9saW5lOwotICAgIH0KLSAgCi0gIHJldHVybiBmYWxzZTsKLX0KLSAgCi0KLQotCi0vKiBGdW5jdGlvbiB0YWJsZSBmdW5jdGlvbnMuICovCi0KLXN0cnVjdCBmdW5jaW5mbyB7Ci0gIHN0cnVjdCBmdW5jaW5mbyAqcHJldl9mdW5jOwotCi0gIGNoYXIqIG5hbWU7Ci0gIGJmZF92bWEgbG93OwotICBiZmRfdm1hIGhpZ2g7Ci19OwotCi0KLS8qIElmIEFERFIgaXMgd2l0aGluIFRBQkxFLCBzZXQgRlVOQ1RJT05OQU1FX1BUUiwgYW5kIHJldHVybiB0cnVlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUgKHRhYmxlLCAKLQkJCQkgIGFkZHIsCi0JCQkJICBmdW5jdGlvbm5hbWVfcHRyKQotICAgICBzdHJ1Y3QgZnVuY2luZm8qIHRhYmxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotewotICBzdHJ1Y3QgZnVuY2luZm8qIGVhY2hfZnVuYzsKLQotICBmb3IgKGVhY2hfZnVuYyA9IHRhYmxlOwotICAgICAgIGVhY2hfZnVuYzsKLSAgICAgICBlYWNoX2Z1bmMgPSBlYWNoX2Z1bmMtPnByZXZfZnVuYykKLSAgICB7Ci0gICAgICBpZiAoYWRkciA+PSBlYWNoX2Z1bmMtPmxvdyAmJiBhZGRyIDwgZWFjaF9mdW5jLT5oaWdoKQotCXsKLQkgICpmdW5jdGlvbm5hbWVfcHRyID0gZWFjaF9mdW5jLT5uYW1lOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLQotLyogRFdBUkYyIENvbXBpbGF0aW9uIHVuaXQgZnVuY3Rpb25zLiAqLwotCi0KLS8qIFNjYW4gb3ZlciBlYWNoIGRpZSBpbiBhIGNvbXAuIHVuaXQgbG9va2luZyBmb3IgZnVuY3Rpb25zIHRvIGFkZAotICAgdG8gdGhlIGZ1bmN0aW9uIHRhYmxlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQgKnVuaXQ7Ci17Ci0gIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7Ci0gIGNoYXIgKmluZm9fcHRyID0gdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0cjsKLSAgaW50IG5lc3RpbmdfbGV2ZWwgPSAxOwotCi0gIHdoaWxlIChuZXN0aW5nX2xldmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBpOwotICAgICAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0gICAgICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0gICAgICBzdHJ1Y3QgZnVuY2luZm8gKmZ1bmM7Ci0gICAgICBjaGFyKiBuYW1lID0gMDsKLQotICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgaWYgKCEgYWJicmV2X251bWJlcikKLQl7Ci0JICBuZXN0aW5nX2xldmVsLS07Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAKLSAgICAgIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsdW5pdC0+YWJicmV2cyk7Ci0gICAgICBpZiAoISBhYmJyZXYpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwgCi0JCQkgICAgIGFiYnJldl9udW1iZXIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgCi0gICAgICBpZiAoYWJicmV2LT50YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCi0JewotCSAgZnVuYyA9IChzdHJ1Y3QgZnVuY2luZm8qKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBmdW5jaW5mbykpOwotCSAgZnVuYy0+cHJldl9mdW5jID0gdW5pdC0+ZnVuY3Rpb25fdGFibGU7Ci0JICB1bml0LT5mdW5jdGlvbl90YWJsZSA9IGZ1bmM7Ci0JfQotICAgICAgZWxzZQotCWZ1bmMgPSBOVUxMOwotICAKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmJyZXYtPm51bV9hdHRyczsgKytpKQotCXsKLQkgIGluZm9fcHRyID0gcmVhZF9hdHRyaWJ1dGUgKCZhdHRyLCAmYWJicmV2LT5hdHRyc1tpXSwgdW5pdCwgaW5mb19wdHIpOwotCSAgCi0JICBpZiAoZnVuYykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCQl7Ci0JCWNhc2UgRFdfQVRfbmFtZToKLQkJICAKLQkJICBuYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0KLQkJICAvKiBQcmVmZXIgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgb3ZlciBEV19BVF9uYW1lLiAgKi8KLQkJICBpZiAoZnVuYy0+bmFtZSA9PSBOVUxMKQotCQkgICAgZnVuYy0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOgotCQkgIGZ1bmMtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0FUX2xvd19wYzoKLQkJICBmdW5jLT5sb3cgPSBEV19BRERSICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19BVF9oaWdoX3BjOgotCQkgIGZ1bmMtPmhpZ2ggPSBEV19BRERSICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQkJewotCQljYXNlIERXX0FUX25hbWU6Ci0JCSAgbmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCQkgIGJyZWFrOwotCQkgIAotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChhYmJyZXYtPmhhc19jaGlsZHJlbikKLQluZXN0aW5nX2xldmVsKys7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQotCi0KLQotLyogUGFyc2UgYSBEV0FSRjIgY29tcGlsYXRpb24gdW5pdCBzdGFydGluZyBhdCBJTkZPX1BUUi4gIFRoaXMKLSAgIGluY2x1ZGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGhlYWRlciB0aGF0IHByb2NlZWRzIHRoZSBESUUncywgYnV0Ci0gICBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsZW5ndGggZmllbGQgdGhhdCBwcmVjZWVkcyBlYWNoIGNvbXBpbGF0aW9uCi0gICB1bml0IGhlYWRlci4gIEVORF9QVFIgcG9pbnRzIG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhpcyBjb21wIHVuaXQuCi0gICBJZiBBQkJSRVZfTEVOR1RIIGlzIDAsIHRoZW4gdGhlIGxlbmd0aCBvZiB0aGUgYWJicmV2aWF0aW9uIG9mZnNldAotICAgaXMgYXNzdW1lZCB0byBiZSBmb3VyIGJ5dGVzLiAgT3RoZXJ3aXNlLCBpdCBpdCBpcyB0aGUgc2l6ZSBnaXZlbi4KLQotICAgVGhpcyByb3V0aW5lIGRvZXMgbm90IHJlYWQgdGhlIHdob2xlIGNvbXBpbGF0aW9uIHVuaXQ7IG9ubHkgZW5vdWdoCi0gICB0byBnZXQgdG8gdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgY29tcF91bml0ICoKLXBhcnNlX2NvbXBfdW5pdCAoYWJmZCwgaW5mb19wdHIsIGVuZF9wdHIsIGFiYnJldl9sZW5ndGgpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgY2hhciogaW5mb19wdHI7Ci0gICAgIGNoYXIqIGVuZF9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCBhYmJyZXZfbGVuZ3RoOwotewotICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotCi0gIHVuc2lnbmVkIHNob3J0IHZlcnNpb247Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfb2Zmc2V0ID0gMDsKLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7Ci0KLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0KLSAgdmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSAyOwotICBCRkRfQVNTRVJUIChhYmJyZXZfbGVuZ3RoID09IDAKLQkgICAgICB8fCBhYmJyZXZfbGVuZ3RoID09IDQKLQkgICAgICB8fCBhYmJyZXZfbGVuZ3RoID09IDgpOwotICBpZiAoYWJicmV2X2xlbmd0aCA9PSAwIHx8IGFiYnJldl9sZW5ndGggPT0gNCkKLSAgICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGVsc2UgaWYgKGFiYnJldl9sZW5ndGggPT0gOCkKLSAgICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IGFiYnJldl9sZW5ndGg7Ci0gIGFkZHJfc2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDE7Ci0KLSAgaWYgKHZlcnNpb24gIT0gMikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyIGluZm9ybWF0aW9uLiIpLCB2ZXJzaW9uICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplID4gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgZ3JlYXRlciB0aGFuICcldScuIiksCi0JCQkgYWRkcl9zaXplLAotCQkJIHNpemVvZiAoYmZkX3ZtYSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFkZHJfc2l6ZSAhPSAyICYmIGFkZHJfc2l6ZSAhPSA0ICYmIGFkZHJfc2l6ZSAhPSA4KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG9ubHkgaGFuZGxlIGFkZHJlc3Mgc2l6ZXMgJzInLCAnNCcgYW5kICc4Jy4iLCBhZGRyX3NpemUgKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGFiYnJldnMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpbnRvIGEgdGFibGUgKi8KLSAgYWJicmV2cyA9IHJlYWRfYWJicmV2cyAoYWJmZCwgYWJicmV2X29mZnNldCk7Ci0gIGlmICghIGFiYnJldnMpCi0gICAgICByZXR1cm4gMDsKLQotICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gIGlmICghIGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQmFkIGFiYnJldiBudW1iZXI6ICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlciwgYWJicmV2cyk7Ci0gIGlmICghIGFiYnJldikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICB1bml0ID0gKHN0cnVjdCBjb21wX3VuaXQqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb21wX3VuaXQpKTsKLSAgdW5pdC0+YWJmZCA9IGFiZmQ7Ci0gIHVuaXQtPmFkZHJfc2l6ZSA9IGFkZHJfc2l6ZTsgCi0gIHVuaXQtPmFiYnJldnMgPSBhYmJyZXZzOwotICB1bml0LT5lbmRfcHRyID0gZW5kX3B0cjsKLQotICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKLSAgICB7Ci0gICAgICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIHVuaXQsIGluZm9fcHRyKTsKLQotICAgICAgLyogU3RvcmUgdGhlIGRhdGEgaWYgaXQgaXMgb2YgYW4gYXR0cmlidXRlIHdlIHdhbnQgdG8ga2VlcCBpbiBhCi0JIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCXsKLQljYXNlIERXX0FUX3N0bXRfbGlzdDoKLQkgIHVuaXQtPnN0bXRsaXN0ID0gMTsKLQkgIHVuaXQtPmxpbmVfb2Zmc2V0ID0gRFdfVU5TTkQgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9uYW1lOgotCSAgdW5pdC0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2xvd19wYzoKLQkgIHVuaXQtPmFyYW5nZS5sb3cgPSBEV19BRERSICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkgIHVuaXQtPmFyYW5nZS5oaWdoID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2NvbXBfZGlyOgotCSAgewotCSAgICBjaGFyKiBjb21wX2RpciA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgICBpZiAoY29tcF9kaXIpCi0JICAgICAgewotCQkvKiBJcml4IDYuMiBuYXRpdmUgY2MgcHJlcGVuZHMgPG1hY2hpbmU+LjogdG8gdGhlIGNvbXBpbGF0aW9uCi0JCSAgIGRpcmVjdG9yeSwgZ2V0IHJpZCBvZiBpdC4gICovCi0JCWNoYXIgKmNwID0gKGNoYXIqKSBzdHJjaHIgKGNvbXBfZGlyLCAnOicpOwotCi0JCWlmIChjcCAmJiBjcCAhPSBjb21wX2RpciAmJiBjcFstMV0gPT0gJy4nICYmIGNwWzFdID09ICcvJykKLQkJICBjb21wX2RpciA9IGNwICsgMTsKLQkgICAgICB9Ci0JICAgIHVuaXQtPmNvbXBfZGlyID0gY29tcF9kaXI7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0ciA9IGluZm9fcHRyOwotICByZXR1cm4gdW5pdDsKLX0KLQotCi0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBVTklUIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IEFERFIuICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAodW5pdCwgYWRkcikKLSAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgaWYgKHVuaXQtPmVycm9yKQotICAgIHJldHVybiAwOwotCi0gIGFyYW5nZSA9ICZ1bml0LT5hcmFuZ2U7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gYXJhbmdlLT5sb3cgJiYgYWRkciA8IGFyYW5nZS0+aGlnaCkKLQlyZXR1cm4gMTsKLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBJZiBVTklUIGNvbnRhaW5zIEFERFIsIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgdG8gdGhlIHZhbHVlcyBmb3IKLSAgIHRoZSBsaW5lIGNvbnRhaW5pbmcgQUREUi4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSLAotICAgRlVOQ1RJT05OQU1FX1BUUiwgYW5kIExJTkVOVU1CRVJfUFRSLCBhcmUgcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMKLSAgIHRvIGJlIGZpbGxlZCBpbi4gIAotCi0gICBSZXR1cm4gdHJ1ZSBvZiBVTklUIGNvbnRhaW5zIEFERFIsIGFuZCBubyBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZDsKLSAgIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHVuaXQsIGFkZHIsCi0JCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGJvb2xlYW4gbGluZV9wOwotICBib29sZWFuIGZ1bmNfcDsKLSAgCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISB1bml0LT5zdG10bGlzdCkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAKLSAgICAgIHVuaXQtPmxpbmVfdGFibGUgPSBkZWNvZGVfbGluZV9pbmZvICh1bml0KTsKLQotICAgICAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgCi0gICAgICBpZiAoISBzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgbGluZV9wID0gbG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlICh1bml0LT5saW5lX3RhYmxlLAotCQkJCQkgICAgICBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gIGZ1bmNfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlICh1bml0LT5mdW5jdGlvbl90YWJsZSwgCi0JCQkJCSAgICAgYWRkciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyKTsKLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLS8qIFRoZSBEV0FSRjIgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4gIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lCi0gICBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAgQUREUl9TSVpFIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICBpbml0aWFsIC5kZWJ1Z19pbmZvIGxlbmd0aCBmaWVsZCBhbmQgaW4gdGhlIGFiYnJldmlhdGlvbiBvZmZzZXQuCi0gICBZb3UgbWF5IHVzZSB6ZXJvIHRvIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlCi0gICB1c2VkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgICAgICAgbGluZW51bWJlcl9wdHIsCi0JCQkgICAgICAgYWRkcl9zaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyX3NpemU7Ci17Ci0gIC8qIFJlYWQgZWFjaCBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHNlY3Rpb24gLmRlYnVnX2luZm8sIGFuZCBjaGVjawotICAgICB0byBzZWUgaWYgaXQgY29udGFpbnMgdGhlIGFkZHJlc3Mgd2UgYXJlIHNlYXJjaGluZyBmb3IuICBJZiB5ZXMsCi0gICAgIGxvb2t1cCB0aGUgYWRkcmVzcywgYW5kIHJldHVybiB0aGUgbGluZSBudW1iZXIgaW5mby4gIElmIG5vLCBnbwotICAgICBvbiB0byB0aGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgCi0KLSAgICAgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMsIGFuZAotICAgICBhIHBvaW50ZXIgdG8gdGhlIG5leHQgdW4tcmVhZCBjb21waWxhdGlvbiB1bml0LiAgQ2hlY2sgdGhlIAotICAgICBwcmV2aW91c2x5IHJlYWQgdW5pdHMgYmVmb3JlIHJlYWRpbmcgbW9yZS4KLSAgICAgKi8KLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGF0IGFkZHJlc3MgYXJlIHdlIGxvb2tpbmcgZm9yPyAqLwotICBiZmRfdm1hIGFkZHIgPSBvZmZzZXQgKyBzZWN0aW9uLT52bWE7Ci0KLSAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0KLSAgLyogVGhlIERXQVJGMiBzcGVjIHNheXMgdGhhdCB0aGUgaW5pdGlhbCBsZW5ndGggZmllbGQsIGFuZCB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBhYmJyZXZpYXRpb24gdGFibGUsIHNob3VsZCBib3RoIGJlIDQtYnl0ZSB2YWx1ZXMuCi0gICAgIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIGRvIHRoaW5ncyBkaWZmZXJlbnRseS4gICovCi0gIGlmIChhZGRyX3NpemUgPT0gMCkKLSAgICBhZGRyX3NpemUgPSA0OwotICBCRkRfQVNTRVJUIChhZGRyX3NpemUgPT0gNCB8fCBhZGRyX3NpemUgPT0gOCk7Ci0gICAgCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjJfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjJfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfaW5mbyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjIgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IG1zZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGlmIChzaXplID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBzdGFzaC0+aW5mb19wdHIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIHN0YXNoLT5pbmZvX3B0ciwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmluZm9fcHRyID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5pbmZvX3B0cl9lbmQgPSBzdGFzaC0+aW5mb19wdHIgKyBzaXplOwotCi0gICAgICAvKiBGSVhNRTogVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQotCSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgVGhlICdsb3cnIGFuZCAnaGlnaCcgYWRkcmVzc2VzIG9mIHRoZQotCSBjb21wX3VuaXRzIGFyZSBjb21wdXRlZCBieSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGluIHRoZQotCSAudGV4dCBzZWdtZW50LiAgV2UgbmVlZCB0aGVzZSBhZGRyZXNzZXMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCi0JIHRoZSBuZWFyZXN0IGxpbmUgbnVtYmVyLCBhbmQgc28gd2UgaGF2ZSB0byByZXNvbHZlIHRoZQotCSByZWxvY3MuICBUaGVyZSBpcyBhIHNpbWlsYXIgcHJvYmxlbSB3aGVuIHRoZSAuZGVidWdfbGluZQotCSBzZWN0aW9uIGlzIHByb2Nlc3NlZCBhcyB3ZWxsIChlLmcuLCB0aGVyZSBtYXkgYmUgcmVsb2NzCi0JIGFnYWluc3QgdGhlIG9wZXJhbmQgb2YgdGhlIERXX0xORV9zZXRfYWRkcmVzcyBvcGVyYXRvcikuCi0JIAotCSBVbmZvcnR1bmF0ZWx5IGdldHRpbmcgaG9sZCBvZiB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaXMgaGFyZC4uLgotCi0JIEZvciBub3csIHRoaXMgbWVhbnMgdGhhdCBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyAoYXMKLQkgb3Bwb3NlZCB0byBmdWxseSBleGVjdXRhYmxlcykgZG9lcyBub3QgYWx3YXlzIHdvcmsgYXMgd2VsbCBhcwotCSB3ZSB3b3VsZCBsaWtlLiAgKi8KLSAgICB9Ci0gIAotICAvKiBBIG51bGwgaW5mb19wdHIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gZHdhcmYyIGluZm8gCi0gICAgIChvciB0aGF0IGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgc3Rhc2gpLiAqLwotCi0gIGlmICghIHN0YXNoLT5pbmZvX3B0cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2hlY2sgdGhlIHByZXZpb3VzbHkgcmVhZCBjb21wLiB1bml0cyBmaXJzdC4gKi8KLQotICBmb3IgKGVhY2ggPSBzdGFzaC0+YWxsX2NvbXBfdW5pdHM7IGVhY2g7IGVhY2ggPSBlYWNoLT5uZXh0X3VuaXQpCi0gICAgaWYgKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzIChlYWNoLCBhZGRyKSkKLSAgICAgIHJldHVybiBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpOwotCi0gIC8qIFJlYWQgZWFjaCByZW1haW5pbmcgY29tcC4gdW5pdHMgY2hlY2tpbmcgZWFjaCBhcyB0aGV5IGFyZSByZWFkLiAqLwotICB3aGlsZSAoc3Rhc2gtPmluZm9fcHRyIDwgc3Rhc2gtPmluZm9fcHRyX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29tcF91bml0KiBlYWNoOwotICAgICAgYmZkX3ZtYSBsZW5ndGg7Ci0gICAgICBib29sZWFuIGZvdW5kOwotCi0gICAgICBpZiAoYWRkcl9zaXplID09IDQpCi0JbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBzdGFzaC0+aW5mb19wdHIpOwotICAgICAgZWxzZQotCWxlbmd0aCA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyKTsKLSAgICAgIHN0YXNoLT5pbmZvX3B0ciArPSBhZGRyX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICB7Ci0JICBlYWNoID0gcGFyc2VfY29tcF91bml0IChhYmZkLCBzdGFzaC0+aW5mb19wdHIsIAotCQkJCSAgc3Rhc2gtPmluZm9fcHRyICsgbGVuZ3RoLAotCQkJCSAgYWRkcl9zaXplKTsKLQkgIHN0YXNoLT5pbmZvX3B0ciArPSBsZW5ndGg7Ci0KLQkgIGlmIChlYWNoKQotCSAgICB7Ci0JICAgICAgZWFjaC0+bmV4dF91bml0ID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOwotCSAgICAgIHN0YXNoLT5hbGxfY29tcF91bml0cyA9IGVhY2g7Ci0KLQkgICAgICAvKiBEV19BVF9sb3dfcGMgYW5kIERXX0FUX2hpZ2hfcGMgYXJlIG9wdGlvbmFsIGZvcgotCQkgY29tcGlsYXRpb24gdW5pdHMuICBJZiB3ZSBkb24ndCBoYXZlIHRoZW0gKGkuZS4sCi0JCSB1bml0LT5oaWdoID09IDApLCB3ZSBuZWVkIHRvIGNvbnN1bHQgdGhlIGxpbmUgaW5mbwotCQkgdGFibGUgdG8gc2VlIGlmIGEgY29tcGlsYXRpb24gdW5pdCBjb250YWlucyB0aGUgZ2l2ZW4KLQkJIGFkZHJlc3MuICovCi0JICAgICAgaWYgKGVhY2gtPmFyYW5nZS5oaWdoID4gMCkKLQkJewotCQkgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0JCSAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLAotCQkJCQkJICAgICAgIGZpbGVuYW1lX3B0ciwKLQkJCQkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkJICAgICAgIGxpbmVudW1iZXJfcHRyKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZvdW5kID0gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLAotCQkJCQkJICAgICAgIGZpbGVuYW1lX3B0ciwKLQkJCQkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkJICAgICAgIGxpbmVudW1iZXJfcHRyKTsKLQkJICBpZiAoZm91bmQpCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9iZmQvZWNvZmYuYyBiL2JmZC9lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEzNmVlLi4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0OSArMCwwIEBACi0vKiBHZW5lcmljIEVDT0ZGIChFeHRlbmRlZC1DT0ZGKSByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgT3JpZ2luYWwgdmVyc2lvbiBieSBQZXIgQm90aG5lci4KLSAgIEZ1bGwgc3VwcG9ydCBhZGRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotLyogRklYTUU6IFdlIG5lZWQgdGhlIGRlZmluaXRpb25zIG9mIE5fU0VUW0FEVEJdLCBidXQgYW91dDY0LmggZGVmaW5lcwotICAgc29tZSBvdGhlciBzdHVmZiB3aGljaCB3ZSBkb24ndCB3YW50IGFuZCB3aGljaCBjb25mbGljdHMgd2l0aCBzdHVmZgotICAgd2UgZG8gd2FudC4gICovCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jdW5kZWYgTl9BQlMKLSN1bmRlZiBleGVjX2hkcgotI3VuZGVmIG9ial9zeW1fZmlsZXBvcwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50IGVjb2ZmX2dldF9tYWdpYyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgZmxhZ3dvcmQgZmxhZ3MpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKmFiZmQsIFNZTVIgKmVjb2ZmX3N5bSwKLQkJCQkJICAgYXN5bWJvbCAqYXN5bSwgaW50IGV4dCwgaW50IHdlYWspKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX2VtaXRfYWdncmVnYXRlIFBBUkFNUyAoKGJmZCAqYWJmZCwgRkRSICpmZHIsCi0JCQkJCSAgY2hhciAqc3RyaW5nLAotCQkJCQkgIFJORFhSICpybmR4LCBsb25nIGlzeW0sCi0JCQkJCSAgY29uc3QgY2hhciAqd2hpY2gpKTsKLXN0YXRpYyBjaGFyICplY29mZl90eXBlX3RvX3N0cmluZyBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgaW5keCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCWFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgaW50IGVjb2ZmX3NvcnRfaGRycyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJmZF9zaXplX3R5cGUgZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zZXRfaW5kZXggUEFSQU1TICgoYXN5bWJvbCAqLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGVjb2ZmX2FybWFwX2hhc2ggUEFSQU1TICgoQ09OU1QgY2hhciAqcywKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICpyZWhhc2gsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgaGxvZykpOwotDAotLyogVGhpcyBzdHVmZiBpcyBzb21ld2hhdCBjb3BpZWQgZnJvbSBjb2ZmY29kZS5oLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uIGJmZF9kZWJ1Z19zZWN0aW9uID0KLXsKLSAgLyogbmFtZSwgICBpbmRleCwgbmV4dCwgZmxhZ3MsIHNldF92bWEsIHJlbG9jX2RvbmUsIGxpbmtlcl9tYXJrLCBnY19tYXJrICovCi0gICIqREVCVUcqIiwgMCwgICAgIDAsICAgIDAsICAgICAwLCAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAgMCwKLSAgLyogdm1hLCBsbWEsIF9jb29rZWRfc2l6ZSwgX3Jhd19zaXplLCBvdXRwdXRfb2Zmc2V0LCBvdXRwdXRfc2VjdGlvbiwgKi8KLSAgMCwgICAgICAwLCAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAwLCAgICAgICAgICAgICBOVUxMLAotICAvKiBhbGlnLCByZWxvYy4uLiwgb3JlbC4uLiwgcmVsb2NfY291bnQsIGZpbGVwb3MsIHJlbF8uLi4sIGxpbmVfLi4uICovCi0gIDAsICAgICAgIDAsICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgMCwgICAgICAgMCwgCSAgIDAsCi0gIC8qIHVzZXJkYXRhLCBjb250ZW50cywgbGluZW5vLCBsaW5lbm9fY291bnQgKi8KLSAgMCwgICAgICAgICAgIDAsICAgICAgICAwLCAgICAgIDAsCi0gIC8qIGNvbWRhdF9pbmZvLCBtb3ZpbmdfbGluZV9maWxlcG9zLCB0YXJnZXRfaW5kZXgsIHVzZWRfYnlfYmZkLCAgKi8KLSAgTlVMTCwgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwKLSAgLyogY29ucywgb3duZXIsIHN5bWJvbCAqLwotICAwLCAgICAgICAwLCAgICAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikgTlVMTCwKLSAgLyogc3ltYm9sX3B0cl9wdHIsICAgICAgICAgICAgICAgICAgIGxpbmtfb3JkZXJfaGVhZCwgLi4uX3RhaWwgKi8KLSAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopIE5VTEwsIE5VTEwsICAgICAgICAgICAgTlVMTAotfTsKLQotLyogQ3JlYXRlIGFuIEVDT0ZGIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+dGRhdGEuZWNvZmZfb2JqX2RhdGEgPSAoKHN0cnVjdCBlY29mZl90ZGF0YSAqKQotCQkJCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoZWNvZmZfZGF0YV90eXBlKSkpOwotICBpZiAoYWJmZC0+dGRhdGEuZWNvZmZfb2JqX2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSBob29rIGNhbGxlZCBieSBjb2ZmX3JlYWxfb2JqZWN0X3AgdG8gY3JlYXRlIGFueSBiYWNrZW5kCi0gICBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotX2JmZF9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2EgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgYW91dGhkcjsKLSAgZWNvZmZfZGF0YV90eXBlICplY29mZjsKLQotICBpZiAoX2JmZF9lY29mZl9ta29iamVjdCAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZWNvZmYgPSBlY29mZl9kYXRhIChhYmZkKTsKLSAgZWNvZmYtPmdwX3NpemUgPSA4OwotICBlY29mZi0+c3ltX2ZpbGVwb3MgPSBpbnRlcm5hbF9mLT5mX3N5bXB0cjsKLQotICBpZiAoaW50ZXJuYWxfYSAhPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZWNvZmYtPnRleHRfc3RhcnQgPSBpbnRlcm5hbF9hLT50ZXh0X3N0YXJ0OwotICAgICAgZWNvZmYtPnRleHRfZW5kID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydCArIGludGVybmFsX2EtPnRzaXplOwotICAgICAgZWNvZmYtPmdwID0gaW50ZXJuYWxfYS0+Z3BfdmFsdWU7Ci0gICAgICBlY29mZi0+Z3BybWFzayA9IGludGVybmFsX2EtPmdwcm1hc2s7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCWVjb2ZmLT5jcHJtYXNrW2ldID0gaW50ZXJuYWxfYS0+Y3BybWFza1tpXTsKLSAgICAgIGVjb2ZmLT5mcHJtYXNrID0gaW50ZXJuYWxfYS0+ZnBybWFzazsKLSAgICAgIGlmIChpbnRlcm5hbF9hLT5tYWdpYyA9PSBFQ09GRl9BT1VUX1pNQUdJQykKLQlhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotICAgICAgZWxzZQotCWFiZmQtPmZsYWdzICY9fiBEX1BBR0VEOwotICAgIH0KLQotICAvKiBJdCB0dXJucyBvdXQgdGhhdCBubyBzcGVjaWFsIGFjdGlvbiBpcyByZXF1aXJlZCBieSB0aGUgTUlQUyBvcgotICAgICBBbHBoYSBFQ09GRiBiYWNrZW5kcy4gIFRoZXkgaGF2ZSBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhlCi0gICAgIGEub3V0IGhlYWRlciwgYnV0IHdlIGp1c3QgY29weSBpdCBhbGwgKGUuZy4sIGdwcm1hc2ssIGNwcm1hc2sgYW5kCi0gICAgIGZwcm1hc2spIGFuZCBsZXQgdGhlIHN3YXBwaW5nIHJvdXRpbmVzIGVuc3VyZSB0aGF0IG9ubHkgcmVsZXZhbnQKLSAgICAgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBvdXQuICAqLwotCi0gIHJldHVybiAoUFRSKSBlY29mZjsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIG5ldyBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDQ7Ci0KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1RFWFQpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0lOSVQpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0ZJTkkpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfREFUQSkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1NEQVRBKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1JEQVRBKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElUOCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJVDQpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9SQ09OU1QpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9QREFUQSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9CU1MpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9TQlNTKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEFuIElyaXggNCBzaGFyZWQgbGliYXJ5LiAgKi8KLSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgIH0KLQotICAvKiBQcm9iYWJseSBhbnkgb3RoZXIgc2VjdGlvbiBuYW1lIGlzIFNFQ19ORVZFUl9MT0FELCBidXQgSSdtCi0gICAgIHVuY2VydGFpbiBhYm91dCAuaW5pdCBvbiBzb21lIHN5c3RlbXMgYW5kIEkgZG9uJ3Qga25vdyBob3cgc2hhcmVkCi0gICAgIGxpYnJhcmllcyB3b3JrLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIHRoZSBnZW5lcmljIENPRkYgcm91dGluZXMuICBJdCBpcyB0aGUgaW52ZXJzZSBvZiBlY29mZl9nZXRfbWFnaWMsCi0gICBiZWxvdy4gIFRoaXMgY291bGQgYmUgYW4gRUNPRkYgYmFja2VuZCByb3V0aW5lLCB3aXRoIG9uZSB2ZXJzaW9uCi0gICBmb3IgZWFjaCB0YXJnZXQsIGJ1dCB0aGVyZSBhcmVuJ3QgYWxsIHRoYXQgbWFueSBFQ09GRiB0YXJnZXRzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0KLSAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX21hZ2ljKQotICAgIHsKLSAgICBjYXNlIE1JUFNfTUFHSUNfMToKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSAzMDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMjoKLSAgICAgIC8qIE1JUFMgSVNBIGxldmVsIDI6IHRoZSByNjAwMCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTM6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6Ci0gICAgICAvKiBNSVBTIElTQSBsZXZlbCAzOiB0aGUgcjQwMDAgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDQwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYWxwaGE7Ci0gICAgICBtYWNoID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgbWFjaCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpOwotfQotCi0vKiBHZXQgdGhlIG1hZ2ljIG51bWJlciB0byB1c2UgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4KLSAgIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGFib3ZlLiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfZ2V0X21hZ2ljIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBiaWcsIGxpdHRsZTsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6Ci0JY2FzZSAzMDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUc7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTsKLQkgIGJyZWFrOwotCi0JY2FzZSA2MDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUcyOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEUyOwotCSAgYnJlYWs7Ci0KLQljYXNlIDQwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzM7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTM7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHJldHVybiBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBiaWcgOiBsaXR0bGU7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgcmV0dXJuIEFMUEhBX01BR0lDOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gc19mbGFncyB0byB1c2UgZm9yIGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBsb25nCi1lY29mZl9zZWNfdG9fc3R5cF9mbGFncyAobmFtZSwgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBsb25nIHN0eXA7Ci0KLSAgc3R5cCA9IDA7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfVEVYVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9TREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkRBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUOCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVQ4OwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQ0KSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVDQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9CU1M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NCU1MpID09IDApCi0gICAgc3R5cCA9IFNUWVBfU0JTUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9JTklUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9GSU5JKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0ZJTkk7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1BEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1BEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9YREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0xJQjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfR09UKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0dPVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSEFTSCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9IQVNIOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5BTUlDKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTkFNSUM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQkxJU1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElCTElTVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkVMRFlOKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JFTERZTjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQ09ORkxJQykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9DT05GTElDOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5TVFIpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOU1RSOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EWU5TWU0pID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOU1lNOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9DT01NRU5UKSA9PSAwKQotICAgIHsKLSAgICAgIHN0eXAgPSBTVFlQX0NPTU1FTlQ7Ci0gICAgICBmbGFncyAmPX4gU0VDX05FVkVSX0xPQUQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SQ09OU1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkNPTlNUOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19DT0RFKSAKLSAgICBzdHlwID0gU1RZUF9URVhUOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19EQVRBKSAKLSAgICBzdHlwID0gU1RZUF9EQVRBOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19SRUFET05MWSkKLSAgICBzdHlwID0gU1RZUF9SREFUQTsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfTE9BRCkKLSAgICBzdHlwID0gU1RZUF9SRUc7Ci0gIGVsc2UKLSAgICBzdHlwID0gU1RZUF9CU1M7Ci0KLSAgaWYgKGZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0gICAgc3R5cCB8PSBTVFlQX05PTE9BRDsKLQotICByZXR1cm4gc3R5cDsKLX0KLQotLyogR2V0IHRoZSBCRkQgZmxhZ3MgdG8gdXNlIGZvciBhIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLWZsYWd3b3JkCi1fYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzIChhYmZkLCBoZHIsIG5hbWUsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncz0wOwotCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotCi0gIC8qIEZvciAzODYgQ09GRiwgYXQgbGVhc3QsIGFuIHVubG9hZGFibGUgdGV4dCBvciBkYXRhIHNlY3Rpb24gaXMKLSAgICAgYWN0dWFsbHkgYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgKi8KLSAgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9URVhUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0lOSVQpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRUNPRkZfRklOSSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9EWU5BTUlDKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0xJQkxJU1QpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkVMRFlOKQotICAgICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX0NPTkZMSUMKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9EWU5TVFIpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1lNKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0hBU0gpKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9EQVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9SREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfU0RBVEEpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1hEQVRBCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0dPVCkKLQkgICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICAgIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUERBVEEKLQkgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9CU1MpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NCU1MpKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfSU5GTykgfHwgc3R5cF9mbGFncyA9PSBTVFlQX0NPTU1FTlQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVDgpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVDQpKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfRUNPRkZfTElCKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0gICAgfQotCi0gIHJldHVybiBzZWNfZmxhZ3M7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSBzeW1ib2xpYyBoZWFkZXIgZm9yIGFuIEVDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplOwotICBQVFIgcmF3ID0gTlVMTDsKLSAgSERSUiAqaW50ZXJuYWxfc3ltaGRyOwotCi0gIC8qIFNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaXQgaW4uICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLm1hZ2ljID09IAotICAgICAgYmFja2VuZC0+ZGVidWdfc3dhcC5zeW1fbWFnaWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlcmUgaXMgYSBzeW1ib2xpYyBoZWFkZXIuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID09IDApCi0gICAgewotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgaG9sZHMgdGhlIG51bWJlciBvZiBzeW1ib2xzCi0gICAgIGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBoZWFkZXIsIGJ1dCBvbiBFQ09GRiB0aGlzIGlzIGFsd2F5cyB0aGUKLSAgICAgc2l6ZSBvZiB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgSXQgd291bGQgYmUgY2xlYW5lciB0bwotICAgICBoYW5kbGUgdGhpcyB3aGVuIHdlIGZpcnN0IHJlYWQgdGhlIGZpbGUgaW4gY29mZmdlbi5jLiAgKi8KLSAgZXh0ZXJuYWxfaGRyX3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gICovCi0gIHJhdyA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKHJhdyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IChiZmRfcmVhZCAocmF3LCBleHRlcm5hbF9oZHJfc2l6ZSwgMSwgYWJmZCkKLQkgICE9IGV4dGVybmFsX2hkcl9zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaW50ZXJuYWxfc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLSAgKCpiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfaGRyX2luKSAoYWJmZCwgcmF3LCBpbnRlcm5hbF9zeW1oZHIpOwotCi0gIGlmIChpbnRlcm5hbF9zeW1oZHItPm1hZ2ljICE9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAoaW50ZXJuYWxfc3ltaGRyLT5pc3ltTWF4Ci0JCQkgICAgICsgaW50ZXJuYWxfc3ltaGRyLT5pZXh0TWF4KTsKLQotICBpZiAocmF3ICE9IE5VTEwpCi0gICAgZnJlZSAocmF3KTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmF3ICE9IE5VTEwpCi0gICAgZnJlZSAocmF3KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGFuZCBzd2FwIHRoZSBpbXBvcnRhbnQgc3ltYm9saWMgaW5mb3JtYXRpb24gZm9yIGFuIEVDT0ZGCi0gICBvYmplY3QgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IGdkYiB2aWEgdGhlIHJlYWRfZGVidWdfaW5mbyBlbnRyeQotICAgcG9pbnQgaW4gdGhlIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIGlnbm9yZSwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLSAgYmZkX3NpemVfdHlwZSByYXdfYmFzZTsKLSAgYmZkX3NpemVfdHlwZSByYXdfc2l6ZTsKLSAgUFRSIHJhdzsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgY2hhciAqZnJhd19zcmM7Ci0gIGNoYXIgKmZyYXdfZW5kOwotICBzdHJ1Y3QgZmRyICpmZHJfcHRyOwotICBiZmRfc2l6ZV90eXBlIHJhd19lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgY2JfZW5kOwotCi0gIEJGRF9BU1NFUlQgKGRlYnVnID09ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbyk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSd2ZSBhbHJlYWR5IGdvdHRlbiBpdCwgYW5kIHdoZXRoZXIgdGhlcmUncyBhbnkgdG8KLSAgICAgZ2V0LiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5yYXdfc3ltZW50cyAhPSAoUFRSKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID09IDApCi0gICAgewotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludGVybmFsX3N5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgYWxsIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBhdCBvbmNlLiAgKi8KLSAgcmF3X2Jhc2UgPSAoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zCi0JICAgICAgKyBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplKTsKLQotICAvKiBBbHBoYSBlY29mZiBtYWtlcyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiByYXdfc2l6ZSBkaWZmaWN1bHQuIEl0IGhhcwotICAgICBhbiB1bmRvY3VtZW50ZWQgZGVidWcgZGF0YSBzZWN0aW9uIGJldHdlZW4gdGhlIHN5bWhkciBhbmQgdGhlIGZpcnN0Ci0gICAgIGRvY3VtZW50ZWQgc2VjdGlvbi4gQW5kIHRoZSBvcmRlcmluZyBvZiB0aGUgc2VjdGlvbnMgdmFyaWVzIGJldHdlZW4KLSAgICAgc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotICAgICBJZiBiZmQgc3VwcG9ydHMgU0VFS19FTkQgc29tZWRheSwgdGhpcyBjb2RlIGNvdWxkIGJlIHNpbXBsaWZpZWQuICAqLwotCi0gIHJhd19lbmQgPSAwOwotCi0jZGVmaW5lIFVQREFURV9SQVdfRU5EKHN0YXJ0LCBjb3VudCwgc2l6ZSkgXAotICBjYl9lbmQgPSBpbnRlcm5hbF9zeW1oZHItPnN0YXJ0ICsgaW50ZXJuYWxfc3ltaGRyLT5jb3VudCAqIChzaXplKTsgXAotICBpZiAoY2JfZW5kID4gcmF3X2VuZCkgXAotICAgIHJhd19lbmQgPSBjYl9lbmQKLQotICBVUERBVEVfUkFXX0VORCAoY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JEbk9mZnNldCwgaWRuTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Rucl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiUGRPZmZzZXQsIGlwZE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlN5bU9mZnNldCwgaXN5bU1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYk9wdE9mZnNldCwgaW9wdE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRmRPZmZzZXQsIGlmZE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlJmZE9mZnNldCwgY3JmZCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkV4dE9mZnNldCwgaWV4dE1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZSk7Ci0KLSN1bmRlZiBVUERBVEVfUkFXX0VORAotCi0gIHJhd19zaXplID0gcmF3X2VuZCAtIHJhd19iYXNlOwotICBpZiAocmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPSAwOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByYXcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJhd19zaXplKTsKLSAgaWYgKHJhdyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkoZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zCi0JCSArIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemUpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHJhdywgcmF3X3NpemUsIDEsIGFiZmQpICE9IHJhd19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByYXcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmF3X3N5bWVudHMgPSByYXc7Ci0KLSAgLyogR2V0IHBvaW50ZXJzIGZvciB0aGUgbnVtZXJpYyBvZmZzZXRzIGluIHRoZSBIRFJSIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEZJWChvZmYxLCBvZmYyLCB0eXBlKSBcCi0gIGlmIChpbnRlcm5hbF9zeW1oZHItPm9mZjEgPT0gMCkgXAotICAgIGRlYnVnLT5vZmYyID0gKHR5cGUpIE5VTEw7IFwKLSAgZWxzZSBcCi0gICAgZGVidWctPm9mZjIgPSAodHlwZSkgKChjaGFyICopIHJhdyBcCi0JCQkgICsgKGludGVybmFsX3N5bWhkci0+b2ZmMSBcCi0JCQkgICAgIC0gcmF3X2Jhc2UpKQotICBGSVggKGNiTGluZU9mZnNldCwgbGluZSwgdW5zaWduZWQgY2hhciAqKTsKLSAgRklYIChjYkRuT2Zmc2V0LCBleHRlcm5hbF9kbnIsIFBUUik7Ci0gIEZJWCAoY2JQZE9mZnNldCwgZXh0ZXJuYWxfcGRyLCBQVFIpOwotICBGSVggKGNiU3ltT2Zmc2V0LCBleHRlcm5hbF9zeW0sIFBUUik7Ci0gIEZJWCAoY2JPcHRPZmZzZXQsIGV4dGVybmFsX29wdCwgUFRSKTsKLSAgRklYIChjYkF1eE9mZnNldCwgZXh0ZXJuYWxfYXV4LCB1bmlvbiBhdXhfZXh0ICopOwotICBGSVggKGNiU3NPZmZzZXQsIHNzLCBjaGFyICopOwotICBGSVggKGNiU3NFeHRPZmZzZXQsIHNzZXh0LCBjaGFyICopOwotICBGSVggKGNiRmRPZmZzZXQsIGV4dGVybmFsX2ZkciwgUFRSKTsKLSAgRklYIChjYlJmZE9mZnNldCwgZXh0ZXJuYWxfcmZkLCBQVFIpOwotICBGSVggKGNiRXh0T2Zmc2V0LCBleHRlcm5hbF9leHQsIFBUUik7Ci0jdW5kZWYgRklYCi0KLSAgLyogSSBkb24ndCB3YW50IHRvIGFsd2F5cyBzd2FwIGFsbCB0aGUgZGF0YSwgYmVjYXVzZSBpdCB3aWxsIGp1c3QKLSAgICAgd2FzdGUgdGltZSBhbmQgbW9zdCBwcm9ncmFtcyB3aWxsIG5ldmVyIGxvb2sgYXQgaXQuICBUaGUgb25seQotICAgICB0aW1lIHRoZSBsaW5rZXIgbmVlZHMgbW9zdCBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHN3YXBwZWQKLSAgICAgaXMgd2hlbiBsaW5raW5nIGJpZy1lbmRpYW4gYW5kIGxpdHRsZS1lbmRpYW4gTUlQUyBvYmplY3QgZmlsZXMKLSAgICAgdG9nZXRoZXIsIHdoaWNoIGlzIG5vdCBhIGNvbW1vbiBvY2N1cnJlbmNlLgotCi0gICAgIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgZmRyIHRvIGRlYWwgd2l0aCBhIGxvdCBvZiBpbmZvcm1hdGlvbiBpbgotICAgICB0aGUgc3ltYm9scywgc28gd2Ugc3dhcCB0aGVtIGhlcmUuICAqLwotICBkZWJ1Zy0+ZmRyID0gKHN0cnVjdCBmZHIgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgKGludGVybmFsX3N5bWhkci0+aWZkTWF4ICoKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmZHIpKSk7Ci0gIGlmIChkZWJ1Zy0+ZmRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBleHRlcm5hbF9mZHJfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGZkcl9wdHIgPSBkZWJ1Zy0+ZmRyOwotICBmcmF3X3NyYyA9IChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9mZHI7Ci0gIGZyYXdfZW5kID0gZnJhd19zcmMgKyBpbnRlcm5hbF9zeW1oZHItPmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplOwotICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLSAgICAoKmJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBFQ09GRiBzeW1ib2wgdGFibGUgcm91dGluZXMuICBUaGUgRUNPRkYgc3ltYm9sIHRhYmxlIGlzIGRlc2NyaWJlZAotICAgaW4gZ2NjL21pcHMtdGZpbGUuYy4gICovCi0KLS8qIEVDT0ZGIHVzZXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlciBpcyBmb3Igc21hbGwgb2JqZWN0cy4gIEFsbCB0aGUgc21hbGwgb2JqZWN0cyBhcmUga2VwdAotICAgdG9nZXRoZXIsIGFuZCB0aGVuIHJlZmVyZW5jZWQgdmlhIHRoZSBncCBwb2ludGVyLCB3aGljaCB5aWVsZHMKLSAgIGZhc3RlciBhc3NlbWJsZXIgY29kZS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24KLSAgIHNlY3Rpb24uICAqLwotc3RhdGljIGFzZWN0aW9uIGVjb2ZmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sIGVjb2ZmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQotLyogQ3JlYXRlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotX2JmZF9lY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlY29mZl9zeW1ib2xfdHlwZSAqbmV3OwotCi0gIG5ldyA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gKGFzeW1ib2wgKikgTlVMTDsKLSAgbWVtc2V0ICgoUFRSKSBuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXctPmZkciA9IChGRFIgKikgTlVMTDsKLSAgbmV3LT5sb2NhbCA9IGZhbHNlOwotICBuZXctPm5hdGl2ZSA9IE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBTZXQgdGhlIEJGRCBmbGFncyBhbmQgc2VjdGlvbiBmb3IgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgZWNvZmZfc3ltLCBhc3ltLCBleHQsIHdlYWspCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgU1lNUiAqZWNvZmZfc3ltOwotICAgICBhc3ltYm9sICphc3ltOwotICAgICBpbnQgZXh0OwotICAgICBpbnQgd2VhazsKLXsKLSAgYXN5bS0+dGhlX2JmZCA9IGFiZmQ7Ci0gIGFzeW0tPnZhbHVlID0gZWNvZmZfc3ltLT52YWx1ZTsKLSAgYXN5bS0+c2VjdGlvbiA9ICZiZmRfZGVidWdfc2VjdGlvbjsKLSAgYXN5bS0+dWRhdGEuaSA9IDA7Ci0KLSAgLyogTW9zdCBzeW1ib2wgdHlwZXMgYXJlIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCi0gIHN3aXRjaCAoZWNvZmZfc3ltLT5zdCkKLSAgICB7Ci0gICAgY2FzZSBzdEdsb2JhbDoKLSAgICBjYXNlIHN0U3RhdGljOgotICAgIGNhc2Ugc3RMYWJlbDoKLSAgICBjYXNlIHN0UHJvYzoKLSAgICBjYXNlIHN0U3RhdGljUHJvYzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3ROaWw6Ci0gICAgICBpZiAoRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLQl7Ci0JICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICh3ZWFrKQotICAgIGFzeW0tPmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9XRUFLOwotICBlbHNlIGlmIChleHQpCi0gICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICAgICAgLyogTm9ybWFsbHksIGEgbG9jYWwgc3RQcm9jIHN5bWJvbCB3aWxsIGhhdmUgYSBjb3JyZXNwb25kaW5nCi0gICAgICAgICBleHRlcm5hbCBzeW1ib2wuICBXZSBtYXJrIHRoZSBsb2NhbCBzeW1ib2wgYXMgYSBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbCwgaW4gb3JkZXIgdG8gcHJldmVudCBubSBmcm9tIHByaW50aW5nIGJvdGggb3V0LgotICAgICAgICAgU2ltaWxhcmx5LCB3ZSBtYXJrIHN0TGFiZWwgYW5kIHN0YWJzIHN5bWJvbHMgYXMgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2xzLiAgSW4gYm90aCBjYXNlcywgd2UgZG8gd2FudCB0byBzZXQgdGhlIHZhbHVlCi0gICAgICAgICBjb3JyZWN0bHkgYmFzZWQgb24gdGhlIHN5bWJvbCBjbGFzcy4gICovCi0gICAgICBpZiAoZWNvZmZfc3ltLT5zdCA9PSBzdFByb2MKLQkgIHx8IGVjb2ZmX3N5bS0+c3QgPT0gc3RMYWJlbAotCSAgfHwgRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLQlhc3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICAgIH0KLSAgc3dpdGNoIChlY29mZl9zeW0tPnNjKQotICAgIHsKLSAgICBjYXNlIHNjTmlsOgotICAgICAgLyogVXNlZCBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIGxhYmVscy4gIExlYXZlIHRoZW0gaW4gdGhlCi0JIGRlYnVnZ2luZyBzZWN0aW9uLCBhbmQgbWFyayB0aGVtIGFzIGxvY2FsLiAgSWYgQlNGX0RFQlVHR0lORwotCSBpcyBzZXQsIHRoZW4gbm0gZG9lcyBub3QgZGlzcGxheSB0aGVtIGZvciBzb21lIHJlYXNvbi4gIElmIG5vCi0JIGZsYWdzIGFyZSBzZXQgdGhlbiB0aGUgbGlua2VyIHdoaW5lcyBhYm91dCB0aGVtLiAgKi8KLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1RleHQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnRleHQiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5kYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQnNzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5ic3MiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSZWdpc3RlcjoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NBYnM6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NVbmRlZmluZWQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGFzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NDZGJMb2NhbDoKLSAgICBjYXNlIHNjQml0czoKLSAgICBjYXNlIHNjQ2RiU3lzdGVtOgotICAgIGNhc2Ugc2NSZWdJbWFnZToKLSAgICBjYXNlIHNjSW5mbzoKLSAgICBjYXNlIHNjVXNlclN0cnVjdDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2RhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTQnNzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zYnNzIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUkRhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJkYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVmFyOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0NvbW1vbjoKLSAgICAgIGlmIChhc3ltLT52YWx1ZSA+IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplKQotCXsKLQkgIGFzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYXN5bS0+ZmxhZ3MgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIHNjU0NvbW1vbjoKLSAgICAgIGlmIChlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID0gU0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBlY29mZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZlY29mZl9zY29tX3N5bWJvbDsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBlY29mZl9zY29tX3N5bWJvbC5uYW1lID0gU0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICBlY29mZl9zY29tX3N5bWJvbF9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVmFyUmVnaXN0ZXI6Ci0gICAgY2FzZSBzY1ZhcmlhbnQ6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU1VuZGVmaW5lZDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYXN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0luaXQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmluaXQiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NCYXNlZFZhcjoKLSAgICBjYXNlIHNjWERhdGE6Ci0gICAgY2FzZSBzY1BEYXRhOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0Zpbmk6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSQ29uc3Q6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBMb29rIGZvciBzcGVjaWFsIGNvbnN0cnVjdG9ycyBzeW1ib2xzIGFuZCBtYWtlIHJlbG9jYXRpb24gZW50cmllcwotICAgICBpbiBhIHNwZWNpYWwgY29uc3RydWN0aW9uIHNlY3Rpb24uICBUaGVzZSBhcmUgcHJvZHVjZWQgYnkgdGhlCi0gICAgIC1mZ251LWxpbmtlciBhcmd1bWVudCB0byBnKysuICAqLwotICBpZiAoRUNPRkZfSVNfU1RBQiAoZWNvZmZfc3ltKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVDT0ZGX1VOTUFSS19TVEFCIChlY29mZl9zeW0tPmluZGV4KSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NFVEE6Ci0JY2FzZSBOX1NFVFQ6Ci0JY2FzZSBOX1NFVEQ6Ci0JY2FzZSBOX1NFVEI6Ci0JICB7Ci0JICAgIC8qIFRoaXMgY29kZSBpcyBubyBsb25nZXIgbmVlZGVkLiAgSXQgdXNlZCB0byBiZSB1c2VkIHRvCi0JICAgICAgIG1ha2UgdGhlIGxpbmtlciBoYW5kbGUgc2V0IHN5bWJvbHMsIGJ1dCB0aGV5IGFyZSBub3cKLQkgICAgICAgaGFuZGxlZCBpbiB0aGUgYWRkX3N5bWJvbHMgcm91dGluZSBpbnN0ZWFkLiAgKi8KLSNpZiAwCi0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCSAgICBhcmVsZW50X2NoYWluICpyZWxvY19jaGFpbjsKLQkgICAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0KLQkgICAgLyogR2V0IGEgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCAodXN1YWxseQotCSAgICAgICBfX0NUT1JfTElTVF9fIG9yIF9fRFRPUl9MSVNUX18pLiAgRklYTUU6IGdjYyB1c2VzIHRoZQotCSAgICAgICBuYW1lIF9fX0NUT1JfTElTVCAodGhyZWUgdW5kZXJzY29yZXMpLiAgV2UgbmVlZAotCSAgICAgICBfX0NUT1JfTElTVCAodHdvIHVuZGVyc2NvcmVzKSwgc2luY2UgRUNPRkYgZG9lc24ndCB1c2UKLQkgICAgICAgYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGdjYywKLQkgICAgICAgYnV0IGluc3RlYWQgd2UgZG8gaXQgaGVyZS4gIEFjdHVhbGx5LCB0aGlzIHNob3VsZCBhbGwKLQkgICAgICAgYmUgZG9uZSBkaWZmZXJlbnRseSBhbnlob3cuICAqLwotCSAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoYXN5bSk7Ci0JICAgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdfJyAmJiBuYW1lWzJdID09ICdfJykKLQkgICAgICB7Ci0JCSsrbmFtZTsKLQkJYXN5bS0+bmFtZSA9IG5hbWU7Ci0JICAgICAgfQotCSAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgICB7Ci0JCWNoYXIgKmNvcHk7Ci0KLQkJY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotCQlpZiAoIWNvcHkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlzdHJjcHkgKGNvcHksIG5hbWUpOwotCQlzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgY29weSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEJ1aWxkIGEgcmVsb2MgcG9pbnRpbmcgdG8gdGhpcyBjb25zdHJ1Y3Rvci4gICovCi0JICAgIHJlbG9jX2NoYWluID0KLQkgICAgICAoYXJlbGVudF9jaGFpbiAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudF9jaGFpbikpOwotCSAgICBpZiAoIXJlbG9jX2NoYWluKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgICAgYmZkX2dldF9zZWN0aW9uIChhc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuYWRkcmVzcyA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5hZGRlbmQgPSBhc3ltLT52YWx1ZTsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5ob3d0byA9Ci0JICAgICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmNvbnN0cnVjdG9yX3JlbG9jOwotCi0JICAgIC8qIFNldCB1cCB0aGUgY29uc3RydWN0b3Igc2VjdGlvbiB0byBob2xkIHRoZSByZWxvYy4gICovCi0JICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0NPTlNUUlVDVE9SOwotCSAgICArK3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0JICAgIC8qIENvbnN0cnVjdG9yIHNlY3Rpb25zIG11c3QgYmUgcm91bmRlZCB0byBhIGJvdW5kYXJ5Ci0JICAgICAgIGJhc2VkIG9uIHRoZSBiaXRzaXplLiAgVGhlc2UgYXJlIG5vdCByZWFsIHNlY3Rpb25zLS0KLQkgICAgICAgdGhleSBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgdGhlIGxpbmtlci0tc28gdGhlIEVDT0ZGCi0JICAgICAgIDE2IGJ5dGUgYWxpZ25tZW50IHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5LiAgKi8KLQkgICAgYml0c2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5jb25zdHJ1Y3Rvcl9iaXRzaXplOwotCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotCSAgICB3aGlsZSAoKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKSA8IGJpdHNpemUgLyA4KQotCSAgICAgICsrc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAgIHJlbG9jX2NoYWluLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0JICAgIHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluID0gcmVsb2NfY2hhaW47Ci0JICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSArPSBiaXRzaXplIC8gODsKLQotI2VuZGlmIC8qIDAgKi8KLQotCSAgICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgYSBjb25zdHJ1Y3Rvci4gICovCi0JICAgIGFzeW0tPmZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuIEVDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX3N5bV9pbjsKLSAgYmZkX3NpemVfdHlwZSBpbnRlcm5hbF9zaXplOwotICBlY29mZl9zeW1ib2xfdHlwZSAqaW50ZXJuYWw7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNoYXIgKmVyYXdfc3JjOwotICBjaGFyICplcmF3X2VuZDsKLSAgRkRSICpmZHJfcHRyOwotICBGRFIgKmZkcl9lbmQ7Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSByZWFkIGluIHRoZSBzeW1ib2wgdGFibGUsIGRvIG5vdGhpbmcuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnRlcm5hbF9zaXplID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlKTsKLSAgaW50ZXJuYWwgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBpbnRlcm5hbF9zaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludGVybmFsX3B0ciA9IGludGVybmFsOwotICBlcmF3X3NyYyA9IChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2V4dDsKLSAgZXJhd19lbmQgPSAoZXJhd19zcmMKLQkgICAgICArIChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heAotCQkgKiBleHRlcm5hbF9leHRfc2l6ZSkpOwotICBmb3IgKDsgZXJhd19zcmMgPCBlcmF3X2VuZDsgZXJhd19zcmMgKz0gZXh0ZXJuYWxfZXh0X3NpemUsIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIEVYVFIgaW50ZXJuYWxfZXN5bTsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGVyYXdfc3JjLCAmaW50ZXJuYWxfZXN5bSk7Ci0gICAgICBpbnRlcm5hbF9wdHItPnN5bWJvbC5uYW1lID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnNzZXh0Ci0JCQkJICAgKyBpbnRlcm5hbF9lc3ltLmFzeW0uaXNzKTsKLSAgICAgIGlmICghZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCAmaW50ZXJuYWxfZXN5bS5hc3ltLAotCQkJCSAgJmludGVybmFsX3B0ci0+c3ltYm9sLCAxLAotCQkJCSAgaW50ZXJuYWxfZXN5bS53ZWFrZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBUaGUgYWxwaGEgdXNlcyBhIG5lZ2F0aXZlIGlmZCBmaWVsZCBmb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChpbnRlcm5hbF9lc3ltLmlmZCA+PSAwKQotCWludGVybmFsX3B0ci0+ZmRyID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmZkcgotCQkJICAgICArIGludGVybmFsX2VzeW0uaWZkKTsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9wdHItPmZkciA9IE5VTEw7Ci0gICAgICBpbnRlcm5hbF9wdHItPmxvY2FsID0gZmFsc2U7Ci0gICAgICBpbnRlcm5hbF9wdHItPm5hdGl2ZSA9IChQVFIpIGVyYXdfc3JjOwotICAgIH0KLQotICAvKiBUaGUgbG9jYWwgc3ltYm9scyBtdXN0IGJlIGFjY2Vzc2VkIHZpYSB0aGUgZmRyJ3MsIGJlY2F1c2UgdGhlCi0gICAgIHN0cmluZyBhbmQgYXV4IGluZGljZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBmZHIgaW5mb3JtYXRpb24uICAqLwotICBmZHJfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZmRyOwotICBmZHJfZW5kID0gZmRyX3B0ciArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0gIGZvciAoOyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGNoYXIgKmxyYXdfc3JjOwotICAgICAgY2hhciAqbHJhd19lbmQ7Ci0KLSAgICAgIGxyYXdfc3JjID0gKChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX3N5bQotCQkgICsgZmRyX3B0ci0+aXN5bUJhc2UgKiBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBscmF3X2VuZCA9IGxyYXdfc3JjICsgZmRyX3B0ci0+Y3N5bSAqIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZm9yICg7Ci0JICAgbHJhd19zcmMgPCBscmF3X2VuZDsKLQkgICBscmF3X3NyYyArPSBleHRlcm5hbF9zeW1fc2l6ZSwgaW50ZXJuYWxfcHRyKyspCi0JewotCSAgU1lNUiBpbnRlcm5hbF9zeW07Ci0KLQkgICgqc3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSBscmF3X3NyYywgJmludGVybmFsX3N5bSk7Ci0JICBpbnRlcm5hbF9wdHItPnN5bWJvbC5uYW1lID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnNzCi0JCQkJICAgICAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCSAgICAgICArIGludGVybmFsX3N5bS5pc3MpOwotCSAgaWYgKCFlY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsICZpbnRlcm5hbF9zeW0sCi0JCQkJICAgICAgJmludGVybmFsX3B0ci0+c3ltYm9sLCAwLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW50ZXJuYWxfcHRyLT5mZHIgPSBmZHJfcHRyOwotCSAgaW50ZXJuYWxfcHRyLT5sb2NhbCA9IHRydWU7Ci0JICBpbnRlcm5hbF9wdHItPm5hdGl2ZSA9IChQVFIpIGxyYXdfc3JjOwotCX0KLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzID0gaW50ZXJuYWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBmb3IgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbykpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlICopKTsKLX0KLQotLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICoqbG9jYXRpb24gPSAoZWNvZmZfc3ltYm9sX3R5cGUgKiopIGFsb2NhdGlvbjsKLQotICBpZiAoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3ltYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9sczsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqKGxvY2F0aW9uKyspID0gc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmxvY2F0aW9uKysgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBUdXJuIEVDT0ZGIHR5cGUgaW5mb3JtYXRpb24gaW50byBhIHByaW50YWJsZSBzdHJpbmcuCi0gICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBhbmQgZWNvZmZfdHlwZV90b19zdHJpbmcgYXJlIGZyb20KLSAgIGdjYy9taXBzLXRkdW1wLmMsIHdpdGggc3dhcHBpbmcgYWRkZWQgYW5kIHVzZWRfcHRyIHJlbW92ZWQuICAqLwotCi0vKiBXcml0ZSBhZ2dyZWdhdGUgaW5mb3JtYXRpb24gdG8gYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgc3RyaW5nLCBybmR4LCBpc3ltLCB3aGljaCkKLSAgICAgYmZkICphYmZkOwotICAgICBGRFIgKmZkcjsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBSTkRYUiAqcm5keDsKLSAgICAgbG9uZyBpc3ltOwotICAgICBjb25zdCBjaGFyICp3aGljaDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwID0KLSAgICAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgdW5zaWduZWQgaW50IGlmZCA9IHJuZHgtPnJmZDsKLSAgdW5zaWduZWQgaW50IGluZHggPSBybmR4LT5pbmRleDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgCi0gIGlmIChpZmQgPT0gMHhmZmYpCi0gICAgaWZkID0gaXN5bTsKLQotICAvKiBBbiBpZmQgb2YgLTEgaXMgYW4gb3BhcXVlIHR5cGUuICBBbiBlc2NhcGVkIGluZGV4IG9mIDAgaXMgYQotICAgICBzdHJ1Y3QgcmV0dXJuIHR5cGUgb2YgYSBwcm9jZWR1cmUgY29tcGlsZWQgd2l0aG91dCAtZy4gICovCi0gIGlmIChpZmQgPT0gMHhmZmZmZmZmZgotICAgICAgfHwgKHJuZHgtPnJmZCA9PSAweGZmZiAmJiBpbmR4ID09IDApKQotICAgIG5hbWUgPSAiPHVuZGVmaW5lZD4iOwotICBlbHNlIGlmIChpbmR4ID09IGluZGV4TmlsKQotICAgIG5hbWUgPSAiPG5vIG5hbWU+IjsKLSAgZWxzZQotICAgIHsKLSAgICAgIFNZTVIgc3ltOwotCi0gICAgICBpZiAoZGVidWdfaW5mby0+ZXh0ZXJuYWxfcmZkID09IE5VTEwpCi0JZmRyID0gZGVidWdfaW5mby0+ZmRyICsgaWZkOwotICAgICAgZWxzZQotCXsKLQkgIFJGRFQgcmZkOwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcmZkX2luKSAoYWJmZCwKLQkJCQkgICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcmZkCi0JCQkJICAgICAgICsgKChmZHItPnJmZEJhc2UgKyBpZmQpCi0JCQkJCSAgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkpLAotCQkJCSAgICAgICZyZmQpOwotCSAgZmRyID0gZGVidWdfaW5mby0+ZmRyICsgcmZkOwotCX0KLQotICAgICAgaW5keCArPSBmZHItPmlzeW1CYXNlOwotCi0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwKLQkJCQkgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJCQkgICArIGluZHggKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSksCi0JCQkJICAmc3ltKTsKLQotICAgICAgbmFtZSA9IGRlYnVnX2luZm8tPnNzICsgZmRyLT5pc3NCYXNlICsgc3ltLmlzczsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLAotCSAgICIlcyAlcyB7IGlmZCA9ICV1LCBpbmRleCA9ICVsdSB9IiwKLQkgICB3aGljaCwgbmFtZSwgaWZkLAotCSAgICgobG9uZykgaW5keAotCSAgICArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KSk7Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHR5cGUgaW5mb3JtYXRpb24gdG8gc3RyaW5nIGZvcm1hdC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWVjb2ZmX3R5cGVfdG9fc3RyaW5nIChhYmZkLCBmZHIsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRkRSICpmZHI7Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotewotICB1bmlvbiBhdXhfZXh0ICphdXhfcHRyOwotICBpbnQgYmlnZW5kaWFuOwotICBBVVhVIHU7Ci0gIHN0cnVjdCBxdWFsIHsKLSAgICB1bnNpZ25lZCBpbnQgIHR5cGU7Ci0gICAgaW50ICBsb3dfYm91bmQ7Ci0gICAgaW50ICBoaWdoX2JvdW5kOwotICAgIGludCAgc3RyaWRlOwotICB9IHF1YWxpZmllcnNbN107Ci0gIHVuc2lnbmVkIGludCBiYXNpY190eXBlOwotICBpbnQgaTsKLSAgY2hhciBidWZmZXIxWzEwMjRdOwotICBzdGF0aWMgY2hhciBidWZmZXIyWzEwMjRdOwotICBjaGFyICpwMSA9IGJ1ZmZlcjE7Ci0gIGNoYXIgKnAyID0gYnVmZmVyMjsKLSAgUk5EWFIgcm5keDsKLQotICBhdXhfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfYXV4ICsgZmRyLT5pYXV4QmFzZTsKLSAgYmlnZW5kaWFuID0gZmRyLT5mQmlnZW5kaWFuOwotCi0gIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0gICAgewotICAgICAgcXVhbGlmaWVyc1tpXS5sb3dfYm91bmQgPSAwOwotICAgICAgcXVhbGlmaWVyc1tpXS5oaWdoX2JvdW5kID0gMDsKLSAgICAgIHF1YWxpZmllcnNbaV0uc3RyaWRlID0gMDsKLSAgICB9Ci0KLSAgaWYgKEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XSkgPT0gKGJmZF92bWEpIC0xKQotICAgIHJldHVybiAiLTEgKG5vIHR5cGUpIjsKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KytdLmFfdGksICZ1LnRpKTsKLQotICBiYXNpY190eXBlID0gdS50aS5idDsKLSAgcXVhbGlmaWVyc1swXS50eXBlID0gdS50aS50cTA7Ci0gIHF1YWxpZmllcnNbMV0udHlwZSA9IHUudGkudHExOwotICBxdWFsaWZpZXJzWzJdLnR5cGUgPSB1LnRpLnRxMjsKLSAgcXVhbGlmaWVyc1szXS50eXBlID0gdS50aS50cTM7Ci0gIHF1YWxpZmllcnNbNF0udHlwZSA9IHUudGkudHE0OwotICBxdWFsaWZpZXJzWzVdLnR5cGUgPSB1LnRpLnRxNTsKLSAgcXVhbGlmaWVyc1s2XS50eXBlID0gdHFOaWw7Ci0KLSAgLyoKLSAgICogR28gZ2V0IHRoZSBiYXNpYyB0eXBlLgotICAgKi8KLSAgc3dpdGNoIChiYXNpY190eXBlKQotICAgIHsKLSAgICBjYXNlIGJ0TmlsOgkJCS8qIHVuZGVmaW5lZCAqLwotICAgICAgc3RyY3B5IChwMSwgIm5pbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0QWRyOgkJCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAiYWRkcmVzcyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Q2hhcjoJCS8qIGNoYXJhY3RlciAqLwotICAgICAgc3RyY3B5IChwMSwgImNoYXIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVDaGFyOgkJLyogdW5zaWduZWQgY2hhcmFjdGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgY2hhciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U2hvcnQ6CQkvKiBzaG9ydCAqLwotICAgICAgc3RyY3B5IChwMSwgInNob3J0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVU2hvcnQ6CQkvKiB1bnNpZ25lZCBzaG9ydCAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIHNob3J0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRJbnQ6CQkJLyogaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAiaW50Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVSW50OgkJLyogdW5zaWduZWQgaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgaW50Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRMb25nOgkJLyogbG9uZyAqLwotICAgICAgc3RyY3B5IChwMSwgImxvbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVMb25nOgkJLyogdW5zaWduZWQgbG9uZyAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGxvbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZsb2F0OgkJLyogZmxvYXQgKHJlYWwpICovCi0gICAgICBzdHJjcHkgKHAxLCAiZmxvYXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidERvdWJsZToJCS8qIERvdWJsZSAocmVhbCkgKi8KLSAgICAgIHN0cmNweSAocDEsICJkb3VibGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBTdHJ1Y3R1cmVzIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gc3RydWN0IGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRTdHJ1Y3Q6CQkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgInN0cnVjdCIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogVW5pb25zIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gdW5pb24gZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidFVuaW9uOgkJLyogVW5pb24gKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgInVuaW9uIik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBFbnVtZXJhdGlvbnMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byBlbnVtIGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRFbnVtOgkJLyogRW51bWVyYXRpb24gKi8KLSAgICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdLmFfcm5keCwgJnJuZHgpOwotICAgICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgKGFiZmQsIGZkciwgcDEsICZybmR4LAotCQkJICAgIChsb25nKSBBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsxXSksCi0JCQkgICAgImVudW0iKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VHlwZWRlZjoJCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSAgICAgIHN0cmNweSAocDEsICJ0eXBlZGVmIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRSYW5nZToJCS8qIHN1YnJhbmdlIG9mIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgInN1YnJhbmdlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTZXQ6CQkJLyogcGFzY2FsIHNldHMgKi8KLSAgICAgIHN0cmNweSAocDEsICJzZXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidENvbXBsZXg6CQkvKiBmb3J0cmFuIGNvbXBsZXggKi8KLSAgICAgIHN0cmNweSAocDEsICJjb21wbGV4Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnREQ29tcGxleDoJCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSAgICAgIHN0cmNweSAocDEsICJkb3VibGUgY29tcGxleCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0SW5kaXJlY3Q6CQkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotICAgICAgc3RyY3B5IChwMSwgImZvcndhcmQvdW5hbWVkIHR5cGVkZWYiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZpeGVkRGVjOgkJLyogRml4ZWQgRGVjaW1hbCAqLwotICAgICAgc3RyY3B5IChwMSwgImZpeGVkIGRlY2ltYWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEZsb2F0RGVjOgkJLyogRmxvYXQgRGVjaW1hbCAqLwotICAgICAgc3RyY3B5IChwMSwgImZsb2F0IGRlY2ltYWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFN0cmluZzoJCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJzdHJpbmciKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEJpdDoJCQkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJiaXQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFBpY3R1cmU6CQkvKiBQaWN0dXJlICovCi0gICAgICBzdHJjcHkgKHAxLCAicGljdHVyZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Vm9pZDoJCS8qIFZvaWQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ2b2lkIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChwMSwgXygiVW5rbm93biBiYXNpYyB0eXBlICVkIiksIChpbnQpIGJhc2ljX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHAxICs9IHN0cmxlbiAoYnVmZmVyMSk7Ci0KLSAgLyoKLSAgICogSWYgdGhpcyBpcyBhIGJpdGZpZWxkLCBnZXQgdGhlIGJpdHNpemUuCi0gICAqLwotICBpZiAodS50aS5mQml0ZmllbGQpCi0gICAgewotICAgICAgaW50IGJpdHNpemU7Ci0KLSAgICAgIGJpdHNpemUgPSBBVVhfR0VUX1dJRFRIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrK10pOwotICAgICAgc3ByaW50ZiAocDEsICIgOiAlZCIsIGJpdHNpemUpOwotICAgICAgcDEgKz0gc3RybGVuIChidWZmZXIxKTsKLSAgICB9Ci0KLQotICAvKgotICAgKiBEZWFsIHdpdGggYW55IHF1YWxpZmllcnMuCi0gICAqLwotICBpZiAocXVhbGlmaWVyc1swXS50eXBlICE9IHRxTmlsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTbmFyZiB1cCBhbnkgYXJyYXkgYm91bmRzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgQXJyYXlzCi0gICAgICAgKiBzdG9yZSA1IHN1Y2Nlc3NpdmUgd29yZHMgaW4gdGhlIGF1eC4gdGFibGU6Ci0gICAgICAgKgl3b3JkIDAJUk5EWFIgdG8gdHlwZSBvZiB0aGUgYm91bmRzIChpZSwgaW50KQotICAgICAgICoJd29yZCAxCUN1cnJlbnQgZmlsZSBkZXNjcmlwdG9yIGluZGV4Ci0gICAgICAgKgl3b3JkIDIJbG93IGJvdW5kCi0gICAgICAgKgl3b3JkIDMJaGlnaCBib3VuZCAob3IgLTEgaWYgW10pCi0gICAgICAgKgl3b3JkIDQJc3RyaWRlIHNpemUgaW4gYml0cwotICAgICAgICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCXsKLQkgIGlmIChxdWFsaWZpZXJzW2ldLnR5cGUgPT0gdHFBcnJheSkKLQkgICAgewotCSAgICAgIHF1YWxpZmllcnNbaV0ubG93X2JvdW5kID0KLQkJQVVYX0dFVF9ETkxPVyAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzJdKTsKLQkgICAgICBxdWFsaWZpZXJzW2ldLmhpZ2hfYm91bmQgPQotCQlBVVhfR0VUX0ROSElHSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzNdKTsKLQkgICAgICBxdWFsaWZpZXJzW2ldLnN0cmlkZSA9Ci0JCUFVWF9HRVRfV0lEVEggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCs0XSk7Ci0JICAgICAgaW5keCArPSA1OwotCSAgICB9Ci0JfQotCi0gICAgICAvKgotICAgICAgICogTm93IHByaW50IG91dCB0aGUgcXVhbGlmaWVycy4KLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JICBzd2l0Y2ggKHF1YWxpZmllcnNbaV0udHlwZSkKLQkgICAgewotCSAgICBjYXNlIHRxTmlsOgotCSAgICBjYXNlIHRxTWF4OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFQdHI6Ci0JICAgICAgc3RyY3B5IChwMiwgInB0ciB0byAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJwdHIgdG8gIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxVm9sOgotCSAgICAgIHN0cmNweSAocDIsICJ2b2xhdGlsZSAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJ2b2xhdGlsZSAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFGYXI6Ci0JICAgICAgc3RyY3B5IChwMiwgImZhciAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJmYXIgIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxUHJvYzoKLQkgICAgICBzdHJjcHkgKHAyLCAiZnVuYy4gcmV0LiAiKTsKLQkgICAgICBwMiArPSBzaXplb2YgKCJmdW5jLiByZXQuICIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFBcnJheToKLQkgICAgICB7Ci0JCWludCBmaXJzdF9hcnJheSA9IGk7Ci0JCWludCBqOwotCi0JCS8qIFByaW50IGFycmF5IGJvdW5kcyByZXZlcnNlZCAoaWUsIGluIHRoZSBvcmRlciB0aGUgQwotCQkgICBwcm9ncmFtbWVyIHdyaXRlcyB0aGVtKS4gIEMgaXMgc3VjaCBhIGZ1biBsYW5ndWFnZS4uLi4gKi8KLQotCQl3aGlsZSAoaSA8IDUgJiYgcXVhbGlmaWVyc1tpKzFdLnR5cGUgPT0gdHFBcnJheSkKLQkJICBpKys7Ci0KLQkJZm9yIChqID0gaTsgaiA+PSBmaXJzdF9hcnJheTsgai0tKQotCQkgIHsKLQkJICAgIHN0cmNweSAocDIsICJhcnJheSBbIik7Ci0JCSAgICBwMiArPSBzaXplb2YgKCJhcnJheSBbIiktMTsKLQkJICAgIGlmIChxdWFsaWZpZXJzW2pdLmxvd19ib3VuZCAhPSAwKQotCQkgICAgICBzcHJpbnRmIChwMiwKLQkJCSAgICAgICAiJWxkOiVsZCB7JWxkIGJpdHN9IiwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5sb3dfYm91bmQsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5zdHJpZGUpOwotCi0JCSAgICBlbHNlIGlmIChxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQgIT0gLTEpCi0JCSAgICAgIHNwcmludGYgKHAyLAotCQkJICAgICAgICIlbGQgeyVsZCBiaXRzfSIsCi0JCQkgICAgICAgKGxvbmcpIChxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQgKyAxKSwKLQkJCSAgICAgICAobG9uZykgKHF1YWxpZmllcnNbal0uc3RyaWRlKSk7Ci0KLQkJICAgIGVsc2UKLQkJICAgICAgc3ByaW50ZiAocDIsICIgeyVsZCBiaXRzfSIsIChsb25nKSAocXVhbGlmaWVyc1tqXS5zdHJpZGUpKTsKLQotCQkgICAgcDIgKz0gc3RybGVuIChwMik7Ci0JCSAgICBzdHJjcHkgKHAyLCAiXSBvZiAiKTsKLQkJICAgIHAyICs9IHNpemVvZiAoIl0gb2YgIiktMTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBzdHJjcHkgKHAyLCBidWZmZXIxKTsKLSAgcmV0dXJuIGJ1ZmZlcjI7Ci19Ci0KLS8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBFQ09GRiBzeW1ib2wgU1lNQk9MIGluIFJFVC4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGxvY2FsIGxhYmVsLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0vKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBhbiBFQ09GRiBzeW1ib2wuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKLSAgICA9ICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopZmlsZXA7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQl7Ci0JICBTWU1SIGVjb2ZmX3N5bTsKLQkKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCSAgICAgICZlY29mZl9zeW0pOwotCSAgZnByaW50ZiAoZmlsZSwgImVjb2ZmIGxvY2FsICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9zeW0udmFsdWUpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAleCAleCIsICh1bnNpZ25lZCkgZWNvZmZfc3ltLnN0LAotCQkgICAodW5zaWduZWQpIGVjb2ZmX3N5bS5zYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVYVFIgZWNvZmZfZXh0OwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfZXh0KTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBleHRlcm4gIik7Ci0JICBmcHJpbnRmX3ZtYSAoZmlsZSwgKGJmZF92bWEpIGVjb2ZmX2V4dC5hc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgICAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnNjKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgLyogUHJpbnQgb3V0IHRoZSBzeW1ib2xzIGluIGEgcmVhc29uYWJsZSB3YXkgKi8KLSAgICAgIHsKLQljaGFyIHR5cGU7Ci0JaW50IHBvczsKLQlFWFRSIGVjb2ZmX2V4dDsKLQljaGFyIGptcHRibDsKLQljaGFyIGNvYm9sX21haW47Ci0JY2hhciB3ZWFrZXh0OwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQuYXN5bSk7Ci0JICAgIHR5cGUgPSAnbCc7Ci0JICAgIHBvcyA9ICgoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgICAtIChjaGFyICopIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX3N5bSkKLQkJICAgIC8gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpCi0JCSAgICsgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpOwotCSAgICBqbXB0YmwgPSAnICc7Ci0JICAgIGNvYm9sX21haW4gPSAnICc7Ci0JICAgIHdlYWtleHQgPSAnICc7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkJJmVjb2ZmX2V4dCk7Ci0JICAgIHR5cGUgPSAnZSc7Ci0JICAgIHBvcyA9ICgoKGNoYXIgKikgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZQotCQkgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9leHQpCi0JCSAgIC8gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCSAgICBqbXB0YmwgPSBlY29mZl9leHQuam1wdGJsID8gJ2onIDogJyAnOwotCSAgICBjb2JvbF9tYWluID0gZWNvZmZfZXh0LmNvYm9sX21haW4gPyAnYycgOiAnICc7Ci0JICAgIHdlYWtleHQgPSBlY29mZl9leHQud2Vha2V4dCA/ICd3JyA6ICcgJzsKLQkgIH0KLQotCWZwcmludGYgKGZpbGUsICJbJTNkXSAlYyAiLAotCQkgcG9zLCB0eXBlKTsKLQlmcHJpbnRmX3ZtYSAoZmlsZSwgKGJmZF92bWEpIGVjb2ZmX2V4dC5hc3ltLnZhbHVlKTsKLQlmcHJpbnRmIChmaWxlLCAiIHN0ICV4IHNjICV4IGluZHggJXggJWMlYyVjICVzIiwKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uc3QsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnNjLAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5pbmRleCwKLQkJIGptcHRibCwgY29ib2xfbWFpbiwgd2Vha2V4dCwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0KLQlpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmZkciAhPSBOVUxMCi0JICAgICYmIGVjb2ZmX2V4dC5hc3ltLmluZGV4ICE9IGluZGV4TmlsKQotCSAgewotCSAgICBGRFIgKmZkcjsKLQkgICAgdW5zaWduZWQgaW50IGluZHg7Ci0JICAgIGludCBiaWdlbmRpYW47Ci0JICAgIGJmZF9zaXplX3R5cGUgc3ltX2Jhc2U7Ci0JICAgIHVuaW9uIGF1eF9leHQgKmF1eF9iYXNlOwotCi0JICAgIGZkciA9IGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHI7Ci0JICAgIGluZHggPSBlY29mZl9leHQuYXN5bS5pbmRleDsKLQotCSAgICAvKiBzeW1fYmFzZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmRyIHJlbGF0aXZlIGluZGljZXMgd2hpY2gKLQkgICAgICAgYXBwZWFyIGluIHRoZSBmaWxlIHRvIHRoZSBwb3NpdGlvbiBudW1iZXIgd2hpY2ggd2UgYXJlCi0JICAgICAgIHVzaW5nLiAgKi8KLQkgICAgc3ltX2Jhc2UgPSBmZHItPmlzeW1CYXNlOwotCSAgICBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCSAgICAgIHN5bV9iYXNlICs9Ci0JCWVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotCi0JICAgIC8qIGF1eF9iYXNlIGlzIHRoZSBzdGFydCBvZiB0aGUgYXV4IGVudHJpZXMgZm9yIHRoaXMgZmlsZTsKLQkgICAgICAgYXN5bS5pbmRleCBpcyBhbiBvZmZzZXQgZnJvbSB0aGlzLiAgKi8KLQkgICAgYXV4X2Jhc2UgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfYXV4Ci0JCQkrIGZkci0+aWF1eEJhc2UpOwotCi0JICAgIC8qIFRoZSBhdXggZW50cmllcyBhcmUgc3RvcmVkIGluIGhvc3QgYnl0ZSBvcmRlcjsgdGhlCi0JICAgICAgIG9yZGVyIGlzIGluZGljYXRlZCBieSBhIGJpdCBpbiB0aGUgZmRyLiAgKi8KLQkgICAgYmlnZW5kaWFuID0gZmRyLT5mQmlnZW5kaWFuOwotCi0JICAgIC8qIFRoaXMgc3dpdGNoIGlzIGJhc2ljYWxseSBmcm9tIGdjYy9taXBzLXRkdW1wLmMgICovCi0JICAgIHN3aXRjaCAoZWNvZmZfZXh0LmFzeW0uc3QpCi0JICAgICAgewotCSAgICAgIGNhc2Ugc3ROaWw6Ci0JICAgICAgY2FzZSBzdExhYmVsOgotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RGaWxlOgotCSAgICAgIGNhc2Ugc3RCbG9jazoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdEVuZDoKLQkJaWYgKGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjVGV4dAotCQkgICAgfHwgZWNvZmZfZXh0LmFzeW0uc2MgPT0gc2NJbmZvKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRmlyc3Qgc3ltYm9sOiAlbGQiKSwKLQkJCSAgIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksIAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0UHJvYzoKLQkgICAgICBjYXNlIHN0U3RhdGljUHJvYzoKLQkJaWYgKEVDT0ZGX0lTX1NUQUIgKCZlY29mZl9leHQuYXN5bSkpCi0JCSAgOwotCQllbHNlIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBFbmQrMSBzeW1ib2w6ICUtN2xkICAgVHlwZTogICVzIiksCi0JCQkgICAoKGxvbmcpCi0JCQkgICAgKEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLAotCQkJCQkgICAmYXV4X2Jhc2VbZWNvZmZfZXh0LmFzeW0uaW5kZXhdKQotCQkJICAgICArIHN5bV9iYXNlKSksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4ICsgMSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBMb2NhbCBzeW1ib2w6ICVsZCIpLAotCQkJICAgKChsb25nKSBpbmR4Ci0JCQkgICAgKyAobG9uZykgc3ltX2Jhc2UKLQkJCSAgICArIChlY29mZl9kYXRhIChhYmZkKQotCQkJICAgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0U3RydWN0OgotCQlmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIHN0cnVjdDsgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RVbmlvbjoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICB1bmlvbjsgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbnVtOgotCQlmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIGVudW07IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgotCQlpZiAoISBFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgVHlwZTogJXMiKSwKLQkJCSAgIGVjb2ZmX3R5cGVfdG9fc3RyaW5nIChhYmZkLCBmZHIsIGluZHgpKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLSAgY2hhciAqZXh0ZXJuYWxfcmVsb2NzOwotICBhcmVsZW50ICpycHRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoc2VjdGlvbi0+cmVsb2NhdGlvbiAhPSAoYXJlbGVudCAqKSBOVUxMCi0gICAgICB8fCBzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpbnRlcm5hbF9yZWxvY3MgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChzaXplb2YgKGFyZWxlbnQpCi0JCQkJCSAgICAqIHNlY3Rpb24tPnJlbG9jX2NvdW50KSk7Ci0gIGV4dGVybmFsX3JlbG9jX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9yZWxvY19zaXplOwotICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IGV4dGVybmFsX3JlbG9jX3NpemUgKiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZXh0ZXJuYWxfcmVsb2NzID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgZXh0ZXJuYWxfcmVsb2NzID09IChjaGFyICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLSAgICAgICE9IGV4dGVybmFsX3JlbG9jc19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwLCBycHRyID0gaW50ZXJuYWxfcmVsb2NzOyBpIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGkrKywgcnB0cisrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRlcm47Ci0KLSAgICAgICgqYmFja2VuZC0+c3dhcF9yZWxvY19pbikgKGFiZmQsCi0JCQkJIGV4dGVybmFsX3JlbG9jcyArIGkgKiBleHRlcm5hbF9yZWxvY19zaXplLAotCQkJCSAmaW50ZXJuKTsKLQotICAgICAgaWYgKGludGVybi5yX2V4dGVybikKLQl7Ci0JICAvKiByX3N5bW5keCBpcyBhbiBpbmRleCBpbnRvIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludGVybi5yX3N5bW5keCA+PSAwCi0JCSAgICAgICYmIChpbnRlcm4ucl9zeW1uZHgKLQkJCSAgPCAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KSkpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgaW50ZXJuLnJfc3ltbmR4OwotCSAgcnB0ci0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9OT05FCi0JICAgICAgIHx8IGludGVybi5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLQl7Ci0JICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcnB0ci0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQ09OU1QgY2hhciAqc2VjX25hbWU7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiByX3N5bW5keCBpcyBhIHNlY3Rpb24ga2V5LiAgKi8KLQkgIHN3aXRjaCAoaW50ZXJuLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOiAgc2VjX25hbWUgPSAiLnRleHQiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SREFUQTogc2VjX25hbWUgPSAiLnJkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9EQVRBOiAgc2VjX25hbWUgPSAiLmRhdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TREFUQTogc2VjX25hbWUgPSAiLnNkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOiAgc2VjX25hbWUgPSAiLnNic3MiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9CU1M6ICAgc2VjX25hbWUgPSAiLmJzcyI7ICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9JTklUOiAgc2VjX25hbWUgPSAiLmluaXQiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVQ4OiAgc2VjX25hbWUgPSAiLmxpdDgiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVQ0OiAgc2VjX25hbWUgPSAiLmxpdDQiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9YREFUQTogc2VjX25hbWUgPSAiLnhkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9QREFUQTogc2VjX25hbWUgPSAiLnBkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9GSU5JOiAgc2VjX25hbWUgPSAiLmZpbmkiOyBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX0xJVEE6ICBzZWNfbmFtZSA9ICIubGl0YSI7ICBicmVhazsKLQkgICAgY2FzZSBSRUxPQ19TRUNUSU9OX1JDT05TVDogc2VjX25hbWUgPSAiLnJjb25zdCI7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLQkgICAgfQotCi0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc2VjX25hbWUpOwotCSAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JICBycHRyLT5zeW1fcHRyX3B0ciA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkgIHJwdHItPmFkZGVuZCA9IC0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLQl9Ci0KLSAgICAgIHJwdHItPmFkZHJlc3MgPSBpbnRlcm4ucl92YWRkciAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0gICAgICAvKiBMZXQgdGhlIGJhY2tlbmQgc2VsZWN0IHRoZSBob3d0byBmaWVsZCBhbmQgZG8gYW55IG90aGVyCi0JIHJlcXVpcmVkIHByb2Nlc3NpbmcuICAqLwotICAgICAgKCpiYWNrZW5kLT5hZGp1c3RfcmVsb2NfaW4pIChhYmZkLCAmaW50ZXJuLCBycHRyKTsKLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGV4dGVybmFsX3JlbG9jcyk7Ci0KLSAgc2VjdGlvbi0+cmVsb2NhdGlvbiA9IGludGVybmFsX3JlbG9jczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IGEgY2Fub25pY2FsIGxpc3Qgb2YgcmVsb2NzLiAgKi8KLQotbG9uZwotX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIAotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluOwotCi0gICAgICAvKiBUaGlzIHNlY3Rpb24gaGFzIHJlbG9jcyBtYWRlIHVwIGJ5IHVzLCBub3QgdGhlIGZpbGUsIHNvIHRha2UKLQkgdGhlbSBvdXQgb2YgdGhlaXIgY2hhaW4gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgZGF0YSBhcmVhCi0JIHByb3ZpZGVkLiAgKi8KLSAgICAgIGZvciAoY291bnQgPSAwLCBjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCSAgIGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICAgY291bnQrKywgY2hhaW4gPSBjaGFpbi0+bmV4dCkKLQkqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IAotICAgICAgYXJlbGVudCAqdGJscHRyOwotCi0gICAgICBpZiAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpID09IGZhbHNlKQotCXJldHVybiAtMTsKLQotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotCi0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQwKLS8qIFByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUKLSAgIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZQotICAgd2FudGVkIGxvY2F0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBpZ25vcmVfc3ltYm9scywgb2Zmc2V0LAotCQkJICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKmlnbm9yZV9zeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cjsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBGRFIncy4gICovCi0gIGlmICghIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsIGRlYnVnX2luZm8pCi0gICAgICB8fCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID09IE5VTEwpCi0gICAgewotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0KLQkoKHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKSkpOwotICAgICAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGxpbmVfaW5mbyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLQotICByZXR1cm4gX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCBkZWJ1Z19pbmZvLAotCQkJCSBkZWJ1Z19zd2FwLCBsaW5lX2luZm8sIGZpbGVuYW1lX3B0ciwKLQkJCQkgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpOwotfQotDAotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgYnkgb2JqY29weSBhbmQgc3RyaXAuICBXZQotICAgdXNlIGl0IHRvIGNvcHkgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIG9uZSBCRkQgdG8gdGhlCi0gICBvdGhlci4gIEl0IHdvdWxkIGJlIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBIb3dldmVyLCBpdCB3b3VsZCBiZSBhCi0gICBsb3Qgb2Ygd29yaywgYW5kIHRoZXJlIHdvdWxkIGJlIGxpdHRsZSBnYWluIChnYXMsIGdkYiwgYW5kIGxkCi0gICBhbHJlYWR5IGFjY2VzcyB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIHZpYSB0aGUKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBhbmQgdGhhdCBzdHJ1Y3R1cmUgd291bGQgaGF2ZSB0byBiZQotICAgcmV0YWluZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBFQ09GRiBkZWJ1Z2dpbmcgaW4gTUlQUyBFTEYpLgotCi0gICBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgRUNPRkYgZXh0ZXJuYWwgc3ltYm9scyBjb21lcyBmcm9tCi0gICB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyB0aGUgb3RoZXIgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppaW5mbyA9ICZlY29mZl9kYXRhIChpYmZkKS0+ZGVidWdfaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm9pbmZvID0gJmVjb2ZmX2RhdGEgKG9iZmQpLT5kZWJ1Z19pbmZvOwotICByZWdpc3RlciBpbnQgaTsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotICBzaXplX3QgYzsKLSAgYm9vbGVhbiBsb2NhbDsKLQotICAvKiBXZSBvbmx5IHdhbnQgdG8gY29weSBpbmZvcm1hdGlvbiBvdmVyIGlmIGJvdGggQkZEJ3MgdXNlIEVDT0ZGCi0gICAgIGZvcm1hdC4gICovCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5ncCA9IGVjb2ZmX2RhdGEgKGliZmQpLT5ncDsKLSAgZWNvZmZfZGF0YSAob2JmZCktPmdwcm1hc2sgPSBlY29mZl9kYXRhIChpYmZkKS0+Z3BybWFzazsKLSAgZWNvZmZfZGF0YSAob2JmZCktPmZwcm1hc2sgPSBlY29mZl9kYXRhIChpYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICBlY29mZl9kYXRhIChvYmZkKS0+Y3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGliZmQpLT5jcHJtYXNrW2ldOwotCi0gIC8qIENvcHkgdGhlIHZlcnNpb24gc3RhbXAuICAqLwotICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLnZzdGFtcCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIudnN0YW1wOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCBkb24ndCBjb3B5IGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBjID0gYmZkX2dldF9zeW1jb3VudCAob2JmZCk7Ci0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChvYmZkKTsKLSAgaWYgKGMgPT0gMCB8fCBzeW1fcHRyX3B0ciA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaWYgdGhlcmUgYXJlIGFueSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgbG9jYWwgPSBmYWxzZTsKLSAgZm9yICg7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5sb2NhbCkKLQl7Ci0JICBsb2NhbCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChsb2NhbCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgc29tZSBsb2NhbCBzeW1ib2xzLiAgV2UganVzdCBicmluZyBvdmVyIGFsbCB0aGUKLQkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRklYTUU6IFRoaXMgaXMgbm90IHF1aXRlIHRoZSByaWdodAotCSB0aGluZyB0byBkby4gIElmIHRoZSB1c2VyIGhhcyBhc2tlZCB1cyB0byBkaXNjYXJkIGFsbAotCSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gd2UgYXJlIHByb2JhYmx5IGdvaW5nIHRvIHdpbmQgdXAKLQkga2VlcGluZyBpdCBiZWNhdXNlIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgc29tZSBsb2NhbCBzeW1ib2wKLQkgd2hpY2ggb2JqY29weSBkaWQgbm90IGRpc2NhcmQuICBXZSBzaG91bGQgYWN0dWFsbHkgYnJlYWsKLQkgYXBhcnQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgb25seSBrZWVwIHRoYXQgd2hpY2gKLQkgYXBwbGllcyB0byB0aGUgc3ltYm9scyB3ZSB3YW50IHRvIGtlZXAuICAqLwotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pbGluZU1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWxpbmVNYXg7Ci0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmNiTGluZSA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuY2JMaW5lOwotICAgICAgb2luZm8tPmxpbmUgPSBpaW5mby0+bGluZTsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pZG5NYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlkbk1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9kbnIgPSBpaW5mby0+ZXh0ZXJuYWxfZG5yOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlwZE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXBkTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX3BkciA9IGlpbmZvLT5leHRlcm5hbF9wZHI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXN5bU1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXN5bU1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9zeW0gPSBpaW5mby0+ZXh0ZXJuYWxfc3ltOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlvcHRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlvcHRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfb3B0ID0gaWluZm8tPmV4dGVybmFsX29wdDsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pYXV4TWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pYXV4TWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2F1eCA9IGlpbmZvLT5leHRlcm5hbF9hdXg7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pc3NNYXg7Ci0gICAgICBvaW5mby0+c3MgPSBpaW5mby0+c3M7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfZmRyID0gaWluZm8tPmV4dGVybmFsX2ZkcjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5jcmZkID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5jcmZkOwotICAgICAgb2luZm8tPmV4dGVybmFsX3JmZCA9IGlpbmZvLT5leHRlcm5hbF9yZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgYXJlIGRpc2NhcmRpbmcgYWxsIHRoZSBsb2NhbCBzeW1ib2wgaW5mb3JtYXRpb24uICBMb29rCi0JIHRocm91Z2ggdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBGRFIKLQkgb3IgYXV4IGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGMgPSBiZmRfZ2V0X3N5bWNvdW50IChvYmZkKTsKLSAgICAgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChvYmZkKTsKLSAgICAgIGZvciAoOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotCXsKLQkgIEVYVFIgZXN5bTsKLQotCSAgKCooZWNvZmZfYmFja2VuZCAob2JmZCktPmRlYnVnX3N3YXAuc3dhcF9leHRfaW4pKQotCSAgICAob2JmZCwgZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPm5hdGl2ZSwgJmVzeW0pOwotCSAgZXN5bS5pZmQgPSBpZmROaWw7Ci0JICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICgqKGVjb2ZmX2JhY2tlbmQgKG9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X291dCkpCi0JICAgIChvYmZkLCAmZXN5bSwgZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPm5hdGl2ZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlLiAgVGhlIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgaXMgc3RvcmVkIGluIHRoZQotICAgYmFja2VuZCBwb2ludGVyLiAgV2UgYWx3YXlzIHNldCB0aGUgYXJjaGl0ZWN0dXJlIGFueWhvdywgc2luY2UgbWFueQotICAgY2FsbGVycyBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIGFyY2ggPT0gZWNvZmZfYmFja2VuZCAoYWJmZCktPmFyY2g7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLV9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGludCBjOwotICBpbnQgcmV0OwotCi0gIGMgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICArK2M7Ci0KLSAgcmV0ID0gKGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpCi0JICsgYyAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCkpOwotICByZXR1cm4gQkZEX0FMSUdOIChyZXQsIDE2KTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCQkgICAgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLCBidXQgcHV0IFNFQ19BTExPQyBzZWN0aW9ucyBmaXJzdC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1lY29mZl9zb3J0X2hkcnMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqaGRyMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKChoZHIxLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXJldHVybiAxOwotICAgIH0KLSAgaWYgKGhkcjEtPnZtYSA8IGhkcjItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGhkcjEtPnZtYSA+IGhkcjItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbiwgYW5kIHNldAotICAgcmVsb2NfZmlsZXBvcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgc29mYXIsIGZpbGVfc29mYXI7Ci0gIGFzZWN0aW9uICoqc29ydGVkX2hkcnM7Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgb2xkX3NvZmFyOwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIGJvb2xlYW4gZmlyc3RfZGF0YSwgZmlyc3Rfbm9uYWxsb2M7Ci0gIGNvbnN0IGJmZF92bWEgcm91bmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQ7Ci0KLSAgc29mYXIgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGZpbGVfc29mYXIgPSBzb2ZhcjsKLQotICAvKiBTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEuICAqLwotICBzb3J0ZWRfaGRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYWJmZC0+c2VjdGlvbl9jb3VudAotCQkJCQkgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzb3J0ZWRfaGRycyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnMsIGkgPSAwOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgaSsrKQotICAgIHNvcnRlZF9oZHJzW2ldID0gY3VycmVudDsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLQotICBxc29ydCAoc29ydGVkX2hkcnMsIGFiZmQtPnNlY3Rpb25fY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCi0JIGVjb2ZmX3NvcnRfaGRycyk7Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiB0aGUgT1NGIGxpbmtlciBwdXQgdGhlIC5yZGF0YSBzZWN0aW9uIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQsIGFuZCBzb21lIGRvIG5vdC4gICovCi0gIHJkYXRhX2luX3RleHQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cmRhdGFfaW5fdGV4dDsKLSAgaWYgKHJkYXRhX2luX3RleHQpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0JICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGJyZWFrOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9SQ09OU1QpICE9IDApCi0JICAgIHsKLQkgICAgICByZGF0YV9pbl90ZXh0ID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCA9IHJkYXRhX2luX3RleHQ7Ci0KLSAgZmlyc3RfZGF0YSA9IHRydWU7Ci0gIGZpcnN0X25vbmFsbG9jID0gdHJ1ZTsKLSAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0KLSAgICAgIC8qIEZvciB0aGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdGhlIGxubm9wdHIgZmllbGQgaXMKLQkgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiAucGRhdGEgZW50cmllcyB0aGF0IGFyZQotCSByZWFsbHkgaW4gdGhlIHNlY3Rpb24uICBFYWNoIGVudHJ5IGlzIDggYnl0ZXMuICBXZSBzdG9yZSB0aGlzCi0JIGF3YXkgaW4gbGluZV9maWxlcG9zIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemUuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSA9PSAwKQotCWN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGN1cnJlbnQtPl9yYXdfc2l6ZSAvIDg7Ci0KLSAgICAgIGFsaWdubWVudF9wb3dlciA9IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcjsKLQotICAgICAgLyogT24gVWx0cml4LCB0aGUgZGF0YSBzZWN0aW9ucyBpbiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdCBiZQotCSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeSB3aXRoaW4gdGhlIGZpbGUuICBUaGlzIGRvZXMgbm90Ci0JIGFmZmVjdCB0aGUgc2VjdGlvbiBzaXplLCB0aG91Z2guICBGSVhNRTogRG9lcyB0aGlzIHdvcmsgZm9yCi0JIG90aGVyIHBsYXRmb3Jtcz8gIEl0IHJlcXVpcmVzIHNvbWUgbW9kaWZpY2F0aW9uIGZvciB0aGUKLQkgQWxwaGEsIGJlY2F1c2UgLnJkYXRhIG9uIHRoZSBBbHBoYSBnb2VzIHdpdGggdGhlIHRleHQsIG5vdAotCSB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAhIGZpcnN0X2RhdGEKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAmJiAoISByZGF0YV9pbl90ZXh0Ci0JICAgICAgfHwgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpICE9IDApCi0JICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgIT0gMAotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCXsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaXJzdF9kYXRhID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXsKLQkgIC8qIE9uIElyaXggNCwgdGhlIGxvY2F0aW9uIG9mIGNvbnRlbnRzIG9mIHRoZSAubGliIHNlY3Rpb24KLQkgICAgIGZyb20gYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uIGlzIGFsc28gcm91bmRlZCB1cCB0byBhCi0JICAgICBwYWdlIGJvdW5kYXJ5LiAgKi8KLQotCSAgc29mYXIgPSAoc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlsZV9zb2ZhciA9IChmaWxlX3NvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChmaXJzdF9ub25hbGxvYwotCSAgICAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQl7Ci0JICAvKiBTa2lwIHVwIHRvIHRoZSBuZXh0IHBhZ2UgZm9yIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24sIHN1Y2gKLSAgICAgICAgICAgICBhcyB0aGUgLmNvbW1lbnQgc2VjdGlvbiBvbiB0aGUgQWxwaGEuICBUaGlzIGxlYXZlcyByb29tCi0gICAgICAgICAgICAgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCSAgZmlyc3Rfbm9uYWxsb2MgPSBmYWxzZTsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotCi0gICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNhbWUgYm91bmRhcnkgb24KLQkgd2hpY2ggdGhleSBhcmUgYWxpZ25lZCBpbiB2aXJ0dWFsIG1lbW9yeS4gICovCi0gICAgICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgPSBCRkRfQUxJR04gKGZpbGVfc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcm91bmQ7Ci0JICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgZmlsZV9zb2ZhciArPSAoY3VycmVudC0+dm1hIC0gZmlsZV9zb2ZhcikgJSByb3VuZDsKLQl9Ci0KLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEKSkgIT0gMCkKLQljdXJyZW50LT5maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICAgICAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIG9sZF9zb2ZhciA9IHNvZmFyOwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0gICAgfQotCi0gIGZyZWUgKHNvcnRlZF9oZHJzKTsKLSAgc29ydGVkX2hkcnMgPSBOVUxMOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVsb2NzIGZvciBhbGwgdGhlIHNlY3Rpb25zIGluIHRoZQotICAgb3V0cHV0IGZpbGUsIGFzIHdlbGwgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplID0KLSAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgZmlsZV9wdHIgc3ltX2Jhc2U7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWFib3J0ICgpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmVsb2NfYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zOwotCi0gIHJlbG9jX3NpemUgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPT0gMCkKLQljdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NpemVfdHlwZSByZWxzaXplOwotCi0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IHJlbG9jX2Jhc2U7Ci0JICByZWxzaXplID0gY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgcmVsb2Nfc2l6ZSArPSByZWxzaXplOwotCSAgcmVsb2NfYmFzZSArPSByZWxzaXplOwotCX0KLSAgICB9Ci0KLSAgc3ltX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyArIHJlbG9jX3NpemU7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIGV4ZWN1dGFibGUgZmlsZSBtdXN0Ci0gICAgIGJlIGFsaWduZWQgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IElzIHRoaXMgdHJ1ZSBvbiBvdGhlcgotICAgICBwbGF0Zm9ybXM/ICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHN5bV9iYXNlID0gKChzeW1fYmFzZSArIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5yb3VuZCAtIDEpCi0JCSZ+IChlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKSk7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gc3ltX2Jhc2U7Ci0KLSAgcmV0dXJuIHJlbG9jX3NpemU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICAvKiBUaGlzIG11c3QgYmUgZG9uZSBmaXJzdCwgYmVjYXVzZSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgaXMKLSAgICAgZ29pbmcgdG8gc2V0IG91dHB1dF9oYXNfYmVndW4gdG8gdHJ1ZS4gICovCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIC5saWIgc2VjdGlvbiBzcGVjaWFsbHkgc28gdGhhdCBJcml4IDQgc2hhcmVkIGxpYnJhcmllcwotICAgICB3b3JrIG91dC4gIFNlZSBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluIGNvZmZjb2RlLmguICAqLwotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpyZWMsICpyZWNlbmQ7Ci0KLSAgICAgIHJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKLSAgICAgIHJlY2VuZCA9IHJlYyArIGNvdW50OwotICAgICAgd2hpbGUgKHJlYyA8IHJlY2VuZCkKLQl7Ci0JICArK3NlY3Rpb24tPmxtYTsKLQkgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOwotICAgIH0KLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZSBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIG5sbWNvbnYuICAqLwotCi1iZmRfdm1hCi1iZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5IHRoZQotICAgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3BfdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncF92YWx1ZTsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBncF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSByZWdpc3RlciBtYXNrcyBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIHRoZSBhc3NlbWJsZXIuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChhYmZkLCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwotICAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrOwotewotICBlY29mZl9kYXRhX3R5cGUgKnRkYXRhOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdGRhdGEgPSBlY29mZl9kYXRhIChhYmZkKTsKLSAgdGRhdGEtPmdwcm1hc2sgPSBncHJtYXNrOwotICB0ZGF0YS0+ZnBybWFzayA9IGZwcm1hc2s7Ci0gIGlmIChjcHJtYXNrICE9ICh1bnNpZ25lZCBsb25nICopIE5VTEwpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JdGRhdGEtPmNwcm1hc2tbaV0gPSBjcHJtYXNrW2ldOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IEVDT0ZGIEVYVFIgaW5mb3JtYXRpb24gZm9yIGFuIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24KLSAgIGlzIHBhc3NlZCB0byBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2dldF9leHRyIChzeW0sIGVzeW0pCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgRVhUUiAqZXN5bTsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVjb2ZmX3N5bV9wdHI7Ci0gIGJmZCAqaW5wdXRfYmZkOwotCi0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0pICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgZWNvZmZzeW1ib2wgKHN5bSktPm5hdGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIERvbid0IGluY2x1ZGUgZGVidWdnaW5nLCBsb2NhbCwgb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGVzeW0tPmptcHRibCA9IDA7Ci0gICAgICBlc3ltLT5jb2JvbF9tYWluID0gMDsKLSAgICAgIGVzeW0tPndlYWtleHQgPSAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwOwotICAgICAgZXN5bS0+cmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+aWZkID0gaWZkTmlsOwotICAgICAgLyogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIgdGhhbiB0aGlzIGZvciBzdCBhbmQgc2MuICAqLwotICAgICAgZXN5bS0+YXN5bS5zdCA9IHN0R2xvYmFsOwotICAgICAgZXN5bS0+YXN5bS5zYyA9IHNjQWJzOwotICAgICAgZXN5bS0+YXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBlc3ltLT5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZWNvZmZfc3ltX3B0ciA9IGVjb2Zmc3ltYm9sIChzeW0pOwotCi0gIGlmIChlY29mZl9zeW1fcHRyLT5sb2NhbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5wdXRfYmZkID0gYmZkX2FzeW1ib2xfYmZkIChzeW0pOwotICAoKihlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLSAgICAoaW5wdXRfYmZkLCBlY29mZl9zeW1fcHRyLT5uYXRpdmUsIGVzeW0pOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgdGhlIGxpbmtlciwgdGhlbiBlc3ltIHdpbGwgYmUKLSAgICAgdW5kZWZpbmVkIGJ1dCBzeW0gd2lsbCBub3QgYmUuICBHZXQgYSBiZXR0ZXIgY2xhc3MgZm9yIHN1Y2ggYQotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGVzeW0tPmFzeW0uc2MgPT0gc2NVbmRlZmluZWQKLSAgICAgICB8fCBlc3ltLT5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLQotICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZSBpbnB1dAotICAgICBCRkQuICAqLwotICBpZiAoZXN5bS0+aWZkICE9IC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLQotICAgICAgaW5wdXRfZGVidWcgPSAmZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGVzeW0tPmlmZCA8IGlucHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+aWZkbWFwICE9IChSRkRUICopIE5VTEwpCi0JZXN5bS0+aWZkID0gaW5wdXRfZGVidWctPmlmZG1hcFtlc3ltLT5pZmRdOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5kZXguICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIHRvCi0gICBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3NldF9pbmRleCAoc3ltLCBpbmR4KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLXsKLSAgZWNvZmZfc2V0X3N5bV9pbmRleCAoc3ltLCBpbmR4KTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEVDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gYmFja2VuZC0+cm91bmQ7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHZvaWQgKCogY29uc3QgYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKQotICAgID0gYmFja2VuZC0+YWRqdXN0X3JlbG9jX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3JlbG9jX291dDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICBiZmRfdm1hIHRleHRfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X3RleHRfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X2RhdGFfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgYnNzX3NpemU7Ci0gIFBUUiBidWZmID0gTlVMTDsKLSAgUFRSIHJlbG9jX2J1ZmYgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotICBpbnQgaTsKLQotICAvKiBEZXRlcm1pbmUgd2hlcmUgdGhlIHNlY3Rpb25zIGFuZCByZWxvY3Mgd2lsbCBnbyBpbiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICByZWxvY19zaXplID0gZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyAoYWJmZCk7Ci0KLSAgY291bnQgPSAxOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKLSAgICAgICsrY291bnQ7Ci0gICAgfQotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHRleHRfc2l6ZSA9IF9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGZhbHNlKTsKLSAgZWxzZQotICAgIHRleHRfc2l6ZSA9IDA7Ci0gIHRleHRfc3RhcnQgPSAwOwotICBzZXRfdGV4dF9zdGFydCA9IGZhbHNlOwotICBkYXRhX3NpemUgPSAwOwotICBkYXRhX3N0YXJ0ID0gMDsKLSAgc2V0X2RhdGFfc3RhcnQgPSBmYWxzZTsKLSAgYnNzX3NpemUgPSAwOwotCi0gIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYnVmZiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIGhlYWRlciwKLSAgICAgZmlsZSBoZWFkZXIsIG9yIGEub3V0IGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHNpejsKLSAgICBzaXogPSBzY25oc3o7Ci0gICAgaWYgKHNpeiA8IGZpbGhzeikKLSAgICAgIHNpeiA9IGZpbGhzejsKLSAgICBpZiAoc2l6IDwgYW91dHN6KQotICAgICAgc2l6ID0gYW91dHN6OwotICAgIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXopOwotICAgIGlmIChidWZmID09IE5VTEwpCi0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgfQotCi0gIGludGVybmFsX2YuZl9uc2NucyA9IDA7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoZmlsaHN6ICsgYW91dHN6KSwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgICsraW50ZXJuYWxfZi5mX25zY25zOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgc2l6ZW9mIHNlY3Rpb24uc19uYW1lKTsKLQotICAgICAgLyogVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0gICAgICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50KTsKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCi0Jc2VjdGlvbi5zX3ZhZGRyID0gMDsKLSAgICAgIGVsc2UKLQlzZWN0aW9uLnNfdmFkZHIgPSB2bWE7Ci0KLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKLSAgICAgIHNlY3Rpb24uc19zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQotICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIHVubG9hZGFibGUgdGhlbiB0aGUgc2NucHRyIHdpbGwgYmUgMC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykpID09IDApCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7Ci0KLSAgICAgIC8qIEZJWE1FOiB0aGUgbG5ub3B0ciBvZiB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24gb2YgYW4KLQkgb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIGFzc2VtYmxlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0bwotCSBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCByb29tIGlzIHJlcXVpcmVkIGJ5IG9iamVjdHMgb2YKLQkgdmFyaW91cyBkaWZmZXJlbnQgc2l6ZXMuICBJIHRoaW5rIHRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0JIHdhbnQgdGhlIGxpbmtlciB0byBjb21wdXRlIHRoZSBiZXN0IHNpemUgdG8gdXNlLCBvcgotCSBzb21ldGhpbmcuICBJIGRvbid0IGtub3cgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSBub3QgcHJlc2VudC4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDApCi0Jc2VjdGlvbi5zX2xubm9wdHIgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBBbHBoYSBFQ09GRiAucGRhdGEgc2VjdGlvbiB1c2VzIHRoZSBsbm5vcHRyIGZpZWxkIHRvCi0JICAgICBob2xkIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VjdGlvbiAoZWFjaCBlbnRyeSBpcwotCSAgICAgOCBieXRlcykuICBXZSBzdG9yZWQgdGhpcyBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkIGluCi0JICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICAqLwotCSAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSAwOwotICAgICAgc2VjdGlvbi5zX2ZsYWdzID0gZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKGN1cnJlbnQtPm5hbWUsCi0JCQkJCQkgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAoUFRSKSAmc2VjdGlvbiwgYnVmZikgPT0gMAotCSAgfHwgYmZkX3dyaXRlIChidWZmLCAxLCBzY25oc3osIGFiZmQpICE9IHNjbmhzeikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1RFWFQpICE9IDAKLQkgIHx8ICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICYmIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZGF0YV9pbl90ZXh0KQotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfUERBVEEKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTkFNSUMpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJQkxJU1QpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JFTERZTikgIT0gMAotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09ORkxJQwotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1RSKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5TWU0pICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0hBU0gpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0lOSVQpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1JDT05TVCkKLQl7Ci0JICB0ZXh0X3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF90ZXh0X3N0YXJ0IHx8IHRleHRfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICB0ZXh0X3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF90ZXh0X3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JEQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RBVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ4KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVDQpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfU0RBVEEpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfWERBVEEKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfR09UKSAhPSAwKQotCXsKLQkgIGRhdGFfc2l6ZSArPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGN1cnJlbnQpOwotCSAgaWYgKCEgc2V0X2RhdGFfc3RhcnQgfHwgZGF0YV9zdGFydCA+IHZtYSkKLQkgICAgewotCSAgICAgIGRhdGFfc3RhcnQgPSB2bWE7Ci0JICAgICAgc2V0X2RhdGFfc3RhcnQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfQlNTKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NCU1MpICE9IDApCi0JYnNzX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLSAgICAgIGVsc2UgaWYgKHNlY3Rpb24uc19mbGFncyA9PSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikgIT0gMAotCSAgICAgICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotCS8qIERvIG5vdGhpbmcgKi8gOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0JCi0KLSAgLyogU2V0IHVwIHRoZSBmaWxlIGhlYWRlci4gICovCi0KLSAgaW50ZXJuYWxfZi5mX21hZ2ljID0gZWNvZmZfZ2V0X21hZ2ljIChhYmZkKTsKLQotICAvKiBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5Ci0gICAgIHRpbWUgeW91IHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20KLSAgICAgc29ycnkuICBUaGlzIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbwotICAgICBpdCBjb21wYXJlcyB0aGUgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLQotICAgICBnbnVAY3lnbnVzLmNvbS4gICovCi0gIGludGVybmFsX2YuZl90aW1kYXQgPSAwOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBFQ09GRiBmX25zeW1zIGZpZWxkIGlzIG5vdCBhY3R1YWxseSB0aGUgbnVtYmVyIG9mCi0JIHN5bWJvbHMsIGl0J3MgdGhlIHNpemUgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgKi8KLSAgICAgIGludGVybmFsX2YuZl9uc3ltcyA9IGV4dGVybmFsX2hkcl9zaXplOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSAwOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgfQotCi0gIGludGVybmFsX2YuZl9vcHRoZHIgPSBhb3V0c3o7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gRl9MTk5POwotICBpZiAocmVsb2Nfc2l6ZSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotCi0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOwotICBlbHNlCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7Ci0KLSAgLyogU2V0IHVwIHRoZSBgYG9wdGlvbmFsJycgaGVhZGVyLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfWk1BR0lDOwotICBlbHNlCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfT01BR0lDOwotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIHJlYWxseSBjb3JyZWN0PyAgKi8KLSAgaW50ZXJuYWxfYS52c3RhbXAgPSBzeW1oZHItPnZzdGFtcDsKLQotICAvKiBBdCBsZWFzdCBvbiBVbHRyaXgsIHRoZXNlIGhhdmUgdG8gYmUgcm91bmRlZCB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9ICh0ZXh0X3NpemUgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gdGV4dF9zdGFydCAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZHNpemUgPSAoZGF0YV9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQ7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gZGF0YV9zaXplOwotICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gZGF0YV9zdGFydDsKLSAgICB9Ci0KLSAgLyogT24gVWx0cml4LCB0aGUgaW5pdGlhbCBwb3J0aW9ucyBvZiB0aGUgLnNic3MgYW5kIC5ic3Mgc2VnbWVudHMKLSAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSBic2l6ZSBmaWVsZCBpbiB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIHJlY29yZHMgaG93IG1hbnkgYnNzIGJ5dGVzIGFyZSByZXF1aXJlZCBiZXlvbmQKLSAgICAgdGhvc2UgaW4gdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSB2YWx1ZSBpcyBub3Qgcm91bmRlZCB0byBhIHBhZ2UKLSAgICAgYm91bmRhcnkuICAqLwotICBpZiAoYnNzX3NpemUgPCBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplKQotICAgIGJzc19zaXplID0gMDsKLSAgZWxzZQotICAgIGJzc19zaXplIC09IGludGVybmFsX2EuZHNpemUgLSBkYXRhX3NpemU7Ci0gIGludGVybmFsX2EuYnNpemUgPSBic3Nfc2l6ZTsKLSAgaW50ZXJuYWxfYS5ic3Nfc3RhcnQgPSBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgKyBpbnRlcm5hbF9hLmRzaXplOwotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGludGVybmFsX2EuZ3BfdmFsdWUgPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0KLSAgaW50ZXJuYWxfYS5ncHJtYXNrID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwcm1hc2s7Ci0gIGludGVybmFsX2EuZnBybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5mcHJtYXNrOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIGludGVybmFsX2EuY3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrW2ldOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBhZGp1c3QgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKQotICAgIHsKLSAgICAgIGlmICghICgqYmFja2VuZC0+YWRqdXN0X2hlYWRlcnMpIChhYmZkLCAmaW50ZXJuYWxfZiwgJmludGVybmFsX2EpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2YsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgYnVmZik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGFvdXRzeiwgYWJmZCkgIT0gYW91dHN6KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLSAgICAgd3JpdGluZyBvdXQgdGhlIHJlbG9jcyBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgV2UKLSAgICAgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIEJGRCB3YXMgY3JlYXRlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIsCi0gICAgIHNpbmNlIGl0IHdpbGwgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCi0gIGlmICghIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIpCi0gICAgewotICAgICAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLSAgICAgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9leHQgPSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgICAgIGlmIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICAoKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgPT0gMCkKLQkJCQkgICAgICA/IHRydWUgOiBmYWxzZSksCi0JCQkJICAgICBlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KQotCSAgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0JewotCSAgYXJlbGVudCAqKnJlbG9jX3B0cl9wdHI7Ci0JICBhcmVsZW50ICoqcmVsb2NfZW5kOwotCSAgY2hhciAqb3V0X3B0cjsKLQotCSAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxvY19idWZmID0KLQkgICAgYmZkX2FsbG9jIChhYmZkLCBjdXJyZW50LT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpOwotCSAgaWYgKHJlbG9jX2J1ZmYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHJlbG9jX3B0cl9wdHIgPSBjdXJyZW50LT5vcmVsb2NhdGlvbjsKLQkgIHJlbG9jX2VuZCA9IHJlbG9jX3B0cl9wdHIgKyBjdXJyZW50LT5yZWxvY19jb3VudDsKLQkgIG91dF9wdHIgPSAoY2hhciAqKSByZWxvY19idWZmOwotCSAgZm9yICg7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIgPCByZWxvY19lbmQ7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIrKywgb3V0X3B0ciArPSBleHRlcm5hbF9yZWxvY19zaXplKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcmVsb2M7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbjsKLQkgIAotCSAgICAgIG1lbXNldCAoKFBUUikgJmluLCAwLCBzaXplb2YgaW4pOwotCi0JICAgICAgcmVsb2MgPSAqcmVsb2NfcHRyX3B0cjsKLQkgICAgICBzeW0gPSAqcmVsb2MtPnN5bV9wdHJfcHRyOwotCi0JICAgICAgaW4ucl92YWRkciA9IChyZWxvYy0+YWRkcmVzcwotCQkJICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCkpOwotCSAgICAgIGluLnJfdHlwZSA9IHJlbG9jLT5ob3d0by0+dHlwZTsKLQotCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJewotCQkgIGluLnJfc3ltbmR4ID0gZWNvZmZfZ2V0X3N5bV9pbmRleCAoKnJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JCSAgaW4ucl9leHRlcm4gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQkJICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKkFCUyoiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmNvbnN0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgaW4ucl9leHRlcm4gPSAwOwotCQl9Ci0KLQkgICAgICAoKmFkanVzdF9yZWxvY19vdXQpIChhYmZkLCByZWxvYywgJmluKTsKLQotCSAgICAgICgqc3dhcF9yZWxvY19vdXQpIChhYmZkLCAmaW4sIChQVFIpIG91dF9wdHIpOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfd3JpdGUgKHJlbG9jX2J1ZmYsCi0JCQkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgY3VycmVudC0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGN1cnJlbnQtPnJlbG9jX2NvdW50KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLQkgIHJlbG9jX2J1ZmYgPSBOVUxMOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLQl7Ci0JICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MpCi0JICAgICAgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIC5ic3Mgc2VjdGlvbiBvZiBhIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlIG11c3QgcmVjZWl2ZSBhbgotICAgICBlbnRpcmUgcGFnZS4gIElmIHRoZXJlIGFyZSBzeW1ib2xzLCB0aGUgc3ltYm9scyB3aWxsIHN0YXJ0IG9uIHRoZQotICAgICBuZXh0IHBhZ2UuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgd2UgbXVzdCBmaWxsIG91dCB0aGUgcGFnZSBieQotICAgICBoYW5kLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSA9PSAwKQotCWMgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyAtIDEsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogQXJjaGl2ZSBoYW5kbGluZy4gIEVDT0ZGIHVzZXMgd2hhdCBhcHBlYXJzIHRvIGJlIGEgdW5pcXVlIHR5cGUgb2YKLSAgIGFyY2hpdmUgaGVhZGVyIChhcm1hcCkuICBUaGUgYnl0ZSBvcmRlcmluZyBvZiB0aGUgYXJtYXAgYW5kIHRoZQotICAgY29udGVudHMgYXJlIGVuY29kZWQgaW4gdGhlIG5hbWUgb2YgdGhlIGFybWFwIGl0c2VsZi4gIEF0IGxlYXN0IGZvcgotICAgbm93LCB3ZSBvbmx5IHN1cHBvcnQgYXJjaGl2ZXMgd2l0aCB0aGUgc2FtZSBieXRlIG9yZGVyaW5nIGluIHRoZQotICAgYXJtYXAgYW5kIHRoZSBjb250ZW50cy4KLQotICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgaW4gdGhlIGFybWFwIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbAotICAgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KLQotICAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUgc3ltYm9sIGRlZmluaXRpb25zLiAgRWFjaCBzeW1ib2wgZGVmaW5pdGlvbgotICAgb2NjdXBpZXMgOCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFyZSB0aGUgb2Zmc2V0IGZyb20gdGhlCi0gICBzdGFydCBvZiB0aGUgYXJtYXAgc3RyaW5ncyB0byB0aGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBuYW1pbmcKLSAgIHRoaXMgc3ltYm9sLiAgVGhlIHNlY29uZCBmb3VyIGJ5dGVzIGFyZSB0aGUgZmlsZSBvZmZzZXQgdG8gdGhlCi0gICBhcmNoaXZlIG1lbWJlciB3aGljaCBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgSWYgdGhlIHNlY29uZCBmb3VyIGJ5dGVzCi0gICBhcmUgMCwgdGhlbiB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBkZWZpbml0aW9uLCBhbmQgaXQgc2hvdWxkCi0gICBiZSBpZ25vcmVkLgotCi0gICBUaGUgc3ltYm9scyBhcmUgaGFzaGVkIGludG8gdGhlIGFybWFwIHdpdGggYSBjbG9zZWQgaGFzaGluZyBzY2hlbWUuCi0gICBTZWUgdGhlIGZ1bmN0aW9ucyBiZWxvdyBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KLQotICAgQWZ0ZXIgdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBjb21lcyBmb3VyIGJ5dGVzIGhvbGRpbmcgdGhlIHNpemUgb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgdGFibGUgaXRzZWxmLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBoZWFkZXJzIGxvb2tzIGxpa2UgdGhpczoKLSAgIF9fX19fX19fX19FW0JMXUVbQkxdXyAod2l0aCBhIHRyYWlsaW5nIHNwYWNlKS4KLSAgIFRoZSB0cmFpbGluZyBzcGFjZSBpcyBjaGFuZ2VkIHRvIGFuIFggaWYgdGhlIGFyY2hpdmUgaXMgY2hhbmdlZCB0bwotICAgaW5kaWNhdGUgdGhhdCB0aGUgYXJtYXAgaXMgb3V0IG9mIGRhdGUuCi0KLSAgIFRoZSBBbHBoYSBzZWVtcyB0byB1c2UgX19fX19fX182NEVbQkxdRVtCTF1fLiAgKi8KLQotI2RlZmluZSBBUk1BUF9CSUdfRU5ESUFOICdCJwotI2RlZmluZSBBUk1BUF9MSVRUTEVfRU5ESUFOICdMJwotI2RlZmluZSBBUk1BUF9NQVJLRVIgJ0UnCi0jZGVmaW5lIEFSTUFQX1NUQVJUX0xFTkdUSCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYIDEwCi0jZGVmaW5lIEFSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVggMTEKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWCAxMgotI2RlZmluZSBBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYIDEzCi0jZGVmaW5lIEFSTUFQX0VORF9JTkRFWCAxNAotI2RlZmluZSBBUk1BUF9FTkQgIl8gIgotCi0vKiBUaGlzIGlzIGEgbWFnaWMgbnVtYmVyIHVzZWQgaW4gdGhlIGhhc2hpbmcgYWxnb3JpdGhtLiAgKi8KLSNkZWZpbmUgQVJNQVBfSEFTSF9NQUdJQyAweDlkZDY4YWI1Ci0KLS8qIFRoaXMgcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSB0byB1c2UgZm9yIGEgc3RyaW5nLiAgSXQgYWxzbyBzZXRzCi0gICAqUkVIQVNIIHRvIHRoZSByZWhhc2ggYWRqdXN0bWVudCBpZiB0aGUgZmlyc3Qgc2xvdCBpcyB0YWtlbi4gIFNJWkUKLSAgIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIEhMT0cgaXMgdGhlIGxvZwotICAgYmFzZSAyIG9mIFNJWkUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lY29mZl9hcm1hcF9oYXNoIChzLCByZWhhc2gsIHNpemUsIGhsb2cpCi0gICAgIENPTlNUIGNoYXIgKnM7Ci0gICAgIHVuc2lnbmVkIGludCAqcmVoYXNoOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgdW5zaWduZWQgaW50IGhsb2c7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChobG9nID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2ggPSAqcysrOwotICB3aGlsZSAoKnMgIT0gJ1wwJykKLSAgICBoYXNoID0gKChoYXNoID4+IDI3KSB8IChoYXNoIDw8IDUpKSArICpzKys7Ci0gIGhhc2ggKj0gQVJNQVBfSEFTSF9NQUdJQzsKLSAgKnJlaGFzaCA9IChoYXNoICYgKHNpemUgLSAxKSkgfCAxOwotICByZXR1cm4gaGFzaCA+PiAoMzIgLSBobG9nKTsKLX0KLQotLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBwYXJzZWRfc2l6ZTsKLSAgY2hhciAqcmF3X2FybWFwOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGNoYXIgKnJhd19wdHI7Ci0gIHN0cnVjdCBzeW1kZWYgKnN5bWRlZl9wdHI7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIAotICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0xNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElyaXggNC4wLjVGIGFwcGFyZW50bHkgY2FuIHVzZSBlaXRoZXIgYW4gRUNPRkYgYXJtYXAgb3IgYQotICAgICBzdGFuZGFyZCBDT0ZGIGFybWFwLiAgV2UgY291bGQgbW92ZSB0aGUgRUNPRkYgYXJtYXAgc3R1ZmYgaW50bwotICAgICBiZmRfc2x1cnBfYXJtYXAsIGJ1dCB0aGF0IHNlZW1zIGluYXBwcm9wcmlhdGUgc2luY2Ugbm8gb3RoZXIKLSAgICAgdGFyZ2V0IHVzZXMgdGhpcyBmb3JtYXQuICBJbnN0ZWFkLCB3ZSBjaGVjayBkaXJlY3RseSBmb3IgYSBDT0ZGCi0gICAgIGFybWFwLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOwotCi0gIC8qIFNlZSBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0LAotCSAgICAgICBBUk1BUF9TVEFSVF9MRU5HVEgpICE9IDAKLSAgICAgIHx8IG5leHRuYW1lW0FSTUFQX0hFQURFUl9NQVJLRVJfSU5ERVhdICE9IEFSTUFQX01BUktFUgotICAgICAgfHwgKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0JJR19FTkRJQU4KLQkgICYmIG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0xJVFRMRV9FTkRJQU4pCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgc3RybmNtcCAobmV4dG5hbWUgKyBBUk1BUF9FTkRfSU5ERVgsCi0JCSAgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgYnl0ZSBvcmRlcmluZy4gICovCi0gIGlmICgoKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0gICAgICAgXiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkpCi0gICAgICB8fCAoKG5leHRuYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0JICBeIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotICBhcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgIAotICByYXdfYXJtYXAgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgYXJkYXRhLT50ZGF0YSA9IChQVFIpIHJhd19hcm1hcDsKLQotICBjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IDA7Ci0gIGFyZGF0YS0+Y2FjaGUgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7Ci0KLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gb3ZlcmxheSB0aGUgc3ltZGVmcyBvdmVyIHRoZSByYXcgYXJjaGl2ZSBkYXRhLAotICAgICBidXQgdGhhdCBkb2Vzbid0IHdvcmsgb24gYSA2NCBiaXQgaG9zdC4gICovCi0KLSAgc3RyaW5nYmFzZSA9IHJhd19hcm1hcCArIGNvdW50ICogOCArIDg7Ci0KLSNpZmRlZiBDSEVDS19BUk1BUF9IQVNICi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaGxvZzsKLQotICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IEkgaGF2ZSB0aGUgaGFzaGluZyBhbGdvcml0aG0gcmlnaHQgYnkgbWFraW5nCi0gICAgICAgc3VyZSB0aGF0IGV2ZXJ5IHN5bWJvbCBjYW4gYmUgbG9va2VkIHVwIHN1Y2Nlc3NmdWxseS4gICovCi0gICAgaGxvZyA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpIDw8PSAxKQotICAgICAgaGxvZysrOwotICAgIEJGRF9BU1NFUlQgKGkgPT0gY291bnQpOwotCi0gICAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCXVuc2lnbmVkIGludCBoYXNoLCByZWhhc2gsIHNyY2g7Ci0gICAgICAKLQluYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0JZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotCWlmIChmaWxlX29mZnNldCA9PSAwKQotCSAgY29udGludWU7Ci0JaGFzaCA9IGVjb2ZmX2FybWFwX2hhc2ggKHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldCwgJnJlaGFzaCwgY291bnQsCi0JCQkJIGhsb2cpOwotCWlmIChoYXNoID09IGkpCi0JICBjb250aW51ZTsKLQotCS8qIFNlZSBpZiB3ZSBjYW4gcmVoYXNoIHRvIHRoaXMgbG9jYXRpb24uICAqLwotCWZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChjb3VudCAtIDEpOwotCSAgICAgc3JjaCAhPSBoYXNoICYmIHNyY2ggIT0gaTsKLQkgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKSkKLQkgIEJGRF9BU1NFUlQgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19hcm1hcCArIDggKyBzcmNoICogOCkpCi0JCSAgICAgICE9IDApOwotCUJGRF9BU1NFUlQgKHNyY2ggPT0gaSk7Ci0gICAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIENIRUNLX0FSTUFQX0hBU0ggKi8KLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKSAhPSAwKQotICAgICAgKythcmRhdGEtPnN5bWRlZl9jb3VudDsKLQotICBzeW1kZWZfcHRyID0gKChzdHJ1Y3Qgc3ltZGVmICopCi0JCWJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc3ltZGVmKSkpOwotICBpZiAoIXN5bWRlZl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgc3ltZGVmX3B0cjsKLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCi0gICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIG5hbWVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSByYXdfcHRyKTsKLSAgICAgIHN5bWRlZl9wdHItPnMubmFtZSA9IHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldDsKLSAgICAgIHN5bWRlZl9wdHItPmZpbGVfb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7Ci0gICAgICArK3N5bWRlZl9wdHI7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICUgMjsKLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoc2l6ZSwgaGFzaGxvZzsKLSAgdW5zaWduZWQgaW50IHN5bWRlZnNpemU7Ci0gIGludCBwYWRpdDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplOwotICBmaWxlX3B0ciBmaXJzdHJlYWw7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX2J5dGUgKmhhc2h0YWJsZTsKLSAgYmZkICpjdXJyZW50OwotICBiZmQgKmxhc3RfZWx0OwotCi0gIC8qIFVsdHJpeCBhcHBlYXJzIHRvIHVzZSBhcyBhIGhhc2ggdGFibGUgc2l6ZSB0aGUgbGVhc3QgcG93ZXIgb2YgdHdvCi0gICAgIGdyZWF0ZXIgdGhhbiB0d2ljZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotICBmb3IgKGhhc2hsb2cgPSAwOyAoKHVuc2lnbmVkIGludCkgMSA8PCBoYXNobG9nKSA8PSAyICogb3JsX2NvdW50OyBoYXNobG9nKyspCi0gICAgOwotICBoYXNoc2l6ZSA9IDEgPDwgaGFzaGxvZzsKLQotICBzeW1kZWZzaXplID0gaGFzaHNpemUgKiA4OwotICBwYWRpdCA9IHN0cmlkeCAlIDI7Ci0gIHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLQotICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgc3ltZGVmc2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCi0gIG1hcHNpemUgPSBzeW1kZWZzaXplICsgc3RyaW5nc2l6ZSArIDg7Ci0KLSAgZmlyc3RyZWFsID0gU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIG1hcHNpemUgKyBlbGVuZ3RoOwotCi0gIG1lbXNldCAoKFBUUikgJmhkciwgMCwgc2l6ZW9mIGhkcik7Ci0KLSAgLyogV29yayBvdXQgdGhlIEVDT0ZGIGFybWFwIG5hbWUuICAqLwotICBzdHJjcHkgKGhkci5hcl9uYW1lLCBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJtYXBfc3RhcnQpOwotICBoZHIuYXJfbmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX0VORElBTl9JTkRFWF0gPQotICAgIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpCi0gICAgID8gQVJNQVBfQklHX0VORElBTgotICAgICA6IEFSTUFQX0xJVFRMRV9FTkRJQU4pOwotICBoZHIuYXJfbmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEFSTUFQX0JJR19FTkRJQU4gOiBBUk1BUF9MSVRUTEVfRU5ESUFOOwotICBtZW1jcHkgKGhkci5hcl9uYW1lICsgQVJNQVBfRU5EX0lOREVYLCBBUk1BUF9FTkQsIHNpemVvZiBBUk1BUF9FTkQgLSAxKTsKLQotICAvKiBXcml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdAotICAgICBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwKLSAgICAgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUuICBBY3R1YWxseSwgdGhlIFVsdHJpeAotICAgICBsaW5rZXIganVzdCBjaGVja3MgdGhlIGFyY2hpdmUgbmFtZTsgdGhlIEdOVSBsaW5rZXIgbWF5IGNoZWNrIHRoZQotICAgICBkYXRlLiAgKi8KLSAgc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgKHN0YXRidWYuc3RfbXRpbWUgKyA2MCkpOwotCi0gIC8qIFRoZSBERUNzdGF0aW9uIHVzZXMgemVyb2VzIGZvciB0aGUgdWlkLCBnaWQgYW5kIG1vZGUgb2YgdGhlCi0gICAgIGFybWFwLiAgKi8KLSAgaGRyLmFyX3VpZFswXSA9ICcwJzsKLSAgaGRyLmFyX2dpZFswXSA9ICcwJzsKLSNpZiAwCi0gIGhkci5hcl9tb2RlWzBdID0gJzAnOwotI2Vsc2UKLSAgLyogQnVpbGRpbmcgZ2NjIGVuZHMgdXAgZXh0cmFjdGluZyB0aGUgYXJtYXAgYXMgYSBmaWxlIC0gdHdpY2UuICovCi0gIGhkci5hcl9tb2RlWzBdID0gJzYnOwotICBoZHIuYXJfbW9kZVsxXSA9ICc0JzsKLSAgaGRyLmFyX21vZGVbMl0gPSAnNCc7Ci0jZW5kaWYKLQotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0KLSAgaGRyLmFyX2ZtYWdbMF0gPSAnYCc7Ci0gIGhkci5hcl9mbWFnWzFdID0gJ1wwMTInOwotCi0gIC8qIFR1cm4gYWxsIG51bGwgYnl0ZXMgaW4gdGhlIGhlYWRlciBpbnRvIHNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICBpZiAoKChjaGFyICopKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAoKChjaGFyICopKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGhhc2hzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBoYXNodGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc3ltZGVmc2l6ZSk7Ci0gIGlmICghaGFzaHRhYmxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotCi0gICAgICAvKiBBZHZhbmNlIGZpcnN0cmVhbCB0byB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGlzIGFyY2hpdmUKLQkgZWxlbWVudC4gICovCi0gICAgICBpZiAoKChiZmQgKikgbWFwW2ldLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgbWFwW2ldLnBvcyk7Ci0JfQotCi0gICAgICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoICgqbWFwW2ldLm5hbWUsICZyZWhhc2gsIGhhc2hzaXplLCBoYXNobG9nKTsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IHNyY2g7Ci0KLQkgIC8qIFRoZSBkZXNpcmVkIHNsb3QgaXMgYWxyZWFkeSB0YWtlbi4gICovCi0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoaGFzaHNpemUgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSkpCi0JICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCkpID09IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgIEJGRF9BU1NFUlQgKHNyY2ggIT0gaGFzaCk7Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQkKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIG1hcFtpXS5uYW1pZHgsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDgpKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGZpcnN0cmVhbCwKLQkJICAgIChQVFIpIChoYXNodGFibGUgKyBoYXNoICogOCArIDQpKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaGFzaHRhYmxlLCAxLCBzeW1kZWZzaXplLCBhYmZkKSAhPSBzeW1kZWZzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgaGFzaHRhYmxlKTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIHN0cmluZ3MuICAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJpbmdzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuICgqbWFwW2ldLm5hbWUpICsgMTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICgqbWFwW2ldLm5hbWUpLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIERFQ3N0YXRpb24gYXIgd2UgdXNlIGEgbnVsbC4gICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgd2hldGhlciB0aGlzIEJGRCBpcyBhbiBhcmNoaXZlLiAgSWYgaXQgaXMsIHJlYWQgaW4gdGhlIGFybWFwCi0gICBhbmQgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZWNvZmZfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICp0ZGF0YV9ob2xkOwotICBjaGFyIGFybWFnW1NBUk1BRyArIDFdOwotCi0gIHRkYXRhX2hvbGQgPSBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGE7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBhcm1hZywgMSwgU0FSTUFHLCBhYmZkKSAhPSBTQVJNQUcpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChhcm1hZywgQVJNQUcsIFNBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBTQVJNQUc7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7Ci0gIAotICBpZiAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkgPT0gZmFsc2UKLSAgICAgIHx8IF9iZmRfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0gICAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotDAotLyogRUNPRkYgbGlua2VyIGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBQVFIsIGNoYXIgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmFiZmQgPSBOVUxMOwotICAgICAgcmV0LT53cml0dGVuID0gMDsKLSAgICAgIHJldC0+c21hbGwgPSAwOwotICAgIH0KLSAgbWVtc2V0ICgoUFRSKSAmcmV0LT5lc3ltLCAwLCBzaXplb2YgcmV0LT5lc3ltKTsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBlY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBlY29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2l2ZW4gYW4gRUNPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBUaGlzIGxvb2tzIHRocm91Z2ggdGhlIHVuZGVmaW5lZCBzeW1ib2xzLCBsb29rcyBlYWNoIG9uZSB1cCBpbiB0aGUKLSAgIGFyY2hpdmUgaGFzaCB0YWJsZSwgYW5kIGFkZHMgYW55IGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QKLSAgIHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2UgRUNPRkYgYXJjaGl2ZXMKLSAgIGFscmVhZHkgaGF2ZSBhIGhhc2ggdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBjb25zdHJ1Y3QKLSAgIGFub3RoZXIgb25lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX2J5dGUgKnJhd19hcm1hcDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9jb3VudDsKLSAgdW5zaWduZWQgaW50IGFybWFwX2xvZzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ2Jhc2U7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHJhdyBkYXRhIGZvciB0aGlzIGFyY2hpdmUsIGFzIGNhbiBoYXBwZW4gb24KLSAgICAgSXJpeCA0LjAuNUYsIHdlIGNhbGwgdGhlIGdlbmVyaWMgcm91dGluZS4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBiZSBtb3JlIGNsZXZlciBhYm91dCB0aGlzLCBzaW5jZSBzb21lZGF5IHRkYXRhCi0gICAgIG1heSBnZXQgdG8gc29tZXRoaW5nIGZvciBhIGdlbmVyaWMgYXJjaGl2ZS4gICovCi0gIHJhd19hcm1hcCA9IChjb25zdCBiZmRfYnl0ZSAqKSBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGE7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgIChhYmZkLCBpbmZvLCBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpOwotCi0gIGFybWFwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXApOwotCi0gIGFybWFwX2xvZyA9IDA7Ci0gIGZvciAoaSA9IDE7IGkgPCBhcm1hcF9jb3VudDsgaSA8PD0gMSkKLSAgICBhcm1hcF9sb2crKzsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhcm1hcF9jb3VudCk7Ci0KLSAgaGFzaHRhYmxlID0gcmF3X2FybWFwICsgNDsKLSAgc3RyaW5nYmFzZSA9IChjb25zdCBjaGFyICopIHJhd19hcm1hcCArIGFybWFwX2NvdW50ICogOCArIDg7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgcHVuZGVmID0gJmluZm8tPmhhc2gtPnVuZGVmczsKLSAgd2hpbGUgKCpwdW5kZWYgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotICAgICAgdW5zaWduZWQgaW50IGZpbGVfb2Zmc2V0OwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZCAqZWxlbWVudDsKLQotICAgICAgaCA9ICpwdW5kZWY7Ci0KLSAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQotCSB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcwotCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgotCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKLQkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKLQkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOYXRpdmUgRUNPRkYgbGlua2VycyBkbyBub3QgcHVsbCBpbiBhcmNoaXZlIGVsZW1lbnRzIG1lcmVseQotCSB0byBzYXRpc2Z5IGNvbW1vbiBkZWZpbml0aW9ucywgc28gbmVpdGhlciBkbyB3ZS4gIFdlIGxlYXZlCi0JIHRoZW0gb24gdGhlIGxpc3QsIHRob3VnaCwgaW4gY2FzZSB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IHNvbWUKLQkgb3RoZXIgb2JqZWN0IGZvcm1hdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChoLT5yb290LnN0cmluZywgJnJlaGFzaCwgYXJtYXBfY291bnQsCi0JCQkgICAgICAgYXJtYXBfbG9nKTsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhhc2h0YWJsZSArIChoYXNoICogOCkgKyA0KTsKLSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCXsKLQkgIC8qIE5vdGhpbmcgaW4gdGhpcyBzbG90LiAgKi8KLQkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpKTsKLSAgICAgIGlmIChuYW1lWzBdICE9IGgtPnJvb3Quc3RyaW5nWzBdCi0JICB8fCBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCSAgYm9vbGVhbiBmb3VuZDsKLQotCSAgLyogVGhhdCB3YXMgdGhlIHdyb25nIHN5bWJvbC4gIFRyeSByZWhhc2hpbmcuICAqLwotCSAgZm91bmQgPSBmYWxzZTsKLQkgIGZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChhcm1hcF9jb3VudCAtIDEpOwotCSAgICAgICBzcmNoICE9IGhhc2g7Ci0JICAgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKSkKLQkgICAgewotCSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCk7Ci0JICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JCWJyZWFrOwotCSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpKTsKLQkgICAgICBpZiAobmFtZVswXSA9PSBoLT5yb290LnN0cmluZ1swXQotCQkgICYmIHN0cmNtcCAobmFtZSwgaC0+cm9vdC5zdHJpbmcpID09IDApCi0JCXsKLQkJICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBmb3VuZCkKLQkgICAgewotCSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaGFzaCA9IHNyY2g7Ci0JfQotCi0gICAgICBlbGVtZW50ID0gKCpiYWNrZW5kLT5nZXRfZWx0X2F0X2ZpbGVwb3MpIChhYmZkLCBmaWxlX29mZnNldCk7Ci0gICAgICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGtub3cgdGhhdCB0aGlzIGVsZW1lbnQgcHJvdmlkZXMKLQkgYSBkZWZpbml0aW9uIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCB3ZSBrbm93IHRoYXQgd2Ugd2FudAotCSB0byBpbmNsdWRlIGl0LiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhbnl0aGluZy4gICovCi0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGVsZW1lbnQsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChlbGVtZW50LCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSB1c2VkIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgIGJlY2F1c2Ugd2Ugd2VyZSBub3QgZGVhbGluZyB3aXRoIGFuIEVDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luOwotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgY2hhciAqZXh0X3B0cjsKLSAgY2hhciAqZXh0X2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgZXh0ZXJuYWwgc3RyaW5ncy4gICovCi0gIGV4dGVybmFsX2V4dF9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkgIT0KLQkgIChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIHRvIHNlZSBpZiB0aGV5IGRlZmluZSBzb21lCi0gICAgIHN5bWJvbCB0aGF0IGlzIGN1cnJlbnRseSB1bmRlZmluZWQuICAqLwotICBleHRfcHRyID0gKGNoYXIgKikgZXh0ZXJuYWxfZXh0OwotICBleHRfZW5kID0gZXh0X3B0ciArIGVzaXplOwotICBmb3IgKDsgZXh0X3B0ciA8IGV4dF9lbmQ7IGV4dF9wdHIgKz0gZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgewotICAgICAgRVhUUiBlc3ltOwotICAgICAgYm9vbGVhbiBkZWY7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBleHRfcHRyLCAmZXN5bSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHN5bWJvbCBkZWZpbmVzIHNvbWV0aGluZy4gICovCi0gICAgICBpZiAoZXN5bS5hc3ltLnN0ICE9IHN0R2xvYmFsCi0JICAmJiBlc3ltLmFzeW0uc3QgIT0gc3RMYWJlbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0UHJvYykKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWNhc2Ugc2NUZXh0OgotCWNhc2Ugc2NEYXRhOgotCWNhc2Ugc2NCc3M6Ci0JY2FzZSBzY0FiczoKLQljYXNlIHNjU0RhdGE6Ci0JY2FzZSBzY1NCc3M6Ci0JY2FzZSBzY1JEYXRhOgotCWNhc2Ugc2NDb21tb246Ci0JY2FzZSBzY1NDb21tb246Ci0JY2FzZSBzY0luaXQ6Ci0JY2FzZSBzY0Zpbmk6Ci0JY2FzZSBzY1JDb25zdDoKLQkgIGRlZiA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGVmID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRlZikKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogVW5saWtlIHRoZSBnZW5lcmljIGxpbmtlciwgd2UgZG8gbm90IHB1bGwgaW4gZWxlbWVudHMgYmVjYXVzZQotCSBvZiBjb21tb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgLyogSW5jbHVkZSB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyAoYWJmZCwgaW5mbywgZXh0ZXJuYWxfZXh0LCBzc2V4dCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLSAgICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0gICAgfQotCi0gc3VjY2Vzc2Z1bF9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVDT0ZGIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0KLSAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBlc2l6ZSA9IHN5bWhkci0+aWV4dE1heCAqIGV4dGVybmFsX2V4dF9zaXplOwotICBleHRlcm5hbF9leHQgPSAoUFRSKSBiZmRfbWFsbG9jIChlc2l6ZSk7Ci0gIGlmIChleHRlcm5hbF9leHQgPT0gTlVMTCAmJiBlc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYkV4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9leHQsIDEsIGVzaXplLCBhYmZkKSAhPSBlc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzc2V4dCA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN5bWhkci0+aXNzRXh0TWF4KTsKLSAgaWYgKHNzZXh0ID09IE5VTEwgJiYgc3ltaGRyLT5pc3NFeHRNYXggIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JTc0V4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoc3NleHQsIDEsIHN5bWhkci0+aXNzRXh0TWF4LCBhYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIHN5bWhkci0+aXNzRXh0TWF4KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZXN1bHQgPSBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpOwotCi0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyCi0gICBoYXNoIHRhYmxlLiAgVGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3Mgd2UgYXJlIHBhc3NlZCBhcmUKLSAgIGp1c3QgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHdpbGwgYmUgZGlzY2FyZGVkLiAgV2UgbXVzdAotICAgZXhwbGljaXRseSBzYXZlIGFueSBpbmZvcm1hdGlvbiB3ZSBtYXkgbmVlZCBsYXRlciBvbiBpbiB0aGUgbGluay4KLSAgIFdlIGRvIG5vdCB3YW50IHRvIHJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIFBUUiBleHRlcm5hbF9leHQ7Ci0gICAgIGNoYXIgKnNzZXh0OwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgZXh0X2NvdW50ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dF9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKCFzeW1faGFzaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzID0gc3ltX2hhc2g7Ci0KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBleHRfY291bnQgKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplLCBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTa2lwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnN0KQotCXsKLQljYXNlIHN0R2xvYmFsOgotCWNhc2Ugc3RTdGF0aWM6Ci0JY2FzZSBzdExhYmVsOgotCWNhc2Ugc3RQcm9jOgotCWNhc2Ugc3RTdGF0aWNQcm9jOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNraXAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2tpcCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgdmFsdWUgPSBlc3ltLmFzeW0udmFsdWU7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zYykKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIHNjTmlsOgotCWNhc2Ugc2NSZWdpc3RlcjoKLQljYXNlIHNjQ2RiTG9jYWw6Ci0JY2FzZSBzY0JpdHM6Ci0JY2FzZSBzY0NkYlN5c3RlbToKLQljYXNlIHNjUmVnSW1hZ2U6Ci0JY2FzZSBzY0luZm86Ci0JY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0JY2FzZSBzY1ZhcjoKLQljYXNlIHNjVmFyUmVnaXN0ZXI6Ci0JY2FzZSBzY1ZhcmlhbnQ6Ci0JY2FzZSBzY0Jhc2VkVmFyOgotCWNhc2Ugc2NYRGF0YToKLQljYXNlIHNjUERhdGE6Ci0JICBzZWN0aW9uID0gTlVMTDsKLQkgIGJyZWFrOwotCWNhc2Ugc2NUZXh0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjQWJzOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjU0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjU0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0NvbW1vbjoKLQkgIGlmICh2YWx1ZSA+IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBzY1NDb21tb246Ci0JICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5uYW1lID0gU0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbF9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgIH0KLQkgIHNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NVbmRlZmluZWQ6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NJbml0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRmluaToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JDb25zdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3NleHQgKyBlc3ltLmFzeW0uaXNzOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsCi0JICAgICAgZXN5bS53ZWFrZXh0ID8gQlNGX1dFQUsgOiBCU0ZfR0xPQkFMLAotCSAgICAgIHNlY3Rpb24sIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLCB0cnVlLCB0cnVlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBidWlsZGluZyBhbiBFQ09GRiBoYXNoIHRhYmxlLCBzYXZlIHRoZSBleHRlcm5hbAotCSBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLQl7Ci0JICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwKLQkgICAgICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKQotCQkgICAgICB8fCAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkpKQotCSAgICB7Ci0JICAgICAgaC0+YWJmZCA9IGFiZmQ7Ci0JICAgICAgaC0+ZXN5bSA9IGVzeW07Ci0JICAgIH0KLQotCSAgLyogUmVtZW1iZXIgd2hldGhlciB0aGlzIHN5bWJvbCB3YXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCSAgICBoLT5zbWFsbCA9IDE7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBldmVyIHNtYWxsIHVuZGVmaW5lZCwgaXQgbmVlZHMgdG8gd2luZAotCSAgICAgdXAgaW4gYSBHUCByZWxhdGl2ZSBzZWN0aW9uLiAgV2UgY2FuJ3QgY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBkZWZpbmVkIHN5bWJvbCwgYnV0IHdlIGNhbiBjb250cm9sIHRoZQotCSAgICAgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNhc2UgaXMgYWN0dWFsbHkgbmVlZGVkCi0JICAgICBvbiBVbHRyaXggNC4yIHRvIGhhbmRsZSB0aGUgc3ltYm9sIGNyZWQgaW4gLWxja3JiLiAgKi8KLQkgIGlmIChoLT5zbWFsbAotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+bmFtZSwgU0NPTU1PTikgIT0gMCkKLQkgICAgewotCSAgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsCi0JCQkJCQkJCSBTQ09NTU9OKTsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NDb21tb247Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIFBUUiBoYW5kbGUpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci19OwotCi0vKiBFQ09GRiBmaW5hbCBsaW5rIHJvdXRpbmUuICBUaGlzIGxvb2tzIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBCRkRzCi0gICBhbmQgZ2F0aGVycyB0b2dldGhlciBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYW5kIHRoZW4KLSAgIHByb2Nlc3NlcyBhbGwgdGhlIGxpbmsgb3JkZXIgaW5mb3JtYXRpb24uICBUaGlzIG1heSBjYXVzZSBpdCB0bwotICAgY2xvc2UgYW5kIHJlb3BlbiBzb21lIGlucHV0IEJGRHM7IEknbGwgc2VlIGhvdyBiYWQgdGhpcyBpcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKnN5bWhkcjsKLSAgUFRSIGhhbmRsZTsKLSAgcmVnaXN0ZXIgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gY291bnRzIGluIHRoZSBzeW1ib2xpYwotICAgICBoZWFkZXIuICAqLwotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc3ltaGRyLT52c3RhbXAgPSAwOwotICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLSAgc3ltaGRyLT5jYkxpbmUgPSAwOwotICBzeW1oZHItPmlkbk1heCA9IDA7Ci0gIHN5bWhkci0+aXBkTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKLSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NNYXggPSAwOwotICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gIHN5bWhkci0+aWZkTWF4ID0gMDsKLSAgc3ltaGRyLT5jcmZkID0gMDsKLSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZSBkZWJ1Z19pbmZvCi0gICAgIHN0cnVjdHVyZS4gICovCi0gIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9wZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9hdXggPSBOVUxMOwotICBkZWJ1Zy0+c3MgPSBOVUxMOwotICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0gIGhhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8pOwotICBpZiAoaGFuZGxlID09IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gZWFjaCBpbnB1dCBCRkQuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGluZm8tPmlucHV0X2JmZHM7Ci0gICAgICAgaW5wdXRfYmZkICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJldDsKLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JewotCSAgLyogQWJpdHJhcmlseSBzZXQgdGhlIHN5bWJvbGljIGhlYWRlciB2c3RhbXAgdG8gdGhlIHZzdGFtcAotCSAgICAgb2YgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluIHRoZSBsaW5rLiAgKi8KLQkgIGlmIChzeW1oZHItPnZzdGFtcCA9PSAwKQotCSAgICBzeW1oZHItPnZzdGFtcAotCSAgICAgID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIudnN0YW1wOwotCSAgcmV0ID0gZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlIChhYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkgICBoYW5kbGUpOwotCX0KLSAgICAgIGVsc2UKLQlyZXQgPSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlciAoaGFuZGxlLCBhYmZkLAotCQkJCQkJZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCQkJaW5wdXRfYmZkLCBpbmZvKTsKLSAgICAgIGlmICghIHJldCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENvbWJpbmUgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwcm1hc2s7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5mcHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMF0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1swXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzFdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMV07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1syXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzJdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbM10gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1szXTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0gIGVpbmZvLmluZm8gPSBpbmZvOwotICBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwsCi0JCQkgICAgKFBUUikgJmVpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBhIHBhc3Mgb3ZlciB0aGUgbGlua19vcmRlcnMgdG8gY291bnQgdXAgdGhlCi0JIG51bWJlciBvZiByZWxvY2F0aW9ucyB3ZSB3aWxsIG5lZWQgdG8gb3V0cHV0LCBzbyB0aGF0IHdlIGtub3cKLQkgaG93IG11Y2ggc3BhY2UgdGhleSB3aWxsIHRha2UgdXAuICAqLwotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgICBvLT5yZWxvY19jb3VudCArPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVsb2MgYW5kIHN5bWJvbCBmaWxlIHBvc2l0aW9ucy4gICovCi0gIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChoYW5kbGUsIGFiZmQsIGRlYnVnLAotCQkJCQkgICAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbywKLQkJCQkJICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKGhhbmRsZSwgYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyByZXNldCB0aGUgcmVsb2NfY291bnQgZmllbGQgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQKLQkgQkZEIHRvIDAsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLQkgcmVsb2NzIHdlIGhhdmUgb3V0cHV0IHRodXMgZmFyLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQlvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmdwID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChvLT52bWEgPCBsbwotCQkgICYmIChzdHJjbXAgKG8tPm5hbWUsIF9TQlNTKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX1NEQVRBKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDQpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUOCkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVRBKSA9PSAwKSkKLQkJbG8gPSBvLT52bWE7Ci0JICAgIH0KLQkgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IGxvICsgMHg4MDAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbiBuZWVkcyB0byBkbyBhIHJlbG9jCi0JICAgICBpbnZvbHZpbmcgdGhlIEdQIHZhbHVlLCBpdCBzaG91bGQgbWFrZSBhIHJlbG9jX2Rhbmdlcm91cwotCSAgICAgY2FsbGJhY2sgdG8gd2FybiB0aGF0IEdQIGlzIG5vdCBkZWZpbmVkLiAgKi8KLQl9Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1oZHItPmlleHRNYXggKyBzeW1oZHItPmlzeW1NYXg7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmxpbmtlciA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5wdXQgQkZEIGludG8gdGhlCi0gICBvdXRwdXQgQkZELiAgVGhpcyBtdXN0IHJlYWQgaW4gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIG9mIHRoZQotICAgaW5wdXQgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBoYW5kbGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmRlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBib29sZWFuIHJldDsKLQotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgICAgaWYgKChiZmRfc2VlayAoaW5wdXRfYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkJXAotCSAgICE9IDApCQkJCQkJCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWlucHV0X2JmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJXAotCXsJCQkJCQkJCVwKLSAgICAgICAgICByZXQgPSBmYWxzZTsJCQkJCQkJXAotICAgICAgICAgIGdvdG8gcmV0dXJuX3NvbWV0aGluZzsJCQkJCVwKLQl9CQkJCQkJCQlcCi0gICAgfQotCi0gIC8qIElmIHJhd19zeW1lbnRzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBkYXRhIHdhcyBhbHJlYWR5IGJ5IHJlYWQgYnkKLSAgICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksCi0JICAgIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQkgICAgdW5pb24gYXV4X2V4dCAqKTsKLSAgICAgIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgICB9Ci0jdW5kZWYgUkVBRAotCi0gIC8qIFdlIGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbCBzdHJpbmdzIG9yIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotICByZXQgPSAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkgKGhhbmRsZSwgb3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgJmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5kZWJ1Z19zd2FwLAotCSAgaW5wdXRfYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbykpOwotCi0gcmV0dXJuX3NvbWV0aGluZzoKLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmxpbmUpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPnNzKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGZvbGxvdyBvbmUgb2YgdGhlc2UgcG9pbnRlcnMKLQkgaW50byBmcmVlZCBtZW1vcnkuICAqLwotICAgICAgZGVidWctPmxpbmUgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9zeW0gPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgICAgIGRlYnVnLT5zcyA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQdXQgb3V0IGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGVzZSBjb21lIG9ubHkgZnJvbQotICAgdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJmZCAqb3V0cHV0X2JmZCA9IGVpbmZvLT5hYmZkOwotICBib29sZWFuIHN0cmlwOwotCi0gIC8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgYmVpbmcgc3RyaXBwZWQuICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXAgfHwgaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0JCi0JICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9GSU5JKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NQRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1hEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JDb25zdDsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotICBlbHNlIGlmIChoLT5lc3ltLmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgRkRSIGluZGV4IGZvciB0aGUgc3ltYm9sIGJ5IHRoYXQgdXNlZCBmb3IgdGhlCi0JIGlucHV0IEJGRC4gICovCi0gICAgICBkZWJ1ZyA9ICZlY29mZl9kYXRhIChoLT5hYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPmVzeW0uaWZkID49IDAKLQkJICAmJiBoLT5lc3ltLmlmZCA8IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGgtPmVzeW0uaWZkID0gZGVidWctPmlmZG1hcFtoLT5lc3ltLmlmZF07Ci0gICAgfQotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjVW5kZWZpbmVkCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JICB8fCBoLT5lc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgIT0gc2NDb21tb24KLQkgICYmIGgtPmVzeW0uYXN5bS5zYyAhPSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NDb21tb247Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCB1c2VzIGlleHRNYXggdG8ga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc3ltYm9sIG51bWJlci4gICovCi0gIGgtPmluZHggPSBlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLSAgaC0+d3JpdHRlbiA9IDE7Ci0KLSAgcmV0dXJuIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0JICAob3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkgICAmaC0+ZXN5bSkpOwotfQotCi0vKiBSZWxvY2F0ZSBhbmQgd3JpdGUgYW4gRUNPRkYgc2VjdGlvbiBpbnRvIGFuIEVDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX3NpemVfdHlwZSByYXdfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBjb29rZWRfc2l6ZTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBCRkRfQVNTRVJUICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnNpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLQotICByYXdfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemU7Ci0gIGlmIChjb29rZWRfc2l6ZSA9PSAwKQotICAgIGNvb2tlZF9zaXplID0gcmF3X3NpemU7Ci0KLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7Ci0gIEJGRF9BU1NFUlQgKGNvb2tlZF9zaXplID09IGxpbmtfb3JkZXItPnNpemUpOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFdlIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxhcmdlciBvZgotICAgICB0aGUgc2l6ZSBiZWZvcmUgcmVsb2NhdGluZyBhbmQgdGhlIHNpemUgYWZ0ZXIgcmVsb2NhdGluZy4gICovCi0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHJhd19zaXplID49IGNvb2tlZF9zaXplCi0JCQkJICAgICAgPyAoc2l6ZV90KSByYXdfc2l6ZQotCQkJCSAgICAgIDogKHNpemVfdCkgY29va2VkX3NpemUpOwotICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiByYXdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSByZWxheGluZywgdGhlIGNvbnRlbnRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGludG8KLSAgICAgbWVtb3J5LCBpbiB3aGljaCBjYXNlIHdlIGNvcHkgdGhlbSBpbnRvIG91ciBuZXcgYnVmZmVyLiAgV2UgZG9uJ3QKLSAgICAgc2ltcGx5IHJldXNlIHRoZSBvbGQgYnVmZmVyIGluIGNhc2UgY29va2VkX3NpemUgPiByYXdfc2l6ZS4gICovCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICBtZW1jcHkgKGNvbnRlbnRzLCBzZWN0aW9uX3RkYXRhLT5jb250ZW50cywgKHNpemVfdCkgcmF3X3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgKFBUUikgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCByYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgcmVsb2NzLiAgSWYgd2UgYXJlIHJlbGF4aW5nIE1JUFMgY29kZSwgdGhleSB3aWxsIGFscmVhZHkKLSAgICAgaGF2ZSBiZWVuIHJlYWQgaW4uICBPdGhlcndpc2UsIHdlIHJlYWQgdGhlbSBpbiBub3cuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb25fdGRhdGEgIT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKLSAgICAgICYmIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3JlbG9jcyA9IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGlucHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgKCgqZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+cmVsb2NhdGVfc2VjdGlvbikKLQkgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JICBleHRlcm5hbF9yZWxvY3MpKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRlZCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLAotCQkJCSAgb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBjb250ZW50cywKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBjb29rZWRfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgcmVsb2NzIHdlcmUKLSAgICAgbW9kaWZpZWQsIGFuZCB3ZSB3cml0ZSB0aGVtIG91dCBub3cuICBXZSB1c2UgdGhlIHJlbG9jX2NvdW50Ci0gICAgIGZpZWxkIG9mIG91dHB1dF9zZWN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3Mgd2UKLSAgICAgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICAob3V0cHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zICsKLQkJICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBvdXRwdXRfYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jc19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCAmJiBzZWN0aW9uX3RkYXRhID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIHdoZW4gbGlua2luZyBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIGFyZWxlbnQgcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX2J5dGUgKnJidWY7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgdHlwZSA9IGxpbmtfb3JkZXItPnR5cGU7Ci0gIHNlY3Rpb24gPSBOVUxMOwotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBXZSBzZXQgdXAgYW4gYXJlbGVudCB0byBwYXNzIHRvIHRoZSBiYWNrZW5kIGFkanVzdF9yZWxvY19vdXQKLSAgICAgcm91dGluZS4gICovCi0gIHJlbC5hZGRyZXNzID0gbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIHJlbC5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChyZWwuaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzZWN0aW9uID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb247Ci0gICAgICByZWwuc3ltX3B0cl9wdHIgPSBzZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCWxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICB0eXBlID0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjsKLQkgIHNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkgIC8qIEl0IHNlZW1zIHRoYXQgd2Ugb3VnaHQgdG8gYWRkIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlCi0gICAgICAgICAgICAgYWRkZW5kIGhlcmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgYmVjYXVzZSBpdCB3YXMgcGFzc2VkIHRvIGNvbnN0cnVjdG9yX2NhbGxiYWNrLiAgKi8KLQkgIGFkZGVuZCArPSBzZWN0aW9uLT52bWEgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBzZXQgdXAgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGNvcnJlY3RseSwKLQkgICAgIGJlY2F1c2Ugd2UgaGF2ZSBubyBhc3ltYm9sIHN0cnVjdHVyZS4gIEN1cnJlbnRseSBubwotCSAgICAgYWRqdXN0X3JlbG9jX291dCByb3V0aW5lIGNhcmVzLiAgKi8KLQkgIHJlbC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsIEVDT0ZGIHJlbG9jcyBhcmUgaW4tcGxhY2UuICBQdXQgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAocmVsLmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpOwotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbC5ob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKHJlbC5ob3d0bywgb3V0cHV0X2JmZCwgYWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgcmVsLmhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC5hZGRlbmQgPSAwOwotCi0gIC8qIE1vdmUgdGhlIGluZm9ybWF0aW9uIGludG8gYSBpbnRlcm5hbF9yZWxvYyBzdHJ1Y3R1cmUuICAqLwotICBpbi5yX3ZhZGRyID0gKHJlbC5hZGRyZXNzCi0JCSsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pKTsKLSAgaW4ucl90eXBlID0gcmVsLmhvd3RvLT50eXBlOwotCi0gIGlmICh0eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT5pbmR4ICE9IC0xKQotCWluLnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW4ucl9zeW1uZHggPSAwOwotCX0KLSAgICAgIGluLnJfZXh0ZXJuID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9JTklUOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JDT05TVDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICAgIGluLnJfZXh0ZXJuID0gMDsKLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBCRkQgYmFja2VuZCBhZGp1c3QgdGhlIHJlbG9jLiAgKi8KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+YWRqdXN0X3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZyZWwsICZpbik7Ci0KLSAgLyogR2V0IHNvbWUgbWVtb3J5IGFuZCBzd2FwIG91dCB0aGUgcmVsb2MuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAoKmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5zd2FwX3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZpbiwgKFBUUikgcmJ1Zik7Ci0KLSAgb2sgPSAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpLAotCQkgIFNFRUtfU0VUKSA9PSAwCi0JJiYgKGJmZF93cml0ZSAoKFBUUikgcmJ1ZiwgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgPT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkpOwotCi0gIGlmIChvaykKLSAgICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmcmVlIChyYnVmKTsKLQotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZsaW5rLmMgYi9iZmQvZWNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZmM5NjYuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5OSArMCwwIEBACi0vKiBSb3V0aW5lcyB0byBsaW5rIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotc3RhdGljIGJvb2xlYW4gZWNvZmZfYWRkX2J5dGVzIFBBUkFNUyAoKGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JCQkJCXNpemVfdCBuZWVkKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJpbmdfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX2FsaWduX2RlYnVnIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfd3JpdGVfc3ltaGRyIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAotCQkJCQkgICBmaWxlX3B0ciB3aGVyZSkpOwotc3RhdGljIGludCBjbXBfZmRydGFiX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBta19mZHJ0YWIgUEFSQU1TICgoYmZkICosCi0JCQkJICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCQkJCSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwKLQkJCQkgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikpOwotc3RhdGljIGxvbmcgZmRydGFiX2xvb2t1cCBQQVJBTVMgKChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGxvb2t1cF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKikpOwotDAotLyogUm91dGluZXMgdG8gc3dhcCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIEkgYW0gYXNzdW1pbmcKLSAgIHRoYXQgdGhlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmb3JtYXQgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRhcmdldAotICAgaW5kZXBlbmRlbnQuICAqLwotCi0vKiBTd2FwIGluIGEgdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQuCi0gICBCSUdFTkQgc2F5cyB3aGV0aGVyIEFVWCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW47IHRoaXMKLSAgIGluZm8gY29tZXMgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcmVjb3JkIChmaC1mQmlnZW5kaWFuKS4gICovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF90aXJfaW4gKGJpZ2VuZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3Qgc3RydWN0IHRpcl9leHQgKmV4dF9jb3B5OwotICAgICBUSVIgKmludGVybjsKLXsKLSAgc3RydWN0IHRpcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqZXh0X2NvcHk7CQkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGludGVybi0+ZkJpdGZpZWxkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfRkJJVEZJRUxEX0JJRyk7Ci0gICAgaW50ZXJuLT5jb250aW51ZWQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9DT05USU5VRURfQklHKTsKLSAgICBpbnRlcm4tPmJ0ICAgICAgICAgID0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9CVF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTMV9CVF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTQgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTUgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNV9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNV9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTAgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMF9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMF9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTEgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMV9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMV9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTIgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRMl9CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMl9TSF9CSUc7Ci0gICAgaW50ZXJuLT50cTMgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRM19CSUcpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRM19TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5mQml0ZmllbGQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9GQklURklFTERfTElUVExFKTsKLSAgICBpbnRlcm4tPmNvbnRpbnVlZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUpOwotICAgIGludGVybi0+YnQgICAgICAgICAgPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0JUX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFMxX0JUX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxNCAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE0X0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE0X1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxNSAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE1X0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE1X1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMCAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFEwX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEwX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMSAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFExX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFExX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMiAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEyX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEyX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnRxMyAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEzX0xJVFRMRSkKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEzX1NIX0xJVFRMRTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkLgotICAgQklHRU5EIHNheXMgd2hldGhlciBBVVggc3ltYm9scyBhcmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuOyB0aGlzCi0gICBpbmZvIGNvbWVzIGZyb20gdGhlIGZpbGUgaGVhZGVyIHJlY29yZCAoZmgtZkJpZ2VuZGlhbikuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCAoYmlnZW5kLCBpbnRlcm5fY29weSwgZXh0KQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBUSVIgKmludGVybl9jb3B5OwotICAgICBzdHJ1Y3QgdGlyX2V4dCAqZXh0OwotewotICBUSVIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgZXh0LT50X2JpdHMxWzBdID0gKChpbnRlcm4tPmZCaXRmaWVsZCA/IFRJUl9CSVRTMV9GQklURklFTERfQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+Y29udGludWVkID8gVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+YnQgPDwgVElSX0JJVFMxX0JUX1NIX0JJRykKLQkJCSAgJiBUSVJfQklUUzFfQlRfQklHKSk7Ci0gICAgZXh0LT50X3RxNDVbMF0gPSAoKChpbnRlcm4tPnRxNCA8PCBUSVJfQklUU19UUTRfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTRfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTUgPDwgVElSX0JJVFNfVFE1X1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRNV9CSUcpKTsKLSAgICBleHQtPnRfdHEwMVswXSA9ICgoKGludGVybi0+dHEwIDw8IFRJUl9CSVRTX1RRMF9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMSA8PCBUSVJfQklUU19UUTFfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFExX0JJRykpOwotICAgIGV4dC0+dF90cTIzWzBdID0gKCgoaW50ZXJuLT50cTIgPDwgVElSX0JJVFNfVFEyX1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFEyX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHEzIDw8IFRJUl9CSVRTX1RRM19TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTNfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT50X2JpdHMxWzBdID0gKChpbnRlcm4tPmZCaXRmaWVsZCA/IFRJUl9CSVRTMV9GQklURklFTERfTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+Y29udGludWVkID8gVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+YnQgPDwgVElSX0JJVFMxX0JUX1NIX0xJVFRMRSkKLQkJCSAgJiBUSVJfQklUUzFfQlRfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxNDVbMF0gPSAoKChpbnRlcm4tPnRxNCA8PCBUSVJfQklUU19UUTRfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTRfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTUgPDwgVElSX0JJVFNfVFE1X1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRNV9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHEwMVswXSA9ICgoKGludGVybi0+dHEwIDw8IFRJUl9CSVRTX1RRMF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMSA8PCBUSVJfQklUU19UUTFfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFExX0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTIzWzBdID0gKCgoaW50ZXJuLT50cTIgPDwgVElSX0JJVFNfVFEyX1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFEyX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHEzIDw8IFRJUl9CSVRTX1RRM19TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTNfTElUVExFKSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIHJlbGF0aXZlIHN5bWJvbCByZWNvcmQuICBCSUdFTkQgc2F5cyB3aGV0aGVyIGl0IGlzIGluCi0gICBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiaWdlbmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqZXh0X2NvcHk7Ci0gICAgIFJORFhSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBybmR4X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICpleHRfY29weTsJCS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgaW50ZXJuLT5yZmQgICA9IChleHQtPnJfYml0c1swXSA8PCBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRykKLQkJICB8ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX1JGRF9CSUcpCi0JCSAgICAJCSAgICA+PiBSTkRYX0JJVFMxX1JGRF9TSF9CSUcpOwotICAgIGludGVybi0+aW5kZXggPSAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9JTkRFWF9CSUcpCi0JCSAgICAJCSAgICA8PCBSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHKQotCQkgIHwgKGV4dC0+cl9iaXRzWzJdIDw8IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCSAgfCAoZXh0LT5yX2JpdHNbM10gPDwgUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5yZmQgICA9IChleHQtPnJfYml0c1swXSA8PCBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRSkKLQkJICB8ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX1JGRF9MSVRUTEUpCi0JCSAgICAJCSAgICA8PCBSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5pbmRleCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX0lOREVYX0xJVFRMRSkKLQkJICAgIAkJICAgID4+IFJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFKQotCQkgIHwgKGV4dC0+cl9iaXRzWzJdIDw8IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEUpCi0JCSAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5yX2JpdHNbM10KLQkJICAgICA8PCBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHJlbGF0aXZlIHN5bWJvbCByZWNvcmQuICBCSUdFTkQgc2F5cyB3aGV0aGVyIGl0IGlzIGluCi0gICBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCAoYmlnZW5kLCBpbnRlcm5fY29weSwgZXh0KQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBSTkRYUiAqaW50ZXJuX2NvcHk7Ci0gICAgIHN0cnVjdCBybmR4X2V4dCAqZXh0OwotewotICBSTkRYUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBleHQtPnJfYml0c1swXSA9IGludGVybi0+cmZkID4+IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHOwotICAgIGV4dC0+cl9iaXRzWzFdID0gKCgoaW50ZXJuLT5yZmQgPDwgUk5EWF9CSVRTMV9SRkRfU0hfQklHKQotCQkgICAgICAgJiBSTkRYX0JJVFMxX1JGRF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQkgJiBSTkRYX0JJVFMxX0lOREVYX0JJRykpOwotICAgIGV4dC0+cl9iaXRzWzJdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHOwotICAgIGV4dC0+cl9iaXRzWzNdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHOwotICB9IGVsc2UgewotICAgIGV4dC0+cl9iaXRzWzBdID0gaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEU7Ci0gICAgZXh0LT5yX2JpdHNbMV0gPSAoKChpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgICYgUk5EWF9CSVRTMV9SRkRfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT5pbmRleCA8PCBSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRSkKLQkJCSAmIFJORFhfQklUUzFfSU5ERVhfTElUVExFKSk7Ci0gICAgZXh0LT5yX2JpdHNbMl0gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgZXh0LT5yX2JpdHNbM10gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEU7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQwKLS8qIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBkYXRhIHRvIGFsbG9jYXRlLiAgKi8KLSNkZWZpbmUgQUxMT0NfU0laRSAoNDA2NCkKLQotLyogQWRkIGJ5dGVzIHRvIGEgYnVmZmVyLiAgUmV0dXJuIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgbmVlZCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgc2l6ZV90IG5lZWQ7Ci17Ci0gIHNpemVfdCBoYXZlOwotICBzaXplX3Qgd2FudDsKLSAgY2hhciAqbmV3YnVmOwotCi0gIGhhdmUgPSAqYnVmZW5kIC0gKmJ1ZjsKLSAgaWYgKGhhdmUgPiBuZWVkKQotICAgIHdhbnQgPSBBTExPQ19TSVpFOwotICBlbHNlCi0gICAgewotICAgICAgd2FudCA9IG5lZWQgLSBoYXZlOwotICAgICAgaWYgKHdhbnQgPCBBTExPQ19TSVpFKQotCXdhbnQgPSBBTExPQ19TSVpFOwotICAgIH0KLSAgbmV3YnVmID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKCpidWYsIGhhdmUgKyB3YW50KTsKLSAgaWYgKG5ld2J1ZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmJ1ZiA9IG5ld2J1ZjsKLSAgKmJ1ZmVuZCA9ICpidWYgKyBoYXZlICsgd2FudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGtlZXAgYSBoYXNoIHRhYmxlIHdoaWNoIG1hcHMgc3RyaW5ncyB0byBudW1iZXJzLiAgV2UgdXNlIGl0IHRvCi0gICBtYXAgRkRSIG5hbWVzIHRvIGluZGljZXMgaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgdG8gbWFwIGxvY2FsCi0gICBzdHJpbmdzIHdoZW4gY29tYmluaW5nIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogRkRSIGluZGV4IG9yIHN0cmluZyB0YWJsZSBvZmZzZXQuICAqLwotICBsb25nIHZhbDsKLSAgLyogTmV4dCBlbnRyeSBpbiBzdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKm5leHQ7Ci19OwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotfTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RyaW5nX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnZhbCA9IC0xOwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdHJpbmdfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBXZSBjYW4ndCBhZmZvcmQgdG8gcmVhZCBpbiBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGVuIHdlIGRvCi0gICBhIGxpbmsuICBJbnN0ZWFkLCB3ZSBidWlsZCBhIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyB0byBzaG93IGhvdwotICAgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBpbnB1dCBmaWxlIG1hcCB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdHJ1Y3Qgc2h1ZmZsZQotewotICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGlzIGxpbmtlZCBsaXN0LiAgKi8KLSAgc3RydWN0IHNodWZmbGUgKm5leHQ7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzaXplOwotICAvKiBXaGV0aGVyIHRoaXMgaW5mb3JtYXRpb24gY29tZXMgZnJvbSBhIGZpbGUgb3Igbm90LiAgKi8KLSAgYm9vbGVhbiBmaWxlcDsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBUaGUgQkZEIHRoZSBkYXRhIGNvbWVzIGZyb20uICAqLwotCSAgYmZkICppbnB1dF9iZmQ7Ci0JICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiBpbnB1dF9iZmQuICAqLwotCSAgZmlsZV9wdHIgb2Zmc2V0OwotCX0gZmlsZTsKLSAgICAgIC8qIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLSAgICAgIFBUUiBtZW1vcnk7Ci0gICAgfSB1OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzIHRvCi0gICBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZS4gICovCi0KLXN0cnVjdCBhY2N1bXVsYXRlCi17Ci0gIC8qIFRoZSBGRFIgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBmZHJfaGFzaDsKLSAgLyogVGhlIHN0cmluZ3MgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBzdHJfaGFzaDsKLSAgLyogTGlua2VkIGxpc3RzIGRlc2NyaWJpbmcgaG93IHRvIHNodWZmbGUgdGhlIGlucHV0IGRlYnVnCi0gICAgIGluZm9ybWF0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2Uga2VlcCBhIHBvaW50ZXIgdG8gYm90aCB0aGUKLSAgICAgaGVhZCBhbmQgdGhlIHRhaWwuICAqLwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbGluZTsKLSAgc3RydWN0IHNodWZmbGUgKmxpbmVfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcGRyOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcGRyX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnN5bTsKLSAgc3RydWN0IHNodWZmbGUgKnN5bV9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpvcHQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpvcHRfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqYXV4OwotICBzdHJ1Y3Qgc2h1ZmZsZSAqYXV4X2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnNzOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3NfZW5kOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNzX2hhc2g7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3NfaGFzaF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpmZHI7Ci0gIHN0cnVjdCBzaHVmZmxlICpmZHJfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcmZkOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqcmZkX2VuZDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgZmlsZSBzaHVmZmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsYXJnZXN0X2ZpbGVfc2h1ZmZsZTsKLSAgLyogQW4gb2JqYWxsb2MgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBvYmphbGxvYyAqbWVtb3J5OwotfTsKLQotLyogQWRkIGEgZmlsZSBlbnRyeSB0byBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9maWxlX3NodWZmbGUgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKiwgYmZkICosIGZpbGVfcHRyLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4KLWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCBoZWFkLCB0YWlsLCBpbnB1dF9iZmQsIG9mZnNldCwgc2l6ZSkKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQ7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotewotICBzdHJ1Y3Qgc2h1ZmZsZSAqbjsKLQotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwKLSAgICAgICYmICgqdGFpbCktPmZpbGVwCi0gICAgICAmJiAoKnRhaWwpLT51LmZpbGUuaW5wdXRfYmZkID09IGlucHV0X2JmZAotICAgICAgJiYgKCp0YWlsKS0+dS5maWxlLm9mZnNldCArICgqdGFpbCktPnNpemUgPT0gKHVuc2lnbmVkIGxvbmcpIG9mZnNldCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IG1lcmdlIHRoaXMgZW50cnkgb250byB0aGUgZXhpc3Rpbmcgb25lLiAgKi8KLSAgICAgICgqdGFpbCktPnNpemUgKz0gc2l6ZTsKLSAgICAgIGlmICgoKnRhaWwpLT5zaXplID4gYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKQotCWFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9ICgqdGFpbCktPnNpemU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbiA9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJIHNpemVvZiAoc3RydWN0IHNodWZmbGUpKTsKLSAgaWYgKCFuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPnNpemUgPSBzaXplOwotICBuLT5maWxlcCA9IHRydWU7Ci0gIG4tPnUuZmlsZS5pbnB1dF9iZmQgPSBpbnB1dF9iZmQ7Ci0gIG4tPnUuZmlsZS5vZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmICgqaGVhZCA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAqaGVhZCA9IG47Ci0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAoKnRhaWwpLT5uZXh0ID0gbjsKLSAgKnRhaWwgPSBuOwotICBpZiAoc2l6ZSA+IGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSkKLSAgICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSBzaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgbWVtb3J5IGVudHJ5IHRvIGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX21lbW9yeV9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJCSAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZCwKLQkJCQkJICAgc3RydWN0IHNodWZmbGUgKip0YWlsLAotCQkJCQkgICBiZmRfYnl0ZSAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1hZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCBoZWFkLCB0YWlsLCBkYXRhLCBzaXplKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZDsKLSAgICAgc3RydWN0IHNodWZmbGUgKip0YWlsOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotewotICBzdHJ1Y3Qgc2h1ZmZsZSAqbjsKLSAgICAgCi0gIG4gPSAoc3RydWN0IHNodWZmbGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBzaHVmZmxlKSk7Ci0gIGlmICghbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zaXplID0gc2l6ZTsKLSAgbi0+ZmlsZXAgPSBmYWxzZTsKLSAgbi0+dS5tZW1vcnkgPSAoUFRSKSBkYXRhOwotICBpZiAoKmhlYWQgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKmhlYWQgPSBuOwotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKCp0YWlsKS0+bmV4dCA9IG47Ci0gICp0YWlsID0gbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIEZEUiBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIGEgaGFuZGxlIHdoaWNoIGlzIHRoZW4KLSAgIHBhc3NlZCBpbiB0byBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSwgZXQuIGFsLiAgKi8KLQotLypBUkdTVVNFRCovCi1QVFIKLWJmZF9lY29mZl9kZWJ1Z19pbml0IChvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0KLSAgYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYWNjdW11bGF0ZSkpOwotICBpZiAoIWFpbmZvKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZhaW5mby0+ZmRyX2hhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMsCi0JCQkgICAgICAgMTAyMSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYWluZm8tPmxpbmUgPSBOVUxMOwotICBhaW5mby0+bGluZV9lbmQgPSBOVUxMOwotICBhaW5mby0+cGRyID0gTlVMTDsKLSAgYWluZm8tPnBkcl9lbmQgPSBOVUxMOwotICBhaW5mby0+c3ltID0gTlVMTDsKLSAgYWluZm8tPnN5bV9lbmQgPSBOVUxMOwotICBhaW5mby0+b3B0ID0gTlVMTDsKLSAgYWluZm8tPm9wdF9lbmQgPSBOVUxMOwotICBhaW5mby0+YXV4ID0gTlVMTDsKLSAgYWluZm8tPmF1eF9lbmQgPSBOVUxMOwotICBhaW5mby0+c3MgPSBOVUxMOwotICBhaW5mby0+c3NfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2ggPSBOVUxMOwotICBhaW5mby0+c3NfaGFzaF9lbmQgPSBOVUxMOwotICBhaW5mby0+ZmRyID0gTlVMTDsKLSAgYWluZm8tPmZkcl9lbmQgPSBOVUxMOwotICBhaW5mby0+cmZkID0gTlVMTDsKLSAgYWluZm8tPnJmZF9lbmQgPSBOVUxMOwotCi0gIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9IDA7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZhaW5mby0+c3RyX2hhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMpKQotCXJldHVybiBOVUxMOwotCi0gICAgICAvKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIHN0cmluZyB0YWJsZSBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgICAgIG91dHB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc01heCA9IDE7Ci0gICAgfQotCi0gIGFpbmZvLT5tZW1vcnkgPSBvYmphbGxvY19jcmVhdGUgKCk7Ci0gIGlmIChhaW5mby0+bWVtb3J5ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIGFpbmZvOwotfQotCi0vKiBGcmVlIHRoZSBhY2N1bXVsYXRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsIGluZm8pCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgCi0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhaW5mby0+ZmRyX2hhc2gudGFibGUpOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlKTsKLQotICBvYmphbGxvY19mcmVlIChhaW5mby0+bWVtb3J5KTsKLQotICBmcmVlIChhaW5mbyk7Ci19Ci0KLS8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIElOUFVUX0JGRCBpbnRvCi0gICBPVVRQVVRfQkZELiAgVGhlIElOUFVUX0RFQlVHIGFyZ3VtZW50IHBvaW50cyB0byBzb21lIEVDT0ZGCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggd2Ugd2FudCB0byBsaW5rIGludG8gdGhlIGluZm9ybWF0aW9uCi0gICBwb2ludGVkIHRvIGJ5IHRoZSBPVVRQVVRfREVCVUcgYXJndW1lbnQuICBPVVRQVVRfU1dBUCBhbmQKLSAgIElOUFVUX1NXQVAgcG9pbnQgdG8gdGhlIHN3YXBwaW5nIGluZm9ybWF0aW9uIG5lZWRlZC4gIElORk8gaXMgdGhlCi0gICBsaW5rZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgSEFORExFIGlzIHJldHVybmVkIGJ5Ci0gICBiZmRfZWNvZmZfZGVidWdfaW5pdC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUgKGhhbmRsZSwgb3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLCBvdXRwdXRfc3dhcCwKLQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLAotCQkJICAgIGluZm8pCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCi0gICAgPSBpbnB1dF9zd2FwLT5zd2FwX3N5bV9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSkKLSAgICA9IGlucHV0X3N3YXAtPnN3YXBfcmZkX2luOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSkKLSAgICA9IG91dHB1dF9zd2FwLT5zd2FwX3N5bV9vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9mZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9mZHJfb3V0OwotICB2b2lkICgqIGNvbnN0IHN3YXBfcmZkX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSkKLSAgICA9IG91dHB1dF9zd2FwLT5zd2FwX3JmZF9vdXQ7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemUgPSBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUgPSBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfb3B0X3NpemUgPSBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemUgPSBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmZkX3NpemUgPSBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIEhEUlIgKiBjb25zdCBvdXRwdXRfc3ltaGRyID0gJm91dHB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBIRFJSICogY29uc3QgaW5wdXRfc3ltaGRyID0gJmlucHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGJmZF92bWEgc2VjdGlvbl9hZGp1c3Rbc2NNYXhdOwotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfYnl0ZSAqZmRyX3N0YXJ0OwotICBiZmRfYnl0ZSAqZmRyX3B0cjsKLSAgYmZkX2J5dGUgKmZkcl9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgZmRyX2FkZDsKLSAgdW5zaWduZWQgaW50IGNvcGllZDsKLSAgUkZEVCBpOwotICB1bnNpZ25lZCBsb25nIHN6OwotICBiZmRfYnl0ZSAqcmZkX291dDsKLSAgYmZkX2J5dGUgKnJmZF9pbjsKLSAgYmZkX2J5dGUgKnJmZF9lbmQ7Ci0gIGxvbmcgbmV3cmZkYmFzZSA9IDA7Ci0gIGxvbmcgb2xkcmZkYmFzZSA9IDA7Ci0gIGJmZF9ieXRlICpmZHJfb3V0OwotCi0gIC8qIFVzZSBzZWN0aW9uX2FkanVzdCB0byBob2xkIHRoZSB2YWx1ZSB0byBhZGQgdG8gYSBzeW1ib2wgaW4gYQotICAgICBwYXJ0aWN1bGFyIHNlY3Rpb24uICAqLwotICBtZW1zZXQgKChQVFIpIHNlY3Rpb25fYWRqdXN0LCAwLCBzaXplb2Ygc2VjdGlvbl9hZGp1c3QpOwotCi0jZGVmaW5lIFNFVChuYW1lLCBpbmR4KSBcCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsIG5hbWUpOyBcCi0gIGlmIChzZWMgIT0gTlVMTCkgXAotICAgIHNlY3Rpb25fYWRqdXN0W2luZHhdID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSBcCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQgXAotCQkJICAgIC0gc2VjLT52bWEpOwotCi0gIFNFVCAoIi50ZXh0Iiwgc2NUZXh0KTsKLSAgU0VUICgiLmRhdGEiLCBzY0RhdGEpOwotICBTRVQgKCIuYnNzIiwgc2NCc3MpOwotICBTRVQgKCIuc2RhdGEiLCBzY1NEYXRhKTsKLSAgU0VUICgiLnNic3MiLCBzY1NCc3MpOwotICAvKiBzY1JkYXRhIHNlY3Rpb24gbWF5IGJlIGVpdGhlciAucmRhdGEgb3IgLnJvZGF0YS4gICovCi0gIFNFVCAoIi5yZGF0YSIsIHNjUkRhdGEpOwotICBTRVQgKCIucm9kYXRhIiwgc2NSRGF0YSk7Ci0gIFNFVCAoIi5pbml0Iiwgc2NJbml0KTsKLSAgU0VUICgiLmZpbmkiLCBzY0ZpbmkpOwotICBTRVQgKCIucmNvbnN0Iiwgc2NSQ29uc3QpOwotCi0jdW5kZWYgU0VUCi0KLSAgLyogRmluZCBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgRkRSJ3MuICBXZSBuZWVkCi0gICAgIHRvIGhhbmRsZSB0aGVtIHdoZXRoZXIgdGhleSBhcmUgc3dhcHBlZCBvciBub3QuICAqLwotICBpZiAoaW5wdXRfZGVidWctPmZkciAhPSAoRkRSICopIE5VTEwpCi0gICAgewotICAgICAgZmRyX3N0YXJ0ID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5mZHI7Ci0gICAgICBmZHJfYWRkID0gc2l6ZW9mIChGRFIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZkcl9zdGFydCA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfZmRyOwotICAgICAgZmRyX2FkZCA9IGlucHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotICAgIH0KLSAgZmRyX2VuZCA9IGZkcl9zdGFydCArIGlucHV0X3N5bWhkci0+aWZkTWF4ICogZmRyX2FkZDsKLQotICBpbnB1dF9kZWJ1Zy0+aWZkbWFwID0gKFJGRFQgKikgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJCSAgICAoaW5wdXRfc3ltaGRyLT5pZmRNYXgKLQkJCQkJICAgICAqIHNpemVvZiAoUkZEVCkpKTsKLQotICBzeiA9IChpbnB1dF9zeW1oZHItPmNyZmQgKyBpbnB1dF9zeW1oZHItPmlmZE1heCkgKiBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgcmZkX291dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotICBpZiAoIWlucHV0X2RlYnVnLT5pZmRtYXAgfHwgIXJmZF9vdXQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+cmZkLCAmYWluZm8tPnJmZF9lbmQsIHJmZF9vdXQsIHN6KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29waWVkID0gMDsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIEZEUidzIHRvIHNlZSB3aGljaCBvbmVzIHdlIGFyZSBnb2luZyB0byBpbmNsdWRlCi0gICAgIGluIHRoZSBmaW5hbCBvdXRwdXQuICBXZSBkbyBub3Qgd2FudCBkdXBsaWNhdGUgRkRSIGluZm9ybWF0aW9uCi0gICAgIGZvciBoZWFkZXIgZmlsZXMsIGJlY2F1c2UgRUNPRkYgZGVidWdnaW5nIGlzIG9mdGVuIHZlcnkgbGFyZ2UuCi0gICAgIFdoZW4gd2UgZmluZCBhbiBGRFIgd2l0aCBubyBsaW5lIGluZm9ybWF0aW9uIHdoaWNoIGNhbiBiZSBtZXJnZWQsCi0gICAgIHdlIGxvb2sgaXQgdXAgaW4gYSBoYXNoIHRhYmxlIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgaW5jbHVkZSBpdAotICAgICBvbmNlLiAgV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgRkRSIG51bWJlcnMgdG8gdGhlIGZpbmFsIG51bWJlcgotICAgICB0aGV5IGdldCB3aXRoIHRoZSBCRkQsIHNvIHRoYXQgd2UgY2FuIHJlZmVyIHRvIGl0IHdoZW4gd2Ugd3JpdGUKLSAgICAgb3V0IHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0LCBpID0gMDsKLSAgICAgICBmZHJfcHRyIDwgZmRyX2VuZDsKLSAgICAgICBmZHJfcHRyICs9IGZkcl9hZGQsIGkrKywgcmZkX291dCArPSBleHRlcm5hbF9yZmRfc2l6ZSkKLSAgICB7Ci0gICAgICBGRFIgZmRyOwotCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmZkciAhPSAoRkRSICopIE5VTEwpCi0JZmRyID0gKihGRFIgKikgZmRyX3B0cjsKLSAgICAgIGVsc2UKLQkoKmlucHV0X3N3YXAtPnN3YXBfZmRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBmZHJfcHRyLCAmZmRyKTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgRkRSIGNhbiBiZSBtZXJnZWQgd2l0aCBhbiBleGlzdGluZyBvbmUuICAqLwotICAgICAgaWYgKGZkci5jYkxpbmUgPT0gMCAmJiBmZHIucnNzICE9IC0xICYmIGZkci5mTWVyZ2UpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgKmxvb2t1cDsKLQkgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqZmg7Ci0KLQkgIC8qIFdlIGxvb2sgdXAgYSBzdHJpbmcgZm9ybWVkIGZyb20gdGhlIGZpbGUgbmFtZSBhbmQgdGhlCi0JICAgICBudW1iZXIgb2Ygc3ltYm9scyBhbmQgYXV4IGVudHJpZXMuICBTb21ldGltZXMgYW4gaW5jbHVkZQotCSAgICAgZmlsZSB3aWxsIGNvbmRpdGlvbmFsbHkgZGVmaW5lIGEgdHlwZWRlZiBvciBzb21ldGhpbmcKLQkgICAgIGJhc2VkIG9uIHRoZSBvcmRlciBvZiBpbmNsdWRlIGZpbGVzLiAgVXNpbmcgdGhlIG51bWJlciBvZgotCSAgICAgc3ltYm9scyBhbmQgYXV4IGVudHJpZXMgYXMgYSBoYXNoIHJlZHVjZXMgdGhlIGNoYW5jZSB0aGF0Ci0JICAgICB3ZSB3aWxsIG1lcmdlIHN5bWJvbCBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBub3QgYmUKLQkgICAgIG1lcmdlZC4gICovCi0JICBuYW1lID0gaW5wdXRfZGVidWctPnNzICsgZmRyLmlzc0Jhc2UgKyBmZHIucnNzOwotCi0JICBsb29rdXAgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMjApOwotCSAgaWYgKGxvb2t1cCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzcHJpbnRmIChsb29rdXAsICIlcyAlbHggJWx4IiwgbmFtZSwgZmRyLmNzeW0sIGZkci5jYXV4KTsKLQotCSAgZmggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+ZmRyX2hhc2gsIGxvb2t1cCwgdHJ1ZSwgdHJ1ZSk7Ci0JICBmcmVlIChsb29rdXApOwotCSAgaWYgKGZoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZmgtPnZhbCAhPSAtMSkKLQkgICAgewotCSAgICAgIGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPSBmaC0+dmFsOwotCSAgICAgICgqc3dhcF9yZmRfb3V0KSAob3V0cHV0X2JmZCwgaW5wdXRfZGVidWctPmlmZG1hcCArIGksCi0JCQkgICAgICAgKFBUUikgcmZkX291dCk7Ci0KLQkgICAgICAvKiBEb24ndCBjb3B5IHRoaXMgRkRSLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBmaC0+dmFsID0gb3V0cHV0X3N5bWhkci0+aWZkTWF4ICsgY29waWVkOwotCX0KLQotICAgICAgaW5wdXRfZGVidWctPmlmZG1hcFtpXSA9IG91dHB1dF9zeW1oZHItPmlmZE1heCArIGNvcGllZDsKLSAgICAgICgqc3dhcF9yZmRfb3V0KSAob3V0cHV0X2JmZCwgaW5wdXRfZGVidWctPmlmZG1hcCArIGksIChQVFIpIHJmZF9vdXQpOwotICAgICAgKytjb3BpZWQ7Ci0gICAgfQotCi0gIG5ld3JmZGJhc2UgPSBvdXRwdXRfc3ltaGRyLT5jcmZkOwotICBvdXRwdXRfc3ltaGRyLT5jcmZkICs9IGlucHV0X3N5bWhkci0+aWZkTWF4OwotCi0gIC8qIENvcHkgb3ZlciBhbnkgZXhpc3RpbmcgUkZEJ3MuICBSRkQncyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZQotICAgICBsaW5rZXIsIHNvIHRoaXMgd2lsbCBvbmx5IGhhcHBlbiBmb3IgaW5wdXQgZmlsZXMgd2hpY2ggYXJlIHRoZQotICAgICByZXN1bHQgb2YgYSBwYXJ0aWFsIGxpbmsuICAqLwotICByZmRfaW4gPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3JmZDsKLSAgcmZkX2VuZCA9IHJmZF9pbiArIGlucHV0X3N5bWhkci0+Y3JmZCAqIGlucHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotICBmb3IgKDsKLSAgICAgICByZmRfaW4gPCByZmRfZW5kOwotICAgICAgIHJmZF9pbiArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkKLSAgICB7Ci0gICAgICBSRkRUIHJmZDsKLQotICAgICAgKCpzd2FwX3JmZF9pbikgKGlucHV0X2JmZCwgKFBUUikgcmZkX2luLCAmcmZkKTsKLSAgICAgIEJGRF9BU1NFUlQgKHJmZCA+PSAwICYmIHJmZCA8IGlucHV0X3N5bWhkci0+aWZkTWF4KTsKLSAgICAgIHJmZCA9IGlucHV0X2RlYnVnLT5pZmRtYXBbcmZkXTsKLSAgICAgICgqc3dhcF9yZmRfb3V0KSAob3V0cHV0X2JmZCwgJnJmZCwgKFBUUikgcmZkX291dCk7Ci0gICAgICByZmRfb3V0ICs9IGV4dGVybmFsX3JmZF9zaXplOwotICAgIH0KLQotICBvbGRyZmRiYXNlID0gb3V0cHV0X3N5bWhkci0+Y3JmZDsKLSAgb3V0cHV0X3N5bWhkci0+Y3JmZCArPSBpbnB1dF9zeW1oZHItPmNyZmQ7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBGRFIncyBhbmQgY29weSBvdmVyIGFsbCBhc3NvY2lhdGVkIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHN6ID0gY29waWVkICogZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGZkcl9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLSAgaWYgKCFmZHJfb3V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmZkciwgJmFpbmZvLT5mZHJfZW5kLCBmZHJfb3V0LCBzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGZkcl9wdHIgPSBmZHJfc3RhcnQsIGkgPSAwOwotICAgICAgIGZkcl9wdHIgPCBmZHJfZW5kOwotICAgICAgIGZkcl9wdHIgKz0gZmRyX2FkZCwgaSsrKQotICAgIHsKLSAgICAgIEZEUiBmZHI7Ci0gICAgICBiZmRfdm1hIGZkcl9hZHI7Ci0gICAgICBiZmRfYnl0ZSAqc3ltX291dDsKLSAgICAgIGJmZF9ieXRlICpscmF3X3NyYzsKLSAgICAgIGJmZF9ieXRlICpscmF3X2VuZDsKLSAgICAgIGJvb2xlYW4gZmdvdGZpbGVuYW1lOwotCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmlmZG1hcFtpXSA8IG91dHB1dF9zeW1oZHItPmlmZE1heCkKLQl7Ci0JICAvKiBXZSBhcmUgbm90IGNvcHlpbmcgdGhpcyBGRFIuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmZkciAhPSAoRkRSICopIE5VTEwpCi0JZmRyID0gKihGRFIgKikgZmRyX3B0cjsKLSAgICAgIGVsc2UKLQkoKmlucHV0X3N3YXAtPnN3YXBfZmRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBmZHJfcHRyLCAmZmRyKTsKLQotICAgICAgZmRyX2FkciA9IGZkci5hZHI7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgRkRSIGFkZHJlc3MgZm9yIGFueSBjaGFuZ2VzIHRoYXQgbWF5IGhhdmUgYmVlbgotCSBtYWRlIGJ5IHJlbGF4aW5nLiAgKi8KLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JewotCSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0JICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JICAgICAgIGFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhZGp1c3QgPSBhZGp1c3QtPm5leHQpCi0JICAgIGlmIChmZHJfYWRyID49IGFkanVzdC0+c3RhcnQKLQkJJiYgZmRyX2FkciA8IGFkanVzdC0+ZW5kKQotCSAgICAgIGZkci5hZHIgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JfQotCi0gICAgICAvKiBGSVhNRTogSXQgaXMgY29uY2VpdmFibGUgdGhhdCB0aGlzIEZEUiBwb2ludHMgdG8gdGhlIC5pbml0IG9yCi0JIC5maW5pIHNlY3Rpb24sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIG5vdCBkbyB0aGUgcmlnaHQKLQkgdGhpbmcuICAqLwotICAgICAgZmRyLmFkciArPSBzZWN0aW9uX2FkanVzdFtzY1RleHRdOwotCi0gICAgICAvKiBTd2FwIGluIHRoZSBsb2NhbCBzeW1ib2xzLCBhZGp1c3QgdGhlaXIgdmFsdWVzLCBhbmQgc3dhcCB0aGVtCi0JIG91dCBhZ2Fpbi4gICovCi0gICAgICBmZ290ZmlsZW5hbWUgPSBmYWxzZTsKLSAgICAgIHN6ID0gZmRyLmNzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIHN5bV9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLSAgICAgIGlmICghc3ltX291dCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3ltLCAmYWluZm8tPnN5bV9lbmQsIHN5bV9vdXQsCi0JCQkgICAgICAgc3opKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxyYXdfc3JjID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfc3ltCi0JCSAgKyBmZHIuaXN5bUJhc2UgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBscmF3X2VuZCA9IGxyYXdfc3JjICsgZmRyLmNzeW0gKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOyAgbHJhd19zcmMgPCBscmF3X2VuZDsgIGxyYXdfc3JjICs9IGlucHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCXsKLQkgIFNZTVIgaW50ZXJuYWxfc3ltOwotCi0JICAoKnN3YXBfc3ltX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBscmF3X3NyYywgJmludGVybmFsX3N5bSk7Ci0KLQkgIEJGRF9BU1NFUlQgKGludGVybmFsX3N5bS5zYyAhPSBzY0NvbW1vbgotCQkgICAgICAmJiBpbnRlcm5hbF9zeW0uc2MgIT0gc2NTQ29tbW9uKTsKLQotCSAgLyogQWRqdXN0IHRoZSBzeW1ib2wgdmFsdWUgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgc3dpdGNoIChpbnRlcm5hbF9zeW0uc3QpCi0JICAgIHsKLQkgICAgY2FzZSBzdE5pbDoKLQkgICAgICBpZiAoRUNPRkZfSVNfU1RBQiAoJmludGVybmFsX3N5bSkpCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2Ugc3RHbG9iYWw6Ci0JICAgIGNhc2Ugc3RTdGF0aWM6Ci0JICAgIGNhc2Ugc3RMYWJlbDoKLQkgICAgY2FzZSBzdFByb2M6Ci0JICAgIGNhc2Ugc3RTdGF0aWNQcm9jOgotCSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JCXsKLQkJICBiZmRfdm1hIHZhbHVlOwotCQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotCQkgIHZhbHVlID0gaW50ZXJuYWxfc3ltLnZhbHVlOwotCQkgIGZvciAoYWRqdXN0ID0gaW5wdXRfZGVidWctPmFkanVzdDsKLQkJICAgICAgIGFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCQkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQotCQkgICAgaWYgKHZhbHVlID49IGFkanVzdC0+c3RhcnQKLQkJCSYmIHZhbHVlIDwgYWRqdXN0LT5lbmQpCi0JCSAgICAgIGludGVybmFsX3N5bS52YWx1ZSArPSBhZGp1c3QtPmFkanVzdDsKLQkJfQotCSAgICAgIGludGVybmFsX3N5bS52YWx1ZSArPSBzZWN0aW9uX2FkanVzdFtpbnRlcm5hbF9zeW0uc2NdOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIGRvaW5nIGEgZmluYWwgbGluaywgd2UgaGFzaCBhbGwgdGhlIHN0cmluZ3MgaW4KLQkgICAgIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUgdG9nZXRoZXIuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudAotCSAgICAgb2Ygc3BhY2UgcmVxdWlyZWQgYnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UgZG9uJ3QgZG8KLQkgICAgIHRoaXMgd2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgYmVjYXVzZSBpdCB3b3VsZAotCSAgICAgcHJldmVudCB1cyBmcm9tIGVhc2lseSBtZXJnaW5nIGRpZmZlcmVudCBGRFIncy4gICovCi0JICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBib29sZWFuIGZmaWxlbmFtZTsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKCEgZmdvdGZpbGVuYW1lICYmIGludGVybmFsX3N5bS5pc3MgPT0gZmRyLnJzcykKLQkJZmZpbGVuYW1lID0gdHJ1ZTsKLQkgICAgICBlbHNlCi0JCWZmaWxlbmFtZSA9IGZhbHNlOwotCi0JICAgICAgLyogSGFzaCB0aGUgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgICAgIG5hbWUgPSBpbnB1dF9kZWJ1Zy0+c3MgKyBmZHIuaXNzQmFzZSArIGludGVybmFsX3N5bS5pc3M7Ci0JICAgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCWludGVybmFsX3N5bS5pc3MgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0KLQkJICBzaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmFpbmZvLT5zdHJfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCSAgaWYgKHNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpZiAoc2gtPnZhbCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgc2gtPnZhbCA9IG91dHB1dF9zeW1oZHItPmlzc01heDsKLQkJICAgICAgb3V0cHV0X3N5bWhkci0+aXNzTWF4ICs9IHN0cmxlbiAobmFtZSkgKyAxOwotCQkgICAgICBpZiAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQkJYWluZm8tPnNzX2hhc2ggPSBzaDsKLQkJICAgICAgaWYgKGFpbmZvLT5zc19oYXNoX2VuZAotCQkJICAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCQlhaW5mby0+c3NfaGFzaF9lbmQtPm5leHQgPSBzaDsKLQkJICAgICAgYWluZm8tPnNzX2hhc2hfZW5kID0gc2g7Ci0JCSAgICB9Ci0JCSAgaW50ZXJuYWxfc3ltLmlzcyA9IHNoLT52YWw7Ci0JCX0KLQotCSAgICAgIGlmIChmZmlsZW5hbWUpCi0JCXsKLQkJICBmZHIucnNzID0gaW50ZXJuYWxfc3ltLmlzczsKLQkJICBmZ290ZmlsZW5hbWUgPSB0cnVlOwotCQl9Ci0JICAgIH0KLQotCSAgKCpzd2FwX3N5bV9vdXQpIChvdXRwdXRfYmZkLCAmaW50ZXJuYWxfc3ltLCBzeW1fb3V0KTsKLQkgIHN5bV9vdXQgKz0gZXh0ZXJuYWxfc3ltX3NpemU7Ci0JfQotCi0gICAgICBmZHIuaXN5bUJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pc3ltTWF4OwotICAgICAgb3V0cHV0X3N5bWhkci0+aXN5bU1heCArPSBmZHIuY3N5bTsKLQotICAgICAgLyogQ29weSB0aGUgaW5mb3JtYXRpb24gdGhhdCBkb2VzIG5vdCBuZWVkIHN3YXBwaW5nLiAgKi8KLQotICAgICAgLyogRklYTUU6IElmIHdlIGFyZSByZWxheGluZywgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxpbmUKLQkgbnVtYmVycy4gIEZyYW5rbHksIGZvcmdldCBpdC4gIEFueWJvZHkgdXNpbmcgc3RhYnMgZGVidWdnaW5nCi0JIGluZm9ybWF0aW9uIHdpbGwgbm90IHVzZSB0aGlzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCBhbmQKLQkgc3RhYnMgYXJlIGFkanVzdGVkIGNvcnJlY3RseS4gICovCi0gICAgICBpZiAoZmRyLmNiTGluZSA+IDApCi0JewotCSAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5saW5lLCAmYWluZm8tPmxpbmVfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3N5bWhkci0+Y2JMaW5lT2Zmc2V0ICsgZmRyLmNiTGluZU9mZnNldCwKLQkJCQkgZmRyLmNiTGluZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZkci5pbGluZUJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pbGluZU1heDsKLQkgIGZkci5jYkxpbmVPZmZzZXQgPSBvdXRwdXRfc3ltaGRyLT5jYkxpbmU7Ci0JICBvdXRwdXRfc3ltaGRyLT5pbGluZU1heCArPSBmZHIuY2xpbmU7Ci0JICBvdXRwdXRfc3ltaGRyLT5jYkxpbmUgKz0gZmRyLmNiTGluZTsKLQl9Ci0gICAgICBpZiAoZmRyLmNhdXggPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+YXV4LCAmYWluZm8tPmF1eF9lbmQsCi0JCQkJIGlucHV0X2JmZCwKLQkJCQkgKGlucHV0X3N5bWhkci0+Y2JBdXhPZmZzZXQKLQkJCQkgICsgZmRyLmlhdXhCYXNlICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSksCi0JCQkJIGZkci5jYXV4ICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZkci5pYXV4QmFzZSA9IG91dHB1dF9zeW1oZHItPmlhdXhNYXg7Ci0JICBvdXRwdXRfc3ltaGRyLT5pYXV4TWF4ICs9IGZkci5jYXV4OwotCX0KLSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0KLQkgIC8qIFdoZW4gYXJlIGFyZSBoYXNoaW5nIHN0cmluZ3MsIHdlIGxpZSBhYm91dCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdHJpbmdzIGF0dGFjaGVkIHRvIGVhY2ggRkRSLiAgV2UgbmVlZCB0byBzZXQgY2JTcwotCSAgICAgYmVjYXVzZSBzb21lIHZlcnNpb25zIG9mIGRieCBhcHBhcmVudGx5IHVzZSBpdCB0byBkZWNpZGUKLQkgICAgIGhvdyBtdWNoIG9mIHRoZSBzdHJpbmcgdGFibGUgdG8gcmVhZCBpbi4gICovCi0JICBmZHIuaXNzQmFzZSA9IDA7Ci0JICBmZHIuY2JTcyA9IG91dHB1dF9zeW1oZHItPmlzc01heDsKLQl9Ci0gICAgICBlbHNlIGlmIChmZHIuY2JTcyA+IDApCi0JewotCSAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5zcywgJmFpbmZvLT5zc19lbmQsCi0JCQkJIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc3ltaGRyLT5jYlNzT2Zmc2V0ICsgZmRyLmlzc0Jhc2UsCi0JCQkJIGZkci5jYlNzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZmRyLmlzc0Jhc2UgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JICBvdXRwdXRfc3ltaGRyLT5pc3NNYXggKz0gZmRyLmNiU3M7Ci0JfQotCi0gICAgICBpZiAoKG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICA9PSBpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpCi0JICAmJiBpbnB1dF9kZWJ1Zy0+YWRqdXN0ID09IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JewotCSAgLyogVGhlIHR3byBCRkQncyBoYXZlIHRoZSBzYW1lIGVuZGlhbm5lc3MsIGFuZCB3ZSBkb24ndCBoYXZlCi0JICAgICB0byBhZGp1c3QgdGhlIFBEUiBhZGRyZXNzZXMsIHNvIHNpbXBseSBjb3B5aW5nIHRoZQotCSAgICAgaW5mb3JtYXRpb24gd2lsbCBzdWZmaWNlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGV4dGVybmFsX3Bkcl9zaXplID09IGlucHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLQkgIGlmIChmZHIuY3BkID4gMCkKLQkgICAgewotCSAgICAgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+cGRyLCAmYWluZm8tPnBkcl9lbmQsCi0JCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJICAgICAoaW5wdXRfc3ltaGRyLT5jYlBkT2Zmc2V0Ci0JCQkJICAgICAgKyBmZHIuaXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSksCi0JCQkJICAgICBmZHIuY3BkICogZXh0ZXJuYWxfcGRyX3NpemUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKGV4dGVybmFsX29wdF9zaXplID09IGlucHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLQkgIGlmIChmZHIuY29wdCA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPm9wdCwgJmFpbmZvLT5vcHRfZW5kLAotCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCSAgICAgKGlucHV0X3N5bWhkci0+Y2JPcHRPZmZzZXQKLQkJCQkgICAgICArIGZkci5pb3B0QmFzZSAqIGV4dGVybmFsX29wdF9zaXplKSwKLQkJCQkgICAgIGZkci5jb3B0ICogZXh0ZXJuYWxfb3B0X3NpemUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NpemVfdHlwZSBvdXRzeiwgaW5zejsKLQkgIGJmZF9ieXRlICppbjsKLQkgIGJmZF9ieXRlICplbmQ7Ci0JICBiZmRfYnl0ZSAqb3V0OwotCi0JICAvKiBUaGUgdHdvIEJGRCdzIGhhdmUgZGlmZmVyZW50IGVuZGlhbm5lc3MsIHNvIHdlIG11c3Qgc3dhcAotCSAgICAgZXZlcnl0aGluZyBpbiBhbmQgb3V0LiAgVGhpcyBjb2RlIHdvdWxkIGFsd2F5cyB3b3JrLCBidXQKLQkgICAgIGl0IHdvdWxkIGJlIHVubmVjZXNzYXJpbHkgc2xvdyBpbiB0aGUgbm9ybWFsIGNhc2UuICAqLwotCSAgb3V0c3ogPSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgIGluc3ogPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQkgIGluID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfcGRyCi0JCSsgZmRyLmlwZEZpcnN0ICogaW5zeik7Ci0JICBlbmQgPSBpbiArIGZkci5jcGQgKiBpbnN6OwotCSAgc3ogPSBmZHIuY3BkICogb3V0c3o7Ci0JICBvdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLQkgIGlmICghb3V0KQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+cGRyLCAmYWluZm8tPnBkcl9lbmQsIG91dCwKLQkJCQkgICBzeikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZvciAoOyBpbiA8IGVuZDsgaW4gKz0gaW5zeiwgb3V0ICs9IG91dHN6KQotCSAgICB7Ci0JICAgICAgUERSIHBkcjsKLQotCSAgICAgICgqaW5wdXRfc3dhcC0+c3dhcF9wZHJfaW4pIChpbnB1dF9iZmQsIChQVFIpIGluLCAmcGRyKTsKLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYmVlbiByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRqdXN0IHRoZQotCQkgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKGlucHV0X2RlYnVnLT5hZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQkJewotCQkgIGJmZF92bWEgYWRyOwotCQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotCQkgIGFkciA9IGZkcl9hZHIgKyBwZHIuYWRyOwotCQkgIGZvciAoYWRqdXN0ID0gaW5wdXRfZGVidWctPmFkanVzdDsKLQkJICAgICAgIGFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCQkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQotCQkgICAgaWYgKGFkciA+PSBhZGp1c3QtPnN0YXJ0Ci0JCQkmJiBhZHIgPCBhZGp1c3QtPmVuZCkKLQkJICAgICAgcGRyLmFkciArPSBhZGp1c3QtPmFkanVzdDsKLQkJfQotCi0JICAgICAgKCpvdXRwdXRfc3dhcC0+c3dhcF9wZHJfb3V0KSAob3V0cHV0X2JmZCwgJnBkciwgKFBUUikgb3V0KTsKLQkgICAgfQotCi0JICAvKiBTd2FwIG92ZXIgdGhlIG9wdGltaXphdGlvbiBpbmZvcm1hdGlvbi4gICovCi0JICBvdXRzeiA9IGV4dGVybmFsX29wdF9zaXplOwotCSAgaW5zeiA9IGlucHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplOwotCSAgaW4gPSAoKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9vcHQKLQkJKyBmZHIuaW9wdEJhc2UgKiBpbnN6KTsKLQkgIGVuZCA9IGluICsgZmRyLmNvcHQgKiBpbnN6OwotCSAgc3ogPSBmZHIuY29wdCAqIG91dHN6OwotCSAgb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0JICBpZiAoIW91dCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPm9wdCwgJmFpbmZvLT5vcHRfZW5kLCBvdXQsCi0JCQkJICAgc3opKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmb3IgKDsgaW4gPCBlbmQ7IGluICs9IGluc3osIG91dCArPSBvdXRzeikKLQkgICAgewotCSAgICAgIE9QVFIgb3B0OwotCi0JICAgICAgKCppbnB1dF9zd2FwLT5zd2FwX29wdF9pbikgKGlucHV0X2JmZCwgKFBUUikgaW4sICZvcHQpOwotCSAgICAgICgqb3V0cHV0X3N3YXAtPnN3YXBfb3B0X291dCkgKG91dHB1dF9iZmQsICZvcHQsIChQVFIpIG91dCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZkci5pcGRGaXJzdCA9IG91dHB1dF9zeW1oZHItPmlwZE1heDsKLSAgICAgIG91dHB1dF9zeW1oZHItPmlwZE1heCArPSBmZHIuY3BkOwotICAgICAgZmRyLmlvcHRCYXNlID0gb3V0cHV0X3N5bWhkci0+aW9wdE1heDsKLSAgICAgIG91dHB1dF9zeW1oZHItPmlvcHRNYXggKz0gZmRyLmNvcHQ7Ci0KLSAgICAgIGlmIChmZHIuY3JmZCA8PSAwKQotCXsKLQkgIC8qIFBvaW50IHRoaXMgRkRSIGF0IHRoZSB0YWJsZSBvZiBSRkQncyB3ZSBjcmVhdGVkLiAgKi8KLQkgIGZkci5yZmRCYXNlID0gbmV3cmZkYmFzZTsKLQkgIGZkci5jcmZkID0gaW5wdXRfc3ltaGRyLT5pZmRNYXg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFBvaW50IHRoaXMgRkRSIGF0IHRoZSByZW1hcHBlZCBSRkQncy4gICovCi0JICBmZHIucmZkQmFzZSArPSBvbGRyZmRiYXNlOwotCX0KLQotICAgICAgKCpzd2FwX2Zkcl9vdXQpIChvdXRwdXRfYmZkLCAmZmRyLCBmZHJfb3V0KTsKLSAgICAgIGZkcl9vdXQgKz0gZXh0ZXJuYWxfZmRyX3NpemU7Ci0gICAgICArK291dHB1dF9zeW1oZHItPmlmZE1heDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHN0cmluZyB0byB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdlIGFyZSBhY2N1bXVsYXRpbmcuCi0gICBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBmZHIgc3RyaW5nIGJhc2UuICAqLwotCi1zdGF0aWMgbG9uZyBlY29mZl9hZGRfc3RyaW5nIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqLAotCQkJCSAgICAgIEZEUiAqZmRyLCBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotc3RhdGljIGxvbmcKLWVjb2ZmX2FkZF9zdHJpbmcgKGFpbmZvLCBpbmZvLCBkZWJ1ZywgZmRyLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgRkRSICpmZHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBzaXplX3QgbGVuOwotICBiZmRfc2l6ZV90eXBlIHJldDsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgbGVuID0gc3RybGVuIChzdHJpbmcpOwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5zcywgJmFpbmZvLT5zc19lbmQsIChQVFIpIHN0cmluZywKLQkJCSAgICAgICBsZW4gKyAxKSkKLQlyZXR1cm4gLTE7Ci0gICAgICByZXQgPSBzeW1oZHItPmlzc01heDsKLSAgICAgIHN5bWhkci0+aXNzTWF4ICs9IGxlbiArIDE7Ci0gICAgICBmZHItPmNiU3MgKz0gbGVuICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0gICAgICBzaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmFpbmZvLT5zdHJfaGFzaCwgc3RyaW5nLCB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHNoLT52YWwgPT0gLTEpCi0JewotCSAgc2gtPnZhbCA9IHN5bWhkci0+aXNzTWF4OwotCSAgc3ltaGRyLT5pc3NNYXggKz0gbGVuICsgMTsKLQkgIGlmIChhaW5mby0+c3NfaGFzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFpbmZvLT5zc19oYXNoID0gc2g7Ci0JICBpZiAoYWluZm8tPnNzX2hhc2hfZW5kCi0JICAgICAgIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhaW5mby0+c3NfaGFzaF9lbmQtPm5leHQgPSBzaDsKLQkgIGFpbmZvLT5zc19oYXNoX2VuZCA9IHNoOwotCX0KLSAgICAgIHJldCA9IHNoLT52YWw7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIG5vbi1FQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgb3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLAotCQkJCSAgb3V0cHV0X3N3YXAsIGlucHV0X2JmZCwgaW5mbykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXA7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9zeW1fb3V0OwotICBIRFJSICpvdXRwdXRfc3ltaGRyID0gJm91dHB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBGRFIgZmRyOwotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICoqc3ltYm9sczsKLSAgYXN5bWJvbCAqKnN5bV9wdHI7Ci0gIGFzeW1ib2wgKipzeW1fZW5kOwotICBsb25nIHN5bXNpemU7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBleHRlcm5hbF9mZHI7Ci0KLSAgbWVtc2V0ICgoUFRSKSAmZmRyLCAwLCBzaXplb2YgZmRyKTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgaWYgKHNlYyAhPSBOVUxMKQotICAgIGZkci5hZHIgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogV2hhdCBhYm91dCAuaW5pdCBvciAuZmluaT8gICovCi0gICAgICBmZHIuYWRyID0gMDsKLSAgICB9Ci0KLSAgZmRyLmlzc0Jhc2UgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0gIGZkci5jYlNzID0gMDsKLSAgZmRyLnJzcyA9IGVjb2ZmX2FkZF9zdHJpbmcgKGFpbmZvLCBpbmZvLCBvdXRwdXRfZGVidWcsICZmZHIsCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLSAgaWYgKGZkci5yc3MgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmZHIuaXN5bUJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pc3ltTWF4OwotCi0gIC8qIEdldCB0aGUgbG9jYWwgc3ltYm9scyBmcm9tIHRoZSBpbnB1dCBCRkQuICAqLwotICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGlucHV0X2JmZCk7Ci0gIGlmIChzeW1zaXplIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzeW1zaXplKTsKLSAgaWYgKHN5bWJvbHMgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChpbnB1dF9iZmQsIHN5bWJvbHMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltX2VuZCA9IHN5bWJvbHMgKyBzeW1jb3VudDsKLQotICAvKiBIYW5kbGUgdGhlIGxvY2FsIHN5bWJvbHMuICBBbnkgZXh0ZXJuYWwgc3ltYm9scyBhcmUgaGFuZGxlZAotICAgICBzZXBhcmF0ZWx5LiAgKi8KLSAgZmRyLmNzeW0gPSAwOwotICBmb3IgKHN5bV9wdHIgPSBzeW1ib2xzOyBzeW1fcHRyICE9IHN5bV9lbmQ7IHN5bV9wdHIrKykKLSAgICB7Ci0gICAgICBTWU1SIGludGVybmFsX3N5bTsKLSAgICAgIFBUUiBleHRlcm5hbF9zeW07Ci0KLSAgICAgIGlmICgoKCpzeW1fcHRyKS0+ZmxhZ3MgJiBCU0ZfRVhQT1JUKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgbWVtc2V0ICgoUFRSKSAmaW50ZXJuYWxfc3ltLCAwLCBzaXplb2YgaW50ZXJuYWxfc3ltKTsKLSAgICAgIGludGVybmFsX3N5bS5pc3MgPSBlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgb3V0cHV0X2RlYnVnLCAmZmRyLAotCQkJCQkgICAoKnN5bV9wdHIpLT5uYW1lKTsKLQotICAgICAgaWYgKGludGVybmFsX3N5bS5pc3MgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoKCpzeW1fcHRyKS0+c2VjdGlvbikKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoKCpzeW1fcHRyKS0+c2VjdGlvbikpCi0JaW50ZXJuYWxfc3ltLnZhbHVlID0gKCpzeW1fcHRyKS0+dmFsdWU7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfc3ltLnZhbHVlID0gKCgqc3ltX3B0ciktPnZhbHVlCi0JCQkgICAgICArICgqc3ltX3B0ciktPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICsgKCpzeW1fcHRyKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBpbnRlcm5hbF9zeW0uc3QgPSBzdE5pbDsKLSAgICAgIGludGVybmFsX3N5bS5zYyA9IHNjVW5kZWZpbmVkOwotICAgICAgaW50ZXJuYWxfc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0KLSAgICAgIGV4dGVybmFsX3N5bSA9IChQVFIpIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgICBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgaWYgKCFleHRlcm5hbF9zeW0pCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKCpzd2FwX3N5bV9vdXQpIChvdXRwdXRfYmZkLCAmaW50ZXJuYWxfc3ltLCBleHRlcm5hbF9zeW0pOwotICAgICAgYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5zeW0sICZhaW5mby0+c3ltX2VuZCwKLQkJCSAgZXh0ZXJuYWxfc3ltLCBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgKytmZHIuY3N5bTsKLSAgICAgICsrb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKG91dHB1dF9iZmQsIChQVFIpIHN5bWJvbHMpOwotCi0gIC8qIExlYXZlIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgRkRSIHplcm9lZCBvdXQuICBUaGlzIHdpbGwgY2F1c2UKLSAgICAgdGhlIGxhbmcgZmllbGQgdG8gYmUgbGFuZ0MuICBUaGUgZkJpZ2VuZGlhbiBmaWVsZCB3aWxsCi0gICAgIGluZGljYXRlIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZQotICAgICBpdCBvbmx5IGFwcGxpZXMgdG8gYXV4IGZpZWxkcyBhbmQgdGhlcmUgYXJlIG5vbmUuICAqLwotICBleHRlcm5hbF9mZHIgPSAoUFRSKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkgICAgICAgb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgaWYgKCFleHRlcm5hbF9mZHIpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAoKm91dHB1dF9zd2FwLT5zd2FwX2Zkcl9vdXQpIChvdXRwdXRfYmZkLCAmZmRyLCBleHRlcm5hbF9mZHIpOwotICBhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmZkciwgJmFpbmZvLT5mZHJfZW5kLAotCQkgICAgICBleHRlcm5hbF9mZHIsIG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0KLSAgKytvdXRwdXRfc3ltaGRyLT5pZmRNYXg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBleHRlcm5hbCBzeW1ib2xzLgotICAgRklYTUU6IFRoaXMgaXMgZG9uZSB1c2luZyBhIG1lbW9yeSBidWZmZXIsIGJ1dCBpdCBzaG91bGQgYmUKLSAgIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8gdXNlIGEgc2h1ZmZsZSBzdHJ1Y3R1cmUuICBUaGUgYXNzZW1ibGVyIHVzZXMKLSAgIHRoaXMgaW50ZXJmYWNlLCBzbyB0aGF0IG11c3QgYmUgY2hhbmdlZCB0byBkbyBzb21ldGhpbmcgZWxzZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMgKGFiZmQsIGRlYnVnLCBzd2FwLCByZWxvY2F0ZWFibGUsIGdldF9leHRyLAotCQkJICAgc2V0X2luZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBib29sZWFuICgqZ2V0X2V4dHIpIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci0gICAgIHZvaWQgKCpzZXRfaW5kZXgpIFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgc2l6ZV90IGM7Ci0KLSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBpZiAoc3ltX3B0cl9wdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW1fcHRyOwotICAgICAgRVhUUiBlc3ltOwotCi0gICAgICBzeW1fcHRyID0gKnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBHZXQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoKCpnZXRfZXh0cikgKHN5bV9wdHIsICZlc3ltKSA9PSBmYWxzZSkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UncmUgcHJvZHVjaW5nIGFuIGV4ZWN1dGFibGUsIG1vdmUgY29tbW9uIHN5bWJvbHMgaW50bwotCSBic3MuICAqLwotICAgICAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZSkKLQl7Ci0JICBpZiAoZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCSAgICBlc3ltLmFzeW0uc2MgPSBzY0JzczsKLQkgIGVsc2UgaWYgKGVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JICAgIGVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bV9wdHItPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bV9wdHItPnNlY3Rpb24pCi0JICB8fCBzeW1fcHRyLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICAvKiBGSVhNRTogZ2FzIGRvZXMgbm90IGtlZXAgdGhlIHZhbHVlIG9mIGEgc21hbGwgdW5kZWZpbmVkCi0JICAgICBzeW1ib2wgaW4gdGhlIHN5bWJvbCBpdHNlbGYsIGJlY2F1c2Ugb2YgcmVsb2NhdGlvbgotCSAgICAgcHJvYmxlbXMuICAqLwotCSAgaWYgKGVzeW0uYXN5bS5zYyAhPSBzY1NVbmRlZmluZWQKLQkgICAgICB8fCBlc3ltLmFzeW0udmFsdWUgPT0gMAotCSAgICAgIHx8IHN5bV9wdHItPnZhbHVlICE9IDApCi0JICAgIGVzeW0uYXN5bS52YWx1ZSA9IHN5bV9wdHItPnZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQllc3ltLmFzeW0udmFsdWUgPSAoc3ltX3B0ci0+dmFsdWUKLQkJCSAgICsgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgKyBzeW1fcHRyLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICAgICAgaWYgKHNldF9pbmRleCkKLQkoKnNldF9pbmRleCkgKHN5bV9wdHIsIChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlleHRNYXgpOwotCi0gICAgICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCBkZWJ1Zywgc3dhcCwKLQkJCQkJICBzeW1fcHRyLT5uYW1lLCAmZXN5bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgc2luZ2xlIGV4dGVybmFsIHN5bWJvbCB0byB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgZGVidWcsIHN3YXAsIG5hbWUsIGVzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRVhUUiAqZXN5bTsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2V4dF9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVYVFIgKiwgUFRSKSkKLSAgICA9IHN3YXAtPnN3YXBfZXh0X291dDsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBzaXplX3QgbmFtZWxlbjsKLQotICBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKLQotICBpZiAoKHNpemVfdCkgKGRlYnVnLT5zc2V4dF9lbmQgLSBkZWJ1Zy0+c3NleHQpCi0gICAgICA8IHN5bWhkci0+aXNzRXh0TWF4ICsgbmFtZWxlbiArIDEpCi0gICAgewotICAgICAgaWYgKGVjb2ZmX2FkZF9ieXRlcyAoKGNoYXIgKiopICZkZWJ1Zy0+c3NleHQsCi0JCQkgICAoY2hhciAqKikgJmRlYnVnLT5zc2V4dF9lbmQsCi0JCQkgICBzeW1oZHItPmlzc0V4dE1heCArIG5hbWVsZW4gKyAxKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChzaXplX3QpICgoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZAotCQktIChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9leHQpCi0gICAgICA8IChzeW1oZHItPmlleHRNYXggKyAxKSAqIGV4dGVybmFsX2V4dF9zaXplKQotICAgIHsKLSAgICAgIGlmIChlY29mZl9hZGRfYnl0ZXMgKChjaGFyICoqKSAmZGVidWctPmV4dGVybmFsX2V4dCwKLQkJCSAgIChjaGFyICoqKSAmZGVidWctPmV4dGVybmFsX2V4dF9lbmQsCi0JCQkgICAoc3ltaGRyLT5pZXh0TWF4ICsgMSkgKiBleHRlcm5hbF9leHRfc2l6ZSkKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZXN5bS0+YXN5bS5pc3MgPSBzeW1oZHItPmlzc0V4dE1heDsKLQotICAoKnN3YXBfZXh0X291dCkgKGFiZmQsIGVzeW0sCi0JCSAgICgoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0Ci0JCSAgICArIHN5bWhkci0+aWV4dE1heCAqIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKSk7Ci0KLSAgKytzeW1oZHItPmlleHRNYXg7Ci0KLSAgc3RyY3B5IChkZWJ1Zy0+c3NleHQgKyBzeW1oZHItPmlzc0V4dE1heCwgbmFtZSk7Ci0gIHN5bWhkci0+aXNzRXh0TWF4ICs9IG5hbWVsZW4gKyAxOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbGlnbiB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX2FsaWduLCBhdXhfYWxpZ24sIHJmZF9hbGlnbjsKLSAgc2l6ZV90IGFkZDsKLQotICAvKiBBZGp1c3QgdGhlIGNvdW50cyBzbyB0aGF0IHN0cnVjdHVyZXMgYXJlIGFsaWduZWQuICAqLwotICBkZWJ1Z19hbGlnbiA9IHN3YXAtPmRlYnVnX2FsaWduOwotICBhdXhfYWxpZ24gPSBkZWJ1Z19hbGlnbiAvIHNpemVvZiAodW5pb24gYXV4X2V4dCk7Ci0gIHJmZF9hbGlnbiA9IGRlYnVnX2FsaWduIC8gc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemU7Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5jYkxpbmUgJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5saW5lICE9ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPmxpbmUgKyBzeW1oZHItPmNiTGluZSksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmNiTGluZSArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+aXNzTWF4ICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+c3MgIT0gKGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+c3MgKyBzeW1oZHItPmlzc01heCksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmlzc01heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+aXNzRXh0TWF4ICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+c3NleHQgIT0gKGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+c3NleHQgKyBzeW1oZHItPmlzc0V4dE1heCksIDAsIGFkZCk7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IGF1eF9hbGlnbiAtIChzeW1oZHItPmlhdXhNYXggJiAoYXV4X2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGF1eF9hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSAodW5pb24gYXV4X2V4dCAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5leHRlcm5hbF9hdXggKyBzeW1oZHItPmlhdXhNYXgpLCAwLAotCQlhZGQgKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgICAgIHN5bWhkci0+aWF1eE1heCArPSBhZGQ7Ci0gICAgfQotCi0gIGFkZCA9IHJmZF9hbGlnbiAtIChzeW1oZHItPmNyZmQgJiAocmZkX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IHJmZF9hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSAoUFRSKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKChjaGFyICopIGRlYnVnLT5leHRlcm5hbF9yZmQKLQkJICAgICAgICsgc3ltaGRyLT5jcmZkICogc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpLAotCQkwLCAoc2l6ZV90KSAoYWRkICogc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKTsKLSAgICAgIHN5bWhkci0+Y3JmZCArPSBhZGQ7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgYnkgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotewotICBiZmRfc2l6ZV90eXBlIHRvdDsKLQotICBlY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApOwotICB0b3QgPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZTsKLQotI2RlZmluZSBBREQoY291bnQsIHNpemUpIFwKLSAgdG90ICs9IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY291bnQgKiBzaXplCi0KLSAgQUREIChjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBBREQgKGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBBREQgKGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotICBBREQgKGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgQUREIChpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIEFERCAoaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIEFERCAoaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgQUREIChpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBBREQgKGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBBREQgKGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgQUREIChpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0KLSN1bmRlZiBBREQKLQotICByZXR1cm4gdG90OwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIEVDT0ZGIHN5bWJvbGljIGhlYWRlciwgZ2l2ZW4gdGhlIGZpbGUgcG9zaXRpb24gaXQgaXMKLSAgIGdvaW5nIHRvIGJlIHBsYWNlZCBhdC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjb3VudHMgYXJlIHNldAotICAgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGNoYXIgKmJ1ZmYgPSBOVUxMOwotCi0gIGVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCk7Ci0KLSAgLyogR28gdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoZXJlICs9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplOwotCi0gIHN5bWhkci0+bWFnaWMgPSBzd2FwLT5zeW1fbWFnaWM7Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXRzLiAgKi8KLSNkZWZpbmUgU0VUKG9mZnNldCwgY291bnQsIHNpemUpIFwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkgXAotICAgIHN5bWhkci0+b2Zmc2V0ID0gMDsgXAotICBlbHNlIFwKLSAgICB7IFwKLSAgICAgIHN5bWhkci0+b2Zmc2V0ID0gd2hlcmU7IFwKLSAgICAgIHdoZXJlICs9IHN5bWhkci0+Y291bnQgKiBzaXplOyBcCi0gICAgfQotCi0gIFNFVCAoY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBTRVQgKGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBTRVQgKGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotICBTRVQgKGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIFNFVCAoY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLSAgU0VUIChjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIFNFVCAoY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBTRVQgKGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBTRVQgKGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIFNFVCAoY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLSN1bmRlZiBTRVQKLQotICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKCpzd2FwLT5zd2FwX2hkcl9vdXQpIChhYmZkLCBzeW1oZHIsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSwgYWJmZCkKLSAgICAgICE9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gYXNzdW1lcwotICAgdGhhdCB0aGUgaW5mb3JtYXRpb24gKHRoZSBwb2ludGVycyBhbmQgY291bnRzKSBpbiAqREVCVUcgaGF2ZSBiZWVuCi0gICBzZXQgY29ycmVjdGx5LiAgV0hFUkUgaXMgdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHdyaXRlIHRoZQotICAgaW5mb3JtYXRpb24gdG8uICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCi0gICBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfd3JpdGVfZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgV1JJVEUocHRyLCBjb3VudCwgc2l6ZSwgb2Zmc2V0KSBcCi0gIEJGRF9BU1NFUlQgKHN5bWhkci0+b2Zmc2V0ID09IDAgXAotCSAgICAgIHx8IChiZmRfdm1hKSBiZmRfdGVsbCAoYWJmZCkgPT0gc3ltaGRyLT5vZmZzZXQpOyBcCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsIGFiZmQpIFwKLSAgICAgICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSBcCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFdSSVRFIChsaW5lLCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIGNiTGluZU9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9kbnIsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIGNiRG5PZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfcGRyLCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBjYlBkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3N5bSwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIGNiU3ltT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX29wdCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIGNiT3B0T2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2F1eCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwgY2JBdXhPZmZzZXQpOwotICBXUklURSAoc3MsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2JTc09mZnNldCk7Ci0gIFdSSVRFIChzc2V4dCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjYlNzRXh0T2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2ZkciwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgY2JGZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9yZmQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBjYlJmZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9leHQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBjYkV4dE9mZnNldCk7Ci0jdW5kZWYgV1JJVEUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWNvZmZfd3JpdGVfc2h1ZmZsZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCi0JCQkJCSAgICBzdHJ1Y3Qgc2h1ZmZsZSAqLCBQVFIgc3BhY2UpKTsKLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIHNodWZmbGUsIHNwYWNlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqc2h1ZmZsZTsKLSAgICAgUFRSIHNwYWNlOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2h1ZmZsZSAqbDsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICB0b3RhbCA9IDA7Ci0gIGZvciAobCA9IHNodWZmbGU7IGwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGwtPmZpbGVwKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKGwtPnUubWVtb3J5LCAxLCBsLT5zaXplLCBhYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfc2VlayAobC0+dS5maWxlLmlucHV0X2JmZCwgbC0+dS5maWxlLm9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoc3BhY2UsIDEsIGwtPnNpemUsIGwtPnUuZmlsZS5pbnB1dF9iZmQpICE9IGwtPnNpemUKLQkgICAgICB8fCBiZmRfd3JpdGUgKHNwYWNlLCAxLCBsLT5zaXplLCBhYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgdG90YWwgKz0gbC0+c2l6ZTsKLSAgICB9Ci0KLSAgaWYgKCh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2J5dGUgKnM7Ci0KLSAgICAgIGkgPSBzd2FwLT5kZWJ1Z19hbGlnbiAtICh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKTsKLSAgICAgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0gICAgICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCXsKLQkgIGZyZWUgKHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGZyZWUgKHMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB1c2luZyBhY2N1bXVsYXRlZCBsaW5rZXIKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChoYW5kbGUsIGFiZmQsIGRlYnVnLCBzd2FwLCBpbmZvLCB3aGVyZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIFBUUiBzcGFjZSA9IE5VTEw7Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNwYWNlID0gKFBUUikgYmZkX21hbGxvYyAoYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKTsKLSAgaWYgKHNwYWNlID09IE5VTEwgJiYgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmxpbmUsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+cGRyLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnN5bSwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5vcHQsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+YXV4LCBzcGFjZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBpcyB3cml0dGVuIG91dCBmcm9tIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYQotICAgICBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpOwotICAgICAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnNzLCBzcGFjZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLSAgICAgIGJmZF9ieXRlIG51bGw7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3MgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpOwotICAgICAgbnVsbCA9IDA7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmbnVsbCwgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHRvdGFsID0gMTsKLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IE5VTEwgfHwgYWluZm8tPnNzX2hhc2gtPnZhbCA9PSAxKTsKLSAgICAgIGZvciAoc2ggPSBhaW5mby0+c3NfaGFzaDsKLQkgICBzaCAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEw7Ci0JICAgc2ggPSBzaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBsZW4gPSBzdHJsZW4gKHNoLT5yb290LnN0cmluZyk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzaC0+cm9vdC5zdHJpbmcsIDEsIGxlbiArIDEsIGFiZmQpICE9IGxlbiArIDEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgdG90YWwgKz0gbGVuICsgMTsKLQl9Ci0KLSAgICAgIGlmICgodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGJmZF9ieXRlICpzOwotCi0JICBpID0gc3dhcC0+ZGVidWdfYWxpZ24gLSAodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSk7Ci0JICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotCSAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZnJlZSAocyk7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZXh0ZXJuYWwgc3RyaW5ncyBhbmQgc3ltYm9sIGFyZSBub3QgY29udmVydGVkIG92ZXIgdG8gdXNpbmcKLSAgICAgc2h1ZmZsZXMuICBGSVhNRTogVGhleSBwcm9iYWJseSBzaG91bGQgYmUuICAqLwotICBpZiAoYmZkX3dyaXRlIChkZWJ1Zy0+c3NleHQsIDEsIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4LCBhYmZkKQotICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4ICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfYnl0ZSAqczsKLQotICAgICAgaSA9IChzd2FwLT5kZWJ1Z19hbGlnbgotCSAgIC0gKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaXNzRXh0TWF4ICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpKTsKLSAgICAgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0gICAgICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCXsKLQkgIGZyZWUgKHMpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5mZHIsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+cmZkLCBzcGFjZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoZGVidWctPnN5bWJvbGljX2hlYWRlci5jYkV4dE9mZnNldCA9PSAwCi0JICAgICAgfHwgKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY2JFeHRPZmZzZXQKLQkJICA9PSAoYmZkX3ZtYSkgYmZkX3RlbGwgKGFiZmQpKSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAoZGVidWctPmV4dGVybmFsX2V4dCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsCi0JCSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXgsIGFiZmQpCi0gICAgICAhPSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoc3BhY2UgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZSk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2UgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEhhbmRsZSB0aGUgZmluZF9uZWFyZXN0X2xpbmUgZnVuY3Rpb24gZm9yIGJvdGggRUNPRkYgYW5kIE1JUFMgRUxGCi0gICBmaWxlcy4gICovCi0KLS8qIENvbXBhcmUgRkRSIGVudHJpZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBfZmRydGFiX2VudHJ5IChsZWZ0cCwgcmlnaHRwKQotICAgICBjb25zdCBQVFIgbGVmdHA7Ci0gICAgIGNvbnN0IFBUUiByaWdodHA7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKmxwID0KLSAgICAoY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqKSBsZWZ0cDsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqcnAgPQotICAgIChjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICopIHJpZ2h0cDsKLQotICBpZiAobHAtPmJhc2VfYWRkciA8IHJwLT5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIC0xOwotICBpZiAobHAtPmJhc2VfYWRkciA+IHJwLT5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBFYWNoIGZpbGUgZGVzY3JpcHRvciAoRkRSKSBoYXMgYSBtZW1vcnkgYWRkcmVzcywgdG8gc2ltcGxpZnkKLSAgIGxvb2tpbmcgdXAgYW4gRkRSIGJ5IGFkZHJlc3MsIHdlIGJ1aWxkIGEgdGFibGUgY292ZXJpbmcgYWxsIEZEUnMKLSAgIHRoYXQgaGF2ZSBhIGxlYXN0IG9uZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBpbiB0aGVtLiAgVGhlIGZpbmFsCi0gICB0YWJsZSB3aWxsIGJlIHNvcnRlZCBieSBhZGRyZXNzIHNvIHdlIGNhbiBsb29rIGl0IHVwIHZpYSBiaW5hcnkKLSAgIHNlYXJjaC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ta19mZHJ0YWIgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotewotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgRkRSICpmZHJfc3RhcnQ7Ci0gIEZEUiAqZmRyX2VuZDsKLSAgYm9vbGVhbiBzdGFiczsKLSAgbG9uZyBsZW47Ci0KLSAgZmRyX3N0YXJ0ID0gZGVidWdfaW5mby0+ZmRyOwotICBmZHJfZW5kID0gZmRyX3N0YXJ0ICsgZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLQotICAvKiBGaXJzdCwgbGV0J3Mgc2VlIGhvdyBsb25nIHRoZSB0YWJsZSBuZWVkcyB0byBiZTogKi8KLSAgZm9yIChsZW4gPSAwLCBmZHJfcHRyID0gZmRyX3N0YXJ0OyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChmZHJfcHRyLT5jcGQgPT0gMCkJLyogc2tpcCBGRFJzIHRoYXQgaGF2ZSBubyBQRFJzICovCi0JY29udGludWU7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0KLSAgLyogTm93LCBjcmVhdGUgYW5kIGZpbGwgaW4gdGhlIHRhYmxlOiAqLwotCi0gIGxpbmVfaW5mby0+ZmRydGFiID0gKChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KikKLQkJICAgICAgIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgbGVuICogc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KSkpOwotICBpZiAobGluZV9pbmZvLT5mZHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxpbmVfaW5mby0+ZmRydGFiX2xlbiA9IGxlbjsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0OyBmZHJfcHRyIDwgZmRyX2VuZDsgZmRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChmZHJfcHRyLT5jcGQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZpbGUgaGFzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluCi0JIGEgZmlsZSB3aXRoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlIHNlY29uZCBsb2NhbAotCSBzeW1ib2wgaXMgbmFtZWQgQHN0YWJzLiAgKi8KLSAgICAgIHN0YWJzID0gZmFsc2U7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3N5bSA+PSAyKQotCXsKLQkgIGNoYXIgKnN5bV9wdHI7Ci0JICBTWU1SIHN5bTsKLQotCSAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICAgICArIChmZHJfcHRyLT5pc3ltQmFzZSArIDEpKmRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLQkgIGlmIChzdHJjbXAgKGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3MsCi0JCSAgICAgIFNUQUJTX1NZTUJPTCkgPT0gMCkKLQkgICAgc3RhYnMgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKCFzdGFicykKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotCSAgY2hhciAqcGRyX3B0cjsKLQkgIFBEUiBwZHI7Ci0KLQkgIGV4dGVybmFsX3Bkcl9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLQkgIHBkcl9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcGRyCi0JCSAgICAgKyBmZHJfcHRyLT5pcGRGaXJzdCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLQkgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBQRFIgaXMgdGhlIG9mZnNldCBvZiB0aGF0Ci0JICAgICBwcm9jZWR1cmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBmaWxlIEZEUi4gICovCi0JICB0YWItPmJhc2VfYWRkciA9IGZkcl9wdHItPmFkciAtIHBkci5hZHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFhYWCBJIGRvbid0IGtub3cgYWJvdXQgc3RhYnMsIHNvIHRoaXMgaXMgYSBndWVzcwotCSAgICAgKGRhdmlkbUBjcy5hcml6b25hLmVkdSk6ICovCi0JICB0YWItPmJhc2VfYWRkciA9IGZkcl9wdHItPmFkcjsKLQl9Ci0gICAgICB0YWItPmZkciA9IGZkcl9wdHI7Ci0gICAgICArK3RhYjsKLSAgICB9Ci0KLSAgLyogRmluYWxseSwgdGhlIHRhYmxlIGlzIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG1lbW9yeS1hZGRyZXNzIG9yZGVyLgotICAgICBUaGUgdGFibGUgaXMgbW9zdGx5IHNvcnRlZCBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGNhc2VzIChlLmcuLAotICAgICBzdGF0aWMgZnVuY3Rpb25zIGluIGluY2x1ZGUgZmlsZXMpLCB3aGVyZSB0aGlzIGRvZXMgbm90IGhvbGQuCi0gICAgIFVzZSAib2R1bXAgLVBGdiIgdG8gdmVyaWZ5Li4uICAqLwotICBxc29ydCAoKFBUUikgbGluZV9pbmZvLT5mZHJ0YWIsIGxlbiwKLQkgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KSwgY21wX2ZkcnRhYl9lbnRyeSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBpbmRleCBvZiBmaXJzdCBGRFIgdGhhdCBjb3ZlcnMgdG8gT0ZGU0VULiAgKi8KLQotc3RhdGljIGxvbmcKLWZkcnRhYl9sb29rdXAgKGxpbmVfaW5mbywgb2Zmc2V0KQotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotewotICBsb25nIGxvdywgaGlnaCwgbGVuOwotICBsb25nIG1pZCA9IC0xOwotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0KLSAgbGVuID0gbGluZV9pbmZvLT5mZHJ0YWJfbGVuOwotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBsZW4gLSAxIDsgbG93ICE9IGhpZ2ggOykKLSAgICB7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgaWYgKG9mZnNldCA+PSB0YWJbbWlkXS5iYXNlX2FkZHIgJiYgb2Zmc2V0IDwgdGFiW21pZCArIDFdLmJhc2VfYWRkcikKLQlnb3RvIGZpbmRfbWluOwotCi0gICAgICBpZiAodGFiW21pZF0uYmFzZV9hZGRyID4gb2Zmc2V0KQotCWhpZ2ggPSBtaWQ7Ci0gICAgICBlbHNlCi0JbG93ID0gbWlkICsgMTsKLSAgICB9Ci0gICsrbWlkOwotCi0gIC8qIGxhc3QgZW50cnkgaXMgY2F0Y2gtYWxsIGZvciBhbGwgaGlnaGVyIGFkZHJlc3NlczogKi8KLSAgaWYgKG9mZnNldCA8IHRhYlttaWRdLmJhc2VfYWRkcikKLSAgICByZXR1cm4gLTE7Ci0KLSBmaW5kX21pbjoKLQotICB3aGlsZSAobWlkID4gMCAmJiB0YWJbbWlkIC0gMV0uYmFzZV9hZGRyID09IHRhYlttaWRdLmJhc2VfYWRkcikKLSAgICAtLW1pZDsKLQotICByZXR1cm4gbWlkOwotfQotCi0vKiBMb29rIHVwIGEgbGluZSBnaXZlbiBhbiBhZGRyZXNzLCBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbgotICAgTElORV9JTkZPLT5jYWNoZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfbGluZSAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci17Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJvb2xlYW4gc3RhYnM7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgaW50IGk7Ci0gIAotICBvZmZzZXQgPSBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0OwotICAgICAKLSAgLyogQnVpbGQgRkRSIHRhYmxlIChzb3J0ZWQgYnkgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MpIGlmIHdlCi0gICAgIGRvbid0IGhhdmUgaXQgYWxyZWFkeS4gICovCi0gIGlmIChsaW5lX2luZm8tPmZkcnRhYiA9PSBOVUxMCi0gICAgICAmJiAhbWtfZmRydGFiIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLQotICAvKiBmaW5kIGZpcnN0IEZEUiBmb3IgYWRkcmVzcyBPRkZTRVQgKi8KLSAgaSA9IGZkcnRhYl9sb29rdXAgKGxpbmVfaW5mbywgb2Zmc2V0KTsKLSAgaWYgKGkgPCAwKQotICAgIHJldHVybiBmYWxzZTsJCS8qIG5vIEZEUiwgbm8gZnVuLi4uICovCi0gIGZkcl9wdHIgPSB0YWJbaV0uZmRyOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbiBhCi0gICAgIGZpbGUgd2l0aCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZSBzZWNvbmQgbG9jYWwgc3ltYm9sIGlzCi0gICAgIG5hbWVkIEBzdGFicy4gICovCi0gIHN0YWJzID0gZmFsc2U7Ci0gIGlmIChmZHJfcHRyLT5jc3ltID49IDIpCi0gICAgewotICAgICAgY2hhciAqc3ltX3B0cjsKLSAgICAgIFNZTVIgc3ltOwotCi0gICAgICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAxKSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLSAgICAgIGlmIChzdHJjbXAgKGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3MsCi0JCSAgU1RBQlNfU1lNQk9MKSA9PSAwKQotCXN0YWJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCFzdGFicykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotICAgICAgY2hhciAqcGRyX3B0cjsKLSAgICAgIGNoYXIgKmJlc3RfcGRyID0gTlVMTDsKLSAgICAgIEZEUiAqYmVzdF9mZHI7Ci0gICAgICBiZmRfdm1hIGJlc3RfZGlzdCA9IH4wOwotICAgICAgUERSIHBkcjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfcHRyOwotICAgICAgdW5zaWduZWQgY2hhciAqbGluZV9lbmQ7Ci0gICAgICBpbnQgbGluZW5vOwotICAgICAgLyogVGhpcyBmaWxlIHVzZXMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRWFjaCBGRFIgaGFzIGEKLSAgICAgICAgIGxpc3Qgb2YgcHJvY2VkdXJlIGRlc2NyaXB0b3JzIChQRFIpLiAgVGhlIGFkZHJlc3MgaW4gdGhlIEZEUgotICAgICAgICAgaXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFRoZSBhZGRyZXNzCi0gICAgICAgICBpbiB0aGUgZmlyc3QgUERSIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhhdCBwcm9jZWR1cmUgcmVsYXRpdmUKLSAgICAgICAgIHRvIHRoZSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcy4gIFRoZSBhZGRyZXNzZXMgaW4KLSAgICAgICAgIHN1YnNlcXVlbnQgUERScyBzcGVjaWZ5IGVhY2ggcHJvY2VkdXJlJ3MgYWRkcmVzcyByZWxhdGl2ZSB0bwotICAgICAgICAgdGhlIG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzLiAgVG8gbWFrZSB0aGluZ3MgbW9yZSBqdWljeSwKLSAgICAgICAgIHdoZW5ldmVyIHRoZSBQUk9GIGJpdCBpbiB0aGUgUERSIGlzIHNldCwgdGhlIHJlYWwgZW50cnkgcG9pbnQKLSAgICAgICAgIG9mIHRoZSBwcm9jZWR1cmUgbWF5IGJlIDE2IGJ5dGVzIGJlbG93IHdoYXQgd291bGQgbm9ybWFsbHkgYmUKLSAgICAgICAgIHRoZSBwcm9jZWR1cmUncyBlbnRyeSBwb2ludC4gIEluc3RlYWQsIERFQyBjYW1lIHVwIHdpdGggYQotICAgICAgICAgd2lja2VkIHNjaGVtZSB0byBjcmVhdGUgcHJvZmlsZWQgbGlicmFyaWVzICJvbiB0aGUgZmx5IjoKLSAgICAgICAgIGluc3RlYWQgb2Ygc2hpcHBpbmcgYSByZWd1bGFyIGFuZCBhIHByb2ZpbGVkIHZlcnNpb24gb2YgZWFjaAotICAgICAgICAgbGlicmFyeSwgdGhleSBpbnNlcnQgMTYgYnl0ZXMgb2YgdW51c2VkIHNwYWNlIGluIGZyb250IG9mCi0gICAgICAgICBlYWNoIHByb2NlZHVyZSBhbmQgc2V0IHRoZSAicHJvZiIgYml0IGluIHRoZSBQRFIgdG8gaW5kaWNhdGUKLSAgICAgICAgIHRoYXQgdGhlcmUgaXMgYSBnYXAgdGhlcmUgKHRoaXMgaXMgZG9uZSBhdXRvbWFnaWNhbGx5IGJ5ICJhcyIKLSAgICAgICAgIHdoZW4gb3B0aW9uICItcGciIGlzIHNwZWNpZmllZCkuICBUaHVzLCBub3JtYWxseSwgeW91IGxpbmsKLSAgICAgICAgIGFnYWluc3Qgc3VjaCBhIGxpYnJhcnkgYW5kLCBleGNlcHQgZm9yIGxvdHMgb2YgMTYgYnl0ZSBnYXBzCi0gICAgICAgICBiZXR3ZWVuIGZ1bmN0aW9ucywgdGhpbmdzIHdpbGwgYmVoYXZlIGFzIHVzdWFsLiAgSG93ZXZlciwKLSAgICAgICAgIHdoZW4gaW52b2tpbmcgImxkIiB3aXRoIG9wdGlvbiAiLXBnIiwgaXQgd2lsbCBmaWxsIHRob3NlIGdhcHMKLSAgICAgICAgIHdpdGggY29kZSB0aGF0IGNhbGxzIG1jb3VudCgpLiAgSXQgdGhlbiBtb3ZlcyB0aGUgZnVuY3Rpb24ncwotICAgICAgICAgZW50cnkgcG9pbnQgZG93biBieSAxNiBieXRlcywgYW5kIG91dCBwb3BzIGEgYmluYXJ5IHRoYXQgaGFzCi0gICAgICAgICBhbGwgZnVuY3Rpb25zIHByb2ZpbGVkLgotCi0gICAgICAgICBOT1RFOiBOZWl0aGVyIEZEUnMgbm9yIFBEUnMgYXJlIHN0cmljdGx5IHNvcnRlZCBpbiBtZW1vcnkKLSAgICAgICAgICAgICAgIG9yZGVyLiAgRm9yIGV4YW1wbGUsIHdoZW4gaW5jbHVkaW5nIGhlYWRlci1maWxlcyB0aGF0Ci0gICAgICAgICAgICAgICBkZWZpbmUgZnVuY3Rpb25zLCB0aGUgRkRScyBmb2xsb3cgYmVoaW5kIHRoZSBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgIGZpbGUsIGV2ZW4gdGhvdWdoIHRoZWlyIGNvZGUgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYXQKLSAgICAgICAgICAgICAgIGEgbG93ZXIgYWRkcmVzcy4gIEZpbGUgY29mZi1hbHBoYS5jIGZyb20gbGliYmZkCi0gICAgICAgICAgICAgICBpbGx1c3RyYXRlcyB0aGlzICh1c2UgIm9kdW1wIC1QRnYiIHRvIGxvb2sgYXQgYSBmaWxlJ3MKLSAgICAgICAgICAgICAgIEZEUi9QRFIpLiAgU2ltaWxhcmx5LCBQRFJzIGFyZSBzb21ldGltZXMgb3V0IG9mIG9yZGVyCi0gICAgICAgICAgICAgICBhcyB3ZWxsLiAgQW4gZXhhbXBsZSBvZiB0aGlzIGlzIE9TRi8xIHYzLjAgbGliYydzCi0gICAgICAgICAgICAgICBtYWxsb2MuYy4gIEknbSBub3Qgc3VyZSB3aHkgdGhpcyBoYXBwZW5zLCBidXQgaXQgY291bGQKLSAgICAgICAgICAgICAgIGJlIGR1ZSB0byBvcHRpbWl6YXRpb25zIHRoYXQgcmVvcmRlciBhIGZ1bmN0aW9uJ3MKLSAgICAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiBhbiBvYmplY3QtZmlsZS4KLSAgICAgICAgCi0gICAgICAgICBTdHJhdGVneToKLSAgICAgICAgIAotICAgICAgICAgT24gdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgd2UgYnVpbGQgYSB0YWJsZSBvZiBGRFJzCi0gICAgICAgICB0aGF0IGlzIHNvcnRlZCBieSB0aGUgYmFzZS1hZGRyZXNzIG9mIHRoZSBvYmplY3QtZmlsZSB0aGUgRkRSCi0gICAgICAgICBpcyByZWZlcnJpbmcgdG8uICBOb3RpY2UgdGhhdCBlYWNoIG9iamVjdC1maWxlIG1heSBjb250YWluCi0gICAgICAgICBjb2RlIGZyb20gbXVsdGlwbGUgc291cmNlIGZpbGVzIChlLmcuLCBkdWUgdG8gY29kZSBkZWZpbmVkIGluCi0gICAgICAgICBpbmNsdWRlIGZpbGVzKS4gIFRodXMsIGZvciBhbnkgZ2l2ZW4gYmFzZS1hZGRyZXNzLCB0aGVyZSBtYXkKLSAgICAgICAgIGJlIG11bHRpcGxlIEZEUnMgKGJ1dCB0aGlzIGNhc2UgaXMsIGZvcnR1bmF0ZWx5LCB1bmNvbW1vbikuCi0gICAgICAgICBsb29rdXAoYWRkcikgZ3VhcmFudGVlcyB0byByZXR1cm4gdGhlIGZpcnN0IEZEUiB0aGF0IGFwcGxpZXMKLSAgICAgICAgIHRvIGFkZHJlc3MgQUREUi4gIFRodXMsIGFmdGVyIGludm9raW5nIGxvb2t1cCgpLCB3ZSBoYXZlIGEKLSAgICAgICAgIGxpc3Qgb2YgRkRScyB0aGF0IG1heSBjb250YWluIHRoZSBQRFIgZm9yIEFERFIuICBOZXh0LCB3ZQotICAgICAgICAgd2FsayB0aHJvdWdoIHRoZSBQRFJzIG9mIHRoZXNlIEZEUnMgYW5kIGxvY2F0ZSB0aGUgb25lIHRoYXQKLSAgICAgICAgIGlzIGNsb3Nlc3QgdG8gQUREUiAoaS5lLiwgZm9yIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgICAgICAgIEFERFIgYW5kIHRoZSBQRFIncyBlbnRyeSBwb2ludCBpcyBwb3NpdGl2ZSBhbmQgbWluaW1hbCkuCi0gICAgICAgICBPbmNlLCB0aGUgcmlnaHQgRkRSIGFuZCBQRFIgYXJlIGxvY2F0ZWQsIHdlIHNpbXBseSB3YWxrCi0gICAgICAgICB0aHJvdWdoIHRoZSBsaW5lLW51bWJlciB0YWJsZSB0byBsb29rdXAgdGhlIGxpbmUtbnVtYmVyIHRoYXQKLSAgICAgICAgIGJlc3QgbWF0Y2hlcyBBRERSLiAgT2J2aW91c2x5LCB0aGluZ3MgY291bGQgYmUgc3BlZCB1cCBieQotICAgICAgICAga2VlcGluZyBhIHNvcnRlZCBsaXN0IG9mIFBEUnMgaW5zdGVhZCBvZiBhIHNvcnRlZCBsaXN0IG9mCi0gICAgICAgICBGRFJzLiAgSG93ZXZlciwgdGhpcyB3b3VsZCBpbmNyZWFzZSBzcGFjZSByZXF1aXJlbWVudHMKLSAgICAgICAgIGNvbnNpZGVyYWJseSwgd2hpY2ggaXMgdW5kZXNpcmFibGUuICAqLwotICAgICAgZXh0ZXJuYWxfcGRyX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQotICAgICAgLyogTWFrZSBvZmZzZXQgcmVsYXRpdmUgdG8gb2JqZWN0IGZpbGUncyBzdGFydC1hZGRyZXNzOiAqLwotICAgICAgb2Zmc2V0IC09IHRhYltpXS5iYXNlX2FkZHI7Ci0gICAgICAvKiBTZWFyY2ggRkRSIGxpc3Qgc3RhcnRpbmcgYXQgdGFiW2ldIGZvciB0aGUgUERSIHRoYXQgYmVzdCBtYXRjaGVzCi0gICAgICAgICBPRkZTRVQuICBOb3JtYWxseSwgdGhlIEZEUiBsaXN0IGlzIG9ubHkgb25lIGVudHJ5IGxvbmcuICAqLwotICAgICAgYmVzdF9mZHIgPSBOVUxMOwotICAgICAgZG8KLQl7Ci0JICBiZmRfdm1hIGRpc3QsIG1pbl9kaXN0ID0gMDsKLQkgIGNoYXIgKnBkcl9ob2xkOwotCSAgY2hhciAqcGRyX2VuZDsKLQkgIAotCSAgZmRyX3B0ciA9IHRhYltpXS5mZHI7Ci0JICAKLQkgIHBkcl9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcGRyCi0JCSAgICAgKyBmZHJfcHRyLT5pcGRGaXJzdCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkgIHBkcl9lbmQgPSBwZHJfcHRyICsgZmRyX3B0ci0+Y3BkICogZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0JICAvKiBGaW5kIFBEUiB0aGF0IGlzIGNsb3Nlc3QgdG8gT0ZGU0VULiAgSWYgcGRyLnByb2YgaXMgc2V0LAotCSAgICAgdGhlIHByb2NlZHVyZSBlbnRyeS1wb2ludCAqbWF5KiBiZSAweDEwIGJlbG93IHBkci5hZHIuICBXZQotCSAgICAgc2ltcGx5IHByZXRlbmQgdGhhdCBwZHIucHJvZiAqaW1wbGllcyogYSBsb3dlciBlbnRyeS1wb2ludC4KLQkgICAgIFRoaXMgaXMgc2FmZSBiZWNhdXNlIGl0IGp1c3QgbWVhbnMgdGhhdCBtYXkgaWRlbnRpZnkgNCBOT1BzCi0JICAgICBpbiBmcm9udCBvZiB0aGUgZnVuY3Rpb24gYXMgYmVsb25naW5nIHRvIHRoZSBmdW5jdGlvbi4gICovCi0JICBmb3IgKHBkcl9ob2xkID0gTlVMTDsKLQkgICAgICAgcGRyX3B0ciA8IHBkcl9lbmQ7Ci0JICAgICAgIChwZHJfcHRyICs9IGV4dGVybmFsX3Bkcl9zaXplLAotCQkoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcikpKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCA+PSAocGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZikpCi0JCXsKLQkJICBkaXN0ID0gb2Zmc2V0IC0gKHBkci5hZHIgLSAweDEwICogcGRyLnByb2YpOwotCQkgIGlmICghcGRyX2hvbGQgfHwgZGlzdCA8IG1pbl9kaXN0KQotCQkgICAgewotCQkgICAgICBtaW5fZGlzdCA9IGRpc3Q7Ci0JCSAgICAgIHBkcl9ob2xkID0gcGRyX3B0cjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAKLQkgIGlmICghYmVzdF9wZHIgfHwgbWluX2Rpc3QgPCBiZXN0X2Rpc3QpCi0JICAgIHsKLQkgICAgICBiZXN0X2Rpc3QgPSBtaW5fZGlzdDsKLQkgICAgICBiZXN0X2ZkciA9IGZkcl9wdHI7Ci0JICAgICAgYmVzdF9wZHIgPSBwZHJfaG9sZDsKLQkgICAgfQotCSAgLyogY29udGludWUgbG9vcGluZyB1bnRpbCBiYXNlX2FkZHIgb2YgbmV4dCBlbnRyeSBpcyBkaWZmZXJlbnQ6ICovCi0JfQotICAgICAgd2hpbGUgKCsraSA8IGxpbmVfaW5mby0+ZmRydGFiX2xlbgotCSAgICAgJiYgdGFiW2ldLmJhc2VfYWRkciA9PSB0YWJbaSAtIDFdLmJhc2VfYWRkcik7Ci0KLSAgICAgIGlmICghYmVzdF9mZHIgfHwgIWJlc3RfcGRyKQotCXJldHVybiBmYWxzZTsJCQkvKiBzaG91bGRuJ3QgaGFwcGVuLi4uICovCi0KLSAgICAgIC8qIHBoZXcsIGZpbmFsbHkgd2UgZ290IHNvbWV0aGluZyB0aGF0IHdlIGNhbiBob2xkIG9udG86ICovCi0gICAgICBmZHJfcHRyID0gYmVzdF9mZHI7Ci0gICAgICBwZHJfcHRyID0gYmVzdF9wZHI7Ci0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0gICAgICAvKiBOb3cgd2UgY2FuIGxvb2sgZm9yIHRoZSBhY3R1YWwgbGluZSBudW1iZXIuICBUaGUgbGluZSBudW1iZXJzCi0gICAgICAgICBhcmUgc3RvcmVkIGluIGEgdmVyeSBmdW5reSBmb3JtYXQsIHdoaWNoIEkgd29uJ3QgdHJ5IHRvCi0gICAgICAgICBkZXNjcmliZS4gIFRoZSBzZWFyY2ggaXMgYm91bmRlZCBieSB0aGUgZW5kIG9mIHRoZSBGRFJzIGxpbmUKLSAgICAgICAgIG51bWJlciBlbnRyaWVzLiAgKi8KLSAgICAgIGxpbmVfZW5kID0gZGVidWdfaW5mby0+bGluZSArIGZkcl9wdHItPmNiTGluZU9mZnNldCArIGZkcl9wdHItPmNiTGluZTsKLQotICAgICAgLyogTWFrZSBvZmZzZXQgcmVsYXRpdmUgdG8gcHJvY2VkdXJlIGVudHJ5OiAqLwotICAgICAgb2Zmc2V0IC09IHBkci5hZHIgLSAweDEwICogcGRyLnByb2Y7Ci0gICAgICBsaW5lbm8gPSBwZHIubG5Mb3c7Ci0gICAgICBsaW5lX3B0ciA9IGRlYnVnX2luZm8tPmxpbmUgKyBmZHJfcHRyLT5jYkxpbmVPZmZzZXQgKyBwZHIuY2JMaW5lT2Zmc2V0OwotICAgICAgd2hpbGUgKGxpbmVfcHRyIDwgbGluZV9lbmQpCi0JewotCSAgaW50IGRlbHRhOwotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0JICBkZWx0YSA9ICpsaW5lX3B0ciA+PiA0OwotCSAgaWYgKGRlbHRhID49IDB4OCkKLQkgICAgZGVsdGEgLT0gMHgxMDsKLQkgIGNvdW50ID0gKCpsaW5lX3B0ciAmIDB4ZikgKyAxOwotCSAgKytsaW5lX3B0cjsKLQkgIGlmIChkZWx0YSA9PSAtOCkKLQkgICAgewotCSAgICAgIGRlbHRhID0gKCgobGluZV9wdHJbMF0pICYgMHhmZikgPDwgOCkgKyAoKGxpbmVfcHRyWzFdKSAmIDB4ZmYpOwotCSAgICAgIGlmIChkZWx0YSA+PSAweDgwMDApCi0JCWRlbHRhIC09IDB4MTAwMDA7Ci0JICAgICAgbGluZV9wdHIgKz0gMjsKLQkgICAgfQotCSAgbGluZW5vICs9IGRlbHRhOwotCSAgaWYgKG9mZnNldCA8IGNvdW50ICogNCkKLQkgICAgewotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RvcCArPSBjb3VudCAqIDQgLSBvZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9mZnNldCAtPSBjb3VudCAqIDQ7Ci0JfQotCi0gICAgICAvKiBJZiBmZHJfcHRyLT5yc3MgaXMgLTEsIHRoZW4gdGhpcyBmaWxlIGRvZXMgbm90IGhhdmUgZnVsbAotICAgICAgICAgc3ltYm9scywgYXQgbGVhc3QgYWNjb3JkaW5nIHRvIGdkYi9taXBzcmVhZC5jLiAgKi8KLSAgICAgIGlmIChmZHJfcHRyLT5yc3MgPT0gLTEpCi0JewotCSAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IE5VTEw7Ci0JICBpZiAocGRyLmlzeW0gPT0gLTEpCi0JICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVYVFIgcHJvY19leHQ7Ci0KLQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X2luKQotCQkoYWJmZCwKLQkJICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9leHQKLQkJICArIHBkci5pc3ltICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpLAotCQkgJnByb2NfZXh0KTsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IChkZWJ1Z19pbmZvLT5zc2V4dAotCQkJCQkgICAgICAgKyBwcm9jX2V4dC5hc3ltLmlzcyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU1lNUiBwcm9jX3N5bTsKLQotCSAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IChkZWJ1Z19pbmZvLT5zcwotCQkJCSAgICAgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5yc3MpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikKLQkgICAgKGFiZmQsCi0JICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JICAgICAgKyAoKGZkcl9wdHItPmlzeW1CYXNlICsgcGRyLmlzeW0pCi0JCSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSksCi0JICAgICAmcHJvY19zeW0pOwotCSAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSAoZGVidWdfaW5mby0+c3MKLQkJCQkJICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJCSAgICsgcHJvY19zeW0uaXNzKTsKLQl9Ci0gICAgICBpZiAobGluZW5vID09IGlsaW5lTmlsKQotCWxpbmVubyA9IDA7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gbGluZW5vOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBjb25zdCBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKm1haW5fZmlsZV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqY3VycmVudF9maWxlX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lOwotICAgICAgY29uc3QgY2hhciAqbGluZV9maWxlX25hbWU7Ci0gICAgICBiZmRfdm1hIGxvd19mdW5jX3ZtYTsKLSAgICAgIGJmZF92bWEgbG93X2xpbmVfdm1hOwotICAgICAgYm9vbGVhbiBwYXN0X2xpbmU7Ci0gICAgICBib29sZWFuIHBhc3RfZm47Ci0gICAgICBjaGFyICpzeW1fcHRyLCAqc3ltX3B0cl9lbmQ7Ci0gICAgICBzaXplX3QgbGVuLCBmdW5jbGVuOwotICAgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKLQotICAgICAgLyogVGhpcyBmaWxlIHVzZXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2hlbiBnY2MgaXMgbm90Ci0JIG9wdGltaXppbmcsIGl0IHdpbGwgcHV0IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBiZWZvcmUKLQkgdGhlIGZ1bmN0aW9uIG5hbWUgc3RhYnMgZW50cnkuICBXaGVuIGdjYyBpcyBvcHRpbWl6aW5nLCBpdAotCSB3aWxsIHB1dCB0aGUgc3RhYnMgZW50cnkgZm9yIGFsbCB0aGUgZnVuY3Rpb24gZmlyc3QsIGZvbGxvd2VkCi0JIGJ5IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gIChUaGlzIGFwcGVhcnMgdG8gaGFwcGVuCi0JIGJlY2F1c2Ugb2YgdGhlIHR3byBvdXRwdXQgZmlsZXMgdXNlZCBieSB0aGUgLW1ncG9wdCBzd2l0Y2gsCi0JIHdoaWNoIGlzIGltcGxpZWQgYnkgLU8pLiAgVGhpcyBtZWFucyB0aGF0IHdlIG11c3Qga2VlcAotCSBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbHMgdW50aWwgd2UgZmluZCBib3RoIGEgbGluZSBudW1iZXIKLQkgYW5kIGEgZnVuY3Rpb24gbmFtZSB3aGljaCBhcmUgYmV5b25kIHRoZSBhZGRyZXNzIHdlIHdhbnQuICAqLwotCi0gICAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSAwOwotCi0gICAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBtYWluX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBjdXJyZW50X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBmdW5jdGlvbl9uYW1lID0gTlVMTDsKLSAgICAgIGxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGxvd19mdW5jX3ZtYSA9IDA7Ci0gICAgICBsb3dfbGluZV92bWEgPSAwOwotICAgICAgcGFzdF9saW5lID0gZmFsc2U7Ci0gICAgICBwYXN0X2ZuID0gZmFsc2U7Ci0KLSAgICAgIGV4dGVybmFsX3N5bV9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLSAgICAgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSArIChmZHJfcHRyLT5pc3ltQmFzZSArIDIpICogZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgc3ltX3B0cl9lbmQgPSBzeW1fcHRyICsgKGZkcl9wdHItPmNzeW0gLSAyKSAqIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZm9yICg7Ci0JICAgc3ltX3B0ciA8IHN5bV9wdHJfZW5kICYmICghIHBhc3RfbGluZSB8fCAhIHBhc3RfZm4pOwotCSAgIHN5bV9wdHIgKz0gZXh0ZXJuYWxfc3ltX3NpemUpCi0JewotCSAgU1lNUiBzeW07Ci0KLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBzeW1fcHRyLCAmc3ltKTsKLQotCSAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZzeW0pKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChFQ09GRl9VTk1BUktfU1RBQiAoc3ltLmluZGV4KSkKLQkJewotCQljYXNlIE5fU086Ci0JCSAgbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCi0JCSAgLyogQ2hlY2sgdGhlIG5leHQgc3ltYm9sIHRvIHNlZSBpZiBpdCBpcyBhbHNvIGFuCi0gICAgICAgICAgICAgICAgICAgICBOX1NPIHN5bWJvbC4gICovCi0JCSAgaWYgKHN5bV9wdHIgKyBleHRlcm5hbF9zeW1fc2l6ZSA8IHN5bV9wdHJfZW5kKQotCQkgICAgewotCQkgICAgICBTWU1SIG5leHRzeW07Ci0KLQkJICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsCi0JCQkJCQkgIHN5bV9wdHIgKyBleHRlcm5hbF9zeW1fc2l6ZSwKLQkJCQkJCSAgJm5leHRzeW0pOwotCQkgICAgICBpZiAoRUNPRkZfSVNfU1RBQiAoJm5leHRzeW0pCi0JCQkgICYmIEVDT0ZGX1VOTUFSS19TVEFCIChuZXh0c3ltLmluZGV4KSA9PSBOX1NPKQotCQkJewotIAkJCSAgZGlyZWN0b3J5X25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkJCSAgbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgbmV4dHN5bS5pc3M7Ci0JCQkgIHN5bV9wdHIgKz0gZXh0ZXJuYWxfc3ltX3NpemU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBOX1NPTDoKLQkJICBjdXJyZW50X2ZpbGVfbmFtZSA9Ci0JCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgTl9GVU46Ci0JCSAgaWYgKHN5bS52YWx1ZSA+IG9mZnNldCkKLQkJICAgIHBhc3RfZm4gPSB0cnVlOwotCQkgIGVsc2UgaWYgKHN5bS52YWx1ZSA+PSBsb3dfZnVuY192bWEpCi0JCSAgICB7Ci0JCSAgICAgIGxvd19mdW5jX3ZtYSA9IHN5bS52YWx1ZTsKLQkJICAgICAgZnVuY3Rpb25fbmFtZSA9Ci0JCQlkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bS5zdCA9PSBzdExhYmVsICYmIHN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgICAgewotCSAgICAgIGlmIChzeW0udmFsdWUgPiBvZmZzZXQpCi0JCXBhc3RfbGluZSA9IHRydWU7Ci0JICAgICAgZWxzZSBpZiAoc3ltLnZhbHVlID49IGxvd19saW5lX3ZtYSkKLQkJewotCQkgIGxvd19saW5lX3ZtYSA9IHN5bS52YWx1ZTsKLQkJICBsaW5lX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCQkgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSBzeW0uaW5kZXg7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gIT0gMCkKLQltYWluX2ZpbGVfbmFtZSA9IGxpbmVfZmlsZV9uYW1lOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGNvbG9uIGluIHRoZSBmdW5jdGlvbgotICAgICAgICAgbmFtZS4gIFdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGRpcmVjdG9yeSBuYW1lIGFuZCB0aGUgZmlsZQotICAgICAgICAgbmFtZSB0b2dldGhlci4gICovCi0gICAgICBpZiAoZnVuY3Rpb25fbmFtZSA9PSBOVUxMKQotCWxlbiA9IGZ1bmNsZW4gPSAwOwotICAgICAgZWxzZQotCWxlbiA9IGZ1bmNsZW4gPSBzdHJsZW4gKGZ1bmN0aW9uX25hbWUpICsgMTsKLQotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwKLQkgICYmIGRpcmVjdG9yeV9uYW1lICE9IE5VTEwKLQkgICYmIG1haW5fZmlsZV9uYW1lWzBdICE9ICcvJykKLQlsZW4gKz0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSkgKyBzdHJsZW4gKG1haW5fZmlsZV9uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChsZW4gIT0gMCkKLQl7Ci0JICBpZiAobGluZV9pbmZvLT5maW5kX2J1ZmZlciAhPSBOVUxMKQotCSAgICBmcmVlIChsaW5lX2luZm8tPmZpbmRfYnVmZmVyKTsKLQkgIGJ1ZmZlciA9IChjaGFyICopIGJmZF9tYWxsb2MgKGxlbik7Ci0JICBpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxpbmVfaW5mby0+ZmluZF9idWZmZXIgPSBidWZmZXI7Ci0JfQotCi0gICAgICBpZiAoZnVuY3Rpb25fbmFtZSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmNvbG9uOwotCi0JICBzdHJjcHkgKGJ1ZmZlciwgZnVuY3Rpb25fbmFtZSk7Ci0JICBjb2xvbiA9IHN0cmNociAoYnVmZmVyLCAnOicpOwotCSAgaWYgKGNvbG9uICE9IE5VTEwpCi0JICAgICpjb2xvbiA9ICdcMCc7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IGJ1ZmZlcjsKLQl9Ci0KLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMKQotCXsKLQkgIGlmIChkaXJlY3RvcnlfbmFtZSA9PSBOVUxMIHx8IG1haW5fZmlsZV9uYW1lWzBdID09ICcvJykKLQkgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IG1haW5fZmlsZV9uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyICsgZnVuY2xlbiwgIiVzJXMiLCBkaXJlY3RvcnlfbmFtZSwKLQkJICAgICAgIG1haW5fZmlsZV9uYW1lKTsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gYnVmZmVyICsgZnVuY2xlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIHRoZSB3b3JrIG9mIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLAotCQkJbGluZV9pbmZvLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHI7Ci17Ci0gIG9mZnNldCArPSBzZWN0aW9uLT52bWE7Ci0KLSAgaWYgKGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9PSBOVUxMCi0gICAgICB8fCBsaW5lX2luZm8tPmNhY2hlLnNlY3QgIT0gc2VjdGlvbgotICAgICAgfHwgb2Zmc2V0IDwgbGluZV9pbmZvLT5jYWNoZS5zdGFydAotICAgICAgfHwgb2Zmc2V0ID49IGxpbmVfaW5mby0+Y2FjaGUuc3RvcCkKLSAgICB7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnNlY3QgPSBzZWN0aW9uOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdGFydCA9IG9mZnNldDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RvcCA9IG9mZnNldDsKLSAgICAgIGlmICghIGxvb2t1cF9saW5lIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pKQotCXsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAqZmlsZW5hbWVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZTsKLSAgKnJldGxpbmVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5saW5lX251bTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZXNlIHJvdXRpbmVzIGNvcHkgc3ltYm9saWMgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuCi0KLSAgIEZJWE1FOiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhlIHNodWZmbGUgY29kZSBpcyB0byBhdm9pZCBzdG9yaW5nCi0gICBldmVyeXRoaW5nIGluIG1lbW9yeSwgc2luY2UgdGhlIGxpbmtlciBpcyBzdWNoIGEgbWVtb3J5IGhvZy4gIFRoaXMKLSAgIGNvZGUgbWFrZXMgdGhhdCBlZmZvcnQgdXNlbGVzcy4gIEl0IGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBNSVBTIEVMRgotICAgY29kZSB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgc28gaXQgaXMgbm90IHRoYXQgYmlnIGEKLSAgIGRlYWwsIGJ1dCBpdCBzaG91bGQgYmUgZml4ZWQgZXZlbnR1YWxseS4gICovCi0KLS8qIENvbGxlY3QgYSBzaHVmZmxlIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBzaHVmZmxlICosIGJmZF9ieXRlICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAobCwgYnVmZikKLSAgICAgc3RydWN0IHNodWZmbGUgKmw7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIHRvdGFsID0gMDsKLSAgZm9yICg7IGwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGwtPmZpbGVwKQotCW1lbWNweSAoYnVmZiwgbC0+dS5tZW1vcnksIGwtPnNpemUpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfc2VlayAobC0+dS5maWxlLmlucHV0X2JmZCwgbC0+dS5maWxlLm9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoYnVmZiwgMSwgbC0+c2l6ZSwgbC0+dS5maWxlLmlucHV0X2JmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHRvdGFsICs9IGwtPnNpemU7Ci0gICAgICBidWZmICs9IGwtPnNpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IFBEUiBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLQotICByZXR1cm4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIChhaW5mby0+cGRyLCBidWZmKTsKLX0KLQotLyogQ29weSBzeW1ib2wgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAoYWluZm8tPnN5bSwgYnVmZik7Ci19Ci0KLS8qIENvcHkgdGhlIHN0cmluZyB0YWJsZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgaXMgd3JpdHRlbiBvdXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEKLSAgICAgZmluYWwgbGluay4gICovCi0gIEJGRF9BU1NFUlQgKGFpbmZvLT5zcyA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCk7Ci0gICpidWZmKysgPSAnXDAnOwotICB0b3RhbCA9IDE7Ci0gIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IE5VTEwgfHwgYWluZm8tPnNzX2hhc2gtPnZhbCA9PSAxKTsKLSAgZm9yIChzaCA9IGFpbmZvLT5zc19oYXNoOwotICAgICAgIHNoICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgICBzaCA9IHNoLT5uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2gtPnJvb3Quc3RyaW5nKTsKLSAgICAgIG1lbWNweSAoYnVmZiwgKFBUUikgc2gtPnJvb3Quc3RyaW5nLCBsZW4gKyAxKTsKLSAgICAgIHRvdGFsICs9IGxlbiArIDE7Ci0gICAgICBidWZmICs9IGxlbiArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2Zmc3dhcC5oIGIvYmZkL2Vjb2Zmc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDI4ZDE2Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZnN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKiBHZW5lcmljIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE5PVEU6IFRoaXMgaXMgYSBoZWFkZXIgZmlsZSwgYnV0IGl0IGNvbnRhaW5zIGV4ZWN1dGFibGUgcm91dGluZXMuCi0gICBUaGlzIGlzIGRvbmUgdGhpcyB3YXkgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmUgc3Vic3RhbnRpYWxseQotICAgc2ltaWxhciwgYnV0IGFyZSBub3QgaWRlbnRpY2FsLCBmb3IgYWxsIEVDT0ZGIHRhcmdldHMuCi0KLSAgIFRoZXNlIGFyZSByb3V0aW5lcyB0byBzd2FwIHRoZSBFQ09GRiBzeW1ib2xpYyBpbmZvcm1hdGlvbiBpbiBhbmQKLSAgIG91dC4gIFRoZSByb3V0aW5lcyBhcmUgZGVmaW5lZCBzdGF0aWNhbGx5LiAgWW91IGNhbiBzZXQgYnJlYWtwb2ludHMKLSAgIG9uIHRoZW0gaW4gZ2RiIGJ5IG5hbWluZyB0aGUgaW5jbHVkaW5nIHNvdXJjZSBmaWxlOyBlLmcuLAotICAgJ2NvZmYtbWlwcy5jJzplY29mZl9zd2FwX2hkcl9pbi4KLQotICAgQmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLCBvbmUgb2YgRUNPRkZfMzIgb3IgRUNPRkZfNjQgbXVzdAotICAgYmUgZGVmaW5lZC4gIFRoZXNlIGFyZSBjaGVja2VkIHdoZW4gc3dhcHBpbmcgaW5mb3JtYXRpb24gdGhhdAotICAgZGVwZW5kcyB1cG9uIHRoZSB0YXJnZXQgc2l6ZS4gIFRoaXMgY29kZSB3b3JrcyBmb3IgMzIgYml0IGFuZCA2NAotICAgYml0IEVDT0ZGLCBidXQgbWF5IG5lZWQgdG8gYmUgZ2VuZXJhbGl6ZWQgaW4gdGhlIGZ1dHVyZS4KLQotICAgU29tZSBoZWFkZXIgZmlsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlcm5hbCBmb3JtcyBvZiB0aGVzZQotICAgc3RydWN0dXJlcyBtdXN0IGFsc28gYmUgaW5jbHVkZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLgotICAgQ3VycmVudGx5IHRoaXMgaXMgZWl0aGVyIGNvZmYvbWlwcy5oIG9yIGNvZmYvYWxwaGEuaC4KLQotICAgSWYgdGhlIHN5bWJvbCBURVNUIGlzIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIGEKLSAgIGNvbXBhcmlzb24gaXMgbWFkZSB0byBlbnN1cmUgdGhhdCwgaW4gZmFjdCwgdGhlIG91dHB1dCBpcwotICAgYml0LWZvci1iaXQgdGhlIHNhbWUgYXMgdGhlIGlucHV0LiAgT2YgY291cnNlLCB0aGlzIHN5bWJvbCBzaG91bGQKLSAgIG9ubHkgYmUgZGVmaW5lZCB3aGVuIGRlbGliZXJhdGVseSB0ZXN0aW5nIHRoZSBjb2RlIG9uIGEgbWFjaGluZQotICAgd2l0aCB0aGUgcHJvcGVyIGJ5dGUgc2V4IGFuZCBzdWNoLiAgKi8KLQotI2lmZGVmIEVDT0ZGXzMyCi0jZGVmaW5lIGVjb2ZmX2dldF9vZmYgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIGVjb2ZmX3B1dF9vZmYgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF82NAotI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF82NAotI2VuZGlmCi0KLS8qIEVDT0ZGIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB0aGUgc2FtZQotICAgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLCBzbyB0aGV5IGFyZSBkZWZpbmVkIGluIGVjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICosIFRJUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwotCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBIRFJSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfaGRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgSERSUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZmRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEZEUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBEUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2V4dF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEVYVFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBSRkRUICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcmZkX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgUkZEVCAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIE9QVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9vcHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBPUFRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9kbnJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRE5SICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRE5SICosIFBUUikpOwotCi0vKiBTd2FwIGluIHRoZSBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9oZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBIRFJSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBoZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgaGRyX2V4dCAqKSBleHRfY29weTsKLQotICBpbnRlcm4tPm1hZ2ljICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfbWFnaWMpOwotICBpbnRlcm4tPnZzdGFtcCAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfdnN0YW1wKTsKLSAgaW50ZXJuLT5pbGluZU1heCAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWxpbmVNYXgpOwotICBpbnRlcm4tPmNiTGluZSAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZU9mZnNldCk7Ci0gIGludGVybi0+aWRuTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lkbk1heCk7Ci0gIGludGVybi0+Y2JEbk9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkRuT2Zmc2V0KTsKLSAgaW50ZXJuLT5pcGRNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXBkTWF4KTsKLSAgaW50ZXJuLT5jYlBkT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUGRPZmZzZXQpOwotICBpbnRlcm4tPmlzeW1NYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKLSAgaW50ZXJuLT5jYlN5bU9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaW9wdE1heCk7Ci0gIGludGVybi0+Y2JPcHRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYk9wdE9mZnNldCk7Ci0gIGludGVybi0+aWF1eE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lhdXhNYXgpOwotICBpbnRlcm4tPmNiQXV4T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JBdXhPZmZzZXQpOwotICBpbnRlcm4tPmlzc01heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NNYXgpOwotICBpbnRlcm4tPmNiU3NPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc09mZnNldCk7Ci0gIGludGVybi0+aXNzRXh0TWF4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc0V4dE1heCk7Ci0gIGludGVybi0+Y2JTc0V4dE9mZnNldCA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzRXh0T2Zmc2V0KTsKLSAgaW50ZXJuLT5pZmRNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWZkTWF4KTsKLSAgaW50ZXJuLT5jYkZkT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRmRPZmZzZXQpOwotICBpbnRlcm4tPmNyZmQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKLSAgaW50ZXJuLT5jYlJmZE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKLSAgaW50ZXJuLT5pZXh0TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWV4dE1heCk7Ci0gIGludGVybi0+Y2JFeHRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkV4dE9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBzeW1ib2xpYyBoZWFkZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9oZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBIRFJSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBoZHJfZXh0ICpleHQgPSAoc3RydWN0IGhkcl9leHQgKikgZXh0X3B0cjsKLSAgSERSUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsKLQotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPm1hZ2ljLCAoYmZkX2J5dGUgKilleHQtPmhfbWFnaWMpOwotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPnZzdGFtcCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZU1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmUpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZG5NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRG5PZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkRuT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlwZE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JQZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUGRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bU1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzeW1NYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3ltT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTeW1PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiT3B0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWF1eE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lhdXhNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiQXV4T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JBdXhPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NFeHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3NFeHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzRXh0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlmZE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JGZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRmRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3JmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NyZmQpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUmZkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JSZmRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWV4dE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZmRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRkRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBmZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZmRyX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOwotICBpbnRlcm4tPnJzcyAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yc3MpOwotI2lmZGVmIEVDT0ZGXzY0Ci0gIGlmIChpbnRlcm4tPnJzcyA9PSAweGZmZmZmZmZmKQotICAgIGludGVybi0+cnNzID0gLTE7Ci0jZW5kaWYKLSAgaW50ZXJuLT5pc3NCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXNzQmFzZSk7Ci0gIGludGVybi0+Y2JTcyAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYlNzKTsKLSAgaW50ZXJuLT5pc3ltQmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXN5bUJhc2UpOwotICBpbnRlcm4tPmNzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKLSAgaW50ZXJuLT5pbGluZUJhc2UgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWxpbmVCYXNlKTsKLSAgaW50ZXJuLT5jbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2xpbmUpOwotICBpbnRlcm4tPmlvcHRCYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pb3B0QmFzZSk7Ci0gIGludGVybi0+Y29wdCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOwotI2lmZGVmIEVDT0ZGXzMyCi0gIGludGVybi0+aXBkRmlyc3QgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgaW50ZXJuLT5jcGQgICAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+aXBkRmlyc3QgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgaW50ZXJuLT5jcGQgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotICBpbnRlcm4tPmlhdXhCYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pYXV4QmFzZSk7Ci0gIGludGVybi0+Y2F1eCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NhdXgpOwotICBpbnRlcm4tPnJmZEJhc2UgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKLSAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3JmZCk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPmxhbmcgICAgICAgID0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9MQU5HX0JJRykKLQkJCQkJPj4gRkRSX0JJVFMxX0xBTkdfU0hfQklHOwotICAgIGludGVybi0+Zk1lcmdlICAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRk1FUkdFX0JJRyk7Ci0gICAgaW50ZXJuLT5mUmVhZGluICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GUkVBRElOX0JJRyk7Ci0gICAgaW50ZXJuLT5mQmlnZW5kaWFuICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyk7Ci0gICAgaW50ZXJuLT5nbGV2ZWwgICAgICA9IChleHQtPmZfYml0czJbMF0gJiBGRFJfQklUUzJfR0xFVkVMX0JJRykKLQkJCQkJPj4gRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19MSVRUTEUpCi0JCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUpOwotICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUpOwotICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUpOwotICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUpCi0JCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFOwotICB9Ci0gIGludGVybi0+cmVzZXJ2ZWQgPSAwOwotCi0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOwotICBpbnRlcm4tPmNiTGluZSAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9mZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBGRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGZkcl9leHQgKmV4dCA9IChzdHJ1Y3QgZmRyX2V4dCAqKSBleHRfcHRyOwotICBGRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5mX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yc3MsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yc3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3MsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYlNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1CYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaXN5bUJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3N5bSwgKGJmZF9ieXRlICopZXh0LT5mX2NzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaWxpbmVCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNsaW5lLCAoYmZkX2J5dGUgKilleHQtPmZfY2xpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pb3B0QmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jb3B0LCAoYmZkX2J5dGUgKilleHQtPmZfY29wdCk7Ci0jaWZkZWYgRUNPRkZfMzIKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmlwZEZpcnN0LCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+Y3BkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y2F1eCwgKGJmZF9ieXRlICopZXh0LT5mX2NhdXgpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmZkQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX3JmZEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3JmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5mX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5sYW5nIDw8IEZEUl9CSVRTMV9MQU5HX1NIX0JJRykKLQkJCSYgRkRSX0JJVFMxX0xBTkdfQklHKQotCQkgICAgICAgfCAoaW50ZXJuLT5mTWVyZ2UgPyBGRFJfQklUUzFfRk1FUkdFX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZSZWFkaW4gPyBGRFJfQklUUzFfRlJFQURJTl9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mQmlnZW5kaWFuID8gRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHIDogMCkpOwotICAgIGV4dC0+Zl9iaXRzMlswXSA9ICgoaW50ZXJuLT5nbGV2ZWwgPDwgRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcpCi0JCSAgICAgICAmIEZEUl9CSVRTMl9HTEVWRUxfQklHKTsKLSAgICBleHQtPmZfYml0czJbMV0gPSAwOwotICAgIGV4dC0+Zl9iaXRzMlsyXSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5mX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5sYW5nIDw8IEZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRSkKLQkJCSYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQotCQkgICAgICAgfCAoaW50ZXJuLT5mTWVyZ2UgPyBGRFJfQklUUzFfRk1FUkdFX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZSZWFkaW4gPyBGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mQmlnZW5kaWFuID8gRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFIDogMCkpOwotICAgIGV4dC0+Zl9iaXRzMlswXSA9ICgoaW50ZXJuLT5nbGV2ZWwgPDwgRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKTsKLSAgICBleHQtPmZfYml0czJbMV0gPSAwOwotICAgIGV4dC0+Zl9iaXRzMlsyXSA9IDA7Ci0gIH0KLQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZU9mZnNldCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBNUFdfQwotCi0vKiBTd2FwIGluIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBQRFIgKmludGVybjsKLXsKLSAgc3RydWN0IHBkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9jb3B5OwotCi0gIG1lbXNldCAoKFBUUikgaW50ZXJuLCAwLCBzaXplb2YgKCppbnRlcm4pKTsKLQotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+Z3BfcHJvbG9ndWUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cF9ncF9wcm9sb2d1ZSk7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGludGVybi0+Z3BfdXNlZCA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9HUF9VU0VEX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJlZ19mcmFtZSA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHKTsKLSAgICAgIGludGVybi0+cHJvZiA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9QUk9GX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJlc2VydmVkID0gKCgoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFU0VSVkVEX0JJRykKLQkJCSAgIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRykKLQkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpCi0JCQkgICAgID4+IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUpCi0JCQkgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFKQotCQkJICB8ICgoZXh0LT5wX2JpdHMyWzBdICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSkKLQkJCSAgICAgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgfQotICBpbnRlcm4tPmxvY2Fsb2ZmID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfbG9jYWxvZmYpOwotI2VuZGlmICAKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7Ci0gIFBEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5ncF9wcm9sb2d1ZSwgKGJmZF9ieXRlICopIGV4dC0+cF9ncF9wcm9sb2d1ZSk7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfQklHIDogMCkKLQkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHIDogMCkKLQkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9CSUcgOiAwKQotCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkCi0JCQkgICAgID4+IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRykKLQkJCSAgICAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpKTsKLSAgICAgIGV4dC0+cF9iaXRzMlswXSA9ICgoaW50ZXJuLT5yZXNlcnZlZCA8PCBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKQotCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0LT5wX2JpdHMxWzBdID0gKChpbnRlcm4tPmdwX3VzZWQgPyBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUgOiAwKQotCQkJIHwgKGludGVybi0+cmVnX2ZyYW1lID8gUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUgOiAwKQotCQkJIHwgKGludGVybi0+cHJvZiA/IFBEUl9CSVRTMV9QUk9GX0xJVFRMRSA6IDApCi0JCQkgfCAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKLQkJCSAgICAmIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUpKTsKLSAgICAgIGV4dC0+cF9iaXRzMlswXSA9ICgoaW50ZXJuLT5yZXNlcnZlZCA+PgotCQkJICBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUpCi0JCQkgJiBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFKTsKLSAgICB9Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbnRlcm4tPmxvY2Fsb2ZmLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKLSNlbmRpZiAgCi0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLSNlbHNlIC8qIE1QV19DICovCi0vKiBTYW1lIHJvdXRpbmVzLCBidXQgd2l0aCBFQ09GRl82NCBjb2RlIHJlbW92ZWQsIHNvIF4mJSQjJiEgTVBXIEMgZG9lc24ndAotICAgY29ycnVwdCBpdHNlbGYgYW5kIHRoZW4gZnJlYWsgb3V0LiAqLwotLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgUERSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBpbnRlcm4tPmlzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgaW50ZXJuLT5pbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBpbnRlcm4tPnJlZ21hc2sgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgaW50ZXJuLT5yZWdvZmZzZXQgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBpbnRlcm4tPmlvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGludGVybi0+ZnJlZ21hc2sgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgaW50ZXJuLT5mcmVnb2Zmc2V0ICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZW9mZnNldCAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVyZWcgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgaW50ZXJuLT5wY3JlZyAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBpbnRlcm4tPmxuTG93ICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGludGVybi0+bG5IaWdoICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUERSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBwZHJfZXh0ICpleHQgPSAoc3RydWN0IHBkcl9leHQgKikgZXh0X3B0cjsKLSAgUERSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bSwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+cGNyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkxvdywgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuSGlnaCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBNUFdfQyAqLwotCi0vKiBTd2FwIGluIGEgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFNZTVIgKmludGVybjsKLXsKLSAgc3RydWN0IHN5bV9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBzeW1fZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5pc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnNfaXNzKTsKLSAgaW50ZXJuLT52YWx1ZSAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX3ZhbHVlKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9CSUcpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9CSUc7Ci0gICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0JJRykKLQkJCQkJICAgPDwgU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQotCQkJfCAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9TQ19CSUcpCi0JCQkJCSAgID4+IFNZTV9CSVRTMl9TQ19TSF9CSUcpOwotICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfQklHKTsKLSAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfQklHKQotCQkJCQkgICA8PCBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQl8IChleHQtPnNfYml0czNbMF0gPDwgU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKQotCQkJfCAoZXh0LT5zX2JpdHM0WzBdIDw8IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5zdCAgICAgICAgICA9ICAoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NUX1NIX0xJVFRMRTsKLSAgICBpbnRlcm4tPnNjICAgICAgICAgID0gKChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU0NfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU0NfU0hfTElUVExFKQotCQkJfCAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9TQ19MSVRUTEUpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5yZXNlcnZlZCAgICA9IDAgIT0gKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpOwotICAgIGludGVybi0+aW5kZXggICAgICAgPSAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9JTkRFWF9MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUpCi0JCQl8IChleHQtPnNfYml0czNbMF0gPDwgU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKQotCQkJfCAoKHVuc2lnbmVkIGludCkgZXh0LT5zX2JpdHM0WzBdCi0JCQkgICA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFNZTVIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHN5bV9leHQgKmV4dCA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfcHRyOwotICBTWU1SIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzcywgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPnNfYml0czFbMF0gPSAoKChpbnRlcm4tPnN0IDw8IFNZTV9CSVRTMV9TVF9TSF9CSUcpCi0JCQkmIFNZTV9CSVRTMV9TVF9CSUcpCi0JCSAgICAgICB8ICgoaW50ZXJuLT5zYyA+PiBTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcpCi0JCQkgICYgU1lNX0JJVFMxX1NDX0JJRykpOwotICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPDwgU1lNX0JJVFMyX1NDX1NIX0JJRykKLQkJCSYgU1lNX0JJVFMyX1NDX0JJRykKLQkJICAgICAgIHwgKGludGVybi0+cmVzZXJ2ZWQgPyBTWU1fQklUUzJfUkVTRVJWRURfQklHIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCSAgJiBTWU1fQklUUzJfSU5ERVhfQklHKSk7Ci0gICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKSAmIDB4ZmY7Ci0gICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHKSAmIDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfTElUVExFKQotCQkJJiBTWU1fQklUUzFfU1RfTElUVExFKQotCQkgICAgICAgfCAoKGludGVybi0+c2MgPDwgU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKLQkJCSAgJiBTWU1fQklUUzFfU0NfTElUVExFKSk7Ci0gICAgZXh0LT5zX2JpdHMyWzBdID0gKCgoaW50ZXJuLT5zYyA+PiBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpCi0JCQkmIFNZTV9CSVRTMl9TQ19MSVRUTEUpCi0JCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA8PCBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQotCQkJICAmIFNZTV9CSVRTMl9JTkRFWF9MSVRUTEUpKTsKLSAgICBleHQtPnNfYml0czNbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpICYgMHhmZjsKLSAgICBleHQtPnNfYml0czRbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUpICYgMHhmZjsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGFuIGV4dGVybmFsIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9leHRfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBFWFRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBleHRfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfY29weTsKLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0JJRyk7Ci0gICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcpOwotICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmptcHRibCAgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9KTVBUQkxfTElUVExFKTsKLSAgICBpbnRlcm4tPmNvYm9sX21haW4gID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT53ZWFrZXh0ICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUpOwotICB9Ci0gIGludGVybi0+cmVzZXJ2ZWQgPSAwOwotCi0jaWZkZWYgRUNPRkZfMzIKLSAgaW50ZXJuLT5pZmQgICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5pZmQgICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0KLSAgZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsICZleHQtPmVzX2FzeW0sICZpbnRlcm4tPmFzeW0pOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZXh0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRVhUUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZXh0X2V4dCAqZXh0ID0gKHN0cnVjdCBleHRfZXh0ICopIGV4dF9wdHI7Ci0gIEVYVFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9CSUcgOiAwKQotCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHIDogMCkKLQkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0JJRyA6IDApKTsKLSAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKLSNpZmRlZiBFQ09GRl82NAotICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOwotICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZXh0LT5lc19iaXRzMVswXSA9ICgoaW50ZXJuLT5qbXB0YmwgPyBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSA6IDApCi0JCQl8IChpbnRlcm4tPmNvYm9sX21haW4gPyBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUgOiAwKQotCQkJfCAoaW50ZXJuLT53ZWFrZXh0ID8gRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFIDogMCkpOwotICAgIGV4dC0+ZXNfYml0czJbMF0gPSAwOwotI2lmZGVmIEVDT0ZGXzY0Ci0gICAgZXh0LT5lc19iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5lc19iaXRzMlsyXSA9IDA7Ci0jZW5kaWYKLSAgfQotCi0jaWZkZWYgRUNPRkZfMzIKLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5pZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF9zaWduZWRfMzIgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLQotICBlY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZpbnRlcm4tPmFzeW0sICZleHQtPmVzX2FzeW0pOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcmZkX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIFJGRFQgKmludGVybjsKLXsKLSAgc3RydWN0IHJmZF9leHQgKmV4dCA9IChzdHJ1Y3QgcmZkX2V4dCAqKSBleHRfcHRyOwotCi0gICppbnRlcm4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9yZmRfb3V0IChhYmZkLCBpbnRlcm4sIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUkZEVCAqaW50ZXJuOwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHJmZF9leHQgKmV4dCA9IChzdHJ1Y3QgcmZkX2V4dCAqKSBleHRfcHRyOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKmludGVybiwgKGJmZF9ieXRlICopZXh0LT5yZmQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGFuIG9wdGltaXphdGlvbiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9vcHRfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBPUFRSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBvcHRfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3Qgb3B0X2V4dCAqKSBleHRfY29weTsKLQotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOwotICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMyWzBdCi0JCQk8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpCi0JCSAgICAgICB8ICgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czNbMF0KLQkJCSAgPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQotCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHM0WzBdCi0JCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybi0+b3QgPSBleHQtPm9fYml0czFbMF07Ci0gICAgICBpbnRlcm4tPnZhbHVlID0gKChleHQtPm9fYml0czJbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgfCAoZXh0LT5vX2JpdHMzWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgIHwgKGV4dC0+b19iaXRzNFswXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpKTsKLSAgICB9Ci0KLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCi0JCQkgICAmZXh0LT5vX3JuZHgsICZpbnRlcm4tPnJuZHgpOwotCi0gIGludGVybi0+b2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5vX29mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGFuIG9wdGltaXphdGlvbiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9vcHRfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBPUFRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBvcHRfZXh0ICpleHQgPSAoc3RydWN0IG9wdF9leHQgKikgZXh0X3B0cjsKLSAgT1BUUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLQotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OwotICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+b19iaXRzMVswXSA9IGludGVybi0+b3Q7Ci0gICAgICBleHQtPm9fYml0czJbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+b19iaXRzM1swXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5vX2JpdHM0WzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgfQotCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSwKLQkJCSAgICAmaW50ZXJuLT5ybmR4LCAmZXh0LT5vX3JuZHgpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT52YWx1ZSwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgZGVuc2UgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZG5yX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRE5SICppbnRlcm47Ci17Ci0gIHN0cnVjdCBkbnJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgZG5yX2V4dCAqKSBleHRfY29weTsKLQotICBpbnRlcm4tPnJmZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9yZmQpOwotICBpbnRlcm4tPmluZGV4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSBkZW5zZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9kbnJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBETlIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGRucl9leHQgKmV4dCA9IChzdHJ1Y3QgZG5yX2V4dCAqKSBleHRfcHRyOwotICBETlIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9yZmQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW5kZXgsIChiZmRfYnl0ZSAqKSBleHQtPmRfaW5kZXgpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYmZkL2VmaS1hcHAtaWEzMi5jIGIvYmZkL2VmaS1hcHAtaWEzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg0MTc4Li4wMDAwMDAwCi0tLSBhL2JmZC9lZmktYXBwLWlhMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgSUEtMzIgRUZJIGFwcGxpY2F0aW9uIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIGJmZF9lZmlfYXBwX2lhMzJfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJlZmktYXBwLWlhMzIiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2RlZmluZSBQRUlfREVGQVVMVF9UQVJHRVRfU1VCU1lTVEVNCUlNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT04KLSNkZWZpbmUgUEVJX0ZPUkNFX01JTklNVU1fQUxJR05NRU5UCi0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9lZmktYXBwLWlhNjQuYyBiL2JmZC9lZmktYXBwLWlhNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxODJkYy4uMDAwMDAwMAotLS0gYS9iZmQvZWZpLWFwcC1pYTY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQL0ludGVsIElBLTY0IEVGSSBhcHBsaWNhdGlvbiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBiZmRfZWZpX2FwcF9pYTY0X3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAiZWZpLWFwcC1pYTY0IgotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRVA2NAotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICdfJwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotI2RlZmluZSBQRUlfREVGQVVMVF9UQVJHRVRfU1VCU1lTVEVNCUlNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT04KLSNkZWZpbmUgUEVJX0ZPUkNFX01JTklNVU1fQUxJR05NRU5UCi0KLSNpbmNsdWRlICJjb2ZmLWlhNjQuYyIKZGlmZiAtLWdpdCBhL2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTc4YWVlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQkVMRl9IXwotI2RlZmluZSBfTElCRUxGX0hfIDEKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIElmIHNpemUgaXNuJ3Qgc3BlY2lmaWVkIGFzIDY0IG9yIDMyLCBOQU1FIG1hY3JvIHNob3VsZCBmYWlsLiAgKi8KLSNpZm5kZWYgTkFNRQotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCw2NCxfLHkpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsMzIsXyx5KQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOQU1FCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsTk9TSVpFLF8seSkKLSNlbmRpZgotCi0jZGVmaW5lIEVsZk5BTUUoWCkJTkFNRShFbGYsWCkKLSNkZWZpbmUgZWxmTkFNRShYKQlOQU1FKGVsZixYKQotCi0vKiBJbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIGlzIHRoZQotICAgY29ycmVzcG9uZGluZyBhc3ltYm9sLiAgRXZlcnkgc3ltYm9sIGlzIGFuIEVMRiBmaWxlIGlzIGFjdHVhbGx5IGEKLSAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFsdGhvdWdoIGl0IGlzIG9mdGVuIGhhbmRsZWQgYXMgYQotICAgcG9pbnRlciB0byBhbiBhc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogRUxGIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gaW50ZXJuYWxfZWxmX3N5bTsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotICAgICAgUFRSIG1pcHNfZXh0cjsKLSAgICAgIFBUUiBhbnk7Ci0gICAgfQotICB0Y19kYXRhOwotCi0gIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGZyb20gYW4gRWxmX0ludGVybmFsX1ZlcnN5bQotICAgICBzdHJ1Y3R1cmUgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgSXQgaXMgemVybyBpZiB0aGVyZSBpcyBubwotICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLQotfSBlbGZfc3ltYm9sX3R5cGU7Ci0MCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEl0IGlzCi0gICAgIHNldCB0byAtMiBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAvKiBTeW1ib2wgaW5kZXggYXMgYSBkeW5hbWljIHN5bWJvbC4gIEluaXRpYWxpemVkIHRvIC0xLCBhbmQgcmVtYWlucwotICAgICAtMSBpZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgLyogPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnRseSB1c2VkIGFzIGEgc3lub255bSBmb3IgdGVzdHMKLSAgICAgYWdhaW5zdCB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgc2ltcGxpZnlpbmcgdHJhbnNmb3JtYXRpb25zCi0gICAgIHRvIHRoZSBjb2RlLiAgKEUuZy4gY2hhbmdpbmcgYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIGEgUExUIGVudHJ5Ci0gICAgIGludG8gYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24uKSAgVGhhdCB0ZXN0LCB3aGljaAotICAgICBpcyBvZnRlbiByZWxhdGl2ZWx5IGNvbXBsZXgsIGFuZCBzb21lcGxhY2VzIHdyb25nIG9yIGluY29tcGxldGUsCi0gICAgIHNob3VsZCByZWFsbHkgYmUgcmVwbGFjZWQgYnkgYSBwcmVkaWNhdGUgaW4gZWxmbGluay5jLgotCi0gICAgIEVuZCByZXN1bHQ6IHRoaXMgZmllbGQgLTEgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCByYXRoZXIgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhpcyBEU08uICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLCBzeW1ib2wgdmlzaWJpbGl0eS4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3RoZXI7Ci0KLSAgLyogSGFzaCB2YWx1ZSBvZiB0aGUgbmFtZSBjb21wdXRlZCB1c2luZyB0aGUgRUxGIGhhc2ggZnVuY3Rpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGVsZl9oYXNoX3ZhbHVlOwotCi0gIC8qIFNvbWUgZmxhZ3M7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBlbGZfbGlua19oYXNoX2ZsYWdzOwotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUiAwMQotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiAwMgotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDIDA0Ci0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgMDEwCi0gIC8qIFN5bWJvbCBoYXMgYSBub24td2VhayByZWZlcmVuY2UgZnJvbSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLIDAyMAotICAvKiBEeW5hbWljIHN5bWJvbCBoYXMgYmVlbiBhZGp1c3RkLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEIDA0MAotICAvKiBTeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIDAxMDAKLSAgLyogU3ltYm9sIG5lZWRzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX1BMVCAwMjAwCi0gIC8qIFN5bWJvbCBhcHBlYXJzIGluIGEgbm9uLUVMRiBpbnB1dCBmaWxlLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfTk9OX0VMRiAwNDAwCi0gIC8qIFN5bWJvbCBzaG91bGQgYmUgbWFya2VkIGFzIGhpZGRlbiBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hJRERFTiAwMTAwMAotICAvKiBTeW1ib2wgd2FzIGZvcmNlZCB0byBsb2NhbCBzY29wZSBkdWUgdG8gYSB2ZXJzaW9uIHNjcmlwdCBmaWxlLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIDAyMDAwCi0gIC8qIFN5bWJvbCB3YXMgbWFya2VkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX01BUksgMDQwMDAKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBub24tR09UL25vbi1QTFQgcmVsb2NhdGlvbi4gIFRoaXMgaXMKLSAgICAgbm90IGN1cnJlbnRseSBzZXQgYnkgYWxsIHRoZSBiYWNrZW5kcy4gICovCi0jZGVmaW5lIEVMRl9MSU5LX05PTl9HT1RfUkVGIDAxMDAwMAotfTsKLQotLyogUmVjb3JkcyBsb2NhbCBzeW1ib2xzIHRvIGJlIGVtaXR0ZWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKm5leHQ7Ci0KLSAgLyogVGhlIGlucHV0IGJmZCB0aGlzIHN5bWJvbCBjYW1lIGZyb20uICAqLwotICBiZmQgKmlucHV0X2JmZDsKLQotICAvKiBUaGUgaW5kZXggb2YgdGhlIGxvY2FsIHN5bWJvbCBiZWluZyBjb3BpZWQuICAqLwotICBsb25nIGlucHV0X2luZHg7Ci0KLSAgLyogVGhlIGluZGV4IGluIHRoZSBvdXRnb2luZyBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgCi0gIC8qIEEgY29weSBvZiB0aGUgaW5wdXQgc3ltYm9sLiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotfTsKLQotLyogRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogV2hldGhlciB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNwZWNpYWwgZHluYW1pYyBzZWN0aW9ucyByZXF1aXJlZAotICAgICB3aGVuIGxpbmtpbmcgYWdhaW5zdCBvciBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICAvKiBUaGUgQkZEIHVzZWQgdG8gaG9sZCBzcGVjaWFsIHNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBCRkQgZm91bmQgd2hpY2ggcmVxdWlyZXMgdGhlc2Ugc2VjdGlvbnMgdG8KLSAgICAgYmUgY3JlYXRlZC4gICovCi0gIGJmZCAqZHlub2JqOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgaW4gdGhlIGxpbmsgd2hpY2ggbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkeW5zeW1jb3VudDsKLSAgLyogVGhlIHN0cmluZyB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMsIHdoaWNoIGJlY29tZXMgdGhlIC5keW5zdHIKLSAgICAgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlIGluIHRoZSAuaGFzaCBzZWN0aW9uLgotICAgICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBidWNrZXRjb3VudDsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBEVF9ORUVERUQgbmFtZXMgZm91bmQgaW4gZHluYW1pYyBvYmplY3RzCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0gIC8qIFRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhnb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIGxvY2FsIHN5bWJvbHMgdG8gYmUgYWRkZWQgdG8gLmR5bnN5bS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICpkeW5sb2NhbDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotDAotLyogQ29uc3RhbnQgaW5mb3JtYXRpb24gaGVsZCBmb3IgYW4gRUxGIGJhY2tlbmQuICAqLwotCi1zdHJ1Y3QgZWxmX3NpemVfaW5mbyB7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX2VoZHIsIHNpemVvZl9waGRyLCBzaXplb2Zfc2hkcjsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfcmVsLCBzaXplb2ZfcmVsYSwgc2l6ZW9mX3N5bSwgc2l6ZW9mX2R5biwgc2l6ZW9mX25vdGU7Ci0KLSAgLyogVGhlIHNpemUgb2YgZW50cmllcyBpbiB0aGUgLmhhc2ggc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX2hhc2hfZW50cnk7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBpbnRlcm5hbCByZWxvY2F0aW9ucyB0byBhbGxvY2F0ZSBwZXIgZXh0ZXJuYWwKLSAgICAgcmVsb2NhdGlvbiBlbnRyeS4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0KLSAgdW5zaWduZWQgY2hhciBhcmNoX3NpemUsIGZpbGVfYWxpZ247Ci0gIHVuc2lnbmVkIGNoYXIgZWxmY2xhc3MsIGV2X2N1cnJlbnQ7Ci0gIGludCAoKndyaXRlX291dF9waGRycykgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotICBib29sZWFuICgqd3JpdGVfc2hkcnNfYW5kX2VoZHIpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHZvaWQgKCp3cml0ZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfc3ltYm9sX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci0gIGJvb2xlYW4gKCpzbHVycF9yZWxvY190YWJsZSkKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotICBsb25nICgqc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotICB2b2lkICgqc3dhcF9keW5faW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotICB2b2lkICgqc3dhcF9keW5fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBQVFIpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBpbiBhIFJFTAotICAgICByZWxvY2F0aW9uLiAgSWYgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBjb3JyZXNwb25kcyB0byBtb3JlIHRoYW4KLSAgICAgb25lIGludGVybmFsIHJlbG9jYXRpb24sIHRoZW4gYWxsIHJlbG9jYXRpb25zIGFyZSBzd2FwcGVkIGluIGF0Ci0gICAgIG9uY2UuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19pbikKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIHRvIHN3YXAgb3V0IGEgUkVMCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19vdXQpCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgYmZkX2J5dGUgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIGluIGEgUkVMQQotICAgICByZWxvY2F0aW9uLiAgSWYgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBjb3JyZXNwb25kcyB0byBtb3JlIHRoYW4KLSAgICAgb25lIGludGVybmFsIHJlbG9jYXRpb24sIHRoZW4gYWxsIHJlbG9jYXRpb25zIGFyZSBzd2FwcGVkIGluIGF0Ci0gICAgIG9uY2UuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY2FfaW4pCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBvdXQgYSBSRUxBCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2b2lkICgqc3dhcF9yZWxvY2Ffb3V0KQotICAgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqKSk7Ci0KLX07Ci0KLSNkZWZpbmUgZWxmX3N5bWJvbF9mcm9tKEFCRkQsUykgXAotCSgoKFMpLT50aGVfYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCSAgJiYgKFMpLT50aGVfYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGEgIT0gMCkgXAotCSA/IChlbGZfc3ltYm9sX3R5cGUgKikgKFMpIFwKLQkgOiAwKQotCi1zdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YQotewotICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBUaGUgRUxGIG1hY2hpbmUgY29kZSAoRU1feHh4eCkgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGludCBlbGZfbWFjaGluZV9jb2RlOwotCi0gIC8qIFRoZSBtYXhpbXVtIHBhZ2Ugc2l6ZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhbiBFTEYgUkVMQSByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUwgcmVsb2NhdGlvbiB0byBhIEJGRCBhcmVsZW50Ci0gICAgIHN0cnVjdHVyZS4gICovCi0gIHZvaWQgKCplbGZfaW5mb190b19ob3d0b19yZWwpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCB3aGVuCi0gICAgIHBhcnRpdGlvbmluZyB0aGUgc3ltYm9sIHRhYmxlIGludG8gbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzLgotICAgICBUaGlzIHNob3VsZCBiZSBOVUxMIGZvciBtb3N0IHRhcmdldHMsIGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QKLSAgICAgdGhpbmcgd2lsbCBiZSBkb25lLiAgTUlQUyBFTEYsIGF0IGxlYXN0IG9uIHRoZSBJcml4IDUsIGhhcwotICAgICBzcGVjaWFsIHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIGhvb2tzIHdoaWNoIGFyZSBjYWxsZWQgb25seSBpZiB0aGV5Ci0gICAgIGFyZSBub3QgTlVMTC4gICovCi0KLSAgLyogQSBmdW5jdGlvbiB0byBwZXJtaXQgYSBiYWNrZW5kIHNwZWNpZmljIGNoZWNrIG9uIHdoZXRoZXIgYQotICAgICBwYXJ0aWN1bGFyIEJGRCBmb3JtYXQgaXMgcmVsZXZhbnQgZm9yIGFuIG9iamVjdCBmaWxlLCBhbmQgdG8KLSAgICAgcGVybWl0IHRoZSBiYWNrZW5kIHRvIHNldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGl0IHdpc2hlcy4gIFdoZW4KLSAgICAgdGhpcyBpcyBjYWxsZWQgZWxmX2VsZmhlYWRlciBpcyBzZXQsIGJ1dCBhbnl0aGluZyBlbHNlIHNob3VsZCBiZQotICAgICB1c2VkIHdpdGggY2F1dGlvbi4gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIGNoZWNrX2Zvcm1hdAotICAgICByb3V0aW5lIHdpbGwgcmV0dXJuIGEgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3Npbmcgd2hlbiByZWFkaW5nIHRoZQotICAgICBFTEYgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyB3aGVyZSBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNwZWNpYWwKLSAgICAgc2VjdGlvbiBpbmRpY2VzIGFyZSBoYW5kbGVkLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHN5bWJvbCBwcm9jZXNzaW5nIGFmdGVyIHJlYWRpbmcgdGhlCi0gICAgIGVudGlyZSBFTEYgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgIGVsZl9zeW1ib2xfdHlwZSAqLAotCQkJCQkJCSAgdW5zaWduZWQgaW50KSk7Ci0KLSAgIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBpbmZvIGZpZWxkLiAgUHJvY2Vzc29yLXNwZWNpZmljCi0gICAgIHR5cGVzIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7IAotIAotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBvbiB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyCi0gICAgIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZmxhZ3MgYW5kCi0gICAgIHR5cGUgZmllbGRzIGZvciBzb21lIHNlY3Rpb25zLCBvciB0byBhY3R1YWxseSB3cml0ZSBvdXQgZGF0YSBmb3IKLSAgICAgdW51c3VhbCBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHNlY3Rpb24gdHlwZXMgd2hlbiBjcmVhdGluZyBCRkQKLSAgICAgc2VjdGlvbnMgZnJvbSBFTEYgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgICBjaGFyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHByb2dyYW0gc2VnbWVudCB0eXBlcyB3aGVuIGNyZWF0aW5nIEJGRAotICAgICBzZWN0aW9ucyBmcm9tIEVMRiBwcm9ncmFtIHNlZ21lbnRzLiAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1BoZHIgKiwKLQkJCQkJCSAgICBpbnQpKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHNldCB1cCB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyIGZvciBhIEJGRCBzZWN0aW9uIGluCi0gICAgIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIGl0IG91dC4gIFRoaXMgaXMgd2hlcmUgdGhlIGZsYWdzIGFuZCB0eXBlCi0gICAgIGZpZWxkcyBhcmUgc2V0IGZvciB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQlhc2VjdGlvbiAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBnZXQgdGhlIEVMRiBzZWN0aW9uIGluZGV4IGZvciBhIEJGRCBzZWN0aW9uLiAgSWYKLSAgICAgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzZWN0aW9uIHdhcyBmb3VuZC4gIElmIGl0IGlzIGEgbm9ybWFsIEVMRgotICAgICBzZWN0aW9uLCAqUkVUVkFMIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4gIElmIGl0IGlzIG5vdCBhIG5vcm1hbAotICAgICBFTEYgc2VjdGlvbiAqUkVUVkFMIHNob3VsZCBiZSBzZXQgdG8gdGhlIFNITl94eHh4IGluZGV4LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKLSAgICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKnJldHZhbCkpOwotCi0gIC8qIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIGl0IGlzIGNhbGxlZCBieSB0aGUgYWRkX3N5bWJvbHMgcGhhc2UKLSAgICAgb2YgYSBsaW5rIGp1c3QgYmVmb3JlIGFkZGluZyBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICAgIHRhYmxlLiAgSXQgbWF5IG1vZGlmeSBhbnkgb2YgdGhlIGZpZWxkcyBhcyBpdCB3aXNoZXMuICBJZiAqTkFNRQotICAgICBpcyBzZXQgdG8gTlVMTCwgdGhlIHN5bWJvbCB3aWxsIGJlIHNraXBwZWQgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICBoYW5kbGluZyBhbGwgcHJvY2Vzc29yIGRlcGVuZGVudCBzeW1ib2wgYmluZGluZ3MgYW5kIHNlY3Rpb24KLSAgICAgaW5kaWNlcywgYW5kIG11c3Qgc2V0IGF0IGxlYXN0ICpGTEFHUyBhbmQgKlNFQyBmb3IgZWFjaCBwcm9jZXNzb3IKLSAgICAgZGVwZW5kZW50IGNhc2U7IGZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIGxpbmsgZXJyb3IuICAqLwotICBib29sZWFuICgqZWxmX2FkZF9zeW1ib2xfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBjb25zdCBjaGFyICoqbmFtZSwKLQkgICAgIGZsYWd3b3JkICpmbGFncywgYXNlY3Rpb24gKipzZWMsIGJmZF92bWEgKnZhbHVlKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBlbGZfbGlua19vdXRwdXRfc3ltCi0gICAgIHBoYXNlIG9mIGEgbGluayBmb3IgZWFjaCBzeW1ib2wgd2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqLAotCSAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci0KLSAgLyogVGhlIENSRUFURV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIHRoZSBmaXJzdCB0aW1lIGl0IGVuY291bnRlcnMgYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluay4KLSAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGNyZWF0ZSBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMKLSAgICAgbGlua2luZy4gIFRoZSBBQkZEIGFyZ3VtZW50IGlzIGEgZHluYW1pYyBvYmplY3QuICBUaGUgLmludGVycCwKLSAgICAgLmR5bmFtaWMsIC5keW5zeW0sIC5keW5zdHIsIGFuZCAuaGFzaCBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgY3JlYXRlZCwgYW5kIHRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgc2VjdGlvbiBmbGFncyBpZgotICAgICBkZXNpcmVkLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNyZWF0ZSB0aGUgLmdvdCBhbmQgLnBsdAotICAgICBzZWN0aW9ucywgYnV0IGRpZmZlcmVudCBiYWNrZW5kcyBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBDSEVDS19SRUxPQ1MgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZSBvZgotICAgICB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgSXQgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc2VjdGlvbiB3aXRoCi0gICAgIHJlbG9jcyBvZiBhbiBvYmplY3QgZmlsZSwganVzdCBhZnRlciB0aGUgc3ltYm9scyBmb3IgdGhlIG9iamVjdAotICAgICBmaWxlIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZ1bmN0aW9uIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY3MgYW5kIGRvIGFueSBzcGVjaWFsIGhhbmRsaW5nCi0gICAgIHJlcXVpcmVkLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgYWxsb2NhdGluZyBzcGFjZSBpbiB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZSwgYW5kIHBlcmhhcHMgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYy4gIFRoZQotICAgICByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgICAgemVyby4gICovCi0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLSAgLyogVGhlIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBmb3IgZXZlcnkgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZQotICAgICBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwgYnV0IGJlZm9yZSB0aGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TCi0gICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBoYXNoIHRhYmxlIGVudHJ5IHNob3VsZCBiZQotICAgICBiZmRfbGlua19oYXNoX2RlZmluZWQgb3JlIGJmZF9saW5rX2hhc2hfZGVmd2VhaywgYW5kIGl0IHNob3VsZCBiZQotICAgICBkZWZpbmVkIGluIGEgc2VjdGlvbiBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBEeW5hbWljIG9iamVjdAotICAgICBzZWN0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBmaW5hbCBsaW5rLCBhbmQgdGhpcyBmdW5jdGlvbiBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyB3aGljaCB0aGUgcmVzdCBvZgotICAgICB0aGUgbGluayBjYW4gZGVhbCB3aXRoLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGludm9sdmUgYWRkaW5nIGFuCi0gICAgIGVudHJ5IHRvIHRoZSAucGx0IG9yIC5nb3Qgb3Igc29tZSBzdWNoIHNlY3Rpb24sIGFuZCBzZXR0aW5nIHRoZQotICAgICBzeW1ib2wgdG8gcG9pbnQgdG8gdGhhdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoKSk7Ci0KLSAgLyogVGhlIEFMV0FZU19TSVpFX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIKLSAgICAgYWZ0ZXIgYWxsIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4gYnV0IGJlZm9yZSB0aGUKLSAgICAgc2VjdGlvbiBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MLCBidXQgYmVmb3JlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlCi0gICAgIHRoZSBzZWN0aW9ucyBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgYXBwcm9wcmlhdGUgc3ltYm9scy4KLSAgICAgSXQgaXMgb25seSBjYWxsZWQgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEl0IG11c3QKLSAgICAgc2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucywgYW5kIG1heSBmaWxsIGluIHRoZWlyCi0gICAgIGNvbnRlbnRzIGFzIHdlbGwuICBUaGUgZ2VuZXJpYyBFTEYgbGlua2VyIGNhbiBoYW5kbGUgdGhlIC5keW5zeW0sCi0gICAgIC5keW5zdHIgYW5kIC5oYXNoIHNlY3Rpb25zLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSB0aGUKLSAgICAgLmludGVycCBzZWN0aW9uIGFuZCBhbnkgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUKLSAgICAgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZW50cnkgcG9pbnQuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICAgIG5lY2Vzc2FyeS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgICBhY2NvcmRpbmdseS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBiZmQgKmlucHV0X2JmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF9ieXRlICpjb250ZW50cywKLQkgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zKSk7Ci0KLSAgLyogVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYSBzeW1ib2wgb3V0IHRvIHRoZSAuZHluc3ltIHNlY3Rpb24uCi0gICAgIFRoZSBwcm9jZXNzb3IgYmFja2VuZCBtYXkgbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudCB0byB0aGUKLSAgICAgc3ltYm9sLiAgSXQgbWF5IGFsc28gdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gc2V0IGNvbnRlbnRzIG9mIHRoZQotICAgICBkeW5hbWljIHNlY3Rpb25zLiAgTm90ZSB0aGF0IEZJTklTSF9EWU5BTUlDX1NZTUJPTCBpcyBjYWxsZWQgb24KLSAgICAgYWxsIC5keW5zeW0gc3ltYm9scywgd2hpbGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGlzIG9ubHkgY2FsbGVkCi0gICAgIG9uIHRob3NlIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIganVzdCBiZWZvcmUgaXQgd3JpdGVzIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucyBvdXQgdG8gdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCB3aWxsIGhhdmUgYmVlbiBjYWxsZWQgb24KLSAgICAgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhbnkgYmVnaW5uaW5nIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIGJ1aWxkaW5nIHRoZSBFTEYgaGVhZGVycyBhbmQgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBmaW5hbCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhlIEVMRiBmaWxlCi0gICAgIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoZSBMSU5LRVIgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIEJGRAotICAgICB3YXMgY3JlYXRlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gbGlua2VyKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuICBJdCBzaG91bGQKLSAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHRoaXMgQkZECi0gICAgIHdpbGwgbmVlZC4gIEl0IHNob3VsZCByZXR1cm4gLTEgb24gZXJyb3IuICAqLwotICBpbnQgKCplbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBtb2RpZnkgYW4gZXhpc3Rpbmcgc2VnbWVudCBtYXAgaW4gYQotICAgICBiYWNrZW5kIHNwZWNpZmljIGZhc2hpb24uICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZWN0aW9uIGdjIHRvIGRpc2NvdmVyIHRoZSBzZWN0aW9uIGEKLSAgICAgcGFydGljdWxhciByZWxvY2F0aW9uIHJlZmVycyB0by4gIEl0IG5lZWQgbm90IGJlIGRlZmluZWQgZm9yIGhvc3RzCi0gICAgIHRoYXQgaGF2ZSBubyBxdWVlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2Ugb2YgZ2MKLSAgICAgaW4gb3JkZXIgdGhhdCBhIGJhY2tlbmQgbWlnaHQgdXBkYXRlIGFueSBkYXRhIHN0cnVjdHVyZXMgaXQgbWlnaHQKLSAgICAgYmUgbWFpbnRhaW5pbmcuICAqLwotICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXJzIGhhdmUKLSAgICAgYmVlbiBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgZm9yIHRoaW5ncyBsaWtlIHRoZSBPUyBhbmQgQUJJIHZlcnNpb25zCi0gICAgIHRvIGJlIGNoYW5nZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBwcmludHMgYSBzeW1ib2wgdG8gZmlsZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGJlIHByaW50ZWQuICBJdCBzaG91bGQgcmV0dXJuIE5VTEwgdG8gZmFsbAotICAgICBiYWNrIHRvIGRlZmF1bHQgc3ltYm9sIHByaW50aW5nLiAgKi8KLSAgY29uc3QgY2hhciAqKCplbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsKQotICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBhZnRlciBhbGwgbG9jYWwgc3ltYm9scyBhbmQKLSAgICAgZ2xvYmFsIHN5bWJvbHMgY29udmVydGVkIHRvIGxvY2FscyBhcmUgZW1pdGVkIGludG8gdGhlIHN5bXRhYgotICAgICBzZWN0aW9uLiAgSXQgYWxsb3dzIHRoZSBiYWNrZW5kIHRvIGVtaXQgc3BlY2lhbCBnbG9iYWwgc3ltYm9scwotICAgICBub3QgaGFuZGxlZCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBQVFIsCi0JICAgIGJvb2xlYW4gKCopIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotICAgICAgICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpKSk7Ci0KLSAgLyogQ29weSBhbnkgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBkeW5hbWljIGxpbmtpbmcgZnJvbSBhIHByZS1leGlzdGluZwotICAgICBzeW1ib2wgSU5EIHRvIGEgbmV3bHkgY3JlYXRlZCBzeW1ib2wgRElSLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sKQotICAgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBNb2RpZnkgYW55IGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZHluYW1pYyBsaW5raW5nIHN1Y2ggdGhhdCB0aGUKLSAgICAgc3ltYm9sIGlzIG5vdCBleHBvcnRlZC4gICovCi0gIHZvaWQgKCplbGZfYmFja2VuZF9oaWRlX3N5bWJvbCkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgLyogVGhlIHN3YXBwaW5nIHRhYmxlIHRvIHVzZSB3aGVuIGRlYWxpbmcgd2l0aCBFQ09GRiBpbmZvcm1hdGlvbi4KLSAgICAgVXNlZCBmb3IgdGhlIE1JUFMgRUxGIC5tZGVidWcgc2VjdGlvbi4gICovCi0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICplbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gIC8qIEFsdGVybmF0ZSBFTV94eHh4IG1hY2hpbmUgY29kZXMgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGludCBlbGZfbWFjaGluZV9hbHQxOwotICBpbnQgZWxmX21hY2hpbmVfYWx0MjsKLQotICBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyAqczsKLQotICAvKiBvZmZzZXQgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5nb3Qgc2VjdGlvbiAqLwotICBiZmRfdm1hIGdvdF9zeW1ib2xfb2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBoZWFkZXJzIGZvciB0aGUgR09UIGFuZCBQTFQuICBUaGlzIGluY2x1ZGVzCi0gICAgIHRoZSBzby1jYWxsZWQgcmVzZXJ2ZWQgZW50cmllcyBvbiBzb21lIHN5c3RlbXMuICAqLwotICBiZmRfdm1hIGdvdF9oZWFkZXJfc2l6ZTsKLSAgYmZkX3ZtYSBwbHRfaGVhZGVyX3NpemU7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGFjdCBsaWtlIGNvbGxlY3QgYW5kIGdhdGhlcgotICAgICBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLiAgVGhpcyBpcyB0cnVlIGZvcgotICAgICBNSVBTIEVMRiBiZWNhdXNlIHRoZSBJcml4IDUgdG9vbHMgY2FuIG5vdCBoYW5kbGUgdGhlIC5pbml0Ci0gICAgIHNlY3Rpb24uICAqLwotICB1bnNpZ25lZCBjb2xsZWN0IDogMTsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgaWdub3JlIGNoYW5nZXMgdG8gdGhlIHR5cGUgb2YgYQotICAgICBzeW1ib2wuICBUaGlzIGlzIHRydWUgZm9yIE1JUFMgRUxGIGJlY2F1c2Ugc29tZSBJcml4IDUgb2JqZWN0cwotICAgICByZWNvcmQgdW5kZWZpbmVkIGZ1bmN0aW9ucyBhcyBTVFRfT0JKRUNUIGFsdGhvdWdoIHRoZSBkZWZpbml0aW9ucwotICAgICBhcmUgU1RUX0ZVTkMuICAqLwotICB1bnNpZ25lZCB0eXBlX2NoYW5nZV9vayA6IDE7Ci0KLSAgLyogV2hldGhlciB0aGUgYmFja2VuZCBtYXkgdXNlIFJFTCByZWxvY2F0aW9ucy4gIChTb21lIGJhY2tlbmRzIHVzZQotICAgICBib3RoIFJFTCBhbmQgUkVMQSByZWxvY2F0aW9ucywgYW5kIHRoaXMgZmxhZyBpcyBzZXQgZm9yIHRob3NlCi0gICAgIGJhY2tlbmRzLikgICovCi0gIHVuc2lnbmVkIG1heV91c2VfcmVsX3AgOiAxOwotICAgIAotICAvKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG1heSB1c2UgUkVMQSByZWxvY2F0aW9ucy4gIChTb21lIGJhY2tlbmRzIHVzZQotICAgICBib3RoIFJFTCBhbmQgUkVMQSByZWxvY2F0aW9ucywgYW5kIHRoaXMgZmxhZyBpcyBzZXQgZm9yIHRob3NlCi0gICAgIGJhY2tlbmRzLikgICovCi0gIHVuc2lnbmVkIG1heV91c2VfcmVsYV9wIDogMTsKLQotICAvKiBXaGV0aGVyIHRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBpcyBSRUxBLiAgSWYgYSBiYWNrZW5kIHdpdGgKLSAgICAgdGhpcyBmbGFnIHNldCB3YW50cyBSRUwgcmVsb2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLAotICAgICBpdCBtdXN0IG5vdGUgdGhhdCBleHBsaWNpdGx5LiAgU2ltaWxhcmx5LCBpZiB0aGlzIGZsYWcgaXMgY2xlYXIsCi0gICAgIGFuZCB0aGUgYmFja2VuZCB3YW50cyBSRUxBIHJlbG9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgCi0gICAgIHNlY3Rpb24uICAqLyAgIAotICB1bnNpZ25lZCBkZWZhdWx0X3VzZV9yZWxhX3AgOiAxOwotCi0gIC8qIFRydWUgaWYgYWRkcmVzc2VzICJuYXR1cmFsbHkiIHNpZ24gZXh0ZW5kLiAgVGhpcyBpcyB1c2VkIHdoZW4KLSAgICAgc3dhcHBpbmcgaW4gZnJvbSBFbGYzMiB3aGVuIEJGRDY0LiAgKi8KLSAgdW5zaWduZWQgc2lnbl9leHRlbmRfdm1hIDogMTsKLQotICB1bnNpZ25lZCB3YW50X2dvdF9wbHQgOiAxOwotICB1bnNpZ25lZCBwbHRfcmVhZG9ubHkgOiAxOwotICB1bnNpZ25lZCB3YW50X3BsdF9zeW0gOiAxOwotICB1bnNpZ25lZCBwbHRfbm90X2xvYWRlZCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9hbGlnbm1lbnQgOiA0OwotICB1bnNpZ25lZCBjYW5fZ2Nfc2VjdGlvbnMgOiAxOwotICB1bnNpZ25lZCB3YW50X2R5bmJzcyA6IDE7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBzdG9yZWQgZm9yIGVhY2ggQkZEIHNlY3Rpb24gaW4gYW4gRUxGIGZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IGVsZl9uZXdfc2VjdGlvbl9ob29rLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhCi17Ci0gIC8qIFRoZSBFTEYgaGVhZGVyIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciB0aGlzX2hkcjsKLSAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoZSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgIHNlY3Rpb24sIGlmIGFueS4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHJlbF9oZHI7Ci0gIC8qIElmIHRoZXJlIGlzIGEgc2Vjb25kIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VjdGlvbiwKLSAgICAgYXMgY2FuIGhhcHBlbiBvbiBJcml4IDYsIHRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBoZWFkZXIuICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIFJFTF9IRFIuICAqLwotICB1bnNpZ25lZCBpbnQgcmVsX2NvdW50OwotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGN1cnJlbnRseSBhc3NpZ25lZCB0byBSRUxfSERSMi4gICovCi0gIHVuc2lnbmVkIGludCByZWxfY291bnQyOwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoaXMgc2VjdGlvbi4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBpbnQgdGhpc19pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gaW5kaWNhdGVkIGJ5Ci0gICAgIFJFTF9IRFIgaWYgYW55LiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGludCByZWxfaWR4OwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoZSByZWxvYyBzZWN0aW9uIGluZGljYXRlZCBieQotICAgICBSRUxfSERSMiBpZiBhbnkuICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IHJlbF9pZHgyOwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB0byBzdG9yZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgZW50cmllcwotICAgICBhc3NvY2lhdGVkIHdpdGggcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiB0aGUgc2VjdGlvbiB1c2VzIFJFTCByZWxvY3MsCi0gICAgIHJhdGhlciB0aGFuIFJFTEEsIGFsbCB0aGUgcl9hZGRlbmQgZmllbGRzIHdpbGwgYmUgemVyby4gIFRoaXMKLSAgICAgcG9pbnRlciBtYXkgYmUgTlVMTC4gIEl0IGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgLyogVXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgdG8KLSAgICAgcmVjb3JkIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBmb3IgYSBzZWN0aW9uIHN5bWJvbAotICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VjdGlvbi4gIEEgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZXJlIGlzCi0gICAgIG5vIGR5bmFtaWMgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBsb25nIGR5bmluZHg7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBIHBvaW50ZXIgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIEVMRiBiYWNrZW5kLiAgKi8KLSAgUFRSIHRkYXRhOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc2VjdGlvbiB1c2VzIFJFTEEgcmVsb2NhdGlvbnMsIHJhdGhlciB0aGFuIFJFTC4gICovCi0gIHVuc2lnbmVkIGludCB1c2VfcmVsYV9wOjE7Ci19OwotCi0jZGVmaW5lIGVsZl9zZWN0aW9uX2RhdGEoc2VjKSAgKChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEqKXNlYy0+dXNlZF9ieV9iZmQpCi0KLSNkZWZpbmUgZ2V0X2VsZl9iYWNrZW5kX2RhdGEoYWJmZCkgXAotICAoKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0vKiBFbnVtZXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBzcGVjaWFsIHNlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtCi17Ci0gIExJTktFUl9TRUNUSU9OX1VOS05PV04sCQkvKiBub3QgdXNlZCAqLwotICBMSU5LRVJfU0VDVElPTl9HT1QsCQkJLyogLmdvdCBzZWN0aW9uIGZvciBnbG9iYWwgb2Zmc2V0IHBvaW50ZXJzICovCi0gIExJTktFUl9TRUNUSU9OX1BMVCwJCQkvKiAucGx0IHNlY3Rpb24gZm9yIGdlbmVyYXRlZCBwcm9jZWR1cmUgc3R1YnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEsCQkJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gZm9yIFBvd2VyUEMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEyLAkJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9NQVgJCQkvKiAjIG9mIGxpbmtlciBzZWN0aW9ucyAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90OwotCi0vKiBTZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24KLXsKLSAgY2hhciAqbmFtZTsJCQkJLyogbmFtZSBvZiB0aGUgc2VjdGlvbiAqLwotICBjaGFyICpyZWxfbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIC5yZWx7LGF9LiBzZWN0aW9uICovCi0gIGNoYXIgKmJzc19uYW1lOwkJCS8qIG5hbWUgb2YgYSByZWxhdGVkIC5ic3Mgc2VjdGlvbiAqLwotICBjaGFyICpzeW1fbmFtZTsJCQkvKiBuYW1lIG9mIHN5bWJvbCB0byByZWZlcmVuY2UgdGhpcyBzZWN0aW9uICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKmJzc19zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgYnNzIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciB0aGlzIHNlY3Rpb24gKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwkvKiBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHN5bWJvbCBoYXNoIHZhbHVlICovCi0gIGJmZF92bWEgaW5pdGlhbF9zaXplOwkJCS8qIGluaXRpYWwgc2l6ZSBiZWZvcmUgYW55IGxpbmtlciBnZW5lcmF0ZWQgYWxsb2NhdGlvbnMgKi8KLSAgYmZkX3ZtYSBzeW1fb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzeW1ib2wgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hIGhvbGVfc2l6ZTsJCQkvKiBzaXplIG9mIHJlc2VydmVkIGFkZHJlc3MgaG9sZSBpbiBhbGxvY2F0aW9uICovCi0gIGJmZF92bWEgaG9sZV9vZmZzZXQ7CQkJLyogY3VycmVudCBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGJmZF92bWEgbWF4X2hvbGVfb2Zmc2V0OwkJLyogbWF4aW11bSBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CS8qIHdoaWNoIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIGhvbGVfd3JpdHRlbl9wOwkJLyogd2hldGhlciB0aGUgaG9sZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwkJLyogYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbiAqLwotICBmbGFnd29yZCBmbGFnczsJCQkvKiBmbGFncyB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZWN0aW9uICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl90OwotCi0vKiBMaW5rZWQgbGlzdCBvZiBhbGxvY2F0ZWQgcG9pbnRlciBlbnRyaWVzLiAgVGhpcyBoYW5ncyBvZmYgb2YgdGhlIHN5bWJvbCBsaXN0cywgYW5kCi0gICBwcm92aWRlcyBhbGxvd3MgdXMgdG8gcmV0dXJuIGRpZmZlcmVudCBwb2ludGVycywgYmFzZWQgb24gZGlmZmVyZW50IGFkZGVuZCdzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzCi17Ci0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKm5leHQ7CS8qIG5leHQgYWxsb2NhdGVkIHBvaW50ZXIgZm9yIHRoaXMgc3ltYm9sICovCi0gIGJmZF92bWEgb2Zmc2V0OwkJCQkvKiBvZmZzZXQgb2YgcG9pbnRlciBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsJCQkvKiBhZGRlbmQgdXNlZCAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoOwkJLyogd2hpY2ggbGlua2VyIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIHdyaXR0ZW5fYWRkcmVzc19wOwkJCS8qIHdoZXRoZXIgYWRkcmVzcyB3YXMgd3JpdHRlbiB5ZXQgKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3Q7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZWxmX29ial90ZGF0YQotewotICBFbGZfSW50ZXJuYWxfRWhkciBlbGZfaGVhZGVyWzFdOwkvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmVsZl9zZWN0X3B0cjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKnNlZ21lbnRfbWFwOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWJfcHRyOwotICBpbnQgbnVtX2xvY2FsczsKLSAgaW50IG51bV9nbG9iYWxzOwotICBhc3ltYm9sICoqc2VjdGlvbl9zeW1zOwkJLyogU1RUX1NFQ1RJT04gc3ltYm9scyBmb3IgZWFjaCBzZWN0aW9uICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyIHNoc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyc3ltX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVycmVmX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyZGVmX2hkcjsKLSAgdW5zaWduZWQgaW50IHN5bXRhYl9zZWN0aW9uLCBzaHN0cnRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgc3RydGFiX3NlY3Rpb24sIGR5bnN5bXRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLCBkeW52ZXJyZWZfc2VjdGlvbjsKLSAgZmlsZV9wdHIgbmV4dF9maWxlX3BvczsKLSNpZiAwCi0gIC8qIHdlIGRvbid0IG5lZWQgdGhlc2UgaW5zaWRlIGJmZCBhbnltb3JlLCBhbmQgSSB0aGluawotICAgICB0aGVzZSB3ZXJlbid0IHVzZWQgb3V0c2lkZSBiZmQuICovCi0gIHZvaWQgKnByc3RhdHVzOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJzdGF0dXMgc3RydWN0dXJlICovCi0gIHZvaWQgKnBycHNpbmZvOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJwc2luZm8gc3RydWN0dXJlICovCi0jZW5kaWYKLSAgYmZkX3ZtYSBncDsJCQkJLyogVGhlIGdwIHZhbHVlIChNSVBTIG9ubHksIGZvciBub3cpICovCi0gIHVuc2lnbmVkIGludCBncF9zaXplOwkJCS8qIFRoZSBncCBzaXplIChNSVBTIG9ubHksIGZvciBub3cpICovCi0KLSAgLyogSW5mb3JtYXRpb24gZ3JhYmJlZCBmcm9tIGFuIGVsZiBjb3JlIGZpbGUuICovCi0gIGludCBjb3JlX3NpZ25hbDsKLSAgaW50IGNvcmVfcGlkOwotICBpbnQgY29yZV9sd3BpZDsKLSAgY2hhciogY29yZV9wcm9ncmFtOwotICBjaGFyKiBjb3JlX2NvbW1hbmQ7Ci0KLSAgLyogVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBiYWNrZW5kCi0gICAgIGxpbmtlci4gICovCi0gIGJvb2xlYW4gbGlua2VyOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbHMgdG8gZW50cmllcyBpbiB0aGUgbGlua2VyIGhhc2gKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXgKLSAgICAgbWludXMgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gbG9jYWwgc3ltYm9scyB0byBvZmZzZXRzIGludG8gdGhlIGdsb2JhbCBvZmZzZXQKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXguCi0gICAgIExpa2UgZm9yIHRoZSBnbG9iYWxzLCB3ZSB1c2UgYSB1bmlvbiBhbmQgdHdvIG5hbWVzIHByaW1hcmlseSB0bwotICAgICBkb2N1bWVudCB0aGUgaW50ZW50IG9mIGFueSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuICBUaGUgZmllbGQKLSAgICAgc2hvdWxkIGJlIHVzZWQgYXMgYSBjb3VudCB1bnRpbCBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGF0IHdoaWNoCi0gICAgIHBvaW50IHRoZSBjb250ZW50cyBvZiB0aGUgLmdvdCBpcyBmaXhlZC4gIEFmdGVyd2FyZCwgaWYgYW4gZW50cnkKLSAgICAgaXMgLTEsIHRoZW4gdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqcmVmY291bnRzOwotICAgICAgYmZkX3ZtYSAqb2Zmc2V0czsKLSAgICB9IGxvY2FsX2dvdDsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgdmFyaW91cyBsaW5rZXIKLSAgICAgc2VjdGlvbnMgYWRkZWQuICBUaGlzIGlzIGluZGV4IGJ5IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzOwotCi0gIC8qIFRoZSBsaW5rZXIgRUxGIGVtdWxhdGlvbiBjb2RlIG5lZWRzIHRvIGxldCB0aGUgYmFja2VuZCBFTEYgbGlua2VyCi0gICAgIGtub3cgd2hhdCBmaWxlbmFtZSBzaG91bGQgYmUgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBpZiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgaXMgZm91bmQgdXNpbmcgYSBzZWFyY2guICBUaGUgZW11bGF0aW9uIGNvZGUgdGhlbgotICAgICBzb21ldGltZXMgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgd2FzIGFjdHVhbGx5IHVzZWQuICBVbnRpbCB0aGUKLSAgICAgZmlsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlua2VyIHN5bWJvbCB0YWJsZSwgdGhpcyBmaWVsZCBob2xkcwotICAgICB0aGUgbmFtZSB0aGUgbGlua2VyIHdhbnRzLiAgQWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQsIGl0IGhvbGRzIHRoZQotICAgICBuYW1lIGFjdHVhbGx5IHVzZWQsIHdoaWNoIHdpbGwgYmUgdGhlIERUX1NPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcwotICAgICBvbmUuICAqLwotICBjb25zdCBjaGFyICpkdF9uYW1lOwotCi0gIC8qIElyaXggNSBvZnRlbiBzY3Jld3MgdXAgdGhlIHN5bWJvbCB0YWJsZSwgc29ydGluZyBsb2NhbCBzeW1ib2xzCi0gICAgIGFmdGVyIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgc3ltYm9sIHRhYmxlIGluCi0gICAgIHRoaXMgQkZEIGFwcGVhcnMgdG8gYmUgc2NyZXdlZCB1cC4gIElmIGl0IGlzLCB3ZSBpZ25vcmUgdGhlCi0gICAgIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIsIGFuZCBhbHdheXMgcmVhZCBhbGwgdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBib29sZWFuIGJhZF9zeW10YWI7Ci0KLSAgLyogUmVjb3JkcyB0aGUgcmVzdWx0IG9mIGBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZScuICAqLwotICBiZmRfc2l6ZV90eXBlIHByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVXNlZCBieSBNSVBTIEVMRiBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUKLSAgICAgY291bGQgYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvCi0gICAgIHdhc3RpbmcgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZAotICAgICBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEEgcGxhY2UgdG8gc3Rhc2ggZHdhcmYxIGluZm8gZm9yIHRoaXMgYmZkLiAqLwotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpkd2FyZjFfZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjIgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBbiBhcnJheSBvZiBzdHViIHNlY3Rpb25zIGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwgdXNlZCBieSB0aGUKLSAgICAgTUlQUyBFTEYgbGlua2VyLiAgRklYTUU6IFdlIHNob3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIG9ubHkKLSAgICAgaW5jbHVkZSB0aGlzIGZpZWxkIGZvciBhIE1JUFMgRUxGIHRhcmdldC4gICovCi0gIGFzZWN0aW9uICoqbG9jYWxfc3R1YnM7Ci0KLSAgLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVfZmxhZ3MgZmllbGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgYm9vbGVhbiBmbGFnc19pbml0OwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVyZGVmczsKLQotICAvKiBOdW1iZXIgb2Ygc3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVycmVmczsKLQotICAvKiBTeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyBpbiBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdmVyZGVmOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgb2JqZWN0cy4gICovCi0gIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp2ZXJyZWY7Ci0KLSAgLyogTGlua2VyIHNlY3Rpb25zIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uICpsaW5rZXJfc2VjdGlvblsgKGludClMSU5LRVJfU0VDVElPTl9NQVggXTsKLX07Ci0KLSNkZWZpbmUgZWxmX3RkYXRhKGJmZCkJCSgoYmZkKSAtPiB0ZGF0YS5lbGZfb2JqX2RhdGEpCi0jZGVmaW5lIGVsZl9lbGZoZWFkZXIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX2hlYWRlcikKLSNkZWZpbmUgZWxmX2VsZnNlY3Rpb25zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGVsZl9zZWN0X3B0cikKLSNkZWZpbmUgZWxmX3Noc3RydGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN0cnRhYl9wdHIpCi0jZGVmaW5lIGVsZl9vbmVzeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW5zeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHluc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJzeW0oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyc3ltX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJkZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyZGVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJyZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVycmVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9udW1fbG9jYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9sb2NhbHMpCi0jZGVmaW5lIGVsZl9udW1fZ2xvYmFscyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBudW1fZ2xvYmFscykKLSNkZWZpbmUgZWxmX3NlY3Rpb25fc3ltcyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzZWN0aW9uX3N5bXMpCi0jZGVmaW5lIGNvcmVfcHJwc2luZm8oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJwc2luZm8pCi0jZGVmaW5lIGNvcmVfcHJzdGF0dXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJzdGF0dXMpCi0jZGVmaW5lIGVsZl9ncChiZmQpCQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3ApCi0jZGVmaW5lIGVsZl9ncF9zaXplKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGdwX3NpemUpCi0jZGVmaW5lIGVsZl9zeW1faGFzaGVzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN5bV9oYXNoZXMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5yZWZjb3VudHMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsb2NhbF9nb3Qub2Zmc2V0cykKLSNkZWZpbmUgZWxmX2xvY2FsX3B0cl9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzKQotI2RlZmluZSBlbGZfZHRfbmFtZShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkdF9uYW1lKQotI2RlZmluZSBlbGZfYmFkX3N5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBiYWRfc3ltdGFiKQotI2RlZmluZSBlbGZfZmxhZ3NfaW5pdChiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBmbGFnc19pbml0KQotI2RlZmluZSBlbGZfbGlua2VyX3NlY3Rpb24oYmZkLG4pIChlbGZfdGRhdGEoYmZkKSAtPiBsaW5rZXJfc2VjdGlvblsoaW50KW5dKQotDAotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwgRWxmX0ludGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKiwgRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwgRWxmX0ludGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKiwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqLCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqLCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcnN5bSAqLCBFbGZfSW50ZXJuYWxfVmVyc3ltICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqLCBFbGZfRXh0ZXJuYWxfVmVyc3ltICopKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosCi0JCQkJCSAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKGFiZmQsc3RyaW5kZXgpIFwKLSAgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbihhYmZkLGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsc3RyaW5kZXgpCi0KLSNkZWZpbmUgYmZkX2VsZjMyX3ByaW50X3N5bWJvbAliZmRfZWxmX3ByaW50X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJmZF9lbGZfaGFzaCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJICAgIGFyZWxlbnQgKiwKLQkJCQkJCQkgICAgYXN5bWJvbCAqLAotCQkJCQkJCSAgICBQVFIsCi0JCQkJCQkJICAgIGFzZWN0aW9uICosCi0JCQkJCQkJICAgIGJmZCAqLAotCQkJCQkJCSAgICBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rY29yZWZpbGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfU2hkciAqYmZkX2VsZl9maW5kX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBFbGZfSW50ZXJuYWxfUGhkciAqaGRyLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGVuYW1lKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9saW5rX2hhc2hfaGlkZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJICAgICAgIGZpbGVfcHRyLAotCQkJCQkJICAgICAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJCSAgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLAotCQkJCQkJCSBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkgICAgICAgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYWxlbnQgKl9iZmRfZWxmX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgYXN5bWJvbCAqKiwKLQkJCQkJCSAgICBiZmRfdm1hLCBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCQkgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBfYmZkX2VsZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLWV4dGVybiBpbnQgX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLQotLyogSWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgcmVsb2MgaGFuZGxpbmcgd3JpdHRlbiB5ZXQ6ICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfbm9faW5mb190b19ob3d0byBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBzaGluZGV4KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotYXNlY3Rpb24gKmJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfZWxmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotbG9uZwotX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgYmZkICosIGxvbmcpKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci12b2lkIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1maWxlX3B0ciBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiBQQVJBTVMgKChFbGZfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJCSAgICBmaWxlX3B0ciwKLQkJCQkJCQkgICAgYm9vbGVhbikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXVuc2lnbmVkIGxvbmcgX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fdCAqX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0cykpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfcG9pbnRlcnMsCi0JICAgYmZkX3NpZ25lZF92bWEgYWRkZW5kLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2gpKTsKLQotYm9vbGVhbiBiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjMyX0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBiZmRfZWxmNjRfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmNjRfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEKLSAgUEFSQU1TICgoYmZkICpkeW5vYmosCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIGludCBhbGlnbm1lbnQpKTsKLQotYm9vbGVhbiBfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfU3ltICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWwgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGYzMl9FeHRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1BoZHIgKiwgRWxmX0ludGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIEVsZjMyX0V4dGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBQVFIpKTsKLWV4dGVybiBsb25nIGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl93cml0ZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbCAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBFbGY2NF9FeHRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZjY0X0V4dGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUGhkciAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgRWxmNjRfRXh0ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIFBUUikpOwotZXh0ZXJuIGxvbmcgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3dyaXRlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi0jZGVmaW5lIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBcCi0gIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBcCi0gIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0KLWJvb2xlYW4gX2JmZF9lbGYzMl9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgbG9uZykpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBsb25nKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBQVFIsCi0gICAgICAgICAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotCi1ib29sZWFuIF9iZmRfZWxmNjRfZ2Nfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRpbmhlcml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfcmVjb3JkX3Z0ZW50cnkKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLQotLyogTUlQUyBFTEYgc3BlY2lmaWMgcm91dGluZXMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYXNlY3Rpb24gKiBfYmZkX21pcHNfZWxmX2djX21hcmtfaG9vayAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2djX3N3ZWVwX2hvb2sgCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCAKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX21pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gaW50IF9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotLyogU0ggRUxGIHNwZWNpZmljIHJvdXRpbmUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfc2hfZWxmX3NldF9tYWNoX2Zyb21fZmxhZ3MgUEFSQU1TICgoYmZkICopKTsKLQotI2VuZGlmIC8qIF9MSUJFTEZfSF8gKi8KZGlmZiAtLWdpdCBhL2JmZC9lbGYtaHBwYS5oIGIvYmZkL2VsZi1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGRjNjQuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDY3ICswLDAgQEAKLS8qIENvbW1vbiBjb2RlIGZvciBQQSBFTEYgaW1wbGVtZW50YXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgRUxGX0hPV1RPX1RBQkxFX1NJWkUgICAgICAgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCArIDEKLQotLyogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IG11bHRpcGxlIFBBIEVMRiBCRkQgYmFja2VuZHMgd2l0aCBkaWZmZXJlbnQKLSAgIHNpemVzLgotCi0gICBNb3N0IG9mIHRoZSByb3V0aW5lcyBhcmUgd3JpdHRlbiB0byBiZSBzaXplIGluZGVwZW5kZW50LCBidXQgc29tZXRpbWVzCi0gICBleHRlcm5hbCBjb25zdHJhaW50cyByZXF1aXJlIDMyIG9yIDY0IGJpdCBzcGVjaWZpYyBjb2RlLiAgV2UgcmVtYXAKLSAgIHRoZSBkZWZpbml0aW9ucy9mdW5jdGlvbnMgYXMgbmVjZXNzYXJ5IGhlcmUuICAqLwotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBFTEZfUl9UWVBFKFgpICAgRUxGNjRfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRl9SX1NZTShYKSAgIEVMRjY0X1JfU1lNKFgpCi0jZGVmaW5lIGVsZl9ocHBhX2ludGVybmFsX3NoZHIgRWxmNjRfSW50ZXJuYWxfU2hkcgotI2RlZmluZSBfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmNjRfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2RlZmluZSBlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIGVsZjY0X2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmX2JmZF9maW5hbF9saW5rIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawotI2RlZmluZSBlbGZfaHBwYV9maW5hbF9saW5rIGVsZjY0X2hwcGFfZmluYWxfbGluawotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpICAgRUxGMzJfUl9TWU0oWCkKLSNkZWZpbmUgZWxmX2hwcGFfaW50ZXJuYWxfc2hkciBFbGYzMl9JbnRlcm5hbF9TaGRyCi0jZGVmaW5lIF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZGVmaW5lIGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZfYmZkX2ZpbmFsX2xpbmsgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGVsZl9ocHBhX2ZpbmFsX2xpbmsgZWxmMzJfaHBwYV9maW5hbF9saW5rCi0jZW5kaWYKLQotZWxmX2hwcGFfcmVsb2NfdHlwZSAqKiBfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBlbGZfaHBwYV9yZWxvY190eXBlLCBpbnQsIGludCwgaW50LCBhc3ltYm9sICopKTsKLQotc3RhdGljIHZvaWQgZWxmX2hwcGFfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyB2b2lkIGVsZl9ocHBhX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBlbGZfaHBwYV9pbnRlcm5hbF9zaGRyICosIGFzZWN0aW9uICopKTsKLQotI2lmIEFSQ0hfU0laRSA9PSA2NAotc3RhdGljIHZvaWQgZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgdm9pZCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0gICAgICAgICAgIGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLSAgICAgICAgICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWxmX2hwcGFfcmVsb2NhdGVfaW5zbgotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci0jZW5kaWYKLQotCi0vKiBFTEYvUEEgcmVsb2NhdGlvbiBob3d0byBlbnRyaWVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX0hPV1RPX1RBQkxFX1NJWkVdID0KLXsKLSAgeyBSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIC8qIFRoZSB2YWx1ZXMgaW4gRElSMzIgYXJlIHRvIHBsYWNhdGUgdGhlIGNoZWNrIGluCi0gICAgIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgeyBSX1BBUklTQ19ESVIzMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIzMiIsIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RJUjIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIyMUwiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19ESVIxN1IsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTdSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRElSMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE3RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRElSMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0UiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDMyLCAwLCAwLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwzMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfUENSRUwyMUwsIDAsIDAsIDIxLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BDUkVMMTdSLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDE3RiwgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTdGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUENSRUwxN0MsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3QyIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BDUkVMMTRSLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDE0RiwgMCwgMCwgMTQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RQUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMjFMIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNFdSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19EUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0RFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RQUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRFBSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNEYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRExUUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfRExUUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0UiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RMVFJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNEYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRExUSU5EMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RMVElORDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19ETFRJTkQxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTRGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19TRVRCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VUQkFTRSIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1NFQ1JFTDMyLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VDUkVMMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19CQVNFUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwyMUwiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19CQVNFUkVMMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19CQVNFUkVMMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN0YiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0JBU0VSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0UiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0JBU0VSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1NFR0JBU0UsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUdCQVNFIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfU0VHUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUdSRUwzMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfUExUT0ZGMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMjFMIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUExUT0ZGMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTRSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUExUT0ZGMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTRGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9GUFRSMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfTFRPRkZfRlBUUjE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0ZQVFI2NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BMQUJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUExBQkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfUExBQkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDE0UiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUENSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDIyQywgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMjJDIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUENSRUwyMkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIyRiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BDUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRXUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BDUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTREUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BDUkVMMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNkYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE2V0YiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QQ1JFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE2REYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX0RJUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19OT05FIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRElSMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0V1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19ESVIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTREUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RJUjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE2RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RJUjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNldGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRElSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE2REYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19HUFJFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUw2NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0RMVFJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNFdSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRExUUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0RFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19HUFJFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfR1BSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUwxNldGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfR1BSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUwxNkRGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfTFRPRkY2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfRExUSU5EMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0V1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX0RMVElORDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNERSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfTFRPRkYxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGMTZERiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGMTZERiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19CQVNFUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JTRVJFTDE0V1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19CQVNFUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNERSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1NFR1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHUkVMNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUExUT0ZGMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0V1IiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19QTFRPRkYxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTREUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BMVE9GRjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1BMVE9GRjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNldGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfUExUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2REYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9GUFRSMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19DT1BZLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQ09QWSIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0lQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19JUExUIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19FUExULCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRVBMVCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19UUFJFTDMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVFBSRUwyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19UUFJFTDIxTCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVFBSRUwxNFIiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfVFAyMUwiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9UUDE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19MVE9GRl9UUDE0RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRGIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0KLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotICAgIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRXUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotCi0gIHsgUl9QQVJJU0NfVFBSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUwxNERSIiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVFBSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDE2RiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0gICAgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTZXRiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX1RQUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1RQUkVMMTZERiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlIH0sCi0gIHsgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLSAgeyBSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRXUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTREUiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLSAgICBOVUxMLCAiUl9QQVJJU0NfTFRPRkZfVFAxNkYiLCBmYWxzZSwgMCwgMCwgZmFsc2UgfSwKLQotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZXRiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotICB7IFJfUEFSSVNDX0xUT0ZGX1RQMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZERiIsIGZhbHNlLCAwLCAwLCBmYWxzZSB9LAotfTsKLQotI2RlZmluZSBPRkZTRVRfMTRSX0ZST01fMjFMIDQKLSNkZWZpbmUgT0ZGU0VUXzE0Rl9GUk9NXzIxTCA1Ci0KLS8qIFJldHVybiBvbmUgKG9yIG1vcmUpIEJGRCByZWxvY2F0aW9ucyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhc2UKLSAgIHJlbG9jYXRpb24gd2l0aCBtb2RpZmljYXRpb25zIGJhc2VkIG9uIGZvcm1hdCBhbmQgZmllbGQuICAqLwotCi1lbGZfaHBwYV9yZWxvY190eXBlICoqCi1fYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIChhYmZkLCBiYXNlX3R5cGUsIGZvcm1hdCwgZmllbGQsIGlnbm9yZSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVsZl9ocHBhX3JlbG9jX3R5cGUgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBpbnQgZmllbGQ7Ci0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGVsZl9ocHBhX3JlbG9jX3R5cGUgKmZpbmFsdHlwZTsKLSAgZWxmX2hwcGFfcmVsb2NfdHlwZSAqKmZpbmFsX3R5cGVzOwotCi0gIC8qIEFsbG9jYXRlIHNsb3RzIGZvciB0aGUgQkZEIHJlbG9jYXRpb24uICAqLwotICBmaW5hbF90eXBlcyA9ICgoZWxmX2hwcGFfcmVsb2NfdHlwZSAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlICopICogMikpOwotICBpZiAoZmluYWxfdHlwZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jYXRpb24gaXRzZWxmLiAgKi8KLSAgZmluYWx0eXBlID0gKChlbGZfaHBwYV9yZWxvY190eXBlICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlKSkpOwotICBpZiAoZmluYWx0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgZmluYWxfdHlwZXNbMF0gPSBmaW5hbHR5cGU7Ci0gIGZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQotI2RlZmluZSBmaW5hbF90eXBlIGZpbmFsdHlwZVswXQotCi0gIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0KLSAgLyogSnVzdCBhIHRhbmdsZSBvZiBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMgdG8gZGVhbCB3aXRoIHRoZSBicmFpbmRhbWFnZQotICAgICB0aGF0IGEgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9yIG1lYW5zIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcmVsb2NhdGlvbgotICAgICBmb3IgUEEgRUxGLiAgKi8KLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIC8qIFdlIGhhdmUgYmVlbiB1c2luZyBnZW5lcmljIHJlbG9jYXRpb24gdHlwZXMuICBIb3dldmVyLCB0aGF0IG1heSBub3QKLSAgICAgICByZWFsbHkgbWFrZSBzZW5zZS4gIEFueXdheSwgd2UgbmVlZCB0byBzdXBwb3J0IGJvdGggUl9QQVJJU0NfRElSNjQKLSAgICAgICBhbmQgUl9QQVJJU0NfRElSMzIgaGVyZS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3J0c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRJTkQxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ydHBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE3OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVElORDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2x0cHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2xwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAzMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjMyOwotCSAgICAgIC8qIFdoZW4gaW4gNjRiaXQgbW9kZSwgYSAzMmJpdCByZWxvY2F0aW9uIGlzIHN1cHBvc2VkIHRvCi0JCSBiZSBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gIER3YXJmMiAoZm9yIGV4YW1wbGUpCi0JCSB1c2VzIDMyYml0IHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MgIT0gMzIpCi0JICAgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfU0VDUkVMMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwzMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDY0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19GUFRSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlICsgT0ZGU0VUXzE0Ul9GUk9NXzIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IGJhc2VfdHlwZSArIE9GRlNFVF8xNEZfRlJPTV8yMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjJGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjE6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfU0VHUkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19TRUdCQVNFOgotICAgICAgLyogVGhlIGRlZmF1bHRzIGFyZSBmaW5lIGZvciB0aGVzZSBjYXNlcy4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3R5cGVzOwotfQotCi0vKiBUcmFuc2xhdGUgZnJvbSBhbiBlbGYgaW50byBmaWVsZCBpbnRvIGEgaG93dG8gcmVsb2NhdGlvbiBwb2ludGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jOwotewotICBCRkRfQVNTRVJUIChFTEZfUl9UWVBFKGVsZl9yZWxvYy0+cl9pbmZvKQotCSAgICAgIDwgKHVuc2lnbmVkIGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCk7Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pXTsKLX0KLQotLyogVHJhbnNsYXRlIGZyb20gYW4gZWxmIGludG8gZmllbGQgaW50byBhIGhvd3RvIHJlbG9jYXRpb24gcG9pbnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGX1JfVFlQRShlbGZfcmVsb2MtPnJfaW5mbykKLQkgICAgICA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOwotICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKV07Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaG93dG8gdGFibGUgZW50cnkgdG8gcGVyZm9ybSB0aGUgQ09ERQotICAgcmVsb2NhdGlvbiBmb3IgYW4gQVJDSCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIGVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdLnR5cGUgPT0gKGludCkgY29kZSk7Ci0gICAgICByZXR1cm4gJmVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIFNZTSByZXByZXNlbnRzIGEgbG9jYWwgbGFiZWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBlbGZfaHBwYV9pbnRlcm5hbF9zaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuUEFSSVNDLnVud2luZCIpID09IDApCi0gICAgewotICAgICAgaW50IGluZHg7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotI2lmIEFSQ0hfU0laRSA9PSA2NAotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0xPUFJPQyArIDE7Ci0jZWxzZQotICAgICAgaGRyLT5zaF90eXBlID0gMTsKLSNlbmRpZgotICAgICAgLyogPyE/IEhvdyBhcmUgdW53aW5kcyBzdXBwb3NlZCB0byB3b3JrIGZvciBzeW1ib2xzIGluIGFyYml0cmFyeQotCSBzZWN0aW9ucz8gIE9yIHdoYXQgaWYgd2UgaGF2ZSBtdWx0aXBsZSAudGV4dCBzZWN0aW9ucyBpbiBhIHNpbmdsZQotCSAubyBmaWxlPyAgSFAgcmVhbGx5IG1lc3NlZCB1cCBvbiB0aGlzIG9uZS4KLQotCSBVZ2guICBXZSBjYW4gbm90IHVzZSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeCBhdCB0aGlzCi0JIHBvaW50IGJlY2F1c2UgaXQgaXMgbm90IGluaXRpYWxpemVkIHlldC4KLQotCSBTbyB3ZSAoZ2FzcCkgcmVjb21wdXRlIGl0IGhlcmUuICBIb3BlZnVsbHkgbm9ib2R5IGV2ZXIgY2hhbmdlcyB0aGUKLQkgd2F5IHNlY3Rpb25zIGFyZSBudW1iZXJlZCBpbiBlbGYuYyEgICovCi0gICAgICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zLCBpbmR4ID0gMTsgc2VjOyBzZWMgPSBzZWMtPm5leHQsIGluZHgrKykKLQl7Ci0JICBpZiAoc2VjLT5uYW1lICYmIHN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaGRyLT5zaF9pbmZvID0gaW5keDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSSBoYXZlIG5vIGlkZWEgaWYgdGhpcyBpcyByZWFsbHkgbmVjZXNzYXJ5IG9yIHdoYXQgaXQgbWVhbnMuICAqLwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci1zdGF0aWMgdm9pZAotZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICBpbnQgbWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfihFRl9QQVJJU0NfQVJDSCB8IEVGX1BBUklTQ19UUkFQTklMCi0JCQkJICAgICB8IEVGX1BBUklTQ19FWFQgfCBFRl9QQVJJU0NfTFNCCi0JCQkJICAgICB8IEVGX1BBUklTQ19XSURFIHwgRUZfUEFSSVNDX05PX0tBQlAKLQkJCQkgICAgIHwgRUZfUEFSSVNDX0xBWllTV0FQKTsKLQotICBpZiAobWFjaCA9PSAxMCkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMDsKLSAgZWxzZSBpZiAobWFjaCA9PSAxMSkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMTsKLSAgZWxzZSBpZiAobWFjaCA9PSAyMCkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzJfMDsKLSAgZWxzZSBpZiAobWFjaCA9PSAyNSkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSAoRUZfUEFSSVNDX1dJREUKLQkJCQkgICAgICB8IEVGQV9QQVJJU0NfMl8wCi0JCQkJICAgICAgLyogVGhlIEdOVSB0b29scyBoYXZlIHRyYXBwZWQgd2l0aG91dAotCQkJCQkgb3B0aW9uIHNpbmNlIDE5OTMsIHNvIG5lZWQgdG8gdGFrZQotCQkJCQkgYSBzdGVwIGJhY2t3YXJkcyB3aXRoIHRoZSBFTEYKLQkJCQkJIGJhc2VkIHRvb2xjaGFpbnMuICAqLwotCQkJCSAgICAgIHwgRUZfUEFSSVNDX1RSQVBOSUwpOwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgSFAncyBsaWJyYXJpZXMgZGVmaW5lIHN5bWJvbHMgd2l0aCBIUCBzcGVjaWZpYyBzZWN0aW9uCi0gICBpbmRpY2VzLCB3aGljaCB3ZSBoYXZlIHRvIGhhbmRsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaW50IGluZGV4ID0gc3ltLT5zdF9zaG5keDsKLQotICBzd2l0Y2ggKGluZGV4KQotICAgIHsKLSAgICBjYXNlIFNITl9QQVJJU0NfQU5TSV9DT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5QQVJJU0MuYW5zaS5jb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fUEFSSVNDX0hVR0VfQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuUEFSSVNDLmh1Z2UuY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV91bm1hcmtfdXNlbGVzc19keW5hbWljX3N5bWJvbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKilkYXRhOwotCi0gIC8qIElmIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgc3ltYm9sIGlzCi0gICAgIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgbGlicmFyeSBidXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHRoZW4KLSAgICAgdGhlIGdlbmVyaWMgY29kZSB3aWxsIHdhcm4gdGhhdCBpdCBpcyB1bmRlZmluZWQuCi0KLSAgICAgVGhpcyBiZWhhdmlvciBpcyB1bmRlc2lyYWJsZSBvbiBIUHMgc2luY2UgdGhlIHN0YW5kYXJkIHNoYXJlZAotICAgICBsaWJyYXJpZXMgY29udGFpbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIHR3aWRkbGUgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBzdWNoIHN5bWJvbHMgc28gdGhhdCB0aGV5Ci0gICAgIHdpbGwgbm90IHRyaWdnZXIgdGhlIHdhcm5pbmcuICA/IT8gRklYTUUuICBUaGlzIGlzIGhvcnJpYmx5IGZyYWdpbGUuCi0KLSAgICAgVWx0aW1hdGVseSB3ZSBzaG91bGQgaGF2ZSBiZXR0ZXIgY29udHJvbHMgb3ZlciB0aGUgZ2VuZXJpYyBFTEYgQkZECi0gICAgIGxpbmtlciBjb2RlLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChpbmZvLT5zaGFyZWQKLQkgICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gMHg4MDAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopZGF0YTsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIHN5bWJvbCBpcwotICAgICByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIGxpYnJhcnkgYnV0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCB0aGVuCi0gICAgIHRoZSBnZW5lcmljIGNvZGUgd2lsbCB3YXJuIHRoYXQgaXQgaXMgdW5kZWZpbmVkLgotCi0gICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kZXNpcmFibGUgb24gSFBzIHNpbmNlIHRoZSBzdGFuZGFyZCBzaGFyZWQKLSAgICAgbGlicmFyaWVzIGNvbnRhaW4gcmVlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIHR3aWRkbGUgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBzdWNoIHN5bWJvbHMgc28gdGhhdCB0aGV5Ci0gICAgIHdpbGwgbm90IHRyaWdnZXIgdGhlIHdhcm5pbmcuICA/IT8gRklYTUUuICBUaGlzIGlzIGhvcnJpYmx5IGZyYWdpbGUuCi0KLSAgICAgVWx0aW1hdGVseSB3ZSBzaG91bGQgaGF2ZSBiZXR0ZXIgY29udHJvbHMgb3ZlciB0aGUgZ2VuZXJpYyBFTEYgQkZECi0gICAgIGxpbmtlciBjb2RlLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChpbmZvLT5zaGFyZWQKLQkgICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgMHg4MDAwKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfjB4ODAwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCB0aGUgbG93ZXN0IGFkZHJlc3MgZm9yIHRoZSBkYXRhIGFuZCB0ZXh0IHNlZ21lbnRzLiAgKi8KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycyAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICpocHBhX2luZm87Ci0gIGJmZF92bWEgdmFsdWU7Ci0gCi0gIGhwcGFfaW5mbyA9IChzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKilkYXRhOwotCi0gIHZhbHVlID0gc2VjdGlvbi0+dm1hIC0gc2VjdGlvbi0+ZmlsZXBvczsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZKQotICAgICAgID09IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSkpCi0gICAgICAmJiB2YWx1ZSA8IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UpCi0gICAgaHBwYV9pbmZvLT50ZXh0X3NlZ21lbnRfYmFzZSA9IHZhbHVlOwotICBlbHNlIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkpCi0gICAgICAgPT0gKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkKLSAgICAgICYmIHZhbHVlIDwgaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZSkKLSAgICBocHBhX2luZm8tPmRhdGFfc2VnbWVudF9iYXNlID0gdmFsdWU7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy9zZWN0aW9ucywgYnV0IGJlZm9yZQotICAgZmluYWwgc3ltYm9sIHJlc29sdXRpb24gYW5kIHNlY3Rpb24gcGxhY2VtZW50IGhhcyBiZWVuIGRldGVybWluZWQuCi0KLSAgIFdlIHVzZSB0aGlzIGhvb2sgdG8gKHBvc3NpYmx5KSBwcm92aWRlIGEgdmFsdWUgZm9yIF9fZ3AsIHRoZW4gd2UKLSAgIGZhbGwgYmFjayB0byB0aGUgZ2VuZXJpYyBFTEYgZmluYWwgbGluayByb3V0aW5lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gcmV0dmFsOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ3A7Ci0gICAgICBiZmRfdm1hIGdwX3ZhbDsKLSAgICAgIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotCi0gICAgICBocHBhX2luZm8gPSBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pOwotCi0gICAgICAvKiBUaGUgbGlua2VyIHNjcmlwdCBkZWZpbmVzIGEgdmFsdWUgZm9yIF9fZ3AgaWZmIGl0IHdhcyByZWZlcmVuY2VkCi0JIGJ5IG9uZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQuICBGaXJzdCB0cnkgdG8gZmluZCB0aGUgc3ltYm9sCi0JIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhhdCBmYWlscywganVzdCBjb21wdXRlIHRoZSB2YWx1ZSBfX2dwCi0JIHNob3VsZCBoYXZlIGhhZC4gICovCi0gICAgICBncCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICJfX2dwIiwgZmFsc2UsCi0JCQkJIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChncCkKLQl7Ci0KLQkgIC8qIEFkanVzdCB0aGUgdmFsdWUgb2YgX19ncCBhcyB3ZSBtYXkgd2FudCB0byBzbGlkZSBpdCBpbnRvIHRoZQotCSAgICAgLnBsdCBzZWN0aW9uIHNvIHRoYXQgdGhlIHN0dWJzIGNhbiBhY2Nlc3MgUExUIGVudHJpZXMgd2l0aG91dAotCSAgICAgdXNpbmcgYW4gYWRkaWwgc2VxdWVuY2UuICAqLwotCSAgZ3AtPnJvb3QudS5kZWYudmFsdWUgKz0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z3Bfb2Zmc2V0OwotCi0JICBncF92YWwgPSAoZ3AtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBncC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGdwLT5yb290LnUuZGVmLnZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLSAgCi0KLQkgIC8qIEZpcnN0IGxvb2sgZm9yIGEgLnBsdCBzZWN0aW9uLiAgSWYgZm91bmQsIHRoZW4gX19ncCBpcyB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIC5wbHQgKyBncF9vZmZzZXQuCi0KLQkgICAgIElmIG5vIC5wbHQgaXMgZm91bmQsIHRoZW4gbG9vayBmb3IgLmRsdCwgLm9wZCBhbmQgLmRhdGEgKGluCi0JICAgICB0aGF0IG9yZGVyKSBhbmQgc2V0IF9fZ3AgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB3aGljaGV2ZXIgc2VjdGlvbgotCSAgICBpcyBmb3VuZCBmaXJzdC4gICovCi0KLQkgIHNlYyA9IGhwcGFfaW5mby0+cGx0X3NlYzsKLQkgIGlmIChzZWMpCi0JICAgIGdwX3ZhbCA9IChzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBocHBhX2luZm8tPmdwX29mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBocHBhX2luZm8tPmRsdF9zZWM7Ci0JICAgICAgaWYgKCFzZWMpCi0JCXNlYyA9IGhwcGFfaW5mby0+b3BkX3NlYzsKLQkgICAgICBpZiAoIXNlYykKLQkJc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGF0YSIpOwotCSAgICAgIGlmICghc2VjKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBncF92YWwgPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluc3RhbGwgd2hhdGV2ZXIgdmFsdWUgd2UgZm91bmQvY29tcHV0ZWQgZm9yIF9fZ3AuICAqLwotICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8ga25vdyB0aGUgYmFzZSBvZiB0aGUgdGV4dCBhbmQgZGF0YSBzZWdtZW50cyBzbyB0aGF0IHdlCi0gICAgIGNhbiBwZXJmb3JtIFNFR1JFTCByZWxvY2F0aW9ucy4gIFdlIHdpbGwgcmVjb3JlIHRoZSBiYXNlIGFkZHJlc3NlcwotICAgICB3aGVuIHdlIGVuY291bnRlciB0aGUgZmlyc3QgU0VHUkVMIHJlbG9jYXRpb24uICAqLwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT50ZXh0X3NlZ21lbnRfYmFzZSA9IChiZmRfdm1hKS0xOwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5kYXRhX3NlZ21lbnRfYmFzZSA9IChiZmRfdm1hKS0xOwotCi0gIC8qIEhQJ3Mgc2hhcmVkIGxpYnJhcmllcyBoYXZlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyB0aGF0IGFyZSBub3QKLSAgICAgZGVmaW5lZCBhbnl3aGVyZS4gIFRoZSBnZW5lcmljIEVMRiBCRkQgbGlua2VyIGNvZGUgd2lsbCBjb21wbGFpbQotICAgICBhYm91dCBzdWNoIHN5bWJvbHMuCi0KLSAgICAgU28gd2UgZGV0ZWN0IHRoZSBsb3NpbmcgY2FzZSBhbmQgYXJyYW5nZSBmb3IgdGhlIGZsYWdzIG9uIHRoZSBzeW1ib2wKLSAgICAgdG8gaW5kaWNhdGUgdGhhdCBpdCB3YXMgbmV2ZXIgcmVmZXJlbmNlZC4gIFRoaXMga2VlcHMgdGhlIGdlbmVyaWMKLSAgICAgRUxGIEJGRCBsaW5rIGNvZGUgaGFwcHkgYW5kIGFwcGVhcnMgdG8gbm90IGNyZWF0ZSBhbnkgc2Vjb25kYXJ5Ci0gICAgIHByb2JsZW1zLiAgVWx0aW1hdGVseSB3ZSBuZWVkIGEgd2F5IHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZQotICAgICBnZW5lcmljIEVMRiBCRkQgbGluayBjb2RlIGJldHRlci4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2hwcGFfdW5tYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzLAotCQkJICBpbmZvKTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHZhbCA9IGJmZF9lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzLAotCQkJICBpbmZvKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBIUFBBIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSBlbGZfaHBwYV9ob3d0b190YWJsZSArIEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgIGNoYXIgKmR5bl9uYW1lOwotICAgICAgY2hhciAqZHluaF9idWYgPSBOVUxMOwotICAgICAgc2l6ZV90IGR5bmhfYnVmbGVuID0gMDsKLSAgICAgIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICpkeW5faCA9IE5VTEw7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKQotCQkJICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkgICAgIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICBkeW5fbmFtZSA9IGdldF9keW5fbmFtZSAoaW5wdXRfYmZkLCBoLCByZWwsCi0JCQkJICAgJmR5bmhfYnVmLCAmZHluaF9idWZsZW4pOwotCSAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCSAgICAgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgbm90IGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGxvbmcgaW5keDsKLQotCSAgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc3ltX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkJIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICAgICAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICAgICAmZHluaF9idWYsICZkeW5oX2J1Zmxlbik7Ci0JICAgICAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCQkgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgLyogSWYgd2UgaGF2ZSBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQkJIHNoYXJlZCBsaWJyYXJ5IGFuZCB3ZSBoYXZlIG5vdCBjcmVhdGVkIGFuIGVudHJ5IGluIHRoZQotCQkgUEE2NCBkeW5hbWljIHN5bWJvbCBoYXNoIHRhYmxlIGZvciBpdCwgdGhlbiB3ZSBsb3NlLiAgKi8KLQkgICAgICBpZiAoc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCAmJiBkeW5faCA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbikKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgLyogVmFsdWUgd2lsbCBiZSBwcm92aWRlZCB2aWEgb25lIG9mIHRoZSBvZmZzZXRzIGluIHRoZQotCQkgZHluX2ggaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgLyogQWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMgaW4gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gICAgICAgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5ub191bmRlZmluZWQKLQkJICAgJiYgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSA9PSBTVFZfREVGQVVMVCkKLQkgICAgewotCSAgICAgIGlmIChpbmZvLT5zeW1ib2xpYykKLQkJKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgZmFsc2UpOwotCi0JICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBQQTY0IGR5bmFtaWMgaGFzaAotCQkgdGFibGUsIHRoZW4gZ2V0IGl0LiAgKi8KLQkgICAgICBkeW5fbmFtZSA9IGdldF9keW5fbmFtZSAoaW5wdXRfYmZkLCBoLCByZWwsCi0JCQkJICAgICAgICZkeW5oX2J1ZiwgJmR5bmhfYnVmbGVuKTsKLQkgICAgICBkeW5faCA9IGVsZjY0X2hwcGFfZHluX2hhc2hfbG9va3VwICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQkJCSAgZHluX25hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBpZiAoZHluX2ggPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0Jc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIHN5bS0+c3RfbmFtZSk7Ci0JICBpZiAoc3ltX25hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCpzeW1fbmFtZSA9PSAnXDAnKQotCSAgICBzeW1fbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc3ltX3NlYyk7Ci0JfQotCi0gICAgICByID0gZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSAocmVsLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQlyZWxvY2F0aW9uLCBpbmZvLCBzeW1fc2VjLAotCQkJCQloLCBkeW5faCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQlpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgIChpbmZvLCBzeW1fbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvbXB1dGUgdGhlIHZhbHVlIGZvciBhIHJlbG9jYXRpb24gKFJFTCkgZHVyaW5nIGEgZmluYWwgbGluayBzdGFnZSwKLSAgIHRoZW4gaW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgbG9jYXRpb24gaW4gQ09OVEVOVFMuIAotCi0gICBWQUxVRSBpcyBhIHRlbnRhdGl2ZSB2YWx1ZSBmb3IgdGhlIHJlbG9jYXRpb24gYW5kIG1heSBiZSBvdmVycmlkZGVuCi0gICBhbmQgbW9kaWZpZWQgaGVyZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWMgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0KLSAgIEZvciBleGFtcGxlIHdlIGRvIGNvbnZlcnNpb25zIGZvciBQQy1yZWxhdGl2ZSBicmFuY2hlcyBpbiB0aGlzIHJvdXRpbmUKLSAgIG9yIHJlZGlyZWN0aW9uIG9mIGNhbGxzIHRvIGV4dGVybmFsIHJvdXRpbmVzIHRvIHN0dWJzLiAKLQotICAgVGhlIHdvcmsgb2YgYWN0dWFsbHkgYXBwbHlpbmcgdGhlIHJlbG9jYXRpb24gaXMgbGVmdCB0byBhIGhlbHBlcgotICAgcm91dGluZSBpbiBhbiBhdHRlbXB0IHRvIHJlZHVjZSB0aGUgY29tcGxleGl0eSBhbmQgc2l6ZSBvZiB0aGlzCi0gICBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKHJlbCwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHZhbHVlLAotCQkJICAgICAgaW5mbywgc3ltX3NlYywgaCwgZHluX2gpCi0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICpkeW5faDsKLXsKLSAgdW5zaWduZWQgaW50IGluc247Ci0gIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgYmZkX3ZtYSBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IGVsZl9ocHBhX2hvd3RvX3RhYmxlICsgRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICB1bnNpZ25lZCBpbnQgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEFSSVNDX05PTkU6Ci0gICAgICBicmVhazsKLQotICAgIC8qIEJhc2ljIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSBpZiBQQ1JFTDE0RiBpcwotICAgICAgIGFjdHVhbGx5IG5lZWRlZCBvciBldmVuIGhhbmRsZWQgY29ycmVjdGx5LgotCi0gICAgICAgTm90ZSBmb3IgYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIGR5bmFtaWMgbGlicmFyeQotICAgICAgIHdlIHdhbnQgdG8gcmVkaXJlY3QgdGhlIGNhbGwgdG8gYSBzdHViLiAgKi8KLQotICAgIC8qIFJhbmRvbSBQQyByZWxhdGl2ZSByZWxvY3MuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2REY6Ci0gICAgICB7Ci0JLyogSWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYwotCSAgIGxpYnJhcnksIHRoZW4gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIGxvY2FsIHN0dWIgZm9yIHRoaXMKLQkgICBmdW5jdGlvbi4gICovCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCB8fCBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgdmFsdWUgPSAoZHluX2gtPnN0dWJfb2Zmc2V0ICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X29mZnNldAotCQkgICArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JLyogQWRqdXN0IGZvciBhbnkgZmllbGQgc2VsZWN0b3JzLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMjFMKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIC04ICsgYWRkZW5kLCBlX2xzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE0RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIC04ICsgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCAtOCArIGFkZGVuZCwgZV9yc2VsKTsKLQotCS8qIEFwcGx5IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIyRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMkM6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotICAgICAgewotCS8qIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIGR5bmFtaWMKLQkgICBsaWJyYXJ5LCB0aGVuIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBsb2NhbCBzdHViIGZvciB0aGlzCi0JICAgZnVuY3Rpb24uICAqLwotCWlmIChzeW1fc2VjID09IE5VTEwgfHwgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgIHZhbHVlID0gKGR5bl9oLT5zdHViX29mZnNldCArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgCi0JLyogVHVybiBWQUxVRSBpbnRvIGEgcHJvcGVyIFBDIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IChvZmZzZXQgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCS8qIEFkanVzdCBmb3IgYW55IGZpZWxkIHNlbGVjdG9ycy4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3UikKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCAtOCArIGFkZGVuZCwgZV9yc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgLTggKyBhZGRlbmQsIGVfZnNlbCk7Ci0KLQkvKiBBbGwgYnJhbmNoZXMgYXJlIGltcGxpY2l0bHkgc2hpZnRlZCBieSAyIHBsYWNlcy4gICovCi0JdmFsdWUgPj49IDI7Ci0KLQkvKiBBcHBseSB0aGUgcmVsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEluZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGF0YSB0aHJvdWdoIHRoZSBETFQuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogSWYgdGhpcyByZWxvY2F0aW9uIHdhcyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIHN0aWxsCi0JICAgaGF2ZSBub3Qgc2V0IHVwIHRoZSBETFQgZW50cnkgKGl0J3Mgbm90IGNvbnZpZW5lbnQgdG8gZG8gc28KLQkgICBpbiB0aGUgImZpbmFsaXplX2RsdCIgcm91dGluZSBiZWNhdXNlIGl0IGlzIGRpZmZpY3VsdCB0byBnZXQKLQkgICB0byB0aGUgbG9jYWwgc3ltYm9sJ3MgdmFsdWUpLgotCi0JICAgU28sIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgKGggPT0gTlVMTCksIHRoZW4gd2UgbmVlZCB0bwotCSAgIGZpbGwgaW4gaXRzIERMVCBlbnRyeS4gCi0KLQkgICBTaW1pbGFybHkgd2UgbWF5IHN0aWxsIG5lZWQgdG8gc2V0IHVwIGFuIGVudHJ5IGluIC5vcGQgZm9yCi0JICAgYSBsb2NhbCBmdW5jdGlvbiB3aGljaCBoYWQgaXRzIGFkZHJlc3MgdGFrZW4uICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPmRsdF9zZWMtPm93bmVyLAotCQkJdmFsdWUsCi0JCQlocHBhX2luZm8tPmRsdF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPmRsdF9vZmZzZXQpOwotCi0JICAgIC8qIE5vdyBoYW5kbGUgLm9wZCBjcmVhdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICBpZiAocl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSCi0JCXx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGKQotCSAgICAgIHsKLQkJLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkJbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsCi0JCQkwLCAxNik7Ci0KLQkJLyogVGhlIG5leHQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCQkvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkJdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkJICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQl2YWx1ZSA9IChkeW5faC0+ZGx0X29mZnNldAotCQkgKyBocHBhX2luZm8tPmRsdF9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQl2YWx1ZSAtPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0KLQkvKiBBbGwgRExUSU5EIHJlbG9jYXRpb25zIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXQgdGhpcyBwb2ludCwKLQkgICBleGNlcHQgdGhhdCB3ZSBuZWVkIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvcnMgZm9yIHRoZSAyMWJpdAotCSAgIHZlcnNpb24gdnMgdGhlIDE0Yml0IHZlcnNpb25zLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX0RMVElORDIxTAotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUSU5EMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2REYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRjE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGMTZERgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX1RQMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9mc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX3Jyc2VsKTsKLQotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19HUFJFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZERjoKLSAgICAgIHsKLQkvKiBTdWJ0cmFjdCBvdXQgdGhlIGdsb2JhbCBwb2ludGVyIHZhbHVlIHRvIG1ha2UgdmFsdWUgYSBETFQKLQkgICByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQl2YWx1ZSAtPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0KLQkvKiBBbGwgRExUUkVMIHJlbG9jYXRpb25zIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXQgdGhpcyBwb2ludCwKLQkgICBleGNlcHQgdGhhdCB3ZSBuZWVkIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvcnMgZm9yIHRoZSAyMWJpdAotCSAgIHZlcnNpb24gdnMgdGhlIDE0Yml0IHZlcnNpb25zLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX0RMVFJFTDIxTAotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfRFBSRUwyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUUkVMMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfRFBSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19HUFJFTDE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0dQUkVMMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0dQUkVMMTZERikKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfZnNlbCk7Ci0JZWxzZQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9ycnNlbCk7Ci0KLQlpbnNuID0gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgdmFsdWUsIHJfdHlwZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2REY6Ci0gICAgICB7Ci0JLyogQWxsIERJUiByZWxvY2F0aW9ucyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGF0IHRoaXMgcG9pbnQsCi0JICAgZXhjZXB0IHRoYXQgYnJhbmNoIG9mZnNldHMgbmVlZCB0byBiZSBkaXZpZGVkIGJ5IGZvdXIsIGFuZAotCSAgIHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycy4gIE5vdGUgdGhhdCB3ZSBkb24ndAotCSAgIHJlZGlyZWN0IGFic29sdXRlIGNhbGxzIHRvIGxvY2FsIHN0dWJzLiAgKi8KLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRElSMjFMKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9scnNlbCk7Ci0JZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX0RJUjE3RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0RJUjE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0RJUjE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9mc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX3Jyc2VsKTsKLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRElSMTdSIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxN0YpCi0JICB7Ci0JICAgIC8qIEFsbCBicmFuY2hlcyBhcmUgaW1wbGljaXRseSBzaGlmdGVkIGJ5IDIgcGxhY2VzLiAgKi8KLQkgICAgdmFsdWUgPj49IDI7Ci0JICB9Ci0KLQlpbnNuID0gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgdmFsdWUsIHJfdHlwZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIFBMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPnBsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5wbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+cGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCi0JLyogQWxsIFBMVE9GRiByZWxvY2F0aW9ucyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGF0IHRoaXMgcG9pbnQsCi0JICAgZXhjZXB0IHRoYXQgd2UgbmVlZCBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3JzIGZvciB0aGUgMjFiaXQKLQkgICB2ZXJzaW9uIHZzIHRoZSAxNGJpdCB2ZXJzaW9ucy4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTFRPRkYyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMVE9GRjE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMzI6Ci0gICAgICB7Ci0JLyogV2UgbWF5IHN0aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBGUFRSIGl0c2VsZiBpZiBpdCB3YXMgZm9yCi0JICAgYSBsb2NhbCBzeW1ib2wuICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSNjQ6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCAmJiByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjY0KQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUw2NDoKLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkY2NDoKLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLSAgICAgIHZhbHVlID0gKGR5bl9oLT5kbHRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwzMjoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotCS8qIFR1cm4gVkFMVUUgaW50byBhIHByb3BlciBQQyByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQl2YWx1ZSAtPSAob2Zmc2V0ICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0JdmFsdWUgLT0gODsKLQliZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUw2NDoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JdmFsdWUgKz0gYWRkZW5kOwotCXZhbHVlIC09IDg7Ci0JYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotCXJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICB9Ci0KLQotICAgIGNhc2UgUl9QQVJJU0NfRlBUUjY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkgICAgbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsIDAsIDE2KTsKLQotCSAgICAvKiBUaGUgbmV4dCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMKLQkJCSArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCSAgICAvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkgICAgdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkgICAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCWhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCArIDI0KTsKLQkgIH0KLQotCS8qIFdlIHdhbnQgdGhlIHZhbHVlIG9mIHRoZSBPUEQgb2Zmc2V0IGZvciB0aGlzIHN5bWJvbCwgbm90Ci0gICAgICAgICAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gICovCi0JdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+b3BkX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgIAotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19TRUNSRUwzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkJICAodmFsdWUgKyBhZGRlbmQKLQkJICAgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSwKLQkJICBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1BBUklTQ19TRUdSRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1NFR1JFTDY0OgotICAgICAgewotCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLCB0aGVuIGluaXRpYWxpemUKLQkgICB0aGUgc2VnbWVudCBiYXNlIHZhbHVlcy4gICovCi0JaWYgKGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPT0gKGJmZF92bWEpIC0xKQotCSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycywKLQkJCQkgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKSk7Ci0KLQkvKiBWQUxVRSBob2xkcyB0aGUgYWJzb2x1dGUgYWRkcmVzcy4gIFdlIHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgICBhZGRlbmQsIHRoZW4gdHVybiBpdCBpbnRvIGEgc2VnbWVudCByZWxhdGl2ZSBhZGRyZXNzLgotCi0JICAgVGhlIHNlZ21lbnQgaXMgZGVyaXZlZCBmcm9tIFNZTV9TRUMuICBXZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUKLQkgICBvbmx5IHR3byBzZWdtZW50cyBvZiBub3RlIGluIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS9zaGxpYi4KLQkgICBBIHJlYWRvbmx5IHNlZ21lbnQgKC50ZXh0KSBhbmQgYSByZWFkd3JpdGUgc2VnbWVudCAoLmRhdGEpLiAgKi8KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0KLQlpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgIHZhbHVlIC09IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2U7Ci0JZWxzZQotCSAgdmFsdWUgLT0gaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZTsKLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfU0VHUkVMMzIpCi0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JZWxzZQotCSAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotICAgICAgCi0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOLiAgVkFMVUUgc2hvdWxkIGJlIHRoZSBhY3R1YWwgdmFsdWUgd2Ugd2FudAotICAgdG8gaW5zZXJ0IGludG8gdGhlIGluc3RydWN0aW9uLCBpZSBieSB0aGlzIHBvaW50IHdlIHNob3VsZCBub3QgYmUKLSAgIGNvbmNlcm5lZCB3aXRoIGNvbXB1dGluZyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIERMVCwgUEMsIGV0Yy4KLSAgIEluc3RlYWQgdGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGhhbmRsZSB0aGUgYml0IG1hbmlwdWxhdGlvbnMgbmVlZGVkCi0gICB0byBpbnNlcnQgdGhlIHJlbG9jYXRpb24gaW50byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCBzeW1fdmFsdWUsIHJfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIHVuc2lnbmVkIGludCBzeW1fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci17Ci0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICAvKiBUaGlzIGlzIGFueSAyMmJpdCBicmFuY2guICBJbiBQQTIuMCBzeW50YXggaXQgY29ycmVzcG9uZHMgdG8KLSAgICAgICB0aGUgIkIiIGluc3RydWN0aW9uLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMkM6Ci0gICAgICByZXR1cm4gcmVfYXNzZW1ibGVfMjIgKGluc24gJiB+IDB4M2ZmMWZmZCwgc3ltX3ZhbHVlKTsKLQotICAgIC8qIFRoaXMgaXMgYW55IDE3Yml0IGJyYW5jaC4gIEluIFBBMi4wIHN5bnRheCBpdCBhbHNvIGNvcnJlc3BvbmRzIHRvCi0gICAgICAgdGhlICJCIiBpbnN0cnVjdGlvbiBhcyB3ZWxsIGFzIEJFLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICAgIHJldHVybiByZV9hc3NlbWJsZV8xNyAoaW5zbiAmIH4gMHgxZjFmZmQsIHN5bV92YWx1ZSk7Ci0KLSAgICAvKiBBRERJTCBvciBMRElMIGluc3RydWN0aW9ucy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgotICAgICAgcmV0dXJuIHJlX2Fzc2VtYmxlXzIxIChpbnNuICYgfiAweDFmZmZmZiwgc3ltX3ZhbHVlKTsKLQotICAgIC8qIExETyBhbmQgaW50ZWdlciBsb2Fkcy9zdG9yZXMgd2l0aCAxNGJpdCBkaXNwbGFjZW1lbnRzLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkY6Ci0gICAgICByZXR1cm4gKGluc24gJiB+IDB4M2ZmZikgfCBsb3dfc2lnbl91bmV4dCAoc3ltX3ZhbHVlLCAxNCk7Ci0KLSAgICAvKiBEb3VibGV3b3JkIGxvYWRzIGFuZCBzdG9yZXMgd2l0aCBhIDE0Yml0IGRpc3BsYWNlbWVudC4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19HUFJFTDE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkRGOgotICAgICAgcmV0dXJuIChpbnNuICYgfiAweDNmZjEpIHwgKCgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMykKLQkJCQkgIHwgKChzeW1fdmFsdWUgJiAweDFmZjgpIDw8IDEpKTsKLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IHNpbmdsZSB3b3JkIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgICByZXR1cm4gKGluc24gJiB+IDB4M2ZmOSkgfCAoKChzeW1fdmFsdWUgJiAweDIwMDApID4+IDEzKQotCQkJCSAgfCAoKHN5bV92YWx1ZSAmIDB4MWZmYykgPDwgMSkpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBpbnNuOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1tMTAyMDAuYyBiL2JmZC9lbGYtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Mzk2MzUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MjUgKzAsMCBAQAotLyogTWF0c3VzaGl0YSAxMDIwMCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZjMyX0V4dGVybmFsX1N5bSAqLCBiZmRfdm1hKSk7Ci0KLS8qIFdlIGhhdmUgdG8gdXNlIFJFTEEgaW5zdHJ1Y3Rpb25zIHNpbmNlIG1kX2FwcGx5X2ZpeDMgaW4gdGhlIGFzc2VtYmxlcgotICAgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuICAqLwotI2RlZmluZSBVU0VfUkVMQQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9NTjEwMjAwX05PTkUgPSAwLAotICBSX01OMTAyMDBfMzIsCi0gIFJfTU4xMDIwMF8xNiwKLSAgUl9NTjEwMjAwXzgsCi0gIFJfTU4xMDIwMF8yNCwKLSAgUl9NTjEwMjAwX1BDUkVMOCwKLSAgUl9NTjEwMjAwX1BDUkVMMTYsCi0gIFJfTU4xMDIwMF9QQ1JFTDI0LAotICBSX01OMTAyMDBfTUFYCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogRHVtbXkgcmVsb2NhdGlvbi4gIERvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfTk9ORSwKLQkgMCwKLQkgMiwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX05PTkUiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAzMiBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzMyLAotCSAwLAotCSAyLAotCSAzMiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAxNiBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMTYiLAotCSBmYWxzZSwKLQkgMHhmZmZmLAotCSAweGZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgOCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzgsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwXzgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFNpbXBsZSA4IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9QQ1JFTDgsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUw4IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIHRydWUpLAotICAvKiBTaW1wbGUgMTYgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX1BDUkVMMTYiLAotCSBmYWxzZSwKLQkgMHhmZmZmLAotCSAweGZmZmYsCi0JIHRydWUpLAotICAvKiBTaW1wbGUgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIDEgYnl0ZSBhZGp1c3RtZW50Ci0gICAgIHRvIGdldCB0aGUgcGMtcmVsYXRpdmUgb2Zmc2V0IGNvcnJlY3QuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX1BDUkVMMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSB0cnVlKSwKLX07Ci0KLXN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCBtbjEwMjAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMjAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAyMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAyMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDIwMF84LCB9LAotICB7IEJGRF9SRUxPQ18yNCwgUl9NTjEwMjAwXzI0LCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX01OMTAyMDBfUENSRUw4LCB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NTjEwMjAwX1BDUkVMMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzI0X1BDUkVMLCBSX01OMTAyMDBfUENSRUwyNCwgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtbjEwMjAwX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtbjEwMjAwX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbW4xMDIwMF9ob3d0b190YWJsZVttbjEwMjAwX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTU4xMDIwMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX01OMTAyMDBfTUFYKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbW4xMDIwMF9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgaXNfbG9jYWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSX01OMTAyMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF8xNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfODoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzI0OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSAmPSAweGZmZmZmZjsKLSAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmYwMDAwMDApOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMODoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMSk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDIpOwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMjQ6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDMpOwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwMDApCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotDAotLyogUmVsb2NhdGUgYW4gTU4xMDIwMCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAyMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHIgPSBtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMjAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAyMDA6Ci0KLQkqIGpzcjoyNCAtPiBqc3I6MTYgCQkJCQkgICAyIGJ5dGVzCi0KLQkqIGptcDoyNCAtPiBqbXA6MTYJCQkJCSAgIDIgYnl0ZXMKLQkqIGptcDoxNiAtPiBicmE6OAkJCQkJICAgMSBieXRlCi0KLQkJKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb25kaXRpb25hbCBicmFuY2gKLQkJYXJvdW5kIHRoZSBqdW1wL2JyYSwgd2UgbWF5IGJlIGFibGUgdG8gcmV2ZXJzZSBpdHMgY29uZGl0aW9uCi0JCWFuZCBjaGFuZ2UgaXRzIHRhcmdldCB0byB0aGUganVtcCdzIHRhcmdldC4gIFRoZSBqdW1wL2JyYQotCQljYW4gdGhlbiBiZSBkZWxldGVkLgkJCQkgICAyIGJ5dGVzCi0KLQkqIG1vdiBhYnMyNCAtPiBtb3YgYWJzMTYJMiBieXRlIHNhdmluZ3MKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTI0IGNhbiByZWxheCB0byBpbW0xNiAgMiBieXRlcwotCS0gTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTE2IGNhbiByZWxheCB0byBpbW04ICAgMSBieXRlCi0KLQkqIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMjQgY2FuIHJlbGF4IHRvIGQxNgkgICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIGJ5dGUKLQotCWFiczI0LCBpbW0yNCwgZDI0IGFsbCBsb29rIHRoZSBzYW1lIGF0IHRoZSByZWxvYyBsZXZlbC4gIEl0Ci0JbWlnaHQgbWFrZSB0aGUgY29kZSBzaW1wbGVyIGlmIHdlIGhhZCBkaWZmZXJlbnQgcmVsb2NzIGZvcgotCXRoZSB2YXJpb3VzIHJlbGF4YWJsZSBvcGVyYW5kIHR5cGVzLgotICAgCi0JV2UgZG9uJ3QgaGFuZGxlIGltbTE2LT5pbW04IG9yIGQxNi0+ZDggYXMgdGhleSdyZSB2ZXJ5IHJhcmUKLQlhbmQgc29tZXdoYXQgbW9yZSBkaWZmaWN1bHQgdG8gc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuIAotbW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX05PTkUKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfOAotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9NQVgpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQotCSAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBBbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAyNGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoL2NhbGwuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwyNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDMpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZmZmICsgMiBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgdHdvIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MDAxICYmIChsb25nKXZhbHVlID4gLTB4ODAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZTApCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhmYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhlMSkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAyMDBfUENSRUwxNik7Ci0KLQkgICAgICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlIG9mZnNldC4gICovCi0JICAgICAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCSAgICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggaW50byBhIDhiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMMTYpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSAoaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZiArIDEgYXMgdGhlIHRhcmdldCB3aWxsIGJlIG9uZSBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGZjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgYmZkX3B1dF84IChhYmZkLCAweGVhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAyMDBfUENSRUw4KTsKLQotCSAgICAgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAxKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gZWxpbWluYXRlIGFuIHVuY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoCi0JIHdoaWNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBjb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2ggYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotCSAgICBvcmlnaW5hbDoJCW5ldzoKLQkgICAgYkNDIGxhYjEJCWJDQycgbGFiMgotCSAgICBicmEgbGFiMgotCSAgIGxhYjE6CSAgICAgICBsYWIxOgotCi0KLQkgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGJDQyBjYW4ndCByZWFjaCBsYWIyIGF0IGFzc2VtYmx5IHRpbWUsCi0JIGJ1dCBkdWUgdG8gb3RoZXIgcmVsYXhhdGlvbnMgaXQgY2FuIHJlYWNoIGF0IGxpbmsgdGltZS4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKm5yZWw7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDEpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIERvIG5vdGhpbmcgaWYgdGhpcyByZWxvYyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChpcmVsLT5yX29mZnNldCA9PSBzZWMtPl9jb29rZWRfc2l6ZSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhbiB1bmNvbmRpdGlvbmFsIHBjLXJlbGF0aXZlCi0JICAgICBicmFuY2gsIG1vcmUgb2Z0ZW4gdGhhbiBub3QgdGhpcyB0ZXN0IHdpbGwgZmFpbCwgc28gd2UKLQkgICAgIHRlc3QgaXQgZmlyc3QgdG8gc3BlZWQgdGhpbmdzIHVwLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAxKTsKLQkgIGlmIChjb2RlICE9IDB4ZWEpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbHNvIG1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKLQkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgYSBwYy1yZWxhdGl2ZSA4IGJpdCBicmFuY2guICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgMiAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX01OMTAyMDBfUENSRUw4KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTWFrZSBzdXJlIG91ciBkZXN0aW5hdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZQotCSAgICAgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKHN5bXZhbCAhPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBpcmVsLT5yX29mZnNldCArIDMpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm93IG1ha2Ugc3VyZSB3ZSBhcmUgYSBjb25kaXRpb25hbCBicmFuY2guICBUaGlzIG1heSBub3QKLQkgICAgIGJlIG5lY2Vzc2FyeSwgYnV0IHdoeSB0YWtlIHRoZSBjaGFuY2UuIAotCi0JICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAyMDBfUENSRUw4IHJlbG9jcwotCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKLQkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgotCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlMCAmJiBjb2RlICE9IDB4ZTEgJiYgY29kZSAhPSAweGUyCi0JICAgICAgJiYgY29kZSAhPSAweGUzICYmIGNvZGUgIT0gMHhlNCAmJiBjb2RlICE9IDB4ZTUKLQkgICAgICAmJiBjb2RlICE9IDB4ZTYgJiYgY29kZSAhPSAweGU3ICYmIGNvZGUgIT0gMHhlOAotCSAgICAgICYmIGNvZGUgIT0gMHhlOSAmJiBjb2RlICE9IDB4ZWMgJiYgY29kZSAhPSAweGVkCi0JICAgICAgJiYgY29kZSAhPSAweGVlICYmIGNvZGUgIT0gMHhlZiAmJiBjb2RlICE9IDB4ZmMKLQkgICAgICAmJiBjb2RlICE9IDB4ZmQgJiYgY29kZSAhPSAweGZlICYmIGNvZGUgIT0gMHhmZikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAotCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgICAgY2FzZSAweGZjOgotCQljb2RlID0gMHhmZDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZkOgotCQljb2RlID0gMHhmYzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZlOgotCQljb2RlID0gMHhmZjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZmOgotCQljb2RlID0gMHhmZTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU4OgotCQljb2RlID0gMHhlOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU5OgotCQljb2RlID0gMHhlODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUwOgotCQljb2RlID0gMHhlMjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUyOgotCQljb2RlID0gMHhlMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUzOgotCQljb2RlID0gMHhlMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUxOgotCQljb2RlID0gMHhlMzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU0OgotCQljb2RlID0gMHhlNjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU2OgotCQljb2RlID0gMHhlNDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU3OgotCQljb2RlID0gMHhlNTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU1OgotCQljb2RlID0gMHhlNzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVjOgotCQljb2RlID0gMHhlZDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVkOgotCQljb2RlID0gMHhlYzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVlOgotCQljb2RlID0gMHhlZjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVmOgotCQljb2RlID0gMHhlZTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgCi0JICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAotCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCi0JICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87Ci0KLQkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLwotCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkgICAgICAgUl9NTjEwMjAwX05PTkUpOwotCi0JICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKLQkgaW50byBhIDE2Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfMjQpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAKLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogQWxsIGluc25zIHdoaWNoIGhhdmUgMjRiaXQgb3BlcmFuZHMgYXJlIDUgYnl0ZXMgbG9uZywKLQkJIHRoZSBmaXJzdCBieXRlIHdpbGwgYWx3YXlzIGJlIDB4ZjQsIGJ1dCB3ZSBkb3VibGUgY2hlY2sKLQkJIGl0IGp1c3QgaW4gY2FzZS4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhmNCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIHN3aXRjaCAoY29kZSAmIDB4ZmMpCi0JCXsKLQkJLyogbW92IGltbTI0LGRuIC0+IG1vdiBpbW0xNixkbiAqLwotCQljYXNlIDB4NzA6Ci0JCSAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgIGlmICh2YWx1ZSAmIDB4ODAwMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGY4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdiBpbW0yNCxhbiAtPiBtb3YgaW1tMTYsYW4gCi0JCSAgIGNtcCBpbW0yNCxhbiAtPiBjbXAgaW1tMTYsYW4KLQkJICAgbW92IChhYnMyNCksZG4gLT4gbW92IChhYnMxNiksZG4KLQkJICAgbW92IGRuLChhYnMyNCkgLT4gbW92IGRuLChhYnMxNikKLQkJICAgbW92YiBkbiwoYWJzMjQpIC0+IG1vdmIgZG4sKGFiczE2KQotCQkgICBtb3ZidSAoYWJzMjQpLGRuIC0+IG1vdmJ1IChhYnMxNiksZG4gKi8KLQkJY2FzZSAweDc0OgotCQljYXNlIDB4N2M6Ci0JCWNhc2UgMHhjMDoKLQkJY2FzZSAweDQwOgotCQljYXNlIDB4NDQ6Ci0JCWNhc2UgMHhjODoKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzQpCi0JCSAgICBjb2RlID0gMHhkYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDdjKQotCQkgICAgY29kZSA9IDB4ZWMgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjMCkKLQkJICAgIGNvZGUgPSAweGM4ICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDApCi0JCSAgICBjb2RlID0gMHhjMCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDQ0KQotCQkgICAgY29kZSA9IDB4YzQgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjOCkKLQkJICAgIGNvZGUgPSAweGNjICsgKGNvZGUgJiAweDAzKTsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgIG9mZnNldC4gICovCi0JCSAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQkvKiBjbXAgaW1tMjQsZG4gLT4gY21wIGltbTE2LGRuCi0JCSAgIG1vdiAoYWJzMjQpLGFuIC0+IG1vdiAoYWJzMTYpLGFuCi0JCSAgIG1vdiBhbiwoYWJzMjQpIC0+IG1vdiBhbiwoYWJzMTYpCi0JCSAgIGFkZCBpbW0yNCxkbiAtPiBhZGQgaW1tMTYsZG4KLQkJICAgYWRkIGltbTI0LGFuIC0+IGFkZCBpbW0xNixhbgotCQkgICBzdWIgaW1tMjQsZG4gLT4gc3ViIGltbTE2LGRuCi0JCSAgIHN1YiBpbW0yNCxhbiAtPiBzdWIgaW1tMTYsYW4gCi0JCSAgIEFuZCBhbGwgZDI0LT5kMTYgaW4gbWVtb3J5IG9wcy4gICovCi0JCWNhc2UgMHg3ODoKLQkJY2FzZSAweGQwOgotCQljYXNlIDB4NTA6Ci0JCWNhc2UgMHg2MDoKLQkJY2FzZSAweDY0OgotCQljYXNlIDB4Njg6Ci0JCWNhc2UgMHg2YzoKLQkJY2FzZSAweDgwOgotCQljYXNlIDB4ZjA6Ci0JCWNhc2UgMHgwMDoKLQkJY2FzZSAweDEwOgotCQljYXNlIDB4YjA6Ci0JCWNhc2UgMHgzMDoKLQkJY2FzZSAweGEwOgotCQljYXNlIDB4MjA6Ci0JCWNhc2UgMHg5MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKCgoY29kZSAmIDB4ZmMpID09IDB4NzgKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2MAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDY0Ci0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjgKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2YwotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDgwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ZjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgwMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDEwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgzMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweGEwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg5MCkKLQkJICAgICAgICYmICh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGY3LCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDc4KQotCQkgICAgY29kZSA9IDB4NDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhkMCkKLQkJICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NTApCi0JCSAgICBjb2RlID0gMHgyMCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDYwKQotCQkgICAgY29kZSA9IDB4MTggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2NCkKLQkJICAgIGNvZGUgPSAweDA4ICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjgpCi0JCSAgICBjb2RlID0gMHgxYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDZjKQotCQkgICAgY29kZSA9IDB4MGMgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg4MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4ZjApCi0JCSAgICBjb2RlID0gMHhiMCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDAwKQotCQkgICAgY29kZSA9IDB4ODAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgxMCkKLQkJICAgIGNvZGUgPSAweGEwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YjApCi0JCSAgICBjb2RlID0gMHg3MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDMwKQotCQkgICAgY29kZSA9IDB4NjAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhMCkKLQkJICAgIGNvZGUgPSAweGQwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MjApCi0JCSAgICBjb2RlID0gMHg5MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgY29kZSA9IDB4NTAgKyAoY29kZSAmIDB4MDcpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDIsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQkvKiBtb3ZiIChhYnMyNCksZG4gLT5tb3ZidSAoYWJzMTYpLGRuIGV4dHhiIGJuICovCi0JCWNhc2UgMHhjNDoKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYyArIChjb2RlICYgMHgwMyksCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhiOCArIChjb2RlICYgMHgwMyksCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogVGhlIHJlbG9jIHdpbGwgYmUgYXBwbGllZCBvbmUgYnl0ZSBpbiBmcm9udCBvZiBpdHMKLQkJICAgICBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKLQlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCBleGlzdHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGVsc2UgcmV0dXJuCi0gICBmYWxzZS4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgaW50IHNobmR4OwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoX2VuZCA9IChzeW1faGFzaAotCQkgICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkKLQkJICAgICAtIHN5bXRhYl9oZHItPnNoX2luZm8pKTsKLSAgZm9yICg7IHN5bV9oYXNoIDwgc3ltX2hhc2hfZW5kOyBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9tbjEwMjAwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLW1uMTAyMDAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tbjEwMjAwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX01OMTAyMDAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwltbjEwMjAwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgltbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQltbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1tMTAzMDAuYyBiL2JmZC9lbGYtbTEwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OGY1MzguLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1tMTAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDI5ODEgKzAsMCBAQAotLyogTWF0c3VzaGl0YSAxMDMwMCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbW4xMDMwMC5oIgotCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkKLXsKLSAgLyogVGhlIGJhc2ljIGVsZiBsaW5rIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEZvciBmdW5jdGlvbiBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgY2FsbGVkIGRpcmVjdGx5IChpZSBieSBuYW1lKS4gICovCi0gIHVuc2lnbmVkIGludCBkaXJlY3RfY2FsbHM7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24ncyBzdGFjawotICAgICAoaWYgPD0gMjU1IGJ5dGVzKS4gIFdlIHN0dWZmIHRoaXMgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoaXMgdGFyZ2V0IHdoZW4gaXQncyB2YWxpZCBhbmQgcHJvZml0YWJsZSB0byBkbyBzby4KLQotICAgICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc3RhY2sgYWxsb2NhdGVkIGJ5IG1vdm0hICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWNrX3NpemU7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIGFyZ3VtZW50cyAoaWYgYW55KSBmb3IgbW92bSBpbnN0cnVjdGlvbgotICAgICBpbiB0aGUgcHJvbG9ndWUuICBXZSBzdHVmZiB0aGlzIHZhbHVlIGludG8gImNhbGwiIGluc3RydWN0aW9ucwotICAgICB0byB0aGUgdGFyZ2V0IHdoZW4gaXQncyB2YWxpZCBhbmQgcHJvZml0YWJsZSB0byBkbyBzby4gICovCi0gIHVuc2lnbmVkIGNoYXIgbW92bV9hcmdzOwotCi0gIC8qIEZvciBmdW50aW9uIHN5bWJvbHMsIHRoZSBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCB3b3VsZCBiZSBhbGxvY2F0ZWQKLSAgICAgYnkgdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIG1vdm1fYXJncywgYnV0IHdlCi0gICAgIGFkZCBpdCB0byB0aGUgaGFzaCB0YWJsZSB0byBhdm9pZCBjb21wdXRpbmcgaXQgb3ZlciBhbmQgb3Zlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgbW92bV9zdGFja19zaXplOwotCi0vKiBXaGVuIHNldCwgY29udmVydCBhbGwgImNhbGwiIGluc3RydWN0aW9ucyB0byB0aGlzIHRhcmdldCBpbnRvICJjYWxscyIKLSAgIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTIDB4MQotCi0vKiBVc2VkIHRvIG1hcmsgZnVuY3Rpb25zIHdoaWNoIGhhdmUgaGFkIHJlZHVuZGFudCBwYXJ0cyBvZiB0aGVpcgotICAgcHJvbG9ndWUgZGVsZXRlZC4gICovCi0jZGVmaW5lIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUyAweDIKLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLX07Ci0KLS8qIFdlIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSB0aGUgbWFpbiBlbGYgbGlua2VyIGhhc2ggdGFibGUgc28KLSAgIHdlIGNhbiBzdG9yZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIGEgc2Vjb25kYXJ5IGhhc2ggdGFibGUgd2l0aG91dAotICAgcmVzb3J0aW5nIHRvIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEEgaGFzaCB0YWJsZSBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIFdlIGNvdWxkIGRlcml2ZSBhIG5ldyBoYXNoIHRhYmxlCi0gICAgIGluc3RlYWQgb2YgdXNpbmcgdGhlIGZ1bGwgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgaWYgd2Ugd2FudGVkCi0gICAgIHRvIHNhdmUgc29tZSBtZW1vcnkuICAqLwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKnN0YXRpY19oYXNoX3RhYmxlOwotCi0gIC8qIFJhbmRvbSBsaW5rZXIgc3RhdGUgZmxhZ3MuICAqLwotI2RlZmluZSBNTjEwMzAwX0hBU0hfRU5UUklFU19JTklUSUFMSVpFRCAweDEKLSAgY2hhciBmbGFnczsKLX07Ci0KLS8qIEZvciBNTjEwMzAwIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogR2V0IHRoZSBNTjEwMzAwIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLSNkZWZpbmUgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMzAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICptbjEwMzAwX2VsZl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZjMyX0V4dGVybmFsX1N5bSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvbXB1dGVfZnVuY3Rpb25faW5mbwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIFdlIGhhdmUgdG8gdXNlIFJFTEEgaW5zdHJ1Y3Rpb25zIHNpbmNlIG1kX2FwcGx5X2ZpeDMgaW4gdGhlIGFzc2VtYmxlcgotICAgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuICAqLwotI2RlZmluZSBVU0VfUkVMQQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDMyLAotCSAwLAotCSAyLAotCSAzMiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIHRydWUpLAotICAvKiBTdGFuZGFyZCAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01OMTAzMDBfR05VX1ZURU5UUlkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RhbmRhcmQgMjQgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8yNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzI0IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmLAotCSAweGZmZmZmZiwKLQkgZmFsc2UpLAotCi19OwotCi1zdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXAgbW4xMDMwMF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTU4xMDMwMF9OT05FLCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NTjEwMzAwXzMyLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NTjEwMzAwXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX01OMTAzMDBfOCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfTU4xMDMwMF9QQ1JFTDMyLCB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDMwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAzMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTU4xMDMwMF9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAzMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAzMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW21uMTAzMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMzAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDMwMF9NQVgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01OMTAzMDBfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tbjEwMzAwX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgaXNfbG9jYWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NTjEwMzAwX05PTkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMzI6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSAmIDB4ZmYsIGhpdF9kYXRhKTsKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCAodmFsdWUgPj4gOCkgJiAweGZmLCBoaXRfZGF0YSArIDEpOwotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsICh2YWx1ZSA+PiAxNikgJiAweGZmLCBoaXRfZGF0YSArIDIpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUw4OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDE2OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMMzI6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBNTjEwMzAwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkJIChlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKSk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBob3d0byA9IGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICAvKiBKdXN0IHNraXAgdGhlIHZ0YWJsZSBnYyByZWxvY3MuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfTU4xMDMwMF9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3Qucm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgciA9IG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQkgICBpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIGluaXRpYWxpemluZyBvbmUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICplbnRyeTsKLSAgdW5zaWduZWQgaW50IGJ5dGVfY291bnQgPSAwOwotCi0gIGVudHJ5ID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKWdlbl9lbnRyeTsKLQotICAvKiBJZiB3ZSBhbHJlYWR5IGtub3cgd2Ugd2FudCB0byBjb252ZXJ0ICJjYWxsIiB0byAiY2FsbHMiIGZvciBjYWxscwotICAgICB0byB0aGlzIHN5bWJvbCwgdGhlbiByZXR1cm4gbm93LiAgKi8KLSAgaWYgKGVudHJ5LT5mbGFncyA9PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gbmFtZWQgY2FsbHMgdG8gdGhpcyBzeW1ib2wsIG9yIHRoZXJlJ3Mgbm90aGluZyB3ZQotICAgICBjYW4gbW92ZSBmcm9tIHRoZSBmdW5jdGlvbiBpdHNlbGYgaW50byB0aGUgImNhbGwiIGluc3RydWN0aW9uLCB0aGVuCi0gICAgIG5vdGUgdGhhdCBhbGwgImNhbGwiIGluc3RydWN0aW9ucyBzaG91bGQgYmUgY29udmVydGVkIGludG8gImNhbGxzIgotICAgICBpbnN0cnVjdGlvbnMgYW5kIHJldHVybi4gICovCi0gIGlmIChlbnRyeS0+ZGlyZWN0X2NhbGxzID09IDAKLSAgICAgIHx8IChlbnRyeS0+c3RhY2tfc2l6ZSA9PSAwICYmIGVudHJ5LT5tb3ZtX2FyZ3MgPT0gMCkpCi0gICAgewotICAgICAgLyogTWFrZSBhIG5vdGUgdGhhdCB3ZSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkgaW5zdHJ1Y3Rpb25zIGZvciBjYWxscyB0byB0aGlzIHN5bWJvbC4gICovCi0gICAgICBlbnRyeS0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgbWF5IGJlIGFibGUgdG8gbW92ZSBzb21lIGluc3RydWN0aW9ucyBmcm9tIHRoZSBmdW5jdGlvbiBpdHNlbGYgaW50bwotICAgICB0aGUgImNhbGwiIGluc3RydWN0aW9uLiAgQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UgbWlnaHQgYmUgYWJsZSB0bwotICAgICBlbGltaW5hdGUgaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gICovCi0KLSAgLyogQSBtb3ZtIGluc3RydWN0aW9uIGlzIHR3byBieXRlcy4gICovCi0gIGlmIChlbnRyeS0+bW92bV9hcmdzKQotICAgIGJ5dGVfY291bnQgKz0gMjsKLQotICAvKiBDb3VudCB0aGUgaW5zbiB0byBhbGxvY2F0ZSBzdGFjayBzcGFjZSB0b28uICAqLwotICBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDw9IDEyOCkKLSAgICBieXRlX2NvdW50ICs9IDM7Ci0gIGVsc2UgaWYgKGVudHJ5LT5zdGFja19zaXplID4gMCAmJiBlbnRyeS0+c3RhY2tfc2l6ZSA8IDI1NikKLSAgICBieXRlX2NvdW50ICs9IDQ7Ci0KLSAgLyogSWYgdXNpbmcgImNhbGwiIHdpbGwgcmVzdWx0IGluIGxhcmdlciBjb2RlLCB0aGVuIHR1cm4gYWxsCi0gICAgIHRoZSBhc3NvY2lhdGVkICJjYWxsIiBpbnN0cnVjdGlvbnMgaW50byAiY2FsbHMiIGluc3RydXRpb25zLiAgKi8KLSAgaWYgKGJ5dGVfY291bnQgPCBlbnRyeS0+ZGlyZWN0X2NhbGxzKQotICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotICAvKiBUaGlzIHJvdXRpbmUgbmV2ZXIgZmFpbHMuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgbW4xMDMwMC4KLQotICAgVGhlcmUncyBxdWl0ZSBhIGZldyByZWxheGluZyBvcHBvcnR1bml0ZXMgYXZhaWxhYmxlIG9uIHRoZSBtbjEwMzAwOgotCi0JKiBjYWxsczozMiAtPiBjYWxsczoxNiAJCQkJCSAgIDIgYnl0ZXMKLQkqIGNhbGw6MzIgIC0+IGNhbGw6MTYJCQkJCSAgIDIgYnl0ZXMKLQotCSogY2FsbDozMiAtPiBjYWxsczozMgkJCQkJICAgMSBieXRlCi0JKiBjYWxsOjE2IC0+IGNhbGxzOjE2CQkJCQkgICAxIGJ5dGUKLQkJKiBUaGVzZSBhcmUgZG9uZSBhbnl0aW1lIHVzaW5nICJjYWxscyIgd291bGQgcmVzdWx0Ci0JCWluIHNtYWxsZXIgY29kZSwgb3Igd2hlbiBuZWNlc3NhcnkgdG8gcHJlc2VydmUgdGhlCi0JCW1lYW5pbmcgb2YgdGhlIHByb2dyYW0uCi0KLQkqIGNhbGw6MzIJCQkJCQkgICB2YXJpZXMKLQkqIGNhbGw6MTYKLQkJKiBJbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgY2FuIG1vdmUgaW5zdHJ1Y3Rpb25zCi0JCWZyb20gYSBmdW5jdGlvbiBwcm9sb2d1ZSBpbnRvIGEgImNhbGwiIGluc3RydWN0aW9uLgotCQlUaGlzIGlzIG9ubHkgZG9uZSBpZiB0aGUgcmVzdWx0aW5nIGNvZGUgaXMgbm8gbGFyZ2VyCi0JCXRoYW4gdGhlIG9yaWdpbmFsIGNvZGUuCi0KLQotCSogam1wOjMyIC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczMyIC0+IG1vdiBhYnMxNgkJCQkgICAxIG9yIDIgYnl0ZXMKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTMyIGNhbiByZWxheCB0byBpbW0xNiAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIG9yIDIgYnl0ZXMKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQzMiBjYW4gcmVsYXggdG8gZDE2CSAgIDEgb3IgMiBieXRlcwotCS0gTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQxNiBjYW4gcmVsYXggdG8gZDgJICAgMSBvciAyIGJ5dGVzCi0KLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogQXNzdW1lIG5vdGhpbmcgY2hhbmdlcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBtbjEwMzAwIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgZmllbGRzIGluIGVhY2ggaGFzaCB0YWJsZSBlbnRyeSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLiAgKi8KLSAgaWYgKChoYXNoX3RhYmxlLT5mbGFncyAmIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCi0gICAgICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBpbnB1dCBiZmRzLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYyA9IE5VTEw7Ci0JICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JICAgICAgY2hhciAqbmV3X25hbWU7Ci0KLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZSBpZiAoc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKiliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc2VjdGlvbiwKLQkJCQkJCSBjb250ZW50cywgKGZpbGVfcHRyKSAwLAotCQkJCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnRlbnRzID0gTlVMTDsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JCSAgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLQkJewotCi0JCSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLQkJICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkJICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJCSAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkJICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLQkJICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgaXJlbGVuZCA9IGlyZWwgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkJICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQkJICAgIHsKLQkJICAgICAgbG9uZyByX3R5cGU7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkJICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOwotCi0JCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfTU4xMDMwMF9NQVgpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRoZSBuYW1lIGFuZCBoYXNoIHRhYmxlIGVudHJ5IG9mIHRoZSB0YXJnZXQKLQkJCSBzeW1ib2whICAqLwotCQkgICAgICBoYXNoID0gTlVMTDsKLQkJICAgICAgc3ltID0gTlVMTDsKLQkJICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJewotCQkJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwKLQkJCQkJCSAgICBleHRzeW1zICsgcl9pbmRleCwgJmlzeW0pOwotCi0JCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAKLQkJCQkgICAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJCSAgICBzeW1fc2VjCi0JCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIGlzeW0uc3Rfc2huZHgpOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJCSAgCi0JCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgaXN5bS5zdF9uYW1lKTsKLQotCQkJICAvKiBJZiBpdCBpc24ndCBhIGZ1bmN0aW9uLCB0aGVuIHdlIGRvbid0IGNhcmUKLQkJCSAgICAgYWJvdXQgaXQuICAqLwotCQkJICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pICE9IFNUVF9GVU5DKQotCQkJICAgIGNvbnRpbnVlOwotCi0JCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkJCSAgICAgICAgIHN5bV9uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotCQkJICBmcmVlIChuZXdfbmFtZSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgcl9pbmRleCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3JfaW5kZXhdOwotCQkJfQotCi0JCSAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgImNhbGwiIGluc3RydWN0aW9uLCB0aGVuIHdlCi0JCQkgc2hvdWxkIGNvbnZlcnQgImNhbGwiIGluc3RydWN0aW9ucyB0byAiY2FsbHMiCi0JCQkgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoaW5wdXRfYmZkLAotCQkJCQljb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgICAgIGlmIChjb2RlICE9IDB4ZGQgJiYgY29kZSAhPSAweGNkKQotCQkJaGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBhIGp1bXAvY2FsbCwgdGhlbiBidW1wIHRoZSBkaXJlY3RfY2FsbHMKLQkJCSBjb3VudGVyLiAgRWxzZSBmb3JjZSAiY2FsbCIgdG8gImNhbGxzIiBjb252ZXJzaW9ucy4gICovCi0JCSAgICAgIGlmIChyX3R5cGUgPT0gUl9NTjEwMzAwX1BDUkVMMzIKLQkJCSAgfHwgcl90eXBlID09IFJfTU4xMDMwMF9QQ1JFTDE2KQotCQkJaGFzaC0+ZGlyZWN0X2NhbGxzKys7Ci0JCSAgICAgIGVsc2UKLQkJCWhhc2gtPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBOb3cgbG9vayBhdCB0aGUgYWN0dWFsIGNvbnRlbnRzIHRvIGdldCB0aGUgc3RhY2sgc2l6ZSwKLQkJIGFuZCBhIGxpc3Qgb2Ygd2hhdCByZWdpc3RlcnMgd2VyZSBzYXZlZCBpbiB0aGUgcHJvbG9ndWUKLQkJIChpZSBtb3ZtX2FyZ3MpLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApCi0JCXsKLQotCQkgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0JCSAgaW50IGlkeCwgc2huZHg7Ci0KLQkJICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgc2VjdGlvbik7Ci0KLQotCQkgIC8qIExvb2sgYXQgZWFjaCBmdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbiBhbmQKLQkJICAgICB1cGRhdGUgaW5mbyBmb3IgdGhhdCBmdW5jdGlvbi4gICovCi0JCSAgZXN5bSA9IGV4dHN5bXM7Ci0JCSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotCQkgICAgewotCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQkJICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJCSAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgPT0gU1RUX0ZVTkMpCi0JCQl7Ci0JCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAKLQkJCQkgICAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJCSAgICBzeW1fc2VjCi0JCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIGlzeW0uc3Rfc2huZHgpOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQlzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCWlzeW0uc3RfbmFtZSk7Ci0KLQkJCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJCSAgaWYgKG5ld19uYW1lID09IDApCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkJCSAgICAgICAgICBzeW1fbmFtZSwgdHJ1ZSwKLQkJCQkJCSAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0JCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJCSAgY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChpbnB1dF9iZmQsIGhhc2gsCi0JCQkJCSAgICAgICAgIGlzeW0uc3RfdmFsdWUsIGNvbnRlbnRzKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplCi0JCQkJICAgICAgIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLQkJICBmb3IgKGlkeCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlkeCsrKQotCQkgICAgewotCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQkJICAgICAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICAgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpZHhdOwotCQkgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkJICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQwotCQkJICAmJiAoaGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlY3Rpb24KLQkJCSAgJiYgKChoYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgICB8fCAoaGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCQljb21wdXRlX2Z1bmN0aW9uX2luZm8gKGlucHV0X2JmZCwgaGFzaCwKLQkJCQkJICAgICAgIChoYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlLAotCQkJCQkgICAgICAgY29udGVudHMpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBjb250ZW50cy4gICovCi0JICAgICAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLQkJewotCQkgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIH0KLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBzeW1ib2xzLiAgKi8KLQkgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCQl9Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm93IGl0ZXJhdGUgb24gZWFjaCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUgYW5kIHBlcmZvcm0KLQkgdGhlIGZpbmFsIGluaXRpYWxpemF0aW9uIHN0ZXBzIG9uIGVhY2guICAqLwotICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UgKGhhc2hfdGFibGUsCi0JCQkJCWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnksCi0JCQkJCU5VTEwpOwotICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UgKGhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLAotCQkJCQllbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5LAotCQkJCQlOVUxMKTsKLQotICAgICAgLyogQWxsIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiAgKi8KLSAgICAgIGhhc2hfdGFibGUtPmZsYWdzIHw9IE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEOwotCi0gICAgICAvKiBOb3cgdGhhdCBldmVyeXRoaW5nIGhhcyBiZWVuIGluaXRpYWxpemVkLCBnbyB0aHJvdWdoIGVhY2gKLQkgY29kZSBzZWN0aW9uIGFuZCBkZWxldGUgYW55IHByb2xvZ3VlIGluc25zIHdoaWNoIHdpbGwgYmUKLQkgcmVkdW5kYW50IGJlY2F1c2UgdGhlaXIgb3BlcmF0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBieQotCSBhICJjYWxsIiBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkczsKLQkgICBpbnB1dF9iZmQgIT0gTlVMTDsKLQkgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCBhbGwgdGhlIHN5bWJvbHMgZm9yIGVhY2ggYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gICAgICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0gICAgICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0gICAgICAgICAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLSAgICAgICAgICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotICAgICAgICAgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotICAgICAgICAgICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgICAgICAgICAgICAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBpbnB1dF9iZmQpCi0gICAgICAgICAgICAgICAgICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLQkgIC8qIFdhbGsgb3ZlciBlYWNoIHNlY3Rpb24gaW4gdGhpcyBiZmQuICAqLwotCSAgZm9yIChzZWN0aW9uID0gaW5wdXRfYmZkLT5zZWN0aW9uczsKLQkgICAgICAgc2VjdGlvbiAhPSBOVUxMOwotCSAgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBzaG5keDsKLQkgICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCSAgICAgIGludCBpZHg7Ci0KLQkgICAgICAvKiBTa2lwIG5vbi1jb2RlIHNlY3Rpb25zIGFuZCBlbXB0eSBzZWN0aW9ucy4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwIHx8IHNlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCAhPSAwKQotCQl7Ci0gICAgICAgICAgICAgICAgICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dF9iZmQsIHNlY3Rpb24sIChQVFIpIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCX0KLQotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBvZiBzZWN0aW9uIGNvbnRlbnRzIGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKiliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc2VjdGlvbiwKLQkJCQkJCSBjb250ZW50cywgKGZpbGVfcHRyKSAwLAotCQkJCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0KLQkgICAgICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoaW5wdXRfYmZkLCBzZWN0aW9uKTsKLQotCSAgICAgIC8qIE5vdyBsb29rIGZvciBhbnkgZnVuY3Rpb24gaW4gdGhpcyBzZWN0aW9uIHdoaWNoIG5lZWRzCi0JCSBpbnNucyBkZWxldGVkIGZyb20gaXRzIHByb2xvZ3VlLiAgKi8KLQkgICAgICBlc3ltID0gZXh0c3ltczsKLQkgICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JCSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQkJICBhc2VjdGlvbiAqc3ltX3NlYyA9IE5VTEw7Ci0JCSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JCSAgY2hhciAqbmV3X25hbWU7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCi0JCSAgaWYgKGlzeW0uc3Rfc2huZHggIT0gc2huZHgpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkgICAgc3ltX3NlYwotCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW0uc3Rfc2huZHgpOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIAotCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCSAgICAgICAgICBzeW1fbmFtZSwgZmFsc2UsCi0JCQkJCSAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotCi0JCSAgZnJlZSAobmV3X25hbWUpOwotCQkgIGlmIChzeW1faGFzaCA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICBpc3ltLnN0X3ZhbHVlLAotCQkJCQkJCSAgIGJ5dGVzKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0Ci0JCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLQkJICAgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTG9vayBmb3IgYW55IGdsb2JhbCBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIHdoaWNoCi0JCSBuZWVkIGluc25zIGRlbGV0ZWQgZnJvbSB0aGVpciBwcm9sb2d1ZXMuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplCi0JCQkJICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCSAgICAgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JCSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgICAgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF0pOwotCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCSAgICAgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlY3Rpb24KLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCQkJICAgYnl0ZXMpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQuICBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKLQkJCSBtYXkgbGVhZCB0byBtb3JlIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotCQkgICAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBjb250ZW50cy4gICovCi0JICAgICAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLQkJewotCQkgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIH0KLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBzeW1ib2xzLiAgKi8KLQkgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCQl9Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBmb3IgdGhlIGJhc2ljIGluc3RydWN0aW9uIHNob3J0ZW5pbmcvcmVsYXhpbmcgcGFzcy4gICovCi0gIGNvbnRlbnRzID0gTlVMTDsKLSAgZXh0c3ltcyA9IE5VTEw7Ci0gIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9OT05FCi0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwXzgKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTUFYKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCSAgYXNlY3Rpb24gKnN5bV9zZWMgPSBOVUxMOwotCSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JICBjaGFyICpuZXdfbmFtZTsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQotCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCSAgCi0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIGlzeW0uc3RfbmFtZSk7Ci0KLQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkgICAgICBzeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JICBmcmVlIChuZXdfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdKTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotIAkJc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotIAkJcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAzMmJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoL2NhbGwsIGFsc28gZGVhbCB3aXRoICJjYWxsIiAtPiAiY2FsbHMiIGNvbnZlcnNpb25zIGFuZAotCSBpbnNlcnRpb24gb2YgcHJvbG9ndWUgZGF0YSBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwzMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgc29tZSBkYXRhCi0JCSBmcm9tIHRhcmdldCBmdW5jdGlvbiBmaWxsZWQgaW4uICAqLwotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBJbnNlcnQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgZnVuY3Rpb24gaW50byB0aGUgImNhbGwiCi0JCSBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPm1vdm1fYXJncywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+c3RhY2tfc2l6ZSArIGgtPm1vdm1fc3RhY2tfc2l6ZSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDUpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2ZmZiArIDIgYXMgdGhlIHRhcmdldCB3aWxsIGJlIHR3byBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAwMSAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhkYyAmJiBjb2RlICE9IDB4ZGQgJiYgY29kZSAhPSAweGZmKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhkYykKLQkJYmZkX3B1dF84IChhYmZkLCAweGNjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGRkKQotCQliZmRfcHV0XzggKGFiZmQsIDB4Y2QsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmYpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMMTYpOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4Y2QpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgotCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGNkKQotCQl7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiA4IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2YgKyAxIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSBvbmUgYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwICYmIChsb25nKXZhbHVlID4gLTB4ODApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhjYykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMOCk7Ci0KLQkgICAgICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIGVsaW1pbmF0ZSBhbiB1bmNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlIGJyYW5jaAotCSB3aGljaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guCi0KLQkgICAgb3JpZ2luYWw6CQluZXc6Ci0JICAgIGJDQyBsYWIxCQliQ0MnIGxhYjIKLQkgICAgYnJhIGxhYjIKLQkgICBsYWIxOgkgICAgICAgbGFiMToKLQotCi0JIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBiQ0MgY2FuJ3QgcmVhY2ggbGFiMiBhdCBhc3NlbWJseSB0aW1lLAotCSBidXQgZHVlIHRvIG90aGVyIHJlbGF4YXRpb25zIGl0IGNhbiByZWFjaCBhdCBsaW5rIHRpbWUuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUw4KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOwotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBEbyBub3RoaW5nIGlmIHRoaXMgcmVsb2MgaXMgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gc2VjLT5fY29va2VkX3NpemUpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTZWUgaWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYW4gdW5jb25kaXRpb25hbCBwYy1yZWxhdGl2ZQotCSAgICAgYnJhbmNoLCBtb3JlIG9mdGVuIHRoYW4gbm90IHRoaXMgdGVzdCB3aWxsIGZhaWwsIHNvIHdlCi0JICAgICB0ZXN0IGl0IGZpcnN0IHRvIHNwZWVkIHRoaW5ncyB1cC4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICBpZiAoY29kZSAhPSAweGNhKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxzbyBtYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIGEgcGMtcmVsYXRpdmUgOCBiaXQgYnJhbmNoLiAgKi8KLQkgIG5yZWwgPSBpcmVsICsgMTsKLQkgIGlmIChucmVsID09IGlyZWxlbmQKLQkgICAgICB8fCBpcmVsLT5yX29mZnNldCArIDIgIT0gbnJlbC0+cl9vZmZzZXQKLQkgICAgICB8fCBFTEYzMl9SX1RZUEUgKG5yZWwtPnJfaW5mbykgIT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE1ha2Ugc3VyZSBvdXIgZGVzdGluYXRpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKLQkgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChzeW12YWwgIT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICsgaXJlbC0+cl9vZmZzZXQgKyAzKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE5vdyBtYWtlIHN1cmUgd2UgYXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgVGhpcyBtYXkgbm90Ci0JICAgICBiZSBuZWNlc3NhcnksIGJ1dCB3aHkgdGFrZSB0aGUgY2hhbmNlLgotCi0JICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAzMDBfUENSRUw4IHJlbG9jcwotCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKLQkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgotCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhjMCAmJiBjb2RlICE9IDB4YzEgJiYgY29kZSAhPSAweGMyCi0JICAgICAgJiYgY29kZSAhPSAweGMzICYmIGNvZGUgIT0gMHhjNCAmJiBjb2RlICE9IDB4YzUKLQkgICAgICAmJiBjb2RlICE9IDB4YzYgJiYgY29kZSAhPSAweGM3ICYmIGNvZGUgIT0gMHhjOAotCSAgICAgICYmIGNvZGUgIT0gMHhjOSAmJiBjb2RlICE9IDB4ZTggJiYgY29kZSAhPSAweGU5Ci0JICAgICAgJiYgY29kZSAhPSAweGVhICYmIGNvZGUgIT0gMHhlYikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAotCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgICAgY2FzZSAweGM4OgotCQljb2RlID0gMHhjOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM5OgotCQljb2RlID0gMHhjODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMwOgotCQljb2RlID0gMHhjMjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMyOgotCQljb2RlID0gMHhjMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMzOgotCQljb2RlID0gMHhjMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMxOgotCQljb2RlID0gMHhjMzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM0OgotCQljb2RlID0gMHhjNjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM2OgotCQljb2RlID0gMHhjNDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM3OgotCQljb2RlID0gMHhjNTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM1OgotCQljb2RlID0gMHhjNzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU4OgotCQljb2RlID0gMHhlOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDlkOgotCQljb2RlID0gMHhlODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVhOgotCQljb2RlID0gMHhlYjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGViOgotCQljb2RlID0gMHhlYTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAotCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCi0JICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87Ci0KLQkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLwotCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkgICAgICAgUl9NTjEwMzAwX05PTkUpOwotCi0JICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKLQkgaW50byBhIDggaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8yNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2YgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEFNMzMgaW5zbnMgd2hpY2ggaGF2ZSAyNCBvcGVyYW5kcyBhcmUgNiBieXRlcyBsb25nIGFuZAotCQkgd2lsbCBoYXZlIDB4ZmQgYXMgdGhlIGZpcnN0IGJ5dGUuICAqLwotCi0JICAgICAgLyogR2V0IHRoZSBmaXJzdCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAzKTsKLQotCSAgICAgIGlmIChjb2RlID09IDB4ZmQpCi0JCXsKLQkgICAgICAgICAgLyogR2V0IHRoZSBzZWNvbmQgb3Bjb2RlLiAgKi8KLQkgICAgICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogV2UgY2FuIG5vdCByZWxheCAweDZiLCAweDdiLCAweDhiLCAweDliIGFzIG5vIDI0Yml0Ci0JCSAgICAgZXF1aXZhbGVudCBpbnN0cnVjdGlvbnMgZXhpc3RzLiAgKi8KLQkgICAgICAgICAgaWYgKGNvZGUgIT0gMHg2YiAmJiBjb2RlICE9IDB4N2IKLQkJICAgICAgJiYgY29kZSAhPSAweDhiICYmIGNvZGUgIT0gMHg5YgotCQkgICAgICAmJiAoKGNvZGUgJiAweDBmKSA9PSAweDA5IHx8IChjb2RlICYgMHgwZikgPT0gMHgwOAotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGEgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBiCi0JCQkgIHx8IChjb2RlICYgMHgwZikgPT0gMHgwZSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgICAgaW4gYSBzaWduZWQgOGJpdCB2YWx1ZS4gIFRoaXMgaXMgY3VycmVudGx5IG92ZXIKLQkJICAgICAgICAgY29uc2VydmF0aXZlLiAgKi8KLQkJICAgICAgaWYgKCh2YWx1ZSAmIDB4ODApID09IDApCi0JCQl7Ci0JCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLAotCQkJICAgICBldGMuICAqLwotCQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJCSAgYmZkX3B1dF84IChhYmZkLCAweGZiLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMyk7Ci0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkJICBpcmVsLT5yX2luZm8KLQkJCSAgICA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgICAgICAgICBSX01OMTAzMDBfOCk7Ci0KLQkJCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheAotCQkJICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0Ci0JCQkgICAgICBtYXkgYmUgc2xvdy4gICovCi0JCQkgICphZ2FpbiA9IHRydWU7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCi0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAzMmJpdCBpbW1lZGlhdGUsIGRpc3BsYWNlbWVudCBvciBhYnNvbHV0ZSBhZGRyZXNzCi0JIGludG8gYSAxNmJpdCBpbW1lZGlhdGUsIGRpc3BsYWNlbWVudCBvciBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwXzMyKQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAyNCBiaXRzLgotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZmZmICYmIChsb25nKXZhbHVlID4gLTB4ODAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogQU0zMyBpbnNucyB3aGljaCBoYXZlIDMyYml0IG9wZXJhbmRzIGFyZSA3IGJ5dGVzIGxvbmcgYW5kCi0JCSB3aWxsIGhhdmUgMHhmZSBhcyB0aGUgZmlyc3QgYnl0ZS4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCi0JICAgICAgaWYgKGNvZGUgPT0gMHhmZSkKLQkJewotCSAgICAgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBBbGwgdGhlIGFtMzMgMzIgLT4gMjQgcmVsYXhpbmcgcG9zc2liaWxpdGllcy4gICovCi0JCSAgLyogV2UgY2FuIG5vdCByZWxheCAweDZiLCAweDdiLCAweDhiLCAweDliIGFzIG5vIDI0Yml0Ci0JCSAgICAgZXF1aXZhbGVudCBpbnN0cnVjdGlvbnMgZXhpc3RzLiAgKi8KLQkgICAgICAgICAgaWYgKGNvZGUgIT0gMHg2YiAmJiBjb2RlICE9IDB4N2IKLQkJICAgICAgJiYgY29kZSAhPSAweDhiICYmIGNvZGUgIT0gMHg5YgotCQkgICAgICAmJiAoKGNvZGUgJiAweDBmKSA9PSAweDA5IHx8IChjb2RlICYgMHgwZikgPT0gMHgwOAotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGEgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBiCi0JCQkgIHx8IChjb2RlICYgMHgwZikgPT0gMHgwZSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICBUaGlzIGlzIGN1cnJlbnRseSBvdmVyCi0JCSAgICAgICAgIGNvbnNlcnZhdGl2ZS4gICovCi0JCSAgICAgIGlmICgodmFsdWUgJiAweDgwMDApID09IDApCi0JCQl7Ci0JCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLAotCQkJICAgICBldGMuICAqLwotCQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJCSAgYmZkX3B1dF84IChhYmZkLCAweGZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMyk7Ci0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkJICBpcmVsLT5yX2luZm8KLQkJCSAgICA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgICAgICAgICBSX01OMTAzMDBfMjQpOwotCi0JCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAzLCAxKSkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheAotCQkJICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0Ci0JCQkgICAgICBtYXkgYmUgc2xvdy4gICovCi0JCQkgICphZ2FpbiA9IHRydWU7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCi0JCX0KLQkgICAgfQotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuCi0JICAgICBXZSBhbGxvdyBhbnkgMTZiaXQgbWF0Y2ggaGVyZS4gIFdlIHBydW5lIHRob3NlIHdlIGNhbid0Ci0JICAgICBoYW5kbGUgYmVsb3cuICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg3ZmZmICYmIChsb25nKXZhbHVlID4gLTB4ODAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIE1vc3QgaW5zbnMgd2hpY2ggaGF2ZSAzMmJpdCBvcGVyYW5kcyBhcmUgNiBieXRlcyBsb25nOwotCQkgZXhjZXB0aW9ucyBhcmUgcGNyZWwgaW5zbnMgYW5kIGJpdCBpbnNucy4KLQotCQkgV2UgaGFuZGxlIHBjcmVsIGluc25zIGFib3ZlLiAgV2UgZG9uJ3QgYm90aGVyIHRyeWluZwotCQkgdG8gaGFuZGxlIHRoZSBiaXQgaW5zbnMgaGVyZS4KLQotCQkgVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlbWFpbmluZyBpbnNucyB3aWxsIGJlIDB4ZmMuICAqLwotCi0JICAgICAgLyogR2V0IHRoZSBmaXJzdCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZmMpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogR2V0IHRoZSBzZWNvbmQgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoKGNvZGUgJiAweGYwKSA8IDB4ODApCi0JCXN3aXRjaCAoY29kZSAmIDB4ZjApCi0JCSAgewotCQkgIC8qIG1vdiAoZDMyLGFtKSxkbiAgIC0+IG1vdiAoZDMyLGFtKSxkbgotCQkgICAgIG1vdiBkbSwoZDMyLGFtKSAgIC0+IG1vdiBkbiwoZDMyLGFtKQotCQkgICAgIG1vdiAoZDMyLGFtKSxhbiAgIC0+IG1vdiAoZDMyLGFtKSxhbgotCQkgICAgIG1vdiBkbSwoZDMyLGFtKSAgIC0+IG1vdiBkbiwoZDMyLGFtKQotCQkgICAgIG1vdmJ1IChkMzIsYW0pLGRuIC0+IG1vdmJ1IChkMzIsYW0pLGRuCi0JCSAgICAgbW92YnUgZG0sKGQzMixhbSkgLT4gbW92YnUgZG4sKGQzMixhbSkKLQkJICAgICBtb3ZodSAoZDMyLGFtKSxkbiAtPiBtb3ZodSAoZDMyLGFtKSxkbgotCQkgICAgIG1vdmh1IGRtLChkMzIsYW0pIC0+IG1vdmh1IGRuLChkMzIsYW0pICovCi0JCSAgY2FzZSAweDAwOgotCQkgIGNhc2UgMHgxMDoKLQkJICBjYXNlIDB4MjA6Ci0JCSAgY2FzZSAweDMwOgotCQkgIGNhc2UgMHg0MDoKLQkJICBjYXNlIDB4NTA6Ci0JCSAgY2FzZSAweDYwOgotCQkgIGNhc2UgMHg3MDoKLQkJICAgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgICBpZiAoY29kZSA9PSAweGNjCi0JCQkmJiAodmFsdWUgJiAweDgwMDApKQotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjApID09IDB4ODAKLQkJICAgICAgIHx8IChjb2RlICYgMHhmMCkgPT0gMHg5MCkKLQkJc3dpdGNoIChjb2RlICYgMHhmMykKLQkJICB7Ci0JCSAgLyogbW92IGRuLChhYnMzMikgICAtPiBtb3YgZG4sKGFiczE2KQotCQkgICAgIG1vdmJ1IGRuLChhYnMzMikgLT4gbW92YnUgZG4sKGFiczE2KQotCQkgICAgIG1vdmh1IGRuLChhYnMzMikgLT4gbW92aHUgZG4sKGFiczE2KSAgKi8KLQkJICBjYXNlIDB4ODE6Ci0JCSAgY2FzZSAweDgyOgotCQkgIGNhc2UgMHg4MzoKLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgxKQotCQkgICAgICBjb2RlID0gMHgwMSArIChjb2RlICYgMHgwYyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODIpCi0JCSAgICAgIGNvZGUgPSAweDAyICsgKGNvZGUgJiAweDBjKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MykKLQkJICAgICAgY29kZSA9IDB4MDMgKyAoY29kZSAmIDB4MGMpOwotCQkgICAgZWxzZQotCQkgICAgICBhYm9ydCAoKTsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgICBhZGRlbmQgYW5kIG9mZnNldCB0b28hICAqLwotCQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCQkgICAgLyogRGVsZXRlIHRocmVlIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAxLCAzKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCi0JCSAgLyogbW92IGFtLChhYnMzMikgICAgLT4gbW92IGFtLChhYnMxNikKLQkJICAgICBtb3YgYW0sKGQzMixzcCkgICAtPiBtb3YgYW0sKGQxNixzcCkKLQkJICAgICBtb3YgZG0sKGQzMixzcCkgICAtPiBtb3YgZG0sKGQzMixzcCkKLQkJICAgICBtb3ZidSBkbSwoZDMyLHNwKSAtPiBtb3ZidSBkbSwoZDMyLHNwKQotCQkgICAgIG1vdmh1IGRtLChkMzIsc3ApIC0+IG1vdmh1IGRtLChkMzIsc3ApICovCi0JCSAgY2FzZSAweDgwOgotCQkgIGNhc2UgMHg5MDoKLQkJICBjYXNlIDB4OTE6Ci0JCSAgY2FzZSAweDkyOgotCQkgIGNhc2UgMHg5MzoKLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA8IDB4ZjApCi0JCXN3aXRjaCAoY29kZSAmIDB4ZmMpCi0JCSAgewotCQkgIC8qIG1vdiBpbW0zMixkbiAgICAgLT4gbW92IGltbTE2LGRuCi0JCSAgICAgbW92IGltbTMyLGFuICAgICAtPiBtb3YgaW1tMTYsYW4KLQkJICAgICBtb3YgKGFiczMyKSxkbiAgIC0+IG1vdiAoYWJzMTYpLGRuCi0JCSAgICAgbW92YnUgKGFiczMyKSxkbiAtPiBtb3ZidSAoYWJzMTYpLGRuCi0JCSAgICAgbW92aHUgKGFiczMyKSxkbiAtPiBtb3ZodSAoYWJzMTYpLGRuICAqLwotCQkgIGNhc2UgMHhjYzoKLQkJICBjYXNlIDB4ZGM6Ci0JCSAgY2FzZSAweGE0OgotCQkgIGNhc2UgMHhhODoKLQkJICBjYXNlIDB4YWM6Ci0JCSAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgICAgaWYgKGNvZGUgPT0gMHhjYwotCQkJJiYgKHZhbHVlICYgMHg4MDAwKSkKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGNjKQotCQkgICAgICBjb2RlID0gMHgyYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4ZGMpCi0JCSAgICAgIGNvZGUgPSAweDI0ICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhNCkKLQkJICAgICAgY29kZSA9IDB4MzAgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGE4KQotCQkgICAgICBjb2RlID0gMHgzNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YWMpCi0JCSAgICAgIGNvZGUgPSAweDM4ICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgICAgYWRkZW5kIGFuZCBvZmZzZXQgdG9vISAgKi8KLQkJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAgIC8qIERlbGV0ZSB0aHJlZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMykpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQotCQkgIC8qIG1vdiAoYWJzMzIpLGFuICAgIC0+IG1vdiAoYWJzMTYpLGFuCi0JCSAgICAgbW92IChkMzIsc3ApLGFuICAgLT4gbW92IChkMzIsc3ApLGFuCi0JCSAgICAgbW92IChkMzIsc3ApLGRuICAgLT4gbW92IChkMzIsc3ApLGRuCi0JCSAgICAgbW92YnUgKGQzMixzcCksZG4gLT4gbW92YnUgKGQzMixzcCksZG4KLQkJICAgICBtb3ZodSAoZDMyLHNwKSxkbiAtPiBtb3ZodSAoZDMyLHNwKSxkbgotCQkgICAgIGFkZCBpbW0zMixkbiAgICAgIC0+IGFkZCBpbW0xNixkbgotCQkgICAgIGNtcCBpbW0zMixkbiAgICAgIC0+IGNtcCBpbW0xNixkbgotCQkgICAgIGFkZCBpbW0zMixhbiAgICAgIC0+IGFkZCBpbW0xNixhbgotCQkgICAgIGNtcCBpbW0zMixhbiAgICAgIC0+IGNtcCBpbW0xNixhbgotCQkgICAgIGFuZCBpbW0zMixkbiAgICAgIC0+IGFuZCBpbW0zMixkbgotCQkgICAgIG9yIGltbTMyLGRuICAgICAgIC0+IG9yIGltbTMyLGRuCi0JCSAgICAgeG9yIGltbTMyLGRuICAgICAgLT4geG9yIGltbTMyLGRuCi0JCSAgICAgYnRzdCBpbW0zMixkbiAgICAgLT4gYnRzdCBpbW0zMixkbiAqLwotCi0JCSAgY2FzZSAweGEwOgotCQkgIGNhc2UgMHhiMDoKLQkJICBjYXNlIDB4YjE6Ci0JCSAgY2FzZSAweGIyOgotCQkgIGNhc2UgMHhiMzoKLQkJICBjYXNlIDB4YzA6Ci0JCSAgY2FzZSAweGM4OgotCi0JCSAgY2FzZSAweGQwOgotCQkgIGNhc2UgMHhkODoKLQkJICBjYXNlIDB4ZTA6Ci0JCSAgY2FzZSAweGUxOgotCQkgIGNhc2UgMHhlMjoKLQkJICBjYXNlIDB4ZTM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhmZSkKLQkJewotCQkgIC8qIGFkZCBpbW0zMixzcCAtPiBhZGQgaW1tMTYsc3AgICovCi0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgc3RhY2sgc2l6ZSBhbmQgbW92bSBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbgotICAgcmVmZXJyZWQgdG8gYnkgSEFTSCBhdCBhZGRyZXNzIEFERFIgaW4gc2VjdGlvbiB3aXRoCi0gICBjb250ZW50cyBDT05URU5UUywgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyB2b2lkCi1jb21wdXRlX2Z1bmN0aW9uX2luZm8gKGFiZmQsIGhhc2gsIGFkZHIsIGNvbnRlbnRzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaGFzaDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLXsKLSAgdW5zaWduZWQgY2hhciBieXRlMSwgYnl0ZTI7Ci0gIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBhIHZlcnkgc21hbGwgc3Vic2V0IG9mIHRoZSBwb3NzaWJsZSBwcm9sb2d1ZQotICAgICBzZXF1ZW5jZXMgaGVyZS4gIEJhc2ljYWxseSB3ZSBsb29rIGZvcjoKLQotICAgICBtb3ZtIFtkMixkMyxhMixhM10sc3AgKG9wdGlvbmFsKQotICAgICBhZGQgPHNpemU+LHNwIChvcHRpb25hbCwgYW5kIG9ubHkgZm9yIHNpemVzIHdoaWNoIGZpdCBpbiBhbiB1bnNpZ25lZAotCQkgICAgOCBiaXQgbnVtYmVyKQotCi0gICAgIElmIHdlIGZpbmQgYW55dGhpbmcgZWxzZSwgd2UgcXVpdC4gICovCi0KLSAgLyogTG9vayBmb3IgbW92bSBbcmVnc10sc3AgKi8KLSAgYnl0ZTEgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJ5dGUyID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAxKTsKLQotICBpZiAoYnl0ZTEgPT0gMHhjZikKLSAgICB7Ci0gICAgICBoYXNoLT5tb3ZtX2FyZ3MgPSBieXRlMjsKLSAgICAgIGFkZHIgKz0gMjsKLSAgICAgIGJ5dGUxID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICAgICAgYnl0ZTIgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDEpOwotICAgIH0KLQotICAvKiBOb3cgZmlndXJlIG91dCBob3cgbXVjaCBzdGFjayBzcGFjZSB3aWxsIGJlIGFsbG9jYXRlZCBieSB0aGUgbW92bQotICAgICBpbnN0cnVjdGlvbi4gIFdlIG5lZWQgdGhpcyBrZXB0IHNlcGFyYXRlIGZyb20gdGhlIGZ1bnRpb24ncyBub3JtYWwKLSAgICAgc3RhY2sgc3BhY2UuICAqLwotICBpZiAoaGFzaC0+bW92bV9hcmdzKQotICAgIHsKLSAgICAgIC8qIFNwYWNlIGZvciBkMi4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg4MCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogU3BhY2UgZm9yIGQzLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDQwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiBTcGFjZSBmb3IgYTIuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MjApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFNwYWNlIGZvciBhMy4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgxMCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogIm90aGVyIiBzcGFjZS4gIGQwLCBkMSwgYTAsIGExLCBtZHIsIGxpciwgbGFyLCA0IGJ5dGUgcGFkLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDA4KQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA4ICogNDsKLQotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfYW0zMykKLQl7Ci0JICAvKiAiZXhvdGhlciIgc3BhY2UuICBlMCwgZTEsIG1kcnEsIG1jcmgsIG1jcmwsIG1jdmYgKi8KLQkgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDEpCi0JICAgIGhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA2ICogNDsKLQotCSAgLyogZXhyZWcxIHNwYWNlLiAgZTQsIGU1LCBlNiwgZTcgKi8KLQkgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDIpCi0JICAgIGhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0ICogNDsKLQotCSAgLyogZXhyZWcwIHNwYWNlLiAgZTIsIGUzICAqLwotCSAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4NCkKLQkgICAgaGFzaC0+bW92bV9zdGFja19zaXplICs9IDIgKiA0OwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSB0d28gc3RhY2sgYWRqdXN0bWVudCB2YXJpYW50cy4gICovCi0gIGlmIChieXRlMSA9PSAweGY4ICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICAgICAgdGVtcCA9ICgodGVtcCAmIDB4ZmYpIF4gKH4weDdmKSkgKyAweDgwOwotCi0gICAgICBoYXNoLT5zdGFja19zaXplID0gLXRlbXA7Ci0gICAgfQotICBlbHNlIGlmIChieXRlMSA9PSAweGZhICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmZmYpIF4gKH4weDdmZmYpKSArIDB4ODAwMDsKLSAgICAgIHRlbXAgPSAtdGVtcDsKLQotICAgICAgaWYgKHRlbXAgPCAyNTUpCi0JaGFzaC0+c3RhY2tfc2l6ZSA9IHRlbXA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSB0b3RhbCBzdGFjayB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgbW9yZQotICAgICB0aGFuIDI1NSBieXRlcywgdGhlbiB3ZSBjYW4ndCByZW1vdmUgdGhlIHN0YWNrIGFkanVzdG1lbnQgYnkgdXNpbmcKLSAgICAgImNhbGwiICh3ZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgIm1vdm0iIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGhhc2gtPnN0YWNrX3NpemUgKyBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgPiAyNTUpCi0gICAgaGFzaC0+c3RhY2tfc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCSAgIChlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdKTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKShlbGZfc3ltX2hhc2hlcyAoYWJmZCkpOwotICBzeW1faGFzaF9lbmQgPSAoc3ltX2hhc2gKLQkJICArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pCi0JCSAgICAgLSBzeW10YWJfaGRyLT5zaF9pbmZvKSk7Ci0gIGZvciAoOyBzeW1faGFzaCA8IHN5bV9oYXNoX2VuZDsgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gTU4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+ZGlyZWN0X2NhbGxzID0gMDsKLSAgICAgIHJldC0+c3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPm1vdm1fc3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+bW92bV9hcmdzID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gbW4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPmZsYWdzID0gMDsKLSAgcmV0LT5zdGF0aWNfaGFzaF90YWJsZQotICAgID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQtPnN0YXRpY19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0LT5zdGF0aWNfaGFzaF90YWJsZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIGludAotZWxmX21uMTAzMDBfbWFjaCAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTU4xMDMwMF9NQUNIKQotICAgIHsKLSAgICAgIGNhc2UgRV9NTjEwMzAwX01BQ0hfTU4xMDMwMDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBiZmRfbWFjaF9tbjEwMzAwOwotCi0gICAgICBjYXNlIEVfTU4xMDMwMF9NQUNIX0FNMzM6Ci0gICAgICAgIHJldHVybiBiZmRfbWFjaF9hbTMzOwotICAgIH0KLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCBhIE1OMTAzMDAgRUxGIG9iamVjdAotICAgZmlsZS4gIFRoaXMgZ2V0cyB0aGUgTU4xMDMwMCBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUKLSAgIG51bWJlci4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIGJmZF9tYWNoX21uMTAzMDA6Ci0JdmFsID0gRV9NTjEwMzAwX01BQ0hfTU4xMDMwMDsKLQlicmVhazsKLQotICAgICAgY2FzZSBiZmRfbWFjaF9hbTMzOgotCXZhbCA9IEVfTU4xMDMwMF9NQUNIX0FNMzM7Ci0JYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01OMTAzMDBfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotYm9vbGVhbgotX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tbjEwMzAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGZfbW4xMDMwMF9tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLSAgICAgICYmIGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAzMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDMwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAzMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDMwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQltbjEwMzAwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwltbjEwMzAwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCW1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCWVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0vKiBTbyB3ZSBjYW4gc2V0IGJpdHMgaW4gZV9mbGFncy4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3AKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYuYyBiL2JmZC9lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0M2EwZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjU0ICswLDAgQEAKLS8qIEVMRiBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0KLVNFQ1RJT04KLQlFTEYgYmFja2VuZHMKLQotCUJGRCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0cyBpcyBiZWluZyB3b3JrZWQgb24uCi0JQ3VycmVudGx5LCB0aGUgYmVzdCBzdXBwb3J0ZWQgYmFjayBlbmRzIGFyZSBmb3Igc3BhcmMgYW5kIGkzODYKLQkocnVubmluZyBzdnI0IG9yIFNvbGFyaXMgMikuCi0KLQlEb2N1bWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN1cHBvcnQgY29kZSBzdGlsbCBuZWVkcwotCXRvIGJlIHdyaXR0ZW4uICBUaGUgY29kZSBpcyBjaGFuZ2luZyBxdWlja2x5IGVub3VnaCB0aGF0IHdlCi0JaGF2ZW4ndCBib3RoZXJlZCB5ZXQuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNkZWZpbmUgQVJDSF9TSVpFIDAKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWFrZV9tYXBwaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBlbGZfc29ydF9zZWN0aW9ucyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3dhcF9vdXRfc3ltcyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqZWxmX3JlYWQgUEFSQU1TICgoYmZkICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgZWxmX2Zha2Vfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWFwX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZjb3JlX3JlYWRfbm90ZXMgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotLyogU3dhcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcwotICAgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKLSAgIG5lZWQgdG8gbW92ZSBpbnRvIGVsZmNvZGUuaC4gICovCi0KLS8qIFN3YXAgaW4gYSBWZXJkZWYgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBkc3QtPnZkX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbik7Ci0gIGRzdC0+dmRfZmxhZ3MgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9mbGFncyk7Ci0gIGRzdC0+dmRfbmR4ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9uZHgpOwotICBkc3QtPnZkX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfY250KTsKLSAgZHN0LT52ZF9oYXNoICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gpOwotICBkc3QtPnZkX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4KTsKLSAgZHN0LT52ZF9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbiwgZHN0LT52ZF92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzLCBkc3QtPnZkX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX25keCwgZHN0LT52ZF9uZHgpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfY250LCBkc3QtPnZkX2NudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9oYXNoLCBkc3QtPnZkX2hhc2gpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4LCBkc3QtPnZkX2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9uZXh0LCBkc3QtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyZGF1eCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGRzdC0+dmRhX25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25hbWUpOwotICBkc3QtPnZkYV9uZXh0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSwgZHN0LT52ZGFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmV4dCwgZHN0LT52ZGFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuZWVkIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgZHN0LT52bl92ZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24pOwotICBkc3QtPnZuX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fY250KTsKLSAgZHN0LT52bl9maWxlICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUpOwotICBkc3QtPnZuX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fYXV4KTsKLSAgZHN0LT52bl9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24sIGRzdC0+dm5fdmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bl9jbnQsIGRzdC0+dm5fY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUsIGRzdC0+dm5fZmlsZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9hdXgsIGRzdC0+dm5fYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX25leHQsIGRzdC0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgZHN0LT52bmFfaGFzaCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX2hhc2gpOwotICBkc3QtPnZuYV9mbGFncyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MpOwotICBkc3QtPnZuYV9vdGhlciA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfb3RoZXIpOwotICBkc3QtPnZuYV9uYW1lICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSk7Ci0gIGRzdC0+dm5hX25leHQgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCwgZHN0LT52bmFfaGFzaCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MsIGRzdC0+dm5hX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlciwgZHN0LT52bmFfb3RoZXIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25hbWUsIGRzdC0+dm5hX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQsIGRzdC0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gKmRzdDsKLXsKLSAgZHN0LT52c192ZXJzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZzX3ZlcnMpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcnN5bSBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycywgZHN0LT52c192ZXJzKTsKLX0KLQotLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICBEbyBub3QgY2hhbmdlIHRoaXMgZnVuY3Rpb247IHlvdSB3aWxsCi0gICBjYXVzZSBpbnZhbGlkIGhhc2ggdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gICovCi0KLXVuc2lnbmVkIGxvbmcKLWJmZF9lbGZfaGFzaCAobmFtZWFyZykKLSAgICAgY29uc3QgY2hhciAqbmFtZWFyZzsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWVhcmc7Ci0gIHVuc2lnbmVkIGxvbmcgaCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgZzsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSAqbmFtZSsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGggPSAoaCA8PCA0KSArIGNoOwotICAgICAgaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkKLQl7Ci0JICBoIF49IGcgPj4gMjQ7Ci0JICAvKiBUaGUgRUxGIEFCSSBzYXlzIGBoICY9IH5nJywgYnV0IHRoaXMgaXMgZXF1aXZhbGVudCBpbgotCSAgICAgdGhpcyBjYXNlIGFuZCBvbiBzb21lIG1hY2hpbmVzIG9uZSBpbnNuIGluc3RlYWQgb2YgdHdvLiAgKi8KLQkgIGggXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaDsKLX0KLQotLyogUmVhZCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0IGluIGFuIEVMRgotICAgZmlsZSwgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQotICAgYnVmZmVyLiAqLwotCi1zdGF0aWMgY2hhciAqCi1lbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKiBhYmZkOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoKGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYnVmOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICAvKiB0aGlzIGp1c3QgZG9lcyBpbml0aWFsaXphdGlvbiAqLwotICAvKiBjb2ZmX21rb2JqZWN0IHphbGxvYydzIHNwYWNlIGZvciB0ZGF0YS5jb2ZmX29ial9kYXRhIC4uLiAqLwotICBlbGZfdGRhdGEgKGFiZmQpID0gKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55Ci0gICAgIGluaXRpYWxpemF0aW9uPyAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rY29yZWZpbGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIEkgdGhpbmsgdGhpcyBjYW4gYmUgZG9uZSBqdXN0IGxpa2UgYW4gb2JqZWN0IGZpbGUuICovCi0gIHJldHVybiBiZmRfZWxmX21rb2JqZWN0IChhYmZkKTsKLX0KLQotY2hhciAqCi1iZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWIgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2hzdHJ0YWJzaXplOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCA9PSAwIHx8IGlfc2hkcnBbc2hpbmRleF0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzaHN0cnRhYiA9IChjaGFyICopIGlfc2hkcnBbc2hpbmRleF0tPmNvbnRlbnRzOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBjYWNoZWQgb25lLCBhdHRlbXB0IHRvIHJlYWQsIGFuZCBjYWNoZSB3aGF0IHdlIHJlYWQuICovCi0gICAgICBvZmZzZXQgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9vZmZzZXQ7Ci0gICAgICBzaHN0cnRhYnNpemUgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9zaXplOwotICAgICAgc2hzdHJ0YWIgPSBlbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaHN0cnRhYnNpemUpOwotICAgICAgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHMgPSAoUFRSKSBzaHN0cnRhYjsKLSAgICB9Ci0gIHJldHVybiBzaHN0cnRhYjsKLX0KLQotY2hhciAqCi1iZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBzaGluZGV4LCBzdHJpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzdHJpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoc3RyaW5kZXggPT0gMCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLQotICBpZiAoaGRyLT5jb250ZW50cyA9PSBOVUxMCi0gICAgICAmJiBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RyaW5kZXggPj0gaGRyLT5zaF9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJpbmRleCwgKHVuc2lnbmVkIGxvbmcpIGhkci0+c2hfc2l6ZSwKLQkgKChzaGluZGV4ID09IGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgKLQkgICAmJiBzdHJpbmRleCA9PSBoZHItPnNoX25hbWUpCi0JICA/ICIuc2hzdHJ0YWIiCi0JICA6IGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiIChhYmZkLCBoZHItPnNoX25hbWUpKSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gIHJldHVybiAoKGNoYXIgKikgaGRyLT5jb250ZW50cykgKyBzdHJpbmRleDsKLX0KLQotLyogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24uICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlCi0gICBCRkQgc2VjdGlvbiBpbiB0aGUgYmZkX3NlY3Rpb24gZmllbGQgb2YgdGhlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChzdHJjbXAgKG5hbWUsCi0JCQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKSkgPT0gMCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfYWRkcikKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAgICBiZmRfbG9nMiAoaGRyLT5zaF9hZGRyYWxpZ24pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCWZsYWdzIHw9IFNFQ19MT0FEOwotICAgIH0KLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfQ09ERTsKLSAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgLyogVGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBhcHBlYXIgdG8gYmUgcmVjb2duaXplZCBvbmx5IGJ5IG5hbWUsIG5vdAotICAgICBhbnkgc29ydCBvZiBmbGFnLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0gICAgICB8fCBzdHJuY21wIChuYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBwaGRycyB0byBzZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxtYS4KLSAgICAgICAgIElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgYXJlIHplcm8sIHdlIGlnbm9yZSB0aGVtLCBzaW5jZQotICAgICAgICAgc29tZSBFTEYgbGlua2VycyBwcm9kdWNlIHN1Y2ggb3V0cHV0LiAgKi8KLSAgICAgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQl7Ci0JICBpZiAocGhkci0+cF9wYWRkciAhPSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtKQotCXsKLQkgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotCSAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQkgICAgewotCSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICYmIHBoZHItPnBfdmFkZHIgIT0gcGhkci0+cF9wYWRkcgotCQkgICYmIHBoZHItPnBfdmFkZHIgPD0gaGRyLT5zaF9hZGRyCi0JCSAgJiYgKHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6Ci0JCSAgICAgID49IGhkci0+c2hfYWRkciArIGhkci0+c2hfc2l6ZSkKLQkJICAmJiAoKGZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkJICAgICAgfHwgKHBoZHItPnBfb2Zmc2V0IDw9IChiZmRfdm1hKSBoZHItPnNoX29mZnNldAotCQkJICAmJiAocGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzegotCQkJICAgICAgPj0gaGRyLT5zaF9vZmZzZXQgKyBoZHItPnNoX3NpemUpKSkpCi0JCXsKLQkJICBuZXdzZWN0LT5sbWEgKz0gcGhkci0+cF9wYWRkciAtIHBoZHItPnBfdmFkZHI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT50aGlzX2hkciA9ICpoZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9lbGZfZmluZF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0Jc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiAoYmZkICphYmZkLCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgZnVuY3Rpb25zIGZvciBHREIgdG8gbG9jYXRlIHRoZSBzdHJpbmcgdGFibGVzLgotCVNpbmNlIEJGRCBoaWRlcyBzdHJpbmcgdGFibGVzIGZyb20gY2FsbGVycywgR0RCIG5lZWRzIHRvIHVzZSBhbgotCWludGVybmFsIGhvb2sgdG8gZmluZCB0aGVtLiAgU3VuJ3MgLnN0YWJzdHIsIGluIHBhcnRpY3VsYXIsCi0JaXNuJ3QgZXZlbiBwb2ludGVkIHRvIGJ5IHRoZSAuc3RhYiBzZWN0aW9uLCBzbyBvcmRpbmFyeQotCW1lY2hhbmlzbXMgd291bGRuJ3Qgd29yayB0byBmaW5kIGl0LCBldmVuIGlmIHdlIGhhZCBzb21lLgotKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIGNoYXIgKnNoc3RydGFiOwotICB1bnNpZ25lZCBpbnQgbWF4OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaHN0cnRhYiA9IGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uCi0JKGFiZmQsIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4KTsKLSAgICAgIGlmIChzaHN0cnRhYiAhPSBOVUxMKQotCXsKLQkgIG1heCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCSAgZm9yIChpID0gMTsgaSA8IG1heDsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoJnNoc3RydGFiW2lfc2hkcnBbaV0tPnNoX25hbWVdLCBuYW1lKSkKLQkgICAgICByZXR1cm4gaV9zaGRycFtpXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciAqY29uc3QgYmZkX2VsZl9zZWN0aW9uX3R5cGVfbmFtZXNbXSA9IHsKLSAgIlNIVF9OVUxMIiwgIlNIVF9QUk9HQklUUyIsICJTSFRfU1lNVEFCIiwgIlNIVF9TVFJUQUIiLAotICAiU0hUX1JFTEEiLCAiU0hUX0hBU0giLCAiU0hUX0RZTkFNSUMiLCAiU0hUX05PVEUiLAotICAiU0hUX05PQklUUyIsICJTSFRfUkVMIiwgIlNIVF9TSExJQiIsICJTSFRfRFlOU1lNIiwKLX07Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopIGZhcmc7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0KLSAgcCA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGM7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuUHJvZ3JhbSBIZWFkZXI6XG4iKSk7Ci0gICAgICBjID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrLCBwKyspCi0JewotCSAgY29uc3QgY2hhciAqczsKLQkgIGNoYXIgYnVmWzIwXTsKLQotCSAgc3dpdGNoIChwLT5wX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBQVF9OVUxMOiBzID0gIk5VTEwiOyBicmVhazsKLQkgICAgY2FzZSBQVF9MT0FEOiBzID0gIkxPQUQiOyBicmVhazsKLQkgICAgY2FzZSBQVF9EWU5BTUlDOiBzID0gIkRZTkFNSUMiOyBicmVhazsKLQkgICAgY2FzZSBQVF9JTlRFUlA6IHMgPSAiSU5URVJQIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfTk9URTogcyA9ICJOT1RFIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hMSUI6IHMgPSAiU0hMSUIiOyBicmVhazsKLQkgICAgY2FzZSBQVF9QSERSOiBzID0gIlBIRFIiOyBicmVhazsKLQkgICAgZGVmYXVsdDogc3ByaW50ZiAoYnVmLCAiMHglbHgiLCBwLT5wX3R5cGUpOyBzID0gYnVmOyBicmVhazsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIiU4cyBvZmYgICAgMHgiLCBzKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX29mZnNldCk7Ci0JICBmcHJpbnRmIChmLCAiIHZhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF92YWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIHBhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9wYWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIGFsaWduIDIqKiV1XG4iLCBiZmRfbG9nMiAocC0+cF9hbGlnbikpOwotCSAgZnByaW50ZiAoZiwgIiAgICAgICAgIGZpbGVzeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfZmlsZXN6KTsKLQkgIGZwcmludGYgKGYsICIgbWVtc3ogMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX21lbXN6KTsKLQkgIGZwcmludGYgKGYsICIgZmxhZ3MgJWMlYyVjIiwKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9SKSAhPSAwID8gJ3InIDogJy0nLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1cpICE9IDAgPyAndycgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfWCkgIT0gMCA/ICd4JyA6ICctJyk7Ci0JICBpZiAoKHAtPnBfZmxhZ3MgJn4gKFBGX1IgfCBQRl9XIHwgUEZfWCkpICE9IDApCi0JICAgIGZwcmludGYgKGYsICIgJWx4IiwgcC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSk7Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGVsZnNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgICAgIGJmZF9ieXRlICpleHRkeW4sICpleHRkeW5lbmQ7Ci0gICAgICBzaXplX3QgZXh0ZHluc2l6ZTsKLSAgICAgIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuRHluYW1pYyBTZWN0aW9uOlxuIikpOwotCi0gICAgICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkeW5idWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgcy0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLSAgICAgIGlmIChlbGZzZWMgPT0gLTEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0gICAgICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOwotICAgICAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gICAgICBleHRkeW4gPSBkeW5idWY7Ci0gICAgICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7Ci0gICAgICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGFiWzIwXTsKLQkgIGJvb2xlYW4gc3RyaW5ncDsKLQotCSAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIHN0cmluZ3AgPSBmYWxzZTsKLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3ByaW50ZiAoYWIsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSBkeW4uZF90YWcpOwotCSAgICAgIG5hbWUgPSBhYjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX05FRURFRDogbmFtZSA9ICJORUVERUQiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiUExUUkVMU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6IG5hbWUgPSAiUExUR09UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSEFTSDogbmFtZSA9ICJIQVNIIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOiBuYW1lID0gIlNUUlRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTVRBQjogbmFtZSA9ICJTWU1UQUIiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOiBuYW1lID0gIlJFTEEiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBU1o6IG5hbWUgPSAiUkVMQVNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQUVOVDogbmFtZSA9ICJSRUxBRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSU1o6IG5hbWUgPSAiU1RSU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1FTlQ6IG5hbWUgPSAiU1lNRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDogbmFtZSA9ICJJTklUIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfRklOSTogbmFtZSA9ICJGSU5JIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU09OQU1FOiBuYW1lID0gIlNPTkFNRSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9SUEFUSDogbmFtZSA9ICJSUEFUSCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1CT0xJQzogbmFtZSA9ICJTWU1CT0xJQyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTDogbmFtZSA9ICJSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxTWjogbmFtZSA9ICJSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEVOVDogbmFtZSA9ICJSRUxFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUw6IG5hbWUgPSAiUExUUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfREVCVUc6IG5hbWUgPSAiREVCVUciOyBicmVhazsKLQkgICAgY2FzZSBEVF9URVhUUkVMOiBuYW1lID0gIlRFWFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6IG5hbWUgPSAiSk1QUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfQVVYSUxJQVJZOiBuYW1lID0gIkFVWElMSUFSWSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSUxURVI6IG5hbWUgPSAiRklMVEVSIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUlNZTTogbmFtZSA9ICJWRVJTWU0iOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUY6IG5hbWUgPSAiVkVSREVGIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSREVGTlVNOiBuYW1lID0gIlZFUkRFRk5VTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6IG5hbWUgPSAiVkVSTkVFRCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUROVU06IG5hbWUgPSAiVkVSTkVFRE5VTSI7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGZwcmludGYgKGYsICIgICUtMTFzICIsIG5hbWUpOwotCSAgaWYgKCEgc3RyaW5ncCkKLQkgICAgZnByaW50ZiAoZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotCSAgICAgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJZHluLmRfdW4uZF92YWwpOwotCSAgICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnByaW50ZiAoZiwgIiVzIiwgc3RyaW5nKTsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIlxuIik7Ci0JfQotCi0gICAgICBmcmVlIChkeW5idWYpOwotICAgICAgZHluYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQotICAgICAgfHwgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnQ7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dmRfbmV4dGRlZikKLQl7Ci0JICBmcHJpbnRmIChmLCAiJWQgMHglMi4yeCAweCU4LjhseCAlc1xuIiwgdC0+dmRfbmR4LAotCQkgICB0LT52ZF9mbGFncywgdC0+dmRfaGFzaCwgdC0+dmRfbm9kZW5hbWUpOwotCSAgaWYgKHQtPnZkX2F1eHB0ci0+dmRhX25leHRwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICphOwotCi0JICAgICAgZnByaW50ZiAoZiwgIlx0Iik7Ci0JICAgICAgZm9yIChhID0gdC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0cjsKLQkJICAgYSAhPSBOVUxMOwotCQkgICBhID0gYS0+dmRhX25leHRwdHIpCi0JCWZwcmludGYgKGYsICIlcyAiLCBhLT52ZGFfbm9kZW5hbWUpOwotCSAgICAgIGZwcmludGYgKGYsICJcbiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIFJlZmVyZW5jZXM6XG4iKSk7Ci0gICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZuX25leHRyZWYpCi0JewotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkgIGZwcmludGYgKGYsIF8oIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIpLCB0LT52bl9maWxlbmFtZSk7Ci0JICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCSAgICBmcHJpbnRmIChmLCAiICAgIDB4JTguOGx4IDB4JTIuMnggJTIuMmQgJXNcbiIsIGEtPnZuYV9oYXNoLAotCQkgICAgIGEtPnZuYV9mbGFncywgYS0+dm5hX290aGVyLCBhLT52bmFfbm9kZW5hbWUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgRUxGLXNwZWNpZmljIGZpZWxkcyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWJmZF9lbGZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImVsZiAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0JQ09OU1QgY2hhciAqbmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQl1bnNpZ25lZCBjaGFyIHN0X290aGVyOwotCQotCXNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbiA/IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSA6ICIoKm5vbmUqKSI7Ci0KLQliZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0JaWYgKGJlZC0+ZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCkKLQkgICAgbmFtZSA9ICgqYmVkLT5lbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsKSAoYWJmZCwgZmlsZXAsIHN5bWJvbCk7Ci0KLQlpZiAobmFtZSA9PSBOVUxMKQotCSAgewotCSAgICBuYW1lID0gc3ltYm9sLT5uYW1lOyAgCi0JICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiICVzXHQiLCBzZWN0aW9uX25hbWUpOwotCS8qIFByaW50IHRoZSAib3RoZXIiIHZhbHVlIGZvciBhIHN5bWJvbC4gIEZvciBjb21tb24gc3ltYm9scywKLQkgICB3ZSd2ZSBhbHJlYWR5IHByaW50ZWQgdGhlIHNpemU7IG5vdyBwcmludCB0aGUgYWxpZ25tZW50LgotCSAgIEZvciBvdGhlciBzeW1ib2xzLCB3ZSBoYXZlIG5vIHNwZWNpZmllZCBhbGlnbm1lbnQsIGFuZAotCSAgIHdlJ3ZlIHByaW50ZWQgdGhlIGFkZHJlc3M7IG5vdyBwcmludCB0aGUgc2l6ZS4gICovCi0JZnByaW50Zl92bWEgKGZpbGUsCi0JCSAgICAgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotCQkgICAgICA/ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUKLQkJICAgICAgOiAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpKTsKLQotCS8qIElmIHdlIGhhdmUgdmVyc2lvbiBpbmZvcm1hdGlvbiwgcHJpbnQgaXQuICAqLwotCWlmIChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1fc2VjdGlvbiAhPSAwCi0JICAgICYmIChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfc2VjdGlvbiAhPSAwCi0JCXx8IGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9zZWN0aW9uICE9IDApKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgdmVybnVtOwotCSAgICBjb25zdCBjaGFyICp2ZXJzaW9uX3N0cmluZzsKLQotCSAgICB2ZXJudW0gPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT52ZXJzaW9uICYgVkVSU1lNX1ZFUlNJT047Ci0KLQkgICAgaWYgKHZlcm51bSA9PSAwKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0gIiI7Ci0JICAgIGVsc2UgaWYgKHZlcm51bSA9PSAxKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0gIkJhc2UiOwotCSAgICBlbHNlIGlmICh2ZXJudW0gPD0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMpCi0JICAgICAgdmVyc2lvbl9zdHJpbmcgPQotCQllbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV0udmRfbm9kZW5hbWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0JCXZlcnNpb25fc3RyaW5nID0gIiI7Ci0JCWZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKLQkJICAgICB0ICE9IE5VTEw7Ci0JCSAgICAgdCA9IHQtPnZuX25leHRyZWYpCi0JCSAgewotCQkgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkJICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgICAgIHsKLQkJCWlmIChhLT52bmFfb3RoZXIgPT0gdmVybnVtKQotCQkJICB7Ci0JCQkgICAgdmVyc2lvbl9zdHJpbmcgPSBhLT52bmFfbm9kZW5hbWU7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKCgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT52ZXJzaW9uICYgVkVSU1lNX0hJRERFTikgPT0gMCkKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiICAlLTExcyIsIHZlcnNpb25fc3RyaW5nKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IGk7Ci0KLQkJZnByaW50ZiAoZmlsZSwgIiAoJXMpIiwgdmVyc2lvbl9zdHJpbmcpOwotCQlmb3IgKGkgPSAxMCAtIHN0cmxlbiAodmVyc2lvbl9zdHJpbmcpOyBpID4gMDsgLS1pKQotCQkgIHB1dGMgKCcgJywgZmlsZSk7Ci0JICAgICAgfQotCSAgfQotCi0JLyogSWYgdGhlIHN0X290aGVyIGZpZWxkIGlzIG5vdCB6ZXJvLCBwcmludCBpdC4gICovCi0Jc3Rfb3RoZXIgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyOwotCQotCXN3aXRjaCAoc3Rfb3RoZXIpCi0JICB7Ci0JICBjYXNlIDA6IGJyZWFrOwotCSAgY2FzZSBTVFZfSU5URVJOQUw6ICBmcHJpbnRmIChmaWxlLCAiIC5pbnRlcm5hbCIpOyAgYnJlYWs7Ci0JICBjYXNlIFNUVl9ISURERU46ICAgIGZwcmludGYgKGZpbGUsICIgLmhpZGRlbiIpOyAgICBicmVhazsKLQkgIGNhc2UgU1RWX1BST1RFQ1RFRDogZnByaW50ZiAoZmlsZSwgIiAucHJvdGVjdGVkIik7IGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgLyogU29tZSBvdGhlciBub24tZGVmaW5lZCBmbGFncyBhcmUgYWxzbyBwcmVzZW50LCBzbyBwcmludAotCSAgICAgICBldmVyeXRoaW5nIGhleC4gICovCi0JICAgIGZwcmludGYgKGZpbGUsICIgMHglMDJ4IiwgKHVuc2lnbmVkIGludCkgc3Rfb3RoZXIpOwotCSAgfQotCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5zaXplID0gMDsKLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAwOwotICAgICAgcmV0LT53ZWFrZGVmID0gTlVMTDsKLSAgICAgIHJldC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0gICAgICByZXQtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IE5VTEw7Ci0gICAgICByZXQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSAwOwotICAgICAgcmV0LT52dGFibGVfcGFyZW50ID0gTlVMTDsKLSAgICAgIHJldC0+dHlwZSA9IFNUVF9OT1RZUEU7Ci0gICAgICByZXQtPm90aGVyID0gMDsKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBub24tRUxGIHN5bWJvbCByZWFkZXIuCi0gICAgICAgICBUaGlzIGZsYWcgaXMgdGhlbiByZXNldCBieSB0aGUgY29kZSB3aGljaCByZWFkcyBhbiBFTEYgaW5wdXQKLSAgICAgICAgIGZpbGUuICBUaGlzIGVuc3VyZXMgdGhhdCBhIHN5bWJvbCBjcmVhdGVkIGJ5IGEgbm9uLUVMRiBzeW1ib2wKLSAgICAgICAgIHJlYWRlciB3aWxsIGhhdmUgdGhlIGZsYWcgc2V0IGNvcnJlY3RseS4gICovCi0gICAgICByZXQtPmVsZl9saW5rX2hhc2hfZmxhZ3MgPSBFTEZfTElOS19OT05fRUxGOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENvcHkgZGF0YSBmcm9tIGFuIGluZGlyZWN0IHN5bWJvbCB0byBpdHMgZGlyZWN0IHN5bWJvbCwgaGlkaW5nIHRoZQotICAgb2xkIGluZGlyZWN0IHN5bWJvbC4gICovCi0KLXZvaWQKLV9iZmRfZWxmX2xpbmtfaGFzaF9jb3B5X2luZGlyZWN0IChkaXIsIGluZCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmRpciwgKmluZDsKLXsKLSAgLyogQ29weSBkb3duIGFueSByZWZlcmVuY2VzIHRoYXQgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRvIHRoZQotICAgICBzeW1ib2wgd2hpY2gganVzdCBiZWNhbWUgaW5kaXJlY3QuICAqLwotCi0gIGRpci0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotICAgIChpbmQtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLSAgICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQwotCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLCi0JfCBFTEZfTElOS19OT05fR09UX1JFRikpOwotCi0gIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBvZmZzZXQgZW50cmllcy4KLSAgICAgVGhlc2UgbWF5IGhhdmUgYmVlbiBhbHJlYWR5IHNldCB1cCBieSBhIGNoZWNrX3JlbG9jcyByb3V0aW5lLiAgKi8KLSAgaWYgKGRpci0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgZGlyLT5nb3Qub2Zmc2V0ID0gaW5kLT5nb3Qub2Zmc2V0OwotICAgICAgaW5kLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLSAgQkZEX0FTU0VSVCAoaW5kLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLSAgaWYgKGRpci0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgZGlyLT5wbHQub2Zmc2V0ID0gaW5kLT5wbHQub2Zmc2V0OwotICAgICAgaW5kLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLSAgQkZEX0FTU0VSVCAoaW5kLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLSAgaWYgKGRpci0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBkaXItPmR5bmluZHggPSBpbmQtPmR5bmluZHg7Ci0gICAgICBkaXItPmR5bnN0cl9pbmRleCA9IGluZC0+ZHluc3RyX2luZGV4OwotICAgICAgaW5kLT5keW5pbmR4ID0gLTE7Ci0gICAgICBpbmQtPmR5bnN0cl9pbmRleCA9IDA7Ci0gICAgfQotICBCRkRfQVNTRVJUIChpbmQtPmR5bmluZHggPT0gLTEpOwotfQotCi12b2lkCi1fYmZkX2VsZl9saW5rX2hhc2hfaGlkZV9zeW1ib2woaCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotICBoLT5keW5pbmR4ID0gLTE7Ci0gIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICB0YWJsZS0+ZHlub2JqID0gTlVMTDsKLSAgLyogVGhlIGZpcnN0IGR5bmFtaWMgc3ltYm9sIGlzIGEgZHVtbXkuICAqLwotICB0YWJsZS0+ZHluc3ltY291bnQgPSAxOwotICB0YWJsZS0+ZHluc3RyID0gTlVMTDsKLSAgdGFibGUtPmJ1Y2tldGNvdW50ID0gMDsKLSAgdGFibGUtPm5lZWRlZCA9IE5VTEw7Ci0gIHRhYmxlLT5oZ290ID0gTlVMTDsKLSAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7Ci0gIHRhYmxlLT5keW5sb2NhbCA9IE5VTEw7Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBFTEYgZW11bGF0aW9uIGNvZGUgaW4gdGhlIGdlbmVyaWMgbGlua2VyIHRvCi0gICB0ZWxsIHRoZSBiYWNrZW5kIGxpbmtlciB3aGF0IGZpbGUgbmFtZSB0byB1c2UgZm9yIHRoZSBEVF9ORUVERUQKLSAgIGVudHJ5IGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgVGhlIGdlbmVyaWMgbGlua2VyIHBhc3NlcyBuYW1lIGFzIGFuCi0gICBlbXB0eSBzdHJpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGJlIG1hZGUuICAqLwotCi12b2lkCi1iZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOwotfQotCi0vKiBHZXQgdGhlIGxpc3Qgb2YgRFRfTkVFREVEIGVudHJpZXMgZm9yIGEgbGluay4gIFRoaXMgaXMgYSBob29rIGZvcgotICAgdGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgYWN0dWFsbHkgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBmb3IgYSBsaW5rLiAgVGhpcwotICAgaXMgdGhlIFNPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcyBvbmUuICBPdGhlcndpc2UsIGl0IGlzIHRoZSBzdHJpbmcKLSAgIHBhc3NlZCB0byBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSwgb3IgaXQgaXMgdGhlIGZpbGVuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZWxmX2dldF9kdF9zb25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIGVsZl9kdF9uYW1lIChhYmZkKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmcm9tIGEgQkZELiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gY29kZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKipwbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0gIGludCBlbGZzZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgc2l6ZV90IGV4dGR5bnNpemU7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgKnBuZWVkZWQgPSBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHluYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChkeW5idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgcy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICBpZiAoZWxmc2VjID09IC0xKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgZXh0ZHluc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bjsKLSAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gIGV4dGR5biA9IGR5bmJ1ZjsKLSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplOwotICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotICAgICAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQlicmVhazsKLQotICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JewotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICBzdHJpbmcgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJICAgIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGwgPSAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpsKTsKLQkgIGlmIChsID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBsLT5ieSA9IGFiZmQ7Ci0JICBsLT5uYW1lID0gc3RyaW5nOwotCSAgbC0+bmV4dCA9ICpwbmVlZGVkOwotCSAgKnBuZWVkZWQgPSBsOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoZHluYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFsbG9jYXRlIGFuIEVMRiBzdHJpbmcgdGFibGUtLWZvcmNlIHRoZSBmaXJzdCBieXRlIHRvIGJlIHplcm8uICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsb2M7Ci0KLSAgICAgIGxvYyA9IF9iZmRfc3RyaW5ndGFiX2FkZCAocmV0LCAiIiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgQkZEX0FTU0VSVCAobG9jID09IDAgfHwgbG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSk7Ci0gICAgICBpZiAobG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBfYmZkX3N0cmluZ3RhYl9mcmVlIChyZXQpOwotCSAgcmV0ID0gTlVMTDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBzZWN0aW9uIGhlYWRlci4gKi8KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaGluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHIgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSk7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6Ci0gICAgICAvKiBJbmFjdGl2ZSBzZWN0aW9uLiBUaHJvdyBpdCBhd2F5LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBTSFRfUFJPR0JJVFM6CS8qIE5vcm1hbCBzZWN0aW9uIHdpdGggY29udGVudHMuICAqLwotICAgIGNhc2UgU0hUX0RZTkFNSUM6CS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSBTSFRfTk9CSVRTOgkvKiAuYnNzIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX0hBU0g6CS8qIC5oYXNoIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX05PVEU6CS8qIC5ub3RlIHNlY3Rpb24uICAqLwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9TWU1UQUI6CQkvKiBBIHN5bWJvbCB0YWJsZSAqLwotICAgICAgaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gMCk7Ci0gICAgICBlbGZfb25lc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyID0gKmhkcjsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gICAgICAvKiBTb21ldGltZXMgYSBzaGFyZWQgb2JqZWN0IHdpbGwgbWFwIGluIHRoZSBzeW1ib2wgdGFibGUuICBJZgotICAgICAgICAgU0hGX0FMTE9DIGlzIHNldCwgYW5kIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIHdlIGFsc28KLSAgICAgICAgIHRyZWF0IHRoaXMgc2VjdGlvbiBhcyBhIEJGRCBzZWN0aW9uLiAgV2UgY2FuIG5vdCBiYXNlIHRoZQotICAgICAgICAgZGVjaXNpb24gcHVyZWx5IG9uIFNIRl9BTExPQywgYmVjYXVzZSB0aGF0IGZsYWcgaXMgc29tZXRpbWVzCi0gICAgICAgICBzZXQgaW4gYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdGhlCi0gICAgICAgICBsaW5rZXIuICAqLwotICAgICAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JICAmJiAhIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgU0hUX0RZTlNZTToJCS8qIEEgZHluYW1pYyBzeW1ib2wgdGFibGUgKi8KLSAgICAgIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBzaGluZGV4KQotCXJldHVybiB0cnVlOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX2VudHNpemUgPT0gYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApOwotICAgICAgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkciA9ICpoZHI7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAgICAgLyogQmVzaWRlcyBiZWluZyBhIHN5bWJvbCB0YWJsZSwgd2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhcgotCSBzZWN0aW9uLCBzbyB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1NUUlRBQjoJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0gICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgaWYgKGVoZHItPmVfc2hzdHJuZHggPT0gc2hpbmRleCkKLQl7Ci0JICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIgPSAqaGRyOwotCSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JICAgIGlmIChoZHIyLT5zaF9saW5rID09IHNoaW5kZXgpCi0JICAgICAgewotCQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IGkpCi0JCSAgewotCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkciA9ICpoZHI7Ci0JCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0KLQkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JCWlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBpKQotCQkgIHsKLQkJICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHIgPSAqaGRyOwotCQkgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9Ci0JCSAgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zdHJ0YWJfaGRyOwotCQkgICAgLyogV2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhciBzZWN0aW9uLCBzbwotCQkgICAgICAgdGhhdCBvYmpjb3B5IGNhbiBoYW5kbGUgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0JCSAgfQotI2lmIDAgLyogTm90IGhhbmRsaW5nIG90aGVyIHN0cmluZyB0YWJsZXMgc3BlY2lhbGx5IHJpZ2h0IG5vdy4gICovCi0JCWhkcjIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwkvKiBpbiBjYXNlIGl0IG1vdmVkICovCi0JCS8qIFdlIGhhdmUgYSBzdHJ0YWIgZm9yIHNvbWUgcmFuZG9tIG90aGVyIHNlY3Rpb24uICAqLwotCQluZXdzZWN0ID0gKGFzZWN0aW9uICopIGhkcjItPmJmZF9zZWN0aW9uOwotCQlpZiAoIW5ld3NlY3QpCi0JCSAgYnJlYWs7Ci0JCWhkci0+YmZkX3NlY3Rpb24gPSBuZXdzZWN0OwotCQloZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT5zdHJfaGRyOwotCQkqaGRyMiA9ICpoZHI7Ci0JCWVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIyOwotI2VuZGlmCi0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1JFTDoKLSAgICBjYXNlIFNIVF9SRUxBOgotICAgICAgLyogKlRoZXNlKiBkbyBhIGxvdCBvZiB3b3JrIC0tIGJ1dCBidWlsZCBubyBzZWN0aW9ucyEgICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKnRhcmdldF9zZWN0OwotCUVsZl9JbnRlcm5hbF9TaGRyICpoZHIyOwotCi0JLyogQ2hlY2sgZm9yIGEgYm9ndXMgbGluayB0byBhdm9pZCBjcmFzaGluZy4gICovCi0JaWYgKGhkci0+c2hfbGluayA+PSBlaGRyLT5lX3NobnVtKQotCSAgewotCSAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAoXygiJXM6IGludmFsaWQgbGluayAlbHUgZm9yIHJlbG9jIHNlY3Rpb24gJXMgKGluZGV4ICV1KSIpLAotCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBoZHItPnNoX2xpbmssIG5hbWUsIHNoaW5kZXgpKTsKLQkgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0JICB9Ci0KLQkvKiBGb3Igc29tZSBpbmNvbXByZWhlbnNpYmxlIHJlYXNvbiBPcmFjbGUgZGlzdHJpYnV0ZXMKLQkgICBsaWJyYXJpZXMgZm9yIFNvbGFyaXMgaW4gd2hpY2ggc29tZSBvZiB0aGUgb2JqZWN0cyBoYXZlCi0JICAgYm9ndXMgc2hfbGluayBmaWVsZHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGp1c3QKLQkgICByZWplY3QgdGhlbSwgYnV0LCB1bmZvcnR1bmF0ZWx5LCBzb21lIHBlb3BsZSBuZWVkIHRvIHVzZQotCSAgIHRoZW0uICBXZSBzY2FuIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVyczsgaWYgd2UgZmluZCBvbmx5Ci0JICAgb25lIHN1aXRhYmxlIHN5bWJvbCB0YWJsZSwgd2UgY2xvYmJlciB0aGUgc2hfbGluayB0byBwb2ludAotCSAgIHRvIGl0LiAgSSBob3BlIHRoaXMgZG9lc24ndCBicmVhayBhbnl0aGluZy4gICovCi0JaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCi0JICAgICYmIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQotCSAgewotCSAgICBpbnQgc2NhbjsKLQkgICAgaW50IGZvdW5kOwotCi0JICAgIGZvdW5kID0gMDsKLQkgICAgZm9yIChzY2FuID0gMTsgc2NhbiA8IGVoZHItPmVfc2hudW07IHNjYW4rKykKLQkgICAgICB7Ci0JCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NjYW5dLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkJICAgIHx8IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkJICB7Ci0JCSAgICBpZiAoZm91bmQgIT0gMCkKLQkJICAgICAgewotCQkJZm91bmQgPSAwOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvdW5kID0gc2NhbjsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZm91bmQgIT0gMCkKLQkgICAgICBoZHItPnNoX2xpbmsgPSBmb3VuZDsKLQkgIH0KLQotCS8qIEdldCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkgICAgJiYgISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfbGluaykpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJZiB0aGlzIHJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSB3ZQotCSAgIGRvbid0IHRyZWF0IGl0IGFzIGEgcmVsb2Mgc2VjdGlvbi4gIEJGRCBjYW4ndCBhZGVxdWF0ZWx5Ci0JICAgcmVwcmVzZW50IHN1Y2ggYSBzZWN0aW9uLCBzbyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBkb24ndAotCSAgIHRyeS4gIFdlIGp1c3QgcHJlc2VudCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLiAgKi8KLQlpZiAoaGRyLT5zaF9saW5rICE9IGVsZl9vbmVzeW10YWIgKGFiZmQpKQotCSAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfaW5mbykpCi0JICByZXR1cm4gZmFsc2U7Ci0JdGFyZ2V0X3NlY3QgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaGRyLT5zaF9pbmZvKTsKLQlpZiAodGFyZ2V0X3NlY3QgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmICgodGFyZ2V0X3NlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgIHx8IHRhcmdldF9zZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCSAgaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHI7Ci0JZWxzZQotCSAgewotCSAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID09IE5VTEwpOwotCSAgICBoZHIyID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaGRyMikpOwotCSAgICBlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID0gaGRyMjsKLQkgIH0KLQkqaGRyMiA9ICpoZHI7Ci0JZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ICs9IGhkci0+c2hfc2l6ZSAvIGhkci0+c2hfZW50c2l6ZTsKLQl0YXJnZXRfc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCXRhcmdldF9zZWN0LT5yZWxvY2F0aW9uID0gTlVMTDsKLQl0YXJnZXRfc2VjdC0+cmVsX2ZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKLQkvKiBJbiB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGUgcmVsb2NhdGlvbnMgYXBwbHksIG1hcmsgd2hldGhlcgotCSAgIGl0cyByZWxvY2F0aW9ucyBhcmUgb2YgdGhlIFJFTCBvciBSRUxBIHZhcmlldHkuICAqLwotCWlmIChoZHItPnNoX3NpemUgIT0gMCkKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+dXNlX3JlbGFfcAotCSAgICA9IChoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpOwotCWFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3ZlcmRlZjoKLSAgICAgIGVsZl9keW52ZXJkZWYgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJzeW06Ci0gICAgICBlbGZfZHludmVyc3ltIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyID0gKmhkcjsKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoKLSAgICAgIGVsZl9keW52ZXJyZWYgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX1NITElCOgotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQ2hlY2sgZm9yIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0gICAgICB7Ci0JaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpCi0JICAoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgc2VjdGlvbiBudW1iZXIsIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIEJGRAotICAgc2VjdGlvbi4gICovCi0KLWFzZWN0aW9uICoKLWJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIEJGRF9BU1NFUlQgKGluZGV4ID4gMCAmJiBpbmRleCA8IFNITl9MT1JFU0VSVkUpOwotICBpZiAoaW5kZXggPj0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW0pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2luZGV4XS0+YmZkX3NlY3Rpb247Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKnNkYXRhOwotCi0gIHNkYXRhID0gKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCpzZGF0YSkpOwotICBpZiAoIXNkYXRhKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjLT51c2VkX2J5X2JmZCA9IChQVFIpIHNkYXRhOwotCi0gIC8qIEluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc2VjdGlvbiBzaG91bGQgdXNlIFJFTEEgcmVsb2NhdGlvbnMuICAqLwotICBzZGF0YS0+dXNlX3JlbGFfcCAKLSAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZGVmYXVsdF91c2VfcmVsYV9wOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgYmZkIHNlY3Rpb24gZnJvbSBhbiBFTEYgcHJvZ3JhbSBoZWFkZXIuCi0KLSAgIFNpbmNlIHByb2dyYW0gc2VnbWVudHMgaGF2ZSBubyBuYW1lcywgd2UgZ2VuZXJhdGUgYSBzeW50aGV0aWMgbmFtZQotICAgb2YgdGhlIGZvcm0gc2VnbWVudDxOVU0+LCB3aGVyZSBOVU0gaXMgZ2VuZXJhbGx5IHRoZSBpbmRleCBpbiB0aGUKLSAgIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgRm9yIHNlZ21lbnRzIHRoYXQgYXJlIHNwbGl0IChzZWUgYmVsb3cpIHdlCi0gICBnZW5lcmF0ZSB0aGUgbmFtZXMgc2VnbWVudDxOVU0+YSBhbmQgc2VnbWVudDxOVU0+Yi4KLQotICAgTm90ZSB0aGF0IHNvbWUgcHJvZ3JhbSBzZWdtZW50cyBtYXkgaGF2ZSBhIGZpbGUgc2l6ZSB0aGF0IGlzIGRpZmZlcmVudCB0aGFuCi0gICAobGVzcyB0aGFuKSB0aGUgbWVtb3J5IHNpemUuICBBbGwgdGhpcyBtZWFucyBpcyB0aGF0IGF0IGV4ZWN1dGlvbiB0aGUKLSAgIHN5c3RlbSBtdXN0IGFsbG9jYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5IHNwZWNpZmllZCBieSB0aGUgbWVtb3J5IHNpemUsCi0gICBidXQgb25seSBpbml0aWFsaXplIGl0IHdpdGggdGhlIGZpcnN0ICJmaWxlIHNpemUiIGJ5dGVzIHJlYWQgZnJvbSB0aGUKLSAgIGZpbGUuICBUaGlzIHdvdWxkIG9jY3VyIGZvciBleGFtcGxlLCB3aXRoIHByb2dyYW0gc2VnbWVudHMgY29uc2lzdGluZwotICAgb2YgY29tYmluZWQgZGF0YStic3MuCi0KLSAgIFRvIGhhbmRsZSB0aGUgYWJvdmUgc2l0dWF0aW9uLCB0aGlzIHJvdXRpbmUgZ2VuZXJhdGVzIFRXTyBiZmQgc2VjdGlvbnMKLSAgIGZvciB0aGUgc2luZ2xlIHByb2dyYW0gc2VnbWVudC4gIFRoZSBmaXJzdCBoYXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQgYnkKLSAgIHRoZSBmaWxlIHNpemUgb2YgdGhlIHNlZ21lbnQsIGFuZCB0aGUgc2Vjb25kIGhhcyB0aGUgbGVuZ3RoIHNwZWNpZmllZAotICAgYnkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHNpemVzLiAgSW4gZWZmZWN0LCB0aGUgc2VnbWVudCBpcyBzcGxpdAotICAgaW50byBpdCdzIGluaXRpYWxpemVkIGFuZCB1bmluaXRpYWxpemVkIHBhcnRzLgotCi0gKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgdHlwZW5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmhkcjsKLSAgICAgaW50IGluZGV4OwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZWJ1Zls2NF07Ci0gIGludCBzcGxpdDsKLQotICBzcGxpdCA9ICgoaGRyLT5wX21lbXN6ID4gMCkKLQkgICAgJiYgKGhkci0+cF9maWxlc3ogPiAwKQotCSAgICAmJiAoaGRyLT5wX21lbXN6ID4gaGRyLT5wX2ZpbGVzeikpOwotICBzcHJpbnRmIChuYW1lYnVmLCAiJXMlZCVzIiwgdHlwZW5hbWUsIGluZGV4LCBzcGxpdCA/ICJhIiA6ICIiKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICBpZiAoIW5hbWUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIG5hbWVidWYpOwotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdzZWN0LT52bWEgPSBoZHItPnBfdmFkZHI7Ci0gIG5ld3NlY3QtPmxtYSA9IGhkci0+cF9wYWRkcjsKLSAgbmV3c2VjdC0+X3Jhd19zaXplID0gaGRyLT5wX2ZpbGVzejsKLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+cF9vZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmIChoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotICAgIHsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19MT0FEOwotICAgICAgaWYgKGhkci0+cF9mbGFncyAmIFBGX1gpCi0JewotCSAgLyogRklYTUU6IGFsbCB3ZSBrbm93biBpcyB0aGF0IGl0IGhhcyBleGVjdXRlIFBFUk1JU1NJT04sCi0JICAgICBtYXkgYmUgZGF0YS4gKi8KLQkgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCX0KLSAgICB9Ci0gIGlmICghKGhkci0+cF9mbGFncyAmIFBGX1cpKQotICAgIHsKLSAgICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgICB9Ci0KLSAgaWYgKHNwbGl0KQotICAgIHsKLSAgICAgIHNwcmludGYgKG5hbWVidWYsICIlcyVkYiIsIHR5cGVuYW1lLCBpbmRleCk7Ci0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gICAgICBpZiAoIW5hbWUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyY3B5IChuYW1lLCBuYW1lYnVmKTsKLSAgICAgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgICAgIGlmIChuZXdzZWN0ID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmV3c2VjdC0+dm1hID0gaGRyLT5wX3ZhZGRyICsgaGRyLT5wX2ZpbGVzejsKLSAgICAgIG5ld3NlY3QtPmxtYSA9IGhkci0+cF9wYWRkciArIGhkci0+cF9maWxlc3o7Ci0gICAgICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfbWVtc3ogLSBoZHItPnBfZmlsZXN6OwotICAgICAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0JewotCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgaWYgKGhkci0+cF9mbGFncyAmIFBGX1gpCi0JICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCX0KLSAgICAgIGlmICghKGhkci0+cF9mbGFncyAmIFBGX1cpKQotCW5ld3NlY3QtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaGRyOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgc3dpdGNoIChoZHItPnBfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBQVF9OVUxMOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJudWxsIik7Ci0KLSAgICBjYXNlIFBUX0xPQUQ6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgImxvYWQiKTsKLQotICAgIGNhc2UgUFRfRFlOQU1JQzoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAiZHluYW1pYyIpOwotCi0gICAgY2FzZSBQVF9JTlRFUlA6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgImludGVycCIpOwotCi0gICAgY2FzZSBQVF9OT1RFOgotICAgICAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgIm5vdGUiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBlbGZjb3JlX3JlYWRfbm90ZXMgKGFiZmQsIGhkci0+cF9vZmZzZXQsIGhkci0+cF9maWxlc3opKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBQVF9TSExJQjoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAic2hsaWIiKTsKLQotICAgIGNhc2UgUFRfUEhEUjoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAicGhkciIpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIENoZWNrIGZvciBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHByb2dyYW0gc2VnbWVudCB0eXBlcy4KLSAgICAgICAgIElmIG5vIGhhbmRsZXIgZm9yIHRoZW0sIGRlZmF1bHQgdG8gbWFraW5nICJzZWdtZW50IiBzZWN0aW9ucy4gKi8KLSAgICAgIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgICAgIGlmIChiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyKQotCXJldHVybiAoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpIChhYmZkLCBoZHIsIGluZGV4KTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgInNlZ21lbnQiKTsKLSAgICB9Ci19Ci0KLS8qIEluaXRpYWxpemUgUkVMX0hEUiwgdGhlIHNlY3Rpb24taGVhZGVyIGZvciBuZXcgc2VjdGlvbiwgY29udGFpbmluZwotICAgcmVsb2NhdGlvbnMgYWdhaW5zdCBBU0VDVC4gIElmIFVTRV9SRUxBX1AgaXMgdHJ1ZSwgd2UgdXNlIFJFTEEKLSAgIHJlbG9jYXRpb25zOyBvdGhlcndpc2UsIHdlIHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgKGFiZmQsIHJlbF9oZHIsIGFzZWN0LCB1c2VfcmVsYV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGJvb2xlYW4gdXNlX3JlbGFfcDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAiLnJlbGEiICsgc3RybGVuIChhc2VjdC0+bmFtZSkpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ByaW50ZiAobmFtZSwgIiVzJXMiLCB1c2VfcmVsYV9wID8gIi5yZWxhIiA6ICIucmVsIiwgYXNlY3QtPm5hbWUpOwotICByZWxfaGRyLT5zaF9uYW1lID0KLSAgICAodW5zaWduZWQgaW50KSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksIG5hbWUsCi0JCQkJICAgICAgIHRydWUsIGZhbHNlKTsKLSAgaWYgKHJlbF9oZHItPnNoX25hbWUgPT0gKHVuc2lnbmVkIGludCkgLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZWxfaGRyLT5zaF90eXBlID0gdXNlX3JlbGFfcCA/IFNIVF9SRUxBIDogU0hUX1JFTDsKLSAgcmVsX2hkci0+c2hfZW50c2l6ZSA9ICh1c2VfcmVsYV9wCi0JCQkgPyBiZWQtPnMtPnNpemVvZl9yZWxhCi0JCQkgOiBiZWQtPnMtPnNpemVvZl9yZWwpOwotICByZWxfaGRyLT5zaF9hZGRyYWxpZ24gPSBiZWQtPnMtPmZpbGVfYWxpZ247Ci0gIHJlbF9oZHItPnNoX2ZsYWdzID0gMDsKLSAgcmVsX2hkci0+c2hfYWRkciA9IDA7Ci0gIHJlbF9oZHItPnNoX3NpemUgPSAwOwotICByZWxfaGRyLT5zaF9vZmZzZXQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgYW4gRUxGIGludGVybmFsIHNlY3Rpb24gaGVhZGVyIGZvciBhIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgYXNlY3QsIGZhaWxlZHB0cmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIFBUUiBmYWlsZWRwdHJhcmc7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gKmZhaWxlZHB0ciA9IChib29sZWFuICopIGZhaWxlZHB0cmFyZzsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnRoaXNfaGRyOwotCi0gIGlmICgqZmFpbGVkcHRyKQotICAgIHsKLSAgICAgIC8qIFdlIGFscmVhZHkgZmFpbGVkOyBqdXN0IGdldCBvdXQgb2YgdGhlIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucwotICAgICAgICAgbG9vcC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHRoaXNfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KS0+dGhpc19oZHI7Ci0KLSAgdGhpc19oZHItPnNoX25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfc2hzdHJ0YWIgKGFiZmQpLAotCQkJCQkJCSAgYXNlY3QtPm5hbWUsCi0JCQkJCQkJICB0cnVlLCBmYWxzZSk7Ci0gIGlmICh0aGlzX2hkci0+c2hfbmFtZSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0gICAgewotICAgICAgKmZhaWxlZHB0ciA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHRoaXNfaGRyLT5zaF9mbGFncyA9IDA7Ci0KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLSAgICAgIHx8IGFzZWN0LT51c2VyX3NldF92bWEpCi0gICAgdGhpc19oZHItPnNoX2FkZHIgPSBhc2VjdC0+dm1hOwotICBlbHNlCi0gICAgdGhpc19oZHItPnNoX2FkZHIgPSAwOwotCi0gIHRoaXNfaGRyLT5zaF9vZmZzZXQgPSAwOwotICB0aGlzX2hkci0+c2hfc2l6ZSA9IGFzZWN0LT5fcmF3X3NpemU7Ci0gIHRoaXNfaGRyLT5zaF9saW5rID0gMDsKLSAgdGhpc19oZHItPnNoX2FkZHJhbGlnbiA9IDEgPDwgYXNlY3QtPmFsaWdubWVudF9wb3dlcjsKLSAgLyogVGhlIHNoX2VudHNpemUgYW5kIHNoX2luZm8gZmllbGRzIG1heSBoYXZlIGJlZW4gc2V0IGFscmVhZHkgYnkKLSAgICAgY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YS4gICovCi0KLSAgdGhpc19oZHItPmJmZF9zZWN0aW9uID0gYXNlY3Q7Ci0gIHRoaXNfaGRyLT5jb250ZW50cyA9IE5VTEw7Ci0KLSAgLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBiYXNlZCBvbiBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluc3RyIikgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuaGFzaCIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfSEFTSDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfaGFzaF9lbnRyeTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluc3ltIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9EWU5TWU07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluYW1pYyIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOQU1JQzsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfZHluOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIucmVsYSIsIDUpID09IDAKLQkgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heV91c2VfcmVsYV9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTEE7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbGE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXlfdXNlX3JlbF9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcmVsOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9URTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIuc3RhYiIsIDUpID09IDAKLQkgICAmJiBzdHJjbXAgKGFzZWN0LT5uYW1lICsgc3RybGVuIChhc2VjdC0+bmFtZSkgLSAzLCAic3RyIikgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb24iKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJzeW07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX2QiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJkZWY7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICAvKiBvYmpjb3B5IG9yIHN0cmlwIHdpbGwgY29weSBvdmVyIHNoX2luZm8sIGJ1dCBtYXkgbm90IHNldAotICAgICAgICAgY3ZlcmRlZnMuICBUaGUgbGlua2VyIHdpbGwgc2V0IGN2ZXJkZWZzLCBidXQgc2hfaW5mbyB3aWxsIGJlCi0gICAgICAgICB6ZXJvLiAgKi8KLSAgICAgIGlmICh0aGlzX2hkci0+c2hfaW5mbyA9PSAwKQotCXRoaXNfaGRyLT5zaF9pbmZvID0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnM7Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPT0gMAotCQkgICAgfHwgdGhpc19oZHItPnNoX2luZm8gPT0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbl9yIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVybmVlZDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0Ci0gICAgICAgICBjdmVycmVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcnJlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKLSAgICAgICAgIHplcm8uICAqLwotICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCi0JdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmczsKLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyA9PSAwCi0JCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyk7Ci0gICAgfQotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotICBlbHNlCi0gICAgewotICAgICAgLyogV2hvIGtub3dzPyAgKi8KLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICAgIH0KLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX1dSSVRFOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhFQ0lOU1RSOwotCi0gIC8qIENoZWNrIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIChhYmZkLCB0aGlzX2hkciwgYXNlY3QpOwotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGhhcyByZWxvY3MsIHNldCB1cCBhIHNlY3Rpb24gaGVhZGVyIGZvciB0aGUKLSAgICAgU0hUX1JFTFtBXSBzZWN0aW9uLiAgSWYgdHdvIHJlbG9jYXRpb24gc2VjdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotICAgICB0aGlzIHNlY3Rpb24sIGl0IGlzIHVwIHRvIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgYmFjay1lbmQgdG8KLSAgICAgY3JlYXRlIHRoZSBvdGhlci4gICovIAotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgIV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAoYWJmZCwgCi0JCQkJICAgICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnJlbF9oZHIsCi0JCQkJICAgIGFzZWN0LCAKLQkJCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT51c2VfcmVsYV9wKSkKLSAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKLX0KLQotLyogR2V0IGVsZiBhcmNoIHNpemUgKDMyIC8gNjQpLgotICAgUmV0dXJucyAtMSBpZiBub3QgZWxmLiAgKi8KLQotaW50Ci1iZmRfZWxmX2dldF9hcmNoX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCkpLT5zLT5hcmNoX3NpemU7Ci19Ci0KLS8qIEFzc2lnbiBhbGwgRUxGIHNlY3Rpb24gbnVtYmVycy4gIFRoZSBkdW1teSBmaXJzdCBzZWN0aW9uIGlzIGhhbmRsZWQgaGVyZQotICAgdG9vLiAgVGhlIGxpbmsvaW5mbyBwb2ludGVycyBmb3IgdGhlIHN0YW5kYXJkIHNlY3Rpb24gdHlwZXMgYXJlIGZpbGxlZAotICAgaW4gaGVyZSB0b28sIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnQgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLQotICBzZWN0aW9uX251bWJlciA9IDE7Ci0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLQotICAgICAgZC0+dGhpc19pZHggPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWQtPnJlbF9pZHggPSAwOwotICAgICAgZWxzZQotCWQtPnJlbF9pZHggPSBzZWN0aW9uX251bWJlcisrOwotCi0gICAgICBpZiAoZC0+cmVsX2hkcjIpCi0JZC0+cmVsX2lkeDIgPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgZWxzZQotCWQtPnJlbF9pZHgyID0gMDsKLSAgICB9Ci0KLSAgdC0+c2hzdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4ID0gdC0+c2hzdHJ0YWJfc2VjdGlvbjsKLSAgdC0+c2hzdHJ0YWJfaGRyLnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIHQtPnN5bXRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIHQtPnN0cnRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW0gPSBzZWN0aW9uX251bWJlcjsKLQotICAvKiBTZXQgdXAgdGhlIGxpc3Qgb2Ygc2VjdGlvbiBoZWFkZXIgcG9pbnRlcnMsIGluIGFncmVlbWVudCB3aXRoIHRoZQotICAgICBpbmRpY2VzLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKiopCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb25fbnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkciAqKSkpOwotICBpZiAoaV9zaGRycCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpX3NoZHJwWzBdID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKSk7Ci0gIGlmIChpX3NoZHJwWzBdID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbWVtc2V0IChpX3NoZHJwWzBdLCAwLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKSA9IGlfc2hkcnA7Ci0KLSAgaV9zaGRycFt0LT5zaHN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zaHN0cnRhYl9oZHI7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaV9zaGRycFt0LT5zeW10YWJfc2VjdGlvbl0gPSAmdC0+c3ltdGFiX2hkcjsKLSAgICAgIGlfc2hkcnBbdC0+c3RydGFiX3NlY3Rpb25dID0gJnQtPnN0cnRhYl9oZHI7Ci0gICAgICB0LT5zeW10YWJfaGRyLnNoX2xpbmsgPSB0LT5zdHJ0YWJfc2VjdGlvbjsKLSAgICB9Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIGlfc2hkcnBbZC0+dGhpc19pZHhdID0gJmQtPnRoaXNfaGRyOwotICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKLQlpX3NoZHJwW2QtPnJlbF9pZHhdID0gJmQtPnJlbF9oZHI7Ci0gICAgICBpZiAoZC0+cmVsX2lkeDIgIT0gMCkKLQlpX3NoZHJwW2QtPnJlbF9pZHgyXSA9IGQtPnJlbF9oZHIyOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBzaF9saW5rIGFuZCBzaF9pbmZvIGZpZWxkcyB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0KLSAgICAgIC8qIHNoX2xpbmsgb2YgYSByZWxvYyBzZWN0aW9uIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzeW1ib2wKLQkgdGFibGUuICBzaF9pbmZvIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIHRvIHdoaWNoCi0JIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICAqLwotICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKLQl7Ci0JICBkLT5yZWxfaGRyLnNoX2xpbmsgPSB0LT5zeW10YWJfc2VjdGlvbjsKLQkgIGQtPnJlbF9oZHIuc2hfaW5mbyA9IGQtPnRoaXNfaWR4OwotCX0KLSAgICAgIGlmIChkLT5yZWxfaWR4MiAhPSAwKQotCXsKLQkgIGQtPnJlbF9oZHIyLT5zaF9saW5rID0gdC0+c3ltdGFiX3NlY3Rpb247Ci0JICBkLT5yZWxfaGRyMi0+c2hfaW5mbyA9IGQtPnRoaXNfaWR4OwotCX0KLQotICAgICAgc3dpdGNoIChkLT50aGlzX2hkci5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9SRUw6Ci0JY2FzZSBTSFRfUkVMQToKLQkgIC8qIEEgcmVsb2Mgc2VjdGlvbiB3aGljaCB3ZSBhcmUgdHJlYXRpbmcgYXMgYSBub3JtYWwgQkZECi0JICAgICBzZWN0aW9uLiAgc2hfbGluayBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgICB0YWJsZS4gIHNoX2luZm8gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gdG8KLQkgICAgIHdoaWNoIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICBXZSBhc3N1bWUgdGhhdCBhbgotCSAgICAgYWxsb2NhdGVkIHJlbG9jIHNlY3Rpb24gdXNlcyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JICAgICBGSVhNRTogSG93IGNhbiB3ZSBiZSBzdXJlPyAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0KLQkgIC8qIFdlIGxvb2sgdXAgdGhlIHNlY3Rpb24gdGhlIHJlbG9jcyBhcHBseSB0byBieSBuYW1lLiAgKi8KLQkgIG5hbWUgPSBzZWMtPm5hbWU7Ci0JICBpZiAoZC0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICBuYW1lICs9IDQ7Ci0JICBlbHNlCi0JICAgIG5hbWUgKz0gNTsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9TVFJUQUI6Ci0JICAvKiBXZSBhc3N1bWUgdGhhdCBhIHNlY3Rpb24gbmFtZWQgLnN0YWIqc3RyIGlzIGEgc3RhYnMKLQkgICAgIHN0cmluZyBzZWN0aW9uLiAgV2UgbG9vayBmb3IgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAgICAgYnV0IHdpdGhvdXQgdGhlIHRyYWlsaW5nIGBgc3RyJycsIGFuZCBzZXQgaXRzIHNoX2xpbmsKLQkgICAgIGZpZWxkIHRvIHBvaW50IHRvIHRoaXMgc2VjdGlvbi4gICovCi0JICBpZiAoc3RybmNtcCAoc2VjLT5uYW1lLCAiLnN0YWIiLCBzaXplb2YgIi5zdGFiIiAtIDEpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKHNlYy0+bmFtZSArIHN0cmxlbiAoc2VjLT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQkgICAgICBjaGFyICphbGM7Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHNlYy0+bmFtZSk7Ci0JICAgICAgYWxjID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuIC0gMik7Ci0JICAgICAgaWYgKGFsYyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RybmNweSAoYWxjLCBzZWMtPm5hbWUsIGxlbiAtIDMpOwotCSAgICAgIGFsY1tsZW4gLSAzXSA9ICdcMCc7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBhbGMpOwotCSAgICAgIGZyZWUgKGFsYyk7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID0gZC0+dGhpc19pZHg7Ci0KLQkJICAvKiBUaGlzIGlzIGEgLnN0YWIgc2VjdGlvbi4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCQkgICAgNCArIDIgKiBiZmRfZWxmX2dldF9hcmNoX3NpemUgKGFiZmQpIC8gODsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0RZTkFNSUM6Ci0JY2FzZSBTSFRfRFlOU1lNOgotCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgotCWNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0JICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3RyaW5nIHRhYmxlCi0JICAgICB1c2VkIGZvciB0aGUgZHluYW1pYyBlbnRyaWVzLCBvciB0aGUgc3ltYm9sIHRhYmxlLCBvciB0aGUKLQkgICAgIHZlcnNpb24gc3RyaW5ncy4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9IQVNIOgotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3ltYm9sIHRhYmxlCi0JICAgICB0aGlzIGhhc2ggdGFibGUgb3IgdmVyc2lvbiB0YWJsZSBpcyBmb3IuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hcCBzeW1ib2wgZnJvbSBpdCdzIGludGVybmFsIG51bWJlciB0byB0aGUgZXh0ZXJuYWwgbnVtYmVyLCBtb3ZpbmcKLSAgIGFsbCBsb2NhbCBzeW1ib2xzIHRvIGJlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIC8qIElmIHRoZSBiYWNrZW5kIGhhcyBhIHNwZWNpYWwgbWFwcGluZywgdXNlIGl0LiAgKi8KLSAgaWYgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkKLSAgICByZXR1cm4gKCgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKQotCSAgICAoYWJmZCwgc3ltKSk7Ci0KLSAgcmV0dXJuICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfbWFwX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgYXN5bWJvbCAqKnNlY3Rfc3ltczsKLSAgaW50IG51bV9sb2NhbHMgPSAwOwotICBpbnQgbnVtX2dsb2JhbHMgPSAwOwotICBpbnQgbnVtX2xvY2FsczIgPSAwOwotICBpbnQgbnVtX2dsb2JhbHMyID0gMDsKLSAgaW50IG1heF9pbmRleCA9IDA7Ci0gIGludCBudW1fc2VjdGlvbnMgPSAwOwotICBpbnQgaWR4OwotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGFzeW1ib2wgKipuZXdfc3ltczsKLSAgYXN5bWJvbCAqc3ltOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiZWxmX21hcF9zeW1ib2xzXG4iKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotI2VuZGlmCi0KLSAgLyogQWRkIGEgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggQkZEIHNlY3Rpb24uICBGSVhNRTogSXMgdGhpcyByZWFsbHkKLSAgICAgbmVjZXNzYXJ5PyAgKi8KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobWF4X2luZGV4IDwgYXNlY3QtPmluZGV4KQotCW1heF9pbmRleCA9IGFzZWN0LT5pbmRleDsKLSAgICB9Ci0KLSAgbWF4X2luZGV4Kys7Ci0gIHNlY3Rfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBtYXhfaW5kZXggKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAoc2VjdF9zeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGZfc2VjdGlvbl9zeW1zIChhYmZkKSA9IHNlY3Rfc3ltczsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBzeW0gPSBzeW1zW2lkeF07Ci0gICAgICAKLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgJiYgc3ltLT52YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQotCSAgaWYgKHNlYy0+b3duZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPm93bmVyICE9IGFiZmQpCi0JCXsKLQkJICBpZiAoc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCi0JCSAgICBjb250aW51ZTsKLQkJICAKLQkJICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogRW1wdHkgc2VjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzIG1heSBoYXZlIGhhZCBhIHNlY3Rpb24KLQkJICAgICBzeW1ib2wgY3JlYXRlZCBmb3IgdGhlbS4gIChTZWUgdGhlIGNvbW1lbnQgbmVhciB0aGUgZW5kIG9mCi0JCSAgICAgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgaW4gbGlua2VyLmMpLiAgSWYgdGhlIGxpbmtlcgotCQkgICAgIHNjcmlwdCBkaXNjYXJkcyBzdWNoIHNlY3Rpb25zIHRoZW4gd2Ugd2lsbCByZWFjaCB0aGlzIHBvaW50LgotCQkgICAgIFNpbmNlIHdlIGtub3cgdGhhdCB3ZSBjYW5ub3QgYXZvaWQgdGhpcyBjYXNlLCB3ZSBkZXRlY3QgaXQKLQkJICAgICBhbmQgc2tpcCB0aGUgYWJvcnQgYW5kIHRoZSBhc3NpZ25tZW50IHRvIHRoZSBzZWN0X3N5bXMgYXJyYXkuCi0JCSAgICAgVG8gcmVwcm9kdWNlIHRoaXMgcGFydGljdWxhciBjYXNlIHRyeSBydW5uaW5nIHRoZSBsaW5rZXIKLQkJICAgICB0ZXN0c3VpdGUgdGVzdCBsZC1zY3JpcHRzL3dlYWsuZXhwIGZvciBhbiBFTEYgcG9ydCB0aGF0IHVzZXMKLQkJICAgICB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLwotCQkgIGlmIChzZWMtPm93bmVyID09IE5VTEwpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIEJGRF9BU1NFUlQgKHNlYy0+b3duZXIgPT0gYWJmZCk7Ci0JCX0KLQkgICAgICBzZWN0X3N5bXNbc2VjLT5pbmRleF0gPSBzeW1zW2lkeF07Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltLT50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+bmFtZSA9IGFzZWN0LT5uYW1lOwotICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0gICAgICAvKiBTZXQgdGhlIGZsYWdzIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIG9uZSB3YXMgbmV3bHkgYWRkZWQuICAqLwotICAgICAgc3ltLT5mbGFncyA9IDA7Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBhc2VjdDsKLSAgICAgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdID0gc3ltOwotICAgICAgbnVtX3NlY3Rpb25zKys7Ci0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSBfKCJjcmVhdGluZyBzZWN0aW9uIHN5bWJvbCwgbmFtZSA9ICVzLCB2YWx1ZSA9IDB4JS44bHgsIGluZGV4ID0gJWQsIHNlY3Rpb24gPSAweCUuOGx4XG4iKSwKLQkgICAgICAgYXNlY3QtPm5hbWUsIChsb25nKSBhc2VjdC0+dm1hLCBhc2VjdC0+aW5kZXgsIChsb25nKSBhc2VjdCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogQ2xhc3NpZnkgYWxsIG9mIHRoZSBzeW1ib2xzLiAgKi8KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW1zW2lkeF0pKQotCW51bV9sb2NhbHMrKzsKLSAgICAgIGVsc2UKLQludW1fZ2xvYmFscysrOwotICAgIH0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTAotCSAgJiYgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID09IDApCi0JewotCSAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSkpCi0JICAgIG51bV9sb2NhbHMrKzsKLQkgIGVsc2UKLQkgICAgbnVtX2dsb2JhbHMrKzsKLQkgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgc29ydCB0aGUgc3ltYm9scyBzbyB0aGUgbG9jYWwgc3ltYm9scyBhcmUgZmlyc3QuICAqLwotICBuZXdfc3ltcyA9ICgoYXN5bWJvbCAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscykgKiBzaXplb2YgKGFzeW1ib2wgKikpKTsKLSAgaWYgKG5ld19zeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9IHN5bXNbaWR4XTsKLSAgICAgIGludCBpOwotCi0gICAgICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkpCi0JaSA9IG51bV9sb2NhbHMyKys7Ci0gICAgICBlbHNlCi0JaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKLSAgICAgIG5ld19zeW1zW2ldID0gc3ltOwotICAgICAgc3ltLT51ZGF0YS5pID0gaSArIDE7Ci0gICAgfQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMCi0JICAmJiBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW0gPSBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XTsKLQkgIGludCBpOwotCi0JICBzeW0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pKQotCSAgICBpID0gbnVtX2xvY2FsczIrKzsKLQkgIGVsc2UKLQkgICAgaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKLQkgIG5ld19zeW1zW2ldID0gc3ltOwotCSAgc3ltLT51ZGF0YS5pID0gaSArIDE7Ci0JfQotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgbmV3X3N5bXMsIG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscyk7Ci0KLSAgZWxmX251bV9sb2NhbHMgKGFiZmQpID0gbnVtX2xvY2FsczsKLSAgZWxmX251bV9nbG9iYWxzIChhYmZkKSA9IG51bV9nbG9iYWxzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdG8gdGhlIG1heGltdW0gZmlsZSBhbGlnbm1lbnQgdGhhdCBjb3VsZCBiZSByZXF1aXJlZCBmb3IgYW55Ci0gICBFTEYgZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGZpbGVfcHRyIGFsaWduX2ZpbGVfcG9zaXRpb24gUEFSQU1TICgoZmlsZV9wdHIsIGludCkpOwotc3RhdGljIElOTElORSBmaWxlX3B0cgotYWxpZ25fZmlsZV9wb3NpdGlvbiAob2ZmLCBhbGlnbikKLSAgICAgZmlsZV9wdHIgb2ZmOwotICAgICBpbnQgYWxpZ247Ci17Ci0gIHJldHVybiAob2ZmICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKLX0KLQotLyogQXNzaWduIGEgZmlsZSBwb3NpdGlvbiB0byBhIHNlY3Rpb24sIG9wdGlvbmFsbHkgYWxpZ25pbmcgdG8gdGhlCi0gICByZXF1aXJlZCBzZWN0aW9uIGFsaWdubWVudC4gICovCi0KLUlOTElORSBmaWxlX3B0cgotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGlfc2hkcnAsIG9mZnNldCwgYWxpZ24pCi0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gYWxpZ247Ci17Ci0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWw7Ci0KLSAgICAgIGFsID0gaV9zaGRycC0+c2hfYWRkcmFsaWduOwotICAgICAgaWYgKGFsID4gMSkKLQlvZmZzZXQgPSBCRkRfQUxJR04gKG9mZnNldCwgYWwpOwotICAgIH0KLSAgaV9zaGRycC0+c2hfb2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoaV9zaGRycC0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICBpX3NoZHJwLT5iZmRfc2VjdGlvbi0+ZmlsZXBvcyA9IG9mZnNldDsKLSAgaWYgKGlfc2hkcnAtPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBvZmZzZXQgKz0gaV9zaGRycC0+c2hfc2l6ZTsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgd2UgYXJlIGdvaW5nIHRvIHB1dCB0aGUgc2VjdGlvbnMgYXQsIGFuZAotICAgb3RoZXJ3aXNlIHByZXBhcmUgdG8gYmVnaW4gd3JpdGluZyBvdXQgdGhlIEVMRiBmaWxlLiAgSWYgTElOS19JTkZPCi0gICBpcyBub3QgTlVMTCwgdGhpcyBpcyBiZWluZyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gZmFpbGVkOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzaHN0cnRhYl9oZHI7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRG8gYW55IGVsZiBiYWNrZW5kIHNwZWNpZmljIHByb2Nlc3NpbmcgZmlyc3QuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKSAoYWJmZCwgbGlua19pbmZvKTsKLQotICBpZiAoISBwcmVwX2hlYWRlcnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQb3N0IHByb2Nlc3MgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKSAoYWJmZCwgbGlua19pbmZvKTsKLQotICBmYWlsZWQgPSBmYWxzZTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBlbGZfZmFrZV9zZWN0aW9ucywgJmZhaWxlZCk7Ci0gIGlmIChmYWlsZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghYXNzaWduX3NlY3Rpb25fbnVtYmVycyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBiYWNrZW5kIGxpbmtlciBidWlsZHMgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGl0c2VsZi4gICovCi0gIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgLyogTm9uLXplcm8gaWYgZG9pbmcgYSByZWxvY2F0YWJsZSBsaW5rLiAgKi8KLSAgICAgIGludCByZWxvY2F0YWJsZV9wID0gISAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpOwotCi0gICAgICBpZiAoISBzd2FwX291dF9zeW1zIChhYmZkLCAmc3RydGFiLCByZWxvY2F0YWJsZV9wKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHNoc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgd2FzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzaHN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzaHN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0gIHNoc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gIC8qIHNoX29mZnNldCBpcyBzZXQgaW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MuICAqLwotICBzaHN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0KLSAgaWYgKCFhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgb2ZmOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICAgICAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IHdlIGtub3cgd2hlcmUgdGhlIC5zdHJ0YWIgc2VjdGlvbiBnb2VzLCB3cml0ZSBpdAotICAgICAgICAgb3V0LiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc3RydGFiKTsKLSAgICB9Ci0KLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBhIHNldCBvZiBzZWN0aW9ucyB0byBhIHByb2dyYW0gc2VnbWVudC4gICovCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqCi1tYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBmcm9tLCB0bywgcGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICB1bnNpZ25lZCBpbnQgZnJvbTsKLSAgICAgdW5zaWduZWQgaW50IHRvOwotICAgICBib29sZWFuIHBoZHI7Ci17Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIHVuc2lnbmVkIGludCBpOwotICBhc2VjdGlvbiAqKmhkcnBwOwotCi0gIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLSAgICAgICBiZmRfemFsbG9jIChhYmZkLAotCQkgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICAgKyAodG8gLSBmcm9tIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICBpZiAobSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBtLT5uZXh0ID0gTlVMTDsKLSAgbS0+cF90eXBlID0gUFRfTE9BRDsKLSAgZm9yIChpID0gZnJvbSwgaGRycHAgPSBzZWN0aW9ucyArIGZyb207IGkgPCB0bzsgaSsrLCBoZHJwcCsrKQotICAgIG0tPnNlY3Rpb25zW2kgLSBmcm9tXSA9ICpoZHJwcDsKLSAgbS0+Y291bnQgPSB0byAtIGZyb207Ci0KLSAgaWYgKGZyb20gPT0gMCAmJiBwaGRyKQotICAgIHsKLSAgICAgIC8qIEluY2x1ZGUgdGhlIGhlYWRlcnMgaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gICovCi0gICAgICBtLT5pbmNsdWRlc19maWxlaGRyID0gMTsKLSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIFNldCB1cCBhIG1hcHBpbmcgZnJvbSBCRkQgc2VjdGlvbnMgdG8gcHJvZ3JhbSBzZWdtZW50cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptZmlyc3Q7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKipwbTsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgYXNlY3Rpb24gKmxhc3RfaGRyOwotICB1bnNpZ25lZCBpbnQgcGhkcl9pbmRleDsKLSAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKipoZHJwcDsKLSAgYm9vbGVhbiBwaGRyX2luX3NlZ21lbnQgPSB0cnVlOwotICBib29sZWFuIHdyaXRhYmxlOwotICBhc2VjdGlvbiAqZHluc2VjOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VsZWN0IHRoZSBhbGxvY2F0ZWQgc2VjdGlvbnMsIGFuZCBzb3J0IHRoZW0uICAqLwotCi0gIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIHNlY3Rpb25zW2ldID0gczsKLQkgICsraTsKLQl9Ci0gICAgfQotICBCRkRfQVNTRVJUIChpIDw9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkpOwotICBjb3VudCA9IGk7Ci0KLSAgcXNvcnQgKHNlY3Rpb25zLCAoc2l6ZV90KSBjb3VudCwgc2l6ZW9mIChhc2VjdGlvbiAqKSwgZWxmX3NvcnRfc2VjdGlvbnMpOwotCi0gIC8qIEJ1aWxkIHRoZSBtYXBwaW5nLiAgKi8KLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIC5pbnRlcnAgc2VjdGlvbiwgdGhlbiBjcmVhdGUgYSBQVF9QSERSIHNlZ21lbnQgZm9yCi0gICAgIHRoZSBwcm9ncmFtIGhlYWRlcnMgYW5kIGEgUFRfSU5URVJQIHNlZ21lbnQgZm9yIHRoZSAuaW50ZXJwCi0gICAgIHNlY3Rpb24uICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX1BIRFI7Ci0gICAgICAvKiBGSVhNRTogVW5peFdhcmUgYW5kIFNvbGFyaXMgc2V0IFBGX1gsIElyaXggNSBkb2VzIG5vdC4gICovCi0gICAgICBtLT5wX2ZsYWdzID0gUEZfUiB8IFBGX1g7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0KLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9JTlRFUlA7Ci0gICAgICBtLT5jb3VudCA9IDE7Ci0gICAgICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb25zLiAgV2UgcHV0IHNlY3Rpb25zIGluIHRoZSBzYW1lIHByb2dyYW0KLSAgICAgc2VnbWVudCB3aGVuIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHNlY3Rpb24gY2FuIGJlIHBsYWNlZCB3aXRoaW4KLSAgICAgYSBmZXcgYnl0ZXMgb2YgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4gICovCi0gIGxhc3RfaGRyID0gTlVMTDsKLSAgcGhkcl9pbmRleCA9IDA7Ci0gIG1heHBhZ2VzaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXhwYWdlc2l6ZTsKLSAgd3JpdGFibGUgPSBmYWxzZTsKLSAgZHluc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAoZHluc2VjICE9IE5VTEwKLSAgICAgICYmIChkeW5zZWMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0gICAgZHluc2VjID0gTlVMTDsKLQotICAvKiBEZWFsIHdpdGggLVR0ZXh0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHN1Y2ggdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbgotICAgICBpcyBub3QgYWRqYWNlbnQgdG8gdGhlIHByb2dyYW0gaGVhZGVycy4gIFRoaXMgaXMgYW4KLSAgICAgYXBwcm94aW1hdGlvbiwgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgaG93IG1hbnkKLSAgICAgcHJvZ3JhbSBoZWFkZXJzIHdlIHdpbGwgbmVlZC4gICovCi0gIGlmIChjb3VudCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBwaGRyX3NpemU7Ci0KLSAgICAgIHBoZHJfc2l6ZSA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0gICAgICBpZiAocGhkcl9zaXplID09IDApCi0JcGhkcl9zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfcGhkcjsKLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwCi0JICB8fCBzZWN0aW9uc1swXS0+bG1hIDwgcGhkcl9zaXplCi0JICB8fCBzZWN0aW9uc1swXS0+bG1hICUgbWF4cGFnZXNpemUgPCBwaGRyX3NpemUgJSBtYXhwYWdlc2l6ZSkKLQlwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaGRycHAgPSBzZWN0aW9uczsgaSA8IGNvdW50OyBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhkcjsKLSAgICAgIGJvb2xlYW4gbmV3X3NlZ21lbnQ7Ci0KLSAgICAgIGhkciA9ICpoZHJwcDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgc2VjdGlvbiBhbmQgdGhlIGxhc3Qgb25lIHdpbGwgZml0IGluIHRoZSBzYW1lCi0gICAgICAgICBzZWdtZW50LiAgKi8KLQotICAgICAgaWYgKGxhc3RfaGRyID09IE5VTEwpCi0JewotCSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHNlZ21lbnQgeWV0LCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcKLQkgICAgIG9uZSAod2UgYnVpbGQgdGhlIGxhc3Qgb25lIGFmdGVyIHRoaXMgbG9vcCkuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChsYXN0X2hkci0+bG1hIC0gbGFzdF9oZHItPnZtYSAhPSBoZHItPmxtYSAtIGhkci0+dm1hKQotCXsKLQkgIC8qIElmIHRoaXMgc2VjdGlvbiBoYXMgYSBkaWZmZXJlbnQgcmVsYXRpb24gYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICB2aXJ0dWFsIGFkZHJlc3MgYW5kIHRoZSBsb2FkIGFkZHJlc3MsIHRoZW4gd2UgbmVlZCBhIG5ldwotICAgICAgICAgICAgIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQotCSAgICAgICA8IEJGRF9BTElHTiAoaGRyLT5sbWEsIG1heHBhZ2VzaXplKSkKLQl7Ci0JICAvKiBJZiBwdXR0aW5nIHRoaXMgc2VjdGlvbiBpbiB0aGlzIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgICAgICBza2lwIGEgcGFnZSBpbiB0aGUgc2VnbWVudCwgdGhlbiB3ZSBuZWVkIGEgbmV3IHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChsYXN0X2hkci0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCSAgICAgICAmJiAoaGRyLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhCi0gICAgICAgICAgICAgbm9ubG9hZGFibGUgc2VjdGlvbiBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKQotCXsKLQkgIC8qIElmIHRoZSBmaWxlIGlzIG5vdCBkZW1hbmQgcGFnZWQsIHdoaWNoIG1lYW5zIHRoYXQgd2UKLSAgICAgICAgICAgICBkb24ndCByZXF1aXJlIHRoZSBzZWN0aW9ucyB0byBiZSBjb3JyZWN0bHkgYWxpZ25lZCBpbiB0aGUKLSAgICAgICAgICAgICBmaWxlLCB0aGVuIHRoZXJlIGlzIG5vIG90aGVyIHJlYXNvbiBmb3IgYSBuZXcgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgd3JpdGFibGUKLQkgICAgICAgJiYgKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAgICAgJiYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQotCQkgICA9PSBoZHItPmxtYSkpCi0JewotCSAgLyogV2UgZG9uJ3Qgd2FudCB0byBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEgcmVhZCBvbmx5Ci0gICAgICAgICAgICAgc2VnbWVudCwgdW5sZXNzIHRoZXkgYXJlIG9uIHRoZSBzYW1lIHBhZ2UgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgYW55aG93LiAgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGxhc3Qgc2VjdGlvbiBkb2VzIG5vdAotICAgICAgICAgICAgIGJyaW5nIHVzIHBhc3QgdGhlIGN1cnJlbnQgc2VjdGlvbiBvbiB0aGUgcGFnZSwgc28gdGhlCi0gICAgICAgICAgICAgb25seSBjYXNlIGluIHdoaWNoIHRoZSBuZXcgc2VjdGlvbiBpcyBub3Qgb24gdGhlIHNhbWUKLSAgICAgICAgICAgICBwYWdlIGFzIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlzIHdoZW4gdGhlIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgICAgICBlbmRzIHByZWNpc2VseSBvbiBhIHBhZ2UgYm91bmRhcnkuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBPdGhlcndpc2UsIHdlIGNhbiB1c2UgdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgbmV3X3NlZ21lbnQpCi0JewotCSAgaWYgKChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCSAgICB3cml0YWJsZSA9IHRydWU7Ci0JICBsYXN0X2hkciA9IGhkcjsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgbmVlZCBhIG5ldyBwcm9ncmFtIHNlZ21lbnQuICBXZSBtdXN0IGNyZWF0ZSBhIG5ldyBwcm9ncmFtCi0gICAgICAgICBoZWFkZXIgaG9sZGluZyBhbGwgdGhlIHNlY3Rpb25zIGZyb20gcGhkcl9pbmRleCB1bnRpbCBoZHIuICAqLwotCi0gICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotCi0gICAgICBpZiAoKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0Jd3JpdGFibGUgPSB0cnVlOwotICAgICAgZWxzZQotCXdyaXRhYmxlID0gZmFsc2U7Ci0KLSAgICAgIGxhc3RfaGRyID0gaGRyOwotICAgICAgcGhkcl9pbmRleCA9IGk7Ci0gICAgICBwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgZmluYWwgUFRfTE9BRCBwcm9ncmFtIHNlZ21lbnQuICAqLwotICBpZiAobGFzdF9oZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIC5keW5hbWljIHNlY3Rpb24sIHRocm93IGluIGEgUFRfRFlOQU1JQyBzZWdtZW50LiAgKi8KLSAgaWYgKGR5bnNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9EWU5BTUlDOwotICAgICAgbS0+Y291bnQgPSAxOwotICAgICAgbS0+c2VjdGlvbnNbMF0gPSBkeW5zZWM7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBGb3IgZWFjaCBsb2FkYWJsZSAubm90ZSBzZWN0aW9uLCBhZGQgYSBQVF9OT1RFIHNlZ21lbnQuICBXZSBkb24ndAotICAgICB1c2UgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUsIGJlY2F1c2UgaWYgd2UgbGluayB0b2dldGhlcgotICAgICBub25sb2FkYWJsZSAubm90ZSBzZWN0aW9ucyBhbmQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgZ2VuZXJhdGUgdHdvIC5ub3RlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZJWE1FOiBVc2luZwotICAgICBuYW1lcyBmb3Igc2VjdGlvbiB0eXBlcyBpcyBib2d1cyBhbnlob3cuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0JewotCSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG0tPm5leHQgPSBOVUxMOwotCSAgbS0+cF90eXBlID0gUFRfTk9URTsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChzZWN0aW9ucyk7Ci0gIHNlY3Rpb25zID0gTlVMTDsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgaW50Ci1lbGZfc29ydF9zZWN0aW9ucyAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqc2VjMSA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICpzZWMyID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IExNQSBmaXJzdCwgc2luY2UgdGhpcyBpcyB0aGUgYWRkcmVzcyB1c2VkIHRvCi0gICAgIHBsYWNlIHRoZSBzZWN0aW9uIGludG8gYSBzZWdtZW50LiAgKi8KLSAgaWYgKHNlYzEtPmxtYSA8IHNlYzItPmxtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKHNlYzEtPmxtYSA+IHNlYzItPmxtYSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVuIHNvcnQgYnkgVk1BLiAgTm9ybWFsbHkgdGhlIExNQSBhbmQgdGhlIFZNQSB3aWxsIGJlCi0gICAgIHRoZSBzYW1lLCBhbmQgdGhpcyB3aWxsIGRvIG5vdGhpbmcuICAqLwotICBpZiAoc2VjMS0+dm1hIDwgc2VjMi0+dm1hKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoc2VjMS0+dm1hID4gc2VjMi0+dm1hKQotICAgIHJldHVybiAxOwotCi0gIC8qIFB1dCAhU0VDX0xPQUQgc2VjdGlvbnMgYWZ0ZXIgU0VDX0xPQUQgb25lcy4gICovCi0KLSNkZWZpbmUgVE9FTkQoeCkgKCgoeCktPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0KLSAgaWYgKFRPRU5EIChzZWMxKSkKLSAgICB7Ci0gICAgICBpZiAoVE9FTkQgKHNlYzIpKQotCXJldHVybiBzZWMxLT50YXJnZXRfaW5kZXggLSBzZWMyLT50YXJnZXRfaW5kZXg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChUT0VORCAoc2VjMikpCi0gICAgcmV0dXJuIC0xOwotCi0jdW5kZWYgVE9FTkQKLQotICAvKiBTb3J0IGJ5IHNpemUsIHRvIHB1dCB6ZXJvIHNpemVkIHNlY3Rpb25zIGJlZm9yZSBvdGhlcnMgYXQgdGhlCi0gICAgIHNhbWUgYWRkcmVzcy4gICovCi0KLSAgaWYgKHNlYzEtPl9yYXdfc2l6ZSA8IHNlYzItPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChzZWMxLT5fcmF3X3NpemUgPiBzZWMyLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIHNlYzEtPnRhcmdldF9pbmRleCAtIHNlYzItPnRhcmdldF9pbmRleDsKLX0KLQotLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIHRvIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbWFwcGluZyBmcm9tCi0gICBzZWN0aW9ucyB0byBzZWdtZW50cy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHVwIHNvbWUgZmllbGRzIGluCi0gICB0aGUgZmlsZSBoZWFkZXIsIGFuZCB3cml0ZXMgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHJzOwotICBmaWxlX3B0ciBvZmYsIHZvZmY7Ci0gIGJmZF92bWEgZmlsZWhkcl92YWRkciwgZmlsZWhkcl9wYWRkcjsKLSAgYmZkX3ZtYSBwaGRyc192YWRkciwgcGhkcnNfcGFkZHI7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApCi0gICAgewotICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY291bnQgPSAwOwotICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Bob2ZmID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhlbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0gPSBjb3VudDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSBhbHJlYWR5IGNvdW50ZWQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzLCBtYWtlIHN1cmUKLSAgICAgdGhhdCB3ZSBhbGxvY2F0ZWQgZW5vdWdoIHNwYWNlLiAgVGhpcyBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMKLSAgICAgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotICBhbGxvYyA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgLyBiZWQtPnMtPnNpemVvZl9waGRyOwotICBpZiAoYWxsb2MgIT0gMCAmJiBjb3VudCA+IGFsbG9jKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzIChhbGxvY2F0ZWQgJXUsIG5lZWQgJXUpIiksCi0JYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGFsbG9jLCBjb3VudCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhbGxvYyA9PSAwKQotICAgIGFsbG9jID0gY291bnQ7Ci0KLSAgcGhkcnMgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JICAgYmZkX2FsbG9jIChhYmZkLCBhbGxvYyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKSk7Ci0gIGlmIChwaGRycyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvZmYgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotICBvZmYgKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotCi0gIGZpbGVoZHJfdmFkZHIgPSAwOwotICBmaWxlaGRyX3BhZGRyID0gMDsKLSAgcGhkcnNfdmFkZHIgPSAwOwotICBwaGRyc19wYWRkciA9IDA7Ci0KLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAsIHAgPSBwaGRyczsKLSAgICAgICBtICE9IE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQsIHArKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLSAgICAgIC8qIElmIGVsZl9zZWdtZW50X21hcCBpcyBub3QgZnJvbSBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMsIHRoZQotICAgICAgICAgc2VjdGlvbnMgbWF5IG5vdCBiZSBjb3JyZWN0bHkgb3JkZXJlZC4gICovCi0gICAgICBpZiAobS0+Y291bnQgPiAwKQotCXFzb3J0IChtLT5zZWN0aW9ucywgKHNpemVfdCkgbS0+Y291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCi0JICAgICAgIGVsZl9zb3J0X3NlY3Rpb25zKTsKLQotICAgICAgcC0+cF90eXBlID0gbS0+cF90eXBlOwotICAgICAgcC0+cF9mbGFncyA9IG0tPnBfZmxhZ3M7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgbS0+Y291bnQgPiAwCi0JICAmJiAobS0+c2VjdGlvbnNbMF0tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCSAgICBvZmYgKz0gKG0tPnNlY3Rpb25zWzBdLT52bWEgLSBvZmYpICUgYmVkLT5tYXhwYWdlc2l6ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLQkgICAgICBhbGlnbiA9IDA7Ci0JICAgICAgZm9yIChpID0gMCwgc2VjcHAgPSBtLT5zZWN0aW9uczsgaSA8IG0tPmNvdW50OyBpKyssIHNlY3BwKyspCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIHNlY2FsaWduOwotCi0JCSAgc2VjYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCAqc2VjcHApOwotCQkgIGlmIChzZWNhbGlnbiA+IGFsaWduKQotCQkgICAgYWxpZ24gPSBzZWNhbGlnbjsKLQkJfQotCi0JICAgICAgb2ZmICs9IChtLT5zZWN0aW9uc1swXS0+dm1hIC0gb2ZmKSAlICgxIDw8IGFsaWduKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF92YWRkciA9IDA7Ci0gICAgICBlbHNlCi0JcC0+cF92YWRkciA9IG0tPnNlY3Rpb25zWzBdLT52bWE7Ci0KLSAgICAgIGlmIChtLT5wX3BhZGRyX3ZhbGlkKQotCXAtPnBfcGFkZHIgPSBtLT5wX3BhZGRyOwotICAgICAgZWxzZSBpZiAobS0+Y291bnQgPT0gMCkKLQlwLT5wX3BhZGRyID0gMDsKLSAgICAgIGVsc2UKLQlwLT5wX3BhZGRyID0gbS0+c2VjdGlvbnNbMF0tPmxtYTsKLQotICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FECi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCXAtPnBfYWxpZ24gPSBiZWQtPm1heHBhZ2VzaXplOwotICAgICAgZWxzZSBpZiAobS0+Y291bnQgPT0gMCkKLQlwLT5wX2FsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotICAgICAgZWxzZQotCXAtPnBfYWxpZ24gPSAwOwotCi0gICAgICBwLT5wX29mZnNldCA9IDA7Ci0gICAgICBwLT5wX2ZpbGVzeiA9IDA7Ci0gICAgICBwLT5wX21lbXN6ID0gMDsKLQotICAgICAgaWYgKG0tPmluY2x1ZGVzX2ZpbGVoZHIpCi0JewotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgcC0+cF9mbGFncyB8PSBQRl9SOwotCSAgcC0+cF9vZmZzZXQgPSAwOwotCSAgcC0+cF9maWxlc3ogPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCSAgcC0+cF9tZW1zeiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JICBpZiAobS0+Y291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAocC0+cF90eXBlID09IFBUX0xPQUQpOwotCi0JICAgICAgaWYgKHAtPnBfdmFkZHIgPCAoYmZkX3ZtYSkgb2ZmKQotCQl7Ci0JCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iKSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBwLT5wX3ZhZGRyIC09IG9mZjsKLQkgICAgICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQlwLT5wX3BhZGRyIC09IG9mZjsKLQkgICAgfQotCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCSAgICB7Ci0JICAgICAgZmlsZWhkcl92YWRkciA9IHAtPnBfdmFkZHI7Ci0JICAgICAgZmlsZWhkcl9wYWRkciA9IHAtPnBfcGFkZHI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChtLT5pbmNsdWRlc19waGRycykKLQl7Ci0JICBpZiAoISBtLT5wX2ZsYWdzX3ZhbGlkKQotCSAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7Ci0KLQkgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCSAgICB7Ci0JICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCQl7Ci0JCSAgcGhkcnNfdmFkZHIgPSBwLT5wX3ZhZGRyICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkJICBwaGRyc19wYWRkciA9IHAtPnBfcGFkZHIgKyBiZWQtPnMtPnNpemVvZl9laGRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHAtPnBfb2Zmc2V0ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQotCSAgICAgIGlmIChtLT5jb3VudCA+IDApCi0JCXsKLQkJICBCRkRfQVNTRVJUIChwLT5wX3R5cGUgPT0gUFRfTE9BRCk7Ci0JCSAgcC0+cF92YWRkciAtPSBvZmYgLSBwLT5wX29mZnNldDsKLQkJICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQkgICAgcC0+cF9wYWRkciAtPSBvZmYgLSBwLT5wX29mZnNldDsKLQkJfQotCi0JICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCQl7Ci0JCSAgcGhkcnNfdmFkZHIgPSBwLT5wX3ZhZGRyOwotCQkgIHBoZHJzX3BhZGRyID0gcC0+cF9wYWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJcGhkcnNfdmFkZHIgPSBiZWQtPm1heHBhZ2VzaXplICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkgICAgfQotCi0JICBwLT5wX2ZpbGVzeiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0JICBwLT5wX21lbXN6ICs9IGFsbG9jICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLQl9Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgfHwgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfY29yZSkpCi0JewotCSAgaWYgKCEgbS0+aW5jbHVkZXNfZmlsZWhkciAmJiAhIG0tPmluY2x1ZGVzX3BoZHJzKQotCSAgICBwLT5wX29mZnNldCA9IG9mZjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIGFkanVzdDsKLQotCSAgICAgIGFkanVzdCA9IG9mZiAtIChwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KTsKLQkgICAgICBwLT5wX2ZpbGVzeiArPSBhZGp1c3Q7Ci0JICAgICAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHZvZmYgPSBvZmY7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3BwID0gbS0+c2VjdGlvbnM7IGkgPCBtLT5jb3VudDsgaSsrLCBzZWNwcCsrKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmbGFnd29yZCBmbGFnczsKLQkgIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLQkgIHNlYyA9ICpzZWNwcDsKLQkgIGZsYWdzID0gc2VjLT5mbGFnczsKLQkgIGFsaWduID0gMSA8PCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMpOwotCi0JICAvKiBUaGUgc2VjdGlvbiBtYXkgaGF2ZSBhcnRpZmljaWFsIGFsaWdubWVudCBmb3JjZWQgYnkgYQotCSAgICAgbGluayBzY3JpcHQuICBOb3RpY2UgdGhpcyBjYXNlIGJ5IHRoZSBnYXAgYmV0d2VlbiB0aGUKLQkgICAgIGN1bXVsYXRpdmUgcGhkciB2bWEgYW5kIHRoZSBzZWN0aW9uJ3Mgdm1hLiAgKi8KLQkgIGlmIChwLT5wX3ZhZGRyICsgcC0+cF9tZW1zeiA8IHNlYy0+dm1hKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBhZGp1c3QgPSBzZWMtPnZtYSAtIChwLT5wX3ZhZGRyICsgcC0+cF9tZW1zeik7Ci0KLQkgICAgICBwLT5wX21lbXN6ICs9IGFkanVzdDsKLQkgICAgICBvZmYgKz0gYWRqdXN0OwotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCSAgICB9Ci0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIGJmZF9zaWduZWRfdm1hIGFkanVzdDsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGFkanVzdCA9IHNlYy0+bG1hIC0gKHAtPnBfcGFkZHIgKyBwLT5wX21lbXN6KTsKLQkJICBpZiAoYWRqdXN0IDwgMCkKLQkJICAgIGFkanVzdCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXsKLQkJICAvKiBUaGUgc2VjdGlvbiBWTUEgbXVzdCBlcXVhbCB0aGUgZmlsZSBwb3NpdGlvbgotCQkgICAgIG1vZHVsbyB0aGUgcGFnZSBzaXplLiAgRklYTUU6IEknbSBub3Qgc3VyZSBpZgotCQkgICAgIHRoaXMgYWRqdXN0bWVudCBpcyByZWFsbHkgbmVjZXNzYXJ5LiAgV2UgdXNlZCB0bwotCQkgICAgIG5vdCBoYXZlIHRoZSBTRUNfTE9BRCBjYXNlIGp1c3QgYWJvdmUsIGFuZCB0aGVuCi0JCSAgICAgdGhpcyB3YXMgbmVjZXNzYXJ5LCBidXQgbm93IEknbSBub3Qgc3VyZS4gICovCi0JCSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JCSAgICBhZGp1c3QgPSAoc2VjLT52bWEgLSB2b2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JCSAgZWxzZQotCQkgICAgYWRqdXN0ID0gKHNlYy0+dm1hIC0gdm9mZikgJSBhbGlnbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYWRqdXN0ID0gMDsKLQotCSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQkJewotCQkgIGlmIChpID09IDApCi0JCSAgICB7Ci0JCSAgICAgICgqIF9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiKSwKLQkJCSBiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBzZWMtPmxtYSk7Ci0JCSAgICAgICgqIF9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IiksCi0JCQkgcC0+cF9wYWRkcik7Ci0KLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OwotCQkgIG9mZiArPSBhZGp1c3Q7Ci0JCSAgdm9mZiArPSBhZGp1c3Q7Ci0JCSAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCQkgICAgcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCQl9Ci0KLQkgICAgICBzZWMtPmZpbGVwb3MgPSBvZmY7Ci0KLQkgICAgICAvKiBXZSBjaGVjayBTRUNfSEFTX0NPTlRFTlRTIGhlcmUgYmVjYXVzZSBpZiBOT0xPQUQgaXMKLSAgICAgICAgICAgICAgICAgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQgd2UgbWF5IGhhdmUgYSBzZWN0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgU0VDX0xPQUQgY2xlYXIgYnV0IHdoaWNoIGlzIHN1cHBvc2VkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkgIHx8IChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JCW9mZiArPSBzZWMtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXZvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICAgIH0KLQotCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfY29yZSkKLQkgICAgewotCSAgICAgIGlmIChpID09IDApCS8qIHRoZSBhY3R1YWwgIm5vdGUiIHNlZ21lbnQgKi8KLQkJewkJLyogdGhpcyBvbmUgYWN0dWFsbHkgY29udGFpbnMgZXZlcnl0aGluZy4gKi8KLQkJICBzZWMtPmZpbGVwb3MgPSBvZmY7Ci0JCSAgcC0+cF9maWxlc3ogPSBzZWMtPl9yYXdfc2l6ZTsKLQkJICBvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0JCSAgdm9mZiA9IG9mZjsKLQkJfQotCSAgICAgIGVsc2UJLyogZmFrZSBzZWN0aW9ucyAtLSBkb24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gKi8KLQkJewotCQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JCSAgc2VjLT5fcmF3X3NpemUgPSAwOwotCQkgIGZsYWdzID0gc2VjLT5mbGFncyA9IDA7CS8qIG5vIGNvbnRlbnRzICovCi0JCX0KLQkgICAgICBwLT5wX21lbXN6ID0gMDsKLQkgICAgICBwLT5wX2FsaWduID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcC0+cF9tZW1zeiArPSBzZWMtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJcC0+cF9maWxlc3ogKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoYWxpZ24gPiBwLT5wX2FsaWduCi0JCSAgJiYgKHAtPnBfdHlwZSAhPSBQVF9MT0FEIHx8IChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDApKQotCQlwLT5wX2FsaWduID0gYWxpZ247Ci0JICAgIH0KLQotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgewotCSAgICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0NPREUpICE9IDApCi0JCXAtPnBfZmxhZ3MgfD0gUEZfWDsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCQlwLT5wX2ZsYWdzIHw9IFBGX1c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgc2V0IHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zLCB3ZSBjYW4gc2V0IHVwCi0gICAgIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIG5vbiBQVF9MT0FEIHNlZ21lbnRzLiAgKi8KLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAsIHAgPSBwaGRyczsKLSAgICAgICBtICE9IE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQsIHArKykKLSAgICB7Ci0gICAgICBpZiAocC0+cF90eXBlICE9IFBUX0xPQUQgJiYgbS0+Y291bnQgPiAwKQotCXsKLQkgIEJGRF9BU1NFUlQgKCEgbS0+aW5jbHVkZXNfZmlsZWhkciAmJiAhIG0tPmluY2x1ZGVzX3BoZHJzKTsKLQkgIHAtPnBfb2Zmc2V0ID0gbS0+c2VjdGlvbnNbMF0tPmZpbGVwb3M7Ci0JfQotICAgICAgaWYgKG0tPmNvdW50ID09IDApCi0JewotCSAgaWYgKG0tPmluY2x1ZGVzX2ZpbGVoZHIpCi0JICAgIHsKLQkgICAgICBwLT5wX3ZhZGRyID0gZmlsZWhkcl92YWRkcjsKLQkgICAgICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQlwLT5wX3BhZGRyID0gZmlsZWhkcl9wYWRkcjsKLQkgICAgfQotCSAgZWxzZSBpZiAobS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHsKLQkgICAgICBwLT5wX3ZhZGRyID0gcGhkcnNfdmFkZHI7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciA9IHBoZHJzX3BhZGRyOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBDbGVhciBvdXQgYW55IHByb2dyYW0gaGVhZGVycyB3ZSBhbGxvY2F0ZWQgYnV0IGRpZCBub3QgdXNlLiAgKi8KLSAgZm9yICg7IGNvdW50IDwgYWxsb2M7IGNvdW50KyssIHArKykKLSAgICB7Ci0gICAgICBtZW1zZXQgKHAsIDAsIHNpemVvZiAqcCk7Ci0gICAgICBwLT5wX3R5cGUgPSBQVF9OVUxMOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gcGhkcnM7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgYmVkLT5zLT5zaXplb2ZfZWhkciwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJlZC0+cy0+d3JpdGVfb3V0X3BoZHJzIChhYmZkLCBwaGRycywgYWxsb2MpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHByb2dyYW0gaGVhZGVyLgotCi0gICBJZiB0aGlzIGlzIGNhbGxlZCBieSB0aGUgbGlua2VyIGJlZm9yZSBhbnkgb2YgdGhlIHNlY3Rpb24gVk1BJ3MgYXJlIHNldCwgaXQKLSAgIGNhbid0IGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgYSBzdHJhbmdlIG1lbW9yeSBsYXlvdXQuICBUaGlzIG9ubHkKLSAgIGhhcHBlbnMgd2hlbiBTSVpFT0ZfSEVBREVSUyBpcyB1c2VkIGluIGEgbGlua2VyIHNjcmlwdC4gIEluIHRoaXMgY2FzZSwKLSAgIFNPUlRFRF9IRFJTIGlzIE5VTEwgYW5kIHdlIGFzc3VtZSB0aGUgbm9ybWFsIHNjZW5hcmlvIG9mIG9uZSB0ZXh0IGFuZCBvbmUKLSAgIGRhdGEgc2VnbWVudCAoZXhjbHVzaXZlIG9mIC5pbnRlcnAgYW5kIC5keW5hbWljKS4KLQotICAgPz8/IFVzZXIgd3JpdHRlbiBzY3JpcHRzIG11c3QgZWl0aGVyIG5vdCB1c2UgU0laRU9GX0hFQURFUlMsIG9yIGFzc3VtZSB0aGVyZQotICAgd2lsbCBiZSB0d28gc2VnbWVudHMuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZQotZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc2l6ZV90IHNlZ3M7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIFdlIGNhbid0IHJldHVybiBhIGRpZmZlcmVudCByZXN1bHQgZWFjaCB0aW1lIHdlJ3JlIGNhbGxlZC4gICovCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplICE9IDApCi0gICAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLQotICAgICAgc2VncyA9IDA7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQkrK3NlZ3M7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplID0gc2VncyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gICAgICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLSAgICB9Ci0KLSAgLyogQXNzdW1lIHdlIHdpbGwgbmVlZCBleGFjdGx5IHR3byBQVF9MT0FEIHNlZ21lbnRzOiBvbmUgZm9yIHRleHQKLSAgICAgYW5kIG9uZSBmb3IgZGF0YS4gICovCi0gIHNlZ3MgPSAyOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgbG9hZGFibGUgaW50ZXJwcmV0ZXIgc2VjdGlvbiwgd2UgbmVlZCBhCi0JIFBUX0lOVEVSUCBzZWdtZW50LiAgSW4gdGhpcyBjYXNlLCBhc3N1bWUgd2UgYWxzbyBuZWVkIGEKLQkgUFRfUEhEUiBzZWdtZW50LCBhbHRob3VnaCB0aGF0IG1heSBub3QgYmUgdHJ1ZSBmb3IgYWxsCi0JIHRhcmdldHMuICAqLwotICAgICAgc2VncyArPSAyOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgbmVlZCBhIFBUX0RZTkFNSUMgc2VnbWVudC4gICovCi0gICAgICArK3NlZ3M7Ci0gICAgfQotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCSAgJiYgc3RybmNtcCAocy0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLQl7Ci0JICAvKiBXZSBuZWVkIGEgUFRfTk9URSBzZWdtZW50LiAgKi8KLQkgICsrc2VnczsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBjb3VudCB1cCBhbnkgcHJvZ3JhbSBoZWFkZXJzIGl0IG1pZ2h0IG5lZWQuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykKLSAgICB7Ci0gICAgICBpbnQgYTsKLQotICAgICAgYSA9ICgqYmVkLT5lbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgKGFiZmQpOwotICAgICAgaWYgKGEgPT0gLTEpCi0JYWJvcnQgKCk7Ci0gICAgICBzZWdzICs9IGE7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgPSBzZWdzICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBmaWxlIHBvc2l0aW9ucyBvZiBhbGwgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyBjYWxsZWQgYnkKLSAgIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIEFsbCB0aGUgc2VjdGlvbiBzaXplcyBhbmQKLSAgIFZNQXMgbXVzdCBiZSBrbm93biBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCi0KLSAgIFdlIGRvIG5vdCBjb25zaWRlciByZWxvYyBzZWN0aW9ucyBhdCB0aGlzIHBvaW50LCB1bmxlc3MgdGhleSBmb3JtCi0gICBwYXJ0IG9mIHRoZSBsb2FkYWJsZSBpbWFnZS4gIFJlbG9jIHNlY3Rpb25zIGFyZSBhc3NpZ25lZCBmaWxlCi0gICBwb3NpdGlvbnMgaW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MsIHdoaWNoIGlzIGNhbGxlZCBieQotICAgd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFuZCBmaW5hbF9saW5rLgotCi0gICBXZSBhbHNvIGRvbid0IHNldCB0aGUgcG9zaXRpb25zIG9mIHRoZSAuc3ltdGFiIGFuZCAuc3RydGFiIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKiBjb25zdCB0ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogY29uc3QgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKiBjb25zdCBpX3NoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGZpbGVfcHRyIG9mZjsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX2NvcmUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBTdGFydCBhZnRlciB0aGUgRUxGIGhlYWRlci4gICovCi0gICAgICBvZmYgPSBpX2VoZHJwLT5lX2Voc2l6ZTsKLQotICAgICAgLyogV2UgYXJlIG5vdCBjcmVhdGluZyBhbiBleGVjdXRhYmxlLCB3aGljaCBtZWFucyB0aGF0IHdlIGFyZQotCSBub3QgY3JlYXRpbmcgYSBwcm9ncmFtIGhlYWRlciwgYW5kIHRoYXQgdGhlIGFjdHVhbCBvcmRlciBvZgotCSB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgaXMgdW5pbXBvcnRhbnQuICAqLwotICAgICAgZm9yIChpID0gMSwgaGRycHAgPSBpX3NoZHJwcCArIDE7IGkgPCBpX2VoZHJwLT5lX3NobnVtOyBpKyssIGhkcnBwKyspCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCSAgaGRyID0gKmhkcnBwOwotCSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICAgewotCSAgICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChpID09IHRkYXRhLT5zeW10YWJfc2VjdGlvbgotCSAgICAgIHx8IGkgPT0gdGRhdGEtPnN0cnRhYl9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0KLSAgICAgIC8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRlZCBzZWN0aW9ucyBiYXNlZCBvbiB0aGUKLSAgICAgICAgIGFzc2lnbm1lbnQgb2Ygc2VjdGlvbnMgdG8gc2VnbWVudHMuICAqLwotICAgICAgaWYgKCEgYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBvdGhlciBzZWN0aW9ucy4gICovCi0KLSAgICAgIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0gICAgICBmb3IgKGkgPSAxLCBoZHJwcCA9IGlfc2hkcnBwICsgMTsgaSA8IGlfZWhkcnAtPmVfc2hudW07IGkrKywgaGRycHArKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JICBoZHIgPSAqaGRycHA7Ci0JICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgICAgJiYgaGRyLT5iZmRfc2VjdGlvbi0+ZmlsZXBvcyAhPSAwKQotCSAgICBoZHItPnNoX29mZnNldCA9IGhkci0+YmZkX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBlbHNlIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiB3YXJuaW5nOiBhbGxvY2F0ZWQgc2VjdGlvbiBgJXMnIG5vdCBpbiBzZWdtZW50IiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkoaGRyLT5iZmRfc2VjdGlvbiA9PSBOVUxMCi0JCSA/ICIqdW5rbm93bioiCi0JCSA6IGhkci0+YmZkX3NlY3Rpb24tPm5hbWUpKSk7Ci0JICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JCW9mZiArPSAoaGRyLT5zaF9hZGRyIC0gb2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JICAgICAgZWxzZQotCQlvZmYgKz0gKGhkci0+c2hfYWRkciAtIG9mZikgJSBoZHItPnNoX2FkZHJhbGlnbjsKLQkgICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsCi0JCQkJCQkJICAgICAgIGZhbHNlKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9SRUwKLQkJICAgfHwgaGRyLT5zaF90eXBlID09IFNIVF9SRUxBCi0JCSAgIHx8IGhkciA9PSBpX3NoZHJwcFt0ZGF0YS0+c3ltdGFiX3NlY3Rpb25dCi0JCSAgIHx8IGhkciA9PSBpX3NoZHJwcFt0ZGF0YS0+c3RydGFiX3NlY3Rpb25dKQotCSAgICBoZHItPnNoX29mZnNldCA9IC0xOwotCSAgZWxzZQotCSAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCX0KLSAgICB9Ci0KLSAgLyogUGxhY2UgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0gIG9mZiA9IGFsaWduX2ZpbGVfcG9zaXRpb24gKG9mZiwgYmVkLT5zLT5maWxlX2FsaWduKTsKLSAgaV9laGRycC0+ZV9zaG9mZiA9IG9mZjsKLSAgb2ZmICs9IGlfZWhkcnAtPmVfc2hudW0gKiBpX2VoZHJwLT5lX3NoZW50c2l6ZTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHJlcF9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcnAgPSAwOyAvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIGludCBjb3VudDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc2hzdHJ0YWI7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLQotICBzaHN0cnRhYiA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX3Noc3RydGFiIChhYmZkKSA9IHNoc3RydGFiOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMF0gPSBFTEZNQUcwOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzFdID0gRUxGTUFHMTsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcyXSA9IEVMRk1BRzI7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHM10gPSBFTEZNQUczOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQ0xBU1NdID0gYmVkLT5zLT5lbGZjbGFzczsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9EQVRBXSA9Ci0gICAgYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gRUxGREFUQTJNU0IgOiBFTEZEQVRBMkxTQjsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9WRVJTSU9OXSA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX05PTkU7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQUJJVkVSU0lPTl0gPSAwOwotCi0gIGZvciAoY291bnQgPSBFSV9QQUQ7IGNvdW50IDwgRUlfTklERU5UOyBjb3VudCsrKQotICAgIGlfZWhkcnAtPmVfaWRlbnRbY291bnRdID0gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9EWU47Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9FWEVDOwotICBlbHNlIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfQ09SRTsKLSAgZWxzZQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX1JFTDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfdW5rbm93bjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX05PTkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgaWYgKGJmZF9lbGZfZ2V0X2FyY2hfc2l6ZSAoYWJmZCkgPT0gNjQpCi0JaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fU1BBUkNWOTsKLSAgICAgIGVsc2UKLQlpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TUEFSQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM3MDoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1MzNzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV8zODY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2lhNjQ6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9JQV82NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNXzY4SzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNXzg4SzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTg2MDoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNXzg2MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNXzk2MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoJLyogTUlQUyBSeHh4eCAqLwotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTUlQUzsJLyogb25seSBNSVBTIFIzMDAwICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2hwcGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9QQVJJU0M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9QUEM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQUxQSEE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NoOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fU0g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2QxMHY6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRDEwVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDMwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMzBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9mcjMwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0ZSMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTUNPUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2F2cjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FWUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6ICAgICAgICAgICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX1Y4NTA7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfQVJDOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FSTTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NMzJSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcGo6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9QSjsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTk9ORTsKLSAgICB9Ci0gIGlfZWhkcnAtPmVfdmVyc2lvbiA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLSAgaV9laGRycC0+ZV9laHNpemUgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCi0gIC8qIG5vIHByb2dyYW0gaGVhZGVyLCBmb3Igbm93LiAqLwotICBpX2VoZHJwLT5lX3Bob2ZmID0gMDsKLSAgaV9laGRycC0+ZV9waGVudHNpemUgPSAwOwotICBpX2VoZHJwLT5lX3BobnVtID0gMDsKLQotICAvKiBlYWNoIGJmZCBzZWN0aW9uIGlzIHNlY3Rpb24gaGVhZGVyIGVudHJ5ICovCi0gIGlfZWhkcnAtPmVfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpX2VoZHJwLT5lX3NoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3NoZHI7Ci0KLSAgLyogaWYgd2UncmUgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgd2UnbGwgbmVlZCBhIHByb2dyYW0gaGVhZGVyIHRhYmxlICovCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBpdCBhbGwgaGFwcGVucyBsYXRlciAqLwotI2lmIDAKLSAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcik7Ci0KLSAgICAgIC8qIGVsZl9idWlsZF9waGRycygpIHJldHVybnMgYSAoTlVMTC10ZXJtaW5hdGVkKSBhcnJheSBvZgotCSBFbGZfSW50ZXJuYWxfUGhkcnMgKi8KLSAgICAgIGlfcGhkcnAgPSBlbGZfYnVpbGRfcGhkcnMgKGFiZmQsIGlfZWhkcnAsIGlfc2hkcnAsICZpX2VoZHJwLT5lX3BobnVtKTsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSBvdXRiYXNlOwotICAgICAgb3V0YmFzZSArPSBpX2VoZHJwLT5lX3BoZW50c2l6ZSAqIGlfZWhkcnAtPmVfcGhudW07Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7Ci0gICAgICBpX3BoZHJwID0gMDsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3ltdGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zaHN0cnRhYiIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMQotICAgICAgfHwgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCi0gICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSByZWxvYyBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHBhcnQKLSAgIG9mIHRoZSBsb2FkYWJsZSBmaWxlIGltYWdlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipzaGRycHA7Ci0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICBmb3IgKGkgPSAxLCBzaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpICsgMTsKLSAgICAgICBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0gICAgICAgaSsrLCBzaGRycHArKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc2hkcnA7Ci0KLSAgICAgIHNoZHJwID0gKnNoZHJwcDsKLSAgICAgIGlmICgoc2hkcnAtPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIHNoZHJwLT5zaF9vZmZzZXQgPT0gLTEpCi0Jb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHNoZHJwLCBvZmYsIHRydWUpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgICAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVkLT5zLT53cml0ZV9yZWxvY3MsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogQWZ0ZXIgd3JpdGluZyB0aGUgaGVhZGVycywgd2UgbmVlZCB0byB3cml0ZSB0aGUgc2VjdGlvbnMgdG9vLi4uICovCi0gIGZvciAoY291bnQgPSAxOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKQotCSgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIChhYmZkLCBpX3NoZHJwW2NvdW50XSk7Ci0gICAgICBpZiAoaV9zaGRycFtjb3VudF0tPmNvbnRlbnRzKQotCXsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9zaGRycFtjb3VudF0tPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3dyaXRlIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMsIGlfc2hkcnBbY291bnRdLT5zaF9zaXplLAotCQkJICAgICAxLCBhYmZkKQotCQkgICE9IGlfc2hkcnBbY291bnRdLT5zaF9zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlciBuYW1lcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyLnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZWxmX3Noc3RydGFiIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLAotCQkJCQkJZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyKTsKLQotICByZXR1cm4gYmVkLT5zLT53cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCk7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCk7Ci19Ci0vKiBnaXZlbiBhIHNlY3Rpb24sIHNlYXJjaCB0aGUgaGVhZGVyIHRvIGZpbmQgdGhlbS4uLiAqLwotaW50Ci1fYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWMgKmFzZWN0OwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpbnQgaW5kZXg7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIGludCBtYXhpbmRleCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heGluZGV4OyBpbmRleCsrKQotICAgIHsKLSAgICAgIGhkciA9IGlfc2hkcnBbaW5kZXhdOwotICAgICAgaWYgKGhkci0+YmZkX3NlY3Rpb24gPT0gYXNlY3QpCi0JcmV0dXJuIGluZGV4OwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCi0JewotCSAgaW50IHJldHZhbDsKLQotCSAgaGRyID0gaV9zaGRycFtpbmRleF07Ci0JICByZXR2YWwgPSBpbmRleDsKLQkgIGlmICgoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotCSAgICAgIChhYmZkLCBoZHIsIGFzZWN0LCAmcmV0dmFsKSkKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGFzZWN0KSkKLSAgICByZXR1cm4gU0hOX0FCUzsKLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYXNlY3QpKQotICAgIHJldHVybiBTSE5fQ09NTU9OOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChhc2VjdCkpCi0gICAgcmV0dXJuIFNITl9VTkRFRjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIEdpdmVuIGEgQkZEIHN5bWJvbCwgcmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSwgb3IgLTEKLSAgIG9uIGVycm9yLiAgKi8KLQotaW50Ci1fYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCBhc3ltX3B0cl9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFzeW1fcHRyX3B0cjsKLXsKLSAgYXN5bWJvbCAqYXN5bV9wdHIgPSAqYXN5bV9wdHJfcHRyOwotICBpbnQgaWR4OwotICBmbGFnd29yZCBmbGFncyA9IGFzeW1fcHRyLT5mbGFnczsKLQotICAvKiBXaGVuIGdhcyBjcmVhdGVzIHJlbG9jYXRpb25zIGFnYWluc3QgbG9jYWwgbGFiZWxzLCBpdCBjcmVhdGVzIGl0cwotICAgICBvd24gc3ltYm9sIGZvciB0aGUgc2VjdGlvbiwgYnV0IGRvZXMgcHV0IHRoZSBzeW1ib2wgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLCBzbyB1ZGF0YSBpcyAwLiAgV2hlbiB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LCB0aGlzIHNlY3Rpb24gc3ltYm9sIG1heSBiZSBmb3Igb25lIG9mIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByYXRoZXIgdGhhbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoYXN5bV9wdHItPnVkYXRhLmkgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgICAgJiYgYXN5bV9wdHItPnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGluZHg7Ci0KLSAgICAgIGlmIChhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPmluZGV4OwotICAgICAgaWYgKGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpW2luZHhdKQotCWFzeW1fcHRyLT51ZGF0YS5pID0gZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0tPnVkYXRhLmk7Ci0gICAgfQotCi0gIGlkeCA9IGFzeW1fcHRyLT51ZGF0YS5pOwotCi0gIGlmIChpZHggPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIHdoZW4gdXNpbmcgLS1zdHJpcC1zeW1ib2wgb24gYSBzeW1ib2wKLSAgICAgICAgIHdoaWNoIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChhc3ltX3B0cikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotI2lmIERFQlVHICYgNAotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gMHglLjhseCVzXG4iKSwKLQkgICAgIChsb25nKSBhc3ltX3B0ciwgYXN5bV9wdHItPm5hbWUsIGlkeCwgZmxhZ3MsCi0JICAgICBlbGZfc3ltYm9sX2ZsYWdzIChmbGFncykpOwotICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBjb3BpZXMgYW55IHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppZWhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG51bV9zZWdtZW50czsKLSAgYm9vbGVhbiBwaGRyX2luY2x1ZGVkID0gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChlbGZfdGRhdGEgKGliZmQpLT5waGRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWVoZHIgPSBlbGZfZWxmaGVhZGVyIChpYmZkKTsKLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgbnVtX3NlZ21lbnRzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfcGhudW07Ci0KLSNkZWZpbmUgSVNfQ09OVEFJTkVEX0JZKGFkZHIsIGxlbiwgYm90dG9tLCBwaGRyKQkJIAlcCi0JICAoKGFkZHIpID49IChib3R0b20pCQkJCSAJICAJXAotCSAgICYmICggICAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9tZW1zeikJXAotCSAgICAgICB8fCAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9maWxlc3opKSkKLQotICAvKiBTcGVjaWFsIGNhc2U6IGNvcmVmaWxlICJOT1RFIiBzZWN0aW9uIGNvbnRhaW5pbmcgcmVncywgcHJwc2luZm8gZXRjLiAqLwotCi0jZGVmaW5lIElTX0NPUkVGSUxFX05PVEUocCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIChwLT5wX3R5cGUgPT0gUFRfTk9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIGJmZF9nZXRfZm9ybWF0IChpYmZkKSA9PSBiZmRfY29yZSAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgcy0+dm1hID09IDAgJiYgcy0+bG1hID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldCAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zICsgcy0+X3Jhd19zaXplICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikKLQotICAvKiBUaGUgY29tcGxpY2F0ZWQgY2FzZSB3aGVuIHBfdmFkZHIgaXMgMCBpcyB0byBoYW5kbGUgdGhlIFNvbGFyaXMKLSAgICAgbGlua2VyLCB3aGljaCBnZW5lcmF0ZXMgYSBQVF9JTlRFUlAgc2VjdGlvbiB3aXRoIHBfdmFkZHIgYW5kCi0gICAgIHBfbWVtc3ogc2V0IHRvIDAuICAqLwotCi0jZGVmaW5lIElTX1NPTEFSSVNfUFRfSU5URVJQKHAsIHMpCQkJCQlcCi0JICAgIChwLT5wX3ZhZGRyID09IDAJCQkJCQlcCi0JICAgICAmJiBwLT5wX2ZpbGVzeiA+IDAJCQkJCQlcCi0JICAgICAmJiAocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCQkJXAotCSAgICAgJiYgcy0+X3Jhd19zaXplID4gMAkJCQkJXAotCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgPj0gcC0+cF9vZmZzZXQJCQlcCi0JICAgICAmJiAoKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUJCQlcCi0JCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikpCi0KLSAgLyogU2NhbiB0aHJvdWdoIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBmb3IgKGkgPSAwLCBwID0gZWxmX3RkYXRhIChpYmZkKS0+cGhkcjsgaSA8IG51bV9zZWdtZW50czsgaSsrLCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNzZWNzOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICAgYXNlY3Rpb24gKm9zOwotICAgICAgdW5zaWduZWQgaW50IGlzZWM7Ci0gICAgICBiZmRfdm1hIG1hdGNoaW5nX2xtYTsKLSAgICAgIGJmZF92bWEgc3VnZ2VzdGVkX2xtYTsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBCRkQsIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUKLQkgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEEgc2VjdGlvbiB3aWxsIGJlIGluY2x1ZGVkCi0JIGlmIGl0IGlzIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc2VnbWVudCwgYW5kIGl0IGlzCi0JIGFuIGFsbG9jYXRlZCBzZWdtZW50LCBhbmQgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24KLQkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLSAgICAgIGNzZWNzID0gMDsKLSAgICAgIGZvciAocyA9IGliZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICArK2NzZWNzOwotCSAgICBlbHNlIGlmIChJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICArK2NzZWNzOwotCSAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgbWFwIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgb2YgdGhlCi0JIHNlY3Rpb25zIHdlIGhhdmUgc2VsZWN0ZWQuICAqLwotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICAgICsgKChzaXplX3QpIGNzZWNzIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBtYXAuICBEZWZhdWx0IHRvCi0JIHVzaW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IGluIHRoZSBpbnB1dCBCRkQuICAqLwotICAgICAgbS0+bmV4dCAgICAgICAgICA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgICAgICAgID0gcC0+cF90eXBlOwotICAgICAgbS0+cF9mbGFncyAgICAgICA9IHAtPnBfZmxhZ3M7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPnBfcGFkZHIgICAgICAgPSBwLT5wX3BhZGRyOwotICAgICAgbS0+cF9wYWRkcl92YWxpZCA9IDE7Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiB0aGlzIHNlZ21lbnQgY29udGFpbnMgdGhlIEVMRiBmaWxlIGhlYWRlcgotCSBhbmQgaWYgaXQgY29udGFpbnMgdGhlIHByb2dyYW0gaGVhZGVycyB0aGVtc2VsdmVzLiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAocC0+cF9vZmZzZXQgPT0gMAotCQkJICAgICAmJiBwLT5wX2ZpbGVzeiA+PSBpZWhkci0+ZV9laHNpemUpOwotCi0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDA7Ci0KLSAgICAgIGlmICghIHBoZHJfaW5jbHVkZWQgfHwgcC0+cF90eXBlICE9IFBUX0xPQUQpCi0JewotCSAgbS0+aW5jbHVkZXNfcGhkcnMgPQotCSAgICAocC0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCi0JICAgICAmJiAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzegotCQkgPj0gKChiZmRfdm1hKSBpZWhkci0+ZV9waG9mZgotCQkgICAgICsgaWVoZHItPmVfcGhudW0gKiBpZWhkci0+ZV9waGVudHNpemUpKSk7Ci0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQgJiYgbS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHBoZHJfaW5jbHVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGNzZWNzID09IDApCi0JewotCSAgLyogU3BlY2lhbCBzZWdtZW50cywgc3VjaCBhcyB0aGUgUFRfUEhEUiBzZWdtZW50LCBtYXkgY29udGFpbgotCSAgICAgbm8gc2VjdGlvbnMsIGJ1dCBvcmRpbmFyeSwgbG9hZGFibGUgc2VnbWVudHMgc2hvdWxkIGNvbnRhaW4KLQkgICAgIHNvbWV0aGluZy4gICovCi0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJKF8oIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgbS0+Y291bnQgPSAwOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHNjYW4gdGhlIHNlY3Rpb25zIGluIHRoZSBpbnB1dCBCRkQgYWdhaW4gYW5kIGF0dGVtcHQKLQkgdG8gYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb25zIHRvIHRoZSBzZWdtZW50IG1hcC4KLQkgVGhlIHByb2JsZW0gaGVyZSBpcyBob3cgdG8gaGFuZGxlIGFuIG91dHB1dCBzZWN0aW9uIHdoaWNoIGhhcwotCSBiZWVuIG1vdmVkIChpZSBoYWQgaXRzIExNQSBjaGFuZ2VkKS4gIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXM6Ci0KLQkgMS4gTm9uZSBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2VnbWVudCBMTUEgZnJvbSB0aGUKLQkgICAgaW5wdXQgQkZELgotCi0JIDIuIEFsbCBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQotCSAzLiBTb21lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIG90aGVycyBoYXZlIG5vdC4KLQkgICAgSW4gdGhpcyBjYXNlIHRob3NlIHNlY3Rpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gbW92ZWQgY2FuIGJlCi0JICAgIHBsYWNlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50IHdoaWNoIHdpbGwgaGF2ZSB0byBoYXZlIGl0cyBzaXplLAotCSAgICBhbmQgcG9zc2libHkgaXRzIExNQSBjaGFuZ2VkLCBhbmQgYSBuZXcgc2VnbWVudCBvciBzZWdtZW50cyB3aWxsCi0JICAgIGhhdmUgdG8gYmUgY3JlYXRlZCB0byBjb250YWluIHRoZSBvdGhlciBzZWN0aW9ucy4KLQotCSA0LiBUaGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLCBidXQgbm90IGJlIHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBzZWdtZW50Ci0JICAgIG9yIHNlZ21lbnRzIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgotCi0JIEluIG9yZGVyIHRvIHNhdmUgdGltZSwgd2UgYWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCB0aGUgc2VjdGlvbgotCSBwb2ludGVycyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgQXMgdGhlc2Ugc2VjdGlvbnMgZ2V0IGFzc2lnbmVkCi0JIHRvIGEgc2VnbWVudCwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXkuICAqLwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbiAqKSAqIGNzZWNzKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3RlcCBPbmU6IFNjYW4gZm9yIHNlZ21lbnQgdnMgc2VjdGlvbiBMTUEgY29uZmxpY3RzLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIHNlY3Rpb24gYXJyYXkgYWxsb2NhdGVkIGFib3ZlLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEluIHRoZSBjb21tb24KLQkgY2FzZSwgd2hlcmUgdGhlIHNlY3Rpb25zIGhhdmUgbm90IGJlZW4gbW92ZWQsIHRoaXMgbWVhbnMgdGhhdAotCSB3ZSBoYXZlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBzZWdtZW50LCBhbmQgdGhlcmUgaXMgbm90aGluZwotCSBtb3JlIHRvIGRvLiAgKi8KLQotICAgICAgaXNlYyA9IDA7Ci0gICAgICBtYXRjaGluZ19sbWEgPSAwOwotICAgICAgc3VnZ2VzdGVkX2xtYSA9IDA7Ci0KLSAgICAgIGZvciAoaiA9IDAsIHMgPSBpYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotCi0JICBpZiAoKCgoSVNfQ09OVEFJTkVEX0JZIChzLT52bWEsIHMtPl9yYXdfc2l6ZSwgcC0+cF92YWRkciwgcCkKLQkJIHx8IElTX1NPTEFSSVNfUFRfSU5URVJQIChwLCBzKSkKLQkJJiYgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICAgICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICAmJiBvcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbnNbaisrXSA9IHM7Ci0KLQkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgbGlua2VyIGFsd2F5cyBzZXRzIHBfcGFkZHIgdG8gMC4KLQkJIFdlIHRyeSB0byBjYXRjaCB0aGF0IGNhc2UgaGVyZSwgYW5kIHNldCBpdCB0byB0aGUKLQkJIGNvcnJlY3QgdmFsdWUuICAqLwotCSAgICAgIGlmIChwLT5wX3BhZGRyID09IDAKLQkJICAmJiBwLT5wX3ZhZGRyICE9IDAKLQkJICAmJiBpc2VjID09IDAKLQkJICAmJiBvcy0+bG1hICE9IDAKLQkJICAmJiAob3MtPnZtYSA9PSAocC0+cF92YWRkcgotCQkJCSAgKyAobS0+aW5jbHVkZXNfZmlsZWhkcgotCQkJCSAgICAgPyBpZWhkci0+ZV9laHNpemUKLQkJCQkgICAgIDogMCkKLQkJCQkgICsgKG0tPmluY2x1ZGVzX3BoZHJzCi0JCQkJICAgICA/IGllaGRyLT5lX3BobnVtICogaWVoZHItPmVfcGhlbnRzaXplCi0JCQkJICAgICA6IDApKSkpCi0JCW0tPnBfcGFkZHIgPSBwLT5wX3ZhZGRyOwotCi0JICAgICAgLyogTWF0Y2ggdXAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgd2l0aCB0aGUKLQkJIExNQSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKLQkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkJewotCQkgIGlmIChtYXRjaGluZ19sbWEgPT0gMCkKLQkJICAgIG1hdGNoaW5nX2xtYSA9IG9zLT5sbWE7Ci0KLQkJICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB0aGUgc2VjdGlvbiBmaXRzIHdpdGhpbiB0aGUgc2VnbWVudAotCQkgICAgIHRoYXQgaXQgZG9lcyBub3Qgb3ZlcmxhcCBhbnkgb3RoZXIgc2VjdGlvbiB3aXRoaW4gdGhhdAotCQkgICAgIHNlZ21lbnQuICAqLwotCQkgIG0tPnNlY3Rpb25zW2lzZWMrK10gPSBvczsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGogPT0gY3NlY3MpOwotCi0gICAgICAvKiBTdGVwIFR3bzogQWRqdXN0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCi0JIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoaXNlYyA9PSBjc2VjcykKLQl7Ci0JICAvKiBBbGwgb2YgdGhlIHNlY3Rpb25zIGZpdHRlZCB3aXRoaW4gdGhlIHNlZ21lbnQgYXMgY3VycmVudGx5Ci0JICAgICBzcGVjaWZpZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGNhc2UuICBBZGQgdGhlIHNlZ21lbnQgdG8KLQkgICAgIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBjYXJyeSBvbiB0byBwcm9jZXNzIHRoZSBuZXh0Ci0JICAgICBwcm9ncmFtIGhlYWRlciBpbiB0aGUgaW5wdXQgQkZELiAgKi8KLQkgIG0tPmNvdW50ID0gY3NlY3M7Ci0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQotCSAgZnJlZSAoc2VjdGlvbnMpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChtYXRjaGluZ19sbWEgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIEF0IGxlYXN0IG9uZSBzZWN0aW9uIGZpdHMgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0JCSBLZWVwIGl0LCBidXQgbW9kaWZ5IGl0cyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoIHRoZQotCQkgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgZml0dGVkLiAgKi8KLQotCSAgICAgIG0tPnBfcGFkZHIgPSBtYXRjaGluZ19sbWE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vbmUgb2YgdGhlIHNlY3Rpb25zIGZpdHRlZCBpbnNpZGUgdGhlIGN1cnJlbnQgc2VnbWVudC4KLQkJIENoYW5nZSB0aGUgY3VycmVudCBzZWdtZW50J3MgcGh5c2ljYWwgYWRkcmVzcyB0byBtYXRjaAotCQkgdGhlIExNQSBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4gICovCi0KLQkgICAgICBtLT5wX3BhZGRyID0gc3VnZ2VzdGVkX2xtYTsKLQkgICAgfQotCi0JICAvKiBPZmZzZXQgdGhlIHNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIHRoZSBsbWEgdG8gYWxsb3cKLQkgICAgIGZvciBzcGFjZSB0YWtlbiB1cCBieSBlbGYgaGVhZGVycy4gICovCi0JICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKLQkgICAgbS0+cF9wYWRkciAtPSBpZWhkci0+ZV9laHNpemU7Ci0KLQkgIGlmIChtLT5pbmNsdWRlc19waGRycykKLQkgICAgbS0+cF9wYWRkciAtPSBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZTsKLQl9Ci0KLSAgICAgIC8qIFN0ZXAgVGhyZWU6IExvb3Agb3ZlciB0aGUgc2VjdGlvbnMgYWdhaW4sIHRoaXMgdGltZSBhc3NpZ25pbmcKLQkgdGhvc2UgdGhhdCBmaXQgdG8gdGhlIGN1cnJlbnQgc2VnbWVudCBhbmQgcmVtdm9pbmcgdGhlbSBmcm9tIHRoZQotCSBzZWN0aW9ucyBhcnJheTsgYnV0IG1ha2luZyBzdXJlIG5vdCB0byBsZWF2ZSBsYXJnZSBnYXBzLiAgT25jZSBhbGwKLQkgcG9zc2libGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaXQgaXMKLQkgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMgYW5kIGlmIHNlY3Rpb25zIHN0aWxsIHJlbWFpbgotCSB0byBiZSBhc3NpZ25lZCwgYSBuZXcgc2VnbWVudCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUgcmVwZWF0aW5nCi0JIHRoZSBsb29wLiAgKi8KLSAgICAgIGlzZWMgPSAwOwotICAgICAgZG8KLQl7Ci0JICBtLT5jb3VudCA9IDA7Ci0JICBzdWdnZXN0ZWRfbG1hID0gMDsKLQotCSAgLyogRmlsbCB0aGUgY3VycmVudCBzZWdtZW50IHdpdGggc2VjdGlvbnMgdGhhdCBmaXQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGNzZWNzOyBqKyspCi0JICAgIHsKLQkgICAgICBzID0gc2VjdGlvbnNbal07Ci0KLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQljb250aW51ZTsKLQotCSAgICAgIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICBpZiAoSVNfQ09OVEFJTkVEX0JZIChvcy0+bG1hLCBvcy0+X3Jhd19zaXplLCBtLT5wX3BhZGRyLCBwKQotCQkgIHx8IElTX0NPUkVGSUxFX05PVEUgKHAsIHMpKQotCQl7Ci0JCSAgaWYgKG0tPmNvdW50ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoZSBmaXJzdCBzZWN0aW9uIGluIGEgc2VnbWVudCBkb2VzIG5vdCBzdGFydCBhdAotCQkJIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQsIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nLiAgKi8KLQkJICAgICAgaWYgKG9zLT5sbWEgIT0gKG0tPnBfcGFkZHIKLQkJCQkgICAgICArIChtLT5pbmNsdWRlc19maWxlaGRyCi0JCQkJCSA/IGllaGRyLT5lX2Voc2l6ZSA6IDApCi0JCQkJICAgICAgKyAobS0+aW5jbHVkZXNfcGhkcnMKLQkJCQkJID8gaWVoZHItPmVfcGhudW0gKiBpZWhkci0+ZV9waGVudHNpemUKLQkJCQkJIDogMCkpKQotCQkJYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqIHByZXZfc2VjOwotCQkgICAgICBiZmRfdm1hIG1heHBhZ2VzaXplOwotCi0JCSAgICAgIHByZXZfc2VjID0gbS0+c2VjdGlvbnNbbS0+Y291bnQgLSAxXTsKLQkJICAgICAgbWF4cGFnZXNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob2JmZCktPm1heHBhZ2VzaXplOwotCi0JCSAgICAgIC8qIElmIHRoZSBnYXAgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBzZWN0aW9uCi0JCQkgYW5kIHRoZSBzdGFydCBvZiB0aGlzIHNlY3Rpb24gaXMgbW9yZSB0aGFuIG1heHBhZ2VzaXplCi0JCQkgdGhlbiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHNlZ21lbnQuICAqLwotCQkgICAgICBpZiAoQkZEX0FMSUdOIChwcmV2X3NlYy0+bG1hICsgcHJldl9zZWMtPl9yYXdfc2l6ZSwgbWF4cGFnZXNpemUpCi0JCQkgIDwgQkZEX0FMSUdOIChvcy0+bG1hLCBtYXhwYWdlc2l6ZSkpCi0JCQl7Ci0JCQkgIGlmIChzdWdnZXN0ZWRfbG1hID09IDApCi0JCQkgICAgc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0KLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBtLT5zZWN0aW9uc1ttLT5jb3VudCsrXSA9IG9zOwotCQkgICsraXNlYzsKLQkJICBzZWN0aW9uc1tqXSA9IE5VTEw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdWdnZXN0ZWRfbG1hID09IDApCi0JCXN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOwotCSAgICB9Ci0KLQkgIEJGRF9BU1NFUlQgKG0tPmNvdW50ID4gMCk7Ci0KLQkgIC8qIEFkZCB0aGUgY3VycmVudCBzZWdtZW50IHRvIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzLiAgKi8KLQkgICpwbSA9IG07Ci0JICBwbSA9ICZtLT5uZXh0OwotCi0JICBpZiAoaXNlYyA8IGNzZWNzKQotCSAgICB7Ci0JICAgICAgLyogV2Ugc3RpbGwgaGF2ZSBub3QgYWxsb2NhdGVkIGFsbCBvZiB0aGUgc2VjdGlvbnMgdG8KLQkJIHNlZ21lbnRzLiAgQ3JlYXRlIGEgbmV3IHNlZ21lbnQgaGVyZSwgaW5pdGlhbGlzZSBpdAotCQkgYW5kIGNhcnJ5IG9uIGxvb3BpbmcuICAqLwotCi0JICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCQkgICBiZmRfYWxsb2MgKG9iZmQsCi0JCQkgICAgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkJICAgICAgICsgKChzaXplX3QpIGNzZWNzIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotCSAgICAgIGlmIChtID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBtYXAuICBTZXQgdGhlIHBoeXNpY2FsCi0JCSBwaHlzaWNhbCBhZGRyZXNzIHRvIHRoZSBMTUEgb2YgdGhlIGZpcnN0IHNlY3Rpb24gdGhhdCBoYXMKLQkJIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZC4gICovCi0KLQkgICAgICBtLT5uZXh0ICAgICAgICAgICAgID0gTlVMTDsKLQkgICAgICBtLT5wX3R5cGUgICAgICAgICAgID0gcC0+cF90eXBlOwotCSAgICAgIG0tPnBfZmxhZ3MgICAgICAgICAgPSBwLT5wX2ZsYWdzOwotCSAgICAgIG0tPnBfZmxhZ3NfdmFsaWQgICAgPSAxOwotCSAgICAgIG0tPnBfcGFkZHIgICAgICAgICAgPSBzdWdnZXN0ZWRfbG1hOwotCSAgICAgIG0tPnBfcGFkZHJfdmFsaWQgICAgPSAxOwotCSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAwOwotCSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzICAgPSAwOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKGlzZWMgPCBjc2Vjcyk7Ci0KLSAgICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgICB9Ci0KLSAgLyogVGhlIFNvbGFyaXMgbGlua2VyIGNyZWF0ZXMgcHJvZ3JhbSBoZWFkZXJzIGluIHdoaWNoIGFsbCB0aGUKLSAgICAgcF9wYWRkciBmaWVsZHMgYXJlIHplcm8uICBXaGVuIHdlIHRyeSB0byBvYmpjb3B5IG9yIHN0cmlwIHN1Y2ggYQotICAgICBmaWxlLCB3ZSBnZXQgY29uZnVzZWQuICBDaGVjayBmb3IgdGhpcyBjYXNlLCBhbmQgaWYgd2UgZmluZCBpdAotICAgICByZXNldCB0aGUgcF9wYWRkcl92YWxpZCBmaWVsZHMuICAqLwotICBmb3IgKG0gPSBtZmlyc3Q7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgaWYgKG0tPnBfcGFkZHIgIT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAobSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobSA9IG1maXJzdDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQltLT5wX3BhZGRyX3ZhbGlkID0gMDsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChvYmZkKS0+c2VnbWVudF9tYXAgPSBtZmlyc3Q7Ci0KLSNpZiAwCi0gIC8qIEZpbmFsIFN0ZXA6IFNvcnQgdGhlIHNlZ21lbnRzIGludG8gYXNjZW5kaW5nIG9yZGVyIG9mIHBoeXNpY2FsIGFkZHJlc3MuICovCi0gIGlmIChtZmlyc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKiBwcmV2OwotCi0gICAgICBwcmV2ID0gbWZpcnN0OwotICAgICAgZm9yIChtID0gbWZpcnN0LT5uZXh0OyBtICE9IE5VTEw7IHByZXYgPSBtLCBtID0gbS0+bmV4dCkKLQl7Ci0JICAvKiBZZXMgSSBrbm93IC0gaXRzIGEgYnViYmxlIHNvcnQuLi4uKi8KLQkgIGlmIChtLT5uZXh0ICE9IE5VTEwgJiYgKG0tPm5leHQtPnBfcGFkZHIgPCBtLT5wX3BhZGRyKSkKLQkgICAgewotCSAgICAgIC8qIHN3YXAgbSBhbmQgbS0+bmV4dCAqLwotCSAgICAgIHByZXYtPm5leHQgPSBtLT5uZXh0OwotCSAgICAgIG0tPm5leHQgPSBtLT5uZXh0LT5uZXh0OwotCSAgICAgIHByZXYtPm5leHQtPm5leHQgPSBtOwotCi0JICAgICAgLyogcmVzdGFydCBsb29wLiAqLwotCSAgICAgIG0gPSBtZmlyc3Q7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2VuZGlmCi0KLSN1bmRlZiBJU19DT05UQUlORURfQlkKLSN1bmRlZiBJU19TT0xBUklTX1BUX0lOVEVSUAotI3VuZGVmIElTX0NPUkVGSUxFX05PVEUKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBjb3BpZXMgb3ZlciB0aGUgZW50c2l6ZQotICAgZmllbGQsIGFuZCBzb21ldGltZXMgdGhlIGluZm8gZmllbGQuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaWhkciwgKm9oZHI7Ci0KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvcHkgb3ZlciBwcml2YXRlIEJGRCBkYXRhIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNvcGllZC4KLSAgICAgVGhpcyBtdXN0IGJlIGRvbmUgaGVyZSwgcmF0aGVyIHRoYW4gaW4gdGhlIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICAgICBlbnRyeSBwb2ludCwgYmVjYXVzZSB0aGUgbGF0dGVyIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbgotICAgICBjb250ZW50cyBoYXZlIGJlZW4gc2V0LCB3aGljaCBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIGhlYWRlcnMgaGF2ZQotICAgICBhbHJlYWR5IGJlZW4gd29ya2VkIG91dC4gICovCi0gIGlmIChlbGZfdGRhdGEgKG9iZmQpLT5zZWdtZW50X21hcCA9PSBOVUxMCi0gICAgICAmJiBlbGZfdGRhdGEgKGliZmQpLT5waGRyICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIE9ubHkgc2V0IHVwIHRoZSBzZWdtZW50cyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBTRUNfQUxMT0MKLSAgICAgICAgIHNlY3Rpb25zLiAgRklYTUU6IFRoaXMgd29uJ3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIG9iamNvcHkgaXMKLSAgICAgICAgIHVzZWQgdG8gcmVtb3ZlIHRoZSBsYXN0IFNFQ19BTExPQyBzZWN0aW9uLCBzaW5jZSBvYmpjb3B5Ci0gICAgICAgICB3b24ndCBjYWxsIHRoaXMgcm91dGluZSBpbiB0aGF0IGNhc2UuICAqLwotICAgICAgZm9yIChzID0gaXNlYy0+bmV4dDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGlmICghIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGloZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyOwotICBvaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT50aGlzX2hkcjsKLQotICBvaGRyLT5zaF9lbnRzaXplID0gaWhkci0+c2hfZW50c2l6ZTsKLQotICBpZiAoaWhkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCCi0gICAgICB8fCBpaGRyLT5zaF90eXBlID09IFNIVF9EWU5TWU0KLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJuZWVkCi0gICAgICB8fCBpaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyZGVmKQotICAgIG9oZHItPnNoX2luZm8gPSBpaGRyLT5zaF9pbmZvOwotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT51c2VfcmVsYV9wCi0gICAgPSBlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dXNlX3JlbGFfcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbgotICAgd2hpY2ggd2UgZGlkIG5vdCBtYXAgaW50byBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbWFwIHRoZSBzZWN0aW9uCi0gICBpbmRleCBjb3JyZWN0bHkuICBXZSB1c2Ugc3BlY2lhbCBtYWNybyBkZWZpbml0aW9ucyBmb3IgdGhlIG1hcHBlZAotICAgc2VjdGlvbiBpbmRpY2VzOyB0aGVzZSBkZWZpbml0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlCi0gICBzd2FwX291dF9zeW1zIGZ1bmN0aW9uLiAgKi8KLQotI2RlZmluZSBNQVBfT05FU1lNVEFCIChTSE5fTE9SRVNFUlZFIC0gMSkKLSNkZWZpbmUgTUFQX0RZTlNZTVRBQiAoU0hOX0xPUkVTRVJWRSAtIDIpCi0jZGVmaW5lIE1BUF9TVFJUQUIgKFNITl9MT1JFU0VSVkUgLSAzKQotI2RlZmluZSBNQVBfU0hTVFJUQUIgKFNITl9MT1JFU0VSVkUgLSA0KQotCi1ib29sZWFuCi1fYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW1hcmcsIG9iZmQsIG9zeW1hcmcpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXN5bWJvbCAqaXN5bWFyZzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICpvc3ltYXJnOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmlzeW0sICpvc3ltOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpc3ltID0gZWxmX3N5bWJvbF9mcm9tIChpYmZkLCBpc3ltYXJnKTsKLSAgb3N5bSA9IGVsZl9zeW1ib2xfZnJvbSAob2JmZCwgb3N5bWFyZyk7Ci0KLSAgaWYgKGlzeW0gIT0gTlVMTAotICAgICAgJiYgb3N5bSAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGlzeW0tPnN5bWJvbC5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2huZHg7Ci0KLSAgICAgIHNobmR4ID0gaXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKLSAgICAgIGlmIChzaG5keCA9PSBlbGZfb25lc3ltdGFiIChpYmZkKSkKLQlzaG5keCA9IE1BUF9PTkVTWU1UQUI7Ci0gICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfZHluc3ltdGFiIChpYmZkKSkKLQlzaG5keCA9IE1BUF9EWU5TWU1UQUI7Ci0gICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfdGRhdGEgKGliZmQpLT5zdHJ0YWJfc2VjdGlvbikKLQlzaG5keCA9IE1BUF9TVFJUQUI7Ci0gICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfdGRhdGEgKGliZmQpLT5zaHN0cnRhYl9zZWN0aW9uKQotCXNobmR4ID0gTUFQX1NIU1RSVEFCOwotICAgICAgb3N5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCA9IHNobmR4OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3dhcF9vdXRfc3ltcyAoYWJmZCwgc3R0cCwgcmVsb2NhdGFibGVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoqc3R0cDsKLSAgICAgaW50IHJlbG9jYXRhYmxlX3A7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaWYgKCFlbGZfbWFwX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEdW1wIG91dCB0aGUgc3ltdGFicy4gKi8KLSAgewotICAgIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHQ7Ci0gICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXN0cnRhYl9oZHI7Ci0gICAgY2hhciAqb3V0Ym91bmRfc3ltczsKLSAgICBpbnQgaWR4OwotCi0gICAgc3R0ID0gX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gICAgaWYgKHN0dCA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgIHN5bXRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOwotICAgIHN5bXRhYl9oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9zeW07Ci0gICAgc3ltdGFiX2hkci0+c2hfc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2VudHNpemUgKiAoc3ltY291bnQgKyAxKTsKLSAgICBzeW10YWJfaGRyLT5zaF9pbmZvID0gZWxmX251bV9sb2NhbHMgKGFiZmQpICsgMTsKLSAgICBzeW10YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSBiZWQtPnMtPmZpbGVfYWxpZ247Ci0KLSAgICBzeW1zdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0KLSAgICBvdXRib3VuZF9zeW1zID0gYmZkX2FsbG9jIChhYmZkLAotCQkJICAgICAgICgxICsgc3ltY291bnQpICogYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICBpZiAob3V0Ym91bmRfc3ltcyA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKFBUUikgb3V0Ym91bmRfc3ltczsKLQotICAgIC8qIG5vdyBnZW5lcmF0ZSB0aGUgZGF0YSAoZm9yICJjb250ZW50cyIpICovCi0gICAgewotICAgICAgLyogRmlsbCBpbiB6ZXJvdGggc3ltYm9sIGFuZCBzd2FwIGl0IG91dC4gICovCi0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIHN5bS5zdF9uYW1lID0gMDsKLSAgICAgIHN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOwotICAgICAgb3V0Ym91bmRfc3ltcyArPSBiZWQtPnMtPnNpemVvZl9zeW07Ci0gICAgfQotICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgICAgewotCUVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCWJmZF92bWEgdmFsdWUgPSBzeW1zW2lkeF0tPnZhbHVlOwotCWVsZl9zeW1ib2xfdHlwZSAqdHlwZV9wdHI7Ci0JZmxhZ3dvcmQgZmxhZ3MgPSBzeW1zW2lkeF0tPmZsYWdzOwotCWludCB0eXBlOwotCi0JaWYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgLyogU2VjdGlvbiBzeW1ib2xzIGhhdmUgbm8gbmFtZXMuICAqLwotCSAgc3ltLnN0X25hbWUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgc3ltLnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChzdHQsCi0JCQkJCQkJICAgICAgc3ltc1tpZHhdLT5uYW1lLAotCQkJCQkJCSAgICAgIHRydWUsIGZhbHNlKTsKLQkgICAgaWYgKHN5bS5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0KLQl0eXBlX3B0ciA9IGVsZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltc1tpZHhdKTsKLQotCWlmICgoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zW2lkeF0tPnNlY3Rpb24pKQotCSAgewotCSAgICAvKiBFTEYgY29tbW9uIHN5bWJvbHMgcHV0IHRoZSBhbGlnbm1lbnQgaW50byB0aGUgYHZhbHVlJyBmaWVsZCwKLQkgICAgICAgYW5kIHRoZSBzaXplIGludG8gdGhlIGBzaXplJyBmaWVsZC4gIFRoaXMgaXMgYmFja3dhcmRzIGZyb20KLQkgICAgICAgaG93IEJGRCBoYW5kbGVzIGl0LCBzbyByZXZlcnNlIGl0IGhlcmUuICAqLwotCSAgICBzeW0uc3Rfc2l6ZSA9IHZhbHVlOwotCSAgICBpZiAodHlwZV9wdHIgPT0gTlVMTAotCQl8fCB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSA9PSAwKQotCSAgICAgIHN5bS5zdF92YWx1ZSA9IHZhbHVlID49IDE2ID8gMTYgOiAoMSA8PCBiZmRfbG9nMiAodmFsdWUpKTsKLQkgICAgZWxzZQotCSAgICAgIHN5bS5zdF92YWx1ZSA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlOwotCSAgICBzeW0uc3Rfc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLQkgICAgICAoYWJmZCwgc3ltc1tpZHhdLT5zZWN0aW9uKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzZWN0aW9uICpzZWMgPSBzeW1zW2lkeF0tPnNlY3Rpb247Ci0JICAgIGludCBzaG5keDsKLQotCSAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICB7Ci0JCXZhbHVlICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLQkJc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgICAgICB9Ci0JICAgIC8qIERvbid0IGFkZCBpbiB0aGUgc2VjdGlvbiB2bWEgZm9yIHJlbG9jYXRhYmxlIG91dHB1dC4gICovCi0JICAgIGlmICghIHJlbG9jYXRhYmxlX3ApCi0JICAgICAgdmFsdWUgKz0gc2VjLT52bWE7Ci0JICAgIHN5bS5zdF92YWx1ZSA9IHZhbHVlOwotCSAgICBzeW0uc3Rfc2l6ZSA9IHR5cGVfcHRyID8gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSA6IDA7Ci0KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotCQkmJiB0eXBlX3B0ciAhPSBOVUxMCi0JCSYmIHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ICE9IDApCi0JICAgICAgewotCQkvKiBUaGlzIHN5bWJvbCBpcyBpbiBhIHJlYWwgRUxGIHNlY3Rpb24gd2hpY2ggd2UgZGlkCi0gICAgICAgICAgICAgICAgICAgbm90IGNyZWF0ZSBhcyBhIEJGRCBzZWN0aW9uLiAgVW5kbyB0aGUgbWFwcGluZyBkb25lCi0gICAgICAgICAgICAgICAgICAgYnkgY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLiAgKi8KLQkJc2huZHggPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKLQkJc3dpdGNoIChzaG5keCkKLQkJICB7Ci0JCSAgY2FzZSBNQVBfT05FU1lNVEFCOgotCQkgICAgc2huZHggPSBlbGZfb25lc3ltdGFiIChhYmZkKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX0RZTlNZTVRBQjoKLQkJICAgIHNobmR4ID0gZWxmX2R5bnN5bXRhYiAoYWJmZCk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9TVFJUQUI6Ci0JCSAgICBzaG5keCA9IGVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9zZWN0aW9uOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfU0hTVFJUQUI6Ci0JCSAgICBzaG5keCA9IGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX3NlY3Rpb247Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLQkJaWYgKHNobmR4ID09IC0xKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWMyOwotCi0JCSAgICAvKiBXcml0aW5nIHRoaXMgd291bGQgYmUgYSBoZWxsIG9mIGEgbG90IGVhc2llciBpZgotCQkgICAgICAgd2UgaGFkIHNvbWUgZGVjZW50IGRvY3VtZW50YXRpb24gb24gYmZkLCBhbmQKLQkJICAgICAgIGtuZXcgd2hhdCB0byBleHBlY3Qgb2YgdGhlIGxpYnJhcnksIGFuZCB3aGF0IHRvCi0JCSAgICAgICBkZW1hbmQgb2YgYXBwbGljYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0Ci0JCSAgICAgICBhcHBlYXJzIHRoYXQgYG9iamNvcHknIG1pZ2h0IG5vdCBzZXQgdGhlCi0JCSAgICAgICBzZWN0aW9uIG9mIGEgc3ltYm9sIHRvIGJlIGEgc2VjdGlvbiB0aGF0IGlzCi0JCSAgICAgICBhY3R1YWxseSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgICAgc2VjMiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWMtPm5hbWUpOwotCQkgICAgQkZEX0FTU0VSVCAoc2VjMiAhPSAwKTsKLQkJICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMyKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNobmR4ICE9IC0xKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHN5bS5zdF9zaG5keCA9IHNobmR4OwotCSAgfQotCi0JaWYgKChmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQkgIHR5cGUgPSBTVFRfRlVOQzsKLQllbHNlIGlmICgoZmxhZ3MgJiBCU0ZfT0JKRUNUKSAhPSAwKQotCSAgdHlwZSA9IFNUVF9PQkpFQ1Q7Ci0JZWxzZQotCSAgdHlwZSA9IFNUVF9OT1RZUEU7Ci0KLSAgICAgICAgLyogUHJvY2Vzc29yLXNwZWNpZmljIHR5cGVzICovCi0gICAgICAgIGlmICh0eXBlX3B0ciAhPSBOVUxMCi0JICAgICYmIGJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKQotICAgICAgICAgIHR5cGUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSAoJnR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLCB0eXBlKTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCWVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIHR5cGUpOwotCWVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKCgoZmxhZ3MgJiBCU0ZfV0VBSykKLQkJCQkgICAgICA/IFNUQl9XRUFLCi0JCQkJICAgICAgOiBTVEJfR0xPQkFMKSwKLQkJCQkgICAgIHR5cGUpOwotCWVsc2UgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLQllbHNlCi0JICB7Ci0JICAgIGludCBiaW5kID0gU1RCX0xPQ0FMOwotCi0JICAgIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLQkgICAgICBiaW5kID0gU1RCX0xPQ0FMOwotCSAgICBlbHNlIGlmIChmbGFncyAmIEJTRl9XRUFLKQotCSAgICAgIGJpbmQgPSBTVEJfV0VBSzsKLQkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICAgIGJpbmQgPSBTVEJfR0xPQkFMOwotCi0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmQsIHR5cGUpOwotCSAgfQotCi0JaWYgKHR5cGVfcHRyICE9IE5VTEwpCi0JICBzeW0uc3Rfb3RoZXIgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcjsKLQllbHNlCi0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOwotCW91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgICAgfQotCi0gICAgKnN0dHAgPSBzdHQ7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHN0dCk7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0KLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLgotCi0gICBOb3RlIHRoYXQgd2UgYmFzZSBpdCBvbiB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIG51bGwgdGVybWluYXRlCi0gICB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIHNpemUuICBIb3dldmVyLCB0aGUgRUxGIHN5bWJvbCB0YWJsZQotICAgYWx3YXlzIGhhcyBhIGR1bW15IGVudHJ5IGFzIHN5bWJvbCAjMCwgc28gaXQgZW5kcyB1cCBldmVuLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgcmVsb2NzLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoISBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgc3ltYm9scywKLQkJCQkJCQkgICBmYWxzZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGxvbmcgc3ltY291bnQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIGZhbHNlKTsKLQotICBpZiAoc3ltY291bnQgPj0gMCkKLSAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHJldHVybiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jIGVudHJpZXMuICBBbnkKLSAgIHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZQotICAgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcwotICAgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2Mgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmV0OwotICBhc2VjdGlvbiAqczsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSBzaXplb2YgKGFyZWxlbnQgKik7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKSkKLSAgICAgIHJldCArPSAoKHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplKQotCSAgICAgICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIHJldHVybgotICAgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXMgYSBzaW5nbGUgYmxvY2ssIGFsdGhvdWdoIHRoZXkgYXJlCi0gICBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggcGFydGljdWxhciBzZWN0aW9uczsgdGhlIGludGVyZmFjZSwgd2hpY2gKLSAgIHdhcyBkZXNpZ25lZCBmb3IgU3VuT1Mgc3R5bGUgc2hhcmVkIGxpYnJhcmllcywgZXhwZWN0cyB0aGF0IHRoZXJlCi0gICBpcyBvbmx5IG9uZSBzZXQgb2YgZHluYW1pYyByZWxvY3MuICBBbnkgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseQotICAgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZSBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYwotICAgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLSAgYXNlY3Rpb24gKnM7Ci0gIGxvbmcgcmV0OwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHNsdXJwX3JlbG9jcyA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfcmVsb2NfdGFibGU7Ci0gIHJldCA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwKLQkgICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0JewotCSAgYXJlbGVudCAqcDsKLQkgIGxvbmcgY291bnQsIGk7Ci0KLQkgIGlmICghICgqc2x1cnBfcmVsb2NzKSAoYWJmZCwgcywgc3ltcywgdHJ1ZSkpCi0JICAgIHJldHVybiAtMTsKLQkgIGNvdW50ID0gcy0+X3Jhd19zaXplIC8gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemU7Ci0JICBwID0gcy0+cmVsb2NhdGlvbjsKLQkgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCSAgICAqc3RvcmFnZSsrID0gcCsrOwotCSAgcmV0ICs9IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoZWxmX2R5bnZlcmRlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZXZlcmRlZjsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKml2ZXJkZWY7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICppdmVyZGVmYXJyOwotICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiBpdmVyZGVmbWVtOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICB1bnNpZ25lZCBpbnQgbWF4aWR4OwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkcjsKLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgaGRyLT5zaF9zaXplLCBhYmZkKSAhPSBoZHItPnNoX3NpemUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFdlIGtub3cgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzZWN0aW9uIGJ1dCBub3QgdGhlIG1heGltdW0KLQkgaW5kZXguICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBydW4gdGhyb3VnaCBhbGwgZW50cmllcyBhbmQgZmluZAotCSB0aGUgbWF4aW11bS4gICovCi0gICAgICBldmVyZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgY29udGVudHM7Ci0gICAgICBtYXhpZHggPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgKytpKQotCXsKLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luIChhYmZkLCBldmVyZGVmLCAmaXZlcmRlZm1lbSk7Ci0KLQkgIGlmICgoaXZlcmRlZm1lbS52ZF9uZHggJiBWRVJTWU1fVkVSU0lPTikgPiBtYXhpZHgpCi0JICAgIG1heGlkeCA9IGl2ZXJkZWZtZW0udmRfbmR4ICYgVkVSU1lNX1ZFUlNJT047Ci0KLQkgIGV2ZXJkZWYgPSAoKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikKLQkJICAgICAoKGJmZF9ieXRlICopIGV2ZXJkZWYgKyBpdmVyZGVmbWVtLnZkX25leHQpKTsKLQl9Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9Ci0JKChFbGZfSW50ZXJuYWxfVmVyZGVmICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIG1heGlkeCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRlZikpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPSBtYXhpZHg7Ci0KLSAgICAgIGV2ZXJkZWYgPSAoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBjb250ZW50czsKLSAgICAgIGl2ZXJkZWZhcnIgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWY7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5zaF9pbmZvOyBpKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmV2ZXJkYXV4OwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggKml2ZXJkYXV4OwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luIChhYmZkLCBldmVyZGVmLCAmaXZlcmRlZm1lbSk7Ci0KLQkgIGl2ZXJkZWYgPSAmaXZlcmRlZmFyclsoaXZlcmRlZm1lbS52ZF9uZHggJiBWRVJTWU1fVkVSU0lPTikgLSAxXTsKLQkgIG1lbWNweSAoaXZlcmRlZiwgJml2ZXJkZWZtZW0sIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRlZikpOwotCi0JICBpdmVyZGVmLT52ZF9iZmQgPSBhYmZkOwotCi0JICBpdmVyZGVmLT52ZF9hdXhwdHIgPSAoKEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaXZlcmRlZi0+dmRfY250Ci0JCQkJCSAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRhdXgpKSkpOwotCSAgaWYgKGl2ZXJkZWYtPnZkX2F1eHB0ciA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZXZlcmRhdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopCi0JCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcmRlZiArIGl2ZXJkZWYtPnZkX2F1eCkpOwotCSAgaXZlcmRhdXggPSBpdmVyZGVmLT52ZF9hdXhwdHI7Ci0JICBmb3IgKGogPSAwOyBqIDwgaXZlcmRlZi0+dmRfY250OyBqKyssIGl2ZXJkYXV4KyspCi0JICAgIHsKLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIGV2ZXJkYXV4LCBpdmVyZGF1eCk7Ci0KLQkgICAgICBpdmVyZGF1eC0+dmRhX25vZGVuYW1lID0KLQkJYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAotCQkJCQkJIGl2ZXJkYXV4LT52ZGFfbmFtZSk7Ci0JICAgICAgaWYgKGl2ZXJkYXV4LT52ZGFfbm9kZW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoaiArIDEgPCBpdmVyZGVmLT52ZF9jbnQpCi0JCWl2ZXJkYXV4LT52ZGFfbmV4dHB0ciA9IGl2ZXJkYXV4ICsgMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJkYXV4LT52ZGFfbmV4dHB0ciA9IE5VTEw7Ci0KLQkgICAgICBldmVyZGF1eCA9ICgoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikKLQkJCSAgKChiZmRfYnl0ZSAqKSBldmVyZGF1eCArIGl2ZXJkYXV4LT52ZGFfbmV4dCkpOwotCSAgICB9Ci0KLQkgIGl2ZXJkZWYtPnZkX25vZGVuYW1lID0gaXZlcmRlZi0+dmRfYXV4cHRyLT52ZGFfbm9kZW5hbWU7Ci0KLQkgIGlmIChpICsgMSA8IGhkci0+c2hfaW5mbykKLQkgICAgaXZlcmRlZi0+dmRfbmV4dGRlZiA9IGl2ZXJkZWYgKyAxOwotCSAgZWxzZQotCSAgICBpdmVyZGVmLT52ZF9uZXh0ZGVmID0gTlVMTDsKLQotCSAgZXZlcmRlZiA9ICgoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKQotCQkgICAgICgoYmZkX2J5dGUgKikgZXZlcmRlZiArIGl2ZXJkZWYtPnZkX25leHQpKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICAgIGNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICpldmVybmVlZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICppdmVybmVlZDsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX2hkcjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID0KLQkoKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIGhkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1Zlcm5lZWQpKSk7Ci0gICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzID0gaGRyLT5zaF9pbmZvOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKChQVFIpIGNvbnRlbnRzLCAxLCBoZHItPnNoX3NpemUsIGFiZmQpICE9IGhkci0+c2hfc2l6ZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZXZlcm5lZWQgPSAoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikgY29udGVudHM7Ci0gICAgICBpdmVybmVlZCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZHItPnNoX2luZm87IGkrKywgaXZlcm5lZWQrKykKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqZXZlcm5hdXg7Ci0JICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqaXZlcm5hdXg7Ci0JICB1bnNpZ25lZCBpbnQgajsKLQotCSAgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luIChhYmZkLCBldmVybmVlZCwgaXZlcm5lZWQpOwotCi0JICBpdmVybmVlZC0+dm5fYmZkID0gYWJmZDsKLQotCSAgaXZlcm5lZWQtPnZuX2ZpbGVuYW1lID0KLQkgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAotCQkJCQkgICAgIGl2ZXJuZWVkLT52bl9maWxlKTsKLQkgIGlmIChpdmVybmVlZC0+dm5fZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGl2ZXJuZWVkLT52bl9hdXhwdHIgPQotCSAgICAoKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQlpdmVybmVlZC0+dm5fY250ICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVybmF1eCkpKTsKLQotCSAgZXZlcm5hdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopCi0JCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcm5lZWQgKyBpdmVybmVlZC0+dm5fYXV4KSk7Ci0JICBpdmVybmF1eCA9IGl2ZXJuZWVkLT52bl9hdXhwdHI7Ci0JICBmb3IgKGogPSAwOyBqIDwgaXZlcm5lZWQtPnZuX2NudDsgaisrLCBpdmVybmF1eCsrKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luIChhYmZkLCBldmVybmF1eCwgaXZlcm5hdXgpOwotCi0JICAgICAgaXZlcm5hdXgtPnZuYV9ub2RlbmFtZSA9Ci0JCWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKLQkJCQkJCSBpdmVybmF1eC0+dm5hX25hbWUpOwotCSAgICAgIGlmIChpdmVybmF1eC0+dm5hX25vZGVuYW1lID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKGogKyAxIDwgaXZlcm5lZWQtPnZuX2NudCkKLQkJaXZlcm5hdXgtPnZuYV9uZXh0cHRyID0gaXZlcm5hdXggKyAxOwotCSAgICAgIGVsc2UKLQkJaXZlcm5hdXgtPnZuYV9uZXh0cHRyID0gTlVMTDsKLQotCSAgICAgIGV2ZXJuYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKQotCQkJICAoKGJmZF9ieXRlICopIGV2ZXJuYXV4ICsgaXZlcm5hdXgtPnZuYV9uZXh0KSk7Ci0JICAgIH0KLQotCSAgaWYgKGkgKyAxIDwgaGRyLT5zaF9pbmZvKQotCSAgICBpdmVybmVlZC0+dm5fbmV4dHJlZiA9IGl2ZXJuZWVkICsgMTsKLQkgIGVsc2UKLQkgICAgaXZlcm5lZWQtPnZuX25leHRyZWYgPSBOVUxMOwotCi0JICBldmVybmVlZCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVybmVlZCArIGl2ZXJuZWVkLT52bl9uZXh0KSk7Ci0JfQotCi0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgICBjb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLWFzeW1ib2wgKgotX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICpuZXdzeW07Ci0KLSAgbmV3c3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9zeW1ib2xfdHlwZSkpOwotICBpZiAoIW5ld3N5bSkKLSAgICByZXR1cm4gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5ld3N5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgcmV0dXJuICZuZXdzeW0tPnN5bWJvbDsKLSAgICB9Ci19Ci0KLXZvaWQKLV9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIE1vc3QgdGFyZ2V0cwotICAgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZQotICAgb3ZlcnJpZGUgaXQuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogTm9ybWFsIGxvY2FsIHN5bWJvbHMgc3RhcnQgd2l0aCBgYC5MJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnTCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXQgbGVhc3Qgc29tZSBTVlI0IGNvbXBpbGVycyAoZS5nLiwgVW5peFdhcmUgMi4xIGNjKSBnZW5lcmF0ZQotICAgICBEV0FSRiBkZWJ1Z2dpbmcgc3ltYm9scyBzdGFydGluZyB3aXRoIGBgLi4nJy4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBnY2Mgd2lsbCBzb21ldGltZXMgZ2VuZXJhdGUgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCBgYF8uTF8nJyB3aGVuCi0gICAgIGVtaXR0aW5nIERXQVJGIGRlYnVnZ2luZyBvdXRwdXQuICBJIHN1c3BlY3QgdGhpcyBpcyBhY3R1YWxseSBhCi0gICAgIHNtYWxsIGJ1ZyBpbiBnY2MgKGl0IGNhbGxzIEFTTV9PVVRQVVRfTEFCRUwgd2hlbiBpdCBzaG91bGQgY2FsbAotICAgICBBU01fR0VORVJBVEVfSU5URVJOQUxfTEFCRUwsIGFuZCB0aGlzIGNhdXNlcyB0aGUgbGVhZGluZwotICAgICB1bmRlcnNjb3JlIHRvIGJlIGVtaXR0ZWQgb24gc29tZSBFTEYgdGFyZ2V0cykuICBGb3IgZWFzZSBvZiB1c2UsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc3ltYm9scyBhcyBsb2NhbC4gICovCi0gIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdMJyAmJiBuYW1lWzNdID09ICdfJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWFsZW50ICoKLV9iZmRfZWxmX2dldF9saW5lbm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAvKiBJZiB0aGlzIGlzbid0IHRoZSByaWdodCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZCwgYW5kIHRoaXMKLSAgICAgaXNuJ3QgdGhlIGdlbmVyaWMgYmFja2VuZCwgZmFpbC4gICovCi0gIGlmIChhcmNoICE9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+YXJjaAotICAgICAgJiYgYXJjaCAhPSBiZmRfYXJjaF91bmtub3duCi0gICAgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYW5kIG9mZnNldCwgZm9yIGVycm9yCi0gICByZXBvcnRpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIHN5bWJvbHMsCi0JCQkgICAgb2Zmc2V0LAotCQkJICAgIGZpbGVuYW1lX3B0ciwKLQkJCSAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJICAgIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBib29sZWFuIGZvdW5kOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgYXN5bWJvbCAqZnVuYzsKLSAgYmZkX3ZtYSBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHN5bWJvbHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBOVUxMOwotICBmdW5jID0gTlVMTDsKLSAgbG93X2Z1bmMgPSAwOwotCi0gIGZvciAocCA9IHN5bWJvbHM7ICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBlbGZfc3ltYm9sX3R5cGUgKnE7Ci0KLSAgICAgIHEgPSAoZWxmX3N5bWJvbF90eXBlICopICpwOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uICgmcS0+c3ltYm9sKSAhPSBzZWN0aW9uKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChxLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfRklMRToKLQkgIGZpbGVuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoJnEtPnN5bWJvbCk7Ci0JICBicmVhazsKLQljYXNlIFNUVF9OT1RZUEU6Ci0JY2FzZSBTVFRfRlVOQzoKLQkgIGlmIChxLT5zeW1ib2wuc2VjdGlvbiA9PSBzZWN0aW9uCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgIGZ1bmMgPSAoYXN5bWJvbCAqKSBxOwotCSAgICAgIGxvd19mdW5jID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpmaWxlbmFtZV9wdHIgPSBmaWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBiZmRfYXN5bWJvbF9uYW1lIChmdW5jKTsKLSAgKmxpbmVfcHRyID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZWhkcjsKLSAgaWYgKCEgcmVsb2MpCi0gICAgcmV0ICs9IGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bgotICAgICAgJiYgISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMKLSAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCArIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLV9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZiAwCi12b2lkCi1fYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIFRyeSB0byBjb252ZXJ0IGEgbm9uLUVMRiByZWxvYyBpbnRvIGFuIEVMRiBvbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgYXJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmFyZWxvYzsKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB3ZSByZWFsbHkgaGF2ZSBhbiBFTEYgaG93dG8uICovCi0KLSAgaWYgKCgqYXJlbG9jLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gICAgICAvKiBBbGllbiByZWxvYzogVHJ5IHRvIGRldGVybWluZSBpdHMgdHlwZSB0byByZXBsYWNlIGl0IHdpdGggYW4KLQkgZXF1aXZhbGVudCBFTEYgcmVsb2MuICovCi0KLSAgICAgIGlmIChhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzEyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQotCSAgaWYgKGFyZWxvYy0+aG93dG8tPnBjcmVsX29mZnNldCAhPSBob3d0by0+cGNyZWxfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCWFyZWxvYy0+YWRkZW5kICs9IGFyZWxvYy0+YWRkcmVzczsKLQkgICAgICBlbHNlCi0JCWFyZWxvYy0+YWRkZW5kIC09IGFyZWxvYy0+YWRkcmVzczsgLyogYWRkZW5kIGlzIHVuc2lnbmVkISEgKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQl9Ci0KLSAgICAgIGlmIChob3d0bykKLQlhcmVsb2MtPmhvd3RvID0gaG93dG87Ci0gICAgICBlbHNlCi0JZ290byBmYWlsOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGZhaWw6Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0gICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBhcmVsb2MtPmhvd3RvLT5uYW1lKTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2hzdHJ0YWIgKGFiZmQpICE9IE5VTEwpCi0JX2JmZF9zdHJpbmd0YWJfZnJlZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpOwotfQotCi0vKiBGb3IgUmVsIHRhcmdldHMsIHdlIGVuY29kZSBtZWFuaW5nZnVsIGRhdGEgZm9yIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgIGluIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LiAgVGh1cyB3ZSBjYW5ub3QgYWxsb3cgYW55IHNvcnQgb2Ygc2FuaXR5Ci0gICByYW5nZS1jaGVja2luZyB0byBpbnRlcmZlcmUuICBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gaW4gcHJvY2Vzc2luZwotICAgdGhpcyByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiAoYWJmZCwgcmUsIHN5bWJvbCwgZGF0YSwgaXMsIG9iZmQsIGVycm1zZykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaXMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLyogRWxmIGNvcmUgZmlsZSBzdXBwb3J0LiAgTXVjaCBvZiB0aGlzIG9ubHkgd29ya3Mgb24gbmF0aXZlCi0gICB0b29sY2hhaW5zLCBzaW5jZSB3ZSByZWx5IG9uIGtub3dpbmcgdGhlCi0gICBtYWNoaW5lLWRlcGVuZGVudCBwcm9jZnMgc3RydWN0dXJlIGluIG9yZGVyIHRvIHBpY2sKLSAgIG91dCBkZXRhaWxzIGFib3V0IHRoZSBjb3JlZmlsZS4gKi8KLQotI2lmZGVmIEhBVkVfU1lTX1BST0NGU19ICi0jIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSNlbmRpZgotCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0LiAqLwotCi0jaWZuZGVmIG9mZnNldG9mCi0jIGRlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgodW5zaWduZWQgbG9uZykgJigoVFlQRSAqKTApLT5NRU1CRVIpCi0jZW5kaWYKLQotCi0vKiBGSVhNRTogdGhpcyBpcyBraW5kYSB3cm9uZywgYnV0IGl0J3Mgd2hhdCBnZGIgd2FudHMuICovCi0KLXN0YXRpYyBpbnQKLWVsZmNvcmVfbWFrZV9waWQgKGFiZmQpCi0gICAgIGJmZCogYWJmZDsKLXsKLSAgcmV0dXJuICgoZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA8PCAxNikKLQkgICsgKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkKSk7Ci19Ci0KLQotLyogSWYgdGhlcmUgaXNuJ3QgYSBzZWN0aW9uIGNhbGxlZCBOQU1FLCBtYWtlIG9uZSwgdXNpbmcKLSAgIGRhdGEgZnJvbSBTRUNULiAgTm90ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEKLSAgIHJlZmVyZW5jZSB0byBOQU1FLCBzbyB5b3Ugc2hvdWxkbid0IGRlYWxsb2NhdGUgb3IKLSAgIG92ZXJ3cml0ZSBpdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCBuYW1lLCBzZWN0KQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIG5hbWU7Ci0gICAgIGFzZWN0aW9uKiBzZWN0OwotewotICBhc2VjdGlvbiogc2VjdDI7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3QyID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0MiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0Mi0+X3Jhd19zaXplID0gc2VjdC0+X3Jhd19zaXplOwotICBzZWN0Mi0+ZmlsZXBvcyA9IHNlY3QtPmZpbGVwb3M7Ci0gIHNlY3QyLT5mbGFncyA9IHNlY3QtPmZsYWdzOwotICBzZWN0Mi0+YWxpZ25tZW50X3Bvd2VyID0gc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBwcnN0YXR1c190IGV4aXN0cyBvbjoKLSAgICAgc29sYXJpcyAyLls1NjddCi0gICAgIGxpbnV4IDIuWzAxXSArIGdsaWJjCi0gICAgIHVuaXh3YXJlIDQuMgotKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHJzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHByc3RhdHVzX3QgcHJzdGF0OwotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHJzdGF0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwcnN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKHByc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsID0gcHJzdGF0LnByX2N1cnNpZzsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQgPSBwcnN0YXQucHJfcGlkOwotCi0gIC8qIHByX3dobyBleGlzdHMgb246Ci0gICAgICAgc29sYXJpcyAyLls1NjddCi0gICAgICAgdW5peHdhcmUgNC4yCi0gICAgIHByX3dobyBkb2Vzbid0IGV4aXN0IG9uOgotICAgICAgIGxpbnV4IDIuWzAxXQotICAqLwotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8pCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPSBwcnN0YXQucHJfd2hvOwotI2VuZGlmCi0KLSAgLyogTWFrZSBhICIucmVnLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKHByc3RhdC5wcl9yZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChwcnN0YXR1c190LCBwcl9yZWcpOwotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCEgZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnIiwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkgKi8KLQotCi0vKiBDcmVhdGUgYSBwc2V1ZG9zZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIE5PVEUuICBUaGlzCi0gICBhY3R1YWxseSBjcmVhdGVzIHVwIHRvIHR3byBwc2V1ZG9zZWN0aW9uczoKLSAgIC0gRm9yIHRoZSBzaW5nbGUtdGhyZWFkZWQgY2FzZSwgYSBzZWN0aW9uIG5hbWVkIE5BTUUsIHVubGVzcwotICAgICBzdWNoIGEgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cy4KLSAgIC0gRm9yIHRoZSBtdWx0aS10aHJlYWRlZCBjYXNlLCBhIHNlY3Rpb24gbmFtZWQgIk5BTUUvUElEIiwgd2hlcmUKLSAgICAgUElEIGlzIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpLgotICAgQm90aCBwc2V1ZG9zZWN0aW9ucyBoYXZlIGlkZW50aWNhbCBjb250ZW50czogdGhlIGNvbnRlbnRzIG9mIE5PVEUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9tYWtlX25vdGVfcHNldWRvc2VjdGlvbiAoYWJmZCwgbmFtZSwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciAqdGhyZWFkZWRfbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgLyogQnVpbGQgdGhlIHNlY3Rpb24gbmFtZS4gICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiJXMvJWQiLCBuYW1lLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIHRocmVhZGVkX25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAodGhyZWFkZWRfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5ICh0aHJlYWRlZF9uYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0aHJlYWRlZF9uYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlY3QtPl9yYXdfc2l6ZSA9IG5vdGUtPmRlc2NzejsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3M7Ci0gIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBpZiAoISBlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgbmFtZSwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFRoZXJlIGlzbid0IGEgY29uc2lzdGVudCBwcmZwcmVnc2V0X3QgYWNyb3NzIHBsYXRmb3JtcywKLSAgIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciwgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRvIHBpY2sgdGhpcwotICAgZGF0YSBzdHJ1Y3R1cmUgYXBhcnQuICovCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3ByZnByZWcgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHJldHVybiBlbGZjb3JlX21ha2Vfbm90ZV9wc2V1ZG9zZWN0aW9uIChhYmZkLCAiLnJlZzIiLCBub3RlKTsKLX0KLQotCi0vKiBMaW51eCBkdW1wcyB0aGUgSW50ZWwgU1NFIHJlZ3MgaW4gYSBub3RlIG5hbWVkICJMSU5VWCIgd2l0aCBhIG5vdGUKLSAgIHR5cGUgb2YgNSAoTlRfUFJYRlBSRUcpLiAgSnVzdCBpbmNsdWRlIHRoZSB3aG9sZSBub3RlJ3MgY29udGVudHMKLSAgIGxpdGVyYWxseS4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3ByeGZwcmVnIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICByZXR1cm4gZWxmY29yZV9tYWtlX25vdGVfcHNldWRvc2VjdGlvbiAoYWJmZCwgIi5yZWcteGZwIiwgbm90ZSk7Ci19Ci0KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHJwc2luZm9fdAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQotIyBkZWZpbmUgZWxmY29yZV9wc2luZm9fdCBwc2luZm9fdAotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLQotLyogcmV0dXJuIGEgbWFsbG9jJ2VkIGNvcHkgb2YgYSBzdHJpbmcgYXQgU1RBUlQgd2hpY2ggaXMgYXQKLSAgIG1vc3QgTUFYIGJ5dGVzIGxvbmcsIHBvc3NpYmx5IHdpdGhvdXQgYSB0ZXJtaW5hdGluZyAnXDAnLgotICAgdGhlIGNvcHkgd2lsbCBhbHdheXMgaGF2ZSBhIHRlcm1pbmF0aW5nICdcMCcuICovCi0KLXN0YXRpYyBjaGFyKgotZWxmY29yZV9zdHJuZHVwIChhYmZkLCBzdGFydCwgbWF4KQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIHN0YXJ0OwotICAgICBpbnQgbWF4OwotewotICBjaGFyKiBkdXA7Ci0gIGNoYXIqIGVuZCA9IG1lbWNociAoc3RhcnQsICdcMCcsIG1heCk7Ci0gIGludCBsZW47Ci0KLSAgaWYgKGVuZCA9PSBOVUxMKQotICAgIGxlbiA9IG1heDsKLSAgZWxzZQotICAgIGxlbiA9IGVuZCAtIHN0YXJ0OwotCi0gIGR1cCA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0gIGlmIChkdXAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGR1cCwgc3RhcnQsIGxlbik7Ci0gIGR1cFtsZW5dID0gJ1wwJzsKLQotICByZXR1cm4gZHVwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzaW5mbyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgZWxmY29yZV9wc2luZm9fdCBwc2luZm87Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGVsZmNvcmVfcHNpbmZvX3QpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzaW5mbywgbm90ZS0+ZGVzY2RhdGEsIG5vdGUtPmRlc2Nzeik7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9wcm9ncmFtCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9mbmFtZSwgc2l6ZW9mIChwc2luZm8ucHJfZm5hbWUpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQKLSAgICA9IGVsZmNvcmVfc3RybmR1cCAoYWJmZCwgcHNpbmZvLnByX3BzYXJncywgc2l6ZW9mIChwc2luZm8ucHJfcHNhcmdzKSk7Ci0KLSAgLyogTm90ZSB0aGF0IGZvciBzb21lIHJlYXNvbiwgYSBzcHVyaW91cyBzcGFjZSBpcyB0YWNrZWQKLSAgICAgb250byB0aGUgZW5kIG9mIHRoZSBhcmdzIGluIHNvbWUgKGF0IGxlYXN0IG9uZSBhbnl3YXkpCi0gICAgIGltcGxlbWVudGF0aW9ucywgc28gc3RyaXAgaXQgb2ZmIGlmIGl0IGV4aXN0cy4gKi8KLQotICB7Ci0gICAgY2hhciogY29tbWFuZCA9IGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZDsKLSAgICBpbnQgbiA9IHN0cmxlbiAoY29tbWFuZCk7Ci0KLSAgICBpZiAoMCA8IG4gJiYgY29tbWFuZFtuIC0gMV0gPT0gJyAnKQotICAgICAgY29tbWFuZFtuIC0gMV0gPSAnXDAnOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKSAqLwotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgcHN0YXR1c190IHBzdGF0OwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChwc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKHBzdGF0KSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQgPSBwc3RhdC5wcl9waWQ7Ci0KLSAgLyogQ291bGQgZ3JhYiBzb21lIG1vcmUgZGV0YWlscyBmcm9tIHRoZSAicmVwcmVzZW50YXRpdmUiCi0gICAgIGx3cHN0YXR1c190IGluIHBzdGF0LnByX2x3cCwgYnV0IHdlJ2xsIGNhdGNoIGl0IGFsbCBpbiBhbgotICAgICBOVF9MV1BTVEFUVVMgbm90ZSwgcHJlc3VtYWJseS4gKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfbHdwc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBsd3BzdGF0dXNfdCBsd3BzdGF0OwotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAobHdwc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmbHdwc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAobHdwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPSBsd3BzdGF0LnByX2x3cGlkOwotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IGx3cHN0YXQucHJfY3Vyc2lnOwotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcwotICAgICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9yZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfcmVnKTsKLSNlbmRpZgotCi0gIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBpZiAoIWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBNYWtlIGEgIi5yZWcyLzk5OSIgc2VjdGlvbiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcyLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcwotICAgICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9jb250ZXh0LnVjX21jb250ZXh0LmZwcmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfRlBSRUcpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9mcHJlZyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9mcHJlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWcyIiwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1dJTjMyX1BTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfd2luMzJwc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSAqIG5vdGU7Ci17Ci0gIGNoYXIgYnVmWzMwXTsKLSAgY2hhciAqIG5hbWU7Ci0gIGFzZWN0aW9uICogc2VjdDsKLSAgd2luMzJfcHN0YXR1c190IHBzdGF0dXM7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiA8IHNpemVvZiAocHN0YXR1cykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmIHBzdGF0dXMsIG5vdGUtPmRlc2NkYXRhLCBub3RlLT5kZXNjc3opOwotICAKLSAgc3dpdGNoIChwc3RhdHVzLmRhdGFfdHlwZSkgCi0gICAgewotICAgIGNhc2UgTk9URV9JTkZPX1BST0NFU1M6Ci0gICAgICAvKiBGSVhNRTogbmVlZCB0byBhZGQgLT5jb3JlX2NvbW1hbmQuICAqLwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBwc3RhdHVzLmRhdGEucHJvY2Vzc19pbmZvLnNpZ25hbDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHN0YXR1cy5kYXRhLnByb2Nlc3NfaW5mby5waWQ7Ci0gICAgICBicmVhayA7Ci0KLSAgICBjYXNlIE5PVEVfSU5GT19USFJFQUQ6Ci0gICAgICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBwc3RhdHVzLmRhdGEudGhyZWFkX2luZm8udGlkKTsKLSAgICAgIAotICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICAgICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgICAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKHBzdGF0dXMuZGF0YS50aHJlYWRfaW5mby50aHJlYWRfY29udGV4dCk7Ci0gICAgICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChzdHJ1Y3Qgd2luMzJfcHN0YXR1cywKLQkJCQkJCWRhdGEudGhyZWFkX2luZm8udGhyZWFkX2NvbnRleHQpOwotICAgICAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICAgICAgaWYgKHBzdGF0dXMuZGF0YS50aHJlYWRfaW5mby5pc19hY3RpdmVfdGhyZWFkKQotCWlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5PVEVfSU5GT19NT0RVTEU6Ci0gICAgICAvKiBNYWtlIGEgIi5tb2R1bGUveHh4eHh4eHgiIHNlY3Rpb24uICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLm1vZHVsZS8lMDh4IiAsIHBzdGF0dXMuZGF0YS5tb2R1bGVfaW5mby5iYXNlX2FkZHJlc3MpOwotICAgICAgCi0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgICAgIAotICAgICAgaWYgKHNlY3QgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIHNlY3QtPl9yYXdfc2l6ZSA9IG5vdGUtPmRlc2NzejsKLSAgICAgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zOwotICAgICAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBIQVZFX1dJTjMyX1BTVEFUVVNfVCAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHN3aXRjaCAobm90ZS0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKQotICAgIGNhc2UgTlRfUFJTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9QU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkKLSAgICBjYXNlIE5UX0xXUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfbHdwc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0gICAgY2FzZSBOVF9GUFJFR1NFVDoJCS8qIEZJWE1FOiByZW5hbWUgdG8gTlRfUFJGUFJFRyAqLwotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfV0lOMzJfUFNUQVRVU19UKQotICAgIGNhc2UgTlRfV0lOMzJQU1RBVFVTOgkKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfd2luMzJwc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0gIGNhc2UgTlRfUFJYRlBSRUc6CQkvKiBMaW51eCBTU0UgZXh0ZW5zaW9uICovCi0gICAgICBpZiAobm90ZS0+bmFtZXN6ID09IDUKLQkgICYmICEgc3RyY21wIChub3RlLT5uYW1lZGF0YSwgIkxJTlVYIikpCi0JcmV0dXJuIGVsZmNvcmVfZ3Jva19wcnhmcHJlZyAoYWJmZCwgbm90ZSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHRydWU7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0gICAgY2FzZSBOVF9QUlBTSU5GTzoKLSAgICBjYXNlIE5UX1BTSU5GTzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKTsKLSNlbmRpZgotICAgIH0KLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLXsKLSAgY2hhciogYnVmOwotICBjaGFyKiBwOwotCi0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnVmID0gYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkIChidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgIGVycm9yOgotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IGJ1ZjsKLSAgd2hpbGUgKHAgPCBidWYgKyBzaXplKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiYWQgYWxpZ25tZW50IGFzc3VtcHRpb24uICovCi0gICAgICBFbGZfRXh0ZXJuYWxfTm90ZSogeG5wID0gKEVsZl9FeHRlcm5hbF9Ob3RlKikgcDsKLSAgICAgIEVsZl9JbnRlcm5hbF9Ob3RlIGluOwotCi0gICAgICBpbi50eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT50eXBlKTsKLQotICAgICAgaW4ubmFtZXN6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5uYW1lc3opOwotICAgICAgaW4ubmFtZWRhdGEgPSB4bnAtPm5hbWU7Ci0KLSAgICAgIGluLmRlc2NzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+ZGVzY3N6KTsKLSAgICAgIGluLmRlc2NkYXRhID0gaW4ubmFtZWRhdGEgKyBCRkRfQUxJR04gKGluLm5hbWVzeiwgNCk7Ci0gICAgICBpbi5kZXNjcG9zID0gb2Zmc2V0ICsgKGluLmRlc2NkYXRhIC0gYnVmKTsKLQotICAgICAgaWYgKCEgZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsICZpbikpCi0JZ290byBlcnJvcjsKLQotICAgICAgcCA9IGluLmRlc2NkYXRhICsgQkZEX0FMSUdOIChpbi5kZXNjc3osIDQpOwotICAgIH0KLQotICBmcmVlIChidWYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBub3cgdW5uZWNlc3NhcnkuICBDYWxsZXJzIGNhbiBqdXN0IGNhbGwKLSAgIGJmZF9zZWN0aW9uX2Zyb21fcGhkciBkaXJlY3RseS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciogcGhkcjsKLSAgICAgaW50IHNlY19udW07Ci17Ci0gIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQwKLS8qIFByb3ZpZGluZyBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZS4gICovCi0KLS8qIFJldHVybiBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEKLSAgIGNvcHkgb2YgQUJGRCdzIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMuICBSZXR1cm4gLTEgaWYgYW4gZXJyb3IKLSAgIG9jY3VyczsgYmZkX2dldF9lcnJvciB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2RlLiAgKi8KLWxvbmcKLWJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bQotCSAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci19Ci0KLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1pbnQKLWJmZF9nZXRfZWxmX3BoZHJzIChhYmZkLCBwaGRycykKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICpwaGRyczsKLXsKLSAgaW50IG51bV9waGRyczsKLQotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBudW1fcGhkcnMgPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsKLSAgbWVtY3B5IChwaGRycywgZWxmX3RkYXRhIChhYmZkKS0+cGhkciwgCi0JICBudW1fcGhkcnMgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgcmV0dXJuIG51bV9waGRyczsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcmMuYyBiL2JmZC9lbGYzMi1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZGM3MC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyogQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBhcmNfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyBib29sZWFuIGFyY19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBUcnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBzcGFjZSBvY2N1cGllZCBieSByZWxvY2F0aW9uIHRhYmxlcwotICAgb24gdGhlIFJPTSAobm90IHRoYXQgdGhlIFJPTSB3b24ndCBiZSBzd2FtcGVkIGJ5IG90aGVyIEVMRiBvdmVyaGVhZCkuICAqLwotI2RlZmluZSBVU0VfUkVMCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9hcmNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQVJDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BUkNfMzIsCQkvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ18zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9BUkNfQjI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19CMjYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIyIGJpdCBicmFuY2g7IGJpdHMgMjEtMiBhcmUgc3RvcmVkIGluIGJpdHMgMjYtNy4gICovCi0gIEhPV1RPIChSX0FSQ19CMjJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA3LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjIyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2ZmZmY4MCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBBUkMgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGFyY19yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX3JlbG9jX21hcCBhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0FSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQVJDX0IyNiwgUl9BUkNfQjI2IH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsIFJfQVJDX0IyMl9QQ1JFTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgYXJjX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9hcmNfaG93dG9fdGFibGVbYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gQVJDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BUkNfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXJjX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFSQyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIGFyY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FSQ19NQUNIOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBFX0FSQ19NQUNIX0JBU0U6Ci0gICAgICBtYWNoID0gYmZkX21hY2hfYXJjX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVW5rbm93biBjcHUgdHlwZS4gID8/PyBXaGF0IHRvIGRvPyAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FyYywgbWFjaCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGFuIEFSQyBFTEYgb2JqZWN0IGZpbGUuCi0gICBUaGlzIGdldHMgdGhlIEFSQyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKG1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgdmFsID0gRV9BUkNfTUFDSF9CQVNFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX0FSQ19NQUNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1saXR0bGVhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfYmlnYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1iaWdhcmMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9hcmMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfQVJDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJYXJjX2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCWFyY19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcm0uaCBiL2JmZC9lbGYzMi1hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NTc4MS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMzICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgaW5zbjMyOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgaW5zbjE2OwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUKLSAgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAotICBQQVJBTVMgKChpbnNuMzIsIGludCkpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IGVsZjMyX2FybV90b190aHVtYl9zdHViCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF9zaWduZWRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGVsZjMyX3RodW1iX3RvX2FybV9zdHViCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF9zaWduZWRfdm1hLCBiZmRfdm1hKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAqLwotCi0jZGVmaW5lIElOVEVSV09SS19GTEFHKCBhYmZkICkgICAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAgICAgIi91c3IvbGliL2xkLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZQotICAgdGhpcy4gIEl0IGlzIHNldCB1cCBzbyB0aGF0IGFueSBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGlzCi0gICBjYWxsZWQgYmVmb3JlIHRoZSByZWxvY2F0aW9uIGhhcyBiZWVuIHNldCB1cCBjYWxscyB0aGUgZHluYW1pYwotICAgbGlua2VyIGZpcnN0ICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGYzMl9hcm1fcGx0MF9lbnRyeSBbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgwNCwgMHhlMCwgMHgyZCwgMHhlNSwJLyogc3RyICAgbHIsIFtzcCwgIy00XSEgICAgICovCi0gIDB4MTAsIDB4ZTAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGxyLCBbcGMsICMxNl0gICAgICAqLwotICAweDBlLCAweGUwLCAweDhmLCAweGUwLAkvKiBhZHIgICBsciwgcGMsIGxyICAgICAgICAgKi8KLSAgMHgwOCwgMHhmMCwgMHhiZSwgMHhlNQkvKiBsZHIgICBwYywgW2xyLCAjOF0hICAgICAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZQotICAgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGYzMl9hcm1fcGx0X2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGMwLCAweDlmLCAweGU1LAkvKiBsZHIgICBpcCwgW3BjLCAjNF0gICAgICAgKi8KLSAgMHgwYywgMHhjMCwgMHg4ZiwgMHhlMCwJLyogYWRkICAgaXAsIHBjLCBpcCAgICAgICAgICovCi0gIDB4MDAsIDB4ZjAsIDB4OWMsIDB4ZTUsCS8qIGxkciAgIHBjLCBbaXBdICAgICAgICAgICAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwICAgICAgICAvKiBvZmZzZXQgdG8gc3ltYm9sIGluIGdvdCAgKi8KLX07Ci0KLQotLyogVGhlIEFSTSBsaW5rZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlbG9jcyB0aGF0IGl0Ci0gICBkZWNpZGVzIHRvIGNvcHkgaW4gY2hlY2tfcmVsb2NzIGZvciBlYWNoIHN5bWJvbC4gIFRoaXMgaXMgc28gdGhhdAotICAgaXQgY2FuIGRpc2NhcmQgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIGl0IGRvZXNuJ3QgbmVlZCB0aGVtIHdoZW4KLSAgIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLiAgV2Ugc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgZmllbGQKLSAgIGV4dGVuZGluZyB0aGUgcmVndWxhciBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyB3ZQotICAgaGF2ZSBjb3BpZWQgZm9yIGEgZ2l2ZW4gc3ltYm9sLiAgKi8KLQotc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIG5leHQ7Ci0gIC8qIEEgc2VjdGlvbiBpbiBkeW5vYmouICAqLwotICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBBcm0gRUxGIGxpbmtlciBoYXNoIGVudHJ5LiAgKi8KLQotc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBwY3JlbF9yZWxvY3NfY29waWVkOwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBUcmF2ZXJzZSBhbiBhcm0gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGVsZjMyX2FybV9oYXNoX3RhYmxlKGluZm8pIFwKLSAgKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQVJNIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSAqLwotc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUKLSAgewotICAgIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLwotICAgIGxvbmcgaW50IHRodW1iX2dsdWVfc2l6ZTsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBBUk0tdG8tVGh1bWIgZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgYXJtX2dsdWVfc2l6ZTsKLQotICAgIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCi0gICAgYmZkICogYmZkX29mX2dsdWVfb3duZXI7Ci0KLSAgICAvKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtub3dsZWRnZSBvZiB0aGUgQVJNJ3MgcGlwZWxpbmUKLSAgICAgICBsZW5ndGggc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgaW50IG5vX3BpcGVsaW5lX2tub3dsZWRnZTsKLSAgfTsKLQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gQVJNIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmMzJfYXJtX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqIHRhYmxlOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqIHJldCA9Ci0gICAgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIGVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT50aHVtYl9nbHVlX3NpemUgPSAwOwotICByZXQtPmFybV9nbHVlX3NpemUgPSAwOwotICByZXQtPmJmZF9vZl9nbHVlX293bmVyID0gTlVMTDsKLSAgcmV0LT5ub19waXBlbGluZV9rbm93bGVkZ2UgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgYXJtZWxmIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgaGFzaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoYXNoID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBoYXNoOwotfQotCi1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIGVsZmFybSBzcGVjaWZpYyBoYXNoIHRhYmxlLiAgKi8KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICAgQVJNLT5UaHVtYiBnbHVlOgotCi0gICAuYXJtCi0gICBfX2Z1bmNfZnJvbV9hcm06Ci0gICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotICAgYnggIHIxMgotICAgX19mdW5jX2FkZHI6Ci0gICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKLSAqLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06ICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRodW1iCi0gICAuYWxpZ24gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduIDIKLSAgIF9fZnVuY19mcm9tX3RodW1iOiAgICAgICAgICAgICAgX19mdW5jX2Zyb21fdGh1bWI6Ci0gICBieCBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCB7cjYsIGxyfQotICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YgIGxyLCBwYwotICAgX19mdW5jX2NoYW5nZV90b19hcm06ICAgICAgICAgICAgICAgICAgICAgICAgYnggICByNgotICAgYiBmdW5jICAgICAgICAgICAgICAgICAgICAgICAuYXJtCi0gICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIGxkbWlhIHIxMyEge3I2LCBscn0KLSAgIGJ4ICAgIGxyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkICAgICAgICBmdW5jCi0gKi8KLQotI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9TSVpFIDgKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Owotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiA9IDB4NDZjMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhM19iX2luc24gPSAweGVhMDAwMDAwOwotCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuID0gMHhiNTQwOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX2xkcl9pbnNuID0gMHg0ZTAzOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuID0gMHg0NmZlOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmE0X2J4X2luc24gPSAweDQ3MzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTVfcG9wX2luc24gPSAweGU4YmQ0MDQwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE2X2J4X2luc24gPSAweGUxMmZmZjFlOwotCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqIHM7Ci0gIGJmZF9ieXRlICogZm9vOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBjb25zdCBjaGFyICogbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogczsKLSAgY2hhciAqIHRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGdsb2JhbHMpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOwkJCS8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGhhc2hfdGFibGUtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCSAgICBCU0ZfR0xPQkFMLAotCQkJCSAgICBzLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICsgMSwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotICBjaGFyIGJpbmQ7Ci0KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGhhc2hfdGFibGUgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47CQkJLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCSAgICAgQlNGX0dMT0JBTCwgcywgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICsgMSwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgLyogSWYgd2UgbWFyayBpdCAndGh1bWInLCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZG8gYSBiZXR0ZXIgam9iLiAgKi8KLSAgYmluZCA9IEVMRl9TVF9CSU5EIChteWgtPnR5cGUpOwotICBteWgtPnR5cGUgPSBFTEZfU1RfSU5GTyAoYmluZCwgU1RUX0FSTV9URlVOQyk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIC8qIEFsbG9jYXRlIGFub3RoZXIgc3ltYm9sIHRvIG1hcmsgd2hlcmUgd2Ugc3dpdGNoIHRvIGFybSBtb2RlLiAgKi8KLQotI2RlZmluZSBDSEFOR0VfVE9fQVJNICJfXyVzX2NoYW5nZV90b19hcm0iCi0jZGVmaW5lIEJBQ0tfRlJPTV9BUk0gIl9fJXNfYmFja19mcm9tX2FybSIKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKENIQU5HRV9UT19BUk0pICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBDSEFOR0VfVE9fQVJNLCBuYW1lKTsKLQotICBteWggPSBOVUxMOwotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCSAgICAgIEJTRl9MT0NBTCwgcywgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICsgNCwKLQkJCQkgICAgTlVMTCwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJm15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArPSBUSFVNQjJBUk1fR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotLyogU2VsZWN0IGEgQkZEIHRvIGJlIHVzZWQgdG8gaG9sZCB0aGUgc2VjdGlvbnMgdXNlZCBieSB0aGUgZ2x1ZSBjb2RlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdHMgaW4gbGQvZW11bHRlbXBsLwotICAge2FybWVsZi9wZX0uZW0gICovCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICBnZXR0aW5nIGEgYmZkIHRvIGhvbGQgdGhlIGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90ZTogd2UgZG8gbm90IGluY2x1ZGUgdGhlIGZsYWcgU0VDX0xJTktFUl9DUkVBVEVELCBhcyB0aGlzCi0JIHdpbGwgcHJldmVudCBlbGZfbGlua19pbnB1dF9iZmQoKSBmcm9tIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzCi0JIG9mIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIGdjIG1hcmsgdG8gcHJldmVudCB0aGUgc2VjdGlvbiBmcm9tIGJlaW5nIHJlbW92ZWQgYnkgZ2FyYmFnZQotCSBjb2xsZWN0aW9uLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgbm8gcmVsb2NzIHJlZmVyIHRvIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBzZWMtPmdjX21hcmsgPSAxOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc2VjLT5nY19tYXJrID0gMTsKLSAgICB9Ci0KLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciB1c2UuICAqLwotICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgbGlua19pbmZvLCBub19waXBlbGluZV9rbm93bGVkZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgaW50IG5vX3BpcGVsaW5lX2tub3dsZWRnZTsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIHRvIGNvbnN0cnVjdCBhbnkgZ2x1ZS4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBIZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gIFdlIGhhdmUgYSBob29rCi0gICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAgKi8KLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgZ2xvYmFscy0+bm9fcGlwZWxpbmVfa25vd2xlZGdlID0gbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotCi0gIC8qIFJ1bW1hZ2UgYXJvdW5kIGFsbCB0aGUgcmVsb2NzIGFuZCBtYXAgdGhlIGdsdWUgdmVjdG9ycy4gICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKDsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICAvKiBMb2FkIHRoZSByZWxvY3MuICAqLwotCi0gICAgICBpcmVsID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLAotCQkJCQkoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLQotICAgICAgQkZEX0FTU0VSVCAoaXJlbCAhPSAwKTsKLQotICAgICAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgbG9uZyByX3R5cGU7Ci0JICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0KLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0JICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyk7Ci0KLQkgIC8qIFRoZXNlIGFyZSB0aGUgb25seSByZWxvY2F0aW9uIHR5cGVzIHdlIGNhcmUgYWJvdXQgKi8KLQkgIGlmICggICByX3R5cGUgIT0gUl9BUk1fUEMyNAotCSAgICAgICYmIHJfdHlwZSAhPSBSX0FSTV9USE1fUEMyMikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLQkgIGlmIChleHRzeW1zID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkJZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JCSAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJCSAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIG5vdCBhZ2FpbnN0IGEgc3ltYm9sIGl0IGNhbm5vdCBjb25jZXJuIHVzLiAqLwotCi0JICBoID0gTlVMTDsKLQotCSAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBsb2NhbCBzeW1ib2xzICovCi0JICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCAqLwotCSAgcl9pbmRleCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgICBlbGZfc3ltX2hhc2hlcyAoYWJmZClbcl9pbmRleF07Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBzdGF0aWMgc3ltYm9sIGl0IG11c3QgYmUgd2l0aGluCi0JICAgICB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBzbyBjYW5ub3QgYmUgYSBjcm9zcyBBUk0vVGh1bWIgcmVsb2NhdGlvbi4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX0FSTV9QQzI0OgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCi0JICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCSAgICAgICAgIGluc2VydCBnbHVlLiAgKi8KLQotCSAgICAgIGlmIChFTEZfU1RfVFlQRShoLT50eXBlKSA9PSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgbG9vawotCSAgICAgICAgIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuICBJZiBpdCBpcyBub3QgYSB0aHVtYgotICAgICAgICAgICAgICAgICB0YXJnZXQsIHdlIGluc2VydCBnbHVlLiAgKi8KLQotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaC0+dHlwZSkgIT0gU1RUX0FSTV9URlVOQykKLQkJcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotICAKLWVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhlIHRodW1iIGZvcm0gb2YgYSBsb25nIGJyYW5jaCBpcyBhIGJpdCBmaW5pY2t5LCBiZWNhdXNlIHRoZSBvZmZzZXQKLSAgIGVuY29kaW5nIGlzIHNwbGl0IG92ZXIgdHdvIGZpZWxkcywgZWFjaCBpbiBpdCdzIG93biBpbnN0cnVjdGlvbi4gVGhleQotICAgY2FuIG9jY3VyIGluIGFueSBvcmRlci4gU28gZ2l2ZW4gYSB0aHVtYiBmb3JtIG9mIGxvbmcgYnJhbmNoLCBhbmQgYW4KLSAgIG9mZnNldCwgaW5zZXJ0IHRoZSBvZmZzZXQgaW50byB0aGUgdGh1bWIgYnJhbmNoIGFuZCByZXR1cm4gZmluaXNoZWQKLSAgIGluc3RydWN0aW9uLgotCi0gICBJdCB0YWtlcyB0d28gdGh1bWIgaW5zdHJ1Y3Rpb25zIHRvIGVuY29kZSB0aGUgdGFyZ2V0IGFkZHJlc3MuIEVhY2ggaGFzCi0gICAxMSBiaXRzIHRvIGludmVzdC4gVGhlIHVwcGVyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiBvbmUgKGlkZW50aWZlZCBieQotICAgSC0wLi4gc2VlIGJlbG93KSwgdGhlIGxvd2VyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgb3RoZXIgKGlkZW50aWZpZWQKLSAgIGJ5IEgtMSkuCi0KLSAgIENvbWJpbmUgdG9nZXRoZXIgYW5kIHNoaWZ0ZWQgbGVmdCBieSAxIChpdCdzIGEgaGFsZiB3b3JkIGFkZHJlc3MpIGFuZAotICAgdGhlcmUgeW91IGhhdmUgaXQuCi0KLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCi0gICBPcDogMTExMSA9IEYsCi0gICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAotCi0gICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0Ci0gICB0aGUgbG93ZXIgb25lIGZpcnN0LiBJdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlci4ga3JrQGN5Z251cy5jb20KLQotICAgWFhYOiAgQWN0dWFsbHkgdGhlIG9yZGVyIGRvZXMgbWF0dGVyLiAgVGhlIHNlY29uZCBpbnN0cnVjdGlvbiAoSC0xKQotICAgbW92ZXMgdGhlIGNvbXB1dGVkIGFkZHJlc3MgaW50byB0aGUgUEMsIHNvIGl0IG11c3QgYmUgdGhlIHNlY29uZCBvbmUKLSAgIGluIHRoZSBzZXF1ZW5jZS4gIFRoZSBwcm9ibGVtLCBob3dldmVyIGlzIHRoYXQgd2hpbHN0IGxpdHRsZSBlbmRpYW4gY29kZQotICAgc3RvcmVzIHRoZSBpbnN0cnVjdGlvbnMgaW4gSEkgdGhlbiBMT1cgb3JkZXIsIGJpZyBlbmRpYW4gY29kZSBkb2VzIHRoZQotICAgcmV2ZXJzZS4gIG5pY2tjQGN5Z251cy5jb20uICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAgICAgIDB4RjgwMEYwMDAKLSNkZWZpbmUgSElfTE9XX09SREVSICAgICAgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQgKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsJCQkJLyogSGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcy4gICovCi0gIGxvd19iaXRzID0gcmVsX29mZiAmIDB4MDAwMDA3RkY7CQkvKiBUaGUgYm90dG9tIDExIGJpdHMuICAqLwotICBoaWdoX2JpdHMgPSAocmVsX29mZiA+PiAxMSkgJiAweDAwMDAwN0ZGOwkvKiBUaGUgdG9wIDExIGJpdHMuICAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQgKCk7CQkJLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0gIAotICByZXR1cm4gYnJfaW5zbjsKLX0KLQotLyogVGh1bWIgY29kZSBjYWxsaW5nIGFuIEFSTSBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBoaXRfZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3NpZ25lZF92bWEgICAgICAgICBhZGRlbmQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsOwotewotICBhc2VjdGlvbiAqIHMgPSAwOwotICBsb25nIGludCBteV9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKLSAgbG9uZyBpbnQgcmV0X29mZnNldDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBteWggPSBmaW5kX3RodW1iX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0gIGlmIChteWggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwKLQkJCSAgICAgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgaWYgKHN5bV9zZWMgIT0gTlVMTAotCSAgJiYgc3ltX3NlYy0+b3duZXIgIT0gTlVMTAotCSAgJiYgIUlOVEVSV09SS19GTEFHIChzeW1fc2VjLT5vd25lcikpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fc2VjLT5vd25lciksIG5hbWUpOwotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogdGh1bWIgY2FsbCB0byBhcm0iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAtLW15X29mZnNldDsKLSAgICAgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQotICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9ub29wX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQotICAgICAgcmV0X29mZnNldCA9Ci0JKChiZmRfc2lnbmVkX3ZtYSkgdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCi0JLSAoKGJmZF9zaWduZWRfdm1hKQotCSAgIChzLT5vdXRwdXRfb2Zmc2V0CS8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCSAgICArIG15X29mZnNldAkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKQkvKiBBZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLQkgICArIDQJCQkvKiBUaGUgYnJhbmNoIGluc3RydWN0aW9uIGlzIDQgYnl0ZXMgaW50byB0aGUgc3R1Yi4gICovCi0JICAgKyA4KTsJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLSAgLyogTm93IGdvIGJhY2sgYW5kIGZpeCB1cCB0aGUgb3JpZ2luYWwgQkwgaW5zbiB0byBwb2ludAotICAgICB0byBoZXJlLiAgKi8KLSAgcmV0X29mZnNldCA9Ci0gICAgcy0+b3V0cHV0X29mZnNldAotICAgICsgbXlfb2Zmc2V0Ci0gICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQotICAgIC0gODsKLQotICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhCi0JCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkgICAgICBpbnNlcnRfdGh1bWJfYnJhbmNoICh0bXAsIHJldF9vZmZzZXQpLAotCSAgICAgIGhpdF9kYXRhIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXJtIGNvZGUgY2FsbGluZyBhIFRodW1iIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50Ci1lbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJIGhpdF9kYXRhLCBzeW1fc2VjLCBvZmZzZXQsIGFkZGVuZCwgdmFsKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGhpdF9kYXRhOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgb2Zmc2V0OwotICAgICBiZmRfc2lnbmVkX3ZtYSAgICAgICAgIGFkZGVuZDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICB2YWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICBhc2VjdGlvbiAqIHM7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgbXloID0gZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwKLQkJCSAgICAgICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLSAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKLQkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKLQkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQl9Ci0gICAgICAtLW15X29mZnNldDsKLSAgICAgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0MV9sZHJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDJfYnhfcjEyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotICAgICAgLyogSXQncyBhIHRodW1iIGFkZHJlc3MuICBBZGQgdGhlIGxvdyBvcmRlciBiaXQuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsIHwgYTJ0M19mdW5jX2FkZHJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0gIHRtcCA9IHRtcCAmIDB4RkYwMDAwMDA7Ci0KLSAgLyogU29tZWhvdyB0aGVzZSBhcmUgYm90aCA0IHRvbyBmYXIsIHNvIHN1YnRyYWN0IDguICovCi0gIHJldF9vZmZzZXQgPSBzLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyBteV9vZmZzZXQKLSAgICArIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgKyBvZmZzZXQgKyBhZGRlbmQpCi0gICAgLSA4OwotICAKLSAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBoaXRfZGF0YQotCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgdmFsdWUsCi0JCQkgICAgICAgaW5mbywgc3ltX3NlYywgc3ltX25hbWUsIHN5bV9mbGFncywgaCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICB2YWx1ZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgc3ltX25hbWU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgc3ltX2ZsYWdzOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgaGl0X2RhdGEgPSBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQ7Ci0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGR5bm9iaiA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKiAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2dvdF9vZmZzZXRzOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3BsdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNyZWxvYyA9IE5VTEw7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgYmZkX3NpZ25lZF92bWEgICAgICAgICAgICAgICAgc2lnbmVkX2FkZGVuZDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmopCi0gICAgewotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICB9Ci0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0jaWZkZWYgVVNFX1JFTAotICBhZGRlbmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIGhvd3RvLT5zcmNfbWFzazsKLQotICBpZiAoYWRkZW5kICYgKChob3d0by0+c3JjX21hc2sgKyAxKSA+PiAxKSkKLSAgICB7Ci0gICAgICBzaWduZWRfYWRkZW5kID0gLTE7Ci0gICAgICBzaWduZWRfYWRkZW5kICY9IH4gaG93dG8tPnNyY19tYXNrOwotICAgICAgc2lnbmVkX2FkZGVuZCB8PSBhZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgc2lnbmVkX2FkZGVuZCA9IGFkZGVuZDsKLSNlbHNlCi0gIGFkZGVuZCA9IHNpZ25lZF9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotI2VuZGlmCi0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9BUk1fTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0gICAgY2FzZSBSX0FSTV9BQlMzMjoKLSAgICBjYXNlIFJfQVJNX1JFTDMyOgotI2lmbmRlZiBPTERfQVJNX0FCSQotICAgIGNhc2UgUl9BUk1fWFBDMjU6Ci0jZW5kaWYKLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBjb3BpZWQKLQkgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICovCi0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChyX3R5cGUgIT0gUl9BUk1fUEMyNAotIAkgICAgICB8fCAoaCAhPSBOVUxMCi0JICAgICAgICAgICYmIGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZTsKLQotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLAotCQkgICAgICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJICAgICBuYW1lICsgNCkgPT0gMCk7Ci0KLQkgICAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgc2tpcCA9IGZhbHNlOwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgJiBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgfQotCi0JICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9BUk1fUEMyNCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkgICAgICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWxvY2F0ZSA9IGZhbHNlOwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGUgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX1BDMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaCA9PSBOVUxMCi0JCSAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQl7Ci0JCSAgcmVsb2NhdGUgPSB0cnVlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfQVJNX1JFTEFUSVZFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9BQlMzMik7Ci0JCX0KLQkgICAgfQotCi0JICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkgIAotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8gbm90IHdhbnQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sCi0JICAgICB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gKi8KLQkgIGlmICghIHJlbG9jYXRlKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0JICAKLQkgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLQkJCQkJICAgKGJmZF92bWEpIDApOwotCX0KLSAgICAgIGVsc2Ugc3dpdGNoIChyX3R5cGUpCi0JewotI2lmbmRlZiBPTERfQVJNX0FCSQotCWNhc2UgUl9BUk1fWFBDMjU6CSAgLyogQXJtIEJMWCBpbnN0cnVjdGlvbi4gICovCi0jZW5kaWYKLQljYXNlIFJfQVJNX1BDMjQ6CSAgLyogQXJtIEIvQkwgaW5zdHJ1Y3Rpb24gKi8KLSNpZm5kZWYgT0xEX0FSTV9BQkkKLQkgIGlmIChyX3R5cGUgPT0gUl9BUk1fWFBDMjUpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayBmb3IgQXJtIGNhbGxpbmcgQXJtIGZ1bmN0aW9uLiAgKi8KLQkgICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIHRyYW5zbGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gaW50byBhIEJMCi0JCSBpbnN0cnVjdGlvbiBpbnN0ZWFkID8gICovCi0JICAgICAgaWYgKHN5bV9mbGFncyAhPSBTVFRfQVJNX1RGVU5DKQotCQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIlwKLSVzOiBXYXJuaW5nOiBBcm0gQkxYIGluc3RydWN0aW9uIHRhcmdldHMgQXJtIGZ1bmN0aW9uICclcycuIiksCi0JCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICB9Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgewotCSAgICAgIC8qIENoZWNrIGZvciBBcm0gY2FsbGluZyBUaHVtYiBmdW5jdGlvbi4gICovCi0JICAgICAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCQl7Ci0JCSAgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIHN5bV9uYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICBzaWduZWRfYWRkZW5kLCB2YWx1ZSk7Ci0JCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWJpZ2FybS1vYWJpIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4gIFRyZWFyaW5nIHRoZSBhZGRlbmQgYXMgYQotCQkgYnl0ZSBzaXplZCBmaWVsZCBhbmQgYWRkaW5nIGluIHRoZSBwaXBlbGluZSBvZmZzZXQuICAqLwotCi0JICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgdmFsdWUgLT0gcmVsLT5yX29mZnNldDsKLQkgICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXZhbHVlIC09IDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBBUk0gRUxGIEFCSSBzYXlzIHRoYXQgdGhpcyByZWxvYyBpcyBjb21wdXRlZCBhczogUyAtIFAgKyBBCi0JCSB3aGVyZToKLQkJICBTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHJlbG9jYXRpb24uCi0JCSAgUCBpcyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuCi0JCSAgQSBpcyB0aGUgYWRkZW5kIChleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24pIGluIGJ5dGVzLgotCi0JCSBTIGlzIGhlbGQgaW4gJ3ZhbHVlJy4KLQkJIFAgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbgotCQkgICBwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlbG9jIGludG8gdGhhdCBzZWN0aW9uLCBpZToKLQkJICAgICAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgICByZWwtPnJfb2Zmc2V0KS4KLQkJIEEgaXMgdGhlIGFkZGVuZCwgY29udmVydGVkIGludG8gYnl0ZXMsIGllOgotCQkgICAgIChzaWduZWRfYWRkZW5kICogNCkKLQotCQkgTm90ZTogTm9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIGhhdmUga25vd2xlZGdlIG9mIHRoZSBwaXBlbGluZQotCQkgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yLCB0aHVzIGl0IGlzIHVwIHRvIHRoZSBhc3NlbWJsZXIgdG8gZW5jb2RlCi0JCSB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGFkZGVuZC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IChzaWduZWRfYWRkZW5kIDw8IGhvd3RvLT5zaXplKTsKLQotCSAgICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBlbGluZQotCQkgb2Zmc2V0IGhlcmUuICBUaGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGxpbmtlciBpcyBub3Qgc3VwcG9zZWQKLQkJIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JCSB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkJIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHdoaWNoIEFCSSB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7IC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0JCSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCk7Ci0KLQkJICBpZiAoaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkJICAgIHZhbHVlIC09IDg7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJdCBpcyBub3QgYW4gZXJyb3IgZm9yIGFuIHVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSB0byBiZQotCSAgICAgb3V0IG9mIHJhbmdlLiAgQW55IHByb2dyYW0gdGhhdCBicmFuY2hlcyB0byBzdWNoIGEgc3ltYm9sCi0JICAgICBpcyBnb2luZyB0byBjcmFzaCBhbnl3YXksIHNvIHRoZXJlIGlzIG5vIHBvaW50IHdvcnJ5aW5nIAotCSAgICAgYWJvdXQgZ2V0dGluZyB0aGUgZGVzdGluYXRpb24gZXhhY3RseSByaWdodC4gICovCSAgICAgCi0JICBpZiAoISBoIHx8IGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFBlcmZvcm0gYSBzaWduZWQgcmFuZ2UgY2hlY2suICAqLwotCSAgICAgIHNpZ25lZF9hZGRlbmQgPSB2YWx1ZTsKLQkgICAgICBzaWduZWRfYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLQkgICAgICBpZiAoc2lnbmVkX2FkZGVuZCA+ICgoYmZkX3NpZ25lZF92bWEpKGhvd3RvLT5kc3RfbWFzayA+PiAxKSkKLQkJICB8fCBzaWduZWRfYWRkZW5kIDwgLSAoKGJmZF9zaWduZWRfdm1hKSAoKGhvd3RvLT5kc3RfbWFzayArIDEpID4+IDEpKSkKLQkJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgfQotCSAgICAgIAotCSAgdmFsdWUgPSAoc2lnbmVkX2FkZGVuZCAmIGhvd3RvLT5kc3RfbWFzaykKLQkgICAgfCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAofiBob3d0by0+ZHN0X21hc2spKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9BQlMzMjoKLQkgIHZhbHVlICs9IGFkZGVuZDsKLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgdmFsdWUgfD0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9SRUwzMjoKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlM4OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzEyOgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbiBmb3IgdGhlIGFybSAqLwotICAgICAgLyogQWxzbyB0aHVtYiBiICh1bmNvbmRpdGlvbmFsIGJyYW5jaCkuICA/Pz8gUmVhbGx5PyAgKi8KLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmZmZmMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9BQlM1OgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0aHVtYi4gKi8KLSNpZmRlZiBVU0VfUkVMCi0gICAgICAvKiBOZWVkIHRvIHJlZmV0Y2ggYWRkZW5kLiAgKi8KLSAgICAgIGFkZGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgLyogPz8/IE5lZWQgdG8gZGV0ZXJtaW5lIHNoaWZ0IGFtb3VudCBmcm9tIG9wZXJhbmQgc2l6ZS4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIC8qID8/PyBJc24ndCB2YWx1ZSB1bnNpZ25lZD8gICovCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHgxZiB8fCAobG9uZykgdmFsdWUgPCAtMHgxMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICAvKiA/Pz8gVmFsdWUgbmVlZHMgdG8gYmUgcHJvcGVybHkgc2hpZnRlZCBpbnRvIHBsYWNlIGZpcnN0LiAgKi8KLSAgICAgIHZhbHVlIHw9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmODNmOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotI2lmbmRlZiBPTERfQVJNX0FCSQotICAgIGNhc2UgUl9BUk1fVEhNX1hQQzIyOgotI2VuZGlmCi0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICAgIC8qIFRodW1iIEJMIChicmFuY2ggbG9uZyBpbnN0cnVjdGlvbikuICAqLwotICAgICAgewotCWJmZF92bWEgICAgICAgIHJlbG9jYXRpb247Ci0JYm9vbGVhbiAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hICAgICAgICB1cHBlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0JYmZkX3ZtYSAgICAgICAgbG93ZXJfaW5zbiA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyAyKTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfiByZWxvY19zaWduZWRfbWF4OwotCWJmZF92bWEgICAgICAgIGNoZWNrOwotCWJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLQotI2lmZGVmIFVTRV9SRUwKLQkvKiBOZWVkIHRvIHJlZmV0Y2ggdGhlIGFkZGVuZCBhbmQgc3F1aXNoIHRoZSB0d28gMTEgYml0IHBpZWNlcwotCSAgIHRvZ2V0aGVyLiAgKi8KLQl7Ci0JICBiZmRfdm1hIHVwcGVyID0gdXBwZXJfaW5zbiAmIDB4N2ZmOwotCSAgYmZkX3ZtYSBsb3dlciA9IGxvd2VyX2luc24gJiAweDdmZjsKLQkgIHVwcGVyID0gKHVwcGVyIF4gMHg0MDApIC0gMHg0MDA7IC8qIHNpZ24gZXh0ZW5kICovCi0JICBhZGRlbmQgPSAodXBwZXIgPDwgMTIpIHwgKGxvd2VyIDw8IDEpOwotCSAgc2lnbmVkX2FkZGVuZCA9IGFkZGVuZDsKLQl9Ci0jZW5kaWYKLSNpZm5kZWYgT0xEX0FSTV9BQkkKLQlpZiAocl90eXBlID09IFJfQVJNX1RITV9YUEMyMikKLQkgIHsKLQkgICAgLyogQ2hlY2sgZm9yIFRodW1iIHRvIFRodW1iIGNhbGwuICAqLwotCSAgICAvKiBGSVhNRTogU2hvdWxkIHdlIHRyYW5zbGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gaW50byBhIEJMCi0JICAgICAgIGluc3RydWN0aW9uIGluc3RlYWQgPyAgKi8KLQkgICAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiXAotJXM6IFdhcm5pbmc6IFRodW1iIEJMWCBpbnN0cnVjdGlvbiB0YXJnZXRzIHRodW1iIGZ1bmN0aW9uICclcycuIiksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICB9Ci0JZWxzZQotI2VuZGlmCi0JICB7Ci0JICAgIC8qIElmIGl0IGlzIG5vdCBhIGNhbGwgdG8gVGh1bWIsIGFzc3VtZSBjYWxsIHRvIEFybS4KLQkgICAgICAgSWYgaXQgaXMgYSBjYWxsIHJlbGF0aXZlIHRvIGEgc2VjdGlvbiBuYW1lLCB0aGVuIGl0IGlzIG5vdCBhCi0JICAgICAgIGZ1bmN0aW9uIGNhbGwgYXQgYWxsLCBidXQgcmF0aGVyIGEgbG9uZyBqdW1wLiAgKi8KLQkgICAgaWYgKHN5bV9mbGFncyAhPSBTVFRfQVJNX1RGVU5DICYmIHN5bV9mbGFncyAhPSBTVFRfU0VDVElPTikKLQkgICAgICB7Ci0JCWlmIChlbGYzMl90aHVtYl90b19hcm1fc3R1YgotCQkgICAgKGluZm8sIHN5bV9uYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIHNpZ25lZF9hZGRlbmQsIHZhbHVlKSkKLQkJICByZXR1cm4gYmZkX3JlbG9jX29rOwotCQllbHNlCi0JCSAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICAgICAgfQotCSAgfQotCi0JcmVsb2NhdGlvbiA9IHZhbHVlICsgc2lnbmVkX2FkZGVuZDsKLQotCXJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyByZWwtPnJfb2Zmc2V0KTsKLQkKLQlpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsgLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0JICAgIAotCSAgICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKTsKLQotCSAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNvZGUgYWxzbyB1c2VkIHRvIGFkZCBpbiB0aGUgcGlwbGluZQotCSAgICAgICBvZmZzZXQgaGVyZS4gIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgbGlua2VyIGlzIG5vdCBzdXBwb3NlZAotCSAgICAgICB0byBrbm93IGFib3V0IHN1Y2ggdGhpbmdzLCBhbmQgb25lIGRheSBpdCBtaWdodCBjaGFuZ2UuICBJbiBvcmRlcgotCSAgICAgICB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkgICAgICAgd2UgYXR0ZW1wdCB0byBkZXRlY3Qgd2hpY2ggQUJJIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVsb2MuICAqLwotCSAgICBpZiAoICAgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWxpdHRsZWFybS1vYWJpIikgPT0gMAotCQl8fCBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItYmlnYXJtLW9hYmkiKSA9PSAwCi0JCXx8IGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldID09IDApCi0JICAgICAgcmVsb2NhdGlvbiArPSA0OwotCSAgfQotCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCWlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCWVsc2UKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrIHwgfigoYmZkX3ZtYSkgLTEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpOwotCi0JLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQlpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heCB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JLyogUHV0IFJFTE9DQVRJT04gYmFjayBpbnRvIHRoZSBpbnNuLiAgKi8KLQl1cHBlcl9pbnNuID0gKHVwcGVyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZik7Ci0JbG93ZXJfaW5zbiA9IChsb3dlcl9pbnNuICYgfihiZmRfdm1hKSAweDdmZikgfCAoKHJlbG9jYXRpb24gPj4gMSkgJiAweDdmZik7Ci0KLQkvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB1cHBlcl9pbnNuLCBoaXRfZGF0YSk7Ci0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBsb3dlcl9pbnNuLCBoaXRfZGF0YSArIDIpOwotCi0JcmV0dXJuIChvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vayk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fQ09QWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HTE9CX0RBVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9KVU1QX1NMT1Q6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkVMQVRJVkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fR09UT0ZGOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0gICAgICAgICBkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotICAgICAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLSAgICAgICAgIGNhbGN1bGF0aW9uLiAqLwotCi0gICAgICB2YWx1ZSAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVFBDOgotICAgICAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gKi8KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCB8fAotCSAgICAgIChpbmZvLT5zaGFyZWQgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhIC1Cc3ltYm9saWMgbGluawotCQkgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMKLQkJIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlIG9mZnNldCBtdXN0Ci0JCSBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCQkgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdCByZWxvY2F0aW9uCi0JCSBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUKLQkJIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAqLwotCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCX0KLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMICYmCi0JCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlIHRoZQotCSAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeQotCSAgICAgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICovCi0JICBpZiAoKG9mZiAmIDEpICE9IDApCi0JICAgIG9mZiAmPSB+MTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgYXNlY3Rpb24gKiBzcmVsZ290OwotCQkgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCi0JCSAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIG9mZik7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotCQkgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgICAgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJfQotCi0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JICAgIH0KLQotCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1BMVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0gICAgICAvKiBSZXNvbHZlIGEgUExUMzIgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKLSAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQlyZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotCQkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBCRkRfQVNTRVJUKHNwbHQgIT0gTlVMTCk7Ci0gICAgICBpZiAoc3BsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgIAkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1NCUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fQU1QX1ZDQUxMOToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9USE1fUlBDMjI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JBQlMzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUEMyNDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SQkFTRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotI2lmZGVmIFVTRV9SRUwKLS8qIEFkZCBJTkNSRU1FTlQgdG8gdGhlIHJlbG9jIChvZiB0eXBlIEhPV1RPKSBhdCBBRERSRVNTLiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fYWRkX3RvX3JlbCAoYWJmZCwgYWRkcmVzcywgaG93dG8sIGluY3JlbWVudCkKLSAgICAgYmZkICogICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGJmZF9ieXRlICogICAgICAgICBhZGRyZXNzOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0gICAgIGJmZF9zaWduZWRfdm1hICAgICBpbmNyZW1lbnQ7Ci17Ci0gIGJmZF92bWEgICAgICAgIGNvbnRlbnRzOwotICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0KLSAgY29udGVudHMgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLQotICAvKiBHZXQgdGhlIChzaWduZWQpIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgYWRkZW5kID0gY29udGVudHMgJiBob3d0by0+c3JjX21hc2s7Ci0gIGlmIChhZGRlbmQgJiAoKGhvd3RvLT5zcmNfbWFzayArIDEpID4+IDEpKQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIG1hc2s7Ci0gICAgICAKLSAgICAgIG1hc2sgPSAtMTsKLSAgICAgIG1hc2sgJj0gfiBob3d0by0+c3JjX21hc2s7Ci0gICAgICBhZGRlbmQgfD0gbWFzazsKLSAgICB9Ci0KLSAgLyogQWRkIGluIHRoZSBpbmNyZW1lbnQsICh3aGljaCBpcyBhIGJ5dGUgdmFsdWUpLiAgKi8KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICBkZWZhdWx0OgotICAgICAgYWRkZW5kICs9IGluY3JlbWVudDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9QQzI0OgotICAgICAgYWRkZW5kIDw8PSBob3d0by0+c2l6ZTsKLSAgICAgIGFkZGVuZCArPSAgaW5jcmVtZW50OwotICAgICAgCi0gICAgICAvKiBTaG91bGQgd2UgY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUgPyAgKi8KLQotICAgICAgLyogRHJvcCBhbnkgdW5kZXNpcmVkIGJpdHMuICAqLwotICAgICAgYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIGNvbnRlbnRzID0gKGNvbnRlbnRzICYgfiBob3d0by0+ZHN0X21hc2spIHwgKGFkZGVuZCAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIAotICBiZmRfcHV0XzMyIChhYmZkLCBjb250ZW50cywgYWRkcmVzcyk7Ci19Ci0jZW5kaWYgLyogVVNFX1JFTCAqLwotCi0vKiBSZWxvY2F0ZSBhbiBBUk0gRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgbmFtZTsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGFyZWxlbnQgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfQVJNX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0byAoaW5wdXRfYmZkLCAmIGJmZF9yZWxvYywgcmVsKTsKLSAgICAgIGhvd3RvID0gYmZkX3JlbG9jLmhvd3RvOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLSNpZmRlZiBVU0VfUkVMCi0JCSAgYXJtX2FkZF90b19yZWwgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0LAotCQkJCSAgaG93dG8sIHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpOwotI2Vsc2UKLQkJICByZWwtPnJfYWRkZW5kICs9IChzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlKQotCQkgICAgPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2NhdGlvbl9uZWVkZWQgPSAxOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgICAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24gdmFsdWUuCi0JICAgICAgICAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZSBvYnNjdXJlIGNhc2VzCi0JICAgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICovCi0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkgICAgICAgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgICAgIGNhc2UgUl9BUk1fQUJTMzI6Ci0JICAgICAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICYmICgKLQkgICAgICAgICAgICAgIAkgICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkJCSAgKQotCSAgICAgICAgICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICAgICAgICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgICAgICAgICAgICAgJiYgKCFpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICAgICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JICAgICAgICAgICAgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JCQkgICkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpLTEpCi0JICAgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBkZWZhdWx0OgotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChyZWxvY2F0aW9uX25lZWRlZCkKLQkJcmVsb2NhdGlvbiA9IGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljCi0JCSAgICYmICFpbmZvLT5ub191bmRlZmluZWQKLQkJICAgJiYgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSA9PSBTVFZfREVGQVVMVCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwKLQkJICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQKLQkJICAgICAgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLQotICAgICAgciA9IGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwKLQkJCQkJIHJlbG9jYXRpb24sIGluZm8sIHNlYywgbmFtZSwKLQkJCQkJIChoID8gRUxGX1NUX1RZUEUgKGgtPnR5cGUpIDoKLQkJCQkJICBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSksIGgpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBBUk0gc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIEVMRiBoZWFkZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGlmIChlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLSAgICAgICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGlmIChFRl9BUk1fRUFCSV9WRVJTSU9OIChmbGFncykgPT0gRUZfQVJNX0VBQklfVU5LTk9XTikKLQl7Ci0JICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29yayBmbGFnIG9mICVzIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBlbHNlCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBvZiAlcyBkdWUgdG8gb3V0c2lkZSByZXF1ZXN0IiksCi0JCQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICAgICAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlci4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0gICAgICAmJiBFRl9BUk1fRUFCSV9WRVJTSU9OIChvdXRfZmxhZ3MpID09IEVGX0FSTV9FQUJJX1VOS05PV04KLSAgICAgICYmIGluX2ZsYWdzICE9IG91dF9mbGFncykKLSAgICB7Ci0gICAgICAvKiBDYW5ub3QgbWl4IFBJQyBhbmQgbm9uLVBJQyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBBUENTMjYgYW5kIEFQQ1MzMiBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDYW5ub3QgbWl4IGZsb2F0IEFQQ1MgYW5kIG5vbi1mbG9hdCBBUENTIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzCi0gICAgICAgICB0aGVuIHR1cm4gb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQotCXsKLQkgIGlmIChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBpbiAlcyBiZWNhdXNlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBpbl9mbGFncyAmPSB+RUZfSU5URVJXT1JLOwotCX0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlIGlucHV0IEJGRCBtdXN0IGhhdmUgaGFkIGl0cyBmbGFncyBpbml0aWFsaXNlZC4gICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgc2VlbXMgYm9ndXMgdG8gbWUgLS0gVGhlIGZsYWdzIGFyZSBpbml0aWFsaXplZCBpbgotICAgICB0aGUgYXNzZW1ibGVyIGJ1dCBJIGRvbid0IHRoaW5rIGFuIGVsZl9mbGFnc19pbml0IGZpZWxkIGlzCi0gICAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0ICovCi0gIC8qIEJGRF9BU1NFUlQgKGVsZl9mbGFnc19pbml0IChpYmZkKSk7ICovCi0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgdGhlbiBkbyBub3QKLSAgICAgICAgIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0gICAgICAgICBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotICAgICAgICAgbWVyZ2VzIGV2ZXIgc2V0IHRoZXNlIGZsYWdzIHRoZW4gdGhleSB3aWxsIHJldGFpbiB0aGVpcgotICAgICAgICAgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotICAgICAgICAgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb21wbGFpbiBhYm91dCB2YXJpb3VzIGZsYWcgbWlzbWF0Y2hlcy4gICovCi0gIGlmIChFRl9BUk1fRUFCSV9WRVJTSU9OIChpbl9mbGFncykgIT0gRUZfQVJNX0VBQklfVkVSU0lPTiAob3V0X2ZsYWdzKSkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIlwKLUVycm9yOiAlcyBjb21waWxlZCBmb3IgRUFCSSB2ZXJzaW9uICVkLCB3aGVyZWFzICVzIGlzIGNvbXBpbGVkIGZvciB2ZXJzaW9uICVkIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkgKGluX2ZsYWdzICYgRUZfQVJNX0VBQklNQVNLKSA+PiAyNCwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJCSAob3V0X2ZsYWdzICYgRUZfQVJNX0VBQklNQVNLKSA+PiAyNCk7Ci0gICAgfQotICBlbHNlIGlmIChFRl9BUk1fRUFCSV9WRVJTSU9OIChpbl9mbGFncykgIT0gRUZfQVJNX0VBQklfVU5LTk9XTikKLSAgICAvKiBOb3Qgc3VyZSB3aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIEVBQkkgdmVyc2lvbnMgPj0gMS4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfMjYpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTXzI2KSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQsIHdoZXJlYXMgJXMgaXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJaW5fZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMiwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkJb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IDI2IDogMzIpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU19GTE9BVCkpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIHBhc3NlcyBmbG9hdHMgaW4gJXMgcmVnaXN0ZXJzLCB3aGVyZWFzICVzIHBhc3NlcyB0aGVtIGluICVzIHJlZ2lzdGVycyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICAgaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUID8gXyAoImZsb2F0IikgOiBfICgiaW50ZWdlciIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgIG91dF9mbGFncyAmIEVGX0FQQ1NfMjYgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIikpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBpcyBjb21waWxlZCBhcyBwb3NpdGlvbiAlcyBjb2RlLCB3aGVyZWFzICVzIGlzIG5vdCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICBpbl9mbGFncyAmIEVGX1BJQyA/IF8gKCJpbmRlcGVuZGVudCIpIDogXyAoImRlcGVuZGVudCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIEludGVyd29ya2luZyBtaXNtYXRjaCBpcyBvbmx5IGEgd2FybmluZy4gKi8KLSAgaWYgKChpbl9mbGFncyAmIEVGX0lOVEVSV09SSykgIT0gKG91dF9mbGFncyAmIEVGX0lOVEVSV09SSykpCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogJXMgJXMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzICVzIiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgaW5fZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgic3VwcG9ydHMiKSA6IF8gKCJkb2VzIG5vdCBzdXBwb3J0IiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgb3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLID8gXyAoImRvZXMgbm90IikgOiBfICgiZG9lcyIpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICBmbGFncyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzOwotICAvKiBJZ25vcmUgaW5pdCBmbGFnIC0gaXQgbWF5IG5vdCBiZSBzZXQsIGRlc3BpdGUgdGhlIGZsYWdzIGZpZWxkIGNvbnRhaW5pbmcgdmFsaWQgZGF0YS4gICovCi0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBzd2l0Y2ggKEVGX0FSTV9FQUJJX1ZFUlNJT04gKGZsYWdzKSkKLSAgICB7Ci0gICAgY2FzZSBFRl9BUk1fRUFCSV9VTktOT1dOOgotICAgICAgLyogVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIEdOVSBleHRlbnN0aW9ucyBhbmQgbm90IHBhcnQgb2YgdGhlCi0JIG9mZmljaWFsIEFSTSBFTEYgZXh0ZW5kZWQgQUJJLiAgSGVuY2UgdGhleSBhcmUgb25seSBkZWNvZGVkIGlmCi0JIHRoZSBFQUJJIHZlcnNpb24gaXMgbm90IHNldC4gICovCi0gICAgICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JZnByaW50ZiAoZmlsZSwgXyAoIiBbaW50ZXJ3b3JraW5nIGVuYWJsZWRdIikpOwotICAgICAgCi0gICAgICBpZiAoZmxhZ3MgJiBFRl9BUENTXzI2KQotCWZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMjZdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMzJdIikpOwotICAgICAgCi0gICAgICBpZiAoZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKQotCWZwcmludGYgKGZpbGUsIF8gKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgICAgIAotICAgICAgaWYgKGZsYWdzICYgRUZfUElDKQotCWZwcmludGYgKGZpbGUsIF8gKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKLQotICAgICAgaWYgKGZsYWdzICYgRUZfTkVXX0FCSSkKLQlmcHJpbnRmIChmaWxlLCBfICgiIFtuZXcgQUJJXSIpKTsKLQkJIAotICAgICAgaWYgKGZsYWdzICYgRUZfT0xEX0FCSSkKLQlmcHJpbnRmIChmaWxlLCBfICgiIFtvbGQgQUJJXSIpKTsKLQkJIAotICAgICAgaWYgKGZsYWdzICYgRUZfU09GVF9GTE9BVCkKLQlmcHJpbnRmIChmaWxlLCBfICgiIFtzb2Z0d2FyZSBGUF0iKSk7Ci0JCSAKLSAgICAgIGZsYWdzICY9IH4oRUZfSU5URVJXT1JLIHwgRUZfQVBDU18yNiB8IEVGX0FQQ1NfRkxPQVQgfCBFRl9QSUMKLQkJIHwgRUZfTkVXX0FCSSB8IEVGX09MRF9BQkkgfCBFRl9TT0ZUX0ZMT0FUKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBFRl9BUk1fRUFCSV9WRVIxOgotICAgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbVmVyc2lvbjEgRUFCSV0iKSk7Ci0gICAgICAKLSAgICAgIGlmIChmbGFncyAmIEVGX0FSTV9TWU1TQVJFU09SVEVEKQotCWZwcmludGYgKGZpbGUsIF8gKCIgW3NvcnRlZCBzeW1ib2wgdGFibGVdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8gKCIgW3Vuc29ydGVkIHN5bWJvbCB0YWJsZV0iKSk7Ci0gICAgICAKLSAgICAgIGZsYWdzICY9IH4gRUZfQVJNX1NZTVNBUkVTT1JURUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCBfICgiIDxFQUJJIHZlcnNpb24gdW5yZWNvZ25pc2VkPiIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBmbGFncyAmPSB+IEVGX0FSTV9FQUJJTUFTSzsKLQotICBpZiAoZmxhZ3MgJiBFRl9BUk1fUkVMRVhFQykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtyZWxvY2F0YWJsZSBleGVjdXRhYmxlXSIpKTsKLQotICBpZiAoZmxhZ3MgJiBFRl9BUk1fSEFTRU5UUlkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbaGFzIGVudHJ5IHBvaW50XSIpKTsKLQotICBmbGFncyAmPSB+IChFRl9BUk1fUkVMRVhFQyB8IEVGX0FSTV9IQVNFTlRSWSk7Ci0KLSAgaWYgKGZsYWdzKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCI8VW5yZWNvZ25pc2VkIGZsYWcgYml0cyBzZXQ+IikpOwotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1lbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlIChlbGZfc3ltLCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfU3ltICogZWxmX3N5bTsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHN3aXRjaCAoRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pKQotICAgIHsKLSAgICBjYXNlIFNUVF9BUk1fVEZVTkM6Ci0gICAgICByZXR1cm4gRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pOwotCi0gICAgY2FzZSBTVFRfQVJNXzE2QklUOgotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBub3QgYW4gb2JqZWN0LCByZXR1cm4gdGhlIFNUVF9BUk1fMTZCSVQgZmxhZy4KLQkgVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkYXRhIHVzZWQgYnkgVGh1bWIgaW5zdHJ1Y3Rpb25zCi0JIGFuZCBub24tZGF0YSAod2hpY2ggaXMgcHJvYmFibHkgY29kZSkgaW5zaWRlIFRodW1iIHJlZ2lvbnMgb2YgYW4KLQkgZXhlY3V0YWJsZS4gICovCi0gICAgICBpZiAodHlwZSAhPSBTVFRfT0JKRUNUKQotCXJldHVybiBFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9hcm1fZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgR09UIGFuZCBQTFQgcmVsb2NzIHlldC4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdCwgKnNyZWxnb3QsICpzcmVsb2M7Ci0gIGJmZF92bWEgKiBsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBzZ290ID0gc3JlbGdvdCA9IHNyZWxvYyA9IE5VTEw7Ci0gIAotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAgICAgIAotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgY2FzZSBSX0FSTV9HT1RPRkY6Ci0JICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLQkgIGNhc2UgUl9BUk1fR09UMzI6Ci0JICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0JICAgIGlmIChzZ290ID09IE5VTEwpCi0JICAgICAgewotCSAgICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICAvKiBHZXQgdGhlIGdvdCByZWxvY2F0aW9uIHNlY3Rpb24gaWYgbmVjZXNzYXJ5LiAgKi8KLQkgICAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICAgIHsKLQkgICAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJCi0JICAgICAgICAvKiBJZiBubyBnb3QgcmVsb2NhdGlvbiBzZWN0aW9uLCBtYWtlIG9uZSBhbmQgaW5pdGlhbGl6ZS4gICovCi0JICAgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgICAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCSAgCQkJCSAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQotCSAgICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotICAgICAJICAgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzaXplX3Qgc2l6ZTsKLQkJICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgICAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCSAgfQotCi0JICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQotCSAgICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotCQkgICAgIG91dHB1dCBhIFJfQVJNX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLQkJICAgICBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICB9Ci0KLQkgICAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JICAgIGJyZWFrOwotCi0gIAkgIGNhc2UgUl9BUk1fUExUMzI6Ci0JICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgICAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICAgICAgICAgICBjcmVhdGluZyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKGggPT0gTlVMTCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBSX0FSTV9BQlMzMjoKLQkgIGNhc2UgUl9BUk1fUkVMMzI6Ci0JICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBpcyBhIHJlbG9jCi0gICAgICAgICAgICAgICBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgb3IgYSBub24gUEMgcmVsYXRpdmUgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIHRoZW4gd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYwotICAgICAgICAgICAgICAgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgICAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5IGEgcmVsb2MgYWdhaW5zdCBhCi0gICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZQotICAgICAgICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLiAgQXQKLSAgICAgICAgICAgICAgIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcwotICAgICAgICAgICAgICAgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQKLSAgICAgICAgICAgICAgIGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLSAgICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0gICAgICAgICAgICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSX0FSTV9QQzI0Ci0JICAgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgICB7Ci0JICAgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0gICAgICAgICAgICAgICAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotCi0JCSAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAoYWJmZCwKLQkJCSAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJIAkgICAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSAgIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQkgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQotCSAgICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgICAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBhbmQgdGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCwgd2UgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFnYWluIGlmIHRoZSBzeW1ib2wgaXMgbGF0ZXIKLSAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBlbGZfaTM4NiBsaW5rZXIKLSAgICAgICAgICAgICAgICAgICBoYXNoIHRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICAgIGFuIGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgICBpZiAoaCAhPSBOVUxMICYmIGluZm8tPnN5bWJvbGljCi0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSX0FSTV9QQzI0KQotCQkgIHsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogZWg7Ci0JCSAgICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBwOwotCi0JCSAgICBlaCA9IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgICBmb3IgKHAgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJICAgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAocCA9PSBOVUxMKQotCQkgICAgICB7Ci0JCSAgICAgICAgcCA9ICgoc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKiBwKSk7Ci0KLQkJICAgICAgICBpZiAocCA9PSBOVUxMKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICAgIGVoLT5wY3JlbF9yZWxvY3NfY29waWVkID0gcDsKLQkJICAgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgICAgfQotCi0JCSAgICArK3AtPmNvdW50OwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0JICAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYW5kIG9mZnNldCwgZm9yIGVycm9yCi0gICByZXBvcnRpbmcuICAgVGhpcyBjb2RlIGlzIGEgZHVwbGljYXRlIG9mIHRoZSBjb2RlIGluIGVsZi5jLCBleGNlcHQKLSAgIHRoYXQgaXQgYWxzbyBhY2NlcHRzIFNUVF9BUk1fVEZVTkMgYXMgYSBzeW1ib2wgdGhhdCBuYW1lcyBhIGZ1bmN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lCi0gIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqICAgICAgICAgIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgIHNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKiogICAgIHN5bWJvbHM7Ci0gICAgIGJmZF92bWEgICAgICAgIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKiAgZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqICBmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKiBsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiAgICAgIGZvdW5kOwotICBjb25zdCBjaGFyICogZmlsZW5hbWU7Ci0gIGFzeW1ib2wgKiAgICBmdW5jOwotICBiZmRfdm1hICAgICAgbG93X2Z1bmM7Ci0gIGFzeW1ib2wgKiogICBwOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc3ltYm9scyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGZ1bmMgPSBOVUxMOwotICBsb3dfZnVuYyA9IDA7Ci0KLSAgZm9yIChwID0gc3ltYm9sczsgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqcTsKLQotICAgICAgcSA9IChlbGZfc3ltYm9sX3R5cGUgKikgKnA7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKCZxLT5zeW1ib2wpICE9IHNlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKHEtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQljYXNlIFNUVF9GSUxFOgotCSAgZmlsZW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgmcS0+c3ltYm9sKTsKLQkgIGJyZWFrOwotCWNhc2UgU1RUX05PVFlQRToKLQljYXNlIFNUVF9GVU5DOgotCWNhc2UgU1RUX0FSTV9URlVOQzoKLQkgIGlmIChxLT5zeW1ib2wuc2VjdGlvbiA9PSBzZWN0aW9uCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgIGZ1bmMgPSAoYXN5bWJvbCAqKSBxOwotCSAgICAgIGxvd19mdW5jID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpmaWxlbmFtZV9wdHIgPSBmaWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBiZmRfYXN5bWJvbF9uYW1lIChmdW5jKTsKLSAgKmxpbmVfcHRyID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUMzIgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0gICAgICAgICAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLSAgICAgICAgICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX0FSTV9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgYmZkICogZHlub2JqOwotICBhc2VjdGlvbiAqIHM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbC5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWwuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbAotICAgICBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLSAgICAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlCi0gICAgIHdpbGwgbm90IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlIChlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMsCi0JCQkJICAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWwucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgVGhlIGVudHJpZXMgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgCi0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgYXNlY3Rpb24gKiogc3BwOwotCi0JICBmb3IgKHNwcCA9ICZzLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25zOwotCSAgICAgICAqc3BwICE9IHMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0KQotCSAgICA7Ci0JICAqc3BwID0gcy0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7Ci0JICAtLXMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbl9jb3VudDsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKLSAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKLSAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlCi0gICBkZWZpbmVkIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUKLSAgIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZQotICAgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bTsKLXsKLSAgYmZkICogZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIGJmZF92bWEgZ290X29mZnNldDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwKLSAgICAgICAgICAgICAgZWxmMzJfYXJtX3BsdF9lbnRyeSwKLQkgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQKLQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICAtIGgtPnBsdC5vZmZzZXQgLSAxMiksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KLQkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgotCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdDsKLSAgYXNlY3Rpb24gKiBzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICogbmFtZTsKLQkgIGFzZWN0aW9uICogczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCW1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZjMyX2FybV9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldICAgICAgPSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gQVJNX0VMRl9BQklfVkVSU0lPTjsKLX0KLQotCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfYXJtCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0FSTQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDgwMDAKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQllbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAJZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQkgICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAllbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltICAgIDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9FTlRSWV9TSVpFCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hdnIuYyBiL2JmZC9lbGYzMi1hdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0YWIyOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjMgKzAsMCBAQAotLyogQVZSLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERlbmlzIENoZXJ0eWtvdiA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2F2ci5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBhdnJfaW5mb190b19ob3d0b19yZWxhCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICplbGYzMl9hdnJfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXZyX2djX3N3ZWVwX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXZyX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGF2cl9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXZyX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGZfYXZyX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2F2cl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotCi0KLS8qIFVzZSBSRUxBIGluc3RlYWQgb2YgUkVMICovCi0jdW5kZWYgVVNFX1JFTAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfYXZyX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9BVlJfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVZSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl8zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNyBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FWUl83X1BDUkVMLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNywJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMywJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfN19QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTMgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BVlJfMTNfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl8xM19QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BVlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBmb3IgY29tbWFuZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfQVZSXzE2X1BNLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl8xNl9QTSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBsb3cgOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAxNiBiaXQgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0xPOF9MREksCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9MTzhfTERJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGlnaCA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDE2IGJpdCBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEk4X0xESSwJCS8qIHR5cGUgKi8KLQkgOCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hJOF9MREkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBoaWdoIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gb2YgMjIgYml0IGFkZHJlc3MuCi0gICAgIEZvciBMREkgY29tbWFuZC4gICovCi0gIEhPV1RPIChSX0FWUl9ISDhfTERJLAkJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hIOF9MREkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBuZWdhdGl2ZSBsb3cgOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAxNiBiaXQgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0xPOF9MRElfTkVHLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9MTzhfTERJX05FRyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhlZ2F0aXZlIGhpZ2ggOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAxNiBiaXQgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hJOF9MRElfTkVHLAkvKiB0eXBlICovCi0JIDgsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9ISThfTERJX05FRyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhlZ2F0aXZlIGhpZ2ggNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAyMiBiaXQgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hIOF9MRElfTkVHLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfSEg4X0xESV9ORUciLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBsb3cgOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAyNCBiaXQgcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0xPOF9MRElfUE0sCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0xPOF9MRElfUE0iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBoaWdoIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24gb2YgMTYgYml0IHByb2dyYW0gbWVtb3J5IGFkZHJlc3MuCi0gICAgIEZvciBMREkgY29tbWFuZC4gICovCi0gIEhPV1RPIChSX0FWUl9ISThfTERJX1BNLAkvKiB0eXBlICovCi0JIDksCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9ISThfTERJX1BNIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGlnaCA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDI0IGJpdCBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEg4X0xESV9QTSwJLyogdHlwZSAqLwotCSAxNywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hIOF9MRElfUE0iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBsb3cgOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiBhIG5lZ2F0aXZlIDI0IGJpdAotICAgICBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzLiAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0xPOF9MRElfUE1fTkVHLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9MTzhfTERJX1BNX05FRyIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhpZ2ggOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiBhIG5lZ2F0aXZlIDE2IGJpdAotICAgICBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzLiAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hJOF9MRElfUE1fTkVHLAkvKiB0eXBlICovCi0JIDksCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9ISThfTERJX1BNX05FRyIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhpZ2ggOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiBhIG5lZ2F0aXZlIDI0IGJpdAotICAgICBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzLiAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hIOF9MRElfUE1fTkVHLAkvKiB0eXBlICovCi0JIDE3LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfSEg4X0xESV9QTV9ORUciLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogUmVsb2NhdGlvbiBmb3IgQ0FMTCBjb21tYW5kIGluIEFUbWVnYS4gICovCi0gIEhPV1RPIChSX0FWUl9DQUxMLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjMsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0NBTEwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gQVZSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBhdnJfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBpbnQgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLSBzdGF0aWMgY29uc3Qgc3RydWN0IGF2cl9yZWxvY19tYXAgYXZyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVZSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIFJfQVZSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl83X1BDUkVMLCAgICAgICAgICBSX0FWUl83X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl8xM19QQ1JFTCwgICAgICAgICBSX0FWUl8xM19QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgUl9BVlJfMTYgfSwKLSAgeyBCRkRfUkVMT0NfQVZSXzE2X1BNLCAgICAgICAgICAgIFJfQVZSXzE2X1BNIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl9MTzhfTERJLCAgICAgICAgICBSX0FWUl9MTzhfTERJfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hJOF9MREksICAgICAgICAgIFJfQVZSX0hJOF9MREkgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hIOF9MREksICAgICAgICAgIFJfQVZSX0hIOF9MREkgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0xPOF9MRElfTkVHLCAgICAgIFJfQVZSX0xPOF9MRElfTkVHIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl9ISThfTERJX05FRywgICAgICBSX0FWUl9ISThfTERJX05FRyB9LAotICB7IEJGRF9SRUxPQ19BVlJfSEg4X0xESV9ORUcsICAgICAgUl9BVlJfSEg4X0xESV9ORUcgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE0sICAgICAgIFJfQVZSX0xPOF9MRElfUE0gfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0sICAgICAgIFJfQVZSX0hJOF9MRElfUE0gfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE0sICAgICAgIFJfQVZSX0hIOF9MRElfUE0gfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE1fTkVHLCAgIFJfQVZSX0xPOF9MRElfUE1fTkVHIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNX05FRywgICBSX0FWUl9ISThfTERJX1BNX05FRyB9LAotICB7IEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTV9ORUcsICAgUl9BVlJfSEg4X0xESV9QTV9ORUcgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0NBTEwsICAgICAgICAgICAgIFJfQVZSX0NBTEwgfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChhdnJfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGF2cl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXZyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfYXZyX2hvd3RvX3RhYmxlW2F2cl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEFWUiBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotYXZyX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfQVZSX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2F2cl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfYXZyX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXZyX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiBXZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3IgYXZyLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXZyX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBlcmZvcm0gYSBzaW5nbGUgcmVsb2NhdGlvbi4gIEJ5IGRlZmF1bHQgd2UgdXNlIHRoZSBzdGFuZGFyZCBCRkQKLSAgIHJvdXRpbmVzLCBidXQgYSBmZXcgcmVsb2NzLCB3ZSBoYXZlIHRvIGRvIHRoZW0gb3Vyc2VsdmVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYXZyX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotCi0gIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9BVlJfN19QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotICAgICAgc3JlbCArPSByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCAtPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCAtPSAyOwkvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JICAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgaWYgKHNyZWwgPiAoKDEgPDwgNykgLSAxKSB8fCAoc3JlbCA8IC0gKDEgPDwgNykpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGZjMDcpIHwgKCgoc3JlbCA+PiAxKSA8PCAzKSAmIDB4M2Y4KTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSXzEzX1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbjsKLSAgICAgIHNyZWwgKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgLT0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgLT0gMjsJLyogQnJhbmNoIGluc3RydWN0aW9ucyBhZGQgMiB0byB0aGUgUEMuLi4gKi8KLSAgICAgIHNyZWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCSAgICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAgICAgLyogQVZSIGFkZHJlc3NlcyBjb21tYW5kcyBhcyB3b3Jkcy4gICovCi0gICAgICBzcmVsID4+PSAxOwotCi0gICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICAqLwotICAgICAgaWYgKHNyZWwgPCAtMjA0OCB8fCBzcmVsID4gMjA0NykKLQl7Ci0JICAvKiBBcHBseSBXUkFQQVJPVU5EIGlmIHBvc3NpYmxlLiAgKi8KLQkgIGlmIChiZmRfZ2V0X21hY2ggKGlucHV0X2JmZCkgPT0gYmZkX21hY2hfYXZyMikKLQkgICAgewotCSAgICAgIGlmIChzcmVsID4gMjA0NykKLQkJc3JlbCAtPSA0MDk2OwotCSAgICAgIGVsc2UKLQkJc3JlbCArPSA0MDk2OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JfQotCi0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwMDApIHwgKHNyZWwgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9MTzhfTERJOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hJOF9MREk6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gOCkgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hIOF9MREk6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gMTYpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9MTzhfTERJX05FRzoKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAtc3JlbDsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9ISThfTERJX05FRzoKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAtc3JlbDsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiA4KSAmIDB4ZmY7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEg4X0xESV9ORUc6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsID0gLXNyZWw7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gMTYpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9MTzhfTERJX1BNOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEk4X0xESV9QTToKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBzcmVsID0gc3JlbCA+PiAxOwotICAgICAgc3JlbCA9IChzcmVsID4+IDgpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9ISDhfTERJX1BNOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gMTYpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9MTzhfTERJX1BNX05FRzoKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAtc3JlbDsKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBzcmVsID0gc3JlbCA+PiAxOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hJOF9MRElfUE1fTkVHOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCA9IC1zcmVsOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gOCkgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hIOF9MRElfUE1fTkVHOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCA9IC1zcmVsOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gMTYpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9DQUxMOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4IHw9ICgoc3JlbCAmIDB4MTAwMDApIHwgKChzcmVsIDw8IDMpICYgMHgxZjAwMDAwKSkgPj4gMTY7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgc3JlbCAmIDB4ZmZmZiwgY29udGVudHMrMik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBBVlIgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2F2cl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgcmVsZW5kICAgICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCArKykKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGhvd3RvICA9IGVsZl9hdnJfaG93dG9fdGFibGUgKyBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGggICAgICA9IE5VTEw7Ci0gICAgICBzeW0gICAgPSBOVUxMOwotICAgICAgc2VjICAgID0gTlVMTDsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCi0JICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCSAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCSAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpIDogbmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICByID0gYXZyX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbik7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgTlVMTDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCShpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sCi0JCShpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG1zZykKLQkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICghIHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQVZSIEVMRiBvYmplY3QKLSAgIGZpbGUuICBUaGlzIGdldHMgdGhlIEFWUiBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUKLSAgIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmX2F2cl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfYXZyMjoKLSAgICAgIHZhbCA9IEVfQVZSX01BQ0hfQVZSMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9hdnIxOgotICAgICAgdmFsID0gRV9BVlJfTUFDSF9BVlIxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX2F2cjM6Ci0gICAgICB2YWwgPSBFX0FWUl9NQUNIX0FWUjM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfYXZyNDoKLSAgICAgIHZhbCA9IEVfQVZSX01BQ0hfQVZSNDsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9BVlI7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gRUZfQVZSX01BQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hdnJfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGVfc2V0ID0gYmZkX21hY2hfYXZyMjsKLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPT0gRU1fQVZSKQotICAgIHsKLSAgICAgIGludCBlX21hY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FWUl9NQUNIOwotICAgICAgc3dpdGNoIChlX21hY2gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFX0FWUl9NQUNIX0FWUjI6Ci0JICBlX3NldCA9IGJmZF9tYWNoX2F2cjI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BVlJfTUFDSF9BVlIxOgotCSAgZV9zZXQgPSBiZmRfbWFjaF9hdnIxOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQVZSX01BQ0hfQVZSMzoKLQkgIGVfc2V0ID0gYmZkX21hY2hfYXZyMzsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FWUl9NQUNIX0FWUjQ6Ci0JICBlX3NldCA9IGJmZF9tYWNoX2F2cjQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYXZyLAotCQkJCSAgICBlX3NldCk7Ci19Ci0KLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYXZyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQVZSCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgIGJmZF9lbGYzMl9hdnJfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItYXZyIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCSAgICAgICAgICAgICBhdnJfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkgICAgICAgICAgICAgTlVMTAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICAgZWxmMzJfYXZyX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgIGVsZjMyX2F2cl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgIGVsZjMyX2F2cl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICBlbGYzMl9hdnJfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAgICAgICAgICAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQliZmRfZWxmX2F2cl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQllbGYzMl9hdnJfb2JqZWN0X3AKLQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDEwdi5jIGIvYmZkL2VsZjMyLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyZTg5Mi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDEwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qIEQxMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLS8qICNpbmNsdWRlICJlbGYvZDEwdi5oIiAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci0KLQotLyogVXNlIFJFTCBpbnN0ZWFkIG9mIFJFTEEgdG8gc2F2ZSBzcGFjZSAqLwotI2RlZmluZSBVU0VfUkVMCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QxMFZfTk9ORSA9IDAsCi0gIFJfRDEwVl8xMF9QQ1JFTF9SLAotICBSX0QxMFZfMTBfUENSRUxfTCwKLSAgUl9EMTBWXzE2LAotICBSX0QxMFZfMTgsCi0gIFJfRDEwVl8xOF9QQ1JFTCwKLSAgUl9EMTBWXzMyLAotICBSX0QxMFZfR05VX1ZUSU5IRVJJVCwKLSAgUl9EMTBWX0dOVV9WVEVOVFJZLAotICBSX0QxMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDEwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMTBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLwotICAvKiByaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xMF9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweGZmLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMiAgKi8KLSAgLyogbGVmdCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9MLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAxNSwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTBfUENSRUxfTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2Y4MDAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweDA3ZjgwMDAsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QxMFZfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDE4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIDIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xOCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxOCBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAyICAqLwotICBIT1dUTyAoUl9EMTBWXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDEwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfRDEwVl9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9EMTBWX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRDEwViBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZDEwdl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLSBzdGF0aWMgY29uc3Qgc3RydWN0IGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QxMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBSX0QxMFZfMTBfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsIFJfRDEwVl8xMF9QQ1JFTF9MIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX0QxMFZfMTYgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xOCwgUl9EMTBWXzE4IH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsIFJfRDEwVl8xOF9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMTBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0QxMFZfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfRDEwVl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQxMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQxMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMTB2X2hvd3RvX3RhYmxlW2QxMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMTBWIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1kMTB2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfRDEwVl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9kMTB2X2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9kMTB2X2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIGQxMHYgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYSBEMTBWIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9EMTBWX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfRDEwVl9HTlVfVlRJTkhFUklUICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGhvd3RvID0gZWxmX2QxMHZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JfQotICAgICAgCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSAwOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9kMTB2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0QxMFYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZDEwdl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZDEwdiIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJICAgICAgICAgICAgIGQxMHZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAgIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgIGVsZjMyX2QxMHZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICBlbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgIGVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgICAgICBlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zICAgICAgICAgIDEKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWQzMHYuYyBiL2JmZC9lbGYzMi1kMzB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmFmYjkuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWQzMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKiBEMzBWLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZDMwdl9yZWxvYyBQQVJBTVMgKCgKLSAgICAgYmZkICphYmZkLAotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgYXN5bWJvbCAqc3ltYm9sLAotICAgICBQVFIgZGF0YSwKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jXzIxIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMzBWX05PTkUgPSAwLAotICBSX0QzMFZfNiwKLSAgUl9EMzBWXzlfUENSRUwsCi0gIFJfRDMwVl85X1BDUkVMX1IsCi0gIFJfRDMwVl8xNSwKLSAgUl9EMzBWXzE1X1BDUkVMLAotICBSX0QzMFZfMTVfUENSRUxfUiwKLSAgUl9EMzBWXzIxLAotICBSX0QzMFZfMjFfUENSRUwsCi0gIFJfRDMwVl8yMV9QQ1JFTF9SLAotICBSX0QzMFZfMzIsCi0gIFJfRDMwVl8zMl9QQ1JFTCwKLSAgUl9EMzBWXzMyX05PUk1BTCwKLSAgUl9EMzBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QzMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDMwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNSwJCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMTVfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzIxLAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjFfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMsIGluIHRoZSBSaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8yMV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIEQzMFYgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAzMiBiaXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyX1BDUkVMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWd1bGFyIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfTk9STUFMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzJfTk9STUFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSNkZWZpbmUgTUFYMzIgKChiZmRfc2lnbmVkX3ZtYSkgMHg3ZmZmZmZmZikKLSNkZWZpbmUgTUlOMzIgKC0gTUFYMzIgLSAxKQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluMSwgaW4yLCBudW07Ci0gIGJmZF92bWEgdG1wX2FkZHIgPSAwOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGludCBtYWtlX2Fic29sdXRlID0gMDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nIC0tIGRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCi0gICAgcmV0dXJuIHI7IAotCi0gIC8qIGEgaGFja2VkLXVwIHZlcnNpb24gb2YgYmZkX3BlcmZvcm1fcmVsb2MoKSBmb2xsb3dzICovCi0gaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICB0bXBfYWRkciA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IAotCSsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgICByZWxvY2F0aW9uIC09IHRtcF9hZGRyOwotICAgIH0KLSAgCi0gIGluMSA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGluMiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOwotCi0gIC8qIGV4dHJhY3QgdGhlIGFkZGVuZCAqLwotICBudW0gPSAoKGluMiAmIDB4M0ZGRkYpCi0JIHwgKChpbjIgJiAweEZGMDAwMDApID4+IDIpCi0JIHwgKChpbjEgJiAweDNGKSA8PCAyNikpOwotICBpbjEgJj0gMHhGRkZGRkZDMDsKLSAgaW4yID0gMHg4MDAwMDAwMDsKLSAgCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSAmJiBob3d0by0+Yml0c2l6ZSA9PSAzMikKLSAgICB7Ci0gICAgICAvKiBUaGUgRDMwViBoYXMgYSBQQyB0aGF0IGRvZXNuJ3Qgd3JhcCBhbmQgUEMtcmVsYXRpdmUganVtcHMgYXJlCi0JIHNpZ25lZCwgc28gYSBQQy1yZWxhdGl2ZSBqdW1wIGNhbid0IGJlIG1vcmUgdGhhbiArLy0gMl4zMSBieXRlcy4KLQkgSWYgb25lIGV4Y2VlZHMgdGhpcywgY2hhbmdlIGl0IHRvIGFuIGFic29sdXRlIGp1bXAuICAqLwotICAgICAgaWYgKHJlbG9jYXRpb24gPiBNQVgzMiB8fCByZWxvY2F0aW9uIDwgTUlOMzIpCi0JewotCSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICsgdG1wX2FkZHIpICYgMHhmZmZmZmZmZjsKLQkgIG1ha2VfYWJzb2x1dGUgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpbjEgfD0gKHJlbG9jYXRpb24gPj4gMjYpICYgMHgzRjsJLyogdG9wIDYgYml0cyAqLwotICBpbjIgfD0gKChyZWxvY2F0aW9uICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKLSAgaW4yIHw9IHJlbG9jYXRpb24gJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgCi0gIC8qIGNoYW5nZSBhIFBDLXJlbGF0aXZlIGluc3RydWN0aW9uIHRvIGl0cyBhYnNvbHV0ZSBlcXVpdmFsZW50ICovCi0gIC8qIHdpdGggdGhpcyBzaW1wbGUgaGFjayAqLwotICBpZiAobWFrZV9hYnNvbHV0ZSkKLSAgICBpbjEgfD0gMHgwMDEwMDAwMDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMiwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyICsgNCk7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2NfMjEgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBudW07Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgaW50IG1hc2ssIG1heDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nIC0tIGRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICAKLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIG1hc2sgPSAgKDEgPDwgaG93dG8tPmJpdHNpemUpIC0gMTsKLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgbWFzayA8PD0gMTI7Ci0gIG1heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSArIDIpKSAtIDE7Ci0KLSAgLyogZXh0cmFjdCB0aGUgYWRkZW5kICovCi0gIG51bSA9IGluMSAmIG1hc2s7ICAvKiAxOCBiaXRzICovCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIG51bSA+Pj0gMTI7Ci0gIG51bSA8PD0gMzsgLyogc2hpZnQgbGVmdCAzICovCi0gIGluMSAmPSB+bWFzazsgIC8qIG1hc2sgb3V0IGFkZGVuZCAqLwotCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotICBpZiAoaG93dG8tPnR5cGUgPT0gUl9EMzBWXzIxX1BDUkVMX1IgfHwgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzE1X1BDUkVMX1IgfHwKLSAgICAgIGhvd3RvLT50eXBlID09IFJfRDMwVl85X1BDUkVMX1IgKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gKz0gNDsKLSAgICB9Ci0KLSAgaWYgKChpbnQpcmVsb2NhdGlvbiA8IDAgKQotICAgIHsKLSAgICAgIGlmICh+KGludClyZWxvY2F0aW9uID4gbWF4KQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChpbnQpcmVsb2NhdGlvbiA+IG1heCkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgcmVsb2NhdGlvbiA+Pj0gMzsgCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIGluMSB8PSAoKHJlbG9jYXRpb24gJiAobWFzayA+PiAxMikpIDw8IDEyKTsKLSAgZWxzZQotICAgIGluMSB8PSByZWxvY2F0aW9uICYgbWFzazsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMzBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMzB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGQzMHZfcmVsb2NfbWFwIGQzMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QzMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl82LCBSX0QzMFZfNiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsIFJfRDMwVl85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLCBSX0QzMFZfOV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTUsIFJfRDMwVl8xNSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLCBSX0QzMFZfMTVfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBSX0QzMFZfMTVfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxLCBSX0QzMFZfMjEgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwgUl9EMzBWXzIxX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwgUl9EMzBWXzIxX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMiwgUl9EMzBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsIFJfRDMwVl8zMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMzBWXzMyX05PUk1BTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQzMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQzMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW2QzMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUwpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDMwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMzBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QzMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQzMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWQzMHZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWZyMzAuYyBiL2JmZC9lbGYzMi1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTBlYzkuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKiBGUjMwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZnIzMC5oIgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZWxmX2kyMF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGZyMzBfaW5mb190b19ob3d0b19yZWxhIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICogZnIzMF9lbGZfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZnIzMF9lbGZfaG93dG9fdGFibGUgW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0ZSMzBfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIwIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8yMCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kyMF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzIwIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBpbnRvIDQ4IGJpdHMgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfNDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBmcjMwX2VsZl9pMzJfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF80OCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF82X0lOXzQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzZfSU5fNCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBbiA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF84X0lOXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzhfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBIDkgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzlfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgMTAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzEwX0lOXzgsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEwX0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAxLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF85X1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA5LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDEyIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzEyX1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF8xMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQwKLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhbiBSX0ZSMzBfMjAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMjBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIAotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uID4gKCgoYmZkX3ZtYSkgMSA8PCAyMCkgLSAxKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9Ci0gICAgc3ltYm9sLT52YWx1ZQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRlIzMCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZnIzMF9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGludCBmcjMwX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnIzMF9yZWxvY19tYXAgZnIzMF9yZWxvY19tYXAgW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCAgICAgICAgICAgUl9GUjMwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfOCwgICAgICAgICAgICAgIFJfRlIzMF84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMjAsICAgICAgICBSX0ZSMzBfMjAgfSwKLSAgeyBCRkRfUkVMT0NfMzIsICAgICAgICAgICAgIFJfRlIzMF8zMiB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzQ4LCAgICAgICAgUl9GUjMwXzQ4IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LCAgICBSX0ZSMzBfNl9JTl80IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LCAgICBSX0ZSMzBfOF9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOV9JTl84LCAgICBSX0ZSMzBfOV9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwgICBSX0ZSMzBfMTBfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsICAgUl9GUjMwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwgIFJfRlIzMF8xMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9GUjMwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfRlIzMF9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZnIzMF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gc2l6ZW9mIChmcjMwX3JlbG9jX21hcCkgLyBzaXplb2YgKGZyMzBfcmVsb2NfbWFwWzBdKTsKLSAgICAgICAtLWk7KQotICAgIGlmIChmcjMwX3JlbG9jX21hcCBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotICAgICAgcmV0dXJuICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW2ZyMzBfcmVsb2NfbWFwW2ldLmZyMzBfcmVsb2NfdmFsXTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEZSMzAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyMzBfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Ci19Ci0MCi0vKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECi0gICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotICAKLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0ZSMzBfMjA6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9GUjMwXzQ4OgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgcmVsZW5kICAgICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCArKykKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0gICAgICAKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfRlIzMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9GUjMwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGhvd3RvICA9IGZyMzBfZWxmX2hvd3RvX3RhYmxlICsgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBoICAgICAgPSBOVUxMOwotICAgICAgc3ltICAgID0gTlVMTDsKLSAgICAgIHNlYyAgICA9IE5VTEw7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQkgIAotCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKSA6IG5hbWU7Ci0jaWYgMAotCSAgZnByaW50ZiAoc3RkZXJyLCAibG9jYWw6IHNlYzogJXMsIHN5bTogJXMgKCVkKSwgdmFsdWU6ICV4ICsgJXggKyAleCBhZGRlbmQgJXhcbiIsCi0JCSAgIHNlYy0+bmFtZSwgbmFtZSwgc3ltLT5zdF9uYW1lLAotCQkgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwKLQkJICAgc3ltLT5zdF92YWx1ZSwgcmVsLT5yX2FkZGVuZCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIAotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHJlbG9jYXRpb24pOwotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICByID0gZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbik7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgTlVMTDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCShpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgdHJ1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG1zZykKLQkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICghIHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWZyMzBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgIHNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2ZyMzAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRlIzMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9mcjMwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCU5VTEwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQlmcjMwX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJZnIzMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGZyMzBfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWdlbi5jIGIvYmZkL2VsZjMyLWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RhNTNiLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF91bmtub3duCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX05PTkUKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaHBwYS5jIGIvYmZkL2VsZjMyLWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkZDRhYi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyOSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIFBBLVJJU0MgRUxGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieQotCi0JQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0JRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0JVW5pdmVyc2l0eSBvZiBVdGFoCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYzMi1ocHBhLmgiCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLSNpbmNsdWRlICJlbGYtaHBwYS5oIgotCi0KLS8qIFdlIHVzZSB0aHJlZSBkaWZmZXJlbnQgaGFzaCB0YWJsZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IKLSAgIGxpbmtpbmcgUEEgRUxGIG9iamVjdHMuCi0KLSAgIFRoZSBmaXJzdCBpcyB0aGUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgd2hpY2ggaXMgZGVyaXZlZAotICAgZnJvbSB0aGUgc3RhbmRhcmQgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UgdXNlIHRoaXMgYXMgYSBwbGFjZSB0bwotICAgYXR0YWNoIG90aGVyIGhhc2ggdGFibGVzIGFuZCBzdGF0aWMgaW5mb3JtYXRpb24uCi0KLSAgIFRoZSBzZWNvbmQgaXMgdGhlIHN0dWIgaGFzaCB0YWJsZSB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0gICBiYXNlIEJGRCBoYXNoIHRhYmxlLiAgVGhlIHN0dWIgaGFzaCB0YWJsZSBob2xkcyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgbGlua2VyIHN0dWJzIGR1cmluZyBhIGxpbmsuICAqLwotCi0vKiBIYXNoIHRhYmxlIGZvciBsaW5rZXIgc3R1YnMuICAqLwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkKLXsKLSAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgd2UgY2FuIGdldCB0aGUgbmFtZSBvZiB0aGUgc3R1YgotICAgICAoYW5kIHRodXMga25vdyBleGFjdGx5IHdoYXQgYWN0aW9ucyBpdCBwZXJmb3JtcykgZnJvbSB0aGUgYmFzZQotICAgICBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzdHViLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0KLSAgLyogR2l2ZW4gdGhlIHN5bWJvbCdzIHZhbHVlIGFuZCBpdHMgc2VjdGlvbiB3ZSBjYW4gZGV0ZXJtaW5lIGl0cyBmaW5hbAotICAgICB2YWx1ZSB3aGVuIGJ1aWxkaW5nIHRoZSBzdHVicyAoc28gdGhlIHN0dWIga25vd3Mgd2hlcmUgdG8ganVtcC4gICovCi0gIHN5bXZhbHVlIHRhcmdldF92YWx1ZTsKLSAgYXNlY3Rpb24gKnRhcmdldF9zZWN0aW9uOwotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBzdHViIEJGRC4gICovCi0gIGJmZCAqc3R1Yl9iZmQ7Ci0KLSAgLyogV2hlcmUgdG8gcGxhY2UgdGhlIG5leHQgc3R1Yi4gICovCi0gIGJmZF9ieXRlICpsb2NhdGlvbjsKLQotICAvKiBDdXJyZW50IG9mZnNldCBpbiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLQotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotCi0gIC8qIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvdXRwdXQgc3ltYm9scy4gICovCi0gIHVuc2lnbmVkIGludCBvdXRwdXRfc3ltYm9sX2NvdW50OwotCi0gIC8qIFN0dWZmIHNvIHdlIGNhbiBoYW5kbGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBsb25nIGdsb2JhbF92YWx1ZTsKLSAgaW50IGdsb2JhbF9zeW1fZGVmaW5lZDsKLX07Ci0KLS8qIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0Ci0KLQlUaGlzIGZpbGUgY29udGFpbnMgRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQgYXMgc3BlY2lmaWVkCi0JaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLQlGZWJydWFyeSAxOTk0LiAgKi8KLQotI2luY2x1ZGUgImVsZjMyLWhwcGEuaCIKLSNpbmNsdWRlICJocHBhX3N0dWJzLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhwcGFfZWxmX3JlbG9jYXRlX2luc24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcsCi0JICAgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYXNlY3Rpb24gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWxmMzJfaHBwYV9zaXplX29mX3N0dWIKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF92bWEsIGNoYXIgKikpOwotCi0vKiBGb3IgbGlua2VyIHN0dWIgaGFzaCB0YWJsZXMuICAqLwotI2RlZmluZSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotI2RlZmluZSBlbGYzMl9ocHBhX3N0dWJfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgXAotICAoYmZkX2hhc2hfdHJhdmVyc2UgXAotICAgKCYodGFibGUpLT5yb290LCBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogRm9yIEhQUEEgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2hwcGFfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdylcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX2VudHJ5ICopCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBQQSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2hwcGFfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0KLS8qIEFzc29ydGVkIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPm9mZnNldCA9IDA7Ci0gICAgICByZXQtPnRhcmdldF92YWx1ZSA9IDA7Ci0gICAgICByZXQtPnRhcmdldF9zZWN0aW9uID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBzdHViX2JmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPm9mZnNldCA9IDA7Ci0gIHRhYmxlLT5sb2NhdGlvbiA9IDA7Ci0gIHRhYmxlLT5zdHViX2JmZCA9IHN0dWJfYmZkOwotICByZXR1cm4gKGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgbmV3ZnVuYykpOwotfQotCi0vKiBDcmVhdGUgdGhlIGRlcml2ZWQgbGlua2VyIGhhc2ggdGFibGUuICBUaGUgUEEgRUxGIHBvcnQgdXNlcyB0aGUgZGVyaXZlZAotICAgaGFzaCB0YWJsZSB0byBrZWVwIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBQQSBFTEYgbGlua2VyICh3aXRob3V0Ci0gICB1c2luZyBzdGF0aWMgdmFyaWFibGVzKS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0LT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICByZXQtPm91dHB1dF9zeW1ib2xfY291bnQgPSAwOwotICByZXQtPmdsb2JhbF92YWx1ZSA9IDA7Ci0gIHJldC0+Z2xvYmFsX3N5bV9kZWZpbmVkID0gMDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBSZWxvY2F0ZSB0aGUgZ2l2ZW4gSU5TTiBnaXZlbiB0aGUgdmFyaW91cyBpbnB1dCBwYXJhbWV0ZXJzLgotCi0gICBGSVhNRTogZW5kaWFubmVzcyBhbmQgc2l6ZW9mIChsb25nKSBpc3N1ZXMgYWJvdW5kIGhlcmUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoYWJmZCwgaW5wdXRfc2VjdCwgaW5zbiwgYWRkcmVzcywgc3ltX3ZhbHVlLAotCQkJcl9hZGRlbmQsIHJfZm9ybWF0LCByX2ZpZWxkLCBwY3JlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdDsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gICAgIGxvbmcgc3ltX3ZhbHVlOwotICAgICBsb25nIHJfYWRkZW5kOwotICAgICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0OwotICAgICB1bnNpZ25lZCBsb25nIHJfZmllbGQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlID0gZ2V0X29wY29kZSAoaW5zbik7Ci0gIGxvbmcgY29uc3RhbnRfdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGNvZGUpCi0gICAgewotICAgIGNhc2UgTERPOgotICAgIGNhc2UgTERCOgotICAgIGNhc2UgTERIOgotICAgIGNhc2UgTERXOgotICAgIGNhc2UgTERXTToKLSAgICBjYXNlIFNUQjoKLSAgICBjYXNlIFNUSDoKLSAgICBjYXNlIFNUVzoKLSAgICBjYXNlIFNUV006Ci0gICAgY2FzZSBDT01JQ0xSOgotICAgIGNhc2UgU1VCSToKLSAgICBjYXNlIEFERElUOgotICAgIGNhc2UgQURESToKLSAgICBjYXNlIExESUw6Ci0gICAgY2FzZSBBRERJTDoKLSAgICAgIGNvbnN0YW50X3ZhbHVlID0gSFBQQV9SX0NPTlNUQU5UIChyX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChwY3JlbCkKLQlzeW1fdmFsdWUgLT0gYWRkcmVzczsKLQotICAgICAgc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUsIHJfZm9ybWF0KTsKLQotICAgIGNhc2UgQkw6Ci0gICAgY2FzZSBCRToKLSAgICBjYXNlIEJMRToKLSAgICAgIC8qIFhYWCByX2FkZGVuZCBpZ25vcmVkID8/Py4gICovCi0gICAgICBjb25zdGFudF92YWx1ZSA9IGFzc2VtYmxlXzE3ICgoaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2LAotCQkJCSAgICAoaW5zbiAmIDB4MDAwMDFmZmMpID4+IDIsCi0JCQkJICAgIGluc24gJiAxKTsKLQotICAgICAgY29uc3RhbnRfdmFsdWUgPSAoY29uc3RhbnRfdmFsdWUgPDwgKEJGRF9BUkNIX1NJWkUtMTcpKQotCQkJCSAgICAgICA+PiAoQkZEX0FSQ0hfU0laRS0xNyk7Ci0gICAgICBpZiAocGNyZWwpCi0JewotCSAgc3ltX3ZhbHVlIC09IChhZGRyZXNzICsgaW5wdXRfc2VjdC0+b3V0cHV0X29mZnNldAotCQkJKyBpbnB1dF9zZWN0LT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgIHN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIC04LCByX2ZpZWxkKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCi0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSA+PiAyLCByX2Zvcm1hdCk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG9wY29kZSA9PSAwKQotCXsKLQkgIGNvbnN0YW50X3ZhbHVlID0gSFBQQV9SX0NPTlNUQU5UIChyX2FkZGVuZCk7Ci0KLQkgIGlmIChwY3JlbCkKLQkgICAgc3ltX3ZhbHVlIC09IGFkZHJlc3M7Ci0KLQkgIHJldHVybiBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUmVsb2NhdGUgYW4gSFBQQSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBlbGZfaHBwYV9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzeW1fc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKQotCQkJICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgaW5keDsKLQotCSAgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc3ltX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCXN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bV9uYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqc3ltX25hbWUgPT0gJ1wwJykKLQkgICAgc3ltX25hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHN5bV9zZWMpOwotCX0KLQotICAgICAgciA9IGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQkgICAgICByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uLAotCQkJCQkgICAgICByZWwtPnJfYWRkZW5kLCBpbmZvLCBzeW1fc2VjLAotCQkJCQkgICAgICBzeW1fbmFtZSwgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIERQIHJlbGF0aXZlIHJlbG9jcyBpZiAkZ2xvYmFsJCBpcwotCSAgICAgICB1bmRlZmluZWQuICBUaGlzIGlzIGEgcGFuaWMgc2l0dWF0aW9uIHNvIHdlIGRvbid0IHRyeQotCSAgICAgICB0byBjb250aW51ZS4gICovCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sICIkZ2xvYmFsJCIsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICB7Ci0JCS8qIFdlIHVzZSB0aGlzIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHBlcmZvcm1lZAotCQkgICBhICJkYW5nZXJvdXMiIHJlbG9jYXRpb24uICBUaGlzIGRvZXNuJ3QgbWVhbiB3ZSBkaWQKLQkJICAgdGhlIHdyb25nIHRoaW5nLCBpdCBqdXN0IG1lYW5zIHRoZXJlIG1heSBiZSBzb21lIGNsZWFudXAKLQkJICAgdGhhdCBuZWVkcyB0byBiZSBkb25lIGhlcmUuCi0KLQkJICAgSW4gcGFydGljdWxhciB3ZSBoYWQgdG8gc3dhcCB0aGUgbGFzdCBjYWxsIGluc24gYW5kIGl0cwotCQkgICBkZWxheSBzbG90LiAgSWYgdGhlIGRlbGF5IHNsb3QgaW5zbiBuZWVkZWQgYSByZWxvY2F0aW9uLAotCQkgICB0aGVuIHdlJ2xsIG5lZWQgdG8gYWRqdXN0IHRoZSBuZXh0IHJlbG9jYXRpb24gZW50cnkncwotCQkgICBvZmZzZXQgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgaW5zbiBtb3ZlZC4KLQotCQkgICBUaGlzIGhhaXIgd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmIHdlIGluc2VydGVkIHN0dWJzCi0JCSAgIGJldHdlZW4gcHJvY2VkdXJlcyBhbmQgdXNlZCBhICJibCIgdG8gZ2V0IHRvIHRoZSBzdHViLiAgKi8KLQkJaWYgKHJlbCAhPSByZWxlbmQpCi0JCSAgewotCQkgICAgRWxmX0ludGVybmFsX1JlbGEgKm5leHRfcmVsID0gcmVsICsgMTsKLQotCQkgICAgaWYgKHJlbC0+cl9vZmZzZXQgKyA0ID09IG5leHRfcmVsLT5yX29mZnNldCkKLQkJICAgICAgbmV4dF9yZWwtPnJfb2Zmc2V0IC09IDQ7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAoaW5mbywgc3ltX25hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY3R1YWxseSBwZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gIFRoaXMgY2FuIGdldAotICAgcmF0aGVyIGhhaXJ5IHdoZW4gbGlua2VyIHN0dWJzIGFyZSBuZWVkZWQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBzeW1fbmFtZSwgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQgPSBob3d0by0+Yml0c2l6ZTsKLSAgdW5zaWduZWQgbG9uZyByX2ZpZWxkID0gZV9mc2VsOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLSAgYm9vbGVhbiByX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciAkZ2xvYmFsJC4gIEZJWE1FIGlzbid0IHRoaXMgZWZmZWN0aXZlbHkKLSAgICAganVzdCBsaWtlIHRoZSBncCBwb2ludGVyIG9uIE1JUFM/ICBDYW4gd2UgdXNlIHRob3NlIHJvdXRpbmVzIGZvciB0aGlzCi0gICAgIHB1cnBvc2U/ICAqLwotICBpZiAoIWVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiJGdsb2JhbCQiLCBmYWxzZSwKLQkJCQkgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXNuJ3QgYSAkZ2xvYmFsJCwgdGhlbiB3ZSdyZSBpbiBkZWVwIHRyb3VibGUuICAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgLyogSWYgJGdsb2JhbCQgaXNuJ3QgYSBkZWZpbmVkIHN5bWJvbCwgdGhlbiB3ZSdyZSBzdGlsbCBpbiBkZWVwCi0JIHRyb3VibGUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfc3ltX2RlZmluZWQgPSAxOwotICAgIH0KLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1BBUklTQ19OT05FOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjMyOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgICAgcl9maWVsZCA9IGVfcnJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIEZvciBhbGwgdGhlIERQIHJlbGF0aXZlIHJlbG9jYXRpb25zLCB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlIHN5bWJvbCdzCi0gICAgICAgc2VjdGlvbi4gIElmIGl0J3MgYSBjb2RlIHNlY3Rpb24sIHRoZW4gImRhdGEgcG9pbnRlciByZWxhdGl2ZSIgbWFrZXMKLSAgICAgICBubyBzZW5zZS4gIEluIHRoYXQgY2FzZSB3ZSBkb24ndCBhZGp1c3QgdGhlICJ2YWx1ZSIsIGFuZCBmb3IgMjEgYml0Ci0gICAgICAgYWRkaWwgaW5zdHJ1Y3Rpb25zLCB3ZSBjaGFuZ2UgdGhlIHNvdXJjZSBhZGRlbmQgcmVnaXN0ZXIgZnJvbSAlZHAgdG8KLSAgICAgICAlcjAuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwyMUw6Ci0gICAgICByX2ZpZWxkID0gZV9scnNlbDsKLSAgICAgIGlmIChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCXsKLQkgIGlmICgoaW5zbiAmIDB4ZmMwMDAwMDApID4+IDI2ID09IDB4YQotCSAgICAgICAmJiAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxID09IDB4MWIpCi0JICAgIGluc24gJj0gfjB4MDNlMDAwMDA7Ci0JfQotICAgICAgZWxzZQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRGOgotICAgICAgcl9maWVsZCA9IGVfZnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIFRoZXNlIGNhc2VzIGFyZSBzZXBhcmF0ZSBhcyB0aGV5IG1heSBpbnZvbHZlIGEgbG90IG1vcmUgd29yawotICAgICAgIHRvIGRlYWwgd2l0aCBsaW5rZXIgc3R1YnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICAgIHsKLQliZmRfdm1hIGxvY2F0aW9uOwotCXVuc2lnbmVkIGludCBsZW47Ci0JY2hhciAqbmV3X25hbWUsICpzdHViX25hbWU7Ci0KLQkvKiBHZXQgdGhlIGZpZWxkIHNlbGVjdG9yIHJpZ2h0LiAgV2UnbGwgbmVlZCBpdCBpbiBhIG1pbnV0ZS4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RgotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMzIpCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwyMUwpCi0JICByX2ZpZWxkID0gZV9scnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMTRSKQotCSAgcl9maWVsZCA9IGVfcnJzZWw7Ci0KLQkvKiBGaW5kIG91dCB3aGVyZSB3ZSBhcmUgYW5kIHdoZXJlIHdlJ3JlIGdvaW5nLiAgKi8KLQlsb2NhdGlvbiA9IChvZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCWxlbiA9IHN0cmxlbiAoc3ltX25hbWUpICsgMTsKLQlpZiAoaXNfbG9jYWwpCi0JICBsZW4gKz0gOTsKLQluZXdfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JaWYgKCFuZXdfbmFtZSkKLQkgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCXN0cmNweSAobmV3X25hbWUsIHN5bV9uYW1lKTsKLQotCS8qIExvY2FsIHN5bWJvbHMgaGF2ZSB1bmlxdWUgSURzLiAgKi8KLQlpZiAoaXNfbG9jYWwpCi0JICBzcHJpbnRmIChuZXdfbmFtZSArIGxlbiAtIDEwLCAiXyUwOHgiLCAoaW50KXN5bV9zZWMpOwotCi0JLyogQW55IGtpbmQgb2YgbGlua2VyIHN0dWIgbmVlZGVkPyAgKi8KLQlpZiAoKChpbnQpKHZhbHVlIC0gbG9jYXRpb24pID4gMHgzZmZmZikKLQkgICAgfHwgKChpbnQpKHZhbHVlIC0gbG9jYXRpb24pIDwgLTB4NDAwMDApKQotCSAgewotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLQkgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICpzdHViX2hhc2g7Ci0JICAgIGFzZWN0aW9uICpzdHViX3NlY3Rpb247Ci0KLQkgICAgLyogQnVpbGQgYSBuYW1lIGZvciB0aGUgc3R1Yi4gICovCi0KLQkgICAgbGVuID0gc3RybGVuIChuZXdfbmFtZSk7Ci0JICAgIGxlbiArPSAyMzsKLQkgICAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkgICAgaWYgKCFzdHViX25hbWUpCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgdmFsdWUsIHN0dWJfbmFtZSk7Ci0JICAgIHN0cmNhdCAoc3R1Yl9uYW1lLCBuZXdfbmFtZSk7Ci0JICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCSAgICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0KLQkgICAgc3R1Yl9oYXNoCi0JICAgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoYXQgbmFtZS4gICovCi0JICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0KLQkgICAgLyogVGhlIHN0dWIgQkZEIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLQkgICAgc3R1Yl9zZWN0aW9uID0gc3R1Yl9oYXNoX3RhYmxlLT5zdHViX2JmZC0+c2VjdGlvbnM7Ci0KLQkgICAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RikKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBsb25nIGRlbGF5X2luc247Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBydG5fcmVnLCBsZG9fdGFyZ2V0X3JlZywgbGRvX3NyY19yZWc7Ci0KLQkJICAgIC8qIFdlJ2xsIG5lZWQgdG8gcGVlayBhdCB0aGUgbmV4dCBpbnNuLiAgKi8KLQkJICAgIGRlbGF5X2luc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhICsgNCk7Ci0JCSAgICBvcGNvZGUgPSBnZXRfb3Bjb2RlIChkZWxheV9pbnNuKTsKLQotCQkgICAgLyogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIHJldHVybiByZWdpc3RlciBmb3IgdGhpcwotCQkgICAgICAgY2FsbC4gICovCi0JCSAgICBydG5fcmVnID0gKGluc24gJiAweDAzZTAwMDAwKSA+PiAyMTsKLQotCQkgICAgbGRvX3NyY19yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCQkgICAgbGRvX3RhcmdldF9yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2OwotCi0JCSAgICAvKiBNdW5nZSB1cCB0aGUgdmFsdWUgYW5kIG90aGVyIHBhcmFtZXRlcnMgZm9yCi0JCSAgICAgICBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuLiAgKi8KLQotCQkgICAgdmFsdWUgPSAoc3R1Yl9oYXNoLT5vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JCSAgICByX2Zvcm1hdCA9IDE3OwotCQkgICAgcl9maWVsZCA9IGVfZnNlbDsKLQkJICAgIHJfcGNyZWwgPSAwOwotCQkgICAgYWRkZW5kID0gMDsKLQotCQkgICAgLyogV2UgbmVlZCB0byBwZWVrIGF0IHRoZSBkZWxheSBpbnNuIGFuZCBkZXRlcm1pbmUgaWYKLQkJICAgICAgIHdlJ2xsIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgaW5zbi4gICovCi0JCSAgICBpZiAoKGluc24gJiAyKQotCQkJfHwgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJfHwgKGRlbGF5X2luc24gPT0gMHgwODAwMDI0MCkpCi0JCSAgICAgIHsKLQkJCS8qIE5vIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgc2xvdCwgYnV0Ci0JCQkgICB3ZSBkbyBuZWVkIHRvIG1ha2Ugc3VyZSB0byBqdW1wIHBhc3QgdGhlIHJldHVybgotCQkJICAgcG9pbnRlciB1cGRhdGUgaW4gdGhlIHN0dWIuICAqLwotCQkJdmFsdWUgKz0gNDsKLQotCQkJLyogSWYgdGhlIGRlbGF5IGluc24gZG9lcyBhIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQsCi0JCQkgICB0aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGl0IHN0YXlzIHZhbGlkLiAgKi8KLQkJCWlmIChvcGNvZGUgPT0gTERPCi0JCQkgICAgJiYgbGRvX3RhcmdldF9yZWcgPT0gcnRuX3JlZykKLQkJCSAgewotCQkJICAgIGRlbGF5X2luc24gJj0gMHhmYzAwZmZmZjsKLQkJCSAgICBkZWxheV9pbnNuIHw9ICgoMzEgPDwgMjEpIHwgKDMxIDw8IDE2KSk7Ci0JCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJICB9Ci0JCQkvKiBVc2UgYSBCTEUgdG8gcmVhY2ggdGhlIHN0dWIuICAqLwotCQkJaW5zbiA9IEJMRV9TUjRfUjA7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogV29uZGVyZnVsLCB3ZSBoYXZlIHRvIHN3YXAgdGhlIGNhbGwgaW5zbiBhbmQgaXRzCi0JCQkgICBkZWxheSBzbG90LiAgKi8KLQkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgZGVsYXlfaW5zbiwgaGl0X2RhdGEpOwotCQkJLyogVXNlIGEgQkxFLG4gdG8gcmVhY2ggdGhlIHN0dWIuICAqLwotCQkJaW5zbiA9IChCTEVfU1I0X1IwIHwgMHgyKTsKLQkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEgKyA0KTsKLQkJCWluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgICAgICBpbnNuLCBvZmZzZXQgKyA0LAotCQkJCQkJICAgICAgIHZhbHVlLCBhZGRlbmQsCi0JCQkJCQkgICAgICAgcl9mb3JtYXQsIHJfZmllbGQsCi0JCQkJCQkgICAgICAgcl9wY3JlbCk7Ci0JCQkvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHdvcmQuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgICBlbHNlCi0JCSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgICAgfQotCSAgfQotCWdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgICAgfQotCi1kb19iYXNpY190eXBlXzE6Ci0gICAgICBpbnNuID0gaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBpbnNuLAotCQkJCSAgICAgb2Zmc2V0LCB2YWx1ZSwgYWRkZW5kLCByX2Zvcm1hdCwKLQkJCQkgICAgIHJfZmllbGQsIHJfcGNyZWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFVuZG8gdGhlIGdlbmVyaWMgRUxGIGNvZGUncyBzdWJ0cmFjdGlvbiBvZiBzZWN0aW9uLT52bWEgZnJvbSB0aGUKLSAgIHZhbHVlIG9mIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICAqdmFscCArPSAoKnNlY3ApLT52bWE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIHBlcmZvcm0gYSBjYWxsIGFzc3VtaW5nIHRoZQotICAgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGZvciBjYWxsZXIgYW5kIGNhbGxlZSBhcmUgaW4gQ0FMTEVSIGFuZCBDQUxMRUUKLSAgIGZvciBhIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTi4gIENvcHkgdGhlIG5hbWUgaW50byBTVFVCX05BTUUuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3R1Yl9uYW1lKQotICAgICBiZmRfdm1hIGxvY2F0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgZGVzdGluYXRpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqc3R1Yl9uYW1lOwotewotICBzdHJjcHkgKHN0dWJfbmFtZSwgIl9fX19fbG9uZ19icmFuY2hfc3R1Yl8iKTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBuZWVkZWQgdG8gY2FsbCBmcm9tIExPQ0FUSU9OIHRvIERFU1RJTkFUSU9OCi0gICAoYSBmdW5jdGlvbiBuYW1lZCBTWU1fTkFNRSksIHdpdGggYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIENBTExFUiBhbmQKLSAgIENBTExFRS4gIFJldHVybiB6ZXJvIGlmIG5vIHN0dWIgaXMgbmVlZGVkIHRvIHBlcmZvcm0gc3VjaCBhIGNhbGwuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAobG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzeW1fbmFtZSkKLSAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotewotICAvKiBEZXRlcm1pbmUgaWYgYSBsb25nIGJyYW5jaCBzdHViIGlzIG5lZWRlZC4gICovCi0gIGlmICghKCgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA+IDB4M2ZmZmYpCi0JfHwgKChpbnQpKGxvY2F0aW9uIC0gZGVzdGluYXRpb24pIDwgLTB4NDAwMDApKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKQotICAgICAgJiYgc3RyY21wICgiJCRkeW5jYWxsIiwgc3ltX25hbWUpKQotICAgIHJldHVybiAxMjsKLSAgZWxzZQotICAgIHJldHVybiAxNjsKLX0KLQotLyogQnVpbGQgb25lIGxpbmtlciBzdHViIGFzIGRlZmluZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZSBlbnRyeSBHRU5fRU5UUlkuCi0gICBJTl9BUkdTIGNvbnRhaW5zIHRoZSBzdHViIEJGRCBhbmQgbGluayBpbmZvIHBvaW50ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIgKGdlbl9lbnRyeSwgaW5fYXJncykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7Ci0gICAgIFBUUiBpbl9hcmdzOwotewotICB2b2lkICoqYXJncyA9ICh2b2lkICoqKWluX2FyZ3M7Ci0gIGJmZCAqc3R1Yl9iZmQgPSAoYmZkICopYXJnc1swXTsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKilhcmdzWzFdOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKmVudHJ5OwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLSAgYmZkX2J5dGUgKmxvYzsKLSAgc3ltdmFsdWUgc3ltX3ZhbHVlOwotICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQotICAvKiBJbml0aWFsaXplIHBvaW50ZXJzIHRvIHRoZSBzdHViIGhhc2ggdGFibGUsIHRoZSBwYXJ0aWN1bGFyIGVudHJ5IHdlCi0gICAgIGFyZSBidWlsZGluZyBhIHN0dWIgZm9yLCBhbmQgd2hlcmUgKGluIG1lbW9yeSkgd2Ugc2hvdWxkIHBsYWNlIHRoZSBzdHViCi0gICAgIGluc3RydWN0aW9ucy4gICovCi0gIGVudHJ5ID0gKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKWdlbl9lbnRyeTsKLSAgc3R1Yl9oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0gIGxvYyA9IHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb247Ci0KLSAgLyogTWFrZSBhIG5vdGUgb2YgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHN0dWJzIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgZW50cnktPm9mZnNldCA9IHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0OwotCi0gIC8qIFRoZSBzeW1ib2wncyBuYW1lIHN0YXJ0cyBhdCBvZmZzZXQgMjIuICAqLwotICBzeW1fbmFtZSA9IGVudHJ5LT5yb290LnN0cmluZyArIDIyOwotCi0gIHN5bV92YWx1ZSA9IChlbnRyeS0+dGFyZ2V0X3ZhbHVlCi0JICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICBpZiAoMSkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgb25lIG9mIHR3byB2YXJpYW50IGxvbmcgYnJhbmNoIHN0dWJzLiAgT25lIGZvciAkJGR5bmNhbGwgYW5kCi0JIG5vcm1hbCBjYWxscywgdGhlIG90aGVyIGZvciBjYWxscyB0byBtaWxsaWNvZGUuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgaW50IG1pbGxpY29kZV9jYWxsID0gMDsKLQotICAgICAgaWYgKCFzdHJuY21wICgiJCQiLCBzeW1fbmFtZSwgMikgJiYgc3RyY21wICgiJCRkeW5jYWxsIiwgc3ltX25hbWUpKQotCW1pbGxpY29kZV9jYWxsID0gMTsKLQotICAgICAgLyogRmlyc3QgdGhlIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQuICBEZXBlbmRpbmcgb24gZXhhY3QgY2FsbGluZwotCSBzZXF1ZW5jZSB0aGlzIGluc3RydWN0aW9uIG1heSBiZSBza2lwcGVkLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBMRE9fTTRfUjMxX1IzMSwgbG9jKTsKLQotICAgICAgLyogVGhlIG5leHQgdHdvIGluc3RydWN0aW9ucyBhcmUgdGhlIGxvbmcgYnJhbmNoIGl0c2VsZi4gIEEgbG9uZyBicmFuY2gKLQkgaXMgZm9ybWVkIHdpdGggImxkaWwiIGxvYWRpbmcgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHRhcmdldCBhZGRyZXNzCi0JIGludG8gYSByZWdpc3RlciwgdGhlbiBicmFuY2hpbmcgd2l0aCAiYmUiIHdoaWNoIGFkZHMgaW4gdGhlIGxvd2VyIGJpdHMuCi0JIExvbmcgYnJhbmNoZXMgdG8gbWlsbGljb2RlIG51bGxpZnkgdGhlIGRlbGF5IHNsb3Qgb2YgdGhlICJiZSIuICAqLwotICAgICAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgTERJTF9SMSwKLQkJCQlocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLCBlX2xyc2VsKSwgMjEpOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyArIDQpOwotICAgICAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgQkVfU1I0X1IxIHwgKG1pbGxpY29kZV9jYWxsID8gMiA6IDApLAotCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfcnJzZWwpID4+IDIsCi0JCQkJMTcpOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyArIDgpOwotCi0gICAgICBpZiAoIW1pbGxpY29kZV9jYWxsKQotCXsKLQkgIC8qIFRoZSBzZXF1ZW5jZSB0byBjYWxsIHRoaXMgc3R1YiBwbGFjZXMgdGhlIHJldHVybiBwb2ludGVyIGludG8gJXIzMSwKLQkgICAgIHRoZSBmaW5hbCB0YXJnZXQgZXhwZWN0cyB0aGUgcmV0dXJuIHBvaW50ZXIgaW4gJXIyLCBzbyBjb3B5IHRoZQotCSAgICAgIHJldHVybiBwb2ludGVyIGludG8gdGhlIHByb3BlciByZWdpc3Rlci4gICovCi0JICBiZmRfcHV0XzMyIChzdHViX2JmZCwgQ09QWV9SMzFfUjIsIGxvYyArIDEyKTsKLQotCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0JICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDE2OwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVwZGF0ZSB0aGUgbG9jYXRpb24gYW5kIG9mZnNldHMuICAqLwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbiArPSAxMjsKLQkgIHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0ICs9IDEyOwotCX0KLQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEV4dGVybmFsIGVudHJ5IHBvaW50cyBmb3Igc2l6aW5nIGFuZCBidWlsZGluZyBsaW5rZXIgc3R1YnMuICAqLwotCi0vKiBCdWlsZCBhbGwgdGhlIHN0dWJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBvdXRwdXQgZmlsZS4gIFRoZQotICAgc3R1YnMgYXJlIGtlcHQgaW4gYSBoYXNoIHRhYmxlIGF0dGFjaGVkIHRvIHRoZSBtYWluIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBocHBhZWxmX2ZpbmlzaCBpbiB0aGUgbGlua2VyLiAgKi8KLQotYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9zdHVicyAoc3R1Yl9iZmQsIGluZm8pCi0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICAvKiBUaGUgc3R1YiBCRkQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3R1Yl9zZWMgPSBzdHViX2JmZC0+c2VjdGlvbnM7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqdGFibGU7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICB2b2lkICphcmdzWzJdOwotCi0gIC8qIFNvIHdlIGNhbiBwYXNzIGJvdGggdGhlIEJGRCBmb3IgdGhlIHN0dWJzIGFuZCB0aGUgbGluayBpbmZvCi0gICAgIHN0cnVjdHVyZSB0byB0aGUgcm91dGluZSB3aGljaCBhY3R1YWxseSBidWlsZHMgc3R1YnMuICAqLwotICBhcmdzWzBdID0gc3R1Yl9iZmQ7Ci0gIGFyZ3NbMV0gPSBpbmZvOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBsaW5rZXIgc3R1YnMuICAqLwotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjKTsKLSAgc3R1Yl9zZWMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX3phbGxvYyAoc3R1Yl9iZmQsIHNpemUpOwotICBpZiAoc3R1Yl9zZWMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICB0YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZShpbmZvKS0+c3R1Yl9oYXNoX3RhYmxlOwotICB0YWJsZS0+bG9jYXRpb24gPSBzdHViX3NlYy0+Y29udGVudHM7Ci0KLSAgLyogQnVpbGQgdGhlIHN0dWJzIGFzIGRpcmVjdGVkIGJ5IHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBlbGYzMl9ocHBhX3N0dWJfaGFzaF90cmF2ZXJzZSAodGFibGUsIGVsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIsIGFyZ3MpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgYW5kIHNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIGZvciBhIGZpbmFsIGxpbmsuCi0KLSAgIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gZXhhbWluZSBhbGwgdGhlIHJlbG9jYXRpb25zIGxvb2tpbmcgZm9yCi0gICBQQy1yZWxhdGl2ZSBjYWxscyB0byBhIHRhcmdldCB0aGF0IGlzIHVucmVhY2hhYmxlIHdpdGggYSAiYmwiCi0gICBpbnN0cnVjdGlvbiBvciBjYWxscyB3aGVyZSB0aGUgY2FsbGVyIGFuZCBjYWxsZWUgZGlzYWdyZWUgb24gdGhlCi0gICBsb2NhdGlvbiBvZiB0aGVpciBhcmd1bWVudHMgb3IgcmV0dXJuIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotZWxmMzJfaHBwYV9zaXplX3N0dWJzIChzdHViX2JmZCwgb3V0cHV0X2JmZCwgbGlua19pbmZvKQotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpzZWN0aW9uLCAqc3R1Yl9zZWMgPSAwOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywgKiphbGxfbG9jYWxfc3ltczsKLSAgdW5zaWduZWQgaW50IGksIGluZGV4LCBiZmRfY291bnQgPSAwOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZSA9IDA7Ci0KLSAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBzdHViX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqKQotCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlKSkpOwotICBpZiAoIXN0dWJfaGFzaF90YWJsZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoIWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9iZmQsCi0JCQkJCWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEF0dGFjaCB0aGUgaGFzaCB0YWJsZXMgdG8gdGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5zdHViX2hhc2hfdGFibGUgPSBzdHViX2hhc2hfdGFibGU7Ci0KLSAgLyogQ291bnQgdGhlIG51bWJlciBvZiBpbnB1dCBCRkRzLiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgIGJmZF9jb3VudCsrOwotCi0gIC8qIE1hZ2ljIGFzIHdlIGtub3cgdGhlIHN0dWIgYmZkIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLSAgc3R1Yl9zZWMgPSBzdHViX2JmZC0+c2VjdGlvbnM7Ci0KLSAgLyogSWYgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgdGhlbiB3ZSBkb24ndAotICAgICBoYXZlIHRvIGV4YW1pbmUgdGhlIHJlbG9jcy4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgZ2xvYmFsCi0gICAgIGZ1bmN0aW9ucyB3ZSBjYW4gc3RhcnQgbG9va2luZyBmb3Igc3R1YnMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkcywgaW5kZXggPSAwOwotICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOwotICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0LCBpbmRleCsrKQotICAgIHsKLSAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlIHN5bWJvbCB0YWJsZSBpbiBhIHNlY29uZC4gICovCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChzeW10YWJfaGRyLT5zaF9pbmZvID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGxvY2FsX3N5bXMgPSBhbGxfbG9jYWxfc3ltc1tpbmRleF07Ci0KLSAgICAgIC8qIFdhbGsgb3ZlciBlYWNoIHNlY3Rpb24gYXR0YWNoZWQgdG8gdGhlIGlucHV0IGJmZC4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKmV4dGVybmFsX3JlbG9jcywgKmVyZWxhZW5kLCAqZXJlbGE7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzLCAqaXJlbGFlbmQsICppcmVsYTsKLQotCSAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBleHRlcm5hbCByZWxvY2F0aW9ucy4gICovCi0JICBleHRlcm5hbF9yZWxvY3MKLQkgICAgPSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQKLQkJCSAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBMaWtld2lzZSBmb3IgdGhlIGludGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGludGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0JICBpbnB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxfaGRyOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3JlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBpbnB1dF9yZWxfaGRyLT5zaF9zaXplLAotCQkJICAgaW5wdXRfYmZkKSAhPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIGVyZWxhID0gZXh0ZXJuYWxfcmVsb2NzOwotCSAgZXJlbGFlbmQgPSBlcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGErKykKLQkgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luIChpbnB1dF9iZmQsIGVyZWxhLCBpcmVsYSk7Ci0KLQkgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NzLCBmcmVlIHRoZW0uICAqLwotCSAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQotCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGFlbmQgPSBpcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyspCi0JICAgIHsKLQkgICAgICBsb25nIHJfdHlwZSwgc2l6ZV9vZl9zdHViOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGFzaDsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKLQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0JICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JICAgICAgc3ltdmFsdWUgc3ltX3ZhbHVlOwotCSAgICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotCSAgICAgIGNoYXIgKm5ld19uYW1lID0gTlVMTDsKLQotCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbGEtPnJfaW5mbyk7Ci0JICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKLQotCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIE9ubHkgbG9vayBmb3Igc3R1YnMgb24gY2FsbCBpbnN0cnVjdGlvbnMgb3IgcGxhYmVsCi0JCSByZWZlcmVuY2VzLiAgKi8KLQkgICAgICBpZiAocl90eXBlICE9IFJfUEFSSVNDX1BDUkVMMTdGCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDMyCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDIxTAotCQkgICYmIHJfdHlwZSAhPSBSX1BBUklTQ19QTEFCRUwxNFIpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm93IGRldGVybWluZSB0aGUgY2FsbCB0YXJnZXQsIGl0cyBuYW1lLCB2YWx1ZSwgc2VjdGlvbgotCQkgYW5kIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0JICAgICAgaGFzaCA9IE5VTEw7Ci0JICAgICAgc3ltID0gTlVMTDsKLQkgICAgICBzeW1fc2VjID0gTlVMTDsKLQkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCXsKLQkJICAvKiBJdCdzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfaW5kZXg7Ci0JCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChpbnB1dF9iZmQpW3N5bS0+c3Rfc2huZHhdOwotCQkgIHN5bV9zZWMgPSBoZHItPmJmZF9zZWN0aW9uOwotCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkJICBzeW1fdmFsdWUgPSAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KLQkJCSAgICAgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKTsKLQkJICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGxvY2FsCi0JCSAgICAgc3ltYm9sIGluIHRoZSBzdHViIG9yIGFyZyBpbmZvIGhhc2ggdGFibGVzLiAgKi8KLQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkgICAgewotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogSXQncyBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCQkgIGxvbmcgaW5kZXg7Ci0KLQkJICBpbmRleCA9IHJfaW5kZXggLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGhhc2ggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmRleF07Ci0JCSAgaWYgKGhhc2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIHsKLQkJICAgICAgc3ltX3NlYyA9IGhhc2gtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgICAgc3ltX25hbWUgPSBoYXNoLT5yb290LnJvb3Quc3RyaW5nOwotCQkgICAgICBzeW1fdmFsdWUgPSBoYXNoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKLQkJCQkgICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTm93IGRldGVybWluZSB3aGVyZSB0aGUgY2FsbCBwb2ludCBpcy4gICovCi0JICAgICAgbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpcmVsYS0+cl9vZmZzZXQpOwotCi0JICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBkZXN0aW5hdGlvbiBmb3IgUENSRUwgZnVuY3Rpb24KLQkJIGNhbGxzIChlZy4gd2UgZG9uJ3QgY2FyZSBmb3IgUExBQkVMUykuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YpCi0JCWxvY2F0aW9uID0gZGVzdGluYXRpb247Ci0KLQkgICAgICAvKiBEZXRlcm1pbmUgd2hhdCAoaWYgYW55KSBsaW5rZXIgc3R1YiBpcyBuZWVkZWQgYW5kIGl0cwotCQkgc2l6ZSAoaW4gYnl0ZXMpLiAgKi8KLQkgICAgICBzaXplX29mX3N0dWIgPSBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAobG9jYXRpb24sCi0JCQkJCQkgICAgICBkZXN0aW5hdGlvbiwKLQkJCQkJCSAgICAgIHN5bV9uYW1lKTsKLQkgICAgICBpZiAoc2l6ZV9vZl9zdHViICE9IDApCi0JCXsKLQkJICBjaGFyICpzdHViX25hbWU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbjsKLQotCQkgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGlzIHN0dWIuICAqLwotCQkgIGxlbiA9IHN0cmxlbiAoc3ltX25hbWUpOwotCQkgIGxlbiArPSAyMzsKLQotCQkgIHN0dWJfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JCSAgaWYgKCFzdHViX25hbWUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEJlY2F1c2Ugc3ltX25hbWUgd2FzIG1hbGxvY2QgYWJvdmUgZm9yIGxvY2FsCi0JCQkgc3ltYm9scy4gICovCi0JCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJCWZyZWUgKG5ld19uYW1lKTsKLQotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAobG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzdHViX25hbWUpOwotCQkgIHN0cmNhdCAoc3R1Yl9uYW1lICsgMjIsIHN5bV9uYW1lKTsKLQotCQkgIC8qIEJlY2F1c2Ugc3ltX25hbWUgd2FzIG1hbGxvY2VkIGFib3ZlIGZvciBsb2NhbCBzeW1ib2xzLiAgKi8KLQkJICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCSAgICBmcmVlIChuZXdfbmFtZSk7Ci0KLQkJICBzdHViX2hhc2gKLQkJICAgID0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsIHN0dWJfbmFtZSwKLQkJCQkJCSAgIGZhbHNlLCBmYWxzZSk7Ci0JCSAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgcHJvcGVyIHN0dWIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBub3RoaW5nCi0JCQkgZWxzZSB0byBkby4gICovCi0JCSAgICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjLAotCQkJCQkgICAgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLAotCQkJCQkJCSAgICAgICBzdHViX3NlYykKLQkJCQkJICAgICArIHNpemVfb2Zfc3R1YikpOwotCi0JCSAgICAgIC8qIEVudGVyIHRoaXMgZW50cnkgaW50byB0aGUgbGlua2VyIHN0dWIgaGFzaCB0YWJsZS4gICovCi0JCSAgICAgIHN0dWJfaGFzaAotCQkJPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwKLQkJCQkJCSAgICAgICBzdHViX25hbWUsIHRydWUsIHRydWUpOwotCQkgICAgICBpZiAoc3R1Yl9oYXNoID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0KLQkJICAgICAgLyogV2UnbGwgbmVlZCB0aGVzZSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgdGhhdCB0aGUKLQkJCSBzdHViIHdpbGwgYnJhbmNoIHRvLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfdmFsdWUgPSBzeW1fdmFsdWU7Ci0JCSAgICAgIHN0dWJfaGFzaC0+dGFyZ2V0X3NlY3Rpb24gPSBzeW1fc2VjOwotCQkgICAgfQotCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCX0KLQkgICAgfQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBpbnRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCX0KLSAgICB9Ci0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgbG9jYWwgc3ltYm9scywgZnJlZSB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICAvKiBSZXR1cm4gZ3JhY2VmdWxseSwgYXZvaWRpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byB0aGUgaGFzaCB0YWJsZXMuICAqLwotICBpZiAoc3R1Yl9oYXNoX3RhYmxlKQotICAgIHsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICAgICAgZnJlZSAoc3R1Yl9oYXNoX3RhYmxlKTsKLSAgICB9Ci0gIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIHRvIHplcm8gc2luY2Ugd2UncmUgbmV2ZXIgZ29pbmcKLSAgICAgdG8gY3JlYXRlIHRoZW0uICAgQXZvaWRzIGxvc2luZyB3aGVuIHdlIHRyeSB0byBnZXQgaXRzIGNvbnRlbnRzCi0gICAgIHRvby4gICovCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsIDApOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE1pc2MgQkZEIHN1cHBvcnQgY29kZS4gICovCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQllbGZfaHBwYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgCWVsZl9ocHBhX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAJZWxmX2hwcGFfaW5mb190b19ob3d0b19yZWwKLQotLyogU3R1ZmYgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJCWVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMKLQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfaHBwYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItaHBwYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2hwcGEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9QQVJJU0MKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWhwcGEuaCBiL2JmZC9lbGYzMi1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzVlMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIEVMRjMyL0hQUEEgc3VwcG9ydAotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQgYXMgc3BlY2lmaWVkCi0gICBpbiB0aGUgU3RyYXR1cyBGVFgvR29sZiBPYmplY3QgRmlsZSBGb3JtYXQgKFNFRC0xNzYyKSBkYXRlZAotICAgRmVicnVhcnkgMTk5NC4KLQotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5OgotCi0gICBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGMzJfSFBQQV9ICi0jZGVmaW5lIF9FTEYzMl9IUFBBX0gKLQotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLQotYm9vbGVhbiBlbGYzMl9ocHBhX3NpemVfc3R1YnMKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4gZWxmMzJfaHBwYV9idWlsZF9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gZWxmX2hwcGFfcmVsb2NfdHlwZSAqKiBfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIGVsZl9ocHBhX3JlbG9jX3R5cGUsIGludCwgaW50LCBpbnQsIGFzeW1ib2wgKikpOwotCi0vKiBEZWZpbmUgZ3JvdXBzIG9mIGJhc2ljIHJlbG9jYXRpb25zLiAgRklYTUU6ICBUaGVzZSBzaG91bGQKLSAgIGJlIHRoZSBvbmx5IGJhc2ljIHJlbG9jYXRpb25zIGNyZWF0ZWQgYnkgR0FTLiAgVGhlIHJlc3QKLSAgIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgQkZEIGJhY2tlbmQuCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9jYXRpb24KLSAgIGFzIGFwcHJvcHJpYXRlLiAgVGhpcyBhbGxvd3MgR0FTIHRvIHNoYXJlIG11Y2ggbW9yZSBjb2RlCi0gICBiZXR3ZWVuIHRoZSB0d28gdGFyZ2V0IG9iamVjdCBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBSX0hQUEFfTk9ORQkJCVJfUEFSSVNDX05PTkUKLSNkZWZpbmUgUl9IUFBBCQkJCVJfUEFSSVNDX0RJUjMyCi0jZGVmaW5lIFJfSFBQQV9HT1RPRkYJCQlSX1BBUklTQ19EUFJFTDIxTAotI2RlZmluZSBSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQVJJU0NfUENSRUwyMUwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9QQVJJU0NfRElSMTdGCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9QQVJJU0NfVU5JTVBMRU1FTlRFRAotCi0jZW5kaWYgLyogX0VMRjMyX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWkzNzAuYyBiL2JmZC9lbGYzMi1pMzcwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTVkODYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWkzNzAuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NDMgKzAsMCBAQAotLyogaTM3MC1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotICAgSGFja2VkIGJ5IExpbmFzIFZlcHN0YXMgZm9yIGkzNzAgbGluYXNAbGluYXMub3JnCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFBvd2VyUEMgRUxGIEFCSS4KLSAgIEJ1dCBpdHMgYmVlbiBoYWNrZWQgb24gZm9yIHRoZSBJQk0gMzYwLzM3MCBhcmNoaXRlY3R1cmVzLgotICAgQmFzaWNhbGx5LCB0aGUgMzFiaXQgcmVsb2NhdGlvbiB3b3JrcywgYW5kIGp1c3QgYWJvdXQgZXZlcnl0aGluZwotICAgZWxzZSBpcyBhIHdpbGQgY2FyZC4gIEluIHBhcnRpY3VsYXIsIGRvbid0IGV4cGVjdCBzaGFyZWQgbGlicyBvcgotICAgZHluYW1pYyBsb2FkaW5nIHRvIHdvcmsgLi4uICBpdHMgbmV2ZXIgYmVlbiB0ZXN0ZWQgLi4uCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pMzcwLmgiCi0KLSNkZWZpbmUgVVNFX1JFTEEJCS8qIHdlIHdhbnQgUkVMQSByZWxvY2F0aW9ucywgbm90IFJFTCAqLwotCi0vKiBpMzcwIHJlbG9jYXRpb25zICovCi0vKiBOb3RlIHRoYXQgdGhlcmUgaXMgcmVhbGx5IGp1c3Qgb25lIHJlbG9jYXRpb24gdGhhdCB3ZSBjdXJyZW50bHkKLSAqIHN1cHBvcnQgKGFuZCBvbmx5IG9uZSB0aGF0IHdlIHNlZW0gdG8gbmVlZCwgYXQgdGhlIG1vbWVudCksIGFuZAotICogdGhhdCBpcyB0aGUgMzEtYml0IGFkZHJlc3MgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB0aGUgMzcwLzM5MAotICogb25seSBzdXBwb3J0cyBhIDMxLWJpdCAoMkdCKSBhZGRyZXNzIHNwYWNlLgotICovCi1lbnVtIGkzNzBfcmVsb2NfdHlwZQotewotICBSX0kzNzBfTk9ORQkJPSAgIDAsCi0gIFJfSTM3MF9BRERSMzEJCT0gICAxLAotICBSX0kzNzBfQUREUjMyCQk9ICAgMiwKLSAgUl9JMzcwX0FERFIxNgkJPSAgIDMsCi0gIFJfSTM3MF9SRUwzMQkJPSAgIDQsCi0gIFJfSTM3MF9SRUwzMgkJPSAgIDUsCi0gIFJfSTM3MF9BRERSMTIJCT0gICA2LAotICBSX0kzNzBfUkVMMTIJCT0gICA3LAotICBSX0kzNzBfQUREUjgJCT0gICA4LAotICBSX0kzNzBfUkVMOAkJPSAgIDksCi0gIFJfSTM3MF9DT1BZCQk9ICAxMCwKLSAgUl9JMzcwX1JFTEFUSVZFCT0gIDExLAotCi0gIFJfSTM3MF9tYXgKLX07Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICppMzcwX2VsZl9ob3d0b190YWJsZVsgKGludClSX0kzNzBfbWF4IF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGkzNzBfZWxmX2hvd3RvX3Jhd1tdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9JMzcwX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMxIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9BRERSMzEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9BRERSMzEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9BRERSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9BRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9BRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9BRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMxLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9JMzcwX1JFTDMxLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9SRUwzMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9JMzcwX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9SRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMTIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9JMzcwX0FERFIxMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9JMzcwX0FERFIxMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTItYml0IFBDIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0kzNzBfUkVMMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9JMzcwX1JFTDEyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDggYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9JMzcwX0FERFI4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9BRERSOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4LWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9JMzcwX1JFTDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfUkVMOCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyBpcyB1c2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgVGhlIHN5bWJvbCBzaG91bGQgZXhpc3QKLSAgICAgYm90aCBpbiB0aGUgb2JqZWN0IGJlaW5nIHJ1biBhbmQgaW4gc29tZSBzaGFyZWQgbGlicmFyeS4gIFRoZQotICAgICBkeW5hbWljIGxpbmtlciBjb3BpZXMgdGhlIGRhdGEgYWRkcmVzc2VkIGJ5IHRoZSBzeW1ib2wgZnJvbSB0aGUKLSAgICAgc2hhcmVkIGxpYnJhcnkgaW50byB0aGUgb2JqZWN0LCBiZWNhdXNlIHRoZSBvYmplY3QgYmVpbmcKLSAgICAgcnVuIGhhcyB0byBoYXZlIHRoZSBkYXRhIGF0IHNvbWUgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9DT1BZLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9JMzcwX0NPUFkiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBXaGVuIHRoZSBvYmplY3QgaXMgcnVuLCB0aGlzCi0gICAgIGxvbmd3b3JkIGlzIHNldCB0byB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHBsdXMgdGhlCi0gICAgIGFkZGVuZC4gICovCi0gIEhPV1RPIChSX0kzNzBfUkVMQVRJVkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9SRUxBVElWRSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0MCi1zdGF0aWMgdm9pZCBpMzcwX2VsZl9ob3d0b19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGkzNzBfZWxmX2luZm9fdG9faG93dG8gUEFSQU1TICgoYmZkICphYmZkLCBhcmVsZW50ICpjYWNoZV9wdHIsCi0JCQkJCSAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QpKTsKLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotCi0MCi0vKiBJbml0aWFsaXplIHRoZSBpMzcwX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotaTM3MF9lbGZfaG93dG9faW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaSwgdHlwZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpMzcwX2VsZl9ob3d0b19yYXcpIC8gc2l6ZW9mIChpMzcwX2VsZl9ob3d0b19yYXdbMF0pOyBpKyspCi0gICAgewotICAgICAgdHlwZSA9IGkzNzBfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IHNpemVvZihpMzcwX2VsZl9ob3d0b190YWJsZSkgLyBzaXplb2YoaTM3MF9lbGZfaG93dG9fdGFibGVbMF0pKTsKLSAgICAgIGkzNzBfZWxmX2hvd3RvX3RhYmxlW3R5cGVdID0gJmkzNzBfZWxmX2hvd3RvX3Jhd1tpXTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWkzNzBfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGVudW0gaTM3MF9yZWxvY190eXBlIGkzNzBfcmVsb2MgPSBSX0kzNzBfTk9ORTsKLQotICBpZiAoIWkzNzBfZWxmX2hvd3RvX3RhYmxlWyBSX0kzNzBfQUREUjMxIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgaTM3MF9lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOglpMzcwX3JlbG9jID0gUl9JMzcwX05PTkU7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJaTM3MF9yZWxvYyA9IFJfSTM3MF9BRERSMzE7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJaTM3MF9yZWxvYyA9IFJfSTM3MF9BRERSMTY7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOglpMzcwX3JlbG9jID0gUl9JMzcwX1JFTDMxOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOglpMzcwX3JlbG9jID0gUl9JMzcwX0FERFIzMTsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTM3MF9EMTI6CWkzNzBfcmVsb2MgPSBSX0kzNzBfQUREUjEyOwlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGkzNzBfZWxmX2hvd3RvX3RhYmxlWyAoaW50KWkzNzBfcmVsb2MgXTsKLX07Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJICBiZmQgKiwKLQkJCQkJCSAgYXNlY3Rpb24gKiwKLQkJCQkJCSAgYmZkX2J5dGUgKiwKLQkJCQkJCSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywKLQkJCQkJCSAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywKLQkJCQkJCSAgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4gaTM3MF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gaTM3MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQkgICBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2Zha2Vfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCSAgICAgICBhc2VjdGlvbiAqKSk7Ci0jaWYgMAotc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90ICppMzcwX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pKTsKLSNlbmRpZgotc3RhdGljIGJvb2xlYW4gaTM3MF9lbGZfY2hlY2tfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9hZGp1c3RfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gaTM3MF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL2xpYi9sZC5zbyIKLQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIGkzNzAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGlmICghaTM3MF9lbGZfaG93dG9fdGFibGVbIFJfSTM3MF9BRERSMzEgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSAqLwotICAgIGkzNzBfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX0kzNzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IGkzNzBfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogaGFjayBhbGVydCAtLSAgdGhlIGZvbGxvd2luZyBzZXZlcmFsIHJvdXRpbmVzIGxvb2sgZ2VuZXJpYyB0byBtZSAuLi4KLSAqIHdoeSBhcmUgd2UgYm90aGVyaW5nIHdpdGggdGhlbSA/Pz8KLSAqLwotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcgKi8KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzOwotICBmbGFnd29yZCBuZXdfZmxhZ3M7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0KLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykJLyogQ29tcGF0aWJsZSBmbGFncyBhcmUgb2sgKi8KLSAgICA7Ci0KLSAgZWxzZQkJCQkJLyogSW5jb21wYXRpYmxlIGZsYWdzICovCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIsCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSGFuZGxlIGFuIGkzNzAgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCk7Ci0gIGlmIChoZHItPnNoX2ZsYWdzICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfT1JERVJFRCkKLSAgICBmbGFncyB8PSBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0vKiBTZXQgdXAgYW55IG90aGVyIHNlY3Rpb24gZmxhZ3MgYW5kIHN1Y2ggdGhhdCBtYXkgYmUgbmVjZXNzYXJ5LiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLQotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIHNoZHIsIGFzZWN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqc2hkcjsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotewotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIHNoZHItPnNoX2ZsYWdzIHw9IFNIRl9FWENMVURFOwotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1NPUlRfRU5UUklFUykgIT0gMCkKLSAgICBzaGRyLT5zaF90eXBlID0gU0hUX09SREVSRUQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNpZiAwCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotaTM3MF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90IGRlZmF1bHRzOwotICAgICAgc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90IHplcm9fc2VjdGlvbjsKLQotICAgICAgZGVmYXVsdHMgPSB6ZXJvX3NlY3Rpb247Ci0gICAgICBkZWZhdWx0cy53aGljaCA9IHdoaWNoOwotICAgICAgZGVmYXVsdHMuaG9sZV93cml0dGVuX3AgPSBmYWxzZTsKLSAgICAgIGRlZmF1bHRzLmFsaWdubWVudCA9IDI7Ci0KLSAgICAgIC8qIEJvdGggb2YgdGhlc2Ugc2VjdGlvbnMgYXJlICh0ZWNobmljYWxseSkgY3JlYXRlZCBieSB0aGUgdXNlcgotCSBwdXR0aW5nIGRhdGEgaW4gdGhlbSwgc28gdGhleSBzaG91bGRuJ3QgYmUgbWFya2VkCi0JIFNFQ19MSU5LRVJfQ1JFQVRFRC4KLQotCSBUaGUgbGlua2VyIGNyZWF0ZXMgdGhlbSBzbyBpdCBoYXMgc29tZXdoZXJlIHRvIGF0dGFjaCB0aGVpcgotCSByZXNwZWN0aXZlIHN5bWJvbHMuIEluIGZhY3QsIGlmIHRoZXkgd2VyZSBlbXB0eSBpdCB3b3VsZAotCSBiZSBPSyB0byBsZWF2ZSB0aGUgc3ltYm9sIHNldCB0byAwIChvciBhbnkgcmFuZG9tIG51bWJlciksIGJlY2F1c2UKLQkgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KLSAgICAgIGRlZmF1bHRzLmZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJfCBTRUNfSU5fTUVNT1JZKTsKLQotICAgICAgc3dpdGNoICh3aGljaCkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiBVbmtub3duIHNwZWNpYWwgbGlua2VyIHR5cGUgJWQiLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKGludCl3aGljaCk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBOgkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEiOwotCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YSI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQV9CQVNFXyI7Ci0JICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKLQkgIGJyZWFrOwotCi0JY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQTI6CS8qIC5zZGF0YTIvLnNic3MyIHNlY3Rpb24gKi8KLQkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzMiI7Ci0JICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREEyX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgZGVmYXVsdHMuZmxhZ3MJIHw9IFNFQ19SRUFET05MWTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbHNlY3QgPSBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCAmZGVmYXVsdHMpOwotICAgIH0KLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0jZW5kaWYKLQwKLS8qIFdlIGhhdmUgdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIGhlcmUgc28gdGhhdCB0aGV5IGdldCBtYXBwZWQKLSAgIHRvIG91dHB1dCBzZWN0aW9ucyAoanVzdCBsaWtlIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGhhcwotICAgdG8gY3JlYXRlIC5keW5ic3MgYW5kIC5yZWxhLmJzcykuICAqLwotLyogWFhYIGhhY2sgYWxlcnQgYm9ndXMgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBhbGwganVuayBhbmQgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgZG9lcyB0aGUgd3JvbmcgdGhpbmcuICBJdHMgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCBkb2VzCi0gKiBqdXN0IGVub3VnaCB0byBhbGxvdyBnbGliYy0yLjEgbGQuc28gdG8gY29tcGlsZSAmIGxpbmsuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgIC8qIHh4eCBiZWF0cyBtZSwgc2VlbSB0byBuZWVkIGEgcmVsYS50ZXh0IC4uLiAqLwotICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS50ZXh0Iik7Ci0gICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJpMzcwX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwKLQkgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEudGV4dCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX0kzNzBfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnNic3MiKTsKLSAgICAgIGVsc2UKLQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDQpCi0gICAgcG93ZXJfb2ZfdHdvID0gNDsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAiaTM3MF9lbGZfYWRqdXN0X2R5bmluZHggY2FsbGVkLCBoLT5keW5pbmR4ID0gJWQsICpjcCA9ICVkXG4iLAotCSAgIGgtPmR5bmluZHgsICpjcCk7Ci0jZW5kaWYKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ICs9ICpjcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiaTM3MF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCwgLnJlbGEuc2RhdGEsIGFuZAotCSAucmVsYS5zZGF0YTIgc2VjdGlvbnMuICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZQotCSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0Ci0JIHRoZSBzaXplIG9mIC5yZWxhLmdvdCwgZXQgYWwsIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0Ci0JIHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlIGJlbG93LiAgKi8KLSAgICAgIHN0YXRpYyBjaGFyICpyZWxhX3NlY3Rpb25zW10gPSB7ICIucmVsYS5nb3QiLCAiLnJlbGEuc2RhdGEiLAotCQkJCSAgICAgICAiLnJlbGEuc2RhdGEyIiwgIi5yZWxhLnNic3MiLAotCQkJCSAgICAgICAoY2hhciAqKTAgfTsKLSAgICAgIGNoYXIgKipwOwotCi0gICAgICBmb3IgKHAgPSByZWxhX3NlY3Rpb25zOyAqcCAhPSAoY2hhciAqKTA7IHArKykKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgKnApOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgcy0+X3Jhd19zaXplID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9uIHNlY3Rpb25zLiAqLwotCSAgICAgIHJlbG9jcyA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgYXNlY3Rpb24gKipzcHA7Ci0KLQkgIGZvciAoc3BwID0gJnMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbnM7Ci0JICAgICAgICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQpCi0JICAgIDsKLQkgICpzcHAgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bmV4dDsKLQkgIC0tcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uX2NvdW50OwotCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGkzNzBfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoCi0gICAgIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQotICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4KLQotICAgICBGSVhNRTogV2UgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBuZXZlciBiZSByZWxvY2F0aW9ucyB0bwotICAgICBsb2NhdGlvbnMgaW4gbGlua2VyLWNyZWF0ZWQgc2VjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZQotICAgICBleHRlcm5hbGx5LXZpc2libGUgbmFtZXMuIEluc3RlYWQsIHdlIHNob3VsZCB3b3JrIG91dCBwcmVjaXNlbHkKLSAgICAgd2hpY2ggc2VjdGlvbnMgcmVsb2NhdGlvbnMgYXJlIHRhcmdldHRlZCBhdC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGZvciAoYyA9IDAsIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotCSAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBjICsgMTsKLQotCSAgYysrOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgaTM3MF9lbGZfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJpMzcwX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAotCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JewotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJpMzcwX2VsZl9jaGVja19yZWxvY3MgbmVlZHMgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKQotCQkgICA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7Ci0jZW5kaWYKLQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGFiZmQsCi0JCSAgICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgbmFtZSArIDUpID09IDApOwotCi0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgLyogRklYTUU6IFdlIHNob3VsZCBoZXJlIGRvIHdoYXQgdGhlIG02OGsgYW5kIGkzODYKLQkgICAgIGJhY2tlbmRzIGRvOiBpZiB0aGUgcmVsb2MgaXMgcGMtcmVsYXRpdmUsIHJlY29yZCBpdAotCSAgICAgaW4gY2FzZSBpdCB0dXJucyBvdXQgdGhhdCB0aGUgcmVsb2MgaXMgdW5uZWNlc3NhcnkKLQkgICAgIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBmb3JjZWQgbG9jYWwgYnkgdmVyc2lvbmluZyBvcgotCSAgICAgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQmR5bmFtaWMuICBGb3J0dW5hdGVseSB0aGlzCi0JICAgICBjYXNlIGlzIG5vdCBmcmVxdWVudC4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgImkzNzBfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7ICBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgICAgICBuYW1lID0gTlVMTDsJICBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkZCBhIGJscmwgaW5zdHJ1Y3Rpb24gYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLTQgc28gdGhhdCBhIGZ1bmN0aW9uIGNhbgotICAgICBlYXNpbHkgZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLS8qIFhYWCB0aGlzIGlzIGNsZWFybHkgdmVyeSB3cm9uZyBmb3IgdGhlIDM3MCBhcmNoICovCi0gIGlmIChzZ290KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDRlODAwMDIxIC8qIGJscmwgKi8sIGNvbnRlbnRzKTsKLQotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgY29udGVudHMrNCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgY29udGVudHMrNCk7Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IG1heGRpbmR4ID0gMDsKLQotICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi0gICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7Ci0KLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9uYW1lID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLQotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHgsIGRpbmR4OwotCi0JICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0KLQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBkaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCSAgaWYgKGRpbmR4ICE9IC0xKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVChpbmR4ID4gMCk7Ci0JICAgICAgQkZEX0FTU0VSVChkaW5keCA+IDApOwotCi0JICAgICAgaWYgKGRpbmR4ID4gbWF4ZGluZHgpCi0JCW1heGRpbmR4ID0gZGluZHg7Ci0KLQkgICAgICBzeW0uc3Rfc2huZHggPSBpbmR4OwotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkJIChQVFIpICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkJIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkJKyBkaW5keCkpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQotCW1heGRpbmR4ICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyCQkgID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGJmZCAqZHlub2JqCQkJCSAgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbAkJICA9IHJlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZAkJICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBhc2VjdGlvbiAqc3JlbG9jCQkJICA9IE5VTEw7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgImkzNzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FsbGVkIGZvciAlcyBzZWN0aW9uICVzLCAlbGQgcmVsb2NhdGlvbnMlc1xuIiwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgIGJmZF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkgICAobG9uZylpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCwKLQkgICAoaW5mby0+cmVsb2NhdGVhYmxlKSA/ICIgKHJlbG9jYXRhYmxlKSIgOiAiIik7Ci0jZW5kaWYKLQotICBpZiAoIWkzNzBfZWxmX2hvd3RvX3RhYmxlWyBSX0kzNzBfQUREUjMxIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgaTM3MF9lbGZfaG93dG9faW5pdCAoKTsKLQotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGkzNzBfcmVsb2NfdHlwZSByX3R5cGUJPSAoZW51bSBpMzcwX3JlbG9jX3R5cGUpRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBiZmRfdm1hIG9mZnNldAkJCT0gcmVsLT5yX29mZnNldDsKLSAgICAgIGJmZF92bWEgYWRkZW5kCQkJPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIJCT0gYmZkX3JlbG9jX290aGVyOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltCQk9IChFbGZfSW50ZXJuYWxfU3ltICopMDsKLSAgICAgIGFzZWN0aW9uICpzZWMJCQk9IChhc2VjdGlvbiAqKTA7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaAk9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKTA7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZQkJPSAoY29uc3QgY2hhciAqKTA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZClyX3R5cGUgPj0gKHVuc2lnbmVkKVJfSTM3MF9tYXgKLQkgIHx8ICFpMzcwX2VsZl9ob3d0b190YWJsZVsoaW50KXJfdHlwZV0pCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBob3d0byA9IGkzNzBfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCSAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAmJiAocl90eXBlID09IFJfSTM3MF9BRERSMzEKLQkJICAgICAgfHwgcl90eXBlID09IFJfSTM3MF9DT1BZCi0JCSAgICAgIHx8IHJfdHlwZSA9PSBSX0kzNzBfQUREUjE2Ci0JCSAgICAgIHx8IHJfdHlwZSA9PSBSX0kzNzBfUkVMQVRJVkUpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZAotCQkgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpID09IFNUVl9ERUZBVUxUKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKShpbmZvLAotCQkJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICByZWwtPnJfb2Zmc2V0LAotCQkJCQkJICAgdHJ1ZSk7Ci0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQgZm9yIHN5bWJvbCAlcyIsCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlLCBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbWF5IG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfSTM3MF9SRUwzMToKLQkgIC8qIElmIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBub3QgdG8gYSBuYW1lZCBzeW1ib2wsIHRoZXkgY2FuIGJlCi0JICAgICBoYW5kbGVkIHJpZ2h0IGhlcmUsIG5vIG5lZWQgdG8gYm90aGVyIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JLyogZmFsbCB0aHJvdWdoICovCi0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IGFsd2F5cyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgaWYgdGhpcyBpcyBhIHNoYXJlZAotICAgICAgICAgICBvYmplY3QuICAqLwotCWNhc2UgKGludClSX0kzNzBfTk9ORToKLQljYXNlIChpbnQpUl9JMzcwX0FERFIzMToKLQljYXNlIChpbnQpUl9JMzcwX0FERFIxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICAiaTM3MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiBuZWVkcyB0byBjcmVhdGUgcmVsb2NhdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0gICAgICAgICAgICAgICAgIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyX3R5cGUgPT0gUl9JMzcwX0FERFIzMSkKLQkJICAgIHsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9JMzcwX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQoaW5keCA+IDApOwotI2lmZGVmIERFQlVHCi0JCQkgIGlmIChpbmR4IDw9IDApCi0JCQkgICAgewotCQkJICAgICAgcHJpbnRmKCJpbmR4PSVkIHNlY3Rpb249JXMgZmxhZ3M9JTA4eCBuYW1lPSVzXG4iLAotCQkJCSAgICAgaW5keCwgb3NlYy0+bmFtZSwgb3NlYy0+ZmxhZ3MsCi0JCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJCSAgICB9Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2tpcAotCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9JMzcwX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9JMzcwX0NPUFk6Ci0JY2FzZSAoaW50KVJfSTM3MF9SRUxBVElWRToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiBSZWxvY2F0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBzeW1ib2wgJXMuIiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgaTM3MF9lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgbmFtZSA9ICVzLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwKLQkgICAgICAgKGludClyX3R5cGUsCi0JICAgICAgIHN5bV9uYW1lLAotCSAgICAgICByX3N5bW5keCwKLQkgICAgICAgKGxvbmcpb2Zmc2V0LAotCSAgICAgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICBpbnB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLAotCQkJCSAgICBvZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJICAgIGFkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICByZXQgPSBmYWxzZTsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0KLQkJKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KShpbmZvLAotCQkJCQkJICAgbmFtZSwKLQkJCQkJCSAgIGhvd3RvLT5uYW1lLAotCQkJCQkJICAgKGJmZF92bWEpIDAsCi0JCQkJCQkgICBpbnB1dF9iZmQsCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgb2Zmc2V0KTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotaTM3MF9lbGZfcG9zdF9wcm9jZXNzX2hlYWRlcnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICBiZmQgKiBhYmZkOwotICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsgIC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9MSU5VWDsKLX0KLQwKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9pMzcwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1pMzcwIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfaTM3MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1MzNzAKLSNpZmRlZiBFTV9JMzcwX09MRAotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxCUVNX0kzNzBfT0xECi0jZW5kaWYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JaTM3MF9lbGZfaW5mb190b19ob3d0bwotCi0KLQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0IDQKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQlpMzcwX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQlpMzcwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQlpMzcwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCWkzNzBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJaTM3MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBkeW5hbWljIGxvYWRlciBzdXBwb3J0IGlzIG1vc3RseSBicm9rZW47IGp1c3QgZW5vdWdoIGhlcmUgdG8gYmUgYWJsZSB0bwotICogbGluayBnbGliYydzIGxkLnNvIHdpdGhvdXQgZXJyb3JzLgotICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCWkzNzBfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwlpMzcwX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJaTM3MF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJaTM3MF9lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJaTM3MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCWkzNzBfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCWkzNzBfZWxmX2NoZWNrX3JlbG9jcwotCi0vKgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCWkzNzBfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJaTM3MF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCWkzNzBfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkJaTM3MF9lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0qLwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCWkzNzBfZWxmX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0KLWludCBpMzcwX25vb3AoKQotewotICByZXR1cm4gMTsKLX0KLQotLyogd2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgYXQgbGVhc3QgYXMgbm8tb3BzIHRvIGxpbmsgZ2xpYmMgbGQuc28gKi8KLQotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIFwKLQkJCWNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgXAotCQkJYXNlY3Rpb24gKiosIGJmZF92bWEgKikpKSAJCWkzNzBfbm9vcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIFwKLQkJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFwKLQkJCUVsZl9JbnRlcm5hbF9TeW0gKikpKQkJCWkzNzBfbm9vcAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCi0gIChpbnQgKCopIFBBUkFNUyAoKGJmZCAqKSkpCQkJCQlpMzcwX25vb3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwIFwKLSAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqKSkpCQkJCWkzNzBfbm9vcAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlZGFhZi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyNyArMCwwIEBACi0vKiBJbnRlbCA4MDM4Ni84MDQ4Ni1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgOTQtOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTAkxCQkvKiAzODYgdXNlcyBSRUwgcmVsb2NhdGlvbnMgaW5zdGVhZCBvZiBSRUxBICovCi0KLSNpbmNsdWRlICJlbGYvaTM4Ni5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaG93dG9fdGFibGVbXT0KLXsKLSAgSE9XVE8oUl8zODZfTk9ORSwJIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X05PTkUiLAkgICAgdHJ1ZSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl8zMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEMzMiwJIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMzIiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfMzg2X0dPVDMyLAkgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BMVDMyLAkgMCwyLDMyLHRydWUsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QTFQzMiIsICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9DT1BZLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0NPUFkiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HTE9CX0RBVCwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dMT0JfREFUIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9KVU1QX1NMT1QsIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0pVTVBfU0xPVCIsdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9SRUxBVElWRSwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1JFTEFUSVZFIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HT1RPRkYsICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVE9GRiIsICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9HT1RQQywgICAgIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UUEMiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLSAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgRU1QVFlfSE9XVE8gKDE0KSwKLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCi0gIEhPV1RPKFJfMzg2XzE2LAkgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEMxNiwJIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl84LAkgMCwwLDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl84IiwJICAgIHRydWUsMHhmZiwweGZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUEM4LAkgMCwwLDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUEM4IiwJICAgIHRydWUsMHhmZiwweGZmLHRydWUpLAotfTsKLQotLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl8zODZfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSXzM4Nl9HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsKLQotI2lmZGVmIERFQlVHX0dFTl9SRUxPQwotI2RlZmluZSBUUkFDRShzdHIpIGZwcmludGYgKHN0ZGVyciwgImkzODYgYmZkIHJlbG9jIGxvb2t1cCAlZCAoJXMpXG4iLCBjb2RlLCBzdHIpCi0jZWxzZQotI2RlZmluZSBUUkFDRShzdHIpCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfTk9ORSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfTk9ORSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19DVE9SIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19QQzMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9QQzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVDMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUExUMzI6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUExUMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BMVDMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfQ09QWToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9DT1BZIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9DT1BZIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQ6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dMT0JfREFUIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9UOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfSlVNUF9TTE9UIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUkVMQVRJVkU6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUkVMQVRJVkUiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1JFTEFUSVZFIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UT0ZGOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVE9GRiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UT0ZGIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UUEMiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVFBDIF07Ci0KLSAgICAgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTYiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzE2XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTZfUENSRUwiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDMTZdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzgiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzhdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzhfUENSRUwiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDOF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIik7Ci0gICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0VOVFJZIik7Ci0gICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgVFJBQ0UgKCJVbmtub3duIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2kzODZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQpCi0gICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLSAgZWxzZSBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLSAgZWxzZSBpZiAodHlwZSA8IFJfMzg2X21heAotCSAgICYmICh0eXBlIDwgRklSU1RfSU5WQUxJRF9SRUxPQyB8fCB0eXBlID4gTEFTVF9JTlZBTElEX1JFTE9DKSkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IGludmFsaWQgcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAoaW50KSB0eXBlKTsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X05PTkVdOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgbmFtZSBpbXBsaWVzIGEgbG9jYWwgbGFiZWwuICBUaGUgVW5peFdhcmUKLSAgIDIuMSBjYyBnZW5lcmF0ZXMgdGVtcG9yYXJ5IHN5bWJvbHMgdGhhdCBzdGFydCB3aXRoIC5YLCBzbyB3ZQotICAgcmVjb2duaXplIHRoZW0gaGVyZS4gIEZJWE1FOiBkbyBvdGhlciBTVlI0IGNvbXBpbGVycyBhbHNvIHVzZSAuWD8uCi0gICBJZiBzbywgd2Ugc2hvdWxkIG1vdmUgdGhlIC5YIHJlY29nbml0aW9uIGludG8KLSAgIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnWCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgaTM4NiBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xpYmMuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxNgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYW4gYWJzb2x1dGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZQotICAgdGhpcy4gIFNlZSB0aGUgU1ZSNCBBQkkgaTM4NiBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4MzUsCS8qIHB1c2hsIGNvbnRlbnRzIG9mIGFkZHJlc3MgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA0LiAgKi8KLSAgMHhmZiwgMHgyNSwJLyogam1wIGluZGlyZWN0ICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiAuZ290ICsgOC4gICovCi0gIDAsIDAsIDAsIDAJLyogcGFkIG91dCB0byAxNiBieXRlcy4gICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYW4gYWJzb2x1dGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIHRoaXMgc3ltYm9sIGluIC5nb3QuICAqLwotICAweDY4LAkJLyogcHVzaGwgaW1tZWRpYXRlICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4ZTksCQkvKiBqbXAgcmVsYXRpdmUgKi8KLSAgMCwgMCwgMCwgMAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIFBJQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweGIzLCA0LCAwLCAwLCAwLAkvKiBwdXNobCA0KCVlYngpICovCi0gIDB4ZmYsIDB4YTMsIDgsIDAsIDAsIDAsCS8qIGptcCAqOCglZWJ4KSAqLwotICAwLCAwLCAwLCAwCQkJLyogcGFkIG91dCB0byAxNiBieXRlcy4gICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYSBQSUMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGljX3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweGEzLAkvKiBqbXAgKm9mZnNldCglZWJ4KSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KLSAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCi0gIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0vKiBUaGUgaTM4NiBsaW5rZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlbG9jcyB0aGF0IGl0Ci0gICBkZWNpZGVzIHRvIGNvcHkgaW4gY2hlY2tfcmVsb2NzIGZvciBlYWNoIHN5bWJvbC4gIFRoaXMgaXMgc28gdGhhdAotICAgaXQgY2FuIGRpc2NhcmQgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIGl0IGRvZXNuJ3QgbmVlZCB0aGVtIHdoZW4KLSAgIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLiAgV2Ugc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgZmllbGQKLSAgIGV4dGVuZGluZyB0aGUgcmVndWxhciBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyB3ZQotICAgaGF2ZSBjb3BpZWQgZm9yIGEgZ2l2ZW4gc3ltYm9sLiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKm5leHQ7Ci0gIC8qIEEgc2VjdGlvbiBpbiBkeW5vYmouICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIGkzODYgRUxGIGxpbmtlciBoYXNoIGVudHJ5LiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpwY3JlbF9yZWxvY3NfY29waWVkOwotfTsKLQotLyogaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBUcmF2ZXJzZSBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9pMzg2X2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSXzM4Nl9HT1QzMjoKLQkgICAgY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAgIGNhc2UgUl8zODZfR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50ICs9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotICAgICAJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3NpZ25lZF92bWEpOwotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7Ci0JCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCi0JCXsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9IDE7Ci0KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkJCSBvdXRwdXQgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCi0JCQkgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSArPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl8zODZfUExUMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAotICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JICAgIHsKLQkgICAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50ICs9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgUl8zODZfMzI6Ci0JY2FzZSBSXzM4Nl9QQzMyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgb3IgYSBub24gUEMgcmVsYXRpdmUgcmVsb2MKLSAgICAgICAgICAgICBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIG5lZWQgdG8gY29weSB0aGUgcmVsb2MKLSAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5IGEgcmVsb2MgYWdhaW5zdCBhCi0gICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUKLSAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcwotICAgICAgICAgICAgIHBvc3NpYmxlIHRoYXQgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0Ci0gICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0gICAgICAgICAgICAgcGNyZWxfcmVsb2NzX2NvcGllZCBmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgIT0gUl8zODZfUEMzMgotCQkgIHx8IChoICE9IE5VTEwKLQkJICAgICAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDQpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBhbmQgdGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFnYWluIGlmIHRoZSBzeW1ib2wgaXMgbGF0ZXIKLSAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICBoYXNoIHRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICBhbiBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkuICAqLwotCSAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAmJiBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzM4Nl9QQzMyKQotCQl7Ci0JCSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqZWg7Ci0JCSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnA7Ci0KLQkJICBlaCA9IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICBmb3IgKHAgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJICAgIGlmIChwLT5zZWN0aW9uID09IHNyZWxvYykKLQkJICAgICAgYnJlYWs7Ci0KLQkJICBpZiAocCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBwID0gKChzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqKQotCQkJICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqcCkpOwotCQkgICAgICBpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgIGVoLT5wY3JlbF9yZWxvY3NfY29waWVkID0gcDsKLQkJICAgICAgcC0+c2VjdGlvbiA9IHNyZWxvYzsKLQkJICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgfQotCi0JCSAgKytwLT5jb3VudDsKLQkJfQotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzM4Nl9HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl8zODZfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGZfaTM4Nl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzM4Nl9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl8zODZfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSXzM4Nl9HT1QzMjoKLSAgICAgIGNhc2UgUl8zODZfR09UT0ZGOgotICAgICAgY2FzZSBSXzM4Nl9HT1RQQzoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIHsKLQkJaC0+Z290LnJlZmNvdW50IC09IDE7Ci0JCWlmIChoLT5nb3QucmVmY291bnQgPT0gMCkKLQkJICB7Ci0JCSAgICBzZ290LT5fcmF3X3NpemUgLT0gNDsKLQkJICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChsb2NhbF9nb3RfcmVmY291bnRzICE9IE5VTEwpCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgewotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSAtPSAxOwotCQlpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gMCkKLQkJICB7Ci0JCSAgICBzZ290LT5fcmF3X3NpemUgLT0gNDsKLQkJICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSBSXzM4Nl9QTFQzMjoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCSAgICAgIGgtPnBsdC5yZWZjb3VudCAtPSAxOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKCEgaW5mby0+c2hhcmVkCi0JICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCSAgfHwgKGluZm8tPnNoYXJlZCAmJiBoLT5wbHQucmVmY291bnQgPD0gMCkpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotCSAgICAgb2JqZWN0LCBvciBpZiBhbGwgcmVmZXJlbmNlcyB3ZXJlIGdhcmJhZ2UgY29sbGVjdGVkLiAgSW4KLQkgICAgIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEgcHJvY2VkdXJlCi0JICAgICBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyIHJlbG9jIGluc3RlYWQuICAqLwotCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCB0aGF0IGRvIG5vdCB1c2UgdGhlCi0gICAgIEdPVCwgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIGNvcHkgcmVsb2MuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fR09UX1JFRikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl8zODZfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2kzODZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCi0JCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCi0JCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAoaW5mbywgcyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBpMzg2IEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzZ290ID0gTlVMTDsKLSAgaWYgKGR5bm9iaiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgfQotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl8zODZfbWF4Ci0JICB8fCAocl90eXBlID49IChpbnQpIEZJUlNUX0lOVkFMSURfUkVMT0MKLQkgICAgICAmJiByX3R5cGUgPD0gKGludCkgTEFTVF9JTlZBTElEX1JFTE9DKSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICB2YWwgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKHJfdHlwZSA9PSBSXzM4Nl9HT1RQQwotCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfUExUMzIKLQkJICAgICAgJiYgc3BsdCAhPSBOVUxMCi0JCSAgICAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfR09UMzIKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl8zODZfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfMzg2X1BDMzIpCi0JCSAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJCSAgLyogRFdBUkYgd2lsbCBlbWl0IFJfMzg2XzMyIHJlbG9jYXRpb25zIGluIGl0cwotCQkJICAgICBzZWN0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBleHRlcm5hbGx5Ci0JCQkgICAgIGluIHNoYXJlZCBsaWJyYXJpZXMuICBXZSBjYW4ndCBkbyBhbnl0aGluZwotCQkJICAgICB3aXRoIHRoZW0gaGVyZS4gICovCi0JCQkgIHx8ICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwKSkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYwotCQkgICAmJiAhaW5mby0+bm9fdW5kZWZpbmVkCi0JCSAgICYmIEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcikgPT0gU1RWX0RFRkFVTFQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsCi0JCSAgICAgICghaW5mby0+c2hhcmVkIHx8IGluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAgICAgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSXzM4Nl9HT1QzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbAotCQkgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLQkJICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0JCSAgICAgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZQotCQkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLSAgICAgICAgICAgICAgICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkJICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVE9GRjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0Ci0JICAgICB0YWJsZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLQkgICAgIGRlZmluZWQgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotCSAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLQkgICAgIGNhbGN1bGF0aW9uLiAgKi8KLQkgIHJlbG9jYXRpb24gLT0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVFBDOgotCSAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0gICAgICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8IHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2XzMyOgotCWNhc2UgUl8zODZfUEMzMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAocl90eXBlICE9IFJfMzg2X1BDMzIKLQkJICB8fCAoaCAhPSBOVUxMCi0JCSAgICAgICYmIGgtPmR5bmluZHggIT0gLTEKLQkJICAgICAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotCQkgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLQkJIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDQpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQl7Ci0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfMzg2X1BDMzIpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9QQzMyKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCAoKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQkgICAgewotCQkgICAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfMzg2X1JFTEFUSVZFKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl8zMik7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvCi0JCSBub3Qgd2FudCB0byBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZQotCQkgbmVlZCB0byBpbmNsdWRlIHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzCi0JCSBhbiBhZGRlbmQgZm9yIHRoZSBkeW5hbWljIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISByZWxvY2F0ZSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgKGJmZF92bWEpIDApOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIGJmZF92bWEgZ290X29mZnNldDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9pMzg2X3BsdF9lbnRyeSwKLQkJICBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQpLAotCQkgICAgICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9pMzg2X3BpY19wbHRfZW50cnksCi0JCSAgUExUX0VOVFJZX1NJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZ290X29mZnNldCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMik7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfaW5kZXggKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgNyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAtIChoLT5wbHQub2Zmc2V0ICsgUExUX0VOVFJZX1NJWkUpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHQub2Zmc2V0Ci0JCSAgICsgNiksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9KVU1QX1NMT1QpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUKLQkgc3ltYm9sIGlzIGRlZmluZWQgbG9jYWxseSBvciB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2UKLQkgb2YgYSB2ZXJzaW9uIGZpbGUsIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JewotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUKChoLT5nb3Qub2Zmc2V0ICYgMSkgPT0gMCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHNyZWwtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWwtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLmdvdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWwucGx0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTFNaOgotCSAgICAgIC8qIE15IHJlYWRpbmcgb2YgdGhlIFNWUjQgQUJJIGluZGljYXRlcyB0aGF0IHRoZQotCQkgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgcmVsb2NzIChEVF9KTVBSRUwpIHNob3VsZCBiZQotCQkgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcmVsb2NzIChEVF9SRUwpLiAgVGhpcyBpcwotCQkgd2hhdCBTb2xhcmlzIGRvZXMuICBIb3dldmVyLCBVbml4V2FyZSBjYW4gbm90IGhhbmRsZQotCQkgdGhhdCBjYXNlLiAgVGhlcmVmb3JlLCB3ZSBvdmVycmlkZSB0aGUgRFRfUkVMU1ogZW50cnkKLQkJIGhlcmUgdG8gbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgSk1QUkVMIHJlbG9jcy4gIFNpbmNlCi0JCSB0aGUgbGlua2VyIHNjcmlwdCBhcnJhbmdlcyBmb3IgLnJlbC5wbHQgdG8gZm9sbG93IGFsbAotCQkgb3RoZXIgcmVsb2NhdGlvbiBzZWN0aW9ucywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQotCQkgYWJvdXQgY2hhbmdpbmcgdGhlIERUX1JFTCBlbnRyeS4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9yYXdfc2l6ZTsKLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIGlmIChzcGx0ICYmIHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2kzODZfcGljX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9pMzg2X3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQsCi0JCQkgIHNwbHQtPmNvbnRlbnRzICsgMik7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4LAotCQkJICBzcGx0LT5jb250ZW50cyArIDgpOwotCSAgICB9Ci0KLQkgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgICAgIHJlYWxseSBzZWVtIGxpa2UgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0JfQotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9pMzg2X3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1pMzg2IgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fMzg2Ci0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0VOVFJZX1NJWkUKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJICAgICAgZWxmX2kzODZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCSAgICAgIGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCSAgICAgIF9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lICAgICBlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCSAgICAgIGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sICAgICBlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCSAgICAgIGVsZl9pMzg2X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAgIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zICAgZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sICAgICBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCSAgICAgIGVsZl9pMzg2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCSAgICAgIGVsZl9pMzg2X2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkgICAgICBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyAgICAgZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pODYwLmMgYi9iZmQvZWxmMzItaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJkMmQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JIGJmZF9lbGYzMl9pODYwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICJlbGYzMi1pODYwIgotI2RlZmluZSBFTEZfQVJDSAkgYmZkX2FyY2hfaTg2MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNXzg2MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIDEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTk2MC5jIGIvYmZkL2VsZjMyLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5ZmMzZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIEludGVsIDg2MCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pOTYwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotI2RlZmluZSBVU0VfUkVMIDEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX2k5NjBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfOTYwX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfTk9ORSIsIHRydWUsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEhPV1RPIChSXzk2MF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfMzIiLCB0cnVlLAotCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfOTYwX0lQMjQsIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwX0lQMjQgIiwgdHJ1ZSwKLQkweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBFTVBUWV9IT1dUTyAoNiksCi0gIEVNUFRZX0hPV1RPICg3KQotfTsKLQotc3RhdGljIGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZQotZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpCi17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBSXzk2MF9OT05FOwotICAgIGNhc2UgQkZEX1JFTE9DX0k5NjBfQ0FMTEo6Ci0gICAgICByZXR1cm4gUl85NjBfT1BUQ0FMTDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuIFJfOTYwXzMyOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuIFJfOTYwX0lQMjQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfaTk2MF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkCQkqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50CQkqY2FjaGVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZW51bSBlbGZfaTk2MF9yZWxvY190eXBlIHR5cGU7Ci0KLSAgdHlwZSA9IChlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUICh0eXBlIDwgUl85NjBfbWF4KTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLX0KLQotLyogRUxGIHJlbG9jcyBhcmUgYWdhaW5zdCBzeW1ib2xzLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCwgYW5kIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcKLSAgIGhhcyBnaXZlbiB1cyBhbnkgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvCi0gICBiZSBhZ2FpbnN0IHRoZSBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvCi0gICBjaGFuZ2UgYW55dGhpbmcgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbAotICAgYWxsIGJlIGRvbmUgYXQgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlCi0gICBpbnRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2k5NjBfcmVsb2NhdGUgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBIQUNLOiBJIHRoaW5rIHRoaXMgZmlyc3QgY29uZGl0aW9uIGlzIG5lY2Vzc2FyeSB3aGVuIHByb2R1Y2luZwotICAgICByZWxvY2F0YWJsZSBvdXRwdXQuICBBZnRlciB0aGUgZW5kIG9mIEhBQ0ssIHRoZSBjb2RlIGlzIGlkZW50aWNhbAotICAgICB0byBiZmRfZWxmX2dlbmVyaWNfcmVsb2MoKS4gIEkgd291bGQgX2d1ZXNzXyB0aGUgZmlyc3QgY2hhbmdlCi0gICAgIGJlbG9uZ3MgdGhlcmUgcmF0aGVyIHRoYW4gaGVyZS4gIG1hcnRpbmRvIDE5OTgtMTAtMjMuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5ob3d0by0+cGNfcmVsYXRpdmUKLSAgICAgICYmICFyZWxvY19lbnRyeS0+aG93dG8tPnBjcmVsX29mZnNldCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kIC09IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICAvKiBUaGlzIGlzIG1vcmUgZHViaW91cy4gKi8KLSAgZWxzZSBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLQkgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kIC09IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBlbmQgb2YgSEFDSyAqLwotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0JICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgICAgICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotCXsKLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gYmZkX3JlbG9jX29rOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfaTk2MF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gZWxmX2hvd3RvX3RhYmxlICsgZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoY29kZSk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2k5NjBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItaTk2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV85NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAJMSAvKiBGSVhNRTogVGhpcyBudW1iZXIgaXMgd3JvbmcsICBJdCBzaG91bGQgYmUgdGhlIHBhZ2Ugc2l6ZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJyLmMgYi9iZmQvZWxmMzItbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI2NTU1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTk2ICswLDAgQEAKLS8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2dlbmVyaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX3NkYTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbTMycl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotYm9vbGVhbiBfYmZkX20zMnJfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotdm9pZCBfYmZkX20zMnJfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLSNpZiAwIC8qIG5vdCB5ZXQgKi8KLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9maW5hbF9zZGFfYmFzZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLSNkZWZpbmUgTk9QX0lOU04JCTB4NzAwMAotI2RlZmluZSBNQUtFX1BBUkFMTEVMKGluc24pCSgoaW5zbikgfCAweDgwMDApCi0KLS8qIFVzZSBSRUwgaW5zdGVhZCBvZiBSRUxBIHRvIHNhdmUgc3BhY2UuCi0gICBUaGlzIG9ubHkgc2F2ZXMgc3BhY2UgaW4gbGlicmFyaWVzIGFuZCBvYmplY3QgZmlsZXMsIGJ1dCBwZXJoYXBzCi0gICByZWxvY3Mgd2lsbCBiZSBwdXQgaW4gUk9NPyAgQWxsIGluIGFsbCB0aG91Z2gsIFJFTCByZWxvY3MgYXJlIGEgcGFpbgotICAgdG8gd29yayB3aXRoLiAgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtMzJyX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NMzJSX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNCBiaXQgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX00zMlJfMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyLgotICAgICBUaGlzIHJlbG9jIGlzIGNvbXBsaWNhdGVkIGJlY2F1c2UgcmVsb2NhdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHBjICYgLTQuCi0gICAgIGkuZS4gYnJhbmNoZXMgaW4gdGhlIHJpZ2h0IGluc24gc2xvdCB1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGxlZnQgaW5zbgotICAgICBzbG90IGZvciBwYy4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzEwX1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xMF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTggYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX00zMlJfMThfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzE4X1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyNiBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLSAgLyogPz8/IEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhpcyBzaG91bGQgaGF2ZSBwYXJ0aWFsX2lucGxhY2Ugc2V0IG9yIG5vdC4KLSAgICAgQnJhbmNoIHJlbGF4aW5nIGluIHRoZSBhc3NlbWJsZXIgY2FuIHN0b3JlIHRoZSBhZGRlbmQgaW4gdGhlIGluc24sCi0gICAgIGFuZCBpZiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGdldHMgY2FsbGVkIHRoZSBhZGRlbmQgbWF5IGdldCBhZGRlZAotICAgICBhZ2Fpbi4gICovCi0gIEhPV1RPIChSX00zMlJfMjZfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzI2X1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBhZGRyZXNzIHdoZW4gbG93ZXIgMTYgaXMgb3InZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9VTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1VMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9ISTE2X1NMTywJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSX0hJMTZfU0xPIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvd2VyIDE2IGJpdHMgb2YgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX00zMlJfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNtYWxsIGRhdGEgYXJlYSAxNiBiaXRzIG9mZnNldC4gICovCi0gIEhPV1RPIChSX00zMlJfU0RBMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfc2RhMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9TREExNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gIC8qIEZJWE1FOiBjb3JyZWN0PyAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfTTMyUl9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfTTMyUl9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfTTMyUl9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0MCi0vKiBIYW5kbGUgdGhlIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeS0+aG93dG8sCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgZGF0YSwgcmVsb2NfZW50cnktPmFkZHJlc3MsCi0JCQkJICAgICBzeW1ib2wtPnNlY3Rpb24sCi0JCQkJICAgICAoc3ltYm9sLT52YWx1ZQotCQkJCSAgICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQkJCSAgICAgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci19Ci0KLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhbiBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoYWJmZCwgaG93dG8sIGlucHV0X3NlY3Rpb24sIGRhdGEsIG9mZnNldCwKLQkJCSAgICBzeW1ib2xfc2VjdGlvbiwgc3ltYm9sX3ZhbHVlLCBhZGRlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGFzZWN0aW9uICpzeW1ib2xfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIHN5bWJvbF92YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgeDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSBzeW1ib2xfdmFsdWUgKyBhZGRlbmQ7Ci0gIC8qIE1ha2UgaXQgcGMgcmVsYXRpdmUuICAqLwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAvKiBUaGVzZSBqdW1wcyBtYXNrIG9mZiB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzcwotICAgICBiZWZvcmUgZG9pbmcgcGNyZWwgY2FsY3VsYXRpb25zLiAgKi8KLSAgcmVsb2NhdGlvbiAtPSAob2Zmc2V0ICYgLTRMKTsKLQotICBpZiAocmVsb2NhdGlvbiA8IC0weDIwMCB8fCByZWxvY2F0aW9uID4gMHgxZmYpCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX29rOwotCi0gIHggPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGRhdGEgKyBvZmZzZXQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jcy4KLSAgIEhJMTZfU0xPIGlzIGZvciB0aGUgYWRkMyBhbmQgbG9hZC9zdG9yZSB3aXRoIGRpc3BsYWNlbWVudCBpbnN0cnVjdGlvbnMuCi0gICBISTE2X1VMTyBpcyBmb3IgdGhlIG9yMyBpbnN0cnVjdGlvbi4KLSAgIEZvciBSX00zMlJfSEkxNl9TTE8sIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIHdoZW4gYWRkZWQgdG8KLSAgIHRoZSBoaWdoIDE2IGJ5dGVzIHNvIGlmIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBuZWdhdGl2ZSAoYml0IDE1ID09IDEpIHRoZW4KLSAgIHdlIG11c3QgYWRkIG9uZSB0byB0aGUgaGlnaCAxNiBieXRlcyAod2hpY2ggd2lsbCBnZXQgc3VidHJhY3RlZCBvZmYgd2hlbgotICAgdGhlIGxvdyAxNiBiaXRzIGFyZSBhZGRlZCkuCi0gICBUaGVzZSByZWxvY3MgaGF2ZSB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gUl9NMzJSX0xPMTYgcmVsb2MKLSAgIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBMTzE2IHRvIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUKLSAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkOyB3ZSBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuCi0gICBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGVsZjMyLW1pcHMuYy4gIFdlIGFsc28gc3VwcG9ydCBhbiBhcmJpdHJhcnkKLSAgIG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNiByZWxvYy4gIFRoZQotICAgYXNzZW1ibGVyIHNvcnRzIHRoZSByZWxvY3MgdG8gZW5zdXJlIGVhY2ggSEkxNiBpbW1lZGlhdGVseSBwcmVjZWRlcyBpdHMKLSAgIExPMTYuICBIb3dldmVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMsIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBmaW5kCi0gICB0aGUgcmVhbCBMTzE2IHNvIGl0IHBpY2tzIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMuICAqLwotCi1zdHJ1Y3QgbTMycl9oaTE2Ci17Ci0gIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0gIGJmZF9ieXRlICphZGRyOwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGkxNiAqbTMycl9oaTE2X2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtMzJyX2hpMTYgKm47Ci0KLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLgotICAgICBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2IGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG0zMnJfaGkxNiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtMzJyX2hpMTZfbGlzdDsKLSAgbTMycl9oaTE2X2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEhhbmRsZSBhbiBNMzJSIEVMRiBISTE2IHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgdHlwZSwgcmVsaGksIHJlbGxvLCBjb250ZW50cywgYWRkZW5kKQotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxoaTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGxvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgYWRkbG87Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGlmICh0eXBlID09IFJfTTMyUl9ISTE2X1NMTykKLSAgICBhZGRsbyA9ICgoYWRkbG8gJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKLSAgZWxzZQotICAgIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICAvKiBSZWFjY291bnQgZm9yIHNpZ24gZXh0ZW5zaW9uIG9mIGxvdyBwYXJ0LiAgKi8KLSAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPCi0gICAgICAmJiAoYWRkZW5kICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCArPSAweDEwMDAwOwotCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAoaW5zbiAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKSwKLQkgICAgICBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci19Ci0KLS8qIERvIGFuIFJfTTMyUl9MTzE2IHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdAotICAgaW5wbGFjZSByZWxvY2F0aW9uOyB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBpbiBvcmRlciB0byBkbyB0aGUKLSAgIFJfTTMyUl9ISTE2X1tTVV1MTyByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfbG8xNl9yZWxvYyAoaW5wdXRfYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLSAgICAgSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG0zMnJfaGkxNl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG0zMnJfaGkxNiAqbDsKLQotICAgICAgbCA9IG0zMnJfaGkxNl9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbTMycl9oaTE2ICpuZXh0OwotCi0JICAvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0IG5lZWQKLQkgICAgIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIExPMTYgaXRzZWxmLCBleGNlcHQgd2hlcmUgdG8KLQkgICAgIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBSZWFjY291bnQgZm9yIHNpZ24gZXh0ZW5zaW9uIG9mIGxvdyBwYXJ0LiAgKi8KLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbTMycl9oaTE2X2xpc3QgPSBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIExPMTYgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4KLSAgICAgPz8/IEl0IHdvdWxkIGJlIG5pY2UgdG8gY2FsbCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgaGVyZSwKLSAgICAgYnV0IHdlIGhhdmUgcGFydGlhbF9pbnBsYWNlID09IFRSVUUuICBiZmRfZWxmX2dlbmVyaWNfcmVsb2Mgd2lsbAotICAgICBwYXNzIHRoZSBoYW5kbGluZyBiYWNrIHRvIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2hpY2ggd2lsbCBpbnN0YWxsCi0gICAgIGEgc2VjdGlvbiByZWxhdGl2ZSBhZGRlbmQgd2hpY2ggaXMgd3JvbmcuICAqLwotICByZXR1cm4gbTMycl9lbGZfZ2VuZXJpY19yZWxvYyAoaW5wdXRfYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBnZW5lcmljIHBhcnRpYWxfaW5wbGFjZSByZWxvY2F0aW9uLiAgCi0gICBUaGlzIGlzIGEgbG9jYWwgcmVwbGFjZW1lbnQgZm9yIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9nZW5lcmljX3JlbG9jIChpbnB1dF9iZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfYnl0ZSAqaW5wbGFjZV9hZGRyZXNzOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLSAgICAgSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSB0aGUgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4KLSAgICAgPz8/IEl0IHdvdWxkIGJlIG5pY2UgdG8gY2FsbCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgaGVyZSwKLSAgICAgYnV0IHdlIGhhdmUgcGFydGlhbF9pbnBsYWNlID09IFRSVUUuICBiZmRfZWxmX2dlbmVyaWNfcmVsb2Mgd2lsbAotICAgICBwYXNzIHRoZSBoYW5kbGluZyBiYWNrIHRvIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2hpY2ggd2lsbCBpbnN0YWxsCi0gICAgIGEgc2VjdGlvbiByZWxhdGl2ZSBhZGRlbmQgd2hpY2ggaXMgd3JvbmcuICAqLwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICAvKiBPbmx5IGRvIHRoaXMgZm9yIGEgZmluYWwgbGluay4gICovCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLQotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIGlucGxhY2VfYWRkcmVzcyA9IGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotI2RlZmluZSBET0lUKHgpIAkJCQkJXAotICB4ID0gKCAoeCAmIH5yZWxvY19lbnRyeS0+aG93dG8tPmRzdF9tYXNrKSB8IAkJXAotICAoKCh4ICYgcmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJglcCi0gIHJlbG9jX2VudHJ5LT5ob3d0by0+ZHN0X21hc2spKQotCi0gIHN3aXRjaCAocmVsb2NfZW50cnktPmhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0Jc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaW5wbGFjZV9hZGRyZXNzKTsKLQlET0lUICh4KTsKLSAgICAgIAliZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGlucGxhY2VfYWRkcmVzcyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBpbnBsYWNlX2FkZHJlc3MpOwotCURPSVQgKHgpOwotICAgICAgCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgaW5wbGFjZV9hZGRyZXNzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfQVNTRVJUICgwKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCi0gICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKLSAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCi0gICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAotICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgotICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBtMzJyX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG0zMnJfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG0zMnJfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJm0zMnJfZWxmX2hvd3RvX3RhYmxlW20zMnJfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNMzJSIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTTMyUl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJm0zMnJfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0MCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbTMycl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX00zMlJfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBNMzJSIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZSBvdGhlcgotICAgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQgdG9nZXRoZXIsIGFuZCB0aGVuCi0gICByZWZlcmVuY2VkIHZpYSBvbmUgcmVnaXN0ZXIsIHdoaWNoIHlpZWxkcyBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBJdCBpcwotICAgdXAgdG8gdGhlIGNvbXBpbGVyIHRvIGVtaXQgYW4gaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgcmVnaXN0ZXIgd2l0aAotICAgX1NEQV9CQVNFLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtMzJyX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBNMzJSIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLwotCi12b2lkCi1fYmZkX20zMnJfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICplbGZzeW07Ci0KLSAgZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotCi0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NMzJSX1NDT01NT046Ci0gICAgICBpZiAobTMycl9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm0zMnJfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIG11c3QgaGFuZGxlIHRoZSBzcGVjaWFsIE0zMlIgc2VjdGlvbiBudW1iZXJzIGhlcmUuCi0gICBXZSBhbHNvIGtlZXAgd2F0Y2hpbmcgZm9yIHdoZXRoZXIgd2UgbmVlZCB0byBjcmVhdGUgdGhlIHNkYXRhIHNwZWNpYWwKLSAgIGxpbmtlciBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0JIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCi0JIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCi0JIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCi0JIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKLQl9Ci0KLSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSBhYmZkLAotCQkJCQkJICJfU0RBX0JBU0VfIiwKLQkJCQkJCSBCU0ZfR0xPQkFMLAotCQkJCQkJIHMsCi0JCQkJCQkgMzI3NjgsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSBmYWxzZSwKLQkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwc2I7Ci17Ci0gIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIC8qIEFzc3VtZSBzdWNjZXNzLiAgKi8KLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICAvKiBXZSBjYW4ndCBtb2RpZnkgcl9hZGRlbmQgaGVyZSBhcyBlbGZfbGlua19pbnB1dF9iZmQgaGFzIGFuIGFzc2VydCB0bwotCSBlbnN1cmUgaXQncyB6ZXJvICh3ZSB1c2UgUkVMIHJlbG9jcywgbm90IFJFTEEpLiAgVGhlcmVmb3JlIHRoaXMKLQkgc2hvdWxkIGJlIGFzc2lnbmluZyB6ZXJvIHRvIGBhZGRlbmQnLCBidXQgZm9yIGNsYXJpdHkgd2UgdXNlCi0JIGByX2FkZGVuZCcuICAqLwotICAgICAgYmZkX3ZtYSBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3ZtYSBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGggPSBOVUxMOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9NMzJSX21heCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAoaW50KSByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX00zMlJfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9NMzJSX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IG0zMnJfZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzZWMgPSBOVUxMOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICAvKiBFeHRlcm5hbCBzeW1ib2wuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAvKiBTVFRfU0VDVElPTjogc3ltYm9sIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24uICAqLwotCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCSAgICB7Ci0JICAgICAgLyogU3ltYm9sIGlzbid0IGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24uICBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICBhZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogVGhpcyBjYW4ndCBiZSBkb25lIGZvciBVU0VfUkVMIGJlY2F1c2UgaXQgZG9lc24ndCBtZWFuIGFueXRoaW5nCi0JICAgICBhbmQgZWxmX2xpbmtfaW5wdXRfYmZkIGFzc2VydHMgdGhpcyBzdGF5cyB6ZXJvLiAgKi8KLQkgIHJlbC0+cl9hZGRlbmQgPSBhZGRlbmQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUkVMCi0JICAvKiBBZGRlbmRzIGFyZSBzdG9yZWQgd2l0aCByZWxvY3MuICBXZSdyZSBkb25lLiAgKi8KLQkgIGNvbnRpbnVlOwotI2Vsc2UgLyogVVNFX1JFTCAqLwotCSAgLyogSWYgcGFydGlhbF9pbnBsYWNlLCB3ZSBuZWVkIHRvIHN0b3JlIGFueSBhZGRpdGlvbmFsIGFkZGVuZAotCSAgICAgYmFjayBpbiB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlKQotCSAgICBjb250aW51ZTsKLQkgIC8qID8/PyBIZXJlIGlzIGEgbmljZSBwbGFjZSB0byBjYWxsIGEgc3BlY2lhbF9mdW5jdGlvbgotCSAgICAgbGlrZSBoYW5kbGVyLiAgKi8KLQkgIGlmIChyX3R5cGUgIT0gUl9NMzJSX0hJMTZfU0xPICYmIHJfdHlwZSAhPSBSX00zMlJfSEkxNl9VTE8pCi0JICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQlhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpsb3JlbDsKLQotCSAgICAgIC8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgTE8xNiByZWxvYy4gIFRoaXMgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcwotCQkgaXRzZWxmLiAgKi8KLQkgICAgICBmb3IgKGxvcmVsID0gcmVsICsgMTsKLQkJICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCXx8IEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfVUxPKSk7Ci0JCSAgIGxvcmVsKyspCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChsb3JlbCA8IHJlbGVuZAotCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCXsKLQkJICBtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJfdHlwZSwgcmVsLCBsb3JlbCwKLQkJCQkJICBjb250ZW50cywgYWRkZW5kKTsKLQkJICByID0gYmZkX3JlbG9jX29rOwotCQl9Ci0JICAgICAgZWxzZQotCQlyID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJICAgIGFkZGVuZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgICB9Ci0jZW5kaWYgLyogVVNFX1JFTCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLQkgIHN5bSA9IE5VTEw7Ci0JICBzZWMgPSBOVUxMOwotCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogTG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgICAgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW0tPnN0X3ZhbHVlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgICBzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHJlbG9jYXRpb24gPSAwOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgIGlucHV0X3NlY3Rpb24sIG9mZnNldCwgdHJ1ZSkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLQkgIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICAgICAgZ290byBjaGVja19yZWxvYzsKLQkgICAgfQotCi0JICBzd2l0Y2ggKChpbnQpIHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIChpbnQpIFJfTTMyUl8xMF9QQ1JFTCA6Ci0JICAgICAgciA9IG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChpbnB1dF9iZmQsIGhvd3RvLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cywgb2Zmc2V0LAotCQkJCQkgICAgICBzZWMsIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9TTE8gOgotCSAgICBjYXNlIChpbnQpIFJfTTMyUl9ISTE2X1VMTyA6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkJLyogV2UgYWxsb3cgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyBiZWZvcmUgdGhlCi0JCSAgIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJICAgaXRzZWxmLiAgKi8KLQkJZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1NMTwotCQkJICB8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICAgIGxvcmVsKyspCi0JCSAgY29udGludWU7Ci0JCWlmIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfTE8xNikKLQkJICB7Ci0JCSAgICBtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJfdHlwZSwgcmVsLCBsb3JlbCwKLQkJCQkJICAgIGNvbnRlbnRzLCByZWxvY2F0aW9uICsgYWRkZW5kKTsKLQkJICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCSAgfQotCQllbHNlCi0JCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCWNvbnRlbnRzLCBvZmZzZXQsCi0JCQkJCQlyZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIChpbnQpIFJfTTMyUl9TREExNiA6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCUJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkJbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0JCWlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAobmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHNkYV9iYXNlOwotCQkgICAgYmZkICpvdXRfYmZkID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkJICAgIHIgPSBtMzJyX2VsZl9maW5hbF9zZGFfYmFzZSAob3V0X2JmZCwgaW5mbywKLQkJCQkJCSAmZXJybXNnLAotCQkJCQkJICZzZGFfYmFzZSk7Ci0JCSAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JCSAgICAgIHsKLQkJCXJldCA9IGZhbHNlOwotCQkJZ290byBjaGVja19yZWxvYzsKLQkJICAgICAgfQotCi0JCSAgICAvKiBBdCB0aGlzIHBvaW50IGByZWxvY2F0aW9uJyBjb250YWlucyB0aGUgb2JqZWN0J3MKLQkJICAgICAgIGFkZHJlc3MuICAqLwotCQkgICAgcmVsb2NhdGlvbiAtPSBzZGFfYmFzZTsKLQkJICAgIC8qIE5vdyBpdCBjb250YWlucyB0aGUgb2Zmc2V0IGZyb20gX1NEQV9CQVNFXy4gICovCi0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGFuICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIHNlY3Rpb24gKCVzKSIpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCQkgICBzeW1fbmFtZSwKLQkJCQkJICAgbTMycl9lbGZfaG93dG9fdGFibGVbKGludCkgcl90eXBlXS5uYW1lLAotCQkJCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0JCSAgICAvKmJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOyA/Pz8gd2h5PyAqLwotCQkgICAgcmV0ID0gZmFsc2U7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGRlZmF1bHQgOgotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgb2Zmc2V0LAotCQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgIGNoZWNrX3JlbG9jOgotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGdlbmVyaWMgZW5vdWdoIHRvIGdvIGluIGEgdXRpbGl0eS4gICovCi0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgaWYgKGVycm1zZyAhPSBOVUxMKQotCSAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgZXJybXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLSNpZiAwIC8qIHJlbGF4aW5nIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG0zMnIuCi0gICBSZWxheGluZyBvbiB0aGUgbTMyciBpcyB0cmlja3kgYmVjYXVzZSBvZiBpbnN0cnVjdGlvbiBhbGlnbm1lbnQKLSAgIHJlcXVpcmVtZW50cyAoNCBieXRlIGluc3RydWN0aW9ucyBtdXN0IGJlIGFsaWduZWQgb24gNCBieXRlIGJvdW5kYXJpZXMpLgotCi0gICBUaGUgZm9sbG93aW5nIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMgYXJlIGhhbmRsZWQ6Ci0KLSAgIHNldGgvYWRkMy9qbCAtPiBibDI0IG9yIGJsOAotICAgc2V0aC9hZGQzIC0+IGxkMjQKLQotICAgSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgYmwyNCAtPiBibDggYnV0IGdpdmVuOgotCi0gICAtIDQgYnl0ZSBpbnNucyBtdXN0IGJlIG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0gICAtIGJyYW5jaCBpbnN0cnVjdGlvbnMgb25seSBicmFuY2ggdG8gaW5zbnMgb24gNCBieXRlIGJvdW5kYXJpZXMKLQotICAgdGhpcyBpc24ndCBtdWNoIG9mIGEgd2luIGJlY2F1c2UgdGhlIGluc24gaW4gdGhlIDIgImRlbGV0ZWQiIGJ5dGVzCi0gICBtdXN0IGJlY29tZSBhIG5vcC4gIFdpdGggc29tZSBjb21wbGV4aXR5IHNvbWUgcmVhbCByZWxheGF0aW9uIGNvdWxkIGJlCi0gICBkb25lIGJ1dCB0aGUgZnJlcXVlbmN5IGp1c3Qgd291bGRuJ3QgbWFrZSBpdCB3b3J0aCBpdDsgaXQncyBiZXR0ZXIgdG8KLSAgIHRyeSB0byBkbyBhbGwgdGhlIGNvZGUgY29tcGFjdGlvbiBvbmUgY2FuIGVsc2V3aGVyZS4KLSAgIFdoZW4gdGhlIGNoaXAgc3VwcG9ydHMgcGFyYWxsZWwgMTYgYml0IGluc25zLCB0aGluZ3MgbWF5IGNoYW5nZS4KLSovCi0KLXN0YXRpYyBib29sZWFuIAotbTMycl9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgLyogVGhlIFJlbGEgc3RydWN0dXJlcyBhcmUgdXNlZCBoZXJlIGJlY2F1c2UgdGhhdCdzIHdoYXQKLSAgICAgX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzIHVzZXMgW2ZvciBjb252ZW5pZW5jZSAtIGl0IHNldHMgdGhlIGFkZGVuZAotICAgICBmaWVsZCB0byAwXS4gICovCi0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgLyogQXNzdW1lIG5vdGhpbmcgY2hhbmdlcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgcmVsb2NhdGVhYmxlIGxpbmssIGlmCi0gICAgIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHJlbG9jcywgb3IgaWYgdGhpcyBpcyBub3QgYQotICAgICBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLSAgICAgIHx8IDAgLyogRklYTUU6IGNoZWNrIFNIRl9NMzJSX0NBTl9SRUxBWCAqLykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9NMzJSX0hJMTZfU0xPKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0KLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIHN5bV9zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICAvKiBUcnkgdG8gY2hhbmdlIGEgc2V0aC9hZGQzL2psIHN1YnJvdXRpbmUgY2FsbCB0byBibDI0IG9yIGJsOC4KLQkgVGhpcyBzZXF1ZW5jZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIHdoZW4gY29tcGlsaW5nIGluCi0JIDMyIGJpdCBtb2RlLiAgQWxzbyBsb29rIGZvciBzZXRoL2FkZDMgLT4gbGQyNC4gICovCi0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NMzJSX0hJMTZfU0xPKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOwotCSAgYmZkX3ZtYSBwYyA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgaXJlbC0+cl9vZmZzZXQpOwotCSAgYmZkX3NpZ25lZF92bWEgcGNyZWxfdmFsdWUgPSBzeW12YWwgLSBwYzsKLQkgIHVuc2lnbmVkIGludCBjb2RlLHJlZzsKLQkgIGludCBhZGRlbmQsbm9wX3AsYmw4X3AsdG9fZGVsZXRlOwotCi0JICAvKiBUaGUgdGVzdHMgYXJlIG9yZGVyZWQgc28gdGhhdCB3ZSBnZXQgb3V0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUKLQkgICAgIGlmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHdlIGNhbiByZWxheCwgdGFraW5nIGludG8gYWNjb3VudCB0aGF0Ci0JICAgICB3ZSBhcmUgbG9va2luZyBmb3IgdHdvIHNlcGFyYXRlIHBvc3NpYmlsaXRpZXMgKGpsL2xkMjQpLiAgKi8KLQotCSAgLyogRG8gbm90aGluZyBpZiBubyByb29tIGluIHRoZSBzZWN0aW9uIGZvciB0aGlzIHRvIGJlIHdoYXQgd2UncmUKLQkgICAgIGxvb2tpbmcgZm9yLiAgKi8KLQkgIGlmIChpcmVsLT5yX29mZnNldCA+IHNlYy0+X2Nvb2tlZF9zaXplIC0gOCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKLQkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgdGhlIGFkZDMncyByZWxvYy4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyA0ICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9MTzE2KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHNldGgvYWRkMy4gICovCi0JICAvKiBGSVhNRTogVGhpcyBpcyB3aGVyZSBtYWNyb3MgZnJvbSBjZ2VuIGNhbiBjb21lIGluLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMCk7Ci0JICBpZiAoKGNvZGUgJiAweGYwZmYpICE9IDB4ZDBjMCkKLQkgICAgY29udGludWU7IC8qIG5vdCBzZXRoIHJOLGZvbyAqLwotCSAgcmVnID0gKGNvZGUgJiAweDBmMDApID4+IDg7Ci0JICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCSAgaWYgKGNvZGUgIT0gKDB4ODBhMCB8IHJlZyB8IChyZWcgPDwgOCkpKQotCSAgICBjb250aW51ZTsgLyogbm90IGFkZDMgck4sck4sZm9vICovCi0KLQkgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgY29uZmlybWVkIHdlIGhhdmUgc2V0aC9hZGQzLiAgTm93IGNoZWNrCi0JICAgICB3aGV0aGVyIHRoZSBuZXh0IGluc24gaXMgYSBqbCwgaW4gd2hpY2ggY2FzZSB0cnkgdG8gY2hhbmdlIHRoaXMKLQkgICAgIHRvIGJsMjQgb3IgYmw4LiAgKi8KLQotCSAgLyogRW5zdXJlIHRoZSBicmFuY2ggdGFyZ2V0IGlzIGluIHJhbmdlLgotCSAgICAgVGhlIGJsMjQgaW5zdHJ1Y3Rpb24gaGFzIGEgMjQgYml0IG9wZXJhbmQgd2hpY2ggaXMgdGhlIHRhcmdldAotCSAgICAgYWRkcmVzcyByaWdodCBzaGlmdGVkIGJ5IDIsIGdpdmluZyBhIHNpZ25lZCByYW5nZSBvZiAyNiBiaXRzLgotCSAgICAgTm90ZSB0aGF0IDQgYnl0ZXMgYXJlIGFkZGVkIHRvIHRoZSBoaWdoIHZhbHVlIGJlY2F1c2UgdGhlIHRhcmdldAotCSAgICAgd2lsbCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGNsb3NlciBpZiB3ZSBjYW4gcmVsYXguICBJdCdsbCBhY3R1YWxseQotCSAgICAgYmUgNCBvciA4IGJ5dGVzIGNsb3NlciwgYnV0IHdlIGRvbid0IGtub3cgd2hpY2gganVzdCB5ZXQgYW5kCi0JICAgICB0aGUgZGlmZmVyZW5jZSBpc24ndCBzaWduaWZpY2FudCBlbm91Z2ggdG8gd29ycnkgYWJvdXQuICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkgIHBjcmVsX3ZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotI2Vsc2UKLQkgIGFkZGVuZCA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMik7Ci0JICBwY3JlbF92YWx1ZSArPSBhZGRlbmQ7Ci0jZW5kaWYKLQotCSAgaWYgKHBjcmVsX3ZhbHVlID49IC0oMSA8PCAyNSkgJiYgcGNyZWxfdmFsdWUgPCAoMSA8PCAyNSkgKyA0Ci0JICAgICAgLyogRG8gbm90aGluZyBpZiBubyByb29tIGluIHRoZSBzZWN0aW9uIGZvciB0aGlzIHRvIGJlIHdoYXQgd2UncmUKLQkJIGxvb2tpbmcgZm9yLiAgKi8KLQkgICAgICAmJiAoaXJlbC0+cl9vZmZzZXQgPD0gc2VjLT5fY29va2VkX3NpemUgLSAxMikKLQkgICAgICAvKiBFbnN1cmUgdGhlIG5leHQgaW5zbiBpcyAiamwgck4iLiAgKi8KLQkgICAgICAmJiAoKGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgOCkpLAotCQkgIGNvZGUgIT0gKDB4MWVjMCB8IHJlZykpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHJlbGF4IHRvIGJsMjQvYmw4LiAgKi8KLQotCSAgICAgIC8qIFNlZSBpZiB0aGVyZSdzIGEgbm9wIGZvbGxvd2luZyB0aGUgamwuCi0JCSBBbHNvIHNlZSBpZiB3ZSBjYW4gdXNlIGEgYmw4IGluc24uICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMTApOwotCSAgICAgIG5vcF9wID0gKGNvZGUgJiAweDdmZmYpID09IE5PUF9JTlNOOwotCSAgICAgIGJsOF9wID0gcGNyZWxfdmFsdWUgPj0gLTB4MjAwICYmIHBjcmVsX3ZhbHVlIDwgMHgyMDA7Ci0KLQkgICAgICBpZiAoYmw4X3ApCi0JCXsKLQkJICAvKiBDaGFuZ2UgInNldGggck4sZm9vIiB0byAiYmw4IGZvbyB8fCBub3AiLgotCQkgICAgIFdlIE9SIGluIENPREUganVzdCBpbiBjYXNlIGl0J3Mgbm90IGEgbm9wICh0ZWNobmljYWxseSwKLQkJICAgICBDT0RFIGN1cnJlbnRseSBtdXN0IGJlIGEgbm9wLCBidXQgZm9yIGNsZWFubmVzcyB3ZQotCQkgICAgIGFsbG93IGl0IHRvIGJlIGFueXRoaW5nKS4gICovCi0jaWZuZGVmIFVTRV9SRUwgLyogcHV0IGluIGZvciBsZWFybmluZyBwdXJwb3NlcyAqLwotCQkgIGNvZGUgPSAweDdlMDAwMDAwIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7Ci0jZWxzZQotCQkgIGNvZGUgPSAoMHg3ZTAwMDAwMCArICgoKGFkZGVuZCA+PiAyKSAmIDB4ZmYpIDw8IDE2KSkgfCBNQUtFX1BBUkFMTEVMIChjb2RlKTsKLSNlbmRpZgotCQkgIHRvX2RlbGV0ZSA9IDg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDaGFuZ2UgdGhlIHNldGggck4sZm9vIHRvIGEgYmwyNCBmb28uICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkJICBjb2RlID0gMHhmZTAwMDAwMDsKLSNlbHNlCi0JCSAgY29kZSA9IDB4ZmUwMDAwMDAgKyAoKGFkZGVuZCA+PiAyKSAmIDB4ZmZmZmZmKTsKLSNlbmRpZgotCQkgIHRvX2RlbGV0ZSA9IG5vcF9wID8gOCA6IDQ7Ci0JCX0KLQotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCi0JICAgICAgLyogU2V0IHRoZSBuZXcgcmVsb2MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkJICAgYmw4X3AgPyBSX00zMlJfMTBfUENSRUwgOiBSX00zMlJfMjZfUENSRUwpOwotCi0JICAgICAgLyogRGVsZXRlIHRoZSBhZGQzIHJlbG9jIGJ5IG1ha2luZyBpdCBhIG51bGwgcmVsb2MuICAqLwotCSAgICAgIG5yZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTTMyUl9OT05FKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkZW5kID49IDAKLQkJICAgJiYgc3ltdmFsICsgYWRkZW5kIDw9IDB4ZmZmZmZmKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHJlbGF4IHRvIGxkMjQuICAqLwotCi0JICAgICAgY29kZSA9IDB4ZTAwMDAwMDAgfCAocmVnIDw8IDI0KSB8IChhZGRlbmQgJiAweGZmZmZmZik7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JICAgICAgdG9fZGVsZXRlID0gNDsKLQkgICAgICAvKiBUZWxsIHRoZSBmb2xsb3dpbmcgY29kZSBhIG5vcCBmaWxsZXIgaXNuJ3QgbmVlZGVkLiAgKi8KLQkgICAgICBub3BfcCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIENhbid0IGRvIGFueXRoaW5nIGhlcmUuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgIC8qIERlbGV0ZSBUT19ERUxFVEUgYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgaXJlbC0+cl9vZmZzZXQgKyA0LCB0b19kZWxldGUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogTm93IHRoYXQgdGhlIGZvbGxvd2luZyBieXRlcyBoYXZlIGJlZW4gbW92ZWQgaW50byBwbGFjZSwgc2VlIGlmCi0JICAgICB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIGpsIHdpdGggYSBub3AuICBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYWQKLQkgICAgIHRvIHVzZSBhIGJsMjQgaW5zbiBhbmQgdGhlIGluc24gZm9sbG93aW5nIHRoZSBqbCBpc24ndCBhIG5vcC4KLQkgICAgIFRlY2huaWNhbGx5LCB0aGlzIHNpdHVhdGlvbiBjYW4ndCBoYXBwZW4gKHNpbmNlIHRoZSBpbnNuIGNhbgotCSAgICAgbmV2ZXIgYmUgZXhlY3V0ZWQpIGJ1dCB0byBiZSBjbGVhbiB3ZSBkbyB0aGlzLiAgV2hlbiB0aGUgY2hpcAotCSAgICAgc3VwcG9ydHMgcGFyYWxsZWwgMTYgYml0IGluc25zIHRoaW5ncyBtYXkgY2hhbmdlLgotCSAgICAgV2UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzIGluIHRoZSBjYXNlIG9mIHJlbGF4aW5nIHRvIGxkMjQsCi0JICAgICBhbmQgdGhlIGFib3ZlIGNvZGUgc2V0cyBub3BfcCBzbyB0aGlzIGlzbid0IGRvbmUuICAqLwotCSAgaWYgKCEgbm9wX3AgJiYgdG9fZGVsZXRlID09IDQpCi0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIE5PUF9JTlNOLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbyB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAqYWdhaW4gPSB0cnVlOwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGxvb3AgdG8gdHJ5IHRoZSBuZXh0IHJlbG9jICovCi0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKLQlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX00zMlJfU0NPTU1PTikKLQkgICAgaXNlYyA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZiAvKiAjaWYgMCAqLwotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX00zMlJfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfTTMyUl9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tMzJyLCBiZmRfbWFjaF9tMzJyKTsgIGJyZWFrOwotICAgIGNhc2UgRV9NMzJSWF9BUkNIOiAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX20zMnIsIGJmZF9tYWNoX20zMnJ4KTsgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RvcmUgdGhlIG1hY2hpbmUgbnVtYmVyIGluIHRoZSBmbGFncyBmaWVsZC4gICovCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tMzJyeDogdmFsID0gRV9NMzJSWF9BUkNIOyBicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX00zMlJfQVJDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIE0zMlIgc3BlY2lmaWMgZmlsZSBmbGFncy4gKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqICAgIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCi0JCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKLQotICBlbGZfZ3AgKG9iZmQpID0gZWxmX2dwIChpYmZkKTsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRoZW4gZG8gbm90Ci0JIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0JIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0JIG1lcmdlcyBldmVyIHNldCB0aGVzZSBmbGFncyB0aGVuIHRoZXkgd2lsbCByZXRhaW4gdGhlaXIKLQkgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotCSB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIHJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfTTMyUl9BUkNIKSAhPSAob3V0X2ZsYWdzICYgRUZfTTMyUl9BUkNIKSkKLSAgICB7Ci0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfTTMyUl9BUkNIKSAhPSBFX00zMlJfQVJDSCkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkKLSAgCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0gIAotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJWx4IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLSAgCi0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oIjogbTMyciBpbnN0cnVjdGlvbnMiKSk7ICBicmVhazsKLSAgICBjYXNlIEVfTTMyUlhfQVJDSDogZnByaW50ZiAoZmlsZSwgXygiOiBtMzJyeCBpbnN0cnVjdGlvbnMiKSk7IGJyZWFrOwotICAgIH0KLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi1hc2VjdGlvbiAqCi1tMzJyX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEgLyogRXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgTWl0c3ViaXNoaS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX20zMnJfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW0zMnIiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQkwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCW0zMnJfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCV9iZmRfbTMycl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCQlfYmZkX20zMnJfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJbTMycl9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgICAgIG0zMnJfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgICAgbTMycl9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbTMycl9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zICAgICAgICAgICAgIDEKLSNpZiAwIC8qIG5vdCB5ZXQgKi8KLS8qIHJlbGF4IHN1cHBvcnQgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCQltMzJyX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQkJbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCW0zMnJfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgCW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQkJCQkJCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTY4ay5jIGIvYmZkL2VsZjMyLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxNTIzNC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxMyArMCwwIEBACi0vKiBNb3Rvcm9sYSA2OGsgc2VyaWVzIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbTY4ay5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICplbGZfbTY4a19nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19nY19zd2VlcF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSB7Ci0gIEhPV1RPKFJfNjhLX05PTkUsICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19OT05FIiwgICAgICBmYWxzZSwgMCwgMHgwMDAwMDAwMCxmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzMyLCAgICAgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18zMiIsICAgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzE2LCAgICAgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18xNiIsICAgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzgsICAgICAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S184IiwgICAgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BDMzIsICAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzMyIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEMxNiwgICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDMTYiLCAgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QQzgsICAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEM4IiwgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1Q4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dPVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1Q4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQ4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQ4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0NPUFksICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19DT1BZIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dMT0JfREFULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HTE9CX0RBVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0pNUF9TTE9ULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19KTVBfU0xPVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1JFTEFUSVZFLCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19SRUxBVElWRSIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzY4S19HTlVfVlRJTkhFUklUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfNjhLX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAotfTsKLQotc3RhdGljIHZvaWQKLXJ0eXBlX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfNjhLX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKV07Ci19Ci0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gcnR5cGVfdG9faG93dG8KLQotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3ZhbDsKLSAgaW50IGVsZl92YWw7Ci19IHJlbG9jX21hcFtdID0gewotICB7IEJGRF9SRUxPQ19OT05FLCBSXzY4S19OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl82OEtfMTYgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl82OEtfOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl82OEtfUEMzMiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl82OEtfUEMxNiB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSXzY4S19QQzggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UX1BDUkVMLCBSXzY4S19HT1QzMiB9LAotICB7IEJGRF9SRUxPQ18xNl9HT1RfUENSRUwsIFJfNjhLX0dPVDE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfR09UX1BDUkVMLCBSXzY4S19HT1Q4IH0sCi0gIHsgQkZEX1JFTE9DXzMyX0dPVE9GRiwgUl82OEtfR09UMzJPIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVE9GRiwgUl82OEtfR09UMTZPIH0sCi0gIHsgQkZEX1JFTE9DXzhfR09UT0ZGLCBSXzY4S19HT1Q4TyB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRfUENSRUwsIFJfNjhLX1BMVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwgUl82OEtfUExUMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9QTFRfUENSRUwsIFJfNjhLX1BMVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfUExUT0ZGLCBSXzY4S19QTFQzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUT0ZGLCBSXzY4S19QTFQxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9QTFRPRkYsIFJfNjhLX1BMVDhPIH0sCi0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX0dMT0JfREFULCBSXzY4S19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ182OEtfSk1QX1NMT1QsIFJfNjhLX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19SRUxBVElWRSwgUl82OEtfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl82OEtfMzIgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfNjhLX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSXzY4S19HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHJlbG9jX21hcCkgLyBzaXplb2YgKHJlbG9jX21hcFswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmVsb2NfbWFwW2ldLmJmZF92YWwgPT0gY29kZSkKLQlyZXR1cm4gJmhvd3RvX3RhYmxlW3JlbG9jX21hcFtpXS5lbGZfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgRUxGX0FSQ0ggYmZkX2FyY2hfbTY4awotLyogZW5kIGNvZGUgZ2VuZXJhdGVkIGJ5IGVsZi5lbCAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIG02OGsgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZSB0aGlzLiAgU2VlCi0gICB0aGUgU1ZSNCBBQkkgbTY4ayBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MmYsIDB4M2IsIDB4MDEsIDB4NzAsIC8qIG1vdmUubCAoJXBjLGFkZHIpLC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxhZGRyXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHBhZCBvdXQgdG8gMjAgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxzeW1ib2xAR09UUENdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHgyZiwgMHgzYywJCSAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsCQkgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLSNkZWZpbmUgQ1BVMzJfRkxBRyhhYmZkKSAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0KLSNkZWZpbmUgUExUX0NQVTMyX0VOVFJZX1NJWkUgMjQKLS8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBjcHUzMiAqLwotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHQwX2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjIsIDB4N2IsIDB4MDEsIDB4NzAsIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMSAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZDEsICAgICAgICAgICAgIC8qIGptcCAlYTFAICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCBvZmZzZXQgdG8gLmdvdCArOC4gKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIyLCAweDdiLCAweDAxLCAweDcwLCAgLyogbW92ZWFsICVwY0AoMHhjKSwgJWExICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHg0ZSwgMHhkMSwgICAgICAgICAgICAgIC8qIGptcCAlYTFAICovCi0gIDB4MmYsIDB4M2MsICAgICAgICAgICAgICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsICAgICAgICAgICAgICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLSAgMCwgMAotfTsKLQotLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKLSAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKLSAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQotICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEtlZXAgbTY4ay1zcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBtNjhrLXNwZWNpZmljIGRhdGEgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2NwdTMyXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJIChTRUNfQUxMT0MKLQkJCQkJCSAgfCBTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCQkgb3V0cHV0IGEgUl82OEtfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkJIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotCSAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLQkgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcmVsb2NhdGlvbiBmb3IgYQotCQkgbG9jYWwgc3ltYm9sLiAgRklYTUU6IGRvZXMgaXQ/ICBIb3cgdG8gaGFuZGxlIGl0IGlmCi0JCSBpdCBkb2VzIG1ha2Ugc2Vuc2U/ICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhpcyBpcyBub3QgYSBsb2NhbAotCSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgSG93ZXZlciB3aGVuIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljIGFuZCB0aGlzIGlzIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUKLQkgICAgIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCksIHRoZW4gd2UgY2FuIHJlc29sdmUgdGhlCi0JICAgICByZWxvYyBkaXJlY3RseS4gIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0Ci0JICAgICBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQKLQkgICAgIHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLQkgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0JICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmICghKGluZm8tPnNoYXJlZAotCQkmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkmJiBoICE9IE5VTEwKLQkJJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZgotCQkgICAgIGl0IHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkJICBlbHNlCi0JCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmIGl0Ci0JCSB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCWgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgICAgZWxzZQotCQloLT5wbHQucmVmY291bnQrKzsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IHRoZQotCSAgICAgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCQkgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsCi0JCSBzbyB0aGF0IHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotCQkgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLQkJIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBtNjhrZWxmIGxpbmtlciBoYXNoIHRhYmxlLAotCQkgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gYW4KLQkJIGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzgKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMTYKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMzIpCi0JCSAgJiYgaW5mby0+c3ltYm9saWMpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9tNjhrX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQljYXNlIFJfNjhLX0dPVDhPOgotCWNhc2UgUl82OEtfR09UMTZPOgotCWNhc2UgUl82OEtfR09UMzJPOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCQl7Ci0JCSAgLS1oLT5nb3QucmVmY291bnQ7Ci0JCSAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JCXsKLQkJICAtLWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCQlzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQljYXNlIFJfNjhLX1BDODoKLQljYXNlIFJfNjhLX1BDMTY6Ci0JY2FzZSBSXzY4S19QQzMyOgotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JCS0taC0+cGx0LnJlZmNvdW50OwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDAKLQkgIC8qIFdlIG11c3QgYWx3YXlzIGNyZWF0ZSB0aGUgcGx0IGVudHJ5IGlmIGl0IHdhcyByZWZlcmVuY2VkCi0JICAgICBieSBhIFBMVHh4TyByZWxvY2F0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIGFscmVhZHkgcmVjb3JkZWQKLQkgICAgIGl0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVHh4IHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0JICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotCSAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEN4eAotCSAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIEdDIG1heSBoYXZlIHJlbmRlcmVkIHRoaXMgZW50cnkgdW51c2VkLiAgKi8KLSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPD0gMCkKLQl7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIGlmIChDUFUzMl9GTEFHIChkeW5vYmopKQotCSAgICBzLT5fcmF3X3NpemUgKz0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0JICBlbHNlCi0JICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBpZiAoQ1BVMzJfRkxBRyAoZHlub2JqKSkKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotICAgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmVpbml0aWFsaXplIHRoZSBwbHQgb2Zmc2V0IG5vdyB0aGF0IGl0IGlzIG5vdCB1c2VkIGFzIGEgcmVmZXJlbmNlCi0gICAgIGNvdW50IGFueSBtb3JlLiAgKi8KLSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzY4S19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLQkgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotCSBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0JIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0JIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICBXZQotICAgICBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd2lsbCBub3QKLSAgICAgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX202OGtfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsYS5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgLnJlbGEucGx0IGlzIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aAotCQkgICAgIC5nb3QucGx0LCB3aGljaCBpcyBuZXZlciByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkCi0gICBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcwotICAgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIE02OEsgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl82OEtfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKChyX3R5cGUgPT0gUl82OEtfUExUOAotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzIKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQ4TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDMyTykKLQkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOE8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8KLQkJICAgICAgIHx8ICgocl90eXBlID09IFJfNjhLX0dPVDgKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMTYKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMzIpCi0JCQkgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgICAgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKQotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl82OEtfOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLXzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S19QQzgKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMzIpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0JCSAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0JCSAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMKLQkJICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpID09IFNUVl9ERUZBVUxUKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgICAgICghaW5mby0+c2hhcmVkIHx8IGluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAgICB8fCBFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfNjhLX0dPVDg6Ci0JY2FzZSBSXzY4S19HT1QxNjoKLQljYXNlIFJfNjhLX0dPVDMyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sCi0JICAgICBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfR09UOE86Ci0JY2FzZSBSXzY4S19HT1QxNk86Ci0JY2FzZSBSXzY4S19HT1QzMk86Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgotCSAgICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0JICB7Ci0JICAgIGJmZF92bWEgb2ZmOwotCi0JICAgIGlmIChzZ290ID09IE5VTEwpCi0JICAgICAgewotCQlzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkJQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JCW9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JCUJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JCWlmICghZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgIHx8IChpbmZvLT5zaGFyZWQKLQkJCSYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkJJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgewotCQkgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JCSAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCi0JCSAgICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLi4gIFdlIG11c3QgaW5pdGlhbGl6ZQotCQkgICAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlCi0JCSAgICAgICB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UKLQkJICAgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyCi0JCSAgICAgICB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgICAgb2ZmICY9IH4xOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCQloLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkJb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JCS8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0JCSAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KLQkJaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgIG9mZiAmPSB+MTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgICAgewotCQkJYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJCXNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCQlCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCQlvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICAgKyBvZmYpOwotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl82OEtfUkVMQVRJVkUpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKLQkJCWJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgICAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJCSsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICAgIH0KLQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgaWYgKHJfdHlwZSA9PSBSXzY4S19HT1Q4TwotCQl8fCByX3R5cGUgPT0gUl82OEtfR09UMTZPCi0JCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8pCi0JICAgICAgewotCQkvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLwotCQlyZWwtPnJfYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICByZWxvY2F0aW9uICs9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0JICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFJlc29sdmUgYSBQTFR4eCByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotCSAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8ICFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLQkJIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLQkJIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDhPOgotCWNhc2UgUl82OEtfUExUMTZPOgotCWNhc2UgUl82OEtfUExUMzJPOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4KLQkgICAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gaC0+cGx0Lm9mZnNldDsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRvZXMgbm90IHVzZSB0aGUgYWRkZW5kLiAgKi8KLQkgIHJlbC0+cl9hZGRlbmQgPSAwOwotCi0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S184OgotCWNhc2UgUl82OEtfMTY6Ci0JY2FzZSBSXzY4S18zMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAoKHJfdHlwZSAhPSBSXzY4S19QQzgKLQkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMTYKLQkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMzIpCi0JCSAgfHwgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLQkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0JCSB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCX0KLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSXzY4S18zMikKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKLQkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJfQotCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJaW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCQkJICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JCQl9Ci0KLQkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLSAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIGV4Y2VwdCBmb3IgUl82OEtfMzIKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdHVybmVkIGludG8KLSAgICAgICAgICAgICAgICAgUl82OEtfUkVMQVRJVkUuICAqLwotCSAgICAgIGlmICghcmVsb2NhdGUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICAvKiBUaGVzZSBhcmUgbm8tb3BzIGluIHRoZSBlbmQuICAqLwotCSAgY29udGludWU7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoIShpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCSAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgcGx0X29mZjEsIHBsdF9vZmYyLCBwbHRfb2ZmMzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotCSBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgd2hpY2gKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBzeW1ib2wuICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbAotCSBpbiBhbGwgdGhlIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGFyZSBtYWtpbmcgcGx0IGVudHJpZXMuICBUaGUKLQkgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmICggQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfQ1BVMzJfRU5UUllfU0laRSAtIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5nb3QgdGFibGUgb2YgdGhlIGVudHJ5IHRoYXQKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBmdW5jdGlvbi4gIEVhY2ggLmdvdCBlbnRyeSBpcyA0IGJ5dGVzLgotCSBUaGUgZmlyc3QgdGhyZWUgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGdvdF9vZmZzZXQgPSAocGx0X2luZGV4ICsgMykgKiA0OwotCi0gICAgICBpZiAoIENQVTMyX0ZMQUcgKG91dHB1dF9iZmQpKQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2NwdTMyX3BsdF9lbnRyeSwKLQkgICAgICAgICAgUExUX0NQVTMyX0VOVFJZX1NJWkUpOwotICAgICAgICAgIHBsdF9vZmYxID0gNDsKLSAgICAgICAgICBwbHRfb2ZmMiA9IDEyOwotICAgICAgICAgIHBsdF9vZmYzID0gMTg7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9tNjhrX3BsdF9lbnRyeSwKLQkgICAgICAgICAgUExUX0VOVFJZX1NJWkUpOwotICAgICAgICAgIHBsdF9vZmYxID0gNDsKLSAgICAgICAgICBwbHRfb2ZmMiA9IDEwOwotICAgICAgICAgIHBsdF9vZmYzID0gMTY7Ci0gICAgICAgIH0KLQotICAgICAgLyogVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgZmlyc3QgZXh0ZW5zaW9uIHdvcmQuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBnb3Rfb2Zmc2V0Ci0JCSAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5wbHQub2Zmc2V0ICsgMikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYxKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyBwbHRfb2ZmMik7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAtIChoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjMpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYzKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHQub2Zmc2V0Ci0JCSAgICsgOCksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0pNUF9TTE9UKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gYmZkX2dldF9zaWduZWRfMzIgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKHNnb3QtPmNvbnRlbnRzCi0JCQkJCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsCi0JCSAgICAgIHNnb3QtPmNvbnRlbnRzICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpOwotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzY4S19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLmdvdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkCi0JCSBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcmVsb2NzIChEVF9SRUxBKS4KLQkJIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTEFTWiBlbnRyeSBoZXJlIHRvCi0JCSBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UgdGhlCi0JCSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsYS5wbHQgdG8gZm9sbG93IGFsbAotCQkgb3RoZXIgcmVsb2NhdGlvbiBzZWN0aW9ucywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQotCQkgYWJvdXQgY2hhbmdpbmcgdGhlIERUX1JFTEEgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLSAgICAgICAgICBpZiAoIUNQVTMyX0ZMQUcgKG91dHB1dF9iZmQpKQotICAgICAgICAgICAgewotCSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9tNjhrX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyAxMik7Ci0gICAgICAgICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSAKLSAgICAgICAgICAgICAgID0gUExUX0VOVFJZX1NJWkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvKiBjcHUzMiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfY3B1MzJfcGx0MF9lbnRyeSwgUExUX0NQVTMyX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMikpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDEwKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDEwKTsKLSAgICAgICAgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplIAotICAgICAgICAgICAgICAgPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9tNjhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItbTY4ayIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fNjhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MjAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX202OGtfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfbTY4a19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfbTY4a19nY19zd2VlcF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tODhrLmMgYi9iZmQvZWxmMzItbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRlMjJhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgZm9yIEdEQi4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4awotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIAkxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWNvcmUuYyBiL2JmZC9lbGYzMi1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU5YzczLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qIE1vdG9yb2xhIE1Db3JlIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFJDRSBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBSQ0UgRUxGIEFCSS4gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZQlVU0VfUkVMQQkvKiBPbmx5IFVTRV9SRUwgaXMgYWN0dWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCB0aGlzIGlzCi0JCQkgICBoZXJlIGFyZSBhIHJlbWluZGVyLi4uICovCi0KLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9ob3d0b19pbml0Ci0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgUl9NQ09SRV9tYXhdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01DT1JFX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX05PTkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01DT1JFX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJBRERSMzIiLAkJLyogbmFtZSAqLy8qIEZvciBjb21wYXRhYmlsaXR5IHdpdGggY29mZi9wZSBwb3J0LiAgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTThCWTQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKLSAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCi0gICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU0xMUJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NNEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NNEJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgaGVscCBzdXBwb3J0IFBJQyBjb2RlLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFBDUkVMSU1NMTFCWTIsIHRoaXMgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhCi0gICAgICdqc3JpJyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcmVsb2NhdGlvbgotICAgICBlbnRyeSBmb3IgdGhlIGxpdGVyYWwgcG9vbCBlbnRyeSB0aGF0IGl0IHJlZmVyZW5jZXMsIGJ1dCB3ZSAKLSAgICAgbWlnaHQgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGpzcmkgdG8gYSBic3IgaWYgdGhlIHRhcmdldCB0dXJucyBvdXQKLSAgICAgdG8gYmUgY2xvc2UgZW5vdWdoIFtldmVuIHRob3VnaCB3ZSB3b24ndCByZWNsYWltIHRoZSBsaXRlcmFsIHBvb2wKLSAgICAgZW50cnksIHdlJ2xsIGdldCBzb21lIHJ1bnRpbWUgZWZmaWNpZW5jeSBiYWNrXS4gTm90ZSB0aGF0IHRoaXMKLSAgICAgaXMgYSByZWxvY2F0aW9uIHRoYXQgd2UgYXJlIGFsbG93ZWQgdG8gc2FmZWx5IGlnbm9yZS4gICovIAotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NQ09SRV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfTUNPUkVfR05VX1ZURU5UUlksICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVEVOVFJZIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoUl9NQ09SRV9SRUxBVElWRSwgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1JFTEFUSVZFIiwgICAgLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQwKLS8qIEluaXRpYWxpemUgdGhlIG1jb3JlX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9ob3d0b19pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fcmF3KTsgaS0tOykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIAotICAgICAgdHlwZSA9IG1jb3JlX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIAotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fdGFibGUpKTsKLSAgICAgIAotICAgICAgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFt0eXBlXSA9ICYgbWNvcmVfZWxmX2hvd3RvX3JhdyBbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfTk9ORTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfQUREUjMyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTThCWTQ7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOiAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NMTFCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6CSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NNEJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTDMyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6IG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6ICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZUSU5IRVJJVDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOiAgICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZURU5UUlk7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1JWQTogICAgICAgICAgICAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1JFTEFUSVZFOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFtSX01DT1JFX1BDUkVMSU1NOEJZNF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgbWNvcmVfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgcmV0dXJuIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgbWNvcmVfcmVsb2NdOwotfTsKLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhIFJDRSBFTEYgcmVsb2MuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfTUNPUkVfbWF4KTsKLSAgCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBtY29yZV9lbGZfaG93dG9fdGFibGUgW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlci4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotICAKLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQkvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBEb24ndCBwcmV0ZW5kIHdlIGNhbiBkZWFsIHdpdGggdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLQwKLS8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbCA9IHJlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAibWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FsbGVkIGZvciAlcyBzZWN0aW9uICVzLCAlbGQgcmVsb2NhdGlvbnMlc1xuIiwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgIGJmZF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkgICAobG9uZykgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFtSX01DT1JFX1BDUkVMSU1NOEJZNF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgbWNvcmVfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAgICByX3R5cGUgPSAoZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHIgPSBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYyA9IChhc2VjdGlvbiAqKSAwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgMDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgMDsKLSAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgb2xkaW5zdCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZCkgcl90eXBlID49ICh1bnNpZ25lZCkgUl9NQ09SRV9tYXgKLQkgIHx8ICEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KXJfdHlwZV0pCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIChpbnQpIHJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAKLSAgICAgIGhvd3RvID0gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSByX3R5cGVdOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmICgodW5zaWduZWQpRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCQkgICBob3d0by0+bmFtZSwgKGludCkgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICAvKiBDb21wbGFpbiBhYm91dCBrbm93biByZWxvY2F0aW9uIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkICovCi0gICAgICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gPT0gbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIGhvd3RvLT5uYW1lLAotCQkJICAgICAgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkCi0JCSAgICYmIEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcikgPT0gU1RWX0RFRkFVTFQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJIAkgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjoKLQkgIG9sZGluc3QgPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLSNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIE1DT1JFX0lOU1RfQlNSLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotCShob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2sgJiYgcl90eXBlID09IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIpCi0JewotCSAgLyogV2Fzbid0IG9rLCBiYWNrIGl0IG91dCBhbmQgZ2l2ZSB1cC4gICovCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIG9sZGluc3QsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICAKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICAKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAoKiBuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCi0JCSgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG9mZnNldCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1jb3JlX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTUNPUkVfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBhc2VjdGlvbiAqIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICAKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCSAgCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX01DT1JFX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tY29yZV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgImVsZjMyLW1jb3JlLWxpdHRsZSIKLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbWNvcmUKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9NQ09SRQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAkJLyogNGssIGlmIHdlIGV2ZXIgaGF2ZSAnZW0gKi8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JbWNvcmVfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCU5VTEwKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQltY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQltY29yZV9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCW1jb3JlX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtY29yZV9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCQkxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1taXBzLmMgYi9iZmQvZWxmMzItbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWUyNjBlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDM2ICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsCi0gICA8aWFuQGN5Z251cy5jb20+LgotICAgTjMyLzY0IEFCSSBzdXBwb3J0IGFkZGVkIGJ5IE1hcmsgTWl0Y2hlbGwsIENvZGVTb3VyY2VyeSwgTExDLgotICAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCAuZ290IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZy4gIEl0Ci0gICBpcyBzdG9yZWQgaW4gdGhlIHRkYXRhIGZpZWxkIG9mIHRoZSBiZmRfZWxmX3NlY3Rpb25fZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbWlwc19nb3RfaW5mbwotewotICAvKiBUaGUgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIHdpdGggdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ2xvYmFsX2dvdHN5bTsKLSAgLyogVGhlIG51bWJlciBvZiBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbF9nb3RubzsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxfZ290bm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIGhhdmUgdXNlZC4gICovCi0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLX07Ci0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIFJfTUlQU18zMiwgUl9NSVBTX1JFTDMyLCBvciBSX01JUFNfNjQgcmVsb2NzIGFnYWluc3QKLSAgICAgdGhpcyBzeW1ib2wuICAqLyAKLSAgdW5zaWduZWQgaW50IHBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzOwotCi0gIC8qIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZHluYW1pYyByZWxvY2F0aW9uIChpbiB0aGUgLnJlbC5keW4KLSAgICAgc2VjdGlvbikgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaW5fZHluX3JlbG9jX2luZGV4OwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDMyIGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMTYgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmZuX3N0dWI7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBmbl9zdHViOyB0aGlzIGlzIHNldCBpZiB0aGlzIHN5bWJvbCBhcHBlYXJzCi0gICAgIGluIGFueSByZWxvY3Mgb3RoZXIgdGhhbiBhIDE2IGJpdCBjYWxsLiAgKi8KLSAgYm9vbGVhbiBuZWVkX2ZuX3N0dWI7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBzdHViIHRoYXQgMTYgYml0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRvIGNhbGwgdGhpcwotICAgICAzMiBiaXQgZnVuY3Rpb24sIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN0dWIuICAqLwotICBhc2VjdGlvbiAqY2FsbF9zdHViOwotCi0gIC8qIFRoaXMgaXMgbGlrZSB0aGUgY2FsbF9zdHViIGZpZWxkLCBidXQgaXQgaXMgdXNlZCBpZiB0aGUgZnVuY3Rpb24KLSAgICAgYmVpbmcgY2FsbGVkIHJldHVybnMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICovCi0gIGFzZWN0aW9uICpjYWxsX2ZwX3N0dWI7Ci19OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMzMl82NGJpdF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqLCBFbGYzMl9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfZ3B0YWIgKiwgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikpOwotI2lmIDAKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX21zeW1faW4gCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9Nc3ltICosIEVsZjMyX0ludGVybmFsX01zeW0gKikpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqLCBFbGYzMl9FeHRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGVsZl9taXBzX2lzYSBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfbWFjaCBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBjaGFyKiBlbGZfbWlwc19hYmlfbmFtZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICptaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBncHRhYl9jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9qdW1wX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfZ3ByZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2ZpbmFsX2dwCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJmZF9ieXRlICplbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3ZlcmZsb3dfcCBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2ggUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaGVyIFBBUkFNUyAoKGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2hlc3QgUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfbG9jYWxfZ290X2luZGV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgc3RydWN0IG1pcHNfZ290X2luZm8gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ290X3BhZ2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEgKikpOwotc3RhdGljIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICptaXBzX2VsZl9uZXh0X3JlbG9jYXRpb24KLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCAKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCByZWxvY19ob3d0b190eXBlICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBjb25zdCBjaGFyICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCByZWxvY19ob3d0b190eXBlICosIAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsCi0JICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2Fzc2lnbl9ncCBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAKLSAgUEFSQU1TICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGFzZWN0aW9uICogbWlwc19lbGZfZ290X3NlY3Rpb24gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqbWlwc19lbGZfZ290X2luZm8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBtaXBzX2dvdF9pbmZvICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2dvdDE2X2VudHJ5IAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGJmZF92bWEgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZSBsZXZlbCBvZiBJUklYIGNvbXBhdGliaWxpdHkgd2UncmUgc3RyaXZpbmcgZm9yLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgaWN0X25vbmUsCi0gIGljdF9pcml4NSwKLSAgaWN0X2lyaXg2Ci19IGlyaXhfY29tcGF0X3Q7Ci0KLS8qIE5vbnplcm8gaWYgQUJGRCBpcyB1c2luZyB0aGUgTjMyIEFCSS4gICovCi0KLSNkZWZpbmUgQUJJX04zMl9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJMikgIT0gMCkKLQotLyogTm9uemVybyBpZiBBQkZEIGlzIHVzaW5nIHRoZSA2NC1iaXQgQUJJLiAgRklYTUU6IFRoaXMgaXMgbmV2ZXIKLSAgIHRydWUsIHlldC4gICovCi0jZGVmaW5lIEFCSV82NF9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkgIT0gMCkKLQotLyogV2hhdCB2ZXJzaW9uIG9mIElyaXggd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGguICBGSVhNRToKLSAgIEF0IHRoZSBtb21lbnQsIHdlIG5ldmVyIGdlbmVyYXRlICJub3JtYWwiIE1JUFMgRUxGIEFCSSBleGVjdXRhYmxlczsKLSAgIHdlIGFsd2F5cyB1c2Ugc29tZSB2ZXJzaW9uIG9mIElyaXguICAqLwotCi0jZGVmaW5lIElSSVhfQ09NUEFUKGFiZmQpIFwKLSAgKChBQklfTjMyX1AgKGFiZmQpIHx8IEFCSV82NF9QIChhYmZkKSkgPyBpY3RfaXJpeDYgOiBpY3RfaXJpeDUpCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggSVJJWCBhdCBhbGwuICAqLwotCi0jZGVmaW5lIFNHSV9DT01QQVQoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpICE9IGljdF9ub25lKQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgbXN5bSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUoYWJmZCkgIi5tc3ltIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3JkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKGFiZmQpICIuc3JkYXRhIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9ucyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NiA/ICIuTUlQUy5vcHRpb25zIiA6ICIub3B0aW9ucyIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzdHViIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRShhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2ID8gIi5NSVBTLnN0dWJzIiA6ICIuc3R1YiIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FKGFiZmQpICIucmVsLmR5biIKLQotLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgUkVMIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9SRUxfU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9yZWwpCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIGR5bmFtaWMgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBNSVBTX0VMRl9EWU5fU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW4pCi0KLS8qIFRoZSBzaXplIG9mIGEgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR09UX1NJWkUoYWJmZCkgXAotICAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5hcmNoX3NpemUgLyA4KQotCi0vKiBUaGUgc2l6ZSBvZiBhIHN5bWJvbC10YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NZTV9TSVpFKGFiZmQpIFwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bSkKLQotLyogVGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciBzZWN0aW9ucywgYXMgYSBwb3dlciBvZiB0d28uICAqLwotI2RlZmluZSBNSVBTX0VMRl9MT0dfRklMRV9BTElHTihhYmZkKQkJCQlcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPmZpbGVfYWxpZ24gPT0gOCA/IDMgOiAyKQotCi0vKiBHZXQgd29yZC1zaXplZCBkYXRhLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR0VUX1dPUkQoYWJmZCwgcHRyKSBcCi0gIChBQklfNjRfUCAoYWJmZCkgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpIDogYmZkX2dldF8zMiAoYWJmZCwgcHRyKSkKLQotLyogUHV0IG91dCB3b3JkLXNpemVkIGRhdGEuICAqLwotI2RlZmluZSBNSVBTX0VMRl9QVVRfV09SRChhYmZkLCB2YWwsIHB0cikJXAotICAoQUJJXzY0X1AgKGFiZmQpIAkJCQlcCi0gICA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKSAJCVwKLSAgIDogYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpKQotCi0vKiBBZGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZS1lbnRyeS4gICovCi0jaWZkZWYgQkZENjQKLSNkZWZpbmUgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkoaW5mbywgdGFnLCB2YWwpIFwKLSAgKEFCSV82NF9QIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaikJICAgXAotICAgPyBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSAgXAotICAgOiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSkKLSNlbHNlCi0jZGVmaW5lIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKGluZm8sIHRhZywgdmFsKSBcCi0gIChBQklfNjRfUCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmopCSAgIFwKLSAgID8gKGFib3J0ICgpLCBmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkpCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgcmVzZXJ2ZS4gICovCi0jZGVmaW5lIE1JUFNfUkVTRVJWRURfR09UTk8gKDIpCi0KLS8qIEluc3RydWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBzdHViLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBzdHViIGlzCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgb24gYW4gU0dJIHN5c3RlbS4gICovCi0jZGVmaW5lIEVMRl9NSVBTX0dQX09GRlNFVChhYmZkKSAoU0dJX0NPTVBBVCAoYWJmZCkgPyAweDdmZjAgOiAweDgwMDApCi0jZGVmaW5lIFNUVUJfTFcoYWJmZCkJCQkJCQlcCi0gIChTR0lfQ09NUEFUIChhYmZkKQkJCQkJCVwKLSAgID8gKEFCSV82NF9QIChhYmZkKSAgCQkJCQkJXAotICAgICAgPyAweGRmOTk4MDEwCQkvKiBsZCB0OSwweDgwMTAoZ3ApICovCQlcCi0gICAgICA6IDB4OGY5OTgwMTApICAgICAgICAgICAgIC8qIGx3IHQ5LDB4ODAxMChncCkgKi8JCVwKLSAgIDogMHg4Zjk5ODAwMCkJCS8qIGx3IHQ5LDB4ODAwMChncCkgKi8KLSNkZWZpbmUgU1RVQl9NT1ZFIDB4MDNlMDc4MjUJLyogbW92ZSB0NyxyYSAqLwotI2RlZmluZSBTVFVCX0pBTFIgMHgwMzIwZjgwOQkvKiBqYWwgdDkgKi8KLSNkZWZpbmUgU1RVQl9MSTE2IDB4MzQxODAwMDAJLyogb3JpIHQ4LHplcm8sMCAqLwotI2RlZmluZSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSAoMTYpCi0KLSNpZiAwCi0vKiBXZSBubyBsb25nZXIgdHJ5IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc2VjdGlvbnMgZm9yIHRoZSAuZHluc3ltCi0gICBzZWN0aW9uLiAgV2hlbiB3ZSBkbywgd2Ugd2luZCB1cCBjcmFzaGluZyBpZiB0aGVyZSBhcmUgb3RoZXIgcmFuZG9tCi0gICBzZWN0aW9ucyB3aXRoIHJlbG9jYXRpb25zLiAgKi8KLQotLyogTmFtZXMgb2Ygc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSAuZHluc3ltIHNlY3Rpb24gaW4gYW4gSXJpeCA1Ci0gICBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzW10gPQotewotICAiLnRleHQiLAotICAiLmluaXQiLAotICAiLmZpbmkiLAotICAiLmRhdGEiLAotICAiLnJvZGF0YSIsCi0gICIuc2RhdGEiLAotICAiLnNic3MiLAotICAiLmJzcyIsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIFwKLSAgKHNpemVvZiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIC8gc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbMF0pCi0KLS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIHdoaWNoIGdvIGluIHRoZQotICAgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PICgzKQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIHN5bWJvbHMgdXNlZCBvbiBJcml4IDUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbXSA9Ci17Ci0gICJfcHJvY2VkdXJlX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfc3RyaW5nX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfdGFibGVfc2l6ZSIsCi0gIE5VTEwKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG9uCi0gICBJcml4IDUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nIGlkMTsJCS8qIEFsd2F5cyBvbmU/ICAqLwotICB1bnNpZ25lZCBsb25nIG51bTsJCS8qIE51bWJlciBvZiBjb21wYWN0IHJlbG9jYXRpb24gZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWQyOwkJLyogQWx3YXlzIHR3bz8gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIFplcm8/ICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMTsJLyogWmVybz8gICovCi19IEVsZjMyX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpZDFbNF07Ci0gIGJmZF9ieXRlIG51bVs0XTsKLSAgYmZkX2J5dGUgaWQyWzRdOwotICBiZmRfYnl0ZSBvZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHJlc2VydmVkMFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQxWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmFkZHI7CQkvKiBWQUREUiB0byBiZSByZWxvY2F0ZWQuICAqLwotfSBFbGYzMl9jcmluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjdHlwZSA6IDE7CS8qIDE6IGxvbmcgMDogc2hvcnQgZm9ybWF0LiBTZWUgYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgcnR5cGUgOiA0OwkvKiBSZWxvY2F0aW9uIHR5cGVzLiBTZWUgYmVsb3cuICovCi0gIHVuc2lnbmVkIGludCBkaXN0MnRvIDogODsKLSAgdW5zaWduZWQgaW50IHJlbHZhZGRyIDogMTk7CS8qIChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkvIDQgKi8KLSAgdW5zaWduZWQgbG9uZyBrb25zdDsJCS8qIEtPTlNUIGZpZWxkLiBTZWUgYmVsb3cuICAqLwotfSBFbGYzMl9jcmluZm8yOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLSAgYmZkX2J5dGUgdmFkZHJbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX2J5dGUgaW5mb1s0XTsKLSAgYmZkX2J5dGUga29uc3RbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzI7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc3dhcCB0aGUgYml0ZmllbGRzIGluIGEgY3JpbmZvLiAgKi8KLQotI2RlZmluZSBDUklORk9fQ1RZUEUgKDB4MSkKLSNkZWZpbmUgQ1JJTkZPX0NUWVBFX1NIICgzMSkKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFICgweGYpCi0jZGVmaW5lIENSSU5GT19SVFlQRV9TSCAoMjcpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPICgweGZmKQotI2RlZmluZSBDUklORk9fRElTVDJUT19TSCAoMTkpCi0jZGVmaW5lIENSSU5GT19SRUxWQUREUiAoMHg3ZmZmZikKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSX1NIICgwKQotCi0vKiBBIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvIGhhcyBsb25nICgzIHdvcmRzKSBvciBzaG9ydCAoMiB3b3JkcykKLSAgIGZvcm1hdHMuICBBIHNob3J0IGZvcm1hdCBkb2Vzbid0IGhhdmUgVkFERFIgZmllbGQgYW5kIHJlbHZhZGRyCi0gICBmaWVsZHMgY29udGFpbnMgKChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkgPj4gMikuICAqLwotI2RlZmluZSBDUkZfTUlQU19MT05HCQkJMQotI2RlZmluZSBDUkZfTUlQU19TSE9SVAkJCTAKLQotLyogVGhlcmUgYXJlIDQgdHlwZXMgb2YgY29tcGFjdCByZWxvY2F0aW9uIGF0IGxlYXN0LiBUaGUgdmFsdWUgS09OU1QKLSAgIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCB0eXBlOgotCi0gICAodHlwZSkJCShrb25zdCkKLSAgIENUX01JUFNfUkVMMzIJQWRkcmVzcyBpbiBkYXRhCi0gICBDVF9NSVBTX1dPUkQJCUFkZHJlc3MgaW4gd29yZCAoWFhYKQotICAgQ1RfTUlQU19HUEhJX0xPCUdQIC0gdmFkZHIKLSAgIENUX01JUFNfSk1QQUQJQWRkcmVzcyB0byBqdW1wCi0gICAqLwotCi0jZGVmaW5lIENSVF9NSVBTX1JFTDMyCQkJMHhhCi0jZGVmaW5lIENSVF9NSVBTX1dPUkQJCQkweGIKLSNkZWZpbmUgQ1JUX01JUFNfR1BISV9MTwkJMHhjCi0jZGVmaW5lIENSVF9NSVBTX0pNUEFECQkJMHhkCi0KLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCh4LGZvcm1hdCkJKCh4KS5jdHlwZSA9IChmb3JtYXQpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfdHlwZSh4LHR5cGUpCQkoKHgpLnJ0eXBlID0gKHR5cGUpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byh4LHYpCQkoKHgpLmRpc3QydG8gPSAodikpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9yZWx2YWRkcih4LGQpCQkoKHgpLnJlbHZhZGRyID0gKGQpPDwyKQotCi1zdGF0aWMgdm9pZCBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICosIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NyaW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogTUlQUyB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4IDUsIGFsdGhvdWdoIHRoZXkgYXJlCi0gICAgICAgbm90IGRlZmluZWQgYnkgdGhlIEFCSS4gICovCi0gICAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgICBFTVBUWV9IT1dUTyAoMTQpLAotICAgIEVNUFRZX0hPV1RPICgxNSksCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3VidHJhY3Rpb24uICBVc2VkIGluIHRoZSBOMzIgQUJJLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIHRvIGNhdXNlIHRoZSBsaW5rZXIgdG8gaW5zZXJ0IGFuZCBkZWxldGUgaW5zdHJ1Y3Rpb25zPyAgKi8KLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19JTlNFUlRfQSksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfSU5TRVJUX0IpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0RFTEVURSksCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNlY3Rpb24gZGlzcGxhY2VtZW50LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfUkVMMTYpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX1BKVU1QKSwKLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19SRUxHT1QpLAotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwMDFmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDAxZiwJICAgICAgICAvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9ucyBmb3IgZW1iZWRkZWQtcGljLiAgKi8KLS8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUsIHBjLXJlbGF0aXZlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV9yZWxfaGkxNiA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1JFTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1JFTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLCBwYy1yZWxhdGl2ZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfcmVsX2xvMTYgPQotICBIT1dUTyAoUl9NSVBTX0dOVV9SRUxfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9SRUxfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIDE2IGJpdCBvZmZzZXQgZm9yIHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV9yZWwxNl9zMiA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1JFTDE2X1MyLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HTlVfUkVMMTZfUzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiA2NCBiaXQgcGMtcmVsYXRpdmUuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3BjcmVsNjQgPQotICBIT1dUTyAoUl9NSVBTX1BDNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIDMyIGJpdCBwYy1yZWxhdGl2ZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfcGNyZWwzMiA9Ci0gIEhPV1RPIChSX01JUFNfUEMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgIGJmZF92bWEgZ3A7Ci0KLSAgICAgIGlmIChyZXQgPT0gYmZkX3JlbG9jX3VuZGVmaW5lZCkKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLQlyZWxvY2F0ZWFibGUgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotCSAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCX0KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotCi0gICAgICByZWxvY2F0aW9uID0gZ3AgLSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0JICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlyZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXJlbG9jYXRpb24gPSAwOwotICAgICAgZWxzZQotCXJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfaGkxNl9saXN0OwotICBtaXBzX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSX01JUFNfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKLSAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCi0gICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jIChhYmZkLAotCQkgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgIHN5bWJvbCwKLQkJICAgICBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwKLQkJICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYXJlbGVudCBncF9kaXNwX3JlbGVudDsKLQotICBpZiAobWlwc19oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19oaTE2ICpsOwotCi0gICAgICBsID0gbWlwc19oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0JICAgIHsKLQkgICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLQkgICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gbC0+YWRkZW5kOwotCSAgICB9Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfaGkxNl9saXN0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICAgICAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLQotICAgICAgLyogRklYTUU6IERvZXMgdGhpcyBjYXNlIGV2ZXIgb2NjdXI/ICAqLwotCi0gICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCB0cnVlLCBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gICAgICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLSAgICAgIHJlbG9jX2VudHJ5ID0gJmdwX2Rpc3BfcmVsZW50OwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb24gLSA0OwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIExPMTYgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dPVDE2IHJlbG9jLiAgVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQKLSAgIHRhYmxlIHVzZWQgZm9yIFBJQyBjb2RlLiAgSWYgdGhlIHN5bWJvbCBpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgbW9kaWZpZWQgdG8gY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSBhcHByb3ByaWF0ZQotICAgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBJZiB0aGUgc3ltYm9sIGlzIGEgc2VjdGlvbgotICAgc3ltYm9sLCB0aGUgbmV4dCByZWxvYyBpcyBhIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhlIHR3byAxNiBiaXQKLSAgIGFkZGVuZHMgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHJlYWwgYWRkZW5kIGFnYWluc3QgdGhlIHNlY3Rpb24KLSAgIHN5bWJvbDsgdGhlIEdPVDE2IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiBhbiBlbnRyeSBpbgotICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIGFuZCB0aGUgTE8xNiBpcyBtb2RpZmllZCB0byBvZmZzZXQgaXQKLSAgIGFwcHJvcHJpYXRlbHkuICBUaHVzIGFuIG9mZnNldCBsYXJnZXIgdGhhbiAxNiBiaXRzIHJlcXVpcmVzIGEKLSAgIG1vZGlmaWVkIHZhbHVlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIHN1ZmZpY2VzIGZvciB0aGUgYXNzZW1ibGVyLCBidXQgdGhlIGxpbmtlciBkb2VzCi0gICBub3QgeWV0IGtub3cgaG93IHRvIGNyZWF0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlcy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyAoYWJmZCwKLQkJICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgIHN5bWJvbCwKLQkJICAgICAgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSBjYW4gaGFuZGxlIGl0Ci0gICAgIGp1c3QgbGlrZSBISTE2LiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByZXR1cm4gX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIE9VVFBVVF9CRkQuICBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgYQotICAgZGFuZ2Vyb3VzIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYXNzaWduX2dwIChvdXRwdXRfYmZkLCBwZ3ApCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFzeW1ib2wgKipzeW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgZmlndXJlZCBvdXQgd2hhdCBHUCB3aWxsIGJlLCBqdXN0IHJldHVybiBpdC4gICovCi0gICpwZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmICgqcGdwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gIHN5bSA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0KLSAgLyogVGhlIGxpbmtlciBzY3JpcHQgd2lsbCBoYXZlIGNyZWF0ZWQgYSBzeW1ib2wgbmFtZWQgYF9ncCcgd2l0aCB0aGUKLSAgICAgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIGkgPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnN5bSk7Ci0JICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JICAgIHsKLQkgICAgICAqcGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPj0gY291bnQpCi0gICAgewotICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotICAgICAgKnBncCA9IDQ7Ci0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAhIHJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAqcGdwID0gMDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAgIH0KLQotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCA9PSAwCi0gICAgICAmJiAoISByZWxvY2F0ZWFibGUKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICAqcGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFtaXBzX2VsZl9hc3NpZ25fZ3AgKG91dHB1dF9iZmQsIHBncCkpCi0JewotCSAgKmVycm9yX21lc3NhZ2UgPQotCSAgICAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dQUkVMMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgdmFsdWUgd2hpY2ggbXVzdAotICAgYmVjb21lIHRoZSBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGZ1bmN0aW9uIGFsc28gaGFuZGxlcwotICAgUl9NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbnMsIGFsdGhvdWdoIHRob3NlIGNhbiBiZSBoYW5kbGVkIG1vcmUKLSAgIGNsZXZlcmx5IGJlY2F1c2UgdGhlIGVudHJpZXMgaW4gdGhlIC5saXQ4IGFuZCAubGl0NCBzZWN0aW9ucyBjYW4gYmUKLSAgIG1lcmdlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ3ByZWwxNl93aXRoX2dwIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkgICAgICBhcmVsZW50ICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgICBib29sZWFuLCBQVFIsIGJmZF92bWEpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIHJldHVybiBncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCi0JCQkgIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRlYWJsZSwgZGF0YSwKLQkJIGdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgZ3A7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnNyY19tYXNrID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIG9jY3VycyB3aXRoIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgICAgIHZhbCA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsID0gKChpbnNuICYgMHhmZmZmKSArIHJlbG9jX2VudHJ5LT5hZGRlbmQpICYgMHhmZmZmOwotICAgICAgaWYgKHZhbCAmIDB4ODAwMCkKLQl2YWwgLT0gMHgxMDAwMDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKLSAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCi0gICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGlmICghIHJlbG9jYXRlYWJsZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKChsb25nKSB2YWwgPj0gMHg4MDAwIHx8IChsb25nKSB2YWwgPCAtMHg4MDAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwzMiByZWxvY2F0aW9uLiAgSXMgdGhpcyAzMiBiaXQgdmFsdWUgdGhlIG9mZnNldAotICAgZnJvbSB0aGUgZ3AgcmVnaXN0ZXI/IFhYWCAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMzJfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopCi0JXygiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICByZXR1cm4gZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCi0JCSBncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIGdwOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAoISByZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIGEgNjQgYml0IHJlbG9jIGluIGEgMzIgYml0IE1JUFMgRUxGIGZpbGUuICBUaGVzZSBhcmUKLSAgIGdlbmVyYXRlZCB3aGVuIGFkZHJlc2VzIGFyZSA2NCBiaXRzLiAgVGhlIHVwcGVyIDMyIGJpdHMgYXJlIGEgc2ltbGUKLSAgIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczMyXzY0Yml0X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhcmVsZW50IHJlbG9jMzI7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICBiZmRfc2l6ZV90eXBlIGFkZHI7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsKLQotICAvKiBEbyBhIG5vcm1hbCAzMiBiaXQgcmVsb2NhdGlvbiBvbiB0aGUgbG93ZXIgMzIgYml0cy4gICovCi0gIHJlbG9jMzIgPSAqcmVsb2NfZW50cnk7Ci0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgcmVsb2MzMi5hZGRyZXNzICs9IDQ7Ci0gIHJlbG9jMzIuaG93dG8gPSAmZWxmX21pcHNfaG93dG9fdGFibGVbUl9NSVBTXzMyXTsKLSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsICZyZWxvYzMyLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgLyogU2lnbiBleHRlbmQgaW50byB0aGUgdXBwZXIgMzIgYml0cy4gICovCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2MzMi5hZGRyZXNzKTsKLSAgaWYgKCh2YWwgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgIHZhbCA9IDB4ZmZmZmZmZmY7Ci0gIGVsc2UKLSAgICB2YWwgPSAwOwotICBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgYWRkciArPSA0OwotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBqdW1wLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2p1bXBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEZJWE1FLiAgKi8KLSAgewotICAgIHN0YXRpYyBib29sZWFuIHdhcm5lZDsKLQotICAgIGlmICghIHdhcm5lZCkKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJMaW5raW5nIG1pcHMxNiBvYmplY3RzIGludG8gJXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcikpOwotICAgIHdhcm5lZCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotLyogSGFuZGxlIGEgbWlwczE2IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2dwcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQsIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZmluYWw7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogUGljayB1cCB0aGUgbWlwczE2IGV4dGVuZCBpbnN0cnVjdGlvbiBhbmQgdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uICAqLwotICBleHRlbmQgPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICAvKiBTdHVmZiB0aGUgY3VycmVudCBhZGRlbmQgYmFjayBhcyBhIDMyIGJpdCB2YWx1ZSwgZG8gdGhlIHVzdWFsCi0gICAgIHJlbG9jYXRpb24sIGFuZCB0aGVuIGNsZWFuIHVwLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkgICAgICAgfCAoZXh0ZW5kICYgMHg3ZTApCi0JICAgICAgIHwgKGluc24gJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0ID0gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotCi0gIGZpbmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChleHRlbmQgJiAweGY4MDApCi0JICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCSAgICAgICB8IChmaW5hbCAmIDB4N2UwKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChpbnNuICYgMHhmZmUwKQotCSAgICAgICB8IChmaW5hbCAmIDB4MWYpKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJuIHRoZSBJU0EgZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX2lzYSAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotICAgIHsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzE6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzI6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzM6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi0vKiBSZXR1cm4gdGhlIE1BQ0ggZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfTUFDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfTUFDSF8zOTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHMzOTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MDEwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDEwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTExOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTExOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80NjUwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0NjUwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFX01JUFNfQVJDSF8xOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHMzMDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzI6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczYwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfMzoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzNDAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF80OgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM4MDAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHByaW50YWJsZSBuYW1lIGZvciBBQkkuICovCi0KLXN0YXRpYyBJTkxJTkUgY2hhcioKLWVsZl9taXBzX2FiaV9uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChBQklfTjMyX1AgKGFiZmQpKQotICAgIHJldHVybiAiTjMyIjsKLSAgZWxzZSBpZiAoQUJJXzY0X1AgKGFiZmQpKQotICAgIHJldHVybiAiNjQiOwotICAgICAgCi0gIGZsYWdzID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3M7Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FCSSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICJub25lIjsKLSAgICBjYXNlIEVfTUlQU19BQklfTzMyOgotICAgICAgcmV0dXJuICJPMzIiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9PNjQ6Ci0gICAgICByZXR1cm4gIk82NCI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX0VBQkkzMjoKLSAgICAgIHJldHVybiAiRUFCSTMyIjsKLSAgICBjYXNlIEVfTUlQU19BQklfRUFCSTY0OgotICAgICAgcmV0dXJuICJFQUJJNjQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gYWJpIjsKLSAgICB9Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfcmVsb2NfbWFwIG1pcHNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01JUFNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTUlQU18xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NSVBTXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzY0LCBSX01JUFNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19KTVAsIFJfTUlQU18yNiB9LAotICB7IEJGRF9SRUxPQ19ISTE2X1MsIFJfTUlQU19ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX0xPMTYsIFJfTUlQU19MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwsIFJfTUlQU19HUFJFTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfTElURVJBTCwgUl9NSVBTX0xJVEVSQUwgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1QxNiwgUl9NSVBTX0dPVDE2IH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01JUFNfUEMxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgUl9NSVBTX0NBTEwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIsIFJfTUlQU19HUFJFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsIFJfTUlQU19HT1RfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LCBSX01JUFNfR09UX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsIFJfTUlQU19DQUxMX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsIFJfTUlQU19DQUxMX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19TVUIsIFJfTUlQU19TVUIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSwgUl9NSVBTX0dPVF9QQUdFIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX09GU1QsIFJfTUlQU19HT1RfT0ZTVCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQLCBSX01JUFNfR09UX0RJU1AgfQotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgdHlwZSwgcmV0dXJuIGEgaG93dG8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobWlwc19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWlwc19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgbWlwc19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgLyogV2UgbmVlZCB0byBoYW5kbGUgQkZEX1JFTE9DX0NUT1Igc3BlY2lhbGx5LgotCSBTZWxlY3QgdGhlIHJpZ2h0IHJlbG9jYXRpb24gKFJfTUlQU18zMiBvciBSX01JUFNfNjQpIGJhc2VkIG9uIHRoZQotCSBzaXplIG9mIGFkZHJlc3NlcyBvbiB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICBpZiAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkgPT0gMzIpCi0JcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVsoaW50KSBSX01JUFNfMzJdOwotICAgICAgZWxzZQotCXJldHVybiAmZWxmX21pcHNfY3RvcjY0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0pNUDoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9qdW1wX2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9HUFJFTDoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9ncHJlbF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3JlbF9oaTE2OwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9yZWxfbG8xNjsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3JlbDE2X3MyOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcGNyZWw2NDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3BjcmVsMzI7Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19ydHlwZV90b19ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFMxNl8yNjoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9qdW1wX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFMxNl9HUFJFTDoKLSAgICAgIHJldHVybiAmZWxmX21pcHMxNl9ncHJlbF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfUkVMX0hJMTY6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9yZWxfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9SRUxfTE8xNjoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3JlbF9sbzE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1JFTDE2X1MyOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcmVsMTZfczI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19QQzY0OgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcGNyZWw2NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX1BDMzI6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9wY3JlbDMyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NSVBTX21heCk7Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEdpdmVuIGEgTUlQUyBFbGYzMl9JbnRlcm5hbF9SZWwsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSk7Ci0KLSAgLyogVGhlIGFkZGVuZCBmb3IgYSBHUFJFTDE2IG9yIExJVEVSQUwgcmVsb2NhdGlvbiBjb21lcyBmcm9tIHRoZSBHUAotICAgICB2YWx1ZSBmb3IgdGhlIG9iamVjdCBmaWxlLiAgV2UgZ2V0IHRoZSBhZGRlbmQgbm93LCByYXRoZXIgdGhhbgotICAgICB3aGVuIHdlIGRvIHRoZSByZWxvY2F0aW9uLCBiZWNhdXNlIHRoZSBzeW1ib2wgbWFuaXB1bGF0aW9ucyBkb25lCi0gICAgIGJ5IHRoZSBsaW5rZXIgbWF5IGNhdXNlIHVzIHRvIGxvc2UgdHJhY2sgb2YgdGhlIGlucHV0IEJGRC4gICovCi0gIGlmICgoKCpjYWNoZV9wdHItPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLSAgICAgICYmIChyX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0dQUkVMMTYKLQkgIHx8IHJfdHlwZSA9PSAodW5zaWduZWQgaW50KSBSX01JUFNfTElURVJBTCkpCi0gICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBlbGZfZ3AgKGFiZmQpOwotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsYSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIC8qIFNpbmNlIGFuIEVsZjMyX0ludGVybmFsX1JlbCBpcyBhbiBpbml0aWFsIHByZWZpeCBvZiBhbgotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhLCB3ZSBjYW4ganVzdCB1c2UgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICAgICBhYm92ZS4gICovCi0gIG1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgKEVsZjMyX0ludGVybmFsX1JlbCAqKSBkc3QpOwotCi0gIC8qIElmIHdlIGV2ZXIgbmVlZCB0byBkbyBhbnkgZXh0cmEgcHJvY2Vzc2luZyB3aXRoIGRzdC0+cl9hZGRlbmQKLSAgICAgKHRoZSBmaWVsZCBvbWl0dGVkIGluIGFuIEVsZjMyX0ludGVybmFsX1JlbCkgd2UgY2FuIGRvIGl0IGhlcmUuICAqLwotfQotDAotLyogQSAucmVnaW5mbyBzZWN0aW9uIGhvbGRzIGEgc2luZ2xlIEVsZjMyX1JlZ0luZm8gc3RydWN0dXJlLiAgVGhlc2UKLSAgIHJvdXRpbmVzIHN3YXAgdGhpcyBzdHJ1Y3R1cmUgaW4gYW5kIG91dC4gIFRoZXkgYXJlIHVzZWQgb3V0c2lkZSBvZgotICAgQkZELCBzbyB0aGV5IGFyZSBnbG9iYWxseSB2aXNpYmxlLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjMyX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLXZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9SZWdJbmZvICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1swXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMV0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzJdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1szXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwX3ZhbHVlLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotLyogSW4gdGhlIDY0IGJpdCBBQkksIHRoZSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaG9sZHMgcmVnaXN0ZXIKLSAgIGluZm9ybWF0aW9uIGluIGFuIEVsZjY0X1JlZ2luZm8gc3RydWN0dXJlLiAgVGhlc2Ugcm91dGluZXMgc3dhcAotICAgdGhlbSBpbiBhbmQgb3V0LiAgVGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQKLSAgIG91dHNpZGUgb2YgQkZELiAgVGhlc2Ugcm91dGluZXMgYXJlIGhlcmUgc28gdGhhdCBnYXMgY2FuIGNhbGwgdGhlbQotICAgd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGV0aGVyIHRoZSA2NCBiaXQgQUJJIGhhcyBiZWVuIGluY2x1ZGVkLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotewotICBpbi0+cmlfZ3BybWFzayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgaW4tPnJpX3BhZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9wYWQpOwotICBpbi0+cmlfY3BybWFza1swXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBpbi0+cmlfY3BybWFza1szXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgaW4tPnJpX2dwX3ZhbHVlID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotdm9pZAotYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKmluOwotICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwcm1hc2ssCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9wYWQsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLS8qIFN3YXAgYW4gZW50cnkgaW4gYSAuZ3B0YWIgc2VjdGlvbi4gIE5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyByZWx5Ci0gICBvbiB0aGUgZXF1aXZhbGVuY2Ugb2YgdGhlIHR3byBlbGVtZW50cyBvZiB0aGUgdW5pb24uICAqLwotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKLSAgICAgRWxmMzJfZ3B0YWIgKmluOwotewotICBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX2dwdGFiICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfZ192YWx1ZSwKLQkJZXgtPmd0X2VudHJ5Lmd0X2dfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+Z3RfZW50cnkuZ3RfYnl0ZXMsCi0JCWV4LT5ndF9lbnRyeS5ndF9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jb21wYWN0X3JlbCAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMSwgZXgtPmlkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5udW0sIGV4LT5udW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+aWQyLCBleC0+aWQyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPm9mZnNldCwgZXgtPm9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yZXNlcnZlZDAsIGV4LT5yZXNlcnZlZDApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQxLCBleC0+cmVzZXJ2ZWQxKTsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9jcmluZm8gKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKmV4OwotewotICB1bnNpZ25lZCBsb25nIGw7Ci0KLSAgbCA9ICgoKGluLT5jdHlwZSAmIENSSU5GT19DVFlQRSkgPDwgQ1JJTkZPX0NUWVBFX1NIKQotICAgICAgIHwgKChpbi0+cnR5cGUgJiBDUklORk9fUlRZUEUpIDw8IENSSU5GT19SVFlQRV9TSCkKLSAgICAgICB8ICgoaW4tPmRpc3QydG8gJiBDUklORk9fRElTVDJUTykgPDwgQ1JJTkZPX0RJU1QyVE9fU0gpCi0gICAgICAgfCAoKGluLT5yZWx2YWRkciAmIENSSU5GT19SRUxWQUREUikgPDwgQ1JJTkZPX1JFTFZBRERSX1NIKSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGwsIGV4LT5pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmtvbnN0LCBleC0+a29uc3QpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+dmFkZHIsIGV4LT52YWRkcik7Ci19Ci0KLS8qIFN3YXAgaW4gYW4gb3B0aW9ucyBoZWFkZXIuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OwotICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqaW47Ci17Ci0gIGluLT5raW5kID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5raW5kKTsKLSAgaW4tPnNpemUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXgtPnNpemUpOwotICBpbi0+c2VjdGlvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXgtPnNlY3Rpb24pOwotICBpbi0+aW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmluZm8pOwotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpb25zIGhlYWRlci4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOwotICAgICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+a2luZCwgZXgtPmtpbmQpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPnNpemUsIGV4LT5zaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+c2VjdGlvbiwgZXgtPnNlY3Rpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pbmZvLCBleC0+aW5mbyk7Ci19Ci0jaWYgMAotLyogU3dhcCBpbiBhbiBNU1lNIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX21zeW1faW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9FeHRlcm5hbF9Nc3ltICpleDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSAqaW47Ci17Ci0gIGluLT5tc19oYXNoX3ZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+bXNfaGFzaF92YWx1ZSk7Ci0gIGluLT5tc19pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+bXNfaW5mbyk7Ci19Ci0jZW5kaWYKLS8qIFN3YXAgb3V0IGFuIE1TWU0gZW50cnkuICAqLwotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9Nc3ltICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPm1zX2hhc2hfdmFsdWUsIGV4LT5tc19oYXNoX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+bXNfaW5mbywgZXgtPm1zX2luZm8pOwotfQotCi0MCi0vKiBEZXRlcm1pbmUgd2hldGhlciBhIHN5bWJvbCBpcyBnbG9iYWwgZm9yIHRoZSBwdXJwb3NlcyBvZiBzcGxpdHRpbmcKLSAgIHRoZSBzeW1ib2wgdGFibGUgaW50byBnbG9iYWwgc3ltYm9scyBhbmQgbG9jYWwgc3ltYm9scy4gIEF0IGxlYXN0Ci0gICBvbiBJcml4IDUsIHRoaXMgc3BsaXQgbXVzdCBiZSBiZXR3ZWVuIHNlY3Rpb24gc3ltYm9scyBhbmQgYWxsIG90aGVyCi0gICBzeW1ib2xzLiAgT24gbW9zdCBFTEYgdGFyZ2V0cyB0aGUgc3BsaXQgaXMgYmV0d2VlbiBzdGF0aWMgc3ltYm9scwotICAgYW5kIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICByZXR1cm4gKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAgPyB0cnVlIDogZmFsc2U7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIE1JUFMgRUxGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBJcml4IDUgYW5kIDYgaXMgYnJva2VuLiAgT2JqZWN0IGZpbGUgc3ltYm9sIHRhYmxlcyBhcmUgbm90IGFsd2F5cwotICAgICBzb3J0ZWQgY29ycmVjdGx5IHN1Y2ggdGhhdCBsb2NhbCBzeW1ib2xzIHByZWNlZGUgZ2xvYmFsIHN5bWJvbHMsCi0gICAgIGFuZCB0aGUgc2hfaW5mbyBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGlzIG5vdCBhbHdheXMgcmlnaHQuICAqLwotICBlbGZfYmFkX3N5bXRhYiAoYWJmZCkgPSB0cnVlOwotCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21pcHMsCi0JCQkgICAgIGVsZl9taXBzX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTUlQUyBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNSVBTIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xIHwgRV9NSVBTX01BQ0hfMzkwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTExOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDY1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotCi0gIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBmb3IgLmdwdGFiIHNlY3Rpb25zIGFuZCBvdGhlciBhcHByb3ByaWF0ZQotICAgICBpbmZvIGZvciBlYWNoIHNwZWNpYWwgc2VjdGlvbi4gICovCi0gIGZvciAoaSA9IDEsIGhkcnBwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKSArIDE7Ci0gICAgICAgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotICAgICAgIGkrKywgaGRycHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCgqaGRycHApLT5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9NSVBTX01TWU06Ci0JY2FzZSBTSFRfTUlQU19MSUJMSVNUOgotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0JICBpZiAoc2VjICE9IE5VTEwpCi0JICAgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfR1BUQUI6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDEpOwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19DT05URU5UOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5jb250ZW50IiwKLQkJCQkgIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSA9PSAwKTsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgbmFtZSArIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGlibGlzdCIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0VWRU5UUzoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTCk7Ci0JICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDApCi0JICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICBuYW1lICsgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkJCSAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgPT0gMCk7Ci0JICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCSAgICAgKG5hbWUKLQkJCQkJICAgICAgKyBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpKTsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JfQotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9uIHRvIGtlZXAgTUlQUyBzcGVjaWZpYyBmaWxlIGZsYWdzIGxpa2UgYXMgRUZfTUlQU19QSUMuICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBvazsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IG5ld19mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLQotICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotCi0gIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9rID0gdHJ1ZTsKLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19QSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19DUElDOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSB0aGUgSVNBJ3MuICovCi0gIGlmICgobmV3X2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpCi0gICAgICAhPSAob2xkX2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpKQotICAgIHsKLSAgICAgIGludCBuZXdfbWFjaCA9IG5ld19mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBvbGRfbWFjaCA9IG9sZF9mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBuZXdfaXNhID0gZWxmX21pcHNfaXNhIChuZXdfZmxhZ3MpOwotICAgICAgaW50IG9sZF9pc2EgPSBlbGZfbWlwc19pc2EgKG9sZF9mbGFncyk7Ci0KLSAgICAgIC8qIElmIGVpdGhlciBoYXMgbm8gbWFjaGluZSBzcGVjaWZpZWQsIGp1c3QgY29tcGFyZSB0aGUgZ2VuZXJhbCBpc2Ency4KLQkgU29tZSBjb21iaW5hdGlvbnMgb2YgbWFjaGluZXMgYXJlIG9rLCBpZiB0aGUgaXNhJ3MgbWF0Y2guICovCi0gICAgICBpZiAoISBuZXdfbWFjaCAKLQkgIHx8ICEgb2xkX21hY2gKLQkgIHx8IG5ld19tYWNoID09IG9sZF9tYWNoCi0JICApCi0JewotCSAgLyogRG9uJ3Qgd2FybiBhYm91dCBtaXhpbmcgLW1pcHMxIGFuZCAtbWlwczIgY29kZSwgb3IgbWl4aW5nIC1taXBzMwotCSAgICAgYW5kIC1taXBzNCBjb2RlLiAgVGhleSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgc2FtZSBkYXRhIHNpemVzIGFuZAotCSAgICAgY2FsbGluZyBjb252ZW50aW9ucy4gICovCi0KLQkgIGlmICgobmV3X2lzYSA9PSAxIHx8IG5ld19pc2EgPT0gMikKLQkgICAgICA/IChvbGRfaXNhICE9IDEgJiYgb2xkX2lzYSAhPSAyKQotCSAgICAgIDogKG9sZF9pc2EgPT0gMSB8fCBvbGRfaXNhID09IDIpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBuZXdfaXNhLCBvbGRfaXNhKTsKLQkgICAgICBvayA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfbWFjaCAobmV3X2ZsYWdzKSwKLQkgICAgIGVsZl9taXBzX21hY2ggKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIG5ld19mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgQUJJJ3MuICBUaGUgNjQtYml0IEFCSSBkb2VzIG5vdCB1c2UgRUZfTUlQU19BQkkuICBCdXQsIGl0Ci0gICAgIGRvZXMgc2V0IEVJX0NMQVNTIGRpZmZlcmVudGx5IGZyb20gYW55IDMyLWJpdCBBQkkuICAqLwotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgICB8fCAoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCSAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGVycm9yIGlmIGJvdGggYXJlIHNldCAodG8gZGlmZmVyZW50IHZhbHVlcykuICovCi0gICAgICBpZiAoKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgJiYgKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKSkKLQkgIHx8IChlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gCi0JICAgICAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBBQkkgbWlzbWF0Y2g6IGxpbmtpbmcgJXMgbW9kdWxlIHdpdGggcHJldmlvdXMgJXMgbW9kdWxlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAob2JmZCkpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICB9Ci0KLSAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksICh1bnNpZ25lZCBsb25nKSBuZXdfZmxhZ3MsCi0JICh1bnNpZ25lZCBsb25nKSBvbGRfZmxhZ3MpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PMzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU8zMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX082NCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TzY0XSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9FQUJJNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPUVBQkk2NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmkgdW5rbm93bl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV9OMzJfUCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU4zMl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9NjRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm8gYWJpIHNldF0iKSk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMV0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzM10iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzNF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFt1bmtub3duIElTQV0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU18zMkJJVE1PREUpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbMzJiaXRtb2RlXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vdCAzMmJpdG1vZGVdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhhbmRsZSBhIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgVGhpcyByb3V0aW5lIHN1cHBvcnRzIGJvdGggdGhlIDMyLWJpdCBhbmQgNjQtYml0IEVMRiBBQkkuCi0KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gMDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19HUFRBQjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfVUNPREU6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gU0VDX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBmbGFncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCByZWNvcmQgc2hfaW5mbyBmb3IgYSAuZ3B0YWIgc2VjdGlvbi4gICovCi0KLSAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KLSAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKLSAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gIFRoZSAucmVnaW5mbyBzZWN0aW9uCi0gICAgIGlzIG5vdCB1c2VkIGluIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKLSAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOwotICAgIH0KLQotICAvKiBGb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24sIGxvb2sgZm9yIGEgT0RLX1JFR0lORk8gZW50cnksIGFuZAotICAgICBzZXQgdGhlIGdwIHZhbHVlIGJhc2VkIG9uIHdoYXQgd2UgZmluZC4gIFdlIG1heSBzZWUgYm90aAotICAgICBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TL09ES19SRUdJTkZPOyBpbiB0aGF0IGNhc2UsCi0gICAgIHRoZXkgc2hvdWxkIGFncmVlLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIGhkci0+c2hfc2l6ZSkpCi0JewotCSAgZnJlZSAoY29udGVudHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIGludHJlZzsKLQotCSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotCQkoYWJmZCwKLQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKLQkJICZpbnRyZWcpOwotCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmMzJfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIE1JUFMgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19MSUJMSVNUOwotICAgICAgaGRyLT5zaF9pbmZvID0gc2VjLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZjMyX0xpYik7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0NPTkZMSUNUOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0dQVEFCOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0gICAgICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIudWNvZGUiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1VDT0RFOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19ERUJVRzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5tZGVidWcgc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19SRUdJTkZPOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMHgxOC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0JICAgJiYgKHN0cmNtcCAobmFtZSwgIi5oYXNoIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluYW1pYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApKQotICAgIHsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDA7Ci0jaWYgMAotICAgICAgLyogVGhpcyBpc24ndCBob3cgdGhlIElyaXggNiBsaW5rZXIgYmVoYXZlcy4gICovCi0gICAgICBoZHItPnNoX2luZm8gPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19HUFJFTDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuaW50ZXJmYWNlcyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfSUZBQ0U7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHN0cmxlbiAoIi5NSVBTLmNvbnRlbnQiKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05URU5UOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfT1BUSU9OUzsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RXQVJGOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1NZTUJPTF9MSUI7Ci0gICAgICAvKiBUaGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgYXJlIHNldCBpbgotICAgICAgICAgZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfRVZFTlRTOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTVNZTTsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gODsKLSAgICB9Ci0KLSAgLyogVGhlIGdlbmVyaWMgZWxmX2Zha2Vfc2VjdGlvbnMgd2lsbCBzZXQgdXAgUkVMX0hEUiB1c2luZyB0aGUKLSAgICAgZGVmYXVsdCBraW5kIG9mIHJlbG9jYXRpb25zLiAgQnV0LCB3ZSBtYXkgYWN0dWFsbHkgbmVlZCBib3RoCi0gICAgIGtpbmRzIG9mIHJlbG9jYXRpb25zLCBzbyB3ZSBzZXQgdXAgdGhlIHNlY29uZCBoZWFkZXIgaGVyZS4gICovCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZDsKLQotICAgICAgZXNkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVzZC0+cmVsX2hkcjIgPT0gTlVMTCk7Ci0gICAgICBlc2QtPnJlbF9oZHIyIAotCT0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLSAgICAgIGlmICghZXNkLT5yZWxfaGRyMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgKGFiZmQsIGVzZC0+cmVsX2hkcjIsIHNlYywKLQkJCQkhZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dXNlX3JlbGFfcCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gIFRoaXMgaXMgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLgotICAgQWN0dWFsbHksIGl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgdGhlIDY0LWJpdCBBQkkgc3VwcG9ydHMgdGhlc2UsCi0gICBidXQgZm9yIG5vbi1QSUMgb2JqZWN0cyB3ZSB3aWxsIGNlcnRhaW5seSB3YW50IHN1cHBvcnQgZm9yIGF0IGxlYXN0Ci0gICB0aGUgLnNjb21tb24gc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKLSAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCi0gICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTwotICAgICAgJiYgaGRyLT5zaF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+Y29udGVudHMgPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIGhkci0+c2hfb2Zmc2V0ICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQsCi0JCSAgICBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgZWxmX2dwIChhYmZkKSwgYnVmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgKGJmZF9zaXplX3R5cGUpIDEsIChiZmRfc2l6ZV90eXBlKSA0LCBhYmZkKSAhPSA0KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBidWZbOF07Ci0KLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCQkgICAgKGhkci0+c2hfb2Zmc2V0Ci0JCQkgICAgICsgKGwgLSBjb250ZW50cykKLQkJCSAgICAgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIChzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pIC0gOCkpLAotCQkJICAgICBTRUVLX1NFVCkgPT0gLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBiZmRfaF9wdXRfNjQgKGFiZmQsIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkJICAgIChoZHItPnNoX29mZnNldAotCQkJICAgICArIChsIC0gY29udGVudHMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQpKSwKLQkJCSAgICAgU0VFS19TRVQpID09IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICB9Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwCi0JICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQl7Ci0JICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9NSVBTX0dQUkVMOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyA9IDA7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJ0cHJvYyIpID09IDApCi0JewotCSAgaWYgKGhkci0+c2hfYWRkcmFsaWduICE9IDAgJiYgaGRyLT5zaF9lbnRzaXplID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWRqdXN0OwotCi0JICAgICAgYWRqdXN0ID0gaGRyLT5zaF9zaXplICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgaWYgKGFkanVzdCAhPSAwKQotCQloZHItPnNoX3NpemUgKz0gaGRyLT5zaF9hZGRyYWxpZ24gLSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBNSVBTIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgVGhpcyBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlY29mZi5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIE1JUFMgRUxGIGFsc28gdXNlcyBhbiBhY29tbW9uIHNlY3Rpb24sIHdoaWNoIHJlcHJlc2VudHMgYW4KLSAgIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLSAgIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCi0vKiBUaGUgSXJpeCA1IHN1cHBvcnQgdXNlcyB0d28gdmlydHVhbCBzZWN0aW9ucywgd2hpY2ggcmVwcmVzZW50Ci0gICB0ZXh0L2RhdGEgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLgotICAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotdm9pZAotX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGUuCi0JIEl0IGlzIGFuIGFsbG9jYXRlZCBjb21tb24gc2VjdGlvbi4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4KLQkgZWl0aGVyIHJlc29sdmUgdGhlc2Ugc3ltYm9scyB0byBzb21ldGhpbmcgaW4gYSBzaGFyZWQKLQkgbGlicmFyeSwgb3IgaXQgY2FuIGp1c3QgbGVhdmUgdGhlbSBoZXJlLiAgRm9yIG91ciBwdXJwb3NlcywKLQkgd2UgY2FuIGNvbnNpZGVyIHRoZXNlIHN5bWJvbHMgdG8gYmUgaW4gYSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBhY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0FMTE9DOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMgb24gSVJJWDUuICAqLwotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWxmX2dwX3NpemUgKGFiZmQpCi0JICB8fCBJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICBpZiAobWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotI2lmIDAgLyogZm9yIFNHSV9DT01QQVQgKi8KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLX0KLQwKLS8qIFdoZW4gY3JlYXRpbmcgYW4gSXJpeCA1IGV4ZWN1dGFibGUsIHdlIG5lZWQgUkVHSU5GTyBhbmQgUlRQUk9DCi0gICBzZWdtZW50cy4gICovCi0KLWludAotX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgaWYgKCFTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTyBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpKQotICAgICsrcmV0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19PUFRJT05TIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIAotCQkJCSAgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSkKLSAgICArK3JldDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUlRQUk9DIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NQotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpCi0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKSkKLSAgICArK3JldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBNb2RpZnkgdGhlIHNlZ21lbnQgbWFwIGZvciBhbiBJcml4IDUgZXhlY3V0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmICghIFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgLnJlZ2luZm8gc2VjdGlvbiwgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTwotICAgICBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+cF90eXBlID09IFBUX01JUFNfUkVHSU5GTykKLQkgIGJyZWFrOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQl7Ci0JICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgbS0+cF90eXBlID0gUFRfTUlQU19SRUdJTkZPOwotCSAgbS0+Y291bnQgPSAxOwotCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0JICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgUEhEUiBhbmQgSU5URVJQIHNlZ21lbnRzLiAgKi8KLQkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgd2hpbGUgKCpwbSAhPSBOVUxMCi0JCSAmJiAoKCpwbSktPnBfdHlwZSA9PSBQVF9QSERSCi0JCSAgICAgfHwgKCpwbSktPnBfdHlwZSA9PSBQVF9JTlRFUlApKQotCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgbS0+bmV4dCA9ICpwbTsKLQkgICpwbSA9IG07Ci0JfQotICAgIH0KLQotICAvKiBGb3IgSVJJWCA2LCB3ZSBkb24ndCBoYXZlIC5tZGVidWcgc2VjdGlvbnMsIG5vciBkb2VzIGFueXRoaW5nIGJ1dAotICAgICAuZHluYW1pYyBlbmQgdXAgaW4gUFRfRFlOQU1JQy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaW5zZXJ0IGEKLSAgICAgUFRfT1BUSU9OUyBzZWdlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIHRhYmxlLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKLQkgIGJyZWFrOwotCi0gICAgICBpZiAocykKLQl7Ci0JICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpvcHRpb25zX3NlZ21lbnQ7Ci0KLQkgIC8qIFVzdWFsbHksIHRoZXJlJ3MgYSBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEJ1dCwgc29tZXRpbWVzCi0JICAgICB0aGVyZSdzIG5vdCAobGlrZSB3aGVuIHJ1bm5pbmcgdGhlIGBsZCcgdGVzdHN1aXRlKS4gIFNvLAotCSAgICAgaWYgdGhlcmUncyBubyBwcm9ncmFtIGhlYWRlciB0YWJsZSwgd2UganVzdCBwdXQgdGhlCi0JICAgICBvcHRpb25zIHNlZ2VtZW50IGF0IHRoZSBlbmQuICAqLwotCSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgCi0JICAgICAgICpwbSAhPSBOVUxMOwotCSAgICAgICBwbSA9ICYoKnBtKS0+bmV4dCkKLQkgICAgaWYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUikKLQkgICAgICBicmVhazsKLQotCSAgb3B0aW9uc19zZWdtZW50ID0gYmZkX3phbGxvYyAoYWJmZCwgCi0JCQkJCXNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpOwotCSAgb3B0aW9uc19zZWdtZW50LT5uZXh0ID0gKnBtOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX3R5cGUgPSBQVF9NSVBTX09QVElPTlM7Ci0JICBvcHRpb25zX3NlZ21lbnQtPnBfZmxhZ3MgPSBQRl9SOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzX3ZhbGlkID0gdHJ1ZTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+Y291bnQgPSAxOwotCSAgb3B0aW9uc19zZWdtZW50LT5zZWN0aW9uc1swXSA9IHM7Ci0JICAqcG0gPSBvcHRpb25zX3NlZ21lbnQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSAuZHluYW1pYyBhbmQgLm1kZWJ1ZyBzZWN0aW9ucywgd2UgbWFrZSBhIHJvb20KLQkgZm9yIHRoZSBSVFBST0MgaGVhZGVyLiAgRklYTUU6IFJld3JpdGUgd2l0aG91dCBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKSA9PSBOVUxMCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTAotCSAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQkgICAgaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JUUFJPQykKLQkgICAgICBicmVhazsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgICAgICBpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtLT5wX3R5cGUgPSBQVF9NSVBTX1JUUFJPQzsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQl7Ci0JCSAgbS0+Y291bnQgPSAwOwotCQkgIG0tPnBfZmxhZ3MgPSAwOwotCQkgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbS0+Y291bnQgPSAxOwotCQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQkJfQotCi0JICAgICAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIERZTkFNSUMgc2VnbWVudC4gICovCi0JICAgICAgcG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7Ci0JICAgICAgd2hpbGUgKCpwbSAhPSBOVUxMICYmICgqcG0pLT5wX3R5cGUgIT0gUFRfRFlOQU1JQykKLQkJcG0gPSAmKCpwbSktPm5leHQ7Ci0JICAgICAgaWYgKCpwbSAhPSBOVUxMKQotCQlwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgICAgIG0tPm5leHQgPSAqcG07Ci0JICAgICAgKnBtID0gbTsKLQkgICAgfQotCX0KLQotICAgICAgLyogT24gSXJpeCA1LCB0aGUgUFRfRFlOQU1JQyBzZWdtZW50IGluY2x1ZGVzIHRoZSAuZHluYW1pYywKLQkgLmR5bnN0ciwgLmR5bnN5bSwgYW5kIC5oYXNoIHNlY3Rpb25zLCBhbmQgZXZlcnl0aGluZyBpbgotCSBiZXR3ZWVuLiAgKi8KLSAgICAgIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKLQlpZiAoKCpwbSktPnBfdHlwZSA9PSBQVF9EWU5BTUlDKQotCSAgYnJlYWs7Ci0gICAgICBtID0gKnBtOwotICAgICAgaWYgKG0gIT0gTlVMTAotCSAgJiYgbS0+Y291bnQgPT0gMQotCSAgJiYgc3RyY21wIChtLT5zZWN0aW9uc1swXS0+bmFtZSwgIi5keW5hbWljIikgPT0gMCkKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWVzW10gPQotCSAgeyAiLmR5bmFtaWMiLCAiLmR5bnN0ciIsICIuZHluc3ltIiwgIi5oYXNoIiB9OwotCSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0JICB1bnNpZ25lZCBpbnQgaSwgYzsKLQkgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm47Ci0KLQkgIGxvdyA9IDB4ZmZmZmZmZmY7Ci0JICBoaWdoID0gMDsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Ygc2VjX25hbWVzIC8gc2l6ZW9mIHNlY19uYW1lc1swXTsgaSsrKQotCSAgICB7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWNfbmFtZXNbaV0pOwotCSAgICAgIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JCSAgaWYgKGxvdyA+IHMtPnZtYSkKLQkJICAgIGxvdyA9IHMtPnZtYTsKLQkJICBzeiA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBpZiAoc3ogPT0gMCkKLQkJICAgIHN6ID0gcy0+X3Jhd19zaXplOwotCQkgIGlmIChoaWdoIDwgcy0+dm1hICsgc3opCi0JCSAgICBoaWdoID0gcy0+dm1hICsgc3o7Ci0JCX0KLQkgICAgfQotCi0JICBjID0gMDsKLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJJiYgcy0+dm1hID49IGxvdwotCQkmJiAoKHMtPnZtYQotCQkgICAgICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKLQkJICAgIDw9IGhpZ2gpKQotCSAgICAgICsrYzsKLQotCSAgbiA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm4gKyAoYyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKm4gPSAqbTsKLQkgIG4tPmNvdW50ID0gYzsKLQotCSAgaSA9IDA7Ci0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkgICYmIHMtPnZtYSA+PSBsb3cKLQkJICAmJiAoKHMtPnZtYQotCQkgICAgICAgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPwotCQkJICBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQotCQkgICAgICA8PSBoaWdoKSkKLQkJewotCQkgIG4tPnNlY3Rpb25zW2ldID0gczsKLQkJICArK2k7Ci0JCX0KLQkgICAgfQotCi0JICAqcG0gPSBuOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlCi0gICBsb2FkZXIgZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uICAqLwotCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLQotLyogU3dhcCBSUERSIChydW50aW1lIHByb2NlZHVyZSB0YWJsZSBlbnRyeSkgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcnBkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFJQRFIgKiwgc3RydWN0IHJwZHJfZXh0ICopKTsKLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcnBkcl9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBSUERSICppbjsKLSAgICAgc3RydWN0IHJwZHJfZXh0ICpleDsKLXsKLSAgLyogZWNvZmZfcHV0X29mZiB3YXMgZGVmaW5lZCBpbiBlY29mZnN3YXAuaC4gICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5hZHIsIChiZmRfYnl0ZSAqKSBleC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5yZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVvZmZzZXQpOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5wY3JlZywgKGJmZF9ieXRlICopIGV4LT5wX3BjcmVnKTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pcnBzcywgKGJmZF9ieXRlICopIGV4LT5wX2lycHNzKTsKLSNpZiAwIC8qIEZJWE1FICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5leGNlcHRpb25faW5mbywgKGJmZF9ieXRlICopIGV4LT5wX2V4Y2VwdGlvbl9pbmZvKTsKLSNlbmRpZgotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIHNlY3Rpb24sIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGNoYXIgKmV4dF9oZHIgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIG1lbXNldCAoZGVidWcsIDAsIHNpemVvZigqZGVidWcpKTsKLQotICBleHRfaGRyID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoZXh0X2hkciA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZXh0X2hkciwgKGZpbGVfcHRyKSAwLAotCQkJCXN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgICAgPT0gZmFsc2UpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gICgqc3dhcC0+c3dhcF9oZHJfaW4pIChhYmZkLCBleHRfaGRyLCBzeW1oZHIpOwotCi0gIC8qIFRoZSBzeW1ib2xpYyBoZWFkZXIgY29udGFpbnMgYWJzb2x1dGUgZmlsZSBvZmZzZXRzIGFuZCBzaXplcyB0bwotICAgICByZWFkLiAgKi8KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlhYmZkKSAhPSBzaXplICogc3ltaGRyLT5jb3VudCkpCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICB9Ci0KLSAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIHVuc2lnbmVkIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JdW5pb24gYXV4X2V4dCAqKTsKLSAgUkVBRCAoc3MsIGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoc3NleHQsIGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZXh0LCBjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIFBUUik7Ci0jdW5kZWYgUkVBRAotCi0gIGRlYnVnLT5mZHIgPSBOVUxMOwotICBkZWJ1Zy0+YWRqdXN0ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dF9oZHIgIT0gTlVMTCkKLSAgICBmcmVlIChleHRfaGRyKTsKLSAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmxpbmUpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2RuciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9kbnIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICBpZiAoZGVidWctPmV4dGVybmFsX29wdCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9vcHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzKTsKLSAgaWYgKGRlYnVnLT5zc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zc2V4dCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3JmZCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIE1JUFMgRUxGIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICckJywgbm90ICdMJy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJyQnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE9uIElyaXggNiwgdGhlIGxhYmVscyBnbyBiYWNrIHRvIHN0YXJ0aW5nIHdpdGggJy4nLCBzbyB3ZSBhY2NlcHQKLSAgICAgdGhlIGdlbmVyaWMgRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLiAgKi8KLSAgcmV0dXJuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0vKiBNSVBTIEVMRiB1c2VzIGEgc3BlY2lhbCBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lIGluIG9yZGVyIHRoZQotICAgaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lCi17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGQ7Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgaTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgCi0JCQkJICAgICBBQklfNjRfUCAoYWJmZCkgPyA4IDogMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpOwotICBpZiAobXNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIG9yaWdmbGFnczsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpOwotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBzd2FwID0KLQlnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZHVyaW5nIGEgbGluaywgbWlwc19lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotICAvKiBUaGUgbWlwczE2IGNvbXBpbGVyIHVzZXMgYSBjb3VwbGUgb2Ygc3BlY2lhbCBzZWN0aW9ucyB0byBoYW5kbGUKLSAgICAgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5mbi5GTk5BTUUgY29udGFpbiBzdHVicyB0aGF0Ci0gICAgIGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGZyb20gdGhlIGZwIHJlZ3MgdG8gdGhlIGdwIHJlZ3MgYW5kCi0gICAgIHRoZW4ganVtcCB0byBGTk5BTUUuICBJZiBhbnkgMzIgYml0IGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlCi0gICAgIGNhbGwgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIG5vIDMyIGJpdAotICAgICBmdW5jdGlvbiBjYWxscyBGTk5BTUUsIHRoZSBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuICBXZSBuZWVkIHRvCi0gICAgIGNvbnNpZGVyIGFueSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uLCBub3QganVzdCBhIGNhbGwsIGJlY2F1c2UKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGlzIHRha2VuIHdlIHdpbGwgbmVlZCB0aGUgc3R1YiwKLSAgICAgc2luY2UgdGhlIGFkZHJlc3MgbWlnaHQgYmUgcGFzc2VkIHRvIGEgMzIgYml0IGZ1bmN0aW9uLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5jYWxsLkZOTkFNRSBjb250YWluIHN0dWJzCi0gICAgIHRoYXQgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZ3AgcmVncyB0byB0aGUgZnAKLSAgICAgcmVncyBhbmQgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIEZOTkFNRSBpcyBhIDMyIGJpdCBmdW5jdGlvbiwKLSAgICAgdGhlbiBhbnkgMTYgYml0IGZ1bmN0aW9uIHRoYXQgY2FsbHMgRk5OQU1FIHNob3VsZCBiZSByZWRpcmVjdGVkCi0gICAgIHRvIHRoZSBzdHViIGluc3RlYWQuICBJZiBGTk5BTUUgaXMgbm90IGEgMzIgYml0IGZ1bmN0aW9uLCB0aGUKLSAgICAgc3R1YiBzaG91bGQgYmUgZGlzY2FyZGVkLgotCi0gICAgIC5taXBzMTYuY2FsbC5mcC5GTk5BTUUgc2VjdGlvbnMgYXJlIHNpbWlsYXIsIGJ1dCBjb250YWluIHN0dWJzCi0gICAgIHdoaWNoIGNhbGwgRk5OQU1FIGFuZCB0aGVuIGNvcHkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmcCByZWdzCi0gICAgIHRvIHRoZSBncCByZWdzLiAgVGhlc2Ugc3R1YnMgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBpbiAkMTggd2hpbGUKLSAgICAgY2FsbGluZyBGTk5BTUU7IGFueSBmdW5jdGlvbiB3aGljaCBtaWdodCBjYWxsIG9uZSBvZiB0aGVzZSBzdHVicwotICAgICBtdXN0IGFycmFuZ2UgdG8gc2F2ZSAkMTggYXJvdW5kIHRoZSBjYWxsLiAgKFRoaXMgY2FzZSBpcyBub3QKLSAgICAgbmVlZGVkIGZvciAzMiBiaXQgZnVuY3Rpb25zIHRoYXQgY2FsbCAxNiBiaXQgZnVuY3Rpb25zLCBiZWNhdXNlCi0gICAgIDE2IGJpdCBmdW5jdGlvbnMgYWx3YXlzIHJldHVybiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gYm90aAotICAgICAkZjAvJGYxIGFuZCAkMi8kMy4pCi0KLSAgICAgTm90ZSB0aGF0IGluIGFsbCBjYXNlcyBGTk5BTUUgbWlnaHQgYmUgZGVmaW5lZCBzdGF0aWNhbGx5LgotICAgICBUaGVyZWZvcmUsIEZOTkFNRSBpcyBub3QgdXNlZCBsaXRlcmFsbHkuICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbgotICAgICBpbmZvcm1hdGlvbiB3aWxsIGluZGljYXRlIHdoaWNoIHN5bWJvbCB0aGUgc2VjdGlvbiBpcyBmb3IuCi0KLSAgICAgV2UgcmVjb3JkIGFueSBzdHVicyB0aGF0IHdlIGZpbmQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLSNkZWZpbmUgRk5fU1RVQiAiLm1pcHMxNi5mbi4iCi0jZGVmaW5lIENBTExfU1RVQiAiLm1pcHMxNi5jYWxsLiIKLSNkZWZpbmUgQ0FMTF9GUF9TVFVCICIubWlwczE2LmNhbGwuZnAuIgotCi0vKiBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSNpZiAwCi0gIC8qIFdlIG5vIGxvbmdlciB1c2UgdGhpcy4gICovCi0gIC8qIFN0cmluZyBzZWN0aW9uIGluZGljZXMgZm9yIHRoZSBkeW5hbWljIHNlY3Rpb24gc3ltYm9scy4gICovCi0gIGJmZF9zaXplX3R5cGUgZHluc3ltX3NlY19zdHJpbmRleFtTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVNdOwotI2VuZGlmCi0gIC8qIFRoZSBudW1iZXIgb2YgLnJ0cHJvYyBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBwcm9jZWR1cmVfY291bnQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSAuY29tcGFjdF9yZWwgc2VjdGlvbiAoaWYgU0dJX0NPTVBBVCkuICAqLwotICBiZmRfc2l6ZV90eXBlIGNvbXBhY3RfcmVsX3NpemU7Ci0gIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgRFRfTUlQU19STERfTUFQIGR5bmFtaWMKLSAgICAgZW50cnkgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIF9fcmxkX29ial9oZWFkIGFzIGluIElyaXggNS4gKi8KLSAgYm9vbGVhbiB1c2VfcmxkX29ial9oZWFkOwotICAvKiBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgX19ybGRfbWFwIG9yIF9fcmxkX29ial9oZWFkIHN5bWJvbC4gICovCi0gIGJmZF92bWEgcmxkX3ZhbHVlOwotICAvKiBUaGlzIGlzIHNldCBpZiB3ZSBzZWUgYW55IG1pcHMxNiBzdHViIHNlY3Rpb25zLiAqLwotICBib29sZWFuIG1pcHMxNl9zdHVic19zZWVuOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1taXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+cG9zc2libHlfZHluYW1pY19yZWxvY3MgPSAwOwotICAgICAgcmV0LT5taW5fZHluX3JlbG9jX2luZGV4ID0gMDsKLSAgICAgIHJldC0+Zm5fc3R1YiA9IE5VTEw7Ci0gICAgICByZXQtPm5lZWRfZm5fc3R1YiA9IGZhbHNlOwotICAgICAgcmV0LT5jYWxsX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5jYWxsX2ZwX3N0dWIgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOyBpKyspCi0gICAgcmV0LT5keW5zeW1fc2VjX3N0cmluZGV4W2ldID0gKGJmZF9zaXplX3R5cGUpIC0xOwotI2VuZGlmCi0gIHJldC0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgcmV0LT5jb21wYWN0X3JlbF9zaXplID0gMDsKLSAgcmV0LT51c2VfcmxkX29ial9oZWFkID0gZmFsc2U7Ci0gIHJldC0+cmxkX3ZhbHVlID0gMDsKLSAgcmV0LT5taXBzMTZfc3R1YnNfc2VlbiA9IGZhbHNlOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCBNSVBTIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfcmxkX25ld19pbnRlcmZhY2UiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNraXAgSXJpeCA1IHJsZCBlbnRyeSBuYW1lLiAgKi8KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMuICAqLwotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSA+IGVsZl9ncF9zaXplIChhYmZkKQotCSAgfHwgSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NikKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLm5hbWUgPSAiLnRleHQiOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfRFlOQU1JQzsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgotICAgICAgLyogRmFsbCB0aHJvdWdoLiBYWFggQ2FuIHdlIHRyZWF0IHRoaXMgYXMgYWxsb2NhdGVkIGRhdGE/ICAqLwotICAgIGNhc2UgU0hOX01JUFNfREFUQToKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAobWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wubmFtZSA9ICIuZGF0YSI7Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9EWU5BTUlDOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLQl9Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKLSAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKLSAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLwotICAgICAgKnNlY3AgPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6Ci0gICAgICAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogTWFyayBfX3JsZF9vYmpfaGVhZCBhcyBkeW5hbWljLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCAqc2VjcCwKLQkgICAgICAoYmZkX3ZtYSkgKnZhbHAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHRleHQgc3ltYm9sLCBhZGQgMSB0byB0aGUgdmFsdWUgdG8gbWFrZSBpdAotICAgICBvZGQuICBUaGlzIHdpbGwgY2F1c2Ugc29tZXRoaW5nIGxpa2UgLndvcmQgU1lNIHRvIGNvbWUgdXAgd2l0aAotICAgICB0aGUgcmlnaHQgdmFsdWUgd2hlbiBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMuICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgICsrKnZhbHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gbWlwc19lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHdyaXRlIG91dCBFQ09GRiBkZWJ1Z2dpbmcgZXh0ZXJuYWwgc3ltYm9sCi0gICBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhbGxlZCB2aWEgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlCi0gICBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gbXVzdCBtYXRjaCB0aGUgRUxGIGV4dGVybmFsCi0gICBzeW1ib2wgaW5mb3JtYXRpb24uICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cKLSAgIHdoZXRoZXIgYSBzeW1ib2wgaXMgcmVxdWlyZWQgYnkgcmVsb2MgaW5mb3JtYXRpb24sIHNvIHRoZSB0d28KLSAgIHRhYmxlcyBtYXkgd2luZCB1cCBiZWluZyBkaWZmZXJlbnQuICBXZSBtdXN0IHNvcnQgb3V0IHRoZSBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubWRlYnVnCi0gICBzZWN0aW9uLCBhbmQgd2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbiBiZWZvcmUgd2UKLSAgIGNhbiByZWxvY2F0ZSBhbnkgc2VjdGlvbnMsIGFuZCB3ZSBjYW4ndCBrbm93IHdoaWNoIHN5bWJvbHMgYXJlCi0gICByZXF1aXJlZCBieSByZWxvY2F0aW9uIHVudGlsIHdlIHJlbG9jYXRlIHRoZSBzZWN0aW9ucy4KLSAgIEZvcnR1bmF0ZWx5LCBpdCBpcyByZWxhdGl2ZWx5IHVubGlrZWx5IHRoYXQgYW55IHN5bWJvbCB3aWxsIGJlCi0gICBzdHJpcHBlZCBidXQgcmVxdWlyZWQgYnkgYSByZWxvYy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBub3QgaGFwcGVuCi0gICB3aGVuIGdlbmVyYXRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBib29sZWFuIHN0cmlwOwotICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKLSAgICB7Ci0gICAgICBoLT5lc3ltLmptcHRibCA9IDA7Ci0gICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOwotICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKLSAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7Ci0KLSAgICAgIGlmIChTR0lfQ09NUEFUIChlaW5mby0+YWJmZCkKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAvKiBVc2UgdW5kZWZpbmVkIGNsYXNzLiAgQWxzbywgc2V0IGNsYXNzIGFuZCB0eXBlIGZvciBzb21lCi0gICAgICAgICAgICAgc3BlY2lhbCBzeW1ib2xzLiAgKi8KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPQotCQltaXBzX2VsZl9oYXNoX3RhYmxlIChlaW5mby0+aW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBlbGZfZ3AgKGVpbmZvLT5hYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCi0JICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLwotCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKLQkJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgICAgIGVsc2UKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JfQotI2lmIDAgLyogRklYTUU/ICAqLwotICAgICAgaC0+ZXN5bS5pZmQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAotCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAmaC0+ZXN5bSkpCi0gICAgewotICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIEhEUlIgKmhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBSUERSICpycGRyLCAqcnA7Ci0gIHN0cnVjdCBycGRyX2V4dCAqZXJwOwotICBQVFIgcnRwcm9jOwotICBzdHJ1Y3QgcGRyX2V4dCAqZXBkcjsKLSAgc3RydWN0IHN5bV9leHQgKmVzeW07Ci0gIGNoYXIgKnNzLCAqKnN2OwotICBjaGFyICpzdHI7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2luZGV4OwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIFBEUiBwZHI7Ci0gIFNZTVIgc3ltOwotICBjb25zdCBjaGFyICpub19uYW1lX2Z1bmMgPSBfKCJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIpOwotCi0gIGVwZHIgPSBOVUxMOwotICBycGRyID0gTlVMTDsKLSAgZXN5bSA9IE5VTEw7Ci0gIHNzID0gTlVMTDsKLSAgc3YgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgc2luZGV4ID0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIGVwZHIgPSAoc3RydWN0IHBkcl9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlcGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCAoUFRSKSBlcGRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2l6ZSA9IHNpemVvZiAoUlBEUik7Ci0gICAgICBycCA9IHJwZHIgPSAoUlBEUiAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKHJwZHIgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3YgPSAoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICogY291bnQpOwotICAgICAgaWYgKHN2ID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pc3ltTWF4OwotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZXN5bSA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKGVzeW0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIChQVFIpIGVzeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXNzTWF4OwotICAgICAgc3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChjb3VudCk7Ci0gICAgICBpZiAoc3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIChQVFIpIHNzKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBycCsrKQotCXsKLQkgICgqc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSAoZXBkciArIGkpLCAmcGRyKTsKLQkgICgqc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSAmZXN5bVtwZHIuaXN5bV0sICZzeW0pOwotCSAgcnAtPmFkciA9IHN5bS52YWx1ZTsKLQkgIHJwLT5yZWdtYXNrID0gcGRyLnJlZ21hc2s7Ci0JICBycC0+cmVnb2Zmc2V0ID0gcGRyLnJlZ29mZnNldDsKLQkgIHJwLT5mcmVnbWFzayA9IHBkci5mcmVnbWFzazsKLQkgIHJwLT5mcmVnb2Zmc2V0ID0gcGRyLmZyZWdvZmZzZXQ7Ci0JICBycC0+ZnJhbWVvZmZzZXQgPSBwZHIuZnJhbWVvZmZzZXQ7Ci0JICBycC0+ZnJhbWVyZWcgPSBwZHIuZnJhbWVyZWc7Ci0JICBycC0+cGNyZWcgPSBwZHIucGNyZWc7Ci0JICBycC0+aXJwc3MgPSBzaW5kZXg7Ci0JICBzdltpXSA9IHNzICsgc3ltLmlzczsKLQkgIHNpbmRleCArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0JfQotICAgIH0KLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMikgKyBzaW5kZXg7Ci0gIHNpemUgPSBCRkRfQUxJR04gKHNpemUsIDE2KTsKLSAgcnRwcm9jID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJ0cHJvYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSAwOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSBjb3VudCArIDI7Ci0KLSAgZXJwID0gKHN0cnVjdCBycGRyX2V4dCAqKSBydHByb2M7Ci0gIG1lbXNldCAoZXJwLCAwLCBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkpOwotICBlcnArKzsKLSAgc3RyID0gKGNoYXIgKikgcnRwcm9jICsgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMik7Ci0gIHN0cmNweSAoc3RyLCBub19uYW1lX2Z1bmMpOwotICBzdHIgKz0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgcnBkciArIGksIGVycCArIGkpOwotICAgICAgc3RyY3B5IChzdHIsIHN2W2ldKTsKLSAgICAgIHN0ciArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0gICAgfQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCAoYmZkX3ZtYSkgLTEsIChiZmRfYnl0ZSAqKSAoZXJwICsgY291bnQpLT5wX2Fkcik7Ci0KLSAgLyogU2V0IHRoZSBzaXplIGFuZCBjb250ZW50cyBvZiAucnRwcm9jIHNlY3Rpb24uICAqLwotICBzLT5fcmF3X3NpemUgPSBzaXplOwotICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBydHByb2M7Ci0KLSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLSAgcy0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChlcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXBkcik7Ci0gIGlmIChycGRyICE9IE5VTEwpCi0gICAgZnJlZSAocnBkcik7Ci0gIGlmIChlc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXN5bSk7Ci0gIGlmIChzcyAhPSBOVUxMKQotICAgIGZyZWUgKHNzKTsKLSAgaWYgKHN2ICE9IE5VTEwpCi0gICAgZnJlZSAoc3YpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGNvbXBhcmlzb24gcm91dGluZSB1c2VkIHRvIHNvcnQgLmdwdGFiIGVudHJpZXMuICAqLwotCi1zdGF0aWMgaW50Ci1ncHRhYl9jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBFbGYzMl9ncHRhYiAqYTEgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDE7Ci0gIGNvbnN0IEVsZjMyX2dwdGFiICphMiA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMjsKLQotICByZXR1cm4gYTEtPmd0X2VudHJ5Lmd0X2dfdmFsdWUgLSBhMi0+Z3RfZW50cnkuZ3RfZ192YWx1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKipzZWNwcDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgYXNlY3Rpb24gKnJ0cHJvY19zZWM7Ci0gIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotICAvKiBJZiBhbGwgdGhlIHRoaW5ncyB3ZSBsaW5rZWQgdG9nZXRoZXIgd2VyZSBQSUMsIGJ1dCB3ZSdyZQotICAgICBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAocmF0aGVyIHRoYW4gYSBzaGFyZWQgb2JqZWN0KSwgdGhlbiB0aGUKLSAgICAgcmVzdWx0aW5nIGZpbGUgaXMgQ1BJQyAoaS5lLiwgaXQgY2FsbHMgUElDIGNvZGUuKSAgKi8KLSAgaWYgKCFpbmZvLT5zaGFyZWQKLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfTUlQU19DUElDOwotICAgIH0KLQotICAvKiBXZSdkIGNhcmVmdWxseSBhcnJhbmdlZCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kaWNlcywgYW5kIHRoZW4gdGhlCi0gICAgIGdlbmVyaWMgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJlbnVtYmVyZWQgdGhlbSBvdXQgZnJvbSB1bmRlciB1cy4KLSAgICAgUmF0aGVyIHRoYW4gdHJ5aW5nIHNvbWVob3cgdG8gcHJldmVudCB0aGUgcmVudW1iZXJpbmcsIGp1c3QgZG8KLSAgICAgdGhlIHNvcnQgYWdhaW4uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqZ290OwotICAgICAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgICAgIC8qIFdoZW4gd2UgcmVzb3J0LCB3ZSBtdXN0IHRlbGwgbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIHdoYXQKLQkgdGhlIGxvd2VzdCBpbmRleCBpdCBtYXkgdXNlIGlzLiAgVGhhdCdzIHRoZSBudW1iZXIgb2Ygc2VjdGlvbgotCSBzeW1ib2xzIHdlJ3JlIGdvaW5nIHRvIGFkZC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgb25seQotCSBhZGRzIHRoZXNlIHN5bWJvbHMgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBvYmplY3QuICBOb3RlIHRoYXQKLQkgd2UgY291bnQgdGhlIHNlY3Rpb25zIGFmdGVyIChwb3NzaWJseSkgcmVtb3ZpbmcgdGhlIC5vcHRpb25zCi0JIHNlY3Rpb24gYWJvdmUuICAqLwotICAgICAgaWYgKCFtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUgKGluZm8sIChpbmZvLT5zaGFyZWQgCi0JCQkJCSAgICA/IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxCi0JCQkJCSAgICA6IDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZGlkbid0IGdyb3cgdGhlIGdsb2JhbCAuZ290IHJlZ2lvbi4gICovCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKGdvdCktPnRkYXRhOwotCi0gICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMKQotCUJGRF9BU1NFUlQgKChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50Ci0JCSAgICAgLSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4KQotCQkgICAgPD0gZy0+Z2xvYmFsX2dvdG5vKTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIG9taXQgdGhlIC5vcHRpb25zIHNlY3Rpb24uICBPbiBJUklYNiwgaG93ZXZlciwgd2UKLSAgICAgaW5jbHVkZSBpdCwgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvY2VzcyBpdCBxdWl0ZSByaWdodC4gIChTb21lCi0gICAgIGVudHJpZXMgYXJlIHN1cHBvc2VkIHRvIGJlIG1lcmdlZC4pICBFbXBpcmljYWxseSwgd2Ugc2VlbSB0byBiZQotICAgICBiZXR0ZXIgb2ZmIGluY2x1ZGluZyBpdCB0aGVuIG5vdC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIGZvciAoc2VjcHAgPSAmYWJmZC0+c2VjdGlvbnM7ICpzZWNwcCAhPSBOVUxMOyBzZWNwcCA9ICYoKnNlY3BwKS0+bmV4dCkKLSAgICAgIHsKLQlpZiAoc3RyY21wICgoKnNlY3BwKS0+bmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotCSAgewotCSAgICBmb3IgKHAgPSAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQlwLT51LmluZGlyZWN0LnNlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkID0gTlVMTDsKLQkgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgICAgCi0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWxmX2dwIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAoYWJmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIEZpbmQgdGhlIEdQLXJlbGF0aXZlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXN0IG9mZnNldC4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgaWYgKG8tPnZtYSA8IGxvIAotCQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLnNoX2ZsYWdzICYgU0hGX01JUFNfR1BSRUwpKQotCSAgICAgIGxvID0gby0+dm1hOwotCi0JICAvKiBBbmQgY2FsY3VsYXRlIEdQIHJlbGF0aXZlIHRvIHRoYXQuICAqLwotCSAgZWxmX2dwIChhYmZkKSA9IGxvICsgRUxGX01JUFNfR1BfT0ZGU0VUIChhYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZWdpbmZvX3NlYyA9IE5VTEw7Ci0gIG1kZWJ1Z19zZWMgPSBOVUxMOwotICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7Ci0gIGdwdGFiX2Jzc19zZWMgPSBOVUxMOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLQl7Ci0JICBtZW1zZXQgKCZyZWdpbmZvLCAwLCBzaXplb2YgcmVnaW5mbyk7Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKLQkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCSAgICAgIEVsZjMyX1JlZ0luZm8gc3ViOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICAvKiBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGhhcyBwcm9iYWJseSBjbG9iYmVyZWQgdGhlCi0gICAgICAgICAgICAgICAgIHNpemUgdG8gYmUgemVybyBieXRlcy4gICovCi0JICAgICAgaWYgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotCQlpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIChQVFIpICZleHQsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJICAgICAgc2l6ZW9mIGV4dCkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyB3aGVuIHRoZSBzZWN0aW9uIGlzCi0JCSBmaW5hbGx5IHdyaXR0ZW4gb3V0LiAgKi8KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBTaXplIGhhcyBiZWVuIHNldCBpbiBtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAgKi8KLQkgIEJGRF9BU1NFUlQoby0+X3Jhd19zaXplID09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgcmVnaW5mb19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0JICAgICAgRVhUUiBlc3ltOwotCSAgICAgIGJmZF92bWEgbGFzdDsKLQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9Ci0JCXsgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKLQkJICAgICIucm9kYXRhIiwgIi5zZGF0YSIsICIuc2JzcyIsICIuYnNzIiB9OwotCSAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2NbXSA9IHsgc2NUZXh0LCBzY0luaXQsIHNjRmluaSwgc2NEYXRhLAotCQkJCQkgIHNjUkRhdGEsIHNjU0RhdGEsIHNjU0Jzcywgc2NCc3MgfTsKLQotCSAgICAgIGVzeW0uam1wdGJsID0gMDsKLQkgICAgICBlc3ltLmNvYm9sX21haW4gPSAwOwotCSAgICAgIGVzeW0ud2Vha2V4dCA9IDA7Ci0JICAgICAgZXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5pZmQgPSBpZmROaWw7Ci0JICAgICAgZXN5bS5hc3ltLmlzcyA9IGlzc05pbDsKLQkgICAgICBlc3ltLmFzeW0uc3QgPSBzdExvY2FsOwotCSAgICAgIGVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJewotCQkgIGVzeW0uYXN5bS5zYyA9IHNjW2ldOwotCQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZVtpXSk7Ci0JCSAgaWYgKHMgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXN5bS5hc3ltLnZhbHVlID0gcy0+dm1hOwotCQkgICAgICBsYXN0ID0gcy0+dm1hICsgcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGVzeW0uYXN5bS52YWx1ZSA9IGxhc3Q7Ci0KLQkJICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCAmZGVidWcsIHN3YXAsCi0JCQkJCQkgICAgICBuYW1lW2ldLCAmZXN5bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwOwotCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGlucHV0X2RlYnVnOwotCSAgICAgIGNoYXIgKmVyYXdfc3JjOwotCSAgICAgIGNoYXIgKmVyYXdfZW5kOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChpbnB1dF9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICB8fCAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKLQkJICAgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKSA9PSBOVUxMKQotCQl7Ci0JCSAgLyogSSBkb24ndCBrbm93IHdoYXQgYSBub24gTUlQUyBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgICZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7Ci0JCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOwotCQkgIGggPSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChleHQuaWZkICE9IC0xKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCi0JCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOwotCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOwotCQkgICAgfQotCi0JCSAgaC0+ZXN5bSA9IGV4dDsKLQkJfQotCi0JICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIC5ydHByb2Mgc2VjdGlvbi4gICovCi0JICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotCSAgICAgIGlmIChydHByb2Nfc2VjID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZCBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7Ci0KLQkJICBydHByb2Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ydHByb2MiKTsKLQkJICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBydHByb2Nfc2VjLCBmbGFncykKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBydHByb2Nfc2VjLCA0KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKLQkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0JICBlaW5mby5pbmZvID0gaW5mbzsKLQkgIGVpbmZvLmRlYnVnID0gJmRlYnVnOwotCSAgZWluZm8uc3dhcCA9IHN3YXA7Ci0JICBlaW5mby5mYWlsZWQgPSBmYWxzZTsKLQkgIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgICAgIG1pcHNfZWxmX291dHB1dF9leHRzeW0sCi0JCQkJICAgICAgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0gICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdWJuYW1lOwotCSAgdW5zaWduZWQgaW50IGM7Ci0JICBFbGYzMl9ncHRhYiAqdGFiOwotCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAotCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAotCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucwotCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JCSAgIHAgPSBwLT5uZXh0KQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0KLQkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJCWNvbnRpbnVlOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCi0JCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOwotCQkgICAqc2VjcHAgIT0gbzsKLQkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0JCTsKLQkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKLQkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCi0JICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCi0JICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKLQkgICAgZ3B0YWJfYnNzX3NlYyA9IG87Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKLQkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgotCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCi0JICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCi0JICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKLQkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7Ci0JICAgICAgZWxzZQotCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOwotCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKLQkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBjID0gMTsKLQkgIHRhYiA9IChFbGYzMl9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGYzMl9ncHRhYikpOwotCSAgaWYgKHRhYiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKLQkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKLQotCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OwotCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQotCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQotCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JCSAgIGdwZW50cnkgPCBzaXplOwotCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKQotCQl7Ci0JCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOwotCQkgIEVsZjMyX2dwdGFiIGludF9ncHRhYjsKLQkJICB1bnNpZ25lZCBsb25nIHZhbDsKLQkJICB1bnNpZ25lZCBsb25nIGFkZDsKLQkJICBib29sZWFuIGV4YWN0OwotCQkgIHVuc2lnbmVkIGludCBsb29rOwotCi0JCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCi0JCQkgIGdwZW50cnksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSkpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHRhYik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGlucHV0X2JmZCwgJmV4dF9ncHRhYiwKLQkJCQkJCSZpbnRfZ3B0YWIpOwotCQkgIHZhbCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9nX3ZhbHVlOwotCQkgIGFkZCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlcyAtIGxhc3Q7Ci0KLQkJICBleGFjdCA9IGZhbHNlOwotCQkgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA+PSB2YWwpCi0JCQl0YWJbbG9va10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0gYWRkOwotCi0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9PSB2YWwpCi0JCQlleGFjdCA9IHRydWU7Ci0JCSAgICB9Ci0KLQkJICBpZiAoISBleGFjdCkKLQkJICAgIHsKLQkJICAgICAgRWxmMzJfZ3B0YWIgKm5ld190YWI7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBtYXg7Ci0KLQkJICAgICAgLyogV2UgbmVlZCBhIG5ldyB0YWJsZSBlbnRyeS4gICovCi0JCSAgICAgIG5ld190YWIgPSAoKEVsZjMyX2dwdGFiICopCi0JCQkJIGJmZF9yZWFsbG9jICgoUFRSKSB0YWIsCi0JCQkJCSAgICAgIChjICsgMSkgKiBzaXplb2YgKEVsZjMyX2dwdGFiKSkpOwotCQkgICAgICBpZiAobmV3X3RhYiA9PSBOVUxMKQotCQkJewotCQkJICBmcmVlICh0YWIpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIHRhYiA9IG5ld190YWI7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID0gdmFsOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgPSBhZGQ7Ci0KLQkJICAgICAgLyogTWVyZ2UgaW4gdGhlIHNpemUgZm9yIHRoZSBuZXh0IHNtYWxsZXN0IC1HCi0JCQkgdmFsdWUsIHNpbmNlIHRoYXQgd2lsbCBiZSBpbXBsaWVkIGJ5IHRoaXMgbmV3Ci0JCQkgdmFsdWUuICAqLwotCQkgICAgICBtYXggPSAwOwotCQkgICAgICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkJewotCQkJICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPCB2YWwKLQkJCSAgICAgICYmIChtYXggPT0gMAotCQkJCSAgfHwgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlCi0JCQkJICAgICAgPiB0YWJbbWF4XS5ndF9lbnRyeS5ndF9nX3ZhbHVlKSkpCi0JCQkgICAgbWF4ID0gbG9vazsKLQkJCX0KLQkJICAgICAgaWYgKG1heCAhPSAwKQotCQkJdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzICs9Ci0JCQkgIHRhYlttYXhdLmd0X2VudHJ5Lmd0X2J5dGVzOwotCi0JCSAgICAgICsrYzsKLQkJICAgIH0KLQotCQkgIGxhc3QgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0JCX0KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBUaGUgdGFibGUgbXVzdCBiZSBzb3J0ZWQgYnkgLUcgdmFsdWUuICAqLwotCSAgaWYgKGMgPiAyKQotCSAgICBxc29ydCAodGFiICsgMSwgYyAtIDEsIHNpemVvZiAodGFiWzBdKSwgZ3B0YWJfY29tcGFyZSk7Ci0KLQkgIC8qIFN3YXAgb3V0IHRoZSB0YWJsZS4gICovCi0JICBleHRfdGFiID0gKChFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKQotCQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSk7Ci0JICBpZiAoZXh0X3RhYiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAodGFiKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICBpZiAoQUJJXzY0X1AgKGFiZmQpKQotICAgIHsKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKCFiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIWJmZF9lbGYzMl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgdGhlIGNvbXB1dGVkIHNlY3Rpb25zLiAgKi8KLQotICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsICZyZWdpbmZvLCAmZXh0KTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcmVnaW5mb19zZWMsIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCi0JCQkJCSAgICAgICBzd2FwLCBpbmZvLAotCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLSAgICB7Ci0gICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0gICAgICBpZiAocnRwcm9jX3NlYyAhPSBOVUxMKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcnRwcm9jX3NlYywKLQkJCQkJICBydHByb2Nfc2VjLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgcnRwcm9jX3NlYy0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBzZWN0aW9uIGZvciBBQkZELiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKTsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayBpbmRpY2F0ZWQgYnkKLSAgIElORk8uICBJZiBTR09UUCBpcyBub24tTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIEdPVCAKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfZ290X2luZm8gKgotbWlwc19lbGZfZ290X2luZm8gKGFiZmQsIHNnb3RwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2dvdHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgaWYgKHNnb3RwKQotICAgICpzZ290cCA9IHNnb3Q7Ci0gIHJldHVybiBnOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHJldHVybiByX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIHJldHVybiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFNpZ24tZXh0ZW5kIFZBTFVFLCB3aGljaCBoYXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgQklUUy4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICBpZiAodmFsdWUgJiAoKGJmZF92bWEpMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBWQUxVRSBpcyBuZWdhdGl2ZS4gICovCi0gICAgdmFsdWUgfD0gKChiZmRfdm1hKSAtIDEpIDw8IGJpdHM7ICAgICAgCi0gIAotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiB0aGUgaW5kaWNhdGVkIFZBTFVFIGhhcyBvdmVyZmxvd2VkIHRoZSBtYXhpbXVtCi0gICByYW5nZSBleHByZXNzYWJsZSBieSBhIHNpZ25lZCBudW1iZXIgd2l0aCB0aGUgaW5kaWNhdGVkIG51bWJlciBvZgotICAgQklUUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgYml0cykKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHN2YWx1ZSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsdWU7Ci0KLSAgaWYgKHN2YWx1ZSA+ICgxIDw8IChiaXRzIC0gMSkpIC0gMSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIGJpZy4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UgaWYgKHN2YWx1ZSA8IC0oMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIHNtYWxsLiAgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgLyogQWxsIGlzIHdlbGwuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2ggZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaCAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMCkgPj4gMTYpICYgMHhmZmZmOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoZXIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaGVyICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMDgwMDApID4+IDMyKSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2hlc3QgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2hpZ2hlc3QgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgcmV0dXJuICgodmFsdWUgKyAoYmZkX3ZtYSkgMHg4MDAwODAwMDgwMDApID4+IDQ4KSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBpbmRleCBmb3IgdGhlIGdsb2JhbCBzeW1ib2wgaW5kaWNhdGVkIGJ5IEguICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXggKGFiZmQsIGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZF92bWEgaW5kZXg7Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGFiZmQsICZzZ290KTsKLQotICAvKiBPbmNlIHdlIGRldGVybWluZSB0aGUgZ2xvYmFsIEdPVCBlbnRyeSB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUgaW5kZXgsIHdlIG11c3QgcHV0IGFsbCBkeW5hbWljIHN5bWJvbHMgd2l0aCBncmVhdGVyCi0gICAgIGluZGljZXMgaW50byB0aGUgR09ULiAgVGhhdCBtYWtlcyBpdCBlYXN5IHRvIGNhbGN1bGF0ZSB0aGUgR09UCi0gICAgIG9mZnNldC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCk7Ci0gIGluZGV4ID0gKChoLT5keW5pbmR4IC0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCArIGctPmxvY2FsX2dvdG5vKSAKLQkgICAqIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGluZGV4IDwgc2dvdC0+X3Jhd19zaXplKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIGVudHJ5IGF0IHRoZSBJTkRFWHRoIHBvc2l0aW9uCi0gICBpbiB0aGUgR09ULiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCAoZHlub2JqLCBvdXRwdXRfYmZkLCBpbmRleCkKLSAgICAgYmZkICpkeW5vYmo7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSBpbmRleDsKLXsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIGluZGV4IC0gCi0JICBncCk7Ci19Ci0KLS8qIElmIEggaXMgYSBzeW1ib2wgdGhhdCBuZWVkcyBhIGdsb2JhbCBHT1QgZW50cnksIGJ1dCBoYXMgYSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUgaW5kZXggbG93ZXIgdGhhbiBhbnkgd2UndmUgc2VlbiB0byBkYXRlLCByZWNvcmQgaXQgZm9yCi0gICBwb3N0ZXJpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEEgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIG11c3QgYWxzbyBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogSWYgd2UndmUgYWxyZWFkeSBtYXJrZWQgdGhpcyBlbnRyeSBhcyBuZWVkIEdPVCBzcGFjZSwgd2UgZG9uJ3QKLSAgICAgbmVlZCB0byBkbyBpdCBhZ2Fpbi4gICovCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtIDEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQnkgc2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAtMSwgd2UgYXJlIGluZGljYXRpbmcgdGhhdAotICAgICB0aGVyZSBuZWVkcyB0byBiZSBhIEdPVCBlbnRyeSBmb3IgSC4gICovCi0gIGgtPmdvdC5vZmZzZXQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2Ygd2hlbiBzb3J0aW5nCi0gICB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgICAgCi1zdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEKLXsKLSAgLyogVGhlIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIEdPVCB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wgdGFibGUKLSAgICAgaW5kZXguICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbG93OwotICAvKiBUaGUgbGVhc3QgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggY29ycmVzcG9uZGluZyB0byBhIHN5bWJvbAotICAgICB3aXRoIGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtaW5fZ290X2R5bmluZHg7Ci0gIC8qIFRoZSBncmVhdGVzdCBkeW5hbWljIHN5bWJvbCB0YWJsZSBpbmRleCBub3QgY29ycmVzcG9uZGluZyB0byBhCi0gICAgIHN5bWJvbCB3aXRob3V0IGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtYXhfbm9uX2dvdF9keW5pbmR4OwotfTsKLQotLyogSWYgSCBuZWVkcyBhIEdPVCBlbnRyeSwgYXNzaWduIGl0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBkeW5hbWljCi0gICBpbmRleC4gIE90aGVyd2lzZSwgYXNzaWduIGl0IHRoZSBsb3dlc3QgYXZhaWxhYmxlIGR5bmFtaWMgCi0gICBpbmRleC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqaHNkIAotICAgID0gKHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqKSBkYXRhOwotCi0gIC8qIFN5bWJvbHMgd2l0aG91dCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIGFyZW4ndCBpbnRlcmVzdGluZwotICAgICBhdCBhbGwuICAqLwotICBpZiAoaC0+cm9vdC5keW5pbmR4ID09IC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5yb290LmdvdC5vZmZzZXQgIT0gMCkKLSAgICBoLT5yb290LmR5bmluZHggPSBoc2QtPm1heF9ub25fZ290X2R5bmluZHgrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGgtPnJvb3QuZHluaW5keCA9IC0taHNkLT5taW5fZ290X2R5bmluZHg7Ci0gICAgICBoc2QtPmxvdyA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgc28gdGhhdCBzeW1ib2xzIHRoYXQgbmVlZCBHT1QgZW50cmllcwotICAgYXBwZWFyIHRvd2FyZHMgdGhlIGVuZC4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIEdPVCBzcGFjZQotICAgcmVxdWlyZWQuICBNQVhfTE9DQUwgaXMgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBsb2NhbCBzeW1ib2xzCi0gICBrbm93biB0byBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBEdXJpbmcKLSAgIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywgdGhpcyB2YWx1ZSBpcyAxLiAgQWZ0ZXJ3YXJkLCB0aGUKLSAgIHNlY3Rpb24gc3ltYm9scyBhcmUgYWRkZWQgYW5kIHRoZSBjb3VudCBpcyBoaWdoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIChpbmZvLCBtYXhfbG9jYWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIG1heF9sb2NhbDsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2hhc2hfc29ydF9kYXRhIGhzZDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGhzZC5sb3cgPSBOVUxMOwotICBoc2QubWluX2dvdF9keW5pbmR4ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgaHNkLm1heF9ub25fZ290X2R5bmluZHggPSBtYXhfbG9jYWw7Ci0gIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIAotCQkJCWVsZl9oYXNoX3RhYmxlIChpbmZvKSksIAotCQkJICAgICAgIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mLCAKLQkJCSAgICAgICAmaHNkKTsKLQotICAvKiBUaGVyZSBzaG91ZCBoYXZlIGJlZW4gZW5vdWdoIHJvb20gaW4gdGhlIHN5bWJvbCB0YWJsZSB0bwotICAgICBhY2NvbW9kYXRlIGJvdGggdGhlIEdPVCBhbmQgbm9uLUdPVCBzeW1ib2xzLiAgKi8KLSAgQkZEX0FTU0VSVCAoaHNkLm1pbl9nb3RfZHluaW5keCA9PSBoc2QubWF4X25vbl9nb3RfZHluaW5keCk7Ci0KLSAgLyogTm93IHdlIGtub3cgd2hpY2ggZHluYW1pYyBzeW1ib2wgaGFzIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUgaW5kZXggaW4gdGhlIEdPVC4gICovCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZHlub2JqLCBOVUxMKTsKLSAgZy0+Z2xvYmFsX2dvdHN5bSA9IGhzZC5sb3c7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIGxvY2FsIEdPVCBlbnRyeSBmb3IgVkFMVUUuICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbnRyeSwKLSAgIG9yIC0xIGlmIGl0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgaWYgKGctPmFzc2lnbmVkX2dvdG5vID49IGctPmxvY2FsX2dvdG5vKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZG4ndCBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIEdPVC4gICovCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygibm90IGVub3VnaCBHT1Qgc3BhY2UgZm9yIGxvY2FsIEdPVCBlbnRyaWVzIikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICBNSVBTX0VMRl9QVVRfV09SRCAoYWJmZCwgdmFsdWUsCi0JCSAgICAgKHNnb3QtPmNvbnRlbnRzIAotCQkgICAgICArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vKSk7Ci0gIHJldHVybiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubysrOwotfQotCi0vKiBSZXR1cm5zIHRoZSBHT1Qgb2Zmc2V0IGF0IHdoaWNoIHRoZSBpbmRpY2F0ZWQgYWRkcmVzcyBjYW4gYmUgZm91bmQuCi0gICBJZiB0aGVyZSBpcyBub3QgeWV0IGEgR09UIGVudHJ5IGZvciB0aGlzIHZhbHVlLCBjcmVhdGUgb25lLiAgUmV0dXJucwotICAgLTEgaWYgbm8gc2F0aXNmYWN0b3J5IEdPVCBvZmZzZXQgY2FuIGJlIGZvdW5kLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCAoYWJmZCwgaW5mbywgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICZzZ290KTsKLQotICAvKiBMb29rIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBmb3IgKGVudHJ5ID0gKHNnb3QtPmNvbnRlbnRzIAotCQkrIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIE1JUFNfUkVTRVJWRURfR09UTk8pOyAKLSAgICAgICBlbnRyeSAhPSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vOwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3MgPSBNSVBTX0VMRl9HRVRfV09SRCAoYWJmZCwgZW50cnkpOwotICAgICAgaWYgKGFkZHJlc3MgPT0gdmFsdWUpCi0JcmV0dXJuIGVudHJ5IC0gc2dvdC0+Y29udGVudHM7Ci0gICAgfQotCi0gIHJldHVybiBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci19Ci0KLS8qIEZpbmQgYSBHT1QgZW50cnkgdGhhdCBpcyB3aXRoaW4gMzJLQiBvZiB0aGUgVkFMVUUuICBUaGVzZSBlbnRyaWVzCi0gICBhcmUgc3VwcG9zZWQgdG8gYmUgcGxhY2VkIGF0IHNtYWxsIG9mZnNldHMgaW4gdGhlIEdPVCwgaS5lLiwKLSAgIHdpdGhpbiAzMktCIG9mIEdQLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgcGFnZSwKLSAgIGFuZCBzdG9yZSB0aGUgb2Zmc2V0IGZyb20gdGhpcyBlbnRyeSB0byB0aGUgZGVzaXJlZCBhZGRyZXNzIGluCi0gICBPRkZTRVRQLCBpZiBpdCBpcyBub24tTlVMTC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgdmFsdWUsIG9mZnNldHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgKm9mZnNldHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotICBiZmRfYnl0ZSAqbGFzdF9lbnRyeTsKLSAgYmZkX3ZtYSBpbmRleCA9IDA7Ci0gIGJmZF92bWEgYWRkcmVzczsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBsYXN0X2VudHJ5ID0gc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZm9yIChlbnRyeSA9IChzZ290LT5jb250ZW50cyAKLQkJKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBNSVBTX1JFU0VSVkVEX0dPVE5PKTsKLSAgICAgICBlbnRyeSAhPSBsYXN0X2VudHJ5OwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLQotICAgICAgaWYgKCFtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSAtIGFkZHJlc3MsIDE2KSkKLQl7Ci0JICAvKiBUaGlzIGVudHJ5IHdpbGwgc2VydmUgYXMgdGhlIHBhZ2UgcG9pbnRlci4gIFdlIGNhbiBhZGQgYQotCSAgICAgMTYtYml0IG51bWJlciB0byBpdCB0byBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzLiAgKi8KLQkgIGluZGV4ID0gZW50cnkgLSBzZ290LT5jb250ZW50czsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnksIHdlIGNyZWF0ZSBvbmUgbm93LiAgKi8KLSAgaWYgKGVudHJ5ID09IGxhc3RfZW50cnkpCi0gICAgaW5kZXggPSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci0KLSAgaWYgKG9mZnNldHApCi0gICAgewotICAgICAgYWRkcmVzcyA9IE1JUFNfRUxGX0dFVF9XT1JEIChhYmZkLCBlbnRyeSk7Ci0gICAgICAqb2Zmc2V0cCA9IHZhbHVlIC0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBGaW5kIGEgR09UIGVudHJ5IHdob3NlIGhpZ2hlci1vcmRlciAxNiBiaXRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQotICAgZm9yIHZhbHVlLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgZW50cnkuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLSAgYmZkX2J5dGUgKmxhc3RfZW50cnk7Ci0gIGJmZF92bWEgaW5kZXggPSAwOwotICBiZmRfdm1hIGFkZHJlc3M7Ci0KLSAgLyogQWx0aG91Z2ggdGhlIEFCSSBzYXlzIHRoYXQgaXQgaXMgInRoZSBoaWdoLW9yZGVyIDE2IGJpdHMiIHRoYXQgd2UKLSAgICAgd2FudCwgaXQgaXMgcmVhbGx5IHRoZSAlaGlnaCB2YWx1ZS4gIFRoZSBjb21wbGV0ZSB2YWx1ZSBpcwotICAgICBjYWxjdWxhdGVkIHdpdGggYSBgYWRkaXUnIG9mIGEgTE8xNiByZWxvY2F0aW9uLCBqdXN0IGFzIHdpdGggYQotICAgICBISTE2L0xPMTYgcGFpci4gICovCi0gIHZhbHVlID0gbWlwc19lbGZfaGlnaCAodmFsdWUpIDw8IDE2OwotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LiAgKi8KLSAgbGFzdF9lbnRyeSA9IHNnb3QtPmNvbnRlbnRzICsgTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpICogZy0+YXNzaWduZWRfZ290bm87Ci0gIGZvciAoZW50cnkgPSAoc2dvdC0+Y29udGVudHMgCi0JCSsgTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpICogTUlQU19SRVNFUlZFRF9HT1ROTyk7Ci0gICAgICAgZW50cnkgIT0gbGFzdF9lbnRyeTsKLSAgICAgICBlbnRyeSArPSBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkpCi0gICAgewotICAgICAgYWRkcmVzcyA9IE1JUFNfRUxGX0dFVF9XT1JEIChhYmZkLCBlbnRyeSk7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAweGZmZmYwMDAwKSA9PSB2YWx1ZSkKLQl7Ci0JICAvKiBUaGlzIGVudHJ5IGhhcyB0aGUgcmlnaHQgaGlnaC1vcmRlciAxNiBiaXRzLiAgKi8KLQkgIGluZGV4ID0gZW50cnkgLSBzZ290LT5jb250ZW50czsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnksIHdlIGNyZWF0ZSBvbmUgbm93LiAgKi8KLSAgaWYgKGVudHJ5ID09IGxhc3RfZW50cnkpCi0gICAgaW5kZXggPSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBSZXR1cm5zIHRoZSBmaXJzdCByZWxvY2F0aW9uIG9mIHR5cGUgcl90eXBlIGZvdW5kLCBiZWdpbm5pbmcgd2l0aAotICAgUkVMT0NBVElPTi4gIFJFTEVORCBpcyBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoKLW1pcHNfZWxmX25leHRfcmVsb2NhdGlvbiAocl90eXBlLCByZWxvY2F0aW9uLCByZWxlbmQpCi0gICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY2F0aW9uOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotewotICAvKiBBY2NvcmRpbmcgdG8gdGhlIE1JUFMgRUxGIEFCSSwgdGhlIFJfTUlQU19MTzE2IHJlbG9jYXRpb24gbXVzdCBiZQotICAgICBpbW1lZGlhdGVseSBmb2xsb3dpbmcuICBIb3dldmVyLCBmb3IgdGhlIElSSVg2IEFCSSwgdGhlIG5leHQKLSAgICAgcmVsb2NhdGlvbiBtYXkgYmUgYSBjb21wb3NlZCByZWxvY2F0aW9uIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbAotICAgICByZWxvY2F0aW9ucyBmb3IgdGhlIHNhbWUgYWRkcmVzcy4gIEluIHRoYXQgY2FzZSwgdGhlIFJfTUlQU19MTzE2Ci0gICAgIHJlbG9jYXRpb24gbWF5IG9jY3VyIGFzIG9uZSBvZiB0aGVzZS4gIFdlIHBlcm1pdCBhIHNpbWlsYXIKLSAgICAgZXh0ZW5zaW9uIGluIGdlbmVyYWwsIGFzIHRoYXQgaXMgdXNlZnVsIGZvciBHQ0MuICAqLwotICB3aGlsZSAocmVsb2NhdGlvbiA8IHJlbGVuZCkKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChyZWxvY2F0aW9uLT5yX2luZm8pID09IHJfdHlwZSkKLQlyZXR1cm4gcmVsb2NhdGlvbjsKLQotICAgICAgKytyZWxvY2F0aW9uOwotICAgIH0KLQotICAvKiBXZSBkaWRuJ3QgZmluZCBpdC4gICovCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ3JlYXRlIGEgcmVsLmR5biByZWxvY2F0aW9uIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8gcmVzb2x2ZS4gIFJFTAotICAgaXMgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24sIHdoaWNoIGlzIG5vdyBiZWluZyB0cmFuc2Zvcm1lZCBpbnRvIGEKLSAgIGR5YW5taWMgcmVsb2NhdGlvbi4gIFRoZSBBRERFTkRQIGlzIGFkanVzdGVkIGlmIG5lY2Vzc2FyeTsgdGhlCi0gICBjYWxsZXIgc2hvdWxkIHN0b3JlIHRoZSByZXN1bHQgaW4gcGxhY2Ugb2YgdGhlIG9yaWdpbmFsIGFkZGVuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCByZWwsIGgsIHNlYywKLQkJCQkgICAgc3ltYm9sLCBhZGRlbmRwLCBpbnB1dF9zZWN0aW9uKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIHN5bWJvbDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotICBib29sZWFuIHNraXA7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3JlbG9jIAotICAgID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwKLQkJCSAgICAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpOwotICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0KLSAgc2tpcCA9IGZhbHNlOwotCi0gIC8qIFdlIGJlZ2luIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIG9mZnNldCBmb3IgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbgotICAgICBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24uICBXZSdsbCBhZGp1c3QgdGhpcwotICAgICBsYXRlciB0byByZWZsZWN0IHRoZSBjb3JyZWN0IG91dHB1dCBvZmZzZXRzLiAgKi8KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRXhjZXB0IHRoYXQgaW4gYSBzdGFiIHNlY3Rpb24gdGhpbmdzIGFyZSBtb3JlIGNvbXBsZXguCi0JIEJlY2F1c2Ugd2UgY29tcHJlc3Mgc3RhYiBpbmZvcm1hdGlvbiwgdGhlIG9mZnNldCBnaXZlbiBpbiB0aGUKLQkgcmVsb2NhdGlvbiBtYXkgbm90IGJlIHRoZSBvbmUgd2Ugd2FudDsgd2UgbXVzdCBsZXQgdGhlIHN0YWJzCi0JIG1hY2hpbmVyeSB0ZWxsIHVzIHRoZSBvZmZzZXQuICAqLwotICAgICAgb3V0cmVsLnJfb2Zmc2V0IAotCT0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JICAgIGlucHV0X3NlY3Rpb24sCi0JICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiBhdCBhbGwsIHRoaXMgdmFsdWUgd2lsbCBiZQotCSAtMS4gICovCi0gICAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQlza2lwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UndmUgZGVjaWRlZCB0byBza2lwIHRoaXMgcmVsb2NhdGlvbiwganVzdCBvdXRwdXQgYW4gZW10cHkKLSAgICAgcmVjb3JkLiAgTm90ZSB0aGF0IFJfTUlQU19OT05FID09IDAsIHNvIHRoYXQgdGhpcyBjYWxsIHRvIG1lbXNldAotICAgICBpcyBhIHdheSBvZiBzZXR0aW5nIFJfVFlQRSB0byBSX01JUFNfTk9ORS4gICovCi0gIGlmIChza2lwKQotICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIChvdXRyZWwpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5keDsKLSAgICAgIGJmZF92bWEgc2VjdGlvbl9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdlIG11c3Qgbm93IGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggdG8gdXNlCi0JIGluIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmICghIGluZm8tPnN5bWJvbGljIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCXsKLQkgIGluZHggPSBoLT5yb290LmR5bmluZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ICE9IC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgICAgaW5keCA9IDA7Ci0JICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMtPm91dHB1dF9zZWN0aW9uKS0+ZHluaW5keDsKLQkgICAgICBpZiAoaW5keCA9PSAwKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCi0JICAvKiBGaWd1cmUgb3V0IGhvdyBmYXIgdGhlIHRhcmdldCBvZiB0aGUgcmVsb2NhdGlvbiBpcyBmcm9tCi0JICAgICB0aGUgYmVnaW5uaW5nIG9mIGl0cyBzZWN0aW9uLiAgKi8KLQkgIHNlY3Rpb25fb2Zmc2V0ID0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogVGhlIHJlbG9jYXRpb24gd2UncmUgYnVpbGRpbmcgaXMgc2VjdGlvbi1yZWxhdGl2ZS4KLQkgICAgIFRoZXJlZm9yZSwgdGhlIG9yaWdpbmFsIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkIGJ5IHRoZQotCSAgICAgc2VjdGlvbiBvZmZzZXQuICAqLwotCSAgKmFkZGVuZHAgKz0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogTm93LCB0aGUgcmVsb2NhdGlvbiBpcyBqdXN0IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotCSAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCX0KLSAgICAgIAotICAgICAgLyogSWYgdGhlIHJlbG9jYXRpb24gd2FzIHByZXZpb3VzbHkgYW4gYWJzb2x1dGUgcmVsb2NhdGlvbiwgd2UKLQkgbXVzdCBhZGp1c3QgaXQgYnkgdGhlIHZhbHVlIHdlIGdpdmUgaXQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sCi0JIHRhYmxlLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gUl9NSVBTX1JFTDMyKQotCSphZGRlbmRwICs9IHN5bWJvbDsKLQotICAgICAgLyogVGhlIHJlbG9jYXRpb24gaXMgYWx3YXlzIGFuIFJFTDMyIHJlbG9jYXRpb24gYmVjYXVzZSB3ZSBkb24ndAotCSBrbm93IHdoZXJlIHRoZSBzaGFyZWQgbGlicmFyeSB3aWxsIHdpbmQgdXAgYXQgbG9hZC10aW1lLiAgKi8KLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIFJfTUlQU19SRUwzMik7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgb3V0cHV0IG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiB0byByZWZlcmVuY2UgdGhlCi0JIGNvcnJlY3QgbG9jYXRpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLQotICAvKiBQdXQgdGhlIHJlbG9jYXRpb24gYmFjayBvdXQuICBXZSBoYXZlIHRvIHVzZSB0aGUgc3BlY2lhbAotICAgICByZWxvY2F0aW9uIG91dHB1dHRlciBpbiB0aGUgNjQtYml0IGNhc2Ugc2luY2UgdGhlIDY0LWJpdAotICAgICByZWxvY2F0aW9uIGZvcm1hdCBpcyBub24tc3RhbmRhcmQuICAqLwotICBpZiAoQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgICgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpLT5zLT5zd2FwX3JlbG9jX291dCkKLQkob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkgKHNyZWxvYy0+Y29udGVudHMgCi0JICArIHNyZWxvYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSkpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCSAgICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCXNyZWxvYy0+Y29udGVudHMpCi0JCQkgICAgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBILiAgVGhpcwotICAgICBpbmZvcm1hdGlvbiBpcyBsYXRlciBlbWl0dGVkIGluIHRoZSAubXN5bSBzZWN0aW9uLiAgKi8KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPm1pbl9keW5fcmVsb2NfaW5kZXggPT0gMCAKLQkgIHx8IHNyZWxvYy0+cmVsb2NfY291bnQgPCBoLT5taW5fZHluX3JlbG9jX2luZGV4KSkKLSAgICBoLT5taW5fZHluX3JlbG9jX2luZGV4ID0gc3JlbG9jLT5yZWxvY19jb3VudDsKLQotICAvKiBXZSd2ZSBub3cgYWRkZWQgYW5vdGhlciByZWxvY2F0aW9uLiAgKi8KLSAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IHNlY3Rpb24gaXMgd3JpdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBiZSB3cml0aW5nIHRvIGl0LiAgKi8KLSAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9mbGFncwotICAgIHw9IFNIRl9XUklURTsKLQotICAvKiBPbiBJUklYNSwgbWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCi0gIGlmICghIHNraXAgJiYgSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiogc2NwdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGJmZF9ieXRlICpjcjsKLQotICAgICAgaWYgKHNjcHQpCi0JewotCSAgRWxmMzJfY3JpbmZvIGNwdHJlbDsKLQotCSAgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCAoY3B0cmVsLCBDUkZfTUlQU19MT05HKTsKLQkgIGNwdHJlbC52YWRkciA9IChyZWwtPnJfb2Zmc2V0Ci0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIpCi0JICAgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1JFTDMyKTsKLQkgIGVsc2UKLQkgICAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfV09SRCk7Ci0JICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCAwKTsKLQkgIGNwdHJlbC5rb25zdCA9ICphZGRlbmRwOwotCi0JICBjciA9IChzY3B0LT5jb250ZW50cwotCQkrIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkgICsrc2NwdC0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgUkVMT0NBVElPTiAod2hpY2ggY29tZXMgZnJvbQotICAgdGhlIElOUFVUX0JGRCkuICBUaGUgQURERU5EIGlzIHRoZSBhZGRlbmQgdG8gdXNlIGZvciB0aGlzCi0gICBSRUxPQ0FUSU9OOyBSRUxPQ0FUSU9OLT5SX0FEREVORCBpcyBpZ25vcmVkLgotCi0gICBUaGUgcmVzdWx0IG9mIHRoZSByZWxvY2F0aW9uIGNhbGN1bGF0aW9uIGlzIHN0b3JlZCBpbiBWQUxVRVAuCi0gICBSRVFVSVJFX0pBTFhQIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgb3Bjb2RlIHVzZWQgd2l0aCB0aGlzCi0gICByZWxvY2F0aW9uIG11c3QgYmUgSkFMWC4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJmZF9yZWxvY19jb250aW51ZSBpZiB0aGUgY2FsbGVyIG5lZWQgdGFrZSBubwotICAgZnVydGhlciBhY3Rpb24gcmVnYXJkaW5nIHRoaXMgcmVsb2NhdGlvbiwgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCBpZgotICAgc29tZXRoaW5nIGdvZXMgZHJhbWF0aWNhbGx5IHdyb25nLCBiZmRfcmVsb2Nfb3ZlcmZsb3cgaWYgYW4KLSAgIG92ZXJmbG93IG9jY3VycywgYW5kIGJmZF9yZWxvY19vayB0byBpbmRpY2F0ZSBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKGFiZmQsIAotCQkJICAgICAgIGlucHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgIGluZm8sCi0JCQkgICAgICAgcmVsb2NhdGlvbiwKLQkJCSAgICAgICBhZGRlbmQsCi0JCQkgICAgICAgaG93dG8sCi0JCQkgICAgICAgbG9jYWxfc3ltcywKLQkJCSAgICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCSAgICAgICB2YWx1ZXAsCi0JCQkgICAgICAgbmFtZXAsCi0JCQkgICAgICAgcmVxdWlyZV9qYWx4cCkgCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGJvb2xlYW4gKnJlcXVpcmVfamFseHA7Ci17Ci0gIC8qIFRoZSBldmVudHVhbCB2YWx1ZSB3ZSB3aWxsIHJldHVybi4gICovCi0gIGJmZF92bWEgdmFsdWU7Ci0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYWdhaW5zdCB3aGljaCB0aGUgcmVsb2NhdGlvbiBpcwotICAgICBvY2N1cnJpbmcuICAqLwotICBiZmRfdm1hIHN5bWJvbCA9IDA7Ci0gIC8qIFRoZSBmaW5hbCBHUCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGFibGUsIGV4ZWN1dGFibGUsIG9yCi0gICAgIHNoYXJlZCBvYmplY3QgZmlsZSBiZWluZyBwcm9kdWNlZC4gICovCi0gIGJmZF92bWEgZ3AgPSAoYmZkX3ZtYSkgLSAxOwotICAvKiBUaGUgcGxhY2UgKHNlY3Rpb24gb2Zmc2V0IG9yIGFkZHJlc3MpIG9mIHRoZSBzdG9yYWdlIHVuaXQgYmVpbmcKLSAgICAgcmVsb2NhdGVkLiAgKi8KLSAgYmZkX3ZtYSBwOwotICAvKiBUaGUgdmFsdWUgb2YgR1AgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jYXRhYmxlIG9iamVjdC4gICovCi0gIGJmZF92bWEgZ3AwID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGF0IHdoaWNoIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSByZWxvY2F0aW9uIGVudHJ5IHN5bWJvbCwgYWRqdXN0ZWQgYnkgdGhlIGFkZGVuZCwgcmVzaWRlcwotICAgICBkdXJpbmcgZXhlY3V0aW9uLiAgKi8KLSAgYmZkX3ZtYSBnID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCByZWZlcmVuY2VkIGJ5IHRoZSByZWxvY2F0aW9uIGlzCi0gICAgIGxvY2F0ZWQuICAqLwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSogaCA9IE5VTEw7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBib29sZWFuIGxvY2FsX3A7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgIl9ncF9kaXNwIi4gICovCi0gIGJvb2xlYW4gZ3BfZGlzcF9wID0gZmFsc2U7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgZXh0c3ltb2ZmOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlOwotICAvKiBUcnVlIGlmIG92ZXJmbG93IG9jY3VycmVkIGR1cmluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gdmFsdWUuICAqLwotICBib29sZWFuIG92ZXJmbG93ZWRfcDsKLSAgLyogVHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gcmVmZXJzIHRvIGEgTUlQUzE2IGZ1bmN0aW9uLiAgKi8KLSAgYm9vbGVhbiB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IGZhbHNlOwotCi0gIC8qIFBhcnNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWxvY2F0aW9uLT5yX2luZm8pOwotICBwID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0gICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyByZWxvY2F0aW9uLT5yX29mZnNldCk7Ci0KLSAgLyogQXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVyZmxvdy4gICovCi0gIG92ZXJmbG93ZWRfcCA9IGZhbHNlOwotCi0gIC8qIEZpZ3VyZSBvdXQgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCBpcyBsb2NhbCwgYW5kIGdldCB0aGUgb2Zmc2V0Ci0gICAgIHVzZWQgaW4gdGhlIGFycmF5IG9mIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9wID0gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSBsb2NhbF9zZWN0aW9ucyk7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICAgICAgCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBpZiAobG9jYWxfcCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0KLSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQotICAgICAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCXN5bWJvbCArPSBzeW0tPnN0X3ZhbHVlOwotCi0gICAgICAvKiBNSVBTMTYgdGV4dCBsYWJlbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2RkLiAgKi8KLSAgICAgIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpCi0JKytzeW1ib2w7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAoKm5hbWVwID09ICdcMCcpCi0JKm5hbWVwID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCi0gICAgICB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBnbG9iYWwgc3ltYm9scyB3ZSBsb29rIHVwIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2gtdGFibGUuICAqLwotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKSBbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgaGFzaC10YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0gICAgICAKLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBfZ3BfZGlzcCBzeW1ib2wuICBOb3RlIHRoYXQgc3VjaCBhCi0JIHN5bWJvbCBtdXN0IGFsd2F5cyBiZSBhIGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgX2dwX2Rpc3AgYXJlIHBlcm1pdHRlZCBvbmx5IHdpdGgKLQkgICAgIFJfTUlQU19ISTE2IGFuZCBSX01JUFNfTE8xNiByZWxvY2F0aW9ucy4gICovCi0JICBpZiAocl90eXBlICE9IFJfTUlQU19ISTE2ICYmIHJfdHlwZSAhPSBSX01JUFNfTE8xNikKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgIGdwX2Rpc3BfcCA9IHRydWU7Ci0JfQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCwgY2FsY3VsYXRlIGl0cyBhZGRyZXNzLiAgTm90ZSB0aGF0Ci0JIF9ncF9kaXNwIGlzIGEgbWFnaWMgc3ltYm9sLCBhbHdheXMgaW1wbGljaXRseSBkZWZpbmVkIGJ5IHRoZQotCSBsaW5rZXIsIHNvIGl0J3MgaW5hcHByb3ByaWF0ZSB0byBjaGVjayB0byBzZWUgd2hldGhlciBvciBub3QKLQkgaXRzIGRlZmluZWQuICAqLwotICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKQotCXsKLQkgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIHN5bWJvbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUgCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgc3ltYm9sID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCS8qIFdlIGFsbG93IHJlbG9jYXRpb25zIGFnYWluc3QgdW5kZWZpbmVkIHdlYWsgc3ltYm9scywgZ2l2aW5nCi0JICAgaXQgdGhlIHZhbHVlIHplcm8sIHNvIHRoYXQgeW91IGNhbiB1bmRlZmluZWQgd2VhayBmdW5jdGlvbnMKLQkgICBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZXkgZXhpc3QgYnkgbG9va2luZyBhdCB0aGVpcgotCSAgIGFkZHJlc3Nlcy4gICovCi0Jc3ltYm9sID0gMDsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZAotCSAgICAgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+cm9vdC5vdGhlcikgPT0gU1RWX0RFRkFVTFQpCi0Jc3ltYm9sID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUNfTElOSyIpID09IDApCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgbGluaywgd2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhCi0JICAgICBfRFlOQU1JQ19MSU5LIHN5bWJvbCBpbiBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkgICAgIE90aGVyd2lzZSwgd2Ugc2hvdWxkIGRlZmluZSB0aGUgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiAwLgotCSAgICAgRklYTUU6IEl0IHNob3VsZCBwcm9iYWJseSBnZXQgaW50byB0aGUgc3ltYm9sIHRhYmxlCi0JICAgICBzb21laG93IGFzIHdlbGwuICAqLwotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5zaGFyZWQpOwotCSAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpID09IE5VTEwpOwotCSAgc3ltYm9sID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRpb24tPnJfb2Zmc2V0LAotCQkgICghaW5mby0+c2hhcmVkIHx8IGluZm8tPm5vX3VuZGVmaW5lZAotCQkgICB8fCBFTEZfU1RfVklTSUJJTElUWSAoaC0+cm9vdC5vdGhlcikpKSkpCi0JICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgc3ltYm9sID0gMDsKLQl9Ci0KLSAgICAgIHRhcmdldF9pc18xNl9iaXRfY29kZV9wID0gKGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNik7Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBpcyBhIDMyLWJpdCBjYWxsIHRvIGEgMTYtYml0IGZ1bmN0aW9uIHdpdGggYSBzdHViLCB3ZQotICAgICBuZWVkIHRvIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBzdHViLCB1bmxlc3Mgd2UncmUgYWxyZWFkeSAqaW4qCi0gICAgIGEgc3R1Yi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9NSVBTMTZfMjYgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgKChoICE9IE5VTEwgJiYgaC0+Zm5fc3R1YiAhPSBOVUxMKQotCSAgfHwgKGxvY2FsX3AgJiYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVicyAhPSBOVUxMCi0JICAgICAgJiYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF0gIT0gTlVMTCkpCi0gICAgICAmJiAhbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIDMyLWJpdCBjYWxsIHRvIGEgMTYtYml0IGZ1bmN0aW9uLiAgV2Ugc2hvdWxkCi0JIGhhdmUgYWxyZWFkeSBub3RpY2VkIHRoYXQgd2Ugd2VyZSBnb2luZyB0byBuZWVkIHRoZQotCSBzdHViLiAgKi8KLSAgICAgIGlmIChsb2NhbF9wKQotCXNlYyA9IGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdOwotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKGgtPm5lZWRfZm5fc3R1Yik7Ci0JICBzZWMgPSBoLT5mbl9zdHViOwotCX0KLQotICAgICAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLSAgLyogSWYgdGhpcyBpcyBhIDE2LWJpdCBjYWxsIHRvIGEgMzItYml0IGZ1bmN0aW9uIHdpdGggYSBzdHViLCB3ZQotICAgICBuZWVkIHRvIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBzdHViLiAgKi8KLSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2XzI2ICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAmJiBoICE9IE5VTEwgCi0JICAgJiYgKGgtPmNhbGxfc3R1YiAhPSBOVUxMIHx8IGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMKQotCSAgICYmICF0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCkKLSAgICB7Ci0gICAgICAvKiBJZiBib3RoIGNhbGxfc3R1YiBhbmQgY2FsbF9mcF9zdHViIGFyZSBkZWZpbmVkLCB3ZSBjYW4gZmlndXJlCi0JIG91dCB3aGljaCBvbmUgdG8gdXNlIGJ5IHNlZWluZyB3aGljaCBvbmUgYXBwZWFycyBpbiB0aGUgaW5wdXQKLQkgZmlsZS4gICovCi0gICAgICBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwgJiYgaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIHNlYyA9IE5VTEw7Ci0JICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIG8pLAotCQkJICAgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJewotCQkgIHNlYyA9IGgtPmNhbGxfZnBfc3R1YjsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAoc2VjID09IE5VTEwpCi0JICAgIHNlYyA9IGgtPmNhbGxfc3R1YjsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5jYWxsX3N0dWIgIT0gTlVMTCkKLQlzZWMgPSBoLT5jYWxsX3N0dWI7Ci0gICAgICBlbHNlCi0Jc2VjID0gaC0+Y2FsbF9mcF9zdHViOwotCi0gICAgICBCRkRfQVNTRVJUIChzZWMtPl9yYXdfc2l6ZSA+IDApOwotICAgICAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLQotICAvKiBDYWxscyBmcm9tIDE2LWJpdCBjb2RlIHRvIDMyLWJpdCBjb2RlIGFuZCB2aWNlIHZlcnNhIHJlcXVpcmUgdGhlCi0gICAgIHNwZWNpYWwgamFseCBpbnN0cnVjdGlvbi4gICovCi0gICpyZXF1aXJlX2phbHhwID0gKCFpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgICYmICgocl90eXBlID09IFJfTUlQUzE2XzI2KSAhPSB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCkpOwotCi0gIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkZXRlcm1pbmVkIHRoZSBHT1Qgb2Zmc2V0LCBvciB0aGUgR1AgdmFsdWUsCi0gICAgIGFuZCB3ZSdyZSBnb2luZyB0byBuZWVkIGl0LCBnZXQgaXQgbm93LiAgKi8KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICBjYXNlIFJfTUlQU19HT1RfRElTUDoKLSAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgLyogRmluZCB0aGUgaW5kZXggaW50byB0aGUgR09UIHdoZXJlIHRoaXMgdmFsdWUgaXMgbG9jYXRlZC4gICovCi0gICAgICBpZiAoIWxvY2FsX3ApCi0JewotCSAgQkZEX0FTU0VSVCAoYWRkZW5kID09IDApOwotCSAgZyA9IG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXggCi0JICAgIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkgICAgIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSopIGgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYpCi0JLyogVGhlcmUncyBubyBuZWVkIHRvIGNyZWF0ZSBhIGxvY2FsIEdPVCBlbnRyeSBoZXJlOyB0aGUKLQkgICBjYWxjdWxhdGlvbiBmb3IgYSBsb2NhbCBHT1QxNiBlbnRyeSBkb2VzIG5vdCBpbnZvbHZlIEcuICAqLwotCWJyZWFrOwotICAgICAgZWxzZQotCXsKLQkgIGcgPSBtaXBzX2VsZl9sb2NhbF9nb3RfaW5kZXggKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCk7Ci0JICBpZiAoZyA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIENvbnZlcnQgR09UIGluZGljZXMgdG8gYWN0dWFsIG9mZnNldHMuICAqLwotICAgICAgZyA9IG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJCSAgYWJmZCwgZyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9NSVBTX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfTE8xNjoKLSAgICBjYXNlIFJfTUlQU19HUFJFTDE2OgotICAgIGNhc2UgUl9NSVBTX0dQUkVMMzI6Ci0gICAgY2FzZSBSX01JUFNfTElURVJBTDoKLSAgICAgIGdwMCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChpbnB1dF9iZmQpOwotICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGF0IGtpbmQgb2YgcmVsb2NhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFNfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBjYXNlIFJfTUlQU18xNjoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfMzI6Ci0gICAgY2FzZSBSX01JUFNfUkVMMzI6Ci0gICAgY2FzZSBSX01JUFNfNjQ6Ci0gICAgICBpZiAoKGluZm8tPnNoYXJlZAotCSAgIHx8IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgICAgICAmJiBoICE9IE5VTEwKLQkgICAgICAgJiYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKQotCQkgICA9PSAwKSkpCi0JICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgLyogSWYgd2UncmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgb3IgdGhpcyByZWxvY2F0aW9uIGlzCi0JICAgICBhZ2FpbnN0IGEgc3ltYm9sIGluIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gd2UgY2FuJ3Qga25vdwotCSAgICAgd2hlcmUgdGhlIHN5bWJvbCB3aWxsIGVuZCB1cC4gIFNvLCB3ZSBjcmVhdGUgYSByZWxvY2F0aW9uCi0JICAgICByZWNvcmQgaW4gdGhlIG91dHB1dCwgYW5kIGxlYXZlIHRoZSBqb2IgdXAgdG8gdGhlIGR5bmFtaWMKLQkgICAgIGxpbmtlci4gICovCi0JICB2YWx1ZSA9IGFkZGVuZDsKLQkgIGlmICghbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbiAoYWJmZCwgCi0JCQkJCQkgICBpbmZvLCAKLQkJCQkJCSAgIHJlbG9jYXRpb24sCi0JCQkJCQkgICBoLAotCQkJCQkJICAgc2VjLAotCQkJCQkJICAgc3ltYm9sLAotCQkJCQkJICAgJnZhbHVlLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJfdHlwZSAhPSBSX01JUFNfUkVMMzIpCi0JICAgIHZhbHVlID0gc3ltYm9sICsgYWRkZW5kOwotCSAgZWxzZQotCSAgICB2YWx1ZSA9IGFkZGVuZDsKLQl9Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX1BDMzI6Ci0gICAgY2FzZSBSX01JUFNfUEM2NDoKLSAgICBjYXNlIFJfTUlQU19HTlVfUkVMX0xPMTY6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCArIGFkZGVuZCAtIHA7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dOVV9SRUwxNl9TMjoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCA8PCAyLCAxOCkgLSBwOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE4KTsKLSAgICAgIHZhbHVlID0gKHZhbHVlID4+IDIpICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HTlVfUkVMX0hJMTY6Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCArIHN5bWJvbCAtIHApOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQUzE2XzI2OgotICAgICAgLyogVGhlIGNhbGN1bGF0aW9uIGZvciBSX01JUFNfMjYgaXMganVzdCB0aGUgc2FtZSBhcyBmb3IgYW4KLQkgUl9NSVBTXzI2LiAgSXQncyBvbmx5IHRoZSBzdG9yYWdlIG9mIHRoZSByZWxvY2F0ZWQgZmllbGQgaW50bwotCSB0aGUgb3V0cHV0IGZpbGUgdGhhdCdzIGRpZmZlcmVudC4gIFRoYXQncyBoYW5kbGVkIGluCi0JIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4gIFNvLCB3ZSBqdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUKLQkgUl9NSVBTXzI2IGNhc2UgaGVyZS4gICovCi0gICAgY2FzZSBSX01JUFNfMjY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl2YWx1ZSA9ICgoKGFkZGVuZCA8PCAyKSB8IChwICYgMHhmMDAwMDAwMCkpICsgc3ltYm9sKSA+PiAyOwotICAgICAgZWxzZQotCXZhbHVlID0gKG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQgPDwgMiwgMjgpICsgc3ltYm9sKSA+PiAyOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19ISTE2OgotICAgICAgaWYgKCFncF9kaXNwX3ApCi0JewotCSAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQgKyBzeW1ib2wpOwotCSAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCArIGdwIC0gcCk7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfTE8xNjoKLSAgICAgIGlmICghZ3BfZGlzcF9wKQotCXZhbHVlID0gKHN5bWJvbCArIGFkZGVuZCkgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSBhZGRlbmQgKyBncCAtIHAgKyA0OwotCSAgLyogVGhlIE1JUFMgQUJJIHJlcXVpcmVzIGNoZWNraW5nIHRoZSBSX01JUFNfTE8xNiByZWxvY2F0aW9uCi0JICAgICBmb3Igb3ZlcmZsb3cuICBCdXQsIG9uLCBzYXksIElyaXggNSwgcmVsb2NhdGlvbnMgYWdhaW5zdAotCSAgICAgX2dwX2Rpc3AgYXJlIG5vcm1hbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSAuY3Bsb2FkCi0JICAgICBwc2V1ZG8tb3AuICBJdCBnZW5lcmF0ZXMgY29kZSB0aGF0IG5vcm1hbGx5IGxvb2tzIGxpa2UKLQkgICAgIHRoaXM6Ci0KLQkgICAgICAgbHVpICAgICRncCwlaGkoX2dwX2Rpc3ApCi0JICAgICAgIGFkZGl1ICAkZ3AsJGdwLCVsbyhfZ3BfZGlzcCkKLQkgICAgICAgYWRkdSAgICRncCwkZ3AsJHQ5Ci0KLQkgICAgIEhlcmUgJHQ5IGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQsCi0JICAgICBhcyByZXF1aXJlZCBieSB0aGUgTUlQUyBFTEYgQUJJLiAgVGhlIFJfTUlQU19MTzE2Ci0JICAgICByZWxvY2F0aW9uIGNhbiBlYXNpbHkgb3ZlcmZsb3cgaW4gdGhpcyBzaXR1YXRpb24sIGJ1dCB0aGUKLQkgICAgIFJfTUlQU19ISTE2IHJlbG9jYXRpb24gd2lsbCBoYW5kbGUgdGhlIG92ZXJmbG93LgotCSAgICAgVGhlcmVmb3JlLCB3ZSBjb25zaWRlciB0aGlzIGEgYnVnIGluIHRoZSBNSVBTIEFCSSwgYW5kIGRvCi0JICAgICBub3QgY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUuICAqLwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfTElURVJBTDoKLSAgICAgIC8qIEJlY2F1c2Ugd2UgZG9uJ3QgbWVyZ2UgbGl0ZXJhbCBzZWN0aW9ucywgd2UgY2FuIGhhbmRsZSB0aGlzCi0JIGp1c3QgbGlrZSBSX01JUFNfR1BSRUwxNi4gIEluIHRoZSBsb25nIHJ1biwgd2Ugc2hvdWxkIG1lcmdlCi0JIHNoYXJlZCBsaXRlcmFscywgYW5kIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGFkZGl0aW9uYWwgd29yawotCSBoZXJlLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotICAgIGNhc2UgUl9NSVBTMTZfR1BSRUw6Ci0gICAgICAvKiBUaGUgUl9NSVBTMTZfR1BSRUwgcGVyZm9ybXMgdGhlIHNhbWUgY2FsY3VsYXRpb24gYXMKLQkgUl9NSVBTX0dQUkVMMTYsIGJ1dCBzdG9yZXMgdGhlIHJlbG9jYXRlZCBiaXRzIGluIGEgZGlmZmVyZW50Ci0JIG9yZGVyLiAgV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmU7IHRoZQotCSBkaWZmZXJlbmNlcyBhcmUgaGFuZGxlZCBpbiBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCArIGdwMCAtIGdwOwotICAgICAgZWxzZQotCXZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gZ3A7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICAgIGlmIChsb2NhbF9wKQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCk7Ci0JICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB2YWx1ZSAKLQkgICAgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICBhYmZkLAotCQkJCQkgICAgICB2YWx1ZSk7Ci0JICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0gICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotICAgICAgdmFsdWUgPSBnOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR1BSRUwzMjoKLSAgICAgIHZhbHVlID0gKGFkZGVuZCArIHN5bWJvbCArIGdwMCAtIGdwKSAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfUEMxNjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfc2lnbl9leHRlbmQgKGFkZGVuZCwgMTYpICsgc3ltYm9sIC0gcDsKLSAgICAgIHZhbHVlID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHZhbHVlIC8gNCk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0gICAgICAvKiBXZSdyZSBhbGxvd2VkIHRvIGhhbmRsZSB0aGVzZSB0d28gcmVsb2NhdGlvbnMgaWRlbnRpY2FsbHkuCi0JIFRoZSBkeW5hbWljIGxpbmtlciBpcyBhbGxvd2VkIHRvIGhhbmRsZSB0aGUgQ0FMTCByZWxvY2F0aW9ucwotCSBkaWZmZXJlbnRseSBieSBjcmVhdGluZyBhIGxhenkgZXZhbHVhdGlvbiBzdHViLiAgKi8KLSAgICAgIHZhbHVlID0gZzsKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfaGlnaCAodmFsdWUpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0gICAgICB2YWx1ZSA9IGcgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dPVF9QQUdFOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kLCBOVUxMKTsKLSAgICAgIGlmICh2YWx1ZSA9PSAoYmZkX3ZtYSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICBhYmZkLAotCQkJCQkgICAgICB2YWx1ZSk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19HT1RfT0ZTVDoKLSAgICAgIG1pcHNfZWxmX2dvdF9wYWdlIChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQsICZ2YWx1ZSk7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19TVUI6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCAtIGFkZGVuZDsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfSElHSEVSOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoZXIgKGFkZGVuZCArIHN5bWJvbCk7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJR0hFU1Q6Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2hlc3QgKGFkZGVuZCArIHN5bWJvbCk7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9NSVBTX1NDTl9ESVNQOgotICAgICAgdmFsdWUgPSBzeW1ib2wgKyBhZGRlbmQgLSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX1BKVU1QOgotICAgIGNhc2UgUl9NSVBTX0pBTFI6Ci0gICAgICAvKiBCb3RoIG9mIHRoZXNlIG1heSBiZSBpZ25vcmVkLiAgUl9NSVBTX0pBTFIgaXMgYW4gb3B0aW1pemF0aW9uCi0JIGhpbnQ7IHdlIGNvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgaG9ub3JpbmcgdGhhdCBoaW50LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBjYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotICAgICAgLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGVzZSBhdCBwcmVzZW50LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQW4gdW5yZWNvZ25pemVkIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIFZBTFVFIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gb3ZlcmZsb3dlZF9wID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKiBPYnRhaW4gdGhlIGZpZWxkIHJlbG9jYXRlZCBieSBSRUxPQ0FUSU9OLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIHJlbG9jYXRpb24sIGlucHV0X2JmZCwgY29udGVudHMpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYmZkX3ZtYSB4OwotICBiZmRfYnl0ZSAqbG9jYXRpb24gPSBjb250ZW50cyArIHJlbG9jYXRpb24tPnJfb2Zmc2V0OwotCi0gIC8qIE9idGFpbiB0aGUgYnl0ZXMuICAqLwotICB4ID0gYmZkX2dldCAoOCAqIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQotICBpZiAoKEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFMxNl8yNgotICAgICAgIHx8IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKSA9PSBSX01JUFMxNl9HUFJFTCkKLSAgICAgICYmIGJmZF9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKQotICAgIC8qIFRoZSB0d28gMTYtYml0IHdvcmRzIHdpbGwgYmUgcmV2ZXJzZWQgb24gYSBsaXR0bGUtZW5kaWFuCi0gICAgICAgc3lzdGVtLiAgU2VlIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLSAgICB4ID0gKCgoeCAmIDB4ZmZmZikgPDwgMTYpIHwgKCh4ICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKLQotICByZXR1cm4geDsKLX0KLQotLyogSXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIFJFTE9DQVRJT04gaXMgdGhlCi0gICBWQUxVRS4gIFVzZSBIT1dUTyB0byBwbGFjZSBWQUxVRSBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhdCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBvc2l0aW9uLiAgVGhlIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhlCi0gICByZWxvY2F0aW9uIGFwcGxpZXMuICBJZiBSRVFVSVJFX0pBTFggaXMgdHJ1ZSwgdGhlbiB0aGUgb3Bjb2RlIHVzZWQKLSAgIGZvciB0aGUgcmVsb2NhdGlvbiBtdXN0IGJlIGVpdGhlciBKQUwgb3IgSkFMWCwgYW5kIGl0IGlzCi0gICB1bmNvbmRpdGlvbmFsbHkgY29udmVydGVkIHRvIEpBTFguCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGluZm8sIGhvd3RvLCByZWxvY2F0aW9uLCB2YWx1ZSwKLQkJCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAKLQkJCSAgICAgY29udGVudHMsIHJlcXVpcmVfamFseCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9qYWx4OwotewotICBiZmRfdm1hIHg7Ci0gIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgaW50IHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLQotICAvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSByZWxvY2F0aW9uIGlzIG9jY3VycmluZy4gICovCi0gIGxvY2F0aW9uID0gY29udGVudHMgKyByZWxvY2F0aW9uLT5yX29mZnNldDsKLQotICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUuICAqLwotICB4ID0gbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzIChob3d0bywgcmVsb2NhdGlvbiwgaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0KLSAgLyogQ2xlYXIgdGhlIGZpZWxkIHdlIGFyZSBzZXR0aW5nLiAgKi8KLSAgeCAmPSB+aG93dG8tPmRzdF9tYXNrOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIFJfTUlQUzE2XzI2IHJlbG9jYXRpb24sIHdlIG11c3Qgc3RvcmUgdGhlCi0gICAgIHZhbHVlIGluIGEgZnVubnkgd2F5LiAgKi8KLSAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLSAgICB7Ci0gICAgICAvKiBSX01JUFMxNl8yNiBpcyB1c2VkIGZvciB0aGUgbWlwczE2IGphbCBhbmQgamFseCBpbnN0cnVjdGlvbnMuCi0JIE1vc3QgbWlwczE2IGluc3RydWN0aW9ucyBhcmUgMTYgYml0cywgYnV0IHRoZXNlIGluc3RydWN0aW9ucwotCSBhcmUgMzIgYml0cy4KLQotCSBUaGUgZm9ybWF0IG9mIHRoZXNlIGluc3RydWN0aW9ucyBpczoKLQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JICEgICAgIEpBTFggICAgICEgWCEgICBJbW0gMjA6MTYgICEgICBJbW0gMjU6MjEgICEKLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhCSAgCSAgSW1tZWRpYXRlICAxNTowCQkgICAgIQotCSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBKQUxYIGlzIHRoZSA1LWJpdCB2YWx1ZSAwMDAxMS4gIFggaXMgMCBmb3IgamFsLCAxIGZvciBqYWx4LgotCSBOb3RlIHRoYXQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpbiB0aGUgZmlyc3Qgd29yZCBpcyBzd2FwcGVkLgotCi0JIFdoZW4gcHJvZHVjaW5nIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCBSX01JUFMxNl8yNiBpcwotCSBoYW5kbGVkIG1vc3RseSBsaWtlIFJfTUlQU18yNi4gIEluIHBhcnRpY3VsYXIsIHRoZSBhZGRlbmQgaXMKLQkgc3RvcmVkIGFzIGEgc3RyYWlnaHQgMjYtYml0IHZhbHVlIGluIGEgMzItYml0IGluc3RydWN0aW9uLgotCSAoZ2FzIG1ha2VzIGxpZmUgc2ltcGxlciBmb3IgaXRzZWxmIGJ5IG5ldmVyIGFkanVzdGluZyBhCi0JIFJfTUlQUzE2XzI2IHJlbG9jIHRvIGJlIGFnYWluc3QgYSBzZWN0aW9uLCBzbyB0aGUgYWRkZW5kIGlzCi0JIGFsd2F5cyB6ZXJvKS4gIEhvd2V2ZXIsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMgc3RvcmVkIGFzIDIKLQkgMTYtYml0IHZhbHVlcywgcmF0aGVyIHRoYW4gYSBzaW5nbGUgMzItYml0IHZhbHVlLiAgSW4gYQotCSBiaWctZW5kaWFuIGZpbGUsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWU7IGluIGEgbGl0dGxlLWVuZGlhbgotCSBmaWxlLCB0aGUgdHdvIDE2LWJpdCBoYWx2ZXMgb2YgdGhlIDMyIGJpdCB2YWx1ZSBhcmUgc3dhcHBlZC4KLQkgVGhpcyBpcyBzbyB0aGF0IGEgZGlzYXNzZW1ibGVyIGNhbiByZWNvZ25pemUgdGhlIGphbAotCSBpbnN0cnVjdGlvbi4KLQotCSBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgUl9NSVBTMTZfMjYgaXMgdHJlYXRlZCBhcyBhIDMyIGJpdAotCSBpbnN0cnVjdGlvbiBzdG9yZWQgYXMgdHdvIDE2LWJpdCB2YWx1ZXMuICBUaGUgYWRkZW5kIEEgaXMgdGhlCi0JIGNvbnRlbnRzIG9mIHRoZSB0YXJnMjYgZmllbGQuICBUaGUgY2FsY3VsYXRpb24gaXMgdGhlIHNhbWUgYXMKLQkgUl9NSVBTXzI2LiAgV2hlbiBzdG9yaW5nIHRoZSBjYWxjdWxhdGVkIHZhbHVlLCByZW9yZGVyIHRoZQotCSBpbW1lZGlhdGUgdmFsdWUgYXMgc2hvd24gYWJvdmUsIGFuZCBkb24ndCBmb3JnZXQgdG8gc3RvcmUgdGhlCi0JIHZhbHVlIGFzIHR3byAxNi1iaXQgdmFsdWVzLgotCi0JIFRvIHB1dCBpdCBpbiBNSVBTIEFCSSB0ZXJtcywgdGhlIHJlbG9jYXRpb24gZmllbGQgaXMgVC10YXJnMjYtMTYsCi0JIGRlZmluZWQgYXMKLQkgCi0JIGJpZy1lbmRpYW46Ci0JICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKLQkgfCAgICAgICAgfCAgICB0YXJnMjYtMTYgICAgICAgICB8Ci0JIHwzMSAgICAyNnwyNSAgICAgICAgICAgICAgICAgICAwfAotCSArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgCi0JIGxpdHRsZS1lbmRpYW46Ci0JICstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tKwotCSB8ICAgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgIHwKLQkgfCAgc3ViMSAgICB8ICAgICAgfCAgICAgc3ViMiAgICB8Ci0JIHwwICAgICAgICA5fDEwICAxNXwxNiAgICAgICAgIDMxfAotCSArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgd2hlcmUgdGFyZzI2LTE2IGlzIHN1YjEgZm9sbG93ZWQgYnkgc3ViMiAoaS5lLiwgdGhlIGFkZGVuZCBmaWVsZCBBIGlzCi0JICgoc3ViMSA8PCAxNikgfCBzdWIyKSkuCi0JIAotCSBXaGVuIHByb2R1Y2luZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgdGhlIGNhbGN1bGF0aW9uIGlzCi0JICgoKEEgPCAyKSB8IChQICYgMHhmMDAwMDAwMCkgKyBTKSA+PiAyKQotCSBXaGVuIHByb2R1Y2luZyBhIGZ1bGx5IGxpbmtlZCBmaWxlLCB0aGUgY2FsY3VsYXRpb24gaXMKLQkgbGV0IFIgPSAoKChBIDwgMikgfCAoUCAmIDB4ZjAwMDAwMDApICsgUykgPj4gMikKLQkgKChSICYgMHgxZjAwMDApIDw8IDUpIHwgKChSICYgMHgzZTAwMDAwKSA+PiA1KSB8IChSICYgMHhmZmZmKSAgKi8KLQotICAgICAgaWYgKCFpbmZvLT5yZWxvY2F0ZWFibGUpCi0JLyogU2h1ZmZsZSB0aGUgYml0cyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgYWJvdmUuICAqLwotCXZhbHVlID0gKCgodmFsdWUgJiAweDFmMDAwMCkgPDwgNSkgCi0JCSB8ICgodmFsdWUgJiAweDNlMDAwMDApID4+IDUpIAotCQkgfCAodmFsdWUgJiAweGZmZmYpKTsKLSAgICAgIAotICAgIH0KLSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMKQotICAgIHsKLSAgICAgIC8qIFJfTUlQUzE2X0dQUkVMIGlzIHVzZWQgZm9yIEdQLXJlbGF0aXZlIGFkZHJlc3NpbmcgaW4gbWlwczE2Ci0JIG1vZGUuICBBIHR5cGljYWwgaW5zdHJ1Y3Rpb24gd2lsbCBoYXZlIGEgZm9ybWF0IGxpa2UgdGhpczoKLQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JICEgICAgRVhURU5EICAgICEgICAgIEltbSAxMDo1ICAgICEgICBJbW0gMTU6MTEgICEKLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgIE1ham9yICAgICAhICAgcnggICAhICAgcnkgICAhICAgSW1tICA0OjAgICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgCi0JIEVYVEVORCBpcyB0aGUgZml2ZSBiaXQgdmFsdWUgMTExMTAuICBNYWpvciBpcyB0aGUgaW5zdHJ1Y3Rpb24KLQkgb3Bjb2RlLgotCSAKLQkgVGhpcyBpcyBoYW5kbGVkIGV4YWN0bHkgbGlrZSBSX01JUFNfR1BSRUwxNiwgZXhjZXB0IHRoYXQgdGhlCi0JIGFkZGVuZCBpcyByZXRyaWV2ZWQgYW5kIHN0b3JlZCBhcyBzaG93biBpbiB0aGlzIGRpYWdyYW07IHRoYXQKLQkgaXMsIHRoZSBJbW0gZmllbGRzIGFib3ZlIHJlcGxhY2UgdGhlIFYtcmVsMTYgZmllbGQuICAKLQotICAgICAgICAgQWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyBzaHVmZmxlIHRoZSBiaXRzIGFwcHJvcHJpYXRlbHkuICBBcwotCSBhYm92ZSwgdGhlIHR3byAxNi1iaXQgaGFsdmVzIG11c3QgYmUgc3dhcHBlZCBvbiBhCi0JIGxpdHRsZS1lbmRpYW4gc3lzdGVtLiAgKi8KLSAgICAgIHZhbHVlID0gKCgodmFsdWUgJiAweDdlMCkgPDwgMTYpCi0JICAgICAgIHwgKCh2YWx1ZSAmIDB4ZjgwMCkgPDwgNSkKLQkgICAgICAgfCAodmFsdWUgJiAweDFmKSk7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmllbGQuICAqLwotICB4IHw9ICh2YWx1ZSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0KLSAgLyogSWYgcmVxdWlyZWQsIHR1cm4gSkFMIGludG8gSkFMWC4gICovCi0gIGlmIChyZXF1aXJlX2phbHgpCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGJmZF92bWEgb3Bjb2RlID0geCA+PiAyNjsKLSAgICAgIGJmZF92bWEgamFseF9vcGNvZGU7Ci0KLSAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgb3Bjb2RlIGlzIGFscmVhZHkgSkFMIG9yIEpBTFguICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQl7Ci0JICBvayA9ICgob3Bjb2RlID09IDB4NikgfHwgKG9wY29kZSA9PSAweDcpKTsKLQkgIGphbHhfb3Bjb2RlID0gMHg3OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvayA9ICgob3Bjb2RlID09IDB4MykgfHwgKG9wY29kZSA9PSAweDFkKSk7Ci0JICBqYWx4X29wY29kZSA9IDB4MWQ7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgb3Bjb2RlIGlzIG5vdCBKQUwgb3IgSkFMWCwgdGhlcmUncyBhIHByb2JsZW0uICAqLwotICAgICAgaWYgKCFvaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiAlcysweCVseDoganVtcCB0byBzdHViIHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsb2NhdGlvbi0+cl9vZmZzZXQpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBNYWtlIHRoaXMgdGhlIEpBTFggb3Bjb2RlLiAgKi8KLSAgICAgIHggPSAoeCAmIH4oMHgzZiA8PCAyNikpIHwgKGphbHhfb3Bjb2RlIDw8IDI2KTsKLSAgICB9Ci0KLSAgLyogU3dhcCB0aGUgaGlnaC0gYW5kIGxvdy1vcmRlciAxNiBiaXRzIG9uIGxpdHRsZS1lbmRpYW4gc3lzdGVtcwotICAgICB3aGVuIGRvaW5nIGEgTUlQUzE2IHJlbG9jYXRpb24uICAqLwotICBpZiAoKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCB8fCByX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0gICAgICAmJiBiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKLSAgICB4ID0gKCgoeCAmIDB4ZmZmZikgPDwgMTYpIHwgKCh4ICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKLSAgCi0gIC8qIFB1dCB0aGUgdmFsdWUgaW50byB0aGUgb3V0cHV0LiAgKi8KLSAgYmZkX3B1dCAoOCAqIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiBTRUNUSU9OIGlzIGEgTUlQUzE2IHN0dWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zdHViX3NlY3Rpb25fcCAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pOwotCi0gIHJldHVybiAoc3RybmNtcCAobmFtZSwgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX1NUVUIsIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKTsKLX0KLQotLyogUmVsb2NhdGUgYSBNSVBTIEVMRiBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBiZmRfdm1hIGFkZGVuZCA9IDA7Ci0gIGJvb2xlYW4gdXNlX3NhdmVkX2FkZGVuZF9wID0gZmFsc2U7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBib29sZWFuIHJlcXVpcmVfamFseDsKLSAgICAgIC8qIFRydWUgaWYgdGhlIHJlbG9jYXRpb24gaXMgYSBSRUxBIHJlbG9jYXRpb24sIHJhdGhlciB0aGFuIGEKLSAgICAgICAgIFJFTCByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGJvb2xlYW4gcmVsYV9yZWxvY2F0aW9uX3AgPSB0cnVlOwotICAgICAgaW50IHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBGaW5kIHRoZSByZWxvY2F0aW9uIGhvd3RvIGZvciB0aGlzIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgIUFCSV82NF9QIChvdXRwdXRfYmZkKSkKLQl7Ci0JICAvKiBTb21lIDMyLWJpdCBjb2RlIHVzZXMgUl9NSVBTXzY0LiAgSW4gcGFydGljdWxhciwgcGVvcGxlIHVzZQotCSAgICAgNjQtYml0IGNvZGUsIGJ1dCBtYWtlIHN1cmUgYWxsIHRoZWlyIGFkZHJlc3NlcyBhcmUgaW4gdGhlIAotCSAgICAgbG93ZXJtb3N0IG9yIHVwcGVybW9zdCAzMi1iaXQgc2VjdGlvbiBvZiB0aGUgNjQtYml0IGFkZHJlc3MKLQkgICAgIHNwYWNlLiAgVGh1cywgd2hlbiB0aGV5IHVzZSBhbiBSX01JUFNfNjQgdGhleSBtZWFuIHdoYXQgaXMKLQkgICAgIHVzdWFsbHkgbWVhbnQgYnkgUl9NSVBTXzMyLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUKLQkgICAgIHN0b3JlZCB2YWx1ZSBpcyBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMuICAqLwotCSAgaG93dG8gPSBlbGZfbWlwc19ob3d0b190YWJsZSArIFJfTUlQU18zMjsKLQotCSAgLyogT24gYmlnLWVuZGlhbiBzeXN0ZW1zLCB3ZSBuZWVkIHRvIGxpZSBhYm91dCB0aGUgcG9zaXRpb24KLQkgICAgIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICAgICAgcmVsLT5yX29mZnNldCArPSA0OwotCX0KLSAgICAgIGVsc2UKLQlob3d0byA9IG1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSk7Ci0KLSAgICAgIGlmICghdXNlX3NhdmVkX2FkZGVuZF9wKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0JICAvKiBJZiB0aGVzZSByZWxvY2F0aW9ucyB3ZXJlIG9yaWdpbmFsbHkgb2YgdGhlIFJFTCB2YXJpZXR5LAotCSAgICAgd2UgbXVzdCBwdWxsIHRoZSBhZGRlbmQgb3V0IG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUKLQkgICAgIHJlbG9jYXRlZC4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IHVzZSB0aGUgY29udGVudHMgb2YgdGhlCi0JICAgICBSRUxBIHJlbG9jYXRpb24uICBUbyBkZXRlcm1pbmUgd2hpY2ggZmxhdm9yIG9yIHJlbG9jYXRpb24KLQkgICAgIHRoaXMgaXMsIHdlIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSBJTlBVVF9TRUNUSU9OJ3MKLQkgICAgIFJFTF9IRFIgaXMgcmVhZCBiZWZvcmUgaXRzIFJFTF9IRFIyLiAgKi8KLQkgIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0JICBpZiAoKHNpemVfdCkgKHJlbCAtIHJlbG9jcykKLQkgICAgICA+PSAocmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUKLQkJICAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwpKQotCSAgICByZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIyOwotCSAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gTUlQU19FTEZfUkVMX1NJWkUgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBpcyBhIFJFTCByZWxvY2F0aW9uLiAgKi8KLQkgICAgICByZWxhX3JlbG9jYXRpb25fcCA9IGZhbHNlOwotCi0JICAgICAgLyogR2V0IHRoZSBhZGRlbmQsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgaW5wdXQgZmlsZS4gICovCi0JICAgICAgYWRkZW5kID0gbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzIChob3d0bywgCi0JCQkJCQkgcmVsLAotCQkJCQkJIGlucHV0X2JmZCwKLQkJCQkJCSBjb250ZW50cyk7Ci0JICAgICAgYWRkZW5kICY9IGhvd3RvLT5zcmNfbWFzazsKLQotCSAgICAgIC8qIEZvciBzb21lIGtpbmRzIG9mIHJlbG9jYXRpb25zLCB0aGUgQURERU5EIGlzIGEKLQkJIGNvbWJpbmF0aW9uIG9mIHRoZSBhZGRlbmQgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQKLQkJIHJlbG9jYXRpb25zLiAgICovCi0JICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfSEkxNgotCQkgIHx8IHJfdHlwZSA9PSBSX01JUFNfR05VX1JFTF9ISTE2Ci0JCSAgfHwgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYKLQkJICAgICAgJiYgbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbCwKLQkJCQkJCSAgICAgIGxvY2FsX3NlY3Rpb25zKSkpCi0JCXsKLQkJICBiZmRfdm1hIGw7Ci0JCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKmxvMTZfcmVsb2NhdGlvbjsKLQkJICByZWxvY19ob3d0b190eXBlICpsbzE2X2hvd3RvOwotCQkgIGludCBsbzsKLQotCQkgIC8qIFRoZSBjb21iaW5lZCB2YWx1ZSBpcyB0aGUgc3VtIG9mIHRoZSBISTE2IGFkZGVuZCwKLQkJICAgICBsZWZ0LXNoaWZ0ZWQgYnkgc2l4dGVlbiBiaXRzLCBhbmQgdGhlIExPMTYKLQkJICAgICBhZGRlbmQsIHNpZ24gZXh0ZW5kZWQuICAoVXN1YWxseSwgdGhlIGNvZGUgZG9lcwotCQkgICAgIGEgYGx1aScgb2YgdGhlIEhJMTYgdmFsdWUsIGFuZCB0aGVuIGFuIGBhZGRpdScgb2YKLQkJICAgICB0aGUgTE8xNiB2YWx1ZS4pICAKLQotCQkgICAgIFNjYW4gYWhlYWQgdG8gZmluZCBhIG1hdGNoaW5nIExPMTYgcmVsb2NhdGlvbi4gICovCi0JCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfR05VX1JFTF9ISTE2KQotCQkgICAgbG8gPSBSX01JUFNfR05VX1JFTF9MTzE2OwotCQkgIGVsc2UKLQkJICAgIGxvID0gUl9NSVBTX0xPMTY7Ci0JCSAgbG8xNl9yZWxvY2F0aW9uIAotCQkgICAgPSBtaXBzX2VsZl9uZXh0X3JlbG9jYXRpb24gKGxvLCByZWwsIHJlbGVuZCk7IAotCQkgIGlmIChsbzE2X3JlbG9jYXRpb24gPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIC8qIE9idGFpbiB0aGUgYWRkZW5kIGtlcHQgdGhlcmUuICAqLwotCQkgIGxvMTZfaG93dG8gPSBtaXBzX3J0eXBlX3RvX2hvd3RvIChsbyk7Ci0JCSAgbCA9IG1pcHNfZWxmX29idGFpbl9jb250ZW50cyAobG8xNl9ob3d0bywKLQkJCQkJCWxvMTZfcmVsb2NhdGlvbiwKLQkJCQkJCWlucHV0X2JmZCwgY29udGVudHMpOwotCQkgIGwgJj0gbG8xNl9ob3d0by0+c3JjX21hc2s7Ci0JCSAgbCA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChsLCAxNik7Ci0KLQkJICBhZGRlbmQgPDw9IDE2OwotCi0JCSAgLyogQ29tcHV0ZSB0aGUgY29tYmluZWQgYWRkZW5kLiAgKi8KLQkJICBhZGRlbmQgKz0gbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLQkJewotCQkgIC8qIFRoZSBhZGRlbmQgaXMgc2NyYW1ibGVkIGluIHRoZSBvYmplY3QgZmlsZS4gIFNlZQotCQkgICAgIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUKLQkJICAgICBmb3JtYXQuICAqLwotCQkgIGFkZGVuZCA9ICgoKGFkZGVuZCAmIDB4MWYwMDAwKSA+PiA1KQotCQkJICAgIHwgKChhZGRlbmQgJiAweDdlMDAwMDApID4+IDE2KQotCQkJICAgIHwgKGFkZGVuZCAmIDB4MWYpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0ICYmICFBQklfNjRfUCAob3V0cHV0X2JmZCkKLQkgICAgICAmJiBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgICAgcmVsLT5yX29mZnNldCAtPSA0OwotCi0JICAvKiBTaW5jZSB3ZSdyZSBqdXN0IHJlbG9jYXRpbmcsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvcHkKLQkgICAgIHRoZSByZWxvY2F0aW9ucyBiYWNrIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVubGVzcwotCSAgICAgdGhleSdyZSBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IGJ5IHRoZSBzZWN0aW9uIG9mZnNldCwgb3IgdW5sZXNzIHRoZXkncmUgR1AKLQkgICAgIHJlbGF0aXZlIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgYnkgdGhlIGFtb3VudAotCSAgICAgdGhhdCB3ZSdyZSBhZGp1c3RpbmcgR1AgaW4gdGhpcyByZWxvY2F0ZWFibGUgb2JqZWN0LiAgKi8KLQotCSAgaWYgKCFtaXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AgKGlucHV0X2JmZCwgcmVsLCBsb2NhbF9zZWN0aW9ucykpCi0JICAgIC8qIFRoZXJlJ3Mgbm90aGluZyB0byBkbyBmb3Igbm9uLWxvY2FsIHJlbG9jYXRpb25zLiAgKi8KLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwgCi0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HUFJFTDE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HUFJFTDMyCi0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19MSVRFUkFMKQotCSAgICBhZGRlbmQgLT0gKF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKQotCQkgICAgICAgLSBfYmZkX2dldF9ncF92YWx1ZSAoaW5wdXRfYmZkKSk7Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzI2IHx8IHJfdHlwZSA9PSBSX01JUFMxNl8yNgotCQkgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dOVV9SRUwxNl9TMikKLQkgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgd2l0aG91dCBpdHMgdHdvIGxlYXN0Ci0JICAgICAgIHNpZ25pZmljYW50IGJpdHMgKHdoaWNoIGFyZSBhbHdheXMgemVyby4pICBJbiBhCi0JICAgICAgIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgY2FsY3VsYXRlX3JlbG9jYXRpb24gd2lsbCBkbwotCSAgICAgICB0aGlzIHNoaWZ0OyBoZXJlLCB3ZSBtdXN0IGRvIGl0IG91cnNlbHZlcy4gICovCi0JICAgIGFkZGVuZCA8PD0gMjsKLQotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCSAgICAvKiBBZGp1c3QgdGhlIGFkZGVuZCBhcHByb3ByaWF0ZWx5LiAgKi8KLQkgICAgYWRkZW5kICs9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XS0+b3V0cHV0X29mZnNldDsKLQkgIAotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgUl9NSVBTX0hJMTYgb3IgUl9NSVBTX0dPVDE2LAotCSAgICAgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gd3JpdGUgb3V0IHRoZSBoaWdoLW9yZGVyIDE2IGJpdHMuCi0JICAgICBUaGUgc3Vic2VxdWVudCBSX01JUFNfTE8xNiB3aWxsIGhhbmRsZSB0aGUgbG93LW9yZGVyIGJpdHMuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfSEkxNiB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVDE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HTlVfUkVMX0hJMTYpCi0JICAgIGFkZGVuZCA9IG1pcHNfZWxmX2hpZ2ggKGFkZGVuZCk7Ci0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYW4gUl9NSVBTXzI2IHJlbG9jYXRpb24sIHRoZW4KLQkgICAgIHRoZSB0d28gbG93LW9yZGVyIGJpdHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlOwotCSAgICAgdGhleSBhcmUgaW1wbGljaXRseSB6ZXJvLiAgKi8KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfMjYgfHwgcl90eXBlID09IFJfTUlQUzE2XzI2Ci0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR05VX1JFTDE2X1MyKQotCSAgICBhZGRlbmQgPj49IDI7Ci0KLQkgIGlmIChyZWxhX3JlbG9jYXRpb25fcCkKLQkgICAgLyogSWYgdGhpcyBpcyBhIFJFTEEgcmVsb2NhdGlvbiwganVzdCB1cGRhdGUgdGhlIGFkZGVuZC4KLQkgICAgICAgV2UgaGF2ZSB0byBjYXN0IGF3YXkgY29uc3RuZXNzIGZvciBSRUwuICAqLwotCSAgICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHdyaXRlIHRoZSB2YWx1ZSBiYWNrIG91dC4gIE5vdGUKLQkJIHRoYXQgd2UgdXNlIHRoZSBzb3VyY2UgbWFzaywgcmF0aGVyIHRoYW4gdGhlCi0JCSBkZXN0aW5hdGlvbiBtYXNrIGJlY2F1c2UgdGhlIHBsYWNlIHRvIHdoaWNoIHdlIGFyZQotCQkgd3JpdGluZyB3aWxsIGJlIHNvdXJjZSBvZiB0aGUgYWRkZW5kIGluIHRoZSBmaW5hbAotCQkgbGluay4gICovCi0JICAgICAgYWRkZW5kICY9IGhvd3RvLT5zcmNfbWFzazsKLQotCSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0ICYmICFBQklfNjRfUCAob3V0cHV0X2JmZCkpCi0JCS8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSBhYm91dCB1c2luZyBSX01JUFNfNjQgaW4gdGhlIDMyLWJpdAotCQkgICBBQkkuICBIZXJlLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWRkZW5kLiAgSXQgd291bGQgYmUKLQkJICAgcG9zc2libGUgdG8gZ2V0IGF3YXkgd2l0aCBqdXN0IHVzaW5nIHRoZSBSX01JUFNfMzIgcmVsb2MKLQkJICAgYnV0IGZvciBlbmRpYW5uZXNzLiAgKi8KLQkJewotCQkgIGJmZF92bWEgc2lnbl9iaXRzOwotCQkgIGJmZF92bWEgbG93X2JpdHM7Ci0JCSAgYmZkX3ZtYSBoaWdoX2JpdHM7Ci0JCSAgCi0JCSAgaWYgKGFkZGVuZCAmICgoYmZkX3ZtYSkgMSA8PCAzMSkpCi0JCSAgICBzaWduX2JpdHMgPSAoKGJmZF92bWEpIDEgPDwgMzIpIC0gMTsKLQkJICBlbHNlCi0JCSAgICBzaWduX2JpdHMgPSAwOwotCQkgIAotCQkgIC8qIElmIHdlIGRvbid0IGtub3cgdGhhdCB3ZSBoYXZlIGEgNjQtYml0IHR5cGUsCi0JCSAgICAgZG8gdHdvIHNlcGFyYXRlIHN0b3Jlcy4gICovCi0JCSAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICAvKiBTdG9yZSB0aGUgc2lnbi1iaXRzICh3aGljaCBhcmUgbW9zdCBzaWduaWZpY2FudCkKLQkJCSBmaXJzdC4gICovCi0JCSAgICAgIGxvd19iaXRzID0gc2lnbl9iaXRzOwotCQkgICAgICBoaWdoX2JpdHMgPSBhZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb3dfYml0cyA9IGFkZGVuZDsKLQkJICAgICAgaGlnaF9iaXRzID0gc2lnbl9iaXRzOwotCQkgICAgfQotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgbG93X2JpdHMsIAotCQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGhpZ2hfYml0cywgCi0JCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyA0KTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaWYgKCFtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGluZm8sIGhvd3RvLCByZWwsIGFkZGVuZCwKLQkJCQkJCWlucHV0X2JmZCwgIGlucHV0X3NlY3Rpb24sIAotCQkJCQkJY29udGVudHMsIGZhbHNlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEdvIG9uIHRvIHRoZSBuZXh0IHJlbG9jYXRpb24uICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJbiB0aGUgTjMyIGFuZCA2NC1iaXQgQUJJcyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgY29uc2VjdXRpdmUKLQkgcmVsb2NhdGlvbnMgZm9yIHRoZSBzYW1lIG9mZnNldC4gIEluIHRoYXQgY2FzZSB3ZSBhcmUKLQkgc3VwcG9zZWQgdG8gdHJlYXQgdGhlIG91dHB1dCBvZiBlYWNoIHJlbG9jYXRpb24gYXMgdGhlIGFkZGVuZAotCSBmb3IgdGhlIG5leHQuICAqLwotICAgICAgaWYgKHJlbCArIDEgPCByZWxlbmQgCi0JICAmJiByZWwtPnJfb2Zmc2V0ID09IHJlbFsxXS5yX29mZnNldAotCSAgJiYgRUxGMzJfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSAhPSBSX01JUFNfTk9ORSkKLQl1c2Vfc2F2ZWRfYWRkZW5kX3AgPSB0cnVlOwotICAgICAgZWxzZQotCXVzZV9zYXZlZF9hZGRlbmRfcCA9IGZhbHNlOwotCi0gICAgICAvKiBGaWd1cmUgb3V0IHdoYXQgdmFsdWUgd2UgYXJlIHN1cHBvc2VkIHRvIHJlbG9jYXRlLiAgKi8KLSAgICAgIHN3aXRjaCAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKG91dHB1dF9iZmQsIAotCQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgIGluZm8sCi0JCQkJCSAgICAgcmVsLAotCQkJCQkgICAgIGFkZGVuZCwKLQkJCQkJICAgICBob3d0bywKLQkJCQkJICAgICBsb2NhbF9zeW1zLAotCQkJCQkgICAgIGxvY2FsX3NlY3Rpb25zLAotCQkJCQkgICAgICZ2YWx1ZSwKLQkJCQkJICAgICAmbmFtZSwKLQkJCQkJICAgICAmcmVxdWlyZV9qYWx4KSkKLQl7Ci0JY2FzZSBiZmRfcmVsb2NfY29udGludWU6Ci0JICAvKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgY29udGludWU7Ci0KLQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAvKiBtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbHJlYWR5IGNhbGxlZCB0aGUKLQkgICAgIHVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2suICBUaGVyZSdzIG5vIHJlYWwgcG9pbnQgaW4KLQkgICAgIHRyeWluZyB0byBwZXJmb3JtIHRoZSByZWxvY2F0aW9uIGF0IHRoaXMgcG9pbnQsIHNvIHdlCi0JICAgICBqdXN0IHNraXAgYWhlYWQgdG8gdGhlIG5leHQgcmVsb2NhdGlvbi4gICovCi0JICBjb250aW51ZTsKLQotCWNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICh1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JICAgIC8qIElnbm9yZSBvdmVyZmxvdyB1bnRpbCB3ZSByZWFjaCB0aGUgbGFzdCByZWxvY2F0aW9uIGZvcgotCSAgICAgICBhIGdpdmVuIGxvY2F0aW9uLiAgKi8KLQkgICAgOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMKTsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2UndmUgZ290IGFub3RoZXIgcmVsb2NhdGlvbiBmb3IgdGhlIGFkZHJlc3MsIGtlZXAgZ29pbmcKLQkgdW50aWwgd2UgcmVhY2ggdGhlIGxhc3Qgb25lLiAgKi8KLSAgICAgIGlmICh1c2Vfc2F2ZWRfYWRkZW5kX3ApCi0JewotCSAgYWRkZW5kID0gdmFsdWU7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0ICYmICFBQklfNjRfUCAob3V0cHV0X2JmZCkpCi0JLyogU2VlIHRoZSBjb21tZW50IGFib3ZlIGFib3V0IHVzaW5nIFJfTUlQU182NCBpbiB0aGUgMzItYml0Ci0JICAgQUJJLiAgVW50aWwgbm93LCB3ZSd2ZSBiZWVuIHVzaW5nIHRoZSBIT1dUTyBmb3IgUl9NSVBTXzMyOwotCSAgIHRoYXQgY2FsY3VsYXRlZCB0aGUgcmlnaHQgdmFsdWUuICBOb3csIGhvd2V2ZXIsIHdlCi0JICAgc2lnbi1leHRlbmQgdGhlIDMyLWJpdCByZXN1bHQgdG8gNjQtYml0cywgYW5kIHN0b3JlIGl0IGFzIGEKLQkgICA2NC1iaXQgdmFsdWUuICBXZSBhcmUgZXNwZWNpYWxseSBnZW5lcm91cyBoZXJlIGluIHRoYXQgd2UKLQkgICBnbyB0byBleHRyZW1lIGxlbmd0aHMgdG8gc3VwcG9ydCB0aGlzIHVzYWdlIG9uIHN5c3RlbXMgd2l0aAotCSAgIG9ubHkgYSAzMi1iaXQgVk1BLiAgKi8KLQl7Ci0JICBiZmRfdm1hIHNpZ25fYml0czsKLQkgIGJmZF92bWEgbG93X2JpdHM7Ci0JICBiZmRfdm1hIGhpZ2hfYml0czsKLQotCSAgaWYgKHZhbHVlICYgKChiZmRfdm1hKSAxIDw8IDMxKSkKLQkgICAgc2lnbl9iaXRzID0gKChiZmRfdm1hKSAxIDw8IDMyKSAtIDE7Ci0JICBlbHNlCi0JICAgIHNpZ25fYml0cyA9IDA7Ci0KLQkgIC8qIElmIHdlIGRvbid0IGtub3cgdGhhdCB3ZSBoYXZlIGEgNjQtYml0IHR5cGUsCi0JICAgICBkbyB0d28gc2VwYXJhdGUgc3RvcmVzLiAgKi8KLQkgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgICAgewotCSAgICAgIC8qIFVuZG8gd2hhdCB3ZSBkaWQgYWJvdmUuICAqLwotCSAgICAgIHJlbC0+cl9vZmZzZXQgLT0gNDsKLQkgICAgICAvKiBTdG9yZSB0aGUgc2lnbi1iaXRzICh3aGljaCBhcmUgbW9zdCBzaWduaWZpY2FudCkKLQkJIGZpcnN0LiAgKi8KLQkgICAgICBsb3dfYml0cyA9IHNpZ25fYml0czsKLQkgICAgICBoaWdoX2JpdHMgPSB2YWx1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG93X2JpdHMgPSB2YWx1ZTsKLQkgICAgICBoaWdoX2JpdHMgPSBzaWduX2JpdHM7Ci0JICAgIH0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgbG93X2JpdHMsIAotCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBoaWdoX2JpdHMsIAotCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWN0dWFsbHkgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoIW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5mbywgaG93dG8sIHJlbCwgdmFsdWUsIGlucHV0X2JmZCwgCi0JCQkJCWlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQlyZXF1aXJlX2phbHgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaG9vayBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgd3JpdGVzIG91dCBhIGdsb2JhbAotICAgc3ltYm9sLiAgV2UgbWFyayBzeW1ib2xzIGFzIHNtYWxsIGNvbW1vbiBpZiBhcHByb3ByaWF0ZS4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgdW5kbyB0aGUgaW5jcmVtZW50IG9mIHRoZSB2YWx1ZSBmb3IgYSBtaXBzMTYgc3ltYm9sLiAgKi8KLQotLypBUkdTSUdOT1JFRCovCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIGlucHV0X3NlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotewotICAvKiBJZiB3ZSBzZWUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpbXBsaWVzIGEgcmVsb2NhdGFibGUgbGluaywgdGhlbgotICAgICBpZiBhIHN5bWJvbCB3YXMgc21hbGwgY29tbW9uIGluIGFuIGlucHV0IGZpbGUsIG1hcmsgaXQgYXMgc21hbGwKLSAgICAgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmIHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnNjb21tb24iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19TQ09NTU9OOwotCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKGFiZmQpIAkJXAotICAgKEFCSV9OMzJfUCAoYWJmZCkgPyAiL3Vzci9saWIzMi9saWJjLnNvLjEiIAlcCi0gICAgOiBBQklfNjRfUCAoYWJmZCkgPyAiL3Vzci9saWI2NC9saWJjLnNvLjEiIAlcCi0gICAgOiAiL3Vzci9saWIvbGliYy5zby4xIikKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXA7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEIHwgU0VDX1JFQURPTkxZKTsKLQotICAvKiBNaXBzIEFCSSByZXF1ZXN0cyB0aGUgLmR5bmFtaWMgc2VjdGlvbiB0byBiZSByZWFkIG9ubHkuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uIG9uIElSSVg2LiAgSXQgaXMgdXNlZCBieSB0aGUgZHluYW1pYwotICAgICBsaW5rZXIgdG8gc3BlZWQgdXAgZHluYW1pYyByZWxvY2F0aW9ucywgYW5kIHRvIGF2b2lkIGNvbXB1dGluZwotICAgICB0aGUgRUxGIGhhc2ggZm9yIHN5bWJvbHMuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgIW1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIENyZWF0ZSAuc3R1YiBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAKLQkJCSAgICAgICBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfQ09ERSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJICBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDUKLSAgICAgICYmICFpbmZvLT5zaGFyZWQKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJsZF9tYXAiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyAmIH5TRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsCi0JCQkJCSAgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04gKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE9uIElSSVg1LCB3ZSBhZGp1c3QgYWRkIHNvbWUgYWRkaXRpb25hbCBzeW1ib2xzIGFuZCBjaGFuZ2UgdGhlCi0gICAgIGFsaWdubWVudHMgb2Ygc2V2ZXJhbCBzZWN0aW9ucy4gIFRoZXJlIGlzIG5vIEFCSSBkb2N1bWVudGF0aW9uCi0gICAgIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIG5lY2Vzc2FyeSBvbiBJUklYNiwgbm9yIGFueSBldmlkZW5jZSB0aGF0Ci0gICAgIHRoZSBsaW5rZXIgdGFrZXMgc3VjaCBhY3Rpb24uICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NSkKLSAgICB7Ci0gICAgICBmb3IgKG5hbWVwID0gbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lczsgKm5hbWVwICE9IE5VTEw7IG5hbWVwKyspCi0JewotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCAqbmFtZXAsIEJTRl9HTE9CQUwsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2hhbmdlIGFsaWdtZW50cyBvZiBzb21lIHNlY3Rpb25zLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5oYXNoIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVnaW5mbyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgIH0KLQotICBpZiAoIWluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfRFlOQU1JQ19MSU5LIiwgQlNGX0dMT0JBTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9TRUNUSU9OOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQpCi0JewotCSAgLyogX19ybGRfbWFwIGlzIGEgZm91ciBieXRlIHdvcmQgbG9jYXRlZCBpbiB0aGUgLmRhdGEgc2VjdGlvbgotCSAgICAgYW5kIGlzIGZpbGxlZCBpbiBieSB0aGUgcnRsZCB0byBjb250YWluIGEgcG9pbnRlciB0bwotCSAgICAgdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gSXRzIHN5bWJvbCB2YWx1ZSB3aWxsIGJlIHNldCBpbgotCSAgICAgbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ybGRfbWFwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICJfX3JsZF9tYXAiLCBCU0ZfR0xPQkFMLCBzLAotCQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuY29tcGFjdF9yZWwiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JICAgICAgIHwgU0VDX1JFQURPTkxZKTsKLQotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJICBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbiB0byBob2xkIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAqLwotICBpZiAobWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlCi0gICAgIGFyZSBub3QgY3JlYXRpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHNldmVyYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFyZSByZXNlcnZlZC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IE1JUFNfUkVTRVJWRURfR09UTk8gKiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCk7Ci0KLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgbWlwc19nb3RfaW5mbykpOwotICBpZiAoZyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZy0+Z2xvYmFsX2dvdHN5bSA9IE5VTEw7Ci0gIGctPmxvY2FsX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgZy0+YXNzaWduZWRfZ290bm8gPSBNSVBTX1JFU0VSVkVEX0dPVE5POwotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT51c2VkX2J5X2JmZCA9Ci0JKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50ZGF0YSA9IChQVFIpIGc7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9mbGFncyAKLSAgICB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgLm1zeW0gc2VjdGlvbiBmb3IgQUJGRCwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QuICBSZXR1cm5zIE5VTEwgdG8gaW5kaWNhdGUgZXJyb3IuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gIGlmICghcykgCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gICAgICBpZiAoIXMKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIAotCQkJCSAgICAgU0VDX0FMTE9DCi0JCQkJICAgICB8IFNFQ19MT0FECi0JCQkJICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEIAotCQkJCSAgICAgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOIChhYmZkKSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQotCi0vKiBBZGQgcm9vbSBmb3IgTiByZWxvY2F0aW9ucyB0byB0aGUgLnJlbC5keW4gc2VjdGlvbiBpbiBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMgKGFiZmQsIG4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgCi0gIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50LiAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IE1JUFNfRUxGX1JFTF9TSVpFIChhYmZkKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotICBzLT5fcmF3X3NpemUgKz0gbiAqIE1JUFNfRUxGX1JFTF9TSVpFIChhYmZkKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGV4dHN5bW9mZiA9IChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpID8gMCA6IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgLyogQ2hlY2sgZm9yIHRoZSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gICovCi0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotICBpZiAoc3RybmNtcCAobmFtZSwgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLSAgICAgIC8qIExvb2sgYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGljaCBzeW1ib2wKLSAgICAgICAgIHRoaXMgaXMgZm9yLiAgKi8KLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NzLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgIHx8IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIC8qIFRoaXMgc3R1YiBpcyBmb3IgYSBsb2NhbCBzeW1ib2wuICBUaGlzIHN0dWIgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgbmVlZGVkIGlmIHRoZXJlIGlzIHNvbWUgcmVsb2NhdGlvbiBpbiB0aGlzIEJGRCwgb3RoZXIKLSAgICAgICAgICAgICB0aGFuIGEgMTYgYml0IGZ1bmN0aW9uIGNhbGwsIHdoaWNoIHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpzZWNfcmVsb2NzOwotCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyLCAqcmVuZDsKLQotCSAgICAgIC8qIFdlIGNhbiBpZ25vcmUgc3R1YiBzZWN0aW9ucyB3aGVuIGxvb2tpbmcgZm9yIHJlbG9jcy4gICovCi0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIEZOX1NUVUIsCi0JCQkgICAgICBzaXplb2YgRk5fU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBDQUxMX0ZQX1NUVUIsCi0JCQkgICAgICBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzZWNfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgICAgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoc2VjX3JlbG9jcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZW5kID0gc2VjX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotCSAgICAgIGZvciAociA9IHNlY19yZWxvY3M7IHIgPCByZW5kOyByKyspCi0JCWlmIChFTEYzMl9SX1NZTSAoci0+cl9pbmZvKSA9PSByX3N5bW5keAotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChyLT5yX2luZm8pICE9IFJfTUlQUzE2XzI2KQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKHNlY19yZWxvY3MpOwotCi0JICAgICAgaWYgKHIgPCByZW5kKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAobyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgaXMgbm8gbm9uLWNhbGwgcmVsb2MgZm9yIHRoaXMgc3R1Yiwgc28gd2UgZG8KLSAgICAgICAgICAgICAgICAgbm90IG5lZWQgaXQuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UKLSAgICAgICAgICAgICAgICAgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFCi0gICAgICAgICAgICAgICAgIGZsYWcuICAqLwotCSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogUmVjb3JkIHRoaXMgc3R1YiBpbiBhbiBhcnJheSBvZiBsb2NhbCBzeW1ib2wgc3R1YnMgZm9yCi0gICAgICAgICAgICAgdGhpcyBCRkQuICovCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7Ci0JICAgICAgYXNlY3Rpb24gKipuOwotCi0JICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLQkJc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBlbHNlCi0JCXN5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBuID0gKGFzZWN0aW9uICoqKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCQkgICAgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQkgICAgICBpZiAobiA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPSBuOwotCSAgICB9Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSA9IHNlYzsKLQotCSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgbWlwczE2X3N0dWJzX3NlZW4gaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgIFRoYXQgZmxhZyBpcyB1c2VkIHRvIHNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gbG9vayB0aHJvdWdoCi0gICAgICAgICAgICAgdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgZm9yIHN0dWJzLiAgV2UgZG9uJ3QgbmVlZCB0byBzZXQKLSAgICAgICAgICAgICBpdCBoZXJlLCBiZWNhdXNlIHdlIGp1c3QgaGF2ZSBhIGxvY2FsIHN0dWIuICAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgICAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLQotCSAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLwotCi0JICBoLT5mbl9zdHViID0gc2VjOwotCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCBDQUxMX1NUVUIsIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JICAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICoqbG9jOwotCi0gICAgICAvKiBMb29rIGF0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hpY2ggc3ltYm9sCi0gICAgICAgICB0aGlzIGlzIGZvci4gICovCi0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jcy0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmCi0JICB8fCBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgc3R1YiB3YXMgYWN0dWFsbHkgYnVpbHQgZm9yIGEgc3RhdGljIHN5bWJvbCBkZWZpbmVkCi0JICAgICBpbiB0aGUgc2FtZSBmaWxlLiAgV2UgYXNzdW1lIHRoYXQgYWxsIHN0YXRpYyBzeW1ib2xzIGluCi0JICAgICBtaXBzMTYgY29kZSBhcmUgdGhlbXNlbHZlcyBtaXBzMTYsIHNvIHdlIGNhbiBzaW1wbHkKLQkgICAgIGRpc2NhcmQgdGhpcyBzdHViLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCi0JICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4KLQkgICAgIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFIGZsYWcuICAqLwotCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLQotICAgICAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQlsb2MgPSAmaC0+Y2FsbF9mcF9zdHViOwotICAgICAgZWxzZQotCWxvYyA9ICZoLT5jYWxsX3N0dWI7Ci0KLSAgICAgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBzdHViIGZvciB0aGlzIGZ1bmN0aW9uLCB3ZQotCSBkb24ndCBuZWVkIGFub3RoZXIgb25lLCBzbyB3ZSBjYW4gZGlzY2FyZCB0aGlzIG9uZS4gIFNpbmNlCi0JIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMKLQkgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUKLQkgU0VDX0VYQ0xVREUgZmxhZy4gIFdlIGNhbiBhbHNvIGRpc2NhcmQgdGhpcyBzZWN0aW9uIGlmIHdlCi0JIGhhcHBlbiB0byBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIGlzIGEgbWlwczE2IGZ1bmN0aW9uOyBpdCBpcwotCSBub3QgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoaXMgaGVyZSwgYXMgaXQgaXMgY2hlY2tlZCBsYXRlciwgYnV0Ci0JIGl0IGlzIHNsaWdodGx5IGZhc3RlciB0byBjaGVjayBub3cuICAqLwotICAgICAgaWYgKCpsb2MgIT0gTlVMTCB8fCBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0JewotCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgKmxvYyA9IHNlYzsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZ290ID0gTlVMTDsKLSAgICAgIGcgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNnb3QgPSBtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoZHlub2JqKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JZyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLQkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBzcmVsb2MgPSBOVUxMOwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYpCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCi0JICAvKiBUaGlzIG1heSBiZSBhbiBpbmRpcmVjdCBzeW1ib2wgY3JlYXRlZCBiZWNhdXNlIG9mIGEgdmVyc2lvbi4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCB8fCBzZ290ID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX01JUFNfR09UMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotCSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX1BBR0U6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9PRlNUOgotCSAgICBjYXNlIFJfTUlQU19HT1RfRElTUDoKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBnID0gbWlwc19lbGZfZ290X2luZm8gKGR5bm9iaiwgJnNnb3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9NSVBTXzMyOgotCSAgICBjYXNlIFJfTUlQU19SRUwzMjoKLQkgICAgY2FzZSBSX01JUFNfNjQ6Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMCi0JCSAgJiYgKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIWggJiYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9MTzE2Ci0JCSB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9MTzE2Ci0JCSB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9ESVNQKSkKLQl7Ci0JICAvKiBXZSBtYXkgbmVlZCBhIGxvY2FsIEdPVCBlbnRyeSBmb3IgdGhpcyByZWxvY2F0aW9uLiAgV2UKLQkgICAgIGRvbid0IGNvdW50IFJfTUlQU19HT1RfUEFHRSBiZWNhdXNlIHdlIGNhbiBlc3RpbWF0ZSB0aGUKLQkgICAgIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCBieSBsb29raW5nIGF0IHRoZSBzaXplIG9mCi0JICAgICB0aGUgc2VnbWVudC4gIFNpbWlsYXIgY29tbWVudHMgYXBwbHkgdG8gUl9NSVBTX0dPVDE2LiAgV2UKLQkgICAgIGRvbid0IGNvdW50IFJfTUlQU19HT1RfSEkxNiwgb3IgUl9NSVBTX0NBTExfSEkxNiBiZWNhdXNlCi0JICAgICB0aGVzZSBhcmUgYWx3YXlzIGZvbGxvd2VkIGJ5IGFuIFJfTUlQU19HT1RfTE8xNiBvcgotCSAgICAgUl9NSVBTX0NBTExfTE8xNi4KLQotCSAgICAgVGhpcyBlc3RpbWF0aW9uIGlzIHZlcnkgY29uc2VydmF0aXZlIHNpbmNlIHdlIGNhbiBtZXJnZQotCSAgICAgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIEdPVC4gIEluIG9yZGVyIHRvIGJlIGxlc3MKLQkgICAgIGNvbnNlcnZhdGl2ZSwgd2UgY291bGQgYWN0dWFsbHkgYnVpbGQgdGhlIEdPVCBoZXJlLAotCSAgICAgcmF0aGVyIHRoYW4gaW4gcmVsb2NhdGVfc2VjdGlvbi4gICovCi0JICBnLT5sb2NhbF9nb3RubysrOwotCSAgc2dvdC0+X3Jhd19zaXplICs9IE1JUFNfRUxGX0dPVF9TSVpFIChkeW5vYmopOwotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9NSVBTX0NBTEwxNjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBDQUxMMTYgcmVsb2MgYXQgMHglbHggbm90IGFnYWluc3QgZ2xvYmFsIHN5bWJvbCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLQljYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0JICAgICAgaWYgKCFtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgKGgsIGluZm8sIGcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgc3R1Yiwgbm90IGEgcGx0IGVudHJ5IGZvciB0aGUgdW5kZWZpbmVkCi0JCSBmdW5jdGlvbi4gIEJ1dCB3ZSByZWNvcmQgaXQgYXMgaWYgaXQgbmVlZHMgcGx0LiAgU2VlCi0JCSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGluIGVsZmxpbmsuaC4gICovCi0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT50eXBlID0gU1RUX0ZVTkM7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfR09UMTY6Ci0JY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggJiYgIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMzI6Ci0JY2FzZSBSX01JUFNfUkVMMzI6Ci0JY2FzZSBSX01JUFNfNjQ6Ci0JICBpZiAoKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lID0gTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaik7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJCSAgNCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JCSAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlIGFzIFJfTUlQU19SRUwzMgotCQkgICByZWxvY3MuICBXZSBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MgaW4gdGhlCi0JCSAgIC5yZWwuZHluIHJlbG9jIHNlY3Rpb24uICAqLwotCQltaXBzX2VsZl9hbGxvY2F0ZV9keW5hbWljX3JlbG9jYXRpb25zIChkeW5vYmosIDEpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmhtaXBzOwotCi0JCSAgLyogV2Ugb25seSBuZWVkIHRvIGNvcHkgdGhpcyByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QuICAqLwotCQkgIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkJICArK2htaXBzLT5wb3NzaWJseV9keW5hbWljX3JlbG9jczsKLQkJfQotCSAgICAgCi0JICAgICAgLyogRXZlbiB0aG91Z2ggd2UgZG9uJ3QgZGlyZWN0bHkgbmVlZCBhIEdPVCBlbnRyeSBmb3IKLQkJIHRoaXMgc3ltYm9sLCBhIHN5bWJvbCBtdXN0IGhhdmUgYSBkeW5hbWljIHN5bWJvbAotCQkgdGFibGUgaW5kZXggZ3JlYXRlciB0aGF0IERUX01JUFNfR09UU1lNIGlmIHRoZXJlIGFyZQotCQkgZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IGl0LiAgKi8KLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoZHlub2JqKSkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KLQkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTXzI2OgotCWNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0JY2FzZSBSX01JUFNfTElURVJBTDoKLQljYXNlIFJfTUlQU19HUFJFTDMyOgotCSAgaWYgKFNHSV9DT01QQVQgKGR5bm9iaikpCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9Ci0JICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgbm90IGEgMTYgYml0IGNhbGwsIGFuZCBpdCBoYXMgYSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB3ZSB3aWxsIG5lZWQgdGhlIGZuX3N0dWIgaWYgdGhlcmUgaXMgb25lLgotICAgICAgICAgUmVmZXJlbmNlcyBmcm9tIGEgc3R1YiBzZWN0aW9uIGRvIG5vdCBjb3VudC4gKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl8yNgotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIEZOX1NUVUIsCi0JCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgIT0gMAotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfU1RVQiwKLQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX0ZQX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSAhPSAwKQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0JICBtaCA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICBtaC0+bmVlZF9mbl9zdHViID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1hc2VjdGlvbiAqCi1fYmZkX21pcHNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogPz8/IERvIG1pcHMxNiBzdHViIHNlY3Rpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsPyAgKi8KLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiAwCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBNSVBTIGNvZGUgZG9lcyBubyBzb3J0Ci0JICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0JICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaG1pcHM7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QsIHdlIG5lZWQgdG8gY29weQotICAgICBhbnkgUl9NSVBTXzMyIG9yIFJfTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCBpdCBpbnRvIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBobWlwcy0+cG9zc2libHlfZHluYW1pY19yZWxvY3MgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIG1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMgKGR5bm9iaiwgCi0JCQkJCSAgIGhtaXBzLT5wb3NzaWJseV9keW5hbWljX3JlbG9jcyk7Ci0KLSAgLyogRm9yIGEgZnVuY3Rpb24sIGNyZWF0ZSBhIHN0dWIsIGlmIG5lZWRlZC4gKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCB0aGVuIHNldAotCSB0aGUgc3ltYm9sIHRvIHRoZSBzdHViIGxvY2F0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlCi0JIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsCi0JIGV4ZWN1dGFibGUgYW5kIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIFdlIG5lZWQgLnN0dWIgc2VjdGlvbi4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgICAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0JICAvKiBYWFggV3JpdGUgdGhpcyBzdHViIGFkZHJlc3Mgc29tZXdoZXJlLiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBzdHViIGNvZGUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0JICAvKiBUaGUgbGFzdCBoYWxmIHdvcmQgb2YgdGhlIHN0dWIgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgaW5kZXgKLQkgICAgIG9mIHRoaXMgc3ltYm9sIGluIC5keW5zeW0gc2VjdGlvbi4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLAotICAgYW5kIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gb3V0cHV0IHNlY3Rpb25zLiAgV2UKLSAgIGNoZWNrIGZvciBhbnkgbWlwczE2IHN0dWIgc2VjdGlvbnMgdGhhdCB3ZSBjYW4gZGlzY2FyZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicwotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcmk7Ci0KLSAgLyogVGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGEgZml4ZWQgc2l6ZS4gICovCi0gIHJpID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVnaW5mbyIpOwotICBpZiAocmkgIT0gTlVMTCkKLSAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcmksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICAgbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzLAotCQkJICAgICAgIChQVFIpIE5VTEwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayB0aGUgbWlwczE2IHN0dWJzIGZvciBhIHBhcnRpY3VsYXIgc3ltYm9sLCBhbmQgc2VlIGlmIHdlIGNhbgotICAgZGlzY2FyZCB0aGVtLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoaC0+Zm5fc3R1YiAhPSBOVUxMCi0gICAgICAmJiAhIGgtPm5lZWRfZm5fc3R1YikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmbl9zdHViOyB0aGUgb25seSByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sCi0gICAgICAgICBhcmUgMTYgYml0IGNhbGxzLiAgQ2xvYmJlciB0aGUgc2l6ZSB0byAwIHRvIHByZXZlbnQgaXQgZnJvbQotICAgICAgICAgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Zm5fc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmZuX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgaWYgKGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMCi0gICAgICAmJiBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY2FsbF9zdHViOyB0aGlzIGlzIGEgMTYgYml0IGZ1bmN0aW9uLCBzbwotICAgICAgICAgY2FsbHMgZnJvbSBvdGhlciAxNiBiaXQgZnVuY3Rpb25zIGFyZSBPSy4gIENsb2JiZXIgdGhlIHNpemUKLSAgICAgICAgIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZyA9IE5VTEw7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplIAotCSAgICA9IHN0cmxlbiAoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpKSArIDE7Ci0JICBzLT5jb250ZW50cyAKLQkgICAgPSAoYmZkX2J5dGUgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIG9ubHkgc3RyaXAgdGhlIHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgaGFzIHRoZSBzYW1lIG5hbWUuICBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwKLSAgICAgICAgICAgICAgICAgaW5wdXQgc2VjdGlvbnMgZm9yIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcwotICAgICAgICAgICAgICAgICBjb2RlIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgdGhlc2UgZGF5cyBhbnlob3csIHNpbmNlCi0gICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbm93IGRvZXMgbm90IGNyZWF0ZSBlbXB0eSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgJiYgc3RyY21wIChuYW1lLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCQkJICAgcy0+b3V0cHV0X3NlY3Rpb24pKSA9PSAwKQotCQlzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4KLSAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpcyAucmVsLmR5biwgd2UgYWx3YXlzCi0gICAgICAgICAgICAgICAgIGFzc2VydCBhIERUX1RFWFRSRUwgZW50cnkgcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgIHRoZXJlIGV4aXN0cyBhIHJlbG9jYXRpb24gdG8gYSByZWFkIG9ubHkgc2VjdGlvbiBvcgotICAgICAgICAgICAgICAgICBub3QuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JICAgICAgaWYgKCh0YXJnZXQgIT0gTlVMTAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICB8fCBzdHJjbXAgKG91dG5hbWUsIAotCQkJICAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpID09IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIAotCQkJICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpICE9IDApCi0JCXMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgPT0gMCkKLQl7Ci0JICBpbnQgaTsKLSAJICBiZmRfc2l6ZV90eXBlIGxvYWRhYmxlX3NpemUgPSAwOwotIAkgIGJmZF9zaXplX3R5cGUgbG9jYWxfZ290bm87Ci0gCSAgc3RydWN0IF9iZmQgKnN1YjsKLQotIAkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHMpICE9IE5VTEwpOwotCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGE7Ci0gCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotIAkgIC8qIENhbGN1bGF0ZSB0aGUgdG90YWwgbG9hZGFibGUgc2l6ZSBvZiB0aGUgb3V0cHV0LiAgVGhhdAotIAkgICAgIHdpbGwgZ2l2ZSB1cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgR09UX1BBR0UgZW50cmllcwotIAkgICAgIHJlcXVpcmVkLiAgKi8KLSAJICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1Yjsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gCSAgICB7Ci0gCSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotIAotIAkgICAgICBmb3IgKHN1YnNlY3Rpb24gPSBzdWItPnNlY3Rpb25zOyAKLSAJCSAgIHN1YnNlY3Rpb247IAotIAkJICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0gCQl7Ci0gCQkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gCQkgICAgY29udGludWU7Ci0gCQkgIGxvYWRhYmxlX3NpemUgKz0gKHN1YnNlY3Rpb24tPl9yYXdfc2l6ZSArIDB4ZikgJiB+MHhmOwotIAkJfQotIAkgICAgfQotIAkgIGxvYWRhYmxlX3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLSAJICAvKiBBc3N1bWUgdGhlcmUgYXJlIHR3byBsb2FkYWJsZSBzZWdtZW50cyBjb25zaXN0aW5nIG9mCi0gCSAgICAgY29udGlndW91cyBzZWN0aW9ucy4gIElzIDUgZW5vdWdoPyAgKi8KLSAJICBsb2NhbF9nb3RubyA9IChsb2FkYWJsZV9zaXplID4+IDE2KSArIDU7Ci0JICBpZiAoSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NikKLQkgICAgLyogSXQncyBwb3NzaWJsZSB3ZSB3aWxsIG5lZWQgR09UX1BBR0UgZW50cmllcyBhcyB3ZWxsIGFzCi0JICAgICAgIEdPVDE2IGVudHJpZXMuICBPZnRlbiwgdGhlc2Ugd2lsbCBiZSBhYmxlIHRvIHNoYXJlIEdPVAotCSAgICAgICBlbnRyaWVzLCBidXQgbm90IGFsd2F5cy4gICovCi0JICAgIGxvY2FsX2dvdG5vICo9IDI7Ci0KLSAJICBnLT5sb2NhbF9nb3RubyArPSBsb2NhbF9nb3RubzsKLSAJICBzLT5fcmF3X3NpemUgKz0gbG9jYWxfZ290bm8gKiBNSVBTX0VMRl9HT1RfU0laRSAoZHlub2JqKTsKLQotIAkgIC8qIFRoZXJlIGhhcyB0byBiZSBhIGdsb2JhbCBHT1QgZW50cnkgZm9yIGV2ZXJ5IHN5bWJvbCB3aXRoCi0gCSAgICAgYSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBEVF9NSVBTX0dPVFNZTSBvcgotIAkgICAgIGhpZ2hlci4gIFRoZXJlZm9yZSwgaXQgbWFrZSBzZW5zZSB0byBwdXQgdGhvc2Ugc3ltYm9scwotIAkgICAgIHRoYXQgbmVlZCBHT1QgZW50cmllcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUuICBXZQotIAkgICAgIGRvIHRoYXQgaGVyZS4gICovCi0gCSAgaWYgKCFtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUgKGluZm8sIDEpKQotIAkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMKQotCSAgICBpID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHg7Ci0JICBlbHNlCi0JICAgIC8qIElmIHRoZXJlIGFyZSBubyBnbG9iYWwgc3ltYm9scywgb3Igbm9uZSByZXF1aXJpbmcKLQkgICAgICAgcmVsb2NhdGlvbnMsIHRoZW4gR0xPQkFMX0dPVFNZTSB3aWxsIGJlIE5VTEwuICAqLwotCSAgICBpID0gMDsKLQkgIGctPmdsb2JhbF9nb3RubyA9IGk7Ci0JICBzLT5fcmF3X3NpemUgKz0gaSAqIE1JUFNfRUxGX0dPVF9TSVpFIChkeW5vYmopOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSA9PSAwKQotCXsKLQkgIC8qIElyaXggcmxkIGFzc3VtZXMgdGhhdCB0aGUgZnVuY3Rpb24gc3R1YiBpc24ndCBhdCB0aGUgZW5kCi0JICAgICBvZiAudGV4dCBzZWN0aW9uLiBTbyBwdXQgYSBkdW1teS4gWFhYICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAgICAgICYmICEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5ybGRfbWFwIiwgOCkgPT0gMCkKLQl7Ci0JICAvKiBXZSBhZGQgYSByb29tIGZvciBfX3JsZF9tYXAuIEl0IHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZQotCSAgICAgcnRsZCB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiAgKi8KLQkgIHMtPl9yYXdfc2l6ZSArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuY29tcGFjdF9yZWwiLCAxMikgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemU7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkKLQkgICAgICAgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9Nc3ltKSAKLQkJCSogKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQKLQkJCSAgICsgYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSkpOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5pbml0IiwgNSkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9taXBzX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAvKiBTR0kgb2JqZWN0IGhhcyB0aGUgZXF1aXZhbGVuY2Ugb2YgRFRfREVCVUcgaW4gdGhlCi0JCSBEVF9NSVBTX1JMRF9NQVAgZW50cnkuICAqLwotCSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1JMRF9NQVAsIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosCi0JCQkJICAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaikpKQotCXsKLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9SRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9SRUxTWiwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1JFTEVOVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0NPTkZMSUNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTElCTElTVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbmZsaWN0IikgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19DT05GTElDVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubGlibGlzdCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTElCTElTVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1JMRF9WRVJTSU9OLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0ZMQUdTLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSNpZiAwCi0gICAgICAvKiBUaW1lIHN0YW1wcyBpbiBleGVjdXRhYmxlIGZpbGVzIGFyZSBhIGJhZCBpZGVhLiAgKi8KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1RJTUVfU1RBTVAsIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0lDSEVDS1NVTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSNpZiAwIC8qIEZJWE1FICAqLwotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfSVZFUlNJT04sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19CQVNFX0FERFJFU1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTE9DQUxfR09UTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfU1lNVEFCTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfVU5SRUZFWFROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19HT1RTWU0sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKElSSVhfQ09NUEFUIChkeW5vYmopID09IGljdF9pcml4NQotCSAgJiYgISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19ISVBBR0VOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoSVJJWF9DT01QQVQgKGR5bm9iaikgPT0gaWN0X2lyaXg2Ci0JICAmJiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JICAgICAgKGR5bm9iaiwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGR5bm9iaikpKQotCSAgJiYgIU1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX09QVElPTlMsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKQotCSAgJiYgIU1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX01TWU0sIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElmIE5BTUUgaXMgb25lIG9mIHRoZSBzcGVjaWFsIElSSVg2IHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbGlua2VyLAotICAgYWRqdXN0IGl0IGFwcHJvcHJpYXRlbHkgbm93LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAoYWJmZCwgbmFtZSwgc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICAvKiBUaGUgbGlua2VyIHNjcmlwdCB0YWtlcyBjYXJlIG9mIHByb3ZpZGluZyBuYW1lcyBhbmQgdmFsdWVzIGZvcgotICAgICB0aGVzZSwgYnV0IHdlIG11c3QgcGxhY2UgdGhlbSBpbnRvIHRoZSByaWdodCBzZWN0aW9ucy4gICovCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCB0ZXh0X3NlY3Rpb25fc3ltYm9sc1tdID0gewotICAgICJfZnRleHQiLAotICAgICJfZXRleHQiLAotICAgICJfX2Rzb19kaXNwbGFjZW1lbnQiLAotICAgICJfX2VsZl9oZWFkZXIiLAotICAgICJfX3Byb2dyYW1faGVhZGVyX3RhYmxlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGFfc2VjdGlvbl9zeW1ib2xzW10gPSB7Ci0gICAgIl9mZGF0YSIsCi0gICAgIl9lZGF0YSIsCi0gICAgIl9lbmQiLAotICAgICJfZmJzcyIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGNvbnN0ICpwOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQotICAgIGZvciAocCA9IChpID09IDApID8gdGV4dF9zZWN0aW9uX3N5bWJvbHMgOiBkYXRhX3NlY3Rpb25fc3ltYm9sczsgCi0JICpwOwotCSArK3ApCi0gICAgICBpZiAoc3RyY21wICgqcCwgbmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBBbGwgb2YgdGhlc2Ugc3ltYm9scyBhcmUgZ2l2ZW4gdHlwZSBTVFRfU0VDVElPTiBieSB0aGUKLQkgICAgIElSSVg2IGxpbmtlci4gICovCi0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgCi0JICAvKiBUaGUgSVJJWCBsaW5rZXIgcHV0cyB0aGVzZSBzeW1ib2xzIGluIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotCSAgaWYgKGkgPT0gMCkKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCSAgCi0JICBicmVhazsKLQl9Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3ZhbDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzbXN5bTsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBndmFsID0gc3ltLT5zdF92YWx1ZTsKLSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX2J5dGUgc3R1YltNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRV07Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIHN0dWIuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHN0dWIuICAqLwotICAgICAgcCA9IHN0dWI7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xXKG91dHB1dF9iZmQpLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTU9WRSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBDYW4gaC0+ZHluaW5kZXggYmUgbW9yZSB0aGFuIDY0Sz8gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCAmIDB4ZmZmZjAwMDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0pBTFIsIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MSTE2ICsgaC0+ZHluaW5keCwgcCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdC5vZmZzZXQgPD0gcy0+X3Jhd19zaXplKTsKLSAgICAgIG1lbWNweSAocy0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBzdHViLCBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuICBwbHQub2Zmc2V0ICE9IC0xIG9jY3VycwotCSBvbmx5IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQotICAgICAgLyogVGhlIHJ1bi10aW1lIGxpbmtlciB1c2VzIHRoZSBzdF92YWx1ZSBmaWVsZCBvZiB0aGUgc3ltYm9sCi0JIHRvIHJlc2V0IHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciB0aGlzIGV4dGVybmFsCi0JIHRvIGl0cyBzdHViIGFkZHJlc3Mgd2hlbiB1bmxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGd2YWwgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCArIGgtPnBsdC5vZmZzZXQ7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gZ3ZhbDsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgLyogUnVuIHRocm91Z2ggdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUsIGNyZWF0aW5nIEdPVCBlbnRyaWVzIGZvciBhbGwKLSAgICAgdGhlIHN5bWJvbHMgdGhhdCBuZWVkIHRoZW0uICAqLwotICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMCi0gICAgICAmJiBoLT5keW5pbmR4ID49IGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHgpCi0gICAgewotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotCi0gICAgICBpZiAoc3ltLT5zdF92YWx1ZSkKLQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0gICAgICBlbHNlCi0JLyogRm9yIGFuIGVudGl0eSBkZWZpbmVkIGluIGEgc2hhcmVkIG9iamVjdCwgdGhpcyB3aWxsIGJlCi0JICAgTlVMTC4gIChGb3IgZnVuY3Rpb25zIGluIHNoYXJlZCBvYmplY3RzIGZvcgotCSAgIHdoaWNoIHdlIGhhdmUgY3JlYXRlZCBzdHVicywgU1RfVkFMVUUgd2lsbCBiZSBub24tTlVMTC4KLQkgICBUaGF0J3MgYmVjYXVzZSBzdWNoIHRoZSBmdW5jdGlvbnMgYXJlIG5vdyBubyBsb25nZXIgZGVmaW5lZAotCSAgIGluIGEgc2hhcmVkIG9iamVjdC4pICAqLwotCXZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgb2Zmc2V0ID0gbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCAoZHlub2JqLCBoKTsKLSAgICAgIE1JUFNfRUxGX1BVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmZzZXQpOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSAubXN5bSBlbnRyeSwgaWYgYXBwcm9wcmlhdGUuICAqLwotICBzbXN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgaWYgKHNtc3ltKQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX01zeW0gbXN5bTsKLQotICAgICAgbXN5bS5tc19oYXNoX3ZhbHVlID0gYmZkX2VsZl9oYXNoIChoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIC8qIEl0IGlzIHVuZG9jdW1lbnRlZCB3aGF0IHRoZSBgMScgaW5kaWNhdGVzLCBidXQgSVJJWDYgdXNlcwotCSB0aGlzIHZhbHVlLiAgKi8KLSAgICAgIG1zeW0ubXNfaW5mbyA9IEVMRjMyX01TX0lORk8gKG1oLT5taW5fZHluX3JlbG9jX2luZGV4LCAxKTsKLSAgICAgIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IAotCShkeW5vYmosICZtc3ltLAotCSAoKEVsZjMyX0V4dGVybmFsX01zeW0gKikgc21zeW0tPmNvbnRlbnRzKSArIGgtPmR5bmluZHgpOwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChuYW1lLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUNfTElOSyIpID09IDApCi0gICAgewotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0gICAgICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLT5zdF92YWx1ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3RfdmFsdWUgPSBlbGZfZ3AgKG91dHB1dF9iZmQpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1swXSkgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMV0pID09IDApCi0JewotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3Rfb3RoZXIgPSBTVE9fUFJPVEVDVEVEOwotCSAgc3ltLT5zdF92YWx1ZSA9IDA7Ci0JICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMl0pID09IDApCi0JewotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3Rfb3RoZXIgPSBTVE9fUFJPVEVDVEVEOwotCSAgc3ltLT5zdF92YWx1ZSA9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQ7Ci0JICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRiAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpCi0JewotCSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19URVhUOwotCSAgZWxzZSBpZiAoaC0+dHlwZSA9PSBTVFRfT0JKRUNUKQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgSVJJWDYtc3BlY2lmaWMgc3ltYm9scy4gICovCi0gIGlmIChJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg2KQotICAgIG1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgbmFtZSwgc3ltKTsKLQotICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLSAgICAgICYmICEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9tYXAiKSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ybGRfbWFwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgc3ltLT5zdF92YWx1ZSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHMtPmNvbnRlbnRzKTsKLQkgIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID09IDApCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLQl7Ci0JICAvKiBJUklYNiBkb2VzIG5vdCB1c2UgYSAucmxkX21hcCBzZWN0aW9uLiAgKi8KLQkgIGlmIChJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg1KQotCSAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJsZF9tYXAiKSAKLQkJCSE9IE5VTEwpOwotCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHN5bWJvbCwgZm9yY2UgdGhlIHZhbHVlIHRvIGJlIGV2ZW4uICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2Ci0gICAgICAmJiAoc3ltLT5zdF92YWx1ZSAmIDEpICE9IDApCi0gICAgLS1zeW0tPnN0X3ZhbHVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBpZiAoc2dvdCA9PSBOVUxMKQotICAgIGcgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqYjsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgICAgIGZvciAoYiA9IHNkeW4tPmNvbnRlbnRzOwotCSAgIGIgPCBzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZTsKLQkgICBiICs9IE1JUFNfRUxGX0RZTl9TSVpFIChkeW5vYmopKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIHNpemVfdCBlbGVtc2l6ZTsKLQkgIGFzZWN0aW9uICpzOwotCSAgYm9vbGVhbiBzd2FwX291dF9wOwotCi0JICAvKiBSZWFkIGluIHRoZSBjdXJyZW50IGR5bmFtaWMgZW50cnkuICAqLwotCSAgKCpnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZHlub2JqKS0+cy0+c3dhcF9keW5faW4pIChkeW5vYmosIGIsICZkeW4pOwotCSAgCi0JICAvKiBBc3N1bWUgdGhhdCB3ZSdyZSBnb2luZyB0byBtb2RpZnkgaXQgYW5kIHdyaXRlIGl0IG91dC4gICovCi0JICBzd2FwX291dF9wID0gdHJ1ZTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9SRUxFTlQ6Ci0JICAgICAgcyA9IChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkJICAgKGR5bm9iaiwKLQkJICAgIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopKSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IE1JUFNfRUxGX1JFTF9TSVpFIChkeW5vYmopOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfU1RSU1o6Ci0JICAgICAgLyogUmV3cml0ZSBEVF9TVFJTWi4gICovCi0JICAgICAgZHluLmRfdW4uZF92YWwgPQotCQlfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gMTsgLyogWFhYICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0ZMQUdTOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gUkhGX05PVFBPVDsgLyogWFhYICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JICAgICAgbmFtZSA9ICIuY29uZmxpY3QiOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9Db25mbGljdCk7Ci0JICAgICAgZ290byBzZXRfZWxlbW5vOwotCi0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JICAgICAgbmFtZSA9ICIubGlibGlzdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0xpYik7Ci0JICAgIHNldF9lbGVtbm86Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZSAvIGVsZW1zaXplOwotCQl9Ci0JICAgICAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOgotCSAgICAgIHRpbWUgKCh0aW1lX3QgKikgJmR5bi5kX3VuLmRfdmFsKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBzd2FwX291dF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBzd2FwX291dF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzoKLQkgICAgICBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYSAmIH4oMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLQkgICAgICAvKiBUaGUgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgd2hpY2ggaXMgdGhlCi0JCSBlbnRyeSBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sIHRoYXQgaXMgbm90Ci0JCSByZWZlcmVuY2VkIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QuICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSArIDE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0dPVFNZTToKLQkgICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSkKLQkJewotCQkgIGR5bi5kX3VuLmRfdmFsID0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIEluIGNhc2UgaWYgd2UgZG9uJ3QgaGF2ZSBnbG9iYWwgZ290IHN5bWJvbHMgd2UgZGVmYXVsdAotCQkgdG8gc2V0dGluZyBEVF9NSVBTX0dPVFNZTSB0byB0aGUgc2FtZSB2YWx1ZSBhcwotCQkgRFRfTUlQU19TWU1UQUJOTywgc28gd2UganVzdCBmYWxsIHRocm91Z2guICAqLwotCi0JICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGVsZW1zaXplID0gTUlQU19FTEZfU1lNX1NJWkUgKG91dHB1dF9iZmQpOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+bG9jYWxfZ290bm8gLSBNSVBTX1JFU0VSVkVEX0dPVE5POwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfTUFQOgotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfT1BUSU9OUzoKLQkgICAgICBzID0gKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIAotCQkgICAob3V0cHV0X2JmZCwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX01TWU06Ci0JICAgICAgcyA9IChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkJICAgKG91dHB1dF9iZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3dhcF9vdXRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzd2FwX291dF9wKQotCSAgICAoKmdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5zLT5zd2FwX2R5bl9vdXQpIAotCSAgICAgIChkeW5vYmosICZkeW4sIGIpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYmUgZmlsbGVkIGF0Ci0gICAgIHJ1bnRpbWUuIFRoZSBzZWNvbmQgZW50cnkgd2lsbCBiZSB1c2VkIGJ5IHNvbWUgcnVudGltZSBsb2FkZXJzLgotICAgICBUaGlzIGlzbid0IHRoZSBjYXNlIG9mIElyaXggcmxkLiAqLwotICBpZiAoc2dvdCAhPSBOVUxMICYmIHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgTUlQU19FTEZfUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBNSVBTX0VMRl9QVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIAotCQkJIHNnb3QtPmNvbnRlbnRzICsgTUlQU19FTEZfR09UX1NJWkUgKG91dHB1dF9iZmQpKTsKLSAgICB9Ci0KLSAgaWYgKHNnb3QgIT0gTlVMTCkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUKLSAgICAgID0gTUlQU19FTEZfR09UX1NJWkUgKG91dHB1dF9iZmQpOwotCi0gIHsKLSAgICBhc2VjdGlvbiAqc21zeW07Ci0gICAgYXNlY3Rpb24gKnM7Ci0gICAgRWxmMzJfY29tcGFjdF9yZWwgY3B0OwotCi0gICAgLyogPz8/IFRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMgd2VyZSBzZXQgdXAgaW4KLSAgICAgICBfYmZkX2VsZl9maW5hbF9saW5rLiAgU0dJIHNldHMgdGhlIFNUVF9OT1RZUEUgYXR0cmlidXRlIGZvciB0aGVzZQotICAgICAgIHN5bWJvbHMuICBTaG91bGQgd2UgZG8gc28/ICAqLwotCi0gICAgc21zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICBpZiAoc21zeW0gIT0gTlVMTCkKLSAgICAgIHsKLQlFbGYzMl9JbnRlcm5hbF9Nc3ltIG1zeW07Ci0KLQltc3ltLm1zX2hhc2hfdmFsdWUgPSAwOwotCW1zeW0ubXNfaW5mbyA9IEVMRjMyX01TX0lORk8gKDAsIDEpOwotCi0JZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICB7Ci0JICAgIGxvbmcgZHluaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCi0JICAgIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IAotCSAgICAgIChvdXRwdXRfYmZkLCAmbXN5bSwKLQkgICAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpCi0JCSsgZHluaW5keCkpOwotCSAgfQotICAgICAgfQotCi0gICAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgICAgewotCS8qIFdyaXRlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG91dC4gICovCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29tcGFjdF9yZWwiKTsKLQlpZiAocyAhPSBOVUxMKQotCSAgewotCSAgICBjcHQuaWQxID0gMTsKLQkgICAgY3B0Lm51bSA9IHMtPnJlbG9jX2NvdW50OwotCSAgICBjcHQuaWQyID0gMjsKLQkgICAgY3B0Lm9mZnNldCA9IChzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcwotCQkJICArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgICAgY3B0LnJlc2VydmVkMCA9IDA7Ci0JICAgIGNwdC5yZXNlcnZlZDEgPSAwOwotCSAgICBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQgKG91dHB1dF9iZmQsICZjcHQsCi0JCQkJCSAgICAoKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopCi0JCQkJCSAgICAgcy0+Y29udGVudHMpKTsKLQotCSAgICAvKiBDbGVhbiB1cCBhIGR1bW15IHN0dWIgZnVuY3Rpb24gZW50cnkgaW4gLnRleHQuICAqLwotCSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJCSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0JICAgIGlmIChzICE9IE5VTEwpCi0JICAgICAgewotCQlmaWxlX3B0ciBkdW1teV9vZmZzZXQ7Ci0KLQkJQkZEX0FTU0VSVCAocy0+X3Jhd19zaXplID49IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKLQkJZHVtbXlfb2Zmc2V0ID0gcy0+X3Jhd19zaXplIC0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0JCW1lbXNldCAocy0+Y29udGVudHMgKyBkdW1teV9vZmZzZXQsIDAsCi0JCQlNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgLyogQ2xlYW4gdXAgYSBmaXJzdCByZWxvY2F0aW9uIGluIC5yZWwuZHluLiAgKi8KLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICBpZiAocyAhPSBOVUxMICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCBNSVBTX0VMRl9SRUxfU0laRSAoZHlub2JqKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBiZmRfZ2VuZXJpY19nZXRfLi4uIGV4Y2VwdCB0aGF0IHNvbWUKLSAgIE1JUFMgcmVsb2NhdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFNpZ2guICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgKFBUUikgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50OwotICAgICAgLyogZm9yIG1pcHMgKi8KLSAgICAgIGludCBncF9mb3VuZDsKLSAgICAgIGJmZF92bWEgZ3AgPSAweDEyMzQ1Njc4OwkvKiBpbml0aWFsaXplIGp1c3QgdG8gc2h1dCBnY2MgdXAgKi8KLQotICAgICAgewotCXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGg7Ci0JLyogU2tpcCBhbGwgdGhpcyBzdHVmZiBpZiB3ZSBhcmVuJ3QgbWl4aW5nIGZvcm1hdHMuICAqLwotCWlmIChhYmZkICYmIGlucHV0X2JmZAotCSAgICAmJiBhYmZkLT54dmVjID09IGlucHV0X2JmZC0+eHZlYykKLQkgIGxoID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIGggPSBiZmRfaGFzaF9sb29rdXAgKCZsaW5rX2luZm8tPmhhc2gtPnRhYmxlLCAiX2dwIiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgbGggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIH0KLSAgICAgIGxvb2t1cDoKLQlpZiAobGgpCi0JICB7Ci0JICAgIHN3aXRjaCAobGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQlncF9mb3VuZCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQlncF9mb3VuZCA9IDE7Ci0JCWdwID0gbGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0JCWxoID0gbGgtPnUuaS5saW5rOwotCQkvKiBAQEZJWE1FICBpZ25vcmluZyB3YXJuaW5nIGZvciBub3cgKi8KLQkJZ290byBsb29rdXA7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgZ3BfZm91bmQgPSAwOwotICAgICAgfQotICAgICAgLyogZW5kIG1pcHMgKi8KLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogU3BlY2lmaWMgdG8gTUlQUzogRGVhbCB3aXRoIHJlbG9jYXRpb24gdHlwZXMgdGhhdCByZXF1aXJlCi0JICAgICBrbm93aW5nIHRoZSBncCBvZiB0aGUgb3V0cHV0IGJmZC4gICovCi0JICBhc3ltYm9sICpzeW0gPSAqKCpwYXJlbnQpLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgYWJmZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIHdvdWxkbid0IGdldCBjYWxsZWQgYW55d2F5cy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCFncF9mb3VuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBncCBpc24ndCB0aGVyZTsgbGV0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGNvZGUKLQkJIGZhbGwgb3ZlciBvbiBpdHMgb3duLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKCpwYXJlbnQpLT5ob3d0by0+c3BlY2lhbF9mdW5jdGlvbgotCQkgICA9PSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpCi0JICAgIHsKLQkgICAgICAvKiBieXBhc3Mgc3BlY2lhbF9mdW5jdGlvbiBjYWxsICovCi0JICAgICAgciA9IGdwcmVsMTZfd2l0aF9ncCAoaW5wdXRfYmZkLCBzeW0sICpwYXJlbnQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgcmVsb2NhdGVhYmxlLCAoUFRSKSBkYXRhLCBncCk7Ci0JICAgICAgZ290byBza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb247Ci0JICAgIH0KLQkgIC8qIGVuZCBtaXBzIHNwZWNpZmljIHN0dWZmICovCi0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKnBhcmVudCwKLQkJCQkgICAgICAoUFRSKSBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgICAmZXJyb3JfbWVzc2FnZSk7Ci0Jc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOgotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcywKLQkJCSB0cnVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0MCi0vKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQotICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDQsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlbWlwcyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZ21pcHMiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfbWlwcwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9NSVBTCi0KLS8qIFRoZSBTVlI0IE1JUFMgQUJJIHNheXMgdGhhdCB0aGlzIHNob3VsZCBiZSAweDEwMDAwLCBidXQgSXJpeCA1IHVzZXMKLSAgIGEgdmFsdWUgb2YgMHgxMDAwLCBhbmQgd2UgYXJlIGNvbXBhdGlibGUuICAqLwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0CQl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hCXRydWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1pcHNfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCW1pcHNfZWxmX3N5bV9pc19nbG9iYWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAotCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawlfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCV9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCV9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawlfYmZkX21pcHNfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCV9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkoNCpNSVBTX1JFU0VSVkVEX0dPVE5PKQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawlfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwlfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXBqLmMgYi9iZmQvZWxmMzItcGouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5Njk0OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcGouYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKiBwaWNvSmF2YSBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYW4gb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcGouaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwal9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcGpfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcGpfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUEpfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1BKX0RBVEFfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0RJUjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZjZ3ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfUkVMMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBIT1dUTyAoUl9QSl9DT0RFX0RJUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0NPREVfRElSMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDcpLAotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLQotICBIT1dUTyAoUl9QSl9DT0RFX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfTE8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0gICAgSE9XVE8gKFJfUEpfQ09ERV9ISTE2LAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcGpfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QSl9ISTE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1BKX0dOVV9WVElOSEVSSVQsICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVElOSEVSSVQiLCAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUEpfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGpfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgZW51bSBlbGZfcGpfcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gKGVudW0gZWxmX3BqX3JlbG9jX3R5cGUpIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICBzeW1fdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHN5bV92YWx1ZSA9IChzeW1ib2xfaW4tPnZhbHVlICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEpfREFUQV9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUmVsb2NhdGlvbnMgaW4gY29kZSBhcmUgYWx3YXlzIGJpZ2VuZGlhbiwgbm8gbWF0dGVyIHdoYXQgdGhlCi0JIGRhdGEgZW5kaWFubmVzcyBpcy4gKi8KLQotICAgIGNhc2UgUl9QSl9DT0RFX0RJUjMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRiMzIgKGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BKX0NPREVfUkVMMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0gICAgICAgIC0gIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYmZkX3B1dGIxNiAoaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BKX0NPREVfTE8xNjoKLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QSl9DT0RFX0hJMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSAoc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZCkgPj4gMTY7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBCRkQgcmVsb2MgY29kZXMgdG8gUEogRUxGIHJlbG9jcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0vKiBBbiBhcnJheSBtYXBwaW5nIEJGRCByZWxvYyBjb2RlcyB0byBQSiBFTEYgcmVsb2NzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIHBqX3JlbG9jX21hcFtdID0KLXsKLSAgICB7IEJGRF9SRUxPQ19OT05FLCAJCVJfUEpfTk9ORSAgICAgICAgICB9LAotICAgIHsgQkZEX1JFTE9DXzMyLCAJCVJfUEpfREFUQV9ESVIzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsIAlSX1BKX0NPREVfRElSMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLCAJUl9QSl9DT0RFX0RJUjMyICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2LCAJUl9QSl9DT0RFX0xPMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2LCAJUl9QSl9DT0RFX0hJMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMiwgIFJfUEpfQ09ERV9SRUwzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfUkVMMTYsICBSX1BKX0NPREVfUkVMMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9QSl9HTlVfVlRJTkhFUklUIH0sCi0gICAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfUEpfR05VX1ZURU5UUlkgICB9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgY29kZSwgcmV0dXJuIHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgY29ycmVzcG9uZGluZyBQSiBFTGYgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1wal9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwal9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocGpfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnBqX2VsZl9ob3d0b190YWJsZVsoaW50KSBwal9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1BKX21heCk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZwal9lbGZfaG93dG9fdGFibGVbcl07Ci19Ci0KLS8qIFRha2UgdGhpcyBtb21lbnQgdG8gZmlsbCBpbiB0aGUgc3BlY2lhbCBwaWNvSmF2YSBiaXRzIGluIHRoZQotICAgZV9mbGFncyBmaWVsZC4gKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9QSUNPSkFWQV9BUkNIOwotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BJQ09KQVZBX0dOVUNBTExTOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfcGpfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBqIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfcGpsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXBqbCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3BqCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEoKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgICAgICAgICAgIHBqX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgICAgICAgICBwal9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJICAgICAgICAgICAgIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItcHBjLmMgYi9iZmQvZWxmMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzNlZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1NCArMCwwIEBACi0vKiBQb3dlclBDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUG93ZXJQQyBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBQb3dlclBDIEVMRiBBQkkuICBJdCBpbmNsdWRlcwotICAgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgRW1iZWRkZWQgUG93ZXJQQyBBQkksIGFuZCB0aGF0Ci0gICBpbmZvcm1hdGlvbiBtYXkgYWxzbyBub3QgbWF0Y2guICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLSNkZWZpbmUgVVNFX1JFTEEJCS8qIHdlIHdhbnQgUkVMQSByZWxvY2F0aW9ucywgbm90IFJFTCAqLwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmNhY2hlX3B0ciwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2hvd3RvX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotc3RhdGljIGludCBwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY2hlY2tfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqIHBwY19lbGZfZ2NfbWFya19ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJRWxmX0ludGVybmFsX1JlbGEgKnJlbCwKLQkJCQkJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkJRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjLAotCQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJCSBiZmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqLAotCQkJCQkJIGJmZF9ieXRlICosCi0JCQkJCQkgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywKLQkJCQkJCSBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLAotCQkJCQkJIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRkX3N5bWJvbF9ob29rICBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJCSBjb25zdCBjaGFyICoqLAotCQkJCQkJIGZsYWd3b3JkICosCi0JCQkJCQkgYXNlY3Rpb24gKiosCi0JCQkJCQkgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIEJSQU5DSF9QUkVESUNUX0JJVCAweDIwMDAwMAkJLyogYnJhbmNoIHByZWRpY3Rpb24gYml0IGZvciBicmFuY2ggdGFrZW4gcmVsb2NzICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX01BU0sgMHgwMDFmMDAwMAkJLyogbWFzayB0byBzZXQgUkEgaW4gbWVtb3J5IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBSQV9SRUdJU1RFUl9TSElGVCAxNgkJCS8qIHZhbHVlIHRvIHNoaWZ0IHJlZ2lzdGVyIGJ5IHRvIGluc2VydCBSQSAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLS8qIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBsdCByZXNlcnZlZCBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLSNkZWZpbmUgUExUX0lOSVRJQUxfRU5UUllfU0laRSA3MgotLyogVGhlIHNpemUgb2YgdGhlIGdhcCBiZXR3ZWVuIGVudHJpZXMgaW4gdGhlIFBMVC4gICovCi0jZGVmaW5lIFBMVF9TTE9UX1NJWkUgOAotLyogVGhlIG51bWJlciBvZiBzaW5nbGUtc2xvdCBQTFQgZW50cmllcyAodGhlIHJlc3QgdXNlIHR3byBzbG90cykuICAqLwotI2RlZmluZSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTIDgxOTIKLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpUl9QUENfbWF4IF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1BQQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4KLSAgICAgRklYTUU6IHdlIGRvbid0IGNoZWNrIHRoYXQsIHdlIGp1c3QgY2xlYXIgdGhlbS4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIyNCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVsb2NhdGlvbiB3aXRob3V0IG92ZXJmbG93LiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLCBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsIGlzIG5lZ2F0aXZlLgkqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoLCBmb3Igd2hpY2ggYml0IDEwIHNob3VsZCBiZSBzZXQgdG8KLSAgICAgaW5kaWNhdGUgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuLglUaGUgbG93ZXIgdHdvCi0gICAgIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNF9CUlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyCi0gICAgIHR3byBiaXRzIG11c3QgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfUkVMMTQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZQotICAgICB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTRfQlJUQUtFTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyIHR3byBiaXRzIG11c3QKLSAgICAgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUk5UQUtFTiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvciB0aGUKLSAgICAgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHJlZmVycmluZyB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLSAgICAgZW50cnkgZm9yIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVFJFTDI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIGlzIHVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGUgc3ltYm9sIHNob3VsZCBleGlzdAotICAgICBib3RoIGluIHRoZSBvYmplY3QgYmVpbmcgcnVuIGFuZCBpbiBzb21lIHNoYXJlZCBsaWJyYXJ5LiAgVGhlCi0gICAgIGR5bmFtaWMgbGlua2VyIGNvcGllcyB0aGUgZGF0YSBhZGRyZXNzZWQgYnkgdGhlIHN5bWJvbCBmcm9tIHRoZQotICAgICBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBvYmplY3QsIGJlY2F1c2UgdGhlIG9iamVjdCBiZWluZwotICAgICBydW4gaGFzIHRvIGhhdmUgdGhlIGRhdGEgYXQgc29tZSBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQ09QWSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0NPUFkiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgdXNlZCB3aGVuIHNldHRpbmcgZ2xvYmFsIG9mZnNldCB0YWJsZQotICAgICBlbnRyaWVzLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dMT0JfREFULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTE9CX0RBVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1hcmtzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0pNUF9TTE9ULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19KTVBfU0xPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgV2hlbiB0aGUgb2JqZWN0IGlzIHJ1biwgdGhpcwotICAgICBsb25nd29yZCBpcyBzZXQgdG8gdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LCBwbHVzIHRoZQotICAgICBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9QUENfUkVMQVRJVkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTEFUSVZFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aGluIHRoZQotICAgICBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIGZpbmFsIHZhbHVlLiAgTm9ybWFsbHkgdXNlZCBmb3IKLSAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0xPQ0FMMjRQQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19MT0NBTDI0UEMiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgbWF5IGJlIHVuYWxpZ25lZC4gICovCi0gIEhPV1RPIChSX1BQQ19VQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19VQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTYsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9QUENfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfTE8sIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9ISSwgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hBLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc2lnbi1leHRlbmRlZCAxNiBiaXQgdmFsdWUgcmVsYXRpdmUgdG8gX1NEQV9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuICAqLwotICBIT1dUTyAoUl9QUENfU0RBUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NEQVJFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19TRUNUT0ZGIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCBsb3dlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfTE8sCSAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNi1iaXQgdXBwZXIgaGFsZiBhZGp1c3RlZCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGX0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAotICAgICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLQotICAvKiAzMiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfTkFERFIzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX0FERFIxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hJIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFkZGVuZCBtaW51cyB0aGUgYWRkcmVzcywKLSAgICAgcGx1cyAxIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgbG93IDE2IGJpdHMsIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyLAotICAgICBpcyBuZWdhdGl2ZS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hBIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREFfQkFTRV8gZm9yIHRoYXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQUkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBSTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhMiBzZWN0aW9uLCBhbmQgcmV0dXJuaW5nIHRoZSBvZmZzZXQgZnJvbQotICAgICBfU0RBMl9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMkkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBMkkxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBMl9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuCSAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQTJSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfIG9yIF9TREEyX0JBU0VfLCBmaWxsaW5nIGluIHRoZSAxNiBiaXQKLSAgICAgc2lnbmVkIG9mZnNldCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBiYXNlLCBhbmQgZmlsbGluZyBpbiB0aGUgcmVnaXN0ZXIKLSAgICAgZmllbGQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKDAsIDIsIG9yIDEzKS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMjEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX01SS1JFRiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU0VDMTYgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0xPICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9ISSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfSEEgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX0JJVF9GTEQgKi8KLQotICAvKiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcKLSAgICAgaW4gdGhlIDE2IGJpdCBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZQotICAgICByZWdpc3RlciBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9SRUxTREEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1JFTFNEQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQaG9ueSByZWxvYyB0byBoYW5kbGUgQUlYIHN0eWxlIFRPQyBlbnRyaWVzICovCi0gIEhPV1RPIChSX1BQQ19UT0MxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1RPQzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0MCi0vKiBJbml0aWFsaXplIHRoZSBwcGNfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGksIHR5cGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHBjX2VsZl9ob3d0b19yYXcpIC8gc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3Jhd1swXSk7IGkrKykKLSAgICB7Ci0gICAgICB0eXBlID0gcHBjX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZSkgLyBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZVswXSkpOwotICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVt0eXBlXSA9ICZwcGNfZWxmX2hvd3RvX3Jhd1tpXTsKLSAgICB9Ci19Ci0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIFBQQyB3aXRoIG9wdGlvbiAtLW1wYzg2MGMwWz08bj5dLgotCi0gICBUaGUgTVBDODYwLCByZXZpc2lvbiBDMCBvciBlYXJsaWVyIGNvbnRhaW5zIGEgYnVnIGluIHRoZSBkaWUuCi0gICBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlLCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotICAgdG8gYmUgZXhlY3V0ZWQgKm1heSogYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgotICAgMS8gQSBmb3J3YXJkIGJyYW5jaCBpcyBleGVjdXRlZC4KLSAgIDIvIFRoZSBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdCB0YWtlbi4KLSAgIDMvIFRoZSBicmFuY2ggaXMgdGFrZW4uCi0gICA0LyBUaGUgYnJhbmNoIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgNSB3b3JkcyBvZiBhIHBhZ2UuCi0gICAgICAoVGhlIEVPUCBsaW1pdCBpcyA1IGJ5IGRlZmF1bHQgYnV0IG1heSBiZSBzcGVjaWZpZWQgYXMgYW55IHZhbHVlIGZyb20gMS0xMC4pCi0gICAKLSAgIE91ciBzb2Z0d2FyZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhlc2UgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gYQotICAgbGlua2VyIHBhc3MgYW5kIG1vZGlmeSB0aGVtIGFzIGZvbGxvd3M6Ci0gICAxLyBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIC0gU2luY2UgdGhlc2UgYXJlIGFsd2F5cyBwcmVkaWN0ZWQgdGFrZW4sCi0gICAgICB0aGVyZSBpcyBubyBwcm9ibGVtIGFuZCBubyBhY3Rpb24gaXMgcmVxdWlyZWQuCi0gICAyLyBDb25kaXRpb25hbCBiYWNrd2FyZCBicmFuY2hlcyAtIE5vIHByb2JsZW0sIG5vIGFjdGlvbiByZXF1aXJlZC4KLSAgIDMvIENvbmRpdGlvbmFsIGZvcndhcmQgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgImludmVyc2UgcHJlZGljdGlvbgotICAgICAgYml0IiBpcyBzZXQgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotICAgNC8gQ29uZGl0aW9uYWwgcmVnaXN0ZXIgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgInkgYml0IiBpcyBzZXQKLSAgICAgIChlbnN1cmUgaXQgaXMgcHJlZGljdGVkIHRha2VuKS4KLSovCi0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfc29ydF9yZWxhIChhcmcxLCBhcmcyKQotICAgIGNvbnN0IHZvaWQgKmFyZzE7Ci0gICAgY29uc3Qgdm9pZCAqYXJnMjsKLXsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhMSA9IChjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSoqKSBhcmcxOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGEyID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzI7Ci0KLSAgLyogU29ydCBieSBvZmZzZXQuICovCi0gIHJldHVybiAoKCpyZWxhMSktPnJfb2Zmc2V0IC0gKCpyZWxhMiktPnJfb2Zmc2V0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaXNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICBiZmQgKmFiZmQ7Ci0gICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICBib29sZWFuICphZ2FpbjsKLXsKLSNkZWZpbmUgUEFHRVNJWkUgMHgxMDAwCi0KLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhX2NvbWIgPSBOVUxMOwotICBpbnQgY29tYl9jdXJyLCBjb21iX2NvdW50OwotCi0gIC8qIFdlIG5ldmVyIGhhdmUgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBwZXIgaW5wdXQgc2VjdGlvbi4gKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogSWYgbmVlZGVkLCBpbml0aWFsaXplIHRoaXMgc2VjdGlvbidzIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKGlzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgICAgaXNlYy0+X2Nvb2tlZF9zaXplID0gaXNlYy0+X3Jhd19zaXplOwotCi0gIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0ZXh0IHNlY3Rpb25zIHdoaWNoIG92ZXJsYXAgdGhlCi0gIHRyb3VibGVzb21lIGFyZWEgYXQgdGhlIGVuZCBvZiBhIHBhZ2UuICovCi0gIGlmIChsaW5rX2luZm8tPm1wYzg2MGMwICYmIChpc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAmJiBpc2VjLT5fY29va2VkX3NpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBkb3QsIGVuZF9wYWdlLCBlbmRfc2VjdGlvbjsKLSAgICAgIGJvb2xlYW4gc2VjdGlvbl9tb2RpZmllZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAqLwotICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaXNlYywgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBpc2VjLT5fcmF3X3NpemUpKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29tYl9jdXJyID0gMDsKLSAgICAgIGNvbWJfY291bnQgPSAwOwotICAgICAgaWYgKGlzZWMtPnJlbG9jX2NvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgbjsKLQotICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzICgKLSAgICAJICAgIGFiZmQsIGlzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCAKLSAgICAJICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpOwotICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICAJICAgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgCi0gICAgICAgICAgLyogU2V0dXAgYSBmYXN0ZXIgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHJlbG9jIGluZm8gd2UgbmVlZC4gKi8KLSAgICAgICAgICByZWxhX2NvbWIgPSAoRWxmX0ludGVybmFsX1JlbGEqKikKLQkgICAgYmZkX21hbGxvYyAoaXNlYy0+cmVsb2NfY291bnQqc2l6ZW9mKEVsZl9JbnRlcm5hbF9SZWxhKikpOwotICAgICAgICAgIGlmIChyZWxhX2NvbWIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgZm9yIChuPTA7IG48aXNlYy0+cmVsb2NfY291bnQ7ICsrbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbG9uZyByX3R5cGU7Ci0gICAgCi0gICAgICAgICAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaW50ZXJuYWxfcmVsb2NzW25dLnJfaW5mbyk7Ci0gICAgICAgICAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfUFBDX21heCkKLSAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIAotICAgICAgICAgICAgICAvKiBQcm9sb2d1ZSBjb25zdGFudHMgYXJlIHNvbWV0aW1lcyBwcmVzZW50IGluIHRoZSAiLnRleHQiCi0gICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCB0aGV5IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFzc29jaWF0ZWQgcmVsb2NhdGlvbi4KLSAgICAgICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIHRob3NlIHdvcmRzIGFuZCBzb21lIG90aGVycyB3aGljaAotICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHJlbG9jYXRpb25zLiAgSG93ZXZlciwgbm90IGFsbAotICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aWxsIGhhdmUgYSByZWxvY2F0aW9uIHNvIHdlIHdpbGwKLSAgICAgICAgICAgICAgb25seSBpZ25vcmUgd29yZHMgdGhhdCAxKSBoYXZlIGEgcmVsb2MsIGFuZCAyKSB0aGUgcmVsb2MKLSAgICAgICAgICAgICAgaXMgbm90IGFwcGxpY2FibGUgdG8gYSBjb25kaXRpb25hbCBicmFuY2guCi0gICAgICAgICAgICAgIFRoZSBhcnJheSByZWxhX2NvbWIgaXMgYnVpbHQgaGVyZSBmb3IgdXNlIGluIHRoZSBFT1Agc2NhbiBsb29wLiAqLwotICAgICAgICAgICAgICBzd2l0Y2ggKHJfdHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19BRERSMTRfQlJOVEFLRU46ICAgICAvKiBhYnNvbHV0ZSwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgIGNhc2UgUl9QUENfUkVMMTQ6ICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgY29uZC4gYnIuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjogICAgICAvKiByZWwuIGNvbmQuIGJyLiwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAvKiBUaGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2ggLSBpZ25vcmUgaXQuICovCi0gICAgICAgICAgICAgICAgICByZWxhX2NvbWJbY29tYl9jb3VudCsrXSA9ICZpbnRlcm5hbF9yZWxvY3Nbbl07Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNvbWJfY291bnQgPiAxKQotICAgICAgICAgICAgICBxc29ydCAocmVsYV9jb21iLCAoc2l6ZV90KSBjb21iX2NvdW50LCBzaXplb2YgKGludCksIHBwY19lbGZfc29ydF9yZWxhKTsKLSAgICAgICAgfQotCi0gICAgICAvKiBFbnVtZXJhdGUgZWFjaCBFT1AgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhpcyBzZWN0aW9uLiAqLwotICAgICAgZW5kX3NlY3Rpb24gPSBpc2VjLT52bWEgKyBpc2VjLT5fY29va2VkX3NpemU7Ci0gICAgICBkb3QgPSBlbmRfcGFnZSA9IChpc2VjLT52bWEgfCAoUEFHRVNJWkUgLSAxKSkgKyAxOwotICAgICAgZG90IC09IGxpbmtfaW5mby0+bXBjODYwYzA7Ci0gICAgICBzZWN0aW9uX21vZGlmaWVkID0gZmFsc2U7Ci0gICAgICBpZiAoZG90IDwgaXNlYy0+dm1hKSAgICAgIC8qIEluY3JlbWVudCB0aGUgc3RhcnQgcG9zaXRpb24gaWYgdGhpcyBzZWN0aW9uICovCi0gICAgICAgICAgZG90ID0gaXNlYy0+dm1hOyAgICAgIC8qIGJlZ2lucyBpbiB0aGUgbWlkZGxlIG9mIGl0cyBmaXJzdCBFT1AgcmVnaW9uLiAqLwotICAgICAgZm9yICg7Ci0gICAgICAgICAgIGRvdCA8IGVuZF9zZWN0aW9uOwotICAgICAgICAgICBkb3QgKz0gUEFHRVNJWkUsIGVuZF9wYWdlICs9IFBBR0VTSVpFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAvKiBDaGVjayBlYWNoIHdvcmQgaW4gdGhpcyBFT1AgcmVnaW9uLiAqLwotICAgICAgICAgIGZvciAoOyBkb3QgPCBlbmRfcGFnZTsgZG90ICs9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgaXNlY19vZmZzZXQ7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgICAgICAgICAgYm9vbGVhbiBza2lwLCBtb2RpZmllZDsKLQotICAgICAgICAgICAgICAvKiBEb24ndCBwcm9jZXNzIHRoaXMgd29yZCBpZiB0aGVyZSBpcyBhIHJlbG9jYXRpb24gZm9yIGl0IGFuZAotICAgICAgICAgICAgICB0aGUgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhlIHdvcmQgaXMgbm90IGEgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotICAgICAgICAgICAgICBza2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlzZWNfb2Zmc2V0ID0gZG90IC0gaXNlYy0+dm1hOwotICAgICAgICAgICAgICBmb3IgKDsgY29tYl9jdXJyPGNvbWJfY291bnQ7ICsrY29tYl9jdXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF92bWEgcl9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgIHJfb2Zmc2V0ID0gcmVsYV9jb21iW2NvbWJfY3Vycl0tPnJfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID49IGlzZWNfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID09IGlzZWNfb2Zmc2V0KSBza2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNraXApIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjdXJyZW50IHdvcmQgZm9yIGEgcHJvYmxlbWF0aWMgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotI2RlZmluZSBCTzAoaW5zbikgKChpbnNuKSAmIDB4MDIwMDAwMDApCi0jZGVmaW5lIEJPMihpbnNuKSAoKGluc24pICYgMHgwMDgwMDAwMCkKLSNkZWZpbmUgQk80KGluc24pICgoaW5zbikgJiAweDAwMjAwMDAwKQotICAgICAgICAgICAgICBpbnNuID0gKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotICAgICAgICAgICAgICBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAoKGluc24gJiAweEZjMDAwMDAwKSA9PSAweDQwMDAwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIHRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgIm5vcm1hbCIuCi0gICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4gKi8KLQotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGluc24gJiAweDAwMDBGZmZjOyAgICAgICAgICAgICAgIC8qZXh0cmFjdCovCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRhcmdldCBeIDB4ODAwMCkgLSAweDgwMDA7ICAgICAgLypzaWduIGV4dGVuZCovCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgMHgwMDAwMDAwMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IGRvdDsgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnZlcnQgdG8gYWJzKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gZG90KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhGYzAwRmZmZSkgPT0gMHg0YzAwMDQyMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBpcyBCQ0NUUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwMDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDTFJ4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KLQkJICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4KLSAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB3ZSBjYW4ndCB0ZWxsIHN0YXRpY2FsbHkgaWYgaXQgd2lsbCBicmFuY2ggZm9yd2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoZSBwcmVkaWN0aW9uIGJpdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jdW5kZWYgQk8wCi0jdW5kZWYgQk8yCi0jdW5kZWYgQk80Ci0gICAgICAgICAgICAgIGlmIChtb2RpZmllZCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotCQkgIHNlY3Rpb25fbW9kaWZpZWQgPSB0cnVlOwotCSAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBpZiAoc2VjdGlvbl9tb2RpZmllZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlbGFfY29tYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbGFfY29tYik7Ci0gICAgICByZWxhX2NvbWIgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgZnJlZSAocmVsYV9jb21iKTsKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVsgUl9QUENfQUREUjMyIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9QUENfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IHBwY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfUFBDX0FERFIxNl9IQSByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAocmVsb2NhdGlvbiAmIDB4ODAwMCkgPDwgMTsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZyAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmIChfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCAoaWJmZCwgb2JmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotCi0gIGVsc2UJCQkJCS8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIC8qIFdhcm4gYWJvdXQgLW1yZWxvY2F0YWJsZSBtaXNtYXRjaC4gIEFsbG93IC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZAotICAgICAgICAgd2l0aCBlaXRoZXIuICAqLwotICAgICAgZXJyb3IgPSBmYWxzZTsKLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLSAgICAgIGVsc2UgaWYgKChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDAKLQkgICAgICAgJiYgKG9sZF9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMCkKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjb21waWxlZCBub3JtYWxseSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZS1saWIgaWZmIGJvdGggdGhlIGlucHV0IGZpbGVzIGFyZS4gICovCi0gICAgICBpZiAoISAobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJj0gfkVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZSBpZmYgaXQgY2FuJ3QgYmUgLW1yZWxvY2F0YWJsZS1saWIsCi0gICAgICAgICBidXQgZWFjaCBpbnB1dCBmaWxlIGlzIGVpdGhlciAtbXJlbG9jYXRhYmxlIG9yIC1tcmVsb2NhdGFibGUtbGliLiAgKi8KLSAgICAgIGlmICghIChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpCi0JICAmJiAobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKQotCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCi0gICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCBlYWJpIHZzLiBWLjQgbWlzbWF0Y2gsIGp1c3Qgb3IgaW4gdGhlIGJpdCBpZiBhbnkgbW9kdWxlIHVzZXMgaXQgKi8KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiBFRl9QUENfRU1CKTsKLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0JfQotCi0gICAgICBpZiAoZXJyb3IpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSGFuZGxlIGEgUG93ZXJQQyBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCk7Ci0gIGlmIChoZHItPnNoX2ZsYWdzICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfT1JERVJFRCkKLSAgICBmbGFncyB8PSBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHVwIGFueSBvdGhlciBzZWN0aW9uIGZsYWdzIGFuZCBzdWNoIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIHNoZHIsIGFzZWN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqc2hkcjsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotewotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIHNoZHItPnNoX2ZsYWdzIHw9IFNIRl9FWENMVURFOwotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1NPUlRfRU5UUklFUykgIT0gMCkKLSAgICBzaGRyLT5zaF90eXBlID0gU0hUX09SREVSRUQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIENyZWF0ZSBhIHNwZWNpYWwgbGlua2VyIHNlY3Rpb24gKi8KLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqCi1wcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLQotICAvKiBSZWNvcmQgdGhlIGZpcnN0IGJmZCBzZWN0aW9uIHRoYXQgbmVlZHMgdGhlIHNwZWNpYWwgc2VjdGlvbiAqLwotICBpZiAoIWR5bm9iaikKLSAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSwgY3JlYXRlIHRoZSBzZWN0aW9uICovCi0gIGxzZWN0ID0gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIHdoaWNoKTsKLSAgaWYgKCFsc2VjdCkKLSAgICB7Ci0gICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCBkZWZhdWx0czsKLSAgICAgIHN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCB6ZXJvX3NlY3Rpb247Ci0KLSAgICAgIGRlZmF1bHRzID0gemVyb19zZWN0aW9uOwotICAgICAgZGVmYXVsdHMud2hpY2ggPSB3aGljaDsKLSAgICAgIGRlZmF1bHRzLmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0gICAgICBkZWZhdWx0cy5hbGlnbm1lbnQgPSAyOwotCi0gICAgICAvKiBCb3RoIG9mIHRoZXNlIHNlY3Rpb25zIGFyZSAodGVjaG5pY2FsbHkpIGNyZWF0ZWQgYnkgdGhlIHVzZXIKLQkgcHV0dGluZyBkYXRhIGluIHRoZW0sIHNvIHRoZXkgc2hvdWxkbid0IGJlIG1hcmtlZAotCSBTRUNfTElOS0VSX0NSRUFURUQuCi0KLQkgVGhlIGxpbmtlciBjcmVhdGVzIHRoZW0gc28gaXQgaGFzIHNvbWV3aGVyZSB0byBhdHRhY2ggdGhlaXIKLQkgcmVzcGVjdGl2ZSBzeW1ib2xzLiBJbiBmYWN0LCBpZiB0aGV5IHdlcmUgZW1wdHkgaXQgd291bGQKLQkgYmUgT0sgdG8gbGVhdmUgdGhlIHN5bWJvbCBzZXQgdG8gMCAob3IgYW55IHJhbmRvbSBudW1iZXIpLCBiZWNhdXNlCi0JIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCi0gICAgICBkZWZhdWx0cy5mbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCXwgU0VDX0lOX01FTU9SWSk7Ci0KLSAgICAgIHN3aXRjaCAod2hpY2gpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBVbmtub3duIHNwZWNpYWwgbGlua2VyIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJIChpbnQpd2hpY2gpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAoZWxmX2xpbmtlcl9zZWN0aW9uX3QgKikwOwotCi0JY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQToJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gKi8KLQkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEiOwotCSAgZGVmYXVsdHMuYnNzX25hbWUJICA9ICIuc2JzcyI7Ci0JICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREFfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBicmVhazsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEEyOgkvKiAuc2RhdGEyLy5zYnNzMiBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YTIiOwotCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YTIiOwotCSAgZGVmYXVsdHMuYnNzX25hbWUJICA9ICIuc2JzczIiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBMl9CQVNFXyI7Ci0JICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKLQkgIGRlZmF1bHRzLmZsYWdzCSB8PSBTRUNfUkVBRE9OTFk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxzZWN0ID0gX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgJmRlZmF1bHRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxzZWN0OwotfQotCi0MCi0vKiBJZiB3ZSBoYXZlIGEgbm9uLXplcm8gc2l6ZWQgLnNic3MyIG9yIC5QUEMuRU1CLnNic3MwIHNlY3Rpb25zLCB3ZSBuZWVkIHRvIGJ1bXAgdXAKLSAgIHRoZSBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGludAotcHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaW50IHJldDsKLQotICByZXQgPSAwOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICArK3JldDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2JzczIiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCAmJiBzLT5fcmF3X3NpemUgPiAwKQotICAgICsrcmV0OwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5QUEMuRU1CLnNic3MwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICArK3JldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBNb2RpZnkgdGhlIHNlZ21lbnQgbWFwIGlmIG5lZWRlZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIGhhdmUgdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIGhlcmUgc28gdGhhdCB0aGV5IGdldCBtYXBwZWQKLSAgIHRvIG91dHB1dCBzZWN0aW9ucyAoanVzdCBsaWtlIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGhhcwotICAgdG8gY3JlYXRlIC5keW5ic3MgYW5kIC5yZWxhLmJzcykuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc2JzcyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgU0VDX0FMTE9DKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEuc2JzcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0gIGJmZF92bWEgcGx0X29mZnNldDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGNhbGxlZCBmb3IgJXNcbiIsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgIHx8ICgoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQotCSAgfHwgKGluZm8tPnNoYXJlZCAmJiBoLT5wbHQucmVmY291bnQgPD0gMCkpCi0JewotCSAgLyogQSBQTFQgZW50cnkgaXMgbm90IHJlcXVpcmVkL2FsbG93ZWQgd2hlbjoKLQotCSAgICAgMS4gV2UgYXJlIG5vdCB1c2luZyBsZC5zbzsgYmVjYXVzZSB0aGVuIHRoZSBQTFQgZW50cnkKLQkgICAgIGNhbid0IGJlIHNldCB1cCwgc28gd2UgY2FuJ3QgdXNlIG9uZS4KLQotCSAgICAgMi4gV2Uga25vdyBmb3IgY2VydGFpbiB0aGF0IGEgc3ltYm9sIGlzIGRlZmluZWQgaW4KLQkgICAgIHRoaXMgb2JqZWN0LCBiZWNhdXNlIHRoaXMgb2JqZWN0IGlzIHRoZSBhcHBsaWNhdGlvbiwKLQkgICAgIGlzIGxpbmtlZCB3aXRoIC1Cc3ltYm9saWMsIG9yIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBsb2NhbC4KLQotCSAgICAgMy4gR0MgaGFzIHJlbmRlcmVkIHRoZSBlbnRyeSB1bnVzZWQuCi0JICAgICBOb3RlLCBob3dldmVyLCB0aGF0IGluIGFuIGV4ZWN1dGFibGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlCi0JICAgICBzeW1ib2wgZ28gdG8gdGhlIFBMVCwgc28gd2UgY2FuJ3QgdHVybiBpdCBvZmYgaW4gdGhhdCBjYXNlLgotCSAgICAgPz8/IFRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8gcmVmZXJlbmNlIGNvdW50Ci0JICAgICBhbGwgdXNlcyBvZiB0aGUgc3ltYm9sLCBub3QganVzdCB0aG9zZSB0byB0aGUgR09UIG9yIFBMVC4gICovCi0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9JTklUSUFMX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFRoZSBQb3dlclBDIFBMVCBpcyBhY3R1YWxseSBjb21wb3NlZCBvZiB0d28gcGFydHMsIHRoZSBmaXJzdCBwYXJ0Ci0JIGlzIDIgd29yZHMgKGZvciBhIGxvYWQgYW5kIGEganVtcCksIGFuZCB0aGVuIHRoZXJlIGlzIGEgcmVtYWluaW5nCi0JIHdvcmQgYXZhaWxhYmxlIGF0IHRoZSBlbmQuICAqLwotICAgICAgcGx0X29mZnNldCA9IChQTFRfSU5JVElBTF9FTlRSWV9TSVpFCi0JCSAgICArIChQTFRfU0xPVF9TSVpFCi0JCSAgICAgICAqICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkKLQkJCSAgLyBQTFRfRU5UUllfU0laRSkpKTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHBsdF9vZmZzZXQ7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcGx0X29mZnNldDsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgQWZ0ZXIgdGhlIDgxOTJuZCBlbnRyeSwgcm9vbQotICAgICAgICAgZm9yIHR3byBlbnRyaWVzIGlzIGFsbG9jYXRlZC4gICovCi0gICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAtIFBMVF9JTklUSUFMX0VOVFJZX1NJWkUpIC8gUExUX0VOVFJZX1NJWkUKLQkgID49IFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpCi0Jcy0+X3Jhd19zaXplICs9IDIgKiBQTFRfRU5UUllfU0laRTsKLSAgICAgIGVsc2UKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICAgIE9mIGNvdXJzZSwgaWYgdGhlIHN5bWJvbCBpcyBzdWZmaWNpZW50bHkgc21hbGwsIHdlIG11c3QgaW5zdGVhZAotICAgICBhbGxvY2F0ZSBpdCBpbiAuc2Jzcy4gIEZJWE1FOiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gdGhpcyBpZiBhbmQKLSAgICAgb25seSBpZiB0aGVyZSB3ZXJlIGFjdHVhbGx5IFNEQVJFTCByZWxvY3MgZm9yIHRoYXQgc3ltYm9sLiAgKi8KLQotICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zYnNzIik7Ci0gIGVsc2UKLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9QUENfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnNic3MiKTsKLSAgICAgIGVsc2UKLQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDQpCi0gICAgcG93ZXJfb2ZfdHdvID0gNDsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCwgLnJlbGEuc2RhdGEsIGFuZAotCSAucmVsYS5zZGF0YTIgc2VjdGlvbnMuICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZQotCSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0Ci0JIHRoZSBzaXplIG9mIC5yZWxhLmdvdCwgZXQgYWwsIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0Ci0JIHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlIGJlbG93LiAgKi8KLSAgICAgIHN0YXRpYyBjaGFyICpyZWxhX3NlY3Rpb25zW10gPSB7ICIucmVsYS5nb3QiLCAiLnJlbGEuc2RhdGEiLAotCQkJCSAgICAgICAiLnJlbGEuc2RhdGEyIiwgIi5yZWxhLnNic3MiLAotCQkJCSAgICAgICAoY2hhciAqKTAgfTsKLSAgICAgIGNoYXIgKipwOwotCi0gICAgICBmb3IgKHAgPSByZWxhX3NlY3Rpb25zOyAqcCAhPSAoY2hhciAqKTA7IHArKykKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgKnApOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgcy0+X3Jhd19zaXplID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWxhLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jYXRpb24gc2VjdGlvbnMuICovCi0JICAgICAgcmVsb2NzID0gdHJ1ZTsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmdvdCIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhIikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBhc2VjdGlvbiAqc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsZ290ID0gTlVMTDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAotCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSNlbmRpZgotCi0gIC8qIENyZWF0ZSB0aGUgbGlua2VyIGdlbmVyYXRlZCBzZWN0aW9ucyBhbGwgdGhlIHRpbWUgc28gdGhhdCB0aGUKLSAgICAgc3BlY2lhbCBzeW1ib2xzIGFyZSBjcmVhdGVkLiAgKi8KLQotICBpZiAoKHNkYXRhID0gZWxmX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBMSU5LRVJfU0VDVElPTl9TREFUQSkpID09IE5VTEwpCi0gICAgewotICAgICAgc2RhdGEgPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEpOwotICAgICAgaWYgKCFzZGF0YSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgaWYgKChzZGF0YTIgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGFiZmQsIExJTktFUl9TRUNUSU9OX1NEQVRBMikpID09IE5VTEwpCi0gICAgewotICAgICAgc2RhdGEyID0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBMik7Ci0gICAgICBpZiAoIXNkYXRhMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIC8qIElmIGEgcmVsb2NhdGlvbiByZWZlcnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBjcmVhdGUgdGhlIC5nb3QuCi0JIFRoaXMgc2hvd3MgdXAgaW4gcGFydGljdWxhciBpbiBhbiBSX1BQQ19BRERSMzIgaW4gdGhlIGVhYmkKLQkgc3RhcnR1cCBjb2RlLiAgKi8KLSAgICAgIGlmIChoICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JewotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCS8qIEdPVDE2IHJlbG9jYXRpb25zICovCi0JY2FzZSBSX1BQQ19HT1QxNjoKLQljYXNlIFJfUFBDX0dPVDE2X0xPOgotCWNhc2UgUl9QUENfR09UMTZfSEk6Ci0JY2FzZSBSX1BQQ19HT1QxNl9IQToKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPT0gLTEpCi0JCXsKLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgaWYgKCFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgLyogQWxsb2NhdGUgcmVsb2NhdGlvbiBzcGFjZS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkJICBoLT5nb3QucmVmY291bnQgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQloLT5nb3QucmVmY291bnQrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3NpZ25lZF92bWEpOwotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSAoYmZkX3NpZ25lZF92bWEgKikKLQkJICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfUFBDX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkJICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhIHJlbG9jYXRpb24gKi8KLQljYXNlIFJfUFBDX0VNQl9TREFJMTY6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAiUl9QUENfRU1CX1NEQUkxNiIpKTsKLQkgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBzZGF0YSwgaCwgcmVsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YTIgcmVsb2NhdGlvbiAqLwotCWNhc2UgUl9QUENfRU1CX1NEQTJJMTY6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAiUl9QUENfRU1CX1NEQTJJMTYiKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBzZGF0YTIsIGgsIHJlbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBDX1NEQVJFTDE2OgotCWNhc2UgUl9QUENfRU1CX1NEQTJSRUw6Ci0JY2FzZSBSX1BQQ19FTUJfU0RBMjE6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQlwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyldLT5uYW1lKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUENfUExUMzI6Ci0JY2FzZSBSX1BQQ19QTFRSRUwyNDoKLQljYXNlIFJfUFBDX1BMVDE2X0xPOgotCWNhc2UgUl9QUENfUExUMTZfSEk6Ci0JY2FzZSBSX1BQQ19QTFQxNl9IQToKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiUmVsb2MgcmVxdWlyZXMgYSBQTFQgZW50cnlcbiIpOwotI2VuZGlmCi0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JICAgIHsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCSAgLyogVGhlIGZvbGxvd2luZyByZWxvY2F0aW9ucyBkb24ndCBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUKLQkgICAgIHJlbG9jYXRpb24gaWYgbGlua2luZyBhIHNoYXJlZCBvYmplY3Qgc2luY2UgdGhleSBhcmUKLQkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCWNhc2UgUl9QUENfU0VDVE9GRjoKLQljYXNlIFJfUFBDX1NFQ1RPRkZfTE86Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0hJOgotCWNhc2UgUl9QUENfU0VDVE9GRl9IQToKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlZmVycyBvbmx5IHRvIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSAqLwotCWNhc2UgUl9QUENfTE9DQUwyNFBDOgotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLQkgICAgIHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0JICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuICAqLwotCWNhc2UgUl9QUENfUkVMMjQ6Ci0JY2FzZSBSX1BQQ19SRUwxNDoKLQljYXNlIFJfUFBDX1JFTDE0X0JSVEFLRU46Ci0JY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjoKLQljYXNlIFJfUFBDX1JFTDMyOgotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogZmFsbCB0aHJvdWdoICovCi0KLQlkZWZhdWx0OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9jaGVja19yZWxvY3MgbmVlZCB0byBjcmVhdGUgcmVsb2NhdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7Ci0jZW5kaWYKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIGhlcmUgZG8gd2hhdCB0aGUgbTY4ayBhbmQgaTM4NgotCQkgYmFja2VuZHMgZG86IGlmIHRoZSByZWxvYyBpcyBwYy1yZWxhdGl2ZSwgcmVjb3JkIGl0Ci0JCSBpbiBjYXNlIGl0IHR1cm5zIG91dCB0aGF0IHRoZSByZWxvYyBpcyB1bm5lY2Vzc2FyeQotCQkgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGZvcmNlZCBsb2NhbCBieSB2ZXJzaW9uaW5nIG9yCi0JCSB3ZSBhcmUgbGlua2luZyB3aXRoIC1CZHluYW1pYy4gIEZvcnR1bmF0ZWx5IHRoaXMKLQkJIGNhc2UgaXMgbm90IGZyZXF1ZW50LiAgKi8KLQkgICAgfQotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotcHBjX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1BQQ19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9QUENfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9QUENfR09UMTY6Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0xPOgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9ISToKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfSEE6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5nb3QucmVmY291bnQtLTsKLQkgIH0KLQllbHNlIGlmIChsb2NhbF9nb3RfcmVmY291bnRzICE9IE5VTEwpCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0tLTsKLQkgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUl9QUENfUExUMzI6Ci0gICAgICBjYXNlIFJfUFBDX1BMVFJFTDI0OgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9MTzoKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfSEk6Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0hBOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+cGx0LnJlZmNvdW50LS07Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSAoYmZkX3ZtYSkgYmZkX2dldF9ncF9zaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gLUcgbm4gYnl0ZXMgYXJlIGF1dG9tYXRpY2FsbHkKLQkgcHV0IGludG8gLnNkYXRhLiAgKi8KLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQotCT0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBKTsKLQotICAgICAgaWYgKCFzZGF0YS0+YnNzX3NlY3Rpb24pCi0JewotCSAgLyogV2UgZG9uJ3QgZ28gdGhyb3VnaCBiZmRfbWFrZV9zZWN0aW9uLCBiZWNhdXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgd2FudCB0byBhdHRhY2ggdGhpcyBjb21tb24gc2VjdGlvbiB0byBEWU5PQkouICBUaGUgbGlua2VyCi0gICAgICAgICAgICAgd2lsbCBtb3ZlIHRoZSBzeW1ib2xzIHRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbgotICAgICAgICAgICAgIHdoZW4gaXQgZGVmaW5lcyBjb21tb24gc3ltYm9scy4gICovCi0JICBzZGF0YS0+YnNzX3NlY3Rpb24gPSAoKGFzZWN0aW9uICopCi0JCQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpKTsKLQkgIGlmIChzZGF0YS0+YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5uYW1lID0gc2RhdGEtPmJzc19uYW1lOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gc2RhdGEtPmJzc19zZWN0aW9uOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wgPQotCSAgICAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPQotCSAgICAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sICopKTsKLQkgIGlmIChzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbCA9PSBOVUxMCi0JICAgICAgfHwgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+bmFtZSA9IHNkYXRhLT5ic3NfbmFtZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5zZWN0aW9uID0gc2RhdGEtPmJzc19zZWN0aW9uOwotCSAgKnNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPSBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbDsKLQl9Ci0KLSAgICAgICpzZWNwID0gc2RhdGEtPmJzc19zZWN0aW9uOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIGNhbGxlZCBmb3IgJXMiLAotCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgYmZkX3ZtYSByZWxvY19pbmRleDsKLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIsIHBsdF9vZmZzZXQgPSAlZCIsIGgtPnBsdC5vZmZzZXQpOwotI2VuZGlmCi0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gZmlsbCBpbiB0aGUgLnBsdC4gIFRoZSBwcGMgZHluYW1pYyBsaW5rZXIKLQkgd2lsbCBmaWxsIGl0IGluLiAgKi8KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0pNUF9TTE9UKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotCi0gICAgICByZWxvY19pbmRleCA9IChoLT5wbHQub2Zmc2V0IC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfU0xPVF9TSVpFOwotICAgICAgaWYgKHJlbG9jX2luZGV4ID4gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlyZWxvY19pbmRleCAtPSAocmVsb2NfaW5kZXggLSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKSAvIDI7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyByZWxvY19pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNldCBpdAotICAgICAgICAgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIFRoZSBlbnRyeSBpbgotCSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluCi0JIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQl7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCSAgcmVsYS5yX2FkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUKChoLT5nb3Qub2Zmc2V0ICYgMSkgPT0gMCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19HTE9CX0RBVCk7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgY29weSIpOwotI2VuZGlmCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZHluOwotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7ICBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgICAgICBuYW1lID0gTlVMTDsJICBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkZCBhIGJscmwgaW5zdHJ1Y3Rpb24gYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLTQgc28gdGhhdCBhIGZ1bmN0aW9uIGNhbgotICAgICBlYXNpbHkgZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLSAgaWYgKHNnb3QpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBzZ290LT5jb250ZW50czsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4NGU4MDAwMjEgLyogYmxybCAqLywgY29udGVudHMpOwotCi0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBjb250ZW50cys0KTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBjb250ZW50cys0KTsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHIJCSAgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgYmZkICpkeW5vYmoJCQkJICA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEJCSAgPSAoZHlub2JqKSA/IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCBMSU5LRVJfU0VDVElPTl9TREFUQSkgIDogTlVMTDsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhMgkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBMikgOiBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsCQkgID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kCQkgID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGFzZWN0aW9uICpzcmVsb2MJCQkgID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYm9vbGVhbiByZXQJCQkJICA9IHRydWU7Ci0gIGxvbmcgaW5zbjsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYWxsZWQgZm9yICVzIHNlY3Rpb24gJXMsICVsZCByZWxvY2F0aW9ucyVzXG4iLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgYmZkX3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAotCSAgIChsb25nKWlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50LAotCSAgIChpbmZvLT5yZWxvY2F0ZWFibGUpID8gIiAocmVsb2NhdGFibGUpIiA6ICIiKTsKLSNlbmRpZgotCi0gIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVsgUl9QUENfQUREUjMyIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIHNwbHQgPSBzZ290ID0gTlVMTDsKLSAgaWYgKGR5bm9iaiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgfQotCi0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX3BwY19yZWxvY190eXBlIHJfdHlwZQk9IChlbnVtIGVsZl9wcGNfcmVsb2NfdHlwZSlFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGJmZF92bWEgb2Zmc2V0CQkJPSByZWwtPnJfb2Zmc2V0OwotICAgICAgYmZkX3ZtYSBhZGRlbmQJCQk9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcgkJPSBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW0JCT0gKEVsZl9JbnRlcm5hbF9TeW0gKikwOwotICAgICAgYXNlY3Rpb24gKnNlYwkJCT0gKGFzZWN0aW9uICopMDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoCT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopMDsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lCQk9IChjb25zdCBjaGFyICopMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAgICAgLyogVW5rbm93biByZWxvY2F0aW9uIGhhbmRsaW5nICovCi0gICAgICBpZiAoKHVuc2lnbmVkKXJfdHlwZSA+PSAodW5zaWduZWQpUl9QUENfbWF4IHx8ICFwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAoaW50KXJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGhvd3RvID0gcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KXJfdHlwZV07Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKCh1bnNpZ25lZClFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JCSAgIGhvd3RvLT5uYW1lLAotCQkgICAoaW50KXJfdHlwZSwKLQkJICAgcl9zeW1uZHgsCi0JCSAgIChsb25nKW9mZnNldCwKLQkJICAgKGxvbmcpYWRkZW5kKTsKLSNlbmRpZgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKLQotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKChyX3R5cGUgPT0gUl9QUENfUExUMzIKLQkJICAgJiYgc3BsdCAhPSBOVUxMCi0JCSAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8IChyX3R5cGUgPT0gUl9QUENfTE9DQUwyNFBDCi0JCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19HT1QxNgotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0xPCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEkKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9IQSkKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJCSAgLyogVGVzdGluZyBTRUNfREVCVUdHSU5HIGhlcmUgbWF5IGJlIHdyb25nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCdzIGhlcmUgdG8gYXZvaWQgYSBjcmFzaCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIERXQVJGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0JCQkgIHx8ICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwKSkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgICAgICAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCSAgICAgICAgfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYwotCQkgICAmJiAhaW5mby0+bm9fdW5kZWZpbmVkCi0JCSAgICYmIEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcikgPT0gU1RWX0RFRkFVTFQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpKGluZm8sCi0JCQkJCQkJIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkJIGlucHV0X2JmZCwKLQkJCQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCQkgcmVsLT5yX29mZnNldCwKLQkJCQkJCQkgKCFpbmZvLT5zaGFyZWQKLQkJCQkJCQkgIHx8IGluZm8tPm5vX3VuZGVmaW5lZAotCQkJCQkJCSAgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCBmb3Igc3ltYm9sICVzIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlLCBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbmVlZCBubyBzcGVjaWFsIHByb2Nlc3NpbmcuICAqLwotCWNhc2UgKGludClSX1BQQ19MT0NBTDI0UEM6Ci0JICAvKiBJdCBtYWtlcyBubyBzZW5zZSB0byBwb2ludCBhIGxvY2FsIHJlbG9jYXRpb24KLQkgICAgIGF0IGEgc3ltYm9sIG5vdCBpbiB0aGlzIG9iamVjdC4gICovCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKSAoaW5mbywKLQkJCQkJCQkgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJCSAgcmVsLT5yX29mZnNldCwKLQkJCQkJCQkgIHRydWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBtYXkgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKLSAgICAgICAgICAgb2JqZWN0LiAgKi8KLQljYXNlIChpbnQpUl9QUENfUkVMMjQ6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDMyOgotCWNhc2UgKGludClSX1BQQ19SRUwxNDoKLQkgIC8qIElmIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBub3QgdG8gYSBuYW1lZCBzeW1ib2wsIHRoZXkgY2FuIGJlCi0JICAgICBoYW5kbGVkIHJpZ2h0IGhlcmUsIG5vIG5lZWQgdG8gYm90aGVyIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JLyogZmFsbCB0aHJvdWdoICovCi0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IGFsd2F5cyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgaWYgdGhpcyBpcyBhIHNoYXJlZAotICAgICAgICAgICBvYmplY3QuICAqLwotCWNhc2UgKGludClSX1BQQ19OT05FOgotCWNhc2UgKGludClSX1BQQ19BRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIyNDoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2OgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9ISToKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0hBOgotCWNhc2UgKGludClSX1BQQ19BRERSMTQ6Ci0JY2FzZSAoaW50KVJfUFBDX1VBRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1VBRERSMTY6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIG5lZWQgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAgICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotICAgICAgICAgICAgICAgICBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgotICAgICAgICAgICAgICAgICB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCW1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JICAgICAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfUFBDX0FERFIzMikKLQkJICAgIHsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQkJCSAgQkZEX0FTU0VSVChpbmR4ID4gMCk7Ci0jaWZkZWYgREVCVUcKLQkJCSAgaWYgKGluZHggPD0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBwcmludGYoImluZHg9JWQgc2VjdGlvbj0lcyBmbGFncz0lMDh4IG5hbWU9JXNcbiIsCi0JCQkJICAgICBpbmR4LCBvc2VjLT5uYW1lLCBvc2VjLT5mbGFncywKLQkJCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkJICAgIH0KLSNlbmRpZgotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1BQQ19SRUxBVElWRSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogQXJpdGhtZXRpYyBhZGp1c3QgcmVsb2NhdGlvbnMgdGhhdCBhcmVuJ3QgZ29pbmcgaW50byBhCi0JICAgICBzaGFyZWQgb2JqZWN0LiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JICAgICAgLyogSXQncyBqdXN0IHBvc3NpYmxlIHRoYXQgdGhpcyBzeW1ib2wgaXMgYSB3ZWFrIHN5bWJvbAotCQkgdGhhdCdzIG5vdCBhY3R1YWxseSBkZWZpbmVkIGFueXdoZXJlLiBJbiB0aGF0IGNhc2UsCi0JCSAnc2VjJyB3b3VsZCBiZSBOVUxMLCBhbmQgd2Ugc2hvdWxkIGxlYXZlIHRoZSBzeW1ib2wKLQkJIGFsb25lIChpdCB3aWxsIGJlIHNldCB0byB6ZXJvIGVsc2V3aGVyZSBpbiB0aGUgbGluaykuICAqLwotCSAgICAgICYmIHNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogYnJhbmNoIHRha2VuIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfQUREUjE0X0JSVEFLRU46Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0X0JSVEFLRU46Ci0JICBpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgaWYgKChyZWxvY2F0aW9uIC0gb2Zmc2V0KSAmIDB4ODAwMCkKLQkgICAgaW5zbiAmPSB+QlJBTkNIX1BSRURJQ1RfQklUOwotCSAgZWxzZQotCSAgICBpbnNuIHw9IEJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JLyogYnJhbmNoIG5vdCB0YWtlbiBwcmVkaWNpdGlvbiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19BRERSMTRfQlJOVEFLRU46Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0X0JSTlRBS0VOOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGlmICgocmVsb2NhdGlvbiAtIG9mZnNldCkgJiAweDgwMDApCi0JICAgIGluc24gfD0gQlJBTkNIX1BSRURJQ1RfQklUOwotCSAgZWxzZQotCSAgICBpbnNuICY9IH5CUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQotCS8qIEdPVDE2IHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0dPVDE2OgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfR09UMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0hBOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMgZW50cnkgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlIG9mZnNldCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlIGxlYXN0Ci0gICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSA0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1BQQ19SRUxBVElWRSByZWxvYwotCQkJIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSA0OwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YSByZWxvY2F0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREFJMTY6Ci0JICBCRkRfQVNTRVJUIChzZGF0YSAhPSBOVUxMKTsKLQkgIHJlbG9jYXRpb24gPSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywKLQkJCQkJCQkJc2RhdGEsIGgsIHJlbG9jYXRpb24sIHJlbCwKLQkJCQkJCQkJUl9QUENfUkVMQVRJVkUpOwotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEyIHJlbG9jYXRpb24gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTJJMTY6Ci0JICBCRkRfQVNTRVJUIChzZGF0YTIgIT0gTlVMTCk7Ci0JICByZWxvY2F0aW9uID0gYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkJCXNkYXRhMiwgaCwgcmVsb2NhdGlvbiwgcmVsLAotCQkJCQkJCQlSX1BQQ19SRUxBVElWRSk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSB0aGUgVE9DMTYgcmVsb2MuICBXZSB3YW50IHRvIHVzZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgLmdvdAotCSAgIHNlY3Rpb24sIG5vdCB0aGUgYWN0dWFsIFZNQS4gIFRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiBnZW5lcmF0aW5nCi0JICAgYW4gZW1iZWRkZWQgRUxGIG9iamVjdCwgZm9yIHdoaWNoIHRoZSAuZ290IHNlY3Rpb24gYWN0cyBsaWtlIHRoZQotCSAgIEFJWCAudG9jIHNlY3Rpb24uICAqLwotCWNhc2UgKGludClSX1BQQ19UT0MxNjoJCQkvKiBwaG9ueSBHT1QxNiByZWxvY2F0aW9ucyAqLwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpCi0JCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuZ290IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmNnb3QiKSA9PSAwKQotCi0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgMHg4MDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfUExUUkVMMjQ6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotIAkgIGJyZWFrOwotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBfU0RBX0JBU0VfICovCi0JY2FzZSAoaW50KVJfUFBDX1NEQVJFTDE2OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkJJiYgc3RyY21wIChuYW1lLCAiLnNic3MiKSAhPSAwKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0JICAgICAgfQotCSAgICBhZGRlbmQgLT0gKHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0JICBicmVhazsKLQotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBfU0RBMl9CQVNFXyAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMlJFTDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgIT0gMCAmJiBzdHJjbXAgKG5hbWUsICIuc2JzczIiKSAhPSAwKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0JCQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJcmV0ID0gZmFsc2U7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYWRkZW5kIC09IChzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8sIF9TREEyX0JBU0VfLCBvciAwICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEyMToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNEQToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgaW50IHJlZzsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDEzOwotCQlhZGRlbmQgLT0gKHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzMiIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAyOwotCQlhZGRlbmQgLT0gKHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5QUEMuRU1CLnNkYXRhMCIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLlBQQy5FTUIuc2JzczAiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMDsKLQkgICAgICB9Ci0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0KLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldCA9IGZhbHNlOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMjEpCi0JICAgICAgewkJCS8qIGZpbGwgaW4gcmVnaXN0ZXIgZmllbGQgKi8KLQkJaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkJaW5zbiA9IChpbnNuICYgflJBX1JFR0lTVEVSX01BU0spIHwgKHJlZyA8PCBSQV9SRUdJU1RFUl9TSElGVCk7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCS8qIFJlbG9jYXRlIGFnYWluc3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGOgotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0xPOgotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0hJOgotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfSEE6Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICBicmVhazsKLQotCS8qIE5lZ2F0aXZlIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNjoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0hJOgotCSAgYWRkZW5kIC09IDIqcmVsb2NhdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0hBOgotCSAgYWRkZW5kIC09IDIqcmVsb2NhdGlvbjsKLQkgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgYnJlYWs7Ci0KLQkvKiBOT1AgcmVsb2NhdGlvbiB0aGF0IHByZXZlbnRzIGdhcmJhZ2UgY29sbGVjdGluZyBsaW5rZXJzIGZyb20gb21pdHRpbmcgYQotCSAgIHJlZmVyZW5jZS4gICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9NUktSRUY6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgKGludClSX1BQQ19DT1BZOgotCWNhc2UgKGludClSX1BQQ19HTE9CX0RBVDoKLQljYXNlIChpbnQpUl9QUENfSk1QX1NMT1Q6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTEFUSVZFOgotCWNhc2UgKGludClSX1BQQ19QTFQzMjoKLQljYXNlIChpbnQpUl9QUENfUExUUkVMMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0xPOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9ISToKLQljYXNlIChpbnQpUl9QUENfUExUMTZfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTRUMxNjoKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0xPOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9IQToKLQljYXNlIChpbnQpUl9QUENfRU1CX0JJVF9GTEQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBSZWxvY2F0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBzeW1ib2wgJXMuIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0KLQljYXNlIChpbnQpUl9QUENfR05VX1ZUSU5IRVJJVDoKLQljYXNlIChpbnQpUl9QUENfR05VX1ZURU5UUlk6Ci0JICAvKiBUaGVzZSBhcmUgbm8tb3BzIGluIHRoZSBlbmQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgbmFtZSA9ICVzLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwKLQkgICAgICAgKGludClyX3R5cGUsCi0JICAgICAgIHN5bV9uYW1lLAotCSAgICAgICByX3N5bW5keCwKLQkgICAgICAgKGxvbmcpb2Zmc2V0LAotCSAgICAgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICBpbnB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLAotCQkJCSAgICBvZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJICAgIGFkZGVuZCk7Ci0KLSAgICAgIGlmIChyID09IGJmZF9yZWxvY19vaykKLQk7Ci0gICAgICBlbHNlIGlmIChyID09IGJmZF9yZWxvY19vdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCQkgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJewotCQkgIC8qIEFzc3VtZSB0aGlzIGlzIGEgY2FsbCBwcm90ZWN0ZWQgYnkgb3RoZXIgY29kZSB0aGF0Ci0JCSAgICAgZGV0ZWN0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwKLQkJICAgICB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgb3ZlcmZsb3cuICBJZiBub3QsIHRoZQotCQkgICAgIHByb2dyYW0gaXMgaG9zZWQgYW55d2F5LCBhbmQgYSBsaXR0bGUgd2FybmluZyBpc24ndAotCQkgICAgIGdvaW5nIHRvIGhlbHAuICAqLwotCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIHN5bS0+c3RfbmFtZSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KShpbmZvLAotCQkJCQkJICAgbmFtZSwKLQkJCQkJCSAgIGhvd3RvLT5uYW1lLAotCQkJCQkJICAgKGJmZF92bWEpIDAsCi0JCQkJCQkgICBpbnB1dF9iZmQsCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlyZXQgPSBmYWxzZTsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJldDsKLX0KLQotDAotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXBvd2VycGNsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1wb3dlcnBjIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfcG93ZXJwYwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1BQQwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JcHBjX2VsZl9pbmZvX3RvX2hvd3RvCi0KLSNpZmRlZiAgRU1fQ1lHTlVTX1BPV0VSUEMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMQlFTV9DWUdOVVNfUE9XRVJQQwotI2VuZGlmCi0KLSNpZmRlZiBFTV9QUENfT0xECi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIJRU1fUFBDX09MRAotI2VuZGlmCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQJMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAk0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0lOSVRJQUxfRU5UUllfU0laRQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQlwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uICAgICAgICAgICAgIHBwY19lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQlwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCQlfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQlwcGNfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQlwcGNfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJCXBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQlwcGNfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQlwcGNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJcHBjX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCQlwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItc2guYyBiL2JmZC9lbGYzMi1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmUzMGVmLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5NiArMCwwIEBACi0vKiBIaXRhY2hpIFNIIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk2LCA5NywgOTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9jb3B5X3ByaXZhdGVfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9tZXJnZV9wcml2YXRlX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1ib29sZWFuIHNoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9hbGlnbl9sb2FkcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfc3dhcF9pbnNucwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9ieXRlICpzaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNoX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1NIX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gIFNldHRpbmcgcGFydGlhbF9pbnBsYWNlIHRvIHRydWUgYW5kCi0gICAgIHNyY19tYXNrIHRvIGEgbm9uLXplcm8gdmFsdWUgaXMgc2ltaWxhciB0byB0aGUgQ09GRiB0b29sY2hhaW4uICAqLwotICBIT1dUTyAoUl9TSF9ESVIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfU0hfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IFBDIHJlbGF0aXZlIGJyYW5jaCBkaXZpZGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BOLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXUE4iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0lORDEyVywJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfSU5EMTJXIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgdW5zaWduZWQgUEMgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFdQTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXUEwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BaLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQWiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IEdCUiByZWxhdGl2ZS4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgd2UgaGF2ZSBzb21lCi0gICAgIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0IGlzIG5vdAotICAgICBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhCUCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4QlAiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IEdCUiByZWxhdGl2ZSBkaXZpZGVkIGJ5IDIuICBGSVhNRTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmCi0gICAgIHdlIGhhdmUgc29tZSBzcGVjaWFsIHN5bWJvbCBmb3IgdGhlIEdCUiByZWxhdGl2ZSBhcmVhLCBhbmQgdGhhdAotICAgICBpcyBub3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4VywJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4VyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgNC4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKLSAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0Ci0gICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhMLAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoMTApLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotICBFTVBUWV9IT1dUTyAoMTMpLAotICBFTVBUWV9IT1dUTyAoMTQpLAotICBFTVBUWV9IT1dUTyAoMTUpLAotICBFTVBUWV9IT1dUTyAoMTYpLAotICBFTVBUWV9IT1dUTyAoMTcpLAotICBFTVBUWV9IT1dUTyAoMTgpLAotICBFTVBUWV9IT1dUTyAoMTkpLAotICBFTVBUWV9IT1dUTyAoMjApLAotICBFTVBUWV9IT1dUTyAoMjEpLAotICBFTVBUWV9IT1dUTyAoMjIpLAotICBFTVBUWV9IT1dUTyAoMjMpLAotICBFTVBUWV9IT1dUTyAoMjQpLAotCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24gdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUKLSAgICAgZmluYWwgcGFzcyBvZiB0aGUgbGlua2VyIG5ldmVyIG5lZWRzIHRvIGRvIGFueXRoaW5nIHdpdGggYW55IG9mCi0gICAgIHRoZXNlIHJlbG9jcy4gIEFueSByZXF1aXJlZCBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgICByZWxheGF0aW9uIGNvZGUuICAqLwotCi0gIC8qIEEgMTYgYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1NXSVRDSDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAubG9uZyBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1NXSVRDSDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluZGljYXRlcyBhIC51c2VzIHBzZXVkby1vcC4gIFRoZSBjb21waWxlciB3aWxsIGdlbmVyYXRlIC51c2VzCi0gICAgIHBzZXVkby1vcHMgd2hlbiBpdCBmaW5kcyBhIGZ1bmN0aW9uIGNhbGwgd2hpY2ggY2FuIGJlIHJlbGF4ZWQuCi0gICAgIFRoZSBvZmZzZXQgZmllbGQgaG9sZHMgdGhlIFBDIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHJlZ2lzdGVyIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotICBIT1dUTyAoUl9TSF9VU0VTLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1VTRVMiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGZvciBhZGRyZXNzZXMgcmVmZXJyZWQgdG8KLSAgICAgYnkgdGhlIHJlZ2lzdGVyIGxvYWRzIGFzc29jaWF0ZWQgd2l0aCBVU0VTIHJlbG9jcy4gIFRoZSBvZmZzZXQKLSAgICAgZmllbGQgaG9sZHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWRkcmVzcyBpcyByZWZlcmVuY2VkIGluIHRoZQotICAgICBvYmplY3QgZmlsZS4gICovCi0gIEhPV1RPIChSX1NIX0NPVU5ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0NPVU5UIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbmRpY2F0ZXMgYW4gYWxpZ25tZW50IHN0YXRlbWVudC4gIFRoZSBvZmZzZXQgZmllbGQgaXMgdGhlIHBvd2VyCi0gICAgIG9mIDIgdG8gd2hpY2ggc3Vic2VxdWVudCBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZQotICAgICBhbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfQUxJR04sCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQUxJR04iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgYmVmb3JlIGEgYmxvY2sgb2YKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgQSBzZWN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgYXMgYXNzdW1pbmluZyBpdAotICAgICBjb250YWlucyBkYXRhLCB1bmxlc3MgdGhpcyByZWxvYyBpcyBzZWVuLiAgKi8KLSAgSE9XVE8gKFJfU0hfQ09ERSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9DT0RFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBhZnRlciBhIGJsb2NrIG9mCi0gICAgIGluc3RydWN0aW9ucyB3aGVuIGl0IHNlZXMgZGF0YSB0aGF0IGlzIG5vdCBpbnN0cnVjdGlvbnMuICAqLwotICBIT1dUTyAoUl9TSF9EQVRBLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RBVEEiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoaXMgcmVsb2MgZm9yIGVhY2ggbGFiZWwgd2l0aGluIGEgYmxvY2sKLSAgICAgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gYXZvaWQgc3dhcHBpbmcKLSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSB0aGUgdGFyZ2V0cyBvZiBicmFuY2hlcy4gICovCi0gIEhPV1RPIChSX1NIX0xBQkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0xBQkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiA4IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkuICBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgYW4gZXhwcmVzc2lvbgotICAgICBzdWNoIGFzIGBgLndvcmQgTDEgLSBMMicnLiAgVGhlIG9mZnNldCBob2xkcyB0aGUgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCBMMi4gICovCi0gIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9TSF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9TSF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfU0hfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1NIX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDIgLSBidXQgc3BlY2lmaWVkIGluIGEgdmVyeSBvZGQgd2F5LiAgKi8KLSAgSE9XVE8gKFJfU0hfTE9PUF9TVEFSVCwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9MT09QX1NUQVJUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgUEMgcmVsYXRpdmUgZGl2aWRlZCBieSAyIC0gYnV0IHNwZWNpZmllZCBpbiBhIHZlcnkgb2RkIHdheS4gICovCi0gIEhPV1RPIChSX1NIX0xPT1BfRU5ELAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9MT09QX0VORCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfcmVsb2NfbG9vcCAocl90eXBlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGRyLAotICAgICAgICAgICAgICAgICAgIHN5bWJvbF9zZWN0aW9uLCBzdGFydCwgZW5kKQotICAgICBpbnQgcl90eXBlOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBhc2VjdGlvbiAqc3ltYm9sX3NlY3Rpb247Ci0gICAgIGJmZF92bWEgc3RhcnQsIGVuZDsKLXsKLSAgc3RhdGljIGJmZF92bWEgbGFzdF9hZGRyOwotICBhc2VjdGlvbiAqbGFzdF9zeW1ib2xfc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqc3RhcnRfcHRyLCAqcHRyLCAqbGFzdF9wdHI7Ci0gIGludCBkaWZmLCBjdW1fZGlmZjsKLSAgYmZkX3NpZ25lZF92bWEgeDsKLSAgaW50IGluc247Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgaWYgKGFkZHIgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdlIHJlcXVpcmUgdGhlIHN0YXJ0IGFuZCBlbmQgcmVsb2NhdGlvbnMgdG8gYmUgcHJvY2Vzc2VkIGNvbnNlY3V0aXZlbHkgLQotICAgICBhbHRob3VnaCB3ZSBhbGxvdyB0aGVuIHRvIGJlIHByb2Nlc3NlZCBmb3J3YXJkcyBvciBiYWNrd2FyZHMuICAqLwotICBpZiAoISBsYXN0X2FkZHIpCi0gICAgewotICAgICAgbGFzdF9hZGRyID0gYWRkcjsKLSAgICAgIGxhc3Rfc3ltYm9sX3NlY3Rpb24gPSBzeW1ib2xfc2VjdGlvbjsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICBpZiAobGFzdF9hZGRyICE9IGFkZHIpCi0gICAgYWJvcnQgKCk7Ci0gIGxhc3RfYWRkciA9IDA7Ci0KLSAgaWYgKCEgc3ltYm9sX3NlY3Rpb24gfHwgbGFzdF9zeW1ib2xfc2VjdGlvbiAhPSBzeW1ib2xfc2VjdGlvbiB8fCBlbmQgPCBzdGFydCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2xfc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmIChzeW1ib2xfc2VjdGlvbiAhPSBpbnB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzeW1ib2xfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzeW1ib2xfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50cwotCSAgICA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzeW1ib2xfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc3ltYm9sX3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICBzeW1ib2xfc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2RlZmluZSBJU19QUEkoUFRSKSAoKGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgKFBUUikpICYgMHhmYzAwKSA9PSAweGY4MDApCi0gIHN0YXJ0X3B0ciA9IGNvbnRlbnRzICsgc3RhcnQ7Ci0gIGZvciAoY3VtX2RpZmYgPSAtNiwgcHRyID0gY29udGVudHMgKyBlbmQ7IGN1bV9kaWZmIDwgMCAmJiBwdHIgPiBzdGFydF9wdHI7KQotICAgIHsKLSAgICAgIGZvciAobGFzdF9wdHIgPSBwdHIsIHB0ciAtPSA0OyBwdHIgPj0gc3RhcnRfcHRyICYmIElTX1BQSSAocHRyKTspCi0JcHRyIC09IDI7Ci0gICAgICBwdHIgKz0gMjsKLSAgICAgIGRpZmYgPSBsYXN0X3B0ciAtIHB0ciA+PiAxOwotICAgICAgY3VtX2RpZmYgKz0gZGlmZiAmIDE7Ci0gICAgICBjdW1fZGlmZiArPSBkaWZmOwotICAgIH0KLSAgLyogQ2FsY3VsYXRlIHRoZSBzdGFydCAvIGVuZCB2YWx1ZXMgdG8gbG9hZCBpbnRvIHJzIC8gcmUgbWludXMgZm91ciAtCi0gICAgIHNvIHRoYXQgd2lsbCBjYW5jZWwgb3V0IHRoZSBmb3VyIHdlIHdvdWxkIG90aGVyd2lzZSBoYXZlIHRvIGFkZCB0bwotICAgICBhZGRyIHRvIGdldCB0aGUgdmFsdWUgdG8gc3VidHJhY3QgaW4gb3JkZXIgdG8gZ2V0IHJlbGF0aXZlIGFkZHJlc3NpbmcuICAqLwotICBpZiAoY3VtX2RpZmYgPj0gMCkKLSAgICB7Ci0gICAgICBzdGFydCAtPSA0OwotICAgICAgZW5kID0gKHB0ciArIGN1bV9kaWZmICogMikgLSBjb250ZW50czsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0MCA9IHN0YXJ0IC0gNDsKLQotICAgICAgd2hpbGUgKHN0YXJ0MCA+PSAwICYmIElTX1BQSSAoY29udGVudHMgKyBzdGFydDApKQotCXN0YXJ0MCAtPSAyOwotICAgICAgc3RhcnQwID0gc3RhcnQgLSAyIC0gKChzdGFydCAtIHN0YXJ0MCkgJiAyKTsKLSAgICAgIHN0YXJ0ID0gc3RhcnQwIC0gY3VtX2RpZmYgLSAyOwotICAgICAgZW5kID0gc3RhcnQwOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cykKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLQotICBpbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIGFkZHIpOwotCi0gIHggPSAoaW5zbiAmIDB4MjAwID8gZW5kIDogc3RhcnQpIC0gYWRkcjsKLSAgaWYgKGlucHV0X3NlY3Rpb24gIT0gc3ltYm9sX3NlY3Rpb24pCi0gICAgeCArPSAoKHN5bWJvbF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3ltYm9sX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpCi0JICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpKTsKLSAgeCA+Pj0gMTsKLSAgaWYgKHggPCAtMTI4IHx8IHggPiAxMjcpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB4ID0gaW5zbiAmIH4weGZmIHwgeCAmIDB4ZmY7Ci0gIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyBhZGRyKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIHVzZWQgdG8gYmUgbGlrZSB0aGUgQ09GRgotICAgZnVuY3Rpb24sIGFuZCBpcyBhbG1vc3QgY2VydGFpbmx5IGluY29ycmVjdCBmb3Igb3RoZXIgRUxGIHRhcmdldHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICBlbnVtIGVsZl9zaF9yZWxvY190eXBlIHJfdHlwZTsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKLQotICByX3R5cGUgPSAoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgPT0gUl9TSF9JTkQxMlcgJiYgKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfSU5EMTJXOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmVsb2NzIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLAotICAgd2hpY2ggdGhlIGxpbmtlciBzaG91bGQgb3RoZXJ3aXNlIGlnbm9yZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX2VsZl9pZ25vcmVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0vKiBBbiBhcnJheSBtYXBwaW5nIEJGRCByZWxvYyBjb2RlcyB0byBTSCBFTEYgcmVsb2NzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIHNoX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9TSF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU0hfRElSMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU0hfUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwgUl9TSF9ESVI4V1BOIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLCBSX1NIX0lORDEyVyB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIFJfU0hfRElSOFdQWiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsIFJfU0hfRElSOFdQTCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NIX1NXSVRDSDggfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMTYgfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMzIsIFJfU0hfU1dJVENIMzIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfVVNFUywgUl9TSF9VU0VTIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPVU5ULCBSX1NIX0NPVU5UIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0FMSUdOLCBSX1NIX0FMSUdOIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPREUsIFJfU0hfQ09ERSB9LAotICB7IEJGRF9SRUxPQ19TSF9EQVRBLCBSX1NIX0RBVEEgfSwKLSAgeyBCRkRfUkVMT0NfU0hfTEFCRUwsIFJfU0hfTEFCRUwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU0hfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfU0hfR05VX1ZURU5UUlkgfSwKLSAgeyBCRkRfUkVMT0NfU0hfTE9PUF9TVEFSVCwgUl9TSF9MT09QX1NUQVJUIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xPT1BfRU5ELCBSX1NIX0xPT1BfRU5EIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2hfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNoX2VsZl9ob3d0b190YWJsZVsoaW50KSBzaF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNoX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1NIX21heCk7Ci0gIEJGRF9BU1NFUlQgKHIgPCBSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MgfHwgciA+IFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJnNoX2VsZl9ob3d0b190YWJsZVtyXTsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgU0ggRUxGLiAgU2VlIHRoZSBjb3JyZXNwb25kaW5nCi0gICBmdW5jdGlvbiBpbiBjb2ZmLXNoLmMgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuICBGSVhNRToKLSAgIFRoZXJlIGlzIGEgbG90IG9mIGR1cGxpY2F0aW9uIGhlcmUgYmV0d2VlbiB0aGlzIGNvZGUgYW5kIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBjb2RlLiAgVGhlIGZvcm1hdCBvZiByZWxvY3MgYW5kIHN5bWJvbHMgaXMgd291bmQgZGVlcGx5Ci0gICBpbnRvIHRoaXMgY29kZSwgYnV0IGl0IHdvdWxkIHN0aWxsIGJlIGJldHRlciBpZiB0aGUgZHVwbGljYXRpb24KLSAgIGNvdWxkIGJlIGVsaW1pbmF0ZWQgc29tZWhvdy4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IGFsdGhvdWdoIGJvdGgKLSAgIGZ1bmN0aW9ucyB1c2Ugc3ltYm9scyBsaWtlIFJfU0hfQ09ERSwgdGhvc2Ugc3ltYm9scyBoYXZlIGRpZmZlcmVudAotICAgdmFsdWVzOyBpbiBjb2ZmLXNoLmMgdGhleSBjb21lIGZyb20gaW5jbHVkZS9jb2ZmL3NoLmgsIHdoZXJlYXMgaGVyZQotICAgdGhleSBjb21lIGZyb20gZW51bSBlbGZfc2hfcmVsb2NfdHlwZSBpbiBpbmNsdWRlL2VsZi9zaC5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaGF2ZV9jb2RlID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhZGRyLCBwYWRkciwgc3ltdmFsOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbjsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKLSAgICAgIGJmZF9zaWduZWRfdm1hIGZvZmY7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT0RFKQotCWhhdmVfY29kZSA9IHRydWU7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9VU0VTKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGUgcl9hZGRlbmQgZmllbGQgb2YgdGhlIFJfU0hfVVNFUyByZWxvYyB3aWxsIHBvaW50IHVzIHRvCi0gICAgICAgICB0aGUgcmVnaXN0ZXIgbG9hZC4gIFRoZSA0IGlzIGJlY2F1c2UgdGhlIHJfYWRkZW5kIGZpZWxkIGlzCi0gICAgICAgICBjb21wdXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGp1bXAgb2Zmc2V0LCB3aGljaCBhcmUgYmFzZWQKLSAgICAgICAgIGZyb20gNCBieXRlcyBhZnRlciB0aGUganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsYWRkciA9IGlyZWwtPnJfb2Zmc2V0ICsgNCArIGlyZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGxhZGRyKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBtb3YubCBOTixyTiwgd2UgZG9uJ3Qga25vdyB3aGF0IHRvCi0gICAgICAgICBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQsIGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQotICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCi0gICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKLSAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLSAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAotICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICBwYWRkciA9IGluc24gJiAweGZmOwotICAgICAgcGFkZHIgKj0gNDsKLSAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7Ci0gICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jIGZvciB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcwotICAgICAgICAgYmVpbmcgbG9hZGVkLiAgVGhpcyByZWxvYyB3aWxsIHRlbGwgdXMgd2hpY2ggZnVuY3Rpb24gaXMKLSAgICAgICAgIGFjdHVhbGx5IGJlaW5nIGNhbGxlZC4gICovCi0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsZm4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9ESVIzMikKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxmbiA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCAhPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYykpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyKTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgc2hvcnRlbmVkLiAgKi8KLSAgICAgIGZvZmYgPSAoc3ltdmFsCi0JICAgICAgLSAoaXJlbC0+cl9vZmZzZXQKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgICAgIC8qIFJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLQotICAgICAgLyogQ2hhbmdlIHRoZSBSX1NIX1VTRVMgcmVsb2MgaW50byBhbiBSX1NIX0lORDEyVyByZWxvYywgYW5kCi0gICAgICAgICByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0gICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbyksIFJfU0hfSU5EMTJXKTsKLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBSX1NIX1VTRVMgcmVsb2MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lCi0gICAgICAgICByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbGVuZDsgaXJlbHNjYW4rKykKLQlpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1VTRVMKLQkgICAgJiYgbGFkZHIgPT0gaXJlbHNjYW4tPnJfb2Zmc2V0ICsgNCArIGlyZWxzY2FuLT5yX2FkZGVuZCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IHBhZGRyCi0JICAgICYmIEVMRjMyX1JfVFlQRSAoaXJlbGNvdW50LT5yX2luZm8pID09IChpbnQpIFJfU0hfQ09VTlQpCi0JICBicmVhazsKLQotICAgICAgLyogRGVsZXRlIHRoZSByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGlmICghIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9hZGRlbmQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX2FkZGVuZCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IiksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9hZGRlbmQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBpcmVsZm4tPnJfb2Zmc2V0LCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsCi0JCQkJJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICBGSVhNRTogVGhlcmUgaXMgYQotICAgbG90IG9mIGR1cGxpY2F0aW9uIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gICBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0gIGFzZWN0aW9uICpvOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX2FkZGVuZCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbnJhZGRyLCBzdG9wOwotICAgICAgYmZkX3ZtYSBzdGFydCA9IDA7Ci0gICAgICBpbnQgaW5zbiA9IDA7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBvZmYsIGFkanVzdCwgb2luc247Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmID0gMDsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgbnJhZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKQotCSAgfHwgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0FMSUdOCi0JICAgICAgJiYgaXJlbC0+cl9vZmZzZXQgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX29mZnNldCA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX29mZnNldCA8IGFkZHIgKyBjb3VudAotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RBVEEKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0xBQkVMKQotCWlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICAoaW50KSBSX1NIX05PTkUpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHNlZSBpZiB0aGUgcmFuZ2UgaXQgY292ZXJzCi0gICAgICAgICBpbmNsdWRlcyB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLiAgKi8KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JY2FzZSBSX1NIX0lORDEyVzoKLQljYXNlIFJfU0hfRElSOFdQWjoKLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSMzI6Ci0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCi0gICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCi0gICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KLSAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCi0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCQlleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSZzeW0pOwotCSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJICAmJiAoc3ltLnN0X3ZhbHVlIDw9IGFkZHIKLQkJICAgICAgfHwgc3ltLnN0X3ZhbHVlID49IHRvYWRkcikpCi0JCXsKLQkJICBiZmRfdm1hIHZhbDsKLQotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJICB2YWwgKz0gc3ltLnN0X3ZhbHVlOwotCQkgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JCX0KLQkgICAgfQotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIGlmIChvZmYgJiAweDgwKQotCSAgICBvZmYgLT0gMHgxMDA7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfSU5EMTJXOgotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmYgPSBpbnNuICYgMHhmZmY7Ci0JICAgICAgaWYgKG9mZiAmIDB4ODAwKQotCQlvZmYgLT0gMHgxMDAwOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1NXSVRDSDg6Ci0JY2FzZSBSX1NIX1NXSVRDSDE2OgotCWNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKLQkgICAgICAgLndvcmQgTDItTDEKLQkgICAgIFRoZSByX2FkZGVuZCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYwotCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAotCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKLQkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkgICAgIE4uQi4gaW4gZ2FzIC8gY29mZiBiZmQsIHRoZSBlbGYgYmZkIHJfYWRkZW5kIGlzIGNhbGxlZCByX29mZnNldCwKLQkgICAgIGFuZCB0aGUgZWxmIGJmZCByX29mZnNldCBpcyBjYWxsZWQgcl92YWRkci4gICovCi0KLQkgIHN0b3AgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0YXJ0ID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0b3AgLSAobG9uZykgaXJlbC0+cl9hZGRlbmQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfYWRkZW5kIC09IGNvdW50OwotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0Ci0JCQkgICAgKyAobG9uZykgaXJlbC0+cl9hZGRlbmQKLQkJCSAgICArIDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JICAmJiBzdGFydCA8IHRvYWRkcgotCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JYWRqdXN0ID0gY291bnQ7Ci0gICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JYWRqdXN0ID0gLSBjb3VudDsKLSAgICAgIGVsc2UKLQlhZGp1c3QgPSAwOwotCi0gICAgICBpZiAoYWRqdXN0ICE9IDApCi0JewotCSAgb2luc24gPSBpbnNuOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTDoKLQkgICAgICBCRkRfQVNTRVJUIChhZGp1c3QgPT0gY291bnQgfHwgY291bnQgPj0gNCk7Ci0JICAgICAgaWYgKGNvdW50ID49IDQpCi0JCWluc24gKz0gYWRqdXN0IC8gNDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGlyZWwtPnJfb2Zmc2V0ICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIODoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IDAgfHwgdm9mZiA+PSAweGZmKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDE2OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgLSAweDgwMDAgfHwgdm9mZiA+PSAweDgwMDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8xNiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9VU0VTOgotCSAgICAgIGlyZWwtPnJfYWRkZW5kICs9IGFkanVzdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpcmVsLT5yX29mZnNldCA9IG5yYWRkcjsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMuICBJZiB0aGVyZSBjb250YWluIGFueSBJTU0zMgotICAgICByZWxvY3MgYWdhaW5zdCBpbnRlcm5hbCBzeW1ib2xzIHdoaWNoIHdlIGFyZSBub3QgZ29pbmcgdG8gYWRqdXN0Ci0gICAgIGJlbG93LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGFkZGVuZHMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxzY2FuLCAqaXJlbHNjYW5lbmQ7Ci0gICAgICBiZmRfYnl0ZSAqb2NvbnRlbnRzOwotCi0gICAgICBpZiAobyA9PSBzZWMKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSByZWxvY3MuICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcwotICAgICAgICAgZmFsc2UsIHdlIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sIHdoZW4gd2UKLSAgICAgICAgIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGFiZmQsIG8sIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICB0cnVlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvY29udGVudHMgPSBOVUxMOwotICAgICAgaXJlbHNjYW5lbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbHNjYW5lbmQ7IGlyZWxzY2FuKyspCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0KLQkgIC8qIER3YXJmIGxpbmUgbnVtYmVycyB1c2UgUl9TSF9TV0lUQ0gzMiByZWxvY3MuICAqLwotCSAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbHNjYW4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gzMikKLQkgICAgewotCSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZjsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN0b3AgPSBpcmVsc2Nhbi0+cl9vZmZzZXQ7Ci0JICAgICAgc3RhcnQKLQkJPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RvcCAtIChsb25nKSBpcmVsc2Nhbi0+cl9hZGRlbmQpOwotCi0JICAgICAgLyogU1RPUCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLCBzbyBpdCB3b24ndCBjaGFuZ2UuICAqLwotCSAgICAgIGlmIChzdGFydCA+IGFkZHIgJiYgc3RhcnQgPCB0b2FkZHIpCi0JCWlyZWxzY2FuLT5yX2FkZGVuZCArPSBjb3VudDsKLQotCSAgICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7Ci0KLQkgICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkJICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkJYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYgKyBjb3VudCwKLQkJCQkgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCQliZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiAtIGNvdW50LAotCQkJCSAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgIH0KLQotCSAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbHNjYW4tPnJfaW5mbykgIT0gKGludCkgUl9TSF9ESVIzMikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbHNjYW4tPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSwKLQkJCQkgICAgJnN5bSk7Ci0KLQkgIGlmIChzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICAgICAmJiAoc3ltLnN0X3ZhbHVlIDw9IGFkZHIKLQkJICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICB2YWwgKz0gc3ltLnN0X3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsCi0JCQkgICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gbW92ZSB0aGUgQUxJR04gcmVsb2MgZm9yd2FyZC4gIFdlIGhhdmUgYWRqdXN0ZWQKLSAgICAgcl9vZmZzZXQgZm9yIGl0IGFscmVhZHkuICAqLwotICBpZiAoaXJlbGFsaWduICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBhbGlnbnRvLCBhbGlnbmFkZHI7Ci0KLSAgICAgIGFsaWdudG8gPSBCRkRfQUxJR04gKHRvYWRkciwgMSA8PCBpcmVsYWxpZ24tPnJfYWRkZW5kKTsKLSAgICAgIGFsaWduYWRkciA9IEJGRF9BTElHTiAoaXJlbGFsaWduLT5yX29mZnNldCwKLQkJCSAgICAgMSA8PCBpcmVsYWxpZ24tPnJfYWRkZW5kKTsKLSAgICAgIGlmIChhbGlnbnRvICE9IGFsaWduYWRkcikKLQl7Ci0JICAvKiBUYWlsIHJlY3Vyc2lvbi4gICovCi0JICByZXR1cm4gc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhbGlnbmFkZHIsCi0JCQkJCSAgICBhbGlnbnRvIC0gYWxpZ25hZGRyKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIGZvciBsb2FkcyBhbmQgc3RvcmVzIHdoaWNoIHdlIGNhbiBhbGlnbiB0byBmb3VyIGJ5dGUKLSAgIGJvdW5kYXJpZXMuICBUaGlzIGlzIGxpa2Ugc2hfYWxpZ25fbG9hZHMgaW4gY29mZi1zaC5jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKnBzd2FwcGVkOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF92bWEgKmxhYmVscyA9IE5VTEw7Ci0gIGJmZF92bWEgKmxhYmVsLCAqbGFiZWxfZW5kOwotCi0gICpwc3dhcHBlZCA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEdldCBhbGwgdGhlIGFkZHJlc3NlcyB3aXRoIGxhYmVscyBvbiB0aGVtLiAgKi8KLSAgbGFiZWxzID0gKGJmZF92bWEgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBpZiAobGFiZWxzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGxhYmVsX2VuZCA9IGxhYmVsczsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9MQUJFTCkKLQl7Ci0JICAqbGFiZWxfZW5kID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICArK2xhYmVsX2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIGN1cnJlbnRseSBhbHdheXMgb3V0cHV0cyByZWxvY3MgaW4KLSAgICAgYWRkcmVzcyBvcmRlci4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbCBuZWVkIHRvIHNvcnQKLSAgICAgdGhlIGxhYmVsIHZhbHVlcyBhbmQgdGhlIHJlbG9jcy4gICovCi0KLSAgbGFiZWwgPSBsYWJlbHM7Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9DT0RFKQotCWNvbnRpbnVlOwotCi0gICAgICBzdGFydCA9IGlyZWwtPnJfb2Zmc2V0OwotCi0gICAgICBmb3IgKGlyZWwrKzsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQlpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfREFUQSkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWwgPCBpcmVsZW5kKQotCXN0b3AgPSBpcmVsLT5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlzdG9wID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgICAgIGlmICghIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzaF9lbGZfc3dhcF9pbnNucywKLQkJCQkgICAgIChQVFIpIGludGVybmFsX3JlbG9jcywgJmxhYmVsLAotCQkJCSAgICAgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChsYWJlbHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobGFiZWxzICE9IE5VTEwpCi0gICAgZnJlZSAobGFiZWxzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIHR3byBTSCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIGxpa2Ugc2hfc3dhcF9pbnNucyBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3N3YXBfaW5zbnMgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxvY3M7Ci0gIHVuc2lnbmVkIHNob3J0IGkxLCBpMjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotCi0gIC8qIFN3YXAgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLSAgaTEgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBpMiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMiwgY29udGVudHMgKyBhZGRyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTEsIGNvbnRlbnRzICsgYWRkciArIDIpOwotCi0gIC8qIEFkanVzdCBhbGwgcmVsb2MgYWRkcmVzc2VzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGVsZl9zaF9yZWxvY190eXBlIHR5cGU7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICAvKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCB0eXBlcyBvZiByZWxvY3MgdGhhdCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICBhZGp1c3QuICBUaGVzZSByZWxvY3MgZG8gbm90IGFwcGx5IHRvIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsCi0gICAgICAgICBidXQgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSAoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9BTElHTgotCSAgfHwgdHlwZSA9PSBSX1NIX0NPREUKLQkgIHx8IHR5cGUgPT0gUl9TSF9EQVRBCi0JICB8fCB0eXBlID09IFJfU0hfTEFCRUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIGFuIFJfU0hfVVNFUyByZWxvYyBwb2ludHMgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcKLSAgICAgICAgIHN3YXBwZWQsIHdlIG11c3QgYWRqdXN0IGl0LiAgSXQgd291bGQgYmUgaW5jb3JyZWN0IHRvIGRvIHRoaXMKLSAgICAgICAgIGZvciBhIGp1bXAsIHRob3VnaCwgc2luY2Ugd2Ugd2FudCB0byBleGVjdXRlIGJvdGgKLSAgICAgICAgIGluc3RydWN0aW9ucyBhZnRlciB0aGUganVtcC4gIChXZSBoYXZlIGF2b2lkZWQgc3dhcHBpbmcKLSAgICAgICAgIGFyb3VuZCBhIGxhYmVsLCBzbyB0aGUganVtcCB3aWxsIG5vdCB3aW5kIHVwIGV4ZWN1dGluZyBhbgotICAgICAgICAgaW5zdHJ1Y3Rpb24gaXQgc2hvdWxkbid0KS4gICovCi0gICAgICBpZiAodHlwZSA9PSBSX1NIX1VTRVMpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGlyZWwtPnJfb2Zmc2V0ICsgNCArIGlyZWwtPnJfYWRkZW5kOwotCSAgaWYgKG9mZiA9PSBhZGRyKQotCSAgICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgZWxzZSBpZiAob2ZmID09IGFkZHIgKyAyKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSAyOwotCX0KLQotICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IGFkZHIpCi0JewotCSAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGFkZCA9IC0yOwotCX0KLSAgICAgIGVsc2UgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IGFkZHIgKyAyKQotCXsKLQkgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JICBhZGQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQlhZGQgPSAwOwotCi0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX2J5dGUgKmxvYzsKLQkgIHVuc2lnbmVkIHNob3J0IGluc24sIG9pbnNuOwotCSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotCSAgbG9jID0gY29udGVudHMgKyBpcmVsLT5yX29mZnNldDsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTjoKLQkgICAgY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BMOgotCSAgICAgIC8qIFRoaXMgcmVsb2MgaWdub3JlcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mCi0gICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGNvdW50ZXIgYmVmb3JlIGFkZGluZyBpbiB0aGUgb2Zmc2V0LgotICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgQUREUiBpcyBhdCBhbiBldmVuIGFkZHJlc3MsIHRoZQotICAgICAgICAgICAgICAgICBzd2FwIHdpbGwgbm90IGFmZmVjdCB0aGUgb2Zmc2V0LiAgSWYgQUREUiBpcyBhbiBhdCBhbgotICAgICAgICAgICAgICAgICBvZGQgYWRkcmVzcywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBjcm9zc2luZyBhCi0gICAgICAgICAgICAgICAgIGZvdXIgYnl0ZSBib3VuZGFyeSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQuICAqLwotCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDApCi0JCXsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkJICBvaW5zbiA9IGluc247Ci0JCSAgaW5zbiArPSBhZGQgLyAyOwotCQkgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIFNIIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3ZtYSBhZGRlbmQgPSAoYmZkX3ZtYSkwOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogTWFueSBvZiB0aGUgcmVsb2NzIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLCBhbmQgYXJlCi0gICAgICAgICBoYW5kbGVkIGVudGlyZWx5IGJ5IHRoZSByZWxheGF0aW9uIGNvZGUuICAqLwotICAgICAgaWYgKHJfdHlwZSA+IChpbnQpIFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DCi0JICAmJiByX3R5cGUgPCAoaW50KSBSX1NIX0xPT1BfU1RBUlQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCAocl90eXBlID49IChpbnQpIFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQwotCSAgICAgICYmIHJfdHlwZSA8PSAoaW50KSBSX1NIX0xBU1RfSU5WQUxJRF9SRUxPQykpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBGSVhNRTogVGhpcyBpcyBjZXJ0YWlubHkgaW5jb3JyZWN0LiAgSG93ZXZlciwgaXQgaXMgaG93IHRoZQotICAgICAgICAgQ09GRiBsaW5rZXIgd29ya3MuICAqLwotICAgICAgaWYgKHJfdHlwZSAhPSAoaW50KSBSX1NIX0RJUjMyCi0JICAmJiByX3R5cGUgIT0gKGludCkgUl9TSF9JTkQxMlcKLQkgICYmIHJfdHlwZSAhPSAoaW50KSBSX1NIX0xPT1BfU1RBUlQKLQkgICYmIHJfdHlwZSAhPSAoaW50KSBSX1NIX0xPT1BfRU5EKQotCWNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHNoX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciBhbiBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY2F0aW9uLiAgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIGhvdwotICAgICAgICAgICAgIHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotCSAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQkgICAgY29udGludWU7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgaG93IHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQlyZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWNhc2UgKGludClSX1NIX0RJUjMyOgotCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQkgIC8qIENPRkYgcmVsb2NzIGRvbid0IHVzZSB0aGUgYWRkZW5kLiBUaGUgYWRkZW5kIGlzIHVzZWQgZm9yCi0JICAgICBSX1NIX0RJUjMyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBjb21waWxlcnMuICovCi0JICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgIGJyZWFrOwotCWNhc2UgUl9TSF9MT09QX1NUQVJUOgotCSAgewotCSAgICBzdGF0aWMgYmZkX3ZtYSBzdGFydCwgZW5kOwotCi0JICAgIHN0YXJ0ID0gKHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kCi0JCSAgICAgLSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KSk7Ci0JICAgIHIgPSBzaF9lbGZfcmVsb2NfbG9vcCAocl90eXBlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgIHJlbC0+cl9vZmZzZXQsIHNlYywgc3RhcnQsIGVuZCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgUl9TSF9MT09QX0VORDoKLQkgICAgZW5kID0gKHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kCi0JCSAgIC0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCkpOwotCSAgICByID0gc2hfZWxmX3JlbG9jX2xvb3AgKHJfdHlwZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICByZWwtPnJfb2Zmc2V0LCBzZWMsIHN0YXJ0LCBlbmQpOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBhc2VjdGlvbiAqCi1zaF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NIX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHNoLiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotc2hfZWxmX3NldF9tYWNoX2Zyb21fZmxhZ3MgKGFiZmQpCi0gICAgIGJmZCAqICAgIGFiZmQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3M7Ci0KLSAgc3dpdGNoIChmbGFncyAmIEVGX1NIX01BQ0hfTUFTSykKLSAgICB7Ci0gICAgY2FzZSBFRl9TSDE6Ci0gICAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zaCwgYmZkX21hY2hfc2gpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFRl9TSDI6Ci0gICAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zaCwgYmZkX21hY2hfc2gyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUZfU0hfRFNQOgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoX2RzcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVGX1NIMzoKLSAgICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NoLCBiZmRfbWFjaF9zaDMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFRl9TSDNfRFNQOgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoM19kc3ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFRl9TSDNFOgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoM2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFRl9TSF9VTktOT1dOOgotICAgIGNhc2UgRUZfU0g0OgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoNCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgU0ggc3BlY2lmaWMgZmlsZSBmbGFncy4gKi8KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHNoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzIChhYmZkKTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2NvcHlfcHJpdmF0ZV9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIHNoX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAob2JmZCwgZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGZvciBsaW5raW5nIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBvYmplY3RzCi0gICB0b2dldGhlciwgYW5kIGZvciBsaW5raW5nIHNoLWRzcCB3aXRoIHNoM2UgLyBzaDQgb2JqZWN0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfbWVyZ2VfcHJpdmF0ZV9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzLCBuZXdfZmxhZ3M7Ci0KLSAgaWYgKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIChpYmZkLCBvYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSAwOwotICAgIH0KLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBpZiAoKEVGX1NIX0hBU19EU1AgKG9sZF9mbGFncykgJiYgRUZfU0hfSEFTX0ZQIChuZXdfZmxhZ3MpKQotICAgICAgfHwgKEVGX1NIX0hBU19EU1AgKG5ld19mbGFncykgJiYgRUZfU0hfSEFTX0ZQIChvbGRfZmxhZ3MpKSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoIiVzOiB1c2VzICVzIGluc3RydWN0aW9ucyB3aGlsZSBwcmV2aW91cyBtb2R1bGVzIHVzZSAlcyBpbnN0cnVjdGlvbnMiLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgRUZfU0hfSEFTX0RTUCAobmV3X2ZsYWdzKSA/ICJkc3AiIDogImZsb2F0aW5nIHBvaW50IiwKLQkgRUZfU0hfSEFTX0RTUCAobmV3X2ZsYWdzKSA/ICJmbG9hdGluZyBwb2ludCIgOiAiZHNwIik7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gRUZfU0hfTUVSR0VfTUFDSCAob2xkX2ZsYWdzLCBuZXdfZmxhZ3MpOwotCi0gIHJldHVybiBzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncyAob2JmZCk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9zaF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItc2giCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9zaGxfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItc2hsIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfc2gKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9TSAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MQotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlzaF9lbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24Jc2hfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbglzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJCXNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCXNoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfYmZkX2ZsYWdzIFwKLQkJCQkJc2hfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJc2hfZWxmX2NvcHlfcHJpdmF0ZV9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCXNoX2VsZl9tZXJnZV9wcml2YXRlX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgIHNoX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICBzaF9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgIHNoX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXNwYXJjLmMgYi9iZmQvZWxmMzItc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkNjVhNS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMTAgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAgIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgICAgMCwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUMzIsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSElQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9QTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE9QTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQzMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgLyogVGhlc2UgYXJlIGZvciBzcGFyYzY0IGluIGEgNjQgYml0IGVudmlyb25tZW50LgotICAgICBWYWx1ZXMgbmVlZCB0byBiZSBoZXJlIGJlY2F1c2UgdGhlIHRhYmxlIGlzIGluZGV4ZWQgYnkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ182NCIsICAgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX09MTzEwLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX09MTzEwIiwgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEgyMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xNMjIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSEgyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ITTEwIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0xNMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0xNMjIiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIC8qIEVuZCBzcGFyYzY0IGluIDY0IGJpdCBlbnZpcm9ubWVudCB2YWx1ZXMuCi0gICAgIFRoZSBmb2xsb3dpbmcgYXJlIGZvciBzcGFyYzY0IGluIGEgMzIgYml0IGVudmlyb25tZW50LiAgKi8KLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE2LCAgIDIsMiwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jLCJSX1NQQVJDX1dESVNQMTYiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxOSwgICAyLDIsMTksdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDE5IiwgZmFsc2UsMCwweDAwMDdmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VOVVNFRF80MiwgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVU5VU0VEXzQyIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNywgICAgICAgICAwLDIsIDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ183IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDdmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzUsICAgICAgICAgMCwyLCA1LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNSIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAxZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182LCAgICAgICAgIDAsMiwgNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzYiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwM2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFVjMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1JFVjMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi19Owotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMCwyLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9TUEFSQ19HTlVfVlRJTkhFUklUIiwgZmFsc2UsMCwgMCwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIlJfU1BBUkNfR05VX1ZURU5UUlkiLCBmYWxzZSwwLDAsIGZhbHNlKTsKLQotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAotICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKLSAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAotICAvKiA/Pz8gRG9lc24ndCBkd2FyZiB1c2UgdGhpcz8gICovCi0vKnsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTAsIFJfU1BBUkNfMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDXzExLCBSX1NQQVJDXzExfSwKLSAge0JGRF9SRUxPQ19TUEFSQ182NCwgUl9TUEFSQ182NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfT0xPMTAsIFJfU1BBUkNfT0xPMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hIMjIsIFJfU1BBUkNfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSE0xMCwgUl9TUEFSQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MTTIyLCBSX1NQQVJDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsIFJfU1BBUkNfUENfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwgUl9TUEFSQ19QQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLCBSX1NQQVJDX1BDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsIFJfU1BBUkNfV0RJU1AxNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwgUl9TUEFSQ19XRElTUDE5fSwKLSAge0JGRF9SRUxPQ19TUEFSQ183LCBSX1NQQVJDXzd9LAotICB7QkZEX1JFTE9DX1NQQVJDXzUsIFJfU1BBUkNfNX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNiwgUl9TUEFSQ182fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19SRVYzMiwgUl9TUEFSQ19SRVYzMiB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NQQVJDX0dOVV9WVElOSEVSSVR9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9TUEFSQ19HTlVfVlRFTlRSWX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgICByZXR1cm4gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgRUxGMzJfUl9UWVBFIHNvIHdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoaXMgZnVuY3Rpb24sCi0gICBhbmQgZWxmNjQtc3BhcmMuYyBoYXMgaXRzIG93biBjb3B5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBzd2l0Y2ggKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykpCi0gICAgewotICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heF9zdGQpOwotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLSAgICB9Ci19Ci0MCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYyAoYWJmZCwKLQkJCSAgICAgcmVsb2NfZW50cnksCi0JCQkgICAgIHN5bWJvbCwKLQkJCSAgICAgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwKLQkJCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLAotCQkJIHJlbG9jX2VudHJ5LAotCQkJIHN5bWJvbCwKLQkJCSBkYXRhLAotCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwKLQkJCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgeDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQl8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgU1BBUkMgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgbm9wIG9wY29kZSB3ZSB1c2UuICAqLwotCi0jZGVmaW5lIFNQQVJDX05PUCAweDAxMDAwMDAwCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLQotLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFyZSByZXNlcnZlZCwKLSAgIGFuZCB0aGUgaW5pdGlhbCBjb250ZW50cyBhcmUgdW5pbXBvcnRhbnQgKHdlIHplcm8gdGhlbSBvdXQpLgotICAgU3Vic2VxdWVudCBlbnRyaWVzIGxvb2sgbGlrZSB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBTUEFSQwotICAgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi0vKiBzZXRoaSAlaGkoLi0ucGx0MCksJWcxLiAgV2UgZmlsbCBpbiB0aGUgYWRkcmVzcyBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMCAweDAzMDAwMDAwCi0vKiBiLGEgLnBsdDAuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgbGF0ZXIuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDEgMHgzMDgwMDAwMAotLyogbm9wLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyIFNQQVJDX05PUAotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwCi0gICAgICAgICAgICAgICAgIHJlbG9jIGZvciBhIGxvY2FsIHN5bWJvbCBpZiB5b3UgYXNzZW1ibGUgYSBjYWxsIGZyb20KLSAgICAgICAgICAgICAgICAgb25lIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0Ci0gICAgICAgICAgICAgICAgIGl0IGFzIFdESVNQMzAuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5Ci0gICAgICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcwotICAgICAgICAgICAgIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZSBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sCi0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90Ci0gICAgICAgICAgICAgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcwotICAgICAgICAgICAgIG5ldmVyIGNsZWFyZWQpLiAgVGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGluCi0gICAgICAgICAgICAgZWxmMzItaTM4Ni5jLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoaW5mby0+c3ltYm9saWMKLQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMzoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QyMjoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOwotCSAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSX1NQQVJDX1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0gICAgICBjYXNlIFJfU1BBUkNfTE9QTFQxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5wbHQucmVmY291bnQtLTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgbm9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgd2VyZSBkeW5hbWljIG9iamVjdHMuCi0JICAgICBPciwgd2hlbiBsaW5raW5nIHRoZSBtYWluIGFwcGxpY2F0aW9uIG9yIGEgLUJzeW1ib2xpYwotCSAgICAgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBQSUMgY29kZS4gIE9yIHdoZW4gYSBnbG9iYWwgc3ltYm9sCi0JICAgICBoYXMgYmVlbiBtYWRlIHByaXZhdGUsIGUuZy4gdmlhIHZlcnNpb25pbmcuCi0KLQkgICAgIEluIHRoZXNlIGNhc2VzIHdlIGtub3cgd2hhdCB2YWx1ZSB0aGUgc3ltYm9sIHdpbGwgcmVzb2x2ZQotCSAgICAgdG8sIHNvIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQgYSBwcm9jZWR1cmUgbGlua2FnZQotCSAgICAgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAgcmVsb2MgaW5zdGVhZC4gICovCi0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gLnBsdCBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IDQgKiBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGhhcyBhIG1heGltdW0gc2l6ZS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4NDAwMDAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotICAgICAgIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotICAgICAgIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0gICAgICAgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLSAgICAgICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgICB7Ci0JaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQloLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotICAgICAgfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCB0aGF0IGRvIG5vdCB1c2UgdGhlCi0gICAgIEdPVCwgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIGNvcHkgcmVsb2MuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fR09UX1JFRikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9TUEFSQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHRvIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiByZWxwbHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSB0cmFpbGluZyBub3AgaW4gLnBsdC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID4gMCkKLQlzLT5fcmF3X3NpemUgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmdvdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0jZGVmaW5lIFNFVF9TRUNfRE9fUkVMQVgoc2VjdGlvbikgZG8geyBlbGZfc2VjdGlvbl9kYXRhKHNlY3Rpb24pLT50ZGF0YSA9ICh2b2lkICopMTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgU0VDX0RPX1JFTEFYKHNlY3Rpb24pIChlbGZfc2VjdGlvbl9kYXRhKHNlY3Rpb24pLT50ZGF0YSA9PSAodm9pZCAqKTEpCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAqYWdhaW4gPSBmYWxzZTsKLSAgU0VUX1NFQ19ET19SRUxBWCAoc2VjdGlvbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhIFNQQVJDIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBiZmRfdm1hIGdvdF9iYXNlOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPT0gTlVMTCkKLSAgICBnb3RfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVElOSEVSSVQgCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR05VX1ZURU5UUlkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1NQQVJDX1dQTFQzMAotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEwCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QxMwotCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR09UMjIpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfU1BBUkNfOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18zMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfRElTUDMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMzAKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDE5Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfSEkyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18yMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xMwotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19MTzEwCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1VBMzIKLQkJCSAgfHwgKChyX3R5cGUgPT0gUl9TUEFSQ19QQzEwCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfUEMyMikKLQkJCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKSkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMKLQkJICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpID09IFNUVl9ERUZBVUxUKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQKLQkJICAgICAgIHx8IEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcikpKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwIHJlbG9jCi0JICAgICBmb3IgYSBsb2NhbCBzeW1ib2wgaWYgeW91IGFzc2VtYmxlIGEgY2FsbCBmcm9tIG9uZQotCSAgICAgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQgaXQgYXMKLQkgICAgIFdESVNQMzAuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgKGluZm8tPnN5bWJvbGljCi0JCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ184OgotCWNhc2UgUl9TUEFSQ18xNjoKLQljYXNlIFJfU1BBUkNfMzI6Ci0JY2FzZSBSX1NQQVJDX0hJMjI6Ci0JY2FzZSBSX1NQQVJDXzIyOgotCWNhc2UgUl9TUEFSQ18xMzoKLQljYXNlIFJfU1BBUkNfTE8xMDoKLQljYXNlIFJfU1BBUkNfVUEzMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfU1BBUkNfMzIpCi0JCSAgICB7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgbm9uLXBpYwotCQkJICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQkJCSAgaWYgKGluZHggPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJCShfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgICAgIHJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLSAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIHVubGVzcyB0aGlzIGlzIGEgUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAgcmVsb2MgaW4gYW4gdW5hbGxvY2F0ZWQgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKHNraXAKLQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICB8fCBFTEYzMl9SX1RZUEUgKG91dHJlbC5yX2luZm8pICE9IFJfU1BBUkNfUkVMQVRJVkUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKLQl7Ci0JICBiZmRfdm1hIHg7Ci0KLQkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0JICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICBlbHNlCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICB4ID0geCArIHJlbG9jYXRpb247Ci0JICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBlbHNlIGlmICgocl90eXBlID09IFJfU1BBUkNfV0RJU1AzMCB8fCByX3R5cGUgPT0gUl9TUEFSQ19XUExUMzApCi0JICAgICAgICYmIFNFQ19ET19SRUxBWCAoaW5wdXRfc2VjdGlvbikKLQkgICAgICAgJiYgcmVsLT5yX29mZnNldCArIDQgPCBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JewotI2RlZmluZSBHMAkJMAotI2RlZmluZSBPNwkJMTUKLSNkZWZpbmUgWENDCQkoMiA8PCAyMCkKLSNkZWZpbmUgQ09ORCh4KQkJKCgoeCkmMHhmKTw8MjUpCi0jZGVmaW5lIENPTkRBCQlDT05EKDB4OCkKLSNkZWZpbmUgSU5TTl9CUEEJKEYyKDAsMSkgfCBDT05EQSB8IEJQUkVEIHwgWENDKQotI2RlZmluZSBJTlNOX0JBCQkoRjIoMCwyKSB8IENPTkRBKQotI2RlZmluZSBJTlNOX09SCQlGMygyLCAweDIsIDApCi0jZGVmaW5lIElOU05fTk9QCUYyKDAsNCkKLQotCSAgYmZkX3ZtYSB4LCB5OwotCi0JICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBjYWxsIHdpdGggZWl0aGVyOgotCSAgICAgcmVzdG9yZQotCSAgICAgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbiB3aXRoIHJkID09ICVvNwotCSAgICAgd2hlcmUgcnMxICE9ICVvNyBhbmQgcnMyIGlmIGl0IGlzIHJlZ2lzdGVyICE9ICVvNwotCSAgICAgdGhlbiB3ZSBjYW4gb3B0aW1pemUgaWYgdGhlIGNhbGwgZGVzdGluYXRpb24gaXMgbmVhcgotCSAgICAgYnkgY2hhbmdpbmcgdGhlIGNhbGwgaW50byBhIGJyYW5jaCBhbHdheXMuICAqLwotCSAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIHkgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCSAgaWYgKCh4ICYgT1AofjApKSA9PSBPUCgxKSAmJiAoeSAmIE9QKH4wKSkgPT0gT1AoMikpCi0JICAgIHsKLQkgICAgICBpZiAoKCh5ICYgT1AzKH4wKSkgPT0gT1AzKDB4M2QpIC8qIHJlc3RvcmUgKi8KLQkJICAgfHwgKCh5ICYgT1AzKDB4MjgpKSA9PSAwIC8qIGFyaXRobWV0aWMgKi8KLQkJICAgICAgICYmICh5ICYgUkQofjApKSA9PSBSRChPNykpKQotCQkgICYmICh5ICYgUlMxKH4wKSkgIT0gUlMxKE83KQotCQkgICYmICgoeSAmIEYzSSh+MCkpCi0JCSAgICAgIHx8ICh5ICYgUlMyKH4wKSkgIT0gUlMyKE83KSkpCi0JCXsKLQkJICBiZmRfdm1hIHJlbG9jOwotCi0JCSAgcmVsb2MgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZCAtIHJlbC0+cl9vZmZzZXQ7Ci0JCSAgcmVsb2MgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBFbnN1cmUgdGhlIHJlbG9jIGZpdHMgaW50byBzaW1tMjIuICAqLwotCQkgIGlmICgocmVsb2MgJiAzKSA9PSAwCi0JCSAgICAgICYmICgocmVsb2MgJiB+KGJmZF92bWEpMHg3ZmZmZmYpID09IDAKLQkJCSAgfHwgKChyZWxvYyB8IDB4N2ZmZmZmKSA9PSB+KGJmZF92bWEpMCkpKQotCQkgICAgewotCQkgICAgICByZWxvYyA+Pj0gMjsKLQkJCi0JCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgaXQgZml0cyBpbnRvIHNpbW0xOSBvbiB2OS4gICovCi0JCSAgICAgIGlmICgoKHJlbG9jICYgMHgzYzAwMDApID09IDAKLQkJCSAgIHx8IChyZWxvYyAmIDB4M2MwMDAwKSA9PSAweDNjMDAwMCkKLQkJCSAgJiYgKGVsZl9lbGZoZWFkZXIgKG91dHB1dF9iZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfMzJQTFVTKSkKLQkJCXggPSBJTlNOX0JQQSB8IChyZWxvYyAmIDB4N2ZmZmYpOyAvKiBiYSxwdCAleGNjICovCi0JCSAgICAgIGVsc2UKLQkJCXggPSBJTlNOX0JBIHwgKHJlbG9jICYgMHgzZmZmZmYpOyAvKiBiYSAqLwotCQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IDQKLQkJCSAgJiYgKHkgJiAoMHhmZmZmZmZmZiBeIFJTMSh+MCkpKQotCQkJICAgICAgPT0gKElOU05fT1IgfCBSRChPNykgfCBSUzIoRzApKSkKLQkJCXsKLQkJCSAgYmZkX3ZtYSB6OwotCQkJICB1bnNpZ25lZCBpbnQgcmVnOwotCi0JCQkgIHogPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCSAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0IC0gNCk7Ci0JCQkgIGlmICgoeiAmICgweGZmZmZmZmZmIF4gUkQofjApKSkKLQkJCSAgICAgICE9IChJTlNOX09SIHwgUlMxKE83KSB8IFJTMihHMCkpKQotCQkJICAgIGJyZWFrOwotCi0JCQkgIC8qIFRoZSBzZXF1ZW5jZSB3YXMKLQkJCSAgICAgb3IgJW83LCAlZzAsICVyTgotCQkJICAgICBjYWxsIGZvbwotCQkJICAgICBvciAlck4sICVnMCwgJW83Ci0KLQkJCSAgICAgSWYgY2FsbCBmb28gd2FzIHJlcGxhY2VkIHdpdGggYmEsIHJlcGxhY2UKLQkJCSAgICAgb3IgJXJOLCAlZzAsICVvNyB3aXRoIG5vcC4gICovCi0KLQkJCSAgcmVnID0gKHkgJiBSUzEofjApKSA+PiAxNDsKLQkJCSAgaWYgKHJlZyAhPSAoKHogJiBSRCh+MCkpID4+IDI1KQotCQkJICAgICAgfHwgcmVnID09IEcwIHx8IHJlZyA9PSBPNykKLQkJCSAgICBicmVhazsKLQotCQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIElOU05fTk9QLAotCQkJCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCQkJfQotCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0gICAgICAgICBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICBQTFRfRU5UUllfV09SRDAgKyBoLT5wbHQub2Zmc2V0LAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChQTFRfRU5UUllfV09SRDEKLQkJICAgKyAoKCgtIChoLT5wbHQub2Zmc2V0ICsgNCkpID4+IDIpICYgMHgzZmZmZmYpKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9FTlRSWV9XT1JEMiwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSA0KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7Ci0JfQotCi0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgZGVmYXVsdDoJICBuYW1lID0gTlVMTDsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDbGVhciB0aGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwKLQkgYW5kIHB1dCBhIG5vcCBpbiB0aGUgbGFzdCBmb3VyIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIG1lbXNldCAoc3BsdC0+Y29udGVudHMsIDAsIDQgKiBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19OT1AsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgc3BsdC0+X3Jhd19zaXplIC0gNCk7Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCVBMVF9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLwotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBlX2ZsYWdzIGZpZWxkLgotCi0gICBXZSBkb24ndCBkZWZpbmUgc2V0X3ByaXZhdGVfZmxhZ3Mgb3IgY29weV9wcml2YXRlX2JmZF9kYXRhIGJlY2F1c2UKLSAgIHRoZSBvbmx5IGN1cnJlbnRseSBkZWZpbmVkIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIGJmZCBtYWNoIG51bWJlciwKLSAgIHNvIHdlIHVzZSB0aGUgbGF0dGVyIGluc3RlYWQgYW5kIGRlZmVyIHNldHRpbmcgZV9mbGFncyB1bnRpbCB0aGUKLSAgIGZpbGUgaXMgd3JpdHRlbiBvdXQuICAqLwotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJvb2xlYW4gZXJyb3I7Ci0gIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgc3RhdGljLiAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlcnJvciA9IGZhbHNlOwotCi0jaWYgMAotICAvKiA/Pz8gVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCBkbyB0aGlzIHNvIHdlIGNhbid0IChvdGhlcndpc2UgZ2NjIHdvdWxkCi0gICAgIGhhdmUgdG8ga25vdyB3aGljaCBsaW5rZXIgaXMgYmVpbmcgdXNlZCkuICBJbnN0ZWFkLCB0aGUgbmF0aXZlIGxpbmtlcgotICAgICBidW1wcyB1cCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIHdoZW4gaXQgaGFzIHRvLiAgSG93ZXZlciwgSSBzdGlsbCB0aGluawotICAgICB3YXJuaW5ncyBsaWtlIHRoZXNlIGFyZSBnb29kLCBzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhlbSB0dXJuZWQgb24KLSAgICAgYnkgc29tZSBvcHRpb24uICAqLwotCi0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyBub3JtYWwgc3BhcmMsIHdlIGNhbid0IGFsbG93IHY5IGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmMKLSAgICAgICYmIChiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotCSAgfHwgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1cyBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgdjksIHdlIGNhbid0IGFsbG93IHY5K3ZpcyBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotICAgICAgJiYgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSNlbHNlCi0gIGlmIChiZmRfZ2V0X21hY2ggKGliZmQpID49IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgNjQgYml0IHN5c3RlbSBhbmQgdGFyZ2V0IGlzIDMyIGJpdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICBlbHNlIGlmICgoaWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLQliZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotICAgIH0KLSNlbmRpZgotCi0gIGlmICgoKGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBKQotICAgICAgICE9IHByZXZpb3VzX2liZmRfZV9mbGFncykKLSAgICAgICYmIHByZXZpb3VzX2liZmRfZV9mbGFncyAhPSAodW5zaWduZWQgbG9uZykgLTEpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICB9Ci0gIHByZXZpb3VzX2liZmRfZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBOwotCi0gIGlmIChlcnJvcikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID09IEVNX1NQQVJDMzJQTFVTKQotICAgIHsKLSAgICAgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpOwotICAgICAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ18zMlBMVVMpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYyk7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIG9iamVjdCBmaWxlLgotICAgV2UgbmVlZCB0byBzZXQgdGhlIGVfbWFjaGluZSBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfc3BhcmMgOgotICAgICAgYnJlYWs7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkMzMlBMVVM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfU1BBUkNfMzJQTFVTX01BU0s7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDMzJQTFVTOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1NQQVJDXzMyUExVU19NQVNLOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTIHwgRUZfU1BBUkNfU1VOX1VTMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDX0xFREFUQTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCWJmZF9lbGYzMl9zcGFyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCSJlbGYzMi1zcGFyYyIKLSNkZWZpbmUgRUxGX0FSQ0gJYmZkX2FyY2hfc3BhcmMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSBFTV9TUEFSQwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxIEVNX1NQQVJDMzJQTFVTCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JZWxmMzJfc3BhcmNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmMzJfc3BhcmNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGYzMl9zcGFyY19jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJZWxmMzJfc3BhcmNfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICBlbGYzMl9zcGFyY19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICBlbGYzMl9zcGFyY19nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplIDQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplICg0KlBMVF9FTlRSWV9TSVpFKQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItdjg1MC5jIGIvYmZkL2VsZjMyLXY4NTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlMjhmYy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItdjg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIzNiArMCwwIEBACi0vKiBWODUwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLQotLyogWFhYIEZJWE1FOiBUaGlzIGNvZGUgaXMgbGl0dGVyZWQgd2l0aCAzMmJpdCBpbnQsIDE2Yml0IHNob3J0LCA4Yml0IGNoYXIKLSAgIGRlcGVuZGVuY2llcy4gIEFzIGlzIHRoZSBnYXMgJiBzaW11bGF0b3IgY29kZSBvciB0aGUgdjg1MC4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL3Y4NTAuaCIKLQotLyogc2lnbi1leHRlbmQgYSAyNC1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQyNCh4KQkoKCgoeCkgJiAweGZmZmZmZikgXiAofiAweDdmZmZmZikpICsgMHg4MDAwMDApCi0gICAgICAKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp2ODUwX2VsZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgcmVtZW1iZXJfaGkxNnNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqIGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYwotICBQQVJBTVMgKChiZmRfdm1hLCBib29sZWFuICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotCi0vKiBOb3RlOiBJdCBpcyBSRVFVSVJFRCB0aGF0IHRoZSAndHlwZScgdmFsdWUgb2YgZWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5Ci0gICBtYXRjaCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBhcnJheS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB2ODUwX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9WODUwX05PTkUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfTk9ORSIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDkgYml0IGJyYW5jaC4gKi8KLSAgSE9XVE8gKFJfVjg1MF85X1BDUkVMLAkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzlfUENSRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoLiAqLwotICBIT1dUTyAoUl9WODUwXzIyX1BDUkVMLAkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA3LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8yMl9QQ1JFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2ZmZmY4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmZmZjgwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9ISTE2X1MsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0hJMTZfUyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX1Y4NTBfSEkxNiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfSEkxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX1Y4NTBfTE8xNiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfTE8xNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSAzMmJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX1Y4NTBfMzIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzMyIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaW1wbGUgMTZiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9WODUwXzE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaW1wbGUgOGJpdCByZWxvYy4JICovCi0gIEhPV1RPIChSX1Y4NTBfOCwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfOCIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAxLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE1IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZSwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV82XzhfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAxLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZSwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZSwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfN184X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV83XzhfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2YsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4N2YsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfN183X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNywJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV83XzdfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2YsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4N2YsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIhICAqLwotICBIT1dUTyAoUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDUgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNF81X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV80XzVfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MGYsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4MGYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzRfNF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDQsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNF80X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDBmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDBmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUwMDIwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUwMDIwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA3LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1Y4NTBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfVjg1MF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfVjg1MF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfVjg1MF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIFY4NTAgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcAotewotICAvKiBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQgaXMgMjU4LCB3aGljaCB3aWxsIG5vdCBmaXggaW4gYW4KLSAgICAgdW5zaWduZWQgY2hhci4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcCB2ODUwX2VsZl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsCQlSX1Y4NTBfTk9ORSB9LAotICB7IEJGRF9SRUxPQ19WODUwXzlfUENSRUwsCVJfVjg1MF85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwsCVJfVjg1MF8yMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19ISTE2X1MsCQlSX1Y4NTBfSEkxNl9TIH0sCi0gIHsgQkZEX1JFTE9DX0hJMTYsCQlSX1Y4NTBfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LAkJUl9WODUwX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsCQlSX1Y4NTBfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTYsCQlSX1Y4NTBfMTYgfSwKLSAgeyBCRkRfUkVMT0NfOCwJCVJfVjg1MF84IH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VULCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVCwgICBSX1Y4NTBfVERBXzZfOF9PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VULCAgIFJfVjg1MF9UREFfN184X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQsICAgUl9WODUwX1REQV83XzdfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VULCAgICAgICAgIFJfVjg1MF9UREFfNF81X09GRlNFVCAgICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQsICAgICAgICAgUl9WODUwX1REQV80XzRfT0ZGU0VUICAgICAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgICAgICAgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgICAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsICAgICBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUICAgICB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgICAgICAgICAgICAgICBSX1Y4NTBfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgICAgICAgICAgICAgICBSX1Y4NTBfR05VX1ZURU5UUlkgfSwKLQotfTsKLQotDAotLyogTWFwIGEgYmZkIHJlbG9jYXRpb24gaW50byB0aGUgYXBwcm9wcmlhdGUgaG93dG8gc3RydWN0dXJlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi12ODUwX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mICh2ODUwX2VsZl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKHY4NTBfZWxmX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JewotCSAgQkZEX0FTU0VSVCAodjg1MF9lbGZfaG93dG9fdGFibGVbdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdLnR5cGUgPT0gdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWwpOwotCSAgCi0JICByZXR1cm4gJiB2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotDAotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBWODUwIEVMRiByZWxvYy4gICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKiAgZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgVjg1MCBFTEYgcmVsb2MgKHR5cGUgUkVMQSkuICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqICAgICAgICAgICAgIGNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAgICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfVjg1MF9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJnY4NTBfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICByZWxvY3M7Ci17Ci0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBlbnVtIHY4NTBfcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGludCBvdGhlciA9IDA7Ci0gIGNvbnN0IGNoYXIgKmNvbW1vbiA9IChjb25zdCBjaGFyICopMDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAidjg1MF9lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKLQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHJfdHlwZSA9IChlbnVtIHY4NTBfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFJfVjg1MF9OT05FOgotCWNhc2UgUl9WODUwXzlfUENSRUw6Ci0JY2FzZSBSX1Y4NTBfMjJfUENSRUw6Ci0JY2FzZSBSX1Y4NTBfSEkxNl9TOgotCWNhc2UgUl9WODUwX0hJMTY6Ci0JY2FzZSBSX1Y4NTBfTE8xNjoKLQljYXNlIFJfVjg1MF8zMjoKLQljYXNlIFJfVjg1MF8xNjoKLQljYXNlIFJfVjg1MF84OgotCWNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgotCSAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQljYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKLQkgIG90aGVyID0gVjg1MF9PVEhFUl9TREE7Ci0JICBjb21tb24gPSAiLnNjb21tb24iOwotCSAgZ290byBzbWFsbF9kYXRhX2NvbW1vbjsKLQkgIAotCWNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLQljYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1pEQTsKLQkgIGNvbW1vbiA9ICIuemNvbW1vbiI7Ci0JICBnb3RvIHNtYWxsX2RhdGFfY29tbW9uOwotCSAgCi0JY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKLQkgIG90aGVyID0gVjg1MF9PVEhFUl9UREE7Ci0JICBjb21tb24gPSAiLnRjb21tb24iOwotCSAgLyogZmFsbCB0aHJvdWdoICovCi0KLSNkZWZpbmUgVjg1MF9PVEhFUl9NQVNLIChWODUwX09USEVSX1REQSB8IFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREEpCi0KLQlzbWFsbF9kYXRhX2NvbW1vbjoKLQkgIGlmIChoKQotCSAgICB7Ci0JICAgICAgaC0+b3RoZXIgfD0gb3RoZXI7CS8qIGZsYWcgd2hpY2ggdHlwZSBvZiByZWxvY2F0aW9uIHdhcyB1c2VkICovCi0JICAgICAgaWYgKChoLT5vdGhlciAmIFY4NTBfT1RIRVJfTUFTSykgIT0gKG90aGVyICYgVjg1MF9PVEhFUl9NQVNLKQotCQkgICYmIChoLT5vdGhlciAmIFY4NTBfT1RIRVJfRVJST1IpID09IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICogbXNnOwotCQkgIHN0YXRpYyBjaGFyICBidWZmWzIwMF07IC8qIFhYWCAqLwotCi0JCSAgc3dpdGNoIChoLT5vdGhlciAmIFY4NTBfT1RIRVJfTUFTSykKLQkJICAgIHsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IG9jY3VweSBpbiBtdWx0aXBsZSBzbWFsbCBkYXRhIHJlZ2lvbnMiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREEgfCBWODUwX09USEVSX1REQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW4gb25seSBiZSBpbiBvbmUgb2YgdGhlIHNtYWxsLCB6ZXJvLCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggc21hbGwgYW5kIHplcm8gZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9aREEgfCBWODUwX09USEVSX1REQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCB6ZXJvIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIHNwcmludGYgKGJ1ZmYsIG1zZywgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCSAgaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nIChpbmZvLCBidWZmLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgICAgYWJmZCwgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCAwKTsKLQotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGgtPm90aGVyIHw9IFY4NTBfT1RIRVJfRVJST1I7Ci0JCSAgcmV0ID0gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiBoLT5yb290LnUuYy5wCi0JICAgICAgJiYgIXN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24pLCAiQ09NTU9OIikpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIGNvbW1vbik7Ci0JICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgfQotCi0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgInY4NTBfZWxmX2NoZWNrX3JlbG9jcywgZm91bmQgJXMgcmVsb2NhdGlvbiBmb3IgJXMlc1xuIiwKLQkJICAgdjg1MF9lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0ubmFtZSwKLQkJICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIsCi0JCSAgIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pID8gIiwgc3ltYm9sIGlzIGNvbW1vbiIgOiAiIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEluIHRoZSBvbGQgdmVyc2lvbiwgd2hlbiBhbiBlbnRyeSB3YXMgY2hlY2tlZCBvdXQgZnJvbSB0aGUgdGFibGUsCi0gKiBpdCB3YXMgZGVsZXRlZC4gIFRoaXMgcHJvZHVjZWQgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IHdhcyBuZWVkZWQKLSAqIG1vcmUgdGhhbiBvbmNlLCBhcyB0aGUgc2Vjb25kIGF0dGVtcHRlZCByZXRyeSBmYWlsZWQuCi0gKgotICogSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgdGhlIGVudHJ5IGlzIG5vdCBkZWxldGVkLCBpbnN0ZWFkIHdlIHNldAotICogdGhlIGZpZWxkICdmb3VuZCcgdG8gdHJ1ZS4gIElmIGEgc2Vjb25kIGxvb2t1cCBtYXRjaGVzIHRoZSBzYW1lCi0gKiBlbnRyeSwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlIGhpMTZzIHJlbG9jIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZAotICogYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdXBkYXRlZCBhIHNlY29uZCB0aW1lLgotICoKLSAqIFRPRE8gLSBUT0ZJWDogSWYgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIHJlc3RvcmUgMiBkaWZmZXJlbnQKLSAqIGFkZHJlc3NlcyBmcm9tIHRoZSBzYW1lIHRhYmxlIGVudHJ5LCB3aGVyZSB0aGUgZmlyc3QgZ2VuZXJhdGVzIGFuCi0gKiBvdmVyZmxvdywgd2hpbHN0IHRoZSBzZWNvbmQgZG8gbm90LCB0aGVuIHRoaXMgY29kZSB3aWxsIGZhaWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaGkxNnNfbG9jYXRpb24KLXsKLSAgYmZkX3ZtYSAgICAgICBhZGRlbmQ7Ci0gIGJmZF9ieXRlICogICAgYWRkcmVzczsKLSAgdW5zaWduZWQgbG9uZyBjb3VudGVyOwotICBib29sZWFuICAgICAgIGZvdW5kOwotICBzdHJ1Y3QgaGkxNnNfbG9jYXRpb24gKiBuZXh0OwotfQotaGkxNnNfbG9jYXRpb247Ci0KLXN0YXRpYyBoaTE2c19sb2NhdGlvbiAqICBwcmV2aW91c19oaTE2czsKLXN0YXRpYyBoaTE2c19sb2NhdGlvbiAqICBmcmVlX2hpMTZzOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgIGhpMTZzX2NvdW50ZXI7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9oaTE2c19yZWxvYyAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGJmZF92bWEgICAgYWRkZW5kOwotICAgICBiZmRfYnl0ZSAqIGFkZHJlc3M7Ci17Ci0gIGhpMTZzX2xvY2F0aW9uICogZW50cnkgPSBOVUxMOwotICAKLSAgLyogRmluZCBhIGZyZWUgc3RydWN0dXJlLiAgKi8KLSAgaWYgKGZyZWVfaGkxNnMgPT0gTlVMTCkKLSAgICBmcmVlX2hpMTZzID0gKGhpMTZzX2xvY2F0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKiBmcmVlX2hpMTZzKSk7Ci0KLSAgZW50cnkgICAgICA9IGZyZWVfaGkxNnM7Ci0gIGZyZWVfaGkxNnMgPSBmcmVlX2hpMTZzLT5uZXh0OwotICAKLSAgZW50cnktPmFkZGVuZCAgPSBhZGRlbmQ7Ci0gIGVudHJ5LT5hZGRyZXNzID0gYWRkcmVzczsKLSAgZW50cnktPmNvdW50ZXIgPSBoaTE2c19jb3VudGVyICsrOwotICBlbnRyeS0+Zm91bmQgICA9IGZhbHNlOwotICBlbnRyeS0+bmV4dCAgICA9IHByZXZpb3VzX2hpMTZzOwotICBwcmV2aW91c19oaTE2cyA9IGVudHJ5OwotICAKLSAgLyogQ29wZSB3aXRoIHdyYXAgYXJvdW5kIG9mIG91ciBjb3VudGVyLiAgKi8KLSAgaWYgKGhpMTZzX2NvdW50ZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBYWFggLSBBc3N1bWUgdGhhdCBhbGwgY291bnRlciBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZWlyIGxvdyAxNiBiaXRzLiAgKi8KLSAgICAgIGZvciAoZW50cnkgPSBwcmV2aW91c19oaTE2czsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQllbnRyeS0+Y291bnRlciAmPSAweGZmZmY7Ci0KLSAgICAgIGhpMTZzX2NvdW50ZXIgPSAweDEwMDAwOwotICAgIH0KLSAgCi0gIHJldHVybjsKLX0KLQotc3RhdGljIGJmZF9ieXRlICoKLWZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyAoYWRkZW5kLCBhbHJlYWR5X2ZvdW5kKQotICAgICBiZmRfdm1hICAgYWRkZW5kOwotICAgICBib29sZWFuICogYWxyZWFkeV9mb3VuZDsKLXsKLSAgaGkxNnNfbG9jYXRpb24gKiBtYXRjaCA9IE5VTEw7Ci0gIGhpMTZzX2xvY2F0aW9uICogZW50cnk7Ci0gIGhpMTZzX2xvY2F0aW9uICogcHJldmlvdXMgPSBOVUxMOwotICBoaTE2c19sb2NhdGlvbiAqIHByZXY7Ci0gIGJmZF9ieXRlICogICAgICAgYWRkcjsKLSAgCi0gIC8qIFNlYXJjaCB0aGUgdGFibGUuICBSZWNvcmQgdGhlIG1vc3QgcmVjZW50IGVudHJ5IHRoYXQgbWF0Y2hlcy4gICovCi0gIGZvciAoZW50cnkgPSBwcmV2aW91c19oaTE2czsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgaWYgKGVudHJ5LT5hZGRlbmQgPT0gYWRkZW5kCi0JICAmJiAobWF0Y2ggPT0gTlVMTCB8fCBtYXRjaC0+Y291bnRlciA8IGVudHJ5LT5jb3VudGVyKSkKLQl7Ci0JICBwcmV2aW91cyA9IHByZXY7Ci0JICBtYXRjaCAgICA9IGVudHJ5OwotCX0KLSAgICAgIAotICAgICAgcHJldiA9IGVudHJ5OwotICAgIH0KLQotICBpZiAobWF0Y2ggPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFeHRyYWN0IHRoZSBhZGRyZXNzLiAgKi8KLSAgYWRkciA9IG1hdGNoLT5hZGRyZXNzOwotCi0gIC8qIFJlbWViZXIgaWYgdGhpcyBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYmVmb3JlLiAgKi8KLSAgaWYgKGFscmVhZHlfZm91bmQpCi0gICAgKiBhbHJlYWR5X2ZvdW5kID0gbWF0Y2gtPmZvdW5kOwotCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGVudHJ5IGhhcyBub3cgYmVlbiB1c2VkLiAgKi8KLSAgbWF0Y2gtPmZvdW5kID0gdHJ1ZTsKLSAgCi0gIHJldHVybiBhZGRyOwotfSAgICAgCi0KLS8qIEZJWE1FOiAgVGhlIGNvZGUgaGVyZSBwcm9iYWJseSBvdWdodCB0byBiZSByZW1vdmVkIGFuZCB0aGUgY29kZSBpbiByZWxvYy5jCi0gICBhbGxvd2VkIHRvIGRvIGl0cyAgc3R1ZmYgaW5zdGVhZC4gIEF0IGxlYXN0IGZvciBtb3N0IG9mIHRoZSByZWxvY3MsIGFud3lheS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJfdHlwZSwgYWRkZW5kLCBhZGRyZXNzKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGludCAgICAgICAgcl90eXBlOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF9zaWduZWRfdm1hIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgLyogZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgdHlwZSAlZCBub3QgU1VQUE9SVEVEXG4iLCByX3R5cGUgKTsgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMzI6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgotICAgICAgaWYgKHNhZGRlbmQgPiAweDFmZmZmZiB8fCBzYWRkZW5kIDwgLTB4MjAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGluc24gJj0gfjB4ZmZmZTAwM2Y7Ci0gICAgICBpbnNuIHw9ICgoKGFkZGVuZCAmIDB4ZmZmZSkgPDwgMTYpIHwgKChhZGRlbmQgJiAweDNmMDAwMCkgPj4gMTYpKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzlfUENSRUw6Ci0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmYgfHwgc2FkZGVuZCA8IC0weDEwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoKGFkZGVuZCAlIDIpICE9IDApCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBpbnNuICY9IH4gMHhmODcwOwotICAgICAgaW5zbiB8PSAoKGFkZGVuZCAmIDB4MWYwKSA8PCA3KSB8ICgoYWRkZW5kICYgMHgwZSkgPDwgMyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgICBhZGRlbmQgKz0gKGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpIDw8IDE2KTsKLSAgICAgIGFkZGVuZCA9IChhZGRlbmQgPj4gMTYpOwotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhpcyByZWxvY2F0aW9uIHRvb2sgcGxhY2UuICAqLwotICAgICAgcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0KLSAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOwotICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNikgKyAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCk7Ci0gICAgICAKLSAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBjYW5ub3Qgb3ZlcmZsb3cuICovCi0gICAgICBpZiAoYWRkZW5kID4gMHg3ZmZmKQotCWFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0xPMTY6Ci0gICAgICAvKiBDYWxjdWxhdGUgdGhlIHN1bSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlCi0JIGFkZGVuZCBhbmQgY2hlY2sgZm9yIG92ZXJmbG93IGZyb20gdGhlIGxvdyAxNiBiaXRzIGludG8gdGhlIGhpZ2gKLQkgMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIgaGFzIGFscmVhZHkgZG9uZSBzb21lIG9mIHRoaXM6ICBJZiB0aGUKLQkgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBoYXMgaXRzIDE1dGggYml0IHNldCwgKGNvdW50aW5nCi0JIGZyb20gemVybykgdGhlbiB0aGUgYXNzZW1ibGVyIHdpbGwgaGF2ZSBhZGRlZCAxIHRvIHRoZSB2YWx1ZQotCSBzdG9yZWQgaW4gdGhlIGFzc29jaWF0ZWQgSEkxNlMgcmVsb2MuICBTbyBmb3IgZXhhbXBsZSwgdGhlc2UKLQkgcmVsb2NhdGlvbnM6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKSwgcjEsIHIxCi0KLQkgd2lsbCBzdG9yZSAwIGluIHRoZSB2YWx1ZSBmaWVsZHMgZm9yIHRoZSBNT1ZISSBhbmQgTU9WRUEgaW5zdHJ1Y3Rpb25zCi0JIGFuZCBhZGRlbmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBvZiBmcmVkLCBidXQgZm9yIHRoZXNlIGluc3RydWN0aW9uczoKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIHdpbGwgYmUgMHgxMiBhbmQgdGhlIHZhbHVlCi0JIHN0b3JlZCBpbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDM0NTYuICBJZiBob3dldmVyIHRoZQotCSBpbnN0cnVjdGlvbnMgd2VyZToKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEwZmZmZiksIHIxLCByMQotCi0JIHRoZW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd291bGQgYmUgMHgxMSAobm90Ci0JIDB4MTApIGFuZCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweGZmZmYuCi0JIFRodXMgKGFzc3VtaW5nIGZvciB0aGUgbW9tZW50IHRoYXQgdGhlIGFkZGVuZCBpcyAwKSwgYXQgcnVuIHRpbWUgdGhlCi0JIE1PVkhJIGluc3RydWN0aW9uIGxvYWRzIDB4MTEwMDAwIGludG8gcjEsIHRoZW4gdGhlIE1PVkVBIGluc3RydWN0aW9uCi0JIGFkZHMgMHhmZmZmZmZmZiAoc2lnbiBleHRlbnNpb24hKSBwcm9kdWNpbmcgMHgxMGZmZmYuICBTaW1pbGFybHkgaWYKLQkgdGhlIGluc3RydWN0aW9ucyB3ZXJlOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCAtIDEpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkIC0gMSksIHIxLCByMQotCi0JIHRoZW4gMCBpcyBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIGFuZCAtMSBpcyBzdG9yZWQgaW4gdGhlCi0JIE1PVkVBIGluc3RydWN0aW9uLgotCi0JIE92ZXJmbG93IGNhbiBvY2N1ciBpZiB0aGUgYWRkaXRpb24gb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUKLQkgaW5zdHJ1Y3Rpb24gcGx1cyB0aGUgYWRkZW5kIHNldHMgdGhlIDE1dGggYml0IHdoZW4gYmVmb3JlIGl0IHdhcyBjbGVhci4KLQkgVGhpcyBpcyBiZWNhdXNlIHRoZSAxNXRoIGJpdCB3aWxsIGJlIHNpZ24gZXh0ZW5kZWQgaW50byB0aGUgaGlnaCBwYXJ0LAotCSB0aHVzIHJlZHVjaW5nIGl0cyB2YWx1ZSBieSBvbmUsIGJ1dCBzaW5jZSB0aGUgMTV0aCBiaXQgd2FzIG9yaWdpbmFsbHkKLQkgY2xlYXIsIHRoZSBhc3NlbWJsZXIgd2lsbCBub3QgaGF2ZSBhZGRlZCAxIHRvIHRoZSBwcmV2aW91cyBISTE2UyByZWxvYwotCSB0byBjb21wZW5zYXRlIGZvciB0aGlzIGVmZmVjdC4gIEZvciBleGFtcGxlOgotCi0JICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMjM0NTYpLCByMCwgcjEKLQkgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIFRoZSB2YWx1ZSBzdG9yZWQgaW4gSEkxNlMgcmVsb2MgaXMgMHgxMiwgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgotCSByZWxvYyBpcyAweDM0NTYuICBJZiB3ZSBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4MDAwMDcwMDAKLQkgdGhlbiB0aGUgcmVsb2NhdGlvbnMgYmVjb21lOgotCi0JICAgSEkxNlM6IDB4MDAxMiArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTIKLQkgICBMTzE2OiAgMHgzNDU2ICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHhhNDU2Ci0KLQkgYnV0IHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbidzIHZhbHVlCi0JIGlzIHNpZ25lZCBleHRlbmRlZCwgc28gdGhlIHN1bSBiZWNvbWVzOgotCi0JICAgICAgMHgwMDEyMDAwMAotCSAgICArIDB4ZmZmZmE0NTYKLQkgICAgLS0tLS0tLS0tLS0tCi0JICAgICAgMHgwMDExYTQ1NiAgICBidXQgJ2ZyZWQgKyAweDEyMzQ1NicgPSAweDAwMTJhNDU2Ci0KLQkgTm90ZSB0aGF0IGlmIHRoZSAxNXRoIGJpdCB3YXMgc2V0IGluIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIExPMTYKLQkgcmVsb2MsIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmc6Ci0KLQkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCi0KLQkgICAgSEkxNlM6ICAweDAwMTEgKyAoMHgwMDAwNzAwMCA+PiAxNikgICAgPSAweDExCi0JICAgIExPMTY6ICAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmCi0KLQkgICAgICAweDAwMTEwMDAwCi0JICAgICsgMHgwMDAwNmZmZgotCSAgICAtLS0tLS0tLS0tLS0KLQkgICAgICAweDAwMTE2ZmZmICA9IGZyZWQgKyAweDEwZmZmZiA9IDB4NzAwMCArIDB4MTBmZmZmCi0KLQkgCi0JIE92ZXJmbG93IGNhbiBhbHNvIG9jY3VyIGlmIHRoZSBjb21wdXRhdGlvbiBjYXJyaWVzIGludG8gdGhlIDE2dGggYml0Ci0JIGFuZCBpdCBhbHNvIHJlc3VsdHMgaW4gdGhlIDE1dGggYml0IGhhdmluZyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgMTV0aAotCSBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLiAgIFdoYXQgaGFwcGVucyBpcyB0aGF0IHRoZSBISTE2UyByZWxvYwotCSB3aWxsIGhhdmUgYWxyZWFkeSBleGFtaW5lZCB0aGUgMTV0aCBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZAotCSBhZGRlZCAxIHRvIHRoZSBoaWdoIHBhcnQgaWYgdGhlIGJpdCBpcyBzZXQuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUKLQkgc2lnbiBleHRlbnNpb24gb2YgMTV0aCBiaXQgb2YgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uICBCdXQgbm93Ci0JIHRoZXJlIGlzIGEgY2FycnkgaW50byB0aGUgMTZ0aCBiaXQsIGFuZCB0aGlzIGhhcyBub3QgYmVlbiBhbGxvd2VkIGZvci4KLQotCSBTbywgZm9yIGV4YW1wbGUgaWYgZnJlZCBpcyBhdCBhZGRyZXNzIDB4ZjAwMDoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHhmZmZmKSwgcjAsIHIxICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDEKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHhlZmZmICAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMTAwMDAKLQkgICArIDB4ZmZmZmVmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMGVmZmYgICBidXQgJ2ZyZWQgKyAweGZmZmYnID0gMHgwMDAxZWZmZgotCi0JIFNpbWlsYXJseSwgaWYgdGhlIDE1dGggYml0IHJlbWFpbnMgY2xlYXIsIGJ1dCBvdmVyZmxvdyBvY2N1cnMgaW50bwotCSB0aGUgMTZ0aCBiaXQgdGhlbiAoYXNzdW1pbmcgdGhlIGFkZHJlc3Mgb2YgZnJlZCBpcyAweGYwMDApOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweDcwMDApLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGYwMDAgPj4gMTYpICAgID0gMHgwMDAwCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmMDAwICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMDAwMDAKLQkgICArIDB4MDAwMDZmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICBidXQgJ2ZyZWQgKyAweDcwMDAnID0gMHgwMDAxNmZmZgotCSAgIAotCSBOb3RlIC0gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaWYgYSBjYXJyeSBvY2N1cnMsIGFuZCB0aGUKLQkgMTV0aCBiaXQgY2hhbmdlcyBpdHMgdmFsdWUgZnJvbSBiZWluZyBzZXQgdG8gYmVpbmcgY2xlYXIsIGFzIHRoZSBISTE2UwotCSByZWxvYyB3aWxsIGhhdmUgYWxyZWFkeSBhZGRlZCBpbiAxIHRvIHRoZSBoaWdoIHBhcnQgZm9yIHVzOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwNzAwMCA+PiAxNikKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAxMDAwMAotCSAgICsgMHgwMDAwNmZmZiAgIChiaXQgMTUgbm90IHNldCwgc28gdGhlIHRvcCBoYWxmIGlzIHplcm8pCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDE2ZmZmICAgd2hpY2ggaXMgcmlnaHQgKGFzc3VtaW5nIHRoYXQgZnJlZCBpcyBhdCAweDcwMDApCi0KLQkgYnV0IGlmIHRoZSAxNXRoIGJpdCBnb2VzIGZyb20gYmVpbmcgY2xlYXIgdG8gYmVpbmcgc2V0LCB0aGVuIHdlIG11c3QKLQkgb25jZSBhZ2FpbiBoYW5kbGUgb3ZlcmZsb3c6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGZmZmYgPj4gMTYpCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmZmZmICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2KQotCi0JICAgICAweDAwMDAwMDAwCi0JICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICB3aGljaCBpcyB3cm9uZyAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4ZmZmZikKLQkgKi8KLQotICAgICAgewotCWxvbmcgcmVzdWx0OwotCi0JaW5zbiAgID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0JcmVzdWx0ID0gaW5zbiArIGFkZGVuZDsKLQotI2RlZmluZSBCSVQxNV9TRVQoeCkgKCh4KSAmIDB4ODAwMCkKLSNkZWZpbmUgT1ZFUkZMT1dTKGEsaSkgKCgoKGEpICYgMHhmZmZmKSArIChpKSkgPiAweGZmZmYpCi0JCi0JaWYgKChCSVQxNV9TRVQgKHJlc3VsdCkgJiYgISBCSVQxNV9TRVQgKGFkZGVuZCkpCi0JICAgIHx8IChPVkVSRkxPV1MgKGFkZGVuZCwgaW5zbikKLQkJJiYgKCghIEJJVDE1X1NFVCAoaW5zbikpIHx8IChCSVQxNV9TRVQgKGFkZGVuZCkpKSkpCi0JICB7Ci0JICAgIGJvb2xlYW4gYWxyZWFkeV91cGRhdGVkOwotCSAgICBiZmRfYnl0ZSAqIGhpMTZzX2FkZHJlc3MgPSBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLQkgICAgICAoYWRkZW5kLCAmIGFscmVhZHlfdXBkYXRlZCk7Ci0JICAgIAotCSAgICAvKiBBbWVuZCB0aGUgbWF0Y2hpbmcgSEkxNl9TIHJlbG9jYXRpb24uICAqLwotCSAgICBpZiAoaGkxNnNfYWRkcmVzcyAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKCEgYWxyZWFkeV91cGRhdGVkKQotCQkgIHsKLQkJICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaTE2c19hZGRyZXNzKTsKLQkJICAgIGluc24gKz0gMTsKLQkJICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpMTZzX2FkZHJlc3MpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIikpOwotCQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkKLQkvKiBEbyBub3QgY29tcGxhaW4gaWYgdmFsdWUgaGFzIHRvcCBiaXQgc2V0LCBhcyB0aGlzIGhhcyBiZWVuIGFudGljaXBhdGVkLiAgKi8KLQlpbnNuID0gcmVzdWx0ICYgMHhmZmZmOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1Y4NTBfODoKLSAgICAgIGFkZGVuZCArPSAoY2hhcikgYmZkX2dldF84IChhYmZkLCBhZGRyZXNzKTsKLQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0gICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZmZmYgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMTY6Ci0KLSAgICAgIC8qIGRyb3AgdGhyb3VnaCAqLyAgICAgICAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotICAgICAgYWRkZW5kICs9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoaW5zbiAmIDB4ZmZmZSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmUgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuID0gKGFkZGVuZCAmIH4xKSB8IChpbnNuICYgMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2UpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmYyB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMykKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODE7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IGluc24gJiAweDdmOwotCQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHhmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4MWUgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSBpbnNuICYgMHhmOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmUwMDAwKSA+PiAxNikgKyAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZiB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4MDAwMWZmZGY7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgJiAxKSA8PCA1OwotICAgICAgaW5zbiB8PSAoYWRkZW5kICYgfjEpIDw8IDE2OwotICAgICAgCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4M2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgfQotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBJbnNlcnQgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9yZWxvYyAoYWJmZCwgcmVsb2MsIHN5bWJvbCwgZGF0YSwgaXNlY3Rpb24sIG9iZmQsIGVycikKLSAgICAgYmZkICogICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogICByZWxvYzsKLSAgICAgYXN5bWJvbCAqICAgc3ltYm9sOwotICAgICBQVFIgICAgICAgICBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogIGlzZWN0aW9uOwotICAgICBiZmQgKiAgICAgICBvYmZkOwotICAgICBjaGFyICoqICAgICBlcnIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uOwotICAKLSAgLyogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IEJGRCwKLSAgICAgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGEgc2VjdGlvbiBuYW1lICh3aGljaCBpcyBvbmx5IGRlZmluZWQgYXQgZmluYWwgbGluayB0aW1lKSwKLSAgICAgYW5kIGVpdGhlciB3ZSBhcmUgbm90IHB1dHRpbmcgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICAgICAgb3IgdGhlIGFkZGVuZCBpcyB6ZXJvLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB0aGVuIGp1c3QgZml4dXAgdGhlIGFkZHJlc3MgYW5kIHJldHVybi4gICovCi0gIGlmIChvYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvYy0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRyZXNzICs9IGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0jaWYgMCAgCi0gIGVsc2UgaWYgKG9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAKLSAgLyogQ2F0Y2ggcmVsb2NzIGludm9sdmluZyB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBXZSBoYW5kbGUgZmluYWwgbGlua2luZyBvZiBzb21lIHJlbG9jcyBvdXJzZWx2ZXMuICAqLwotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2MtPmFkZHJlc3MgPiBpc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotICAKLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0gIAotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlICsgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jLT5hZGRlbmQ7Ci0gIAotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0JIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotICAgICAgcmVsb2NhdGlvbiAtPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgCi0gICAgICAvKiBEZWFsIHdpdGggcGNyZWxfb2Zmc2V0ICovCi0gICAgICByZWxvY2F0aW9uIC09IHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICByZWxvYy0+YWRkZW5kID0gcmVsb2NhdGlvbjsJCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogIG5hbWU7Ci17Ci0gIHJldHVybiAoICAgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICcuJykpCi0JICB8fCAobmFtZVswXSA9PSAnXycgJiYgIG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ0wnICYmIG5hbWVbM10gPT0gJ18nKSk7Ci19Ci0KLQwKLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSAgICBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICogICAgICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIHZhbHVlOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgICAgIGlzX2xvY2FsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHJfdHlwZSAgID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICogICAgIGhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgLyogQWRqdXN0IHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24uICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIG9mZnNldCk7Ci0KLSAgICAgIC8qIElmIHRoZSBzaWduIGV4dGVuc2lvbiB3aWxsIGNvcnJ1cHQgdGhlIHZhbHVlIHRoZW4gd2UgaGF2ZSBvdmVyZmxvd2VkLiAgKi8KLSAgICAgIGlmICgoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHgwKSAmJiAoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHhmZjAwMDAwMCkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgdmFsdWUgPSBTRVhUMjQgKHZhbHVlKTsgIC8qIE9ubHkgdGhlIGJvdHRvbSAyNCBiaXRzIG9mIHRoZSBQQyBhcmUgdmFsaWQgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgY2FzZSBSX1Y4NTBfTE8xNjoKLSAgICBjYXNlIFJfVjg1MF8xNjoKLSAgICBjYXNlIFJfVjg1MF8zMjoKLSAgICBjYXNlIFJfVjg1MF84OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgkKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICBpZiAoc3ltX3NlYyA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0gICAgICB2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGdwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotCWlmIChzeW1fc2VjID09IE5VTEwpCi0JICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIAotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotCi0JZ3AgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoZ3AgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBlcDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0JCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2VwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2VwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fZXAgY291bGQgbm90IGJlIGZvdW5kLiAqLwotCi0JZXAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gZXA7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCQotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19jdGJwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2N0YnAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuICovCi0KLQljdGJwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl2YWx1ZSAtPSBjdGJwOwotICAgICAgfQotICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsKLQotCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoY3RicCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgfQotICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfTk9ORToKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogUGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHJldHVybiB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcl90eXBlLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOyAKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gVjg1MCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICBpZiAoc3ltX2hhc2hlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCShpbmZvLCAibm8gaGFzaCB0YWJsZSBhdmFpbGFibGUiLCBOVUxMLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIDApOwotCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogUmVzZXQgdGhlIGxpc3Qgb2YgcmVtZW1iZXJlZCBISTE2UyByZWxvY3MgdG8gZW1wdHkuICAqLwotICBmcmVlX2hpMTZzICAgICA9IHByZXZpb3VzX2hpMTZzOwotICBwcmV2aW91c19oaTE2cyA9IE5VTEw7Ci0gIGhpMTZzX2NvdW50ZXIgID0gMDsKLSAgCi0gIHJlbCAgICA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfVjg1MF9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1Y4NTBfR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGhvd3RvID0gdjg1MF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotI2lmIDAKLQkgIHsKLQkgICAgY2hhciAqIG5hbWU7Ci0JICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8bm9uZT4iIDogbmFtZTsKLWZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAotCSBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKLQkgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOwotCSAgfQotI2VuZGlmCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0jaWYgMAotZnByaW50ZiAoc3RkZXJyLCAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYudmFsdWUsIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgdGhlIGFkZGVuZCwgYnV0IHRoZSBDT0ZGIHJlbG9jYXRpb25zCi0gICAgICAgICBkb24ndC4gICovCi0gICAgICByID0gdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCWluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3RoZXI6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2NvbnRpbnVlOgotCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogTm8gZ290IGFuZCBwbHQgZW50cmllcyBmb3Igdjg1MC1lbGYgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi12ODUwX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6ICAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIDApOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZSk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRUFfQVJDSDogKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIGJmZF9tYWNoX3Y4NTBlYSk7IGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0b3JlIHRoZSBtYWNoaW5lIG51bWJlciBpbiB0aGUgZmxhZ3MgZmllbGQuICAqLwotc3RhdGljIHZvaWQKLXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOiB2YWwgPSBFX1Y4NTBfQVJDSDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZTogIHZhbCA9IEVfVjg1MEVfQVJDSDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IHZhbCA9IEVfVjg1MEVBX0FSQ0g7ICBicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1Y4NTBfQVJDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIFY4NTAgc3BlY2lmaWMgZmlsZSBmbGFncy4gKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqICAgIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCi0JCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKLQotICBlbGZfZ3AgKG9iZmQpID0gZWxmX2dwIChpYmZkKTsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgdGhlbiBkbyBub3QKLQkgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKLQkgaW5zdGVhZCBhbGxvdyBmdXR1cmUgbWVyZ2VzIHRvIGRvIHRoaXMuICBJZiBubyBmdXR1cmUKLQkgbWVyZ2VzIGV2ZXIgc2V0IHRoZXNlIGZsYWdzIHRoZW4gdGhleSB3aWxsIHJldGFpbiB0aGVpcgotCSB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCi0JIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBpZiAoYmZkX2dldF9hcmNoX2luZm8gKGliZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLQkgICYmIGJmZF9nZXRfYXJjaF9pbmZvIChvYmZkKS0+dGhlX2RlZmF1bHQpCi0JewotCSAgcmV0dXJuIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9WODUwX0FSQ0gpICE9IChvdXRfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0gICAgICAmJiAoaW5fZmxhZ3MgJiBFRl9WODUwX0FSQ0gpICE9IEVfVjg1MF9BUkNIKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgUFRSICAgICBwdHI7Ci17Ci0gIEZJTEUgKiBmaWxlID0gKEZJTEUgKikgcHRyOwotICAKLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLSAgCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0gIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJWx4OiAiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotICAKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfVjg1MF9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZSBhcmNoaXRlY3R1cmUiKSk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRUFfQVJDSDogZnByaW50ZiAoZmlsZSwgXygidjg1MGVhIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgfQotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFY4NTAgRUxGIHVzZXMgZm91ciBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXJzIGFyZSBmb3IgKHNtYWxsKSBvYmplY3RzIGluIG9uZSBvZiB0aGUgc3BlY2lhbCBkYXRhIGFyZWFzOgotICAgc21hbGwsIHRpbnkgYW5kIHplcm8uICBBbGwgdGhlIG9iamVjdHMgYXJlIGtlcHQgdG9nZXRoZXIsIGFuZCB0aGVuCi0gICByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcmVnaXN0ZXIsIHRoZSBlcCByZWdpc3RlciBvciB0aGUgcjAgcmVnaXN0ZXIKLSAgIHJlc3BlY3RpdmVseSwgd2hpY2ggeWllbGRzIHNtYWxsZXIsIGZhc3RlciBhc3NlbWJsZXIgY29kZS4gIFRoaXMKLSAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfc2NvbV9zeW1ib2xfcHRyOwotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHI7Ci1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfemNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3pjb21fc3ltYm9sX3B0cjsKLQotCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBoZHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLSAgICAgaW50ICogICAgICAgICAgICAgICAgIHJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1NDT01NT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGNvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1RDT01NT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuemNvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1pDT01NT047Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIHRoZSBzcGVjaWFsIFY4NTAgc2VjdGlvbiBudW1iZXJzIHRoYXQgYSBzeW1ib2wgbWF5IHVzZS4gICovCi0KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICogICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiBhc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKiBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotICAKLSAgaW5kZXggPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKLSAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KLSAgICAgCi0gICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KLSAgCi0gIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKLSAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1pDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotICAKLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi5zY29tbW9uIjsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT04gfCBTRUNfQUxMT0MgfCBTRUNfREFUQTsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi5zY29tbW9uIjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1RDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfdGNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSB0Y29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi50Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT047Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIudGNvbW1vbiI7Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fVjg1MF9aQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3pjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgemNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuemNvbW1vbiI7Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnpjb21tb24iOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCB2ODUwIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotICAgICBjb25zdCBjaGFyICoqICAgICAgICAgICAgbmFtZXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgKiAgICAgICAgICAgICAgIGZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgICAgc2VjcDsKLSAgICAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgIHZhbHA7Ci17Ci0gIGludCBpbmRleCA9IHN5bS0+c3Rfc2huZHg7Ci0gIAotICAvKiBJZiB0aGUgc2VjdGlvbiBpbmRleCBpcyBhbiAib3JkaW5hcnkiIGluZGV4LCB0aGVuIGl0IG1heQotICAgICByZWZlciB0byBhIHY4NTAgc3BlY2lmaWMgc2VjdGlvbiBjcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0gICAgIENoZWNrIHRoZSBzZWN0aW9uJ3MgdHlwZSBhbmQgY2hhbmdlIHRoZSBpbmRleCBpdCBtYXRjaGVzLgotICAgICAKLSAgICAgRklYTUU6IFNob3VsZCB3ZSBhbHRlciB0aGUgc3Rfc2huZHggZmllbGQgYXMgd2VsbCA/ICAqLwotICAKLSAgaWYgKGluZGV4IDwgZWxmX2VsZmhlYWRlcihhYmZkKVswXS5lX3NobnVtKQotICAgIHN3aXRjaCAoZWxmX2VsZnNlY3Rpb25zKGFiZmQpW2luZGV4XS0+c2hfdHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1NDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9UQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICBzd2l0Y2ggKGluZGV4KQotICAgIHsKLSAgICBjYXNlIFNITl9WODUwX1NDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfVENPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnRjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9aQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuemNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NJR05PUkVEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBpbnB1dF9zZWMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgc3ltOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlYzsKLXsKLSAgLyogSWYgd2Ugc2VlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaW1wbGllcyBhIHJlbG9jYXRhYmxlIGxpbmssIHRoZW4KLSAgICAgaWYgYSBzeW1ib2wgd2FzIGluIGEgc3BlY2lhbCBjb21tb24gc2VjdGlvbiBpbiBhbiBpbnB1dCBmaWxlLCBtYXJrCi0gICAgIGl0IGFzIGEgc3BlY2lhbCBjb21tb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnNjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9TQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIudGNvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1RDT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi56Y29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICogaGRyOwotICAgICBjaGFyICogICAgICAgICAgICAgIG5hbWU7Ci17Ci0gIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0Ci0gICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgKi8KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLSAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sCi0JCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkJCQkgICBoZHItPmJmZF9zZWN0aW9uKQotCQkJCSAgICB8IFNFQ19JU19DT01NT04pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBWODUwIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICBzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKiBuYW1lOwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiLnNjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1NDT01NT047Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIudGNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfVENPTU1PTjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi56Y29tbW9uIikgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9aQ09NTU9OOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJCWJmZF9lbGYzMl92ODUwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCQkiZWxmMzItdjg1MCIKLSNkZWZpbmUgRUxGX0FSQ0gJCQkJYmZkX2FyY2hfdjg1MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQkJRU1fQ1lHTlVTX1Y4NTAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJCTB4MTAwMAotCQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCQl2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkJdjg1MF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgCXY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCQl2ODUwX2VsZl9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIAl2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCQl2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayAJdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJCXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJCXY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgICAgIHY4NTBfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUJdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQl2ODUwX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQl2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyCQkJJ18nCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi5jIGIvYmZkL2VsZjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjI5NjkuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBFTEYgMzItYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUJCTMyCi0KLQotI2luY2x1ZGUgImVsZmNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1hbHBoYS5jIGIvYmZkL2VsZjY0LWFscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDgzZmEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEwICswLDAgQEAKLS8qIEFscGhhIHNwZWNpZmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1Pi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXZSBuZWVkIGEgcHVibGlzaGVkIEFCSSBzcGVjIGZvciB0aGlzLiAgVW50aWwgb25lIGNvbWVzIG91dCwgZG9uJ3QKLSAgIGFzc3VtZSB0aGlzJ2xsIHJlbWFpbiB1bmNoYW5nZWQgZm9yZXZlci4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLQotI2RlZmluZSBBTFBIQUVDT0ZGCi0KLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLSNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCi0jZGVmaW5lIE5PX0NPRkZfTElORU5PUwotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgTmVlZGVkIGZvciB0aGUgZGVidWcgaW5mb3JtYXRpb24uICovCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqIGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUygoYmZkICopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19uaWwKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfYmFkCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcAotICBQQVJBTVMoKGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBFbGY2NF9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb2JqZWN0X3AKLSAgUEFSQU1TKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KLSAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUygoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5OwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX291dHB1dF9leHRzeW0KLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMKLSAgUEFSQU1TKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2FscGhhX21lcmdlX2dvdHMKLSAgUEFSQU1TKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcwotICBQQVJBTVMgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKLQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmFsX2xpbmsKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqIGVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzCi0gIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsIGludCkpOwotCi0MCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLQotICAvKiBDdW11bGF0aXZlIGZsYWdzIGZvciBhbGwgdGhlIC5nb3QgZW50cmllcy4gICovCi0gIGludCBmbGFnczsKLQotICAvKiBDb250ZXh0cyAoTElUVVNFKSBpbiB3aGljaCBhIGxpdGVyYWwgd2FzIHJlZmVyZW5jZWQuICAqLwotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIgMHgwMQotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSAgMHgwMgotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0JZVEUgMHgwNAotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMgMHgwOAotCi0gIC8qIFVzZWQgdG8gaW1wbGVtZW50IG11bHRpcGxlIC5nb3Qgc3Vic2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKm5leHQ7Ci0KLSAgICAvKiB3aGljaCAuZ290IHN1YnNlY3Rpb24/ICAqLwotICAgIGJmZCAqZ290b2JqOwotCi0gICAgLyogdGhlIGFkZGVuZCBpbiBlZmZlY3QgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgLyogdGhlIC5nb3Qgb2Zmc2V0IGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICBpbnQgZ290X29mZnNldDsKLQotICAgIGludCBmbGFnczsKLQotICAgIC8qIEFuIGFkZGl0aW9uYWwgZmxhZy4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUgMHgxMAotCi0gICAgaW50IHVzZV9jb3VudDsKLSAgfSAqZ290X2VudHJpZXM7Ci0KLSAgLyogdXNlZCB0byBjb3VudCBub24tZ290LCBub24tcGx0IHJlbG9jYXRpb25zIGZvciBkZWxheWVkIHNpemluZwotICAgICBvZiByZWxvY2F0aW9uIHNlY3Rpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5yZWxvYyBzZWN0aW9uPyAqLwotICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgLyogd2hhdCBraW5kIG9mIHJlbG9jYXRpb24/ICovCi0gICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLQotICAgIC8qIGhvdyBtYW55IGRpZCB3ZSBmaW5kPyAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICB9ICpyZWxvY19lbnRyaWVzOwotfTsKLQotLyogQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgaGVhZCBvZiBhIGxpc3Qgb2YgLmdvdCBzdWJzZWN0aW9ucyBsaW5rZWQgdGhyb3VnaAotICAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdF9saW5rX25leHQuICAqLwotICBiZmQgKmdvdF9saXN0OwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdldCB0aGUgb2JqZWN0J3Mgc3ltYm9scyBhcyBvdXIgb3duIGVudHJ5IHR5cGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKillbGZfc3ltX2hhc2hlcyhhYmZkKSkKLQotLyogU2hvdWxkIHdlIGRvIGR5bmFtaWMgdGhpbmdzIHRvIHRoaXMgc3ltYm9sPyAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcChoLCBpbmZvKSAJCQkJXAotICAoKCgoaW5mbyktPnNoYXJlZCAmJiAhKGluZm8pLT5zeW1ib2xpYykJCQkJXAotICAgIHx8ICgoKGgpLT5lbGZfbGlua19oYXNoX2ZsYWdzCQkJCQlcCi0JICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkJXAotICAgICAgICA9PSAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsJCQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQkJCQlcCi0gICAmJiAoaCktPmR5bmluZHggIT0gLTEpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgICAgcmV0LT5nb3RfZW50cmllcyA9IE5VTEw7Ci0gICAgICByZXQtPnJlbG9jX2VudHJpZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGY2NF9hbHBoYV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0MCi0vKiBXZSBoYXZlIHNvbWUgcHJpdmF0ZSBmaWVsZHMgaGFuZ2luZyBvZmYgb2YgdGhlIGVsZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YQotewotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSByb290OwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGVzZSBhcmUgdGhlIGdvdCBlbnRyaWVzIGZvciB0aGF0IG9iamVjdCdzCi0gICAgIGxvY2FsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKiBsb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgaW5wdXQgZmlsZSwgdGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgZ290IHRoYXQKLSAgICAgdGhpcyBpbnB1dCBmaWxlIHVzZXMuICAqLwotICBiZmQgKmdvdG9iajsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGlua2VkIGxpc3QgdGhyb3VnaCB0aGUgb2JqZWN0cyB1c2luZyB0aGlzIGdvdCAqLwotICBiZmQgKmluX2dvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBhIGxpbmsgdG8gdGhlIG5leHQgZ290IHN1YnNlZ21lbnQuICAqLwotICBiZmQgKmdvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpnb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBpdCdzIHRvdGFsIG51bWJlciBvZiAqZW50cmllcyouICAqLwotICBpbnQgdG90YWxfZ290X2VudHJpZXM7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIgb2YgKmVudHJpZXMqIHJlcXVpcmVkCi0gICAgIHRvIGhvbGQgYWxsIG9mIHRoZSBtZW1iZXIgb2JqZWN0J3MgbG9jYWwgZ290LiAgKi8KLSAgaW50IG5fbG9jYWxfZ290X2VudHJpZXM7Ci19OwotCi0jZGVmaW5lIGFscGhhX2VsZl90ZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEgKikgKGFiZmQpLT50ZGF0YS5hbnkpCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hbnkgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgb3VyIHNwZWNpYWwgdGFyZ2V0IGRhdGEuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqbmV3X3RkYXRhOwotICBuZXdfdGRhdGEgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld190ZGF0YS0+cm9vdCA9ICphYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IG5ld190ZGF0YTsKLQotICAvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhbiBBbHBoYSBFTEYgZmlsZS4gICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hbHBoYSwgMCk7Ci19Ci0MCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX0FMUEhBX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJFTEZfTElURVJBTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gRUxGX0xJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBUaGUgc3ltYm9sIGluZGV4IGlzIHNwZWNpYWw6Ci0gICAgIDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZSByZWdpc3RlciBvZiBhIG1lbW9yeQotICAgICBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZQotICAgICBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbiBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUKLSAgICAgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uCi0gICAgIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRVU0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfbmlsLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRVU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvYWQgdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBpcyBhbHdheXMgdXNlZCBmb3IgYSBsZGFoIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSBncCByZWdpc3Rlci4gIFRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBpcyBhbiBvZmZzZXQgaW4gYnl0ZXMgdG8gdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB0aGF0IGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHZhbHVlIHRvIHVzZSBmb3IKLSAgICAgdGhlIHJlbG9jYXRpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1AgdmFsdWUgYW5kIHRoZQotICAgICBjdXJyZW50IGxvY2F0aW9uOyB0aGUgbG9hZCB3aWxsIGFsd2F5cyBiZSBkb25lIGFnYWluc3QgYSByZWdpc3RlcgotICAgICBob2xkaW5nIHRoZSBjdXJyZW50IGFkZHJlc3MuCi0KLSAgICAgTk9URTogVW5saWtlIEVDT0ZGLCBwYXJ0aWFsIGluLXBsYWNlIHJlbG9jYXRpb24gaXMgbm90IGRvbmUuICBJZgotICAgICBhbnkgb2Zmc2V0IGlzIHByZXNlbnQgaW4gdGhlIGluc3RydWN0aW9ucywgaXQgaXMgYW4gb2Zmc2V0IGZyb20KLSAgICAgdGhlIHJlZ2lzdGVyIHRvIHRoZSBsZGFoIGluc3RydWN0aW9uLiAgVGhpcyBsZXRzIHVzIGF2b2lkIGFueQotICAgICBzdHVwaWQgaGFja2VyeSBsaWtlIGludmVudGluZyBhIGdwIHZhbHVlIHRvIGRvIHBhcnRpYWwgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0LiAgQWxzbyB1bmxpa2UgRUNPRkYsIHdlIGRvIHRoZSB3aG9sZSByZWxvY2F0aW9uIG9mZiBvZgotICAgICB0aGUgR1BESVNQIHJhdGhlciB0aGFuIGEgR1BESVNQX0hJMTYvR1BESVNQX0xPMTYgcGFpci4gIEFuIG9kZCwKLSAgICAgc3BhY2UgY29uc3VtaW5nIGJpdCwgdGhhdCwgc2luY2UgYWxsIHRoZSBpbmZvcm1hdGlvbiB3YXMgcHJlc2VudAotICAgICBpbiB0aGUgR1BESVNQX0hJMTYgcmVsb2MuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUERJU1AsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIEdQIHVzZWQgYnkgK3JfYWRkZW5kIHVudGlsIHRoZSBuZXh0IEdQVkFMVUUgb3IgdGhlCi0gICAgIGVuZCBvZiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQVkFMVUUsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxISUdILAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxISUdIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiB0aGUgZGlzcGxhY2VtZW50IGZyb20gR1AgdG8gdGhlIHRhcmdldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQUkVMTE9XLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMTE9XIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYtYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF8xNiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQ7IHRoZQotICAgICBsb3cgYml0cyBhcmUgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZQotICAgICBjdXJyZW50IHNlY3Rpb24gKHRoZSByZWxvY2F0aW9uIHRhcmdldCBpcyBpZ25vcmVkKTsgdGhlIGxvdyBiaXRzIGFyZSAKLSAgICAgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfU0NOX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9TQ05fSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgcHJldmlvdXMgYnIsIGJzciwganNyCi0gICAgIG9yIGptcCBpbnNuIChhcyB0YWdnZWQgYnkgYSBCUkFERFIgb3IgSElOVCByZWxvYykgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBieSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9CUl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBkaXNwbGFjZW1lbnQgY2FsY3VsYXRlZCBpbiBhIHByZXZpb3VzIEhJMzIgcmVsb2MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0xPMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9MTzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBNaXNjIEVMRiByZWxvY2F0aW9ucy4gKi8KLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiB0byBjb3B5IHRoZSB0YXJnZXQgaW50byBvdXIgLmR5bmJzcyBzZWN0aW9uLiAgKi8KLSAgLyogTm90IGdlbmVyYXRlZCwgYXMgYWxsIEFscGhhIG9iamVjdHMgdXNlIFBJQywgc28gaXQgaXMgbm90IG5lZWRlZC4gIEl0Ci0gICAgIGlzIHByZXNlbnQgYmVjYXVzZSBldmVyeSBvdGhlciBFTEYgaGFzIG9uZSwgYnV0IHNob3VsZCBub3QgYmUgdXNlZAotICAgICBiZWNhdXNlIC5keW5ic3MgaXMgYW4gdWdseSB0aGluZy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0NPUFksCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJDT1BZIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5nb3QgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HTE9CX0RBVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkdMT0JfREFUIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5wbHQgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9KTVBfU0xPVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkpNUF9TTE9UIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGFkZCB0aGUgYmFzZSBvZiB0aGUgRFNPIHRvIGEgNjQtYml0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVMQVRJVkUsCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSRUxBVElWRSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKQotfTsKLQotLyogQSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGRvZXNuJ3QgZG8gYW55dGhpbmcuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gdXNlZCBmb3IgYW4gdW5zdXBwb3J0ZWQgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19iYWQgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncGRpc3AsIHBfbGRhaCwgcF9sZGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncGRpc3A7Ci0gICAgIGJmZF9ieXRlICpwX2xkYWg7Ci0gICAgIGJmZF9ieXRlICpwX2xkYTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldCA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgaV9sZGFoLCBpX2xkYTsKLQotICBpX2xkYWggPSBiZmRfZ2V0XzMyIChhYmZkLCBwX2xkYWgpOwotICBpX2xkYSA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhKTsKLQotICAvKiBDb21wbGFpbiBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgY29ycmVjdC4gICovCi0gIGlmICgoKGlfbGRhaCA+PiAyNikgJiAweDNmKSAhPSAweDA5Ci0gICAgICB8fCAoKGlfbGRhID4+IDI2KSAmIDB4M2YpICE9IDB4MDgpCi0gICAgcmV0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQotICAvKiBFeHRyYWN0IHRoZSB1c2VyLXN1cHBsaWVkIG9mZnNldCwgbWlycm9yaW5nIHRoZSBzaWduIGV4dGVuc2lvbnMKLSAgICAgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIHBlcmZvcm0uICAqLwotICBhZGRlbmQgPSAoKGlfbGRhaCAmIDB4ZmZmZikgPDwgMTYpIHwgKGlfbGRhICYgMHhmZmZmKTsKLSAgYWRkZW5kID0gKGFkZGVuZCBeIDB4ODAwMDgwMDApIC0gMHg4MDAwODAwMDsKLQotICBncGRpc3AgKz0gYWRkZW5kOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIGdwZGlzcCA8IC0oYmZkX3NpZ25lZF92bWEpIDB4ODAwMDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwID49IChiZmRfc2lnbmVkX3ZtYSkgMHg3ZmZmODAwMCkKLSAgICByZXQgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIGFnYWluLiAgKi8KLSAgaV9sZGFoID0gKChpX2xkYWggJiAweGZmZmYwMDAwKQotCSAgICB8ICgoKGdwZGlzcCA+PiAxNikgKyAoKGdwZGlzcCA+PiAxNSkgJiAxKSkgJiAweGZmZmYpKTsKLSAgaV9sZGEgPSAoaV9sZGEgJiAweGZmZmYwMDAwKSB8IChncGRpc3AgJiAweGZmZmYpOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGlfbGRhaCwgcF9sZGFoKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGEsIHBfbGRhKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIEdQRElTUCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bSwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyX21zZykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycl9tc2c7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0gIGJmZF9ieXRlICpwX2xkYWgsICpwX2xkYTsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSB8fAotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyByZWxvY19lbnRyeS0+YWRkZW5kID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGUgZ3AgdXNlZCBpbiB0aGUgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IG9iamVjdCB0byB3aGljaCB0aGlzCi0gICAgIGlucHV0IG9iamVjdCBiZWxvbmdzIGlzIGNhY2hlZCBvbiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0KLSAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBwX2xkYWggPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBwX2xkYSA9IHBfbGRhaCArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmV0ID0gZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncCAtIHJlbG9jYXRpb24sIHBfbGRhaCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKHJldCA9PSBiZmRfcmVsb2NfZGFuZ2Vyb3VzKQotICAgICplcnJfbXNnID0gXygiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gQWxwaGEgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIGludCBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIGVsZjY0X2FscGhhX3JlbG9jX21hcFtdID0KLXsKLSAge0JGRF9SRUxPQ19OT05FLAkJUl9BTFBIQV9OT05FfSwKLSAge0JGRF9SRUxPQ18zMiwJCVJfQUxQSEFfUkVGTE9OR30sCi0gIHtCRkRfUkVMT0NfNjQsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0NUT1IsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0dQUkVMMzIsCQlSX0FMUEhBX0dQUkVMMzJ9LAotICB7QkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAlSX0FMUEhBX0xJVEVSQUx9LAotICB7QkZEX1JFTE9DX0FMUEhBX0xJVFVTRSwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX0dQRElTUCwJUl9BTFBIQV9HUERJU1B9LAotICB7QkZEX1JFTE9DXzIzX1BDUkVMX1MyLAlSX0FMUEhBX0JSQUREUn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfSElOVCwJUl9BTFBIQV9ISU5UfSwKLSAge0JGRF9SRUxPQ18xNl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDE2fSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDMyfSwKLSAge0JGRF9SRUxPQ182NF9QQ1JFTCwJCVJfQUxQSEFfU1JFTDY0fSwKLQotLyogVGhlIEJGRF9SRUxPQ19BTFBIQV9VU0VSXyogcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0byBwcm9jZXNzCi0gICB0aGUgZXhwbGljaXQgITxyZWxvYz4hc2VxdWVuY2UgcmVsb2NhdGlvbnMsIGFuZCBhcmUgbWFwcGVkIGludG8gdGhlIG5vcm1hbAotICAgcmVsb2NhdGlvbnMgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nLiAqLwotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTCwJUl9BTFBIQV9MSVRFUkFMfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCQlSX0FMUEhBX0dQRElTUH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0gsCVJfQUxQSEFfR1BSRUxISUdIfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XLAlSX0FMUEhBX0dQUkVMTE9XfSwKLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIEhPV1RPIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgKmksICplOwotICBpID0gZSA9IGVsZjY0X2FscGhhX3JlbG9jX21hcDsKLSAgZSArPSBzaXplb2YgKGVsZjY0X2FscGhhX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsKLSAgZm9yICg7IGkgIT0gZTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpLT5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtpLT5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhbiBBbHBoYSBFTEYgcmVsb2MgdHlwZSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjY0X1JfVFlQRShkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfQUxQSEFfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotDAotLyogVGhlc2UgZnVuY3Rpb25zIGRvIHJlbGF4YXRpb24gZm9yIEFscGhhIEVMRi4gCi0KLSAgIEN1cnJlbnRseSBJJ20gb25seSBoYW5kbGluZyB3aGF0IEkgY2FuIGRvIHdpdGggZXhpc3RpbmcgY29tcGlsZXIKLSAgIGFuZCBhc3NlbWJsZXIgc3VwcG9ydCwgd2hpY2ggbWVhbnMgbm8gaW5zdHJ1Y3Rpb25zIGFyZSByZW1vdmVkLAotICAgdGhvdWdoIHNvbWUgbWF5IGJlIG5vcHBlZC4gIEF0IHRoaXMgdGltZSBHQ0MgZG9lcyBub3QgZW1pdCBlbm91Z2gKLSAgIGluZm9ybWF0aW9uIHRvIGRvIGFsbCBvZiB0aGUgcmVsYXhpbmcgdGhhdCBpcyBwb3NzaWJsZS4gIEl0IHdpbGwKLSAgIHRha2Ugc29tZSBub3Qgc21hbGwgYW1vdW50IG9mIHdvcmsgZm9yIHRoYXQgdG8gaGFwcGVuLgotCi0gICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgaW50ZXJlc3RpbmcgcGFwZXJzIHRoYXQgSSBvbmNlIHJlYWQgb24gdGhpcwotICAgc3ViamVjdCwgdGhhdCBJIGNhbm5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gYXQgdGhlIG1vbWVudCwgdGhhdAotICAgcmVsYXRlZCB0byBBbHBoYSBpbiBwYXJ0aWN1bGFyLiAgVGhleSBhcmUgYnkgRGF2aWQgV2FsbCwgdGhlbiBvZgotICAgREVDIFdSTC4gICovCi0KLSNkZWZpbmUgT1BfTERBCQkweDA4Ci0jZGVmaW5lIE9QX0xEQUgJCTB4MDkKLSNkZWZpbmUgSU5TTl9KU1IJMHg2ODAwNDAwMAotI2RlZmluZSBJTlNOX0pTUl9NQVNLCTB4ZmMwMGMwMDAKLSNkZWZpbmUgT1BfTERRCQkweDI5Ci0jZGVmaW5lIE9QX0JSCQkweDMwCi0jZGVmaW5lIE9QX0JTUgkJMHgzNAotI2RlZmluZSBJTlNOX1VOT1AJMHgyZmUwMDAwMAotCi1zdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgKnJlbGVuZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgYm9vbGVhbiBjaGFuZ2VkX2NvbnRlbnRzOwotICBib29sZWFuIGNoYW5nZWRfcmVsb2NzOwotICBiZmRfdm1hIGdwOwotICBiZmQgKmdvdG9iajsKLSAgYXNlY3Rpb24gKnRzZWM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICB1bnNpZ25lZCBjaGFyIG90aGVyOwotfTsKLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICogZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwsIAotICAgICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGVuZCkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCwgCi0gICAgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwpKTsKLQotc3RhdGljIGJmZF92bWEgZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgIGJvb2xlYW4gKmFnYWluKSk7Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqCi1lbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyAocmVsLCByZWxlbmQsIG9mZnNldCwgdHlwZSkKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGludCB0eXBlOwotewotICB3aGlsZSAocmVsIDwgcmVsZW5kKQotICAgIHsKLSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID09IG9mZnNldCAmJiBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSB0eXBlKQotCXJldHVybiByZWw7Ci0gICAgICArK3JlbDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKgotZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKGluZm8sIHN5bXZhbCwgaXJlbCwgaXJlbGVuZCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICp1cmVsOwotICBpbnQgZmxhZ3MsIGNvdW50LCBpOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotICBib29sZWFuIGZpdHMxNjsKLSAgYm9vbGVhbiBmaXRzMzI7Ci0gIGJvb2xlYW4gbGl0X3JldXNlZCA9IGZhbHNlOwotICBib29sZWFuIGFsbF9vcHRpbWl6ZWQgPSB0cnVlOwotICB1bnNpZ25lZCBpbnQgbGl0X2luc247Ci0KLSAgbGl0X2luc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLSAgaWYgKGxpdF9pbnNuID4+IDI2ICE9IE9QX0xEUSkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogJXMrMHglbHg6IHdhcm5pbmc6IExJVEVSQUwgcmVsb2NhdGlvbiBhZ2FpbnN0IHVuZXhwZWN0ZWQgaW5zbiIsCi0JYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIGluZm8tPnNlYy0+bmFtZSwKLQkodW5zaWduZWQgbG9uZylpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIGlyZWw7Ci0gICAgfQotCi0gIC8qIFN1bW1hcml6ZSBob3cgdGhpcyBwYXJ0aWN1bGFyIExJVEVSQUwgaXMgdXNlZC4gICovCi0gIGZvciAodXJlbCA9IGlyZWwrMSwgZmxhZ3MgPSBjb3VudCA9IDA7IHVyZWwgPCBpcmVsZW5kOyArK3VyZWwsICsrY291bnQpCi0gICAgewotICAgICAgaWYgKEVMRjY0X1JfVFlQRSAodXJlbC0+cl9pbmZvKSAhPSBSX0FMUEhBX0xJVFVTRSkKLQlicmVhazsKLSAgICAgIGlmICh1cmVsLT5yX2FkZGVuZCA+PSAwICYmIHVyZWwtPnJfYWRkZW5kIDw9IDMpCi0JZmxhZ3MgfD0gMSA8PCB1cmVsLT5yX2FkZGVuZDsKLSAgICB9Ci0KLSAgLyogQSBsaXR0bGUgcHJlcGFyYXRpb24gZm9yIHRoZSBsb29wLi4uICovCi0gIGRpc3AgPSBzeW12YWwgLSBpbmZvLT5ncDsKLSAgZml0czE2ID0gKGRpc3AgPj0gLShiZmRfc2lnbmVkX3ZtYSkweDgwMDAgJiYgZGlzcCA8IDB4ODAwMCk7Ci0gIGZpdHMzMiA9IChkaXNwID49IC0oYmZkX3NpZ25lZF92bWEpMHg4MDAwMDAwMCAmJiBkaXNwIDwgMHg3ZmZmODAwMCk7Ci0KLSAgZm9yICh1cmVsID0gaXJlbCsxLCBpID0gMDsgaSA8IGNvdW50OyArK2ksICsrdXJlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQotICAgICAgc3dpdGNoICh1cmVsLT5yX2FkZGVuZCkKLQl7Ci0JZGVmYXVsdDogLyogMCA9IEFERFJFU1MgRk9STUFUICovCi0JICAvKiBUaGlzIHR5cGUgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBub3RlIHRoYXQgYWxsCi0JICAgICB1c2VzIGNhbm5vdCBiZSBvcHRpbWl6ZWQsIGJ1dCB0byBzdGlsbCBhbGxvdyBzb21lLiAgKi8KLQkgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOiAvKiBNRU0gRk9STUFUICovCi0JICAvKiBXZSBjYW4gYWx3YXlzIG9wdGltaXplIDE2LWJpdCBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGlmIChmaXRzMTYpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBtZW0gZm9ybWF0IHdpdGgKLQkJIHplcm8gYWRkZW5kLiAgKi8KLQotCSAgICAgIC8qIFRha2UgdGhlIG9wIGNvZGUgYW5kIGRlc3QgZnJvbSB0aGlzIGluc24sIHRha2UgdGhlIGJhc2UgCi0JCSByZWdpc3RlciBmcm9tIHRoZSBsaXRlcmFsIGluc24uICBMZWF2ZSB0aGUgb2Zmc2V0IGFsb25lLiAgKi8KLQkgICAgICBpbnNuID0gKGluc24gJiAweGZmZTAwMDAwKSB8IChsaXRfaW5zbiAmIDB4MDAxZjAwMDApOwotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQotCSAgLyogSWYgYWxsIG1lbStieXRlLCB3ZSBjYW4gb3B0aW1pemUgMzItYml0IG1lbSBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGVsc2UgaWYgKGZpdHMzMiAmJiAhKGZsYWdzICYgfjYpKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGF0IGxpdCBpbnNuIFJhIGlzIG1lbSBpbnNuIFJiLCBhbmQKLQkJIHRoYXQgbWVtX2luc24gZGlzcCBpcyB6ZXJvLiAgKi8KLQotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxISUdIKTsKLQkgICAgICBsaXRfaW5zbiA9IChPUF9MREFIIDw8IDI2KSB8IChsaXRfaW5zbiAmIDB4MDNmZjAwMDApOwotCSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGxpdF9pbnNuLAotCQkJICBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBsaXRfcmV1c2VkID0gdHJ1ZTsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOiAvKiBCWVRFIE9GRlNFVCBGT1JNQVQgKi8KLQkgIC8qIFdlIGNhbiBhbHdheXMgb3B0aW1pemUgYnl0ZSBpbnN0cnVjdGlvbnMuICAqLwotCi0JICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBieXRlIG9wLiAgQ2hlY2sgdGhhdCB0aGUKLQkgICAgIGxpdGVyYWwgZGVzdCByZWcgaXMgaW5kZWVkIFJiIGluIHRoZSBieXRlIGluc24uICAqLwotCi0JICBpbnNuID0gKGluc24gJiB+MHgwMDFmZjAwMCkgfCAoKHN5bXZhbCAmIDcpIDw8IDEzKSB8IDB4MTAwMDsKLQotCSAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCSAgdXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6IC8qIENBTEwgRk9STUFUICovCi0JICB7Ci0JICAgIC8qIElmIG5vdCB6ZXJvLCBwbGFjZSB0byBqdW1wIHdpdGhvdXQgbmVlZGluZyBwdi4gICovCi0JICAgIGJmZF92bWEgb3B0ZGVzdCA9IGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpOwotCSAgICBiZmRfdm1hIG9yZyA9IChpbmZvLT5zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5mby0+c2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHVyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICAgIGJmZF9zaWduZWRfdm1hIG9kaXNwOwotCi0JICAgIG9kaXNwID0gKG9wdGRlc3QgPyBvcHRkZXN0IDogc3ltdmFsKSAtIG9yZzsKLQkgICAgaWYgKG9kaXNwID49IC0weDQwMDAwMCAmJiBvZGlzcCA8IDB4NDAwMDAwKQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKnhyZWw7Ci0KLQkJLyogUHJlc2VydmUgYnJhbmNoIHByZWRpY3Rpb24gY2FsbCBzdGFjayB3aGVuIHBvc3NpYmxlLiAqLwotCQlpZiAoKGluc24gJiBJTlNOX0pTUl9NQVNLKSA9PSBJTlNOX0pTUikKLQkJICBpbnNuID0gKE9QX0JTUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQllbHNlCi0JCSAgaW5zbiA9IChPUF9CUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQkgIAotCQl1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgIFJfQUxQSEFfQlJBRERSKTsKLQkJdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQotCQlpZiAob3B0ZGVzdCkKLQkJICB1cmVsLT5yX2FkZGVuZCArPSBvcHRkZXN0IC0gc3ltdmFsOwotCQllbHNlCi0JCSAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCi0JCWJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCi0JCS8qIEtpbGwgYW55IEhJTlQgcmVsb2MgdGhhdCBtaWdodCBleGlzdCBmb3IgdGhpcyBpbnNuLiAgKi8KLQkJeHJlbCA9IChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcwotCQkJKGluZm8tPnJlbG9jcywgaW5mby0+cmVsZW5kLCB1cmVsLT5yX29mZnNldCwgCi0JCQkgUl9BTFBIQV9ISU5UKSk7Ci0JCWlmICh4cmVsKQotCQkgIHhyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQotCQlpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkJaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQotCSAgICAvKiA/Pz8gSWYgdGFyZ2V0IGdwID09IGN1cnJlbnQgZ3Agd2UgY2FuIGVsaW1pbmF0ZSB0aGUgZ3AgcmVsb2FkLgotCSAgICAgICBUaGlzIGRvZXMgZGVwZW5kIG9uIGV2ZXJ5IHBsYWNlIGEgZ3AgY291bGQgYmUgcmVsb2FkZWQgd2lsbAotCSAgICAgICBiZSwgd2hpY2ggY3VycmVudGx5IGhhcHBlbnMgZm9yIGFsbCBjb2RlIHByb2R1Y2VkIGJ5IGdjYywgYnV0Ci0JICAgICAgIG5vdCBuZWNlc3NhcmlseSBieSBoYW5kLWNvZGVkIGFzc2VtYmx5LCBvciBpZiBzaWJsaW5nIGNhbGxzCi0JICAgICAgIGFyZSBlbmFibGVkIGluIGdjYy4gCi0KLQkgICAgICAgUGVyaGFwcyBjb25kaXRpb25hbGl6ZSB0aGlzIG9uIGEgZmxhZyBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAotCSAgICAgICBvYmplY3QgZmlsZSdzIGhlYWRlciwgYW5kIGhhdmUgZ2NjIHNldCBpdD8gICovCi0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGFsbCBjYXNlcyB3ZXJlIG9wdGltaXplZCwgd2UgY2FuIHJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMKLSAgICAgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkgZWxpbWluYXRpbmcgaXQuICAqLwotICBpZiAoYWxsX29wdGltaXplZCkKLSAgICB7Ci0gICAgICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICAgICAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPnRvdGFsX2dvdF9lbnRyaWVzIC09IDE7Ci0gICAgICBpZiAoIWluZm8tPmgpCi0JYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPm5fbG9jYWxfZ290X2VudHJpZXMgLT0gMTsKLQotICAgICAgLyogSWYgdGhlIGxpdGVyYWwgaW5zdHJ1Y3Rpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoaXQgbWF5IGhhdmUgYmVlbgotCSByZXVzZWQuICBXZSBjYW4gZWxpbWluYXRlIGl0LgotCSA/Pz8gRm9yIG5vdywgSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBjb21wYWN0aW5nIHRoZSBzZWN0aW9uLAotCSBzbyBqdXN0IG5vcCBpdCBvdXQuICAqLwotICAgICAgaWYgKCFsaXRfcmV1c2VkKQotCXsKLQkgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQkgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotCSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgSU5TTl9VTk9QLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlyZWwgKyBjb3VudDsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLXsKLSAgLyogSWYgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBncCwgYW5kIHdlIGNhbiBpZGVudGlmeSB0aGF0IHRoZQotICAgICBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgaXRzIGZ1bmN0aW9uIHBvaW50ZXIsIHdlIGNhbiBlbGltaW5hdGUgdGhlCi0gICAgIGFkZHJlc3MgbG9hZC4gICovCi0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgTk9QViwgd2UgYXJlIGJlaW5nIHRvbGQgdGhlIGZ1bmN0aW9uIG5ldmVyCi0gICAgIG5lZWRzIGl0cyBwcm9jZWR1cmUgdmFsdWUuICAqLwotICBpZiAoaW5mby0+b3RoZXIgPT0gU1RPX0FMUEhBX05PUFYpCi0gICAgcmV0dXJuIHN5bXZhbDsKLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBTVERfR1AsIHdlIGFyZSBiZWluZyB0b2xkIHRoZSBmdW5jdGlvbiBkb2VzCi0gICAgIGEgbm9ybWFsIGxkZ3AgaW4gdGhlIGZpcnN0IHR3byB3b3Jkcy4gICovIAotICBlbHNlIGlmIChpbmZvLT5vdGhlciA9PSBTVE9fQUxQSEFfU1REX0dQTE9BRCkKLSAgICA7Ci0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBtYXkgYmUgYWJsZSB0byBpZGVudGlmeSBhIEdQIGxvYWQgaW4gdGhlIGZpcnN0IHR3bwotICAgICB3b3Jkcywgd2hpY2ggd2UgY2FuIHRoZW4gc2tpcC4gICovCi0gIGVsc2UgCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnRzZWNfcmVsb2NzLCAqdHNlY19yZWxlbmQsICp0c2VjX2ZyZWUsICpncGRpc3A7Ci0gICAgICBiZmRfdm1hIG9mczsKLQotICAgICAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZnJvbSB0aGUgc2VjdGlvbiB0aGF0IHRoZSB0YXJnZXQgc3ltYm9sIGlzIGluLiAqLwotICAgICAgaWYgKGluZm8tPnNlYyA9PSBpbmZvLT50c2VjKQotCXsKLQkgIHRzZWNfcmVsb2NzID0gaW5mby0+cmVsb2NzOwotCSAgdHNlY19yZWxlbmQgPSBpbmZvLT5yZWxlbmQ7Ci0JICB0c2VjX2ZyZWUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0c2VjX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAgICAgKGluZm8tPmFiZmQsIGluZm8tPnRzZWMsIChQVFIpIE5VTEwsCi0JCQkgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgaW5mby0+bGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKHRzZWNfcmVsb2NzID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCSAgdHNlY19yZWxlbmQgPSB0c2VjX3JlbG9jcyArIGluZm8tPnRzZWMtPnJlbG9jX2NvdW50OwotCSAgdHNlY19mcmVlID0gKGluZm8tPmxpbmtfaW5mby0+a2VlcF9tZW1vcnkgPyBOVUxMIDogdHNlY19yZWxvY3MpOwotCX0KLQotICAgICAgLyogUmVjb3ZlciB0aGUgc3ltYm9sJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgc2VjdGlvbi4gICovCi0gICAgICBvZnMgPSAoc3ltdmFsIC0gaW5mby0+dHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgLSBpbmZvLT50c2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgCi0gICAgICAvKiBMb29rIGZvciBhIEdQRElTUCByZWxvYy4gICovCi0gICAgICBncGRpc3AgPSAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKLQkJKHRzZWNfcmVsb2NzLCB0c2VjX3JlbGVuZCwgb2ZzLCBSX0FMUEhBX0dQRElTUCkpOwotCi0gICAgICBpZiAoIWdwZGlzcCB8fCBncGRpc3AtPnJfYWRkZW5kICE9IDQpCi0JewotCSAgaWYgKHRzZWNfZnJlZSkKLQkgICAgZnJlZSAodHNlY19mcmVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICh0c2VjX2ZyZWUpCi0gICAgICAgIGZyZWUgKHRzZWNfZnJlZSk7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIG5vdyBkZXRlcm1pbmVkIHRoYXQgd2UgY2FuIHNraXAgYW4gaW5pdGlhbCBncCBsb2FkLiAgVmVyaWZ5IAotICAgICB0aGF0IHRoZSBjYWxsIGFuZCB0aGUgdGFyZ2V0IHVzZSB0aGUgc2FtZSBncC4gICAqLwotICBpZiAoaW5mby0+bGlua19pbmZvLT5oYXNoLT5jcmVhdG9yICE9IGluZm8tPnRzZWMtPm93bmVyLT54dmVjCi0gICAgICB8fCBpbmZvLT5nb3RvYmogIT0gYWxwaGFfZWxmX3RkYXRhIChpbmZvLT50c2VjLT5vd25lciktPmdvdG9iaikKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gc3ltdmFsICsgODsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlIChpbmZvLCBzeW12YWwsIGlyZWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotCi0gIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLSAgaWYgKGluc24gPj4gMjYgIT0gT1BfTERRKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiAlcysweCVseDogd2FybmluZzogTElURVJBTCByZWxvY2F0aW9uIGFnYWluc3QgdW5leHBlY3RlZCBpbnNuIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgaW5mby0+c2VjLT5uYW1lLAotCSh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFNvIHdlIGFyZW4ndCB0b2xkIG11Y2guICBEbyB3aGF0IHdlIGNhbiB3aXRoIHRoZSBhZGRyZXNzIGxvYWQgYW5kCi0gICAgIGZha2UgdGhlIHJlc3QuICBBbGwgb2YgdGhlIG9wdGltaXphdGlvbnMgaGVyZSByZXF1aXJlIHRoYXQgdGhlCi0gICAgIG9mZnNldCBmcm9tIHRoZSBHUCBmaXQgaW4gMTYgYml0cy4gICovCi0KLSAgZGlzcCA9IHN5bXZhbCAtIGluZm8tPmdwOwotICBpZiAoZGlzcCA8IC0weDgwMDAgfHwgZGlzcCA+PSAweDgwMDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gdGhlIExJVEVSQUwgaW5zdHJ1Y3Rpb24gaXRzZWxmLCBjb25zaWRlciBleGNoYW5naW5nCi0gICAgIGBsZHEgUixYKGdwKScgZm9yIGBsZGEgUixZKGdwKScuICAqLwotCi0gIGluc24gPSAoT1BfTERBIDw8IDI2KSB8IChpbnNuICYgMHgwM2ZmMDAwMCk7Ci0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLCBSX0FMUEhBX0dQUkVMTE9XKTsKLSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0gIC8qIFJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkKLSAgICAgZWxpbWluYXRpbmcgaXQuICAqLwotICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+dG90YWxfZ290X2VudHJpZXMgLT0gMTsKLSAgaWYgKCFpbmZvLT5oKQotICAgIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT5uX2xvY2FsX2dvdF9lbnRyaWVzIC09IDE7Ci0KLSAgLyogPz8/IFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggdGhpcyBiYXNpYyBibG9jayBsb29raW5nIGZvciBpbnNucwotICAgICB0aGF0IHVzZSB0aGUgdGFyZ2V0IHJlZ2lzdGVyLiAgU3RvcCBhZnRlciBhbiBpbnNuIG1vZGlmeWluZyB0aGUKLSAgICAgcmVnaXN0ZXIgaXMgc2Vlbiwgb3IgYWZ0ZXIgYSBicmFuY2ggb3IgY2FsbC4KLQotICAgICBBbnkgc3VjaCBtZW1vcnkgbG9hZCBpbnNuIG1heSBiZSBzdWJzdGl0dXRlZCBieSBhIGxvYWQgZGlyZWN0bHkKLSAgICAgb2ZmIHRoZSBHUC4gIFRoaXMgYWxsb3dzIHRoZSBtZW1vcnkgbG9hZCBpbnNuIHRvIGJlIGlzc3VlZCBiZWZvcmUKLSAgICAgdGhlIGNhbGN1bGF0ZWQgR1AgcmVnaXN0ZXIgd291bGQgb3RoZXJ3aXNlIGJlIHJlYWR5LiAKLQotICAgICBBbnkgc3VjaCBqc3IgaW5zbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSBic3IgaWYgaXQgaXMgaW4gcmFuZ2UuCi0KLSAgICAgVGhpcyB3b3VsZCBtZWFuIHRoYXQgd2UnZCBoYXZlIHRvIF9hZGRfIHJlbG9jYXRpb25zLCB0aGUgcGFpbiBvZgotICAgICB3aGljaCBnaXZlcyBvbmUgcGF1c2UuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gaW5mbzsKLQotICAvKiBXZSBhcmUgbm90IGN1cnJlbnRseSBjaGFuZ2luZyBhbnkgc2l6ZXMsIHNvIG9ubHkgb25lIHBhc3MuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBMb2FkIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0gIGluZm8uc2VjID0gc2VjOwotICBpbmZvLmxpbmtfaW5mbyA9IGxpbmtfaW5mbzsKLSAgaW5mby5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGluZm8ucmVsZW5kID0gaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogRmluZCB0aGUgR1AgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLSAgaW5mby5nb3RvYmogPSBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5nb3RvYmo7Ci0gIGlmIChpbmZvLmdvdG9iaikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoaW5mby5nb3RvYmopLT5nb3Q7Ci0gICAgICBpbmZvLmdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqKTsKLSAgICAgIGlmIChpbmZvLmdwID09IDApCi0JewotCSAgaW5mby5ncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAweDgwMDApOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqLCBpbmZvLmdwKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIGlmIChFTEY2NF9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9BTFBIQV9MSVRFUkFMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgaW5mby5jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgaW5mby5jb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjY0X0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaW5mby50c2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGluZm8udHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGluZm8udHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIAotCSAgICBjb250aW51ZTsJLyogd2hvIGtub3dzLiAqLwotCi0JICBpbmZvLmggPSBOVUxMOwotCSAgaW5mby5vdGhlciA9IGlzeW0uc3Rfb3RoZXI7Ci0JICBnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShpcmVsLT5yX2luZm8pXTsKLQkgIHN5bXZhbCA9IGlzeW0uc3RfdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFdlIGNhbid0IGRvIGFudGhpbmcgd2l0aCB1bmRlZmluZWQgb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgICAgfHwgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBsaW5rX2luZm8pKQotCSAgICBjb250aW51ZTsKLQotCSAgaW5mby5oID0gaDsKLQkgIGluZm8uZ290ZW50ID0gZ290ZW50OwotCSAgaW5mby50c2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmZvLm90aGVyID0gaC0+cm9vdC5vdGhlcjsKLQkgIGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOwotCSAgc3ltdmFsID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLQotICAgICAgLyogU2VhcmNoIGZvciB0aGUgZ290IGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhpcyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHdoaWxlIChnb3RlbnQtPmdvdG9iaiAhPSBpbmZvLmdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBpcmVsLT5yX2FkZGVuZCkKLQlnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0gICAgICBpbmZvLmdvdGVudCA9IGdvdGVudDsKLQotICAgICAgc3ltdmFsICs9IGluZm8udHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGluZm8udHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHN5bXZhbCArPSBpcmVsLT5yX2FkZGVuZDsKLQotICAgICAgQkZEX0FTU0VSVChpbmZvLmdvdGVudCAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhlcmUgZXhpc3QgTElUVVNFIHJlbG9jYXRpb25zIGltbWVkaWF0ZWx5IGZvbGxvd2luZywgdGhpcwotCSBvcGVucyB1cCBhbGwgc29ydHMgb2YgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9ucywgYmVjYXVzZSB3ZQotCSBub3cga25vdyBldmVyeSBsb2NhdGlvbiB0aGF0IHRoaXMgYWRkcmVzcyBsb2FkIGlzIHVzZWQuICAqLwotCi0gICAgICBpZiAoaXJlbCsxIDwgaXJlbGVuZCAmJiBFTEY2NF9SX1RZUEUgKGlyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSkKLQl7Ci0JICBpcmVsID0gZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwsIGlyZWxlbmQpOwotCSAgaWYgKGlyZWwgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLmNoYW5nZWRfcmVsb2NzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgIH0KLQotICBpZiAoaW5mby5jaGFuZ2VkX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gaW5mby5jb250ZW50czsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgfQotCi0gICphZ2FpbiA9IGluZm8uY2hhbmdlZF9jb250ZW50cyB8fCBpbmZvLmNoYW5nZWRfcmVsb2NzOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBQTFQvR09UIFN0dWZmICovCi0jZGVmaW5lIFBMVF9IRUFERVJfU0laRSAzMgotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQxCTB4YzM2MDAwMDAJLyogYnIgICAkMjcsLis0ICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQyCTB4YTc3YjAwMGMJLyogbGRxICAkMjcsMTIoJDI3KSAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQzCTB4NDdmZjA0MWYJLyogbm9wICAgICAgICAgICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQ0CTB4NmI3YjAwMDAJLyogam1wICAkMjcsKCQyNykgICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDEyCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMQkJMHhjMzgwMDAwMAkvKiBiciAgICQyOCwgcGx0MCAgICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMgkJMAotI2RlZmluZSBQTFRfRU5UUllfV09SRDMJCTAKLQotI2RlZmluZSBNQVhfR09UX0VOVFJJRVMJCSg2NCoxMDI0IC8gOCkKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28iCi0MCi0vKiBIYW5kbGUgYW4gQWxwaGEgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgRklYTUU6IFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBTSEZfQUxQSEFfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9BTFBIQV9ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgY2FzZSBTSFRfQUxQSEFfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX0FMUEhBX0RFQlVHKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0KQotCQkJCSAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAvKiBGb3IgYSAucmVnaW5mbyBzZWN0aW9uLCBzZXQgdGhlIGdwIHZhbHVlIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbgotICAgICBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICBXZSBuZWVkIHRoZSBncCB2YWx1ZSB3aGlsZQotICAgICBwcm9jZXNzaW5nIHJlbG9jcywgc28gd2UganVzdCBnZXQgaXQgbm93LiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfQUxQSEFfUkVHSU5GTykKLSAgICB7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLSAgICAgIEVsZjY0X1JlZ0luZm8gczsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBuZXdzZWN0LCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgJmV4dCwgJnMpOwotICAgICAgZWxmX2dwIChhYmZkKSA9IHMucmlfZ3BfdmFsdWU7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhbiBBbHBoYSBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX0RFQlVHOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAwLiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAgKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX1JFR0lORk87Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAweDE4LiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotCi0gICAgICAvKiBGb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIHRoZSBjb3JyZWN0IHZhbHVlLCBldmVuIGlmIHRoZQotCSBsaW5rZXIgdGhpbmtzIGl0IGlzIGxhcmdlci4gIFRoZSBsaW5rIHJvdXRpbmUgYmVsb3cgd2lsbCBvbmx5Ci0JIHdyaXRlIG91dCB0aGlzIG11Y2ggZGF0YSBmb3IgLnJlZ2luZm8uICAqLwotICAgICAgaGRyLT5zaF9zaXplID0gc2VjLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmhhc2giKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGhkci0+c2hfaW5mbyA9IFNJWkVPRl9BTFBIQV9EWU5TWU1fU0VDTkFNRVM7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxQSEFfR1BSRUw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUKLQkgYXV0b21hdGljYWxseSBwdXQgaW50byAuc2Jzcy4gICovCi0KLSAgICAgIGFzZWN0aW9uICpzY29tbSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNjb21tb24iKTsKLQotICAgICAgaWYgKHNjb21tID09IE5VTEwpCi0JewotCSAgc2NvbW0gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnNjb21tb24iKTsKLQkgIGlmIChzY29tbSA9PSBOVUxMCi0JICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2NvbW0sIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19JU19DT01NT04KLQkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqc2VjcCA9IHNjb21tOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24oYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmdvdCA9IHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhbGwgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsYS5wbHQsIC5nb3QsIGFuZCAucmVsYS5nb3Qgc2VjdGlvbnMuICAqLwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgIHwgU0VDX0NPREUpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5wbHQgc2VjdGlvbi4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG1heSBvciBtYXkgbm90IGhhdmUgY3JlYXRlZCBhIC5nb3Qgc2VjdGlvbiBmb3IgdGhpcyBvYmplY3QsIGJ1dAotICAgICB3ZSBkZWZpbml0ZWx5IGhhdm4ndCBkb25lIHRoZSByZXN0IG9mIHRoZSB3b3JrLiAgKi8KLQotICBpZiAoIWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uKGFiZmQsICIucmVsYS5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgICBkeW5vYmoncyAuZ290IHNlY3Rpb24uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nCi0gICAgIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCShpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwKLQkgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3QsIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSBmYWxzZSwgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBbHBoYSBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0vKiBBbHBoYSBFTEYgZm9sbG93cyBNSVBTIEVMRiBpbiB1c2luZyBhIHNwZWNpYWwgZmluZF9uZWFyZXN0X2xpbmUKLSAgIHJvdXRpbmUgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZQotICAgc3RpbGwgY2FsbCB0aGlzIG1pcHNfZWxmX2ZpbmRfbGluZSBiZWNhdXNlIG9mIHRoZSBzbG90Ci0gICBmaW5kX2xpbmVfaW5mbyBpbiBlbGZfb2JqX3RkYXRhIGlzIGRlY2xhcmVkIHRoYXQgd2F5LiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZQotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lIGk7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJICAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBhbHBoYV9lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBhbHBoYV9lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIGFzZWN0aW9uICpzZWMsICpvdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoaC0+cm9vdC5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgICAgICB8fCAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLSAgICAgICAgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgICAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotICAgICAgICAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotICAgICAgICAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmVzeW0uaWZkID09IC0yKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0gICAgICAgICAvKiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBzeW1ib2wgaCBpcyB0aGUgb25lIGZyb20KLSAgICAgICAgICAgIHRoZSBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5LCBPVVRQVVRfU0VDVElPTiBtYXkgYmUgbnVsbC4gICovCi0gICAgICAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0KLSAgICAgICAgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucm9kYXRhIikgPT0gMAotICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjSW5pdDsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBlbHNlCi0gICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdHlwZSBhbmQgdmFsdWUgZm9yIGEgc3ltYm9sIHdpdGggYSBmdW5jdGlvbiBzdHViLiAgKi8KLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0UHJvYzsKLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlaW5mby0+YWJmZCwgIi5wbHQiKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5wbHQub2Zmc2V0Ci0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQl9Ci0jaWYgMCAvKiBGSVhNRT8gICovCi0gICAgICBoLT5lc3ltLmlmZCA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoZWluZm8tPmFiZmQsIGVpbmZvLT5kZWJ1ZywgZWluZm8tPnN3YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5lc3ltKSkKLSAgICB7Ci0gICAgICBlaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZJWE1FOiAgQ3JlYXRlIGEgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgZnJvbSB0aGUgLm1kZWJ1ZyBzZWN0aW9uLgotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSovCi0MCi0vKiBIYW5kbGUgZHluYW1pYyByZWxvY2F0aW9ucyB3aGVuIGRvaW5nIGFuIEFscGhhIEVMRiBsaW5rLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBjb25zdCBjaGFyICpyZWxfc2VjX25hbWU7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGludCBnb3RfY3JlYXRlZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICBzcmVsb2MgPSBOVUxMOwotICByZWxfc2VjX25hbWUgPSBOVUxMOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YShhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpOwotICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gIGdvdF9jcmVhdGVkID0gMDsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4LCByX3R5cGU7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQl9Ci0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BTFBIQV9MSVRFUkFMOgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCSAgICBpbnQgZmxhZ3MgPSAwOwotCi0JICAgIGlmIChoKQotCSAgICAgIHsKLQkJLyogU2VhcmNoIGZvciBhbmQgcG9zc2libHkgY3JlYXRlIGEgZ290IGVudHJ5LiAgKi8KLQkJZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50IDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCQkgIGlmIChnb3RlbnQtPmdvdG9iaiA9PSBhYmZkICYmCi0JCSAgICAgIGdvdGVudC0+YWRkZW5kID09IHJlbC0+cl9hZGRlbmQpCi0JCSAgICBicmVhazsKLQotCQlpZiAoIWdvdGVudCkKLQkJICB7Ci0JCSAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopCi0JCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5KSkpOwotCQkgICAgaWYgKCFnb3RlbnQpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgZ290ZW50LT5nb3RvYmogPSBhYmZkOwotCQkgICAgZ290ZW50LT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgICAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gLTE7Ci0JCSAgICBnb3RlbnQtPmZsYWdzID0gMDsKLQkJICAgIGdvdGVudC0+dXNlX2NvdW50ID0gMTsKLQotCQkgICAgZ290ZW50LT5uZXh0ID0gaC0+Z290X2VudHJpZXM7Ci0JCSAgICBoLT5nb3RfZW50cmllcyA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+dG90YWxfZ290X2VudHJpZXMrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICBnb3RlbnQtPnVzZV9jb3VudCArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogVGhpcyBpcyBhIGxvY2FsIC5nb3QgZW50cnkgLS0gcmVjb3JkIGZvciBtZXJnZS4gICovCi0JCWlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgewotCQkgICAgc2l6ZV90IHNpemU7Ci0JCSAgICBzaXplID0gKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikpOwotCi0JCSAgICBsb2NhbF9nb3RfZW50cmllcyA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKiopCi0JCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKLQkJICAgIGlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgbWVtc2V0IChsb2NhbF9nb3RfZW50cmllcywgMCwgc2l6ZSk7Ci0JCSAgICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllcyA9Ci0JCSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzOwotCQkgIH0KLQotCQlmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV07Ci0JCSAgICAgZ290ZW50ICE9IE5VTEwgJiYgZ290ZW50LT5hZGRlbmQgIT0gcmVsLT5yX2FkZGVuZDsKLQkJICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JCSAgY29udGludWU7Ci0JCWlmICghZ290ZW50KQotCQkgIHsKLQkJICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikKLQkJCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkpKSk7Ci0JCSAgICBpZiAoIWdvdGVudCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBnb3RlbnQtPmdvdG9iaiA9IGFiZmQ7Ci0JCSAgICBnb3RlbnQtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICBnb3RlbnQtPmdvdF9vZmZzZXQgPSAtMTsKLQkJICAgIGdvdGVudC0+ZmxhZ3MgPSAwOwotCQkgICAgZ290ZW50LT51c2VfY291bnQgPSAxOwotCi0JCSAgICBnb3RlbnQtPm5leHQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldOwotCQkgICAgbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXSA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT50b3RhbF9nb3RfZW50cmllcysrOwotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5uX2xvY2FsX2dvdF9lbnRyaWVzKys7Ci0JCSAgfQotCQllbHNlCi0JCSAgZ290ZW50LT51c2VfY291bnQgKz0gMTsKLQkgICAgICB9Ci0KLQkgICAgLyogUmVtZW1iZXIgaG93IHRoaXMgbGl0ZXJhbCBpcyB1c2VkIGZyb20gaXRzIExJVFVTRXMuCi0JICAgICAgIFRoaXMgd2lsbCBiZSBpbXBvcnRhbnQgd2hlbiBpdCBjb21lcyB0byBkZWNpZGUgaWYgd2UgY2FuCi0JICAgICAgIGNyZWF0ZSBhIC5wbHQgZW50cnkgZm9yIGEgZnVuY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgaWYgKHJlbCsxIDwgcmVsZW5kCi0JCSYmIEVMRjY0X1JfVFlQRSAocmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpCi0JICAgICAgewotCQlkbwotCQkgIHsKLQkJICAgICsrcmVsOwotCQkgICAgaWYgKHJlbC0+cl9hZGRlbmQgPj0gMSAmJiByZWwtPnJfYWRkZW5kIDw9IDMpCi0JCSAgICAgIGZsYWdzIHw9IDEgPDwgcmVsLT5yX2FkZGVuZDsKLQkJICB9Ci0JCXdoaWxlIChyZWwrMSA8IHJlbGVuZCAmJgotCQkgICAgICAgRUxGNjRfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBObyBMSVRVU0VzIC0tIHByZXN1bWFibHkgdGhlIGFkZHJlc3MgaXMgbm90IGJlaW5nCi0JCSAgIGxvYWRlZCBmb3Igbm90aGluZy4gICovCi0JCWZsYWdzID0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSOwotCSAgICAgIH0KLQotCSAgICBnb3RlbnQtPmZsYWdzIHw9IGZsYWdzOwotCSAgICBpZiAoaCkKLQkgICAgICB7Ci0JCS8qIE1ha2UgYSBndWVzcyBhcyB0byB3aGV0aGVyIGEgLnBsdCBlbnRyeSB3aWxsIGJlIG5lZWRlZC4gICovCi0JCWlmICgoaC0+ZmxhZ3MgfD0gZmxhZ3MpID09IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQykKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCWVsc2UKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIH0KLQkgIH0KLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlIFJfQUxQSEFfR1BESVNQOgotCWNhc2UgUl9BTFBIQV9HUFJFTDMyOgotCWNhc2UgUl9BTFBIQV9HUFJFTEhJR0g6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSAuZ290IGhlcmUsIGJ1dCB0aGUgc2VjdGlvbnMgbXVzdAotCSAgICAgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCSAgICAgc2VjdGlvbnMuICAqLwotCSAgaWYgKCFnb3RfY3JlYXRlZCkKLQkgICAgewotCSAgICAgIGlmICghZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoZSBvYmplY3QncyBnb3RvYmogaXMgc2V0IHRvIGl0c2VsZiBzbwotCQkgdGhhdCB3ZSBkZWZhdWx0IHRvIGV2ZXJ5IG9iamVjdCB3aXRoIGl0cyBvd24gLmdvdC4KLQkJIFdlJ2xsIG1lcmdlIC5nb3RzIGxhdGVyIG9uY2Ugd2UndmUgY29sbGVjdGVkIGVhY2gKLQkJIG9iamVjdCdzIGluZm8uICAqLwotCSAgICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290b2JqID0gYWJmZDsKLQotCSAgICAgIGdvdF9jcmVhdGVkID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfU1JFTDE2OgotCWNhc2UgUl9BTFBIQV9TUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX1NSRUw2NDoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9BTFBIQV9SRUZMT05HOgotCWNhc2UgUl9BTFBIQV9SRUZRVUFEOgotCSAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsX3NlY19uYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAgIChhYmZkLCBlbGZfZWxmaGVhZGVyKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JICAgICAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChyZWxfc2VjX25hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkgICAgIHJlbF9zZWNfbmFtZSs1KSA9PSAwKTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2VjdGlvbiBoZXJlIG5vdyB3aGV0aGVyIHdlIGV2ZW50dWFsbHkKLQkgICAgIHVzZSBpdCBvciBub3Qgc28gdGhhdCBpdCBnZXRzIG1hcHBlZCB0byBhbiBvdXRwdXQgc2VjdGlvbiBieQotCSAgICAgdGhlIGxpbmtlci4gIElmIG5vdCB1c2VkLCB3ZSdsbCBraWxsIGl0IGluCi0JICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgcmVsX3NlY19uYW1lKTsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIHJlbF9zZWNfbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJIChTRUNfQUxMT0N8U0VDX0xPQUQKLQkJCQkJCSAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIC8qIFNpbmNlIHdlIGhhdm4ndCBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scyB5ZXQsIHdlCi0JCSBkb24ndCBrbm93IHdoZXRoZXIgd2UnbGwgYWN0dWFsbHkgbmVlZCBhIGR5bmFtaWMgcmVsb2NhdGlvbgotCQkgZW50cnkgZm9yIHRoaXMgcmVsb2MuICBTbyBtYWtlIGEgcmVjb3JkIG9mIGl0LiAgT25jZSB3ZQotCQkgZmluZCBvdXQgaWYgdGhpcyB0aGluZyBuZWVkcyBkeW5hbWljIHJlbG9jYXRpb24gd2UnbGwKLQkJIGV4cGFuZCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9ucyBieSB0aGUgYXBwcm9wcmlhdGUgYW1vdW50LiAqLwotCi0JICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVudDsKLQotCSAgICAgIGZvciAocmVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbnQ7IHJlbnQgPSByZW50LT5uZXh0KQotCQlpZiAocmVudC0+cnR5cGUgPT0gcl90eXBlICYmIHJlbnQtPnNyZWwgPT0gc3JlbG9jKQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCFyZW50KQotCQl7Ci0JCSAgcmVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkpKSk7Ci0JCSAgaWYgKCFyZW50KQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgcmVudC0+c3JlbCA9IHNyZWxvYzsKLQkJICByZW50LT5ydHlwZSA9IHJfdHlwZTsKLQkJICByZW50LT5jb3VudCA9IDE7Ci0KLQkJICByZW50LT5uZXh0ID0gaC0+cmVsb2NfZW50cmllczsKLQkJICBoLT5yZWxvY19lbnRyaWVzID0gcmVudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVudC0+Y291bnQrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSkKLQkgICAgewotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoZSBzZWN0aW9uIGlzIHRvIGJlCi0JCSBsb2FkZWQgaW50byBtZW1vcnksIHdlIG5lZWQgYSBSRUxBVElWRSByZWxvYy4gICovCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmFoOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGFoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaDsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scywgZmluYWxpemUgb3VyIGRlY2lzaW9uCi0gICAgIGFib3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgc2hvdWxkIGdldCBhIC5wbHQgZW50cnkuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKQotICAgICAgJiYgKChoLT50eXBlID09IFNUVF9GVU5DCi0JICAgJiYgIShhaC0+ZmxhZ3MgJiBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpKQotCSAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgICAgICYmIGFoLT5mbGFncyA9PSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpKQotICAgICAgLyogRG9uJ3QgcHJldmVudCBvdGhlcndpc2UgdmFsaWQgcHJvZ3JhbXMgZnJvbSBsaW5raW5nIGJ5IGF0dGVtcHRpbmcKLQkgdG8gY3JlYXRlIGEgbmV3IC5nb3QgZW50cnkgc29tZXdoZXJlLiAgQSBDb3JyZWN0IFNvbHV0aW9uIHdvdWxkIGJlCi0JIHRvIGFkZCBhIG5ldyAuZ290IHNlY3Rpb24gdG8gYSBuZXcgb2JqZWN0IGZpbGUgYW5kIGxldCBpdCBiZSBtZXJnZWQKLQkgc29tZXdoZXJlIGxhdGVyLiAgQnV0IGZvciBub3cgZG9uJ3QgYm90aGVyLiAgKi8KLSAgICAgICYmIGFoLT5nb3RfZW50cmllcykKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoZHlub2JqLCAiLnBsdCIpOwotICAgICAgaWYgKCFzICYmICFlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoZHlub2JqLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBiaXQgb2YgdGhlIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUgbm90Ci0JIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGUgbG9jYXRpb24KLQkgaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZQotCSBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPnBsdC5vZmZzZXQ7Ci0JfQotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgYSBKTVBfU0xPVCBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gIFRoZSBBbHBoYSwgc2luY2UgaXQgdXNlcyAuZ290IGVudHJpZXMgZm9yIGFsbAotICAgICBzeW1ib2xzIGV2ZW4gaW4gcmVndWxhciBvYmplY3RzLCBkb2VzIG5vdCBuZWVkIHRoZSBoYWNrZXJ5IG9mIGEKLSAgICAgLmR5bmJzcyBzZWN0aW9uIGFuZCBDT1BZIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTeW1ib2wgdmVyc2lvbmluZyBjYW4gY3JlYXRlIG5ldyBzeW1ib2xzLCBhbmQgbWFrZSBvdXIgb2xkIHN5bWJvbHMKLSAgIGluZGlyZWN0IHRvIHRoZSBuZXcgb25lcy4gIENvbnNvbGlkYXRlIHRoZSBnb3QgYW5kIHJlbG9jIGluZm9ybWF0aW9uCi0gICBpbiB0aGVzZSBzaXR1YXRpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzIChoaSwgZHVtbXkpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKLSAgICAgUFRSIGR1bW15OwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHM7Ci0KLSAgaWYgKGhpLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotICBocyA9IGhpOwotICBkbyB7Ci0gICAgaHMgPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKilocy0+cm9vdC5yb290LnUuaS5saW5rOwotICB9IHdoaWxlIChocy0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0KLSAgLyogTWVyZ2UgdGhlIGZsYWdzLiAgV2hlZS4gICovCi0KLSAgaHMtPmZsYWdzIHw9IGhpLT5mbGFnczsKLQotICAvKiBNZXJnZSB0aGUgLmdvdCBlbnRyaWVzLiAgQ2FubmliYWxpemUgdGhlIG9sZCBzeW1ib2wncyBsaXN0IGluCi0gICAgIGRvaW5nIHNvLCBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUuICAqLwotCi0gIGlmIChocy0+Z290X2VudHJpZXMgPT0gTlVMTCkKLSAgICBocy0+Z290X2VudHJpZXMgPSBoaS0+Z290X2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ2ksICpncywgKmdpbiwgKmdzaDsKLQotICAgICAgZ3NoID0gaHMtPmdvdF9lbnRyaWVzOwotICAgICAgZm9yIChnaSA9IGhpLT5nb3RfZW50cmllczsgZ2kgOyBnaSA9IGdpbikKLQl7Ci0JICBnaW4gPSBnaS0+bmV4dDsKLQkgIGZvciAoZ3MgPSBnc2g7IGdzIDsgZ3MgPSBncy0+bmV4dCkKLQkgICAgaWYgKGdpLT5nb3RvYmogPT0gZ3MtPmdvdG9iaiAmJiBnaS0+YWRkZW5kID09IGdzLT5hZGRlbmQpCi0JICAgICAgZ290byBnb3RfZm91bmQ7Ci0JICBnaS0+bmV4dCA9IGhzLT5nb3RfZW50cmllczsKLQkgIGhzLT5nb3RfZW50cmllcyA9IGdpOwotCWdvdF9mb3VuZDo7Ci0JfQotICAgIH0KLSAgaGktPmdvdF9lbnRyaWVzID0gTlVMTDsKLQotICAvKiBBbmQgc2ltaWxhciBmb3IgdGhlIHJlbG9jIGVudHJpZXMuICAqLwotCi0gIGlmIChocy0+cmVsb2NfZW50cmllcyA9PSBOVUxMKQotICAgIGhzLT5yZWxvY19lbnRyaWVzID0gaGktPnJlbG9jX2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyaSwgKnJzLCAqcmluLCAqcnNoOwotCi0gICAgICByc2ggPSBocy0+cmVsb2NfZW50cmllczsKLSAgICAgIGZvciAocmkgPSBoaS0+cmVsb2NfZW50cmllczsgcmkgOyByaSA9IHJpbikKLQl7Ci0JICByaW4gPSByaS0+bmV4dDsKLQkgIGZvciAocnMgPSByc2g7IHJzIDsgcnMgPSBycy0+bmV4dCkKLQkgICAgaWYgKHJpLT5ydHlwZSA9PSBycy0+cnR5cGUpCi0JICAgICAgewotCQlycy0+Y291bnQgKz0gcmktPmNvdW50OwotCQlnb3RvIGZvdW5kX3JlbG9jOwotCSAgICAgIH0KLQkgIHJpLT5uZXh0ID0gaHMtPnJlbG9jX2VudHJpZXM7Ci0JICBocy0+cmVsb2NfZW50cmllcyA9IHJpOwotCWZvdW5kX3JlbG9jOjsKLQl9Ci0gICAgfQotICBoaS0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElzIGl0IHBvc3NpYmxlIHRvIG1lcmdlIHR3byBvYmplY3QgZmlsZSdzIC5nb3QgdGFibGVzPyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzIChhLCBiKQotICAgICBiZmQgKmEsICpiOwotewotICBpbnQgdG90YWwgPSBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllczsKLSAgYmZkICpic3ViOwotCi0gIC8qIFRyaXZpYWwgcXVpY2sgZmFsbG91dCB0ZXN0LiAgKi8KLSAgaWYgKHRvdGFsICsgYWxwaGFfZWxmX3RkYXRhIChiKS0+dG90YWxfZ290X2VudHJpZXMgPD0gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEJ5IHRoZWlyIG5hdHVyZSwgbG9jYWwgLmdvdCBlbnRyaWVzIGNhbm5vdCBiZSBtZXJnZWQuICAqLwotICBpZiAoKHRvdGFsICs9IGFscGhhX2VsZl90ZGF0YSAoYiktPm5fbG9jYWxfZ290X2VudHJpZXMpID4gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGYWlsaW5nIHRoZSBjb21tb24gdHJpdmlhbCBjb21wYXJpc29uLCB3ZSBtdXN0IGVmZmVjdGl2ZWx5Ci0gICAgIHBlcmZvcm0gdGhlIG1lcmdlLiAgTm90IGFjdHVhbGx5IHBlcmZvcm1pbmcgdGhlIG1lcmdlIG1lYW5zIHRoYXQKLSAgICAgd2UgZG9uJ3QgaGF2ZSB0byBzdG9yZSB1bmRvIGluZm9ybWF0aW9uIGluIGNhc2Ugd2UgZmFpbC4gICovCi0gIGZvciAoYnN1YiA9IGI7IGJzdWIgOyBic3ViID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHI7Ci0gICAgICBpbnQgaSwgbjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmFlLCAqYmU7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGhhc2hlc1tpXTsKLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBmb3IgKGJlID0gaC0+Z290X2VudHJpZXM7IGJlIDsgYmUgPSBiZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChiZS0+dXNlX2NvdW50ID09IDApCi0JICAgICAgICBjb250aW51ZTsKLQkgICAgICBpZiAoYmUtPmdvdG9iaiAhPSBiKQotCSAgICAgICAgY29udGludWU7Ci0KLQkgICAgICBmb3IgKGFlID0gaC0+Z290X2VudHJpZXM7IGFlIDsgYWUgPSBhZS0+bmV4dCkKLQkgICAgICAgIGlmIChhZS0+Z290b2JqID09IGEgJiYgYWUtPmFkZGVuZCA9PSBiZS0+YWRkZW5kKQotCQkgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCi0JICAgICAgaWYgKCsrdG90YWwgPiBNQVhfR09UX0VOVFJJRVMpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY3R1YWxseSBtZXJnZSB0d28gLmdvdCB0YWJsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyAoYSwgYikKLSAgICAgYmZkICphLCAqYjsKLXsKLSAgaW50IHRvdGFsID0gYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXM7Ci0gIGJmZCAqYnN1YjsKLQotICAvKiBSZW1lbWJlciBsb2NhbCBleHBhbnNpb24uICAqLwotICB7Ci0gICAgaW50IGUgPSBhbHBoYV9lbGZfdGRhdGEgKGIpLT5uX2xvY2FsX2dvdF9lbnRyaWVzOwotICAgIHRvdGFsICs9IGU7Ci0gICAgYWxwaGFfZWxmX3RkYXRhIChhKS0+bl9sb2NhbF9nb3RfZW50cmllcyArPSBlOwotICB9Ci0KLSAgZm9yIChic3ViID0gYjsgYnN1YiA7IGJzdWIgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgICAgaW50IGksIG47Ci0KLSAgICAgIC8qIExldCB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGtub3cgdGhleSBhcmUgcGFydCBvZiBhIG5ldyBzdWJzZWdtZW50LiAgKi8KLSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBpZiAobG9jYWxfZ290X2VudHJpZXMpCi0gICAgICAgIHsKLQkgIG4gPSBlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0JICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmVudDsKLQkgICAgICBmb3IgKGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2ldOyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKLQkgICAgICAgIGVudC0+Z290b2JqID0gYTsKLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIE1lcmdlIHRoZSBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgICAgIGhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkcjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0gICAgICAgIHsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICphZSwgKmJlLCAqKnBiZSwgKipzdGFydDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gaGFzaGVzW2ldOwotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIHN0YXJ0ID0gJmgtPmdvdF9lbnRyaWVzOwotCSAgZm9yIChwYmUgPSBzdGFydCwgYmUgPSAqc3RhcnQ7IGJlIDsgcGJlID0gJmJlLT5uZXh0LCBiZSA9IGJlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGJlLT51c2VfY291bnQgPT0gMCkKLQkgICAgICAgIHsKLQkJICAqcGJlID0gYmUtPm5leHQ7Ci0JCSAgY29udGludWU7Ci0JICAgICAgICB9Ci0JICAgICAgaWYgKGJlLT5nb3RvYmogIT0gYikKLQkgICAgICAgIGNvbnRpbnVlOwotCi0JICAgICAgZm9yIChhZSA9ICpzdGFydDsgYWUgOyBhZSA9IGFlLT5uZXh0KQotCSAgICAgICAgaWYgKGFlLT5nb3RvYmogPT0gYSAmJiBhZS0+YWRkZW5kID09IGJlLT5hZGRlbmQpCi0JCSAgewotCQkgICAgYWUtPmZsYWdzIHw9IGJlLT5mbGFnczsKLQkJICAgIGFlLT51c2VfY291bnQgKz0gYmUtPnVzZV9jb3VudDsKLQkJICAgICpwYmUgPSBiZS0+bmV4dDsKLQkJICAgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCQkgIH0KLQkgICAgICBiZS0+Z290b2JqID0gYTsKLQkgICAgICB0b3RhbCArPSAxOwotCi0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5nb3RvYmogPSBhOwotICAgIH0KLSAgYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXMgPSB0b3RhbDsKLQotICAvKiBNZXJnZSB0aGUgdHdvIGluX2dvdCBjaGFpbnMuICAqLwotICB7Ci0gICAgYmZkICpuZXh0OwotCi0gICAgYnN1YiA9IGE7Ci0gICAgd2hpbGUgKChuZXh0ID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkgIT0gTlVMTCkKLSAgICAgIGJzdWIgPSBuZXh0OwotCi0gICAgYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCA9IGI7Ci0gIH0KLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIGZvciB0aGUgZ290IGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sIChoLCBhcmcpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgYXJnOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gIGZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotICAgIGlmIChnb3RlbnQtPnVzZV9jb3VudCA+IDApCi0gICAgICB7Ci0JYmZkX3NpemVfdHlwZSAqcGxnZQotCSAgPSAmYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdC0+X3Jhd19zaXplOwotCi0JZ290ZW50LT5nb3Rfb2Zmc2V0ID0gKnBsZ2U7Ci0JKnBsZ2UgKz0gODsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmksICpnb3RfbGlzdCA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKLQotICAvKiBGaXJzdCwgemVybyBvdXQgdGhlIC5nb3Qgc2l6ZXMsIGFzIHdlIG1heSBiZSByZWNhbGN1bGF0aW5nIHRoZQotICAgICAuZ290IGFmdGVyIG9wdGltaXppbmcgaXQuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgLyogTmV4dCwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgYWxsIHRoZSBnbG9iYWwgZW50cmllcy4gICovCi0gIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wsCi0JCQkJTlVMTCk7Ci0KLSAgLyogRmluYWxseSwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgdGhlIGxvY2FsIGVudHJpZXMuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBnb3Rfb2Zmc2V0ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZTsKLSAgICAgIGJmZCAqajsKLQotICAgICAgZm9yIChqID0gaTsgaiA7IGogPSBhbHBoYV9lbGZfdGRhdGEoaiktPmluX2dvdF9saW5rX25leHQpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllcywgKmdvdGVudDsKLQkgIGludCBrLCBuOwotCi0JICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShqKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0JICBpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChrID0gMCwgbiA9IGVsZl90ZGF0YShqKS0+c3ltdGFiX2hkci5zaF9pbmZvOyBrIDwgbjsgKytrKQotCSAgICBmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2tdOyBnb3RlbnQ7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkgICAgICBpZiAoZ290ZW50LT51c2VfY291bnQgPiAwKQotCSAgICAgICAgewotCQkgIGdvdGVudC0+Z290X29mZnNldCA9IGdvdF9vZmZzZXQ7Ci0JCSAgZ290X29mZnNldCArPSA4OwotCSAgICAgICAgfQotCX0KLQotICAgICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IGdvdF9vZmZzZXQ7Ci0gICAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X2Nvb2tlZF9zaXplID0gZ290X29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIENvbnN0cnVjdHMgdGhlIGdvdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaSwgKmdvdF9saXN0LCAqY3VyX2dvdF9vYmo7Ci0gIGludCBzb21ldGhpbmdfY2hhbmdlZCA9IDA7Ci0KLSAgZ290X2xpc3QgPSBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0OwotCi0gIC8qIE9uIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHByZXRlbmQgd2UgaGF2ZSBhbiBleGlzdGluZyBnb3QgbGlzdAotICAgICBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBpbmZvLT5pbnB1dF9iZmRzOyBpIDsgaSA9IGktPmxpbmtfbmV4dCkKLQl7Ci0JICBiZmQgKnRoaXNfZ290ID0gYWxwaGFfZWxmX3RkYXRhIChpKS0+Z290b2JqOwotCSAgaWYgKHRoaXNfZ290ID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBhcmUgYXNzdW1pbmcgbm8gbWVyZ2luZyBoYXMgeWV0IG9jdXJyZWQuICAqLwotCSAgQkZEX0FTU0VSVCAodGhpc19nb3QgPT0gaSk7Ci0KLSAgICAgICAgICBpZiAoYWxwaGFfZWxmX3RkYXRhICh0aGlzX2dvdCktPnRvdGFsX2dvdF9lbnRyaWVzID4gTUFYX0dPVF9FTlRSSUVTKQotCSAgICB7Ci0JICAgICAgLyogWWlrZXMhIEEgc2luZ2xlIG9iamVjdCBmaWxlIGhhcyB0b28gbWFueSBlbnRyaWVzLiAgKi8KLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgIChfKCIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIpLAotCSAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGkpLAotCSAgICAgICAgIGFscGhhX2VsZl90ZGF0YSAodGhpc19nb3QpLT50b3RhbF9nb3RfZW50cmllcyAqIDgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLQkgICAgZ290X2xpc3QgPSB0aGlzX2dvdDsKLQkgIGVsc2UKLQkgICAgYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dCA9IHRoaXNfZ290OwotCSAgY3VyX2dvdF9vYmogPSB0aGlzX2dvdDsKLQl9Ci0KLSAgICAgIC8qIFN0cmFuZ2UgZGVnZW5lcmF0ZSBjYXNlIG9mIG5vIGdvdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0ID0gZ290X2xpc3Q7Ci0KLSAgICAgIC8qIEZvcmNlIGdvdCBvZmZzZXRzIHRvIGJlIHJlY2FsY3VsYXRlZC4gICovCi0gICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IDE7Ci0gICAgfQotCi0gIGN1cl9nb3Rfb2JqID0gZ290X2xpc3Q7Ci0gIGkgPSBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0OwotICB3aGlsZSAoaSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyAoY3VyX2dvdF9vYmosIGkpKQotCXsKLQkgIGVsZjY0X2FscGhhX21lcmdlX2dvdHMgKGN1cl9nb3Rfb2JqLCBpKTsKLQkgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQ7Ci0JICBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0ID0gaTsKLQkgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VyX2dvdF9vYmogPSBpOwotCSAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dDsKLQl9Ci0gICAgfQotCi0gIC8qIE9uY2UgdGhlIGdvdHMgaGF2ZSBiZWVuIG1lcmdlZCwgZmlsbCBpbiB0aGUgZ290IG9mZnNldHMgZm9yCi0gICAgIGV2ZXJ5dGhpbmcgdGhlcmVpbi4gICovCi0gIGlmICgxIHx8IHNvbWV0aGluZ19jaGFuZ2VkKQotICAgIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0LCB0YWtlIGNhcmUgb2YgdGhlIGluZGlyZWN0IHN5bWJvbHMgY3JlYXRlZCBieSB2ZXJzaW9uaW5nLiAgKi8KLSAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzLAotCQkJCU5VTEwpOwotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSAuZ290IHN1YnNlY3Rpb25zLiAgKi8KLSAgaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3Q7Ci0gIGZvciAoIDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnMgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGksIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMgKGgsIGluZm8pCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgLyogSWYgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdAotICAgICBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4gYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZQotICAgICBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbgotICAgICBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbgotICAgICBzZXQuICBUaGlzIGlzIGRvbmUgZm9yIGR5bmFtaWMgc3ltYm9scyBpbgotICAgICBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGJ1dCB0aGlzIGlzIG5vdCBkb25lIGZvciBub24tZHluYW1pYwotICAgICBzeW1ib2xzLCBzb21laG93LiAgKi8KLSAgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0gICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCSAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JICB8IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpKQotICAgICAgID09IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiAhKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSkKLSAgICB7Ci0gICAgICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkeW5hbWljLCB3ZSdsbCBuZWVkIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhlaXIKLSAgICAgbmF0dXJhbCBmb3JtLiAgSWYgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIGFuZCBpdCBoYXMgYmVlbiBmb3JjZWQKLSAgICAgbG9jYWwsIHdlJ2xsIG5lZWQgdGhlIHNhbWUgbnVtYmVyIG9mIFJFTEFUSVZFIHJlbG9jYXRpb25zLiAgKi8KLQotICBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKSB8fCBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVsZW50OwotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBmb3IgKHJlbGVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbGVudDsgcmVsZW50ID0gcmVsZW50LT5uZXh0KQotCWlmIChyZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCSAgICB8fCByZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGUVVBRCkKLQkgIHsKLQkgICAgcmVsZW50LT5zcmVsLT5fcmF3X3NpemUgKz0KLQkgICAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiByZWxlbnQtPmNvdW50OwotCSAgfQotCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICAgICAgY291bnQgPSAwOwotCi0gICAgICBmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQgOyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JY291bnQrKzsKLQotICAgICAgLyogSWYgd2UgYXJlIHVzaW5nIGEgLnBsdCBlbnRyeSwgc3VidHJhY3Qgb25lLCBhcyB0aGUgZmlyc3QKLQkgcmVmZXJlbmNlIHVzZXMgYSAucmVsYS5wbHQgZW50cnkgaW5zdGVhZC4gICovCi0gICAgICBpZiAoaC0+cm9vdC5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKLQljb3VudC0tOwotCi0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCSAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIHdlIGNhbiBkZWNpZGUgd2hpY2gKLQkgc3ltYm9scyBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIGFuZCB3aGljaCBkb24ndC4gIFdlJ3ZlCi0JIGNvbGxlY3RlZCBpbmZvcm1hdGlvbiBpbiBjaGVja19yZWxvY3MgdGhhdCB3ZSBjYW4gbm93IGFwcGx5IHRvCi0JIHNpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCi0gICAgICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzLAotCQkJCSAgICBpbmZvKTsKLQotICAgICAgLyogV2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGxvY2FsIC5nb3QgZW50cnkgbmVlZHMgYQotCSBSRUxBVElWRSByZWxvYy4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIGJmZCAqaTsKLQkgIGFzZWN0aW9uICpzcmVsOwotCSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLQkgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdCwgY291bnQgPSAwOwotCSAgICAgICBpICE9IE5VTEw7Ci0JICAgICAgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0JICAgIGNvdW50ICs9IGFscGhhX2VsZl90ZGF0YShpKS0+bl9sb2NhbF9nb3RfZW50cmllczsKLQotCSAgc3JlbC0+X3Jhd19zaXplICs9IGNvdW50ICogc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCX0KLSAgICB9Ci0gIC8qIGVsc2Ugd2UncmUgbm90IGR5bmFtaWMgYW5kIGJ5IGRlZmluaXRpb24gd2UgZG9uJ3QgbmVlZCBzdWNoIHRoaW5ncy4gICovCi0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoIShzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0JIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQKLQkgaW4gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZQotCSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLiAgVGhlCi0JIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZAotCSBpdCBpcyB0aGF0IGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0bwotCSBnbyBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgc3RyaXAgPSAocy0+X3Jhd19zaXplID09IDApOwotCi0JICBpZiAoIXN0cmlwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBkeW5hbWljIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyhkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzZWMsICpzZ290LCAqc3JlbCwgKnNyZWxnb3Q7Ci0gIGJmZCAqZHlub2JqLCAqZ290b2JqOwotICBiZmRfdm1hIGdwOwotCi0gIHNyZWxnb3QgPSBzcmVsID0gTlVMTDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIGlucHV0IGJmZC4gICovCi0gIHNnb3QgPSBOVUxMOwotICBncCA9IDA7Ci0gIGdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoaW5wdXRfYmZkKS0+Z290b2JqOwotICBpZiAoZ290b2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdG9iaiktPmdvdDsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGdvdG9iaik7Ci0gICAgICBpZiAoZ3AgPT0gMCkKLQl7Ci0JICBncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkrIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoZ290b2JqLCBncCk7Ci0JfQotICAgIH0KLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfQUxQSEFfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmNjRfYWxwaGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLQkgIC8qIFRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIEdQRElTUCBhbmQgTElUVVNFIGlzIAotCSAgICAgaW1tYXRlcmlhbC4gIE9ubHkgdGhlIGFkZGVuZCBpcyBzaWduaWZpY2FudC4gICovCi0JICBpZiAocl90eXBlID09IFJfQUxQSEFfR1BESVNQIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVFVTRSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCi0jaWYgcnRoX25vdGRlZgotCSAgICAgIGlmICgocl90eXBlID09IFJfQUxQSEFfTElURVJBTAotCQkgICAmJiBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICYmICghaW5mby0+c2hhcmVkCi0JCSAgICAgICB8fCAhaW5mby0+c3ltYm9saWMKLQkJICAgICAgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoIWluZm8tPnN5bWJvbGljCi0JCQkgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCQkgICAgICAmJiAocl90eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9SRUZRVUFECi0JCQkgIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCQkgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcwotCQkgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotI2Vsc2UKLQkgICAgICAvKiBGSVhNRTogQXJlIG5vdCB0aGVzZSBvYnNjdXJlIGNhc2VzIHNpbXBseSBidWdzPyAgTGV0J3MKLQkJIGdldCBzb21ldGhpbmcgd29ya2luZyBhbmQgY29tZSBiYWNrIHRvIHRoaXMuICAqLwotCSAgICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXJlbG9jYXRpb24gPSAwOwotI2VuZGlmIC8qIHJ0aF9ub3RkZWYgKi8KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMKLQkJICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+cm9vdC5vdGhlcikgPT0gU1RWX0RFRkFVTFQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwKLQkJICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQKLQkJICAgICAgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPnJvb3Qub3RoZXIpKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0dQRElTUDoKLQkgIHsKLQkgICAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0JICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0KLQkgICAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHBfbGRhaCA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcF9sZGEgPSBwX2xkYWggKyByZWwtPnJfYWRkZW5kOwotCi0JICAgIHIgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGlucHV0X2JmZCwgZ3AgLSByZWxvY2F0aW9uLAotCQkJCQkgICAgIHBfbGRhaCwgcF9sZGEpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfT1BfUFVTSDoKLQljYXNlIFJfQUxQSEFfT1BfU1RPUkU6Ci0JY2FzZSBSX0FMUEhBX09QX1BTVUI6Ci0JY2FzZSBSX0FMUEhBX09QX1BSU0hJRlQ6Ci0JICAvKiBXZSBoYXRlIHRoZXNlIHNpbGx5IGJlYXN0cy4gICovCi0JICBhYm9ydCgpOwotCi0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGJvb2xlYW4gZHluYW1pY19zeW1ib2w7Ci0KLQkgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKLQkJZHluYW1pY19zeW1ib2wgPSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZ290ZW50ID0gKGFscGhhX2VsZl90ZGF0YShpbnB1dF9iZmQpLT4KLQkJCSAgbG9jYWxfZ290X2VudHJpZXNbcl9zeW1uZHhdKTsKLQkJZHluYW1pY19zeW1ib2wgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgQkZEX0FTU0VSVChnb3RlbnQgIT0gTlVMTCk7Ci0KLQkgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBhZGRlbmQpCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50LT51c2VfY291bnQgPj0gMSk7Ci0KLQkgICAgLyogSW5pdGlhbGl6ZSB0aGUgLmdvdCBlbnRyeSdzIHZhbHVlLiAgKi8KLQkgICAgaWYgKCEoZ290ZW50LT5mbGFncyAmIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUpKQotCSAgICAgIHsKLQkJYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbithZGRlbmQsCi0JCQkgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JCS8qIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZm9yY2VkIGxvY2FsLCBvdXRwdXQgYQotCQkgICBSRUxBVElWRSByZWxvYywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBpbgotCQkgICBmaW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCQlpZiAoaW5mby0+c2hhcmVkICYmICFkeW5hbWljX3N5bWJvbCkKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgIEJGRF9BU1NFUlQoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCSAgICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KyspOwotCQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpCi0JCQkJKiBzcmVsZ290LT5yZWxvY19jb3VudAotCQkJCTw9IHNyZWxnb3QtPl9jb29rZWRfc2l6ZSk7Ci0JCSAgfQotCi0JCWdvdGVudC0+ZmxhZ3MgfD0gQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORTsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIHRoZSBncHJlbCByZWxvY2F0aW9uLiAgKi8KLQkgICAgYWRkZW5kID0gMDsKLQkgICAgcmVsb2NhdGlvbiA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICB9Ci0JICAvKiBvdmVyZmxvdyBoYW5kbGVkIGJ5IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAqLwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQkgIGFkZGVuZCA9IDA7Ci0JICByZWxvY2F0aW9uID0gKCgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj4gMTYpCi0JCQkrICgocmVsb2NhdGlvbiA+PiAxNSkgJiAxKSk7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfQlJBRERSOgotCWNhc2UgUl9BTFBIQV9ISU5UOgotCSAgLyogVGhlIHJlZ3VsYXIgUEMtcmVsYXRpdmUgc3R1ZmYgbWVhc3VyZXMgZnJvbSB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0aGUgZW5kLiAgKi8KLQkgIGFkZGVuZCAtPSA0OwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgYm9vbGVhbiBza2lwOwotCi0JICAgIC8qIENhcmVmdWwgaGVyZSB0byByZW1lbWJlciBSRUxBVElWRSByZWxvY2F0aW9ucyBmb3IgZ2xvYmFsCi0JICAgICAgIHZhcmlhYmxlcyBmb3Igc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuICAqLwotCi0JICAgIGlmIChoICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykpCi0JICAgICAgewotCQlCRkRfQVNTRVJUKGgtPnJvb3QuZHluaW5keCAhPSAtMSk7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+cm9vdC5keW5pbmR4LCByX3R5cGUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSBhZGRlbmQ7Ci0JCWFkZGVuZCA9IDAsIHJlbG9jYXRpb24gPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykpCi0JICAgICAgewotCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCSAgICBpZiAoIXNyZWwpCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwgZWxmX2VsZmhlYWRlcihpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJIGVsZl9zZWN0aW9uX2RhdGEoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQlCRkRfQVNTRVJUKG5hbWUgIT0gTlVMTCk7Ci0KLQkJc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQlCRkRfQVNTRVJUKHNyZWwgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF92bWEgb2ZmOwotCi0JCW9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJICAgICAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQlpbnB1dF9zZWN0aW9uLAotCQkJJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQlyZWwtPnJfb2Zmc2V0KSk7Ci0JCWlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgIHNraXAgPSB0cnVlOwotCQlvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JICAgICAgfQotCi0JICAgIGlmICghIHNraXApCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICBlbHNlCi0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQotCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJc3JlbC0+Y29udGVudHMpCi0JCQkJICAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7Ci0JICAgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCQk8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCSAgfQotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JZGVmYXVsdDoKLQlkZWZhdWx0X3JlbG9jOgotCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHJlbG9jYXRpb24sCi0JCQkJCWFkZGVuZCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocikKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICgqbmFtZSA9PSAnXDAnKQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgICAgfQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSAucGx0IGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBhc2VjdGlvbiAqc3BsdCwgKnNnb3QsICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotICAgICAgYmZkX3ZtYSBnb3RfYWRkciwgcGx0X2FkZHI7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgLmdvdCBlbnRyeSB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIC5wbHQgd2l0aCB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KLSAgICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmdvdF9lbnRyaWVzOwotICAgICAgQkZEX0FTU0VSVCAoZ290ZW50ICYmIGdvdGVudC0+YWRkZW5kID09IDApOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQotICAgICAgZ290X2FkZHIgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLSAgICAgIHBsdF9hZGRyID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICArIGgtPnBsdC5vZmZzZXQpOwotCi0gICAgICBwbHRfaW5kZXggPSAoaC0+cGx0Lm9mZnNldCAtIFBMVF9IRUFERVJfU0laRSkgLyBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnNuMSwgaW5zbjIsIGluc24zOwotCi0JaW5zbjEgPSBQTFRfRU5UUllfV09SRDEgfCAoKC0oaC0+cGx0Lm9mZnNldCArIDQpID4+IDIpICYgMHgxZmZmZmYpOwotCWluc24yID0gUExUX0VOVFJZX1dPUkQyOwotCWluc24zID0gUExUX0VOVFJZX1dPUkQzOwotCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjEsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7Ci0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjIsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24zLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKLSAgICAgIH0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCA9IGdvdF9hZGRyOwotICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyhoLT5keW5pbmR4LCBSX0FMUEhBX0pNUF9TTE9UKTsKLSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCi0JCQkJICArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cmllcyBpbiB0aGUgLmdvdC4gICovCi0gICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBwbHRfYWRkciwgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBTdWJzZXF1ZW50IC5nb3QgZW50cmllcyB3aWxsIGNvbnRpbnVlIHRvIGJvdW5jZSB0aHJvdWdoIHRoZSAucGx0LiAgKi8KLSAgICAgIGlmIChnb3RlbnQtPm5leHQpCi0JewotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKCEgaW5mby0+c2hhcmVkIHx8IHNyZWwgIT0gTlVMTCk7Ci0KLQkgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGdvdGVudC0+Z290b2JqKS0+Z290OwotCSAgICAgIEJGRF9BU1NFUlQoc2dvdCAhPSBOVUxMKTsKLQkgICAgICBCRkRfQVNTRVJUKGdvdGVudC0+YWRkZW5kID09IDApOwotCi0JICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsCi0JCSAgICAgICAgICBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotCQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgIHNyZWwtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7Ci0JCSAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JCX0KLQotCSAgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQkgICAgfQotICAgICAgICAgIHdoaWxlIChnb3RlbnQgIT0gTlVMTCk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKGgsIGluZm8pKQotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc3ltYm9sJ3MgLmdvdCBlbnRyaWVzLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfQUxQSEFfR0xPQl9EQVQpOwotICAgICAgZm9yIChnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKLQkgICBnb3RlbnQgIT0gTlVMTDsKLQkgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JewotCSAgYXNlY3Rpb24gKnNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OwotCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkgIG91dHJlbC5yX2FkZGVuZCA9IGdvdGVudC0+YWRkZW5kOwotCi0JICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopc3JlbC0+Y29udGVudHMKLQkJCQkgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspKTsKLQkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JfQotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgICAgZ290byBnZXRfc2l6ZTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICAvKiBNeSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVElTIHYxLjEgRUxGIGRvY3VtZW50IGluZGljYXRlcwotCQkgdGhhdCBSRUxBU1ogc2hvdWxkIG5vdCBpbmNsdWRlIEpNUFJFTC4gIFRoaXMgaXMgbm90IHdoYXQKLQkJIHRoZSByZXN0IG9mIHRoZSBCRkQgZG9lcy4gIEl0IGlzLCBob3dldmVyLCB3aGF0IHRoZQotCQkgZ2xpYmMgbGQuc28gd2FudHMuICBEbyB0aGlzIGZpeHVwIGhlcmUgdW50aWwgd2UgZm91bmQKLQkJIG91dCB3aG8gaXMgcmlnaHQuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIGlmIChzKQotCQl7Ci0JCSAgZHluLmRfdW4uZF92YWwgLT0KLQkJICAgIChzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gKHMgPyBzLT52bWEgOiAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBnZXRfc2l6ZToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KLQkJKHMtPl9jb29rZWRfc2l6ZSA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIFBMVDAgZW50cnkgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDEsIHNwbHQtPmNvbnRlbnRzKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDIsIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQzLCBzcGx0LT5jb250ZW50cyArIDgpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JENCwgc3BsdC0+Y29udGVudHMgKyAxMik7Ci0KLQkgIC8qIFRoZSBuZXh0IHR3byB3b3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBieSBsZC5zbyAqLwotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAxNik7Ci0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAwLCBzcGx0LT5jb250ZW50cyArIDI0KTsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0KLQkgICAgUExUX0hFQURFUl9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotI2lmIDAKLQkgICAgICBpZiAoKytuZ290cyA9PSAyKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksIChjaGFyICopIE5VTEwsCi0JCSAgICAgb3V0cHV0X2JmZCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJfQotI2VuZGlmCi0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotCXsKLQkgIG1lbXNldCAoJnJlZ2luZm8sIDAsIHNpemVvZiByZWdpbmZvKTsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0JICAgICAgRWxmNjRfUmVnSW5mbyBzdWI7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIFRoZSBsaW5rZXIgZW11bGF0aW9uIGNvZGUgaGFzIHByb2JhYmx5IGNsb2JiZXJlZCB0aGUKLSAgICAgICAgICAgICAgICAgc2l6ZSB0byBiZSB6ZXJvIGJ5dGVzLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgKFBUUikgJmV4dCwKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkgICAgICBzaXplb2YgZXh0KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBhbHBoYV9lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIHdoZW4gdGhlIHNlY3Rpb24gaXMKLQkJIGZpbmFsbHkgd3JpdHRlbiBvdXQuICAqLwotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlIHdlIHdhbnQuICAqLwotCSAgby0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKDEpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQkgICAgICBFWFRSIGVzeW07Ci0JICAgICAgYmZkX3ZtYSBsYXN0OwotCSAgICAgIHVuc2lnbmVkIGludCBpOwotCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZVtdID0KLQkJewotCQkgICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgIi5yb2RhdGEiLCAiLnNkYXRhIiwgIi5zYnNzIiwgIi5ic3MiCi0JCX07Ci0JICAgICAgc3RhdGljIGNvbnN0IGludCBzY1tdID0geyBzY1RleHQsIHNjSW5pdCwgc2NGaW5pLCBzY0RhdGEsCi0JCQkJCSAgc2NSRGF0YSwgc2NTRGF0YSwgc2NTQnNzLCBzY0JzcyB9OwotCi0JICAgICAgZXN5bS5qbXB0YmwgPSAwOwotCSAgICAgIGVzeW0uY29ib2xfbWFpbiA9IDA7Ci0JICAgICAgZXN5bS53ZWFrZXh0ID0gMDsKLQkgICAgICBlc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgICAgICBlc3ltLmFzeW0uaXNzID0gaXNzTmlsOwotCSAgICAgIGVzeW0uYXN5bS5zdCA9IHN0TG9jYWw7Ci0JICAgICAgZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCSAgZXN5bS5hc3ltLnNjID0gc2NbaV07Ci0JCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lW2ldKTsKLQkJICBpZiAocyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBlc3ltLmFzeW0udmFsdWUgPSBzLT52bWE7Ci0JCSAgICAgIGxhc3QgPSBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZXN5bS5hc3ltLnZhbHVlID0gbGFzdDsKLQotCQkgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsICZkZWJ1Zywgc3dhcCwKLQkJCQkJCSAgICAgIG5hbWVbaV0sICZlc3ltKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0JICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gaW5wdXRfZGVidWc7Ci0JICAgICAgY2hhciAqZXJhd19zcmM7Ci0JICAgICAgY2hhciAqZXJhd19lbmQ7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgIHx8IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkgICAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApID09IE5VTEwpCi0JCXsKLQkJICAvKiBJIGRvbid0IGtub3cgd2hhdCBhIG5vbiBBTFBIQSBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLQkgICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0JICAgICAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJICAgIHwgU0VDX1JFQURPTkxZKTsKLQotCQkgIHJ0cHJvY19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJ0cHJvYyIpOwotCQkgIGlmIChydHByb2Nfc2VjID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJ0cHJvY19zZWMsIGZsYWdzKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJ0cHJvY19zZWMsIDEyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgYWxwaGFfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotI2VuZGlmCi0KLQotCSAgLyogQnVpbGQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0JICBlaW5mby5hYmZkID0gYWJmZDsKLQkgIGVpbmZvLmluZm8gPSBpbmZvOwotCSAgZWluZm8uZGVidWcgPSAmZGVidWc7Ci0JICBlaW5mby5zd2FwID0gc3dhcDsKLQkgIGVpbmZvLmZhaWxlZCA9IGZhbHNlOwotCSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSwKLQkJCQkgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmNjRfZ3B0YWIgKnRhYjsKLQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmNjRfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGY2NF9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9pbiAoaW5wdXRfYmZkLCAmZXh0X2dwdGFiLAotCQkJCQkJJmludF9ncHRhYik7Ci0JCSAgdmFsID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci0JCSAgYWRkID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzIC0gbGFzdDsKLQotCQkgIGV4YWN0ID0gZmFsc2U7Ci0JCSAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID49IHZhbCkKLQkJCXRhYltsb29rXS5ndF9lbnRyeS5ndF9ieXRlcyArPSBhZGQ7Ci0KLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID09IHZhbCkKLQkJCWV4YWN0ID0gdHJ1ZTsKLQkJICAgIH0KLQotCQkgIGlmICghIGV4YWN0KQotCQkgICAgewotCQkgICAgICBFbGY2NF9ncHRhYiAqbmV3X3RhYjsKLQkJICAgICAgdW5zaWduZWQgaW50IG1heDsKLQotCQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IHRhYmxlIGVudHJ5LiAgKi8KLQkJICAgICAgbmV3X3RhYiA9ICgoRWxmNjRfZ3B0YWIgKikKLQkJCQkgYmZkX3JlYWxsb2MgKChQVFIpIHRhYiwKLQkJCQkJICAgICAgKGMgKyAxKSAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKSk7Ci0JCSAgICAgIGlmIChuZXdfdGFiID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHRhYik7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgdGFiID0gbmV3X3RhYjsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSB2YWw7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyA9IGFkZDsKLQotCQkgICAgICAvKiBNZXJnZSBpbiB0aGUgc2l6ZSBmb3IgdGhlIG5leHQgc21hbGxlc3QgLUcKLQkJCSB2YWx1ZSwgc2luY2UgdGhhdCB3aWxsIGJlIGltcGxpZWQgYnkgdGhpcyBuZXcKLQkJCSB2YWx1ZS4gICovCi0JCSAgICAgIG1heCA9IDA7Ci0JCSAgICAgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCQl7Ci0JCQkgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA8IHZhbAotCQkJICAgICAgJiYgKG1heCA9PSAwCi0JCQkJICB8fCAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUKLQkJCQkgICAgICA+IHRhYlttYXhdLmd0X2VudHJ5Lmd0X2dfdmFsdWUpKSkKLQkJCSAgICBtYXggPSBsb29rOwotCQkJfQotCQkgICAgICBpZiAobWF4ICE9IDApCi0JCQl0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0KLQkJCSAgdGFiW21heF0uZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0KLQkJICAgICAgKytjOwotCQkgICAgfQotCi0JCSAgbGFzdCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlczsKLQkJfQotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB0YWJsZSBtdXN0IGJlIHNvcnRlZCBieSAtRyB2YWx1ZS4gICovCi0JICBpZiAoYyA+IDIpCi0JICAgIHFzb3J0ICh0YWIgKyAxLCBjIC0gMSwgc2l6ZW9mICh0YWJbMF0pLCBncHRhYl9jb21wYXJlKTsKLQotCSAgLyogU3dhcCBvdXQgdGhlIHRhYmxlLiAgKi8KLQkgIGV4dF90YWIgPSAoKEVsZjY0X0V4dGVybmFsX2dwdGFiICopCi0JCSAgICAgYmZkX2FsbG9jIChhYmZkLCBjICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYikpKTsKLQkgIGlmIChleHRfdGFiID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlICh0YWIpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCSAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSNlbmRpZgotCi0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIC8qIFRoZSAuZ290IHN1YnNlY3Rpb25zLi4uICAqLwotICB7Ci0gICAgYmZkICppLCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0JIGkgIT0gTlVMTDsKLQkgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2dvdDsKLQotCS8qIGVsZl9iZmRfZmluYWxfbGluayBhbHJlYWR5IGRpZCBldmVyeXRoaW5nIGluIGR5bm9iai4gICovCi0JaWYgKGkgPT0gZHlub2JqKQotCSAgY29udGludWU7Ci0KLQlzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0JaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZ290LT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJc2dvdC0+Y29udGVudHMsIHNnb3QtPm91dHB1dF9vZmZzZXQsCi0JCQkJCXNnb3QtPl9yYXdfc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCi0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAotCQkJCQkgICAgICAgc3dhcCwgaW5mbywKLQkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0gICAgfQotCi0gIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgQ29waWVkCi0gICBmcm9tIGVsZjMyLW1pcHMuYy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGY2NF9hbHBoYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGY2NC1hbHBoYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2FscGhhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgCUVNX0FMUEhBCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAJMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KLQotI2RlZmluZSBiZmRfZWxmNjRfbWtvYmplY3QgXAotICBlbGY2NF9hbHBoYV9ta29iamVjdAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIGVsZjY0X2FscGhhX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIgXAotICBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCi0gIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIFwKLSAgZWxmNjRfYWxwaGFfZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAgXAotICAmZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcAotCi0vKgotICogQSBmZXcgY29uc3RhbnRzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgLnBsdCBzZWN0aW9uIGlzIHNldCB1cC4KLSAqLwotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1nZW4uYyBiL2JmZC9lbGY2NC1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYzA5ZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1ocHBhLmMgYi9iZmQvZWxmNjQtaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI5ZjdmLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMzICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGY2NC1ocHBhLmgiCi0jZGVmaW5lIEFSQ0hfU0laRQkgICAgICAgNjQKLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAweDEwCi0jZGVmaW5lIERMVF9FTlRSWV9TSVpFIDB4OAotI2RlZmluZSBPUERfRU5UUllfU0laRSAweDIwCi0gCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9wYTIwXzY0L2RsZC5zbCIKLQotLyogVGhlIHN0dWIgaXMgc3VwcG9zZWQgdG8gbG9hZCB0aGUgdGFyZ2V0IGFkZHJlc3MgYW5kIHRhcmdldCdzIERQCi0gICB2YWx1ZSBvdXQgb2YgdGhlIFBMVCwgdGhlbiBkbyBhbiBleHRlcm5hbCBicmFuY2ggdG8gdGhlIHRhcmdldAotICAgYWRkcmVzcy4KLQotICAgTEREIFBMVE9GRiglcjI3KSwlcjEKLSAgIEJWRSAoJXIxKQotICAgTEREIFBMVE9GRis4KCVyMjcpLCVyMjcKLQotICAgTm90ZSB0aGF0IHdlIG11c3QgdXNlIHRoZSBMREQgd2l0aCBhIDE0IGJpdCBkaXNwbGFjZW1lbnQsIG5vdCB0aGUgb25lCi0gICB3aXRoIGEgNSBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLXN0YXRpYyBjaGFyIHBsdF9zdHViW10gPSB7MHg1MywgMHg2MSwgMHgwMCwgMHgwMCwgMHhlOCwgMHgyMCwgMHhkMCwgMHgwMCwKLQkJCSAgMHg1MywgMHg3YiwgMHgwMCwgMHgwMCB9OwotCi1zdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBPZmZzZXRzIGZvciB0aGlzIHN5bWJvbCBpbiB2YXJpb3VzIGxpbmtlciBzZWN0aW9ucy4gICovCi0gIGJmZF92bWEgZGx0X29mZnNldDsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotICBiZmRfdm1hIG9wZF9vZmZzZXQ7Ci0gIGJmZF92bWEgc3R1Yl9vZmZzZXQ7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBlbnRyeSwgaWYgYW55LCB0aGF0IHRoaXMgd2FzIGRlcnJpdmVkIGZyb20uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAvKiBUaGUgaW5kZXggb2YgdGhlIChwb3NzaWJseSBsb2NhbCkgc3ltYm9sIGluIHRoZSBpbnB1dCBiZmQgYW5kIGl0cwotICAgICBhc3NvY2lhdGVkIEJGRC4gIE5lZWRlZCBzbyB0aGF0IHdlIGNhbiBoYXZlIHJlbG9jcyBhZ2FpbnN0IGxvY2FsCi0gICAgIHN5bWJvbHMgaW4gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3ltX2luZHg7Ci0gIGJmZCAqb3duZXI7Ci0KLSAgLyogRHluYW1pYyBzeW1ib2xzIG1heSBuZWVkIHRvIGhhdmUgdHdvIGRpZmZlcmVudCB2YWx1ZXMuICBPbmUgZm9yCi0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgb25lIGZvciB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQotICAgICBJbiBzdWNoIGNhc2VzIHdlIHN0b3JlIHRoZSBzeW1ib2wncyByZWFsIHZhbHVlIGFuZCBzZWN0aW9uCi0gICAgIGluZGV4IGhlcmUgc28gd2UgY2FuIHJlc3RvcmUgdGhlIHJlYWwgdmFsdWUgYmVmb3JlIHdlIHdyaXRlCi0gICAgIHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX3ZtYSBzdF92YWx1ZTsKLSAgaW50IHN0X3NobmR4OwotCi0gIC8qIFVzZWQgdG8gY291bnQgbm9uLWdvdCwgbm9uLXBsdCByZWxvY2F0aW9ucyBmb3IgZGVsYXllZCBzaXppbmcKLSAgICAgb2YgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCi0gIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9yZWxvY19lbnRyeQotICB7Ci0gICAgLyogTmV4dCByZWxvY2F0aW9uIGluIHRoZSBjaGFpbi4gICovCi0gICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX3JlbG9jX2VudHJ5ICpuZXh0OwotCi0gICAgLyogVGhlIHR5cGUgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICAgIGludCB0eXBlOwotCi0gICAgLyogVGhlIGlucHV0IHNlY3Rpb24gb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAvKiBUaGUgaW5kZXggb2YgdGhlIHNlY3Rpb24gc3ltYm9sIGZvciB0aGUgaW5wdXQgc2VjdGlvbiBvZgotICAgICAgIHRoZSByZWxvY2F0aW9uLiAgT25seSBuZWVkZWQgd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLSAgICBpbnQgc2VjX3N5bW5keDsKLQotICAgIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBpbnB1dCBzZWN0aW9uIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICBiZmRfdm1hIG9mZnNldDsKLQotICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICBiZmRfdm1hIGFkZGVuZDsKLQotICB9ICpyZWxvY19lbnRyaWVzOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBzeW1ib2wgbmVlZHMgYW4gZW50cnkgaW4gb25lIG9mIHRoZSBsaW5rZXIKLSAgICAgc2VjdGlvbnMuICAqLwotICB1bnNpZ25lZCB3YW50X2RsdDsKLSAgdW5zaWduZWQgd2FudF9wbHQ7Ci0gIHVuc2lnbmVkIHdhbnRfb3BkOwotICB1bnNpZ25lZCB3YW50X3N0dWI7Ci19OwotCi1zdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLXN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFNob3J0Y3V0cyB0byBnZXQgdG8gdGhlIHZhcmlvdXMgbGlua2VyIGRlZmluZWQgc2VjdGlvbnMuICAqLwotICBhc2VjdGlvbiAqZGx0X3NlYzsKLSAgYXNlY3Rpb24gKmRsdF9yZWxfc2VjOwotICBhc2VjdGlvbiAqcGx0X3NlYzsKLSAgYXNlY3Rpb24gKnBsdF9yZWxfc2VjOwotICBhc2VjdGlvbiAqb3BkX3NlYzsKLSAgYXNlY3Rpb24gKm9wZF9yZWxfc2VjOwotICBhc2VjdGlvbiAqb3RoZXJfcmVsX3NlYzsKLQotICAvKiBPZmZzZXQgb2YgX19ncCB3aXRoaW4gLnBsdCBzZWN0aW9uLiAgV2hlbiB0aGUgUExUIGdldHMgbGFyZ2Ugd2Ugd2FudAotICAgICB0byBzbGlkZSBfX2dwIGludG8gdGhlIFBMVCBzZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGNvbnRpbnVlIHRvIHVzZQotICAgICBzaW5nbGUgRFAgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHRvIGxvYWQgdmFsdWVzIG91dCBvZiB0aGUgUExULiAgKi8KLSAgYmZkX3ZtYSBncF9vZmZzZXQ7Ci0KLSAgLyogTm90ZSB0aGlzIGlzIG5vdCBzdHJpY3RseSBjb3JyZWN0LiAgV2Ugc2hvdWxkIGNyZWF0ZSBhIHN0dWIgc2VjdGlvbiBmb3IKLSAgICAgZWFjaCBpbnB1dCBzZWN0aW9uIHdpdGggY2FsbHMuICBUaGUgc3R1YiBzZWN0aW9uIHNob3VsZCBiZSBwbGFjZWQgYmVmb3JlCi0gICAgIHRoZSBzZWN0aW9uIHdpdGggdGhlIGNhbGwuICAqLwotICBhc2VjdGlvbiAqc3R1Yl9zZWM7Ci0KLSAgYmZkX3ZtYSB0ZXh0X3NlZ21lbnRfYmFzZTsKLSAgYmZkX3ZtYSBkYXRhX3NlZ21lbnRfYmFzZTsKLQotICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF90YWJsZSBkeW5faGFzaF90YWJsZTsKLQotICAvKiBXZSBidWlsZCB0YWJsZXMgdG8gbWFwIGZyb20gYW4gaW5wdXQgc2VjdGlvbiBiYWNrIHRvIGl0cwotICAgICBzeW1ib2wgaW5kZXguICBUaGlzIGlzIHRoZSBCRkQgZm9yIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlCi0gICAgIGEgbWFwLiAgKi8KLSAgYmZkICpzZWN0aW9uX3N5bXNfYmZkOwotCi0gIC8qIEFycmF5IG9mIHN5bWJvbCBudW1iZXJzIGZvciBlYWNoIGlucHV0IHNlY3Rpb24gYXR0YWNoZWQgdG8gdGhlCi0gICAgIGN1cnJlbnQgQkZELiAgKi8KLSAgaW50ICpzZWN0aW9uX3N5bXM7Ci19OwotCi0jZGVmaW5lIGVsZjY0X2hwcGFfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi10eXBlZGVmIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdfaGFzaF9lbnRyeV9mdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9ocHBhX2R5bl9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGUgKmh0LCBiZmQgKmFiZmQsCi0JICAgbmV3X2hhc2hfZW50cnlfZnVuYyBuZXcpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjY0X2hwcGFfbmV3X2R5bl9oYXNoX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjY0X2hwcGFfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKmVsZjY0X2hwcGFfZHluX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX3RhYmxlICp0YWJsZSwgY29uc3QgY2hhciAqc3RyaW5nLAotCSAgIGJvb2xlYW4gY3JlYXRlLCBib29sZWFuIGNvcHkpKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2hwcGFfZHluX2hhc2hfdHJhdmVyc2UKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGJvb2xlYW4gKCpmdW5jKShzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqLCBQVFIpLAotCSAgIFBUUiBpbmZvKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfZHluX25hbWUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCBjaGFyICoqcGJ1Ziwgc2l6ZV90ICpwbGVuKSk7Ci0KLQotLyogVGhpcyBtdXN0IGZvbGxvdyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHZhcmlvdXMgZGVyaXZlZCBsaW5rZXIKLSAgIGhhc2ggdGFibGVzIGFuZCBzaGFyZWQgZnVuY3Rpb25zLiAgKi8KLSNpbmNsdWRlICJlbGYtaHBwYS5oIgotCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2hwcGFfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQgZWxmNjRfaHBwYV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9ocHBhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2hwcGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0JCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9ocHBhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2hwcGFfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9tYXJrX2V4cG9ydGVkX2Z1bmN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfaHBwYV9maW5hbGl6ZV9vcGQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2hwcGFfZmluYWxpemVfZGx0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBhbGxvY2F0ZV9nbG9iYWxfZGF0YV9kbHQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGFsbG9jYXRlX2dsb2JhbF9kYXRhX3BsdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gYWxsb2NhdGVfZ2xvYmFsX2RhdGFfc3R1YgotICBQQVJBTVMgKChzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gYWxsb2NhdGVfZ2xvYmFsX2RhdGFfb3BkCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBnZXRfcmVsb2Nfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICosIGFzZWN0aW9uICopKTsKLQotc3RhdGljIGJvb2xlYW4gY291bnRfZHluX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqLAotCSAgIGludCwgYXNlY3Rpb24gKiwgaW50LCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBib29sZWFuIGFsbG9jYXRlX2R5bnJlbF9lbnRyaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9ocHBhX2ZpbmFsaXplX2R5bnJlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBnZXRfb3BkCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBnZXRfcGx0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBnZXRfZGx0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBnZXRfc3R1YgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGVfaW5pdCAoaHQsIGFiZmQsIG5ldykKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGUgKmh0OwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5ld19oYXNoX2VudHJ5X2Z1bmMgbmV3OwotewotICBtZW1zZXQgKGh0LCAwLCBzaXplb2YoKmh0KSk7Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmaHQtPnJvb3QsIG5ldyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkqCi1lbGY2NF9ocHBhX25ld19keW5faGFzaF9lbnRyeSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKnJldDsKLSAgcmV0ID0gKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAoIXJldCkKLSAgICByZXQgPSBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoKnJldCkpOwotCi0gIGlmICghcmV0KQotICAgIHJldHVybiAwOwotCi0gIC8qIEluaXRpYWxpemUgb3VyIGxvY2FsIGRhdGEuICBBbGwgemVyb3MsIGFuZCBkZWZpbml0ZWx5IGVhc2llcgotICAgICB0aGFuIHNldHRpbmcgOCBiaXQgZmllbGRzLiAgKi8KLSAgbWVtc2V0IChyZXQsIDAsIHNpemVvZigqcmV0KSk7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSBQQTY0IEVMRiBwb3J0IHVzZXMgdGhpcwotICAgZGVyaXZlZCBoYXNoIHRhYmxlIHRvIGtlZXAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIFBBIEVsRgotICAgbGlua2VyICh3aXRob3V0IHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMpLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlKgotZWxmNjRfaHBwYV9oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCpyZXQpKTsKLSAgaWYgKCFyZXQpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghZWxmNjRfaHBwYV9keW5faGFzaF90YWJsZV9pbml0ICgmcmV0LT5keW5faGFzaF90YWJsZSwgYWJmZCwKLQkJCQkgICAgICAgZWxmNjRfaHBwYV9uZXdfZHluX2hhc2hfZW50cnkpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgUEE2NCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKgotZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGUsIGNvcHk7Ci17Ci0gIHJldHVybiAoKHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICopCi0JICBiZmRfaGFzaF9sb29rdXAgKCZ0YWJsZS0+cm9vdCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpKTsKLX0KLQotLyogVHJhdmVyc2UgYSBQQTY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGY2NF9ocHBhX2R5bl9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0gICAgIFBUUiBpbmZvOwotewotICAoYmZkX2hhc2hfdHJhdmVyc2UKLSAgICgmdGFibGUtPnJvb3QsCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgZnVuYywKLSAgICBpbmZvKSk7Ci19Ci0MCi0vKiBSZXR1cm4gbm9uemVybyBpZiBBQkZEIHJlcHJlc2VudHMgYSBQQTIuMCBFTEY2NCBmaWxlLgotCi0gICBBZGRpdGlvbmFsbHkgd2Ugc2V0IHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaHBwYV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhbiBIUFBBIEVMRiBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2hwcGEsIDI1KTsKLX0KLQotLyogR2l2ZW4gc2VjdGlvbiB0eXBlIChoZHItPnNoX3R5cGUpLCByZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcKLSAgIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0aW9uIGlzIGFuIGVsZjY0LWhwcGEgc3BlY2lmaWMgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaHBwYV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1BBUklTQ19FWFQ6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLlBBUklTQy5hcmNoZXh0IikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9QQVJJU0NfVU5XSU5EOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5QQVJJU0MudW53aW5kIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9QQVJJU0NfRE9DOgotICAgIGNhc2UgU0hUX1BBUklTQ19BTk5PVDoKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdCA9IGhkci0+YmZkX3NlY3Rpb247Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ29uc3RydWN0IGEgc3RyaW5nIGZvciB1c2UgaW4gdGhlIGVsZjY0X2hwcGFfZHluX2hhc2hfdGFibGUuICBUaGUKLSAgIG5hbWUgZGVzY3JpYmVzIHdoYXQgd2FzIG9uY2UgcG90ZW50aWFsbHkgYW5vbnltb3VzIG1lbW9yeS4gIFdlIAotICAgYWxsb2NhdGUgbWVtb3J5IGFzIG5lY2Vzc2FyeSwgcG9zc2libHkgcmV1c2luZyBQQlVGL1BMRU4uICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZHluX25hbWUgKGFiZmQsIGgsIHJlbCwgcGJ1ZiwgcGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgY2hhciAqKnBidWY7Ci0gICAgIHNpemVfdCAqcGxlbjsKLXsKLSAgc2l6ZV90IG5sZW4sIHRsZW47Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAoaCAmJiByZWwtPnJfYWRkZW5kID09IDApCi0gICAgcmV0dXJuIGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0KLSAgaWYgKGgpCi0gICAgbmxlbiA9IHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBubGVuID0gc2l6ZW9mKHZvaWQqKSoyICsgMSArIHNpemVvZihiZmRfdm1hKSo0ICsgMSArIDE7Ci0gICAgICBubGVuICs9IDEwOwkvKiAlcCBzbG9wICovCi0gICAgfQotICB0bGVuID0gbmxlbiArIDEgKyAxNiArIDE7Ci0KLSAgbGVuID0gKnBsZW47Ci0gIGJ1ZiA9ICpwYnVmOwotICBpZiAobGVuIDwgdGxlbikKLSAgICB7Ci0gICAgICBpZiAoYnVmKQotCWZyZWUgKGJ1Zik7Ci0gICAgICAqcGJ1ZiA9IGJ1ZiA9IG1hbGxvYyAodGxlbik7Ci0gICAgICAqcGxlbiA9IGxlbiA9IHRsZW47Ci0gICAgICBpZiAoIWJ1ZikKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGgpCi0gICAgewotICAgICAgbWVtY3B5IChidWYsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIG5sZW4pOwotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiArIG5sZW4sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5sZW4gPSBzcHJpbnRmIChidWYsICIlcDolbHgiLCBhYmZkLCBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pKTsKLSAgICAgIGlmIChyZWwtPnJfYWRkZW5kKQotCXsKLQkgIGJ1ZltubGVuKytdID0gJysnOwotCSAgc3ByaW50Zl92bWEgKGJ1ZiArIG5sZW4sIHJlbC0+cl9hZGRlbmQpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogU0VDIGlzIGEgc2VjdGlvbiBjb250YWluaW5nIHJlbG9jcyBmb3IgYW4gaW5wdXQgQkZEIHdoZW4gbGlua2luZzsgcmV0dXJuCi0gICBhIHN1aXRhYmxlIHNlY3Rpb24gZm9yIGhvbGRpbmcgcmVsb2NzIGluIHRoZSBvdXRwdXQgQkZEIGZvciBhIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2V0X3JlbG9jX3NlY3Rpb24gKGFiZmQsIGhwcGFfaW5mbywgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBjb25zdCBjaGFyICpzcmVsX25hbWU7Ci0gIGFzZWN0aW9uICpzcmVsOwotICBiZmQgKmR5bm9iajsKLQotICBzcmVsX25hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCSAgICAgICAoYWJmZCwgZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCwKLQkJZWxmX3NlY3Rpb25fZGF0YShzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLSAgaWYgKHNyZWxfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBCRkRfQVNTRVJUICgoc3RybmNtcCAoc3JlbF9uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JICAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkgIHNyZWxfbmFtZSs1KSA9PSAwKQotCSAgICAgIHx8IChzdHJuY21wIChzcmVsX25hbWUsICIucmVsIiwgNCkgPT0gMAotCQkgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkgICAgIHNyZWxfbmFtZSs0KSA9PSAwKSk7Ci0KLSAgZHlub2JqID0gaHBwYV9pbmZvLT5yb290LmR5bm9iajsKLSAgaWYgKCFkeW5vYmopCi0gICAgaHBwYV9pbmZvLT5yb290LmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0KLSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIHNyZWxfbmFtZSk7Ci0gIGlmIChzcmVsID09IE5VTEwpCi0gICAgewotICAgICAgc3JlbCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgc3JlbF9uYW1lKTsKLSAgICAgIGlmIChzcmVsID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbCwKLQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsLCAzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhwcGFfaW5mby0+b3RoZXJfcmVsX3NlYyA9IHNyZWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGxpc3Qgb2YgZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IERZTl9ILiAKLQotICAgV2UgdXNlIHRoaXMgdG8ga2VlcCBhIHJlY29yZCBvZiBhbGwgdGhlIEZQVFIgcmVsb2NhdGlvbnMgYWdhaW5zdCBhCi0gICBwYXJ0aWN1bGFyIHN5bWJvbCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgRlBUUiByZWxvY2F0aW9ucyBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvdW50X2R5bl9yZWxvYyAoYWJmZCwgZHluX2gsIHR5cGUsIHNlYywgc2VjX3N5bW5keCwgb2Zmc2V0LCBhZGRlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKmR5bl9oOwotICAgICBpbnQgdHlwZTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgaW50IHNlY19zeW1uZHg7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfZHluX3JlbG9jX2VudHJ5ICpyZW50OwotCi0gIHJlbnQgPSAoc3RydWN0IGVsZjY0X2hwcGFfZHluX3JlbG9jX2VudHJ5ICopCi0gIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqcmVudCkpOwotICBpZiAoIXJlbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbnQtPm5leHQgPSBkeW5faC0+cmVsb2NfZW50cmllczsKLSAgcmVudC0+dHlwZSA9IHR5cGU7Ci0gIHJlbnQtPnNlYyA9IHNlYzsKLSAgcmVudC0+c2VjX3N5bW5keCA9IHNlY19zeW1uZHg7Ci0gIHJlbnQtPm9mZnNldCA9IG9mZnNldDsKLSAgcmVudC0+YWRkZW5kID0gYWRkZW5kOwotICBkeW5faC0+cmVsb2NfZW50cmllcyA9IHJlbnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIFJFTE9DUyBhbmQgcmVjb3JkIHRoZSB0eXBlIG9mIGR5bmFtaWMgZW50cmllcyB0aGF0IGVhY2gKLSAgIHJlZmVyZW5jZWQgc3ltYm9sIG5lZWRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICpocHBhX2luZm87Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBhc2VjdGlvbiAqZGx0LCAqcGx0LCAqc3R1YnM7Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGJ1Zl9sZW47Ci0gIGludCBzZWNfc3ltbmR4OwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gdGhlIGxpbmssIGNyZWF0ZQotICAgICB0aGUgc3BlY2lhbCBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIElmIG5lY2Vzc2FyeSwgYnVpbGQgYSBuZXcgdGFibGUgaG9sZGluZyBzZWN0aW9uIHN5bWJvbHMgaW5kaWNlcwotICAgICBmb3IgdGhpcyBCRkQuICBUaGlzIGlzIGRpc2d1c3RpbmcuICAqLwotIAotICBpZiAoaW5mby0+c2hhcmVkICYmIGhwcGFfaW5mby0+c2VjdGlvbl9zeW1zX2JmZCAhPSBhYmZkKQotICAgIHsKLSAgICAgIGludCBpLCBoaWdoZXN0X3NobmR4OwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLCAqaXN5bTsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1N5bSAqZXh0X3N5bXMsICplc3ltOwotCi0gICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIG9sZCBjYWNoZSBvZiBzZWN0aW9uIGluZGV4IHRvIHNlY3Rpb24gc3ltYm9sCi0JIGluZGV4IGluZm9ybWF0aW9uLiAgRnJlZSBpdC4KLQotCSA/IT8gTm90ZSB3ZSBsZWFrIHRoZSBsYXN0IHNlY3Rpb25fc3ltcyBhcnJheS4gIFByZXN1bWFibHkgd2UKLQkgY291bGQgZnJlZSBpdCBpbiBvbmUgb2YgdGhlIGxhdGVyIHJvdXRpbmVzIGluIHRoaXMgZmlsZS4gICovCi0gICAgICBpZiAoaHBwYV9pbmZvLT5zZWN0aW9uX3N5bXMpCi0JZnJlZSAoaHBwYV9pbmZvLT5zZWN0aW9uX3N5bXMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBsb2NhbF9zeW1zCi0gICAgICAgID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZXh0X3N5bXMKLSAgICAgICAgPSAoRWxmNjRfRXh0ZXJuYWxfU3ltICopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pKTsKLSAgICAgIGlmIChleHRfc3ltcyA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKGxvY2FsX3N5bXMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogUmVhZCBpbiB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICB8fCBiZmRfcmVhZCAoZXh0X3N5bXMsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgIChzeW10YWJfaGRyLT5zaF9pbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSksIGFiZmQpCi0gICAgICAgICAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSkpKQotICAgICAgICB7Ci0JICBmcmVlIChsb2NhbF9zeW1zKTsKLQkgIGZyZWUgKGV4dF9zeW1zKTsKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAvKiBTd2FwIGluIHRoZSBsb2NhbCBzeW1ib2xzLCBhbHNvIHJlY29yZCB0aGUgaGlnaGVzdCBzZWN0aW9uIGluZGV4Ci0JIHJlZmVyZW5jZWQgYnkgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICAgICAgaXN5bSA9IGxvY2FsX3N5bXM7Ci0gICAgICBlc3ltID0gZXh0X3N5bXM7Ci0gICAgICBoaWdoZXN0X3NobmR4ID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyssIGVzeW0rKywgaXN5bSsrKQotCXsKLQkgIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgaXN5bSk7Ci0JICBpZiAoaXN5bS0+c3Rfc2huZHggPiBoaWdoZXN0X3NobmR4KQotCSAgICBoaWdoZXN0X3NobmR4ID0gaXN5bS0+c3Rfc2huZHg7Ci0JfQotCi0gICAgICAvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgZnJlZSAoZXh0X3N5bXMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBzZWN0aW9uIGluZGV4IHRvIHNlY3Rpb24gc3ltYm9sIGluZGV4Ci0JIG1hcHBpbmcuICBCdW1wIGJ5IG9uZSBzaW5jZSB3ZSBzdGFydCBjb3VudGluZyBhdCB6ZXJvLiAgKi8KLSAgICAgIGhpZ2hlc3Rfc2huZHgrKzsKLSAgICAgIGhwcGFfaW5mby0+c2VjdGlvbl9zeW1zID0gKGludCAqKSBiZmRfbWFsbG9jIChoaWdoZXN0X3NobmR4Ci0JCQkJCQkgICAgKiBzaXplb2YgKGludCkpOwotCi0gICAgICAvKiBOb3cgd2FsayB0aGUgbG9jYWwgc3ltYm9scyBhZ2Fpbi4gIElmIHdlIGZpbmQgYSBzZWN0aW9uIHN5bWJvbCwKLQkgcmVjb3JkIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sIGludG8gdGhlIHNlY3Rpb25fc3ltcyBhcnJheS4gICovCi0gICAgICBmb3IgKGlzeW0gPSBsb2NhbF9zeW1zLCBpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKywgaXN5bSsrKQotCXsKLQkgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JICAgIGhwcGFfaW5mby0+c2VjdGlvbl9zeW1zW2lzeW0tPnN0X3NobmR4XSA9IGk7Ci0JfQotCi0gICAgICAvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgbG9jYWwgc3ltYm9scy4gIEdldCByaWQgb2YgdGhlbS4gICovCi0gICAgICBmcmVlIChsb2NhbF9zeW1zKTsKLQotICAgICAgLyogUmVjb3JkIHdoaWNoIEJGRCB3ZSBidWlsdCB0aGUgc2VjdGlvbl9zeW1zIG1hcHBpbmcgZm9yLiAgKi8KLSAgICAgIGhwcGFfaW5mby0+c2VjdGlvbl9zeW1zX2JmZCA9IGFiZmQ7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGUgc3ltYm9sIGluZGV4IGZvciB0aGlzIGlucHV0IHNlY3Rpb24uICBXZSBtYXkgbmVlZCBpdCBmb3IKLSAgICAgcmVsb2NhdGlvbnMgd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLiAgV2hlbiBub3QgYnVpbGRpbmcgc2hhcmVkCi0gICAgIGxpYnJhcmllcyB0aGlzIHZhbHVlIGlzIG5ldmVyIHJlYWxseSB1c2VkLCBidXQgYXNzaWduIGl0IHRvIHplcm8gdG8KLSAgICAgcHJldmVudCBvdXQgb2YgYm91bmRzIG1lbW9yeSBhY2Nlc3NlcyBpbiBvdGhlciByb3V0aW5lcy4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgc2VjX3N5bW5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICAgICAgLyogSWYgd2UgZGlkIG5vdCBmaW5kIGEgc2VjdGlvbiBzeW1ib2wgZm9yIHRoaXMgc2VjdGlvbiwgdGhlbgotCSBzb21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZyBhYm92ZS4gICovCi0gICAgICBpZiAoc2VjX3N5bW5keCA9PSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY19zeW1uZHggPSBocHBhX2luZm8tPnNlY3Rpb25fc3ltc1tzZWNfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzZWNfc3ltbmR4ID0gMDsKLSAKLSAgZGx0ID0gcGx0ID0gc3R1YnMgPSBOVUxMOwotICBidWYgPSBOVUxMOwotICBidWZfbGVuID0gMDsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICBlbnVtIHsKLQlORUVEX0RMVCA9IDEsCi0JTkVFRF9QTFQgPSAyLAotCU5FRURfU1RVQiA9IDQsCi0JTkVFRF9PUEQgPSA4LAotCU5FRURfRFlOUkVMID0gMTYsCi0gICAgICB9OwotCi0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICpkeW5faDsKLSAgICAgIGludCBuZWVkX2VudHJ5OwotICAgICAgY29uc3QgY2hhciAqYWRkcl9uYW1lOwotICAgICAgYm9vbGVhbiBtYXliZV9keW5hbWljOwotICAgICAgaW50IGR5bnJlbF90eXBlID0gUl9QQVJJU0NfTk9ORTsKLSAgICAgIHN0YXRpYyByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAgICAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogV2UncmUgZGVhbGluZyB3aXRoIGEgZ2xvYmFsIHN5bWJvbCAtLSBmaW5kIGl0cyBoYXNoIGVudHJ5Ci0JICAgICBhbmQgbWFyayBpdCBhcyBiZWluZyByZWZlcmVuY2VkLiAgKi8KLQkgIGxvbmcgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCX0KLQotICAgICAgLyogV2UgY2FuIG9ubHkgZ2V0IHByZWxpbWluYXJ5IGRhdGEgb24gd2hldGhlciBhIHN5bWJvbCBpcwotCSBsb2NhbGx5IG9yIGV4dGVybmFsbHkgZGVmaW5lZCwgYXMgbm90IGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMKLQkgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQuICBEbyBzb21ldGhpbmcgd2l0aCB3aGF0IHdlIGtub3csIGFzCi0JIHRoaXMgbWF5IGhlbHAgcmVkdWNlIG1lbW9yeSB1c2FnZSBhbmQgcHJvY2Vzc2luZyB0aW1lIGxhdGVyLiAgKi8KLSAgICAgIG1heWJlX2R5bmFtaWMgPSBmYWxzZTsKLSAgICAgIGlmIChoICYmICgoaW5mby0+c2hhcmVkICYmICEgaW5mby0+c3ltYm9saWMpCi0JCXx8ICEgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKQotCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQltYXliZV9keW5hbWljID0gdHJ1ZTsKLQotICAgICAgaG93dG8gPSBlbGZfaHBwYV9ob3d0b190YWJsZSArIEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgbmVlZF9lbnRyeSA9IDA7Ci0gICAgICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotCXsKLQkvKiBUaGVzZSBhcmUgc2ltcGxlIGluZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3ltYm9scyB0aHJvdWdoIHRoZQotCSAgIERMVC4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgRExUIGVudHJ5IGZvciBhbnkgc3ltYm9scyB3aGljaAotCSAgIGFwcGVhcnMgaW4gYSBETFRJTkQgcmVsb2NhdGlvbi4gICovCi0JY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0JY2FzZSBSX1BBUklTQ19ETFRJTkQxNFI6Ci0JY2FzZSBSX1BBUklTQ19ETFRJTkQxNEY6Ci0JY2FzZSBSX1BBUklTQ19ETFRJTkQxNFdSOgotCWNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLQkgIG5lZWRfZW50cnkgPSBORUVEX0RMVDsKLQkgIGJyZWFrOwotCi0JLyogPyE/ICBUaGVzZSBuZWVkIGEgRExUIGVudHJ5LiAgQnV0IEkgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZG8gd2l0aAotCSAgIHRoZSAibGluayB0aW1lIFRQIHZhbHVlLiAgKi8KLQljYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMjFMOgotCWNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0JY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX1RQNjQ6Ci0JY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0V1I6Ci0JY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RFI6Ci0JY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE2RjoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRjoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZERjoKLQkgIG5lZWRfZW50cnkgPSBORUVEX0RMVDsKLQkgIGJyZWFrOwotCi0JLyogVGhlc2UgYXJlIGZ1bmN0aW9uIGNhbGxzLiAgRGVwZW5kaW5nIG9uIHRoZWlyIHByZWNpc2UgdGFyZ2V0IHdlCi0JICAgbWF5IG5lZWQgdG8gbWFrZSBhIHN0dWIgZm9yIHRoZW0uICBUaGUgc3R1YiB1c2VzIHRoZSBQTFQsIHNvIHdlCi0JICAgbmVlZCB0byBjcmVhdGUgUExUIGVudHJpZXMgZm9yIHRoZXNlIHN5bWJvbHMgdG9vLiAgKi8KLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotCWNhc2UgUl9QQVJJU0NfUENSRUwyMkY6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDMyOgotCWNhc2UgUl9QQVJJU0NfUENSRUw2NDoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDIyQzoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRXUjoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTREUjoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTZGOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNldGOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNkRGOgotCSAgbmVlZF9lbnRyeSA9IChORUVEX1BMVCB8IE5FRURfU1RVQik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QQVJJU0NfUExUT0ZGMjFMOgotCWNhc2UgUl9QQVJJU0NfUExUT0ZGMTRSOgotCWNhc2UgUl9QQVJJU0NfUExUT0ZGMTRGOgotCWNhc2UgUl9QQVJJU0NfUExUT0ZGMTRXUjoKLQljYXNlIFJfUEFSSVNDX1BMVE9GRjE0RFI6Ci0JY2FzZSBSX1BBUklTQ19QTFRPRkYxNkY6Ci0JY2FzZSBSX1BBUklTQ19QTFRPRkYxNldGOgotCWNhc2UgUl9QQVJJU0NfUExUT0ZGMTZERjoKLQkgIG5lZWRfZW50cnkgPSAoTkVFRF9QTFQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUEFSSVNDX0RJUjY0OgotCSAgaWYgKGluZm8tPnNoYXJlZCB8fCBtYXliZV9keW5hbWljKQotCSAgICBuZWVkX2VudHJ5ID0gKE5FRURfRFlOUkVMKTsKLQkgIGR5bnJlbF90eXBlID0gUl9QQVJJU0NfRElSNjQ7Ci0JICBicmVhazsKLQotCS8qIFRoaXMgaXMgYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRocm91Z2ggdGhlIERMVCB0byBnZXQgdGhlIGFkZHJlc3MKLQkgICBvZiBhIE9QRCBkZXNjcmlwdG9yLiAgVGh1cyB3ZSBuZWVkIHRvIG1ha2UgYSBETFQgZW50cnkgdGhhdCBwb2ludHMKLQkgICB0byBhbiBPUEQgZW50cnkuICAqLwotCWNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFI6Ci0JY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUjoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSOgotCWNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjMyOgotCWNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjY0OgotCWNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2RjoKLQljYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGOgotCWNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2REY6Ci0JICBpZiAoaW5mby0+c2hhcmVkIHx8IG1heWJlX2R5bmFtaWMpCi0JICAgIG5lZWRfZW50cnkgPSAoTkVFRF9ETFQgfCBORUVEX09QRCk7Ci0JICBlbHNlCi0JICAgIG5lZWRfZW50cnkgPSAoTkVFRF9ETFQgfCBORUVEX09QRCk7Ci0JICBkeW5yZWxfdHlwZSA9IFJfUEFSSVNDX0ZQVFI2NDsKLQkgIGJyZWFrOwotCi0JLyogVGhpcyBpcyBhIHNpbXBsZSBPUEQgZW50cnkuICAqLwotCWNhc2UgUl9QQVJJU0NfRlBUUjY0OgotCSAgaWYgKGluZm8tPnNoYXJlZCB8fCBtYXliZV9keW5hbWljKQotCSAgICBuZWVkX2VudHJ5ID0gKE5FRURfT1BEIHwgTkVFRF9EWU5SRUwpOwotCSAgZWxzZQotCSAgICBuZWVkX2VudHJ5ID0gKE5FRURfT1BEKTsKLQkgIGR5bnJlbF90eXBlID0gUl9QQVJJU0NfRlBUUjY0OwotCSAgYnJlYWs7Ci0KLQkvKiBBZGQgbW9yZSBjYXNlcyBhcyBuZWVkZWQuICAqLwotCX0KLQotICAgICAgaWYgKCFuZWVkX2VudHJ5KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBDb2xsZWN0IGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgYWRkcmVzcy4gICovCi0gICAgICBhZGRyX25hbWUgPSBnZXRfZHluX25hbWUgKGFiZmQsIGgsIHJlbCwgJmJ1ZiwgJmJ1Zl9sZW4pOwotCi0gICAgICAvKiBDb2xsZWN0IHRoZSBjYW5vbmljYWwgZW50cnkgZGF0YSBmb3IgdGhpcyBhZGRyZXNzLiAgKi8KLSAgICAgIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCQkgIGFkZHJfbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBCRkRfQVNTRVJUIChkeW5faCk7Ci0KLSAgICAgIC8qIFN0YXNoIGF3YXkgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlIGFibGUgdG8gZmluZCB0aGlzIHN5bWJvbAotCSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGl0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCi0gICAgICBkeW5faC0+aCA9IGg7Ci0gICAgICBkeW5faC0+b3duZXIgPSBhYmZkOwotICAgICAgZHluX2gtPnN5bV9pbmR4ID0gcl9zeW1uZHg7Ci0KLSAgICAgIC8qID8hPyBXZSBtYXkgbmVlZCB0byBkbyBzb21lIGVycm9yIGNoZWNraW5nIGluIGhlcmUuICAqLwotICAgICAgLyogQ3JlYXRlIHdoYXQncyBuZWVkZWQuICAqLwotICAgICAgaWYgKG5lZWRfZW50cnkgJiBORUVEX0RMVCkKLQl7Ci0JICBpZiAoISBocHBhX2luZm8tPmRsdF9zZWMKLQkgICAgICAmJiAhIGdldF9kbHQgKGFiZmQsIGluZm8sIGhwcGFfaW5mbykpCi0JICAgIGdvdG8gZXJyX291dDsKLQkgIGR5bl9oLT53YW50X2RsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAobmVlZF9lbnRyeSAmIE5FRURfUExUKQotCXsKLQkgIGlmICghIGhwcGFfaW5mby0+cGx0X3NlYwotCSAgICAgICYmICEgZ2V0X3BsdCAoYWJmZCwgaW5mbywgaHBwYV9pbmZvKSkKLQkgICAgZ290byBlcnJfb3V0OwotCSAgZHluX2gtPndhbnRfcGx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChuZWVkX2VudHJ5ICYgTkVFRF9TVFVCKQotCXsKLQkgIGlmICghIGhwcGFfaW5mby0+c3R1Yl9zZWMKLQkgICAgICAmJiAhIGdldF9zdHViIChhYmZkLCBpbmZvLCBocHBhX2luZm8pKQotCSAgICBnb3RvIGVycl9vdXQ7Ci0JICBkeW5faC0+d2FudF9zdHViID0gMTsKLQl9Ci0KLSAgICAgIGlmIChuZWVkX2VudHJ5ICYgTkVFRF9PUEQpCi0JewotCSAgaWYgKCEgaHBwYV9pbmZvLT5vcGRfc2VjCi0JICAgICAgJiYgISBnZXRfb3BkIChhYmZkLCBpbmZvLCBocHBhX2luZm8pKQotCSAgICBnb3RvIGVycl9vdXQ7Ci0KLQkgIGR5bl9oLT53YW50X29wZCA9IDE7Ci0KLQkgIC8qIEZQVFJzIGFyZSBub3QgYWxsb2NhdGVkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBmb3IgUEE2NCwgdGhvdWdoCi0JICAgICBpdCBpcyBwb3NzaWJsZSB0aGF0IHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUuICAqLwotCSAgICAKLQkgIC8qIFRoaXMgY291bGQgYmUgYSBsb2NhbCBmdW5jdGlvbiB0aGF0IGhhZCBpdHMgYWRkcmVzcyB0YWtlbiwgaW4KLQkgICAgIHdoaWNoIGNhc2UgSCB3aWxsIGJlIE5VTEwuICAqLwotCSAgaWYgKGgpCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JfQotCi0gICAgICAvKiBBZGQgYSBuZXcgZHluYW1pYyByZWxvY2F0aW9uIHRvIHRoZSBjaGFpbiBvZiBkeW5hbWljCi0JIHJlbG9jYXRpb25zIGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAoKG5lZWRfZW50cnkgJiBORUVEX0RZTlJFTCkgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotCXsKLQkgIGlmICghIGhwcGFfaW5mby0+b3RoZXJfcmVsX3NlYwotCSAgICAgICYmICEgZ2V0X3JlbG9jX3NlY3Rpb24gKGFiZmQsIGhwcGFfaW5mbywgc2VjKSkKLQkgICAgZ290byBlcnJfb3V0OwotCi0JICBpZiAoIWNvdW50X2R5bl9yZWxvYyAoYWJmZCwgZHluX2gsIGR5bnJlbF90eXBlLCBzZWMsCi0JCQkJc2VjX3N5bW5keCwgcmVsLT5yX29mZnNldCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIGdvdG8gZXJyX291dDsKLQotCSAgLyogSWYgd2UgYXJlIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHdlIGp1c3QgcmVjb3JkZWQKLQkgICAgIGEgZHluYW1pYyBSX1BBUklTQ19GUFRSNjQgcmVsb2NhdGlvbiwgdGhlbiBtYWtlIHN1cmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCBmb3IgdGhpcyBzZWN0aW9uIGVuZHMgdXAgaW4gdGhlIGR5bmFtaWMKLQkgICAgIHN5bWJvbCB0YWJsZS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIGR5bnJlbF90eXBlID09IFJfUEFSSVNDX0ZQVFI2NAotCSAgICAgICYmICEgKF9iZmRfZWxmNjRfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wKLQkJICAgIChpbmZvLCBhYmZkLCBzZWNfc3ltbmR4KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChidWYpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJfb3V0OgotICBpZiAoYnVmKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RydWN0IGVsZjY0X2hwcGFfYWxsb2NhdGVfZGF0YQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBvZnM7Ci19OwotCi0vKiBTaG91bGQgd2UgZG8gZHluYW1pYyB0aGluZ3MgdG8gdGhpcyBzeW1ib2w/ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+cm9vdC5yb290LnN0cmluZ1swXSA9PSAnJCcgJiYgaC0+cm9vdC5yb290LnN0cmluZ1sxXSA9PSAnJCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYykKLSAgICAgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkKLQkgID09IChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTWFyayBhbGwgZnVudGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBmaWxlIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGFsbG9jYXRlCi0gICBlbnRyaWVzIGluIC5vcGQgZm9yIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaHBwYV9tYXJrX2V4cG9ydGVkX2Z1bmN0aW9ucyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgaWYgKGgKLSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiBoLT50eXBlID09IFNUVF9GVU5DKQotICAgIHsKLSAgICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0KLSAgICAgIC8qIEFkZCB0aGlzIHN5bWJvbCB0byB0aGUgUEE2NCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0gICAgICBkeW5faCA9IGVsZjY0X2hwcGFfZHluX2hhc2hfbG9va3VwICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQkJICBoLT5yb290LnJvb3Quc3RyaW5nLCB0cnVlLCB0cnVlKTsKLSAgICAgIEJGRF9BU1NFUlQgKGR5bl9oKTsKLSAgICAgIGR5bl9oLT5oID0gaDsKLQotICAgICAgaWYgKCEgaHBwYV9pbmZvLT5vcGRfc2VjCi0JICAmJiAhIGdldF9vcGQgKGhwcGFfaW5mby0+cm9vdC5keW5vYmosIGluZm8sIGhwcGFfaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBkeW5faC0+d2FudF9vcGQgPSAxOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIERMVCBlbnRyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9nbG9iYWxfZGF0YV9kbHQgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaHBwYV9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9ocHBhX2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faC0+d2FudF9kbHQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBkeW5faC0+aDsKLQotICAgICAgaWYgKHgtPmluZm8tPnNoYXJlZCkKLQl7Ci0JICAvKiBQb3NzaWJseSBhZGQgdGhlIHN5bWJvbCB0byB0aGUgbG9jYWwgZHluYW1pYyBzeW1ib2wKLQkgICAgIHRhYmxlIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdG8gY3JlYXRlIGEgZHluYW1pYyByZWxvY2F0aW9uCi0JICAgICBhZ2FpbnN0IGl0LiAgKi8KLQkgIGlmICghIGgKLQkgICAgICB8fCAoaCAmJiBoLT5keW5pbmR4ID09IC0xKSkKLQkgICAgewotCSAgICAgIGJmZCAqb3duZXI7Ci0JICAgICAgb3duZXIgPSAoaCA/IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgOiBkeW5faC0+b3duZXIpOwotCi0JICAgICAgaWYgKCFfYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0JCSAgICAoeC0+aW5mbywgb3duZXIsIGR5bl9oLT5zeW1faW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgZHluX2gtPmRsdF9vZmZzZXQgPSB4LT5vZnM7Ci0gICAgICB4LT5vZnMgKz0gRExUX0VOVFJZX1NJWkU7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgRExULlBMVCBlbnRyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9nbG9iYWxfZGF0YV9wbHQgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaHBwYV9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9ocHBhX2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faC0+d2FudF9wbHQKLSAgICAgICYmIGVsZjY0X2hwcGFfZHluYW1pY19zeW1ib2xfcCAoZHluX2gtPmgsIHgtPmluZm8pCi0gICAgICAmJiAhKChkeW5faC0+aC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICB8fCBkeW5faC0+aC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAmJiBkeW5faC0+aC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBkeW5faC0+cGx0X29mZnNldCA9IHgtPm9mczsKLSAgICAgIHgtPm9mcyArPSBQTFRfRU5UUllfU0laRTsKLSAgICAgIGlmIChkeW5faC0+cGx0X29mZnNldCA8IDB4MjAwMCkKLQllbGY2NF9ocHBhX2hhc2hfdGFibGUgKHgtPmluZm8pLT5ncF9vZmZzZXQgPSBkeW5faC0+cGx0X29mZnNldDsKLSAgICB9Ci0gIGVsc2UKLSAgICBkeW5faC0+d2FudF9wbHQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBTVFVCIGVudHJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFsbG9jYXRlX2dsb2JhbF9kYXRhX3N0dWIgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaHBwYV9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9ocHBhX2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faC0+d2FudF9zdHViCi0gICAgICAmJiBlbGY2NF9ocHBhX2R5bmFtaWNfc3ltYm9sX3AgKGR5bl9oLT5oLCB4LT5pbmZvKQotICAgICAgJiYgISgoZHluX2gtPmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgfHwgZHluX2gtPmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgJiYgZHluX2gtPmgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkpCi0gICAgewotICAgICAgZHluX2gtPnN0dWJfb2Zmc2V0ID0geC0+b2ZzOwotICAgICAgeC0+b2ZzICs9IHNpemVvZiAocGx0X3N0dWIpOwotICAgIH0KLSAgZWxzZQotICAgIGR5bl9oLT53YW50X3N0dWIgPSAwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgRlBUUiBlbnRyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9nbG9iYWxfZGF0YV9vcGQgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaHBwYV9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9ocHBhX2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faC0+d2FudF9vcGQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBkeW5faC0+aDsKLSAgICAgIAotICAgICAgaWYgKGgpCi0Jd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIG5lZWQgYW4gb3BkIGVudHJ5IGZvciBhIHN5bWJvbCB3aGljaCBpcyBub3QKLQkgZGVmaW5lZCBieSB0aGlzIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChoICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQlkeW5faC0+d2FudF9vcGQgPSAwOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdG9vayB0aGUgYWRkcmVzcyBvZiBhIGxvY2FsCi0JIGZ1bmN0aW9uIG9yIG1pZ2h0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uIGZyb20gdGhpcyBvYmplY3QgZmlsZSwgdGhlbgotCSB3ZSBoYXZlIHRvIGNyZWF0ZSBhbiBvcGQgZGVzY3JpcHRvci4gICovCi0gICAgICBlbHNlIGlmICh4LT5pbmZvLT5zaGFyZWQKLQkgICAgICAgfHwgaCA9PSBOVUxMCi0JICAgICAgIHx8IGgtPmR5bmluZHggPT0gLTEKLQkgICAgICAgfHwgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpKQotCXsKLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHdlIHdpbGwgaGF2ZSB0bwotCSAgICAgY3JlYXRlIGEgcnVudGltZSByZWxvY2F0aW9uIGZvciB0aGUgc3ltYm9sIHRvIHByb3Blcmx5Ci0JICAgICBpbml0aWFsaXplIHRoZSAub3BkIGVudHJ5LiAgTWFrZSBzdXJlIHRoZSBzeW1ib2wgZ2V0cwotCSAgICAgYWRkZWQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQkgIGlmICh4LT5pbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoaCA9PSBOVUxMIHx8IChoLT5keW5pbmR4ID09IC0xKSkpCi0JICAgIHsKLQkgICAgICBiZmQgKm93bmVyOwotCSAgICAgIG93bmVyID0gKGggPyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyIDogZHluX2gtPm93bmVyKTsKLQotCSAgICAgIGlmICghX2JmZF9lbGY2NF9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbAotCQkgICAgKHgtPmluZm8sIG93bmVyLCBkeW5faC0+c3ltX2luZHgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeSBvciBkZXNpcmFibGUgYW55bW9yZSBub3cgdGhhdAotCSAgICAgd2UgaGF2ZSBzb21lIHN1cHBvcnQgZm9yIGRlYWxpbmcgd2l0aCBzZWN0aW9uIHN5bWJvbHMKLQkgICAgIGluIGR5bmFtaWMgcmVsb2NzLiAgQnV0IG5hbWUgbXVuZ2luZyBkb2VzIG1ha2UgdGhlIHJlc3VsdAotCSAgICAgbXVjaCBlYXNpZXIgdG8gZGVidWcuICBpZSwgdGhlIEVQTFQgcmVsb2Mgd2lsbCByZWZlcmVuY2UKLQkgICAgIGEgc3ltYm9sIGxpa2UgLmZvb2JhciwgaW5zdGVhZCBvZiAudGV4dCArIG9mZnNldC4gICovCi0JICBpZiAoeC0+aW5mby0+c2hhcmVkICYmIGgpCi0JICAgIHsKLQkgICAgICBjaGFyICpuZXdfbmFtZTsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbmg7Ci0KLQkgICAgICBuZXdfbmFtZSA9IGFsbG9jYSAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSArIDIpOwotCSAgICAgIG5ld19uYW1lWzBdID0gJy4nOwotCSAgICAgIHN0cmNweSAobmV3X25hbWUgKyAxLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQotCSAgICAgIG5oID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlICh4LT5pbmZvKSwKLQkJCQkJIG5ld19uYW1lLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQotCSAgICAgIG5oLT5yb290LnR5cGUgPSBoLT5yb290LnR5cGU7Ci0JICAgICAgbmgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCSAgICAgIG5oLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKHgtPmluZm8sIG5oKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICB9Ci0JICBkeW5faC0+b3BkX29mZnNldCA9IHgtPm9mczsKLQkgIHgtPm9mcyArPSBPUERfRU5UUllfU0laRTsKLQl9Ci0KLSAgICAgIC8qIE90aGVyd2lzZSB3ZSBkbyBub3QgbmVlZCBhbiBvcGQgZW50cnkuICAqLwotICAgICAgZWxzZQotCWR5bl9oLT53YW50X29wZCA9IDA7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSFAgcmVxdWlyZXMgdGhlIEVJX09TQUJJIGZpZWxkIHRvIGJlIGZpbGxlZCBpbi4gIFRoZSBhc3NpZ25tZW50IHRvCi0gICBFSV9BQklWRVJTSU9OIG1heSBub3QgYmUgc3RyaWN0bHkgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2hwcGFfcG9zdF9wcm9jZXNzX2hlYWRlcnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX0hQVVg7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQUJJVkVSU0lPTl0gPSAxOwotfQotCi0vKiBDcmVhdGUgZnVuY3Rpb24gZGVzY3JpcHRvciBzZWN0aW9uICgub3BkKS4gIFRoaXMgc2VjdGlvbiBpcyBjYWxsZWQgLm9wZAotICAgYmVjYXVzZSBpdCBjb250YWlucyAib2ZmaWNpYWwgcHJvZGVjdXJlIGRlc2NyaXB0b3JzIi4gIFRoZSAib2ZmaWNpYWwiCi0gICByZWZlcnMgdG8gdGhlIGZhY3QgdGhhdCB0aGVzZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCB3aGVuIHRha2luZyB0aGUgYWRkcmVzcwotICAgb2YgYSBwcm9jZWR1cmUsIHRodXMgZW5zdXJpbmcgYSB1bmlxdWUgYWRkcmVzcyBmb3IgZWFjaCBwcm9jZWR1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2V0X29wZCAoYWJmZCwgaW5mbywgaHBwYV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm9wZDsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgb3BkID0gaHBwYV9pbmZvLT5vcGRfc2VjOwotICBpZiAoIW9wZCkKLSAgICB7Ci0gICAgICBkeW5vYmogPSBocHBhX2luZm8tPnJvb3QuZHlub2JqOwotICAgICAgaWYgKCFkeW5vYmopCi0JaHBwYV9pbmZvLT5yb290LmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0KLSAgICAgIG9wZCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5vcGQiKTsKLSAgICAgIGlmICghb3BkCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIG9wZCwKLQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIG9wZCwgMykpCi0JewotCSAgQkZEX0FTU0VSVCAoMCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBocHBhX2luZm8tPm9wZF9zZWMgPSBvcGQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIFBMVCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdldF9wbHQgKGFiZmQsIGluZm8sIGhwcGFfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICpocHBhX2luZm87Ci17Ci0gIGFzZWN0aW9uICpwbHQ7Ci0gIGJmZCAqZHlub2JqOwotCi0gIHBsdCA9IGhwcGFfaW5mby0+cGx0X3NlYzsKLSAgaWYgKCFwbHQpCi0gICAgewotICAgICAgZHlub2JqID0gaHBwYV9pbmZvLT5yb290LmR5bm9iajsKLSAgICAgIGlmICghZHlub2JqKQotCWhwcGFfaW5mby0+cm9vdC5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCi0gICAgICBwbHQgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBpZiAoIXBsdAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBwbHQsCi0JCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBwbHQsIDMpKQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaHBwYV9pbmZvLT5wbHRfc2VjID0gcGx0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSBETFQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZXRfZGx0IChhYmZkLCBpbmZvLCBocHBhX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotewotICBhc2VjdGlvbiAqZGx0OwotICBiZmQgKmR5bm9iajsKLQotICBkbHQgPSBocHBhX2luZm8tPmRsdF9zZWM7Ci0gIGlmICghZGx0KQotICAgIHsKLSAgICAgIGR5bm9iaiA9IGhwcGFfaW5mby0+cm9vdC5keW5vYmo7Ci0gICAgICBpZiAoIWR5bm9iaikKLQlocHBhX2luZm8tPnJvb3QuZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICAgICAgZGx0ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLmRsdCIpOwotICAgICAgaWYgKCFkbHQKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgZGx0LAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgZGx0LCAzKSkKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGhwcGFfaW5mby0+ZGx0X3NlYyA9IGRsdDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgc3R1YnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZXRfc3R1YiAoYWJmZCwgaW5mbywgaHBwYV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnN0dWI7Ci0gIGJmZCAqZHlub2JqOwotCi0gIHN0dWIgPSBocHBhX2luZm8tPnN0dWJfc2VjOwotICBpZiAoIXN0dWIpCi0gICAgewotICAgICAgZHlub2JqID0gaHBwYV9pbmZvLT5yb290LmR5bm9iajsKLSAgICAgIGlmICghZHlub2JqKQotCWhwcGFfaW5mby0+cm9vdC5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCi0gICAgICBzdHViID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnN0dWIiKTsKLSAgICAgIGlmICghc3R1YgotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzdHViLAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzdHViLCAzKSkKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGhwcGFfaW5mby0+c3R1Yl9zZWMgPSBzdHViOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHNlY3Rpb25zIG5lY2Vzc2FyeSBmb3IgZHluYW1pYyBsaW5raW5nLiAgVGhpcyBpcyBvbmx5IGEgcm91Z2gKLSAgIGN1dCBhbmQgd2lsbCBsaWtlbHkgY2hhbmdlIGFzIHdlIGxlYXJuIG1vcmUgYWJvdXQgdGhlIHNvbWV3aGF0Ci0gICB1bnVzdWFsIGR5bmFtaWMgbGlua2luZyBzY2hlbWUgSFAgdXNlcy4KLQotICAgLnN0dWI6Ci0JQ29udGFpbnMgY29kZSB0byBpbXBsZW1lbnQgY3Jvc3Mtc3BhY2UgY2FsbHMuICBUaGUgZmlyc3QgdGltZSBvbmUKLQlvZiB0aGUgc3R1YnMgaXMgdXNlZCBpdCB3aWxsIGNhbGwgaW50byB0aGUgZHluYW1pYyBsaW5rZXIsIGxhdGVyCi0JY2FsbHMgd2lsbCBnbyBzdHJhaWdodCB0byB0aGUgdGFyZ2V0LgotCi0JVGhlIG9ubHkgc3R1YiB3ZSBzdXBwb3J0IHJpZ2h0IG5vdyBsb29rcyBsaWtlCi0KLQlsZGQgT0ZGU0VUKCVkcCksJXIxCi0JYnZlICVyMCglcjEpCi0JbGRkIE9GRlNFVCs4KCVkcCksJWRwCi0KLQlPdGhlciBzdHVicyBtYXkgYmUgbmVlZGVkIGluIHRoZSBmdXR1cmUuICBXZSBtYXkgd2FudCB0aGUgcmVtb3ZlCi0JdGhlIGJyZWFrL25vcCBpbnN0cnVjdGlvbi4gIEl0IGlzIG9ubHkgdXNlZCByaWdodCBub3cgdG8ga2VlcCB0aGUKLQlvZmZzZXQgb2YgYSAucGx0IGVudHJ5IGFuZCBhIC5zdHViIGVudHJ5IGluIHN5bmMuCi0KLSAgIC5kbHQ6Ci0JVGhpcyBpcyB3aGF0IG1vc3QgcGVvcGxlIGNhbGwgdGhlIC5nb3QuICBIUCB1c2VkIGEgZGlmZmVyZW50IG5hbWUuCi0JTG9zZXJzLgotCi0gICAucmVsYS5kbHQ6Ci0JUmVsb2NhdGlvbnMgZm9yIHRoZSBETFQuCi0KLSAgIC5wbHQ6Ci0JRnVuY3Rpb24gcG9pbnRlcnMgYXMgYWRkcmVzcyxncCBwYWlycy4KLQotICAgLnJlbGEucGx0OgotCVNob3VsZCBjb250YWluIGR5bmFtaWMgSVBMVCAoYW5kIEVQTFQ/KSByZWxvY2F0aW9ucy4KLQotICAgLm9wZDoKLQlGUFRSUyAKLQotICAgLnJlbGEub3BkOgotCUVQTFQgcmVsb2NhdGlvbnMgZm9yIHN5bWJvbHMgZXhwb3J0ZWQgZnJvbSBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmICghIGdldF9zdHViIChhYmZkLCBpbmZvLCBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZ2V0X2RsdCAoYWJmZCwgaW5mbywgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGdldF9wbHQgKGFiZmQsIGluZm8sIGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbykpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBnZXRfb3BkIChhYmZkLCBpbmZvLCBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLmRsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5kbHRfcmVsX3NlYyA9IHM7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5wbHRfcmVsX3NlYyA9IHM7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLmRhdGEiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+b3RoZXJfcmVsX3NlYyA9IHM7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLm9wZCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5vcGRfcmVsX3NlYyA9IHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsbG9jYXRlIGR5bmFtaWMgcmVsb2NhdGlvbnMgZm9yIHRob3NlIHN5bWJvbHMgdGhhdCB0dXJuZWQgb3V0Ci0gICB0byBiZSBkeW5hbWljLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFsbG9jYXRlX2R5bnJlbF9lbnRyaWVzIChkeW5faCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKmR5bl9oOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfYWxsb2NhdGVfZGF0YSAqeCA9IChzdHJ1Y3QgZWxmNjRfaHBwYV9hbGxvY2F0ZV9kYXRhICopZGF0YTsKLSAgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICpocHBhX2luZm87Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9yZWxvY19lbnRyeSAqcmVudDsKLSAgYm9vbGVhbiBkeW5hbWljX3N5bWJvbCwgc2hhcmVkOwotCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoeC0+aW5mbyk7Ci0gIGR5bmFtaWNfc3ltYm9sID0gZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wIChkeW5faC0+aCwgeC0+aW5mbyk7Ci0gIHNoYXJlZCA9IHgtPmluZm8tPnNoYXJlZDsKLQotICAvKiBXZSBtYXkgbmVlZCB0byBhbGxvY2F0ZSByZWxvY2F0aW9ucyBmb3IgYSBub24tZHluYW1pYyBzeW1ib2wKLSAgICAgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgaWYgKCFkeW5hbWljX3N5bWJvbCAmJiAhc2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRha2UgY2FyZSBvZiB0aGUgbm9ybWFsIGRhdGEgcmVsb2NhdGlvbnMuICAqLwotCi0gIGZvciAocmVudCA9IGR5bl9oLT5yZWxvY19lbnRyaWVzOyByZW50OyByZW50ID0gcmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHJlbnQtPnR5cGUpCi0JewotCWNhc2UgUl9QQVJJU0NfRlBUUjY0OgotCSAgLyogQWxsb2NhdGUgb25lIGlmZiB3ZSBhcmUgbm90IGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kCi0JICAgICAhd2FudF9vcGQsIHdoaWNoIGJ5IHRoaXMgcG9pbnQgd2lsbCBiZSB0cnVlIG9ubHkgaWYgd2UncmUKLQkgICAgIGFjdHVhbGx5IGFsbG9jYXRpbmcgb25lIHN0YXRpY2FsbHkgaW4gdGhlIG1haW4gZXhlY3V0YWJsZS4gICovCi0JICBpZiAoIXgtPmluZm8tPnNoYXJlZCAmJiBkeW5faC0+d2FudF9vcGQpCi0JICAgIGNvbnRpbnVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaHBwYV9pbmZvLT5vdGhlcl9yZWxfc2VjLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGdldHMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMKLQkgbm90IGFscmVhZHkgcmVjb3JkZWQuICA/IT8gVGhpcyBzaG91bGQgbm90IGJlIGluIHRoZSBsb29wIHNpbmNlCi0JIHRoZSBzeW1ib2wgbmVlZCBvbmx5IGJlIGFkZGVkIG9uY2UuICAqLwotICAgICAgaWYgKGR5bl9oLT5oID09IDAgfHwgZHluX2gtPmgtPmR5bmluZHggPT0gLTEpCi0JaWYgKCFfYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0JICAgICh4LT5pbmZvLCByZW50LT5zZWMtPm93bmVyLCBkeW5faC0+c3ltX2luZHgpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUYWtlIGNhcmUgb2YgdGhlIEdPVCBhbmQgUExUIHJlbG9jYXRpb25zLiAgKi8KLQotICBpZiAoKGR5bmFtaWNfc3ltYm9sIHx8IHNoYXJlZCkgJiYgZHluX2gtPndhbnRfZGx0KQotICAgIGhwcGFfaW5mby0+ZGx0X3JlbF9zZWMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0gIC8qIElmIHdlIGFyZSBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGV2ZXJ5IHN5bWJvbCB0aGF0IGhhcyBhbgotICAgICBvcGQgZW50cnkgd2lsbCBuZWVkIGFuIEVQTFQgcmVsb2NhdGlvbiB0byByZWxvY2F0ZSB0aGUgc3ltYm9sJ3MgYWRkcmVzcwotICAgICBhbmQgX19ncCB2YWx1ZSBiYXNlZCBvbiB0aGUgcnVudGltZSBsb2FkIGFkZHJlc3MuICAqLwotICBpZiAoc2hhcmVkICYmIGR5bl9oLT53YW50X29wZCkKLSAgICBocHBhX2luZm8tPm9wZF9yZWxfc2VjLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICBpZiAoZHluX2gtPndhbnRfcGx0ICYmIGR5bmFtaWNfc3ltYm9sKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgdCA9IDA7Ci0KLSAgICAgIC8qIER5bmFtaWMgc3ltYm9scyBnZXQgb25lIElQTFQgcmVsb2NhdGlvbi4gIExvY2FsIHN5bWJvbHMgaW4KLQkgc2hhcmVkIGxpYnJhcmllcyBnZXQgdHdvIFJFTCByZWxvY2F0aW9ucy4gIExvY2FsIHN5bWJvbHMgaW4KLQkgbWFpbiBhcHBsaWNhdGlvbnMgZ2V0IG5vdGhpbmcuICAqLwotICAgICAgaWYgKGR5bmFtaWNfc3ltYm9sKQotCXQgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotICAgICAgZWxzZSBpZiAoc2hhcmVkKQotCXQgPSAyICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgaHBwYV9pbmZvLT5wbHRfcmVsX3NlYy0+X3Jhd19zaXplICs9IHQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIC8qID8/PyBVbmRlZmluZWQgc3ltYm9scyB3aXRoIFBMVCBlbnRyaWVzIHNob3VsZCBiZSByZS1kZWZpbmVkCi0gICAgIHRvIGJlIHRoZSBQTFQgZW50cnkuICAqLwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24sIHdlIG1pZ2h0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbgotICAgICBhbmQgYWxsb2NhdGUgYSBDT1BZIGR5bmFtaWMgcmVsb2NhdGlvbi4KLQotICAgICBCdXQgUEE2NCBjb2RlIGlzIGNhbm9uaWNhbGx5IFBJQywgc28gYXMgYSBydWxlIHdlIGNhbiBhdm9pZCB0aGlzIHNvcnQKLSAgICAgb2YgaGFja2VyeS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZmluYWwgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IKLSAgIHRoZSBjb250ZW50cyBvZiBvdXIgc3BlY2lhbCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9ocHBhX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiBzdHViczsKLSAgc3RydWN0IGVsZjY0X2hwcGFfYWxsb2NhdGVfZGF0YSBkYXRhOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLQotICBocHBhX2luZm8gPSBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0JIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLQkgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZGx0LAotCSB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotCSBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmRsdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSB0aGUgR09UIGVudHJpZXMuICAqLwotCi0gIGRhdGEuaW5mbyA9IGluZm87Ci0gIGlmIChlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5kbHRfc2VjKQotICAgIHsKLSAgICAgIGRhdGEub2ZzID0gMHgwOwotICAgICAgZWxmNjRfaHBwYV9keW5faGFzaF90cmF2ZXJzZSAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJICAgIGFsbG9jYXRlX2dsb2JhbF9kYXRhX2RsdCwgJmRhdGEpOwotICAgICAgaHBwYV9pbmZvLT5kbHRfc2VjLT5fcmF3X3NpemUgPSBkYXRhLm9mczsKLQotICAgICAgZGF0YS5vZnMgPSAweDA7Ci0gICAgICBlbGY2NF9ocHBhX2R5bl9oYXNoX3RyYXZlcnNlICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQkgICAgYWxsb2NhdGVfZ2xvYmFsX2RhdGFfcGx0LCAmZGF0YSk7Ci0gICAgICBocHBhX2luZm8tPnBsdF9zZWMtPl9yYXdfc2l6ZSA9IGRhdGEub2ZzOwotCi0gICAgICBkYXRhLm9mcyA9IDB4MDsKLSAgICAgIGVsZjY0X2hwcGFfZHluX2hhc2hfdHJhdmVyc2UgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCSAgICBhbGxvY2F0ZV9nbG9iYWxfZGF0YV9zdHViLCAmZGF0YSk7Ci0gICAgICBocHBhX2luZm8tPnN0dWJfc2VjLT5fcmF3X3NpemUgPSBkYXRhLm9mczsKLSAgICB9Ci0KLSAgLyogTWFyayBlYWNoIGZ1bmN0aW9uIHRoaXMgcHJvZ3JhbSBleHBvcnRzIHNvIHRoYXQgd2Ugd2lsbCBhbGxvY2F0ZQotICAgICBzcGFjZSBpbiB0aGUgLm9wZCBzZWN0aW9uIGZvciBlYWNoIGZ1bmN0aW9uJ3MgRlBUUi4KLQotICAgICBXZSBoYXZlIHRvIHRyYXZlcnNlIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIHNpbmNlIHdlIGhhdmUgdG8KLSAgICAgZmluZCBmdW5jdGlvbnMgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbWVudGlvbmVkIGluIGFueSByZWxvY3MuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZjY0X2hwcGFfbWFya19leHBvcnRlZF9mdW5jdGlvbnMsCi0JCQkgIGluZm8pOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBlbnRyaWVzIGluIHRoZSAub3BkIHNlY3Rpb24uICAqLwotICBpZiAoZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+b3BkX3NlYykKLSAgICB7Ci0gICAgICBkYXRhLm9mcyA9IDA7Ci0gICAgICBlbGY2NF9ocHBhX2R5bl9oYXNoX3RyYXZlcnNlICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQkgICAgYWxsb2NhdGVfZ2xvYmFsX2RhdGFfb3BkLCAmZGF0YSk7Ci0gICAgICBocHBhX2luZm8tPm9wZF9zZWMtPl9yYXdfc2l6ZSA9IGRhdGEub2ZzOwotICAgIH0KLQotICAvKiBOb3cgYWxsb2NhdGUgc3BhY2UgZm9yIGR5bmFtaWMgcmVsb2NhdGlvbnMsIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChocHBhX2luZm8tPnJvb3QuZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIGVsZjY0X2hwcGFfZHluX2hhc2hfdHJhdmVyc2UgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCSAgYWxsb2NhdGVfZHlucmVsX2VudHJpZXMsICZkYXRhKTsKLQotICAvKiBUaGUgc2l6ZXMgb2YgYWxsIHRoZSBzZWN0aW9ucyBhcmUgc2V0LiAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IDA7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotCQkgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLQkJIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5vcGQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0JCSBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0JCSB0aGFuIC5yZWxhLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmRsdCIsIDQpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnN0dWIiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAoaW5mbywgcyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgaXQgaGFzIG5vdAotCSBiZWVuIGFsbG9jYXRlZCBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBbHdheXMgY3JlYXRlIGEgRFRfUExUR09ULiAgSXQgYWN0dWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aAotCSB0aGUgUExULCBpdCBpcyBob3cgd2UgY29tbXVuaWNhdGUgdGhlIF9fZ3AgdmFsdWUgb2YgYSBsb2FkCi0JIG1vZHVsZSB0byB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IUF9ETERfRkxBR1MsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjY0X2hwcGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0hQX0RMRF9IT09LLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IUF9MT0FEX01BUCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkJc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBvdXRwdXQgdGhlIHN5bWJvbCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgdGFibGUsIGJ1dCBiZWZvcmUgd2Ugb3V0cHV0IHRoZSBzeW1ib2wgaW50byB0aGUgbm9ybWFsIHN5bWJvbAotICAgdGFibGUuCi0KLSAgIEZvciBzb21lIHN5bWJvbHMgd2UgaGFkIHRvIGNoYW5nZSB0aGVpciBhZGRyZXNzIHdoZW4gb3V0cHV0dGluZwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgV2UgdW5kbyB0aGF0IGNoYW5nZSBoZXJlIHNvIHRoYXQKLSAgIHRoZSBzeW1ib2xzIGhhdmUgdGhlaXIgZXhwZWN0ZWQgdmFsdWUgaW4gdGhlIG5vcm1hbCBzeW1ib2wKLSAgIHRhYmxlLiAgSWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0KLSAgLyogV2UgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBmaWxlIHN5bWJvbCBvciBzZWN0aW9uIHN5bWJvbHMuCi0gICAgIFRoZXkgbmV2ZXIgbmVlZCBtdW5naW5nLCBzbyBpdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGVtLiAgKi8KLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEdldCB0aGUgUEEgZHluX3N5bWJvbCAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggTkFNRS4gICovCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0gIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCSAgICAgIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgLyogRnVuY3Rpb24gc3ltYm9scyBmb3Igd2hpY2ggd2UgY3JlYXRlZCAub3BkIGVudHJpZXMgd2VyZSBtdW5nZWQKLSAgICAgYnkgZmluaXNoX2R5bmFtaWNfc3ltYm9sIGFuZCBoYXZlIHRvIGJlIHVuLW11bmdlZCBoZXJlLiAgKi8KLSAgaWYgKGR5bl9oICYmIGR5bl9oLT53YW50X29wZCkKLSAgICB7Ci0gICAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleC4gICovCi0gICAgICBzeW0tPnN0X3ZhbHVlID0gZHluX2gtPnN0X3ZhbHVlOwotICAgICAgc3ltLT5zdF9zaG5keCA9IGR5bl9oLT5zdF9zaG5keDsgCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9ocHBhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBhc2VjdGlvbiAqc3R1YiwgKnNwbHQsICpzZGx0LCAqc29wZCwgKnNwbHRyZWwsICpzZGx0cmVsOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLSAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKmR5bl9oOwotCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0gIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgc3R1YiA9IGhwcGFfaW5mby0+c3R1Yl9zZWM7Ci0gIHNwbHQgPSBocHBhX2luZm8tPnBsdF9zZWM7Ci0gIHNkbHQgPSBocHBhX2luZm8tPmRsdF9zZWM7Ci0gIHNvcGQgPSBocHBhX2luZm8tPm9wZF9zZWM7Ci0gIHNwbHRyZWwgPSBocHBhX2luZm8tPnBsdF9yZWxfc2VjOwotICBzZGx0cmVsID0gaHBwYV9pbmZvLT5kbHRfcmVsX3NlYzsKLQotICBCRkRfQVNTRVJUIChzdHViICE9IE5VTEwgJiYgc3BsdCAhPSBOVUxMCi0JICAgICAgJiYgc29wZCAhPSBOVUxMICYmIHNkbHQgIT0gTlVMTCkKLQotICAvKiBJbmNyZWRpYmxlLiAgSXQgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IHRvIE5PVCB1c2UgdGhlIHN5bWJvbCdzIHJlYWwKLSAgICAgdmFsdWUgd2hlbiBidWlsZGluZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZm9yIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgIEF0IGxlYXN0IGZvciBzeW1ib2xzIHRoYXQgcmVmZXIgdG8gZnVuY3Rpb25zLgotCi0gICAgIFdlIHdpbGwgc3RvcmUgYSBuZXcgdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggaW50byB0aGUgc3ltYm9sIGxvbmcKLSAgICAgZW5vdWdoIHRvIG91dHB1dCBpdCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgdGhlbiB3ZSByZXN0b3JlCi0gICAgIHRoZSBvcmlnaW5hbCB2YWx1ZXMgKGluIGVsZjY0X2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spLiAgKi8KLSAgaWYgKGR5bl9oICYmIGR5bl9oLT53YW50X29wZCkKLSAgICB7Ci0gICAgICAvKiBTYXZlIGF3YXkgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4IHNvIHRoYXQgd2UKLQkgY2FuIHJlc3RvcmUgdGhlbSBsYXRlci4gICovCi0gICAgICBkeW5faC0+c3RfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotICAgICAgZHluX2gtPnN0X3NobmR4ID0gc3ltLT5zdF9zaG5keDsKLQotICAgICAgLyogRm9yIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyeSwgd2Ugd2FudCB0aGUgdmFsdWUgdG8gYmUKLQkgYWRkcmVzcyBvZiB0aGlzIHN5bWJvbCdzIGVudHJ5IHdpdGhpbiB0aGUgLm9wZCBzZWN0aW9uLiAgKi8KLSAgICAgIHN5bS0+c3RfdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICAgICAgICsgc29wZC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBzb3BkLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHN5bS0+c3Rfc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJIHNvcGQtPm91dHB1dF9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIC5wbHQgZW50cnkgaWYgcmVxdWVzdGVkLiAgKi8KLSAgaWYgKGR5bl9oICYmIGR5bl9oLT53YW50X3BsdAotICAgICAgJiYgZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wIChkeW5faC0+aCwgaW5mbykpCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbDsKLQotICAgICAgLyogV2UgZG8gbm90IGFjdHVhbGx5IGNhcmUgYWJvdXQgdGhlIHZhbHVlIGluIHRoZSBQTFQgZW50cnkKLQkgaWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHRoZSBzeW1ib2wgaXMKLQkgc3RpbGwgdW5kZWZpbmVkLCB3ZSBjcmVhdGUgYSBkeW5hbWljIHJlbG9jYXRpb24gdG8gZmlsbAotCSBpbiB0aGUgY29ycmVjdCB2YWx1ZS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl2YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZSArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+dm1hKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAKLQotCSBUaGUgZm9ybWF0IG9mIGEgcGx0IGVudHJ5IGlzCi0JIDxmdW5jYWRkcj4gPF9fZ3A+LiAKLQotCSBwbHRfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBQTFQgc2VjdGlvbiBhdCB3aGljaCB0bwotCSBpbnN0YWxsIHRoZSBQTFQgZW50cnkuIAotCi0JIFdlIGFyZSBtb2RpZnlpbmcgdGhlIGluLW1lbW9yeSBQTFQgY29udGVudHMgaGVyZSwgc28gd2UgZG8gbm90IGFkZAotCSBpbiB0aGUgb3V0cHV0X29mZnNldCBvZiB0aGUgUExUIHNlY3Rpb24uICAqLwotCi0gICAgICBiZmRfcHV0XzY0IChzcGx0LT5vd25lciwgdmFsdWUsIHNwbHQtPmNvbnRlbnRzICsgZHluX2gtPnBsdF9vZmZzZXQpOwotICAgICAgdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKTsKLSAgICAgIGJmZF9wdXRfNjQgKHNwbHQtPm93bmVyLCB2YWx1ZSwgc3BsdC0+Y29udGVudHMgKyBkeW5faC0+cGx0X29mZnNldCArIDB4OCk7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGR5bmFtaWMgSVBMVCByZWxvY2F0aW9uIGZvciB0aGlzIGVudHJ5LgotCi0JIFdlIGFyZSBjcmVhdGluZyBhIHJlbG9jYXRpb24gaW4gdGhlIG91dHB1dCBmaWxlJ3MgUExUIHNlY3Rpb24sCi0JIHdoaWNoIGlzIGluY2x1ZGVkIHdpdGhpbiB0aGUgRExUIHNlY3Rvbi4gIFNvIHdlIGRvIG5lZWQgdG8gaW5jbHVkZQotCSB0aGUgUExUJ3Mgb3V0cHV0X29mZnNldCBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIHJlbG9jYXRpb24ncwotCSBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChkeW5faC0+cGx0X29mZnNldCArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfUEFSSVNDX0lQTFQpOwotICAgICAgcmVsLnJfYWRkZW5kID0gMDsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLCAmcmVsLAotCQkJCSAoKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJICAgc3BsdHJlbC0+Y29udGVudHMpCi0JCQkJICArIHNwbHRyZWwtPnJlbG9jX2NvdW50KSk7Ci0gICAgICBzcGx0cmVsLT5yZWxvY19jb3VudCsrOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIGFuIGV4dGVybmFsIGNhbGwgc3R1YiBlbnRyeSBpZiByZXF1ZXN0ZWQuICAqLwotICBpZiAoZHluX2ggJiYgZHluX2gtPndhbnRfc3R1YgotICAgICAgJiYgZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wIChkeW5faC0+aCwgaW5mbykpCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGludCBpbnNuOwotCi0gICAgICAvKiBJbnN0YWxsIHRoZSBnZW5lcmljIHN0dWIgdGVtcGxhdGUuCi0KLQkgV2UgYXJlIG1vZGlmeWluZyB0aGUgY29udGVudHMgb2YgdGhlIHN0dWIgc2VjdGlvbiwgc28gd2UgZG8gbm90Ci0JIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3R1YiBzZWN0aW9uJ3Mgb3V0cHV0X29mZnNldCBoZXJlLiAgKi8KLSAgICAgIG1lbWNweSAoc3R1Yi0+Y29udGVudHMgKyBkeW5faC0+c3R1Yl9vZmZzZXQsIHBsdF9zdHViLCBzaXplb2YgKHBsdF9zdHViKSk7Ci0KLSAgICAgIC8qIEZpeCB1cCB0aGUgZmlyc3QgbGRkIGluc3RydWN0aW9uLgotCi0JIFdlIGFyZSBtb2RpZnlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBTVFVCIHNlY3Rpb24gaW4gbWVtb3J5LAotCSBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbmNsdWRlIGl0cyBvdXRwdXQgb2Zmc2V0IGluIHRoaXMgY29tcHV0YXRpb24uIAotCi0JIE5vdGUgdGhlIHBsdF9vZmZzZXQgdmFsdWUgaXMgdGhlIHZhbHVlIG9mIHRoZSBQTFQgZW50cnkgcmVsYXRpdmUgdG8KLQkgdGhlIHN0YXJ0IG9mIHRoZSBQTFQgc2VjdGlvbi4gIFRoZXNlIGluc3RydWN0aW9ucyB3aWxsIHJlZmVyZW5jZQotCSBkYXRhIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZSBvZiBfX2dwLCB3aGljaCBtYXkgbm90IG5lY2Vzc2FyaWx5IGhhdmUKLQkgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgc3RhcnQgb2YgdGhlIFBMVCBzZWN0aW9uLgotCi0JIGdwX29mZnNldCBjb250YWlucyB0aGUgb2Zmc2V0IG9mIF9fZ3Agd2l0aGluIHRoZSBQTFQgc2VjdGlvbi4gICovCi0gICAgICB2YWx1ZSA9IGR5bl9oLT5wbHRfb2Zmc2V0IC0gaHBwYV9pbmZvLT5ncF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChzdHViLT5vd25lciwgc3R1Yi0+Y29udGVudHMgKyBkeW5faC0+c3R1Yl9vZmZzZXQpOwotICAgICAgaW5zbiAmPSAweGZmZmZjMDBlOwotICAgICAgaW5zbiB8PSAoKHZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0gICAgICB2YWx1ZSAmPSAweDFmZjg7Ci0gICAgICB2YWx1ZSA8PD0gMTsKLSAgICAgIGJmZF9wdXRfMzIgKHN0dWItPm93bmVyLCAoaW5zbiB8IHZhbHVlKSwKLQkJICBzdHViLT5jb250ZW50cyArIGR5bl9oLT5zdHViX29mZnNldCk7Ci0KLSAgICAgIC8qIEZpeCB1cCB0aGUgc2Vjb25kIGxkZCBpbnN0cnVjdGlvbi4gICovCi0gICAgICB2YWx1ZSA9IGR5bl9oLT5wbHRfb2Zmc2V0IC0gaHBwYV9pbmZvLT5ncF9vZmZzZXQgKyA4OwotICAgICAgCi0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoc3R1Yi0+b3duZXIsIHN0dWItPmNvbnRlbnRzICsgZHluX2gtPnN0dWJfb2Zmc2V0ICsgOCk7Ci0gICAgICBpbnNuICY9IDB4ZmZmZmMwMGU7Ci0gICAgICBpbnNuIHw9ICgodmFsdWUgJiAweDIwMDApID4+IDEzKTsKLSAgICAgIHZhbHVlICY9IDB4MWZmODsKLSAgICAgIHZhbHVlIDw8PSAxOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yi0+b3duZXIsIChpbnNuIHwgdmFsdWUpLAotCQkgIHN0dWItPmNvbnRlbnRzICsgZHluX2gtPnN0dWJfb2Zmc2V0ICsgOCk7Ci0gICAgfQotCi0gIC8qIE1pbGxpY29kZSBzeW1ib2xzIHNob3VsZCBub3QgYmUgcHV0IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZSB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4gICovCi0gIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfUEFSSVNDX01JTExJKQotICAgIGgtPmR5bmluZHggPSAtMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIC5vcGQgc2VjdGlvbiBjb250YWlucyBGUFRScyBmb3IgZWFjaCBmdW5jdGlvbiB0aGlzIGZpbGUKLSAgIGV4cG9ydHMuICBJbml0aWFsaXplIHRoZSBGUFRSIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaHBwYV9maW5hbGl6ZV9vcGQgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IGR5bl9oLT5oOwotICBhc2VjdGlvbiAqc29wZDsKLSAgYXNlY3Rpb24gKnNvcGRyZWw7Ci0KLSAgaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgc29wZCA9IGhwcGFfaW5mby0+b3BkX3NlYzsKLSAgc29wZHJlbCA9IGhwcGFfaW5mby0+b3BkX3JlbF9zZWM7Ci0KLSAgaWYgKGggJiYgZHluX2ggJiYgZHluX2gtPndhbnRfb3BkKQotICAgIHsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCB0d28gd29yZHMgb2YgYW4gLm9wZCBlbnRyeSBhcmUgemVyby4gCi0KLQkgV2UgYXJlIG1vZGlmeWluZyB0aGUgY29udGVudHMgb2YgdGhlIE9QRCBzZWN0aW9uIGluIG1lbW9yeSwgc28gd2UKLQkgZG8gbm90IG5lZWQgdG8gaW5jbHVkZSBpdHMgb3V0cHV0IG9mZnNldCBpbiB0aGlzIGNvbXB1dGF0aW9uLiAgKi8KLSAgICAgIG1lbXNldCAoc29wZC0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0gICAgICB2YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICAgICAgLyogVGhlIG5leHQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICAqLwotICAgICAgYmZkX3B1dF82NCAoc29wZC0+b3duZXIsIHZhbHVlLCBzb3BkLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpOwotCi0gICAgICAvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLSAgICAgIHZhbHVlID0gX2JmZF9nZXRfZ3BfdmFsdWUgKHNvcGQtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0gICAgICBiZmRfcHV0XzY0IChzb3BkLT5vd25lciwgdmFsdWUsIHNvcGQtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQgKyAyNCk7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgZ2VuZXJhdGUgRVBMVCByZWxvY2F0aW9ucwotICAgICBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgLm9wZCwgZXZlbiBmb3Igc3RhdGljIGZ1bmN0aW9ucyAodGhleSBtYXkgaGF2ZQotICAgICBoYWQgdGhlaXIgYWRkcmVzcyB0YWtlbikuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGR5bl9oICYmIGR5bl9oLT53YW50X29wZCkKLSAgICB7Ci0gICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhIHJlbDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBpbnQgZHluaW5keDsKLQotICAgICAgLyogV2UgbWF5IG5lZWQgdG8gZG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIGluCi0JIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIGl0J3MgZHluYW1pYyBzeW1ib2wgaW5kZXggb2ZmCi0JIHRoZSBsb2NhbCBzeW1ib2wgaGFzaCB0YWJsZS4gICovCi0gICAgICBpZiAoaCAmJiBoLT5keW5pbmR4ICE9IC0xKQotCWR5bmluZHggPSBoLT5keW5pbmR4OwotICAgICAgZWxzZQotCWR5bmluZHgKLQkgID0gX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCAoaW5mbywgZHluX2gtPm93bmVyLAotCQkJCQkJZHluX2gtPnN5bV9pbmR4KTsKLQotICAgICAgLyogVGhlIG9mZnNldCBvZiB0aGlzIHJlbG9jYXRpb24gaXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlCi0JIC5vcGQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChkeW5faC0+b3BkX29mZnNldCArIHNvcGQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBzb3BkLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICAgICAgLyogSWYgSCBpcyBub24tbnVsbCwgdGhlbiB3ZSBoYXZlIGFuIGV4dGVybmFsIHN5bWJvbC4KLQotCSBJdCBpcyBpbXBlcmF0aXZlIHRoYXQgd2UgdXNlIGEgZGlmZmVyZW50IGR5bmFtaWMgc3ltYm9sIGZvciB0aGUKLQkgRVBMVCByZWxvY2F0aW9uIGlmIHRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZS4KLQotCSBJbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIHRoZSBmdW5jdGlvbiBzeW1ib2wgd2lsbCBoYXZlIGEgdmFsdWUKLQkgd2hpY2ggaXMgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24ncyAub3BkIGVudHJ5LgotCi0JIFRodXMsIHdlIGNhbiBub3QgdXNlIHRoYXQgZHluYW1pYyBzeW1ib2wgZm9yIHRoZSBFUExUIHJlbG9jYXRpb24KLQkgKGlmIHdlIGRpZCwgdGhlIGRhdGEgaW4gdGhlIC5vcGQgd291bGQgcmVmZXJlbmNlIGl0c2VsZiByYXRoZXIKLQkgdGhhbiB0aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uKS4gIEluc3RlYWQgd2UgaGF2ZSB0byB1c2UKLQkgYSBuZXcgZHluYW1pYyBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBvcmlnaW5hbCBnbG9iYWwKLQkgZnVuY3Rpb24gc3ltYm9sLiAKLQotCSBXZSBwcmVmaXggdGhlIG9yaWdpbmFsIHN5bWJvbCB3aXRoIGEgIi4iIGFuZCB1c2UgdGhlIG5ldyBzeW1ib2wgaW4KLQkgdGhlIEVQTFQgcmVsb2NhdGlvbi4gIFRoaXMgbmV3IHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIHJlY29yZGVkIGluCi0JIHRoZSBzeW1ib2wgdGFibGUsIHdlIGp1c3QgaGF2ZSB0byBsb29rIGl0IHVwIGFuZCB1c2UgaXQuCi0KLQkgV2UgZG8gbm90IGhhdmUgc3VjaCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBmdW5jdGlvbnMgYmVjYXVzZSB3ZSBkbwotCSBub3QgbWFrZSB0aGVpciBhZGRyZXNzZXMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHBvaW50IHRvCi0JIHRoZSAub3BkIGVudHJ5LiAgVWx0aW1hdGVseSB0aGlzIHNob3VsZCBiZSBzYWZlIHNpbmNlIGEgc3RhdGljCi0JIGZ1bmN0aW9uIGNhbiBub3QgYmUgZGlyZWN0bHkgcmVmZXJlbmNlZCBvdXRzaWRlIG9mIGl0cyBzaGFyZWQKLQkgbGlicmFyeS4KLQotCSBXZSBkbyBoYXZlIHRvIHBsYXkgc2ltaWxhciBnYW1lcyBmb3IgRlBUUiByZWxvY2F0aW9ucyBpbiBzaGFyZWQKLQkgbGlicmFyaWVzLCBpbmNsdWRpbmcgdGhvc2UgZm9yIHN0YXRpYyBzeW1ib2xzLiAgU2VlIHRoZSBGUFRSCi0JIGhhbmRsaW5nIGluIGVsZjY0X2hwcGFfZmluYWxpemVfZHlucmVsb2MuICAqLwotICAgICAgaWYgKGgpCi0JewotCSAgY2hhciAqbmV3X25hbWU7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbmg7Ci0KLQkgIG5ld19uYW1lID0gYWxsb2NhIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpICsgMik7Ci0JICBuZXdfbmFtZVswXSA9ICcuJzsKLQkgIHN0cmNweSAobmV3X25hbWUgKyAxLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQotCSAgbmggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgbmV3X25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICAvKiBBbGwgd2UgcmVhbGx5IHdhbnQgZnJvbSB0aGUgbmV3IHN5bWJvbCBpcyBpdHMgZHluYW1pYwotCSAgICAgc3ltYm9sIGluZGV4LiAgKi8KLQkgIGR5bmluZHggPSBuaC0+ZHluaW5keDsKLQl9Ci0KLSAgICAgIHJlbC5yX2FkZGVuZCA9IDA7Ci0gICAgICByZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChkeW5pbmR4LCBSX1BBUklTQ19FUExUKTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoc29wZC0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLCAmcmVsLAotCQkJCSAoKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJICAgc29wZHJlbC0+Y29udGVudHMpCi0JCQkJICArIHNvcGRyZWwtPnJlbG9jX2NvdW50KSk7Ci0gICAgICBzb3BkcmVsLT5yZWxvY19jb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSAuZGx0IHNlY3Rpb24gY29udGFpbnMgYWRkcmVzc2VzIGZvciBpdGVtcyByZWZlcmVuY2VkIHRocm91Z2ggdGhlCi0gICBkbHQuICBOb3RlIHRoYXQgd2UgY2FuIGhhdmUgYSBETFRJTkQgcmVsb2NhdGlvbiBmb3IgYSBsb2NhbCBzeW1ib2wsIHRodXMKLSAgIHdlIGNhbiBub3QgZGVwZW5kIG9uIGZpbmlzaF9keW5hbWljX3N5bWJvbCB0byBpbml0aWFsaXplIHRoZSAuZGx0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfZmluYWxpemVfZGx0IChkeW5faCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKmR5bl9oOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKilkYXRhOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLSAgYXNlY3Rpb24gKnNkbHQsICpzZGx0cmVsOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IGR5bl9oLT5oOwotCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgc2RsdCA9IGhwcGFfaW5mby0+ZGx0X3NlYzsKLSAgc2RsdHJlbCA9IGhwcGFfaW5mby0+ZGx0X3JlbF9zZWM7Ci0KLSAgLyogSC9EWU5fSCBtYXkgcmVmZXIgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQgd2Uga25vdyBpdCdzCi0gICAgIGFkZHJlc3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGEgcmVsb2NhdGlvbi4gIEp1c3QgaW5zdGFsbAotICAgICB0aGUgcHJvcGVyIHZhbHVlIGludG8gdGhlIERMVCwgbm90ZSB0aGlzIHNob3J0Y3V0IGNhbiBub3QgYmUKLSAgICAgc2tpcHBlZCB3aGVuIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQgJiYgaCAmJiBkeW5faCAmJiBkeW5faC0+d2FudF9kbHQpCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotICAgICAgLyogSWYgd2UgaGFkIGFuIExUT0ZGX0ZQVFIgc3R5bGUgcmVsb2NhdGlvbiB3ZSB3YW50IHRoZSBETFQgZW50cnkKLQkgdG8gcG9pbnQgdG8gdGhlIEZQVFIgZW50cnkgaW4gdGhlIC5vcGQgc2VjdGlvbi4gCi0KLQkgV2UgaW5jbHVkZSB0aGUgT1BEJ3Mgb3V0cHV0IG9mZnNldCBpbiB0aGlzIGNvbXB1dGF0aW9uIGFzCi0JIHdlIGFyZSByZWZlcnJpbmcgdG8gYW4gYWJzb2x1dGUgYWRkcmVzcyBpbiB0aGUgcmVzdWx0aW5nCi0JIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIGlmIChkeW5faC0+d2FudF9vcGQpCi0JewotCSAgdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgaWYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIHZhbHVlICs9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGVsc2UKLQkgICAgdmFsdWUgKz0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT52bWE7Ci0JfQotCi0gICAgICAvKiBXZSBkbyBub3QgbmVlZCB0byBpbmNsdWRlIHRoZSBvdXRwdXQgb2Zmc2V0IG9mIHRoZSBETFQgc2VjdGlvbgotCSBoZXJlIGJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgaW4tbWVtb3J5IGNvbnRlbnRzLiAgKi8KLSAgICAgIGJmZF9wdXRfNjQgKHNkbHQtPm93bmVyLCB2YWx1ZSwgc2RsdC0+Y29udGVudHMgKyBkeW5faC0+ZGx0X29mZnNldCk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHRoZSBETFQgZW50cnkgYXNzb2NhdGVkIHdpdGggdGhpcyBzeW1ib2wuCi0gICAgIFdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSB0aGUgc3ltYm9sIGRvZXMgbm90IGhhdmUgdG8gYmUgZHluYW1pYy4gICovCi0gIGlmIChkeW5faC0+d2FudF9kbHQKLSAgICAgICYmIChlbGY2NF9ocHBhX2R5bmFtaWNfc3ltYm9sX3AgKGR5bl9oLT5oLCBpbmZvKSB8fCBpbmZvLT5zaGFyZWQpKQotICAgIHsKLSAgICAgIEVsZjY0X0ludGVybmFsX1JlbGEgcmVsOwotICAgICAgaW50IGR5bmluZHg7Ci0KLSAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBpbgotCSB3aGljaCBjYXNlIHdlIGhhdmUgdG8gbG9vayB1cCBpdCdzIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mZgotCSB0aGUgbG9jYWwgc3ltYm9sIGhhc2ggdGFibGUuICAqLwotICAgICAgaWYgKGggJiYgaC0+ZHluaW5keCAhPSAtMSkKLQlkeW5pbmR4ID0gaC0+ZHluaW5keDsKLSAgICAgIGVsc2UKLQlkeW5pbmR4Ci0JICA9IF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHggKGluZm8sIGR5bl9oLT5vd25lciwKLQkJCQkJCWR5bl9oLT5zeW1faW5keCk7Ci0KLQotICAgICAgLyogQ3JlYXRlIGEgZHluYW1pYyByZWxvY2F0aW9uIGZvciB0aGlzIGVudHJ5LiAgRG8gaW5jbHVkZSB0aGUgb3V0cHV0Ci0JIG9mZnNldCBvZiB0aGUgRExUIGVudHJ5IHNpbmNlIHdlIG5lZWQgYW4gYWJzb2x1dGUgYWRkcmVzcyBpbiB0aGUKLQkgcmVzdWx0aW5nIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChkeW5faC0+ZGx0X29mZnNldCArIHNkbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBzZGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGlmIChoICYmIGgtPnR5cGUgPT0gU1RUX0ZVTkMpCi0JICByZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChkeW5pbmR4LCBSX1BBUklTQ19GUFRSNjQpOwotICAgICAgZWxzZQotCSAgcmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoZHluaW5keCwgUl9QQVJJU0NfRElSNjQpOwotICAgICAgcmVsLnJfYWRkZW5kID0gMDsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoc2RsdC0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLCAmcmVsLAotCQkJCSAoKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJICAgc2RsdHJlbC0+Y29udGVudHMpCi0JCQkJICArIHNkbHRyZWwtPnJlbG9jX2NvdW50KSk7Ci0gICAgICBzZGx0cmVsLT5yZWxvY19jb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgU3BlY2lmaWNhbGx5IHRoZSBGUFRSIHJlbG9jYXRpb25zCi0gICBmb3IgZHluYW1pYyBmdW5jdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIHN0YXRpYyBkYXRhLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2hwcGFfZmluYWxpemVfZHlucmVsb2MgKGR5bl9oLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgaW50IGR5bmFtaWNfc3ltYm9sOwotCi0gIGR5bmFtaWNfc3ltYm9sID0gZWxmNjRfaHBwYV9keW5hbWljX3N5bWJvbF9wIChkeW5faC0+aCwgaW5mbyk7Ci0KLSAgaWYgKCFkeW5hbWljX3N5bWJvbCAmJiAhaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChkeW5faC0+cmVsb2NfZW50cmllcykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5fcmVsb2NfZW50cnkgKnJlbnQ7Ci0gICAgICBpbnQgZHluaW5keDsKLQotICAgICAgaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgICAgIGggPSBkeW5faC0+aDsKLQotICAgICAgLyogV2UgbWF5IG5lZWQgdG8gZG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIGluCi0JIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIGl0J3MgZHluYW1pYyBzeW1ib2wgaW5kZXggb2ZmCi0JIHRoZSBsb2NhbCBzeW1ib2wgaGFzaCB0YWJsZS4gICovCi0gICAgICBpZiAoaCAmJiBoLT5keW5pbmR4ICE9IC0xKQotCWR5bmluZHggPSBoLT5keW5pbmR4OwotICAgICAgZWxzZQotCWR5bmluZHgKLQkgID0gX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCAoaW5mbywgZHluX2gtPm93bmVyLAotCQkJCQkJZHluX2gtPnN5bV9pbmR4KTsKLQotICAgICAgZm9yIChyZW50ID0gZHluX2gtPnJlbG9jX2VudHJpZXM7IHJlbnQ7IHJlbnQgPSByZW50LT5uZXh0KQotCXsKLQkgIEVsZjY0X0ludGVybmFsX1JlbGEgcmVsOwotCi0JICBzd2l0Y2ggKHJlbnQtPnR5cGUpCi0JICAgIHsKLQkgICAgICBjYXNlIFJfUEFSSVNDX0ZQVFI2NDoKLQkgICAgICAvKiBBbGxvY2F0ZSBvbmUgaWZmIHdlIGFyZSBub3QgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQKLQkJICF3YW50X29wZCwgd2hpY2ggYnkgdGhpcyBwb2ludCB3aWxsIGJlIHRydWUgb25seSBpZiB3ZSdyZQotCQkgYWN0dWFsbHkgYWxsb2NhdGluZyBvbmUgc3RhdGljYWxseSBpbiB0aGUgbWFpbiBleGVjdXRhYmxlLiAgKi8KLQkgICAgICBpZiAoIWluZm8tPnNoYXJlZCAmJiBkeW5faC0+d2FudF9vcGQpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIENyZWF0ZSBhIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgdGhpcyBlbnRyeS4gCi0KLQkgICAgIFdlIG5lZWQgdGhlIG91dHB1dCBvZmZzZXQgZm9yIHRoZSByZWxvYydzIHNlY3Rpb24gYmVjYXVzZQotCSAgICAgd2UgYXJlIGNyZWF0aW5nIGFuIGFic29sdXRlIGFkZHJlc3MgaW4gdGhlIHJlc3VsdGluZyBvYmplY3QKLQkgICAgIGZpbGUuICAqLwotCSAgcmVsLnJfb2Zmc2V0ID0gKHJlbnQtPm9mZnNldCArIHJlbnQtPnNlYy0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbnQtPnNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIEFuIEZQVFI2NCByZWxvY2F0aW9uIGltcGxpZXMgdGhhdCB3ZSB0b29rIHRoZSBhZGRyZXNzIG9mCi0JICAgICBhIGZ1bmN0aW9uIGFuZCB0aGF0IHRoZSBmdW5jdGlvbiBoYXMgYW4gZW50cnkgaW4gdGhlIC5vcGQKLQkgICAgIHNlY3Rpb24uICBXZSB3YW50IHRoZSBGUFRSNjQgcmVsb2NhdGlvbiB0byByZWZlcmVuY2UgdGhlCi0JICAgICBlbnRyeSBpbiAub3BkLgotCi0JICAgICBXZSBjb3VsZCBtdW5nZSB0aGUgc3ltYm9sIHZhbHVlIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotCSAgICAgKGluIGZhY3Qgd2UgYWxyZWFkeSBkbyBmb3IgZnVuY3Rpb25zIHdpdGggZ2xvYmFsIHNjb3BlKSB0byBwb2ludAotCSAgICAgdG8gdGhlIC5vcGQgZW50cnkuICBUaGVuIHdlIGNvdWxkIHVzZSB0aGF0IGR5bmFtaWMgc3ltYm9sIGluCi0JICAgICB0aGlzIHJlbG9jYXRpb24uCi0KLQkgICAgIE9yIHdlIGNvdWxkIGRvIHNvbWV0aGluZyBzZW5zaWJsZSwgbm90IG11bmdlIHRoZSBzeW1ib2wncwotCSAgICAgYWRkcmVzcyBhbmQgaW5zdGVhZCBqdXN0IHVzZSBhIGRpZmZlcmVudCBzeW1ib2wgdG8gcmVmZXJlbmNlCi0JICAgICB0aGUgLm9wZCBlbnRyeS4gIEF0IGxlYXN0IHRoYXQgc2VlbXMgc2Vuc2libGUgdW50aWwgeW91Ci0JICAgICByZWFsaXplIHRoZXJlJ3Mgbm8gbG9jYWwgZHluYW1pYyBzeW1ib2xzIHdlIGNhbiB1c2UgZm9yIHRoYXQKLQkgICAgIHB1cnBvc2UuICBUaHVzIHRoZSBoYWlyIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZS4KLQkKLQkgICAgIFdlIHVzZSBhIHNlY3Rpb24gc3ltYm9sIHJlY29yZGVkIGJ5IGNoZWNrX3JlbG9jcyBhcyB0aGUKLQkgICAgIGJhc2Ugc3ltYm9sIGZvciB0aGUgcmVsb2NhdGlvbi4gIFRoZSBhZGRlbmQgaXMgdGhlIGRpZmZlcmVuY2UKLQkgICAgIGJldHdlZW4gdGhlIHNlY3Rpb24gc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgLm9wZCBlbnRyeS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIHJlbnQtPnR5cGUgPT0gUl9QQVJJU0NfRlBUUjY0KQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWx1ZSwgdmFsdWUyOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBpbnQgZWxmX2luZGV4OwotCi0JICAgICAgLyogRmlyc3QgY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgb3BkIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gICovCi0JICAgICAgdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICAgICAgICsgaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGhwcGFfaW5mby0+b3BkX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICAvKiBDb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gd2l0aAotCQkgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgICAgIHZhbHVlMiA9IChyZW50LT5zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgcmVudC0+c2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIC8qIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24KLQkJIHdpdGggdGhlIHJlbG9jYXRpb24gYW5kIHRoZSBvcGQgZW50cnkuICAqLwotCSAgICAgIHZhbHVlIC09IHZhbHVlMjsKLQkJCi0JICAgICAgLyogVGhlIHJlc3VsdCBiZWNvbWVzIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgICAgIHJlbC5yX2FkZGVuZCA9IHZhbHVlOwotCi0JICAgICAgLyogVGhlIHNlY3Rpb24gc3ltYm9sIGJlY29tZXMgdGhlIHN5bWJvbCBmb3IgdGhlIGR5bmFtaWMKLQkJIHJlbG9jYXRpb24uICAqLwotCSAgICAgIGR5bmluZHgKLQkJPSBfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4IChpbmZvLAotCQkJCQkJICAgICAgcmVudC0+c2VjLT5vd25lciwKLQkJCQkJCSAgICAgIHJlbnQtPnNlY19zeW1uZHgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJlbC5yX2FkZGVuZCA9IHJlbnQtPmFkZGVuZDsKLQotCSAgcmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoZHluaW5keCwgcmVudC0+dHlwZSk7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKGhwcGFfaW5mby0+b3RoZXJfcmVsX3NlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgJnJlbCwKLQkJCQkgICAgICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkgICAgICBocHBhX2luZm8tPm90aGVyX3JlbF9zZWMtPmNvbnRlbnRzKQotCQkJCSAgICAgICsgaHBwYV9pbmZvLT5vdGhlcl9yZWxfc2VjLT5yZWxvY19jb3VudCkpOwotCSAgaHBwYV9pbmZvLT5vdGhlcl9yZWxfc2VjLT5yZWxvY19jb3VudCsrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9ocHBhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotCi0gIGhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgLyogRmluYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAub3BkIHNlY3Rpb24uICAqLwotICBlbGY2NF9ocHBhX2R5bl9oYXNoX3RyYXZlcnNlICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQllbGY2NF9ocHBhX2ZpbmFsaXplX29wZCwKLQkJCQlpbmZvKTsKLQotICBlbGY2NF9ocHBhX2R5bl9oYXNoX3RyYXZlcnNlICgmaHBwYV9pbmZvLT5keW5faGFzaF90YWJsZSwKLQkJCQllbGY2NF9ocHBhX2ZpbmFsaXplX2R5bnJlbG9jLAotCQkJCWluZm8pOwotCi0gIC8qIEZpbmFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgLmRsdCBzZWN0aW9uLiAgKi8KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIC8qIEZpbmFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgLmRsdCBzZWN0aW9uLiAgKi8KLSAgZWxmNjRfaHBwYV9keW5faGFzaF90cmF2ZXJzZSAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJZWxmNjRfaHBwYV9maW5hbGl6ZV9kbHQsCi0JCQkJaW5mbyk7Ci0KLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX0hQX0xPQURfTUFQOgotCSAgICAgIC8qIENvbXB1dGUgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgMTZieXRlIHNjcmF0Y2hwYWQgYXJlYQotCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4KLQotCQkgQnkgY29udmVudGlvbiB0aGUgbGlua2VyIHNjcmlwdCB3aWxsIGFsbG9jYXRlIHRoZSBzY3JhdGNocGFkCi0JCSBhcmVhIGF0IHRoZSBzdGFydCBvZiB0aGUgLmRhdGEgc2VjdGlvbi4gIFNvIGFsbCB3ZSBoYXZlIHRvCi0JCSB0byBpcyBmaW5kIHRoZSBzdGFydCBvZiB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLmRhdGEiKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIC8qIEhQJ3MgdXNlIFBMVEdPVCB0byBzZXQgdGhlIEdPVCByZWdpc3Rlci4gICovCi0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBzID0gaHBwYV9pbmZvLT5wbHRfcmVsX3NlYzsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gaHBwYV9pbmZvLT5wbHRfcmVsX3NlYzsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgICBzID0gaHBwYV9pbmZvLT5vdGhlcl9yZWxfc2VjOwotCSAgICAgIGlmICghIHMpCi0JCXMgPSBocHBhX2luZm8tPmRsdF9yZWxfc2VjOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICBzID0gaHBwYV9pbmZvLT5vdGhlcl9yZWxfc2VjOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIHMgPSBocHBhX2luZm8tPmRsdF9yZWxfc2VjOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsICs9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBzID0gaHBwYV9pbmZvLT5vcGRfcmVsX3NlYzsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCArPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgLyogVGhlcmUgaXMgc29tZSBxdWVzdGlvbiBhYm91dCB3aGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSBvZgotCQkgdGhlIFBMVCByZWxvY3Mgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUuICBIUCdzIHRvb2xzIGRvCi0JCSBpdCwgc28gd2UnbGwgZW11bGF0ZSB0aGVtLiAgKi8KLQkgICAgICBzID0gaHBwYV9pbmZvLT5wbHRfcmVsX3NlYzsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCArPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBoZHJzIHdlIHdpbGwgbmVlZC4KLQotICAgVGhlIGdlbmVyaWMgRUxGIGNvZGUgb25seSBjcmVhdGVzIFBUX1BIRFJzIGZvciBleGVjdXRhYmxlcy4gIFRoZSBIUAotICAgZHluYW1pYyBsaW5rZXIgcmVxdWlyZXMgUFRfUEhEUnMgZm9yIGR5bmFtaWMgbGlicmFyaWVzIHRvby4gCi0KLSAgIFRoaXMgcm91dGluZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYmFja2VuZCBuZWVkcyBvbmUgYWRkaXRpb25hbCBwcm9ncmFtCi0gICBoZWFkZXIgZm9yIHRoYXQgY2FzZS4KLQotICAgTm90ZSB3ZSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxpbmsgaW5mbyBzdHJ1Y3R1cmUgaGVyZSwgc28gd2UgaGF2ZQotICAgdG8gZ3Vlc3Mgd2hldGhlciBvciBub3Qgd2UgYXJlIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYmFzZWQgb24gdGhlCi0gICBleGlzdGVuY2Ugb2YgYSAuaW50ZXJwIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1lbGY2NF9ocHBhX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHdlIGhhdmUgdG8gY3JlYXRlIGEKLSAgICAgUFRfUEhEUiBzZWdtZW50LiAgSFAncyBkeW5hbWljIGxpbmtlciBjaG9rZXMgd2l0aG91dCBpdC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKCEgcykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFueSBwcm9ncmFtIGhlYWRlcnMgcmVxdWlyZWQgYnkgdGhpcwotICAgc3BlY2lmaWMgYmFja2VuZC4KLQotICAgVGhlIGdlbmVyaWMgRUxGIGNvZGUgb25seSBjcmVhdGVzIFBUX1BIRFJzIGZvciBleGVjdXRhYmxlcy4gIFRoZSBIUAotICAgZHluYW1pYyBsaW5rZXIgcmVxdWlyZXMgUFRfUEhEUnMgZm9yIGR5bmFtaWMgbGlicmFyaWVzIHRvby4gCi0KLSAgIFRoaXMgYWxsb2NhdGVzIHRoZSBQVF9QSERSIGFuZCBpbml0aWFsaXplcyBpdCBpbiBhIG1hbm5lciBzdWl0YWJsZQotICAgZm9yIHRoZSBIUCBsaW5rZXIuIAotCi0gICBOb3RlIHdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgbGluayBpbmZvIHN0cnVjdHVyZSBoZXJlLCBzbyB3ZSBoYXZlCi0gICB0byBndWVzcyB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBiYXNlZCBvbiB0aGUKLSAgIGV4aXN0ZW5jZSBvZiBhIC5pbnRlcnAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9ocHBhX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotICBhc2VjdGlvbiAqczsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmICghIHMpCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9QSERSKQotCSAgYnJlYWs7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXsKLQkgIG0gPSAoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm0pOwotCSAgaWYgKG0gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBtLT5wX3R5cGUgPSBQVF9QSERSOwotCSAgbS0+cF9mbGFncyA9IFBGX1IgfCBQRl9YOwotCSAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0JICBtLT5wX3BhZGRyX3ZhbGlkID0gMTsKLQkgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKLQotCSAgbS0+bmV4dCA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgPSBtOwotCX0KLSAgICB9Ci0KLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgaWYgKG0tPnBfdHlwZSA9PSBQVF9MT0FEKQotICAgICAgewotICAgICAgICBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBtLT5jb3VudDsgaSsrKQotCSAgewotCSAgICAvKiBUaGUgY29kZSAiaGludCIgaXMgbm90IHJlYWxseSBhIGhpbnQuICBJdCBpcyBhIHJlcXVpcmVtZW50Ci0JICAgICAgIGZvciBjZXJ0YWluIHZlcnNpb25zIG9mIHRoZSBIUCBkeW5hbWljIGxpbmtlci4gIFdvcnNlIHlldCwKLQkgICAgICAgaXQgbXVzdCBiZSBzZXQgZXZlbiBpZiB0aGUgc2hhcmVkIGxpYnJhcnkgZG9lcyBub3QgaGF2ZQotCSAgICAgICBhbnkgY29kZSBpbiBpdHMgInRleHQiIHNlZ21lbnQgKHRodXMgdGhlIGNoZWNrIGZvciAuaGFzaAotCSAgICAgICB0byBjYXRjaCB0aGlzIHNpdHVhdGlvbikuICAqLwotCSAgICBpZiAobS0+c2VjdGlvbnNbaV0tPmZsYWdzICYgU0VDX0NPREUKLQkJfHwgKHN0cmNtcCAobS0+c2VjdGlvbnNbaV0tPm5hbWUsICIuaGFzaCIpID09IDApKQotCSAgICAgIG0tPnBfZmxhZ3MgfD0gKFBGX1ggfCBQRl9IUF9DT0RFKTsKLQkgIH0KLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGhhc2ggYnVja2V0IHNpemUgaXMgdGhlIHN0YW5kYXJkIG9uZSwgbmFtZWx5IDQuICAqLwotCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBocHBhNjRfZWxmX3NpemVfaW5mbyA9Ci17Ci0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRWhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUGhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0R5biksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAotICA0LAotICAxLAotICA2NCwgOCwKLSAgRUxGQ0xBU1M2NCwgRVZfQ1VSUkVOVCwKLSAgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycywKLSAgYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICBiZmRfZWxmNjRfd3JpdGVfcmVsb2NzLAotICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0LAotICBiZmRfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGY2NF9ocHBhX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtaHBwYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9ocHBhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX1BBUklTQwotLyogVGhpcyBpcyBub3Qgc3RyaWN0bHkgY29ycmVjdC4gIFRoZSBtYXhpbXVtIHBhZ2Ugc2l6ZSBmb3IgUEEyLjAgaXMKLSAgIDY0TS4gIEJ1dCBldmVyeXRoaW5nIHN0aWxsIHVzZXMgNGsuICAqLwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgICAgICAgZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2hwcGFfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9ocHBhX2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJZWxmNjRfaHBwYV9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJZWxmNjRfaHBwYV9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zIAllbGZfaHBwYV9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawllbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCSAgICBlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rCWVsZl9ocHBhX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjY0X2hwcGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJZWxmNjRfaHBwYV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjY0X2hwcGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmNjRfaHBwYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLQotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGY2NF9ocHBhX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjY0X2hwcGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLQotLyogU3R1ZmYgZm9yIHRoZSBCRkQgbGlua2VyOiAqLwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCWVsZjY0X2hwcGFfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotCWVsZjY0X2hwcGFfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIFwKLSAgaHBwYTY0X2VsZl9zaXplX2luZm8KLQotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCi0JZWxmNjRfaHBwYV9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCBcCi0JZWxmNjRfaHBwYV9tb2RpZnlfc2VnbWVudF9tYXAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JZWxmNjRfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vawotCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0CTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5CTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplICAgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSAgICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayB0cnVlCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1ocHBhLmggYi9iZmQvZWxmNjQtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk4ZTBjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBFTEY2NC9IUFBBIHN1cHBvcnQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRjY0X0hQUEFfSAotI2RlZmluZSBfRUxGNjRfSFBQQV9ICi0KLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0KLWV4dGVybiBlbGZfaHBwYV9yZWxvY190eXBlICoqIF9iZmRfZWxmNjRfaHBwYV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgZWxmX2hwcGFfcmVsb2NfdHlwZSwgaW50LCBpbnQsIGludCwgYXN5bWJvbCAqKSk7Ci0KLS8qIERlZmluZSBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2NhdGlvbgotICAgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUKLSAgIGJldHdlZW4gdGhlIHR3byB0YXJnZXQgb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9QQVJJU0NfTk9ORQotI2RlZmluZSBSX0hQUEEJCQkJUl9QQVJJU0NfRElSNjQKLSNkZWZpbmUgUl9IUFBBX0dPVE9GRgkJCVJfUEFSSVNDX0RMVFJFTDIxTAotI2RlZmluZSBSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQVJJU0NfUENSRUwyMUwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9QQVJJU0NfRElSMTdGCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9QQVJJU0NfVU5JTVBMRU1FTlRFRAotCi0jZW5kaWYgLyogX0VMRjY0X0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWlhNjQuYyBiL2JmZC9lbGY2NC1pYTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWZlYjEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LWlhNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwOTcgKzAsMCBAQAotLyogSUEtNjQgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJvcGNvZGUvaWE2NC5oIgotI2luY2x1ZGUgImVsZi9pYTY0LmgiCi0KLQotLyoKLSAqIFRIRSBSVUxFUyBmb3IgYWxsIHRoZSBzdHVmZiB0aGUgbGlua2VyIGNyZWF0ZXMgLS0KLSAqCi0gKiBHT1QJCUVudHJpZXMgY3JlYXRlZCBpbiByZXNwb25zZSB0byBMVE9GRiBvciBMVE9GRl9GUFRSCi0gKgkJcmVsb2NhdGlvbnMuICBEeW5hbWljIHJlbG9jcyBjcmVhdGVkIGZvciBkeW5hbWljCi0gKgkJc3ltYm9scyBpbiBhbiBhcHBsaWNhdGlvbjsgUkVMIHJlbG9jcyBmb3IgbG9jYWxzCi0gKgkJaW4gYSBzaGFyZWQgbGlicmFyeS4KLSAqCi0gKiBGUFRSCQlUaGUgY2Fub25pY2FsIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBDcmVhdGVkIGZvciBsb2NhbAotICoJCXN5bWJvbHMgaW4gYXBwbGljYXRpb25zLiAgRGVzY3JpcHRvcnMgZm9yIGR5bmFtaWMgc3ltYm9scwotICoJCWFuZCBsb2NhbCBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGNyZWF0ZWQgYnkKLSAqCQlsZC5zby4gIFRodXMgdGhlcmUgYXJlIG5vIGR5bmFtaWMgcmVsb2NzIGFnYWluc3QgdGhlc2UKLSAqCQlvYmplY3RzLiAgVGhlIEZQVFIgcmVsb2NzIGZvciBzdWNoIF9hcmVfIHBhc3NlZCB0aHJvdWdoCi0gKgkJdG8gdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiB0YWJsZXMuCi0gKgotICogRlVMTF9QTFQJQ3JlYXRlZCBmb3IgYSBQQ1JFTDIxQiByZWxvY2F0aW9uIGFnYWluc3QgYSBkeW5hbWljIHN5bWJvbC4KLSAqCQlSZXF1aXJlcyB0aGUgY3JlYXRpb24gb2YgYSBQTFRPRkYgZW50cnkuICBUaGlzIGRvZXMgbm90Ci0gKgkJcmVxdWlyZSBhbnkgZHluYW1pYyByZWxvY2F0aW9ucy4KLSAqCi0gKiBQTFRPRkYJQ3JlYXRlZCBieSBQTFRPRkYgcmVsb2NhdGlvbnMuICBGb3IgbG9jYWwgc3ltYm9scywgdGhpcwotICoJCWlzIGFuIGFsdGVybmF0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgaW4gc2hhcmVkIGxpYnJhcmllcwotICoJCXJlcXVpcmVzIHR3byBSRUwgcmVsb2NhdGlvbnMuICBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUKLSAqCQl0cmFuc2Zvcm1lZCBpbnRvIGFuIEZQVFIgcmVsb2NhdGlvbiwgc2luY2UgaXQgbXVzdCBiZSBpbgotICoJCXJhbmdlIG9mIHRoZSBHUC4gIEZvciBkeW5hbWljIHN5bWJvbHMsIHRoaXMgaXMgYSBmdW5jdGlvbgotICoJCWRlc2NyaXB0b3IgZm9yIGEgTUlOX1BMVCBlbnRyeSwgYW5kIHJlcXVpcmVzIG9uZSBJUExUIHJlbG9jLgotICoKLSAqIE1JTl9QTFQJQ3JlYXRlZCBieSBQTFRPRkYgZW50cmllcyBhZ2FpbnN0IGR5bmFtaWMgc3ltYm9scy4gIFRoaXMKLSAqCQlkb2VzIG5vdCByZXFpcmUgZHluYW1pYyByZWxvY2F0aW9ucy4KLSAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCQkvKiB3ZSB3YW50IFJFTEEgcmVsb2NzLCBub3QgUkVMICovCi0KLSNkZWZpbmUgTkVMRU1TKGEpCSgoaW50KSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoKGEpWzBdKSkpCi0KLXR5cGVkZWYgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld19oYXNoX2VudHJ5X2Z1bmMpCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEluIGR5bmFtaWNhbGx5IChsaW5rZXItKSBjcmVhdGVkIHNlY3Rpb25zLCB3ZSBnZW5lcmFsbHkgbmVlZCB0byBrZWVwIHRyYWNrCi0gICBvZiB0aGUgcGxhY2UgYSBzeW1ib2wgb3IgZXhwcmVzc2lvbiBnb3QgYWxsb2NhdGVkIHRvLiBUaGlzIGlzIGRvbmUgdmlhIGhhc2gKLSAgIHRhYmxlcyB0aGF0IHN0b3JlIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlLiAgKi8KLQotc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvCi17Ci0gIC8qIFRoZSBhZGRlbmQgZm9yIHdoaWNoIHRoaXMgZW50cnkgaXMgcmVsZXZhbnQuICAqLwotICBiZmRfdm1hIGFkZGVuZDsKLQotICAvKiBOZXh0IGFkZGVuZCBpbiB0aGUgbGlzdC4gICovCi0gIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqbmV4dDsKLQotICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gIGJmZF92bWEgZnB0cl9vZmZzZXQ7Ci0gIGJmZF92bWEgcGx0b2ZmX29mZnNldDsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotICBiZmRfdm1hIHBsdDJfb2Zmc2V0OwotCi0gIC8qIFRoZSBzeW1ib2wgdGFibGUgZW50cnksIGlmIGFueSwgdGhhdCB0aGlzIHdhcyBkZXJyaXZlZCBmcm9tLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIAotICAvKiBVc2VkIHRvIGNvdW50IG5vbi1nb3QsIG5vbi1wbHQgcmVsb2NhdGlvbnMgZm9yIGRlbGF5ZWQgc2l6aW5nCi0gICAgIG9mIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fcmVsb2NfZW50cnkKLSAgewotICAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9yZWxvY19lbnRyeSAqbmV4dDsKLSAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICBpbnQgdHlwZTsKLSAgICBpbnQgY291bnQ7Ci0gIH0gKnJlbG9jX2VudHJpZXM7Ci0KLSAgLyogVHJ1ZSB3aGVuIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB1cGRhdGVkLiAgKi8KLSAgdW5zaWduZWQgZ290X2RvbmUgOiAxOwotICB1bnNpZ25lZCBmcHRyX2RvbmUgOiAxOwotICB1bnNpZ25lZCBwbHRvZmZfZG9uZSA6IDE7Ci0KLSAgLyogVHJ1ZSBmb3IgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBsaW5rZXIgZGF0YSB3ZSB3YW50IGNyZWF0ZWQuICAqLwotICB1bnNpZ25lZCB3YW50X2dvdCA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfZnB0ciA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfbHRvZmZfZnB0ciA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfcGx0IDogMTsKLSAgdW5zaWduZWQgd2FudF9wbHQyIDogMTsKLSAgdW5zaWduZWQgd2FudF9wbHRvZmYgOiAxOwotfTsKLQotc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICppbmZvOwotfTsKLQotc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogTm8gYWRkaXRpb25hbCBmaWVsZHMgZm9yIG5vdy4gICovCi19OwotCi1zdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICppbmZvOwotfTsKLQotc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICBhc2VjdGlvbiAqZ290X3NlYzsJCS8qIHRoZSBsaW5rYWdlIHRhYmxlIHNlY3Rpb24gKG9yIE5VTEwpICovCi0gIGFzZWN0aW9uICpyZWxfZ290X3NlYzsJLyogZHluYW1pYyByZWxvY2F0aW9uIHNlY3Rpb24gZm9yIHNhbWUgKi8KLSAgYXNlY3Rpb24gKmZwdHJfc2VjOwkJLyogZnVuY3Rpb24gZGVzY3JpcHRvciB0YWJsZSAob3IgTlVMTCkgKi8KLSAgYXNlY3Rpb24gKnBsdF9zZWM7CQkvKiB0aGUgcHJpbWFyeSBwbHQgc2VjdGlvbiAob3IgTlVMTCkgKi8KLSAgYXNlY3Rpb24gKnBsdG9mZl9zZWM7CQkvKiBwcml2YXRlIGRlc2NyaXB0b3JzIGZvciBwbHQgKG9yIE5VTEwpICovCi0gIGFzZWN0aW9uICpyZWxfcGx0b2ZmX3NlYzsJLyogZHluYW1pYyByZWxvY2F0aW9uIHNlY3Rpb24gZm9yIHNhbWUgKi8KLQotICBiZmRfc2l6ZV90eXBlIG1pbnBsdF9lbnRyaWVzOwkvKiBudW1iZXIgb2YgbWlucGx0IGVudHJpZXMgKi8KLQotICBzdHJ1Y3QgZWxmNjRfaWE2NF9sb2NhbF9oYXNoX3RhYmxlIGxvY19oYXNoX3RhYmxlOwotfTsKLQotI2RlZmluZSBlbGY2NF9pYTY0X2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9pYTY0X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqcmVsb2MsIGFzeW1ib2wgKnN5bSwgUFRSIGRhdGEsCi0JICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZCAqb3V0cHV0X2JmZCwgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbG9va3VwX2hvd3RvCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCBydHlwZSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmVsZjY0X2lhNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX2NvZGUpKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2lhNjRfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmJmZF9yZWxvYywgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9pYTY0X3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICBib29sZWFuICphZ2FpbikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkciwgYXNlY3Rpb24gKnNlYykpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lcCwgZmxhZ3dvcmQgKmZsYWdzcCwgYXNlY3Rpb24gKipzZWNwLAotCSAgIGJmZF92bWEgKnZhbHApKTsKLXN0YXRpYyBpbnQgZWxmNjRfaWE2NF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfZHluYW1pY19zeW1ib2xfcAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfbG9jYWxfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfdGFibGUgKmh0LCBiZmQgKmFiZmQsCi0JICAgbmV3X2hhc2hfZW50cnlfZnVuYyBuZXcpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjY0X2lhNjRfbmV3X2xvY19oYXNoX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGY2NF9pYTY0X25ld19lbGZfaGFzaF9lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGY2NF9pYTY0X2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfZW50cnkgKmVsZjY0X2lhNjRfbG9jYWxfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF90YWJsZSAqdGFibGUsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkgICBib29sZWFuIGNyZWF0ZSwgYm9vbGVhbiBjb3B5KSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2UKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm8sCi0JICAgYm9vbGVhbiAoKmZ1bmMpKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqLCBQVFIpLAotCSAgIFBUUiBpbmZvKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9pYTY0X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKiBnZXRfZHluX3N5bV9pbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZCAqYWJmZCwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgYm9vbGVhbiBjcmVhdGUpKTsKLXN0YXRpYyBhc2VjdGlvbiAqZ2V0X2dvdAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmdldF9mcHRyCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm8pKTsKLXN0YXRpYyBhc2VjdGlvbiAqZ2V0X3BsdG9mZgotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmdldF9yZWxvY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm8sCi0JICAgYXNlY3Rpb24gKnNlYywgYm9vbGVhbiBjcmVhdGUpKTsKLXN0YXRpYyBib29sZWFuIGNvdW50X2R5bl9yZWxvYwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksCi0JICAgYXNlY3Rpb24gKnNyZWwsIGludCB0eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9pYTY0X2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqc2VjLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2xvYmFsX3N5bV9pbmRleAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCkpOwotc3RhdGljIGJvb2xlYW4gYWxsb2NhdGVfZnB0cgotICBQQVJBTVMgKChzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pLCBQVFIgZGF0YSkpOwotc3RhdGljIGJvb2xlYW4gYWxsb2NhdGVfZ2xvYmFsX2RhdGFfZ290Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksIFBUUiBkYXRhKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbGxvY2F0ZV9nbG9iYWxfZnB0cl9nb3QKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faSwgUFRSIGRhdGEpKTsKLXN0YXRpYyBib29sZWFuIGFsbG9jYXRlX2xvY2FsX2dvdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pLCBQVFIgZGF0YSkpOwotc3RhdGljIGJvb2xlYW4gYWxsb2NhdGVfcGx0b2ZmX2VudHJpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faSwgUFRSIGRhdGEpKTsKLXN0YXRpYyBib29sZWFuIGFsbG9jYXRlX3BsdF9lbnRyaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksIFBUUiBkYXRhKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbGxvY2F0ZV9wbHQyX2VudHJpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faSwgUFRSIGRhdGEpKTsKLXN0YXRpYyBib29sZWFuIGFsbG9jYXRlX2R5bnJlbF9lbnRyaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksIFBUUiBkYXRhKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9pYTY0X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9ieXRlICpoaXRfYWRkciwgYmZkX3ZtYSB2YWwsIHVuc2lnbmVkIGludCByX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGVsZjY0X2lhNjRfaW5zdGFsbF9keW5fcmVsb2MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlYywKLQkgICBhc2VjdGlvbiAqc3JlbCwgYmZkX3ZtYSBvZmZzZXQsIHVuc2lnbmVkIGludCB0eXBlLAotCSAgIGxvbmcgZHluaW5keCwgYmZkX3ZtYSBhZGRlbmQpKTsKLXN0YXRpYyBiZmRfdm1hIHNldF9nb3RfZW50cnkKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pLCBsb25nIGR5bmluZHgsCi0JICAgYmZkX3ZtYSBhZGRlbmQsIGJmZF92bWEgdmFsdWUsIHVuc2lnbmVkIGludCBkeW5fcl90eXBlKSk7Ci1zdGF0aWMgYmZkX3ZtYSBzZXRfZnB0cl9lbnRyeQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksCi0JICAgYmZkX3ZtYSB2YWx1ZSkpOwotc3RhdGljIGJmZF92bWEgc2V0X3BsdG9mZl9lbnRyeQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2ksCi0JICAgYmZkX3ZtYSB2YWx1ZSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX2J5dGUgKmNvbnRlbnRzLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9ucykpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9pYTY0X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2lhNjRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfaWE2NF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIHB0cikpOwotCi0MCi0vKiBpYTY0LXNwZWNpZmljIHJlbG9jYXRpb24gKi8KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24uICBOb3QgbXVjaCB0byBkbyBoZXJlIGFzIGFsbCB0aGUgaGFyZCB3b3JrIGlzCi0gICBkb25lIGluIGVsZjY0X2lhNjRfZmluYWxfbGlua19yZWxvY2F0ZS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9pYTY0X3JlbG9jIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0gICplcnJvcl9tZXNzYWdlID0gIlVuc3VwcG9ydGVkIGNhbGwgdG8gZWxmNjRfaWE2NF9yZWxvYyI7Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0jZGVmaW5lIElBNjRfSE9XVE8oVFlQRSwgTkFNRSwgU0laRSwgUENSRUwsIElOKQkJCVwKLSAgSE9XVE8gKFRZUEUsIDAsIFNJWkUsIDAsIFBDUkVMLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCVwKLQkgZWxmNjRfaWE2NF9yZWxvYywgTkFNRSwgZmFsc2UsIDAsIDAsIElOKQotCi0vKiBUaGlzIHRhYmxlIGhhcyB0byBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIGluY3JlYXNpbmcgbnVtYmVyIG9mIHRoZQotICAgVFlQRSBmaWVsZC4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBpYTY0X2hvd3RvX3RhYmxlW10gPQotICB7Ci0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X05PTkUsCSAgICAiTk9ORSIsCSAgIDAsIGZhbHNlLCB0cnVlKSwKLQotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9JTU0xNCwJICAgICJJTU0xNCIsCSAgIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfSU1NMjIsCSAgICAiSU1NMjIiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0lNTTY0LAkgICAgIklNTTY0IiwJICAgMCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9ESVIzMk1TQiwgICAgIkRJUjMyTVNCIiwJICAgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9ESVIzMkxTQiwgICAgIkRJUjMyTFNCIiwJICAgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9ESVI2NE1TQiwgICAgIkRJUjY0TVNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9ESVI2NExTQiwgICAgIkRJUjY0TFNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0dQUkVMMjIsCSAgICAiR1BSRUwyMiIsCSAgIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfR1BSRUw2NEksICAgICJHUFJFTDY0SSIsCSAgIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfR1BSRUwzMk1TQiwgICJHUFJFTDMyTVNCIiwgIDIsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfR1BSRUwzMkxTQiwgICJHUFJFTDMyTFNCIiwgIDIsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfR1BSRUw2NE1TQiwgICJHUFJFTDY0TVNCIiwgIDQsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfR1BSRUw2NExTQiwgICJHUFJFTDY0TFNCIiwgIDQsIGZhbHNlLCB0cnVlKSwKLQotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVE9GRjIyLAkgICAgIkxUT0ZGMjIiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0xUT0ZGNjRJLCAgICAiTFRPRkY2NEkiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUExUT0ZGMjIsICAgICJQTFRPRkYyMiIsCSAgIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUExUT0ZGNjRJLCAgICJQTFRPRkY2NEkiLCAgIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUExUT0ZGNjRNU0IsICJQTFRPRkY2NE1TQiIsIDQsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUExUT0ZGNjRMU0IsICJQTFRPRkY2NExTQiIsIDQsIGZhbHNlLCB0cnVlKSwKLQotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9GUFRSNjRJLAkgICAgIkZQVFI2NEkiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0ZQVFIzMk1TQiwgICAiRlBUUjMyTVNCIiwgICAyLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0ZQVFIzMkxTQiwgICAiRlBUUjMyTFNCIiwgICAyLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0ZQVFI2NE1TQiwgICAiRlBUUjY0TVNCIiwgICA0LCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0ZQVFI2NExTQiwgICAiRlBUUjY0TFNCIiwgICA0LCBmYWxzZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUENSRUw2MEIsICAgICJQQ1JFTDYwQiIsCSAgIDAsIHRydWUsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9QQ1JFTDIxQiwgICAgIlBDUkVMMjFCIiwJICAgMCwgdHJ1ZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1BDUkVMMjFNLCAgICAiUENSRUwyMU0iLAkgICAwLCB0cnVlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUENSRUwyMUYsICAgICJQQ1JFTDIxRiIsCSAgIDAsIHRydWUsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9QQ1JFTDMyTVNCLCAgIlBDUkVMMzJNU0IiLCAgMiwgdHJ1ZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1BDUkVMMzJMU0IsICAiUENSRUwzMkxTQiIsICAyLCB0cnVlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUENSRUw2NE1TQiwgICJQQ1JFTDY0TVNCIiwgIDQsIHRydWUsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9QQ1JFTDY0TFNCLCAgIlBDUkVMNjRMU0IiLCAgNCwgdHJ1ZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfTFRPRkZfRlBUUjIyLCAiTFRPRkZfRlBUUjIyIiwgMCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVE9GRl9GUFRSNjRJLCAiTFRPRkZfRlBUUjY0SSIsIDAsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfTFRPRkZfRlBUUjY0TVNCLCAiTFRPRkZfRlBUUjY0TVNCIiwgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVE9GRl9GUFRSNjRMU0IsICJMVE9GRl9GUFRSNjRMU0IiLCA0LCBmYWxzZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfU0VHQkFTRSwJICAgICJTRUdCQVNFIiwJICAgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9TRUdSRUwzMk1TQiwgIlNFR1JFTDMyTVNCIiwgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9TRUdSRUwzMkxTQiwgIlNFR1JFTDMyTFNCIiwgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9TRUdSRUw2NE1TQiwgIlNFR1JFTDY0TVNCIiwgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9TRUdSRUw2NExTQiwgIlNFR1JFTDY0TFNCIiwgNCwgZmFsc2UsIHRydWUpLAotCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1NFQ1JFTDMyTVNCLCAiU0VDUkVMMzJNU0IiLCAyLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1NFQ1JFTDMyTFNCLCAiU0VDUkVMMzJMU0IiLCAyLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1NFQ1JFTDY0TVNCLCAiU0VDUkVMNjRNU0IiLCA0LCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1NFQ1JFTDY0TFNCLCAiU0VDUkVMNjRMU0IiLCA0LCBmYWxzZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUkVMMzJNU0IsICAgICJSRUwzMk1TQiIsCSAgIDIsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUkVMMzJMU0IsICAgICJSRUwzMkxTQiIsCSAgIDIsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUkVMNjRNU0IsICAgICJSRUw2NE1TQiIsCSAgIDQsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUkVMNjRMU0IsICAgICJSRUw2NExTQiIsCSAgIDQsIGZhbHNlLCB0cnVlKSwKLQotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVFYzMk1TQiwgICAgIkxUVjMyTVNCIiwJICAgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVFYzMkxTQiwgICAgIkxUVjMyTFNCIiwJICAgMiwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVFY2NE1TQiwgICAgIkxUVjY0TVNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVFY2NExTQiwgICAgIkxUVjY0TFNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1BDUkVMMjFCSSwgICAiUENSRUwyMUJJIiwgICAwLCB0cnVlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfUENSRUwyMiwgICAgICJQQ1JFTDIyIiwgICAgIDAsIHRydWUsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9QQ1JFTDY0SSwgICAgIlBDUkVMNjRJIiwgICAgMCwgdHJ1ZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfSVBMVE1TQiwJICAgICJJUExUTVNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9JUExUTFNCLAkgICAgIklQTFRMU0IiLAkgICA0LCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0VQTFRNU0IsCSAgICAiRVBMVE1TQiIsCSAgIDQsIGZhbHNlLCB0cnVlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfRVBMVExTQiwJICAgICJFUExUTFNCIiwJICAgNCwgZmFsc2UsIHRydWUpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9DT1BZLAkgICAgIkNPUFkiLAkgICA0LCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0xUT0ZGMjJYLCAgICAiTFRPRkYyMlgiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X0xEWE1PViwJICAgICJMRFhNT1YiLAkgICAwLCBmYWxzZSwgdHJ1ZSksCi0KLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfVFBSRUwyMiwJICAgICJUUFJFTDIyIiwJICAgMCwgZmFsc2UsIGZhbHNlKSwKLSAgICBJQTY0X0hPV1RPIChSX0lBNjRfVFBSRUw2NE1TQiwgICJUUFJFTDY0TVNCIiwgIDgsIGZhbHNlLCBmYWxzZSksCi0gICAgSUE2NF9IT1dUTyAoUl9JQTY0X1RQUkVMNjRMU0IsICAiVFBSRUw2NExTQiIsICA4LCBmYWxzZSwgZmFsc2UpLAotICAgIElBNjRfSE9XVE8gKFJfSUE2NF9MVE9GRl9UUDIyLCAgIkxUT0ZGX1RQMjIiLCAgMCwgZmFsc2UsIGZhbHNlKSwKLSAgfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZWxmX2NvZGVfdG9faG93dG9faW5kZXhbUl9JQTY0X01BWF9SRUxPQ19DT0RFICsgMV07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiB0aGUgbWF0Y2hpbmcgSE9XVE8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUqCi1sb29rdXBfaG93dG8gKHJ0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcnR5cGU7Ci17Ci0gIHN0YXRpYyBpbnQgaW5pdGVkID0gMDsKLSAgaW50IGk7Ci0KLSAgaWYgKCFpbml0ZWQpCi0gICAgewotICAgICAgaW5pdGVkID0gMTsKLQotICAgICAgbWVtc2V0IChlbGZfY29kZV90b19ob3d0b19pbmRleCwgMHhmZiwgc2l6ZW9mIChlbGZfY29kZV90b19ob3d0b19pbmRleCkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE5FTEVNUyAoaWE2NF9ob3d0b190YWJsZSk7ICsraSkKLQllbGZfY29kZV90b19ob3d0b19pbmRleFtpYTY0X2hvd3RvX3RhYmxlW2ldLnR5cGVdID0gaTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAocnR5cGUgPD0gUl9JQTY0X01BWF9SRUxPQ19DT0RFKTsKLSAgaSA9IGVsZl9jb2RlX3RvX2hvd3RvX2luZGV4W3J0eXBlXTsKLSAgaWYgKGkgPj0gTkVMRU1TIChpYTY0X2hvd3RvX3RhYmxlKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGlhNjRfaG93dG9fdGFibGUgKyBpOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSoKLWVsZjY0X2lhNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGJmZF9jb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IHJ0eXBlOwotCi0gIHN3aXRjaCAoYmZkX2NvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6CQlydHlwZSA9IFJfSUE2NF9OT05FOyBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfSU1NMTQ6CQlydHlwZSA9IFJfSUE2NF9JTU0xNDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9JTU0yMjoJCXJ0eXBlID0gUl9JQTY0X0lNTTIyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0lNTTY0OgkJcnR5cGUgPSBSX0lBNjRfSU1NNjQ7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9ESVIzMk1TQjoJcnR5cGUgPSBSX0lBNjRfRElSMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfRElSMzJMU0I6CXJ0eXBlID0gUl9JQTY0X0RJUjMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0RJUjY0TVNCOglydHlwZSA9IFJfSUE2NF9ESVI2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9ESVI2NExTQjoJcnR5cGUgPSBSX0lBNjRfRElSNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9HUFJFTDIyOglydHlwZSA9IFJfSUE2NF9HUFJFTDIyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0dQUkVMNjRJOglydHlwZSA9IFJfSUE2NF9HUFJFTDY0STsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9HUFJFTDMyTVNCOglydHlwZSA9IFJfSUE2NF9HUFJFTDMyTVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0dQUkVMMzJMU0I6CXJ0eXBlID0gUl9JQTY0X0dQUkVMMzJMU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfR1BSRUw2NE1TQjoJcnR5cGUgPSBSX0lBNjRfR1BSRUw2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9HUFJFTDY0TFNCOglydHlwZSA9IFJfSUE2NF9HUFJFTDY0TFNCOyBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfTFRPRkYyMjoJcnR5cGUgPSBSX0lBNjRfTFRPRkYyMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVE9GRjY0SToJcnR5cGUgPSBSX0lBNjRfTFRPRkY2NEk7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9QTFRPRkYyMjoJcnR5cGUgPSBSX0lBNjRfUExUT0ZGMjI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUExUT0ZGNjRJOglydHlwZSA9IFJfSUE2NF9QTFRPRkY2NEk7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUExUT0ZGNjRNU0I6CXJ0eXBlID0gUl9JQTY0X1BMVE9GRjY0TVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1BMVE9GRjY0TFNCOglydHlwZSA9IFJfSUE2NF9QTFRPRkY2NExTQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9GUFRSNjRJOglydHlwZSA9IFJfSUE2NF9GUFRSNjRJOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0ZQVFIzMk1TQjoJcnR5cGUgPSBSX0lBNjRfRlBUUjMyTVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0ZQVFIzMkxTQjoJcnR5cGUgPSBSX0lBNjRfRlBUUjMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0ZQVFI2NE1TQjoJcnR5cGUgPSBSX0lBNjRfRlBUUjY0TVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0ZQVFI2NExTQjoJcnR5cGUgPSBSX0lBNjRfRlBUUjY0TFNCOyBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUENSRUwyMUI6CXJ0eXBlID0gUl9JQTY0X1BDUkVMMjFCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1BDUkVMMjFCSToJcnR5cGUgPSBSX0lBNjRfUENSRUwyMUJJOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1BDUkVMMjFNOglydHlwZSA9IFJfSUE2NF9QQ1JFTDIxTTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9QQ1JFTDIxRjoJcnR5cGUgPSBSX0lBNjRfUENSRUwyMUY7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUENSRUwyMjoJcnR5cGUgPSBSX0lBNjRfUENSRUwyMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9QQ1JFTDYwQjoJcnR5cGUgPSBSX0lBNjRfUENSRUw2MEI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUENSRUw2NEk6CXJ0eXBlID0gUl9JQTY0X1BDUkVMNjRJOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1BDUkVMMzJNU0I6CXJ0eXBlID0gUl9JQTY0X1BDUkVMMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUENSRUwzMkxTQjoJcnR5cGUgPSBSX0lBNjRfUENSRUwzMkxTQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9QQ1JFTDY0TVNCOglydHlwZSA9IFJfSUE2NF9QQ1JFTDY0TVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1BDUkVMNjRMU0I6CXJ0eXBlID0gUl9JQTY0X1BDUkVMNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSMjI6CXJ0eXBlID0gUl9JQTY0X0xUT0ZGX0ZQVFIyMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSNjRJOglydHlwZSA9IFJfSUE2NF9MVE9GRl9GUFRSNjRJOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX0ZQVFI2NE1TQjogcnR5cGUgPSBSX0lBNjRfTFRPRkZfRlBUUjY0TVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX0ZQVFI2NExTQjogcnR5cGUgPSBSX0lBNjRfTFRPRkZfRlBUUjY0TFNCOyBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfU0VHQkFTRToJcnR5cGUgPSBSX0lBNjRfU0VHQkFTRTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9TRUdSRUwzMk1TQjoJcnR5cGUgPSBSX0lBNjRfU0VHUkVMMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfU0VHUkVMMzJMU0I6CXJ0eXBlID0gUl9JQTY0X1NFR1JFTDMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1NFR1JFTDY0TVNCOglydHlwZSA9IFJfSUE2NF9TRUdSRUw2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9TRUdSRUw2NExTQjoJcnR5cGUgPSBSX0lBNjRfU0VHUkVMNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9TRUNSRUwzMk1TQjoJcnR5cGUgPSBSX0lBNjRfU0VDUkVMMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfU0VDUkVMMzJMU0I6CXJ0eXBlID0gUl9JQTY0X1NFQ1JFTDMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1NFQ1JFTDY0TVNCOglydHlwZSA9IFJfSUE2NF9TRUNSRUw2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9TRUNSRUw2NExTQjoJcnR5cGUgPSBSX0lBNjRfU0VDUkVMNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9SRUwzMk1TQjoJcnR5cGUgPSBSX0lBNjRfUkVMMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfUkVMMzJMU0I6CXJ0eXBlID0gUl9JQTY0X1JFTDMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1JFTDY0TVNCOglydHlwZSA9IFJfSUE2NF9SRUw2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9SRUw2NExTQjoJcnR5cGUgPSBSX0lBNjRfUkVMNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVFYzMk1TQjoJcnR5cGUgPSBSX0lBNjRfTFRWMzJNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfTFRWMzJMU0I6CXJ0eXBlID0gUl9JQTY0X0xUVjMyTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0xUVjY0TVNCOglydHlwZSA9IFJfSUE2NF9MVFY2NE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVFY2NExTQjoJcnR5cGUgPSBSX0lBNjRfTFRWNjRMU0I7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9JUExUTVNCOglydHlwZSA9IFJfSUE2NF9JUExUTVNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0lQTFRMU0I6CXJ0eXBlID0gUl9JQTY0X0lQTFRMU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfRVBMVE1TQjoJcnR5cGUgPSBSX0lBNjRfRVBMVE1TQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9FUExUTFNCOglydHlwZSA9IFJfSUE2NF9FUExUTFNCOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0NPUFk6CQlydHlwZSA9IFJfSUE2NF9DT1BZOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X0xUT0ZGMjJYOglydHlwZSA9IFJfSUE2NF9MVE9GRjIyWDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MRFhNT1Y6CQlydHlwZSA9IFJfSUE2NF9MRFhNT1Y7IGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9UUFJFTDIyOglydHlwZSA9IFJfSUE2NF9UUFJFTDIyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19JQTY0X1RQUkVMNjRNU0I6CXJ0eXBlID0gUl9JQTY0X1RQUkVMNjRNU0I7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0lBNjRfVFBSRUw2NExTQjoJcnR5cGUgPSBSX0lBNjRfVFBSRUw2NExTQjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSUE2NF9MVE9GRl9UUDIyOglydHlwZSA9IFJfSUE2NF9MVE9GRl9UUDIyOyBicmVhazsKLQotICAgIGRlZmF1bHQ6IHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGxvb2t1cF9ob3d0byAocnR5cGUpOwotfQotCi0vKiBHaXZlbiBhIEVMRiByZWxvYywgcmV0dXJuIHRoZSBtYXRjaGluZyBIT1dUTyBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmNjRfaWE2NF9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9IGxvb2t1cF9ob3d0byAoRUxGNjRfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbykpOwotfQotDAotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSgzICogMTYpCi0jZGVmaW5lIFBMVF9NSU5fRU5UUllfU0laRQkoMSAqIDE2KQotI2RlZmluZSBQTFRfRlVMTF9FTlRSWV9TSVpFCSgyICogMTYpCi0jZGVmaW5lIFBMVF9SRVNFUlZFRF9XT1JEUwkzCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBwbHRfaGVhZGVyW1BMVF9IRUFERVJfU0laRV0gPQotewotICAweDBiLCAweDEwLCAweDAwLCAweDFjLCAweDAwLCAweDIxLCAgLyogICBbTU1JXSAgICAgICBtb3YgcjI9cjE0OzsgICAgICAgKi8KLSAgMHhlMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg0OCwgMHgwMCwgIC8qICAgICAgICAgICAgICAgYWRkbCByMTQ9MCxyMiAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIG5vcC5pIDB4MDs7ICAgICAgICAqLwotICAweDBiLCAweDgwLCAweDIwLCAweDFjLCAweDE4LCAweDE0LCAgLyogICBbTU1JXSAgICAgICBsZDggcjE2PVtyMTRdLDg7OyAgKi8KLSAgMHgxMCwgMHg0MSwgMHgzOCwgMHgzMCwgMHgyOCwgMHgwMCwgIC8qICAgICAgICAgICAgICAgbGQ4IHIxNz1bcjE0XSw4ICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIG5vcC5pIDB4MDs7ICAgICAgICAqLwotICAweDExLCAweDA4LCAweDAwLCAweDFjLCAweDE4LCAweDEwLCAgLyogICBbTUlCXSAgICAgICBsZDggcjE9W3IxNF0gICAgICAgKi8KLSAgMHg2MCwgMHg4OCwgMHgwNCwgMHg4MCwgMHgwMywgMHgwMCwgIC8qICAgICAgICAgICAgICAgbW92IGI2PXIxNyAgICAgICAgICovCi0gIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIGJyLmZldyBiNjs7ICAgICAgICAqLwotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIHBsdF9taW5fZW50cnlbUExUX01JTl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MTEsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsICAvKiAgIFtNSUJdICAgICAgIG1vdiByMTU9MCAgICAgICAgICAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAgLyogICAgICAgICAgICAgICBub3AuaSAweDAgICAgICAgICAgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgYnIuZmV3IDAgPFBMVDA+OzsgICovCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgcGx0X2Z1bGxfZW50cnlbUExUX0ZVTExfRU5UUllfU0laRV0gPQotewotICAweDBiLCAweDc4LCAweDAwLCAweDAyLCAweDAwLCAweDI0LCAgLyogICBbTU1JXSAgICAgICBhZGRsIHIxNT0wLHIxOzsgICAgKi8KLSAgMHgwMCwgMHg0MSwgMHgzYywgMHgzMCwgMHgyOCwgMHhjMCwgIC8qICAgICAgICAgICAgICAgbGQ4IHIxNj1bcjE1XSw4ICAgICovCi0gIDB4MDEsIDB4MDgsIDB4MDAsIDB4ODQsICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIG1vdiByMTQ9cjE7OyAgICAgICAqLwotICAweDExLCAweDA4LCAweDAwLCAweDFlLCAweDE4LCAweDEwLCAgLyogICBbTUlCXSAgICAgICBsZDggcjE9W3IxNV0gICAgICAgKi8KLSAgMHg2MCwgMHg4MCwgMHgwNCwgMHg4MCwgMHgwMywgMHgwMCwgIC8qICAgICAgICAgICAgICAgbW92IGI2PXIxNiAgICAgICAgICovCi0gIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIGJyLmZldyBiNjs7ICAgICAgICAqLwotfTsKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKLQotLyogU2VsZWN0IG91dCBvZiByYW5nZSBicmFuY2ggZml4dXAgdHlwZS4gIE5vdGUgdGhhdCBJdGFuaXVtIGRvZXMKLSAgIG5vdCBzdXBwb3J0IGJybCwgYW5kIHNvIGl0IGdldHMgZW11bGF0ZWQgYnkgdGhlIGtlcm5lbC4gICovCi0jdW5kZWYgVVNFX0JSTAotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgb29yX2JybFsxNl0gPQotewotICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAgLyogIFtNTFhdICAgICAgICBub3AubSAwICAgICAgICAgICAgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8qICAgICAgICAgICAgICAgYnJsLnNwdGsuZmV3IHRndDs7ICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBvb3JfaXBbNDhdID0KLXsKLSAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgIC8qICBbTUxYXSAgICAgICAgbm9wLm0gMCAgICAgICAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsICAvKiAgICAgICAgICAgICAgIG1vdmwgcjE1PTAgICAgICAgICAqLwotICAweDAxLCAweDAwLCAweDAwLCAweDYwLAotICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAgLyogIFtNSUldICAgICAgICBub3AubSAwICAgICAgICAgICAgKi8KLSAgMHgwMCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgIC8qICAgICAgICAgICAgICAgbW92IHIxNj1pcDs7ICAgICAgICovCi0gIDB4ZjIsIDB4ODAsIDB4MDAsIDB4ODAsICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIGFkZCByMTY9cjE1LHIxNjs7ICAqLwotICAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAgLyogIFtNSUJdICAgICAgICBub3AubSAwICAgICAgICAgICAgKi8KLSAgMHg2MCwgMHg4MCwgMHgwNCwgMHg4MCwgMHgwMywgMHgwMCwgIC8qICAgICAgICAgICAgICAgbW92IGI2PXIxNiAgICAgICAgICovCi0gIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIGJyIGI2OzsgICAgICAgICAgICAqLwotfTsKLQwKLS8qIFRoZXNlIGZ1bmN0aW9ucyBkbyByZWxheGF0aW9uIGZvciBJQS02NCBFTEYuCi0KLSAgIFRoaXMgaXMgcHJpbWFyaWx5IHRvIHN1cHBvcnQgYnJhbmNoZXMgdG8gdGFyZ2V0cyBvdXQgb2YgcmFuZ2U7Ci0gICByZWxheGF0aW9uIG9mIFJfSUE2NF9MVE9GRjIyWCBhbmQgUl9JQTY0X0xEWE1PViBub3QgeWV0IHN1cHBvcnRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgc3RydWN0IG9uZV9maXh1cAotICAgIHsKLSAgICAgIHN0cnVjdCBvbmVfZml4dXAgKm5leHQ7Ci0gICAgICBhc2VjdGlvbiAqdHNlYzsKLSAgICAgIGJmZF92bWEgdG9mZjsKLSAgICAgIGJmZF92bWEgdHJhbXBvZmY7Ci0gICAgfTsKLQotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHM7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXM7Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvOwotICBzdHJ1Y3Qgb25lX2ZpeHVwICpmaXh1cHMgPSBOVUxMOwotICBib29sZWFuIGNoYW5nZWRfY29udGVudHMgPSBmYWxzZTsKLSAgYm9vbGVhbiBjaGFuZ2VkX3JlbG9jcyA9IGZhbHNlOwotCi0gIC8qIEFzc3VtZSB3ZSdyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGFueSBzaXplcywgYW5kIHdlIHdlJ2xsIG9ubHkKLSAgICAgbmVlZCBvbmUgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIE5vdGhpbmcgdG8gZG8gaWYgdGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBpYTY0X2luZm8gPSBlbGY2NF9pYTY0X2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICBpZiAoRUxGNjRfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfSUE2NF9QQ1JFTDIxQikKLSAgICAgIGJyZWFrOwotCi0gIC8qIE5vIGJyYW5jaC10eXBlIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKGlyZWwgPT0gaXJlbGVuZCkKLSAgICB7Ci0gICAgICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLQlmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scy4gICovCi0gIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgIGV4dHN5bXMgPSAoRWxmNjRfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltcyA9IChFbGY2NF9FeHRlcm5hbF9TeW0gKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bWFkZHIsIHJlbGFkZHIsIHRyYW1wb2ZmLCB0b2ZmLCByb2ZmOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotICAgICAgYXNlY3Rpb24gKnRzZWM7Ci0gICAgICBzdHJ1Y3Qgb25lX2ZpeHVwICpmOwotCi0gICAgICBpZiAoRUxGNjRfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfSUE2NF9QQ1JFTDIxQikKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0JICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGNvbnRpbnVlOwkvKiBXZSBjYW4ndCBkbyBhbnRoaW5nIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICB0c2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgdHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgdHNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIGVsc2UgCi0JICAgIGNvbnRpbnVlOwkvKiB3aG8ga25vd3MuICovCi0KLQkgIHRvZmYgPSBpc3ltLnN0X3ZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotCi0JICBpbmR4ID0gRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgYWJmZCwgaXJlbCwgZmFsc2UpOwotCi0JICAvKiBGb3IgYnJhbmNoZXMgdG8gZHluYW1pYyBzeW1ib2xzLCB3ZSdyZSBpbnRlcmVzdGVkIGluc3RlYWQKLQkgICAgIGluIGEgYnJhbmNoIHRvIHRoZSBQTFQgZW50cnkuICAqLwotCSAgaWYgKGR5bl9pICYmIGR5bl9pLT53YW50X3BsdDIpCi0JICAgIHsKLQkgICAgICB0c2VjID0gaWE2NF9pbmZvLT5wbHRfc2VjOwotCSAgICAgIHRvZmYgPSBkeW5faS0+cGx0Ml9vZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbid0IGRvIGFudGhpbmcgd2l0aCB1bmRlZmluZWQgc3ltYm9scy4gICovCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJY29udGludWU7Ci0KLQkgICAgICB0c2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHRvZmYgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCSAgICB9Ci0JfQotCi0gICAgICBzeW1hZGRyID0gKHRzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgdHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyB0b2ZmCi0JCSArIGlyZWwtPnJfYWRkZW5kKTsKLQotICAgICAgcm9mZiA9IGlyZWwtPnJfb2Zmc2V0OwotICAgICAgcmVsYWRkciA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIHJvZmYpICYgLTQ7Ci0KLSAgICAgIC8qIElmIHRoZSBicmFuY2ggaXMgaW4gcmFuZ2UsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgKHN5bWFkZHIgLSByZWxhZGRyKSA+PSAtMHgxMDAwMDAwCi0JICAmJiAoYmZkX3NpZ25lZF92bWEpIChzeW1hZGRyIC0gcmVsYWRkcikgPD0gMHgwRkZGRkYwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGUgYnJhbmNoIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHNlY3Rpb24sIHlvdSd2ZQotCSBnb3Qgb25lIGhvbmtpbmcgYmlnIHNlY3Rpb24gYW5kIHdlIGNhbid0IGhlbHAgeW91LiAgWW91J2xsCi0JIGdldCBhbiBlcnJvciBtZXNzYWdlIGxhdGVyLiAgKi8KLSAgICAgIGlmICh0c2VjID09IHNlYykKLQljb250aW51ZTsKLQotICAgICAgLyogTG9vayBmb3IgYW4gZXhpc3RpbmcgZml4dXAgdG8gdGhpcyBhZGRyZXNzLiAgKi8KLSAgICAgIGZvciAoZiA9IGZpeHVwczsgZiA7IGYgPSBmLT5uZXh0KQotCWlmIChmLT50c2VjID09IHRzZWMgJiYgZi0+dG9mZiA9PSB0b2ZmKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmIChmID09IE5VTEwpCi0JewotCSAgLyogVHdvIGFsdGVybmF0aXZlczogSWYgaXQncyBhIGJyYW5jaCB0byBhIFBMVCBlbnRyeSwgd2UgY2FuCi0JICAgICBtYWtlIGEgY29weSBvZiB0aGUgRlVMTF9QTFQgZW50cnkuICBPdGhlcndpc2UsIHdlJ2xsIGhhdmUKLQkgICAgIHRvIHVzZSBhIGBicmwnIGluc24gdG8gZ2V0IHdoZXJlIHdlJ3JlIGdvaW5nLiAgKi8KLQotCSAgaW50IHNpemU7Ci0KLQkgIGlmICh0c2VjID09IGlhNjRfaW5mby0+cGx0X3NlYykKLQkgICAgc2l6ZSA9IHNpemVvZiAocGx0X2Z1bGxfZW50cnkpOwotCSAgZWxzZQotCSAgICB7Ci0jaWZkZWYgVVNFX0JSTAotCSAgICAgIHNpemUgPSBzaXplb2YgKG9vcl9icmwpOwotI2Vsc2UKLQkgICAgICBzaXplID0gc2l6ZW9mIChvb3JfaXApOwotI2VuZGlmCi0JICAgIH0KLQotCSAgLyogUmVzaXplIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IGJyYW5jaC4gICovCi0JICB0cmFtcG9mZiA9IChzZWMtPl9jb29rZWRfc2l6ZSArIDE1KSAmIC0xNjsKLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChjb250ZW50cywgdHJhbXBvZmYgKyBzaXplKTsKLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gdHJhbXBvZmYgKyBzaXplOwotCi0JICBpZiAodHNlYyA9PSBpYTY0X2luZm8tPnBsdF9zZWMpCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKGNvbnRlbnRzICsgdHJhbXBvZmYsIHBsdF9mdWxsX2VudHJ5LCBzaXplKTsKLQotCSAgICAgIC8qIEhpamFjayB0aGUgb2xkIHJlbG9jYXRpb24gZm9yIHVzZSBhcyB0aGUgUExUT0ZGIHJlbG9jLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX0lBNjRfUExUT0ZGMjIpOwotCSAgICAgIGlyZWwtPnJfb2Zmc2V0ID0gdHJhbXBvZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotI2lmZGVmIFVTRV9CUkwKLQkgICAgICBtZW1jcHkgKGNvbnRlbnRzICsgdHJhbXBvZmYsIG9vcl9icmwsIHNpemUpOwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfSUE2NF9QQ1JFTDYwQik7Ci0JICAgICAgaXJlbC0+cl9vZmZzZXQgPSB0cmFtcG9mZiArIDI7Ci0jZWxzZQotCSAgICAgIG1lbWNweSAoY29udGVudHMgKyB0cmFtcG9mZiwgb29yX2lwLCBzaXplKTsKLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX0lBNjRfUENSRUw2NEkpOwotCSAgICAgIGlyZWwtPnJfYWRkZW5kIC09IDE2OwotCSAgICAgIGlyZWwtPnJfb2Zmc2V0ID0gdHJhbXBvZmYgKyAyOwotI2VuZGlmCi0JICAgIH0KLQotCSAgLyogUmVjb3JkIHRoZSBmaXh1cCBzbyB3ZSBkb24ndCBkbyBpdCBhZ2FpbiB0aGlzIHNlY3Rpb24uICAqLwotCSAgZiA9IChzdHJ1Y3Qgb25lX2ZpeHVwICopIGJmZF9tYWxsb2MgKHNpemVvZiAoKmYpKTsKLQkgIGYtPm5leHQgPSBmaXh1cHM7Ci0JICBmLT50c2VjID0gdHNlYzsKLQkgIGYtPnRvZmYgPSB0b2ZmOwotCSAgZi0+dHJhbXBvZmYgPSB0cmFtcG9mZjsKLQkgIGZpeHVwcyA9IGY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vcCBvdXQgdGhlIHJlbG9jLCBzaW5jZSB3ZSdyZSBmaW5hbGl6aW5nIHRoaW5ncyBoZXJlLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9JQTY0X05PTkUpOwotCX0KLQotICAgICAgLyogRml4IHVwIHRoZSBleGlzdGluZyBicmFuY2ggdG8gaGl0IHRoZSB0cmFtcG9saW5lLiAgSG9wZSBsaWtlCi0JIGhlbGwgdGhpcyBkb2Vzbid0IG92ZXJmbG93IHRvby4gICovCi0gICAgICBpZiAoZWxmNjRfaWE2NF9pbnN0YWxsX3ZhbHVlIChhYmZkLCBjb250ZW50cyArIHJvZmYsCi0JCQkJICAgIGYtPnRyYW1wb2ZmIC0gKHJvZmYgJiAtNCksCi0JCQkJICAgIFJfSUE2NF9QQ1JFTDIxQikgIT0gYmZkX3JlbG9jX29rKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLSAgICAgIGNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2xlYW4gdXAgYW5kIGdvIGhvbWUuICAqLwotICB3aGlsZSAoZml4dXBzKQotICAgIHsKLSAgICAgIHN0cnVjdCBvbmVfZml4dXAgKmYgPSBmaXh1cHM7Ci0gICAgICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0gICAgICBmcmVlIChmKTsKLSAgICB9Ci0KLSAgaWYgKGNoYW5nZWRfcmVsb2NzKQotICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgZWxzZSBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0KLSAgaWYgKGNoYW5nZWRfY29udGVudHMpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLSAgZWxzZSBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgfQotCi0gICphZ2FpbiA9IGNoYW5nZWRfY29udGVudHMgfHwgY2hhbmdlZF9yZWxvY3M7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBIYW5kbGUgYW4gSUEtNjQgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2lhNjRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0Ci0gICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgRm9ydHVuYXRlbHksIHRoZSBBQkkgZ2l2ZXMKLSAgICAgc3VnZ2VzdGVkIG5hbWVzIGZvciBhbGwgdGhlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMsIHNvIHdlIHdpbGwKLSAgICAgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCB0aGlzLiAgKi8KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX0lBXzY0X1VOV0lORDoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIEVMRl9TVFJJTkdfaWE2NF91bndpbmQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9JQV82NF9FWFQ6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBFTEZfU1RSSU5HX2lhNjRfYXJjaGV4dCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKLQotICBpZiAoaGRyLT5zaF9mbGFncyAmIFNIRl9JQV82NF9TSE9SVCkKLSAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfU01BTExfREFUQTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIElBLTY0IEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgRUxGX1NUUklOR19pYTY0X3Vud2luZCkgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfSUFfNjRfVU5XSU5EOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIEVMRl9TVFJJTkdfaWE2NF9hcmNoZXh0KSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9JQV82NF9FWFQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxvYyIpID09IDApCi0gICAgLyoKLSAgICAgKiBUaGlzIGlzIGFuIHVnbHksIGJ1dCB1bmZvcnR1bmF0ZWx5IG5lY2Vzc2FyeSBoYWNrIHRoYXQgaXMKLSAgICAgKiBuZWVkZWQgd2hlbiBwcm9kdWNpbmcgRUZJIGJpbmFyaWVzIG9uIElBLTY0LiBJdCB0ZWxscwotICAgICAqIGVsZi5jOmVsZl9mYWtlX3NlY3Rpb25zKCkgbm90IHRvIGNvbnNpZGVyICIucmVsb2MiIGFzIGEgc2VjdGlvbgotICAgICAqIGNvbnRhaW5pbmcgRUxGIHJlbG9jYXRpb24gaW5mby4gIFdlIG5lZWQgdGhpcyBoYWNrIGluIG9yZGVyIHRvCi0gICAgICogYmUgYWJsZSB0byBnZW5lcmF0ZSBFTEYgYmluYXJpZXMgdGhhdCBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvCi0gICAgICogRUZJIGFwcGxpY2F0aW9ucyAod2hpY2ggYXJlIGVzc2VudGlhbGx5IENPRkYgb2JqZWN0cykuICBUaG9zZQotICAgICAqIGZpbGVzIGNvbnRhaW4gYSBDT0ZGICIucmVsb2MiIHNlY3Rpb24gaW5zaWRlIGFuIEVMRjY0IG9iamVjdCwKLSAgICAgKiB3aGljaCB3b3VsZCBub3JtYWxseSBjYXVzZSBCRkQgdG8gc2VnZmF1bHQgYmVjYXVzZSBpdCB3b3VsZAotICAgICAqIGF0dGVtcHQgdG8gaW50ZXJwcmV0IHRoaXMgc2VjdGlvbiBhcyBjb250YWluaW5nIHJlbG9jYXRpb24KLSAgICAgKiBlbnRyaWVzIGZvciBzZWN0aW9uICJvYyIuICBXaXRoIHRoaXMgaGFjayBlbmFibGVkLCAiLnJlbG9jIgotICAgICAqIHdpbGwgYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCBkYXRhIHNlY3Rpb24sIHdoaWNoIHdpbGwgYXZvaWQgdGhlCi0gICAgICogc2VnZmF1bHQuICBIb3dldmVyLCB5b3Ugd29uJ3QgYmUgYWJsZSB0byBjcmVhdGUgYW4gRUxGNjQgYmluYXJ5Ci0gICAgICogd2l0aCBhIHNlY3Rpb24gbmFtZWQgIm9jIiB0aGF0IG5lZWRzIHJlbG9jYXRpb25zLCBidXQgdGhhdCdzCi0gICAgICogdGhlIGtpbmQgb2YgdWdseSBzaWRlLWVmZmVjdHMgeW91IGdldCB3aGVuIGRldGVjdGluZyBzZWN0aW9uCi0gICAgICogdHlwZXMgYmFzZWQgb24gdGhlaXIgbmFtZXMuLi4gIEluIHByYWN0aWNlLCB0aGlzIGxpbWl0YXRpb24gaXMKLSAgICAgKiB1bmxpa2VseSB0byBiaXRlLgotICAgICAqLwotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQotICBpZiAoc2VjLT5mbGFncyAmIFNFQ19TTUFMTF9EQVRBKQotICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0lBXzY0X1NIT1JUOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2lhNjRfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUKLQkgYXV0b21hdGljYWxseSBwdXQgaW50byAuc2Jzcy4gICovCi0KLSAgICAgIGFzZWN0aW9uICpzY29tbSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNjb21tb24iKTsKLQotICAgICAgaWYgKHNjb21tID09IE5VTEwpCi0JewotCSAgc2NvbW0gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnNjb21tb24iKTsKLQkgIGlmIChzY29tbSA9PSBOVUxMCi0JICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2NvbW0sIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19JU19DT01NT04KLQkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqc2VjcCA9IHNjb21tOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBoZHJzIHdlIHdpbGwgbmVlZC4gICovCi0KLXN0YXRpYyBpbnQKLWVsZjY0X2lhNjRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQgPSAwOwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfSUFfNjRfQVJDSEVYVCBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBFTEZfU1RSSU5HX2lhNjRfYXJjaGV4dCk7Ci0gIGlmIChzICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSkKLSAgICArK3JldDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX0lBXzY0X1VOV0lORCBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBFTEZfU1RSSU5HX2lhNjRfdW53aW5kKTsKLSAgaWYgKHMgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpKQotICAgICsrcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotICBhc2VjdGlvbiAqczsKLQotICAvKiBJZiB3ZSBuZWVkIGEgUFRfSUFfNjRfQVJDSEVYVCBzZWdtZW50LCBpdCBtdXN0IGNvbWUgYmVmb3JlCi0gICAgIGFsbCBQVF9MT0FEIHNlZ21lbnRzLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBFTEZfU1RSSU5HX2lhNjRfYXJjaGV4dCk7Ci0gIGlmIChzICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSkKLSAgICB7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+cF90eXBlID09IFBUX0lBXzY0X0FSQ0hFWFQpCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX0lBXzY0X0FSQ0hFWFQ7Ci0JICBtLT5jb3VudCA9IDE7Ci0JICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gcHV0IGl0IGFmdGVyIHRoZSBQSERSIGFuZCBJTlRFUlAgc2VnbWVudHMuICAqLwotCSAgcG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7Ci0JICB3aGlsZSAoKnBtICE9IE5VTEwKLQkJICYmICgoKnBtKS0+cF90eXBlID09IFBUX1BIRFIKLQkJICAgICB8fCAoKnBtKS0+cF90eXBlID09IFBUX0lOVEVSUCkpCi0JICAgIHBtID0gJigqcG0pLT5uZXh0OwotCi0JICBtLT5uZXh0ID0gKnBtOwotCSAgKnBtID0gbTsKLQl9Ci0gICAgfQotCi0gIC8qIEluc3RhbGwgdGhlIFBUX0lBXzY0X1VOV0lORCBzZWdtZW50LCBpZiBuZWVkZWQuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEVMRl9TVFJJTkdfaWE2NF91bndpbmQpOwotICBpZiAocyAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9JQV82NF9VTldJTkQpCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX0lBXzY0X1VOV0lORDsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQkgIG0tPm5leHQgPSBOVUxMOwotCi0JICAvKiBXZSB3YW50IHRvIHB1dCBpdCBsYXN0LiAgKi8KLQkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgd2hpbGUgKCpwbSAhPSBOVUxMKQotCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKLQkgICpwbSA9IG07Ci0JfQotICAgIH0KLQotICAvKiBUdXJuIG9uIFBGX0lBXzY0X05PUkVDT1YgaWYgbmVlZGVkLiAgVGhpcyBpbnZvbHZlcyB0cmF2ZXJzaW5nIGFsbCBvZgotICAgICB0aGUgaW5wdXQgc2VjdGlvbnMgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gaW4gdGhlIHNlZ21lbnQgYW5kIHRlc3RpbmcKLSAgICAgZm9yIFNIRl9JQV82NF9OT1JFQ09WIG9uIGVhY2guICAqLwotICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICBpZiAobS0+cF90eXBlID09IFBUX0xPQUQpCi0gICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpID0gbS0+Y291bnQgLSAxOyBpID49IDA7IC0taSkKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpvcmRlciA9IG0tPnNlY3Rpb25zW2ldLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgIHdoaWxlIChvcmRlcikKLQkgICAgICB7Ci0JCWlmIChvcmRlci0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqaXMgPSBvcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCQkgICAgYmZkX3ZtYSBmbGFncyA9IGVsZl9zZWN0aW9uX2RhdGEoaXMpLT50aGlzX2hkci5zaF9mbGFnczsKLQkJICAgIGlmIChmbGFncyAmIFNIRl9JQV82NF9OT1JFQ09WKQotCQkgICAgICB7Ci0JCQltLT5wX2ZsYWdzIHw9IFBGX0lBXzY0X05PUkVDT1Y7Ci0JCQlnb3RvIGZvdW5kOwotCQkgICAgICB9Ci0JCSAgfQotCQlvcmRlciA9IG9yZGVyLT5uZXh0OwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGZvdW5kOjsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBY2NvcmRpbmcgdG8gdGhlIFRhaG9lIGFzc2VtYmxlciBzcGVjLCBhbGwgbGFiZWxzIHN0YXJ0aW5nIHdpdGggYQotICAgJy4nIGFyZSBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nOwotfQotCi0vKiBTaG91bGQgd2UgZG8gZHluYW1pYyB0aGluZ3MgdG8gdGhpcyBzeW1ib2w/ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaWE2NF9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMpCi0gICAgICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCi0JICA9PSAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaWE2NF9sb2NhbF9oYXNoX3RhYmxlX2luaXQgKGh0LCBhYmZkLCBuZXcpCi0gICAgIHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfdGFibGUgKmh0OwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5ld19oYXNoX2VudHJ5X2Z1bmMgbmV3OwotewotICBtZW1zZXQgKGh0LCAwLCBzaXplb2YoKmh0KSk7Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmaHQtPnJvb3QsIG5ldyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkqCi1lbGY2NF9pYTY0X25ld19sb2NfaGFzaF9lbnRyeSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF9lbnRyeSAqcmV0OwotICByZXQgPSAoc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKCFyZXQpCi0gICAgcmV0ID0gYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKCpyZXQpKTsKLQotICBpZiAoIXJldCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJbml0aWFsaXplIG91ciBsb2NhbCBkYXRhLiAgQWxsIHplcm9zLCBhbmQgZGVmaW5pdGVseSBlYXNpZXIKLSAgICAgdGhhbiBzZXR0aW5nIGEgaGFuZGZ1bCBvZiBiaXQgZmllbGRzLiAgKi8KLSAgbWVtc2V0IChyZXQsIDAsIHNpemVvZigqcmV0KSk7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkqCi1lbGY2NF9pYTY0X25ld19lbGZfaGFzaF9lbnRyeSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX2VudHJ5ICpyZXQ7Ci0gIHJldCA9IChzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmICghcmV0KQotICAgIHJldCA9IGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICgqcmV0KSk7Ci0KLSAgaWYgKCFyZXQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSBvdXIgbG9jYWwgZGF0YS4gIEFsbCB6ZXJvcywgYW5kIGRlZmluaXRlbHkgZWFzaWVyCi0gICAgIHRoYW4gc2V0dGluZyBhIGhhbmRmdWwgb2YgYml0IGZpZWxkcy4gICovCi0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YoKnJldCkpOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjY0X2lhNjRfaGFzaF9jb3B5X2luZGlyZWN0ICh4ZGlyLCB4aW5kKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqeGRpciwgKnhpbmQ7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqZGlyLCAqaW5kOwotCi0gIGRpciA9IChzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkgKil4ZGlyOwotICBpbmQgPSAoc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX2VudHJ5ICopeGluZDsKLQotICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdG8gdGhlIAotICAgICBzeW1ib2wgd2hpY2gganVzdCBiZWNhbWUgaW5kaXJlY3QuICAqLwotCi0gIGRpci0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0gICAgKGluZC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0gICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMKLSAgICAgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0gICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKSk7Ci0KLSAgLyogQ29weSBvdmVyIHRoZSBnb3QgYW5kIHBsdCBkYXRhLiAgVGhpcyB3b3VsZCBoYXZlIGJlZW4gZG9uZQotICAgICBieSBjaGVja19yZWxvY3MuICAqLwotCi0gIGlmIChkaXItPmluZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotCi0gICAgICBkaXItPmluZm8gPSBkeW5faSA9IGluZC0+aW5mbzsKLSAgICAgIGluZC0+aW5mbyA9IE5VTEw7Ci0KLSAgICAgIC8qIEZpeCB1cCB0aGUgZHluX3N5bV9pbmZvIHBvaW50ZXJzIHRvIHRoZSBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGZvciAoOyBkeW5faTsgZHluX2kgPSBkeW5faS0+bmV4dCkKLQlkeW5faS0+aCA9ICZkaXItPnJvb3Q7Ci0gICAgfQotICBCRkRfQVNTRVJUIChpbmQtPmluZm8gPT0gTlVMTCk7Ci0KLSAgLyogQ29weSBvdmVyIHRoZSBkeW5pbmR4LiAgKi8KLQotICBpZiAoZGlyLT5yb290LmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgZGlyLT5yb290LmR5bmluZHggPSBpbmQtPnJvb3QuZHluaW5keDsKLSAgICAgIGRpci0+cm9vdC5keW5zdHJfaW5kZXggPSBpbmQtPnJvb3QuZHluc3RyX2luZGV4OwotICAgICAgaW5kLT5yb290LmR5bmluZHggPSAtMTsKLSAgICAgIGluZC0+cm9vdC5keW5zdHJfaW5kZXggPSAwOwotICAgIH0KLSAgQkZEX0FTU0VSVCAoaW5kLT5yb290LmR5bmluZHggPT0gLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmNjRfaWE2NF9oYXNoX2hpZGVfc3ltYm9sICh4aCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnhoOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0KLSAgaCA9IChzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfZW50cnkgKil4aDsKLQotICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotICBoLT5yb290LmR5bmluZHggPSAtMTsKLQotICBmb3IgKGR5bl9pID0gaC0+aW5mbzsgZHluX2k7IGR5bl9pID0gZHluX2ktPm5leHQpCi0gICAgZHluX2ktPndhbnRfcGx0MiA9IDA7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSBJQS02NCBFTEYgcG9ydCB1c2VzIHRoaXMKLSAgIGRlcml2ZWQgaGFzaCB0YWJsZSB0byBrZWVwIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBJQS02NCBFbEYKLSAgIGxpbmtlciAod2l0aG91dCB1c2luZyBzdGF0aWMgdmFyaWFibGVzKS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSoKLWVsZjY0X2lhNjRfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpyZXQpKTsKLSAgaWYgKCFyZXQpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgZWxmNjRfaWE2NF9uZXdfZWxmX2hhc2hfZW50cnkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghZWxmNjRfaWE2NF9sb2NhbF9oYXNoX3RhYmxlX2luaXQgKCZyZXQtPmxvY19oYXNoX3RhYmxlLCBhYmZkLAotCQkJCSAgICAgICAgIGVsZjY0X2lhNjRfbmV3X2xvY19oYXNoX2VudHJ5KSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF9lbnRyeSAqCi1lbGY2NF9pYTY0X2xvY2FsX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGUsIGNvcHk7Ci17Ci0gIHJldHVybiAoKHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfZW50cnkgKikKLQkgIGJmZF9oYXNoX2xvb2t1cCAoJnRhYmxlLT5yb290LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkpOwotfQotCi0vKiBUcmF2ZXJzZSBib3RoIGxvY2FsIGFuZCBnbG9iYWwgaGFzaCB0YWJsZXMuICAqLwotCi1zdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEKLXsKLSAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqLCBQVFIpKTsKLSAgUFRSIGRhdGE7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaWE2NF9nbG9iYWxfZHluX3N5bV90aHVuayAoeGVudHJ5LCB4ZGF0YSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICp4ZW50cnk7Ci0gICAgIFBUUiB4ZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX2VudHJ5ICplbnRyeQotICAgID0gKHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF9lbnRyeSAqKSB4ZW50cnk7Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2VfZGF0YSAqZGF0YQotICAgID0gKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2VfZGF0YSAqKSB4ZGF0YTsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLQotICBmb3IgKGR5bl9pID0gZW50cnktPmluZm87IGR5bl9pOyBkeW5faSA9IGR5bl9pLT5uZXh0KQotICAgIGlmICghICgqZGF0YS0+ZnVuYykgKGR5bl9pLCBkYXRhLT5kYXRhKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2xvY2FsX2R5bl9zeW1fdGh1bmsgKHhlbnRyeSwgeGRhdGEpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqeGVudHJ5OwotICAgICBQVFIgeGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfZW50cnkgKmVudHJ5Ci0gICAgPSAoc3RydWN0IGVsZjY0X2lhNjRfbG9jYWxfaGFzaF9lbnRyeSAqKSB4ZW50cnk7Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2VfZGF0YSAqZGF0YQotICAgID0gKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2VfZGF0YSAqKSB4ZGF0YTsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLQotICBmb3IgKGR5bl9pID0gZW50cnktPmluZm87IGR5bl9pOyBkeW5faSA9IGR5bl9pLT5uZXh0KQotICAgIGlmICghICgqZGF0YS0+ZnVuYykgKGR5bl9pLCBkYXRhLT5kYXRhKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGY2NF9pYTY0X2R5bl9zeW1fdHJhdmVyc2UgKGlhNjRfaW5mbywgZnVuYywgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKiwgUFRSKSk7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX3RyYXZlcnNlX2RhdGEgeGRhdGE7Ci0KLSAgeGRhdGEuZnVuYyA9IGZ1bmM7Ci0gIHhkYXRhLmRhdGEgPSBkYXRhOwotCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKCZpYTY0X2luZm8tPnJvb3QsCi0JCQkgIGVsZjY0X2lhNjRfZ2xvYmFsX2R5bl9zeW1fdGh1bmssICZ4ZGF0YSk7Ci0gIGJmZF9oYXNoX3RyYXZlcnNlICgmaWE2NF9pbmZvLT5sb2NfaGFzaF90YWJsZS5yb290LAotCQkgICAgIGVsZjY0X2lhNjRfbG9jYWxfZHluX3N5bV90aHVuaywgJnhkYXRhKTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWE2NF9pbmZvID0gZWxmNjRfaWE2NF9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBpYTY0X2luZm8tPnBsdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5wbHQiKTsKLSAgaWE2NF9pbmZvLT5nb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290Iik7Ci0KLSAgewotICAgIGZsYWd3b3JkIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBpYTY0X2luZm8tPmdvdF9zZWMpOwotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgaWE2NF9pbmZvLT5nb3Rfc2VjLCBTRUNfU01BTExfREFUQSB8IGZsYWdzKTsKLSAgfQotCi0gIGlmICghZ2V0X3BsdG9mZiAoYWJmZCwgaW5mbywgaWE2NF9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLklBXzY0LnBsdG9mZiIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpYTY0X2luZm8tPnJlbF9wbHRvZmZfc2VjID0gczsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbihhYmZkLCAiLnJlbGEuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlhNjRfaW5mby0+cmVsX2dvdF9zZWMgPSBzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIGFuZC9vciBjcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBkeW5hbWljIHN5bWJvbCBpbmZvLiAgVGhpcyB3aWxsCi0gICB2YXJ5IGJhc2VkIG9uIGdsb2JhbCBvciBsb2NhbCBzeW1ib2wsIGFuZCB0aGUgYWRkZW5kIHRvIHRoZSByZWxvYy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKgotZ2V0X2R5bl9zeW1faW5mbyAoaWE2NF9pbmZvLCBoLCBhYmZkLCByZWwsIGNyZWF0ZSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKipwcDsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgYmZkX3ZtYSBhZGRlbmQgPSByZWwgPyByZWwtPnJfYWRkZW5kIDogMDsKLSAgCi0gIGlmIChoKQotICAgIHBwID0gJigoc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX2VudHJ5ICopaCktPmluZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9sb2NhbF9oYXNoX2VudHJ5ICpsb2NfaDsKLSAgICAgIGNoYXIgKmFkZHJfbmFtZTsKLSAgICAgIHNpemVfdCBsZW47Ci0KLSAgICAgIC8qIENvbnN0cnVjdCBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfdGFibGUuCi0gICAgICAgICBUaGUgbmFtZSBkZXNjcmliZXMgd2hhdCB3YXMgb25jZSBhbm9ueW1vdXMgbWVtb3J5LiAgKi8KLQotICAgICAgbGVuID0gc2l6ZW9mKHZvaWQqKSoyICsgMSArIHNpemVvZihiZmRfdm1hKSo0ICsgMSArIDE7Ci0gICAgICBsZW4gKz0gMTA7CS8qICVwIHNsb3AgKi8KLQotICAgICAgYWRkcl9uYW1lID0gYWxsb2NhIChsZW4pOwotICAgICAgc3ByaW50ZiAoYWRkcl9uYW1lLCAiJXA6JWx4IiwgYWJmZCwgRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKSk7Ci0KLSAgICAgIC8qIENvbGxlY3QgdGhlIGNhbm9uaWNhbCBlbnRyeSBkYXRhIGZvciB0aGlzIGFkZHJlc3MuICAqLwotICAgICAgbG9jX2ggPSBlbGY2NF9pYTY0X2xvY2FsX2hhc2hfbG9va3VwICgmaWE2NF9pbmZvLT5sb2NfaGFzaF90YWJsZSwKLQkJCQkJICAgIGFkZHJfbmFtZSwgY3JlYXRlLCBjcmVhdGUpOwotICAgICAgQkZEX0FTU0VSVCAobG9jX2gpOwotCi0gICAgICBwcCA9ICZsb2NfaC0+aW5mbzsKLSAgICB9ICAgIAotCi0gIGZvciAoZHluX2kgPSAqcHA7IGR5bl9pICYmIGR5bl9pLT5hZGRlbmQgIT0gYWRkZW5kOyBkeW5faSA9ICpwcCkKLSAgICBwcCA9ICZkeW5faS0+bmV4dDsKLQotICBpZiAoZHluX2kgPT0gTlVMTCAmJiBjcmVhdGUpCi0gICAgewotICAgICAgZHluX2kgPSAoc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICpkeW5faSk7Ci0gICAgICAqcHAgPSBkeW5faTsKLSAgICAgIGR5bl9pLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gICAgfQotCi0gIHJldHVybiBkeW5faTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWdldF9nb3QgKGFiZmQsIGluZm8sIGlhNjRfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci17Ci0gIGFzZWN0aW9uICpnb3QsICpzcmVsOwotICBiZmQgKmR5bm9iajsKLQotICBnb3QgPSBpYTY0X2luZm8tPmdvdF9zZWM7Ci0gIGlmICghZ290KQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICBkeW5vYmogPSBpYTY0X2luZm8tPnJvb3QuZHlub2JqOwotICAgICAgaWYgKCFkeW5vYmopCi0JaWE2NF9pbmZvLT5yb290LmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0gICAgICBpZiAoIV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQlyZXR1cm4gMDsKLQotICAgICAgZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKGdvdCk7Ci0gICAgICBpYTY0X2luZm8tPmdvdF9zZWMgPSBnb3Q7Ci0KLSAgICAgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBnb3QpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBnb3QsIFNFQ19TTUFMTF9EQVRBIHwgZmxhZ3MpOwotICAgIH0KLQotICByZXR1cm4gZ290OwotfQotCi0vKiBDcmVhdGUgZnVuY3Rpb24gZGVzY3JpcHRvciBzZWN0aW9uICgub3BkKS4gIFRoaXMgc2VjdGlvbiBpcyBjYWxsZWQgLm9wZAotICAgYmVjYXVzZSBpdCBjb250YWlucyAib2ZmaWNpYWwgcHJvZGVjdXJlIGRlc2NyaXB0b3JzIi4gIFRoZSAib2ZmaWNpYWwiCi0gICByZWZlcnMgdG8gdGhlIGZhY3QgdGhhdCB0aGVzZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCB3aGVuIHRha2luZyB0aGUgYWRkcmVzcwotICAgb2YgYSBwcm9jZWR1cmUsIHRodXMgZW5zdXJpbmcgYSB1bmlxdWUgYWRkcmVzcyBmb3IgZWFjaCBwcm9jZWR1cmUuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X2ZwdHIgKGFiZmQsIGluZm8sIGlhNjRfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci17Ci0gIGFzZWN0aW9uICpmcHRyOwotICBiZmQgKmR5bm9iajsKLQotICBmcHRyID0gaWE2NF9pbmZvLT5mcHRyX3NlYzsKLSAgaWYgKCFmcHRyKQotICAgIHsKLSAgICAgIGR5bm9iaiA9IGlhNjRfaW5mby0+cm9vdC5keW5vYmo7Ci0gICAgICBpZiAoIWR5bm9iaikKLQlpYTY0X2luZm8tPnJvb3QuZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICAgICAgZnB0ciA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5vcGQiKTsKLSAgICAgIGlmICghZnB0cgotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBmcHRyLAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBmcHRyLCA0KSkKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWE2NF9pbmZvLT5mcHRyX3NlYyA9IGZwdHI7Ci0gICAgfQotCi0gIHJldHVybiBmcHRyOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3BsdG9mZiAoYWJmZCwgaW5mbywgaWE2NF9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnBsdG9mZjsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgcGx0b2ZmID0gaWE2NF9pbmZvLT5wbHRvZmZfc2VjOwotICBpZiAoIXBsdG9mZikKLSAgICB7Ci0gICAgICBkeW5vYmogPSBpYTY0X2luZm8tPnJvb3QuZHlub2JqOwotICAgICAgaWYgKCFkeW5vYmopCi0JaWE2NF9pbmZvLT5yb290LmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0KLSAgICAgIHBsdG9mZiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgRUxGX1NUUklOR19pYTY0X3BsdG9mZik7Ci0gICAgICBpZiAoIXBsdG9mZgotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBwbHRvZmYsCi0JCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgIHwgU0VDX1NNQUxMX0RBVEEKLQkJCQkgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcGx0b2ZmLCA0KSkKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWE2NF9pbmZvLT5wbHRvZmZfc2VjID0gcGx0b2ZmOwotICAgIH0KLQotICByZXR1cm4gcGx0b2ZmOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3JlbG9jX3NlY3Rpb24gKGFiZmQsIGlhNjRfaW5mbywgc2VjLCBjcmVhdGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotewotICBjb25zdCBjaGFyICpzcmVsX25hbWU7Ci0gIGFzZWN0aW9uICpzcmVsOwotICBiZmQgKmR5bm9iajsKLQotICBzcmVsX25hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCSAgICAgICAoYWJmZCwgZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCwKLQkJZWxmX3NlY3Rpb25fZGF0YShzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLSAgaWYgKHNyZWxfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIEJGRF9BU1NFUlQgKChzdHJuY21wIChzcmVsX25hbWUsICIucmVsYSIsIDUpID09IDAKLQkgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgc3JlbF9uYW1lKzUpID09IDApCi0JICAgICAgfHwgKHN0cm5jbXAgKHNyZWxfbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgICAgc3JlbF9uYW1lKzQpID09IDApKTsKLQotICBkeW5vYmogPSBpYTY0X2luZm8tPnJvb3QuZHlub2JqOwotICBpZiAoIWR5bm9iaikKLSAgICBpYTY0X2luZm8tPnJvb3QuZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgc3JlbF9uYW1lKTsKLSAgaWYgKHNyZWwgPT0gTlVMTCAmJiBjcmVhdGUpCi0gICAgewotICAgICAgc3JlbCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgc3JlbF9uYW1lKTsKLSAgICAgIGlmIChzcmVsID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbCwKLQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsLCAzKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHNyZWw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb3VudF9keW5fcmVsb2MgKGFiZmQsIGR5bl9pLCBzcmVsLCB0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0gICAgIGFzZWN0aW9uICpzcmVsOwotICAgICBpbnQgdHlwZTsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3JlbG9jX2VudHJ5ICpyZW50OwotCi0gIGZvciAocmVudCA9IGR5bl9pLT5yZWxvY19lbnRyaWVzOyByZW50OyByZW50ID0gcmVudC0+bmV4dCkKLSAgICBpZiAocmVudC0+c3JlbCA9PSBzcmVsICYmIHJlbnQtPnR5cGUgPT0gdHlwZSkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghcmVudCkKLSAgICB7Ci0gICAgICByZW50ID0gKHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9yZWxvY19lbnRyeSAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqcmVudCkpOwotICAgICAgaWYgKCFyZW50KQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcmVudC0+bmV4dCA9IGR5bl9pLT5yZWxvY19lbnRyaWVzOwotICAgICAgcmVudC0+c3JlbCA9IHNyZWw7Ci0gICAgICByZW50LT50eXBlID0gdHlwZTsKLSAgICAgIHJlbnQtPmNvdW50ID0gMDsKLSAgICAgIGR5bl9pLT5yZWxvY19lbnRyaWVzID0gcmVudDsKLSAgICB9Ci0gIHJlbnQtPmNvdW50Kys7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgYXNlY3Rpb24gKmdvdCwgKmZwdHIsICpzcmVsOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBpYTY0X2luZm8gPSBlbGY2NF9pYTY0X2hhc2hfdGFibGUgKGluZm8pOwotCi0gIGdvdCA9IGZwdHIgPSBzcmVsID0gTlVMTDsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICBlbnVtIHsKLQlORUVEX0dPVCA9IDEsCi0JTkVFRF9GUFRSID0gMiwKLQlORUVEX1BMVE9GRiA9IDQsCi0JTkVFRF9NSU5fUExUID0gOCwKLQlORUVEX0ZVTExfUExUID0gMTYsCi0JTkVFRF9EWU5SRUwgPSAzMiwKLQlORUVEX0xUT0ZGX0ZQVFIgPSA2NCwKLSAgICAgIH07Ci0KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgIGludCBuZWVkX2VudHJ5OwotICAgICAgYm9vbGVhbiBtYXliZV9keW5hbWljOwotICAgICAgaW50IGR5bnJlbF90eXBlOwotCi0gICAgICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBXZSdyZSBkZWFsaW5nIHdpdGggYSBnbG9iYWwgc3ltYm9sIC0tIGZpbmQgaXRzIGhhc2ggZW50cnkKLQkgICAgIGFuZCBtYXJrIGl0IGFzIGJlaW5nIHJlZmVyZW5jZWQuICAqLwotCSAgbG9uZyBpbmR4ID0gcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gb25seSBnZXQgcHJlbGltaW5hcnkgZGF0YSBvbiB3aGV0aGVyIGEgc3ltYm9sIGlzCi0JIGxvY2FsbHkgb3IgZXh0ZXJuYWxseSBkZWZpbmVkLCBhcyBub3QgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcwotCSBoYXZlIHlldCBiZWVuIHByb2Nlc3NlZC4gIERvIHNvbWV0aGluZyB3aXRoIHdoYXQgd2Uga25vdywgYXMKLQkgdGhpcyBtYXkgaGVscCByZWR1Y2UgbWVtb3J5IHVzYWdlIGFuZCBwcm9jZXNzaW5nIHRpbWUgbGF0ZXIuICAqLwotICAgICAgbWF5YmVfZHluYW1pYyA9IGZhbHNlOwotICAgICAgaWYgKGggJiYgKChpbmZvLT5zaGFyZWQgJiYgISBpbmZvLT5zeW1ib2xpYykKLQkJfHwgISAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpCi0JCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCW1heWJlX2R5bmFtaWMgPSB0cnVlOwotCi0gICAgICBuZWVkX2VudHJ5ID0gMDsKLSAgICAgIHN3aXRjaCAoRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9JQTY0X1RQUkVMMjI6Ci0JY2FzZSBSX0lBNjRfVFBSRUw2NE1TQjoKLQljYXNlIFJfSUE2NF9UUFJFTDY0TFNCOgotCWNhc2UgUl9JQTY0X0xUT0ZGX1RQMjI6Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlIFJfSUE2NF9MVE9GRl9GUFRSMjI6Ci0JY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjY0SToKLQljYXNlIFJfSUE2NF9MVE9GRl9GUFRSNjRNU0I6Ci0JY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjY0TFNCOgotCSAgbmVlZF9lbnRyeSA9IE5FRURfRlBUUiB8IE5FRURfR09UIHwgTkVFRF9MVE9GRl9GUFRSOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9GUFRSNjRJOgotCWNhc2UgUl9JQTY0X0ZQVFIzMk1TQjoKLQljYXNlIFJfSUE2NF9GUFRSMzJMU0I6Ci0JY2FzZSBSX0lBNjRfRlBUUjY0TVNCOgotCWNhc2UgUl9JQTY0X0ZQVFI2NExTQjoKLQkgIGlmIChpbmZvLT5zaGFyZWQgfHwgaCkKLQkgICAgbmVlZF9lbnRyeSA9IE5FRURfRlBUUiB8IE5FRURfRFlOUkVMOwotCSAgZWxzZQotCSAgICBuZWVkX2VudHJ5ID0gTkVFRF9GUFRSOwotCSAgZHlucmVsX3R5cGUgPSBSX0lBNjRfRlBUUjY0TFNCOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9MVE9GRjIyOgotCWNhc2UgUl9JQTY0X0xUT0ZGMjJYOgotCWNhc2UgUl9JQTY0X0xUT0ZGNjRJOgotCSAgbmVlZF9lbnRyeSA9IE5FRURfR09UOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9QTFRPRkYyMjoKLQljYXNlIFJfSUE2NF9QTFRPRkY2NEk6Ci0JY2FzZSBSX0lBNjRfUExUT0ZGNjRNU0I6Ci0JY2FzZSBSX0lBNjRfUExUT0ZGNjRMU0I6Ci0JICBuZWVkX2VudHJ5ID0gTkVFRF9QTFRPRkY7Ci0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIGlmIChtYXliZV9keW5hbWljKQotCQluZWVkX2VudHJ5IHw9IE5FRURfTUlOX1BMVDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCShpbmZvLCBfKCJAcGx0b2ZmIHJlbG9jIGFnYWluc3QgbG9jYWwgc3ltYm9sIiksIDAsCi0JCSBhYmZkLCAwLCAwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9QQ1JFTDIxQjoKLSAgICAgICAgY2FzZSBSX0lBNjRfUENSRUw2MEI6Ci0JICAvKiBEZXBlbmRpbmcgb24gd2hlcmUgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IG9yIG1heSBub3QKLQkgICAgIG5lZWQgYSBmdWxsIHBsdCBlbnRyeS4gIE9ubHkgc2tpcCBpZiB3ZSBrbm93IHdlJ2xsIG5vdCBuZWVkCi0JICAgICB0aGUgZW50cnkgLS0gc3RhdGljIG9yIHN5bWJvbGljLCBhbmQgdGhlIHN5bWJvbCBkZWZpbml0aW9uCi0JICAgICBoYXMgYWxyZWFkeSBiZWVuIHNlZW4uICAqLwotCSAgaWYgKG1heWJlX2R5bmFtaWMgJiYgcmVsLT5yX2FkZGVuZCA9PSAwKQotCSAgICBuZWVkX2VudHJ5ID0gTkVFRF9GVUxMX1BMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lBNjRfSU1NMTQ6Ci0JY2FzZSBSX0lBNjRfSU1NMjI6Ci0JY2FzZSBSX0lBNjRfSU1NNjQ6Ci0JY2FzZSBSX0lBNjRfRElSMzJNU0I6Ci0JY2FzZSBSX0lBNjRfRElSMzJMU0I6Ci0JY2FzZSBSX0lBNjRfRElSNjRNU0I6Ci0JY2FzZSBSX0lBNjRfRElSNjRMU0I6Ci0JICAvKiBTaGFyZWQgb2JqZWN0cyB3aWxsIGFsd2F5cyBuZWVkIGF0IGxlYXN0IGEgUkVMIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCB8fCBtYXliZV9keW5hbWljKQotCSAgICBuZWVkX2VudHJ5ID0gTkVFRF9EWU5SRUw7Ci0JICBkeW5yZWxfdHlwZSA9IFJfSUE2NF9ESVI2NExTQjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lBNjRfUENSRUwyMjoKLQljYXNlIFJfSUE2NF9QQ1JFTDY0SToKLQljYXNlIFJfSUE2NF9QQ1JFTDMyTVNCOgotCWNhc2UgUl9JQTY0X1BDUkVMMzJMU0I6Ci0JY2FzZSBSX0lBNjRfUENSRUw2NE1TQjoKLQljYXNlIFJfSUE2NF9QQ1JFTDY0TFNCOgotCSAgaWYgKG1heWJlX2R5bmFtaWMpCi0JICAgIG5lZWRfZW50cnkgPSBORUVEX0RZTlJFTDsKLQkgIGR5bnJlbF90eXBlID0gUl9JQTY0X1BDUkVMNjRMU0I7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghbmVlZF9lbnRyeSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChuZWVkX2VudHJ5ICYgTkVFRF9GUFRSKSAhPSAwCi0JICAmJiByZWwtPnJfYWRkZW5kKQotCXsKLQkgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCSAgICAoaW5mbywgXygibm9uLXplcm8gYWRkZW5kIGluIEBmcHRyIHJlbG9jIiksIDAsCi0JICAgICBhYmZkLCAwLCAwKTsKLQl9Ci0KLSAgICAgIGR5bl9pID0gZ2V0X2R5bl9zeW1faW5mbyAoaWE2NF9pbmZvLCBoLCBhYmZkLCByZWwsIHRydWUpOwotCi0gICAgICAvKiBSZWNvcmQgd2hldGhlciBvciBub3QgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbC4gICovCi0gICAgICBkeW5faS0+aCA9IGg7Ci0KLSAgICAgIC8qIENyZWF0ZSB3aGF0J3MgbmVlZGVkLiAgKi8KLSAgICAgIGlmIChuZWVkX2VudHJ5ICYgTkVFRF9HT1QpCi0JewotCSAgaWYgKCFnb3QpCi0JICAgIHsKLQkgICAgICBnb3QgPSBnZXRfZ290IChhYmZkLCBpbmZvLCBpYTY0X2luZm8pOwotCSAgICAgIGlmICghZ290KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGR5bl9pLT53YW50X2dvdCA9IDE7Ci0JfQotICAgICAgaWYgKG5lZWRfZW50cnkgJiBORUVEX0ZQVFIpCi0JewotCSAgaWYgKCFmcHRyKQotCSAgICB7Ci0JICAgICAgZnB0ciA9IGdldF9mcHRyIChhYmZkLCBpbmZvLCBpYTY0X2luZm8pOwotCSAgICAgIGlmICghZnB0cikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEZQVFJzIGZvciBzaGFyZWQgbGlicmFyaWVzIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIGR5bmFtaWMKLQkgICAgIGxpbmtlci4gIE1ha2Ugc3VyZSB0aGlzIGxvY2FsIHN5bWJvbCB3aWxsIGFwcGVhciBpbiB0aGUKLQkgICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQkgIGlmICghaCAmJiBpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoX2JmZF9lbGY2NF9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbAotCQkgICAgIChpbmZvLCBhYmZkLCByX3N5bW5keCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZHluX2ktPndhbnRfZnB0ciA9IDE7Ci0JfQotICAgICAgaWYgKG5lZWRfZW50cnkgJiBORUVEX0xUT0ZGX0ZQVFIpCi0JZHluX2ktPndhbnRfbHRvZmZfZnB0ciA9IDE7Ci0gICAgICBpZiAobmVlZF9lbnRyeSAmIChORUVEX01JTl9QTFQgfCBORUVEX0ZVTExfUExUKSkKLQl7Ci0gICAgICAgICAgaWYgKCFpYTY0X2luZm8tPnJvb3QuZHlub2JqKQotCSAgICBpYTY0X2luZm8tPnJvb3QuZHlub2JqID0gYWJmZDsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBkeW5faS0+d2FudF9wbHQgPSAxOwotCX0KLSAgICAgIGlmIChuZWVkX2VudHJ5ICYgTkVFRF9GVUxMX1BMVCkKLQlkeW5faS0+d2FudF9wbHQyID0gMTsKLSAgICAgIGlmIChuZWVkX2VudHJ5ICYgTkVFRF9QTFRPRkYpCi0JZHluX2ktPndhbnRfcGx0b2ZmID0gMTsKLSAgICAgIGlmICgobmVlZF9lbnRyeSAmIE5FRURfRFlOUkVMKSAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0JewotCSAgaWYgKCFzcmVsKQotCSAgICB7Ci0JICAgICAgc3JlbCA9IGdldF9yZWxvY19zZWN0aW9uIChhYmZkLCBpYTY0X2luZm8sIHNlYywgdHJ1ZSk7Ci0JICAgICAgaWYgKCFzcmVsKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghY291bnRfZHluX3JlbG9jIChhYmZkLCBkeW5faSwgc3JlbCwgZHlucmVsX3R5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBvZnM7Ci19OwotCi0vKiBGb3IgY2xlYW5saW5lc3MsIGFuZCBwb3RlbnRpYWxseSBmYXN0ZXIgZHluYW1pYyBsb2FkaW5nLCBhbGxvY2F0ZQotICAgZXh0ZXJuYWwgR09UIGVudHJpZXMgZmlyc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxsb2NhdGVfZ2xvYmFsX2RhdGFfZ290IChkeW5faSwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKnggPSAoc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqKWRhdGE7Ci0KLSAgaWYgKGR5bl9pLT53YW50X2dvdAotICAgICAgJiYgISBkeW5faS0+d2FudF9mcHRyCi0gICAgICAmJiBlbGY2NF9pYTY0X2R5bmFtaWNfc3ltYm9sX3AgKGR5bl9pLT5oLCB4LT5pbmZvKSkKLSAgICAgewotICAgICAgIGR5bl9pLT5nb3Rfb2Zmc2V0ID0geC0+b2ZzOwotICAgICAgIHgtPm9mcyArPSA4OwotICAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOZXh0LCBhbGxvY2F0ZSBhbGwgdGhlIEdPVCBlbnRyaWVzIHVzZWQgYnkgTFRPRkZfRlBUUiByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxsb2NhdGVfZ2xvYmFsX2ZwdHJfZ290IChkeW5faSwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKnggPSAoc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqKWRhdGE7Ci0KLSAgaWYgKGR5bl9pLT53YW50X2dvdAotICAgICAgJiYgZHluX2ktPndhbnRfZnB0cgotICAgICAgJiYgZWxmNjRfaWE2NF9keW5hbWljX3N5bWJvbF9wIChkeW5faS0+aCwgeC0+aW5mbykpCi0gICAgewotICAgICAgZHluX2ktPmdvdF9vZmZzZXQgPSB4LT5vZnM7Ci0gICAgICB4LT5vZnMgKz0gODsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMYXN0bHksIGFsbG9jYXRlIGFsbCB0aGUgR09UIGVudHJpZXMgZm9yIGxvY2FsIGRhdGEuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxsb2NhdGVfbG9jYWxfZ290IChkeW5faSwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKnggPSAoc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqKWRhdGE7Ci0KLSAgaWYgKGR5bl9pLT53YW50X2dvdAotICAgICAgJiYgISBlbGY2NF9pYTY0X2R5bmFtaWNfc3ltYm9sX3AgKGR5bl9pLT5oLCB4LT5pbmZvKSkKLSAgICB7Ci0gICAgICBkeW5faS0+Z290X29mZnNldCA9IHgtPm9mczsKLSAgICAgIHgtPm9mcyArPSA4OwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgdGhlIGluZGV4IG9mIGEgZ2xvYmFsIHN5bWJvbCBpbiBpdCdzIGRlZmluaW5nIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdsb2JhbF9zeW1faW5kZXggKGgpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnA7Ci0gIGJmZCAqb2JqOwotCi0gIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQotICBvYmogPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICBmb3IgKHAgPSBlbGZfc3ltX2hhc2hlcyAob2JqKTsgKnAgIT0gaDsgKytwKQotICAgIGNvbnRpbnVlOwotCi0gIHJldHVybiBwIC0gZWxmX3N5bV9oYXNoZXMgKG9iaikgKyBlbGZfdGRhdGEgKG9iaiktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLX0KLQotLyogQWxsb2NhdGUgZnVuY3Rpb24gZGVzY3JpcHRvcnMuICBXZSBjYW4gZG8gdGhlc2UgZm9yIGV2ZXJ5IGZ1bmN0aW9uCi0gICBpbiBhIG1haW4gZXhlY3V0YWJsZSB0aGF0IGlzIG5vdCBleHBvcnRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9mcHRyIChkeW5faSwgZGF0YSkKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKnggPSAoc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqKWRhdGE7Ci0KLSAgaWYgKGR5bl9pLT53YW50X2ZwdHIpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBkeW5faS0+aDsKLSAgICAgIAotICAgICAgaWYgKGgpCi0Jd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLSAgICAgIGlmICh4LT5pbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKGggJiYgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCQkJICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0JICAgICAgaWYgKCFfYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0JCSAgICAoeC0+aW5mbywgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJICAgICBnbG9iYWxfc3ltX2luZGV4IChoKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBkeW5faS0+d2FudF9mcHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChoID09IE5VTEwgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBkeW5faS0+ZnB0cl9vZmZzZXQgPSB4LT5vZnM7Ci0JICB4LT5vZnMgKz0gMTY7Ci0JfQotICAgICAgZWxzZQotCWR5bl9pLT53YW50X2ZwdHIgPSAwOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsbG9jYXRlIGFsbCB0aGUgbWluaW1hbCBQTFQgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9wbHRfZW50cmllcyAoZHluX2ksIGRhdGEpCi0gICAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faS0+d2FudF9wbHQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBkeW5faS0+aDsKLQotICAgICAgaWYgKGgpCi0Jd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLSAgICAgIC8qID8/PyBWZXJzaW9uZWQgc3ltYm9scyBzZWVtIHRvIGxvc2UgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQuICAqLwotICAgICAgaWYgKGVsZjY0X2lhNjRfZHluYW1pY19zeW1ib2xfcCAoaCwgeC0+aW5mbykpCi0JewotCSAgYmZkX3NpemVfdHlwZSBvZmZzZXQgPSB4LT5vZnM7Ci0JICBpZiAob2Zmc2V0ID09IDApCi0JICAgIG9mZnNldCA9IFBMVF9IRUFERVJfU0laRTsKLQkgIGR5bl9pLT5wbHRfb2Zmc2V0ID0gb2Zmc2V0OwotCSAgeC0+b2ZzID0gb2Zmc2V0ICsgUExUX01JTl9FTlRSWV9TSVpFOwotCi0JICBkeW5faS0+d2FudF9wbHRvZmYgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkeW5faS0+d2FudF9wbHQgPSAwOwotCSAgZHluX2ktPndhbnRfcGx0MiA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsbG9jYXRlIGFsbCB0aGUgZnVsbCBQTFQgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9wbHQyX2VudHJpZXMgKGR5bl9pLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqeCA9IChzdHJ1Y3QgZWxmNjRfaWE2NF9hbGxvY2F0ZV9kYXRhICopZGF0YTsKLQotICBpZiAoZHluX2ktPndhbnRfcGx0MikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IGR5bl9pLT5oOwotICAgICAgYmZkX3NpemVfdHlwZSBvZnMgPSB4LT5vZnM7Ci0KLSAgICAgIGR5bl9pLT5wbHQyX29mZnNldCA9IG9mczsKLSAgICAgIHgtPm9mcyA9IG9mcyArIFBMVF9GVUxMX0VOVFJZX1NJWkU7Ci0KLSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0gICAgICBkeW5faS0+aC0+cGx0Lm9mZnNldCA9IG9mczsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbGxvY2F0ZSBhbGwgdGhlIFBMVE9GRiBlbnRyaWVzIHJlcXVlc3RlZCBieSByZWxvY2F0aW9ucyBhbmQKLSAgIHBsdCBlbnRyaWVzLiAgV2UgY2FuJ3Qgc2hhcmUgc3BhY2Ugd2l0aCBhbGxvY2F0ZWQgRlBUUiBlbnRyaWVzLAotICAgYmVjYXVzZSB0aGUgbGF0dGVyIGFyZSBub3QgbmVjZXNzYXJpbHkgYWRkcmVzc2FibGUgYnkgdGhlIEdQLgotICAgPz8/IFJlbGF4YXRpb24gbWlnaHQgYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhhdCB0aGV5IGFyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbGxvY2F0ZV9wbHRvZmZfZW50cmllcyAoZHluX2ksIGRhdGEpCi0gICAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9hbGxvY2F0ZV9kYXRhICp4ID0gKHN0cnVjdCBlbGY2NF9pYTY0X2FsbG9jYXRlX2RhdGEgKilkYXRhOwotCi0gIGlmIChkeW5faS0+d2FudF9wbHRvZmYpCi0gICAgewotICAgICAgZHluX2ktPnBsdG9mZl9vZmZzZXQgPSB4LT5vZnM7Ci0gICAgICB4LT5vZnMgKz0gMTY7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxsb2NhdGUgZHluYW1pYyByZWxvY2F0aW9ucyBmb3IgdGhvc2Ugc3ltYm9scyB0aGF0IHR1cm5lZCBvdXQKLSAgIHRvIGJlIGR5bmFtaWMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxsb2NhdGVfZHlucmVsX2VudHJpZXMgKGR5bl9pLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSAqeCA9IChzdHJ1Y3QgZWxmNjRfaWE2NF9hbGxvY2F0ZV9kYXRhICopZGF0YTsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9yZWxvY19lbnRyeSAqcmVudDsKLSAgYm9vbGVhbiBkeW5hbWljX3N5bWJvbCwgc2hhcmVkOwotCi0gIGlhNjRfaW5mbyA9IGVsZjY0X2lhNjRfaGFzaF90YWJsZSAoeC0+aW5mbyk7Ci0gIGR5bmFtaWNfc3ltYm9sID0gZWxmNjRfaWE2NF9keW5hbWljX3N5bWJvbF9wIChkeW5faS0+aCwgeC0+aW5mbyk7Ci0gIHNoYXJlZCA9IHgtPmluZm8tPnNoYXJlZDsKLQotICAvKiBUYWtlIGNhcmUgb2YgdGhlIG5vcm1hbCBkYXRhIHJlbG9jYXRpb25zLiAgKi8KLQotICBmb3IgKHJlbnQgPSBkeW5faS0+cmVsb2NfZW50cmllczsgcmVudDsgcmVudCA9IHJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChyZW50LT50eXBlKQotCXsKLQljYXNlIFJfSUE2NF9GUFRSNjRMU0I6Ci0JICAvKiBBbGxvY2F0ZSBvbmUgaWZmICF3YW50X2ZwdHIsIHdoaWNoIGJ5IHRoaXMgcG9pbnQgd2lsbAotCSAgICAgYmUgdHJ1ZSBvbmx5IGlmIHdlJ3JlIGFjdHVhbGx5IGFsbG9jYXRpbmcgb25lIHN0YXRpY2FsbHkKLQkgICAgIGluIHRoZSBtYWluIGV4ZWN1dGFibGUuICAqLwotCSAgaWYgKGR5bl9pLT53YW50X2ZwdHIpCi0JICAgIGNvbnRpbnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0lBNjRfUENSRUw2NExTQjoKLQkgIGlmICghZHluYW1pY19zeW1ib2wpCi0JICAgIGNvbnRpbnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0lBNjRfRElSNjRMU0I6Ci0JICBpZiAoIWR5bmFtaWNfc3ltYm9sICYmICFzaGFyZWQpCi0JICAgIGNvbnRpbnVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcmVudC0+c3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiByZW50LT5jb3VudDsKLSAgICB9Ci0KLSAgLyogVGFrZSBjYXJlIG9mIHRoZSBHT1QgYW5kIFBMVCByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKCgoZHluYW1pY19zeW1ib2wgfHwgc2hhcmVkKSAmJiBkeW5faS0+d2FudF9nb3QpCi0gICAgICB8fCAoZHluX2ktPndhbnRfbHRvZmZfZnB0ciAmJiBkeW5faS0+aCAmJiBkeW5faS0+aC0+ZHluaW5keCAhPSAtMSkpCi0gICAgaWE2NF9pbmZvLT5yZWxfZ290X3NlYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgaWYgKGR5bl9pLT53YW50X3BsdG9mZikKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHQgPSAwOwotCi0gICAgICAvKiBEeW5hbWljIHN5bWJvbHMgZ2V0IG9uZSBJUExUIHJlbG9jYXRpb24uICBMb2NhbCBzeW1ib2xzIGluCi0JIHNoYXJlZCBsaWJyYXJpZXMgZ2V0IHR3byBSRUwgcmVsb2NhdGlvbnMuICBMb2NhbCBzeW1ib2xzIGluCi0JIG1haW4gYXBwbGljYXRpb25zIGdldCBub3RoaW5nLiAgKi8KLSAgICAgIGlmIChkeW5hbWljX3N5bWJvbCkKLQl0ID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGVsc2UgaWYgKHNoYXJlZCkKLQl0ID0gMiAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIGlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMtPl9yYXdfc2l6ZSArPSB0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2lhNjRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIC8qID8/PyBVbmRlZmluZWQgc3ltYm9scyB3aXRoIFBMVCBlbnRyaWVzIHNob3VsZCBiZSByZS1kZWZpbmVkCi0gICAgIHRvIGJlIHRoZSBQTFQgZW50cnkuICAqLwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICAgICAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbiwgd2UgbWlnaHQgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uCi0gICAgIGFuZCBhbGxvY2F0ZSBhIENPUFkgZHluYW1pYyByZWxvY2F0aW9uLgotCi0gICAgIEJ1dCBJQS02NCBjb2RlIGlzIGNhbm9uaWNhbGx5IFBJQywgc28gYXMgYSBydWxlIHdlIGNhbiBhdm9pZCB0aGlzIHNvcnQKLSAgICAgb2YgaGFja2VyeS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfYWxsb2NhdGVfZGF0YSBkYXRhOwotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkICpkeW5vYmo7Ci0gIGJvb2xlYW4gcmVsdGV4dCA9IGZhbHNlOwotICBib29sZWFuIHJlbHBsdCA9IGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGlhNjRfaW5mbyA9IGVsZjY0X2lhNjRfaGFzaF90YWJsZSAoaW5mbyk7Ci0gIEJGRF9BU1NFUlQoZHlub2JqICE9IE5VTEwpOwotICBkYXRhLmluZm8gPSBpbmZvOwotCi0gIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICBpZiAoaWE2NF9pbmZvLT5yb290LmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotICAgICAgJiYgIWluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLSAgICAgIHNlYy0+X3Jhd19zaXplID0gc3RybGVuIChFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUikgKyAxOwotICAgIH0KLQotICAvKiBEVF9JTklUIGFuZCBEVF9GSU5JIGdldCBmdW5jdGlvbiBkZXNjcmlwdG9ycyBub3QgcmF3IGNvZGUgYWRkcmVzc2VzLgotICAgICBGb3JjZSB0aGVpciBzeW1ib2xzIHRvIGhhdmUgcGx0b2ZmIGVudHJpZXMgc28gd2UgY2FuIHVzZSB0aG9zZS4gICovCi0gIGlmIChpYTY0X2luZm8tPnJvb3QuZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAKLSAgICAgIGlmIChpbmZvLT5pbml0X2Z1bmN0aW9uCi0JICAmJiAoaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCQlpbmZvLT5pbml0X2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkJZmFsc2UsIGZhbHNlKSkKLSAgICAgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICAgICAgewotCSAgZHluX2kgPSBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIG91dHB1dF9iZmQsIE5VTEwsIHRydWUpOwotCSAgZHluX2ktPndhbnRfcGx0b2ZmID0gMTsKLSAgICAgICAgfQotCi0gICAgICBpZiAoaW5mby0+ZmluaV9mdW5jdGlvbgotCSAgJiYgKGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkJaW5mby0+ZmluaV9mdW5jdGlvbiwgZmFsc2UsCi0JCQkJCWZhbHNlLCBmYWxzZSkpCi0gICAgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpICE9IDApCi0gICAgICAgIHsKLQkgIGR5bl9pID0gZ2V0X2R5bl9zeW1faW5mbyAoaWE2NF9pbmZvLCBoLCBvdXRwdXRfYmZkLCBOVUxMLCB0cnVlKTsKLQkgIGR5bl9pLT53YW50X3BsdG9mZiA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgdGhlIEdPVCBlbnRyaWVzLiAgKi8KLQotICBpZiAoaWE2NF9pbmZvLT5nb3Rfc2VjKQotICAgIHsKLSAgICAgIGRhdGEub2ZzID0gMDsKLSAgICAgIGVsZjY0X2lhNjRfZHluX3N5bV90cmF2ZXJzZSAoaWE2NF9pbmZvLCBhbGxvY2F0ZV9nbG9iYWxfZGF0YV9nb3QsICZkYXRhKTsKLSAgICAgIGVsZjY0X2lhNjRfZHluX3N5bV90cmF2ZXJzZSAoaWE2NF9pbmZvLCBhbGxvY2F0ZV9nbG9iYWxfZnB0cl9nb3QsICZkYXRhKTsKLSAgICAgIGVsZjY0X2lhNjRfZHluX3N5bV90cmF2ZXJzZSAoaWE2NF9pbmZvLCBhbGxvY2F0ZV9sb2NhbF9nb3QsICZkYXRhKTsKLSAgICAgIGlhNjRfaW5mby0+Z290X3NlYy0+X3Jhd19zaXplID0gZGF0YS5vZnM7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHRoZSBGUFRSIGVudHJpZXMuICAqLwotCi0gIGlmIChpYTY0X2luZm8tPmZwdHJfc2VjKQotICAgIHsKLSAgICAgIGRhdGEub2ZzID0gMDsKLSAgICAgIGVsZjY0X2lhNjRfZHluX3N5bV90cmF2ZXJzZSAoaWE2NF9pbmZvLCBhbGxvY2F0ZV9mcHRyLCAmZGF0YSk7Ci0gICAgICBpYTY0X2luZm8tPmZwdHJfc2VjLT5fcmF3X3NpemUgPSBkYXRhLm9mczsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgc2VlbiBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCB3ZSBjYW4gZGVjaWRlIHdoaWNoCi0gICAgIHN5bWJvbHMgbmVlZCBwbHQgZW50cmllcy4gIEFsbG9jYXRlIHRoZSBtaW5pbWFsIFBMVCBlbnRyaWVzIGZpcnN0LgotICAgICBXZSBkbyB0aGlzIGV2ZW4gdGhvdWdoIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBtYXkgYmUgZmFsc2UsIGJlY2F1c2UKLSAgICAgdGhpcyBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHdhbnRfcGx0IGFuZCB3YW50X3BsdDIuICAqLwotCi0gIGRhdGEub2ZzID0gMDsKLSAgZWxmNjRfaWE2NF9keW5fc3ltX3RyYXZlcnNlIChpYTY0X2luZm8sIGFsbG9jYXRlX3BsdF9lbnRyaWVzLCAmZGF0YSk7Ci0KLSAgaWE2NF9pbmZvLT5taW5wbHRfZW50cmllcyA9IDA7Ci0gIGlmIChkYXRhLm9mcykKLSAgICB7Ci0gICAgICBpYTY0X2luZm8tPm1pbnBsdF9lbnRyaWVzCi0JPSAoZGF0YS5vZnMgLSBQTFRfSEVBREVSX1NJWkUpIC8gUExUX01JTl9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBBbGlnbiB0aGUgcG9pbnRlciBmb3IgdGhlIHBsdDIgZW50cmllcy4gICovCi0gIGRhdGEub2ZzID0gKGRhdGEub2ZzICsgMzEpICYgLTMyOwotCi0gIGVsZjY0X2lhNjRfZHluX3N5bV90cmF2ZXJzZSAoaWE2NF9pbmZvLCBhbGxvY2F0ZV9wbHQyX2VudHJpZXMsICZkYXRhKTsKLSAgaWYgKGRhdGEub2ZzICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaWE2NF9pbmZvLT5yb290LmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCk7Ci0KLSAgICAgIGlhNjRfaW5mby0+cGx0X3NlYy0+X3Jhd19zaXplID0gZGF0YS5vZnM7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGdvdCBhIC5wbHQsIHdlIG5lZWQgc29tZSBleHRyYSBtZW1vcnkgZm9yIHRoZSBkeW5hbWljCi0JIGxpbmtlci4gIFdlIHN0dWZmIHRoZXNlIGluIC5nb3QucGx0LiAgKi8KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc2VjLT5fcmF3X3NpemUgPSA4ICogUExUX1JFU0VSVkVEX1dPUkRTOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSB0aGUgUExUT0ZGIGVudHJpZXMuICAqLwotCi0gIGlmIChpYTY0X2luZm8tPnBsdG9mZl9zZWMpCi0gICAgewotICAgICAgZGF0YS5vZnMgPSAwOwotICAgICAgZWxmNjRfaWE2NF9keW5fc3ltX3RyYXZlcnNlIChpYTY0X2luZm8sIGFsbG9jYXRlX3BsdG9mZl9lbnRyaWVzLCAmZGF0YSk7Ci0gICAgICBpYTY0X2luZm8tPnBsdG9mZl9zZWMtPl9yYXdfc2l6ZSA9IGRhdGEub2ZzOwotICAgIH0KLQotICBpZiAoaWE2NF9pbmZvLT5yb290LmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgdGhhdCB0dXJuZWQgb3V0IHRvIGJlCi0JIHJlcXVpcmVkLiAgKi8KLQotICAgICAgZWxmNjRfaWE2NF9keW5fc3ltX3RyYXZlcnNlIChpYTY0X2luZm8sIGFsbG9jYXRlX2R5bnJlbF9lbnRyaWVzLCAmZGF0YSk7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgbm93IGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuCi0gICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIGZvciAoc2VjID0gZHlub2JqLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoIShzZWMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlIG91dHB1dCBmaWxlLgotCSBUaGVyZSB3ZXJlIHNldmVyYWwgc2VjdGlvbnMgcHJpbWFyaWx5IHJlbGF0ZWQgdG8gZHluYW1pYwotCSBsaW5raW5nIHRoYXQgbXVzdCBiZSBjcmVhdGUgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dAotCSBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkgYmZkX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28gaW50bwotCSB0aGVzZSBzZWN0aW9ucy4gICovCi0KLSAgICAgIHN0cmlwID0gKHNlYy0+X3Jhd19zaXplID09IDApOwotCi0gICAgICBpZiAoc2VjID09IGlhNjRfaW5mby0+Z290X3NlYykKLQlzdHJpcCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoc2VjID09IGlhNjRfaW5mby0+cmVsX2dvdF9zZWMpCi0JewotCSAgaWYgKHN0cmlwKQotCSAgICBpYTY0X2luZm8tPnJlbF9nb3Rfc2VjID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZCB0bwotCSAgICAgICBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHNlYyA9PSBpYTY0X2luZm8tPmZwdHJfc2VjKQotCXsKLQkgIGlmIChzdHJpcCkKLQkgICAgaWE2NF9pbmZvLT5mcHRyX3NlYyA9IE5VTEw7Ci0JfQotICAgICAgZWxzZSBpZiAoc2VjID09IGlhNjRfaW5mby0+cGx0X3NlYykKLQl7Ci0JICBpZiAoc3RyaXApCi0JICAgIGlhNjRfaW5mby0+cGx0X3NlYyA9IE5VTEw7Ci0JfQotICAgICAgZWxzZSBpZiAoc2VjID09IGlhNjRfaW5mby0+cGx0b2ZmX3NlYykKLQl7Ci0JICBpZiAoc3RyaXApCi0JICAgIGlhNjRfaW5mby0+cGx0b2ZmX3NlYyA9IE5VTEw7Ci0JfQotICAgICAgZWxzZSBpZiAoc2VjID09IGlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMpCi0JewotCSAgaWYgKHN0cmlwKQotCSAgICBpYTY0X2luZm8tPnJlbF9wbHRvZmZfc2VjID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbHBsdCA9IHRydWU7Ci0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZCB0bwotCQkgY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JICAgICBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzZWMpOwotCi0JICBpZiAoc3RyY21wIChuYW1lLCAiLmdvdC5wbHQiKSA9PSAwKQotCSAgICBzdHJpcCA9IGZhbHNlOwotCSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJpcCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JCSAgYXNlY3Rpb24gKnRhcmdldDsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIGlmIChvdXRuYW1lWzRdID09ICdhJykKLQkJICAgIG91dG5hbWUgKz0gNTsKLQkJICBlbHNlCi0JCSAgICBvdXRuYW1lICs9IDQ7Ci0KLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0KLQkJICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkIHRvCi0JCSAgICAgY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzZWMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCSAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jKGR5bm9iaiwgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCAmJiBzZWMtPl9yYXdfc2l6ZSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlIHZhbHVlcwotCSBsYXRlciAoaW4gZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cKLQkgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IgdGhlIC5keW5hbWljIHNlY3Rpb24uICAqLwotCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICAvKiBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZAotCSAgICAgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLQkgIGlmICghYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSUFfNjRfUExUX1JFU0VSVkUsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogPz8/IFBlcmhhcHMgZm9yY2UgX19ncCBsb2NhbC4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAoYWJmZCwgaGl0X2FkZHIsIHZhbCwgcl90eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9ieXRlICpoaXRfYWRkcjsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKm9wOwotICBpbnQgYmlnZW5kaWFuID0gMCwgc2hpZnQgPSAwOwotICBiZmRfdm1hIHQwLCB0MSwgaW5zbiwgZHdvcmQ7Ci0gIGVudW0gaWE2NF9vcG5kIG9wbmQ7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc2l6ZV90IHNpemUgPSA4OwotCi0gIG9wbmQgPSBJQTY0X09QTkRfTklMOwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0lBNjRfTk9ORToKLSAgICBjYXNlIFJfSUE2NF9MRFhNT1Y6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgICAvKiBJbnN0cnVjdGlvbiByZWxvY2F0aW9ucy4gKi8KLQotICAgIGNhc2UgUl9JQTY0X0lNTTE0OgkJb3BuZCA9IElBNjRfT1BORF9JTU0xNDsgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDIxRjoJb3BuZCA9IElBNjRfT1BORF9UR1QyNTsgYnJlYWs7Ci0gICAgY2FzZSBSX0lBNjRfUENSRUwyMU06CW9wbmQgPSBJQTY0X09QTkRfVEdUMjViOyBicmVhazsKLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDYwQjoJb3BuZCA9IElBNjRfT1BORF9UR1Q2NDsgYnJlYWs7Ci0gICAgY2FzZSBSX0lBNjRfUENSRUwyMUI6Ci0gICAgY2FzZSBSX0lBNjRfUENSRUwyMUJJOgotICAgICAgb3BuZCA9IElBNjRfT1BORF9UR1QyNWM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JQTY0X0lNTTIyOgotICAgIGNhc2UgUl9JQTY0X0dQUkVMMjI6Ci0gICAgY2FzZSBSX0lBNjRfTFRPRkYyMjoKLSAgICBjYXNlIFJfSUE2NF9MVE9GRjIyWDoKLSAgICBjYXNlIFJfSUE2NF9QTFRPRkYyMjoKLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDIyOgotICAgIGNhc2UgUl9JQTY0X0xUT0ZGX0ZQVFIyMjoKLSAgICAgIG9wbmQgPSBJQTY0X09QTkRfSU1NMjI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JQTY0X0lNTTY0OgotICAgIGNhc2UgUl9JQTY0X0dQUkVMNjRJOgotICAgIGNhc2UgUl9JQTY0X0xUT0ZGNjRJOgotICAgIGNhc2UgUl9JQTY0X1BMVE9GRjY0SToKLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDY0SToKLSAgICBjYXNlIFJfSUE2NF9GUFRSNjRJOgotICAgIGNhc2UgUl9JQTY0X0xUT0ZGX0ZQVFI2NEk6Ci0gICAgICBvcG5kID0gSUE2NF9PUE5EX0lNTVU2NDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBEYXRhIHJlbG9jYXRpb25zLiAgKi8KLQotICAgIGNhc2UgUl9JQTY0X0RJUjMyTVNCOgotICAgIGNhc2UgUl9JQTY0X0dQUkVMMzJNU0I6Ci0gICAgY2FzZSBSX0lBNjRfRlBUUjMyTVNCOgotICAgIGNhc2UgUl9JQTY0X1BDUkVMMzJNU0I6Ci0gICAgY2FzZSBSX0lBNjRfU0VHUkVMMzJNU0I6Ci0gICAgY2FzZSBSX0lBNjRfU0VDUkVMMzJNU0I6Ci0gICAgY2FzZSBSX0lBNjRfTFRWMzJNU0I6Ci0gICAgICBzaXplID0gNDsgYmlnZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lBNjRfRElSMzJMU0I6Ci0gICAgY2FzZSBSX0lBNjRfR1BSRUwzMkxTQjoKLSAgICBjYXNlIFJfSUE2NF9GUFRSMzJMU0I6Ci0gICAgY2FzZSBSX0lBNjRfUENSRUwzMkxTQjoKLSAgICBjYXNlIFJfSUE2NF9TRUdSRUwzMkxTQjoKLSAgICBjYXNlIFJfSUE2NF9TRUNSRUwzMkxTQjoKLSAgICBjYXNlIFJfSUE2NF9MVFYzMkxTQjoKLSAgICAgIHNpemUgPSA0OyBiaWdlbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSUE2NF9ESVI2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9HUFJFTDY0TVNCOgotICAgIGNhc2UgUl9JQTY0X1BMVE9GRjY0TVNCOgotICAgIGNhc2UgUl9JQTY0X0ZQVFI2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDY0TVNCOgotICAgIGNhc2UgUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9TRUdSRUw2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9TRUNSRUw2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9MVFY2NE1TQjoKLSAgICAgIHNpemUgPSA4OyBiaWdlbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSUE2NF9ESVI2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9HUFJFTDY0TFNCOgotICAgIGNhc2UgUl9JQTY0X1BMVE9GRjY0TFNCOgotICAgIGNhc2UgUl9JQTY0X0ZQVFI2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9QQ1JFTDY0TFNCOgotICAgIGNhc2UgUl9JQTY0X0xUT0ZGX0ZQVFI2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9TRUdSRUw2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9TRUNSRUw2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9MVFY2NExTQjoKLSAgICAgIHNpemUgPSA4OyBiaWdlbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFVuc3VwcG9ydGVkIC8gRHluYW1pYyByZWxvY2F0aW9ucy4gICovCi0KLSAgICBjYXNlIFJfSUE2NF9SRUwzMk1TQjoKLSAgICBjYXNlIFJfSUE2NF9SRUwzMkxTQjoKLSAgICBjYXNlIFJfSUE2NF9SRUw2NE1TQjoKLSAgICBjYXNlIFJfSUE2NF9SRUw2NExTQjoKLQotICAgIGNhc2UgUl9JQTY0X0lQTFRNU0I6Ci0gICAgY2FzZSBSX0lBNjRfSVBMVExTQjoKLSAgICBjYXNlIFJfSUE2NF9FUExUTVNCOgotICAgIGNhc2UgUl9JQTY0X0VQTFRMU0I6Ci0gICAgY2FzZSBSX0lBNjRfQ09QWToKLQotICAgIGNhc2UgUl9JQTY0X1NFR0JBU0U6Ci0KLSAgICBjYXNlIFJfSUE2NF9UUFJFTDIyOgotICAgIGNhc2UgUl9JQTY0X1RQUkVMNjRNU0I6Ci0gICAgY2FzZSBSX0lBNjRfVFBSRUw2NExTQjoKLSAgICBjYXNlIFJfSUE2NF9MVE9GRl9UUDIyOgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLQotICBzd2l0Y2ggKG9wbmQpCi0gICAgewotICAgIGNhc2UgSUE2NF9PUE5EX0lNTVU2NDoKLSAgICAgIGhpdF9hZGRyIC09IChsb25nKSBoaXRfYWRkciAmIDB4MzsKLSAgICAgIHQwID0gYmZkX2dldF82NCAoYWJmZCwgaGl0X2FkZHIpOwotICAgICAgdDEgPSBiZmRfZ2V0XzY0IChhYmZkLCBoaXRfYWRkciArIDgpOwotCi0gICAgICAvKiB0bXBsL3M6IGJpdHMgIDAuLiA1IGluIHQwCi0JIHNsb3QgMDogYml0cyAgNS4uNDUgaW4gdDAKLQkgc2xvdCAxOiBiaXRzIDQ2Li42MyBpbiB0MCwgYml0cyAwLi4yMiBpbiB0MQotCSBzbG90IDI6IGJpdHMgMjMuLjYzIGluIHQxICovCi0KLSAgICAgIC8qIEZpcnN0LCBjbGVhciB0aGUgYml0cyB0aGF0IGZvcm0gdGhlIDY0IGJpdCBjb25zdGFudC4gICovCi0gICAgICB0MCAmPSB+KDB4M2ZmZmZMTCA8PCA0Nik7Ci0gICAgICB0MSAmPSB+KDB4N2ZmZmZmTEwKLQkgICAgICB8ICgoICAoMHgwN2ZMTCA8PCAxMykgfCAoMHgxZmZMTCA8PCAyNykKLQkJICAgIHwgKDB4MDFmTEwgPDwgMjIpIHwgKDB4MDAxTEwgPDwgMjEpCi0JCSAgICB8ICgweDAwMUxMIDw8IDM2KSkgPDwgMjMpKTsKLQotICAgICAgdDAgfD0gKCh2YWwgPj4gMjIpICYgMHgwM2ZmZmZMTCkgPDwgNDY7CQkvKiAxOCBsc2JzIG9mIGltbTQxICovCi0gICAgICB0MSB8PSAoKHZhbCA+PiA0MCkgJiAweDdmZmZmZkxMKSA8PCAgMDsJCS8qIDIzIG1zYnMgb2YgaW1tNDEgKi8KLSAgICAgIHQxIHw9ICggICgoKHZhbCA+PiAgMCkgJiAweDA3ZikgPDwgMTMpCQkvKiBpbW03YiAqLwotCSAgICAgICB8ICgoKHZhbCA+PiAgNykgJiAweDFmZikgPDwgMjcpCQkvKiBpbW05ZCAqLwotCSAgICAgICB8ICgoKHZhbCA+PiAxNikgJiAweDAxZikgPDwgMjIpCQkvKiBpbW01YyAqLwotCSAgICAgICB8ICgoKHZhbCA+PiAyMSkgJiAweDAwMSkgPDwgMjEpCQkvKiBpYyAqLwotCSAgICAgICB8ICgoKHZhbCA+PiA2MykgJiAweDAwMSkgPDwgMzYpKSA8PCAyMzsJLyogaSAqLwotCi0gICAgICBiZmRfcHV0XzY0IChhYmZkLCB0MCwgaGl0X2FkZHIpOwotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdDEsIGhpdF9hZGRyICsgOCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSUE2NF9PUE5EX1RHVDY0OgotICAgICAgaGl0X2FkZHIgLT0gKGxvbmcpIGhpdF9hZGRyICYgMHgzOwotICAgICAgdDAgPSBiZmRfZ2V0XzY0IChhYmZkLCBoaXRfYWRkcik7Ci0gICAgICB0MSA9IGJmZF9nZXRfNjQgKGFiZmQsIGhpdF9hZGRyICsgOCk7Ci0KLSAgICAgIC8qIHRtcGwvczogYml0cyAgMC4uIDUgaW4gdDAKLQkgc2xvdCAwOiBiaXRzICA1Li40NSBpbiB0MAotCSBzbG90IDE6IGJpdHMgNDYuLjYzIGluIHQwLCBiaXRzIDAuLjIyIGluIHQxCi0JIHNsb3QgMjogYml0cyAyMy4uNjMgaW4gdDEgKi8KLQotICAgICAgLyogRmlyc3QsIGNsZWFyIHRoZSBiaXRzIHRoYXQgZm9ybSB0aGUgNjQgYml0IGNvbnN0YW50LiAgKi8KLSAgICAgIHQwICY9IH4oMHgzZmZmZkxMIDw8IDQ2KTsKLSAgICAgIHQxICY9IH4oMHg3ZmZmZmZMTAotCSAgICAgIHwgKCgxTEwgPDwgMzYgfCAweGZmZmZmTEwgPDwgMTMpIDw8IDIzKSk7Ci0KLSAgICAgIHZhbCA+Pj0gNDsKLSAgICAgIHQwIHw9ICgodmFsID4+IDIwKSAmIDB4ZmZmZkxMKSA8PCAyIDw8IDQ2OwkvKiAxNiBsc2JzIG9mIGltbTM5ICovCi0gICAgICB0MSB8PSAoKHZhbCA+PiAzNikgJiAweDdmZmZmZkxMKSA8PCAwOwkJLyogMjMgbXNicyBvZiBpbW0zOSAqLwotICAgICAgdDEgfD0gKCgoKHZhbCA+PiAwKSAmIDB4ZmZmZmZMTCkgPDwgMTMpCQkvKiBpbW0yMGIgKi8KLQkgICAgICB8ICgoKHZhbCA+PiA1OSkgJiAweDFMTCkgPDwgMzYpKSA8PCAyMzsJLyogaSAqLwotCi0gICAgICBiZmRfcHV0XzY0IChhYmZkLCB0MCwgaGl0X2FkZHIpOwotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdDEsIGhpdF9hZGRyICsgOCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKChsb25nKSBoaXRfYWRkciAmIDB4MykKLQl7Ci0JY2FzZSAwOiBzaGlmdCA9ICA1OyBicmVhazsKLQljYXNlIDE6IHNoaWZ0ID0gMTQ7IGhpdF9hZGRyICs9IDM7IGJyZWFrOwotCWNhc2UgMjogc2hpZnQgPSAyMzsgaGl0X2FkZHIgKz0gNjsgYnJlYWs7Ci0JY2FzZSAzOiByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsgLyogc2hvdWxkbid0IGhhcHBlbi4uLiAqLwotCX0KLSAgICAgIGR3b3JkID0gYmZkX2dldF82NCAoYWJmZCwgaGl0X2FkZHIpOwotICAgICAgaW5zbiA9IChkd29yZCA+PiBzaGlmdCkgJiAweDFmZmZmZmZmZmZmTEw7Ci0KLSAgICAgIG9wID0gZWxmNjRfaWE2NF9vcGVyYW5kcyArIG9wbmQ7Ci0gICAgICBlcnIgPSAoKm9wLT5pbnNlcnQpIChvcCwgdmFsLCAmaW5zbik7Ci0gICAgICBpZiAoZXJyKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGR3b3JkICY9IH4oMHgxZmZmZmZmZmZmZkxMIDw8IHNoaWZ0KTsKLSAgICAgIGR3b3JkIHw9IChpbnNuIDw8IHNoaWZ0KTsKLSAgICAgIGJmZF9wdXRfNjQgKGFiZmQsIGR3b3JkLCBoaXRfYWRkcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSUE2NF9PUE5EX05JTDoKLSAgICAgIC8qIEEgZGF0YSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChiaWdlbmRpYW4pCi0JaWYgKHNpemUgPT0gNCkKLQkgIGJmZF9wdXRiMzIgKHZhbCwgaGl0X2FkZHIpOwotCWVsc2UKLQkgIGJmZF9wdXRiNjQgKHZhbCwgaGl0X2FkZHIpOwotICAgICAgZWxzZQotCWlmIChzaXplID09IDQpCi0JICBiZmRfcHV0bDMyICh2YWwsIGhpdF9hZGRyKTsKLQllbHNlCi0JICBiZmRfcHV0bDY0ICh2YWwsIGhpdF9hZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgdm9pZAotZWxmNjRfaWE2NF9pbnN0YWxsX2R5bl9yZWxvYyAoYWJmZCwgaW5mbywgc2VjLCBzcmVsLCBvZmZzZXQsIHR5cGUsCi0JCQkgICAgICBkeW5pbmR4LCBhZGRlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzZWN0aW9uICpzcmVsOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgIGxvbmcgZHluaW5keDsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotICBvdXRyZWwucl9vZmZzZXQgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIG9mZnNldCk7Ci0KLSAgQkZEX0FTU0VSVCAoZHluaW5keCAhPSAtMSk7Ci0gIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGR5bmluZHgsIHR5cGUpOwotICBvdXRyZWwucl9hZGRlbmQgPSBhZGRlbmQ7Ci0KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWF5IGJlIE5VTEwgZm9yIGxpbmtlci1nZW5lcmF0ZWQgcmVsb2NhdGlvbnMsIGFzIGl0IGlzCi0JIGluY29udmVuaWVudCB0byBwYXNzIGFsbCB0aGUgYml0cyBhcm91bmQuICBBbmQgdGhpcyBzaG91bGRuJ3QKLQkgaGFwcGVuLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGluZm8gIT0gTlVMTCk7Ci0KLSAgICAgIG9mZnNldCA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJKGFiZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywgc2VjLAotCQkgJmVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnN0YWJfaW5mbywgb2Zmc2V0KSk7Ci0gICAgICBpZiAob2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQl7Ci0JICAvKiBSdW4gZm9yIHRoZSBoaWxscy4gIFdlIHNob3VsZG4ndCBiZSBvdXRwdXR0aW5nIGEgcmVsb2NhdGlvbgotCSAgICAgZm9yIHRoaXMuICBTbyBkbyB3aGF0IGV2ZXJ5b25lIGVsc2UgZG9lcyBhbmQgb3V0cHV0IGEgbm8tb3AuICAqLwotCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9JQTY0X05PTkUpOwotCSAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkgIG9mZnNldCA9IDA7Ci0JfQotICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2Zmc2V0OwotICAgIH0KLQotICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmb3V0cmVsLAotCQkJICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgc3JlbC0+Y29udGVudHMKLQkJCSAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKykpOwotICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci19Ci0KLS8qIFN0b3JlIGFuIGVudHJ5IGZvciB0YXJnZXQgYWRkcmVzcyBUQVJHRVRfQUREUiBpbiB0aGUgbGlua2FnZSB0YWJsZQotICAgYW5kIHJldHVybiB0aGUgZ3AtcmVsYXRpdmUgYWRkcmVzcyBvZiB0aGUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1zZXRfZ290X2VudHJ5IChhYmZkLCBpbmZvLCBkeW5faSwgZHluaW5keCwgYWRkZW5kLCB2YWx1ZSwgZHluX3JfdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgbG9uZyBkeW5pbmR4OwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGR5bl9yX3R5cGU7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvOwotICBhc2VjdGlvbiAqZ290X3NlYzsKLQotICBpYTY0X2luZm8gPSBlbGY2NF9pYTY0X2hhc2hfdGFibGUgKGluZm8pOwotICBnb3Rfc2VjID0gaWE2NF9pbmZvLT5nb3Rfc2VjOwotCi0gIEJGRF9BU1NFUlQgKChkeW5faS0+Z290X29mZnNldCAmIDcpID09IDApOwotCi0gIGlmICghIGR5bl9pLT5nb3RfZG9uZSkKLSAgICB7Ci0gICAgICBkeW5faS0+Z290X2RvbmUgPSB0cnVlOwotCi0gICAgICAvKiBTdG9yZSB0aGUgdGFyZ2V0IGFkZHJlc3MgaW4gdGhlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsdWUsIGdvdF9zZWMtPmNvbnRlbnRzICsgZHluX2ktPmdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBJbnN0YWxsIGEgZHluYW1pYyByZWxvY2F0aW9uIGlmIG5lZWRlZC4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAgICAgfHwgZWxmNjRfaWE2NF9keW5hbWljX3N5bWJvbF9wIChkeW5faS0+aCwgaW5mbykKLQkgIHx8IChkeW5pbmR4ICE9IC0xICYmIGR5bl9yX3R5cGUgPT0gUl9JQTY0X0ZQVFI2NExTQikpCi0JewotCSAgaWYgKGR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBkeW5fcl90eXBlID0gUl9JQTY0X1JFTDY0TFNCOwotCSAgICAgIGR5bmluZHggPSAwOwotCSAgICAgIGFkZGVuZCA9IHZhbHVlOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGR5bl9yX3R5cGUpCi0JCXsKLQkJY2FzZSBSX0lBNjRfUkVMNjRMU0I6Ci0JCSAgZHluX3JfdHlwZSA9IFJfSUE2NF9SRUw2NE1TQjsKLQkJICBicmVhazsKLQkJY2FzZSBSX0lBNjRfRElSNjRMU0I6Ci0JCSAgZHluX3JfdHlwZSA9IFJfSUE2NF9ESVI2NE1TQjsKLQkJICBicmVhazsKLQkJY2FzZSBSX0lBNjRfRlBUUjY0TFNCOgotCQkgIGR5bl9yX3R5cGUgPSBSX0lBNjRfRlBUUjY0TVNCOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIEJGRF9BU1NFUlQgKGZhbHNlKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGVsZjY0X2lhNjRfaW5zdGFsbF9keW5fcmVsb2MgKGFiZmQsIE5VTEwsIGdvdF9zZWMsCi0JCQkJCWlhNjRfaW5mby0+cmVsX2dvdF9zZWMsCi0JCQkJCWR5bl9pLT5nb3Rfb2Zmc2V0LCBkeW5fcl90eXBlLAotCQkJCQlkeW5pbmR4LCBhZGRlbmQpOwotCX0KLSAgICB9Ci0KLSAgLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdmFsdWUgPSAoZ290X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICsgZ290X3NlYy0+b3V0cHV0X29mZnNldAotCSAgICsgZHluX2ktPmdvdF9vZmZzZXQpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogRmlsbCBpbiBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgY29uc2lzdGluZyBvZiB0aGUgZnVuY3Rpb24ncyBjb2RlCi0gICBhZGRyZXNzIGFuZCBpdHMgZ2xvYmFsIHBvaW50ZXIuICBSZXR1cm4gdGhlIGRlc2NyaXB0b3IncyBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXNldF9mcHRyX2VudHJ5IChhYmZkLCBpbmZvLCBkeW5faSwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvOwotICBhc2VjdGlvbiAqZnB0cl9zZWM7Ci0KLSAgaWE2NF9pbmZvID0gZWxmNjRfaWE2NF9oYXNoX3RhYmxlIChpbmZvKTsKLSAgZnB0cl9zZWMgPSBpYTY0X2luZm8tPmZwdHJfc2VjOwotCi0gIGlmICghZHluX2ktPmZwdHJfZG9uZSkKLSAgICB7Ci0gICAgICBkeW5faS0+ZnB0cl9kb25lID0gMTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0gICAgICBiZmRfcHV0XzY0IChhYmZkLCB2YWx1ZSwgZnB0cl9zZWMtPmNvbnRlbnRzICsgZHluX2ktPmZwdHJfb2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfNjQgKGFiZmQsIF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKSwKLQkJICBmcHRyX3NlYy0+Y29udGVudHMgKyBkeW5faS0+ZnB0cl9vZmZzZXQgKyA4KTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9yJ3MgYWRkcmVzcy4gICovCi0gIHZhbHVlID0gKGZwdHJfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgKyBmcHRyX3NlYy0+b3V0cHV0X29mZnNldAotCSAgICsgZHluX2ktPmZwdHJfb2Zmc2V0KTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIEZpbGwgaW4gYSBQTFRPRkYgZW50cnkgY29uc2lzdGluZyBvZiB0aGUgZnVuY3Rpb24ncyBjb2RlIGFkZHJlc3MKLSAgIGFuZCBpdHMgZ2xvYmFsIHBvaW50ZXIuICBSZXR1cm4gdGhlIGRlc2NyaXB0b3IncyBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXNldF9wbHRvZmZfZW50cnkgKGFiZmQsIGluZm8sIGR5bl9pLCB2YWx1ZSwgaXNfcGx0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBib29sZWFuIGlzX3BsdDsKLXsKLSAgc3RydWN0IGVsZjY0X2lhNjRfbGlua19oYXNoX3RhYmxlICppYTY0X2luZm87Ci0gIGFzZWN0aW9uICpwbHRvZmZfc2VjOwotCi0gIGlhNjRfaW5mbyA9IGVsZjY0X2lhNjRfaGFzaF90YWJsZSAoaW5mbyk7Ci0gIHBsdG9mZl9zZWMgPSBpYTY0X2luZm8tPnBsdG9mZl9zZWM7Ci0KLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBzeW1ib2wgdXNlcyBhIHJlYWwgUExUIGVudHJ5LiAgSW4KLSAgICAgdGhhdCBjYXNlLCB3ZSdsbCBmaWxsIHRoaXMgaW4gZHVyaW5nIGZpbmlzaF9keW5hbWljX3N5bWJvbC4gICovCi0gIGlmICgoISBkeW5faS0+d2FudF9wbHQgfHwgaXNfcGx0KQotICAgICAgJiYgIWR5bl9pLT5wbHRvZmZfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbHVlLCBwbHRvZmZfc2VjLT5jb250ZW50cyArIGR5bl9pLT5wbHRvZmZfb2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfNjQgKGFiZmQsIF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKSwKLQkJICBwbHRvZmZfc2VjLT5jb250ZW50cyArIGR5bl9pLT5wbHRvZmZfb2Zmc2V0ICsgOCk7Ci0KLSAgICAgIC8qIEluc3RhbGwgZHluYW1pYyByZWxvY2F0aW9ucyBpZiBuZWVkZWQuICAqLwotICAgICAgaWYgKCFpc19wbHQgJiYgaW5mby0+c2hhcmVkKQotCXsKLQkgIHVuc2lnbmVkIGludCBkeW5fcl90eXBlOwotCi0JICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCSAgICBkeW5fcl90eXBlID0gUl9JQTY0X1JFTDY0TVNCOwotCSAgZWxzZQotCSAgICBkeW5fcl90eXBlID0gUl9JQTY0X1JFTDY0TFNCOwotCi0JICBlbGY2NF9pYTY0X2luc3RhbGxfZHluX3JlbG9jIChhYmZkLCBOVUxMLCBwbHRvZmZfc2VjLAotCQkJCQlpYTY0X2luZm8tPnJlbF9wbHRvZmZfc2VjLAotCQkJCQlkeW5faS0+cGx0b2ZmX29mZnNldCwKLQkJCQkJZHluX3JfdHlwZSwgMCwgMCk7Ci0JICBlbGY2NF9pYTY0X2luc3RhbGxfZHluX3JlbG9jIChhYmZkLCBOVUxMLCBwbHRvZmZfc2VjLAotCQkJCQlpYTY0X2luZm8tPnJlbF9wbHRvZmZfc2VjLAotCQkJCQlkeW5faS0+cGx0b2ZmX29mZnNldCArIDgsCi0JCQkJCWR5bl9yX3R5cGUsIDAsIDApOwotCX0KLQotICAgICAgZHluX2ktPnBsdG9mZl9kb25lID0gMTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9yJ3MgYWRkcmVzcy4gICovCi0gIHZhbHVlID0gKHBsdG9mZl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICArIHBsdG9mZl9zZWMtPm91dHB1dF9vZmZzZXQKLQkgICArIGR5bl9pLT5wbHRvZmZfb2Zmc2V0KTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGY2NF9pYTY0X2xpbmtfaGFzaF90YWJsZSAqaWE2NF9pbmZvOwotICBpYTY0X2luZm8gPSBlbGY2NF9pYTY0X2hhc2hfdGFibGUgKGluZm8pOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSd2ZSBnb3Qgb3Vyc2VsdmVzIGEgbmljZSBmYXQgX19ncCB2YWx1ZS4gICovCi0gIGlmICghaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGJmZF92bWEgbWluX3ZtYSA9IChiZmRfdm1hKSAtMSwgbWF4X3ZtYSA9IDA7Ci0gICAgICBiZmRfdm1hIG1pbl9zaG9ydF92bWEgPSBtaW5fdm1hLCBtYXhfc2hvcnRfdm1hID0gMDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpncDsKLSAgICAgIGJmZF92bWEgZ3BfdmFsOwotICAgICAgYXNlY3Rpb24gKm9zOwotCi0gICAgICAvKiBGaW5kIHRoZSBtaW4gYW5kIG1heCB2bWEgb2YgYWxsIHNlY3Rpb25zIG1hcmtlZCBzaG9ydC4gIEFsc28KLQkgY29sbGVjdCBtaW4gYW5kIG1heCB2bWEgb2YgYW55IHR5cGUsIGZvciB1c2UgaW4gc2VsZWN0aW5nIGEKLQkgbmljZSBncC4gICovCi0gICAgICBmb3IgKG9zID0gYWJmZC0+c2VjdGlvbnM7IG9zIDsgb3MgPSBvcy0+bmV4dCkKLQl7Ci0JICBiZmRfdm1hIGxvLCBoaTsKLQotCSAgaWYgKChvcy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBsbyA9IG9zLT52bWE7Ci0JICBoaSA9IG9zLT52bWEgKyBvcy0+X3Jhd19zaXplOwotCSAgaWYgKGhpIDwgbG8pCi0JICAgIGhpID0gKGJmZF92bWEpIC0xOwotCi0JICBpZiAobWluX3ZtYSA+IGxvKQotCSAgICBtaW5fdm1hID0gbG87Ci0JICBpZiAobWF4X3ZtYSA8IGhpKQotCSAgICBtYXhfdm1hID0gaGk7Ci0JICBpZiAob3MtPmZsYWdzICYgU0VDX1NNQUxMX0RBVEEpCi0JICAgIHsKLQkgICAgICBpZiAobWluX3Nob3J0X3ZtYSA+IGxvKQotCQltaW5fc2hvcnRfdm1hID0gbG87Ci0JICAgICAgaWYgKG1heF9zaG9ydF92bWEgPCBoaSkKLQkJbWF4X3Nob3J0X3ZtYSA9IGhpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTZWUgaWYgdGhlIHVzZXIgd2FudHMgdG8gZm9yY2UgYSB2YWx1ZS4gICovCi0gICAgICBncCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICJfX2dwIiwgZmFsc2UsCi0JCQkJIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChncAotCSAgJiYgKGdwLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgZ3AtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGFzZWN0aW9uICpncF9zZWMgPSBncC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgZ3BfdmFsID0gKGdwLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGdwX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBncF9zZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQaWNrIGEgc2Vuc2libGUgdmFsdWUuICAqLwotCi0JICBhc2VjdGlvbiAqZ290X3NlYyA9IGlhNjRfaW5mby0+Z290X3NlYzsKLQotCSAgLyogU3RhcnQgd2l0aCBqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290LiAgKi8KLQkgIGlmIChnb3Rfc2VjKQotCSAgICBncF92YWwgPSBnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgZWxzZSBpZiAobWF4X3Nob3J0X3ZtYSAhPSAwKQotCSAgICBncF92YWwgPSBtaW5fc2hvcnRfdm1hOwotCSAgZWxzZQotCSAgICBncF92YWwgPSBtaW5fdm1hOwotCi0JICAvKiBJZiBpdCBpcyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoZSBlbnRpcmUgaW1hZ2UsIGJ1dCB3ZQotCSAgICAgZG9uJ3Qgd2l0aCB0aGUgY2hvaWNlIGFib3ZlLCBhZGp1c3QuICAqLwotCSAgaWYgKG1heF92bWEgLSBtaW5fdm1hIDwgMHg0MDAwMDAKLQkgICAgICAmJiBtYXhfdm1hIC0gZ3BfdmFsIDw9IDB4MjAwMDAwCi0JICAgICAgJiYgZ3BfdmFsIC0gbWluX3ZtYSA+IDB4MjAwMDAwKQotCSAgICBncF92YWwgPSBtaW5fdm1hICsgMHgyMDAwMDA7Ci0JICBlbHNlIGlmIChtYXhfc2hvcnRfdm1hICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBjb3ZlciBhbGwgdGhlIHNob3J0IGRhdGEsIGFkanVzdC4gICovCi0JICAgICAgaWYgKG1heF9zaG9ydF92bWEgLSBncF92YWwgPj0gMHgyMDAwMDApCi0JCWdwX3ZhbCA9IG1pbl9zaG9ydF92bWEgKyAweDIwMDAwMDsKLQotCSAgICAgIC8qIElmIHdlJ3JlIGFkZHJlc3Npbmcgc3R1ZmYgcGFzdCB0aGUgZW5kLCBhZGp1c3QgYmFjay4gICovCi0JICAgICAgaWYgKGdwX3ZhbCA+IG1heF92bWEpCi0JCWdwX3ZhbCA9IG1heF92bWEgLSAweDIwMDAwMCArIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFZhbGlkYXRlIHdoZXRoZXIgYWxsIFNIRl9JQV82NF9TSE9SVCBzZWN0aW9ucyBhcmUgd2l0aGluCi0JIHJhbmdlIG9mIHRoZSBjaG9zZW4gR1AuICAqLwotCi0gICAgICBpZiAobWF4X3Nob3J0X3ZtYSAhPSAwKQotCXsKLQkgIGlmIChtYXhfc2hvcnRfdm1hIC0gbWluX3Nob3J0X3ZtYSA+PSAweDQwMDAwMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IHNob3J0IGRhdGEgc2VnbWVudCBvdmVyZmxvd2VkICgweCVseCA+PSAweDQwMDAwMCkiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgKHVuc2lnbmVkIGxvbmcpKG1heF9zaG9ydF92bWEgLSBtaW5fc2hvcnRfdm1hKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmICgoZ3BfdmFsID4gbWluX3Nob3J0X3ZtYQotCQkgICAgJiYgZ3BfdmFsIC0gbWluX3Nob3J0X3ZtYSA+IDB4MjAwMDAwKQotCQkgICB8fCAoZ3BfdmFsIDwgbWF4X3Nob3J0X3ZtYQotCQkgICAgICAgJiYgbWF4X3Nob3J0X3ZtYSAtIGdwX3ZhbCA+PSAweDIwMDAwMCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBfX2dwIGRvZXMgbm90IGNvdmVyIHNob3J0IGRhdGEgc2VnbWVudCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbCk7Ci0gICAgfQotCi0gIC8qIFRyaWNreSBiaXRzLiAgRFRfSU5JVCBhbmQgRFRfRklOSSB1c2UgYSBwbHRvZmYgZW50cnksIHdoaWNoIGlzCi0gICAgIG5vcm1hbGx5IGluaXRpYWxpemVkIGluIGZpbmlzaF9keW5hbWljX3NlY3Rpb25zLiAgRXhjZXB0IHRoYXQKLSAgICAgd2UgbmVlZCBhbGwgbm9uLXBsdCBwbHRvZmYgZW50cmllcyB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgZmluaXNoX2R5bmFtaWNfc3ltYm9scy4gIFRoaXMgYmVjYXVzZSB0aGUgYXJyYXkgb2YgcmVsb2NhdGlvbnMKLSAgICAgdXNlZCBmb3IgcGx0IGVudHJpZXMgKGFrYSBEVF9KTVBSRUwpIGJlZ2lucyBhZnRlciBhbGwgdGhlIAotICAgICBub24tcGx0IHBsdG9mZiByZWxvY2F0aW9ucy4gIElmIHRoZSBvcmRlciBnZXRzIGNvbmZ1c2VkLCB3ZQotICAgICBtdW5nZSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBhcnJheSBiYXNlLiAgKi8KLSAgaWYgKGlhNjRfaW5mby0+cm9vdC5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaWE2NF9keW5fc3ltX2luZm8gKmR5bl9pOwotICAgICAgYmZkX3ZtYSBhZGRyOwotIAotICAgICAgaWYgKGluZm8tPmluaXRfZnVuY3Rpb24KLQkgICYmIChoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJCWluZm8tPmluaXRfZnVuY3Rpb24sIGZhbHNlLAotCQkJCQlmYWxzZSwgZmFsc2UpKQotICAgICAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSAhPSAwKQotICAgICAgICB7Ci0JICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgTlVMTCwgTlVMTCwgZmFsc2UpOwotCSAgYWRkciA9IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0JICAodm9pZCkgc2V0X3BsdG9mZl9lbnRyeSAoYWJmZCwgaW5mbywgZHluX2ksIGFkZHIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICBpZiAoaW5mby0+ZmluaV9mdW5jdGlvbgotCSAgJiYgKGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkJaW5mby0+ZmluaV9mdW5jdGlvbiwgZmFsc2UsCi0JCQkJCWZhbHNlLCBmYWxzZSkpCi0gICAgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpICE9IDApCi0gICAgICAgIHsKLQkgIGR5bl9pID0gZ2V0X2R5bl9zeW1faW5mbyAoaWE2NF9pbmZvLCBoLCBOVUxMLCBOVUxMLCBmYWxzZSk7Ci0JICBhZGRyID0gKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLQkgICh2b2lkKSBzZXRfcGx0b2ZmX2VudHJ5IChhYmZkLCBpbmZvLCBkeW5faSwgYWRkciwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgcmV0dXJuIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbyk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzcmVsOwotICBib29sZWFuIHJldF92YWwgPSB0cnVlOwkvKiBmb3Igbm9uLWZhdGFsIGVycm9ycyAqLwotICBiZmRfdm1hIGdwX3ZhbDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgaWE2NF9pbmZvID0gZWxmNjRfaWE2NF9oYXNoX3RhYmxlIChpbmZvKTsKLQotICAvKiBJbmZlY3QgdmFyaW91cyBmbGFncyBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgYmZkX3ZtYSBmbGFnczsKLQotICAgICAgZmxhZ3MgPSBlbGZfc2VjdGlvbl9kYXRhKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9mbGFnczsKLSAgICAgIGZsYWdzICY9IFNIRl9JQV82NF9OT1JFQ09WOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCS0+dGhpc19oZHIuc2hfZmxhZ3MgfD0gZmxhZ3M7Ci0gICAgfQotCi0gIGdwX3ZhbCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgc3JlbCA9IGdldF9yZWxvY19zZWN0aW9uIChpbnB1dF9iZmQsIGlhNjRfaW5mbywgaW5wdXRfc2VjdGlvbiwgZmFsc2UpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgIGJmZF9ieXRlICpoaXRfYWRkcjsKLSAgICAgIGJvb2xlYW4gZHluYW1pY19zeW1ib2xfcDsKLSAgICAgIGJvb2xlYW4gdW5kZWZfd2Vha19yZWY7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA+IFJfSUE2NF9NQVhfUkVMT0NfQ09ERSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgKGludClyX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXRfdmFsID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBob3d0byA9IGxvb2t1cF9ob3d0byAocl90eXBlKTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICB1bmRlZl93ZWFrX3JlZiA9IGZhbHNlOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIFJlbG9jIGFnYWluc3QgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICB2YWx1ZSAgPSAoc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGluZHg7Ci0KLQkgIC8qIFJlbG9jIGFnYWluc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIHZhbHVlID0gMDsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICAvKiBEZXRlY3QgdGhlIGNhc2VzIHRoYXQgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gaXMKLQkJIGV4cGVjdGVkIHRvIGJlIE5VTEwgLS0gYWxsIGNhc2VzIGluIHdoaWNoIHRoZSBzeW1ib2wKLQkJIGlzIGRlZmluZWQgaW4gYW5vdGhlciBzaGFyZWQgbW9kdWxlLiAgVGhpcyBpbmNsdWRlcwotCQkgUExUIHJlbG9jcyBmb3Igd2hpY2ggd2UndmUgY3JlYXRlZCBhIFBMVCBlbnRyeSBhbmQKLQkJIG90aGVyIHJlbG9jcyBmb3Igd2hpY2ggd2UncmUgcHJlcGFyZWQgdG8gY3JlYXRlCi0JCSBkeW5hbWljIHJlbG9jYXRpb25zLiAgKi8KLQkgICAgICAvKiA/Pz8gSnVzdCBhY2NlcHQgaXQgTlVMTCBhbmQgY29udGludWUuICAqLwotCi0JICAgICAgaWYgKHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JCXsKLQkJICB2YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB1bmRlZl93ZWFrX3JlZiA9IHRydWU7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljCi0JCSAgICYmICFpbmZvLT5ub191bmRlZmluZWQKLQkJICAgJiYgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSA9PSBTVFZfREVGQVVMVCkKLQkgICAgOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsCi0JCSAgICAgICghaW5mby0+c2hhcmVkIHx8IGluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAgICAgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJldF92YWwgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaGl0X2FkZHIgPSBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSByZWwtPnJfYWRkZW5kOwotICAgICAgZHluYW1pY19zeW1ib2xfcCA9IGVsZjY0X2lhNjRfZHluYW1pY19zeW1ib2xfcCAoaCwgaW5mbyk7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfSUE2NF9OT05FOgotCWNhc2UgUl9JQTY0X0xEWE1PVjoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBSX0lBNjRfSU1NMTQ6Ci0JY2FzZSBSX0lBNjRfSU1NMjI6Ci0JY2FzZSBSX0lBNjRfSU1NNjQ6Ci0JY2FzZSBSX0lBNjRfRElSMzJNU0I6Ci0JY2FzZSBSX0lBNjRfRElSMzJMU0I6Ci0JY2FzZSBSX0lBNjRfRElSNjRNU0I6Ci0JY2FzZSBSX0lBNjRfRElSNjRMU0I6Ci0JICAvKiBJbnN0YWxsIGEgZHluYW1pYyByZWxvY2F0aW9uIGZvciB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmICgoZHluYW1pY19zeW1ib2xfcCB8fCBpbmZvLT5zaGFyZWQpCi0JICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGR5bl9yX3R5cGU7Ci0JICAgICAgbG9uZyBkeW5pbmR4OwotCi0JICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgZHluYW1pYyBzeW1ib2wgbG9va3VwLCBmaW5kIGEKLQkJIG1hdGNoaW5nIFJFTEFUSVZFIHJlbG9jYXRpb24uICAqLwotCSAgICAgIGR5bl9yX3R5cGUgPSByX3R5cGU7Ci0JICAgICAgaWYgKGR5bmFtaWNfc3ltYm9sX3ApCi0JCWR5bmluZHggPSBoLT5keW5pbmR4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN3aXRjaCAocl90eXBlKQotCQkgICAgewotCQkgICAgY2FzZSBSX0lBNjRfRElSMzJNU0I6Ci0JCSAgICAgIGR5bl9yX3R5cGUgPSBSX0lBNjRfUkVMMzJNU0I7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBSX0lBNjRfRElSMzJMU0I6Ci0JCSAgICAgIGR5bl9yX3R5cGUgPSBSX0lBNjRfUkVMMzJMU0I7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBSX0lBNjRfRElSNjRNU0I6Ci0JCSAgICAgIGR5bl9yX3R5cGUgPSBSX0lBNjRfUkVMNjRNU0I7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBSX0lBNjRfRElSNjRMU0I6Ci0JCSAgICAgIGR5bl9yX3R5cGUgPSBSX0lBNjRfUkVMNjRMU0I7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICAvKiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB3aXRob3V0IGEgZHluYW1pYyBzeW1ib2wuCi0JCQkgQWRqdXN0IHRoZSByZWxvY2F0aW9uIHRvIGJlIGFnYWluc3QgYW4gb3V0cHV0Ci0JCQkgc2VjdGlvbiBzeW1ib2wsIHdoaWNoIGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGUKLQkJCSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0JCSAgICAgIC8qID8/PyBQZW9wbGUgc2hvdWxkbid0IGJlIGRvaW5nIG5vbi1waWMgY29kZSBpbgotCQkJIHNoYXJlZCBsaWJyYXJpZXMuICBIb3JrLiAgKi8KLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IGxpbmtpbmcgbm9uLXBpYyBjb2RlIGluIGEgc2hhcmVkIGxpYnJhcnkiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJICAgICAgcmV0X3ZhbCA9IGZhbHNlOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBkeW5pbmR4ID0gMDsKLQkJfQotCi0JICAgICAgZWxmNjRfaWE2NF9pbnN0YWxsX2R5bl9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIHNyZWwsIHJlbC0+cl9vZmZzZXQsIGR5bl9yX3R5cGUsCi0JCQkJCSAgICBkeW5pbmR4LCByZWwtPnJfYWRkZW5kKTsKLQkgICAgfQotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9JQTY0X0xUVjMyTVNCOgotCWNhc2UgUl9JQTY0X0xUVjMyTFNCOgotCWNhc2UgUl9JQTY0X0xUVjY0TVNCOgotCWNhc2UgUl9JQTY0X0xUVjY0TFNCOgotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9HUFJFTDIyOgotCWNhc2UgUl9JQTY0X0dQUkVMNjRJOgotCWNhc2UgUl9JQTY0X0dQUkVMMzJNU0I6Ci0JY2FzZSBSX0lBNjRfR1BSRUwzMkxTQjoKLQljYXNlIFJfSUE2NF9HUFJFTDY0TVNCOgotCWNhc2UgUl9JQTY0X0dQUkVMNjRMU0I6Ci0JICBpZiAoZHluYW1pY19zeW1ib2xfcCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IEBncHJlbCByZWxvY2F0aW9uIGFnYWluc3QgZHluYW1pYyBzeW1ib2wgJXMiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICAgIHJldF92YWwgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdmFsdWUgLT0gZ3BfdmFsOwotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9MVE9GRjIyOgotCWNhc2UgUl9JQTY0X0xUT0ZGMjJYOgotCWNhc2UgUl9JQTY0X0xUT0ZGNjRJOgotICAgICAgICAgIGR5bl9pID0gZ2V0X2R5bl9zeW1faW5mbyAoaWE2NF9pbmZvLCBoLCBpbnB1dF9iZmQsIHJlbCwgZmFsc2UpOwotCSAgdmFsdWUgPSBzZXRfZ290X2VudHJ5IChpbnB1dF9iZmQsIGluZm8sIGR5bl9pLCAoaCA/IGgtPmR5bmluZHggOiAtMSksCi0JCQkJIHJlbC0+cl9hZGRlbmQsIHZhbHVlLCBSX0lBNjRfRElSNjRMU0IpOwotCSAgdmFsdWUgLT0gZ3BfdmFsOwotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9QTFRPRkYyMjoKLQljYXNlIFJfSUE2NF9QTFRPRkY2NEk6Ci0JY2FzZSBSX0lBNjRfUExUT0ZGNjRNU0I6Ci0JY2FzZSBSX0lBNjRfUExUT0ZGNjRMU0I6Ci0gICAgICAgICAgZHluX2kgPSBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIGlucHV0X2JmZCwgcmVsLCBmYWxzZSk7Ci0JICB2YWx1ZSA9IHNldF9wbHRvZmZfZW50cnkgKG91dHB1dF9iZmQsIGluZm8sIGR5bl9pLCB2YWx1ZSwgZmFsc2UpOwotCSAgdmFsdWUgLT0gZ3BfdmFsOwotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9GUFRSNjRJOgotCWNhc2UgUl9JQTY0X0ZQVFIzMk1TQjoKLQljYXNlIFJfSUE2NF9GUFRSMzJMU0I6Ci0JY2FzZSBSX0lBNjRfRlBUUjY0TVNCOgotCWNhc2UgUl9JQTY0X0ZQVFI2NExTQjoKLSAgICAgICAgICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgaW5wdXRfYmZkLCByZWwsIGZhbHNlKTsKLQkgIGlmIChkeW5faS0+d2FudF9mcHRyKQotCSAgICB7Ci0JICAgICAgaWYgKCF1bmRlZl93ZWFrX3JlZikKLQkJdmFsdWUgPSBzZXRfZnB0cl9lbnRyeSAob3V0cHV0X2JmZCwgaW5mbywgZHluX2ksIHZhbHVlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9uZyBkeW5pbmR4OwotCi0JICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBleHBlY3QgdGhlIGR5bmFtaWMgbGlua2VyIHRvIGNyZWF0ZQotCQkgdGhlIGVudHJ5LiAgKi8KLQotCSAgICAgIGlmIChoKQotCQl7Ci0JCSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0JCSAgICBkeW5pbmR4ID0gaC0+ZHluaW5keDsKLQkJICBlbHNlCi0JCSAgICBkeW5pbmR4ID0gKF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHgKLQkJCSAgICAgICAoaW5mbywgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQlnbG9iYWxfc3ltX2luZGV4IChoKSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZHluaW5keCA9IChfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4Ci0JCQkgICAgIChpbmZvLCBpbnB1dF9iZmQsIHJfc3ltbmR4KSk7Ci0JCX0KLQotCSAgICAgIGVsZjY0X2lhNjRfaW5zdGFsbF9keW5fcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBzcmVsLCByZWwtPnJfb2Zmc2V0LCByX3R5cGUsCi0JCQkJCSAgICBkeW5pbmR4LCByZWwtPnJfYWRkZW5kKTsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgIH0KLQotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9MVE9GRl9GUFRSMjI6Ci0JY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjY0SToKLQljYXNlIFJfSUE2NF9MVE9GRl9GUFRSNjRNU0I6Ci0JY2FzZSBSX0lBNjRfTFRPRkZfRlBUUjY0TFNCOgotCSAgewotCSAgICBsb25nIGR5bmluZHg7Ci0KLQkgICAgZHluX2kgPSBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIGlucHV0X2JmZCwgcmVsLCBmYWxzZSk7Ci0JICAgIGlmIChkeW5faS0+d2FudF9mcHRyKQotCSAgICAgIHsKLQkJQkZEX0FTU0VSVCAoaCA9PSBOVUxMIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgICBpZiAoIXVuZGVmX3dlYWtfcmVmKQotCSAgICAgICAgICB2YWx1ZSA9IHNldF9mcHRyX2VudHJ5IChvdXRwdXRfYmZkLCBpbmZvLCBkeW5faSwgdmFsdWUpOwotCQlkeW5pbmR4ID0gLTE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCSAgICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBleHBlY3QgdGhlIGR5bmFtaWMgbGlua2VyIHRvIGNyZWF0ZQotCQkgICB0aGUgZW50cnkuICAqLwotCSAgICAgICAgaWYgKGgpCi0JCSAgewotCQkgICAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0JCSAgICAgIGR5bmluZHggPSBoLT5keW5pbmR4OwotCQkgICAgZWxzZQotCQkgICAgICBkeW5pbmR4ID0gKF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHgKLQkJCQkgKGluZm8sIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICBnbG9iYWxfc3ltX2luZGV4IChoKSkpOwotCQkgIH0KLQkJZWxzZQotCQkgIGR5bmluZHggPSAoX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keAotCQkJICAgICAoaW5mbywgaW5wdXRfYmZkLCByX3N5bW5keCkpOwotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCi0JICAgIHZhbHVlID0gc2V0X2dvdF9lbnRyeSAob3V0cHV0X2JmZCwgaW5mbywgZHluX2ksIGR5bmluZHgsCi0JCQkJICAgcmVsLT5yX2FkZGVuZCwgdmFsdWUsIFJfSUE2NF9GUFRSNjRMU0IpOwotCSAgICB2YWx1ZSAtPSBncF92YWw7Ci0JICAgIHIgPSBlbGY2NF9pYTY0X2luc3RhbGxfdmFsdWUgKG91dHB1dF9iZmQsIGhpdF9hZGRyLCB2YWx1ZSwgcl90eXBlKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lBNjRfUENSRUwzMk1TQjoKLQljYXNlIFJfSUE2NF9QQ1JFTDMyTFNCOgotCWNhc2UgUl9JQTY0X1BDUkVMNjRNU0I6Ci0JY2FzZSBSX0lBNjRfUENSRUw2NExTQjoKLQkgIC8qIEluc3RhbGwgYSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgaWYgKGR5bmFtaWNfc3ltYm9sX3ApCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICAgICAgZWxmNjRfaWE2NF9pbnN0YWxsX2R5bl9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIHNyZWwsIHJlbC0+cl9vZmZzZXQsIHJfdHlwZSwKLQkJCQkJICAgIGgtPmR5bmluZHgsIHJlbC0+cl9hZGRlbmQpOwotCSAgICB9Ci0JICBnb3RvIGZpbmlzaF9wY3JlbDsKLQotCWNhc2UgUl9JQTY0X1BDUkVMMjFCSToKLQljYXNlIFJfSUE2NF9QQ1JFTDIxRjoKLQljYXNlIFJfSUE2NF9QQ1JFTDIxTToKLQkgIC8qID8/PyBUaGVzZSB0d28gYXJlIG9ubHkgdXNlZCBmb3Igc3BlY3VsYXRpb24gZml4dXAgY29kZS4KLQkgICAgIFRoZXkgc2hvdWxkIG5ldmVyIGJlIGR5bmFtaWMuICAqLwotCSAgaWYgKGR5bmFtaWNfc3ltYm9sX3ApCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBkeW5hbWljIHJlbG9jYXRpb24gYWdhaW5zdCBzcGVjdWxhdGlvbiBmaXh1cCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JICAgICAgcmV0X3ZhbCA9IGZhbHNlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAodW5kZWZfd2Vha19yZWYpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBzcGVjdWxhdGlvbiBmaXh1cCBhZ2FpbnN0IHVuZGVmaW5lZCB3ZWFrIHN5bWJvbCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JICAgICAgcmV0X3ZhbCA9IGZhbHNlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBnb3RvIGZpbmlzaF9wY3JlbDsKLQotCWNhc2UgUl9JQTY0X1BDUkVMMjFCOgotCWNhc2UgUl9JQTY0X1BDUkVMNjBCOgotCSAgLyogV2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhIFBMVCBlbnRyeSBmb3IgYW55IGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGR5bl9pID0gTlVMTDsKLQkgIGlmIChoKQotCSAgICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgTlVMTCwgTlVMTCwgZmFsc2UpOwotCi0JICBpZiAoZHluX2kgJiYgZHluX2ktPndhbnRfcGx0MikKLQkgICAgewotCSAgICAgIC8qIFNob3VsZCBoYXZlIGNhdWdodCB0aGlzIGVhcmxpZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHJlbC0+cl9hZGRlbmQgPT0gMCk7Ci0KLQkgICAgICB2YWx1ZSA9IChpYTY0X2luZm8tPnBsdF9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaWE2NF9pbmZvLT5wbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGR5bl9pLT5wbHQyX29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNpbmNlIHRoZXJlJ3Mgbm8gUExUIGVudHJ5LCBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMKLQkJIGxvY2FsbHkgZGVmaW5lZC4gICovCi0JICAgICAgQkZEX0FTU0VSVCAodW5kZWZfd2Vha19yZWYgfHwgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmX3dlYWssIHdlIHNob3VsZG4ndCBiZSB0cnlpbmcKLQkJIHRvIGNhbGwgaXQuICBUaGVyZSdzIGV2ZXJ5IGNoYW5jZSB0aGF0IHdlJ2Qgd2luZCB1cAotCQkgd2l0aCBhbiBvdXQtb2YtcmFuZ2UgZml4dXAgaGVyZS4gIERvbid0IGJvdGhlciBzZXR0aW5nCi0JCSBhbnkgdmFsdWUgYXQgYWxsLiAgKi8KLQkgICAgICBpZiAodW5kZWZfd2Vha19yZWYpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICBnb3RvIGZpbmlzaF9wY3JlbDsKLQotCWNhc2UgUl9JQTY0X1BDUkVMMjI6Ci0JY2FzZSBSX0lBNjRfUENSRUw2NEk6Ci0JZmluaXNoX3BjcmVsOgotCSAgLyogTWFrZSBwYy1yZWxhdGl2ZS4gICovCi0JICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIHJlbC0+cl9vZmZzZXQpICYgfiAoYmZkX3ZtYSkgMHgzOwotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9TRUdSRUwzMk1TQjoKLQljYXNlIFJfSUE2NF9TRUdSRUwzMkxTQjoKLQljYXNlIFJfSUE2NF9TRUdSRUw2NE1TQjoKLQljYXNlIFJfSUE2NF9TRUdSRUw2NExTQjoKLQkgIHsKLQkgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLQkgICAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0KLQkgICAgLyogRmluZCB0aGUgc2VnbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBvdXRwdXRfc2VjdGlvbi4gICovCi0JICAgIGZvciAobSA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnNlZ21lbnRfbWFwLAotCQkgICBwID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+cGhkcjsKLQkJIG0gIT0gTlVMTDsKLQkJIG0gPSBtLT5uZXh0LCBwKyspCi0JICAgICAgewotCQlpbnQgaTsKLQkJZm9yIChpID0gbS0+Y291bnQgLSAxOyBpID49IDA7IGktLSkKLQkJICBpZiAobS0+c2VjdGlvbnNbaV0gPT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24pCi0JCSAgICBicmVhazsKLQkJaWYgKGkgPj0gMCkKLQkJICBicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG0gPT0gTlVMTCkKLQkgICAgICB7Ci0JCS8qIElmIHRoZSBpbnB1dCBzZWN0aW9uIHdhcyBkaXNjYXJkZWQgZnJvbSB0aGUgb3V0cHV0LCB0aGVuCi0JCSAgIGRvIG5vdGhpbmcuICAqLwotCi0JCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uKSkKLQkJICByID0gYmZkX3JlbG9jX29rOwotCQllbHNlCi0JCSAgciA9IGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBUaGUgVk1BIG9mIHRoZSBzZWdtZW50IGlzIHRoZSB2YWRkciBvZiB0aGUgYXNzb2NpYXRlZAotCQkgICBwcm9ncmFtIGhlYWRlci4gICovCi0JCWlmICh2YWx1ZSA+IHAtPnBfdmFkZHIpCi0JCSAgdmFsdWUgLT0gcC0+cF92YWRkcjsKLQkJZWxzZQotCQkgIHZhbHVlID0gMDsKLQkJciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLAotCQkJCQkgICAgICByX3R5cGUpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFJfSUE2NF9TRUNSRUwzMk1TQjoKLQljYXNlIFJfSUE2NF9TRUNSRUwzMkxTQjoKLQljYXNlIFJfSUE2NF9TRUNSRUw2NE1TQjoKLQljYXNlIFJfSUE2NF9TRUNSRUw2NExTQjoKLQkgIC8qIE1ha2Ugb3V0cHV0LXNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKHZhbHVlID4gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKLQkgICAgdmFsdWUgLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSAwOwotCSAgciA9IGVsZjY0X2lhNjRfaW5zdGFsbF92YWx1ZSAob3V0cHV0X2JmZCwgaGl0X2FkZHIsIHZhbHVlLCByX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUE2NF9TRUdCQVNFOgotCi0JY2FzZSBSX0lBNjRfUkVMMzJNU0I6Ci0JY2FzZSBSX0lBNjRfUkVMMzJMU0I6Ci0JY2FzZSBSX0lBNjRfUkVMNjRNU0I6Ci0JY2FzZSBSX0lBNjRfUkVMNjRMU0I6Ci0KLQljYXNlIFJfSUE2NF9JUExUTVNCOgotCWNhc2UgUl9JQTY0X0lQTFRMU0I6Ci0JY2FzZSBSX0lBNjRfRVBMVE1TQjoKLQljYXNlIFJfSUE2NF9FUExUTFNCOgotCWNhc2UgUl9JQTY0X0NPUFk6Ci0KLQljYXNlIFJfSUE2NF9UUFJFTDIyOgotCWNhc2UgUl9JQTY0X1RQUkVMNjRNU0I6Ci0JY2FzZSBSX0lBNjRfVFBSRUw2NExTQjoKLQljYXNlIFJfSUE2NF9MVE9GRl9UUDIyOgotCWRlZmF1bHQ6Ci0JICByID0gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBnbG9iYWwgdGFibGUgcmVsYXRpdmUgcmVsb2NzIGlmCi0JICAgICBfX2dwIGlzIHVuZGVmaW5lZC4gIFRoaXMgaXMgYSBwYW5pYyBzaXR1YXRpb24gc28gd2UKLQkgICAgIGRvbid0IHRyeSB0byBjb250aW51ZS4gICovCi0JICAoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkgICAgKGluZm8sICJfX2dwIiwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCAxKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBpZiAoaCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQlzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCXN5bS0+c3RfbmFtZSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLQkgICAgICB9Ci0JICAgIGlmICghKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBfKCJ1bnN1cHBvcnRlZCByZWxvYyIpLAotCQkJCQkgICAgICBuYW1lLCBpbnB1dF9iZmQsCi0JCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgcmV0X3ZhbCA9IGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQlkZWZhdWx0OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJc3ltLT5zdF9uYW1lKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICgqbmFtZSA9PSAnXDAnKQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIH0KLQkgICAgaWYgKCEoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpIChpbmZvLCBuYW1lLAotCQkJCQkJICAgICBob3d0by0+bmFtZSwgMCwKLQkJCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgICByZWwtPnJfb2Zmc2V0KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHJldF92YWwgPSBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLSAgc3RydWN0IGVsZjY0X2lhNjRfZHluX3N5bV9pbmZvICpkeW5faTsKLQotICBpYTY0X2luZm8gPSBlbGY2NF9pYTY0X2hhc2hfdGFibGUgKGluZm8pOwotICBkeW5faSA9IGdldF9keW5fc3ltX2luZm8gKGlhNjRfaW5mbywgaCwgTlVMTCwgTlVMTCwgZmFsc2UpOwotCi0gIC8qIEZpbGwgaW4gdGhlIFBMVCBkYXRhLCBpZiByZXF1aXJlZC4gICovCi0gIGlmIChkeW5faSAmJiBkeW5faS0+d2FudF9wbHQpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotICAgICAgYmZkX2J5dGUgKmxvYzsKLSAgICAgIGFzZWN0aW9uICpwbHRfc2VjOwotICAgICAgYmZkX3ZtYSBwbHRfYWRkciwgcGx0b2ZmX2FkZHIsIGdwX3ZhbCwgaW5kZXg7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9SZWxhICpyZWw7Ci0KLSAgICAgIGdwX3ZhbCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWluaW1hbCBQTFQgZW50cnkuICAqLwotCi0gICAgICBpbmRleCA9IChkeW5faS0+cGx0X29mZnNldCAtIFBMVF9IRUFERVJfU0laRSkgLyBQTFRfTUlOX0VOVFJZX1NJWkU7Ci0gICAgICBwbHRfc2VjID0gaWE2NF9pbmZvLT5wbHRfc2VjOwotICAgICAgbG9jID0gcGx0X3NlYy0+Y29udGVudHMgKyBkeW5faS0+cGx0X29mZnNldDsKLQotICAgICAgbWVtY3B5IChsb2MsIHBsdF9taW5fZW50cnksIFBMVF9NSU5fRU5UUllfU0laRSk7Ci0gICAgICBlbGY2NF9pYTY0X2luc3RhbGxfdmFsdWUgKG91dHB1dF9iZmQsIGxvYywgaW5kZXgsIFJfSUE2NF9JTU0yMik7Ci0gICAgICBlbGY2NF9pYTY0X2luc3RhbGxfdmFsdWUgKG91dHB1dF9iZmQsIGxvYysyLCAtZHluX2ktPnBsdF9vZmZzZXQsCi0JCQkJUl9JQTY0X1BDUkVMMjFCKTsKLQotICAgICAgcGx0X2FkZHIgPSAocGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgcGx0X3NlYy0+b3V0cHV0X29mZnNldAotCQkgICsgZHluX2ktPnBsdF9vZmZzZXQpOwotICAgICAgcGx0b2ZmX2FkZHIgPSBzZXRfcGx0b2ZmX2VudHJ5IChvdXRwdXRfYmZkLCBpbmZvLCBkeW5faSwgcGx0X2FkZHIsIHRydWUpOwotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBGVUxMIFBMVCBlbnRyeSwgaWYgbmVlZGVkLiAgKi8KLSAgICAgIGlmIChkeW5faS0+d2FudF9wbHQyKQotCXsKLQkgIGxvYyA9IHBsdF9zZWMtPmNvbnRlbnRzICsgZHluX2ktPnBsdDJfb2Zmc2V0OwotCi0JICBtZW1jcHkgKGxvYywgcGx0X2Z1bGxfZW50cnksIFBMVF9GVUxMX0VOVFJZX1NJWkUpOwotCSAgZWxmNjRfaWE2NF9pbnN0YWxsX3ZhbHVlIChvdXRwdXRfYmZkLCBsb2MsIHBsdG9mZl9hZGRyIC0gZ3BfdmFsLAotCQkJCSAgICBSX0lBNjRfSU1NMjIpOwotCi0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluIHRoZQotCSAgICAgcGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgLyogPz8/IFdlIGRpZG4ndCByZWRlZmluZSBpdCBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wgaW4gdGhlCi0JICAgICBmaXJzdCBwbGFjZS4gIEJ1dCBwZXJoYXBzIGVsZmxpbmsuaCBkaWQgc29tZSBmb3IgdXMuICAqLwotCSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgZHluYW1pYyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCA9IHBsdG9mZl9hZGRyOwotICAgICAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX0lBNjRfSVBMVExTQik7Ci0gICAgICBlbHNlCi0Jb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9JQTY0X0lQTFRNU0IpOwotICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotICAgICAgLyogVGhpcyBpcyBmdW4uICBJbiB0aGUgLklBXzY0LnBsdG9mZiBzZWN0aW9uLCB3ZSd2ZSBnb3QgZW50cmllcwotCSB0aGF0IGNvcnJlc3BvbmQgYm90aCB0byByZWFsIFBMVCBlbnRyaWVzLCBhbmQgdGhvc2UgdGhhdAotCSBoYXBwZW5lZCB0byByZXNvbHZlIHRvIGxvY2FsIHN5bWJvbHMgYnV0IG5lZWQgdG8gYmUgY3JlYXRlZAotCSB0byBzYXRpc2Z5IEBwbHRvZmYgcmVsb2NhdGlvbnMuICBUaGUgLnJlbGEuSUFfNjQucGx0b2ZmCi0JIHJlbG9jYXRpb25zIGZvciB0aGUgcmVhbCBQTFQgc2hvdWxkIGNvbWUgYXQgdGhlIGVuZCBvZiB0aGUKLQkgc2VjdGlvbiwgc28gdGhhdCB0aGV5IGNhbiBiZSBpbmRleGVkIGJ5IHBsdCBlbnRyeSBhdCBydW50aW1lLgotCi0JIFdlIGVtaXR0ZWQgYWxsIG9mIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhlIG5vbi1QTFQgQHBsdG9mZgotCSBlbnRyaWVzIGR1cmluZyByZWxvY2F0ZV9zZWN0aW9uLiAgU28gd2UgY2FuIGNvbnNpZGVyIHRoZQotCSBleGlzdGluZyBzZWMtPnJlbG9jX2NvdW50IHRvIGJlIHRoZSBiYXNlIG9mIHRoZSBhcnJheSBvZgotCSBQTFQgcmVsb2NhdGlvbnMuICAqLwotCi0gICAgICByZWwgPSAoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKWlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMtPmNvbnRlbnRzOwotICAgICAgcmVsICs9IGlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLCByZWwgKyBpbmRleCk7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmNjRfaWE2NF9saW5rX2hhc2hfdGFibGUgKmlhNjRfaW5mbzsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgaWE2NF9pbmZvID0gZWxmNjRfaWE2NF9oYXNoX3RhYmxlIChpbmZvKTsKLSAgZHlub2JqID0gaWE2NF9pbmZvLT5yb290LmR5bm9iajsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgRWxmNjRfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0gICAgICBhc2VjdGlvbiAqc2R5biwgKnNnb3RwbHQ7Ci0gICAgICBiZmRfdm1hIGdwX3ZhbDsKLQotICAgICAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotICAgICAgc2dvdHBsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLSAgICAgIGR5bmNvbiA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0KLSAgICAgIGdwX3ZhbCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLQotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IGdwX3ZhbDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gKGlhNjRfaW5mby0+bWlucGx0X2VudHJpZXMKLQkJCQkqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIC8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSBpbiBmaW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gKGlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGlhNjRfaW5mby0+cmVsX3BsdG9mZl9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkrIChpYTY0X2luZm8tPnJlbF9wbHRvZmZfc2VjLT5yZWxvY19jb3VudAotCQkJCSAgICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfSUFfNjRfUExUX1JFU0VSVkU6Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSAoc2dvdHBsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc2dvdHBsdC0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogRG8gbm90IGhhdmUgUkVMQVNaIGluY2x1ZGUgSk1QUkVMLiAgVGhpcyBtYWtlcyB0aGluZ3MKLQkJIGVhc2llciBvbiBsZC5zby4gIFRoaXMgaXMgbm90IHdoYXQgdGhlIHJlc3Qgb2YgQkZEIHNldCB1cC4gKi8KLQkgICAgICBkeW4uZF91bi5kX3ZhbCAtPSAoaWE2NF9pbmZvLT5taW5wbHRfZW50cmllcwotCQkJCSAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfSU5JVDoKLQkgICAgY2FzZSBEVF9GSU5JOgotCSAgICAgIHsKLQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JCXN0cnVjdCBlbGY2NF9pYTY0X2R5bl9zeW1faW5mbyAqZHluX2k7Ci0JCWNvbnN0IGNoYXIgKndoaWNoOwotIAotCQlpZiAoZHluLmRfdGFnID09IERUX0lOSVQpCi0JCSAgd2hpY2ggPSBpbmZvLT5pbml0X2Z1bmN0aW9uOwotCQllbHNlCi0JCSAgd2hpY2ggPSBpbmZvLT5maW5pX2Z1bmN0aW9uOwotCi0JCWggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCB3aGljaCwKLQkJCQkJICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJZHluX2kgPSBnZXRfZHluX3N5bV9pbmZvIChpYTY0X2luZm8sIGgsIE5VTEwsIE5VTEwsIGZhbHNlKTsKLQkJZHluLmRfdW4uZF9wdHIgPSBzZXRfcGx0b2ZmX2VudHJ5IChhYmZkLCBpbmZvLCBkeW5faSwKLQkJCQkJCSAgIGR5bi5kX3VuLmRfcHRyLCAwKTsKLQkgICAgICB9Ci0JICAgIH0KLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAoYWJmZCwgJmR5biwgZHluY29uKTsKLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIFBMVDAgZW50cnkgKi8KLSAgICAgIGlmIChpYTY0X2luZm8tPnBsdF9zZWMpCi0JewotCSAgYmZkX2J5dGUgKmxvYyA9IGlhNjRfaW5mby0+cGx0X3NlYy0+Y29udGVudHM7Ci0JICBiZmRfdm1hIHBsdHJlczsKLQotCSAgbWVtY3B5IChsb2MsIHBsdF9oZWFkZXIsIFBMVF9IRUFERVJfU0laRSk7Ci0KLQkgIHBsdHJlcyA9IChzZ290cGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNnb3RwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgIC0gZ3BfdmFsKTsKLQotCSAgZWxmNjRfaWE2NF9pbnN0YWxsX3ZhbHVlIChhYmZkLCBsb2MrMSwgcGx0cmVzLCBSX0lBNjRfR1BSRUwyMik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVMRiBmaWxlIGZsYWcgaGFuZGxpbmc6ICovCi0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgSUEtNjQgc3BlY2lmaWMgZmlsZSBmbGFncy4gKi8KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfaWE2NF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCi0JCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKLQotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9pYTY0X21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0gIGJvb2xlYW4gb2sgPSB0cnVlOwotCi0gIC8qIERvbid0IGV2ZW4gcHJldGVuZCB0byBzdXBwb3J0IG1peGVkLWZvcm1hdCBsaW5raW5nLiAgKi8KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIHJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKLQkJCQkgICAgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfSUFfNjRfVFJBUE5JTCkgIT0gKG91dF9mbGFncyAmIEVGX0lBXzY0X1RSQVBOSUwpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyB0cmFwLW9uLU5VTEwtZGVyZWZlcmVuY2Ugd2l0aCBub24tdHJhcHBpbmcgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotICBpZiAoKGluX2ZsYWdzICYgRUZfSUFfNjRfQkUpICE9IChvdXRfZmxhZ3MgJiBFRl9JQV82NF9CRSkpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIGJpZy1lbmRpYW4gZmlsZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgIH0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0lBXzY0X0FCSTY0KSAhPSAob3V0X2ZsYWdzICYgRUZfSUFfNjRfQUJJNjQpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyA2NC1iaXQgZmlsZXMgd2l0aCAzMi1iaXQgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2lhNjRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIGZsYWd3b3JkIGZsYWdzID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3M7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICBmcHJpbnRmIChmaWxlLCAicHJpdmF0ZSBmbGFncyA9ICVzJXMlcyVzXG4iLAotCSAgIChmbGFncyAmIEVGX0lBXzY0X1RSQVBOSUwpID8gIlRSQVBOSUwsICIgOiAiIiwKLQkgICAoZmxhZ3MgJiBFRl9JQV82NF9FWFQpID8gIkVYVCwgIiA6ICIiLAotCSAgIChmbGFncyAmIEVGX0lBXzY0X0JFKSA/ICJCRSwgIiA6ICJMRSwgIiwKLQkgICAoZmxhZ3MgJiBFRl9JQV82NF9BQkk2NCkgPyAiQUJJNjQiIDogIkFCSTMyIik7Ci0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2lhNjRfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1pYTY0LWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmNjRfaWE2NF9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1pYTY0LWJpZyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9pYTY0Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0lBXzY0Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEJCTE5OTkJLyogRUFTMi4zICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIJCTE5OTgJLyogRUFTMi4yICovCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMDAJLyogNjRLQiAqLwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyIFwKLQllbGY2NF9pYTY0X3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMgXAotCWVsZjY0X2lhNjRfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sgXAotCWVsZjY0X2lhNjRfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFwKLQllbGY2NF9pYTY0X2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCBcCi0JZWxmNjRfaWE2NF9tb2RpZnlfc2VnbWVudF9tYXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gXAotCWVsZjY0X2lhNjRfaW5mb190b19ob3d0bwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotCWVsZjY0X2lhNjRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQllbGY2NF9pYTY0X2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uIFwKLQllbGY2NF9pYTY0X3JlbGF4X3NlY3Rpb24KLQotLyogU3R1ZmYgZm9yIHRoZSBCRkQgbGlua2VyOiAqLwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCWVsZjY0X2lhNjRfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCWVsZjY0X2lhNjRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzIFwKLQllbGY2NF9pYTY0X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCWVsZjY0X2lhNjRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JZWxmNjRfaWE2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0JZWxmNjRfaWE2NF9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JZWxmNjRfaWE2NF9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCWVsZjY0X2lhNjRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIFwKLQllbGY2NF9pYTY0X2ZpbmFsX2xpbmsKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JZWxmNjRfaWE2NF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQllbGY2NF9pYTY0X21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0JZWxmNjRfaWE2NF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotCWVsZjY0X2lhNjRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQJNQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0hFQURFUl9TSVpFCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AJMQotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzCQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sIGVsZjY0X2lhNjRfaGFzaF9jb3B5X2luZGlyZWN0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sCQllbGY2NF9pYTY0X2hhc2hfaGlkZV9zeW1ib2wKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LW1pcHMuYyBiL2JmZC9lbGY2NC1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzBkY2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOTAgKzAsMCBAQAotLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBMaW5rZXIgc3VwcG9ydCBhZGRlZCBieSBNYXJrIE1pdGNoZWxsLCBDb2RlU291cmNlcnksIExMQy4KLSAgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgVGhpcyBmaWxlCi0gICBvdmVycmlkZXMgdGhlIHVzdWFsIEVMRiByZWxvYyBoYW5kbGluZywgYW5kIGhhbmRsZXMgcmVhZGluZyBhbmQKLSAgIHdyaXRpbmcgdGhlIHJlbG9jYXRpb25zIGhlcmUuCi0KLSAgIFRoZSBNSVBTIDY0LWJpdCBFTEYgQUJJIGFsc28gdXNlcyBhbiB1bnVzdWFsIGFyY2hpdmUgbWFwIGZvcm1hdC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZSA2NC1iaXQgQUJJIGlzIG5vdCBzdXBwb3NlZCB0bwotICAgdXNlIEVDT0ZGLiAgSG93ZXZlciwgd2Ugc3VwcG9ydCBpdCBhbnlob3cgZm9yIGFuIGVhc2llciBjaGFuZ2VvdmVyLiAgKi8KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotLyogVGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgbWRlYnVnIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gYWxwaGEuaC4gICovCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotCi1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGxvbmcgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIHJlc2VydmUuICAqLwotI2RlZmluZSBNSVBTX1JFU0VSVkVEX0dPVE5PICgyKQotCi0vKiBUaGUgcmVsb2NhdGlvbiB0YWJsZSB1c2VkIGZvciBTSFRfUkVMIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICB7IDEzIH0sCi0gICAgeyAxNCB9LAotICAgIHsgMTUgfSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJzdHJhY3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTEEgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGFbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXN0IHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX3N5bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zeW0pOwotICBkc3QtPnJfc3N5bSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3NzeW0pOwotICBkc3QtPnJfdHlwZTMgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMyk7Ci0gIGRzdC0+cl90eXBlMiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUyKTsKLSAgZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbGEgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKLSAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKLSAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOwotICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7Ci0gIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBiZmRfaF9nZXRfc2lnbmVkXzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzY0IChhYmZkLCBzcmMtPnJfYWRkZW5kLCAoYmZkX2J5dGUgKikgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19pbiAoYWJmZCwgCi0JCQkgICAgKGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopIHNyYywKLQkJCSAgICAmbWlyZWwpOwotCi0gIGRzdFswXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbC5yX3N5bSwgbWlyZWwucl90eXBlKTsKLSAgZHN0WzFdLnJfb2Zmc2V0ID0gbWlyZWwucl9vZmZzZXQ7Ci0gIGRzdFsxXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKG1pcmVsLnJfc3N5bSwgbWlyZWwucl90eXBlMik7Ci0gIGRzdFsyXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMl0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChTVE5fVU5ERUYsIG1pcmVsLnJfdHlwZTMpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIAotCQkJICAgICAoY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIHNyYywKLQkJCSAgICAgJm1pcmVsYSk7Ci0KLSAgZHN0WzBdLnJfb2Zmc2V0ID0gbWlyZWxhLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbGEucl9zeW0sIG1pcmVsYS5yX3R5cGUpOwotICBkc3RbMF0ucl9hZGRlbmQgPSBtaXJlbGEucl9hZGRlbmQ7Ci0gIGRzdFsxXS5yX29mZnNldCA9IG1pcmVsYS5yX29mZnNldDsKLSAgZHN0WzFdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAobWlyZWxhLnJfc3N5bSwgbWlyZWxhLnJfdHlwZTIpOwotICBkc3RbMV0ucl9hZGRlbmQgPSAwOwotICBkc3RbMl0ucl9vZmZzZXQgPSBtaXJlbGEucl9vZmZzZXQ7Ci0gIGRzdFsyXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKFNUTl9VTkRFRiwgbWlyZWxhLnJfdHlwZTMpOwotICBkc3RbMl0ucl9hZGRlbmQgPSAwOwotfQotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIGJmZF9ieXRlICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcmVsLnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKLSAgbWlyZWwucl90eXBlID0gRUxGMzJfUl9UWVBFIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWwucl90eXBlMiA9IFJfTUlQU19OT05FOwotICBtaXJlbC5yX3NzeW0gPSBTVE5fVU5ERUY7Ci0gIG1pcmVsLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbWlyZWwsIAotCQkJICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikgZHN0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqc3JjOwotICAgICBiZmRfYnl0ZSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcmVsYS5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7Ci0gIG1pcmVsYS5yX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfYWRkZW5kID0gc3JjLT5yX2FkZGVuZDsKLSAgbWlyZWxhLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfdHlwZTIgPSBSX01JUFNfTk9ORTsKLSAgbWlyZWxhLnJfc3N5bSA9IFNUTl9VTkRFRjsKLSAgbWlyZWxhLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJm1pcmVsYSwgCi0JCQkgICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIGRzdCk7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NSVBTX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBpbnQgdjsKLQotCSAgdiA9IChpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWw7Ci0JICByZXR1cm4gJm1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW3ZdOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNpbmNlIGVhY2ggZW50cnkgaW4gYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAKLSAgIHRvIHRocmVlIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UuICAqLwotCi1zdGF0aWMgbG9uZwotbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFJlYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gb25lIHJlbG9jIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCByZWxfaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotewotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3RhYmxlOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpCi0JICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGNvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIGVudHNpemU7Ci0KLSAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCkpCi0gICAgaG93dG9fdGFibGUgPSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbDsKLSAgZWxzZQotICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhOwotCi0gIHJlbGVudCA9IHJlbGVudHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBib29sZWFuIHVzZWRfc3ltLCB1c2VkX3NzeW07Ci0gICAgICBpbnQgaXI7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSkKLQltaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLAotCQkJCSAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywKLQkJCQkgICAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgcmVsOwotCi0JICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsCi0JCQkJICAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLAotCQkJCSAgICAmcmVsKTsKLQkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7Ci0JICByZWxhLnJfc3ltID0gcmVsLnJfc3ltOwotCSAgcmVsYS5yX3NzeW0gPSByZWwucl9zc3ltOwotCSAgcmVsYS5yX3R5cGUzID0gcmVsLnJfdHlwZTM7Ci0JICByZWxhLnJfdHlwZTIgPSByZWwucl90eXBlMjsKLQkgIHJlbGEucl90eXBlID0gcmVsLnJfdHlwZTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogRWFjaCBlbnRyeSByZXByZXNlbnRzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgIHVzZWRfc3ltID0gZmFsc2U7Ci0gICAgICB1c2VkX3NzeW0gPSBmYWxzZTsKLSAgICAgIGZvciAoaXIgPSAwOyBpciA8IDM7IGlyKyspCi0JewotCSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIHR5cGU7Ci0KLQkgIHN3aXRjaCAoaXIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSAwOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUzOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09IFJfTUlQU19OT05FKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgcmVsb2NhdGlvbnMgaW4gdGhpcyBlbnRyeS4gIElmIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgdGhlIGZpcnN0IGVudHJ5LCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZHVtbXkKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciBrbm93cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZXJlIGhhcyBiZWVuIGEgYnJlYWsgaW4gdGhlIHNlcXVlbmNlIG9mIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFwcGx5aW5nIHRvIGEgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaXIgPT0gMCkKLQkJewotCQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkJICBlbHNlCi0JCSAgICByZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQkJICByZWxlbnQtPmFkZGVuZCA9IDA7Ci0JCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSBSX01JUFNfTk9ORV07Ci0JCSAgKytyZWxlbnQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBTb21lIHR5cGVzIHJlcXVpcmUgc3ltYm9scywgd2hlcmVhcyBzb21lIGRvIG5vdC4gICovCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX01JUFNfTk9ORToKLQkgICAgY2FzZSBSX01JUFNfTElURVJBTDoKLQkgICAgY2FzZSBSX01JUFNfSU5TRVJUX0E6Ci0JICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9COgotCSAgICBjYXNlIFJfTUlQU19ERUxFVEU6Ci0JICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgdXNlZF9zeW0pCi0JCXsKLQkJICBpZiAocmVsYS5yX3N5bSA9PSAwKQotCQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXN5bWJvbCAqKnBzLCAqczsKLQotCQkgICAgICBwcyA9IHN5bWJvbHMgKyByZWxhLnJfc3ltIC0gMTsKLQkJICAgICAgcyA9ICpwczsKLQkJICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkJICAgICAgZWxzZQotCQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCQkgICAgfQotCi0JCSAgdXNlZF9zeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoISB1c2VkX3NzeW0pCi0JCXsKLQkJICBzd2l0Y2ggKHJlbGEucl9zc3ltKQotCQkgICAgewotCQkgICAgY2FzZSBSU1NfVU5ERUY6Ci0JCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPQotCQkJYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIFJTU19HUDoKLQkJICAgIGNhc2UgUlNTX0dQMDoKLQkJICAgIGNhc2UgUlNTX0xPQzoKLQkJICAgICAgLyogRklYTUU6IEkgdGhpbmsgdGhlc2UgbmVlZCB0byBiZSBoYW5kbGVkIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCBob3d0byBzdHJ1Y3R1cmVzLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICB1c2VkX3NzeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4KLQkgICAgIG9iamVjdCBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvcgotCSAgICAgc2hhcmVkIGxpYnJhcnkuICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMKLQkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0KLQkgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLQotCSAgKytyZWxlbnQ7Ci0JfQotICAgIH0KLQotICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICBPbiBJcml4IDYsIHRoZXJlIGNhbiBiZSB0d28gcmVsb2Mgc2VjdGlvbnMKLSAgIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMCi0gICAgICB8fCAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgMyBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGVhY2ggUmVsIHN0cnVjdHVyZS4gICovCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICBhc2VjdC0+cmVsb2NfY291bnQgKiAzICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHNsdXJwX29uZV9yZWxvY190YWJsZSByb3V0aW5lIGluY3JlbWVudHMgcmVsb2NfY291bnQuICAqLwotICBhc2VjdC0+cmVsb2NfY291bnQgPSAwOwotCi0gIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgJmQtPnJlbF9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGQtPnJlbF9oZHIyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLAotCQkJCQkgICAgICBkLT5yZWxfaGRyMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZXh0X3JlbGE7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGNhbiBjb21iaW5lIHVwIHRvIHRocmVlIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgaWYgdGhlIGxhdHRlciByZWxvY3MgaGF2ZSBubyBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gIGNvdW50ID0gMDsKLSAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgKytjb3VudDsKLQotICAgICAgYWRkciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XS0+YWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IGFkZHIKLQkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KLQotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBjb3VudDsKLSAgcmVsYV9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxhX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxhX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqZmFpbGVkcCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4dF9yZWxhID0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyssIGV4dF9yZWxhKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcHRyOwotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIGludF9yZWxhOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgaW50IG47Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotICAgICAgZWxzZQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLSAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQluID0gbGFzdF9zeW1faWR4OwotICAgICAgZWxzZQotCXsKLQkgIGxhc3Rfc3ltID0gc3ltOwotCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgaWYgKG4gPCAwKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbGFzdF9zeW1faWR4ID0gbjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfc3ltID0gbjsKLQotICAgICAgaW50X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKLQotICAgICAgaW50X3JlbGEucl9zc3ltID0gUlNTX1VOREVGOwotCi0gICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCi0JICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCXsKLQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfdHlwZSA9IHB0ci0+aG93dG8tPnR5cGU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUyID0gKGludCkgUl9NSVBTX05PTkU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUzID0gKGludCkgUl9NSVBTX05PTkU7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IHB0ci0+YWRkcmVzcwotCSAgICAgIHx8ICEgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKLQkgICAgICB8fCAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgIT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIFdlIGNhbiBtZXJnZSB0aGUgcmVsb2MgYXQgSURYICsgMSB3aXRoIHRoZSByZWxvYyBhdCBJRFguICAqLwotCi0JICBpZiAoaSA9PSAwKQotCSAgICBpbnRfcmVsYS5yX3R5cGUyID0gci0+aG93dG8tPnR5cGU7Ci0JICBlbHNlCi0JICAgIGludF9yZWxhLnJfdHlwZTMgPSByLT5ob3d0by0+dHlwZTsKLQotCSAgKytpZHg7Ci0JfQotCi0gICAgICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmludF9yZWxhLCBleHRfcmVsYSk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGV4dF9yZWxhIC0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHMKLQkgICAgICA9PSBjb3VudCk7Ci19Ci0MCi0vKiBJcml4IDYgZGVmaW5lcyBhIGJyYW5kIG5ldyBhcmNoaXZlIG1hcCBmb3JtYXQsIHNvIHRoYXQgdGhleSBjYW4KLSAgIGhhdmUgYXJjaGl2ZXMgbW9yZSB0aGFuIDQgR0IgaW4gc2l6ZS4gICovCi0KLS8qIFJlYWQgYW4gSXJpeCA2IGFybWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgZmlsZV9wdHIgYXJoZHJwb3M7Ci0gIGJmZF9zaXplX3R5cGUgaSwgcGFyc2VkX3NpemUsIG5zeW16LCBzdHJpbmdzaXplLCBjYXJzeW1fc2l6ZSwgcHRyc2l6ZTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX2J5dGUgaW50X2J1Zls4XTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgYmZkX2J5dGUgKnJhd19hcm1hcCA9IE5VTEw7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSBOVUxMOwotCi0gIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgZWxlbWVudC4gICovCi0gIGFyaGRycG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFyY2hpdmVzIHdpdGggdHJhZGl0aW9uYWwgYXJtYXBzIGFyZSBzdGlsbCBwZXJtaXR0ZWQuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpID09IDApCi0gICAgcmV0dXJuIGJmZF9zbHVycF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiL1NZTTY0LyAgICAgICAgICIsIDE2KSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLQotICBpZiAoYmZkX3JlYWQgKGludF9idWYsIDEsIDgsIGFiZmQpICE9IDgpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG5zeW16ID0gYmZkX2dldGI2NCAoaW50X2J1Zik7Ci0gIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtIDggKiBuc3lteiAtIDg7Ci0KLSAgY2Fyc3ltX3NpemUgPSBuc3lteiAqIHNpemVvZiAoY2Fyc3ltKTsKLSAgcHRyc2l6ZSA9IDggKiBuc3ltejsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAocmF3X2FybWFwLCAxLCBwdHJzaXplLCBhYmZkKSAhPSBwdHJzaXplCi0gICAgICB8fCBiZmRfcmVhZCAoc3RyaW5nYmFzZSwgMSwgc3RyaW5nc2l6ZSwgYWJmZCkgIT0gc3RyaW5nc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXo7IGkrKykKLSAgICB7Ci0gICAgICBjYXJzeW1zLT5maWxlX29mZnNldCA9IGJmZF9nZXRiNjQgKHJhd19hcm1hcCArIGkgKiA4KTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgICsrY2Fyc3ltczsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gJ1wwJzsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGFyaGRycG9zICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIHBhcnNlZF9zaXplOwotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmF3X2FybWFwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhd19hcm1hcCk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYXJkYXRhLT5zeW1kZWZzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gSXJpeCA2IGFybWFwLiAgVGhlIElyaXggNiB0b29scyBhcmUgc3VwcG9zZWQgdG8gYmUKLSAgIGFibGUgdG8gaGFuZGxlIG9yZGluYXJ5IEVMRiBhcm1hcHMsIGJ1dCBhdCBsZWFzdCBvbiBJcml4IDYuMiB0aGUKLSAgIGxpbmtlciBjcmFzaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgc3ltYm9sX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogOCkgKyA4OwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKLSAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBwYWRkaW5nOwotICBiZmRfYnl0ZSBidWZbOF07Ci0KLSAgcGFkZGluZyA9IEJGRF9BTElHTiAobWFwc2l6ZSwgOCkgLSBtYXBzaXplOwotICBtYXBzaXplICs9IHBhZGRpbmc7Ci0KLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KLSAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQotCQkJICAgICArIGVsZW5ndGgKLQkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICsgU0FSTUFHKTsKLQotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHN0cmNweSAoaGRyLmFyX25hbWUsICIvU1lNNjQvIik7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dGI2NCAoc3ltYm9sX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFyY2gpICE9IDgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KLSAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAotICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLwotCi0gIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQotICAgIHsKLSAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAotCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCi0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQotCXsKLQkgIGJmZF9wdXRiNjQgKGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCi0JCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgLyogcmVtZW1iZXIgYWJvdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgcGFkZGVkIHRvIGFuIDggYnl0ZSBib3VuZGFyeS4KLSAgICAgSG93ZXZlciwgdGhlIElyaXggNi4yIHRvb2xzIGRvIG5vdCBhcHBlYXIgdG8gZG8gdGhpcy4gICovCi0gIHdoaWxlIChwYWRkaW5nICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1wYWRkaW5nOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAgPQotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbWFnaWNTeW0yLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDgsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0vKiBSZWxvY2F0aW9ucyBpbiB0aGUgNjQgYml0IE1JUFMgRUxGIEFCSSBhcmUgbW9yZSBjb21wbGV4IHRoYW4gaW4KLSAgIHN0YW5kYXJkIEVMRi4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVkaXJlY3QgdGhlIHJlbG9jYXRpb24KLSAgIGhhbmRsaW5nIHJvdXRpbmVzLiAgKi8KLQotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gbWlwc19lbGY2NF9zaXplX2luZm8gPQotewotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIDQsICAgICAgICAgICAgLyogaGFzaC10YWJsZSBlbnRyeSBzaXplICovCi0gIDMsICAgICAgICAgICAgLyogaW50ZXJuYWwgcmVsb2NhdGlvbnMgcGVyIGV4dGVybmFsIHJlbG9jYXRpb25zICovCi0gIDY0LAkJLyogYXJjaF9zaXplICovCi0gIDgsCQkvKiBmaWxlX2FsaWduICovCi0gIEVMRkNMQVNTNjQsCi0gIEVWX0NVUlJFTlQsCi0gIGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMsCi0gIGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgbWlwc19lbGY2NF93cml0ZV9yZWxvY3MsCi0gIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQsCi0gIG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0LAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjY0LWxpdHRsZW1pcHMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ21pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1iaWdtaXBzIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUwotCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QJCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8JCW1pcHNfZWxmNjRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlfYmZkX21pcHNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAlfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJJm1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwlfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICBfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlfYmZkX21pcHNfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgICAgICAgMQotCi0vKiBXZSBkb24ndCBzZXQgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJlY2F1c2UgdGhlIDMyLWJpdCAKLSAgIE1JUFMtc3BlY2lmaWMgZnVuY3Rpb24gb25seSBhcHBsaWVzIHRvIElSSVg1LCB3aGljaCBoYWQgbm8gNjQtYml0Ci0gICBBQkkuICAqLwotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rCV9iZmRfbWlwc19lbGZfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCBtaXBzX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZnVuY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2FybWFwCW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3dyaXRlX2FybWFwCW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfcmVhZF9hcl9oZHIJX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LXNwYXJjLmMgYi9iZmQvZWxmNjQtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyZTdjMS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMjIgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0KLS8qIFRoaXMgaXMgZGVmaW5lZCBpZiBvbmUgd2FudHMgdG8gYnVpbGQgdXB3YXJkIGNvbXBhdGlibGUgYmluYXJpZXMKLSAgIHdpdGggdGhlIG9yaWdpbmFsIHNwYXJjNjQtZWxmIHRvb2xjaGFpbi4gIFRoZSBzdXBwb3J0IGlzIGtlcHQgaW4gZm9yCi0gICBub3cgYnV0IGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIGRqZSA5NzA5MzAgICovCi0vKiNkZWZpbmUgU1BBUkM2NF9PTERfUkVMT0NTKi8KLQotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlLiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FICh+IChiZmRfdm1hKSAwKQotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBzcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2J1aWxkX3BsdAotICBQQVJBTVMoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldAotICBQQVJBTVMoKGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQKLSAgUEFSQU1TKChpbnQsIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKLQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IHNwYXJjNjRfZWxmX2dldF9zeW1ib2xfdHlwZQotICBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotICAgICAgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNwYXJjNjRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGxvbmcgc3BhcmM2NF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBsb25nIHNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9oaXgyMl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2xveDEwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qIFRoZXNlIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuICAqLwotICBIT1dUTyhSX1NQQVJDX1BMVDMyLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0xPUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMzIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2VuZGlmCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19PTE8xMCIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hIMjIsICAgICA0MiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgMzIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hIMjIsICA0MiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgMzIsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQNjQsICAgIDAsNCw2NCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A2NCIsICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUNjQsICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQ2NCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVgyMiwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9oaXgyMl9yZWxvYywgICJSX1NQQVJDX0hJWDIyIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0xPWDEwLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX2xveDEwX3JlbG9jLCAgIlJfU1BBUkNfTE9YMTAiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfSDQ0LCAgICAgIDIyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19INDQiLCAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19NNDQsICAgICAgMTIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX000NCIsICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0w0NCwgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTDQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMGZmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVHSVNURVIsICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19SRUdJU1RFUiIsZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUE2NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSkKLX07Ci0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0RJU1A2NCwgUl9TUEFSQ19ESVNQNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BMVDY0LCBSX1NQQVJDX1BMVDY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISVgyMiwgUl9TUEFSQ19ISVgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE9YMTAsIFJfU1BBUkNfTE9YMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0g0NCwgUl9TUEFSQ19INDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX000NCwgUl9TUEFSQ19NNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0w0NCwgUl9TUEFSQ19MNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSLCBSX1NQQVJDX1JFR0lTVEVSfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEY2NF9SX1RZUEVfSUQgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4X3N0ZCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbRUxGNjRfUl9UWVBFX0lEIChkc3QtPnJfaW5mbyldOwotfQotDAotLyogRHVlIHRvIHRoZSB3YXkgaG93IHdlIGhhbmRsZSBSX1NQQVJDX09MTzEwLCBlYWNoIGVudHJ5IGluIGEgU0hUX1JFTEEKLSAgIHNlY3Rpb24gY2FuIHJlcHJlc2VudCB1cCB0byB0d28gcmVsb2NzLCB3ZSBtdXN0IHRlbGwgdGhlIHVzZXIgdG8gYWxsb2NhdGUKLSAgIG1vcmUgc3BhY2UuICAqLwotICAgCi1zdGF0aWMgbG9uZwotc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAyICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBsb25nCi1zcGFyYzY0X2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpICogMjsKLX0KLQotLyogUmVhZCAgcmVsb2NhdGlvbnMgZm9yIEFTRUNUIGZyb20gUkVMX0hEUi4gIFRoZXJlIGFyZSBSRUxPQ19DT1VOVCBvZiAKLSAgIHRoZW0uICBXZSBjYW5ub3QgdXNlIGdlbmVyaWMgZWxmIHJvdXRpbmVzIGZvciB0aGlzLCAgYmVjYXVzZSBSX1NQQVJDX09MTzEwCi0gICBoYXMgc2Vjb25kYXJ5IGFkZGVuZCBpbiBFTEY2NF9SX1RZUEVfREFUQS4gIFdlIGhhbmRsZSBpdCBhcyB0d28gcmVsb2NhdGlvbnMKLSAgIGZvciB0aGUgc2FtZSBsb2NhdGlvbiwgIFJfU1BBUkNfTE8xMCBhbmQgUl9TUEFSQ18xMy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCByZWxfaGRyLCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0KLSAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpOwotICAKLSAgY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gZW50c2l6ZTsKLQotICBmb3IgKGkgPSAwLCByZWxlbnQgPSByZWxlbnRzOyBpIDwgY291bnQ7Ci0gICAgICAgaSsrLCByZWxlbnQrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywgJnJlbGEpOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIG5vcm1hbCBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUsCi0JIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGR5bmFtaWMgcmVsb2MgaXMgYWJzb2x1dGUuLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAgfHwgZHluYW1pYykKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0gICAgICBpZiAoRUxGNjRfUl9TWU0gKHJlbGEucl9pbmZvKSA9PSAwKQotCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc3ltYm9sICoqcHMsICpzOwotCi0JICBwcyA9IHN5bWJvbHMgKyBFTEY2NF9SX1NZTSAocmVsYS5yX2luZm8pIC0gMTsKLQkgIHMgPSAqcHM7Ci0KLQkgIC8qIENhbm9uaWNhbGl6ZSBFTEYgc2VjdGlvbiBzeW1ib2xzLiAgRklYTUU6IFdoeT8gICovCi0JICBpZiAoKHMtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoRUxGNjRfUl9UWVBFX0lEIChyZWxhLnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heF9zdGQpOwotICAgICAgaWYgKEVMRjY0X1JfVFlQRV9JRCAocmVsYS5yX2luZm8pID09IFJfU1BBUkNfT0xPMTApCi0JewotCSAgcmVsZW50LT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtSX1NQQVJDX0xPMTBdOwotCSAgcmVsZW50WzFdLmFkZHJlc3MgPSByZWxlbnQtPmFkZHJlc3M7Ci0JICByZWxlbnQrKzsKLQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbGVudC0+YWRkZW5kID0gRUxGNjRfUl9UWVBFX0RBVEEgKHJlbGEucl9pbmZvKTsKLQkgIHJlbGVudC0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbUl9TUEFSQ18xM107Ci0JfQotICAgICAgZWxzZQotCXJlbGVudC0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbRUxGNjRfUl9UWVBFX0lEIChyZWxhLnJfaW5mbyldOwotICAgIH0KLQotICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqIGNvbnN0IGQgPSBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+cmVsX2hkcjsKLSAgICAgIHJlbF9oZHIyID0gZC0+cmVsX2hkcjI7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyLT5zaF9vZmZzZXQKLQkJICB8fCAocmVsX2hkcjIgJiYgYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHIyLT5zaF9vZmZzZXQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgQVNFQ1QtPlJFTE9DX0NPVU5UIHRlbmRzIG5vdCB0byBiZSBhY2N1cmF0ZSBpbiB0aGlzCi0JIGNhc2UgYmVjYXVzZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoaXMgc2VjdGlvbiBtYXkgdXNlIHRoZQotCSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYW5kIGluIHRoYXQgY2FzZSBiZmRfc2VjdGlvbl9mcm9tX3NoZHIKLQkgaW4gZWxmLmMgZG9lcyBub3QgdXBkYXRlIHRoZSBSRUxPQ19DT1VOVC4gICovCi0gICAgICBpZiAoYXNlY3QtPl9yYXdfc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnRoaXNfaGRyOwotICAgICAgYXNlY3QtPnJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IE5VTEw7Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopIAotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCAKLQkJCQkgIGFzZWN0LT5yZWxvY19jb3VudCAqIDIgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIHJvdXRpbmUgaW5jcmVtZW50cyByZWxvY19jb3VudC4gICovCi0gIGFzZWN0LT5yZWxvY19jb3VudCA9IDA7Ci0gICAgCi0gIGlmICghc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgc3ltYm9scywKLQkJCQkJICBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAocmVsX2hkcjIgCi0gICAgICAmJiAhc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgcmVsX2hkcjIsIHN5bWJvbHMsCi0JCQkJCSAgICAgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIHJldHVybgotICAgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXMgYSBzaW5nbGUgYmxvY2ssIGFsdGhvdWdoIHRoZXkgYXJlCi0gICBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggcGFydGljdWxhciBzZWN0aW9uczsgdGhlIGludGVyZmFjZSwgd2hpY2gKLSAgIHdhcyBkZXNpZ25lZCBmb3IgU3VuT1Mgc3R5bGUgc2hhcmVkIGxpYnJhcmllcywgZXhwZWN0cyB0aGF0IHRoZXJlCi0gICBpcyBvbmx5IG9uZSBzZXQgb2YgZHluYW1pYyByZWxvY3MuICBBbnkgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseQotICAgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZSBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYwotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBsb25nCi1zcGFyYzY0X2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIHJldDsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkgICYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0JewotCSAgYXJlbGVudCAqcDsKLQkgIGxvbmcgY291bnQsIGk7Ci0KLQkgIGlmICghIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzLCBzeW1zLCB0cnVlKSkKLQkgICAgcmV0dXJuIC0xOwotCSAgY291bnQgPSBzLT5yZWxvY19jb3VudDsKLQkgIHAgPSBzLT5yZWxvY2F0aW9uOwotCSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JICAgICpzdG9yYWdlKysgPSBwKys7Ci0JICByZXQgKz0gY291bnQ7Ci0JfQotICAgIH0KLQotICAqc3RvcmFnZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZjY0X0V4dGVybmFsX1JlbGEgKm91dGJvdW5kX3JlbG9jYXMsICpzcmNfcmVsYTsKLSAgdW5zaWduZWQgaW50IGlkeCwgY291bnQ7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGNhbiBjb21iaW5lIHR3byByZWxvY3MgdGhhdCByZWZlciB0byB0aGUgc2FtZSBhZGRyZXNzCi0gICAgIGludG8gUl9TUEFSQ19PTE8xMCBpZiBmaXJzdCBvbmUgaXMgUl9TUEFSQ19MTzEwIGFuZCB0aGUKLSAgICAgbGF0dGVyIGlzIFJfU1BBUkNfMTMgd2l0aCBubyBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gIGNvdW50ID0gMDsKLSAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0KLSAgICAgICsrY291bnQ7Ci0KLSAgICAgIGFkZHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF0tPmFkZHJlc3M7Ci0gICAgICBpZiAoc2VjLT5vcmVsb2NhdGlvbltpZHhdLT5ob3d0by0+dHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkgICYmIGlkeCA8IHNlYy0+cmVsb2NfY291bnQgLSAxKQotCXsKLQkgIGFyZWxlbnQgKnIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeCArIDFdOwotCi0JICBpZiAoci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ18xMwotCSAgICAgICYmIHItPmFkZHJlc3MgPT0gYWRkcgotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IDApCi0JICAgICsraWR4OwotCX0KLSAgICB9Ci0KLSAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkcjsKLQotICByZWxhX2hkci0+c2hfc2l6ZSA9IHJlbGFfaGRyLT5zaF9lbnRzaXplICogY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlbG9jYXRpb25zIGFyZSBSRUxBIG9yIFJFTCByZWxvY2F0aW9ucy4gICovCi0gIGlmIChyZWxhX2hkci0+c2hfdHlwZSAhPSBTSFRfUkVMQSkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBvcmVsb2NhdGlvbiBoYXMgdGhlIGRhdGEsIHJlbG9jX2NvdW50IGhhcyB0aGUgY291bnQuLi4gKi8KLSAgb3V0Ym91bmRfcmVsb2NhcyA9IChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLSAgc3JjX3JlbGEgPSBvdXRib3VuZF9yZWxvY2FzOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgZHN0X3JlbGE7Ci0gICAgICBhcmVsZW50ICpwdHI7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBpbnQgbjsKLQotICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCWRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotICAgICAgZWxzZQotCWRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLSAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQluID0gbGFzdF9zeW1faWR4OwotICAgICAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIHN5bS0+dmFsdWUgPT0gMCkKLQluID0gU1ROX1VOREVGOwotICAgICAgZWxzZQotCXsKLQkgIGxhc3Rfc3ltID0gc3ltOwotCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgaWYgKG4gPCAwKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbGFzdF9zeW1faWR4ID0gbjsKLQl9Ci0KLSAgICAgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQl7Ci0JICAqZmFpbGVkcCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAocHRyLT5ob3d0by0+dHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkgICYmIGlkeCA8IHNlYy0+cmVsb2NfY291bnQgLSAxKQotCXsKLQkgIGFyZWxlbnQgKnIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeCArIDFdOwotCi0JICBpZiAoci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ18xMwotCSAgICAgICYmIHItPmFkZHJlc3MgPT0gcHRyLT5hZGRyZXNzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKLQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgPT0gMCkKLQkgICAgewotCSAgICAgIGlkeCsrOwotCSAgICAgIGRzdF9yZWxhLnJfaW5mbwotCQk9IEVMRjY0X1JfSU5GTyAobiwgRUxGNjRfUl9UWVBFX0lORk8gKHItPmFkZGVuZCwKLQkJCQkJCSAgICAgIFJfU1BBUkNfT0xPMTApKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkc3RfcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKG4sIFJfU1BBUkNfTE8xMCk7Ci0JfQotICAgICAgZWxzZQotCWRzdF9yZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLSAgICAgIGRzdF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7Ci0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmZHN0X3JlbGEsIHNyY19yZWxhKTsKLSAgICAgICsrc3JjX3JlbGE7Ci0gICAgfQotfQotDAotLyogU3BhcmM2NCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZwotewotICB1bnNpZ25lZCBjaGFyIGJpbmQ7Ci0gIHVuc2lnbmVkIHNob3J0IHNobmR4OwotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgYXBwX3JlZ3MgWzRdOwotfTsKLQotLyogR2V0IHRoZSBTcGFyYzY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgc3BhcmM2NF9lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLSAgCi0vKiBDcmVhdGUgYSBTcGFyYzY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1zcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotDAotLyogVXRpbGl0eSBmb3IgcGVyZm9ybWluZyB0aGUgc3RhbmRhcmQgaW5pdGlhbCB3b3JrIG9mIGFuIGluc3RydWN0aW9uCi0gICByZWxvY2F0aW9uLgotICAgKlBSRUxPQ0FUSU9OIHdpbGwgY29udGFpbiB0aGUgcmVsb2NhdGVkIGl0ZW0uCi0gICAqUElOU04gd2lsbCBjb250YWluIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICBJZiB0aGUgcmVzdWx0IGlzIGBiZmRfcmVsb2Nfb3RoZXInIHRoZSBjYWxsZXIgY2FuIGNvbnRpbnVlIHdpdGgKLSAgIHBlcmZvcm1pbmcgdGhlIHJlbG9jYXRpb24uICBPdGhlcndpc2UgaXQgbXVzdCBzdG9wIGFuZCByZXR1cm4gdGhlCi0gICB2YWx1ZSB0byBpdHMgY2FsbGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaW5pdF9pbnNuX3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBwcmVsb2NhdGlvbiwKLQkJIHBpbnNuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmRfdm1hICpwcmVsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSAqcGluc247Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogVGhpcyB3b3JrcyBiZWNhdXNlIHBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT52YWx1ZQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gICpwcmVsb2NhdGlvbiA9IHJlbG9jYXRpb247Ci0gICpwaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotfQotCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cF9yZWxvYyAoYWJmZCwKLQkJCXJlbG9jX2VudHJ5LAotCQkJc3ltYm9sLAotCQkJZGF0YSwKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDMwM2ZmZikgfCAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJCSAgICAgICB8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBIYW5kbGUgdGhlIEhJWDIyIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX2hpeDIyX3JlbG9jIChhYmZkLAotCQkgICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgICBzeW1ib2wsCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICByZWxvY2F0aW9uIF49IE1JTlVTX09ORTsKLSAgaW5zbiA9IChpbnNuICYgfjB4M2ZmZmZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMCkgJiAweDNmZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4ZmZmZmZmZmYpICE9IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTE9YMTAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbG94MTBfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDFmZmYpIHwgMHgxYzAwIHwgKHJlbG9jYXRpb24gJiAweDNmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBQTFQvR09UIHN0dWZmICovCi0KLS8qIEJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBlbnRyaWVzIGFyZSBpY2FjaGUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFCQkzMgotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSg0ICogUExUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExBUkdFX1BMVF9USFJFU0hPTEQJMzI3NjgKLSNkZWZpbmUgR09UX1JFU0VSVkVEX0VOVFJJRVMJMQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9zcGFyY3Y5L2xkLnNvLjEiCi0KLQotLyogRmlsbCBpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX2J1aWxkX3BsdCAob3V0cHV0X2JmZCwgY29udGVudHMsIG5lbnRyaWVzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICAgICBpbnQgbmVudHJpZXM7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBub3AgPSAweDAxMDAwMDAwOwotICBpbnQgaSwgajsKLSAgCi0gIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgYXJlIGluaXRpYWxseSB1bmRlZmluZWQuCi0gICAgIFdlIGZpbGwgdGhlbSB3aXRoIGBpbGx0cmFwIDAnIHRvIGZvcmNlIGxkLnNvIHRvIGRvIHNvbWV0aGluZy4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IFBMVF9IRUFERVJfU0laRS80OyArK2kpCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgY29udGVudHMraSo0KTsKLQotICAvKiBUaGUgZmlyc3QgMzI3NjggZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIHBsdDEgdG8gZ2V0IHRoZXJlIHZpYQotICAgICBhIHN0cmFpZ2h0IGJyYW5jaC4gICovCi0KLSAgZm9yIChpID0gNDsgaSA8IExBUkdFX1BMVF9USFJFU0hPTEQgJiYgaSA8IG5lbnRyaWVzOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZW50cnkgPSBjb250ZW50cyArIGkgKiBQTFRfRU5UUllfU0laRTsKLSAgICAgIHVuc2lnbmVkIGludCBzZXRoaSwgYmE7Ci0KLSAgICAgIC8qIHNldGhpICguIC0gcGx0MCksICVnMSAqLwotICAgICAgc2V0aGkgPSAweDAzMDAwMDAwIHwgKGkgKiBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIGJhLGEscHQgJXhjYywgcGx0MSAqLwotICAgICAgYmEgPSAweDMwNjgwMDAwIHwgKCgoY29udGVudHMrUExUX0VOVFJZX1NJWkUpIC0gKGVudHJ5KzQpKSAvIDQgJiAweDdmZmZmKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc2V0aGksIGVudHJ5KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGJhLCBlbnRyeSs0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzEyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTYpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyMCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjgpOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRyaWNreSBiaXQuICBFbnRyaWVzIDMyNzY4IGFuZCBoaWdoZXIgYXJlIGdyb3VwZWQgaW4gYmxvY2tzIG9mCi0gICAgIDE2MDogMTYwIGVudHJpZXMgYW5kIDE2MCBwb2ludGVycy4gIFRoaXMgaXMgdG8gc2VwYXJhdGUgY29kZSBmcm9tIGRhdGEsCi0gICAgIHdoaWNoIGlzIG11Y2ggZnJpZW5kbGllciBvbiB0aGUgY2FjaGUuICAqLwotICAKLSAgZm9yICg7IGkgPCBuZW50cmllczsgaSArPSAxNjApCi0gICAgewotICAgICAgaW50IGJsb2NrID0gKGkgKyAxNjAgPD0gbmVudHJpZXMgPyAxNjAgOiBuZW50cmllcyAtIGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrOyArK2opCi0JewotCSAgdW5zaWduZWQgY2hhciAqZW50cnksICpwdHI7Ci0JICB1bnNpZ25lZCBpbnQgbGR4OwotCi0JICBlbnRyeSA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGoqNCo2OwotCSAgcHRyID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgYmxvY2sqNCo2ICsgaio4OwotCi0JICAvKiBsZHggWyVvNyArIHB0ciAtIGVudHJ5KzRdLCAlZzEgKi8KLQkgIGxkeCA9IDB4YzI1YmUwMDAgfCAoKHB0ciAtIGVudHJ5KzQpICYgMHgxZmZmKTsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4YTEwMDAwZiwgZW50cnkpOyAgICAvKiBtb3YgJW83LCVnNSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0MDAwMDAwMiwgZW50cnkrNCk7ICAvKiBjYWxsIC4rOCAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsgICAgICAgICAvKiBub3AgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxkeCwgZW50cnkrMTIpOyAgICAgICAgLyogbGR4IFslbzcrUF0sJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDgzYzNjMDAxLCBlbnRyeSsxNik7IC8qIGptcGwgJW83KyVnMSwlZzEgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OWUxMDAwMDUsIGVudHJ5KzIwKTsgLyogbW92ICVnNSwlbzcgKi8KLQotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgY29udGVudHMgLSAoZW50cnkrNCksIHB0cik7Ci0JfQotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgYSBwYXJ0aWN1bGFyIHBsdCBlbnRyeSB3aXRoaW4gdGhlIC5wbHQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1zcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChpbmRleCkKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgYmxvY2ssIG9mczsKLQotICBpZiAoaW5kZXggPCBMQVJHRV9QTFRfVEhSRVNIT0xEKQotICAgIHJldHVybiBpbmRleCAqIFBMVF9FTlRSWV9TSVpFOwotCi0gIC8qIFNlZSBhYm92ZSBmb3IgZGV0YWlscy4gICovCi0KLSAgYmxvY2sgPSAoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAvIDE2MDsKLSAgb2ZzID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgJSAxNjA7Ci0KLSAgcmV0dXJuICgoYmZkX3ZtYSkoTEFSR0VfUExUX1RIUkVTSE9MRCArIGJsb2NrKjE2MCkgKiBQTFRfRU5UUllfU0laRQotCSAgKyBvZnMgKiA2KjQpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGluZGV4LCBtYXgpCi0gICAgIGludCBpbmRleCwgbWF4OwotewotICBpbnQgYmxvY2ssIG9mcywgbGFzdDsKLQotICBCRkRfQVNTRVJUKGluZGV4ID49IExBUkdFX1BMVF9USFJFU0hPTEQpOwotCi0gIC8qIFNlZSBhYm92ZSBmb3IgZGV0YWlscy4gICovCi0KLSAgYmxvY2sgPSAoKChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpIC8gMTYwKSAqIDE2MCkKLQkgICsgTEFSR0VfUExUX1RIUkVTSE9MRDsKLSAgb2ZzID0gaW5kZXggLSBibG9jazsKLSAgaWYgKGJsb2NrICsgMTYwID4gbWF4KQotICAgIGxhc3QgPSAobWF4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgJSAxNjA7Ci0gIGVsc2UKLSAgICBsYXN0ID0gMTYwOwotCi0gIHJldHVybiAoYmxvY2sgKiBQTFRfRU5UUllfU0laRQotCSAgKyBsYXN0ICogNio0Ci0JICArIG9mcyAqIDgpOwotfQotCi0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgIShzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHN3aXRjaCAoRUxGNjRfUl9UWVBFX0lEIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gODsKLQotI2lmIDAKLQkgIC8qIERvZXNuJ3Qgd29yayBmb3IgNjQtYml0IC1mUElDLCBzaW5jZSBzZXRoaS9vciBidWlsZHMKLQkgICAgIHVuc2lnbmVkIG51bWJlcnMuICBJZiB3ZSBwZXJtaXQgb3Vyc2VsdmVzIHRvIG1vZGlmeQotCSAgICAgY29kZSBzbyB3ZSBnZXQgc2V0aGkveG9yLCB0aGlzIGNvdWxkIHdvcmsuCi0JICAgICBRdWVzdGlvbjogZG8gd2UgY29uc2lkZXIgY29uZGl0aW9uYWxseSByZS1lbmFibGluZwotICAgICAgICAgICAgIHRoaXMgZm9yIC1mcGljLCBvbmNlIHdlIGtub3cgYWJvdXQgb2JqZWN0IGNvZGUgbW9kZWxzPyAgKi8KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSNlbmRpZgotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JY2FzZSBSX1NQQVJDX1BMVDMyOgotCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgotCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKLSAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgIHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfUEMxMDoKLQljYXNlIFJfU1BBUkNfUEMyMjoKLQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQljYXNlIFJfU1BBUkNfUENfSE0xMDoKLQljYXNlIFJfU1BBUkNfUENfTE0yMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDX0RJU1A4OgotCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQljYXNlIFJfU1BBUkNfRElTUDY0OgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ184OgotCWNhc2UgUl9TUEFSQ18xNjoKLQljYXNlIFJfU1BBUkNfMzI6Ci0JY2FzZSBSX1NQQVJDX0hJMjI6Ci0JY2FzZSBSX1NQQVJDXzIyOgotCWNhc2UgUl9TUEFSQ18xMzoKLQljYXNlIFJfU1BBUkNfTE8xMDoKLQljYXNlIFJfU1BBUkNfVUEzMjoKLQljYXNlIFJfU1BBUkNfMTA6Ci0JY2FzZSBSX1NQQVJDXzExOgotCWNhc2UgUl9TUEFSQ182NDoKLQljYXNlIFJfU1BBUkNfT0xPMTA6Ci0JY2FzZSBSX1NQQVJDX0hIMjI6Ci0JY2FzZSBSX1NQQVJDX0hNMTA6Ci0JY2FzZSBSX1NQQVJDX0xNMjI6Ci0JY2FzZSBSX1NQQVJDXzc6Ci0JY2FzZSBSX1NQQVJDXzU6Ci0JY2FzZSBSX1NQQVJDXzY6Ci0JY2FzZSBSX1NQQVJDX0hJWDIyOgotCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQljYXNlIFJfU1BBUkNfSDQ0OgotCWNhc2UgUl9TUEFSQ19NNDQ6Ci0JY2FzZSBSX1NQQVJDX0w0NDoKLQljYXNlIFJfU1BBUkNfVUE2NDoKLQljYXNlIFJfU1BBUkNfVUExNjoKLQkgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UgcmVsb2NzCi0JICAgICBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jIHNlY3Rpb24gaW4KLQkgICAgIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuIAotCi0JICAgICBCdXQgZG9uJ3QgZG8gdGhpcyBmb3IgZGVidWdnaW5nIHNlY3Rpb25zIC0tIHRoaXMgc2hvd3MgdXAKLQkgICAgIHdpdGggRFdBUkYyIC0tIGZpcnN0IGJlY2F1c2UgdGhleSBhcmUgbm90IGxvYWRlZCwgYW5kCi0JICAgICBzZWNvbmQgYmVjYXVzZSBEV0FSRiBzZXogdGhlIGRlYnVnIGluZm8gaXMgbm90IHRvIGJlCi0JICAgICBiaWFzZWQgYnkgdGhlIGxvYWQgYWRkcmVzcy4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSkKLQkgICAgewotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfUkVHSVNURVI6Ci0JICAvKiBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKShfKCIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIpLAotCQkJCWJmZF9nZXRfZmlsZW5hbWUoYWJmZCksCi0JCQkJRUxGNjRfUl9UWVBFX0lEIChyZWwtPnJfaW5mbykpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgZm9yIFNUVF9SRUdJU1RFUiBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqdmFscCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdGF0aWMgY2hhciAqc3R0X3R5cGVzW10gPSB7ICJOT1RZUEUiLCAiT0JKRUNUIiwgIkZVTkNUSU9OIiB9OwotCi0gIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfUkVHSVNURVIpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICpwOwotICAgICAgCi0gICAgICByZWcgPSAoaW50KXN5bS0+c3RfdmFsdWU7Ci0gICAgICBzd2l0Y2ggKHJlZyAmIH4xKQotCXsKLQljYXNlIDI6IHJlZyAtPSAyOyBicmVhazsKLQljYXNlIDY6IHJlZyAtPSA0OyBicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiBPbmx5IHJlZ2lzdGVycyAlJWdbMjM2N10gY2FuIGJlIGRlY2xhcmVkIHVzaW5nIFNUVF9SRUdJU1RFUiIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMKLQkgIHx8IChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgICAgIHsKLQkgIC8qIFNUVF9SRUdJU1RFUiBvbmx5IHdvcmtzIHdoZW4gbGlua2luZyBhbiBlbGY2NF9zcGFyYyBvYmplY3QuCi0JICAgICBJZiBTVFRfUkVHSVNURVIgY29tZXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBkb24ndCBwdXQgaXQgaW50bwotCSAgICAgdGhlIG91dHB1dCBiZmQuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCByZWNoZWNrIGl0LiAgKi8KLQkgICpuYW1lcCA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICBwID0gc3BhcmM2NF9lbGZfaGFzaF90YWJsZShpbmZvKS0+YXBwX3JlZ3MgKyByZWc7Ci0KLSAgICAgIGlmIChwLT5uYW1lICE9IE5VTEwgJiYgc3RyY21wIChwLT5uYW1lLCAqbmFtZXApKQotCXsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCJSZWdpc3RlciAlJWclZCB1c2VkIGluY29tcGF0aWJseTogIgotICAgICAgICAgICAgICAgInByZXZpb3VzbHkgZGVjbGFyZWQgaW4gJXMgdG8gJXMsIGluICVzIHJlZGVmaW5lZCB0byAlcyIpLAotICAgICAgICAgICAgIChpbnQpc3ltLT5zdF92YWx1ZSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChwLT5hYmZkKSwgKnAtPm5hbWUgPyBwLT5uYW1lIDogIiNzY3JhdGNoIiwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKipuYW1lcCA/ICpuYW1lcCA6ICIjc2NyYXRjaCIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHAtPm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKipuYW1lcCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgICAgIAotCSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkJYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICpuYW1lcCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgY2hhciB0eXBlID0gaC0+dHlwZTsKLQotCQkgIGlmICh0eXBlID4gU1RUX0ZVTkMpIHR5cGUgPSAwOwotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlN5bWJvbCBgJXMnIGhhcyBkaWZmZXJpbmcgdHlwZXM6ICIKLQkJICAgICAgICJwcmV2aW91c2x5ICVzLCBSRUdJU1RFUiBpbiAlcyIpLAotCQkgICAgICpuYW1lcCwgc3R0X3R5cGVzIFt0eXBlXSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcC0+bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCSAgIHN0cmxlbiAoKm5hbWVwKSArIDEpOwotCSAgICAgIGlmICghcC0+bmFtZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgc3RyY3B5IChwLT5uYW1lLCAqbmFtZXApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHAtPm5hbWUgPSAiIjsKLQkgIHAtPmJpbmQgPSBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKTsKLQkgIHAtPmFiZmQgPSBhYmZkOwotCSAgcC0+c2huZHggPSBzeW0tPnN0X3NobmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocC0+YmluZCA9PSBTVEJfV0VBSwotCSAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICBwLT5iaW5kID0gU1RCX0dMT0JBTDsKLQkgICAgICBwLT5hYmZkID0gYWJmZDsKLQkgICAgfQotCX0KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgKm5hbWVwIHx8ICEgKipuYW1lcCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKnA7Ci0KLSAgICAgIHAgPSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKGluZm8pLT5hcHBfcmVnczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHArKykKLQlpZiAocC0+bmFtZSAhPSBOVUxMICYmICEgc3RyY21wIChwLT5uYW1lLCAqbmFtZXApKQotCSAgewotCSAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKTsKLQotCSAgICBpZiAodHlwZSA+IFNUVF9GVU5DKSB0eXBlID0gMDsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIlN5bWJvbCBgJXMnIGhhcyBkaWZmZXJpbmcgdHlwZXM6ICIKLQkJICJSRUdJU1RFUiBpbiAlcywgJXMgaW4gJXMiKSwKLQkgICAgICAgKm5hbWVwLCBiZmRfZ2V0X2ZpbGVuYW1lIChwLT5hYmZkKSwgc3R0X3R5cGVzIFt0eXBlXSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGVtaXRpbmcgU1RUX1JFR0lTVEVSIHN5bWJvbHMKLSAgIHdoaWNoIHdlIGNhbm5vdCBlYXNpbHkga2VlcCBpbiB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfb3V0cHV0X2FyY2hfc3ltcyAob3V0cHV0X2JmZCwgaW5mbywgZmluZm8sIGZ1bmMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGZpbmZvOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXsKLSAgaW50IHJlZzsKLSAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKmFwcF9yZWdzID0KLSAgICBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKGluZm8pLT5hcHBfcmVnczsKLSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0KLSAgLyogV2UgYXJyYW5nZWQgaW4gc2l6ZV9keW5hbWljX3NlY3Rpb25zIHRvIHB1dCB0aGUgU1RUX1JFR0lTVEVSIGVudHJpZXMKLSAgICAgYXQgdGhlIGVuZCBvZiB0aGUgZHlubG9jYWwgbGlzdCwgc28gdGhleSBjYW1lIGF0IHRoZSBlbmQgb2YgdGhlIGxvY2FsCi0gICAgIHN5bWJvbHMgaW4gdGhlIHN5bXRhYi4gIEV4Y2VwdCB0aGF0IHRoZXkgYXJlbid0IFNUQl9MT0NBTCwgc28gd2UgbmVlZAotICAgICB0byBiYWNrIHVwIHN5bXRhYi0+c2hfaW5mby4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsKQotICAgIHsKLSAgICAgIGJmZCAqIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICAgICAgYXNlY3Rpb24gKmR5bnN5bXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQotICAgICAgZm9yIChlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZSA7IGUgPSBlLT5uZXh0KQotCWlmIChlLT5pbnB1dF9pbmR4ID09IC0xKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoZSkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChkeW5zeW1zZWMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbwotCSAgICA9IGUtPmR5bmluZHg7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocmVnID0gMDsgcmVnIDwgNDsgcmVnKyspCi0gICAgaWYgKGFwcF9yZWdzIFtyZWddLm5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLQlpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPmtlZXBfaGFzaCwKLQkJCQlhcHBfcmVncyBbcmVnXS5uYW1lLAotCQkJCWZhbHNlLCBmYWxzZSkgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ltLnN0X3ZhbHVlID0gcmVnIDwgMiA/IHJlZyArIDIgOiByZWcgKyA0OwotCXN5bS5zdF9zaXplID0gMDsKLQlzeW0uc3Rfb3RoZXIgPSAwOwotCXN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGFwcF9yZWdzIFtyZWddLmJpbmQsIFNUVF9SRUdJU1RFUik7Ci0Jc3ltLnN0X3NobmR4ID0gYXBwX3JlZ3MgW3JlZ10uc2huZHg7Ci0JaWYgKCEgKCpmdW5jKSAoZmluZm8sIGFwcF9yZWdzIFtyZWddLm5hbWUsICZzeW0sCi0JCSAgICAgICBzeW0uc3Rfc2huZHggPT0gU0hOX0FCUwotCQkJID8gYmZkX2Fic19zZWN0aW9uX3B0ciA6IGJmZF91bmRfc2VjdGlvbl9wdHIpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1zcGFyYzY0X2VsZl9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKSA9PSBTVFRfUkVHSVNURVIpCi0gICAgcmV0dXJuIFNUVF9SRUdJU1RFUjsKLSAgZWxzZQotICAgIHJldHVybiB0eXBlOwotfQotCi0vKiBBIFNUQl9HTE9CQUwsU1RUX1JFR0lTVEVSIHN5bWJvbCBzaG91bGQgYmUgQlNGX0dMT0JBTAotICAgZXZlbiBpbiBTSE5fVU5ERUYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqZWxmc3ltOwotCi0gIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLSAgaWYgKGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvCi0gICAgICA9PSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1JFR0lTVEVSKSkKLSAgICB7Ci0gICAgICBhc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotICAgIH0KLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFdQTFQzMCByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KLSAgICAgICAgICAgICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGJpdCBpbiAucGx0IGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBQTFRfSEVBREVSX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICAvKiBUbyBzaW1wbGlmeSBtYXR0ZXJzIGxhdGVyLCBqdXN0IHN0b3JlIHRoZSBwbHQgaW5kZXggaGVyZS4gICovCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgcGx0IGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgdGhlIHJlbG9jYXRpb25zIG11c3QKLQkgcGFpciB1cCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gKFBMVF9IRUFERVJfU0laRS9QTFRfRU5UUllfU0laRQotCQkJICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0gICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgc2l6ZSBpcyBib3VuZGVkIGJ5IHRoZSBtYWduaXR1ZGUKLQkgb2YgdGhlIG9mZnNldCB3ZSBjYW4gZGVzY3JpYmUgaW4gdGhlIGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gKGJmZF92bWEpMSA8PCAzMikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gIDE2LWJ5dGVzIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBsYXJnZXN0IHR5cGUgdGhhdCByZXF1aXJlcyBoYXJkIGFsaWdubWVudCAtLSBsb25nIGRvdWJsZS4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDQpCi0gICAgcG93ZXJfb2ZfdHdvID0gNDsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgWmVybyB0aGUgbWVtb3J5Ci0JIGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQsIHdoaWNoIGhhcyA0IHVudXNlZCBlbnRyaWVzCi0JIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCB3ZSBkb24ndCB3YW50IGdhcmJhZ2UuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaW50IHJlZzsKLSAgICAgIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICogYXBwX3JlZ3M7Ci0gICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqZWh0ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pOwotCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogQWRkIGR5bmFtaWMgU1RUX1JFR0lTVEVSIHN5bWJvbHMgYW5kIGNvcnJlc3BvbmRpbmcgRFRfU1BBUkNfUkVHSVNURVIKLQkgZW50cmllcyBpZiBuZWVkZWQuICAqLwotICAgICAgYXBwX3JlZ3MgPSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+YXBwX3JlZ3M7Ci0gICAgICBkeW5zdHIgPSBlaHQtPmR5bnN0cjsKLQotICAgICAgZm9yIChyZWcgPSAwOyByZWcgPCA0OyByZWcrKykKLQlpZiAoYXBwX3JlZ3MgW3JlZ10ubmFtZSAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZW50cnksICplOwotCSAgICAgIAotCSAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NQQVJDX1JFR0lTVEVSLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZW50cnkgPSAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKikKLQkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLCBzaXplb2YgKCplbnRyeSkpOwotCSAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogV2UgY2hlYXQgaGVyZSBhIGxpdHRsZSBiaXQ6IHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgbG9jYWwsIHNvIHdlCi0JICAgICAgIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBkeW5sb2NhbCBsaW5rZWQgbGlzdC4gIFdlIHdpbGwgZml4IGl0Ci0JICAgICAgIGxhdGVyIG9uLCBhcyB3ZSBoYXZlIHRvIGZpeCBvdGhlciBmaWVsZHMgYW55d2F5LiAgKi8KLQkgICAgZW50cnktPmlzeW0uc3RfdmFsdWUgPSByZWcgPCAyID8gcmVnICsgMiA6IHJlZyArIDQ7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X3NpemUgPSAwOwotCSAgICBpZiAoKmFwcF9yZWdzIFtyZWddLm5hbWUgIT0gJ1wwJykKLQkgICAgICBlbnRyeS0+aXN5bS5zdF9uYW1lCi0JCT0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIGFwcF9yZWdzW3JlZ10ubmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICBlbHNlCi0JICAgICAgZW50cnktPmlzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X290aGVyID0gMDsKLQkgICAgZW50cnktPmlzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChhcHBfcmVncyBbcmVnXS5iaW5kLAotCQkJCQkgICAgICAgU1RUX1JFR0lTVEVSKTsKLQkgICAgZW50cnktPmlzeW0uc3Rfc2huZHggPSBhcHBfcmVncyBbcmVnXS5zaG5keDsKLQkgICAgZW50cnktPm5leHQgPSBOVUxMOwotCSAgICBlbnRyeS0+aW5wdXRfYmZkID0gb3V0cHV0X2JmZDsKLQkgICAgZW50cnktPmlucHV0X2luZHggPSAtMTsKLQotCSAgICBpZiAoZWh0LT5keW5sb2NhbCA9PSBOVUxMKQotCSAgICAgIGVodC0+ZHlubG9jYWwgPSBlbnRyeTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZm9yIChlID0gZWh0LT5keW5sb2NhbDsgZS0+bmV4dDsgZSA9IGUtPm5leHQpCi0JCSAgOwotCQllLT5uZXh0ID0gZW50cnk7Ci0JICAgICAgfQotCSAgICBlaHQtPmR5bnN5bWNvdW50Kys7Ci0JICB9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBTRVRfU0VDX0RPX1JFTEFYKHNlY3Rpb24pIGRvIHsgZWxmX3NlY3Rpb25fZGF0YShzZWN0aW9uKS0+dGRhdGEgPSAodm9pZCAqKTE7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFNFQ19ET19SRUxBWChzZWN0aW9uKSAoZWxmX3NlY3Rpb25fZGF0YShzZWN0aW9uKS0+dGRhdGEgPT0gKHZvaWQgKikxKQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgKmFnYWluID0gZmFsc2U7Ci0gIFNFVF9TRUNfRE9fUkVMQVggKHNlY3Rpb24pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlbG9jYXRlIGEgU1BBUkM2NCBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYmZkX3ZtYSBnb3RfYmFzZTsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmhnb3QgPT0gTlVMTCkKLSAgICBnb3RfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzZ290ID0gc3BsdCA9IHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEVfSUQgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1NQQVJDX21heF9zdGQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwX2l0ID0gZmFsc2U7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkJY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQkJY2FzZSBSX1NQQVJDX1BMVDMyOgotCQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQkJY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkJICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQkJY2FzZSBSX1NQQVJDX0dPVDIyOgotCQkgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfU1BBUkNfUEMxMDoKLQkJY2FzZSBSX1NQQVJDX1BDMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCQljYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkJY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JCSAgaWYgKCFzdHJjbXAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRkFMTFRIUlUgKi8KLQotCQljYXNlIFJfU1BBUkNfODoKLQkJY2FzZSBSX1NQQVJDXzE2OgotCQljYXNlIFJfU1BBUkNfMzI6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQODoKLQkJY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQkJY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCQljYXNlIFJfU1BBUkNfSEkyMjoKLQkJY2FzZSBSX1NQQVJDXzIyOgotCQljYXNlIFJfU1BBUkNfMTM6Ci0JCWNhc2UgUl9TUEFSQ19MTzEwOgotCQljYXNlIFJfU1BBUkNfVUEzMjoKLQkJY2FzZSBSX1NQQVJDXzEwOgotCQljYXNlIFJfU1BBUkNfMTE6Ci0JCWNhc2UgUl9TUEFSQ182NDoKLQkJY2FzZSBSX1NQQVJDX09MTzEwOgotCQljYXNlIFJfU1BBUkNfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19MTTIyOgotCQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ183OgotCQljYXNlIFJfU1BBUkNfNToKLQkJY2FzZSBSX1NQQVJDXzY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQkJY2FzZSBSX1NQQVJDX0xPWDEwOgotCQljYXNlIFJfU1BBUkNfSDQ0OgotCQljYXNlIFJfU1BBUkNfTTQ0OgotCQljYXNlIFJfU1BBUkNfTDQ0OgotCQljYXNlIFJfU1BBUkNfVUE2NDoKLQkJY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgaWYgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAhKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICAgIHNraXBfaXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoc2tpcF9pdCkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMKLQkJICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZAotCQkgICAmJiBFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpID09IFNUVl9ERUZBVUxUKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQKLQkJICAgICAgIHx8IEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcikpKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGNvcGllZAotCSBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykpCi0JewotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX1NQQVJDX1BDMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQzIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCSAgICAgIGlmIChoICE9IE5VTEwKLQkJICAmJiAhc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikpCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgUl9TUEFSQ19ESVNQODoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDIyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxOToKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDXzg6Ci0JICAgIGNhc2UgUl9TUEFSQ18xNjoKLQkgICAgY2FzZSBSX1NQQVJDXzMyOgotCSAgICBjYXNlIFJfU1BBUkNfSEkyMjoKLQkgICAgY2FzZSBSX1NQQVJDXzIyOgotCSAgICBjYXNlIFJfU1BBUkNfMTM6Ci0JICAgIGNhc2UgUl9TUEFSQ19MTzEwOgotCSAgICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkgICAgY2FzZSBSX1NQQVJDXzEwOgotCSAgICBjYXNlIFJfU1BBUkNfMTE6Ci0JICAgIGNhc2UgUl9TUEFSQ182NDoKLQkgICAgY2FzZSBSX1NQQVJDX09MTzEwOgotCSAgICBjYXNlIFJfU1BBUkNfSEgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0hNMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19MTTIyOgotCSAgICBjYXNlIFJfU1BBUkNfNzoKLQkgICAgY2FzZSBSX1NQQVJDXzU6Ci0JICAgIGNhc2UgUl9TUEFSQ182OgotCSAgICBjYXNlIFJfU1BBUkNfSElYMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19MT1gxMDoKLQkgICAgY2FzZSBSX1NQQVJDX0g0NDoKLQkgICAgY2FzZSBSX1NQQVJDX000NDoKLQkgICAgY2FzZSBSX1NQQVJDX0w0NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTE2OgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCQlib29sZWFuIHNraXA7Ci0KLQkJaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUgPQotCQkgICAgICAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAgKGlucHV0X2JmZCwKLQkJCWVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQllbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0KLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJCSYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLAotCQkJCQkJCQlpbnB1dF9zZWN0aW9uKSwKLQkJCQkJICAgbmFtZSArIDUpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJICB9Ci0KLQkJc2tpcCA9IGZhbHNlOwotCi0JCWlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF92bWEgb2ZmOwotCi0JCSAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgICAgcmVsLT5yX29mZnNldCkpOwotCQkgICAgaWYgKG9mZiA9PSBNSU5VU19PTkUpCi0JCSAgICAgIHNraXAgPSB0cnVlOwotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQkgIH0KLQotCQlvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkvKiBPcHRpbWl6ZSB1bmFsaWduZWQgcmVsb2MgdXNhZ2Ugbm93IHRoYXQgd2Uga25vdyB3aGVyZQotCQkgICBpdCBmaW5hbGx5IHJlc2lkZXMuICAqLwotCQlzd2l0Y2ggKHJfdHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBSX1NQQVJDXzE2OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDEpIHJfdHlwZSA9IFJfU1BBUkNfVUExNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTE2OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgMSkpIHJfdHlwZSA9IFJfU1BBUkNfMTY7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfMzI6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMykgcl90eXBlID0gUl9TUEFSQ19VQTMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAzKSkgcl90eXBlID0gUl9TUEFSQ18zMjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ182NDoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiA3KSByX3R5cGUgPSBSX1NQQVJDX1VBNjQ7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDcpKSByX3R5cGUgPSBSX1NQQVJDXzY0OwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWlmIChza2lwKQotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCS8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotCQkgICBiZWNvbWUgbG9jYWwuICAqLwotCQllbHNlIGlmIChoICE9IE5VTEwKLQkJCSAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB7Ci0JCSAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgIG91dHJlbC5yX2luZm8KLQkJICAgICAgPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsCi0JCQkJICAgICAgRUxGNjRfUl9UWVBFX0lORk8gKAotCQkJCQlFTEY2NF9SX1RZUEVfREFUQSAocmVsLT5yX2luZm8pLAotCQkJCQkJCSAgIHJfdHlwZSkpOwotCQkgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAocl90eXBlID09IFJfU1BBUkNfNjQpCi0JCSAgICAgIHsKLQkJCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJbG9uZyBpbmR4OwotCi0JCQlpZiAoaCA9PSBOVUxMKQotCQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJCXx8IChoLT5yb290LnR5cGUKLQkJCQkJICAgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCSAgfQotCQkJaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCSAgaW5keCA9IDA7Ci0JCQllbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQkgIHsKLQkJCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgICAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCi0JCQkgICAgLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG5vbi1waWMKLQkJCSAgICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQkJCSAgICBpZiAoaW5keCA9PSAwKQotCQkJICAgICAgewotCQkJCUJGRF9GQUlMICgpOwotCQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJCSAgKF8oIiVzOiBwcm9iYWJseSBjb21waWxlZCB3aXRob3V0IC1mUElDPyIpLAotCQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICAgIH0KLQkJCSAgfQotCi0JCQlvdXRyZWwucl9pbmZvCi0JCQkgID0gRUxGNjRfUl9JTkZPIChpbmR4LAotCQkJCQkgIEVMRjY0X1JfVFlQRV9JTkZPICgKLQkJCQkJICAgIEVMRjY0X1JfVFlQRV9EQVRBIChyZWwtPnJfaW5mbyksCi0JCQkJCQkJICAgICAgIHJfdHlwZSkpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkJKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JCS8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0JCSAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0JCSAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCQlpZiAoc2tpcAotCQkgICAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgICB8fCBFTEY2NF9SX1RZUEVfSUQgKG91dHJlbC5yX2luZm8pICE9IFJfU1BBUkNfUkVMQVRJVkUpCi0JCSAgY29udGludWU7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLQkgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYSAtQnN5bWJvbGljCi0JCSAgICAgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wKLQkJICAgICB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZQotCQkgICAgIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotCQkgICAgIFNpbmNlIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LCB3ZQotCQkgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlCi0JCSAgICAgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMKLQkJICAgICBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwpOwotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LiAgV2UgdXNlCi0JCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MKLQkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb247Ci0JCSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQkgIGdvdG8gZG9fZGVmYXVsdDsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JY2FzZSBSX1NQQVJDX1BMVDMyOgotCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgotCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0JCSBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0JCSB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaC0+cGx0Lm9mZnNldCkpOwotCSAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX1dQTFQzMCkKLQkgICAgZ290byBkb193cGx0MzA7Ci0JICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLQljYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiAmIDB4M2ZmKSArIEVMRjY0X1JfVFlQRV9EQVRBIChyZWwtPnJfaW5mbyk7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MWZmZikgfCAocmVsb2NhdGlvbiAmIDB4MWZmZik7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICAvKiBBZGp1c3QgZm9yIHBjLXJlbGF0aXZlLW5lc3MuICAqLwotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICByZWxvY2F0aW9uIC09IHJlbC0+cl9vZmZzZXQ7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MzAzZmZmKSB8ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCQkJCSAgIHwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IHJlbG9jYXRpb24gXiBNSU5VU19PTkU7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4M2ZmZmZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMCkgJiAweDNmZmZmZik7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkJICAgIGhvd3RvLT5iaXRzaXplLCBob3d0by0+cmlnaHRzaGlmdCwKLQkJCQkgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgcmVsb2NhdGlvbik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICYgMHgzZmYpIHwgMHgxYzAwOwotCi0JICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgIHggPSAoeCAmIH4weDFmZmYpIHwgcmVsb2NhdGlvbjsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWRvX3dwbHQzMDoKLQkgIGlmIChTRUNfRE9fUkVMQVggKGlucHV0X3NlY3Rpb24pCi0JICAgICAgJiYgcmVsLT5yX29mZnNldCArIDQgPCBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHsKLSNkZWZpbmUgRzAJCTAKLSNkZWZpbmUgTzcJCTE1Ci0jZGVmaW5lIFhDQwkJKDIgPDwgMjApCi0jZGVmaW5lIENPTkQoeCkJCSgoKHgpJjB4Zik8PDI1KQotI2RlZmluZSBDT05EQQkJQ09ORCgweDgpCi0jZGVmaW5lIElOU05fQlBBCShGMigwLDEpIHwgQ09OREEgfCBCUFJFRCB8IFhDQykKLSNkZWZpbmUgSU5TTl9CQQkJKEYyKDAsMikgfCBDT05EQSkKLSNkZWZpbmUgSU5TTl9PUgkJRjMoMiwgMHgyLCAwKQotI2RlZmluZSBJTlNOX05PUAlGMigwLDQpCi0KLQkgICAgICBiZmRfdm1hIHgsIHk7Ci0KLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBjYWxsIHdpdGggZWl0aGVyOgotCQkgcmVzdG9yZQotCQkgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbiB3aXRoIHJkID09ICVvNwotCQkgd2hlcmUgcnMxICE9ICVvNyBhbmQgcnMyIGlmIGl0IGlzIHJlZ2lzdGVyICE9ICVvNwotCQkgdGhlbiB3ZSBjYW4gb3B0aW1pemUgaWYgdGhlIGNhbGwgZGVzdGluYXRpb24gaXMgbmVhcgotCQkgYnkgY2hhbmdpbmcgdGhlIGNhbGwgaW50byBhIGJyYW5jaCBhbHdheXMuICAqLwotCSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgeSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICAgICAgaWYgKCh4ICYgT1AofjApKSA9PSBPUCgxKSAmJiAoeSAmIE9QKH4wKSkgPT0gT1AoMikpCi0JCXsKLQkJICBpZiAoKCh5ICYgT1AzKH4wKSkgPT0gT1AzKDB4M2QpIC8qIHJlc3RvcmUgKi8KLQkJICAgICAgIHx8ICgoeSAmIE9QMygweDI4KSkgPT0gMCAvKiBhcml0aG1ldGljICovCi0JCQkgICAmJiAoeSAmIFJEKH4wKSkgPT0gUkQoTzcpKSkKLQkJICAgICAgJiYgKHkgJiBSUzEofjApKSAhPSBSUzEoTzcpCi0JCSAgICAgICYmICgoeSAmIEYzSSh+MCkpCi0JCQkgIHx8ICh5ICYgUlMyKH4wKSkgIT0gUlMyKE83KSkpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF92bWEgcmVsb2M7Ci0KLQkJICAgICAgcmVsb2MgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZCAtIHJlbC0+cl9vZmZzZXQ7Ci0JCSAgICAgIHJlbG9jIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgICAgaWYgKHJlbG9jICYgMykKLQkJCWdvdG8gZG9fZGVmYXVsdDsKLQotCQkgICAgICAvKiBFbnN1cmUgdGhlIGJyYW5jaCBmaXRzIGludG8gc2ltbTIyLiAgKi8KLQkJICAgICAgaWYgKChyZWxvYyAmIH4oYmZkX3ZtYSkweDdmZmZmZikKLQkJCSAgICYmICgocmVsb2MgfCAweDdmZmZmZikgIT0gTUlOVVNfT05FKSkKLQkJCWdvdG8gZG9fZGVmYXVsdDsKLQkJICAgICAgcmVsb2MgPj49IDI7Ci0KLQkJICAgICAgLyogQ2hlY2sgd2hldGhlciBpdCBmaXRzIGludG8gc2ltbTE5LiAgKi8KLQkJICAgICAgaWYgKChyZWxvYyAmIDB4M2MwMDAwKSA9PSAwCi0JCQkgIHx8IChyZWxvYyAmIDB4M2MwMDAwKSA9PSAweDNjMDAwMCkKLQkJCXggPSBJTlNOX0JQQSB8IChyZWxvYyAmIDB4N2ZmZmYpOyAvKiBiYSxwdCAleGNjICovCi0JCSAgICAgIGVsc2UKLQkJCXggPSBJTlNOX0JBIHwgKHJlbG9jICYgMHgzZmZmZmYpOyAvKiBiYSAqLwotCQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IDQKLQkJCSAgJiYgKHkgJiAoMHhmZmZmZmZmZiBeIFJTMSh+MCkpKQotCQkJICAgICA9PSAoSU5TTl9PUiB8IFJEKE83KSB8IFJTMihHMCkpKQotCQkJewotCQkJICBiZmRfdm1hIHo7Ci0JCQkgIHVuc2lnbmVkIGludCByZWc7Ci0KLQkJCSAgeiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgLSA0KTsKLQkJCSAgaWYgKCh6ICYgKDB4ZmZmZmZmZmYgXiBSRCh+MCkpKQotCQkJICAgICAgIT0gKElOU05fT1IgfCBSUzEoTzcpIHwgUlMyKEcwKSkpCi0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgLyogVGhlIHNlcXVlbmNlIHdhcwotCQkJICAgICBvciAlbzcsICVnMCwgJXJOCi0JCQkgICAgIGNhbGwgZm9vCi0JCQkgICAgIG9yICVyTiwgJWcwLCAlbzcKLQotCQkJICAgICBJZiBjYWxsIGZvbyB3YXMgcmVwbGFjZWQgd2l0aCBiYSwgcmVwbGFjZQotCQkJICAgICBvciAlck4sICVnMCwgJW83IHdpdGggbm9wLiAgKi8KLQotCQkJICByZWcgPSAoeSAmIFJTMSh+MCkpID4+IDE0OwotCQkJICBpZiAocmVnICE9ICgoeiAmIFJEKH4wKSkgPj4gMjUpCi0JCQkgICAgICB8fCByZWcgPT0gRzAgfHwgcmVnID09IE83KQotCQkJICAgIGJyZWFrOwotCi0JCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgSU5TTl9OT1AsCi0JCQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIC8qIEZBTExUSFJPVUdIICovCi0KLQlkZWZhdWx0OgotCWRvX2RlZmF1bHQ6Ci0JICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocikKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkJICAgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICB7Ci0JCSAgICAvKiBBc3N1bWUgdGhpcyBpcyBhIGNhbGwgcHJvdGVjdGVkIGJ5IG90aGVyIGNvZGUgdGhhdAotCQkgICAgICAgZGV0ZWN0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwKLQkJICAgICAgIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBvdmVyZmxvdy4gIElmIG5vdCwgdGhlIAotCQkgICAgICAgcHJvZ3JhbSBpcyBob3NlZCBhbnl3YXksIGFuZCBhIGxpdHRsZSB3YXJuaW5nIGlzbid0Ci0JCSAgICAgICBnb2luZyB0byBoZWxwLiAgKi8KLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJICAKLQkgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLAotCQkJIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkgc3ltLT5zdF9uYW1lKSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICAgIH0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBQTFQuICBTZXQgaXQgdXAuICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBpZiAoaC0+cGx0Lm9mZnNldCA8IExBUkdFX1BMVF9USFJFU0hPTEQpCi0JewotCSAgcmVsYS5yX29mZnNldCA9IHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBtYXggPSBzcGx0LT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKLQkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCAoaC0+cGx0Lm9mZnNldCwgbWF4KTsKLQkgIHJlbGEucl9hZGRlbmQgPSAtKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpICsgNCkKLQkJCSAgLShzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3BsdC0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgcmVsYS5yX29mZnNldCArPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNwbHQtPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBoLT5wbHQub2Zmc2V0KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBHT1QuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgYXNlY3Rpb24gKnNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgc3R0X3JlZ2lkeCA9IC0xOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjoKLQkgICAgICBpZiAoc3R0X3JlZ2lkeCA9PSAtMSkKLQkJewotCQkgIHN0dF9yZWdpZHggPQotCQkgICAgX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCAoaW5mbywgb3V0cHV0X2JmZCwgLTEpOwotCQkgIGlmIChzdHRfcmVnaWR4ID09IC0xKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBzdHRfcmVnaWR4Kys7Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotCSAgICBkZWZhdWx0OgkgICAgICBuYW1lID0gTlVMTDsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIHNwYXJjNjRfZWxmX2J1aWxkX3BsdChvdXRwdXRfYmZkLCBzcGx0LT5jb250ZW50cywKLQkJCQlzcGx0LT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRSk7Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCVBMVF9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLwotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gODsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBlX2ZsYWdzIGZpZWxkLiAqLwotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJvb2xlYW4gZXJyb3I7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBpbnQgbmV3X21tLCBvbGRfbW07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkgICAvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKSAgICAgIC8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIGVycm9yID0gZmFsc2U7Ci0gIAotICAgICAgaWYgKChpYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qgd2FudCBkeW5hbWljIG9iamVjdHMgbWVtb3J5IG9yZGVyaW5nIGFuZAotCSAgICAgYXJjaGl0ZWN0dXJlIHRvIGhhdmUgYW55IHJvbGUuIFRoYXQncyB3aGF0IGR5bmFtaWMgbGlua2VyCi0JICAgICBzaG91bGQgZG8uICAqLwotCSAgbmV3X2ZsYWdzICY9IH4oRUZfU1BBUkNWOV9NTSB8IEVGX1NQQVJDX1NVTl9VUzEgfCBFRl9TUEFSQ19IQUxfUjEpOwotCSAgbmV3X2ZsYWdzIHw9IChvbGRfZmxhZ3MKLQkJCSYgKEVGX1NQQVJDVjlfTU0KLQkJCSAgIHwgRUZfU1BBUkNfU1VOX1VTMQotCQkJICAgfCBFRl9TUEFSQ19IQUxfUjEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2hvb3NlIHRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSByZXF1aXJlbWVudHMuICAqLwotCSAgb2xkX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMSB8IEVGX1NQQVJDX0hBTF9SMSkpOwotCSAgbmV3X2ZsYWdzIHw9IChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMSB8IEVGX1NQQVJDX0hBTF9SMSkpOwotCSAgaWYgKChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMSB8IEVGX1NQQVJDX0hBTF9SMSkpCi0JICAgICAgPT0gKEVGX1NQQVJDX1NVTl9VUzEgfCBFRl9TUEFSQ19IQUxfUjEpKQotCSAgICB7Ci0JICAgICAgZXJyb3IgPSB0cnVlOwotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0JICAgIH0KLQkgIC8qIENob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBtZW1vcnkgb3JkZXJpbmcuICAqLwotCSAgb2xkX21tID0gKG9sZF9mbGFncyAmIEVGX1NQQVJDVjlfTU0pOwotCSAgbmV3X21tID0gKG5ld19mbGFncyAmIEVGX1NQQVJDVjlfTU0pOwotCSAgb2xkX2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOwotCSAgbmV3X2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOwotCSAgaWYgKG5ld19tbSA8IG9sZF9tbSkKLQkgICAgb2xkX21tID0gbmV3X21tOwotCSAgb2xkX2ZsYWdzIHw9IG9sZF9tbTsKLQkgIG5ld19mbGFncyB8PSBvbGRfbW07Ci0JfQotCi0gICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCi0gICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBvbGRfZmxhZ3M7Ci0KLSAgICAgIGlmIChlcnJvcikKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBQcmludCBhIFNUVF9SRUdJU1RFUiBzeW1ib2wgdG8gZmlsZSBGSUxFLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc3BhcmM2NF9lbGZfcHJpbnRfc3ltYm9sX2FsbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7Ci0gIGludCByZWcsIHR5cGU7Ci0gIAotICBpZiAoRUxGX1NUX1RZUEUgKCgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykKLSAgICAgICE9IFNUVF9SRUdJU1RFUikKLSAgICByZXR1cm4gTlVMTDsKLQotICByZWcgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlOwotICB0eXBlID0gc3ltYm9sLT5mbGFnczsKLSAgZnByaW50ZiAoZmlsZSwgIlJFR18lYyVjJTExcyVjJWMgICAgUiIsICJHT0xJIiBbcmVnIC8gOF0sICcwJyArIChyZWcgJiA3KSwgIiIsCi0JCSAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JCSAgPyAodHlwZSAmIEJTRl9HTE9CQUwpID8gJyEnIDogJ2wnCi0gIAkgICAgICAgICAgOiAodHlwZSAmIEJTRl9HTE9CQUwpID8gJ2cnIDogJyAnKSwKLSAgCSAgICAgICAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnKTsKLSAgaWYgKHN5bWJvbC0+bmFtZSA9PSBOVUxMIHx8IHN5bWJvbC0+bmFtZSBbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gIiNzY3JhdGNoIjsKLSAgZWxzZQotICAgIHJldHVybiBzeW1ib2wtPm5hbWU7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIFNQQVJDNjQgRUxGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoID0gYmZkX21hY2hfc3BhcmNfdjk7Ci0gIAotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19TVU5fVVMxKQotICAgIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OWE7Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywgbWFjaCk7Ci19Ci0KLS8qIFJlbG9jYXRpb25zIGluIHRoZSA2NCBiaXQgU1BBUkMgRUxGIEFCSSBhcmUgbW9yZSBjb21wbGV4IHRoYW4gaW4KLSAgIHN0YW5kYXJkIEVMRiwgYmVjYXVzZSBSX1NQQVJDX09MTzEwIGhhcyBzZWNvbmRhcnkgYWRkZW5kIGluCi0gICBFTEY2NF9SX1RZUEVfREFUQSBmaWVsZC4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVkaXJlY3QgdGhlCi0gICByZWxvY2F0aW9uIGhhbmRsaW5nIHJvdXRpbmVzLiAgKi8KLQotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gc3BhcmM2NF9lbGZfc2l6ZV9pbmZvID0KLXsKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIDQsCQkvKiBoYXNoLXRhYmxlIGVudHJ5IHNpemUgKi8KLSAgLyogaW50ZXJuYWwgcmVsb2NhdGlvbnMgcGVyIGV4dGVybmFsIHJlbG9jYXRpb25zLgotICAgICBGb3IgbGluayBwdXJwb3NlcyB3ZSB1c2UganVzdCAxIGludGVybmFsIHBlcgotICAgICAxIGV4dGVybmFsLCBmb3IgYXNzZW1ibHkgYW5kIHNsdXJwIHN5bWJvbCB0YWJsZQotICAgICB3ZSB1c2UgMi4gKi8KLSAgMSwKLSAgNjQsCQkvKiBhcmNoX3NpemUgKi8KLSAgOCwJCS8qIGZpbGVfYWxpZ24gKi8KLSAgRUxGQ0xBU1M2NCwKLSAgRVZfQ1VSUkVOVCwKLSAgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycywKLSAgYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MsCi0gIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQsCi0gIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotICBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBiZmRfZWxmNjRfc3dhcF9keW5faW4sCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjY0X3NwYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJImVsZjY0LXNwYXJjIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMDAKLQotLyogVGhpcyBpcyB0aGUgb2ZmaWNpYWwgQUJJIHZhbHVlLiAgKi8KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSBFTV9TUEFSQ1Y5Ci0KLS8qIFRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd2UgdXNlZCBiZWZvcmUgdGhlIEFCSSB3YXMgcmVsZWFzZWQuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxIEVNX09MRF9TUEFSQ1Y5Ci0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgc3BhcmM2NF9lbGZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKLSAgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIHNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIHNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICBzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbGF4X3NlY3Rpb24gXAotICBzcGFyYzY0X2VsZl9yZWxheF9zZWN0aW9uCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sgXAotICBzcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nIFwKLSAgc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzIFwKLSAgc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0gIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCBcCi0gIHNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcyBcCi0gIHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIFwKLSAgc3BhcmM2NF9lbGZfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKLSAgc3BhcmM2NF9lbGZfb2JqZWN0X3AKLQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotCi0vKiBTZWN0aW9uIDUuMi40IG9mIHRoZSBBQkkgc3BlY2lmaWVzIGEgMjU2LWJ5dGUgYm91bmRhcnkgZm9yIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgOAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA4Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LmMgYi9iZmQvZWxmNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYjViNS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIEVMRiA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJNjQKLQotI2luY2x1ZGUgImVsZmNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZhcm0tbmFiaS5jIGIvYmZkL2VsZmFybS1uYWJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MGI1OWMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmFybS1uYWJpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyogMzItYml0IEVMRiBzdXBwb3J0IGZvciBBUk0gbmV3IGFiaSBvcHRpb24uCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAgKHNpemVvZiAoYSkgLyAoc2l6ZW9mIChhKVswXSkpCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgICAgICAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0iCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgICAgICAgICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgICAgICAgICAgICAiZWxmMzItYmlnYXJtIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQlFTEZPU0FCSV9BUk0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotLyogTm90ZTogY29kZSBzdWNoIGFzIGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCBleHBlY3QgdG8gdXNlIGUuZy4KLSAgIFJfQVJNX1BDMjQgYXMgYW4gaW5kZXggaW50byB0aGlzLCBhbmQgZmluZCB0aGUgUl9BUk1fUEMyNCBIT1dUTyAKLSAgIGluIHRoYXQgc2xvdC4gKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCi0gIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX1BDMTMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzEzIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KLQkgNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzgsCSAgICAgICAgLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0FNUF9WQ0FMTDksCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TV0kyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0kyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fU1dJOCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NXSTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBCTFggaW5zdHJ1Y3Rpb24gZm9yIHRoZSBBUk0uICAqLwotICBIT1dUTyAoUl9BUk1fWFBDMjUsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fWFBDMjUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEJMWCBpbnN0cnVjdGlvbiBmb3IgdGhlIFRodW1iLiAgKi8KLSAgSE9XVE8gKFJfQVJNX1RITV9YUEMyMiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9YUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUaGVzZSBuZXh0IHRocmVlIHJlbG9jcyBhcmUgbm90IGRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRvIGZpbGwgdGhlIHNwYWNlLiAgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xNyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY3MgdXNlZCBpbiBBUk0gTGludXggKi8KLSAgCi0gIEhPV1RPIChSX0FSTV9DT1BZLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0NPUFkiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9HTE9CX0RBVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dMT0JfREFUIiwJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9KVU1QX1NMT1QsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9KVU1QX1NMT1QiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1JFTEFUSVZFLAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fUkVMQVRJVkUiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVE9GRiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1RPRkYiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVFBDLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVFBDIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1QzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9QTFQzMiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDI2LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9QTFQzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRW5kIG9mIHJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLyAKLQotICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkFCUzMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SUEMyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSk7ICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzExLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzExIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgcGMgcmVsYXRpdmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzksCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAKLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqIGJmZF9yZWxvYzsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICogZWxmX3JlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICAKLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9USE1fUEMxMToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGMxMV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9USE1fUEM5OgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3RobV9wYzlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocl90eXBlID49IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpKQotCWJmZF9yZWxvYy0+aG93dG8gPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1faG93dG9fdGFibGVbcl90eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLSAgCi1zdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcAotICB7Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX05PTkV9LAotICB7QkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBSX0FSTV9QQzI0fSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQkxYLCAgICAgICAgUl9BUk1fWFBDMjV9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JMWCwgICAgICBSX0FSTV9USE1fWFBDMjJ9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMn0sCi0gIHtCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgIFJfQVJNX1JFTDMyfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2fSwKLSAge0JGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwgICAgICAgUl9BUk1fQUJTMTJ9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNX0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyfSwKLSAge0JGRF9SRUxPQ19BUk1fQ09QWSwgICAgICAgICAgICAgUl9BUk1fQ09QWX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dMT0JfREFULCAgICAgICAgIFJfQVJNX0dMT0JfREFUfSwKLSAge0JGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCAgICAgICAgUl9BUk1fSlVNUF9TTE9UfSwKLSAge0JGRF9SRUxPQ19BUk1fUkVMQVRJVkUsICAgICAgICAgUl9BUk1fUkVMQVRJVkV9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RPRkYsICAgICAgICAgICBSX0FSTV9HT1RPRkZ9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RQQywgICAgICAgICAgICBSX0FSTV9HT1RQQ30sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVDMyLCAgICAgICAgICAgIFJfQVJNX0dPVDMyfSwKLSAge0JGRF9SRUxPQ19BUk1fUExUMzIsICAgICAgICAgICAgUl9BUk1fUExUMzJ9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNmNTA5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPTERfQVJNX0FCSQotCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQkwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JBQlMzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUlBDMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTG9jYXRlIGEgcmVsb2MgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQKLSAgIHdoZW4gdGhlIGVudHJ5IG51bWJlciBpcyBpcyA+IFJfQVJNX0dOVV9WVElOSEVSSVQuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZmluZF9ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1faG93dG9fdGFibGUgW2ldLnR5cGUgPT0gcl90eXBlKQotICAgICAgcmV0dXJuIGVsZjMyX2FybV9ob3d0b190YWJsZSArIGk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKLQotICBpZiAocl90eXBlIDw9IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gIGVsc2UKLSAgICBiZmRfcmVsb2MtPmhvd3RvID0gZmluZF9ob3d0byAocl90eXBlKTsKLX0KLQotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX05PTkUgfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNCB9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMiB9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBSX0FSTV9SRUwzMiB9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4IH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2IH0sCi0gIHtCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sICAgICAgIFJfQVJNX0FCUzEyIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1IH0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX1NCUkVMMzIgfSwKLSAge0JGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BUk1fQU1QX1ZDQUxMOSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBSX0FSTV9USE1fUEMxMSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksICBSX0FSTV9USE1fUEM5IH0sICAKLSAge0JGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgICAgICAgUl9BUk1fR05VX1ZUSU5IRVJJVCB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICBSX0FSTV9HTlVfVlRFTlRSWSB9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1fcmVsb2NfbWFwKTsgaS0tOykKLSAgICBpZiAoZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1faG93dG9fdGFibGUgW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICByZXR1cm4gZmluZF9ob3d0byAoUl9BUk1fUExUMzIpOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmY29kZS5oIGIvYmZkL2VsZmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjZTlkOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NCArMCwwIEBACi0vKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuICBTdWZmaWNpZW50IHN1cHBvcnQgZm9yIGdkYi4KLQotICAgUmV3cml0dGVuIGJ5IE1hcmsgRWljaGluIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24KLSAgIHB1Ymxpc2hlZCBpbiAiU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSIsIGNoYXB0ZXJzIDQKLSAgIGFuZCA1LCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzICJQcm9jZXNzb3IgU3VwcGxlbWVudCIgZG9jdW1lbnRzCi0gICBkZXJpdmVkIGZyb20gaXQuIEFkZGVkIHN1cHBvcnQgZm9yIGFzc2VtYmxlciBhbmQgb3RoZXIgb2JqZWN0IGZpbGUKLSAgIHV0aWxpdGllcy4gIEZ1cnRoZXIgd29yayBkb25lIGJ5IEtlbiBSYWVidXJuIChDeWdudXMgU3VwcG9ydCksIE1pY2hhZWwKLSAgIE1laXNzbmVyIChPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24pLCBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSAoVW5pdmVyc2l0eQotICAgb2YgVXRhaCkgdG8gZmluaXNoIGFuZCBleHRlbmQgdGhpcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBQcm9ibGVtcyBhbmQgb3RoZXIgaXNzdWVzIHRvIHJlc29sdmUuCi0KLSAgICgxKQlCRkQgZXhwZWN0cyB0aGVyZSB0byBiZSBzb21lIGZpeGVkIG51bWJlciBvZiAic2VjdGlvbnMiIGluCi0gICAgICAgIHRoZSBvYmplY3QgZmlsZS4gIEkuRS4gdGhlcmUgaXMgYSAic2VjdGlvbl9jb3VudCIgdmFyaWFibGUgaW4gdGhlCi0JYmZkIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSG93ZXZlciwgRUxGCi0Jc3VwcG9ydHMgbXVsdGlwbGUgInZpZXdzIiBvZiBhIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB3aXRoIGN1cnJlbnQKLQlpbXBsZW1lbnRhdGlvbnMsIGV4ZWN1dGFibGUgZmlsZXMgdHlwaWNhbGx5IGhhdmUgdHdvIHRhYmxlcywgYQotCXByb2dyYW0gaGVhZGVyIHRhYmxlIGFuZCBhIHNlY3Rpb24gaGVhZGVyIHRhYmxlLCBib3RoIG9mIHdoaWNoCi0JcGFydGl0aW9uIHRoZSBleGVjdXRhYmxlLgotCi0JSW4gRUxGLXNwZWFrLCB0aGUgImxpbmtpbmcgdmlldyIgb2YgdGhlIGZpbGUgdXNlcyB0aGUgc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSB0byBhY2Nlc3MgInNlY3Rpb25zIiB3aXRoaW4gdGhlIGZpbGUsIGFuZCB0aGUgImV4ZWN1dGlvbiB2aWV3IgotCXVzZXMgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlIHRvIGFjY2VzcyAic2VnbWVudHMiIHdpdGhpbiB0aGUgZmlsZS4KLQkiU2VnbWVudHMiIHR5cGljYWxseSBtYXkgY29udGFpbiBhbGwgdGhlIGRhdGEgZnJvbSBvbmUgb3IgbW9yZQotCSJzZWN0aW9ucyIuCi0KLQlOb3RlIHRoYXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG9wdGlvbmFsIGluIEVMRiBleGVjdXRhYmxlcywKLQlidXQgaXQgaXMgdGhpcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG1vc3QgdXNlZnVsIHRvIGdkYi4gIElmIHRoZQotCXNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG1pc3NpbmcsIHRoZW4gZ2RiIHNob3VsZCBwcm9iYWJseSB0cnkKLQl0byBtYWtlIGRvIHdpdGggdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKEZJWE1FKQotCi0gICAoMikgIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSBpbiAzMi1iaXQgbW9kZSBhbmQKLQlvbmNlIGluIDY0LWJpdCBtb2RlLiAgTW9yZSBvZiBpdCBzaG91bGQgYmUgbWFkZSBzaXplLWluZGVwZW5kZW50Ci0JYW5kIG1vdmVkIGludG8gZWxmLmMuCi0KLSAgICgzKQlFTEYgc2VjdGlvbiBzeW1ib2xzIGFyZSBoYW5kbGVkIHJhdGhlciBzbG9wcGlseSBub3cuICBUaGlzIHNob3VsZAotCWJlIGNsZWFuZWQgdXAsIGFuZCBFTEYgc2VjdGlvbiBzeW1ib2xzIHJlY29uY2lsZWQgd2l0aCBCRkQgc2VjdGlvbgotCXN5bWJvbHMuCi0KLSAgICg0KSAgV2UgbmVlZCBhIHB1Ymxpc2hlZCBzcGVjIGZvciA2NC1iaXQgRUxGLiAgV2UndmUgZ290IHNvbWUgc3R1ZmYgaGVyZQotCXRoYXQgd2UncmUgdXNpbmcgZm9yIFNQQVJDIFY5IDY0LWJpdCBjaGlwcywgYnV0IGRvbid0IGFzc3VtZSB0aGF0Ci0JaXQncyBjYXN0IGluIHN0b25lLgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBSZW5hbWluZyBzdHJ1Y3R1cmVzLCB0eXBlZGVmcywgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdG8gYmUgc2l6ZS1zcGVjaWZpYy4gICovCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9FaGRyCU5BTUUoRWxmLEV4dGVybmFsX0VoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TeW0JTkFNRShFbGYsRXh0ZXJuYWxfU3ltKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfU2hkcglOQU1FKEVsZixFeHRlcm5hbF9TaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUGhkcglOQU1FKEVsZixFeHRlcm5hbF9QaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsCU5BTUUoRWxmLEV4dGVybmFsX1JlbCkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbGEJTkFNRShFbGYsRXh0ZXJuYWxfUmVsYSkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX0R5bglOQU1FKEVsZixFeHRlcm5hbF9EeW4pCi0KLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBcCi0gIE5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZGVmaW5lIGVsZl9vYmplY3RfcAkJCU5BTUUoYmZkX2VsZixvYmplY3RfcCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9wCQkJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9wKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIE5BTUUoYmZkX2VsZixnZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2FfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2Nfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2Ffb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2Ffb3V0KQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9pbikKLSNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX291dAkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9keW5faW4JCQlOQU1FKGJmZF9lbGYsc3dhcF9keW5faW4pCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9vdXQpCi0jZGVmaW5lIGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgZWxmX3NsdXJwX3N5bWJvbF90YWJsZQkJTkFNRShiZmRfZWxmLHNsdXJwX3N5bWJvbF90YWJsZSkKLSNkZWZpbmUgZWxmX2dldF9zeW10YWIJCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYikKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIE5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0jZGVmaW5lIGVsZl9tYWtlX2VtcHR5X3N5bWJvbAkJTkFNRShiZmRfZWxmLG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBlbGZfZ2V0X3N5bWJvbF9pbmZvCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBlbGZfZ2V0X2xpbmVubwkJCU5BTUUoYmZkX2VsZixnZXRfbGluZW5vKQotI2RlZmluZSBlbGZfc2V0X2FyY2hfbWFjaAkJTkFNRShiZmRfZWxmLHNldF9hcmNoX21hY2gpCi0jZGVmaW5lIGVsZl9maW5kX25lYXJlc3RfbGluZQkJTkFNRShiZmRfZWxmLGZpbmRfbmVhcmVzdF9saW5lKQotI2RlZmluZSBlbGZfc2l6ZW9mX2hlYWRlcnMJCU5BTUUoYmZkX2VsZixzaXplb2ZfaGVhZGVycykKLSNkZWZpbmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCU5BTUUoYmZkX2VsZixzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG8JCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0b19yZWwJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG9fcmVsKQotI2RlZmluZSBlbGZfZmluZF9zZWN0aW9uCQlOQU1FKGJmZF9lbGYsZmluZF9zZWN0aW9uKQotI2RlZmluZSBlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMJTkFNRShiZmRfZWxmLGJmZF9saW5rX2FkZF9zeW1ib2xzKQotI2RlZmluZSBlbGZfYWRkX2R5bmFtaWNfZW50cnkJCU5BTUUoYmZkX2VsZixhZGRfZHluYW1pY19lbnRyeSkKLSNkZWZpbmUgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyCU5BTUUoYmZkX2VsZix3cml0ZV9zaGRyc19hbmRfZWhkcikKLSNkZWZpbmUgZWxmX3dyaXRlX291dF9waGRycwkJTkFNRShiZmRfZWxmLHdyaXRlX291dF9waGRycykKLSNkZWZpbmUgZWxmX3dyaXRlX3JlbG9jcwkJTkFNRShiZmRfZWxmLHdyaXRlX3JlbG9jcykKLSNkZWZpbmUgZWxmX3NsdXJwX3JlbG9jX3RhYmxlCQlOQU1FKGJmZF9lbGYsc2x1cnBfcmVsb2NfdGFibGUpCi0jZGVmaW5lIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLSAgTkFNRShiZmRfZWxmLGxpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0jZGVmaW5lIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JmZF9maW5hbF9saW5rCQlOQU1FKGJmZF9lbGYsYmZkX2ZpbmFsX2xpbmspCi0jZGVmaW5lIGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9nY19zZWN0aW9ucwkJCU5BTUUoX2JmZF9lbGYsZ2Nfc2VjdGlvbnMpCi0jZGVmaW5lIGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgXAotICBOQU1FKF9iZmRfZWxmLGdjX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cykKLSNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rCU5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsX2xpbmspCi0jZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGluaGVyaXQpCi0jZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRlbnRyeQkJTkFNRShfYmZkX2VsZixnY19yZWNvcmRfdnRlbnRyeSkKLSNkZWZpbmUgZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sIFwKLSAgTkFNRShfYmZkX2VsZixsaW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCkKLQotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGNjRfUl9JTkZPKFgsWSkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjY0X1JfU1lNKFgpCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGNjRfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTNjQKLSNkZWZpbmUgRklMRV9BTElHTgk4Ci0jZGVmaW5lIExPR19GSUxFX0FMSUdOCTMKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGMzJfUl9JTkZPKFgsWSkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjMyX1JfU1lNKFgpCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGMzJfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTMzIKLSNkZWZpbmUgRklMRV9BTElHTgk0Ci0jZGVmaW5lIExPR19GSUxFX0FMSUdOCTIKLSNlbmRpZgotCi0vKiBTdGF0aWMgZnVuY3Rpb25zICovCi0KLXN0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9FaGRyICosIEVsZl9JbnRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRWhkciAqLCBFbGZfRXh0ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfU2hkciAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0V4dGVybmFsX1NoZHIgKikpOwotCi0jZGVmaW5lIGVsZl9zdHJpbmd0YWJfaW5pdCBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdAotCi0jZGVmaW5lIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXgKLQotc3RhdGljIGJvb2xlYW4gZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGJmZF9zaXplX3R5cGUsCi0JICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9maWxlX3AgUEFSQU1TICgoRWxmX0V4dGVybmFsX0VoZHIgKikpOwotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGVsZl9kZWJ1Z19zZWN0aW9uIFBBUkFNUyAoKGludCwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX2RlYnVnX2ZpbGUgUEFSQU1TICgoRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIGNoYXIgKmVsZl9zeW1ib2xfZmxhZ3MgUEFSQU1TICgoZmxhZ3dvcmQpKTsKLSNlbmRpZgotDAotLyogU3RydWN0dXJlIHN3YXBwaW5nIHJvdXRpbmVzICovCi0KLS8qIFNob3VsZCBwZXJoYXBzIHVzZSBwdXRfb2Zmc2V0LCBwdXRfd29yZCwgZXRjLiAgRm9yIG5vdywgdGhlIHR3byB2ZXJzaW9ucwotICAgY2FuIGJlIGhhbmRsZWQgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDMyIGJpdHMgb3IgInRoZSBsb25nIHR5cGUiLiAgKi8KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzY0Ci0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF82NAotI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF82NAotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF8zMgotI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF8zMgotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfMzIKLSNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfMzIKLSNlbmRpZgotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGludGVybmFsCi0gICBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1N5bSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpkc3Q7Ci17Ci0gIGludCBzaWduZWRfdm1hID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zaWduX2V4dGVuZF92bWE7Ci0KLSAgZHN0LT5zdF9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9uYW1lKTsKLSAgaWYgKHNpZ25lZF92bWEpCi0gICAgZHN0LT5zdF92YWx1ZSA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOwotICBlbHNlCi0gICAgZHN0LT5zdF92YWx1ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF92YWx1ZSk7Ci0gIGRzdC0+c3Rfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9zaXplKTsKLSAgZHN0LT5zdF9pbmZvID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X2luZm8pOwotICBkc3QtPnN0X290aGVyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X290aGVyKTsKLSAgZHN0LT5zdF9zaG5keCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2huZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBpbnRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGV4dGVybmFsCi0gICBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsIHNyYywgY2RzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzcmM7Ci0gICAgIFBUUiBjZHN0OwotewotICBFbGZfRXh0ZXJuYWxfU3ltICpkc3QgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBjZHN0OwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c3RfbmFtZSwgZHN0LT5zdF9uYW1lKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3RfdmFsdWUsIGRzdC0+c3RfdmFsdWUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zdF9zaXplLCBkc3QtPnN0X3NpemUpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5zdF9pbmZvLCBkc3QtPnN0X2luZm8pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5zdF9vdGhlciwgZHN0LT5zdF9vdGhlcik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5zdF9zaG5keCwgZHN0LT5zdF9zaG5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgZmlsZSBoZWFkZXIgaW4KLSAgIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIGRzdC0+ZV90eXBlID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3R5cGUpOwotICBkc3QtPmVfbWFjaGluZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9tYWNoaW5lKTsKLSAgZHN0LT5lX3ZlcnNpb24gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfdmVyc2lvbik7Ci0gIGRzdC0+ZV9lbnRyeSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2VudHJ5KTsKLSAgZHN0LT5lX3Bob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhvZmYpOwotICBkc3QtPmVfc2hvZmYgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaG9mZik7Ci0gIGRzdC0+ZV9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9mbGFncyk7Ci0gIGRzdC0+ZV9laHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZWhzaXplKTsKLSAgZHN0LT5lX3BoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9waGVudHNpemUpOwotICBkc3QtPmVfcGhudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhudW0pOwotICBkc3QtPmVfc2hlbnRzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3NoZW50c2l6ZSk7Ci0gIGRzdC0+ZV9zaG51bSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaG51bSk7Ci0gIGRzdC0+ZV9zaHN0cm5keCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaHN0cm5keCk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX0VoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX0VoZHIgKmRzdDsKLXsKLSAgbWVtY3B5IChkc3QtPmVfaWRlbnQsIHNyYy0+ZV9pZGVudCwgRUlfTklERU5UKTsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV90eXBlLCBkc3QtPmVfdHlwZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX21hY2hpbmUsIGRzdC0+ZV9tYWNoaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfdmVyc2lvbiwgZHN0LT5lX3ZlcnNpb24pOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX2VudHJ5LCBkc3QtPmVfZW50cnkpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX3Bob2ZmLCBkc3QtPmVfcGhvZmYpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX3Nob2ZmLCBkc3QtPmVfc2hvZmYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+ZV9mbGFncywgZHN0LT5lX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfZWhzaXplLCBkc3QtPmVfZWhzaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfcGhlbnRzaXplLCBkc3QtPmVfcGhlbnRzaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfcGhudW0sIGRzdC0+ZV9waG51bSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3NoZW50c2l6ZSwgZHN0LT5lX3NoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3NobnVtLCBkc3QtPmVfc2hudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaHN0cm5keCwgZHN0LT5lX3Noc3RybmR4KTsKLX0KLQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuCi0gICBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfc2hkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgaW50IHNpZ25lZF92bWEgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnNpZ25fZXh0ZW5kX3ZtYTsKLQotICBkc3QtPnNoX25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX25hbWUpOwotICBkc3QtPnNoX3R5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX3R5cGUpOwotICBkc3QtPnNoX2ZsYWdzID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2ZsYWdzKTsKLSAgaWYgKHNpZ25lZF92bWEpCi0gICAgZHN0LT5zaF9hZGRyID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9hZGRyKTsKLSAgZWxzZQotICAgIGRzdC0+c2hfYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9hZGRyKTsKLSAgZHN0LT5zaF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfb2Zmc2V0KTsKLSAgZHN0LT5zaF9zaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX3NpemUpOwotICBkc3QtPnNoX2xpbmsgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2xpbmspOwotICBkc3QtPnNoX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2luZm8pOwotICBkc3QtPnNoX2FkZHJhbGlnbiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9hZGRyYWxpZ24pOwotICBkc3QtPnNoX2VudHNpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZW50c2l6ZSk7Ci0gIGRzdC0+YmZkX3NlY3Rpb24gPSBOVUxMOwotICBkc3QtPmNvbnRlbnRzID0gTlVMTDsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBpbnRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfU2hkciAqZHN0OwotewotICAvKiBub3RlIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGRzdCBhcmUgKmFycmF5cyBvZiB1bnNpZ25lZCBjaGFyKiBhbHJlYWR5Li4uICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9uYW1lLCBkc3QtPnNoX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfdHlwZSwgZHN0LT5zaF90eXBlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfZmxhZ3MsIGRzdC0+c2hfZmxhZ3MpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9hZGRyLCBkc3QtPnNoX2FkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9vZmZzZXQsIGRzdC0+c2hfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfc2l6ZSwgZHN0LT5zaF9zaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX2xpbmssIGRzdC0+c2hfbGluayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9pbmZvLCBkc3QtPnNoX2luZm8pOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9hZGRyYWxpZ24sIGRzdC0+c2hfYWRkcmFsaWduKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfZW50c2l6ZSwgZHN0LT5zaF9lbnRzaXplKTsKLX0KLQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuCi0gICBFTEYgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9waGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUGhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqZHN0OwotewotICBpbnQgc2lnbmVkX3ZtYSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+c2lnbl9leHRlbmRfdm1hOwotCi0gIGRzdC0+cF90eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3R5cGUpOwotICBkc3QtPnBfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfZmxhZ3MpOwotICBkc3QtPnBfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfb2Zmc2V0KTsKLSAgaWYgKHNpZ25lZF92bWEpCi0gICAgewotICAgICAgZHN0LT5wX3ZhZGRyID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3ZhZGRyKTsKLSAgICAgIGRzdC0+cF9wYWRkciA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9wYWRkcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZHN0LT5wX3ZhZGRyID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdmFkZHIpOwotICAgICAgZHN0LT5wX3BhZGRyID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfcGFkZHIpOwotICAgIH0KLSAgZHN0LT5wX2ZpbGVzeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZpbGVzeik7Ci0gIGRzdC0+cF9tZW1zeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX21lbXN6KTsKLSAgZHN0LT5wX2FsaWduID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfYWxpZ24pOwotfQotCi12b2lkCi1lbGZfc3dhcF9waGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF90eXBlLCBkc3QtPnBfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfb2Zmc2V0LCBkc3QtPnBfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF92YWRkciwgZHN0LT5wX3ZhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9wYWRkciwgZHN0LT5wX3BhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9maWxlc3osIGRzdC0+cF9maWxlc3opOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX21lbXN6LCBkc3QtPnBfbWVtc3opOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF9mbGFncywgZHN0LT5wX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9hbGlnbiwgZHN0LT5wX2FsaWduKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGV4dGVybmFsIGZvcm1hdCB0byBpbnRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGludGVybmFsIGZvcm1hdCB0byBleHRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7Ci0gIHB1dF9zaWduZWRfd29yZCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9keW5faW4gKGFiZmQsIHAsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQVFIgcDsKLSAgICAgRWxmX0ludGVybmFsX0R5biAqZHN0OwotewotICBjb25zdCBFbGZfRXh0ZXJuYWxfRHluICpzcmMgPSAoY29uc3QgRWxmX0V4dGVybmFsX0R5biAqKSBwOwotCi0gIGRzdC0+ZF90YWcgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3RhZyk7Ci0gIGRzdC0+ZF91bi5kX3ZhbCA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdW4uZF92YWwpOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfZHluX291dCAoYWJmZCwgc3JjLCBwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKnNyYzsKLSAgICAgUFRSIHA7Ci17Ci0gIEVsZl9FeHRlcm5hbF9EeW4gKmRzdCA9IChFbGZfRXh0ZXJuYWxfRHluICopIHA7Ci0KLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF90YWcsIGRzdC0+ZF90YWcpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5kX3VuLmRfdmFsLCBkc3QtPmRfdW4uZF92YWwpOwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLQotLyogQmVnaW4gcHJvY2Vzc2luZyBhIGdpdmVuIG9iamVjdC4KLQotICAgRmlyc3Qgd2UgdmFsaWRhdGUgdGhlIGZpbGUgYnkgcmVhZGluZyBpbiB0aGUgRUxGIGhlYWRlciBhbmQgY2hlY2tpbmcKLSAgIHRoZSBtYWdpYyBudW1iZXIuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJvb2xlYW4KLWVsZl9maWxlX3AgKHhfZWhkcnApCi0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICp4X2VoZHJwOwotewotICByZXR1cm4gKCh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzBdID09IEVMRk1BRzApCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcxXSA9PSBFTEZNQUcxKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMl0gPT0gRUxGTUFHMikKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzNdID09IEVMRk1BRzMpKTsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBBQkZEIG1hdGNoZXMgdGhlIHRhcmdldCB2ZWN0b3IKLSAgIHRoYXQgQUJGRCBwb2ludHMgdG8uCi0KLSAgIE5vdGUgdGhhdCB3ZSBtYXkgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgd2l0aCB0aGUgc2FtZSBBQkZELCBidXQgZGlmZmVyZW50Ci0gICB0YXJnZXQgdmVjdG9ycywgbW9zdCBvZiB3aGljaCB3aWxsIG5vdCBtYXRjaC4gIFdlIGhhdmUgdG8gYXZvaWQgbGVhdmluZwotICAgYW55IHNpZGUgZWZmZWN0cyBpbiBBQkZELCBvciBhbnkgZGF0YSBpdCBwb2ludHMgdG8gKGxpa2UgdGRhdGEpLCBpZiB0aGUKLSAgIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIHRhcmdldCB2ZWN0b3IuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9FeHRlcm5hbF9TaGRyIHhfc2hkcjsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnksIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKmlfc2hkcnAgPSBOVUxMOyAvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLSAgY2hhciAqc2hzdHJ0YWI7CQkvKiBJbnRlcm5hbCBjb3B5IG9mIHNlY3Rpb24gaGVhZGVyIHN0cmluZ3RhYiAqLwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkOwotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqcHJlc2VydmVkX3RkYXRhID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKm5ld190ZGF0YSA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIFJlYWQgaW4gdGhlIEVMRiBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoeF9laGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgZWxzZQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBOb3cgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSB2YWxpZCBFTEYgZmlsZSwgYW5kIG9uZSB0aGF0IEJGRCBjYW4KLSAgICAgbWFrZSB1c2Ugb2YuICBUaGUgbWFnaWMgbnVtYmVyIG11c3QgbWF0Y2gsIHRoZSBhZGRyZXNzIHNpemUgKCdjbGFzcycpCi0gICAgIGFuZCBieXRlLXN3YXBwaW5nIG11c3QgbWF0Y2ggb3VyIFhWRUMgZW50cnksIGFuZCBpdCBtdXN0IGhhdmUgYQotICAgICBzZWN0aW9uIGhlYWRlciB0YWJsZSAoRklYTUU6IFNlZSBjb21tZW50cyByZSBzZWN0aW9ucyBhdCB0b3Agb2YgdGhpcwotICAgICBmaWxlKS4gKi8KLQotICBpZiAoKGVsZl9maWxlX3AgKCZ4X2VoZHIpID09IGZhbHNlKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQpIHx8Ci0gICAgICAoeF9laGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTKSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogQ2hlY2sgdGhhdCBmaWxlJ3MgYnl0ZSBvcmRlciBtYXRjaGVzIHh2ZWMncyAqLwotICBzd2l0Y2ggKHhfZWhkci5lX2lkZW50W0VJX0RBVEFdKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOgkJLyogQmlnLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgkJLyogTGl0dGxlLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEFOT05FOgkJLyogTm8gZGF0YSBlbmNvZGluZyBzcGVjaWZpZWQgKi8KLSAgICBkZWZhdWx0OgkJCS8qIFVua25vd24gZGF0YSBlbmNvZGluZyBzcGVjaWZpZWQgKi8KLSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVsZl9vYmpfdGRhdGEgc3RydWN0dXJlIGFuZCBob29rIGl0IHVwIHRvCi0gICAgIHRoZSB0ZGF0YSBwb2ludGVyIGluIHRoZSBiZmQuICAqLwotCi0gIG5ld190ZGF0YSA9ICgoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBlbGZfdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGJ5dGUgb3JkZXIsIHN3YXAgaW4gdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciAqLwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsICZ4X2VoZHIsIGlfZWhkcnApOwotI2lmIERFQlVHICYgMQotICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7Ci0jZW5kaWYKLQotICAvKiBSZWplY3QgRVRfQ09SRSAoaGVhZGVyIGluZGljYXRlcyBjb3JlIGZpbGUsIG5vdCBvYmplY3QgZmlsZSkgKi8KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9DT1JFKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBJZiB0aGVyZSBpcyBubyBzZWN0aW9uIGhlYWRlciB0YWJsZSwgd2UncmUgaG9zZWQuICovCi0gIGlmIChpX2VoZHJwLT5lX3Nob2ZmID09IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIEFzIGEgc2ltcGxlIHNhbml0eSBjaGVjaywgdmVyaWZ5IHRoYXQgdGhlIHdoYXQgQkZEIHRoaW5rcyBpcyB0aGUKLSAgICAgc2l6ZSBvZiBlYWNoIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGFjdHVhbGx5IG1hdGNoZXMgdGhlIHNpemUKLSAgICAgcmVjb3JkZWQgaW4gdGhlIGZpbGUuICovCi0gIGlmIChpX2VoZHJwLT5lX3NoZW50c2l6ZSAhPSBzaXplb2YgKHhfc2hkcikpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBFTEYgZV9tYWNoaW5lIGZpZWxkIG1hdGNoZXMgd2hhdCB0aGlzIHBhcnRpY3VsYXIKLSAgICAgQkZEIGZvcm1hdCBleHBlY3RzLiAgKi8KLSAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBpX2VoZHJwLT5lX21hY2hpbmUKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDEgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQxKQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MiA9PSAwIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDIpKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0X3B0cjsKLQotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgTGV0IGl0IG1hdGNoIGFueSBFTEYgdGFyZ2V0Ci0JIGZvciB3aGljaCB3ZSBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIGJhY2tlbmQuICAqLwotICAgICAgZm9yICh0YXJnZXRfcHRyID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXRfcHRyICE9IE5VTEw7IHRhcmdldF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmFjazsKLQotCSAgaWYgKCgqdGFyZ2V0X3B0ciktPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgY29udGludWU7Ci0JICBiYWNrID0gKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopICgqdGFyZ2V0X3B0ciktPmJhY2tlbmRfZGF0YTsKLQkgIGlmIChiYWNrLT5lbGZfbWFjaGluZV9jb2RlID09IGlfZWhkcnAtPmVfbWFjaGluZQotCSAgICAgIHx8IChiYWNrLT5lbGZfbWFjaGluZV9hbHQxICE9IDAKLQkJICAmJiBiYWNrLT5lbGZfbWFjaGluZV9hbHQxID09IGlfZWhkcnAtPmVfbWFjaGluZSkKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MiAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MiA9PSBpX2VoZHJwLT5lX21hY2hpbmUpKQotCSAgICB7Ci0JICAgICAgLyogdGFyZ2V0X3B0ciBpcyBhbiBFTEYgYmFja2VuZCB3aGljaCBtYXRjaGVzIHRoaXMKLQkJIG9iamVjdCBmaWxlLCBzbyByZWplY3QgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gICovCi0JICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0VYRUMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBlbHNlIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfRFlOKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgaWYgKGlfZWhkcnAtPmVfcGhudW0gPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgZWJkLT5hcmNoLCAwKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIE9LIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBnZW5lcmljIHRhcmdldC4gICovCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSBlbnRyeSBwb2ludCBzcGVjaWZpZWQgaW4gdGhlIEVMRiBmaWxlIGhlYWRlci4gKi8KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGlfZWhkcnAtPmVfZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgY29weSBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4KLSAgICAgaW50ZXJuYWwgZm9ybSwgc2VlayB0byB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gdGhlIGZpbGUsCi0gICAgIHJlYWQgaXQgaW4sIGFuZCBjb252ZXJ0IGl0IHRvIGludGVybmFsIGZvcm0uICAqLwotICBpX3NoZHJwID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCppX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKSA9ICgoRWxmX0ludGVybmFsX1NoZHIgKiopCi0JCQkgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgICBzaXplb2YgKGlfc2hkcnApICogaV9laGRycC0+ZV9zaG51bSkpOwotICBpZiAoIWlfc2hkcnAgfHwgIWVsZl9lbGZzZWN0aW9ucyAoYWJmZCkpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgaV9laGRycC0+ZV9zaG9mZiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0gIGZvciAoc2hpbmRleCA9IDA7IHNoaW5kZXggPCBpX2VoZHJwLT5lX3NobnVtOyBzaGluZGV4KyspCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfc2hkciwgc2l6ZW9mIHhfc2hkciwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X3NoZHIpKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgZWxmX3N3YXBfc2hkcl9pbiAoYWJmZCwgJnhfc2hkciwgaV9zaGRycCArIHNoaW5kZXgpOwotICAgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGlfc2hkcnAgKyBzaGluZGV4OwotCi0gICAgICAvKiBJZiB0aGUgc2VjdGlvbiBpcyBsb2FkZWQsIGJ1dCBub3QgcGFnZSBhbGlnbmVkLCBjbGVhcgotICAgICAgICAgRF9QQUdFRC4gICovCi0gICAgICBpZiAoKGlfc2hkcnBbc2hpbmRleF0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKLQkgICYmIGlfc2hkcnBbc2hpbmRleF0uc2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JICAmJiAoKChpX3NoZHJwW3NoaW5kZXhdLnNoX2FkZHIgLSBpX3NoZHJwW3NoaW5kZXhdLnNoX29mZnNldCkKLQkgICAgICAgJSBlYmQtPm1heHBhZ2VzaXplKQotCSAgICAgICE9IDApKQotCWFiZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgIH0KLSAgaWYgKGlfZWhkcnAtPmVfc2hzdHJuZHgpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBpX2VoZHJwLT5lX3Noc3RybmR4KSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhudW0gPT0gMCkKLSAgICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9ICgoRWxmX0ludGVybmFsX1BoZHIgKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpX2VoZHJwLT5lX3BobnVtCi0JCQkJCSAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKSkpOwotICAgICAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPT0gTlVMTCkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9laGRycC0+ZV9waG9mZiwgU0VFS19TRVQpICE9IDApCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpX3BoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGlfZWhkcnAtPmVfcGhudW07IGkrKywgaV9waGRyKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1BoZHIgeF9waGRyOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiB4X3BoZHIsIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIHhfcGhkcikKLQkgICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0JICBlbGZfc3dhcF9waGRyX2luIChhYmZkLCAmeF9waGRyLCBpX3BoZHIpOwotCX0KLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBzZWN0aW9ucy4gIFdlCi0gICAgIHdpbGwgbmVlZCB0aGUgYmFzZSBwb2ludGVyIHRvIHRoaXMgdGFibGUgbGF0ZXIuICovCi0gIC8qIFdlIHJlYWQgdGhpcyBpbmxpbmUgbm93LCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZ28gdGhyb3VnaAotICAgICBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgd2l0aCBpdCAoc2luY2UgdGhpcyBwYXJ0aWN1bGFyIHN0cnRhYiBpcwotICAgICB1c2VkIHRvIGZpbmQgYWxsIG9mIHRoZSBFTEYgc2VjdGlvbiBuYW1lcy4pICovCi0KLSAgc2hzdHJ0YWIgPSBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCk7Ci0gIGlmICghc2hzdHJ0YWIpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgLyogT25jZSBhbGwgb2YgdGhlIHNlY3Rpb24gaGVhZGVycyBoYXZlIGJlZW4gcmVhZCBhbmQgY29udmVydGVkLCB3ZQotICAgICBjYW4gc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBzZWN0aW9uIGhlYWRlciBpcwotICAgICBhIGR1bW15IHBsYWNlaG9sZGVyIGVudHJ5LCBzbyB3ZSBpZ25vcmUgaXQuICAqLwotCi0gIGZvciAoc2hpbmRleCA9IDE7IHNoaW5kZXggPCBpX2VoZHJwLT5lX3NobnVtOyBzaGluZGV4KyspCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIGRvdWJsZSBjaGVjayB0aGUgZm9ybWF0IGFuZCBvdmVycmlkZSBnbG9iYWwKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkKLSAgICB7Ci0gICAgICBpZiAoKCplYmQtPmVsZl9iYWNrZW5kX29iamVjdF9wKSAoYWJmZCkgPT0gZmFsc2UpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYW55IHJlbG9jIHNlY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aAotICAgICBkZWJ1Z2dpbmcgc2VjdGlvbnMsIG1hcmsgdGhlIHJlbG9jIHNlY3Rpb25zIGFzIGRlYnVnZ2luZyBhcyB3ZWxsLiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfaW5mbyA+IDApCi0JewotCSAgdW5zaWduZWQgbG9uZyB0YXJnX2luZGV4OwotCSAgYXNlY3Rpb24gKnRhcmdfc2VjOwotCi0JICB0YXJnX2luZGV4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm87Ci0JICB0YXJnX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCB0YXJnX2luZGV4KTsKLQkgIGlmICh0YXJnX3NlYyAhPSBOVUxMCi0JICAgICAgJiYgKHRhcmdfc2VjLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JICAgIHMtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi0gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gZ290X25vX21hdGNoOgotICBpZiAobmV3X3RkYXRhICE9IE5VTEwKLSAgICAgICYmIG5ld190ZGF0YS0+ZWxmX3NlY3RfcHRyICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YS0+ZWxmX3NlY3RfcHRyKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaV9zaGRycCk7Ci0gIGlmIChuZXdfdGRhdGEgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmV3X3RkYXRhKTsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgcmV0dXJuIChOVUxMKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgd3JpdGluZyAqLwotCi0vKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0KLXZvaWQKLWVsZl93cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgYm9vbGVhbiAqZmFpbGVkcCA9IChib29sZWFuICopIGRhdGE7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxhX2hkcjsKLSAgRWxmX0V4dGVybmFsX1JlbGEgKm91dGJvdW5kX3JlbG9jYXM7Ci0gIEVsZl9FeHRlcm5hbF9SZWwgKm91dGJvdW5kX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgaW50IHVzZV9yZWxhX3A7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbGFfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHI7Ci0KLSAgcmVsYV9oZHItPnNoX3NpemUgPSByZWxhX2hkci0+c2hfZW50c2l6ZSAqIHNlYy0+cmVsb2NfY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlbG9jYXRpb25zIGFyZSBSRUxBIG9yIFJFTCByZWxvY2F0aW9ucy4gICovCi0gIGlmIChyZWxhX2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLSAgICB1c2VfcmVsYV9wID0gdHJ1ZTsKLSAgZWxzZSBpZiAocmVsYV9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLSAgICB1c2VfcmVsYV9wID0gZmFsc2U7Ci0gIGVsc2UKLSAgICAvKiBFdmVyeSByZWxvY2F0aW9uIHNlY3Rpb24gc2hvdWxkIGJlIGVpdGhlciBhbiBTSFRfUkVMQSBvciBhbgotICAgICAgIFNIVF9SRUwgc2VjdGlvbi4gICovCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogb3JlbG9jYXRpb24gaGFzIHRoZSBkYXRhLCByZWxvY19jb3VudCBoYXMgdGhlIGNvdW50Li4uICovCi0gIGlmICh1c2VfcmVsYV9wKQotICAgIHsKLSAgICAgIG91dGJvdW5kX3JlbG9jYXMgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzOwotCi0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhIGRzdF9yZWxhOwotCSAgRWxmX0V4dGVybmFsX1JlbGEgKnNyY19yZWxhOwotCSAgYXJlbGVudCAqcHRyOwotCSAgYXN5bWJvbCAqc3ltOwotCSAgaW50IG47Ci0KLQkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQkgIHNyY19yZWxhID0gb3V0Ym91bmRfcmVsb2NhcyArIGlkeDsKLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCSAgICBkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLQkgIGVsc2UKLQkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3MgKyBzZWMtPnZtYTsKLQotCSAgc3ltID0gKnB0ci0+c3ltX3B0cl9wdHI7Ci0JICBpZiAoc3ltID09IGxhc3Rfc3ltKQotCSAgICBuID0gbGFzdF9zeW1faWR4OwotCSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIHN5bS0+dmFsdWUgPT0gMCkKLQkgICAgbiA9IFNUTl9VTkRFRjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxhc3Rfc3ltID0gc3ltOwotCSAgICAgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgICAgICBpZiAobiA8IDApCi0JCXsKLQkJICAqZmFpbGVkcCA9IHRydWU7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgbGFzdF9zeW1faWR4ID0gbjsKLQkgICAgfQotCi0JICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCi0JICAgICAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgZHN0X3JlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLQkgIGRzdF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7Ci0JICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmZHN0X3JlbGEsIHNyY19yZWxhKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgLyogUkVMIHJlbG9jYXRpb25zICovCi0gICAgewotICAgICAgb3V0Ym91bmRfcmVsb2NzID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsYV9oZHItPmNvbnRlbnRzOwotCi0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWwgZHN0X3JlbDsKLQkgIEVsZl9FeHRlcm5hbF9SZWwgKnNyY19yZWw7Ci0JICBhcmVsZW50ICpwdHI7Ci0JICBpbnQgbjsKLQkgIGFzeW1ib2wgKnN5bTsKLQotCSAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCSAgc3ltID0gKnB0ci0+c3ltX3B0cl9wdHI7Ci0JICBzcmNfcmVsID0gb3V0Ym91bmRfcmVsb2NzICsgaWR4OwotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JICAgICBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgICAgIFRoZSBhZGRyZXNzIG9mIGEgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCi0JICAgIGRzdF9yZWwucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIGRzdF9yZWwucl9vZmZzZXQgPSBwdHItPmFkZHJlc3MgKyBzZWMtPnZtYTsKLQotCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JICAgIG4gPSBTVE5fVU5ERUY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWwucl9pbmZvID0gRUxGX1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLQkgIGVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmRzdF9yZWwsIHNyY19yZWwpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotaW50Ci1lbGZfd3JpdGVfb3V0X3BoZHJzIChhYmZkLCBwaGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciBleHRwaGRyOwotICAgICAgZWxmX3N3YXBfcGhkcl9vdXQgKGFiZmQsIHBoZHIsICZleHRwaGRyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZleHRwaGRyLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpKQotCXJldHVybiAtMTsKLSAgICAgIHBoZHIrKzsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVycyBhbmQgdGhlIEVMRiBmaWxlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWVsZl93cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9FeHRlcm5hbF9TaGRyICp4X3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotCi0gIC8qIHN3YXAgdGhlIGhlYWRlciBiZWZvcmUgc3BpdHRpbmcgaXQgb3V0Li4uICovCi0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0gIGVsZl9zd2FwX2VoZHJfb3V0IChhYmZkLCBpX2VoZHJwLCAmeF9laGRyKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh4X2VoZHIpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXQgdGhpcyBwb2ludCB3ZSd2ZSBjb25jb2N0ZWQgYWxsIHRoZSBFTEYgc2VjdGlvbnMuLi4gKi8KLSAgeF9zaGRycCA9IChFbGZfRXh0ZXJuYWxfU2hkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqeF9zaGRycCkgKiAoaV9laGRycC0+ZV9zaG51bSkpOwotICBpZiAoIXhfc2hkcnApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotI2lmIERFQlVHICYgMgotICAgICAgZWxmX2RlYnVnX3NlY3Rpb24gKGNvdW50LCBpX3NoZHJwW2NvdW50XSk7Ci0jZW5kaWYKLSAgICAgIGVsZl9zd2FwX3NoZHJfb3V0IChhYmZkLCBpX3NoZHJwW2NvdW50XSwgeF9zaGRycCArIGNvdW50KTsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBpX2VoZHJwLT5lX3Nob2ZmLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgeF9zaGRycCwgc2l6ZW9mICgqeF9zaGRycCksIGlfZWhkcnAtPmVfc2hudW0sIGFiZmQpCi0JICAhPSBzaXplb2YgKCp4X3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBuZWVkIHRvIGR1bXAgdGhlIHN0cmluZyB0YWJsZSB0b28uLi4gKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotZWxmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCwgc3ltcHRycywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltcHRyczsJCS8qIEJ1ZmZlciBmb3IgZ2VuZXJhdGVkIGJmZCBzeW1ib2xzICovCi0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnZlcmhkcjsKLSAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsJLyogTnVtYmVyIG9mIGV4dGVybmFsIEVMRiBzeW1ib2xzICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltOwkJLyogUG9pbnRlciB0byBjdXJyZW50IGJmZCBzeW1ib2wgKi8KLSAgZWxmX3N5bWJvbF90eXBlICpzeW1iYXNlOwkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGlfc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICp4X3N5bXAgPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICp4X3ZlcnN5bXAgPSBOVUxMOwotCi0gIC8qIFJlYWQgZWFjaCByYXcgRUxGIHN5bWJvbCwgY29udmVydGluZyBmcm9tIGV4dGVybmFsIEVMRiBmb3JtIHRvCi0gICAgIGludGVybmFsIEVMRiBmb3JtLCBhbmQgdGhlbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIGEKLSAgICAgY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGUgZW50cnkuCi0KLSAgICAgTm90ZSB0aGF0IHdlIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJmZCBjYW5vbmljYWwgc3ltYm9sIGJ1ZmZlcgotICAgICBiYXNlZCBvbiBhIG9uZS10by1vbmUgbWFwcGluZyBvZiB0aGUgRUxGIHN5bWJvbHMgdG8gY2Fub25pY2FsCi0gICAgIHN5bWJvbHMuICBXZSBhY3R1YWxseSB1c2UgYWxsIHRoZSBFTEYgc3ltYm9scywgc28gdGhlcmUgd2lsbCBiZSBubwotICAgICBzcGFjZSBsZWZ0IG92ZXIgYXQgdGhlIGVuZC4gIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlCi0gICAgIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgdmVyaGRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSA9PSAwKQotCXZlcmhkciA9IE5VTEw7Ci0gICAgICBlbHNlCi0JdmVyaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHI7Ci0gICAgICBpZiAoKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9zZWN0aW9uICE9IDAKLQkgICAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQkgIHx8IChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwCi0JICAgICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiAtMTsKLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgc3ltID0gc3ltYmFzZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHN5bWJhc2UgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKQotCQkgYmZkX3phbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGVsZl9zeW1ib2xfdHlwZSkpKTsKLSAgICAgIGlmIChzeW1iYXNlID09IChlbGZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBzeW0gPSBzeW1iYXNlOwotCi0gICAgICAvKiBUZW1wb3JhcmlseSBhbGxvY2F0ZSByb29tIGZvciB0aGUgcmF3IEVMRiBzeW1ib2xzLiAgKi8KLSAgICAgIHhfc3ltcCA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQliZmRfbWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgICAgIGlmICh4X3N5bXAgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfc3ltcCwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgc3ltY291bnQsIGFiZmQpCi0JICAhPSBzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHJhdyBFTEYgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwKLQkgICYmIHZlcmhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSkgIT0gc3ltY291bnQpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdmVyc2lvbiBjb3VudCAoJWxkKSBkb2VzIG5vdCBtYXRjaCBzeW1ib2wgY291bnQgKCVsZCkiKSwKLQkgICAgIGFiZmQtPmZpbGVuYW1lLAotCSAgICAgKGxvbmcpICh2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pKSwKLQkgICAgIHN5bWNvdW50KTsKLQotCSAgLyogU2x1cnAgaW4gdGhlIHN5bWJvbHMgd2l0aG91dCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG1vcmUgaGVscGZ1bCB0aGFuIGp1c3QgcXVpdHRpbmcuICAqLwotCSAgdmVyaGRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh2ZXJoZHIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcmhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHhfdmVyc3ltcCA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKHZlcmhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoeF92ZXJzeW1wID09IE5VTEwgJiYgdmVyaGRyLT5zaF9zaXplICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfdmVyc3ltcCwgMSwgdmVyaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgICAgICE9IHZlcmhkci0+c2hfc2l6ZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTa2lwIGZpcnN0IHN5bWJvbCwgd2hpY2ggaXMgYSBudWxsIGR1bW15LiAgKi8KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBzeW1jb3VudDsgaSsrKQotCXsKLQkgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgeF9zeW1wICsgaSwgJmlfc3ltKTsKLQkgIG1lbWNweSAoJnN5bS0+aW50ZXJuYWxfZWxmX3N5bSwgJmlfc3ltLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLSNpZmRlZiBFTEZfS0VFUF9FWFRTWU0KLQkgIG1lbWNweSAoJnN5bS0+bmF0aXZlX2VsZl9zeW0sIHhfc3ltcCArIGksIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotI2VuZGlmCi0JICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotCSAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJICAgICAgaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICAgIGlfc3ltLnN0X25hbWUpOwotCi0JICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3ZhbHVlOwotCi0JICBpZiAoaV9zeW0uc3Rfc2huZHggPiAwICYmIGlfc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICBpX3N5bS5zdF9zaG5keCk7Ci0JICAgICAgaWYgKHN5bS0+c3ltYm9sLnNlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCQkgICAgIGNyZWF0ZSBhIEJGRCBzZWN0aW9uLiAgSnVzdCB1c2UgYmZkX2Fic19zZWN0aW9uLAotCQkgICAgIGFsdGhvdWdoIGl0IGlzIHdyb25nLiAgRklYTUUuICAqLwotCQkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIC8qIEVsZiBwdXRzIHRoZSBhbGlnbm1lbnQgaW50byB0aGUgYHZhbHVlJyBmaWVsZCwgYW5kCi0JCSB0aGUgc2l6ZSBpbnRvIHRoZSBgc2l6ZScgZmllbGQuICBCRkQgd2FudHMgdG8gc2VlIHRoZQotCQkgc2l6ZSBpbiB0aGUgdmFsdWUgZmllbGQsIGFuZCBkb2Vzbid0IGNhcmUgKGF0IHRoZQotCQkgbW9tZW50KSBhYm91dCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3NpemU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHRoZW4gdGhlIHN5bWJvbCB2YWx1ZSBpcwotICAgICAgICAgICAgIGFscmVhZHkgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSAhPSAwKQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX0JJTkQgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RCX0xPQ0FMOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9MT0NBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfR0xPQkFMOgotCSAgICAgIGlmIChpX3N5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkJICAmJiBpX3N5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUQl9XRUFLOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9XRUFLOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RUX1NFQ1RJT046Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNIHwgQlNGX0RFQlVHR0lORzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfRklMRToKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRklMRSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZVTkM6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9PQkpFQ1Q6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoZHluYW1pYykKLQkgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RZTkFNSUM7Ci0KLQkgIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCB4X3ZlcnN5bXAgKyBpLCAmaXZlcnN5bSk7Ci0JICAgICAgc3ltLT52ZXJzaW9uID0gaXZlcnN5bS52c192ZXJzOwotCSAgICB9Ci0KLQkgIC8qIERvIHNvbWUgYmFja2VuZC1zcGVjaWZpYyBwcm9jZXNzaW5nIG9uIHRoaXMgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQkgICAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpCi0JICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSAoYWJmZCwgJnN5bS0+c3ltYm9sKTsKLQkgIH0KLQotCSAgc3ltKys7Ci0JfQotICAgIH0KLQotICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKQotICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSAoYWJmZCwgc3ltYmFzZSwgc3ltY291bnQpOwotICB9Ci0KLSAgLyogV2UgcmVseSBvbiB0aGUgemFsbG9jIHRvIGNsZWFyIG91dCB0aGUgZmluYWwgc3ltYm9sIGVudHJ5LiAgKi8KLQotICBzeW1jb3VudCA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogRmlsbCBpbiB0aGUgdXNlcidzIHN5bWJvbCBwb2ludGVyIHZlY3RvciBpZiBuZWVkZWQuICAqLwotICBpZiAoc3ltcHRycykKLSAgICB7Ci0gICAgICBsb25nIGwgPSBzeW1jb3VudDsKLQotICAgICAgc3ltID0gc3ltYmFzZTsKLSAgICAgIHdoaWxlIChsLS0gPiAwKQotCXsKLQkgICpzeW1wdHJzKysgPSAmc3ltLT5zeW1ib2w7Ci0JICBzeW0rKzsKLQl9Ci0gICAgICAqc3ltcHRycyA9IDA7CQkvKiBGaW5hbCBudWxsIHBvaW50ZXIgKi8KLSAgICB9Ci0KLSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfdmVyc3ltcCk7Ci0gIGlmICh4X3N5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3N5bXApOwotICByZXR1cm4gc3ltY291bnQ7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBSZWFkICByZWxvY2F0aW9ucyBmb3IgQVNFQ1QgZnJvbSBSRUxfSERSLiAgVGhlcmUgYXJlIFJFTE9DX0NPVU5UIG9mIAotICAgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgcmVsb2NfY291bnQsCi0JCQkJICAgIHJlbGVudHMsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgICAgYXJlbGVudCAqcmVsZW50czsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0KLSAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgZW50c2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemU7Ci0gIEJGRF9BU1NFUlQgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKQotCSAgICAgIHx8IGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGZvciAoaSA9IDAsIHJlbGVudCA9IHJlbGVudHM7Ci0gICAgICAgaSA8IHJlbG9jX2NvdW50OwotICAgICAgIGkrKywgcmVsZW50KyssIG5hdGl2ZV9yZWxvY3MgKz0gZW50c2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKQotCWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsICZyZWxhKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWwgKikgbmF0aXZlX3JlbG9jcywgJnJlbCk7Ci0JICByZWxhLnJfb2Zmc2V0ID0gcmVsLnJfb2Zmc2V0OwotCSAgcmVsYS5yX2luZm8gPSByZWwucl9pbmZvOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIG5vcm1hbCBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUsCi0JIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGR5bmFtaWMgcmVsb2MgaXMgYWJzb2x1dGUuLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAgfHwgZHluYW1pYykKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0gICAgICBpZiAoRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgPT0gMCkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgYXN5bWJvbCAqKnBzLCAqczsKLQotCSAgcHMgPSBzeW1ib2xzICsgRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgLSAxOwotCSAgcyA9ICpwczsKLQotCSAgLyogQ2Fub25pY2FsaXplIEVMRiBzZWN0aW9uIHN5bWJvbHMuICBGSVhNRTogV2h5PyAgKi8KLQkgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsZW50LT5hZGRlbmQgPSByZWxhLnJfYWRkZW5kOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG8pIChhYmZkLCByZWxlbnQsICZyZWxhKTsKLSAgICAgIGVsc2UKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG9fcmVsKSAoYWJmZCwgcmVsZW50LCAmcmVsKTsKLSAgICB9Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLWVsZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHIyOwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50MjsKLSAgYXJlbGVudCAqcmVsZW50czsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT5yZWxfaGRyOwotICAgICAgcmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIHJlbF9oZHIyID0gZC0+cmVsX2hkcjI7Ci0gICAgICByZWxvY19jb3VudDIgPSAocmVsX2hkcjIgCi0JCSAgICAgID8gKHJlbF9oZHIyLT5zaF9zaXplIC8gcmVsX2hkcjItPnNoX2VudHNpemUpCi0JCSAgICAgIDogMCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxvY19jb3VudCA9PSByZWxvY19jb3VudCArIHJlbG9jX2NvdW50Mik7Ci0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkci0+c2hfb2Zmc2V0Ci0JCSAgfHwgKHJlbF9oZHIyICYmIGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyMi0+c2hfb2Zmc2V0KSk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgQVNFQ1QtPlJFTE9DX0NPVU5UIHRlbmRzIG5vdCB0byBiZSBhY2N1cmF0ZSBpbiB0aGlzCi0JIGNhc2UgYmVjYXVzZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoaXMgc2VjdGlvbiBtYXkgdXNlIHRoZQotCSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYW5kIGluIHRoYXQgY2FzZSBiZmRfc2VjdGlvbl9mcm9tX3NoZHIKLQkgaW4gZWxmLmMgZG9lcyBub3QgdXBkYXRlIHRoZSBSRUxPQ19DT1VOVC4gICovCi0gICAgICBpZiAoYXNlY3QtPl9yYXdfc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnRoaXNfaGRyOwotICAgICAgcmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIHJlbF9oZHIyID0gTlVMTDsKLSAgICAgIHJlbG9jX2NvdW50MiA9IDA7Ci0gICAgfQotCi0gIHJlbGVudHMgPSAoKGFyZWxlbnQgKikgCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIAotCQkJKHJlbG9jX2NvdW50ICsgcmVsb2NfY291bnQyKSAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKHJlbGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwKLQkJCQkJICAgcmVsX2hkciwgcmVsb2NfY291bnQsCi0JCQkJCSAgIHJlbGVudHMsCi0JCQkJCSAgIHN5bWJvbHMsIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmIChyZWxfaGRyMiAKLSAgICAgICYmICFlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwKLQkJCQkJICAgICAgcmVsX2hkcjIsIHJlbG9jX2NvdW50MiwKLQkJCQkJICAgICAgcmVsZW50cyArIHJlbG9jX2NvdW50LAotCQkJCQkgICAgICBzeW1ib2xzLCBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsZW50czsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQKLWVsZl9kZWJ1Z19zZWN0aW9uIChudW0sIGhkcikKLSAgICAgaW50IG51bTsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TZWN0aW9uIyVkICclcycgMHglLjhseFxuIiwgbnVtLAotCSAgIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCA/IGhkci0+YmZkX3NlY3Rpb24tPm5hbWUgOiAiIiwKLQkgICAobG9uZykgaGRyKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9uYW1lICAgICAgPSAlbGRcdHNoX3R5cGUgICAgICA9ICVsZFx0c2hfZmxhZ3MgICAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX25hbWUsCi0JICAgKGxvbmcpIGhkci0+c2hfdHlwZSwKLQkgICAobG9uZykgaGRyLT5zaF9mbGFncyk7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfYWRkciAgICAgID0gJWxkXHRzaF9vZmZzZXQgICAgPSAlbGRcdHNoX3NpemUgICAgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9hZGRyLAotCSAgIChsb25nKSBoZHItPnNoX29mZnNldCwKLQkgICAobG9uZykgaGRyLT5zaF9zaXplKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9saW5rICAgICAgPSAlbGRcdHNoX2luZm8gICAgICA9ICVsZFx0c2hfYWRkcmFsaWduID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2xpbmssCi0JICAgKGxvbmcpIGhkci0+c2hfaW5mbywKLQkgICAobG9uZykgaGRyLT5zaF9hZGRyYWxpZ24pOwotICBmcHJpbnRmIChzdGRlcnIsICJzaF9lbnRzaXplICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfZW50c2l6ZSk7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9kZWJ1Z19maWxlIChlaGRycCkKLSAgICAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHJwOwotewotICBmcHJpbnRmIChzdGRlcnIsICJlX2VudHJ5ICAgICAgPSAweCUuOGx4XG4iLCAobG9uZykgZWhkcnAtPmVfZW50cnkpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3Bob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waG9mZik7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3BobnVtKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhlbnRzaXplKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaG9mZiAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hvZmYpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3NobnVtICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG51bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hlbnRzaXplICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NoZW50c2l6ZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWVsZl9zeW1ib2xfZmxhZ3MgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCi0gIGJ1ZmZlclswXSA9ICdcMCc7Ci0gIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBsb2NhbCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZ2xvYmFsIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkZWJ1ZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9GVU5DVElPTikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmdW5jdGlvbiIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9LRUVQKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXAiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfS0VFUF9HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXBfZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9XRUFLKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdlYWsiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgc3RyY2F0IChidWZmZXIsICIgc2VjdGlvbi1zeW0iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfT0xEX0NPTU1PTikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBvbGQtY29tbW9uIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX05PVF9BVF9FTkQpCi0gICAgc3RyY2F0IChidWZmZXIsICIgbm90LWF0LWVuZCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBjb25zdHJ1Y3RvciIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9XQVJOSU5HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdhcm5pbmciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpCi0gICAgc3RyY2F0IChidWZmZXIsICIgaW5kaXJlY3QiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfRklMRSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmaWxlIik7Ci0KLSAgaWYgKGZsYWdzICYgRFlOQU1JQykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkeW5hbWljIik7Ci0KLSAgaWYgKGZsYWdzICYgfihCU0ZfTE9DQUwKLQkJfCBCU0ZfR0xPQkFMCi0JCXwgQlNGX0RFQlVHR0lORwotCQl8IEJTRl9GVU5DVElPTgotCQl8IEJTRl9LRUVQCi0JCXwgQlNGX0tFRVBfRwotCQl8IEJTRl9XRUFLCi0JCXwgQlNGX1NFQ1RJT05fU1lNCi0JCXwgQlNGX09MRF9DT01NT04KLQkJfCBCU0ZfTk9UX0FUX0VORAotCQl8IEJTRl9DT05TVFJVQ1RPUgotCQl8IEJTRl9XQVJOSU5HCi0JCXwgQlNGX0lORElSRUNUCi0JCXwgQlNGX0ZJTEUKLQkJfCBCU0ZfRFlOQU1JQykpCi0gICAgc3RyY2F0IChidWZmZXIsICIgdW5rbm93bi1iaXRzIik7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLSNlbmRpZgotDAotI2luY2x1ZGUgImVsZmNvcmUuaCIKLSNpbmNsdWRlICJlbGZsaW5rLmgiCi0MCi0vKiBTaXplLWRlcGVuZGVudCBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLwotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gTkFNRShfYmZkX2VsZixzaXplX2luZm8pID0gewotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIEFSQ0hfU0laRSAvIDgsCi0gIDEsCi0gIEFSQ0hfU0laRSwgRklMRV9BTElHTiwKLSAgRUxGQ0xBU1MsIEVWX0NVUlJFTlQsCi0gIGVsZl93cml0ZV9vdXRfcGhkcnMsCi0gIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgZWxmX3dyaXRlX3JlbG9jcywKLSAgZWxmX3N3YXBfc3ltYm9sX291dCwKLSAgZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotICBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBlbGZfc3dhcF9keW5faW4sCi0gIGVsZl9zd2FwX2R5bl9vdXQsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvZWxmY29yZS5oIGIvYmZkL2VsZmNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwM2VjMy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIEVMRiBjb3JlIGZpbGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotY2hhcioKLWVsZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci19Ci0KLWludAotZWxmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWw7Ci19Ci0KLQotYm9vbGVhbgotZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBjaGFyKiBjb3JlbmFtZTsKLQotICAvKiB4dmVjcyBtdXN0IG1hdGNoIGlmIGJvdGggYXJlIEVMRiBmaWxlcyBmb3IgdGhlIHNhbWUgdGFyZ2V0LiAqLwotCi0gIGlmIChjb3JlX2JmZC0+eHZlYyAhPSBleGVjX2JmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTZWUgaWYgdGhlIG5hbWUgaW4gdGhlIGNvcmVmaWxlIG1hdGNoZXMgdGhlIGV4ZWN1dGFibGUgbmFtZS4gKi8KLQotICBjb3JlbmFtZSA9IGVsZl90ZGF0YSAoY29yZV9iZmQpLT5jb3JlX3Byb2dyYW07Ci0gIGlmIChjb3JlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqIGV4ZWNuYW1lID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOwotICAgICAgZXhlY25hbWUgPSBleGVjbmFtZSA/IGV4ZWNuYW1lICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKLQotICAgICAgaWYgKHN0cmNtcChleGVjbmFtZSwgY29yZW5hbWUpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAgQ29yZSBmaWxlcyBhcmUgc2ltcGx5IHN0YW5kYXJkIEVMRiBmb3JtYXR0ZWQgZmlsZXMgdGhhdCBwYXJ0aXRpb24KLSAgICB0aGUgZmlsZSB1c2luZyB0aGUgZXhlY3V0aW9uIHZpZXcgb2YgdGhlIGZpbGUgKHByb2dyYW0gaGVhZGVyIHRhYmxlKQotICAgIHJhdGhlciB0aGFuIHRoZSBsaW5raW5nIHZpZXcuICBJbiBmYWN0LCB0aGVyZSBpcyBubyBzZWN0aW9uIGhlYWRlcgotICAgIHRhYmxlIGluIGEgY29yZSBmaWxlLgotCi0gICAgVGhlIHByb2Nlc3Mgc3RhdHVzIGluZm9ybWF0aW9uIChpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmFsCi0gICAgcmVnaXN0ZXIgc2V0KSBhbmQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBhcmUgc3RvcmVkIGluIGEKLSAgICBzZWdtZW50IG9mIHR5cGUgUFRfTk9URS4gIFdlIGhhbmRjcmFmdCBhIGNvdXBsZSBvZiBleHRyYSBiZmQgc2VjdGlvbnMKLSAgICB0aGF0IGFsbG93IHN0YW5kYXJkIGJmZCBhY2Nlc3MgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzICgucmVnKSBhbmQgdGhlCi0gICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICgucmVnMikuCi0KLSAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVsZl9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwID0gTlVMTDsJLyogRWxmIHByb2dyYW0gaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBwaGluZGV4OwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkOwotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqcHJlc2VydmVkX3RkYXRhID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKm5ld190ZGF0YSA9IE5VTEw7Ci0KLSAgLyogUmVhZCBpbiB0aGUgRUxGIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoeF9laGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIG1hZ2ljIG51bWJlci4gKi8KLSAgaWYgKGVsZl9maWxlX3AgKCZ4X2VoZHIpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGdvdG8gd3Jvbmc7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBDaGVjayBFSV9WRVJTSU9OIGhlcmUgISAqLwotCi0gIC8qIENoZWNrIHRoZSBhZGRyZXNzIHNpemUgKCJjbGFzcyIpLiAqLwotICBpZiAoeF9laGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogQ2hlY2sgdGhlIGJ5dGVvcmRlci4gKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlnb3RvIHdyb25nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLQlnb3RvIHdyb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGdvdG8gd3Jvbmc7Ci0gICAgfQotCi0gIC8qIEdpdmUgYWJmZCBhbiBlbGZfb2JqX3RkYXRhLiAqLwotICBuZXdfdGRhdGEgPSAKLSAgICAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAobmV3X3RkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBuZXdfdGRhdGE7ICAKLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGJ5dGUgb3JkZXIuICovCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgZWxmX3N3YXBfZWhkcl9pbiAoYWJmZCwgJnhfZWhkciwgaV9laGRycCk7Ci0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIEVMRiBlX21hY2hpbmUgZmllbGQgbWF0Y2hlcyB3aGF0IHRoaXMgcGFydGljdWxhcgotICAgICBCRkQgZm9ybWF0IGV4cGVjdHMuICAqLwotCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDEpCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQyID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDIpKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0X3B0cjsKLQotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gd3Jvbmc7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLQotICAgICAgZm9yICh0YXJnZXRfcHRyID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXRfcHRyICE9IE5VTEw7IHRhcmdldF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmFjazsKLQotCSAgaWYgKCgqdGFyZ2V0X3B0ciktPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgY29udGludWU7Ci0JICBiYWNrID0gKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopICgqdGFyZ2V0X3B0ciktPmJhY2tlbmRfZGF0YTsKLQkgIGlmIChiYWNrLT5lbGZfbWFjaGluZV9jb2RlID09IGlfZWhkcnAtPmVfbWFjaGluZSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gd3Jvbmc7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIG5vIHByb2dyYW0gaGVhZGVyLCBvciB0aGUgdHlwZSBpcyBub3QgYSBjb3JlIGZpbGUsIHRoZW4KLSAgICAgd2UgYXJlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9waG9mZiA9PSAwIHx8IGlfZWhkcnAtPmVfdHlwZSAhPSBFVF9DT1JFKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogRG9lcyBCRkQncyBpZGVhIG9mIHRoZSBwaGRyIHNpemUgbWF0Y2ggdGhlIHNpemUKLSAgICAgcmVjb3JkZWQgaW4gdGhlIGZpbGU/ICovCi0gIGlmIChpX2VoZHJwLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAqLwotICBpX3BoZHJwID0gKEVsZl9JbnRlcm5hbF9QaGRyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCppX3BoZHJwKSAqIGlfZWhkcnAtPmVfcGhudW0pOwotICBpZiAoIWlfcGhkcnApCi0gICAgZ290byBmYWlsOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBpX3BoZHJwOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybS4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciB4X3BoZHI7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiAoeF9waGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9waGRyKSkKLQlnb3RvIGZhaWw7Ci0KLSAgICAgIGVsZl9zd2FwX3BoZHJfaW4gKGFiZmQsICZ4X3BoZHIsIGlfcGhkcnAgKyBwaGluZGV4KTsKLSAgICB9Ci0KLSAgLyogUHJvY2VzcyBlYWNoIHByb2dyYW0gaGVhZGVyLiAqLwotICBmb3IgKHBoaW5kZXggPSAwOyBwaGluZGV4IDwgaV9laGRycC0+ZV9waG51bTsgKytwaGluZGV4KQotICAgIHsKLSAgICAgIGlmICghX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBpX3BoZHJwICsgcGhpbmRleCwgcGhpbmRleCkpCi0JZ290byBmYWlsOwotICAgIH0KLQotICAvKiBTZXQgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAqLwotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBlYmQtPmFyY2gsIDApKQotICAgIHsKLSAgICAgIC8qIEl0J3MgT0sgaWYgdGhpcyBmYWlscyBmb3IgdGhlIGdlbmVyaWMgdGFyZ2V0LiAgKi8KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGZhaWw7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gdGhlIEVMRiBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gd3Jvbmc7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi13cm9uZzoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci1mYWlsOgotICBpZiAoaV9waGRycCAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpX3BoZHJwKTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBlbGZfdGRhdGEgKGFiZmQpID0gcHJlc2VydmVkX3RkYXRhOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZsaW5rLmMgYi9iZmQvZWxmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM5YjRmLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyogRUxGIGxpbmtpbmcgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jZGVmaW5lIEFSQ0hfU0laRSAwCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1ib29sZWFuCi1fYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGludCBwdHJhbGlnbjsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290IikgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGJlZC0+cy0+YXJjaF9zaXplKQotICAgIHsKLSAgICBjYXNlIDMyOiBwdHJhbGlnbiA9IDI7IGJyZWFrOwotICAgIGNhc2UgNjQ6IHB0cmFsaWduID0gMzsgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQoKTsKLSAgICB9Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X2dvdF9wbHQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290LnBsdCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUgLmdvdAotICAgICAob3IgLmdvdC5wbHQpIHNlY3Rpb24uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nCi0gICAgIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCShpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgYmVkLT5nb3Rfc3ltYm9sX29mZnNldCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JIGJlZC0+Y29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID0gaDsKLQotICAvKiBUaGUgZmlyc3QgYml0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGlzIHRoZSBoZWFkZXIuICAqLwotICBzLT5fcmF3X3NpemUgKz0gYmVkLT5nb3RfaGVhZGVyX3NpemUgKyBiZWQtPmdvdF9zeW1ib2xfb2Zmc2V0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzLCBwbHRmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGludCBwdHJhbGlnbiA9IDA7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxbYV0ucGx0LCAuZ290LCAuZ290LnBsdCwgLmR5bmJzcywgYW5kCi0gICAgIC5yZWxbYV0uYnNzIHNlY3Rpb25zLiAgKi8KLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHBsdGZsYWdzID0gZmxhZ3M7Ci0gIHBsdGZsYWdzIHw9IFNFQ19DT0RFOwotICBpZiAoYmVkLT5wbHRfbm90X2xvYWRlZCkKLSAgICBwbHRmbGFncyAmPSB+IChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICBpZiAoYmVkLT5wbHRfcmVhZG9ubHkpCi0gICAgcGx0ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgcGx0ZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIGJlZC0+cGx0X2FsaWdubWVudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPndhbnRfcGx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLQkgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQliZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCA/ICIucmVsYS5wbHQiIDogIi5yZWwucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X2R5bmJzcykKLSAgICB7Ci0gICAgICAvKiBUaGUgLmR5bmJzcyBzZWN0aW9uIGlzIGEgcGxhY2UgdG8gcHV0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLQkgYnkgZHluYW1pYyBvYmplY3RzLCBhcmUgcmVmZXJlbmNlZCBieSByZWd1bGFyIG9iamVjdHMsIGFuZCBhcmUKLQkgbm90IGZ1bmN0aW9ucy4gIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIHByb2Nlc3MKLQkgaW1hZ2UgYW5kIHVzZSBhIFJfKl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0JIGluaXRpYWxpemUgdGhlbSBhdCBydW4gdGltZS4gIFRoZSBsaW5rZXIgc2NyaXB0IHB1dHMgdGhlIC5keW5ic3MKLQkgc2VjdGlvbiBpbnRvIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGZpbmFsIGltYWdlLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmJzcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19BTExPQykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLnJlbFthXS5ic3Mgc2VjdGlvbiBob2xkcyBjb3B5IHJlbG9jcy4gIFRoaXMgc2VjdGlvbiBpcyBub3QKLSAgICAgbm9ybWFsbHkgbmVlZGVkLiAgV2UgbmVlZCB0byBjcmVhdGUgaXQgaGVyZSwgdGhvdWdoLCBzbyB0aGF0IHRoZQotICAgICBsaW5rZXIgd2lsbCBtYXAgaXQgdG8gYW4gb3V0cHV0IHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBpdAotICAgICBvbmx5IGlmIHdlIG5lZWQgaXQsIGJlY2F1c2Ugd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHdlIG5lZWQgaXQKLSAgICAgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUKLSAgICAgbWFpbiBsaW5rZXIgY29kZSBjYWxscyBCRkQgYWZ0ZXIgZXhhbWluaW5nIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgICAgKHNpemVfZHluYW1pY19zZWN0aW9ucykgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgSWYgdGhlIHNlY3Rpb24gdHVybnMgb3V0IG5vdCB0bwotICAgICBiZSBuZWVkZWQsIHdlIGNhbiBkaXNjYXJkIGl0IGxhdGVyLiAgV2Ugd2lsbCBuZXZlciBuZWVkIHRoaXMKLSAgICAgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCBzaW5jZSB0aGV5IGRvIG5vdCB1c2UKLSAgICAgY29weSByZWxvY3MuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAKLQkJCQkoYmVkLT5kZWZhdWx0X3VzZV9yZWxhX3AgCi0JCQkJID8gIi5yZWxhLmJzcyIgOiAiLnJlbC5ic3MiKSk7IAotCSAgaWYgKHMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0KLS8qIFJlY29yZCBhIG5ldyBkeW5hbWljIHN5bWJvbC4gIFdlIHJlY29yZCB0aGUgZHluYW1pYyBzeW1ib2xzIGFzIHdlCi0gICByZWFkIHRoZSBpbnB1dCBmaWxlcywgc2luY2Ugd2UgbmVlZCB0byBoYXZlIGEgbGlzdCBvZiBhbGwgb2YgdGhlbQotICAgYmVmb3JlIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbmFsIHNpemVzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0gICBOb3RlIHRoYXQgd2UgbWF5IGFjdHVhbGx5IGNhbGwgdGhpcyBmdW5jdGlvbiBldmVuIHRob3VnaCB3ZSBhcmUgbm90Ci0gICBnb2luZyB0byBvdXRwdXQgYW55IGR5bmFtaWMgc3ltYm9sczsgaW4gc29tZSBjYXNlcyB3ZSBrbm93IHRoYXQgYQotICAgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzCi0gICBvbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0gICAgICBjaGFyICpwLCAqYWxjOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gY29weTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgLyogWFhYOiBUaGUgQUJJIGRyYWZ0IHNheXMgdGhlIGxpbmtlciBtdXN0IHR1cm4gaGlkZGVuIGFuZAotCSBpbnRlcm5hbCBzeW1ib2xzIGludG8gU1RCX0xPQ0FMIHN5bWJvbHMgd2hlbiBwcm9kdWNpbmcgdGhlCi0JIERTTy4gSG93ZXZlciwgaWYgbGQuc28gaG9ub3JzIHN0X290aGVyIGluIHRoZSBkeW5hbWljIHRhYmxlLAotCSB0aGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuICAqLwotICAgICAgc3dpdGNoIChFTEZfU1RfVklTSUJJTElUWSAoaC0+b3RoZXIpKQotCXsKLQljYXNlIFNUVl9JTlRFUk5BTDoKLQljYXNlIFNUVl9ISURERU46Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGR5bmluZGV4IG9mIGEgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1sb25nCi1fYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X2luZHgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgbG9uZyBpbnB1dF9pbmR4OwotewotICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQotICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0gICAgaWYgKGUtPmlucHV0X2JmZCA9PSBpbnB1dF9iZmQgJiYgZS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIGUtPmR5bmluZHg7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbnVtYmVyIHRoZSBkeW5hbWljIHN5bWJvbHMsIGlmIHNvbWUgb2YKLSAgIHRoZW0gYXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgbG9jYWwuICBUaGlzIGlzIGNhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc2l6ZV90ICpjb3VudCA9IChzaXplX3QgKikgZGF0YTsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ID0gKysoKmNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuICBOZXh0IGNvbWUgYWxsIG9mCi0gICB0aGUgYmFjay1lbmQgYWxsb2NhdGVkIGxvY2FsIGR5bmFtaWMgc3ltcywgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YKLSAgIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLXVuc2lnbmVkIGxvbmcKLV9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBkeW5zeW1jb3VudCA9IDA7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqcDsKLSAgICAgIGZvciAocCA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBwIDsgcCA9IHAtPm5leHQpCi0JZWxmX3NlY3Rpb25fZGF0YSAocCktPmR5bmluZHggPSArK2R5bnN5bWNvdW50OwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqcDsKLSAgICAgIGZvciAocCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IHAgOyBwID0gcC0+bmV4dCkKLQlwLT5keW5pbmR4ID0gKytkeW5zeW1jb3VudDsKLSAgICB9Ci0KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMsCi0JCQkgICZkeW5zeW1jb3VudCk7Ci0KLSAgLyogVGhlcmUgaXMgYW4gdW51c2VkIE5VTEwgZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIHRhYmxlIHdoaWNoCi0gICAgIHdlIG11c3QgYWNjb3VudCBmb3IgaW4gb3VyIGNvdW50LiAgVW5sZXNzIHRoZXJlIHdlcmVuJ3QgYW55Ci0gICAgIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHdlJ2xsIGhhdmUgbm8gdGFibGUgYXQgYWxsLiAgKi8KLSAgaWYgKGR5bnN5bWNvdW50ICE9IDApCi0gICAgKytkeW5zeW1jb3VudDsKLQotICByZXR1cm4gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IGR5bnN5bWNvdW50OwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlcgotICAgc2VjdGlvbiBhbHJlYWR5IGNyZWF0ZWQgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGQ2YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3MjYgKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2NvbGxlY3RfaGFzaF9jb2RlcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfbGlua19hZGp1c3RfcmVsb2NzIAotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgaW50LCAKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHaXZlbiBhbiBFTEYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogUmV0dXJuIHRydWUgaWZmIHRoaXMgaXMgYSBub24tY29tbW9uIGRlZmluaXRpb24gb2YgYSBzeW1ib2wuICAqLwotc3RhdGljIGJvb2xlYW4KLWlzX2dsb2JhbF9zeW1ib2xfZGVmaW5pdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci17Ci0gIC8qIExvY2FsIHN5bWJvbHMgZG8gbm90IGNvdW50LCBidXQgdGFyZ2V0IHNwZWNpZmljIG9uZXMgbWlnaHQuICAqLwotICBpZiAoRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0dMT0JBTAotICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPCBTVEJfTE9PUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHNvIGlzIHRoZSBzeW1ib2wuICAqLwotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBjb21tb24gc2VjdGlvbiwgdGhlbgotICAgICBpdCBpcyBhIGNvbW1vbiBkZWZpbml0aW9uIGFuZCBzbyBkb2VzIG5vdCBjb3VudC4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgc2VjdGlvbiB0aGVuIHdlCi0gICAgIG11c3QgcmVseSB1cG9uIHRoZSBiYWNrZW5kIHRvIHRlbGwgdXMgd2hhdCBpdCBpcy4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUgJiYgc3ltLT5zdF9zaG5keCA8IFNITl9BQlMpCi0gICAgLyogRklYTUUgLSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjb2RlZCB5ZXQ6Ci0gICAgICAgCi0gICAgICAgcmV0dXJuIF9iZmRfaXNfZ2xvYmFsX3N5bWJvbF9kZWZpbml0aW9uIChhYmZkLCBzeW0pOwotICAgICAgIAotICAgICAgIEluc3RlYWQgZm9yIG5vdyBhc3N1bWUgdGhhdCB0aGUgZGVmaW5pdGlvbiBpcyBub3QgZ2xvYmFsLAotICAgICAgIEV2ZW4gaWYgdGhpcyBpcyB3cm9uZywgYXQgbGVhc3QgdGhlIGxpbmtlciB3aWxsIGJlaGF2ZQotICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IGl0IHVzZWQgdG8gZG8uICAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgICAgIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBTZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgYXJjaGl2ZSBlbGVtZW50IG9mIHRoZSBhcmNoaXZlIEFCRkQKLSAgIHdob2VzIGFyY2hvdmUgbWFwIGNvbnRhaW5zIGEgbWVudGlvbiBvZiBTWU1ERUYsIGFuZCBkZXRlcm1pbmUgaWYKLSAgIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGlzIGVsZW1lbnQuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2lzX2RlZmluZWRfYXJjaGl2ZV9zeW1ib2wgKGFiZmQsIHN5bWRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2Fyc3ltICogc3ltZGVmOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqICBlc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICogIGVzeW1lbmQ7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKiAgYnVmID0gTlVMTDsKLSAgc2l6ZV90IHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gIAotICBhYmZkID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgbGluayB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGluY2x1ZGUgaXQgYWdhaW4uICBKdXN0IGNsYWltIHRoYXQgYW55IHN5bWJvbAotICAgICBpdCBjb250YWlucyBpcyBub3QgYSBkZWZpbml0aW9uLCBzbyB0aGF0IG91ciBjYWxsZXIgd2lsbCBub3QgZGVjaWRlIHRvCi0gICAgIChyZSlpbmNsdWRlIHRoaXMgZWxlbWVudC4gICovCi0gIGlmIChhYmZkLT5hcmNoaXZlX3Bhc3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBlbHNlCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudDsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudCAtIGhkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IGhkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JIGJmZF9tYWxsb2MgKGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoYnVmID09IE5VTEwgJiYgZXh0c3ltY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotICAgICBGSVhNRTogIFRoaXMgb3VnaHQgdG8gYmUgY2FjaGVkIHNvbWV3aGVyZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJaGRyLT5zaF9vZmZzZXQgKyBleHRzeW1vZmYgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGV4dHN5bWNvdW50LCBhYmZkKQotCSAgIT0gZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICB7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgbG9va2luZyBmb3IgU1lNREVGLiAgKi8KLSAgZXN5bWVuZCA9IGJ1ZiArIGV4dHN5bWNvdW50OwotICBmb3IgKGVzeW0gPSBidWY7Ci0gICAgICAgZXN5bSA8IGVzeW1lbmQ7Ci0gICAgICAgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJiBzeW0pOwotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWJyZWFrOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCBzeW1kZWYtPm5hbWUpID09IDApCi0JewotCSAgcmVzdWx0ID0gaXNfZ2xvYmFsX3N5bWJvbF9kZWZpbml0aW9uIChhYmZkLCAmIHN5bSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotDAotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBhcmNoaXZlIGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UKLSAgIGRvbid0IHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2Ugb2YgYQotICAgcHJvYmxlbSB3aGljaCBhcmlzZXMgb24gVW5peFdhcmUuICBUaGUgVW5peFdhcmUgbGliYy5zbyBpcyBhbgotICAgYXJjaGl2ZSB3aGljaCBpbmNsdWRlcyBhbiBlbnRyeSBsaWJjLnNvLjEgd2hpY2ggZGVmaW5lcyBhIGJ1bmNoIG9mCi0gICBzeW1ib2xzLiAgVGhlIGxpYmMuc28gYXJjaGl2ZSBhbHNvIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG90aGVyCi0gICBvYmplY3QgZmlsZXMsIHdoaWNoIGFsc28gZGVmaW5lIHN5bWJvbHMsIHNvbWUgb2Ygd2hpY2ggYXJlIHRoZSBzYW1lCi0gICBhcyB0aG9zZSBkZWZpbmVkIGluIGxpYmMuc28uMS4gIENvcnJlY3QgbGlua2luZyByZXF1aXJlcyB0aGF0IHdlCi0gICBjb25zaWRlciBlYWNoIG9iamVjdCBmaWxlIGluIHR1cm4sIGFuZCBpbmNsdWRlIGl0IGlmIGl0IGRlZmluZXMgYW55Ci0gICBzeW1ib2xzIHdlIG5lZWQuICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGRvZXMgbm90IGRvCi0gICB0aGlzOyBpdCBsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgaW5jbHVkZXMKLSAgIGFueSBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzIHRoZW0uICBXaGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgb24KLSAgIFVuaXhXYXJlLCBpdCB3aW5kcyB1cCBwdWxsaW5nIGluIGxpYmMuc28uMSBlYXJseSBhbmQgZGVmaW5pbmcgYQotICAgYnVuY2ggb2Ygc3ltYm9scy4gIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvdGhlciBvYmplY3RzIGluIHRoZQotICAgYXJjaGl2ZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aGljaCBpcyBpbmNvcnJlY3Qgc2luY2UgdGhleQotICAgcHJlY2VkZSBsaWJjLnNvLjEgaW4gdGhlIGFyY2hpdmUuCi0KLSAgIEZvcnR1bmF0ZWx5LCBFTEYgYXJjaGl2ZSBoYW5kbGluZyBpcyBzaW1wbGVyIHRoYW4gdGhhdCBkb25lIGJ5Ci0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLCB3aGljaCBoYXMgdG8gYWxsb3cgZm9yIGEub3V0Ci0gICBvZGRpdGllcy4gIEluIEVMRiwgaWYgd2UgZmluZCBhIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBtYXAsIGFuZCB0aGUKLSAgIHN5bWJvbCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLCB3ZSBrbm93IHRoYXQgd2UgbXVzdCBwdWxsIGluIHRoYXQKLSAgIG9iamVjdCBmaWxlLgotCi0gICBVbmZvcnR1bmF0ZWx5LCB3ZSBkbyBoYXZlIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIHN5bWJvbAotICAgdGFibGUgdW50aWwgbm90aGluZyBmdXJ0aGVyIGlzIHJlc29sdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN5bWluZGV4IGM7Ci0gIGJvb2xlYW4gKmRlZmluZWQgPSBOVUxMOwotICBib29sZWFuICppbmNsdWRlZCA9IE5VTEw7Ci0gIGNhcnN5bSAqc3ltZGVmczsKLSAgYm9vbGVhbiBsb29wOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBzeW1ib2xzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLCBhbmQgYWxsCi0gICAgIGZpbGVzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBpbmNsdWRlZC4gIFRoaXMgaXMgdG8gc3BlZWQgdXAgdGhlCi0gICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBwYXNzZXMuICAqLwotICBjID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKLSAgaWYgKGMgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZGVmaW5lZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaW5jbHVkZWQgPSAoYm9vbGVhbiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIGlmIChkZWZpbmVkID09IChib29sZWFuICopIE5VTEwgfHwgaW5jbHVkZWQgPT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChkZWZpbmVkLCAwLCBjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIG1lbXNldCAoaW5jbHVkZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLQotICBzeW1kZWZzID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBmaWxlX3B0ciBsYXN0OwotICAgICAgc3ltaW5kZXggaTsKLSAgICAgIGNhcnN5bSAqc3ltZGVmOwotICAgICAgY2Fyc3ltICpzeW1kZWZlbmQ7Ci0KLSAgICAgIGxvb3AgPSBmYWxzZTsKLSAgICAgIGxhc3QgPSAtMTsKLQotICAgICAgc3ltZGVmID0gc3ltZGVmczsKLSAgICAgIHN5bWRlZmVuZCA9IHN5bWRlZiArIGM7Ci0gICAgICBmb3IgKGkgPSAwOyBzeW1kZWYgPCBzeW1kZWZlbmQ7IHN5bWRlZisrLCBpKyspCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBiZmQgKmVsZW1lbnQ7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7Ci0JICBzeW1pbmRleCBtYXJrOwotCi0JICBpZiAoZGVmaW5lZFtpXSB8fCBpbmNsdWRlZFtpXSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltZGVmLT5maWxlX29mZnNldCA9PSBsYXN0KQotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbaV0gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBzeW1kZWYtPm5hbWUsCi0JCQkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcCwgKmNvcHk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgZGVmYXVsdCB2ZXJzaW9uICh0aGUgbmFtZSBjb250YWlucyBAQCksCi0JCSBsb29rIHVwIHRoZSBzeW1ib2wgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbi4gIFRoZQotCQkgZWZmZWN0IGlzIHRoYXQgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIHdpdGhvdXQgdGhlCi0JCSB2ZXJzaW9uIHdpbGwgYmUgbWF0Y2hlZCBieSB0aGUgZGVmYXVsdCBzeW1ib2wgaW4gdGhlCi0JCSBhcmNoaXZlLiAgKi8KLQotCSAgICAgIHAgPSBzdHJjaHIgKHN5bWRlZi0+bmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSBFTEZfVkVSX0NIUikKLQkJY29udGludWU7Ci0KLQkgICAgICBjb3B5ID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltZGVmLT5uYW1lICsgMSk7Ci0JICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgbWVtY3B5IChjb3B5LCBzeW1kZWYtPm5hbWUsIHAgLSBzeW1kZWYtPm5hbWUpOwotCSAgICAgIGNvcHlbcCAtIHN5bWRlZi0+bmFtZV0gPSAnXDAnOwotCi0JICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGNvcHksCi0JCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcHkpOwotCSAgICB9Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICB7Ci0JICAgICAgLyogV2UgY3VycmVudGx5IGhhdmUgYSBjb21tb24gc3ltYm9sLiAgVGhlIGFyY2hpdmUgbWFwIGNvbnRhaW5zCi0JCSBhIHJlZmVyZW5jZSB0byB0aGlzIHN5bWJvbCwgc28gd2UgbWF5IHdhbnQgdG8gaW5jbHVkZSBpdC4gIFdlCi0JCSBvbmx5IHdhbnQgdG8gaW5jbHVkZSBpdCBob3dldmVyLCBpZiB0aGlzIGFyY2hpdmUgZWxlbWVudAotCQkgY29udGFpbnMgYSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IGFub3RoZXIgY29tbW9uCi0JCSBkZWNsYXJhdGlvbiBvZiBpdC4KLQotCQkgVW5mb3J0dW5hdGVseSBzb21lIGFyY2hpdmVycyAoaW5jbHVkaW5nIEdOVSBhcikgd2lsbCBwdXQKLQkJIGRlY2xhcmF0aW9ucyBvZiBjb21tb24gc3ltYm9scyBpbnRvIHRoZWlyIGFyY2hpdmUgbWFwcywgYXMKLQkJIHdlbGwgYXMgcmVhbCBkZWZpbml0aW9ucywgc28gd2UgY2Fubm90IGp1c3QgZ28gYnkgdGhlIGFyY2hpdmUKLQkJIG1hcCBhbG9uZS4gIEluc3RlYWQgd2UgbXVzdCByZWFkIGluIHRoZSBlbGVtZW50J3Mgc3ltYm9sCi0JCSB0YWJsZSBhbmQgY2hlY2sgdGhhdCB0byBzZWUgd2hhdCBraW5kIG9mIHN5bWJvbCBkZWZpbml0aW9uCi0JCSB0aGlzIGlzLiAgKi8KLQkgICAgICBpZiAoISBlbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sIChhYmZkLCBzeW1kZWYpKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJZGVmaW5lZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBpbmNsdWRlIHRoaXMgYXJjaGl2ZSBtZW1iZXIuICAqLwotCSAgZWxlbWVudCA9IF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBzeW1kZWYtPmZpbGVfb2Zmc2V0KTsKLQkgIGlmIChlbGVtZW50ID09IChiZmQgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVsZW1lbnQsIGJmZF9vYmplY3QpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogRG91YmxlY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBpbmNsdWRlZCB0aGlzIG9iamVjdAotCSAgICAgYWxyZWFkeS0taXQgc2hvdWxkIGJlIGltcG9zc2libGUsIGJ1dCB0aGVyZSBtYXkgYmUKLQkgICAgIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBhcmNoaXZlLiAgKi8KLQkgIGlmIChlbGVtZW50LT5hcmNoaXZlX3Bhc3MgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAxOwotCi0JICB1bmRlZnNfdGFpbCA9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsOwotCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGVsZW1lbnQsCi0JCQkJCQkJIHN5bWRlZi0+bmFtZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKCEgZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChlbGVtZW50LCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBhbnkgbmV3IHVuZGVmaW5lZCBzeW1ib2xzLCB3ZSBuZWVkIHRvIG1ha2UKLQkgICAgIGFub3RoZXIgcGFzcyB0aHJvdWdoIHRoZSBhcmNoaXZlIGluIG9yZGVyIHRvIHNlZSB3aGV0aGVyCi0JICAgICB0aGV5IGNhbiBiZSBkZWZpbmVkLiAgRklYTUU6IFRoaXMgaXNuJ3QgcGVyZmVjdCwgYmVjYXVzZQotCSAgICAgY29tbW9uIHN5bWJvbHMgd2luZCB1cCBvbiB1bmRlZnNfdGFpbCBhbmQgYmVjYXVzZSBhbgotCSAgICAgdW5kZWZpbmVkIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGxhdGVyIG9uIGluIHRoaXMgcGFzcwotCSAgICAgZG9lcyBub3QgcmVxdWlyZSBhbm90aGVyIHBhc3MuICBUaGlzIGlzbid0IGEgYnVnLCBidXQgaXQKLQkgICAgIGRvZXMgbWFrZSB0aGUgY29kZSBsZXNzIGVmZmljaWVudCB0aGFuIGl0IGNvdWxkIGJlLiAgKi8KLQkgIGlmICh1bmRlZnNfdGFpbCAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgbG9vcCA9IHRydWU7Ci0KLQkgIC8qIExvb2sgYmFja3dhcmQgdG8gbWFyayBhbGwgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUKLQkgICAgIHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGluIHRoaXMgcGFzcy4gICovCi0JICBtYXJrID0gaTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpbmNsdWRlZFttYXJrXSA9IHRydWU7Ci0JICAgICAgaWYgKG1hcmsgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgLS1tYXJrOwotCSAgICB9Ci0JICB3aGlsZSAoc3ltZGVmc1ttYXJrXS5maWxlX29mZnNldCA9PSBzeW1kZWYtPmZpbGVfb2Zmc2V0KTsKLQotCSAgLyogV2UgbWFyayBzdWJzZXF1ZW50IHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGFzIHdlIGdvCi0JICAgICBvbiB0aHJvdWdoIHRoZSBsb29wLiAgKi8KLQkgIGxhc3QgPSBzeW1kZWYtPmZpbGVfb2Zmc2V0OwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb29wKTsKLQotICBmcmVlIChkZWZpbmVkKTsKLSAgZnJlZSAoaW5jbHVkZWQpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVmaW5lZCAhPSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGZyZWUgKGRlZmluZWQpOwotICBpZiAoaW5jbHVkZWQgIT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBmcmVlIChpbmNsdWRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIGRlZmluZSBhIG5ldyBzeW1ib2wuICBJdAotICAgaGFuZGxlcyB0aGUgdmFyaW91cyBjYXNlcyB3aGljaCBhcmlzZSB3aGVuIHdlIGZpbmQgYSBkZWZpbml0aW9uIGluCi0gICBhIGR5bmFtaWMgb2JqZWN0LCBvciB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSBkZWZpbml0aW9uIGluIGEKLSAgIGR5bmFtaWMgb2JqZWN0LiAgVGhlIG5ldyBzeW1ib2wgaXMgZGVzY3JpYmVkIGJ5IE5BTUUsIFNZTSwgUFNFQywKLSAgIGFuZCBQVkFMVUUuICBXZSBzZXQgU1lNX0hBU0ggdG8gdGhlIGhhc2ggdGFibGUgZW50cnkuICBXZSBzZXQKLSAgIE9WRVJSSURFIGlmIHRoZSBvbGQgc3ltYm9sIGlzIG92ZXJyaWRpbmcgYSBuZXcgZGVmaW5pdGlvbi4gIFdlIHNldAotICAgVFlQRV9DSEFOR0VfT0sgaWYgaXQgaXMgT0sgZm9yIHRoZSB0eXBlIHRvIGNoYW5nZS4gIFdlIHNldAotICAgU0laRV9DSEFOR0VfT0sgaWYgaXQgaXMgT0sgZm9yIHRoZSBzaXplIHRvIGNoYW5nZS4gIEJ5IE9LIHRvCi0gICBjaGFuZ2UsIHdlIG1lYW4gdGhhdCB3ZSBzaG91bGRuJ3Qgd2FybiBpZiB0aGUgdHlwZSBvciBzaXplIGRvZXMKLSAgIGNoYW5nZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIHBzZWMsIHB2YWx1ZSwgc3ltX2hhc2gsCi0JCSAgb3ZlcnJpZGUsIHR5cGVfY2hhbmdlX29rLCBzaXplX2NoYW5nZV9vaykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnBzZWM7Ci0gICAgIGJmZF92bWEgKnB2YWx1ZTsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgICAgYm9vbGVhbiAqb3ZlcnJpZGU7Ci0gICAgIGJvb2xlYW4gKnR5cGVfY2hhbmdlX29rOwotICAgICBib29sZWFuICpzaXplX2NoYW5nZV9vazsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGludCBiaW5kOwotICBiZmQgKm9sZGJmZDsKLSAgYm9vbGVhbiBuZXdkeW4sIG9sZGR5biwgb2xkZGVmLCBuZXdkZWYsIG5ld2R5bmNvbW1vbiwgb2xkZHluY29tbW9uOwotCi0gICpvdmVycmlkZSA9IGZhbHNlOwotCi0gIHNlYyA9ICpwc2VjOwotICBiaW5kID0gRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbyk7Ci0KLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotICBlbHNlCi0gICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqc3ltX2hhc2ggPSBoOwotCi0gIC8qIFRoaXMgY29kZSBpcyBmb3IgY29waW5nIHdpdGggZHluYW1pYyBvYmplY3RzLCBhbmQgaXMgb25seSB1c2VmdWwKLSAgICAgaWYgd2UgYXJlIGRvaW5nIGFuIEVMRiBsaW5rLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGb3IgbWVyZ2luZywgd2Ugb25seSBjYXJlIGFib3V0IHJlYWwgc3ltYm9scy4gICovCi0KLSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0gICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0gIC8qIElmIHdlIGp1c3QgY3JlYXRlZCB0aGUgc3ltYm9sLCBtYXJrIGl0IGFzIGJlaW5nIGFuIEVMRiBzeW1ib2wuCi0gICAgIE90aGVyIHRoYW4gdGhhdCwgdGhlcmUgaXMgbm90aGluZyB0byBkby0tdGhlcmUgaXMgbm8gbWVyZ2UgaXNzdWUKLSAgICAgd2l0aCBhIG5ld2x5IGRlZmluZWQgc3ltYm9sLS1zbyB3ZSBqdXN0IHJldHVybi4gICovCi0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIE9MREJGRCBpcyBhIEJGRCBhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHN5bWJvbC4gICovCi0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBvbGRiZmQgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogSW4gY2FzZXMgaW52b2x2aW5nIHdlYWsgdmVyc2lvbmVkIHN5bWJvbHMsIHdlIG1heSB3aW5kIHVwIHRyeWluZwotICAgICB0byBtZXJnZSBhIHN5bWJvbCB3aXRoIGl0c2VsZi4gIENhdGNoIHRoYXQgaGVyZSwgdG8gYXZvaWQgdGhlCi0gICAgIGNvbmZ1c2lvbiB0aGF0IHJlc3VsdHMgaWYgd2UgdHJ5IHRvIG92ZXJyaWRlIGEgc3ltYm9sIHdpdGgKLSAgICAgaXRzZWxmLiAgVGhlIGFkZGl0aW9uYWwgdGVzdHMgY2F0Y2ggY2FzZXMgbGlrZQotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHdoaWNoIGFyZSByZWd1bGFyIHN5bWJvbHMgZGVmaW5lZCBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCB3aGljaCB3ZSBkbyB3YW50IHRvIGhhbmRsZSBoZXJlLiAgKi8KLSAgaWYgKGFiZmQgPT0gb2xkYmZkCi0gICAgICAmJiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBORVdEWU4gYW5kIE9MRERZTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIG5ld2R5biA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZXdkeW4gPSBmYWxzZTsKLQotICBpZiAob2xkYmZkICE9IE5VTEwpCi0gICAgb2xkZHluID0gKG9sZGJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLSAgICAgIC8qIFRoaXMgY29kZSBoYW5kbGVzIHRoZSBzcGVjaWFsIFNITl9NSVBTX3tURVhULERBVEF9IHNlY3Rpb24KLSAgICAgICAgIGluZGljZXMgdXNlZCBieSBNSVBTIEVMRi4gICovCi0gICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGhzZWMgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGhzZWMgPT0gTlVMTCkKLQlvbGRkeW4gPSBmYWxzZTsKLSAgICAgIGVsc2UKLQlvbGRkeW4gPSAoaHNlYy0+c3ltYm9sLT5mbGFncyAmIEJTRl9EWU5BTUlDKSAhPSAwOwotICAgIH0KLQotICAvKiBORVdERUYgYW5kIE9MRERFRiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBhcHBlYXIgdG8gYmUgYSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgbmV3ZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBuZXdkZWYgPSB0cnVlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIG9sZGRlZiA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZGVmID0gdHJ1ZTsKLQotICAvKiBORVdEWU5DT01NT04gYW5kIE9MRERZTkNPTU1PTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkCi0gICAgIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LCBhcHBlYXJzIHRvIGJlIGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMKLSAgICAgb2JqZWN0LiAgSWYgYSBzeW1ib2wgYXBwZWFycyBpbiBhbiB1bmluaXRpYWxpemVkIHNlY3Rpb24sIGFuZCBpcwotICAgICBub3Qgd2VhaywgYW5kIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIGl0IG1heSBiZSBhIGNvbW1vbiBzeW1ib2wKLSAgICAgd2hpY2ggd2FzIHJlc29sdmVkIHdoZW4gdGhlIGR5bmFtaWMgb2JqZWN0IHdhcyBjcmVhdGVkLiAgV2Ugd2FudAotICAgICB0byB0cmVhdCBzdWNoIHN5bWJvbHMgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgcmFpc2Ugc3BlY2lhbAotICAgICBjb25zaWRlcmF0aW9ucyB3aGVuIHNldHRpbmcgdGhlIHN5bWJvbCBzaXplOiBpZiB0aGUgc3ltYm9sCi0gICAgIGFwcGVhcnMgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QsIGFuZCB0aGUgc2l6ZSBpbgotICAgICB0aGUgcmVndWxhciBvYmplY3QgaXMgbGFyZ2VyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUKLSAgICAgbGFyZ2VyIHNpemUuICBUaGlzIHByb2JsZW1hdGljIGNhc2UgY2FuIGFsd2F5cyBiZSBhdm9pZGVkIGluIEMsCi0gICAgIGJ1dCBpdCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcgRm9ydHJhbiBzaGFyZWQKLSAgICAgbGlicmFyaWVzLgotCi0gICAgIE5vdGUgdGhhdCBpZiBORVdEWU5DT01NT04gaXMgc2V0LCBORVdERUYgd2lsbCBiZSBzZXQsIGFuZAotICAgICBsaWtld2lzZSBmb3IgT0xERFlOQ09NTU9OIGFuZCBPTERERUYuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBqdXN0IGEgaGV1cmlzdGljLCBhbmQgdGhhdCBpdCBpcyBxdWl0ZQotICAgICBwb3NzaWJsZSB0byBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCB3aGljaAotICAgICBpcyByZWFsbHkgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNvdWxkCi0gICAgIGxlYWQgdG8gc29tZSBtaW5vciBjb25mdXNpb24gd2hlbiB0aGUgc3ltYm9sIHJlYWxseSBpcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gc29tZSByZWd1bGFyIG9iamVjdC4gIEhvd2V2ZXIsIEkgdGhpbmsgaXQgd2lsbCBiZQotICAgICBoYXJtbGVzcy4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgc3ltLT5zdF9zaXplID4gMAotICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSwotICAgICAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0gICAgbmV3ZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gIGlmIChvbGRkeW4KLSAgICAgICYmIG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgaC0+c2l6ZSA+IDAKLSAgICAgICYmIGgtPnR5cGUgIT0gU1RUX0ZVTkMpCi0gICAgb2xkZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSB0eXBlIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWsuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgIHx8IGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgc2l6ZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKLSAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLCBvciBpZiB0aGUgb2xkIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotCi0gIGlmICgqdHlwZV9jaGFuZ2Vfb2sKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIElmIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBzeW1ib2xzIGxvb2sgbGlrZSBjb21tb24gc3ltYm9scyBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCBzZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0byB0aGUgbGFyZ2VyIG9mIHRoZQotICAgICB0d28uICAqLwotCi0gIGlmIChvbGRkeW5jb21tb24KLSAgICAgICYmIG5ld2R5bmNvbW1vbgotICAgICAgJiYgc3ltLT5zdF9zaXplICE9IGgtPnNpemUpCi0gICAgewotICAgICAgLyogU2luY2Ugd2UgdGhpbmsgd2UgaGF2ZSB0d28gY29tbW9uIHN5bWJvbHMsIGlzc3VlIGEgbXVsdGlwbGUKLSAgICAgICAgIGNvbW1vbiB3YXJuaW5nIGlmIGRlc2lyZWQuICBOb3RlIHRoYXQgd2Ugb25seSB3YXJuIGlmIHRoZQotICAgICAgICAgc2l6ZSBpcyBkaWZmZXJlbnQuICBJZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZSwgd2Ugc2ltcGx5IGxldAotICAgICAgICAgdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGUgdGhlIG5ldyBvbmUgYXMgbm9ybWFsbHkgaGFwcGVucyB3aXRoCi0gICAgICAgICBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3ltLT5zdF9zaXplID4gaC0+c2l6ZSkKLQloLT5zaXplID0gc3ltLT5zdF9zaXplOwotCi0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbG9va2luZyBhdCBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgaGF2ZSBmb3VuZCBhCi0gICAgIGRlZmluaXRpb24sIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieQotICAgICBzb21lIG90aGVyIG9iamVjdC4gIElmIHNvLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXhpc3RpbmcKLSAgICAgZGVmaW5pdGlvbiwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHJlcG9ydCBhIG11bHRpcGxlIHN5bWJvbAotICAgICBkZWZpbml0aW9uIGVycm9yOyB3ZSBkbyB0aGlzIGJ5IGNsb2JiZXJpbmcgKlBTRUMgdG8gYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotICAgICBXZSB0cmVhdCBhIGNvbW1vbiBzeW1ib2wgYXMgYSBkZWZpbml0aW9uIGlmIHRoZSBzeW1ib2wgaW4gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGlzIGEgZnVuY3Rpb24sIHNpbmNlIGNvbW1vbiBzeW1ib2xzIGFsd2F5cwotICAgICByZXByZXNlbnQgdmFyaWFibGVzOyB0aGlzIGNhbiBjYXVzZSBjb25mdXNpb24gaW4gcHJpbmNpcGxlLCBidXQKLSAgICAgYW55IHN1Y2ggY29uZnVzaW9uIHdvdWxkIHNlZW0gdG8gaW5kaWNhdGUgYW4gZXJyb25lb3VzIHByb2dyYW0gb3IKLSAgICAgc2hhcmVkIGxpYnJhcnkuICBXZSBhbHNvIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyCi0gICAgIG9iamVjdCB0byBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLQotICAgICBXZSBwcmVmZXIgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnkgdG8gYSB3ZWFrCi0gICAgIGRlZmluaXRpb24gaW4gdGhlIGV4ZWN1dGFibGUuICAqLwotCi0gIGlmIChuZXdkeW4KLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgKG9sZGRlZgotCSAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIChiaW5kID09IFNUQl9XRUFLCi0JCSAgfHwgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICB8fCBiaW5kID09IFNUQl9XRUFLKSkKLSAgICB7Ci0gICAgICAqb3ZlcnJpZGUgPSB0cnVlOwotICAgICAgbmV3ZGVmID0gZmFsc2U7Ci0gICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2hlbiB0aGUgb2xkIHN5bWJvbCBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4KLSAgICAgICAgIHdlIGFyZSBleHBsaWNpdGx5IGxldHRpbmcgaXQgb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBvcgotICAgICAgICAgZnVuY3Rpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dAotICAgICAgICAgYSB0eXBlIGNoYW5nZS4gIElmIHRoZSBvbGQgc3ltYm9sIGlzIGEgZGVmaW5lZCBzeW1ib2wsIGEgdHlwZQotICAgICAgICAgY2hhbmdlIHdhcm5pbmcgbWF5IHN0aWxsIGJlIGFwcHJvcHJpYXRlLiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBvbGQgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYQotICAgICBuZXcgc3ltYm9sIHdoaWNoIGxvb2tzIGxpa2UgYSBjb21tb24gc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLSAgICAgV2UgY2hhbmdlICpQU0VDIGFuZCAqUFZBTFVFIHRvIG1ha2UgdGhlIG5ldyBzeW1ib2wgbG9vayBsaWtlIGEKLSAgICAgY29tbW9uIHN5bWJvbCwgYW5kIGxldCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aWxsIGRvCi0gICAgIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgaWYgKG5ld2R5bmNvbW1vbgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotICAgICAgKnB2YWx1ZSA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgICpwc2VjID0gc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvbGQgc3ltYm9sIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZSBuZXcgc3ltYm9sIGlzCi0gICAgIGEgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBuZXcKLSAgICAgc3ltYm9sIG92ZXJyaWRlcyB0aGUgb2xkIHN5bWJvbC4gIFN5bWJvbHMgZnJvbSByZWd1bGFyIGZpbGVzCi0gICAgIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzLCBldmVuIGlmCi0gICAgIHRoZXkgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBhZ2FpbiBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgdG8KLSAgICAgb3ZlcnJpZGUgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCBpZiB0aGUgc2hhcmVkIG9iamVjdAotICAgICBzeW1ib2wgaXMgYSBmdW5jdGlvbiBvciBpcyB3ZWFrLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBwZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCB0bwotICAgICBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIChuZXdkZWYKLQkgIHx8IChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgIHx8IGgtPnR5cGUgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChiaW5kICE9IFNUQl9XRUFLCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICAvKiBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gdW5kZWZpbmVkLCBhbmQgbGV0Ci0JIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIGRvIHRoZSByaWdodCB0aGluZyB3aXRoIHRoZQotCSBuZXcgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgLyogV2UgYWdhaW4gcGVybWl0IGEgdHlwZSBjaGFuZ2Ugd2hlbiBhIGNvbW1vbiBzeW1ib2wgbWF5IGJlCi0gICAgICAgICBvdmVycmlkaW5nIGEgZnVuY3Rpb24uICAqLwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIC8qIFRoaXMgdW5pb24gbWF5IGhhdmUgYmVlbiBzZXQgdG8gYmUgbm9uLU5VTEwgd2hlbiB0aGlzIHN5bWJvbAotCSB3YXMgc2VlbiBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgV2UgbXVzdCBmb3JjZSB0aGUgdW5pb24gdG8gYmUKLQkgTlVMTCwgc28gdGhhdCBpdCBpcyBjb3JyZWN0IGZvciBhIHJlZ3VsYXIgc3ltYm9sLiAgKi8KLQotICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gTlVMTDsKLQotICAgICAgLyogSW4gdGhpcyBzcGVjaWFsIGNhc2UsIGlmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwKLSAgICAgICAgIHdlIHdhbnQgdGhlIGNhbGxlciB0byBmcm9iIHdpdGggSCByYXRoZXIgdGhhbiB3aXRoIHRoZQotICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sLiAgVGhhdCB3aWxsIHBlcm1pdCB0aGUgY2FsbGVyIHRvIHJlZGVmaW5lIHRoZQotICAgICAgICAgdGFyZ2V0IG9mIHRoZSBpbmRpcmVjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFRoaXMgd2lsbCBicmVhayB0aGUgLXkgb3B0aW9uIGlmIHdlIHN0b3JlIGEKLSAgICAgICAgIHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuICAqLwotICAgICAgKnN5bV9oYXNoID0gaDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBuZXcgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYW4KLSAgICAgb2xkIHN5bWJvbCB0aGF0IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmUgYSBjb21tb24gc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYSBzaGFyZWQgb2JqZWN0LiAgTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIGluCi0gICAgIHdoaWNoIGEgbmV3IGNvbW1vbiBzeW1ib2wgc2hvdWxkIHNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotICAgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiBvbGRkeW5jb21tb24pCi0gICAgewotICAgICAgLyogSXQgd291bGQgYmUgYmVzdCBpZiB3ZSBjb3VsZCBzZXQgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYQotCSBjb21tb24gc3ltYm9sLCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHNlY3Rpb24KLQkgb3IgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVkdW1lZCBjb21tb24gc3ltYm9sIGluIHRoZSBkeW5hbWljIG9iamVjdCBpcwotICAgICAgICAgbGFyZ2VyLCBwcmV0ZW5kIHRoYXQgdGhlIG5ldyBzeW1ib2wgaGFzIGl0cyBzaXplLiAgKi8KLQotICAgICAgaWYgKGgtPnNpemUgPiAqcHZhbHVlKQotCSpwdmFsdWUgPSBoLT5zaXplOwotCi0gICAgICAvKiBGSVhNRTogV2Ugbm8gbG9uZ2VyIGtub3cgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgc3ltYm9sCi0JIGluIHRoZSBkeW5hbWljIG9iamVjdCwgc28gd2UganVzdCB3aW5kIHVwIHVzaW5nIHRoZSBvbmUgZnJvbQotCSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotCi0gICAgICBvbGRkZWYgPSBmYWxzZTsKLSAgICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICAgICp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKLSAgICAgZm9sbG93ZWQgYnkgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdC4gIEluIHRoaXMKLSAgICAgY2FzZSwgd2UgcHJlZmVyIHRoZSBkZWZpbml0aW9uIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgaWYgKG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiBuZXdkeW4KLSAgICAgICYmIGJpbmQgIT0gU1RCX1dFQUspCi0gICAgewotICAgICAgLyogVG8gbWFrZSB0aGlzIHdvcmsgd2UgaGF2ZSB0byBmcm9iIHRoZSBmbGFncyBzbyB0aGF0IHRoZSByZXN0Ci0gICAgICAgICBvZiB0aGUgY29kZSBkb2VzIG5vdCB0aGluayB3ZSBhcmUgdXNpbmcgdGhlIHJlZ3VsYXIKLSAgICAgICAgIGRlZmluaXRpb24uICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0gICAgICBlbHNlIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDApCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+IChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKLQotICAgICAgLyogSWYgSCBpcyB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0aW9uLCB3ZSB3YW50IHRoZSBjYWxsZXIgdG8KLSAgICAgICAgIHVzZSBIIHJhdGhlciB0aGFuIHRoZSBpbmRpcmVjdCBzeW1ib2wuICBPdGhlcndpc2UgaWYgd2UgYXJlCi0gICAgICAgICBkZWZpbmluZyBhIG5ldyBpbmRpcmVjdCBzeW1ib2wgd2Ugd2lsbCB3aW5kIHVwIGF0dGFjaGluZyBpdAotICAgICAgICAgdG8gdGhlIGVudHJ5IHdlIGFyZSBvdmVycmlkaW5nLiAgKi8KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZAotICAgICBvYmplY3QgZm9sbG93ZWQgYnkgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdC4gIEluCi0gICAgIHRoaXMgY2FzZSB3ZSBwcmVmZXIgdG8gZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdC4gIFRvIG1ha2UKLSAgICAgdGhpcyB3b3JrIHdlIGhhdmUgdG8gdGVsbCB0aGUgY2FsbGVyIHRvIG5vdCB0cmVhdCB0aGUgbmV3IHN5bWJvbAotICAgICBhcyBhIGRlZmluaXRpb24uICAqLwotICBpZiAob2xkZGVmCi0gICAgICAmJiBvbGRkeW4KLSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgISBuZXdkeW4KLSAgICAgICYmIGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKm92ZXJyaWRlID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFTEYgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosCi0JCQkJICAgICAgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotICBib29sZWFuICgqY2hlY2tfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0gIGJvb2xlYW4gY29sbGVjdDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgc2l6ZV90IHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkX2J5dGUgKmR5bnZlciA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV4dHZlcnN5bSA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV2ZXI7Ci0gIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrczsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGFkZF9zeW1ib2xfaG9vayA9IGJlZC0+ZWxmX2FkZF9zeW1ib2xfaG9vazsKLSAgY29sbGVjdCA9IGJlZC0+Y29sbGVjdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICBkeW5hbWljID0gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkeW5hbWljID0gdHJ1ZTsKLQotICAgICAgLyogWW91IGNhbid0IHVzZSAtciBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICBBbHNvLCB0aGVyZSdzIG5vCi0JIGhvcGUgb2YgdXNpbmcgYSBkeW5hbWljIG9iamVjdCB3aGljaCBkb2VzIG5vdCBleGFjdGx5IG1hdGNoCi0JIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgYW55IGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBuYW1lZAotICAgICAuZ251Lndhcm5pbmcuU1lNQk9MIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmcgc3ltYm9scyBmb3IgdGhlIGdpdmVuCi0gICAgIHN5bWJvbC4gIFRoaXMgZGlmZmVycyBmcm9tIC5nbnUud2FybmluZyBzZWN0aW9ucywgd2hpY2ggZ2VuZXJhdGUKLSAgICAgd2FybmluZ3Mgd2hlbiB0aGV5IGFyZSBpbmNsdWRlZCBpbiBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKTsKLQkgIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqbXNnOwotCSAgICAgIGJmZF9zaXplX3R5cGUgc3o7Ci0KLQkgICAgICBuYW1lICs9IHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIHRoZW4gbG9vayB1cCB0aGUgc3ltYm9sCi0JCSBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIGl0IGlzIHRoZXJlLCBhbmQgaXQgaXMgYWxyZWFkeQotCQkgYmVlbiBkZWZpbmVkLCB0aGVuIHdlIHdpbGwgbm90IGJlIHVzaW5nIHRoZSBlbnRyeQotCQkgZnJvbSB0aGlzIHNoYXJlZCBvYmplY3QsIHNvIHdlIGRvbid0IG5lZWQgdG8gd2Fybi4KLQkJIEZJWE1FOiBJZiB3ZSBzZWUgdGhlIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdAotCQkgbGF0ZXIgb24sIHdlIHdpbGwgd2FybiwgYnV0IHdlIHNob3VsZG4ndC4gIFRoZSBvbmx5Ci0JCSBmaXggaXMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IHdhcm5pbmdzIHdlIGFyZSBzdXBwb3NlZAotCQkgdG8gZW1pdCwgYW5kIHRoZW4gaGFuZGxlIHRoZW0gYWxsIGF0IHRoZSBlbmQgb2YgdGhlCi0JCSBsaW5rLiAgKi8KLQkgICAgICBpZiAoZHluYW1pYyAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCQkgIC8qIEZJWE1FOiBXaGF0IGFib3V0IGJmZF9saW5rX2hhc2hfY29tbW9uPyAgKi8KLQkJICBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGlzc3VlIHRoaXMgd2FybmluZy4gIENsb2JiZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBzaXplIHNvIHRoYXQgdGhlIHdhcm5pbmcgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICAgICAgcy0+X3Jhd19zaXplID0gMDsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7Ci0JICAgICAgbXNnID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzeiArIDEpOwotCSAgICAgIGlmIChtc2cgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgbXNnW3N6XSA9ICdcMCc7Ci0KLQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgQlNGX1dBUk5JTkcsIHMsIChiZmRfdm1hKSAwLCBtc2csCi0JCSAgICAgIGZhbHNlLCBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCXsKLQkJICAvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUgc28gdGhhdCB0aGUgd2FybmluZyBkb2VzCi0gICAgICAgICAgICAgICAgICAgICBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgcy0+X3Jhd19zaXplID0gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIHdlIGFsd2F5cyBsaW5rIGFnYWluc3QgdGhlIC5keW5zeW0KLSAgICAgc3ltYm9sIHRhYmxlLCBub3QgdGhlIC5zeW10YWIgc3ltYm9sIHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHdpbGwgb25seSBzZWUgdGhlIC5keW5zeW0gc3ltYm9sIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAgICAgbG9vayBhdCAuc3ltdGFiIGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotICBpZiAoISBkeW5hbWljIHx8IGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGVsc2UKLSAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBSZWFkIGluIGFueSB2ZXJzaW9uIGRlZmluaXRpb25zLiAgKi8KLQotICAgICAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSBzeW1ib2wgdmVyc2lvbnMsIGJ1dCBkb24ndCBib3RoZXIgdG8gY29udmVydCB0aGVtCi0gICAgICAgICB0byBpbnRlcm5hbCBmb3JtYXQuICAqLwotICAgICAgaWYgKGVsZl9keW52ZXJzeW0gKGFiZmQpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKnZlcnN5bWhkcjsKLQotCSAgdmVyc3ltaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHI7Ci0JICBleHR2ZXJzeW0gPSAoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotCSAgaWYgKGV4dHZlcnN5bSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgdmVyc3ltaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBleHR2ZXJzeW0sIDEsIHZlcnN5bWhkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAhPSB2ZXJzeW1oZHItPnNoX3NpemUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudDsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudCAtIGhkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IGhkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JIGJmZF9tYWxsb2MgKGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoYnVmID09IE5VTEwgJiYgZXh0c3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIGVhY2ggZXh0ZXJuYWwKLSAgICAgc3ltYm9sLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRzeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGVsZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGNyZWF0ZSBhbGwgdGhlIGR5bmFtaWMKLSAgICAgICAgIHNlY3Rpb25zIGltbWVkaWF0ZWx5LiAgV2UgbmVlZCB0byBhdHRhY2ggdGhlbSB0byBzb21ldGhpbmcsCi0gICAgICAgICBzbyB3ZSBhdHRhY2ggdGhlbSB0byB0aGlzIEJGRCwgcHJvdmlkZWQgaXQgaXMgdGhlIHJpZ2h0Ci0gICAgICAgICBmb3JtYXQuICBGSVhNRTogSWYgdGhlcmUgYXJlIG5vIGlucHV0IEJGRCdzIG9mIHRoZSBzYW1lCi0gICAgICAgICBmb3JtYXQgYXMgdGhlIG91dHB1dCwgd2UgY2FuJ3QgbWFrZSBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmICEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQl7Ci0JICBpZiAoISBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJvb2xlYW4gYWRkX25lZWRlZDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG9sZHNpemU7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZGV4OwotCi0gICAgICAvKiBGaW5kIHRoZSBuYW1lIHRvIHVzZSBpbiBhIERUX05FRURFRCBlbnRyeSB0aGF0IHJlZmVycyB0byB0aGlzCi0JIG9iamVjdC4gIElmIHRoZSBvYmplY3QgaGFzIGEgRFRfU09OQU1FIGVudHJ5LCB3ZSB1c2UgaXQuCi0JIE90aGVyd2lzZSwgaWYgdGhlIGdlbmVyaWMgbGlua2VyIHN0dWNrIHNvbWV0aGluZyBpbgotCSBlbGZfZHRfbmFtZSwgd2UgdXNlIHRoYXQuICBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIHRoZSBmaWxlCi0JIG5hbWUuICBJZiB0aGUgZ2VuZXJpYyBsaW5rZXIgcHV0IGEgbnVsbCBzdHJpbmcgaW50bwotCSBlbGZfZHRfbmFtZSwgd2UgZG9uJ3QgbWFrZSBhIERUX05FRURFRCBlbnRyeSBhdCBhbGwsIGV2ZW4gaWYKLQkgdGhlcmUgaXMgYSBEVF9TT05BTUUgZW50cnkuICAqLwotICAgICAgYWRkX25lZWRlZCA9IHRydWU7Ci0gICAgICBuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBpZiAoZWxmX2R0X25hbWUgKGFiZmQpICE9IE5VTEwpCi0JewotCSAgbmFtZSA9IGVsZl9kdF9uYW1lIChhYmZkKTsKLQkgIGlmICgqbmFtZSA9PSAnXDAnKQotCSAgICBhZGRfbmVlZGVkID0gZmFsc2U7Ci0JfQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JewotCSAgRWxmX0V4dGVybmFsX0R5biAqZXh0ZHluOwotCSAgRWxmX0V4dGVybmFsX0R5biAqZXh0ZHluZW5kOwotCSAgaW50IGVsZnNlYzsKLQkgIHVuc2lnbmVkIGxvbmcgbGluazsKLQotCSAgZHluYnVmID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChkeW5idWYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLAotCQkJCQkgIChmaWxlX3B0cikgMCwgcy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7Ci0JICBpZiAoZWxmc2VjID09IC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLQkgIHsKLQkgICAgLyogVGhlIHNoYXJlZCBsaWJyYXJpZXMgZGlzdHJpYnV0ZWQgd2l0aCBocHV4MTEgaGF2ZSBhIGJvZ3VzCi0JICAgICAgIHNoX2xpbmsgZmllbGQgZm9yIHRoZSAiLmR5bmFtaWMiIHNlY3Rpb24uICBUaGlzIGNvZGUgZGV0ZWN0cwotCSAgICAgICB3aGVuIExJTksgcmVmZXJzIHRvIGEgc2VjdGlvbiB0aGF0IGlzIG5vdCBhIHN0cmluZyB0YWJsZSBhbmQKLQkgICAgICAgdHJpZXMgdG8gZmluZCB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGUgIi5keW5zeW0iIHNlY3Rpb24KLQkgICAgICAgaW5zdGVhZC4gICovCi0JICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2xpbmtdOwotCSAgICBpZiAoaGRyLT5zaF90eXBlICE9IFNIVF9TVFJUQUIpCi0JICAgICAgewotCQlhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCQlpbnQgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLQkJaWYgKGVsZnNlYyA9PSAtMSkKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKLQkgICAgICB9Ci0JICB9Ci0KLQkgIGV4dGR5biA9IGR5bmJ1ZjsKLQkgIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0JICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4rKykKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCi0JICAgICAgZWxmX3N3YXBfZHluX2luIChhYmZkLCBleHRkeW4sICZkeW4pOwotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfU09OQU1FKQotCQl7Ci0JCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJICBkeW4uZF91bi5kX3ZhbCk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JCXsKLQkJICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm4sICoqcG47Ci0JCSAgY2hhciAqZm5tLCAqYW5tOwotCi0JCSAgbiA9ICgoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KSkpOwotCQkgIGZubSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJIGR5bi5kX3VuLmRfdmFsKTsKLQkJICBpZiAobiA9PSBOVUxMIHx8IGZubSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYW5tID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGZubSkgKyAxKTsKLQkJICBpZiAoYW5tID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJjcHkgKGFubSwgZm5tKTsKLQkJICBuLT5uYW1lID0gYW5tOwotCQkgIG4tPmJ5ID0gYWJmZDsKLQkJICBuLT5uZXh0ID0gTlVMTDsKLQkJICBmb3IgKHBuID0gJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotCQkgICAgICAgKnBuICE9IE5VTEw7Ci0JCSAgICAgICBwbiA9ICYoKnBuKS0+bmV4dCkKLQkJICAgIDsKLQkJICAqcG4gPSBuOwotCQl9Ci0JICAgIH0KLQotCSAgZnJlZSAoZHluYnVmKTsKLQkgIGR5bmJ1ZiA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIGFueSBvZiB0aGUgc2VjdGlvbnMgaW4gYSBkeW5hbWljCi0JIG9iamVjdCBpbiB0aGUgb3V0cHV0IGZpbGUuICBXZSBoYWNrIGJ5IHNpbXBseSBjbG9iYmVyaW5nIHRoZQotCSBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBCRkQuICBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgbW9yZQotCSBjbGVhbmx5IGJ5LCBzYXksIGEgbmV3IHNlY3Rpb24gZmxhZzsgdGhlIGV4aXN0aW5nCi0JIFNFQ19ORVZFUl9MT0FEIGZsYWcgaXMgbm90IHRoZSBvbmUgd2Ugd2FudCwgYmVjYXVzZSB0aGF0IG9uZQotCSBzdGlsbCBpbXBsaWVzIHRoYXQgdGhlIHNlY3Rpb24gdGFrZXMgdXAgc3BhY2UgaW4gdGhlIG91dHB1dAotCSBmaWxlLiAgKi8KLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiB0aGUgbGluaywgY3JlYXRlCi0JIHRoZSBzcGVjaWFsIHNlY3Rpb25zIHJlcXVpcmVkIGZvciBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JewotCSAgaWYgKCEgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChhZGRfbmVlZGVkKQotCXsKLQkgIC8qIEFkZCBhIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBkeW5hbWljIG9iamVjdC4gICovCi0JICBvbGRzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotCSAgc3RyaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLCBuYW1lLAotCQkJCQkgdHJ1ZSwgZmFsc2UpOwotCSAgaWYgKHN0cmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvbGRzaXplID09IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZHluOwotCSAgICAgIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotCSAgICAgIC8qIFRoZSBoYXNoIHRhYmxlIHNpemUgZGlkIG5vdCBjaGFuZ2UsIHdoaWNoIG1lYW5zIHRoYXQKLQkJIHRoZSBkeW5hbWljIG9iamVjdCBuYW1lIHdhcyBhbHJlYWR5IGVudGVyZWQuICBJZiB3ZQotCQkgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIHRoaXMgZHluYW1pYyBvYmplY3QgaW4gdGhlCi0JCSBsaW5rLCBqdXN0IGlnbm9yZSBpdC4gIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbmNsdWRlCi0JCSBhIHBhcnRpY3VsYXIgZHluYW1pYyBvYmplY3QgbW9yZSB0aGFuIG9uY2UuICAqLwotCSAgICAgIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJCSAgICAgICIuZHluYW1pYyIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLQkgICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLQkgICAgICBkeW5jb25lbmQgPSAoRWxmX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKwotCQkJCQkJc2R5bi0+X3Jhd19zaXplKTsKLQkgICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCi0JCSAgZWxmX3N3YXBfZHluX2luIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgZHluY29uLAotCQkJCSAgICZkeW4pOwotCQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVECi0JCSAgICAgICYmIGR5bi5kX3VuLmRfdmFsID09IHN0cmluZGV4KQotCQkgICAgewotCQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCQlmcmVlIChidWYpOwotCQkgICAgICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0JCQlmcmVlIChleHR2ZXJzeW0pOwotCQkgICAgICByZXR1cm4gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTkVFREVELCBzdHJpbmRleCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU2F2ZSB0aGUgU09OQU1FLCBpZiB0aGVyZSBpcyBvbmUsIGJlY2F1c2Ugc29tZXRpbWVzIHRoZQotICAgICAgICAgbGlua2VyIGVtdWxhdGlvbiBjb2RlIHdpbGwgbmVlZCB0byBrbm93IGl0LiAgKi8KLSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGVsZl9kdF9uYW1lIChhYmZkKSA9IG5hbWU7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJaGRyLT5zaF9vZmZzZXQgKyBleHRzeW1vZmYgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGV4dHN5bWNvdW50LCBhYmZkKQotCSAgIT0gZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3ZWFrcyA9IE5VTEw7Ci0KLSAgZXZlciA9IGV4dHZlcnN5bSAhPSBOVUxMID8gZXh0dmVyc3ltICsgZXh0c3ltb2ZmIDogTlVMTDsKLSAgZXN5bWVuZCA9IGJ1ZiArIGV4dHN5bWNvdW50OwotICBmb3IgKGVzeW0gPSBidWY7Ci0gICAgICAgZXN5bSA8IGVzeW1lbmQ7Ci0gICAgICAgZXN5bSsrLCBzeW1faGFzaCsrLCBldmVyID0gKGV2ZXIgIT0gTlVMTCA/IGV2ZXIgKyAxIDogTlVMTCkpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgYmluZDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIGRlZmluaXRpb247Ci0gICAgICBib29sZWFuIHNpemVfY2hhbmdlX29rLCB0eXBlX2NoYW5nZV9vazsKLSAgICAgIGJvb2xlYW4gbmV3X3dlYWtkZWY7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2xkX2FsaWdubWVudDsKLQotICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmc3ltKTsKLQotICAgICAgZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsdWUgPSBzeW0uc3RfdmFsdWU7Ci0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICBiaW5kID0gRUxGX1NUX0JJTkQgKHN5bS5zdF9pbmZvKTsKLSAgICAgIGlmIChiaW5kID09IFNUQl9MT0NBTCkKLQl7Ci0JICAvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlLCBzaW5jZSBFTEYgcmVxdWlyZXMgdGhhdCBhbGwKLQkgICAgIGdsb2JhbCBzeW1ib2xzIGZvbGxvdyBhbGwgbG9jYWwgc3ltYm9scywgYW5kIHRoYXQgc2hfaW5mbwotCSAgICAgcG9pbnQgdG8gdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICBVbmZvcnR1bmF0ZWFseSwgSXJpeCA1Ci0JICAgICBzY3Jld3MgdGhpcyB1cC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiaW5kID09IFNUQl9HTE9CQUwpCi0JewotCSAgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkgICAgICAmJiBzeW0uc3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkgICAgZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgZWxzZQotCSAgICBmbGFncyA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoYmluZCA9PSBTVEJfV0VBSykKLQlmbGFncyA9IEJTRl9XRUFLOwotICAgICAgZWxzZQotCXsKLQkgIC8qIExlYXZlIGl0IHVwIHRvIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JfQotCi0gICAgICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID4gMCAmJiBzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCXsKLQkgIHNlYyA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS5zdF9zaG5keCk7Ci0JICBpZiAoc2VjID09IE5VTEwpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpICE9IDApCi0JICAgIHZhbHVlIC09IHNlYy0+dm1hOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQl7Ci0JICBzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgLyogV2hhdCBFTEYgY2FsbHMgdGhlIHNpemUgd2UgY2FsbCB0aGUgdmFsdWUuICBXaGF0IEVMRgotCSAgICAgY2FsbHMgdGhlIHZhbHVlIHdlIGNhbGwgdGhlIGFsaWdubWVudC4gICovCi0JICB2YWx1ZSA9IHN5bS5zdF9zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMZWF2ZSBpdCB1cCB0byB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLwotCX0KLQotICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywgc3ltLnN0X25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xfaG9vaykKLQl7Ci0JICBpZiAoISAoKmFkZF9zeW1ib2xfaG9vaykgKGFiZmQsIGluZm8sICZzeW0sICZuYW1lLCAmZmxhZ3MsICZzZWMsCi0JCQkJICAgICZ2YWx1ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGUgaG9vayBmdW5jdGlvbiBzZXRzIHRoZSBuYW1lIHRvIE5VTEwgaWYgdGhpcyBzeW1ib2wKLQkgICAgIHNob3VsZCBiZSBza2lwcGVkIGZvciBzb21lIHJlYXNvbi4gICovCi0JICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjayB0aGF0IGFsbCBwb3NzaWJpbGl0aWVzIHdlcmUgaGFuZGxlZC4gICovCi0gICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0JZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgICAgZWxzZQotCWRlZmluaXRpb24gPSB0cnVlOwotCi0gICAgICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotICAgICAgdHlwZV9jaGFuZ2Vfb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnR5cGVfY2hhbmdlX29rOwotICAgICAgb2xkX2FsaWdubWVudCA9IDA7Ci0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcjsKLQkgIHVuc2lnbmVkIGludCB2ZXJudW0gPSAwOwotCSAgYm9vbGVhbiBvdmVycmlkZTsKLQotCSAgaWYgKGV2ZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBldmVyLCAmaXZlcik7Ci0JICAgICAgdmVybnVtID0gaXZlci52c192ZXJzICYgVkVSU1lNX1ZFUlNJT047Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgaGlkZGVuIHN5bWJvbCwgb3IgaWYgaXQgaXMgbm90IHZlcnNpb24KLSAgICAgICAgICAgICAgICAgMSwgd2UgYXBwZW5kIHRoZSB2ZXJzaW9uIG5hbWUgdG8gdGhlIHN5bWJvbCBuYW1lLgotICAgICAgICAgICAgICAgICBIb3dldmVyLCB3ZSBkbyBub3QgbW9kaWZ5IGEgbm9uLWhpZGRlbiBhYnNvbHV0ZQotICAgICAgICAgICAgICAgICBzeW1ib2wsIGJlY2F1c2UgaXQgbWlnaHQgYmUgdGhlIHZlcnNpb24gc3ltYm9sCi0gICAgICAgICAgICAgICAgIGl0c2VsZi4gIEZJWE1FOiBXaGF0IGlmIGl0IGlzbid0PyAgKi8KLQkgICAgICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pICE9IDAKLQkJICB8fCAodmVybnVtID4gMSAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkpCi0JCXsKLQkJICBjb25zdCBjaGFyICp2ZXJzdHI7Ci0JCSAgaW50IG5hbWVsZW4sIG5ld2xlbjsKLQkJICBjaGFyICpuZXduYW1lLCAqcDsKLQotCQkgIGlmIChzeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGKQotCQkgICAgewotCQkgICAgICBpZiAodmVybnVtID4gZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkci5zaF9pbmZvKQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6ICVzOiBpbnZhbGlkIHZlcnNpb24gJXUgKG1heCAlZCkiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHZlcm51bSwKLQkJCSAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkci5zaF9pbmZvKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgICBlbHNlIGlmICh2ZXJudW0gPiAxKQotCQkJdmVyc3RyID0KLQkJCSAgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCQkgICAgICBlbHNlCi0JCQl2ZXJzdHIgPSAiIjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGNhbm5vdCBzaW1wbHkgdGVzdCBmb3IgdGhlIG51bWJlciBvZgotCQkJIGVudHJpZXMgaW4gdGhlIFZFUk5FRUQgc2VjdGlvbiBzaW5jZSB0aGUKLQkJCSBudW1iZXJzIGZvciB0aGUgbmVlZGVkIHZlcnNpb25zIGRvIG5vdCBzdGFydAotCQkJIGF0IDAuICAqLwotCQkgICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQkgICAgICB2ZXJzdHIgPSBOVUxMOwotCQkgICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCQkgICB0ICE9IE5VTEw7Ci0JCQkgICB0ID0gdC0+dm5fbmV4dHJlZikKLQkJCXsKLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkJCSAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCQl7Ci0JCQkJICB2ZXJzdHIgPSBhLT52bmFfbm9kZW5hbWU7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBpZiAoYSAhPSBOVUxMKQotCQkJICAgIGJyZWFrOwotCQkJfQotCQkgICAgICBpZiAodmVyc3RyID09IE5VTEwpCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogJXM6IGludmFsaWQgbmVlZGVkIHZlcnNpb24gJWQiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHZlcm51bSk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQkJICAgIH0KLQotCQkgIG5hbWVsZW4gPSBzdHJsZW4gKG5hbWUpOwotCQkgIG5ld2xlbiA9IG5hbWVsZW4gKyBzdHJsZW4gKHZlcnN0cikgKyAyOwotCQkgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgPT0gMCkKLQkJICAgICsrbmV3bGVuOwotCi0JCSAgbmV3bmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgbmV3bGVuKTsKLQkJICBpZiAobmV3bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQkJICBwID0gbmV3bmFtZSArIG5hbWVsZW47Ci0JCSAgKnArKyA9IEVMRl9WRVJfQ0hSOwotCQkgIC8qIElmIHRoaXMgaXMgYSBkZWZpbmVkIG5vbi1oaWRkZW4gdmVyc2lvbiBzeW1ib2wsCi0JCSAgICAgd2UgYWRkIGFub3RoZXIgQCB0byB0aGUgbmFtZS4gIFRoaXMgaW5kaWNhdGVzIHRoZQotCQkgICAgIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgKi8KLQkJICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pID09IDAKLQkJICAgICAgJiYgc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRikKLQkJICAgICpwKysgPSBFTEZfVkVSX0NIUjsKLQkJICBzdHJjcHkgKHAsIHZlcnN0cik7Ci0KLQkJICBuYW1lID0gbmV3bmFtZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIG5hbWUsICZzeW0sICZzZWMsICZ2YWx1ZSwKLQkJCQkgIHN5bV9oYXNoLCAmb3ZlcnJpZGUsICZ0eXBlX2NoYW5nZV9vaywKLQkJCQkgICZzaXplX2NoYW5nZV9vaykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAob3ZlcnJpZGUpCi0JICAgIGRlZmluaXRpb24gPSBmYWxzZTsKLQotCSAgaCA9ICpzeW1faGFzaDsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICAvKiBSZW1lbWJlciB0aGUgb2xkIGFsaWdubWVudCBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbCwgc28KLSAgICAgICAgICAgICB0aGF0IHdlIGRvbid0IHJlZHVjZSB0aGUgYWxpZ25tZW50IGxhdGVyIG9uLiAgV2UgY2FuJ3QKLSAgICAgICAgICAgICBjaGVjayBsYXRlciwgYmVjYXVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgIHdpbGwgc2V0IGEgZGVmYXVsdCBmb3IgdGhlIGFsaWdubWVudCB3aGljaCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAgb3ZlcnJpZGUuICAqLwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgb2xkX2FsaWdubWVudCA9IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLQotCSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiAhPSBOVUxMCi0JICAgICAgJiYgISBvdmVycmlkZQotCSAgICAgICYmIHZlcm51bSA+IDEKLQkgICAgICAmJiBkZWZpbml0aW9uKQotCSAgICBoLT52ZXJpbmZvLnZlcmRlZiA9ICZlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV07Ci0JfQotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkgICAgICBmYWxzZSwgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBoID0gKnN5bV9oYXNoOwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLSAgICAgICpzeW1faGFzaCA9IGg7Ci0KLSAgICAgIG5ld193ZWFrZGVmID0gZmFsc2U7Ci0gICAgICBpZiAoZHluYW1pYwotCSAgJiYgZGVmaW5pdGlvbgotCSAgJiYgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICYmIEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMKLQkgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaC0+d2Vha2RlZiA9PSBOVUxMKQotCXsKLQkgIC8qIEtlZXAgYSBsaXN0IG9mIGFsbCB3ZWFrIGRlZmluZWQgbm9uIGZ1bmN0aW9uIHN5bWJvbHMgZnJvbQotCSAgICAgYSBkeW5hbWljIG9iamVjdCwgdXNpbmcgdGhlIHdlYWtkZWYgZmllbGQuICBMYXRlciBpbiB0aGlzCi0JICAgICBmdW5jdGlvbiB3ZSB3aWxsIHNldCB0aGUgd2Vha2RlZiBmaWVsZCB0byB0aGUgY29ycmVjdAotCSAgICAgdmFsdWUuICBXZSBvbmx5IHB1dCBub24tZnVuY3Rpb24gc3ltYm9scyBmcm9tIGR5bmFtaWMKLQkgICAgIG9iamVjdHMgb24gdGhpcyBsaXN0LCBiZWNhdXNlIHRoYXQgaGFwcGVucyB0byBiZSB0aGUgb25seQotCSAgICAgdGltZSB3ZSBuZWVkIHRvIGtub3cgdGhlIG5vcm1hbCBzeW1ib2wgY29ycmVzcG9uZGluZyB0byBhCi0JICAgICB3ZWFrIHN5bWJvbCwgYW5kIHRoZSBpbmZvcm1hdGlvbiBpcyB0aW1lIGNvbnN1bWluZyB0bwotCSAgICAgZmlndXJlIG91dC4gIElmIHRoZSB3ZWFrZGVmIGZpZWxkIGlzIG5vdCBhbHJlYWR5IE5VTEwsCi0JICAgICB0aGVuIHRoaXMgc3ltYm9sIHdhcyBhbHJlYWR5IGRlZmluZWQgYnkgc29tZSBwcmV2aW91cwotCSAgICAgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSB3aWxsIGJlIHVzaW5nIHRoYXQgcHJldmlvdXMKLQkgICAgIGRlZmluaXRpb24gYW55aG93LiAgKi8KLQotCSAgaC0+d2Vha2RlZiA9IHdlYWtzOwotCSAgd2Vha3MgPSBoOwotCSAgbmV3X3dlYWtkZWYgPSB0cnVlOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTgotCSAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXsKLQkgIHVuc2lnbmVkIGludCBhbGlnbjsKLQotCSAgYWxpZ24gPSBiZmRfbG9nMiAoc3ltLnN0X3ZhbHVlKTsKLQkgIGlmIChhbGlnbiA+IG9sZF9hbGlnbm1lbnQpCi0JICAgIGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlciA9IGFsaWduOwotCX0KLQotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBpbnQgb2xkX2ZsYWdzOwotCSAgYm9vbGVhbiBkeW5zeW07Ci0JICBpbnQgbmV3X2ZsYWc7Ci0KLQkgIC8qIFJlbWVtYmVyIHRoZSBzeW1ib2wgc2l6ZSBhbmQgdHlwZS4gICovCi0JICBpZiAoc3ltLnN0X3NpemUgIT0gMAotCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPnNpemUgPT0gMCkpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+c2l6ZSAhPSAwICYmIGgtPnNpemUgIT0gc3ltLnN0X3NpemUgJiYgISBzaXplX2NoYW5nZV9vaykKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIldhcm5pbmc6IHNpemUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVsdSB0byAlbHUgaW4gJXMiKSwKLQkJICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcpIGgtPnNpemUsICh1bnNpZ25lZCBsb25nKSBzeW0uc3Rfc2l6ZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICAgICAgaC0+c2l6ZSA9IHN5bS5zdF9zaXplOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIGFsd2F5cyB3YW50IEgtPlNJWkUKLSAgICAgICAgICAgICB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIFRoZSBjb2RlIGp1c3QgYWJvdmUKLSAgICAgICAgICAgICB3b24ndCBmaXggdGhlIHNpemUgaWYgYSBjb21tb24gc3ltYm9sIGJlY29tZXMgbGFyZ2VyLiAgV2UKLSAgICAgICAgICAgICBkb24ndCB3YXJuIGFib3V0IGEgc2l6ZSBjaGFuZ2UgaGVyZSwgYmVjYXVzZSB0aGF0IGlzCi0gICAgICAgICAgICAgY292ZXJlZCBieSAtLXdhcm4tY29tbW9uLiAgKi8KLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIGgtPnNpemUgPSBoLT5yb290LnUuYy5zaXplOwotCi0JICBpZiAoRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfTk9UWVBFCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+dHlwZSA9PSBTVFRfTk9UWVBFKSkKLQkgICAgewotCSAgICAgIGlmIChoLT50eXBlICE9IFNUVF9OT1RZUEUKLQkJICAmJiBoLT50eXBlICE9IEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykKLQkJICAmJiAhIHR5cGVfY2hhbmdlX29rKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLQkJICAgbmFtZSwgaC0+dHlwZSwgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICAgICAgaC0+dHlwZSA9IEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbyk7Ci0JICAgIH0KLQotCSAgLyogSWYgc3Rfb3RoZXIgaGFzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG1lYW5pbmcsIHNwZWNpZmljIGNvZGUKLQkgICAgIG1pZ2h0IGJlIG5lZWRlZCBoZXJlLiAgKi8KLQkgIGlmIChzeW0uc3Rfb3RoZXIgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIENvbWJpbmUgdmlzaWJpbGl0aWVzLCB1c2luZyB0aGUgbW9zdCBjb25zdHJhaW5pbmcgb25lLiAgKi8KLQkgICAgICB1bnNpZ25lZCBjaGFyIGh2aXMgICA9IEVMRl9TVF9WSVNJQklMSVRZIChoLT5vdGhlcik7Ci0JICAgICAgdW5zaWduZWQgY2hhciBzeW12aXMgPSBFTEZfU1RfVklTSUJJTElUWSAoc3ltLnN0X290aGVyKTsKLQkgICAgICAKLQkgICAgICBpZiAoc3ltdmlzICYmIChodmlzID4gc3ltdmlzIHx8IGh2aXMgPT0gMCkpCi0JCWgtPm90aGVyID0gc3ltLnN0X290aGVyOwotCSAgICAgIAotCSAgICAgIC8qIElmIG5laXRoZXIgaGFzIHZpc2liaWxpdHksIHVzZSB0aGUgc3Rfb3RoZXIgb2YgdGhlCi0JICAgICAgICAgZGVmaW5pdGlvbi4gIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGNob2ljZSwgc2luY2UgdGhlCi0JICAgICAgICAgb3RoZXIgYml0cyBoYXZlIG5vIGdlbmVyYWwgbWVhbmluZy4gICovCi0JICAgICAgaWYgKCFzeW12aXMgJiYgIWh2aXMKLQkJICAmJiAoZGVmaW5pdGlvbiB8fCBoLT5vdGhlciA9PSAwKSkKLQkJaC0+b3RoZXIgPSBzeW0uc3Rfb3RoZXI7Ci0JICAgIH0KLQotCSAgLyogU2V0IGEgZmxhZyBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mCi0JICAgICByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLiAgS2VlcCBhIGNvdW50IG9mCi0JICAgICB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbAotCSAgICAgaXMgb25lIHdoaWNoIGlzIHJlZmVyZW5jZWQgb3IgZGVmaW5lZCBieSBib3RoIGEgcmVndWxhcgotCSAgICAgb2JqZWN0IGFuZCBhIHNoYXJlZCBvYmplY3QuICAqLwotCSAgb2xkX2ZsYWdzID0gaC0+ZWxmX2xpbmtfaGFzaF9mbGFnczsKLQkgIGR5bnN5bSA9IGZhbHNlOwotCSAgaWYgKCEgZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmICghIGRlZmluaXRpb24pCi0JCXsKLQkJICBuZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JCSAgaWYgKGJpbmQgIT0gU1RCX1dFQUspCi0JCSAgICBuZXdfZmxhZyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCSAgfHwgKG9sZF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSkgIT0gMCkKLQkJZHluc3ltID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVmaW5pdGlvbikKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotCSAgICAgIGVsc2UKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCSAgICAgIGlmICgob2xkX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKLQkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwCi0JCSAgfHwgKGgtPndlYWtkZWYgIT0gTlVMTAotCQkgICAgICAmJiAhIG5ld193ZWFrZGVmCi0JCSAgICAgICYmIGgtPndlYWtkZWYtPmR5bmluZHggIT0gLTEpKQotCQlkeW5zeW0gPSB0cnVlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gbmV3X2ZsYWc7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhIHZlcnNpb24sIGFuZCBpdCBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIHZlcnNpb24sIHdlIGNyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wgZnJvbSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIG5hbWUgdG8gdGhlIGZ1bGx5IGRlY29yYXRlZCBuYW1lLiAgVGhpcyB3aWxsIGNhdXNlCi0gICAgICAgICAgICAgZXh0ZXJuYWwgcmVmZXJlbmNlcyB3aGljaCBkbyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gdG8gYmUKLSAgICAgICAgICAgICBib3VuZCB0byB0aGlzIHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoZGVmaW5pdGlvbikKLQkgICAgewotCSAgICAgIGNoYXIgKnA7Ci0KLQkgICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwWzFdID09IEVMRl9WRVJfQ0hSKQotCQl7Ci0JCSAgY2hhciAqc2hvcnRuYW1lOwotCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKLQkJICBib29sZWFuIG92ZXJyaWRlOwotCi0JCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJCSBwIC0gbmFtZSArIDEpOwotCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOwotCQkgIHNob3J0bmFtZVtwIC0gbmFtZV0gPSAnXDAnOwotCi0JCSAgLyogV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuICBNZXJnZSBpdAotICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sIHdpdGggdGhpcyBuYW1lLiAgRm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgcHVycG9zZXMgb2YgdGhlIG1lcmdlLCBhY3QgYXMgdGhvdWdoIHdlIHdlcmUKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBzeW1ib2wgd2UganVzdCBkZWZpbmVkLCBhbHRob3VnaCB3ZQotICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgZ29pbmcgdG8gZGVmaW5lIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCi0JCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKLQkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAotCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgaWYgKCEgb3ZlcnJpZGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCi0JCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCi0JCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJbiB0aGlzIGNhc2UgdGhlIHN5bWJvbCBuYW1lZCBTSE9SVE5BTUUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nIHRoZSBpbmRpcmVjdCBzeW1ib2wgd2Ugd2FudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC4gIFdlIHdlcmUgcGxhbm5pbmcgb24gbWFraW5nIFNIT1JUTkFNRSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0IHN5bWJvbCByZWZlcnJpbmcgdG8gTkFNRS4gIFNIT1JUTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBuYW1lIHdpdGhvdXQgYSB2ZXJzaW9uLiAgTkFNRSBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSB2ZXJzaW9uZWQgbmFtZSwgYW5kIGl0IGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KLQotCQkJIE92ZXJyaWRpbmcgbWVhbnMgdGhhdCB3ZSBhbHJlYWR5IHNhdyBhCi0JCQkgZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbCBTSE9SVE5BTUUgaW4gYQotCQkJIHJlZ3VsYXIgb2JqZWN0LCBhbmQgaXQgaXMgb3ZlcnJpZGluZyB0aGUKLQkJCSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgZHluYW1pYyBvYmplY3QuCi0KLQkJCSBXaGVuIHRoaXMgaGFwcGVucywgd2UgYWN0dWFsbHkgd2FudCB0byBjaGFuZ2UKLQkJCSBOQU1FLCB0aGUgc3ltYm9sIHdlIGp1c3QgYWRkZWQsIHRvIHJlZmVyIHRvCi0JCQkgU0hPUlROQU1FLiAgVGhpcyB3aWxsIGNhdXNlIHJlZmVyZW5jZXMgdG8KLQkJCSBOQU1FIGluIHRoZSBzaGFyZWQgb2JqZWN0IHRvIGJlY29tZQotCQkJIHJlZmVyZW5jZXMgdG8gU0hPUlROQU1FIGluIHRoZSByZWd1bGFyCi0JCQkgb2JqZWN0LiAgVGhpcyBpcyB3aGF0IHdlIGV4cGVjdCB3aGVuIHdlCi0JCQkgb3ZlcnJpZGUgYSBmdW5jdGlvbiBpbiBhIHNoYXJlZCBvYmplY3Q6IHRoYXQKLQkJCSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2hhcmVkIG9iamVjdCB3aWxsIGJlCi0JCQkgbWFwcGVkIHRvIHRoZSBkZWZpbml0aW9uIGluIHRoZSByZWd1bGFyCi0JCQkgb2JqZWN0LiAgKi8KLQotCQkgICAgICB3aGlsZSAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCQkgICAgIHx8IGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQkJaGkgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaGktPnJvb3QudS5pLmxpbms7Ci0KLQkJICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDsKLQkJICAgICAgaC0+cm9vdC51LmkubGluayA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoaTsKLQkJICAgICAgaWYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKQotCQkJewotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCQkJICBoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotCQkJICBpZiAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkJCSBoaSkpCi0JCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIE5vdyBzZXQgSEkgdG8gSCwgc28gdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgb3RoZXIgZmllbGRzIGNvcnJlY3RseS4gICovCi0JCSAgICAgIGhpID0gaDsKLQkJICAgIH0KLQotCQkgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAotCQkgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICBXZQotCQkgICAgIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbiB0aGF0Ci0JCSAgICAgY2FzZS4gICovCi0KLQkJICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHQ7Ci0KLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UgYXNzdW1lCi0JCQkgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbiBiZWZvcmUuICAqLwotCQkgICAgICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICAgICAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgID09IDApOwotCi0JCSAgICAgIGh0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOwotCQkgICAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfY29weV9pbmRpcmVjdF9zeW1ib2wpIChodCwgaGkpOwotCi0JCSAgICAgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZSB0aGF0Ci0JCQkgdGhlIHN5bWJvbCBtdXN0IGJlIGR5bmFtaWMuICAqLwotCQkgICAgICBpZiAoISBkeW5zeW0pCi0JCQl7Ci0JCQkgIGlmICghIGR5bmFtaWMpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGluZm8tPnNoYXJlZAotCQkJCSAgfHwgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpCi0JCQkJICAgICAgIT0gMCkpCi0JCQkJZHluc3ltID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwKQotCQkJCWR5bnN5bSA9IHRydWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCi0JCSAgLyogV2UgYWxzbyBuZWVkIHRvIGRlZmluZSBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLwotCi0JCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJCSBzdHJsZW4gKG5hbWUpKTsKLQkJICBpZiAoc2hvcnRuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJuY3B5IChzaG9ydG5hbWUsIG5hbWUsIHAgLSBuYW1lKTsKLQkJICBzdHJjcHkgKHNob3J0bmFtZSArIChwIC0gbmFtZSksIHAgKyAxKTsKLQotCQkgIC8qIE9uY2UgYWdhaW4sIG1lcmdlIHdpdGggYW55IGV4aXN0aW5nIHN5bWJvbC4gICovCi0JCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKLQkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAotCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgaWYgKG92ZXJyaWRlKQotCQkgICAgewotCQkgICAgICAvKiBIZXJlIFNIT1JUTkFNRSBpcyBhIHZlcnNpb25lZCBuYW1lLCBzbyB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGV4cGVjdCB0byBzZWUgdGhlIHR5cGUgb2Ygb3ZlcnJpZGUgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBkbyBpbiB0aGUgY2FzZSBhYm92ZS4gICovCi0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiB3YXJuaW5nOiB1bmV4cGVjdGVkIHJlZGVmaW5pdGlvbiBvZiBgJXMnIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNob3J0bmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJCSAgICAgKGluZm8sIGFiZmQsIHNob3J0bmFtZSwgQlNGX0lORElSRUNULAotCQkJICAgICAgYmZkX2luZF9zZWN0aW9uX3B0ciwgKGJmZF92bWEpIDAsIG5hbWUsIGZhbHNlLAotCQkJICAgICAgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGkpKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuCi0gICAgICAgICAgICAgICAgICAgICAgICAgV2Ugd2lsbCBoYXZlIHJlcG9ydGVkIGFuIGVycm9yIHRvIHRoZSB1c2VyIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYXNlLiAgKi8KLQotCQkgICAgICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQkJewotCQkJICAvKiBJZiB0aGUgc3ltYm9sIGJlY2FtZSBpbmRpcmVjdCwgdGhlbiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUuICAqLwotCQkJICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCQkgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkJICAgICAgPT0gMCk7Ci0KLQkJICAgICAgICAgICgqYmVkLT5lbGZfYmFja2VuZF9jb3B5X2luZGlyZWN0X3N5bWJvbCkgKGgsIGhpKTsKLQotCQkJICAvKiBTZWUgaWYgdGhlIG5ldyBmbGFncyBsZWFkIHVzIHRvIHJlYWxpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgc3ltYm9sIG11c3QgYmUgZHluYW1pYy4gICovCi0JCQkgIGlmICghIGR5bnN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoISBkeW5hbWljKQotCQkJCXsKLQkJCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJCQkgICAgICB8fCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJCSAgICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykKLQkJCQkJICAhPSAwKSkKLQkJCQkgICAgZHluc3ltID0gdHJ1ZTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgaWYgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDApCi0JCQkJICAgIGR5bnN5bSA9IHRydWU7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChkeW5zeW0gJiYgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTAotCQkgICYmICEgbmV3X3dlYWtkZWYKLQkJICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sCi0JCQkJCQkJICAgICBoLT53ZWFrZGVmKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGR5bnN5bSAmJiBoLT5keW5pbmR4ICE9IC0xKQotCSAgICAvKiBJZiB0aGUgc3ltYm9sIGFscmVhZHkgaGFzIGEgZHluYW1pYyBpbmRleCwgYnV0Ci0JICAgICAgIHZpc2liaWxpdHkgc2F5cyBpdCBzaG91bGQgbm90IGJlIHZpc2libGUsIHR1cm4gaXQgaW50bwotCSAgICAgICBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgIHN3aXRjaCAoRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBTVFZfSU5URVJOQUw6Ci0JICAgICAgY2FzZSBTVFZfSElEREVOOiAgCi0JCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkoKmJlZC0+ZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wpIChoKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgd2Vha2RlZnMgZmllbGQgY29ycmVjdGx5IGZvciBhbGwgdGhlIHdlYWsgZGVmaW5lZAotICAgICBzeW1ib2xzIHdlIGZvdW5kLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2VhcmNoIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgaW5mb3JtYXRpb24gZm9yIG5vbiBmdW5jdGlvbnMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzLCB0aGF0J3MgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24KLSAgICAgdGhlIGxpc3QgV0VBS1MuICBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gc28gdGhhdCBpZiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHJlZmVycyB0byBhIHN5bWJvbCBkZWZpbmVkIHdlYWtseSBpbiBhIGR5bmFtaWMgb2JqZWN0LCB0aGUKLSAgICAgcmVhbCBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzIGFsc28gcHV0IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHM7IHdlIGFsc28gbXVzdCBhcnJhbmdlIGZvciBib3RoIHN5bWJvbHMgdG8gcG9pbnQgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiAgV2UgY291bGQgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2Ygc3ltYm9sCi0gICAgIGFsaWFzaW5nLCBidXQgYSBnZW5lcmFsIHN5bWJvbCBhbGlhcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgaW4KLSAgICAgYXNzZW1ibGVyIGNvZGUsIGhhbmRsaW5nIGl0IGNvcnJlY3RseSB3b3VsZCBiZSB2ZXJ5IHRpbWUKLSAgICAgY29uc3VtaW5nLCBhbmQgb3RoZXIgRUxGIGxpbmtlcnMgZG9uJ3QgaGFuZGxlIGdlbmVyYWwgYWxpYXNpbmcKLSAgICAgZWl0aGVyLiAgKi8KLSAgd2hpbGUgKHdlYWtzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhsb29rOwotICAgICAgYXNlY3Rpb24gKnNsb29rOwotICAgICAgYmZkX3ZtYSB2bG9vazsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHBlbmQ7Ci0KLSAgICAgIGhsb29rID0gd2Vha3M7Ci0gICAgICB3ZWFrcyA9IGhsb29rLT53ZWFrZGVmOwotICAgICAgaGxvb2stPndlYWtkZWYgPSBOVUxMOwotCi0gICAgICBCRkRfQVNTRVJUIChobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0gICAgICBzbG9vayA9IGhsb29rLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICB2bG9vayA9IGhsb29rLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBocHAgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gICAgICBocHBlbmQgPSBocHAgKyBleHRzeW1jb3VudDsKLSAgICAgIGZvciAoOyBocHAgPCBocHBlbmQ7IGhwcCsrKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwcDsKLQkgIGlmIChoICE9IE5VTEwgJiYgaCAhPSBobG9vawotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2xvb2sKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnZhbHVlID09IHZsb29rKQotCSAgICB7Ci0JICAgICAgaGxvb2stPndlYWtkZWYgPSBoOwotCi0JICAgICAgLyogSWYgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0JCSBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKLQkJIGFzIHdlbGwuICAqLwotCSAgICAgIGlmIChobG9vay0+ZHluaW5keCAhPSAtMQotCQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0gICAgICAgICAgICAgICAgIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgd2VhayBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotICAgICAgICAgICAgICAgICBhcyB3ZWxsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB0aGUgZHluYW1pYwotICAgICAgICAgICAgICAgICBsb2FkZXIgbWlnaHQgbm90IG1lcmdlIHRoZSBlbnRyaWVzIGZvciB0aGUgcmVhbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCB0aGUgd2VhayBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIGhsb29rLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGhsb29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgICAgIGV4dHZlcnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IG9iamVjdCwgYW5kIGl0IGlzCi0gICAgIG5vdCBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGxldCB0aGUgYmFja2VuZCBsb29rIHRocm91Z2ggdGhlCi0gICAgIHJlbG9jcy4KLQotICAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhbmQgdG8KLSAgICAgYXJyYW5nZSBmb3IgZHluYW1pYyByZWxvY3MuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZQotICAgICBwYXJ0aWN1bGFyIGNvbW1vbiBjYXNlIG9mIGxpbmtpbmcgbm9uIFBJQyBjb2RlLCBldmVuIHdoZW4gbGlua2luZwotICAgICBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSBvZgotICAgICBrbm93aW5nIHdoZXRoZXIgYW4gb2JqZWN0IGZpbGUgaGFzIGJlZW4gY29tcGlsZWQgUElDIG9yIG5vdC4KLSAgICAgTG9va2luZyB0aHJvdWdoIHRoZSByZWxvY3MgaXMgbm90IHBhcnRpY3VsYXJseSB0aW1lIGNvbnN1bWluZy4KLSAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBtdXN0IGVpdGhlciAoMSkga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeSwKLSAgICAgd2hpY2ggY2F1c2VzIHRoZSBsaW5rZXIgdG8gcmVxdWlyZSBhZGRpdGlvbmFsIHJ1bnRpbWUgbWVtb3J5IG9yCi0gICAgICgyKSByZWFkIHRoZSByZWxvY3MgdHdpY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSwgd2hpY2ggd2FzdGVzIHRpbWUuCi0gICAgIFRoaXMgd291bGQgYmUgYSBnb29kIGNhc2UgZm9yIHVzaW5nIG1tYXAuCi0KLSAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGhhbmRsZSBsaW5raW5nIFBJQyBjb2RlIGludG8gYSBmaWxlIG9mIGEKLSAgICAgZGlmZmVyZW50IGZvcm1hdC4gIEl0IHByb2JhYmx5IGNhbid0IGJlIGRvbmUuICAqLwotICBjaGVja19yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNoZWNrX3JlbG9jczsKLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjaGVja19yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCi0JICAgICAgfHwgKChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIpCi0JCSAgJiYgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG8tPm91dHB1dF9zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgb2sgPSAoKmNoZWNrX3JlbG9jcykgKGFiZmQsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCi0JICBpZiAoISBvaykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgdGhlIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0Ci0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKLQotICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGlmIChzdGFiICE9IE5VTEwpCi0JewotCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2VjZGF0YTsKLQotCSAgICAgIHNlY2RhdGEgPSBlbGZfc2VjdGlvbl9kYXRhIChzdGFiKTsKLQkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwKLQkJCQkJICAgICAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKLQkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIGlmIChkeW52ZXIgIT0gTlVMTCkKLSAgICBmcmVlIChkeW52ZXIpOwotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDcmVhdGUgc29tZSBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGR5bmFtaWMgbGlua2luZwotICAgaW5mb3JtYXRpb24uICBBQkZEIGlzIGFuIGlucHV0IGZpbGUgd2hpY2ggcmVxdWlyZXMgZHluYW1pYyBzZWN0aW9ucwotICAgdG8gYmUgY3JlYXRlZC4gIFRoZSBkeW5hbWljIHNlY3Rpb25zIHRha2UgdXAgdmlydHVhbCBtZW1vcnkgc3BhY2UKLSAgIHdoZW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUgaXMgcnVuLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZQotICAgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgV2Ugd29yayBvdXQgdGhlCi0gICBhY3R1YWwgY29udGVudHMgYW5kIHNpemUgb2YgdGhlc2Ugc2VjdGlvbnMgbGF0ZXIuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgc2VjdGlvbnMgdXNlIHRoZSBzYW1lIGlucHV0IEJGRC4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgZWxzZQotICAgIGFiZmQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgZm9yIGFsbCBvZiB0aGVzZQotICAgICBzZWN0aW9ucy4gICovCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgLyogQSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBoYXMgYSAuaW50ZXJwIHNlY3Rpb24sIGJ1dCBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGRvZXMgbm90LiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmludGVycCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBzZWN0aW9ucyB0byBob2xkIHZlcnNpb24gaW5mb3JtYXRpb25zLiAgVGhlc2UgYXJlIHJlbW92ZWQKLSAgICAgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4gICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BlY2lhbCBzeW1ib2wgX0RZTkFNSUMgaXMgYWx3YXlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5keW5hbWljIHNlY3Rpb24uICBUaGlzIGNhbGwgb2NjdXJzIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUKLSAgICAgc3ltYm9scyBmb3IgYW55IGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0gICAgIG92ZXJyaWRpbmcgYSBkeW5hbWljIGRlZmluaXRpb24uICBXZSBjb3VsZCBzZXQgX0RZTkFNSUMgaW4gYQotICAgICBsaW5rZXIgc2NyaXB0LCBidXQgd2Ugb25seSB3YW50IHRvIGRlZmluZSBpdCBpZiB3ZSBhcmUsIGluIGZhY3QsCi0gICAgIGNyZWF0aW5nIGEgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHRoZXJlCi0gICAgIGlzIG5vIC5keW5hbWljIHNlY3Rpb24sIHNpbmNlIG9uIHNvbWUgRUxGIHBsYXRmb3JtcyB0aGUgc3RhcnQgdXAKLSAgICAgY29kZSBleGFtaW5lcyBpdCB0byBkZWNpZGUgaG93IHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3MuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX0RZTkFNSUMiLCBCU0ZfR0xPQkFMLCBzLCAoYmZkX3ZtYSkgMCwKLQkgIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaGFzaCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfaGFzaF9lbnRyeTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgbGV0cyB0aGUKLSAgICAgYmFja2VuZCBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgVGhlIGJhY2tlbmQgd2lsbCBub3JtYWxseSBjcmVhdGUKLSAgICAgdGhlIC5nb3QgYW5kIC5wbHQgc2VjdGlvbnMuICAqLwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIC5keW5hbWljIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdGFnOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IG5ld3NpemU7Ci0gIGJmZF9ieXRlICpuZXdjb250ZW50czsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgbmV3c2l6ZSA9IHMtPl9yYXdfc2l6ZSArIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0gIG5ld2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywgbmV3c2l6ZSk7Ci0gIGlmIChuZXdjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkeW4uZF90YWcgPSB0YWc7Ci0gIGR5bi5kX3VuLmRfdmFsID0gdmFsOwotICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sCi0JCSAgICAoRWxmX0V4dGVybmFsX0R5biAqKSAobmV3Y29udGVudHMgKyBzLT5fcmF3X3NpemUpKTsKLQotICBzLT5fcmF3X3NpemUgPSBuZXdzaXplOwotICBzLT5jb250ZW50cyA9IG5ld2NvbnRlbnRzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBuZXcgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfaW5keCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBsb25nIGlucHV0X2luZHg7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplbnRyeTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKmVodDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICBFbGZfRXh0ZXJuYWxfU3ltIGVzeW07Ci0gIHVuc2lnbmVkIGxvbmcgZHluc3RyX2luZGV4OwotICBjaGFyICpuYW1lOwotCi0gIC8qIFNlZSBpZiB0aGUgZW50cnkgZXhpc3RzIGFscmVhZHkuICAqLwotICBmb3IgKGVudHJ5ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZW50cnkgOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIGlmIChlbnRyeS0+aW5wdXRfYmZkID09IGlucHV0X2JmZCAmJiBlbnRyeS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKikKLSAgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwgc2l6ZW9mICgqZW50cnkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdvIGZpbmQgdGhlIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gZmluZCBpdCdzIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwKLQkJKGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkci5zaF9vZmZzZXQKLQkJICsgaW5wdXRfaW5keCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgmZXN5bSwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgMSwgaW5wdXRfYmZkKQotCSAgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmVzeW0sICZlbnRyeS0+aXN5bSk7Ci0KLSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAoaW5wdXRfYmZkLCBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHIuc2hfbGluaywKLQkgICBlbnRyeS0+aXN5bS5zdF9uYW1lKSk7Ci0KLSAgZHluc3RyID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHI7Ci0gIGlmIChkeW5zdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bnN0cl9pbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChkeW5zdHJfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZW50cnktPmlzeW0uc3RfbmFtZSA9IGR5bnN0cl9pbmRleDsKLQotICBlaHQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgZW50cnktPm5leHQgPSBlaHQtPmR5bmxvY2FsOwotICBlaHQtPmR5bmxvY2FsID0gZW50cnk7Ci0gIGVudHJ5LT5pbnB1dF9iZmQgPSBpbnB1dF9iZmQ7Ci0gIGVudHJ5LT5pbnB1dF9pbmR4ID0gaW5wdXRfaW5keDsKLSAgZWh0LT5keW5zeW1jb3VudCsrOwotCi0gIC8qIFdoYXRldmVyIGJpbmRpbmcgdGhlIHN5bWJvbCBoYWQgYmVmb3JlLCBpdCdzIG5vdyBsb2NhbC4gICovCi0gIGVudHJ5LT5pc3ltLnN0X2luZm8KLSAgICA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIEVMRl9TVF9UWVBFIChlbnRyeS0+aXN5bS5zdF9pbmZvKSk7Ci0KLSAgLyogVGhlIGR5bmluZHggd2lsbCBiZSBzZXQgYXQgdGhlIGVuZCBvZiBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZnJvbSB0aGUgc2VjdGlvbiBpbmRpY2F0ZWQgYnkgU0hEUi4gIFRoaXMKLSAgIG1heSBiZSBlaXRoZXIgYSBSRUwgb3IgYSBSRUxBIHNlY3Rpb24uICBUaGUgcmVsb2NhdGlvbnMgYXJlCi0gICB0cmFuc2xhdGVkIGludG8gUkVMQSByZWxvY2F0aW9ucyBhbmQgc3RvcmVkIGluIElOVEVSTkFMX1JFTE9DUywKLSAgIHdoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgdG8gY29udGFpbiBlbm91Z2ggc3BhY2UuCi0gICBUaGUgRVhURVJOQUxfUkVMT0NTIGFyZSBhIGJ1ZmZlciB3aGVyZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUKLSAgIHJlbG9jYXRpb25zIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIChhYmZkLCBzaGRyLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJICAgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMsIHRoYXQncyBPSy4gICovCi0gIGlmICghc2hkcikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBQb3NpdGlvbiBvdXJzZWx2ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBzaGRyLT5zaF9zaXplLCBhYmZkKQotICAgICAgIT0gc2hkci0+c2hfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCAqaXJlbDsKLQotICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxlbmQgPSBlcmVsICsgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0gICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGlyZWwgPSBiZmRfYWxsb2MgKGFiZmQsIChiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsCi0JCQkgICAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWwpKSk7Ci0gICAgICBmb3IgKDsgZXJlbCA8IGVyZWxlbmQ7IGVyZWwrKywgaXJlbGEgKz0gYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIGk7Ci0KLQkgIGlmIChiZWQtPnMtPnN3YXBfcmVsb2NfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jX2luKSAoYWJmZCwgKGJmZF9ieXRlICopIGVyZWwsIGlyZWwpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgaXJlbCk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOyArK2kpCi0JICAgIHsKLQkgICAgICBpcmVsYVtpXS5yX29mZnNldCA9IGlyZWxbaV0ucl9vZmZzZXQ7Ci0JICAgICAgaXJlbGFbaV0ucl9pbmZvID0gaXJlbFtpXS5yX2luZm87Ci0JICAgICAgaXJlbGFbaV0ucl9hZGRlbmQgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYWVuZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxhZW5kID0gZXJlbGEgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhICs9IGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwpCi0JewotCSAgaWYgKGJlZC0+cy0+c3dhcF9yZWxvY2FfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jYV9pbikgKGFiZmQsIChiZmRfYnl0ZSAqKSBlcmVsYSwgaXJlbGEpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCBpcmVsYSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gTy4gIFRoZXkgbWF5IGhhdmUgYmVlbgotICAgY2FjaGVkLiAgSWYgdGhlIEVYVEVSTkFMX1JFTE9DUyBhbmQgSU5URVJOQUxfUkVMT0NTIGFyZ3VtZW50cyBhcmUKLSAgIG5vdCBOVUxMLCB0aGV5IGFyZSB1c2VkIGFzIGJ1ZmZlcnMgdG8gcmVhZCBpbnRvLiAgVGhleSBhcmUga25vd24gdG8KLSAgIGJlIGxhcmdlIGVub3VnaC4gIElmIHRoZSBJTlRFUk5BTF9SRUxPQ1MgcmVsb2NzIGFyZ3VtZW50IGlzIE5VTEwsCi0gICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgbWFsbG9jIG9yIGJmZF9hbGxvYywKLSAgIGFjY29yZGluZyB0byB0aGUgS0VFUF9NRU1PUlkgYXJndW1lbnQuICBJZiBPIGhhcyB0d28gcmVsb2NhdGlvbgotICAgc2VjdGlvbnMgKGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zKSwgdGhlbiB0aGUgUkVMX0hEUgotICAgcmVsb2NhdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QgaW4gSU5URVJOQUxfUkVMT0NTLCBmb2xsb3dlZCBieSB0aGUKLSAgIFJFTF9IRFIyIHJlbG9jYXRpb25zLiAgKi8KLQotRWxmX0ludGVybmFsX1JlbGEgKgotTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSAoYWJmZCwgbywgZXh0ZXJuYWxfcmVsb2NzLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGtlZXBfbWVtb3J5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIGtlZXBfbWVtb3J5OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgUFRSIGFsbG9jMSA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICphbGxvYzIgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgcmV0dXJuIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3M7Ci0KLSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IHNpemU7Ci0KLSAgICAgIHNpemUgPSAoby0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsIAotCSAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpOwotICAgICAgaWYgKGtlZXBfbWVtb3J5KQotCWludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgZWxzZQotCWludGVybmFsX3JlbG9jcyA9IGFsbG9jMiA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZTsKLQotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMikKLQlzaXplICs9IChzaXplX3QpIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMi0+c2hfc2l6ZTsKLSAgICAgIGFsbG9jMSA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGFsbG9jMSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gYWxsb2MxOwotICAgIH0KLQotICBpZiAoIWVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAoYWJmZCwgcmVsX2hkciwKLQkJCQkJICBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgaW50ZXJuYWxfcmVsb2NzKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCFlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gICAgICAoYWJmZCwgCi0gICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotICAgICAgICgoYmZkX2J5dGUgKikgZXh0ZXJuYWxfcmVsb2NzKSArIHJlbF9oZHItPnNoX3NpemUsCi0gICAgICAgaW50ZXJuYWxfcmVsb2NzICsgKHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplCi0JCQkgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUsIGlmIHdlIGNhbi4gICovCi0gIGlmIChrZWVwX21lbW9yeSkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotCi0gIC8qIERvbid0IGZyZWUgYWxsb2MyLCBzaW5jZSBpZiBpdCB3YXMgYWxsb2NhdGVkIHdlIGFyZSBwYXNzaW5nIGl0Ci0gICAgIGJhY2sgKHVuZGVyIHRoZSBuYW1lIG9mIGludGVybmFsX3JlbG9jcykuICAqLwotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotICBpZiAoYWxsb2MyICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MyKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIG1hZGUgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIHByb3ZpZGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBwcm92aWRlOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyCi0gICAgIG9iamVjdCwgdGhlbiBtYXJrIGl0IGFzIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciB3aWxsCi0gICAgIGZvcmNlIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KLSAgaWYgKHByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyIG9iamVjdCwKLSAgICAgdGhlbiBjbGVhciBvdXQgYW55IHZlcnNpb24gaW5mb3JtYXRpb24gYmVjYXVzZSB0aGUgc3ltYm9sIHdpbGwgbm90IGJlCi0gICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyBvYmplY3QgYW55IG1vcmUuICAqLwotICBpZiAoIXByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLQotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0KLSAgLyogV2hlbiBwb3NzaWJsZSwga2VlcCB0aGUgb3JpZ2luYWwgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0gIGlmIChoLT50eXBlID09IFNUVF9OT1RZUEUpCi0gICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwCi0gICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgICAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwgYW5kIHdlIGtub3cgYSBjb3JyZXNwb25kaW5nCi0JIHJlYWwgc3ltYm9sIGZyb20gdGhlIHNhbWUgZHluYW1pYyBvYmplY3QsIG1ha2Ugc3VyZSB0aGUgcmVhbAotCSBzeW1ib2wgaXMgYWxzbyBtYWRlIGludG8gYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoLT53ZWFrZGVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbi4gICovCi0KLXN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8KLXsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFZlcnNpb24gdHJlZS4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyZGVmczsKLSAgLyogV2hldGhlciB3ZSBhcmUgZXhwb3J0aW5nIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgdmVyczsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhc2ggdGFibGUgYnVja2V0cyB0byB1c2UKLSAgIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0aGVyZSBhcmUuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgMyBzeW1ib2xzIHdlIHVzZSAxIGJ1Y2tldCwgZmV3ZXIgdGhhbiAxNyBzeW1ib2xzIHdlIHVzZSAzIGJ1Y2tldHMsCi0gICBmZXdlciB0aGFuIDM3IHdlIHVzZSAxNyBidWNrZXRzLCBhbmQgc28gZm9ydGguICBXZSBuZXZlciB1c2UgbW9yZQotICAgdGhhbiAzMjc3MSBidWNrZXRzLiAgKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBlbGZfYnVja2V0c1tdID0KLXsKLSAgMSwgMywgMTcsIDM3LCA2NywgOTcsIDEzMSwgMTk3LCAyNjMsIDUyMSwgMTAzMSwgMjA1MywgNDA5OSwgODIwOSwKLSAgMTY0MTEsIDMyNzcxLCAwCi19OwotCi0vKiBDb21wdXRlIGJ1Y2tldCBjb3VudCBmb3IgaGFzaGluZyB0YWJsZS4gIFdlIGRvIG5vdCB1c2UgYSBzdGF0aWMgc2V0Ci0gICBvZiBwb3NzaWJsZSB0YWJsZXMgc2l6ZXMgYW55bW9yZS4gIEluc3RlYWQgd2UgZGV0ZXJtaW5lIGZvciBhbGwKLSAgIHBvc3NpYmxlIHJlYXNvbmFibGUgc2l6ZXMgb2YgdGhlIHRhYmxlIHRoZSBvdXRjb21lIChpLmUuLCB0aGUKLSAgIG51bWJlciBvZiBjb2xsaXNpb25zIGV0YykgYW5kIGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4gIFRoZQotICAgd2VpZ2h0aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHRvbyBzaW1wbGUgdG8gYWxsb3cgdGhlIHRhYmxlIHRvIGdyb3cKLSAgIHdpdGhvdXQgYm91bmRzLiAgSW5zdGVhZCBvbmUgb2YgdGhlIHdlaWdodGluZyBmYWN0b3JzIGlzIHRoZSBzaXplLgotICAgVGhlcmVmb3JlIHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZ29vZCBwYXlvZmYgYmV0d2VlbiBmZXcgY29sbGlzaW9ucwotICAgKD0gc2hvcnQgY2hhaW4gbGVuZ3RocykgYW5kIHRhYmxlIHNpemUuICAqLwotc3RhdGljIHNpemVfdAotY29tcHV0ZV9idWNrZXRfY291bnQgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzaXplX3QgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBzaXplX3QgYmVzdF9zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2RlczsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2Rlc3A7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCBleHBvcnRlZCBzeW1ib2xzLiAgQXQgdGhlIHNhbWUKLSAgICAgdGltZSBzdG9yZSB0aGUgdmFsdWVzIGluIGFuIGFycmF5IHNvIHRoYXQgd2UgY291bGQgdXNlIHRoZW0gZm9yCi0gICAgIG9wdGltaXphdGlvbnMuICAqLwotICBoYXNoY29kZXMgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgYmZkX21hbGxvYyAoZHluc3ltY291bnQKLQkJCQkJCSogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotICBpZiAoaGFzaGNvZGVzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2hjb2Rlc3AgPSBoYXNoY29kZXM7Ci0KLSAgLyogUHV0IGFsbCBoYXNoIHZhbHVlcyBpbiBIQVNIQ09ERVMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMsICZoYXNoY29kZXNwKTsKLQotLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0byBvcHRpbWl6ZSB0aGUgdGFibGUKLSAgIHNpemUgcmVxdWlyZXMgYW4gaW50ZWdlciB0eXBlIHdpdGggbW9yZSB0aGUgMzIgYml0cy4gIElmCi0gICBCRkRfSE9TVF9VXzY0X0JJVCBpcyBzZXQgd2Uga25vdyBhYm91dCBzdWNoIGEgdHlwZS4gICovCi0jaWZkZWYgQkZEX0hPU1RfVV82NF9CSVQKLSAgaWYgKGluZm8tPm9wdGltaXplID09IHRydWUpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbnN5bXMgPSBoYXNoY29kZXNwIC0gaGFzaGNvZGVzOwotICAgICAgc2l6ZV90IG1pbnNpemU7Ci0gICAgICBzaXplX3QgbWF4c2l6ZTsKLSAgICAgIEJGRF9IT1NUX1VfNjRfQklUIGJlc3RfY2hsZW4gPSB+KChCRkRfSE9TVF9VXzY0X0JJVCkgMCk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCAqY291bnRzIDsKLQotICAgICAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uIHBhcmFtZXRlcnM6IGlmIHdlIGhhdmUgTlNZTVMgc3ltYm9scyB3ZSBzYXkKLQkgdGhhdCB0aGUgaGFzaGluZyB0YWJsZSBtdXN0IGF0IGxlYXN0IGhhdmUgTlNZTVMvNCBhbmQgYXQgbW9zdAotCSAyKk5TWU1TIGJ1Y2tldHMuICAqLwotICAgICAgbWluc2l6ZSA9IG5zeW1zIC8gNDsKLSAgICAgIGlmIChtaW5zaXplID09IDApCi0JbWluc2l6ZSA9IDE7Ci0gICAgICBiZXN0X3NpemUgPSBtYXhzaXplID0gbnN5bXMgKiAyOwotCi0gICAgICAvKiBDcmVhdGUgYXJyYXkgd2hlcmUgd2UgY291bnQgdGhlIGNvbGxpc2lvbnMgaW4uICBXZSBtdXN0IHVzZSBiZmRfbWFsbG9jCi0JIHNpbmNlIHRoZSBzaXplIGNvdWxkIGJlIGxhcmdlLiAgKi8KLSAgICAgIGNvdW50cyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChtYXhzaXplCi0JCQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gICAgICBpZiAoY291bnRzID09IE5VTEwpCi0JewotCSAgZnJlZSAoaGFzaGNvZGVzKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ29tcHV0ZSB0aGUgIm9wdGltYWwiIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGNyaXRlcmlhIGlzIGEKLQkgbWluaW1hbCBjaGFpbiBsZW5ndGguICBUaGUgbWlub3IgY3JpdGVyaWEgaXMgKG9mIGNvdXJzZSkgdGhlIHNpemUKLQkgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IG1pbnNpemU7IGkgPCBtYXhzaXplOyArK2kpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIHRoZSBhcnJheSBvZiBoYXNoY29kZXMgYW5kIGNvdW50IHRoZSBjb2xsaXNpb25zLiAgKi8KLQkgIEJGRF9IT1NUX1VfNjRfQklUIG1heDsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGo7Ci0JICB1bnNpZ25lZCBsb25nIGludCBmYWN0OwotCi0JICBtZW1zZXQgKGNvdW50cywgJ1wwJywgaSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLQotCSAgLyogRGV0ZXJtaW5lIGhvdyBvZnRlbiBlYWNoIGhhc2ggYnVja2V0IGlzIHVzZWQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyArK2opCi0JICAgICsrY291bnRzW2hhc2hjb2Rlc1tqXSAlIGldOwotCi0JICAvKiBGb3IgdGhlIHdlaWdodCBmdW5jdGlvbiB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgICBwYWdlc2l6ZSBvbiB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBpbmZvcm1hdGlvbiBuZWVkIG5vdCBiZSAxMDAlCi0JICAgICBhY2N1cmF0ZS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAoc28gZmFyKSB3ZQotCSAgICAgZGVmaW5lIGl0IGhlcmUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBpcyBjcnVjaWFsCi0JICAgICB0byBoYXZlIGEgYmV0dGVyIHZhbHVlIHNvbWUgZGF5IHNpbXBseSBkZWZpbmUgdGhpcyB2YWx1ZS4gICovCi0jIGlmbmRlZiBCRkRfVEFSR0VUX1BBR0VTSVpFCi0jICBkZWZpbmUgQkZEX1RBUkdFVF9QQUdFU0laRQkoNDA5NikKLSMgZW5kaWYKLQotCSAgLyogV2UgaW4gYW55IGNhc2UgbmVlZCAyICsgTlNZTVMgZW50cmllcyBmb3IgdGhlIHNpemUgdmFsdWVzIGFuZAotCSAgICAgdGhlIGNoYWlucy4gICovCi0JICBtYXggPSAoMiArIG5zeW1zKSAqIChBUkNIX1NJWkUgLyA4KTsKLQotIyBpZiAxCi0JICAvKiBWYXJpYW50IDE6IG9wdGltaXplIGZvciBzaG9ydCBjaGFpbnMuICBXZSBhZGQgdGhlIHNxdWFyZXMKLQkgICAgIG9mIGFsbCB0aGUgY2hhaW4gbGVuZ3RocyAod2hpY2ggZmF2b3VzIG1hbnkgc21hbGwgY2hhaW4KLQkgICAgIG92ZXIgYSBmZXcgbG9uZyBjaGFpbnMpLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JICAgIG1heCArPSBjb3VudHNbal0gKiBjb3VudHNbal07Ci0KLQkgIC8qIFRoaXMgYWRkcyBwZW5hbHRpZXMgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHRhYmxlLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0ICogZmFjdDsKLSMgZWxzZQotCSAgLyogVmFyaWFudCAyOiBPcHRpbWl6ZSBhIGxvdCBtb3JlIGZvciBzbWFsbCB0YWJsZS4gIEhlcmUgd2UKLQkgICAgIGFsc28gYWRkIHNxdWFyZXMgb2YgdGhlIHNpemUgYnV0IHdlIGFsc28gYWRkIHBlbmFsdGllcyBmb3IKLQkgICAgIGVtcHR5IHNsb3RzICh0aGUgKzEgdGVybSkuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9ICgxICsgY291bnRzW2pdKSAqICgxICsgY291bnRzW2pdKTsKLQotCSAgLyogVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCwgYnV0IG5vdCBhcwotCSAgICAgc3Ryb25nIGFzIGluIHZhcmlhbnQgMSwgd2hlcmUgaXQgaXMgc3F1YXJlZC4gICovCi0JICBmYWN0ID0gaSAvIChCRkRfVEFSR0VUX1BBR0VTSVpFIC8gKEFSQ0hfU0laRSAvIDgpKSArIDE7Ci0JICBtYXggKj0gZmFjdDsKLSMgZW5kaWYKLQotCSAgLyogQ29tcGFyZSB3aXRoIGN1cnJlbnQgYmVzdCByZXN1bHRzLiAgKi8KLQkgIGlmIChtYXggPCBiZXN0X2NobGVuKQotCSAgICB7Ci0JICAgICAgYmVzdF9jaGxlbiA9IG1heDsKLQkgICAgICBiZXN0X3NpemUgPSBpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9IT1NUX1VfNjRfQklUKSAqLwotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNvbHV0aW9uIGlmIG5vIDY0Yml0IHR5cGUgaXMgYXZhaWxhYmxlIG9yIGlmIHdlCi0JIGFyZSBub3Qgc3VwcG9zZWQgdG8gc3BlbmQgbXVjaCB0aW1lIG9uIG9wdGltaXphdGlvbnMuICBXZSBzZWxlY3QgdGhlCi0JIGJ1Y2tldCBjb3VudCB1c2luZyBhIGZpeGVkIHNldCBvZiBudW1iZXJzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGVsZl9idWNrZXRzW2ldICE9IDA7IGkrKykKLQl7Ci0JICBiZXN0X3NpemUgPSBlbGZfYnVja2V0c1tpXTsKLQkgIGlmIChkeW5zeW1jb3VudCA8IGVsZl9idWNrZXRzW2kgKyAxXSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSBhcnJheXMgd2UgbmVlZGVkLiAgKi8KLSAgZnJlZSAoaGFzaGNvZGVzKTsKLQotICByZXR1cm4gYmVzdF9zaXplOwotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgRUxGIGR5bmFtaWMgc2VjdGlvbnMuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZQotICAgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZSBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIHNvbmFtZSwgcnBhdGgsCi0JCQkJICAgICBleHBvcnRfZHluYW1pYywgZmlsdGVyX3NobGliLAotCQkJCSAgICAgYXV4aWxpYXJ5X2ZpbHRlcnMsIGluZm8sIHNpbnRlcnBwdHIsCi0JCQkJICAgICB2ZXJkZWZzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcnBhdGg7Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9zaGxpYjsKLSAgICAgY29uc3QgY2hhciAqIGNvbnN0ICphdXhpbGlhcnlfZmlsdGVyczsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2ludGVycHB0cjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotewotICBiZmRfc2l6ZV90eXBlIHNvbmFtZV9pbmR4OwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyBhc3ZpbmZvOwotCi0gICpzaW50ZXJwcHRyID0gTlVMTDsKLQotICBzb25hbWVfaW5keCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBiYWNrZW5kIG1heSBoYXZlIHRvIGNyZWF0ZSBzb21lIHNlY3Rpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICB3ZSdyZSBkeW5hbWljIG9yIG5vdC4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgIGRvIGhlcmUuICAqLwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cnNpemU7Ci0KLSAgICAgICpzaW50ZXJwcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLSAgICAgIEJGRF9BU1NFUlQgKCpzaW50ZXJwcHRyICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKTsKLQotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMKQotCXsKLQkgIHNvbmFtZV9pbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIHNvbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoc29uYW1lX2luZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NPTkFNRSwgc29uYW1lX2luZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+c3ltYm9saWMpCi0JewotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1CT0xJQywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChycGF0aCAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIHJwYXRoLAotCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUlBBVEgsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoZmlsdGVyX3NobGliICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkgICAgIGZpbHRlcl9zaGxpYiwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklMVEVSLCBpbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGF1eGlsaWFyeV9maWx0ZXJzICE9IE5VTEwpCi0JewotCSAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwotCi0JICBmb3IgKHAgPSBhdXhpbGlhcnlfZmlsdGVyczsgKnAgIT0gTlVMTDsgcCsrKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAqcCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0FVWElMSUFSWSwgaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIGV4cG9ydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgICAgICAgdGFibGUgKHRoaXMgaXMgbm90IHRoZSBub3JtYWwgY2FzZSksIHRoZW4gZG8gc28uICAqLwotICAgICAgaWYgKGV4cG9ydF9keW5hbWljKQotCXsKLQkgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotCi0JICBlaWYuZmFpbGVkID0gZmFsc2U7Ci0JICBlaWYuaW5mbyA9IGluZm87Ci0JICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9leHBvcnRfc3ltYm9sLAotCQkJICAgICAgICAgIChQVFIpICZlaWYpOwotCSAgaWYgKGVpZi5mYWlsZWQpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEF0dGFjaCBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlaXIgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBhc3ZpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOwotICAgICAgYXN2aW5mby5pbmZvID0gaW5mbzsKLSAgICAgIGFzdmluZm8udmVyZGVmcyA9IHZlcmRlZnM7Ci0gICAgICBhc3ZpbmZvLmV4cG9ydF9keW5hbWljID0gZXhwb3J0X2R5bmFtaWM7Ci0gICAgICBhc3ZpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24sCi0JCQkgICAgICAoUFRSKSAmYXN2aW5mbyk7Ci0gICAgICBpZiAoYXN2aW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFuZCBtYWtlCi0JIHRoZSBiYWNrZW5kIHBpY2sgYSByZWFzb25hYmxlIHZhbHVlIGZvciB0aGVtLiAgKi8KLSAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVpZi5pbmZvID0gaW5mbzsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JCQkgICAgICAoUFRSKSAmZWlmKTsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gc29tZSBvZiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfYmZkX2ZpbmFsX2xpbmssIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcwotCSBub3cgc28gdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogSWYgdGhlcmUgYXJlIGluaXRpYWxpemF0aW9uIGFuZC9vciBmaW5hbGl6YXRpb24gZnVuY3Rpb25zIHRvCi0JIGNhbGwgdGhlbiBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgRFRfSU5JVC9EVF9GSU5JIGVudHJpZXMuICAqLwotICAgICAgaCA9IChpbmZvLT5pbml0X2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5pbml0X2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0lOSVQsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaCA9IChpbmZvLT5maW5pX2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5maW5pX2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTkksIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdHJzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IQVNILCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1UQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSU1osIHN0cnNpemUpCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNRU5ULAotCQkJCSAgICAgIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGJhY2tlbmQgbXVzdCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvdGhlciBkeW5hbWljCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50ID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHNpemVfdCBoYXNoX2VudHJ5X3NpemU7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fZCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBhZGRpdGlvbmFsIHZlcnNpb24gZGVmaW5pdGlvbnMgaWYgd2UgYXJlCi0gICAgICAgICBqdXN0IGxpbmtpbmcgYSByZWd1bGFyIGFwcGxpY2F0aW9uLiAgKi8KLSAgICAgIHZlcmRlZnMgPSBhc3ZpbmZvLnZlcmRlZnM7Ci0KLSAgICAgIGlmICh2ZXJkZWZzID09IE5VTEwpCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY2RlZnM7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0JICBiZmRfYnl0ZSAqcDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgZGVmOwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggZGVmYXV4OwotCi0JICBjZGVmcyA9IDA7Ci0JICBzaXplID0gMDsKLQotCSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGJhc2UgdmVyc2lvbi4gICovCi0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgKytjZGVmczsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQotCSAgICAgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgICsrY2RlZnM7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICB9Ci0KLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBGaWxsIGluIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0KLQkgIHAgPSBzLT5jb250ZW50czsKLQotCSAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICBkZWYudmRfZmxhZ3MgPSBWRVJfRkxHX0JBU0U7Ci0JICBkZWYudmRfbmR4ID0gMTsKLQkgIGRlZi52ZF9jbnQgPSAxOwotCSAgZGVmLnZkX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KSk7Ci0KLQkgIGlmIChzb25hbWVfaW5keCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIHsKLQkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoc29uYW1lKTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBzb25hbWVfaW5keDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gb3V0cHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKG5hbWUpOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IGluZHg7Ci0JICAgIH0KLQkgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkgICAgKEVsZl9FeHRlcm5hbF9WZXJkZWYgKilwKTsKLQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJICAgICAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCi0JICBmb3IgKHQgPSB2ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGNkZXBzOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGNkZXBzID0gMDsKLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQkrK2NkZXBzOwotCi0JICAgICAgLyogQWRkIGEgc3ltYm9sIHJlcHJlc2VudGluZyB0aGlzIHZlcnNpb24uICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBkeW5vYmosIHQtPm5hbWUsIEJTRl9HTE9CQUwsIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0JCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPmNvbGxlY3QsCi0JCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfiBFTEZfTElOS19OT05fRUxGOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCi0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBkZWYudmRfdmVyc2lvbiA9IFZFUl9ERUZfQ1VSUkVOVDsKLQkgICAgICBkZWYudmRfZmxhZ3MgPSAwOwotCSAgICAgIGlmICh0LT5nbG9iYWxzID09IE5VTEwgJiYgdC0+bG9jYWxzID09IE5VTEwgJiYgISB0LT51c2VkKQotCQlkZWYudmRfZmxhZ3MgfD0gVkVSX0ZMR19XRUFLOwotCSAgICAgIGRlZi52ZF9uZHggPSB0LT52ZXJudW0gKyAxOwotCSAgICAgIGRlZi52ZF9jbnQgPSBjZGVwcyArIDE7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKHQtPm5hbWUpOwotCSAgICAgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgICAgIGlmICh0LT5uZXh0ICE9IE5VTEwpCi0JCWRlZi52ZF9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZikKLQkJCSAgICAgICArIChjZGVwcyArIDEpICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCSAgICAgIGVsc2UKLQkJZGVmLnZkX25leHQgPSAwOwotCi0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChvdXRwdXRfYmZkLCAmZGVmLAotCQkJCQkoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBwKTsKLQkgICAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0KLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0JICAgICAgaWYgKHQtPmRlcHMgPT0gTlVMTCkKLQkJZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkgICAgICBlbHNlCi0JCWRlZmF1eC52ZGFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgIHQtPm5hbWVfaW5keCA9IGRlZmF1eC52ZGFfbmFtZTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAobi0+dmVyc2lvbl9uZWVkZWQgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUKLQkJCSB2ZXJzaW9uIHNjcmlwdC4gICovCi0JCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uYW1lID0gbi0+dmVyc2lvbl9uZWVkZWQtPm5hbWVfaW5keDsKLQkJICBpZiAobi0+bmV4dCA9PSBOVUxMKQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkJICBlbHNlCi0JCSAgICBkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRiwgMCkKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSREVGTlVNLCBjZGVmcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnMgPSBjZGVmczsKLQl9Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHsKLQlzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gc2luZm87Ci0KLQlzaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLQlzaW5mby5pbmZvID0gaW5mbzsKLQlzaW5mby52ZXJzID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnM7Ci0JaWYgKHNpbmZvLnZlcnMgPT0gMCkKLQkgIHNpbmZvLnZlcnMgPSAxOwotCXNpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0JZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMsCi0JCQkJKFBUUikgJnNpbmZvKTsKLQotCWlmIChlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAoaW5mbywgcyk7Ci0JZWxzZQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQkgICAgdW5zaWduZWQgaW50IHNpemU7Ci0JICAgIHVuc2lnbmVkIGludCBjcmVmczsKLQkgICAgYmZkX2J5dGUgKnA7Ci0KLQkgICAgLyogQnVpbGQgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLQkgICAgc2l6ZSA9IDA7Ci0JICAgIGNyZWZzID0gMDsKLQkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOwotCQkgdCAhPSBOVUxMOwotCQkgdCA9IHQtPnZuX25leHRyZWYpCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCQkrK2NyZWZzOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZSk7Ci0JICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBwID0gcy0+Y29udGVudHM7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGNhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCQliZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJY2F1eCA9IDA7Ci0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgKytjYXV4OwotCi0JCXQtPnZuX3ZlcnNpb24gPSBWRVJfTkVFRF9DVVJSRU5UOwotCQl0LT52bl9jbnQgPSBjYXV4OwotCQlpZiAoZWxmX2R0X25hbWUgKHQtPnZuX2JmZCkgIT0gTlVMTCkKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICBlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSwKLQkJCQkJICAgICB0cnVlLCBmYWxzZSk7Ci0JCWVsc2UKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICB0LT52bl9iZmQtPmZpbGVuYW1lLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQtPnZuX2ZpbGUgPSBpbmR4OwotCQl0LT52bl9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJaWYgKHQtPnZuX25leHRyZWYgPT0gTlVMTCkKLQkJICB0LT52bl9uZXh0ID0gMDsKLQkJZWxzZQotCQkgIHQtPnZuX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCkKLQkJCQkrIGNhdXggKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KSk7Ci0KLQkJX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAob3V0cHV0X2JmZCwgdCwKLQkJCQkJICAgKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHApOwotCQlwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCi0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgewotCQkgICAgYS0+dm5hX2hhc2ggPSBiZmRfZWxmX2hhc2ggKGEtPnZuYV9ub2RlbmFtZSk7Ci0JCSAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICAgIGEtPnZuYV9ub2RlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQkgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBhLT52bmFfbmFtZSA9IGluZHg7Ci0JCSAgICBpZiAoYS0+dm5hX25leHRwdHIgPT0gTlVMTCkKLQkJICAgICAgYS0+dm5hX25leHQgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICBhLT52bmFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCi0JCSAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0IChvdXRwdXRfYmZkLCBhLAotCQkJCQkgICAgICAgKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHApOwotCQkgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSTkVFRCwgMCkKLQkJfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUROVU0sIGNyZWZzKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcnJlZnMgPSBjcmVmczsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSAKLQkgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuCi0JIE5leHQgY29tZSBhbGwgb2YgdGhlIGJhY2stZW5kIGFsbG9jYXRlZCBsb2NhbCBkeW5hbWljIHN5bXMsCi0JIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLSAgICAgIGR5bnN5bWNvdW50ID0gX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChvdXRwdXRfYmZkLCBpbmZvKTsKLQotICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoZHluc3ltY291bnQgPT0gMAotCSAgfHwgKHZlcmRlZnMgPT0gTlVMTCAmJiBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLQkgIC8qIFRoZSBEWU5TWU1DT1VOVCBtaWdodCBoYXZlIGNoYW5nZWQgaWYgd2Ugd2VyZSBnb2luZyB0bwotCSAgICAgb3V0cHV0IGEgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cnkgZm9yIFMuICAqLwotCSAgZHluc3ltY291bnQgPSBfYmZkX2VsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMgKG91dHB1dF9iZmQsIGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJTWU0sIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBpbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JIFdlIHdpbGwgYnVpbGQgdGhlIGNvbnRlbnRzIG9mIC5keW5zeW0gYW5kIC5oYXNoIHdoZW4gd2UgYnVpbGQKLQkgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZQotCSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlIHN5bWJvbHMuICBXZSBidWlsdCB0aGUgLmR5bnN0cgotCSBzZWN0aW9uIGFzIHdlIHdlbnQgYWxvbmcgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIC5keW5zeW0gaXMgYSBkdW1teSBzeW1ib2wuICAqLwotICAgICAgaXN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLnN0X3NpemUgPSAwOwotICAgICAgaXN5bS5zdF9uYW1lID0gMDsKLSAgICAgIGlzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBpc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGlzeW0uc3Rfc2huZHggPSAwOwotICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJmlzeW0sCi0JCQkgICAoUFRSKSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzLT5jb250ZW50cyk7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGhhc2hpbmcgdGFibGUuICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMKLQkgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIG5hbWVzIHdlIGV4cG9ydC4gICovCi0gICAgICBidWNrZXRjb3VudCA9IGNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGhhc2hfZW50cnlfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotICAgICAgcy0+X3Jhd19zaXplID0gKCgyICsgYnVja2V0Y291bnQgKyBkeW5zeW1jb3VudCkgKiBoYXNoX2VudHJ5X3NpemUpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQotICAgICAgYmZkX3B1dCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgb3V0cHV0X2JmZCwgYnVja2V0Y291bnQsIHMtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIG91dHB1dF9iZmQsIGR5bnN5bWNvdW50LCAKLQkgICAgICAgcy0+Y29udGVudHMgKyBoYXNoX2VudHJ5X3NpemUpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9OVUxMLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRml4IHVwIHRoZSBmbGFncyBmb3IgYSBzeW1ib2wuICBUaGlzIGhhbmRsZXMgdmFyaW91cyBjYXNlcyB3aGljaAotICAgY2FuIG9ubHkgYmUgZml4ZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBhcmUgc2Vlbi4gIFRoaXMgaXMKLSAgIGN1cnJlbnRseSBjYWxsZWQgYnkgYm90aCBhZGp1c3RfZHluYW1pY19zeW1ib2wgYW5kCi0gICBhc3NpZ25fc3ltX3ZlcnNpb24sIHdoaWNoIGlzIHVubmVjZXNzYXJ5IGJ1dCBwZXJoYXBzIG1vcmUgcm9idXN0IGluCi0gICB0aGUgZmFjZSBvZiBmdXR1cmUgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmOwotewotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgbWVudGlvbmVkIGluIGEgbm9uLUVMRiBmaWxlLCB0cnkgdG8gc2V0Ci0gICAgIERFRl9SRUdVTEFSIGFuZCBSRUZfUkVHVUxBUiBjb3JyZWN0bHkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgICBwZXJtaXQgYSBub24tRUxGIGZpbGUgdG8gY29ycmVjdGx5IHJlZmVyIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYW4gRUxGIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgIT0gMCkKLSAgICB7Ci0gICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLQkgIGVsc2UKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCX0KLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCSAgICB7Ci0JICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCBFTEZfTElOS19OT05fRUxGIGlzIG9ubHkgY29ycmVjdCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhIG5vbi1FTEYgZmlsZS4gIEZvcnR1bmF0ZWx5LCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhbiBFTEYgZmlsZSwgd2UncmUgcHJvYmFibHkgT0sgdW5sZXNzIHRoZQotICAgICAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgbm9uLUVMRiBmaWxlLiAgQ2F0Y2ggdGhhdCBjYXNlIGhlcmUuCi0gICAgICAgICBGSVhNRTogV2UncmUgc3RpbGwgaW4gdHJvdWJsZSBpZiB0aGUgc3ltYm9sIHdhcyBmaXJzdCBzZWVuIGluCi0gICAgICAgICBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlbiBsYXRlciBpbiBhIG5vbi1FTEYgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgID8gKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgICAgOiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JCSAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMCkpKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0gICAgIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiAtQnN5bWJvbGljIHdhcyB1c2VkICh3aGljaCBtZWFucyB0byBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsCi0gICAgIHN5bWJvbHMgdG8gdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgb2JqZWN0KSwgYW5kIHRoaXMKLSAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QsIHRoZW4gaXQgYWN0dWFsbHkgZG9lc24ndAotICAgICBuZWVkIGEgUExUIGVudHJ5LiAgTGlrZXdpc2UsIGlmIHRoZSBzeW1ib2wgaGFzIGFueSBraW5kIG9mCi0gICAgIHZpc2liaWxpdHkgKGludGVybmFsLCBoaWRkZW4sIG9yIHByb3RlY3RlZCksIGl0IGRvZXNuJ3QgbmVlZCBhCi0gICAgIFBMVC4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICAmJiBlaWYtPmluZm8tPnNoYXJlZAotICAgICAgJiYgKGVpZi0+aW5mby0+c3ltYm9saWMgfHwgRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBrbm93Ci0gICAgIHRoZSByZWFsIGRlZmluaXRpb24gaW4gdGhlIGR5bmFtaWMgb2JqZWN0LCBjb3B5IGludGVyZXN0aW5nIGZsYWdzCi0gICAgIG92ZXIgdG8gdGhlIHJlYWwgZGVmaW5pdGlvbi4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIHdlYWtkZWYgPSBoLT53ZWFrZGVmOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpOwotCi0gICAgICAvKiBJZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLAotCSBkb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsLiAgU2VlIHRoZSBsb25nZXIgZGVzY3JpcHRpb24gaW4KLQkgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCwgYmVsb3cuICAqLwotICAgICAgaWYgKCh3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQloLT53ZWFrZGVmID0gTlVMTDsKLSAgICAgIGVsc2UKLQl3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0JICAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkgICAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSwotCSAgICAgIHwgRUxGX0xJTktfTk9OX0dPVF9SRUYpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgdGhlIGJhY2tlbmQgcGljayBhIGdvb2QgdmFsdWUgZm9yIGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UsIGFuZCBhbHNvIGNhbGxzIGl0c2VsZgotICAgcmVjdXJzaXZlbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICplaWYgPSAoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqKSBkYXRhOwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KLSAgaWYgKCEgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQgZW50cnksIGFuZCBpdCBpcyBub3QKLSAgICAgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBvciBpcyBub3QgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0LCBpZ25vcmUgaXQuICBXZSBkbyBoYXZlIHRvIGhhbmRsZSBhIHdlYWsgZGVmaW5lZCBzeW1ib2wsCi0gICAgIGV2ZW4gaWYgbm8gcmVndWxhciBvYmplY3QgcmVmZXJzIHRvIGl0LCBpZiB3ZSBkZWNpZGVkIHRvIGFkZCBpdAotICAgICB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBGSVhNRTogRG8gd2Ugbm9ybWFsbHkgbmVlZCB0byB3b3JyeQotICAgICBhYm91dCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IG9uZSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9uZT8gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwCi0gICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCi0JICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDAKLQkgICAgICAmJiAoaC0+d2Vha2RlZiA9PSBOVUxMIHx8IGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpKSkpCi0gICAgewotICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGFkanVzdGVkIHRoaXMgc3ltYm9sLCBkb24ndCBkbyBpdCBhZ2Fpbi4gIFRoaXMKLSAgICAgY2FuIGhhcHBlbiB2aWEgYSByZWN1cnNpdmUgY2FsbC4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBEb24ndCBsb29rIGF0IHRoaXMgc3ltYm9sIGFnYWluLiAgTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoaXMKLSAgICAgYWZ0ZXIgY2hlY2tpbmcgdGhlIGFib3ZlIGNvbmRpdGlvbnMsIGJlY2F1c2Ugd2UgbWF5IGxvb2sgYXQgYQotICAgICBzeW1ib2wgb25jZSwgZGVjaWRlIG5vdCB0byBkbyBhbnl0aGluZywgYW5kIHRoZW4gZ2V0IGNhbGxlZAotICAgICByZWN1cnNpdmVseSBsYXRlciBhZnRlciBSRUZfUkVHVUxBUiBpcyBzZXQgYmVsb3cuICAqLwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRDsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbml0aW9uLCBhbmQgd2Uga25vdyBhIHJlYWwgZGVmaW5pdGlvbiwgYW5kCi0gICAgIHRoZSByZWFsIHN5bWJvbCBpcyBub3QgaXRzZWxmIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLAotICAgICB0aGVuIGdldCBhIGdvb2QgdmFsdWUgZm9yIHRoZSByZWFsIGRlZmluaXRpb24uICBXZSBoYW5kbGUgdGhlCi0gICAgIHJlYWwgc3ltYm9sIGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBiYWNrZW5kIHJvdXRpbmUuCi0KLSAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uZnVzaW5nIGNhc2UgaGVyZS4gIElmIHRoZSByZWFsIGRlZmluaXRpb24KLSAgICAgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHdlIGRvbid0IGdldCB0aGUgcmVhbCBzeW1ib2wKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSBkbyBnZXQgdGhlIHdlYWsgc3ltYm9sLiAgSWYgdGhlCi0gICAgIHByb2Nlc3NvciBiYWNrZW5kIHVzZXMgYSBDT1BZIHJlbG9jLCB0aGVuIGlmIHNvbWUgcm91dGluZSBpbiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgY2hhbmdlcyB0aGUgcmVhbCBzeW1ib2wsIHdlIHdpbGwgbm90IHNlZSB0aGF0Ci0gICAgIGNoYW5nZSBpbiB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIHN5bWJvbC4gIFRoaXMgaXMgdGhlIHdheSBvdGhlcgotICAgICBFTEYgbGlua2VycyB3b3JrIGFzIHdlbGwsIGFuZCBzZWVtcyB0byBiZSBhIHJlc3VsdCBvZiB0aGUgc2hhcmVkCi0gICAgIGxpYnJhcnkgbW9kZWwuCi0KLSAgICAgSSB3aWxsIGNsYXJpZnkgdGhpcyBpc3N1ZS4gIE1vc3QgU1ZSNCBzaGFyZWQgbGlicmFyaWVzIGRlZmluZSB0aGUKLSAgICAgdmFyaWFibGUgX3RpbWV6b25lIGFuZCBkZWZpbmUgdGltZXpvbmUgYXMgYSB3ZWFrIHN5bm9ueW0uICBUaGUKLSAgICAgdHpzZXQgY2FsbCBjaGFuZ2VzIF90aW1lem9uZS4gIElmIHlvdSB3cml0ZQotICAgICAgIGV4dGVybiBpbnQgdGltZXpvbmU7Ci0gICAgICAgaW50IF90aW1lem9uZSA9IDU7Ci0gICAgICAgaW50IG1haW4gKCkgeyB0enNldCAoKTsgcHJpbnRmICgiJWQgJWRcbiIsIHRpbWV6b25lLCBfdGltZXpvbmUpOyB9Ci0gICAgIHlvdSBtaWdodCBleHBlY3QgdGhhdCwgc2luY2UgdGltZXpvbmUgaXMgYSBzeW5vbnltIGZvciBfdGltZXpvbmUsCi0gICAgIHRoZSBzYW1lIG51bWJlciB3aWxsIHByaW50IGJvdGggdGltZXMuICBIb3dldmVyLCBpZiB0aGUgcHJvY2Vzc29yCi0gICAgIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gYWN0dWFsbHkgdGltZXpvbmUgd2lsbCBiZSBjb3BpZWQKLSAgICAgaW50byB5b3VyIHByb2Nlc3MgaW1hZ2UsIGFuZCwgc2luY2UgeW91IGRlZmluZSBfdGltZXpvbmUKLSAgICAgeW91cnNlbGYsIF90aW1lem9uZSB3aWxsIG5vdC4gIFRodXMgdGltZXpvbmUgYW5kIF90aW1lem9uZSB3aWxsCi0gICAgIHdpbmQgdXAgYXQgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuICBUaGUgdHpzZXQgY2FsbCB3aWxsIHNldAotICAgICBfdGltZXpvbmUsIGxlYXZpbmcgdGltZXpvbmUgdW5jaGFuZ2VkLiAgKi8KLQotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBrbm93IHRoZXJlIGlzIGFuIGltcGxpY2l0Ci0JIHJlZmVyZW5jZSBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUgdmlhIHRoZSB3ZWFrIHN5bWJvbCBILgotCSBGSVhNRTogSXMgdGhpcyByZWFsbHkgdHJ1ZT8gIFdoYXQgaWYgdGhlIHRyYXZlcnNhbCBmaW5kcwotCSBILT5XRUFLREVGIGJlZm9yZSBpdCBmaW5kcyBIPyAgKi8KLSAgICAgIGgtPndlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQotICAgICAgaWYgKCEgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaC0+d2Vha2RlZiwgKFBUUikgZWlmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIGEgc3ltYm9sIGhhcyBubyB0eXBlIGFuZCBubyBzaXplIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgUExUCi0gICAgIGVudHJ5LCB0aGVuIHdlIGFyZSBwcm9iYWJseSBhYm91dCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaGVyZTogd2UKLSAgICAgYXJlIHByb2JhYmx5IGdvaW5nIHRvIGNyZWF0ZSBhIENPUFkgcmVsb2MgZm9yIGFuIGVtcHR5IG9iamVjdC4KLSAgICAgVGhpcyBjYXNlIGNhbiBhcmlzZSB3aGVuIGEgc2hhcmVkIG9iamVjdCBpcyBidWlsdCB3aXRoIGFzc2VtYmx5Ci0gICAgIGNvZGUsIGFuZCB0aGUgYXNzZW1ibHkgY29kZSBmYWlscyB0byBzZXQgdGhlIHN5bWJvbCB0eXBlLiAgKi8KLSAgaWYgKGgtPnNpemUgPT0gMAotICAgICAgJiYgaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIndhcm5pbmc6IHR5cGUgYW5kIHNpemUgb2YgZHluYW1pYyBzeW1ib2wgYCVzJyBhcmUgbm90IGRlZmluZWQiKSwKLQkgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGVpZi0+aW5mbyktPmR5bm9iajsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaik7Ci0gIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpIChlaWYtPmluZm8sIGgpKQotICAgIHsKLSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBleHBvcnQgYWxsIGRlZmluZWQgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUuICBJdCBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2V4cG9ydF9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmID0gKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikgZGF0YTsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5keW5pbmR4ID09IC0xCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCXsKLQkgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIG90aGVyIHNoYXJlZAotICAgbGlicmFyaWVzIGFuZCByZWZlcmVuY2VkIGhlcmUuICBVcGRhdGUgdGhlIGxpc3Qgb2YgdmVyc2lvbgotICAgZGVwZW5kZW5jaWVzLiAgVGhpcyB3aWxsIGJlIHB1dCBpbnRvIHRoZSAuZ251LnZlcnNpb25fciBzZWN0aW9uLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKnJpbmZvID0gKHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLSAgLyogV2Ugb25seSBjYXJlIGFib3V0IHN5bWJvbHMgZGVmaW5lZCBpbiBzaGFyZWQgb2JqZWN0cyB3aXRoIHZlcnNpb24KLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLSAgICAgIHx8IGgtPmR5bmluZHggPT0gLTEKLSAgICAgIHx8IGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHdlIGFscmVhZHkga25vdyBhYm91dCB0aGlzIHZlcnNpb24uICAqLwotICBmb3IgKHQgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOyB0ICE9IE5VTEw7IHQgPSB0LT52bl9uZXh0cmVmKQotICAgIHsKLSAgICAgIGlmICh0LT52bl9iZmQgIT0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZCkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQlpZiAoYS0+dm5hX25vZGVuYW1lID09IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZSkKLQkgIHJldHVybiB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIG5ldyB2ZXJzaW9uLiAgQWRkIGl0IHRvIHRyZWUgd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotICBpZiAodCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHQgPSAoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCk7Ci0gICAgICBpZiAodCA9PSBOVUxMKQotCXsKLQkgIHJpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdC0+dm5fYmZkID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZDsKLSAgICAgIHQtPnZuX25leHRyZWYgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOwotICAgICAgZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZiA9IHQ7Ci0gICAgfQotCi0gIGEgPSAoRWxmX0ludGVybmFsX1Zlcm5hdXggKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqYSk7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIGFyZSBjb3B5aW5nIGEgc3RyaW5nIHBvaW50ZXIgaGVyZSwgYW5kIHRlc3RpbmcgaXQKLSAgICAgYWJvdmUuICBJZiBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIGlzIGV2ZXIgY2hhbmdlZCB0bwotICAgICBkaXNjYXJkIHRoZSBzdHJpbmcgZGF0YSB3aGVuIGxvdyBpbiBtZW1vcnksIHRoaXMgd2lsbCBoYXZlIHRvIGJlCi0gICAgIGZpeGVkLiAgKi8KLSAgYS0+dm5hX25vZGVuYW1lID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX25vZGVuYW1lOwotCi0gIGEtPnZuYV9mbGFncyA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9mbGFnczsKLSAgYS0+dm5hX25leHRwdHIgPSB0LT52bl9hdXhwdHI7Ci0KLSAgaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyA9IHJpbmZvLT52ZXJzOwotICArK3JpbmZvLT52ZXJzOwotCi0gIGEtPnZuYV9vdGhlciA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gKyAxOwotCi0gIHQtPnZuX2F1eHB0ciA9IGE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpZ3VyZSBvdXQgYXBwcm9wcmlhdGUgdmVyc2lvbnMgZm9yIGFsbCB0aGUgc3ltYm9scy4gIFdlIG1heSBub3QKLSAgIGhhdmUgdGhlIHZlcnNpb24gbnVtYmVyIHNjcmlwdCB1bnRpbCB3ZSBoYXZlIHJlYWQgYWxsIG9mIHRoZSBpbnB1dAotICAgZmlsZXMsIHNvIHVudGlsIHRoYXQgcG9pbnQgd2UgZG9uJ3Qga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZCBiZQotICAgbG9jYWwuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqc2luZm8gPQotICAgIChzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gc2luZm8tPmluZm87Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICBjaGFyICpwOwotCi0gIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KLSAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICBlaWYuaW5mbyA9IGluZm87Ci0gIGlmICghIGVsZl9maXhfc3ltYm9sX2ZsYWdzIChoLCAmZWlmKSkKLSAgICB7Ci0gICAgICBpZiAoZWlmLmZhaWxlZCkKLQlzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Ugb25seSBuZWVkIHZlcnNpb24gbnVtYmVycyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIHJlZ3VsYXIKLSAgICAgb2JqZWN0cy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKHNpbmZvLT5vdXRwdXRfYmZkKTsKLSAgcCA9IHN0cmNociAoaC0+cm9vdC5yb290LnN0cmluZywgRUxGX1ZFUl9DSFIpOwotICBpZiAocCAhPSBOVUxMICYmIGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIGJvb2xlYW4gaGlkZGVuOwotCi0gICAgICBoaWRkZW4gPSB0cnVlOwotCi0gICAgICAvKiBUaGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlIEVMRl9WRVJfQ0hSIGNoYXJhY3RlcnMgaWYgdGhpcyBpcwotICAgICAgICAgbm90IGEgaGlkZGVuIHN5bWJvbC4gICovCi0gICAgICArK3A7Ci0gICAgICBpZiAoKnAgPT0gRUxGX1ZFUl9DSFIpCi0JewotCSAgaGlkZGVuID0gZmFsc2U7Ci0JICArK3A7Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBubyB2ZXJzaW9uIHN0cmluZywgd2UgY2FuIGp1c3QgcmV0dXJuIG91dC4gICovCi0gICAgICBpZiAoKnAgPT0gJ1wwJykKLQl7Ci0JICBpZiAoaGlkZGVuKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hJRERFTjsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlIHZlcnNpb24uICBJZiB3ZSBmaW5kIGl0LCBpdCBpcyBubyBsb25nZXIgd2Vhay4gICovCi0gICAgICBmb3IgKHQgPSBzaW5mby0+dmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBpZiAoc3RyY21wICh0LT5uYW1lLCBwKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IGxlbjsKLQkgICAgICBjaGFyICphbGM7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOwotCi0JICAgICAgbGVuID0gcCAtIGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgYWxjID0gYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgbGVuKTsKLQkgICAgICBpZiAoYWxjID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RybmNweSAoYWxjLCBoLT5yb290LnJvb3Quc3RyaW5nLCBsZW4gLSAxKTsKLQkgICAgICBhbGNbbGVuIC0gMV0gPSAnXDAnOwotCSAgICAgIGlmIChhbGNbbGVuIC0gMl0gPT0gRUxGX1ZFUl9DSFIpCi0JICAgICAgICBhbGNbbGVuIC0gMl0gPSAnXDAnOwotCi0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkgICAgICB0LT51c2VkID0gdHJ1ZTsKLQkgICAgICBkID0gTlVMTDsKLQotCSAgICAgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCi0JCXsKLQkJICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkgICAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvCi0gICAgICAgICAgICAgICAgIGxvY2FsIHNjb3BlLiAgKi8KLQkgICAgICBpZiAoZCA9PSBOVUxMICYmIHQtPmxvY2FscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoKCpkLT5tYXRjaCkgKGQsIGFsYykpCi0JCQl7Ci0JCQkgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICAgICAmJiBpbmZvLT5zaGFyZWQKLQkJCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkJICAgICAgKCpiZWQtPmVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sKSAoaCk7Ci0JCQkgICAgICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMKLQkJCQkgYWxyZWFkeSBiZWVuIHJlY29yZGVkIGluIHRoZSBkeW5hbWljCi0JCQkJIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KLQkJCSAgICB9Ci0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9yZWxlYXNlIChzaW5mby0+b3V0cHV0X2JmZCwgYWxjKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhCi0gICAgICAgICB2ZXJzaW9uIG5vZGUgZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gICAgICBpZiAodCA9PSBOVUxMICYmICEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKnBwOwotCSAgaW50IHZlcnNpb25faW5kZXg7Ci0KLQkgIC8qIElmIHdlIGFyZW4ndCBnb2luZyB0byBleHBvcnQgdGhpcyBzeW1ib2wsIHdlIGRvbid0IG5lZWQKLSAgICAgICAgICAgICB0byB3b3JyeSBhYm91dCBpdC4gKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCSAgdCA9ICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopCi0JICAgICAgIGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCkpOwotCSAgaWYgKHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICB0LT5uZXh0ID0gTlVMTDsKLQkgIHQtPm5hbWUgPSBwOwotCSAgdC0+Z2xvYmFscyA9IE5VTEw7Ci0JICB0LT5sb2NhbHMgPSBOVUxMOwotCSAgdC0+ZGVwcyA9IE5VTEw7Ci0JICB0LT5uYW1lX2luZHggPSAodW5zaWduZWQgaW50KSAtMTsKLQkgIHQtPnVzZWQgPSB0cnVlOwotCi0JICB2ZXJzaW9uX2luZGV4ID0gMTsKLQkgIGZvciAocHAgPSAmc2luZm8tPnZlcmRlZnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgKyt2ZXJzaW9uX2luZGV4OwotCSAgdC0+dmVybnVtID0gdmVyc2lvbl9pbmRleDsKLQotCSAgKnBwID0gdDsKLQotCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQl9Ci0gICAgICBlbHNlIGlmICh0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY291bGQgbm90IGZpbmQgdGhlIHZlcnNpb24gZm9yIGEgc3ltYm9sIHdoZW4KLSAgICAgICAgICAgICBnZW5lcmF0aW5nIGEgc2hhcmVkIGFyY2hpdmUuICBSZXR1cm4gYW4gZXJyb3IuICAqLwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wgbmFtZSAlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc2luZm8tPm91dHB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaGlkZGVuKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSElEREVOOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmVyc2lvbiBmb3IgdGhpcyBzeW1ib2wsIHNlZSBpZiB3ZSBjYW4gZmluZAotICAgICBzb21ldGhpbmcuICAqLwotICBpZiAoaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwgJiYgc2luZm8tPnZlcmRlZnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmRlZmx0OwotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOwotCi0gICAgICAvKiBTZWUgaWYgY2FuIGZpbmQgd2hhdCB2ZXJzaW9uIHRoaXMgc3ltYm9sIGlzIGluLiAgSWYgdGhlCi0gICAgICAgICBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgbG9jYWwsIHRoZW4gZG9uJ3QgYWN0dWFsbHkgcmVnaXN0ZXIKLSAgICAgICAgIGl0LiAgKi8KLSAgICAgIGRlZmx0ID0gTlVMTDsKLSAgICAgIGZvciAodCA9IHNpbmZvLT52ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqZC0+bWF0Y2gpIChkLCBoLT5yb290LnJvb3Quc3RyaW5nKSkKLQkJICAgIHsKLQkJICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChkICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0LT5sb2NhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJewotCQkgIGlmIChkLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBkLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0JCSAgICBkZWZsdCA9IHQ7Ci0JCSAgZWxzZSBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkJICAmJiBpbmZvLT5zaGFyZWQKLQkJCSAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCi0JCQl7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkJICAoKmJlZC0+ZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wpIChoKTsKLQkJCSAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkKLQkJCSAgICAgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUKLQkJCSAgICAgc2VjdGlvbi4gICovCi0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRlZmx0ICE9IE5VTEwgJiYgaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCi0JewotCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gZGVmbHQ7Ci0JICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCSAgICAgICYmIGluZm8tPnNoYXJlZAotCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JICAgICAgKCpiZWQtPmVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sKSAoaCk7Ci0JICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbgotCQkgcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpbmFsIHBoYXNlIG9mIEVMRiBsaW5rZXIuICAqLwotCi0vKiBBIHN0cnVjdHVyZSB3ZSB1c2UgdG8gYXZvaWQgcGFzc2luZyBsYXJnZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBTeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3ltc3RydGFiOwotICAvKiAuZHluc3ltIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqZHluc3ltX3NlYzsKLSAgLyogLmhhc2ggc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpoYXNoX3NlYzsKLSAgLyogc3ltYm9sIHZlcnNpb24gc2VjdGlvbiAoLmdudS52ZXJzaW9uKS4gICovCi0gIGFzZWN0aW9uICpzeW12ZXJfc2VjOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0Ci0gICAgIEJGRC4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAotICAgICBCRkQuICAqLwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zOwotICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHN5bWJvbCBpbmRleCBmb3IgZWFjaCBsb2NhbCBzeW1ib2wKLSAgICAgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGxvbmcgKmluZGljZXM7Ci0gIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBwb2ludGVyIGZvciBlYWNoIGxvY2FsCi0gICAgIHN5bWJvbCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsKLSAgLyogQnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKnN5bWJ1ZjsKLSAgLyogTnVtYmVyIG9mIHN3YXBwZWQgb3V0IHN5bWJvbHMgaW4gYnVmZmVyLiAgKi8KLSAgc2l6ZV90IHN5bWJ1Zl9jb3VudDsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgd2hpY2ggZml0IGluIHN5bWJ1Zi4gICovCi0gIHNpemVfdCBzeW1idWZfc2l6ZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGVsZl9saW5rX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZWxmX291dGV4dF9pbmZvCi17Ci0gIGJvb2xlYW4gZmFpbGVkOwotICBib29sZWFuIGxvY2Fsc3ltczsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotfTsKLQotLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiwgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciwgUkVMX0hEUiB3aGljaCBpcyB0aGUKLSAgIHNlY3Rpb24gaGVhZGVyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyByZWxvY2F0aW9ucyBmb3IgTy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24gKGFiZmQsIHJlbF9oZHIsIG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzZWN0aW9uICpvOwotewotICByZWdpc3RlciBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnAsICoqcGVuZDsKLSAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSByZWxvY2F0aW9ucyB0aGVyZSB3aWxsIGJlLiAgKi8KLSAgaWYgKHJlbF9oZHIgPT0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyKQotICAgIHJlbG9jX2NvdW50ID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDsKLSAgZWxzZQotICAgIHJlbG9jX2NvdW50ID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDI7Ci0KLSAgLyogVGhhdCBhbGxvd3MgdXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgcmVsX2hkci0+c2hfc2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemUgKiByZWxvY19jb3VudDsKLQotICAvKiBUaGUgY29udGVudHMgZmllbGQgbXVzdCBsYXN0IGludG8gd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBzbyB3ZQotICAgICBhbGxvY2F0ZSBpdCB3aXRoIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MuICAqLwotICByZWxfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxfaGRyLT5jb250ZW50cyA9PSBOVUxMICYmIHJlbF9oZHItPnNoX3NpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBXZSBvbmx5IGFsbG9jYXRlIG9uZSBzZXQgb2YgaGFzaCBlbnRyaWVzLCBzbyB3ZSBvbmx5IGRvIGl0IHRoZQotICAgICBmaXJzdCB0aW1lIHdlIGFyZSBjYWxsZWQuICAqLwotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyA9IHA7Ci0gICAgICBwZW5kID0gcCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IHAgPCBwZW5kOyBwKyspCi0JKnAgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBpbnB1dCByZWxvY2F0aW9ucyBhcmUKLSAgIHByZXNlcnZlZC4gIEJ1dCwgaWYgdGhleSByZWZlcmVuY2UgZ2xvYmFsIHN5bWJvbHMsIHRoZSBpbmRpY2VzCi0gICByZWZlcmVuY2VkIG11c3QgYmUgdXBkYXRlZC4gIFVwZGF0ZSBhbGwgdGhlIHJlbG9jYXRpb25zIGluCi0gICBSRUxfSERSICh0aGVyZSBhcmUgQ09VTlQgb2YgdGhlbSksIHVzaW5nIHRoZSBkYXRhIGluIFJFTF9IQVNILiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX2FkanVzdF9yZWxvY3MgKGFiZmQsIHJlbF9oZHIsIGNvdW50LCByZWxfaGFzaCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcmVsX2hhc2grKykKLSAgICB7Ci0gICAgICBpZiAoKnJlbF9oYXNoID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCi0gICAgICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0JICAKLQkgIGVyZWwgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSByZWxfaGRyLT5jb250ZW50cyArIGk7Ci0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOwotCSAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkgICAgRUxGX1JfVFlQRSAoaXJlbC5yX2luZm8pKTsKLQkgIGVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmlyZWwsIGVyZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLQkgIAotCSAgQkZEX0FTU0VSVCAocmVsX2hkci0+c2hfZW50c2l6ZQotCQkgICAgICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0JICAKLQkgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbF9oZHItPmNvbnRlbnRzICsgaTsKLQkgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsICZpcmVsYSk7Ci0JICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkgICAgIEVMRl9SX1RZUEUgKGlyZWxhLnJfaW5mbykpOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmlyZWxhLCBlcmVsYSk7Ci0JfQotICAgIH0KLX0KLQotLyogRG8gdGhlIGZpbmFsIHN0ZXAgb2YgYW4gRUxGIGxpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICByZWdpc3RlciBhc2VjdGlvbiAqbzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X2V4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHNpemVfdCBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBmaWxlX3B0ciBvZmY7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gZWxmc3ltOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvIGVvaW5mbzsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgZHluYW1pYyA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN5bXN0cnRhYiA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmluZm8uZHluc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBmaW5mby5oYXNoX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAoZmluZm8uZHluc3ltX3NlYyAhPSBOVUxMICYmIGZpbmZvLmhhc2hfc2VjICE9IE5VTEwpOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBPSyBpZiBzeW12ZXJfc2VjIGlzIE5VTEwuICAqLwotICAgIH0KLQotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25zID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmX2NvdW50ID0gMDsKLQotICAvKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHdlIHdpbGwgb3V0cHV0IGZvciBlYWNoIG91dHB1dAotICAgICBzZWN0aW9uLCBzbyB0aGF0IHdlIGtub3cgdGhlIHNpemVzIG9mIHRoZSByZWxvYyBzZWN0aW9ucy4gIFdlCi0gICAgIGFsc28gZmlndXJlIG91dCBzb21lIG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9leHRlcm5hbF9yZWxvY19zaXplID0gMDsKLSAgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgaW5mby0+ZW1pdHJlbG9jYXRpb25zKQotCQlvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0JICAgICAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICAvKiBXZSBhcmUgaW50ZXJlc3RlZCBpbiBqdXN0IGxvY2FsIHN5bWJvbHMsIG5vdCBhbGwKLQkJIHN5bWJvbHMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHNlYy0+b3duZXIpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICAmJiAoc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCQl7Ci0JCSAgc2l6ZV90IHN5bV9jb3VudDsKLQotCQkgIGlmIChlbGZfYmFkX3N5bXRhYiAoc2VjLT5vd25lcikpCi0JCSAgICBzeW1fY291bnQgPSAoZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9zaXplCi0JCQkJIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0JCSAgZWxzZQotCQkgICAgc3ltX2NvdW50ID0gZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCi0JCSAgaWYgKHN5bV9jb3VudCA+IG1heF9zeW1fY291bnQpCi0JCSAgICBtYXhfc3ltX2NvdW50ID0gc3ltX2NvdW50OwotCi0JCSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCQkgICAgewotCQkgICAgICBzaXplX3QgZXh0X3NpemU7Ci0KLQkJICAgICAgZXh0X3NpemUgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX3NpemU7Ci0JCSAgICAgIGlmIChleHRfc2l6ZSA+IG1heF9leHRlcm5hbF9yZWxvY19zaXplKQotCQkJbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgPSBleHRfc2l6ZTsKLQkJICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQpCi0JCQltYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA+IDApCi0Jby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEV4cGxpY2l0bHkgY2xlYXIgdGhlIFNFQ19SRUxPQyBmbGFnLiAgVGhlIGxpbmtlciB0ZW5kcyB0bwotCSAgICAgc2V0IGl0ICh0aGlzIGlzIHByb2JhYmx5IGEgYnVnKSBhbmQgaWYgaXQgaXMgc2V0Ci0JICAgICBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIHdpbGwgY3JlYXRlIGEgcmVsb2Mgc2VjdGlvbi4gICovCi0JICBvLT5mbGFncyAmPX4gU0VDX1JFTE9DOwotCX0KLQotICAgICAgLyogSWYgdGhlIFNFQ19BTExPQyBmbGFnIGlzIG5vdCBzZXQsIGZvcmNlIHRoZSBzZWN0aW9uIFZNQSB0bwotCSB6ZXJvLiAgVGhpcyBpcyBkb25lIGluIGVsZl9mYWtlX3NlY3Rpb25zIGFzIHdlbGwsIGJ1dCBmb3JjaW5nCi0JIHRoZSBWTUEgdG8gMCBoZXJlIHdpbGwgZW5zdXJlIHRoYXQgcmVsb2NzIGFnYWluc3QgdGhlc2UKLQkgc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICYmICEgby0+dXNlcl9zZXRfdm1hKQotCW8tPnZtYSA9IDA7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGFuZCB0aGUgcmVsb2NzLiAgV2Ugc2V0IHN5bWNvdW50IHRvIGZvcmNlIGFzc2lnbl9zZWN0aW9uX251bWJlcnMKLSAgICAgdG8gY3JlYXRlIGEgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgPyAwIDogMTsKLSAgQkZEX0FTU0VSVCAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgaWYgKCEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkLCBpbmZvKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBGaWd1cmUgb3V0IGhvdyBtYW55IHJlbG9jYXRpb25zIHdlIHdpbGwgaGF2ZSBpbiBlYWNoIHNlY3Rpb24uCi0gICAgIEp1c3QgdXNpbmcgUkVMT0NfQ09VTlQgaXNuJ3QgZ29vZCBlbm91Z2ggc2luY2UgdGhhdCBkb2Vzbid0Ci0gICAgIG1haW50YWluIGEgc2VwYXJhdGUgdmFsdWUgZm9yIFJFTCB2cy4gUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgaW5mby0+ZW1pdHJlbG9jYXRpb25zKQotICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG91dHB1dF9zZWN0aW9uID0gby0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JICAgICAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICplc2RpIAotCQk9IGVsZl9zZWN0aW9uX2RhdGEgKG8pOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZXNkbyAKLQkJPSBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdW5zaWduZWQgaW50ICpyZWxfY291bnQ7Ci0JICAgICAgdW5zaWduZWQgaW50ICpyZWxfY291bnQyOwotCi0JICAgICAgLyogV2UgbXVzdCBiZSBjYXJlZnVsIHRvIGFkZCB0aGUgcmVsb2NhdGlvbiBmcm9tcyB0aGUKLQkJIGlucHV0IHNlY3Rpb24gdG8gdGhlIHJpZ2h0IG91dHB1dCBjb3VudC4gICovCi0JICAgICAgaWYgKGVzZGktPnJlbF9oZHIuc2hfZW50c2l6ZSA9PSBlc2RvLT5yZWxfaGRyLnNoX2VudHNpemUpCi0JCXsKLQkJICByZWxfY291bnQgPSAmZXNkby0+cmVsX2NvdW50OwotCQkgIHJlbF9jb3VudDIgPSAmZXNkby0+cmVsX2NvdW50MjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbF9jb3VudCA9ICZlc2RvLT5yZWxfY291bnQyOwotCQkgIHJlbF9jb3VudDIgPSAmZXNkby0+cmVsX2NvdW50OwotCQl9Ci0JICAgICAgCi0JICAgICAgKnJlbF9jb3VudCArPSAoZXNkaS0+cmVsX2hkci5zaF9zaXplIAotCQkJICAgICAvIGVzZGktPnJlbF9oZHIuc2hfZW50c2l6ZSk7Ci0JICAgICAgaWYgKGVzZGktPnJlbF9oZHIyKQotCQkqcmVsX2NvdW50MiArPSAoZXNkaS0+cmVsX2hkcjItPnNoX3NpemUgCi0JCQkJLyBlc2RpLT5yZWxfaGRyMi0+c2hfZW50c2l6ZSk7Ci0JICAgIH0KLQl9Ci0KLSAgLyogVGhhdCBjcmVhdGVkIHRoZSByZWxvYyBzZWN0aW9ucy4gIFNldCB0aGVpciBzaXplcywgYW5kIGFzc2lnbgotICAgICB0aGVtIGZpbGUgcG9zaXRpb25zLCBhbmQgYWxsb2NhdGUgc29tZSBidWZmZXJzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBpZiAoIWVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbiAoYWJmZCwKLQkJCQkJICAgICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkciwKLQkJCQkJICAgIG8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMgotCSAgICAgICYmICFlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24gKGFiZmQsCi0JCQkJCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIsCi0JCQkJCSAgICAgICBvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBOb3csIHJlc2V0IFJFTF9DT1VOVCBhbmQgUkVMX0NPVU5UMiBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbQotCSB0byBjb3VudCB1cHdhcmRzIHdoaWxlIGFjdHVhbGx5IG91dHB1dHRpbmcgdGhlIHJlbG9jYXRpb25zLiAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudCA9IDA7Ci0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50MiA9IDA7Ci0gICAgfQotCi0gIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIChhYmZkKTsKLQotICAvKiBXZSBoYXZlIG5vdyBhc3NpZ25lZCBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBleGNlcHQKLSAgICAgLnN5bXRhYiBhbmQgLnN0cnRhYi4gIFdlIHN0YXJ0IHRoZSAuc3ltdGFiIHNlY3Rpb24gYXQgdGhlIGN1cnJlbnQKLSAgICAgZmlsZSBwb3NpdGlvbiwgYW5kIHdyaXRlIGRpcmVjdGx5IHRvIGl0LiAgV2UgYnVpbGQgdGhlIC5zdHJ0YWIKLSAgICAgc2VjdGlvbiBpbiBtZW1vcnkuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgLyogc2hfbmFtZSBpcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TWU1UQUI7Ci0gIHN5bXRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX3NpemUgPSAwOwotICBzeW10YWJfaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgLyogc2hfbGluayBpcyBzZXQgaW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycy4gICovCi0gIC8qIHNoX2luZm8gaXMgc2V0IGJlbG93LiAgKi8KLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBqdXN0IGJlbG93LiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfYWRkcmFsaWduID0gNDsgIC8qIEZJWE1FOiBzeXN0ZW0gZGVwZW5kZW50PyAgKi8KLQotICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc3ltdGFiX2hkciwgb2ZmLCB0cnVlKTsKLQotICAvKiBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zIGlzCi0gICAgIGluY29ycmVjdC4gIFdlIGRvIG5vdCB5ZXQga25vdyB0aGUgc2l6ZSBvZiB0aGUgLnN5bXRhYiBzZWN0aW9uLgotICAgICBXZSBjb3JyZWN0IG5leHRfZmlsZV9wb3MgYmVsb3csIGFmdGVyIHdlIGRvIGtub3cgdGhlIHNpemUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gIFRoaXMgaXMgdG8gYXZvaWQKLSAgICAgY29udGludW91c2x5IHNlZWtpbmcgdG8gdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHRoZSBmaWxlLiAgKi8KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgbWF4X3N5bV9jb3VudCA8IDIwKQotICAgIGZpbmZvLnN5bWJ1Zl9zaXplID0gMjA7Ci0gIGVsc2UKLSAgICBmaW5mby5zeW1idWZfc2l6ZSA9IG1heF9zeW1fY291bnQ7Ci0gIGZpbmZvLnN5bWJ1ZiA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkgIGJmZF9tYWxsb2MgKGZpbmZvLnN5bWJ1Zl9zaXplICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoZmluZm8uc3ltYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU3RhcnQgd3JpdGluZyBvdXQgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSBmaXJzdCBzeW1ib2wgaXMgYWx3YXlzIGEKLSAgICAgZHVtbXkgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCB8fCBpbmZvLT5yZWxvY2F0ZWFibGUgfHwgaW5mby0+ZW1pdHJlbG9jYXRpb25zKQotICAgIHsKLSAgICAgIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfb3RoZXIgPSAwOwotICAgICAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAmZWxmc3ltLCBiZmRfdW5kX3NlY3Rpb25fcHRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFNvbWUgc3RhbmRhcmQgRUxGIGxpbmtlcnMgZG8gdGhpcywgYnV0IHdlIGRvbid0IGJlY2F1c2UgaXQgY2F1c2VzCi0gICAgIGJvb3RzdHJhcCBjb21wYXJpc29uIGZhaWx1cmVzLiAgKi8KLSAgLyogT3V0cHV0IGEgZmlsZSBzeW1ib2wgZm9yIHRoZSBvdXRwdXQgZmlsZSBhcyB0aGUgc2Vjb25kIHN5bWJvbC4KLSAgICAgV2Ugb3V0cHV0IHRoaXMgZXZlbiBpZiB3ZSBhcmUgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBhbHRob3VnaAotICAgICBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0LiAgKi8KLSAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLSAgZWxmc3ltLnN0X3NpemUgPSAwOwotICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLSAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCSAgICAgJmVsZnN5bSwgYmZkX2Fic19zZWN0aW9uX3B0cikpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0jZW5kaWYKLQotICAvKiBPdXRwdXQgYSBzeW1ib2wgZm9yIGVhY2ggc2VjdGlvbi4gIFdlIG91dHB1dCB0aGVzZSBldmVuIGlmIHdlIGFyZQotICAgICBkaXNjYXJkaW5nIGxvY2FsIHN5bWJvbHMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIHJlbG9jcy4gIFRoZXNlCi0gICAgIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gIFdlIHN0b3JlIHRoZSBpbmRleCBvZiBlYWNoIG9uZSBpbiB0aGUKLSAgICAgaW5kZXggZmllbGQgb2YgdGhlIHNlY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgYWdhaW4gd2hlbgotICAgICBvdXRwdXR0aW5nIHJlbG9jcy4gICovCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlIHx8IGluZm8tPmVtaXRyZWxvY2F0aW9ucykKLSAgICB7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQl7Ci0JICBvID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaSk7Ci0JICBpZiAobyAhPSBOVUxMKQotCSAgICBvLT50YXJnZXRfaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGVsZnN5bS5zdF9zaG5keCA9IGk7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IG8gPT0gTlVMTCkKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLQkgIGVsc2UKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gby0+dm1hOwotCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgJmVsZnN5bSwgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGluIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkJCSAgIGJmZF9tYWxsb2MgKG1heF9pbnRlcm5hbF9yZWxvY19jb3VudAotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpCi0JCQkJICAgICAgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8uc2VjdGlvbnMgPSAoKGFzZWN0aW9uICoqKQotCQkgICAgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5zZWN0aW9ucyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2luY2UgRUxGIHBlcm1pdHMgcmVsb2NhdGlvbnMgdG8gYmUgYWdhaW5zdCBsb2NhbCBzeW1ib2xzLCB3ZQotICAgICBtdXN0IGhhdmUgdGhlIGxvY2FsIHN5bWJvbHMgYXZhaWxhYmxlIHdoZW4gd2UgZG8gdGhlIHJlbG9jYXRpb25zLgotICAgICBTaW5jZSB3ZSB3b3VsZCByYXRoZXIgb25seSByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZCB3ZQotICAgICB3b3VsZCByYXRoZXIgbm90IGtlZXAgdGhlbSBpbiBtZW1vcnksIHdlIGhhbmRsZSBhbGwgdGhlCi0gICAgIHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiBsb2NhbAotICAgICBzeW1ib2xzIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgb2YgdGhlbSwgYW5kIHRoZSBsb2NhbCBzeW1ib2wKLSAgICAgaW5kaWNlcyBwcmVjZWRlIHRoZSBnbG9iYWwgc3ltYm9sIGluZGljZXMuICBUaGlzIG1lYW5zIHRoYXQgd2hlbgotICAgICB3ZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2Ugc2VlIGEgcmVsb2MgYWdhaW5zdAotICAgICBhIGdsb2JhbCBzeW1ib2wsIHdlIGNhbiBub3Qga25vdyB0aGUgc3ltYm9sIGluZGV4IHVudGlsIHdlIGhhdmUKLSAgICAgZmluaXNoZWQgZXhhbWluaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9scyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gb3V0cHV0LiAgVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGtlZXAgdGhlIHJlbG9jYXRpb25zIGluCi0gICAgIG1lbW9yeSwgYW5kIGRvbid0IG91dHB1dCB0aGVtIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIGlzCi0gICAgIGFuIHVuZm9ydHVuYXRlIHdhc3RlIG9mIG1lbW9yeSwgYnV0IEkgZG9uJ3Qgc2VlIGEgZ29vZCB3YXkgYXJvdW5kCi0gICAgIGl0LiAgRm9ydHVuYXRlbHksIGl0IG9ubHkgaGFwcGVucyB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUKLSAgICAgbGluaywgd2hpY2ggaXMgbm90IHRoZSBjb21tb24gY2FzZS4gIEZJWE1FOiBJZiBrZWVwX21lbW9yeSBpcyBzZXQKLSAgICAgd2UgY291bGQgd3JpdGUgdGhlIHJlbG9jcyBvdXQgYW5kIHRoZW4gcmVhZCB0aGVtIGFnYWluOyBJIGRvbid0Ci0gICAgIGtub3cgaG93IGJhZCB0aGUgbWVtb3J5IGxvc3Mgd2lsbCBiZS4gICovCi0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGVsZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlbGZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGF0IHdyb3RlIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGaW5pc2ggdXAgdGhlIHN5bWJvbCB0YWJsZQotICAgICB3aXRoIHRoZSBnbG9iYWwgc3ltYm9scy4gRXZlbiBpZiB3ZSB3YW50IHRvIHN0cmlwIGV2ZXJ5dGhpbmcgd2UKLSAgICAgY2FuLCB3ZSBzdGlsbCBuZWVkIHRvIGRlYWwgd2l0aCB0aG9zZSBnbG9iYWwgc3ltYm9scyB0aGF0IGdvdAotICAgICBjb252ZXJ0ZWQgdG8gbG9jYWwgaW4gYSB2ZXJzaW9uIHNjcmlwdC4gKi8KLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhbnkgZ2xvYmFsIHN5bWJvbHMgdGhhdCBnb3QgY29udmVydGVkIHRvIGxvY2FsIGluIGEKLSAgICAgICAgIHZlcnNpb24gc2NyaXB0LiAgV2UgZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHN0ZXAgc2luY2UgRUxGCi0gICAgICAgICByZXF1aXJlcyBhbGwgbG9jYWwgc3ltYm9scyB0byBhcHBlYXIgcHJpb3IgdG8gYW55IGdsb2JhbAotICAgICAgICAgc3ltYm9scy4gIEZJWE1FOiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHNvbWUgZ2xvYmFsCi0gICAgICAgICBzeW1ib2xzIHdlcmUsIGluIGZhY3QsIGNvbnZlcnRlZCB0byBiZWNvbWUgbG9jYWwuICBGSVhNRToKLSAgICAgICAgIFdpbGwgdGhpcyB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBJcml4IDUgbGlua2VyPyAgKi8KLSAgICAgIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKLSAgICAgIGVvaW5mby5sb2NhbHN5bXMgPSB0cnVlOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAotCQkJICAgICAgKFBUUikgJmVvaW5mbyk7Ci0gICAgICBpZiAoZW9pbmZvLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIHJlY29yZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gbG9jYWwgc3ltYm9sLiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqZHluc3ltID0KLQkoRWxmX0V4dGVybmFsX1N5bSAqKWZpbmZvLmR5bnN5bV9zZWMtPmNvbnRlbnRzOwotICAgICAgbG9uZyBsYXN0X2xvY2FsID0gMDsKLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgc3ltLnN0X3NpemUgPSAwOwotCSAgc3ltLnN0X25hbWUgPSAwOwotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBpbmR4OwotCSAgICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICAgICAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgICAgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0JICAgICAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwKLQkJCQkgICBkeW5zeW0gKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCk7Ci0JICAgIH0KLQotCSAgbGFzdF9sb2NhbCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGxvY2FsIGR5bnN5bXMuICAqLwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWwpCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmU7Ci0JICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHN5bS5zdF9zaXplID0gZS0+aXN5bS5zdF9zaXplOwotCSAgICAgIHN5bS5zdF9vdGhlciA9IGUtPmlzeW0uc3Rfb3RoZXI7Ci0KLQkgICAgICAvKiBDb3B5IHRoZSBpbnRlcm5hbCBzeW1ib2wgYXMgaXMuCi0JCSBOb3RlIHRoYXQgd2Ugc2F2ZWQgYSB3b3JkIG9mIHN0b3JhZ2UgYW5kIG92ZXJ3cm90ZQotICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgc3RfbmFtZSB3aXRoIHRoZSBkeW5zdHJfaW5kZXguICAqLwotICAgICAgICAgICAgICBzeW0gPSBlLT5pc3ltOwotCi0JICAgICAgaWYgKGUtPmlzeW0uc3Rfc2huZHggPiAwICYmIGUtPmlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQl7Ci0JCSAgcyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChlLT5pbnB1dF9iZmQsCi0JCQkJCQkgIGUtPmlzeW0uc3Rfc2huZHgpOwotCi0JCSAgc3ltLnN0X3NobmR4ID0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19pZHg7Ci0JCSAgc3ltLnN0X3ZhbHVlID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgcy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBlLT5pc3ltLnN0X3ZhbHVlKTsKLQkJfQotCi0JICAgICAgaWYgKGxhc3RfbG9jYWwgPCBlLT5keW5pbmR4KQotCQlsYXN0X2xvY2FsID0gZS0+ZHluaW5keDsKLQotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIGR5bnN5bSArIGUtPmR5bmluZHgpOwotCSAgICB9Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby5keW5zeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQotCWxhc3RfbG9jYWwgKyAxOwotICAgIH0KLQotICAvKiBXZSBnZXQgdGhlIGdsb2JhbCBzeW1ib2xzIGZyb20gdGhlIGhhc2ggdGFibGUuICAqLwotICBlb2luZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGVvaW5mby5sb2NhbHN5bXMgPSBmYWxzZTsKLSAgZW9pbmZvLmZpbmZvID0gJmZpbmZvOwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9saW5rX291dHB1dF9leHRzeW0sCi0JCQkgIChQVFIpICZlb2luZm8pOwotICBpZiAoZW9pbmZvLmZhaWxlZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgYmFja2VuZCBuZWVkcyB0byBvdXRwdXQgc29tZSBzeW1ib2xzIG5vdCBwcmVzZW50IGluIHRoZSBoYXNoCi0gICAgIHRhYmxlLCBkbyBpdCBub3cuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotCSAgICAgIChhYmZkLCBpbmZvLCAoUFRSKSAmZmluZm8sCi0JICAgICAgIChib29sZWFuICgqKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkgICAgICAgICAgICAgICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpKQotCSAgICAgICBlbGZfbGlua19vdXRwdXRfc3ltKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfSAgICAgIAotCi0gIC8qIEZsdXNoIGFsbCBzeW1ib2xzIHRvIHRoZSBmaWxlLiAgKi8KLSAgaWYgKCEgZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKCZmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW10YWIgc2VjdGlvbi4gICovCi0gIG9mZiArPSBzeW10YWJfaGRyLT5zaF9zaXplOwotCi0gIC8qIEZpbmlzaCB1cCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlICguc3RydGFiKQotICAgICBzZWN0aW9uLiAgKi8KLSAgc3ltc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAvKiBzaF9uYW1lIHdhcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zeW1zdHJ0YWIpOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCi0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW1zdHJ0YWJfaGRyLCBvZmYsIHRydWUpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1zdHJ0YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN5bXN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHJlbG9jcyB0byBoYXZlIHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyAoYWJmZCwgJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyLCAKLQkJCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQsCi0JCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyICE9IE5VTEwpCi0JZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyAoYWJmZCwgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotCQkJCWVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyLAotCQkJCShlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAKLQkJCQkgKyBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50KSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgcmVsb2NfY291bnQgZmllbGQgdG8gMCB0byBwcmV2ZW50IHdyaXRlX3JlbG9jcyBmcm9tCi0JIHRyeWluZyB0byBzd2FwIHRoZSByZWxvY3Mgb3V0IGl0c2VsZi4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdCwgb3IgZ2VuZXJhdGluZyBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5LCBmaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgLyogRml4IHVwIC5keW5hbWljIGVudHJpZXMuICAqLwotICAgICAgbyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgby0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmX0V4dGVybmFsX0R5biAqKSAoby0+Y29udGVudHMgKyBvLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLQkgIGVsZl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERUX0lOSVQ6Ci0JICAgICAgbmFtZSA9IGluZm8tPmluaXRfZnVuY3Rpb247Ci0JICAgICAgZ290byBnZXRfc3ltOwotCSAgICBjYXNlIERUX0ZJTkk6Ci0JICAgICAgbmFtZSA9IGluZm8tPmZpbmlfZnVuY3Rpb247Ci0JICAgIGdldF9zeW06Ci0JICAgICAgewotCQlzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKLQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlpZiAoaCAhPSBOVUxMCi0JCSAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCSAgewotCQkgICAgZHluLmRfdW4uZF92YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgbyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgIGlmIChvLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCQkgICAgICBkeW4uZF91bi5kX3ZhbCArPSAoby0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBvLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogVGhlIHN5bWJvbCBpcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgc2hhcmVkCi0JCQkgICBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBhcHBseSB0byB0aGlzIG9uZS4gICovCi0JCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JCSAgICAgIH0KLQotCQkgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9IQVNIOgotCSAgICAgIG5hbWUgPSAiLmhhc2giOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9TVFJUQUI6Ci0JICAgICAgbmFtZSA9ICIuZHluc3RyIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfU1lNVEFCOgotCSAgICAgIG5hbWUgPSAiLmR5bnN5bSI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUkRFRjoKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbl9kIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRDoKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbl9yIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSU1lNOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uIjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKG8gIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBvLT52bWE7Ci0JICAgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMOgotCSAgICBjYXNlIERUX1JFTEE6Ci0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMIHx8IGR5bi5kX3RhZyA9PSBEVF9SRUxTWikKLQkJdHlwZSA9IFNIVF9SRUw7Ci0JICAgICAgZWxzZQotCQl0eXBlID0gU0hUX1JFTEE7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGZvciAoaSA9IDE7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsgaSsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCQkgIGhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JCSAgaWYgKGhkci0+c2hfdHlwZSA9PSB0eXBlCi0JCSAgICAgICYmIChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1JFTFNaIHx8IGR5bi5kX3RhZyA9PSBEVF9SRUxBU1opCi0JCQlkeW4uZF91bi5kX3ZhbCArPSBoZHItPnNoX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaWYgKGR5bi5kX3VuLmRfdmFsID09IDAKLQkJCSAgICAgIHx8IGhkci0+c2hfYWRkciA8IGR5bi5kX3VuLmRfdmFsKQotCQkJICAgIGR5bi5kX3VuLmRfdmFsID0gaGRyLT5zaF9hZGRyOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYW55IGR5bmFtaWMgc2VjdGlvbnMsIHRoZW4gb3V0cHV0IHRoZW0uICAqLwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKSAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAobyA9IGR5bm9iai0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAgICB8fCBvLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzZWN0aW9ucwotICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgaWYgKChlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX3R5cGUKLQkgICAgICAgIT0gU0hUX1NUUlRBQikKLQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5keW5zdHIiKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBvZmY7Ci0KLQkgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5keW5zdHIgc2VjdGlvbiBhcmUgYWN0dWFsbHkgaW4gYQotICAgICAgICAgICAgICAgICBzdHJpbmd0YWIuICAqLwotCSAgICAgIG9mZiA9IGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfb2Zmc2V0OwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2ZmLCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwKLQkJCQkJICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKGFiZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmaW5mby5zeW1zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zeW1zdHJ0YWIpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmluZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjdGlvbnMpOwotICBpZiAoZmluZm8uc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltYnVmKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgIT0gTlVMTCkKLQlmcmVlIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmxpbmtlciA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmaW5mby5zeW1zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zeW1zdHJ0YWIpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmluZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjdGlvbnMpOwotICBpZiAoZmluZm8uc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltYnVmKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgIT0gTlVMTCkKLQlmcmVlIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCBlbGZzeW0sIGlucHV0X3NlYykKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICplbGZzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIGJvb2xlYW4gKCpvdXRwdXRfc3ltYm9sX2hvb2spIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSBjb25zdCBjaGFyICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfU3ltICosCi0JCQkJCSBhc2VjdGlvbiAqKSk7Ci0KLSAgb3V0cHV0X3N5bWJvbF9ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+Ci0gICAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2s7Ci0gIGlmIChvdXRwdXRfc3ltYm9sX2hvb2sgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpvdXRwdXRfc3ltYm9sX2hvb2spCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBuYW1lLCBlbGZzeW0sIGlucHV0X3NlYykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7Ci0gIGVsc2UgaWYgKGlucHV0X3NlYy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICBlbGZzeW0tPnN0X25hbWUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgZWxmc3ltLT5zdF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN5bXN0cnRhYiwKLQkJCQkJCQkgICAgbmFtZSwgdHJ1ZSwKLQkJCQkJCQkgICAgZmFsc2UpOwotICAgICAgaWYgKGVsZnN5bS0+c3RfbmFtZSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZmluZm8tPnN5bWJ1Zl9jb3VudCA+PSBmaW5mby0+c3ltYnVmX3NpemUpCi0gICAgewotICAgICAgaWYgKCEgZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCBlbGZzeW0sCi0JCSAgICAgICAoUFRSKSAoZmluZm8tPnN5bWJ1ZiArIGZpbmZvLT5zeW1idWZfY291bnQpKTsKLSAgKytmaW5mby0+c3ltYnVmX2NvdW50OwotCi0gICsrIGJmZF9nZXRfc3ltY291bnQgKGZpbmZvLT5vdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmx1c2ggdGhlIG91dHB1dCBzeW1ib2xzIHRvIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zIChmaW5mbykKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotewotICBpZiAoZmluZm8tPnN5bWJ1Zl9jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYjsKLQotICAgICAgc3ltdGFiID0gJmVsZl90ZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCBzeW10YWItPnNoX29mZnNldCArIHN5bXRhYi0+c2hfc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlICgoUFRSKSBmaW5mby0+c3ltYnVmLCBmaW5mby0+c3ltYnVmX2NvdW50LAotCQkJIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgICAgICE9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bXRhYi0+c2hfc2l6ZSArPSBmaW5mby0+c3ltYnVmX2NvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLQotICAgICAgZmluZm8tPnN5bWJ1Zl9jb3VudCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZXh0ZXJuYWwgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZSB0cmF2ZXJzYWwgcm91dGluZS4gIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsCi0gICB3ZSBnbyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgdHdpY2UuICBUaGUgZmlyc3QgdGltZSB3ZSBvdXRwdXQKLSAgIGFueXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGZvcmNlZCB0byBsb2NhbCBzY29wZSBpbiBhIHZlcnNpb24KLSAgIHNjcmlwdC4gIFRoZSBzZWNvbmQgdGltZSB3ZSBvdXRwdXQgdGhlIHN5bWJvbHMgdGhhdCBhcmUgc3RpbGwKLSAgIGdsb2JhbCBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqZW9pbmZvID0gKHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gZW9pbmZvLT5maW5mbzsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gIGFzZWN0aW9uICppbnB1dF9zZWM7Ci0KLSAgLyogRGVjaWRlIHdoZXRoZXIgdG8gb3V0cHV0IHRoaXMgc3ltYm9sIGluIHRoaXMgcGFzcy4gICovCi0gIGlmIChlb2luZm8tPmxvY2Fsc3ltcykKLSAgICB7Ci0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIHN5bWJvbCBpcwotICAgICByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIGxpYnJhcnkgYnV0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCB0aGVuCi0gICAgIHdhcm4gdGhhdCBpdCBpcyB1bmRlZmluZWQuICBJZiB3ZSBkbyBub3QgZG8gdGhpcywgdGhlIHJ1bnRpbWUKLSAgICAgbGlua2VyIHdpbGwgY29tcGxhaW4gdGhhdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCB3aGVuIHRoZQotICAgICBwcm9ncmFtIGlzIHJ1bi4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc3ltYm9scyB0aGF0IGFyZQotICAgICByZWZlcmVuY2VkIGJ5IHJlZ3VsYXIgZmlsZXMsIGJlY2F1c2Ugd2Ugd2lsbCBhbHJlYWR5IGhhdmUgaXNzdWVkCi0gICAgIHdhcm5pbmdzIGZvciB0aGVtLiAgKi8KLSAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoZmluZm8tPmluZm8tPnNoYXJlZAotCSAgICAmJiAhZmluZm8tPmluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkgICAgIChmaW5mby0+aW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaC0+cm9vdC51LnVuZGVmLmFiZmQsCi0JICAgICAgKGFzZWN0aW9uICopIE5VTEwsIDAsIHRydWUpKSkKLQl7Ci0JICBlb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG91dHB1dCBzeW1ib2xzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIG1lbnRpb25lZCBieQotICAgICBhIHJlZ3VsYXIgZmlsZSwgb3IgdGhhdCB3ZSBoYXZlIGJlZW4gdG9sZCB0byBzdHJpcC4gIEhvd2V2ZXIsIGlmCi0gICAgIGgtPmluZHggaXMgc2V0IHRvIC0yLCB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYyBhbmQgd2UgbXVzdAotICAgICBvdXRwdXQgaXQuICAqLwotICBpZiAoaC0+aW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIGFuZCBpdCdzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLCB0aGVyZSdzCi0gICAgIG5vdGhpbmcgZWxzZSB0byBkbyB1bmxlc3MgaXQgaXMgYSBmb3JjZWQgbG9jYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHN0cmlwCi0gICAgICAmJiBoLT5keW5pbmR4ID09IC0xCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW0uc3RfdmFsdWUgPSAwOwotICBzeW0uc3Rfc2l6ZSA9IGgtPnNpemU7Ci0gIHN5bS5zdF9vdGhlciA9IGgtPm90aGVyOwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBoLT50eXBlKTsKLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfV0VBSywgaC0+dHlwZSk7Ci0gIGVsc2UKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBoLT50eXBlKTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWlucHV0X3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQlpZiAoaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBzeW0uc3Rfc2huZHggPQotCSAgICAgIF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCQkgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLAotCQkgICBpbnB1dF9zZWMtPm5hbWUpOwotCQllb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLAotCSAgICAgICBidXQgaW4gbm9ucmVsb2NhdGVhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwKLQkgICAgICAgYWRkcmVzc2VzLiAgKi8KLQkgICAgc3ltLnN0X3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZSArIGlucHV0X3NlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgICBzeW0uc3RfdmFsdWUgKz0gaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjLT5vd25lciA9PSBOVUxMCi0JCQl8fCAoaW5wdXRfc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKTsKLQkgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotCSAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgaW5wdXRfc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9DT01NT047Ci0gICAgICBzeW0uc3RfdmFsdWUgPSAxIDw8IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgY3JlYXRlZCBieSBzeW1ib2wgdmVyc2lvbmluZy4gIFRoZXkgcG9pbnQKLSAgICAgICAgIHRvIHRoZSBkZWNvcmF0ZWQgdmVyc2lvbiBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBpZiB0aGUKLSAgICAgICAgIHN5bWJvbCBmb29AQEdOVV8xLjIgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4KLSAgICAgICAgIGZvbyBpcyB1c2VkIHdpdGggbm8gdmVyc2lvbiwgdGhlbiB3ZSBhZGQgYW4gaW5kaXJlY3Qgc3ltYm9sCi0gICAgICAgICBmb28gd2hpY2ggcG9pbnRzIHRvIGZvb0BAR05VXzEuMi4gIFdlIGlnbm9yZSB0aGVzZSBzeW1ib2xzLAotICAgICAgICAgc2luY2UgdGhlIGluZGlyZWN0ZWQgc3ltYm9sIGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIFdlIGNhbid0IHJlcHJlc2VudCB0aGVzZSBzeW1ib2xzIGluIEVMRiwgYWx0aG91Z2ggYSB3YXJuaW5nCi0gICAgICAgICBzeW1ib2wgbWF5IGhhdmUgY29tZSBmcm9tIGEgLmdudS53YXJuaW5nLlNZTUJPTCBzZWN0aW9uLiAgV2UKLSAgICAgICAgIGp1c3QgcHV0IHRoZSB0YXJnZXQgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIHRhcmdldAotICAgICAgICAgc3ltYm9sIGRvZXMgbm90IHJlYWxseSBleGlzdCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKGgtPnJvb3QudS5pLmxpbmstPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gKGVsZl9saW5rX291dHB1dF9leHRzeW0KLQkgICAgICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbmssIGRhdGEpKTsKLSAgICB9Ci0KLSAgLyogR2l2ZSB0aGUgcHJvY2Vzc29yIGJhY2tlbmQgYSBjaGFuY2UgdG8gdHdlYWsgdGhlIHN5bWJvbCB2YWx1ZSwKLSAgICAgYW5kIGFsc28gdG8gZmluaXNoIHVwIGFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gICAgICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpOwotICAgICAgaWYgKCEgKCgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoLCAmc3ltKSkpCi0JewotCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG1hcmtpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIGFuZCB0aGVyZSBhcmUgbm8KLSAgICAgbm9uLXdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCBmcm9tIGEgcmVndWxhciBvYmplY3QsIHRoZW4KLSAgICAgbWFyayB0aGUgc3ltYm9sIGFzIHdlYWsgdW5kZWZpbmVkOyBpZiB0aGVyZSBhcmUgbm9uLXdlYWsKLSAgICAgcmVmZXJlbmNlcywgbWFyayB0aGUgc3ltYm9sIGFzIHN0cm9uZy4gIFdlIGNhbid0IGRvIHRoaXMgZWFybGllciwKLSAgICAgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgbWFya2VkIGFzIHVuZGVmaW5lZCB1bnRpbCB0aGUKLSAgICAgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUgZ2V0cyB0aHJvdWdoIHdpdGggaXQuICAqLwotICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRgotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiAoRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pID09IFNUQl9HTE9CQUwKLQkgIHx8IEVMRl9TVF9CSU5EKHN5bS5zdF9pbmZvKSA9PSBTVEJfV0VBSykpCi0gICAgewotICAgICAgaW50IGJpbmR0eXBlOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspICE9IDApCi0JYmluZHR5cGUgPSBTVEJfR0xPQkFMOwotICAgICAgZWxzZQotCWJpbmR0eXBlID0gU1RCX1dFQUs7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kdHlwZSwgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSk7Ci0gICAgfQotCi0gIC8qIElmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGxvY2FsbHksIHdlIGNsZWFyIHRoZSB2aXNpYmlsaXR5Ci0gICAgIGZpZWxkLiAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN5bS5zdF9vdGhlciBePSBFTEZfU1RfVklTSUJJTElUWShzeW0uc3Rfb3RoZXIpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBwdXQgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiwgdGhlbiBwdXQgaXQKLSAgICAgdGhlcmUgbm93LiAgV2UgaGF2ZSBhbHJlYWR5IGtub3cgdGhlIHN5bWJvbCBpbmRleC4gIFdlIGFsc28gZmlsbAotICAgICBpbiB0aGUgZW50cnkgaW4gdGhlIC5oYXNoIHNlY3Rpb24uICAqLwotICBpZiAoaC0+ZHluaW5keCAhPSAtMQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBidWNrZXRjb3VudDsKLSAgICAgIHNpemVfdCBidWNrZXQ7Ci0gICAgICBzaXplX3QgaGFzaF9lbnRyeV9zaXplOwotICAgICAgYmZkX2J5dGUgKmJ1Y2tldHBvczsKLSAgICAgIGJmZF92bWEgY2hhaW47Ci0KLSAgICAgIHN5bS5zdF9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgJnN5bSwKLQkJCSAgIChQVFIpICgoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJCQkgICBmaW5mby0+ZHluc3ltX3NlYy0+Y29udGVudHMpCi0JCQkJICArIGgtPmR5bmluZHgpKTsKLQotICAgICAgYnVja2V0Y291bnQgPSBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5idWNrZXRjb3VudDsKLSAgICAgIGJ1Y2tldCA9IGgtPmVsZl9oYXNoX3ZhbHVlICUgYnVja2V0Y291bnQ7Ci0gICAgICBoYXNoX2VudHJ5X3NpemUgCi0JPSBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby0+aGFzaF9zZWMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotICAgICAgYnVja2V0cG9zID0gKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCi0JCSAgICsgKGJ1Y2tldCArIDIpICogaGFzaF9lbnRyeV9zaXplKTsKLSAgICAgIGNoYWluID0gYmZkX2dldCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQsIGJ1Y2tldHBvcyk7Ci0gICAgICBiZmRfcHV0ICg4ICogaGFzaF9lbnRyeV9zaXplLCBmaW5mby0+b3V0cHV0X2JmZCwgaC0+ZHluaW5keCwgYnVja2V0cG9zKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkLCBjaGFpbiwKLQkgICAgICAgKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCi0JCSsgKGJ1Y2tldGNvdW50ICsgMiArIGgtPmR5bmluZHgpICogaGFzaF9lbnRyeV9zaXplKSk7Ci0KLSAgICAgIGlmIChmaW5mby0+c3ltdmVyX3NlYyAhPSBOVUxMICYmIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cyAhPSBOVUxMKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAwOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLQkJaXZlcnN5bS52c192ZXJzID0gMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJzeW0udnNfdmVycyA9IGgtPnZlcmluZm8udmVydHJlZS0+dmVybnVtICsgMTsKLQkgICAgfQotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19ISURERU4pICE9IDApCi0JICAgIGl2ZXJzeW0udnNfdmVycyB8PSBWRVJTWU1fSElEREVOOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmaXZlcnN5bSwKLQkJCQkgICAgKCgoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKQotCQkJCSAgICAgIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cykKLQkJCQkgICAgICsgaC0+ZHluaW5keCkpOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgc3RyaXBwaW5nIGl0LCB0aGVuIGl0IHdhcyBqdXN0IGEgZHluYW1pYyBzeW1ib2wsIGFuZAotICAgICB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4gICovCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT5pbmR4ID0gYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCAmc3ltLCBpbnB1dF9zZWMpKQotICAgIHsKLSAgICAgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgdGhlIHJlbG9jYXRpb25zIGluZGljYXRlZCBieSB0aGUgSU5URVJOQUxfUkVMT0NTICh3aGljaAotICAgb3JpZ2luYXRlZCBmcm9tIHRoZSBzZWN0aW9uIGdpdmVuIGJ5IElOUFVUX1JFTF9IRFIpIHRvIHRoZQotICAgT1VUUFVUX0JGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBpbnB1dF9yZWxfaGRyLCAKLQkJCWludGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOwotICBFbGZfSW50ZXJuYWxfU2hkciAqb3V0cHV0X3JlbF9oZHI7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgdW5zaWduZWQgaW50ICpyZWxfY291bnRwID0gTlVMTDsKLQotICBvdXRwdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBvdXRwdXRfcmVsX2hkciA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9lbnRzaXplIAotICAgICAgPT0gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSkKLSAgICB7Ci0gICAgICBvdXRwdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0gICAgICByZWxfY291bnRwID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50OwotICAgIH0KLSAgZWxzZSBpZiAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyMgotCSAgICYmIChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyLT5zaF9lbnRzaXplCi0JICAgICAgID09IGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUpKQotICAgIHsKLSAgICAgIG91dHB1dF9yZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyMjsKLSAgICAgIHJlbF9jb3VudHAgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQyOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChvdXRwdXRfcmVsX2hkciAhPSBOVUxMKTsKLSAgCi0gIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICBpcmVsYWVuZCA9IGlyZWxhICsgaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSAvIGlucHV0X3JlbF9oZHItPnNoX2VudHNpemU7Ci0gIGlmIChpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLQotICAgICAgZXJlbCA9ICgoRWxmX0V4dGVybmFsX1JlbCAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMgKyAqcmVsX2NvdW50cCk7Ci0gICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKLQotCSAgaXJlbC5yX29mZnNldCA9IGlyZWxhLT5yX29mZnNldDsKLQkgIGlyZWwucl9pbmZvID0gaXJlbGEtPnJfaW5mbzsKLQkgIEJGRF9BU1NFUlQgKGlyZWxhLT5yX2FkZGVuZCA9PSAwKTsKLQkgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUKLQkJICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0gICAgICBlcmVsYSA9ICgoRWxmX0V4dGVybmFsX1JlbGEgKikgb3V0cHV0X3JlbF9oZHItPmNvbnRlbnRzICsgKnJlbF9jb3VudHApOwotICAgICAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIGVyZWxhKyspCi0JZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgaXJlbGEsIGVyZWxhKTsKLSAgICB9Ci0KLSAgLyogQnVtcCB0aGUgY291bnRlciwgc28gdGhhdCB3ZSBrbm93IHdoZXJlIHRvIGFkZCB0aGUgbmV4dCBzZXQgb2YKLSAgICAgcmVsb2NhdGlvbnMuICAqLwotICAqcmVsX2NvdW50cCArPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4KLSAgIFRoaXMgaXMgc28gdGhhdCB3ZSBvbmx5IGhhdmUgdG8gcmVhZCB0aGUgbG9jYWwgc3ltYm9scyBvbmNlLCBhbmQKLSAgIGRvbid0IGhhdmUgdG8ga2VlcCB0aGVtIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc2l6ZV90IGxvY3N5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBFbGZfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltZW5kOwotICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotICBsb25nICpwaW5kZXg7Ci0gIGFzZWN0aW9uICoqcHBzZWN0aW9uOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgcmVsb2NhdGVfc2VjdGlvbiA9IGJlZC0+ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIHdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaGVyZToKLSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgbG9jYWwgc3ltYm9scywgYW5kIHdlIGRvbid0IHdhbnQgdGhlIHNlY3Rpb24KLSAgICAgY29udGVudHMuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3N5bXMgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgZWxzZSBpZiAobG9jc3ltY291bnQgPT0gMCkKLSAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBmaW5mby0+ZXh0ZXJuYWxfc3ltczsKLSAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCQlsb2NzeW1jb3VudCwgaW5wdXRfYmZkKQotCSAgICAgICE9IGxvY3N5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSBsb2NhbCBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIG9uZXMgd2hpY2ggd2Uga25vdwotICAgICBhcmUgZ29pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBsb2NzeW1jb3VudDsKLSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBwaW5kZXggPSBmaW5mby0+aW5kaWNlczsKLSAgcHBzZWN0aW9uID0gZmluZm8tPnNlY3Rpb25zOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaXN5bSsrLCBwaW5kZXgrKywgcHBzZWN0aW9uKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBvc3ltOwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bSk7Ci0gICAgICAqcGluZGV4ID0gLTE7Ci0KLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBpZiAoRUxGX1NUX0JJTkQgKGlzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICAgewotCSAgICAgICpwcHNlY3Rpb24gPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCWlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPiAwICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQlpc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLT5zdF9zaG5keCk7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCWlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQlpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXaG8ga25vd3M/ICAqLwotCSAgaXNlYyA9IE5VTEw7Ci0JfQotCi0gICAgICAqcHBzZWN0aW9uID0gaXNlYzsKLQotICAgICAgLyogRG9uJ3Qgb3V0cHV0IHRoZSBmaXJzdCwgdW5kZWZpbmVkLCBzeW1ib2wuICAqLwotICAgICAgaWYgKGVzeW0gPT0gZXh0ZXJuYWxfc3ltcykKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgdGhpcwotCSBvbmUuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIG91dHB1dCBzZWN0aW9uIHN5bWJvbHMuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIHNlY3Rpb24KLQkgc3ltYm9sIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIGFsbCBsb2NhbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvCi0JIG91dHB1dCB0aGlzIG9uZS4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dAotCSBmaWxlLCB0aGVuIHNvbWUgb2YgdGhlIGxvY2FsIHN5bWJvbHMgbWF5IGJlIHJlcXVpcmVkIGJ5Ci0JIHJlbG9jczsgd2Ugb3V0cHV0IHRoZW0gYmVsb3cgYXMgd2UgZGlzY292ZXIgdGhhdCB0aGV5IGFyZQotCSBuZWVkZWQuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aGljaCB3ZSBhcmUKLSAgICAgICAgIGRpc2NhcmRpbmcsIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBpdCwgYnV0IG5vdGUgdGhhdAotICAgICAgICAgbGlua2VyX21hcmsgaXMgb25seSByZWxpYWJsZSBmb3Igc2VjdGlvbnMgdGhhdCBoYXZlIGNvbnRlbnRzLgotICAgICAgICAgRm9yIHRoZSBiZW5lZml0IG9mIHRoZSBNSVBTIEVMRiBsaW5rZXIsIHdlIGNoZWNrIFNFQ19FWENMVURFCi0gICAgICAgICBhcyB3ZWxsIGFzIGxpbmtlcl9tYXJrLiAgKi8KLSAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA+IDAKLQkgICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRQotCSAgJiYgaXNlYyAhPSBOVUxMCi0JICAmJiAoKCEgaXNlYy0+bGlua2VyX21hcmsgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgICB8fCAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApKSkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJICAgICAgaXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2VlIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHN5bWJvbHMgd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAgPT0gTlVMTCkpCi0JICB8fCAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sCi0JICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgYXJlIGdvaW5nIHRvIG91dHB1dCB0aGlzIHN5bWJvbC4gICovCi0KLSAgICAgIG9zeW0gPSAqaXN5bTsKLQotICAgICAgLyogQWRqdXN0IHRoZSBzZWN0aW9uIGluZGV4IGZvciB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgb3N5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAob3V0cHV0X2JmZCwKLQkJCQkJCQkgaXNlYy0+b3V0cHV0X3NlY3Rpb24pOwotICAgICAgaWYgKG9zeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpwaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotICAgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQKLQkgaW4gZXhlY3V0YWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAotCSB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBFTEYgc2VjdGlvbnMgaGF2ZSBhbiBhc3NvY2lhdGVkCi0JIEJGRCBzZWN0aW9uIHdpdGggYSByZWFzb25hYmxlIHZhbHVlIGZvciBvdXRwdXRfb2Zmc2V0OyBiZWxvdwotCSB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFsc28gaGF2ZSBhIHJlYXNvbmFibGUgdmFsdWUgZm9yCi0JIG91dHB1dF9zZWN0aW9uLiAgQW55IHNwZWNpYWwgc2VjdGlvbnMgbXVzdCBiZSBzZXQgdXAgdG8gbWVldAotCSB0aGVzZSByZXF1aXJlbWVudHMuICAqLwotICAgICAgb3N5bS5zdF92YWx1ZSArPSBpc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQlvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCAmb3N5bSwgaXNlYykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgY29udGVudHMgb2YgZWFjaCBzZWN0aW9uLiAgKi8KLSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IChvLT5fcmF3X3NpemUgPT0gMCAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwKQotCXsKLQkgIC8qIFNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLQkgICAgIG9yIHNvbWVzdWNoLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4gIFRoZXkgaGF2ZSBiZWVuIGNhY2hlZCBieSBhCi0gICAgICAgICByZWxheGF0aW9uIHJvdXRpbmUuICBOb3RlIHRoYXQgbyBpcyBhIHNlY3Rpb24gaW4gYW4gaW5wdXQKLSAgICAgICAgIGZpbGUsIHNvIHRoZSBjb250ZW50cyBmaWVsZCB3aWxsIG5vdCBoYXZlIGJlZW4gc2V0IGJ5IGFueSBvZgotICAgICAgICAgdGhlIHJvdXRpbmVzIHdoaWNoIHdvcmsgb24gb3V0cHV0IGZpbGVzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQotCSAgLyogR2V0IHRoZSBzd2FwcGVkIHJlbG9jcy4gICovCi0JICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCQkJICAgICAgZmluZm8tPmludGVybmFsX3JlbG9jcywgZmFsc2UpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ID4gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBieSBpbnZva2luZyBhIGJhY2sgZW5kIHJvdXRpbmUuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlCi0JICAgICBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcwotCSAgICAgYW5kIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUKLQkgICAgIHJlbG9jIGFkZGVuZCBhcyBuZWNlc3NhcnkuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZwotCSAgICAgdGhlIHJlbG9jIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluCi0JICAgICBpbnRlcm5hbCBzeW1ib2xzLCBhbmQgY2FuIGFjY2VzcyB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzCi0JICAgICBmb3IgdGhlIGV4dGVybmFsIHN5bWJvbHMgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0JICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIGJhY2sgZW5kIHJvdXRpbmUKLQkgICAgIG11c3QgaGFuZGxlIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZQotCSAgICAgb3V0cHV0IHN5bWJvbCBpcyBnb2luZyB0byBiZSBhIHNlY3Rpb24gc3ltYm9sCi0JICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiwgd2hpY2ggd2lsbCByZXF1aXJlCi0JICAgICB0aGUgYWRkZW5kIHRvIGJlIGFkanVzdGVkLiAgKi8KLQotCSAgaWYgKCEgKCpyZWxvY2F0ZV9zZWN0aW9uKSAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJICAgICBpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAotCQkJCSAgICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJICAgICBmaW5mby0+c2VjdGlvbnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlIHx8IGZpbmZvLT5pbmZvLT5lbWl0cmVsb2NhdGlvbnMpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotCi0JICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgaXJlbGFlbmQgPSAKLQkJaXJlbGEgKyBvLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0JICAgICAgcmVsX2hhc2ggPSAoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQKLQkJCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDIpOwotCSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotCQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkJICBpcmVsYS0+cl9vZmZzZXQgKz0gby0+b3V0cHV0X29mZnNldDsKLQotCQkgIC8qIFJlbG9jcyBpbiBhbiBleGVjdXRhYmxlIGhhdmUgdG8gYmUgdmlydHVhbCBhZGRyZXNzZXMuICAqLwotCQkgIGlmIChmaW5mby0+aW5mby0+ZW1pdHJlbG9jYXRpb25zKQotCQkgICAgaXJlbGEtPnJfb2Zmc2V0ICs9IG8tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkJICByX3N5bW5keCA9IEVMRl9SX1NZTSAoaXJlbGEtPnJfaW5mbyk7Ci0KLQkJICBpZiAocl9zeW1uZHggPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKHJfc3ltbmR4ID49IGxvY3N5bWNvdW50Ci0JCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQotCQkJICAmJiBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdID09IE5VTEwpKQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmg7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wuICBXZQotCQkJIGhhdmUgbm90IHlldCBvdXRwdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLCBzbwotCQkJIHdlIGRvIG5vdCBrbm93IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IGdsb2JhbAotCQkJIHN5bWJvbC4gIFdlIHNldCB0aGUgcmVsX2hhc2ggZW50cnkgZm9yIHRoaXMKLQkJCSByZWxvYyB0byBwb2ludCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkKLQkJCSBmb3IgdGhpcyBzeW1ib2wuICBUaGUgc3ltYm9sIGluZGV4IGlzIHRoZW4KLQkJCSBzZXQgYXQgdGhlIGVuZCBvZiBlbGZfYmZkX2ZpbmFsX2xpbmsuICAqLwotCQkgICAgICBpbmR4ID0gcl9zeW1uZHggLSBleHRzeW1vZmY7Ci0JCSAgICAgIHJoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JCSAgICAgIHdoaWxlIChyaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJCSAgICAgfHwgcmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCQlyaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSByaC0+cm9vdC51LmkubGluazsKLQotCQkgICAgICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscwotCQkJIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdCB0aGlzIHN5bWJvbCBpcwotCQkJIHVzZWQgYnkgYSByZWxvYy4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKHJoLT5pbmR4IDwgMCk7Ci0JCSAgICAgIHJoLT5pbmR4ID0gLTI7Ci0KLQkJICAgICAgKnJlbF9oYXNoID0gcmg7Ci0KLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gKi8KLQotCQkgICpyZWxfaGFzaCA9IE5VTEw7Ci0JCSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0JCSAgc2VjID0gZmluZm8tPnNlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBpZiAoRUxGX1NUX1RZUEUgKGlzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQkgICAgewotCQkgICAgICAvKiBJIHN1cHBvc2UgdGhlIGJhY2tlbmQgb3VnaHQgdG8gZmlsbCBpbiB0aGUKLQkJCSBzZWN0aW9uIG9mIGFueSBTVFRfU0VDVElPTiBzeW1ib2wgYWdhaW5zdCBhCi0JCQkgcHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24uICBJZiB3ZSBoYXZlCi0JCQkgZGlzY2FyZGVkIGEgc2VjdGlvbiwgdGhlIG91dHB1dF9zZWN0aW9uIHdpbGwKLQkJCSBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0JCSAgICAgIGlmIChzZWMgIT0gTlVMTAotCQkJICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCQkgICAgICB8fCAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYy0+b3V0cHV0X3NlY3Rpb24pKSkpCi0JCQlyX3N5bW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX3N5bW5keCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCSAgQkZEX0FTU0VSVCAocl9zeW1uZHggIT0gMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID09IC0xKQotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGxpbms7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFlvdSBjYW4ndCBkbyBsZCAtciAtcy4gICovCi0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQotCQkJICAvKiBUaGlzIHN5bWJvbCB3YXMgc2tpcHBlZCBlYXJsaWVyLCBidXQKLQkJCSAgICAgc2luY2UgaXQgaXMgbmVlZGVkIGJ5IGEgcmVsb2MsIHdlCi0JCQkgICAgIG11c3Qgb3V0cHV0IGl0IG5vdy4gICovCi0JCQkgIGxpbmsgPSBzeW10YWJfaGRyLT5zaF9saW5rOwotCQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCQkgIGxpbmssCi0JCQkJCQkJCSAgaXN5bS0+c3RfbmFtZSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpc3ltLT5zdF9zaG5keCA9Ci0JCQkgICAgX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgICBvc2VjKTsKLQkJCSAgaWYgKGlzeW0tPnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlzeW0tPnN0X3ZhbHVlICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLQkJCSAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkJCSAgICBpc3ltLT5zdF92YWx1ZSArPSBvc2VjLT52bWE7Ci0KLQkJCSAgZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLQkJCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGlzeW0sIHNlYykpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCSAgICAgIHJfc3ltbmR4ID0gZmluZm8tPmluZGljZXNbcl9zeW1uZHhdOwotCQkgICAgfQotCi0JCSAgaXJlbGEtPnJfaW5mbyA9IEVMRl9SX0lORk8gKHJfc3ltbmR4LAotCQkJCQkgICAgICBFTEZfUl9UWVBFIChpcmVsYS0+cl9pbmZvKSk7Ci0JCX0KLQotCSAgICAgIC8qIFN3YXAgb3V0IHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7Ci0JICAgICAgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcyAob3V0cHV0X2JmZCwgbywgCi0JCQkJICAgICAgaW5wdXRfcmVsX2hkciwKLQkJCQkgICAgICBpbnRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGludGVybmFsX3JlbG9jcyAKLQkJKz0gaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSAvIGlucHV0X3JlbF9oZHItPnNoX2VudHNpemU7Ci0JICAgICAgaW5wdXRfcmVsX2hkciA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMjsKLQkgICAgICBpZiAoaW5wdXRfcmVsX2hkcikKLQkJZWxmX2xpbmtfb3V0cHV0X3JlbG9jcyAob3V0cHV0X2JmZCwgbywgCi0JCQkJCWlucHV0X3JlbF9oZHIsCi0JCQkJCWludGVybmFsX3JlbG9jcyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbW9kaWZpZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbyA9PSBOVUxMKQotCXsKLQkgIGlmICghIChvLT5mbGFncyAmIFNFQ19FWENMVURFKSAmJgotCSAgICAgICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0JCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbywgY29udGVudHMpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2Mgd2hlbiBsaW5raW5nIGFuIEVMRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgbG9uZyBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICByZWxfaGFzaF9wdHIgPSAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudAotCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQyKTsKLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBpbmR4ID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIEJGRF9BU1NFUlQgKGluZHggIT0gMCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIHNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmR4ID0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCSAgLyogSXQgc2VlbXMgdGhhdCB3ZSBvdWdodCB0byBhZGQgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKLSAgICAgICAgICAgICBhZGRlbmQgaGVyZSwgYnV0IGluIHByYWN0aWNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAgICAgICAgICAgICBiZWNhdXNlIGl0IHdhcyBwYXNzZWQgdG8gY29uc3RydWN0b3JfY2FsbGJhY2suICAqLwotCSAgYWRkZW5kICs9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscyBlbGZfbGlua19vdXRwdXRfZXh0c3ltIHRoYXQKLQkgICAgIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICAqcmVsX2hhc2hfcHRyID0gaDsKLQkgIGluZHggPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5keCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdlIG11c3Qgd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlICYmIGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChpbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJICAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiBpbiBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYW4gZXhlY3V0YWJsZQotICAgICBmaWxlLiAgKi8KLSAgb2Zmc2V0ID0gbGlua19vcmRlci0+b2Zmc2V0OwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgb2Zmc2V0ICs9IG91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0KLSAgaWYgKHJlbF9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCi0gICAgICBpcmVsLnJfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudCk7Ci0gICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgaXJlbGEucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBpcmVsYS5yX2FkZGVuZCA9IGFkZGVuZDsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cwotCSAgICAgICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICArK2VsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gbGl2ZSBpbiBhIGxpbmtlciBjcmVhdGVkIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1lbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIGxzZWN0LCBoLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IE5VTEw7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTs7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgLyogSXMgdGhpcyBhIGdsb2JhbCBzeW1ib2w/ICovCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlcjsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uKQotCWxzZWN0LT5yZWxfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpOwotICAgIH0KLQotICBlbHNlICAvKiBBbGxvY2F0aW9uIG9mIGEgcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyID0gZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKTsKLQotICAgICAgLyogQWxsb2NhdGUgYSB0YWJsZSB0byBob2xkIHRoZSBsb2NhbCBzeW1ib2xzIGlmIGZpcnN0IHRpbWUgKi8KLSAgICAgIGlmICghcHRyKQotCXsKLQkgIHVuc2lnbmVkIGludCBudW1fc3ltYm9scyA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JICBwdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKiopCi0JICAgIGJmZF9hbGxvYyAoYWJmZCwgbnVtX3N5bWJvbHMgKiBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopKTsKLQotCSAgaWYgKCFwdHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKSA9IHB0cjsKLQkgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgaSsrKQotCSAgICBwdHJbaV0gPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikwOwotCX0KLQotICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCi0gICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChwdHJbcl9zeW1uZHhdLAotCQkJCQkJcmVsLT5yX2FkZGVuZCwKLQkJCQkJCWxzZWN0LT53aGljaCkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmcHRyW3Jfc3ltbmR4XTsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkgICAgIG91dHB1dCBhIFJfPHh4eD5fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLQkgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCSAgQkZEX0FTU0VSVCAobHNlY3QtPnJlbF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7Ci0JfQotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb2ludGVyIGluIHRoZSBsaW5rZXIgc2VjdGlvbiwgYW5kIGFsbG9jYXRlIGEgbmV3IHBvaW50ZXIgcmVjb3JkCi0gICAgIGZyb20gaW50ZXJuYWwgbWVtb3J5LiAgKi8KLSAgQkZEX0FTU0VSVCAocHRyX2xpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLSAgbGlua2VyX3NlY3Rpb25fcHRyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190KSk7Ci0KLSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+bmV4dCA9ICpwdHJfbGlua2VyX3NlY3Rpb25fcHRyOwotICBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d2hpY2ggPSBsc2VjdC0+d2hpY2g7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSBmYWxzZTsKLSAgKnB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSBsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSNpZiAwCi0gIGlmIChsc2VjdC0+aG9sZV9zaXplICYmIGxzZWN0LT5ob2xlX29mZnNldCA8IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCi0gICAgewotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIChBUkNIX1NJWkUgLyA4KTsKLSAgICAgIGxzZWN0LT5ob2xlX29mZnNldCArPSBBUkNIX1NJWkUgLyA4OwotICAgICAgbHNlY3QtPnN5bV9vZmZzZXQgICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgICBpZiAobHNlY3QtPnN5bV9oYXNoKQkvKiBCdW1wIHVwIHN5bWJvbCB2YWx1ZSBpZiBuZWVkZWQgKi8KLQl7Ci0JICBsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUgKz0gQVJDSF9TSVpFIC8gODsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQnVtcCB1cCAlcyBieSAlbGQsIGN1cnJlbnQgdmFsdWUgPSAlbGRcbiIsCi0JCSAgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgKGxvbmcpQVJDSF9TSVpFIC8gOCwKLQkJICAgKGxvbmcpbHNlY3QtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0ID0gbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZTsKLQotICBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplICs9IEFSQ0hfU0laRSAvIDg7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGUgcG9pbnRlciBpbiBsaW5rZXIgc2VjdGlvbiAlcywgb2Zmc2V0ID0gJWxkLCBzZWN0aW9uIHNpemUgPSAlbGRcbiIsCi0JICAgbHNlY3QtPm5hbWUsIChsb25nKWxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0LCAobG9uZylsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfNjQgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0jaWYgQVJDSF9TSVpFPT0zMgotI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfMzIgKEJGRCwgVkFMLCBBRERSKQotI2VuZGlmCi0KLS8qIEZpbGwgaW4gdGhlIGFkZHJlc3MgZm9yIGEgcG9pbnRlciBnZW5lcmF0ZWQgaW4gYWxpbmtlciBzZWN0aW9uLiAgKi8KLQotYmZkX3ZtYQotZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIGxzZWN0LCBoLCByZWxvY2F0aW9uLCByZWwsIHJlbGF0aXZlX3JlbG9jKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBpbnQgcmVsYXRpdmVfcmVsb2M7Ci17Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7Ci0KLSAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7Ci0KLSAgaWYgKGggIT0gTlVMTCkJCS8qIGdsb2JhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQkJCSByZWwtPnJfYWRkZW5kLAotCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKLQotICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIGluZm8tPnN5bWJvbGljCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JewotCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQotCSAgICAgZ2xvYmFsIHNlY3Rpb24uCi0KLQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLjx4eHg+Ci0JICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQotCSAgICB7Ci0JICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKLQkJCSAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQkJCQkvKiBsb2NhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZCkgIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdICE9IE5VTEwpOwotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyID0gX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdLAotCQkJCQkJCQkgcmVsLT5yX2FkZGVuZCwKLQkJCQkJCQkJIGxzZWN0LT53aGljaCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGxpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLQotICAgICAgLyogV3JpdGUgb3V0IHBvaW50ZXIgaWYgaXQgaGFzbid0IGJlZW4gcmV3cml0dGVuIG91dCBiZWZvcmUgKi8KLSAgICAgIGlmICghbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCkKLQl7Ci0JICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKLQkgIGJmZF9wdXRfcHRyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQsCi0JCSAgICAgICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc3JlbCA9IGxzZWN0LT5yZWxfc2VjdGlvbjsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsYXRpdmUgcmVsb2MgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICAgICAgaWYgKCFzcmVsKQotCQlsc2VjdC0+cmVsX3NlY3Rpb24gPSBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkJCQkgICAgIGxzZWN0LT5yZWxfbmFtZSk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgbHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0JICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKDAsIHJlbGF0aXZlX3JlbG9jKTsKLQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgKCgoRWxmX0V4dGVybmFsX1JlbGEgKikKLQkJCQkgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cykKLQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChsc2VjdC0+c2VjdGlvbiktPnJlbF9jb3VudCkpOwotCSAgICAgICsrZWxmX3NlY3Rpb25fZGF0YSAobHNlY3QtPnNlY3Rpb24pLT5yZWxfY291bnQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldAotCQktIGxzZWN0LT5ob2xlX29mZnNldAotCQktIGxzZWN0LT5zeW1fb2Zmc2V0KTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkZpbmlzaCBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQgKDB4JWx4KVxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpcmVsb2NhdGlvbiwgKGxvbmcpcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQotICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGFkZGVuZCwgYmVjYXVzZSBpdCB3aWxsIGdldCBhZGRlZCBiYWNrIGluIGJ5IHRoZSBub3JtYWwKLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIHJldHVybiByZWxvY2F0aW9uIC0gbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQ7Ci19Ci0MCi0vKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX21hcmsKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpzZWMsCi0JICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc3dlZXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCi0JICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBpZHhwdHIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgb2ZmYXJnKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBkdW1teSkpOwotCi0vKiBUaGUgbWFyayBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBGb3IgYSBnaXZlbiBzZWN0aW9uLCBtYXJrCi0gICBpdCwgYW5kIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggZGVmaW5lIHN5bWJvbHMgdG8gd2hpY2ggaXQgcmVmZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19tYXJrIChpbmZvLCBzZWMsIGdjX21hcmtfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgc2VjLT5nY19tYXJrID0gMTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsLCAqcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gICAgICBzaXplX3QgbmxvY3N5bXM7Ci0gICAgICBzaXplX3QgZXh0c3ltb2ZmOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqbG9jc3ltcywgKmZyZWVzeW1zID0gTlVMTDsKLSAgICAgIGJmZCAqaW5wdXRfYmZkID0gc2VjLT5vd25lcjsKLSAgICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogR0NGSVhNRTogaG93IHRvIGFycmFuZ2Ugc28gdGhhdCByZWxvY3MgYW5kIHN5bWJvbHMgYXJlIG5vdAotCSByZXJlYWQgY29udGludWFsbHk/ICAqLwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgbmxvY3N5bXMgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgICAgICBleHRzeW1vZmYgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlleHRzeW1vZmYgPSBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMpCi0JbG9jc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZSBpZiAobmxvY3N5bXMgPT0gMCkKLQlsb2NzeW1zID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb2NzeW1zID0gZnJlZXN5bXMgPQotCSAgICBiZmRfbWFsbG9jIChubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotCSAgaWYgKGZyZWVzeW1zID09IE5VTEwKLQkgICAgICB8fCBiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsb2NzeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIG5sb2NzeW1zLCBpbnB1dF9iZmQpCi0JCSAgIT0gbmxvY3N5bXMgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQkgICAgewotCSAgICAgIHJldCA9IGZhbHNlOwotCSAgICAgIGdvdG8gb3V0MTsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgaWYgKHJlbHN0YXJ0ID09IE5VTEwpCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICBnb3RvIG91dDE7Ci0JfQotICAgICAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICAgICAgZm9yIChyZWwgPSByZWxzdGFydDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCSAgYXNlY3Rpb24gKnJzZWM7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gczsKLQotCSAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICBpZiAoRUxGX1NUX0JJTkQgKHMuc3RfaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgICBlbHNlCi0JCXsKLQkgICAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCSAgICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl9zeW1uZHggPj0gbmxvY3N5bXMpCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIGgsIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmxvY3N5bXNbcl9zeW1uZHhdLCAmcyk7Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgfQotCi0JICBpZiAocnNlYyAmJiAhcnNlYy0+Z2NfbWFyaykKLQkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgcnNlYywgZ2NfbWFya19ob29rKSkKLQkgICAgICB7Ci0JCXJldCA9IGZhbHNlOwotCQlnb3RvIG91dDI7Ci0JICAgICAgfQotCX0KLQotICAgIG91dDI6Ci0gICAgICBpZiAoIWluZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKHJlbHN0YXJ0KTsKLSAgICBvdXQxOgotICAgICAgaWYgKGZyZWVzeW1zKQotCWZyZWUgKGZyZWVzeW1zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZSBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc3dlZXAgKGluZm8sIGdjX3N3ZWVwX2hvb2spCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIC8qIEtlZXAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zLiAgKi8KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpCi0JICAgICAgfHwgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykpCi0JICAgIG8tPmdjX21hcmsgPSAxOwotCi0JICBpZiAoby0+Z2NfbWFyaykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNraXAgc3dlZXBpbmcgc2VjdGlvbnMgYWxyZWFkeSBleGNsdWRlZC4gICovCi0JICBpZiAoby0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNpbmNlIHRoaXMgaXMgZWFybHkgaW4gdGhlIGxpbmsgcHJvY2VzcywgaXQgaXMgc2ltcGxlCi0JICAgICB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gdGhlIG91dHB1dC4gICovCi0JICBvLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotCSAgLyogQnV0IHdlIGFsc28gaGF2ZSB0byB1cGRhdGUgc29tZSBvZiB0aGUgcmVsb2NhdGlvbgotCSAgICAgaW5mbyB3ZSBjb2xsZWN0ZWQgYmVmb3JlLiAgKi8KLQkgIGlmIChnY19zd2VlcF9ob29rCi0JICAgICAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGJvb2xlYW4gcjsKLQotCSAgICAgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkJIChvLT5vd25lciwgbywgTlVMTCwgTlVMTCwgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHIgPSAoKmdjX3N3ZWVwX2hvb2spKG8tPm93bmVyLCBpbmZvLCBvLCBpbnRlcm5hbF9yZWxvY3MpOwotCi0JICAgICAgaWYgKCFpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghcikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBSZW1vdmUgdGhlIHN5bWJvbHMgdGhhdCB3ZXJlIGluIHRoZSBzd2VwdCBzZWN0aW9ucyBmcm9tIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIEdDRklYTUU6IEFueW9uZSBrbm93IGhvdyB0byBnZXQgdGhlbSBvdXQgb2YgdGhlCi0gICAgIHN0YXRpYyBzeW1ib2wgdGFibGUgYXMgd2VsbD8gICovCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgZWxmX2djX3N3ZWVwX3N5bWJvbCwKLQkJCSAgICAoUFRSKSAmaSk7Ci0KLSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gaTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2VlcCBzeW1ib2xzIGluIHN3ZXB0IHNlY3Rpb25zLiAgQ2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcF9zeW1ib2wgKGgsIGlkeHB0cikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZHhwdHI7Ci17Ci0gIGludCAqaWR4ID0gKGludCAqKSBpZHhwdHI7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICYmICgoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICB8fCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPmdjX21hcmspKQotICAgIGgtPmR5bmluZHggPSAoKmlkeCkrKzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJvcG9nYXRlIGNvbGxlY3RlZCB2dGFibGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGNhbGxlZCB0aHJvdWdoCi0gICBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgLyogVGhvc2UgdGhhdCBhcmUgbm90IHZ0YWJsZXMuICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhvc2UgdnRhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMsIHdlIGNhbm5vdCBtZXJnZS4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZG9uZSwgZXhpdC4gICovCi0gIGlmIChoLT52dGFibGVfZW50cmllc191c2VkICYmIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbLTFdKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcGFyZW50J3MgdGFibGUgaXMgdXAgdG8gZGF0ZS4gICovCi0gIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaC0+dnRhYmxlX3BhcmVudCwgb2twKTsKLQotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vbmUgb2YgdGhpcyB0YWJsZSdzIGVudHJpZXMgd2VyZSByZWZlcmVuY2VkLiAgUmUtdXNlIHRoZQotCSBwYXJlbnQncyB0YWJsZS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBuOwotICAgICAgYm9vbGVhbiAqY3UsICpwdTsKLQotICAgICAgLyogT3IgdGhlIHBhcmVudCdzIGVudHJpZXMgaW50byBvdXJzLiAgKi8KLSAgICAgIGN1ID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGN1Wy0xXSA9IHRydWU7Ci0gICAgICBwdSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBpZiAocHUgIT0gTlVMTCkKLQl7Ci0JICBuID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZSAvIEZJTEVfQUxJR047Ci0JICB3aGlsZSAoLS1uICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnB1KSAqY3UgPSB0cnVlOwotCSAgICAgIHB1KyssIGN1Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBoc3RhcnQsIGhlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxzdGFydCwgKnJlbGVuZCwgKnJlbDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICAvKiBUYWtlIGNhcmUgb2YgYm90aCB0aG9zZSBzeW1ib2xzIHRoYXQgZG8gbm90IGRlc2NyaWJlIHZ0YWJsZXMgYXMKLSAgICAgd2VsbCBhcyB0aG9zZSB0aGF0IGFyZSBub3QgbG9hZGVkLiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0KLSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICBoc3RhcnQgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICBoZW5kID0gaHN0YXJ0ICsgaC0+c2l6ZTsKLQotICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JICAgICAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIHRydWUpKTsKLSAgaWYgKCFyZWxzdGFydCkKLSAgICByZXR1cm4gKihib29sZWFuICopb2twID0gZmFsc2U7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChzZWMtPm93bmVyKTsKLSAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IGhzdGFydCAmJiByZWwtPnJfb2Zmc2V0IDwgaGVuZCkKLSAgICAgIHsKLQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdXNlLCBkbyBub3RoaW5nLiAgKi8KLQlpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZAotCSAgICAmJiAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgPCBoLT52dGFibGVfZW50cmllc19zaXplKQotCSAgewotCSAgICBiZmRfdm1hIGVudHJ5ID0gKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIC8gRklMRV9BTElHTjsKLQkgICAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbZW50cnldKQotCSAgICAgIGNvbnRpbnVlOwotCSAgfQotCS8qIE90aGVyd2lzZSwga2lsbCBpdC4gICovCi0JcmVsLT5yX29mZnNldCA9IHJlbC0+cl9pbmZvID0gcmVsLT5yX2FkZGVuZCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIG1hcmsgYW5kIHN3ZWVwIG9mIHVudXNlZCBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiBvayA9IHRydWU7Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLSAgICAgICAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgaWYgKCFnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNhbl9nY19zZWN0aW9ucwotICAgICAgfHwgaW5mby0+cmVsb2NhdGVhYmxlIHx8IGluZm8tPmVtaXRyZWxvY2F0aW9ucwotICAgICAgfHwgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXBwbHkgdHJhbnNpdGl2ZSBjbG9zdXJlIHRvIHRoZSB2dGFibGUgZW50cnkgdXNhZ2UgaW5mby4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBLaWxsIHRoZSB2dGFibGUgcmVsb2NhdGlvbnMgdGhhdCB3ZXJlIG5vdCB1c2VkLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHcm92ZWwgdGhyb3VnaCByZWxvY3MgdG8gZmluZCBvdXQgd2hvIHN0YXlzIC4uLiAgKi8KLQotICBnY19tYXJrX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX21hcmtfaG9vazsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQljb250aW51ZTsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoby0+ZmxhZ3MgJiBTRUNfS0VFUCkKLSAgCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCBvLCBnY19tYXJrX2hvb2spKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIC4uLiBhbmQgbWFyayBTRUNfRVhDTFVERSBmb3IgdGhvc2UgdGhhdCBnby4gICovCi0gIGlmICghZWxmX2djX3N3ZWVwKGluZm8sIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Z2Nfc3dlZXBfaG9vaykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQ2FsbGVkIGZyb20gY2hlY2tfcmVsb2NzIHRvIHJlY29yZCB0aGUgZXhpc3RhbmNlIG9mIGEgVlRJTkhFUklUIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnNlYXJjaCwgKmNoaWxkOwotICBiZmRfc2l6ZV90eXBlIGV4dHN5bWNvdW50OwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scyBhdAotICAgICB0aGlzIHBvaW50LiAgKi8KLSAgZXh0c3ltY291bnQgPSBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX3NpemUvc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgZXh0c3ltY291bnQgLT0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCi0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIGV4dHN5bWNvdW50OwotCi0gIC8qIEh1bnQgZG93biB0aGUgY2hpbGQgc3ltYm9sLCB3aGljaCBpcyBpbiB0aGlzIHNlY3Rpb24gYXQgdGhlIHNhbWUKLSAgICAgb2Zmc2V0IGFzIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWFyY2ggPSBzeW1faGFzaGVzOyBzZWFyY2ggIT0gc3ltX2hhc2hlc19lbmQ7ICsrc2VhcmNoKQotICAgIHsKLSAgICAgIGlmICgoY2hpbGQgPSAqc2VhcmNoKSAhPSBOVUxMCi0JICAmJiAoY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBjaGlsZC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIGNoaWxkLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiBjaGlsZC0+cm9vdC51LmRlZi52YWx1ZSA9PSBvZmZzZXQpCi0JZ290byB3aW47Ci0gICAgfQotCi0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAlcyslbHU6IE5vIHN5bWJvbCBmb3VuZCBmb3IgSU5IRVJJVCIsCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNlYy0+bmFtZSwKLQkJCSAodW5zaWduZWQgbG9uZylvZmZzZXQpOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLXdpbjoKLSAgaWYgKCFoKQotICAgIHsKLSAgICAgIC8qIFRoaXMgKnNob3VsZCogb25seSBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gIEl0IGNvdWxkIHBvdGVudGlhbGx5Ci0JIGJlIHRoYXQgc29tZW9uZSBoYXMgZGVmaW5lZCBhIG5vbi1nbG9iYWwgdnRhYmxlIHRob3VnaCwgd2hpY2gKLQkgd291bGQgYmUgYmFkLiAgSXQgaXNuJ3Qgd29ydGggcGFnaW5nIGluIHRoZSBsb2NhbCBzeW1ib2xzIHRvIGJlCi0JIHN1cmUgdGhvdWdoOyB0aGF0IGNhc2Ugc2hvdWxkIHNpbXBseSBiZSBoYW5kbGVkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0gICAgICBjaGlsZC0+dnRhYmxlX3BhcmVudCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBjaGlsZC0+dnRhYmxlX3BhcmVudCA9IGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZURU5UUlkgcmVsb2MuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgYWRkZW5kKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGlmIChhZGRlbmQgPj0gaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZSwgYnl0ZXM7Ci0gICAgICBib29sZWFuICpwdHIgPSBoLT52dGFibGVfZW50cmllc191c2VkOwotCi0gICAgICAvKiBXaGlsZSB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBoYW5kbGUKLQkgYSB6ZXJvIHNpemUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQlzaXplID0gYWRkZW5kOwotICAgICAgZWxzZQotCXsKLQkgIHNpemUgPSBoLT5zaXplOwotCSAgaWYgKHNpemUgPCBhZGRlbmQpCi0JICAgIHsKLQkgICAgICAvKiBPb3BzISAgV2UndmUgZ290IGEgcmVmZXJlbmNlIHBhc3QgdGhlIGRlZmluZWQgZW5kIG9mCi0JCSB0aGUgdGFibGUuICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIC0tIHNoYWxsIHdlIHdhcm4/ICAqLwotCSAgICAgIHNpemUgPSBhZGRlbmQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG9uZSBleHRyYSBlbnRyeSBmb3IgdXNlIGFzIGEgImRvbmUiIGZsYWcgZm9yIHRoZQotCSBjb25zb2xpZGF0aW9uIHBhc3MuICAqLwotICAgICAgYnl0ZXMgPSAoc2l6ZSAvIEZJTEVfQUxJR04gKyAxKSAqIHNpemVvZiAoYm9vbGVhbik7Ci0KLSAgICAgIGlmIChwdHIpCi0JewotCSAgcHRyID0gYmZkX3JlYWxsb2MgKHB0ciAtIDEsIGJ5dGVzKTsKLQkgIAotCSAgaWYgKHB0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IG9sZGJ5dGVzOwotCi0JICAgICAgb2xkYnl0ZXMgPSAoaC0+dnRhYmxlX2VudHJpZXNfc2l6ZS9GSUxFX0FMSUdOICsgMSkgKiBzaXplb2YgKGJvb2xlYW4pOwotCSAgICAgIG1lbXNldCAoKChjaGFyICopcHRyKSArIG9sZGJ5dGVzLCAwLCBieXRlcyAtIG9sZGJ5dGVzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlwdHIgPSBiZmRfem1hbGxvYyAoYnl0ZXMpOwotCi0gICAgICBpZiAocHRyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBBbmQgYXJyYW5nZSBmb3IgdGhhdCBkb25lIGZsYWcgdG8gYmUgYXQgaW5kZXggLTEuICAqLwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IHB0ciArIDE7Ci0gICAgICBoLT52dGFibGVfZW50cmllc19zaXplID0gc2l6ZTsKLSAgICB9Ci0gIAotICBoLT52dGFibGVfZW50cmllc191c2VkW2FkZGVuZCAvIEZJTEVfQUxJR05dID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQW5kIGFuIGFjY29tcGFueWluZyBiaXQgdG8gd29yayBvdXQgZmluYWwgZ290IGVudHJ5IG9mZnNldHMgb25jZQotICAgd2UncmUgZG9uZS4gIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBmaW5hbF9saW5rLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBiZmRfdm1hIGdvdG9mZjsKLQotICAvKiBUaGUgR09UIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgLmdvdCBzZWN0aW9uLCBidXQgdGhlIEdPVCBoZWFkZXIgaXMKLSAgICAgcHV0IGludG8gdGhlIC5nb3QucGx0IHNlY3Rpb24sIGlmIHRoZSBiYWNrZW5kIHVzZXMgaXQuICAqLwotICBpZiAoYmVkLT53YW50X2dvdF9wbHQpCi0gICAgZ290b2ZmID0gMDsKLSAgZWxzZQotICAgIGdvdG9mZiA9IGJlZC0+Z290X2hlYWRlcl9zaXplOwotCi0gIC8qIERvIHRoZSBsb2NhbCAuZ290IGVudHJpZXMgZmlyc3QuICAqLwotICBmb3IgKGkgPSBpbmZvLT5pbnB1dF9iZmRzOyBpOyBpID0gaS0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3Q7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGosIGxvY3N5bWNvdW50OwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGkpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JY29udGludWU7Ci0KLSAgICAgIGxvY2FsX2dvdCA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChpKTsKLSAgICAgIGlmICghbG9jYWxfZ290KQotCWNvbnRpbnVlOwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaSktPnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGkpKQotCWxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBlbHNlCi0JbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbG9jc3ltY291bnQ7ICsraikKLQl7Ci0JICBpZiAobG9jYWxfZ290W2pdID4gMCkKLQkgICAgewotCSAgICAgIGxvY2FsX2dvdFtqXSA9IGdvdG9mZjsKLQkgICAgICBnb3RvZmYgKz0gQVJDSF9TSVpFIC8gODsKLQkgICAgfQotCSAgZWxzZQotCSAgICBsb2NhbF9nb3Rbal0gPSAoYmZkX3ZtYSkgLTE7Ci0JfQotICAgIH0KLQotICAvKiBUaGVuIHRoZSBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgLnBsdCByZWZjb3VudHMgYXJlIGhhbmRsZWQgYnkKLSAgICAgYWRqdXN0X2R5bmFtaWNfc3ltYm9sICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywKLQkJCSAgKFBUUikgJmdvdG9mZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCB0b3AtbGV2ZWwgbGluayByb3V0aW5lIHRvIGNvbnZlcnQgZ290IHJlZmVyZW5jZSBjb3VudHMKLSAgIHRvIHJlYWwgZ290IG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzIChoLCBvZmZhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2ZmYXJnOwotewotICBiZmRfdm1hICpvZmYgPSAoYmZkX3ZtYSAqKSBvZmZhcmc7Ci0KLSAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0gICAgewotICAgICAgaC0+Z290Lm9mZnNldCA9IG9mZlswXTsKLSAgICAgIG9mZlswXSArPSBBUkNIX1NJWkUgLyA4OwotICAgIH0KLSAgZWxzZQotICAgIGgtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbnkgZm9sayBuZWVkIG5vIG1vcmUgaW4gdGhlIHdheSBvZiBmaW5hbCBsaW5rIHRoYW4gdGhpcywgb25jZQotICAgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudGluZyBpcyBlbmFibGVkLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoIWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHVybiBlbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRob3VnaCBlbGZfbGlua19oYXNoX3RyYXZlcnNlIHRvIHN0b3JlCi0gICBhbGwgaGFzaCB2YWx1ZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9scyBpbiBhbiBhcnJheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfY29sbGVjdF9oYXNoX2NvZGVzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgKip2YWx1ZXAgPSAodW5zaWduZWQgbG9uZyAqKikgZGF0YTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgbG9uZyBoYTsKLSAgY2hhciAqYWxjID0gTlVMTDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhbGMgPSBiZmRfbWFsbG9jIChwIC0gbmFtZSArIDEpOwotICAgICAgbWVtY3B5IChhbGMsIG5hbWUsIHAgLSBuYW1lKTsKLSAgICAgIGFsY1twIC0gbmFtZV0gPSAnXDAnOwotICAgICAgbmFtZSA9IGFsYzsKLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZS4gICovCi0gIGhhID0gYmZkX2VsZl9oYXNoIChuYW1lKTsKLQotICAvKiBTdG9yZSB0aGUgZm91bmQgaGFzaCB2YWx1ZSBpbiB0aGUgYXJyYXkgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LiAgKi8KLSAgKigqdmFsdWVwKSsrID0gaGE7Ci0KLSAgLyogQW5kIHN0b3JlIGl0IGluIHRoZSBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBoYXNoIHRhYmxlCi0gICAgIGxhdGVyLiAgKi8KLSAgaC0+ZWxmX2hhc2hfdmFsdWUgPSBoYTsKLQotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZ4eC10YXJnZXQuaCBiL2JmZC9lbGZ4eC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNDg2Ny4uMDAwMDAwMAotLS0gYS9iZmQvZWxmeHgtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciBOTi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0jZGVmaW5lCWJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX3JlbG9jCV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2lmbmRlZiBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX3JlYWRfbWluaXN5bWJvbHMJX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9saW5lbm8JCV9iZmRfZWxmX2dldF9saW5lbm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltYm9sX2luZm8JX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiCQlfYmZkX2VsZl9nZXRfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNpZiAwIC8qIGRvbmUgaW4gZWxmLWJmZC5oICovCi0jZGVmaW5lIGJmZF9lbGZOTl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9tYWtlX2VtcHR5X3N5bWJvbAlfYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fbmV3X3NlY3Rpb25faG9vawlfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfYXJjaF9tYWNoCQlfYmZkX2VsZl9zZXRfYXJjaF9tYWNoCi0jaWZuZGVmIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fc2l6ZW9mX2hlYWRlcnMJX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCAoYmZkX3ZtYSkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgMgotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzIDEKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19zdGFydAliZmRfdm9pZAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2RlYnVnX2luZm9fZW5kCWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCShQUk9UTyh2b2lkLCgqKSwoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucyBfYmZkX2VsZk5OX2djX3NlY3Rpb25zCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLSNpZmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0vKiBJZiBubyBiYWNrZW5kIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZSwgdXNlIHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9maW5hbF9saW5rCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZW5kaWYKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9hcmNoaXZlX3AKLSNkZWZpbmUgYmZkX2VsZk5OX2FyY2hpdmVfcCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rb2JqZWN0Ci0jZGVmaW5lIGJmZF9lbGZOTl9ta29iamVjdCBiZmRfZWxmX21rb2JqZWN0Ci0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtjb3JlZmlsZQotI2RlZmluZSBiZmRfZWxmTk5fbWtjb3JlZmlsZSBiZmRfZWxmX21rY29yZWZpbGUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2FyY2hpdmUKLSNkZWZpbmUgYmZkX2VsZk5OX21rYXJjaGl2ZSBfYmZkX2dlbmVyaWNfbWthcmNoaXZlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQVhQQUdFU0laRQotICAjZXJyb3IgRUxGX01BWFBBR0VTSVpFIGlzIG5vdCBkZWZpbmVkCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9jb2xsZWN0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QgZmFsc2UKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vawotI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayBmYWxzZQotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbAotI2RlZmluZSBlbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsCQlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcwotI2RlZmluZSBlbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zCQlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY29weV9pbmRpcmVjdF9zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29weV9pbmRpcmVjdF9zeW1ib2wgIF9iZmRfZWxmX2xpbmtfaGFzaF9jb3B5X2luZGlyZWN0Ci0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfaGlkZV9zeW1ib2wJCV9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbAotI2VuZGlmCi0KLQotLyogUHJldmlvdXNseSwgYmFja2VuZHMgY291bGQgb25seSB1c2UgU0hUX1JFTCBvciBTSFRfUkVMQSByZWxvY2F0aW9uCi0gICBzZWN0aW9ucywgYnV0IG5vdCBib3RoLiAgVGhleSBkZWZpbmVkIFVTRV9SRUwgdG8gaW5kaWNhdGUgU0hUX1JFTAotICAgc2VjdGlvbnMsIGFuZCBsZWZ0IGl0IHVuZGVmaW5lZCB0byBpbmRpY2F0ZWQgU0hUX1JFTEEgc2VjdGlvbnMuCi0gICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHN0aWxsIHN1cHBvcnQgdGhpcyB1c2FnZS4gICovCi0jaWZuZGVmIFVTRV9SRUwKLSNkZWZpbmUgVVNFX1JFTCAwCi0jZWxzZQotI3VuZGVmIFVTRV9SRUwKLSNkZWZpbmUgVVNFX1JFTCAxCi0jZW5kaWYgCi0KLS8qIFVzZSB0aGVzZSBpbiBuZXcgY29kZS4gICovCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgVVNFX1JFTAotI2VuZGlmIAotI2lmbmRlZiBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcAotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCAhVVNFX1JFTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wICFVU0VfUkVMCi0jZW5kaWYKLQotI2lmbmRlZiBFTEZfTUFDSElORV9BTFQxCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BQ0hJTkVfQUxUMgotI2RlZmluZSBFTEZfTUFDSElORV9BTFQyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfaW5mbwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8gX2JmZF9lbGZOTl9zaXplX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYQotI2RlZmluZSBlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEgMAotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbzsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhIGVsZk5OX2JlZCA9Ci17Ci0gIEVMRl9BUkNILAkJCS8qIGFyY2ggKi8KLSAgRUxGX01BQ0hJTkVfQ09ERSwJCS8qIGVsZl9tYWNoaW5lX2NvZGUgKi8KLSAgRUxGX01BWFBBR0VTSVpFLAkJLyogbWF4cGFnZXNpemUgKi8KLSAgZWxmX2luZm9fdG9faG93dG8sCi0gIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKLSAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKLSAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkciwKLSAgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLAotICBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLAotICBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzLAotICBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzLAotICBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAsCi0gIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vaywKLSAgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vaywKLSAgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwsCi0gIGVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMsCi0gIGVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sLAotICBlbGZfYmFja2VuZF9oaWRlX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCwKLSAgRUxGX01BQ0hJTkVfQUxUMSwKLSAgRUxGX01BQ0hJTkVfQUxUMiwKLSAgJmVsZl9iYWNrZW5kX3NpemVfaW5mbywKLSAgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQsCi0gIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSwKLSAgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9jb2xsZWN0LAotICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKLSAgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCwKLSAgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AsCi0gIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCwKLSAgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hLAotICBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQsCi0gIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSwKLSAgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltLAotICBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCwKLSAgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCwKLSAgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF93YW50X2R5bmJzcwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgdXNlIHdoZW4gaW5pdGlhbGlzaW5nIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZC4gICovCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNOwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9CSUdfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKLSAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE0LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX21rb2JqZWN0LAotICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCi0gICAgYmZkX2VsZk5OX21rY29yZWZpbGUKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotICB9LAotCi0gICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCi0jaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCi0jZWxzZQotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotI2VuZGlmCi0gICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotICAmIFRBUkdFVF9MSVRUTEVfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgJmVsZk5OX2JlZAotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogQWx0ZXJuYXRpdmUgZW5kaWFuIHRhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgJmVsZk5OX2JlZAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGUtYXJtLmMgYi9iZmQvZXBvYy1wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvZXBvYy1wZS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybV9lcG9jX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGUtYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGVpLWFybS5jIGIvYmZkL2Vwb2MtcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI1NDhkLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZWktYXJtLWJpZyIKLQotI2luY2x1ZGUgInBlaS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Zvcm1hdC5jIGIvYmZkL2Zvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxZjljLi4wMDAwMDAwCi0tLSBhL2JmZC9mb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBzdXBwb3J0IGZvciBmaWxlIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGZvcm1hdHMKLQotCUEgZm9ybWF0IGlzIGEgQkZEIGNvbmNlcHQgb2YgaGlnaCBsZXZlbCBmaWxlIGNvbnRlbnRzIHR5cGUuIFRoZQotCWZvcm1hdHMgc3VwcG9ydGVkIGJ5IEJGRCBhcmU6IAotCi0JbyA8PGJmZF9vYmplY3Q+PgotCi0JVGhlIEJGRCBtYXkgY29udGFpbiBkYXRhLCBzeW1ib2xzLCByZWxvY2F0aW9ucyBhbmQgZGVidWcgaW5mby4KLQotCW8gPDxiZmRfYXJjaGl2ZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIG90aGVyIEJGRHMgYW5kIGFuIG9wdGlvbmFsIGluZGV4LgotCi0JbyA8PGJmZF9jb3JlPj4KLQotCVRoZSBCRkQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBhbiBleGVjdXRhYmxlIGNvcmUgZHVtcC4KLQotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIElNUE9SVCBmcm9tIHRhcmdldHMuYy4gICovCi1leHRlcm4gY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzOwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfZm9ybWF0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVZlcmlmeSBpZiB0aGUgZmlsZSBhdHRhY2hlZCB0byB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgY29tcGF0aWJsZQotCXdpdGggdGhlIGZvcm1hdCBAdmFye2Zvcm1hdH0gKGkuZS4sIG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwKLQk8PGJmZF9hcmNoaXZlPj4gb3IgPDxiZmRfY29yZT4+KS4KLQotCUlmIHRoZSBCRkQgaGFzIGJlZW4gc2V0IHRvIGEgc3BlY2lmaWMgdGFyZ2V0IGJlZm9yZSB0aGUKLQljYWxsLCBvbmx5IHRoZSBuYW1lZCB0YXJnZXQgYW5kIGZvcm1hdCBjb21iaW5hdGlvbiBpcwotCWNoZWNrZWQuIElmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIHNldCwgb3IgaGFzIGJlZW4gc2V0IHRvCi0JPDxkZWZhdWx0Pj4sIHRoZW4gYWxsIHRoZSBrbm93biB0YXJnZXQgYmFja2VuZHMgaXMKLQlpbnRlcnJvZ2F0ZWQgdG8gZGV0ZXJtaW5lIGEgbWF0Y2guICBJZiB0aGUgZGVmYXVsdCB0YXJnZXQKLQltYXRjaGVzLCBpdCBpcyB1c2VkLiAgSWYgbm90LCBleGFjdGx5IG9uZSB0YXJnZXQgbXVzdCByZWNvZ25pemUKLQl0aGUgZmlsZSwgb3IgYW4gZXJyb3IgcmVzdWx0cy4KLQotCVRoZSBmdW5jdGlvbiByZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSA8PGZhbHNlPj4KLQl3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOiAgCi0KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCWlmIDw8Zm9ybWF0Pj4gaXMgbm90IG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwgPDxiZmRfYXJjaGl2ZT4+IG9yCi0JPDxiZmRfY29yZT4+LgotCi0JbyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+IC0KLQlpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBhIHJlYWQgLSBldmVuIHNvbWUgZmlsZSBtaXNtYXRjaGVzCi0JY2FuIGNhdXNlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbHMuCi0KLQlvIDw8ZmlsZV9ub3RfcmVjb2duaXNlZD4+IC0KLQlub25lIG9mIHRoZSBiYWNrZW5kcyByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLQotCW8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4gLQotCW1vcmUgdGhhbiBvbmUgYmFja2VuZCByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLSAgcmV0dXJuIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBOVUxMKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZyk7Ci0KLURFU0NSSVBUSU9OCi0JTGlrZSA8PGJmZF9jaGVja19mb3JtYXQ+PiwgZXhjZXB0IHdoZW4gaXQgcmV0dXJucyBmYWxzZSB3aXRoCi0JPDxiZmRfZXJybm8+PiBzZXQgdG8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4uICBJbiB0aGF0Ci0JY2FzZSwgaWYgQHZhcnttYXRjaGluZ30gaXMgbm90IE5VTEwsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLQlhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyB0aGF0IG1hdGNoZWQsCi0JYWxsb2NhdGVkIHdpdGggPDxtYWxsb2M+Pi4KLQlUaGVuIHRoZSB1c2VyIG1heSBjaG9vc2UgYSBmb3JtYXQgYW5kIHRyeSBhZ2Fpbi4KLQotCVdoZW4gZG9uZSB3aXRoIHRoZSBsaXN0IHRoYXQgQHZhcnttYXRjaGluZ30gcG9pbnRzIHRvLCB0aGUgY2FsbGVyCi0Jc2hvdWxkIGZyZWUgaXQuICAKLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBtYXRjaGluZykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLSAgICAgY2hhciAqKiptYXRjaGluZzsKLXsKLSAgZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYzsKLSAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQsICpzYXZlX3RhcmcsICpyaWdodF90YXJnOwotICBjaGFyICoqbWF0Y2hpbmdfdmVjdG9yID0gTlVMTDsKLSAgaW50IG1hdGNoX2NvdW50OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpIDwgKGludCliZmRfdW5rbm93bikgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpPyB0cnVlOiBmYWxzZTsKLQotCi0gIC8qIFNpbmNlIHRoZSB0YXJnZXQgdHlwZSB3YXMgZGVmYXVsdGVkLCBjaGVjayB0aGVtIAotICAgICBhbGwgaW4gdGhlIGhvcGUgdGhhdCBvbmUgd2lsbCBiZSB1bmlxdWVseSByZWNvZ25pemVkLiAgKi8KLQotICBzYXZlX3RhcmcgPSBhYmZkLT54dmVjOwotICBtYXRjaF9jb3VudCA9IDA7Ci0gIGlmIChtYXRjaGluZykKLSAgICB7Ci0gICAgICBtYXRjaGluZ192ZWN0b3IgPQotCShjaGFyICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKgotCQkJICAgICAgKF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzICsgMSkpOwotICAgICAgaWYgKCFtYXRjaGluZ192ZWN0b3IpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gTlVMTDsKLSAgICAgICptYXRjaGluZyA9IG1hdGNoaW5nX3ZlY3RvcjsKLSAgICB9Ci0gIHJpZ2h0X3RhcmcgPSAwOwotCi0KLSAgLyogcHJlc3VtZSB0aGUgYW5zd2VyIGlzIHllcyAqLwotICBhYmZkLT5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgLyogSWYgdGhlIHRhcmdldCB0eXBlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwganVzdCBjaGVjayB0aGF0IHRhcmdldC4gICovCi0KLSAgaWYgKCFhYmZkLT50YXJnZXRfZGVmYXVsdGVkKSB7Ci0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCS8qIHJld2luZCEgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByaWdodF90YXJnID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAocmlnaHRfdGFyZykgewotICAgICAgYWJmZC0+eHZlYyA9IHJpZ2h0X3Rhcmc7CQkvKiBTZXQgdGhlIHRhcmdldCBhcyByZXR1cm5lZCAqLwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCQkvKiBGaWxlIHBvc2l0aW9uIGhhcyBtb3ZlZCwgQlRXICovCi0gICAgfQotCi0gICAgLyogRm9yIGEgbG9uZyB0aW1lIHRoZSBjb2RlIGhhcyBkcm9wcGVkIHRocm91Z2ggdG8gY2hlY2sgYWxsCi0gICAgICAgdGFyZ2V0cyBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCB3YXMgd3JvbmcuICBJIGRvbid0IGtub3cgd2h5LAotICAgICAgIGFuZCBJJ20gcmVsdWN0YW50IHRvIGNoYW5nZSBpdC4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGFuCi0gICAgICAgYXJjaGl2ZSwgaXQgY2FuIGNhdXNlIHByb2JsZW1zLiAgSWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgZG9lcwotICAgICAgIG5vdCBwZXJtaXQgYXJjaGl2ZXMgKGUuZy4sIHRoZSBiaW5hcnkgdGFyZ2V0KSwgdGhlbiB3ZSBzaG91bGQKLSAgICAgICBub3QgYWxsb3cgc29tZSBvdGhlciB0YXJnZXQgdG8gcmVjb2duaXplIGl0IGFzIGFuIGFyY2hpdmUsIGJ1dAotICAgICAgIHNob3VsZCBpbnN0ZWFkIGFsbG93IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbgotICAgICAgIG9iamVjdC4gIFdoZW4gSSBmaXJzdCBtYWRlIHRoaXMgY2hhbmdlLCBpdCBicm9rZSB0aGUgUEUgdGFyZ2V0LAotICAgICAgIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBwZWktaTM4NiB0YXJnZXQgZGlkIG5vdCByZWNvZ25pemUgdGhlCi0gICAgICAgYWN0dWFsIHBlLWkzODYgYXJjaGl2ZS4gIFNpbmNlIHRoZXJlIG1heSBiZSBvdGhlciBwcm9ibGVtcyBvZgotICAgICAgIHRoaXMgc29ydCwgSSBjaGFuZ2VkIHRoaXMgdGVzdCB0byBjaGVjayBvbmx5IGZvciB0aGUgYmluYXJ5Ci0gICAgICAgdGFyZ2V0LiAgKi8KLQotICAgIGlmIChmb3JtYXQgPT0gYmZkX2FyY2hpdmUgJiYgc2F2ZV90YXJnID09ICZiaW5hcnlfdmVjKQotICAgICAgewotCWFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0JYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0JaWYgKG1hdGNoaW5nKQotCSAgZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICB9Ci0KLSAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykgewotICAgIGNvbnN0IGJmZF90YXJnZXQgKnRlbXA7Ci0KLSAgICBpZiAoKnRhcmdldCA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgYWJmZC0+eHZlYyA9ICp0YXJnZXQ7CS8qIENoYW5nZSBCRkQncyB0YXJnZXQgdGVtcG9yYXJpbHkgKi8KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvKiBJZiBfYmZkX2NoZWNrX2Zvcm1hdCBuZWdsZWN0cyB0byBzZXQgYmZkX2Vycm9yLCBhc3N1bWUgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLSAgICAgICBXZSBkaWRuJ3QgdXNlZCB0byBldmVuIHBheSBhbnkgYXR0ZW50aW9uIHRvIGJmZF9lcnJvciwgc28gSSBzdXNwZWN0Ci0gICAgICAgdGhhdCBzb21lIF9iZmRfY2hlY2tfZm9ybWF0IG1pZ2h0IGhhdmUgdGhpcyBwcm9ibGVtLiAgKi8KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICB0ZW1wID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAodGVtcCkgewkJCQkvKiBUaGlzIGZvcm1hdCBjaGVja3Mgb3V0IGFzIG9rISAqLwotICAgICAgcmlnaHRfdGFyZyA9IHRlbXA7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JewotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50XSA9IHRlbXAtPm5hbWU7Ci0JICBtYXRjaGluZ192ZWN0b3JbbWF0Y2hfY291bnQgKyAxXSA9IE5VTEw7Ci0JfQotICAgICAgbWF0Y2hfY291bnQrKzsKLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhY2NlcHQgaXQsIGV2ZW4gaWYgb3RoZXIgdGFyZ2V0cwotCSBtaWdodCBtYXRjaC4gIFBlb3BsZSB3aG8gd2FudCB0aG9zZSBvdGhlciB0YXJnZXRzIGhhdmUgdG8gc2V0IAotCSB0aGUgR05VVEFSR0VUIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICh0ZW1wID09IGJmZF9kZWZhdWx0X3ZlY3RvclswXSkKLQl7Ci0JICBpZiAobWF0Y2hpbmcpCi0JICAgIHsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMF0gPSB0ZW1wLT5uYW1lOwotCSAgICAgIG1hdGNoaW5nX3ZlY3RvclsxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIG1hdGNoX2NvdW50ID0gMTsKLQkgIGJyZWFrOwotCX0KLSNpZmRlZiBHTlU5NjAKLSAgICAgIC8qIEJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gYi5vdXQgYXJjaGl2ZXMgbG9vayB0aGUgc2FtZSwgYnV0IGl0IGRvZXNuJ3QKLSAgICAgICAqIG1hdHRlcjogdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGVpciBoZWFkZXJzLCBhbmQgbWVtYmVyIGZpbGUgYnl0ZQotICAgICAgICogb3JkZXJzIHdpbGwgKEkgaG9wZSkgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGJ5IGJmZC4gIERpdHRvIGZvciBiaWcKLSAgICAgICAqIGFuZCBsaXR0bGUgY29mZiBhcmNoaXZlcy4gIEFuZCB0aGUgNCBjb2ZmL2Iub3V0IG9iamVjdCBmb3JtYXRzIGFyZQotICAgICAgICogdW5hbWJpZ3VvdXMuICBTbyBhY2NlcHQgdGhlIGZpcnN0IG1hdGNoIHdlIGZpbmQuCi0gICAgICAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0gICAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICAgIGlmIChtYXRjaGluZyAmJiBiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWF0Y2hfY291bnQgPT0gMSkgewotICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogQ2hhbmdlIEJGRCdzIHRhcmdldCBwZXJtYW5lbnRseSAqLwotICAgIGlmIChtYXRjaGluZykKLSAgICAgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICB9Ci0KLSAgYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdGFyZ2V0IHR5cGUgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CQkvKiBSZXN0b3JlIG9yaWdpbmFsIGZvcm1hdCAqLwotICBpZiAobWF0Y2hfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9mb3JtYXQoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JZm9ybWF0IEB2YXJ7Zm9ybWF0fS4gSWYgdGhlIHRhcmdldCBzZXQgaW4gdGhlIEJGRCBkb2VzIG5vdAotCXN1cHBvcnQgdGhlIGZvcm1hdCByZXF1ZXN0ZWQsIHRoZSBmb3JtYXQgaXMgaW52YWxpZCwgb3IgdGhlIEJGRAotCWlzIG5vdCBvcGVuIGZvciB3cml0aW5nLCB0aGVuIGFuIGVycm9yIG9jY3Vycy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KWFiZmQtPmZvcm1hdCA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPj0gKGludCliZmRfdHlwZV9lbmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF91bmtub3duKQotICAgIHJldHVybiAoYWJmZC0+Zm9ybWF0ID09IGZvcm1hdCkgPyB0cnVlOmZhbHNlOwotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIGlmICghQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3NldF9mb3JtYXQsIChhYmZkKSkpIHsKLSAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZm9ybWF0X3N0cmluZwotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9mb3JtYXRfc3RyaW5nKGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIGEgY29uc3Qgc3RyaW5nCi0JPDxpbnZhbGlkPj4sIDw8b2JqZWN0Pj4sIDw8YXJjaGl2ZT4+LCA8PGNvcmU+Piwgb3IgPDx1bmtub3duPj4sCi0JZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIG9mIEB2YXJ7Zm9ybWF0fS4KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgKGZvcm1hdCkKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIGlmICgoKGludClmb3JtYXQgPChpbnQpIGJmZF91bmtub3duKSAKLSAgICAgIHx8ICgoaW50KWZvcm1hdCA+PShpbnQpIGJmZF90eXBlX2VuZCkpIAotICAgIHJldHVybiAiaW52YWxpZCI7Ci0gIAotICBzd2l0Y2ggKGZvcm1hdCkgewotICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgcmV0dXJuICJvYmplY3QiOwkJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotICBjYXNlIGJmZF9hcmNoaXZlOiAKLSAgICByZXR1cm4gImFyY2hpdmUiOwkJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotICBjYXNlIGJmZF9jb3JlOiAKLSAgICByZXR1cm4gImNvcmUiOwkJLyogY29yZSBkdW1wICovCi0gIGRlZmF1bHQ6IAotICAgIHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9mcmVlYnNkLmggYi9iZmQvZnJlZWJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODBjMjEzLi4wMDAwMDAwCi0tLSBhL2JmZC9mcmVlYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIEZyZWVCU0QgdGFyZ2V0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0qLwotCi0vKiBGcmVlQlNEIFpNQUdJQyBmaWxlcyBuZXZlciBoYXZlIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICovCi0jZGVmaW5lCU5fSEVBREVSX0lOX1RFWFQoeCkJMAotCi0vKiBaTUFHSUMgZmlsZXMgc3RhcnQgYXQgb2Zmc2V0IDAuICBEb2VzIG5vdCBhcHBseSB0byBRTUFHSUMgZmlsZXMuICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkJMAotCi0jZGVmaW5lIE5fR0VUTUFHSUNfTkVUKGV4ZWMpIFwKLQkoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZikKLSNkZWZpbmUgTl9HRVRNSURfTkVUKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpCi0jZGVmaW5lIE5fR0VURkxBR19ORVQoZXgpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSBcCi0JICgoTl9HRVRNQUdJQ19ORVQgKGV4ZWMpID09IFpNQUdJQykgPyBOX0dFVE1JRF9ORVQgKGV4ZWMpIDogXAotCSAgKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRGTEFHX05FVCAoZXhlYykgOiBcCi0JICgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0JIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAotCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI2KSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0JICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogT24gRnJlZUJTRCwgdGhlIG1hZ2ljIG51bWJlciBpcyBhbHdheXMgaW4gaTM4NiAobGl0dGxlLWVuZGlhbikKLSAgIGZvcm1hdC4gIEkgdGhpbmsuICAqLwotI2RlZmluZSBTV0FQX01BR0lDKGV4dCkgYmZkX2dldGwzMiAoZXh0KQotCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIGlmIChzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhLm91dC1tNjhrNGstbmV0YnNkIikgPT0gMCkKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEs0S19ORVRCU0QpOwotICAgIGVsc2UKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEtfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkNfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8zODZfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNTMyX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VuLWFvdXQuYyBiL2JmZC9nZW4tYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVkOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9nZW4tYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qIEdlbmVyYXRlIHBhcmFtZXRlcnMgZm9yIGFuIGEub3V0IHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICIvdXNyL2luY2x1ZGUvYS5vdXQuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOyBjaGFyKiogYXJndjsKLXsKLSAgc3RydWN0IGV4ZWMgbXlfZXhlYzsKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgY2hhciAqdGFyZ2V0ID0gInVua25vd24iLCAqYXJjaCA9ICJ1bmtub3duIjsKLSAgRklMRSAqZmlsZSA9IGZvcGVuKCJnZW4tYW91dCIsICJyIik7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChmcmVhZCgmbXlfZXhlYywgc2l6ZW9mKHN0cnVjdCBleGVjKSwgMSwgZmlsZSkgIT0gMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVhZCBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdGFyZ2V0ID0gYXJndlsxXTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBnZW4tYW91dCB0YXJnZXRfbmFtZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgfQotCi0jaWZkZWYgTl9UWFRPRkYKLSAgcGFnZV9zaXplID0gTl9UWFRPRkYobXlfZXhlYyk7Ci0gIGlmIChwYWdlX3NpemUgPT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxXG4iKTsKLSAgZWxzZQotICAgIHByaW50ZigiI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDBcbiIpOwotI2VuZGlmCi0KLSAgcHJpbnRmKCIjZGVmaW5lIEJZVEVTX0lOX1dPUkQgJWRcbiIsIHNpemVvZiAoaW50KSk7Ci0gIGlmIChteV9leGVjLmFfZW50cnkgPT0gMCkgewotICAgICAgcHJpbnRmKCIjZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPXG4iKTsKLSAgICAgIHByaW50ZigiI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyAqL1xuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyovXG4iKTsKLSAgICAgIHByaW50ZigiLyojZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwKi9cbiIpOwotICB9Ci0KLSAgcHJpbnRmKCIjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAlZFxuIiwgbXlfZXhlYy5hX2VudHJ5KTsKLQotI2lmZGVmIFBBR1NJWgotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcGFnZV9zaXplID0gUEFHU0laOwotI2VuZGlmCi0gIGlmIChwYWdlX3NpemUgIT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAlZFxuIiwgcGFnZV9zaXplKTsKLSAgZWxzZQotICAgIHByaW50ZigiLyogI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFID8/PyAqL1xuIik7Ci0gIHByaW50ZigiI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRVxuIik7Ci0KLSNpZmRlZiB2YXgKLSAgYXJjaCA9ICJ2YXgiOwotI2VuZGlmCi0jaWZkZWYgbTY4awotICBhcmNoID0gIm02OGsiOwotI2VuZGlmCi0gIGlmIChhcmNoWzBdID09ICcxJykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIndhcm5pbmc6IHByZXByb2Nlc3NvciBzdWJzdGl0dXRlZCBhcmNoaXRlY3R1cmUgbmFtZSBpbnNpZGUgc3RyaW5nOyIpKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiICAgICAgICAgZml4IERFRkFVTFRfQVJDSCBpbiB0aGUgb3V0cHV0IGZpbGUgeW91cnNlbGZcbiIpKTsKLSAgICAgIGFyY2ggPSAidW5rbm93biI7Ci0gICAgfQotICBwcmludGYoIiNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoXyVzXG4iLCBhcmNoKTsKLQotICBwcmludGYoIlxuI2RlZmluZSBNWShPUCkgQ0FUKCVzXyxPUClcbiIsIHRhcmdldCk7Ci0gIHByaW50ZigiI2RlZmluZSBUQVJHRVROQU1FIFwiYS5vdXQtJXNcIlxuXG4iLCB0YXJnZXQpOwotCi0gIHByaW50ZigiI2luY2x1ZGUgXCJiZmQuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcInN5c2RlcC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJsaWJhb3V0LmhcIlxuIik7Ci0gIHByaW50ZigiXG4jaW5jbHVkZSBcImFvdXQtdGFyZ2V0LmhcIlxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VubGluay5oIGIvYmZkL2dlbmxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwYThkZS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VubGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIGdlbmxpbmsuaCAtLSBpbnRlcmZhY2UgdG8gdGhlIEJGRCBnZW5lcmljIGxpbmtlcgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0VOTElOS19ICi0jZGVmaW5lIEdFTkxJTktfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIHRvIEJGRC4gIEl0IGRlc2NyaWJlcyB0aGUgaW50ZXJuYWwKLSAgIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIsIGluIGNhc2UKLSAgIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBsaW5rZXJzIHdhbnQgdG8gdXNlIG9yIGNhbGwgdGhlbS4gIE5vdGUKLSAgIHRoYXQgc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0gICBhcmUgZGVjbGFyZWQgaW4gbGliYmZkLmgsIGJlY2F1c2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgd2lkZWx5Ci0gICB1c2VkLiAgVGhlIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgd2lsbCBwcm9iYWJseSBvbmx5Ci0gICBiZSB1c2VkIGJ5IGEgZmV3IGZpbGVzIGJlc2lkZXMgbGlua2VyLmMgaXRzZWxmLiAgSW4gZmFjdCwgdGhpcyBmaWxlCi0gICBpcyBub3QgcGFydGljdWxhcmx5IGNvbXBsZXRlOyBJIGhhdmUgb25seSBwdXQgaW4gdGhlIGludGVyZmFjZXMgSQotICAgYWN0dWFsbHkgbmVlZGVkLiAgKi8KLQotLyogVGhlIGdlbmVyaWMgbGlua2VyIHVzZXMgYSBoYXNoIHRhYmxlIHdoaWNoIGlzIGEgZGVyaXZlZCBjbGFzcyBvZgotICAgdGhlIHN0YW5kYXJkIGxpbmtlciBoYXNoIHRhYmxlLCBqdXN0IGFzIHRoZSBvdGhlciBiYWNrZW5kIHNwZWNpZmljCi0gICBsaW5rZXJzIGRvLiAgRG8gbm90IGNvbmZ1c2UgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgd2l0aCB0aGUKLSAgIHN0YW5kYXJkIEJGRCBsaW5rZXIgaGFzaCB0YWJsZSBpdCBpcyBidWlsdCB1cG9uLiAgKi8KLQotLyogR2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbiBvdXQuICAqLwotICBib29sZWFuIHdyaXR0ZW47Ci0gIC8qIFN5bWJvbCBmcm9tIGlucHV0IEJGRC4gICovCi0gIGFzeW1ib2wgKnN5bTsKLX07Ci0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciByZWFkcyBpbiB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBhbiBpbnB1dCBCRkQKLSAgIGFuZCBrZWVwcyB0aGVtIGluIHRoZSBvdXRzeW1ib2wgYW5kIHN5bWNvdW50IGZpZWxkcy4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgb2YgaW5wdXRfYmZkIHRvIHRoZSBzeW1ib2xzIGJlaW5nIGJ1aWx0IGZvcgotICAgb3V0cHV0X2JmZC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIHNpemVfdCAqcHN5bWFsbG9jKSk7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwgd2hpY2ggbWF5IGJlIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8KLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgc2l6ZV90ICpwc3ltYWxsb2M7Ci19OwotCi0vKiBXcml0ZSBvdXQgYSBzaW5nbGUgZ2xvYmFsIHN5bWJvbC4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkCi0gICB2aWEgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdAotICAgYWN0dWFsbHkgYmUgYSBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgZW50cnkgY3JlYXRpb24gcm91dGluZS4gICovCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9nbzMyc3R1Yi5oIGIvYmZkL2dvMzJzdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDM4OGMuLjAwMDAwMDAKLS0tIGEvYmZkL2dvMzJzdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotMHg0ZCwweDVhLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDI3LDB4MDAsMHhmZiwweGZmLDB4MDAsMHgwMCwKLTB4NjAsMHgwNywweDAwLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDBkLDB4MGEsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjgsCi0weDIwLDB4NjcsMHg2NSwweDZlLDB4NjUsMHg3MiwweDYxLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg2NiwweDcyLDB4NmYsMHg2ZCwweDIwLAotMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsMHg3MywKLTB4NmQsMHgyYywweDIwLDB4NmYsMHg2ZSwweDIwLDB4NTcsMHg2NSwweDY0LDB4MjAsMHg0YSwweDc1LDB4NmUsMHgyMCwweDMxLDB4MzEsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzcsMHgwZCwweDBhLAotMHg1NCwweDY4LDB4NjUsMHgyMCwweDUzLDB4NTQsMHg1NSwweDQyLDB4MmUsMHg0NSwweDU4LDB4NDUsMHgyMCwweDczLDB4NzQsMHg3NSwKLTB4NjIsMHgyMCwweDZjLDB4NmYsMHg2MSwweDY0LDB4NjUsMHg3MiwweDIwLDB4NjksMHg3MywweDIwLDB4NDMsMHg2ZiwweDcwLDB4NzksCi0weDcyLDB4NjksMHg2NywweDY4LDB4NzQsMHgyMCwweDI4LDB4NDMsMHgyOSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzMsMHgyZCwweDMxLAotMHgzOSwweDM5LDB4MzUsMHgyMCwweDQ0LDB4NGEsMHgyMCwweDQ0LDB4NjUsMHg2YywweDZmLDB4NzIsMHg2OSwweDY1LDB4MmUsMHgyMCwKLTB4MGQsMHgwYSwweDUwLDB4NjUsMHg3MiwweDZkLDB4NjksMHg3MywweDczLDB4NjksMHg2ZiwweDZlLDB4MjAsMHg2NywweDcyLDB4NjEsCi0weDZlLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDZmLDB4MjAsMHg3NSwweDczLDB4NjUsMHgyMCwweDY2LDB4NmYsMHg3MiwweDIwLAotMHg2MSwweDZlLDB4NzksMHgyMCwweDcwLDB4NzUsMHg3MiwweDcwLDB4NmYsMHg3MywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg3NiwKLTB4NjksMHg2NCwweDY1LDB4NjQsMHgyMCwweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2MywweDZmLDB4NzAsMHg3OSwweDcyLDB4NjksCi0weDY3LDB4NjgsMHg3NCwweDIwLDB4MGQsMHgwYSwweDcyLDB4NjUsMHg2ZCwweDYxLDB4NjksMHg2ZSwweDczLDB4MjAsMHg3MCwweDcyLAotMHg2NSwweDczLDB4NjUsMHg2ZSwweDc0LDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDc1LDB4NmUsMHg2ZCwweDZmLDB4NjQsMHg2OSwKLTB4NjYsMHg2OSwweDY1LDB4NjQsMHgyZSwweDIwLDB4MGQsMHgwYSwweDU0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2ZiwweDZlLDB4NmMsCi0weDc5LDB4MjAsMHg2MSwweDcwLDB4NzAsMHg2YywweDY5LDB4NjUsMHg3MywweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzQsMHg2OCwweDY1LAotMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDYxLDB4NmUsMHg2NCwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZSwKLTB4NjUsMHg2MywweDYzLDB4NjUsMHg3MywweDczLDB4NjEsMHg3MiwweDY5LDB4NmMsMHg3OSwweDIwLDB4NzQsMHg2OCwweDY1LDB4MjAsCi0weDc3LDB4NjgsMHg2ZiwweDZjLDB4NjUsMHgyMCwweDcwLDB4NzIsMHg2ZiwweDY3LDB4NzIsMHg2MSwweDZkLDB4MmUsMHgwYSwweDBkLAotMHgwYSwweDI0LDB4NDksMHg2NCwweDNhLDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwKLTB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsMHgyMCwweDMxLDB4MzYsCi0weDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsMHg2ZCwweDIwLAotMHgyNCwweDBhLDB4MGQsMHgwYSwweDQwLDB4MjgsMHgyMywweDI5LDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywKLTB4NmQsMHgyMCwweDYyLDB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLAotMHg3MywweDZkLDB4MGEsMHgwZCwweDBhLDB4MWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDY3LDB4NmYsMHgzMywweDMyLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyYywweDIwLDB4NzYsMHgyMCwweDMyLDB4MmUsMHgzMCwweDMwLAotMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4NTcsMHg1MywweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MmUsMHg0NSwweDU4LDB4NDUsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwZSwweDFmLDB4OGMsMHgxZSwweDI0LDB4MDAsMHg4YywweDA2LDB4NjAsMHgwNywweGZjLDB4YjQsCi0weDMwLDB4Y2QsMHgyMSwweDNjLDB4MDMsMHg3MywweDA2LDB4YmEsMHg4NiwweDA1LDB4ZTksMHhiMiwweDAzLDB4YTIsMHg2OSwweDA4LAotMHhiYiwweDcwLDB4MDgsMHhhMSwweDIwLDB4MDAsMHgzOSwweGMzLDB4NzMsMHgwMiwweDg5LDB4YzMsMHg4OSwweDFlLDB4MjAsMHgwMCwKLTB4ZmUsMHhjNywweGI5LDB4MDQsMHhmZiwweGQzLDB4ZWIsMHhiNCwweDRhLDB4Y2QsMHgyMSwweDczLDB4MGEsMHhkMywweGUzLDB4ZmUsCi0weGNmLDB4ODksMHgxZSwweDIwLDB4MDAsMHhlYiwweGQ5LDB4MjYsMHg4ZSwweDA2LDB4MmMsMHgwMCwweDMxLDB4ZmYsMHgzMCwweGMwLAotMHhhOSwweGYyLDB4YWUsMHgyNiwweDgxLDB4M2QsMHg1MCwweDQxLDB4NzUsMHgxNSwweGFmLDB4MjYsMHg4MSwweDNkLDB4NTQsMHg0OCwKLTB4NzUsMHgwZCwweGFmLDB4MjYsMHg4MCwweDNkLDB4M2QsMHg3NSwweDA2LDB4NDcsMHg4OSwweDNlLDB4NjcsMHgwNCwweDRmLDB4YWUsCi0weDc1LDB4ZGYsMHhhZiwweDA2LDB4NTcsMHgzMSwweGM5LDB4NzQsMHgxMCwweGJhLDB4NWQsMHgwNSwweGU5LDB4NTAsMHgwMywweDA5LAotMHhjOSwweDc1LDB4ZjYsMHg0MSwweGU4LDB4OTIsMHgwMywweDcyLDB4ZjAsMHhiOCwweDg3LDB4MTYsMHhjZCwweDJmLDB4MDksMHhjMCwKLTB4NzUsMHhlZCwweDgwLDB4ZTMsMHgwMSwweDc0LDB4ZTgsMHg4OSwweDNlLDB4MDAsMHgwNiwweDhjLDB4MDYsMHgwMiwweDA2LDB4ODksCi0weDM2LDB4MDQsMHgwNiwweDVmLDB4MDcsMHhlOCwweGQ1LDB4MDIsMHg4OSwweDNlLDB4MmEsMHgwMCwweDg5LDB4MzYsMHg2MiwweDA3LAotMHg4MCwweDNlLDB4MmMsMHgwMCwweDAwLDB4NzQsMHgyNCwweGI5LDB4MDgsMHgwMCwweGJmLDB4MmMsMHgwMCwweDhhLDB4MDUsMHg0NywKLTB4MDgsMHhjMCwweDc0LDB4MDUsMHg4OCwweDA3LDB4NDMsMHhlMiwweGY0LDB4NjYsMHhjNywweDA3LDB4MmUsMHg0NSwweDU4LDB4NDUsCi0weDgxLDB4YzMsMHgwNCwweDAwLDB4YzYsMHgwNywweDAwLDB4ODksMHgxZSwweDYyLDB4MDcsMHhiOCwweDAwLDB4M2QsMHhiYSwweDY0LAotMHgwNywweGNkLDB4MjEsMHgwZiwweDgyLDB4YjQsMHgwMiwweGEzLDB4MDYsMHgwNiwweDg5LDB4YzMsMHhiOSwweDA2LDB4MDAsMHhiYSwKLTB4YjUsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4MzEsMHhkMiwweDMxLDB4YzksMHhhMSwweGI1LDB4MDcsMHgzZCwweDRjLDB4MDEsCi0weDc0LDB4MWIsMHgzZCwweDRkLDB4NWEsMHgwZiwweDg1LDB4OTcsMHgwMiwweDhiLDB4MTYsMHhiOSwweDA3LDB4YzEsMHhlMiwweDA5LAotMHg4YiwweDFlLDB4YjcsMHgwNywweDA5LDB4ZGIsMHg3NCwweDA1LDB4ODAsMHhlZSwweDAyLDB4MDEsMHhkYSwweDg5LDB4MTYsMHhiYiwKLTB4MDcsMHg4OSwweDBlLDB4YmQsMHgwNywweGI4LDB4MDAsMHg0MiwweDhiLDB4MWUsMHgwNiwweDA2LDB4Y2QsMHgyMSwweGI5LDB4YTgsCi0weDAwLDB4YmEsMHhiZiwweDA3LDB4YjQsMHgzZiwweGNkLDB4MjEsMHgzZCwweGE4LDB4MDAsMHg3NSwweDA2LDB4ODEsMHgzZSwweGJmLAotMHgwNywweDRjLDB4MDEsMHgwZiwweDg1LDB4NWUsMHgwMiwweDY2LDB4YTEsMHhlMywweDA3LDB4NjYsMHhhMywweDEwLDB4MDYsMHg2NiwKLTB4OGIsMHgwZSwweGJiLDB4MDcsMHg2NiwweGExLDB4MDMsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwOCwweDA2LDB4NjYsCi0weGExLDB4MmIsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwYywweDA2LDB4NjYsMHg4YiwweDFlLDB4NGIsMHgwOCwweDY2LAotMHhhMSwweDRmLDB4MDgsMHg2NiwweDAxLDB4YzMsMHg2NiwweGI4LDB4MDEsMHgwMCwweDAxLDB4MDAsMHg2NiwweDM5LDB4YzMsMHg3MywKLTB4MDMsMHg2NiwweDg5LDB4YzMsMHg2NiwweDgxLDB4YzMsMHhmZiwweGZmLDB4MDAsMHgwMCwweDMxLDB4ZGIsMHg2NiwweDg5LDB4MWUsCi0weDFjLDB4MDAsMHhlOCwweGU4LDB4MDIsMHg4YiwweDFlLDB4MDQsMHgwNiwweDA5LDB4ZGIsMHg3NCwweDBhLDB4YjQsMHg0OCwweGNkLAotMHgyMSwweDBmLDB4ODIsMHgxMCwweDAyLDB4OGUsMHhjMCwweGU4LDB4ZmIsMHgwMiwweGI4LDB4MDEsMHgwMCwweGZmLDB4MWUsMHgwMCwKLTB4MDYsMHgwZiwweDgyLDB4MDgsMHgwMiwweDhjLDB4MDYsMHgyNiwweDAwLDB4OGMsMHgwZSwweDI4LDB4MDAsMHg4YywweGQ4LDB4YTMsCi0weDIyLDB4MDAsMHg4ZSwweGMwLDB4MzEsMHhjMCwweGI5LDB4MDEsMHgwMCwweGNkLDB4MzEsMHg3MiwweDA3LDB4YTMsMHgxNCwweDA2LAotMHgzMSwweGMwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhlYSwweDAxLDB4YTMsMHgxNiwweDA2LDB4NjYsMHg4YiwweDBlLDB4MWMsMHgwMCwKLTB4YjgsMHgwMSwweDA1LDB4OGIsMHgxZSwweDFlLDB4MDAsMHhjZCwweDMxLDB4MGYsMHg4MiwweGRhLDB4MDEsMHg4OSwweDFlLDB4MWEsCi0weDA2LDB4ODksMHgwZSwweDE4LDB4MDYsMHg4OSwweDM2LDB4MWEsMHgwMCwweDg5LDB4M2UsMHgxOCwweDAwLDB4YjgsMHgwNywweDAwLAotMHg4YiwweDFlLDB4MTQsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsMHgwOSwKLTB4MDAsMHg4YywweGM5LDB4ODEsMHhlMSwweDAzLDB4MDAsMHhjMSwweGUxLDB4MDUsMHg1MSwweDgxLDB4YzksMHg5YiwweGMwLDB4Y2QsCi0weDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDA3LAotMHgwMCwweDhiLDB4MWUsMHgxNiwweDA2LDB4OGIsMHgwZSwweDFhLDB4MDYsMHg4YiwweDE2LDB4MTgsMHgwNiwweGNkLDB4MzEsMHhiOCwKLTB4MDksMHgwMCwweDU5LDB4ODEsMHhjOSwweDkzLDB4YzAsMHhjZCwweDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsCi0weDQ5LDB4YmEsMHhmZiwweGZmLDB4Y2QsMHgzMSwweGI4LDB4MDAsMHgwMSwweGJiLDB4MDAsMHgwZiwweGNkLDB4MzEsMHg3MywweDEwLAotMHgzZCwweDA4LDB4MDAsMHgwZiwweDg1LDB4NjUsMHgwMSwweGI4LDB4MDAsMHgwMSwweGNkLDB4MzEsMHgwZiwweDgyLDB4NWMsMHgwMSwKLTB4YTMsMHgxYywweDA2LDB4ODksMHgxNiwweDFlLDB4MDYsMHhjMSwweGUzLDB4MDQsMHg4OSwweDFlLDB4MjAsMHgwNiwweDY2LDB4OGIsCi0weDM2LDB4MDgsMHgwNiwweDY2LDB4OGIsMHgzZSwweGZiLDB4MDcsMHg2NiwweDhiLDB4MGUsMHhmZiwweDA3LDB4ZTgsMHg0OSwweDAwLAotMHg2NiwweDhiLDB4MzYsMHgwYywweDA2LDB4NjYsMHg4YiwweDNlLDB4MjMsMHgwOCwweDY2LDB4OGIsMHgwZSwweDI3LDB4MDgsMHhlOCwKLTB4MzcsMHgwMCwweDhlLDB4MDYsMHgxNiwweDA2LDB4NjYsMHg4YiwweDNlLDB4NGIsMHgwOCwweDY2LDB4OGIsMHgwZSwweDRmLDB4MDgsCi0weDY2LDB4MzEsMHhjMCwweDY2LDB4YzEsMHhlOSwweDAyLDB4NjcsMHhmMywweDY2LDB4YWIsMHhiNCwweDNlLDB4OGIsMHgxZSwweDA2LAotMHgwNiwweGNkLDB4MjEsMHhiOCwweDAxLDB4MDEsMHg4YiwweDE2LDB4MWUsMHgwNiwweGNkLDB4MzEsMHgxZSwweDBmLDB4YTEsMHg4ZSwKLTB4MWUsMHgxNiwweDA2LDB4NjYsMHg2NCwweGZmLDB4MmUsMHgxMCwweDA2LDB4NjYsMHg4OSwweGYwLDB4NjYsMHgyNSwweGZmLDB4MDEsCi0weDAwLDB4MDAsMHg2NiwweDAxLDB4YzEsMHgyOSwweGM2LDB4NjYsMHgyOSwweGM3LDB4NjYsMHg4OSwweDBlLDB4MjYsMHgwNiwweDY2LAotMHg4OSwweDNlLDB4MjIsMHgwNiwweGU4LDB4ZmUsMHgwMCwweDg5LDB4MzYsMHgzZSwweDA2LDB4NjYsMHhjMSwweGVlLDB4MTAsMHg4OSwKLTB4MzYsMHg0MiwweDA2LDB4OGIsMHgxZSwweDA2LDB4MDYsMHg4OSwweDFlLDB4M2EsMHgwNiwweGM3LDB4MDYsMHg0NiwweDA2LDB4MDAsCi0weDQyLDB4ZTgsMHhmMiwweDAwLDB4YTEsMHgxYywweDA2LDB4YTMsMHg0ZSwweDA2LDB4YzcsMHgwNiwweDNlLDB4MDYsMHgwMCwweDAwLAotMHhjNiwweDA2LDB4NDcsMHgwNiwweDNmLDB4YTEsMHgyOCwweDA2LDB4MDksMHhjMCwweDc1LDB4MDksMHhhMSwweDI2LDB4MDYsMHgzYiwKLTB4MDYsMHgyMCwweDA2LDB4NzYsMHgwMywweGExLDB4MjAsMHgwNiwweGEzLDB4NDIsMHgwNiwweGU4LDB4YzgsMHgwMCwweDY2LDB4MzEsCi0weGM5LDB4OGIsMHgwZSwweDQ2LDB4MDYsMHg2NiwweDhiLDB4M2UsMHgyMiwweDA2LDB4NjYsMHgwMSwweDBlLDB4MjIsMHgwNiwweDY2LAotMHgyOSwweDBlLDB4MjYsMHgwNiwweDY2LDB4MzEsMHhmNiwweGMxLDB4ZTksMHgwMiwweDFlLDB4MDYsMHg4ZSwweDA2LDB4MTYsMHgwNiwKLTB4OGUsMHgxZSwweDFlLDB4MDYsMHg2NywweGYzLDB4NjYsMHhhNSwweDA3LDB4MWYsMHg2NiwweDAzLDB4MGUsMHgyNiwweDA2LDB4NzUsCi0weGFmLDB4YzMsMHgzYywweDNhLDB4NzQsMHgwNiwweDNjLDB4MmYsMHg3NCwweDAyLDB4M2MsMHg1YywweGMzLDB4YmUsMHg2NCwweDA3LAotMHg4OSwweGYzLDB4MjYsMHg4YSwweDA1LDB4NDcsMHg4OCwweDA0LDB4MzgsMHhlMCwweDc0LDB4MGUsMHgwOCwweGMwLDB4NzQsMHgwYSwKLTB4NDYsMHhlOCwweGRlLDB4ZmYsMHg3NSwweGVjLDB4ODksMHhmMywweDc0LDB4ZTgsMHhjMywweGJhLDB4MjYsMHgwNSwweGViLDB4MDgsCi0weGJhLDB4MzQsMHgwNSwweGViLDB4MDMsMHhiYSwweDNlLDB4MDUsMHg1MiwweDhiLDB4MWUsMHg2MiwweDA3LDB4YzYsMHgwNywweDI0LAotMHhiYiwweDY0LDB4MDcsMHhlYiwweDFlLDB4ZTgsMHhlZCwweDAwLDB4YmEsMHg3OCwweDA1LDB4ZWIsMHgxMiwweGJhLDB4OTEsMHgwNSwKLTB4ZWIsMHgwZCwweGJhLDB4YTMsMHgwNSwweGViLDB4MDgsMHhiYSwweGI1LDB4MDUsMHhlYiwweDAzLDB4YmEsMHg3OCwweDA1LDB4NTIsCi0weGJiLDB4MTksMHgwNSwweGU4LDB4MTQsMHgwMCwweDViLDB4ZTgsMHgxMCwweDAwLDB4YmIsMHg0MiwweDA0LDB4ZTgsMHgwYSwweDAwLAotMHhiOCwweGZmLDB4NGMsMHhjZCwweDIxLDB4NDMsMHhiNCwweDAyLDB4Y2QsMHgyMSwweDhhLDB4MTcsMHg4MCwweGZhLDB4MjQsMHg3NSwKLTB4ZjQsMHhjMywweDBkLDB4MGEsMHgyNCwweDUwLDB4NTEsMHg1NywweDMxLDB4YzAsMHhiZiwweDJhLDB4MDYsMHhiOSwweDE5LDB4MDAsCi0weGYzLDB4YWIsMHg1ZiwweDU5LDB4NTgsMHhjMywweGI4LDB4MDAsMHgwMywweGJiLDB4MjEsMHgwMCwweDMxLDB4YzksMHg2NiwweGJmLAotMHgyYSwweDA2LDB4MDAsMHgwMCwweGNkLDB4MzEsMHhjMywweDAwLDB4MDAsMHgzMCwweGU0LDB4ZTgsMHg1ZiwweGZmLDB4ODksMHhkZSwKLTB4OGIsMHgzZSwweDY3LDB4MDQsMHhlYiwweDE4LDB4YjQsMHgzYiwweGU4LDB4NTIsMHhmZiwweDgxLDB4ZmUsMHg2NCwweDA3LDB4NzQsCi0weDEzLDB4OGEsMHg4NCwweGZmLDB4ZmYsMHhlOCwweDNhLDB4ZmYsMHg3NCwweDA0LDB4YzYsMHgwNCwweDVjLDB4NDYsMHhlOCwweDAzLAotMHgwMCwweDcyLDB4ZTMsMHhjMywweGU4LDB4MzYsMHgwMCwweGJiLDB4NDQsMHgwMCwweDhhLDB4MDcsMHg4OCwweDA0LDB4NDMsMHg0NiwKLTB4MDgsMHhjMCwweDc1LDB4ZjYsMHgwNiwweDU3LDB4MWUsMHgwNywweGU4LDB4OWEsMHhmZiwweGJiLDB4MmEsMHgwNiwweDhjLDB4OWYsCi0weDA0LDB4MDAsMHg4OSwweDlmLDB4MDIsMHgwMCwweGJhLDB4NjQsMHgwNywweGI4LDB4MDAsMHg0YiwweGNkLDB4MjEsMHg1ZiwweDA3LAotMHg3MiwweDA5LDB4YjQsMHg0ZCwweGNkLDB4MjEsMHgyZCwweDAwLDB4MDMsMHhmNywweGQ4LDB4ZWIsMHgyOCwweDgwLDB4M2UsMHg2OSwKLTB4MDgsMHgwNSwweDcyLDB4MjAsMHhiOCwweDAwLDB4NTgsMHhjZCwweDIxLDB4YTIsMHg2NywweDA4LDB4YjgsMHgwMiwweDU4LDB4Y2QsCi0weDIxLDB4YTIsMHg2OCwweDA4LDB4YjgsMHgwMSwweDU4LDB4YmIsMHg4MCwweDAwLDB4Y2QsMHgyMSwweGI4LDB4MDMsMHg1OCwweGJiLAotMHgwMSwweDAwLDB4Y2QsMHgyMSwweGMzLDB4OWMsMHg4MCwweDNlLDB4NjksMHgwOCwweDA1LDB4NzIsMHgxYSwweDUwLDB4NTMsMHhiOCwKLTB4MDMsMHg1OCwweDhhLDB4MWUsMHg2OCwweDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHhiOCwweDAxLDB4NTgsMHg4YSwweDFlLDB4NjcsCi0weDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHg1YiwweDU4LDB4OWQsMHhjMywweDRjLDB4NmYsMHg2MSwweDY0LDB4MjAsMHg2NSwweDcyLAotMHg3MiwweDZmLDB4NzIsMHgzYSwweDIwLDB4MjQsMHgzYSwweDIwLDB4NjMsMHg2MSwweDZlLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZiwKLTB4NzAsMHg2NSwweDZlLDB4MjQsMHgzYSwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg0NSwweDU4LDB4NDUsMHgyNCwweDNhLDB4MjAsCi0weDZlLDB4NmYsMHg3NCwweDIwLDB4NDMsMHg0ZiwweDQ2LDB4NDYsMHgyMCwweDI4LDB4NDMsMHg2OCwweDY1LDB4NjMsMHg2YiwweDIwLAotMHg2NiwweDZmLDB4NzIsMHgyMCwweDc2LDB4NjksMHg3MiwweDc1LDB4NzMsMHg2NSwweDczLDB4MjksMHgyNCwweDZlLDB4NmYsMHgyMCwKLTB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDJkLDB4MjAsMHg0NywweDY1LDB4NzQsMHgyMCwweDYzLDB4NzMsMHg2NCwweDcwLDB4NmQsCi0weDY5LDB4MmEsMHg2MiwweDJlLDB4N2EsMHg2OSwweDcwLDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDRmLDB4NTMsMHgyMCwweDZkLAotMHg2NSwweDZkLDB4NmYsMHg3MiwweDc5LDB4MjQsMHg2ZSwweDY1LDB4NjUsMHg2NCwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHgzMywKLTB4MjQsMHg2MywweDYxLDB4NmUsMHgyNywweDc0LDB4MjAsMHg3MywweDc3LDB4NjksMHg3NCwweDYzLDB4NjgsMHgyMCwweDZkLDB4NmYsCi0weDY0LDB4NjUsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg3MywweDY1LDB4NmMsMHg2NSwweDYzLAotMHg3NCwweDZmLDB4NzIsMHg3MywweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDZkLDB4NjUsMHg2ZCwKLTB4NmYsMHg3MiwweDc5LDB4MjQsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2JmZC9oYXNoLmMgYi9iZmQvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYWY3Li4wMDAwMDAwCi0tLSBhL2JmZC9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyogaGFzaC5jIC0tIGhhc2ggdGFibGUgcm91dGluZXMgZm9yIEJGRAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qCi1TRUNUSU9OCi0JSGFzaCBUYWJsZXMKLQotQGNpbmRleCBIYXNoIHRhYmxlcwotCUJGRCBwcm92aWRlcyBhIHNpbXBsZSBzZXQgb2YgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICBSb3V0aW5lcwotCWFyZSBwcm92aWRlZCB0byBpbml0aWFsaXplIGEgaGFzaCB0YWJsZSwgdG8gZnJlZSBhIGhhc2ggdGFibGUsCi0JdG8gbG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUgYW5kIG9wdGlvbmFsbHkgY3JlYXRlIGFuCi0JZW50cnkgZm9yIGl0LCBhbmQgdG8gdHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgVGhlcmUgaXMKLQljdXJyZW50bHkgbm8gcm91dGluZSB0byBkZWxldGUgYW4gc3RyaW5nIGZyb20gYSBoYXNoIHRhYmxlLgotCi0JVGhlIGJhc2ljIGhhc2ggdGFibGUgZG9lcyBub3QgcGVybWl0IGFueSBkYXRhIHRvIGJlIHN0b3JlZAotCXdpdGggYSBzdHJpbmcuICBIb3dldmVyLCBhIGhhc2ggdGFibGUgaXMgZGVzaWduZWQgdG8gcHJlc2VudCBhCi0JYmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIHR5cGVzIG9mIGhhc2ggdGFibGVzIG1heSBiZQotCWRlcml2ZWQuICBUaGVzZSBkZXJpdmVkIHR5cGVzIG1heSBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0Jd2l0aCB0aGUgc3RyaW5nLiAgSGFzaCB0YWJsZXMgd2VyZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHdheSwKLQlyYXRoZXIgdGhhbiBzaW1wbHkgcHJvdmlkaW5nIGEgZGF0YSBwb2ludGVyIGluIGEgaGFzaCB0YWJsZQotCWVudHJ5LCBiZWNhdXNlIHRoZXkgd2VyZSBkZXNpZ25lZCBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgYmFjawotCWVuZHMuICBUaGUgbGlua2VyIG1heSBjcmVhdGUgdGhvdXNhbmRzIG9mIGhhc2ggdGFibGUgZW50cmllcywKLQlhbmQgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIGFuZCBzdG9yaW5nIGFuZAotCWZvbGxvd2luZyBwb2ludGVycyBiZWNvbWVzIG5vdGljZWFibGUuCi0KLQlUaGUgYmFzaWMgaGFzaCB0YWJsZSBjb2RlIGlzIGluIDw8aGFzaC5jPj4uCi0KLUBtZW51Ci1AKiBDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGU6OgotQCogTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZzo6Ci1AKiBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZTo6Ci1AKiBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGFuZCBmcmVlaW5nIGEgaGFzaCB0YWJsZQotCi1AZmluZGV4IGJmZF9oYXNoX3RhYmxlX2luaXQKLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0JVG8gY3JlYXRlIGEgaGFzaCB0YWJsZSwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgPDxzdHJ1Y3QKLQliZmRfaGFzaF90YWJsZT4+IChkZWZpbmVkIGluIDw8YmZkLmg+PikgYW5kIGNhbGwKLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiAoaWYgeW91IGtub3cgYXBwcm94aW1hdGVseSBob3cgbWFueQotCWVudHJpZXMgeW91IHdpbGwgbmVlZCwgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdGFibGVfaW5pdF9uPj4sCi0Jd2hpY2ggdGFrZXMgYSBAdmFye3NpemV9IGFyZ3VtZW50LCBtYXkgYmUgdXNlZCkuCi0JPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gcmV0dXJucyA8PGZhbHNlPj4gaWYgc29tZSBzb3J0IG9mCi0JZXJyb3Igb2NjdXJzLgotCi1AZmluZGV4IGJmZF9oYXNoX25ld2Z1bmMKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gdGFrZSBhcyBhbiBhcmd1bWVudCBhCi0JZnVuY3Rpb24gdG8gdXNlIHRvIGNyZWF0ZSBuZXcgZW50cmllcy4gIEZvciBhIGJhc2ljIGhhc2gKLQl0YWJsZSwgdXNlIHRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX25ld2Z1bmM+Pi4gIEB4cmVme0Rlcml2aW5nCi0JYSBOZXcgSGFzaCBUYWJsZSBUeXBlfSwgZm9yIHdoeSB5b3Ugd291bGQgd2FudCB0byB1c2UgYQotCWRpZmZlcmVudCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC4KLQotQGZpbmRleCBiZmRfaGFzaF9hbGxvY2F0ZQotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IHdpbGwgY3JlYXRlIGFuIG9iamFsbG9jIHdoaWNoIHdpbGwgYmUKLQl1c2VkIHRvIGFsbG9jYXRlIG5ldyBlbnRyaWVzLiAgWW91IG1heSBhbGxvY2F0ZSBtZW1vcnkgb24gdGhpcwotCW9iamFsbG9jIHVzaW5nIDw8YmZkX2hhc2hfYWxsb2NhdGU+Pi4KLQotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9mcmVlCi0JVXNlIDw8YmZkX2hhc2hfdGFibGVfZnJlZT4+IHRvIGZyZWUgdXAgYWxsIHRoZSBtZW1vcnkgdGhhdCBoYXMKLQliZWVuIGFsbG9jYXRlZCBmb3IgYSBoYXNoIHRhYmxlLiAgVGhpcyB3aWxsIG5vdCBmcmVlIHVwIHRoZQotCTw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4gaXRzZWxmLCB3aGljaCB5b3UgbXVzdCBwcm92aWRlLgotCi1JTk9ERQotTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIENyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZSwgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlMb29raW5nIHVwIG9yIGVudGVyaW5nIGEgc3RyaW5nCi0KLUBmaW5kZXggYmZkX2hhc2hfbG9va3VwCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfbG9va3VwPj4gaXMgdXNlZCBib3RoIHRvIGxvb2sgdXAgYQotCXN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LgotCi0JSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PGZhbHNlPj4sIDw8YmZkX2hhc2hfbG9va3VwPj4KLQl3aWxsIGxvb2sgdXAgYSBzdHJpbmcuICBJZiB0aGUgc3RyaW5nIGlzIGZvdW5kLCBpdCB3aWxsCi0JcmV0dXJucyBhIHBvaW50ZXIgdG8gYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LiAgSWYgdGhlCi0Jc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgPDxiZmRfaGFzaF9sb29rdXA+PiB3aWxsCi0JcmV0dXJuIDw8TlVMTD4+LiAgWW91IHNob3VsZCBub3QgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGluCi0JdGhlIHJldHVybnMgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIHRoZSBzdHJpbmcgd2lsbCBiZQotCWVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4KLQlFaXRoZXIgd2F5IGEgcG9pbnRlciB0byBhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4gd2lsbCBiZQotCXJldHVybmVkLCBlaXRoZXIgdG8gdGhlIGV4aXN0aW5nIHN0cnVjdHVyZSBvciB0byBhIG5ld2x5Ci0JY3JlYXRlZCBvbmUuICBJbiB0aGlzIGNhc2UsIGEgPDxOVUxMPj4gcmV0dXJuIG1lYW5zIHRoYXQgYW4KLQllcnJvciBvY2N1cnJlZC4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIGFuZCBhIG5ldyBlbnRyeSBpcwotCWNyZWF0ZWQsIHRoZSBAdmFye2NvcHl9IGFyZ3VtZW50IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQljb3B5IHRoZSBzdHJpbmcgb250byB0aGUgaGFzaCB0YWJsZSBvYmphbGxvYyBvciBub3QuICBJZgotCUB2YXJ7Y29weX0gaXMgcGFzc2VkIGFzIDw8ZmFsc2U+PiwgeW91IG11c3QgYmUgY2FyZWZ1bCBub3QgdG8KLQlkZWFsbG9jYXRlIG9yIG1vZGlmeSB0aGUgc3RyaW5nIGFzIGxvbmcgYXMgdGhlIGhhc2ggdGFibGUKLQlleGlzdHMuCi0KLUlOT0RFCi1UcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCVRyYXZlcnNpbmcgYSBoYXNoIHRhYmxlCi0KLUBmaW5kZXggYmZkX2hhc2hfdHJhdmVyc2UKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90cmF2ZXJzZT4+IG1heSBiZSB1c2VkIHRvIHRyYXZlcnNlIGEKLQloYXNoIHRhYmxlLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgVGhlIHRyYXZlcnNhbAotCWlzIGRvbmUgaW4gYSByYW5kb20gb3JkZXIuCi0KLQk8PGJmZF9oYXNoX3RyYXZlcnNlPj4gdGFrZXMgYXMgYXJndW1lbnRzIGEgZnVuY3Rpb24gYW5kIGEKLQlnZW5lcmljIDw8dm9pZCAqPj4gcG9pbnRlci4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhCi0JaGFzaCB0YWJsZSBlbnRyeSAoYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqPj4pIGFuZCB0aGUKLQlnZW5lcmljIHBvaW50ZXIgcGFzc2VkIHRvIDw8YmZkX2hhc2hfdHJhdmVyc2U+Pi4gIFRoZSBmdW5jdGlvbgotCW11c3QgcmV0dXJuIGEgPDxib29sZWFuPj4gdmFsdWUsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRvCi0JY29udGludWUgdHJhdmVyc2luZyB0aGUgaGFzaCB0YWJsZS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0JPDxmYWxzZT4+LCA8PGJmZF9oYXNoX3RyYXZlcnNlPj4gd2lsbCBzdG9wIHRoZSB0cmF2ZXJzYWwgYW5kCi0JcmV0dXJuIGltbWVkaWF0ZWx5LgotCi1JTk9ERQotRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCAsIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCURlcml2aW5nIGEgbmV3IGhhc2ggdGFibGUgdHlwZQotCi0JTWFueSB1c2VzIG9mIGhhc2ggdGFibGVzIHdhbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotCXdoaWNoIGVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTb21lIGFsc28gZmluZCBpdAotCWNvbnZlbmllbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBoYXNoIHRhYmxlCi0JaXRzZWxmLiAgVGhpcyBtYXkgYmUgZG9uZSB1c2luZyBhIGRlcml2ZWQgaGFzaCB0YWJsZS4KLQotCVNpbmNlIEMgaXMgbm90IGFuIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZSwgY3JlYXRpbmcgYSBkZXJpdmVkCi0JaGFzaCB0YWJsZSByZXF1aXJlcyBzdGlja2luZyB0b2dldGhlciBzb21lIGJvaWxlcnBsYXRlCi0Jcm91dGluZXMgd2l0aCBhIGZldyBkaWZmZXJlbmNlcyBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBoYXNoCi0JdGFibGUgeW91IHdhbnQgdG8gY3JlYXRlLgotCi0JQW4gZXhhbXBsZSBvZiBhIGRlcml2ZWQgaGFzaCB0YWJsZSBpcyB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0JVGhlIHN0cnVjdHVyZXMgZm9yIHRoaXMgYXJlIGRlZmluZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIFRoZQotCWZ1bmN0aW9ucyBhcmUgaW4gPDxsaW5rZXIuYz4+LgotCi0JWW91IG1heSBhbHNvIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSBhbiBhbHJlYWR5IGRlcml2ZWQgaGFzaAotCXRhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBhLm91dCBsaW5rZXIgYmFja2VuZCBjb2RlIHVzZXMgYSBoYXNoCi0JdGFibGUgZGVyaXZlZCBmcm9tIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotQG1lbnUKLUAqIERlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzOjoKLUAqIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmU6OgotQCogV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLURlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCURlZmluZSB0aGUgZGVyaXZlZCBzdHJ1Y3R1cmVzCi0KLQlZb3UgbXVzdCBkZWZpbmUgYSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLAotCWFuZCBhIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2ggdGFibGUgaXRzZWxmLgotCi0JVGhlIGZpcnN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoCi0JdGFibGUgbXVzdCBiZSBvZiB0aGUgdHlwZSB1c2VkIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQotCXlvdSBhcmUgZGVyaXZpbmcgZnJvbS4gIElmIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhIGJhc2ljIGhhc2gKLQl0YWJsZSB0aGlzIGlzIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4sIHdoaWNoIGlzIGRlZmluZWQgaW4KLQk8PGJmZC5oPj4uICBUaGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2gKLQl0YWJsZSBpdHNlbGYgbXVzdCBiZSBvZiB0aGUgdHlwZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlCi0JZGVyaXZpbmcgZnJvbSBpdHNlbGYuICBJZiB5b3UgYXJlIGRlcml2aW5nIGZyb20gYSBiYXNpYyBoYXNoCi0JdGFibGUsIHRoaXMgaXMgPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+Pi4KLQotCUZvciBleGFtcGxlLCB0aGUgbGlua2VyIGhhc2ggdGFibGUgZGVmaW5lcyA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfZW50cnk+PiAoaW4gPDxiZmRsaW5rLmg+PikuICBUaGUgZmlyc3QgZmllbGQsCi0JPDxyb290Pj4sIGlzIG9mIHR5cGUgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4gIFNpbWlsYXJseSwKLQl0aGUgZmlyc3QgZmllbGQgaW4gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LCA8PHRhYmxlPj4sCi0JaXMgb2YgdHlwZSA8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+LgotCi1JTk9ERQotV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZSwgV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXMsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCVdyaXRlIHRoZSBkZXJpdmVkIGNyZWF0aW9uIHJvdXRpbmUKLQotCVlvdSBtdXN0IHdyaXRlIGEgcm91dGluZSB3aGljaCB3aWxsIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbgotCWVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCBhcyB0aGUKLQlmdW5jdGlvbiBhcmd1bWVudCB0byA8PGJmZF9oYXNoX3RhYmxlX2luaXQ+Pi4KLQotCUluIG9yZGVyIHRvIHBlcm1pdCBvdGhlciBoYXNoIHRhYmxlcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlCi0JaGFzaCB0YWJsZSB5b3UgYXJlIGNyZWF0aW5nLCB0aGlzIHJvdXRpbmUgbXVzdCBiZSB3cml0dGVuIGluIGEKLQlzdGFuZGFyZCB3YXkuCi0KLQlUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNyZWF0aW9uIHJvdXRpbmUgaXMgYSBwb2ludGVyIHRvIGEKLQloYXNoIHRhYmxlIGVudHJ5LiAgVGhpcyBtYXkgYmUgPDxOVUxMPj4sIGluIHdoaWNoIGNhc2UgdGhlCi0Jcm91dGluZSBzaG91bGQgYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZS4gIE90aGVyd2lzZQotCXRoZSBzcGFjZSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhIGhhc2ggdGFibGUgdHlwZQotCWRlcml2ZWQgZnJvbSB0aGlzIG9uZS4KLQotCUFmdGVyIGFsbG9jYXRpbmcgc3BhY2UsIHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgY2FsbCB0aGUKLQljcmVhdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHR5cGUgaXQgaXMgZGVyaXZlZCBmcm9tLAotCXBhc3NpbmcgaW4gYSBwb2ludGVyIHRvIHRoZSBzcGFjZSBpdCBqdXN0IGFsbG9jYXRlZC4gIFRoaXMKLQl3aWxsIGluaXRpYWxpemUgYW55IGZpZWxkcyB1c2VkIGJ5IHRoZSBiYXNlIGhhc2ggdGFibGUuCi0KLQlGaW5hbGx5IHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgaW5pdGlhbGl6ZSBhbnkgbG9jYWwgZmllbGRzCi0JZm9yIHRoZSBuZXcgaGFzaCB0YWJsZSB0eXBlLgotCi0JSGVyZSBpcyBhIGJvaWxlcnBsYXRlIGV4YW1wbGUgb2YgYSBjcmVhdGlvbiByb3V0aW5lLgotCUB2YXJ7ZnVuY3Rpb25fbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHJvdXRpbmUuCi0JQHZhcntlbnRyeV90eXBlfSBpcyB0aGUgdHlwZSBvZiBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB5b3UKLQlhcmUgY3JlYXRpbmcuICBAdmFye2Jhc2VfbmV3ZnVuY30gaXMgdGhlIG5hbWUgb2YgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB0eXBlIHlvdXIgaGFzaCB0YWJsZSBpcyBkZXJpdmVkCi0JZnJvbS4KLQotRVhBTVBMRQotCi0uc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLS5AdmFye2Z1bmN0aW9uX25hbWV9IChlbnRyeSwgdGFibGUsIHN0cmluZykKLS4gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0uICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotLiAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotLnsKLS4gIHN0cnVjdCBAdmFye2VudHJ5X3R5cGV9ICpyZXQgPSAoQHZhcntlbnRyeV90eXBlfSAqKSBlbnRyeTsKLS4KLS4geyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotLiAgICBkZXJpdmVkIGNsYXNzLiAgKn0KLS4gIGlmIChyZXQgPT0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgTlVMTCkKLS4gICAgewotLiAgICAgIHJldCA9ICgoQHZhcntlbnRyeV90eXBlfSAqKQotLgkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoQHZhcntlbnRyeV90eXBlfSkpKTsKLS4gICAgICBpZiAocmV0ID09IChAdmFye2VudHJ5X3R5cGV9ICopIE5VTEwpCi0uICAgICAgICByZXR1cm4gTlVMTDsKLS4gICAgfQotLgotLiB7KiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICp9Ci0uICByZXQgPSAoKEB2YXJ7ZW50cnlfdHlwZX0gKikKLS4JIEB2YXJ7YmFzZV9uZXdmdW5jfSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLS4KLS4geyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzIGhlcmUuICAqfQotLgotLiAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotLn0KLQotREVTQ1JJUFRJT04KLQlUaGUgY3JlYXRpb24gcm91dGluZSBmb3IgdGhlIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBpbgotCTw8bGlua2VyLmM+PiwgbG9va3MganVzdCBsaWtlIHRoaXMgZXhhbXBsZS4KLQlAdmFye2Z1bmN0aW9uX25hbWV9IGlzIDw8X2JmZF9saW5rX2hhc2hfbmV3ZnVuYz4+LgotCUB2YXJ7ZW50cnlfdHlwZX0gaXMgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeT4+LgotCUB2YXJ7YmFzZV9uZXdmdW5jfSBpcyA8PGJmZF9oYXNoX25ld2Z1bmM+PiwgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBmb3IgYSBiYXNpYyBoYXNoIHRhYmxlLgotCi0JPDxfYmZkX2xpbmtfaGFzaF9uZXdmdW5jPj4gYWxzbyBpbml0aWFsaXplcyB0aGUgbG9jYWwgZmllbGRzCi0JaW4gYSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyeTogPDx0eXBlPj4sIDw8d3JpdHRlbj4+IGFuZAotCTw8bmV4dD4+LgotCi1JTk9ERQotV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUKLVNVQlNVQlNFQ1RJT04KLQlXcml0ZSBvdGhlciBkZXJpdmVkIHJvdXRpbmVzCi0KLQlZb3Ugd2lsbCB3YW50IHRvIHdyaXRlIG90aGVyIHJvdXRpbmVzIGZvciB5b3VyIG5ldyBoYXNoIHRhYmxlLAotCWFzIHdlbGwuICAKLQotCVlvdSB3aWxsIHdhbnQgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSB3aGljaCBjYWxscyB0aGUKLQlpbml0aWFsaXphdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbQotCWFuZCBpbml0aWFsaXplcyBhbnkgb3RoZXIgbG9jYWwgZmllbGRzLiAgRm9yIHRoZSBsaW5rZXIgaGFzaAotCXRhYmxlLCB0aGlzIGlzIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdD4+IGluIDw8bGlua2VyLmM+Pi4KLQotCVlvdSB3aWxsIHdhbnQgYSBsb29rdXAgcm91dGluZSB3aGljaCBjYWxscyB0aGUgbG9va3VwIHJvdXRpbmUKLQlvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20gYW5kIGNhc3RzIHRoZSByZXN1bHQuCi0JVGhlIGxpbmtlciBoYXNoIHRhYmxlIHVzZXMgPDxiZmRfbGlua19oYXNoX2xvb2t1cD4+IGluCi0JPDxsaW5rZXIuYz4+ICh0aGlzIGFjdHVhbGx5IHRha2VzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hpY2gKLQlpdCB1c2VzIHRvIGRlY2lkZSBob3cgdG8gcmV0dXJuIHRoZSBsb29rZWQgdXAgdmFsdWUpLgotCi0JWW91IG1heSB3YW50IGEgdHJhdmVyc2FsIHJvdXRpbmUuICBUaGlzIHNob3VsZCBqdXN0IGNhbGwgdGhlCi0JdHJhdmVyc2FsIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tIHdpdGgKLQlhcHByb3ByaWF0ZSBjYXN0cy4gIFRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1c2VzCi0JPDxiZmRfbGlua19oYXNoX3RyYXZlcnNlPj4gaW4gPDxsaW5rZXIuYz4+LgotCi0JVGhlc2Ugcm91dGluZXMgbWF5IHNpbXBseSBiZSBkZWZpbmVkIGFzIG1hY3Jvcy4gIEZvciBleGFtcGxlLAotCXRoZSBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0JbGlua2VyIGhhc2ggdGFibGUsIHVzZXMgbWFjcm9zIGZvciB0aGUgbG9va3VwIGFuZCB0cmF2ZXJzYWwKLQlyb3V0aW5lcy4gIFRoZXNlIGFyZSA8PGFvdXRfbGlua19oYXNoX2xvb2t1cD4+IGFuZAotCTw8YW91dF9saW5rX2hhc2hfdHJhdmVyc2U+PiBpbiBhb3V0eC5oLgotKi8KLQotLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVudHJpZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgREVGQVVMVF9TSVpFICg0MDUxKQotCi0vKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZSwgZ2l2ZW4gYSBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXRfbiAodGFibGUsIG5ld2Z1bmMsIHNpemUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKik7Ci0KLSAgdGFibGUtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKHRhYmxlLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHRhYmxlLT50YWJsZSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqKQotCQkgIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksIGFsbG9jKSk7Ci0gIGlmICh0YWJsZS0+dGFibGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgdGFibGUtPnRhYmxlLCAwLCBhbGxvYyk7Ci0gIHRhYmxlLT5zaXplID0gc2l6ZTsKLSAgdGFibGUtPm5ld2Z1bmMgPSBuZXdmdW5jOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUgd2l0aCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdF9uICh0YWJsZSwgbmV3ZnVuYywgREVGQVVMVF9TSVpFKTsKLX0KLQotLyogRnJlZSBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF90YWJsZV9mcmVlICh0YWJsZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLXsKLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5KTsKLSAgdGFibGUtPm1lbW9yeSA9IE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaGFzaHA7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyaW5nOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChoYXNocCA9IHRhYmxlLT50YWJsZVtpbmRleF07Ci0gICAgICAgaGFzaHAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIGhhc2hwID0gaGFzaHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKGhhc2hwLT5oYXNoID09IGhhc2gKLQkgICYmIHN0cmNtcCAoaGFzaHAtPnN0cmluZywgc3RyaW5nKSA9PSAwKQotCXJldHVybiBoYXNocDsKLSAgICB9Ci0KLSAgaWYgKCEgY3JlYXRlKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0KLSAgaGFzaHAgPSAoKnRhYmxlLT5uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMLCB0YWJsZSwgc3RyaW5nKTsKLSAgaWYgKGhhc2hwID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICBpZiAoY29weSkKLSAgICB7Ci0gICAgICBjaGFyICpuZXc7Ci0KLSAgICAgIG5ldyA9IChjaGFyICopIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksCi0JCQkJICAgICBsZW4gKyAxKTsKLSAgICAgIGlmICghbmV3KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgICBzdHJjcHkgKG5ldywgc3RyaW5nKTsKLSAgICAgIHN0cmluZyA9IG5ldzsKLSAgICB9Ci0gIGhhc2hwLT5zdHJpbmcgPSBzdHJpbmc7Ci0gIGhhc2hwLT5oYXNoID0gaGFzaDsKLSAgaGFzaHAtPm5leHQgPSB0YWJsZS0+dGFibGVbaW5kZXhdOwotICB0YWJsZS0+dGFibGVbaW5kZXhdID0gaGFzaHA7Ci0KLSAgcmV0dXJuIGhhc2hwOwotfQotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3JlcGxhY2UgKHRhYmxlLCBvbGQsIG53KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudzsKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKipwcGg7Ci0KLSAgaW5kZXggPSBvbGQtPmhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChwcGggPSAmdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgICAgICAoKnBwaCkgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHBwaCA9ICYoKnBwaCktPm5leHQpCi0gICAgewotICAgICAgaWYgKCpwcGggPT0gb2xkKQotCXsKLQkgICpwcGggPSBudzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGFib3J0ICgpOwotfQotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGVudHJ5ID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlbnRyeSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5KSkpOwotICByZXR1cm4gZW50cnk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGluIGEgaGFzaCB0YWJsZS4gICovCi0KLVBUUgotYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICByZXQgPSBvYmphbGxvY19hbGxvYyAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5LCBzaXplKTsKLSAgaWYgKHJldCA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgKi8KLQotdm9pZAotYmZkX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBmdW5jLCBpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotICAgICBQVFIgaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpwOwotCi0gICAgICBmb3IgKHAgPSB0YWJsZS0+dGFibGVbaV07IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKCEgKCpmdW5jKSAocCwgaW5mbykpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotDAotLyogQSBmZXcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgKGEub3V0LCBDT0ZGLCBFTEYpIHVzZSBhIHN0cmluZwotICAgdGFibGUuICBUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBhZGRpbmcgc3RyaW5ncyB0byBhIHN0cmluZyB0YWJsZSwKLSAgIHJldHVybmluZyB0aGUgYnl0ZSBvZmZzZXQsIGFuZCB3cml0aW5nIG91dCB0aGUgdGFibGUuCi0KLSAgIFBvc3NpYmxlIGltcHJvdmVtZW50czoKLSAgICsgbG9vayBmb3Igc3RyaW5ncyBtYXRjaGluZyB0cmFpbGluZyBzdWJzdHJpbmdzIG9mIG90aGVyIHN0cmluZ3MKLSAgICsgYmV0dGVyIGRhdGEgc3RydWN0dXJlcz8gIGJhbGFuY2VkIHRyZWVzPwotICAgKyBsb29rIGF0IHJlZHVjaW5nIG1lbW9yeSB1c2UgZWxzZXdoZXJlIC0tIG1heWJlIGlmIHdlIGRpZG4ndCBoYXZlCi0gICAgIHRvIGNvbnN0cnVjdCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBhdCBvbmNlLCB3ZSBjb3VsZCBnZXQgYnkKLSAgICAgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2YgVk0/ICAoV2hhdCBlZmZlY3QgZG9lcyB0aGF0IGhhdmUgb24gdGhlCi0gICAgIHN0cmluZyB0YWJsZSByZWR1Y3Rpb25zPykgICovCi0KLS8qIEFuIGVudHJ5IGluIHRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogSW5kZXggaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBpbmRleDsKLSAgLyogTmV4dCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpuZXh0OwotfTsKLQotLyogVGhlIHN0cnRhYiBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaAotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci0gIC8qIFNpemUgb2Ygc3RydGFiLS1hbHNvIG5leHQgYXZhaWxhYmxlIGluZGV4LiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBGaXJzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpmaXJzdDsKLSAgLyogTGFzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpsYXN0OwotICAvKiBXaGV0aGVyIHRvIHByZWNlZGUgc3RyaW5ncyB3aXRoIGEgdHdvIGJ5dGUgbGVuZ3RoLCBhcyBpbiB0aGUKLSAgICAgWENPRkYgLmRlYnVnIHNlY3Rpb24uICAqLwotICBib29sZWFuIHhjb2ZmOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RydGFiX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cnRhYi4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RydGFiX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHN0cnRhYi4gICovCi0KLSNkZWZpbmUgc3RydGFiX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQ3JlYXRlIGEgbmV3IHN0cnRhYi4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWJsZTsKLQotICB0YWJsZSA9ICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKQotCSAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCkpKTsKLSAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgc3RydGFiX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAodGFibGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHRhYmxlLT5zaXplID0gMDsKLSAgdGFibGUtPmZpcnN0ID0gTlVMTDsKLSAgdGFibGUtPmxhc3QgPSBOVUxMOwotICB0YWJsZS0+eGNvZmYgPSBmYWxzZTsKLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIgaW4gd2hpY2ggdGhlIHN0cmluZ3MgYXJlIG91dHB1dCBpbiB0aGUgZm9ybWF0Ci0gICB1c2VkIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbjogYSB0d28gYnl0ZSBsZW5ndGggcHJlY2VkZXMgZWFjaAotICAgc3RyaW5nLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCi1fYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgcmV0LT54Y29mZiA9IHRydWU7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZyZWUgYSBzdHJ0YWIuICAqLwotCi12b2lkCi1fYmZkX3N0cmluZ3RhYl9mcmVlICh0YWJsZSkKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Ci17Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZ0YWJsZS0+dGFibGUpOwotICBmcmVlICh0YWJsZSk7Ci19Ci0KLS8qIEdldCB0aGUgaW5kZXggb2YgYSBzdHJpbmcgaW4gYSBzdHJ0YWIsIGFkZGluZyBpdCBpZiBpdCBpcyBub3QKLSAgIGFscmVhZHkgcHJlc2VudC4gIElmIEhBU0ggaXMgZmFsc2UsIHdlIGRvbid0IHJlYWxseSB1c2UgdGhlIGhhc2gKLSAgIHRhYmxlLCBhbmQgd2UgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0ZSBzdHJpbmdzLiAgKi8KLQotYmZkX3NpemVfdHlwZQotX2JmZF9zdHJpbmd0YWJfYWRkICh0YWIsIHN0ciwgaGFzaCwgY29weSkKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICByZWdpc3RlciBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmVudHJ5OwotCi0gIGlmIChoYXNoKQotICAgIHsKLSAgICAgIGVudHJ5ID0gc3RydGFiX2hhc2hfbG9va3VwICh0YWIsIHN0ciwgdHJ1ZSwgY29weSk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVudHJ5ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZ0YWItPnRhYmxlLAotCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgaWYgKCEgY29weSkKLQllbnRyeS0+cm9vdC5zdHJpbmcgPSBzdHI7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwgc3RybGVuIChzdHIpICsgMSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotCSAgZW50cnktPnJvb3Quc3RyaW5nID0gbjsKLQl9Ci0gICAgICBlbnRyeS0+aW5kZXggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChlbnRyeS0+aW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIGVudHJ5LT5pbmRleCA9IHRhYi0+c2l6ZTsKLSAgICAgIHRhYi0+c2l6ZSArPSBzdHJsZW4gKHN0cikgKyAxOwotICAgICAgaWYgKHRhYi0+eGNvZmYpCi0JewotCSAgZW50cnktPmluZGV4ICs9IDI7Ci0JICB0YWItPnNpemUgKz0gMjsKLQl9Ci0gICAgICBpZiAodGFiLT5maXJzdCA9PSBOVUxMKQotCXRhYi0+Zmlyc3QgPSBlbnRyeTsKLSAgICAgIGVsc2UKLQl0YWItPmxhc3QtPm5leHQgPSBlbnRyeTsKLSAgICAgIHRhYi0+bGFzdCA9IGVudHJ5OwotICAgIH0KLQotICByZXR1cm4gZW50cnktPmluZGV4OwotfQotCi0vKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN0cnRhYi4gICovCi0KLWJmZF9zaXplX3R5cGUKLV9iZmRfc3RyaW5ndGFiX3NpemUgKHRhYikKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICByZXR1cm4gdGFiLT5zaXplOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzdHJ0YWIuICBBQkZEIG11c3QgYWxyZWFkeSBiZSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4KLSAgIHRoZSBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKQotICAgICByZWdpc3RlciBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLXsKLSAgcmVnaXN0ZXIgYm9vbGVhbiB4Y29mZjsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKLQotICB4Y29mZiA9IHRhYi0+eGNvZmY7Ci0KLSAgZm9yIChlbnRyeSA9IHRhYi0+Zmlyc3Q7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyOwotICAgICAgcmVnaXN0ZXIgc2l6ZV90IGxlbjsKLQotICAgICAgc3RyID0gZW50cnktPnJvb3Quc3RyaW5nOwotICAgICAgbGVuID0gc3RybGVuIChzdHIpICsgMTsKLQotICAgICAgaWYgKHhjb2ZmKQotCXsKLQkgIGJmZF9ieXRlIGJ1ZlsyXTsKLQotCSAgLyogVGhlIG91dHB1dCBsZW5ndGggaW5jbHVkZXMgdGhlIG51bGwgYnl0ZS4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCBsZW4sIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHN0ciwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0LWFvdXQuYyBiL2JmZC9ob3N0LWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NDNkYy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdC1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgbG9jYWwgaG9zdCdzIGEub3V0IGJpbmFyaWVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIFByb2JhYmx5IEpvaG4gR2lsbW9yZSdzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZQlBUkNIX1NJWkUJMzIKLQotLyogV2hlbiBwb3J0aW5nIHRvIGEgbmV3IHN5c3RlbSwgeW91IG11c3Qgc3VwcGx5OgotCi0JSE9TVF9QQUdFX1NJWkUJCShvcHRpb25hbCkKLQlIT1NUX1NFR01FTlRfU0laRQkob3B0aW9uYWwgLS0gZGVmYXVsdHMgdG8gcGFnZSBzaXplKQotCUhPU1RfTUFDSElORV9BUkNICShvcHRpb25hbCkKLQlIT1NUX01BQ0hJTkVfTUFDSElORQkob3B0aW9uYWwpCi0JSE9TVF9URVhUX1NUQVJUX0FERFIJKG9wdGlvbmFsKQotCUhPU1RfU1RBQ0tfRU5EX0FERFIJKG5vdCB1c2VkLCBleGNlcHQgYnkgdHJhZC1jb3JlID8/PykKLQlIT1NUX0JJR19FTkRJQU5fUAkocmVxdWlyZWQgLS0gZGVmaW5lIGlmIGJpZy1lbmRpYW4pCi0KLSAgIGluIHRoZSAuL2hvc3RzL2gtc3lzdGVtbmFtZS5oIGZpbGUuICAqLwotCi0jaWZkZWYgVFJBRF9IRUFERVIKLSNpbmNsdWRlIFRSQURfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9QQUdFX1NJWkUKLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQlIT1NUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfU0VHTUVOVF9TSVpFCi0jZGVmaW5lCVNFR01FTlRfU0laRQlIT1NUX1NFR01FTlRfU0laRQotI2Vsc2UKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1RFWFRfU1RBUlRfQUREUgotI2RlZmluZQlURVhUX1NUQVJUX0FERFIJSE9TVF9URVhUX1NUQVJUX0FERFIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1NUQUNLX0VORF9BRERSCi0jZGVmaW5lCVNUQUNLX0VORF9BRERSCUhPU1RfU1RBQ0tfRU5EX0FERFIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX0JJR19FTkRJQU5fUAotI2RlZmluZQlUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZWxzZQotI3VuZGVmICBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgSE9TVF9NQUNISU5FX0FSQ0gKLSNpZmRlZiBIT1NUX01BQ0hJTkVfTUFDSElORQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKGFiZmQsIGV4ZWNwKSBcCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgSE9TVF9NQUNISU5FX0FSQ0gsIEhPU1RfTUFDSElORV9NQUNISU5FKQotI2Vsc2UKLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChhYmZkLCBleGVjcCkgXAotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIEhPU1RfTUFDSElORV9BUkNILCAwKQotI2VuZGlmCi0jZW5kaWYgLyogSE9TVF9NQUNISU5FX0FSQ0ggKi8KLQotI2RlZmluZSBNWShPUCkgQ0FUKGhvc3RfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0IgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmggYi9iZmQvaG9zdHMvYWxwaGFsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI4ZDY5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMTA4MCBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oIGIvYmZkL2hvc3RzL2FscGhhdm1zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTM5MWEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2FscGhhdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBhbHBoYXZtcy5oIC0tIEJGRCBkZWZpbml0aW9ucyBmb3IgYW4gb3BlblZNUyBob3N0Ci0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKQotICAgb2YgcHJvR0lTIFNvZnR3YXJlZW50d2lja2x1bmcsIEFhY2hlbiwgR2VybWFueQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jaW5jbHVkZSA8dW5peGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0vKiBNYWtlIHRoZSBiYXNpYyB0eXBlcyA2NC1iaXQgcXVhbnRpdGllcyBvbiB0aGUgaG9zdC4KLSAgIEFsc28gcHJvdmlkZSB0aGUgc3VwcG9ydCBtYWNyb3MgQkZEIG5lZWRzLiAgKi8KLSMgaWZkZWYgX19HTlVDX18KLSMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZyBsb25nCi0jIGVsc2UKLSMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZwotIyBlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQgdWludDY0X3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBpbnQ2NF90eXBlOwotCi0jIGRlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jIGRlZmluZSBCWVRFU19JTl9QUklOVEZfSU5UIDQKLQotLyogVGhlc2UgbXVzdCBoYXZlIHR5cGUgdW5zaWduZWQgbG9uZyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYXMKLSAgIGFyZ3VtZW50cyBpbiBwcmludGYgZnVuY3Rpb25zLiAgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlTE9XKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotIyBkZWZpbmUgdWludDY0X3R5cGVISUdIKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jZW5kaWYgLyogQkZEX0hPU1RfNjRfQklUICovCi0KLSNpbmNsdWRlICJmb3Blbi12bXMuaCIKLQotI2RlZmluZSBOT19GQ05UTCAxCi0KLSNpZm5kZWYgT19BQ0NNT0RFCi0jZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKLSNlbmRpZgotCi1leHRlcm4gaW50IGdldHBhZ2VzaXplIFBBUkFNUyAoKHZvaWQpKTsKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmggYi9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODBjMTQzLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKiBIb3BlZnVsbHkgdGhpcyBzaG91bGQgaW5jbHVkZSBlaXRoZXIgbWFjaGluZS9wYXJhbS5oIChVbHRyaXgpIG9yCi0gICBtYWNoaW5lL21hY2hwYXJhbS5oIChNYWNoKSwgd2hpY2hldmVyIGlzIGl0cyBuYW1lIG9uIHRoaXMgc3lzdGVtLiAgKi8KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kZWx0YTY4LmggYi9iZmQvaG9zdHMvZGVsdGE2OC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZhNmU2Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kZWx0YTY4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgYSBNb3Rvcm9sYSBEZWx0YSAzMzAwIGJveCBydW5uaW5nIFN5c3RlbSBWIFIzLjAuCi0gICBDb250cmlidXRlZCBieSBtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZS4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBDCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfdHh0b3JnCi0jaWYgMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCTB4NDAwMDAwMDAKLSNlbHNlCi0vKiBVc2VyJ3Mgc3RhY2ssIGNvcGllZCBmcm9tIHN5cy9wYXJhbS5oICAqLwotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jZW5kaWYKLSNkZWZpbmUJVVBBR0VTCQkJVVNJWkUKLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYWJvcnQKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kcHgyLmggYi9iZmQvaG9zdHMvZHB4Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYzOTVmLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kcHgyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIERlZmluaXRpb25zIHRoYXQgYXJlIG5lZWRlZCBmb3IgY29yZSBmaWxlcy4gIENvcmUgc2VjdGlvbiBzaXplcyBmb3IKLSAgIHRoZSBEUFgyIGFyZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNkZWZpbmUgTkJQRyAxCi0jZGVmaW5lIFVQQUdFUyAoVVNJWkUgKiBOQlBQKQotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAodS51X2V4ZGF0YS51eF9kYXRvcmcpCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKFVTRVJTVEFDSykKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oIGIvYmZkL2hvc3RzL2hwMzAwYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Mjg3MTcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2hwMzAwYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaWZkZWYgQlNENF80Ci0jZGVmaW5lIE5PX0NPUkVfQ09NTUFORAotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwkvKiBEYXRhIHNlZyBzdGFydCBhZGRyIHJvdW5kcyB0byBOQlBHICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX202OGsKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCTAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJMHhmZmYwMDAwMAotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZic2QuaCBiL2JmZC9ob3N0cy9pMzg2YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWUzZDguLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEludGVsIDM4NiBydW5uaW5nIGFueSBCU0QgVW5peCAqLwotCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0vKiBSZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRCBkb24ndCBkZWZpbmUgTkJQRy4gICovCi0jaWZuZGVmIE5CUEcKLSNpZmRlZiBQQUdFX1NJWkUKLSNkZWZpbmUgTkJQRyBQQUdFX1NJWkUKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAotCi0vKiBKb2xpdHogc3VnZ2VzdGVkIGRlZmluaW5nIEhPU1RfU1RBQ0tfRU5EX0FERFIgdG8KLSAgICh1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9tYXhzYWRkciArIE1BWFNTSVopLCB3aGljaCBzaG91bGQgd29yayBvbgotICAgYm90aCBCU0RJIGFuZCAzODZCU0QsIGJ1dCB0aGF0IGlzIGJlbGlldmVkIG5vdCB0byB3b3JrIGZvciBCU0QgNC40LiAgKi8KLQotI2lmZGVmIF9fYnNkaV9fCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgQlNESS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSICgoYmZkX3ZtYSl1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9kYWRkcikKLSNlbHNlCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgMzg2QlNEIHJlbGVhc2UgMC4xLiAgKi8KLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJKFVTUlNUQUNLIC0gTUFYU1NJWikKLSNlbmRpZgotCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoY29yZV9iZmQpIFwKLSAgKChjb3JlX2JmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfc2lnKQotI2RlZmluZSB1X2NvbW0gdV9rcHJvYy5rcF9wcm9jLnBfY29tbQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZsaW51eC5oIGIvYmZkL2hvc3RzL2kzODZsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E1MWYxLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2bGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogTGludXggd3JpdGVzIHRoZSB0YXNrIHN0cnVjdHVyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlIGZpbGUuICBDdXJyZW50bHkgaXQKLSAgIGlzIDI5MTIgYnl0ZXMuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgc2hvdWxkIGJlIGEgcGlja2llciBjaGVjaywgYnV0Ci0gICB3ZSBzaG91bGQgcHJvYmFibHkgbm90IGJlIHRvbyBwaWNreSAodGhlIHNpemUgb2YgdGhlIHRhc2sgc3RydWN0dXJlIG1pZ2h0Ci0gICB2YXJ5LCBhbmQgaWYgaXQncyBub3QgdGhlIGxlbmd0aCB3ZSBleHBlY3QgaXQgdG8gYmUsIGl0IGRvZXNuJ3QgYWZmZWN0Ci0gICBvdXIgYWJpbGl0eSB0byBwcm9jZXNzIHRoZSBjb3JlIGZpbGUpLiAgU28gYWxsb3cgMC00MDk2IGV4dHJhIGJ5dGVzIGF0Ci0gICB0aGUgZW5kLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VEIDQwOTYKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bWFjaDMuaCBiL2JmZC9ob3N0cy9pMzg2bWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjNjFlMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIFRoaXMgaXMgYW4gdWdseSB3YXkgdG8gaGFjayBhcm91bmQgdGhlIGluY29ycmVjdAotICogZGVmaW5pdGlvbiBvZiBVUEFHRVMgaW4gaTM4Ni9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLUZJWE1FISEgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2c2NvLmggYi9iZmQvaG9zdHMvaTM4NnNjby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg2MDhjLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2c2NvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBDb3JlIGZpbGUgc3R1ZmYuICBBdCBsZWFzdCBzb21lLCBwZXJoYXBzIGFsbCwgb2YgdGhlIGZvbGxvd2luZwotICAgZGVmaW5lcyB3b3JrIG9uIG1hbnkgbW9yZSBzeXN0ZW1zIHRoYW4ganVzdCBTQ08uICAqLwotCi0jZGVmaW5lIE5CUEcgTkJQQwotI2RlZmluZSBVUEFHRVMgVVNJWkUKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUgSE9TVF9TVEFDS19TVEFSVF9BRERSIHUudV9zdWIKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoY29yZV91cGFnZShhYmZkKS0+dV9zeXNhYm9ydCAhPSAwKSBcCi0gICA/IGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgXAotICAgOiAtMSkKLQotLyogQWNjb3JkaW5nIHRvIHRoZSBtYW5wYWdlLCBhIHZlcnNpb24gMiBTQ08gY29yZWZpbGUgY2FuIGNvbnRhaW4KLSAgIHZhcmlvdXMgYWRkaXRpb25hbCBzZWN0aW9ucyAoaXQgaXMgY2xldmVybHkgYXJyYW5nZWQgc28gdGhlIHUgYXJlYSwKLSAgIGRhdGEsIGFuZCBzdGFjayBhcmUgZmlyc3Qgd2hlcmUgd2UgY2FuIGZpbmQgdGhlbSkuICBTbyB3aXRob3V0Ci0gICB3cml0aW5nIGxvdHMgb2YgY29kZSB0byBwYXJzZSBhbGwgdGhlaXIgaGVhZGVycyBhbmQgc3R1ZmYsIHdlIGNhbid0Ci0gICBrbm93IHdoZXRoZXIgYSBjb3JlZmlsZSBpcyBiaWdnZXIgdGhhbiBpdCBzaG91bGQgYmUuICAqLwotCi0jZGVmaW5lIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRSAxCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTg2MG1hY2gzLmggYi9iZmQvaG9zdHMvaTg2MG1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDJhYTEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2bWFjaDMuaCAgIFtkb2xhbkBzc2QuaW50ZWwuY29tXSAqLwotCi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIFRoaXMgaXMgYW4gdWdseSB3YXkgdG8gaGFjayBhcm91bmQgdGhlIGluY29ycmVjdAotICogZGVmaW5pdGlvbiBvZiBVUEFHRVMgaW4gaTM4Ni9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLUZJWE1FISEgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTg2MAotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrYXV4LmggYi9iZmQvaG9zdHMvbTY4a2F1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM3NzU1Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tNjhrYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgYW4gQXBwbGUgTWFjaW50b3NoIHJ1bm5pbmcgQS9VWCAzLnguICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFnZS5oPgotCi0vKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRyYWQtY29yZS5jLiAgKi8KLSNkZWZpbmUJTkJQRwkJCU5CUFAKLQotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCTB4MTAwMDAwMDAwCi0KLSNkZWZpbmUJVVBBR0VTCQkJVVNJWkUKLQotI2RlZmluZQlUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYXJnWzBdKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL202OGtsaW51eC5oIGIvYmZkL2hvc3RzL202OGtsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY3ZGZhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tNjhrbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogTGludXggZHVtcHMgInN0cnVjdCB0YXNrX3N0cnVjdCIgYXQgdGhlIGVuZCBvZiB0aGUgY29yZS1maWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGN1cnJlbnRseSAyNTEyIGJ5dGVzIGxvbmcsIGJ1dCB3ZSBhbGxvdyB1cCB0byA0MDk2Ci0gICBieXRlcyB0byBhbGxvdyBmb3Igc29tZSBmdXR1cmUgZ3Jvd3RoLiAgKi8KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAkJNDA5NgotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKChhYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUuc2lnbmFsKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL204OGttYWNoMy5oIGIvYmZkL2hvc3RzL204OGttYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE1NTM4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI3VuZGVmIFVQQUdFUwotI2RlZmluZSBVUEFHRVMgMwotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbTg4awotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9taXBzYnNkLmggYi9iZmQvaG9zdHMvbWlwc2JzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmZhZDIxLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9taXBzYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI3VuZGVmIEFMSUdOCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAtLSB3ZSB1c2UgSE9TVF9EQVRBX1NUQVJUX0FERFIgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotLyogI2RlZmluZQlIT1NUX01BQ0hJTkVfTUFDSElORQkgKi8KLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9taXBzbWFjaDMuaCBiL2JmZC9ob3N0cy9taXBzbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjNDY4ZC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHICAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJVVNSREFUQQotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbmV3cy1taXBzLmggYi9iZmQvaG9zdHMvbmV3cy1taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzk5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0KLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbWlwcwotCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIFVTUlRFWFQKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgVVNSREFUQQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIFVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbmV3cy5oIGIvYmZkL2hvc3RzL25ld3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3OTQ2Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbmV3cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vKiBTb255IE5ld3MgcnVubmluZyBOZXdzT1MgMy4yLiAgKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lIEhPU1RfUEFHRV9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9TRUdNRU5UX1NJWkUgTkJQRwotI2RlZmluZSBIT1NUX01BQ0hJTkVfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAoS0VSTkJBU0UgLSAoVVBBR0VTICogTkJQRykpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcGM1MzJtYWNoLmggYi9iZmQvaG9zdHMvcGM1MzJtYWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTZmNTkuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIG5zNTMyL21hY2hwYXJhbS5oLgotICoKLSAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCi0gKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAotICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKLSAqIGZvciBuczUzMiwgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLSNlcnJvciBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9yaXNjb3MuaCBiL2JmZC9ob3N0cy9yaXNjb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYTgyNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvcmlzY29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKiBSSVNDL29zIDQuNTJDLCBhbmQgcHJlc3VtYWJseSBvdGhlciB2ZXJzaW9ucy4gICovCi0KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL21hY2hwYXJhbS5oPgotI2luY2x1ZGUgPGJzZDQzL21hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lIE5CUEcgQlNENDNfTkJQRwotI2RlZmluZSBVUEFHRVMgQlNENDNfVVBBR0VTCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIEJTRDQzX1VTUlRFWFQKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgQlNENDNfVVNSREFUQQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIEJTRDQzX1VTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvc3ltbWV0cnkuaCBiL2JmZC9ob3N0cy9zeW1tZXRyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTcxN2IzLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9zeW1tZXRyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogU3ltbWV0cnkgcnVubmluZyBlaXRoZXIgZHluaXggMy4xIChic2QpIG9yIHB0eCAoc3lzdikuICAqLwotCi0jZGVmaW5lIE5CUEcgNDA5NgotI2RlZmluZSBVUEFHRVMgMQotCi0jaWZkZWYgX1NFUVVFTlRfCi0vKiBwdHggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmUwMDAKLSNkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUICgoVVBBR0VTICogTkJQRykgLSBzaXplb2YgKHN0cnVjdCB1c2VyKSkKLSNlbHNlCi0vKiBkeW5peCAqLwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAweDEwMDAKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKE5CUEcgKiB1LnVfdHNpemUpCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgMHgzZmZmZjAwMAotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKLSNlbmRpZgotCi0jZGVmaW5lIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3RhaG9lLmggYi9iZmQvaG9zdHMvdGFob2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2Y2VlMi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECi0KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF90YWhvZQotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkoS0VSTkJBU0UgLSAoVVBBR0VTICogTkJQRykpCi0jZGVmaW5lCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4YnNkLmggYi9iZmQvaG9zdHMvdmF4YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjljY2UuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2RlZmluZQlOT19DT1JFX0NPTU1BTkQJCS8qIE5vIGNvbW1hbmQgbmFtZSBpbiBjb3JlIGZpbGUgKi8KLQotI2lmIDAKLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0vKiBEb2VzIG5vdCBleGlzdCBvbiBCU0QgNC4zLCBpdCB1c2VzIG1hY2hpbmUvbWFjaHBhcmFtLmguCi0gICBXaGF0ZXZlciBpdCBpcywgaXQncyBpbmNsdWRlZCBieSA8c3lzL3BhcmFtLmg+LCB3aGljaCB0cmFkLWNvcmUuYywKLSAgIHRoZSBvbmx5IHBsYWNlIHRoYXQgdXNlcyB0aGlzIChJIHRoaW5rKSwgYWxyZWFkeSBpbmNsdWRlcy4gICovCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2VuZGlmCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotCi0vKiBOb3RlIHRoYXQgSE9TVF9QQUdFX1NJWkUgLS0gdGhlIHBhZ2Ugc2l6ZSBhcyBmYXIgYXMgZXhlY3V0YWJsZSBmaWxlcwotICAgYXJlIGNvbmNlcm5lZCAtLSBpcyBub3QgdGhlIHNhbWUgYXMgTkJQRywgYmVjYXVzZSBvZiBwYWdlIGNsdXN0ZXJpbmcuICAqLwotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMTAyNAotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKDB4ODAwMDAwMDAgLSAoVVBBR0VTICogTkJQRykpCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy92YXh1bHQuaCBiL2JmZC9ob3N0cy92YXh1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3MzFiNy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdmF4dWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkoTkJQRypDTFNJWkUpCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3ZheAotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0Mi5oIGIvYmZkL2hvc3RzL3ZheHVsdDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3MzFiNy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdmF4dWx0Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hwMzAwYnNkLmMgYi9iZmQvaHAzMDBic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2N2IxOC4uMDAwMDAwMAotLS0gYS9iZmQvaHAzMDBic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFAgOTAwMC8zMDAgKDY4MDAwLWJhc2VkKSBtYWNoaW5lcyBydW5uaW5nIEJTRCBVbml4LgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0KLSNkZWZpbmUgTVkoT1ApIENBVChocDMwMGJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWhwMzAwYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGhwdXguYyBiL2JmZC9ocDMwMGhwdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiZmVhMC4uMDAwMDAwMAotLS0gYS9iZmQvaHAzMDBocHV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGhwLXV4IDkwMDAvMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5NCwgOTUsIDk3LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgR2xlbm4gRW5nZWwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotICAgIGhwdXggbmF0aXZlICAtLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBocDMwMGhwdXggYmZkIHwgLS0tLS0tLS0tLT4gaHB1eCB3L2dudSBleHQKLSAgICBocHV4IHcvZ251IGV4dGVuc2lvbiAtLS0tPiB8ICAgICAgICAgICAgICAgfAotCi0KLSAgICBTdXBwb3J0IGZvciB0aGUgOTAwMC9bMzRdMDAgaGFzIHNldmVyYWwgbGltaXRhdGlvbnMuCi0gICAgICAxLiBTaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgMi4gVGhlIG91dHB1dCBmb3JtYXQgZnJvbSB0aGlzIGJmZCBpcyBub3QgdXNhYmxlIGJ5IG5hdGl2ZSB0b29scy4KLQotICAgIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHdyaXRpbmcgdGhpcyBiZmQgd2FzIHRvIGFsbG93IHVzZSBvZgotICAgIGdkYiBhbmQgZ2NjIGZvciBob3N0IGJhc2VkIGRlYnVnZ2luZyBhbmQgbm90IHRvIG1pbWljIHRoZSBocC11eCB0b29scwotICAgIGluIGV2ZXJ5IGRldGFpbC4gIFRoaXMgbGVhZHMgdG8gYSBzaWduaWZpY2FudCBzaW1wbGlmaWNhdGlvbiBvZiB0aGUKLSAgICBjb2RlIGFuZCBhIGxlYXAgaW4gcGVyZm9ybWFuY2UuICBUaGUgZGVjaXNpb24gdG8gbm90IG91dHB1dCBocCBuYXRpdmUKLSAgICBjb21wYXRpYmxlIG9iamVjdHMgd2FzIGZ1cnRoZXIgc3RyZW5ndGhlbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHJpY2huZXNzCi0gICAgb2YgdGhlIGdjYyBjb21waWxlZCBvYmplY3RzIGNvdWxkIG5vdCBiZSByZXByZXNlbnRlZCB3aXRob3V0IGxvc3Mgb2YKLSAgICBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCB3aGlsZSB0aGUgaHAgZm9ybWF0IHN1cHBvcnRzIHRoZSBjb25jZXB0IG9mCi0gICAgc2Vjb25kYXJ5IHN5bWJvbHMsIGl0IGRvZXMgbm90IHN1cHBvcnQgaW5kaXJlY3Qgc3ltYm9scy4gIEFub3RoZXIKLSAgICByZWFzb24gaXMgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBpbXBsZW1lbnRhdGlvbnMKLSAgICBvZiBnY2Mgb24gaHB1eCB3aGljaCB1c2VkICdocHh0JyB0byB0cmFuc2xhdGUgLmEgYW5kIC5vIGZpbGVzIGludG8gYQotICAgIGZvcm1hdCB3aGljaCBjb3VsZCBiZSByZWFkaWx5IHVuZGVyc3Rvb2QgYnkgdGhlIGdudSBsaW5rZXIgYW5kIGdkYi4KLSAgICBUaGlzIGFsbG93cyByZWFkaW5nIGhwIHNlY29uZGFyeSBzeW1ib2xzIGFuZCBjb252ZXJ0aW5nIHRoZW0gaW50bwotICAgIGluZGlyZWN0IHN5bWJvbHMgYnV0IHRoZSByZXZlcnNlIGl0IG5vdCBhbHdheXMgcG9zc2libGUuCi0KLSAgICBBbm90aGVyIGV4YW1wbGUgb2YgZGlmZmVyZW5jZXMgaXMgdGhhdCB0aGUgaHAgZm9ybWF0IHN0b3JlcyBzeW1ib2wgb2Zmc2V0cwotICAgIGluIHRoZSBvYmplY3QgY29kZSB3aGlsZSB0aGUgZ251IHV0aWxpdGllcyB1c2UgYSBmaWVsZCBpbiB0aGUKLSAgICByZWxvY2F0aW9uIHJlY29yZCBmb3IgdGhpcy4gIFRvIHN1cHBvcnQgdGhlIGhwIG5hdGl2ZSBmb3JtYXQsIHRoZSBvYmplY3QKLSAgICBjb2RlIHdvdWxkIG5lZWQgdG8gYmUgcGF0Y2hlZCB3aXRoIHRoZSBvZmZzZXRzIHdoZW4gcHJvZHVjaW5nIC5vIGZpbGVzLgotCi0gICAgVGhlIGJhc2ljIHRlY2huaXF1ZSB0YWtlbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvICNpbmNsdWRlIHRoZSBjb2RlCi0gICAgZnJvbSBhb3V0eC5oIGFuZCBhb3V0LXRhcmdldC5oIHdpdGggYXBwcm9wcmlhdGUgI2RlZmluZXMgdG8gb3ZlcnJpZGUKLSAgICBjb2RlIHdoZXJlIGEgdW5pcXVlIGltcGxlbWVudGF0aW9uIGlzIG5lZWRlZDoKLQotICAgIHsKLSAgICAgICAgI2RlZmluZSBhIGJ1bmNoIG9mIHN0dWZmCi0gICAgICAgICNpbmNsdWRlIDxhb3V0eC5oPgotCi0gICAgICAgIGltcGxlbWVudCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucwotCi0gICAgICAgICNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotICAgIH0KLQotICAgIFRoZSBocCBzeW1ib2wgdGFibGUgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gb3RoZXIgYS5vdXQgdGFyZ2V0cy4gIEluc3RlYWQKLSAgICBvZiBoYXZpbmcgYW4gYXJyYXkgb2Ygbmxpc3QgaXRlbXMgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MsIGhwJ3MgZm9ybWF0Ci0gICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgICBub3QgbnVsbCB0ZXJtaW5hdGVkLiAgSXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICAgIG5saXN0IGVsZW1lbnQgMQotICAgIHN0cmluZzEKLSAgICBubGlzdCBlbGVtZW50IDIKLSAgICBzdHJpbmcyCi0gICAgLi4uCi0KLSAgICBUaGUgd2hvbGUgc3ltYm9sIHRhYmxlIGlzIHJlYWQgYXMgb25lIGNodW5rIGFuZCB0aGVuIHdlIG1hcmNoIHRocnUgaXQKLSAgICBhbmQgY29udmVydCBpdCB0byBjYW5vbmljYWwgZm9ybS4gIEFzIHdlIG1hcmNoIHRocnUgdGhlIHRhYmxlLCB3ZSBjb3B5Ci0gICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgIHRlcm1pbmF0ZSB0aGVtLCB1c2luZyBzdG9yYWdlIGZyb20gdGhlIGFscmVhZHkgYWxsb2NhdGVkIHN5bWJvbCB0YWJsZToKLQotICAgIHN0cmluZzEKLSAgICBudWxsCi0gICAgc3RyaW5nMgotICAgIG51bGwKLSAqLwotCi0vKiBAQCBJcyB0aGlzIHJlYWxseSBzbyBkaWZmZXJlbnQgZnJvbSBub3JtYWwgYS5vdXQgdGhhdCBpdCBuZWVkcyB0byBpbmNsdWRlCi0gICBhb3V0eC5oPyAgV2Ugc2hvdWxkIGdvIHRocm91Z2ggdGhpcyBmaWxlIHNvbWV0aW1lIGFuZCBzZWUgd2hhdCBjYW4gYmUgbWFkZQotICAgbW9yZSBkZXBlbmRlbnQgb24gYW91dDMyLm8gYW5kIHdoYXQgbWlnaHQgbmVlZCB0byBiZSBicm9rZW4gb2ZmIGFuZCBhY2Nlc3NlZAotICAgdGhyb3VnaCB0aGUgYmFja2VuZF9kYXRhIGZpZWxkLiAgT3IsIG1heWJlIHdlIHJlYWxseSBkbyBuZWVkIHN1Y2ggYQotICAgY29tcGxldGVseSBzZXBhcmF0ZSBpbXBsZW1lbnRhdGlvbi4gIEkgZG9uJ3QgaGF2ZSB0aW1lIHRvIGludmVzdGlnYXRlIHRoaXMKLSAgIG11Y2ggZnVydGhlciByaWdodCBub3cuICBbcmFlYnVybjoxOTkzMDQyOC4yMTI0RVNUXSAqLwotLyogQEAgQWxzbywgbm90ZSB0aGF0IHRoZXJlIHdpbmQgdXAgYmVpbmcgdHdvIHZlcnNpb25zIG9mIHNvbWUgcm91dGluZXMsIHdpdGgKLSAgIGRpZmZlcmVudCBuYW1lcywgb25seSBvbmUgb2Ygd2hpY2ggYWN0dWFsbHkgZ2V0cyB1c2VkLiAgRm9yIGV4YW1wbGU6Ci0Jc2x1cnBfc3ltYm9sX3RhYmxlCi0Jc3dhcF9zdGRfcmVsb2NfaW4KLQlzbHVycF9yZWxvY190YWJsZQotCWdldF9zeW10YWIKLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0JY2Fub25pY2FsaXplX3JlbG9jCi0JbWtvYmplY3QKLSAgIFRoaXMgc2hvdWxkIGFsc28gYmUgZml4ZWQuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWhwMzAwaHB1eCIKLSNkZWZpbmUgTVkoT1ApIENBVChocDMwMGhwdXhfLE9QKQotCi0jZGVmaW5lIGV4dGVybmFsX2V4ZWMgaHAzMDBocHV4X2V4ZWNfYnl0ZXMKLSNkZWZpbmUgZXh0ZXJuYWxfbmxpc3QgaHAzMDBocHV4X25saXN0X2J5dGVzCi0KLSNpbmNsdWRlICJhb3V0L2hwMzAwaHB1eC5oIgotCi0vKiBkZWZpbmUgdGhlc2Ugc28gd2UgY2FuIGNvbXBpbGUgdW51c2VkIHJvdXRpbmVzIGluIGFvdXR4LmggKi8KLSNkZWZpbmUgZV9zdHJ4ICBlX3NobGliCi0jZGVmaW5lIGVfb3RoZXIgZV9sZW5ndGgKLSNkZWZpbmUgZV9kZXNjICBlX2FsbW9kCi0KLSNkZWZpbmUgQVJfUEFEX0NIQVIgJy8nCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcHJvdmlkZSBvdmVycmlkZXMgZm9yIHJvdXRpbmVzIGluIHRoaXMgZmlsZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGhlc2UgZG9uJ3QgdXNlIE1ZIGJlY2F1c2UgdGhhdCBjYXVzZXMgcHJvYmxlbXMgd2l0aGluIEpVTVBfVEFCTEUKLSAgIChDQVQgd2luZHMgdXAgYmVpbmcgZXhwYW5kZWQgcmVjdXJzaXZlbHksIHdoaWNoIEFOU0kgQyBjb21waWxlcnMKLSAgIHdpbGwgbm90IGRvKS4gICovCi0jZGVmaW5lIE1ZX2dldF9zeW10YWIgaHAzMDBocHV4X2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBocDMwMGhwdXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgaHAzMDBocHV4X2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaHAzMDBocHV4X3dyaXRlX29iamVjdF9jb250ZW50cwotCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfZmluYWxfbGlua19jYWxsYmFjayB1bnVzZWQKLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQotLyogVW50aWwgYW5kIHVubGVzcyB3ZSBjb252ZXJ0IHRoZSBzbHVycF9yZWxvYyBhbmQgc2x1cnBfc3ltdGFiCi0gICByb3V0aW5lcyBpbiB0aGlzIGZpbGUsIHdlIGNhbiBub3QgdXNlIHRoZSBkZWZhdWx0IGFvdXQKLSAgIGZyZWVfY2FjaGVkX2luZm8gcm91dGluZSB3aGljaCBhc3N1bWVzIHRoYXQgdGhlIHJlbG9jcyBhbmQgc3ltdGFicwotICAgd2VyZSBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jLiAgKi8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKLQotI2RlZmluZSBocDMwMGhwdXhfd3JpdGVfc3ltcyBhb3V0XzMyX3dyaXRlX3N5bXMKLQotI2RlZmluZSBNWV9jYWxsYmFjayBNWShjYWxsYmFjaykKLQotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAweDIKLQotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShocDMwMGhwdXhfMzJfLHN3YXBfZXhlY19oZWFkZXJfaW4pCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9VTkRFRklORUQJMHgwMAotI2RlZmluZSBIUF9TWU1UWVBFX0FCU09MVVRFCTB4MDEKLSNkZWZpbmUgSFBfU1lNVFlQRV9URVhUCQkweDAyCi0jZGVmaW5lIEhQX1NZTVRZUEVfREFUQQkJMHgwMwotI2RlZmluZSBIUF9TWU1UWVBFX0JTUwkJMHgwNAotI2RlZmluZSBIUF9TWU1UWVBFX0NPTU1PTgkweDA1Ci0KLSNkZWZpbmUgSFBfU1lNVFlQRV9UWVBFCQkweDBGCi0jZGVmaW5lIEhQX1NZTVRZUEVfRklMRU5BTUUJMHgxRgotCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUxJR04JMHgxMAotI2RlZmluZSBIUF9TWU1UWVBFX0VYVEVSTkFMCTB4MjAKLSNkZWZpbmUgSFBfU0VDT05EQVJZX1NZTUJPTCAgICAgMHg0MAotCi0vKiBSRUxPQ0FUSU9OIERFRklOSVRJT05TICovCi0jZGVmaW5lIEhQX1JTRUdNRU5UX1RFWFQJMHgwMAotI2RlZmluZSBIUF9SU0VHTUVOVF9EQVRBCTB4MDEKLSNkZWZpbmUgSFBfUlNFR01FTlRfQlNTCQkweDAyCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0VYVEVSTkFMCTB4MDMKLSNkZWZpbmUgSFBfUlNFR01FTlRfUENSRUwgICAgICAgMHgwNAotI2RlZmluZSBIUF9SU0VHTUVOVF9SRExUICAgICAgICAweDA1Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JQTFQgICAgICAgIDB4MDYKLSNkZWZpbmUgSFBfUlNFR01FTlRfTk9PUAkweDNGCi0KLSNkZWZpbmUgSFBfUkxFTkdUSF9CWVRFCQkweDAwCi0jZGVmaW5lIEhQX1JMRU5HVEhfV09SRAkJMHgwMQotI2RlZmluZSBIUF9STEVOR1RIX0xPTkcJCTB4MDIKLSNkZWZpbmUgSFBfUkxFTkdUSF9BTElHTgkweDAzCi0KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaHAzMDBocHV4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgQk1BR0lDIEhQVVhfRE9UX09fTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAzMTQKLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLS8qIFNpbmNlIHRoZSBocHV4IHN5bWJvbCB0YWJsZSBoYXMgbmxpc3QgZWxlbWVudHMgaW50ZXJzcGVyc2VkIHdpdGgKLSAgIHN0cmluZ3MgYW5kIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbSBzdHJpbmdzIGZvciBzZWNvbmRhcnkgc3ltYm9scywgd2UKLSAgIGdpdmUgb3Vyc2VsdmVzIGEgbGl0dGxlIGV4dHJhIHBhZGRpbmcgdXAgZnJvbnQgdG8gYWNjb3VudCBmb3IKLSAgIHRoaXMuICBOb3RlIHRoYXQgZm9yIGVhY2ggbm9uLXNlY29uZGFyeSBzeW1ib2wgd2UgcHJvY2Vzcywgd2UgZ2FpbgotICAgOSBieXRlcyBvZiBzcGFjZSBmb3IgdGhlIGRpc2NhcmRlZCBubGlzdCBlbGVtZW50IChvbmUgYnl0ZSB1c2VkIGZvcgotICAgbnVsbCkuICBTWU1fRVhUUkFfQllURVMgaXMgdGhlIGV4dHJhIHNwYWNlLiAgKi8KLSNkZWZpbmUgU1lNX0VYVFJBX0JZVEVTICAgMTAyNAotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkgKGNhbGxiYWNrKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFICgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUiAoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IE5fQlNTQUREUiAoKmV4ZWNwKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0jaWZkZWYgU0VUX0FSQ0hfTUFDSAotICBTRVRfQVJDSF9NQUNIIChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0dOVV9UUkVMT0ZGICgqZXhlY3ApOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX0dOVV9TWU1PRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgKyBleGVjcC0+YV9zeW1zKTsKLQotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIDEyOwotICAgICAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IDEyOwotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkgKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsJLyogZHVtbXkgdmFycyAqLwotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICBtZW1zZXQgKCZleGVjX2J5dGVzLCAwLCBzaXplb2YgKGV4ZWNfYnl0ZXMpKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBpZiAoYWRhdGEgKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykKLSAgICBOQU1FIChhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0gIGV4ZWNwLT5hX3N5bXMgPSAwOwotCi0gIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLQkJICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLQkJICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIDB4Yyk7Ci0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotCi0gIE5BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwotCi0gIC8qIHVwZGF0ZSBmaWVsZHMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBzd2FwX2V4ZWNfaGVhZGVyX291dCAqLwotCi0gIC8qIHRoaXMgaXMgcmVhbGx5IHRoZSBzeW0gdGFibGUgc2l6ZSBidXQgd2Ugc3RvcmUgaXQgaW4gZHJlbG9jcyAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogMTIsIGV4ZWNfYnl0ZXMuZV9kcmVsb2NzKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBmYWxzZSkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJiBleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMsIGFuZCB0aGVuIHRoZSByZWxvY3MuICBXZSBtdXN0IHdyaXRlIG91dAotICAgICAgIHRoZSBzeW1ib2xzIGZpcnN0IHNvIHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGluZGljZXMuICAqLwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNraXAgdGhlIHJlbG9jcyB0byB3aGVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgc3ltYm9scy4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgTl9EUkVMT0ZGICgqZXhlY3ApICsgZXhlY3AtPmFfZHJzaXplLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoIU1ZICh3cml0ZV9zeW1zKSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGxvbmcpIChOX1RSRUxPRkYgKCpleGVjcCkpLCBmYWxzZSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU5BTUUgKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGxvbmcpIChOX0RSRUxPRkYgKCpleGVjcCkpLCBmYWxzZSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU5BTUUgKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIGNvbnZlcnQgdGhlIGhwIHN5bWJvbCB0eXBlIHRvIGJlIHRoZSBzYW1lIGFzIGFvdXQ2NC5oIHVzYWdlIHNvIHdlICovCi0vKiBjYW4gcGlnZ3liYWNrIHJvdXRpbmVzIGluIGFvdXR4LmguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1zdGF0aWMgdm9pZAotY29udmVydF9zeW1fdHlwZSAoc3ltX3BvaW50ZXIsIGNhY2hlX3B0ciwgYWJmZCkKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Ci0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgbmFtZV90eXBlOwotICBpbnQgbmV3X3R5cGU7Ci0KLSAgbmFtZV90eXBlID0gKGNhY2hlX3B0ci0+dHlwZSk7Ci0gIG5ld190eXBlID0gMDsKLQotICBpZiAoKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfQUxJR04pICE9IDApCi0gICAgewotICAgICAgLyogaW91X2Vycm9yICgiYWxpZ25lZCBzeW1ib2wgZW5jb3VudGVyZWQ6ICVzIiwgbmFtZSk7Ki8KLSAgICAgIG5hbWVfdHlwZSA9IDA7Ci0gICAgfQotCi0gIGlmIChuYW1lX3R5cGUgPT0gSFBfU1lNVFlQRV9GSUxFTkFNRSkKLSAgICBuZXdfdHlwZSA9IE5fRk47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfVFlQRSkKLQl7Ci0JY2FzZSBIUF9TWU1UWVBFX1VOREVGSU5FRDoKLQkgIG5ld190eXBlID0gTl9VTkRGOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQUJTT0xVVEU6Ci0JICBuZXdfdHlwZSA9IE5fQUJTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfVEVYVDoKLQkgIG5ld190eXBlID0gTl9URVhUOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfREFUQToKLQkgIG5ld190eXBlID0gTl9EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQlNTOgotCSAgbmV3X3R5cGUgPSBOX0JTUzsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0NPTU1PTjoKLQkgIG5ld190eXBlID0gTl9DT01NOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9FWFRFUk5BTCkKLQluZXdfdHlwZSB8PSBOX0VYVDsKLQotICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NFQ09OREFSWV9TWU1CT0wpCi0JewotCSAgc3dpdGNoIChuZXdfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGVuIGp1c3QgdHJlYXQgdGhpcyBhcyBhCi0gICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBjb3JyZWN0IGluCi0gICAgICAgICAgICAgICAgIGFsbCBjYXNlcywgYnV0IGl0IGlzIG1vcmUgY29ycmVjdCB0aGFuIHRyZWF0aW5nIGl0IGFzCi0gICAgICAgICAgICAgICAgIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPT0gMCkKLQkJbmV3X3R5cGUgPSBOX1dFQUtVOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtBOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLVDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBjYWNoZV9wdHItPnR5cGUgPSBuZXdfdHlwZTsKLQotfQotCi0KLS8qCi1ERVNDUklQVElPTgotICAgICAgICBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdwotICAgICAgICBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyCi0gICAgICAgIHN0cnVjdHVyZS4KLSovCi0KLXZvaWQKLU5BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKikgcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogY2hlY2sgdGhlIGhlYWRlciB0byBzZWUgaWYgaXQgd2FzIGdlbmVyYXRlZCBieSBhIGJmZCBvdXRwdXQgKi8KLSAgLyogdGhpcyBpcyBkZXRlY3RlZCByYXRoZXIgYml6YXJlbHkgYnkgcmVxdWlyaW5nIGEgYnVuY2ggb2YgICAgKi8KLSAgLyogaGVhZGVyIGZpZWxkcyB0byBiZSB6ZXJvIGFuZCBhbiBvbGQgdW51c2VkIGZpZWxkIChub3cgdXNlZCkgKi8KLSAgLyogdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZG8KLSAgICB7Ci0gICAgICBsb25nIHN5bXM7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfcGFzc2l6ZSkgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zdXBzaXplKSAhPSAwKQotCWJyZWFrOwotCi0gICAgICBzeW1zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9kcmVsb2NzKTsKLSAgICAgIGlmIChzeW1zID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIE9LLCB3ZSd2ZSBwYXNzZWQgdGhlIHRlc3QgYXMgYmVzdCBhcyB3ZSBjYW4gZGV0ZXJtaW5lICovCi0gICAgICBleGVjcC0+YV9zeW1zID0gc3ltczsKLQotICAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3Igd2hlcmUgd2Ugd2lsbCBzdG9yZSB0aGlzIHJlc3VsdCAqLwotICAgICAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnJhd3B0cikpOwotCi0gICAgICBpZiAocmF3cHRyID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICAgICAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IGdudV9lbmNhcF9mb3JtYXQ7Ci0gICAgfQotICB3aGlsZSAoMCk7Ci19Ci0KLQotLyogVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgb2YgaGF2aW5nIGFuIGFycmF5IG9mIG5saXN0IGl0ZW1zIGFuZCBhbiBhcnJheSBvZiBzdHJpbmdzLCBocCdzIGZvcm1hdAotICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICBubGlzdCBlbGVtZW50IDEKLSAgIHN0cmluZzEKLSAgIG5saXN0IGVsZW1lbnQgMgotICAgc3RyaW5nMgotICAgLi4uCi0KLSAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgYW5kIGNvbnZlcnQgaXQgdG8gY2Fub25pY2FsIGZvcm0uICBBcyB3ZSBtYXJjaCB0aHJ1IHRoZSB0YWJsZSwgd2UgY29weQotICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICBzdHJpbmcxCi0gICBudWxsCi0gICBzdHJpbmcyCi0gICBudWxsCi0gICAuLi4KLSovCi0KLWJvb2xlYW4KLU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltYm9sX2J5dGVzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICB1bnNpZ25lZCBudW1fc3ltcyA9IDA7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3ltYm9sX2J5dGVzID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQlzeW1ib2xfYnl0ZXMgKyBTWU1fRVhUUkFfQllURVMpOwotICBpZiAoIXN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1zID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoc3RyaW5ncyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzeW1zLCBzeW1ib2xfYnl0ZXMsIDEsIGFiZmQpICE9IHN5bWJvbF9ieXRlcykKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgc3ltX2VuZCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1zKSArIHN5bWJvbF9ieXRlcyk7Ci0KLSAgLyogZmlyc3QsIG1hcmNoIHRocnUgdGhlIHRhYmxlIGFuZCBmaWd1cmUgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhlcmUgYXJlICovCi0gIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zOyBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIG51bV9zeW1zKyspCi0gICAgewotICAgICAgLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0gICAgICBzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkgICAgICAgc3ltX3BvaW50ZXItPmVfbGVuZ3RoWzBdKTsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGNvdW50LCB1cGRhdGUgdGhlIGJmZCBoZWFkZXIgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1fc3ltczsKLQotICBjYWNoZWQgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpOwotICBpZiAoY2FjaGVkID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXMgd2UgbWFyY2ggdGhydSB0aGUgaHAgc3ltYm9sIHRhYmxlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mCi0gICAgIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHRvIGhvbGQgdGhlIHN5bWJvbCBuYW1lcy4gIE1ha2Ugc3VyZSBhbnkKLSAgICAgYXNzaWdubWVudCB0byB0aGUgc3RyaW5ncyBwb2ludGVyIGlzIGRvbmUgYWZ0ZXIgd2UncmUgdGhydSB1c2luZwotICAgICB0aGUgbmxpc3Qgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGFueXRoaW5nIGltcG9ydGFudC4gKi8KLQotICAvKiBPSywgbm93IHdhbGsgdGhlIG5ldyBzeW10YWJsZSwgY2FjaGVpbmcgc3ltYm9sIHByb3BlcnRpZXMgKi8KLSAgewotICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0ciA9IGNhY2hlZDsKLSAgICBhb3V0X3N5bWJvbF90eXBlIGNhY2hlX3NhdmU7Ci0gICAgLyogUnVuIHRocm91Z2ggdGFibGUgYW5kIGNvcHkgdmFsdWVzICovCi0gICAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXMsIGNhY2hlX3B0ciA9IGNhY2hlZDsKLQkgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBjYWNoZV9wdHIrKykKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCWNhY2hlX3B0ci0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCWNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCBzeW1fcG9pbnRlci0+ZV92YWx1ZSk7Ci0JY2FjaGVfcHRyLT5kZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3ltX3BvaW50ZXItPmVfYWxtb2QpOwotCWNhY2hlX3B0ci0+dHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdHlwZSk7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0JbGVuZ3RoID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9sZW5ndGgpOwotCWNhY2hlX3B0ci0+b3RoZXIgPSBsZW5ndGg7CS8qIG90aGVyIG5vdCB1c2VkLCBzYXZlIGxlbmd0aCBoZXJlICovCi0KLQljYWNoZV9zYXZlID0gKmNhY2hlX3B0cjsKLQljb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKTsKLQlpZiAoIXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogZm9yIGhwdXgsIHRoZSAnbGVuZ2h0JyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiAqLwotCS8qIHRoZSBzeW1ib2wgbmFtZSB3aGljaCBmb2xsb3dzIHRoZSBubGlzdCBlbnRyeS4gICAgICAgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaWYgKGxlbmd0aCkKLQkgIHsKLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAgICAvKiB0aGUgaHAgc3RyaW5nIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSovCi0JICAgIC8qIGJ5IGNvcHlpbmcgdGhlIHN0cmluZyB0byBvdmVybGFwIHRoZSBqdXN0IHZhY2F0ZWQgbmxpc3QgICAgKi8KLQkgICAgLyogc3RydWN0dXJlIGJlZm9yZSBpdCBpbiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzOwotCSAgICBtZW1jcHkgKHN0cmluZ3MsIHN5bV9wb2ludGVyICsgMSwgbGVuZ3RoKTsKLQkgICAgc3RyaW5nc1tsZW5ndGhdID0gJ1wwJzsKLQkgICAgc3RyaW5ncyArPSBsZW5ndGggKyAxOwotCSAgfQotCWVsc2UKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0JLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0Jc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKLQkJCQkJCSBsZW5ndGgpOwotICAgICAgfQotICB9Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi12b2lkCi1NWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuID0gMDsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbCA9IDA7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLSAgcl9pbmRleCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgYnl0ZXMtPnJfaW5kZXgpOwotCi0gIHN3aXRjaCAoYnl0ZXMtPnJfdHlwZVswXSkKLSAgICB7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9URVhUOgotICAgICAgcl9pbmRleCA9IE5fVEVYVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfREFUQToKLSAgICAgIHJfaW5kZXggPSBOX0RBVEE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0JTUzoKLSAgICAgIHJfaW5kZXggPSBOX0JTUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfRVhURVJOQUw6Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX1BDUkVMOgotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgcl9wY3JlbCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX1JETFQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX1JQTFQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX05PT1A6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3dpdGNoIChieXRlcy0+cl9sZW5ndGhbMF0pCi0gICAgewotICAgIGNhc2UgSFBfUkxFTkdUSF9CWVRFOgotICAgICAgcl9sZW5ndGggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9STEVOR1RIX1dPUkQ6Ci0gICAgICByX2xlbmd0aCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JMRU5HVEhfTE9ORzoKLSAgICAgIHJfbGVuZ3RoID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBjYWNoZV9wdHItPmhvd3RvID0gaG93dG9fdGFibGVfc3RkICsgcl9sZW5ndGggKyA0ICogcl9wY3JlbDsKLSAgLyogRklYTUUtc29vbjogIFJvbGwgYmFzZXJlbCwgam1wdGFibGUsIHJlbGF0aXZlIGJpdHMgaW50byBob3d0byBzZXR0aW5nICovCi0KLSAgLyogVGhpcyBtYWNybyB1c2VzIHRoZSByX2luZGV4IHZhbHVlIGNvbXB1dGVkIGFib3ZlICovCi0gIGlmIChyX3BjcmVsICYmIHJfZXh0ZXJuKQotICAgIHsKLSAgICAgIC8qIFRoZSBHTlUgbGlua2VyIGFzc3VtZXMgYW55IG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gICAgICAvKiBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbnRvIHRoZSBpbWFnZSB3aGlsZSB0aGUgSFAgbGlua2VyICAqLwotICAgICAgLyogYWRkcyB0aGlzIGluIGxhdGVyLiAgQWRkIGl0IGluIG5vdy4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIE1PVkVfQUREUkVTUyAoLWNhY2hlX3B0ci0+YWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgTU9WRV9BRERSRVNTICgwKTsKLSAgICB9Ci19Ci0KLWJvb2xlYW4KLU1ZIChzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIHN0cnVjdCBocDMwMGhwdXhfcmVsb2MgKnJwdHI7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi1kb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfemFsbG9jIChhYmZkLCAoc2l6ZV90KSAoY291bnQgKiBzaXplb2YKLQkJCQkJCQkoYXJlbGVudCkpKTsKLSAgaWYgKCFyZWxvY19jYWNoZSAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxvY3MgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBycHRyID0gKHN0cnVjdCBocDMwMGhwdXhfcmVsb2MgKikgcmVsb2NzOwotICBjb3VudGVyID0gMDsKLSAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotICAgIHsKLSAgICAgIE1ZIChzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0KLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaWRlbnRpY2FsIHRvIGZ1bmN0aW9ucyBpbiBhb3V0eC5oIGV4Y2VwdCAqLwotLyogdGhleSByZWZlciB0byBNWShmdW5jKSByYXRoZXIgdGhhbiBOQU1FKGFvdXQsZnVuYykgYW5kIHRoZXkgYWxzbyAgICAgKi8KLS8qIGNhbGwgYW91dF8zMiB2ZXJzaW9ucyBpZiB0aGUgaW5wdXQgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGdjYyAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1sb25nIGFvdXRfMzJfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiBhYmZkLCBhc3ltYm9sICoqIGxvY2F0aW9uKSk7Ci1sb25nIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLWxvbmcgYW91dF8zMl9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICogYWJmZCwgc2VjX3B0ciBzZWN0aW9uLAotCQkJCQkgYXJlbGVudCAqKiByZWxwdHIsCi0JCQkJCSBhc3ltYm9sICoqIHN5bWJvbHMpKTsKLQotbG9uZwotTVkgKGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHJldHVybiBhb3V0XzMyX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKTsKLQotICBpZiAoIU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyAoYWJmZCk7IGNvdW50ZXIrKyA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOykKLSAgICAqKGxvY2F0aW9uKyspID0gKGFzeW1ib2wgKikgKHN5bWJhc2UrKyk7Ci0gICpsb2NhdGlvbisrID0gMDsKLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi1sb25nCi1NWSAoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUgKikpOwotfQotCi0KLQotCi1sb25nCi1NWSAoY2Fub25pY2FsaXplX3JlbG9jKSAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scyk7Ci0KLSAgaWYgKCEodGJscHRyIHx8IE1ZIChzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCXsKLQkgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCX0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ocHBhX3N0dWJzLmggYi9iZmQvaHBwYV9zdHVicy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5M2U4Li4wMDAwMDAwCi0tLSBhL2JmZC9ocHBhX3N0dWJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBIUFBBIGxpbmtlciBzdHViIGluc3RydWN0aW9ucyAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBtYXkgaW5zZXJ0IGludG8gdGhlCi0gICBjb2RlIHN0cmVhbSB3aGVuIGJ1aWxkaW5nIGZpbmFsIGV4ZWN1dGFibGVzIHRvIGhhbmRsZSBvdXQtb2YtcmFuZ2UKLSAgIGNhbGxzIGFuZCBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0KLSNkZWZpbmUgTERPX000X1IzMV9SMzEJCTB4MzdmZjNmZjkJLyogbGRvIC00KCVyMzEpLCVyMzEJICAqLwotI2RlZmluZSBMRElMX1IxCQkJMHgyMDIwMDAwMAkvKiBsZGlsIFhYWCwlcjEJCSAgKi8KLSNkZWZpbmUgQkVfU1I0X1IxCQkweGUwMjAyMDAwCS8qIGJlIFhYWCglc3I0LCVyMSkJICAqLwotI2RlZmluZSBDT1BZX1IzMV9SMiAgICAgICAgICAJMHgwODFmMDI0MgkvKiBjb3B5ICVyMzEsJXIyCSAgKi8KLSNkZWZpbmUgQkxFX1NSNF9SMAkJMHhlNDAwMjAwMAkvKiBibGUgWFhYKCVzcjQsJXIwKQkgICovCi0jZGVmaW5lIEJMRV9TUjRfUjEJCTB4ZTQyMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMSkJICAqLwotI2RlZmluZSBCVl9OXzBfUjMxCQkweGViZTBjMDAyCS8qIGJ2LG4gMCglcjMxKQkJICAqLwotI2RlZmluZSBTVFdfUjMxX004UjMwCQkweDZiZGYzZmYxCS8qIHN0dyAlcjMxLC04KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX004UjMwX1IzMQkJMHg0YmRmM2ZmMQkvKiBsZHcgLTgoJXIzMCksJXIzMQkgICovCi0jZGVmaW5lIFNUV19BUkdfTTE2UjMwCQkweDZiYzAzZmUxCS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTTE2UjMwX0FSRwkJMHg0YmMwM2ZlMQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KLSNkZWZpbmUgU1RXX0FSR19NMTJSMzAJCTB4NmJjMDNmZTkJLyogc3R3ICVhcmdYLC0xNiglcjMwKQkgICovCi0jZGVmaW5lIExEV19NMTJSMzBfQVJHCQkweDRiYzAzZmU5CS8qIGxkdyAtMTIoJXIzMCksJWFyZ1gJICAqLwotI2RlZmluZSBGU1RXX0ZBUkdfTTE2UjMwCTB4MjdjMTEyMDAJLyogZnN0d3MgJWZhcmdYLC0xNiglcjMwKSAqLwotI2RlZmluZSBGTERXX00xNlIzMF9GQVJHCTB4MjdjMTEwMDAJLyogZmxkd3MgLTE2KCVyMzApLCVmYXJnWCAqLwotI2RlZmluZSBGU1REX0ZBUkdfTTE2UjMwCTB4MmZjMTEyMDAJLyogZnN0ZHMgJWZhcmdYLC0xNiglcjMwKSAqLwotI2RlZmluZSBGTEREX00xNlIzMF9GQVJHCTB4MmZjMTEwMDAJLyogZmxkZHMgLTE2KCVyMzApLCVmYXJnWCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2hwcGFic2QtY29yZS5jIGIvYmZkL2hwcGFic2QtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNlNmIyLi4wMDAwMDAwCi0tLSBhL2JmZC9ocHBhYnNkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuIAotCi0gICBUaGUgY29yZSBmaWxlIHN0cnVjdHVyZSBmb3IgdGhlIFV0YWggNC4zQlNEIGFuZCBPU0YxIHBvcnRzIG9uIHRoZQotICAgUEEgaXMgYSBtaXggYmV0d2VlbiB0cmFkaXRpb25hbCBjb3JlcyBhbmQgaHB1eCBjb3JlcyAtLSBqdXN0Ci0gICBkaWZmZXJlbnQgZW5vdWdoIHRoYXQgc3VwcG9ydGluZyB0aGlzIGZvcm1hdCB3b3VsZCB0ZW5kIHRvIGFkZAotICAgZ3Jvc3MgaGFja3MgdG8gdHJhZC1jb3JlLmMgb3IgaHB1eC1jb3JlLmMuICBTbyBpbnN0ZWFkIHdlIGtlZXAgYW55Ci0gICBncm9zcyBoYWNrcyBpc29sYXRlZCB0byB0aGlzIGZpbGUuICAqLwotICAgCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBIUFBBLUJTRCBzdHlsZQotICAgY29yZSBmaWxlcy4KLQotICAgSSB3b3VsZCBub3QgZXhwZWN0IHRoaXMgdG8gYmUgb2YgdXNlIHRvIGFueSBvdGhlciBob3N0L3RhcmdldCwgYnV0Ci0gICB5b3UgbmV2ZXIga25vdy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUJTRCkKLQotI2luY2x1ZGUgIm1hY2hpbmUvdm1wYXJhbS5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0jaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLQotc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLAotCQkJCQkgICAgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0JCQkJCSAgICBmaWxlX3B0ciwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYXN5bWJvbCAqaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YS4gICovCi0KLXN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0Ci0gIHsKLSAgICBpbnQgc2lnOwotICAgIGNoYXIgY21kW01BWENPTUxFTiArIDFdOwotICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICB9OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHBhYnNkX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnJlZ19zZWN0aW9uKQotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIG9mZnNldCwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBhbGlnbm1lbnRfcG93ZXI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1ocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCB1c2VyIHU7Ci0gIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpjb3JlZGF0YTsKLSAgaW50IGNsaWNrc3o7Ci0KLSAgLyogVHJ5IHRvIHJlYWQgaW4gdGhlIHUtYXJlYS4gIFdlIHdpbGwgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMKLSAgICAgdG8ga25vdyBob3cgdG8gZ3JvayB0aGUgcmVzdCBvZiB0aGUgY29yZSBzdHJ1Y3R1cmVzLiAgKi8KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopICZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgcGFnZSBzaXplIG91dCBvZiB0aGUgdSBzdHJ1Y3R1cmUuICBUaGlzIHdpbGwgYmUgZGlmZmVyZW50Ci0gICAgIGZvciBQQSAxLjAgbWFjaGluZXMgYW5kIFBBIDEuMSBtYWNoaW5lcy4gICBZdWshICAqLwotICBjbGlja3N6ID0gdS51X3BjYi5wY2JfcGdzejsKLQotICAvKiBjbGlja3N6IG11c3QgYmUgYSBwb3dlciBvZiB0d28gPj0gMmsuICAqLwotICBpZiAoY2xpY2tzeiA8IDB4ODAwCi0gICAgICB8fCBjbGlja3N6ICE9IChjbGlja3N6ICYgLWNsaWNrc3opKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgLyogU2FuaXR5IGNoZWNrcy4gIE1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIG1hdGNoZXMgdGhlCi0gICAgIHRoZSBzaXplIGNvbXB1dGVkIGZyb20gaW5mb3JtYXRpb24gd2l0aGluIHRoZSBjb3JlIGl0c2VsZi4gICovCi0gIHsKLSAgICBGSUxFICpzdHJlYW0gPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fCBmc3RhdCAoZmlsZW5vIChzdHJlYW0pLCAmc3RhdGJ1ZikgPCAwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgaWYgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKSA+IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIGlmIChjbGlja3N6ICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkgPCBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JLyogVGhlIGZpbGUgaXMgdG9vIGJpZy4gIE1heWJlIGl0J3Mgbm90IGEgY29yZSBmaWxlCi0JICAgb3Igd2Ugb3RoZXJ3aXNlIGhhdmUgYmFkIHZhbHVlcyBmb3IgdV9kc2l6ZSBhbmQgdV9zc2l6ZSkuICAqLwotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgY29yZWRhdGEgPSAoc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZWRhdGEpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogTWFrZSB0aGUgY29yZSBkYXRhIGFuZCBhdmFpbGFibGUgdmlhIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBCRkQuICAqLwotICBhYmZkLT50ZGF0YS5ocHBhYnNkX2NvcmVfZGF0YSA9IGNvcmVkYXRhOwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLQkJCQkJICAgU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgY2xpY2tzeiAqIHUudV9zc2l6ZSwKLQkJCQkJICAgTkJQRyAqIChVU0laRSArIEtTVEFLU0laRSkgCi0JCQkJCSAgICAgKyBjbGlja3N6ICogdS51X2RzaXplLCAyKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IFVTUlNUQUNLOyAKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJCSAgU0VDX0FMTE9DICsgU0VDX0xPQUQKLQkJCQkJICAgICsgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICBjbGlja3N6ICogdS51X2RzaXplLAotCQkJCQkgIE5CUEcgKiAoVVNJWkUgKyBLU1RBS1NJWkUpLCAyKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gVURBVEFTRUc7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLQkJCQkJIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSBLU1RBS1NJWkUgKiBOQlBHLAotCQkJCQkgTkJQRyAqIFVTSVpFLCAyKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHUudV9jb21tLCBNQVhDT01MRU4gKyAxKTsKLSAgY29yZV9zaWduYWwgKGFiZmQpID0gdS51X2NvZGU7Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHBhYnNkX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgLyogVGhlcmUncyBubyB3YXkgdG8ga25vdyB0aGlzLi4uICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBocHBhYnNkX2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBocHBhYnNkX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGhwcGFic2RfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBocHBhYnNkX2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBocHBhYnNkX2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGhwcGFic2RfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCAoKQotewotICAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAuICAqLwotICBhYm9ydCAoKTsJCi19Ci0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHBwYWJzZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHBwYWJzZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwcGFic2RfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwcGFic2RfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvaHB1eC1jb3JlLmMgYi9iZmQvaHB1eC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWEyYzIuLjAwMDAwMDAKLS0tIGEvYmZkL2hwdXgtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFAvVVggY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuLCBDeWdudXMgU3VwcG9ydC4KLSAgIENvbnZlcnRlZCB0byBiYWNrLWVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTVXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIEhQL1VYIHN0eWxlCi0gICBjb3JlIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUDMwMEhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU1QRUlYKQotCi0vKiBGSVhNRTogc3lzL2NvcmUuaCBkb2Vzbid0IGV4aXN0IGZvciBIUFVYIHZlcnNpb24gNy4gIEhQVVggdmVyc2lvbgotICAgNSwgNiwgYW5kIDcgY29yZSBmaWxlcyBzZWVtIHRvIGJlIHN0YW5kYXJkIHRyYWQtY29yZS5jIHR5cGUgY29yZQotICAgZmlsZXM7IGNhbiB3ZSBqdXN0IHVzZSB0cmFkLWNvcmUuYyBpbiBhZGRpdGlvbiB0byB0aGlzIGZpbGU/ICAqLwotCi0jaW5jbHVkZSA8c3lzL2NvcmUuaD4KLSNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotCi0jZW5kaWYgLyogSE9TVF9IUFBBSFBVWCAqLwotCi0jaWZkZWYgSE9TVF9IUFBBQlNECi0KLS8qIE5vdCBhIHZlcnkgc3dpZnQgcGxhY2UgdG8gcHV0IGl0LCBidXQgdGhhdCdzIHdoZXJlIHRoZSBCU0QgcG9ydAotICAgcHV0cyB0aGVtLiAgKi8KLSNpbmNsdWRlICIvaHB1eC91c3IvaW5jbHVkZS9zeXMvY29yZS5oIgotCi0jZW5kaWYgLyogSE9TVF9IUFBBQlNEICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBIQVZFX0RJUkVOVF9ICi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZgotIyBpZmRlZiBIQVZFX1NZU19ESVJfSAotIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgotIyBlbmRpZgotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi0vKiBLbHVkZ2U6IFRoZXJlJ3Mgbm8gZXhwbGljaXQgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IHN5cy9jb3JlLmggdG8KLSAgIGNvbmRpdGlvbmFsbHkga25vdyB3aGV0aGVyIGEgcHJvY19pbmZvIGhhcyB0aHJlYWQgaWQgZmllbGRzLgotICAgSG93ZXZlciwgQ09SRV9BTk9OX1NITUVNIHNob3dzIHVwIGZpcnN0IGF0IDEwLjMwLCB3aGljaCBpcwotICAgaGFwcGlseSBhbHNvIHdoZW4gbWVhbmluZ2Z1bCB0aHJlYWQgaWQncyBzaG93IHVwIGluIHByb2NfaW5mby4gKi8KLSNpZiBkZWZpbmVkKENPUkVfQU5PTl9TSE1FTSkKLSNkZWZpbmUgUFJPQ19JTkZPX0hBU19USFJFQURfSUQgKDEpCi0jZW5kaWYKLQotLyogVGhpcyB0eXBlIGFwcGVhcnMgYXQgSFAtVVggMTAuMzAuICBEZWZpbmluZyBpdCBpZiBub3QgZGVmaW5lZAotICAgYnkgc3lzL2NvcmUuaCBhbGxvd3MgdXMgdG8gYnVpbGQgZm9yIG9sZGVyIEhQLVVYJ3MsIGFuZCAoc2luY2UKLSAgIGl0IHdvbid0IGJlIGVuY291bnRlcmVkIGluIGNvcmUtZHVtcHMgZnJvbSBvbGRlciBIUC1VWCdzKSBpcwotICAgaGFybWxlc3MuICovCi0jaWYgIWRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBDT1JFX0FOT05fU0hNRU0gMHgwMDAwMDIwMCAgICAgICAgIC8qIGFub255bW91cyBzaGFyZWQgbWVtb3J5ICovCi0jZW5kaWYKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotLyogLmx3cGlkIGFuZCAudXNlcl90aWQgYXJlIG9ubHkgdmFsaWQgaWYgUFJPQ19JTkZPX0hBU19USFJFQURfSUQsIGVsc2UgdGhleQotICAgYXJlIHNldCB0byAwLiAgQWxzbywgdW50aWwgSFAtVVggaW1wbGVtZW50cyBNeE4gdGhyZWFkcywgLnVzZXJfdGlkIGFuZAotICAgLmx3cGlkIGFyZSBzeW5vbnltb3VzLiAqLwotc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGludCBsd3BpZDsgICAgICAgICAgICAgICAvKiBLZXJuZWwgdGhyZWFkIElELiAqLwotICB1bnNpZ25lZCBsb25nIHVzZXJfdGlkOyAgLyogVXNlciB0aHJlYWQgSUQuICovCi0gIGNoYXIgY21kW01BWENPTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuaHB1eF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLSNkZWZpbmUgY29yZV9rZXJuZWxfdGhyZWFkX2lkKGJmZCkgKGNvcmVfaGRyKGJmZCktPmx3cGlkKQotI2RlZmluZSBjb3JlX3VzZXJfdGhyZWFkX2lkKGJmZCkgKGNvcmVfaGRyKGJmZCktPnVzZXJfdGlkKQotCi1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGFsaWdubWVudF9wb3dlcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotICBpZiAoIW5ld25hbWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuZXduYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBhbGlnbm1lbnRfcG93ZXI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1ocHV4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotCi0vKiB0aGlzIGZ1bmN0aW9uIGJ1aWxkcyBhIGJmZCB0YXJnZXQgaWYgdGhlIGZpbGUgaXMgYSBjb3JlZmlsZS4KLSAgIEl0IHJldHVybnMgbnVsbCBvciAwIGlmIGl0IGZpbmRzIG91dCB0aGFhdCBpdCBpcyBub3QgYSBjb3JlIGZpbGUuCi0gICBUaGUgd2F5IGl0IGNoZWNrcyB0aGlzIGlzIGJ5IGxvb2tpbmcgZm9yIGFsbG93ZWQgJ3R5cGUnIGZpZWxkIHZhbHVlcy4KLSAgIFRoZXNlIGFyZSBkZWNsYXJlZCBpbiBzeXMvY29yZS5oCi0gICBUaGVyZSBhcmUgc29tZSB2YWx1ZXMgd2hpY2ggYXJlICdyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZScuIEluIHBhcnRpY3VsYXIKLSAgIENPUkVfTk9ORSBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIDAuIFRoaXMgbWF5IGJlIGEgY2F0Y2gtYWxsIGZvciBjYXNlcwotICAgaW4gd2hpY2ggdGhlIGNvcmUgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgc29tZSBub24taHB1eCBhcHBsaWNhdGlvbi4KLSAgIChJIGFtIGp1c3QgZ3Vlc3NpbmcgaGVyZSEpCi0qLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaHB1eF9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCAgZ29vZF9zZWN0aW9ucyA9IDA7Ci0gIGludCAgdW5rbm93bl9zZWN0aW9ucyA9IDA7Ci0KLSAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgdmFsOwotICAgICAgc3RydWN0IGNvcmVoZWFkIGNvcmVfaGVhZGVyOwotCi0gICAgICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikgJmNvcmVfaGVhZGVyLCAxLCBzaXplb2YgY29yZV9oZWFkZXIsIGFiZmQpOwotICAgICAgaWYgKHZhbCA8PSAwKQotCWJyZWFrOwotICAgICAgc3dpdGNoIChjb3JlX2hlYWRlci50eXBlKQotCXsKLQljYXNlIENPUkVfS0VSTkVMOgotCWNhc2UgQ09SRV9GT1JNQVQ6Ci0JICBiZmRfc2VlayAoYWJmZCwgY29yZV9oZWFkZXIubGVuLCBTRUVLX0NVUik7CS8qIEp1c3Qgc2tpcCB0aGlzICovCi0gICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX0VYRUM6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2V4ZWMgcHJvY19leGVjOwotCSAgICBpZiAoYmZkX3JlYWQgKCh2b2lkICopICZwcm9jX2V4ZWMsIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCSAgICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBwcm9jX2V4ZWMuY21kLCBNQVhDT01MRU4gKyAxKTsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ09SRV9QUk9DOgotCSAgewotCSAgICBzdHJ1Y3QgcHJvY19pbmZvIHByb2NfaW5mbzsKLQkgICAgY2hhciAgc2VjbmFtZVsxMDBdOyAgLyogT2YgYXJiaXRyYXJ5IHNpemUsIGJ1dCBwbGVudHkgbGFyZ2UuICovCi0KLSAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gcmVhZCB0aGlzIHNlY3Rpb24sICdjYXVzZSB3ZSBuZWVkIHRvIGRldGVybWluZQotICAgICAgICAgICAgICAgd2hldGhlciB0aGUgY29yZS1kdW1wZWQgYXBwIHdhcyB0aHJlYWRlZCBiZWZvcmUgd2UgY3JlYXRlCi0gICAgICAgICAgICAgICBhbnkgLnJlZyBzZWN0aW9ucy4gKi8KLQkgICAgaWYgKGJmZF9yZWFkICgmcHJvY19pbmZvLCAxLCBjb3JlX2hlYWRlci5sZW4sIGFiZmQpCi0JCSE9IGNvcmVfaGVhZGVyLmxlbikKLQkgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAvKiBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gY3JlYXRlIHRob3NlIHNlY3Rpb25zIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgIGZpbGUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCwgaXQgc2VlbXMuICovCi0gICAgICAgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIC1jb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLQotI2lmIGRlZmluZWQoUFJPQ19JTkZPX0hBU19USFJFQURfSUQpCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gcHJvY19pbmZvLmx3cGlkOwotICAgICAgICAgICAgY29yZV91c2VyX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8udXNlcl90aWQ7Ci0jZWxzZQotICAgICAgICAgICAgY29yZV9rZXJuZWxfdGhyZWFkX2lkIChhYmZkKSA9IDA7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8qIElmIHRoZSBwcm9ncmFtIHdhcyB1bnRocmVhZGVkLCB0aGVuIHdlJ2xsIGp1c3QgY3JlYXRlIGEKLSAgICAgICAgICAgICAgIC5yZWcgc2VjdGlvbi4KLQotICAgICAgICAgICAgICAgSWYgdGhlIHByb2dyYW0gd2FzIHRocmVhZGVkLCB0aGVuIHdlJ2xsIGNyZWF0ZSAucmVnL1hYWFhYCi0gICAgICAgICAgICAgICBzZWN0aW9uIGZvciBlYWNoIHRocmVhZCwgd2hlcmUgWFhYWFggaXMgYSBwcmludGFibGUKLSAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXJuZWwgdGhyZWFkIGlkLiAgV2UnbGwgYWxzbwotICAgICAgICAgICAgICAgY3JlYXRlIGEgLnJlZyBzZWN0aW9uIGZvciB0aGUgdGhyZWFkIHRoYXQgd2FzIHJ1bm5pbmcKLSAgICAgICAgICAgICAgIGFuZCBzaWduYWxsZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGNvcmUtZHVtcCAoaS5lLiwgdGhpcwotICAgICAgICAgICAgICAgaXMgZWZmZWN0aXZlbHkgYW4gYWxpYXMsIG5lZWRlZCB0byBrZWVwIEdEQiBoYXBweS4pCi0KLSAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3ZSB1c2UgYC5yZWcvWFhYWFgnIGFzIG9wcG9zZWQgdG8gJy5yZWdYWFhYWCcKLSAgICAgICAgICAgICAgIGJlY2F1c2UgR0RCIGV4cGVjdHMgdGhhdCAucmVnMiB3aWxsIGJlIHRoZSBmbG9hdGluZy0KLSAgICAgICAgICAgICAgIHBvaW50IHJlZ2lzdGVycy4gKi8KLSAgICAgICAgICAgIGlmIChjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID09IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIHRocmVhZHMuICBJcyB0aGlzIHRoZSBvbmUgdGhhdCBjYXVzZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgY29yZS1kdW1wPyAgV2UnbGwgY2xhaW0gaXQgd2FzIHRoZSBydW5uaW5nIHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBpZiAocHJvY19pbmZvLnNpZyAhPSAtMSkKLSAgICAgICAgICAgICAgICAgIHsKLQkJICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLQkJCQkJICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgICBjb3JlX2hlYWRlci5sZW4sCi0JCQkJCSAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLQkJCQkJICAgIDIpKQotCQkgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBXZSBhbHdheXMgbWFrZSBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGZvciBldmVyeSB0aHJlYWQuICovCi0gICAgICAgICAgICAgICAgc3ByaW50ZiAoc2VjbmFtZSwgIi5yZWcvJWQiLCBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9oZWFkZXIubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgIH0KLQkgICAgY29yZV9zaWduYWwgKGFiZmQpID0gcHJvY19pbmZvLnNpZzsKLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgY29yZV9oZWFkZXIubGVuLCBTRUVLX0NVUikgIT0gMCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ09SRV9EQVRBOgotCWNhc2UgQ09SRV9TVEFDSzoKLQljYXNlIENPUkVfVEVYVDoKLQljYXNlIENPUkVfTU1GOgotCWNhc2UgQ09SRV9TSE06Ci0JY2FzZSBDT1JFX0FOT05fU0hNRU06Ci0JICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCSAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCSAgY29yZV9oZWFkZXIubGVuLCBjb3JlX2hlYWRlci5hZGRyLCAyKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsKLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQotCWNhc2UgQ09SRV9OT05FOgotICAgICAgICAgIC8qIExldCdzIG5vdCBwdW50IGlmIHdlIGVuY291bnRlciBhIHNlY3Rpb24gb2YgdW5rbm93bgotICAgICAgICAgICAgIHR5cGUuICBSYXRoZXIsIGxldCdzIG1ha2UgYSBub3RlIG9mIGl0LiAgSWYgd2UgbGF0ZXIKLSAgICAgICAgICAgICBzZWUgdGhhdCB0aGVyZSB3ZXJlIGFsc28gImdvb2QiIHNlY3Rpb25zLCB0aGVuIHdlJ2xsCi0gICAgICAgICAgICAgZGVjbGFyZSB0aGF0IHRoaXMgYSBjb3JlIGZpbGUsIGJ1dCB3ZSdsbCBhbHNvIHdhcm4gdGhhdAotICAgICAgICAgICAgIGl0IG1heSBiZSBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIGdkYi4KLSAgICAgICAgICAgICAqLwotCSAgdW5rbm93bl9zZWN0aW9ucysrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgIAotICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7IC8qdW5yZWNvZ25pemVkIGNvcmUgZmlsZSB0eXBlICovCi0JfQotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBXZXJlIHRoZXJlIHNlY3Rpb25zIG9mIHVua25vd24gdHlwZT8gIElmIHNvLCB5ZXQgdGhlcmUgd2VyZQotICAgICBhdCBsZWFzdCBzb21lIGNvbXBsZXRlIHNlY3Rpb25zIG9mIGtub3duIHR5cGUsIHRoZW4sIGlzc3VlCi0gICAgIGEgd2FybmluZy4gIFBvc3NpYmx5IHRoZSBjb3JlIGZpbGUgd2FzIGdlbmVyYXRlZCBvbiBhIHZlcnNpb24KLSAgICAgb2YgSFAtVVggdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGF0IGZvciB3aGljaCB0aGlzIGdkYiB3YXMKLSAgICAgYnVpbHQuCi0gICAgICovCi0gIGlmICgodW5rbm93bl9zZWN0aW9ucyA+IDApICYmIChnb29kX3NlY3Rpb25zID4gMCkpCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAoIiVzIGFwcGVhcnMgdG8gYmUgYSBjb3JlIGZpbGUsXG5idXQgY29udGFpbnMgdW5rbm93biBzZWN0aW9ucy4gIEl0IG1heSBoYXZlIGJlZW4gY3JlYXRlZCBvbiBhbiBpbmNvbXBhdGlibGVcbnZlcnNpb24gb2YgSFAtVVguICBBcyBhIHJlc3VsdCwgc29tZSBpbmZvcm1hdGlvbiBtYXkgYmUgdW5hdmFpbGFibGUuXG4iLAotICAgICAgIGFiZmQtPmZpbGVuYW1lKTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaHB1eF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotaHB1eF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGhwdXhfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGhwdXhfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaHB1eF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGhwdXhfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGhwdXhfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaHB1eF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGhwdXhfY29yZV92ZWMgPQotICB7Ci0gICAgImhwdXgtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBocHV4X2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChocHV4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChocHV4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YW91dC5jIGIvYmZkL2kzODZhb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjJjZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZhb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIG9ubHkgMzg2IGFvdXQgc3lzdGVtIHdlIGhhdmUgaGVyZSBpcyBHTzMyIGZyb20gREouIAotICAgVGhlc2UgbnVtYmVycyBtYWtlIEJGRCB3b3JrIHdpdGggdGhhdC4gSWYgeW91ciBhb3V0IDM4NiBzeXN0ZW0KLSAgIGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlLCB3ZSdsbCBoYXZlIHRvIHNwbGl0IHRoZW0gaW50byBkaWZmZXJlbnQKLSAgIGZpbGVzLiAgU2VuZCBtZSAoc2FjQGN5Z251cy5jb20pIHRoZSBydW5lcyB0byBtYWtlIGl0IHdvcmsgb24geW91cgotICAgc3lzdGVtLCBhbmQgSSdsbCBzdGljayBpdCBpbiBmb3IgdGhlIG5leHQgcmVsZWFzZS4gICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIDB4MjAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIChOX01BR0lDKHgpPT1aTUFHSUMgPyAweDEwMjAgOiAwKQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLSNpZiAwCi0jZGVmaW5lIE5fREFUQUREUih4KSAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpIDogKFNFR01FTlRfU0laRSArICgoMHgxMDIwKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpKQotI2RlZmluZSBOT1NVQkVYRUNCCi0KLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYiCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YnNkLmMgYi9iZmQvaTM4NmJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4ZmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgQlNELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZGF0YSBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGZvcm1hdCB1c2VkIHVuZGVyIGFsbCB0aGUgdmFyaW91cwotICAgQlNEIHBvcnRzIGZvciAzODYgbWFjaGluZXMuICAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8KLSNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCi0KLS8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBhZGRyZXNzIDAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIFFNQUdJQy4gICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZHluaXguYyBiL2JmZC9pMzg2ZHluaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MGExNC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmR5bml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgZHluaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBCRkQgaXMgY3VycmVudGx5IG9ubHkgdGVzdGVkIHdpdGggZ2RiLCB3cml0aW5nIG9iamVjdCBmaWxlcwotICAgbWF5IG5vdCB3b3JrLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2luY2x1ZGUgImFvdXQvZHluaXgzLmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmR5bml4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1keW5peCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaTM4NmR5bml4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGkzODZkeW5peF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBOTUFHSUMsIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDAKLSNkZWZpbmUgQk1BR0lDIE9NQUdJQwotI2RlZmluZSBRTUFHSUMgWE1BR0lDCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiAoQWIpdXNlIHNvbWUgZmllbGRzIGluIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciB0byBiZSBhYmxlIHRvIHJlYWQKLSAgIGV4ZWN1dGFibGVzIHRoYXQgY29udGFpbiBzaGFyZWQgZGF0YS4gICovCi0KLSNkZWZpbmUgYV9zaGRhdGEgYV90bG9hZAotI2RlZmluZSBhX3NoZHJzaXplIGFfZGxvYWQKLQotdm9pZAotaTM4NmR5bml4XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfc2hkYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZGF0YSk7Ci0gIGV4ZWNwLT5hX3NoZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZHJzaXplKTsKLX0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmZyZWVic2QuYyBiL2JmZC9pMzg2ZnJlZWJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTYzNzFiLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZnJlZWJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBGcmVlQlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODZfTkVUQlNEIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmZyZWVic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1mcmVlYnNkIgotCi0jaW5jbHVkZSAiZnJlZWJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZsaW51eC5jIGIvYmZkL2kzODZsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYyYTExLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLwotICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCi0gICAgIFdoeSBub3Q/ICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMtPl9yYXdfc2l6ZSA9IDA7Ci0gIHMtPmNvbnRlbnRzID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLQkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBpbnNlcnQ7Ci0KLSAgLyogTG9vayB1cCBhbmQgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgICAgSWYgd2UgZG8sIGFuZCB0aGUgZGVmaW5pbmcgZW50cnkgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB3ZQotICAgICBuZWVkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucy4KLQotICAgICBGSVhNRTogV2hhdCBpZiBhYmZkLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3I/ICBXZSBtYXkgd2FudCB0bwotICAgICBiZSBhYmxlIHRvIGxpbmsgTGludXggYS5vdXQgYW5kIEVMRiBvYmplY3RzIHRvZ2V0aGVyLCBidXQgc2VyaW91cwotICAgICBjb25mdXNpb24gaXMgcG9zc2libGUuICAqLwotCi0gIGluc2VydCA9IGZhbHNlOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIFNIQVJBQkxFX0NPTkZMSUNUUykgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaWYgKCEgbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0gICAgICBpbnNlcnQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgZmFsc2UsCi0JCQkJICBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgc3RydWN0IGZpeHVwICpmOwotCi0JICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCAhIElTX1BMVF9TWU0gKG5hbWUpKTsKLQkgIGlmIChmID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGYtPmp1bXAgPSBJU19QTFRfU1lNIChuYW1lKTsKLQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLwotICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KLSAgaWYgKGluc2VydCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCi0JIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCSAgICIubGludXgtZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAotCSAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KLSAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKLSAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCi0gICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAotICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAotICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQotICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGZpeHVwICpmLCAqZjE7Ci0gIGludCBpc19wbHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7Ci0gIGJvb2xlYW4gZXhpc3RzOwotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCi0JCSAgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDEpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjaGFyICphbGxvYyA9IE5VTEw7Ci0KLSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcgKyBzaXplb2YgTkVFRFNfU0hSTElCIC0gMTsKLSAgICAgIHAgPSBzdHJyY2hyIChuYW1lLCAnXycpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlhbGxvYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLQotICAgICAgaWYgKHAgPT0gTlVMTCB8fCBhbGxvYyA9PSBOVUxMKQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzJ1xuIiksCi0JCQkgICAgICAgbmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyY3B5IChhbGxvYywgbmFtZSk7Ci0JICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7Ci0JICAqcCsrID0gJ1wwJzsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCi0JICAgICBhbGxvYywgcCk7Ci0JICBmcmVlIChhbGxvYyk7Ci0JfQotCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0IGl0ICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLQkgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLQkgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFRoZSByZWFsIHN5bWJvbCBtdXN0IGV4aXN0IGJ1dCBpZiBpdCBpcyBhbHNvIGFuIEFCUyBzeW1ib2wsCi0JIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBhIGZpeHVwLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgYm90aAotCSBjYW1lIGZyb20gdGhlIHNhbWUgbGlicmFyeS4gIElmIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYWQgdG8KLQkgdXNlIGFuIGluZGlyZWN0IHN5bWJvbCB0byBnZXQgdG8gdGhlIHJlYWwgc3ltYm9sLCB3ZSBhZGQgdGhlCi0JIGZpeHVwIGFueXdheSwgc2luY2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZXNlIHN5bWJvbHMgY29tZQotCSBmcm9tIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyaWVzICovCi0gICAgICBpZiAoaDEgIT0gTlVMTAotCSAgJiYgKCgoaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0JewotCSAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotCSAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0JICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLQkgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0JICBleGlzdHMgPSBmYWxzZTsKLQkgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLQkgICAgICAgZjEgIT0gTlVMTDsKLQkgICAgICAgZjEgPSBmMS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLQkJICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGYxLT5oID09IGgxKQotCQlleGlzdHMgPSB0cnVlOwotCSAgICAgIGlmICghIGV4aXN0cwotCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGYxLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCQkgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JCX0KLQkgICAgICBmMS0+aCA9IGgxOwotCSAgICAgIGYxLT5qdW1wID0gaXNfcGx0OwotCSAgICAgIGYxLT5idWlsdGluID0gMDsKLQkgICAgICBleGlzdHMgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoISBleGlzdHMKLQkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCSAgICAgIGlmIChmID09IE5VTEwpCi0JCXsKLQkJICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmLT5qdW1wID0gaXNfcGx0OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBRdWljayBhbmQgZGlydHkgd2F5IG9mIHN0cmlwcGluZyB0aGVzZSBzeW1ib2xzIGZyb20gdGhlCi0JIHN5bXRhYi4gKi8KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQloLT5yb290LndyaXR0ZW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAubGludXgtZHluYW1pYyBzZWN0aW9uIGlzLgotICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMaW51eCBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uCi0gICByb3V0aW5lLiAgV2UgaGF2ZSBmaW5pc2hlZCByZWFkaW5nIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIGFuZCBub3cKLSAgIHdlIGp1c3Qgc2NhbiB0aGUgaGFzaCB0YWJsZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYWRkaXRpb25hbCBmaXh1cHMKLSAgIGFyZSByZXF1aXJlZC4gICovCi0KLWJvb2xlYW4KLWJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGxpbnV4X3RhbGx5X3N5bWJvbHMsCi0JCQkgICAgKFBUUikgaW5mbyk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKLSAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdwotICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCXsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCi0JYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgcy0+X3Jhd19zaXplID0gOCArIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAqIDg7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBmaXh1cCB0YWJsZSB0bwotICAgdGhlIG91dHB1dCBmaWxlLiAgU2NhbiB0aGUgZml4dXAgdGFibGVzIGFuZCBzbyBmb3J0aCBhbmQgZ2VuZXJhdGUKLSAgIHRoZSBzdHVmZiB3ZSBuZWVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzLCAqb3MsICppczsKLSAgYmZkX2J5dGUgKmZpeHVwX3RhYmxlOwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIHVuc2lnbmVkIGludCBuZXdfYWRkcjsKLSAgaW50IHNlY3Rpb25fb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZml4dXBzX3dyaXR0ZW47Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZpeHVwc193cml0dGVuID0gMDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLCAKLQkgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQljb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCSAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLQl7Ci0JICAvKiBSZWxhdGl2ZSBhZGRyZXNzICovCi0JICBuZXdfYWRkciA9IG5ld19hZGRyIC0gKGYtPnZhbHVlICsgNSk7IAotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDEsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBpZiAoISBmLT5idWlsdGluKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCQkgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotCSAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLQkgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nmx5bnguYyBiL2JmZC9pMzg2bHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk5ZGQwLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcyB1bmRlciBMeW54T1MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bHlueF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKSAJCQkJICAgICAgXAotCSAgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICBcCi0JCSAgIT0gMCkJCQkJCQkJICAgICAgXAotCSAgICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoIU5BTUUobHlueCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpICAgXAotCQlyZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICBcCi0JCSAgIT0gMCkJCQkJCQkJICAgICAgXAotCSAgICAgICAgcmV0dXJuIDA7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKShhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKSAgICBcCi0JCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgIH0KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kICgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsICgpOwotYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoKTsKLWNvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AgKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQwKLQotI2RlZmluZSBLRUVQSVQgdWRhdGEuaQotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX2V4dF9ob3d0b190YWJsZVtdOwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgYW91dF8zMl9zdGRfaG93dG9fdGFibGVbXTsKLQotLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KLS8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotdm9pZAotTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX291dCkgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgPSAoaW50KSBnLT5ob3d0by0+cGNfcmVsYXRpdmU7CS8qIFJlbGF0aXZlIHRvIFBDPyAqLwotICAvKiByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU/Pz8gIEZJWE1FLXNvb24gKi8KLSAgcl9iYXNlcmVsID0gMDsKLSAgcl9qbXB0YWJsZSA9IDA7Ci0gIHJfcmVsYXRpdmUgPSAwOwotCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogMCkKLQl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRyA6IDApCi0JfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyA6IDApCi0JfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRyA6IDApCi0JfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JfCAocl9wY3JlbCA/IFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSA6IDApCi0JfCAocl9iYXNlcmVsID8gUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUgOiAwKQotCXwgKHJfam1wdGFibGUgPyBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUgOiAwKQotCXwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUgOiAwKQotCXwgKHJfbGVuZ3RoIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotICAgIH0KLX0KLQotCi0vKiBFeHRlbmRlZCBzdHVmZiAqLwotLyogT3V0cHV0IGV4dGVuZGVkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9leHRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgdW5zaWduZWQgaW50IHJfYWRkZW5kOwotICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfdHlwZSA9ICh1bnNpZ25lZCBpbnQpIGctPmhvd3RvLT50eXBlOwotCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCpnLT5zeW1fcHRyX3B0ciktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHIDogMCkKLQl8IChyX3R5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gICAgfQotCi0gIFBVVF9XT1JEIChhYmZkLCByX2FkZGVuZCwgbmF0cHRyLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIEJGRCBkZWFscyBpbnRlcm5hbGx5IHdpdGggYWxsIHRoaW5ncyBiYXNlZCBmcm9tIHRoZSBzZWN0aW9uIHRoZXkncmUKLSAgIGluLiBzbywgc29tZXRoaW5nIGluIDEwIGJ5dGVzIGludG8gYSB0ZXh0IHNlY3Rpb24gIHdpdGggYSBiYXNlIG9mCi0gICA1MCB3b3VsZCBoYXZlIGEgc3ltYm9sICgudGV4dCsxMCkgYW5kIGtub3cgLnRleHQgdm1hIHdhcyA1MC4KLQotICAgQW91dCBrZWVwcyBhbGwgaXQncyBzeW1ib2xzIGJhc2VkIGZyb20gemVybywgc28gdGhlIHN5bWJvbCB3b3VsZAotICAgY29udGFpbiA2MC4gVGhpcyBtYWNybyBzdWJzIHRoZSBiYXNlIG9mIGVhY2ggc2VjdGlvbiBmcm9tIHRoZSB2YWx1ZQotICAgdG8gZ2l2ZSB0aGUgdHJ1ZSBvZmZzZXQgZnJvbSB0aGUgc2VjdGlvbiAqLwotCi0KLSNkZWZpbmUgTU9WRV9BRERSRVNTKGFkKSAgICAgICAJCQkJCQlcCi0gIGlmIChyX2V4dGVybikgewkJCQkJCQlcCi0gICAvKiB1bmRlZmluZWQgc3ltYm9sICovCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHJfaW5kZXg7CQkJXAotICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgfSBlbHNlIHsJCQkJCQkJCVwKLSAgICAvKiBkZWZpbmVkLCBzZWN0aW9uIHJlbGF0aXZlLiByZXBsYWNlIHN5bWJvbCB3aXRoIHBvaW50ZXIgdG8gICAgCVwKLSAgICAgICBzeW1ib2wgd2hpY2ggcG9pbnRzIHRvIHNlY3Rpb24gICovCQkJCVwKLSAgICBzd2l0Y2ggKHJfaW5kZXgpIHsJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUOgkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial90ZXh0c2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAgLSBzdS0+dGV4dHNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBOgkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5kYXRhc2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+YnNzc2VjLT52bWE7CQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGRlZmF1bHQ6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0gICAgIAkJCQkJCQkJXAotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICByX3R5cGUgPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9leHRfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gIE1PVkVfQUREUkVTUyAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRlbmQpKTsKLX0KLQotdm9pZAotTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIHJfaW5kZXggPSBieXRlcy0+cl9pbmRleFsxXTsKLSAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0gIHJfcGNyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLSAgcl9iYXNlcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLSAgcl9qbXB0YWJsZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotICByX3JlbGF0aXZlID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0gIHJfbGVuZ3RoID0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLSAgICA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZSArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7Ci0gIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLwotCi0gIE1PVkVfQUREUkVTUyAoMCk7Ci19Ci0KLS8qIFJlbG9jIGhhY2tlcnkgKi8KLQotYm9vbGVhbgotTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBQVFIgcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLWRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgYXNlY3QtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICBjb3VudCA9IHJlbG9jX3NpemUgLyBlYWNoX3NpemU7Ci0KLQotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbXNldCAocmVsb2NfY2FjaGUsIDAsIGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcnB0ciA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFyZWxlbnQgKmNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JewotCSAgTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJCQliZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCXsKLQkgIE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCX0KLQotICAgIH0KLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG5hdHNpemUgPSBlYWNoX3NpemUgKiBjb3VudDsKLSAgbmF0aXZlID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX3phbGxvYyAoYWJmZCwgbmF0c2l6ZSk7Ci0gIGlmICghbmF0aXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnZW5lcmljID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0KLSAgaWYgKGVhY2hfc2l6ZSA9PSBSRUxPQ19FWFRfU0laRSkKLSAgICB7Ci0gICAgICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLQkgICBjb3VudCAhPSAwOwotCSAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLQlOQU1FKGx5bngsc3dhcF9leHRfcmVsb2Nfb3V0KSAoYWJmZCwgKmdlbmVyaWMsIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIG5hdHB0cik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBuYXRwdHIpOwotICAgIH0KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlICovCi1sb25nCi1OQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKSAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoISh0YmxwdHIgfHwgTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JewotCSAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0JfQotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bWFjaDMuYyBiL2JmZC9pMzg2bWFjaDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmNzU4Mi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm1hY2gzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgZm9yIE1hY2ggMywgd2hpY2ggdXNlcyBhLm91dCwgbm90IE1hY2gtTy4gICovCi0KLS8qIFRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBvciBhbnl0aGluZyB3aGljaCBsZXRzIHVzIGRpc3Rpbmd1aXNoIHRoaXMgdGFyZ2V0Ci0gICBmcm9tIGkzODZhb3V0IG9yIGkzODZic2QuICBTbyB0aGlzIHRhcmdldCBpcyBvbmx5IHVzZWZ1bCBpZiBpdCBpcyB0aGUKLSAgIGRlZmF1bHQgdGFyZ2V0LiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTEKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTB4MTAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgxMDAwMAotI2RlZmluZSBBUkNIIDMyCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotLyogVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gTl9NQUdJQyh4KSA9PSBaTUFHSUMuICAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpCTEKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4Nm1hY2gzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbWFjaDMiCi0KLXN0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykoKTsKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7Ci0gIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KLSAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCi0gIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWShzZXRfc2l6ZXMpLAotICAxLAkJCQkvKiBleGVjIGhlYWRlciBub3QgY291bnRlZCAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZtc2Rvcy5jIGIvYmZkL2kzODZtc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWVjODY0Li4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bXNkb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1TLURPUyBleGVjdXRhYmxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBCcnlhbiBGb3JkIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpZiAwCi1zdHJ1Y3QgZXhlX2hlYWRlcgotewotCXVuc2lnbmVkIHNob3J0IG1hZ2ljOwotCXVuc2lnbmVkIHNob3J0IGJ5dGVzX2luX2xhc3RfcGFnZTsKLQl1bnNpZ25lZCBzaG9ydCBucGFnZXM7CS8qIG51bWJlciBvZiA1MTItYnl0ZSAicGFnZXMiIGluY2x1ZGluZyB0aGlzIGhlYWRlciAqLwotCXVuc2lnbmVkIHNob3J0IG5yZWxvY3M7Ci0JdW5zaWduZWQgc2hvcnQgaGVhZGVyX3BhcmFzOwkvKiBudW1iZXIgb2YgMTYtYnl0ZSBwYXJhZ3JhcGhzIGluIGhlYWRlciAqLwotCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkOwotCXVuc2lnbmVkIHNob3J0IGxvYWRfc3dpdGNoOwotCXVuc2lnbmVkIHNob3J0IHNzX29mczsKLQl1bnNpZ25lZCBzaG9ydCBzcDsKLQl1bnNpZ25lZCBzaG9ydCBjaGVja3N1bTsKLQl1bnNpZ25lZCBzaG9ydCBpcDsKLQl1bnNpZ25lZCBzaG9ydCBjc19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgcmVsb2Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkMjsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmcxOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzI7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMzsKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBFWEVfTUFHSUMJMHg1YTRkCi0jZGVmaW5lIEVYRV9MT0FEX0hJR0gJMHgwMDAwCi0jZGVmaW5lIEVYRV9MT0FEX0xPVwkweGZmZmYKLSNkZWZpbmUgRVhFX1BBR0VfU0laRQk1MTIKLQotCi1zdGF0aWMgaW50Ci1tc2Rvc19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdGF0aWMgY2hhciBoZHJbRVhFX1BBR0VfU0laRV07Ci0gIGZpbGVfcHRyIG91dGZpbGVfc2l6ZSA9IHNpemVvZihoZHIpOwotICBiZmRfdm1hIGhpZ2hfdm1hID0gMDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBGaW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtIG9uIGRpc2sgYW5kIGluIG1lbW9yeS4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgICAgICB7Ci0JICBiZmRfdm1hIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAJCSAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfdm1hID4gaGlnaF92bWEpCi0JICAgIGhpZ2hfdm1hID0gc2VjX3ZtYTsKLQl9Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0xPQUQpCi0gICAgICAgIHsKLQkgIGZpbGVfcHRyIHNlY19lbmQgPSBzaXplb2YoaGRyKQotCSAgCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfZW5kID4gb3V0ZmlsZV9zaXplKQotCSAgICBvdXRmaWxlX3NpemUgPSBzZWNfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBwcm9ncmFtIGlzbid0IHRvbyBiaWcuICAqLwotICBpZiAoaGlnaF92bWEgPiAoYmZkX3ZtYSkweGZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogY29uc3RhbnRzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTUFHSUMsICZoZHJbMF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX1BBR0VfU0laRSAvIDE2LCAmaGRyWzhdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9MT0FEX0xPVywgJmhkclsxMl0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzZSwgJmhkclsyNF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgwMDAxLCAmaGRyWzI4XSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzMGZiLCAmaGRyWzMwXSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHg3MjZhLCAmaGRyWzMyXSk7IC8qIFhYWD8/PyAqLwotCi0gIC8qIGJ5dGVzIGluIGxhc3QgcGFnZSAoMCA9IGZ1bGwgcGFnZSkgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIG91dGZpbGVfc2l6ZSAmIChFWEVfUEFHRV9TSVpFIC0gMSksICZoZHJbMl0pOwotCi0gIC8qIG51bWJlciBvZiBwYWdlcyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKG91dGZpbGVfc2l6ZSArIEVYRV9QQUdFX1NJWkUgLSAxKSAvIEVYRV9QQUdFX1NJWkUsCi0gIAkgICAgICAgJmhkcls0XSk7Ci0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnNzLgotICAgICBUaGUgcHJvZ3JhbSdzIGNydDAgY29kZSBtdXN0IHJlbG9jYXRlIGl0IHRvIGEgcmVhbCBzdGFjay4gICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBoaWdoX3ZtYSwgJmhkclsxNl0pOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChoZHIsIDEsIHNpemVvZihoZHIpLCBhYmZkKSAhPSBzaXplb2YoaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tc2Rvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uLT5maWxlcG9zID0gRVhFX1BBR0VfU0laRSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0jZGVmaW5lIG1zZG9zX21rb2JqZWN0IGFvdXRfMzJfbWtvYmplY3QKLSNkZWZpbmUgbXNkb3NfbWFrZV9lbXB0eV9zeW1ib2wgYW91dF8zMl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBtc2Rvc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dF8zMl9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lCW1zZG9zX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBtc2Rvc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgbXNkb3NfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBtc2Rvc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbXNkb3NfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG1zZG9zX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBtc2Rvc19wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgbXNkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbXNkb3NfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG1zZG9zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG1zZG9zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbXNkb3NfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG1zZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgbXNkb3NfY2Fub25pY2FsaXplX3JlbG9jIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIG1zZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBtc2Rvc18zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm1zZG9zX3ZlYyA9Ci17Ci0gICJtc2RvcyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1ApLAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3NfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotCi0KZGlmZiAtLWdpdCBhL2JmZC9pMzg2bmV0YnNkLmMgYi9iZmQvaTM4Nm5ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjdiNmY5Li4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC8zODYgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZQlERUZBVUxUX01JRCAJTV8zODZfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtbmV0YnNkIgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm9zOWsuYyBiL2JmZC9pMzg2b3M5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZWU1Li4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2b3M5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igb3M5MDAwIGkzODYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSNpbmNsdWRlICJvczlrLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpvczlrX2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi1ib29sZWFuCi1vczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbWhfY29tICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgbWhfY29tICpieXRlcyA9IChtaF9jb20gKikgcmF3X2J5dGVzOwotICB1bnNpZ25lZCBpbnQgZGxvYWQsIGRtZW1zaXplLCBkbWVtc3RhcnQ7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgYnl0ZXMtPm1fc3luYyk7Ci0gIGV4ZWNwLT5hX3N5bXMgPSAwOwotICBleGVjcC0+YV9lbnRyeSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1fZXhlYyk7Ci0gIGV4ZWNwLT5hX3RhbGlnbiA9IDI7Ci0gIGV4ZWNwLT5hX2RhbGlnbiA9IDI7Ci0gIGV4ZWNwLT5hX2JhbGlnbiA9IDI7Ci0KLSAgZGxvYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5tX2lkYXRhKTsKLSAgZXhlY3AtPmFfZGF0YSA9IGRsb2FkICsgODsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZGxvYWQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKCZkbWVtc3RhcnQsIHNpemVvZiAoZG1lbXN0YXJ0KSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoZG1lbXN0YXJ0KSkKLSAgICAgIHx8IChiZmRfcmVhZCAoJmRtZW1zaXplLCBzaXplb2YgKGRtZW1zaXplKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoZG1lbXNpemUpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXhlY3AtPmFfdGxvYWQgPSAwOwotICBleGVjcC0+YV9kbG9hZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmRtZW1zdGFydCk7Ci0gIGV4ZWNwLT5hX3RleHQgPSBkbG9hZCAtIGV4ZWNwLT5hX3Rsb2FkOwotICBleGVjcC0+YV9kYXRhID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZG1lbXNpemUpOwotICBleGVjcC0+YV9ic3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5tX2RhdGEpIC0gZXhlY3AtPmFfZGF0YTsKLQotICBleGVjcC0+YV90cnNpemUgPSAwOwotICBleGVjcC0+YV9kcnNpemUgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWYgMAotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQotICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLwotCi1QUk9UTyAodm9pZCwgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX291dCwKLSAgICAgICAgIChiZmQgKiBhYmZkLAotCSAgc3RydWN0IGludGVybmFsX2V4ZWMgKiBleGVjcCwKLQkgIHN0cnVjdCBtaF9jb20gKiByYXdfYnl0ZXMpKTsKLXZvaWQKLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLXsKLSAgbWhfY29tICpieXRlcyA9IChtaF9jb20gKikgcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbywgYnl0ZXMtPmVfaW5mbyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfdGV4dCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZGF0YSwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfYnNzLCBieXRlcy0+ZV9ic3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3N5bXMsIGJ5dGVzLT5lX3N5bXMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5LCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90bG9hZCwgYnl0ZXMtPmVfdGxvYWQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2Rsb2FkLCBieXRlcy0+ZV9kbG9hZCk7Ci0gIGJ5dGVzLT5lX3RhbGlnblswXSA9IGV4ZWNwLT5hX3RhbGlnbjsKLSAgYnl0ZXMtPmVfZGFsaWduWzBdID0gZXhlY3AtPmFfZGFsaWduOwotICBieXRlcy0+ZV9iYWxpZ25bMF0gPSBleGVjcC0+YV9iYWxpZ247Ci0gIGJ5dGVzLT5lX3JlbGF4YWJsZVswXSA9IGV4ZWNwLT5hX3JlbGF4YWJsZTsKLX0KLQotI2VuZGlmCS8qIDAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3M5a19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBhbmV4ZWM7Ci0gIG1oX2NvbSBleGVjX2J5dGVzOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBleGVjX2J5dGVzLCBNSENPTV9CWVRFU19TSVpFLCAxLCBhYmZkKQotICAgICAgIT0gTUhDT01fQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYW5leGVjLmFfaW5mbyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXhlY19ieXRlcy5tX3N5bmMpOwotICBpZiAoTl9CQURNQUcgKGFuZXhlYykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCEgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYykpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZhbmV4ZWMsIG9zOWtfY2FsbGJhY2spOwotfQotCi0KLS8qIEZpbmlzaCB1cCB0aGUgb3BlbmluZyBvZiBhIGIub3V0IGZpbGUgZm9yIHJlYWRpbmcuICBGaWxsIGluIGFsbCB0aGUKLSAgIGZpZWxkcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBjb21tb24gY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zOWtfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBsb25nIGJzc19zdGFydDsKLQotICAvKiBBcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSAqLwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaTM4NiwgMCk7Ci0KLSAgLyogVGhlIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gMDsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IDA7Ci0KLSAgLyogVGhlIGFsaWdubWVudHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfdGFsaWduOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2RhbGlnbjsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2JhbGlnbjsKLQotICAvKiBUaGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfdGxvYWQ7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfZGxvYWQ7Ci0KLSAgLyogQW5kIHJlbG9hZCB0aGUgc2l6ZXMsIHNpbmNlIHRoZSBhb3V0IG1vZHVsZSB6YXBzIHRoZW0gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OwotCi0gIGJzc19zdGFydCA9IGV4ZWNwLT5hX2Rsb2FkICsgZXhlY3AtPmFfZGF0YTsJLyogQlNTID0gZW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gYWxpZ25fcG93ZXIgKGJzc19zdGFydCwgZXhlY3AtPmFfYmFsaWduKTsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IGV4ZWNwLT5hX2VudHJ5OwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBleGVjcC0+YV9kbG9hZDsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqKioKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9ICBOX0RST0ZGKCpleGVjcCk7Ci0gICovCi0KLSAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7CS8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMTsvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IE1IQ09NX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLSNpZiAwCi1zdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdAotewotICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1vczlrX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5ib3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICZyYXdwdHItPmU7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG9ial9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb3M5a193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgc3dhcHBlZF9oZHI7Ci0KLSAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2luZm8gPSBCTUFHSUM7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JzcyA9IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKHN0cnVjdCBubGlzdCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90YWxpZ24gPSBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhbGlnbiA9IG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfYmFsaWduID0gb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGxvYWQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Rsb2FkID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0KLSAgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY19oZHIgKGFiZmQpLCAmc3dhcHBlZF9oZHIpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJiBzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9TWU1PRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFhb3V0XzMyX3dyaXRlX3N5bXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1RST0ZGICgqZXhlY19oZHIgKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX0RST0ZGICgqZXhlY19oZHIgKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi1zdGF0aWMgYm9vbGVhbgotb3M5a19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBpbnQgY291bnQ7Ci17Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewkJCQkvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotICAgICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zCi0JKyBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAgIH0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAoYmZkX3dyaXRlICgoUFRSKSBsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmCS8qIDAgKi8KLQotc3RhdGljIGludAotb3M5a19zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXAgYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgb3M5a19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG9zOWtfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBvczlrX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBvczlrX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG9zOWtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgb3M5a19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBvczlrX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBpMzg2b3M5a192ZWMgPQotewotICAiaTM4Nm9zOWsiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhkciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgV1BfVEVYVCksCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgb3M5a19vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKG9zOWspLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2llZWUuYyBiL2JmZC9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjk2N2EuLjAwMDAwMDAKLS0tIGEvYmZkL2llZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OTAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpZWVlLTY5NSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgS0VFUE1JTlVTUENJTklOU1QgMAotCi0vKiBJRUVFIDY5NSBmb3JtYXQgaXMgYSBzdHJlYW0gb2YgcmVjb3Jkcywgd2hpY2ggd2UgcGFyc2UgdXNpbmcgYSBzaW1wbGUgb25lLQotICAgdG9rZW4gKHdoaWNoIGlzIG9uZSBieXRlIGluIHRoaXMgbGV4aWNvbikgbG9va2FoZWFkIHJlY3Vyc2l2ZSBkZWNlbnQKLSAgIHBhcnNlci4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJpZWVlLmgiCi0jaW5jbHVkZSAibGliaWVlZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9ieXRlIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50IFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZXhwcmVzc2lvbgotICBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYXN5bWJvbCAqLCBib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGllZWVfd3JpdGVfaW50NSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2ludDVfb3V0IFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZG9fd2l0aF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGRvX2FzX3JlcGVhdCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fd2l0aG91dF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kYXRhX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZGVidWdfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9tZV9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3Byb2Nlc3NvciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3NsdXJwX2RlYnVnIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBGdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLSAgIHN0YW5kYXJkIHJlcXVpcmVzLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9ieXRlIChhYmZkLCBiYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBiYXJnOwotewotICBiZmRfYnl0ZSBieXRlOwotCi0gIGJ5dGUgPSBiYXJnOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYnl0ZSwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGJ5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBieXRlczsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0gIGJ1ZmZlclswXSA9IGJ5dGVzID4+IDg7Ci0gIGJ1ZmZlclsxXSA9IGJ5dGVzICYgMHhmZjsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCAyLCBhYmZkKSAhPSAyKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2ludCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlIDw9IDEyNykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gICAgICAvKiBIb3cgbWFueSBzaWduaWZpY2FudCBieXRlcyA/ICovCi0gICAgICAvKiBGSVhNRSBGT1IgTE9OR0VSIElOVFMgKi8KLSAgICAgIGlmICh2YWx1ZSAmIDB4ZmYwMDAwMDApCi0JbGVuZ3RoID0gNDsKLSAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMGZmMDAwMCkKLQlsZW5ndGggPSAzOwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwMDBmZjAwKQotCWxlbmd0aCA9IDI7Ci0gICAgICBlbHNlCi0JbGVuZ3RoID0gMTsKLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJICAgICAoYmZkX2J5dGUpICgoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bQotCQkJCQkgKyBsZW5ndGgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGxlbmd0aCkKLQl7Ci0JY2FzZSA0OgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAyNCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMzoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gMTYpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIDI6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIDE6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqaWQ7Ci17Ci0gIHNpemVfdCBsZW5ndGggPSBzdHJsZW4gKGlkKTsKLQotICBpZiAobGVuZ3RoIDw9IDEyNykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgbGVuZ3RoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPCAyNTUpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgbGVuZ3RoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPCA2NTUzNSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHN0cmluZyB0b28gbG9uZyAoJWQgY2hhcnMsIG1heCA2NTUzNSkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxlbmd0aCk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBpZCwgMSwgbGVuZ3RoLCBhYmZkKSAhPSBsZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUZ1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGllZWUgZmlsZXMgaW4gdGhlIHN0cmFuZ2Ugd2F5IHRoYXQgdGhlCi1zdGFuZGFyZCByZXF1aXJlczoKLSovCi0KLSNkZWZpbmUgdGhpc19ieXRlKGllZWUpICooKGllZWUpLT5pbnB1dF9wKQotI2RlZmluZSBuZXh0X2J5dGUoaWVlZSkgKChpZWVlKS0+aW5wdXRfcCsrKQotI2RlZmluZSB0aGlzX2J5dGVfYW5kX25leHQoaWVlZSkgKCooKGllZWUpLT5pbnB1dF9wKyspKQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQKLXJlYWRfMmJ5dGVzIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYzEgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICB1bnNpZ25lZCBjaGFyIGMyID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgcmV0dXJuIChjMSA8PCA4KSB8IGMyOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX2dldF9zdHJpbmcgKGllZWUsIHN0cmluZywgbGVuZ3RoKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgc2l6ZV90IGxlbmd0aDsKLXsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdHJpbmdbaV0gPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9pZCAoaWVlZSkKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotewotICBzaXplX3QgbGVuZ3RoOwotICBjaGFyICpzdHJpbmc7Ci0gIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIGlmIChsZW5ndGggPD0gMHg3ZikKLSAgICB7Ci0gICAgICAvKiBTaW1wbGUgc3RyaW5nIG9mIGxlbmd0aCAwIHRvIDEyNyAqLwotICAgIH0KLSAgZWxzZSBpZiAobGVuZ3RoID09IDB4ZGUpCi0gICAgewotICAgICAgLyogTGVuZ3RoIGlzIG5leHQgYnl0ZSwgYWxsb3dpbmcgMC4uMjU1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgZWxzZSBpZiAobGVuZ3RoID09IDB4ZGYpCi0gICAgewotICAgICAgLyogTGVuZ3RoIGlzIG5leHQgdHdvIGJ5dGVzLCBhbGxvd2luZyAwLi42NTUzNSAqLwotICAgICAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgICAgIGxlbmd0aCA9IChsZW5ndGggKiAyNTYpICsgdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgICB9Ci0gIC8qIEJ1eSBtZW1vcnkgYW5kIHJlYWQgc3RyaW5nICovCi0gIHN0cmluZyA9IGJmZF9hbGxvYyAoaWVlZS0+YWJmZCwgbGVuZ3RoICsgMSk7Ci0gIGlmICghc3RyaW5nKQotICAgIHJldHVybiBOVUxMOwotICBiZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpOwotICBzdHJpbmdbbGVuZ3RoXSA9IDA7Ci0gIHJldHVybiBzdHJpbmc7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHZhbHVlLCBzeW1ib2wsIHBjcmVsLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgdW5zaWduZWQgaW50IHRlcm1fY291bnQgPSAwOwotCi0gIGlmICh2YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogRGVmIG9mIGEgY29tbW9uIHN5bWJvbCAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1hfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRlcm1fY291bnQrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFJlZiB0byBkZWZpbmVkIHN5bWJvbCAtICovCi0KLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfSV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0ZXJtX2NvdW50Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIChCU0ZfTE9DQUwgfCBCU0ZfU0VDVElPTl9TWU0pKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIGxvY2FsIHN5bWJvbC4gIFdlIGNhbgotCSAgICAgZWFzaWx5IGRvIGEgbG9jYWwgYXMgYSBzZWN0aW9uK29mZnNldC4gICovCi0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUl9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzeW1ib2wtPnNlY3Rpb24tPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0ZXJtX2NvdW50Kys7Ci0JICBpZiAoc3ltYm9sLT52YWx1ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgdGVybV9jb3VudCsrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVucmVjb2duaXplZCBzeW1ib2wgYCVzJyBmbGFncyAweCV4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkgICAgIHN5bWJvbC0+ZmxhZ3MpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChwY3JlbCkKLSAgICB7Ci0gICAgICAvKiBzdWJ0cmFjdCB0aGUgcGMgZnJvbSBoZXJlIGJ5IGFza2luZyBmb3IgUEMgb2YgdGhpcyBzZWN0aW9uKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9QX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkoYmZkX2J5dGUpIChpbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgZGVnZW5lcmF0ZSBjYXNlIG9mIGEgMCBhZGRyZXNzLiAgKi8KLSAgaWYgKHRlcm1fY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB3aGlsZSAodGVybV9jb3VudCA+IDEpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudC0tOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLXdyaXRlcyBhbnkgaW50ZWdlciBpbnRvIHRoZSBidWZmZXIgc3VwcGxpZWQgYW5kIGFsd2F5cyB0YWtlcyA1IGJ5dGVzCi0qLwotc3RhdGljIHZvaWQKLWllZWVfd3JpdGVfaW50NSAoYnVmZmVyLCB2YWx1ZSkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYnVmZmVyWzBdID0gKGJmZF9ieXRlKSBpZWVlX251bWJlcl9yZXBlYXRfNF9lbnVtOwotICBidWZmZXJbMV0gPSAodmFsdWUgPj4gMjQpICYgMHhmZjsKLSAgYnVmZmVyWzJdID0gKHZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0gIGJ1ZmZlclszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7Ci0gIGJ1ZmZlcls0XSA9ICh2YWx1ZSA+PiAwKSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2ludDVfb3V0IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBiZmRfYnl0ZSBiWzVdOwotCi0gIGllZWVfd3JpdGVfaW50NSAoYiwgdmFsdWUpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBiLCAxLCA1LCBhYmZkKSAhPSA1KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pbnQgKGllZWUsIHZhbHVlX3B0cikKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotICAgICBiZmRfdm1hICp2YWx1ZV9wdHI7Ci17Ci0gIGludCB2YWx1ZSA9IHRoaXNfYnl0ZSAoaWVlZSk7Ci0gIGludCByZXN1bHQ7Ci0gIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEyNykKLSAgICB7Ci0gICAgICAqdmFsdWVfcHRyID0gdmFsdWU7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSA+PSAweDgwICYmIHZhbHVlIDw9IDB4ODgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gdmFsdWUgJiAweGY7Ci0gICAgICByZXN1bHQgPSAwOwotICAgICAgbmV4dF9ieXRlIChpZWVlKTsKLSAgICAgIHdoaWxlIChjb3VudCkKLQl7Ci0JICByZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLQkgIGNvdW50LS07Ci0JfQotICAgICAgKnZhbHVlX3B0ciA9IHJlc3VsdDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9pIChpZWVlLCBvaykKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotICAgICBib29sZWFuICpvazsKLXsKLSAgYmZkX3ZtYSB4OwotICAqb2sgPSBwYXJzZV9pbnQgKGllZWUsICZ4KTsKLSAgcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1tdXN0X3BhcnNlX2ludCAoaWVlZSkKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotewotICBiZmRfdm1hIHJlc3VsdDsKLSAgQkZEX0FTU0VSVCAocGFyc2VfaW50IChpZWVlLCAmcmVzdWx0KSA9PSB0cnVlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOwotfSBpZWVlX3ZhbHVlX3R5cGU7Ci0KLQotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0KLSNkZWZpbmUgU1JDX01BU0soYXJnKSBhcmcKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIGZhbHNlCi0KLSNlbHNlCi0KLSNkZWZpbmUgU1JDX01BU0soYXJnKSAwCi0jZGVmaW5lIFBDUkVMX09GRlNFVCB0cnVlCi0KLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnMzMl9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAyLAotCSAzMiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSAwLAotCSAiYWJzMzIiLAotCSB0cnVlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczE2X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMxNiIsCi0JIHRydWUsCi0JIDB4MDAwMGZmZmYsCi0JIDB4MDAwMGZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzOF9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnM4IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwMDBmZiwKLQkgMHgwMDAwMDBmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWwzMl9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAyLAotCSAzMiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSAwLAotCSAicmVsMzIiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHhmZmZmZmZmZiksCi0JIDB4ZmZmZmZmZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDE2X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwxNiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweDAwMDBmZmZmKSwKLQkgMHgwMDAwZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsOF9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWw4IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMDAwZmYpLAotCSAweDAwMDAwMGZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBOT1NZTUJPTCA9IHswLCAwfTsKLQotc3RhdGljIHZvaWQKLXBhcnNlX2V4cHJlc3Npb24gKGllZWUsIHZhbHVlLCBzeW1ib2wsIHBjcmVsLCBleHRyYSwgc2VjdGlvbikKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlOwotICAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gKnBjcmVsOwotICAgICB1bnNpZ25lZCBpbnQgKmV4dHJhOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb247Ci0KLXsKLSNkZWZpbmUgUE9TIHNwWzFdCi0jZGVmaW5lIFRPUyBzcFswXQotI2RlZmluZSBOT1Mgc3BbLTFdCi0jZGVmaW5lIElOQyBzcCsrOwotI2RlZmluZSBERUMgc3AtLTsKLQotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBpZWVlX3ZhbHVlX3R5cGUgc3RhY2tbMTBdOwotCi0gIC8qIFRoZSBzdGFjayBwb2ludGVyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgdW51c2VkIGxvY2F0aW9uICovCi0jZGVmaW5lIFBVU0goeCx5LHopIFRPUy5zeW1ib2w9eDtUT1Muc2VjdGlvbj15O1RPUy52YWx1ZT16O0lOQzsKLSNkZWZpbmUgUE9QKHgseSx6KSBERUM7eD1UT1Muc3ltYm9sO3k9VE9TLnNlY3Rpb247ej1UT1MudmFsdWU7Ci0gIGllZWVfdmFsdWVfdHlwZSAqc3AgPSBzdGFjazsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCWNhc2UgaWVlZV92YXJpYWJsZV9QX2VudW06Ci0JICAvKiBQIHZhcmlhYmxlLCBjdXJyZW50IHByb2dyYW0gY291bnRlciBmb3Igc2VjdGlvbiBuICovCi0JICB7Ci0JICAgIGludCBzZWN0aW9uX247Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgICpwY3JlbCA9IHRydWU7Ci0JICAgIHNlY3Rpb25fbiA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgUFVTSCAoTk9TWU1CT0wsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIDApOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIGllZWVfdmFyaWFibGVfTF9lbnVtOgotCSAgLyogTCB2YXJpYWJsZSAgYWRkcmVzcyBvZiBzZWN0aW9uIE4gKi8KLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBQVVNIIChOT1NZTUJPTCwgaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9SX2VudW06Ci0JICAvKiBSIHZhcmlhYmxlLCBsb2dpY2FsIGFkZHJlc3Mgb2Ygc2VjdGlvbiBtb2R1bGUgKi8KLQkgIC8qIEZJWE1FLCB0aGlzIHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gTCAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1NfZW51bToKLQkgIC8qIFMgdmFyaWFibGUsIHNpemUgaW4gTUFVUyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLAotCQkwLAotCQlpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0tPl9yYXdfc2l6ZSk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfSV9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBzeS5sZXR0ZXIgPSAnSSc7Ci0KLQkgICAgUFVTSCAoc3ksIGJmZF9hYnNfc2VjdGlvbl9wdHIsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1hfZW51bToKLQkgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgZXh0ZXJuYWwgdmFyaWFibGUgbiAqLwotCSAgewotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5OwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBzeS5pbmRleCA9IChpbnQpIChtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSkpOwotCSAgICBzeS5sZXR0ZXIgPSAnWCc7Ci0KLQkgICAgUFVTSCAoc3ksIGJmZF91bmRfc2VjdGlvbl9wdHIsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgdmFsdWUxLCB2YWx1ZTI7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uMSwgKnNlY3Rpb25fZHVtbXk7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgUE9QIChzeSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3ksIHNlY3Rpb25fZHVtbXksIHZhbHVlMik7Ci0JICAgIFBVU0ggKHN5LCBzZWN0aW9uMSA/IHNlY3Rpb24xIDogc2VjdGlvbl9kdW1teSwgdmFsdWUyIC0gdmFsdWUxKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgdmFsdWUxLCB2YWx1ZTI7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24yOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTI7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCB2YWx1ZTEpOwotCSAgICBQT1AgKHN5Miwgc2VjdGlvbjIsIHZhbHVlMik7Ci0JICAgIFBVU0ggKHN5MS5sZXR0ZXIgPyBzeTEgOiBzeTIsCi0JCSAgYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uMSkgPyBzZWN0aW9uMiA6IHNlY3Rpb24xLAotCQkgIHZhbHVlMSArIHZhbHVlMik7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgewotCSAgICBiZmRfdm1hIHZhOwotCSAgICBCRkRfQVNTRVJUICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpIDwgKGludCkgaWVlZV92YXJpYWJsZV9BX2VudW0KLQkJICAgIHx8IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPiAoaW50KSBpZWVlX3ZhcmlhYmxlX1pfZW51bSk7Ci0JICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YSkpCi0JICAgICAgewotCQlQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgdmEpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyoKLQkJICBUaGF0cyBhbGwgdGhhdCB3ZSBjYW4gdW5kZXJzdGFuZC4gQXMgZmFyIGFzIEkgY2FuIHNlZQotCQkgIHRoZXJlIGlzIGEgYnVnIGluIHRoZSBNaWNyb3RlYyBJRUVFIG91dHB1dCB3aGljaCBJJ20KLQkJICB1c2luZyB0byBzY2FuLCB3aGVyZWJ5IHRoZSBjb21tYSBvcGVyYXRvciBpcyBvbWl0dGVkCi0JCSAgc29tZXRpbWVzIGluIGFuIGV4cHJlc3Npb24sIGdpdmluZyBleHByZXNzaW9ucyB3aXRoIHRvbwotCQkgIG1hbnkgdGVybXMuIFdlIGNhbiB0ZWxsIGlmIHRoYXQncyB0aGUgY2FzZSBieSBlbnN1cmluZwotCQkgIHRoYXQgc3AgPT0gc3RhY2sgaGVyZS4gSWYgbm90LCB0aGVuIHdlJ3ZlIHB1c2hlZAotCQkgIHNvbWV0aGluZyB0b28gZmFyLCBzbyB3ZSBrZWVwIGFkZGluZy4gICovCi0KLQkJd2hpbGUgKHNwICE9IHN0YWNrICsgMSkKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqc2VjdGlvbjE7Ci0JCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MTsKLQkJICAgIFBPUCAoc3kxLCBzZWN0aW9uMSwgKmV4dHJhKTsKLQkJICB9Ci0JCXsKLQkJICBhc2VjdGlvbiAqZHVtbXk7Ci0KLQkJICBQT1AgKCpzeW1ib2wsIGR1bW15LCAqdmFsdWUpOwotCQkgIGlmIChzZWN0aW9uKQotCQkgICAgKnNlY3Rpb24gPSBkdW1teTsKLQkJfQotCi0JCWxvb3AgPSBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JfQotICAgIH0KLX0KLQotCi0jZGVmaW5lIGllZWVfc2VlayhhYmZkLCBvZmZzZXQpIFwKLSAgSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgPSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSArIG9mZnNldAotCi0jZGVmaW5lIGllZWVfcG9zKGFiZmQpIFwKLSAgKElFRUVfREFUQShhYmZkKS0+aC5pbnB1dF9wIC0gSUVFRV9EQVRBKGFiZmQpLT5oLmZpcnN0X2J5dGUpCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9pbmRleDsKLXN0YXRpYyBjaGFyIGxhc3RfdHlwZTsJCS8qIGlzIHRoZSBpbmRleCBmb3IgYW4gWCBvciBhIEQgKi8KLQotc3RhdGljIGllZWVfc3ltYm9sX3R5cGUgKgotZ2V0X3N5bWJvbCAoYWJmZCwKLQkgICAgaWVlZSwKLQkgICAgbGFzdF9zeW1ib2wsCi0JICAgIHN5bWJvbF9jb3VudCwKLQkgICAgcHB0ciwKLQkgICAgbWF4X2luZGV4LAotCSAgICB0aGlzX3R5cGUKLSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3N5bWJvbF90eXBlICpsYXN0X3N5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICpzeW1ib2xfY291bnQ7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKioqcHB0cjsKLSAgICAgdW5zaWduZWQgaW50ICptYXhfaW5kZXg7Ci0gICAgIGNoYXIgdGhpc190eXBlCi0gICAgICA7Ci17Ci0gIC8qIE5lZWQgYSBuZXcgc3ltYm9sICovCi0gIHVuc2lnbmVkIGludCBuZXdfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gIGlmIChuZXdfaW5kZXggIT0gbGFzdF9pbmRleCB8fCB0aGlzX3R5cGUgIT0gbGFzdF90eXBlKQotICAgIHsKLSAgICAgIGllZWVfc3ltYm9sX3R5cGUgKm5ld19zeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgICAgIGlmICghbmV3X3N5bWJvbCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbmV3X3N5bWJvbC0+aW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICBsYXN0X2luZGV4ID0gbmV3X2luZGV4OwotICAgICAgKCpzeW1ib2xfY291bnQpKys7Ci0gICAgICAqKnBwdHIgPSBuZXdfc3ltYm9sOwotICAgICAgKnBwdHIgPSAmbmV3X3N5bWJvbC0+bmV4dDsKLSAgICAgIGlmIChuZXdfaW5kZXggPiAqbWF4X2luZGV4KQotCXsKLQkgICptYXhfaW5kZXggPSBuZXdfaW5kZXg7Ci0JfQotICAgICAgbGFzdF90eXBlID0gdGhpc190eXBlOwotICAgICAgbmV3X3N5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgcmV0dXJuIG5ld19zeW1ib2w7Ci0gICAgfQotICByZXR1cm4gbGFzdF9zeW1ib2w7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuZXh0ZXJuYWxfcGFydDsKLQotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9zeW1ib2xzX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9zeW1ib2xzOwotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9yZWZlcmVuY2VfcHRyID0gJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IDA7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGxhc3RfaW5kZXggPSAweGZmZmZmZjsKLSAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSB0cnVlOwotCi0gIGllZWVfc2VlayAoYWJmZCwgb2Zmc2V0KTsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCWNhc2UgaWVlZV9ubl9yZWNvcmQ6Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdJJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnRCcpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCk7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfYXR0cmlidXRlX2RlZjsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW06Ci0JCXN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfdHlwZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3ltYm9sX2F0dHJpYnV0ZV9kZWYgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN3aXRjaCAoc3ltYm9sX2F0dHJpYnV0ZV9kZWYpCi0JCSAgewotCQkgIGNhc2UgODoKLQkJICBjYXNlIDE5OgotCQkgICAgcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzeW1ib2xfYXR0cmlidXRlX2RlZiwKLQkJICAgICAgIHN5bWJvbF9uYW1lX2luZGV4KTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW06Ci0JCS8qIFNraXAgb3ZlciBBVFggcmVjb3JkLiAqLwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06Ci0JCS8qIFdlIG1heSBnZXQgY2FsbCBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24gaGVyZSwKLQkJICAgd2hpY2ggd2UganVzdCBpZ25vcmUuICBUaGUgZm9ybWF0IGlzCi0JCSAgIHskRjF9JHtDRX17aW5kZXh9eyQwMH17JDNGfXskM0Z9eyNfb2ZfQVNOc30gKi8KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlICE9IDB4M2YpCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgIChfKCIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIChpbnQpIHZhbHVlKTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJd2hpbGUgKHZhbHVlID4gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDE7Ci0KLQkJICAgIC0tdmFsdWU7Ci0KLQkJICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgaWVlZV9hc25fcmVjb3JkX2VudW06Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbF9pZ25vcmU7Ci0JICAgIGJvb2xlYW4gcGNyZWxfaWdub3JlOwotCSAgICB1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wudmFsdWUsCi0JCQkgICAgICAmc3ltYm9sX2lnbm9yZSwKLQkJCSAgICAgICZwY3JlbF9pZ25vcmUsCi0JCQkgICAgICAmZXh0cmEsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wuc2VjdGlvbik7Ci0KLQkgICAgLyogRnVsbHkgbGlua2VkIElFRUUtNjk1IGZpbGVzIHRlbmQgdG8gZ2l2ZSBldmVyeSBzeW1ib2wKLSAgICAgICAgICAgICAgIGFuIGFic29sdXRlIHZhbHVlLiAgVHJ5IHRvIGNvbnZlcnQgdGhhdCBiYWNrIGludG8gYQotICAgICAgICAgICAgICAgc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZS4gIEZJWE1FOiBUaGlzIHdvbid0IGFsd2F5cyB0bwotICAgICAgICAgICAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikKLQkJJiYgKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSA9PSAwKQotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWw7Ci0JCWFzZWN0aW9uICpzOwotCi0JCXZhbCA9IHN5bWJvbC0+c3ltYm9sLnZhbHVlOwotCQlmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAodmFsID49IHMtPnZtYSAmJiB2YWwgPCBzLT52bWEgKyBzLT5fcmF3X3NpemUpCi0JCSAgICAgIHsKLQkJCXN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBzOwotCQkJc3ltYm9sLT5zeW1ib2wudmFsdWUgLT0gcy0+dm1hOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHNpemU7Ci0JICAgIGJmZF92bWEgdmFsdWU7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIFRocm93IGF3YXkgdGhlIGV4dGVybmFsIHJlZmVyZW5jZSBpbmRleCAqLwotCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXVsdCBzaXplIGlmIG5vdCByZXNvbHZlZCAqLwotCSAgICBzaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXV0bHQgdmFsdWUgaWYgYXZhaWxhYmxlICovCi0JICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSkgPT0gZmFsc2UpCi0JICAgICAgewotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIHR1cm5zIGludG8gYSBjb21tb24gKi8KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3JlZmVyZW5jZV9wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXgsICdYJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSAoYmZkX3ZtYSkgMDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPSAwOwotICAgIH0KLQotICBpZiAoaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9Ci0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAtCi0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPQotICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICBpZiAoc3ltYm9sX2NvdW50ICE9IGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBnYXBzIGluIHRoZSB0YWJsZSAtLSAqLwotICAgICAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgKnByZXZfc3ltYm9sc19wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICAqcHJldl9yZWZlcmVuY2VfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPSB0cnVlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgIT0gMCkgPwotICAgIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSAqKSkgOiAwOwotfQotCi0vKgotTW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0cyB0byB0aGUgY2Fub24gdGFibGUsIGFuZCBpbnNlcnQgaW4KLXN5bWJvbCBpbmRleCBvcmRlcgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBpZWVlX3N5bWJvbF90eXBlICpzeW1wOwotICBzdGF0aWMgYmZkIGR1bW15X2JmZDsKLSAgc3RhdGljIGFzeW1ib2wgZW1wdHlfc3ltYm9sID0KLSAgewotICAgICZkdW1teV9iZmQsCi0gICAgIiBpZWVlIGVtcHR5IiwKLSAgICAoc3ltdmFsdWUpIDAsCi0gICAgQlNGX0RFQlVHR0lORywKLSAgICBiZmRfYWJzX3NlY3Rpb25fcHRyCi0jaWZkZWYgX19TVERDX18KLSAgICAvKiBLJlIgY29tcGlsZXJzIGNhbid0IGluaXRpYWxpc2UgdW5pb25zLiAgKi8KLSAgICAsIHsgMCB9Ci0jZW5kaWYKLSAgfTsKLQotICBpZiAoYWJmZC0+c3ltY291bnQpCi0gICAgewotICAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAgICAgZHVtbXlfYmZkLnh2ZWMgPSAmaWVlZV92ZWM7Ci0gICAgICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZiAoaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPT0gZmFsc2UpCi0JewotCSAgLyogQXJyZ2ggLSB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgdGFibGUsIHJ1biB0aHJvdWdoIGFuZCBmaWxsIHRoZW0gKi8KLQkgIC8qIHVwIHdpdGggcG9pbnRlcnMgdG8gYSBudWxsIHBsYWNlICovCi0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zeW1jb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9jYXRpb25baV0gPSAmZW1wdHlfc3ltYm9sOwotCSAgICB9Ci0JfQotCi0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQgPSAtaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleDsKLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3N5bWJvbHM7Ci0JICAgc3ltcCAhPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCSAgIHN5bXAgPSBzeW1wLT5uZXh0KQotCXsKLQkgIC8qIFBsYWNlIGludG8gdGFibGUgYXQgY29ycmVjdCBpbmRleCBsb2NhdGlvbnMgKi8KLQkgIGxvY2F0aW9uW3N5bXAtPmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0XSA9ICZzeW1wLT5zeW1ib2w7Ci0JfQotCi0gICAgICAvKiBUaGUgZXh0ZXJuYWwgcmVmcyBhcmUgaW5kZXhlZCBpbiBhIGJpdCAqLwotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0ID0KLQktaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICAgICAgZm9yIChzeW1wID0gSUVFRV9EQVRBIChhYmZkKS0+ZXh0ZXJuYWxfcmVmZXJlbmNlOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldF0gPQotCSAgICAmc3ltcC0+c3ltYm9sOwotCi0JfQotICAgIH0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGxvY2F0aW9uW2FiZmQtPnN5bWNvdW50XSA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYWJmZC0+c3ltY291bnQ7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1nZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgaWYgKGluZGV4ID49IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgICAgIGFzZWN0aW9uICoqbjsKLQotICAgICAgYyA9IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZTsKLSAgICAgIGlmIChjID09IDApCi0JYyA9IDIwOwotICAgICAgd2hpbGUgKGMgPD0gaW5kZXgpCi0JYyAqPSAyOwotCi0gICAgICBuID0gKChhc2VjdGlvbiAqKikKLQkgICBiZmRfcmVhbGxvYyAoaWVlZS0+c2VjdGlvbl90YWJsZSwgYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgICAgIGlmIChuID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGZvciAoaSA9IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZTsgaSA8IGM7IGkrKykKLQluW2ldID0gTlVMTDsKLQotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZSA9IG47Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSBjOwotICAgIH0KLQotICBpZiAoaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF0gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdG1wID0gYmZkX2FsbG9jIChhYmZkLCAxMSk7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAgICAgaWYgKCF0bXApCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBzcHJpbnRmICh0bXAsICIgZnNlYyU0ZCIsIGluZGV4KTsKLSAgICAgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0bXApOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF0gPSBzZWN0aW9uOwotICAgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gICAgICBzZWN0aW9uLT50YXJnZXRfaW5kZXggPSBpbmRleDsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XTsKLX0KLQotc3RhdGljIHZvaWQKLWllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuc2VjdGlvbl9wYXJ0OwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBjaGFyICpuYW1lOwotCi0gIGlmIChvZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBzZWN0aW9uX3R5cGVbM107Ci0gICAgICBpZWVlX3NlZWsgKGFiZmQsIG9mZnNldCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkKLQl7Ci0JICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgIHsKLQkgICAgY2FzZSBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCXNlY3Rpb25faW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQotCQlzZWN0aW9uX3R5cGVbMF0gPSB0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpOwotCi0JCS8qIFNldCBtaW5pbWFsIHNlY3Rpb24gYXR0cmlidXRlcy4gQXR0cmlidXRlcyBhcmUKLQkJICAgZXh0ZW5kZWQgbGF0ZXIsIGJhc2VkIG9uIHNlY3Rpb24gY29udGVudHMuICovCi0KLQkJc3dpdGNoIChzZWN0aW9uX3R5cGVbMF0pCi0JCSAgewotCQkgIGNhc2UgMHhDMToKLQkJICAgIC8qIE5vcm1hbCBhdHRyaWJ1dGVzIGZvciBhYnNvbHV0ZSBzZWN0aW9ucwkqLwotCQkgICAgc2VjdGlvbl90eXBlWzFdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCQkgICAgc3dpdGNoIChzZWN0aW9uX3R5cGVbMV0pCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAweEQzOgkvKiBBUyBBYnNvbHV0ZSBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uX3R5cGVbMl0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc3dpdGNoIChzZWN0aW9uX3R5cGVbMl0pCi0JCQkgIHsKLQkJCSAgY2FzZSAweEQwOgotCQkJICAgIC8qIE5vcm1hbCBjb2RlICovCi0JCQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAweEM0OgotCQkJICAgIC8qIE5vcm1hbCBkYXRhICovCi0JCQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAweEQyOgotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgLyogTm9ybWFsIHJvbSBkYXRhICovCi0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OgotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgMHhDMzoJLyogTmFtZWQgcmVsb2NhdGFibGUgc2VjdGlvbnMgKHR5cGUgQykgKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMDoJLyogTm9ybWFsIGNvZGUgKENQKSAqLwotCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhDNDoJLyogTm9ybWFsIGRhdGEgKENEKSAqLwotCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhEMjoJLyogTm9ybWFsIHJvbSBkYXRhIChDUikgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfUk9NIHwgU0VDX0RBVEE7Ci0JCQlicmVhazsKLQkJICAgICAgZGVmYXVsdDoKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCS8qIFJlYWQgc2VjdGlvbiBuYW1lLCB1c2UgaXQgaWYgbm9uIGVtcHR5LiAqLwotCQluYW1lID0gcmVhZF9pZCAoJmllZWUtPmgpOwotCQlpZiAobmFtZVswXSkKLQkJICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLQotCQkvKiBTa2lwIHRoZXNlIGZpZWxkcywgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dCAqLwotCQl7Ci0JCSAgYmZkX3ZtYSBwYXJlbnQsIGJyb3RoZXIsIGNvbnRleHQ7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmcGFyZW50KTsKLQkJICBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZicm90aGVyKTsKLQkJICBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZjb250ZXh0KTsKLQkJfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW06Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleDsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJYXNlY3Rpb24gKnNlY3Rpb247Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCXNlY3Rpb25faW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJmllZWUtPmgpOwotCQlzZWN0aW9uID0gZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIHNlY3Rpb25faW5kZXgpOwotCQlpZiAoc2VjdGlvbl9pbmRleCA+IGllZWUtPnNlY3Rpb25fY291bnQpCi0JCSAgewotCQkgICAgaWVlZS0+c2VjdGlvbl9jb3VudCA9IHNlY3Rpb25faW5kZXg7Ci0JCSAgfQotCQlzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPQotCQkgIGJmZF9sb2cyIChtdXN0X3BhcnNlX2ludCAoJmllZWUtPmgpKTsKLQkJKHZvaWQpIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9lMl9maXJzdF9ieXRlX2VudW06Ci0JICAgICAgewotCQlpZWVlX3JlY29yZF9lbnVtX3R5cGUgdCA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkpOwotCi0JCXN3aXRjaCAodCkKLQkJICB7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9yZWdpb25fYmFzZV9hZGRyZXNzX2VudW06Ci0JCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOwotCQkgICAgc2VjdGlvbi0+dm1hID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+bG1hID0gc2VjdGlvbi0+dm1hOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21hdV9zaXplX2VudW06Ci0JCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfbV92YWx1ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW06Ci0JCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOwotCQkgICAgc2VjdGlvbi0+dm1hID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+bG1hID0gc2VjdGlvbi0+dm1hOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fb2Zmc2V0X2VudW06Ci0JCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBNYWtlIGEgc2VjdGlvbiBmb3IgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgYW55LiAgV2UgZG9uJ3QgdHJ5Ci0gICB0byBpbnRlcnByZXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsgd2UganVzdCBwb2ludCB0aGUgc2VjdGlvbgotICAgYXQgdGhlIGFyZWEgaW4gdGhlIGZpbGUgc28gdGhhdCBwcm9ncmFtIHdoaWNoIHVuZGVyc3RhbmQgY2FuIGRpZyBpdAotICAgb3V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfZGVidWcgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjOwotICBmaWxlX3B0ciBkZWJ1Z19lbmQ7Ci0KLSAgaWYgKGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kZWJ1ZyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPmZpbGVwb3MgPSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLQotICBkZWJ1Z19lbmQgPSBpZWVlLT53LnIuZGF0YV9wYXJ0OwotICBpZiAoZGVidWdfZW5kID09IDApCi0gICAgZGVidWdfZW5kID0gaWVlZS0+dy5yLnRyYWlsZXJfcGFydDsKLSAgaWYgKGRlYnVnX2VuZCA9PSAwKQotICAgIGRlYnVnX2VuZCA9IGllZWUtPncuci5tZV9yZWNvcmQ7Ci0gIHNlYy0+X3Jhd19zaXplID0gZGVidWdfZW5kIC0gaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIGFyY2hpdmUgc3R1ZmYKLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotaWVlZV9hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqbGlicmFyeTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzUxMl07Ci0gIGZpbGVfcHRyIGJ1ZmZlcl9vZmZzZXQgPSAwOwotICBpZWVlX2FyX2RhdGFfdHlwZSAqc2F2ZSA9IGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGludCBhbGNfZWx0czsKLSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKmVsdHMgPSBOVUxMOwotCi0gIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9Ci0gICAgKGllZWVfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2FyX2RhdGFfdHlwZSkpOwotICBpZiAoIWFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWVlZSA9IElFRUVfQVJfREFUQSAoYWJmZCk7Ci0KLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLQotICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLQotICBpZWVlLT5oLmFiZmQgPSBhYmZkOwotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0gc2F2ZTsKLSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLSAgbGlicmFyeSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChsaWJyYXJ5LCAiTElCUkFSWSIpICE9IDApCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGllZWUpOwotICAgICAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0gc2F2ZTsKLSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0gIC8qIFRocm93IGF3YXkgdGhlIGZpbGVuYW1lICovCi0gIHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCi0gIGllZWUtPmVsZW1lbnRfY291bnQgPSAwOwotICBpZWVlLT5lbGVtZW50X2luZGV4ID0gMDsKLQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHRoZSBhZCBwYXJ0ICovCi0gIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogQW5kIHRoZSB0d28gZHVtbXkgbnVtYmVycyAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLSAgYWxjX2VsdHMgPSAxMDsKLSAgZWx0cyA9IChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKSBiZmRfbWFsbG9jIChhbGNfZWx0cyAqIHNpemVvZiAqZWx0cyk7Ci0gIGlmIChlbHRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogUmVhZCB0aGUgaW5kZXggb2YgdGhlIEJCIHRhYmxlICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCByZWM7Ci0gICAgICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqdDsKLQotICAgICAgcmVjID0gcmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpOwotICAgICAgaWYgKHJlYyAhPSAoaW50KSBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCWJyZWFrOwotCi0gICAgICBpZiAoaWVlZS0+ZWxlbWVudF9jb3VudCA+PSBhbGNfZWx0cykKLQl7Ci0JICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqbjsKLQotCSAgYWxjX2VsdHMgKj0gMjsKLQkgIG4gPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JICAgICAgIGJmZF9yZWFsbG9jIChlbHRzLCBhbGNfZWx0cyAqIHNpemVvZiAqZWx0cykpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBlbHRzID0gbjsKLQl9Ci0KLSAgICAgIHQgPSAmZWx0c1tpZWVlLT5lbGVtZW50X2NvdW50XTsKLSAgICAgIGllZWUtPmVsZW1lbnRfY291bnQrKzsKLQotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+ZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gICAgICB0LT5hYmZkID0gKGJmZCAqKSBOVUxMOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBnbyBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCi0gICAgICBpZiAoKHNpemVfdCkgaWVlZV9wb3MgKGFiZmQpID4gc2l6ZW9mIChidWZmZXIpIC8gMikKLQl7Ci0JICAvKiBQYXN0IGhhbGYgd2F5LCByZXNlZWsgYW5kIHJlcHJpbWUgKi8KLQkgIGJ1ZmZlcl9vZmZzZXQgKz0gaWVlZV9wb3MgKGFiZmQpOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBidWZmZXJfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMKLQkgICAgIHRvIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLQkgIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0JICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0JICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0JfQotICAgIH0KLQotICBpZWVlLT5lbGVtZW50cyA9ICgoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikKLQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cykpOwotICBpZiAoaWVlZS0+ZWxlbWVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtY3B5IChpZWVlLT5lbGVtZW50cywgZWx0cywKLQkgIGllZWUtPmVsZW1lbnRfY291bnQgKiBzaXplb2YgKmllZWUtPmVsZW1lbnRzKTsKLSAgZnJlZSAoZWx0cyk7Ci0gIGVsdHMgPSBOVUxMOwotCi0gIC8qIE5vdyBzY2FuIHRoZSBhcmVhIGFnYWluLCBhbmQgcmVwbGFjZSBCQiBvZmZzZXRzIHdpdGggZmlsZSAqLwotICAvKiBvZmZzZXRzICovCi0KLSAgZm9yIChpID0gMjsgaSA8IGllZWUtPmVsZW1lbnRfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0bwotCSByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gICAgICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotICAgICAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICAgICAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIEY4ICovCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIDE0ICovCi0gICAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIERyb3Agc2l6ZSBvZiBibG9jayAqLwotICAgICAgaWYgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSAhPSAwKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JfQotICAgIH0KLQotICAvKiAgYWJmZC0+aGFzX2FybWFwID0gOyovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChlbHRzICE9IE5VTEwpCi0gICAgZnJlZSAoZWx0cyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAoaWVlZV9kYXRhX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEuaWVlZV9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqcHJvY2Vzc29yOwotICB1bnNpZ25lZCBpbnQgcGFydDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzMwMF07Ci0gIGllZWVfZGF0YV90eXBlICpzYXZlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAwOwotICBpZWVlX21rb2JqZWN0IChhYmZkKTsKLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGluIHRvIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSAqLwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLSAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0KLSAgaWVlZS0+cmVhZF9zeW1ib2xzID0gZmFsc2U7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IGZhbHNlOwotICBpZWVlLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggPSBJRUVFX1BVQkxJQ19CQVNFOwotICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0gIGllZWUtPnNlY3Rpb25fdGFibGUgPSBOVUxMOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSAwOwotCi0gIHByb2Nlc3NvciA9IGllZWUtPm1iLnByb2Nlc3NvciA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChwcm9jZXNzb3IsICJMSUJSQVJZIikgPT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gIGllZWUtPm1iLm1vZHVsZV9uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChhYmZkLT5maWxlbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmZpbGVuYW1lID0gaWVlZS0+bWIubW9kdWxlX25hbWU7Ci0gICAgfQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgKi8KLSAgewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLSAgICBjaGFyIGZhbWlseVsxMF07Ci0KLSAgICAvKiBJRUVFIGRvZXMgbm90IHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgcHJvY2Vzc29yIGlkZW50aWZpY2F0b24KLSAgICAgICBzdHJpbmcsIHNvIHRoZSBjb21waWxlciBpcyBmcmVlIHRvIHB1dCBpbiBpdCB3aGF0ZXZlciBpdCB3YW50cy4KLSAgICAgICBXZSB0cnkgaGVyZSB0byByZWNvZ25pemUgZGlmZmVyZW50IHByb2Nlc3NvcnMgYmVsb25naW5nIHRvIHRoZQotICAgICAgIG02OGsgZmFtaWx5LiAgQ29kZSBmb3Igb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgYWRkZWQgaGVyZS4gICovCi0gICAgaWYgKChwcm9jZXNzb3JbMF0gPT0gJzYnKSAmJiAocHJvY2Vzc29yWzFdID09ICc4JykpCi0gICAgICB7Ci0JaWYgKHByb2Nlc3NvclsyXSA9PSAnMycpCSAgICAvKiA2ODN4eCBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3dpdGNoIChwcm9jZXNzb3JbM10pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgkJCSAgICAvKiA2ODMwMiwgNjgzMDYsIDY4MzA3ICovCi0JICAgICAgY2FzZSAnMic6CQkJICAgIC8qIDY4MzIyLCA2ODMyOCAqLwotCSAgICAgIGNhc2UgJzUnOgkJCSAgICAvKiA2ODM1NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MDAwIik7ICAgLyogTUM2ODAwMC1iYXNlZCBjb250cm9sbGVycyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgkJCSAgICAvKiA2ODMzMCwgNjgzMzEsIDY4MzMyLCA2ODMzMywKLQkJCQkJICAgICAgIDY4MzM0LCA2ODMzNSwgNjgzMzYsIDY4MzM4ICovCi0JICAgICAgY2FzZSAnNic6CQkJICAgIC8qIDY4MzYwICovCi0JICAgICAgY2FzZSAnNyc6CQkJICAgIC8qIDY4Mzc2ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgICAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChwcm9jZXNzb3JbNF0gPT0gJzknKSAgICAvKiA2ODM0OSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgwMzAiKTsgLyogQ1BVMDMwICovCi0JCWVsc2UJCSAgICAgICAgICAgIC8qIDY4MzQwLCA2ODM0MSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6CQkJICAgIC8qIERvZXMgbm90IGV4aXN0IHlldCAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogR3Vlc3MgaXQgd2lsbCBiZSBDUFUzMiAqLwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmICh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdGJykgICAvKiA2OEYzMzMgKi8KLQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsJICAgICAgICAgIC8qIENQVTMyICovCi0JZWxzZSBpZiAoKHRvdXBwZXIgKHByb2Nlc3NvclszXSkgPT0gJ0MnKSAgLyogRW1iZWRkZWQgY29udHJvbGxlcnMgKi8KLQkJICYmICgodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnRScpCi0JCSAgICAgfHwgKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0gnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdMJykpKQotCSAgewotCSAgICBzdHJjcHkgKGZhbWlseSwgIjY4Iik7Ci0JICAgIHN0cm5jYXQgKGZhbWlseSwgcHJvY2Vzc29yICsgNCwgNyk7Ci0JICAgIGZhbWlseVs5XSA9ICdcMCc7Ci0JICB9Ci0JZWxzZQkJCQkgLyogIlJlZ3VsYXIiIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChzdHJuY21wIChwcm9jZXNzb3IsICJjcHUzMiIsIDUpID09IDApIC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkgICAgIHx8IChzdHJuY21wIChwcm9jZXNzb3IsICJDUFUzMiIsIDUpID09IDApKQotICAgICAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOwotICAgIGVsc2UKLSAgICAgIHsKLQlzdHJuY3B5IChmYW1pbHksIHByb2Nlc3NvciwgOSk7Ci0JZmFtaWx5WzldID0gJ1wwJzsKLSAgICAgIH0KLQotICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoIChmYW1pbHkpOwotICAgIGlmIChhcmNoID09IDApCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gICAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLSAgfQotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0pCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX2JpdHNfbWF1KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcykgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGJ5dGUgb3JkZXIgaW5mbywgdGFrZSBpdCAqLwotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX0xfZW51bSB8fAotICAgICAgdGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX01fZW51bSkKLSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0gIGZvciAocGFydCA9IDA7IHBhcnQgPCBOX1dfVkFSSUFCTEVTOyBwYXJ0KyspCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGlmIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgICAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gcGFydCkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICBpZWVlLT53Lm9mZnNldFtwYXJ0XSA9IHBhcnNlX2kgKCYoaWVlZS0+aCksICZvayk7Ci0gICAgICBpZiAob2sgPT0gZmFsc2UpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgIH0KLQotICBpZiAoaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgIT0gMCkKLSAgICBhYmZkLT5mbGFncyA9IEhBU19TWU1TOwotCi0gIC8qIEJ5IG5vdyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBhIHJlYWwgSUVFRSBmaWxlLCB3ZSdyZSBnb2luZyB0byByZWFkCi0gICAgIHRoZSB3aG9sZSB0aGluZyBpbnRvIG1lbW9yeSBzbyB0aGF0IHdlIGNhbiBydW4gdXAgYW5kIGRvd24gaXQKLSAgICAgcXVpY2tseS4gIFdlIGNhbiB3b3JrIG91dCBob3cgYmlnIHRoZSBmaWxlIGlzIGZyb20gdGhlIHRyYWlsZXIKLSAgICAgcmVjb3JkICovCi0KLSAgSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlID0KLSAgICAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEpOwotICBpZiAoIUlFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSkKLSAgICBnb3RvIGZhaWw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSAoSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlKSwgMSwKLQkgICAgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEsIGFiZmQpOwotCi0gIGllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpOwotCi0gIGlmICghIGllZWVfc2x1cnBfZGVidWcgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLQotICAvKiBQYXJzZSBzZWN0aW9uIGRhdGEgdG8gYWN0aXZhdGUgZmlsZSBhbmQgc2VjdGlvbiBmbGFncyBpbXBsaWVkIGJ5Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICovCi0KLSAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLSAgICAKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci1nb3Rfd3JvbmdfZm9ybWF0OgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7Ci0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi12b2lkCi1pZWVlX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmIChzeW1ib2wtPm5hbWVbMF0gPT0gJyAnKQotICAgIHJldC0+bmFtZSA9ICIqIGVtcHR5IHRhYmxlIGVudHJ5ICI7Ci0gIGlmICghc3ltYm9sLT5zZWN0aW9uKQotICAgIHJldC0+dHlwZSA9IChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKSA/ICdhJyA6ICdBJzsKLX0KLQotdm9pZAotaWVlZV9wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0jaWYgMAotICAgICAgZnByaW50ZiAoZmlsZSwgIiU0eCAlMngiLCBhb3V0X3N5bWJvbCAoc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiwKLQkgICAgICAgYW91dF9zeW1ib2wgKHN5bWJvbCktPm90aGVyICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgIEJGRF9GQUlMICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQljb25zdCBjaGFyICpzZWN0aW9uX25hbWUgPQotCSAgKHN5bWJvbC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTAotCSAgID8gIiphYnMiCi0JICAgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotCWlmIChzeW1ib2wtPm5hbWVbMF0gPT0gJyAnKQotCSAgewotCSAgICBmcHJpbnRmIChmaWxlLCAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0KLQkgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICUwNHggJTAyeCAlcyIsCi0JCSAgICAgc2VjdGlvbl9uYW1lLAotCQkgICAgICh1bnNpZ25lZCkgaWVlZV9zeW1ib2wgKHN5bWJvbCktPmluZGV4LAotCQkgICAgICh1bnNpZ25lZCkgMCwKLQkJICAgICBzeW1ib2wtPm5hbWUpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLCBpdGVyYXRpb25zKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpjdXJyZW50X21hcDsKLSAgICAgdW5zaWduZWQgY2hhciAqbG9jYXRpb25fcHRyOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgaW50IGl0ZXJhdGlvbnM7Ci17Ci0gIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLSAgICB7Ci0gICAgY2FzZSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bToKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbnVtYmVyX29mX21hdXM7Ci0JdW5zaWduZWQgaW50IGk7Ci0JbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQludW1iZXJfb2ZfbWF1cyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfbWF1czsgaSsrKQotCSAgewotCSAgICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW06Ci0gICAgICB7Ci0JYm9vbGVhbiBsb29wID0gdHJ1ZTsKLQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCXdoaWxlIChsb29wKQotCSAgewotCSAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgaWVlZV92YXJpYWJsZV9SX2VudW06Ci0KLQkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtOgotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9vcGVuX2JfZW51bToKLQkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtOgotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGV4dHJhID0gNDsKLQkJICBib29sZWFuIHBjcmVsID0gZmFsc2U7Ci0JCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JCSAgaWVlZV9yZWxvY190eXBlICpyID0KLQkJICAoaWVlZV9yZWxvY190eXBlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLAotCQkJCQkJIHNpemVvZiAoaWVlZV9yZWxvY190eXBlKSk7Ci0JCSAgaWYgKCFyKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgKihjdXJyZW50X21hcC0+cmVsb2NfdGFpbF9wdHIpID0gcjsKLQkJICBjdXJyZW50X21hcC0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKLQkJICByLT5uZXh0ID0gKGllZWVfcmVsb2NfdHlwZSAqKSBOVUxMOwotCQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0vKgkJCSAgICBhYm9ydCgpOyovCi0JCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gMDsKLQkJICBwYXJzZV9leHByZXNzaW9uIChpZWVlLAotCQkJCSAgICAmci0+cmVsZW50LmFkZGVuZCwKLQkJCQkgICAgJnItPnN5bWJvbCwKLQkJCQkgICAgJnBjcmVsLCAmZXh0cmEsICZzZWN0aW9uKTsKLQkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGN1cnJlbnRfbWFwLT5wYzsKLQkJICBzLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JCSAgcy0+b3duZXItPmZsYWdzIHw9IEhBU19SRUxPQzsKLQkJICBzLT5yZWxvY19jb3VudCsrOwotCQkgIGlmIChyLT5yZWxlbnQuc3ltX3B0cl9wdHIgPT0gTlVMTCAmJiBzZWN0aW9uICE9IE5VTEwpCi0JCSAgICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBzZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQotCQkgIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IChpbnQpIGllZWVfY29tbWEpCi0JCSAgICB7Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIC8qIEZldGNoIG51bWJlciBvZiBieXRlcyB0byBwYWQgKi8KLQkJICAgICAgZXh0cmEgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICB9OwotCi0JCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCQkgICAgewotCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9jbG9zZV9iX2VudW06Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX2Nsb3NlX2JfZW51bToKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bToKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBCdWlsZCBhIHJlbG9jYXRpb24gZW50cnkgZm9yIHRoaXMgdHlwZSAqLwotCQkgIC8qIElmIHBjIHJlbCB0aGVuIHN0aWNrIC12ZSBwYyBpbnRvIGluc3RydWN0aW9uCi0JCSAgICAgYW5kIHRha2Ugb3V0IG9mIHJlbG9jIC4uCi0KLQkJICAgICBJJ3ZlIGNoYW5nZWQgdGhpcy4gSXQncyBhbGwgdG9vIGNvbXBsaWNhdGVkLiBJCi0JCSAgICAga2VlcCAwIGluIHRoZSBpbnN0cnVjdGlvbiBub3cuICAqLwotCi0JCSAgc3dpdGNoIChleHRyYSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgIGNhc2UgNDoKLQotCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKLQkJCXsKLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIC1jdXJyZW50X21hcC0+cGMsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDMyX2hvd3RvOwotCQkJICByLT5yZWxlbnQuYWRkZW5kIC09Ci0JCQkgICAgY3VycmVudF9tYXAtPnBjOwotI2Vsc2UKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwzMl9ob3d0bzsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzMzJfaG93dG87Ci0JCQl9Ci0JCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMjoKLQkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCi0JCQl7Ci0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAoaW50KSAoLWN1cnJlbnRfbWFwLT5wYyksIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0gY3VycmVudF9tYXAtPnBjOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMTZfaG93dG87Ci0jZWxzZQotCi0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDE2X2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnMxNl9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKLQkJCXsKLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgKGludCkgKC1jdXJyZW50X21hcC0+cGMpLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuYWRkZW5kIC09IGN1cnJlbnRfbWFwLT5wYzsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDhfaG93dG87Ci0jZWxzZQotCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDhfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczhfaG93dG87Ci0JCQl9Ci0JCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSAxOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgQkZEX0ZBSUwgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQl7Ci0JCSAgYmZkX3ZtYSB0aGlzX3NpemU7Ci0JCSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnRoaXNfc2l6ZSkgPT0gdHJ1ZSkKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgaW50IGk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzX3NpemU7IGkrKykKLQkJCXsKLQkJCSAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb29wID0gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICB9Ci0KLQkgICAgLyogUHJldmVudCBtb3JlIHRoYW4gdGhlIGZpcnN0IGxvYWQtaXRlbSBvZiBhbiBMUiByZWNvcmQKLQkgICAgICAgZnJvbSBiZWluZyByZXBlYXRlZCAoTVJJIGNvbnZlbnRpb24pLiAqLwotCSAgICBpZiAoaXRlcmF0aW9ucyAhPSAxKQotCSAgICAgIGxvb3AgPSBmYWxzZTsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlICpsb2NhdGlvbl9wdHIgPSAoYmZkX2J5dGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0KLSAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpjdXJyZW50X21hcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgTlVMTDsKLSAgYXNlY3Rpb24gKnM7Ci0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIGFyZWEgKi8KLSAgaWYgKGllZWUtPnJlYWRfZGF0YSA9PSB0cnVlKQotICAgIHJldHVybiB0cnVlOwotICBpZWVlLT5yZWFkX2RhdGEgPSB0cnVlOwotICBpZWVlX3NlZWsgKGFiZmQsIGllZWUtPncuci5kYXRhX3BhcnQpOwotCi0gIC8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgYWxsIHRoZSBzZWN0aW9uIGNvbnRlbnRzICovCi0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcGVyID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzLT51c2VkX2J5X2JmZDsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgcGVyLT5kYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKCFwZXItPmRhdGEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLypTVVBQUkVTUyA2OCovCi0gICAgICBwZXItPnJlbG9jX3RhaWxfcHRyID0KLQkoaWVlZV9yZWxvY190eXBlICoqKSAmIChzLT5yZWxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCXsKLQkgIC8qIElGIHdlIHNlZSBhbnl0aGluZyBzdHJhbmdlIHRoZW4gcXVpdCAqLwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gdHJ1ZTsKLQotCWNhc2UgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgc2VjdGlvbl9udW1iZXIgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICBzID0gaWVlZS0+c2VjdGlvbl90YWJsZVtzZWN0aW9uX251bWJlcl07Ci0JICBzLT5mbGFncyB8PSBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBjdXJyZW50X21hcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgcy0+dXNlZF9ieV9iZmQ7Ci0JICBsb2NhdGlvbl9wdHIgPSBjdXJyZW50X21hcC0+ZGF0YSAtIHMtPnZtYTsKLQkgIC8qIFRoZSBkb2N1bWVudCBJIGhhdmUgc2F5cyB0aGF0IE1pY3JvdGVjJ3MgY29tcGlsZXJzIHJlc2V0ICovCi0JICAvKiB0aGlzIGFmdGVyIGEgc2VjIHNlY3Rpb24sIGV2ZW4gdGhvdWdoIHRoZSBzdGFuZGFyZCBzYXlzIG5vdCAqLwotCSAgLyogdG8uIFNPIC4uICovCi0JICBjdXJyZW50X21hcC0+cGMgPSBzLT52bWE7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9lMl9maXJzdF9ieXRlX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICB7Ci0JICAgIGNhc2UgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtICYgMHhmZjoKLQkgICAgICB7Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOwotCQl1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JCWJvb2xlYW4gcGNyZWw7Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCW11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogVGhvdyBhd2F5IHNlY3Rpb24gIyovCi0JCXBhcnNlX2V4cHJlc3Npb24gKGllZWUsICZ2YWx1ZSwKLQkJCQkgICZzeW1ib2wsCi0JCQkJICAmcGNyZWwsICZleHRyYSwKLQkJCQkgIDApOwotCQljdXJyZW50X21hcC0+cGMgPSB2YWx1ZTsKLQkJQkZEX0FTU0VSVCAoKHVuc2lnbmVkKSAodmFsdWUgLSBzLT52bWEpIDw9IHMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgaWVlZV92YWx1ZV9zdGFydGluZ19hZGRyZXNzX2VudW0gJiAweGZmOgotCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgICAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pCi0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgICAvKiBXZSd2ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSBub3cgLSAqLwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICBkZWZhdWx0OgotCSAgICAgIEJGRF9GQUlMICgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3JlcGVhdF9kYXRhX2VudW06Ci0JICB7Ci0JICAgIC8qIFJlcGVhdCB0aGUgZm9sbG93aW5nIExEIG9yIExSIG4gdGltZXMgLSB3ZSBkbyB0aGlzIGJ5Ci0JCSByZW1lbWJlcmluZyB0aGUgc3RyZWFtIHBvaW50ZXIgYmVmb3JlIHJ1bm5pbmcgaXQgYW5kCi0JCSByZXNldHRpbmcgaXQgYW5kIHJ1bm5pbmcgaXQgbiB0aW1lcy4gV2Ugc3BlY2lhbCBjYXNlCi0JCSB0aGUgcmVwZXRpdGlvbiBvZiBhIHJlcGVhdF9kYXRhL2xvYWRfY29uc3RhbnQKLQkJICovCi0KLQkgICAgdW5zaWduZWQgaW50IGl0ZXJhdGlvbnM7Ci0JICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0OwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBpdGVyYXRpb25zID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBzdGFydCA9IGllZWUtPmguaW5wdXRfcDsKLQkgICAgaWYgKHN0YXJ0WzBdID09IChpbnQpIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtICYmCi0JCXN0YXJ0WzFdID09IDEpCi0JICAgICAgewotCQl3aGlsZSAoaXRlcmF0aW9ucyAhPSAwKQotCQkgIHsKLQkJICAgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSBzdGFydFsyXTsKLQkJICAgIGl0ZXJhdGlvbnMtLTsKLQkJICB9Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl3aGlsZSAoaXRlcmF0aW9ucyAhPSAwKQotCQkgIHsKLQkJICAgIGllZWUtPmguaW5wdXRfcCA9IHN0YXJ0OwotCQkgICAgaWYgKCFkb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsCi0JCQkJIGl0ZXJhdGlvbnMpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpdGVyYXRpb25zLS07Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW06Ci0JY2FzZSBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW06Ci0JICB7Ci0JICAgIGlmICghZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLCAxKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLX0KLQotYm9vbGVhbgotaWVlZV9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfcGVyX3NlY3Rpb25fdHlwZSkpOwotICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWVlZV9wZXJfc2VjdGlvbiAobmV3c2VjdCktPmRhdGEgPSAoYmZkX2J5dGUgKikgTlVMTDsKLSAgaWVlZV9wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ci0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCQkgICAgICBvZmZzZXQsIGNvdW50KTsKLSAgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotICAodm9pZCkgbWVtY3B5ICgoUFRSKSBsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAodW5zaWduZWQpIGNvdW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLS8qICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOyovCi0gIGllZWVfcmVsb2NfdHlwZSAqc3JjID0gKGllZWVfcmVsb2NfdHlwZSAqKSAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAoc3JjICE9IChpZWVlX3JlbG9jX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXb3JrIG91dCB3aGljaCBzeW1ib2wgdG8gYXR0YWNoIGl0IHRoaXMgcmVsb2MgdG8gKi8KLSAgICAgIHN3aXRjaCAoc3JjLT5zeW1ib2wubGV0dGVyKQotCXsKLQljYXNlICdJJzoKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgc3ltYm9scyArIHNyYy0+c3ltYm9sLmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgIHN5bWJvbHMgKyBzcmMtPnN5bWJvbC5pbmRleCArIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldDsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGlmIChzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciAhPSBOVUxMKQotCSAgICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgICAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHJbMF0tPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQotCSAgQkZEX0ZBSUwgKCk7Ci0JfQotICAgICAgKnJlbHB0cisrID0gJnNyYy0+cmVsZW50OwotICAgICAgc3JjID0gc3JjLT5uZXh0OwotICAgIH0KLSAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIGludAotY29tcCAoYXAsIGJwKQotICAgICBDT05TVCBQVFIgYXA7Ci0gICAgIENPTlNUIFBUUiBicDsKLXsKLSAgYXJlbGVudCAqYSA9ICooKGFyZWxlbnQgKiopIGFwKTsKLSAgYXJlbGVudCAqYiA9ICooKGFyZWxlbnQgKiopIGJwKTsKLSAgcmV0dXJuIGEtPmFkZHJlc3MgLSBiLT5hZGRyZXNzOwotfQotCi0vKiBXcml0ZSB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnM7Ci0gIGllZWUtPncuci5zZWN0aW9uX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHMpCi0JICAmJiAocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSA9PSAwKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZWN0aW9uX3R5cGVfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpbWFnZSBpcyBleGVjdXRhYmxlLCBzbyBvdXRwdXQgYWJzb2x1dGUgc2VjdGlvbnMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfQV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1NfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0NfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHMtPmZsYWdzICYgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NKSkKLQkgICAgewotCSAgICBjYXNlIFNFQ19DT0RFIHwgU0VDX0xPQUQ6Ci0JICAgIGNhc2UgU0VDX0NPREU6Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUNfREFUQToKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfRF9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNFQ19ST006Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19EQVRBOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfTE9BRDoKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0RBVEEgfCBTRUNfTE9BRDoKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUl9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcy0+bmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLSNpZiAwCi0JICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIFBhcmVudCAqLwotCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBCcm90aGVyICovCi0JICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIENvbnRleHQgKi8KLSNlbmRpZgotCSAgLyogQWxpZ25tZW50ICovCi0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2VjdGlvbl9hbGlnbm1lbnRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCAxIDw8IHMtPmFsaWdubWVudF9wb3dlcikpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogU2l6ZSAqLwotCSAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2VjdGlvbl9zaXplX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCSAgICB7Ci0JICAgICAgLyogUmVsb2NhdGVhYmxlIHNlY3Rpb25zIGRvbid0IGhhdmUgYXNsIHJlY29yZHMgKi8KLQkgICAgICAvKiBWbWEgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkoKGJmZF9ieXRlKQotCQkJCQkgKHMtPmluZGV4Ci0JCQkJCSAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1kb193aXRoX3JlbG9jcyAoYWJmZCwgcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MgPQotICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpIC8gYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCByZWxvY3NfdG9fZ28gPSBzLT5yZWxvY19jb3VudDsKLSAgYmZkX2J5dGUgKnN0cmVhbSA9IGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOwotICBhcmVsZW50ICoqcCA9IHMtPm9yZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7Ci0KLSAgcXNvcnQgKHMtPm9yZWxvY2F0aW9uLAotCSByZWxvY3NfdG9fZ28sCi0JIHNpemVvZiAoYXJlbGVudCAqKiksCi0JIGNvbXApOwotCi0gIC8qIE91dHB1dCB0aGUgc2VjdGlvbiBwcmVoZWFkZXIgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwICYmIHJlbG9jc190b19nbyA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIDAsIHMtPnN5bWJvbCwgMCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocmVsb2NzX3RvX2dvID09IDApCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY2F0aW9ucyB0aGVuIG91dHB1dCB0aGUgbG9hZCBjb25zdGFudAotCSBieXRlIG9wY29kZSByYXRoZXIgdGhhbiB0aGUgbG9hZCB3aXRoIHJlbG9jYXRpb24gb3Bjb2RlICovCi0KLSAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUpCi0JewotCSAgYmZkX3NpemVfdHlwZSBydW47Ci0JICB1bnNpZ25lZCBpbnQgTUFYUlVOID0gMTI3OwotCSAgcnVuID0gTUFYUlVOOwotCSAgaWYgKHJ1biA+IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHJ1biA9IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgfQotCi0JICBpZiAocnVuICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIE91dHB1dCBhIHN0cmVhbSBvZiBieXRlcyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBydW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCksCi0JCQkgICAgIDEsCi0JCQkgICAgIHJ1biwKLQkJCSAgICAgYWJmZCkKLQkJICAhPSBydW4pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gcnVuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIE91dHB1dCB0aGUgZGF0YSBzdHJlYW0gYXMgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgYnl0ZXMKLQkgcG9zc2libGUsIGFsbG93aW5nIGZvciB0aGUgYSByZWFzb25hYmxlIHBhY2tldCBzaXplIGFuZAotCSByZWxvY2F0aW9uIHN0dWZmcy4gICovCi0KLSAgICAgIGlmICgoUFRSKSBzdHJlYW0gPT0gKFBUUikgTlVMTCkKLQl7Ci0JICAvKiBPdXRwdXR0aW5nIGEgc2VjdGlvbiB3aXRob3V0IGRhdGEsIGZpbGwgaXQgdXAgKi8KLQkgIHN0cmVhbSA9ICh1bnNpZ25lZCBjaGFyICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOwotCSAgaWYgKCFzdHJlYW0pCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG1lbXNldCAoKFBUUikgc3RyZWFtLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCX0KLSAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUpCi0JewotCSAgYmZkX3NpemVfdHlwZSBydW47Ci0JICB1bnNpZ25lZCBpbnQgTUFYUlVOID0gMTI3OwotCSAgaWYgKHJlbG9jc190b19nbykKLQkgICAgewotCSAgICAgIHJ1biA9ICgqcCktPmFkZHJlc3MgLSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JICAgICAgaWYgKHJ1biA+IE1BWFJVTikKLQkJcnVuID0gTUFYUlVOOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBydW4gPSBNQVhSVU47Ci0JICAgIH0KLQkgIGlmIChydW4gPiBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICBydW4gPSBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JICAgIH0KLQotCSAgaWYgKHJ1biAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogT3V0cHV0IGEgc3RyZWFtIG9mIGJ5dGVzICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJ1bikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KSwKLQkJCSAgICAgMSwKLQkJCSAgICAgcnVuLAotCQkJICAgICBhYmZkKQotCQkgICE9IHJ1bikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSBydW47Ci0JICAgIH0KLQkgIC8qIE91dHB1dCBhbnkgcmVsb2NhdGlvbnMgaGVyZSAqLwotCSAgaWYgKHJlbG9jc190b19nbyAmJiAoKnApICYmICgqcCktPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHJlbG9jc190b19nbwotCQkgICAgICYmICgqcCkgJiYgKCpwKS0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JCXsKLQkJICBhcmVsZW50ICpyID0gKnA7Ci0JCSAgYmZkX3NpZ25lZF92bWEgb3Y7Ci0KLSNpZiAwCi0JCSAgaWYgKHItPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICAgIHsKLQkJICAgICAgci0+YWRkZW5kICs9IGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkJICAgIH0KLSNlbmRpZgotCi0JCSAgc3dpdGNoIChyLT5ob3d0by0+c2l6ZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMjoKLQotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOwotCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gNDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsCi0JCQkJCSAgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7Ci0JCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF84IChhYmZkLAotCQkJCQkgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7Ci0JCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCsrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIG92ID0gMDsKLQkJICAgICAgQkZEX0ZBSUwgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIG92ICY9IHItPmhvd3RvLT5zcmNfbWFzazsKLQotCQkgIGlmIChyLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICAgICAgJiYgISByLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCQkgICAgb3YgKz0gci0+YWRkcmVzczsKLQotCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotLyoJCSAgYWJvcnQoKTsqLwotCi0JCSAgaWYgKHItPnN5bV9wdHJfcHRyICE9IChhc3ltYm9sICoqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHItPmFkZGVuZCArIG92LAotCQkJCQkJICAgKihyLT5zeW1fcHRyX3B0ciksCi0JCQkJCQkgICByLT5ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkJCQkgICBzLT5pbmRleCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHItPmFkZGVuZCArIG92LAotCQkJCQkJICAgKGFzeW1ib2wgKikgTlVMTCwKLQkJCQkJCSAgIHItPmhvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkJCSAgIHMtPmluZGV4KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGlmIChudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzCi0JCSAgICAgICE9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pKQotCQkgICAgewotCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwKLQkJCQkJICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgcmVsb2NzX3RvX2dvLS07Ci0JCSAgcCsrOwotCQl9Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElmIHRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gdGhlbiB3ZSBjYW4gYmUKLSAgIGNsZXZlciBhYm91dCBob3cgd2Ugd3JpdGUuICBXZSBibG9jayBpdGVtcyB1cCBpbnRvIGEgbWF4IG9mIDEyNwotICAgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZG9fYXNfcmVwZWF0IChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBpZiAocy0+X3Jhd19zaXplKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkgICAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSA+PiA4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSAmIDB4ZmYpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkgICAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfcmVwZWF0X2RhdGFfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPl9yYXdfc2l6ZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1kb193aXRob3V0X3JlbG9jcyAoYWJmZCwgcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgYmZkX2J5dGUgKnN0cmVhbSA9IGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOwotCi0gIGlmIChzdHJlYW0gPT0gMCB8fCAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApKQotICAgIHsKLSAgICAgIGlmICghIGRvX2FzX3JlcGVhdCAoYWJmZCwgcykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHMtPl9yYXdfc2l6ZTsgaSsrKQotCXsKLQkgIGlmIChzdHJlYW1baV0gIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCEgZG9fYXNfcmVwZWF0IChhYmZkLCBzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHI7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cl9lbmQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHJfZW5kOwotc3RhdGljIGJmZCAqaW5wdXRfYmZkOwotc3RhdGljIGJmZCAqb3V0cHV0X2JmZDsKLXN0YXRpYyBpbnQgb3V0cHV0X2J1ZmZlcjsKLQotc3RhdGljIHZvaWQKLWZpbGwgKCkKLXsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgaW5wdXRfcHRyX2VuZCAtIGlucHV0X3B0cl9zdGFydCwgaW5wdXRfYmZkKTsKLSAgaW5wdXRfcHRyID0gaW5wdXRfcHRyX3N0YXJ0OwotfQotc3RhdGljIHZvaWQKLWZsdXNoICgpCi17Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIChvdXRwdXRfcHRyX3N0YXJ0KSwgMSwgb3V0cHV0X3B0ciAtIG91dHB1dF9wdHJfc3RhcnQsCi0JCSBvdXRwdXRfYmZkKQotICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRwdXRfcHRyIC0gb3V0cHV0X3B0cl9zdGFydCkpCi0gICAgYWJvcnQgKCk7Ci0gIG91dHB1dF9wdHIgPSBvdXRwdXRfcHRyX3N0YXJ0OwotICBvdXRwdXRfYnVmZmVyKys7Ci19Ci0KLSNkZWZpbmUgVEhJUygpICggKmlucHV0X3B0ciApCi0jZGVmaW5lIE5FWFQoKSB7IGlucHV0X3B0cisrOyBpZiAoaW5wdXRfcHRyID09IGlucHV0X3B0cl9lbmQpIGZpbGwoKTsgfQotI2RlZmluZSBPVVQoeCkgeyAqb3V0cHV0X3B0cisrID0gKHgpOyBpZihvdXRwdXRfcHRyID09IG91dHB1dF9wdHJfZW5kKSAgZmx1c2goKTsgfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfaW50ICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMjcpCi0gICAgewotICAgICAgT1VUICh2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQl7Ci0JICBsZW5ndGggPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMGZmMDAwMCkKLQl7Ci0JICBsZW5ndGggPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMDAwZmYwMCkKLQl7Ci0JICBsZW5ndGggPSAyOwotCX0KLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBPVVQgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtICsgbGVuZ3RoKTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBPVVQgKHZhbHVlID4+IDI0KTsKLQljYXNlIDM6Ci0JICBPVVQgKHZhbHVlID4+IDE2KTsKLQljYXNlIDI6Ci0JICBPVVQgKHZhbHVlID4+IDgpOwotCWNhc2UgMToKLQkgIE9VVCAodmFsdWUpOwotCX0KLQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNvcHlfaWQgKCkKLXsKLSAgaW50IGxlbmd0aCA9IFRISVMgKCk7Ci0gIGNoYXIgY2g7Ci0gIE9VVCAobGVuZ3RoKTsKLSAgTkVYVCAoKTsKLSAgd2hpbGUgKGxlbmd0aC0tKQotICAgIHsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIE9VVCAoY2gpOwotICAgICAgTkVYVCAoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgVkFSKHgpICgoeCB8IDB4ODApKQotc3RhdGljIHZvaWQKLWNvcHlfZXhwcmVzc2lvbiAoKQotewotICBpbnQgc3RhY2tbMTBdOwotICBpbnQgKnRvcyA9IHN0YWNrOwotICBpbnQgdmFsdWUgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKFRISVMgKCkpCi0JewotCWNhc2UgMHg4NDoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDB4ODM6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDB4ODI6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MToKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDB4ODA6Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoVEhJUyAoKSA+IDB4ODQpCi0JICAgIHsKLQkgICAgICAvKiBOb3QgYSBudW1iZXIsIGp1c3QgYnVnIG91dCB3aXRoIHRoZSBhbnN3ZXIgKi8KLQkgICAgICB3cml0ZV9pbnQgKCooLS10b3MpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgICp0b3MrKyA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGE1OgotCSAgLyogUExVUyBhbnl0aGluZyAqLwotCSAgewotCSAgICBpbnQgdmFsdWUgPSAqKC0tdG9zKTsKLQkgICAgdmFsdWUgKz0gKigtLXRvcyk7Ci0JICAgICp0b3MrKyA9IHZhbHVlOwotCSAgICBORVhUICgpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBWQVIgKCdSJyk6Ci0JICB7Ci0JICAgIGludCBzZWN0aW9uX251bWJlcjsKLQkgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0JICAgIGFzZWN0aW9uICpzOwotCSAgICBORVhUICgpOwotCSAgICBzZWN0aW9uX251bWJlciA9IFRISVMgKCk7Ci0KLQkgICAgTkVYVCAoKTsKLQkgICAgaWVlZSA9IElFRUVfREFUQSAoaW5wdXRfYmZkKTsKLQkgICAgcyA9IGllZWUtPnNlY3Rpb25fdGFibGVbc2VjdGlvbl9udW1iZXJdOwotCSAgICBpZiAocy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICAgewotCQl2YWx1ZSA9IHMtPm91dHB1dF9zZWN0aW9uLT5sbWE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCSAgICB2YWx1ZSArPSBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAqdG9zKysgPSB2YWx1ZTsKLQkgICAgdmFsdWUgPSAwOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDkwOgotCSAgewotCSAgICBORVhUICgpOwotCSAgICB3cml0ZV9pbnQgKCooLS10b3MpKTsKLQkgICAgT1VUICgweDkwKTsKLQkgICAgcmV0dXJuOwotCi0JICB9Ci0JfQotICAgIH0KLQotfQotCi0vKiBEcm9wIHRoZSBpbnQgaW4gdGhlIGJ1ZmZlciwgYW5kIGNvcHkgYSBudWxsIGludG8gdGhlIGdhcCwgd2hpY2ggd2UKLSAgIHdpbGwgb3ZlcndyaXRlIGxhdGVyICovCi0KLXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICpwdHJwOwotICBpbnQgYnVmZmVyOwotfTsKLQotc3RhdGljIHZvaWQKLWZpbGxfaW50IChidWYpCi0gICAgIHN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCAqYnVmOwotewotICBpZiAoYnVmLT5idWZmZXIgPT0gb3V0cHV0X2J1ZmZlcikKLSAgICB7Ci0gICAgICAvKiBTdGlsbCBhIGNoYW5jZSB0byBvdXRwdXQgdGhlIHNpemUgKi8KLSAgICAgIGludCB2YWx1ZSA9IG91dHB1dF9wdHIgLSBidWYtPnB0cnAgKyAzOwotICAgICAgYnVmLT5wdHJwWzBdID0gdmFsdWUgPj4gMjQ7Ci0gICAgICBidWYtPnB0cnBbMV0gPSB2YWx1ZSA+PiAxNjsKLSAgICAgIGJ1Zi0+cHRycFsyXSA9IHZhbHVlID4+IDg7Ci0gICAgICBidWYtPnB0cnBbM10gPSB2YWx1ZSA+PiAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRyb3BfaW50IChidWYpCi0gICAgIHN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCAqYnVmOwotewotICBpbnQgdHlwZSA9IFRISVMgKCk7Ci0gIGludCBjaDsKLSAgaWYgKHR5cGUgPD0gMHg4NCkKLSAgICB7Ci0gICAgICBORVhUICgpOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MzoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgyOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODE6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIE9VVCAoMHg4NCk7Ci0gIGJ1Zi0+cHRycCA9IG91dHB1dF9wdHI7Ci0gIGJ1Zi0+YnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKLSAgT1VUICgwKTsKLSAgT1VUICgwKTsKLSAgT1VUICgwKTsKLSAgT1VUICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWNvcHlfaW50ICgpCi17Ci0gIGludCB0eXBlID0gVEhJUyAoKTsKLSAgaW50IGNoOwotICBpZiAodHlwZSA8PSAweDg0KQotICAgIHsKLSAgICAgIE9VVCAodHlwZSk7Ci0gICAgICBORVhUICgpOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgzOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MjoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODE6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgwOgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotI2RlZmluZSBJRCBjb3B5X2lkKCkKLSNkZWZpbmUgSU5UIGNvcHlfaW50KCkKLSNkZWZpbmUgRVhQIGNvcHlfZXhwcmVzc2lvbigpCi1zdGF0aWMgdm9pZCBjb3B5X3RpbGxfZW5kICgpOwotI2RlZmluZSBJTlRuKHEpIGNvcHlfaW50KCkKLSNkZWZpbmUgRVhQbihxKSBjb3B5X2V4cHJlc3Npb24oKQotCi1zdGF0aWMgdm9pZAotZjFfcmVjb3JkICgpCi17Ci0gIGludCBjaDsKLSAgLyogQVROIHJlY29yZCAqLwotICBORVhUICgpOwotICBjaCA9IFRISVMgKCk7Ci0gIHN3aXRjaCAoY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUIChjaCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4Yzk6Ci0gICAgICBORVhUICgpOwotICAgICAgT1VUICgweGYxKTsKLSAgICAgIE9VVCAoMHhjOSk7Ci0gICAgICBJTlQ7Ci0gICAgICBJTlQ7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4MTY6Ci0JICBORVhUICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAxOgotCSAgTkVYVCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMDoKLQkgIE5FWFQgKCk7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MDM6Ci0JICBORVhUICgpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDEzOgotCSAgRVhQbiAoaW5zdHJ1Y3Rpb24gYWRkcmVzcyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGQ4OgotICAgICAgLyogRVh0ZXJuYWwgcmVmICovCi0gICAgICBORVhUICgpOwotICAgICAgT1VUICgweGYxKTsKLSAgICAgIE9VVCAoMHhkOCk7Ci0gICAgICBFWFA7Ci0gICAgICBFWFA7Ci0gICAgICBFWFA7Ci0gICAgICBFWFA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4Y2U6Ci0gICAgICBORVhUICgpOwotICAgICAgT1VUICgweGYxKTsKLSAgICAgIE9VVCAoMHhjZSk7Ci0gICAgICBJTlQ7Ci0gICAgICBJTlQ7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBJTlQ7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4MDE6Ci0JICBJTlQ7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MDI6Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MDQ6Ci0JICBFWFBuIChleHRlcm5hbCBmdW5jdGlvbik7Ci0JICBicmVhazsKLQljYXNlIDB4MDU6Ci0JICBicmVhazsKLQljYXNlIDB4MDc6Ci0JICBJTlRuIChsaW5lIG51bWJlcik7Ci0JICBJTlQ7Ci0JY2FzZSAweDA4OgotCSAgYnJlYWs7Ci0JY2FzZSAweDBhOgotCSAgSU5UbiAobG9ja2VkIHJlZ2lzdGVyKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZjoKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4M2U6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDQwOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg0MToKLQkgIElEOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotZjBfcmVjb3JkICgpCi17Ci0gIC8qIEF0dHJpYnV0ZSByZWNvcmQgKi8KLSAgTkVYVCAoKTsKLSAgT1VUICgweGYwKTsKLSAgSU5UbiAoU3ltYm9sIG5hbWUpOwotICBJRDsKLX0KLQotc3RhdGljIHZvaWQKLWNvcHlfdGlsbF9lbmQgKCkKLXsKLSAgaW50IGNoID0gVEhJUyAoKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKGNoIDw9IDB4ODApCi0JewotCSAgT1VUIChjaCk7Ci0JICBORVhUICgpOwotCSAgY2ggPSBUSElTICgpOwotCX0KLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHg4NDoKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MzoKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MjoKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MToKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0KLQkgIGNoID0gVEhJUyAoKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotZjJfcmVjb3JkICgpCi17Ci0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhmMik7Ci0gIElOVDsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGNlKTsKLSAgSU5UOwotICBjb3B5X3RpbGxfZW5kICgpOwotfQotCi0KLXN0YXRpYyB2b2lkIGJsb2NrICgpOwotc3RhdGljIHZvaWQKLWY4X3JlY29yZCAoKQotewotICBpbnQgY2g7Ci0gIE5FWFQgKCk7Ci0gIGNoID0gVEhJUyAoKTsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgY2FzZSAweDAxOgotICAgIGNhc2UgMHgwMjoKLSAgICBjYXNlIDB4MDM6Ci0gICAgICAvKiBVbmlxdWUgdHlwZWRlZnMgZm9yIG1vZHVsZSAqLwotICAgICAgLyogR0xvYmFsIHR5cGVkZWZzICAqLwotICAgICAgLyogSGlnaCBsZXZlbCBtb2R1bGUgc2NvcGUgYmVnaW5uaW5nICovCi0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKGNoKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlmaWxsX2ludCAoJm9iKTsKLQlPVVQgKDB4ZjkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA0OgotICAgICAgLyogR2xvYmFsIGZ1bmN0aW9uICovCi0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MDQpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlOVG4gKHN0YWNrIHNpemUpOwotCUlOVG4gKHJldCB2YWwpOwotCUVYUG4gKG9mZnNldCk7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlFWFBuIChzaXplIG9mIGJsb2NrKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDA1OgotICAgICAgLyogRmlsZSBuYW1lIGZvciBzb3VyY2UgbGluZSBudW1iZXJzICovCi0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MDUpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlOVG4gKHllYXIpOwotCUlOVG4gKG1vbnRoKTsKLQlJTlRuIChkYXkpOwotCUlOVG4gKGhvdXIpOwotCUlOVG4gKG1vbnV0ZSk7Ci0JSU5UbiAoc2Vjb25kKTsKLQlibG9jayAoKTsKLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwNjoKLSAgICAgIC8qIExvY2FsIGZ1bmN0aW9uICovCi0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MDYpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlOVG4gKHN0YWNrIHNpemUpOwotCUlOVG4gKHR5cGUgcmV0dXJuKTsKLQlFWFBuIChvZmZzZXQpOwotCWJsb2NrICgpOwotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlFWFBuIChzaXplKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDBhOgotICAgICAgLyogQXNzZW1ibGVyIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgLSovCi0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwYSk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSUQ7Ci0JSU5UOwotCUlEOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MGI6Ci0gICAgICB7Ci0Jc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOwotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MGIpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlOVDsKLQlJTlRuIChzZWN0aW9uIGluZGV4KTsKLQlFWFBuIChvZmZzZXQpOwotCUlOVG4gKHN0dWZmKTsKLQotCWJsb2NrICgpOwotCi0JT1VUICgweGY5KTsKLQlORVhUICgpOwotCUVYUG4gKFNpemUgaW4gTWF1cyk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lMl9yZWNvcmQgKCkKLXsKLSAgT1VUICgweGUyKTsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGNlKTsKLSAgTkVYVCAoKTsKLSAgSU5UOwotICBFWFA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ibG9jayAoKQotewotICBpbnQgY2g7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHhlMToKLQljYXNlIDB4ZTU6Ci0JICByZXR1cm47Ci0JY2FzZSAweGY5OgotCSAgcmV0dXJuOwotCWNhc2UgMHhmMDoKLQkgIGYwX3JlY29yZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMToKLQkgIGYxX3JlY29yZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMjoKLQkgIGYyX3JlY29yZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHhmODoKLQkgIGY4X3JlY29yZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIGUyX3JlY29yZCAoKTsKLQkgIGJyZWFrOwotCi0JfQotICAgIH0KLX0KLQotCi0KLS8qIHJlbG9jYXRlX2RlYnVnLAotICAgbW92ZXMgYWxsIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgYmZkIHRvIHRoZSBvdXRwdXQKLSAgIGJmZCwgYW5kIHJlbG9jYXRlcyBhbnkgZXhwcmVzc2lvbnMgaXQgZmluZHMKLSovCi0KLXN0YXRpYyB2b2lkCi1yZWxvY2F0ZV9kZWJ1ZyAob3V0cHV0LCBpbnB1dCkKLSAgICAgYmZkICpvdXRwdXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppbnB1dDsKLXsKLSNkZWZpbmUgSUJTIDQwMAotI2RlZmluZSBPQlMgNDAwCi0gIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVmZmVyW0lCU107Ci0KLSAgaW5wdXRfcHRyX3N0YXJ0ID0gaW5wdXRfcHRyID0gaW5wdXRfYnVmZmVyOwotICBpbnB1dF9wdHJfZW5kID0gaW5wdXRfYnVmZmVyICsgSUJTOwotICBpbnB1dF9iZmQgPSBpbnB1dDsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgSUJTLCBpbnB1dCk7Ci0gIGJsb2NrICgpOwotfQotCi0vKgotICBEdXJpbmcgbGlua2luZywgd2Ugd2UgdG9sZCBhYm91dCB0aGUgYmZkcyB3aGljaCBtYWRlIHVwIG91cgotICBjb250ZW50cywgd2UgaGF2ZSBhIGxpc3Qgb2YgdGhlbS4gVGhleSB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIGdvIHRvCi0gIHRoZSBkZWJ1ZyBpbmZvIGluIGVhY2gsIGFuZCBjb3B5IGl0IG91dCwgcmVsb2NhdGluZyBpdCBhcyB3ZSBnby4KLSovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBiZmRfY2hhaW5fdHlwZSAqY2hhaW4gPSBpZWVlLT5jaGFpbl9yb290OwotICB1bnNpZ25lZCBjaGFyIG91dHB1dF9idWZmZXJbT0JTXTsKLSAgYm9vbGVhbiBzb21lX2RlYnVnID0gZmFsc2U7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0KLSAgb3V0cHV0X3B0cl9zdGFydCA9IG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfcHRyX2VuZCA9IG91dHB1dF9idWZmZXIgKyBPQlM7Ci0gIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBpZiAoY2hhaW4gPT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gMDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotICAgICAgaWYgKGJmZF93cml0ZSAocy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgYWJmZCkgIT0gcy0+X3Jhd19zaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hhaW4gIT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0JewotCSAgYmZkICplbnRyeSA9IGNoYWluLT50aGlzOwotCSAgaWVlZV9kYXRhX3R5cGUgKmVudHJ5X2llZWUgPSBJRUVFX0RBVEEgKGVudHJ5KTsKLQkgIGlmIChlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfc2VlayAoZW50cnksIGVudHJ5X2llZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0LAotCQkJICAgIFNFRUtfU0VUKQotCQkgICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0ZV9kZWJ1ZyAoYWJmZCwgZW50cnkpOwotCSAgICB9Ci0KLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgICAgaWYgKHNvbWVfZGVidWcpCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JfQotCi0gICAgICBmbHVzaCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBkYXRhIGluIGFuIGllZWUgd2F5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci5kYXRhX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHNlY3Rpb25zIHRoYXQgaGF2ZSBubyBsb2FkYWJsZSBjb250ZW50cyAoLmJzcywKLSAgICAgICAgIGRlYnVnZ2luZywgZXRjLikgICovCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gd2UgY2FuIGluc2VydCB0aGVtIGluIHRoZSBjb3JyZWN0Ci0JIHBsYWNlcyAqLwotICAgICAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWluaXRfZm9yX291dHB1dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhID0gKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOwotCSAgaWYgKCFpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0vKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIElFRUUgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLWJvb2xlYW4KLWllZWVfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBldmVyeXRoaW5nCi0gICAgICAgICBpcyB3aXRoaW4gcmFuZ2UuICAqLwotICAgICAgbWVtY3B5IChzZWN0aW9uLT5jb250ZW50cyArIG9mZnNldCwgbG9jYXRpb24sIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaWVlZV9wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCFpbml0X2Zvcl9vdXRwdXQgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbWNweSAoKFBUUikgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKLQkgIChQVFIpIGxvY2F0aW9uLAotCSAgKHVuc2lnbmVkIGludCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgdGhlIGV4dGVybmFsIHN5bWJvbHMgb2YgYSBmaWxlLiAgSUVFRSBjb25zaWRlcnMgdHdvIHNvcnRzIG9mCi0gICBleHRlcm5hbCBzeW1ib2xzLCBwdWJsaWMsIGFuZCByZWZlcmVuY2VkLiAgSXQgdXNlcyB0byBpbnRlcm5hbAotICAgZm9ybXMgdG8gaW5kZXggdGhlbSBhcyB3ZWxsLiAgV2hlbiB3ZSB3cml0ZSB0aGVtIG91dCB3ZSB0dXJuIHRoZWlyCi0gICBzeW1ib2wgdmFsdWVzIGludG8gaW5kZXhlcyBmcm9tIHRoZSByaWdodCBiYXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqcTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIHVuc2lnbmVkIGludCByZWZlcmVuY2VfaW5kZXggPSBJRUVFX1JFRkVSRU5DRV9CQVNFOwotICB1bnNpZ25lZCBpbnQgcHVibGljX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRSArIDI7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGJvb2xlYW4gaGFkb25lID0gZmFsc2U7Ci0gIGlmIChhYmZkLT5vdXRzeW1ib2xzICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLQotICAgICAgZm9yIChxID0gYWJmZC0+b3V0c3ltYm9sczsgKnEgIT0gKGFzeW1ib2wgKikgTlVMTDsgcSsrKQotCXsKLQkgIGFzeW1ib2wgKnAgPSAqcTsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIHJlZmVyZW5jZSAuLiAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHAtPnZhbHVlID0gcmVmZXJlbmNlX2luZGV4OwotCSAgICAgIHJlZmVyZW5jZV9pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgd2VhayByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxNSkgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxOSkgLyogc3RhdGljIHN5bWJvbCAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKSkgLyogb25lIG9mIHRoZW0gKi8KLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSB2YWx1ZSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCQl7Ci0JCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCQkgICAgewotCQkgICAgICAvKiBJZiBmdWxseSBsaW5rZWQsIHRoZW4gb3V0cHV0IGFsbCBzeW1ib2xzCi0JCQkgcmVsb2NhdGVkICovCi0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2ludAotCQkJICAgICAoYWJmZCwKLQkJCSAgICAgIChwLT52YWx1ZQotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2V4cHJlc3Npb24KLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICBwLT52YWx1ZSArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkgICAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+c3ltYm9sLAotCQkJICAgICAgZmFsc2UsIDApKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwKLQkJCQkJICAgICAgIHAtPnZhbHVlLAotCQkJCQkgICAgICAgYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sLAotCQkJCQkgICAgICAgZmFsc2UsIDApKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcC0+dmFsdWUgPSBwdWJsaWNfaW5kZXg7Ci0JICAgICAgcHVibGljX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIC0gd2hlbiB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgc3ltYm9scyByZWFkICovCi0JICAgICAgLyogZnJvbSBhbiBpbnB1dCBpZWVlIGZpbGUgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChoYWRvbmUpCi0gICAgaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgPSBoZXJlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGV4dGVuW10gPQotewotICAweGYwLCAweDIwLCAweDAwLAotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzNywgMywgMywJLyogU2V0IHZlcnNpb24gMyByZXYgMyAgIAkqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOSwgMiwvKiBrZWVwIHN5bWJvbCBpbiAgb3JpZ2luYWwgY2FzZSAqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOAkvKiBzZXQgb2JqZWN0IHR5cGUgcmVsb2NhdGVhYmxlIHRvIHggKi8KLX07Ci0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGVudmlbXSA9Ci17Ci0gIDB4ZjAsIDB4MjEsIDB4MDAsCi0KLS8qICAgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MCwgMHg4MiwgMHgwNywgMHhjNywgMHgwOSwgMHgxMSwgMHgxMSwKLSAgICAweDE5LCAweDJjLAotKi8KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMDAsIDUyLCAweDAwLAkvKiBleGVjIG9rICovCi0KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTMsIDB4MDMsLyogaG9zdCB1bml4ICovCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwLCA1NCwgMiwxLDEJdG9vbCAmIHZlcnNpb24gIyAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci50cmFpbGVyX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZWVlLT53LnIubWVfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbW9kdWxlX2VuZF9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIElFRUUgcHJvY2Vzc29yIElELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLQotICBhcmNoID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpOwotICBzd2l0Y2ggKGFyY2gtPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBiZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICIyOTAwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICJIOC8zMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvNTAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBzd2l0Y2ggKGFyY2gtPm1hY2gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0EiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBLQiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MENBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCWNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2ME1DIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgewotCWNvbnN0IGNoYXIgKmlkOwotCi0Jc3dpdGNoIChhcmNoLT5tYWNoKQotCSAgewotCSAgZGVmYXVsdDoJCWlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwMDogaWQgPSAiNjgwMDAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDA4OiBpZCA9ICI2ODAwOCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGlkID0gIjY4MDEwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAyMDogaWQgPSAiNjgwMjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDMwOiBpZCA9ICI2ODAzMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6IGlkID0gIjY4MDQwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODA2MDogaWQgPSAiNjgwNjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfY3B1MzI6ICBpZCA9ICJjcHUzMiI7IGJyZWFrOwotCSAgfQotCi0JaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1pZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBvbGQ7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIGhlYWRlciBhcmVhICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9wcm9jZXNzb3IgKGFiZmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIGFiZmQtPmZpbGVuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIHZhcmlhYmxlIGJpdHMgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQml0cyBwZXIgTUFVICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE1BVSdzIHBlciBhZGRyZXNzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAoYmZkX2J5dGUpIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotCQkJCSAgICAgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvbGQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoOCAqIE5fV19WQVJJQUJMRVMpLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWVlZS0+dy5yLmV4dGVuc2lvbl9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGV4dGVuLCAxLCBzaXplb2YgKGV4dGVuKSwgYWJmZCkgIT0gc2l6ZW9mIChleHRlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDEpKSAvKiBBYnNvbHV0ZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MikpIC8qIFJlbG9jYXRlYWJsZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWVlZS0+dy5yLmVudmlyb25tZW50YWxfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBlbnZpLCAxLCBzaXplb2YgKGVudmkpLCBhYmZkKSAhPSBzaXplb2YgKGVudmkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgcmVxdWlyZXMgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUuICAqLwotICB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjb25zdCBzdHJ1Y3QgdG0gKnQ7Ci0KLSAgICB0aW1lICgmbm93KTsKLSAgICB0ID0gKHN0cnVjdCB0bSAqKSBsb2NhbHRpbWUgKCZub3cpOwotICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgyMSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgNTApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1feWVhciArIDE5MDApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbW9uICsgMSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9tZGF5KQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX2hvdXIpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWluKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3NlYykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBmbHVzaCAoKTsKLQotICBpZiAoISBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBGaXJzdCB3cml0ZSB0aGUgc3ltYm9scy4gIFRoaXMgY2hhbmdlcyB0aGVpciB2YWx1ZXMgaW50byB0YWJsZQotICAgIGluZGVjZXMgc28gd2UgY2FudCB1c2UgaXQgYWZ0ZXIgdGhpcyBwb2ludC4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLSAgLyogIGllZWVfd3JpdGVfYnl0ZShhYmZkLCBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSk7Ki8KLQotCi0gIC8qIFdyaXRlIGFueSBkZWJ1Z3Mgd2UgaGF2ZSBiZWVuIHRvbGQgYWJvdXQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDYW4gb25seSB3cml0ZSB0aGUgZGF0YSBvbmNlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiB3cml0dGVuLCBzaW5jZQotICAgICB0aGUgZGF0YSBjb250YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdoaWNoIHBvaW50cyB0byB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXQgdGhlIGVuZCB3ZSBwdXQgdGhlIGVuZCEgICovCi0gIGlmICghIGllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvbGQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTl9XX1ZBUklBQkxFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgaSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQ1X291dCAoYWJmZCwgaWVlZS0+dy5vZmZzZXRbaV0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotICAgZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi0gICBob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLWFzeW1ib2wgKgotaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX3N5bWJvbF90eXBlICpuZXcgPQotICAgIChpZWVlX3N5bWJvbF90eXBlICopIGJmZF96bWFsbG9jIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi1zdGF0aWMgYmZkICoKLWllZWVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gSUVFRV9BUl9EQVRBIChhcmNoKTsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPmVsZW1lbnRfaW5kZXggPSAyOwotICAgIH0KLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnAgPSBhci0+ZWxlbWVudHMgKyBhci0+ZWxlbWVudF9pbmRleDsKLSAgICAgIGFyLT5lbGVtZW50X2luZGV4Kys7Ci0gICAgICBpZiAoYXItPmVsZW1lbnRfaW5kZXggPD0gYXItPmVsZW1lbnRfY291bnQpCi0JewotCSAgaWYgKHAtPmZpbGVfb2Zmc2V0ICE9IChmaWxlX3B0cikgMCkKLQkgICAgewotCSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQkJewotCQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPmZpbGVfb2Zmc2V0OwotCQl9Ci0JICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotCSAgcmV0dXJuIChiZmQgKikgTlVMTDsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJc2VjdGlvbiwKLQkJCXN5bWJvbHMsCi0JCQlvZmZzZXQsCi0JCQlmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLAotCQkJbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1pZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIGllZWVfYXJfZGF0YV90eXBlICphciA9IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSAhPSBOVUxMKQotICAgIGFyID0gYWJmZC0+bXlfYXJjaGl2ZS0+dGRhdGEuaWVlZV9hcl9kYXRhOwotICBpZiAoYXIgPT0gKGllZWVfYXJfZGF0YV90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKElFRUVfREFUQSAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaWVlZV9vYmplY3RfcCAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIGJ1Zi0+c3Rfc2l6ZSA9IGllZWUtPncuci5tZV9yZWNvcmQgKyAxOwotICBidWYtPnN0X21vZGUgPSAwNjQ0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaWVlZV9zaXplb2ZfaGVhZGVycyAoYWJmZCwgeCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4geCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZGVidWcgaW5mbyByb3V0aW5lcyBhcmUgbmV2ZXIgdXNlZC4gICovCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLQotLyogQWRkIHRoaXMgc2VjdGlvbiB0byB0aGUgbGlzdCBvZiBzZWN0aW9ucyB3ZSBoYXZlIGRlYnVnIGluZm8gZm9yLCB0bwotICAgYmUgcmVhZHkgdG8gb3V0cHV0IGl0IGF0IGNsb3NlIHRpbWUKLSAgICovCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoc2VjdGlvbi0+b3duZXIpOwotICBpZWVlX2RhdGFfdHlwZSAqb3V0cHV0X2llZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAvKiBjYW4gb25seSBhY2N1bXVsYXRlIGRhdGEgZnJvbSBvdGhlciBpZWVlIGJmZHMgKi8KLSAgaWYgKHNlY3Rpb24tPm93bmVyLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuOwotICAvKiBPbmx5IGJvdGhlciBvbmNlIHBlciBiZmQgKi8KLSAgaWYgKGllZWUtPmRvbmVfZGVidWcgPT0gdHJ1ZSkKLSAgICByZXR1cm47Ci0gIGllZWUtPmRvbmVfZGVidWcgPSB0cnVlOwotCi0gIC8qIERvbid0IGJvdGhlciBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvICovCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIC8qIEFkZCB0byBjaGFpbiAqLwotICB7Ci0gICAgYmZkX2NoYWluX3R5cGUgKm4gPSAoYmZkX2NoYWluX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGJmZF9jaGFpbl90eXBlKSk7Ci0gICAgaWYgKCFuKQotICAgICAgYWJvcnQgKCk7CQkvKiBGSVhNRSAqLwotICAgIG4tPnRoaXMgPSBzZWN0aW9uLT5vd25lcjsKLSAgICBuLT5uZXh0ID0gKGJmZF9jaGFpbl90eXBlICopIE5VTEw7Ci0KLSAgICBpZiAob3V0cHV0X2llZWUtPmNoYWluX2hlYWQpCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX2hlYWQtPm5leHQgPSBuOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlvdXRwdXRfaWVlZS0+Y2hhaW5fcm9vdCA9IG47Ci0KLSAgICAgIH0KLSAgICBvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZCA9IG47Ci0gIH0KLX0KLQotI2VuZGlmCi0KLSNkZWZpbmUJaWVlZV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWVlZV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBpZWVlX3NsdXJwX2FybWFwIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgaWVlZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIGllZWVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLQotI2RlZmluZSBpZWVlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaWVlZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaWVlZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGllZWVfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpZWVlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIGllZWVfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgaWVlZV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGllZWVfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpZWVlX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWVlZV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpZWVlX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGllZWVfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjID0KLXsKLSAgImllZWUiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBpZWVlX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgaWVlZV9hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBpZWVlX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9paGV4LmMgYi9iZmQvaWhleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBjNTliLi4wMDAwMDAwCi0tLSBhL2JmZC9paGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgSGV4IG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgd2hhdCBJbnRlbCBIZXggZmlsZXMgbG9vayBsaWtlOgotCi0xLiBJTlRFTCBGT1JNQVRTCi0KLUEuIEludGVsIDEKLQotICAgMTYtYml0IGFkZHJlc3MtZmllbGQgZm9ybWF0LCBmb3IgZmlsZXMgNjRrIGJ5dGVzIGluIGxlbmd0aCBvciBsZXNzLgotCi0gICBEQVRBIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCi0gICAyLi4zCQlUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uCi0gICA0Li41CQlIaWdoIGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDYuLjcJCUxvdyBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDAiCi0gICAxMC4ueAlEYXRhIGJ5dGVzIGluIGhleCBub3RhdGlvbjoKLQl4ID0gKG51bWJlciBvZiBieXRlcyAtIDEpICogMiArIDExCi0gICB4KzEuLngrMglDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIHgrMy4ueCs0CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIEVORCBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMCIKLSAgIDQuLjcJCVRyYW5zZmVyLWFkZHJlc3MgKHVzdWFsbHkgIjAwMDAiKQotCQl0aGUganVtcC10byBhZGRyZXNzLCBleGVjdXRpb24gc3RhcnQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAxIgotICAgMTAuLjExCUNoZWNrc3VtLCBpbiBoZXggbm90YXRpb24KLSAgIDEyLi4xMwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi1CLiBJTlRFTCAyCi0KLSAgIE1DUy04NiBmb3JtYXQsIHVzaW5nIGEgMjAtYml0IGFkZHJlc3MgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDY0SyBieXRlcy4KLQotICAgREFUQSBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50IG9mIHRoaXMgcmVjb3JkLCBoZXggbm90YXRpb24KLSAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKLSAgIDEwLi54CVRoZSBkYXRhIGJ5dGVzIGluIGhleCBub3RhdGlvbjoKLQl4ID0gKG51bWJlciBvZiBkYXRhIGJ5dGVzIC0gMSkgKiAyICsgMTEKLSAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgRVhURU5ERUQgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbig6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAyIgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAyIgotICAgMTAuLjExCUhpZ2ggYnl0ZSBvZiB0aGUgb2Zmc2V0IGFkZHJlc3MKLSAgIDEyLi4xMwlMb3cgYnl0ZSBvZiB0aGUgb2Zmc2V0IGFkZHJlc3MKLSAgIDE0Li4xNQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDE2Li4xNwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBUaGUgY2hlY2tzdW1zIGFyZSB0aGUgdHdvJ3MgY29tcGxlbWVudCBvZiB0aGUgOC1iaXQgc3VtCi0gICB3aXRob3V0IGNhcnJ5IG9mIHRoZSBieXRlIGNvdW50LCBvZmZzZXQgYWRkcmVzcywgYW5kIHRoZQotICAgcmVjb3JkIHR5cGUuCi0KLSAgIFNUQVJUIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDQiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDMiCi0gICAxMC4uMTMJODA4NiBDUyB2YWx1ZQotICAgMTQuLjE3CTgwODYgSVAgdmFsdWUKLSAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi1Bbm90aGVyIGRvY3VtZW50IHJlcG9ydHMgdGhlc2UgYWRkaXRpb25hbCB0eXBlczoKLQotICAgRVhURU5ERUQgTElORUFSIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDQiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBhZGRyZXNzIG9mIHN1YnNlcXVlbnQgcmVjb3JkcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIFNUQVJUIExJTkVBUiBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAyIgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjA1IgotICAgMTAuLjEzCVVwcGVyIDE2IGJpdHMgb2Ygc3RhcnQgYWRkcmVzcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLVRoZSBNUkkgY29tcGlsZXIgdXNlcyB0aGlzLCB3aGljaCBpcyBhIHJlcGVhdCBvZiB0eXBlIDU6Ci0KLSAgRVhURU5ERUQgU1RBUlQgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDQiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxNC4uMTcJTG93ZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxOC4uMTkJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAyMC4uMjEJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyB2b2lkIGloZXhfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBpaGV4X2dldF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGloZXhfYmFkX2J5dGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NjYW4gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICppaGV4X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3JlYWRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gaWhleF9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gaWhleF93cml0ZV9yZWNvcmQKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBhc3ltYm9sICppaGV4X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGludCBpaGV4X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgcHV0IG9uIG9uZSBsaW5lIGR1cmluZyBvdXRwdXQuICAqLwotCi0jZGVmaW5lIENIVU5LIDE2Ci0KLS8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGhleCBhbmQgYmluYXJ5LiAqLwotCi0jZGVmaW5lIE5JQkJMRSh4KSAoaGV4X3ZhbHVlICh4KSkKLSNkZWZpbmUgSEVYMihidWZmZXIpICgoTklCQkxFICgoYnVmZmVyKVswXSkgPDwgNCkgKyBOSUJCTEUgKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgSEVYNChidWZmZXIpICgoSEVYMiAoYnVmZmVyKSA8PCA4KSArIEhFWDIgKChidWZmZXIpICsgMikpCi0jZGVmaW5lIElTSEVYKHgpIChoZXhfcCAoeCkpCi0KLS8qIFdoZW4gd2Ugd3JpdGUgb3V0IGFuIGloZXggdmFsdWUsIHRoZSB2YWx1ZXMgY2FuIG5vdCBiZSBvdXRwdXQgYXMKLSAgIHRoZXkgYXJlIHNlZW4uICBJbnN0ZWFkLCB3ZSBob2xkIHRoZW0gaW4gbWVtb3J5IGluIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGloZXhfZGF0YV9saXN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbmV4dDsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLX07Ci0KLS8qIFRoZSBpaGV4IHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QKLXsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICpoZWFkOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKnRhaWw7Ci19OwotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQ7Ci0KLSAgaWYgKCEgaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIENyZWF0ZSBhbiBpaGV4IG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50ZGF0YS5paGV4X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqdGRhdGE7Ci0KLSAgICAgIHRkYXRhID0gKChzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QpKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS5paGV4X2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT5oZWFkID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBieXRlIGZyb20gYSBCRkQuICBTZXQgKkVSUk9SUFRSIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgUmV0dXJuIEVPRiBvbiBlcnJvciBvciBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1paGV4X2dldF9ieXRlIChhYmZkLCBlcnJvcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuICplcnJvcnB0cjsKLXsKLSAgYmZkX2J5dGUgYzsKLQotICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQkqZXJyb3JwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbnQpIChjICYgMHhmZik7Ci19Ci0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotaWhleF9iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcikKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICAgICBpbnQgYzsKLSAgICAgYm9vbGVhbiBlcnJvcjsKLXsKLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGlmICghIGVycm9yKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoISBpc3ByaW50IChjKSkKLQlzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBjOwotCSAgYnVmWzFdID0gJ1wwJzsKLQl9Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6JWQ6IHVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gSW50ZWwgSGV4IGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIEludGVsIGhleCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBhc2VjdGlvbiAqc2VjOwotICBpbnQgbGluZW5vOwotICBib29sZWFuIGVycm9yOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGludCBjOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBhYmZkLT5zdGFydF9hZGRyZXNzID0gMDsKLQotICBzZWdiYXNlID0gMDsKLSAgZXh0YmFzZSA9IDA7Ci0gIHNlYyA9IE5VTEw7Ci0gIGxpbmVubyA9IDE7Ci0gIGVycm9yID0gZmFsc2U7Ci0gIGJ1ZnNpemUgPSAwOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgaWYgKGMgPT0gJ1xyJykKLQljb250aW51ZTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKLQl7Ci0JICArK2xpbmVubzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGMgIT0gJzonKQotCXsKLQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpbGVfcHRyIHBvczsKLQkgIGNoYXIgaGRyWzhdOwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgYmZkX3ZtYSBhZGRyOwotCSAgdW5zaWduZWQgaW50IHR5cGU7Ci0JICB1bnNpZ25lZCBpbnQgY2hhcnM7Ci0JICB1bnNpZ25lZCBpbnQgY2hrc3VtOwotCi0JICAvKiBUaGlzIGlzIGEgZGF0YSByZWNvcmQuICAqLwotCi0JICBwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSAxOwotCi0JICAvKiBSZWFkIHRoZSBoZWFkZXIgYnl0ZXMuICAqLwotCi0JICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgOCwgYWJmZCkgIT0gOCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoISBJU0hFWCAoaGRyW2ldKSkKLQkJewotCQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgaGRyW2ldLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICBsZW4gPSBIRVgyIChoZHIpOwotCSAgYWRkciA9IEhFWDQgKGhkciArIDIpOwotCSAgdHlwZSA9IEhFWDIgKGhkciArIDYpOwotCi0JICAvKiBSZWFkIHRoZSBkYXRhIGJ5dGVzLiAgKi8KLQotCSAgY2hhcnMgPSBsZW4gKiAyICsgMjsKLQkgIGlmIChjaGFycyA+PSBidWZzaXplKQotCSAgICB7Ci0JICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGNoYXJzKTsKLQkgICAgICBpZiAoYnVmID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJ1ZnNpemUgPSBjaGFyczsKLQkgICAgfQotCi0JICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgY2hhcnMsIGFiZmQpICE9IGNoYXJzKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZm9yIChpID0gMDsgaSA8IGNoYXJzOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoISBJU0hFWCAoYnVmW2ldKSkKLQkJewotCQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgaGRyW2ldLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGVjayB0aGUgY2hlY2tzdW0uICAqLwotCSAgY2hrc3VtID0gbGVuICsgYWRkciArIChhZGRyID4+IDgpICsgdHlwZTsKLQkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkgICAgY2hrc3VtICs9IEhFWDIgKGJ1ZiArIDIgKiBpKTsKLQkgIGlmICgoKC0gY2hrc3VtKSAmIDB4ZmYpICE9ICh1bnNpZ25lZCBpbnQpIEhFWDIgKGJ1ZiArIDIgKiBpKSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6JWQ6IGJhZCBjaGVja3N1bSBpbiBJbnRlbCBIZXggZmlsZSAoZXhwZWN0ZWQgJXUsIGZvdW5kICV1KSIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywKLQkJICgtIGNoa3N1bSkgJiAweGZmLCAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoc2VjICE9IE5VTEwKLQkJICAmJiBzZWMtPnZtYSArIHNlYy0+X3Jhd19zaXplID09IGV4dGJhc2UgKyBzZWdiYXNlICsgYWRkcikKLQkJewotCQkgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgYnVpbGRpbmcuICAqLwotCQkgIHNlYy0+X3Jhd19zaXplICs9IGxlbjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxlbiA+IDApCi0JCXsKLQkJICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgY2hhciAqc2VjbmFtZTsKLQotCQkgIHNwcmludGYgKHNlY2J1ZiwgIi5zZWMlZCIsIGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxKTsKLQkJICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICBpZiAoc2VjbmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChzZWNuYW1lLCBzZWNidWYpOwotCQkgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgIGlmIChzZWMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgc2VjLT52bWEgPSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHI7Ci0JCSAgc2VjLT5sbWEgPSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHI7Ci0JCSAgc2VjLT5fcmF3X3NpemUgPSBsZW47Ci0JCSAgc2VjLT5maWxlcG9zID0gcG9zOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAxOgotCSAgICAgIC8qIEFuIGVuZCByZWNvcmQuICAqLwotCSAgICAgIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzID09IDApCi0JCWFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBhZGRyOwotCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQotCSAgICBjYXNlIDI6Ci0JICAgICAgLyogQW4gZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIHNlZ2Jhc2UgPSBIRVg0IChidWYpIDw8IDQ7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAzOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgKz0gKEhFWDQgKGJ1ZikgPDwgNCkgKyBIRVg0IChidWYgKyA0KTsKLQotCSAgICAgIHNlYyA9IE5VTEw7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDQ6Ci0JICAgICAgLyogQW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgZXh0YmFzZSA9IEhFWDQgKGJ1ZikgPDwgMTY7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA1OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyICYmIGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgaWYgKGxlbiA9PSAyKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzICs9IEhFWDQgKGJ1ZikgPDwgMTY7Ci0JICAgICAgZWxzZQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gKEhFWDQgKGJ1ZikgPDwgMTYpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiB1bnJlY29nbml6ZWQgaWhleCB0eXBlICV1IGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sIHR5cGUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRyeSB0byByZWNvZ25pemUgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1paGV4X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJbOV07Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICBpaGV4X2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoYmZkX3JlYWQgKGIsIDEsIDksIGFiZmQpICE9IDkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiWzBdICE9ICc6JykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBmb3IgKGkgPSAxOyBpIDwgOTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIElTSEVYIChiW2ldKSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgdHlwZSA9IEhFWDIgKGIgKyA3KTsKLSAgaWYgKHR5cGUgPiA1KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBpdCBsb29rcyBsaWtlIGl0IHJlYWxseSBpcyBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLSAgaWYgKCEgaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICEgaWhleF9zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX2J5dGUgKnA7Ci0gIGJmZF9ieXRlICpidWYgPSBOVUxMOwotICBzaXplX3QgYnVmc2l6ZTsKLSAgYm9vbGVhbiBlcnJvcjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBjb250ZW50czsKLSAgYnVmc2l6ZSA9IDA7Ci0gIGVycm9yID0gZmFsc2U7Ci0gIHdoaWxlICgoYyA9IGloZXhfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyIGhkcls4XTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgaWhleF9zY2FuIGhhcyBzdWNjZWVkZWQsIHNvIHdlIG91Z2h0IHRvCi0gICAgICAgICBrbm93IHRoZSBleGFjdCBmb3JtYXQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoYyA9PSAnOicpOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgOCwgYWJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgbGVuID0gSEVYMiAoaGRyKTsKLSAgICAgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLSAgICAgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgc2VlIHR5cGUgMCByZWNvcmRzIGhlcmUuICAqLwotICAgICAgaWYgKHR5cGUgIT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBpbnRlcm5hbCBlcnJvciBpbiBpaGV4X3JlYWRfc2VjdGlvbiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChsZW4gKiAyID4gYnVmc2l6ZSkKLQl7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKGJ1ZiwgbGVuICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGxlbiAqIDI7Ci0JfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgbGVuICogMiwgYWJmZCkgIT0gbGVuICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCSpwKysgPSBIRVgyIChidWYgKyAyICogaSk7Ci0gICAgICBpZiAoKGJmZF9zaXplX3R5cGUpIChwIC0gY29udGVudHMpID49IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLQl7Ci0JICAvKiBXZSd2ZSByZWFkIGV2ZXJ5dGhpbmcgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBjaGVja3N1bS4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgMiwgYWJmZCkgIT0gMikKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA8IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGJhZCBzZWN0aW9uIGxlbmd0aCBpbiBpaGV4X3JlYWRfc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9IGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGloZXhfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBzZWN0aW9uLT51c2VkX2J5X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBtZW1jcHkgKGxvY2F0aW9uLCAoYmZkX2J5dGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQgKyBvZmZzZXQsCi0JICAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICpuOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gIGlmIChjb3VudCA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLSAgICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIG4gPSAoKHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QpKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgbi0+ZGF0YSA9IGRhdGE7Ci0gIG4tPndoZXJlID0gc2VjdGlvbi0+bG1hICsgb2Zmc2V0OwotICBuLT5zaXplID0gY291bnQ7Ci0KLSAgLyogU29ydCB0aGUgcmVjb3JkcyBieSBhZGRyZXNzLiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZgotICAgICBhZGRpbmcgYSByZWNvcmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCi0gIHRkYXRhID0gYWJmZC0+dGRhdGEuaWhleF9kYXRhOwotICBpZiAodGRhdGEtPnRhaWwgIT0gTlVMTAotICAgICAgJiYgbi0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotICAgIHsKLSAgICAgIHRkYXRhLT50YWlsLT5uZXh0ID0gbjsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqKnBwOwotCi0gICAgICBmb3IgKHBwID0gJnRkYXRhLT5oZWFkOwotCSAgICpwcCAhPSBOVUxMICYmICgqcHApLT53aGVyZSA8IG4tPndoZXJlOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgIG4tPm5leHQgPSAqcHA7Ci0gICAgICAqcHAgPSBuOwotICAgICAgaWYgKG4tPm5leHQgPT0gTlVMTCkKLQl0ZGF0YS0+dGFpbCA9IG47Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIHJlY29yZCBvdXQgdG8gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIGNvdW50LCBhZGRyLCB0eXBlLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotewotICBzdGF0aWMgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gIGNoYXIgYnVmWzkgKyBDSFVOSyAqIDIgKyA0XTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNkZWZpbmUgVE9IRVgoYnVmLCB2KSBcCi0gICgoYnVmKVswXSA9IGRpZ3NbKCh2KSA+PiA0KSAmIDB4Zl0sIChidWYpWzFdID0gZGlnc1sodikgJiAweGZdKQotCi0gIGJ1ZlswXSA9ICc6JzsKLSAgVE9IRVggKGJ1ZiArIDEsIGNvdW50KTsKLSAgVE9IRVggKGJ1ZiArIDMsIChhZGRyID4+IDgpICYgMHhmZik7Ci0gIFRPSEVYIChidWYgKyA1LCBhZGRyICYgMHhmZik7Ci0gIFRPSEVYIChidWYgKyA3LCB0eXBlKTsKLQotICBjaGtzdW0gPSBjb3VudCArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0KLSAgZm9yIChpID0gMCwgcCA9IGJ1ZiArIDk7IGkgPCBjb3VudDsgaSsrLCBwICs9IDIsIGRhdGErKykKLSAgICB7Ci0gICAgICBUT0hFWCAocCwgKmRhdGEpOwotICAgICAgY2hrc3VtICs9ICpkYXRhOwotICAgIH0KLQotICBUT0hFWCAocCwgKC0gY2hrc3VtKSAmIDB4ZmYpOwotICBwWzJdID0gJ1xyJzsKLSAgcFszXSA9ICdcbic7Ci0KLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA5ICsgY291bnQgKiAyICsgNCwgYWJmZCkgIT0gOSArIGNvdW50ICogMiArIDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3ZtYSBzZWdiYXNlOwotICBiZmRfdm1hIGV4dGJhc2U7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbDsKLQotICBzZWdiYXNlID0gMDsKLSAgZXh0YmFzZSA9IDA7Ci0gIGZvciAobCA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YS0+aGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHdoZXJlOwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0gICAgICB3aGVyZSA9IGwtPndoZXJlOwotICAgICAgcCA9IGwtPmRhdGE7Ci0gICAgICBjb3VudCA9IGwtPnNpemU7Ci0gICAgICB3aGlsZSAoY291bnQgPiAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JICBub3cgPSBjb3VudDsKLQkgIGlmIChub3cgPiBDSFVOSykKLQkgICAgbm93ID0gQ0hVTks7Ci0KLQkgIGlmICh3aGVyZSA+IHNlZ2Jhc2UgKyBleHRiYXNlICsgMHhmZmZmKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYWRkclsyXTsKLQotCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgYmFzZSBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAod2hlcmUgPD0gMHhmZmZmZikKLQkJewotCQkgIC8qIFRoZSBhZGRyZXNzZXMgc2hvdWxkIGJlIHNvcnRlZC4gICovCi0JCSAgQkZEX0FTU0VSVCAoZXh0YmFzZSA9PSAwKTsKLQotCQkgIHNlZ2Jhc2UgPSB3aGVyZSAmIDB4ZjAwMDA7Ci0JCSAgYWRkclswXSA9IChiZmRfYnl0ZSkoc2VnYmFzZSA+PiAxMikgJiAweGZmOwotCQkgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gNCkgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCAyLCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoZSBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCBhbmQgdGhlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICBsaW5lYXIgYWRkcmVzcyByZWNvcmQgYXJlIGNvbWJpbmVkLCBhdCBsZWFzdCBieQotICAgICAgICAgICAgICAgICAgICAgc29tZSByZWFkZXJzLiAgV2UgbmVlZCBhbiBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgcmVjb3JkIGhlcmUsIHNvIGlmIHdlJ3ZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYW4KLSAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLCB6ZXJvIGl0IG91dCB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW9uLiAgKi8KLQkJICBpZiAoc2VnYmFzZSAhPSAwKQotCQkgICAgewotCQkgICAgICBhZGRyWzBdID0gMDsKLQkJICAgICAgYWRkclsxXSA9IDA7Ci0JCSAgICAgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCAyLCBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgc2VnYmFzZSA9IDA7Ci0JCSAgICB9Ci0KLQkJICBleHRiYXNlID0gd2hlcmUgJiAweGZmZmYwMDAwOwotCQkgIGlmICh3aGVyZSA+IGV4dGJhc2UgKyAweGZmZmYpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgYnVmWzIwXTsKLQotCQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCB3aGVyZSk7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiBhZGRyZXNzIDB4JXMgb3V0IG9mIHJhbmdlIGZvciBJbnRleCBIZXggZmlsZSIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBidWYpOwotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGV4dGJhc2UgPj4gMjQpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDE2KSAmIDB4ZmY7Ci0JCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIDIsIDAsIDQsIGFkZHIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIG5vdywgd2hlcmUgLSAoZXh0YmFzZSArIHNlZ2Jhc2UpLAotCQkJCSAgIDAsIHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHdoZXJlICs9IG5vdzsKLQkgIHAgKz0gbm93OwotCSAgY291bnQgLT0gbm93OwotCX0KLSAgICB9Ci0KLSAgaWYgKGFiZmQtPnN0YXJ0X2FkZHJlc3MgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICAgYmZkX2J5dGUgc3RhcnRidWZbNF07Ci0KLSAgICAgIHN0YXJ0ID0gYWJmZC0+c3RhcnRfYWRkcmVzczsKLQotICAgICAgaWYgKHN0YXJ0IDw9IDB4ZmZmZmYpCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKChzdGFydCAmIDB4ZjAwMDApID4+IDEyKSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IDA7Ci0JICBzdGFydGJ1ZlsyXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gOCkgJiAweGZmOwotCSAgc3RhcnRidWZbM10gPSAoYmZkX2J5dGUpc3RhcnQgJiAweGZmOwotCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIDQsIDAsIDMsIHN0YXJ0YnVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGFydGJ1ZlswXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMjQpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzFdID0gKGJmZF9ieXRlKShzdGFydCA+PiAxNikgJiAweGZmOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCA1LCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAwLCAwLCAxLCBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgVGhpcyBpcyByZXF1aXJlZCBvbmx5IGJlY2F1c2UKLSAgIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHdhbnRzIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1paGV4X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldzsKLQotICBuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldyAhPSBOVUxMKQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgb3V0cHV0IGZpbGUuICBUaGUgYXJjaGl0ZWN0dXJlIGlzCi0gICBpcnJlbGV2YW50LCBzbyB3ZSBpZ25vcmUgZXJyb3JzIGFib3V0IHVua25vd24gYXJjaGl0ZWN0dXJlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0gICAgewotICAgICAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBoZWFkZXJzLCBmb3IgdGhlIGxpbmtlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotaWhleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAotI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Ci17Ci0gICJpaGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvaW5pdC5jIGIvYmZkL2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMWQ1MC4uMDAwMDAwMAotLS0gYS9iZmQvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogYmZkIGluaXRpYWxpemF0aW9uIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qCi1TRUNUSU9OCi0JSW5pdGlhbGl6YXRpb24KLQotCVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGluaXRpYWxpemluZyBhIEJGRC4KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pbml0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfaW5pdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQgZnVuY3Rpb24gdG8KLQlpbml0aWFsaXplIG1hZ2ljYWwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotKi8KLQotLyogQWN0dWFsbHksIHRoZXJlIGlzIGN1cnJlbnRseSBub3RoaW5nIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGRvLgotICAgSG93ZXZlciwgc29tZWRheSBpdCBtYXkgYmUgbmVlZGVkLCBzbyBrZWVwIGl0IGFyb3VuZC4gICovCi0KLXZvaWQKLWJmZF9pbml0ICgpCi17Ci19CmRpZmYgLS1naXQgYS9iZmQvaXJpeC1jb3JlLmMgYi9iZmQvaXJpeC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmU2YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2lyaXgtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSXJpeCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0dSBHcm9zc21hbiwgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb252ZXJ0ZWQgdG8gYmFjay1lbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBJcml4IHN0eWxlIGNvcmUKLSAgIGZpbGVzIChuYW1lbHksIElyaXggNCBhbmQgSXJpeCA1LCBzbyBmYXIpLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgSVJJWF9DT1JFCi0KLSNpbmNsdWRlIDxjb3JlLm91dC5oPgotCi1zdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0IAotewotICBpbnQgc2lnOwotICBjaGFyIGNtZFtDT1JFX05BTUVTSVpFXTsKLX07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLnNnaV9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICppcml4X2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICppcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBhc3ltYm9sICppcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDQ7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pcml4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGk7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIHN0cnVjdCBjb3Jlb3V0IGNvcmVvdXQ7Ci0gIHN0cnVjdCBpZGVzYyAqaWRnLCAqaWRmLCAqaWRzOwotCi0gIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3Jlb3V0LCAxLCBzaXplb2YgY29yZW91dCwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVvdXQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZuZGVmIENPUkVfTUFHSUNOMzIKLSNkZWZpbmUgQ09SRV9NQUdJQ04zMiBDT1JFX01BR0lDCi0jZW5kaWYKLSAgaWYgKChjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQyAmJiBjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQ04zMikKLSAgICAgIHx8IGNvcmVvdXQuY192ZXJzaW9uICE9IENPUkVfVkVSU0lPTjEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVvdXQuY19uYW1lLCBDT1JFX05BTUVTSVpFKTsKLSAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZW91dC5jX3NpZ2NhdXNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY29yZW91dC5jX3ZtYXBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3Jlb3V0LmNfbnZtYXA7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgdm1hcCB2bWFwOwotCi0gICAgICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmdm1hcCwgMSwgc2l6ZW9mIHZtYXAsIGFiZmQpOwotICAgICAgaWYgKHZhbCAhPSBzaXplb2Ygdm1hcCkKLQlicmVhazsKLQotICAgICAgc3dpdGNoICh2bWFwLnZfdHlwZSkKLQl7Ci0JY2FzZSBWREFUQToKLQkgIHNlY25hbWUgPSAiLmRhdGEiOwotCSAgYnJlYWs7Ci0JY2FzZSBWU1RBQ0s6Ci0JICBzZWNuYW1lID0gIi5zdGFjayI7Ci0JICBicmVhazsKLSNpZmRlZiBWTUFQRklMRQotCWNhc2UgVk1BUEZJTEU6Ci0JICBzZWNuYW1lID0gIi5tYXBmaWxlIjsKLQkgIGJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQSBmaWxlIG9mZnNldCBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIHNlY3Rpb24gaXMgbm90IGNvbnRhaW5lZAotCSBpbiB0aGUgY29yZWZpbGUuICAqLwotICAgICAgaWYgKHZtYXAudl9vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwKLQkJCSAgICAgIFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgdm1hcC52X2xlbiwKLQkJCSAgICAgIHZtYXAudl92YWRkciwKLQkJCSAgICAgIHZtYXAudl9vZmZzZXQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVncyBhcmUgY29udGlndW91cyB3aXRoaW4gdGhlIGNvcmUgZmlsZS4gKi8KLQotICBpZGcgPSAmY29yZW91dC5jX2lkZXNjW0lfR1BSRUdTXTsKLSAgaWRmID0gJmNvcmVvdXQuY19pZGVzY1tJX0ZQUkVHU107Ci0gIGlkcyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9TUEVDUkVHU107Ci0KLSAgaWYgKGlkZy0+aV9vZmZzZXQgKyBpZGctPmlfbGVuICE9IGlkZi0+aV9vZmZzZXQKLSAgICAgIHx8IGlkZi0+aV9vZmZzZXQgKyBpZGYtPmlfbGVuICE9IGlkcy0+aV9vZmZzZXQpCi0gICAgcmV0dXJuIDA7CQkJLyogQ2FuJ3QgZGVhbCB3aXRoIG5vbi1jb250aWcgcmVncyAqLwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaWRnLT5pX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLQkJICAgICBTRUNfSEFTX0NPTlRFTlRTLAotCQkgICAgIGlkZy0+aV9sZW4gKyBpZGYtPmlfbGVuICsgaWRzLT5pX2xlbiwKLQkJICAgICAwLAotCQkgICAgIGlkZy0+aV9vZmZzZXQpOwotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1pcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotc3RhdGljIGludAotaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJCS8qIFhYWCAtIEZJWE1FICovCi19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBpcml4X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpcml4X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBpcml4X2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGlyaXhfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBpcml4X2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpcml4X2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGlyaXhfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjID0KLSAgewotICAgICJpcml4LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgaXJpeF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaXJpeF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaXJpeF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBJUklYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJhb3V0LmggYi9iZmQvbGliYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDAxZDNkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTElCQU9VVF9ICi0jZGVmaW5lIExJQkFPVVRfSAotCi0vKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKLSAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgotICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKLSAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAotI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCi0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KLQotLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQotICAgd2VpcmQgc2NvcGUuICAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWM7Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7Ci1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOwotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKLQwKLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgaW5keDsKLX07Ci0KLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLwotc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCi17Ci0gIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQotICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKLSAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOwotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCi0gICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KLSAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKLQotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKLSAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi0gICAgIGZvciBrZXJuZWxzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLwotICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOwotCi0gIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQotICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KLSAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZwotICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCi0gIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKLQotICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQotICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKLSAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAotICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotCi0gIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKLSAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0gIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCi0gICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bwotICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgYmZkICppbnB1dF9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCQkgIGJvb2xlYW4gKnNraXAsCi0JCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOwotCi0gIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotfTsKLSNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAotCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KLSAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0JYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KLQotc3RydWN0IGludGVybmFsX2V4ZWMKLXsKLSAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLwotICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCi0gICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLwotICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCi0gICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0gICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCi19OwotCi0vKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKLTwgTVNCICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0vKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcwotPE1TQiAgICAgICAgICAgPgotMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAotPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUgewotICBNX1VOS05PV04gPSAwLAotICBNXzY4MDEwID0gMSwKLSAgTV82ODAyMCA9IDIsCi0gIE1fU1BBUkMgPSAzLAotICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLwotICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLwotICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KLSAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLwotCi0gIE1fMzg2ID0gMTAwLAotICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCi0gIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KLSAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KLSAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KLSAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KLSAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCi0gIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLwotICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLwotICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KLSAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLwotICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLwotICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KLSAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCi0gIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLwotICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLwotICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTElURV9MRSA9IDI0MwotfTsKLQotI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQotCi0jaWZuZGVmIE5fTUFHSUMKLSMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX01BQ0hUWVBFCi0jIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9GTEFHUwotIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0lORk8KLSMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0RZTkFNSUMKLSMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAotKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAotKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX01BR0lDCi0jIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQotIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9GTEFHUwotIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHNob3J0IGRlc2M7Ci0gIGNoYXIgb3RoZXI7Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZTsKLX0gYW91dF9zeW1ib2xfdHlwZTsKLQotLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgotICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAotICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KLQotc3RydWN0IGFvdXRkYXRhIHsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIAotICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLwotICBhc2VjdGlvbiAqdGV4dHNlYzsKLSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gIGFzZWN0aW9uICpic3NzZWM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gIGZpbGVfcHRyIHN0cl9maWxlcG9zOwotCi0gIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKLQotICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7Ci0KLSAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQotICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCi0gIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOwotCi0gIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKLQotICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7Ci0gIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7Ci0KLSAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLwotICBlbnVtCi0gICAgewotICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAotICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KLSAgICAgIGdudV9lbmNhcF9mb3JtYXQsCi0gICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLwotICAgICAgcV9tYWdpY19mb3JtYXQKLSAgICB9IHN1YmZvcm1hdDsKLQotICBlbnVtCi0gICAgewotICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKLSAgICAgIHpfbWFnaWMsCi0gICAgICBvX21hZ2ljLAotICAgICAgbl9tYWdpYwotICAgIH0gbWFnaWM7Ci0KLSAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgY2hhciAqbGluZV9idWY7Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7Ci0gIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKLSAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKLSAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLwotICBQVFIgZHluYW1pY19pbmZvOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCi0gICAgIGluZGV4LiAgKi8KLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci19OwotCi1zdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi0jZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQotI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCi0jZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQotI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCi0jZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKLSNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQotI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKLSNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQotI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKLSNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQotI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQotI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKLSNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCi0jZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQotICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Ci17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotfTsKLQotI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCi0gICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQotCi0jZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKLSAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKLQotLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCi0JCQkJIGJvb2xlYW4gKnVua25vd24pKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKLQkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKLQkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOwotCi1hbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOwotCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKLQkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLQotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0gICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLQkJCQkJIGFzeW1ib2wgKikpOwotCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCi0gICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgY29uc3QgY2hhciAqKSkpOwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCi0JCQkJCSBmaWxlX3B0ciAqKSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KLQotI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCi0JICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0gICAgICB9CQkJCQkJCQkJICAgICAgCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWNlMWUxLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKiBsaWJiZmQuaCAtLSBEZWNsYXJhdGlvbnMgdXNlZCBieSBiZmQgbGlicmFyeSAqaW1wbGVtZW50YXRpb24qLgotICAgKFRoaXMgaW5jbHVkZSBmaWxlIGlzIG5vdCBmb3IgdXNlcnMgb2YgdGhlIGxpYnJhcnkuKQotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotZXh0ZXJuIHZvaWQgX2JmZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBpZiBnY2MgPj0gMi42LCB3ZSBjYW4gZ2l2ZSBhIGZ1bmN0aW9uIG5hbWUsIHRvbyAqLwotI2lmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDYpCi0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciAqKSBOVUxMKQotI2VuZGlmCi0KLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpIF9iZmRfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5jIGIvYmZkL2xpYmJmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmMwZjMzLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMjYgKzAsMCBAQAotLyogQXNzb3J0ZWQgQkZEIHN1cHBvcnQgcm91dGluZXMsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jZGVmaW5lIGdldHBhZ2VzaXplKCkgMjA0OAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcmVhbF9yZWFkIFBBUkFNUyAoKFBUUiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKikpOwotCi0vKgotU0VDVElPTgotCUludGVybmFsIGZ1bmN0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGhpbiBCRkQuCi0JVGhleSBhcmUgbm90IGludGVuZGVkIGZvciBleHBvcnQsIGJ1dCBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvcgotCWNvbXBsZXRlbmVzcy4KLSovCi0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2ZhbHNlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHN1cHBvcnRlZCBvcGVyYXRpb25zCi0gICB3aGljaCBkbyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF90cnVlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB2YWx1ZS4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfbnVsbHZvaWRwdHIgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50IAotYmZkXzAgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdW5zaWduZWQgaW50IAotYmZkXzB1IChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gICByZXR1cm4gMDsKLX0KLQotLypBUkdVU0VEKi8KLWxvbmcKLWJmZF8wbCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zIHdoaWNoIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0KLS8qQVJHU1VTRUQqLwotbG9uZwotX2JmZF9uMSAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQgCi1iZmRfdm9pZCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoaWdub3JlX2NvcmVfYmZkLCBpZ25vcmVfZXhlY19iZmQpCi0gICAgIGJmZCAqaWdub3JlX2NvcmVfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWdub3JlX2V4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUm91dGluZSB0byBoYW5kbGUgY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotY2hhciAqCi1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gKGNoYXIgKilOVUxMOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKLSAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZHVtbXlfdGFyZ2V0IChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBtZW1vcnkgdXNpbmcgbWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfbWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBSZWFsbG9jYXRlIG1lbW9yeSB1c2luZyByZWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfcmVhbGxvYyAocHRyLCBzaXplKQotICAgICBQVFIgcHRyOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICBpZiAocHRyID09IE5VTEwpCi0gICAgcmV0ID0gbWFsbG9jIChzaXplKTsKLSAgZWxzZQotICAgIHJldCA9IHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MgYW5kIGNsZWFyIGl0LiAgKi8KLQotUFRSCi1iZmRfem1hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBwdHI7Ci0KLSAgcHRyID0gKFBUUikgbWFsbG9jIChzaXplKTsKLQotICBpZiAoc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChwdHIgPT0gTlVMTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIGVsc2UKLQltZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBTb21lIElPIGNvZGUgKi8KLQotCi0vKiBOb3RlIHRoYXQgYXJjaGl2ZSBlbnRyaWVzIGRvbid0IGhhdmUgc3RyZWFtczsgdGhleSBzaGFyZSB0aGVpciBwYXJlbnQncy4KLSAgIFRoaXMgYWxsb3dzIHNvbWVvbmUgdG8gcGxheSB3aXRoIHRoZSBpb3N0cmVhbSBiZWhpbmQgQkZEJ3MgYmFjay4KLQotICAgQWxzbywgbm90ZSB0aGF0IHRoZSBvcmlnaW4gcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUncwotICAgY29udGVudHMgKDAgZm9yIG5vbi1hcmNoaXZlIGVsZW1lbnRzKS4gIEZvciBhcmNoaXZlIGVudHJpZXMgdGhpcyBpcyB0aGUKLSAgIGZpcnN0IG9jdGV0IGluIHRoZSBmaWxlLCBOT1QgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIuICovCi0KLXN0YXRpYyBpbnQKLXJlYWxfcmVhZCAod2hlcmUsIGEsYiwgZmlsZSkKLSAgICAgUFRSIHdoZXJlOwotICAgICBzaXplX3QgYTsKLSAgICAgc2l6ZV90IGI7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIC8qIEZJWE1FIC0gdGhpcyBsb29rcyBsaWtlIGFuIG9wdGltaXphdGlvbiwgYnV0IGl0J3MgcmVhbGx5IHRvIGNvdmVyCi0gICAgIHVwIGZvciBhIGZlYXR1cmUgb2Ygc29tZSBPU3MgKG5vdCBzb2xhcmlzIC0gc2lnaCkgdGhhdAotICAgICBsZC9wZS1kbGwuYyB0YWtlcyBhZHZhbnRhZ2Ugb2YgKGFwcGFyZW50bHkpIHdoZW4gaXQgY3JlYXRlcyBCRkRzCi0gICAgIGludGVybmFsbHkgYW5kIHRyaWVzIHRvIGxpbmsgYWdhaW5zdCB0aGVtLiAgQkZEIHNlZW1zIHRvIGJlIHNtYXJ0Ci0gICAgIGVub3VnaCB0byByZWFsaXplIHRoZXJlIGFyZSBubyBzeW1ib2wgcmVjb3JkcyBpbiB0aGUgImZpbGUiIHRoYXQKLSAgICAgZG9lc24ndCBleGlzdCBidXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGVtIGFueXdheS4gIE9uIFNvbGFyaXMsCi0gICAgIGF0dGVtcHRpbmcgdG8gcmVhZCB6ZXJvIGJ5dGVzIGZyb20gYSBOVUxMIGZpbGUgcmVzdWx0cyBpbiBhIGNvcmUKLSAgICAgZHVtcCwgYnV0IG9uIG90aGVyIHBsYXRmb3JtcyBpdCBqdXN0IHJldHVybnMgemVybyBieXRlcyByZWFkLgotICAgICBUaGlzIG1ha2VzIGl0IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLiAtIERKICovCi0gIGlmIChhID09IDAgfHwgYiA9PSAwKQotICAgIHJldHVybiAwOwotCi0jaWYgZGVmaW5lZCAoX19WQVgpICYmIGRlZmluZWQgKFZNUykKLSAgLyogQXBwYXJlbnRseSBmcmVhZCBvbiBWYXggVk1TIGRvZXMgbm90IGtlZXAgdGhlIHJlY29yZCBsZW5ndGgKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZXR1cm4gcmVhZCAoZmlsZW5vIChmaWxlKSwgd2hlcmUsIGEgKiBiKTsKLSNlbHNlCi0gIHJldHVybiBmcmVhZCAod2hlcmUsIGEsIGIsIGZpbGUpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB2YWx1ZSBpcyBhbW91bnQgcmVhZCAoRklYTUU6IGhvdyBhcmUgZXJyb3JzIGFuZCBlbmQgb2YgZmlsZSBkZWFsdAotICAgd2l0aD8gIFdlIG5ldmVyIGNhbGwgYmZkX3NldF9lcnJvciwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlKS4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9yZWFkIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnJlYWQ7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ2V0OwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICBnZXQgPSBzaXplICogbml0ZW1zOwotICAgICAgaWYgKGFiZmQtPndoZXJlICsgZ2V0ID4gYmltLT5zaXplKQotCXsKLQkgIGlmIChiaW0tPnNpemUgPCAoYmZkX3NpemVfdHlwZSkgYWJmZC0+d2hlcmUpCi0JICAgIGdldCA9IDA7Ci0JICBlbHNlCi0JICAgIGdldCA9IGJpbS0+c2l6ZSAtIGFiZmQtPndoZXJlOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQl9Ci0gICAgICBtZW1jcHkgKHB0ciwgYmltLT5idWZmZXIgKyBhYmZkLT53aGVyZSwgZ2V0KTsKLSAgICAgIGFiZmQtPndoZXJlICs9IGdldDsKLSAgICAgIHJldHVybiBnZXQ7Ci0gICAgfQotCi0gIG5yZWFkID0gcmVhbF9yZWFkIChwdHIsIDEsIChzaXplX3QpKHNpemUqbml0ZW1zKSwgYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci0gIGlmIChucmVhZCA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbnJlYWQ7Ci0KLSAgLyogU2V0IGJmZF9lcnJvciBpZiB3ZSBkaWQgbm90IHJlYWQgYXMgbXVjaCBkYXRhIGFzIHdlIGV4cGVjdGVkLgotCi0gICAgIElmIHRoZSByZWFkIGZhaWxlZCBkdWUgdG8gYW4gZXJyb3Igc2V0IHRoZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gICAgIGVsc2Ugc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZC4KLQotICAgICBBIEJGRCBiYWNrZW5kIG1heSB3aXNoIHRvIG92ZXJyaWRlIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCB0bwotICAgICBwcm92aWRlIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCAoZWcuIG5vX3N5bWJvbHMgb3Igd3JvbmdfZm9ybWF0KS4gICovCi0gIGlmIChucmVhZCAhPSAoaW50KSAoc2l6ZSAqIG5pdGVtcykpCi0gICAgewotICAgICAgaWYgKGZlcnJvciAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlbHNlCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yZWFkOwotfQotCi0vKiBUaGUgd2luZG93IHN1cHBvcnQgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGJlIGJyb2tlbiBvdXQgaW50bwotICAgYW5vdGhlciBmaWxlLi4uLiAgKi8KLS8qIFRoZSBpZGVhIGJlaGluZCB0aGUgbmV4dCBhbmQgcmVmY291bnQgZmllbGRzIGlzIHRoYXQgb25lIG1hcHBlZAotICAgcmVnaW9uIGNhbiBzdWZmaWNlIGZvciBtdWx0aXBsZSByZWFkLW9ubHkgd2luZG93cyBvciBtdWx0aXBsZQotICAgbm9uLW92ZXJsYXBwaW5nIHJlYWQtd3JpdGUgd2luZG93cy4gIEl0J3Mgbm90IGltcGxlbWVudGVkIHlldAotICAgdGhvdWdoLiAgKi8KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCB7Ci0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqbmV4dDsKLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgaW50IHJlZmNvdW50IDogMzE7CQkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCi0gIHVuc2lnbmVkIG1hcHBlZCA6IDE7CQkvKiAxID0gbW1hcCwgMCA9IG1hbGxvYyAqLwotfTsKLQotdm9pZAotYmZkX2luaXRfd2luZG93ICh3aW5kb3dwKQotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotewotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgd2luZG93cC0+aSA9IDA7Ci0gIHdpbmRvd3AtPnNpemUgPSAwOwotfQotDAotLyogQ3VycmVudGx5LCBpZiBVU0VfTU1BUCBpcyB1bmRlZmluZWQsIG5vbmUgaWYgdGhlIHdpbmRvdyBzdHVmZiBpcwotICAgdXNlZC4gIE9rYXksIHNvIGl0J3MgbWlzLW5hbWVkLiAgQXQgbGVhc3QgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KLSAgICItLXdpdGhvdXQtbW1hcCIgaXMgbW9yZSBvYnZpb3VzIHRoYW4gIi0td2l0aG91dC13aW5kb3dzIiBvciBzb21lCi0gICBzdWNoLiAgKi8KLSNpZmRlZiBVU0VfTU1BUAotCi0jdW5kZWYgSEFWRV9NUFJPVEVDVCAvKiBjb2RlJ3Mgbm90IHRlc3RlZCB5ZXQgKi8KLQotI2lmIEhBVkVfTU1BUCB8fCBIQVZFX01QUk9URUNUIHx8IEhBVkVfTUFEVklTRQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVBfRklMRQotI2RlZmluZSBNQVBfRklMRSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBkZWJ1Z193aW5kb3dzOwotCi12b2lkCi1iZmRfZnJlZV93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuOwotICBpLT5yZWZjb3VudC0tOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJmcmVlaW5nIHdpbmRvdyBAJXA8JXAsJWx4LCVwPlxuIiwKLQkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsIHdpbmRvd3AtPnNpemUsIHdpbmRvd3AtPmkpOwotICBpZiAoaS0+cmVmY291bnQgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGktPm1hcHBlZCkKLSAgICB7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gICAgICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotICAgICAgZ290byBub19mcmVlOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotI2VuZGlmCi0gIGZyZWUgKGktPmRhdGEpOwotI2lmZGVmIEhBVkVfTU1BUAotIG5vX2ZyZWU6Ci0jZW5kaWYKLSAgaS0+ZGF0YSA9IDA7Ci0gIC8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgZnJlZSAoaSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2tfdG9fbWFwID0gMTsKLQotYm9vbGVhbgotYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgb2Zmc2V0LCBzaXplLCB3aW5kb3dwLCB3cml0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLSAgICAgYm9vbGVhbiB3cml0YWJsZTsKLXsKLSAgc3RhdGljIHNpemVfdCBwYWdlc2l6ZTsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHNpemVfdCBzaXplX3RvX2FsbG9jID0gc2l6ZTsKLQotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfZ2V0X2ZpbGVfd2luZG93ICglcCwgJTZsZCwgJTZsZCwgJXA8JXAsJWx4LCVwPiwgJWQpIiwKLQkgICAgIGFiZmQsIChsb25nKSBvZmZzZXQsIChsb25nKSBzaXplLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgKHVuc2lnbmVkIGxvbmcpIHdpbmRvd3AtPnNpemUsCi0JICAgICB3aW5kb3dwLT5pLCB3cml0YWJsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgdGhlIHBhZ2Ugc2l6ZSwgc28gd2UgY2FuIGJlIGZyaWVuZGx5IHRvIG1tYXAuICAqLwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIHdpbmRvd3AtPmkgPSBpID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKGkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpLT5kYXRhID0gMDsKLSAgICB9Ci0jaWZkZWYgSEFWRV9NTUFQCi0gIGlmIChva190b19tYXAKLSAgICAgICYmIChpLT5kYXRhID09IDAgfHwgaS0+bWFwcGVkID09IDEpCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0LCBvZmZzZXQyOwotICAgICAgc2l6ZV90IHJlYWxfc2l6ZTsKLSAgICAgIGludCBmZDsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgZmlsZSBhbmQgdGhlIHJlYWwgb2Zmc2V0IGludG8gaXQuICAqLwotICAgICAgd2hpbGUgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBvZmZzZXQgKz0gYWJmZC0+b3JpZ2luOwotCSAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0JfQotICAgICAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgICAgZmQgPSBmaWxlbm8gKGYpOwotCi0gICAgICAvKiBDb21wdXRlIG9mZnNldHMgYW5kIHNpemUgZm9yIG1tYXAgYW5kIGZvciB0aGUgdXNlcidzIGRhdGEuICAqLwotICAgICAgb2Zmc2V0MiA9IG9mZnNldCAlIHBhZ2VzaXplOwotICAgICAgaWYgKG9mZnNldDIgPCAwKQotCWFib3J0ICgpOwotICAgICAgZmlsZV9vZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQyOwotICAgICAgcmVhbF9zaXplID0gb2Zmc2V0ICsgc2l6ZSAtIGZpbGVfb2Zmc2V0OwotICAgICAgcmVhbF9zaXplID0gcmVhbF9zaXplICsgcGFnZXNpemUgLSAxOwotICAgICAgcmVhbF9zaXplIC09IHJlYWxfc2l6ZSAlIHBhZ2VzaXplOwotCi0gICAgICAvKiBJZiB3ZSdyZSByZS11c2luZyBhIG1lbW9yeSByZWdpb24sIG1ha2Ugc3VyZSBpdCdzIGJpZyBlbm91Z2guICAqLwotICAgICAgaWYgKGktPmRhdGEgJiYgaS0+c2l6ZSA8IHNpemUpCi0JewotCSAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKLQkgIGktPmRhdGEgPSAwOwotCX0KLSAgICAgIGktPmRhdGEgPSBtbWFwIChpLT5kYXRhLCByZWFsX3NpemUsCi0JCSAgICAgIHdyaXRhYmxlID8gUFJPVF9XUklURSB8IFBST1RfUkVBRCA6IFBST1RfUkVBRCwKLQkJICAgICAgKHdyaXRhYmxlCi0JCSAgICAgICA/IE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUKLQkJICAgICAgIDogTUFQX0ZJTEUgfCBNQVBfU0hBUkVEKSwKLQkJICAgICAgZmQsIGZpbGVfb2Zmc2V0KTsKLSAgICAgIGlmIChpLT5kYXRhID09IChQVFIpIC0xKQotCXsKLQkgIC8qIEFuIGVycm9yIGhhcHBlbmVkLiAgUmVwb3J0IGl0LCBvciB0cnkgdXNpbmcgbWFsbG9jLCBvcgotCSAgICAgc29tZXRoaW5nLiAgKi8KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBpLT5kYXRhID0gMDsKLQkgIHdpbmRvd3AtPmRhdGEgPSAwOwotCSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRtbWFwIGZhaWxlZCFcbiIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQotCWZwcmludGYgKHN0ZGVyciwgIlxuXHRtYXBwZWQgJWxkIGF0ICVwLCBvZmZzZXQgaXMgJWxkXG4iLAotCQkgKGxvbmcpIHJlYWxfc2l6ZSwgaS0+ZGF0YSwgKGxvbmcpIG9mZnNldDIpOwotICAgICAgaS0+c2l6ZSA9IHJlYWxfc2l6ZTsKLSAgICAgIHdpbmRvd3AtPmRhdGEgPSAoUFRSKSAoKGJmZF9ieXRlICopIGktPmRhdGEgKyBvZmZzZXQyKTsKLSAgICAgIHdpbmRvd3AtPnNpemUgPSBzaXplOwotICAgICAgaS0+bWFwcGVkID0gMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoZGVidWdfd2luZG93cykKLSAgICB7Ci0gICAgICBpZiAob2tfdG9fbWFwKQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIiksCi0JCSAodW5zaWduZWQgbG9uZykgaS0+ZGF0YSwgKGludCkgaS0+bWFwcGVkKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIpKTsKLSAgICB9Ci0jZWxzZQotICBva190b19tYXAgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgc2l6ZV90b19hbGxvYyArPSBwYWdlc2l6ZSAtIDE7Ci0gICAgICBzaXplX3RvX2FsbG9jIC09IHNpemVfdG9fYWxsb2MgJSBwYWdlc2l6ZTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXG5cdCVzKCU2bGQpIiwKLQkgICAgIGktPmRhdGEgPyAicmVhbGxvYyIgOiAiIG1hbGxvYyIsIChsb25nKSBzaXplX3RvX2FsbG9jKTsKLSAgaS0+ZGF0YSA9IChQVFIpIGJmZF9yZWFsbG9jIChpLT5kYXRhLCBzaXplX3RvX2FsbG9jKTsKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHQtPiAlcFxuIiwgaS0+ZGF0YSk7Ci0gIGktPnJlZmNvdW50ID0gMTsKLSAgaWYgKGktPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZV90b19hbGxvYyA9PSAwKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5zaXplID0gYmZkX3JlYWQgKGktPmRhdGEsIHNpemUsIDEsIGFiZmQpOwotICBpZiAoaS0+c2l6ZSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgaS0+bWFwcGVkID0gMDsKLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXHRtcHJvdGVjdCAoJXAsICVsZCwgUFJPVF9SRUFEKVxuIiwgaS0+ZGF0YSwKLQkJIChsb25nKSBpLT5zaXplKTsKLSAgICAgIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQpOwotICAgIH0KLSNlbmRpZgotICB3aW5kb3dwLT5kYXRhID0gaS0+ZGF0YTsKLSAgd2luZG93cC0+c2l6ZSA9IGktPnNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogVVNFX01NQVAgKi8KLQwKLWJmZF9zaXplX3R5cGUKLWJmZF93cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCi0gICAgIENPTlNUIFBUUiBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBud3JvdGU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSAoYWJmZC0+aW9zdHJlYW0pOwotICAgICAgc2l6ZSAqPSBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBzaXplID4gYmltLT5zaXplKQotCXsKLQkgIGxvbmcgbmV3c2l6ZSwgb2xkc2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKLQkgIGJpbS0+c2l6ZSA9IGFiZmQtPndoZXJlICsgc2l6ZTsKLQkgIC8qIFJvdW5kIHVwIHRvIGN1dCBkb3duIG9uIG1lbW9yeSBmcmFnbWVudGF0aW9uICovCi0JICBuZXdzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQotCSAgICB7Ci0JICAgICAgYmltLT5idWZmZXIgPSBiZmRfcmVhbGxvYyAoYmltLT5idWZmZXIsIG5ld3NpemUpOwotCSAgICAgIGlmIChiaW0tPmJ1ZmZlciA9PSAwKQotCQl7Ci0JCSAgYmltLT5zaXplID0gMDsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgbWVtY3B5IChiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBwdHIsIHNpemUpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICBud3JvdGUgPSBmd3JpdGUgKHB0ciwgMSwgKHNpemVfdCkgKHNpemUgKiBuaXRlbXMpLAotCQkgICBiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7Ci0gIGlmIChud3JvdGUgPiAwKQotICAgIGFiZmQtPndoZXJlICs9IG53cm90ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBud3JvdGUgIT0gc2l6ZSAqIG5pdGVtcykKLSAgICB7Ci0jaWZkZWYgRU5PU1BDCi0gICAgICBpZiAobndyb3RlID49IDApCi0JZXJybm8gPSBFTk9TUEM7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotICByZXR1cm4gbndyb3RlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQoYmZkICphYmZkLCAgaW50IGkpOwotCi1ERVNDUklQVElPTgotCVdyaXRlIGEgNCBieXRlIGludGVnZXIgQHZhcntpfSB0byB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9LCBpbiBiaWcKLQllbmRpYW4gb3JkZXIgcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ29pbmcgb24uICBUaGlzIGlzIHVzZWZ1bCBpbgotCWFyY2hpdmVzLgotCi0qLwotdm9pZAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFiZmQsIGkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGk7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgYmZkX3B1dGIzMihpLCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlKChQVFIpYnVmZmVyLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIGFib3J0ICgpOwotfQotCi1sb25nCi1iZmRfdGVsbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBwdHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIGFiZmQtPndoZXJlOwotCi0gIHB0ciA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLSAgICBwdHIgLT0gYWJmZC0+b3JpZ2luOwotICBhYmZkLT53aGVyZSA9IHB0cjsKLSAgcmV0dXJuIHB0cjsKLX0KLQotaW50Ci1iZmRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmZmx1c2ggKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlCi0gICBiZmRfZ2V0X2Vycm9yIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotaW50Ci1iZmRfc3RhdCAoYWJmZCwgc3RhdGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgRklMRSAqZjsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJlc3VsdCA9IGZzdGF0IChmaWxlbm8gKGYpLCBzdGF0YnVmKTsKLSAgaWYgKHJlc3VsdCA8IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlIGJmZF9nZXRfZXJyb3IKLSAgIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotCi1pbnQKLWJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgZGlyZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHBvc2l0aW9uOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICBpbnQgcmVzdWx0OwotICBGSUxFICpmOwotICBmaWxlX3B0ciBmaWxlX3Bvc2l0aW9uOwotICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIGEgQkZEIG1heSBub3Qgc2VlayB0byBpdCdzIGVuZC4gIFRoZSBwcm9ibGVtCi0gICAgIGlzIHRoYXQgd2UgZG9uJ3QgZWFzaWx5IGhhdmUgYSB3YXkgdG8gcmVjb2duaXplIHRoZSBlbmQgb2YgYW4KLSAgICAgZWxlbWVudCBpbiBhbiBhcmNoaXZlLiAqLwotCi0gIEJGRF9BU1NFUlQgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCB8fCBkaXJlY3Rpb24gPT0gU0VFS19DVVIpOwotCi0gIGlmIChkaXJlY3Rpb24gPT0gU0VFS19DVVIgJiYgcG9zaXRpb24gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICAKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICAgIAotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSBhYmZkLT53aGVyZSA+IGJpbS0+c2l6ZSkKLQl7Ci0JICBhYmZkLT53aGVyZSA9IGJpbS0+c2l6ZTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfYXJjaGl2ZSAmJiBhYmZkLT5teV9hcmNoaXZlID09IDApCi0gICAgewotI2lmIDAKLSAgICAgIC8qIEV4cGxhbmF0aW9uIGZvciB0aGlzIGNvZGU6IEknbSBvbmx5IGFib3V0IDk1KyUgc3VyZSB0aGF0IHRoZSBhYm92ZQotCSBjb25kaXRpb25zIGFyZSBzdWZmaWNpZW50IGFuZCB0aGF0IGFsbCBpL28gY2FsbHMgYXJlIHByb3Blcmx5Ci0JIGFkanVzdGluZyB0aGUgYHdoZXJlJyBmaWVsZC4gIFNvIHRoaXMgaXMgc29ydCBvZiBhbiBgYXNzZXJ0JwotCSB0aGF0IHRoZSBgd2hlcmUnIGZpZWxkIGlzIGNvcnJlY3QuICBJZiB3ZSBjYW4gZ28gYSB3aGlsZSB3aXRob3V0Ci0JIHRyaXBwaW5nIHRoZSBhYm9ydCwgd2UgY2FuIHByb2JhYmx5IHNhZmVseSBkaXNhYmxlIHRoaXMgY29kZSwKLQkgc28gdGhhdCB0aGUgcmVhbCBvcHRpbWl6YXRpb25zIGhhcHBlbi4gICovCi0gICAgICBmaWxlX3B0ciB3aGVyZV9hbV9pX25vdzsKLSAgICAgIHdoZXJlX2FtX2lfbm93ID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgICAgIGlmIChhYmZkLT5teV9hcmNoaXZlKQotCXdoZXJlX2FtX2lfbm93IC09IGFiZmQtPm9yaWdpbjsKLSAgICAgIGlmICh3aGVyZV9hbV9pX25vdyAhPSBhYmZkLT53aGVyZSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBwb3NpdGlvbiA9PSBhYmZkLT53aGVyZSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHNvbWV0aGluZyBzbWFydGVyIHRvIG9wdGltaXplIGFjY2VzcyB0byBhcmNoaXZlcy4KLQkgQ3VycmVudGx5LCBhbnl0aGluZyBpbnNpZGUgYW4gYXJjaGl2ZSBpcyByZWFkIHZpYSB0aGUgZmlsZQotCSBoYW5kbGUgZm9yIHRoZSBhcmNoaXZlLiAgV2hpY2ggbWVhbnMgdGhhdCBhIGJmZF9zZWVrIG9uIG9uZQotCSBjb21wb25lbnQgYWZmZWN0cyB0aGUgYGN1cnJlbnQgcG9zaXRpb24nIGluIHRoZSBhcmNoaXZlLCBhcwotCSB3ZWxsIGFzIGluIGFueSBvdGhlciBjb21wb25lbnQuCi0KLQkgSXQgbWlnaHQgYmUgc3VmZmljaWVudCB0byBwdXQgYSBzcGlrZSB0aHJvdWdoIHRoZSBjYWNoZQotCSBhYnN0cmFjdGlvbiwgYW5kIGxvb2sgdG8gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlIHBvc2l0aW9uLAotCSBidXQgSSB0aGluayB3ZSBzaG91bGQgdHJ5IGZvciBzb21ldGhpbmcgY2xlYW5lci4KLQotCSBJbiB0aGUgbWVhbnRpbWUsIG5vIG9wdGltaXphdGlvbiBmb3IgYXJjaGl2ZXMuICAqLwotICAgIH0KLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGZpbGVfcG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0gICAgZmlsZV9wb3NpdGlvbiArPSBhYmZkLT5vcmlnaW47Ci0KLSAgcmVzdWx0ID0gZnNlZWsgKGYsIGZpbGVfcG9zaXRpb24sIGRpcmVjdGlvbik7Ci0KLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgIGludCBob2xkX2Vycm5vID0gZXJybm87Ci0KLSAgICAgIC8qIEZvcmNlIHJlZGV0ZXJtaW5hdGlvbiBvZiBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGJmZF90ZWxsIChhYmZkKTsKLQotICAgICAgLyogQW4gRUlOVkFMIGVycm9yIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGZpbGUgb2Zmc2V0IHdhcwotICAgICAgICAgYWJzdXJkLiAgKi8KLSAgICAgIGlmIChob2xkX2Vycm5vID09IEVJTlZBTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBlcnJubyA9IGhvbGRfZXJybm87Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkanVzdCBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0MCi0vKiogVGhlIGRvLWl0LXlvdXJzZWxmIChieXRlKSBzZXgtY2hhbmdlIGtpdCAqLwotCi0vKiBUaGUgbWlkZGxlIGxldHRlciBlLmcuIGdldDxiPnNob3J0IGluZGljYXRlcyBCaWcgb3IgTGl0dGxlIGVuZGlhbgotICAgdGFyZ2V0IG1hY2hpbmUuICBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Ci0gICBtYWNoaW5lIGlzOyB0aGVzZSByb3V0aW5lcyB3b3JrIGZvciBlaXRoZXIuICAqLwotCi0vKiBGSVhNRTogU2hvdWxkIHRoZXNlIHRha2UgYSBjb3VudCBhcmd1bWVudD8KLSAgIEFuc3dlciAoZ251QGN5Z251cy5jb20pOiAgTm8sIGJ1dCBwZXJoYXBzIHRoZXkgc2hvdWxkIGJlIGlubGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgaW4gc3dhcC5oICNpZmRlZiBfX0dOVUNfXy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwcm9mIHRoZW0gbGF0ZXIgYW5kIGZpbmQgb3V0LiAgKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3B1dF9zaXplCi1GVU5DVElPTgotCWJmZF9nZXRfc2l6ZQotCi1ERVNDUklQVElPTgotCVRoZXNlIG1hY3JvcyBhcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnM7IGVhY2ggYWNjZXNzIChleGNlcHQgZm9yIGJ5dGVzKSBpcyB2ZWN0b3JlZCB0aHJvdWdoCi0JdGhlIHRhcmdldCBmb3JtYXQgb2YgdGhlIEJGRCBhbmQgbWFuZ2xlZCBhY2NvcmRpbmdseS4gVGhlCi0JbWFuZ2xpbmcgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBlbmRpYW4gdHJhbnNsYXRpb25zIGFuZAotCXJlbW92ZXMgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gIE5vdGUgdGhhdCB0eXBlcyBhY2NlcHRlZCBhbmQKLQlyZXR1cm5lZCBieSB0aGVzZSBtYWNyb3MgYXJlIGlkZW50aWNhbCBzbyB0aGV5IGNhbiBiZSBzd2FwcGVkCi0JYXJvdW5kIGluIG1hY3Jvcy0tLWZvciBleGFtcGxlLCBAZmlsZXtsaWJhb3V0Lmh9IGRlZmluZXMgPDxHRVRfV09SRD4+Ci0JdG8gZWl0aGVyIDw8YmZkX2dldF8zMj4+IG9yIDw8YmZkX2dldF82ND4+LgotCi0JSW4gdGhlIHB1dCByb3V0aW5lcywgQHZhcnt2YWx9IG11c3QgYmUgYSA8PGJmZF92bWE+Pi4gIElmIHdlIGFyZSBvbiBhCi0Jc3lzdGVtIHdpdGhvdXQgcHJvdG90eXBlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCi0Jc3VyZSB0aGF0IGlzIHRydWUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4gIFdlIGRvbid0IGNhc3QKLQl0aGVtIGluIHRoZSBtYWNybyBkZWZpbml0aW9ucyBiZWNhdXNlIHRoYXQgd291bGQgcHJldmVudCA8PGxpbnQ+PgotCW9yIDw8Z2NjIC1XYWxsPj4gZnJvbSBkZXRlY3Rpbmcgc2lucyBzdWNoIGFzIHBhc3NpbmcgYSBwb2ludGVyLgotCVRvIGRldGVjdCBjYWxsaW5nIHRoZXNlIHdpdGggbGVzcyB0aGFuIGEgPDxiZmRfdm1hPj4sIHVzZQotCTw8Z2NjIC1XY29udmVyc2lvbj4+IG9uIGEgaG9zdCB3aXRoIDY0IGJpdCA8PGJmZF92bWE+PidzLgotCi0uCi0ueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCi0uCQliZmRfcHV0XzgKLS4jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCSgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCi0uCi0uI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX3B1dF8xNgotLiNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAJIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAotLgkJIGJmZF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX3B1dF82NAotLiNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2dldChiaXRzLCBhYmZkLCBwdHIpCQkJCVwKLS4gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpCQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSAzMiA/IGJmZF9nZXRfMzIgKGFiZmQsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDY0ID8gYmZkX2dldF82NCAoYWJmZCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotLgotLiNkZWZpbmUgYmZkX3B1dChiaXRzLCBhYmZkLCB2YWwsIHB0cikJCQkJXAotLiAgICAgICAgICAgICAgICAoKGJpdHMpID09IDggPyBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDMyID8gYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSA2NCA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLS4KLSovIAotCi0vKgotRlVOQ1RJT04KLQliZmRfaF9wdXRfc2l6ZQotCWJmZF9oX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlaXIgPDxiZmRfZ2V0X3g+PgotCWJyZXRoZXJlbiwgZXhjZXB0IHRoYXQgdGhleSBhcmUgdXNlZCBmb3IgcmVtb3ZpbmcgaW5mb3JtYXRpb24KLQlmb3IgdGhlIGhlYWRlciByZWNvcmRzIG9mIG9iamVjdCBmaWxlcy4gQmVsaWV2ZSBpdCBvciBub3QsCi0Jc29tZSBvYmplY3QgZmlsZXMga2VlcCB0aGVpciBoZWFkZXIgcmVjb3JkcyBpbiBiaWcgZW5kaWFuCi0Jb3JkZXIgYW5kIHRoZWlyIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgZmlsZSBoZWFkZXIgZGF0YS4gICp9Ci0uCi0uI2RlZmluZSBiZmRfaF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotLgkJYmZkX2dldF84IChhYmZkLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0X3NpZ25lZF84IChhYmZkLCBwdHIpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDE2LCh2YWwscHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMTYgXAotLgkJIGJmZF9oX3B1dF8xNgotLiNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MzIsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX2hfcHV0XzMyCi0uI2RlZmluZSBiZmRfaF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgzMiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX2hfcHV0XzY0Ci0uI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotKi8gCi0KLS8qIFNpZ24gZXh0ZW5zaW9uIHRvIGJmZF9zaWduZWRfdm1hLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIDB4ODAwMCkgLSAweDgwMDApCi0jZGVmaW5lIENPRVJDRTMyKHgpIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpICh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIEVJR0hUX0dBWklMTElPTiAoKChCRkRfSE9TVF82NF9CSVQpMHg4MDAwMDAwMCkgPDwgMzIpCi0jZGVmaW5lIENPRVJDRTY0KHgpIFwKLSAgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIEVJR0hUX0dBWklMTElPTikgLSBFSUdIVF9HQVpJTExJT04pCi0KLWJmZF92bWEKLWJmZF9nZXRiMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIChhZGRyWzFdIDw8IDgpIHwgYWRkclswXTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8xNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiBDT0VSQ0UxNigoYWRkclswXSA8PCA4KSB8IGFkZHJbMV0pOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzFdIDw8IDgpIHwgYWRkclswXSk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUgKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsgICAgICAgICAgICAgCi0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzBdID0gKGJmZF9ieXRlIClkYXRhOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+IDgpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM10gPDwgMjQ7Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGI2NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi0KLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls0XSkpOwotCi0gIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbMF0pICk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGIzMiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSlkYXRhOwotfQotCi12b2lkCi1iZmRfcHV0bDMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKWRhdGE7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiNjQgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKLSAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKLSAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOwotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGw2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkcls3XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkcls0XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotDAotLyogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKG9mZnNldCArIGNvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF93aW5kb3cgKncgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBVU0VfTU1BUAotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFiZmQtPnh2ZWMtPl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgIT0gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hhdCBjaGFuZ2VzIHRoZSBiZmQncyBnZXRfc2VjdGlvbl9jb250ZW50cwotCSBtZXRob2QgbWF5IGhhdmUgdG8gbWFrZS4gIFNvIHB1bnQgdHJ5aW5nIHRvIG1hcCB0aGUgZmlsZQotCSB3aW5kb3csIGFuZCBsZXQgZ2V0X3NlY3Rpb25fY29udGVudHMgZG8gaXRzIHRoaW5nLiAgKi8KLSAgICAgIC8qIEBAIEZJWE1FIDogSWYgdGhlIGludGVybmFsIHdpbmRvdyBoYXMgYSByZWZjb3VudCBvZiAxIGFuZCB3YXMKLQkgYWxsb2NhdGVkIHdpdGggbWFsbG9jIGluc3RlYWQgb2YgbW1hcCwganVzdCByZXVzZSBpdC4gICovCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKHcpOwotICAgICAgdy0+aSA9IChiZmRfd2luZG93X2ludGVybmFsICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZF93aW5kb3dfaW50ZXJuYWwpKTsKLSAgICAgIGlmICh3LT5pID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdy0+aS0+ZGF0YSA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50KTsKLSAgICAgIGlmICh3LT5pLT5kYXRhID09IE5VTEwpCi0JewotCSAgZnJlZSAody0+aSk7Ci0JICB3LT5pID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB3LT5pLT5tYXBwZWQgPSAwOwotICAgICAgdy0+aS0+cmVmY291bnQgPSAxOwotICAgICAgdy0+c2l6ZSA9IHctPmktPnNpemUgPSBjb3VudDsKLSAgICAgIHctPmRhdGEgPSB3LT5pLT5kYXRhOwotICAgICAgcmV0dXJuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgdy0+ZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgfQotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgY291bnQsIHcsIHRydWUpCi0JICA9PSBmYWxzZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIGFib3J0ICgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZ2VuZXJpYyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIGltcGxlbWVudGF0aW9ucyB3aGVyZSBjcmVhdGluZwotICAgTkVXIHNlY3Rpb25zIGlzIGRpc2FsbG93ZWQuICBJdCBpcyB1c2VmdWwgaW4gcGF0Y2hpbmcgZXhpc3Rpbmcgc2VjdGlvbnMKLSAgIGluIHJlYWQtd3JpdGUgZmlsZXMsIHRob3VnaC4gIFNlZSBvdGhlciBzZXRfc2VjdGlvbl9jb250ZW50cyBmdW5jdGlvbnMKLSAgIHRvIHNlZSB3aHkgaXQgZG9lc24ndCB3b3JrIGZvciBuZXcgc2VjdGlvbnMuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbG9nMgotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfbG9nMihiZmRfdm1hIHgpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9nIGJhc2UgMiBvZiB0aGUgdmFsdWUgc3VwcGxpZWQsIHJvdW5kZWQgdXAuICBFLmcuLCBhbgotCUB2YXJ7eH0gb2YgMTAyNSByZXR1cm5zIDExLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfbG9nMiAoeCkKLSAgICAgYmZkX3ZtYSB4OwotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoKHggPSAoeCA+PiAxKSkgIT0gMCkKLSAgICArK3Jlc3VsdDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbGVhbgotYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyIGxvY2Fsc19wcmVmaXggPSAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXycpID8gJ0wnIDogJy4nOwotCi0gIHJldHVybiAobmFtZVswXSA9PSBsb2NhbHNfcHJlZml4KTsKLX0KLQotLyogIENhbiBiZSB1c2VkIGZyb20gLyBmb3IgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gY2hlY2sgdGhhdAotICAgIGVuZGlhbm5lc3MgbWF0Y2hlcyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZmlsZS4gIFJldHVybnMKLSAgICB0cnVlIGZvciBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZW1pdHMgYW4gZXJyb3IuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5oIGIvYmZkL2xpYmJmZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZiMGU4Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMTIgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCi0gICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQotICAgYWRkcmVzcyBzcGFjZS4gICovCi0jZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKLSAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAotICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCi0gICA6IH4gKGJmZF92bWEpIDApCi0KLS8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKLSAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgotCi0vKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5Ci0gICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCi0jZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQotCi0vKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKLSAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGJmZF9pbl9tZW1vcnkKLXsKLSAgLyogU2l6ZSBvZiBidWZmZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci19OwotCi0vKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQotICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLwotCi1zdHJ1Y3QgYXJ0ZGF0YSB7Ci0gIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLwotICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOwotICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLwotICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KLSAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KLSAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCi0gIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCi0gIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KLQkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjawotCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCi0JCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKLQkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgotCQkJCSAgIGFyY2hpdmUuICAqLwotICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCi0JCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCi0gIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLX07Ci0KLSNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQotCi0vKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLwotc3RydWN0IGFyZWx0ZGF0YSB7Ci0gIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCi0gIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCi19OwotCi0jZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQotCi1leHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1leHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1iZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7Ci1iZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOwotYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Ci1ib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi1ib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOwotYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7Ci1iZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOwotZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci1iZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci11bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci12b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci0KLWJmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOwotY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci0KLWJvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWJmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCi0JCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7Ci0KLWludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCi0gIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KLQotZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKLSAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAotICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKLQkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90Ci0gICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAotICAgYmZkX2ZhbHNlKQotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChiZmRfYnl0ZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKLQkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0gICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAotICAgbGFiZWwuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCi1leHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKLQotLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBIHJvdXRpbmUgdG8gY3JlYXRlIGVudHJpZXMgZm9yIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksCi0JICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGNyZWF0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRhcmdldHMgZm9yCi0gICB3aGljaCB0aGUgbGlua2VyIG11c3QgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUsCi0gICBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhcmNoaXZlIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGJvb2xlYW4gKCpjaGVja2ZuKSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKTsKLQotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgcHJvdG90eXBlIGVycm9ycy4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IF9iZmRfbGlua19oYXNoX2VudHJ5OwotCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gYWRkIGEgc2luZ2xlIHN5bWJvbC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqbmFtZSwgZmxhZ3dvcmQsCi0JICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuIGNvcHksCi0JICAgYm9vbGVhbiBjb25zdHJ1Y3Rvciwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotLyogR2VuZXJpYyBsaW5rIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLS8qIEdlbmVyaWMgcmVsb2NfbGlua19vcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2RlZmF1bHRfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgaW4gYSBsaW5rIG9yZGVyIGxpc3QuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIEZpbmFsIGxpbmsgcmVsb2NhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSBhZGRyZXNzLCBiZmRfdm1hIHZhbHVlLCBiZmRfdm1hIGFkZGVuZCkpOwotCi0vKiBSZWxvY2F0ZSBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYnkgYSBob3d0byBhbmQgYSB2YWx1ZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi0vKiBMaW5rIHN0YWJzIGluIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwYXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBhc2VjdGlvbiAqLCBQVFIgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF9ieXRlICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzdHJpbmcgdGFibGUgd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgYW4gb2Zmc2V0IHdpdGhpbiBhIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluCi0gICBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBiZmRfdm1hIF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfdm1hKSk7Ci0KLS8qIENyZWF0ZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIENyZWF0ZSBhbiBYQ09GRiAuZGVidWcgc2VjdGlvbiBzdHlsZSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGcmVlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfc3RyaW5ndGFiX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9zaXplIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfYWRkCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGhhc2gsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0cmluZ3RhYl9lbWl0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQ2hlY2sgdGhhdCBlbmRpYW5uZXNzIG9mIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBtYXRjaC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQwKLS8qIE1hY3JvcyB0byB0ZWxsIGlmIGJmZHMgYXJlIHJlYWQgb3Igd3JpdGUgZW5hYmxlZC4KLQotICAgTm90ZSB0aGF0IGJmZHMgb3BlbiBmb3IgcmVhZCBtYXkgYmUgc2NyaWJibGVkIGludG8gaWYgdGhlIGZkIHBhc3NlZAotICAgdG8gYmZkX2Zkb3BlbnIgaXMgYWN0dWFsbHkgb3BlbiBib3RoIGZvciByZWFkIGFuZCB3cml0ZQotICAgc2ltdWx0YW5lb3VzbHkuICBIb3dldmVyIGFuIG91dHB1dCBiZmQgd2lsbCBuZXZlciBiZSBvcGVuIGZvcgotICAgcmVhZC4gIFRoZXJlZm9yZSBzb21ldGltZXMgeW91IHdhbnQgdG8gY2hlY2sgYmZkX3JlYWRfcCBvcgotICAgIWJmZF9yZWFkX3AsIGFuZCBvbmx5IHNvbWV0aW1lcyBiZmRfd3JpdGVfcC4KLSovCi0KLSNkZWZpbmUJYmZkX3JlYWRfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gcmVhZF9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0jZGVmaW5lCWJmZF93cml0ZV9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0KLXZvaWQJYmZkX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyKixpbnQpKTsKLQotI2RlZmluZSBCRkRfQVNTRVJUKHgpIFwKLXsgaWYgKCEoeCkpIGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLSNkZWZpbmUgQkZEX0ZBSUwoKSBcCi17IGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLWV4dGVybiB2b2lkIF9iZmRfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpCi0gICAgIEFUVFJJQlVURV9OT1JFVFVSTjsKLQotLyogaWYgZ2NjID49IDIuNiwgd2UgY2FuIGdpdmUgYSBmdW5jdGlvbiBuYW1lLCB0b28gKi8KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA2KQotI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIgKikgTlVMTCkKLSNlbmRpZgotCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKSBfYmZkX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCi0KLUZJTEUgKgliZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotLyogTGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0IHZlY3RvcnMsIGFuZCB0aGUgZGVmYXVsdCB2ZWN0b3IgKGlmCi0gICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gaXMgTlVMTCwgdGhlcmUgaXMgbm8gZGVmYXVsdCkuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdOwotCi0vKiBGdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSBFQ09GRiBhbmQgTUlQUyBFTEYgYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9maW5kX2xpbmU7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9sb2NhdGVfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosCi0JICAgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLQotLyogRnVuY3Rpb24gc2hhcmVkIGJ5IHRoZSBDT0ZGIGFuZCBFTEYgU0ggYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBib29sZWFuICgqKSAoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSksCi0JICAgUFRSLCBiZmRfdm1hICoqLCBiZmRfdm1hICosIGJmZF92bWEsIGJmZF92bWEsIGJvb2xlYW4gKikpOwotCi0vKiBBbmQgbW9yZSBmb2xsb3dzICovCi0KLXZvaWQgCi1iZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCBQQVJBTVMgKChiZmQgKmFiZmQsICBpbnQgaSkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfbG9nMiBQQVJBTVMgKChiZmRfdm1hIHgpKTsKLQotI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLWJvb2xlYW4gCi1iZmRfY2FjaGVfaW5pdCAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2FjaGVfY2xvc2UgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1GSUxFKiAKLWJmZF9vcGVuX2ZpbGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpZmRlZiBfQkZEX01BS0VfVEFCTEVfYmZkX3JlbG9jX2NvZGVfcmVhbAotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lc1tdID0geyAiQEB1bmluaXRpYWxpemVkQEAiLAotCi0gICJCRkRfUkVMT0NfNjQiLAotICAiQkZEX1JFTE9DXzMyIiwKLSAgIkJGRF9SRUxPQ18yNiIsCi0gICJCRkRfUkVMT0NfMjQiLAotICAiQkZEX1JFTE9DXzE2IiwKLSAgIkJGRF9SRUxPQ18xNCIsCi0gICJCRkRfUkVMT0NfOCIsCi0gICJCRkRfUkVMT0NfNjRfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18yNF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DXzEyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19MTzE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYiLAotICAiQkZEX1JFTE9DXzhfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18zMl9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ18xNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0xPMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfOF9QTFRPRkYiLAotICAiQkZEX1JFTE9DXzY4S19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfNjhLX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ182OEtfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DXzMyX0JBU0VSRUwiLAotICAiQkZEX1JFTE9DXzE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfOF9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19SVkEiLAotICAiQkZEX1JFTE9DXzhfRkZubiIsCi0gICJCRkRfUkVMT0NfMzJfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DXzE2X1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ18yM19QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfSEkyMiIsCi0gICJCRkRfUkVMT0NfTE8xMCIsCi0gICJCRkRfUkVMT0NfR1BSRUwxNiIsCi0gICJCRkRfUkVMT0NfR1BSRUwzMiIsCi0gICJCRkRfUkVMT0NfSTk2MF9DQUxMSiIsCi0gICJCRkRfUkVMT0NfTk9ORSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV1BMVDMwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19DT1BZIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19VQTMyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0JBU0UyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDXzExIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19PTE8xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUExUNjQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hJWDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MT1gxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSDQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19NNDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0w0NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFVjMyIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJVFVTRSIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9ISU5UIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiIsCi0gICJCRkRfUkVMT0NfTUlQU19KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9HUFJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TIiwKLSAgIkJGRF9SRUxPQ19MTzE2IiwKLSAgIkJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MiLAotICAiQkZEX1JFTE9DX1BDUkVMX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1QxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19TVUIiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX1BBR0UiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX09GU1QiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0RJU1AiLAotCi0gICJCRkRfUkVMT0NfMzg2X0dPVDMyIiwKLSAgIkJGRF9SRUxPQ18zODZfUExUMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9DT1BZIiwKLSAgIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfSEkxNiIsCi0gICJCRkRfUkVMT0NfUEpfQ09ERV9MTzE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyIiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyIiwKLSAgIkJGRF9SRUxPQ19QUENfQjI2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkEyNiIsCi0gICJCRkRfUkVMT0NfUFBDX1RPQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0NPUFkiLAotICAiQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfUFBDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19QUENfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBIiwKLSAgIkJGRF9SRUxPQ19JMzcwX0QxMiIsCi0gICJCRkRfUkVMT0NfQ1RPUiIsCi0gICJCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCIsCi0gICJCRkRfUkVMT0NfQVJNX1BDUkVMX0JMWCIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQkxYIiwKLSAgIkJGRF9SRUxPQ19BUk1fSU1NRURJQVRFIiwKLSAgIkJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUiLAotICAiQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fU1dJIiwKLSAgIkJGRF9SRUxPQ19BUk1fTVVMVEkiLAotICAiQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fQURSX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0xEUl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BUk1fSU5fUE9PTCIsCi0gICJCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04IiwKLSAgIkJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfQUREIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX0FSTV9HT1QxMiIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVDMyIiwKLSAgIkJGRF9SRUxPQ19BUk1fSlVNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19BUk1fQ09QWSIsCi0gICJCRkRfUkVMT0NfQVJNX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19BUk1fUExUMzIiLAotICAiQkZEX1JFTE9DX0FSTV9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NNEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOCIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQiLAotICAiQkZEX1JFTE9DX1NIX1NXSVRDSDE2IiwKLSAgIkJGRF9SRUxPQ19TSF9TV0lUQ0gzMiIsCi0gICJCRkRfUkVMT0NfU0hfVVNFUyIsCi0gICJCRkRfUkVMT0NfU0hfQ09VTlQiLAotICAiQkZEX1JFTE9DX1NIX0FMSUdOIiwKLSAgIkJGRF9SRUxPQ19TSF9DT0RFIiwKLSAgIkJGRF9SRUxPQ19TSF9EQVRBIiwKLSAgIkJGRF9SRUxPQ19TSF9MQUJFTCIsCi0gICJCRkRfUkVMT0NfU0hfTE9PUF9TVEFSVCIsCi0gICJCRkRfUkVMT0NfU0hfTE9PUF9FTkQiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMyIsCi0gICJCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfQVJDX0IyNiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wiLAotICAiQkZEX1JFTE9DX0QxMFZfMTgiLAotICAiQkZEX1JFTE9DX0QxMFZfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfNiIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNSIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMzIiLAotICAiQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjQiLAotICAiQkZEX1JFTE9DX00zMlJfMTBfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjZfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8iLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8iLAotICAiQkZEX1JFTE9DX00zMlJfTE8xNiIsCi0gICJCRkRfUkVMT0NfTTMyUl9TREExNiIsCi0gICJCRkRfUkVMT0NfVjg1MF85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwXzIyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAotCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVElDMzBfTERQIiwKLSAgIkJGRF9SRUxPQ19USUM1NFhfUEFSVExTNyIsCi0gICJCRkRfUkVMT0NfVElDNTRYX1BBUlRNUzkiLAotICAiQkZEX1JFTE9DX1RJQzU0WF8yMyIsCi0gICJCRkRfUkVMT0NfVElDNTRYXzE2X09GXzIzIiwKLSAgIkJGRF9SRUxPQ19USUM1NFhfTVM3X09GXzIzIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzQ4IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzIwIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzZfSU5fNCIsCi0gICJCRkRfUkVMT0NfRlIzMF84X0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzEwX0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1JWQSIsCi0gICJCRkRfUkVMT0NfQVZSXzdfUENSRUwiLAotICAiQkZEX1JFTE9DX0FWUl8xM19QQ1JFTCIsCi0gICJCRkRfUkVMT0NfQVZSXzE2X1BNIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESSIsCi0gICJCRkRfUkVMT0NfQVZSX0hJOF9MREkiLAotICAiQkZEX1JFTE9DX0FWUl9ISDhfTERJIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9ORUciLAotICAiQkZEX1JFTE9DX0FWUl9ISThfTERJX05FRyIsCi0gICJCRkRfUkVMT0NfQVZSX0hIOF9MRElfTkVHIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9QTSIsCi0gICJCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0iLAotICAiQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9QTV9ORUciLAotICAiQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNX05FRyIsCi0gICJCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE1fTkVHIiwKLSAgIkJGRF9SRUxPQ19BVlJfQ0FMTCIsCi0gICJCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSIsCi0gICJCRkRfUkVMT0NfSUE2NF9JTU0xNCIsCi0gICJCRkRfUkVMT0NfSUE2NF9JTU0yMiIsCi0gICJCRkRfUkVMT0NfSUE2NF9JTU02NCIsCi0gICJCRkRfUkVMT0NfSUE2NF9ESVIzMk1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9ESVIzMkxTQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9ESVI2NE1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9ESVI2NExTQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9HUFJFTDIyIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0dQUkVMNjRJIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0dQUkVMMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfR1BSRUwzMkxTQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9HUFJFTDY0TVNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0dQUkVMNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRPRkYyMiIsCi0gICJCRkRfUkVMT0NfSUE2NF9MVE9GRjY0SSIsCi0gICJCRkRfUkVMT0NfSUE2NF9QTFRPRkYyMiIsCi0gICJCRkRfUkVMT0NfSUE2NF9QTFRPRkY2NEkiLAotICAiQkZEX1JFTE9DX0lBNjRfUExUT0ZGNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUExUT0ZGNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfRlBUUjY0SSIsCi0gICJCRkRfUkVMT0NfSUE2NF9GUFRSMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfRlBUUjMyTFNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0ZQVFI2NE1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9GUFRSNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUwyMUIiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUwyMUJJIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1BDUkVMMjFNIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1BDUkVMMjFGIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1BDUkVMMjIiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUw2MEIiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUw2NEkiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUwzMk1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9QQ1JFTDMyTFNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1BDUkVMNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUENSRUw2NExTQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSMjIiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRPRkZfRlBUUjY0SSIsCi0gICJCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRPRkZfRlBUUjY0TFNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1NFR0JBU0UiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VHUkVMMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VHUkVMMzJMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VHUkVMNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VHUkVMNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VDUkVMMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VDUkVMMzJMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VDUkVMNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfU0VDUkVMNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUkVMMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUkVMMzJMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUkVMNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfUkVMNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRWMzJNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRWMzJMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRWNjRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRWNjRMU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfSVBMVE1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9JUExUTFNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0VQTFRNU0IiLAotICAiQkZEX1JFTE9DX0lBNjRfRVBMVExTQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9DT1BZIiwKLSAgIkJGRF9SRUxPQ19JQTY0X1RQUkVMMjIiLAotICAiQkZEX1JFTE9DX0lBNjRfVFBSRUw2NE1TQiIsCi0gICJCRkRfUkVMT0NfSUE2NF9UUFJFTDY0TFNCIiwKLSAgIkJGRF9SRUxPQ19JQTY0X0xUT0ZGX1RQMjIiLAotICAiQkZEX1JFTE9DX0lBNjRfTFRPRkYyMlgiLAotICAiQkZEX1JFTE9DX0lBNjRfTERYTU9WIiwKLSAiQEBvdmVyZmxvdzogQkZEX1JFTE9DX1VOVVNFREBAIiwKLX07Ci0jZW5kaWYKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgYm9vbGVhbiAqKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJmZF9ieXRlICoKLQotYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzICBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0gICAgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLWJvb2xlYW4gCi1iZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLSBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmEsCi0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiKSk7Ci0KLWJvb2xlYW4gCi1iZmRfZGVmYXVsdF9zY2FuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uICBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmNvZmYtaW4uaCBiL2JmZC9saWJjb2ZmLWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWEwMjYuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmNvZmYtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKiBCRkQgQ09GRiBvYmplY3QgZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGxvbmcgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVGhlIHRpbWVzdGFtcCBmcm9tIHRoZSBDT0ZGIGZpbGUgaGVhZGVyLiAgKi8KLSAgbG9uZyB0aW1lc3RhbXA7Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci0gIC8qIFRoZSBQRSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgbG9uZyBwZV9mbGFnczsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgcGVpX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgcGVpX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogU3ltYm9sIHR5cGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotCi0gIC8qIFN5bWJvbCBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgY2xhc3M7Ci0KLSAgLyogTnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzLiAgKi8KLSAgY2hhciBudW1hdXg7Ci0KLSAgLyogQkZEIHRvIHRha2UgYXV4aWxpYXJ5IGVudHJpZXMgZnJvbS4gICovCi0gIGJmZCAqYXV4YmZkOwotCi0gIC8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgYXV4aWxpYXJ5IGVudHJpZXMsIGlmIGFueS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OwotCi0gIC8qIEZsYWcgd29yZDsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvZmZfbGlua19oYXNoX2ZsYWdzOwotICAvKiBTeW1ib2wgaXMgYSBQRSBzZWN0aW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MICgwMSkKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi0vKiBNb3N0IENPRkYgdmFyaWFudHMgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBhbGlnbm1lbnQgb2YgYQotICAgc2VjdGlvbi4gIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gc2V0IGEgc3BlY2lmaWMgYWxpZ25tZW50IGJhc2VkIG9uCi0gICB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5Ci17Ci0gIC8qIFRoZSBzZWN0aW9uIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoaXMgaXMgZWl0aGVyICh1bnNpZ25lZCBpbnQpIC0xLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlY3Rpb24KLSAgICAgbmFtZSBtdXN0IG1hdGNoIGV4YWN0bHksIG9yIGl0IGlzIHRoZSBudW1iZXIgb2YgbGV0dGVycyB3aGljaAotICAgICBtdXN0IG1hdGNoIGF0IHRoZSBzdGFydCBvZiB0aGUgbmFtZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wYXJpc29uX2xlbmd0aDsKLQotICAvKiBUaGVzZSBtYWNyb3MgbWF5IGJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcyBpbiBhCi0gICAgIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4gICovCi0jZGVmaW5lIENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIKG5hbWUpIChuYW1lKSwgKCh1bnNpZ25lZCBpbnQpIC0xKQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIKG5hbWUpIChuYW1lKSwgKHNpemVvZiAobmFtZSkgLSAxKQotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIGF0IGxlYXN0IHRoYXQgbXVjaCAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcyBmaWVsZAotICAgICBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWluOwotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGlzIChhcyBhIHBvd2VyIG9mIHR3bykuICBJZiB0aGlzCi0gICAgIGZpZWxkIGlzIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBpdCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2FsaWdubWVudF9tYXg7Ci0KLSNkZWZpbmUgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkgKCh1bnNpZ25lZCBpbnQpIC0xKQotCi0gIC8qIFRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgdGhpcyBzZWN0aW9uIChhcyBhIHBvd2VyIG9mIHR3bykuICAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLmggYi9iZmQvbGliY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJmZmRiLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBsb25nIHJhd19zeW1lbnRfY291bnQ7Ci0KLSAgLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgb25jZSB3cml0aW5nIGhhcyBiZWd1biAqLwotICBsb25nIGludCByZWxvY2Jhc2U7Ci0KLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnIHVuZm9ydHVuYXRlbHkgdmFyeQotICAgICBmcm9tIGNvZmYgaW1wbGVtZW50YXRpb24gdG8gaW1wbGVtZW50YXRpb24uLi4gICovCi0gIHVuc2lnbmVkIGxvY2FsX25fYnRtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX2J0c2hmdDsKLSAgdW5zaWduZWQgbG9jYWxfbl90bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl90c2hpZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX3N5bWVzejsKLSAgdW5zaWduZWQgbG9jYWxfYXV4ZXN6OwotICB1bnNpZ25lZCBsb2NhbF9saW5lc3o7Ci0KLSAgLyogVGhlIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2xzLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scy4gICovCi0gIFBUUiBleHRlcm5hbF9zeW1zOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBleHRlcm5hbF9zeW1zIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3ltczsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZS4gICovCi0gIGNoYXIgKnN0cmluZ3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHN0cmluZ3MgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zdHJpbmdzOwotCi0gIC8qIGlzIHRoaXMgYSBQRSBmb3JtYXQgY29mZiBmaWxlICovCi0gIGludCBwZTsKLSAgLyogVXNlZCBieSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogdXNlZCBieSB0aGUgcGUgbGlua2VyIGZvciBQb3dlclBDICovCi0gIGludCAqbG9jYWxfdG9jX3N5bV9tYXA7Ci0KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLQotICAvKiBVc2VkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBQVFIgbGluZV9pbmZvOwotCi0gIC8qIFRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgQ09GRiBmaWxlIGhlYWRlci4gICovCi0gIGxvbmcgdGltZXN0YW1wOwotCi0gIC8qIENvcHkgb2Ygc29tZSBvZiB0aGUgZl9mbGFncyBiaXRzIGluIHRoZSBDT0ZGIGZpbGVoZHIgc3RydWN0dXJlLAotICAgICB1c2VkIGJ5IEFSTSBjb2RlLiAgKi8KLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLX0gY29mZl9kYXRhX3R5cGU7Ci0KLS8qIFRkYXRhIGZvciBwZSBpbWFnZSBmaWxlcy4gKi8KLXR5cGVkZWYgc3RydWN0IHBlX3RkYXRhCi17Ci0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlX29wdGhkcjsKLSAgaW50IGRsbDsKLSAgaW50IGhhc19yZWxvY19zZWN0aW9uOwotICBib29sZWFuICgqaW5fcmVsb2NfcCkgUEFSQU1TKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0gIGZsYWd3b3JkIHJlYWxfZmxhZ3M7Ci19IHBlX2RhdGFfdHlwZTsKLQotI2RlZmluZSBwZV9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEucGVfb2JqX2RhdGEpCi0KLS8qIFRkYXRhIGZvciBYQ09GRiBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl90ZGF0YQotewotICAvKiBCYXNpYyBDT0ZGIGluZm9ybWF0aW9uLiAgKi8KLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLQotICAvKiBUcnVlIGlmIGEgbGFyZ2UgYS5vdXQgaGVhZGVyIHNob3VsZCBiZSBnZW5lcmF0ZWQuICAqLwotICBib29sZWFuIGZ1bGxfYW91dGhkcjsKLQotICAvKiBUT0MgdmFsdWUuICAqLwotICBiZmRfdm1hIHRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgVE9DLiAgKi8KLSAgaW50IHNudG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBlbnRyeSBwb2ludC4gICovCi0gIGludCBzbmVudHJ5OwotCi0gIC8qIC50ZXh0IGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCB0ZXh0X2FsaWduX3Bvd2VyOwotCi0gIC8qIC5kYXRhIGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCBkYXRhX2FsaWduX3Bvd2VyOwotCi0gIC8qIG1vZHR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBtb2R0eXBlOwotCi0gIC8qIGNwdXR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBjcHV0eXBlOwotCi0gIC8qIG1heGRhdGEgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heGRhdGE7Ci0KLSAgLyogbWF4c3RhY2sgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heHN0YWNrOwotCi0gIC8qIFVzZWQgYnkgdGhlIFhDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGljZXM7Ci0gIHVuc2lnbmVkIGludCBpbXBvcnRfZmlsZV9pZDsKLX07Ci0KLSNkZWZpbmUgeGNvZmZfZGF0YShhYmZkKSAoKGFiZmQpLT50ZGF0YS54Y29mZl9vYmpfZGF0YSkKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sLiAgKi8KLSNkZWZpbmUgY29mZnN5bWJvbChhc3ltYm9sKSAoKGNvZmZfc3ltYm9sX3R5cGUgKikoJigoYXN5bWJvbCktPnRoZV9iZmQpKSkKLQotLyogVGhlIHVzZWRfYnlfYmZkIGZpZWxkIG9mIGEgc2VjdGlvbiBtYXkgYmUgc2V0IHRvIGEgcG9pbnRlciB0byB0aGlzCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSByZWxvY3MsIHN3YXBwZWQgaW50byBDT0ZGIGludGVybmFsIGZvcm0uICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHJlbG9jcyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3JlbG9jczsKLSAgLyogVGhlIHNlY3Rpb24gY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBjb250ZW50cyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX2NvbnRlbnRzOwotICAvKiBJbmZvcm1hdGlvbiBjYWNoZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY29uc3QgY2hhciAqZnVuY3Rpb247Ci0gIGludCBsaW5lX2Jhc2U7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBdmFpbGFibGUgZm9yIGluZGl2aWR1YWwgYmFja2VuZHMuICAqLwotICBQVFIgdGRhdGE7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIChzZWMpLT51c2VkX2J5X2JmZCkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBVc2VkIGZvciBYQ09GRiBjc2VjdHMgY3JlYXRlZCBieSB0aGUgbGlua2VyOyBwb2ludHMgdG8gdGhlIHJlYWwKLSAgICAgWENPRkYgc2VjdGlvbiB3aGljaCBjb250YWlucyB0aGlzIGNzZWN0LiAgKi8KLSAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLSAgLyogVGhlIGxpbmVub19jb3VudCBmaWVsZCBmb3IgdGhlIGVuY2xvc2luZyBzZWN0aW9uLCBiZWNhdXNlIHdlIGFyZQotICAgICBnb2luZyB0byBjbG9iYmVyIGl0IHRoZXJlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKLSAgLyogVGhlIGZpcnN0IGFuZCBvbmUgcGFzdCB0aGUgbGFzdCBzeW1ib2wgaW5kaWNlcyBmb3Igc3ltYm9scyB1c2VkCi0gICAgIGJ5IHRoaXMgY3NlY3QuICAqLwotICB1bnNpZ25lZCBsb25nIGZpcnN0X3N5bW5keDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3N5bW5keDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIHRoZSB4Y29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHhjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gUEUgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotICAvKiBUaGUgUEUgc2VjdGlvbiBmbGFncy4gICovCi0gIGxvbmcgcGVfZmxhZ3M7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLQotICAvKiBGbGFnIHdvcmQ7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb2ZmX2xpbmtfaGFzaF9mbGFnczsKLSAgLyogU3ltYm9sIGlzIGEgUEUgc2VjdGlvbiBzeW1ib2wuICAqLwotI2RlZmluZSBDT0ZGX0xJTktfSEFTSF9QRV9TRUNUSU9OX1NZTUJPTCAoMDEpCi19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotLyogTW9zdCBDT0ZGIHZhcmlhbnRzIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgYWxpZ25tZW50IG9mIGEKLSAgIHNlY3Rpb24uICBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHNldCBhIHNwZWNpZmljIGFsaWdubWVudCBiYXNlZCBvbgotICAgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeQotewotICAvKiBUaGUgc2VjdGlvbiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGlzIGlzIGVpdGhlciAodW5zaWduZWQgaW50KSAtMSwgaW5kaWNhdGluZyB0aGF0IHRoZSBzZWN0aW9uCi0gICAgIG5hbWUgbXVzdCBtYXRjaCBleGFjdGx5LCBvciBpdCBpcyB0aGUgbnVtYmVyIG9mIGxldHRlcnMgd2hpY2gKLSAgICAgbXVzdCBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5hbWUuICAqLwotICB1bnNpZ25lZCBpbnQgY29tcGFyaXNvbl9sZW5ndGg7Ci0KLSAgLyogVGhlc2UgbWFjcm9zIG1heSBiZSB1c2VkIHRvIGZpbGwgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMgaW4gYQotICAgICBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uICAqLwotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSChuYW1lKSAobmFtZSksICgodW5zaWduZWQgaW50KSAtMSkKLSNkZWZpbmUgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSChuYW1lKSAobmFtZSksIChzaXplb2YgKG5hbWUpIC0gMSkKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBhdCBsZWFzdCB0aGF0IG11Y2ggKGFzIGEgcG93ZXIgb2YgdHdvKS4gIElmIHRoaXMgZmllbGQKLSAgICAgaXMgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIGl0IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50X21pbjsKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBubyBncmVhdGVyIHRoYW4gdGhpcyAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcwotICAgICBmaWVsZCBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWF4OwotCi0jZGVmaW5lIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZICgodW5zaWduZWQgaW50KSAtMSkKLQotICAvKiBUaGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIHRoaXMgc2VjdGlvbiAoYXMgYSBwb3dlciBvZiB0d28pLiAgKi8KLSAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IGludGVybmFsX3JlbG9jICpfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJvb2xlYW4sIGJmZF9ieXRlICosIGJvb2xlYW4sCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLQotI2RlZmluZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogRnVuY3Rpb25zIGluIHhjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmLXBwYy5jLiAgRklYTUU6IFRoZXNlIGFyZSBjYWxsZWQgYmUgcGUuZW0gaW4gdGhlCi0gICBsaW5rZXIsIGFuZCBzbyBzaG91bGQgc3RhcnQgd2l0aCBiZmQgYW5kIGJlIGRlY2xhcmVkIGluIGJmZC5oLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIHRha2VuIGZyb20gdGhlIHNvdXJjZSAuLiAqLwotCi10eXBlZGVmIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QKLXsKLQotICAgICAgICAvKiBSZW1lbWJlcnMgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGZpbGUgZm9yCi0gICAgICAgICAgdGhpcyBzeW1ib2wuIEdlbmVyYXRlZCBieSBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMuICovCi11bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4gIFVzZWQgZm9yCi0gICAgICAgICAgWENPRkYgQ19CU1RBVCBzeW1ib2xzLiAgU2V0IGJ5IGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfdmFsdWUgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgdGFnIGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwotdW5zaWduZWQgaW50IGZpeF90YWcgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgZW5kaWR4IGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwotdW5zaWduZWQgaW50IGZpeF9lbmQgOiAxOwotCi0gICAgICAgIC8qIFNob3VsZCB0aGUgeF9jc2VjdC54X3NjbmxlbiBmaWVsZCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfc2NubGVuIDogMTsKLQotICAgICAgICAvKiBGaXggdXAgYW4gWENPRkYgQ19CSU5DTC9DX0VJTkNMIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgU2V0IGJ5Ci0gICAgICAgICAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqLwotdW5zaWduZWQgaW50IGZpeF9saW5lIDogMTsKLQotICAgICAgICAvKiBUaGUgY29udGFpbmVyIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSBhcyByZWFkIGFuZCB0cmFuc2xhdGVkCi0gICAgICAgICAgIGZyb20gdGhlIGZpbGUuICovCi0KLXVuaW9uIHsKLSAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSB9IHU7Ci19IGNvbWJpbmVkX2VudHJ5X3R5cGU7Ci0KLQotIC8qIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpczogKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gICAgLyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKi8KLWFzeW1ib2wgc3ltYm9sOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICovCi1jb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0KLSAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGxpbmVudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICovCi1zdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsaW5lbm87Ci0KLSAgICAvKiBIYXZlIHRoZSBsaW5lIG51bWJlcnMgYmVlbiByZWxvY2F0ZWQgeWV0ID8gKi8KLWJvb2xlYW4gZG9uZV9saW5lbm87Ci19IGNvZmZfc3ltYm9sX3R5cGU7Ci0gLyogQ09GRiBzeW1ib2wgY2xhc3NpZmljYXRpb25zLiAgKi8KLQotZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbgotewotICAgLyogR2xvYmFsIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX0dMT0JBTCwKLSAgIC8qIENvbW1vbiBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9DT01NT04sCi0gICAvKiBVbmRlZmluZWQgc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfVU5ERUZJTkVELAotICAgLyogTG9jYWwgc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfTE9DQUwsCi0gICAvKiBQRSBzZWN0aW9uIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX1BFX1NFQ1RJT04KLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICAgICAgICAgIGNsYXNzLAotICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCi0gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCAsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgICAgICAgICBleHQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgaW50ICAgICB0eXBlLAotICAgICAgIGludCAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICBpbmRhdXgsCi0gICAgICAgaW50ICAgICBudW1hdXgsCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotICAgICAgYmZkICAgICAgKmFiZmQsCi0gICAgICBQVFIgICAgICBpbiwKLSAgICAgIFBUUiAgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBzcmMsCi0gICAgICAgUFRSICAgICBkc3QpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBvdXQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBvdXQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50IF9iZmRfZmlsaHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfc3ltZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9saW5lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfZmlsbm1sZW47Ci0gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7Ci0gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzOwotIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKLSBib29sZWFuIF9iZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzOwotIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVidWdfc3RyaW5nX3ByZWZpeF9sZW5ndGg7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotIFBUUiAoKl9iZmRfY29mZl9ta29iamVjdF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkciwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2FvdXRoZHIpKTsKLSBmbGFnd29yZCAoKl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkciwKLSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0gdm9pZCAoKl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIGFzZWN0aW9uICpzZWMsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4LAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfcHJpbnRfYXV4KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgRklMRSAqZmlsZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCkpOwotIHZvaWQgKCpfYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICAgICBhcmVsZW50ICpyZWxvYywKLSAgICAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIsCi0gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0gaW50ICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBhcmVsZW50ICpyLAotICAgICAgIHVuc2lnbmVkIGludCBzaHJpbmssCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gKCpfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCi0gICAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0gICAgICAgYmZkICppbnB1dF9iZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCi0gICAgICAgYXNlY3Rpb24gKipzZWN0aW9ucykpOwotIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKnNlYywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKLSAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltLAotICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmliZmQsCi0gICAgICAgYXNlY3Rpb24gKnNlYywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAotICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAotICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgIGJmZF92bWEgdmFsdWUsCi0gICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotICAgICAgIGJvb2xlYW4gY29weSwKLSAgICAgICBib29sZWFuIGNvbGxlY3QsIAotICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKLQotIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKiBhYmZkLAotICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKiBhYmZkLAotICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotCi19IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKLQotI2RlZmluZSBjb2ZmX2JhY2tlbmRfaW5mbyhhYmZkKSAoKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X2luKSAoYSxlLHQsYyxpbmQsbnVtLGkpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9zeW1faW4pIChhLGUsaSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoIGEpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIChhLGUsaSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIChhLGksdCxjLGluZCxudW0sbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2FvdXRzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2FvdXRzeikKLSNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQotI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2F1eGVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2F1eGVzeikKLSNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKLSNkZWZpbmUgYmZkX2NvZmZfZmlsbm1sZW4oYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxubWxlbikKLSNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKQotI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLSAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4oYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4oYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX2luKGFiZmQsIGksIG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKGFiZmQsIGZpbGVoZHIpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2soYWJmZCwgZmlsZWhkcilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0jZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaylcCi0gICAgICAgICAoYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzKGFiZmQpXAotICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9mb3JjZV9zeW1uYW1lc19pbl9zdHJpbmdzKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2RlYnVnX3N0cmluZ19wcmVmaXhfbGVuZ3RoKGFiZmQpXAotICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWJ1Z19zdHJpbmdfcHJlZml4X2xlbmd0aCkKLQotI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLSAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLSAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbChhYmZkLCBzeW0pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbClcCi0gICAgICAgICAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKLSAgICAgICAgIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChvYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspXAotICAgICAgICAgKG9iZmQsIGluZm8pKQotI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoaWJmZCktPl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQotI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ydHlwZV90b19ob3d0bylcCi0gICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keClcCi0gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbClcCi0gICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIChhLHApKQotCmRpZmYgLS1naXQgYS9iZmQvbGliZWNvZmYuaCBiL2JmZC9saWJlY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYxODA1Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJlY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qIEJGRCBFQ09GRiBvYmplY3QgZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpZm5kZWYgRUNPRkZfSAotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBiYWNrZW5kIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGNvbnN0YW50IGZvciBhIHBhcnRpY3VsYXIgYmFja2VuZC4gIFRoZSBmaXJzdCBlbGVtZW50Ci0gICBpcyB0aGUgQ09GRiBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLCBzbyB0aGF0IEVDT0ZGIHRhcmdldHMgY2FuIHVzZQotICAgdGhlIGdlbmVyaWMgQ09GRiBjb2RlLiAgKi8KLQotI2RlZmluZSBlY29mZl9iYWNrZW5kKGFiZmQpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi1zdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhCi17Ci0gIC8qIENPRkYgYmFja2VuZCBpbmZvcm1hdGlvbi4gIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotICBiZmRfY29mZl9iYWNrZW5kX2RhdGEgY29mZjsKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBJbml0aWFsIHBvcnRpb24gb2YgYXJtYXAgc3RyaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqYXJtYXBfc3RhcnQ7Ci0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgYmZkX3ZtYSByb3VuZDsKLSAgLyogVHJ1ZSBpZiB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgQWxwaGEuICBGYWxzZSBpZiAucmRhdGEgaXMgcGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgTUlQUy4gICovCi0gIGJvb2xlYW4gcmRhdGFfaW5fdGV4dDsKLSAgLyogQml0c2l6ZSBvZiBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0cnVjdG9yX2JpdHNpemU7Ci0gIC8qIFJlbG9jIHRvIHVzZSBmb3IgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmNvbnN0cnVjdG9yX3JlbG9jOwotICAvKiBIb3cgdG8gc3dhcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBkZWJ1Z19zd2FwOwotICAvKiBFeHRlcm5hbCByZWxvYyBzaXplLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIFBUUiwgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLSAgdm9pZCAoKnN3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosIFBUUikpOwotICAvKiBCYWNrZW5kIHJlbG9jIHR3ZWFraW5nLiAgKi8KLSAgdm9pZCAoKmFkanVzdF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCSAgIGFyZWxlbnQgKikpOwotICB2b2lkICgqYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLSAgLyogUmVsb2NhdGUgc2VjdGlvbiBjb250ZW50cyB3aGlsZSBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgYmZkICppbnB1dF9iZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0JCQkJICAgICAgIFBUUiBleHRlcm5hbF9yZWxvY3MpKTsKLSAgLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gZmlsZWhkciBhbmQgYW91dGhkci4gICovCi0gIGJvb2xlYW4gKCphZGp1c3RfaGVhZGVycykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosCi0JCQkJICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci0gIC8qIFJlYWQgYW4gZWxlbWVudCBmcm9tIGFuIGFyY2hpdmUgYXQgYSBnaXZlbiBmaWxlIHBvc2l0aW9uLiAgVGhpcwotICAgICBpcyBuZWVkZWQgYmVjYXVzZSBPU0YvMSAzLjIgdXNlcyBhIHdlaXJkIGFyY2hpdmUgZm9ybWF0LiAgKi8KLSAgYmZkICooKmdldF9lbHRfYXRfZmlsZXBvcykgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24ga2VwdCBmb3IgRUNPRkYgZmlsZXMuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEuZWNvZmZfb2JqX2RhdGEpCi0KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX3RkYXRhCi17Ci0gIC8qIFRoZSByZWxvYyBmaWxlIHBvc2l0aW9uLCBzZXQgYnkKLSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLSAgZmlsZV9wdHIgcmVsb2NfZmlsZXBvczsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIGZpbGUgcG9zaXRpb24sIHNldCBieSBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2suICAqLwotICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLQotICAvKiBUaGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgdGV4dCBzZWdtZW50LiAgT25seSB2YWxpZCBmb3IgYW4KLSAgICAgZXhpc3RpbmcgZmlsZSwgbm90IGZvciBvbmUgd2UgYXJlIGNyZWF0aW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB0ZXh0X3N0YXJ0OwotICB1bnNpZ25lZCBsb25nIHRleHRfZW5kOwotCi0gIC8qIFRoZSBjYWNoZWQgZ3AgdmFsdWUuICBUaGlzIGlzIHVzZWQgd2hlbiByZWxvY2F0aW5nLiAgKi8KLSAgYmZkX3ZtYSBncDsKLQotICAvKiBUaGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gb3B0aW1pemUgdXNpbmcgZ3AuICBUaGlzIGlzCi0gICAgIHR5cGljYWxseSBzZXQgYnkgdGhlIC1HIG9wdGlvbiB0byB0aGUgY29tcGlsZXIsIGFzc2VtYmxlciBvcgotICAgICBsaW5rZXIuICAqLwotICB1bnNpZ25lZCBpbnQgZ3Bfc2l6ZTsKLQotICAvKiBUaGUgcmVnaXN0ZXIgbWFza3MuICBXaGVuIGxpbmtpbmcsIGFsbCB0aGUgbWFza3MgZm91bmQgaW4gdGhlCi0gICAgIGlucHV0IGZpbGVzIGFyZSBjb21iaW5lZCBpbnRvIHRoZSBtYXNrcyBvZiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgIFRoZXNlIGFyZSBub3QgYWxsIHVzZWQgZm9yIGFsbCB0YXJnZXRzLCBidXQgdGhhdCdzIE9LLCBiZWNhdXNlCi0gICAgIHRoZSByZWxldmFudCBvbmVzIGFyZSB0aGUgb25seSBvbmVzIHN3YXBwZWQgaW4gYW5kIG91dC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKLSAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwotICB1bnNpZ25lZCBsb25nIGNwcm1hc2tbNF07Ci0KLSAgLyogVGhlIEVDT0ZGIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnX2luZm87Ci0KLSAgLyogVGhlIHVuc3dhcHBlZCBFQ09GRiBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIFBUUiByYXdfc3ltZW50czsKLQotICAvKiBUaGUgY2Fub25pY2FsIEJGRCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGVjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNhbm9uaWNhbF9zeW1ib2xzOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbCBudW1iZXJzIHRvIGVudHJpZXMgaW4gdGhlIGxpbmtlcgotICAgICBoYXNoIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZy4gICovCi0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIHJlbG9jIHN5bWJvbCBpbmRpY2VzIHRvIHNlY3Rpb25zLCB1c2VkIHdoZW4KLSAgICAgbGlua2luZy4gICovCi0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0KLSAgLyogVHJ1ZSBpZiB0aGlzIEJGRCB3YXMgd3JpdHRlbiBieSB0aGUgYmFja2VuZCBsaW5rZXIuICAqLwotICBib29sZWFuIGxpbmtlcjsKLQotICAvKiBUcnVlIGlmIGEgd2FybmluZyB0aGF0IG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcyBhcmUKLSAgICAgbmVlZGVkIGluIHRoZSBvdXRwdXQgYmluYXJ5IHdhcyBpc3N1ZWQgYWxyZWFkeS4gICovCi0gIGJvb2xlYW4gaXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmc7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUgY291bGQgYmUKLSAgICAgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvIHdhc3RpbmcKLSAgICAgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZCBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIFdoZXRoZXIgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIGluIHRoZSB0ZXh0IHNlZ21lbnQgZm9yIHRoaXMKLSAgICAgcGFydGljdWxhciBFQ09GRiBmaWxlLiAgVGhpcyBpcyBub3QgdmFsaWQgdW50aWwKLSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIGlzIGNhbGxlZC4gICovCi0gIGJvb2xlYW4gcmRhdGFfaW5fdGV4dDsKLQotfSBlY29mZl9kYXRhX3R5cGU7Ci0KLS8qIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX3N5bWJvbF9zdHJ1Y3QKLXsKLSAgLyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKi8KLSAgYXN5bWJvbCBzeW1ib2w7Ci0KLSAgLyogVGhlIGZkciBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBGRFIgKmZkcjsKLQotICAvKiB0cnVlIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgcmF0aGVyIHRoYW4gYW4gZXh0ZXJuYWwgb25lLiAgKi8KLSAgYm9vbGVhbiBsb2NhbDsKLQotICAvKiBBIHBvaW50ZXIgdG8gdGhlIHVuc3dhcHBlZCBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLgotICAgICBUaGlzIGlzIGVpdGhlciBhIHN0cnVjdCBzeW1fZXh0IG9yIGEgc3RydWN0IGV4dF9leHQsIGRlcGVuZGluZyBvbgotICAgICB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsIGZpZWxkIGFib3ZlLiAgKi8KLSAgUFRSIG5hdGl2ZTsKLX0gZWNvZmZfc3ltYm9sX3R5cGU7Ci0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGVjb2Zmc3ltYm9sKGFzeW1ib2wpICgoZWNvZmZfc3ltYm9sX3R5cGUgKikgKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaW5kZXggb2YgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoZW4gd2Ugd3JpdGUgaXQKLSAgIG91dCBzbyB0aGF0IGNhbiBzZXQgdGhlIHN5bWJvbCBpbmRleCBjb3JyZWN0bHkgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgIHRoZSByZWxvY3MuICAqLwotI2RlZmluZSBlY29mZl9nZXRfc3ltX2luZGV4KHN5bWJvbCkgKChzeW1ib2wpLT51ZGF0YS5pKQotI2RlZmluZSBlY29mZl9zZXRfc3ltX2luZGV4KHN5bWJvbCwgaWR4KSAoKHN5bWJvbCktPnVkYXRhLmkgPSAoaWR4KSkKLQotLyogV2hlbiBnZW5lcmF0aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsIHRoZSBsaW5rZXIgcmVsYXhlcyB0aGUgY29kZQotICAgdG8gdHVybiBQQyByZWxhdGl2ZSBicmFuY2hlcyBpbnRvIGxvbmdlciBjb2RlIHNlcXVlbmNlcyB3aGVuIHRoZSBQQwotICAgcmVsYXRpdmUgYnJhbmNoIGlzIG91dCBvZiByYW5nZS4gIFRoaXMgaW52b2x2ZXMgcmVhZGluZyB0aGUgcmVsb2NzCi0gICBpbiBiZmRfcmVsYXhfc2VjdGlvbiBhcyB3ZWxsIGFzIGluIGJmZF9maW5hbF9saW5rLCBhbmQgcmVxdWlyZXMgdGhlCi0gICBjb2RlIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcmVsb2NzIGhhdmUgYmVlbiBleHBhbmRlZC4gIEEgcG9pbnRlcgotICAgdG8gdGhpcyBzdHJ1Y3R1cmUgaXMgcHV0IGluIHRoZSB1c2VkX2J5X2JmZCBwb2ludGVyIG9mIGEgc2VjdGlvbiB0bwotICAga2VlcCB0cmFjayBvZiB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIHVzZXJfYnlfYmZkIHBvaW50ZXIgd2lsbCBiZQotICAgTlVMTCBpZiB0aGUgaW5mb3JtYXRpb24gd2FzIG5vdCBuZWVkZWQuICAqLwotCi1zdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdW5zd2FwcGVkIHJlbG9jcyBmb3IgdGhpcyBzZWN0aW9uLiAgVGhlc2UgYXJlIHN0b3JlZCBpbgotICAgICBtZW1vcnkgc28gdGhlIGlucHV0IGZpbGUgZG9lcyBub3QgaGF2ZSB0byBiZSByZWFkIHR3aWNlLiAgKi8KLSAgUFRSIGV4dGVybmFsX3JlbG9jczsKLQotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uICBUaGVzZSBieXRlcyBtYXkgb3IgbWF5IG5vdCBiZSBzYXZlZAotICAgICBpbiBtZW1vcnksIGJ1dCBpZiBpdCBpcyB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGVtLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gIC8qIE9mZnNldCBhZGp1c3RtZW50cyBmb3IgUEMgcmVsYXRpdmUgYnJhbmNoZXMuICBBIG51bWJlciBvdGhlciB0aGFuCi0gICAgIDEgaXMgYW4gYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIGJyYW5jaCwgb3IgYSBzd2l0Y2ggdGFibGUgZW50cnkKLSAgICAgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIC50ZXh0IGxvY2F0aW9uczsgdGhpcyBhZGRlbmQKLSAgICAgYXJpc2VzIGJlY2F1c2UgdGhlIGJyYW5jaCBvciBkaWZmZXJlbmNlIGNyb3NzZXMgb25lIG9yIG1vcmUKLSAgICAgYnJhbmNoZXMgd2hpY2ggd2VyZSBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUgc2VxdWVuY2UuICBBIDEKLSAgICAgbWVhbnMgdGhhdCB0aGlzIGJyYW5jaCB3YXMgaXRzZWxmIGV4cGFuZGVkIGludG8gYSBsYXJnZXIgY29kZQotICAgICBzZXF1ZW5jZS4gIDEgaXMgbm90IGEgcG9zc2libGUgb2Zmc2V0LCBzaW5jZSBhbGwgb2Zmc2V0cyBtdXN0IGJlCi0gICAgIG11bHRpcGxlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZSwgd2hpY2ggaXMgNDsgYWxzbywgdGhlIG9ubHkKLSAgICAgcmVsb2NzIHdpdGggbm9uLXplcm8gb2Zmc2V0cyB3aWxsIGJlIFBDIHJlbGF0aXZlIGJyYW5jaGVzIG9yCi0gICAgIHN3aXRjaCB0YWJsZSBlbnRyaWVzIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QgZmlsZS4gIElmIHRoaXMgZmllbGQKLSAgICAgaXMgTlVMTCwgbm8gYnJhbmNoZXMgd2VyZSBleHBhbmRlZCBhbmQgbm8gb2Zmc2V0cyBhcmUgcmVxdWlyZWQuCi0gICAgIE90aGVyd2lzZSB0aGVyZSBhcmUgYXMgbWFueSBlbnRyaWVzIGFzIHRoZXJlIGFyZSByZWxvY3MgaW4gdGhlCi0gICAgIHNlY3Rpb24sIGFuZCB0aGUgZW50cnkgZm9yIGFueSByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBpcwotICAgICB6ZXJvLiAgKi8KLSAgbG9uZyAqb2Zmc2V0czsKLQotICAvKiBXaGVuIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlIChpLmUuLCBmaW5hbCwgbm9uLXJlbG9jYXRhYmxlIGxpbmspCi0gICAgIG9uIHRoZSBBbHBoYSwgd2UgbWF5IG5lZWQgdG8gdXNlIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcwotICAgICB0byBzcGFuIHRoZSBlbnRpcmUgLmxpdGEgc2VjdGlvbi4gIEluIGVzc2VuY2UsIHdlIGFsbG93IGVhY2gKLSAgICAgaW5wdXQgLmxpdGEgc2VjdGlvbiB0byBoYXZlIGl0cyBvd24gZ3AgdmFsdWUuICBUbyBzdXBwb3J0IHRoaXMsCi0gICAgIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgZ3AgdmFsdWVzIHRoYXQgd2UgcGlja2VkIGZvciBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gLiAqLwotICBiZmRfdm1hIGdwOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGVjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gICovCi0gIGxvbmcgaW5keDsKLSAgLyogQkZEIHRoYXQgZXh0IGZpZWxkIHZhbHVlIGNhbWUgZnJvbS4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRVhUUiBlc3ltOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgY2hhciB3cml0dGVuOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc3ltYm9sIHdhcyByZWZlcnJlZCB0byBhcyBzbWFsbCB1bmRlZmluZWQuICAqLwotICBjaGFyIHNtYWxsOwotfTsKLQotLyogRUNPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBNYWtlIGFuIEVDT0ZGIG9iamVjdC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJlYWQgaW4gdGhlIEVDT0ZGIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLQotLyogR2VuZXJpYyBFQ09GRiBCRkQgYmFja2VuZCB2ZWN0b3JzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqX2JmZF9lY29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUJX2JmZF9lY29mZl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vawotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqYWxvY2F0aW9uKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9lY29mZl9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfcHJpbnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX2dldF9zeW1ib2xfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEgb2Zmc2V0LAotCSAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHIsIGNvbnN0IGNoYXIgKipmbm5hbWVfcHRyLAotCSAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHIpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIF9iZmRfZWNvZmZfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBfYmZkX2Vjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLS8qIGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBkZWZpbmVkIGJ5IGJhY2tlbmQuICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiByZWxvYykpOwotLyogZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBkZWZpbmVkIGJ5IGJhY2tlbmQuICAqLwotLyogZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBIb29rIGZ1bmN0aW9ucyBmb3IgdGhlIGdlbmVyaWMgQ09GRiBzZWN0aW9uIHJlYWRpbmcgY29kZS4gICovCi0KLWV4dGVybiBQVFIgX2JmZF9lY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZWhkciwgUFRSIGFvdXRoZHIpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1leHRlcm4gZmxhZ3dvcmQgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncwotICBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBoZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4YWY5YS4uMDAwMDAwMAotLS0gYS9iZmQvbGliaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0hQUEFfSAotI2RlZmluZSBfSFBQQV9ICi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFBBX1BBR0VTSVpFIDB4MTAwMAotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmIC8qIEdOVSBDPyAqLwotI2VuZGlmIC8qIElOTElORSAqLwotCi0vKiBUaGUgUEEgaW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLWVudW0gcGFfYXJjaCB7cGExMCA9IDEwLCBwYTExID0gMTEsIHBhMjAgPSAyMCwgcGEyMHcgPSAyNX07Ci0KLS8qIEhQIFBBLVJJU0MgcmVsb2NhdGlvbiB0eXBlcyAqLwotCi1lbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZQotICB7Ci0gICAgUl9IUFBBX0ZTRUwgPSAweDAsCi0gICAgUl9IUFBBX0xTU0VMID0gMHgxLAotICAgIFJfSFBQQV9SU1NFTCA9IDB4MiwKLSAgICBSX0hQUEFfTFNFTCA9IDB4MywKLSAgICBSX0hQUEFfUlNFTCA9IDB4NCwKLSAgICBSX0hQUEFfTERTRUwgPSAweDUsCi0gICAgUl9IUFBBX1JEU0VMID0gMHg2LAotICAgIFJfSFBQQV9MUlNFTCA9IDB4NywKLSAgICBSX0hQUEFfUlJTRUwgPSAweDgsCi0gICAgUl9IUFBBX05TRUwgID0gMHg5LAotICAgIFJfSFBQQV9OTFNFTCAgPSAweGEsCi0gICAgUl9IUFBBX05MUlNFTCAgPSAweGIsCi0gICAgUl9IUFBBX1BTRUwgPSAweGMsCi0gICAgUl9IUFBBX0xQU0VMID0gMHhkLAotICAgIFJfSFBQQV9SUFNFTCA9IDB4ZSwKLSAgICBSX0hQUEFfVFNFTCA9IDB4ZiwKLSAgICBSX0hQUEFfTFRTRUwgPSAweDEwLAotICAgIFJfSFBQQV9SVFNFTCA9IDB4MTEsCi0gICAgUl9IUFBBX0xUUFNFTCA9IDB4MTIsCi0gICAgUl9IUFBBX1JUUFNFTCA9IDB4MTMKLSAgfTsKLQotLyogL3Vzci9pbmNsdWRlL3JlbG9jLmggZGVmaW5lcyB0aGVzZSB0byBjb25zdGFudHMuICBXZSB3YW50IHRvIHVzZQotICAgdGhlbSBpbiBlbnVtcywgc28gI3VuZGVmIHRoZW0gYmVmb3JlIHdlIHN0YXJ0IHVzaW5nIHRoZW0uICBXZSBtaWdodAotICAgYmUgYWJsZSB0byBmaXggdGhpcyBhbm90aGVyIHdheSBieSBzaW1wbHkgbWFuYWdpbmcgbm90IHRvIGluY2x1ZGUKLSAgIC91c3IvaW5jbHVkZS9yZWxvYy5oLCBidXQgY3VycmVudGx5IEdEQiBwaWNrcyB1cCB0aGVzZSBkZWZpbmVzCi0gICBzb21ld2hlcmUuICAqLwotI3VuZGVmIGVfZnNlbAotI3VuZGVmIGVfbHNzZWwKLSN1bmRlZiBlX3Jzc2VsCi0jdW5kZWYgZV9sc2VsCi0jdW5kZWYgZV9yc2VsCi0jdW5kZWYgZV9sZHNlbAotI3VuZGVmIGVfcmRzZWwKLSN1bmRlZiBlX2xyc2VsCi0jdW5kZWYgZV9ycnNlbAotI3VuZGVmIGVfbnNlbAotI3VuZGVmIGVfbmxzZWwKLSN1bmRlZiBlX25scnNlbAotI3VuZGVmIGVfcHNlbAotI3VuZGVmIGVfbHBzZWwKLSN1bmRlZiBlX3Jwc2VsCi0jdW5kZWYgZV90c2VsCi0jdW5kZWYgZV9sdHNlbAotI3VuZGVmIGVfcnRzZWwKLSN1bmRlZiBlX29uZQotI3VuZGVmIGVfdHdvCi0jdW5kZWYgZV9wY3JlbAotI3VuZGVmIGVfY29uCi0jdW5kZWYgZV9wbGFiZWwKLSN1bmRlZiBlX2FicwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0Ci0gIHsKLSAgICBlX2ZzZWwgPSBSX0hQUEFfRlNFTCwKLSAgICBlX2xzc2VsID0gUl9IUFBBX0xTU0VMLAotICAgIGVfcnNzZWwgPSBSX0hQUEFfUlNTRUwsCi0gICAgZV9sc2VsID0gUl9IUFBBX0xTRUwsCi0gICAgZV9yc2VsID0gUl9IUFBBX1JTRUwsCi0gICAgZV9sZHNlbCA9IFJfSFBQQV9MRFNFTCwKLSAgICBlX3Jkc2VsID0gUl9IUFBBX1JEU0VMLAotICAgIGVfbHJzZWwgPSBSX0hQUEFfTFJTRUwsCi0gICAgZV9ycnNlbCA9IFJfSFBQQV9SUlNFTCwKLSAgICBlX25zZWwgPSBSX0hQUEFfTlNFTCwKLSAgICBlX25sc2VsID0gUl9IUFBBX05MU0VMLAotICAgIGVfbmxyc2VsID0gUl9IUFBBX05MUlNFTCwKLSAgICBlX3BzZWwgPSBSX0hQUEFfUFNFTCwKLSAgICBlX2xwc2VsID0gUl9IUFBBX0xQU0VMLAotICAgIGVfcnBzZWwgPSBSX0hQUEFfUlBTRUwsCi0gICAgZV90c2VsID0gUl9IUFBBX1RTRUwsCi0gICAgZV9sdHNlbCA9IFJfSFBQQV9MVFNFTCwKLSAgICBlX3J0c2VsID0gUl9IUFBBX1JUU0VMLAotICAgIGVfbHRwc2VsID0gUl9IUFBBX0xUUFNFTCwKLSAgICBlX3J0cHNlbCA9IFJfSFBQQV9SVFBTRUwKLSAgfTsKLQotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZQotICB7Ci0gICAgUl9IUFBBX0VfT05FID0gMCwKLSAgICBSX0hQUEFfRV9UV08gPSAxLAotICAgIFJfSFBQQV9FX1BDUkVMID0gMiwKLSAgICBSX0hQUEFfRV9DT04gPSAzLAotICAgIFJfSFBQQV9FX1BMQUJFTCA9IDcsCi0gICAgUl9IUFBBX0VfQUJTID0gMTgKLSAgfTsKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19leHByX3R5cGVfYWx0Ci0gIHsKLSAgICBlX29uZSA9IFJfSFBQQV9FX09ORSwKLSAgICBlX3R3byA9IFJfSFBQQV9FX1RXTywKLSAgICBlX3BjcmVsID0gUl9IUFBBX0VfUENSRUwsCi0gICAgZV9jb24gPSBSX0hQUEFfRV9DT04sCi0gICAgZV9wbGFiZWwgPSBSX0hQUEFfRV9QTEFCRUwsCi0gICAgZV9hYnMgPSBSX0hQUEFfRV9BQlMKLSAgfTsKLQotCi0vKiBSZWxvY2F0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBwYXJhbWV0ZXIKLSAgIHJlbG9jYXRpb24gYml0cy4gIFRoZXNlIGJpdHMgZGVzY3JpYmUgZXhhY3RseSB3aGVyZSB0aGUgY2FsbGVyIGhhcwotICAgcGxhY2VkIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cyBhbmQgd2hlcmUgaXQgZXhwZWN0cyB0byBmaW5kIGEgcmV0dXJuCi0gICB2YWx1ZS4KLQotICAgQm90aCBFTEYgYW5kIFNPTSBlbmNvZGUgdGhpcyBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGFkZGVuZCBmaWVsZAotICAgb2YgdGhlIGNhbGwgcmVsb2NhdGlvbi4gIChOb3RlIHRoaXMgY291bGQgYnJlYWsgdmVyeSBiYWRseSBpZiBvbmUKLSAgIHdhcyB0byBtYWtlIGEgY2FsbCBsaWtlIGJsIGZvbyArIDB4MTIzNDU2NzgpLgotCi0gICBUaGUgaGlnaCBvcmRlciAxMCBiaXRzIGNvbnRhaW4gcGFyYW1ldGVyIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sCi0gICB0aGUgbG93IG9yZGVyIDIyIGJpdHMgY29udGFpbiB0aGUgY29uc3RhbnQgb2Zmc2V0LiAgKi8KLQotI2RlZmluZSBIUFBBX1JfQVJHX1JFTE9DKGEpCVwKLSAgKCgoYSkgPj4gMjIpICYgMHgzZmYpCi0jZGVmaW5lIEhQUEFfUl9DT05TVEFOVChhKQlcCi0gICgoKChiZmRfc2lnbmVkX3ZtYSkoYSkpIDw8IChCRkRfQVJDSF9TSVpFLTIyKSkgPj4gKEJGRF9BUkNIX1NJWkUtMjIpKQotI2RlZmluZSBIUFBBX1JfQURERU5EKHIsIGMpCVwKLSAgKCgocikgPDwgMjIpICsgKChjKSAmIDB4M2ZmZmZmKSkKLSNkZWZpbmUgSFBQQV9XSURFCSAgICAgICAoMCkgLyogUFNXIFctYml0LCBuZWVkIHRvIGNoZWNrISBGSVhNRSAqLwotCi0vKiBUaGVzZSBtYWNyb3MgZ2V0IGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApLAotICogYnV0IG5vdGUgdGhhdCAiTUFTSyIgYXNzdW1lcyB0aGF0IHRoZSBMU0IgYml0cyBhcmUgd2hhdCdzCi0gKiB3YW50ZWQuCi0gKi8KLSNpZm5kZWYgR0VUX0ZJRUxECi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0jZW5kaWYKLSNkZWZpbmUgR0VUX0JJVChYLCBXSElDSCkgXAotICBHRVRfRklFTEQgKFgsIFdISUNILCBXSElDSCkKLQotI2RlZmluZSBNQVNLKFNJWkUpIFwKLSAgKH4oKC0xKSA8PCBTSVpFKSkKLQotI2RlZmluZSBDQVRFTkFURShYLCBYU0laRSwgWSwgWVNJWkUpIFwKLSAgKCgoWCAmIE1BU0sgKFhTSVpFKSkgPDwgWVNJWkUpIHwgKFkgJiBNQVNLIChZU0laRSkpKQotCi0jZGVmaW5lIEVMRVZFTihYKSBcCi0gIENBVEVOQVRFIChHRVRfQklUIChYLCAxMCksIDEsIEdFVF9GSUVMRCAoWCwgMCwgOSksIDEwKQotCi0vKiBTb21lIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIFBBIGluc3RydWN0aW9ucy4gICovCi0KLS8qIE5PVEU6IHRoZXNlIHVzZSB0aGUgSFAgY29udmVudGlvbiB0aGF0IGZ7MH0gaXMgdGhlIF9sZWZ0XyBtb3N0Ci0gKiAgICAgICBiaXQgKE1TQikgb2YgZjsgdGhleSBzb21ldGltZXMgaGF2ZSB0byBpbXBvc2UgYW4gYXNzdW1wdGlvbgotICogICAgICAgYWJvdXQgdGhlIHNpemUgb2YgYSBmaWVsZDsgYW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBtb3N0Ci0gKiAgICAgICBhcmVuJ3QgdXNlZC4KLSAqLwotCi0jaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCi0vKiBEZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgdW51c2VkIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBzaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBsb3dfc2lnbl9leHRlbmQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgYXNzZW1ibGVfMyAodW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgYXNzZW1ibGVfNiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xNiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xNmEgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCQkJCQkgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgYXNzZW1ibGVfMTcgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8yMSAodW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZSAoKF9fdW51c2VkX18pKTsKLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBsb3dfc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCByZV9hc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IHJlX2Fzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IHJlX2Fzc2VtYmxlXzE2ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgcmVfYXNzZW1ibGVfMTcgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgcmVfYXNzZW1ibGVfMjIgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgcmVfYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBiZmRfc2lnbmVkX3ZtYSBocHBhX2ZpZWxkX2FkanVzdCAoYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCQkJCQkJZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBpbnQgYmZkX2hwcGFfaW5zbjJmbXQgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgIHVuc2lnbmVkIGludCBocHBhX3JlYnVpbGRfaW5zbiAoYmZkICosIHVuc2lnbmVkIGludCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotI2VuZGlmIC8qIGdjYyAyLjcgb3IgaGlnaGVyICovCi0KLQotLyogVGhlICpzaWduX2V4dGVuZCBhbmQgYXNzZW1ibGVfKiBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYXNzZW1ibGUKLSAgIHZhcmlvdXMgYml0ZmllbGRzIHRha2VuIGZyb20gYW4gaW5zdHJ1Y3Rpb24gYW5kIHJldHVybiB0aGUKLSAgIHJlc3VsdGluZyBpbW1lZGlhdGUgdmFsdWUuICBUaGV5IGNvcnJlc3BvbmQgdG8gZnVuY3Rpb25zIGJ5IHRoZQotICAgc2FtZSBuYW1lIGluIEhQJ3MgUEEtUklTQyAyLjAgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwuICAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotc2lnbl9leHRlbmQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgdW5zaWduZWQgaW50IHNpZ25iaXQgPSAoMSA8PCAobGVuIC0gMSkpOwotICB1bnNpZ25lZCBpbnQgbWFzayA9IChzaWduYml0IDw8IDEpIC0gMTsKLSAgcmV0dXJuICgoeCAmIG1hc2spIF4gc2lnbmJpdCkgLSBzaWduYml0OwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotbG93X3NpZ25fZXh0ZW5kICh4LCBsZW4pCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci17Ci0gIHJldHVybiAoeCA+PiAxKSAtICgoeCAmIDEpIDw8IChsZW4gLSAxKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8zICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgcmV0dXJuIENBVEVOQVRFIChHRVRfQklUICh4LCAyKSwgMSwgR0VUX0ZJRUxEICh4LCAwLCAxKSwgMik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV82ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuICgoKHggJiAxKSA8PCA1KSArICgzMiAtICh5ICYgMHgxZikpKTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzEyICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuIENBVEVOQVRFIChDQVRFTkFURSAoeSwgMSwgR0VUX0JJVCAoeCwgMTApLCAxKSwgMiwKLSAJCSAgIEdFVF9GSUVMRCAoeCwgMCwgOSksIDkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMTYgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYgKEhQUEFfV0lERSkKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFIChHRVRfQklUICh5LCAxMyksIDEsCi0JCQkgICAgICAgKEdFVF9CSVQgKHksIDEzKSBeIEdFVF9CSVQgKHgsIDApKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKChHRVRfQklUICh5LCAxMykgXiBHRVRfQklUICh4LCAxKSksIDEsCi0JCQkgICAgICAgR0VUX0ZJRUxEICh5LCAwLCAxMiksIDEzKSwgMTQpOwotICBlbHNlCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLCBHRVRfQklUICh5LCAxMyksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFIChHRVRfQklUICh5LCAxMyksIDEsIEdFVF9GSUVMRCAoeSwgMCwgMTIpLCAxMyksIDE0KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDE2KTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzE2YSAoeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IHgsIHksIHo7Ci17Ci0gIC8qIERlcGVuZHMgb24gUFNXIFctYml0ICEqLwotICB1bnNpZ25lZCBpbnQgdGVtcDsKLQotICBpZiAoSFBQQV9XSURFKQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsICh6IF4gR0VUX0JJVCAoeCwgMCkpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoKHogXiBHRVRfQklUICh4LCAxKSksIDEsIHksIDExKSwgMTIpOwotICBlbHNlCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoeiwgMSwgeiwgMSksIDIsIENBVEVOQVRFICh6LCAxLCB5LCAxMSksIDEyKTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKCh0ZW1wIDw8IDIpLCAxNik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8xNyAoeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IHgsIHksIHo7Ci17Ci0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHgsIDUpLCA2LAotCQkgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTApLCAxLCBHRVRfRklFTEQgKHksIDAsIDkpLCAxMCksIDExKTsKLQotICByZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzIxICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgdGVtcCA9ICgoICAoeCAmIDB4MDAwMDAxKSA8PCAyMCkKLQkgIHwgKCh4ICYgMHgwMDBmZmUpIDw8IDgpCi0JICB8ICgoeCAmIDB4MDAzMDAwKSA+PiAxMikKLQkgIHwgKCh4ICYgMHgwMGMwMDApID4+IDcpCi0JICB8ICgoeCAmIDB4MWYwMDAwKSA+PiAxNCkpOwotICByZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzIyIChhLGIsYyxkKQotICAgICB1bnNpZ25lZCBpbnQgYSxiLGMsZDsKLXsKLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoZCwgMSwgYSwgNSksIDYsCi0JCSAgIENBVEVOQVRFIChiLCA1LCBFTEVWRU4gKGMpLCAxMSksIDE2KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDIyKTsKLX0KLQotCi0vKiBUaGUgcmVfYXNzZW1ibGVfKiBmdW5jdGlvbnMgc3BsaWNlIHRvZ2V0aGVyIGFuIG9wY29kZSBhbmQgYW4KLSAgIGltbWVkaWF0ZSB2YWx1ZS4gIHBhLXJpc2MgdXNlcyBhbGwgc29ydHMgb2Ygd2VpcmQgYml0ZmllbGRzIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24gdG8gaG9sZCB0aGUgdmFsdWUuICAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotc2lnbl91bmV4dCAoeCwgbGVuKQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotewotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0KLSAgbGVuX29uZXMgPSAoKHVuc2lnbmVkIGludCkgMSA8PCBsZW4pIC0gMTsKLQotICByZXR1cm4geCAmIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotbG93X3NpZ25fdW5leHQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0gIHVuc2lnbmVkIGludCBzaWduOwotCi0gIHNpZ24gPSAoeCA+PiAobGVuLTEpKSAmIDE7Ci0KLSAgdGVtcCA9IHNpZ25fdW5leHQgKHgsIGxlbi0xKTsKLQotICByZXR1cm4gKHRlbXAgPDwgMSkgfCBzaWduOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotcmVfYXNzZW1ibGVfMyAoaW5zbiwgYXMzKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgdW5zaWduZWQgaW50IGFzMzsKLXsKLSAgcmV0dXJuIChpbnNuCi0JICB8ICgoYXMzICYgNCkgPDwgKDEzLTIpKQotCSAgfCAoKGFzMyAmIDMpIDw8ICgxMysxKSkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotcmVfYXNzZW1ibGVfMTIgKGluc24sIGFzMTIpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgYXMxMjsKLXsKLSAgcmV0dXJuIChpbnNuCi0JICB8ICgoYXMxMiAmIDB4ODAwKSA+PiAxMSkKLQkgIHwgKChhczEyICYgMHg0MDApID4+ICgxMCAtIDIpKQotCSAgfCAoKGFzMTIgJiAweDNmZikgPDwgKDEgKyAyKSkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotcmVfYXNzZW1ibGVfMTYgKGluc24sIGFzMTYsIHdpZGUpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgYXMxNjsKLSAgICAgaW50IHdpZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBzLCB0OwotCi0gIGlmICh3aWRlKQotICAgIHsKLSAgICAgIC8qIFVudXN1YWwgMTYtYml0IGVuY29kaW5nLiAgKi8KLSAgICAgIHQgPSAoYXMxNiA8PCAxKSAmIDB4ZmZmZjsKLSAgICAgIHMgPSAoYXMxNiAmIDB4ODAwMCk7Ci0gICAgICByZXR1cm4gaW5zbiB8ICh0IF4gcyBeIChzID4+IDEpKSB8IChzID4+IDE1KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTdGFuZGFyZCAxNC1iaXQgZW5jb2RpbmcuICAqLwotICAgICAgdCA9IChhczE2IDw8IDEpICYgMHgzZmZmOwotICAgICAgcyA9IChhczE2ICYgMHgyMDAwKTsKLSAgICAgIHJldHVybiBpbnNuIHwgdCB8IChzID4+IDEzKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1yZV9hc3NlbWJsZV8xNyAoaW5zbiwgYXMxNykKLSAgICAgdW5zaWduZWQgaW50IGluc247Ci0gICAgIHVuc2lnbmVkIGludCBhczE3OwotewotICByZXR1cm4gKGluc24KLQkgIHwgKChhczE3ICYgMHgxMDAwMCkgPj4gMTYpCi0JICB8ICgoYXMxNyAmIDB4MGY4MDApIDw8ICgxNiAtIDExKSkKLQkgIHwgKChhczE3ICYgMHgwMDQwMCkgPj4gKDEwIC0gMikpCi0JICB8ICgoYXMxNyAmIDB4MDAzZmYpIDw8ICgxICsgMikpKTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLXJlX2Fzc2VtYmxlXzIxIChpbnNuLCBhczIxKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgdW5zaWduZWQgaW50IGFzMjE7Ci17Ci0gIHJldHVybiAoaW5zbgotCSAgfCAoKGFzMjEgJiAweDEwMDAwMCkgPj4gMjApCi0JICB8ICgoYXMyMSAmIDB4MGZmZTAwKSA+PiA4KQotCSAgfCAoKGFzMjEgJiAweDAwMDE4MCkgPDwgNykKLQkgIHwgKChhczIxICYgMHgwMDAwN2MpIDw8IDE0KQotCSAgfCAoKGFzMjEgJiAweDAwMDAwMykgPDwgMTIpKTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLXJlX2Fzc2VtYmxlXzIyIChpbnNuLCBhczIyKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgdW5zaWduZWQgaW50IGFzMjI7Ci17Ci0gIHJldHVybiAoaW5zbgotCSAgfCAoKGFzMjIgJiAweDIwMDAwMCkgPj4gMjEpCi0JICB8ICgoYXMyMiAmIDB4MWYwMDAwKSA8PCAoMjEgLSAxNikpCi0JICB8ICgoYXMyMiAmIDB4MDBmODAwKSA8PCAoMTYgLSAxMSkpCi0JICB8ICgoYXMyMiAmIDB4MDAwNDAwKSA+PiAoMTAgLSAyKSkKLQkgIHwgKChhczIyICYgMHgwMDAzZmYpIDw8ICgxICsgMikpKTsKLX0KLQotCi0vKiBIYW5kbGUgZmllbGQgc2VsZWN0b3JzIGZvciBQQSBpbnN0cnVjdGlvbnMuCi0gICBUaGUgTCBhbmQgUiAoYW5kIExTLCBSUyBldGMuKSBzZWxlY3RvcnMgYXJlIHVzZWQgaW4gcGFpcnMgdG8gZm9ybSBhCi0gICBmdWxsIDMyIGJpdCBhZGRyZXNzLiAgZWcuCi0KLSAgIExESUwJTCdzdGFydCwlcjEJCTsgcHV0IGxlZnQgcGFydCBpbnRvIHIxCi0gICBMRFcJUidzdGFydCglcjEpLCVyMgk7IGFkZCByMSBhbmQgcmlnaHQgcGFydCB0byBmb3JtIGFkZHJlc3MKLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNpZ24gZXh0ZW5kZWQgdmFsdWVzIGluIGFsbCBjYXNlcy4KLSovCi0KLXN0YXRpYyBJTkxJTkUgYmZkX3NpZ25lZF92bWEKLWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsLCBhZGRlbmQsIHJfZmllbGQpCi0gICAgIGJmZF9zaWduZWRfdm1hIHN5bV92YWw7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsKLSAgICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IHJfZmllbGQ7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHZhbHVlOwotCi0gIHZhbHVlID0gc3ltX3ZhbCArIGFkZGVuZDsKLSAgc3dpdGNoIChyX2ZpZWxkKQotICAgIHsKLSAgICBjYXNlIGVfZnNlbDoKLSAgICBjYXNlIGVfbnNlbDoKLSAgICAgIC8qIEY6IE5vIGNoYW5nZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc2VsOgotICAgIGNhc2UgZV9ubHNlbDoKLSAgICAgIC8qIEw6ICBTZWxlY3QgdG9wIDIxIGJpdHMuICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3JzZWw6Ci0gICAgICAvKiBSOiAgU2VsZWN0IGJvdHRvbSAxMSBiaXRzLiAgKi8KLSAgICAgIHZhbHVlID0gdmFsdWUgJiAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xzc2VsOgotICAgICAgLyogTFM6ICBSb3VuZCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDIwNDggdGhlbiBzZWxlY3QgdG9wIDIxIGJpdHMuICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArIDB4NDAwOwotICAgICAgdmFsdWUgPSB2YWx1ZSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3Jzc2VsOgotICAgICAgLyogUlM6ICBTZWxlY3QgYm90dG9tIDExIGJpdHMgZm9yIExTLgotCSBXZSBuZWVkIHRvIHJldHVybiBhIHZhbHVlIHN1Y2ggdGhhdCAyMDQ4ICogTFMneCArIFJTJ3ggPT0geC4KLQkgaWUuIFJTJ3ggPSB4IC0gKCh4ICsgMHg0MDApICYgLTB4ODAwKQotCSB0aGlzIGlzIGp1c3QgYSBzaWduIGV4dGVuc2lvbiBmcm9tIGJpdCAyMS4gICovCi0gICAgICB2YWx1ZSA9ICgodmFsdWUgJiAweDdmZikgXiAweDQwMCkgLSAweDQwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xkc2VsOgotICAgICAgLyogTEQ6ICBSb3VuZCB0byBuZXh0IG11bHRpcGxlIG9mIDIwNDggdGhlbiBzZWxlY3QgdG9wIDIxIGJpdHMuCi0JIFllcywgaWYgd2UgYXJlIGFscmVhZHkgb24gYSBtdWx0aXBsZSBvZiAyMDQ4LCB3ZSBnbyB1cCB0byB0aGUKLQkgbmV4dCBvbmUuICBSRCBpbiB0aGlzIGNhc2Ugd2lsbCBiZSAtMjA0OC4gICovCi0gICAgICB2YWx1ZSA9IHZhbHVlICsgMHg4MDA7Ci0gICAgICB2YWx1ZSA9IHZhbHVlID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcmRzZWw6Ci0gICAgICAvKiBSRDogIFNldCBiaXRzIDAtMjAgdG8gb25lLiAgKi8KLSAgICAgIHZhbHVlID0gdmFsdWUgfCAtMHg4MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9scnNlbDoKLSAgICBjYXNlIGVfbmxyc2VsOgotICAgICAgLyogTFI6ICBMIHdpdGggcm91bmRpbmcgb2YgdGhlIGFkZGVuZCB0byBuZWFyZXN0IDhrLiAgKi8KLSAgICAgIHZhbHVlID0gc3ltX3ZhbCArICgoYWRkZW5kICsgMHgxMDAwKSAmIC0weDIwMDApOwotICAgICAgdmFsdWUgPSB2YWx1ZSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3Jyc2VsOgotICAgICAgLyogUlI6ICBSIHdpdGggcm91bmRpbmcgb2YgdGhlIGFkZGVuZCB0byBuZWFyZXN0IDhrLgotCSBXZSBuZWVkIHRvIHJldHVybiBhIHZhbHVlIHN1Y2ggdGhhdCAyMDQ4ICogTFIneCArIFJSJ3ggPT0geAotCSBpZS4gUlIneCA9IHMrYSAtIChzICsgKCgoYSArIDB4MTAwMCkgJiAtMHgyMDAwKSAmIC0weDgwMCkpCi0JIC4JICA9IHMrYSAtICgocyAmIC0weDgwMCkgKyAoKGEgKyAweDEwMDApICYgLTB4MjAwMCkpCi0JIC4JICA9IChzICYgMHg3ZmYpICsgYSAtICgoYSArIDB4MTAwMCkgJiAtMHgyMDAwKSAgKi8KLSAgICAgIHZhbHVlID0gKHN5bV92YWwgJiAweDdmZikgKyAoKChhZGRlbmQgJiAweDFmZmYpIF4gMHgxMDAwKSAtIDB4MTAwMCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogUEEtUklTQyBPUENPREVTICovCi0jZGVmaW5lIGdldF9vcGNvZGUoaW5zbikJKCgoaW5zbikgPj4gMjYpICYgMHgzZikKLQotLyogRklYTUU6IHRoaXMgbGlzdCBpcyBpbmNvbXBsZXRlLiAgSXQgc2hvdWxkIGFsc28gYmUgYW4gZW51bWVyYXRlZAotICAgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4gICovCi0KLSNkZWZpbmUgTERPCTB4MGQKLSNkZWZpbmUgTERCCTB4MTAKLSNkZWZpbmUgTERICTB4MTEKLSNkZWZpbmUgTERXCTB4MTIKLSNkZWZpbmUgTERXTQkweDEzCi0jZGVmaW5lIFNUQgkweDE4Ci0jZGVmaW5lIFNUSAkweDE5Ci0jZGVmaW5lIFNUVwkweDFhCi0jZGVmaW5lIFNUV00JMHgxYgotI2RlZmluZSBDT01JQ0xSCTB4MjQKLSNkZWZpbmUgU1VCSQkweDI1Ci0jZGVmaW5lIFNVQklPCTB4MjUKLSNkZWZpbmUgQURESVQJMHgyYwotI2RlZmluZSBBRERJVE8JMHgyYwotI2RlZmluZSBBRERJCTB4MmQKLSNkZWZpbmUgQURESU8JMHgyZAotI2RlZmluZSBMRElMCTB4MDgKLSNkZWZpbmUgQURESUwJMHgwYQotCi0jZGVmaW5lIE1PVkIJMHgzMgotI2RlZmluZSBNT1ZJQgkweDMzCi0jZGVmaW5lIENPTUJUCTB4MjAKLSNkZWZpbmUgQ09NQkYJMHgyMgotI2RlZmluZSBDT01JQlQJMHgyMQotI2RlZmluZSBDT01JQkYJMHgyMwotI2RlZmluZSBBRERCVAkweDI4Ci0jZGVmaW5lIEFEREJGCTB4MmEKLSNkZWZpbmUgQURESUJUCTB4MjkKLSNkZWZpbmUgQURESUJGCTB4MmIKLSNkZWZpbmUgQlZCCTB4MzAKLSNkZWZpbmUgQkIJMHgzMQotCi0jZGVmaW5lIEJMCTB4M2EKLSNkZWZpbmUgQkxFCTB4MzkKLSNkZWZpbmUgQkUJMHgzOAotCi0jZGVmaW5lIENNUEJEVAkweDI3Ci0jZGVmaW5lIENNUEJERgkweDJmCi0jZGVmaW5lIENNUElCRAkweDNiCi0jZGVmaW5lIExERAkweDE0Ci0jZGVmaW5lIFNURAkweDFjCi0jZGVmaW5lIExEV0wJMHgxNwotI2RlZmluZSBTVFdMCTB4MWYKLSNkZWZpbmUgRkxEVyAgICAweDE2Ci0jZGVmaW5lIEZTVFcgICAgMHgxZQotCi0vKiBHaXZlbiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIHJldHVybiBpdHMgZm9ybWF0LgotCi0gICBGSVhNRTogIG9wY29kZXMgd2hpY2ggZG8gbm90IG1hcCB0byBhIGtub3duIGZvcm1hdAotICAgc2hvdWxkIHJldHVybiBhbiBlcnJvciBvZiBzb21lIHNvcnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotYmZkX2hwcGFfaW5zbjJmbXQgKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICB1bnNpZ25lZCBjaGFyIG9wID0gZ2V0X29wY29kZSAoaW5zbik7Ci0KLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBTVUJJOgotICAgICAgcmV0dXJuIDExOwotCi0gICAgY2FzZSBNT1ZCOgotICAgIGNhc2UgTU9WSUI6Ci0gICAgY2FzZSBDT01CVDoKLSAgICBjYXNlIENPTUJGOgotICAgIGNhc2UgQ09NSUJUOgotICAgIGNhc2UgQ09NSUJGOgotICAgIGNhc2UgQUREQlQ6Ci0gICAgY2FzZSBBRERCRjoKLSAgICBjYXNlIEFERElCVDoKLSAgICBjYXNlIEFERElCRjoKLSAgICBjYXNlIEJWQjoKLSAgICBjYXNlIEJCOgotICAgIGNhc2UgQ01QQkRUOgotICAgIGNhc2UgQ01QQkRGOgotICAgIGNhc2UgQ01QSUJEOgotICAgICAgcmV0dXJuIDEyOwotCi0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICAgIHJldHVybiAxNDsKLQotICAgIGNhc2UgTERXTDoKLSAgICBjYXNlIFNUV0w6Ci0gICAgY2FzZSBGTERXOgotICAgIGNhc2UgRlNUVzoKLSAgICAgIC8qIFRoaXMgaXMgYSBoYWNrLiAgVW5mb3J0dW5hdGVseSwgZm9ybWF0IDExIGlzIGFscmVhZHkgdGFrZW4KLQkgYW5kIHdlJ3JlIHVzaW5nIGludGVnZXJzIHJhdGhlciB0aGFuIGFuIGVudW0sIHNvIGl0J3MgaGFyZAotCSB0byBkZXNjcmliZSB0aGUgMTFhIGZvcm1hdC4gICovCi0gICAgICByZXR1cm4gLTExOwotCi0gICAgY2FzZSBMREQ6Ci0gICAgY2FzZSBTVEQ6Ci0gICAgICByZXR1cm4gMTA7Ci0KLSAgICBjYXNlIEJMOgotICAgIGNhc2UgQkU6Ci0gICAgY2FzZSBCTEU6Ci0gICAgICBpZiAoKGluc24gJiAweDAwMDA4MDAwKSAhPSAwKQotCXJldHVybiAyMjsKLSAgICAgIHJldHVybiAxNzsKLQotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgcmV0dXJuIDIxOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDMyOwotfQotCi0KLS8qIEluc2VydCBWQUxVRSBpbnRvIElOU04gdXNpbmcgUl9GT1JNQVQgdG8gZGV0ZXJtaW5lIGV4YWN0bHkgd2hhdAotICAgYml0cyB0byBjaGFuZ2UuICAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHZhbHVlLCByX2Zvcm1hdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCByX2Zvcm1hdDsKLXsKLSAgc3dpdGNoIChyX2Zvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSAxMTogcmV0dXJuIChpbnNuICYgfiAweDdmZikgfCBsb3dfc2lnbl91bmV4dCAodmFsdWUsIDExKTsKLSAgICBjYXNlIDEyOiByZXR1cm4gcmVfYXNzZW1ibGVfMTIgKGluc24gJiB+IDB4MWZmZCwgdmFsdWUpOwotICAgIGNhc2UgMTQ6IHJldHVybiAoaW5zbiAmIH4gMHgzZmZmKSB8IGxvd19zaWduX3VuZXh0ICh2YWx1ZSwgMTQpOwotICAgIGNhc2UgMTc6IHJldHVybiByZV9hc3NlbWJsZV8xNyAoaW5zbiAmIH4gMHgxZjFmZmQsIHZhbHVlKTsKLSAgICBjYXNlIDIxOiByZXR1cm4gcmVfYXNzZW1ibGVfMjEgKGluc24gJiB+IDB4MWZmZmZmLCB2YWx1ZSk7Ci0gICAgY2FzZSAzMjogcmV0dXJuIHZhbHVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLSNlbmRpZiAvKiBfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvbGliaWVlZS5oIGIvYmZkL2xpYmllZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlODA2ZS4uMDAwMDAwMAotLS0gYS9iZmQvbGliaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qIElFRUUtNjk1IG9iamVjdCBmaWxlIGZvcm1hdHM6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgU3RldmUgQ2hhbWJlcmxhaW4ncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoyNDsKLSAgY2hhciBsZXR0ZXI7Ci19IGllZWVfc3ltYm9sX2luZGV4X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGN0IHsKLSAgYmZkICp0aGlzOwotICBzdHJ1Y3QgY3QgKm5leHQ7Ci19IGJmZF9jaGFpbl90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3N5bWJvbCAKLXsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHN0cnVjdCBpZWVlX3N5bWJvbCAqbmV4dDsKLQotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci19IGllZWVfc3ltYm9sX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9yZWxvYyB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgaWVlZV9yZWxvYyAqbmV4dDsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci0KLX0gaWVlZV9yZWxvY190eXBlOwotCi0jZGVmaW5lIGllZWVfc3ltYm9sKHgpICgoaWVlZV9zeW1ib2xfdHlwZSAqKSh4KSkKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9wZXJfc2VjdGlvbgotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIHBjOwotICAvKiBGb3Igb3V0cHV0ICovCi0gIGZpbGVfcHRyIGN1cnJlbnRfcG9zOwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9ieXRlOwotICBib29sZWFuIGluaXRpYWxpemVkOwotICBpZWVlX3JlbG9jX3R5cGUgKipyZWxvY190YWlsX3B0cjsKLX0gaWVlZV9wZXJfc2VjdGlvbl90eXBlOwotCi0jZGVmaW5lIGllZWVfcGVyX3NlY3Rpb24oeCkgKChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikoKHgpLT51c2VkX2J5X2JmZCkpCi0gIAotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCAgY2hhciAqaW5wdXRfcDsKLSAgdW5zaWduZWQgY2hhciAqZmlyc3RfYnl0ZTsKLSAgYmZkICphYmZkOwotfSBjb21tb25faGVhZGVyX3R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0Ci17Ci0gIGNvbW1vbl9oZWFkZXJfdHlwZSBoOwotICBib29sZWFuIHJlYWRfc3ltYm9sczsKLSAgYm9vbGVhbiByZWFkX2RhdGE7CQotICBmaWxlX3B0ciBvdXRwdXRfY3Vyc29yOwotICAvKiBNYXAgb2Ygc2VjdGlvbiBpbmRleGVzIHRvIHNlY3Rpb24gcHRycyAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX3RhYmxlX3NpemU7Ci0gIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGUgYWQ7Ci0gIGllZWVfbW9kdWxlX2JlZ2luX3R5cGUgbWI7Ci0gIGllZWVfd192YXJpYWJsZV90eXBlIHc7Ci0gIAotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLSAgCi0gIHVuc2lnbmVkIGludCBtYXBfaWR4OwotICAvKiBMaXN0IG9mIEdMT0JBTCBFWFBPUlQgc3ltYm9scyAqLwotICBpZWVlX3N5bWJvbF90eXBlICpleHRlcm5hbF9zeW1ib2xzOwotICAvKiBMaXN0IG9mIFVOREVGSU5FRCBzeW1ib2xzICovCi0gIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgCi0gIC8qIFdoZW4gdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIGNhbm9uaWNhbGl6ZWQsIHRoZXkgYXJlIGluIGEKLSAgICAqIHNwZWNpYWwgb3JkZXIsIHdlIHJlbWVtYmVyIHZhcmlvdXMgYmFzZXMgaGVyZS4uICovCi0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9jb3VudDsKLSAgaW50IGV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldDsKLSAgCi0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9jb3VudDsKLSAgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldDsKLSAgCi0KLSAgYm9vbGVhbiBzeW1ib2xfdGFibGVfZnVsbDsKLQotICAKLWJvb2xlYW4gZG9uZV9kZWJ1ZzsKLQotCi1iZmRfY2hhaW5fdHlwZSAqY2hhaW5faGVhZDsKLWJmZF9jaGFpbl90eXBlICpjaGFpbl9yb290OwotCi19IGllZWVfZGF0YV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICBiZmQgKmFiZmQ7Ci19IGllZWVfYXJfb2JzdGFja190eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0IAotewotICBjb21tb25faGVhZGVyX3R5cGUgaDsKLSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKmVsZW1lbnRzOwotICAKLSAgdW5zaWduZWQgIGludCBlbGVtZW50X2luZGV4IDsKLSAgdW5zaWduZWQgaW50IGVsZW1lbnRfY291bnQ7Ci0KLX0gaWVlZV9hcl9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgSUVFRV9EQVRBKGFiZmQpICgoYWJmZCktPnRkYXRhLmllZWVfZGF0YSkKLSNkZWZpbmUgSUVFRV9BUl9EQVRBKGFiZmQpICgoYWJmZCktPnRkYXRhLmllZWVfYXJfZGF0YSkKLQotI2RlZmluZSBwdHIoYWJmZCkgKGllZWVfZGF0YShhYmZkKS0+aW5wdXRfcCkKZGlmZiAtLWdpdCBhL2JmZC9saWJubG0uaCBiL2JmZC9saWJubG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkMmU0ZS4uMDAwMDAwMAotLS0gYS9iZmQvbGlibmxtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMpIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJOTE1fSF8KLSNkZWZpbmUgX0xJQk5MTV9IXyAxCi0KLSNpZmRlZiBBUkNIX1NJWkUKLSMgIGRlZmluZSBOTE1fQVJDSF9TSVpFIEFSQ0hfU0laRQotI2VuZGlmCi0jaW5jbHVkZSAibmxtL2NvbW1vbi5oIgotI2luY2x1ZGUgIm5sbS9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm5sbS9leHRlcm5hbC5oIgotCi0vKiBBIHJlbG9jIGZvciBhbiBpbXBvcnRlZCBOTE0gc3ltYm9sLiAgTm9ybWFsIHJlbG9jcyBhcmUgYXNzb2NpYXRlZAotICAgd2l0aCBzZWN0aW9ucywgYW5kIGluY2x1ZGUgYSBzeW1ib2wuICBUaGVzZSByZWxvY3MgYXJlIGFzc29jaWF0ZWQKLSAgIHdpdGggKHVuZGVmaW5lZCkgc3ltYm9scywgYW5kIGluY2x1ZGUgYSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IG5sbV9yZWxlbnQKLXsKLSAgLyogU2VjdGlvbiBvZiByZWxvYy4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotICAvKiBSZWxvYyBpbmZvIChzeW1fcHRyX3B0ciBmaWVsZCBzZXQgb25seSB3aGVuIGNhbm9uaWNhbGl6ZWQpLiAgKi8KLSAgYXJlbGVudCByZWxvYzsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGFuIE5MTSBzeW1ib2wuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCRkQgc3ltYm9sLiAgKi8KLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIC8qIE51bWJlciBvZiByZWxvYyBlbnRyaWVzIGZvciBpbXBvcnRlZCBzeW1ib2wuICAqLwotICBiZmRfc2l6ZV90eXBlIHJjbnQ7Ci0gIC8qIEFycmF5IG9mIHJlbG9jIGluZm9ybWF0aW9uIGZvciBpbXBvcnRlZCBzeW1ib2wuICAqLwotICBzdHJ1Y3QgbmxtX3JlbGVudCAqcmVsb2NzOwotfSBubG1OQU1FKHN5bWJvbF90eXBlKTsKLQotZXh0ZXJuIGJvb2xlYW4gbmxtX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLQotZXh0ZXJuIHZvaWQgbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3N5bXRhYikKLSAgICAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBhc3ltYm9sICpubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgbmxtTkFNRShwcmludF9zeW1ib2wpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKm5sbU5BTUUob2JqZWN0X3ApCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHNldF9hcmNoX21hY2gpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUoc2V0X3NlY3Rpb25fY29udGVudHMpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLQotLyogU29tZSBwcml2YXRlIGRhdGEgaXMgc3Rhc2hlZCBhd2F5IGZvciBmdXR1cmUgdXNlIHVzaW5nIHRoZSB0ZGF0YSBwb2ludGVyCi0gICBpbiB0aGUgYmZkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG1fb2JqX3RkYXRhCi17Ci0gIC8qIEFjdHVhbCBkYXRhLCBidXQgcmVmIGxpa2UgcHRyICovCi0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIJbmxtX2ZpeGVkX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlcglubG1fdmFyaWFibGVfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIJbmxtX3ZlcnNpb25faGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcglubG1fY29weXJpZ2h0X2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcglubG1fZXh0ZW5kZWRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcglubG1fY3VzdG9tX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyIG5sbV9jeWdudXNfZXh0X2hkclsxXTsKLSAgLyogQkZEIE5MTSBzeW1ib2xzLiAgKi8KLSAgbmxtTkFNRShzeW1ib2xfdHlwZSkJCSpubG1fc3ltYm9sczsKLSAgLyogTG93ZXN0IHRleHQgYW5kIGRhdGEgVk1BIHZhbHVlcy4gICovCi0gIGJmZF92bWEJCQlubG1fdGV4dF9sb3c7Ci0gIGJmZF92bWEJCQlubG1fZGF0YV9sb3c7Ci0gIC8qIENhY2hlcyBmb3IgZGF0YSByZWFkIGZyb20gb2JqZWN0IGZpbGUuICAqLwotICBhcmVsZW50ICoJCQlubG1fcmVsb2NfZml4dXBzOwotICBhc2VjdGlvbiAqKgkJCW5sbV9yZWxvY19maXh1cF9zZWNzOwotICAvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYSBwb2ludGVyLAotICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHlldCBhbm90aGVyIGVudHJ5IHBvaW50IHRvIGluaXRpYWxpemUgdGhlCi0gICAgIHN0cnVjdHVyZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0CS8qIEFscGhhIGJhY2tlbmQgaW5mb3JtYXRpb24uICAqLwotCXsKLQkgIGJmZF92bWEgZ3A7CQkJLyogR1AgdmFsdWUuICAqLwotCSAgYmZkX3ZtYSBsaXRhX2FkZHJlc3M7CQkvKiAubGl0YSBzZWN0aW9uIGFkZHJlc3MuICAqLwotCSAgYmZkX3NpemVfdHlwZSBsaXRhX3NpemU7CS8qIC5saXRhIHNlY3Rpb24gc2l6ZS4gICovCi0JfQotICAgICAgYWxwaGFfYmFja2VuZF9kYXRhOwotICAgIH0KLSAgYmFja2VuZF9kYXRhOwotfTsKLQotI2RlZmluZSBubG1fdGRhdGEoYmZkKQkJCSgoYmZkKSAtPiB0ZGF0YS5ubG1fb2JqX2RhdGEpCi0jZGVmaW5lIG5sbV9maXhlZF9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9maXhlZF9oZHIpCi0jZGVmaW5lIG5sbV92YXJpYWJsZV9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3ZhcmlhYmxlX2hkcikKLSNkZWZpbmUgbmxtX3ZlcnNpb25faGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdmVyc2lvbl9oZHIpCi0jZGVmaW5lIG5sbV9jb3B5cmlnaHRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jb3B5cmlnaHRfaGRyKQotI2RlZmluZSBubG1fZXh0ZW5kZWRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9leHRlbmRlZF9oZHIpCi0jZGVmaW5lIG5sbV9jdXN0b21faGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY3VzdG9tX2hkcikKLSNkZWZpbmUgbmxtX2N5Z251c19leHRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jeWdudXNfZXh0X2hkcikKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xzKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fc3ltYm9scykKLSNkZWZpbmUgbmxtX3NldF9zeW1ib2xzKGJmZCwgcCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fc3ltYm9scyA9IChwKSkKLSNkZWZpbmUgbmxtX3NldF90ZXh0X2xvdyhiZmQsIGkpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdGV4dF9sb3cgPSAoaSkpCi0jZGVmaW5lIG5sbV9nZXRfdGV4dF9sb3coYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV90ZXh0X2xvdykKLSNkZWZpbmUgbmxtX3NldF9kYXRhX2xvdyhiZmQsIGkpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZGF0YV9sb3cgPSAoaSkpCi0jZGVmaW5lIG5sbV9nZXRfZGF0YV9sb3coYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9kYXRhX2xvdykKLSNkZWZpbmUgbmxtX3JlbG9jYXRpb25fZml4dXBzKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9yZWxvY19maXh1cHMpCi0jZGVmaW5lIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MoYmZkKQkobmxtX3RkYXRhKGJmZCktPm5sbV9yZWxvY19maXh1cF9zZWNzKQotCi0jZGVmaW5lIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEoYmZkKSBcCi0gICgmbmxtX3RkYXRhIChiZmQpLT5iYWNrZW5kX2RhdGEuYWxwaGFfYmFja2VuZF9kYXRhKQotCi0vKiBUaGlzIGlzIHVzZWQgd2hlbiB3cml0aW5nIG91dCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAqLwotCi1zdHJ1Y3QgcmVsb2NfYW5kX3NlYwotewotICBhcmVsZW50ICpyZWw7Ci0gIGFzZWN0aW9uICpzZWM7Ci19OwotCi0vKiBXZSBzdG9yZSBzb21lIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhpcyBsZXRzCi0gICBkaWZmZXJlbnQgTkxNIHRhcmdldHMgc2hhcmUgbW9zdCBvZiB0aGUgc2FtZSBjb2RlLCB3aGlsZSBwcm92aWRpbmcKLSAgIHNsaWdodGx5IGRpZmZlcmVudCBjb2RlIHdoZXJlIG5lY2Vzc2FyeS4gICovCi0KLXN0cnVjdCBubG1fYmFja2VuZF9kYXRhCi17Ci0gIC8qIFNpZ25hdHVyZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgY2hhciBzaWduYXR1cmVbTkxNX1NJR05BVFVSRV9TSVpFXTsKLSAgLyogU2l6ZSBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBmaXhlZF9oZWFkZXJfc2l6ZTsKLSAgLyogU2l6ZSBvZiBvcHRpb25hbCBwcmVmaXggZm9yIHRoaXMgYmFja2VuZC4gIFNvbWUgYmFja2VuZCBtYXkKLSAgICAgcmVxdWlyZSB0aGlzIHRvIGJlIGEgZnVuY3Rpb24sIGJ1dCBzbyBmYXIgYSBjb25zdGFudCBpcyBPSy4gIFRoaXMKLSAgICAgaXMgZm9yIGEgcHJlZml4IHdoaWNoIHByZWNlZGVzIHRoZSBzdGFuZGFyZCBOTE0gZml4ZWQgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBvcHRpb25hbF9wcmVmaXhfc2l6ZTsKLSAgLyogQXJjaGl0ZWN0dXJlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIE1hY2hpbmUuICAqLwotICBsb25nIG1hY2g7Ci0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgZG8gbm90IHVzZSB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24sIHNvCi0gICAgIGFsbCB1bmluaXRpYWxpemVkIGRhdGEgbXVzdCBiZSBwdXQgaW50byB0aGUgcmVndWxhciBkYXRhIHNlY3Rpb24KLSAgICAgaW5zdGVhZC4gICovCi0gIGJvb2xlYW4gbm9fdW5pbml0aWFsaXplZF9kYXRhOwotICAvKiBTb21lIE5MTSBmb3JtYXRzIGhhdmUgYSBwcmVmaXggb24gdGhlIGZpbGUuICBJZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgIG5vdCBOVUxMLCBpdCB3aWxsIGJlIGNhbGxlZCBieSBubG1fb2JqZWN0X3AuICBJdCBzaG91bGQgcmV0dXJuCi0gICAgIHRydWUgaWYgdGhpcyBmaWxlIGNvdWxkIG1hdGNoIHRoaXMgZm9ybWF0LCBhbmQgaXQgc2hvdWxkIGxlYXZlCi0gICAgIHRoZSBCRkQgc3VjaCB0aGF0IGEgYmZkX3JlYWQgd2lsbCBwaWNrIHVwIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBib29sZWFuICgqbmxtX2JhY2tlbmRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIC8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgTlVMTC4gIFRoaXMgbXVzdAotICAgICB3cml0ZSBvdXQgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIGlzIGluIHRoZSBmaWVsZAotICAgICBvcHRpb25hbF9wcmVmaXhfc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfcHJlZml4KSBQQVJBTVMgKChiZmQgKikpOwotICAvKiBSZWFkIGEgcmVsb2NhdGlvbiBmaXh1cCBmcm9tIGFiZmQuICBUaGUgcmVsb2MgaW5mb3JtYXRpb24gaXMKLSAgICAgbWFjaGluZSBzcGVjaWZpYy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHN5bWJvbCBpZiB0aGlzIGlzCi0gICAgIGFuIGltcG9ydCwgb3IgTlVMTCBpZiB0aGlzIGlzIGEgcmVsb2MgZml4dXAuICBUaGlzIGZ1bmN0aW9uCi0gICAgIHNob3VsZCBzZXQgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBzZWN0aW9uIHdoaWNoIHRoZSByZWxvYwotICAgICBiZWxvbmdzIGluLCBhbmQgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUgcmVsb2MgaXRzZWxmOyBpdCBkb2VzCi0gICAgIG5vdCBuZWVkIHRvIGZpbGwgaW4gdGhlIHN5bV9wdHJfcHRyIGZpZWxkIGZvciBhIHJlbG9jIGFnYWluc3QgYW4KLSAgICAgaW1wb3J0IHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCpubG1fcmVhZF9yZWxvYykgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosCi0JCQkJICAgICBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci0gIC8qIFRvIG1ha2Ugb2JqY29weSB0byBhbiBpMzg2IE5MTSB3b3JrLCB0aGUgaTM4NiBiYWNrZW5kIG5lZWRzIGEKLSAgICAgY2hhbmNlIHRvIHdvcmsgb3ZlciB0aGUgcmVsb2NzLiAgVGhpcyBpcyBhIGJpdCBpY2t5LiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9tYW5nbGVfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGRhdGEsCi0JCQkJCWJmZF92bWEgb2Zmc2V0LAotCQkJCQliZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0gIC8qIFJlYWQgYW4gaW1wb3J0IHJlY29yZCBmcm9tIGFiZmQuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMKLSAgICAgd2VyZSBpbiBhIG1hY2hpbmUtZGVwZW5kZW50IGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZS4gKi8KLSAgYm9vbGVhbiAoKm5sbV9yZWFkX2ltcG9ydCkgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLSAgLyogV3JpdGUgYW4gaW1wb3J0IHJlY29yZCB0byBhYmZkLiAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX2ltcG9ydCkgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotICAvKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gIFRoaXMgbWF5IGJlIE5VTEwsIGluIHdoaWNoCi0gICAgIGNhc2UgYSBkZWZhdWx0IG1ldGhvZCB3aWxsIGJlIHVzZWQuICAqLwotICBib29sZWFuICgqbmxtX3NldF9wdWJsaWNfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLSAgLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICBUaGlzIG1heSBiZQotICAgICBOVUxMLCBpbiB3aGljaCBjYXNlIGEgZGVmYXVsdCBtZXRob2Qgd2lsbCBiZSB1c2VkLiAgKi8KLSAgYmZkX3ZtYSAoKm5sbV9nZXRfcHVibGljX29mZnNldCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotICAvKiBTd2FwIHRoZSBmaXhlZCBoZWFkZXIgaW4gYW5kIG91dCAqLwotICB2b2lkICgqbmxtX3N3YXBfZmhkcl9pbikgUEFSQU1TICgoYmZkICosCi0JCQkJICAgIFBUUiwKLQkJCQkgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqKSk7Ci0gIHZvaWQgKCpubG1fc3dhcF9maGRyX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJICAgICBzdHJ1Y3QgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlciAqLAotCQkJCSAgICAgUFRSKSk7Ci0gIC8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX2V4dGVybmFsKSBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwKLQkJCQkJIGFzeW1ib2wgKiwKLQkJCQkJIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9leHBvcnQpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZF92bWEpKTsKLX07Ci0KLSNkZWZpbmUgbmxtX2JhY2tlbmQoYmZkKSBcCi0gICgoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgKikoKGJmZCkgLT4geHZlYyAtPiBiYWNrZW5kX2RhdGEpKQotI2RlZmluZSBubG1fc2lnbmF0dXJlKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBzaWduYXR1cmUpCi0jZGVmaW5lIG5sbV9maXhlZF9oZWFkZXJfc2l6ZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gZml4ZWRfaGVhZGVyX3NpemUpCi0jZGVmaW5lIG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gb3B0aW9uYWxfcHJlZml4X3NpemUpCi0jZGVmaW5lIG5sbV9hcmNoaXRlY3R1cmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IGFyY2gpCi0jZGVmaW5lIG5sbV9tYWNoaW5lKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBtYWNoKQotI2RlZmluZSBubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBub191bmluaXRpYWxpemVkX2RhdGEpCi0jZGVmaW5lIG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9iYWNrZW5kX29iamVjdF9wKQotI2RlZmluZSBubG1fd3JpdGVfcHJlZml4X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9wcmVmaXgpCi0jZGVmaW5lIG5sbV9yZWFkX3JlbG9jX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9yZWFkX3JlbG9jKQotI2RlZmluZSBubG1fbWFuZ2xlX3JlbG9jc19mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fbWFuZ2xlX3JlbG9jcykKLSNkZWZpbmUgbmxtX3JlYWRfaW1wb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9yZWFkX2ltcG9ydCkKLSNkZWZpbmUgbmxtX3dyaXRlX2ltcG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfaW1wb3J0KQotI2RlZmluZSBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zZXRfcHVibGljX3NlY3Rpb24pCi0jZGVmaW5lIG5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fZ2V0X3B1YmxpY19vZmZzZXQpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc3dhcF9maGRyX2luKQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zd2FwX2ZoZHJfb3V0KQotI2RlZmluZSBubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2V4dGVybmFsKQotI2RlZmluZSBubG1fd3JpdGVfZXhwb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9leHBvcnQpCi0KLS8qIFRoZSBOTE0gY29kZSwgZGF0YSwgYW5kIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbnMgaGF2ZSBubyBuYW1lcyBkZWZpbmVkCi0gICBpbiB0aGUgTkxNLCBidXQgYmZkIHdhbnRzIHRvIGdpdmUgdGhlbSBuYW1lcywgc28gdXNlIHRoZSB0cmFkaXRpb25hbAotICAgVU5JWCBuYW1lcy4gICovCi0KLSNkZWZpbmUgTkxNX0NPREVfTkFNRQkJCSIudGV4dCIKLSNkZWZpbmUgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRQkiLmRhdGEiCi0jZGVmaW5lIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRQkiLmJzcyIKLQotI2VuZGlmIC8qIF9MSUJOTE1fSF8gKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJvYXN5cy5oIGIvYmZkL2xpYm9hc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2VhNTkuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYm9hc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBCRkQgaW50ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBPYXN5cyBmaWxlIGZvcm1hdCBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgU2NyYXdsZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3N5bWJvbAotewotICBhc3ltYm9sIHN5bWJvbDsKLX0gb2FzeXNfc3ltYm9sX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19yZWxvYyB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgX29hc3lzX3JlbG9jICpuZXh0OwotICB1bnNpZ25lZCBpbnQgc3ltYm9sOwotfSBvYXN5c19yZWxvY190eXBlOwotCi0KLSNkZWZpbmUgb2FzeXNfc3ltYm9sKHgpICgob2FzeXNfc3ltYm9sX3R5cGUgKikoeCkpCi0jZGVmaW5lIG9hc3lzX3Blcl9zZWN0aW9uKHgpICgob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqKSh4LT51c2VkX2J5X2JmZCkpCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19wZXJfc2VjdGlvbgotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBib29sZWFuIGhhZF92bWE7Ci0gIG9hc3lzX3JlbG9jX3R5cGUgKipyZWxvY190YWlsX3B0cjsKLSAgYmZkX3ZtYSBwYzsKLQotCi0gIGZpbGVfcHRyIGN1cnJlbnRfcG9zOwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9ieXRlOwotICBib29sZWFuIGluaXRpYWxpemVkOwotfSBvYXN5c19wZXJfc2VjdGlvbl90eXBlOwotCi0jZGVmaW5lIE5TRUNUSU9OUyAxMAotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfYXJfb2JzdGFjayB7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICBiZmQgKmFiZmQ7Ci19IG9hc3lzX2FyX29ic3RhY2tfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfbW9kdWxlX2luZm8gewotICBmaWxlX3B0ciBwb3M7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKm5hbWU7Ci19IG9hc3lzX21vZHVsZV9pbmZvX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9kYXRhIHsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlOwotICB1bnNpZ25lZCBpbnQgbW9kdWxlX2NvdW50OwotICB1bnNpZ25lZCBpbnQgbW9kdWxlX2luZGV4OwotfSBvYXN5c19hcl9kYXRhX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19kYXRhIHsKLSAgY2hhciAqc3RyaW5nczsKLSAgYXN5bWJvbCAqc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9zdHJpbmdfbGVuZ3RoOwotICBhc2VjdGlvbiAqc2VjdGlvbnNbT0FTWVNfTUFYX1NFQ19DT1VOVF07Ci0gIGZpbGVfcHRyIGZpcnN0X2RhdGFfcmVjb3JkOwotfSBvYXN5c19kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgT0FTWVNfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19vYmpfZGF0YSkKLSNkZWZpbmUgT0FTWVNfQVJfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19hcl9kYXRhKQotCmRpZmYgLS1naXQgYS9iZmQvbGlicGVpLmggYi9iZmQvbGlicGVpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDdlMzcuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYnBlaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIFBFL1BFSTsgY29tbW9uIGhlYWRlciBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0KLVBFL1BFSSByZWFycmFuZ2VtZW50IChhbmQgY29kZSBhZGRlZCk6IERvbm4gVGVycnkKLQkJCQkgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIFwKLSAgICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIFwKLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEVQNjQKLQotI2RlZmluZSBHRVRfT1BUSERSX0lNQUdFX0JBU0UgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9PUFRIRFJfSU1BR0VfQkFTRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX09QVEhEUl9TSVpFX09GX1NUQUNLX1JFU0VSVkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9PUFRIRFJfU0laRV9PRl9TVEFDS19SRVNFUlZFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfT1BUSERSX1NJWkVfT0ZfU1RBQ0tfQ09NTUlUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfT1BUSERSX1NJWkVfT0ZfU1RBQ0tfQ09NTUlUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9SRVNFUlZFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9SRVNFUlZFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9DT01NSVQgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9PUFRIRFJfU0laRV9PRl9IRUFQX0NPTU1JVCBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1BEQVRBX0VOVFJZIGJmZF9nZXRfNjQKLQotI2Vsc2UgLyogIUNPRkZfV0lUSF9QRVA2NCAqLwotCi0jZGVmaW5lIEdFVF9PUFRIRFJfSU1BR0VfQkFTRSBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgUFVUX09QVEhEUl9JTUFHRV9CQVNFIGJmZF9oX3B1dF8zMgotI2RlZmluZSBHRVRfT1BUSERSX1NJWkVfT0ZfU1RBQ0tfUkVTRVJWRSBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgUFVUX09QVEhEUl9TSVpFX09GX1NUQUNLX1JFU0VSVkUgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIEdFVF9PUFRIRFJfU0laRV9PRl9TVEFDS19DT01NSVQgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9PUFRIRFJfU0laRV9PRl9TVEFDS19DT01NSVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIEdFVF9PUFRIRFJfU0laRV9PRl9IRUFQX1JFU0VSVkUgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9PUFRIRFJfU0laRV9PRl9IRUFQX1JFU0VSVkUgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIEdFVF9PUFRIRFJfU0laRV9PRl9IRUFQX0NPTU1JVCBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgUFVUX09QVEhEUl9TSVpFX09GX0hFQVBfQ09NTUlUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBHRVRfUERBVEFfRU5UUlkgYmZkX2dldF8zMgotCi0jZW5kaWYgLyogIUNPRkZfV0lUSF9QRVA2NCAqLwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQsIGFuZCBhcmUgaW4gcGVpY29kZS5oOgotICAgY29mZl9zd2FwX3JlbG9jX2luCi0gICBpbnQgY29mZl9zd2FwX3JlbG9jX291dAotICAgY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSAgIGNvZmZfc3dhcF9zY25oZHJfaW4KLSAgIHBlX21rb2JqZWN0Ci0gICBwZV9ta29iamVjdF9ob29rICAqLwotCi0vKiBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBiZWxvdyBhcmUgY29tbW9uIGFjcm9zcyBhbGwgUEUvUEVJCi0gICBpbXBsZW1lbnRhdGlvbnMgYXJjaGl0ZWN0dXJlIHR5cGVzLCBhbmQgYWN0dWFsbHkgYXBwZWFyIGluCi0gICBwZWlnZW4uYy4gICovCi0KLXZvaWQgX2JmZF9wZWlfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX3N5bV9pbiBfYmZkX3BlaV9zd2FwX3N5bV9pbgotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9zeW1fb3V0IF9iZmRfcGVpX3N3YXBfc3ltX291dAotCi12b2lkIF9iZmRfcGVpX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hdXhfaW4gX2JmZF9wZWlfc3dhcF9hdXhfaW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfYXV4X291dCBcCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hdXhfb3V0IF9iZmRfcGVpX3N3YXBfYXV4X291dAotCi12b2lkIF9iZmRfcGVpX3N3YXBfbGluZW5vX2luIFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9saW5lbm9faW4gX2JmZF9wZWlfc3dhcF9saW5lbm9faW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfbGluZW5vX291dCBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfbGluZW5vX291dCBfYmZkX3BlaV9zd2FwX2xpbmVub19vdXQKLQotdm9pZCBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfaW4gX2JmZF9wZWlfc3dhcF9hb3V0aGRyX2luCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dAotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBfYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQKLQotYm9vbGVhbiBfYmZkX3BlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotYm9vbGVhbiBfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi12b2lkIF9iZmRfcGVfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLQotYm9vbGVhbiBfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLSNpZm5kZWYgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSNkZWZpbmUgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZW5kaWYKLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG5lZWRlZCBvbmx5IGZvciBPTkUgb2YgcGUgb3IgcGVpLCBidXQgZG9uJ3QKLSAgIG90aGVyd2lzZSB2YXJ5OyBwZWljb2RlLmggZml4ZXMgdXAgaWZkZWZzIGJ1dCB3ZSBwcm92aWRlIHRoZQotICAgcHJvdG90eXBlLiAgKi8KLQotdW5zaWduZWQgaW50IF9iZmRfcGVfb25seV9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci11bnNpZ25lZCBpbnQgX2JmZF9wZWlfb25seV9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci1ib29sZWFuIF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGlua2VyLmMgYi9iZmQvbGlua2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWVlNjUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpbmtlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgxNCArMCwwIEBACi0vKiBsaW5rZXIuYyAtLSBCRkQgbGlua2VyIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotCi0vKgotU0VDVElPTgotCUxpbmtlciBGdW5jdGlvbnMKLQotQGNpbmRleCBMaW5rZXIKLQlUaGUgbGlua2VyIHVzZXMgdGhyZWUgc3BlY2lhbCBlbnRyeSBwb2ludHMgaW4gdGhlIEJGRCB0YXJnZXQKLQl2ZWN0b3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHdyaXRlIHNwZWNpYWwgcm91dGluZXMgZm9yCi0JdGhlc2UgZW50cnkgcG9pbnRzIHdoZW4gY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kLCBzaW5jZQotCWdlbmVyaWMgdmVyc2lvbnMgYXJlIHByb3ZpZGVkLiAgSG93ZXZlciwgd3JpdGluZyB0aGVtIGNhbgotCXNwZWVkIHVwIGxpbmtpbmcgYW5kIG1ha2UgaXQgdXNlIHNpZ25pZmljYW50bHkgbGVzcyBydW50aW1lCi0JbWVtb3J5LgotCi0JVGhlIGZpcnN0IHJvdXRpbmUgY3JlYXRlcyBhIGhhc2ggdGFibGUgdXNlZCBieSB0aGUgb3RoZXIKLQlyb3V0aW5lcy4gIFRoZSBzZWNvbmQgcm91dGluZSBhZGRzIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0JZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSB0aGlyZCByb3V0aW5lIHRha2VzIGFsbCB0aGUKLQlvYmplY3QgZmlsZXMgYW5kIGxpbmtzIHRoZW0gdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBvdXRwdXQKLQlmaWxlLiAgVGhlc2Ugcm91dGluZXMgYXJlIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGxpbmtlciBwcm9wZXIKLQlkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHN5bWJvbHMgaW4gdGhlIG9iamVjdAotCWZpbGVzIHRoYXQgaXQgaXMgbGlua2luZy4gIFRoZSBsaW5rZXIgbWVyZWx5IGFycmFuZ2VzIHRoZQotCXNlY3Rpb25zIGFzIGRpcmVjdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBsZXRzIEJGRCBoYW5kbGUKLQl0aGUgZGV0YWlscyBvZiBzeW1ib2xzIGFuZCByZWxvY3MuCi0KLQlUaGUgc2Vjb25kIHJvdXRpbmUgYW5kIHRoaXJkIHJvdXRpbmVzIGFyZSBwYXNzZWQgYSBwb2ludGVyIHRvCi0JYSA8PHN0cnVjdCBiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlIChkZWZpbmVkIGluCi0JPDxiZmRsaW5rLmg+Pikgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGxpbmssCi0JaW5jbHVkaW5nIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAod2hpY2ggd2FzIGNyZWF0ZWQgYnkgdGhlCi0JZmlyc3Qgcm91dGluZSkgYW5kIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUgbGlua2VyCi0JcHJvcGVyLgotCi0JVGhlIGdlbmVyaWMgbGlua2VyIHJvdXRpbmVzIGFyZSBpbiA8PGxpbmtlci5jPj4sIGFuZCB1c2UgdGhlCi0JaGVhZGVyIGZpbGUgPDxnZW5saW5rLmg+Pi4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgYmFjawotCWVuZHMgd2hpY2ggaGF2ZSBpbXBsZW1lbnRlZCB2ZXJzaW9ucyBvZiB0aGVzZSByb3V0aW5lcyBhcmUKLQlhLm91dCAoaW4gPDxhb3V0eC5oPj4pIGFuZCBFQ09GRiAoaW4gPDxlY29mZi5jPj4pLiAgVGhlIGEub3V0Ci0Jcm91dGluZXMgYXJlIHVzZWQgYXMgZXhhbXBsZXMgdGhyb3VnaG91dCB0aGlzIHNlY3Rpb24uCi0KLUBtZW51CQotQCogQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZTo6Ci1AKiBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZTo6Ci1AKiBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rOjoKLUBlbmQgbWVudQotCi1JTk9ERQotQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlDcmVhdGluZyBhIGxpbmtlciBoYXNoIHRhYmxlCi0KLUBjaW5kZXggX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKQotCVRoZSBsaW5rZXIgcm91dGluZXMgbXVzdCBjcmVhdGUgYSBoYXNoIHRhYmxlLCB3aGljaCBtdXN0IGJlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+PiBkZXNjcmliZWQgaW4KLQk8PGJmZGxpbmsuYz4+LiAgQHhyZWZ7SGFzaCBUYWJsZXN9LCBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCi0JY3JlYXRlIGEgZGVyaXZlZCBoYXNoIHRhYmxlLiAgVGhpcyBlbnRyeSBwb2ludCBpcyBjYWxsZWQgdXNpbmcKLQl0aGUgdGFyZ2V0IHZlY3RvciBvZiB0aGUgbGlua2VyIG91dHB1dCBmaWxlLgotCi0JVGhlIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gZW50cnkgcG9pbnQgbXVzdCBhbGxvY2F0ZQotCWFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBkZXNpcmVkIGhhc2ggdGFibGUuICBJZiB0aGUKLQliYWNrIGVuZCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGJlCi0Jc3RvcmVkIHdpdGggdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHRoZSBlbnRyeSBwb2ludCBtYXkKLQlzaW1wbHkgY3JlYXRlIGEgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgTW9zdCBsaWtlbHksCi0JaG93ZXZlciwgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgbmVlZGVkLgotCi0JRm9yIGV4YW1wbGUsIHdpdGggZWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB0aGUgYS5vdXQKLQlsaW5rZXIga2VlcHMgdGhlIGluZGV4IHRoZSBzeW1ib2wgaGFzIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZQotCSh0aGlzIGluZGV4IG51bWJlciBpcyB1c2VkIHNvIHRoYXQgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmsgdGhlIHN5bWJvbCBpbmRleCB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSBjYW4gYmUgcXVpY2tseQotCWZpbGxlZCBpbiB3aGVuIGNvcHlpbmcgb3ZlciBhIHJlbG9jKS4gIFRoZSBhLm91dCBsaW5rZXIgY29kZQotCWRlZmluZXMgdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgYSBoYXNoIHRhYmxlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+Pi4gIFRoZSBhLm91dCBsaW5rZXIKLQloYXNoIHRhYmxlIGlzIGNyZWF0ZWQgYnkgdGhlIGZ1bmN0aW9uCi0JPDxOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk+PjsgaXQgc2ltcGx5IGFsbG9jYXRlcwotCXNwYWNlIGZvciB0aGUgaGFzaCB0YWJsZSwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZXR1cm5zIGEKLQlwb2ludGVyIHRvIGl0LgotCi0JV2hlbiB3cml0aW5nIHRoZSBsaW5rZXIgcm91dGluZXMgZm9yIGEgbmV3IGJhY2sgZW5kLCB5b3Ugd2lsbAotCWdlbmVyYWxseSBub3Qga25vdyBleGFjdGx5IHdoaWNoIGZpZWxkcyB3aWxsIGJlIHJlcXVpcmVkIHVudGlsCi0JeW91IGhhdmUgZmluaXNoZWQuICBZb3Ugc2hvdWxkIHNpbXBseSBjcmVhdGUgYSBuZXcgaGFzaCB0YWJsZQotCXdoaWNoIGRlZmluZXMgbm8gYWRkaXRpb25hbCBmaWVsZHMsIGFuZCB0aGVuIHNpbXBseSBhZGQgZmllbGRzCi0JYXMgdGhleSBiZWNvbWUgbmVjZXNzYXJ5LgotCi1JTk9ERQotQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIENyZWF0aW5nIGEgTGlua2VyIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyB0byB0aGUgaGFzaCB0YWJsZQotCi1AY2luZGV4IF9iZmRfbGlua19hZGRfc3ltYm9scyBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfbGlua19hZGRfc3ltYm9scykKLQlUaGUgbGlua2VyIHByb3BlciB3aWxsIGNhbGwgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4KLQllbnRyeSBwb2ludCBmb3IgZWFjaCBvYmplY3QgZmlsZSBvciBhcmNoaXZlIHdoaWNoIGlzIHRvIGJlCi0JbGlua2VkICh0eXBpY2FsbHkgdGhlc2UgYXJlIHRoZSBmaWxlcyBuYW1lZCBvbiB0aGUgY29tbWFuZAotCWxpbmUsIGJ1dCBzb21lIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgbGlua2VyIHNjcmlwdCkuICBUaGUKLQllbnRyeSBwb2ludCBpcyByZXNwb25zaWJsZSBmb3IgZXhhbWluaW5nIHRoZSBmaWxlLiAgRm9yIGFuCi0Jb2JqZWN0IGZpbGUsIEJGRCBtdXN0IGFkZCBhbnkgcmVsZXZhbnQgc3ltYm9sIGluZm9ybWF0aW9uIHRvCi0JdGhlIGhhc2ggdGFibGUuICBGb3IgYW4gYXJjaGl2ZSwgQkZEIG11c3QgZGV0ZXJtaW5lIHdoaWNoCi0JZWxlbWVudHMgb2YgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHVzZWQgYW5kIGFkZGluZyB0aGVtIHRvIHRoZQotCWxpbmsuCi0KLQlUaGUgYS5vdXQgdmVyc2lvbiBvZiB0aGlzIGVudHJ5IHBvaW50IGlzCi0JPDxOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scyk+Pi4KLQotQG1lbnUKLUAqIERpZmZlcmluZyBmaWxlIGZvcm1hdHM6OgotQCogQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZTo6Ci1AKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1EaWZmZXJpbmcgZmlsZSBmb3JtYXRzLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlEaWZmZXJpbmcgZmlsZSBmb3JtYXRzCi0KLQlOb3JtYWxseSBhbGwgdGhlIGZpbGVzIGludm9sdmVkIGluIGEgbGluayB3aWxsIGJlIG9mIHRoZSBzYW1lCi0JZm9ybWF0LCBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBsaW5rIHRvZ2V0aGVyIGRpZmZlcmVudAotCWZvcm1hdCBvYmplY3QgZmlsZXMsIGFuZCB0aGUgYmFjayBlbmQgbXVzdCBzdXBwb3J0IHRoYXQuICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGVudHJ5IHBvaW50IGlzIGNhbGxlZCB2aWEgdGhlIHRhcmdldAotCXZlY3RvciBvZiB0aGUgZmlsZSB0byBiZSBhZGRlZC4gIFRoaXMgaGFzIGFuIGltcG9ydGFudAotCWNvbnNlcXVlbmNlOiB0aGUgZnVuY3Rpb24gbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgaGFzaCB0YWJsZQotCWlzIHRoZSB0eXBlIGNyZWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKLQk8PF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZT4+IHZlY3Rvci4gIEFsbCB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIGNhbiBhc3N1bWUgYWJvdXQgdGhlIGhhc2gKLQl0YWJsZSBpcyB0aGF0IGl0IGlzIGRlcml2ZWQgZnJvbSA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfdGFibGU+Pi4KLQotCVNvbWV0aW1lcyB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiBtdXN0IHN0b3JlCi0Jc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGJ5IHRoZQotCTw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24uICBJbiBzdWNoIGEgY2FzZSB0aGUgPDxjcmVhdG9yPj4KLQlmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGJlIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0JaGFzaCB0YWJsZSB3YXMgY3JlYXRlZCBieSBhbiBvYmplY3QgZmlsZSBvZiB0aGUgc2FtZSBmb3JtYXQuCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGEKLQloYXNoIGVudHJ5IHdpdGhvdXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIGFkZGVkIGJ5IHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24uICBBIGhhc2ggZW50cnkgd2l0aG91dAotCWV4dHJhIGluZm9ybWF0aW9uIHdpbGwgYWxzbyBvY2N1ciB3aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JZGlyZWN0cyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbC4gIE5vdGUgdGhhdCwgcmVnYXJkbGVzcwotCW9mIGhvdyBhIGhhc2ggdGFibGUgZW50cnkgaXMgYWRkZWQsIGFsbCB0aGUgZmllbGRzIHdpbGwgYmUKLQlpbml0aWFsaXplZCB0byBzb21lIHNvcnQgb2YgbnVsbCB2YWx1ZSBieSB0aGUgaGFzaCB0YWJsZSBlbnRyeQotCWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLgotCi0JU2VlIDw8ZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzPj4gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvCi0JY2hlY2sgdGhlIDw8Y3JlYXRvcj4+IGZpZWxkIGJlZm9yZSBzYXZpbmcgaW5mb3JtYXRpb24gKGluIHRoaXMKLQljYXNlLCB0aGUgRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgaW4gYQotCWhhc2ggdGFibGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsIERpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZQotCi0JV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbiBvYmplY3QKLQlmaWxlLCBpdCBtdXN0IGFkZCBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgaW4gdGhhdAotCW9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGFjdHVhbCB3b3JrIG9mIGFkZGluZyB0aGUKLQlzeW1ib2wgdG8gdGhlIGhhc2ggdGFibGUgaXMgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcKLQlhbGwgdGhlIHN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGUgYW5kIHBhc3NpbmcgdGhlIGNvcnJlY3QKLQlpbmZvcm1hdGlvbiB0byA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uCi0KLQlUaGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIHNob3VsZCBub3QgdXNlCi0JPDxiZmRfY2Fub25pY2FsaXplX3N5bXRhYj4+IHRvIHJlYWQgdGhlIHN5bWJvbHMuICBUaGUgcG9pbnQgb2YKLQlwcm92aWRpbmcgdGhpcyByb3V0aW5lIGlzIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nCi0JdGhlIHN5bWJvbHMgaW50byBnZW5lcmljIDw8YXN5bWJvbD4+IHN0cnVjdHVyZXMuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4gaGFuZGxlcyB0aGUgZGV0YWlscyBvZgotCWNvbWJpbmluZyBjb21tb24gc3ltYm9scywgd2FybmluZyBhYm91dCBtdWx0aXBsZSBkZWZpbml0aW9ucywKLQlhbmQgc28gZm9ydGguICBJdCB0YWtlcyBhcmd1bWVudHMgd2hpY2ggZGVzY3JpYmUgdGhlIHN5bWJvbCB0bwotCWFkZCwgbm90YWJseSBzeW1ib2wgZmxhZ3MsIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldC4gIFRoZQotCXN5bWJvbCBmbGFncyBpbmNsdWRlIHN1Y2ggdGhpbmdzIGFzIDw8QlNGX1dFQUs+PiBvcgotCTw8QlNGX0lORElSRUNUPj4uICBUaGUgc2VjdGlvbiBpcyBhIHNlY3Rpb24gaW4gdGhlIG9iamVjdAotCWZpbGUsIG9yIHNvbWV0aGluZyBsaWtlIDw8YmZkX3VuZF9zZWN0aW9uX3B0cj4+IGZvciBhbiB1bmRlZmluZWQKLQlzeW1ib2wgb3IgPDxiZmRfY29tX3NlY3Rpb25fcHRyPj4gZm9yIGEgY29tbW9uIHN5bWJvbC4KLQotCUlmIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgaXMgYWxzbyBnb2luZyB0byBuZWVkIHRvCi0JcmVhZCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgotCXJvdXRpbmUgc2hvdWxkIHNhdmUgaXQgc29tZXdoZXJlIGF0dGFjaGVkIHRvIHRoZSBvYmplY3QgZmlsZQotCUJGRC4gIEhvd2V2ZXIsIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgb25seSBiZSBzYXZlZCBpZiB0aGUKLQk8PGtlZXBfbWVtb3J5Pj4gZmllbGQgb2YgdGhlIDw8aW5mbz4+IGFyZ3VtZW50IGlzIHRydWUsIHNvCi0JdGhhdCB0aGUgPDwtbm8ta2VlcC1tZW1vcnk+PiBsaW5rZXIgc3dpdGNoIGlzIGVmZmVjdGl2ZS4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSBpcwotCTw8YW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scz4+LCBhbmQgbW9zdCBvZiB0aGUgaW50ZXJlc3RpbmcKLQl3b3JrIGlzIGluIDw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4uICBUaGUgbGF0dGVyIHNhdmVzCi0JcG9pbnRlcnMgdG8gdGhlIGhhc2ggdGFibGVzIGVudHJpZXMgY3JlYXRlZCBieQotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBpbmRleGVkIGJ5IHN5bWJvbCBudW1iZXIsCi0Jc28gdGhhdCB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gY2FsbAotCXRoZSBoYXNoIHRhYmxlIGxvb2t1cCByb3V0aW5lIHRvIGxvY2F0ZSB0aGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsICwgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUKLQotCVdoZW4gdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyBwYXNzZWQgYW4KLQlhcmNoaXZlLCBpdCBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZQotCWFyY2hpdmUgYW5kIGRlY2lkZSB3aGljaCBlbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUKLQlpbmNsdWRlZCBpbiB0aGUgbGluay4gIEZvciBlYWNoIHN1Y2ggZWxlbWVudCBpdCBtdXN0IGNhbGwgdGhlCi0JPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrLCBhbmQgaXQgbXVzdCBhZGQgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCUluIG1vc3QgY2FzZXMgdGhlIHdvcmsgb2YgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIGluIHRoZQotCWFyY2hpdmUgc2hvdWxkIGJlIGRvbmUgYnkgdGhlCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gYnVpbGRzIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBhbmQKLQlsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHNlZSB3aGljaAotCWVsZW1lbnRzIHNob3VsZCBiZSBpbmNsdWRlZC4KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBpcyBwYXNzZWQgYSBmdW5jdGlvbgotCXRvIGNhbGwgdG8gbWFrZSB0aGUgZmluYWwgZGVjaXNpb24gYWJvdXQgYWRkaW5nIGFuIGFyY2hpdmUKLQllbGVtZW50IHRvIHRoZSBsaW5rIGFuZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQotCXN5bWJvbHMgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIGZ1bmN0aW9uIHBhc3NlZCB0bwotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IG11c3QgcmVhZCB0aGUKLQlzeW1ib2xzIG9mIHRoZSBhcmNoaXZlIGVsZW1lbnQgYW5kIGRlY2lkZSB3aGV0aGVyIHRoZSBhcmNoaXZlCi0JZWxlbWVudCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiB0aGUgZWxlbWVudCBpcyB0bwotCWJlIGluY2x1ZGVkLCB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrCi0Jcm91dGluZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBlbGVtZW50IGFzIGFuIGFyZ3VtZW50LCBhbmQKLQl0aGUgZWxlbWVudHMgc3ltYm9scyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZQotCWp1c3QgYXMgdGhvdWdoIHRoZSBlbGVtZW50IGhhZCBpdHNlbGYgYmVlbiBwYXNzZWQgdG8gdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4KLQotCVdoZW4gdGhlIGEub3V0IDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gcmVjZWl2ZXMgYW4KLQlhcmNoaXZlLCBpdCBjYWxscyA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PgotCXBhc3NpbmcgPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gYXMgdGhlIGZ1bmN0aW9uCi0JYXJndW1lbnQuIDw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCi0JPDxhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scz4+LiAgSWYgdGhlIGxhdHRlciBkZWNpZGVzIHRvIGFkZAotCXRoZSBlbGVtZW50IChhbiBlbGVtZW50IGlzIG9ubHkgYWRkZWQgaWYgaXQgcHJvdmlkZXMgYSByZWFsLAotCW5vbi1jb21tb24sIGRlZmluaXRpb24gZm9yIGEgcHJldmlvdXNseSB1bmRlZmluZWQgb3IgY29tbW9uCi0Jc3ltYm9sKSBpdCBjYWxscyB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbGJhY2sgYW5kIHRoZW4KLQk8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBjYWxscwotCTw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4gdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzIHRvIHRoZQotCWxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIEVDT0ZGIGJhY2sgZW5kIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBkb2VzIG5vdCBub3JtYWxseQotCWNhbGwgPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4sIGJlY2F1c2UgRUNPRkYKLQlhcmNoaXZlcyBhbHJlYWR5IGNvbnRhaW4gYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgRUNPRkYKLQliYWNrIGVuZCBzZWFyY2hlcyB0aGUgYXJjaGl2ZSBpdHNlbGYgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCi0JY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZS4KLQotSU5PREUKLVBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssICwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlQZXJmb3JtaW5nIHRoZSBmaW5hbCBsaW5rCi0KLUBjaW5kZXggX2JmZF9saW5rX2ZpbmFsX2xpbmsgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2ZpbmFsX2xpbmspCi0JV2hlbiBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIHRoZSBsaW5rZXIgY2FsbHMKLQl0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCBvZiB0aGUgb3V0cHV0IEJGRC4gIFRoaXMKLQlyb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLAotCXdoaWNoIGhhcyBzZXZlcmFsIGFzcGVjdHMuICBJdCBtdXN0IHJlbG9jYXRlIHRoZSBjb250ZW50cyBvZgotCXRoZSBpbnB1dCBzZWN0aW9ucyBhbmQgY29weSB0aGUgZGF0YSBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0JSXQgbXVzdCBidWlsZCBhbiBvdXRwdXQgc3ltYm9sIHRhYmxlIGluY2x1ZGluZyBhbnkgbG9jYWwKLQlzeW1ib2xzIGZyb20gdGhlIGlucHV0IGZpbGVzIGFuZCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUKLQloYXNoIHRhYmxlLiAgV2hlbiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgaXQgbXVzdAotCW1vZGlmeSB0aGUgaW5wdXQgcmVsb2NzIGFuZCB3cml0ZSB0aGVtIGludG8gdGhlIG91dHB1dCBmaWxlLgotCVRoZXJlIG1heSBhbHNvIGJlIG9iamVjdCBmb3JtYXQgZGVwZW5kZW50IHdvcmsgdG8gYmUgZG9uZS4KLQotCVRoZSBsaW5rZXIgd2lsbCBhbHNvIGNhbGwgdGhlIDw8d3JpdGVfb2JqZWN0X2NvbnRlbnRzPj4gZW50cnkKLQlwb2ludCB3aGVuIHRoZSBCRkQgaXMgY2xvc2VkLiAgVGhlIHR3byBlbnRyeSBwb2ludHMgbXVzdCB3b3JrCi0JdG9nZXRoZXIgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQgZmlsZS4KLQotCVRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIHdvcmtzIGFyZSBpbmV2aXRhYmx5IGRlcGVuZGVudCB1cG9uCi0JdGhlIHNwZWNpZmljIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBhLm91dAotCTw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyA8PE5BTUUoYW91dCxmaW5hbF9saW5rKT4+LgotCi1AbWVudQotQCogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlcjo6Ci1AKiBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzOjoKLUAqIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyCi0KLQlCZWZvcmUgdGhlIGxpbmtlciBjYWxscyB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCwKLQlpdCBzZXRzIHVwIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZnVuY3Rpb24gdG8gdXNlLgotCi0JVGhlIDw8aW5wdXRfYmZkcz4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQl3aWxsIHBvaW50IHRvIGEgbGlzdCBvZiBhbGwgdGhlIGlucHV0IGZpbGVzIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuICBUaGVzZSBmaWxlcyBhcmUgbGlua2VkIHRocm91Z2ggdGhlIDw8bGlua19uZXh0Pj4gZmllbGQKLQlvZiB0aGUgPDxiZmQ+PiBzdHJ1Y3R1cmUuCi0KLQlFYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSBhIGxpc3Qgb2YKLQk8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIHRoZSA8PGxpbmtfb3JkZXJfaGVhZD4+Ci0JZmllbGQgKHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbgotCTw8YmZkbGluay5oPj4pLiAgVGhlc2Ugc3RydWN0dXJlcyBkZXNjcmliZSBob3cgdG8gY3JlYXRlIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiB0aGUgY29udGVudHMgb2YKLQl2YXJpb3VzIGlucHV0IHNlY3Rpb25zLCBmaWxsIGNvbnN0YW50cywgYW5kLCBldmVudHVhbGx5LCBvdGhlcgotCXR5cGVzIG9mIGluZm9ybWF0aW9uLiAgVGhleSBhbHNvIGRlc2NyaWJlIHJlbG9jcyB0aGF0IG11c3QgYmUKLQljcmVhdGVkIGJ5IHRoZSBCRkQgYmFja2VuZCwgYnV0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBpbnB1dAotCWZpbGU7IHRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IC1Vciwgd2hpY2ggYnVpbGRzIGNvbnN0cnVjdG9ycwotCXdoaWxlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuCi0KLUlOT0RFCi1SZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUsIEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBzaG91bGQgbG9vayB0aHJvdWdoIHRoZQotCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaCBzZWN0aW9uIG9mIHRoZQotCW91dHB1dCBmaWxlLiAgRWFjaCA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgc2hvdWxkIGVpdGhlciBiZQotCWhhbmRsZWQgc3BlY2lhbGx5LCBvciBpdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbgotCTw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiB3aGljaCB3aWxsIGRvIHRoZSByaWdodCB0aGluZwotCSg8PF9iZmRfZGVmYXVsdF9saW5rX29yZGVyPj4gaXMgZGVmaW5lZCBpbiA8PGxpbmtlci5jPj4pLgotCi0JRm9yIGVmZmljaWVuY3ksIGEgPDxsaW5rX29yZGVyPj4gb2YgdHlwZQotCTw8YmZkX2luZGlyZWN0X2xpbmtfb3JkZXI+PiB3aG9zZSBhc3NvY2lhdGVkIHNlY3Rpb24gYmVsb25ncwotCXRvIGEgQkZEIG9mIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IEJGRCBtdXN0IGJlIGhhbmRsZWQKLQlzcGVjaWFsbHkuICBUaGlzIHR5cGUgb2YgPDxsaW5rX29yZGVyPj4gZGVzY3JpYmVzIHBhcnQgb2YgYW4KLQlvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiBhIHNlY3Rpb24gYmVsb25naW5nIHRvIG9uZSBvZiB0aGUKLQlpbnB1dCBmaWxlcy4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCByZWFkIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFuZCBhbnkgYXNzb2NpYXRlZCByZWxvY3MsIGFwcGx5IHRoZQotCXJlbG9jcyB0byB0aGUgc2VjdGlvbiBjb250ZW50cywgYW5kIHdyaXRlIG91dCB0aGUgbW9kaWZpZWQKLQlzZWN0aW9uIGNvbnRlbnRzLiAgSWYgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUKLQlyZWxvY3MgdGhlbXNlbHZlcyBtdXN0IGFsc28gYmUgbW9kaWZpZWQgYW5kIHdyaXR0ZW4gb3V0LgotCi1AZmluZGV4IF9iZmRfcmVsb2NhdGVfY29udGVudHMKLUBmaW5kZXggX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0JVGhlIGZ1bmN0aW9ucyA8PF9iZmRfcmVsb2NhdGVfY29udGVudHM+PiBhbmQKLQk8PF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZT4+IHByb3ZpZGUgc29tZSBnZW5lcmFsIHN1cHBvcnQgZm9yCi0JcGVyZm9ybWluZyB0aGUgYWN0dWFsIHJlbG9jYXRpb25zLCBub3RhYmx5IG92ZXJmbG93IGNoZWNraW5nLgotCVRoZWlyIGFyZ3VtZW50cyBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW1ib2wgdGhlCi0JcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGFuZCBhIDw8cmVsb2NfaG93dG9fdHlwZT4+IGFyZ3VtZW50Ci0Jd2hpY2ggZGVzY3JpYmVzIHRoZSByZWxvY2F0aW9uIHRvIHBlcmZvcm0uICBUaGVzZSBmdW5jdGlvbnMKLQlhcmUgZGVmaW5lZCBpbiA8PHJlbG9jLmM+Pi4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIHJlYWRpbmcsIHJlbG9jYXRpbmcsIGFuZAotCXdyaXRpbmcgc2VjdGlvbiBjb250ZW50cyBpcyA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uPj4uICBUaGUKLQlhY3R1YWwgcmVsb2NhdGlvbiBpcyBkb25lIGluIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkPj4KLQlhbmQgPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQ+Pi4KLQotSU5PREUKLVdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgLCBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBtdXN0IGdhdGhlciBhbGwgdGhlIHN5bWJvbHMKLQlpbiB0aGUgaW5wdXQgZmlsZXMgYW5kIHdyaXRlIHRoZW0gb3V0LiAgSXQgbXVzdCBhbHNvIHdyaXRlIG91dAotCWFsbCB0aGUgc3ltYm9scyBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIG11c3QgYmUKLQljb250cm9sbGVkIGJ5IHRoZSA8PHN0cmlwPj4gYW5kIDw8ZGlzY2FyZD4+IGZpZWxkcyBvZiB0aGUKLQk8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUuCi0KLQlUaGUgbG9jYWwgc3ltYm9scyBvZiB0aGUgaW5wdXQgZmlsZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0JZW50ZXJlZCBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+Ci0Jcm91dGluZSBtdXN0IGNvbnNpZGVyIGVhY2ggaW5wdXQgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9scwotCWluIHRoZSBvdXRwdXQgZmlsZS4gIEl0IG1heSBiZSBjb252ZW5pZW50IHRvIGRvIHRoaXMgd2hlbgotCWxvb2tpbmcgdGhyb3VnaCB0aGUgPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcywgb3IgaXQgbWF5IGJlCi0JZG9uZSBieSBzdGVwcGluZyB0aHJvdWdoIHRoZSA8PGlucHV0X2JmZHM+PiBsaXN0LgotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBtdXN0IGFsc28gdHJhdmVyc2UgdGhlIGdsb2JhbAotCWhhc2ggdGFibGUgdG8gZ2F0aGVyIGFsbCB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICBJdAotCWlzIHBvc3NpYmxlIHRoYXQgbW9zdCBvZiB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgbWF5IGJlCi0Jd3JpdHRlbiBvdXQgd2hlbiBjb25zaWRlcmluZyB0aGUgc3ltYm9scyBvZiBlYWNoIGlucHV0IGZpbGUsCi0JYnV0IGl0IGlzIHN0aWxsIG5lY2Vzc2FyeSB0byB0cmF2ZXJzZSB0aGUgaGFzaCB0YWJsZSBzaW5jZSB0aGUKLQlsaW5rZXIgc2NyaXB0IG1heSBoYXZlIGRlZmluZWQgc29tZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCWFueSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLQlUaGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQljb250cm9scyB3aGljaCBzeW1ib2xzIGFyZSB3cml0dGVuIG91dC4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKLQlhcmUgbGlzdGVkIGluIDw8YmZkbGluay5oPj4uICBJZiB0aGUgdmFsdWUgaXMgPDxzdHJpcF9zb21lPj4sCi0JdGhlbiB0aGUgPDxrZWVwX2hhc2g+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4KLQlzdHJ1Y3R1cmUgaXMgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcDsgZWFjaCBzeW1ib2wKLQlzaG91bGQgYmUgbG9va2VkIHVwIGluIHRoaXMgaGFzaCB0YWJsZSwgYW5kIG9ubHkgc3ltYm9scyB3aGljaAotCWFyZSBwcmVzZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLQlJZiB0aGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQlwZXJtaXRzIGxvY2FsIHN5bWJvbHMgdG8gYmUgd3JpdHRlbiBvdXQsIHRoZSA8PGRpc2NhcmQ+PiBmaWVsZAotCWlzIHVzZWQgdG8gZnVydGhlciBjb250cm9scyB3aGljaCBsb2NhbCBzeW1ib2xzIGFyZSBpbmNsdWRlZAotCWluIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoZSB2YWx1ZSBpcyA8PGRpc2NhcmRfbD4+LCB0aGVuIGFsbAotCWxvY2FsIHN5bWJvbHMgd2hpY2ggYmVnaW4gd2l0aCBhIGNlcnRhaW4gcHJlZml4IGFyZSBkaXNjYXJkZWQ7Ci0JdGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8PGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lPj4gZW50cnkgcG9pbnQuCi0KLQlUaGUgYS5vdXQgYmFja2VuZCBoYW5kbGVzIHN5bWJvbHMgYnkgY2FsbGluZwotCTw8YW91dF9saW5rX3dyaXRlX3N5bWJvbHM+PiBvbiBlYWNoIGlucHV0IEJGRCBhbmQgdGhlbgotCXRyYXZlcnNpbmcgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIHdpdGggdGhlIGZ1bmN0aW9uCi0JPDxhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sPj4uICBJdCBidWlsZHMgYSBzdHJpbmcgdGFibGUKLQl3aGlsZSB3cml0aW5nIG91dCB0aGUgc3ltYm9scywgd2hpY2ggaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0Ci0JZmlsZSBhdCB0aGUgZW5kIG9mIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCi0qLwotCi1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfc2l6ZV90eXBlIGNvdW50LCBhc3ltYm9sICoqLAotCSAgIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJmZCAqaGFzaF9lbnRyeV9iZmQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgc2V0X3N5bWJvbF9mcm9tX2hhc2gKLSAgUEFSQU1TICgoYXN5bWJvbCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QgKnBzeW1hbGxvYywgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2ZpbGxfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBib29sZWFuKSk7Ci0KLS8qIFRoZSBsaW5rIGhhc2ggdGFibGUgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gYmZkbGluay5oLiAgSXQgcHJvdmlkZXMKLSAgIGEgYmFzZSBoYXNoIHRhYmxlIHdoaWNoIHRoZSBiYWNrZW5kIHNwZWNpZmljIGhhc2ggdGFibGVzIGFyZSBidWlsdAotICAgdXBvbi4gICovCi0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfbmV3OwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgbGluayBoYXNoIHRhYmxlLiAgVGhlIEJGRCBhcmd1bWVudCBpcyB0aGUgb25lCi0gICByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmNyZWF0b3IgPSBhYmZkLT54dmVjOwotICB0YWJsZS0+dW5kZWZzID0gTlVMTDsKLSAgdGFibGUtPnVuZGVmc190YWlsID0gTlVMTDsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOwotfQotCi0vKiBMb29rIHVwIGEgc3ltYm9sIGluIGEgbGluayBoYXNoIHRhYmxlLiAgSWYgZm9sbG93IGlzIHRydWUsIHdlCi0gICBmb2xsb3cgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCBhbmQgYmZkX2xpbmtfaGFzaF93YXJuaW5nIGxpbmtzIHRvCi0gICB0aGUgcmVhbCBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCi1iZmRfbGlua19oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX2xvb2t1cCAoJnRhYmxlLT50YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpKTsKLQotICBpZiAoZm9sbG93ICYmIHJldCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICB3aGlsZSAocmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IHJldC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JcmV0ID0gcmV0LT51LmkubGluazsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTG9vayB1cCBhIHN5bWJvbCBpbiB0aGUgbWFpbiBsaW5rZXIgaGFzaCB0YWJsZSBpZiB0aGUgc3ltYm9sIG1pZ2h0Ci0gICBiZSB3cmFwcGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZWZlcmVuY2VzIHRvIGFuCi0gICB1bmRlZmluZWQgc3ltYm9sLCBub3QgZm9yIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKgotYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgaWYgKGluZm8tPndyYXBfaGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmw7Ci0KLSAgICAgIGwgPSBzdHJpbmc7Ci0gICAgICBpZiAoKmwgPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkKLQkrK2w7Ci0KLSN1bmRlZiBXUkFQCi0jZGVmaW5lIFdSQVAgIl9fd3JhcF8iCi0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPndyYXBfaGFzaCwgbCwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JhcHBlZC4gIFdlIHdhbnQgdG8gcmVwbGFjZSBhbGwKLSAgICAgICAgICAgICByZWZlcmVuY2VzIHRvIFNZTSB3aXRoIHJlZmVyZW5jZXMgdG8gX193cmFwX1NZTS4gICovCi0KLQkgIG4gPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGwpICsgc2l6ZW9mIFdSQVAgKyAxKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBXUkFQKTsKLQkgIHN0cmNhdCAobiwgbCk7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG4sIGNyZWF0ZSwgdHJ1ZSwgZm9sbG93KTsKLQkgIGZyZWUgKG4pOwotCSAgcmV0dXJuIGg7Ci0JfQotCi0jdW5kZWYgV1JBUAotCi0jdW5kZWYgUkVBTAotI2RlZmluZSBSRUFMICJfX3JlYWxfIgotCi0gICAgICBpZiAoKmwgPT0gJ18nCi0JICAmJiBzdHJuY21wIChsLCBSRUFMLCBzaXplb2YgUkVBTCAtIDEpID09IDAKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsICsgc2l6ZW9mIFJFQUwgLSAxLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBfX3JlYWxfU1lNLCB3aGVyZSBTWU0gaXMgYmVpbmcKLSAgICAgICAgICAgICB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIF9fcmVhbF9TWU0KLSAgICAgICAgICAgICB3aXRoIHJlZmVyZW5jZXMgdG8gU1lNLiAgKi8KLQotCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCArIHNpemVvZiBSRUFMIC0gMSkgKyAyKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBsICsgc2l6ZW9mIFJFQUwgLSAxKTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOwotCSAgZnJlZSAobik7Ci0JICByZXR1cm4gaDsKLQl9Ci0KLSN1bmRlZiBSRUFMCi0gICAgfQotCi0gIHJldHVybiBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdyk7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICBUaGUgb25seSByZWFzb24gdGhpcyBpcyBub3QgYQotICAgbWFjcm8gaXMgdG8gZG8gYmV0dGVyIHR5cGUgY2hlY2tpbmcuICBUaGlzIGNvZGUgcHJlc3VtZXMgdGhhdCBhbgotICAgYXJndW1lbnQgcGFzc2VkIGFzIGEgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogbWF5IGJlIGNhdWdodCBhcyBhCi0gICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIHdpdGggbm8gZXhwbGljaXQgY2FzdCByZXF1aXJlZCBvbiB0aGUKLSAgIGNhbGwuICAqLwotCi12b2lkIAotYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAodGFibGUsIGZ1bmMsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotICAgICBQVFIgaW5mbzsKLXsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKCZ0YWJsZS0+dGFibGUsCi0JCSAgICAgKChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpCi0JCSAgICAgIGZ1bmMpLAotCQkgICAgIGluZm8pOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlIHVuZGVmcyBsaXN0LiAgKi8KLQotSU5MSU5FIHZvaWQKLWJmZF9saW5rX2FkZF91bmRlZiAodGFibGUsIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIEJGRF9BU1NFUlQgKGgtPm5leHQgPT0gTlVMTCk7Ci0gIGlmICh0YWJsZS0+dW5kZWZzX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmc190YWlsLT5uZXh0ID0gaDsKLSAgaWYgKHRhYmxlLT51bmRlZnMgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmcyA9IGg7Ci0gIHRhYmxlLT51bmRlZnNfdGFpbCA9IGg7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR3JhYiB0aGUgc3ltYm9scyBmb3IgYW4gb2JqZWN0IGZpbGUgd2hlbiBkb2luZyBhIGdlbmVyaWMgbGluay4gIFdlCi0gICBzdG9yZSB0aGUgc3ltYm9scyBpbiB0aGUgb3V0c3ltYm9scyBmaWVsZC4gIFdlIG5lZWQgdG8ga2VlcCB0aGVtCi0gICBhcm91bmQgZm9yIHRoZSBlbnRpcmUgbGluayB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHJlYWQgdGhlbSBvbmNlLgotICAgSWYgd2UgcmVhZCB0aGVtIG11bHRpcGxlIHRpbWVzLCB3ZSBtaWdodCB3aW5kIHVwIHdpdGggcmVsb2NzIGFuZAotICAgdGhlIGhhc2ggdGFibGUgcG9pbnRpbmcgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc3ltYm9sCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBsb25nIHN5bXNpemU7Ci0gICAgICBsb25nIHN5bWNvdW50OwotCi0gICAgICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICAgICAgaWYgKHN5bXNpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChhYmZkLCBzeW1zaXplKTsKLSAgICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IE5VTEwgJiYgc3ltc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkpOwotICAgICAgaWYgKHN5bWNvdW50IDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgdG8gZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUKLSAgIGdsb2JhbCBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29sbGVjdAotICAgY29uc3RydWN0b3JzIGJ5IG5hbWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgZmFsc2UpOwotfQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbAotICAgaGFzaCB0YWJsZS4gIFRoaXMgdmVyc2lvbiBhdXRvbWF0aWNhbGx5IGNvbGxlY3RzIGNvbnN0cnVjdG9ycyBieQotICAgbmFtZSwgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gIEl0IHNob3VsZCBiZSB1c2VkIGZvciBhbnkKLSAgIHRhcmdldCB3aGljaCBkb2VzIG5vdCBwcm92aWRlIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHVwCi0gICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOyB0aGVzZSBhcmUgYXBwcm94aW1hdGVseSB0aG9zZSB0YXJnZXRzCi0gICBmb3Igd2hpY2ggZ2NjIHVzZXMgY29sbGVjdDIgYW5kIGRvIG5vdCBzdXBwb3J0IHN0YWJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgdHJ1ZSk7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBib29sZWFuIHJldDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0ID0gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0ID0gKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkgICAgIChhYmZkLCBpbmZvLAotCSAgICAgIChjb2xsZWN0Ci0JICAgICAgID8gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0Ci0JICAgICAgIDogZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0KSkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKSwKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpLAotCQkJCSAgICAgICBjb2xsZWN0KTsKLX0KLQwKLS8qIFdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGFuIGFyY2hpdmUuICAqLwotCi0vKiBBbiBhcmNoaXZlIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBieSBtdWx0aXBsZSBhcmNoaXZlIGVsZW1lbnRzLgotICAgVGhpcyBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIGhvbGQgdGhlIGVsZW1lbnRzLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfbGlzdAotewotICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpuZXh0OwotICBpbnQgaW5keDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmRlZnM7Ci19OwotCi0vKiBBbiBhcmNoaXZlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICphcmNoaXZlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGZvciBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFyY2hpdmVfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmRlZnMgPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBuZXdmdW5jKTsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQWxsb2NhdGUgc3BhY2UgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfYWxsb2NhdGUodCwgc2l6ZSkgYmZkX2hhc2hfYWxsb2NhdGUgKCYodCktPnRhYmxlLCAoc2l6ZSkpCi0KLS8qIEZyZWUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSh0KSBiZmRfaGFzaF90YWJsZV9mcmVlICgmKHQpLT50YWJsZSkKLQotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsCi0gICBoYXNoIGZpbGUuICBUaGlzIGZ1bmN0aW9uIHByZXN1bWVzIHRoYXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlCi0gICBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW4gKHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUKLSAgIGJmZF9jaGVja19mb3JtYXQgZW50cnkgcG9pbnQpLiAgSXQgbG9va3MgdGhyb3VnaCB0aGUgdW5kZWZpbmVkIGFuZAotICAgY29tbW9uIHN5bWJvbHMgYW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IgdGhlbS4gIElmCi0gICBpdCBmaW5kcyBhbiBlbnRyeSwgaXQgaW5jbHVkZXMgdGhlIGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUgaW4gdGhlCi0gICBsaW5rLgotCi0gICBUaGUgb2xkIGxpbmtlciBsb29rZWQgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZm9yCi0gICB1bmRlZmluZWQgc3ltYm9scy4gIFdlIGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLCBsb29raW5nIHRocm91Z2gKLSAgIHVuZGVmaW5lZCBzeW1ib2xzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIGFyY2hpdmUuICBUaGUKLSAgIGFkdmFudGFnZSBvZiB0aGUgbmV3ZXIgc2NoZW1lIGlzIHRoYXQgd2Ugb25seSBoYXZlIHRvIGxvb2sgdGhyb3VnaAotICAgdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgb25jZSwgd2hlcmVhcyB0aGUgb2xkIG1ldGhvZCBoYWQgdG8KLSAgIHJlLXNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSB3YXMgYWRkZWQuCi0KLSAgIFRoZSBDSEVDS0ZOIGFyZ3VtZW50IGlzIHVzZWQgdG8gc2VlIGlmIGFuIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQuICBDSEVDS0ZOIHNob3VsZCBzZXQgKlBORUVERUQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IGZpbGUKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kIG11c3QgYWxzbyBjYWxsIHRoZSBiZmRfbGlua19pbmZvCi0gICBhZGRfYXJjaGl2ZV9lbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBoYW5kbGUgYWRkaW5nIHRoZSBzeW1ib2xzCi0gICB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBDSEVDS0ZOIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSBpZiBzb21lCi0gICBzb3J0IG9mIGVycm9yIG9jY3Vycy4KLQotICAgRm9yIHNvbWUgZm9ybWF0cywgc3VjaCBhcyBhLm91dCwgaXQgaXMgcG9zc2libGUgdG8gbG9vayB0aHJvdWdoIGFuCi0gICBvYmplY3QgZmlsZSBidXQgbm90IGFjdHVhbGx5IGluY2x1ZGUgaXQgaW4gdGhlIGxpbmsuICBUaGUKLSAgIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiBhIEJGRCBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzeW1ib2xzCi0gICBvZiBhbiBvYmplY3QgZmlsZXMgdG9vIG1hbnkgdGltZXMuICBXaGVuIGFuIG9iamVjdCBpcyBpbmNsdWRlZCBpbgotICAgdGhlIGxpbmssIGFyY2hpdmVfcGFzcyBpcyBzZXQgdG8gLTEuICBJZiBhbiBvYmplY3QgaXMgc2Nhbm5lZCBidXQKLSAgIG5vdCBpbmNsdWRlZCwgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byB0aGUgcGFzcyBudW1iZXIuICBUaGUgcGFzcwotICAgbnVtYmVyIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZC4gIFRoZQotICAgcGFzcyBudW1iZXIgaXMgdXNlZCBiZWNhdXNlIHdoZW4gYSBuZXcgb2JqZWN0IGZpbGUgaXMgaW5jbHVkZWQgaXQKLSAgIG1heSBjcmVhdGUgbmV3IHVuZGVmaW5lZCBzeW1ib2xzIHdoaWNoIGNhdXNlIGEgcHJldmlvdXNseSBleGFtaW5lZAotICAgb2JqZWN0IGZpbGUgdG8gYmUgaW5jbHVkZWQuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvLCBjaGVja2ZuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqY2hlY2tmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXsKLSAgY2Fyc3ltICphcnN5bXM7Ci0gIGNhcnN5bSAqYXJzeW1fZW5kOwotICByZWdpc3RlciBjYXJzeW0gKmFyc3ltOwotICBpbnQgcGFzczsKLSAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSBhcnN5bV9oYXNoOwotICBpbnQgaW5keDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFyc3ltcyA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICBhcnN5bV9lbmQgPSBhcnN5bXMgKyBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotCi0gIC8qIEluIG9yZGVyIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYW4gc3ltYm9sIGlzIGRlZmluZWQgaW4KLSAgICAgdGhpcyBhcmNoaXZlLCB3ZSBidWlsZCBhIGhhc2ggdGFibGUgb2YgdGhlIHN5bWJvbHMuICAqLwotICBpZiAoISBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdCAoJmFyc3ltX2hhc2gsIGFyY2hpdmVfaGFzaF9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoYXJzeW0gPSBhcnN5bXMsIGluZHggPSAwOyBhcnN5bSA8IGFyc3ltX2VuZDsgYXJzeW0rKywgaW5keCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmwsICoqcHA7Ci0KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBhcnN5bS0+bmFtZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbCA9ICgoc3RydWN0IGFyY2hpdmVfbGlzdCAqKQotCSAgIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSAoJmFyc3ltX2hhc2gsIHNpemVvZiAoc3RydWN0IGFyY2hpdmVfbGlzdCkpKTsKLSAgICAgIGlmIChsID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsLT5pbmR4ID0gaW5keDsKLSAgICAgIGZvciAocHAgPSAmYXJoLT5kZWZzOwotCSAgICpwcCAhPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgICpwcCA9IGw7Ci0gICAgICBsLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiB0aGUgYXJjaGl2ZSBpdHNlbGYgaXMgdXNlZCB0bwotICAgICBpbml0aWFsaXplIFBBU1MsIHNpbmUgd2UgbWF5IHNlYXJjaCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlCi0gICAgIHRpbWVzLiAgKi8KLSAgcGFzcyA9IGFiZmQtPmFyY2hpdmVfcGFzcyArIDE7Ci0KLSAgLyogTmV3IHVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyB3ZQotICAgICBvbmx5IG5lZWQgdG8gbG9vayB0aHJvdWdoIGl0IG9uY2UuICAqLwotICBwdW5kZWYgPSAmaW5mby0+aGFzaC0+dW5kZWZzOwotICB3aGlsZSAoKnB1bmRlZiAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmw7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbiAoaXQgd291bGQgYWxzbyBjYXVzZQotCSAgICAgdXMgdG8gbG9zZSB0cmFjayBvZiB3aGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4KLQkgICAgIHJlZmVyZW5jZWQpLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgbWFwLiAgKi8KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChhcmggPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGF0IGFsbCB0aGUgb2JqZWN0cyB3aGljaCBkZWZpbmUgdGhpcyBzeW1ib2wuICAqLwotICAgICAgZm9yIChsID0gYXJoLT5kZWZzOyBsICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIGJvb2xlYW4gbmVlZGVkOwotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBnb3R0ZW4gZGVmaW5lZCBhbG9uZyB0aGUgd2F5LCBxdWl0LiAgKi8KLQkgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgYnJlYWs7Ci0KLQkgIGVsZW1lbnQgPSBiZmRfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgbC0+aW5keCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGluY2x1ZGVkIHRoaXMgZWxlbWVudCwgb3IgaWYgd2UndmUKLQkgICAgIGFscmVhZHkgY2hlY2tlZCBpdCBvbiB0aGlzIHBhc3MsIGNvbnRpbnVlLiAgKi8KLQkgIGlmIChlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gLTEKLQkgICAgICB8fCBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gcGFzcykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHdlIGNhbid0IGZpZ3VyZSB0aGlzIGVsZW1lbnQgb3V0LCBqdXN0IGlnbm9yZSBpdC4gICovCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIENIRUNLRk4gd2lsbCBzZWUgaWYgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kCi0JICAgICBnbyBhaGVhZCBhbmQgaW5jbHVkZSBpdCBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoISAoKmNoZWNrZm4pIChlbGVtZW50LCBpbmZvLCAmbmVlZGVkKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIG5lZWRlZCkKLQkgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCi0JICAgICAgLyogSW5jcmVtZW50IHRoZSBwYXNzIGNvdW50IHRvIHNob3cgdGhhdCB3ZSBtYXkgbmVlZCB0bwotCQkgcmVjaGVjayBvYmplY3QgZmlsZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGNoZWNrZWQuICAqLwotCSAgICAgICsrcGFzczsKLQkgICAgfQotCX0KLQotICAgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLSAgICB9Ci0KLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLQotICAvKiBTYXZlIFBBU1MgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIGFnYWluLiAgKi8KLSAgYWJmZC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkCi0gICB3aGVuIHdlIGRvIG5vdCB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24KLSAgIHRoZSBzeW1ib2wgbmFtZSwgcHJlc3VtYWJseSBiZWNhdXNlIHdlIGhhdmUgc29tZSBvdGhlciBtZWNoYW5pc20KLSAgIGZvciBmaW5kaW5nIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgZmFsc2UpOwotfQotCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKLSAgIHdoZW4gd2Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgY29uc3RydWN0b3JzIGJhc2VkIG9uIHRoZQotICAgc3ltYm9sIG5hbWUsIGFzIGNvbGxlY3QyIGRvZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgdHJ1ZSk7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBPcHRpb25hbGx5IGNvbGxlY3QKLSAgIGNvbnN0cnVjdG9ycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgcHBlbmQgPSBwcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGZvciAoOyBwcCA8IHBwZW5kOyBwcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnA7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKQotCSAgJiYgKHAtPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfSU5ESVJFQ1QgfCBCU0ZfV0VBSykpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgd2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcwotCSBzeW1ib2wsIGFuZCBpdCBpcyB1bmRlZmluZWQgb3IgY29tbW9uLiAgQW4gdW5kZWZpbmVkIHdlYWsKLQkgc3ltYm9sICh0eXBlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSBpcyBub3QgY29uc2lkZXJlZCB0byBiZQotCSBhIHJlZmVyZW5jZSB3aGVuIHB1bGxpbmcgZmlsZXMgb3V0IG9mIGFuIGFyY2hpdmUuICBTZWUgdGhlCi0JIFNWUjQgQUJJLCBwLiA0LTI3LiAgKi8KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgYmZkX2FzeW1ib2xfbmFtZSAocCksIGZhbHNlLAotCQkJCWZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBQIGlzIGEgc3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0KLSAgICAgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCi0JICAvKiBUaGlzIG9iamVjdCBmaWxlIGRlZmluZXMgdGhpcyBzeW1ib2wsIHNvIHB1bGwgaXQgaW4uICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLAotCQkJCQkJCSBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bWNvdW50ID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0JICBpZiAoISBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLCBzeW1jb3VudCwKLQkJCQkJICAgICAgc3ltYm9scywgY29sbGVjdCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogUCBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCi0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBiZmQgKnN5bWJmZDsKLQkgIGJmZF92bWEgc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgc3ltYmZkID0gaC0+dS51bmRlZi5hYmZkOwotCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCBhcyB1bmRlZmluZWQgZnJvbSBvdXRzaWRlCi0JCSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluayBpbiB0aGUgb2JqZWN0Ci0JCSBmaWxlLiAgVGhpcyBpcyBmb3IgdGhlIC11IG9wdGlvbiBpbiB0aGUgbGlua2VyLiAgKi8KLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkKLQkJICAoaW5mbywgYWJmZCwgYmZkX2FzeW1ib2xfbmFtZSAocCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIFR1cm4gdGhlIHN5bWJvbCBpbnRvIGEgY29tbW9uIHN5bWJvbCBidXQgZG8gbm90IGxpbmsgaW4KLQkgICAgIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0Ci0JICAgICBmb3JtYXRzIHRoYXQgcmVxdWlyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50Ci0JICAgICB0aGlzIGZ1bmN0aW9uIGRpZmZlcmVudGx5LiAgVGhpcyBzeW1ib2wgaXMgYWxyZWFkeSBvbiB0aGUKLQkgICAgIHVuZGVmcyBsaXN0LiAgV2UgYWRkIHRoZSBzZWN0aW9uIHRvIGEgY29tbW9uIHNlY3Rpb24KLQkgICAgIGF0dGFjaGVkIHRvIHN5bWJmZCB0byBlbnN1cmUgdGhhdCBpdCBpcyBpbiBhIEJGRCB3aGljaAotCSAgICAgd2lsbCBiZSBsaW5rZWQgaW4uICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCSAgaC0+dS5jLnAgPQotCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7Ci0JICBoLT51LmMuc2l6ZSA9IHNpemU7Ci0KLQkgIHBvd2VyID0gYmZkX2xvZzIgKHNpemUpOwotCSAgaWYgKHBvd2VyID4gNCkKLQkgICAgcG93ZXIgPSA0OwotCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JICBpZiAocC0+c2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLCAiQ09NTU9OIik7Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsCi0JCQkJCQkJICBwLT5zZWN0aW9uLT5uYW1lKTsKLQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmIG5lY2Vzc2FyeS4gIFRoaXMKLQkgICAgIGlzIGhvdyBhLm91dCB3b3Jrcy4gIE9iamVjdCBmb3JtYXRzIHRoYXQgcmVxdWlyZQotCSAgICAgZGlmZmVyZW50IHNlbWFudGljcyBtdXN0IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uCi0JICAgICBkaWZmZXJlbnRseS4gICovCi0JICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHApID4gaC0+dS5jLnNpemUpCi0JICAgIGgtPnUuYy5zaXplID0gYmZkX2FzeW1ib2xfdmFsdWUgKHApOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBhcmNoaXZlIGVsZW1lbnQgaXMgbm90IG5lZWRlZC4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBBQkZECi0gICBpcyB0aGUgb2JqZWN0IGZpbGUuICBJTkZPIGlzIHRoZSBsaW5rZXIgaW5mb3JtYXRpb24uICBTWU1CT0xfQ09VTlQKLSAgIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gIFNZTUJPTFMgaXMgdGhlIGxpc3Qgb2Ygc3ltYm9scy4gIENPTExFQ1QKLSAgIGlzIHRydWUgaWYgY29uc3RydWN0b3JzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNvbGxlY3RlZCBieSBuYW1lCi0gICBhcyBpcyBkb25lIGJ5IGNvbGxlY3QyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWJvbF9jb3VudCwgc3ltYm9scywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1ib2xfY291bnQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICBwcCA9IHN5bWJvbHM7Ci0gIHBwZW5kID0gc3ltYm9scyArIHN5bWJvbF9jb3VudDsKLSAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgaWYgKChwLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJICAgICAgIHwgQlNGX1dBUk5JTkcKLQkJICAgICAgIHwgQlNGX0dMT0JBTAotCQkgICAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJICAgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICpzdHJpbmc7Ci0JICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChwKTsKLQkgIGlmICgoKHAtPmZsYWdzICYgQlNGX0lORElSRUNUKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgICAgJiYgcHAgKyAxIDwgcHBlbmQpCi0JICAgIHsKLQkgICAgICBwcCsrOwotCSAgICAgIHN0cmluZyA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChwLT5mbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwCi0JCSAgICYmIHBwICsgMSA8IHBwZW5kKQotCSAgICB7Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgUCBpcyBhY3R1YWxseSB0aGUgd2FybmluZyBzdHJpbmcsIGFuZCB0aGUKLQkJIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dC4gICovCi0JICAgICAgc3RyaW5nID0gbmFtZTsKLQkgICAgICBwcCsrOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN0cmluZyA9IE5VTEw7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgcC0+ZmxhZ3MsIGJmZF9nZXRfc2VjdGlvbiAocCksCi0JCSAgcC0+dmFsdWUsIHN0cmluZywgZmFsc2UsIGNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wsIGFuZCB0aGUgbGlua2VyIGRpZG4ndCBkbwotICAgICAgICAgICAgIGFueXRoaW5nIHdpdGggaXQsIHRoZW4gd2Ugd2FudCB0byBqdXN0IHBhc3MgdGhlIHN5bWJvbAotICAgICAgICAgICAgIHRocm91Z2ggdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyB3aWxsIGhhcHBlbiB3aGVuCi0gICAgICAgICAgICAgbGlua2luZyB3aXRoIC1yLiAgKi8KLQkgIGlmICgocC0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICAgICAmJiAoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykpCi0JICAgIHsKLQkgICAgICBwLT51ZGF0YS5wID0gTlVMTDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTYXZlIHRoZSBCRkQgc3ltYm9sIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSBhbnkgYmFja2VuZAotCSAgICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgYXR0YWNoZWQgdG8gaXQuICBXZSBvbmx5Ci0JICAgICB3YW50IHRoaXMgb25lIGlmIGl0IGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUKLQkgICAgIGV4aXN0aW5nIG9uZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIGEgZGVmaW5lZCBzeW1ib2wKLQkgICAgIHdpdGggYW4gdW5kZWZpbmVkIG9uZS4gIFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIHdpdGggYQotCSAgICAgaGFzaCB0YWJsZSBvdGhlciB0aGFuIHRoZSBnZW5lcmljIGhhc2ggdGFibGUsIHNvIHdlIG9ubHkKLQkgICAgIGRvIHRoaXMgaWYgd2UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgaGFzaCB0YWJsZSBpcyBhCi0JICAgICBnZW5lcmljIG9uZS4gICovCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnN5bSA9PSAoYXN5bWJvbCAqKSBOVUxMCi0JCSAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCQkgICAgICAmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JCQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChoLT5zeW0pKSkpKQotCQl7Ci0JCSAgaC0+c3ltID0gcDsKLQkJICAvKiBCU0ZfT0xEX0NPTU1PTiBpcyBhIGhhY2sgdG8gc3VwcG9ydCBDT0ZGIHJlbG9jCi0JCSAgICAgcmVhZGluZywgYW5kIGl0IHNob3VsZCBnbyBhd2F5IHdoZW4gdGhlIENPRkYKLQkJICAgICBsaW5rZXIgaXMgc3dpdGNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uLiAgKi8KLQkJICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKSkKLQkJICAgIHAtPmZsYWdzIHw9IEJTRl9PTERfQ09NTU9OOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU3RvcmUgYSBiYWNrIHBvaW50ZXIgZnJvbSB0aGUgc3ltYm9sIHRvIHRoZSBoYXNoCi0JICAgICB0YWJsZSBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgcmVsYXhhdGlvbiBjb2RlIHVudGlsCi0JICAgICBpdCBnZXRzIHJld3JpdHRlbiB0byBub3QgdXNlIGFzeW1ib2wgc3RydWN0dXJlcy4KLQkgICAgIFNldHRpbmcgdGhpcyBpcyBhbHNvIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGVzZQotCSAgICAgc3ltYm9scyB3ZXJlIHNldCB1cCBieSB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLwotCSAgcC0+dWRhdGEucCA9IChQVFIpIGg7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIHVzZSBhIHN0YXRlIHRhYmxlIHRvIGRlYWwgd2l0aCBhZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFRoZSBmaXJzdCBpbmRleCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBkZXNjcmliZXMgdGhlIHN5bWJvbAotICAgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBUaGUgc2Vjb25kIGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGlzIHRoZQotICAgdHlwZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhlIHN5bWJvbCBmcm9tIHRoZSBvYmplY3QgZmlsZSBpcyB0dXJuZWQgaW50byBvbmUgb2YgdGhlc2Ugcm93Ci0gICB2YWx1ZXMuICAqLwotCi1lbnVtIGxpbmtfcm93Ci17Ci0gIFVOREVGX1JPVywJCS8qIFVuZGVmaW5lZC4gICovCi0gIFVOREVGV19ST1csCQkvKiBXZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRl9ST1csCQkvKiBEZWZpbmVkLiAgKi8KLSAgREVGV19ST1csCQkvKiBXZWFrIGRlZmluZWQuICAqLwotICBDT01NT05fUk9XLAkJLyogQ29tbW9uLiAgKi8KLSAgSU5EUl9ST1csCQkvKiBJbmRpcmVjdC4gICovCi0gIFdBUk5fUk9XLAkJLyogV2FybmluZy4gICovCi0gIFNFVF9ST1cJCS8qIE1lbWJlciBvZiBzZXQuICAqLwotfTsKLQotLyogYXBwYXJlbnRseSBuZWVkZWQgZm9yIEhpdGFjaGkgMzA1MFIoSEktVVgvV0UyKT8gKi8KLSN1bmRlZiBGQUlMCi0KLS8qIFRoZSBhY3Rpb25zIHRvIHRha2UgaW4gdGhlIHN0YXRlIHRhYmxlLiAgKi8KLQotZW51bSBsaW5rX2FjdGlvbgotewotICBGQUlMLAkJLyogQWJvcnQuICovCi0gIFVORCwJCS8qIE1hcmsgc3ltYm9sIHVuZGVmaW5lZC4gICovCi0gIFdFQUssCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRiwJCS8qIE1hcmsgc3ltYm9sIGRlZmluZWQuICAqLwotICBERUZXLAkJLyogTWFyayBzeW1ib2wgd2VhayBkZWZpbmVkLiAgKi8KLSAgQ09NLAkJLyogTWFyayBzeW1ib2wgY29tbW9uLiAgKi8KLSAgUkVGLAkJLyogTWFyayBkZWZpbmVkIHN5bWJvbCByZWZlcmVuY2VkLiAgKi8KLSAgQ1JFRiwJCS8qIFBvc3NpYmx5IHdhcm4gYWJvdXQgY29tbW9uIHJlZmVyZW5jZSB0byBkZWZpbmVkIHN5bWJvbC4gICovCi0gIENERUYsCQkvKiBEZWZpbmUgZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIE5PQUNULAkvKiBObyBhY3Rpb24uICAqLwotICBCSUcsCQkvKiBNYXJrIHN5bWJvbCBjb21tb24gdXNpbmcgbGFyZ2VzdCBzaXplLiAgKi8KLSAgTURFRiwJCS8qIE11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICAqLwotICBNSU5ELAkJLyogTXVsdGlwbGUgaW5kaXJlY3Qgc3ltYm9scy4gICovCi0gIElORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLSAgQ0lORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sIGZyb20gZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIFNFVCwJCS8qIEFkZCB2YWx1ZSB0byBzZXQuICAqLwotICBNV0FSTiwJLyogTWFrZSB3YXJuaW5nIHN5bWJvbC4gICovCi0gIFdBUk4sCQkvKiBJc3N1ZSB3YXJuaW5nLiAgKi8KLSAgQ1dBUk4sCS8qIFdhcm4gaWYgcmVmZXJlbmNlZCwgZWxzZSBNV0FSTi4gICovCi0gIENZQ0xFLAkvKiBSZXBlYXQgd2l0aCBzeW1ib2wgcG9pbnRlZCB0by4gICovCi0gIFJFRkMsCQkvKiBNYXJrIGluZGlyZWN0IHN5bWJvbCByZWZlcmVuY2VkIGFuZCB0aGVuIENZQ0xFLiAgKi8KLSAgV0FSTkMJCS8qIElzc3VlIHdhcm5pbmcgYW5kIHRoZW4gQ1lDTEUuICAqLwotfTsKLQotLyogVGhlIHN0YXRlIHRhYmxlIGl0c2VsZi4gIFRoZSBmaXJzdCBpbmRleCBpcyBhIGxpbmtfcm93IGFuZCB0aGUKLSAgIHNlY29uZCBpbmRleCBpcyBhIGJmZF9saW5rX2hhc2hfdHlwZS4gICovCi0KLXN0YXRpYyBjb25zdCBlbnVtIGxpbmtfYWN0aW9uIGxpbmtfYWN0aW9uWzhdWzhdID0KLXsKLSAgLyogY3VycmVudFxwcmV2ICAgIG5ldyAgICB1bmRlZiAgdW5kZWZ3IGRlZiAgICBkZWZ3ICAgY29tICAgIGluZHIgICB3YXJuICAqLwotICAvKiBVTkRFRl9ST1cgCSovICB7VU5ELCAgIE5PQUNULCBVTkQsICAgUkVGLCAgIFJFRiwgICBOT0FDVCwgUkVGQywgIFdBUk5DIH0sCi0gIC8qIFVOREVGV19ST1cJKi8gIHtXRUFLLCAgTk9BQ1QsIE5PQUNULCBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKLSAgLyogREVGX1JPVyAJKi8gIHtERUYsICAgREVGLCAgIERFRiwgICBNREVGLCAgREVGLCAgIENERUYsICBNREVGLCAgQ1lDTEUgfSwKLSAgLyogREVGV19ST1cgCSovICB7REVGVywgIERFRlcsICBERUZXLCAgTk9BQ1QsIE5PQUNULCBOT0FDVCwgTk9BQ1QsIENZQ0xFIH0sCi0gIC8qIENPTU1PTl9ST1cJKi8gIHtDT00sICAgQ09NLCAgIENPTSwgICBDUkVGLCAgQ1JFRiwgIEJJRywgICBSRUZDLCAgV0FSTkMgfSwKLSAgLyogSU5EUl9ST1cJKi8gIHtJTkQsICAgSU5ELCAgIElORCwgICBNREVGLCAgSU5ELCAgIENJTkQsICBNSU5ELCAgQ1lDTEUgfSwKLSAgLyogV0FSTl9ST1cgICAqLyAge01XQVJOLCBXQVJOLCAgV0FSTiwgIENXQVJOLCBDV0FSTiwgV0FSTiwgIENXQVJOLCBNV0FSTiB9LAotICAvKiBTRVRfUk9XCSovICB7U0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgQ1lDTEUsIENZQ0xFIH0KLX07Ci0KLS8qIE1vc3Qgb2YgdGhlIGVudHJpZXMgaW4gdGhlIExJTktfQUNUSU9OIHRhYmxlIGFyZSBzdHJhaWdodGZvcndhcmQsCi0gICBidXQgYSBmZXcgYXJlIHNvbWV3aGF0IHN1YnRsZS4KLQotICAgQSByZWZlcmVuY2UgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sIChVTkRFRl9ST1cvaW5kciBvcgotICAgVU5ERUZXX1JPVy9pbmRyKSBpcyBjb3VudGVkIGFzIGEgcmVmZXJlbmNlIGJvdGggdG8gdGhlIGluZGlyZWN0Ci0gICBzeW1ib2wgYW5kIHRvIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCi0KLSAgIEEgcmVmZXJlbmNlIHRvIGEgd2FybmluZyBzeW1ib2wgKFVOREVGX1JPVy93YXJuIG9yIFVOREVGV19ST1cvd2FybikKLSAgIGNhdXNlcyB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCi0KLSAgIEEgY29tbW9uIGRlZmluaXRpb24gb2YgYW4gaW5kaXJlY3Qgc3ltYm9sIChDT01NT05fUk9XL2luZHIpIGlzCi0gICB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIExpa2V3aXNlIGZvciBhbiBpbmRpcmVjdAotICAgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgKElORFJfUk9XL2NvbSkuCi0KLSAgIEFuIGluZGlyZWN0IGRlZmluaXRpb24gb2YgYSB3YXJuaW5nIChJTkRSX1JPVy93YXJuKSBkb2VzIG5vdCBjYXVzZQotICAgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLgotCi0gICBJZiBhIHdhcm5pbmcgaXMgY3JlYXRlZCBmb3IgYW4gaW5kaXJlY3Qgc3ltYm9sIChXQVJOX1JPVy9pbmRyKSBubwotICAgd2FybmluZyBpcyBjcmVhdGVkIGZvciB0aGUgc3ltYm9sIHRoZSBpbmRpcmVjdCBzeW1ib2wgcG9pbnRzIHRvLgotCi0gICBBZGRpbmcgYW4gZW50cnkgdG8gYSBzZXQgZG9lcyBub3QgY291bnQgYXMgYSByZWZlcmVuY2UgdG8gYSBzZXQsCi0gICBhbmQgbm8gd2FybmluZyBpcyBpc3N1ZWQgKFNFVF9ST1cvd2FybikuICAqLwotCi0vKiBSZXR1cm4gdGhlIEJGRCBpbiB3aGljaCBhIGhhc2ggZW50cnkgaGFzIGJlZW4gZGVmaW5lZCwgaWYga25vd24uICAqLwotCi1zdGF0aWMgYmZkICoKLWhhc2hfZW50cnlfYmZkIChoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgd2hpbGUgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSBoLT51LmkubGluazsKLSAgc3dpdGNoIChoLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgcmV0dXJuIGgtPnUudW5kZWYuYWJmZDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHJldHVybiBoLT51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgcmV0dXJuIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBBQkZEIGlzIHRoZSBCRkQgdGhlIHN5bWJvbCBjb21lcyBmcm9tLgotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLgotICAgRkxBR1MgaXMgdGhlIEJTRl8qIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wuCi0gICBTRUNUSU9OIGlzIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgZGVmaW5lZDsgdGhpcyBtYXkgYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ciBvciBiZmRfY29tX3NlY3Rpb25fcHRyLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLgotICAgU1RSSU5HIGlzIHVzZWQgZm9yIGVpdGhlciBhbiBpbmRpcmVjdCBzeW1ib2wsIGluIHdoaWNoIGNhc2UgaXQgaXMKLSAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBpbmRpcmVjdCB0bywgb3IgYSB3YXJuaW5nIHN5bWJvbCwgaW4KLSAgICAgd2hpY2ggY2FzZSBpdCBpcyB0aGUgd2FybmluZyBzdHJpbmcuCi0gICBDT1BZIGlzIHRydWUgaWYgTkFNRSBvciBTVFJJTkcgbXVzdCBiZSBjb3BpZWQgaW50byBsb2NhbGx5Ci0gICAgIGFsbG9jYXRlZCBtZW1vcnkgaWYgdGhleSBuZWVkIHRvIGJlIHNhdmVkLgotICAgQ09MTEVDVCBpcyB0cnVlIGlmIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgZ2NjIGNvbnN0cnVjdG9yCi0gICAgIG9yIGRlc3RydWN0b3IgbmFtZXMgYXMgY29sbGVjdDIgZG9lcy4KLSAgIEhBU0hQLCBpZiBub3QgTlVMTCwgaXMgYSBwbGFjZSB0byBzdG9yZSB0aGUgY3JlYXRlZCBoYXNoIHRhYmxlCi0gICAgIGVudHJ5OyBpZiAqSEFTSFAgaXMgbm90IE5VTEwsIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwCi0gICAgIHRoZSBoYXNoIHRhYmxlIGVudHJ5LCBhbmQgc3RvcmVkIGl0IGluICpIQVNIUC4gKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwKLQkJCQkgIHN0cmluZywgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgZW51bSBsaW5rX3JvdyByb3c7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGN5Y2xlOwotCi0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICB8fCAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDApCi0gICAgcm93ID0gSU5EUl9ST1c7Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwKQotICAgIHJvdyA9IFdBUk5fUk9XOwotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgcm93ID0gU0VUX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzICYgQlNGX1dFQUspICE9IDApCi0Jcm93ID0gVU5ERUZXX1JPVzsKLSAgICAgIGVsc2UKLQlyb3cgPSBVTkRFRl9ST1c7Ci0gICAgfQotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLSAgICByb3cgPSBERUZXX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByb3cgPSBDT01NT05fUk9XOwotICBlbHNlCi0gICAgcm93ID0gREVGX1JPVzsKLQotICBpZiAoaGFzaHAgIT0gTlVMTCAmJiAqaGFzaHAgIT0gTlVMTCkKLSAgICBoID0gKmhhc2hwOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJvdyA9PSBVTkRFRl9ST1cgfHwgcm93ID09IFVOREVGV19ST1cpCi0JaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGVsc2UKLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+bm90aWNlX2FsbAotICAgICAgfHwgKGluZm8tPm5vdGljZV9oYXNoICE9IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTAotCSAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKSkKLSAgICB7Ci0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+bm90aWNlKSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sCi0JCQkJCXZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoYXNocCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpCi0gICAgKmhhc2hwID0gaDsKLQotICBkbwotICAgIHsKLSAgICAgIGVudW0gbGlua19hY3Rpb24gYWN0aW9uOwotCi0gICAgICBjeWNsZSA9IGZhbHNlOwotICAgICAgYWN0aW9uID0gbGlua19hY3Rpb25bKGludCkgcm93XVsoaW50KSBoLT50eXBlXTsKLSAgICAgIHN3aXRjaCAoYWN0aW9uKQotCXsKLQljYXNlIEZBSUw6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgTk9BQ1Q6Ci0JICAvKiBEbyBub3RoaW5nLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBVTkQ6Ci0JICAvKiBNYWtlIGEgbmV3IHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaCk7Ci0JICBicmVhazsKLQotCWNhc2UgV0VBSzoKLQkgIC8qIE1ha2UgYSBuZXcgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazsKLQkgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ0RFRjoKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaCB3YXMKLQkgICAgIHByZXZpb3VzbHkgY29tbW9uLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgREVGOgotCWNhc2UgREVGVzoKLQkgIHsKLQkgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb2xkdHlwZTsKLQotCSAgICAvKiBEZWZpbmUgYSBzeW1ib2wuICAqLwotCSAgICBvbGR0eXBlID0gaC0+dHlwZTsKLQkgICAgaWYgKGFjdGlvbiA9PSBERUZXKQotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZndlYWs7Ci0JICAgIGVsc2UKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLQkgICAgaC0+dS5kZWYudmFsdWUgPSB2YWx1ZTsKLQotCSAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8sIHdlIGFjdCBsaWtlIGNvbGxlY3QyIGFuZAotCSAgICAgICBpZGVudGlmeSBhbGwgZnVuY3Rpb25zIHRoYXQgbWlnaHQgYmUgZ2xvYmFsCi0JICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIHBhc3MgdGhlbSB1cCBpbiBhCi0JICAgICAgIGNhbGxiYWNrLiAgV2Ugb25seSBkbyB0aGlzIGZvciBjZXJ0YWluIG9iamVjdCBmaWxlCi0JICAgICAgIHR5cGVzLCBzaW5jZSBtYW55IG9iamVjdCBmaWxlIHR5cGVzIGNhbiBoYW5kbGUgdGhpcwotCSAgICAgICBhdXRvbWF0aWNhbGx5LiAgKi8KLQkgICAgaWYgKGNvbGxlY3QgJiYgbmFtZVswXSA9PSAnXycpCi0JICAgICAgewotCQljb25zdCBjaGFyICpzOwotCi0JCS8qIEEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lIHN0YXJ0cyBsaWtlIHRoaXM6Ci0JCSAgIF8rR0xPQkFMX1tfLiRdW0lEXVtfLiRdIHdoZXJlIHRoZSBmaXJzdCBbXy4kXSBhbmQKLQkJICAgdGhlIHNlY29uZCBhcmUgdGhlIHNhbWUgY2hhcmFjdGVyICh3ZSBhY2NlcHQgYW55Ci0JCSAgIGNoYXJhY3RlciB0aGVyZSwgaW4gY2FzZSBhIG5ldyBvYmplY3QgZmlsZSBmb3JtYXQKLQkJICAgY29tZXMgYWxvbmcgd2l0aCBldmVuIHdvcnNlIG5hbWluZyByZXN0cmljdGlvbnMpLiAgKi8KLQotI2RlZmluZSBDT05TX1BSRUZJWCAiR0xPQkFMXyIKLSNkZWZpbmUgQ09OU19QUkVGSVhfTEVOIChzaXplb2YgQ09OU19QUkVGSVggLSAxKQotCi0JCXMgPSBuYW1lICsgMTsKLQkJd2hpbGUgKCpzID09ICdfJykKLQkJICArK3M7Ci0JCWlmIChzWzBdID09ICdHJwotCQkgICAgJiYgc3RybmNtcCAocywgQ09OU19QUkVGSVgsIENPTlNfUFJFRklYX0xFTiAtIDEpID09IDApCi0JCSAgewotCQkgICAgY2hhciBjOwotCi0JCSAgICBjID0gc1tDT05TX1BSRUZJWF9MRU4gKyAxXTsKLQkJICAgIGlmICgoYyA9PSAnSScgfHwgYyA9PSAnRCcpCi0JCQkmJiBzW0NPTlNfUFJFRklYX0xFTl0gPT0gc1tDT05TX1BSRUZJWF9MRU4gKyAyXSkKLQkJICAgICAgewotCQkJLyogSWYgdGhpcyBpcyBhIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBwcmV2aW91c2x5IHdlYWtseSBkZWZpbmVkLCB3ZSBhcmUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyb3VibGUuICBXZSBoYXZlIGFscmVhZHkgYWRkZWQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgZW50cnkgZm9yIHRoZSB3ZWFrIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgYW5kIG5vdyB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmV3IHN5bWJvbC4gIEZvcnR1bmF0ZWx5LCB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBuZXZlciBhcmlzZSBpbiBwcmFjdGljZS4gICovCi0JCQlpZiAob2xkdHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCQkgIGFib3J0ICgpOwotCi0JCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPmNvbnN0cnVjdG9yKQotCQkJICAgICAgIChpbmZvLAotCQkJCWMgPT0gJ0knID8gdHJ1ZSA6IGZhbHNlLAotCQkJCWgtPnJvb3Quc3RyaW5nLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICBicmVhazsKLQotCWNhc2UgQ09NOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbC4gICovCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkgIGgtPnUuYy5wID0KLQkgICAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0gICAgICAgICAgICAgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgaWYgKHBvd2VyID4gNCkKLQkgICAgICBwb3dlciA9IDQ7Ci0JICAgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQkgIH0KLQotCSAgLyogVGhlIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIGlzIG9ubHkgdXNlZCBpZiB0aGUgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sIGlzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIEl0IGJhc2ljYWxseSBwcm92aWRlcyBhCi0gICAgICAgICAgICAgaG9vayBmb3IgdGhlIGxpbmtlciBzY3JpcHQgdG8gZGVjaWRlIHdoaWNoIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgdGhlIGNvbW1vbiBzeW1ib2xzIHNob3VsZCBiZSBwdXQgaW4uICBJbiBtb3N0IGNhc2VzLCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCB3aWxsIGJlIGJmZF9jb21fc2VjdGlvbl9wdHIsCi0gICAgICAgICAgICAgdGhlIGNvZGUgaGVyZSB3aWxsIGNob29zZSBhIGNvbW1vbiBzeW1ib2wgc2VjdGlvbiBuYW1lZAotICAgICAgICAgICAgICJDT01NT04iLCBhbmQgdGhlIGxpbmtlciBzY3JpcHQgd2lsbCBjb250YWluICooQ09NTU9OKSBpbgotICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gIEEgZmV3IHRhcmdldHMgdXNlIHNlcGFyYXRlIGNvbW1vbgotICAgICAgICAgICAgIHNlY3Rpb25zIGZvciBzbWFsbCBzeW1ib2xzLCBhbmQgdGhleSByZXF1aXJlIHNwZWNpYWwKLSAgICAgICAgICAgICBoYW5kbGluZy4gICovCi0JICBpZiAoc2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICB7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICJDT01NT04iKTsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlY3Rpb24tPm93bmVyICE9IGFiZmQpCi0JICAgIHsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwKLQkJCQkJCQkgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gc2VjdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRUY6Ci0JICAvKiBBIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5uZXh0ID09IE5VTEwgJiYgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgIT0gaCkKLQkgICAgaC0+bmV4dCA9IGg7Ci0JICBicmVhazsKLQotCWNhc2UgQklHOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAotCSAgICAgYWxyZWFkeSBoYWQgYSBjb21tb24gZGVmaW5pdGlvbi4gIFVzZSB0aGUgbWF4aW11bSBvZiB0aGUKLQkgICAgIHR3byBzaXplcy4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCB2YWx1ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkgICAgICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0JCSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLwotCSAgICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgICBpZiAocG93ZXIgPiA0KQotCQlwb3dlciA9IDQ7Ci0JICAgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ1JFRjoKLQkgIHsKLQkgICAgYmZkICpvYmZkOwotCi0JICAgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2gKLQkgICAgICAgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEZJWE1FOiBJdCB3b3VsZCBuaWNlIGlmIHdlIGNvdWxkCi0JICAgICAgIHJlcG9ydCB0aGUgQkZEIHdoaWNoIGRlZmluZWQgYW4gaW5kaXJlY3Qgc3ltYm9sLCBidXQgd2UKLQkgICAgICAgZG9uJ3QgaGF2ZSBhbnl3aGVyZSB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICAqLwotCSAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgb2JmZCA9IGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICBlbHNlCi0JICAgICAgb2JmZCA9IE5VTEw7Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgICAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIG9iZmQsIGgtPnR5cGUsIChiZmRfdm1hKSAwLAotCQkgICAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE1JTkQ6Ci0JICAvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhpcyBpcyBPSyBpZiB0aGV5IGJvdGggcG9pbnQKLQkgICAgIHRvIHRoZSBzYW1lIHN5bWJvbC4gICovCi0JICBpZiAoc3RyY21wIChoLT51LmkubGluay0+cm9vdC5zdHJpbmcsIHN0cmluZykgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTURFRjoKLQkgIC8qIEhhbmRsZSBhIG11bHRpcGxlIGRlZmluaXRpb24uICAqLwotCSAgewotCSAgICBhc2VjdGlvbiAqbXNlYyA9IE5VTEw7Ci0JICAgIGJmZF92bWEgbXZhbCA9IDA7Ci0KLQkgICAgc3dpdGNoIChoLT50eXBlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkJbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247Ci0JCW12YWwgPSBoLT51LmRlZi52YWx1ZTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotCQltc2VjID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQkJbXZhbCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWFib3J0ICgpOwotCSAgICAgIH0KLQotCSAgICAvKiBJZ25vcmUgYSByZWRlZmluaXRpb24gb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lCi0gICAgICAgICAgICAgICB2YWx1ZTsgaXQncyBoYXJtbGVzcy4gICovCi0JICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKG1zZWMpCi0JCSYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLQkJJiYgdmFsdWUgPT0gbXZhbCkKLQkgICAgICBicmVhazsKLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCi0JCSAgIChpbmZvLCBoLT5yb290LnN0cmluZywgbXNlYy0+b3duZXIsIG1zZWMsIG12YWwsIGFiZmQsCi0JCSAgICBzZWN0aW9uLCB2YWx1ZSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDSU5EOgotCSAgLyogQ3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbCBmcm9tIGFuIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJIChpbmZvLCBoLT5yb290LnN0cmluZywKLQkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKLQkJICBhYmZkLCBiZmRfbGlua19oYXNoX2luZGlyZWN0LCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgSU5EOgotCSAgLyogQ3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICppbmg7Ci0KLQkgICAgLyogU1RSSU5HIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2Ugd2FudCB0byBpbmRpcmVjdAotCSAgICAgICB0by4gICovCi0JICAgIGluaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIHN0cmluZywgdHJ1ZSwKLQkJCQkJCWNvcHksIGZhbHNlKTsKLQkgICAgaWYgKGluaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmIChpbmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgICAgewotCQlpbmgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkJaW5oLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotCQliZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGluaCk7Ci0JICAgICAgfQotCi0JICAgIC8qIElmIHRoZSBpbmRpcmVjdCBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCwgd2UgbmVlZCB0bwotCSAgICAgICBwdXNoIHRoZSByZWZlcmVuY2UgZG93biB0byB0aGUgc3ltYm9sIHdlIGFyZQotCSAgICAgICByZWZlcmVuY2luZy4gICovCi0JICAgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICAgIHsKLQkJcm93ID0gVU5ERUZfUk9XOwotCQljeWNsZSA9IHRydWU7Ci0JICAgICAgfQotCi0JICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2luZGlyZWN0OwotCSAgICBoLT51LmkubGluayA9IGluaDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTRVQ6Ci0JICAvKiBBZGQgYW4gZW50cnkgdG8gYSBzZXQuICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF90b19zZXQpIChpbmZvLCBoLCBCRkRfUkVMT0NfQ1RPUiwKLQkJCQkJCWFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIFdBUk5DOgotCSAgLyogSXNzdWUgYSB3YXJuaW5nIGFuZCBjeWNsZS4gICovCi0JICBpZiAoaC0+dS5pLndhcm5pbmcgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgaC0+dS5pLndhcm5pbmcsCi0JCQkJCQkgaC0+cm9vdC5zdHJpbmcsIGFiZmQsCi0JCQkJCQkgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCQkgKGJmZF92bWEpIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBpc3N1ZSBhIHdhcm5pbmcgb25jZS4gICovCi0JICAgICAgaC0+dS5pLndhcm5pbmcgPSBOVUxMOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgQ1lDTEU6Ci0JICAvKiBUcnkgYWdhaW4gd2l0aCB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotCSAgaCA9IGgtPnUuaS5saW5rOwotCSAgY3ljbGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJFRkM6Ci0JICAvKiBBIHJlZmVyZW5jZSB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLwotCSAgaWYgKGgtPm5leHQgPT0gTlVMTCAmJiBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCAhPSBoKQotCSAgICBoLT5uZXh0ID0gaDsKLQkgIGggPSBoLT51LmkubGluazsKLQkgIGN5Y2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBXQVJOOgotCSAgLyogSXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgc3RyaW5nLCBoLT5yb290LnN0cmluZywKLQkJCQkJICAgICBoYXNoX2VudHJ5X2JmZCAoaCksCi0JCQkJCSAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENXQVJOOgotCSAgLyogV2FybiBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkIGFscmVhZHksCi0JICAgICBvdGhlcndpc2UgYWRkIGEgd2FybmluZy4gIEEgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQgaWYKLQkgICAgIHRoZSBuZXh0IGZpZWxkIGlzIG5vdCBOVUxMLCBvciBpdCBpcyB0aGUgdGFpbCBvZiB0aGUKLQkgICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gIFRoZSBSRUYgY2FzZSBhYm92ZSBoZWxwcyB0bwotCSAgICAgZW5zdXJlIHRoaXMuICAqLwotCSAgaWYgKGgtPm5leHQgIT0gTlVMTCB8fCBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCA9PSBoKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBzdHJpbmcsIGgtPnJvb3Quc3RyaW5nLAotCQkJCQkJIGhhc2hfZW50cnlfYmZkIChoKSwKLQkJCQkJCSAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJCSAoYmZkX3ZtYSkgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE1XQVJOOgotCSAgLyogTWFrZSBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnN1YjsKLQotCSAgICAvKiBTVFJJTkcgaXMgdGhlIHdhcm5pbmcgdG8gZ2l2ZS4gICovCi0JICAgIHN1YiA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkJICAgKCgqaW5mby0+aGFzaC0+dGFibGUubmV3ZnVuYykKLQkJICAgICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwsICZpbmZvLT5oYXNoLT50YWJsZSwKLQkJICAgICBoLT5yb290LnN0cmluZykpKTsKLQkgICAgaWYgKHN1YiA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgKnN1YiA9ICpoOwotCSAgICBzdWItPnR5cGUgPSBiZmRfbGlua19oYXNoX3dhcm5pbmc7Ci0JICAgIHN1Yi0+dS5pLmxpbmsgPSBoOwotCSAgICBpZiAoISBjb3B5KQotCSAgICAgIHN1Yi0+dS5pLndhcm5pbmcgPSBzdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKnc7Ci0KLQkJdyA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJICAgICAgIHN0cmxlbiAoc3RyaW5nKSArIDEpOwotCQlpZiAodyA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJc3RyY3B5ICh3LCBzdHJpbmcpOwotCQlzdWItPnUuaS53YXJuaW5nID0gdzsKLQkgICAgICB9Ci0KLQkgICAgYmZkX2hhc2hfcmVwbGFjZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJICAgICAgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBoLAotCQkJICAgICAgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBzdWIpOwotCSAgICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgICAqaGFzaHAgPSBzdWI7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICB3aGlsZSAoY3ljbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogR2VuZXJpYyBmaW5hbCBsaW5rIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpzdWI7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBvdXRzeW1hbGxvYzsKLSAgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvIHdnaW5mbzsKLQotICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgb3V0c3ltYWxsb2MgPSAwOwotCi0gIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLSAgLyogQnVpbGQgdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSAoYmZkICopIE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIChhYmZkLCBzdWIsIGluZm8sICZvdXRzeW1hbGxvYykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWNjdW11bGF0ZSB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotICB3Z2luZm8uaW5mbyA9IGluZm87Ci0gIHdnaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgd2dpbmZvLnBzeW1hbGxvYyA9ICZvdXRzeW1hbGxvYzsKLSAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZSAoX2JmZF9nZW5lcmljX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wsCi0JCQkJICAgKFBUUikgJndnaW5mbyk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBOVUxMIHBvaW50ZXIgb24gT1VUU1lNQk9MUy4gIFdlCi0gICAgIHNob3VsZG4ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgU1lNQ09VTlQsIGJ1dCBzb21lIG9sZAotICAgICBjb2RlIHN0aWxsIGV4cGVjdHMgb25lLiAgKi8KLSAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAoYWJmZCwgJm91dHN5bWFsbG9jLCBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG91dHB1dCByZWxvY3MgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBvICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIG8gPSBvLT5uZXh0KQotCXsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCQkrK28tPnJlbG9jX2NvdW50OwotCSAgICAgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkJICBiZmQgKmlucHV0X2JmZDsKLQkJICBsb25nIHJlbHNpemU7Ci0JCSAgYXJlbGVudCAqKnJlbG9jczsKLQkJICBhc3ltYm9sICoqc3ltYm9sczsKLQkJICBsb25nIHJlbG9jX2NvdW50OwotCi0JCSAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkJICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQkJICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCQkgIGlmIChyZWxzaXplIDwgMCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY3MgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsc2l6ZSk7Ci0JCSAgaWYgKCFyZWxvY3MgJiYgcmVsc2l6ZSAhPSAwKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLQkJICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKLQkJCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQkJCXJlbG9jcywKLQkJCQkJCQlzeW1ib2xzKTsKLQkJICBpZiAocmVsb2NfY291bnQgPCAwKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBsb25nKSByZWxvY19jb3VudAotCQkJICAgICAgPT0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCQkgIG8tPnJlbG9jX2NvdW50ICs9IHJlbG9jX2NvdW50OwotCQkgIGZyZWUgKHJlbG9jcyk7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKLQkgICAgewotCSAgICAgIG8tPm9yZWxvY2F0aW9uID0gKChhcmVsZW50ICoqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKG8tPnJlbG9jX2NvdW50Ci0JCQkJCSAgICAqIHNpemVvZiAoYXJlbGVudCAqKSkpKTsKLQkgICAgICBpZiAoIW8tPm9yZWxvY2F0aW9uKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIC8qIFJlc2V0IHRoZSBjb3VudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4Ci0JCSB3aGVuIHB1dHRpbmcgaW4gdGhlIG91dHB1dCByZWxvY3MuICAqLwotCSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSGFuZGxlIGFsbCB0aGUgbGluayBvcmRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlY3Rpb25zLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgICBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgc3dpdGNoIChwLT50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjoKLQkgICAgY2FzZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI6Ci0JICAgICAgaWYgKCEgX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXI6Ci0JICAgICAgaWYgKCEgZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwLCB0cnVlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gb3V0cHV0IHN5bWJvbCB0byB0aGUgb3V0cHV0IEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzaXplX3QgKnBzeW1hbGxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCkgPj0gKnBzeW1hbGxvYykKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqbmV3c3ltczsKLQotICAgICAgaWYgKCpwc3ltYWxsb2MgPT0gMCkKLQkqcHN5bWFsbG9jID0gMTI0OwotICAgICAgZWxzZQotCSpwc3ltYWxsb2MgKj0gMjsKLSAgICAgIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3JlYWxsb2MgKGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCksCi0JCQkJCSAgKnBzeW1hbGxvYyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBpZiAobmV3c3ltcyA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpID0gbmV3c3ltczsKLSAgICB9Ci0KLSAgYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSBbYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCldID0gc3ltOwotICBpZiAoc3ltICE9IE5VTEwpCi0gICAgKysgYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc3ltYm9scyBmb3IgYW4gaW5wdXQgQkZELiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgcHN5bWFsbG9jKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc2l6ZV90ICpwc3ltYWxsb2M7Ci17Ci0gIGFzeW1ib2wgKipzeW1fcHRyOwotICBhc3ltYm9sICoqc3ltX2VuZDsKLQotICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgYSBmaWxlbmFtZSBzeW1ib2wgaWYgd2UgYXJlIHN1cHBvc2VkIHRvLiAgKi8KLSAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGZvciAoc2VjID0gaW5wdXRfYmZkLT5zZWN0aW9uczsKLQkgICBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgc2VjID0gc2VjLT5uZXh0KQotCXsKLQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqbmV3c3ltOwotCi0JICAgICAgbmV3c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChpbnB1dF9iZmQpOwotCSAgICAgIGlmICghbmV3c3ltKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgbmV3c3ltLT5uYW1lID0gaW5wdXRfYmZkLT5maWxlbmFtZTsKLQkgICAgICBuZXdzeW0tPnZhbHVlID0gMDsKLQkgICAgICBuZXdzeW0tPmZsYWdzID0gQlNGX0xPQ0FMIHwgQlNGX0ZJTEU7Ci0JICAgICAgbmV3c3ltLT5zZWN0aW9uID0gc2VjOwotCi0JICAgICAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLAotCQkJCQkgICAgICAgbmV3c3ltKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgdmFsdWVzIG9mIHRoZSBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMsIGFuZCB3cml0ZSBvdXQKLSAgICAgbG9jYWwgc3ltYm9scy4gICovCi0gIHN5bV9wdHIgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLSAgc3ltX2VuZCA9IHN5bV9wdHIgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7Ci0gIGZvciAoOyBzeW1fcHRyIDwgc3ltX2VuZDsgc3ltX3B0cisrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gb3V0cHV0OwotCi0gICAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgc3ltID0gKnN5bV9wdHI7Ci0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCQkgfCBCU0ZfV0FSTklORwotCQkJIHwgQlNGX0dMT0JBTAotCQkJIHwgQlNGX0NPTlNUUlVDVE9SCi0JCQkgfCBCU0ZfV0VBSykpICE9IDAKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQotCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBzeW0tPnVkYXRhLnA7Ci0JICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgY2FzZSBub3JtYWxseSBtZWFucyB0aGF0IHRoZSBtYWluIGxpbmtlciBjb2RlCi0gICAgICAgICAgICAgICAgIGRlbGliZXJhdGVseSBpZ25vcmVkIHRoaXMgY29uc3RydWN0b3Igc3ltYm9sLiAgV2UKLSAgICAgICAgICAgICAgICAgc2hvdWxkIGp1c3QgcGFzcyBpdCB0aHJvdWdoLiAgVGhpcyB3aWxsIHNjcmV3IHVwIGlmCi0gICAgICAgICAgICAgICAgIHRoZSBjb25zdHJ1Y3RvciBzeW1ib2wgaXMgZnJvbSBhIGRpZmZlcmVudCwKLSAgICAgICAgICAgICAgICAgbm9uLWdlbmVyaWMsIG9iamVjdCBmaWxlIGZvcm1hdCwgYnV0IHRoZSBjYXNlIHdpbGwKLSAgICAgICAgICAgICAgICAgb25seSBhcmlzZSB3aGVuIGxpbmtpbmcgd2l0aCAtciwgd2hpY2ggd2lsbCBwcm9iYWJseQotICAgICAgICAgICAgICAgICBmYWlsIGFueWhvdywgc2luY2UgdGhlcmUgd2lsbCBiZSBubyB3YXkgdG8gcmVwcmVzZW50Ci0gICAgICAgICAgICAgICAgIHRoZSByZWxvY3MgaW4gdGhlIG91dHB1dCBmb3JtYXQgYmVpbmcgdXNlZC4gICovCi0JICAgICAgaCA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgaCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkgICAgICAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCSAgZWxzZQotCSAgICBoID0gX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9sb29rdXAgKF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICBpZiAoaCAhPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBGb3JjZSBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCB0byBwb2ludCB0bwotCQkgdGhlIHNhbWUgYXJlYSBpbiBtZW1vcnkuICBJdCBpcyBwb3NzaWJsZSB0aGF0Ci0JCSB0aGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIGhhc2ggdGFibGUKLQkJIG90aGVyIHRoYW4gYSBnZW5lcmljIGhhc2ggdGFibGUsIHNvIHdlIGRvdWJsZQotCQkgY2hlY2sgdGhhdC4gICovCi0JICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gaW5wdXRfYmZkLT54dmVjKQotCQl7Ci0JCSAgaWYgKGgtPnN5bSAhPSAoYXN5bWJvbCAqKSBOVUxMKQotCQkgICAgKnN5bV9wdHIgPSBzeW0gPSBoLT5zeW07Ci0JCX0KLQotCSAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JCSAgLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkJICBzeW0tPmZsYWdzICY9fiBCU0ZfQ09OU1RSVUNUT1I7Ci0JCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgc3ltLT5zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotCQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9DT05TVFJVQ1RPUjsKLQkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICBzeW0tPnNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCQkgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLQkJICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJICAgIH0KLQkJICAvKiBXZSBkbyBub3Qgc2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgdG8KLQkJICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLiAgVGhhdCB2YWx1ZSB3YXMgc2F2ZWQgc28KLQkJICAgICB0aGF0IHdlIHdvdWxkIGtub3cgd2hlcmUgdG8gYWxsb2NhdGUgdGhlIHN5bWJvbAotCQkgICAgIGlmIGl0IHdhcyBkZWZpbmVkLiAgSW4gdGhpcyBjYXNlIHRoZSB0eXBlIGlzCi0JCSAgICAgc3RpbGwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHNvIHdlIGRpZCBub3QgZGVmaW5lCi0JCSAgICAgaXQsIHNvIHdlIGRvIG5vdCB3YW50IHRvIHVzZSB0aGF0IHNlY3Rpb24uICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoaXMgc3dpdGNoIGlzIHN0cmFpZ2h0IGZyb20gdGhlIG9sZCBjb2RlIGluCi0JIHdyaXRlX2ZpbGVfbG9jYWxzIGluIGxkc3ltLmMuICAqLwotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5rZWVwX2hhc2gsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJICAgZmFsc2UsIGZhbHNlKQotCQkgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpKQotCW91dHB1dCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKLQl7Ci0JICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBtYXJrZWQgYXMgb2NjdXJyaW5nIG5vdywgcmF0aGVyCi0JICAgICB0aGFuIGF0IHRoZSBlbmQsIG91dHB1dCBpdCBub3cuICBUaGlzIGlzIHVzZWQgZm9yCi0JICAgICBDT0ZGIENfRVhUIEZDTiBzeW1ib2xzLiAgRklYTUU6IFRoZXJlIG11c3QgYmUgYQotCSAgICAgYmV0dGVyIHdheS4gICovCi0JICBpZiAoYmZkX2FzeW1ib2xfYmZkIChzeW0pID09IGlucHV0X2JmZAotCSAgICAgICYmIChzeW0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDApCi0JICAgIG91dHB1dCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQlvdXRwdXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLQl7Ci0JICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSkKLQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQlvdXRwdXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKQotCXsKLQkgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwKQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoaW5mby0+ZGlzY2FyZCkKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGRpc2NhcmRfYWxsOgotCQkgIG91dHB1dCA9IGZhbHNlOwotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfbDoKLQkJICBpZiAoYmZkX2lzX2xvY2FsX2xhYmVsIChpbnB1dF9iZmQsIHN5bSkpCi0JCSAgICBvdXRwdXQgPSBmYWxzZTsKLQkJICBlbHNlCi0JCSAgICBvdXRwdXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfbm9uZToKLQkJICBvdXRwdXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikpCi0JewotCSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24gd2hpY2ggaXMgbm90IGJlaW5nIGluY2x1ZGVkCi0JIGluIHRoZSBvdXRwdXQgZmlsZSwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIG91dHB1dCB0aGUgc3ltYm9sLgotCi0JIEdyb3NzLiAgLmJzcyBhbmQgc2ltaWxhciBzZWN0aW9ucyB3b24ndCBoYXZlIHRoZSBsaW5rZXJfbWFyawotCSBmaWVsZCBzZXQuICAqLwotICAgICAgaWYgKChzeW0tPnNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAotCSAgJiYgc3ltLT5zZWN0aW9uLT5saW5rZXJfbWFyayA9PSBmYWxzZSkKLQlvdXRwdXQgPSBmYWxzZTsKLQotICAgICAgaWYgKG91dHB1dCkKLQl7Ci0JICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsIHN5bSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChoICE9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgaC0+d3JpdHRlbiA9IHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzZWN0aW9uIGFuZCB2YWx1ZSBvZiBhIGdlbmVyaWMgQkZEIHN5bWJvbCBiYXNlZCBvbiBhIGxpbmtlcgotICAgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBzd2l0Y2ggKGgtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBzZWVuIGJ1dCB3ZSBhcmUKLSAgICAgICAgIG5vdCBidWlsZGluZyBjb25zdHJ1Y3RvcnMuICAqLwotICAgICAgaWYgKHN5bS0+c2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIEJGRF9BU1NFUlQgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltLT5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICBzeW0tPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgc3ltLT52YWx1ZSA9IDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uOwotICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuZGVmLnZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotICAgICAgc3ltLT5zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbjsKLSAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmRlZi52YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBzeW0tPnZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBpZiAoc3ltLT5zZWN0aW9uID09IE5VTEwpCi0Jc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCXsKLQkgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7Ci0JICBzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIC8qIERvIG5vdCBzZXQgdGhlIHNlY3Rpb247IHNlZSBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scy4gICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gICovCi0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGdsb2JhbCBzeW1ib2wsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQuCi0gICBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKndnaW5mbyA9Ci0gICAgKHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyAqKSBkYXRhOwotICBhc3ltYm9sICpzeW07Ci0KLSAgaWYgKGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+d3JpdHRlbiA9IHRydWU7Ci0KLSAgaWYgKHdnaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0gICAgICB8fCAod2dpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKHdnaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+c3ltICE9IChhc3ltYm9sICopIE5VTEwpCi0gICAgc3ltID0gaC0+c3ltOwotICBlbHNlCi0gICAgewotICAgICAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sICh3Z2luZm8tPm91dHB1dF9iZmQpOwotICAgICAgaWYgKCFzeW0pCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltLT5uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIHN5bS0+ZmxhZ3MgPSAwOwotICAgIH0KLQotICBzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCAmaC0+cm9vdCk7Ci0KLSAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCi0gIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKHdnaW5mby0+b3V0cHV0X2JmZCwgd2dpbmZvLT5wc3ltYWxsb2MsCi0JCQkJICAgc3ltKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBmYWlsdXJlLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgcmVsb2NhdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgYXJlbGVudCAqcjsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChzZWMtPm9yZWxvY2F0aW9uID09IChhcmVsZW50ICoqKSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIHIgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAociA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgICAgIAotICByLT5hZGRyZXNzID0gbGlua19vcmRlci0+b2Zmc2V0OwotICByLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChyLT5ob3d0byA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHN5bWJvbCB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICByLT5zeW1fcHRyX3B0ciA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8ICEgaC0+d3JpdHRlbikKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgci0+c3ltX3B0cl9wdHIgPSAmaC0+c3ltOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdyaXRlIHRoZSBhZGRlbmQgdG8gdGhlIG9iamVjdCBmaWxlLgotICAgICBPdGhlcndpc2UsIHN0b3JlIGl0IGluIHRoZSByZWxvYyBhZGRlbmQuICAqLwotICBpZiAoISByLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlKQotICAgIHItPmFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoci0+aG93dG8sIGFiZmQsCi0JCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChpbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgci0+aG93dG8tPm5hbWUsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLAotCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlua19vcmRlci0+b2Zmc2V0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCkpLCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHItPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIHNlYy0+b3JlbG9jYXRpb25bc2VjLT5yZWxvY19jb3VudF0gPSByOwotICArK3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKgotYmZkX25ld19saW5rX29yZGVyIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5ldzsKLQotICBuZXcgPSAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX29yZGVyKSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXctPnR5cGUgPSBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXI7Ci0gIG5ldy0+b2Zmc2V0ID0gMDsKLSAgbmV3LT5zaXplID0gMDsKLSAgbmV3LT5uZXh0ID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMKQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbC0+bmV4dCA9IG5ldzsKLSAgZWxzZQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfaGVhZCA9IG5ldzsKLSAgc2VjdGlvbi0+bGlua19vcmRlcl90YWlsID0gbmV3OwotCi0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICBOb3RlIHRoYXQgd2UgY2FuIG5vdCBoYW5kbGUKLSAgIHRoZSByZWxvY19saW5rX29yZGVyIHR5cGVzIGhlcmUsIHNpbmNlIHRoZXkgZGVwZW5kIHVwb24gdGhlIGRldGFpbHMKLSAgIG9mIGhvdyB0aGUgcGFydGljdWxhciBiYWNrZW5kcyBnZW5lcmF0ZXMgcmVsb2NzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBzd2l0Y2ggKGxpbmtfb3JkZXItPnR5cGUpCi0gICAgewotICAgIGNhc2UgYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyOgotICAgIGNhc2UgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjoKLSAgICBjYXNlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjoKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlciwKLQkJCQkJICBmYWxzZSk7Ci0gICAgY2FzZSBiZmRfZmlsbF9saW5rX29yZGVyOgotICAgICAgcmV0dXJuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpOwotICAgIGNhc2UgYmZkX2RhdGFfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgKFBUUikgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzLAotCQkJCSAgICAgICAoZmlsZV9wdHIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmtfb3JkZXItPm9mZnNldCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCkpLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT5zaXplKTsKLSAgICB9Ci19Ci0KLS8qIERlZmF1bHQgcm91dGluZSB0byBoYW5kbGUgYSBiZmRfZmlsbF9saW5rX29yZGVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpzcGFjZTsKLSAgc2l6ZV90IGk7Ci0gIGludCBmaWxsOwotICBib29sZWFuIHJlc3VsdDsKLQotICBCRkRfQVNTRVJUICgoc2VjLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIHNpemUgPSAoc2l6ZV90KSBsaW5rX29yZGVyLT5zaXplOwotICBzcGFjZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHNpemUpOwotICBpZiAoc3BhY2UgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGwgPSBsaW5rX29yZGVyLT51LmZpbGwudmFsdWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDIpCi0gICAgc3BhY2VbaV0gPSBmaWxsID4+IDg7Ci0gIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpICs9IDIpCi0gICAgc3BhY2VbaV0gPSBmaWxsOwotICByZXN1bHQgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgc3BhY2UsCi0JCQkJICAgICAoZmlsZV9wdHIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5rX29yZGVyLT5vZmZzZXQgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCkpLAotCQkJCSAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIsCi0JCQkgICAgIGdlbmVyaWNfbGlua2VyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYm9vbGVhbiBnZW5lcmljX2xpbmtlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmV3X2NvbnRlbnRzOwotCi0gIEJGRF9BU1NFUlQgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKLQotICBpZiAobGlua19vcmRlci0+c2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPT0gbGlua19vcmRlci0+c2l6ZSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwCi0gICAgICAmJiBvdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgewotICAgICAgLyogU3BhY2UgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIG91dHB1dCByZWxvY2F0aW9ucy4KLQkgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGNhbGxlZCBieSBhIHNwZWNpZmljIGJhY2tlbmQKLQkgYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JIHR5cGVzIG9mIG9iamVjdCBmaWxlcy4gIEhhbmRsaW5nIHRoaXMgY2FzZSBjb3JyZWN0bHkgaXMKLQkgZGlmZmljdWx0LCBhbmQgc29tZXRpbWVzIGltcG9zc2libGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGdlbmVyaWNfbGlua2VyKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICAgIGFzeW1ib2wgKipzeW1wcGVuZDsKLQotICAgICAgLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gIFRoZSBnZW5lcmljIGxpbmtlciB3aWxsIGFsd2F5cwotCSBoYXZlIHJldHJpZXZlZCB0aGVtIGJ5IHRoaXMgcG9pbnQsIGJ1dCB3ZSBhcmUgYmVpbmcgY2FsbGVkIGJ5Ci0JIGEgc3BlY2lmaWMgbGlua2VyLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgYXJlIGxpbmtpbmcKLQkgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdCBmaWxlcyB0b2dldGhlci4gICovCi0gICAgICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2luY2Ugd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIHNwZWNpZmljIGxpbmtlciwgcmF0aGVyIHRoYW4KLQkgdGhlIGdlbmVyaWMgbGlua2VyLCB0aGUgdmFsdWVzIG9mIHRoZSBzeW1ib2xzIHdpbGwgbm90IGJlCi0JIHJpZ2h0LiAgVGhleSB3aWxsIGJlIHRoZSB2YWx1ZXMgYXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZSwKLQkgbm90IHRoZSB2YWx1ZXMgb2YgdGhlIGZpbmFsIGxpbmsuICBXZSBuZWVkIHRvIGZpeCB0aGVtIHVwCi0JIGJlZm9yZSB3ZSBjYW4gcmVsb2NhdGUgdGhlIHNlY3Rpb24uICAqLwotICAgICAgc3ltcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLSAgICAgIHN5bXBwZW5kID0gc3ltcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcHAgPCBzeW1wcGVuZDsgc3ltcHArKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgc3ltID0gKnN5bXBwOwotCi0JICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCQkgICAgIHwgQlNGX1dBUk5JTkcKLQkJCSAgICAgfCBCU0ZfR0xPQkFMCi0JCQkgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCQkgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgLyogc3ltLT51ZGF0YSBtYXkgaGF2ZSBiZWVuIHNldCBieQotCQkgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdC4gICovCi0JICAgICAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQotCQloID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkJICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGVsc2UKLQkJaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKTsKLQkgICAgfQotCX0JICAKLSAgICB9Ci0KLSAgLyogR2V0IGFuZCByZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnRlbnRzID0gKChiZmRfYnl0ZSAqKQotCSAgICAgIGJmZF9tYWxsb2MgKGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBuZXdfY29udGVudHMgPSAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCQkgIChvdXRwdXRfYmZkLCBpbmZvLCBsaW5rX29yZGVyLCBjb250ZW50cywgaW5mby0+cmVsb2NhdGVhYmxlLAotCQkgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSkpOwotICBpZiAoIW5ld19jb250ZW50cykKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgbmV3X2NvbnRlbnRzLAotCQkJCSAgKGZpbGVfcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5rX29yZGVyLT5vZmZzZXQgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAob3V0cHV0X2JmZCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX29yZGVyLT5zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBsaXR0bGUgcm91dGluZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpbiBhIGxpbmtfb3JkZXIKLSAgIGxpc3QuICAqLwotCi11bnNpZ25lZCBpbnQKLV9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKGxpbmtfb3JkZXIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbDsKLQotICBjID0gMDsKLSAgZm9yIChsID0gbGlua19vcmRlcjsgbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkgIHx8IGwtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSsrYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIG5vbnplcm8gaWYgQHZhcntzZWN9IHNob3VsZCBiZSBzcGxpdCBkdXJpbmcgYQotCXJlbG9jZWF0YWJsZSBvciBmaW5hbCBsaW5rLgotCi0uI2RlZmluZSBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGFiZmQsIHNlYykgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24sIChhYmZkLCBzZWMpKQotLgotCi0qLwotCi0KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9iZmQvbHlueC1jb3JlLmMgYi9iZmQvbHlueC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTgxNzcuLjAwMDAwMDAKLS0tIGEvYmZkL2x5bngtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTHlueCBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi0jaW5jbHVkZSA8c3lzL2NvbmYuaD4KLSNpbmNsdWRlIDxzeXMva2VybmVsLmg+Ci0vKiBzeXMva2VybmVsLmggc2hvdWxkIGRlZmluZSB0aGlzLCBidXQgZG9lc24ndCBhbHdheXMsIHNpZ2guICovCi0jaWZuZGVmIF9fTFlOWE9TCi0jZGVmaW5lIF9fTFlOWE9TCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvbWVtLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL2l0aW1lci5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3Byb2MuaD4KLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW1BOTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEubHlueF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotLyogSGFuZGxlIEx5bnggY29yZSBkdW1wIGZpbGUuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotICBpZiAoIW5ld25hbWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotbHlueF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgc2VjbnVtOwotICBzdHJ1Y3QgcHNzZW50cnkgcHNzOwotICBzaXplX3QgdGNvbnRleHRfc2l6ZTsKLSAgY29yZV9zdF90ICp0aHJlYWRwOwotICBpbnQgcGFnZXNpemU7Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CS8qIFNlcmlvdXMgY3Jvc3MtdGFyZ2V0IGlzc3VlIGhlcmUuLi4gIFRoaXMKLQkJCQkgICByZWFsbHkgbmVlZHMgdG8gY29tZSBmcm9tIGEgc3lzdGVtLXNwZWNpZmljCi0JCQkJICAgaGVhZGVyIGZpbGUuICAqLwotCi0gIC8qIEdldCB0aGUgcHNzIGVudHJ5IGZyb20gdGhlIGNvcmUgZmlsZSAqLwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnBzcywgMSwgc2l6ZW9mIHBzcywgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHBzcykKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBseW54X2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgcHNzLnBuYW1lLCBQTk1MRU4gKyAxKTsKLQotICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICB0Y29udGV4dF9zaXplID0gcHNzLnRocmVhZGNudCAqIHNpemVvZiAoY29yZV9zdF90KTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRocmVhZHAgPSAoY29yZV9zdF90ICopYmZkX2FsbG9jIChhYmZkLCB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCF0aHJlYWRwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNhdmUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBwYWdlc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopdGhyZWFkcCwgcHNzLnRocmVhZGNudCwgc2l6ZW9mIChjb3JlX3N0X3QpLCBhYmZkKTsKLQotICBpZiAodmFsICE9IHRjb250ZXh0X3NpemUpCi0gICAgewotICAgICAgLyogUHJvYmFibHkgdG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB0aHJlYWRwLT5jdXJyc2lnOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5zc2l6ZSwKLQkJCSAgICAgICBwc3Muc2xpbWl0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5kYXRhX2xlbiArIHBzcy5ic3NfbGVuLAotCQkJICAgICAgIHBzcy5kYXRhX3N0YXJ0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSArIHBzcy5zc2l6ZQotI2lmIGRlZmluZWQgKFNQQVJDKSB8fCBkZWZpbmVkIChfX1NQQVJDX18pCi0JCQkgICAgICAgLyogU1BBUkMgTHlueCBzZWVtcyB0byBzdGFydCBkdW1waW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5kYXRhIHNlY3Rpb24gYXQgYSBwYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkuICBJdCdzIE9LIHRvIGNoZWNrIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGxpa2UgU1BBUkMgaGVyZSBiZWNhdXNlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIGEgTHlueAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuICAqLwotCQkJICAgICAgICsgcHNzLmRhdGFfc3RhcnQgJSBwYWdlc2l6ZQotI2VuZGlmCi0JCQkgICAgICAgKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0vKiBBbmQsIG5vdyBmb3IgdGhlIC5yZWcvWFhYIHBzZXVkbyBzZWN0aW9ucy4gIEVhY2ggdGhyZWFkIGhhcyBpdCdzIG93bgotICAgLnJlZy9YWFggc2VjdGlvbiwgd2hlcmUgWFhYIGlzIHRoZSB0aHJlYWQgaWQgKHdpdGhvdXQgbGVhZGluZyB6ZXJvcykuICBUaGUKLSAgIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZCAoYXQgdGhlIHRpbWUgb2YgdGhlIGNvcmUgZHVtcCkgYWxzbyBoYXMgYW4gYWxpYXMKLSAgIGNhbGxlZCBgLnJlZycgKGp1c3QgdG8ga2VlcCBHREIgaGFwcHkpLiAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFgnIGFzCi0gICBvcHBvc2VkIHRvIGAucmVnWFhYJyBiZWNhdXNlIEdEQiBleHBlY3RzIHRoYXQgLnJlZzIgd2lsbCBiZSB0aGUgZmxvYXRpbmctCi0gICBwb2ludCByZWdpc3RlcnMuICAqLwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJICAgICAgIDAsCi0JCQkgICAgICAgcGFnZXNpemUpOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChzZWNudW0gPSAwOyBzZWNudW0gPCBwc3MudGhyZWFkY250OyBzZWNudW0rKykKLSAgICB7Ci0gICAgICBjaGFyIHNlY25hbWVbMTAwXTsKLQotICAgICAgc3ByaW50ZiAoc2VjbmFtZSwgIi5yZWcvJWQiLCBCVUlMRFBJRCAoMCwgdGhyZWFkcFtzZWNudW1dLnRpZCkpOwotICAgICAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJCSAgIDAsCi0JCQkJICAgcGFnZXNpemUgKyBzZWNudW0gKiBzaXplb2YgKGNvcmVfc3RfdCkpOwotICAgICAgaWYgKCFuZXdzZWN0KQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi1seW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1seW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL202OGs0a25ldGJzZC5jIGIvYmZkL202OGs0a25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM0MzhkLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrNGtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL202OGsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MTAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9tNjhrCi0jZGVmaW5lIERFRkFVTFRfTUlEIAlNXzY4SzRLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4azRrbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGs0ay1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbGludXguYyBiL2JmZC9tNjhrbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MTc1Ny4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBtNjhrIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUJU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV82ODAyMCB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBNWShPUCkgQ0FUKG02OGtsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbGludXgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7Ci0KLS8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAotICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCi0gICBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXN0YXRpYyBib29sZWFuIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIG02OGtsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLQwKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUJR09UX1JFRl9QUkVGSVgJIl9fR09UXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUJUExUX1JFRl9QUkVGSVgJIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotCQkJICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKgotbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBidWlsdGluOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBpZiAoISBmLT5idWlsdGluKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCQkgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotCSAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLQkgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a2x5bnguYyBiL2JmZC9tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNkZmJjLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBtNjhrIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a25ldGJzZC5jIGIvYmZkL202OGtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMTY2NS4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIE91ciBtNjhrIHBvcnRzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gYWxsIG02OGsgbWFjaGluZXMuICovCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL204OGttYWNoMy5jIGIvYmZkL204OGttYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU2NDA4Li4wMDAwMDAwCi0tLSBhL2JmZC9tODhrbWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgbTg4ayBhLm91dCAoTWFjaCAzKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJKDQwOTYqMikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCTB4MjAwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMSAJCS8qIChOX01BR0lHKHgpID09IFpNQUdJQykgKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgTVkoT1ApIENBVChtODhrbWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tODhrLW1hY2gzIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tYWtlZmlsZS52bXMgYi9iZmQvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZiMWZmLi4wMDAwMDAwCi0tLSBhL2JmZC9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBiZmQgbGlicmFyeSB1bmRlciBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBybWkuZGUKLSMKLSMKLQotQ0M9Y2MKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUhPU1RGSUxFPWFscGhhdm1zLmgKLVRBUkdFVE9CSlMgPSBjcHUtYWxwaGEub2JqCi1lbHNlCi1IT1NURklMRT12YXh2bXMuaAotVEFSR0VUT0JKUyA9IGNwdS12YXgub2JqCi1lbmRpZgotCi0KLU9CSlM9YXJjaGl2ZS5vYmosYXJjaHVyZXMub2JqLGJmZC5vYmosY2FjaGUub2JqLGNvZmZnZW4ub2JqLGNvcmVmaWxlLm9iaixcCi0gIGZvcm1hdC5vYmosaW5pdC5vYmosbGliYmZkLm9iaixvcG5jbHMub2JqLHJlbG9jLm9iaixzZWN0aW9uLm9iaixzeW1zLm9iaixcCi0gIHRhcmdldHMub2JqLGhhc2gub2JqLGxpbmtlci5vYmosZWxmLm9iaixzcmVjLm9iaixiaW5hcnkub2JqLHRla2hleC5vYmosXAotICBpaGV4Lm9iaixzdGFiLXN5bXMub2JqLHZtcy5vYmosdm1zLWhkci5vYmosdm1zLWdzZC5vYmosdm1zLXRpci5vYmosXAotICB2bXMtbWlzYy5vYmosJChUQVJHRVRPQkpTKQotCi1pZmVxICgkKENDKSxnY2MpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc19hbHBoYV92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX2FscGhhX2FyY2giLFwKLSJIQVZFX3Ztc19hbHBoYV92ZWM9MSIpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX3ZheF92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX3ZheF9hcmNoIixcCi0iSEFWRV92bXNfdmF4X3ZlYz0xIiwiVk1TX0RFQlVHIikKLWVuZGlmCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSQoREVGUykKLWVsc2UKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX2FscGhhX3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfYWxwaGFfYXJjaCIsXAotIkhBVkVfdm1zX2FscGhhX3ZlYz0xIiwidW5saW5rPXJlbW92ZSIsImNvbnN0PSIsIlZNU19ERUJVRyIsKQotZWxzZQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc192YXhfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF92YXhfYXJjaCIsXAotIkhBVkVfdm1zX3ZheF92ZWM9MSIsInVubGluaz1yZW1vdmUiLCJjb25zdD0iLCJWTVNfREVCVUciKQotZW5kaWYKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pJChERUZTKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQotZW5kaWYKLQotCi1saWJiZmQub2xiOiBzeXNkZXAuaCBiZmQuaCAkKE9CSlMpCi0JcHVyZ2UKLQlsaWIvY3JlYXRlIGxpYmJmZCAkKE9CSlMpCi0KLXN5c2RlcC5oOiBbLmhvc3RzXSQoSE9TVEZJTEUpIGNvbmZpZy5oCi0JJChDUCkgJDwgJEAKLQotYmZkLmg6IGJmZC1pbjIuaAotCSQkIEBjb25maWd1cmUKLQotdGFyZ21hdGNoLmg6IGJmZC5oCi1jb25maWcuaDogYmZkLmgKLQotdm1zLmM6IHZtcy5oCi12bXMtbWhkLmM6IHZtcy5oCi12bXMtZ3NkLmM6IHZtcy5oCi12bXMtdGlyLmM6IHZtcy5oCi12bXMtbWlzYy5jOiB2bXMuaAotdGFyZ2V0cy5jOiB0YXJnbWF0Y2guaAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pIGxpYmJmZC5vbGI7Ci0JJChSTSkgc3lzZGVwLmg7Ci0JJChSTSkgYmZkLmg7Ci0JJChSTSkgdGFyZ21hdGNoLmg7Ci0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7CmRpZmYgLS1naXQgYS9iZmQvbWlwc2JzZC5jIGIvYmZkL21pcHNic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ODBmYi4uMDAwMDAwMAotLS0gYS9iZmQvbWlwc2JzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBNSVBTIEJTRCAoYS5vdXQpIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUmFscGggQ2FtcGJlbGwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qICNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8gKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gKHgpLmFfZW50cnkgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0JICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRQkvKiBubyBwYWRkaW5nICovXAotICAgICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX21pcHMKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX01JUFMxIHx8IChtdHlwZSkgPT0gTV9NSVBTMikKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXDAnCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtaXBzYnNkXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTVkoc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShBQkZEKTsKLXN0YXRpYyB2b2lkIE1ZKHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG1hY2h0eXBlKSk7Ci1zdGF0aWMgdm9pZCBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIFdlIGNhbid0IHVzZSBNWSh4KSBoZXJlIGJlY2F1c2UgaXQgbGVhZHMgdG8gYSByZWN1cnNpdmUgY2FsbCB0byBDQVQKLSAgIHdoZW4gZXhwYW5kZWQgaW5zaWRlIEpVTVBfVEFCTEUuICAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc2JzZF9yZWxvY19ob3d0b190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgbWlwc2JzZF9jYW5vbmljYWxpemVfcmVsb2MKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1zdGF0aWMgdm9pZAotTVkoc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gKi8KLSAgc3dpdGNoIChtYWNodHlwZSkgewotCi0gIGNhc2UgTV9NSVBTMToKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gMzAwMDsKLSAgICBicmVhazsKLQotICBjYXNlIE1fTUlQUzI6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgbWFjaGluZSA9IDQwMDA7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBtYWNoaW5lID0gMDsKLSAgICBicmVhazsKLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsgIAotfQotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotTVkoY2hvb3NlX3JlbG9jX3NpemUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEJTRCBhLm91dCBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82ODAxMCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDIwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkMpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMjlLKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoKGFiZmQpKSB7Ci0gICAgY2FzZSA0MDAwOgotICAgIGNhc2UgNjAwMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9NSVBTMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gIH0KLQotICBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkoYWJmZCk7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCi0gKi8KLSNkZWZpbmUgTUlQU19SRUxPQ18zMgkJMAotI2RlZmluZSBNSVBTX1JFTE9DX0pNUAkJMQotI2RlZmluZSBNSVBTX1JFTE9DX1dESVNQMTYJMgotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTYJCTMKLSNkZWZpbmUgTUlQU19SRUxPQ19ISTE2X1MJNAotI2RlZmluZSBNSVBTX1JFTE9DX0xPMTYJCTUKLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX01JUFNfSk1QIHJlbG9jYXRpb24uCi0gKiBUaGUganVtcCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvcm1lZCBmcm9tIHRoZSB1cHBlciA0IGJpdHMgb2YgdGhlCi0gKiAiY3VycmVudCIgcHJvZ3JhbSBjb3VudGVyIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBqdW1wIGluc3RydWN0aW9uJ3MKLSAqIDI2IGJpdCBmaWVsZCBhbmQgdHdvIHRyYWlsaW5nIHplcm9zLgotICogSWYgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgbm90IGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlICJjdXJyZW50IgotICogcHJvZ3JhbSBjb3VudGVyLCB0aGVuIHdlIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9qbXBfYWRkciAoYWJmZCxyZWxvY19lbnRyeSxzeW1ib2wsZGF0YSxpbnB1dF9zZWN0aW9uLG91dHB1dF9iZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24sIHBjOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcGMgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyA0OwotCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4RjAwMDAwMDApICE9IChwYyAmIDB4RjAwMDAwMDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX0hJMTZfUyByZWxvY2F0aW9uLgotICogV2UgbmVlZCB0byBzZWUgaWYgYml0IDE1IGlzIHNldCBpbiB0aGUgcmVzdWx0LiBJZiBpdCBpcywgd2UgYWRkCi0gKiAweDEwMDAwIGFuZCBjb250aW51ZSBub3JtYWxseS4gVGhpcyB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzaWduIGV4dGVuc2lvbgotICogd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkIGF0IHJ1biB0aW1lLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19maXhfaGkxNl9zIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAweDgwMDApCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAweDEwMDAwOwotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVfZXh0W10gPSB7Ci0gIHtNSVBTX1JFTE9DXzMyLCAgICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSIzMiIsICAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0pNUCwgICAgIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQltaXBzX2ZpeF9qbXBfYWRkciwKLQkiTUlQU19KTVAiLCBmYWxzZSwgMCwgMHgwM2ZmZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19XRElTUDE2LCAyLCAyLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkiV0RJU1AxNiIsICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19ISTE2LCAgIDE2LCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSJISTE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTZfUywgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgICAgIG1pcHNfZml4X2hpMTZfcywKLSAgICAgICAgIkhJMTZfUyIsICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfTE8xNiwgICAgMCwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSJMTzE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1NWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbWlwcykKLSAgICByZXR1cm4gMDsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DXzMyXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0pNUF0pOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19XRElTUDE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl9TXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfTE8xNl0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KSAKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgIHsKLSAgICAgIGMgPSB0YmxwdHItPmhvd3RvIC0gTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJm1pcHNfaG93dG9fdGFibGVfZXh0W2NdOwotCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgVEFSR0VUX1BBR0VfU0laRSwJCQkvKiB0ZXh0IHZtYSAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIHRleHQgc2l6ZSBpbmNsdWRlcyBleGVjIGhlYWRlciAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19iaWdfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LW1pcHMtbGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYW91dF9taXBzX2JpZ192ZWMsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWMgPQotewotICAiYS5vdXQtbWlwcy1iaWciLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBhb3V0X21pcHNfbGl0dGxlX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKZGlmZiAtLWdpdCBhL2JmZC9tcHctY29uZmlnLmluIGIvYmZkL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWRkZWUuLjAwMDAwMDAKLS0tIGEvYmZkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEJGRC4KLQotIyBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY29ycmVjdC4KLQotU2V0IHNlbGFyY2hzICImYmZkX3t0YXJnZXRfY3B1fV9hcmNoIgotU2V0IGRlZnZlYyAiIgotU2V0IHNlbHZlY3MgIiIKLVNldCBoYXZldmVjcyAiIgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtbTY4ay5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBtNjhrY29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJm02OGtjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfbTY4a2NvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1wbWFjLmMubyAie299Inhjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBwbWFjX3hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmcG1hY194Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3BtYWNfeGNvZmZfdmVjJwotCVNldCBzZWxhcmNocyAiJmJmZF9wb3dlcnBjX2FyY2giCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLWkzODYuYy5vJwotCVNldCBkZWZ2ZWMgaTM4NmNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZpMzg2Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2kzODZjb2ZmX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1taXBzLmMubyAie299ImVjb2ZmLmMubyAie299ImVjb2ZmbGluay5jLm8gIntvfSJlbGYzMi5jLm8gIntvfSJlbGYzMi1taXBzLmMubyAie299ImVsZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgZWNvZmZfYmlnX3ZlYwotCVNldCBzZWx2ZWNzICcmZWNvZmZfYmlnX3ZlYywmZWNvZmZfbGl0dGxlX3ZlYywmYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9lY29mZl9iaWdfdmVjIC1kIEhBVkVfZWNvZmZfbGl0dGxlX3ZlYyAtZCBIQVZFX2JmZF9lbGYzMl9iaWdtaXBzX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtc2guYy5vICJ7b30iY29mZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgc2hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmc2hjb2ZmX3ZlYywmc2hsY29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3NoY29mZl92ZWMgLWQgSEFWRV9zaGxjb2ZmX3ZlYycKLUVuZCBJZgotCi1TZXQgdGEgYGVjaG8ge3NlbGFyY2hzfSB8IHNlZCAtZSAncy8mYmZkXy97b31jcHUtL2cnIC1lICdzL19hcmNoLy5jLm8vZydgCi0KLVNldCB0ZGVmYXVsdHMgIi1kIERFRkFVTFRfVkVDVE9SPXtkZWZ2ZWN9IC1kIFNFTEVDVF9WRUNTPXtzZWx2ZWNzfSAtZCBTRUxFQ1RfQVJDSElURUNUVVJFUz17c2VsYXJjaHN9IHtoYXZldmVjc30iCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAotRWNobyAnV09SRFNJWkUgPSAzMicJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdCRkRfTUFDSElORVMgPSAnIHt0YX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9CQUNLRU5EUyA9ICcge0JGRF9CQUNLRU5EU30JCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFRkFVTFRTID0gJyB7dGRlZmF1bHRzfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnSERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ1RERVBGSUxFUyA9ICcJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaAotCi0jIFdlIGNhbiBvbmx5IGhhbmRsZSAzMi1iaXQgdGFyZ2V0cyByaWdodCBub3cuCi0KLXNlZCAtZSAncy9AV09SRFNJWkVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQHdvcmRzaXplQC8zMi8nIFxPcHRpb24tZAotICAgIC1lICJzL0BWRVJTSU9OQC9gQ2F0ZW5hdGUge3NyY2Rpcn1WRVJTSU9OYC8iIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAvMC8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRALy8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF9VXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0QklUX0xPTkdALzAvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iYmZkLWluMi5oID4ie299ImJmZC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJiZmQuaC1uZXcgIntvfSJiZmQuaAotCi1zZWQgLWUgJ3MvTk4vMzIvZycgIntzcmNkaXJ9ImVsZnh4LXRhcmdldC5oID4ie299ImVsZjMyLXRhcmdldC5oLW5ldwotTW92ZUlmQ2hhbmdlICJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3ICJ7b30iZWxmMzItdGFyZ2V0LmgKLQotIyBQcmUtZXhwYW5kIHNvbWUgbWFjcm9zIGluIGNvZmZzd2FwLmgsIHNvIE1QVyBDIGRvZXNuJ3QgY2hva2UuCi0KLXNlZCAtZSAncy9eICBQVVRfQU9VVEhEUl9UU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9EU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9CU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9FTlRSWSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgIntzcmNkaXJ9ImNvZmZzd2FwLmggPiJ7b30iY29mZnN3YXAuaC1uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29mZnN3YXAuaC1uZXcgIntvfSJjb2Zmc3dhcC5oCmRpZmYgLS1naXQgYS9iZmQvbXB3LW1ha2Uuc2VkIGIvYmZkL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NjNjNy4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBVbml4IEJGRCBNYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0KLSMgV2hhY2sgb3V0IHVudXNlZCBob3N0IGFuZCB0YXJnZXQgZGVmaW5lIGJpdHMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLS9UREVGSU5FUy9zL0BUREVGSU5FU0AvLwotCi0jIEZpeCBwYXRobmFtZXMgdG8gaW5jbHVkZSBkaXJlY3Rvcmllcy4KLS9eSU5DRElSID0gL3MvXklOQ0RJUiA9IC4qJC9JTkNESVIgPSAie3RvcHNyY2Rpcn0iaW5jbHVkZS8KLS9eQ1NFQVJDSCA9IC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmcgb2YgdmFycywgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFkZCB0aGVzZSBpdHNlbGYuCi0vXldPUkRTSVpFID0vcy9eLyMvCi0jIC9eQUxMX0JBQ0tFTkRTL3MvXi8jLwotL15CRkRfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9NQUNISU5FUy9zL14vIy8KLS9eVERFRkFVTFRTL3MvXi8jLwotCi0jIFJlbW92ZSBleHRyYSwgdXNlbGVzcywgImFsbCIuCi0vXmFsbCBcXE9wdGlvbi1mIF9vbGRlc3QvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBNYWtlZmlsZSByZWJ1aWxkIHJ1bGUuCi0vXk1ha2VmaWxlIC8sLy0tcmVjaGVjay9kCi0KLSMgRG9uJ3QgZG8gYW55IHJlY3Vyc2l2ZSBzdWJkaXIgc3R1ZmYuCi0vIHN1YmRpcl9kby9zL3tNQUtFfS9udWxsLWNvbW1hbmQvCi0KLS9CRkRfSC9zL157QkZEX0h9LyN7QkZEX0h9LwotCi0jIEFkZCBleHBsaWNpdCBzcmNkaXIgcGF0aHMgdG8gc3BlY2lhbCBmaWxlcy4KLS9jb25maWcuYmZkL3MvIGNvbmZpZy5iZmQvICJ7c30iY29uZmlnLmJmZC9nCi0vdGFyZ21hdGNoLnNlZC9zLyB0YXJnbWF0Y2guc2VkLyAie3N9InRhcmdtYXRjaC5zZWQvZwotCi0jIFBvaW50IGF0IGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluIHRoZSBvYmpkaXIuCi0vYmZkL3MvIntzfSJiZmRcLmgvIntvfSJiZmQuaC9nCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vdGFyZ21hdGNoL3MvIntzfSJ0YXJnbWF0Y2hcLmgvIntvfSJ0YXJnbWF0Y2guaC9nCi0vdGFyZ21hdGNoL3MvXnRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oLwotL2VsZjMyLXRhcmdldC9zLyJ7c30iZWxmMzItdGFyZ2V0XC5oLyJ7b30iZWxmMzItdGFyZ2V0LmgvZwotL2VsZjMyLXRhcmdldC9zL15lbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC8KLS9lbGY2NC10YXJnZXQvcy8ie3N9ImVsZjY0LXRhcmdldFwuaC8ie299ImVsZjY0LXRhcmdldC5oL2cKLS9lbGY2NC10YXJnZXQvcy9eZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvCi0KLS8ie3N9IntJTkNESVJ9L3MvIntzfSJ7SU5DRElSfS8ie0lOQ0RJUn0iL2cKLQotL2RlcC9zL1wuZGVwL19fZGVwL2cKLQotIyBSZW1vdmluZyBkdXBsaWNhdGVzIGlzIGNvb2wgYnV0IHByZXNlbnRseSB1bm5lY2Vzc2FyeSwKLSMgc28gd2hhY2sgdGhpcyBvdXQuCi0vXm9maWxlcyBcXE9wdGlvbi1mLywvXiQvZAotL29maWxlcy9zL3tPRklMRVN9IG9maWxlcy97T0ZJTEVTfS8KLS9lY2hvIG9maWxlcyA9IC9kCi0vY2F0IG9maWxlcy9zL2BjYXQgb2ZpbGVzYC97T0ZJTEVTfS8KLQotIyBObyBjb3JlZmlsZSBzdXBwb3J0LgotL0NPUkVGSUxFL3MvQENPUkVGSUxFQC8vCi0vQ09SRUZMQUcvcy9AQ09SRUZMQUdALy8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBNUFcgTWFrZSBkb2Vzbid0IGtub3cgYWJvdXQgJDwuCi0vIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30idGFyZ2V0cy5jLm8gXFxPcHRpb24tZiAie3N9InRhcmdldHMuYyBNYWtlZmlsZVwKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0FMTF9DRkxBR1N9IHtUREVGQVVMVFN9ICJ7c30idGFyZ2V0cy5jIC1vICJ7b30idGFyZ2V0cy5jLm8KLQotLyJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJhcmNodXJlcy5jIC1vICJ7b30iYXJjaHVyZXMuYy5vCi0KLSMgUmVtb3ZlIHRoZSAuaCByZWJ1aWxkaW5nIHJ1bGVzLCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIGRvYyBzdWJkaXIsCi0jIG9yIGEgd2F5IHRvIGJ1aWxkIHRoZSBwcm90b3R5cGUtaGFja2luZyB0b29sIHRoYXQncyBpbiBpdC4KLS9eIntzcmNkaXJ9ImJmZC1pbjIuaCBcXE9wdGlvbi1mIC8sL14kL2QKLS9eIntzcmNkaXJ9ImxpYmJmZC5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliY29mZi5oIFxcT3B0aW9uLWYgLywvXiQvZApkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC1jb3JlLmMgYi9iZmQvbmV0YnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4YzJhMS4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIE5ldEJTRCBzdHlsZSBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYXVsIEtyYW5lbmJ1cmcsIEVVUgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKgotICogRklYTUU6IE9uIE5ldEJTRC9zcGFyYyBDT1JFX0ZQVV9PRkZTRVQgc2hvdWxkIGJlIChzaXplb2Yoc3RydWN0IHRyYXBmcmFtZSkpCi0gKi8KLQotc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCB7Ci0Jc3RydWN0IGNvcmUgY29yZTsKLX0gKnJhd3B0cjsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgluZXRic2RfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY2hhciAqCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4JCW5ldGJzZF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAkJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEhhbmRsZSBOZXRCU0Qtc3R5bGUgY29yZSBkdW1wIGZpbGUuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotbmV0YnNkX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLQlpbnQJCWksIHZhbCwgb2Zmc2V0OwotCWFzZWN0aW9uCSphc2VjdCwgKmFzZWN0MjsKLQlzdHJ1Y3QgY29yZQljb3JlOwotCXN0cnVjdCBjb3Jlc2VnCWNvcmVzZWc7Ci0KLQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZSwgMSwgc2l6ZW9mIGNvcmUsIGFiZmQpOwotCWlmICh2YWwgIT0gc2l6ZW9mIGNvcmUpIHsKLQkJLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChDT1JFX0dFVE1BR0lDKGNvcmUpICE9IENPUkVNQUdJQykgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHIgPSAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QpKTsKLQlpZiAocmF3cHRyID09IE5VTEwpIHsKLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmF3cHRyLT5jb3JlID0gY29yZTsKLQlhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhID0gcmF3cHRyOwotCi0Jb2Zmc2V0ID0gY29yZS5jX2hkcnNpemU7Ci0JZm9yIChpID0gMDsgaSA8IGNvcmUuY19uc2VnOyBpKyspIHsKLQotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JCQlnb3RvIHB1bnQ7Ci0KLQkJdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJmNvcmVzZWcsIDEsIHNpemVvZiBjb3Jlc2VnLCBhYmZkKTsKLQkJaWYgKHZhbCAhPSBzaXplb2YgY29yZXNlZykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCQkJZ290byBwdW50OwotCQl9Ci0JCWlmIChDT1JFX0dFVE1BR0lDKGNvcmVzZWcpICE9IENPUkVTRUdNQUdJQykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCW9mZnNldCArPSBjb3JlLmNfc2VnaGRyc2l6ZTsKLQotCQlhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YoYXNlY3Rpb24pKTsKLQkJaWYgKGFzZWN0ID09IE5VTEwpIHsKLQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQotCQlhc2VjdC0+X3Jhd19zaXplID0gY29yZXNlZy5jX3NpemU7Ci0JCWFzZWN0LT52bWEgPSBjb3Jlc2VnLmNfYWRkcjsKLQkJYXNlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0JCWFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQlhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotCQlhYmZkLT5zZWN0aW9uX2NvdW50Kys7Ci0JCW9mZnNldCArPSBjb3Jlc2VnLmNfc2l6ZTsKLQotCQlzd2l0Y2ggKENPUkVfR0VURkxBRyhjb3Jlc2VnKSkgewotCQljYXNlIENPUkVfQ1BVOgotCQkJYXNlY3QtPm5hbWUgPSAiLnJlZyI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTOwotI2lmZGVmIENPUkVfRlBVX09GRlNFVAotCQkJLyogSGFja2lzaC4uLiAqLwotCQkJYXNlY3QtPl9yYXdfc2l6ZSA9IENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0MiA9IChhc2VjdGlvbiAqKWJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCQkJIHNpemVvZiAoYXNlY3Rpb24pKTsKLQkJCWlmIChhc2VjdDIgPT0gTlVMTCkgewotCQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkJZ290byBwdW50OwotCQkJfQotCQkJYXNlY3QyLT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZSAtIENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0Mi0+dm1hID0gMDsKLQkJCWFzZWN0Mi0+ZmlsZXBvcyA9IGFzZWN0LT5maWxlcG9zICsgQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQkJYXNlY3QyLT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCQlhc2VjdDItPm5hbWUgPSAiLnJlZzIiOwotCQkJYXNlY3QyLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0MjsKLQkJCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLSNlbmRpZgotCi0JCQlicmVhazsKLQkJY2FzZSBDT1JFX0RBVEE6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQljYXNlIENPUkVfU1RBQ0s6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuc3RhY2siOwotCQkJYXNlY3QtPmZsYWdzID0gU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFM7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCXJldHVybiBhYmZkLT54dmVjOwotCi1wdW50Ogl7Ci0JCWFzZWN0aW9uCSphbmV4dDsKLQkJZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhbmV4dCkgewotCQkJYW5leHQgPSBhc2VjdC0+bmV4dDsKLQkJCWZyZWUoKHZvaWQgKilhc2VjdCk7Ci0JCX0KLQl9Ci0JZnJlZSAoKHZvaWQgKilyYXdwdHIpOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQlhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIqCi1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLQliZmQgKmFiZmQ7Ci17Ci0gLypyZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsqLwotICByZXR1cm4gYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YS0+Y29yZS5jX25hbWU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAgLypyZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfc2lnbm87Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG5ldGJzZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAibmV0YnNkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBuZXRic2RfY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAobmV0YnNkKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9uZXRic2QuaCBiL2JmZC9uZXRic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwZWQ5NS4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIE5ldEJTRCB0YXJnZXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLVVTQS4gICovCi0KLS8qIENoZWNrIGZvciBvdXIgbWFjaGluZSB0eXBlIChwYXJ0IG9mIG1hZ2ljIG51bWJlcikuICovCi0jaWZuZGVmIE1BQ0hUWVBFX09LCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG0pICgobSkgPT0gREVGQVVMVF9NSUQgfHwgKG0pID09IE1fVU5LTk9XTikKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBub3JtYWwgbG9hZCBhZGRyZXNzIGZvciBleGVjdXRhYmxlcy4gKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCQlUQVJHRVRfUEFHRV9TSVpFCi0KLS8qIE5ldEJTRCBaTUFHSUMgaGFzIGl0cyBoZWFkZXIgaW4gdGhlIHRleHQgc2VnbWVudC4gICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMQotCi0vKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIHRoZSBmbGFncy4gKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIAkoTl9EWU5BTUlDKHgpKQotCi0vKiBXZSBoYXZlIDYgYml0cyBvZiBmbGFncyBhbmQgMTAgYml0cyBvZiBtYWNoaW5lIElELiAgKi8KLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCi0JKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgwM2ZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0JIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAotCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0JICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogT24gTmV0QlNELCB0aGUgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBpbiBudG9obCdzICJuZXR3b3JrIiAoYmlnLWVuZGlhbikKLSAgIGZvcm1hdC4gICovCi0jZGVmaW5lIFNXQVBfTUFHSUMoZXh0KSBiZmRfZ2V0YjMyIChleHQpCi0KLS8qIE9uIE5ldEJTRCwgdGhlIGVudHJ5IHBvaW50IG1heSBiZSB0YWtlbiB0byBiZSB0aGUgc3RhcnQgb2YgdGhlIHRleHQKLSAgIHNlY3Rpb24uICAqLwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIFdlIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1hZ2ljIG51bWJlciBoYXMgYmVlbiBzZXQuICBUaGlzCi0gICAgIHdpbGwgbm9ybWFsbHkgaGF2ZSBiZWVuIGRvbmUgYnkgc2V0X3NlY3Rpb25fY29udGVudHMsIGJ1dCBvbmx5IGlmCi0gICAgIHRoZXJlIGFjdHVhbGx5IGFyZSBzb21lIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICAgICAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0KLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICAgIH0KLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgREVGQVVMVF9BUkNIOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgREVGQVVMVF9NSUQpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFRoZSBOZXRCU0QgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBiaWctZW5kaWFuICovCi0jaWZuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgLyogWFhYIGFyZW4ndCB0aGVyZSBhbnkgbWFjcm8gdG8gY2hhbmdlIGJ5dGVvcmRlciBvZiBhIHdvcmQgaW5kZXBlbmRlbnQgb2YKLSAgICAgdGhlIGhvc3QncyBvciB0YXJnZXQncyBlbmRpYW5lc3Nlcz8gICovCi0gIGV4ZWNwLT5hX2luZm8KLSAgICA9IChleGVjcC0+YV9pbmZvICYgMHhmZikgPDwgMjQgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMCkgPDwgOAotICAgICAgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwKSA+PiA4IHwgKGV4ZWNwLT5hX2luZm8gJiAweGZmMDAwMDAwKSA+PiAyNDsKLSNlbmRpZgotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25ld3NvczMuYyBiL2JmZC9uZXdzb3MzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzdhNzUuLjAwMDAwMDAKLS0tIGEvYmZkL25ld3NvczMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV3c09TMyAoU29ueSwgNjhrKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE1ZKE9QKSBDQVQobmV3c29zM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW5ld3NvczMiCi0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nIHdoZW4gY29tcGlsZWQgd2l0aCAtV2FsbC4gKi8KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbS10YXJnZXQuaCBiL2JmZC9ubG0tdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWUyNTUuLjAwMDAwMDAKLS0tIGEvYmZkL25sbS10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIDMyLzY0LWJpdCBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBubG1fY29yZV9maWxlX3AgX2JmZF9kdW1teV90YXJnZXQKLQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiIG5sbU5BTUUoZ2V0X3N5bXRhYikKLSNkZWZpbmUgbmxtX21ha2VfZW1wdHlfc3ltYm9sIG5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wgbmxtTkFNRShwcmludF9zeW1ib2wpCi0jZGVmaW5lIG5sbV9nZXRfc3ltYm9sX2luZm8gbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIG5sbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG5sbV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgbmxtX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG5sbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG5sbV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG5sbV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fY2Fub25pY2FsaXplX3JlbG9jIG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBubG1fYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzIG5sbU5BTUUoc2V0X3NlY3Rpb25fY29udGVudHMpCi0KLSNkZWZpbmUgbmxtX3NpemVvZl9oZWFkZXJzIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIG5sbV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG5sbV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG5sbV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG5sbV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBubG1fYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgbmxtX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB1c2Ugd2hlbiBpbml0aWFsaXNpbmcgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkLiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0JJR19OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMKLSAgIHwgV1BfVEVYVCksCi0gIAotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0NPREUgfCBTRUNfREFUQSksIAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgIDAsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTUsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBubG1OQU1FKG9iamVjdF9wKSwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBubG1fY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBJbml0aWFsaXplIGEganVtcCB0YWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBtYWNyby4gIEFsbCBuYW1lcyBzdGFydCB3aXRoCi0gICAgICJubG0iICovCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgLyogQWx0ZXJuYXRpdmUgZW5kaWFuIHRhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSAgJiBUQVJHRVRfTElUVExFX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgVEFSR0VUX0JBQ0tFTkRfREFUQQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUwotICAgfCBXUF9URVhUKSwKLSAgCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfREFUQSksIAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgIDAsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTUsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBubG1OQU1FKG9iamVjdF9wKSwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBubG1fY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBJbml0aWFsaXplIGEganVtcCB0YWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBtYWNyby4gIEFsbCBuYW1lcyBzdGFydCB3aXRoCi0gICAgICJubG0iICovCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgLyogQWx0ZXJuYXRpdmUgZW5kaWFuIHRhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgVEFSR0VUX0JBQ0tFTkRfREFUQQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL25sbS5jIGIvYmZkL25sbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM2YmFhLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0uYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJubG0uaCIKLQotLyogTWFrZSBhbiBOTE0gb2JqZWN0LiAgV2UganVzdCBuZWVkIHRvIGFsbG9jYXRlIHRoZSBiYWNrZW5kCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLW5sbV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgbmxtX3RkYXRhIChhYmZkKSA9Ci0gICAgKHN0cnVjdCBubG1fb2JqX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKTsKLSAgaWYgKG5sbV90ZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICBpZiAobmxtX2FyY2hpdGVjdHVyZSAoYWJmZCkgIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKSwKLQkJCSAgICAgICBubG1fbWFjaGluZSAoYWJmZCkpOwotCi0gIC8qIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgZG9uZSBhdCBjbG9zZSB0aW1lLCBkbyB3ZSBuZWVkIGFueSBpbml0aWFsaXphdGlvbj8gKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgZm9yIGFuIE5MTSBvYmplY3QuICAqLwotCi1ib29sZWFuCi1ubG1fc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiBhcmNoID09IG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLWFscGhhLmMgYi9iZmQvbmxtMzItYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjOGU1MS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg5MiArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgQWxwaGEgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgMzIgYml0IEFscGhhIE5MTSBmb3JtYXQuICBZb3UgbWlnaHQgdGhpbmsKLSAgIHRoYXQgYW4gQWxwaGEgY2hpcCB3b3VsZCB1c2UgYSA2NCBiaXQgZm9ybWF0LCBidXQsIGZvciBzb21lIHJlYXNvbiwKLSAgIGl0IGRvZXNuJ3QuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vYWxwaGEtZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfYWxwaGFfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX2JhY2tlbmRfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV93cml0ZV9wcmVmaXgKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV93cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJmZF92bWEgbmxtX2FscGhhX2dldF9wdWJsaWNfb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV93cml0ZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0MCi0vKiBBbHBoYSBOTE0ncyBoYXZlIGEgcHJlZml4IGhlYWRlciBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTS4gIFRoaXMKLSAgIGZ1bmN0aW9uIHJlYWRzIGl0IGluLCB2ZXJpZmllcyB0aGUgdmVyc2lvbiwgYW5kIHNlZWtzIHRoZSBiZmQgdG8KLSAgIHRoZSBsb2NhdGlvbiBiZWZvcmUgdGhlIHJlZ3VsYXIgTkxNIGhlYWRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBzLm1hZ2ljKSAhPSBOTE0zMl9BTFBIQV9NQUdJQykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFNob3VsZCB3ZSBjaGVjayB0aGUgZm9ybWF0IG51bWJlcj8gICovCi0KLSAgLyogU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuICAqLwotICBzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzLnNpemUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNpemUsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBwcmVmaXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3dyaXRlX3ByZWZpeCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotCi0gIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgTkxNMzJfQUxQSEFfTUFHSUMsIHMubWFnaWMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSAyLCBzLmZvcm1hdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNpemVvZiBzLCBzLnNpemUpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZCBieSBpdHNlbGYuICBIb3dldmVyLCBpdCBhcHBlYXJzIGFmdGVyIGEKLSAgICAgR1BESVNQIHJlbG9jIHRvIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbG93IG9yZGVyIDE2IGJpdHMKLSAgICAgb2YgdGhlIGdwIHJlZ2lzdGVyIGFyZSBsb2FkZWQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZRVUFELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgR1AgcmVsYXRpdmUgb2Zmc2V0LiAgVGhpcyBpcyBqdXN0IGxpa2UgUkVGTE9ORyBleGNlcHQKLSAgICAgdGhhdCB3aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIHRoZSB2YWx1ZSBvZiB0aGUgZ3AgcmVnaXN0ZXIgd2lsbCBiZQotICAgICBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AKLSAgICAgcmVnaXN0ZXIuICBUaGUgb2Zmc2V0IGlzIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbi4gIFRoaXMKLSAgICAgcmVsb2MgYWx3YXlzIHNlZW1zIHRvIGJlIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBvbmx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgTElURVJBTCByZWxvYy4KLSAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IHNlZW1zIHRoYXQgdGhlIGxpbmtlciBjYW4KLSAgICAgdXNlIHRoaXMgdG8gZWxpbWluYXRlIGEgcG9ydGlvbiBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoZSBzeW1ib2wKLSAgICAgaW5kZXggaXMgc3BlY2lhbDogMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlCi0gICAgIHJlZ2lzdGVyIG9mIGEgbWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbAotICAgICBhZGRyZXNzIGlzIGluIHRoZSBieXRlIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uCi0gICAgIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldAotICAgICByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4gIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55Ci0gICAgIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9MSVRVU0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRVU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvYWQgdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBpcyBhbHdheXMgdXNlZCBmb3IgYSBsZGFoIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSBncCByZWdpc3Rlci4gIFRoZSBuZXh0IHJlbG9jCi0gICAgIHdpbGwgYmUgYW4gSUdOT1JFIHJlbG9jIHdoaWNoIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsZGEKLSAgICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbG9hZHMgdGhlIGxvd2VyIDE2IGJpdHMuICBUaGUgc3ltYm9sIGluZGV4IG9mCi0gICAgIHRoZSBHUERJU1AgaW5zdHJ1Y3Rpb24gYXBwZWFycyB0byBhY3R1YWxseSBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgIGJldHdlZW4gdGhlIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMuICBUaGlzIGdpdmVzIHR3byBkaWZmZXJlbnQKLSAgICAgd2F5cyB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGxkYSBpbnN0cnVjdGlvbiBpczsgSSBkb24ndCBrbm93IHdoeQotICAgICBib3RoIGFyZSB1c2VkLiAgVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHJlbG9jYXRpb24gaXMgdGhlCi0gICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1AgdmFsdWUgYW5kIHRoZSBjdXJyZW50IGxvY2F0aW9uOyB0aGUKLSAgICAgbG9hZCB3aWxsIGFsd2F5cyBiZSBkb25lIGFnYWluc3QgYSByZWdpc3RlciBob2xkaW5nIHRoZSBjdXJyZW50Ci0gICAgIGFkZHJlc3MuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUERJU1AsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gIEl0IHNlZW1zIHRvIG1lIHRoYXQgdGhpcwotICAgICByZWxvYywgdW5saWtlIHRoZSBvdGhlcnMsIGlzIG5vdCBwYXJ0aWFsX2lucGxhY2UuICAqLwotICBIT1dUTyAoQUxQSEFfUl9CUkFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSElOVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QVVNILAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgotICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQWRqdXN0IHRoZSBHUCB2YWx1ZSBmb3IgYSBuZXcgcmFuZ2UgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BWQUxVRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BWQUxVRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ud19ob3d0byA9Ci0gIEhPV1RPIChBTFBIQV9SX05XX1JFTE9DLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJOV19SRUxPQyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYW4gQWxwaGEgTkxNIHJlbG9jLiAgVGhpcyByb3V0aW5lIGtlZXBzIHNvbWUgc3RhdGljIGRhdGEgd2hpY2gKLSAgIGl0IHVzZXMgd2hlbiBoYW5kbGluZyBsb2NhbCByZWxvY3MuICBUaGlzIG9ubHkgd29ya3MgY29ycmVjdGx5Ci0gICBiZWNhdXNlIGFsbCB0aGUgbG9jYWwgcmVsb2NzIGFyZSByZWFkIGF0IG9uY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBzdGF0aWMgYmZkX3ZtYSBncF92YWx1ZTsKLSAgc3RhdGljIGJmZF92bWEgbGl0YV9hZGRyZXNzOwotICBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBiZmRfdm1hIHJfdmFkZHI7Ci0gIGxvbmcgcl9zeW1uZHg7Ci0gIGludCByX3R5cGUsIHJfZXh0ZXJuLCByX29mZnNldCwgcl9zaXplOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKLQotICAvKiBSZWFkIHRoZSByZWxvYyBmcm9tIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTd2FwIGluIHRoZSByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0gIHJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQucl92YWRkcik7Ci0gIHJfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIHJfdHlwZSA9ICgoZXh0LnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCSAgICA+PiBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSk7Ci0gIHJfZXh0ZXJuID0gKGV4dC5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFKSAhPSAwOwotICByX29mZnNldCA9ICgoZXh0LnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpCi0JICAgICAgPj4gUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSk7Ci0gIC8qIElnbm9yZSB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gIHJfc2l6ZSA9ICgoZXh0LnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCSAgICA+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgLyogRmlsbCBpbiB0aGUgQkZEIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAocl9leHRlcm4pCi0gICAgewotICAgICAgLyogRXh0ZXJuYWwgcmVsb2NhdGlvbnMgYXJlIG9ubHkgdXNlZCBmb3IgaW1wb3J0cy4gICovCi0gICAgICBCRkRfQVNTRVJUIChzeW0gIT0gTlVMTCk7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHNldCBzeW1fcHRyX3B0ciBmb3IgdGhpcyBjYXNlLiAgSXQgaXMgc2V0IGluCi0JIG5sbV9jYW5vbmljYWxpemVfcmVsb2MuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgICByZWwtPmFkZGVuZCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW50ZXJuYWwgcmVsb2NhdGlvbnMgYXJlIG9ubHkgdXNlZCBmb3IgbG9jYWwgcmVsb2NhdGlvbgotCSBmaXh1cHMuICBJZiB0aGV5IGFyZSBub3QgTldfUkVMT0Mgb3IgR1BESVNQIG9yIElHTk9SRSwgdGhleQotCSBtdXN0IGJlIGFnYWluc3QgLnRleHQgb3IgLmRhdGEuICAqLwotICAgICAgQkZEX0FTU0VSVCAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MgfHwgc3ltID09IE5VTEwpOwotICAgICAgaWYgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DCi0JICB8fCByX3R5cGUgPT0gQUxQSEFfUl9HUERJU1AKLQkgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX0lHTk9SRSkKLQl7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocl9zeW1uZHggPT0gQUxQSEFfUkVMT0NfU0VDVElPTl9URVhUKQotCXsKLQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBjb2RlX3NlYy0+c3ltYm9sX3B0cl9wdHI7Ci0JICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjb2RlX3NlYykgPT0gMCk7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocl9zeW1uZHggPT0gQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBKQotCXsKLQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBkYXRhX3NlYy0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IC0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgZGF0YV9zZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIHVzZSB0aGUgYWRkcmVzcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcmVsb2MgaXMgaW4gdGhlIC50ZXh0Ci0gICAgIG9yIC5kYXRhIHNlY3Rpb24uICBSX05XX1JFTE9DIHJlbG9jcyBkb24ndCByZWFsbHkgaGF2ZSBhIHNlY3Rpb24sCi0gICAgIHNvIHdlIHB1dCB0aGVtIGluIC50ZXh0LiAgKi8KLSAgaWYgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DCi0gICAgICB8fCByX3ZhZGRyIDwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpKQotICAgIHsKLSAgICAgICpzZWNwID0gY29kZV9zZWM7Ci0gICAgICByZWwtPmFkZHJlc3MgPSByX3ZhZGRyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpzZWNwID0gZGF0YV9zZWM7Ci0gICAgICByZWwtPmFkZHJlc3MgPSByX3ZhZGRyIC0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLQotICAvKiBXZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kIGJhc2VkIG9uIHRoZSB0eXBlLiAgKi8KLSAgQkZEX0FTU0VSVCAoKHJfdHlwZSA+PSAwICYmIHJfdHlwZSA8PSBBTFBIQV9SX0dQVkFMVUUpCi0JICAgICAgfHwgcl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfQlJBRERSOgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMTY6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUwzMjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDY0OgotICAgICAgLyogVGhlIFBDIHJlbGF0aXZlIHJlbG9jcyBkbyBub3Qgc2VlbSB0byB1c2UgdGhlIHNlY3Rpb24gVk1BIGFzCi0JIGEgbmVnYXRpdmUgYWRkZW5kLiAgKi8KLSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0gICAgICAvKiBDb3B5IHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZGRlbmQsIHRvCi0JIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29uZnVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISByX2V4dGVybikKLQlyZWwtPmFkZGVuZCArPSBncF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0gICAgICBCRkRfQVNTRVJUICghIHJfZXh0ZXJuKTsKLSAgICAgIHJlbC0+YWRkZW5kICs9IGxpdGFfYWRkcmVzczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0xJVFVTRToKLSAgICBjYXNlIEFMUEhBX1JfR1BESVNQOgotICAgICAgLyogVGhlIExJVFVTRSBhbmQgR1BESVNQIHJlbG9jcyBkbyBub3QgdXNlIGEgc3ltYm9sLCBvciBhbgotCSBhZGRlbmQsIGJ1dCB0aGV5IGRvIHVzZSBhIHNwZWNpYWwgY29kZS4gIFB1dCB0aGlzIGNvZGUgaW4gdGhlCi0JIGFkZGVuZCBmaWVsZC4gICovCi0gICAgICByZWwtPmFkZGVuZCA9IHJfc3ltbmR4OwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICAvKiBUaGUgU1RPUkUgcmVsb2MgbmVlZHMgdGhlIHNpemUgYW5kIG9mZnNldCBmaWVsZHMuICBXZSBzdG9yZQotCSB0aGVtIGluIHRoZSBhZGRlbmQuICAqLwotICAgICAgQkZEX0FTU0VSVCAocl9vZmZzZXQgPCAyNTYgJiYgcl9zaXplIDwgMjU2KTsKLSAgICAgIHJlbC0+YWRkZW5kID0gKHJfb2Zmc2V0IDw8IDgpICsgcl9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIC8qIFRoZSBQVVNILCBQU1VCIGFuZCBQUlNISUZUIHJlbG9jcyBkbyBub3QgYWN0dWFsbHkgdXNlIGFuCi0JIGFkZHJlc3MuICBJIGJlbGlldmUgdGhhdCB0aGUgYWRkcmVzcyBzdXBwbGllZCBpcyByZWFsbHkgYW4KLQkgYWRkZW5kLiAgKi8KLSAgICAgIHJlbC0+YWRkZW5kID0gcl92YWRkcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQVkFMVUU6Ci0gICAgICAvKiBSZWNvcmQgdGhlIG5ldyBncCB2YWx1ZS4gICovCi0gICAgICBncF92YWx1ZSArPSByX3N5bW5keDsKLSAgICAgIHJlbC0+YWRkZW5kID0gZ3BfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6Ci0gICAgICAvKiBJZiB0aGUgdHlwZSBpcyBBTFBIQV9SX0lHTk9SRSwgbWFrZSBzdXJlIHRoaXMgaXMgYSByZWZlcmVuY2UKLQkgdG8gdGhlIGFic29sdXRlIHNlY3Rpb24gc28gdGhhdCB0aGUgcmVsb2MgaXMgaWdub3JlZC4gIEZvcgotCSBzb21lIHJlYXNvbiB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jIHR5cGUgaXMgbm90IGFkanVzdGVkIGJ5Ci0JIHRoZSBzZWN0aW9uIHZtYS4gIFdlIHJlY29yZCB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUKLQkgaGVyZSwgZm9yIGNvbnZlbmllbmNlIHdoZW4gZG9pbmcgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIHJlbC0+YWRkcmVzcyA9IHJfdmFkZHI7Ci0gICAgICByZWwtPmFkZGVuZCA9IGdwX3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTldfUkVMT0M6Ci0gICAgICAvKiBJZiB0aGlzIGlzIFNFVEdQLCB3ZSBzZXQgdGhlIGFkZGVuZCB0byAwLiAgT3RoZXJ3aXNlIHdlIHNldAotCSB0aGUgYWRkZW5kIHRvIHRoZSBzaXplIG9mIHRoZSAubGl0YSBzZWN0aW9uICh0aGlzIGlzCi0JIHJfc3ltbmR4KSBwbHVzIDEuICBXZSBoYXZlIGFscmVhZHkgc2V0IHRoZSBhZGRyZXNzIG9mIHRoZQotCSByZWxvYyB0byByX3ZhZGRyLiAgKi8KLSAgICAgIGlmIChyX3NpemUgPT0gQUxQSEFfUl9OV19SRUxPQ19TRVRHUCkKLQl7Ci0JICBncF92YWx1ZSA9IHJfdmFkZHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocl9zaXplID09IEFMUEhBX1JfTldfUkVMT0NfTElUQSkKLQl7Ci0JICBsaXRhX2FkZHJlc3MgPSByX3ZhZGRyOwotCSAgcmVsLT5hZGRlbmQgPSByX3N5bW5keCArIDE7Ci0JfQotICAgICAgZWxzZQotCUJGRF9BU1NFUlQgKDApOwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQykKLSAgICByZWwtPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotICBlbHNlCi0gICAgcmVsLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYW5nbGUgQWxwaGEgTkxNIHJlbG9jcyBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBBTFBIQSBOTE0gaW1wb3J0IHJlY29yZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAoIW5sbV9yZWxvY3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1fYWxwaGFfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCQkmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYW4gQWxwaGEgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHJfdmFkZHI7Ci0gIGxvbmcgcl9zeW1uZHg7Ci0gIGludCByX3R5cGUsIHJfZXh0ZXJuLCByX29mZnNldCwgcl9zaXplOwotICBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcmVsb2MgZXh0OwotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIEdldCB2YWx1ZXMgZm9yIHRoZSByZWxvY2F0aW9uIGZpZWxkcy4gICovCi0gIHJfdHlwZSA9IHJlbC0+aG93dG8tPnR5cGU7Ci0gIGlmIChyX3R5cGUgIT0gQUxQSEFfUl9OV19SRUxPQykKLSAgICB7Ci0gICAgICByX3ZhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXJfdmFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwKLQkJCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkJCSAgICAgIE5MTV9DT0RFX05BTUUpKTsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9zeW1uZHggPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2V4dGVybiA9IDA7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCi0JICAgIHJfc3ltbmR4ID0gQUxQSEFfUkVMT0NfU0VDVElPTl9URVhUOwotCSAgZWxzZQotCSAgICByX3N5bW5keCA9IEFMUEhBX1JFTE9DX1NFQ1RJT05fREFUQTsKLQl9Ci0gICAgICByX29mZnNldCA9IDA7Ci0gICAgICByX3NpemUgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBBTFBIQV9SX0xJVFVTRToKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgcl9zeW1uZHggPSByZWwtPmFkZGVuZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotCSAgcl9zaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotCSAgcl9vZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIHJfdmFkZHIgPSByZWwtPmFkZGVuZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIHJfdmFkZHIgPSByZWwtPmFkZHJlc3M7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MgKi8KLSAgICAgIHJfdmFkZHIgPSByZWwtPmFkZHJlc3M7Ci0gICAgICBpZiAocmVsLT5hZGRlbmQgPT0gMCkKLQl7Ci0JICByX3N5bW5keCA9IDA7Ci0JICByX3NpemUgPSBBTFBIQV9SX05XX1JFTE9DX1NFVEdQOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX3N5bW5keCA9IHJlbC0+YWRkZW5kIC0gMTsKLQkgIHJfc2l6ZSA9IEFMUEhBX1JfTldfUkVMT0NfTElUQTsKLQl9Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX29mZnNldCA9IDA7Ci0gICAgfQotCi0gIC8qIFN3YXAgb3V0IHRoZSByZWxvY2F0aW9uIGZpZWxkcy4gICovCi0gIGJmZF9oX3B1dF82NCAoYWJmZCwgcl92YWRkciwgKGJmZF9ieXRlICopIGV4dC5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCByX3N5bW5keCwgKGJmZF9ieXRlICopIGV4dC5yX3N5bW5keCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBleHQucl9iaXRzWzBdID0gKChyX3R5cGUgPDwgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpCi0JCSAgICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpOwotICBleHQucl9iaXRzWzFdID0gKChyX2V4dGVybiA/IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUgOiAwKQotCQkgICB8ICgocl9vZmZzZXQgPDwgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSkKLQkJICAgICAgJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKSk7Ci0gIGV4dC5yX2JpdHNbMl0gPSAwOwotICBleHQucl9iaXRzWzNdID0gKChyX3NpemUgPDwgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpCi0JCSAgICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGlmIChiZmRfd3JpdGUgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQWxwaGEgTmV0V2FyZSBkb2VzIG5vdCB1c2UgdGhlIGhpZ2ggYml0IHRvIGRldGVybWluZSB3aGV0aGVyIGEKLSAgIHB1YmxpYyBzeW1ib2wgaXMgaW4gdGhlIGNvZGUgc2VnbWVudCBvciB0aGUgZGF0YSBzZWdtZW50LiAgSW5zdGVhZCwKLSAgIGl0IGp1c3QgdXNlcyB0aGUgYWRkcmVzcy4gIFRoZSBzZXRfcHVibGljX3NlY3Rpb24gYW5kCi0gICBnZXRfcHVibGljX29mZnNldCByb3V0aW5lcyBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb2RlIHdoaWNoIHVzZXMgdGhlCi0gICBoaWdoIGJpdC4gICovCi0KLS8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24gKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKLQotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChzeW0tPnN5bWJvbC52YWx1ZSA8IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKSkKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gY29kZV9zZWM7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGRhdGFfc2VjOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgLT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgICAgLyogVGhlIGRhdGEgc2VnbWVudCBoYWQgYmV0dGVyIGJlIGFsaWduZWQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKSAmIDB4ZikgPT0gMCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbmxtX2FscGhhX2dldF9wdWJsaWNfb2Zmc2V0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICByZXR1cm4gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci19Ci0MCi0vKiBXcml0ZSBhbiBBbHBoYSBOTE0gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV93cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLSAgYXJlbGVudCByOwotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCArIDIsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgZmlyc3QgdHdvIHJlbG9jcyBmb3IgZWFjaCBleHRlcm5hbCBzeW1ib2wgYXJlIHRoZSAubGl0YQotICAgICBhZGRyZXNzIGFuZCB0aGUgR1AgdmFsdWUuICAqLwotICByLnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gIHIuaG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0KLSAgci5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmxpdGFfYWRkcmVzczsKLSAgci5hZGRlbmQgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+bGl0YV9zaXplICsgMTsKLSAgaWYgKG5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCAmcikgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHIuYWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5ncDsKLSAgci5hZGRlbmQgPSAwOwotICBpZiAobmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsICZyKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKG5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJICByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfYWxwaGFfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIEFscGhhIE1vZHVsZSAgIFwwMzIiLAotICBzaXplb2YgKE5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIHNpemVvZiAoc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIpLAotICBiZmRfYXJjaF9hbHBoYSwKLSAgMCwKLSAgdHJ1ZSwgLyogbm8gdW5pbml0aWFsaXplZCBkYXRhIHBlcm1pdHRlZCBieSBBbHBoYSBOZXRXYXJlLiAgKi8KLSAgbmxtX2FscGhhX2JhY2tlbmRfb2JqZWN0X3AsCi0gIG5sbV9hbHBoYV93cml0ZV9wcmVmaXgsCi0gIG5sbV9hbHBoYV9yZWFkX3JlbG9jLAotICBubG1fYWxwaGFfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX2FscGhhX3JlYWRfaW1wb3J0LAotICBubG1fYWxwaGFfd3JpdGVfaW1wb3J0LAotICBubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uLAotICBubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQsCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkibmxtMzItYWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQlubG1OQU1FKGFscGhhX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX2FscGhhX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1pMzg2LmMgYi9iZmQvbmxtMzItaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZjNzRkLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IGkzODYgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vaTM4Ni1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9pMzg2X0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl93cml0ZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0KLS8qIEFkanVzdCB0aGUgcmVsb2MgbG9jYXRpb24gYnkgYW4gYWJzb2x1dGUgdmFsdWUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9hYnNfaG93dG8gPQotICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjMyIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEFkanVzdCB0aGUgcmVsb2MgbG9jYXRpb24gYnkgYSBQQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9wY3JlbF9ob3d0byA9Ci0gIEhPV1RPICgxLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhIE5ldFdhcmUgaTM4NiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl9yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gZWl0aGVyIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4KLSAgICAgVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCi0KLSAgICAgSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gZml4dXAgcmF0aGVyIHRoYW4gYW4gaW1wb3J0ZWQgc3ltYm9sICh0aGUKLSAgICAgc3ltIGFyZ3VtZW50IGlzIE5VTEwpIHRoZW4gdGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIGxvY2F0aW9uCi0gICAgIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYKLSAgICAgdGhlIGxvY2F0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlCi0gICAgIHNlZ21lbnQuICBJZiB0aGlzIGlzIGFuIGltcG9ydGVkIHN5bWJvbCwgdGhlbiB0aGUgaGlnaCBiaXQgaXMgMAotICAgICBpZiB0aGUgbG9jYXRpb24gaXMgMCBpZiB0aGUgbG9jYXRpb24gc2hvdWxkIGJlIGFkanVzdGVkIGJ5IHRoZQotICAgICBvZmZzZXQgdG8gdGhlIHN5bWJvbCwgb3IgMSBpZiB0aGUgbG9jYXRpb24gc2hvdWxkIGFkanVzdGVkIGJ5IHRoZQotICAgICBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotCi0gICAgIFRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0Ci0gICAgIGludG8gdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlCi0gICAgIGNvZGUgc2VnbWVudC4KLQotICAgICBBbGwgdGhpcyB0cmFuc2xhdGVzIGZhaXJseSBlYXNpbHkgaW50byBhIEJGRCByZWxvYy4gICovCi0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgTkxNX0hJQklUKSA9PSAwKQotCW5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotCSAgdmFsICY9fiBOTE1fSElCSVQ7Ci0JfQotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKS0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X2Fic19ob3d0bzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBzeW1fcHRyX3B0ciBmaWVsZC4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICAgIGlmICgodmFsICYgTkxNX0hJQklUKSA9PSAwKQotCXJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87Ci0gICAgICBlbHNlCi0JewotCSAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9hYnNfaG93dG87Ci0JICB2YWwgJj1+IE5MTV9ISUJJVDsKLQl9Ci0gICAgfQotCi0gIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKLSAgICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICpzZWNwID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICAgICAgdmFsICY9fiAoTkxNX0hJQklUID4+IDEpOwotICAgIH0KLQotICByZWwtPmFkZHJlc3MgPSB2YWw7Ci0gIHJlbC0+YWRkZW5kID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSBOZXRXYXJlIGkzODYgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSAgLyogTmV0V2FyZSBvbmx5IHN1cHBvcnRzIHR3byBraW5kcyBvZiByZWxvY3MuICBXZSBzaG91bGQgY2hlY2sKLSAgICAgc3BlY2lhbF9mdW5jdGlvbiBoZXJlLCBhcyB3ZWxsLCBidXQgYXQgdGhlIG1vbWVudCBjb2ZmLWkzODYKLSAgICAgcmVsb2NzIHVzZXMgYSBzcGVjaWFsX2Z1bmN0aW9uIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB3aGF0IHdlIGRvCi0gICAgIGhlcmUuICAqLwotICBpZiAocmVsLT5hZGRlbmQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0byA9PSBOVUxMCi0gICAgICB8fCByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnNpemUgIT0gMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0cG9zICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnNyY19tYXNrICE9IDB4ZmZmZmZmZmYKLSAgICAgIHx8IHJlbC0+aG93dG8tPmRzdF9tYXNrICE9IDB4ZmZmZmZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQuICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YKLSAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0KLSAgLyogVGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQKLSAgICAgaW50byB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUKLSAgICAgY29kZSBzZWdtZW50LiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHZhbCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgICAgIHZhbCB8PSBOTE1fSElCSVQgPj4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB2YWwgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0KLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIHsKLSAgICAgIC8qIE5ldFdhcmUgb25seSBzdXBwb3J0cyBhYnNvbHV0ZSBpbnRlcm5hbCByZWxvY3MuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBUaGUgaGlnaCBiaXQgaXMgMSBpZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCB0aGUgY29kZSBzZWN0aW9uLCAwCi0JIGlmIGFnYWluc3QgdGhlIGRhdGEgc2VjdGlvbi4gICovCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCi0JdmFsIHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgaGlnaCBiaXQgaXMgMSBpZiB0aGlzIGlzIGFuIGFic29sdXRlIHJlbG9jLCAwIGlmIGl0IGlzIFBDCi0JIHJlbGF0aXZlLiAgKi8KLSAgICAgIGlmICghIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQotCXZhbCB8PSBOTE1fSElCSVQ7Ci0gICAgICBlbHNlCi0JewotCSAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIG9uIE5ldFdhcmUgbXVzdCBiZSBwY3JlbF9vZmZzZXQuICAqLwotCSAgaWYgKCEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEkgd2FudCB0byBiZSBhYmxlIHRvIHVzZSBvYmpjb3B5IHRvIHR1cm4gYSBpMzg2IGEub3V0IG9yIENPRkYgZmlsZQotICAgaW50byBhIE5ldFdhcmUgaTM4NiBtb2R1bGUuICBUaGF0IG1lYW5zIHRoYXQgdGhlIHJlbG9jcyBmcm9tIHRoZQotICAgc291cmNlIGZpbGUgaGF2ZSB0byBiZSBtYXBwZWQgaW50byByZWxvY3MgdGhhdCBhcHBseSB0byB0aGUgdGFyZ2V0Ci0gICBmaWxlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzIHRvIGdpdmUKLSAgIGl0IGEgY2hhbmNlIHRvIHJld29yayB0aGUgcmVsb2NzLgotCi0gICBUaGlzIGlzIGFjdHVhbGx5IGEgZmFpcmx5IGdlbmVyYWwgY29uY2VwdC4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGEKLSAgIGdlbmVyYWwgaW1wbGVtZW50YXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7Ci0KLSAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOwotICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsX3B0cl9wdHIgPCByZWxfZW5kOyByZWxfcHRyX3B0cisrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgICByZWwgPSAqcmVsX3B0cl9wdHI7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgLyogTm90ZSB0aGF0IG5vIHNlcmlvdXMgaGFybSB3aWxsIGVuc3VlIGlmIHdlIGZhaWwgdG8gY2hhbmdlIGEKLQkgcmVsb2MuICBXZSB3aWxsIHdpbmQgdXAgZmFpbGluZyBpbiBubG1faTM4Nl93cml0ZV9pbXBvcnQuICAqLwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyByZWxvYyBpcyB3aXRoaW4gdGhlIGRhdGEgd2UgaGF2ZS4gIFdlIG9ubHkgNAotCSBieXRlIHJlbG9jcyBoZXJlLCBzbyB3ZSBpbnNpc3Qgb24gaGF2aW5nIDQgYnl0ZXMuICAqLwotICAgICAgaWYgKHJlbC0+YWRkcmVzcyA8IG9mZnNldAotCSAgfHwgcmVsLT5hZGRyZXNzICsgNCA+IG9mZnNldCArIGNvdW50KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWxvYyBhZGRlbmRzLCBzbyB3ZSBnZXQgcmlkIG9mIHRoZW0KLQkgaGVyZSBieSBzaW1wbHkgYWRkaW5nIHRoZW0gaW50byB0aGUgb2JqZWN0IGRhdGEuICBXZSBoYW5kbGUKLQkgdGhlIHN5bWJvbCB2YWx1ZSwgaWYgYW55LCB0aGUgc2FtZSB3YXkuICAqLwotICAgICAgYWRkZW5kID0gcmVsLT5hZGRlbmQgKyBzeW0tPnZhbHVlOwotCi0gICAgICAvKiBUaGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLiAgSWYgdGhlCi0JIHN5bWJvbCBpcyBpbiB0aGUgLmJzcyBzZWdtZW50LCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHNpemUgb2YKLQkgdGhlIGRhdGEgc2VnbWVudCBpbiB0aGUgb2Zmc2V0IGFzIHdlbGwuICBGb3J0dW5hdGVseSwgd2Uga25vdwotCSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgTkxNCi0JIGhlYWRlci4gICovCi0gICAgICBpZiAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgJiBTRUNfTE9BRCkgPT0gMCkKLQkgICYmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgICYgU0VDX0FMTE9DKSAhPSAwKSkKLQlhZGRlbmQgKz0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZVNpemU7Ci0KLSAgICAgIGlmIChhZGRlbmQgIT0gMAotCSAgJiYgcmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKLQkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQkgIHZhbCArPSBhZGRlbmQ7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIC8qIE5ldFdhcmUgdXNlcyBhIHJlbG9jIHdpdGggcGNyZWxfb2Zmc2V0IHNldC4gIFdlIGFkanVzdAotCSBwY19yZWxhdGl2ZSByZWxvY3MgYWNjb3JkaW5nbHkuICBXZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZQotCSBob3d0byBmaWVsZCwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgY3VycmVudCBvbmUgaXMKLQkgY29tcGF0aWJsZS4gIFdlIHNob3VsZCBjaGVjayBzcGVjaWFsX2Z1bmN0aW9uIGhlcmUsIGJ1dCBhdAotCSB0aGUgbW9tZW50IGNvZmYtaTM4NiB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbiB3aGljaCBkb2VzIG5vdAotCSBhZmZlY3Qgd2hhdCB3ZSBhcmUgZG9pbmcgaGVyZS4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgLyogV2hlbiBwY3JlbF9vZmZzZXQgaXMgbm90IHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgbmVnYXRpdmUKLQkgICAgIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZQotCSAgICAgbWVtb3J5IGxvY2F0aW9uLiAgV2UgbXVzdCBhZGQgaXQgYmFjayBpbi4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0JICB2YWwgKz0gcmVsLT5hZGRyZXNzOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0KLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIE5ldFdhcmUgaTM4NiBpbXBvcnQgcmVjb3JkICovCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmICghbmxtX3JlbG9jcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9pMzg2X3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkgICAgICAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKG5sbV9pMzg2X3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX2kzODZfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVwwMzIiLAotICBzaXplb2YgKE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgMCwKLSAgZmFsc2UsCi0gIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KLSAgMCwJLyogd3JpdGVfcHJlZml4X2Z1bmMgKi8KLSAgbmxtX2kzODZfcmVhZF9yZWxvYywKLSAgbmxtX2kzODZfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX2kzODZfcmVhZF9pbXBvcnQsCi0gIG5sbV9pMzg2X3dyaXRlX2ltcG9ydCwKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwsCi0gIDAsCS8qIHdyaXRlX2V4cG9ydCAqLwotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJubG0zMi1pMzg2IgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJbmxtTkFNRShpMzg2X3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX2kzODZfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLXBwYy5jIGIvYmZkL25sbTMyLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY0ODM0Li4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDUgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IFBvd2VyUEMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBmb3JtYXQgb2YgYSBQb3dlclBDIE5MTSBjaGFuZ2VkLiAgRGVmaW5lIE9MREZPUk1BVCB0byBnZXQgdGhlCi0gICBvbGQgZm9ybWF0LiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9wcGMtZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfcG93ZXJwY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0jaWZkZWYgT0xERk9STUFUCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9wcmVmaXgKLSAgUEFSQU1TICgoYmZkICopKTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci0KLSNpZmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICosIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0KLSNpZm5kZWYgT0xERk9STUFUCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBiZmRfdm1hIG5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLSNlbmRpZgotDAotI2lmZGVmIE9MREZPUk1BVAotCi0vKiBUaGUgcHJlZml4IGhlYWRlciBpcyBvbmx5IHVzZWQgaW4gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBQb3dlclBDIE5MTSdzIGhhdmUgYSBwcmVmaXggaGVhZGVyIGJlZm9yZSB0aGUgc3RhbmRhcmQgTkxNLiAgVGhpcwotICAgZnVuY3Rpb24gcmVhZHMgaXQgaW4sIHZlcmlmaWVzIHRoZSB2ZXJzaW9uLCBhbmQgc2Vla3MgdGhlIGJmZCB0bwotICAgdGhlIGxvY2F0aW9uIGJlZm9yZSB0aGUgcmVndWxhciBOTE0gaGVhZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1lbWNtcCAocy5zaWduYXR1cmUsIE5MTTMyX1BPV0VSUENfU0lHTkFUVVJFLCBzaXplb2Ygcy5zaWduYXR1cmUpICE9IDAKLSAgICAgIHx8IGJmZF9oX2dldF8zMiAoYWJmZCwgcy5oZWFkZXJWZXJzaW9uKSAhPSBOTE0zMl9QT1dFUlBDX0hFQURFUl9WRVJTSU9OKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBwcmVmaXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBtZW1zZXQgKCZzLCAwLCBzaXplb2Ygcyk7Ci0gIG1lbWNweSAocy5zaWduYXR1cmUsIE5MTTMyX1BPV0VSUENfU0lHTkFUVVJFLCBzaXplb2Ygcy5zaWduYXR1cmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBOTE0zMl9QT1dFUlBDX0hFQURFUl9WRVJTSU9OLCBzLmhlYWRlclZlcnNpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSAwLCBzLm9yaWdpbnMpOwotCi0gIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBhYm91dCB0aGUgZGF0ZT8gICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQwKLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFRoZXJlIGlzIG9ubHkgb25lIHR5cGUgb2YgcmVsb2MgaW4gYSBQb3dlclBDIE5MTS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9wb3dlcnBjX2hvd3RvID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIzMiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF92bWEgdmFsOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIGEgd29yZCBvZmZzZXQgaW50byBlaXRoZXIgdGhlIGNvZGUgb3IgZGF0YSBzZWdtZW50LgotICAgICBUaGlzIGlzIHRoZSBsb2NhdGlvbiB3aGljaCBuZWVkcyB0byBiZSBhZGp1c3RlZC4KLQotICAgICBUaGUgaGlnaCBiaXQgaXMgMCBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlIGRhdGEKLSAgICAgc2VnbWVudCwgb3IgMSBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlIHRleHQgc2VnbWVudC4KLQotICAgICBJZiB0aGlzIGlzIGEgcmVsb2NhdGlvbiBmaXh1cCByYXRoZXIgdGhhbiBhbiBpbXBvcnRlZCBzeW1ib2wgKHRoZQotICAgICBzeW0gYXJndW1lbnQgaXMgTlVMTCksIHRoZW4gdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAwCi0gICAgIGlmIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQotICAgICBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHZhbHVlLCBvciAxIGlmIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXh0Ci0gICAgIHNlZ21lbnQgc2hvdWxkIGJlIGFkZGVkLgotCi0gICAgIElmIHRoaXMgaXMgYW4gaW1wb3J0ZWQgc3ltYm9sLCB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzCi0gICAgIG5vdCB1c2VkIGFuZCBtdXN0IGJlIDAuICAqLwotCi0gIGlmICgodmFsICYgTkxNX0hJQklUKSA9PSAwKQotICAgIG5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICBlbHNlCi0gICAgewotICAgICAgbmFtZSA9IE5MTV9DT0RFX05BTUU7Ci0gICAgICB2YWwgJj1+IE5MTV9ISUJJVDsKLSAgICB9Ci0gICpzZWNwID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbCAmIChOTE1fSElCSVQgPj4gMSkpID09IDApCi0JbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IE5MTV9DT0RFX05BTUU7Ci0JICB2YWwgJj1+IChOTE1fSElCSVQgPj4gMSk7Ci0JfQotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKS0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbC0+aG93dG8gPSAmbmxtX3Bvd2VycGNfaG93dG87Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsIDw8IDI7Ci0gIHJlbC0+YWRkZW5kID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2Vsc2UgLyogT0xERk9STUFUICovCi0KLS8qIFRoaXMgcmVsb2MgaGFuZGxpbmcgaXMgb25seSBhcHBsaWNhYmxlIHRvIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICBQb3dlclBDIE5MTXMgdXNlIFhDT0ZGCi0gICByZWxvYyB0eXBlcywgYW5kIEkgaGF2ZSBqdXN0IGNvcGllZCB0aGUgWENPRkYgcmVsb2MgdGFibGUgaGVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBTdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgwLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9QT1MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLCBidXQgc3RvcmUgbmVnYXRpdmUgdmFsdWUuICAqLwotICBIT1dUTyAoMSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgLTIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX05FRyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIDE2IGJpdCBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgzLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDcgfSwKLSAgCi0gIC8qIE5vbiBtb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICg4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CQSIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgOSB9LAotCi0gIC8qIE5vbiBtb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweGEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JSIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGIgfSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhlIH0sCi0gIAotICAvKiBOb24tcmVsb2NhdGluZyByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoMHhmLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUYiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwgICAgIAkgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweDEwIH0sCi0gIHsgMHgxMSB9LAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIEhPV1RPX0NPVU5UIChzaXplb2YgbmxtX3Bvd2VycGNfaG93dG9fdGFibGUJCVwKLQkJICAgICAvIHNpemVvZiBubG1fcG93ZXJwY19ob3d0b190YWJsZVswXSkKLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGJmZF92bWEgbF92YWRkcjsKLSAgdW5zaWduZWQgbG9uZyBsX3N5bW5keDsKLSAgaW50IGxfcnR5cGU7Ci0gIGludCBsX3JzZWNubTsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWMsICpic3Nfc2VjOwotCi0gIC8qIFJlYWQgdGhlIHJlbG9jIGZyb20gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3JlYWQgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN3YXAgaW4gdGhlIGZpZWxkcy4gICovCi0gIGxfdmFkZHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC5sX3ZhZGRyKTsKLSAgbF9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC5sX3N5bW5keCk7Ci0gIGxfcnR5cGUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC5sX3J0eXBlKTsKLSAgbF9yc2Vjbm0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC5sX3JzZWNubSk7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9ucyBub3csIGZvciBjb252ZW5pZW5jZS4gICovCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBhcmVsZW50IGZpZWxkcy4gICovCi0gIGlmIChzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGltcG9ydC4gIHN5bV9wdHJfcHRyIGlzIGZpbGxlZCBpbiBieQotCSBubG1fY2Fub25pY2FsaXplX3JlbG9jLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGlmIChsX3N5bW5keCA9PSAwKQotCXNlYyA9IGNvZGVfc2VjOwotICAgICAgZWxzZSBpZiAobF9zeW1uZHggPT0gMSkKLQlzZWMgPSBkYXRhX3NlYzsKLSAgICAgIGVsc2UgaWYgKGxfc3ltbmR4ID09IDIpCi0Jc2VjID0gYnNzX3NlYzsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgQkZEX0FTU0VSVCAoKGxfcnR5cGUgJiAweGZmKSA8IEhPV1RPX0NPVU5UKTsKLQotICByZWwtPmhvd3RvID0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyAobF9ydHlwZSAmIDB4ZmYpOwotCi0gIEJGRF9BU1NFUlQgKHJlbC0+aG93dG8tPm5hbWUgIT0gTlVMTAotCSAgICAgICYmICgobF9ydHlwZSAmIDB4ODAwMCkgIT0gMAotCQkgID8gKHJlbC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93Ci0JCSAgICAgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotCQkgIDogKHJlbC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93Ci0JCSAgICAgPT0gY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQpKQotCSAgICAgICYmICgobF9ydHlwZSA+PiA4KSAmIDB4MWYpID09IHJlbC0+aG93dG8tPmJpdHNpemUgLSAxKTsKLQotICBpZiAobF9yc2Vjbm0gPT0gMCkKLSAgICAqc2VjcCA9IGNvZGVfc2VjOwotICBlbHNlIGlmIChsX3JzZWNubSA9PSAxKQotICAgIHsKLSAgICAgICpzZWNwID0gZGF0YV9zZWM7Ci0gICAgICBsX3ZhZGRyIC09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmVsLT5hZGRyZXNzID0gbF92YWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotCi0vKiBNYW5nbGUgUG93ZXJQQyBOTE0gcmVsb2NzIGZvciBvdXRwdXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gaW1wb3J0IHJlY29yZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmIChubG1fcmVsb2NzID09IChzdHJ1Y3QgbmxtX3JlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCQkgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotICAvKiBQb3dlclBDIE5ldFdhcmUgb25seSBzdXBwb3J0cyBvbmUga2luZCBvZiByZWxvYy4gICovCi0gIGlmIChyZWwtPmFkZGVuZCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvID09IE5VTEwKLSAgICAgIHx8IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c2l6ZSAhPSAyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRzaXplICE9IDMyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRwb3MgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLSAgICAgIHx8IChyZWwtPmhvd3RvLT5zcmNfbWFzayAhPSAweGZmZmZmZmZmICYmIHJlbC0+YWRkZW5kICE9IDApCi0gICAgICB8fCByZWwtPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LCByaWdodHNoaWZ0ZWQgYnkgdHdvLiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLAotICAgICBhZGp1c3RlZCBieSB0aGUgdm1hIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMKLSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotICBpZiAoKHZhbCAmIDMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB2YWwgPj49IDI7Ci0KLSAgLyogVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHJlbG9jIGlzIGluIHRoZSBkYXRhIHNlY3Rpb24sIG9yIDEgaWYKLSAgICAgdGhlIHJlbG9jIGlzIGluIHRoZSBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgdmFsIC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotICBlbHNlCi0gICAgewotICAgICAgdmFsIC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgdmFsIHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gICAgCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGludGVybmFsIHJlbG9jYXRpb24gZml4dXAuICBUaGUgc2Vjb25kIG1vc3QKLQkgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGRhdGEKLQkgc2VnbWVudCwgb3IgMSBpZiBpdCBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4gICovCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCi0JdmFsIHw9IE5MTV9ISUJJVCA+PiAxOwotICAgIH0KLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2Vsc2UgLyogT0xERk9STUFUICovCi0KLS8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHJlbG9jIGhhbmRsaW5nIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotICAgICBpbnQgaW5keDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYXNlY3Rpb24gKnN5bXNlYzsKLSAgdW5zaWduZWQgbG9uZyBsX3N5bW5keDsKLSAgaW50IGxfcnR5cGU7Ci0gIGludCBsX3JzZWNubTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0gIHN5bXNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLSAgaWYgKGluZHggIT0gLTEpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zZWMpKTsKLSAgICAgIGxfc3ltbmR4ID0gaW5keCArIDM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bXNlYyA9PSBjb2RlX3NlYykKLQlsX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzeW1zZWMgPT0gZGF0YV9zZWMpCi0JbF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGJzc19zZWMpCi0JbF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgbF9zeW1uZHgsIGV4dC5sX3N5bW5keCk7Ci0KLSAgZm9yIChob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlOwotICAgICAgIGhvd3RvIDwgbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVDsKLSAgICAgICBob3d0bysrKQotICAgIHsKLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JICAmJiBob3d0by0+c2l6ZSA9PSByZWwtPmhvd3RvLT5zaXplCi0JICAmJiBob3d0by0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JICAmJiBob3d0by0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGhvd3RvLT5iaXRwb3MgPT0gcmVsLT5ob3d0by0+Yml0cG9zCi0JICAmJiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgICAgICB8fCAoISByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKLQkgICYmIChob3d0by0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkgICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMAotCQkgICYmIHJlbC0+YWRkZW5kID09IDApKQotCSAgJiYgaG93dG8tPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrCi0JICAmJiBob3d0by0+cGNyZWxfb2Zmc2V0ID09IHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQlicmVhazsKLSAgICB9Ci0gIGlmIChob3d0byA+PSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIEhPV1RPX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBsX3J0eXBlID0gaG93dG8tPnR5cGU7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGxfcnR5cGUgfD0gMHg4MDAwOwotICBsX3J0eXBlIHw9IChob3d0by0+Yml0c2l6ZSAtIDEpIDw8IDg7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnR5cGUsIGV4dC5sX3J0eXBlKTsKLQotICBhZGRyZXNzID0gcmVsLT5hZGRyZXNzOwotCi0gIGlmIChzZWMgPT0gY29kZV9zZWMpCi0gICAgbF9yc2Vjbm0gPSAwOwotICBlbHNlIGlmIChzZWMgPT0gZGF0YV9zZWMpCi0gICAgewotICAgICAgbF9yc2Vjbm0gPSAxOwotICAgICAgYWRkcmVzcyArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnNlY25tLCBleHQubF9yc2Vjbm0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBhZGRyZXNzLCBleHQubF92YWRkcik7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gaW1wb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICByZXR1cm4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCAtMSk7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSBleHRlcm5hbCBzeW1ib2wuICBUaGlzIHJvdXRpbmUga2VlcHMgYSBzdGF0aWMKLSAgIGNvdW50IG9mIHRoZSBzeW1ib2wgaW5kZXguICBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgIG5lY2Vzc2FyeSwgYW5kIHRoZSBpbmRleCBuZXZlciBnZXRzIHJlc2V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotI2lmZGVmIE9MREZPUk1BVAotICBzdGF0aWMgaW50IGluZHg7Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSNpZm5kZWYgT0xERk9STUFUCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsIHJlbG9jc1tpXS5yZWwpKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgICAgIHJlbG9jc1tpXS5yZWwsIGluZHgpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE9MREZPUk1BVAotICArK2luZHg7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFBvd2VyUEMgTmV0d2FyZSB1c2VzIGEgd29yZCBvZmZzZXQsIG5vdCBhIGJ5dGUgb2Zmc2V0LCBmb3IgcHVibGljCi0gICBzeW1ib2xzLiAgKi8KLQotLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlICYgTkxNX0hJQklUKQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH5OTE1fSElCSVQ7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgIH0KLQotICBzeW0tPnN5bWJvbC52YWx1ZSA8PD0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0gIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0gICAgewotICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgb2Zmc2V0IHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlYy0+ZmxhZ3MgJiAoU0VDX0RBVEEgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0gICAgICBvZmZzZXQgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbiB0aGUgY29kZSBvcgotCSBkYXRhIHNlZ21lbnQuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPTERGT1JNQVQpICovCi0MCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfcG93ZXJwY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgUG93ZXJQQyBNb2R1bGUgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfcG93ZXJwY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotI2lmbmRlZiBPTERGT1JNQVQKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSNlbHNlCi0gIHNpemVvZiAoc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciksCi0jZW5kaWYKLSAgYmZkX2FyY2hfcG93ZXJwYywKLSAgMCwKLSAgZmFsc2UsCi0jaWZuZGVmIE9MREZPUk1BVAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeCAqLwotI2Vsc2UKLSAgbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4LAotI2VuZGlmCi0gIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MsCi0gIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0LAotICBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQsCi0jaWZuZGVmIE9MREZPUk1BVAotICBubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24sCi0gIG5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0LAotI2Vsc2UKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0jZW5kaWYKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJubG0zMi1wb3dlcnBjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCW5sbU5BTUUocG93ZXJwY192ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9wb3dlcnBjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1zcGFyYy5jIGIvYmZkL25sbTMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGQ4MGEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IFNQQVJDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3NwYXJjMzItZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSX1NQQVJDX05PTkUgPSAwLAotICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKLSAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKLSAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKLSAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCi0gICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKLSAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKLSAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKLSAgICBSX1NQQVJDX1dQTFQzMCwKLSAgICBSX1NQQVJDX0NPUFksCi0gICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKLSAgICBSX1NQQVJDX1JFTEFUSVZFLAotICAgIFJfU1BBUkNfVUEzMiwKLSAgICBSX1NQQVJDX21heAotICB9OwotCi0jaWYgMAotc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Ci17Ci0gICJSX1NQQVJDX05PTkUiLAotICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKLSAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAotICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCi0gICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCi0gICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAotICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAotICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCi0gICJSX1NQQVJDX1dQTFQzMCIsCi0gICJSX1NQQVJDX0NPUFkiLAotICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKLSAgIlJfU1BBUkNfUkVMQVRJVkUiLAotICAiUl9TUEFSQ19VQTMyIiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotfTsKLQotLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvZmZzZXRbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYWRkZW5kWzRdOwotICB1bnNpZ25lZCBjaGFyIHR5cGVbMV07Ci0gIHVuc2lnbmVkIGNoYXIgcGFkMVszXTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX3ZtYSB2YWwsIGFkZGVuZDsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB0bXBfcmVsb2M7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIGlmIChiZmRfcmVhZCAoJnRtcF9yZWxvYywgMTIsIDEsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgKnNlY3AgPSBjb2RlX3NlYzsKLQotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0bXBfcmVsb2Mub2Zmc2V0KTsKLSAgYWRkZW5kID0gYmZkX2dldF8zMiAoYWJmZCwgdG1wX3JlbG9jLmFkZGVuZCk7Ci0gIHR5cGUgPSBiZmRfZ2V0XzggKGFiZmQsIHRtcF9yZWxvYy50eXBlKTsKLQotICByZWwtPmFkZHJlc3MgPSB2YWw7Ci0gIHJlbC0+YWRkZW5kID0gYWRkZW5kOwotICByZWwtPmhvd3RvID0gTlVMTDsKLQotICBmb3IgKGluZGV4ID0gMDsKLSAgICAgICBpbmRleCA8IHNpemVvZihubG0zMl9zcGFyY19ob3d0b190YWJsZSkgLyBzaXplb2YocmVsb2NfaG93dG9fdHlwZSk7Ci0gICAgICAgaW5kZXgrKykKLSAgICBpZiAobmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdLnR5cGUgPT0gdHlwZSkgewotICAgICAgcmVsLT5ob3d0byA9ICZubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF07Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogIGFkZHJlc3MgPSAlMDhseCwgYWRkZW5kID0gJTA4bHgsIHR5cGUgPSAlZCwgaG93dG8gPSAlMDhseFxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHJlbC0+YWRkcmVzcywgcmVsLT5hZGRlbmQsIHR5cGUsIHJlbC0+aG93dG8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotCi19Ci0KLS8qIFdyaXRlIGEgTmV0V2FyZSBzcGFyYyByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX3ZtYSB2YWw7Ci0gIHN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgdG1wX3JlbG9jOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIGludCB0eXBlID0gLTE7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKnRtcDsKLQotICAKLSAgZm9yIChpbmRleCA9IDA7Ci0gICAgICAgaW5kZXggPCBzaXplb2YgKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlKSAvIHNpemVvZihyZWxvY19ob3d0b190eXBlKTsKLSAgICAgICBpbmRleCsrKSB7Ci0gICAgdG1wID0gJm5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XTsKLQotICAgIGlmICh0bXAtPnJpZ2h0c2hpZnQgPT0gcmVsLT5ob3d0by0+cmlnaHRzaGlmdAotCSYmIHRtcC0+c2l6ZSA9PSByZWwtPmhvd3RvLT5zaXplCi0JJiYgdG1wLT5iaXRzaXplID09IHJlbC0+aG93dG8tPmJpdHNpemUKLQkmJiB0bXAtPnBjX3JlbGF0aXZlID09IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JJiYgdG1wLT5iaXRwb3MgPT0gcmVsLT5ob3d0by0+Yml0cG9zCi0JJiYgdG1wLT5zcmNfbWFzayA9PSByZWwtPmhvd3RvLT5zcmNfbWFzawotCSYmIHRtcC0+ZHN0X21hc2sgPT0gcmVsLT5ob3d0by0+ZHN0X21hc2spIHsKLSAgICAgIHR5cGUgPSB0bXAtPnR5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHR5cGUgPT0gLTEpCi0gICAgYWJvcnQoKTsKLQotICAvKgotICAgKiBOZXR3YXJlIHdhbnRzIGEgbGlzdCBvZiByZWxvY3MgZm9yIGVhY2ggYWRkcmVzcy4KLSAgICogRm9ybWF0IGlzOgotICAgKglsb25nCW9mZnNldAotICAgKglsb25nCWFkZGVuZAotICAgKgljaGFyCXR5cGUKLSAgICogVGhhdCBzaG91bGQgYmUgaXQuCi0gICAqLwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLCBhZGp1c3RlZCBieSB0aGUgdm1hIG9mCi0gICAgIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24uICAqLwotI2lmIDAKLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgKCpyZWwtPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikgKyByZWwtPmFkZHJlc3M7Ci0jZWxzZQotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogIHZhbCA9ICUwOGx4LCBhZGRlbmQgPSAlMDhseCwgdHlwZSA9ICVkXG4iLAotCSAgIF9fRlVOQ1RJT05fXywgdmFsLCByZWwtPmFkZGVuZCwgcmVsLT5ob3d0by0+dHlwZSk7Ci0jZW5kaWYKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0bXBfcmVsb2Mub2Zmc2V0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsLT5hZGRlbmQsIHRtcF9yZWxvYy5hZGRlbmQpOwotICBiZmRfcHV0XzggKGFiZmQsIChzaG9ydCkocmVsLT5ob3d0by0+dHlwZSksIHRtcF9yZWxvYy50eXBlKTsKLQotICBpZiAoYmZkX3dyaXRlICgmdG1wX3JlbG9jLCAxMiwgMSwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYW5nbGUgcmVsb2NzIGZvciBTUEFSQyBOZXRXYXJlLiAgV2UgY2FuIGp1c3QgdXNlIHRoZSBzdGFuZGFyZAotICAgU1BBUkMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY19tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIGltcG9ydCByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotICAKLSAgLyoKLSAgICogRmlyc3QsIHJlYWQgaW4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9uCi0gICAqIGVudHJpZXMgZm9yIHRoaXMgc3ltYm9sCi0gICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmNvdW50ID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIAotICAvKgotICAgKiBOZXh0LCByZWFkIGluIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbAotICAgKi8KLSAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyoKLSAgICogVGhlbiByZWFkIGluIHRoZSBzeW1ib2wKLSAgICovCi0gIAotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAKLSAgLyoKLSAgICogTmV4dCwgc3RhcnQgcmVhZGluZyBpbiB0aGUgcmVsb2NzLgotICAgKi8KLSAgCi0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGNoYXIgdGVtcFs0XTsKLSAgYXNlY3Rpb24gKmNvZGUsICpkYXRhLCAqYnNzLCAqc3ltc2VjOwotICBiZmRfdm1hIGJhc2U7Ci0KLSAgY29kZSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIHN5bXNlYyA9ICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb247Ci0KLSAgaWYgKHN5bXNlYyA9PSBjb2RlKSB7Ci0gICAgYmFzZSA9IDA7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGRhdGEpIHsKLSAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSk7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGJzcykgewotICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKSArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRhdGEpOwotICB9IGVsc2UKLSAgICBiYXNlID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgPCV4LCAxPlxuXHQiLAotCSAgIF9fRlVOQ1RJT05fXywgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcHV0XzMyIChhYmZkLCAxLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9leHBvcnQgKGFiZmQsIHN5bSwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBiZmRfYnl0ZSBsZW47Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogPCV4LCAlZCwgJXM+XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHN0cmxlbiAoc3ltLT5uYW1lKSwgc3ltLT5uYW1lKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgdGVtcCk7Ci0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0Ci0gICAgICB8fCBiZmRfd3JpdGUgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9zcGFyY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgU1BBUkMgTW9kdWxlICAgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSAgYmZkX2FyY2hfc3BhcmMsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9zcGFyY19yZWFkX3JlbG9jLAotICBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX3NwYXJjX3JlYWRfaW1wb3J0LAotICBubG1fc3BhcmNfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwsCi0gIG5sbV9zcGFyY193cml0ZV9leHBvcnQKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkibmxtMzItc3BhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQlubG1OQU1FKHNwYXJjX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3NwYXJjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi5jIGIvYmZkL25sbTMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzBlNGYuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLSNpbmNsdWRlICJubG1jb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtNjQuYyBiL2JmZC9ubG02NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNkOTZhLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG02NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDY0Ci0jaW5jbHVkZSAibmxtY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbWNvZGUuaCBiL2JmZC9ubG1jb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMWEyZjguLjAwMDAwMDAKLS0tIGEvYmZkL25sbWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTYgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIEVMRiBzdXBwb3J0IGFzIHRoZQotICAgdGVtcGxhdGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0vKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBkbyBub3QgdXNlIHRoZSBuYW1lcyB0aGV5IGFwcGVhciB0byB1c2UuCi0gICBUaGlzIGZpbGUgaXMgYWN0dWFsbHkgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggc2l6ZQotICAgb2YgTkxNIHRhcmdldCB3ZSBhcmUgdXNpbmcuICBBdCBlYWNoIHNpemUgd2UgdXNlIGEgZGlmZmVyZW50IG5hbWUsCi0gICBjb25zdHJ1Y3RlZCBieSB0aGUgbWFjcm8gbmxtTkFNRS4gIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gd2hpY2gKLSAgIGlzIG5hbWVkIG5sbV9zeW1ib2xfdHlwZSBiZWxvdyBpcyBhY3R1YWxseSBuYW1lZCBubG0zMl9zeW1ib2xfdHlwZQotICAgaW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9GaXhlZF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX1ZlcnNpb25fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N5Z251c19FeHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpCi0KLSNkZWZpbmUgbmxtX3N5bWJvbF90eXBlCQkJbmxtTkFNRShzeW1ib2xfdHlwZSkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQJbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYgkJCW5sbU5BTUUoZ2V0X3N5bXRhYikKLSNkZWZpbmUgbmxtX21ha2VfZW1wdHlfc3ltYm9sCQlubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBubG1fcHJpbnRfc3ltYm9sCQlubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbwkJbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQJbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MJCW5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBubG1fb2JqZWN0X3AJCQlubG1OQU1FKG9iamVjdF9wKQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMJbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cwlubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4oYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYyhhYmZkKSkoYWJmZCxzcmMsZHN0KQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0KGFiZmQsc3JjLGRzdCkgXAotICAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0YXRpYyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBmaW5kX25vbnplcm8KLSAgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zbHVycF9yZWxvY19maXh1cHMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUKLSAgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLQotLyogU2hvdWxkIHBlcmhhcHMgdXNlIHB1dF9vZmZzZXQsIHB1dF93b3JkLCBldGMuICBGb3Igbm93LCB0aGUgdHdvIHZlcnNpb25zCi0gICBjYW4gYmUgaGFuZGxlZCBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgMzIgYml0cyBvciAidGhlIGxvbmcgdHlwZSIuICAqLwotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfNjQKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzY0Ci0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF8zMgotI2VuZGlmCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotbmxtX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpwcmVzZXJ2ZWRfdGRhdGEgPSBubG1fdGRhdGEgKGFiZmQpOwotICBib29sZWFuICgqYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLSAgUFRSIHhfZnhkaGRyID0gTlVMTDsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwotICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmV3X3RkYXRhID0gTlVMTDsKLSAgY29uc3QgY2hhciAqc2lnbmF0dXJlOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBTb21lIE5MTSBmb3JtYXRzIGhhdmUgYSBwcmVmaXggYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0gZml4ZWQKLSAgICAgaGVhZGVyLiAgKi8KLSAgYmFja2VuZF9vYmplY3RfcCA9IG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMgKGFiZmQpOwotICBpZiAoYmFja2VuZF9vYmplY3RfcCkKLSAgICB7Ci0gICAgICBpZiAoISgqYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgZml4ZWQgbGVuZ3RoIHBvcnRpb24gb2YgdGhlIE5MTSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLQotICB4X2Z4ZGhkciA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpOwotICBpZiAoeF9meGRoZHIgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfZnhkaGRyLCBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLCAxLCBhYmZkKSAhPQotICAgICAgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgZWxzZQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmxtX29ial90ZGF0YSBzdHJ1Y3R1cmUgYW5kIGhvb2sgaXQgdXAgdG8KLSAgICAgdGhlIHRkYXRhIHBvaW50ZXIgaW4gdGhlIGJmZC4gICovCi0KLSAgbmV3X3RkYXRhID0gKChzdHJ1Y3QgbmxtX29ial90ZGF0YSAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBubG1fb2JqX3RkYXRhKSkpOwotICBpZiAobmV3X3RkYXRhID09IE5VTEwpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgbmxtX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIChhYmZkLCB4X2Z4ZGhkciwgaV9meGRoZHJwKTsKLSAgZnJlZSAoeF9meGRoZHIpOwotICB4X2Z4ZGhkciA9IE5VTEw7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gTkxNIGZpbGUgZm9yIHRoaXMgYmFja2VuZCBieSBtYXRjaGluZwotICAgICB0aGUgTkxNIHNpZ25hdHVyZS4gKi8KLQotICBzaWduYXR1cmUgPSBubG1fc2lnbmF0dXJlIChhYmZkKTsKLSAgaWYgKHNpZ25hdHVyZSAhPSBOVUxMCi0gICAgICAmJiAqc2lnbmF0dXJlICE9ICdcMCcKLSAgICAgICYmIHN0cm5jbXAgKChjaGFyICopIGlfZnhkaGRycC0+c2lnbmF0dXJlLCBzaWduYXR1cmUsCi0JCSAgTkxNX1NJR05BVFVSRV9TSVpFKSAhPSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gZGlzY292ZXIgdGhlIGVuZGlhbmVzcyBvZiBhbiBOTE0sIHNvIHRlc3QgZm9yCi0gICAgIGEgc2FuZSB2ZXJzaW9uIG51bWJlciBhZnRlciBkb2luZyBieXRlIHN3YXBwaW5nIGFwcHJvcHJpYXRlIGZvciB0aGlzCi0gICAgIFhWRUMuICAoSGFjayBhbGVydCEpICovCi0KLSAgaWYgKGlfZnhkaGRycC0+dmVyc2lvbiA+IDB4RkZGRikKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogVGhlcmUncyBubyBzdXBwb3J0ZWQgd2F5IHRvIGNoZWNrIGZvciAzMiBiaXQgdmVyc3VzIDY0IGJpdCBhZGRyZXNzZXMsCi0gICAgIHNvIGlnbm9yZSB0aGlzIGRpc3RpbmN0aW9uIGZvciBub3cuICAoRklYTUUpICovCi0KLSAgLyogU3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgcmVxdWlyZWQgaGVhZGVyLiAgKi8KLSAgaWYgKCFubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgc2VjdGlvbnMgc3VwcGxpZWQgYnkgYWxsIE5MTSdzLCBhbmQgdGhlbiByZWFkIGluIHRoZQotICAgICBhdXhpbGlhcnkgaGVhZGVycy4gIFJlYWRpbmcgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIG1heSBjcmVhdGUKLSAgICAgYWRkaXRpb25hbCBzZWN0aW9ucyBkZXNjcmliZWQgaW4gdGhlIGN5Z251c19leHQgaGVhZGVyLgotICAgICBGcm9tIHRoaXMgcG9pbnQgb24gd2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbiBOTE0sIGFuZCBkbyBub3QKLSAgICAgdHJlYXQgZXJyb3JzIGFzIGluZGljYXRpbmcgdGhlIHdyb25nIGZvcm1hdC4gICovCi0KLSAgaWYgKCFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9DT0RFX05BTUUsCi0JCQlpX2Z4ZGhkcnAtPmNvZGVJbWFnZU9mZnNldCwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlU2l6ZSwKLQkJCShTRUNfQ09ERSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJIHwgU0VDX1JFTE9DKSkKLSAgICAgIHx8ICFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUsCi0JCQkgICBpX2Z4ZGhkcnAtPmRhdGFJbWFnZU9mZnNldCwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlU2l6ZSwKLQkJCSAgIChTRUNfREFUQSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgIHwgU0VDX1JFTE9DKSkKLSAgICAgIHx8ICFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIChmaWxlX3B0cikgMCwKLQkJCSAgIGlfZnhkaGRycC0+dW5pbml0aWFsaXplZERhdGFTaXplLAotCQkJICAgU0VDX0FMTE9DKSkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAoIW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luIChhYmZkKSkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyAhPSAwCi0gICAgICB8fCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZQdWJsaWNzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkRlYnVnUmVjb3JkcyAhPSAwCi0gICAgICB8fCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICBhcmNoID0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Ci0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCi0gIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlU3RhcnRPZmZzZXQ7Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotZ290X3dyb25nX2Zvcm1hdF9lcnJvcjoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci1nb3Rfbm9fbWF0Y2g6Ci0gIG5sbV90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIGlmIChuZXdfdGRhdGEgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmV3X3RkYXRhKTsKLSAgaWYgKHhfZnhkaGRyICE9IE5VTEwpCi0gICAgZnJlZSAoeF9meGRoZHIpOwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKiBBZGQgYSBzZWN0aW9uIHRvIHRoZSBiZmQuICovCi0KLXN0YXRpYyBib29sZWFuCi1hZGRfYmZkX3NlY3Rpb24gKGFiZmQsIG5hbWUsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLQotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQotICBuZXdzZWN0LT52bWEgPSAwOwkJLyogTkxNJ3MgYXJlIHJlbG9jYXRhYmxlLiAqLwotICBuZXdzZWN0LT5fcmF3X3NpemUgPSBzaXplOwotICBuZXdzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBuZXdzZWN0LT5mbGFncyA9IGZsYWdzOwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBiZmRfbG9nMiAoMCk7CS8qIEZJWE1FICovCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmVhZCBoZXJlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX2luIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvblRleHQsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRoZSBzdGFja1NpemUgZmllbGQuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c3RhY2tTaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGVtcCk7Ci0KLSAgLyogUmVhZCB0aGUgb2xkVGhyZWFkTmFtZSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgYSBmaXhlZCBsZW5ndGggc3RyaW5nLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgdGhlIHRocmVhZCBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZSwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogU3dhcCBhbmQgd3JpdGUgb3V0IHRoZSB2YXJpYWJsZSBsZW5ndGggaGVhZGVyLiAgQWxsIHRoZSBmaWVsZHMgbXVzdAotICAgZXhpc3QgaW4gdGhlIE5MTSwgYW5kIG11c3QgZXhpc3QgaW4gdGhpcyBvcmRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogV3JpdGUgdGhlIGRlc2NyaXB0aW9uIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEsCi0JCSAxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogQ29udmVydCBhbmQgd3JpdGUgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUsCi0JICAgIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgcmVzZXJ2ZWQgZmllbGQuICovCi0KLSAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQsCi0JICAgIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgb2xkVGhyZWFkTmFtZSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgYSBmaXhlZCBsZW5ndGggc3RyaW5nLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogV3JpdGUgdGhlIHNjcmVlbiBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEsCi0JCSAxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIGluIHRoZSBjb250ZW50cyBvZiBhbGwgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgQmVjYXVzZSBvZgotICAgdGhlIGJyYWluZGVhZCBkZXNpZ24sIHdlIGhhdmUgdG8gZG8gc3RyY21wcyBvbiBzdHJpbmdzIG9mIGluZGV0ZXJtaW5hdGUKLSAgIGxlbmd0aCB0byBmaWd1cmUgb3V0IHdoYXQgZWFjaCBhdXhpbGlhcnkgaGVhZGVyIGlzLiAgRXZlbiB3b3JzZSwgd2UgaGF2ZQotICAgbm8gd2F5IG9mIGtub3dpbmcgaG93IG1hbnkgYXV4aWxpYXJ5IGhlYWRlcnMgdGhlcmUgYXJlIG9yIHdoZXJlIHRoZSBlbmQKLSAgIG9mIHRoZSBhdXhpbGlhcnkgaGVhZGVycyBhcmUsIGV4Y2VwdCBieSBmaW5kaW5nIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QKLSAgIGxvb2sgbGlrZSBhIGtub3duIGF1eGlsaWFyeSBoZWFkZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpcnN0IG5ldyB0eXBlCi0gICBvZiBhdXhpbGlhcnkgaGVhZGVyIGFkZGVkIHdpbGwgYnJlYWsgYWxsIGV4aXN0aW5nIHRvb2xzIHRoYXQgZG9uJ3QKLSAgIHJlY29nbml6ZSBpdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgdGVtcHN0clsxNl07Ci0gIGxvbmcgcG9zaXRpb247Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwb3NpdGlvbiA9IGJmZF90ZWxsIChhYmZkKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcHN0ciwgc2l6ZW9mICh0ZW1wc3RyKSwgMSwgYWJmZCkgIT0KLQkgIHNpemVvZiAodGVtcHN0cikpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBpZiAoc3RybmNtcCAodGVtcHN0ciwgIlZlUnNJb04jIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIgdGhkcjsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIG1lbWNweSAobmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+c3RhbXAsIHRoZHIuc3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tYWpvclZlcnNpb24gPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1pbm9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+cmV2aXNpb24gPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+eWVhciA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1vbnRoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPmRheSA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJNZVNzQWdFcyIsIDgpID09IDApCi0JewotCSAgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c3RhbXAsIHRoZHIuc3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bGFuZ3VhZ2VJRCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc09mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc0NvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cHJvZHVjdElEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQwID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQxID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQzID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ1ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkNvUHlSaUdoVD0iLCAxMCkgPT0gMCkKLQl7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXAsCi0JCQlzaXplb2YgKG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXApLAotCQkJMSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXApKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpCi0JCQkJIC0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCksCi0JCQkxLCAxLCBhYmZkKSAhPSAxKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZSwKLQkJICAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEsCi0JCQkxLCBhYmZkKSAhPQotCSAgICAgICgoYmZkX3NpemVfdHlwZSkKLQkgICAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJDdVN0SGVBZCIsIDgpID09IDApCi0JewotCSAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQkgIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOwotCSAgZmlsZV9wdHIgZGF0YU9mZnNldDsKLQkgIGJmZF9zaXplX3R5cGUgZGF0YUxlbmd0aDsKLQkgIGNoYXIgZGF0YVN0YW1wWzhdOwotCSAgUFRSIGhkcjsKLQotCSAgLyogUmVhZCB0aGUgc3RhbXAgKCJDdVN0SGVBZCIpLiAgKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5zdGFtcCwgMSwgc2l6ZW9mICh0aGRyLnN0YW1wKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBSZWFkIHRoZSBsZW5ndGggb2YgdGhpcyBjdXN0b20gaGVhZGVyLiAgKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5sZW5ndGgsIDEsIHNpemVvZiAodGhkci5sZW5ndGgpLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5sZW5ndGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoZHJMZW5ndGggPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLQkgIC8qIFJlYWQgZnVydGhlciBmaWVsZHMgaWYgd2UgaGF2ZSB0aGVtLiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPCBOTE1fVEFSR0VUX0xPTkdfU0laRSkKLQkgICAgZGF0YU9mZnNldCA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIuZGF0YU9mZnNldCwgMSwKLQkJCSAgICBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCksIGFiZmQpCi0JCSAgIT0gc2l6ZW9mICh0aGRyLmRhdGFPZmZzZXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZGF0YU9mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLQkgICAgfQotCSAgaWYgKGhkckxlbmd0aCA8IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSkKLQkgICAgZGF0YUxlbmd0aCA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIuZGF0YUxlbmd0aCwgMSwKLQkJCSAgICBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCksIGFiZmQpCi0JCSAgIT0gc2l6ZW9mICh0aGRyLmRhdGFMZW5ndGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZGF0YUxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLQkgICAgfQotCSAgaWYgKGhkckxlbmd0aCA8IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgpCi0JICAgIG1lbXNldCAoZGF0YVN0YW1wLCAwLCBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBkYXRhU3RhbXAsIDEsIHNpemVvZiAoZGF0YVN0YW1wKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKGRhdGFTdGFtcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIsIGlmIGFueS4gICovCi0JICBpZiAoaGRyTGVuZ3RoIDw9IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgpCi0JICAgIHsKLQkgICAgICBoZHIgPSBOVUxMOwotCSAgICAgIGhkckxlbmd0aCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGhkckxlbmd0aCAtPSAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyA4OwotCSAgICAgIGhkciA9IGJmZF9hbGxvYyAoYWJmZCwgaGRyTGVuZ3RoKTsKLQkgICAgICBpZiAoaGRyID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgaGRyTGVuZ3RoLCBhYmZkKSAhPSBoZHJMZW5ndGgpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBoYXZlIGZvdW5kIGEgQ3lnbnVzIGhlYWRlciwgcHJvY2VzcyBpdC4gIE90aGVyd2lzZSwKLQkgICAgIGp1c3Qgc2F2ZSB0aGUgYXNzb2NpYXRlZCBkYXRhIHdpdGhvdXQgdHJ5aW5nIHRvIGludGVycHJldAotCSAgICAgaXQuICAqLwotCSAgaWYgKHN0cm5jbXAgKGRhdGFTdGFtcCwgIkN5R25Vc0V4IiwgOCkgPT0gMCkKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIHBvczsKLQkgICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0JICAgICAgYmZkX2J5dGUgKnAsICpwZW5kOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaGRyTGVuZ3RoID09IDAgJiYgaGRyID09IE5VTEwpOwotCi0JICAgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgZGF0YU9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGRhdGFMZW5ndGgpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9yZWFkIChjb250ZW50cywgMSwgZGF0YUxlbmd0aCwgYWJmZCkgIT0gZGF0YUxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbWVtY3B5IChubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLCAiQ3lHblVzRXgiLCA4KTsKLQkgICAgICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLT5vZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPmxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0KLQkgICAgICAvKiBUaGlzIGRhdGEgdGhpcyBoZWFkZXIgcG9pbnRzIHRvIHByb3ZpZGVzIGEgbGlzdCBvZgotCQkgdGhlIHNlY3Rpb25zIHdoaWNoIHdlcmUgaW4gdGhlIG9yaWdpbmFsIG9iamVjdCBmaWxlCi0JCSB3aGljaCB3YXMgY29udmVydGVkIHRvIGJlY29tZSBhbiBOTE0uICBXZSBsb2NhdGUKLQkJIHRob3NlIHNlY3Rpb25zIGFuZCBhZGQgdGhlbSB0byB0aGUgQkZELiAgTm90ZSB0aGF0Ci0JCSB0aGlzIGlzIGxpa2VseSB0byBjcmVhdGUgYSBzZWNvbmQgLnRleHQsIC5kYXRhIGFuZAotCQkgLmJzcyBzZWN0aW9uOyByZXRyaWV2aW5nIHRoZSBzZWN0aW9ucyBieSBuYW1lIHdpbGwKLQkJIGdldCB0aGUgYWN0dWFsIE5MTSBzZWN0aW9ucywgd2hpY2ggaXMgd2hhdCB3ZSB3YW50IHRvCi0JCSBoYXBwZW4uICBUaGUgc2VjdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgd2hpY2gKLQkJIG1heSBiZSBzdWJzZXRzIG9mIHRoZSBOTE0gc2VjdGlvbiwgY2FuIG9ubHkgYmUgZm91bmQKLQkJIHVzaW5nIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0JICAgICAgcCA9IGNvbnRlbnRzOwotCSAgICAgIHBlbmQgPSBwICsgZGF0YUxlbmd0aDsKLQkgICAgICB3aGlsZSAocCA8IHBlbmQpCi0JCXsKLQkJICBjaGFyICpuYW1lOwotCQkgIHNpemVfdCBsOwotCQkgIGZpbGVfcHRyIGZpbGVwb3M7Ci0JCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCQkgIGFzZWN0aW9uICpuZXdzZWM7Ci0KLQkJICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgaW5mb3JtYXRpb24gaXMKLQkJICAgICBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBuYW1lCi0JCSAgICAgemVyb2VzIHRvIGFkanVzdCB0byA0IGJ5dGUgYm91bmRhcnkKLQkJICAgICA0IGJ5dGUgc2VjdGlvbiBkYXRhIGZpbGUgcG9pbnRlcgotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIHNpemUKLQkJICAgICAqLwotCi0JCSAgbmFtZSA9IChjaGFyICopIHA7Ci0JCSAgbCA9IHN0cmxlbiAobmFtZSkgKyAxOwotCQkgIGwgPSAobCArIDMpICZ+IDM7Ci0JCSAgcCArPSBsOwotCQkgIGZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQkJICBzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQkJICBwICs9IDQ7Ci0KLQkJICBuZXdzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0JCSAgaWYgKG5ld3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBuZXdzZWMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JCSAgaWYgKGZpbGVwb3MgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgbmV3c2VjLT5maWxlcG9zID0gZmlsZXBvczsKLQkJICAgICAgbmV3c2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbWNweSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICAgICAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGggPSBoZHJMZW5ndGg7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOwotCSAgICAgIG1lbWNweSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXAsIGRhdGFTdGFtcCwKLQkJICAgICAgc2l6ZW9mIChkYXRhU3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkciA9IGhkcjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ5dGUgaW4gYSBtZW1vcnkgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZmluZF9ub256ZXJvIChidWYsIHNpemUpCi0gICAgIFBUUiBidWY7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBjaGFyICpwID0gKGNoYXIgKikgYnVmOwotCi0gIHdoaWxlIChzaXplLS0gIT0gMCkKLSAgICBpZiAoKnArKyAhPSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBhdXhpbGlhcnkgaGVhZGVycy4gIFdlIGNyZWF0ZSB0aG9zZQotICAgYXV4aWxpYXJ5IGhlYWRlcnMgd2hpY2ggaGF2ZSBiZWVuIHNldCBub24temVyby4gIFdlIGRvIG5vdCByZXF1aXJlCi0gICB0aGUgY2FsbGVyIHRvIHNldCB1cCB0aGUgc3RhbXAgZmllbGRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBXcml0ZSBvdXQgdGhlIHZlcnNpb24gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJWZVJzSW9OIyIsIDgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tYWpvclZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1ham9yVmVyc2lvbik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1pbm9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWlub3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+cmV2aXNpb24sCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJldmlzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+eWVhciwKLQkJKGJmZF9ieXRlICopIHRoZHIueWVhcik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1vbnRoLAotCQkoYmZkX2J5dGUgKikgdGhkci5tb250aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPmRheSwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF5KTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZW5kZWQgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJNZVNzQWdFcyIsIDgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bGFuZ3VhZ2VJRCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGFuZ3VhZ2VJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUNvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc09mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgICAgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZENvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cHJvZHVjdElELAotCQkoYmZkX2J5dGUgKikgdGhkci5wcm9kdWN0SUQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQwLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDApOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDEpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQyLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDIpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQzLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDMpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ0LAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ1LAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGNvcHlyaWdodCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkNvUHlSaUdoVD0iLCAxMCk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0aGRyLnN0YW1wLCBzaXplb2YgKHRoZHIuc3RhbXApLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh0aGRyLnN0YW1wKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0aGRyLmNvcHlyaWdodE1lc3NhZ2VMZW5ndGhbMF0gPQotCW5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aDsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aCwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBUaGUgY29weXJpZ2h0IG1lc3NhZ2UgaXMgYSB2YXJpYWJsZSBsZW5ndGggc3RyaW5nLiAqLwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEsCi0JCSAgICAgMSwgYWJmZCkgIT0KLQkgICgoYmZkX3NpemVfdHlwZSkKLQkgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY3VzdG9tIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyIHRoZHI7Ci0gICAgICBib29sZWFuIGRzOwotICAgICAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0KLSAgICAgIGRzID0gZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJCSBzaXplb2YgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wKSk7Ci0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJDdVN0SGVBZCIsIDgpOwotICAgICAgaGRyTGVuZ3RoID0gKDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIChkcyA/IDggOiAwKQotCQkgICArIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCBoZHJMZW5ndGgsIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhT2Zmc2V0LAotCQl0aGRyLmRhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFMZW5ndGgsCi0JCXRoZHIuZGF0YUxlbmd0aCk7Ci0gICAgICBpZiAoISBkcykKLQl7Ci0JICBCRkRfQVNTRVJUIChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9PSAwKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0aGRyLCAxLAotCQkJIHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHRoZHIpIC0gc2l6ZW9mICh0aGRyLmRhdGFTdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5ICh0aGRyLmRhdGFTdGFtcCwgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLmRhdGFTdGFtcCkpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChiZmRfd3JpdGUgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyLCAxLAotCQkJIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoLCBhYmZkKQotCSAgICAgICE9IG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIEN5Z251cyBkZWJ1Z2dpbmcgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPmxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF0YUxlbmd0aCk7Ci0gICAgICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHJlYWQgdGhlIE5MTSdzIHB1YmxpYyBzeW1ib2xzIGFuZCB1c2UgaXQgdG8gZ2VuZXJhdGUgYSBiZmQgc3ltYm9sCi0gICB0YWJsZSAoaGV5LCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcpIG9uIGEgb25lLWZvci1vbmUgYmFzaXMuICBUaHVzCi0gICB1c2UgdGhlIG51bWJlciBvZiBwdWJsaWMgc3ltYm9scyBhcyB0aGUgbnVtYmVyIG9mIGJmZCBzeW1ib2xzIHdlIHdpbGwKLSAgIGhhdmUgb25jZSB3ZSBhY3R1YWxseSBnZXQgYXJvdW5kIHRvIHJlYWRpbmcgdGhlbSBpbi4KLQotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltdGFiIHZlY3RvciwgYmFzZWQgb24KLSAgIHRoZSBjb3VudCBwbHVzIDEsIHNpbmNlIHdlIHdpbGwgTlVMTCB0ZXJtaW5hdGUgdGhlIHZlY3RvciBhbGxvY2F0ZWQgYmFzZWQKLSAgIG9uIHRoaXMgc2l6ZS4gKi8KLQotbG9uZwotbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwkvKiBObG0gZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZSA9IDA7Ci0KLSAgaV9meGRoZHJwID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCk7Ci0gIHN5bWNvdW50ID0gKGlfZnhkaGRycC0+bnVtYmVyT2ZQdWJsaWNzCi0JICAgICAgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzCi0JICAgICAgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgc3ltdGFiX3NpemUgPSAoc3ltY291bnQgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wpKTsKLSAgcmV0dXJuIChzeW10YWJfc2l6ZSk7Ci19Ci0KLS8qIE5vdGUgdGhhdCBiZmRfZ2V0X3N5bWNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBzbHVycGluZyB0aGUKLSAgIHN5bWJvbCB0YWJsZSBmYWlscy4gKi8KLQotbG9uZwotbmxtX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBubG1fc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGJmZF9zaXplX3R5cGUgY291bnRlciA9IDA7Ci0KLSAgaWYgKG5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLSAgc3ltYmFzZSA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudGVyIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgKmFsb2NhdGlvbisrID0gJnN5bWJhc2UtPnN5bWJvbDsKLSAgICAgIHN5bWJhc2UrKzsKLSAgICAgIGNvdW50ZXIrKzsKLSAgICB9Ci0gICphbG9jYXRpb24gPSAoYXN5bWJvbCAqKSBOVUxMOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIE1ha2UgYW4gTkxNIHN5bWJvbC4gIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLiAgKi8KLQotYXN5bWJvbCAqCi1ubG1fbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbmxtX3N5bWJvbF90eXBlICpuZXc7Ci0KLSAgbmV3ID0gKG5sbV9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKG5sbV9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3KQotICAgIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBHZXQgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotdm9pZAotbmxtX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXZvaWQKLW5sbV9wcmludF9zeW1ib2wgKGFiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgaWYgKHN5bWJvbC0+bmFtZSkKLQlmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMiLCBzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotICAgICAgaWYgKHN5bWJvbC0+bmFtZSkKLQlmcHJpbnRmIChmaWxlLCAiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogU2x1cnAgaW4gbmxtIHN5bWJvbCB0YWJsZS4KLQotICAgSW4gdGhlIGV4dGVybmFsIChpbi1maWxlKSBmb3JtLCBOTE0gZXhwb3J0IHJlY29yZHMgYXJlIHZhcmlhYmxlIGxlbmd0aCwKLSAgIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtOgotCi0JMSBieXRlCQlsZW5ndGggb2YgdGhlIHN5bWJvbCBuYW1lIChOKQotCU4gYnl0ZXMJCXRoZSBzeW1ib2wgbmFtZQotCTQgYnl0ZXMJCXRoZSBzeW1ib2wgb2Zmc2V0IGZyb20gc3RhcnQgb2YgaXQncyBzZWN0aW9uCi0KLSAgIFdlIGFsc28gcmVhZCBpbiB0aGUgZGVidWdnaW5nIHN5bWJvbHMgYW5kIGltcG9ydCByZWNvcmRzLiAgSW1wb3J0Ci0gICByZWNvcmRzIGFyZSB0cmVhdGVkIGFzIHVuZGVmaW5lZCBzeW1ib2xzLiAgQXMgd2UgcmVhZCB0aGUgaW1wb3J0Ci0gICByZWNvcmRzIHdlIGFsc28gcmVhZCBpbiB0aGUgYXNzb2NpYXRlZCByZWxvYyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKLSAgIGF0dGFjaGVkIHRvIHRoZSBzeW1ib2wuCi0KLSAgIFRoZSBiZmQgc3ltYm9scyBhcmUgY29waWVkIHRvIFNZTVBUUlMuCi0KLSAgIFdoZW4gd2UgcmV0dXJuLCB0aGUgYmZkIHN5bWNvdW50IGlzIGVpdGhlciB6ZXJvIG9yIGNvbnRhaW5zIHRoZSBjb3JyZWN0Ci0gICBudW1iZXIgb2Ygc3ltYm9scy4KLSovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmlfZnhkaGRycDsJLyogTmxtIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIGJmZF9zaXplX3R5cGUgdG90c3ltY291bnQ7CS8qIE51bWJlciBvZiBOTE0gc3ltYm9scyAqLwotICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwkvKiBDb3VudGVyIG9mIE5MTSBzeW1ib2xzICovCi0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltOwkJLyogUG9pbnRlciB0byBjdXJyZW50IGJmZCBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CS8qIFN5bWJvbCBsZW5ndGggcmVhZCBpbnRvIGhlcmUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW10eXBlOwkvKiBUeXBlIG9mIGRlYnVnZ2luZyBzeW1ib2wgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIFN5bWJvbCBvZmZzZXRzIHJlYWQgaW50byBoZXJlICovCi0gIGJvb2xlYW4gKCpyZWFkX2ltcG9ydF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgbmxtX3N5bWJvbF90eXBlICopKTsKLSAgYm9vbGVhbiAoKnNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKSBQQVJBTVMgKChiZmQgKiwgbmxtX3N5bWJvbF90eXBlICopKTsKLQotICBpZiAobmxtX2dldF9zeW1ib2xzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiAodHJ1ZSk7Ci0KLSAgLyogUmVhZCBlYWNoIHJhdyBOTE0gc3ltYm9sLCB1c2luZyB0aGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIGEgY2Fub25pY2FsIGJmZAotICAgICBzeW1ib2wgdGFibGUgZW50cnkuCi0KLSAgICAgTm90ZSB0aGF0IHdlIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJmZCBjYW5vbmljYWwgc3ltYm9sIGJ1ZmZlciBiYXNlZCBvbiBhCi0gICAgIG9uZS10by1vbmUgbWFwcGluZyBvZiB0aGUgTkxNIHN5bWJvbHMgdG8gY2Fub25pY2FsIHN5bWJvbHMuICBXZSBhY3R1YWxseQotICAgICB1c2UgYWxsIHRoZSBOTE0gc3ltYm9scywgc28gdGhlcmUgd2lsbCBiZSBubyBzcGFjZSBsZWZ0IG92ZXIgYXQgdGhlIGVuZC4KLSAgICAgV2hlbiB3ZSBoYXZlIGFsbCB0aGUgc3ltYm9scywgd2UgYnVpbGQgdGhlIGNhbGxlcidzIHBvaW50ZXIgdmVjdG9yLiAqLwotCi0gIGFiZmQtPnN5bWNvdW50ID0gMDsKLSAgaV9meGRoZHJwID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCk7Ci0gIHRvdHN5bWNvdW50ID0gKGlfZnhkaGRycC0+bnVtYmVyT2ZQdWJsaWNzCi0JCSArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKLQkJICsgaV9meGRoZHJwLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7Ci0gIGlmICh0b3RzeW1jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaV9meGRoZHJwLT5wdWJsaWNzT2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgc3ltID0gKChubG1fc3ltYm9sX3R5cGUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgdG90c3ltY291bnQgKiBzaXplb2YgKG5sbV9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKCFzeW0pCi0gICAgcmV0dXJuIGZhbHNlOwotICBubG1fc2V0X3N5bWJvbHMgKGFiZmQsIHN5bSk7Ci0KLSAgLyogV2UgdXNlIHRoZSBiZmQncyBzeW1jb3VudCBkaXJlY3RseSBhcyB0aGUgY29udHJvbCBjb3VudCwgc28gdGhhdCBlYXJseQotICAgICB0ZXJtaW5hdGlvbiBvZiB0aGUgbG9vcCBsZWF2ZXMgdGhlIHN5bWNvdW50IGNvcnJlY3QgZm9yIHRoZSBzeW1ib2xzIHRoYXQKLSAgICAgd2VyZSByZWFkLiAqLwotCi0gIHNldF9wdWJsaWNfc2VjdGlvbl9mdW5jID0gbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jIChhYmZkKTsKLSAgc3ltY291bnQgPSBpX2Z4ZGhkcnAtPm51bWJlck9mUHVibGljczsKLSAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gICAgICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgICAgIGlmICghc3ltLT5zeW1ib2wubmFtZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHN5bS0+c3ltYm9sLm5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkKLQkgICE9IHN5bWxlbmd0aCkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIC8qIENhc3QgYXdheSBjb25zdC4gICovCi0gICAgICAoKGNoYXIgKikgKHN5bS0+c3ltYm9sLm5hbWUpKVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzID0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGdldF93b3JkIChhYmZkLCB0ZW1wKTsKLSAgICAgIGlmIChzZXRfcHVibGljX3NlY3Rpb25fZnVuYykKLQl7Ci0JICAvKiBNb3N0IGJhY2tlbmRzIGNhbiB1c2UgdGhlIGNvZGUgYmVsb3csIGJ1dCB1bmZvcnR1bmF0ZWx5Ci0JICAgICBzb21lIHVzZSBhIGRpZmZlcmVudCBzY2hlbWUuICAqLwotCSAgaWYgKCgqc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpIChhYmZkLCBzeW0pID09IGZhbHNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzeW0tPnN5bWJvbC52YWx1ZSAmIE5MTV9ISUJJVCkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH5OTE1fSElCSVQ7Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICAgIH0KLQl9Ci0gICAgICBzeW0tPnJjbnQgPSAwOwotICAgICAgYWJmZC0+c3ltY291bnQrKzsKLSAgICAgIHN5bSsrOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBkZWJ1Z2dpbmcgcmVjb3Jkcy4gICovCi0KLSAgaWYgKGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9meGRoZHJwLT5kZWJ1Z0luZm9PZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLQotICAgICAgc3ltY291bnQgKz0gaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkczsKLSAgICAgIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQotCXsKLQkgIGlmICgoYmZkX3JlYWQgKChQVFIpICYgc3ltdHlwZSwgc2l6ZW9mIChzeW10eXBlKSwgMSwgYWJmZCkKLQkgICAgICAgIT0gc2l6ZW9mIChzeW10eXBlKSkKLQkgICB8fCBiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKQotCSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgJiBzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotCSAgaWYgKCFzeW0tPnN5bWJvbC5uYW1lKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHN5bS0+c3ltYm9sLm5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkKLQkgICAgICAhPSBzeW1sZW5ndGgpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgLyogQ2FzdCBhd2F5IGNvbnN0LiAgKi8KLQkgICgoY2hhciAqKSAoc3ltLT5zeW1ib2wubmFtZSkpW3N5bWxlbmd0aF0gPSAnXDAnOwotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSA9IGdldF93b3JkIChhYmZkLCB0ZW1wKTsKLQkgIGlmIChzeW10eXBlID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzeW10eXBlID09IDEpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQkgIHN5bS0+cmNudCA9IDA7Ci0JICBhYmZkLT5zeW1jb3VudCsrOwotCSAgc3ltKys7Ci0JfQotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBpbXBvcnQgcmVjb3Jkcy4gIFdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgd2Uga25vdyBob3cKLSAgICAgdG8gcmVhZCByZWxvY3MgZm9yIHRoaXMgdGFyZ2V0LiAgKi8KLQotICByZWFkX2ltcG9ydF9mdW5jID0gbmxtX3JlYWRfaW1wb3J0X2Z1bmMgKGFiZmQpOwotICBpZiAocmVhZF9pbXBvcnRfZnVuYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9meGRoZHJwLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQsIFNFRUtfU0VUKQotCSAgPT0gLTEpCi0JcmV0dXJuIChmYWxzZSk7Ci0KLSAgICAgIHN5bWNvdW50ICs9IGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXM7Ci0gICAgICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKLQl7Ci0JICBpZiAoKCpyZWFkX2ltcG9ydF9mdW5jKSAoYWJmZCwgc3ltKSA9PSBmYWxzZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ltKys7Ci0JICBhYmZkLT5zeW1jb3VudCsrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQwKLS8qIEdldCB0aGUgcmVsb2NzIGZvciBhbiBOTE0gZmlsZS4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcmVsb2NzLgotICAgSW1wb3J0cyBhcmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIG90aGVyIE5MTSBmaWxlcy4gIFdlCi0gICB0cmVhdCB0aGVzZSBhcyByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIFJlbG9jYXRpb24gZml4dXBzCi0gICBhcmUgaW50ZXJuYWwgcmVsb2NzLgotCi0gICBUaGUgYWN0dWFsIGZvcm1hdCB1c2VkIHRvIHN0b3JlIHRoZSByZWxvY3MgaXMgbWFjaGluZSBzcGVjaWZpYy4gICovCi0KLS8qIFJlYWQgaW4gdGhlIHJlbG9jYXRpb24gZml4dXAgaW5mb3JtYXRpb24uICBUaGlzIGlzIHN0b3JlZCBpbgotICAgbmxtX3JlbG9jYXRpb25fZml4dXBzLCBhbiBhcnJheSBvZiBhcmVsZW50IHN0cnVjdHVyZXMsIGFuZAotICAgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcywgYW4gYXJyYXkgb2Ygc2VjdGlvbiBwb2ludGVycy4gIFRoZQotICAgc2VjdGlvbiBwb2ludGVycyBhcmUgbmVlZGVkIGJlY2F1c2UgdGhlIHJlbG9jcyBhcmUgbm90IHNvcnRlZCBieQotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc2x1cnBfcmVsb2NfZml4dXBzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gKCpyZWFkX2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBubG1fc3ltYm9sX3R5cGUgKiwgYXNlY3Rpb24gKiosCi0JCQkJYXJlbGVudCAqKSk7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIGFyZWxlbnQgKnJlbHM7Ci0gIGFzZWN0aW9uICoqc2VjczsKLQotICBpZiAobmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICByZWFkX2Z1bmMgPSBubG1fcmVhZF9yZWxvY19mdW5jIChhYmZkKTsKLSAgaWYgKHJlYWRfZnVuYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvdW50ID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgcmVscyA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgc2VjcyA9IChhc2VjdGlvbiAqKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoKHJlbHMgPT0gTlVMTCB8fCBzZWNzID09IE5VTEwpICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpID0gcmVsczsKLSAgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyAoYWJmZCkgPSBzZWNzOwotCi0gIC8qIFdlIGhhdmUgdG8gcmVhZCBwaWVjZSBieSBwaWVjZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyBsYXJnZQotICAgICB0aGUgbWFjaGluZSBzcGVjaWZpYyByZWxvYyBpbmZvcm1hdGlvbiBpcy4gICovCi0gIHdoaWxlIChjb3VudC0tICE9IDApCi0gICAgewotICAgICAgaWYgKCgqcmVhZF9mdW5jKSAoYWJmZCwgKG5sbV9zeW1ib2xfdHlwZSAqKSBOVUxMLCBzZWNzLCByZWxzKSA9PSBmYWxzZSkKLQl7Ci0JICBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpID0gTlVMTDsKLQkgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MgKGFiZmQpID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK3NlY3M7Ci0gICAgICArK3JlbHM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIG51bWJlciBvZiByZWxvY3MuICBUaGlzIHJlYWxseSBqdXN0IHJldHVybnMgYW4gdXBwZXIgYm91bmQsCi0gICBzaW5jZSBpdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGRpc3Rpbmd1aXNoIHRoZW0gYmFzZWQgb24gdGhlIHNlY3Rpb24uCi0gICBUaGF0IHdpbGwgYmUgaGFuZGxlZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5IHJlYWQuICAqLwotCi1sb25nCi1ubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgbmxtX3N5bWJvbF90eXBlICpzeW1zOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICB1bnNpZ25lZCBpbnQgcmV0OwotCi0gIC8qIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHJlYWQgcmVsb2NzLCBqdXN0IHJldHVybiAwLiAgKi8KLSAgaWYgKG5sbV9yZWFkX3JlbG9jX2Z1bmMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlaXRoZXIgdGhlIGNvZGUgb3IgdGhlIGRhdGEgc2VjdGlvbi4gICovCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgKFNFQ19DT0RFIHwgU0VDX0RBVEEpKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHN5bXMgPSBubG1fZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChubG1fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0gICAgICBzeW1zID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0ID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLQotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB3aGlsZSAoY291bnQtLSAhPSAwKQotICAgIHsKLSAgICAgIHJldCArPSBzeW1zLT5yY250OwotICAgICAgKytzeW1zOwotICAgIH0KLQotICByZXR1cm4gKHJldCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBHZXQgdGhlIHJlbG9jcyB0aGVtc2VsdmVzLiAgKi8KLQotbG9uZwotbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnJlbHM7Ci0gIGFzZWN0aW9uICoqc2VjczsKLSAgYmZkX3NpemVfdHlwZSBjb3VudCwgaTsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICAvKiBHZXQgdGhlIHJlbG9jYXRpb24gZml4dXBzLiAgKi8KLSAgcmVscyA9IG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCk7Ci0gIGlmIChyZWxzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG5sbV9zbHVycF9yZWxvY19maXh1cHMgKGFiZmQpID09IGZhbHNlKQotCXJldHVybiAtMTsKLSAgICAgIHJlbHMgPSBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpOwotICAgIH0KLSAgc2VjcyA9IG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MgKGFiZmQpOwotCi0gIHJldCA9IDA7Ci0gIGNvdW50ID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJlbHMrKywgc2VjcysrKQotICAgIHsKLSAgICAgIGlmICgqc2VjcyA9PSBzZWMpCi0JewotCSAgKnJlbHB0cisrID0gcmVsczsKLQkgICsrcmV0OwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBpbXBvcnQgc3ltYm9scy4gICovCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW1ib2xzKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSAqc3ltYm9sczsKLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0pID09IGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIpCi0JewotCSAgbmxtX3N5bWJvbF90eXBlICpubG1fc3ltOwotCSAgYmZkX3NpemVfdHlwZSBqOwotCi0JICBubG1fc3ltID0gKG5sbV9zeW1ib2xfdHlwZSAqKSBzeW07Ci0JICBmb3IgKGogPSAwOyBqIDwgbmxtX3N5bS0+cmNudDsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKG5sbV9zeW0tPnJlbG9jc1tqXS5zZWN0aW9uID09IHNlYykKLQkJewotCQkgICpyZWxwdHIgPSAmbmxtX3N5bS0+cmVsb2NzW2pdLnJlbG9jOwotCQkgICgqcmVscHRyKS0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzOwotCQkgICsrcmVscHRyOwotCQkgICsrcmV0OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBDb21wdXRlIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIGZvciBhbiBOTE0gZmlsZS4gIEFsbCB2YXJpYWJsZQotICAgbGVuZ3RoIGRhdGEgaW4gdGhlIGZpbGUgaGVhZGVycyBtdXN0IGJlIHNldCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcwotICAgY2FsbGVkLiAgSWYgdGhlIHZhcmlhYmxlIGxlbmd0aCBkYXRhIGlzIGNoYW5nZWQgbGF0ZXIsIHRoZQotICAgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpbGwgYmUgaW5jb3JyZWN0LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMKLSAgIG5vIHdheSB0byBjaGVjayB0aGlzLgotCi0gICBUaGlzIHJvdXRpbmUgYWxzbyBzZXRzIHRoZSBTaXplIGFuZCBPZmZzZXQgZmllbGRzIGluIHRoZSBmaXhlZAotICAgaGVhZGVyLgotCi0gICBJdCBhbHNvIGxvb2tzIG92ZXIgdGhlIHN5bWJvbHMgYW5kIG1vdmVzIGFueSBjb21tb24gc3ltYm9scyBpbnRvCi0gICB0aGUgLmJzcyBzZWN0aW9uOyBOTE0gaGFzIG5vIHdheSB0byByZXByZXNlbnQgYSBjb21tb24gc3ltYm9sLgotICAgVGhpcyBhcHByb2FjaCBtZWFucyB0aGF0IGVpdGhlciB0aGUgc3ltYm9scyBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuCi0gICBzZXQgYXQgdGhpcyBwb2ludCwgb3IgdGhlcmUgbXVzdCBiZSBubyBjb21tb24gc3ltYm9scy4gIFdlIG5lZWQgdG8KLSAgIG1vdmUgdGhlIHN5bWJvbHMgYXQgdGhpcyBwb2ludCBzbyB0aGF0IG1hbmdsZV9yZWxvY3MgY2FuIHNlZSB0aGUKLSAgIGZpbmFsIHZhbHVlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHNvZmFyOwotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfdm1hIHRleHQsIGRhdGEsIGJzczsKLSAgYmZkX3ZtYSB0ZXh0X2xvdywgZGF0YV9sb3c7Ci0gIHVuc2lnbmVkIGludCB0ZXh0X2FsaWduLCBkYXRhX2FsaWduLCBvdGhlcl9hbGlnbjsKLSAgZmlsZV9wdHIgdGV4dF9wdHIsIGRhdGFfcHRyLCBvdGhlcl9wdHI7Ci0gIGFzZWN0aW9uICpic3Nfc2VjOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gdHJ1ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNlY3Rpb24gdG8gaG9sZCB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChic3Nfc2VjID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgICAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKSAwLAotCQkJICAgIFNFQ19BTExPQykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgIH0KLQotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQotICAvKiBUaGUgZml4ZWQgaGVhZGVyLiAgKi8KLSAgc29mYXIgPSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpICsgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKTsKLQotICAvKiBUaGUgdmFyaWFibGUgaGVhZGVyLiAgKi8KLSAgc29mYXIgKz0gKHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKQotCSAgICArIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEKLQkgICAgKyBOTE1fVEFSR0VUX0xPTkdfU0laRQkvKiBzdGFja1NpemUgKi8KLQkgICAgKyBOTE1fVEFSR0VUX0xPTkdfU0laRQkvKiByZXNlcnZlZCAqLwotCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpCi0JICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkKLQkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEKLQkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKQotCSAgICArIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSk7Ci0KLSAgLyogVGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gc2l6ZW9mIChObG1fRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcikpKQotICAgIHNvZmFyICs9IHNpemVvZiAoTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcik7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSAoc2l6ZW9mIChObG1fRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKLQkgICAgICArIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gKHNpemVvZiAoTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIpCi0JICAgICAgKyBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCk7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpKQotICAgIHNvZmFyICs9IHNpemVvZiAoTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIpOwotCi0gIC8qIENvbXB1dGUgdGhlIHNlY3Rpb24gZmlsZSBwb3NpdGlvbnMgaW4gdHdvIHBhc3Nlcy4gIEZpcnN0IGdldCB0aGUKLSAgICAgc2l6ZXMgb2YgdGhlIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMsIGFuZCB0aGVuIHNldCB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMuICBUaGlzIGNvZGUgYWxpZ25zIHRoZSBzZWN0aW9ucyBpbiB0aGUgZmlsZSB1c2luZyB0aGUKLSAgICAgc2FtZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIHRoYXQgYXBwbHkgdG8gdGhlIHNlY3Rpb25zIGluIG1lbW9yeTsKLSAgICAgdGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeS4gICovCi0gIHRleHQgPSAwOwotICB0ZXh0X2xvdyA9IChiZmRfdm1hKSAtIDE7Ci0gIHRleHRfYWxpZ24gPSAwOwotICBkYXRhID0gMDsKLSAgZGF0YV9sb3cgPSAoYmZkX3ZtYSkgLSAxOwotICBkYXRhX2FsaWduID0gMDsKLSAgYnNzID0gMDsKLSAgb3RoZXJfYWxpZ24gPSAwOwotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmOwotCi0gICAgICBzZWMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAoc2VjLT5fcmF3X3NpemUsIDEgPDwgc2VjLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0gICAgICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotICAgICAgaWYgKGYgJiBTRUNfQ09ERSkKLQl7Ci0JICB0ZXh0ICs9IHNlYy0+X3Jhd19zaXplOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgPCB0ZXh0X2xvdykKLQkgICAgdGV4dF9sb3cgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotCSAgaWYgKHNlYy0+YWxpZ25tZW50X3Bvd2VyID4gdGV4dF9hbGlnbikKLQkgICAgdGV4dF9hbGlnbiA9IHNlYy0+YWxpZ25tZW50X3Bvd2VyOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfREFUQSkKLQl7Ci0JICBkYXRhICs9IHNlYy0+X3Jhd19zaXplOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgPCBkYXRhX2xvdykKLQkgICAgZGF0YV9sb3cgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotCSAgaWYgKHNlYy0+YWxpZ25tZW50X3Bvd2VyID4gZGF0YV9hbGlnbikKLQkgICAgZGF0YV9hbGlnbiA9IHNlYy0+YWxpZ25tZW50X3Bvd2VyOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfSEFTX0NPTlRFTlRTKQotCXsKLQkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IG90aGVyX2FsaWduKQotCSAgICBvdGhlcl9hbGlnbiA9IHNlYy0+YWxpZ25tZW50X3Bvd2VyOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfQUxMT0MpCi0JYnNzICs9IHNlYy0+X3Jhd19zaXplOwotICAgIH0KLQotICBubG1fc2V0X3RleHRfbG93IChhYmZkLCB0ZXh0X2xvdyk7Ci0gIG5sbV9zZXRfZGF0YV9sb3cgKGFiZmQsIGRhdGFfbG93KTsKLQotICBpZiAobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSAoYWJmZCkpCi0gICAgewotICAgICAgLyogVGhpcyBOZXRXYXJlIGZvcm1hdCBkb2VzIG5vdCB1c2UgdW5pbml0aWFsaXplZCBkYXRhLiAgV2UgbXVzdAotCSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzZWN0aW9uLiAgV2Ugd2lsbCBuZXZlciB3aW5kIHVwCi0JIHdyaXRpbmcgdGhvc2UgZmlsZSBsb2NhdGlvbnMsIHNvIHRoZXkgd2lsbCByZW1haW4gemVyby4gICovCi0gICAgICBkYXRhICs9IGJzczsKLSAgICAgIGJzcyA9IDA7Ci0gICAgfQotCi0gIHRleHRfcHRyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCB0ZXh0X2FsaWduKTsKLSAgZGF0YV9wdHIgPSBCRkRfQUxJR04gKHRleHRfcHRyICsgdGV4dCwgMSA8PCBkYXRhX2FsaWduKTsKLSAgb3RoZXJfcHRyID0gQkZEX0FMSUdOIChkYXRhX3B0ciArIGRhdGEsIDEgPDwgb3RoZXJfYWxpZ24pOwotCi0gIC8qIEZpbGwgaW4gc29tZSBmaWVsZHMgaW4gdGhlIGhlYWRlciBmb3Igd2hpY2ggd2Ugbm93IGhhdmUgdGhlCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCA9IHRleHRfcHRyOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlU2l6ZSA9IHRleHQ7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPSBkYXRhX3B0cjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZVNpemUgPSBkYXRhOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dW5pbml0aWFsaXplZERhdGFTaXplID0gYnNzOwotCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGY7Ci0KLSAgICAgIGYgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0KLSAgICAgIGlmIChmICYgU0VDX0NPREUpCi0JewotCSAgc2VjLT5maWxlcG9zID0gdGV4dF9wdHI7Ci0JICB0ZXh0X3B0ciArPSBzZWMtPl9yYXdfc2l6ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0RBVEEpCi0JewotCSAgc2VjLT5maWxlcG9zID0gZGF0YV9wdHI7Ci0JICBkYXRhX3B0ciArPSBzZWMtPl9yYXdfc2l6ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0hBU19DT05URU5UUykKLQl7Ci0JICBzZWMtPmZpbGVwb3MgPSBvdGhlcl9wdHI7Ci0JICBvdGhlcl9wdHIgKz0gc2VjLT5fcmF3X3NpemU7Ci0JfQotICAgIH0KLQotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0gb3RoZXJfcHRyOwotCi0gIC8qIE1vdmUgYWxsIGNvbW1vbiBzeW1ib2xzIGludG8gdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0KLSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBpZiAoc3ltX3B0cl9wdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqc3ltX2VuZDsKLSAgICAgIGJmZF92bWEgYWRkOwotCi0gICAgICBzeW1fZW5kID0gc3ltX3B0cl9wdHIgKyBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgICAgIGFkZCA9IDA7Ci0gICAgICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQotCXsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGJmZF92bWEgc2l6ZTsKLQotCSAgc3ltID0gKnN5bV9wdHJfcHRyOwotCi0JICBpZiAoIWJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFB1dCB0aGUgY29tbW9uIHN5bWJvbCBpbiB0aGUgLmJzcyBzZWN0aW9uLCBhbmQgaW5jcmVhc2UKLQkgICAgIHRoZSBzaXplIG9mIHRoZSAuYnNzIHNlY3Rpb24gYnkgdGhlIHNpemUgb2YgdGhlIGNvbW1vbgotCSAgICAgc3ltYm9sICh3aGljaCBpcyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wpLiAgKi8KLQkgIHN5bS0+c2VjdGlvbiA9IGJzc19zZWM7Ci0JICBzaXplID0gc3ltLT52YWx1ZTsKLQkgIHN5bS0+dmFsdWUgPSBic3Nfc2VjLT5fcmF3X3NpemUgKyBhZGQ7Ci0JICBhZGQgKz0gc2l6ZTsKLQkgIGFkZCA9IEJGRF9BTElHTiAoYWRkLCAxIDw8IGJzc19zZWMtPmFsaWdubWVudF9wb3dlcik7Ci0JfQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGlmIChubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhIChhYmZkKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNvdWxkIGhhbmRsZSB0aGlzIGNhc2UsIGJ1dCBzbyBmYXIgaXQgaGFzbid0IGJlZW4KLQkJIG5lY2Vzc2FyeS4gICovCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT51bmluaXRpYWxpemVkRGF0YVNpemUgKz0gYWRkOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplICs9IGFkZDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBrbm93IHdoZXJlCi0gICB0aGUgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBsb2NhdGVkIGluIHRoZSBvdXRwdXQgZmlsZS4gIFRoYXQgbWVhbnMKLSAgIHRoYXQgdGhlIHNpemVzIG9mIGFsbCB0aGUgc2VjdGlvbnMgbXVzdCBiZSBzZXQsIGFuZCBhbGwgdGhlCi0gICB2YXJpYWJsZSBzaXplIGhlYWRlciBpbmZvcm1hdGlvbiBtdXN0IGJlIGtub3duLiAgKi8KLQotYm9vbGVhbgotbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlCi0gICAgICAmJiBubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogaTM4NiBOZXRXYXJlIGhhcyBhIHZlcnkgcmVzdHJpY3RlZCBzZXQgb2YgcmVsb2NzLiAgSW4gb3JkZXIgZm9yCi0gICAgIG9iamNvcHkgdG8gd29yaywgdGhlIE5MTSBpMzg2IGJhY2tlbmQgbmVlZHMgYSBjaGFuY2UgdG8gcmV3b3JrCi0gICAgIHRoZSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgaXRzIHNldCBvZiByZWxvY3Mgd2lsbCB3b3JrLiAgSWYgYWxsCi0gICAgIHRoZSByZWxvY3MgYXJlIGFscmVhZHkgYWNjZXB0YWJsZSwgdGhpcyB3aWxsIG5vdCBkbyBhbnl0aGluZy4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGJvb2xlYW4gKCptYW5nbGVfcmVsb2NzX2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsCi0JCQkJCSAgICAgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotCi0gICAgICBtYW5nbGVfcmVsb2NzX2Z1bmMgPSBubG1fbWFuZ2xlX3JlbG9jc19mdW5jIChhYmZkKTsKLSAgICAgIGlmIChtYW5nbGVfcmVsb2NzX2Z1bmMgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISgqbWFuZ2xlX3JlbG9jc19mdW5jKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sCi0JCQkJICAgICAgKGJmZF92bWEpIG9mZnNldCwgY291bnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgbmVlZCB0byBzb3J0IGEgbGlzdCBvZiByZWxvY3MgYXNzb2NpYXRlZCB3aXRoIHNlY3Rpb25zIHdoZW4gd2UKLSAgIHdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQotc3RhdGljIGludAotbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUgKHAxLCBwMikKLSAgICAgY29uc3Qgdm9pZCAqcDE7Ci0gICAgIGNvbnN0IHZvaWQgKnAyOwotewotICBjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcjEgPSAoY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgcDE7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICpyMiA9IChjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSBwMjsKLSAgaW50IGNtcDsKLQotICBjbXAgPSBzdHJjbXAgKCgqcjEtPnJlbC0+c3ltX3B0cl9wdHIpLT5uYW1lLAotCQkoKnIyLT5yZWwtPnN5bV9wdHJfcHRyKS0+bmFtZSk7Ci0gIGlmIChjbXAgIT0gMCkKLSAgICByZXR1cm4gY21wOwotCi0gIC8qIFdlIHNvcnQgYnkgYWRkcmVzcyB3aXRoaW4gc3ltYm9sIHRvIG1ha2UgdGhlIHNvcnQgbW9yZSBzdGFibGUgYW5kCi0gICAgIGluY3JlYXNlIHRoZSBjaGFuY2VzIHRoYXQgZGlmZmVyZW50IGhvc3RzIHdpbGwgZ2VuZXJhdGUgYml0IGZvcgotICAgICBiaXQgZXF1aXZhbGVudCByZXN1bHRzLiAgKi8KLSAgcmV0dXJuIChpbnQpIChyMS0+cmVsLT5hZGRyZXNzIC0gcjItPnJlbC0+YWRkcmVzcyk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBOTE0gZmlsZS4gIFdlIHdyaXRlIG91dCB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyBvcmRlcjoKLSAgICAgZml4ZWQgaGVhZGVyCi0gICAgIHZhcmlhYmxlIGhlYWRlcgotICAgICBhdXhpbGlhcnkgaGVhZGVycwotICAgICBjb2RlIHNlY3Rpb25zCi0gICAgIGRhdGEgc2VjdGlvbnMKLSAgICAgb3RoZXIgc2VjdGlvbnMgKGN1c3RvbSBkYXRhLCBtZXNzYWdlcywgaGVscCwgc2hhcmVkIE5MTSwgUlBDLAotICAgICAJCSAgICAgbW9kdWxlIGRlcGVuZGVuY2llcykKLSAgICAgcmVsb2NhdGlvbiBmaXh1cHMKLSAgICAgZXh0ZXJuYWwgcmVmZXJlbmNlcyAoaW1wb3J0cykKLSAgICAgcHVibGljIHN5bWJvbHMgKGV4cG9ydHMpCi0gICAgIGRlYnVnZ2luZyByZWNvcmRzCi0gICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG9yZGVyIHVzZWQgYnkgdGhlIE5ldFdhcmUgdG9vbHM7IHRoZQotICAgZGlmZmVyZW5jZSBpcyB0aGF0IE5ldFdhcmUgcHV0cyB0aGUgc2VjdGlvbnMgb3RoZXIgdGhhbiBjb2RlLCBkYXRhCi0gICBhbmQgY3VzdG9tIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgTkxNLiAgSXQgaXMgY29udmVuaWVudCBmb3IgdXMgdG8KLSAgIGtub3cgd2hlcmUgdGhlIHNlY3Rpb25zIGFyZSBnb2luZyB0byBiZSBiZWZvcmUgd29ycnlpbmcgYWJvdXQgdGhlCi0gICBzaXplIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbi4KLQotICAgQnkgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgc2VjdGlvbiBkYXRhIHNob3VsZAotICAgaGF2ZSBiZWVuIG91dHB1dCB1c2luZyBzZXRfc2VjdGlvbl9jb250ZW50cy4gIE5vdGUgdGhhdCBjdXN0b20KLSAgIGRhdGEsIHRoZSBtZXNzYWdlIGZpbGUsIHRoZSBoZWxwIGZpbGUsIHRoZSBzaGFyZWQgTkxNIGZpbGUsIHRoZSBSUEMKLSAgIGRhdGEsIGFuZCB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUKLSAgIHNlY3Rpb25zOyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBvZmZzZXQgYW5kCi0gICBsZW5ndGggZmllbGRzIGluIHRoZSBOTE0gaGVhZGVycy4gIFRoZSByZWxvY2F0aW9uIGZpeHVwcyBhbmQKLSAgIGltcG9ydHMgYXJlIGJvdGggb2J0YWluZWQgZnJvbSB0aGUgbGlzdCBvZiByZWxvY3MgYXR0YWNoZWQgdG8gZWFjaAotICAgc2VjdGlvbi4gIFRoZSBleHBvcnRzIGFuZCBkZWJ1Z2dpbmcgcmVjb3JkcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUKLSAgIGxpc3Qgb2Ygb3V0c3ltYm9scy4gICovCi0KLWJvb2xlYW4KLW5sbV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYm9vbGVhbiAoKndyaXRlX2ltcG9ydF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NfY291bnQsIGludGVybmFsX3JlbG9jX2NvdW50LCBpLCBjOwotICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqZXh0ZXJuYWxfcmVsb2NzOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIGZpbGVfcHRyIGxhc3Q7Ci0gIGJvb2xlYW4gKCp3cml0ZV9wcmVmaXhfZnVuYykgUEFSQU1TICgoYmZkICopKTsKLSAgdW5zaWduZWQgY2hhciAqZml4ZWRfaGVhZGVyID0gTlVMTDsKLQotICBmaXhlZF9oZWFkZXIgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJICBiZmRfbWFsbG9jICgoc2l6ZV90KSBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKSk7Ci0gIGlmIChmaXhlZF9oZWFkZXIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZQotICAgICAgJiYgbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSB2YXJpYWJsZSBsZW5ndGggaGVhZGVycy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkgICAgIG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSAoYWJmZCkgKyBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpID09IGZhbHNlCi0gICAgICB8fCBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQSB3ZWFrIGNoZWNrIG9uIHdoZXRoZXIgdGhlIHNlY3Rpb24gZmlsZSBwb3NpdGlvbnMgd2VyZQotICAgICByZWFzb25hYmxlLiAgKi8KLSAgaWYgKGJmZF90ZWxsIChhYmZkKSA+IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBBZHZhbmNlIHRvIHRoZSByZWxvY3MuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhlIHJlbG9jYXRpb24gZW50cmllcyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUKLSAgICAgcGFydGljdWxhciB0YXJnZXQuICBXZSB1c2UgYW4gZXh0ZXJuYWwgcm91dGluZSB0byB3cml0ZSB0aGUgcmVsb2MKLSAgICAgb3V0LiAgKi8KLSAgd3JpdGVfaW1wb3J0X2Z1bmMgPSBubG1fd3JpdGVfaW1wb3J0X2Z1bmMgKGFiZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBmaXh1cHMuICBXaGlsZSB3ZSdyZSBsb29waW5nCi0gICAgIG92ZXIgdGhlIHJlbG9jcywgd2UgYWxzbyBjb3VudCB0aGUgZXh0ZXJuYWwgcmVsb2NzLCB3aGljaCBpcwotICAgICBuZWVkZWQgd2hlbiB0aGV5IGFyZSB3cml0dGVuIG91dCBiZWxvdy4gICovCi0gIGludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgZXh0ZXJuYWxfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsX3B0cl9wdHIsICoqcmVsX2VuZDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgY2FuIG9ubHkgcmVwcmVzZW50IHJlbG9jcyB3aXRoaW4gYSBjb2RlIG9yIGRhdGEKLQkgc2VjdGlvbi4gIFdlIGlnbm9yZSB0aGVtIGZvciBhIGRlYnVnZ2luZyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgKFNFQ19DT0RFIHwgU0VDX0RBVEEpKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGtub3cgaG93IHRvIHdyaXRlIG91dCBpbXBvcnRzICovCi0gICAgICBpZiAod3JpdGVfaW1wb3J0X2Z1bmMgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247Ci0gICAgICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKLQl7Ci0JICBhcmVsZW50ICpyZWw7Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHJlbCA9ICpyZWxfcHRyX3B0cjsKLQkgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHsKLQkgICAgICArK2ludGVybmFsX3JlbG9jX2NvdW50OwotCSAgICAgIGlmICgoKndyaXRlX2ltcG9ydF9mdW5jKSAoYWJmZCwgc2VjLCByZWwpID09IGZhbHNlKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICArK2V4dGVybmFsX3JlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMgPSBpbnRlcm5hbF9yZWxvY19jb3VudDsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGltcG9ydHMgKHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMpLiAgVGhlc2UKLSAgICAgYXJlIG91dHB1dCBhcyBhIHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IGFsbCB0aGUgcmVsb2NzIGZvciB0aGF0Ci0gICAgIHN5bWJvbCwgc28gd2UgbXVzdCBmaXJzdCBnYXRoZXIgdG9nZXRoZXIgYWxsIHRoZSByZWxvY3MgYWdhaW5zdAotICAgICBleHRlcm5hbCBzeW1ib2xzIGFuZCBzb3J0IHRoZW0uICAqLwotICBleHRlcm5hbF9yZWxvY3MgPQotICAgIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCShleHRlcm5hbF9yZWxvY19jb3VudAotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCByZWxvY19hbmRfc2VjKSkpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpID0gMDsKLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7Ci0KLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbF9wdHJfcHRyID0gc2VjLT5vcmVsb2NhdGlvbjsKLSAgICAgIHJlbF9lbmQgPSByZWxfcHRyX3B0ciArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgcmVsX3B0cl9wdHIgPCByZWxfZW5kOyByZWxfcHRyX3B0cisrKQotCXsKLQkgIGFyZWxlbnQgKnJlbDsKLQkgIGFzeW1ib2wgKnN5bTsKLQotCSAgcmVsID0gKnJlbF9wdHJfcHRyOwotCSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGV4dGVybmFsX3JlbG9jc1tpXS5yZWwgPSByZWw7Ci0JICBleHRlcm5hbF9yZWxvY3NbaV0uc2VjID0gc2VjOwotCSAgKytpOwotCX0KLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaSA9PSBleHRlcm5hbF9yZWxvY19jb3VudCk7Ci0KLSAgLyogU29ydCB0aGUgZXh0ZXJuYWwgcmVsb2NzIGJ5IG5hbWUuICAqLwotICBxc29ydCAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCAoc2l6ZV90KSBleHRlcm5hbF9yZWxvY19jb3VudCwKLQkgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyksIG5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGMgPSAwOwotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBleHRlcm5hbF9yZWxvY19jb3VudCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBiZmRfc2l6ZV90eXBlIGosIGNudDsKLQotICAgICAgKytjOwotCi0gICAgICByZWwgPSBleHRlcm5hbF9yZWxvY3NbaV0ucmVsOwotICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgICAgIGNudCA9IDA7Ci0gICAgICBmb3IgKGogPSBpOwotCSAgIChqIDwgZXh0ZXJuYWxfcmVsb2NfY291bnQKLQkgICAgJiYgKmV4dGVybmFsX3JlbG9jc1tqXS5yZWwtPnN5bV9wdHJfcHRyID09IHN5bSk7Ci0JICAgaisrKQotCSsrY250OwotCi0gICAgICBpZiAoKCpubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyAoYWJmZCkpIChhYmZkLCBjbnQsIHN5bSwKLQkJCQkJICAgICAmZXh0ZXJuYWxfcmVsb2NzW2ldKQotCSAgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGkgKz0gY250OwotICAgIH0KLQotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgPSBjOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgcHVibGljIHN5bWJvbHMgKGV4cG9ydHMpLiAgKi8KLSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBpZiAoc3ltX3B0cl9wdHIgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSAoKmdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLSAgICAgIGJvb2xlYW4gKCp3cml0ZV9leHBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkX3ZtYSkpOwotCi0gICAgICBhc3ltYm9sICoqc3ltX2VuZDsKLQotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnB1YmxpY3NPZmZzZXQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gICAgICBnZXRfcHVibGljX29mZnNldF9mdW5jID0gbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgKGFiZmQpOwotICAgICAgd3JpdGVfZXhwb3J0X2Z1bmMgPSBubG1fd3JpdGVfZXhwb3J0X2Z1bmMgKGFiZmQpOwotICAgICAgYyA9IDA7Ci0gICAgICBzeW1fZW5kID0gc3ltX3B0cl9wdHIgKyBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgICAgIGZvciAoOyBzeW1fcHRyX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHJfcHRyKyspCi0JewotCSAgYXN5bWJvbCAqc3ltOwotCSAgYmZkX2J5dGUgbGVuOwotCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotCSAgc3ltID0gKnN5bV9wdHJfcHRyOwotCi0JICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpKSA9PSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBjb250aW51ZTsKLQotCSAgKytjOwotCi0JICBpZiAoZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykKLQkgICAgewotCSAgICAgIC8qIE1vc3QgYmFja2VuZHMgY2FuIHVzZSB0aGUgY29kZSBiZWxvdywgYnV0Ci0JCSB1bmZvcnR1bmF0ZWx5IHNvbWUgdXNlIGEgZGlmZmVyZW50IHNjaGVtZS4gICovCi0JICAgICAgb2Zmc2V0ID0gKCpnZXRfcHVibGljX29mZnNldF9mdW5jKSAoYWJmZCwgc3ltKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgc2VjID0gc3ltLT5zZWN0aW9uOwotCSAgICAgIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JCXsKLQkJICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0JCSAgb2Zmc2V0IHw9IE5MTV9ISUJJVDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+ZmxhZ3MgJiAoU0VDX0RBVEEgfCBTRUNfQUxMT0MpKQotCQl7Ci0JCSAgLyogU0VDX0FMTE9DIGlzIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkJICBvZmZzZXQgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBjYW4ndCBoYW5kbGUgYW4gZXhwb3J0ZWQgc3ltYm9sIHRoYXQgaXMgbm90IGluCi0JCSAgICAgdGhlIGNvZGUgb3IgZGF0YSBzZWdtZW50LiAgKi8KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHdyaXRlX2V4cG9ydF9mdW5jKQotCSAgICB7Ci0JICAgICAgaWYgKCgqd3JpdGVfZXhwb3J0X2Z1bmMpIChhYmZkLCBzeW0sIG9mZnNldCkgPT0gZmFsc2UpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0JICAgICAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQotCQkgICAhPSBzaXplb2YgKGJmZF9ieXRlKSkKLQkJICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcHV0X3dvcmQgKGFiZmQsIG9mZnNldCwgdGVtcCk7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZQdWJsaWNzID0gYzsKLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgcmVjb3Jkcy4gIFRoZSBOTE0gY29udmVyc2lvbiBwcm9ncmFtCi0JIHdhbnRzIHRvIGJlIGFibGUgdG8gaW5oaWJpdCB0aGlzLCBzbyBhcyBhIHNwZWNpYWwgaGFjayBpZgotCSBkZWJ1Z0luZm9PZmZzZXQgaXMgc2V0IHRvIC0xIHdlIGRvbid0IHdyaXRlIGFueSBkZWJ1Z2dpbmcKLQkgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBub3QgYmUgaGFuZGxlZCBieSBmaWRkbGluZyB3aXRoIHRoZQotCSBzeW1ib2wgdGFibGUsIGJlY2F1c2UgZXhwb3J0ZWQgc3ltYm9scyBhcHBlYXIgaW4gYm90aCB0aGUKLQkgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgYW5kIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPT0gKGZpbGVfcHRyKSAtIDEpCi0JewotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9IDA7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgYyA9IDA7Ci0JICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0JICBzeW1fZW5kID0gc3ltX3B0cl9wdHIgKyBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoOyBzeW1fcHRyX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHJfcHRyKyspCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICpzeW07Ci0JICAgICAgYmZkX2J5dGUgdHlwZSwgbGVuOwotCSAgICAgIGJmZF92bWEgb2Zmc2V0OwotCSAgICAgIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0JICAgICAgc3ltID0gKnN5bV9wdHJfcHRyOwotCi0JICAgICAgLyogVGhlIE5MTSBub3Rpb24gb2YgYSBkZWJ1Z2dpbmcgc3ltYm9sIGlzIGFjdHVhbGx5IHdoYXQKLQkJIEJGRCBjYWxscyBhIGxvY2FsIG9yIGdsb2JhbCBzeW1ib2wuICBXaGF0IEJGRCBjYWxscyBhCi0JCSBkZWJ1Z2dpbmcgc3ltYm9sIE5MTSBkb2VzIG5vdCB1bmRlcnN0YW5kIGF0IGFsbC4gICovCi0JICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKSkgPT0gMAotCQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMAotCQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkJY29udGludWU7Ci0KLQkgICAgICArK2M7Ci0KLQkgICAgICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0JICAgICAgaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJewotCQkgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLQkJICB0eXBlID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+ZmxhZ3MgJiAoU0VDX0RBVEEgfCBTRUNfQUxMT0MpKQotCQl7Ci0JCSAgLyogU0VDX0FMTE9DIGlzIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkJICBvZmZzZXQgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0JCSAgdHlwZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXR5cGUgPSAyOwotCi0JICAgICAgLyogVGhlIHR5cGUgaXMgMCBmb3IgZGF0YSwgMSBmb3IgY29kZSwgMiBmb3IgYWJzb2x1dGUuICAqLwotCSAgICAgIGlmIChiZmRfd3JpdGUgKCZ0eXBlLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKGJmZF9ieXRlKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBwdXRfd29yZCAoYWJmZCwgb2Zmc2V0LCB0ZW1wKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQkgICAgICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCi0JCSAgICE9IHNpemVvZiAoYmZkX2J5dGUpKQotCQkgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkRlYnVnUmVjb3JkcyA9IGM7Ci0JfQotICAgIH0KLQotICAvKiBOTE1MSU5LIGZpbGxzIGluIG9mZnNldCB2YWx1ZXMgZXZlbiBpZiB0aGVyZSBpcyBubyBkYXRhLCBzbyB3ZSBkbwotICAgICB0aGUgc2FtZS4gICovCi0gIGxhc3QgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jdXN0b21EYXRhT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnB1YmxpY3NPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cHVibGljc09mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9IGxhc3Q7Ci0KLSAgLyogQXQgdGhpcyBwb2ludCBldmVyeXRoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gb3V0IGV4Y2VwdCB0aGUgZml4ZWQKLSAgICAgaGVhZGVyLiAgKi8KLSAgbWVtY3B5IChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+c2lnbmF0dXJlLCBubG1fc2lnbmF0dXJlIChhYmZkKSwKLQkgIE5MTV9TSUdOQVRVUkVfU0laRSk7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT52ZXJzaW9uID0gTkxNX0hFQURFUl9WRVJTSU9OOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZVN0YXJ0T2Zmc2V0ID0KLSAgICAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKQotICAgICAtIG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpKTsKLQotICAvKiBXZSBoYXZlIG5vIGNvbnZlbmllbnQgd2F5IGZvciB0aGUgY2FsbGVyIHRvIHBhc3MgaW4gdGhlIGV4aXQKLSAgICAgcHJvY2VkdXJlIG9yIHRoZSBjaGVjayB1bmxvYWQgcHJvY2VkdXJlLCBzbyB0aGUgY2FsbGVyIG11c3Qgc2V0Ci0gICAgIHRoZSB2YWx1ZXMgaW4gdGhlIGhlYWRlciB0byB0aGUgdmFsdWVzIG9mIHRoZSBzeW1ib2xzLiAgKi8KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4aXRQcm9jZWR1cmVPZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQgIT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQgLT0KLSAgICAgIG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd3JpdGVfcHJlZml4X2Z1bmMgPSBubG1fd3JpdGVfcHJlZml4X2Z1bmMgKGFiZmQpOwotICBpZiAod3JpdGVfcHJlZml4X2Z1bmMpCi0gICAgewotICAgICAgaWYgKCgqd3JpdGVfcHJlZml4X2Z1bmMpIChhYmZkKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9zaXplX3R5cGUpIGJmZF90ZWxsIChhYmZkKQotCSAgICAgID09IG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSAoYWJmZCkpOwotCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQgKGFiZmQsIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLCBmaXhlZF9oZWFkZXIpOwotICBpZiAoYmZkX3dyaXRlIChmaXhlZF9oZWFkZXIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpCi0gICAgICAhPSBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChmaXhlZF9oZWFkZXIgIT0gTlVMTCkKLSAgICBmcmVlIChmaXhlZF9oZWFkZXIpOwotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAoZml4ZWRfaGVhZGVyICE9IE5VTEwpCi0gICAgZnJlZSAoZml4ZWRfaGVhZGVyKTsKLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25sbXN3YXAuaCBiL2JmZC9ubG1zd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWNlNzIuLjAwMDAwMDAKLS0tIGEvYmZkL25sbXN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzd2FwcGluZyByb3V0aW5lcyBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCB1c2luZyBFTEYgc3VwcG9ydCBhcyB0aGUKLSAgIHRlbXBsYXRlLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFsdGhvdWdoIHRoaXMgaXMgYSBoZWFkZXIgZmlsZSwgaXQgZGVmaW5lcyBmdW5jdGlvbnMuICBJdCBpcwotICAgaW5jbHVkZWQgYnkgTkxNIGJhY2tlbmRzIHRvIGRlZmluZSBzd2FwcGluZyBmdW5jdGlvbnMgdGhhdCB2YXJ5Ci0gICBmcm9tIG9uZSBOTE0gdG8gYW5vdGhlci4gIFRoZSBiYWNrZW5kIGNvZGUgbXVzdCBhcnJhbmdlIGZvcgotICAgTmxtX0V4dGVybmFsX3h4eHggdG8gYmUgZGVmaW5lZCBhcHByb3ByaWF0ZWx5LCBhbmQgY2FuIHRoZW4gaW5jbHVkZQotICAgdGhpcyBmaWxlIHRvIGdldCB0aGUgc3dhcHBpbmcgcm91dGluZXMuCi0KLSAgIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3Igb25lIHN0cnVjdHVyZSwgdGhlIGZpeGVkIE5MTQotICAgZmlsZSBoZWFkZXIuICAqLwotCi1zdGF0aWMgdm9pZCBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJICAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqKSk7Ci1zdGF0aWMgdm9pZCBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci0KLS8qIFRyYW5zbGF0ZSBhbiBOTE0gZml4ZWQgbGVuZ3RoIGZpbGUgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuIE5MTQotICAgZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIChhYmZkLCByZWFsc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHJlYWxzcmM7Ci0gICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmRzdDsKLXsKLSAgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqc3JjID0gKE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKikgcmVhbHNyYzsKLSAgbWVtY3B5IChkc3QtPnNpZ25hdHVyZSwgc3JjLT5zaWduYXR1cmUsIE5MTV9TSUdOQVRVUkVfU0laRSk7Ci0gIG1lbWNweSAoZHN0LT5tb2R1bGVOYW1lLCBzcmMtPm1vZHVsZU5hbWUsIE5MTV9NT0RVTEVfTkFNRV9TSVpFKTsKLSAgZHN0LT52ZXJzaW9uID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnZlcnNpb24pOwotICBkc3QtPmNvZGVJbWFnZU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlSW1hZ2VPZmZzZXQpOwotICBkc3QtPmNvZGVJbWFnZVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZUltYWdlU2l6ZSk7Ci0gIGRzdC0+ZGF0YUltYWdlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRhdGFJbWFnZU9mZnNldCk7Ci0gIGRzdC0+ZGF0YUltYWdlU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kYXRhSW1hZ2VTaXplKTsKLSAgZHN0LT51bmluaXRpYWxpemVkRGF0YVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+dW5pbml0aWFsaXplZERhdGFTaXplKTsKLSAgZHN0LT5jdXN0b21EYXRhT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmN1c3RvbURhdGFPZmZzZXQpOwotICBkc3QtPmN1c3RvbURhdGFTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmN1c3RvbURhdGFTaXplKTsKLSAgZHN0LT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQpOwotICBkc3QtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzKTsKLSAgZHN0LT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzKTsKLSAgZHN0LT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7Ci0gIGRzdC0+cHVibGljc09mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wdWJsaWNzT2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZlB1YmxpY3MgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZQdWJsaWNzKTsKLSAgZHN0LT5kZWJ1Z0luZm9PZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGVidWdJbmZvT2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZkRlYnVnUmVjb3JkcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZkRlYnVnUmVjb3Jkcyk7Ci0gIGRzdC0+Y29kZVN0YXJ0T2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVTdGFydE9mZnNldCk7Ci0gIGRzdC0+ZXhpdFByb2NlZHVyZU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5leGl0UHJvY2VkdXJlT2Zmc2V0KTsKLSAgZHN0LT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCk7Ci0gIGRzdC0+bW9kdWxlVHlwZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5tb2R1bGVUeXBlKTsKLSAgZHN0LT5mbGFncyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5mbGFncyk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBOTE0gZml4ZWQgbGVuZ3RoIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvCi0gICBhbiBOTE0gZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCAoYWJmZCwgc3JjLCByZWFsZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKnNyYzsKLSAgICAgUFRSIHJlYWxkc3Q7Ci17Ci0gIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKmRzdCA9IChObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICopIHJlYWxkc3Q7Ci0gIG1lbXNldCAoZHN0LCAwLCBzaXplb2YgKmRzdCk7Ci0gIG1lbWNweSAoZHN0LT5zaWduYXR1cmUsIHNyYy0+c2lnbmF0dXJlLCBOTE1fU0lHTkFUVVJFX1NJWkUpOwotICBtZW1jcHkgKGRzdC0+bW9kdWxlTmFtZSwgc3JjLT5tb2R1bGVOYW1lLCBOTE1fTU9EVUxFX05BTUVfU0laRSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+dmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGRzdC0+dmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZUltYWdlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlSW1hZ2VPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVJbWFnZVNpemUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVJbWFnZVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRhdGFJbWFnZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZGF0YUltYWdlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kYXRhSW1hZ2VTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT5kYXRhSW1hZ2VTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT51bmluaXRpYWxpemVkRGF0YVNpemUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y3VzdG9tRGF0YU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y3VzdG9tRGF0YU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y3VzdG9tRGF0YVNpemUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmN1c3RvbURhdGFTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+cHVibGljc09mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+cHVibGljc09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZQdWJsaWNzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZlB1YmxpY3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRlYnVnSW5mb09mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZGVidWdJbmZvT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZkRlYnVnUmVjb3JkcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVTdGFydE9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y29kZVN0YXJ0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5leGl0UHJvY2VkdXJlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5leGl0UHJvY2VkdXJlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm1vZHVsZVR5cGUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm1vZHVsZVR5cGUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmZsYWdzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5mbGFncyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvbnMzMmsuaCBiL2JmZC9uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNiYTA5Li4wMDAwMDAwCi0tLSBhL2JmZC9uczMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogSGVhZGVyIGZpbGUgZm9yIG5zMzJrIHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqLAotCSAgIGxvbmcgKCopIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKSwKLQkgICBpbnQgKCopIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKSkpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLQotZXh0ZXJuIGxvbmcgX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBsb25nIF9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gaW50IF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gaW50IF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19yZWxvY19kaXNwCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jX2ltbQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKZGlmZiAtLWdpdCBhL2JmZC9uczMya25ldGJzZC5jIGIvYmZkL25zMzJrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMjM1NmQuLjAwMDAwMDAKLS0tIGEvYmZkL25zMzJrbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9uczMyayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQk0MDk2Ci0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX25zMzJrCi0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzUzMl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKHBjNTMybmV0YnNkXyxPUCkKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQotCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1uczMyay1uZXRic2QiCi0KLSNkZWZpbmUgbnMzMmthb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLS8qIFdlIGNhbmB0IHVzZSB0aGUgTVlOUyBtYWNybyBoZXJlIGZvciBjcHAgcmVhc29ucyB0b28gc3VidGxlCi0gKiBmb3IgbWUgLS0gSVdECi0gKi8KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG5zMzJrYW91dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImJmZC5oIgkJLyogVG8gZW5zdXJlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpcyBPSyAqLwotCi1DT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLU1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL29hc3lzLmMgYi9iZmQvb2FzeXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MDUzYi4uMDAwMDAwMAotLS0gYS9iZmQvb2FzeXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvYXN5cyBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVU5ERVJTQ09SRV9IQUNLIDEKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9hc3lzLmgiCi0jaW5jbHVkZSAibGlib2FzeXMuaCIKLQotLyogWFhYIC0gRklYTUUuICBvZmZzZXRvZiBiZWxvbmdzIGluIHRoZSBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgaW4KLSAgIC4uL2luY2x1ZGUvc3lzLiAqLwotLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQgKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotI2RlZmluZSBvZmZzZXRvZih0eXBlLCBpZGVudGlmaWVyKSAoc2l6ZV90KSAmKCgodHlwZSAqKSAwKS0+aWRlbnRpZmllcikKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBvYXN5c19yZWFkX3JlY29yZCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBvYXN5c19yZWNvcmRfZW51bV90eXBlLAotCQkJCQkgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqLAotCQkJCQkgICBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfZW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1QUk9UTyAoc3RhdGljIGJvb2xlYW4sIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSwgKGJmZCAqIENPTlNUIGFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCByZWNvcmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLXsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWNvcmQsIDEsIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoc2l6ZV90KSByZWNvcmQtPmhlYWRlci5sZW5ndGggPD0gKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgKCgoY2hhciAqKSByZWNvcmQpICsgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpLAotCQkxLCByZWNvcmQtPmhlYWRlci5sZW5ndGggLSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSwKLQkJYWJmZCkKLSAgICAgICE9IHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1zdGF0aWMgc2l6ZV90Ci1vYXN5c19zdHJpbmdfbGVuZ3RoIChyZWNvcmQpCi0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci17Ci0gIHJldHVybiByZWNvcmQtPmhlYWRlci5sZW5ndGgKLSAgICAtICgoY2hhciAqKSByZWNvcmQtPnN5bWJvbC5uYW1lIC0gKGNoYXIgKikgcmVjb3JkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotCi1TbHVycCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHJlYWRpbmcgaW4gYWxsIHRoZSByZWNvcmRzIGF0IHRoZSBzdGFydCBmaWxlCi10aWxsIHdlIGdldCB0byB0aGUgZmlyc3Qgc2VjdGlvbiByZWNvcmQuCi0KLVdlJ2xsIHNvcnQgdGhlIHN5bWJvbHNzIGludG8gIHR3byBsaXN0cywgZGVmaW5lZCBhbmQgdW5kZWZpbmVkLiBUaGUKLXVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIHRhYmxlIGFjY29yZGluZyB0byB0aGVpcgotcmVmbm8uCi0KLVdlIGRvIHRoaXMgYnkgcGxhY2luZyBhbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGZyb250IG9mIHRoZSB0YWJsZQotbW92aW5nIGluLCBhbmQgdGhlIGRlZmluZWQgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBtb3ZpbmcgYmFjay4KLQotKi8KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqZGF0YSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBhc3ltYm9sICpkZXN0X2RlZmluZWQ7Ci0gIGFzeW1ib2wgKmRlc3Q7Ci0gIGNoYXIgKnN0cmluZ19wdHI7Ci0KLQotICBpZiAoZGF0YS0+c3ltYm9scyAhPSAoYXN5bWJvbCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgLyogQnV5IGVub3VnaCBtZW1vcnkgZm9yIGFsbCB0aGUgc3ltYm9scyBhbmQgYWxsIHRoZSBuYW1lcyAqLwotICBkYXRhLT5zeW1ib2xzID0KLSAgICAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkgKiBhYmZkLT5zeW1jb3VudCk7Ci0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0gIC8qIGJ1eSAxIG1vcmUgY2hhciBmb3IgZWFjaCBzeW1ib2wgdG8ga2VlcCB0aGUgdW5kZXJzY29yZSBpbiovCi0gIGRhdGEtPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIGRhdGEtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICsKLQkJCSAgICAgYWJmZC0+c3ltY291bnQpOwotI2Vsc2UKLSAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGgpOwotI2VuZGlmCi0gIGlmICghZGF0YS0+c3ltYm9scyB8fCAhZGF0YS0+c3RyaW5ncykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZGVzdF9kZWZpbmVkID0gZGF0YS0+c3ltYm9scyArIGFiZmQtPnN5bWNvdW50IC0gMTsKLQotICBzdHJpbmdfcHRyID0gZGF0YS0+c3RyaW5nczsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotCi0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQkgIHsKLQkgICAgaW50IGZsYWcgPSByZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPwotCSAgICAoQlNGX0xPQ0FMKSA6IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0KLQotCSAgICBzaXplX3QgbGVuZ3RoID0gb2FzeXNfc3RyaW5nX2xlbmd0aCAoJnJlY29yZCk7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnN5bWJvbC5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JICAgICAgewotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJZGVzdC0+ZmxhZ3MgPSAwOwotCi0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0KLQkJICBPQVNZU19EQVRBIChhYmZkKS0+c2VjdGlvbnNbcmVjb3JkLnN5bWJvbC5yZWxiICYKLQkJCQkJICAgICAgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCQlpZiAocmVjb3JkLmhlYWRlci50eXBlID09IChpbnQpIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtKQotCQkgIHsKLQkJICAgIGRlc3QtPmZsYWdzID0gQlNGX0xPQ0FMOwotCQkgICAgaWYgKGRlc3QtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopICh+MCkpCi0JCSAgICAgIHsKLQkJCS8qIEl0IHNlZW1zIHRoYXQgc29tZXRpbWVzIGludGVybmFsIHN5bWJvbHMgYXJlIHRpZWQgdXAsIGJ1dAotCQkgICAgICAgc3RpbGwgZ2V0IG91dHB1dCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8KLQkJICAgICAgIHNlY3Rpb24gKi8KLQkJCWRlc3QtPnNlY3Rpb24gPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCi0JCSAgICBkZXN0LT5mbGFncyA9IGZsYWc7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JCWRlc3QgPSBkYXRhLT5zeW1ib2xzICsgYmZkX2hfZ2V0XzE2IChhYmZkLCByZWNvcmQuc3ltYm9sLnJlZm5vKTsKLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkJZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlCRkRfQVNTRVJUICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkgICAgZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0JICAgIGRlc3QtPnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgICBkZXN0LT52YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnN5bWJvbC52YWx1ZSk7Ci0KLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLQkgICAgaWYgKHJlY29yZC5zeW1ib2wubmFtZVswXSAhPSAnXycpCi0JICAgICAgewotCQlzdHJpbmdfcHRyWzBdID0gJ18nOwotCQlzdHJpbmdfcHRyKys7Ci0JICAgICAgfQotI2VuZGlmCi0JICAgIG1lbWNweSAoc3RyaW5nX3B0ciwgcmVjb3JkLnN5bWJvbC5uYW1lLCBsZW5ndGgpOwotCi0KLQkgICAgc3RyaW5nX3B0cltsZW5ndGhdID0gMDsKLQkgICAgc3RyaW5nX3B0ciArPSBsZW5ndGggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAob2FzeXNfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjOwotCi1sb25nCi1vYXN5c19nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGFzeW1ib2wgKnN5bWJhc2U7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBpZiAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBzeW1iYXNlID0gT0FTWVNfREFUQSAoYWJmZCktPnN5bWJvbHM7Ci0gIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBhYmZkLT5zeW1jb3VudDsgY291bnRlcisrKQotICAgIHsKLSAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7Ci0gICAgfQotICAqbG9jYXRpb24gPSAwOwotICByZXR1cm4gYWJmZC0+c3ltY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb2FzeXNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBvYXN5c19leHRhcmNoaXZlX2hlYWRlcl90eXBlIGhlYWRlcl9leHQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBmaWxlcG9zOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBmYWxzZSkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSAmIGhlYWRlcl9leHQsIDEsIHNpemVvZiAoaGVhZGVyX2V4dCksIGFiZmQpCi0JICAhPSBzaXplb2YgKGhlYWRlcl9leHQpKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaGVhZGVyLnZlcnNpb24gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQudmVyc2lvbik7Ci0gIGhlYWRlci5tb2RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX2NvdW50KTsKLSAgaGVhZGVyLm1vZF90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0Lm1vZF90Ymxfb2Zmc2V0KTsKLSAgaGVhZGVyLnN5bV90Ymxfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX3NpemUpOwotICBoZWFkZXIuc3ltX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV9jb3VudCk7Ci0gIGhlYWRlci5zeW1fdGJsX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX29mZnNldCk7Ci0gIGhlYWRlci54cmVmX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfY291bnQpOwotICBoZWFkZXIueHJlZl9sc3Rfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfbHN0X29mZnNldCk7Ci0KLSAgLyoKLSAgICBUaGVyZSBpc24ndCBhIG1hZ2ljIG51bWJlciBpbiBhbiBPYXN5cyBhcmNoaXZlLCBzbyB0aGUgYmVzdCB3ZQotICAgIGNhbiBkbyB0byB2ZXJpZnkgcmVhc25hYmxlbmVzcyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGluCi0gICAgdGhlIGhlYWRlciBhcmUgdG9vIHdlaXJkCi0gICAgKi8KLQotICBpZiAoaGVhZGVyLnZlcnNpb24gPiAxMDAwMCB8fAotICAgICAgaGVhZGVyLm1vZF9jb3VudCA+IDEwMDAwIHx8Ci0gICAgICBoZWFkZXIuc3ltX2NvdW50ID4gMTAwMDAwIHx8Ci0gICAgICBoZWFkZXIueHJlZl9jb3VudCA+IDEwMDAwMCkKLSAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLQotICAvKgotICAgIFRoYXQgYWxsIHdvcmtlZCwgbGV0J3MgYnV5IHRoZSBzcGFjZSBmb3IgdGhlIGhlYWRlciBhbmQgcmVhZCBpbgotICAgIHRoZSBoZWFkZXJzLgotICAgICovCi0gIHsKLSAgICBvYXN5c19hcl9kYXRhX3R5cGUgKmFyID0KLSAgICAob2FzeXNfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19hcl9kYXRhX3R5cGUpKTsKLQotICAgIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZHVsZSA9Ci0gICAgKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSkgKiBoZWFkZXIubW9kX2NvdW50KTsKLSAgICBvYXN5c19tb2R1bGVfdGFibGVfdHlwZSByZWNvcmQ7Ci0KLSAgICBpZiAoIWFyIHx8ICFtb2R1bGUpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGFiZmQtPnRkYXRhLm9hc3lzX2FyX2RhdGEgPSBhcjsKLSAgICBhci0+bW9kdWxlID0gbW9kdWxlOwotICAgIGFyLT5tb2R1bGVfY291bnQgPSBoZWFkZXIubW9kX2NvdW50OwotCi0gICAgZmlsZXBvcyA9IGhlYWRlci5tb2RfdGJsX29mZnNldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLm1vZF9jb3VudDsgaSsrKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQotCS8qIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCi0JaWYgKDApCi0JICB7Ci0JICAgIG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZSByZWNvcmRfZXh0OwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgcmVjb3JkX2V4dCwgMSwgc2l6ZW9mIChyZWNvcmRfZXh0KSwgYWJmZCkKLQkJIT0gc2l6ZW9mIChyZWNvcmRfZXh0KSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICByZWNvcmQubW9kX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX3NpemUpOwotCSAgICByZWNvcmQuZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZmlsZV9vZmZzZXQpOwotCi0JICAgIHJlY29yZC5kZXBfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwX2NvdW50KTsKLQkgICAgcmVjb3JkLmRlcGVlX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcGVlX2NvdW50KTsKLQkgICAgcmVjb3JkLnNlY3RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuc2VjdF9jb3VudCk7Ci0KLQkgICAgbW9kdWxlW2ldLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIDMzKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICBtZW1jcHkgKG1vZHVsZVtpXS5uYW1lLCByZWNvcmRfZXh0Lm1vZF9uYW1lLCAzMyk7Ci0JICAgIGZpbGVwb3MgKz0KLQkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKLQkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLmRlcGVlX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLnNlY3RfY291bnQgKiA4ICsgMTg3OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYl90eXBlIHJlY29yZF9leHQ7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQotCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7Ci0JICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7Ci0KLQkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOwotCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOwotCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKLQkgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX25hbWVfbGVuZ3RoKTsKLQotCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBtb2R1bGVbaV0ubmFtZSwgMSwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUsCi0JCQkgIGFiZmQpCi0JCSE9IHJlY29yZC5tb2R1bGVfbmFtZV9zaXplKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBtb2R1bGVbaV0ubmFtZVtyZWNvcmQubW9kdWxlX25hbWVfc2l6ZV0gPSAwOwotCSAgICBmaWxlcG9zICs9Ci0JICAgICAgc2l6ZW9mIChyZWNvcmRfZXh0KSArCi0JICAgICAgcmVjb3JkLmRlcF9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplICsgMTsKLQotCSAgfQotCi0KLQltb2R1bGVbaV0uc2l6ZSA9IHJlY29yZC5tb2Rfc2l6ZTsKLQltb2R1bGVbaV0ucG9zID0gcmVjb3JkLmZpbGVfb2Zmc2V0OwotCW1vZHVsZVtpXS5hYmZkID0gMDsKLSAgICAgIH0KLQotICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IChvYXN5c19kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLSNkZWZpbmUgTUFYX1NFQ1MgMTYKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9hc3lzX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2RhdGFfdHlwZSAqb2FzeXM7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqc2F2ZSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBib29sZWFuIGhhZF91c2VmdWxsID0gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSAwOwotICBvYXN5c19ta29iamVjdCAoYWJmZCk7Ci0gIG9hc3lzID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIG1lbXNldCAoKFBUUikgb2FzeXMtPnNlY3Rpb25zLCAweGZmLCBzaXplb2YgKG9hc3lzLT5zZWN0aW9ucykpOwotCi0gIC8qIFBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggPSAwOwotICAvKiBJbnNwZWN0IHRoZSByZWNvcmRzLCBidXQgb25seSBrZWVwIHRoZSBzZWN0aW9uIGluZm8gLQotICAgICByZW1lbWJlciB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9scwotICAgICAqLwotICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSAwOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JZ290byBmYWlsOwotICAgICAgaWYgKChzaXplX3QpIHJlY29yZC5oZWFkZXIubGVuZ3RoIDwgKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQuaGVhZGVyKSkKLQlnb3RvIGZhaWw7Ci0KLQotICAgICAgc3dpdGNoICgob2FzeXNfcmVjb3JkX2VudW1fdHlwZSkgKHJlY29yZC5oZWFkZXIudHlwZSkpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQkgIC8qIENvdW50IHN5bWJvbHMgYW5kIHJlbWVtYmVyIHRoZWlyIHNpemUgZm9yIGEgZnV0dXJlIG1hbGxvYyAgICovCi0JICBhYmZkLT5zeW1jb3VudCsrOwotCSAgb2FzeXMtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICs9IDEgKyBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKLQkgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bToKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIGNoYXIgKmJ1ZmZlcjsKLQkgICAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZiAocmVjb3JkLnNlY3Rpb24uaGVhZGVyLmxlbmd0aCAhPSBzaXplb2YgKHJlY29yZC5zZWN0aW9uKSkKLQkgICAgICB7Ci0JCWdvdG8gZmFpbDsKLQkgICAgICB9Ci0JICAgIGJ1ZmZlciA9IGJmZF9hbGxvYyAoYWJmZCwgMyk7Ci0JICAgIGlmICghYnVmZmVyKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgc2VjdGlvbl9udW1iZXIgPSByZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9TRUNUX0JJVFM7Ci0JICAgIHNwcmludGYgKGJ1ZmZlciwgIiV1Iiwgc2VjdGlvbl9udW1iZXIpOwotCSAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgYnVmZmVyKTsKLQkgICAgb2FzeXMtPnNlY3Rpb25zW3NlY3Rpb25fbnVtYmVyXSA9IHM7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnNlY3Rpb24ucmVsYiAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQlCRkRfRkFJTCAoKTsKLQkgICAgICB9Ci0KLQkgICAgcy0+X3Jhd19zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52YWx1ZSk7Ci0JICAgIHMtPnZtYSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnNlY3Rpb24udm1hKTsKLQkgICAgcy0+ZmxhZ3MgPSAwOwotCSAgICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW06Ci0JICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCkgLSByZWNvcmQuaGVhZGVyLmxlbmd0aDsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kZWJ1Z19lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX25hbWVkX3NlY3Rpb25fZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bToKLQkgIGlmIChoYWRfdXNlZnVsbCA9PSBmYWxzZSkKLQkgICAgZ290byBmYWlsOwotCSAgbG9vcCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotICBvYXN5cy0+c3ltYm9scyA9IChhc3ltYm9sICopIE5VTEw7Ci0gIC8qCi0gICAgT2FzeXMgc3VwcG9ydCBzZXZlcmFsIGFyY2hpdGVjdHVyZXMsIGJ1dCBJIGNhbid0IHNlZSBhIHNpbXBsZSB3YXkKLSAgICB0byBkaXNjb3ZlciB3aGljaCBvbmUgaXMgaW4gYSBwYXJ0aWN1bGFyIGZpbGUgLSB3ZSdsbCBndWVzcwotICAgICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX202OGssIDApOwotICBpZiAoYWJmZC0+c3ltY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLSAgICB9Ci0KLSAgLyoKLSAgICBXZSBkb24ndCBrbm93IGlmIGEgc2VjdGlvbiBoYXMgZGF0YSB1bnRpbCB3ZSd2ZSByZWFkIGl0Li4KLSAgICAqLwotCi0gIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotZmFpbDoKLSAgKHZvaWQpIGJmZF9yZWxlYXNlIChhYmZkLCBvYXN5cyk7Ci0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gc2F2ZTsKLSAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9hc3lzX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmICghc3ltYm9sLT5zZWN0aW9uKQotICAgIHJldC0+dHlwZSA9IChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKSA/ICdhJyA6ICdBJzsKLX0KLQotc3RhdGljIHZvaWQKLW9hc3lzX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCA/Ci0JKENPTlNUIGNoYXIgKikgIiphYnMiIDogc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotLyoKLSBUaGUgaG93dG8gdGFibGUgaXMgYnVpbGQgdXNpbmcgdGhlIHRvcCB0d28gYml0cyBvZiBhIHJlbG9jIGJ5dGUgdG8KLSBpbmRleCBpbnRvIGl0LiBUaGUgYml0cyBhcmUgUENSRUwsV09SRC9MT05HCi0qLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0KLSAgSE9XVE8gKDAsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDAsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDAsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJwY3JlbDE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgb2FzeXNfZGF0YV90eXBlICpkYXRhID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0KLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcGVyOwotCi0gIGFzZWN0aW9uICpzOwotCi0gIC8qIFNlZSBpZiB0aGUgZGF0YSBoYXMgYmVlbiBzbHVycGVkIGFscmVhZHkgLi4gKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzKTsKLSAgICAgIGlmIChwZXItPmluaXRpYWxpemVkID09IHRydWUpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChkYXRhLT5maXJzdF9kYXRhX3JlY29yZCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZGF0YS0+Zmlyc3RfZGF0YV9yZWNvcmQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAocmVjb3JkLmhlYWRlci50eXBlKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bToKLQkgIHsKLQotCSAgICBiZmRfYnl0ZSAqc3JjID0gcmVjb3JkLmRhdGEuZGF0YTsKLQkgICAgYmZkX2J5dGUgKmVuZF9zcmMgPSAoKGJmZF9ieXRlICopICYgcmVjb3JkKSArIHJlY29yZC5oZWFkZXIubGVuZ3RoOwotCSAgICBiZmRfYnl0ZSAqZHN0X3B0cjsKLQkgICAgYmZkX2J5dGUgKmRzdF9iYXNlX3B0cjsKLQkgICAgdW5zaWduZWQgaW50IHJlbGJpdDsKLQkgICAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbiA9Ci0JICAgIGRhdGEtPnNlY3Rpb25zW3JlY29yZC5kYXRhLnJlbGIgJiBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0JICAgIGJmZF92bWEgZHN0X29mZnNldDsKLQotCSAgICBwZXIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbik7Ci0KLQkgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0JICAgICAgewotCQlwZXItPmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJaWYgKCFwZXItPmRhdGEpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlwZXItPnJlbG9jX3RhaWxfcHRyID0gKG9hc3lzX3JlbG9jX3R5cGUgKiopICYgKHNlY3Rpb24tPnJlbG9jYXRpb24pOwotCQlwZXItPmhhZF92bWEgPSBmYWxzZTsKLQkJcGVyLT5pbml0aWFsaXplZCA9IHRydWU7Ci0JCXNlY3Rpb24tPnJlbG9jX2NvdW50ID0gMDsKLQkJc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5kYXRhLmFkZHIpOwotCSAgICBpZiAocGVyLT5oYWRfdm1hID09IGZhbHNlKQotCSAgICAgIHsKLQkJLyogVGFrZSB0aGUgZmlyc3Qgdm1hIHdlIHNlZSBhcyB0aGUgYmFzZSAqLwotCQlzZWN0aW9uLT52bWEgPSBkc3Rfb2Zmc2V0OwotCQlwZXItPmhhZF92bWEgPSB0cnVlOwotCSAgICAgIH0KLQotCSAgICBkc3Rfb2Zmc2V0IC09IHNlY3Rpb24tPnZtYTsKLQotCSAgICBkc3RfYmFzZV9wdHIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGE7Ci0JICAgIGRzdF9wdHIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgKwotCSAgICAgIGRzdF9vZmZzZXQ7Ci0KLQkgICAgaWYgKHNyYyA8IGVuZF9zcmMpCi0JICAgICAgewotCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgICAgfQotCSAgICB3aGlsZSAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGNoYXIgbW9kX2J5dGUgPSAqc3JjKys7Ci0JCXNpemVfdCBnYXAgPSBlbmRfc3JjIC0gc3JjOwotCi0JCWNvdW50ID0gODsKLQkJaWYgKG1vZF9ieXRlID09IDAgJiYgZ2FwID49IDgpCi0JCSAgewotCQkgICAgZHN0X3B0clswXSA9IHNyY1swXTsKLQkJICAgIGRzdF9wdHJbMV0gPSBzcmNbMV07Ci0JCSAgICBkc3RfcHRyWzJdID0gc3JjWzJdOwotCQkgICAgZHN0X3B0clszXSA9IHNyY1szXTsKLQkJICAgIGRzdF9wdHJbNF0gPSBzcmNbNF07Ci0JCSAgICBkc3RfcHRyWzVdID0gc3JjWzVdOwotCQkgICAgZHN0X3B0cls2XSA9IHNyY1s2XTsKLQkJICAgIGRzdF9wdHJbN10gPSBzcmNbN107Ci0JCSAgICBkc3RfcHRyICs9IDg7Ci0JCSAgICBzcmMgKz0gODsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmb3IgKHJlbGJpdCA9IDE7IGNvdW50LS0gIT0gMCAmJiBzcmMgPCBlbmRfc3JjOyByZWxiaXQgPDw9IDEpCi0JCSAgICAgIHsKLQkJCWlmIChyZWxiaXQgJiBtb2RfYnl0ZSkKLQkJCSAgewotCQkJICAgIHVuc2lnbmVkIGNoYXIgcmVsb2MgPSAqc3JjOwotCQkJICAgIC8qIFRoaXMgaXRlbSBuZWVkcyB0byBiZSByZWxvY2F0ZWQgKi8KLQkJCSAgICBzd2l0Y2ggKHJlbG9jICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0KLQkJCQlicmVhazsKLQotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQkJCXsKLQkJCQkgIC8qIFJlbG9jYXRlIHRoZSBpdGVtIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uICovCi0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgKi8KLQkJCQkgIHItPnN5bWJvbCA9IDA7Ci0JCQkJICAvKiBXb3JrIG91dCB0aGUgaG93dG8gKi8KLQkJCQkgIGFib3J0ICgpOwotI2lmIDAKLQkJCQkgIHItPnJlbGVudC5zZWN0aW9uID0KLQkJCQkgICAgZGF0YS0+c2VjdGlvbnNbcmVsb2MgJgotCQkJCQkJICAgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCi0JCQkJICByLT5yZWxlbnQuYWRkZW5kID0gLQotCQkJCSAgICByLT5yZWxlbnQuc2VjdGlvbi0+dm1hOwotI2VuZGlmCi0JCQkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICByLT5yZWxlbnQuaG93dG8gPSAmaG93dG9fdGFibGVbcmVsb2MgPj4gNl07Ci0JCQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQkJCQkgIHNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0KLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCQkJCX0KLQkJCQlicmVhazsKLQotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JCQkJewotCQkJCSAgb2FzeXNfcmVsb2NfdHlwZSAqciA9Ci0JCQkJICAob2FzeXNfcmVsb2NfdHlwZSAqKQotCQkJCSAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgIHNpemVvZiAob2FzeXNfcmVsb2NfdHlwZSkpOwotCQkJCSAgaWYgKCFyKQotCQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkJICAqKHBlci0+cmVsb2NfdGFpbF9wdHIpID0gcjsKLQkJCQkgIHBlci0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKLQkJCQkgIHItPm5leHQgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMOwotCQkJCSAgLyogUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBzeW1ib2wgKi8KLQkJCQkgIHNyYysrOwotCQkJCSAgLyogR2V0IHN5bWJvbCBudW1iZXIgKi8KLQkJCQkgIHItPnN5bWJvbCA9IChzcmNbMF0gPDwgOCkgfCBzcmNbMV07Ci0JCQkJICAvKiBXb3JrIG91dCB0aGUgaG93dG8gKi8KLQkJCQkgIGFib3J0ICgpOwotCi0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPSAoYXNlY3Rpb24KLQkJCQkJCSAgICAgICAqKSBOVUxMOwotI2VuZGlmCi0JCQkJICByLT5yZWxlbnQuYWRkZW5kID0gMDsKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgc3JjICs9IDI7Ci0JCQkJICAvKiBGYWtlIHVwIHRoZSBkYXRhIHRvIGxvb2sgbGlrZSBpdCdzIGdvdCB0aGUgLXZlIHBjIGluIGl0LCB0aGlzIG1ha2VzCi0JCQkJICAgICAgIGl0IG11Y2ggZWFzaWVyIHRvIGNvbnZlcnQgaW50byBvdGhlciBmb3JtYXRzLiBUaGlzIGlzIGRvbmUgYnkKLQkJCQkgICAgICAgaGl0dGluZyB0aGUgYWRkZW5kLgotCQkJCSAgICAgICAqLwotCQkJCSAgaWYgKHItPnJlbGVudC5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLQkJCQkgICAgewotCQkJCSAgICAgIHItPnJlbGVudC5hZGRlbmQgLT0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgICAgfQotCi0KLQotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJKmRzdF9wdHIrKyA9ICpzcmMrKzsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bToKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBsb29wID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgbmV3c2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbmV3c2VjdDsKLXsKLSAgbmV3c2VjdC0+dXNlZF9ieV9iZmQgPSAoUFRSKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19wZXJfc2VjdGlvbl90eXBlKSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPmRhdGEgPSAoYmZkX2J5dGUgKikgTlVMTDsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5zZWN0aW9uID0gbmV3c2VjdDsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5vZmZzZXQgPSAwOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPmluaXRpYWxpemVkID0gZmFsc2U7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IDE7Ci0gIC8qIFR1cm4gdGhlIHNlY3Rpb24gc3RyaW5nIGludG8gYW4gaW5kZXggKi8KLQotICBzc2NhbmYgKG5ld3NlY3QtPm5hbWUsICIldSIsICZuZXdzZWN0LT50YXJnZXRfaW5kZXgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBsb25nCi1vYXN5c19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmICghIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLSAgaWYgKHAtPmluaXRpYWxpemVkID09IGZhbHNlKQotICAgIHsKLSAgICAgICh2b2lkKSBtZW1zZXQgKGxvY2F0aW9uLCAwLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKHZvaWQpIG1lbWNweSAobG9jYXRpb24sIChQVFIpIChwLT5kYXRhICsgb2Zmc2V0KSwgKGludCkgY291bnQpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotbG9uZwotb2FzeXNfY2Fub25pY2FsaXplX3JlbG9jIChpZ25vcmVfYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgaW50IHJlbG9jX2NvdW50ID0gMDsKLSAgb2FzeXNfcmVsb2NfdHlwZSAqc3JjID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgKHNlY3Rpb24tPnJlbG9jYXRpb24pOwotICB3aGlsZSAoc3JjICE9IChvYXN5c19yZWxvY190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0gICAgICBpZiAoc3JjLT5yZWxlbnQuc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBzcmMtPnN5bWJvbDsKLQl9Ci0jZW5kaWYKLQotICAgICAgKnJlbHB0cisrID0gJnNyYy0+cmVsZW50OwotICAgICAgc3JjID0gc3JjLT5uZXh0OwotICAgICAgcmVsb2NfY291bnQrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQgPSByZWxvY19jb3VudDsKLX0KLQotCi0KLQotLyogV3JpdGluZyAqLwotCi0KLS8qIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gYW5kIHdyaXRlIG9uZSByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsIHR5cGUsIHJlY29yZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBvYXN5c19yZWNvcmRfZW51bV90eXBlIHR5cGU7Ci0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBpbnQgY2hlY2tzdW07Ci0gIHNpemVfdCBpOwotICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0KLSAgcmVjb3JkLT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKLSAgcmVjb3JkLT5oZWFkZXIudHlwZSA9IChpbnQpIHR5cGU7Ci0gIHJlY29yZC0+aGVhZGVyLmNoZWNrX3N1bSA9IDA7Ci0gIHJlY29yZC0+aGVhZGVyLmZpbGwgPSAwOwotICBwdHIgPSAodW5zaWduZWQgY2hhciAqKSAmcmVjb3JkLT5wYWRbMF07Ci0gIGNoZWNrc3VtID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBjaGVja3N1bSArPSAqcHRyKys7Ci0gICAgfQotICByZWNvcmQtPmhlYWRlci5jaGVja19zdW0gPSAweGZmICYgKC1jaGVja3N1bSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHJlY29yZCwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFdyaXRlIG91dCBhbGwgdGhlIHN5bWJvbHMgKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9zeW1zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXN5bWJvbCAqKmdlbmVyaWMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgaW5kZXggPSAwOwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsgY291bnQrKykKLSAgICB7Ci0KLSAgICAgIG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSBzeW1ib2w7Ci0gICAgICBhc3ltYm9sICpDT05TVCBnID0gZ2VuZXJpY1tjb3VudF07Ci0KLSAgICAgIENPTlNUIGNoYXIgKnNyYyA9IGctPm5hbWU7Ci0gICAgICBjaGFyICpkc3QgPSBzeW1ib2wubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsID0gMDsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoZy0+c2VjdGlvbikpCi0JewotCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQ09NOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbmRleCwgc3ltYm9sLnJlZm5vKTsKLQkgIGluZGV4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChnLT5zZWN0aW9uKSkKLQl7Ci0JICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9BQlM7Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIHN5bWJvbC5yZWZubyk7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGctPnNlY3Rpb24pKQotCXsKLQkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1VORDsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW5kZXgsIHN5bWJvbC5yZWZubyk7Ci0JICAvKiBPdmVybG9hZCB0aGUgdmFsdWUgZmllbGQgd2l0aCB0aGUgb3V0cHV0IGluZGV4IG51bWJlciAqLwotCSAgaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChnLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0JewotCSAgLyogdGhyb3cgaXQgYXdheSAqLwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChnLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogU29tZXRpbWUsIHRoZSBvYXN5cyB0b29scyBnaXZlIG91dCBhIHN5bWJvbCB3aXRoIGlsbGVnYWwKLQkgICBiaXRzIGluIGl0LCB3ZSdsbCBvdXRwdXQgaXQgaW4gdGhlIHNhbWUgYnJva2VuIHdheSAqLwotCi0JICAgICAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgZy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgfQotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBzeW1ib2wucmVmbm8pOwotCX0KLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLSAgICAgIGlmIChzcmNbbF0gPT0gJ18nKQotCWRzdFtsKytdID0gJy4nOwotI2VuZGlmCi0gICAgICB3aGlsZSAoc3JjW2xdKQotCXsKLQkgIGRzdFtsXSA9IHNyY1tsXTsKLQkgIGwrKzsKLQl9Ci0KLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZy0+dmFsdWUsIHN5bWJvbC52YWx1ZSk7Ci0KLQotICAgICAgaWYgKGctPmZsYWdzICYgQlNGX0xPQ0FMKQotCXsKLQkgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQkgICAgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0sCi0JCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHN5bWJvbCwKLQkJCQkgICAgb2Zmc2V0b2YgKG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSwKLQkJCQkJICAgICAgbmFtZVswXSkgKyBsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJICAgIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bSwKLQkJCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgc3ltYm9sLAotCQkJCSAgICBvZmZzZXRvZiAob2FzeXNfc3ltYm9sX3JlY29yZF90eXBlLAotCQkJCQkgICAgICBuYW1lWzBdKSArIGwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZy0+dmFsdWUgPSBpbmRleCAtIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLSAvKiBXcml0ZSBhIHNlY3Rpb24gaGVhZGVyIGZvciBlYWNoIHNlY3Rpb24gKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9zZWN0aW9ucyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RhdGljIG9hc3lzX3NlY3Rpb25fcmVjb3JkX3R5cGUgb3V0OwotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lWzBdKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gb2FzeXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIG91dC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IHMtPnRhcmdldF9pbmRleDsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+X2Nvb2tlZF9zaXplLCBvdXQudmFsdWUpOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT52bWEsIG91dC52bWEpOwotCi0gICAgICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bSwKLQkJCQkob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBvdXQsCi0JCQkJc2l6ZW9mIChvdXQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX2hlYWRlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBDcmVhdGUgYW5kIHdyaXRlIHRoZSBoZWFkZXIgKi8KLSAgb2FzeXNfaGVhZGVyX3JlY29yZF90eXBlIHI7Ci0gIHNpemVfdCBsZW5ndGggPSBzdHJsZW4gKGFiZmQtPmZpbGVuYW1lKTsKLSAgaWYgKGxlbmd0aCA+IChzaXplX3QpIHNpemVvZiAoci5tb2R1bGVfbmFtZSkpCi0gICAgewotICAgICAgbGVuZ3RoID0gc2l6ZW9mIChyLm1vZHVsZV9uYW1lKTsKLSAgICB9Ci0KLSAgKHZvaWQpIG1lbWNweSAoci5tb2R1bGVfbmFtZSwKLQkJIGFiZmQtPmZpbGVuYW1lLAotCQkgbGVuZ3RoKTsKLSAgKHZvaWQpIG1lbXNldCAoci5tb2R1bGVfbmFtZSArIGxlbmd0aCwKLQkJICcgJywKLQkJIHNpemVvZiAoci5tb2R1bGVfbmFtZSkgLSBsZW5ndGgpOwotCi0gIHIudmVyc2lvbl9udW1iZXIgPSBPQVNZU19WRVJTSU9OX05VTUJFUjsKLSAgci5yZXZfbnVtYmVyID0gT0FTWVNfUkVWX05VTUJFUjsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bSwKLQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiByLAotCQkJICAgIG9mZnNldG9mIChvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUsCi0JCQkJICAgICAgZGVzY3JpcHRpb25bMF0pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9lbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgb2FzeXNfZW5kX3JlY29yZF90eXBlIGVuZDsKLSAgdW5zaWduZWQgY2hhciBudWxsID0gMDsKLSAgZW5kLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQUJTOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MsIGVuZC5lbnRyeSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgZW5kLmZpbGwpOwotICBlbmQuemVybyA9IDA7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCSAgICBvYXN5c19yZWNvcmRfaXNfZW5kX2VudW0sCi0JCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgZW5kLAotCQkJICAgIHNpemVvZiAoZW5kKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG51bGwsIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotY29tcCAoYXAsIGJwKQotICAgICBDT05TVCBQVFIgYXA7Ci0gICAgIENPTlNUIFBUUiBicDsKLXsKLSAgYXJlbGVudCAqYSA9ICooKGFyZWxlbnQgKiopIGFwKTsKLSAgYXJlbGVudCAqYiA9ICooKGFyZWxlbnQgKiopIGJwKTsKLSAgcmV0dXJuIGEtPmFkZHJlc3MgLSBiLT5hZGRyZXNzOwotfQotCi0vKgotIFdyaXRpbmcgZGF0YS4uCi0KLSovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQotCXsKLQkgIGJmZF9ieXRlICpyYXdfZGF0YSA9IG9hc3lzX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKLQkgIG9hc3lzX2RhdGFfcmVjb3JkX3R5cGUgcHJvY2Vzc2VkX2RhdGE7Ci0JICBiZmRfc2l6ZV90eXBlIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7Ci0JICB1bnNpZ25lZCBpbnQgcmVsb2NzX3RvX2dvID0gcy0+cmVsb2NfY291bnQ7Ci0JICBhcmVsZW50ICoqcCA9IHMtPm9yZWxvY2F0aW9uOwotCSAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCi0JICAgIHsKLS8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gaXQncyBlYXN5IHRvIGluc2VydCB0aGUgcmVsb2NzIGludG8gdGhlCi0JICAgZGF0YSAqLwotCi0JICAgICAgcXNvcnQgKHMtPm9yZWxvY2F0aW9uLAotCQkgICAgIHMtPnJlbG9jX2NvdW50LAotCQkgICAgIHNpemVvZiAoYXJlbGVudCAqKiksCi0JCSAgICAgY29tcCk7Ci0JICAgIH0KLQkgIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7Ci0JICBwcm9jZXNzZWRfZGF0YS5yZWxiID0gcy0+dGFyZ2V0X2luZGV4IHwgUkVMT0NBVElPTl9UWVBFX1JFTDsKLQotCSAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9jb29rZWRfc2l6ZSkKLQkgICAgewotCSAgICAgIC8qIFNjYW4gZm9yd2FyZHMgYnkgZWlnaHQgYnl0ZXMgb3IgaG93ZXZlciBtdWNoIGlzIGxlZnQgYW5kIHNlZSBpZgotCSAgICAgICB0aGVyZSBhcmUgYW55IHJlbG9jYXRpb25zIGdvaW5nIG9uICovCi0JICAgICAgYmZkX2J5dGUgKm1vZCA9ICZwcm9jZXNzZWRfZGF0YS5kYXRhWzBdOwotCSAgICAgIGJmZF9ieXRlICpkc3QgPSAmcHJvY2Vzc2VkX2RhdGEuZGF0YVsxXTsKLQotCSAgICAgIHVuc2lnbmVkIGludCBpID0gMDsKLQkgICAgICAqbW9kID0gMDsKLQotCi0JICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT52bWEgKyBjdXJyZW50X2J5dGVfaW5kZXgsCi0JCQkgICAgcHJvY2Vzc2VkX2RhdGEuYWRkcik7Ci0KLQkgICAgICAvKiBEb24ndCBzdGFydCBhIHJlbG9jYXRpb24gdW5sZXNzIHlvdSdyZSBzdXJlIHlvdSBjYW4gZmluaXNoIGl0Ci0gCSAgICAgICB3aXRoaW4gdGhlIHNhbWUgZGF0YSByZWNvcmQuICBUaGUgd29yc3QgY2FzZSByZWxvY2F0aW9uIGlzIGEKLSAJICAgICAgIDQtYnl0ZSByZWxvY2F0YWJsZSB2YWx1ZSB3aGljaCBpcyBzcGxpdCBhY3Jvc3MgdHdvIG1vZGlmaWNhdGlvbgotIAkgICAgICAgYnl0ZXMgKDEgcmVsb2NhdGlvbiBieXRlICsgMiBzeW1ib2wgcmVmZXJlbmNlIGJ5dGVzICsgMiBkYXRhICsKLSAJICAgICAgIDEgbW9kaWZpY2F0aW9uIGJ5dGUgKyAyIGRhdGEgPSA4IGJ5dGVzIHRvdGFsKS4gIFRoYXQncyB3aGVyZQotIAkgICAgICAgdGhlIG1hZ2ljIG51bWJlciA4IGNvbWVzIGZyb20uCi0gCSAgICAqLwotCSAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUgJiYgZHN0IDw9Ci0JCSAgICAgJnByb2Nlc3NlZF9kYXRhLmRhdGFbc2l6ZW9mIChwcm9jZXNzZWRfZGF0YS5kYXRhKSAtIDhdKQotCQl7Ci0KLQotCQkgIGlmIChyZWxvY3NfdG9fZ28gIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYXJlbGVudCAqciA9ICpwOwotCQkgICAgICByZWxvY19ob3d0b190eXBlICpjb25zdCBob3cgPSByLT5ob3d0bzsKLQkJICAgICAgLyogVGhlcmUgaXMgYSByZWxvY2F0aW9uLCBpcyBpdCBmb3IgdGhpcyBieXRlID8gKi8KLQkJICAgICAgaWYgKHItPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQotCQkJewotCQkJICB1bnNpZ25lZCBjaGFyIHJlbF9ieXRlOwotCi0JCQkgIHArKzsKLQkJCSAgcmVsb2NzX3RvX2dvLS07Ci0KLQkJCSAgKm1vZCB8PSAoMSA8PCBpKTsKLQkJCSAgaWYgKGhvdy0+cGNfcmVsYXRpdmUpCi0JCQkgICAgewotCQkJICAgICAgcmVsX2J5dGUgPSBSRUxPQ0FUSU9OX1BDUkVMX0JJVDsKLQotCQkJICAgICAgLyogQWxzbyBwYXRjaCB0aGUgcmF3IGRhdGEgc28gdGhhdCBpdCBkb2Vzbid0IGhhdmUKLQkJCSB0aGUgLXZlIHN0dWZmIGFueSBtb3JlICovCi0JCQkgICAgICBpZiAoaG93LT5zaXplICE9IDIpCi0JCQkJewotCQkJCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJCQkJICAgICAgYmZkX2dldF8xNiAoYWJmZCwgcmF3X2RhdGEpICsKLQkJCQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4LCByYXdfZGF0YSk7Ci0JCQkJfQotCi0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkJCQkJICAgICAgYmZkX2dldF8zMiAoYWJmZCwgcmF3X2RhdGEpICsKLQkJCQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4LCByYXdfZGF0YSk7Ci0JCQkJfQotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHJlbF9ieXRlID0gMDsKLQkJCSAgICB9Ci0JCQkgIGlmIChob3ctPnNpemUgPT0gMikKLQkJCSAgICB7Ci0JCQkgICAgICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OXzMyQklUX0JJVDsKLQkJCSAgICB9Ci0KLQkJCSAgLyogSXMgdGhpcyBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbiwgb3IgYSBzeW1ib2wKLQkJICAgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24gPyAqLwotCQkJICBhYm9ydCAoKTsKLQotI2lmIDAKLQkJCSAgaWYgKHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgLyogVGhlIHJlbGVudCBoYXMgYSBzZWN0aW9uIGF0dGFjaGVkLCBzbyBpdCBtdXN0IGJlIHNlY3Rpb24KLQkJCSAgICAgcmVsYXRpdmUgKi8KLQkJCSAgICAgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9SRUw7Ci0JCQkgICAgICByZWxfYnl0ZSB8PSByLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJICAgICAgKmRzdCsrID0gcmVsX2J5dGU7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0jZW5kaWYKLQkJCSAgICB7Ci0JCQkgICAgICBhc3ltYm9sICpwID0gKihyLT5zeW1fcHRyX3B0cik7Ci0KLQkJCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhIHNlY3Rpb24gYXR0YWNoZWQsIHRoZW4gaXQKLQkJCSAgICAgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC4gIENoYW5nZSBmcm9tIGEgc3ltYm9sCi0JCQkgICAgIHJlZiB0byBhIHNlY3Rpb24gcmVmICovCi0JCQkgICAgICBpZiAocC0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJCQl7Ci0JCQkJICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfUkVMOwotCQkJCSAgcmVsX2J5dGUgfD0KLQkJCQkgICAgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCQkgICpkc3QrKyA9IHJlbF9ieXRlOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfVU5EOwotCQkJCSAgKmRzdCsrID0gcmVsX2J5dGU7Ci0JCQkJICAvKiBOZXh0IHR3byBieXRlcyBhcmUgYSBzeW1ib2wgaW5kZXggLSB3ZSBjYW4gZ2V0Ci0JCQkgICAgICAgdGhpcyBmcm9tIHRoZSBzeW1ib2wgdmFsdWUgd2hpY2ggaGFzIGJlZW4gemFwcGVkCi0JCQkgICAgICAgaW50byB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSB0YWJsZSB3aGVuIHRoZQotCQkJICAgICAgIHN5bWJvbCB0YWJsZSB3YXMgd3JpdHRlbgotCQkJICAgICAgICovCi0JCQkJICAqZHN0KysgPSBwLT52YWx1ZSA+PiA4OwotCQkJCSAgKmRzdCsrID0gcC0+dmFsdWU7Ci0JCQkJfQotCQkJICAgIH0KLSNkZWZpbmUgQURWQU5DRSB7IGlmICgrK2kgPj0gOCkgeyBpID0gMDsgbW9kID0gZHN0Kys7ICptb2QgPSAwOyB9IGN1cnJlbnRfYnl0ZV9pbmRleCsrOyB9Ci0JCQkgIC8qIHJlbG9jYXRpb25zIG5ldmVyIG9jY3VyIGZyb20gYW4gdW5sb2FkYWJsZSBzZWN0aW9uLAotCQkgICAgICAgc28gd2UgY2FuIGFzc3VtZSB0aGF0IHJhd19kYXRhIGlzIG5vdCBOVUxMCi0JCSAgICAgKi8KLQkJCSAgKmRzdCsrID0gKnJhd19kYXRhKys7Ci0JCQkgIEFEVkFOQ0UKLQkJCSAgICAqIGRzdCsrID0gKnJhd19kYXRhKys7Ci0JCQkgIEFEVkFOQ0UKLQkJCSAgICBpZiAoaG93LT5zaXplID09IDIpCi0JCQkgICAgewotCQkJICAgICAgKmRzdCsrID0gKnJhd19kYXRhKys7Ci0JCQkgICAgICBBRFZBTkNFCi0JCQkJKiBkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICAgICAgQURWQU5DRQotCQkJICAgIH0KLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgLyogSWYgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiB1bmxvYWRhYmxlIHNlY3Rpb24gdGhlbiBjb3B5Ci0JCSAgIHplcm9zICovCi0JCSAgaWYgKHJhd19kYXRhID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgICpkc3QrKyA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAqZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJICAgIH0KLQkJICBBRFZBTkNFCi0JCX0KLQotCSAgICAgIC8qIERvbid0IHdyaXRlIGEgdXNlbGVzcyBudWxsIG1vZGlmaWNhdGlvbiBieXRlICovCi0JICAgICAgaWYgKGRzdCA9PSBtb2QgKyAxKQotCQl7Ci0JCSAgLS1kc3Q7Ci0JCX0KLQotCSAgICAgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQkJb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bSwKLQkJCQkJKChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKQotCQkJCQkgJiBwcm9jZXNzZWRfZGF0YSksCi0JCQkJCWRzdCAtIChiZmRfYnl0ZSAqKSAmIHByb2Nlc3NlZF9kYXRhKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBvYXN5c193cml0ZV9oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfc3ltcyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX2VuZCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLQotLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0vKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIE9BU1lTIHNpbmNlIHRoZSBmb3JtYXQgaXMKLSogbm90IGEgYnl0ZSBpbWFnZSwgYnV0IGEgcmVjb3JkIHN0cmVhbS4KLSovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID0KLQkgICAgKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSkpOwotCSAgaWYgKCFvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAodm9pZCkgbWVtY3B5ICgoUFRSKSAob2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKLQkJICAgICBsb2NhdGlvbiwKLQkJICAgICAoc2l6ZV90KSBjb3VudCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi1mdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLWhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotc3RhdGljIGFzeW1ib2wgKgotb2FzeXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotICBvYXN5c19zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKG9hc3lzX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotDAotCi0KLQotLyogVXNlciBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBmaWxlIGZsYWdzOyBwZXJoYXBzIHdlIHNob3VsZCByZXR1cm4KLUJGRF9OT19NT1JFX1NZTUJPTFMgaWYgdGhlcmUgYXJlIG5vbmU/ICovCi0KLXN0YXRpYyBiZmQgKgotb2FzeXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgb2FzeXNfYXJfZGF0YV90eXBlICphciA9IE9BU1lTX0FSX0RBVEEgKGFyY2gpOwotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICpwOwotICAvKiB0YWtlIHRoZSBuZXh0IG9uZSBmcm9tIHRoZSBhcmNoIHN0YXRlLCBvciByZXNldCAqLwotICBpZiAocHJldiA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogUmVzZXQgdGhlIGluZGV4IC0gdGhlIGZpcnN0IHR3byBlbnRyaWVzIGFyZSBib2d1cyovCi0gICAgICBhci0+bW9kdWxlX2luZGV4ID0gMDsKLSAgICB9Ci0KLSAgcCA9IGFyLT5tb2R1bGUgKyBhci0+bW9kdWxlX2luZGV4OwotICBhci0+bW9kdWxlX2luZGV4Kys7Ci0KLSAgaWYgKGFyLT5tb2R1bGVfaW5kZXggPD0gYXItPm1vZHVsZV9jb3VudCkKLSAgICB7Ci0gICAgICBpZiAocC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0JewotCSAgcC0+YWJmZCA9IF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAoYXJjaCk7Ci0JICBwLT5hYmZkLT5vcmlnaW4gPSBwLT5wb3M7Ci0JICBwLT5hYmZkLT5maWxlbmFtZSA9IHAtPm5hbWU7Ci0KLQkgIC8qIEZpeHVwIGEgcG9pbnRlciB0byB0aGlzIGVsZW1lbnQgZm9yIHRoZSBtZW1iZXIgKi8KLQkgIHAtPmFiZmQtPmFyZWx0X2RhdGEgPSAoUFRSKSBwOwotCX0KLSAgICAgIHJldHVybiBwLT5hYmZkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLSAgICAgIHJldHVybiAoYmZkICopIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCi0JCQkgc2VjdGlvbiwKLQkJCSBzeW1ib2xzLAotCQkJIG9mZnNldCwKLQkJCSBmaWxlbmFtZV9wdHIsCi0JCQkgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCSBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKipmaWxlbmFtZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotc3RhdGljIGludAotb2FzeXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kID0gKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikgYWJmZC0+YXJlbHRfZGF0YTsKLSAgaWYgKG1vZCA9PSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmLT5zdF9zaXplID0gbW9kLT5zaXplOwotICAgICAgYnVmLT5zdF9tb2RlID0gMDY2NjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotc3RhdGljIGludAotb2FzeXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUJb2FzeXNfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIG9hc3lzX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIG9hc3lzX3NsdXJwX2FybWFwIGJmZF90cnVlCi0jZGVmaW5lIG9hc3lzX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX3RydWUKLSNkZWZpbmUgb2FzeXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIG9hc3lzX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgb2FzeXNfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBvYXN5c19yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgb2FzeXNfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBvYXN5c191cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLSNkZWZpbmUgb2FzeXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBvYXN5c19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgb2FzeXNfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBvYXN5c19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG9hc3lzX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG9hc3lzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIG9hc3lzX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIG9hc3lzX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBvYXN5c19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG9hc3lzX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgb2FzeXNfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG9hc3lzX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG9hc3lzX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG9hc3lzX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG9hc3lzX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKlNVUFBSRVNTIDQ2MCAqLwotY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWMgPQotewotICAib2FzeXMiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBvYXN5c19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIG9hc3lzX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG9hc3lzX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL29wbmNscy5jIGIvYmZkL29wbmNscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhMGQwLi4wMDAwMDAwCi0tLSBhL2JmZC9vcG5jbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKiBvcG5jbHMuYyAtLSBvcGVuIGFuZCBjbG9zZSBhIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAJLyogRXhlY3V0ZSBieSBncm91cC4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWE9USAotI2RlZmluZSBTX0lYT1RIIDAwMDEJLyogRXhlY3V0ZSBieSBvdGhlcnMuICAqLwotI2VuZGlmCi0KLS8qIGZkb3BlbiBpcyBhIGxvc2VyIC0tIHdlIHNob3VsZCB1c2Ugc3RkaW8gZXhjbHVzaXZlbHkuICBVbmZvcnR1bmF0ZWx5Ci0gICBpZiB3ZSBkbyB0aGF0IHdlIGNhbid0IHVzZSBmY250bC4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLWxvbmcgX2JmZF9jaHVua3NpemUgPSAtMTsKLQotLyogUmV0dXJuIGEgbmV3IEJGRC4gIEFsbCBCRkQncyBhcmUgYWxsb2NhdGVkIHRocm91Z2ggdGhpcyByb3V0aW5lLiAgKi8KLQotYmZkICoKLV9iZmRfbmV3X2JmZCAoKQotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IChiZmQgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkKSk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmJmZC0+bWVtb3J5ID0gKFBUUikgb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAobmJmZC0+bWVtb3J5ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotCi0gIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKLSAgbmJmZC0+aW9zdHJlYW0gPSBOVUxMOwotICBuYmZkLT53aGVyZSA9IDA7Ci0gIG5iZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5iZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBuYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBuYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgbmJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgbmJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBuYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgbmJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIG5iZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBuYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgbmJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IEJGRCBhcyBhIG1lbWJlciBvZiBhcmNoaXZlIE9CRkQuICAqLwotCi1iZmQgKgotX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiAob2JmZCkKLSAgICAgYmZkICpvYmZkOwotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgbmJmZC0+eHZlYyA9IG9iZmQtPnh2ZWM7Ci0gIG5iZmQtPm15X2FyY2hpdmUgPSBvYmZkOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgbmJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IG9iZmQtPnRhcmdldF9kZWZhdWx0ZWQ7Ci0gIHJldHVybiBuYmZkOwotfQotCi0vKgotU0VDVElPTgotCU9wZW5pbmcgYW5kIGNsb3NpbmcgQkZEcwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnIKLQotU1lOT1BTSVMKLSAgICAgICAgYmZkICpiZmRfb3BlbnIoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7Ci0KLURFU0NSSVBUSU9OCi0JT3BlbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSAodXNpbmcgPDxmb3Blbj4+KSB3aXRoIHRoZSB0YXJnZXQKLQlAdmFye3RhcmdldH0uICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIEJGRC4KLQotCUNhbGxzIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4sIHNvIEB2YXJ7dGFyZ2V0fSBpcyBpbnRlcnByZXRlZCBhcyBieQotCXRoYXQgZnVuY3Rpb24uCi0KLQlJZiA8PE5VTEw+PiBpcyByZXR1cm5lZCB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkLiAgIFBvc3NpYmxlIGVycm9ycwotCWFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBvciA8PHN5c3RlbV9jYWxsPj4gZXJyb3IuCi0qLwotCi1iZmQgKgotYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQotICBpZiAoYmZkX29wZW5fZmlsZSAobmJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGaWxlIGRpZG4ndCBleGlzdCwgb3Igc29tZSBzdWNoICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIERvbid0IHRyeSB0byBgb3B0aW1pemUnIHRoaXMgZnVuY3Rpb246Ci0KLSAgIG8gLSBXZSBsb2NrIHVzaW5nIHN0YWNrIHNwYWNlIHNvIHRoYXQgaW50ZXJydXB0aW5nIHRoZSBsb2NraW5nCi0gICAgICAgd29uJ3QgY2F1c2UgYSBzdG9yYWdlIGxlYWsuCi0gICBvIC0gV2Ugb3BlbiB0aGUgZmlsZSBzdHJlYW0gbGFzdCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvCi0gICAgICAgY2xvc2UgaXQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4gIENsb3NpbmcgdGhlIHN0cmVhbSBtZWFucyBjbG9zaW5nCi0gICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciB0b28sIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBvcGVuIGl0LgotICovCi0vKgotRlVOQ1RJT04KLSAgICAgICAgIGJmZF9mZG9wZW5yCi0KLVNZTk9QU0lTCi0gICAgICAgICBiZmQgKmJmZF9mZG9wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQsIGludCBmZCk7Ci0KLURFU0NSSVBUSU9OCi0gICAgICAgICA8PGJmZF9mZG9wZW5yPj4gaXMgdG8gPDxiZmRfZm9wZW5yPj4gbXVjaCBsaWtlIDw8ZmRvcGVuPj4gaXMgdG8gPDxmb3Blbj4+LgotCSBJdCBvcGVucyBhIEJGRCBvbiBhIGZpbGUgYWxyZWFkeSBkZXNjcmliZWQgYnkgdGhlIEB2YXJ7ZmR9Ci0JIHN1cHBsaWVkLgotCi0JIFdoZW4gdGhlIGZpbGUgaXMgbGF0ZXIgPDxiZmRfY2xvc2U+PmQsIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQuCi0KLQkgSWYgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYmUgY2FjaGVkIGJ5IEJGRAotCSAob3BlbmVkIGFzIG5lZWRlZCwgY2xvc2VkIGFzIG5lZWRlZCB0byBmcmVlIGRlc2NyaXB0b3JzIGZvcgotCSBvdGhlciBvcGVucyksIHdpdGggdGhlIHN1cHBsaWVkIEB2YXJ7ZmR9IHVzZWQgYXMgYW4gaW5pdGlhbAotCSBmaWxlIGRlc2NyaXB0b3IgKGJ1dCBzdWJqZWN0IHRvIGNsb3N1cmUgYXQgYW55IHRpbWUpLCBjYWxsCi0JIGJmZF9zZXRfY2FjaGVhYmxlKGJmZCwgMSkgb24gdGhlIHJldHVybmVkIEJGRC4gIFRoZSBkZWZhdWx0IGlzIHRvCi0JIGFzc3VtZSBubyBjYWNoZWluZzsgdGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIHJlbWFpbiBvcGVuIHVudGlsCi0JIDw8YmZkX2Nsb3NlPj4sIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBCRkQgb3BlcmF0aW9ucyBvbiBvdGhlcgotCSBmaWxlcy4KLQotICAgICAgICAgUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBhbmQgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+Pi4KLSovCi0KLWJmZCAqCi1iZmRfZmRvcGVuciAoZmlsZW5hbWUsIHRhcmdldCwgZmQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGludCBmZDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotICBpbnQgZmRmbGFnczsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotI2lmICEgZGVmaW5lZChIQVZFX0ZDTlRMKSB8fCAhIGRlZmluZWQoRl9HRVRGTCkKLSAgZmRmbGFncyA9IE9fUkRXUjsJCQkvKiBBc3N1bWUgZnVsbCBhY2Nlc3MgKi8KLSNlbHNlCi0gIGZkZmxhZ3MgPSBmY250bCAoZmQsIEZfR0VURkwsIE5VTEwpOwotI2VuZGlmCi0gIGlmIChmZGZsYWdzID09IC0xKSByZXR1cm4gTlVMTDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfRkRPUEVOCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0jZWxzZQotICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KLSAgc3dpdGNoIChmZGZsYWdzICYgKE9fQUNDTU9ERSkpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUkIpOyAgIGJyZWFrOwotICAgIGNhc2UgT19XUk9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiAgIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChuYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBwdXQgZXZlcnl0aGluZyB3aGVyZSBpdCBiZWxvbmdzICovCi0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICAvKiBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBhbGxvdyBhIEZEIG9wZW4gZm9yIHJlYWQvd3JpdGUgdG8KLSAgICAgYmUgd3JpdHRlbiB0aHJvdWdoLCBhbHRob3VnaCBkb2luZyBzbyByZXF1aXJlcyB0aGF0IHdlIGVuZAotICAgICB0aGUgcHJldmlvdXMgY2xhdXNlIHdpdGggYSBwcmVwb3NpdGlvbi4gICovCi0gIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLwotICBzd2l0Y2ggKGZkZmxhZ3MgJiBPX0FDQ01PREUpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOyBicmVhazsKLSAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247IGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiBuYmZkLT5kaXJlY3Rpb24gPSBib3RoX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgbmJmZC0+b3BlbmVkX29uY2UgPSB0cnVlOwotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnN0cmVhbXIKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVuc3RyZWFtcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUFRSKTsKLQotREVTQ1JJUFRJT04KLQotCU9wZW4gYSBCRkQgZm9yIHJlYWQgYWNjZXNzIG9uIGFuIGV4aXN0aW5nIHN0ZGlvIHN0cmVhbS4gIFdoZW4KLQl0aGUgQkZEIGlzIHBhc3NlZCB0byA8PGJmZF9jbG9zZT4+LCB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkLgotKi8KLQotYmZkICoKLWJmZF9vcGVuc3RyZWFtciAoZmlsZW5hbWUsIHRhcmdldCwgc3RyZWFtYXJnKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBQVFIgc3RyZWFtYXJnOwotewotICBGSUxFICpzdHJlYW0gPSAoRklMRSAqKSBzdHJlYW1hcmc7Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgc3RyZWFtOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQkJCQkKLSAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKG5iZmQpKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuYmZkOwotfQotDAotLyoqIGJmZF9vcGVudyAtLSBvcGVuIGZvciB3cml0aW5nLgotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGZyZXNobHktYWxsb2NhdGVkIEJGRCBvbiBzdWNjZXNzLCBvciBOVUxMLgotCi0gIFNlZSBjb21tZW50IGJ5IGJmZF9mZG9wZW5yIGJlZm9yZSB5b3UgdHJ5IHRvIG1vZGlmeSB0aGlzIGZ1bmN0aW9uLiAqLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbncKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVudyhDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBCRkQsIGFzc29jaWF0ZWQgd2l0aCBmaWxlIEB2YXJ7ZmlsZW5hbWV9LCB1c2luZyB0aGUKLQlmaWxlIGZvcm1hdCBAdmFye3RhcmdldH0sIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LCA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwKLQk8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+LgotKi8KLQotYmZkICoKLWJmZF9vcGVudyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogbmJmZCBoYXMgdG8gcG9pbnQgdG8gaGVhZCBvZiBtYWxsb2MnZWQgYmxvY2sgc28gdGhhdCBiZmRfY2xvc2UgbWF5Ci0gICAgIHJlY2xhaW0gaXQgY29ycmVjdGx5LiAqLwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247Ci0KLSAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsJLyogRmlsZSBub3Qgd3JpdGVhYmxlLCBldGMgKi8KLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLQotRlVOQ1RJT04KLQliZmRfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jbG9zZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCi0JQ2xvc2UgYSBCRkQuIElmIHRoZSBCRkQgd2FzIG9wZW4gZm9yIHdyaXRpbmcsCi0JdGhlbiBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCBhbmQgdGhlIGZpbGUgd3JpdHRlbiBvdXQKLQlhbmQgY2xvc2VkLiBJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4KLQk8PGNobW9kPj4gaXMgY2FsbGVkIHRvIG1hcmsgaXQgYXMgc3VjaC4KLQotCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KLQotCVRoZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBCRkQgaXMgY2xvc2VkIChldmVuCi0JaWYgaXQgd2FzIHBhc3NlZCBpbiB0byBCRkQgYnkgPDxiZmRfZmRvcGVucj4+KS4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLSovCi0KLQotYm9vbGVhbgotYmZkX2Nsb3NlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkQgKGFiZmQsIF9jbG9zZV9hbmRfY2xlYW51cCwgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotIAkgIGludCBtYXNrID0gdW1hc2sgKDApOwotCSAgdW1hc2sgKG1hc2spOwotCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAotCQkgKDA3NzcKLQkJICAmIChidWYuc3RfbW9kZSB8ICgoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSAmfiBtYXNrKSkpKTsKLQl9Ci0gICAgfQotCi0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5KTsKLSAgZnJlZSAoYWJmZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Nsb3NlX2FsbF9kb25lCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2xvc2VfYWxsX2RvbmUoYmZkICopOwotCi1ERVNDUklQVElPTgotCUNsb3NlIGEgQkZELiAgRGlmZmVycyBmcm9tIDw8YmZkX2Nsb3NlPj4KLQlzaW5jZSBpdCBkb2VzIG5vdCBjb21wbGV0ZSBhbnkgcGVuZGluZyBvcGVyYXRpb25zLiAgVGhpcwotCXJvdXRpbmUgd291bGQgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gaGFkIGp1c3QgdXNlZCBCRkQgZm9yCi0Jc3dhcHBpbmcgYW5kIGRpZG4ndCB3YW50IHRvIHVzZSBhbnkgb2YgdGhlIHdyaXRpbmcgY29kZS4KLQotCUlmIHRoZSBjcmVhdGVkIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbiA8PGNobW9kPj4gaXMgY2FsbGVkCi0JdG8gbWFyayBpdCBhcyBzdWNoLgotCi0JQWxsIG1lbW9yeSBhdHRhY2hlZCB0byB0aGUgQkZEIGlzIHJlbGVhc2VkLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotCi0qLwotCi1ib29sZWFuCi1iZmRfY2xvc2VfYWxsX2RvbmUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotCSAgaW50IG1hc2sgPSB1bWFzayAoMCk7Ci0JICB1bWFzayAobWFzayk7Ci0JICBjaG1vZCAoYWJmZC0+ZmlsZW5hbWUsCi0JCSAoMDc3NwotCQkgICYgKGJ1Zi5zdF9tb2RlIHwgKChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpICZ+IG1hc2spKSkpOwotCX0KLSAgICB9Ci0KLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnkpOwotICBmcmVlIChhYmZkKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY3JlYXRlCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfY3JlYXRlKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBiZmQgKnRlbXBsKTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgQkZEIGluIHRoZSBtYW5uZXIgb2YKLQk8PGJmZF9vcGVudz4+LCBidXQgd2l0aG91dCBvcGVuaW5nIGEgZmlsZS4gVGhlIG5ldyBCRkQKLQl0YWtlcyB0aGUgdGFyZ2V0IGZyb20gdGhlIHRhcmdldCB1c2VkIGJ5IEB2YXJ7dGVtcGxhdGV9LiBUaGUKLQlmb3JtYXQgaXMgYWx3YXlzIHNldCB0byA8PGJmZF9vYmplY3Q+Pi4KLQotKi8KLQotYmZkICoKLWJmZF9jcmVhdGUgKGZpbGVuYW1lLCB0ZW1wbCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqdGVtcGw7Ci17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpZiAodGVtcGwpCi0gICAgbmJmZC0+eHZlYyA9IHRlbXBsLT54dmVjOwotICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247Ci0gIGJmZF9zZXRfZm9ybWF0IChuYmZkLCBiZmRfb2JqZWN0KTsKLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3dyaXRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV93cml0YWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kIGNvbnZlcnRzIGl0Ci0JaW50byBvbmUgbGlrZSBhcyByZXR1cm5lZCBieSA8PGJmZF9vcGVudz4+LiAgSXQgZG9lcyB0aGlzCi0JYnkgY29udmVydGluZyB0aGUgQkZEIHRvIEJGRF9JTl9NRU1PUlkuICBJdCdzIGFzc3VtZWQgdGhhdAotCXlvdSB3aWxsIGNhbGwgPDxiZmRfbWFrZV9yZWFkYWJsZT4+IG9uIHRoaXMgYmZkIGxhdGVyLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotKi8KLQotYm9vbGVhbgotYmZkX21ha2Vfd3JpdGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gbm9fZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaW5fbWVtb3J5KSk7Ci0gIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICAvKiBiZmRfd3JpdGUgd2lsbCBncm93IHRoZXNlIGFzIG5lZWRlZCAqLwotICBiaW0tPnNpemUgPSAwOwotICBiaW0tPmJ1ZmZlciA9IDA7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWTsKLSAgYWJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOwotICBhYmZkLT53aGVyZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3JlYWRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV9yZWFkYWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kCi0JPDxiZmRfbWFrZV93cml0YWJsZT4+IGFuZCBjb252ZXJ0cyBpdCBpbnRvIG9uZSBsaWtlIGFzCi0JcmV0dXJuZWQgYnkgPDxiZmRfb3BlbnI+Pi4gIEl0IGRvZXMgdGhpcyBieSB3cml0aW5nIHRoZQotCWNvbnRlbnRzIG91dCB0byB0aGUgbWVtb3J5IGJ1ZmZlciwgdGhlbiByZXZlcnNpbmcgdGhlCi0JZGlyZWN0aW9uLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LiAgKi8KLQotYm9vbGVhbgotYmZkX21ha2VfcmVhZGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+ZGlyZWN0aW9uICE9IHdyaXRlX2RpcmVjdGlvbiB8fCAhKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBCRkRfU0VORCAoYWJmZCwgX2Nsb3NlX2FuZF9jbGVhbnVwLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotICBhYmZkLT53aGVyZSA9IDA7Ci0gIGFiZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBhYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBhYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgYWJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgYWJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBhYmZkLT5mbGFncyA9IEJGRF9JTl9NRU1PUlk7Ci0gIGFiZmQtPm10aW1lX3NldCA9IGZhbHNlOwotCi0gIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSB0cnVlOwotICBhYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgYWJmZC0+c2VjdGlvbnMgPSAwOwotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSAwOwotICBhYmZkLT50ZGF0YS5hbnkgPSAwOwotCi0gIGJmZF9jaGVja19mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9hbGxvYwotCi1TWU5PUFNJUwotCVBUUiBiZmRfYWxsb2MgKGJmZCAqYWJmZCwgc2l6ZV90IHdhbnRlZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWxsb2NhdGUgYSBibG9jayBvZiBAdmFye3dhbnRlZH0gYnl0ZXMgb2YgbWVtb3J5IGF0dGFjaGVkIHRvCi0JPDxhYmZkPj4gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0qLwotCi0KLVBUUgotYmZkX2FsbG9jIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIHJldCA9IG9iamFsbG9jX2FsbG9jIChhYmZkLT5tZW1vcnksICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcmV0OwotfQotCi1QVFIKLWJmZF96YWxsb2MgKGFiZmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXM7Ci0KLSAgcmVzID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJlcykKLSAgICBtZW1zZXQgKHJlcywgMCwgc2l6ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgZm9yIGEgQkZELiAgKi8KLQotdm9pZAotYmZkX3JlbGVhc2UgKGFiZmQsIGJsb2NrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBibG9jazsKLXsKLSAgb2JqYWxsb2NfZnJlZV9ibG9jayAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnksIGJsb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9vc2YtY29yZS5jIGIvYmZkL29zZi1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGZjMTIuLjAwMDAwMDAKLS0tIGEvYmZkL29zZi1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBPU0YvMSBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIE9TRi8xIHN0eWxlCi0gICBjb3JlIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0JCQkgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKgotb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi0KLXN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW01BWENPTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEub3NmX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1vc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVfZmlsZWhkciBjb3JlX2hlYWRlcjsKLQotICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfaGVhZGVyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJuY21wIChjb3JlX2hlYWRlci5tYWdpYywgIkNvcmUiLCA0KSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVfaGVhZGVyLm5hbWUsIE1BWENPTUxFTiArIDEpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3JlX2hlYWRlci5zaWdubzsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29yZV9oZWFkZXIubnNjbnM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29yZV9zY25oZHIgY29yZV9zY25oZHI7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfc2NuaGRyLCAxLCBzaXplb2YgY29yZV9zY25oZHIsIGFiZmQpOwotICAgICAgaWYgKHZhbCAhPSBzaXplb2YgY29yZV9zY25oZHIpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFNraXAgZW1wdHkgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKGNvcmVfc2NuaGRyLnNpemUgPT0gMCB8fCBjb3JlX3Njbmhkci5zY25wdHIgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChjb3JlX3Njbmhkci5zY250eXBlKQotCXsKLQljYXNlIFNDTlJHTjoKLQkgIHNlY25hbWUgPSAiLmRhdGEiOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlNUQUNLOgotCSAgc2VjbmFtZSA9ICIuc3RhY2siOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlJFR1M6Ci0JICBzZWNuYW1lID0gIi5yZWciOwotCSAgZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5oYW5kbGVkIE9TRi8xIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIpLAotCQkJCSBjb3JlX3Njbmhkci5zY250eXBlKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZV9zY25oZHIuc2l6ZSwKLQkJCSAgICAgIChiZmRfdm1hKSBjb3JlX3Njbmhkci52YWRkciwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZV9zY25oZHIuc2NucHRyKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBvc2ZfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgb3NmX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9zZl9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG9zZl9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb3NmX2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG9zZl9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG9zZl9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAib3NmLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgb3NmX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChvc2ZfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG9zZl9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvcGM1MzItbWFjaC5jIGIvYmZkL3BjNTMyLW1hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3N2Q1ZC4uMDAwMDAwMAotLS0gYS9iZmQvcGM1MzItbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTWFjaDMvNTMyIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBEYWxsCi0gKiAgICAgICAgICAgIDE5LUFwci05NAotICoKLSAqIEZvcm1lcmx5IHBhcnQgb2YgYW91dC1wYzUzMi1tYWNoLmMuIFNwbGl0IG91dCB0byBhbGxvdyBtb3JlCi0gKiBmbGV4aWJpbGl0eSB3aXRoIG11bHRpcGxlIGZvcm1hdHMuCi0gKgotICovCi0vKiBUaGlzIGFyY2hpdGVjdHVyZSBoYXMgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiBkZWZpbmVkIGFzIGlmCi0gKiBOX0hFQURFUl9JTl9URVhULCBidXQgdGhlIGFfdGV4dCBlbnRyeSAodGV4dCBzaXplKSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotICogc3BhY2UgZm9yIHRoZSBoZWFkZXIuIFNvIHdlIGhhdmUgTl9IRUFERVJfSU5fVEVYVCBkZWZpbmVkIHRvCi0gKiAxIGFuZCBzcGVjaWFsbHkgZGVmaW5lIG91ciBvd24gTl9UWFRTSVpFCi0gKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4MTAwMDAgICAgICAgLyogZnJvbSBvbGQgbGQgKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAgICAgICAgLyogZnJvbSBvbGQgbGQsICAwMzIgJiA1MzIgYXJlIHJlYWxseSA1MTIvNGsgKi8KLQotLyogVXNlIGFfZW50cnkgb2YgMCB0byBkaXN0aW5ndWlzaCBvYmplY3QgZmlsZXMgZnJvbSBPTUFHSUMgZXhlY3V0YWJsZXMgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gT01BR0lDID8gXAotICAgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSPyAwOiBURVhUX1NUQVJUX0FERFIpOiBcCi0gICAoTl9NQUdJQyh4KSA9PSBOTUFHSUM/IFRFWFRfU1RBUlRfQUREUjogXAotICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkpCi0KLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbnMzMmsKLSAgCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJtYWNoYW91dF8sT1ApCi0KLS8qIE11c3QgYmUgdGhlIHNhbWUgYXMgYW91dC1uczMyay5jICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZSBmb3IgbWUgLS0gSVdEICovCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG5zMzJrYW91dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogbGliYW91dCBkb2Vzbid0IHVzZSBOQU1FIGZvciB0aGVzZSAuLi4gKi8KLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDEKLSAgICAgCi0jZGVmaW5lIE1ZTlNYKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOU1goYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlNYKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgUEFSQU1TKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAKLSAgQkZEX0FTU0VSVCAoYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9uczMyayk7Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSAzMjAzMjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjAzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyNTMyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX05TMzI1MzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcGUtYXJtLmMgYi9iZmQvcGUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmI2NTkuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybXBlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybXBlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaWZuZGVmIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIAotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0jZW5kaWYKLQkKLSNpZmRlZiBBUk1fV0lOQ0UKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLWkzODYuYyBiL2JmZC9wZS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWI3ODQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIFRBUkdFVF9TWU0gaTM4NnBlX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGUtaTM4NiIKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmlkYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIucGRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWNvcmUuYyBiL2JmZC9wZS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE5ZjgxLi4wMDAwMDAwCi0tLSBhL2JmZC9wZS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNQ29yZSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0JJR19TWU0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgbWNvcmVfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJwZS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jZGVmaW5lIE1DT1JFX1BFCi0KLSNpbmNsdWRlICJjb2ZmLW1jb3JlLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWlwcy5jIGIvYmZkL3BlLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4OTM2OS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTk4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBQRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLWkzODYuYyBieSBESiBEZWxvcmllLCBkakBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL21pcHNwZS5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfbWlwc19yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9taXBzX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCi0JICAgYmZkX3ZtYSAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgICAgICBQVFIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgIGFyZWxlbnQgKikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0jZW5kaWYKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIG1pcHMgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9taXBzX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpZiAwCi0gIC8qIGRqIC0gaGFuZGxlIGl0IGxpa2UgYW55IG90aGVyIHJlbG9jPyAqLwotICAvKiBGSVhNRTogSG93IHNob3VsZCB0aGlzIGNhc2UgYmUgaGFuZGxlZD8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnR5cGUgPT0gTUlQU19SX1JWQSAmJiBkaWZmICE9IDApCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIChkaWZmID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBNSVBTX1JfUlZBOwotfSAgICAgCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQuICBUaGUgcmVsb2MgcmVhZGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAgICB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAuYWJzIHNlY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byBkbyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9BQlNPTFVURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhBTEYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEFMRiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGV09SRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZXT1JEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBqdW1wIGFkZHJlc3MuICAqLwotICBIT1dUTyAoTUlQU19SX0pNUEFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSk1QQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICBtaXBzX3JlZmhpX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX21pcHNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIEhhbmRsZWQgYnkgdGhlCi0gICAgIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0dQUkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdXNpbmcgYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLgotICAgICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDgpLAotICBFTVBUWV9IT1dUTyAoOSksCi0gIEVNUFRZX0hPV1RPICgxMCksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0gIEVNUFRZX0hPV1RPICgxMiksCi0gIEVNUFRZX0hPV1RPICgxMyksCi0gIEVNUFRZX0hPV1RPICgxNCksCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIEVNUFRZX0hPV1RPICgyMCksCi0gIEVNUFRZX0hPV1RPICgyMSksCi0gIEVNUFRZX0hPV1RPICgyMiksCi0gIEVNUFRZX0hPV1RPICgyMyksCi0gIEVNUFRZX0hPV1RPICgyNCksCi0gIEVNUFRZX0hPV1RPICgyNSksCi0gIEVNUFRZX0hPV1RPICgyNiksCi0gIEVNUFRZX0hPV1RPICgyNyksCi0gIEVNUFRZX0hPV1RPICgyOCksCi0gIEVNUFRZX0hPV1RPICgyOSksCi0gIEVNUFRZX0hPV1RPICgzMCksCi0gIEVNUFRZX0hPV1RPICgzMSksCi0gIEVNUFRZX0hPV1RPICgzMiksCi0gIEVNUFRZX0hPV1RPICgzMyksCi0gIEhPV1RPIChNSVBTX1JfUlZBLCAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAicnZhMzIiLAkgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICBFTVBUWV9IT1dUTyAoMzUpLAotICBFTVBUWV9IT1dUTyAoMzYpLAotICBIT1dUTyAoTUlQU19SX1BBSVIsICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX21pcHNfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlBBSVIiLAkgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIE1JUFNCQURNQUcoeCkKLSNkZWZpbmUgTUlQUyAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21pcHNfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICphZGRlbmRwID0gMDsKLSNlbmRpZgotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlCi0JIHNlZW4gc29tZSBkYXRhIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxvY2F0aW9uIGFkZHJlc3MuCi0JIElmIEkgbGluayB0d28gdmVyc2lvbnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQKLQkgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUKLQkgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSBjYXNlIGluIHdoaWNoCi0JIHRoaXMgc2VjdGlvbiBoYXMgYmVlbiBieXBhc3NlZCBoYXMgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQKLQkgdG8gdmFsdWVzIEkgY2FuIGZpbmQgaW4gdGhlIG1hcC4gICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IDQ7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBNSVBTX1JfUlZBKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfbWlwc19ydHlwZV90b19ob3d0bwotCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9taXBzX3JlbG9jX3R5cGVfbG9va3VwCi0KLQotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSBnZW5lcmljIHJlbG9jIHR5cGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21pcHNfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotLyogRklYTUU/Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUENSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUxISTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMTE87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1NXSVRDSDsKLSAgICAgIGJyZWFrOwotKi8KLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUlZBOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJmhvd3RvX3RhYmxlW21pcHNfdHlwZV07Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIHN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgcGFpcl9wcmV2OwotICBSRUxPQyAqcmVsb2Nfc3JjID0gKFJFTE9DICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIGRzdDsKLQotICByZWxvY19kc3QtPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopcmVsb2Nfc3JjLT5yX3ZhZGRyKTsKLSAgcmVsb2NfZHN0LT5yX3N5bW5keCA9Ci0gICAgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3N5bW5keCk7Ci0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfdHlwZSk7Ci0gIHJlbG9jX2RzdC0+cl9zaXplID0gMDsKLSAgcmVsb2NfZHN0LT5yX2V4dGVybiA9IDA7Ci0gIHJlbG9jX2RzdC0+cl9vZmZzZXQgPSAwOwotCi0gIHN3aXRjaCAocmVsb2NfZHN0LT5yX3R5cGUpCi0gIHsKLSAgY2FzZSBNSVBTX1JfUkVGSEk6Ci0gICAgcGFpcl9wcmV2ID0gKnJlbG9jX2RzdDsKLSAgICBicmVhazsKLSAgY2FzZSBNSVBTX1JfUEFJUjoKLSAgICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gcmVsb2NfZHN0LT5yX3N5bW5keDsKLSAgICBpZiAocmVsb2NfZHN0LT5yX29mZnNldCAmIDB4ODAwMCkKLSAgICAgIHJlbG9jX2RzdC0+cl9vZmZzZXQgLT0gMHgxMDAwMDsKLSAgICAvKnByaW50ZigiZGo6IHBhaXIgb2Zmc2V0IGlzICUwOHhcbiIsIHJlbG9jX2RzdC0+cl9vZmZzZXQpOyovCi0gICAgcmVsb2NfZHN0LT5yX3N5bW5keCA9IHBhaXJfcHJldi5yX3N5bW5keDsKLSAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1taXBzX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJc3JjOwotICAgICBQVFIJZHN0OwotewotICBzdGF0aWMgaW50IHByZXZfb2Zmc2V0ID0gMTsKLSAgc3RhdGljIGJmZF92bWEgcHJldl9hZGRyID0gMDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0KLSAgc3dpdGNoIChyZWxvY19zcmMtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNSVBTX1JfUkVGSEk6Ci0gICAgICBwcmV2X2FkZHIgPSByZWxvY19zcmMtPnJfdmFkZHI7Ci0gICAgICBwcmV2X29mZnNldCA9IHJlbG9jX3NyYy0+cl9vZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1JUFNfUl9SRUZMTzoKLSAgICAgIGlmIChyZWxvY19zcmMtPnJfdmFkZHIgPT0gcHJldl9hZGRyKQotCXsKLQkgIC8qIEZJWE1FOiBvbmx5IHNsaWdodGx5IGhhY2tpc2guICBJZiB3ZSBzZWUgYSBSRUZMTyBwb2ludGluZyB0bwotCSAgICAgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIFJFRkhJLCB3ZSBhc3N1bWUgdGhpcyBpcyB0aGUgbWF0Y2hpbmcKLQkgICAgIFBBSVIgcmVsb2MgYW5kIG91dHB1dCBpdCBhY2NvcmRpbmdseS4gIFRoZSBzeW1uZHggaXMgcmVhbGx5Ci0JICAgICB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCAqLwotCSAgYmZkX2hfcHV0XzMyIChhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3ZhZGRyKTsKLQkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwKLQkJCShiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc3ltbmR4KTsKLQotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIE1JUFNfUl9QQUlSLCAoYmZkX2J5dGUgKikKLQkJICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQkgIHJldHVybiBSRUxTWjsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl92YWRkciwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfc3ltbmR4LCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3N5bW5keCk7Ci0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotICByZXR1cm4gUkVMU1o7Ci19Ci0KLSNkZWZpbmUgY29mZl9zd2FwX3JlbG9jX2luIG1pcHNfc3dhcF9yZWxvY19pbgotI2RlZmluZSBjb2ZmX3N3YXBfcmVsb2Nfb3V0IG1pcHNfc3dhcF9yZWxvY19vdXQKLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfbWlwc19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJvb2xlYW4gZ290X2xvOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gIHsKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiXAotJXM6IGBsZCAtcicgbm90IHN1cHBvcnRlZCB3aXRoIFBFIE1JUFMgb2JqZWN0c1xuIiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotI2lmIDAKLSAgcHJpbnRmKCJkajogcmVsb2NhdGUgJXMoJXMpICUwOHhcbiIsCi0JIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yIChpID0gMDsgcmVsIDwgcmVsX2VuZDsgcmVsKyssIGkrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kID0gMDsKLSAgICAgIGJmZF92bWEgdmFsLCB0bXAsIHRhcmcsIHNyYywgbG93OwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBjaGFyICptZW0gPSBjb250ZW50cyArIHJlbC0+cl92YWRkcjsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JewotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBzcmMgPSByZWwtPnJfdmFkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotI2lmIDAKLSAgICAgIHByaW50ZigiZGo6IHJlbG9jICUwMnggJS04cyBhPSUwOHgvJTA4eCglMDh4KSB2PSUwOHgrJTA4eCAlc1xuIiwKLQkgICAgIHJlbC0+cl90eXBlLCBob3d0b190YWJsZVtyZWwtPnJfdHlwZV0ubmFtZSwKLQkgICAgIHNyYywgcmVsLT5yX3ZhZGRyLCAqKHVuc2lnbmVkIGxvbmcgKiltZW0sIHZhbCwgcmVsLT5yX29mZnNldCwKLQkgICAgIGg/aC0+cm9vdC5yb290LnN0cmluZzoiKG5vbmUpIik7Ci0jZW5kaWYKLQotICAgICAgLyogT0ssIGF0IHRoaXMgcG9pbnQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHNldCB1cDoKLQkgICBzcmMgPSBWTUEgb2YgdGhlIG1lbW9yeSB3ZSdyZSBmaXhpbmcgdXAKLQkgICBtZW0gPSBwb2ludGVyIHRvIG1lbW9yeSB3ZSdyZSBmaXhpbmcgdXAKLQkgICB2YWwgPSBWTUEgb2Ygd2hhdCB3ZSBuZWVkIHRvIHJlZmVyIHRvCi0gICAgICAqLwotCi0jZGVmaW5lIFVJKHgpICgqX2JmZF9lcnJvcl9oYW5kbGVyKShfKCIlczogdW5pbXBsZW1lbnRlZCAlc1xuIiksIFwKLQkJCQkgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgeCk7IFwKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSBNSVBTX1JfQUJTT0xVVEU6Ci0JICAvKiBpZ25vcmUgdGhlc2UgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUkVGSEFMRjoKLQkgIFVJKCJyZWZoYWxmIik7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1JFRldPUkQ6Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIC8qIHByaW50ZigicmVmd29yZDogc3JjPSUwOHggdGFyZz0lMDh4KyUwOHhcbiIsIHNyYywgdG1wLCB2YWwpOyAqLwotCSAgdG1wICs9IHZhbDsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX0pNUEFERFI6Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIHRhcmcgPSB2YWwgKyAodG1wJjB4MDNmZmZmZmYpKjQ7Ci0JICBpZiAoKHNyYyAmIDB4ZjAwMDAwMDApICE9ICh0YXJnICYgMHhmMDAwMDAwMCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGp1bXAgdG9vIGZhciBhd2F5XG4iKSwKLQkJCQkgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICB0bXAgJj0gMHhmYzAwMDAwMDsKLQkgIHRtcCB8PSAodGFyZy80KSAmIDB4M2ZmZmZmZjsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1JFRkhJOgotCSAgdG1wID0gYmZkX2dldF8zMihpbnB1dF9iZmQsIG1lbSk7Ci0JICBzd2l0Y2ggKHJlbFsxXS5yX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBNSVBTX1JfUEFJUjoKLQkgICAgICAvKiBNUyBQRSBvYmplY3QgKi8KLQkgICAgICB0YXJnID0gdmFsICsgcmVsWzFdLnJfb2Zmc2V0ICsgKCh0bXAgJiAweGZmZmYpIDw8IDE2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNSVBTX1JfUkVGTE86Ci0JICAgICAgLyogR05VIENPRkYgb2JqZWN0ICovCi0JICAgICAgbG93ID0gYmZkX2dldF8zMihpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsWzFdLnJfdmFkZHIpOwotCSAgICAgIGxvdyAmPSAweGZmZmY7Ci0JICAgICAgaWYgKGxvdyAmIDB4ODAwMCkKLQkJbG93IC09IDB4MTAwMDA7Ci0JICAgICAgdGFyZyA9IHZhbCArIGxvdyArICgodG1wICYgMHhmZmZmKSA8PCAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpKF8oIiVzOiBiYWQgcGFpci9yZWZsbyBhZnRlciByZWZoaVxuIiksCi0JCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgdG1wICY9IDB4ZmZmZjAwMDA7Ci0JICB0bXAgfD0gKHRhcmcgPj4gMTYpICYgMHhmZmZmOwotCSAgYmZkX3B1dF8zMihpbnB1dF9iZmQsIHRtcCwgbWVtKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUkVGTE86Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIHRhcmcgPSB2YWwgKyAodG1wICYgMHhmZmZmKTsKLQkgIC8qIHByaW50ZigicmVmd29yZDogc3JjPSUwOHggdGFyZz0lMDh4XG4iLCBzcmMsIHRhcmcpOyAqLwotCSAgdG1wICY9IDB4ZmZmZjAwMDA7Ci0JICB0bXAgfD0gdGFyZyAmIDB4ZmZmZjsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX0dQUkVMOgotCWNhc2UgTUlQU19SX0xJVEVSQUw6Ci0JICBVSSgiZ3ByZWwiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDVElPTjoKLQkgIFVJKCJzZWN0aW9uIik7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1NFQ1JFTDoKLQkgIFVJKCJzZWNyZWwiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDUkVMTE86Ci0JICBVSSgic2VjcmVsbG8iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDUkVMSEk6Ci0JICBVSSgic2VjcmVsaGkiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUlZBOgotCSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBtZW0pOwotCSAgLyogcHJpbnRmKCJydmE6IHNyYz0lMDh4IHRhcmc9JTA4eCslMDh4XG4iLCBzcmMsIHRtcCwgdmFsKTsgKi8KLQkgIHRtcCArPSB2YWwKLQkgICAgLSBwZV9kYXRhIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1BBSVI6Ci0JICAvKiBpZ25vcmUgdGhlc2UgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfbWlwc19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotCi0vKiBJZiBtaXBzIGdjYyB1c2VzIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMsIHRoZW4gaXQgZG9lcyBub3QgdXNlCi0gICBhIGxlYWRpbmcgZG90IGZvciBsb2NhbCBsYWJlbHMsIHNvIGlmIFRBUkdFVF9VTkRFUlNDT1JFIGlzIGRlZmluZWQKLSAgIHdlIHRyZWF0IGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggTCBhcyBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbWlwc19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWlwc19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9taXBzX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2VuZGlmIC8qIFRBUkdFVF9VTkRFUlNDT1JFICovCi0KLSNkZWZpbmUgQ09GRl9OT19IQUNLX1NDTkhEUl9TSVpFCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIG1pcHNscGVfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgInBlLW1pcHMiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3BlLXBwYy5jIGIvYmZkL3BlLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRhNTQ3Li4wMDAwMDAwCi0tLSBhL2JmZC9wZS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgRV9GSUxFTk1MRU4gICAgIDE4Ci0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlLXBvd2VycGNsZSIKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgIGJmZF9wb3dlcnBjX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogRklYTUU6IHZlcmlmeSBQQ1JFTE9GRlNFVCBpcyBhbHdheXMgZmFsc2UgKi8KLQotLyogRklYTUU6IFRoaXMgdGFyZ2V0IG5vIGxvbmdlciB3b3Jrcy4gIFNlYXJjaCBmb3IgUE9XRVJQQ19MRV9QRSBpbgotICAgY29mZi1wcGMuYyBhbmQgcGVpZ2VuLmMuICAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1zaC5jIGIvYmZkL3BlLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDhiMGUuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNIIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIFRBUkdFVF9TSExfU1lNIHNobHBlX3ZlYwotI2RlZmluZSBUQVJHRVRfU0hMX05BTUUgInBlLXNobCIKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLXNoLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWFybS5jIGIvYmZkL3BlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhZTAxZS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcm0gUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfTElUVExFX1NZTQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgYXJtcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgIGFybXBlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1pMzg2LmMgYi9iZmQvcGVpLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLWkzODYiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuaWRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5wZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWNvcmUuYyBiL2JmZC9wZWktbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjM2I5NS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1Db3JlIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBtY29yZV9wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGVpLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlaS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgTUNPUkVfUEUKLQotI2luY2x1ZGUgImNvZmYtbWNvcmUuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWlwcy5jIGIvYmZkL3BlaS1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmQzNWQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1JUFMgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIG1pcHNscGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLW1pcHMiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJwZS1taXBzLmMiCi0KLQotCmRpZmYgLS1naXQgYS9iZmQvcGVpLXBwYy5jIGIvYmZkL3BlaS1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMWE1ZC4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0vKiBzZXR0aW5nIHVwIGZvciBhIFBFIGVudmlyb25tZW50IHN0b2xlbiBkaXJlY3RseSBmcm9tIHRoZSBpMzg2IHN0cnVjdHVyZSAqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotI2RlZmluZSBQUENfUEUKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlaS1wb3dlcnBjbGUiCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICBiZmRfcG93ZXJwY19wZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLS8qIEZJWE1FOiBWZXJpZnkgUENSRUxPRkZTRVQgaXMgYWx3YXlzIGZhbHNlICovCi0KLS8qIEZJWE1FOiBUaGlzIHRhcmdldCBubyBsb25nZXIgd29ya3MuICBTZWFyY2ggZm9yIFBPV0VSUENfTEVfUEUgaW4KLSAgIGNvZmYtcHBjLmMgYW5kIHBlaWdlbi5jLiAgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLXNoLmMgYi9iZmQvcGVpLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjhiMWMuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTSCBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TSExfU1lNIHNobHBlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX1NITF9OQU1FICJwZWktc2hsIgotI2RlZmluZSBJTUFHRV9CQVNFIE5UX0lNQUdFX0JBU0UKLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICdfJwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zaC5jIgotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL3BlaWNvZGUuaCBiL2JmZC9wZWljb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNThhZDAuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjcgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgUEUvUEVJLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLQotUEUvUEVJIHJlYXJyYW5nZW1lbnQgKGFuZCBjb2RlIGFkZGVkKTogRG9ubiBUZXJyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpbmNsdWRlICJsaWJwZWkuaCIKLQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgTlVMTDsKLSNlbHNlCi0gICAgIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGE7Ci0jdW5kZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICAgICBOVUxMOwotI2Vsc2UKLSAgICAgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgY29mZl9zd2FwX2ZpbGVoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc2NuaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIGJvb2xlYW4gcGVfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgcGVfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhdGljIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBJTEYgY29kZS4gICovCi10eXBlZGVmIGFzZWN0aW9uICogYXNlY3Rpb25fcHRyOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmQgKgkJCWFiZmQ7Ci0gIGJmZF9ieXRlICoJCWRhdGE7Ci0gIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICogYmltOwotICB1bnNpZ25lZCBzaG9ydCAgICAgICAgbWFnaWM7Ci0gIAotICBhcmVsZW50ICoJCXJlbHRhYjsKLSAgdW5zaWduZWQgaW50IAkJcmVsY291bnQ7Ci0KLSAgY29mZl9zeW1ib2xfdHlwZSAqIAlzeW1fY2FjaGU7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiAJc3ltX3B0cjsKLSAgdW5zaWduZWQgaW50ICAgICAgIAlzeW1faW5kZXg7Ci0gIAotICB1bnNpZ25lZCBpbnQgKiAJc3ltX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgKiAJdGFibGVfcHRyOwotICAKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqIG5hdGl2ZV9zeW1zOwotICBjb21iaW5lZF9lbnRyeV90eXBlICogbmF0aXZlX3B0cjsKLQotICBjb2ZmX3N5bWJvbF90eXBlICoqCXN5bV9wdHJfdGFibGU7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKioJc3ltX3B0cl9wdHI7Ci0gIAotICB1bnNpZ25lZCBpbnQJCXNlY19pbmRleDsKLQotICBjaGFyICogICAgICAgICAgICAgICAgc3RyaW5nX3RhYmxlOwotICBjaGFyICogICAgICAgICAgICAgICAgc3RyaW5nX3B0cjsKLSAgY2hhciAqCQllbmRfc3RyaW5nX3B0cjsKLSAgCi0gIFNZTUVOVCAqICAgICAgICAgICAgICBlc3ltX3RhYmxlOwotICBTWU1FTlQgKiAgICAgICAgICAgICAgZXN5bV9wdHI7Ci0KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogaW50X3JlbHRhYjsKLX0KLXBlX0lMRl92YXJzOwotCi1zdGF0aWMgYXNlY3Rpb25fcHRyICAgICAgIHBlX0lMRl9tYWtlX2Ffc2VjdGlvbiAgIFBBUkFNUyAoKHBlX0lMRl92YXJzICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBmbGFnd29yZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfbWFrZV9hX3JlbG9jICAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBiZmRfdm1hLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGFzZWN0aW9uX3B0cikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfbWFrZV9hX3N5bWJvbCAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYXNlY3Rpb25fcHRyLCBmbGFnd29yZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfc2F2ZV9yZWxvY3MgICAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBhc2VjdGlvbl9wdHIpKTsKLXN0YXRpYyB2b2lkCQkgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBiZmRfdm1hLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsCSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICBwZV9JTEZfYnVpbGRfYV9iZmQgICAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgc2hvcnQsIGJmZF9ieXRlICosIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHBlX0lMRl9vYmplY3RfcCAgICAgICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHBlX2JmZF9vYmplY3RfcCAJICBQQVJBTVMgKChiZmQgKikpOwotI2VuZGlmIC8qIENPRkZfSU1BR0VfV0lUSF9QRSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBOT19DT0ZGX1JFTE9DUwotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0jZW5kaWYgLyogbm90IE5PX0NPRkZfUkVMT0NTICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBzcmM7Ci0gICAgIFBUUgkgICAgIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfbWFnaWMpOwotICBmaWxlaGRyX2RzdC0+Zl9uc2NucyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnNjbnMpOwotICBmaWxlaGRyX2RzdC0+Zl90aW1kYXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RpbWRhdCk7Ci0KLSAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zeW1zKTsKLSAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX2ZsYWdzKTsKLSAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfc3ltcHRyKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAvKiBUaGVyZSBhcmUgcmVhbGx5IHR3byBtYWdpYyBudW1iZXJzIGludm9sdmVkOyB0aGUgbWFnaWMgbnVtYmVyCi0gICAgIHRoYXQgc2F5cyB0aGlzIGlzIGEgTlQgZXhlY3V0YWJsZSAoUEVJKSBhbmQgdGhlIG1hZ2ljIG51bWJlciB0aGF0Ci0gICAgIGRldGVybWluZXMgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBmb3JtZXIgaXMgRE9TTUFHSUMsIHN0b3JlZCBpbgotICAgICB0aGUgZV9tYWdpYyBmaWVsZC4gIFRoZSBsYXR0ZXIgaXMgc3RvcmVkIGluIHRoZSBmX21hZ2ljIGZpZWxkLgotICAgICBJZiB0aGUgTlQgbWFnaWMgbnVtYmVyIGlzbid0IHZhbGlkLCB0aGUgYXJjaGl0ZWN0dXJlIG1hZ2ljIG51bWJlcgotICAgICBjb3VsZCBiZSBtaW1pY2tlZCBieSBzb21lIG90aGVyIGZpZWxkIChzcGVjaWZpY2FsbHksIHRoZSBudW1iZXIKLSAgICAgb2YgcmVsb2NzIGluIHNlY3Rpb24gMykuICBTaW5jZSB0aGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkCi0gICAgIGNvcnJlY3RseSBmb3IgYSBQRUkgZmlsZSwgY2hlY2sgdGhlIGVfbWFnaWMgbnVtYmVyIGhlcmUsIGFuZCwgaWYKLSAgICAgaXQgZG9lc24ndCBtYXRjaCwgY2xvYmJlciB0aGUgZl9tYWdpYyBudW1iZXIgc28gdGhhdCB3ZSBkb24ndCBnZXQKLSAgICAgYSBmYWxzZSBtYXRjaC4gICovCi0gIGlmIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+ZV9tYWdpYykgIT0gRE9TTUFHSUMpCi0gICAgZmlsZWhkcl9kc3QtPmZfbWFnaWMgPSAtMTsKLSNlbmRpZgotCi0gIC8qIE90aGVyIHBlb3BsZSdzIHRvb2xzIHNvbWV0aW1lcyBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggYW4gbnN5bXMgYnV0Ci0gICAgIGEgemVybyBzeW1wdHIuICAqLwotICBpZiAoZmlsZWhkcl9kc3QtPmZfbnN5bXMgIT0gMCAmJiBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IDA7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBfYmZkX3BlaV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQKLSNlbHNlCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBfYmZkX3BlX29ubHlfc3dhcF9maWxlaGRyX291dAotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsIGV4dCwgaW4pCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBleHQ7Ci0gICAgIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLQotICAvKiBNUyBoYW5kbGVzIG92ZXJmbG93IG9mIGxpbmUgbnVtYmVycyBieSBjYXJyeWluZyBpbnRvIHRoZSByZWxvYwotICAgICBmaWVsZCAoaXQgYXBwZWFycykuICBTaW5jZSBpdCdzIHN1cHBvc2VkIHRvIGJlIHplcm8gZm9yIFBFCi0gICAgICpJTUFHRSogZm9ybWF0LCB0aGF0J3Mgc2FmZS4gIFRoaXMgaXMgc3RpbGwgYSBiaXQgaWZmeS4gICovCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIHNjbmhkcl9pbnQtPnNfbmxubm8gPQotICAgIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKQotICAgICArIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYykgPDwgMTYpKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPSAwOwotI2Vsc2UKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIHNjbmhkcl9pbnQtPnNfbmxubm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsCi0JCQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotI2VuZGlmCi0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfdmFkZHIgIT0gMCkgCi0gICAgewotICAgICAgc2NuaGRyX2ludC0+c192YWRkciArPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICAgIHNjbmhkcl9pbnQtPnNfdmFkZHIgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9OT19IQUNLX1NDTkhEUl9TSVpFCi0gIC8qIElmIHRoaXMgc2VjdGlvbiBob2xkcyB1bmluaXRpYWxpemVkIGRhdGEsIHVzZSB0aGUgdmlydHVhbCBzaXplCi0gICAgIChzdG9yZWQgaW4gc19wYWRkcikgaW5zdGVhZCBvZiB0aGUgcGh5c2ljYWwgc2l6ZS4gICovCi0gIGlmICgoc2NuaGRyX2ludC0+c19mbGFncyAmIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKSAhPSAwKQotICAgIHsKLSAgICAgIHNjbmhkcl9pbnQtPnNfc2l6ZSA9IHNjbmhkcl9pbnQtPnNfcGFkZHI7Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBzZXQgc2NuaGRyX2ludC0+c19wYWRkciB0byAwLiAgSG93ZXZlciwKLSAgICAgICAgIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIHN0b3JlcyBzX3BhZGRyIGluIHZpcnRfc2l6ZSwgd2hpY2gKLSAgICAgICAgIG9ubHkgd29ya3MgaWYgaXQgY29ycmVjdGx5IGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlCi0gICAgICAgICBzZWN0aW9uLiAgKi8KLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBwZV9kYXRhX3R5cGUgKnBlOwotICBhYmZkLT50ZGF0YS5wZV9vYmpfZGF0YSA9IAotICAgIChzdHJ1Y3QgcGVfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChwZV9kYXRhX3R5cGUpKTsKLQotICBpZiAoYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGUgPSBwZV9kYXRhIChhYmZkKTsKLQotICBwZS0+Y29mZi5wZSA9IDE7Ci0KLSAgLyogaW5fcmVsb2NfcCBpcyBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LiAgKi8KLSAgcGUtPmluX3JlbG9jX3AgPSBpbl9yZWxvY19wOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotc3RhdGljIFBUUgotcGVfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHBlX2RhdGFfdHlwZSAqcGU7Ci0KLSAgaWYgKHBlX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBwZS0+Y29mZi5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbAotICAgICB0YWJsZSB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycKLSAgICAgdW5mb3J0dW5hdGVseSB2YXJ5IGFtb25nIGNvZmYgaW1wbGVtZW50YXRpb25zLi4uICAqLwotICBwZS0+Y29mZi5sb2NhbF9uX2J0bWFzayA9IE5fQlRNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX2J0c2hmdCA9IE5fQlRTSEZUOwotICBwZS0+Y29mZi5sb2NhbF9uX3RtYXNrID0gTl9UTUFTSzsKLSAgcGUtPmNvZmYubG9jYWxfbl90c2hpZnQgPSBOX1RTSElGVDsKLSAgcGUtPmNvZmYubG9jYWxfc3ltZXN6ID0gU1lNRVNaOwotICBwZS0+Y29mZi5sb2NhbF9hdXhlc3ogPSBBVVhFU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2xpbmVzeiA9IExJTkVTWjsKLQotICBwZS0+Y29mZi50aW1lc3RhbXAgPSBpbnRlcm5hbF9mLT5mX3RpbWRhdDsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPQotICAgIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0KLSAgICAgIGludGVybmFsX2YtPmZfbnN5bXM7Ci0KLSAgcGUtPnJlYWxfZmxhZ3MgPSBpbnRlcm5hbF9mLT5mX2ZsYWdzOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRExMKSAhPSAwKQotICAgIHBlLT5kbGwgPSAxOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQpID09IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0RFQlVHOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIGlmIChhb3V0aGRyKSAKLSAgICBwZS0+cGVfb3B0aGRyID0gKChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHIpLT5wZTsKLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmX2RhdGEgKGFiZmQpIC0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotICByZXR1cm4gKFBUUikgcGU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLQotICBpZiAoIV9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGFiZmQsIHZmaWxlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGlmICghX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoaWJmZCwgb2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBjb2ZmX2dldF9zeW1ib2xfaW5mbyBfYmZkX3BlX2dldF9zeW1ib2xfaW5mbwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0MCi0vKiBDb2RlIHRvIGhhbmRsZSBNaWNyb3NvZnQncyBJbWFnZSBMaWJyYXJ5IEZvcm1hdC4KLSAgIEFsc28ga25vd24gYXMgTElOSzYgZm9ybWF0LgotICAgRG9jdW1lbnRhdGlvbiBhYm91dCB0aGlzIGZvcm1hdCBjYW4gYmUgZm91bmQgYXQ6IAotCi0gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvc3BlY3MvcGVjb2ZmX3NlY3Rpb244Lmh0bSAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZGF0YQotICAgc3RydWN0dXJlcyB0aGF0IHdlIGhhdmUgdG8gY3JlYXRlIGluIG9yZGVyIHRvIGJ1aWxkIGEgYmZkIGRlc2NyaWJpbmcKLSAgIGFuIElMRiBvYmplY3QgZmlsZS4gIFRoZSBmaW5hbCAiKyAxIiBpbiB0aGUgZGVmaW5pdGlvbnMgb2YgU0laRU9GX0lEQVRBNgotICAgYW5kIFNJWkVPRl9JREFUQTcgYmVsb3cgaXMgdG8gYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHdlIG1pZ2h0Ci0gICBuZWVkIGEgcGFkZGluZyBieXRlIGluIG9yZGVyIHRvIGVuc3VyZSAxNiBiaXQgYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbidzCi0gICBjb250ZW50cy4KLQotICAgVGhlIHZhbHVlIGZvciBTSVpFT0ZfSUxGX1NUUklOR1MgaXMgY29tcHV0ZWQgYXMgZm9sbG93czoKLQotICAgICAgVGhlcmUgd2lsbCBiZSBOVU1fSUxGX1NFQ1RJT05TIHNlY3Rpb24gc3ltYm9scy4gIEFsbG93IDkgY2hhcmFjdGVycwotICAgICAgcGVyIHN5bWJvbCBmb3IgdGhlaXIgbmFtZXMgKGxvbmdlc3Qgc2VjdGlvbiBuYW1lIGlzIC5pZGF0YSR4KS4KLQotICAgICAgVGhlcmUgd2lsbCBiZSB0d28gc3ltYm9scyBmb3IgdGhlIGltcG9ydGVkIHZhbHVlLCBvbmUgdGhlIHN5bWJvbCBuYW1lCi0gICAgICBhbmQgb25lIHdpdGggX2ltcF9fIHByZWZpeGVkLiAgQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hdGluZyBudWwncyB0aGlzCi0gICAgICBpcyBzdHJsZW4gKHN5bWJvbF9uYW1lKSAqIDIgKyA4ICsgMjEgKyBzdHJsZW4gKHNvdXJjZV9kbGwpLgotCi0gICAgICBUaGUgc3RyaW5ncyBpbiB0aGUgc3RyaW5nIHRhYmxlIG11c3Qgc3RhcnQgU1RSSU5HX19TSVpFX1NJWkUgYnl0ZXMgaW50bwotICAgICAgdGhlIHRhYmxlIGluIG9yZGVyIHRvIGZvciB0aGUgc3RyaW5nIGxvb2t1cCBjb2RlIGluIGNvZmZnZW4vY29mZmNvZGUgdG8KLSAgICAgIHdvcmsuICAqLwotI2RlZmluZSBOVU1fSUxGX1JFTE9DUwkJOAotI2RlZmluZSBOVU1fSUxGX1NFQ1RJT05TICAgICAgICA2Ci0jZGVmaW5lIE5VTV9JTEZfU1lNUyAJCSgyICsgTlVNX0lMRl9TRUNUSU9OUykKLSAgCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNUwkJKE5VTV9JTEZfU1lNUyAqIHNpemVvZiAoKiB2YXJzLnN5bV9jYWNoZSkpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNX1RBQkxFCShOVU1fSUxGX1NZTVMgKiBzaXplb2YgKCogdmFycy5zeW1fdGFibGUpKQotI2RlZmluZSBTSVpFT0ZfSUxGX05BVElWRV9TWU1TCShOVU1fSUxGX1NZTVMgKiBzaXplb2YgKCogdmFycy5uYXRpdmVfc3ltcykpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNX1BUUl9UQUJMRSAoTlVNX0lMRl9TWU1TICogc2l6ZW9mICgqIHZhcnMuc3ltX3B0cl90YWJsZSkpCi0jZGVmaW5lIFNJWkVPRl9JTEZfRVhUX1NZTVMJKE5VTV9JTEZfU1lNUyAqIHNpemVvZiAoKiB2YXJzLmVzeW1fdGFibGUpKQotI2RlZmluZSBTSVpFT0ZfSUxGX1JFTE9DUwkoTlVNX0lMRl9SRUxPQ1MgKiBzaXplb2YgKCogdmFycy5yZWx0YWIpKQotI2RlZmluZSBTSVpFT0ZfSUxGX0lOVF9SRUxPQ1MJKE5VTV9JTEZfUkVMT0NTICogc2l6ZW9mICgqIHZhcnMuaW50X3JlbHRhYikpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1RSSU5HUwkoc3RybGVuIChzeW1ib2xfbmFtZSkgKiAyICsgOCBcCi0JCQkJCSsgMjEgKyBzdHJsZW4gKHNvdXJjZV9kbGwpIFwKLQkJCQkJKyBOVU1fSUxGX1NFQ1RJT05TICogOSBcCi0JCQkJCSsgU1RSSU5HX1NJWkVfU0laRSkKLSNkZWZpbmUgU0laRU9GX0lEQVRBMgkJKDUgKiA0KQotI2RlZmluZSBTSVpFT0ZfSURBVEE0CQkoMSAqIDQpCi0jZGVmaW5lIFNJWkVPRl9JREFUQTUJCSgxICogNCkKLSNkZWZpbmUgU0laRU9GX0lEQVRBNgkJKDIgKyBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDEgKyAxKQotI2RlZmluZSBTSVpFT0ZfSURBVEE3CQkoc3RybGVuIChzb3VyY2VfZGxsKSArIDEgKyAxKQotI2RlZmluZSBTSVpFT0ZfSUxGX1NFQ1RJT05TICAgICAoTlVNX0lMRl9TRUNUSU9OUyAqIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpCi0gIAotI2RlZmluZSBJTEZfREFUQV9TSVpFCQkJCVwKLSAgICAgIHNpemVvZiAoKiB2YXJzLmJpbSkJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX1NZTVMJCQkJXAotICAgICsgU0laRU9GX0lMRl9TWU1fVEFCTEUJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX05BVElWRV9TWU1TCQkJXAotICAgICsgU0laRU9GX0lMRl9TWU1fUFRSX1RBQkxFCQkJXAotICAgICsgU0laRU9GX0lMRl9FWFRfU1lNUwkJCVwKLSAgICArIFNJWkVPRl9JTEZfUkVMT0NTCQkJCVwKLSAgICArIFNJWkVPRl9JTEZfSU5UX1JFTE9DUwkJCVwKLSAgICArIFNJWkVPRl9JTEZfU1RSSU5HUwkJCVwKLSAgICArIFNJWkVPRl9JREFUQTIJCQkJXAotICAgICsgU0laRU9GX0lEQVRBNAkJCQlcCi0gICAgKyBTSVpFT0ZfSURBVEE1CQkJCVwKLSAgICArIFNJWkVPRl9JREFUQTYJCQkJXAotICAgICsgU0laRU9GX0lEQVRBNwkJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX1NFQ1RJT05TCQkJXAotICAgICsgTUFYX1RFWFRfU0VDVElPTl9TSVpFCi0KLQotLyogQ3JlYXRlIGFuIGVtcHR5IHJlbG9jYXRpb24gYWdhaW5zdCB0aGUgZ2l2ZW4gc3ltYm9sLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3N5bWJvbF9yZWxvYyAocGVfSUxGX3ZhcnMgKiAgICAgICAgICAgICAgICAgdmFycywKLQkJCSAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotCQkJICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICAgIHJlbG9jLAotCQkJICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiogIHN5bSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICBzeW1faW5kZXgpCi17Ci0gIGFyZWxlbnQgKiBlbnRyeTsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogaW50ZXJuYWw7Ci0KLSAgZW50cnkgPSB2YXJzLT5yZWx0YWIgKyB2YXJzLT5yZWxjb3VudDsKLSAgaW50ZXJuYWwgPSB2YXJzLT5pbnRfcmVsdGFiICsgdmFycy0+cmVsY291bnQ7Ci0gIAotICBlbnRyeS0+YWRkcmVzcyAgICAgPSBhZGRyZXNzOwotICBlbnRyeS0+YWRkZW5kICAgICAgPSAwOwotICBlbnRyeS0+aG93dG8gICAgICAgPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHZhcnMtPmFiZmQsIHJlbG9jKTsKLSAgZW50cnktPnN5bV9wdHJfcHRyID0gc3ltOwotCi0gIGludGVybmFsLT5yX3ZhZGRyICA9IGFkZHJlc3M7Ci0gIGludGVybmFsLT5yX3N5bW5keCA9IHN5bV9pbmRleDsKLSAgaW50ZXJuYWwtPnJfdHlwZSAgID0gZW50cnktPmhvd3RvLT50eXBlOwotI2lmIDAgIC8qIFRoZXNlIGZpZWxkcyBkbyBub3QgbmVlZCB0byBiZSBpbml0aWFsaXNlZC4gICovCi0gIGludGVybmFsLT5yX3NpemUgICA9IDA7Ci0gIGludGVybmFsLT5yX2V4dGVybiA9IDA7Ci0gIGludGVybmFsLT5yX29mZnNldCA9IDA7Ci0jZW5kaWYKLSAgCi0gIHZhcnMtPnJlbGNvdW50ICsrOwotICAKLSAgQkZEX0FTU0VSVCAodmFycy0+cmVsY291bnQgPD0gTlVNX0lMRl9SRUxPQ1MpOwotfQotCi0vKiBDcmVhdGUgYW4gZW1wdHkgcmVsb2NhdGlvbiBhZ2FpbnN0IHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3JlbG9jIChwZV9JTEZfdmFycyAqICAgICAgICAgICAgIHZhcnMsCi0JCSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotCQkgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgcmVsb2MsCi0JCSAgICAgYXNlY3Rpb25fcHRyICAgICAgICAgICAgICBzZWMpCi17Ci0gIHBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICh2YXJzLCBhZGRyZXNzLCByZWxvYywgc2VjLT5zeW1ib2xfcHRyX3B0ciwKLQkJCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhICh2YXJzLT5hYmZkLCBzZWMpLT5pKTsKLX0KLQotLyogTW92ZSB0aGUgcXVldWVkIHJlbG9jcyBpbnRvIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfc2F2ZV9yZWxvY3MgKHBlX0lMRl92YXJzICogdmFycywKLQkJICAgIGFzZWN0aW9uX3B0ciAgc2VjKQotewotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzb21ld2hlcmUgdG8gc3RvcmUgdGhlIGludGVybmFsIHJlbG9jcy4gICovCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAodmFycy0+YWJmZCwgc2VjKSA9PSBOVUxMKQotICAgIC8qIFdlIHNob3VsZCBwcm9iYWJseSByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBoZXJlLiAgKi8KLSAgICBhYm9ydCAoKTsKLQotICBjb2ZmX3NlY3Rpb25fZGF0YSAodmFycy0+YWJmZCwgc2VjKS0+cmVsb2NzID0gdmFycy0+aW50X3JlbHRhYjsKLSAgY29mZl9zZWN0aW9uX2RhdGEgKHZhcnMtPmFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKLQotICBzZWMtPnJlbG9jYXRpb24gID0gdmFycy0+cmVsdGFiOwotICBzZWMtPnJlbG9jX2NvdW50ID0gdmFycy0+cmVsY291bnQ7Ci0gIHNlYy0+ZmxhZ3MgICAgICB8PSBTRUNfUkVMT0M7Ci0KLSAgdmFycy0+cmVsdGFiICAgICArPSB2YXJzLT5yZWxjb3VudDsKLSAgdmFycy0+aW50X3JlbHRhYiArPSB2YXJzLT5yZWxjb3VudDsKLSAgdmFycy0+cmVsY291bnQgICA9IDA7Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopdmFycy0+aW50X3JlbHRhYiA8IChiZmRfYnl0ZSAqKXZhcnMtPnN0cmluZ190YWJsZSk7Ci19Ci0KLS8qIENyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgYW5kIGFkZCBpdCB0byB0aGUgcmVsZXZhbnQgdGFibGVzLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3N5bWJvbCAocGVfSUxGX3ZhcnMgKiAgdmFycywKLQkJICAgICAgY29uc3QgY2hhciAqICAgcHJlZml4LAotCQkgICAgICBjb25zdCBjaGFyICogICBzeW1ib2xfbmFtZSwKLQkJICAgICAgYXNlY3Rpb25fcHRyICAgc2VjdGlvbiwKLQkJICAgICAgZmxhZ3dvcmQgICAgICAgZXh0cmFfZmxhZ3MpCi17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBlbnQ7Ci0gIFNZTUVOVCAqIGVzeW07Ci0gIHVuc2lnbmVkIHNob3J0IHNjbGFzczsKLQotICBpZiAoZXh0cmFfZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgc2NsYXNzID0gQ19TVEFUOwotICBlbHNlCi0gICAgc2NsYXNzID0gQ19FWFQ7Ci0gIAotI2lmZGVmIFRIVU1CUEVNQUdJQyAgCi0gIGlmICh2YXJzLT5tYWdpYyA9PSBUSFVNQlBFTUFHSUMpCi0gICAgewotICAgICAgaWYgKGV4dHJhX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXNjbGFzcyA9IENfVEhVTUJFWFRGVU5DOwotICAgICAgZWxzZSBpZiAoZXh0cmFfZmxhZ3MgJiBCU0ZfTE9DQUwpCi0Jc2NsYXNzID0gQ19USFVNQlNUQVQ7Ci0gICAgICBlbHNlCi0Jc2NsYXNzID0gQ19USFVNQkVYVDsKLSAgICB9Ci0jZW5kaWYKLQotICBCRkRfQVNTRVJUICh2YXJzLT5zeW1faW5kZXggPCBOVU1fSUxGX1NZTVMpOwotICAKLSAgc3ltID0gdmFycy0+c3ltX3B0cjsKLSAgZW50ID0gdmFycy0+bmF0aXZlX3B0cjsKLSAgZXN5bSA9IHZhcnMtPmVzeW1fcHRyOwotCi0gIC8qIENvcHkgdGhlIHN5bWJvbCdzIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3ByaW50ZiAodmFycy0+c3RyaW5nX3B0ciwgIiVzJXMiLCBwcmVmaXgsIHN5bWJvbF9uYW1lKTsKLQotICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotICAgIHNlY3Rpb24gPSAoYXNlY3Rpb25fcHRyKSAmIGJmZF91bmRfc2VjdGlvbjsKLSAgCi0gIC8qIEluaXRpYWxpc2UgdGhlIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGJmZF9oX3B1dF8zMiAodmFycy0+YWJmZCwgdmFycy0+c3RyaW5nX3B0ciAtIHZhcnMtPnN0cmluZ190YWJsZSwgKGJmZF9ieXRlICopIGVzeW0tPmUuZS5lX29mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAodmFycy0+YWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4LCAoYmZkX2J5dGUgKikgZXN5bS0+ZV9zY251bSk7Ci0gIGVzeW0tPmVfc2NsYXNzWzBdID0gc2NsYXNzOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgaW5pdGlhbGlzYXRpb25zIGFyZSB1bm5lY2Vzc2FyeSAtIHRoZSBtZW1vcnkgaXMKLSAgICAgemVybyBpbml0aWFsaXNlZC4gIFRoZXkgYXJlIGp1c3Qga2VwdCBoZXJlIGFzIHJlbWluZGVycy4gICovCi0jaWYgMAotICBlc3ltLT5lLmUuZV96ZXJvZXMgPSAwOwotICBlc3ltLT5lX3ZhbHVlID0gMDsKLSAgZXN5bS0+ZV90eXBlID0gVF9OVUxMOwotICBlc3ltLT5lX251bWF1eCA9IDA7Ci0jZW5kaWYKLSAgCi0gIC8qIEluaXRpYWxpc2UgdGhlIGludGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUuICAqLwotICBlbnQtPnUuc3ltZW50Lm5fc2NsYXNzICAgICAgICAgID0gc2NsYXNzOwotICBlbnQtPnUuc3ltZW50Lm5fc2NudW0gICAgICAgICAgID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICBlbnQtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcpIHN5bTsKLSAgCi0jaWYgMCAvKiBTZWUgY29tbWVudCBhYm92ZS4gICovCi0gIGVudC0+dS5zeW1lbnQubl92YWx1ZSAgPSAwOwotICBlbnQtPnUuc3ltZW50Lm5fZmxhZ3MgID0gMDsKLSAgZW50LT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgZW50LT51LnN5bWVudC5uX251bWF1eCA9IDA7Ci0gIGVudC0+Zml4X3ZhbHVlICAgICAgICAgPSAwOwotI2VuZGlmCi0gIAotICBzeW0tPnN5bWJvbC50aGVfYmZkID0gdmFycy0+YWJmZDsKLSAgc3ltLT5zeW1ib2wubmFtZSAgICA9IHZhcnMtPnN0cmluZ19wdHI7Ci0gIHN5bS0+c3ltYm9sLmZsYWdzICAgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCB8IGV4dHJhX2ZsYWdzOwotICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbjsKLSAgc3ltLT5uYXRpdmUgICAgICAgICA9IGVudDsKLSAgCi0jaWYgMCAvKiBTZWUgY29tbWVudCBhYm92ZS4gICovCi0gIHN5bS0+c3ltYm9sLnZhbHVlICAgPSAwOwotICBzeW0tPnN5bWJvbC51ZGF0YS5pID0gMDsKLSAgc3ltLT5kb25lX2xpbmVubyAgICA9IGZhbHNlOwotICBzeW0tPmxpbmVubyAgICAgICAgID0gTlVMTDsKLSNlbmRpZgotICAKLSAgKiB2YXJzLT50YWJsZV9wdHIgPSB2YXJzLT5zeW1faW5kZXg7Ci0gICogdmFycy0+c3ltX3B0cl9wdHIgPSBzeW07Ci0gIAotICAvKiBBZGp1c3QgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHN5bWJvbC4gICovCi0gIHZhcnMtPnN5bV9pbmRleCArKzsKLSAgdmFycy0+c3ltX3B0ciArKzsKLSAgdmFycy0+c3ltX3B0cl9wdHIgKys7Ci0gIHZhcnMtPnRhYmxlX3B0ciArKzsKLSAgdmFycy0+bmF0aXZlX3B0ciArKzsKLSAgdmFycy0+ZXN5bV9wdHIgKys7Ci0gIHZhcnMtPnN0cmluZ19wdHIgKz0gc3RybGVuIChzeW1ib2xfbmFtZSkgKyBzdHJsZW4gKHByZWZpeCkgKyAxOwotCi0gIEJGRF9BU1NFUlQgKHZhcnMtPnN0cmluZ19wdHIgPCB2YXJzLT5lbmRfc3RyaW5nX3B0cik7Ci19Ci0KLS8qIENyZWF0ZSBhIHNlY3Rpb24uICAqLwotc3RhdGljIGFzZWN0aW9uX3B0cgotcGVfSUxGX21ha2VfYV9zZWN0aW9uIChwZV9JTEZfdmFycyAqIHZhcnMsCi0JCSAgICAgICBjb25zdCBjaGFyICogIG5hbWUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgIHNpemUsCi0JCSAgICAgICBmbGFnd29yZCAgICAgIGV4dHJhX2ZsYWdzKQotewotICBhc2VjdGlvbl9wdHIgc2VjOwotICBmbGFnd29yZCAgICAgZmxhZ3M7Ci0gIAotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHZhcnMtPmFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19LRUVQIHwgU0VDX0lOX01FTU9SWTsKLSAgCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAodmFycy0+YWJmZCwgc2VjLCBmbGFncyB8IGV4dHJhX2ZsYWdzKTsKLSAgICAgCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHZhcnMtPmFiZmQsIHNlYywgMik7Ci0gIAotICAvKiBDaGVjayB0aGF0IHdlIHdpbGwgbm90IHJ1biBvdXQgb2Ygc3BhY2UuICAqLwotICBCRkRfQVNTRVJUICh2YXJzLT5kYXRhICsgc2l6ZSA8IHZhcnMtPmJpbS0+YnVmZmVyICsgdmFycy0+YmltLT5zaXplKTsKLSAgCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBzaXplIGFuZCBjb250ZW50cy4gIFRoZSBhY3R1YWwKLSAgICAgY29udGVudHMgYXJlIGZpbGxlZCBpbiBieSBvdXIgcGFyZW50LiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHZhcnMtPmFiZmQsIHNlYywgc2l6ZSk7Ci0gIHNlYy0+Y29udGVudHMgPSB2YXJzLT5kYXRhOwotICBzZWMtPnRhcmdldF9pbmRleCA9IHZhcnMtPnNlY19pbmRleCArKzsKLQotICAvKiBBZHZhbmNlIGRhdGEgcG9pbnRlciBpbiB0aGUgdmFycyBzdHJ1Y3R1cmUuICAqLwotICB2YXJzLT5kYXRhICs9IHNpemU7Ci0gIAotICAvKiBTa2lwIHRoZSBwYWRkaW5nIGJ5dGUgaWYgaXQgd2FzIG5vdCBuZWVkZWQuCi0gICAgIFRoZSBsb2dpYyBoZXJlIGlzIHRoYXQgaWYgdGhlIHN0cmluZyBsZW5ndGggaXMgb2RkLAotICAgICB0aGVuIHRoZSBlbnRpcmUgc3RyaW5nIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBudWxsIGJ5dGUsCi0gICAgIGlzIGV2ZW4gYW5kIHNvIHRoZSBleHRyYSwgcGFkZGluZyBieXRlLCBpcyBub3QgbmVlZGVkLiAgKi8KLSAgaWYgKHNpemUgJiAxKQotICAgIHZhcnMtPmRhdGEgLS07Ci0gIAotICAvKiBDcmVhdGUgYSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlIGZvciBvdXIgdXNlLiAgKi8KLSAgc2VjLT51c2VkX2J5X2JmZCA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHZhcnMtPmRhdGE7Ci0gIHZhcnMtPmRhdGEgKz0gc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTsKLQotICBCRkRfQVNTRVJUICh2YXJzLT5kYXRhIDw9IHZhcnMtPmJpbS0+YnVmZmVyICsgdmFycy0+YmltLT5zaXplKTsKLSAgCi0gIC8qIENyZWF0ZSBhIHN5bWJvbCB0byByZWZlciB0byB0aGlzIHNlY3Rpb24uICAqLwotICBwZV9JTEZfbWFrZV9hX3N5bWJvbCAodmFycywgIiIsIG5hbWUsIHNlYywgQlNGX0xPQ0FMKTsKLQotICAvKiBDYWNoZSB0aGUgaW5kZXggdG8gdGhlIHN5bWJvbCBpbiB0aGUgY29mZl9zZWN0aW9uX2RhdGEgc3RydWN0dXJlLiAgKi8KLSAgY29mZl9zZWN0aW9uX2RhdGEgKHZhcnMtPmFiZmQsIHNlYyktPmkgPSB2YXJzLT5zeW1faW5kZXggLSAxOwotICAKLSAgcmV0dXJuIHNlYzsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBnb2VzIGludG8gdGhlIC50ZXh0IHNlY3Rpb24KLSAgIGluIG9yZGVyIHRvIHBlcmZvcm0gYSBqdW1wIGludG8gdGhlIERMTCBsb29rdXAgdGFibGUuICBUaGUgZW50cmllcwotICAgaW4gdGhlIHRhYmxlIGFyZSBpbmRleCBieSB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZQotICAgbWFjaGluZSB0eXBlIGluIHRoZSBQRSBmaWxlLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhW10gYXJyYXlzIGluCi0gICB0aGVzZSBlbnRyaWVzIGFyZSBzdG9sZW4gZnJvbSB0aGUganRhYltdIGFycmF5cyBpbiBsZC9wZS1kbGwuYy4KLSAgIFRoZSBTSVpFIGZpZWxkIHNheXMgaG93IG1hbnkgYnl0ZXMgaW4gdGhlIERBVEEgYXJyYXkgYXJlIGFjdHVhbGx5Ci0gICB1c2VkLiAgVGhlIE9GRlNFVCBmaWVsZCBzYXlzIHdoZXJlIGluIHRoZSBkYXRhIGFycmF5IHRoZSBhZGRyZXNzCi0gICBvZiB0aGUgLmlkYXRhJDUgc2VjdGlvbiBzaG91bGQgYmUgcGxhY2VkLiAgKi8KLSNkZWZpbmUgTUFYX1RFWFRfU0VDVElPTl9TSVpFIDMyCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIHNob3J0IG1hZ2ljOwotICB1bnNpZ25lZCBjaGFyICBkYXRhW01BWF9URVhUX1NFQ1RJT05fU0laRV07Ci0gIHVuc2lnbmVkIGludCAgIHNpemU7Ci0gIHVuc2lnbmVkIGludCAgIG9mZnNldDsKLX0KLWp1bXBfdGFibGU7Ci0KLXN0YXRpYyBqdW1wX3RhYmxlIGp0YWJbXSA9Ci17Ci0jaWZkZWYgSTM4Nk1BR0lDCi0gIHsgSTM4Nk1BR0lDLAotICAgIHsgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MCB9LAotICAgIDgsIDIKLSAgfSwKLSNlbmRpZgotICAKLSNpZmRlZiAgTUM2OE1BR0lDCi0gIHsgTUM2OE1BR0lDLCB7IC8qIFhYWCBmaWxsIG1lIGluICovIH0sIDAsIDAgfSwKLSNlbmRpZgotI2lmZGVmICBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgeyBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UsCi0gICAgeyAweDAwLCAweDAwLCAweDA4LCAweDNjLCAweDAwLCAweDAwLCAweDA4LCAweDhkLAotICAgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgIDE2LCAwCi0gIH0sCi0jZW5kaWYKLSAgCi0jaWZkZWYgIFNIX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgeyBTSF9BUkNIX01BR0lDX1dJTkNFLAotICAgIHsgMHgwMSwgMHhkMCwgMHgwMiwgMHg2MCwgMHgyYiwgMHg0MCwKLSAgICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAxMiwgOAotICB9LAotI2VuZGlmCi0gIAotI2lmZGVmICBBUk1QRU1BR0lDCi0gIHsgQVJNUEVNQUdJQywKLSAgICB7IDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4ZjAsCi0gICAgICAweDljLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLSAgICAxMiwgOAotICB9LAotI2VuZGlmCi0gIAotI2lmZGVmICBUSFVNQlBFTUFHSUMKLSAgeyBUSFVNQlBFTUFHSUMsCi0gICAgeyAweDQwLCAweGI0LCAweDAyLCAweDRlLCAweDM2LCAweDY4LCAweGI0LCAweDQ2LAotICAgICAgMHg0MCwgMHhiYywgMHg2MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgIDE2LCAxMgotICB9LAotI2VuZGlmCi0gIHsgMCwgeyAwIH0sIDAsIDAgfQotfTsKLQotI2lmbmRlZiBOVU1fRU5UUklFUwotI2RlZmluZSBOVU1fRU5UUklFUyhhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotLyogQnVpbGQgYSBmdWxsIEJGRCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBpbiBhIElMRiBvYmplY3QuICAqLwotc3RhdGljIGJvb2xlYW4KLXBlX0lMRl9idWlsZF9hX2JmZCAoYmZkICogICAgICAgICAgIGFiZmQsCi0JCSAgICB1bnNpZ25lZCBzaG9ydCAgbWFnaWMsCi0JCSAgICBiZmRfYnl0ZSAqICAgICAgc3ltYm9sX25hbWUsCi0JCSAgICBiZmRfYnl0ZSAqICAgICAgc291cmNlX2RsbCwKLQkJICAgIHVuc2lnbmVkIGludCAgICBvcmRpbmFsLAotCQkgICAgdW5zaWduZWQgaW50ICAgIHR5cGVzKQoteyAKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgIHB0cjsKLSAgcGVfSUxGX3ZhcnMgICAgICAgICAgICAgIHZhcnM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICBpbnRlcm5hbF9mOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgaW1wb3J0X3R5cGU7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICAgICBpbXBvcnRfbmFtZV90eXBlOwotICBhc2VjdGlvbl9wdHIgICAgICAgICAgICAgaWQ0LCBpZDUsIGlkNiA9IE5VTEwsIHRleHQgPSBOVUxMOwotICBjb2ZmX3N5bWJvbF90eXBlICoqICAgICAgaW1wX3N5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGltcF9pbmRleDsKLQotICAvKiBEZWNvZGUgYW5kIHZlcmlmeSB0aGUgdHlwZXMgZmllbGQgb2YgdGhlIElMRiBzdHJ1Y3R1cmUuICAqLwotICBpbXBvcnRfdHlwZSA9IHR5cGVzICYgMHgzOwotICBpbXBvcnRfbmFtZV90eXBlID0gKHR5cGVzICYgMHgxYykgPj4gMjsKLQotICBzd2l0Y2ggKGltcG9ydF90eXBlKQotICAgIHsKLSAgICBjYXNlIElNUE9SVF9DT0RFOgotICAgIGNhc2UgSU1QT1JUX0RBVEE6Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1QT1JUX0NPTlNUOgotICAgICAgLyogWFhYIGNvZGUgeWV0IHRvIGJlIHdyaXR0ZW4uICAqLwotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5oYW5kbGVkIGltcG9ydCB0eXBlOyAleCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgaW1wb3J0X3R5cGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFVucmVjb2duaXNlZCBpbXBvcnQgdHlwZTsgJXgiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGltcG9ydF90eXBlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChpbXBvcnRfbmFtZV90eXBlKQotICAgIHsKLSAgICBjYXNlIElNUE9SVF9PUkRJTkFMOgotICAgIGNhc2UgSU1QT1JUX05BTUU6Ci0gICAgY2FzZSBJTVBPUlRfTkFNRV9OT1BSRUZJWDoKLSAgICBjYXNlIElNUE9SVF9OQU1FX1VOREVDT1JBVEU6Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBVbnJlY29nbmlzZWQgaW1wb3J0IG5hbWUgdHlwZTsgJXgiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGltcG9ydF9uYW1lX3R5cGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJbml0aWFsaXNlIGxvY2FsIHZhcmlhYmxlcy4KLSAgICAgCi0gICAgIE5vdGUgdGhlc2UgYXJlIGtlcHQgaW4gYSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgZGVjbGFyZWQgYXMgc3RhdGljcyBzaW5jZSBiZmQgZnJvd25zIG9uIGdsb2JhbCB2YXJpYWJsZXMuCi0gICAgIAotICAgICBXZSBhcmUgZ29pbmcgdG8gY29uc3RydWN0IHRoZSBjb250ZW50cyBvZiB0aGUgQkZEIGluIG1lbW9yeSwKLSAgICAgc28gYWxsb2NhdGUgYWxsIHRoZSBzcGFjZSB0aGF0IHdlIHdpbGwgbmVlZCByaWdodCBub3cuICAqLwotICBwdHIgPSBiZmRfemFsbG9jIChhYmZkLCBJTEZfREFUQV9TSVpFKTsKLSAgaWYgKHB0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgYSBiZmRfaW5fbWVtb3J5IHN0cnVjdHVyZS4gICovCi0gIHZhcnMuYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIHB0cjsKLSAgdmFycy5iaW0tPmJ1ZmZlciA9IHB0cjsKLSAgdmFycy5iaW0tPnNpemUgICA9IElMRl9EQVRBX1NJWkU7Ci0gIHB0ciArPSBzaXplb2YgKCogdmFycy5iaW0pOwotICAKLSAgLyogSW5pdGlhbGlzZSB0aGUgcG9pbnRlcnMgdG8gcmVnaW9ucyBvZiB0aGUgbWVtb3J5IGFuZCB0aGUKLSAgICAgb3RoZXIgY29udGVudHMgb2YgdGhlIHBlX0lMRl92YXJzIHN0cnVjdHVyZSBhcyB3ZWxsLiAgKi8KLSAgdmFycy5zeW1fY2FjaGUgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBwdHI7Ci0gIHZhcnMuc3ltX3B0ciAgID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgcHRyOwotICB2YXJzLnN5bV9pbmRleCA9IDA7Ci0gIHB0ciArPSBTSVpFT0ZfSUxGX1NZTVM7Ci0gIAotICB2YXJzLnN5bV90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgcHRyOwotICB2YXJzLnRhYmxlX3B0ciA9ICh1bnNpZ25lZCBpbnQgKikgcHRyOwotICBwdHIgKz0gU0laRU9GX0lMRl9TWU1fVEFCTEU7Ci0KLSAgdmFycy5uYXRpdmVfc3ltcyA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIHB0cjsKLSAgdmFycy5uYXRpdmVfcHRyICA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfTkFUSVZFX1NZTVM7Ci0KLSAgdmFycy5zeW1fcHRyX3RhYmxlID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIHB0cjsKLSAgdmFycy5zeW1fcHRyX3B0ciAgID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfU1lNX1BUUl9UQUJMRTsKLSAgCi0gIHZhcnMuZXN5bV90YWJsZSA9IChTWU1FTlQgKikgcHRyOwotICB2YXJzLmVzeW1fcHRyICAgPSAoU1lNRU5UICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfRVhUX1NZTVM7Ci0gIAotICB2YXJzLnJlbHRhYiAgID0gKGFyZWxlbnQgKikgcHRyOwotICB2YXJzLnJlbGNvdW50ID0gMDsKLSAgcHRyICs9IFNJWkVPRl9JTEZfUkVMT0NTOwotCi0gIHZhcnMuaW50X3JlbHRhYiAgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfSU5UX1JFTE9DUzsKLQotICB2YXJzLnN0cmluZ190YWJsZSA9IHB0cjsKLSAgdmFycy5zdHJpbmdfcHRyICAgPSBwdHIgKyBTVFJJTkdfU0laRV9TSVpFOwotICBwdHIgKz0gU0laRU9GX0lMRl9TVFJJTkdTOwotICB2YXJzLmVuZF9zdHJpbmdfcHRyID0gcHRyOwotICAKLSAgLyogVGhlIHJlbWFpbmluZyBzcGFjZSBpbiBiaW0tPmJ1ZmZlciBpcyB1c2VkCi0gICAgIGJ5IHRoZSBwZV9JTEZfbWFrZV9hX3NlY3Rpb24oKSBmdW5jdGlvbi4gICovCi0gIHZhcnMuZGF0YSA9IHB0cjsKLSAgdmFycy5hYmZkID0gYWJmZDsKLSAgdmFycy5zZWNfaW5kZXggPSAwOwotICB2YXJzLm1hZ2ljID0gbWFnaWM7Ci0gIAotICAvKiBDcmVhdGUgdGhlIGluaXRpYWwgLmlkYXRhJDxuPiBzZWN0aW9uczoKLSAgICAgWy5pZGF0YSQyOiAgSW1wb3J0IERpcmVjdG9yeSBUYWJsZSAtLSBub3QgbmVlZGVkXQotICAgICAuaWRhdGEkNDogIEltcG9ydCBMb29rdXAgVGFibGUKLSAgICAgLmlkYXRhJDU6ICBJbXBvcnQgQWRkcmVzcyBUYWJsZQotCi0gICAgIE5vdGUgd2UgZG8gbm90IGNyZWF0ZSBhIC5pZGF0YSQzIHNlY3Rpb24gYXMgdGhpcyBpcwotICAgICBjcmVhdGVkIGZvciB1cyBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0gIGlkNCA9IHBlX0lMRl9tYWtlX2Ffc2VjdGlvbiAoJiB2YXJzLCAiLmlkYXRhJDQiLCBTSVpFT0ZfSURBVEE0LCAwKTsKLSAgaWQ1ID0gcGVfSUxGX21ha2VfYV9zZWN0aW9uICgmIHZhcnMsICIuaWRhdGEkNSIsIFNJWkVPRl9JREFUQTUsIDApOwotICBpZiAoaWQ0ID09IE5VTEwgfHwgaWQ1ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogRmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlc2Ugc2VjdGlvbnMuICAqLwotICBpZiAoaW1wb3J0X25hbWVfdHlwZSA9PSBJTVBPUlRfT1JESU5BTCkKLSAgICB7Ci0gICAgICBpZiAob3JkaW5hbCA9PSAwKQotCS8qIFhYWCAtIHRyZWF0IGFzIElNUE9SVF9OQU1FID8/PyAqLwotCWFib3J0ICgpOwotICAgICAgCi0gICAgICAqICh1bnNpZ25lZCBpbnQgKikgaWQ0LT5jb250ZW50cyA9IG9yZGluYWwgfCAweDgwMDAwMDAwOwotICAgICAgKiAodW5zaWduZWQgaW50ICopIGlkNS0+Y29udGVudHMgPSBvcmRpbmFsIHwgMHg4MDAwMDAwMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICogc3ltYm9sOwotICAgICAgCi0gICAgICAvKiBDcmVhdGUgLmlkYXRhJDYgLSB0aGUgSGludCBOYW1lIFRhYmxlLiAgKi8KLSAgICAgIGlkNiA9IHBlX0lMRl9tYWtlX2Ffc2VjdGlvbiAoJiB2YXJzLCAiLmlkYXRhJDYiLCBTSVpFT0ZfSURBVEE2LCAwKTsKLSAgICAgIGlmIChpZDYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIG5lY2Vzc2FyeSwgdHJpbSB0aGUgaW1wb3J0IHN5bWJvbCBuYW1lLiAgKi8KLSAgICAgIHN5bWJvbCA9IHN5bWJvbF9uYW1lOwotCi0gICAgICBpZiAoaW1wb3J0X25hbWVfdHlwZSAhPSBJTVBPUlRfTkFNRSkKLQkvKiBTa2lwIGFueSBwcmVmaXggaW4gc3ltYm9sX25hbWUuICAqLwotCXdoaWxlICgqc3ltYm9sID09ICdAJyB8fCAqIHN5bWJvbCA9PSAnPycgfHwgKiBzeW1ib2wgPT0gJ18nKQotCSAgKysgc3ltYm9sOwotCi0gICAgICBpZiAoaW1wb3J0X25hbWVfdHlwZSA9PSBJTVBPUlRfTkFNRV9VTkRFQ09SQVRFKQotCXsKLQkgIC8qIFRydW5jYXRlIGF0IHRoZSBmaXJzdCAnQCcgICovCi0JICB3aGlsZSAoKiBzeW1ib2wgIT0gMCAmJiAqIHN5bWJvbCAhPSAnQCcpCi0JICAgIHN5bWJvbCArKzsKLQotCSAgKiBzeW1ib2wgPSAwOwotCX0KLSAgICAgIAotICAgICAgaWQ2LT5jb250ZW50c1swXSA9IG9yZGluYWwgJiAweGZmOwotICAgICAgaWQ2LT5jb250ZW50c1sxXSA9IG9yZGluYWwgPj4gODsKLSAgICAgIAotICAgICAgc3RyY3B5IChpZDYtPmNvbnRlbnRzICsgMiwgc3ltYm9sKTsKLSAgICB9Ci0KLSAgaWYgKGltcG9ydF9uYW1lX3R5cGUgIT0gSU1QT1JUX09SRElOQUwpCi0gICAgewotICAgICAgcGVfSUxGX21ha2VfYV9yZWxvYyAoJiB2YXJzLCAwLCBCRkRfUkVMT0NfUlZBLCBpZDYpOwotICAgICAgcGVfSUxGX3NhdmVfcmVsb2NzICgmIHZhcnMsIGlkNCk7Ci0gICAgICAKLSAgICAgIHBlX0lMRl9tYWtlX2FfcmVsb2MgKCYgdmFycywgMCwgQkZEX1JFTE9DX1JWQSwgaWQ2KTsKLSAgICAgIHBlX0lMRl9zYXZlX3JlbG9jcyAoJiB2YXJzLCBpZDUpOwotICAgIH0KLQotICAvKiBDcmVhdGUgZXh0cmEgc2VjdGlvbnMgZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUgb2YgaW1wb3J0IHdlIGFyZSBkZWFsaW5nIHdpdGguICAqLwotICBzd2l0Y2ggKGltcG9ydF90eXBlKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgCi0gICAgY2FzZSBJTVBPUlRfQ09ERToKLSAgICAgIC8qIENyZWF0ZSBhIC50ZXh0IHNlY3Rpb24uCi0JIEZpcnN0IHdlIG5lZWQgdG8gbG9vayB1cCBpdHMgY29udGVudHMgaW4gdGhlIGp1bXAgdGFibGUuICAqLwotICAgICAgZm9yIChpID0gTlVNX0VOVFJJRVMgKGp0YWIpOyBpLS07KQotCXsKLQkgIGlmIChqdGFiW2ldLnNpemUgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoanRhYltpXS5tYWdpYyA9PSBtYWdpYykKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLyogSWYgd2UgZGlkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgZW50cnkgc29tZXRoaW5nIGlzIHdyb25nLiAgKi8KLSAgICAgIGlmIChpIDwgMCkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogQ3JlYXRlIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHRleHQgPSBwZV9JTEZfbWFrZV9hX3NlY3Rpb24gKCYgdmFycywgIi50ZXh0IiwganRhYltpXS5zaXplLCBTRUNfQ09ERSk7Ci0gICAgICBpZiAodGV4dCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ29weSBpbiB0aGUganVtcCBjb2RlLiAgKi8KLSAgICAgIG1lbWNweSAodGV4dC0+Y29udGVudHMsIGp0YWJbaV0uZGF0YSwganRhYltpXS5zaXplKTsKLQotICAgICAgLyogQ3JlYXRlIGFuIGltcG9ydCBzeW1ib2wuICAqLwotICAgICAgcGVfSUxGX21ha2VfYV9zeW1ib2wgKCYgdmFycywgIl9faW1wXyIsIHN5bWJvbF9uYW1lLCBpZDUsIDApOwotICAgICAgaW1wX3N5bSAgID0gdmFycy5zeW1fcHRyX3B0ciAtIDE7Ci0gICAgICBpbXBfaW5kZXggPSB2YXJzLnN5bV9pbmRleCAtIDE7Ci0gICAgCi0gICAgICAvKiBDcmVhdGUgYSByZWxvYyBmb3IgdGhlIGRhdGEgaW4gdGhlIHRleHQgc2VjdGlvbi4gICovCi0jaWZkZWYgTUlQU19BUkNIX01BR0lDX1dJTkNFICAgICAgCi0gICAgICBpZiAobWFnaWMgPT0gTUlQU19BUkNIX01BR0lDX1dJTkNFKQotCXsKLQkgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICgmIHZhcnMsIDAsIEJGRF9SRUxPQ19ISTE2X1MsCi0JCQkJICAgICAgKGFzZWN0aW9uICoqKSBpbXBfc3ltLCBpbXBfaW5kZXgpOwotCSAgcGVfSUxGX21ha2VfYV9yZWxvYyAoJiB2YXJzLCAwLCBCRkRfUkVMT0NfTE8xNiwgdGV4dCk7Ci0JICBwZV9JTEZfbWFrZV9hX3N5bWJvbF9yZWxvYyAoJiB2YXJzLCA0LCBCRkRfUkVMT0NfTE8xNiwKLQkJCQkgICAgICAoYXNlY3Rpb24gKiopIGltcF9zeW0sIGltcF9pbmRleCk7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0JcGVfSUxGX21ha2VfYV9zeW1ib2xfcmVsb2MgKCYgdmFycywganRhYltpXS5vZmZzZXQsIEJGRF9SRUxPQ18zMiwKLQkJCQkgICAgKGFzeW1ib2wgKiopIGltcF9zeW0sIGltcF9pbmRleCk7Ci0gICAgICAKLSAgICAgIHBlX0lMRl9zYXZlX3JlbG9jcyAoJiB2YXJzLCB0ZXh0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJTVBPUlRfREFUQToKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFhYWCBjb2RlIG5vdCB5ZXQgd3JpdHRlbi4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIAotICAvKiBJbml0aWFsaXNlIHRoZSBiZmQuICAqLwotICBtZW1zZXQgKCYgaW50ZXJuYWxfZiwgMCwgc2l6ZW9mIChpbnRlcm5hbF9mKSk7Ci0gIAotICBpbnRlcm5hbF9mLmZfbWFnaWMgID0gbWFnaWM7Ci0gIGludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICBpbnRlcm5hbF9mLmZfbnN5bXMgID0gMDsKLSAgaW50ZXJuYWxfZi5mX2ZsYWdzICA9IEZfQVIzMldSIHwgRl9MTk5POyAvKiBYWFggaXMgdGhpcyBjb3JyZWN0ID8gICovCi0gIAotICBpZiAoICAgISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIDApCi0gICAgICB8fCAhIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgJiBpbnRlcm5hbF9mKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfZiwgTlVMTCkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29mZl9kYXRhIChhYmZkKS0+cGUgPSAxOwotI2lmZGVmIFRIVU1CUEVNQUdJQyAgCi0gIGlmICh2YXJzLm1hZ2ljID09IFRIVU1CUEVNQUdJQykKLSAgICAvKiBTdG9wIHNvbWUgbGlua2VyIHdhcm5pbmdzIGFib3V0IHRodW1iIGNvZGUgbm90IHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nLiAgKi8KLSAgICBjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyB8PSBGX0lOVEVSV09SSyB8IEZfSU5URVJXT1JLX1NFVDsKLSNlbmRpZgotICAgIAotICAvKiBTd2l0Y2ggZnJvbSBmaWxlIGNvbnRlbnRzIHRvIG1lbW9yeSBjb250ZW50cy4gICovCi0gIGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7Ci0KLSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSB2YXJzLmJpbTsKLSAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWSAvKiB8IEhBU19MT0NBTFMgKi87Ci0gIGFiZmQtPndoZXJlID0gMDsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IDA7Ci0KLSAgLyogTm93IGNyZWF0ZSBhIHN5bWJvbCBkZXNjcmliaW5nIHRoZSBpbXBvcnRlZCB2YWx1ZS4gICovCi0gIHN3aXRjaCAoaW1wb3J0X3R5cGUpCi0gICAgewotICAgICAgYmZkX2J5dGUgKiBwdHI7Ci0gICAgICAKLSAgICBjYXNlIElNUE9SVF9DT0RFOgotICAgICAgcGVfSUxGX21ha2VfYV9zeW1ib2wgKCYgdmFycywgIiIsIHN5bWJvbF9uYW1lLCB0ZXh0LAotCQkJICAgIEJTRl9OT1RfQVRfRU5EIHwgQlNGX0ZVTkNUSU9OKTsKLSAgICAgIAotICAgICAgLyogQ3JlYXRlIGFuIGltcG9ydCBzeW1ib2wgZm9yIHRoZSBETEwsIHdpdGhvdXQgdGhlCi0gICAgICAgLmRsbCBzdWZmaXguICAqLwotICAgICAgcHRyID0gc3RycmNociAoc291cmNlX2RsbCwgJy4nKTsKLSAgICAgIGlmIChwdHIpCi0JKiBwdHIgPSAwOwotICAgICAgcGVfSUxGX21ha2VfYV9zeW1ib2wgKCYgdmFycywgIl9fSU1QT1JUX0RFU0NSSVBUT1JfIiwgc291cmNlX2RsbCwgTlVMTCwgMCk7Ci0gICAgICBpZiAocHRyKQotCSogcHRyID0gJy4nOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElNUE9SVF9EQVRBOgotICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFhYWCBjb2RlIG5vdCB5ZXQgd3JpdHRlbi4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogUG9pbnQgdGhlIGJmZCBhdCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gdmFycy5zeW1fY2FjaGU7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gdmFycy5zeW1faW5kZXg7Ci0gIAotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gdmFycy5uYXRpdmVfc3ltczsKLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gdmFycy5zeW1faW5kZXg7Ci0KLSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSAoUFRSKSB2YXJzLmVzeW1fdGFibGU7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotICAKLSAgb2JqX2NvbnZlcnQgKGFiZmQpID0gdmFycy5zeW1fdGFibGU7Ci0gIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0gdmFycy5zeW1faW5kZXg7Ci0gIAotICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IHZhcnMuc3RyaW5nX3RhYmxlOwotICBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpID0gdHJ1ZTsKLQotICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSBkZXRlY3RlZCBhIEltYWdlIExpYnJhcnkgRm9ybWF0IGFyY2hpdmUgZWxlbWVudC4KLSAgIERlY29kZSB0aGUgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQuICAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotcGVfSUxGX29iamVjdF9wIChiZmQgKiBhYmZkKQotewotICBiZmRfYnl0ZSAgICAgICAgYnVmZmVyWzE2XTsKLSAgYmZkX2J5dGUgKiAgICAgIHB0cjsKLSAgYmZkX2J5dGUgKiAgICAgIHN5bWJvbF9uYW1lOwotICBiZmRfYnl0ZSAqICAgICAgc291cmNlX2RsbDsKLSAgdW5zaWduZWQgaW50ICAgIG1hY2hpbmU7Ci0gIHVuc2lnbmVkIGxvbmcgICBzaXplOwotICB1bnNpZ25lZCBpbnQgICAgb3JkaW5hbDsKLSAgdW5zaWduZWQgaW50ICAgIHR5cGVzOwotICB1bnNpZ25lZCBzaG9ydCAgbWFnaWM7Ci0gIAotICAvKiBVcG9uIGVudHJ5IHRoZSBmaXJzdCBmb3VyIGJ1eWVzIG9mIHRoZSBJTEYgaGVhZGVyIGhhdmUKLSAgICAgIGFscmVhZHkgYmVlbiByZWFkLiAgTm93IHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlci4gICovCi0gIGlmIChiZmRfcmVhZCAoYnVmZmVyLCAxLCAxNiwgYWJmZCkgIT0gMTYpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcHRyID0gYnVmZmVyOwotICAKLSAgLyogIFdlIGRvIG5vdCBib3RoZXIgdG8gY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLgotICAgICAgdmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgcHRyKTsgICovCi0gIHB0ciArPSAyOwotCi0gIG1hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHB0cik7Ci0gIHB0ciArPSAyOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIG1hY2hpbmUgdHlwZSBpcyByZWNvZ25pc2VkLiAgKi8KLSAgbWFnaWMgPSAwOwotICAKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9VTktOT1dOOgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBOgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBNjQ6Ci0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NDoKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjoKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICAgIG1hZ2ljID0gSTM4Nk1BR0lDOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX002OEs6Ci0jaWZkZWYgTUM2OEFHSUMKLSAgICAgIG1hZ2ljID0gTUM2OE1BR0lDOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwOgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwOgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1IxMDAwMDoKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX01JUFMxNjoKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVOgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUxNjoKLSNpZmRlZiBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgICAgIG1hZ2ljID0gTUlQU19BUkNIX01BR0lDX1dJTkNFOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1NIMzoKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9TSDQ6Ci0jaWZkZWYgU0hfQVJDSF9NQUdJQ19XSU5DRQotICAgICAgbWFnaWMgPSBTSF9BUkNIX01BR0lDX1dJTkNFOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX0FSTToKLSNpZmRlZiBBUk1QRU1BR0lDCi0gICAgICBtYWdpYyA9IEFSTVBFTUFHSUM7Ci0jZW5kaWYgICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfVEhVTUI6Ci0jaWZkZWYgVEhVTUJQRU1BR0lDCi0gICAgICB7Ci0JZXh0ZXJuIGJmZF90YXJnZXQgYXJtcGVpX2xpdHRsZV92ZWM7Ci0JCi0JaWYgKGFiZmQtPnh2ZWMgPT0gJiBhcm1wZWlfbGl0dGxlX3ZlYykKLQkgIG1hZ2ljID0gVEhVTUJQRU1BR0lDOwotICAgICAgfQotI2VuZGlmICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1BPV0VSUEM6Ci0gICAgICAvKiBXZSBubyBsb25nZXIgc3VwcG9ydCBQb3dlclBDLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JKAotXygiJXM6IFVucmVjb2duaXNlZCBtYWNoaW5lIHR5cGUgKDB4JXgpIGluIEltcG9ydCBMaWJyYXJ5IEZvcm1hdCBhcmNoaXZlIiksCi0gICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbWFjaGluZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKG1hZ2ljID09IDApCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JKAotXygiJXM6IFJlY29nbmlzZWQgYnV0IHVuaGFuZGxlZCBtYWNoaW5lIHR5cGUgKDB4JXgpIGluIEltcG9ydCBMaWJyYXJ5IEZvcm1hdCBhcmNoaXZlIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBtYWNoaW5lKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfSAgCi0KLSAgLyogV2UgZG8gbm90IGJvdGhlciB0byBjaGVjayB0aGUgZGF0ZS4KLSAgICAgZGF0ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcHRyKTsgICovCi0gIHB0ciArPSA0OwotICAKLSAgc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcHRyKTsKLSAgcHRyICs9IDQ7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkoXygiJXM6IHNpemUgZmllbGQgaXMgemVybyBpbiBJbXBvcnQgTGlicmFyeSBGb3JtYXQgaGVhZGVyIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgb3JkaW5hbCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgcHRyKTsKLSAgcHRyICs9IDI7Ci0KLSAgdHlwZXMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHB0cik7Ci0gIC8qIHB0ciArPSAyOyAqLwotCi0gIC8qIE5vdyByZWFkIGluIHRoZSB0d28gc3RyaW5ncyB0aGF0IGZvbGxvdy4gICovCi0gIHB0ciA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIGlmIChiZmRfcmVhZCAocHRyLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN5bWJvbF9uYW1lID0gcHRyOwotICBzb3VyY2VfZGxsICA9IHB0ciArIHN0cmxlbiAocHRyKSArIDE7Ci0gIAotICAvKiBWZXJpZnkgdGhhdCB0aGUgc3RyaW5ncyBhcmUgbnVsbCB0ZXJtaW5hdGVkLiAgKi8KLSAgaWYgKHB0cltzaXplIC0gMV0gIT0gMCB8fCAoKHVuc2lnbmVkIGxvbmcpIChzb3VyY2VfZGxsIC0gcHRyKSA+PSBzaXplKSkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkoXygiJXM6IHN0cmluZyBub3QgbnVsbCB0ZXJtaW5hdGVkIGluIElMRiBvYmplY3QgZmlsZS4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIC8qIE5vdyBjb25zdHJ1Y3QgdGhlIGJmZC4gICovCi0gIGlmICghIHBlX0lMRl9idWlsZF9hX2JmZCAoYWJmZCwgbWFnaWMsIHN5bWJvbF9uYW1lLAotCQkJICAgIHNvdXJjZV9kbGwsIG9yZGluYWwsIHR5cGVzKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1wZV9iZmRfb2JqZWN0X3AgKGJmZCAqIGFiZmQpCi17Ci0gIC8qIFdlIG5lZWQgdG8gaGFuZGxlIGEgUEUgaW1hZ2UgY29ycmVjdGx5LiAgSW4gUEUgaW1hZ2VzIGNyZWF0ZWQgYnkKLSAgICAgdGhlIEdOVSBsaW5rZXIsIHRoZSBvZmZzZXQgdG8gdGhlIENPRkYgaGVhZGVyIGlzIGFsd2F5cyB0aGUgc2l6ZS4KLSAgICAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gaW1hZ2VzIGdlbmVyYXRlZCBieSBvdGhlciBQRQotICAgICBsaW5rZXJzLiAgVGhlIFBFIGZvcm1hdCBzdG9yZXMgYSBmb3VyIGJ5dGUgb2Zmc2V0IHRvIHRoZSBQRQotICAgICBzaWduYXR1cmUganVzdCBiZWZvcmUgdGhlIENPRkYgaGVhZGVyIGF0IGxvY2F0aW9uIDB4M2Mgb2YgdGhlIGZpbGUuCi0gICAgIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0IHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZAotICAgICB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbiB0aGUgQ09GRiBoZWFkZXIuICAqLwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGZpbGVfcHRyIG9mZnNldDsKLSAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7Ci0KLSAgLyogRGV0ZWN0IGlmIHRoaXMgYSBNaWNyb3NvZnQgSW1wb3J0IExpYnJhcnkgRm9ybWF0IGVsZW1lbnQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4MDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYnVmZmVyLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnVmZmVyKTsKLSAgCi0gIGlmIChzaWduYXR1cmUgPT0gMHhmZmZmMDAwMCkKLSAgICByZXR1cm4gcGVfSUxGX29iamVjdF9wIChhYmZkKTsKLSAgCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChidWZmZXIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnVmZmVyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChidWZmZXIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnVmZmVyKTsKLQotICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgIHBpY2sgdXAgdGhlIENPRkYgaGVhZGVyLiAgV2UgYWRqdXN0IHNvIHRoYXQgdGhhdCB3aWxsIHdvcmsuICAyMAotICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgaTM4NiBDT0ZGIGZpbGVoZHIuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShiZmRfdGVsbCAoYWJmZCkKLQkJIC0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKQotCQkgKyAyMCksCi0JCVNFRUtfU0VUKQotICAgICAgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0jZGVmaW5lIGNvZmZfb2JqZWN0X3AgcGVfYmZkX29iamVjdF9wCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCmRpZmYgLS1naXQgYS9iZmQvcGVpZ2VuLmMgYi9iZmQvcGVpZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTgzY2EuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5OCArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBQRS9QRUk7IHRoZSBjb21tb24gZXhlY3V0YWJsZSBwYXJ0cy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotCi1QRS9QRUkgcmVhcnJhbmdlbWVudCAoYW5kIGNvZGUgYWRkZWQpOiBEb25uIFRlcnJ5Ci0JCQkJICAgICAgIFNvZnR3YXkgU3lzdGVtcywgSW5jLgotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0vKiBOT1RFOiBpdCdzIHN0cmFuZ2UgdG8gYmUgaW5jbHVkaW5nIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBoZWFkZXIKLSAgIGluIHdoYXQncyBzdXBwb3NlZCB0byBiZSBnZW5lcmFsICh0byBQRS9QRUkpIGNvZGUuICBIb3dldmVyLCB0aGF0J3MKLSAgIHdoZXJlIHRoZSBkZWZpbml0aW9ucyBhcmUsIGFuZCB0aGV5IGRvbid0IHZhcnkgcGVyIGFyY2hpdGVjdHVyZQotICAgd2l0aGluIFBFL1BFSSwgc28gd2UgZ2V0IHRoZW0gZnJvbSB0aGVyZS4gIEZJWE1FOiBUaGUgbGFjayBvZgotICAgdmFyaWFuY2UgaXMgYW4gYXNzdW1wdGlvbiB3aGljaCBtYXkgcHJvdmUgdG8gYmUgaW5jb3JyZWN0IGlmIG5ldwotICAgUEUvUEVJIHRhcmdldHMgYXJlIGNyZWF0ZWQuICAqLwotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJwZWkuaCIKLQotLyogRklYTUU6IFRoaXMgZmlsZSBoYXMgdmFyaW91cyB0ZXN0cyBvZiBQT1dFUlBDX0xFX1BFLiAgVGhvc2UgdGVzdHMKLSAgIHdvcmtlZCB3aGVuIHRoZSBjb2RlIHdhcyBpbiBwZWljb2RlLmgsIGJ1dCBubyBsb25nZXIgd29yayBub3cgdGhhdAotICAgdGhlIGNvZGUgaXMgaW4gcGVpZ2VuLmMuICBQb3dlclBDIE5UIGlzIHNhaWQgdG8gYmUgZGVhZC4gIElmCi0gICBhbnlib2R5IHdhbnRzIHRvIHJldml2ZSB0aGUgY29kZSwgeW91IHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IGhvdwotICAgdG8gaGFuZGxlIHRob3NlIGlzc3Vlcy4gICovCi0KLXN0YXRpYyB2b2lkIGFkZF9kYXRhX2VudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqLCBpbnQsIGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcGRhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcmVsb2MgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgU1lNRU5UICpleHQgPSAoU1lNRU5UICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOwotCi0gIGlmKCBleHQtPmUuZV9uYW1lWzBdID09IDApIHsKLSAgICBpbi0+X24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotICB9Ci0KLSAgaW4tPm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7Ci0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLQotI2lmbmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gIC8qIFRoaXMgaXMgZm9yIEdudS1jcmVhdGVkIERMTHMgKi8KLQotICAvKiBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgLmlkYXRhJCBzZWN0aW9ucyBoYXZlIGNsYXNzIDB4NjgKLSAgICAgKENfU0VDVElPTiksIHdoaWNoIE1TIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzIGlzIGEgc2VjdGlvbgotICAgICBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHN5bWJvbCBpcyBzaW1wbHkgYQotICAgICBjb3B5IG9mIHRoZSAuaWRhdGEgc2VjdGlvbidzIGZsYWdzIHJhdGhlciB0aGFuIHNvbWV0aGluZyB1c2VmdWwuCi0gICAgIFdoZW4gdGhlc2Ugc3ltYm9scyBhcmUgZW5jb3VudGVyZWQsIGNoYW5nZSB0aGUgdmFsdWUgdG8gMCBzbyB0aGF0Ci0gICAgIHRoZXkgd2lsbCBiZSBoYW5kbGVkIHNvbWV3aGF0IGNvcnJlY3RseSBpbiB0aGUgYmZkIGNvZGUuICAqLwotICBpZiAoaW4tPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICBpbi0+bl92YWx1ZSA9IDB4MDsKLQotI2lmIDAKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0Ci0gICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQotICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAotICAgICAgICAgYW55d2hlcmUuICAqLwotICAgICAgaW4tPm5fc2NudW0gPSAxOwotCi0gICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZwotCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAotCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLwotICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KLSAgICAgIC8qICAgIGVsc2UgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLwotI2Vsc2UKLSAgICAgIC8qIENyZWF0ZSBzeW50aGV0aWMgZW1wdHkgc2VjdGlvbnMgYXMgbmVlZGVkLiAgREogKi8KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCBpbi0+bl9uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaW4tPm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgaW50IHVudXNlZF9zZWN0aW9uX251bWJlciA9IDA7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgY2hhciAqbmFtZTsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIGlmICh1bnVzZWRfc2VjdGlvbl9udW1iZXIgPD0gc2VjLT50YXJnZXRfaW5kZXgpCi0JICAgICAgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gc2VjLT50YXJnZXRfaW5kZXgrMTsKLQotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChpbi0+bl9uYW1lKSArIDEwKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybjsKLQkgIHN0cmNweSAobmFtZSwgaW4tPm5fbmFtZSk7Ci0JICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0KLQkgIHNlYy0+dm1hID0gMDsKLQkgIHNlYy0+bG1hID0gMDsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbF9maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgc2VjLT5saW5lX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5saW5lbm9fY291bnQgPSAwOwotCSAgc2VjLT51c2VyZGF0YSA9IE5VTEw7Ci0JICBzZWMtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgIHNlYy0+ZmxhZ3MgPSAwOwotCSAgc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCSAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfREFUQSB8IFNFQ19MT0FEOwotCi0JICBzZWMtPnRhcmdldF9pbmRleCA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQotCSAgaW4tPm5fc2NudW0gPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0JfQotICAgICAgaW4tPm5fc2NsYXNzID0gQ19TVEFUOwotI2VuZGlmCi0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBjb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSAgLyogVGhpcyB3b24ndCB3b3JrIGluIHBlaWdlbi5jLCBidXQgc2luY2UgaXQncyBmb3IgUFBDIFBFLCBpdCdzIG5vdAotICAgICB3b3J0aCBmaXhpbmcuICovCi0gIGNvZmZfc3dhcF9zeW1faW5faG9vayhhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShleHQtPmUuZV9uYW1lLCBpbi0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0KLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50CSAgICAgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAJICAgICBpbjE7Ci17Ci0gIEFVWEVOVCAgICAqZXh0ID0gKEFVWEVOVCAqKWV4dDE7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW4xOwotCi0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotICAgICAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPQotCWJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotCi0KLSAgY2FzZSBDX1NUQVQ6Ci0gIGNhc2UgQ19MRUFGU1RBVDoKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIGluLT54X3Njbi54X3NjbmxlbiA9IEdFVF9TQ05fU0NOTEVOKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9ucmVsb2MgPSBHRVRfU0NOX05SRUxPQyhhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbmxpbm5vID0gR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X2NoZWNrc3VtID0gYmZkX2hfZ2V0XzMyIChhYmZkLAotCQkJCQkgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NoZWNrc3VtKTsKLSAgICAgIGluLT54X3Njbi54X2Fzc29jaWF0ZWQgPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9hc3NvY2lhdGVkKTsKLSAgICAgIGluLT54X3Njbi54X2NvbWRhdCA9IGJmZF9oX2dldF84IChhYmZkLAotCQkJCQkoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NvbWRhdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgaW4tPnhfc3ltLnhfdGFnbmR4LmwgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotICBpbi0+eF9zeW0ueF90dm5keCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgKmFiZmQ7Ci0gICAgIFBUUiAgIGlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50ICAgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAgIGV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0gICAgfQotICAgIHJldHVybiBBVVhFU1o7Ci0KLQotICBjYXNlIENfU1RBVDoKLSAgY2FzZSBDX0xFQUZTVEFUOgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgUFVUX1NDTl9TQ05MRU4oYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCBleHQpOwotICAgICAgUFVUX1NDTl9OUkVMT0MoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCBleHQpOwotICAgICAgUFVUX1NDTl9OTElOTk8oYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCBleHQpOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+eF9zY24ueF9jaGVja3N1bSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY2hlY2tzdW0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zY24ueF9hc3NvY2lhdGVkLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9hc3NvY2lhdGVkKTsKLSAgICAgIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+eF9zY24ueF9jb21kYXQsCi0JCSAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY29tZGF0KTsKLSAgICAgIHJldHVybiBBVVhFU1o7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF90dm5keCAsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIFBVVF9GQ05fTE5OT1BUUihhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgZXh0KTsKLSAgICAgIFBVVF9GQ05fRU5ETkRYKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTiAodHlwZSkpCi0gICAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUsCi0JICAgICAoYmZkX2J5dGUgKikgIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgUFVUX0xOU1pfTE5OTyAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLCBleHQpOwotICAgICAgUFVUX0xOU1pfU0laRSAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLCBleHQpOwotICAgIH0KLQotICByZXR1cm4gQVVYRVNaOwotfQotCi12b2lkCi1fYmZkX3BlaV9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBMSU5FTk8gKmV4dCA9IChMSU5FTk8gKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbjE7Ci0KLSAgaW4tPmxfYWRkci5sX3N5bW5keCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotICBpbi0+bF9sbm5vID0gR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCk7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9saW5lbm9fb3V0IChhYmZkLCBpbnAsIG91dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCW91dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmV4dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopb3V0cDsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQotCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotCi0gIFBVVF9MSU5FTk9fTE5OTyAoYWJmZCwgaW4tPmxfbG5ubywgZXh0KTsKLSAgcmV0dXJuIExJTkVTWjsKLX0KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYTsKLSAgUEVBT1VUSERSICpzcmMgPSAoUEVBT1VUSERSICopKGFvdXRoZHJfZXh0MSk7Ci0gIEFPVVRIRFIgICAgICAgICphb3V0aGRyX2V4dCA9IChBT1VUSERSICopIGFvdXRoZHJfZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkcl9pbnQxOwotCi0gIGFvdXRoZHJfaW50LT5tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm1hZ2ljKTsKLSAgYW91dGhkcl9pbnQtPnZzdGFtcCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZzdGFtcCk7Ci0gIGFvdXRoZHJfaW50LT50c2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dHNpemUpOwotICBhb3V0aGRyX2ludC0+ZHNpemUgPQotICAgIEdFVF9BT1VUSERSX0RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmJzaXplID0KLSAgICBHRVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5ic2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5lbnRyeSA9Ci0gICAgR0VUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZW50cnkpOwotICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50ZXh0X3N0YXJ0KTsKLSNpZm5kZWYgQ09GRl9XSVRIX1BFUDY0Ci0gIC8qIFBFMzIrIGRvZXMgbm90IGhhdmUgZGF0YV9zdGFydCBtZW1iZXIhICovCi0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotI2VuZGlmCi0KLSAgYSA9ICZhb3V0aGRyX2ludC0+cGU7Ci0gIGEtPkltYWdlQmFzZSA9IEdFVF9PUFRIRFJfSU1BR0VfQkFTRSAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5JbWFnZUJhc2UpOwotICBhLT5TZWN0aW9uQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNlY3Rpb25BbGlnbm1lbnQpOwotICBhLT5GaWxlQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkZpbGVBbGlnbm1lbnQpOwotICBhLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPQotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPQotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NYWpvckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGEtPk1pbm9ySW1hZ2VWZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1pbm9ySW1hZ2VWZXJzaW9uKTsKLSAgYS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBhLT5SZXNlcnZlZDEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+UmVzZXJ2ZWQxKTsKLSAgYS0+U2l6ZU9mSW1hZ2UgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mSW1hZ2UpOwotICBhLT5TaXplT2ZIZWFkZXJzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkhlYWRlcnMpOwotICBhLT5DaGVja1N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5DaGVja1N1bSk7Ci0gIGEtPlN1YnN5c3RlbSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TdWJzeXN0ZW0pOwotICBhLT5EbGxDaGFyYWN0ZXJpc3RpY3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+RGxsQ2hhcmFjdGVyaXN0aWNzKTsKLSAgYS0+U2l6ZU9mU3RhY2tSZXNlcnZlID0gR0VUX09QVEhEUl9TSVpFX09GX1NUQUNLX1JFU0VSVkUgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mU3RhY2tDb21taXQgPSBHRVRfT1BUSERSX1NJWkVfT0ZfU1RBQ0tfQ09NTUlUIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYS0+U2l6ZU9mSGVhcFJlc2VydmUgPSBHRVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9SRVNFUlZFIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mSGVhcENvbW1pdCA9IEdFVF9PUFRIRFJfU0laRV9PRl9IRUFQX0NPTU1JVCAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYS0+TG9hZGVyRmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TG9hZGVyRmxhZ3MpOwotICBhLT5OdW1iZXJPZlJ2YUFuZFNpemVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkRhdGFEaXJlY3RvcnlbaWR4XVsxXSk7Ci0gICAgICB9Ci0gIH0KLQotICBpZiAoYW91dGhkcl9pbnQtPmVudHJ5KQotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSArPSBhLT5JbWFnZUJhc2U7Ci0jaWZuZGVmIENPRkZfV0lUSF9QRVA2NAotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICY9IDB4ZmZmZmZmZmY7Ci0jZW5kaWYKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSNpZm5kZWYgQ09GRl9XSVRIX1BFUDY0Ci0gICAgICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCAmPSAweGZmZmZmZmZmOwotI2VuZGlmCi0gICAgfQotI2lmbmRlZiBDT0ZGX1dJVEhfUEVQNjQKLSAgLyogUEUzMisgZG9lcyBub3QgaGF2ZSBkYXRhX3N0YXJ0IG1lbWJlciEgKi8KLSAgaWYgKGFvdXRoZHJfaW50LT5kc2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBub3JtYWxseSBzZXQgdXAgYnkgcHBjX3JlbG9jYXRlX3NlY3Rpb24uCi0gICAgIEluIHRoZSBjYXNlIG9mIHJlYWRpbmcgYSBmaWxlIGluLCB3ZSBjYW4gcGljayB0aGVtIHVwIGZyb20gdGhlCi0gICAgIERhdGFEaXJlY3RvcnkuICAqLwotICBmaXJzdF90aHVua19hZGRyZXNzID0gYS0+RGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgOwotICB0aHVua19zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxMl0uU2l6ZTsKLSAgaW1wb3J0X3RhYmxlX3NpemUgPSBhLT5EYXRhRGlyZWN0b3J5WzFdLlNpemU7Ci0jZW5kaWYKLQotfQotCi0vKiBBIHN1cHBvcnQgZnVuY3Rpb24gZm9yIGJlbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9kYXRhX2VudHJ5IChhYmZkLCBhb3V0LCBpZHgsIG5hbWUsIGJhc2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmFvdXQ7Ci0gICAgIGludCBpZHg7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYmFzZTsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQotICAvKiBhZGQgaW1wb3J0IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpZiBpdCBleGlzdHMgKi8KLSAgaWYgKChzZWMgIT0gTlVMTCkKLSAgICAgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQotICAgICAgJiYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTCkpCi0gICAgewotICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzID0gKHNlYy0+dm1hIC0gYmFzZSkgJiAweGZmZmZmZmZmOwotICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUgPSBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT52aXJ0X3NpemU7Ci0gICAgICBzZWMtPmZsYWdzIHw9IFNFQ19EQVRBOwotICAgIH0KLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHI7Ci0gIFBFQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoUEVBT1VUSERSICopb3V0OwotICBiZmRfdm1hIHNhLCBmYSwgaWI7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBkZWZpbml0ZWx5IGlzIHJlcXVpcmVkIGZvciBFRkkgYXBwbGljYXRpb25zLgotICAgICBQZXJoYXBzIGl0J3MgbmVlZGVkIGZvciBvdGhlciBQRUkgdGFyZ2V0cyBhcyB3ZWxsLCBidXQgSSBkb24ndAotICAgICBrbm93IHRoYXQgZm9yIGEgZmFjdCwgc28gd2UgcGxheSBpdCBzYWZlIGhlcmUgYW5kIHR3ZWFrIHRoZQotICAgICBhbGlnbm1lbnRzIG9ubHkgaWYgUEVJX0ZPUkNFX01JTklNVU1fQUxJR05NRU5UIGlzCi0gICAgIGRlZmluZWQuIC0tZGF2aWRtICovCi0jaWZkZWYgUEVJX0ZPUkNFX01JTklNVU1fQUxJR05NRU5UCi0gIGlmICghZXh0cmEtPkZpbGVBbGlnbm1lbnQpCi0gICAgZXh0cmEtPkZpbGVBbGlnbm1lbnQgPSBQRV9ERUZfRklMRV9BTElHTk1FTlQ7Ci0gIGlmICghZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQgPSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQ7Ci0jZW5kaWYKLQotI2lmZGVmIFBFSV9ERUZBVUxUX1RBUkdFVF9TVUJTWVNURU0KLSAgaWYgKGV4dHJhLT5TdWJzeXN0ZW0gPT0gSU1BR0VfU1VCU1lTVEVNX1VOS05PV04pCi0gICAgZXh0cmEtPlN1YnN5c3RlbSA9IFBFSV9ERUZBVUxUX1RBUkdFVF9TVUJTWVNURU07Ci0jZW5kaWYKLQotICBzYSA9IGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50OwotICBmYSA9IGV4dHJhLT5GaWxlQWxpZ25tZW50OwotICBpYiA9IGV4dHJhLT5JbWFnZUJhc2U7Ci0KLSAgaWYgKGFvdXRoZHJfaW4tPnRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+dGV4dF9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW4tPmRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW4tPmVudHJ5KSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT5lbnRyeSAtPSBpYjsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jZGVmaW5lIEZBKHgpICAoKCh4KSArIGZhIC0xICkgJiAoLSBmYSkpCi0jZGVmaW5lIFNBKHgpICAoKCh4KSArIHNhIC0xICkgJiAoLSBzYSkpCi0KLSAgLyogV2UgbGlrZSB0byBoYXZlIHRoZSBzaXplcyBhbGlnbmVkICovCi0KLSAgYW91dGhkcl9pbi0+YnNpemUgPSBGQSAoYW91dGhkcl9pbi0+YnNpemUpOwotCi0KLSAgZXh0cmEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUzsKLQotICAvKiBmaXJzdCBudWxsIG91dCBhbGwgZGF0YSBkaXJlY3RvcnkgZW50cmllcyAuLiAqLwotICBtZW1zZXQgKGV4dHJhLT5EYXRhRGlyZWN0b3J5LCBzaXplb2YgKGV4dHJhLT5EYXRhRGlyZWN0b3J5KSwgMCk7Ci0KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAwLCAiLmVkYXRhIiwgaWIpOwotCi0gIC8qIERvbid0IGNhbGwgYWRkX2RhdGFfZW50cnkgZm9yIC5pZGF0YSQyIG9yIC5pZGF0YSQ1LiAgSXQncyBkb25lIGluCi0gICAgIGJmZF9jb2ZmX2ZpbmFsX2xpbmsgd2hlcmUgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcwotICAgICBhdmFpbGFibGUuICAqLwotCi0gIC8qIEhvd2V2ZXIsIHVudGlsIG90aGVyIC5pZGF0YSBmaXhlcyBhcmUgbWFkZSAocGVuZGluZyBwYXRjaCksIHRoZQotICAgICBlbnRyeSBmb3IgLmlkYXRhIGlzIG5lZWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkuICBGSVhNRS4gICovCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMSwgIi5pZGF0YSIgLCBpYik7Ci0KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAyLCAiLnJzcmMiICwgaWIpOwotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMywgIi5wZGF0YSIsIGliKTsKLQotICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSB2aXJ0dWFsIHNpemUgKHdoaWNoIGlzIHdoYXQncyBzZXQgYnkKLSAgICAgYWRkX2RhdGFfZW50cnkpIGZvciAucmVsb2MgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzaXplIHJlY29yZGVkCi0gICAgIGluIHRoaXMgc2xvdCBieSBNU1ZDOyBpdCBkb2Vzbid0IHNlZW0gdG8gY2F1c2UgcHJvYmxlbXMgKHNvIGZhciksCi0gICAgIGJ1dCBzaW5jZSBpdCdzIHRoZSBiZXN0IHdlJ3ZlIGdvdCwgdXNlIGl0LiAgSXQgZG9lcyBkbyB0aGUgcmlnaHQKLSAgICAgdGhpbmcgZm9yIC5wZGF0YS4gICovCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24pCi0gICAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCA1LCAiLnJlbG9jIiwgaWIpOwotCi0gIHsKLSAgICBhc2VjdGlvbiAqc2VjOwotICAgIGJmZF92bWEgZHNpemU9IDA7Ci0gICAgYmZkX3ZtYSBpc2l6ZSA9IFNBKGFiZmQtPnNlY3Rpb25zLT5maWxlcG9zKTsKLSAgICBiZmRfdm1hIHRzaXplPSAwOwotCi0gICAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgICB7Ci0JaW50IHJvdW5kZWQgPSBGQShzZWMtPl9yYXdfc2l6ZSk7Ci0KLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19EQVRBKQotCSAgZHNpemUgKz0gcm91bmRlZDsKLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgdHNpemUgKz0gcm91bmRlZDsKLQkvKiBUaGUgaW1hZ2Ugc2l6ZSBpcyB0aGUgdG90YWwgVklSVFVBTCBzaXplICh3aGljaCBpcyB3aGF0IGlzCi0JICAgaW4gdGhlIHZpcnRfc2l6ZSBmaWVsZCkuICBGaWxlcyBoYXZlIGJlZW4gc2VlbiAoZnJvbSBNU1ZDCi0JICAgNS4wIGxpbmsuZXhlKSB3aGVyZSB0aGUgZmlsZSBzaXplIG9mIHRoZSAuZGF0YSBzZWdtZW50IGlzCi0JICAgcXVpdGUgc21hbGwgY29tcGFyZWQgdG8gdGhlIHZpcnR1YWwgc2l6ZS4gIFdpdGhvdXQgdGhpcwotCSAgIGZpeCwgc3RyaXAgbXVuZ2VzIHRoZSBmaWxlLiAgKi8KLQlpc2l6ZSArPSBTQSAoRkEgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZSkpOwotICAgICAgfQotCi0gICAgYW91dGhkcl9pbi0+ZHNpemUgPSBkc2l6ZTsKLSAgICBhb3V0aGRyX2luLT50c2l6ZSA9IHRzaXplOwotICAgIGV4dHJhLT5TaXplT2ZJbWFnZSA9IGlzaXplOwotICB9Ci0KLSAgZXh0cmEtPlNpemVPZkhlYWRlcnMgPSBhYmZkLT5zZWN0aW9ucy0+ZmlsZXBvczsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRoZHJfaW4tPm1hZ2ljLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLm1hZ2ljKTsKLQotI2RlZmluZSBMSU5LRVJfVkVSU0lPTiAyNTYgLyogVGhhdCBpcywgMi41NiAqLwotCi0gIC8qIFRoaXMgcGllY2Ugb2YgbWFnaWMgc2V0cyB0aGUgImxpbmtlciB2ZXJzaW9uIiBmaWVsZCB0bwotICAgICBMSU5LRVJfVkVSU0lPTi4gICovCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwKLQkJTElOS0VSX1ZFUlNJT04gLyAxMDAgKyAoTElOS0VSX1ZFUlNJT04gJSAxMDApICogMjU2LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnZzdGFtcCk7Ci0KLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC50ZXh0X3N0YXJ0KTsKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEVQNjQKLSAgLyogUEUzMisgZG9lcyBub3QgaGF2ZSBkYXRhX3N0YXJ0IG1lbWJlciEgKi8KLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5kYXRhX3N0YXJ0KTsKLSNlbmRpZgotCi0gIFBVVF9PUFRIRFJfSU1BR0VfQkFTRSAoYWJmZCwgZXh0cmEtPkltYWdlQmFzZSwKLQkJCSAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkltYWdlQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkZpbGVBbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RmlsZUFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+UmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlJlc2VydmVkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkltYWdlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkltYWdlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhZGVycywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFkZXJzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+Q2hlY2tTdW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Q2hlY2tTdW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5TdWJzeXN0ZW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U3Vic3lzdGVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+RGxsQ2hhcmFjdGVyaXN0aWNzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIFBVVF9PUFRIRFJfU0laRV9PRl9TVEFDS19SRVNFUlZFIChhYmZkLCBleHRyYS0+U2l6ZU9mU3RhY2tSZXNlcnZlLAotCQkJCSAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZlN0YWNrUmVzZXJ2ZSk7Ci0gIFBVVF9PUFRIRFJfU0laRV9PRl9TVEFDS19DT01NSVQgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja0NvbW1pdCwKLQkJCQkgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgUFVUX09QVEhEUl9TSVpFX09GX0hFQVBfUkVTRVJWRSAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBSZXNlcnZlLAotCQkJCSAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBQVVRfT1BUSERSX1NJWkVfT0ZfSEVBUF9DT01NSVQgKGFiZmQsIGV4dHJhLT5TaXplT2ZIZWFwQ29tbWl0LAotCQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TG9hZGVyRmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TG9hZGVyRmxhZ3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfb25seV9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgaW50IGlkeDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKLSAgc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyICpmaWxlaGRyX291dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIgKilvdXQ7Ci0KLSAgaWYgKHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbikKLSAgICBmaWxlaGRyX2luLT5mX2ZsYWdzICY9IH5GX1JFTEZMRzsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmRsbCkKLSAgICBmaWxlaGRyX2luLT5mX2ZsYWdzIHw9IEZfRExMOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfbWFnaWMgICAgPSBET1NNQUdJQzsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jYmxwICAgICA9IDB4OTA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3AgICAgICAgPSAweDM7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3JsYyAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3BhcmhkciAgPSAweDQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbWluYWxsb2MgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MgPSAweGZmZmY7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfc3MgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfc3AgICAgICAgPSAweGI4OwotICBmaWxlaGRyX2luLT5wZS5lX2NzdW0gICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2lwICAgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2NzICAgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2xmYXJsYyAgID0gMHg0MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9vdm5vICAgICA9IDB4MDsKLQotICBmb3IgKGlkeD0wOyBpZHggPCA0OyBpZHgrKykKLSAgICBmaWxlaGRyX2luLT5wZS5lX3Jlc1tpZHhdID0gMHgwOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfb2VtaWQgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvID0gMHgwOwotCi0gIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSA9IDB4MDsKLQotICBmaWxlaGRyX2luLT5wZS5lX2xmYW5ldyA9IDB4ODA7Ci0KLSAgLyogdGhpcyBuZXh0IGNvbGxlY3Rpb24gb2YgZGF0YSBhcmUgbW9zdGx5IGp1c3QgY2hhcmFjdGVycy4gIEl0IGFwcGVhcnMKLSAgICAgdG8gYmUgY29uc3RhbnQgd2l0aGluIHRoZSBoZWFkZXJzIHB1dCBvbiBOVCBleGVzICovCi0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzBdICA9IDB4MGViYTFmMGU7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzFdICA9IDB4Y2QwOWI0MDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzJdICA9IDB4NGMwMWI4MjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzNdICA9IDB4Njg1NDIxY2Q7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzRdICA9IDB4NzAyMDczNjk7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzVdICA9IDB4NzI2NzZmNzI7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzZdICA9IDB4NjMyMDZkNjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzddICA9IDB4NmY2ZTZlNjE7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzhdICA9IDB4NjU2MjIwNzQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzldICA9IDB4NmU3NTcyMjA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEwXSA9IDB4MjA2ZTY5MjA7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzExXSA9IDB4MjA1MzRmNDQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEyXSA9IDB4NjU2NDZmNmQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEzXSA9IDB4MGEwZDBkMmU7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE0XSA9IDB4MjQ7Ci0gIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE1XSA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUubnRfc2lnbmF0dXJlID0gTlRfU0lHTkFUVVJFOwotCi0KLQotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHRpbWUgKDApLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgLyogcHV0IGluIGV4dHJhIGRvcyBoZWFkZXIgc3R1ZmYuICBUaGlzIGRhdGEgcmVtYWlucyBlc3NlbnRpYWxseQotICAgICBjb25zdGFudCwgaXQganVzdCBoYXMgdG8gYmUgdGFja2VkIG9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgYWxsIGV4ZXMKLSAgICAgZm9yIE5UICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jYmxwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY2JscCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3JsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jcGFyaGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWluYWxsb2MsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9taW5hbGxvYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21heGFsbG9jLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWF4YWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzdW0sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jc3VtKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfaXAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9pcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vdm5vLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb3Zubyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0sCi0JCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9yZXNbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb2VtaWQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9vZW1pZCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWluZm8sCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9vZW1pbmZvKTsKLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgMTA7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzMltpZHhdLAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzMltpZHhdKTsKLSAgfQotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFuZXcsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFuZXcpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVtpZHhdLAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmRvc19tZXNzYWdlW2lkeF0pOwotICB9Ci0KLSAgLyogYWxzbyBwdXQgaW4gdGhlIE5UIHNpZ25hdHVyZSAqLwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUubnRfc2lnbmF0dXJlLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPm50X3NpZ25hdHVyZSk7Ci0KLQotCi0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlX29ubHlfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKLSAgYmZkX3ZtYSBwczsKLSAgYmZkX3ZtYSBzczsKLQotICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLQotICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLAotCQkgICAgKChzY25oZHJfaW50LT5zX3ZhZGRyIAotCQkgICAgICAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JCSAgICAgJiAweGZmZmZmZmZmKSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotICAvKiBOVCB3YW50cyB0aGUgc2l6ZSBkYXRhIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKLSAgICAgTlRfRklMRV9BTElHTk1FTlQsIGJ1dCB6ZXJvIGlmIGl0IGhhcyBubyBjb250ZW50IChhcyBpbiAuYnNzLAotICAgICBzb21ldGltZXMpLiAgKi8KLQotICBpZiAoKHNjbmhkcl9pbnQtPnNfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcyA9IHNjbmhkcl9pbnQtPnNfc2l6ZTsKLSAgICAgIHNzID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcyA9IHNjbmhkcl9pbnQtPnNfcGFkZHI7Ci0gICAgICBzcyA9IHNjbmhkcl9pbnQtPnNfc2l6ZTsKLSAgICB9Ci0KLSAgUFVUX1NDTkhEUl9TSVpFIChhYmZkLCBzcywKLQkJICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2l6ZSk7Ci0KLQotICAvKiBzX3BhZGRyIGluIFBFIGlzIHJlYWxseSB0aGUgdmlydHVhbCBzaXplLiAgKi8KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgcHMsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLQotICAvKiBFeHRyYSBmbGFncyBtdXN0IGJlIHNldCB3aGVuIGRlYWxpbmcgd2l0aCBOVC4gIEFsbCBzZWN0aW9ucyBzaG91bGQgYWxzbwotICAgICBoYXZlIHRoZSBJTUFHRV9TQ05fTUVNX1JFQUQgKDB4NDAwMDAwMDApIGZsYWcgc2V0LiAgSW4gYWRkaXRpb24sIHRoZQotICAgICAudGV4dCBzZWN0aW9uIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgKDB4MjAwMDAwMDApIGFuZCB0aGUgZGF0YQotICAgICBzZWN0aW9ucyAoLmlkYXRhLCAuZGF0YSwgLmJzcywgLkNSVCkgbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fV1JJVEUgc2V0Ci0gICAgICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoIHRoZSAuaWRhdGEgc2VjdGlvbiBzaW5jZQotICAgICB0aGUgYWRkcmVzc2VzIGZvciByb3V0aW5lcyBmcm9tIC5kbGxzIG11c3QgYmUgb3ZlcndyaXR0ZW4pLiAgSWYgLnJlbG9jCi0gICAgIHNlY3Rpb24gZGF0YSBpcyBldmVyIGdlbmVyYXRlZCwgd2UgbXVzdCBhZGQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotICAgICAoMHgwMjAwMDAwMCkuICBBbHNvLCB0aGUgcmVzb3VyY2UgZGF0YSBzaG91bGQgYWxzbyBiZSByZWFkIGFuZAotICAgICB3cml0YWJsZS4gICovCi0KLSAgLyogRklYTUU6IGFsaWdubWVudCBpcyBhbHNvIGVuY29kZWQgaW4gdGhpcyBmaWVsZCwgYXQgbGVhc3Qgb24gcHBjIChrcmspICovCi0gIC8qIEZJWE1FOiBldmVuIHdvcnNlLCBJIGRvbid0IHNlZSBob3cgdG8gZ2V0IHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgZmllbGQqLwotICAvKiAgICAgICAgYmFjay4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB7Ci0gICAgaW50IGZsYWdzID0gc2NuaGRyX2ludC0+c19mbGFnczsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmxhZ3MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgfQotCi0gIGlmIChjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8KLSAgICAgICYmICEgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvLT5zaGFyZWQKLSAgICAgICYmIHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEJ5IGluZmVyZW5jZSBmcm9tIGxvb2tpbmcgYXQgTVMgb3V0cHV0LCB0aGUgMzIgYml0IGZpZWxkCi0JIHdoaWNoIGlzIHRoZSBjb21iaW50aW9uIG9mIHRoZSBudW1iZXJfb2ZfcmVsb2NzIGFuZAotCSBudW1iZXJfb2ZfbGluZW5vcyBpcyB1c2VkIGZvciB0aGUgbGluZSBudW1iZXIgY291bnQgaW4KLQkgZXhlY3V0YWJsZXMuICBBIDE2LWJpdCBmaWVsZCB3b24ndCBkbyBmb3IgY2MxLiAgVGhlIE1TCi0JIGRvY3VtZW50IHNheXMgdGhhdCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpcyB6ZXJvIGZvcgotCSBleGVjdXRhYmxlcywgYnV0IHRoZSAxNy10aCBiaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gYmUgdGhlcmUuCi0JIE92ZXJmbG93IGlzIG5vdCBhbiBpc3N1ZTogYSA0Ry1saW5lIHByb2dyYW0gd2lsbCBvdmVyZmxvdyBhCi0JIGJ1bmNoIG9mIG90aGVyIGZpZWxkcyBsb25nIGJlZm9yZSB0aGlzISAgKi8KLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubyAmIDB4ZmZmZiwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubyA+PiAxNiwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNjbmhkcl9pbnQtPnNfbmxubm8gPD0gMHhmZmZmKQotCWJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywKLQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgc2NuaGRyX2ludC0+c19ubG5ubyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLQkgIHJldCA9IDA7Ci0JfQotICAgICAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKLQliZmRfaF9wdXRfMTYgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotCSAgcmV0ID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY2hhciAqIGRpcl9uYW1lc1tJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU10gPQotewotICBOXyAoIkV4cG9ydCBEaXJlY3RvcnkgWy5lZGF0YSAob3Igd2hlcmUgZXZlciB3ZSBmb3VuZCBpdCldIiksCi0gIE5fICgiSW1wb3J0IERpcmVjdG9yeSBbcGFydHMgb2YgLmlkYXRhXSIpLAotICBOXyAoIlJlc291cmNlIERpcmVjdG9yeSBbLnJzcmNdIiksCi0gIE5fICgiRXhjZXB0aW9uIERpcmVjdG9yeSBbLnBkYXRhXSIpLAotICBOXyAoIlNlY3VyaXR5IERpcmVjdG9yeSIpLAotICBOXyAoIkJhc2UgUmVsb2NhdGlvbiBEaXJlY3RvcnkgWy5yZWxvY10iKSwKLSAgTl8gKCJEZWJ1ZyBEaXJlY3RvcnkiKSwKLSAgTl8gKCJEZXNjcmlwdGlvbiBEaXJlY3RvcnkiKSwKLSAgTl8gKCJTcGVjaWFsIERpcmVjdG9yeSIpLAotICBOXyAoIlRocmVhZCBTdG9yYWdlIERpcmVjdG9yeSBbLnRsc10iKSwKLSAgTl8gKCJMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5IiksCi0gIE5fICgiQm91bmQgSW1wb3J0IERpcmVjdG9yeSIpLAotICBOXyAoIkltcG9ydCBBZGRyZXNzIFRhYmxlIERpcmVjdG9yeSIpLAotICBOXyAoIkRlbGF5IEltcG9ydCBEaXJlY3RvcnkiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIikKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFBPV0VSUENfTEVfUEUKLS8qIFRoZSBjb2RlIGZvciB0aGUgUFBDIHJlYWxseSBmYWxscyBpbiB0aGUgImFyY2hpdGVjdHVyZSBkZXBlbmRlbnQiCi0gICBjYXRlZ29yeS4gIEhvd2V2ZXIsIGl0J3Mgbm90IGNsZWFyIHRoYXQgYW55b25lIHdpbGwgZXZlciBjYXJlLCBzbwotICAgd2UncmUgaWdub3JpbmcgdGhlIGlzc3VlIGZvciBub3c7IGlmL3doZW4gUFBDIG1hdHRlcnMsIHNvbWUgb2YgdGhpcwotICAgbWF5IG5lZWQgdG8gZ28gaW50byBwZWljb2RlLmgsIG9yIGFyZ3VtZW50cyBwYXNzZWQgdG8gZW5hYmxlIHRoZQotICAgUFBDLSBzcGVjaWZpYyBjb2RlLiAgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9pZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX3NpZ25lZF92bWEgYWRqOwotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICBhc2VjdGlvbiAqcmVsX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWxkYXRhIik7Ci0jZW5kaWYKLQotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGludCBvbmFsaW5lID0gMjA7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBiZmRfdm1hIGFkZHI7Ci0KLSAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzFdLlZpcnR1YWxBZGRyZXNzOwotCi0gIGlmIChhZGRyID09IDAgJiYgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIE1heWJlIHRoZSBleHRyYSBoZWFkZXIgaXNuJ3QgdGhlcmUuICBMb29rIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEiKTsKLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGFkZHIgPSBzZWN0aW9uLT52bWE7Ci0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWRkciArPSBleHRyYS0+SW1hZ2VCYXNlOwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgIGlmIChhZGRyID49IHNlY3Rpb24tPnZtYSAmJiBhZGRyIDwgc2VjdGlvbi0+dm1hICsgZGF0YXNpemUpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLAotCQkgICBfKCJcblRoZXJlIGlzIGFuIGltcG9ydCB0YWJsZSwgYnV0IHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgaXQgY291bGQgbm90IGJlIGZvdW5kXG4iKSk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlcmUgaXMgYW4gaW1wb3J0IHRhYmxlIGluICVzIGF0IDB4JWx4XG4iKSwKLQkgICBzZWN0aW9uLT5uYW1lLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgZGF0YW9mZiA9IGFkZHIgLSBzZWN0aW9uLT52bWE7Ci0gIGRhdGFzaXplIC09IGRhdGFvZmY7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGlmIChyZWxfc2VjdGlvbiAhPSAwICYmIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSB0b2MgYWRkcmVzcyBjYW4gYmUgZm91bmQgYnkgdGFraW5nIHRoZSBzdGFydGluZyBhZGRyZXNzLAotCSB3aGljaCBvbiB0aGUgUFBDIGxvY2F0ZXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiBUaGUKLQkgZGVzY3JpcHRvciBjb25zaXN0cyBvZiB0aGUgZnVuY3Rpb24gY29kZSBzdGFydGluZyBhZGRyZXNzCi0JIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSB0b2MuIFRoZSBzdGFydGluZyBhZGRyZXNzIHdlCi0JIGdldCBmcm9tIHRoZSBiZmQsIGFuZCB0aGUgZGVzY3JpcHRvciBpcyBzdXBwb3NlZCB0byBiZSBpbiB0aGUKLQkgLnJlbGRhdGEgc2VjdGlvbi4gICovCi0KLSAgICAgIGJmZF92bWEgbG9hZGFibGVfdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHRvY19hZGRyZXNzOwotICAgICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLAotCQkJCQkJCQkgcmVsX3NlY3Rpb24pKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJcmVsX3NlY3Rpb24sCi0JCQkJKFBUUikgZGF0YSwgMCwKLQkJCQliZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikpOwotCi0gICAgICBvZmZzZXQgPSBhYmZkLT5zdGFydF9hZGRyZXNzIC0gcmVsX3NlY3Rpb24tPnZtYTsKLQotICAgICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBvZmZzZXQpOwotICAgICAgbG9hZGFibGVfdG9jX2FkZHJlc3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgb2Zmc2V0ICsgNCk7Ci0gICAgICB0b2NfYWRkcmVzcyA9IGxvYWRhYmxlX3RvY19hZGRyZXNzIC0gMzI3Njg7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpKTsKLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgIF8oIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIiksCi0JICAgICAgIHN0YXJ0X2FkZHJlc3MsIGxvYWRhYmxlX3RvY19hZGRyZXNzLCB0b2NfYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgIF8oIlxuTm8gcmVsZGF0YSBzZWN0aW9uISBGdW5jdGlvbiBkZXNjcmlwdG9yIG5vdCBkZWNvZGVkLlxuIikpOwotICAgIH0KLSNlbmRpZgotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEltcG9ydCBUYWJsZXMgKGludGVycHJldGVkICVzIHNlY3Rpb24gY29udGVudHMpXG4iKSwKLQkgIHNlY3Rpb24tPm5hbWUpOwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCIgdm1hOiAgICAgICAgICAgIEhpbnQgICAgVGltZSAgICAgIEZvcndhcmQgIERMTCAgICAgICBGaXJzdFxuIikpOwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCIgICAgICAgICAgICAgICAgIFRhYmxlICAgU3RhbXAgICAgIENoYWluICAgIE5hbWUgICAgICBUaHVua1xuIikpOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoZGF0YW9mZiArIGRhdGFzaXplKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCB0aGUgd2hvbGUgc2VjdGlvbi4gIFNvbWUgb2YgdGhlIGZpZWxkcyBtaWdodCBiZSBiZWZvcmUgZGF0YW9mZi4gICovCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwKLQkJCQkgIDAsIGRhdGFvZmYgKyBkYXRhc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFkaiA9IHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGRhdGFzaXplOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBoaW50X2FkZHI7Ci0gICAgICBiZmRfdm1hIHRpbWVfc3RhbXA7Ci0gICAgICBiZmRfdm1hIGZvcndhcmRfY2hhaW47Ci0gICAgICBiZmRfdm1hIGRsbF9uYW1lOwotICAgICAgYmZkX3ZtYSBmaXJzdF90aHVuazsKLSAgICAgIGludCBpZHggPSAwOwotICAgICAgYmZkX3NpemVfdHlwZSBqOwotICAgICAgY2hhciAqZGxsOwotCi0gICAgICAvKiBwcmludCAoaSArIGV4dHJhLT5EYXRhRGlyZWN0b3J5WzFdLlZpcnR1YWxBZGRyZXNzKSAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICIgJTA4bHhcdCIsICh1bnNpZ25lZCBsb25nKSAoaSArIGFkaiArIGRhdGFvZmYpKTsKLQotICAgICAgaWYgKGkgKyAyMCA+IGRhdGFzaXplKQotCXsKLQkgIC8qIGNoZWNrIHN0dWZmICovCi0JICA7Ci0JfQotCi0gICAgICBoaW50X2FkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIGRhdGFvZmYpOwotICAgICAgdGltZV9zdGFtcCA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgNCArIGRhdGFvZmYpOwotICAgICAgZm9yd2FyZF9jaGFpbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgOCArIGRhdGFvZmYpOwotICAgICAgZGxsX25hbWUgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIDEyICsgZGF0YW9mZik7Ci0gICAgICBmaXJzdF90aHVuayA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgMTYgKyBkYXRhb2ZmKTsKLQotICAgICAgZnByaW50ZiAoZmlsZSwgIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgaGludF9hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgdGltZV9zdGFtcCwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZvcndhcmRfY2hhaW4sCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBkbGxfbmFtZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZpcnN0X3RodW5rKTsKLQotICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGZpcnN0X3RodW5rID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIGRsbCA9IChjaGFyICopIGRhdGEgKyBkbGxfbmFtZSAtIGFkajsKLSAgICAgIGZwcmludGYoZmlsZSwgXygiXG5cdERMTCBOYW1lOiAlc1xuIiksIGRsbCk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0KLQkgIGlkeCA9IGhpbnRfYWRkciAtIGFkajsKLQotCSAgZm9yIChqID0gMDsgaiA8IGRhdGFzaXplOyBqICs9IDQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIG1lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHggKyBqKTsKLQotCSAgICAgIGlmIChtZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgaWYgKG1lbWJlciAmIDB4ODAwMDAwMDApCi0JCWZwcmludGYgKGZpbGUsICJcdCUwNGx4XHQgJTRsdSIsIG1lbWJlciwKLQkJCSBtZW1iZXIgJiAweDdmZmZmZmZmKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgb3JkaW5hbDsKLQkJICBjaGFyICptZW1iZXJfbmFtZTsKLQotCQkgIG9yZGluYWwgPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgbWVtYmVyIC0gYWRqKTsKLQkJICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBtZW1iZXIgLSBhZGogKyAyOwotCQkgIGZwcmludGYgKGZpbGUsICJcdCUwNGx4XHQgJTRkICAlcyIsCi0JCQkgICBtZW1iZXIsIG9yZGluYWwsIG1lbWJlcl9uYW1lKTsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHRpbWUgc3RhbXAgaXMgbm90IHplcm8sIHRoZSBpbXBvcnQgYWRkcmVzcwotICAgICAgICAgICAgICAgICB0YWJsZSBob2xkcyBhY3R1YWwgYWRkcmVzc2VzLiAgKi8KLQkgICAgICBpZiAodGltZV9zdGFtcCAhPSAwCi0JCSAgJiYgZmlyc3RfdGh1bmsgIT0gMAotCQkgICYmIGZpcnN0X3RodW5rICE9IGhpbnRfYWRkcikKLQkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHgiLAotCQkJIChsb25nKSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgZmlyc3RfdGh1bmsgLSBhZGogKyBqKSk7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGhpbnRfYWRkciAhPSBmaXJzdF90aHVuayAmJiB0aW1lX3N0YW1wID09IDApCi0JewotCSAgaW50IGRpZmZlciA9IDA7Ci0JICBpbnQgaWR4MjsKLQotCSAgaWR4MiA9IGZpcnN0X3RodW5rIC0gYWRqOwotCi0JICBmb3IgKGogPSAwOyBqIDwgZGF0YXNpemU7IGogKz0gNCkKLQkgICAgewotCSAgICAgIGludCBvcmRpbmFsOwotCSAgICAgIGNoYXIgKm1lbWJlcl9uYW1lOwotCSAgICAgIGJmZF92bWEgaGludF9tZW1iZXIgPSAwOwotCSAgICAgIGJmZF92bWEgaWF0X21lbWJlcjsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQkJaGludF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4ICsgaik7Ci0JICAgICAgaWF0X21lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHgyICsgaik7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgJiYgaWF0X21lbWJlciA9PSAwKQotCQlicmVhazsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCB8fCBoaW50X21lbWJlciAhPSBpYXRfbWVtYmVyKQotCQl7Ci0JCSAgaWYgKGRpZmZlciA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmaWxlLAotCQkJICAgICAgIF8oIlx0VGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlIChkaWZmZXJlbmNlIGZvdW5kKVxuIikpOwotCQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIlx0dm1hOiAgSGludC9PcmQgTWVtYmVyLU5hbWVcbiIpKTsKLQkJICAgICAgZGlmZmVyID0gMTsKLQkJICAgIH0KLQkJICBpZiAoaWF0X21lbWJlciA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCQkgICAgICBfKCJcdD4+PiBSYW4gb3V0IG9mIElBVCBtZW1iZXJzIVxuIikpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgb3JkaW5hbCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBpYXRfbWVtYmVyIC0gYWRqKTsKLQkJICAgICAgbWVtYmVyX25hbWUgPSAoY2hhciAqKSBkYXRhICsgaWF0X21lbWJlciAtIGFkaiArIDI7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzXG4iLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGlhdF9tZW1iZXIsCi0JCQkgICAgICBvcmRpbmFsLAotCQkJICAgICAgbWVtYmVyX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaGludF9hZGRyICE9IDAgJiYgaGludF9tZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChkaWZmZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYoZmlsZSwKLQkJICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgaWRlbnRpY2FsXG4iKSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9lZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgYmZkX3NpZ25lZF92bWEgYWRqOwotICBzdHJ1Y3QgRURUX3R5cGUKLSAgICB7Ci0gICAgICBsb25nIGV4cG9ydF9mbGFnczsgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgLSBzaG91bGQgYmUgemVybyAqLwotICAgICAgbG9uZyB0aW1lX3N0YW1wOwotICAgICAgc2hvcnQgbWFqb3JfdmVyOwotICAgICAgc2hvcnQgbWlub3JfdmVyOwotICAgICAgYmZkX3ZtYSBuYW1lOyAgICAgICAgICAgICAgICAgIC8qIHJ2YSAtIHJlbGF0aXZlIHRvIGltYWdlIGJhc2UgKi8KLSAgICAgIGxvbmcgYmFzZTsgICAgICAgICAgICAgICAgICAgICAvKiBvcmRpbmFsIGJhc2UgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2Z1bmN0aW9uczsgICAvKiBOdW1iZXIgaW4gdGhlIGV4cG9ydCBhZGRyZXNzIHRhYmxlICovCi0gICAgICB1bnNpZ25lZCBsb25nIG51bV9uYW1lczsgICAgICAgLyogTnVtYmVyIGluIHRoZSBuYW1lIHBvaW50ZXIgdGFibGUgKi8KLSAgICAgIGJmZF92bWEgZWF0X2FkZHI7ICAgIC8qIHJ2YSB0byB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KLSAgICAgIGJmZF92bWEgbnB0X2FkZHI7ICAgICAgICAvKiBydmEgdG8gdGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgKi8KLSAgICAgIGJmZF92bWEgb3RfYWRkcjsgLyogcnZhIHRvIHRoZSBPcmRpbmFsIFRhYmxlICovCi0gICAgfSBlZHQ7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBiZmRfdm1hIGFkZHI7Ci0KLSAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlZpcnR1YWxBZGRyZXNzOwotCi0gIGlmIChhZGRyID09IDAgJiYgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMF0uU2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIE1heWJlIHRoZSBleHRyYSBoZWFkZXIgaXNuJ3QgdGhlcmUuICBMb29rIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZWRhdGEiKTsKLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGFkZHIgPSBzZWN0aW9uLT52bWE7Ci0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWRkciArPSBleHRyYS0+SW1hZ2VCYXNlOwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgIGlmIChhZGRyID49IHNlY3Rpb24tPnZtYSAmJiBhZGRyIDwgc2VjdGlvbi0+dm1hICsgZGF0YXNpemUpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLAotCQkgICBfKCJcblRoZXJlIGlzIGFuIGV4cG9ydCB0YWJsZSwgYnV0IHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgaXQgY291bGQgbm90IGJlIGZvdW5kXG4iKSk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlcmUgaXMgYW4gZXhwb3J0IHRhYmxlIGluICVzIGF0IDB4JWx4XG4iKSwKLQkgICBzZWN0aW9uLT5uYW1lLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgZGF0YW9mZiA9IGFkZHIgLSBzZWN0aW9uLT52bWE7Ci0gIGRhdGFzaXplIC09IGRhdGFvZmY7Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChkYXRhc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwgZGF0YW9mZiwKLQkJCQkgIGRhdGFzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR28gZ2V0IEV4cG9ydCBEaXJlY3RvcnkgVGFibGUgKi8KLSAgZWR0LmV4cG9ydF9mbGFncyAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzApOwotICBlZHQudGltZV9zdGFtcCAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErNCk7Ci0gIGVkdC5tYWpvcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSs4KTsKLSAgZWR0Lm1pbm9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzEwKTsKLSAgZWR0Lm5hbWUgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzEyKTsKLSAgZWR0LmJhc2UgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzE2KTsKLSAgZWR0Lm51bV9mdW5jdGlvbnMgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzIwKTsKLSAgZWR0Lm51bV9uYW1lcyAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzI0KTsKLSAgZWR0LmVhdF9hZGRyICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzI4KTsKLSAgZWR0Lm5wdF9hZGRyICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzMyKTsKLSAgZWR0Lm90X2FkZHIgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzM2KTsKLQotICBhZGogPSBzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlICsgZGF0YW9mZjsKLQotICAvKiBEdW1wIHRoZSBFRFQgZmlyc3QgZmlyc3QgKi8KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgRXhwb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgJXMgc2VjdGlvbiBjb250ZW50cylcblxuIiksCi0JICBzZWN0aW9uLT5uYW1lKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJFeHBvcnQgRmxhZ3MgXHRcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC5leHBvcnRfZmxhZ3MpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlRpbWUvRGF0ZSBzdGFtcCBcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC50aW1lX3N0YW1wKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJNYWpvci9NaW5vciBcdFx0XHQlZC8lZFxuIiksIGVkdC5tYWpvcl92ZXIsIGVkdC5taW5vcl92ZXIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiTmFtZSBcdFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICAiICVzXG4iLCBkYXRhICsgZWR0Lm5hbWUgLSBhZGopOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk9yZGluYWwgQmFzZSBcdFx0XHQlbGRcbiIpLCBlZHQuYmFzZSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTnVtYmVyIGluOlxuIikpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0RXhwb3J0IEFkZHJlc3MgVGFibGUgXHRcdCUwOGx4XG4iKSwKLQkgIGVkdC5udW1fZnVuY3Rpb25zKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcdFtOYW1lIFBvaW50ZXIvT3JkaW5hbF0gVGFibGVcdCUwOGx4XG4iKSwgZWR0Lm51bV9uYW1lcyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiVGFibGUgQWRkcmVzc2VzXG4iKSk7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQuZWF0X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgXygiXHROYW1lIFBvaW50ZXIgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5ucHRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXHRPcmRpbmFsIFRhYmxlIFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5vdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgCi0gIC8qIFRoZSBuZXh0IHRhYmxlIHRvIGZpbmQgaXMgdGhlIEV4cG9ydCBBZGRyZXNzIFRhYmxlLiBJdCdzIGJhc2ljYWxseQotICAgICBhIGxpc3Qgb2YgcG9pbnRlcnMgdGhhdCBlaXRoZXIgbG9jYXRlIGEgZnVuY3Rpb24gaW4gdGhpcyBkbGwsIG9yCi0gICAgIGZvcndhcmQgdGhlIGNhbGwgdG8gYW5vdGhlciBkbGwuIFNvbWV0aGluZyBsaWtlOgotICAgICAgdHlwZWRlZiB1bmlvbgotICAgICAgewotICAgICAgICBsb25nIGV4cG9ydF9ydmE7Ci0gICAgICAgIGxvbmcgZm9yd2FyZGVyX3J2YTsKLSAgICAgIH0gZXhwb3J0X2FkZHJlc3NfdGFibGVfZW50cnk7Ci0gICovCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5FeHBvcnQgQWRkcmVzcyBUYWJsZSAtLSBPcmRpbmFsIEJhc2UgJWxkXG4iKSwKLQkgIGVkdC5iYXNlKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9mdW5jdGlvbnM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGVhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCSAgICAgICBkYXRhICsgZWR0LmVhdF9hZGRyICsgKGkgKiA0KSAtIGFkaik7Ci0gICAgICBpZiAoZWF0X21lbWJlciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZWF0X21lbWJlciAtIGFkaiA8PSBkYXRhc2l6ZSkKLQl7Ci0JICAvKiBUaGlzIHJ2YSBpcyB0byBhIG5hbWUgKGZvcndhcmRpbmcgZnVuY3Rpb24pIGluIG91ciBzZWN0aW9uLiAgKi8KLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICAiXHRbJTRsZF0gK2Jhc2VbJTRsZF0gJTA0bHggJXMgLS0gJXNcbiIsCi0JCSAgIChsb25nKSBpLAotCQkgICAobG9uZykgKGkgKyBlZHQuYmFzZSksCi0JCSAgICh1bnNpZ25lZCBsb25nKSBlYXRfbWVtYmVyLAotCQkgICBfKCJGb3J3YXJkZXIgUlZBIiksCi0JCSAgIGRhdGEgKyBlYXRfbWVtYmVyIC0gYWRqKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU2hvdWxkIGxvY2F0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaW4gdGhlIHJlbGRhdGEgc2VjdGlvbiAqLwotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzXG4iLAotCQkgICAobG9uZykgaSwKLQkJICAgKGxvbmcpIChpICsgZWR0LmJhc2UpLAotCQkgICAodW5zaWduZWQgbG9uZykgZWF0X21lbWJlciwKLQkJICAgXygiRXhwb3J0IFJWQSIpKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlIGlzIHBhaXJlZCB3aXRoIHRoZSBFeHBvcnQgT3JkaW5hbCBUYWJsZSAqLwotICAvKiBEdW1wIHRoZW0gaW4gcGFyYWxsZWwgZm9yIGNsYXJpdHkgKi8KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5bT3JkaW5hbC9OYW1lIFBvaW50ZXJdIFRhYmxlXG4iKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5hbWVfcHRyID0gYmZkX2dldF8zMihhYmZkLAotCQkJCSAgICBkYXRhICsKLQkJCQkgICAgZWR0Lm5wdF9hZGRyCi0JCQkJICAgICsgKGkqNCkgLSBhZGopOwotICAgICAgCi0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgZGF0YSArIG5hbWVfcHRyIC0gYWRqOwotCi0gICAgICBiZmRfdm1hIG9yZCA9IGJmZF9nZXRfMTYoYWJmZCwKLQkJCQkgICAgZGF0YSArCi0JCQkJICAgIGVkdC5vdF9hZGRyCi0JCQkJICAgICsgKGkqMikgLSBhZGopOwotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICJcdFslNGxkXSAlc1xuIiwgKGxvbmcpIG9yZCwgbmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgcmVhbGx5IGlzIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQuICBPbiBJQS02NCwgYSAucGRhdGEgZW50cnkKLSAgIGNvbnNpc3RzIG9mIHRocmVlIGR3b3JkcyBjb250YWluaW5nIHJlbGF0aXZlIHZpcnR1YWwgYWRkcmVzc2VzIHRoYXQKLSAgIHNwZWNpZnkgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcyBvZiB0aGUgY29kZSByYW5nZSB0aGUgZW50cnkKLSAgIGNvdmVycyBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdW53aW5kIGluZm8gZGF0YS4gICovCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcGRhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0jaWZkZWYgQ09GRl9XSVRIX1BFUDY0Ci0jIGRlZmluZSBQREFUQV9ST1dfU0laRQkoMyo4KQotI2Vsc2UKLSMgZGVmaW5lIFBEQVRBX1JPV19TSVpFCSg1KjQpCi0jZW5kaWYKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucGRhdGEiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLSAgaW50IG9uYWxpbmUgPSBQREFUQV9ST1dfU0laRTsKLQotICBpZiAoc2VjdGlvbiA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTAotICAgICAgfHwgcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICAgcmV0dXJuIHRydWU7Ci0KLSAgc3RvcCA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemU7Ci0gIGlmICgoc3RvcCAlIG9uYWxpbmUpICE9IDApCi0gICAgZnByaW50ZiAoZmlsZSwgXygiV2FybmluZywgLnBkYXRhIHNlY3Rpb24gc2l6ZSAoJWxkKSBpcyBub3QgYSBtdWx0aXBsZSBvZiAlZFxuIiksCi0JICAgICAobG9uZylzdG9wLCBvbmFsaW5lKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlxuVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSNpZmRlZiBDT0ZGX1dJVEhfUEVQNjQKLSAgZnByaW50ZihmaWxlLAotCSAgXygiIHZtYTpcdFx0XHRCZWdpbiBBZGRyZXNzICAgIEVuZCBBZGRyZXNzICAgICAgVW53aW5kIEluZm9cbiIpKTsKLSNlbHNlCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kICBFeGNlcHRpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCIgICAgIFx0XHRBZGRyZXNzICBBZGRyZXNzICBIYW5kbGVyICBEYXRhICAgICBBZGRyZXNzICAgIE1hc2tcbiIpKTsKLSNlbmRpZgotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIChQVFIpIGRhdGEsIDAsCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gb25hbGluZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGJlZ2luX2FkZHI7Ci0gICAgICBiZmRfdm1hIGVuZF9hZGRyOwotICAgICAgYmZkX3ZtYSBlaF9oYW5kbGVyOwotICAgICAgYmZkX3ZtYSBlaF9kYXRhOwotICAgICAgYmZkX3ZtYSBwcm9sb2dfZW5kX2FkZHI7Ci0gICAgICBpbnQgZW1fZGF0YTsKLQotICAgICAgaWYgKGkgKyBQREFUQV9ST1dfU0laRSA+IHN0b3ApCi0JYnJlYWs7Ci0KLSAgICAgIGJlZ2luX2FkZHIgPSBHRVRfUERBVEFfRU5UUlkoYWJmZCwgZGF0YStpKTsKLSAgICAgIGVuZF9hZGRyID0gR0VUX1BEQVRBX0VOVFJZKGFiZmQsIGRhdGEraSs0KTsKLSAgICAgIGVoX2hhbmRsZXIgPSBHRVRfUERBVEFfRU5UUlkoYWJmZCwgZGF0YStpKzgpOwotICAgICAgZWhfZGF0YSA9IEdFVF9QREFUQV9FTlRSWShhYmZkLCBkYXRhK2krMTIpOwotICAgICAgcHJvbG9nX2VuZF9hZGRyID0gR0VUX1BEQVRBX0VOVFJZKGFiZmQsIGRhdGEraSsxNik7Ci0gICAgICAKLSAgICAgIGlmIChiZWdpbl9hZGRyID09IDAgJiYgZW5kX2FkZHIgPT0gMCAmJiBlaF9oYW5kbGVyID09IDAKLQkgICYmIGVoX2RhdGEgPT0gMCAmJiBwcm9sb2dfZW5kX2FkZHIgPT0gMCkKLQl7Ci0JICAvKiBXZSBhcmUgcHJvYmFibHkgaW50byB0aGUgcGFkZGluZyBvZiB0aGUgc2VjdGlvbiBub3cuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBlbV9kYXRhID0gKChlaF9oYW5kbGVyICYgMHgxKSA8PCAyKSB8IChwcm9sb2dfZW5kX2FkZHIgJiAweDMpOwotICAgICAgZWhfaGFuZGxlciAmPSB+IChiZmRfdm1hKSAweDM7Ci0gICAgICBwcm9sb2dfZW5kX2FkZHIgJj0gfiAoYmZkX3ZtYSkgMHgzOwotCi0gICAgICBmcHV0YyAoJyAnLCBmaWxlKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBpICsgc2VjdGlvbi0+dm1hKTsgZnB1dGMgKCdcdCcsIGZpbGUpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIGJlZ2luX2FkZHIpOyBmcHV0YyAoJyAnLCBmaWxlKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBlbmRfYWRkcik7IGZwdXRjICgnICcsIGZpbGUpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIGVoX2hhbmRsZXIpOwotI2lmbmRlZiBDT0ZGX1dJVEhfUEVQNjQKLSAgICAgIGZwdXRjICgnICcsIGZpbGUpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIGVoX2RhdGEpOyBmcHV0YyAoJyAnLCBmaWxlKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBwcm9sb2dfZW5kX2FkZHIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgICV4IiwgZW1fZGF0YSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgICAgIGlmIChlaF9oYW5kbGVyID09IDAgJiYgZWhfZGF0YSAhPSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgYml0cyBoZXJlLCBhbHRob3VnaCB0aGUgbWVhbmluZyBtYXkgKi8KLQkgIC8qIGJlIGEgbGl0dGxlIG15c3RlcmlvdXMuIFRoZSBvbmx5IG9uZSBJIGtub3cgKi8KLQkgIC8qIGZvciBzdXJlIGlzIDB4MDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIENvZGUgU2lnbmlmaWNhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDEgUmVnaXN0ZXIgU2F2ZSBNaWxsaWNvZGUgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDIgUmVnaXN0ZXIgUmVzdG9yZSBNaWxsaWNvZGUgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDMgR2x1ZSBDb2RlIFNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIHN3aXRjaCAoZWhfZGF0YSkKLQkgICAgewotCSAgICBjYXNlIDB4MDE6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwMjoKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAzOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIEdsdWUgY29kZSBzZXF1ZW5jZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0hBREogNAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0YmxbXSA9Ci17Ci0iQUJTT0xVVEUiLAotIkhJR0giLAotIkxPVyIsCi0iSElHSExPVyIsCi0iSElHSEFESiIsCi0iTUlQU19KTVBBRERSIiwKLSJTRUNUSU9OIiwKLSJSRUwzMiIsCi0iUkVTRVJWRUQxIiwKLSJNSVBTX0pNUEFERFIxNiIsCi0iRElSNjQiLAotIkhJR0gzQURKIgotIlVOS05PV04iLCAgIC8qIE1VU1QgYmUgbGFzdCAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbG9jIik7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlxuXG5QRSBGaWxlIEJhc2UgUmVsb2NhdGlvbnMgKGludGVycHJldGVkIC5yZWxvYyBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIChQVFIpIGRhdGEsIDAsCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGJmZF92bWEgdmlydHVhbF9hZGRyZXNzOwotICAgICAgbG9uZyBudW1iZXIsIHNpemU7Ci0KLSAgICAgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcywgd2l0aCBhIGhlYWRlciBjb25zaXN0aW5nCi0JIG9mIHR3byAzMiBiaXQgcXVhbnRpdGllcywgZm9sbG93ZWQgYnkgYSBudW1iZXIgb2YgMTYgYml0IGVudHJpZXMgKi8KLQotICAgICAgdmlydHVhbF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgc2l6ZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgbnVtYmVyID0gKHNpemUgLSA4KSAvIDI7Ci0KLSAgICAgIGlmIChzaXplID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICBfKCJcblZpcnR1YWwgQWRkcmVzczogJTA4bHggQ2h1bmsgc2l6ZSAlbGQgKDB4JWx4KSBOdW1iZXIgb2YgZml4dXBzICVsZFxuIiksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSB2aXJ0dWFsX2FkZHJlc3MsIHNpemUsIHNpemUsIG51bWJlcik7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXI7ICsraikKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCBlID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIGkgKyA4ICsgaiAqIDIpOwotCSAgdW5zaWduZWQgaW50IHQgPSAoZSAmIDB4RjAwMCkgPj4gMTI7Ci0JICBpbnQgb2ZmID0gZSAmIDB4MEZGRjsKLQotCSAgaWYgKHQgPj0gc2l6ZW9mICh0YmwpIC8gc2l6ZW9mICh0YmxbMF0pKQotCSAgICB0ID0gKHNpemVvZiAodGJsKSAvIHNpemVvZiAodGJsWzBdKSkgLSAxOwotCi0JICBmcHJpbnRmIChmaWxlLAotCQkgICBfKCJcdHJlbG9jICU0ZCBvZmZzZXQgJTR4IFslNGx4XSAlcyIpLAotCQkgICBqLCBvZmYsIChsb25nKSAob2ZmICsgdmlydHVhbF9hZGRyZXNzKSwgdGJsW3RdKTsKLQotCSAgLyogSElHSEFESiB0YWtlcyBhbiBhcmd1bWVudCwgLSB0aGUgbmV4dCByZWNvcmQgKmlzKiB0aGUKLQkgICAgIGxvdyAxNiBiaXRzIG9mIGFkZGVuZC4gICovIAotCSAgaWYgKHQgPT0gSU1BR0VfUkVMX0JBU0VEX0hJR0hBREopCi0JICAgIHsKLQkgICAgICAgZnByaW50ZiAoZmlsZSwgIiAoJTR4KSIsCi0JCQkoKHVuc2lnbmVkIGludCkKLQkJCSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgaSArIDggKyBqICogMiArIDIpKSk7Ci0JICAgICAgIGorKzsKLQkgICAgfQotCSAgCi0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgICBpICs9IHNpemU7Ci0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLWJvb2xlYW4KLV9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBpbnQgajsKLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqaSA9ICZwZS0+cGVfb3B0aGRyOwotICBjb25zdCBjaGFyICpzdWJzeXN0ZW1fbmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIE1TIGR1bXBiaW4gcHJvZ3JhbSByZXBvcnRlZGx5IGFuZHMgd2l0aCAweGZmMGYgYmVmb3JlCi0gICAgIHByaW50aW5nIHRoZSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQuICBOb3Qgc3VyZSB3aHkuICBObyByZWFzb24gdG8KLSAgICAgZW11bGF0ZSBpdCBoZXJlLiAgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygiXG5DaGFyYWN0ZXJpc3RpY3MgMHgleFxuIiksIHBlLT5yZWFsX2ZsYWdzKTsKLSN1bmRlZiBQRgotI2RlZmluZSBQRih4LCB5KSAgICBpZiAocGUtPnJlYWxfZmxhZ3MgJiB4KSB7IGZwcmludGYgKGZpbGUsICJcdCVzXG4iLCB5KTsgfQotICBQRiAoRl9SRUxGTEcsICJyZWxvY2F0aW9ucyBzdHJpcHBlZCIpOwotICBQRiAoRl9FWEVDLCAiZXhlY3V0YWJsZSIpOwotICBQRiAoRl9MTk5PLCAibGluZSBudW1iZXJzIHN0cmlwcGVkIik7Ci0gIFBGIChGX0xTWU1TLCAic3ltYm9scyBzdHJpcHBlZCIpOwotICBQRiAoMHg4MCwgImxpdHRsZSBlbmRpYW4iKTsKLSAgUEYgKEZfQVIzMldSLCAiMzIgYml0IHdvcmRzIik7Ci0gIFBGICgweDIwMCwgImRlYnVnZ2luZyBpbmZvcm1hdGlvbiByZW1vdmVkIik7Ci0gIFBGICgweDEwMDAsICJzeXN0ZW0gZmlsZSIpOwotICBQRiAoRl9ETEwsICJETEwiKTsKLSAgUEYgKDB4ODAwMCwgImJpZyBlbmRpYW4iKTsKLSN1bmRlZiBQRgotCi0gIC8qIGN0aW1lIGltcGxpZXMgJ1xuJy4gICovCi0gIGZwcmludGYgKGZpbGUsICJcblRpbWUvRGF0ZVx0XHQlcyIsIGN0aW1lICgmcGUtPmNvZmYudGltZXN0YW1wKSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuSW1hZ2VCYXNlXHRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+SW1hZ2VCYXNlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TZWN0aW9uQWxpZ25tZW50XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNlY3Rpb25BbGlnbm1lbnQpOwotICBmcHJpbnRmIChmaWxlLCJcbkZpbGVBbGlnbm1lbnRcdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5GaWxlQWxpZ25tZW50KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5NYWpvck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JPU3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1ham9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vckltYWdlVmVyc2lvblx0JWRcbiIsIGktPk1pbm9ySW1hZ2VWZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWFqb3JTdWJzeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JTdWJzeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiV2luMzJWZXJzaW9uXHRcdCUwOGx4XG4iLCBpLT5SZXNlcnZlZDEpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZJbWFnZVx0XHQlMDhseFxuIiwgaS0+U2l6ZU9mSW1hZ2UpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZIZWFkZXJzXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZIZWFkZXJzKTsKLSAgZnByaW50ZiAoZmlsZSwiQ2hlY2tTdW1cdFx0JTA4bHhcbiIsIGktPkNoZWNrU3VtKTsKLSAgc3dpdGNoIChpLT5TdWJzeXN0ZW0pCi0gICAgewotICAgIGNhc2UgSU1BR0VfU1VCU1lTVEVNX1VOS05PV046Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJ1bnNwZWNpZmllZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1NVQlNZU1RFTV9OQVRJVkU6Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJOVCBuYXRpdmUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUk6Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJXaW5kb3dzIEdVSSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSToKLSAgICAgIHN1YnN5c3RlbV9uYW1lID0gIldpbmRvd3MgQ1VJIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfU1VCU1lTVEVNX1BPU0lYX0NVSToKLSAgICAgIHN1YnN5c3RlbV9uYW1lID0gIlBPU0lYIENVSSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NFX0dVSToKLSAgICAgIHN1YnN5c3RlbV9uYW1lID0gIldpbmNlIENVSSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT046Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJFRkkgYXBwbGljYXRpb24iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9TVUJTWVNURU1fRUZJX0JPT1RfU0VSVklDRV9EUklWRVI6Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJFRkkgYm9vdCBzZXJ2aWNlIGRyaXZlciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQUdFX1NVQlNZU1RFTV9FRklfUlVOVElNRV9EUklWRVI6Ci0gICAgICBzdWJzeXN0ZW1fbmFtZSA9ICJFRkkgcnVudGltZSBkcml2ZXIiOyAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnByaW50ZiAoZmlsZSwiU3Vic3lzdGVtXHRcdCUwOHgiLCBpLT5TdWJzeXN0ZW0pOwotICBpZiAoc3Vic3lzdGVtX25hbWUpCi0gICAgZnByaW50ZiAoZmlsZSwgIlx0KCVzKSIsIHN1YnN5c3RlbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5EbGxDaGFyYWN0ZXJpc3RpY3NcdCUwOHhcbiIsIGktPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZlN0YWNrUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZlN0YWNrQ29tbWl0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZIZWFwUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwUmVzZXJ2ZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcENvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5Mb2FkZXJGbGFnc1x0XHQlMDhseFxuIiwgaS0+TG9hZGVyRmxhZ3MpOwotICBmcHJpbnRmIChmaWxlLCJOdW1iZXJPZlJ2YUFuZFNpemVzXHQlMDhseFxuIiwgaS0+TnVtYmVyT2ZSdmFBbmRTaXplcyk7Ci0KLSAgZnByaW50ZiAoZmlsZSwiXG5UaGUgRGF0YSBEaXJlY3RvcnlcbiIpOwotICBmb3IgKGogPSAwOyBqIDwgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVM7IGorKykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiRW50cnkgJTF4ICIsIGopOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIGktPkRhdGFEaXJlY3Rvcnlbal0uVmlydHVhbEFkZHJlc3MpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlMDhseCAiLCBpLT5EYXRhRGlyZWN0b3J5W2pdLlNpemUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzXG4iLCBkaXJfbmFtZXNbal0pOwotICAgIH0KLQotICBwZV9wcmludF9pZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9lZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpOwotICBwZV9wcmludF9yZWxvYyAoYWJmZCwgdmZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcGVfZGF0YSAob2JmZCktPnBlX29wdGhkciA9IHBlX2RhdGEgKGliZmQpLT5wZV9vcHRoZHI7Ci0gIHBlX2RhdGEgKG9iZmQpLT5kbGwgPSBwZV9kYXRhIChpYmZkKS0+ZGxsOwotCi0gIC8qIGZvciBzdHJpcDogaWYgd2UgcmVtb3ZlZCAucmVsb2MsIHdlJ2xsIG1ha2UgYSByZWFsIG1lc3Mgb2YgdGhpbmdzCi0gICAgIGlmIHdlIGRvbid0IHJlbW92ZSB0aGlzIGVudHJ5IGFzIHdlbGwuICAqLwotICBpZiAoISBwZV9kYXRhIChvYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24pCi0gICAgewotICAgICAgcGVfZGF0YShvYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbNV0uVmlydHVhbEFkZHJlc3MgPSAwOwotICAgICAgcGVfZGF0YShvYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbNV0uU2l6ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gKi8KLWJvb2xlYW4KLV9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTAotICAgICAgJiYgcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnZpcnRfc2l6ZSA9Ci0JcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT5wZV9mbGFncyA9Ci0gICAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT5wZV9mbGFnczsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLV9iZmRfcGVfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHBlX2RhdGEgKGFiZmQpICE9IE5VTEwKLSAgICAgICYmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDAKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lOR19SRUxPQykgIT0gMCkKLSAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldC0+dmFsdWUgKz0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmlkYXRhIHNlY3Rpb24gYW5kIG90aGVyIHRoaW5ncyB0aGF0IG5lZWQgc3ltYm9sIHRhYmxlCi0gICBhY2Nlc3MuICAqLwotCi1ib29sZWFuCi1fYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKnBmaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoMTsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSBwZmluZm8tPmluZm87Ci0KLSAgLyogVGhlcmUgYXJlIGEgZmV3IGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgZmlsbGVkIGluIG5vdyB3aGlsZSB3ZQotICAgICBoYXZlIHN5bWJvbCB0YWJsZSBhY2Nlc3MuCi0KLSAgICAgVGhlIC5pZGF0YSBzdWJzZWN0aW9ucyBhcmVuJ3QgZGlyZWN0bHkgYXZhaWxhYmxlIGFzIHNlY3Rpb25zLCBidXQKLSAgICAgdGhleSBhcmUgaW4gdGhlIHN5bWJvbCB0YWJsZSwgc28gZ2V0IHRoZW0gZnJvbSB0aGVyZS4gICovCi0KLSAgLyogVGhlIGltcG9ydCBkaXJlY3RvcnkuICBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIC5pZGF0YSQyLCB3aXRoIHNpemUKLSAgICAgb2YgLmlkYXRhJDIgKyAuaWRhdGEkMy4gICovCi0gIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIi5pZGF0YSQyIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGgxICE9IE5VTEwpCi0gICAgewotICAgICAgcGVfZGF0YShhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3MgPQotCShoMS0+cm9vdC51LmRlZi52YWx1ZQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIi5pZGF0YSQ0IiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxXS5TaXplID0KLQkoKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCkKLQkgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxXS5WaXJ0dWFsQWRkcmVzcyk7Ci0KLSAgICAgIC8qIFRoZSBpbXBvcnQgYWRkcmVzcyB0YWJsZS4gIFRoaXMgaXMgdGhlIHNpemUvYWRkcmVzcyBvZgotICAgICAgICAgLmlkYXRhJDUuICAqLwotICAgICAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAiLmlkYXRhJDUiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzEyXS5WaXJ0dWFsQWRkcmVzcyA9Ci0JKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAiLmlkYXRhJDYiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzEyXS5TaXplID0KLQkoKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCkKLQkgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MpOwotICAgIH0KLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGlkYXRhJDIsIHdlIGVpdGhlciBoYXZlIGFuIGV4Y2Vzc2l2ZWx5Ci0gICAgIHRyaXZpYWwgcHJvZ3JhbSBvciBhcmUgaW4gREVFUCB0cm91YmxlOyB3ZSBoYXZlIHRvIGFzc3VtZSB0cml2aWFsCi0gICAgIHByb2dyYW0uLi4uICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL3BvL1BPVEZJTEVTLmluIGIvYmZkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGI4MjgyLi4wMDAwMDAwCi0tLSBhL2JmZC9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi1haXgzODYtY29yZS5jCi1hb3V0LWFkb2JlLmMKLWFvdXQtYXJtLmMKLWFvdXQtbnMzMmsuYwotYW91dC1zcGFyY2xlLmMKLWFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAuYwotYW91dDAuYwotYW91dDMyLmMKLWFvdXQ2NC5jCi1hb3V0ZjEuaAotYW91dHguaAotYXJjaGl2ZS5jCi1hcmNodXJlcy5jCi1hcm1uZXRic2QuYwotYmZkLmMKLWJpbmFyeS5jCi1ib3V0LmMKLWNhY2hlLmMKLWNmLWkzODZseW54LmMKLWNmLW02OGtseW54LmMKLWNmLXNwYXJjbHlueC5jCi1jaXNjby1jb3JlLmMKLWNvZmYtYTI5ay5jCi1jb2ZmLWFscGhhLmMKLWNvZmYtYXBvbGxvLmMKLWNvZmYtYXJtLmMKLWNvZmYtYXV4LmMKLWNvZmYtZ28zMi5jCi1jb2ZmLWg4MzAwLmMKLWNvZmYtaDg1MDAuYwotY29mZi1pMzg2LmMKLWNvZmYtaTg2MC5jCi1jb2ZmLWk5NjAuYwotY29mZi1tNjhrLmMKLWNvZmYtbTg4ay5jCi1jb2ZmLW1pcHMuYwotY29mZi1wbWFjLmMKLWNvZmYtcnM2MDAwLmMKLWNvZmYtc2guYwotY29mZi1zcGFyYy5jCi1jb2ZmLXN0Z28zMi5jCi1jb2ZmLXN2bTY4ay5jCi1jb2ZmLXRpYzMwLmMKLWNvZmYtdGljODAuYwotY29mZi11NjhrLmMKLWNvZmYtdzY1LmMKLWNvZmYtd2UzMmsuYwotY29mZi16OGsuYwotY29mZmNvZGUuaAotY29mZmdlbi5jCi1jb2ZmbGluay5jCi1jb2Zmc3dhcC5oCi1jb3JlZmlsZS5jCi1jcHUtYTI5ay5jCi1jcHUtYWxwaGEuYwotY3B1LWFyYy5jCi1jcHUtYXJtLmMKLWNwdS1kMTB2LmMKLWNwdS1kMzB2LmMKLWNwdS1mcjMwLmMKLWNwdS1oODMwMC5jCi1jcHUtaDg1MDAuYwotY3B1LWhwcGEuYwotY3B1LWkzNzAuYwotY3B1LWkzODYuYwotY3B1LWk4NjAuYwotY3B1LWk5NjAuYwotY3B1LW0xMDIwMC5jCi1jcHUtbTEwMzAwLmMKLWNwdS1tMzJyLmMKLWNwdS1tNjhrLmMKLWNwdS1tODhrLmMKLWNwdS1tY29yZS5jCi1jcHUtbWlwcy5jCi1jcHUtbnMzMmsuYwotY3B1LXBqLmMKLWNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAuYwotY3B1LXNoLmMKLWNwdS1zcGFyYy5jCi1jcHUtdGljMzAuYwotY3B1LXRpYzgwLmMKLWNwdS12ODUwLmMKLWNwdS12YXguYwotY3B1LXc2NS5jCi1jcHUtd2UzMmsuYwotY3B1LXo4ay5jCi1kZW1vNjQuYwotZHdhcmYxLmMKLWR3YXJmMi5jCi1lY29mZi5jCi1lY29mZmxpbmsuYwotZWNvZmZzd2FwLmgKLWVsZi1iZmQuaAotZWxmLW0xMDIwMC5jCi1lbGYtbTEwMzAwLmMKLWVsZi5jCi1lbGYzMi1hcmMuYwotZWxmMzItYXJtLmgKLWVsZjMyLWQxMHYuYwotZWxmMzItZDMwdi5jCi1lbGYzMi1mcjMwLmMKLWVsZjMyLWdlbi5jCi1lbGYzMi1pMzcwLmMKLWVsZjMyLWkzODYuYwotZWxmMzItaTg2MC5jCi1lbGYzMi1pOTYwLmMKLWVsZjMyLW0zMnIuYwotZWxmMzItbTY4ay5jCi1lbGYzMi1tODhrLmMKLWVsZjMyLW1jb3JlLmMKLWVsZjMyLW1pcHMuYwotZWxmMzItcGouYwotZWxmMzItcHBjLmMKLWVsZjMyLXNoLmMKLWVsZjMyLXNwYXJjLmMKLWVsZjMyLXY4NTAuYwotZWxmMzIuYwotZWxmNjQtYWxwaGEuYwotZWxmNjQtZ2VuLmMKLWVsZjY0LWhwcGEuYwotZWxmNjQtaHBwYS5oCi1lbGY2NC1taXBzLmMKLWVsZjY0LXNwYXJjLmMKLWVsZjY0LmMKLWVsZmFybS1uYWJpLmMKLWVsZmFybS1vYWJpLmMKLWVsZmNvZGUuaAotZWxmY29yZS5oCi1lbGZsaW5rLmMKLWVsZmxpbmsuaAotZXBvYy1wZS1hcm0uYwotZXBvYy1wZWktYXJtLmMKLWZvcm1hdC5jCi1mcmVlYnNkLmgKLWdlbmxpbmsuaAotZ28zMnN0dWIuaAotaGFzaC5jCi1ocDMwMGJzZC5jCi1ocDMwMGhwdXguYwotaHB1eC1jb3JlLmMKLWkzODZhb3V0LmMKLWkzODZic2QuYwotaTM4NmR5bml4LmMKLWkzODZmcmVlYnNkLmMKLWkzODZsaW51eC5jCi1pMzg2bHlueC5jCi1pMzg2bWFjaDMuYwotaTM4Nm1zZG9zLmMKLWkzODZuZXRic2QuYwotaTM4Nm9zOWsuYwotaWVlZS5jCi1paGV4LmMKLWluaXQuYwotaXJpeC1jb3JlLmMKLWxpYmFvdXQuaAotbGliYmZkLmMKLWxpYmJmZC5oCi1saWJjb2ZmLmgKLWxpYmVjb2ZmLmgKLWxpYmhwcGEuaAotbGliaWVlZS5oCi1saWJubG0uaAotbGlib2FzeXMuaAotbGlicGVpLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbmxtc3dhcC5oCi1uczMyay5oCi1uczMya25ldGJzZC5jCi1vYXN5cy5jCi1vcG5jbHMuYwotb3NmLWNvcmUuYwotcGM1MzItbWFjaC5jCi1wZS1hcm0uYwotcGUtaTM4Ni5jCi1wZS1tY29yZS5jCi1wZS1wcGMuYwotcGVpLWFybS5jCi1wZWktaTM4Ni5jCi1wZWktbWNvcmUuYwotcGVpLXBwYy5jCi1wZWljb2RlLmgKLXBlaWdlbi5jCi1wcGNib290LmMKLXJlbG9jLmMKLXJlbG9jMTYuYwotcmlzY2l4LmMKLXNjbzUtY29yZS5jCi1zZWN0aW9uLmMKLXNvbS5jCi1zb20uaAotc3BhcmNsaW51eC5jCi1zcGFyY2x5bnguYwotc3BhcmNuZXRic2QuYwotc3JlYy5jCi1zdGFiLXN5bXMuYwotc3RhYnMuYwotc3Vub3MuYwotc3ltcy5jCi10YXJnZXRzLmMKLXRla2hleC5jCi10cmFkLWNvcmUuYwotdmF4bmV0YnNkLmMKLXZlcnNhZG9zLmMKLXZtcy1nc2QuYwotdm1zLWhkci5jCi12bXMtbWlzYy5jCi12bXMtdGlyLmMKLXZtcy5jCi12bXMuaAoteGNvZmZsaW5rLmMKZGlmZiAtLWdpdCBhL2JmZC9wby9iZmQucG90IGIvYmZkL3BvL2JmZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2UzMjIuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL2JmZC5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM2ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAwLTA0LTA0IDIzOjE4KzA5MzBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhb3V0LWFkb2JlLmM6MTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNlY3Rpb24gdHlwZSBpbiBhLm91dC5hZG9iZSBmaWxlOiAleFxuIgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTI1NCBhb3V0eC5oOjE2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDoxNjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTY0MAotbXNnaWQgIip1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjM2ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRlYWJsZSBsaW5rIGZyb20gJXMgdG8gJXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTcyNAotbXNnaWQgIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIgotbXNnc3RyICIiCi0KLSM6IGFyY2hpdmUuYzoxOTkwCi1tc2dpZCAiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogYmZkIGNhbid0IGNhbGwgcGVycm9yLgotIzogYXJjaGl2ZS5jOjIwMTQKLW1zZ2lkICJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NAotbXNnaWQgIk5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NQotbXNnaWQgIlN5c3RlbSBjYWxsIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NgotbXNnaWQgIkludmFsaWQgYmZkIHRhcmdldCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzcKLW1zZ2lkICJGaWxlIGluIHdyb25nIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzgKLW1zZ2lkICJJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzkKLW1zZ2lkICJNZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MAotbXNnaWQgIk5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgxCi1tc2dpZCAiQXJjaGl2ZSBoYXMgbm8gaW5kZXg7IHJ1biByYW5saWIgdG8gYWRkIG9uZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODIKLW1zZ2lkICJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MwotbXNnaWQgIk1hbGZvcm1lZCBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NAotbXNnaWQgIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NQotbXNnaWQgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODYKLW1zZ2lkICJTZWN0aW9uIGhhcyBubyBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODcKLW1zZ2lkICJOb25yZXByZXNlbnRhYmxlIHNlY3Rpb24gb24gb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OAotbXNnaWQgIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OQotbXNnaWQgIkJhZCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTAKLW1zZ2lkICJGaWxlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTEKLW1zZ2lkICJGaWxlIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkyCi1tc2dpZCAiIzxJbnZhbGlkIGVycm9yIGNvZGU+IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJCRkQgaW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo3MDMKLW1zZ2lkICJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMgotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODIKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjE0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQyNwotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo1MTgKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzozOTkwCi1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMDIwIGVsZjMyLWFybS5oOjI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTA0OSBlbGYzMi1hcm0uaDoyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMzMxIGNvZmYtYXJtLmM6MTQyNiBlbGYzMi1hcm0uaDo4NTcgZWxmMzItYXJtLmg6OTU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjEzMzUgZWxmMzItYXJtLmg6OTU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTQzMCBlbGYzMi1hcm0uaDo4NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogdGh1bWIgY2FsbCB0byBhcm0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNDMzCi1tc2dpZCAiICBjb25zaWRlciByZWxpbmtpbmcgd2l0aCAtLXN1cHBvcnQtb2xkLWNvZGUgZW5hYmxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjE3MjIgY29mZi10aWM4MC5jOjY4MiBjb2ZmbGluay5jOjI5ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlsbGVnYWwgc3ltYm9sIGluZGV4IGluIHJlbG9jOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEVSUk9SOiBjb21waWxlZCBmb3IgQVBDUy0lZCB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIEFQQ1MtJWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gZmxvYXQgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgaW50ZWdlciAiCi0icmVnaXN0ZXJzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGludGVnZXIgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgZmxvYXQgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgIgotImFic29sdXRlIHBvc2l0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBjb21waWxlZCBhcyBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBwb3NpdGlvbiAiCi0iaW5kZXBlbmRlbnQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgc3VwcG9ydHMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMgbm90LiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogaW5wdXQgZmlsZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICV4OiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyOTMgZWxmMzItYXJtLmg6MjA4OQotbXNnaWQgIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjI5NSBlbGYzMi1hcm0uaDoyMDkxCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyOTggZWxmMzItYXJtLmg6MjA5NAotbXNnaWQgIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjMwMCBlbGYzMi1hcm0uaDoyMDk2Ci1tc2dpZCAiIFthYnNvbHV0ZSBwb3NpdGlvbl0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMzA0Ci1tc2dpZCAiIFtpbnRlcndvcmtpbmcgZmxhZyBub3QgaW5pdGlhbGlzZWRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjMwNgotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIHN1cHBvcnRlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMzA4Ci1tc2dpZCAiIFtpbnRlcndvcmtpbmcgbm90IHN1cHBvcnRlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJXYXJuaW5nOiBOb3Qgc2V0dGluZyBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcywgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiAiCi0ic3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcyBkdWUgdG8gb3V0c2lkZSByZXF1ZXN0IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtaTk2MC5jOjEzNiBjb2ZmLWk5NjAuYzo0ODUKLW1zZ2lkICJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29mZi1taXBzLmM6ODc1IGVsZjMyLW1pcHMuYzoxNDA2Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzoyNDMzCi1tc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2MgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBObyBvdGhlciBzZWN0aW9ucyBzaG91bGQgYXBwZWFyIGluIC1tZW1iZWRkZWQtcGljCi0jLiBjb2RlLgotIzogY29mZi1taXBzLmM6MjQ3MAotbXNnaWQgInJlbG9jIGFnYWluc3QgdW5zdXBwb3J0ZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzoyNDc4Ci1tc2dpZCAicmVsb2Mgbm90IHByb3Blcmx5IGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi10aWM4MC5jOjQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgcmVsb2MgdHlwZSAweCV4IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtdzY1LmM6MzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHJlbG9jICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozOTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6Mzk3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5yZWNvZ25pemVkIHN0b3JhZ2UgY2xhc3MgJWQgZm9yICVzIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3YXJuaW5nOiAlczogbG9jYWwgc3ltYm9sIGAlcycgaGFzIG5vIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDo0NTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MTYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MjA3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJBVVggdGFnbmR4ICVsZCB0dGxzaXogMHglbHggbG5ub3MgJWxkIG5leHQgJWxkIgotbXNnc3RyICIiCi0KLSM6IGNvZmZsaW5rLmM6NTE4IGVsZmxpbmsuaDoxNTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHR5cGUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVkIHRvICVkIGluICVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZsaW5rLmM6MjI4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2NzIGluIHNlY3Rpb24gYCVzJywgYnV0IGl0IGhhcyBubyBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjI2MTkgY29mZnN3YXAuaDo5MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogY29mZmxpbmsuYzoyNjI4IGNvZmZzd2FwLmg6ODkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjQyOQotbXNnaWQgIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NzAwCi1tc2dpZCAiRHdhcmYgRXJyb3I6IG1hbmdsZWQgbGluZSBudW1iZXIgc2VjdGlvbiAoYmFkIGZpbGUgbnVtYmVyKS4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NzkxCi1tc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2xpbmUgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6OTYzCi1tc2dpZCAiRHdhcmYgRXJyb3I6IG1hbmdsZWQgbGluZSBudW1iZXIgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTE1MSBkd2FyZjIuYzoxMzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJEd2FyZiBFcnJvcjogZm91bmQgZHdhcmYgdmVyc2lvbiAnJWh1JywgdGhpcyByZWFkZXIgb25seSBoYW5kbGVzIHZlcnNpb24gMiAiCi0iaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgIgotImdyZWF0ZXIgdGhhbiAnJXUnLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkR3YXJmIEVycm9yOiBCYWQgYWJicmV2IG51bWJlcjogJWQuIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTMyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGJhc2ljIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDQgZWNvZmYuYzoxNjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBGaXJzdCBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEVuZCsxIHN5bWJvbDogJS03bGQgICBUeXBlOiAgJXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBMb2NhbCBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIHN0cnVjdDsgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICB1bmlvbjsgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIFR5cGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTUgZWxmLW0xMDMwMC5jOjY3MCBlbGYzMi1hcm0uaDoxODUzIGVsZjMyLWQxMHYuYzo0OTMKLSM6IGVsZjMyLWZyMzAuYzo2NTEgZWxmMzItbTMyci5jOjEyNjUgZWxmMzItdjg1MC5jOjE2NzcKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTkgZWxmLW0xMDMwMC5jOjY3NCBlbGYzMi1hcm0uaDoxODU3IGVsZjMyLWQxMHYuYzo0OTcKLSM6IGVsZjMyLWZyMzAuYzo2NTUgZWxmMzItbTMyci5jOjEyNjkgZWxmMzItdjg1MC5jOjE2ODEKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYtbTEwMjAwLmM6NDYzIGVsZi1tMTAzMDAuYzo2NzggZWxmMzItYXJtLmg6MTg2MSBlbGYzMi1kMTB2LmM6NTAxCi0jOiBlbGYzMi1tMzJyLmM6MTI3MwotbXNnaWQgImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2NyBlbGYtbTEwMzAwLmM6NjgyIGVsZjMyLWFybS5oOjE4NjUgZWxmMzItZDEwdi5jOjUwNQotIzogZWxmMzItZnIzMC5jOjY2MyBlbGYzMi1tMzJyLmM6MTI3NyBlbGYzMi12ODUwLmM6MTcwMQotbXNnaWQgImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjU0NgotbXNnaWQgIiIKLSJcbiIKLSJQcm9ncmFtIEhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo1OTQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBTZWN0aW9uOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjY5NgotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjcxOQotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIFJlZmVyZW5jZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoxMjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIGxpbmsgJWx1IGZvciByZWxvYyBzZWN0aW9uICVzIChpbmRleCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iY3JlYXRpbmcgc2VjdGlvbiBzeW1ib2wsIG5hbWUgPSAlcywgdmFsdWUgPSAweCUuOGx4LCBpbmRleCA9ICVkLCBzZWN0aW9uID0gIgotIjB4JS44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycyAoYWxsb2NhdGVkICV1LCBuZWVkICV1KSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycywgdHJ5IGxpbmtpbmcgd2l0aCAtTiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyODczCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yOiBGaXJzdCBzZWN0aW9uIGluIHNlZ21lbnQgKCVzKSBzdGFydHMgYXQgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyODc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICB3aGVyZWFzIHNlZ21lbnQgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogYWxsb2NhdGVkIHNlY3Rpb24gYCVzJyBub3QgaW4gc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyByZXF1aXJlZCBidXQgbm90IHByZXNlbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzUzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gIgotIjB4JS44bHglc1xuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjM2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IEVtcHR5IGxvYWRhYmxlIHNlZ21lbnQgZGV0ZWN0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo0OTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MTc4NyBlbGYzMi1pMzg2LmM6MTMwNCBlbGYzMi1wcGMuYzozMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MTg5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiAiCi0ic3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MTg5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoxOTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgaW4gJXMgYmVjYXVzZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gIgotIiVzIGhhcyBiZWVuIGxpbmtlZCB3aXRoIGl0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjE5NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogJXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQsIHdoZXJlYXMgJXMgaXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRXJyb3I6ICVzIHBhc3NlcyBmbG9hdHMgaW4gJXMgcmVnaXN0ZXJzLCB3aGVyZWFzICVzIHBhc3NlcyB0aGVtIGluICVzICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjAzNCBlbGYzMi1hcm0uaDoyMDM2Ci1tc2dpZCAiZmxvYXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjAzNCBlbGYzMi1hcm0uaDoyMDM2Ci1tc2dpZCAiaW50ZWdlciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yOiAlcyBpcyBjb21waWxlZCBhcyBwb3NpdGlvbiAlcyBjb2RlLCB3aGVyZWFzICVzIGlzIG5vdCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDQyCi1tc2dpZCAiaW5kZXBlbmRlbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA0MgotbXNnaWQgImRlcGVuZGVudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6ICVzICVzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDUxCi1tc2dpZCAic3VwcG9ydHMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA1MQotbXNnaWQgImRvZXMgbm90IHN1cHBvcnQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA1MwotbXNnaWQgImRvZXMgbm90IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwNTMKLW1zZ2lkICJkb2VzIgotbXNnc3RyICIiCi0KLSMuIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLgotIzogZWxmMzItYXJtLmg6MjA3NiBlbGYzMi1tNjhrLmM6NDMwIGVsZjMyLW1pcHMuYzoyNjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHg6IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwNzkKLW1zZ2lkICIgW2ludGVyd29ya2luZyBlbmFibGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDgxCi1tc2dpZCAiIFtpbnRlcndvcmtpbmcgbm90IGVuYWJsZWRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwODQKLW1zZ2lkICIgW0FQQ1MtMjZdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwODYKLW1zZ2lkICIgW0FQQ1MtMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWZyMzAuYzo2NTkgZWxmMzItdjg1MC5jOjE2ODUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaTM4Ni5jOjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCByZWxvY2F0aW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjkxNgotbXNnaWQgIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTAwMCBlbGYzMi1wcGMuYzoyOTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVGhlIHRhcmdldCAoJXMpIG9mIGFuICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIHNlY3Rpb24gKCVzKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MjAxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MjAzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoyMDM4Ci1tc2dpZCAiOiBtMzJyIGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MjAzOQotbXNnaWQgIjogbTMycnggaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW02OGsuYzo0MzMKLW1zZ2lkICIgW2NwdTMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjM3NyBlbGYzMi1tY29yZS5jOjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1jb3JlLmM6NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxNTY1Ci1tc2dpZCAiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjE3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlua2luZyBtaXBzMTYgb2JqZWN0cyBpbnRvICVzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNDY5IGVsZjMyLXBwYy5jOjE0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjQ3MSBlbGYzMi1wcGMuYzoxNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgUElDIGZpbGVzIHdpdGggbm9uLVBJQyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjUzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBhYmljYWxscyBmaWxlcyB3aXRoIG5vbi1hYmljYWxscyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjU2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJU0EgbWlzbWF0Y2ggKCVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjU5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQUJJIG1pc21hdGNoOiBsaW5raW5nICVzIG1vZHVsZSB3aXRoIHByZXZpb3VzICVzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2MDYgZWxmMzItcHBjLmM6MTQ3NyBlbGY2NC1zcGFyYy5jOjI4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2MzcKLW1zZ2lkICIgW2FiaT1PMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjM5Ci1tc2dpZCAiIFthYmk9TzY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjY0MQotbXNnaWQgIiBbYWJpPUVBQkkzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2NDMKLW1zZ2lkICIgW2FiaT1FQUJJNjRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjQ1Ci1tc2dpZCAiIFthYmkgdW5rbm93bl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2NDcKLW1zZ2lkICIgW2FiaT1OMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjQ5Ci1tc2dpZCAiIFthYmk9NjRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjUxCi1tc2dpZCAiIFtubyBhYmkgc2V0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjY1NAotbXNnaWQgIiBbbWlwczFdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjU2Ci1tc2dpZCAiIFttaXBzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2NTgKLW1zZ2lkICIgW21pcHMzXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjY2MAotbXNnaWQgIiBbbWlwczRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNjYyCi1tc2dpZCAiIFt1bmtub3duIElTQV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2NjUKLW1zZ2lkICIgWzMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI2NjcKLW1zZ2lkICIgW25vdCAzMmJpdG1vZGVdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo0MjcwCi1tc2dpZCAic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ4ODcgZWxmNjQtYWxwaGEuYzo0MzY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo1NDE0Ci1tc2dpZCAibm90IGVub3VnaCBHT1Qgc3BhY2UgZm9yIGxvY2FsIEdPVCBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo2NDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcysweCVseDoganVtcCB0byBzdHViIHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NzUyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ0FMTDE2IHJlbG9jIGF0IDB4JWx4IG5vdCBhZ2FpbnN0IGdsb2JhbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY29tcGlsZWQgbm9ybWFsbHkgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoyMjUxIGVsZjMyLXBwYy5jOjIyODUgZWxmMzItcHBjLmM6MjMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQgZm9yIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzozNDkxIGVsZjMyLXBwYy5jOjM1MTMgZWxmMzItcHBjLmM6MzU2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzYyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6ODkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6MTI3OSBlbGYzMi1zaC5jOjE2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxNDg2IGVsZjY0LXNwYXJjLmM6MjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXMgc3lzdGVtIGFuZCB0YXJnZXQgaXMgdjgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXNhIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4cGx1cyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zcGFyYy5jOjE4NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIDY0IGJpdCBzeXN0ZW0gYW5kIHRhcmdldCBpcyAzMiBiaXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzo2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxMDcwCi1tc2dpZCAiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjg5Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY5MwotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTcKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICVseDogIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTEwCi1tc2dpZCAidjg1MCBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MTEKLW1zZ2lkICJ2ODUwZSBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MTIKLW1zZ2lkICJ2ODUwZWEgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6OTUxCi1tc2dpZCAiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmNjQtYWxwaGEuYzozMDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAuZ290IHN1YnNlZ21lbnQgZXhjZWVkcyA2NEsgKHNpemUgJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MTI0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjEyODYKLW1zZ2lkICIlczogT25seSByZWdpc3RlcnMgJSVnWzIzNjddIGNhbiBiZSBkZWNsYXJlZCB1c2luZyBTVFRfUkVHSVNURVIiCi1tc2dzdHIgIiIKLQotIzogZWxmNjQtc3BhcmMuYzoxMzA2Ci1tc2dpZCAiIgotIlJlZ2lzdGVyICUlZyVkIHVzZWQgaW5jb21wYXRpYmx5OiBwcmV2aW91c2x5IGRlY2xhcmVkIGluICVzIHRvICVzLCBpbiAlcyAiCi0icmVkZWZpbmVkIHRvICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MTMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgYCVzJyBoYXMgZGlmZmVyaW5nIHR5cGVzOiBwcmV2aW91c2x5ICVzLCBSRUdJU1RFUiBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjEzNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIGAlcycgaGFzIGRpZmZlcmluZyB0eXBlczogUkVHSVNURVIgaW4gJXMsICVzIGluICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MjgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBVbHRyYVNQQVJDIHNwZWNpZmljIHdpdGggSEFMIHNwZWNpZmljIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogZWxmY29kZS5oOjEwNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGVsZmxpbmsuYzo0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFNlY3Rpb24gJXMgaXMgYWxyZWFkeSB0byBsYXJnZSB0byBwdXQgaG9sZSBvZiAlbGQgYnl0ZXMgaW4iCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjEzODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIHZlcnNpb24gJXUgKG1heCAlZCkiCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjE0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIG5lZWRlZCB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZmxpbmsuaDoxNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHNpemUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVsdSB0byAlbHUgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjE3OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHVuZXhwZWN0ZWQgcmVkZWZpbml0aW9uIG9mIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjM0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogdHlwZSBhbmQgc2l6ZSBvZiBkeW5hbWljIHN5bWJvbCBgJXMnIGFyZSBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmg6Mzc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wgbmFtZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmg6NDk4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDUwIG02OGtsaW51eC5jOjQ1NCBzcGFyY2xpbnV4LmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo0NTggbTY4a2xpbnV4LmM6NDYyIHNwYXJjbGludXguYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjY0NiBpMzg2bGludXguYzo2OTYgbTY4a2xpbnV4LmM6NjUzIG02OGtsaW51eC5jOjcwMQotIzogc3BhcmNsaW51eC5jOjY0OSBzcGFyY2xpbnV4LmM6Njk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NzIwIG02OGtsaW51eC5jOjcyNSBzcGFyY2xpbnV4LmM6NzIzCi1tc2dpZCAiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdHJpbmcgdG9vIGxvbmcgKCVkIGNoYXJzLCBtYXggNjU1MzUpIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCBzeW1ib2wgYCVzJyBmbGFncyAweCV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuaW1wbGVtZW50ZWQgQVRJIHJlY29yZCAgJXUgZm9yIHN5bWJvbCAldSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmV4cGVjdGVkIEFUTiB0eXBlICVkIGluIGV4dGVybmFsIHBhcnQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjg0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjM2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGNoZWNrc3VtIGluIEludGVsIEhleCBmaWxlIChleHBlY3RlZCAldSwgZm91bmQgJXUpIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludGVybmFsIGVycm9yIGluIGloZXhfcmVhZF9zZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBzZWN0aW9uIGxlbmd0aCBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6ODU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBhZGRyZXNzIDB4JXMgb3V0IG9mIHJhbmdlIGZvciBJbnRleCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIgotbXNnc3RyICIiCi0KLSM6IGxpYmJmZC5jOjQ4NwotbXNnaWQgIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaW5rZXIuYzoyNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IG9hc3lzLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIG9hc3lzIgotbXNnc3RyICIiCi0KLSM6IG9zZi1jb3JlLmM6MTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gWFhYIGNvZGUgeWV0IHRvIGJlIHdyaXR0ZW4uCi0jOiBwZWljb2RlLmg6ODA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmhhbmRsZWQgaW1wb3J0IHR5cGU7ICV4IgotbXNnc3RyICIiCi0KLSM6IHBlaWNvZGUuaDo4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVucmVjb2duaXNlZCBpbXBvcnQgdHlwZTsgJXgiCi1tc2dzdHIgIiIKLQotIzogcGVpY29kZS5oOjgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5yZWNvZ25pc2VkIGltcG9ydCBuYW1lIHR5cGU7ICV4IgotbXNnc3RyICIiCi0KLSM6IHBlaWNvZGUuaDoxMTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbnJlY29nbmlzZWQgbWFjaGluZSB0eXBlICgweCV4KSBpbiBJbXBvcnQgTGlicmFyeSBGb3JtYXQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBwZWljb2RlLmg6MTE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IFJlY29nbmlzZWQgYnV0IHVuaGFuZGxlZCBtYWNoaW5lIHR5cGUgKDB4JXgpIGluIEltcG9ydCBMaWJyYXJ5IEZvcm1hdCAiCi0iYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBwZWljb2RlLmg6MTIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2l6ZSBmaWVsZCBpcyB6ZXJvIGluIEltcG9ydCBMaWJyYXJ5IEZvcm1hdCBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcGVpY29kZS5oOjEyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN0cmluZyBub3QgbnVsbCB0ZXJtaW5hdGVkIGluIElMRiBvYmplY3QgZmlsZS4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTYzCi1tc2dpZCAiRXhwb3J0IERpcmVjdG9yeSBbLmVkYXRhIChvciB3aGVyZSBldmVyIHdlIGZvdW5kIGl0KV0iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTY0Ci1tc2dpZCAiSW1wb3J0IERpcmVjdG9yeSBbcGFydHMgb2YgLmlkYXRhXSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NjUKLW1zZ2lkICJSZXNvdXJjZSBEaXJlY3RvcnkgWy5yc3JjXSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NjYKLW1zZ2lkICJFeGNlcHRpb24gRGlyZWN0b3J5IFsucGRhdGFdIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk2NwotbXNnaWQgIlNlY3VyaXR5IERpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NjgKLW1zZ2lkICJCYXNlIFJlbG9jYXRpb24gRGlyZWN0b3J5IFsucmVsb2NdIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk2OQotbXNnaWQgIkRlYnVnIERpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NzAKLW1zZ2lkICJEZXNjcmlwdGlvbiBEaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTcxCi1tc2dpZCAiU3BlY2lhbCBEaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTcyCi1tc2dpZCAiVGhyZWFkIFN0b3JhZ2UgRGlyZWN0b3J5IFsudGxzXSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NzMKLW1zZ2lkICJMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk3NAotbXNnaWQgIkJvdW5kIEltcG9ydCBEaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTc1Ci1tc2dpZCAiSW1wb3J0IEFkZHJlc3MgVGFibGUgRGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk3NiBwZWlnZW4uYzo5NzcgcGVpZ2VuLmM6OTc4Ci1tc2dpZCAiUmVzZXJ2ZWQiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTAyMgotbXNnaWQgIiIKLSJcbiIKLSJUaGUgaW1wb3J0IHRhYmxlIGlzIHRoZSAuaWRhdGEgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEwNDQKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgaXMgYW4gaW1wb3J0IHRhYmxlLCBidXQgdGhlIHNlY3Rpb24gY29udGFpbmluZyBpdCBjb3VsZCBub3QgYmUgZm91bmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBhbiBpbXBvcnQgdGFibGUgaW4gJXMgYXQgMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJGdW5jdGlvbiBkZXNjcmlwdG9yIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IGFkZHJlc3M6ICUwNGx4XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJcdGNvZGUtYmFzZSAlMDhseCB0b2MgKGxvYWRhYmxlL2FjdHVhbCkgJTA4bHgvJTA4bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMDk4Ci1tc2dpZCAiIgotIlxuIgotIk5vIHJlbGRhdGEgc2VjdGlvbiEgRnVuY3Rpb24gZGVzY3JpcHRvciBub3QgZGVjb2RlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMTAzCi1tc2dpZCAiIgotIlxuIgotIlRoZSBJbXBvcnQgVGFibGVzIChpbnRlcnByZXRlZCAuaWRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMTA1Ci1tc2dpZCAiIHZtYTogICAgICAgICAgICBIaW50ICAgIFRpbWUgICAgICBGb3J3YXJkICBETEwgICAgICAgRmlyc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMTA3Ci1tc2dpZCAiICAgICAgICAgICAgICAgICBUYWJsZSAgIFN0YW1wICAgICBDaGFpbiAgICBOYW1lICAgICAgVGh1bmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcdERMTCBOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjExNjEgcGVpZ2VuLmM6MTIyNAotbXNnaWQgIlx0dm1hOiAgSGludC9PcmQgTWVtYmVyLU5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMjIzCi1tc2dpZCAiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgKGRpZmZlcmVuY2UgZm91bmQpXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTIzMAotbXNnaWQgIlx0Pj4+IFJhbiBvdXQgb2YgSUFUIG1lbWJlcnMhXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTI0OAotbXNnaWQgIlx0VGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlIGlzIGlkZW50aWNhbFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEyOTcKLW1zZ2lkICIiCi0iXG4iCi0iVGhlIGV4cG9ydCB0YWJsZSBpcyB0aGUgLmVkYXRhIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzE5Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGlzIGFuIGV4cG9ydCB0YWJsZSwgYnV0IHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgaXQgY291bGQgbm90IGJlIGZvdW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgaXMgYW4gZXhwb3J0IHRhYmxlIGluICVzIGF0IDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM1NQotbXNnaWQgIiIKLSJcbiIKLSJUaGUgRXhwb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmVkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBvcnQgRmxhZ3MgXHRcdFx0JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJUaW1lL0RhdGUgc3RhbXAgXHRcdCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFqb3IvTWlub3IgXHRcdFx0JWQvJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzY3Ci1tc2dpZCAiTmFtZSBcdFx0XHRcdCIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9yZGluYWwgQmFzZSBcdFx0XHQlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzc2Ci1tc2dpZCAiTnVtYmVyIGluOlxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRFeHBvcnQgQWRkcmVzcyBUYWJsZSBcdFx0JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFtOYW1lIFBvaW50ZXIvT3JkaW5hbF0gVGFibGVcdCVsdVxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzODYKLW1zZ2lkICJUYWJsZSBBZGRyZXNzZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzg5Ci1tc2dpZCAiXHRFeHBvcnQgQWRkcmVzcyBUYWJsZSBcdFx0IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzOTQKLW1zZ2lkICJcdE5hbWUgUG9pbnRlciBUYWJsZSBcdFx0IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzOTkKLW1zZ2lkICJcdE9yZGluYWwgVGFibGUgXHRcdFx0IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE0MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkV4cG9ydCBBZGRyZXNzIFRhYmxlIC0tIE9yZGluYWwgQmFzZSAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNDM2Ci1tc2dpZCAiRm9yd2FyZGVyIFJWQSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNDQ0Ci1tc2dpZCAiRXhwb3J0IFJWQSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNDUxCi1tc2dpZCAiIgotIlxuIgotIltPcmRpbmFsL05hbWUgUG9pbnRlcl0gVGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmcsIC5wZGF0YSBzZWN0aW9uIHNpemUgKCVsZCkgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNTAwCi1tc2dpZCAiIgotIlxuIgotIlRoZSBGdW5jdGlvbiBUYWJsZSAoaW50ZXJwcmV0ZWQgLnBkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTUwMgotbXNnaWQgIiB2bWE6XHRcdEJlZ2luICAgIEVuZCAgICAgIEVIICAgICAgIEVIICAgICAgIFByb2xvZ0VuZCAgRXhjZXB0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTUwNAotbXNnaWQgIiAgICAgXHRcdEFkZHJlc3MgIEFkZHJlc3MgIEhhbmRsZXIgIERhdGEgICAgIEFkZHJlc3MgICAgTWFza1xuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE1NzYKLW1zZ2lkICIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTU3OQotbXNnaWQgIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNTgyCi1tc2dpZCAiIEdsdWUgY29kZSBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNjI4Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlBFIEZpbGUgQmFzZSBSZWxvY2F0aW9ucyAoaW50ZXJwcmV0ZWQgLnJlbG9jIHNlY3Rpb24gY29udGVudHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmlydHVhbCBBZGRyZXNzOiAlMDhseCBDaHVuayBzaXplICVsZCAoMHglbHgpIE51bWJlciBvZiBmaXh1cHMgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJcdHJlbG9jICU0ZCBvZmZzZXQgJTR4IFslNGx4XSAlcyIKLW1zZ3N0ciAiIgotCi0jLiBUaGUgTVMgZHVtcGJpbiBwcm9ncmFtIHJlcG9ydGVkbHkgYW5kcyB3aXRoIDB4ZmYwZiBiZWZvcmUKLSMuIHByaW50aW5nIHRoZSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQuICBOb3Qgc3VyZSB3aHkuICBObyByZWFzb24gdG8KLSMuIGVtdWxhdGUgaXQgaGVyZS4KLSM6IHBlaWdlbi5jOjE3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNoYXJhY3RlcmlzdGljcyAweCV4XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQxOAotbXNnaWQgIiIKLSJcbiIKLSJwcGNib290IGhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IG9mZnNldCAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggICAgICAgICAgICAgID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmxhZyBmaWVsZCAgICAgICAgICA9IDB4JS4yeFxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlBhcnRpdGlvblslZF0gc3RhcnQgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gbGVuZ3RoID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNvbS5jOjUzMzUKLW1zZ2lkICJzb21fc2l6ZW9mX2hlYWRlcnMgdW5pbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmVjLmM6MjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1zLmM6OTc0Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtZ3NkLmM6MzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9tYWtlX3NlY3Rpb24gKCVzKSBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjM3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKCVzLCAleCkgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy1nc2QuYzo0MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2l6ZSBtaXNtYXRjaCBzZWN0aW9uICVzPSVseCwgJXM9JWx4IgotbXNnc3RyICIiCi0KLSM6IHZtcy1nc2QuYzo3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBnc2QvZWdzZCBzdWJ0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy1oZHIuYzo0MDUKLW1zZ2lkICJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjU0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTdGFjayBvdmVyZmxvdyAoJWQpIGluIF9iZmRfdm1zX3B1c2giCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo1NjAKLW1zZ2lkICJTdGFjayB1bmRlcmZsb3cgaW4gX2JmZF92bXNfcG9wIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6OTMxCi1tc2dpZCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggemVybyBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjkzNgotbXNnaWQgIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHRvbyBtYW55IGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6MTA2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjExMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIGVudGVyICVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2OQotbXNnaWQgIk5vIE1lbSAhIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzozMDkKLW1zZ2lkICJCYWQgc2VjdGlvbiBpbmRleCBpbiBFVElSX1NfQ19TVEFfUFEiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnN1cHBvcnRlZCBTVEEgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzozMjkgdm1zLXRpci5jOjEyODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzZXJ2ZWQgU1RBIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVUSVJfU19DX1NUT19HQkw6IG5vIHN5bWJvbCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjQ1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJFVElSX1NfQ19TVE9fQ0E6IG5vIHN5bWJvbCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjQ3MAotbXNnaWQgIkVUSVJfU19DX1NUT19SQi9BQjogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTI4Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0xQX1BTQjogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTM0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0hJTlRfR0JMOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjU0MAotbXNnaWQgIkVUSVJfU19DX1NUT19ISU5UX1BTOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjU0NCB2bXMtdGlyLmM6MTQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBTVE8gY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2NTcKLW1zZ2lkICJFVElSX1NfQ19PUFJfSU5TVjogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6Njc1Ci1tc2dpZCAiRVRJUl9TX0NfT1BSX1VTSDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NjgxCi1tc2dpZCAiRVRJUl9TX0NfT1BSX1JPVDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzAwCi1tc2dpZCAiRVRJUl9TX0NfT1BSX1JFREVGOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MDYKLW1zZ2lkICJFVElSX1NfQ19PUFJfREZMSVQ6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcxMCB2bXMtdGlyLmM6MTY1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBPUFIgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3Nzkgdm1zLXRpci5jOjE3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6ODA4Ci1tc2dpZCAiRVRJUl9TX0NfU1RDX0xQOiBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MjYKLW1zZ2lkICJFVElSX1NfQ19TVENfR0JMOiBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MzQKLW1zZ2lkICJFVElSX1NfQ19TVENfR0NBOiBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4NDMKLW1zZ2lkICJFVElSX1NfQ19TVENfUFM6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0jLiAqIGFyZzogLQotIy4gKgotIy4KLSM6IHZtcy10aXIuYzoxMTg3Ci1tc2dpZCAiU3RhY2stZnJvbS1pbWFnZSBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyMDcKLW1zZ2lkICJTdGFjay1lbnRyeS1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBjb21wYXJlIHByb2NlZHVyZSBhcmd1bWVudAotIy4gKiBhcmc6IGNzCXN5bWJvbCBuYW1lCi0jLiAqCWJ5CWFyZ3VtZW50IGluZGV4Ci0jLiAqCWRhCWFyZ3VtZW50IGRlc2NyaXB0b3IKLSMuICoKLSMuICogY29tcGFyZSBhcmd1bWVudCBkZXNjcmlwdG9yIHdpdGggc3ltYm9sIGFyZ3VtZW50IChBUkckVl9QQVNTTUVDSCkKLSMuICogYW5kIHN0YWNrIFRSVUUgKGFyZ3MgbWF0Y2gpIG9yIEZBTFNFIChhcmdzIGRvbnQgbWF0Y2gpIHZhbHVlCi0jLgotIzogdm1zLXRpci5jOjEyMjMKLW1zZ2lkICJQQVNTTUVDSCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyNDMKLW1zZ2lkICJTdGFjay1sb2NhbC1zeW1ib2wgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxMjU4Ci1tc2dpZCAiU3RhY2stbGl0ZXJhbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyODAKLW1zZ2lkICJTdGFjay1sb2NhbC1zeW1ib2wtZW50cnktcG9pbnQtbWFzayBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE0NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCBTVE8gY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNTk2Ci1tc2dpZCAiVElSX1NfQ19PUFJfQVNIIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE2MTAKLW1zZ2lkICJUSVJfU19DX09QUl9VU0ggaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTYyNAotbXNnaWQgIlRJUl9TX0NfT1BSX1JPVCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uCi0jLgotIzogdm1zLXRpci5jOjE2NDUKLW1zZ2lkICJUSVJfU19DX09QUl9SRURFRiBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIGRlZmluZSBhIGxpdGVyYWwKLSMuCi0jOiB2bXMtdGlyLmM6MTY1MgotbXNnaWQgIlRJUl9TX0NfT1BSX0RGTElUIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE3MDcKLW1zZ2lkICJUSVJfU19DX0NUTF9ERkxPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE3MTUKLW1zZ2lkICJUSVJfU19DX0NUTF9TVExPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE3MjMKLW1zZ2lkICJUSVJfU19DX0NUTF9TVEtETCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT2JqIGNvZGUgJWQgbm90IGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoyMTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNFQ19SRUxPQyB3aXRoIG5vIHJlbG9jcyBpbiBzZWN0aW9uICVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoyNDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaGFuZGxlZCByZWxvY2F0aW9uICVzIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGAlcycgaGFzIGxpbmUgbnVtYmVycyBidXQgbm8gZW5jbG9zaW5nIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2xhc3MgJWQgc3ltYm9sIGAlcycgaGFzIG5vIGF1eCBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN5bWJvbCBgJXMnIGhhcyB1bnJlY29nbml6ZWQgY3NlY3QgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgWFRZX0VSIHN5bWJvbCBgJXMnOiBjbGFzcyAlZCBzY251bSAlZCBzY25sZW4gJWQiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTc4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogWE1DX1RDMCBzeW1ib2wgYCVzJyBpcyBjbGFzcyAlZCBzY25sZW4gJWQiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTkxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBzbWNsYXMgJWQiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTkzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY3NlY3QgYCVzJyBub3QgaW4gZW5jbG9zaW5nIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbWlzcGxhY2VkIFhUWV9MRCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjIzNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jICVzOiVkIG5vdCBpbiBjc2VjdCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyNDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBYQ09GRiBzaGFyZWQgb2JqZWN0IHdoZW4gbm90IHByb2R1Y2luZyBYQ09GRiBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZHluYW1pYyBvYmplY3Qgd2l0aCBubyAubG9hZGVyIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VjaCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MzczMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3YXJuaW5nOiBhdHRlbXB0IHRvIGV4cG9ydCB1bmRlZmluZWQgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NDcwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJUT0Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHgxMDAwMDsgdHJ5IC1tbWluaW1hbC10b2Mgd2hlbiBjb21waWxpbmciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NTUzNCB4Y29mZmxpbmsuYzo1ODkwIHhjb2ZmbGluay5jOjU5MjcgeGNvZmZsaW5rLmM6NjI0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NTU1NiB4Y29mZmxpbmsuYzo2MjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NTU3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbG9hZGVyIHJlbG9jIGluIHJlYWQtb25seSBzZWN0aW9uICVzIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjY0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NjQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVE9DIHJlbG9jIGF0IDB4JXggdG8gc3ltYm9sIGAlcycgd2l0aCBubyBUT0MgZW50cnkiCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL2JmZC9wcGNib290LmMgYi9iZmQvcHBjYm9vdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQxODQ4Li4wMDAwMDAwCi0tLSBhL2JmZC9wcGNib290LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQUENidWcgYm9vdCByZWNvcmRzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0LCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgUG93ZXJQQ0J1ZyBib290IG9iamVjdHMuCi0gICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIG1heQotICAgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvIGdlbmVyYXRlIHJhdyBiaW5hcnkKLSAgIGRhdGEuCi0KLSAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCi0gICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCi0gICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKLSAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAotICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBQUENidWcgbG9jYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2xvY2F0aW9uIHsKLSAgYmZkX2J5dGUJaW5kOwotICBiZmRfYnl0ZQloZWFkOwotICBiZmRfYnl0ZQlzZWN0b3I7Ci0gIGJmZF9ieXRlCWN5bGluZGVyOwotfSBwcGNib290X2xvY2F0aW9uX3Q7Ci0KLS8qIFBQQ2J1ZyBwYXJ0aXRpb24gdGFibGUgbGF5b3V0ICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X3BhcnRpdGlvbiB7Ci0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fYmVnaW47CS8qIHBhcnRpdGlvbiBiZWdpbiAqLwotICBwcGNib290X2xvY2F0aW9uX3QJcGFydGl0aW9uX2VuZDsJCS8qIHBhcnRpdGlvbiBlbmQgKi8KLSAgYmZkX2J5dGUJCXNlY3Rvcl9iZWdpbls0XTsJLyogMzItYml0IHN0YXJ0IFJCQSAoemVyby1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KLSAgYmZkX2J5dGUJCXNlY3Rvcl9sZW5ndGhbNF07CS8qIDMyLWJpdCBSQkEgY291bnQgKG9uZS1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KLX0gcHBjYm9vdF9wYXJ0aXRpb25fdDsKLQotLyogUFBDYnVnIGJvb3QgbGF5b3V0LiAgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfaGRyIHsKLSAgYmZkX2J5dGUJCXBjX2NvbXBhdGliaWxpdHlbNDQ2XTsJLyogeDg2IGluc3RydWN0aW9uIGZpZWxkICovCi0gIHBwY2Jvb3RfcGFydGl0aW9uX3QJcGFydGl0aW9uWzRdOwkJLyogcGFydGl0aW9uIGluZm9ybWF0aW9uICovCi0gIGJmZF9ieXRlCQlzaWduYXR1cmVbMl07CQkvKiAweDU1IGFuZCAweGFhICovCi0gIGJmZF9ieXRlCQllbnRyeV9vZmZzZXRbNF07CS8qIGVudHJ5IHBvaW50IG9mZnNldCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJbGVuZ3RoWzRdOwkJLyogbG9hZCBpbWFnZSBsZW5ndGgsIGxpdHRsZSBlbmRpYW4gKi8KLSAgYmZkX2J5dGUJCWZsYWdzOwkJCS8qIGZsYWcgZmllbGQgKi8KLSAgYmZkX2J5dGUJCW9zX2lkOwkJCS8qIE9TX0lEICovCi0gIGNoYXIJCQlwYXJ0aXRpb25fbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lICovCi0gIGJmZF9ieXRlCQlyZXNlcnZlZDFbNDcwXTsJCS8qIHJlc2VydmVkICovCi19Ci0jaWZkZWYgX19HTlVDX18KLSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCi0jZW5kaWYKLXBwY2Jvb3RfaGRyX3Q7Ci0KLS8qIFNpZ25hdHVyZSBieXRlcyBmb3IgbGFzdCAyIGJ5dGVzIG9mIHRoZSA1MTIgYnl0ZSByZWNvcmQgKi8KLSNkZWZpbmUgU0lHTkFUVVJFMCAweDU1Ci0jZGVmaW5lIFNJR05BVFVSRTEgMHhhYQotCi0vKiBQb3dlclBDIGJvb3QgdHlwZSAqLwotI2RlZmluZSBQUENfSU5EIDB4NDEKLQotLyogSW5mb3JtYXRpb24gbmVlZGVkIGZvciBwcGNib290IGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9kYXRhIHsKLSAgcHBjYm9vdF9oZHJfdAloZWFkZXI7CQkJCS8qIHJhdyBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKnNlYzsJCQkJLyogc2luZ2xlIHNlY3Rpb24gKi8KLX0gcHBjYm9vdF9kYXRhX3Q7Ci0KLS8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBwcGNib290IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6Ci0gICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLwotI2RlZmluZSBQUENCT09UX1NZTVMgMwotCi1zdGF0aWMgYm9vbGVhbiBwcGNib290X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqcHBjYm9vdF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLXN0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKnBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBpbnQgcHBjYm9vdF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLSNkZWZpbmUgcHBjYm9vdF9zZXRfdGRhdGEoYWJmZCwgcHRyKSAoKGFiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAocHRyKSkKLSNkZWZpbmUgcHBjYm9vdF9nZXRfdGRhdGEoYWJmZCkgKChwcGNib290X2RhdGFfdCAqKSAoKGFiZmQpLT50ZGF0YS5hbnkpKQotDAotLyogQ3JlYXRlIGEgcHBjYm9vdCBvYmplY3QuICBJbnZva2VkIHZpYSBiZmRfc2V0X2Zvcm1hdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpKQotICAgIHBwY2Jvb3Rfc2V0X3RkYXRhIChhYmZkLCBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHBwY2Jvb3RfZGF0YV90KSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSB0byBQb3dlclBDICovCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0KLSAgZWxzZSBpZiAoYXJjaCAhPSBiZmRfYXJjaF9wb3dlcnBjKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLQwKLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgcHBjYm9vdCBmaWxlLCBwcm92aWRlZCB0aGUgdGFyZ2V0Ci0gICB3YXMgbm90IGRlZmF1bHRlZC4gIFRoYXQgaXMsIGl0IG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMKLSAgIGJlaW5nIHBwY2Jvb3QuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1wcGNib290X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHBwY2Jvb3RfaGRyX3QgaGRyOwotICBzaXplX3QgaTsKLSAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhOwotCi0gIEJGRF9BU1NFUlQgKHNpemVvZiAocHBjYm9vdF9oZHJfdCkgPT0gMTAyNCk7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRmluZCB0aGUgZmlsZSBzaXplLiAgKi8KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChzaXplX3QpIHN0YXRidWYuc3Rfc2l6ZSA8IHNpemVvZiAocHBjYm9vdF9oZHJfdCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBzaXplb2YgKGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoaGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgZG8gc29tZSBiYXNpYyBjaGVja3MuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChoZHIucGNfY29tcGF0aWJpbGl0eSk7IGkrKykKLSAgICBpZiAoaGRyLnBjX2NvbXBhdGliaWxpdHlbaV0pCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgaWYgKGhkci5zaWduYXR1cmVbMF0gIT0gU0lHTkFUVVJFMCB8fCBoZHIuc2lnbmF0dXJlWzFdICE9IFNJR05BVFVSRTEpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGhkci5wYXJ0aXRpb25bMF0ucGFydGl0aW9uX2VuZC5pbmQgIT0gUFBDX0lORCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9IFBQQ0JPT1RfU1lNUzsKLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+dm1hID0gMDsKLSAgc2VjLT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemUgLSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOwotICBzZWMtPmZpbGVwb3MgPSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOwotCi0gIHBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpOwotICB0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKLSAgdGRhdGEtPnNlYyA9IHNlYzsKLSAgbWVtY3B5ICgoUFRSKSAmdGRhdGEtPmhlYWRlciwgKFBUUikgJmhkciwgc2l6ZW9mIChwcGNib290X2hkcl90KSk7Ci0KLSAgcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9wb3dlcnBjLCAwKTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgcHBjYm9vdF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLQwKLS8qIEdldCBjb250ZW50cyBvZiB0aGUgb25seSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCArIHNpemVvZihwcGNib290X2hkcl90KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoUFBDQk9PVF9TWU1TICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLQwKLS8qIENyZWF0ZSBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBiZmQncyBmaWxlbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1hbmdsZV9uYW1lIChhYmZkLCBzdWZmaXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3VmZml4OwotewotICBpbnQgc2l6ZTsKLSAgY2hhciAqYnVmOwotICBjaGFyICpwOwotCi0gIHNpemUgPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkgICsgc3RybGVuIChzdWZmaXgpCi0JICArIHNpemVvZiAiX3BwY2Jvb3RfXyIpOwotCi0gIGJ1ZiA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiX3BwY2Jvb3RfJXNfJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3VmZml4KTsKLQotICAvKiBDaGFuZ2UgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byB1bmRlcnNjb3Jlcy4gICovCi0gIGZvciAocCA9IGJ1ZjsgKnA7IHArKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApKQotICAgICAgKnAgPSAnXyc7Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotDAotLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotcHBjYm9vdF9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKS0+c2VjOwotICBhc3ltYm9sICpzeW1zOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBzeW1zID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBQUENCT09UX1NZTVMgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3RhcnQgc3ltYm9sLiAgKi8KLSAgc3ltc1swXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1swXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzdGFydCIpOwotICBzeW1zWzBdLnZhbHVlID0gMDsKLSAgc3ltc1swXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMF0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1swXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBFbmQgc3ltYm9sLiAgKi8KLSAgc3ltc1sxXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1sxXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJlbmQiKTsKLSAgc3ltc1sxXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzFdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1sxXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzFdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIFNpemUgc3ltYm9sLiAgKi8KLSAgc3ltc1syXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1syXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzaXplIik7Ci0gIHN5bXNbMl0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1syXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMl0uc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIHN5bXNbMl0udWRhdGEucCA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFBQQ0JPT1RfU1lNUzsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IHN5bXMrKzsKLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIFBQQ0JPT1RfU1lNUzsKLX0KLQotDAotLyogTWFrZSBhbiBlbXB0eSBzeW1ib2wuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1wcGNib290X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotfQotCi0MCi0jZGVmaW5lIHBwY2Jvb3RfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotCi0vKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjYm9vdF9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBwcGNib290X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBwcGNib290X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBwcGNib290X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgcHBjYm9vdF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBwcGNib290X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBwcGNib290X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBwcGNib290X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotDAotLyogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBvZiBhIHBwY2Jvb3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogVGhlIGxvd2VzdCBzZWN0aW9uIFZNQSBzZXRzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0Ci0gICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIHVzZSB0aGUgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIGFsbCB0aGUKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxvdyA9IGFiZmQtPnNlY3Rpb25zLT52bWE7Ci0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9ucy0+bmV4dDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAocy0+dm1hIDwgbG93KQotCSAgbG93ID0gcy0+dm1hOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlzLT5maWxlcG9zID0gcy0+dm1hIC0gbG93OwotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0MCi1zdGF0aWMgaW50Ci1wcGNib290X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOwotfQotCi0MCi0vKiBQcmludCBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmYXJnOwotewotICBGSUxFICpmID0gKEZJTEUgKilmYXJnOwotICBwcGNib290X2RhdGFfdCAqdGRhdGEgPSBwcGNib290X2dldF90ZGF0YSAoYWJmZCk7Ci0gIGxvbmcgZW50cnlfb2Zmc2V0ID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLmVudHJ5X29mZnNldCk7Ci0gIGxvbmcgbGVuZ3RoID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLmxlbmd0aCk7Ci0gIGludCBpOwotCi0gIGZwcmludGYgKGYsIF8oIlxucHBjYm9vdCBoZWFkZXI6XG4iKSk7Ci0gIGZwcmludGYgKGYsIF8oIkVudHJ5IG9mZnNldCAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iKSwgZW50cnlfb2Zmc2V0LCBlbnRyeV9vZmZzZXQpOwotICBmcHJpbnRmIChmLCBfKCJMZW5ndGggICAgICAgICAgICAgID0gMHglLjhseCAoJWxkKVxuIiksIGxlbmd0aCwgbGVuZ3RoKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5mbGFncykKLSAgICBmcHJpbnRmIChmLCBfKCJGbGFnIGZpZWxkICAgICAgICAgID0gMHglLjJ4XG4iKSwgdGRhdGEtPmhlYWRlci5mbGFncyk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIub3NfaWQpCi0gICAgZnByaW50ZiAoZiwgIk9TX0lEICAgICAgICAgICAgICAgPSAweCUuMnhcbiIsIHRkYXRhLT5oZWFkZXIub3NfaWQpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbl9uYW1lKQotICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvbiBuYW1lICAgICAgPSBcIiVzXCJcbiIpLCB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbl9uYW1lKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgc2VjdG9yX2JlZ2luICA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0uc2VjdG9yX2JlZ2luKTsKLSAgICAgIGxvbmcgc2VjdG9yX2xlbmd0aCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0uc2VjdG9yX2xlbmd0aCk7Ci0KLSAgICAgIC8qIFNraXAgYWxsIDAgZW50cmllcyAqLwotICAgICAgaWYgKCF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaW5kCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmhlYWQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uc2VjdG9yCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmN5bGluZGVyCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5pbmQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmhlYWQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLnNlY3RvcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuY3lsaW5kZXIKLQkgICYmICFzZWN0b3JfYmVnaW4gJiYgIXNlY3Rvcl9sZW5ndGgpCi0JY29udGludWU7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuUGFydGl0aW9uWyVkXSBzdGFydCAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iKSwgaSwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmluZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmhlYWQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5zZWN0b3IsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5jeWxpbmRlcik7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gZW5kICAgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIiksIGksCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaW5kLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmhlYWQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuc2VjdG9yLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmN5bGluZGVyKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBzZWN0b3IgPSAweCUuOGx4ICglbGQpXG4iKSwgaSwgc2VjdG9yX2JlZ2luLCBzZWN0b3JfYmVnaW4pOwotICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBsZW5ndGggPSAweCUuOGx4ICglbGQpXG4iKSwgaSwgc2VjdG9yX2xlbmd0aCwgc2VjdG9yX2xlbmd0aCk7Ci0gICAgfQotCi0gIGZwcmludGYgKGYsICJcbiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotI2RlZmluZSBwcGNib290X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBwcGNib290X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXQgcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi1jb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjID0KLXsKLSAgInBwY2Jvb3QiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCS8qIGZsYXZvdXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBieXRlb3JkZXIgaXMgYmlnIGVuZGlhbiBmb3IgY29kZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlcl9ieXRlb3JkZXIgKi8KLSAgRVhFQ19QLAkJCS8qIG9iamVjdF9mbGFncyAqLwotICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTKSwgLyogc2VjdGlvbl9mbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBwcGNib290X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHBwY2Jvb3RfbWtvYmplY3QsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX3RydWUsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3B0cmFjZS1jb3JlLmMgYi9iZmQvcHRyYWNlLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2OWRjZS4uMDAwMDAwMAotLS0gYS9iZmQvcHRyYWNlLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgY29yZSBmaWxlcyB3aGljaCB1c2UgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0cmFkLWNvcmUuYyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZQotICAgb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBieSBLZXZpbiBBLiBCdWV0dG5lci4KLSAgIChMb25ndGVybSBpdCBtYXkgYmUgYmV0dGVyIHRvIG1lcmdlIHRoaXMgZmlsZSB3aXRoIHRyYWQtY29yZS5jKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBQVFJBQ0VfQ09SRQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi0KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0Ci0gIHsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKLSAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICoJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCBwdHJhY2VfdXNlciB1OwotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUgfHwgdS5wdF9tYWdpYyAhPSBfQkNTX1BUUkFDRV9NQUdJQyAKLSAgICAgIHx8IHUucHRfcmV2ICE9IF9CQ1NfUFRSQUNFX1JFVikKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0KLSAgLyogRklYTUU6ICBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoYXJlZCBtZW1vcnksIGxpYnJhcnkgZGF0YSwgYW5kIGxpYnJhcnkKLSAgICAgdGV4dC4gIEkgZG9uJ3QgdGhpbmsgdGhhdCBhbnkgb2YgdGhlc2UgdGhpbmdzIGFyZSBzdXBwb3J0ZWQgb24gdGhlCi0gICAgIHN5c3RlbSBvbiB3aGljaCBJIGFtIGRldmVsb3BpbmcgdGhpcyBmb3IgdGhvdWdoLiAqLwotCi0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gIHUucHRfZHNpemU7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSB1LnB0X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZih1KTsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSB1LnB0X29fZGF0YV9zdGFydDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IFVTUlNUQUNLIC0gdS5wdF9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gc2l6ZW9mKHUpOwkvKiBzZWUgdHJhZC1jb3JlLmMgKi8KLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgdS5wdF9kYXRhcHRyOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpICh1LnB0X2RhdGFwdHIgKyB1LnB0X2RzaXplKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyBwdHJhY2VfdXNlciAqLwotCi0gIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X3NpZ2ZyYW1lLnNpZ19udW07Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgLyogRklYTUU6IFVzZSBwdF90aW1kYXQgZmllbGQgb2YgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSB0byBtYXRjaCAKLSAgICAgdGhlIGRhdGUgb2YgdGhlIGV4ZWN1dGFibGUgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIHB0cmFjZV91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAocHRyYWNlX3VuaXgpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwotCi0jZW5kaWYgLyogUFRSQUNFX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9yZWxvYy5jIGIvYmZkL3JlbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODZlMzcuLjAwMDAwMDAKLS0tIGEvYmZkL3JlbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTY3ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciBoYW5kbGluZyByZWxvY2F0aW9uIGVudHJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLQlCRkQgbWFpbnRhaW5zIHJlbG9jYXRpb25zIGluIG11Y2ggdGhlIHNhbWUgd2F5IGl0IG1haW50YWlucwotCXN5bWJvbHM6IHRoZXkgYXJlIGxlZnQgYWxvbmUgdW50aWwgcmVxdWlyZWQsIHRoZW4gcmVhZCBpbgotCWVuLW1hc3NlIGFuZCB0cmFuc2xhdGVkIGludG8gYW4gaW50ZXJuYWwgZm9ybS4gIEEgY29tbW9uCi0Jcm91dGluZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiBhY3RzIHVwb24gdGhlCi0JY2Fub25pY2FsIGZvcm0gdG8gZG8gdGhlIGZpeHVwLgotCi0JUmVsb2NhdGlvbnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgc2VjdGlvbiBiYXNpcywKLQl3aGlsZSBzeW1ib2xzIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIEJGRCBiYXNpcy4KLQotCUFsbCB0aGF0IGEgYmFjayBlbmQgaGFzIHRvIGRvIHRvIGZpdCB0aGUgQkZEIGludGVyZmFjZSBpcyB0byBjcmVhdGUKLQlhIDw8c3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Pj4gZm9yIGVhY2ggcmVsb2NhdGlvbgotCWluIGEgcGFydGljdWxhciBzZWN0aW9uLCBhbmQgZmlsbCBpbiB0aGUgcmlnaHQgYml0cyBvZiB0aGUgc3RydWN0dXJlcy4KLQotQG1lbnUKLUAqIHR5cGVkZWYgYXJlbGVudDo6Ci1AKiBob3d0byBtYW5hZ2VyOjoKLUBlbmQgbWVudQotCi0qLwotCi0vKiBETyBjb21waWxlIGluIHRoZSByZWxvY19jb2RlIG5hbWUgdGFibGUgZnJvbSBsaWJiZmQuaC4gICovCi0jZGVmaW5lIF9CRkRfTUFLRV9UQUJMRV9iZmRfcmVsb2NfY29kZV9yZWFsCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKgotRE9DREQKLUlOT0RFCi0JdHlwZWRlZiBhcmVsZW50LCBob3d0byBtYW5hZ2VyLCBSZWxvY2F0aW9ucywgUmVsb2NhdGlvbnMKLQotU1VCU0VDVElPTgotCXR5cGVkZWYgYXJlbGVudAotCi0JVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGEgcmVsb2NhdGlvbiBlbnRyeToKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfcmVsb2Nfc3RhdHVzCi0uewotLiAgICAgICB7KiBObyBlcnJvcnMgZGV0ZWN0ZWQgKn0KLS4gIGJmZF9yZWxvY19vaywKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKn0KLS4gIGJmZF9yZWxvY19vdmVyZmxvdywKLS4KLS4gICAgICAgeyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICp9Ci0uICBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwKLS4KLS4gICAgICAgeyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqfQotLiAgYmZkX3JlbG9jX2NvbnRpbnVlLAotLgotLiAgICAgICB7KiBVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHNpemUgcmVxdWVzdGVkLiAqfQotLiAgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCwKLS4KLS4gICAgICAgeyogVW51c2VkICp9Ci0uICBiZmRfcmVsb2Nfb3RoZXIsCi0uCi0uICAgICAgIHsqIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgYWdhaW5zdCB3YXMgdW5kZWZpbmVkLiAqfQotLiAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IG1heSBub3QgYmUgb2sgLSBwcmVzZW50bHkKLS4gICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKLS4gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLS4gICAgICAgICAgdG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB3aWxsIGJlIHNldC4gICp9Ci0uICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCi0uIH0KLS4gYmZkX3JlbG9jX3N0YXR1c190eXBlOwotLgotLgotLnR5cGVkZWYgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Ci0uewotLiAgICAgICB7KiBBIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHRhYmxlIG9mIHBvaW50ZXJzICAqfQotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotLgotLiAgICAgICB7KiBvZmZzZXQgaW4gc2VjdGlvbiAqfQotLiAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotLgotLiAgICAgICB7KiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKn0KLS4gIGJmZF92bWEgYWRkZW5kOwotLgotLiAgICAgICB7KiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICp9Ci0uICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLS4KLS59IGFyZWxlbnQ7Ci0KLSovCi0KLS8qCi1ERVNDUklQVElPTgotCi0gICAgICAgIEhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIHRoZSBmaWVsZHMgd2l0aGluIGFuIDw8YXJlbGVudD4+OgotCi0gICAgICAgIG8gPDxzeW1fcHRyX3B0cj4+Ci0KLSAgICAgICAgVGhlIHN5bWJvbCB0YWJsZSBwb2ludGVyIHBvaW50cyB0byBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbAotICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jYXRpb24gcmVxdWVzdC4gIEl0IGlzCi0gICAgICAgIHRoZSBwb2ludGVyIGludG8gdGhlIHRhYmxlIHJldHVybmVkIGJ5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgIDw8Z2V0X3N5bXRhYj4+IGFjdGlvbi4gQHhyZWZ7U3ltYm9sc30uIFRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZAotICAgICAgICB0aHJvdWdoIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgc28gdGhhdCB0b29scyBsaWtlIHRoZSBsaW5rZXIKLSAgICAgICAgY2FuIGZpeCB1cCBhbGwgdGhlIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZSBieSBtb2RpZnlpbmcgb25seQotICAgICAgICBvbmUgcG9pbnRlci4gVGhlIHJlbG9jYXRpb24gcm91dGluZSBsb29rcyBpbiB0aGUgc3ltYm9sIGFuZAotICAgICAgICB1c2VzIHRoZSBiYXNlIG9mIHRoZSBzZWN0aW9uIHRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gYW5kIHRoZQotICAgICAgICB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFzIHRoZSBpbml0aWFsIHJlbG9jYXRpb24gb2Zmc2V0LiBJZiB0aGUKLSAgICAgICAgc3ltYm9sIHBvaW50ZXIgaXMgemVybywgdGhlbiB0aGUgc2VjdGlvbiBwcm92aWRlZCBpcyBsb29rZWQgdXAuCi0KLSAgICAgICAgbyA8PGFkZHJlc3M+PgotCi0gICAgICAgIFRoZSA8PGFkZHJlc3M+PiBmaWVsZCBnaXZlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJhc2Ugb2YKLSAgICAgICAgdGhlIHNlY3Rpb24gZGF0YSB3aGljaCBvd25zIHRoZSByZWxvY2F0aW9uIHJlY29yZCB0byB0aGUgZmlyc3QKLSAgICAgICAgYnl0ZSBvZiByZWxvY2F0YWJsZSBpbmZvcm1hdGlvbi4gVGhlIGFjdHVhbCBkYXRhIHJlbG9jYXRlZAotICAgICAgICB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMgcG9pbnQ7IGZvciBleGFtcGxlLCBhIHJlbG9jYXRpb24KLSAgICAgICAgdHlwZSB3aGljaCBtb2RpZmllcyB0aGUgYm90dG9tIHR3byBieXRlcyBvZiBhIGZvdXIgYnl0ZSB3b3JkCi0gICAgICAgIHdvdWxkIG5vdCB0b3VjaCB0aGUgZmlyc3QgYnl0ZSBwb2ludGVkIHRvIGluIGEgYmlnIGVuZGlhbgotICAgICAgICB3b3JsZC4KLQotCW8gPDxhZGRlbmQ+PgotCi0JVGhlIDw8YWRkZW5kPj4gaXMgYSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYmFjayBlbmQgdG8gYmUgYWRkZWQgKCEpCi0JdG8gdGhlIHJlbG9jYXRpb24gb2Zmc2V0LiBJdHMgaW50ZXJwcmV0YXRpb24gaXMgZGVwZW5kZW50IHVwb24KLQl0aGUgaG93dG8uIEZvciBleGFtcGxlLCBvbiB0aGUgNjhrIHRoZSBjb2RlOgotCi0KLXwgICAgICAgIGNoYXIgZm9vW107Ci18ICAgICAgICBtYWluKCkKLXwgICAgICAgICAgICAgICAgewotfCAgICAgICAgICAgICAgICByZXR1cm4gZm9vWzB4MTIzNDU2NzhdOwotfCAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgQ291bGQgYmUgY29tcGlsZWQgaW50bzoKLQotfCAgICAgICAgbGlua3cgZnAsIy00Ci18ICAgICAgICBtb3ZlYiBAQCMxMjM0NTY3OCxkMAotfCAgICAgICAgZXh0YmwgZDAKLXwgICAgICAgIHVubGsgZnAKLXwgICAgICAgIHJ0cwotCi0KLSAgICAgICAgVGhpcyBjb3VsZCBjcmVhdGUgYSByZWxvYyBwb2ludGluZyB0byA8PGZvbz4+LCBidXQgbGVhdmUgdGhlCi0gICAgICAgIG9mZnNldCBpbiB0aGUgZGF0YSwgc29tZXRoaW5nIGxpa2U6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwNiAzMiAgICAgICAgX2ZvbwotfAotfDAwMDAwMDAwIDRlNTYgZmZmYyAgICAgICAgICA7IGxpbmt3IGZwLCMtNAotfDAwMDAwMDA0IDEwMzkgMTIzNCA1Njc4ICAgICA7IG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18MDAwMDAwMGEgNDljMCAgICAgICAgICAgICAgIDsgZXh0YmwgZDAKLXwwMDAwMDAwYyA0ZTVlICAgICAgICAgICAgICAgOyB1bmxrIGZwCi18MDAwMDAwMGUgNGU3NSAgICAgICAgICAgICAgIDsgcnRzCi0KLQotICAgICAgICBVc2luZyBjb2ZmIGFuZCBhbiA4OGssIHNvbWUgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgZW5vdWdoCi0gICAgICAgIHNwYWNlIGluIHRoZW0gdG8gcmVwcmVzZW50IHRoZSBmdWxsIGFkZHJlc3MgcmFuZ2UsIGFuZAotICAgICAgICBwb2ludGVycyBoYXZlIHRvIGJlIGxvYWRlZCBpbiB0d28gcGFydHMuIFNvIHlvdSdkIGdldCBzb21ldGhpbmcgbGlrZToKLQotCi18ICAgICAgICBvci51ICAgICByMTMscjAsaGkxNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBsZC5iICAgICByMixyMTMsbG8xNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBqbXAgICAgICByMQotCi0KLSAgICAgICAgVGhpcyBzaG91bGQgY3JlYXRlIHR3byByZWxvY3MsIGJvdGggcG9pbnRpbmcgdG8gPDxfZm9vPj4sIGFuZCB3aXRoCi0gICAgICAgIDB4MTIzNDAwMDAgaW4gdGhlaXIgYWRkZW5kIGZpZWxkLiBUaGUgZGF0YSB3b3VsZCBjb25zaXN0IG9mOgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDIgSFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfDAwMDAwMDA2IExWUlQxNiAgICBfZm9vKzB4MTIzNDAwMDAKLXwKLXwwMDAwMDAwMCA1ZGEwNTY3OCAgICAgICAgICAgOyBvci51IHIxMyxyMCwweDU2NzgKLXwwMDAwMDAwNCAxYzRkNTY3OCAgICAgICAgICAgOyBsZC5iIHIyLHIxMywweDU2NzgKLXwwMDAwMDAwOCBmNDAwYzAwMSAgICAgICAgICAgOyBqbXAgcjEKLQotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIHJvdXRpbmUgZGlncyBvdXQgdGhlIHZhbHVlIGZyb20gdGhlIGRhdGEsIGFkZHMKLSAgICAgICAgaXQgdG8gdGhlIGFkZGVuZCB0byBnZXQgdGhlIG9yaWdpbmFsIG9mZnNldCwgYW5kIHRoZW4gYWRkcyB0aGUKLSAgICAgICAgdmFsdWUgb2YgPDxfZm9vPj4uIE5vdGUgdGhhdCBhbGwgMzIgYml0cyBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kCi0gICAgICAgIHNvbWV3aGVyZSwgdG8gY29wZSB3aXRoIGNhcnJ5IGZyb20gYml0IDE1IHRvIGJpdCAxNi4KLQotICAgICAgICBPbmUgZnVydGhlciBleGFtcGxlIGlzIHRoZSBzcGFyYyBhbmQgdGhlIGEub3V0IGZvcm1hdC4gVGhlCi0gICAgICAgIHNwYXJjIGhhcyBhIHNpbWlsYXIgcHJvYmxlbSB0byB0aGUgODhrLCBpbiB0aGF0IHNvbWUKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgcm9vbSBmb3IgYW4gZW50aXJlIG9mZnNldCwgYnV0IG9uIHRoZQotICAgICAgICBzcGFyYyB0aGUgcGFydHMgYXJlIGNyZWF0ZWQgaW4gb2RkIHNpemVkIGx1bXBzLiBUaGUgZGVzaWduZXJzIG9mCi0gICAgICAgIHRoZSBhLm91dCBmb3JtYXQgY2hvc2UgdG8gbm90IHVzZSB0aGUgZGF0YSB3aXRoaW4gdGhlIHNlY3Rpb24KLSAgICAgICAgZm9yIHN0b3JpbmcgcGFydCBvZiB0aGUgb2Zmc2V0OyBhbGwgdGhlIG9mZnNldCBpcyBrZXB0IHdpdGhpbgotICAgICAgICB0aGUgcmVsb2MuIEFueXRoaW5nIGluIHRoZSBkYXRhIHNob3VsZCBiZSBpZ25vcmVkLgotCi18ICAgICAgICBzYXZlICVzcCwtMTEyLCVzcAotfCAgICAgICAgc2V0aGkgJWhpKF9mb28rMHgxMjM0NTY3OCksJWcyCi18ICAgICAgICBsZHNiIFslZzIrJWxvKF9mb28rMHgxMjM0NTY3OCldLCVpMAotfCAgICAgICAgcmV0Ci18ICAgICAgICByZXN0b3JlCi0KLSAgICAgICAgQm90aCByZWxvY3MgY29udGFpbiBhIHBvaW50ZXIgdG8gPDxmb28+PiwgYW5kIHRoZSBvZmZzZXRzCi0gICAgICAgIGNvbnRhaW4ganVuay4KLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA0IEhJMjIgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwwMDAwMDAwOCBMTzEwICAgICAgX2ZvbysweDEyMzQ1Njc4Ci18Ci18MDAwMDAwMDAgOWRlM2JmOTAgICAgIDsgc2F2ZSAlc3AsLTExMiwlc3AKLXwwMDAwMDAwNCAwNTAwMDAwMCAgICAgOyBzZXRoaSAlaGkoX2ZvbyswKSwlZzIKLXwwMDAwMDAwOCBmMDQ4YTAwMCAgICAgOyBsZHNiIFslZzIrJWxvKF9mb28rMCldLCVpMAotfDAwMDAwMDBjIDgxYzdlMDA4ICAgICA7IHJldAotfDAwMDAwMDEwIDgxZTgwMDAwICAgICA7IHJlc3RvcmUKLQotCi0gICAgICAgIG8gPDxob3d0bz4+Ci0KLSAgICAgICAgVGhlIDw8aG93dG8+PiBmaWVsZCBjYW4gYmUgaW1hZ2luZWQgYXMgYQotICAgICAgICByZWxvY2F0aW9uIGluc3RydWN0aW9uLiBJdCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgd2hpY2gKLSAgICAgICAgY29udGFpbnMgaW5mb3JtYXRpb24gb24gd2hhdCB0byBkbyB3aXRoIGFsbCBvZiB0aGUgb3RoZXIKLSAgICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlbG9jIHJlY29yZCBhbmQgZGF0YSBzZWN0aW9uLiBBIGJhY2sgZW5kCi0gICAgICAgIHdvdWxkIG5vcm1hbGx5IGhhdmUgYSByZWxvY2F0aW9uIGluc3RydWN0aW9uIHNldCBhbmQgdHVybgotICAgICAgICByZWxvY2F0aW9ucyBpbnRvIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBvbiBpbnB1dCAtCi0gICAgICAgIGJ1dCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgZWFjaCBob3d0byBmaWVsZCBvbiBkZW1hbmQuCi0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JPDxlbnVtIGNvbXBsYWluX292ZXJmbG93Pj4KLQotCUluZGljYXRlcyB3aGF0IHNvcnQgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgc2hvdWxkIGJlIGRvbmUgd2hlbgotCXBlcmZvcm1pbmcgYSByZWxvY2F0aW9uLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0uZW51bSBjb21wbGFpbl9vdmVyZmxvdwotLnsKLS4JeyogRG8gbm90IGNvbXBsYWluIG9uIG92ZXJmbG93LiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLS4KLS4JeyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0uCSAgIGFzIHNpZ25lZCBvciB1bnNpZ25lZC4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLS4JICAgbnVtYmVyLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotLgkgICB1bnNpZ25lZCBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZAotLn07Ci0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0gICAgICAgIDw8cmVsb2NfaG93dG9fdHlwZT4+Ci0KLSAgICAgICAgVGhlIDw8cmVsb2NfaG93dG9fdHlwZT4+IGlzIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUKLSAgICAgICAgaW5mb3JtYXRpb24gdGhhdCBsaWJiZmQgbmVlZHMgdG8ga25vdyB0byB0aWUgdXAgYSBiYWNrIGVuZCdzIGRhdGEuCi0KLUNPREVfRlJBR01FTlQKLS5zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5OwkJeyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqfQotLgotLnN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLS57Ci0uICAgICAgIHsqICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1lbnRhcnkgdXNlIC0gdGhlIGJhY2sgZW5kIGNhbgotLiAgICAgICAgICAgZG8gd2hhdCBpdCB3YW50cyB3aXRoIGl0LCB0aG91Z2ggbm9ybWFsbHkgdGhlIGJhY2sgZW5kJ3MKLS4gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLS4gICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCBhIFBDIHJlbGF0aXZlIHdvcmQgcmVsb2NhdGlvbgotLiAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IGhhcyB0aGUgdHlwZSAwMjMgLSBiZWNhdXNlIHRoYXQncwotLiAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKn0KLS4gIHVuc2lnbmVkIGludCB0eXBlOwotLgotLiAgICAgICB7KiAgVGhlIHZhbHVlIHRoZSBmaW5hbCByZWxvY2F0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgYnkuIFRoaXMgZHJvcHMKLS4gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICp9Ci0uICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLS4KLS4JeyogIFRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgKm5vdCogYQotLgkgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotLgkgICAgb24gYnkgYSB0eXBlIG9mIHJlbG9jYXRpb24sIHVzZSBiZmRfZ2V0X3JlbG9jX3NpemUuICAqfQotLiAgaW50IHNpemU7Ci0uCi0uICAgICAgIHsqICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0uCSAgICB3aGVuIGRvaW5nIG92ZXJmbG93IGNoZWNraW5nLiAgKn0KLS4gIHVuc2lnbmVkIGludCBiaXRzaXplOwotLgotLiAgICAgICB7KiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0uICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAotLiAgICAgICAgICAgc3VidHJhY3QgZnJvbSB0aGUgcmVsb2NhdGlvbiB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KLS4gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKn0KLS4gIGJvb2xlYW4gcGNfcmVsYXRpdmU7Ci0uCi0uCXsqICBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSByZWxvYyB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24uCi0uCSAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKn0KLS4gIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0uCi0uCXsqIFdoYXQgdHlwZSBvZiBvdmVyZmxvdyBlcnJvciBzaG91bGQgYmUgY2hlY2tlZCBmb3Igd2hlbgotLgkgICByZWxvY2F0aW5nLiAqfQotLiAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBjb21wbGFpbl9vbl9vdmVyZmxvdzsKLS4KLS4gICAgICAgeyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKLS4gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotLiAgICAgICAgICBzdHJhbmdlIHJlbG9jYXRpb24gbWV0aG9kcyB0byBiZSBhY2NvbW9kYXRlZCAoZS5nLiwgaTk2MCBjYWxsagotLiAgICAgICAgICBpbnN0cnVjdGlvbnMpLiAqfQotLiAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLS4JCQkJICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4JCQkJCSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLS4KLS4gICAgICAgeyogVGhlIHRleHR1YWwgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAqfQotLiAgY2hhciAqbmFtZTsKLS4KLS4gICAgICAgeyogU29tZSBmb3JtYXRzIHJlY29yZCBhIHJlbG9jYXRpb24gYWRkZW5kIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi0uICAgICAgICAgIHJhdGhlciB0aGFuIHdpdGggdGhlIHJlbG9jYXRpb24uICBGb3IgRUxGIGZvcm1hdHMgdGhpcyBpcyB0aGUKLS4gICAgICAgICAgZGlzdGluY3Rpb24gYmV0d2VlbiBVU0VfUkVMIGFuZCBVU0VfUkVMQSAodGhvdWdoIHRoZSBjb2RlIGNoZWNrcwotLiAgICAgICAgICBmb3IgVVNFX1JFTCA9PSAxLzApLiAgVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgVFJVRSBpZiB0aGUKLS4gICAgICAgICAgYWRkZW5kIGlzIHJlY29yZGVkIHdpdGggdGhlIHNlY3Rpb24gY29udGVudHM7IHdoZW4gcGVyZm9ybWluZyBhCi0uICAgICAgICAgIHBhcnRpYWwgbGluayAobGQgLXIpIHRoZSBzZWN0aW9uIGNvbnRlbnRzICh0aGUgZGF0YSkgd2lsbCBiZQotLiAgICAgICAgICBtb2RpZmllZC4gIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIEZBTFNFIGlmIGFkZGVuZHMgYXJlCi0uICAgICAgICAgIHJlY29yZGVkIHdpdGggdGhlIHJlbG9jYXRpb24gKGluIGFyZWxlbnQuYWRkZW5kKTsgd2hlbiBwZXJmb3JtaW5nCi0uICAgICAgICAgIGEgcGFydGlhbCBsaW5rIHRoZSByZWxvY2F0aW9uIHdpbGwgYmUgbW9kaWZpZWQuCi0uICAgICAgICAgIEFsbCByZWxvY2F0aW9ucyBmb3IgYWxsIEVMRiBVU0VfUkVMQSB0YXJnZXRzIHNob3VsZCBzZXQgdGhpcyBmaWVsZAotLiAgICAgICAgICB0byBGQUxTRSAodmFsdWVzIG9mIFRSVUUgc2hvdWxkIGJlIGxvb2tlZCBvbiB3aXRoIHN1c3BpY2lvbikuCi0uICAgICAgICAgIEhvd2V2ZXIsIHRoZSBjb252ZXJzZSBpcyBub3QgdHJ1ZTogbm90IGFsbCByZWxvY2F0aW9ucyBvZiBhbGwgRUxGCi0uICAgICAgICAgIFVTRV9SRUwgdGFyZ2V0cyBzZXQgdGhpcyBmaWVsZCB0byBUUlVFLiAgV2h5IHRoaXMgaXMgc28gaXMgcGVjdWxpYXIKLS4gICAgICAgICAgdG8gZWFjaCBwYXJ0aWN1bGFyIHRhcmdldC4gIEZvciByZWxvY3MgdGhhdCBhcmVuJ3QgdXNlZCBpbiBwYXJ0aWFsCi0uICAgICAgICAgIGxpbmtzIChlLmcuIEdPVCBzdHVmZikgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGlzIGlzIHNldCB0by4gICp9Ci0uICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLS4KLS4gICAgICAgeyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotLiAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotLiAgICAgICAgICBieXRlIG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLS4gICAgICAgICAgc3VuNCBleHRlbmRlZCByZWxvY3MsIHRoZSB2YWx1ZSBpbiB0aGUgb2Zmc2V0IHBhcnQgb2YgYQotLiAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKLS4gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKn0KLS4gIGJmZF92bWEgc3JjX21hc2s7Ci0uCi0uICAgICAgIHsqIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKLS4gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0uICAgICAgICAgIGV4Y2VwdCBpbiB0aGUgYWJvdmUgc3BlY2lhbCBjYXNlLCB3aGVyZSBkc3RfbWFzayB3b3VsZCBiZQotLiAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqfQotLiAgYmZkX3ZtYSBkc3RfbWFzazsKLS4KLS4gICAgICAgeyogV2hlbiBzb21lIGZvcm1hdHMgY3JlYXRlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucywgdGhleSBsZWF2ZQotLiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAotLiAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0uICAgICAgICAgIGJlIG1hZGUganVzdCBieSBhZGRpbmcgaW4gYW4gb3JkaW5hcnkgb2Zmc2V0IChlLmcuLCBzdW4zIGEub3V0KS4KLS4gICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgotLiAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qfQotLiAgYm9vbGVhbiBwY3JlbF9vZmZzZXQ7Ci0uCi0ufTsKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JVGhlIEhPV1RPIE1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIEhPV1RPIGRlZmluZSBpcyBob3JyaWJsZSBhbmQgd2lsbCBnbyBhd2F5LgotCi0KLS4jZGVmaW5lIEhPV1RPKEMsIFIsUyxCLCBQLCBCSSwgTywgU0YsIE5BTUUsIElOUExBQ0UsIE1BU0tTUkMsIE1BU0tEU1QsIFBDKSBcCi0uICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9Ci0KLURFU0NSSVBUSU9OCi0JQW5kIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG90YWxseSBtYWdpYyB3YXkuIEJ1dCBmb3IgdGhlCi0JbW9tZW50LCB3ZSBhcmUgY29tcGF0aWJsZSwgc28gZG8gaXQgdGhpcyB3YXkuCi0KLQotLiNkZWZpbmUgTkVXSE9XVE8oIEZVTkNUSU9OLCBOQU1FLFNJWkUsUkVMLElOKSBIT1dUTygwLDAsU0laRSwwLFJFTCwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsRlVOQ1RJT04sIE5BTUUsZmFsc2UsMCwwLElOKQotLgotCi1ERVNDUklQVElPTgotCVRoaXMgaXMgdXNlZCB0byBmaWxsIGluIGFuIGVtcHR5IGhvd3RvIGVudHJ5IGluIGFuIGFycmF5LgotCi0uI2RlZmluZSBFTVBUWV9IT1dUTyhDKSBcCi0uICBIT1dUTygoQyksMCwwLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LE5VTEwsTlVMTCxmYWxzZSwwLDAsZmFsc2UpCi0uCi0KLURFU0NSSVBUSU9OCi0JSGVscGVyIHJvdXRpbmUgdG8gdHVybiBhIHN5bWJvbCBpbnRvIGEgcmVsb2NhdGlvbiB2YWx1ZS4KLQotLiNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotLiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAotLiAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLS4gICAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsgICAgICAgICAgICAgIFwKLS4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS59Ci0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2Nfc2l6ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvX3R5cGUgKik7Ci0KLURFU0NSSVBUSU9OCi0JRm9yIGEgcmVsb2NfaG93dG9fdHlwZSB0aGF0IG9wZXJhdGVzIG9uIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLAotCXRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkIG9uLgotICovCi0KLXVuc2lnbmVkIGludAotYmZkX2dldF9yZWxvY19zaXplIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDogcmV0dXJuIDE7Ci0gICAgY2FzZSAxOiByZXR1cm4gMjsKLSAgICBjYXNlIDI6IHJldHVybiA0OwotICAgIGNhc2UgMzogcmV0dXJuIDA7Ci0gICAgY2FzZSA0OiByZXR1cm4gODsKLSAgICBjYXNlIDg6IHJldHVybiAxNjsKLSAgICBjYXNlIC0yOiByZXR1cm4gNDsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qCi1UWVBFREVGCi0JYXJlbGVudF9jaGFpbgotCi1ERVNDUklQVElPTgotCi0JSG93IHJlbG9jcyBhcmUgdGllZCB0b2dldGhlciBpbiBhbiA8PGFzZWN0aW9uPj46Ci0KLS50eXBlZGVmIHN0cnVjdCByZWxlbnRfY2hhaW4gewotLiAgYXJlbGVudCByZWxlbnQ7Ci0uICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci0ufSBhcmVsZW50X2NoYWluOwotCi0qLwotCi0vKiBOX09ORVMgcHJvZHVjZXMgTiBvbmUgYml0cywgd2l0aG91dCBvdmVyZmxvd2luZyBtYWNoaW5lIGFyaXRobWV0aWMuICAqLwotI2RlZmluZSBOX09ORVMobikgKCgoKChiZmRfdm1hKSAxIDw8ICgobikgLSAxKSkgLSAxKSA8PCAxKSB8IDEpCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19vdmVyZmxvdwotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCQliZmRfY2hlY2tfb3ZlcmZsb3cKLQkJCShlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKLQkJCSB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKLQkJCSB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKLQkJCSB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCi0JCQkgYmZkX3ZtYSByZWxvY2F0aW9uKTsKLQotREVTQ1JJUFRJT04KLQlQZXJmb3JtIG92ZXJmbG93IGNoZWNraW5nIG9uIEB2YXJ7cmVsb2NhdGlvbn0gd2hpY2ggaGFzCi0JQHZhcntiaXRzaXplfSBzaWduaWZpY2FudCBiaXRzIGFuZCB3aWxsIGJlIHNoaWZ0ZWQgcmlnaHQgYnkKLQlAdmFye3JpZ2h0c2hpZnR9IGJpdHMsIG9uIGEgbWFjaGluZSB3aXRoIGFkZHJlc3NlcyBjb250YWluaW5nCi0JQHZhcnthZGRyc2l6ZX0gc2lnbmlmaWNhbnQgYml0cy4gIFRoZSByZXN1bHQgaXMgZWl0aGVyIG9mCi0JQGNvZGV7YmZkX3JlbG9jX29rfSBvciBAY29kZXtiZmRfcmVsb2Nfb3ZlcmZsb3d9LgotCi0qLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jaGVja19vdmVyZmxvdyAoaG93LCBiaXRzaXplLCByaWdodHNoaWZ0LCBhZGRyc2l6ZSwgcmVsb2NhdGlvbikKLSAgICAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3c7Ci0gICAgIHVuc2lnbmVkIGludCBiaXRzaXplOwotICAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLSAgICAgdW5zaWduZWQgaW50IGFkZHJzaXplOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci17Ci0gIGJmZF92bWEgZmllbGRtYXNrLCBhZGRybWFzaywgc2lnbm1hc2ssIHNzLCBhOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLQotICBhID0gcmVsb2NhdGlvbjsKLQotICAvKiBOb3RlOiBCSVRTSVpFIHNob3VsZCBhbHdheXMgYmUgPD0gQUREUlNJWkUsIGJ1dCBpbiBjYXNlIGl0J3Mgbm90LAotICAgICB3ZSdsbCBiZSBwZXJtaXNzaXZlOiBleHRyYSBiaXRzIGluIHRoZSBmaWVsZCBtYXNrIHdpbGwKLSAgICAgYXV0b21hdGljYWxseSBleHRlbmQgdGhlIGFkZHJlc3MgbWFzayBmb3IgcHVycG9zZXMgb2YgdGhlCi0gICAgIG92ZXJmbG93IGNoZWNrLiAgKi8KLSAgZmllbGRtYXNrID0gTl9PTkVTIChiaXRzaXplKTsKLSAgYWRkcm1hc2sgPSBOX09ORVMgKGFkZHJzaXplKSB8IGZpZWxkbWFzazsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19kb250OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLSAgICAgIC8qIElmIGFueSBzaWduIGJpdHMgYXJlIHNldCwgYWxsIHNpZ24gYml0cyBtdXN0IGJlIHNldC4gIFRoYXQKLSAgICAgICAgIGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyIHNoaWZ0aW5nLiAgKi8KLSAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotICAgICAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7Ci0gICAgICBzcyA9IGEgJiBzaWdubWFzazsKLSAgICAgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLSAgICAgIC8qIFdlIGhhdmUgYW4gb3ZlcmZsb3cgaWYgdGhlIGFkZHJlc3MgZG9lcyBub3QgZml0IGluIHRoZSBmaWVsZC4gICovCi0gICAgICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLSAgICAgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0gICAgICAvKiBCaXRmaWVsZHMgYXJlIHNvbWV0aW1lcyBzaWduZWQsIHNvbWV0aW1lcyB1bnNpZ25lZC4gIFdlCi0JIGV4cGxpY2l0bHkgYWxsb3cgYW4gYWRkcmVzcyB3cmFwIHRvbywgd2hpY2ggbWVhbnMgYSBiaXRmaWVsZAotCSBvZiBuIGJpdHMgaXMgYWxsb3dlZCB0byBzdG9yZSAtMioqbiB0byAyKipuLTEuICBUaHVzIG92ZXJmbG93Ci0JIGlmIHRoZSB2YWx1ZSBoYXMgc29tZSwgYnV0IG5vdCBhbGwsIGJpdHMgc2V0IG91dHNpZGUgdGhlCi0JIGZpZWxkLiAgKi8KLSAgICAgIGEgPj49IHJpZ2h0c2hpZnQ7Ci0gICAgICBzcyA9IGEgJiB+IGZpZWxkbWFzazsKLSAgICAgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoKGJmZF92bWEpIC0xID4+IHJpZ2h0c2hpZnQpICYgfiBmaWVsZG1hc2spKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLSAgICAgICAgICAgICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCSBjaGFyICoqZXJyb3JfbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0JSWYgQHZhcntvdXRwdXRfYmZkfSBpcyBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uLCB0aGUKLQlnZW5lcmF0ZWQgaW1hZ2Ugd2lsbCBiZSByZWxvY2F0YWJsZTsgdGhlIHJlbG9jYXRpb25zIGFyZQotCWNvcGllZCB0byB0aGUgb3V0cHV0IGZpbGUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gY2hhbmdlZCB0bwotCXJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd29ybGQuIFRoZXJlIGFyZSB0d28gd2F5cyBvZgotCXJlZmxlY3RpbmcgdGhlIHJlc3VsdHMgb2YgcGFydGlhbCBsaW5rYWdlIGluIGFuIG91dHB1dCBmaWxlOgotCWJ5IG1vZGlmeWluZyB0aGUgb3V0cHV0IGRhdGEgaW4gcGxhY2UsIGFuZCBieSBtb2RpZnlpbmcgdGhlCi0JcmVsb2NhdGlvbiByZWNvcmQuICBTb21lIG5hdGl2ZSBmb3JtYXRzIChlLmcuLCBiYXNpYyBhLm91dCBhbmQKLQliYXNpYyBjb2ZmKSBoYXZlIG5vIHdheSBvZiBzcGVjaWZ5aW5nIGFuIGFkZGVuZCBpbiB0aGUKLQlyZWxvY2F0aW9uIHR5cGUsIHNvIHRoZSBhZGRlbmQgaGFzIHRvIGdvIGluIHRoZSBvdXRwdXQgZGF0YS4KLQlUaGlzIGlzIG5vIGJpZyBkZWFsIHNpbmNlIGluIHRoZXNlIGZvcm1hdHMgdGhlIG91dHB1dCBkYXRhCi0Jc2xvdCB3aWxsIGFsd2F5cyBiZSBiaWcgZW5vdWdoIGZvciB0aGUgYWRkZW5kLiBDb21wbGV4IHJlbG9jCi0JdHlwZXMgd2l0aCBhZGRlbmRzIHdlcmUgaW52ZW50ZWQgdG8gc29sdmUganVzdCB0aGlzIHByb2JsZW0uCi0JVGhlIEB2YXJ7ZXJyb3JfbWVzc2FnZX0gYXJndW1lbnQgaXMgc2V0IHRvIGFuIGVycm9yIG1lc3NhZ2UgaWYKLQl0aGlzIHJldHVybiBAY29kZXtiZmRfcmVsb2NfZGFuZ2Vyb3VzfS4KLQotKi8KLQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIG9jdGV0cyA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzICogYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCk7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0gIHN5bWJvbCA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLSAgICAgIGNvbnQgPSBob3d0by0+c3BlY2lhbF9mdW5jdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgIGVycm9yX21lc3NhZ2UpOwotICAgICAgaWYgKGNvbnQgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotCXJldHVybiBjb250OwotICAgIH0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIC8KLSAgICAgIGJmZF9vY3RldHNfcGVyX2J5dGUgKGFiZmQpKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZjY0LXJzNjAwMCIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250Ci0gICAgICAmJiBmbGFnID09IGJmZF9yZWxvY19vaykKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgKCggIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUykgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByKSB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgPSAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgICggICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kIE4gTiBOIE4gTiAgICAgICAgICApIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICA9ICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgICggICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICBBIEEgQSBBIEEpCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgID0gICBSIFIgUiBSIFIgUiBSIFIgUiBSICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSArIG9jdGV0cyk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0gICAgICAgICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIGxvb2tzIHJlbWFya2FibHkgbGlrZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiwgZXhjZXB0IGl0Ci0JZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KLQlJLmUuLCBpdCdzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiBjcmVhdGluZywgcmF0aGVyIHRoYW4gYXBwbHlpbmcKLQlhIHJlbG9jYXRpb24uCi0KLQlGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIHJlc2VydmVkIGZvciB0aGUKLQlhc3NlbWJsZXIuCi0KLSovCi0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YV9zdGFydCwgZGF0YV9zdGFydF9vZmZzZXQsCi0JCQlpbnB1dF9zZWN0aW9uLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YV9zdGFydDsKLSAgICAgYmZkX3ZtYSBkYXRhX3N0YXJ0X29mZnNldDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIG9jdGV0cyA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzICogYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCk7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBiZmRfYnl0ZSAqZGF0YTsKLQotICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLQotICAgICAgLyogWFhYIC0gVGhlIHNwZWNpYWxfZnVuY3Rpb24gY2FsbHMgaGF2ZW4ndCBiZWVuIGZpeGVkIHVwIHRvIGRlYWwKLQkgd2l0aCBjcmVhdGluZyBuZXcgcmVsb2NhdGlvbnMgYW5kIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLAotCQkJCSAgICAgIC8qIFhYWCAtIE5vbi1wb3J0YWJsZSEgKi8KLQkJCQkgICAgICAoKGJmZF9ieXRlICopIGRhdGFfc3RhcnQKLQkJCQkgICAgICAgLSBkYXRhX3N0YXJ0X29mZnNldCksCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgYWJmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdURj8/ICovCi0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmNjQtcnM2MDAwIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAieGNvZmYtcG93ZXJtYWMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtYmlnIikgIT0gMCkKLQl7Ci0jaWYgMQotLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLSAgIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotICAgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQl9Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCi0gICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQotICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKLSAgICAgbWFjaGluZSB3b3JkLgotICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgotICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgZmxhZyA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJICAgICAgIGhvd3RvLT5iaXRzaXplLAotCQkJICAgICAgIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJICAgICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpLAotCQkJICAgICAgIHJlbG9jYXRpb24pOwotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgICgoICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMpIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgcikgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgID0gICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAoICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCBOIE4gTiBOIE4gICAgICAgICAgKSBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgPSAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICAoICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgQSBBIEEgQSBBKQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICA9ICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgZGF0YV9zdGFydCArIChvY3RldHMgLSBkYXRhX3N0YXJ0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgewotCWJmZF92bWEgeCA9IGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzY0IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIFRoaXMgcmVsb2NhdGlvbiByb3V0aW5lIGlzIHVzZWQgYnkgc29tZSBvZiB0aGUgYmFja2VuZCBsaW5rZXJzLgotICAgVGhleSBkbyBub3QgY29uc3RydWN0IGFzeW1ib2wgb3IgYXJlbGVudCBzdHJ1Y3R1cmVzLCBzbyB0aGVyZSBpcyBubwotICAgcmVhc29uIGZvciB0aGVtIHRvIHVzZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgQWxzbywKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgc28gaGFja2VkIHVwIGl0IGlzIGVhc2llciB0byB3cml0ZSBhIG5ldwotICAgZnVuY3Rpb24gdGhhbiB0byB0cnkgdG8gZGVhbCB3aXRoIGl0LgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBhIGZpbmFsIHJlbG9jYXRpb24uICBXaGV0aGVyIGl0IGlzIHVzZWZ1bCBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsgZGVwZW5kcyB1cG9uIGhvdyB0aGUgb2JqZWN0IGZvcm1hdCBkZWZpbmVzCi0gICByZWxvY2F0aW9ucy4KLQotICAgRklYTUU6IFRoaXMgcm91dGluZSBpZ25vcmVzIGFueSBzcGVjaWFsX2Z1bmN0aW9uIGluIHRoZSBIT1dUTywKLSAgIHNpbmNlIHRoZSBleGlzdGluZyBzcGVjaWFsX2Z1bmN0aW9uIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbiBmb3IKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0KLSAgIEhPV1RPIGlzIHRoZSByZWxvYyBob3d0byBpbmZvcm1hdGlvbi4KLSAgIElOUFVUX0JGRCBpcyB0aGUgQkZEIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgotICAgSU5QVVRfU0VDVElPTiBpcyB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MgYXBwbGllcyB0by4KLSAgIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4KLSAgIEFERFJFU1MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jIHdpdGhpbiBJTlBVVF9TRUNUSU9OLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdGhlIHJlbG9jIHJlZmVycyB0by4KLSAgIEFEREVORCBpcyB0aGUgYWRkZW5kIG9mIHRoZSByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRkcmVzcywKLQkJCSAgdmFsdWUsIGFkZGVuZCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSBiYXNpYyByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QgYSBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdG8KLSAgICAgcmVsb2NhdGUgdG8uICBUaGlzIGlzIGp1c3QgVkFMVUUsIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBwbHVzCi0gICAgIEFEREVORCwgYW55IGFkZGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jLiAgKi8KLSAgcmVsb2NhdGlvbiA9IHZhbHVlICsgYWRkZW5kOwotCi0gIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIFBDIHJlbGF0aXZlLCB3ZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OIHRvCi0gICAgIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgKGN1cnJlbnRseSBpbiBSRUxPQ0FUSU9OKSBhbmQgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSByZWxvY2F0aW5nLiAgU29tZSB0YXJnZXRzIChlLmcuLCBpMzg2LWFvdXQpCi0gICAgIGFycmFuZ2UgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlCi0gICAgIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uOyBmb3Igc3VjaCB0YXJnZXRzCi0gICAgIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIE90aGVyIHRhcmdldHMgKGUuZy4sIG04OGtiY3Mgb3IgRUxGKQotICAgICBzaW1wbHkgbGVhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFzIHplcm87IGZvciBzdWNoCi0gICAgIHRhcmdldHMgcGNyZWxfb2Zmc2V0IGlzIHRydWUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2UgZG8gbm90Ci0gICAgIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUKLSAgICAgc2VjdGlvbiAod2hpY2ggaXMganVzdCBBRERSRVNTKS4gICovCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCkKLQlyZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSBjb250ZW50cyArIGFkZHJlc3MpOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHNpemU7Ci0gIGJmZF92bWEgeCA9IDA7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnOwotICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCA9IGhvd3RvLT5yaWdodHNoaWZ0OwotICB1bnNpZ25lZCBpbnQgYml0cG9zID0gaG93dG8tPmJpdHBvczsKLQotICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKLSAgICAgZ2VuZXJhbC4gICovCi0gIGlmIChob3d0by0+c2l6ZSA8IDApCi0gICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCi0gIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAxOgotICAgICAgeCA9IGJmZF9nZXRfOCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0jaWZkZWYgQkZENjQKLSAgICAgIHggPSBiZmRfZ2V0XzY0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KLSAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCi0gICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCi0gICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCi0gIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJtYXNrLCBmaWVsZG1hc2ssIHNpZ25tYXNrLCBzczsKLSAgICAgIGJmZF92bWEgYSwgYiwgc3VtOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlcyB0byBiZSBhZGRlZCB0b2dldGhlci4gIEZvciBzaWduZWQgYW5kIHVuc2lnbmVkCi0gICAgICAgICByZWxvY2F0aW9ucywgd2UgYXNzdW1lIHRoYXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgdHJ1bmNhdGVkIHRvCi0gICAgICAgICB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzLiAgRm9yIGJpdGZpZWxkcywgYWxsIHRoZSBiaXRzIG1hdHRlci4KLSAgICAgICAgIFNlZSBhbHNvIGJmZF9jaGVja19vdmVyZmxvdy4gICovCi0gICAgICBmaWVsZG1hc2sgPSBOX09ORVMgKGhvd3RvLT5iaXRzaXplKTsKLSAgICAgIGFkZHJtYXNrID0gTl9PTkVTIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpKSB8IGZpZWxkbWFzazsKLSAgICAgIGEgPSByZWxvY2F0aW9uOwotICAgICAgYiA9IHggJiBob3d0by0+c3JjX21hc2s7Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotCi0JICAvKiBJZiBhbnkgc2lnbiBiaXRzIGFyZSBzZXQsIGFsbCBzaWduIGJpdHMgbXVzdCBiZSBzZXQuCi0JICAgICBUaGF0IGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyCi0JICAgICBzaGlmdGluZy4gICovCi0JICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKLQkgIHNzID0gYSAmIHNpZ25tYXNrOwotCSAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgLyogV2Ugb25seSBuZWVkIHRoaXMgbmV4dCBiaXQgb2YgY29kZSBpZiB0aGUgc2lnbiBiaXQgb2YgQgotICAgICAgICAgICAgIGlzIGJlbG93IHRoZSBzaWduIGJpdCBvZiBBLiAgVGhpcyB3b3VsZCBvbmx5IGhhcHBlbiBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhZCBmZXdlciBiaXRzIHRoYW4gQklUU0laRS4gIE5vdGUgdGhhdCBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhcyBtb3JlIGJpdHMgdGhhbiBCSVRTSVpFLCB3ZSBjYW4gZ2V0IGludG8KLSAgICAgICAgICAgICB0cm91YmxlOyB3ZSB3b3VsZCBuZWVkIHRvIHZlcmlmeSB0aGF0IEIgaXMgaW4gcmFuZ2UsIGFzCi0gICAgICAgICAgICAgd2UgZG8gZm9yIEEgYWJvdmUuICAqLwotCSAgc2lnbm1hc2sgPSAoKH4gaG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzazsKLQotCSAgLyogU2V0IGFsbCB0aGUgYml0cyBhYm92ZSB0aGUgc2lnbiBiaXQuICAqLwotCSAgYiA9IChiIF4gc2lnbm1hc2spIC0gc2lnbm1hc2s7Ci0KLQkgIGIgPSAoYiAmIGFkZHJtYXNrKSA+PiBiaXRwb3M7Ci0KLQkgIC8qIE5vdyB3ZSBjYW4gZG8gdGhlIGFkZGl0aW9uLiAgKi8KLQkgIHN1bSA9IGEgKyBiOwotCi0JICAvKiBTZWUgaWYgdGhlIHJlc3VsdCBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gIEJpdHMgYWJvdmUgdGhlCi0gICAgICAgICAgICAgc2lnbiBiaXQgYXJlIGp1bmsgbm93OyBpZ25vcmUgdGhlbS4gIElmIHRoZSBzdW0gaXMKLSAgICAgICAgICAgICBwb3NpdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwgbmVnYXRpdmUgaW5wdXRzOwotICAgICAgICAgICAgIGlmIHRoZSBzdW0gaXMgbmVnYXRpdmUsIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGhhdmUgYWxsCi0gICAgICAgICAgICAgcG9zaXRpdmUgaW5wdXRzLiAgVGhlIHRlc3QgYmVsb3cgbG9va3Mgb25seSBhdCB0aGUgc2lnbgotICAgICAgICAgICAgIGJpdHMsIGFuZCBpdCByZWFsbHkganVzdAotCSAgICAgICAgIFNJR04gKEEpID09IFNJR04gKEIpICYmIFNJR04gKEEpICE9IFNJR04gKFNVTSkKLQkgICAgICovCi0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCSAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzaykKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgLyogQ2hlY2tpbmcgZm9yIGFuIHVuc2lnbmVkIG92ZXJmbG93IGlzIHJlbGF0aXZlbHkgZWFzeToKLSAgICAgICAgICAgICB0cmltIHRoZSBhZGRyZXNzZXMgYW5kIGFkZCwgYW5kIHRyaW0gdGhlIHJlc3VsdCBhcyB3ZWxsLgotICAgICAgICAgICAgIE92ZXJmbG93IGlzIG5vcm1hbGx5IGluZGljYXRlZCB3aGVuIHRoZSByZXN1bHQgZG9lcyBub3QKLSAgICAgICAgICAgICBmaXQgaW4gdGhlIGZpZWxkLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgICAgICAgICAgIGNhc2Ugd2hlbiwgZS5nLiwgZmllbGRtYXNrIGlzIDB4N2ZmZmZmZmYgb3Igc21hbGxlciwgYW4KLSAgICAgICAgICAgICBpbnB1dCBpcyAweDgwMDAwMDAwLCBhbmQgYmZkX3ZtYSBpcyBvbmx5IDMyIGJpdHM7IHRoZW4gd2UKLSAgICAgICAgICAgICB3aWxsIGdldCBzdW0gPT0gMCwgYnV0IHRoZXJlIGlzIGFuIG92ZXJmbG93LCBzaW5jZSB0aGUKLSAgICAgICAgICAgICBpbnB1dHMgZGlkIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgSW5zdGVhZCBvZiBkb2luZyBhCi0gICAgICAgICAgICAgc2VwYXJhdGUgdGVzdCwgd2UgY2FuIGNoZWNrIGZvciB0aGlzIGJ5IG9yLWluZyBpbiB0aGUKLSAgICAgICAgICAgICBvcGVyYW5kcyB3aGVuIHRlc3RpbmcgZm9yIHRoZSBzdW0gb3ZlcmZsb3dpbmcgaXRzIGZpbmFsCi0gICAgICAgICAgICAgZmllbGQuICAqLwotCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0JICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOwotCSAgc3VtID0gKGEgKyBiKSAmIGFkZHJtYXNrOwotCSAgaWYgKChhIHwgYiB8IHN1bSkgJiB+IGZpZWxkbWFzaykKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgLyogTXVjaCBsaWtlIHRoZSBzaWduZWQgY2hlY2ssIGJ1dCBmb3IgYSBmaWVsZCBvbmUgYml0Ci0JICAgICB3aWRlciwgYW5kIG5vIHRyaW1taW5nIGlucHV0cyB3aXRoIGFkZHJtYXNrLiAgV2UgYWxsb3cgYQotCSAgICAgYml0ZmllbGQgdG8gcmVwcmVzZW50IG51bWJlcnMgaW4gdGhlIHJhbmdlIC0yKipuIHRvCi0JICAgICAyKipuLTEsIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaWVsZC4KLQkgICAgIE5vdGUgdGhhdCB3aGVuIGJmZF92bWEgaXMgMzIgYml0cywgYSAzMi1iaXQgcmVsb2MgY2FuJ3QKLQkgICAgIG92ZXJmbG93LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gICovCi0JICBhID4+PSByaWdodHNoaWZ0OwotCi0JICBzaWdubWFzayA9IH4gZmllbGRtYXNrOwotCSAgc3MgPSBhICYgc2lnbm1hc2s7Ci0JICBpZiAoc3MgIT0gMCAmJiBzcyAhPSAoKChiZmRfdm1hKSAtMSA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgc2lnbm1hc2sgPSAoKH4gaG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzazsKLQkgIGIgPSAoYiBeIHNpZ25tYXNrKSAtIHNpZ25tYXNrOwotCi0JICBiID4+PSBiaXRwb3M7Ci0KLQkgIHN1bSA9IGEgKyBiOwotCi0JICAvKiBXZSBtYXNrIHdpdGggYWRkcm1hc2sgaGVyZSB0byBleHBsaWNpdGx5IGFsbG93IGFuIGFkZHJlc3MKLQkgICAgIHdyYXAtYXJvdW5kLiAgVGhlIExpbnV4IGtlcm5lbCByZWxpZXMgb24gaXQsIGFuZCBpdCBpcwotCSAgICAgdGhlIG9ubHkgd2F5IHRvIHdyaXRlIGFzc2VtYmxlciBjb2RlIHdoaWNoIGNhbiBydW4gd2hlbgotCSAgICAgbG9hZGVkIGF0IGEgbG9jYXRpb24gMHg4MDAwMDAwMCBhd2F5IGZyb20gdGhlIGxvY2F0aW9uIGF0Ci0JICAgICB3aGljaCBpdCBpcyBsaW5rZWQuICAqLwotCSAgc2lnbm1hc2sgPSBmaWVsZG1hc2sgKyAxOwotCSAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzayAmIGFkZHJtYXNrKQotCSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCBSRUxPQ0FUSU9OIGluIHRoZSByaWdodCBiaXRzLiAgKi8KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIHJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBiaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRE9DREQKLUlOT0RFCi0JaG93dG8gbWFuYWdlciwgICwgdHlwZWRlZiBhcmVsZW50LCBSZWxvY2F0aW9ucwotCi1TRUNUSU9OCi0JVGhlIGhvd3RvIG1hbmFnZXIKLQotCVdoZW4gYW4gYXBwbGljYXRpb24gd2FudHMgdG8gY3JlYXRlIGEgcmVsb2NhdGlvbiwgYnV0IGRvZXNuJ3QKLQlrbm93IHdoYXQgdGhlIHRhcmdldCBtYWNoaW5lIG1pZ2h0IGNhbGwgaXQsIGl0IGNhbiBmaW5kIG91dCBieQotCXVzaW5nIHRoaXMgYml0IG9mIGNvZGUuCi0KLSovCi0KLS8qCi1UWVBFREVGCi0JYmZkX3JlbG9jX2NvZGVfdHlwZQotCi1ERVNDUklQVElPTgotCVRoZSBpbnNpZGVzIG9mIGEgcmVsb2MgY29kZS4gIFRoZSBpZGVhIGlzIHRoYXQsIGV2ZW50dWFsbHksIHRoZXJlCi0Jd2lsbCBiZSBvbmUgZW51bWVyYXRvciBmb3IgZXZlcnkgdHlwZSBvZiByZWxvY2F0aW9uIHdlIGV2ZXIgZG8uCi0JUGFzcyBvbmUgb2YgdGhlc2UgdmFsdWVzIHRvIDw8YmZkX3JlbG9jX3R5cGVfbG9va3VwPj4sIGFuZCBpdCdsbAotCXJldHVybiBhIGhvd3RvIHBvaW50ZXIuCi0KLQlUaGlzIGRvZXMgbWVhbiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtdXN0IGRldGVybWluZSB0aGUgY29ycmVjdAotCWVudW1lcmF0b3IgdmFsdWU7IHlvdSBjYW4ndCBnZXQgYSBob3d0byBwb2ludGVyIGZyb20gYSByYW5kb20gc2V0Ci0Jb2YgYXR0cmlidXRlcy4KLQotU0VOVU0KLSAgIGJmZF9yZWxvY19jb2RlX3JlYWwKLQotRU5VTQotICBCRkRfUkVMT0NfNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMgotRU5VTVgKLSAgQkZEX1JFTE9DXzI2Ci1FTlVNWAotICBCRkRfUkVMT0NfMjQKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNgotRU5VTVgKLSAgQkZEX1JFTE9DXzE0Ci1FTlVNWAotICBCRkRfUkVMT0NfOAotRU5VTURPQwotICBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BDUkVMCi1FTlVNRE9DCi0gIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zLiAgU29tZXRpbWVzIHRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcwotb2YgdGhlIHJlbG9jYXRpb24gaXRzZWxmOyBzb21ldGltZXMgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCi10aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxvY2F0aW9uLiAgSXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgdGFyZ2V0LgotCi1UaGUgMjQtYml0IHJlbG9jYXRpb24gaXMgdXNlZCBpbiBzb21lIEludGVsIDk2MCBjb25maWd1cmF0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfMzJfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9HT1RfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QTFRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19MTzE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUT0ZGCi1FTlVNRE9DCi0gIEZvciBFTEYuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY4S19HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DXzY4S19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzY4S19SRUxBVElWRQotRU5VTURPQwotICBSZWxvY2F0aW9ucyB1c2VkIGJ5IDY4SyBFTEYuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19SVkEKLUVOVU1ET0MKLSAgTGlua2FnZS10YWJsZSByZWxhdGl2ZS4KLQotRU5VTQotICBCRkRfUkVMT0NfOF9GRm5uCi1FTlVNRE9DCi0gIEFic29sdXRlIDgtYml0IHJlbG9jYXRpb24sIGJ1dCB1c2VkIHRvIGZvcm0gYW4gYWRkcmVzcyBsaWtlIDB4RkZubi4KLQotRU5VTQotICBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMgotRU5VTVgKLSAgQkZEX1JFTE9DXzIzX1BDUkVMX1MyCi1FTlVNRE9DCi0gIFRoZXNlIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgYXMgd29yZCBkaXNwbGFjZW1lbnRzIC0tCi1pLmUuLCBieXRlIGRpc3BsYWNlbWVudHMgc2hpZnRlZCByaWdodCB0d28gYml0cy4gIFRoZSAzMC1iaXQgd29yZAotZGlzcGxhY2VtZW50ICg8PDMyX1BDUkVMX1MyPj4gLS0gMzIgYml0cywgc2hpZnRlZCAyKSBpcyB1c2VkIG9uIHRoZQotU1BBUkMuICAoU1BBUkMgdG9vbHMgZ2VuZXJhbGx5IHJlZmVyIHRvIHRoaXMgYXMgPDxXRElTUDMwPj4uKSAgVGhlCi1zaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBNSVBTLCBhbmQgdGhlIDIzLWJpdAotZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIEFscGhhLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19ISTIyCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xMAotRU5VTURPQwotICBIaWdoIDIyIGJpdHMgYW5kIGxvdyAxMCBiaXRzIG9mIDMyLWJpdCB2YWx1ZSwgcGxhY2VkIGludG8gbG93ZXIgYml0cyBvZgotdGhlIHRhcmdldCB3b3JkLiAgVGhlc2UgYXJlIHVzZWQgb24gdGhlIFNQQVJDLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19HUFJFTDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTURPQwotICBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuCi0KLQotRU5VTQotICBCRkRfUkVMT0NfSTk2MF9DQUxMSgotRU5VTURPQwotICBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LgotCi1FTlVNCi0gIEJGRF9SRUxPQ19OT05FCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzEzCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUEMxMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XUExUMzAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfVUEzMgotRU5VTURPQwotICBTUEFSQyBFTEYgcmVsb2NhdGlvbnMuICBUaGVyZSBpcyBwcm9iYWJseSBzb21lIG92ZXJsYXAgd2l0aCBvdGhlcgotICByZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4KLQotRU5VTQotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyCi1FTlVNRE9DCi0gIEkgdGhpbmsgdGhlc2UgYXJlIHNwZWNpZmljIHRvIFNQQVJDIGEub3V0IChlLmcuLCBTdW4gNCkuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfU1BBUkNfNjQKLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ18xMQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX09MTzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSEgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hNMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19MTTIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ183Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzUKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX1NQQVJDX0RJU1A2NAotICBCRkRfUkVMT0NfNjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QTFQ2NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hJWDIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE9YMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19INDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19NNDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19MNDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUgotRU5VTURPQwotICBTUEFSQzY0IHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX1JFVjMyCi1FTlVNRE9DCi0gIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNgotRU5VTURPQwotICBBbHBoYSBFQ09GRiBhbmQgRUxGIHJlbG9jYXRpb25zLiAgU29tZSBvZiB0aGVzZSB0cmVhdCB0aGUgc3ltYm9sIG9yCi0gICAgICJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi0gIEZvciBHUERJU1BfSEkxNiAoImdwZGlzcCIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGlnbm9yZWQgd2hlbgotICAgICB3cml0aW5nOyB3aGVuIHJlYWRpbmcsIGl0IHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLiAgVGhlCi0gICAgIGFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi0gICAgIHRoZSAibGRhaCIgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIGF0IHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MpLgotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYKLUVOVU1ET0MKLSAgRm9yIEdQRElTUF9MTzE2ICgiaWdub3JlIikgcmVsb2NhdGlvbnMsIHRoZSBzeW1ib2wgaXMgaGFuZGxlZCBhcwotICAgICB3aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi0gICAgIHJlbG9jYXRpb25zIG91dCwgYW5kIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24KLSAgICAgcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AKLUVOVU1ET0MKLSAgVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotICAgICByZWxvY2F0aW9uIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGFjY29tcGFueWluZyBHUERJU1BfTE8xNgotICAgICByZWxvY2F0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0UKLUVOVU1ET0MKLSAgVGhlIEFscGhhIExJVEVSQUwvTElUVVNFIHJlbG9jcyBhcmUgcHJvZHVjZWQgYnkgYSBzeW1ib2wgcmVmZXJlbmNlOwotICAgICB0aGUgYXNzZW1ibGVyIHR1cm5zIGl0IGludG8gYSBMRFEgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi0gICAgIFRoZSBMSVRFUkFMIHJlbG9jLCBhdCB0aGUgTERRIGluc3RydWN0aW9uLCByZWZlcnMgdG8gdGhlIC5saXRhCi0gICAgIHNlY3Rpb24gc3ltYm9sLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZywgYnV0IGlzIGZpbGxlZAotICAgICBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotICAgICBHUERJU1BfTE8xNiByZWxvYy4KLQotICAgICBUaGUgRUxGX0xJVEVSQUwgcmVsb2MgaXMgc29tZXdoZXJlIGJldHdlZW4gMTZfR09UT0ZGIGFuZCBHUERJU1BfTE8xNi4KLSAgICAgSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi0gICAgIGJ1dCBpdCBnZW5lcmF0ZXMgb3V0cHV0IG5vdCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSAuZ290Ci0gICAgIHNlY3Rpb24sIGJ1dCByZWxhdGl2ZSB0byB0aGUgR1AgdmFsdWUgY2hvc2VuIGZvciB0aGUgZmlsZSBkdXJpbmcgdGhlCi0gICAgIGZpbmFsIGxpbmsgc3RhZ2UuCi0KLSAgICAgVGhlIExJVFVTRSByZWxvYywgb24gdGhlIGluc3RydWN0aW9uIHVzaW5nIHRoZSBsb2FkZWQgYWRkcmVzcywgZ2l2ZXMKLSAgICAgaW5mb3JtYXRpb24gdG8gdGhlIGxpbmtlciB0aGF0IGl0IG1pZ2h0IGJlIGFibGUgdG8gdXNlIHRvIG9wdGltaXplCi0gICAgIGF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotICAgICBhcyB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wpLCBhbmQgdGhlICJhZGRlbmQiIGluZGljYXRlcyB0aGUgdHlwZQotICAgICBvZiBpbnN0cnVjdGlvbiB1c2luZyB0aGUgcmVnaXN0ZXI6Ci0gICAgICAgICAgICAgIDEgLSAibWVtb3J5IiBmbXQgaW5zbgotICAgICAgICAgICAgICAyIC0gYnl0ZS1tYW5pcHVsYXRpb24gKGJ5dGUgb2Zmc2V0IHJlZykKLSAgICAgICAgICAgICAgMyAtIGpzciAodGFyZ2V0IG9mIGJyYW5jaCkKLQotICAgICBUaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1cKLUVOVU1ET0MKLSAgVGhlIEJGRF9SRUxPQ19BTFBIQV9VU0VSXyogcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0bwotICAgICBwcm9jZXNzIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQKLSAgICAgaW50byB0aGUgbm9ybWFsIHJlbG9jYXRpb25zIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfSElOVAotRU5VTURPQwotICBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotICAgICAiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLSAgICAgcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFCi1FTlVNRE9DCi0gIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUgotRU5VTURPQwotICBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfSk1QCi1FTlVNRE9DCi0gIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLSAgICAgc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQUzE2X0pNUAotRU5VTURPQwotICBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTAotRU5VTURPQwotICBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTYKLUVOVU1ET0MKLSAgSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfSEkxNl9TCi1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLSAgICAgZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLSAgICAgYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLSAgICAgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19MTzE2Ci1FTlVNRE9DCi0gIExvdyAxNiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi1FTlVNRE9DCi0gIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfTE8xNgotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfTUlQU19HUFJFTAotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTURPQwotICBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi1FTlVNRE9DCi0gIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMgotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfU1VCCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRQotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQCi1DT01NRU5UCi1FTlVNRE9DCi0gIE1JUFMgRUxGIHJlbG9jYXRpb25zLgotCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UUEMKLUVOVU1ET0MKLSAgaTM4Ni9lbGYgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwKLUVOVU1ET0MKLSAgbnMzMmsgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMgotRU5VTURPQwotICBQaWNvamF2YSByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1BQQ19CMjYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkEyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19UT0MxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQQotRU5VTURPQwotICBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19JMzcwX0QxMgotRU5VTURPQwotICBJQk0gMzcwLzM5MCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19DVE9SCi1FTlVNRE9DCi0gIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlIG1vbWVudAotICBwcm9iYWJseSBhIDMyIGJpdCB3aWRlIGFic29sdXRlIHJlbG9jYXRpb24sIGJ1dCB0aGUgdGFyZ2V0IGNhbiBjaG9vc2UuCi0gIEl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gKLUVOVU1ET0MKLSAgQVJNIDI2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JMWAotRU5VTURPQwotICBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgYml0IG11c3QgYmUgemVybyBhbmQgaXMKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgMm5kIGxvd2VzdCBiaXQgY29tZXMgZnJvbSBhIDEgYml0Ci0gIGZpZWxkIGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JMWAotRU5VTURPQwotICBUaHVtYiAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCBiaXQgbXVzdCBiZSB6ZXJvIGFuZCBpcwotICBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSAybmQgbG93ZXN0IGJpdCBjb21lcyBmcm9tIGEgMSBiaXQKLSAgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9TV0kKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04Ci1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMKLUVOVU1ET0MKLSAgVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0gIChhdCBwcmVzZW50KSB3cml0dGVuIHRvIGFueSBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9VU0VTCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09VTlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9BTElHTgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0NPREUKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9EQVRBCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfTEFCRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9MT09QX1NUQVJUCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfTE9PUF9FTkQKLUVOVU1ET0MKLSAgSGl0YWNoaSBTSCByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkKLUVOVU1YCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMgotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi1FTlVNRE9DCi0gIFRodW1iIDIzLSwgMTItIGFuZCA5LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2hlcy4gIFRoZSBsb3dlc3QgYml0IG11c3QKLSAgYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwKLUVOVU1ET0MKLSAgQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLSAgQVJDIDIyIGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjAgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjYKLSAgdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjYKLUVOVU1ET0MKLSAgQVJDIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlIG5vdAotICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjQgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjMKLSAgdGhyb3VnaCAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MCi1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi0gIFRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHJlbG9jCi0gIGV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi0gIHNoaWZ0ZWQgbGVmdCAxNSBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzYKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMzBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDYtYml0IGFic29sdXRlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNQotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlCi0gIHJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGgKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjQKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBNMzJSIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLSAgdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfTE8xNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KLSAgYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA5LWJpdCByZWxvYwotRU5VTQotICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMjItYml0IHJlbG9jCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4Yml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA3IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLSAgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotQ09NTUVOVAotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotICBiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTZiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotICBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfVElDMzBfTERQCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAotICBzaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgb3Bjb2RlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USUM1NFhfUEFSVExTNwotRU5VTURPQwotICBUaGlzIGlzIGEgN2JpdCByZWxvYyBmb3IgdGhlIHRtczMyMGM1NHgsIHdoZXJlIHRoZSBsZWFzdAotICBzaWduaWZpY2FudCA3IGJpdHMgb2YgYSAxNiBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci0gIHNpZ25pZmljYW50IDcgYml0cyBvZiB0aGUgb3Bjb2RlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USUM1NFhfUEFSVE1TOQotRU5VTURPQwotICBUaGlzIGlzIGEgOWJpdCBEUCByZWxvYyBmb3IgdGhlIHRtczMyMGM1NHgsIHdoZXJlIHRoZSBtb3N0Ci0gIHNpZ25pZmljYW50IDkgYml0cyBvZiBhIDE2IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLSAgc2lnbmlmaWNhbnQgOSBiaXRzIG9mIHRoZSBvcGNvZGUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RJQzU0WF8yMwotRU5VTURPQwotICBUaGlzIGlzIGFuIGV4dGVuZGVkIGFkZHJlc3MgMjMtYml0IHJlbG9jIGZvciB0aGUgdG1zMzIwYzU0eC4KLQotRU5VTQotICBCRkRfUkVMT0NfVElDNTRYXzE2X09GXzIzCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgZm9yIHRoZSB0bXMzMjBjNTR4LCB3aGVyZSB0aGUgbGVhc3QgCi0gIHNpZ25pZmljYW50IDE2IGJpdHMgb2YgYSAyMy1iaXQgZXh0ZW5kZWQgYWRkcmVzcyBhcmUgcGxhY2VkIGludG8gCi0gIHRoZSBvcGNvZGUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RJQzU0WF9NUzdfT0ZfMjMKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIHJlbG9jIGZvciB0aGUgdG1zMzIwYzU0eCwgd2hlcmUgdGhlIG1vc3QKLSAgc2lnbmlmaWNhbnQgNyBiaXRzIG9mIGEgMjMtYml0IGV4dGVuZGVkIGFkZHJlc3MgYXJlIHBsYWNlZCBpbnRvIAotICB0aGUgb3Bjb2RlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzQ4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzIwCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotICB0d28gc2VjdGlvbnMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzZfSU5fNAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDYgYml0IHdvcmQgb2Zmc2V0IGluCi0gIDQgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci0gIGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF85X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQotICBzaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDExIGJpdHMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMgotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1JWQQotRU5VTURPQwotICBNb3Rvcm9sYSBNY29yZSByZWxvY2F0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfQVZSXzdfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCBwYyByZWxhdGl2ZQotICBzaG9ydCBvZmZzZXQgaW50byA3IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfMTNfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyAxMyBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gMTIgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl8xNl9QTQotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDE3IGJpdCB2YWx1ZSAodXN1YWxseQotICBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDE2IGJpdHMuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKHVzdWFsbHkKLSAgZGF0YSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfSEk4X0xESQotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlIChoaWdoIDggYml0Ci0gIG9mIGRhdGEgbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hIOF9MREkKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAobW9zdCBoaWdoIDggYml0Ci0gIG9mIHByb2dyYW0gbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0xPOF9MRElfTkVHCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotICAodXN1YWxseSBkYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBTVUJJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfSEk4X0xESV9ORUcKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0gIChoaWdoIDggYml0IG9mIGRhdGEgbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mCi0gIFNVQkkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJX05FRwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLSAgKG1vc3QgaGlnaCA4IGJpdCBvZiBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZQotICBvZiBMREkgb3IgU1VCSSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE0KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAodXN1YWxseQotICBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAoaGlnaCA4IGJpdAotICBvZiBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE0KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAobW9zdCBoaWdoIDggYml0Ci0gIG9mIGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgTERJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfTE84X0xESV9QTV9ORUcKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0gICh1c3VhbGx5IGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgU1VCSSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE1fTkVHCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotICAoaGlnaCA4IGJpdCBvZiAxNiBiaXQgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZQotICBvZiBTVUJJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTV9ORUcKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0gIChoaWdoIDYgYml0IG9mIDIyIGJpdCBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlCi0gIHZhbHVlIG9mIFNVQkkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9DQUxMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgMjMgYml0IHZhbHVlCi0gIGludG8gMjIgYml0cy4KLQotRU5VTQotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLUVOVU1ET0MKLSAgVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mCi0gIHRoZSBlbnRyaWVzIGluIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgYXJlIGFjdHVhbGx5IHVzZWQuICBXaGVuCi0gIHRoZSAtLWdjLXNlY3Rpb25zIG9wdGlvbiBpcyBnaXZlbiwgdGhlIGxpbmtlciB3aWxsIHplcm8gb3V0IHRoZSBlbnRyaWVzCi0gIHRoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKLSAgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotICBWVEFCTEVfSU5IRVJJVCBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB1c2VkIHRvIGRlc2NyaWJlIHRvIHRoZQotICBsaW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQotICByZWxvY2F0aW9uJ3Mgc3ltYm9sIHNob3VsZCBiZSB0aGUgcGFyZW50IGNsYXNzJyB2dGFibGUsIGFuZCB0aGUKLSAgcmVsb2NhdGlvbiBzaG91bGQgYmUgbG9jYXRlZCBhdCB0aGUgY2hpbGQgdnRhYmxlLgotCi0gIFZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKLSAgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBlbnRyeS4gIFRoZSByZWxvYydzIHN5bWJvbCBzaG91bGQgcmVmZXIgdG8gdGhlCi0gIHRhYmxlIG9mIHRoZSBjbGFzcyBtZW50aW9uZWQgaW4gdGhlIGNvZGUuICBPZmYgb2YgdGhhdCBiYXNlLCBhbiBvZmZzZXQKLSAgZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQKLSAgaXMgc3RvcmVkIGluIHRoZSByZWxvYydzIGFkZGVuZC4gIEZvciBSZWwgaG9zdHMsIHdlIGFyZSBmb3JjZWQgdG8gcHV0Ci0gIHRoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LgotCi1FTlVNCi0gIEJGRF9SRUxPQ19JQTY0X0lNTTE0Ci1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9JTU0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfSU1NNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0RJUjMyTVNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9ESVIzMkxTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfRElSNjRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0RJUjY0TFNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDIyCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9HUFJFTDY0SQotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfR1BSRUwzMk1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfR1BSRUwzMkxTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfR1BSRUw2NE1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfR1BSRUw2NExTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkYyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkY2NEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1BMVE9GRjIyCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9QTFRPRkY2NEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1BMVE9GRjY0TVNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9QTFRPRkY2NExTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfRlBUUjY0SQotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfRlBUUjMyTVNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9GUFRSMzJMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0ZQVFI2NE1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfRlBUUjY0TFNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDIxQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUwyMUJJCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDIxTQotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUwyMUYKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1BDUkVMMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1BDUkVMNjBCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9QQ1JFTDY0SQotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUwzMk1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUwzMkxTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUw2NE1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUENSRUw2NExTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfTFRPRkZfRlBUUjIyCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSNjRJCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9MVE9GRl9GUFRSNjRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX0ZQVFI2NExTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfU0VHQkFTRQotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfU0VHUkVMMzJNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1NFR1JFTDMyTFNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9TRUdSRUw2NE1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfU0VHUkVMNjRMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1NFQ1JFTDMyTVNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9TRUNSRUwzMkxTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfU0VDUkVMNjRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1NFQ1JFTDY0TFNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9SRUwzMk1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfUkVMMzJMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1JFTDY0TVNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9SRUw2NExTQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfTFRWMzJNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0xUVjMyTFNCCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9MVFY2NE1TQgotRU5VTVgKLSAgQkZEX1JFTE9DX0lBNjRfTFRWNjRMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0lQTFRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0lQTFRMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0VQTFRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0VQTFRMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0NPUFkKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1RQUkVMMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1RQUkVMNjRNU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X1RQUkVMNjRMU0IKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0xUT0ZGX1RQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19JQTY0X0xUT0ZGMjJYCi1FTlVNWAotICBCRkRfUkVMT0NfSUE2NF9MRFhNT1YKLUVOVU1ET0MKLSAgSW50ZWwgSUE2NCBSZWxvY2F0aW9ucy4KLUVORFNFTlVNCi0gIEJGRF9SRUxPQ19VTlVTRUQKLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKgotCWJmZF9yZWxvY190eXBlX2xvb2t1cCAoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbgotCWludm9rZWQsIHdpbGwgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbiBAdmFye2NvZGV9IG9uIGRhdGEgZnJvbSB0aGUKLQlhcmNoaXRlY3R1cmUgbm90ZWQuCi0KLSovCi0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgcmVsb2NfdHlwZV9sb29rdXAsIChhYmZkLCBjb2RlKSk7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGJmZF9ob3d0b18zMiA9Ci1IT1dUTyAoMCwgMDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJWUlQzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTsKLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKmJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIGRlZmF1bHQgcmVsb2NhdGlvbiBsb29rdXAgcm91dGluZSBmb3IgYW55IGFyY2hpdGVjdHVyZS4KLQotCi0qLwotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIGluIGEgY3Rvciwgd2hpY2ggd2lsbCBiZSBhcyB3aWRlIGFzIHRoZQotCSBhZGRyZXNzIC0gc28gZWl0aGVyIGEgNjQsIDMyLCBvciAxNiBiaXR0ZXIuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0JewotCWNhc2UgNjQ6Ci0JICBCRkRfRkFJTCAoKTsKLQljYXNlIDMyOgotCSAgcmV0dXJuICZiZmRfaG93dG9fMzI7Ci0JY2FzZSAxNjoKLQkgIEJGRF9GQUlMICgpOwotCWRlZmF1bHQ6Ci0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgc3VwcGxpZWQgcmVsb2NhdGlvbiBjb2RlLgotCVVzZWZ1bCBtYWlubHkgZm9yIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzLgotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmIChjb2RlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbKGludCljb2RlXTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCSAoYmZkICphYmZkLAotCSAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgYm9vbGVhbiAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gcmVsYXhpbmcgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgKmFnYWluID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQkgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gc2VjdGlvbiBnYyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotU1lOT1BTSVMKLQliZmRfYnl0ZSAqCi0JICAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChiZmQgKmFiZmQsCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotCSAgICAgYmZkX2J5dGUgKmRhdGEsCi0JICAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICAgIGFzeW1ib2wgKipzeW1ib2xzKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIG9mIHJlbG9jYXRpb24gZWZmb3J0IGZvciBiYWNrIGVuZHMKLQl3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSAoUFRSKSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlJ3JlIG5vdCByZWxheGluZyB0aGUgc2VjdGlvbiwgc28ganVzdCBjb3B5IHRoZSBzaXplIGluZm8gKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQ7Ci0gICAgICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudCAhPSAoYXJlbGVudCAqKSBOVUxMOwotCSAgIHBhcmVudCsrKQotCXsKLQkgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPQotCSAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICpwYXJlbnQsCi0JCQkJICAgIChQVFIpIGRhdGEsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEwsCi0JCQkJICAgICZlcnJvcl9tZXNzYWdlKTsKLQotCSAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcyAqLwotCSAgICAgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gKnBhcmVudDsKLQkgICAgICBvcy0+cmVsb2NfY291bnQrKzsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MsCi0JCQkgdHJ1ZSkpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOwotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9yZWxvYzE2LmMgYi9iZmQvcmVsb2MxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdjMThhLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYzE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyogOCBhbmQgMTYgYml0IENPRkYgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20gCi0qLwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBjb2ZmLWg4MzAwIGFuZCBjb2ZmLXo4ayB0byBkbwotICAgcmVsb2NhdGlvbi4KLQotICAgRklYTUU6IFRoaXMgY29kZSBzaG91bGQgYmUgcmV3cml0dGVuIHRvIHN1cHBvcnQgdGhlIG5ldyBDT0ZGCi0gICBsaW5rZXIuICBCYXNpY2FsbHksIHRoZXkgbmVlZCB0byBkZWFsIHdpdGggQ09GRiByZWxvY3MgcmF0aGVyIHRoYW4KLSAgIEJGRCBnZW5lcmljIHJlbG9jcy4gIFRoZXkgc2hvdWxkIHN0b3JlIHRoZSByZWxvY3MgaW4gc29tZSBsb2NhdGlvbgotICAgd2hlcmUgY29mZl9saW5rX2lucHV0X2JmZCBjYW4gZmluZCB0aGVtIChhbmQgY29mZl9saW5rX2lucHV0X2JmZAotICAgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdXNlIHRoaXMgbG9jYXRpb24gcmF0aGVyIHRoYW4gcmVyZWFkaW5nIHRoZQotICAgZmlsZSkgKHVubGVzcyBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNob3VsZAotICAgZnJlZSB1cCB0aGUgcmVsb2NzIGFmdGVyIGRlYWxpbmcgd2l0aCB0aGVtKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLWJmZF92bWEKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLSAgLyogQSBzeW1ib2wgaG9sZHMgYSBwb2ludGVyIHRvIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldCBmcm9tIHRoZQotICAgICBiYXNlIG9mIHRoZSBzZWN0aW9uLiAgVG8gcmVsb2NhdGUsIHdlIGZpbmQgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbAotICAgICBsaXZlIGluIHRoZSBvdXRwdXQgYW5kIGFkZCB0aGF0IGluICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCB0aGlzIHN0dWZmIHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24KLQkgYW5kIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlCi0JIHRoZSBnZW5lcmljIHN5bWJvbHMuICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCi0JCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXZhbHVlID0gKGgtPnUuZGVmLnZhbHVlCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JdmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzLAotCQkgIHRydWUpKSkKLQkgICAgYWJvcnQgKCk7Ci0JICB2YWx1ZSA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKwotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICAKLSAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KLSAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKLSAgCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotdm9pZAotYmZkX3BlcmZvcm1fc2xpcChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykgCi0gICAgewotICAgICAgYXN5bWJvbCAqcCA9ICpzOwotICAgICAgaWYgKHAtPnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbikgCi0JewotCSAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLwotCSAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCi0JICAgIHsKLQkgICAgICBwLT52YWx1ZSAtPSBzbGlwOwotCSAgICAgIGlmIChwLT51ZGF0YS5wICE9IE5VTEwpCi0JCXsKLQkJICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOwotCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCQkgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkJICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcysrOwotICAgIH0gICAgCi19Ci0KLWJvb2xlYW4gCi1iZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmk7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7Ci0gIGludCAqc2hyaW5rczsKLSAgaW50IHNocmluayA9IDA7Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIC8qIFdlIG9ubHkgZG8gZ2xvYmFsIHJlbGF4YXRpb24gb25jZS4gIEl0IGlzIG5vdCBzYWZlIHRvIGRvIGl0IG11bHRpcGxlCi0gICAgIHRpbWVzIChzZWUgZGlzY3Vzc2lvbiBvZiB0aGUgInNocmlua3MiIGFycmF5IGJlbG93KS4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jX3ZlY3RvciAmJiByZWxvY19zaXplID4gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgcmVsb2NfY291bnQgPQotICAgIGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAotCQkJICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgcmVsb2MxNi5jIGFuZCByZWxhdGVkIHJlbGF4aW5nIGNvZGUgaXMgdmVyeSBzaW1wbGUsIHRoZSBwcmljZQotICAgICBmb3IgdGhhdCBzaW1wbGljaXR5IGlzIHdlIGNhbiBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIGZvcgotICAgICBlYWNoIHNlY3Rpb24uCi0KLSAgICAgU28sIHRvIGdldCB0aGUgYmVzdCByZXN1bHRzIHdpdGhpbiB0aGF0IGxpbWl0YXRpb24sIHdlIGRvIG11bHRpcGxlCi0gICAgIHJlbGF4aW5nIHBhc3NlcyBvdmVyIGVhY2ggc2VjdGlvbiBoZXJlLiAgVGhhdCBpbnZvbHZlcyBrZWVwaW5nIHRyYWNrCi0gICAgIG9mIHRoZSAic2hyaW5rIiBhdCBlYWNoIHJlbG9jIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgICAgYWNjdXJhdGVseSBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHR3byByZWxvY3Mgd2l0aGluCi0gICAgIHRoaXMgc2VjdGlvbi4KLQotICAgICBJbiB0aGVvcnksIGlmIHdlIGtlcHQgdGhlICJzaHJpbmtzIiBhcnJheSBmb3IgZWFjaCBzZWN0aW9uIGZvciB0aGUKLSAgICAgZW50aXJlIGxpbmssIHdlIGNvdWxkIHVzZSB0aGUgZ2VuZXJpYyByZWxheGluZyBjb2RlIGluIHRoZSBsaW5rZXIKLSAgICAgYW5kIGdldCBiZXR0ZXIgcmVzdWx0cywgcGFydGljdWxhcmx5IGZvciBqc3ItPmJzciBhbmQgMjQtPjE2IGJpdAotICAgICBtZW1vcnkgcmVmZXJlbmNlIHJlbGF4YXRpb25zLiAgKi8KLSAgICAgCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgaW50IGFub3RoZXJfcGFzcyA9IDA7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzaHJpbmtzIGFycmF5IGZvciB0aGlzIHNlY3Rpb24uCi0gICAgICAgICBUaGUgbGFzdCBlbGVtZW50IGlzIHVzZWQgYXMgYW4gYWNjdW1sYXRvciBvZiBzaHJpbmtzLiAgKi8KLSAgICAgIHNocmlua3MgPSAoaW50ICopIGJmZF9tYWxsb2MgKChyZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChpbnQpKTsKLSAgICAgIG1lbXNldCAoc2hyaW5rcywgMCwgKHJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGludCkpOwotCi0gICAgICAvKiBMb29wIHVudGlsIG5vdGhpbmcgY2hhbmdlcyBpbiB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZG8gewotCWFyZWxlbnQgKipwYXJlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JbG9uZyBqOwotCi0JYW5vdGhlcl9wYXNzID0gMDsKLQotCWZvciAoaSA9IDAsIHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyssIGkrKykgCi0JICB7Ci0JICAgIC8qIExldCB0aGUgdGFyZ2V0L21hY2hpbmUgZGVwZW5kZW50IGNvZGUgZXhhbWluZSBlYWNoIHJlbG9jCi0JICAgICAgIGluIHRoaXMgc2VjdGlvbiBhbmQgYXR0ZW1wdCB0byBzaHJpbmsgaXQuICAqLwotCSAgICBzaHJpbmsgPSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCAqcGFyZW50LAotCQkJCQkJc2hyaW5rc1tpXSwgbGlua19pbmZvKTsKLQotCSAgICAvKiBJZiBpdCBzaHJ1bmssIG5vdGUgaXQgaW4gdGhlIHNocmlua3MgYXJyYXkgYW5kIHNldCB1cCBmb3IKLQkgICAgICAgYW5vdGhlciBwYXNzLiAgKi8KLQkgICAgaWYgKHNocmluayAhPSBzaHJpbmtzW2ldKQotCSAgICAgIHsKLQkgICAgICAgIGFub3RoZXJfcGFzcyA9IDE7Ci0JCWZvciAoaiA9IGkgKyAxOyBqIDw9IHJlbG9jX2NvdW50OyBqKyspCi0JCSAgc2hyaW5rc1tqXSArPSBzaHJpbmsgLSBzaHJpbmtzW2ldOwotCSAgICAgIH0KLQkgIH0KLSAgCi0gICAgICB9IHdoaWxlIChhbm90aGVyX3Bhc3MpOwotCi0gICAgICBzaHJpbmsgPSBzaHJpbmtzW3JlbG9jX2NvdW50XTsKLSAgICAgIGZyZWUoKGNoYXIgKilzaHJpbmtzKTsKLSAgICB9Ci0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIC09IHNocmluazsgIAotICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZF9ieXRlICoKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKGluX2FiZmQsCi0JCQkJCQlsaW5rX2luZm8sCi0JCQkJCQlsaW5rX29yZGVyLAotCQkJCQkJZGF0YSwKLQkJCQkJCXJlbG9jYXRlYWJsZSwKLQkJCQkJCXN5bWJvbHMpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChpbl9hYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jX3ZlY3RvciAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50ID0gcmVsb2NfdmVjdG9yOwotICAgICAgYXJlbGVudCAqcmVsb2MgOwotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICAKLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKSAKLQl7Ci0JICByZWxvYyA9ICpwYXJlbnQ7Ci0JICBpZiAocmVsb2MpIAotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgcnVuID0gcmVsb2MtPmFkZHJlc3MgLSBzcmNfYWRkcmVzczsKLQkgICAgICBwYXJlbnQrKzsKLQkgICAgfQotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0gICAgCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLSAgICAKLQkgIGlmIChyZWxvYykgCi0JICAgIHsKLQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIHJlbG9jLCBkYXRhLCAmc3JjX2FkZHJlc3MsCi0JCQkJCSAgICAmZHN0X2FkZHJlc3MpOwotCSAgICB9ICAgIAotCX0KLSAgICB9Ci0gIGZyZWUoKGNoYXIgKilyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL3Jpc2NpeC5jIGIvYmZkL3Jpc2NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ViMThjLi4wMDAwMDAwCi0tLSBhL2JmZC9yaXNjaXguYworKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFJJU0MgaVggKEFjb3JuLCBhcm0pIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBSSVNDIGlYIG92ZXJsb2FkcyB0aGUgTUFHSUMgZmllbGQgdG8gaW5kaWNhdGUgbW9yZSB0aGFuIGp1c3QgdGhlIHVzdWFsCi0gICBbWk5PXU1BR0lDIHZhbHVlcy4gIEFsc28gaW5jbHVkZWQgYXJlIHNxdWVlemluZyBpbmZvcm1hdGlvbiBhbmQKLSAgIHNoYXJlZCBsaWJyYXJ5IHVzYWdlLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBjb21lIGZyb20gdGhlIG1hbiBwYWdlLiAgKi8KLSNkZWZpbmUgU0hMSUJMRU4gNjAKLQotI2RlZmluZSBNRl9JTVBVUkUgICAgICAgMDAyMDAKLSNkZWZpbmUgTUZfU1FVRUVaRUQgICAgIDAxMDAwCi0jZGVmaW5lIE1GX1VTRVNfU0wgICAgICAwMjAwMAotI2RlZmluZSBNRl9JU19TTCAgICAgICAgMDQwMDAKLQotLyogQ29tbW9uIGNvbWJpbmF0aW9ucy4gICovCi0jZGVmaW5lIElNQUdJQyAgICAgICAgICAoTUZfSU1QVVJFfFpNQUdJQykgICAgICAvKiBEZW1hbmQgbG9hZCAoaW1wdXJlIHRleHQpICovCi0jZGVmaW5lIFNQT01BR0lDICAgICAgICAoTUZfVVNFU19TTHxPTUFHSUMpICAgICAvKiBPTUFHSUMgd2l0aCBsYXJnZSBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBtYXkgY29udGFpbiBhIHJlZiB0byBhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcmVkIGxpYiByZXF1aXJlZCBieSB0aGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYmplY3QuICovCi0jZGVmaW5lIFNMT01BR0lDICAgICAgICAoTUZfSVNfU0x8T01BR0lDKSAvKiBBIHJlZmVyZW5jZSB0byBhIHNoYXJlZCBsaWJyYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRhaW5zICJvdmVyZmxvdyB0ZXh0IiBmcm9tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gYmUgbGlua2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB3aXRoIGFuIG9iamVjdCAqLwotI2RlZmluZSBRTUFHSUMgICAgICAgICAgKE1GX1NRVUVFWkVEfFpNQUdJQykgICAgLyogU3FlZXplZCBkZW1hbmQgcGFnZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBUaGlzIGludGVycHJldGF0aW9uIG9mICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUFHSUMgc2VlbXMgdG8gYmUgYXQgdmFyaWFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpdGggdGhhdCB1c2VkIG9uIG90aGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcmNoaXRlY3R1cmVzLiAqLwotI2RlZmluZSBTUFpNQUdJQyAgICAgICAgKE1GX1VTRVNfU0x8Wk1BR0lDKSAgICAgLyogcHJvZ3JhbSB3aGljaCB1c2VzIHNsICovCi0jZGVmaW5lIFNQUU1BR0lDICAgICAgICAoTUZfVVNFU19TTHxRTUFHSUMpICAgICAvKiBzcWVlemVkIGRpdHRvICovCi0jZGVmaW5lIFNMWk1BR0lDICAgICAgICAoTUZfSVNfU0x8Wk1BR0lDKSAgICAgICAvKiBzaGFyZWQgbGliIHBhcnQgb2YgcHJvZyAqLwotI2RlZmluZSBTTFBaTUFHSUMgICAgICAgKE1GX1VTRVNfU0x8U0xaTUFHSUMpICAgLyogc2wgd2hpY2ggdXNlcyBhbm90aGVyICovCi0KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpICgoeCkuYV9pbmZvICYgTUZfVVNFU19TTCkKLQotLyogT25seSBhIHB1cmUgT01BR0lDIGZpbGUgaGFzIHRoZSBtaW5pbWFsIGhlYWRlciAqLwotI2RlZmluZSBOX1RYVE9GRih4KSAgICAgICAgICAgICAgICAgICAgIFwKLSAoKHgpLmFfaW5mbyA9PSBPTUFHSUMgPyAzMiAgICAgICAgICAgICBcCi0gIDogKE5fTUFHSUMoeCkgPT0gWk1BR0lDKSA/IFRBUkdFVF9QQUdFX1NJWkUgIFwKLSAgOiA5OTkpCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAwIC8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqLyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAvKiBQcm9ncmFtcyB3aXRoIHNoYXJlZCBsaWJzIGFyZSBsb2FkZWQgYXQgdGhlIGZpcnN0IHBhZ2UgYWZ0ZXIgYWxsIHRoZSAgIFwKLSAgICAgIHRleHQgc2VnbWVudHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHByb2dyYW1zLiAgV2l0aG91dCBsb29raW5nIHRoaXMgICAgXAotICAgICAgdXAgd2UgY2FuJ3Qga25vdyBleGFjdGx5IHdoYXQgdGhlIGFkZHJlc3Mgd2lsbCBiZS4gIEEgcmVhc29uYWJsZSBndWVzcyBcCi0gICAgICBpcyB0aGF0IGFfZW50cnkgd2lsbCBiZSBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZXhlY3V0YWJsZS4gICovICAgICAgIFwKLSAgIDogTl9TSEFSRURfTElCKHgpID8gKCh4KS5hX2VudHJ5ICYgfihUQVJHRVRfUEFHRV9TSVpFIC0gMSkpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogVEVYVF9TVEFSVF9BRERSKQotCi0jZGVmaW5lIE5fU1lNT0ZGKHgpIFwKLSAgKE5fVFhUT0ZGICh4KSArICh4KS5hX3RleHQgKyAoeCkuYV9kYXRhICsgKHgpLmFfdHJzaXplICsgKHgpLmFfZHJzaXplKQotCi0jZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRiAoeCkgKyAoeCkuYV9zeW1zKQotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAzMjc2OAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDMyNzY4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9hcm0KLQotI2RlZmluZSBNWShPUCkgQ0FUKHJpc2NpeF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXJpc2NpeCIKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCkJCQkJCSAgIFwKLSAgewkJCQkJCQkJCSAgIFwKLSAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCQkgICBcCi0gICAgZmlsZV9wdHIgdGV4dF9lbmQ7CQkJCQkJCSAgIFwKLSAgICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCQkgICBcCi0gICAgICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICBcCi0gICAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICBcCi0JCSAgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJCSAgIFwKLSAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CQkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICBcCi0gICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJCSAgIFwKLQkhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgXAotICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgIFwKLQkJCQkJCQkJCSAgIFwKLSAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAkJCSAgIFwKLQkmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQkJCQkgICBcCi0gICAgICB7CQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKCEgcmlzY2l4X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQkgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotICAgICAgfQkJCQkJCQkJCSAgIFwKLSAgfQotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjZfZG9uZSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQkgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjYgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkgICAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJpc2NpeF9zdGRfcmVsb2NfaG93dG9bXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyggMCwgICAgICAgICAgICAgIDAsICAwLCAgIDgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEsICAgICAgICAgICAgICAwLCAgMSwgICAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyggMiwgICAgICAgICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAzLCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHJpc2NpeF9maXhfcGNyZWxfMjYgLCAiQVJNMjYiLCAgICAgIHRydWUsIDB4MDBmZmZmZmYsMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyggNCwgICAgICAgICAgICAgIDAsICAwLCAgIDgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLCAgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8oIDUsICAgICAgICAgICAgICAwLCAgMSwgICAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsICAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA2LCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyggNywgICAgICAgICAgICAgIDIsICAzLCAgIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lLCAiQVJNMjZEIix0cnVlLDB4MDBmZmZmZmYsMHgwMGZmZmZmZiwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyggOSwgICAgICAgICAgICAgIDAsIC0xLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiTkVHMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAxMCwgICAgICAgICAgICAgIDAsIC0yLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiTkVHMzIiLCAgICAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLSNkZWZpbmUgUklTQ0lYX1RBQkxFX1NJWkUgXAotICAoc2l6ZW9mIChyaXNjaXhfc3RkX3JlbG9jX2hvd3RvKSAvIHNpemVvZiAocmVsb2NfaG93dG9fdHlwZSkpCi0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2NfY29udGludWUgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmVsb2NhdGlvbiA9ICh0YXJnZXQgJiAweDAwZmZmZmZmKSA8PCAyOwotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiAweDAyMDAwMDAwKSAtIDB4MDIwMDAwMDA7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0gIGlmIChyZWxvY2F0aW9uICYgMykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIDB4MDIwMDAwMDApCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikgIT0gfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH4weDAzZmZmZmZmKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH4weDAwZmZmZmZmOwotICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMikgJiAweDAwZmZmZmZmOwotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJnJpc2NpeF9zdGRfcmVsb2NfaG93dG9bN107Ci0gIAotICByZXR1cm4gZmxhZzsKLX0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1ERUZVTihyaXNjaXhfcmVsb2NfdHlwZV9sb29rdXAsKGFiZmQsY29kZSksCi0gICAgICBiZmQgKmFiZmQgQU5ECi0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZyaXNjaXhfc3RkX3JlbG9jX2hvd3RvW2pdCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAxKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMiwgMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgMyk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgNCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsIDUpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCA2KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfZmluYWxfbGlua19jYWxsYmFjayBzaG91bGRfbm90X2JlX3VzZWQKLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmlzY2l4X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyByaXNjaXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX29iamVjdF9wIHJpc2NpeF9vYmplY3RfcAotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqcmlzY2l4X2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXZvaWQKLXJpc2NpeF9zd2FwX3N0ZF9yZWxvY19vdXQgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLSAgaW50IHJfZXh0ZXJuOwotICBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9uZWcgPSAwOwkvKiBOZWdhdGl2ZSByZWxvY3MgdXNlIHRoZSBCQVNFUkVMIGJpdC4gICovCi0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOyAgIC8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgaWYgKHJfbGVuZ3RoIDwgMCkKLSAgICB7Ci0gICAgICByX2xlbmd0aCA9IC1yX2xlbmd0aDsKLSAgICAgIHJfbmVnID0gMTsKLSAgICB9Ci0KLSAgcl9wY3JlbCAgPSAoaW50KSBnLT5ob3d0by0+cGNfcmVsYXRpdmU7IC8qIFJlbGF0aXZlIHRvIFBDPyAqLwotCi0gIC8qIEZvciBSSVNDIGlYLCBpbiBwYy1yZWxhdGl2ZSByZWxvY3MgdGhlIHJfcGNyZWwgYml0IG1lYW5zIHRoYXQgdGhlCi0gICAgIHJlbG9jYXRpb24gaGFzIGJlZW4gZG9uZSBhbHJlYWR5IChPbmx5IGZvciB0aGUgMjYtYml0IG9uZSBJIHRoaW5rKT8/PyEhIQotICAgICAqLwotICAKLSAgaWYgKHJfbGVuZ3RoID09IDMpCi0gICAgcl9wY3JlbCA9IHJfcGNyZWwgPyAwIDogMTsKLSAgCi0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc6IDApCi0JIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCi0JIHwgKHJfbmVnICAgID8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0JIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JIHwgKHJfbmVnICAgID8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRTogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0KLWJvb2xlYW4KLXJpc2NpeF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXJlbGVudCAqKmdlbmVyaWM7Ci0gIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLSAgCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGZvciAobmF0cHRyID0gbmF0aXZlOwotICAgICAgIGNvdW50ICE9IDA7Ci0gICAgICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotICAgIHJpc2NpeF9zd2FwX3N0ZF9yZWxvY19vdXQgKGFiZmQsICpnZW5lcmljLAotCQkJICAgICAgIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIG5hdHB0cik7Ci0KLSAgaWYgKCBiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZShhYmZkLCBuYXRpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBhb3V0eC5oIHZlcnNpb24gYnV0IHdlIG5lZWQgdG8gZG8gb3VyCi0gKiBvd24gbWFwcGluZyBvZiBleHRlcm5hbCByZWxvYyB0eXBlIHZhbHVlcyB0byBob3d0byBlbnRyaWVzLgotICovCi1sb25nCi1NWShjYW5vbmljYWxpemVfcmVsb2MpKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgIGJmZCAqYWJmZDsKLSAgICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50LCBjOwotICBleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKVtdOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSByZWFkIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLCByZXR1cm4gdGhlIHZhbHVlcy4gKi8KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7Ci0gICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKSB7Ci0gICAgICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLSAgICAgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0gICAgfQotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotICBpZiAodGJscHRyICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50KSB7Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLQotICBpZiAoIU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0gICAgcmV0dXJuIC0xOwotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gIC8qIGZpeCB1cCBob3d0byBlbnRyaWVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgIHsKLSAgICAgIGMgPSB0YmxwdHItPmhvd3RvIC0gTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSk7Ci0gICAgICBCRkRfQVNTRVJUIChjIDwgUklTQ0lYX1RBQkxFX1NJWkUpOwotICAgICAgdGJscHRyLT5ob3d0byA9ICZyaXNjaXhfc3RkX3JlbG9jX2hvd3RvW2NdOwotCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHNhbWUgYXMgTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCksIGJ1dCBoYXMgZGlmZmVyZW50IAotICAgZXhwYW5zaW9ucyBvZiB0aGUgbWFjcm8gZGVmaW5pdGlvbnMuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsIGV4ZWNwLCBjYWxsYmFja190b19yZWFsX29iamVjdF9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotewotICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyLCAqb2xkcmF3cHRyOwotICBjb25zdCBiZmRfdGFyZ2V0ICpyZXN1bHQ7Ci0KLSAgcmF3cHRyID0gKChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKikgCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSkpOwotCi0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBvbGRyYXdwdHIgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLQotICAvKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgb2xkIHRkYXRhIHN0cnVjdC4KLSAgICAgSW4gcGFydGljdWxhciwgd2Ugd2FudCB0aGUgc3ViZm9ybWF0LCBzaW5jZSBmb3IgaHB1eCBpdCB3YXMgc2V0IGluCi0gICAgIGhwMzAwaHB1eC5jOnN3YXBfZXhlY19oZWFkZXJfaW4gYW5kIHdpbGwgYmUgdXNlZCBpbgotICAgICBocDMwMGhwdXguYzpjYWxsYmFjay4gICovCi0gIGlmIChvbGRyYXdwdHIgIT0gTlVMTCkKLSAgICAqYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gKm9sZHJhd3B0cjsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyID0gJnJhd3B0ci0+ZTsKLSAgKihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyKSA9ICpleGVjcDsgICAgIC8qIENvcHkgaW4gdGhlIGludGVybmFsX2V4ZWMKLQkJCQkJCSAgIHN0cnVjdCAqLwotICBleGVjcCA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHI7Ci0KLSAgLyogU2V0IHRoZSBmaWxlIGZsYWdzICovCi0gIGFiZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBpZiAoZXhlY3AtPmFfZHJzaXplIHx8IGV4ZWNwLT5hX3Ryc2l6ZSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIC8qIFNldHRpbmcgb2YgRVhFQ19QIGhhcyBiZWVuIGRlZmVycmVkIHRvIHRoZSBib3R0b20gb2YgdGhpcyBmdW5jdGlvbiAqLwotICBpZiAoZXhlY3AtPmFfc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICBpZiAoTl9EWU5BTUlDKCpleGVjcCkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotCQkJCQkJCQkgIAotICBpZiAoKGV4ZWNwLT5hX2luZm8gJiBNRl9TUVVFRVpFRCkgIT0gMCkgLyogU3F1ZWV6ZWQgZmlsZXMgYXJlbid0IHN1cHBvcnRlZCAKLQkJCQkJICAgICAoeWV0KSEgKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKGV4ZWNwLT5hX2luZm8gJiBNRl9JU19TTCkgIT0gMCkJLyogTm9yIGFyZSBzaGFyZWQgbGlicmFyaWVzICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gWk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gTk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBPTUFHSUMpCi0gICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gb19tYWdpYzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNob3VsZCBoYXZlIGJlZW4gY2hlY2tlZCB3aXRoIE5fQkFETUFHIGJlZm9yZSB0aGlzIHJvdXRpbmUKLSAgICAgICAgIHdhcyBjYWxsZWQuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBleGVjcC0+YV9lbnRyeTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IChhb3V0X3N5bWJvbF90eXBlICopTlVMTDsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFY3IFVuaXguICAqLwotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICAvKiBUaGUgZGVmYXVsdCBzeW1ib2wgZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFVuaXguICovCi0gIG9ial9zeW1ib2xfZW50cnlfc2l6ZSAoYWJmZCkgPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IE5VTEw7Ci0KLSAgaWYgKCEgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2RhdGE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9ic3M7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX3Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfZHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQzsKLQotICByZXN1bHQgPSAoKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKGFiZmQpOwotCi0jaWYgZGVmaW5lZChNQUNIKSB8fCBkZWZpbmVkKFNUQVRfRk9SX0VYRUMpCi0gIC8qIFRoZSBvcmlnaW5hbCBoZXVyaXN0aWMgZG9lc24ndCB3b3JrIGluIHNvbWUgaW1wb3J0YW50IGNhc2VzLiBUaGUKLSAgICogYS5vdXQgZmlsZSBoYXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRleHQgc3RhcnQgYWRkcmVzcy4gRm9yCi0gICAqIGZpbGVzIChsaWtlIGtlcm5lbHMpIGxpbmtlZCB0byBub24tc3RhbmRhcmQgYWRkcmVzc2VzIChsZCAtVHRleHQKLSAgICogbm5uKSB0aGUgZW50cnkgcG9pbnQgbWF5IG5vdCBiZSBiZXR3ZWVuIHRoZSBkZWZhdWx0IHRleHQgc3RhcnQKLSAgICogKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpIGFuZCAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgKyB0ZXh0IHNpemUKLSAgICogVGhpcyBpcyBub3QganVzdCBhIG1hY2ggaXNzdWUuIE1hbnkga2VybmVscyBhcmUgbG9hZGVkIGF0IG5vbgotICAgKiBzdGFuZGFyZCBhZGRyZXNzZXMuCi0gICAqLwotICB7Ci0gICAgc3RydWN0IHN0YXQgc3RhdF9idWY7Ci0gICAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwKLQkmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwCi0gICAgICAgICYmIChmc3RhdChmaWxlbm8oKEZJTEUgKikgKGFiZmQtPmlvc3RyZWFtKSksICZzdGF0X2J1ZikgPT0gMCkKLSAgICAgICAgJiYgKChzdGF0X2J1Zi5zdF9tb2RlICYgMDExMSkgIT0gMCkpCi0gICAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIH0KLSNlbHNlIC8qICEgTUFDSCAqLwotICAvKiBOb3cgdGhhdCB0aGUgc2VnbWVudCBhZGRyZXNzZXMgaGF2ZSBiZWVuIHdvcmtlZCBvdXQsIHRha2UgYSBiZXR0ZXIKLSAgICAgZ3Vlc3MgYXQgd2hldGhlciB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLiAgSWYgdGhlIGVudHJ5IHBvaW50Ci0gICAgIGlzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhc3N1bWUgaXQgaXMuICAoVGhpcyBtYWtlcyBmaWxlcwotICAgICBleGVjdXRhYmxlIGV2ZW4gaWYgdGhlaXIgZW50cnkgcG9pbnQgYWRkcmVzcyBpcyAwLCBhcyBsb25nIGFzCi0gICAgIHRoZWlyIHRleHQgc3RhcnRzIGF0IHplcm8uKQotCi0gICAgIEF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIHByb2JhYmx5IGJyZWFrIGRvd24gYW5kIHN0YXQgdGhlIGZpbGUgYW5kCi0gICAgIGRlY2xhcmUgaXQgZXhlY3V0YWJsZSBpZiAob25lIG9mKSBpdHMgJ3gnIGJpdHMgYXJlIG9uLi4uICAqLwotICBpZiAoKGV4ZWNwLT5hX2VudHJ5ID49IG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICYmCi0gICAgICAoZXhlY3AtPmFfZW50cnkgPCBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotI2VuZGlmIC8qIE1BQ0ggKi8KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnJlZSAocmF3cHRyKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IG9sZHJhd3B0cjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkob2JqZWN0X3ApIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7ICAgICAgLyogUmF3IGV4ZWMgaGVhZGVyIGZyb20gZmlsZSAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBleGVjOyAgICAgICAgICAgIC8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICBpZiAoTl9CQURNQUcgKGV4ZWMpKSByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotICB0YXJnZXQgPSByaXNjaXhfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCAmZXhlYywgTVkoY2FsbGJhY2spKTsKLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3JzNjAwMC1jb3JlLmMgYi9iZmQvcnM2MDAwLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlNzQ0MS4uMDAwMDAwMAotLS0gYS9iZmQvcnM2MDAwLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKiBJQk0gUlMvNjAwMCAiWENPRkYiIGJhY2stZW5kIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1LCAKLSAgICAgYW5kIEpvaG4gR2lsbW9yZS4KLSAgIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgotICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uIGFuZCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBvcnQgY3VycmVudGx5IG9ubHkgaGFuZGxlcyByZWFkaW5nIG9iamVjdCBmaWxlcywgZXhjZXB0IHdoZW4KLSAgIGNvbXBpbGVkIG9uIGFuIFJTLzYwMDAgaG9zdC4gIC0tIG5vIGFyY2hpdmUgc3VwcG9ydCwgbm8gY29yZSBmaWxlcy4KLSAgIEluIGFsbCBjYXNlcywgaXQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nLgotCi0gICBGSVhNRW1nbyBjb21tZW50cyBhcmUgbGVmdCBmcm9tIE1ldGluIE96aXNpaydzIG9yaWdpbmFsIHBvcnQuCi0KLSAgIFRoaXMgaXMgaW4gYSBzZXBhcmF0ZSBmaWxlIGZyb20gY29mZi1yczYwMDAuYywgYmVjYXVzZSBpdCBpbmNsdWRlcwotICAgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdCB3aXRoIGNvZmYvcnM2MDAwLmguCi0gICovCi0KLS8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLS8qIFRoZSBBSVggNC4xIGtlcm5lbCBpcyBvYnZpb3VzbHkgY29tcGlsZWQgd2l0aCAtRF9MT05HX0xPTkcsIHNvCi0gICB3ZSBoYXZlIHRvIGRlZmluZSBfTE9OR19MT05HIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MgdG8gZ2V0IHRoZQotICAgcHJvcGVyIGFsaWdubWVudHMgaW4gdGhlIHVzZXIgc3RydWN0dXJlLiAgKi8KLSNpZiBkZWZpbmVkKF9BSVg0MSkgJiYgIWRlZmluZWQoX0xPTkdfTE9ORykKLSNkZWZpbmUgX0xPTkdfTE9ORwotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIEFJWF9DT1JFCi0KLS8qIEFPVVRIRFIgaXMgZGVmaW5lZCBieSB0aGUgYWJvdmUuICBXZSBuZWVkIGFub3RoZXIgZGVmbiBvZiBpdCwgZnJvbSB0aGUKLSAgIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgUHVudCB0aGUgb2xkIG9uZSBhbmQgZ2V0IHVzIGEgbmV3IG5hbWUgZm9yIHRoZQotICAgdHlwZWRlZiBpbiB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAqLwotI2lmZGVmIEFPVVRIRFIKLSN1bmRlZiBBT1VUSERSCi0jZW5kaWYKLSNkZWZpbmUJQU9VVEhEUglzZWNvbmRfQU9VVEhEUgotCi0jdW5kZWYJU0NOSERSCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKglTdXBwb3J0IGZvciBjb3JlIGZpbGUgc3R1ZmYuLiAJCQkJCSAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPHN5cy9sZHIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0KLS8qIE51bWJlciBvZiBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzIHN1cHBvcnRlZCBieSBnZGIuICBUaGlzIHZhbHVlCi0gICBzaG91bGQgbWF0Y2ggYHRtLmgnIGluIGdkYiBkaXJlY3RvcnkuICBDbGVhbiB0aGlzIG1lc3MgdXAgYW5kIHVzZQotICAgdGhlIG1hY3JvcyBpbiBzeXMvcmVnLmguICBGSVhNRW1nby4gKi8KLQotI2RlZmluZQlOVU1fT0ZfU1BFQ19SRUdTICA3Ci0KLSNkZWZpbmUJY29yZV9oZHIoYmZkKQkJKCgoUnM2a0NvckRhdGEqKShiZmQtPnRkYXRhLmFueSkpLT5oZHIpCi0KLS8qIEFJWCA0LjEgQ2hhbmdlZCB0aGUgbmFtZXMgYW5kIGxvY2F0aW9ucyBvZiBhIGZldyBpdGVtcyBpbiB0aGUgY29yZSBmaWxlLAotICAgdGhpcyBzZWVtcyB0byBiZSB0aGUgcXVpY2tlc3QvZWFzaWVzdCB3YXkgdG8gZGVhbCB3aXRoIGl0LiAKLQotICAgTm90ZSBob3dldmVyIHRoYXQgZW5jb2RpbmcgbWFnaWMgYWRkcmVzc2VzIChTVEFDS19FTkRfQUREUikgaXMgZ29pbmcKLSAgIHRvIGJlIF92ZXJ5XyBmcmFnaWxlLiAgQnV0IEkgZG9uJ3Qgc2VlIGFueSBlYXN5IHdheSB0byBnZXQgdGhhdCBpbmZvCi0gICByaWdodCBub3cuCi0gICAKLSAgIEFJWCA0LjMgZGVmaW5lcyBhbiBlbnRpcmVseSBuZXcgc3RydWN0dXJlIChjb3JlX2R1bXB4KS4gIFlldCB0aGUKLSAgIGJhc2ljIGxvZ2ljIHN0YXlzIHRoZSBzYW1lIGFuZCB3ZSBjYW4gc3RpbGwgdXNlIG91ciBtYWNybwotICAgcmVkZWZpbml0aW9uIG1lY2hhbmlzbSB0byBlZmZlY3QgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzLiAgKi8KLQotI2lmZGVmIEFJWF9DT1JFX0RVTVBYX0NPUkUKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY19kYXRhb3JnCi0jZGVmaW5lIENPUkVfQ09NTV9GSUVMRCBjX3UuVV9wcm9jLnBpX2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX2ZsdC5oY3R4LnIzMgotI2RlZmluZSBTVEFDS19FTkRfQUREUiBjb3JlZGF0YS5jX3N0YWNrb3JnICsgY29yZWRhdGEuY19zaXplCi0jZGVmaW5lIExPQURFUl9PRkZTRVRfRklFTEQgY19sb2FkZXIKLSNkZWZpbmUgTE9BREVSX1JFR0lPTl9TSVpFIGNvcmVkYXRhLmNfbHNpemUKLSNkZWZpbmUgQ09SRV9EVU1QIGNvcmVfZHVtcHgKLSNlbHNlCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY191LlVfZHNpemUKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS5VX2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX21zdAotI2RlZmluZQlTVEFDS19FTkRfQUREUiAweDJmZjIzMDAwCi0jZGVmaW5lIExPQURFUl9PRkZTRVRfRklFTEQgY190YWIKLSNkZWZpbmUgTE9BREVSX1JFR0lPTl9TSVpFIDB4N2ZmZmZmZgotI2RlZmluZSBDT1JFX0RVTVAgY29yZV9kdW1wCi0jZWxzZQotI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX3UudV9kc2l6ZQotI2RlZmluZSBDT1JFX0NPTU1fRklFTEQgY191LnVfY29tbQotI2RlZmluZSBTQVZFX0ZJRUxEIGNfdS51X3NhdmUKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIgMHgyZmY4MDAwMAotI2RlZmluZSBMT0FERVJfT0ZGU0VUX0ZJRUxEIGNfdGFiCi0jZGVmaW5lIExPQURFUl9SRUdJT05fU0laRSAweDdmZmZmZmYKLSNkZWZpbmUgQ09SRV9EVU1QIGNvcmVfZHVtcAotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IENPUkVfRFVNUCBoZHI7CQkvKiBjb3JlIGZpbGUgaGVhZGVyICovCi19IFJzNmtDb3JEYXRhOwotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLAotCQkJCQkgICAgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA4OwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotLyogRGVjaWRlIGlmIGEgZ2l2ZW4gYmZkIHJlcHJlc2VudHMgYSBgY29yZScgZmlsZSBvciBub3QuIFRoZXJlIHJlYWxseSBpcyBubwotICAgbWFnaWMgbnVtYmVyIG9yIGFueXRoaW5nIGxpa2UsIGluIHJzNjAwMGNvZmYuICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotcnM2MDAwY29mZl9jb3JlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IENPUkVfRFVNUCBjb3JlZGF0YTsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYmZkX3NpemVfdHlwZSBucmVhZDsKLSAgY2hhciAqdG1wcHRyOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbnJlYWQgPSBiZmRfcmVhZCAoJmNvcmVkYXRhLCAxLCBzaXplb2YgKHN0cnVjdCBDT1JFX0RVTVApLCBhYmZkKTsKLSAgaWYgKG5yZWFkICE9IHNpemVvZiAoc3RydWN0IENPUkVfRFVNUCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBjb3JlIGZpbGUgdWxpbWl0IGlzIHRvbyBzbWFsbCwgdGhlIHN5c3RlbSB3aWxsIGZpcnN0Ci0gICAgIG9taXQgdGhlIGRhdGEgc2VnbWVudCwgdGhlbiBvbWl0IHRoZSBzdGFjaywgdGhlbiBkZWNsaW5lIHRvCi0gICAgIGR1bXAgY29yZSBhbHRvZ2V0aGVyIChhcyBmYXIgYXMgSSBrbm93IFVCTE9DS19WQUxJRCBhbmQgTEVfVkFMSUQKLSAgICAgYXJlIGFsd2F5cyBzZXQpICh0aGlzIGlzIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbiBvbiBBSVggMy4yKS4KLSAgICAgTm93LCB0aGUgdGhpbmcgaXMgdGhhdCBHREIgdXNlcnMgd2lsbCBiZSBzdXJwcmlzZWQKLSAgICAgaWYgc2VnbWVudHMganVzdCBzaWxlbnRseSBkb24ndCBhcHBlYXIgKHdlbGwsIG1heWJlIHRoZXkgd291bGQKLSAgICAgdGhpbmsgdG8gY2hlY2sgImluZm8gZmlsZXMiLCBJIGRvbid0IGtub3cpLgotCi0gICAgIEZvciB0aGUgZGF0YSBzZWdtZW50LCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8ga2VlcCBnb2luZyBpZiBpdCdzCi0gICAgIG5vdCB0aGVyZSwgc2luY2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgbm90IHRvIGR1bXAgaXQgKHJlZ2FyZGxlc3MKLSAgICAgb2YgdGhlIHVsaW1pdCwgaXQncyBiYXNlZCBvbiBTQV9GVUxMRFVNUCkuICBCdXQgZm9yIHRoZSBzdGFjayBzZWdtZW50LAotICAgICBpZiBpdCdzIG5vdCB0aGVyZSwgd2UgcmVmdXNlIHRvIGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGlzIGNvcmUKLSAgICAgZmlsZS4gIFRoZSB1c2VmdWxuZXNzIG9mIGEgY29yZSBkdW1wIHdpdGhvdXQgYSBzdGFjayBzZWdtZW50IGlzIHByZXR0eQotICAgICBsaW1pdGVkIGFueXdheS4gICovCi0gICAgIAotICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiBVQkxPQ0tfVkFMSUQpCi0gICAgICB8fCAhKGNvcmVkYXRhLmNfZmxhZyAmIExFX1ZBTElEKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiBVU1RBQ0tfVkFMSUQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZSBzaXplIGZvciBhIGZ1bGwgY29yZSwgQUlYIDQuMSBpbmNsdWRlcwotICAgICBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb25zIGluIGEgZnVsbCBjb3JlLiAgKi8KLSAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgKEZVTExfQ09SRSB8IENPUkVfVFJVTkMpKQotICAgICAgJiYgKChiZmRfdm1hKWNvcmVkYXRhLmNfc3RhY2sgKyBjb3JlZGF0YS5jX3NpemUpICE9IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc2l6ZSBpcyB3cm9uZywgaXQgbWVhbnMgd2UncmUgbWlzaW50ZXJwcmV0aW5nIHNvbWV0aGluZy4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmZGVmIEFJWF9DT1JFX0RVTVBYX0NPUkUKLSAgLyogRm9yIHRoZSBjb3JlX2R1bXB4IGZvcm1hdCwgbWFrZSBzdXJlIGNfZW50cmllcyA9PSAwICBJZiBpdCBkb2VzCi0gICAgIG5vdCwgdGhlIGNvcmUgZmlsZSB1c2VzIHRoZSBvbGQgZm9ybWF0ICovCi0gIGlmIChjb3JlZGF0YS5jX2VudHJpZXMgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSNlbHNlCi0gIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgY190YWIgZmllbGQuICAqLwotICBpZiAoKHVfbG9uZykgY29yZWRhdGEuY190YWIgPCBzaXplb2YgY29yZWRhdGEgfHwKLSAgICAgICh1X2xvbmcpIGNvcmVkYXRhLmNfdGFiID49IHN0YXRidWYuc3Rfc2l6ZSB8fAotICAgICAgKGxvbmcpIGNvcmVkYXRhLmNfdGFiID49IChsb25nKWNvcmVkYXRhLmNfc3RhY2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJc3N1ZSB3YXJuaW5nIGlmIHRoZSBjb3JlIGZpbGUgd2FzIHRydW5jYXRlZCBkdXJpbmcgd3JpdGluZy4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBDT1JFX1RSVU5DKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHdhcm5pbmcgY29yZSBmaWxlIHRydW5jYXRlZCIpLAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIC8qIEFsbG9jYXRlIGNvcmUgZmlsZSBoZWFkZXIuICAqLwotICB0bXBwdHIgPSAoY2hhciopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoUnM2a0NvckRhdGEpKTsKLSAgaWYgKCF0bXBwdHIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgICAKLSAgc2V0X3RkYXRhIChhYmZkLCB0bXBwdHIpOwotCi0gIC8qIENvcHkgY29yZSBmaWxlIGhlYWRlci4gICovCi0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmVkYXRhOwotCi0gIC8qIC5zdGFjayBzZWN0aW9uLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLSAgCQkJICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5jX3NpemUsCi0JCQkgIChiZmRfdm1hKSAoU1RBQ0tfRU5EX0FERFIgLSBjb3JlZGF0YS5jX3NpemUpLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2spKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5yZWcgc2VjdGlvbiBmb3IgR1BScyBhbmQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgKCgzMiArIE5VTV9PRl9TUEVDX1JFR1MpICogNCksCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpICgoY2hhciAqKSAmY29yZWRhdGEuU0FWRV9GSUVMRAotCQkJCSAgICAgIC0gKGNoYXIgKikgJmNvcmVkYXRhKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLnJlZzIgc2VjdGlvbiBmb3IgRlBScyAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKS4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWcyIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgOCAqIDMyLAkvKiAzMiBGUFJzLiAqLwotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSAoKGNoYXIgKikgJmNvcmVkYXRhLlNBVkVfRklFTEQuZnByWzBdCi0JCQkJICAgICAgLSAoY2hhciAqKSAmY29yZWRhdGEpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAubGRpbmZvIHNlY3Rpb24uCi0gICAgIFRvIGFjdHVhbGx5IGZpbmQgb3V0IGhvdyBsb25nIHRoaXMgc2VjdGlvbiBpcyBpbiB0aGlzIHBhcnRpY3VsYXIKLSAgICAgY29yZSBkdW1wIHdvdWxkIHJlcXVpcmUgZ29pbmcgZG93biB0aGUgd2hvbGUgbGlzdCBvZiBzdHJ1Y3QgbGRfaW5mbydzLgotICAgICBTZWUgaWYgd2UgY2FuIGp1c3QgZmFrZSBpdC4gICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIubGRpbmZvIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgTE9BREVSX1JFR0lPTl9TSVpFLAotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSBjb3JlZGF0YS5MT0FERVJfT0ZGU0VUX0ZJRUxEKSkKLSAgICByZXR1cm4gTlVMTDsKLQotI2lmbmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiAuZGF0YSBzZWN0aW9uIGlmIHByZXNlbnQuCi0gICAgIEFJWCAzIGR1bXBzIHRoZSBjb21wbGV0ZSBkYXRhIHNlY3Rpb24gYW5kIHNldHMgRlVMTF9DT1JFIGlmIHRoZQotICAgICB1bGltaXQgaXMgbGFyZ2UgZW5vdWdoLCBvdGhlcndpc2UgdGhlIGRhdGEgc2VjdGlvbiBpcyBvbWl0dGVkLgotICAgICBBSVggNCBzZXRzIEZVTExfQ09SRSBldmVuIGlmIHRoZSBjb3JlIGZpbGUgaXMgdHJ1bmNhdGVkLCB3ZSBoYXZlCi0gICAgIHRvIGV4YW1pbmUgY29yZWRhdGEuY19kYXRhc2l6ZSBiZWxvdyB0byBmaW5kIG91dCB0aGUgYWN0dWFsIHNpemUgb2YKLSAgICAgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBpZiAoY29yZWRhdGEuY19mbGFnICYgRlVMTF9DT1JFKQotICAgIHsKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQsCi0JCQkgICAgICAoYmZkX3ZtYSkKLQkJCQlDREFUQV9BRERSIChjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCksCi0JCQkgICAgICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2sgKyBjb3JlZGF0YS5jX3NpemUpKQotCXJldHVybiBOVUxMOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSAgLyogQUlYIDQgYWRkcyBkYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgdG8gdGhlIGNvcmUgZmlsZSwKLSAgICAgd2hpY2ggY2FuIGJlIGZvdW5kIGJ5IGV4YW1pbmluZyBsZGluZm8sIGFuZCBhbm9ueW1vdXNseSBtbWFwcGVkCi0gICAgIHJlZ2lvbnMuICAqLwotICB7Ci0gICAgc3RydWN0IGxkX2luZm8gbGRpbmZvOwotICAgIGJmZF9zaXplX3R5cGUgbGRpbmZvX3NpemU7Ci0gICAgZmlsZV9wdHIgbGRpbmZvX29mZnNldCA9IChmaWxlX3B0cikgY29yZWRhdGEuTE9BREVSX09GRlNFVF9GSUVMRDsKLQotICAgIC8qIC5kYXRhIHNlY3Rpb24gZnJvbSBleGVjdXRhYmxlLiAgKi8KLSAgICBpZiAoY29yZWRhdGEuY19kYXRhc2l6ZSkKLSAgICAgIHsKLQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuY19kYXRhc2l6ZSwKLQkJCQkoYmZkX3ZtYSkKLQkJCQkgIENEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCQkoZmlsZV9wdHIpIGNvcmVkYXRhLmNfZGF0YSkpCi0JICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMuICAqLwotICAgIGxkaW5mb19zaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0KLQkJICAtIChjaGFyICopICZsZGluZm8ubGRpbmZvX25leHQ7Ci0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCBsZGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCWlmIChiZmRfcmVhZCAoJmxkaW5mbywgbGRpbmZvX3NpemUsIDEsIGFiZmQpICE9IGxkaW5mb19zaXplKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGxkaW5mby5sZGluZm9fY29yZSkKLQkgIHsKLQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkgICAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbGRpbmZvLmxkaW5mb19kYXRhc2l6ZSwKLQkJCQkgICAgKGJmZF92bWEpIGxkaW5mby5sZGluZm9fZGF0YW9yZywKLQkJCQkgICAgKGZpbGVfcHRyKSBsZGluZm8ubGRpbmZvX2NvcmUpKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgfQotCWlmIChsZGluZm8ubGRpbmZvX25leHQgPT0gMCkKLQkgIGJyZWFrOwotCWxkaW5mb19vZmZzZXQgKz0gbGRpbmZvLmxkaW5mb19uZXh0OwotICAgICAgfQotCi0gICAgLyogLnZtZGF0YSBzZWN0aW9ucyBmcm9tIGFub255bW91c2x5IG1tYXBwZWQgcmVnaW9ucy4gICovCi0gICAgaWYgKGNvcmVkYXRhLmNfdm1yZWdpb25zKQotICAgICAgewotCWludCBpOwotCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdm1tLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IGNvcmVkYXRhLmNfdm1yZWdpb25zOyBpKyspCi0JICB7Ci0JICAgIHN0cnVjdCB2bV9pbmZvIHZtaW5mbzsKLQotCSAgICBpZiAoYmZkX3JlYWQgKCZ2bWluZm8sIHNpemVvZiAodm1pbmZvKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh2bWluZm8pKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBpZiAodm1pbmZvLnZtaW5mb19vZmZzZXQpCi0JICAgICAgewotCQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnZtZGF0YSIsCi0JCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkJKGJmZF9zaXplX3R5cGUpIHZtaW5mby52bWluZm9fc2l6ZSwKLQkJCQkJKGJmZF92bWEpIHZtaW5mby52bWluZm9fYWRkciwKLQkJCQkJKGZpbGVfcHRyKSB2bWluZm8udm1pbmZvX29mZnNldCkpCi0JCSAgcmV0dXJuIE5VTEw7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gYWJmZC0+eHZlYzsJCQkJLyogdGhpcyBpcyBnYXJiYWdlIGZvciBub3cuICovCi19Ci0KLQotCi0vKiByZXR1cm4gYHRydWUnIGlmIGdpdmVuIGNvcmUgaXMgZnJvbSB0aGUgZ2l2ZW4gZXhlY3V0YWJsZS4uICovCi1ib29sZWFuCi1yczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBzdHJ1Y3QgQ09SRV9EVU1QIGNvcmVkYXRhOwotICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY2hhciAqcGF0aCwgKnM7Ci0gIHNpemVfdCBhbGxvYzsKLSAgY29uc3QgY2hhciAqc3RyMSwgKnN0cjI7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoJmNvcmVkYXRhLCBzaXplb2YgY29yZWRhdGEsIDEsIGNvcmVfYmZkKSAhPSBzaXplb2YgY29yZWRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIChsb25nKSBjb3JlZGF0YS5MT0FERVJfT0ZGU0VUX0ZJRUxELCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2l6ZSA9IChjaGFyICopICZsZGluZm8ubGRpbmZvX2ZpbGVuYW1lWzBdIC0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fbmV4dDsKLSAgaWYgKGJmZF9yZWFkICgmbGRpbmZvLCBzaXplLCAxLCBjb3JlX2JmZCkgIT0gc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxsb2MgPSAxMDA7Ci0gIHBhdGggPSBiZmRfbWFsbG9jIChhbGxvYyk7Ci0gIGlmIChwYXRoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzID0gcGF0aDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKHMsIDEsIDEsIGNvcmVfYmZkKSAhPSAxKQotCXsKLQkgIGZyZWUgKHBhdGgpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgKytzOwotICAgICAgaWYgKHMgPT0gcGF0aCArIGFsbG9jKQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIGFsbG9jICo9IDI7Ci0JICBuID0gYmZkX3JlYWxsb2MgKHBhdGgsIGFsbG9jKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChwYXRoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIHMgPSBuICsgKHBhdGggLSBzKTsKLQkgIHBhdGggPSBuOwotCX0KLSAgICB9Ci0gIAotICBzdHIxID0gc3RycmNociAocGF0aCwgJy8nKTsKLSAgc3RyMiA9IHN0cnJjaHIgKGV4ZWNfYmZkLT5maWxlbmFtZSwgJy8nKTsKLQotICAvKiBzdGVwIG92ZXIgY2hhcmFjdGVyICcvJyAqLwotICBzdHIxID0gc3RyMSAhPSBOVUxMID8gc3RyMSArIDEgOiBwYXRoOwotICBzdHIyID0gc3RyMiAhPSBOVUxMID8gc3RyMiArIDEgOiBleGVjX2JmZC0+ZmlsZW5hbWU7Ci0KLSAgaWYgKHN0cmNtcCAoc3RyMSwgc3RyMikgPT0gMCkKLSAgICByZXQgPSB0cnVlOwotICBlbHNlCi0gICAgcmV0ID0gZmFsc2U7Ci0KLSAgZnJlZSAocGF0aCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotY2hhciAqCi1yczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gY29yZV9oZHIgKGFiZmQpLkNPUkVfQ09NTV9GSUVMRDsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCkuY19zaWdubzsKLX0KLQotCi1ib29sZWFuCi1yczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICAgIGlmIChjb3VudCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgLyogUmVhZGluZyBhIGNvcmUgZmlsZSdzIHNlY3Rpb25zIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50LiBGb3IgdGhlCi0gICAgICAgcmVzdCBvZiB0aGVtIHdlIGNhbiB1c2UgYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKCkgSSBzdXBwb3NlLiAqLwotICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHJvdXRpbmUgd29ya3MgZm9yIGFueSBiZmQgYW5kIGFueSBzZWN0aW9uLiBGSVhNRW1nby4gKi8KLQotICAgIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX2NvcmUgJiYgc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLnJlZyIpID09IDApIHsKLQotICAgICAgc3RydWN0IG1zdHNhdmUgbXN0YXR1czsKLSAgICAgIGludCAgICByZWdvZmZzZXQgPSAoY2hhciopJm1zdGF0dXMuZ3ByWzBdIC0gKGNoYXIqKSZtc3RhdHVzOwotCi0gICAgICAvKiBBc3NlcnQgdGhhdCB0aGUgb25seSB3YXkgdGhpcyBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgaXMgcmVhZGluZyB0aGUKLSAgICAgICAgIHdob2xlIHNlY3Rpb24uICovCi0gICAgICBpZiAob2Zmc2V0IHx8IGNvdW50ICE9IChzaXplb2YobXN0YXR1cy5ncHIpICsgKDQgKiBOVU1fT0ZfU1BFQ19SRUdTKSkpCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgKF8oIkVSUk9SISBpbiByczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKClcbiIpKTsKLQotICAgICAgLyogZm9yIGAucmVnJyBzZWN0aW9uLCBgZmlsZXBvcycgaXMgYSBwb2ludGVyIHRvIHRoZSBgbXN0c2F2ZScgc3RydWN0dXJlCi0gICAgICAgICBpbiB0aGUgY29yZSBmaWxlLiAqLwotCi0gICAgICAvKiByZWFkIEdQUidzIGludG8gdGhlIGxvY2F0aW9uLiAqLwotICAgICAgaWYgKCBiZmRfc2VlayhhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgcmVnb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEKLQl8fCBiZmRfcmVhZChsb2NhdGlvbiwgc2l6ZW9mIChtc3RhdHVzLmdwciksIDEsIGFiZmQpICE9IHNpemVvZiAobXN0YXR1cy5ncHIpKQotCXJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotCi0gICAgICAvKiBpbmNyZW1lbnQgbG9jYXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiBzcGVjaWFsIHJlZ2lzdGVycyBpbiB0aGUgc2VjdGlvbiwKLSAgICAgICAgIHJlc2V0IHJlZ2lzdGVyIG9mZnNldCB2YWx1ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGZpcnN0IHNwZWNpYWwgcmVnaXN0ZXIKLQkgaW4gbXN0c2F2ZSBzdHJ1Y3R1cmUsIGFuZCByZWFkIHNwZWNpYWwgcmVnaXN0ZXJzLiAqLwotCi0gICAgICBsb2NhdGlvbiA9IChQVFIpICgoY2hhciopbG9jYXRpb24gKyBzaXplb2YgKG1zdGF0dXMuZ3ByKSk7Ci0gICAgICByZWdvZmZzZXQgPSAoY2hhciopJm1zdGF0dXMuaWFyIC0gKGNoYXIqKSZtc3RhdHVzOwotCi0gICAgICBpZiAoIGJmZF9zZWVrKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyByZWdvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMQotCXx8IGJmZF9yZWFkKGxvY2F0aW9uLCA0ICogTlVNX09GX1NQRUNfUkVHUywgMSwgYWJmZCkgIT0gCi0JCQkJCQkJNCAqIE5VTV9PRl9TUEVDX1JFR1MpCi0JcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0gICAgICAKLSAgICAgIC8qIGluY3JlbWVudCBsb2NhdGlvbiBhZGRyZXNzLCBhbmQgcmVhZCB0aGUgc3BlY2lhbCByZWdpc3RlcnMuLiAqLwotICAgICAgLyogRklYTUVtZ28gKi8KLSAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogZWxzZSwgdXNlIGRlZmF1bHQgYmZkIHNlY3Rpb24gY29udGVudCB0cmFuc2Zlci4gKi8KLSAgICBlbHNlCi0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIAotICAgICAgCQkJKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KTsKLX0KLQotI2VuZGlmIC8qIEFJWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvc2NvNS1jb3JlLmMgYi9iZmQvc2NvNS1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Yzk3ZDIuLjAwMDAwMDAKLS0tIGEvYmZkL3NjbzUtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgU0NPNSBjb3JlIGZpbGVzIChVLWFyZWEgYW5kIHJhdyBzZWN0aW9ucykKLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKb3VrZSBOdW1hbiA8am51bWFuQGhpc2NvbS5ubD4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPiAgICAgICAgICAgLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLSNpbmNsdWRlIDxzeXMvcGFjY2Vzcy5oPgotI2luY2x1ZGUgPHN5cy9yZWdpb24uaD4KLQotc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QKLXsKLSAgc3RydWN0IHVzZXIgdTsKLX07Ci0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYXN5bWJvbCAqc2NvNV9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IHVzZXIgKnJlYWRfdWFyZWEgUEFSQU1TICgoYmZkICosIGludCkpOwotY29uc3QgYmZkX3RhcmdldCAqc2NvNV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNoYXIgKnNjbzVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludCBzY281X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gc2NvNV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKLQkJCQkJCSAgICAgYmZkICpleGVjX2JmZCkpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1zY281X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLSAKLXN0YXRpYyBzdHJ1Y3QgdXNlciAqCi1yZWFkX3VhcmVhKGFiZmQsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGZpbGVwb3M7Ci0KLXsKLSAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoKHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICopCi0JICAgIGJmZF96bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzY281X2NvcmVfc3RydWN0KSkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJnJhd3B0ci0+dSwgMSwgc2l6ZW9mIHJhd3B0ci0+dSwgYWJmZCkKLQkgICE9IHNpemVvZiByYXdwdHItPnUpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBwZXJoYXBzPz8/ICovCi0gIGlmIChyYXdwdHItPnUudV9kc2l6ZSA+IDB4MTAwMDAwMCkgICAgLyogUmVtZW1iZXIsIGl0J3MgaW4gcGFnZXMuLi4gKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgaWYgKHJhd3B0ci0+dS51X3NzaXplID4gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJhd3B0ci0+dTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotc2NvNV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgY29mZnNldF9zaXosIHZhbCwgbnNlY3MsIGNoZWFkb2ZmczsKLSAgaW50IGNvcmVzaXplOwotICBzdHJ1Y3QgdXNlciAqdTsKLSAgc3RydWN0IGNvcmVvZmZzZXRzIGNvZmZzZXRzOwotICBzdHJ1Y3QgY29yZXNlY3RoZWFkIGNoZWFkOwotICBjaGFyICpzZWNuYW1lOwotICBmbGFnd29yZCBmbGFnczsKLQotICAvKiBSZWFkIGNvcmVvZmZzZXRzIHJlZ2lvbiBhdCBlbmQgb2YgY29yZSAoc2VlIGNvcmUoRlApKSAqLwotCi0gIHsKLSAgICBGSUxFICpzdHJlYW0gPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChmc3RhdCAoZmlsZW5vIChzdHJlYW0pLCAmc3RhdGJ1ZikgPCAwKQotICAgICAgewotICAgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBjb3Jlc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgfQotICAvKiBMYXN0IGxvbmcgaW4gY29yZSBpcyBzaXplb2Ygc3RydWN0IGNvcmVvZmZzZXRzLCByZWFkIGl0ICovCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGNvcmVzaXplLXNpemVvZiBjb2Zmc2V0X3NpeiwgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNvZmZzZXRfc2l6LCAxLCBzaXplb2YgY29mZnNldF9zaXosIGFiZmQpCi0JICAhPSBzaXplb2YgY29mZnNldF9zaXopICkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsgCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogVXNlIGl0IHRvIHNlZWsgc3RhcnQgb2YgY29yZW9mZnNldHMgcmVnaW9uLCByZWFkIGl0IGFuZCBkZXRlcm1pbmUKLSAgICAgdmFsaWRpdHkgKi8KLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgY29yZXNpemUtY29mZnNldF9zaXosIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjb2Zmc2V0cywgMSwgc2l6ZW9mIGNvZmZzZXRzLCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNvZmZzZXRzKQotICAgICAgfHwgKChjb2Zmc2V0cy51X2luZm8gIT0gMSkgJiYgKGNvZmZzZXRzLnVfaW5mbyAhPSBDX1ZFUlNJT04pKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsgCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICBpZiAoY29mZnNldHMudV9pbmZvID09IDEpIAotICAgIHsgCi0gICAgICAvKiBPbGQgdmVyc2lvbiwgbm8gc2VjdGlvbiBoZWFkcywgcmVhZCBpbmZvIGZyb20gdXNlciBzdHJ1Y3QgKi8KLQotICAgICAgdSA9IHJlYWRfdWFyZWEoYWJmZCwgY29mZnNldHMudV91c2VyKTsKLSAgICAgIGlmICghIHUpCi0gICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwgU0VDX0hBU19DT05URU5UUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX3NpemVfdHlwZSkgY29mZnNldHMudV91c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSAoYmZkX3ZtYSkgdS0+dV9hcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfdXNlcikpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIAotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwgCi0JCQkgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJmZF9zaXplX3R5cGUpIHUtPnVfZXhkYXRhLnV4X2RzaXplCi0JCQkgICAgICAgKyB1LT51X2V4ZGF0YS51eF9ic2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX3ZtYSkgdS0+dV9leGRhdGEudXhfZGF0b3JnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X2RhdGEpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLCAKLQkJCSAgICAgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX3NpemVfdHlwZSkgdS0+dV9zc2l6ZSAqIE5CUEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX3ZtYSkgdS0+dV9zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfc3RhY2spKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgcmV0dXJuIGFiZmQtPnh2ZWM7CQkvKiBEb25lIGZvciB2ZXJzaW9uIDEgKi8KLSAgICB9ICAgICAgCi0KLSAgLyogSW1tZWRpYXRlbHkgYmVmb3JlIGNvcmVvZmZzZXRzIHJlZ2lvbiBpcyBhIGxvbmcgd2l0aCBvZmZzZXQgaW4gY29yZQotICAgICB0byBmaXJzdCBjb3Jlc2VjdGhlYWQgKENPUkVTX09GRlNFVFMpLCB0aGUgbG9uZyBiZWZvcmUgdGhpcyBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZHMgaW4gdGhlIGxpc3QuIFJlYWQgYm90aCBsb25ncyBhbmQgcmVhZCB0aGUKLSAgICAgY29yZXNlY3RoZWFkIGFuZCBjaGVjayBpdHMgdmFsaWRpdHkgKi8KLSAgICAKLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgCi0JCSBjb3Jlc2l6ZSAtIGNvZmZzZXRfc2l6IC0gMiAqIHNpemVvZiBjb2Zmc2V0X3NpeiwgCi0JCSBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmbnNlY3MsIDEsIHNpemVvZiBuc2VjcywgYWJmZCkgIT0gc2l6ZW9mIG5zZWNzKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjaGVhZG9mZnMsIDEsIHNpemVvZiBjaGVhZG9mZnMsIGFiZmQpCi0JICAhPSBzaXplb2YgY2hlYWRvZmZzKQotICAgICAgfHwgKGJmZF9zZWVrIChhYmZkLCBjaGVhZG9mZnMsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjaGVhZCwgMSwgc2l6ZW9mIGNoZWFkLCBhYmZkKSAhPSBzaXplb2YgY2hlYWQpCi0gICAgICB8fCAoY2hlYWQuY3Nfc3R5cGUgIT0gQ09SRVNfT0ZGU0VUUykKLSAgICAgIHx8IChjaGVhZC5jc194LmNzeF9tYWdpYyAhPSBDT1JFTUFHSUNfTlVNQkVSKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBOb3cgbG9vcCBvdmVyIGFsbCByZWdpb25zIGFuZCBtYXAgdGhlbSAqLwotICBuc2Vjcy0tOwkJCQkvKiBXZSd2ZSBzZWVuIENPUkVTX09GRlNFVFMgYWxyZWFkeSAqLwotICBmb3IgKDsgbnNlY3M7IG5zZWNzLS0pIAotICAgIHsKLSAgICAgIGlmICgoYmZkX3NlZWsgKGFiZmQsIGNoZWFkLmNzX2hzZWVrLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHx8IGJmZF9yZWFkICgodm9pZCAqKSZjaGVhZCwgMSwgc2l6ZW9mIGNoZWFkLCBhYmZkKSAhPSBzaXplb2YgY2hlYWQpCi0gICAgICAgIHsKLSAgICAgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsgCi0gICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgc3dpdGNoIChjaGVhZC5jc19zdHlwZSkgCi0JewotCWNhc2UgQ09SRVNfTUFHSUM6CQkJLyogQ29yZSBoZWFkZXIsIGNoZWNrIG1hZ2ljICovCi0JICBpZiAoY2hlYWQuY3NfeC5jc3hfbWFnaWMgIT0gQ09SRU1BR0lDX05VTUJFUikKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBzZWNuYW1lID0gTlVMTDsKLQkgIG5zZWNzKys7CQkJCS8qIE1BR0lDIG5vdCBpbiBzZWN0aW9uIGNudCEqLwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFU19VQVJFQToJCQkvKiBVLWFyZWEsIHJlYWQgaW4gdGRhdGEgKi8KLQkgIHUgPSByZWFkX3VhcmVhKGFiZmQsIGNoZWFkLmNzX3NzZWVrKTsKLQkgIGlmICghIHUpCi0JICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgICAgLyogVGhpcyBpcyB0cmlja3kuICBBcyB0aGUgInJlZ2lzdGVyIHNlY3Rpb24iLCB3ZSBnaXZlIHRoZW0KLQkgICAgIHRoZSBlbnRpcmUgdXBhZ2UgYW5kIHN0YWNrLiAgdS51X2FyMCBwb2ludHMgdG8gd2hlcmUKLQkgICAgICJyZWdpc3RlciAwIiBpcyBzdG9yZWQuICBUaGVyZSBhcmUgdHdvIHRyaWNrcyB3aXRoIHRoaXMsCi0JICAgICB0aG91Z2guICBPbmUgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXJzIG1pZ2h0IGJlCi0JICAgICBhdCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSAob3IgYm90aCkgZGlzcGxhY2VtZW50cyBmcm9tCi0JICAgICAqdV9hcjAuICBUaGUgb3RoZXIgaXMgdGhhdCB1X2FyMCBpcyBzb21ldGltZXMgYW4gYWJzb2x1dGUKLQkgICAgIGFkZHJlc3MgaW4ga2VybmVsIG1lbW9yeSwgYW5kIG9uIG90aGVyIHN5c3RlbXMgaXQgaXMgYW4KLQkgICAgIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGBzdHJ1Y3QgdXNlcicuCi0JCi0JICAgICBBcyBhIHByYWN0aWNhbCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIHJlZ2lzdGVycwotCSAgICAgYWN0dWFsbHkgYXJlLCBzbyB3ZSBoYXZlIHRvIHBhc3MgdGhlIHdob2xlIGFyZWEgdG8gR0RCLgotCSAgICAgV2UgZW5jb2RlIHRoZSB2YWx1ZSBvZiB1X2FyMCBieSBzZXR0aW5nIHRoZSAucmVncyBzZWN0aW9uCi0JICAgICB1cCBzbyB0aGF0IGl0cyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIDAgaXMgYXQgdGhlIHBsYWNlCi0JICAgICBwb2ludGVkIHRvIGJ5IHVfYXIwIChieSBzZXR0aW5nIHRoZSB2bWEgb2YgdGhlIHN0YXJ0IG9mCi0JICAgICB0aGUgc2VjdGlvbiB0byAtdV9hcjApLiAgR0RCIHVzZXMgdGhpcyBpbmZvIHRvIGxvY2F0ZSB0aGUKLQkgICAgIHJlZ3MsIHVzaW5nIG1pbm9yIHRyaWNrZXJ5IHRvIGdldCBhcm91bmQgdGhlCi0JICAgICBvZmZzZXQtb3ItYWJzb2x1dGUtYWRkciBwcm9ibGVtLiAqLwotCi0JICBjaGVhZC5jc192YWRkciA9IDAgLSAoYmZkX3ZtYSkgdS0+dV9hcjA7Ci0KLQotICAgICAgICAgIHNlY25hbWUgPSAiLnJlZyI7Ci0gICAgICAgICAgZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gICAgICAgICAgYnJlYWs7Ci0JY2FzZSBDT1JFU19QUkVHSU9OOgkJCS8qIEEgcHJvZ3JhbSByZWdpb24sIG1hcCBpdCAqLwotCSAgc3dpdGNoIChjaGVhZC5jc194LmNzeF9wcmVnLmNzeHBfcnR5cCkKLQkgICAgewotCSAgICBjYXNlIFBUX0RBVEE6Ci0JICAgICAgc2VjbmFtZSA9ICIuZGF0YSI7ICAJLyogRGF0YSByZWdpb24uICAgICAgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU1RBQ0s6Ci0JICAgICAgc2VjbmFtZSA9ICIuc3RhY2siOyAJLyogU3RhY2sgcmVnaW9uLiAgICAgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hNRU06Ci0JICAgICAgc2VjbmFtZSA9ICIuc2htZW0iOyAJLyogU2hhcmVkIG1lbW9yeSAgICAgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfTElCREFUOgotCSAgICAgIHNlY25hbWUgPSAiLmxpYmRhdCI7CS8qIFNoYXJlZCBsaWJyYXJ5IGRhdGEgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1Y4NjoKLQkgICAgICBzZWNuYW1lID0gIi52aXJ0ODYiOwkvKiBWaXJ0dWFsIDgwODYgbW9kZSAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TSEZJTDoKLQkgICAgICBzZWNuYW1lID0gIi5tbWZpbGUiOwkvKiBNZW1vcnkgbWFwcGVkIGZpbGUgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9YREFUQTA6Ci0JICAgICAgc2VjbmFtZSA9ICIuWGRhdDAiOyAJLyogWEVOSVggZGF0YSByZWdpb24sIHZpcnR1YWwgMCAqLwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHNlY25hbWUgPSAiIjsKLQkgICAgfQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIENPUkVTX1BST0M6CQkJLyogc3RydWN0IHByb2MgKi8KLQljYXNlIENPUkVTX0lUSU1FUjoJCQkvKiBpbnRlcnZhbCB0aW1lcnMgKi8KLQljYXNlIENPUkVTX1NDT1VUU05BTUU6CQkJLyogc3RydWN0IHNjb3V0c25hbWUgKi8KLQkgIHNlY25hbWUgPSBOVUxMOwkvKiBJZ25vcmUgdGhlc2UgKi8KLQkgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIlVuaGFuZGxlZCBTQ08gY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWFkLmNzX3N0eXBlKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICBpZiAoc2VjbmFtZQotCSAgJiYgIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLCBmbGFncywKLQkJCQkgKGJmZF9zaXplX3R5cGUpIGNoZWFkLmNzX3ZzaXplLAotCQkJCSAoYmZkX3ZtYSkgY2hlYWQuY3NfdmFkZHIsCi0JCQkJIChmaWxlX3B0cikgY2hlYWQuY3Nfc3NlZWspKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotfQotCi1jaGFyICoKLXNjbzVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBhYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X2NvbW07Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotICByZXR1cm4gKChpZ25vcmVfYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9zeXNhYm9ydCAhPSAwKSAKLQkgID8gaWdub3JlX2FiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfc3lzYWJvcnQgCi0JICA6IC0xKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLXNjbzVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOyAgICAgICAgICAvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCi19Ci0KLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIHNjbzVfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIHNjbzVfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBzY281X2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNjbzVfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBzY281X2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBzY281X2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNjbzVfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZSBOT19HRVQgICgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fUFVUICAoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IHNjbzVfY29yZV92ZWMgPQotICB7Ci0gICAgInNjbzUtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgIC8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCAgICAgICAgIC8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCAgICAgICAgIC8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCAgICAgICAgIC8qIGFyY2hpdmUgKi8KLSAgICAgc2NvNV9jb3JlX2ZpbGVfcCAgICAgIAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHNjbzUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzY281X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMCAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9zZWN0aW9uLmMgYi9iZmQvc2VjdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk3N2ZkLi4wMDAwMDAwCi0tLSBhL2JmZC9zZWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg0ICswLDAgQEAKLS8qIE9iamVjdCBmaWxlICJzZWN0aW9uIiBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU2VjdGlvbnMKLQotCVRoZSByYXcgZGF0YSBjb250YWluZWQgd2l0aGluIGEgQkZEIGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKLQlzZWN0aW9uIGFic3RyYWN0aW9uLiAgQSBzaW5nbGUgQkZEIG1heSBoYXZlIGFueSBudW1iZXIgb2YKLQlzZWN0aW9ucy4gIEl0IGtlZXBzIGhvbGQgb2YgdGhlbSBieSBwb2ludGluZyB0byB0aGUgZmlyc3Q7Ci0JZWFjaCBvbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGluIHRoZSBsaXN0LgotCi0JU2VjdGlvbnMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxzZWN0aW9uLmM+Pi4KLQotQG1lbnUKLUAqIFNlY3Rpb24gSW5wdXQ6OgotQCogU2VjdGlvbiBPdXRwdXQ6OgotQCogdHlwZWRlZiBhc2VjdGlvbjo6Ci1AKiBzZWN0aW9uIHByb3RvdHlwZXM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1TZWN0aW9uIElucHV0LCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMsIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBpbnB1dAotCi0JV2hlbiBhIEJGRCBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoZSBzZWN0aW9uIHN0cnVjdHVyZXMgYXJlCi0JY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIEJGRC4KLQotCUVhY2ggc2VjdGlvbiBoYXMgYSBuYW1lIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2VjdGlvbiBpbiB0aGUKLQlvdXRzaWRlIHdvcmxkLS0tZm9yIGV4YW1wbGUsIDw8YS5vdXQ+PiB3b3VsZCBjb250YWluIGF0IGxlYXN0Ci0JdGhyZWUgc2VjdGlvbnMsIGNhbGxlZCA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBhbmQgPDwuYnNzPj4uCi0KLQlOYW1lcyBuZWVkIG5vdCBiZSB1bmlxdWU7IGZvciBleGFtcGxlIGEgQ09GRiBmaWxlIG1heSBoYXZlIHNldmVyYWwKLQlzZWN0aW9ucyBuYW1lZCA8PC5kYXRhPj4uCi0KLQlTb21ldGltZXMgYSBCRkQgd2lsbCBjb250YWluIG1vcmUgdGhhbiB0aGUgYGBuYXR1cmFsJycgbnVtYmVyIG9mCi0Jc2VjdGlvbnMuIEEgYmFjayBlbmQgbWF5IGF0dGFjaCBvdGhlciBzZWN0aW9ucyBjb250YWluaW5nCi0JY29uc3RydWN0b3IgZGF0YSwgb3IgYW4gYXBwbGljYXRpb24gbWF5IGFkZCBhIHNlY3Rpb24gKHVzaW5nCi0JPDxiZmRfbWFrZV9zZWN0aW9uPj4pIHRvIHRoZSBzZWN0aW9ucyBhdHRhY2hlZCB0byBhbiBhbHJlYWR5IG9wZW4KLQlCRkQuIEZvciBleGFtcGxlLCB0aGUgbGlua2VyIGNyZWF0ZXMgYW4gZXh0cmEgc2VjdGlvbgotCTw8Q09NTU9OPj4gZm9yIGVhY2ggaW5wdXQgZmlsZSdzIEJGRCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0Ci0JY29tbW9uIHN0b3JhZ2UuCi0KLQlUaGUgcmF3IGRhdGEgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gd2hlbgotCXRoZSBzZWN0aW9uIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gU29tZSB0YXJnZXRzIG1heSBsZWF2ZSB0aGUKLQlkYXRhIGluIHBsYWNlIHVudGlsIGEgPDxiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM+PiBjYWxsIGlzCi0JbWFkZS4gT3RoZXIgYmFjayBlbmRzIG1heSByZWFkIGluIGFsbCB0aGUgZGF0YSBhdCBvbmNlLiAgRm9yCi0JZXhhbXBsZSwgYW4gUy1yZWNvcmQgZmlsZSBoYXMgdG8gYmUgcmVhZCBvbmNlIHRvIGRldGVybWluZSB0aGUKLQlzaXplIG9mIHRoZSBkYXRhLiBBbiBJRUVFLTY5NSBmaWxlIGRvZXNuJ3QgY29udGFpbiByYXcgZGF0YSBpbgotCXNlY3Rpb25zLCBidXQgZGF0YSBhbmQgcmVsb2NhdGlvbiBleHByZXNzaW9ucyBpbnRlcm1peGVkLCBzbwotCXRoZSBkYXRhIGFyZWEgaGFzIHRvIGJlIHBhcnNlZCB0byBnZXQgb3V0IHRoZSBkYXRhIGFuZAotCXJlbG9jYXRpb25zLgotCi1JTk9ERQotU2VjdGlvbiBPdXRwdXQsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb24gSW5wdXQsIFNlY3Rpb25zCi0KLVNVQlNFQ1RJT04KLQlTZWN0aW9uIG91dHB1dAotCi0JVG8gd3JpdGUgYSBuZXcgb2JqZWN0IHN0eWxlIEJGRCwgdGhlIHZhcmlvdXMgc2VjdGlvbnMgdG8gYmUKLQl3cml0dGVuIGhhdmUgdG8gYmUgY3JlYXRlZC4gVGhleSBhcmUgYXR0YWNoZWQgdG8gdGhlIEJGRCBpbgotCXRoZSBzYW1lIHdheSBhcyBpbnB1dCBzZWN0aW9uczsgZGF0YSBpcyB3cml0dGVuIHRvIHRoZQotCXNlY3Rpb25zIHVzaW5nIDw8YmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzPj4uCi0KLQlBbnkgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgb3IgY29tYmluZXMgc2VjdGlvbnMgKGUuZy4sIHRoZSBhc3NlbWJsZXIKLQlhbmQgbGlua2VyKSBtdXN0IHVzZSB0aGUgPDxhc2VjdGlvbj4+IGZpZWxkcyA8PG91dHB1dF9zZWN0aW9uPj4gYW5kCi0JPDxvdXRwdXRfb2Zmc2V0Pj4gdG8gaW5kaWNhdGUgdGhlIGZpbGUgc2VjdGlvbnMgdG8gd2hpY2ggZWFjaAotCXNlY3Rpb24gbXVzdCBiZSB3cml0dGVuLiAgKElmIHRoZSBzZWN0aW9uIGlzIGJlaW5nIGNyZWF0ZWQgZnJvbQotCXNjcmF0Y2gsIDw8b3V0cHV0X3NlY3Rpb24+PiBzaG91bGQgcHJvYmFibHkgcG9pbnQgdG8gdGhlIHNlY3Rpb24KLQlpdHNlbGYgYW5kIDw8b3V0cHV0X29mZnNldD4+IHNob3VsZCBwcm9iYWJseSBiZSB6ZXJvLikKLQotCVRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gY29tZXMgZnJvbSBpbnB1dCBzZWN0aW9ucyBhdHRhY2hlZAotCSh2aWEgPDxvdXRwdXRfc2VjdGlvbj4+IHBvaW50ZXJzKSB0bwotCXRoZSBvdXRwdXQgc2VjdGlvbnMuICBUaGUgb3V0cHV0IHNlY3Rpb24gc3RydWN0dXJlIGNhbiBiZQotCWNvbnNpZGVyZWQgYSBmaWx0ZXIgZm9yIHRoZSBpbnB1dCBzZWN0aW9uOiB0aGUgb3V0cHV0IHNlY3Rpb24KLQlkZXRlcm1pbmVzIHRoZSB2bWEgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgbmFtZSwgYnV0IHRoZQotCWlucHV0IHNlY3Rpb24gZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mCi0JdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLQotCUUuZy4sIHRvIGNyZWF0ZSBhIHNlY3Rpb24gIk8iLCBzdGFydGluZyBhdCAweDEwMCwgMHgxMjMgbG9uZywKLQljb250YWluaW5nIHR3byBzdWJzZWN0aW9ucywgIkEiIGF0IG9mZnNldCAweDAgKGkuZS4sIGF0IHZtYQotCTB4MTAwKSBhbmQgIkIiIGF0IG9mZnNldCAweDIwIChpLmUuLCBhdCB2bWEgMHgxMjApIHRoZSA8PGFzZWN0aW9uPj4KLQlzdHJ1Y3R1cmVzIHdvdWxkIGxvb2sgbGlrZToKLQotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQSIKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDAwCi18ICAgICBzaXplICAgICAgICAgICAgMHgyMAotfCAgICAgb3V0cHV0X3NlY3Rpb24gLS0tLS0tLS0tLS0+ICBzZWN0aW9uIG5hbWUgICAgIk8iCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHZtYSAgICAgICAgICAgICAweDEwMAotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQiIgfCAgICBzaXplICAgICAgICAgICAgMHgxMjMKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDIwICAgIHwKLXwgICAgIHNpemUgICAgICAgICAgICAweDEwMyAgIHwKLXwgICAgIG91dHB1dF9zZWN0aW9uICAtLS0tLS0tLXwKLQotCi1TVUJTRUNUSU9OCi0JTGluayBvcmRlcnMKLQotCVRoZSBkYXRhIHdpdGhpbiBhIHNlY3Rpb24gaXMgc3RvcmVkIGluIGEgQGRmbntsaW5rX29yZGVyfS4KLQlUaGVzZSBhcmUgbXVjaCBsaWtlIHRoZSBmaXh1cHMgaW4gPDxnYXM+Pi4gIFRoZSBsaW5rX29yZGVyCi0JYWJzdHJhY3Rpb24gYWxsb3dzIGEgc2VjdGlvbiB0byBncm93IGFuZCBzaHJpbmsgd2l0aGluIGl0c2VsZi4KLQotCUEgbGlua19vcmRlciBrbm93cyBob3cgYmlnIGl0IGlzLCBhbmQgd2hpY2ggaXMgdGhlIG5leHQKLQlsaW5rX29yZGVyIGFuZCB3aGVyZSB0aGUgcmF3IGRhdGEgZm9yIGl0IGlzOyBpdCBhbHNvIHBvaW50cyB0bwotCWEgbGlzdCBvZiByZWxvY2F0aW9ucyB3aGljaCBhcHBseSB0byBpdC4KLQotCVRoZSBsaW5rX29yZGVyIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBwZXJmb3JtIHJlbGF4aW5nIG9uCi0JZmluYWwgY29kZS4gIFRoZSBjb21waWxlciBjcmVhdGVzIGNvZGUgd2hpY2ggaXMgYXMgYmlnIGFzCi0JbmVjZXNzYXJ5IHRvIG1ha2UgaXQgd29yayB3aXRob3V0IHJlbGF4aW5nLCBhbmQgdGhlIHVzZXIgY2FuCi0Jc2VsZWN0IHdoZXRoZXIgdG8gcmVsYXguICBTb21ldGltZXMgcmVsYXhpbmcgdGFrZXMgYSBsb3Qgb2YKLQl0aW1lLiAgVGhlIGxpbmtlciBydW5zIGFyb3VuZCB0aGUgcmVsb2NhdGlvbnMgdG8gc2VlIGlmIGFueQotCWFyZSBhdHRhY2hlZCB0byBkYXRhIHdoaWNoIGNhbiBiZSBzaHJ1bmssIGlmIHNvIGl0IGRvZXMgaXQgb24KLQlhIGxpbmtfb3JkZXIgYnkgbGlua19vcmRlciBiYXNpcy4KLQotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKgotRE9DREQKLUlOT0RFCi10eXBlZGVmIGFzZWN0aW9uLCBzZWN0aW9uIHByb3RvdHlwZXMsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucwotU1VCU0VDVElPTgotCXR5cGVkZWYgYXNlY3Rpb24KLQotCUhlcmUgaXMgdGhlIHNlY3Rpb24gc3RydWN0dXJlOgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0uIHsqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGEgY29tZGF0IHNlY3Rpb24sIGFzIGluIFBFLiAgQSBjb21kYXQKLS4gICAgc2VjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHN5bWJvbC4gIFdoZW4gdGhlIGxpbmtlcgotLiAgICBzZWVzIGEgY29tZGF0IHNlY3Rpb24sIGl0IGtlZXBzIG9ubHkgb25lIG9mIHRoZSBzZWN0aW9ucyB3aXRoIGEKLS4gICAgZ2l2ZW4gbmFtZSBhbmQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gc3ltYm9sLiAqfQotLgotLnN0cnVjdCBiZmRfY29tZGF0X2luZm8KLS57Ci0uICB7KiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIGNvbWRhdCBzZWN0aW9uLiAgKn0KLS4gIGNvbnN0IGNoYXIgKm5hbWU7Ci0uCi0uICB7KiBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEKLS4gICAgIGNvbWRhdCBzZWN0aW9uLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotLiAgICAgc3BlY2lmaWMgY29kZTsgaXQgaXMgbm90IGFuIGluZGV4IGludG8gdGhlIGxpc3QgcmV0dXJuZWQgYnkKLS4gICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLiAgKn0KLS4gIGxvbmcgc3ltYm9sOwotLgotLiAgeyogSWYgdGhpcyBzZWN0aW9uIGlzIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGxpbmtlciB1c2VzIHRoaXMgZmllbGQKLS4gICAgIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzIGJlaW5nIGtlcHQuICAqfQotLiAgc3RydWN0IHNlYyAqc2VjOwotLn07Ci0uCi0udHlwZWRlZiBzdHJ1Y3Qgc2VjCi0uewotLiAgICAgICAgeyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKLS4gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICp9Ci0uCi0uICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uICAgICAgICB7KiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKn0KLS4KLS4gICBpbnQgaW5kZXg7Ci0uCi0uICAgICAgICB7KiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqfQotLgotLiAgICBzdHJ1Y3Qgc2VjICpuZXh0OwotLgotLiAgICAgICAgeyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLS4gICAgICAgICAgIGZsYWdzIGFyZSByZWFkIGluIGZyb20gdGhlIG9iamVjdCBmaWxlLCBhbmQgc29tZSBhcmUKLS4gICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqfQotLgotLiAgICBmbGFnd29yZCBmbGFnczsKLS4KLS4jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc2VjdGlvbiB3aGVuIGxvYWRpbmcuCi0uICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgotLiAgICAgICAgICAgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19BTExPQyAgICAgIDB4MDAxCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KLS4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqfQotLiNkZWZpbmUgU0VDX0xPQUQgICAgICAgMHgwMDIKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcwotLiAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKn0KLS4jZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0Ci0uCi0uI2lmIDAgICB7KiBPYnNvbGV0ZSA/ICp9Ci0uI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotLiNlbmRpZgotLgotLiAgICAgICAgeyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5Ci0uICAgICAgICAgIGRhdGEuICp9Ci0uI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICp9Ci0uI2RlZmluZSBTRUNfUk9NICAgICAgICAweDA4MAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgotLiAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLS4gICAgICAgICAgIGRlc3RydWN0b3JzIHVzZWQgYnkgPDxnKys+Pi4gV2hlbiBhIGJhY2sgZW5kIHNlZXMgYSBzeW1ib2wKLS4gICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldwotLiAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotLiAgICAgICAgICAgdGhlIHN5bWJvbCB0byBpdCwgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cwotLiAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQotLiAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotLiAgICAgICAgICAgY29udGFpbmVkIHdpdGhpbiAtIGV4YWN0bHkgdGhlIG9wZXJhdGlvbnMgaXQgd291bGQgcGVmb3JtIG9uCi0uICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqfQotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKLS4gICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKn0KLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0RBVEEgMHgyMTAwCi0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0uICAgICAgICAgICA8PFNFQ19BTExPQz4+IHwgPDxTRUNfSEFTX0NPTlRFTlRTPj47IGEgZGVidWcgc2VjdGlvbiBjb3VsZCBiZQotLiAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKn0KLS4jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLS4KLS4gICAgICAgIHsqIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgdG8gbm90IG91dHB1dCB0aGUgc2VjdGlvbgotLiAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKn0KLS4jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gIFRoaXMgZmxhZyBpcwotLiAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KLS4gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLS4gICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZtYSBvciBzaXplLiAgRklYTUU6IEFsdGhvdWdoIHRoaXMKLS4gICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCi0uICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLS4gICAgICAgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBzb21lIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gdG8KLS4gICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKLS4gICAgICAgICAgIHNlY3Rpb25zLiAqfQotLiNkZWZpbmUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgMHg4MDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCi0uICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLS4gICAgICAgICAgIHNwYWNlIGl0IHJlcXVpcmVzLCBhbmQgdGhlIGxhcmdlc3Qgc3ltYm9sIHZhbHVlIGlzIHRoZSBvbmUKLS4gICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCi0uCSAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqfQotLiNkZWZpbmUgU0VDX0lTX0NPTU1PTiAweDgwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCi0uICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0uICAgICAgICAgICBzdHJpcCB0ZXN0cyB0aGlzIGZsYWcgdG8gc2VlIGlmIGEgc2VjdGlvbiBjYW4gYmUKLS4gICAgICAgICAgIGRpc2NhcmRlZC4gKn0KLS4jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgaGVsZCBpbiBtZW1vcnkgcG9pbnRlZCB0bwotLiAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5Ci0uICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotLiAgICAgICAgICAgbWVtb3J5IGlmIGFwcHJvcHJpYXRlLiAgKn0KLS4jZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0uCSAgICBsaW5rZXIgZm9yIGV4ZWN1dGFibGUgYW5kIHNoYXJlZCBvYmplY3RzIHVubGVzcyB0aG9zZQotLgkgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqfQotLiNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotLgotLgl7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBzb3J0ZWQgYnkgdGhlCi0uCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKLS4JICAgdGFibGUuICAqfQotLiNkZWZpbmUgU0VDX1NPUlRfRU5UUklFUyAweDgwMDAwCi0uCi0uCXsqIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCi0uCSAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0uCSAgIGlzIHVzdWFsbHkgZG9uZS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgY29tbW9uIHN5bWJvbHMgYXJlCi0uCSAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0uCi0uCXsqIElmIFNFQ19MSU5LX09OQ0UgaXMgc2V0LCB0aGlzIGJpdGZpZWxkIGRlc2NyaWJlcyBob3cgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCBkdXBsaWNhdGUKLS4JICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKLS4JICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZIDB4MjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUgMHg0MDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotLgkgICBjb250ZW50cy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0uCSAgIHJlbG9jYXRpb24gb3Igb3RoZXIgYXJjYW5lIHByb2Nlc3NpbmcuICBJdCBpcyBza2lwcGVkIHdoZW4KLS4JICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQotLgkgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LRVJfQ1JFQVRFRCAweDgwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zICJzaG9ydCIgZGF0YSwgYW5kIHNob3VsZCBiZSBwbGFjZWQKLS4JICAgIm5lYXIiIHRoZSBHUC4gICp9Ci0uI2RlZmluZSBTRUNfU01BTExfREFUQSAweDIwMDAwMDAKLS4KLS4gCXsqIFRoaXMgc2VjdGlvbiBjb250YWlucyBkYXRhIHdoaWNoIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlcgotLgkgICBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cy4gICp9Ci0uI2RlZmluZSBTRUNfU0hBUkVEIDB4NDAwMDAwMAotLgotLgl7KiBXaGVuIGEgc2VjdGlvbiB3aXRoIHRoaXMgZmxhZyBpcyBiZWluZyBsaW5rZWQsIHRoZW4gaWYgdGhlIHNpemUgb2YKLS4gICAgICAgICAgdGhlIGlucHV0IHNlY3Rpb24gaXMgbGVzcyB0aGFuIGEgcGFnZSwgaXQgc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UKLS4gICAgICAgICAgYm91bmRhcnkuICBJZiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBpcyBvbmUgcGFnZSBvciBtb3JlLCBpdAotLiAgICAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnkuICAqfQotLiNkZWZpbmUgU0VDX0JMT0NLIDB4ODAwMDAwMAotLgotLgl7KiBDb25kaXRpb25hbGx5IGxpbmsgdGhpcyBzZWN0aW9uOyBkbyBub3QgbGluayBpZiB0aGVyZSBhcmUgbm8KLS4gICAgICAgICAgcmVmZXJlbmNlcyBmb3VuZCB0byBhbnkgc3ltYm9sIGluIHRoZSBzZWN0aW9uLiAgKn0KLS4jZGVmaW5lIFNFQ19DTElOSyAweDEwMDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gb2N0ZXRzLCBhcyBpdCB3aWxsIGJlIG91dHB1dC4KLS4gICAgICAgICAgIENvbnRhaW5zIGEgdmFsdWUgZXZlbiBpZiB0aGUgc2VjdGlvbiBoYXMgbm8gY29udGVudHMgKGUuZy4sIHRoZQotLiAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24uICAqfQotLgotLiAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOwotLgotLiAgICAgICAgeyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gb2N0ZXRzLiAgTm9ybWFsbHkgdGhpcwotLgkgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotLgkgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqfQotLgotLiAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotLgotLiAgICAgICAgeyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQotLiAgICAgICAgICAgb2Zmc2V0IGluICpieXRlcyogaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlCi0uICAgICAgICAgICBpbnB1dCBzZWN0aW9uIChieXRlID09PiBzbWFsbGVzdCBhZGRyZXNzYWJsZSB1bml0IG9uIHRoZQotLiAgICAgICAgICAgdGFyZ2V0KS4gIEluIG1vc3QgY2FzZXMsIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZQotLiAgICAgICAgICAgMTAwdGggb2N0ZXQgKDgtYml0IHF1YW50aXR5KSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUKLS4gICAgICAgICAgIHdvdWxkIGJlIDEwMC4gIEhvd2V2ZXIsIGlmIHRoZSB0YXJnZXQgYnl0ZSBzaXplIGlzIDE2IGJpdHMKLS4gICAgICAgICAgIChiZmRfb2N0ZXRzX3Blcl9ieXRlIGlzICIyIiksIHRoaXMgdmFsdWUgd291bGQgYmUgNTAuICp9Ci0uCi0uICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotLgotLiAgICAgICAgeyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKn0KLS4KLS4gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQotLiAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotLgotLiAgICAgICAgeyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KLS4gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0uICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICp9Ci0uCi0uICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0uCi0uICAgICAgICB7KiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKLS4gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqfQotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKn0KLS4KLS4gICBmaWxlX3B0ciBmaWxlcG9zOwotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKn0KLS4KLS4gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotLgotLiAgICAgICAgeyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKn0KLS4KLS4gICBQVFIgdXNlcmRhdGE7Ci0uCi0uICAgICAgICB7KiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotLiAgICAgICAgICAgY29udGVudHMuICAqfQotLiAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotLgotLiAgICAgICAgeyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKn0KLS4KLS4gICBhbGVudCAqbGluZW5vOwotLgotLiAgICAgICAgeyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqfQotLgotLiAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0uCi0uCSB7KiBPcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIENPTURBVCBlbnRyeTsgTlVMTCBpZiBub3QgQ09NREFUICp9Ci0uCi0uICAgc3RydWN0IGJmZF9jb21kYXRfaW5mbyAqY29tZGF0OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoKHNlY3Rpb24pLT5yZWxvY19kb25lID8gKGFib3J0ICgpLCAoYmZkX3NpemVfdHlwZSkgMSkgXAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzZWN0aW9uKS0+X3Jhd19zaXplKQotLiNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2Moc2VjdGlvbikgXAotLiAgICAgKChzZWN0aW9uKS0+cmVsb2NfZG9uZSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplIFwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfc2l6ZV90eXBlKSAxKSkKLSovCi0KLS8qIFdlIHVzZSBhIG1hY3JvIHRvIGluaXRpYWxpemUgdGhlIHN0YXRpYyBhc3ltYm9sIHN0cnVjdHVyZXMgYmVjYXVzZQotICAgdHJhZGl0aW9uYWwgQyBkb2VzIG5vdCBwZXJtaXQgdXMgdG8gaW5pdGlhbGl6ZSBhIHVuaW9uIG1lbWJlciB3aGlsZQotICAgZ2NjIHdhcm5zIGlmIHdlIGRvbid0IGluaXRpYWxpemUgaXQuICAqLwotIC8qIHRoZV9iZmQsIG5hbWUsIHZhbHVlLCBhdHRyLCBzZWN0aW9uIFssIHVkYXRhXSAqLwotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIEdMT0JBTF9TWU1fSU5JVChOQU1FLCBTRUNUSU9OKSBcCi0gIHsgMCwgTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgU0VDVElPTiwgeyAwIH19Ci0jZWxzZQotI2RlZmluZSBHTE9CQUxfU1lNX0lOSVQoTkFNRSwgU0VDVElPTikgXAotICB7IDAsIE5BTUUsIDAsIEJTRl9TRUNUSU9OX1NZTSwgKGFzZWN0aW9uICopIFNFQ1RJT04gfQotI2VuZGlmCi0KLS8qIFRoZXNlIHN5bWJvbHMgYXJlIGdsb2JhbCwgbm90IHNwZWNpZmljIHRvIGFueSBCRkQuICBUaGVyZWZvcmUsIGFueXRoaW5nCi0gICB0aGF0IHRyaWVzIHRvIGNoYW5nZSB0aGVtIGlzIGJyb2tlbiwgYW5kIHNob3VsZCBiZSByZXBhaXJlZC4gICovCi0KLXN0YXRpYyBjb25zdCBhc3ltYm9sIGdsb2JhbF9zeW1zW10gPQotewotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9DT01fU0VDVElPTl9OQU1FLCAmYmZkX2NvbV9zZWN0aW9uKSwKLSAgR0xPQkFMX1NZTV9JTklUIChCRkRfVU5EX1NFQ1RJT05fTkFNRSwgJmJmZF91bmRfc2VjdGlvbiksCi0gIEdMT0JBTF9TWU1fSU5JVCAoQkZEX0FCU19TRUNUSU9OX05BTUUsICZiZmRfYWJzX3NlY3Rpb24pLAotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9JTkRfU0VDVElPTl9OQU1FLCAmYmZkX2luZF9zZWN0aW9uKQotfTsKLQotI2RlZmluZSBTVERfU0VDVElPTihTRUMsIEZMQUdTLCBTWU0sIE5BTUUsIElEWCkJXAotICBjb25zdCBhc3ltYm9sICogY29uc3QgU1lNID0gKGFzeW1ib2wgKikgJmdsb2JhbF9zeW1zW0lEWF07IFwKLSAgY29uc3QgYXNlY3Rpb24gU0VDID0gXAotICAgIC8qIG5hbWUsIGluZGV4LCBuZXh0LCBmbGFncywgc2V0X3ZtYSwgcmVsb2NfZG9uZSwgbGlua2VyX21hcmssIGdjX21hcmsgKi8gXAotICAgIHsgTkFNRSwgIDAsICAgICAwLCAgICBGTEFHUywgMCwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgIDAsCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiB2bWEsIGxtYSwgX2Nvb2tlZF9zaXplLCBfcmF3X3NpemUsIG91dHB1dF9vZmZzZXQsIG91dHB1dF9zZWN0aW9uLCAqLyAgIFwKLSAgICAgICAwLCAgIDAsICAgMCwgICAgICAgICAgICAwLCAgICAgICAgIDAsICAgICAgICAgICAgIChzdHJ1Y3Qgc2VjICopICZTRUMsIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiBhbGlnLi4uLCByZWxvYy4uLiwgb3JlbC4uLiwgcmVsb2NfY291bnQsIGZpbGVwb3MsIHJlbF8uLi4sIGxpbmVfLi4uICovIFwKLSAgICAgICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgIDAsICAgICAgIDAsIAkgICAwLAkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogdXNlcmRhdGEsIGNvbnRlbnRzLCBsaW5lbm8sIGxpbmVub19jb3VudCAqLyAJCQkgICAgICBcCi0gICAgICAgMCwgICAgICAgIDAsICAgICAgICAwLCAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIGNvbWRhdF9pbmZvLCBtb3ZpbmdfbGluZV9maWxlcG9zLCB0YXJnZXRfaW5kZXgsIHVzZWRfYnlfYmZkLCAgKi8gICAgICAgXAotICAgICAgIE5VTEwsICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsIAkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIGNvbnMuLi4sIG93bmVyLCBzeW1ib2wgKi8gCQkJCQkgICAgICBcCi0gICAgICAgMCwgICAgICAgMCwgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopICZnbG9iYWxfc3ltc1tJRFhdLCAgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogc3ltYm9sX3B0cl9wdHIsICAgICAgICAgICAgICAgICAgICAgIGxpbmtfb3JkZXJfaGVhZCwgLi4uX3RhaWwgKi8gICAgICBcCi0gICAgICAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopICZTWU0sIDAsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1TVERfU0VDVElPTiAoYmZkX2NvbV9zZWN0aW9uLCBTRUNfSVNfQ09NTU9OLCBiZmRfY29tX3N5bWJvbCwKLQkgICAgIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwKTsKLVNURF9TRUNUSU9OIChiZmRfdW5kX3NlY3Rpb24sIDAsIGJmZF91bmRfc3ltYm9sLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMSk7Ci1TVERfU0VDVElPTiAoYmZkX2Fic19zZWN0aW9uLCAwLCBiZmRfYWJzX3N5bWJvbCwgQkZEX0FCU19TRUNUSU9OX05BTUUsIDIpOwotU1REX1NFQ1RJT04gKGJmZF9pbmRfc2VjdGlvbiwgMCwgYmZkX2luZF9zeW1ib2wsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAzKTsKLSN1bmRlZiBTVERfU0VDVElPTgotCi0vKgotRE9DREQKLUlOT0RFCi1zZWN0aW9uIHByb3RvdHlwZXMsICAsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBwcm90b3R5cGVzCi0KLVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBzZWN0aW9uIGhhbmRsaW5nIHBhcnQgb2YgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSdW4gdGhyb3VnaCBAdmFye2FiZmR9IGFuZCByZXR1cm4gdGhlIG9uZSBvZiB0aGUKLQk8PGFzZWN0aW9uPj5zIHdob3NlIG5hbWUgbWF0Y2hlcyBAdmFye25hbWV9LCBvdGhlcndpc2UgPDxOVUxMPj4uCi0JQHhyZWZ7U2VjdGlvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVjaWFsIGNhc2VzOyB0aGUgbm9ybWFsIHdheSB0byBwcm9jZXNzCi0JYWxsIHNlY3Rpb25zIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0byB1c2UgPDxiZmRfbWFwX292ZXJfc2VjdGlvbnM+PiBhbmQKLQk8PHN0cmNtcD4+IG9uIHRoZSBuYW1lIChvciBiZXR0ZXIgeWV0LCBiYXNlIGl0IG9uIHRoZSBzZWN0aW9uIGZsYWdzCi0Jb3Igc29tZXRoaW5nIGVsc2UpIGZvciBlYWNoIHNlY3Rpb24uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0gICAgICByZXR1cm4gc2VjdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9Ci0JYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgdGhlCi0JQkZEIEB2YXJ7YWJmZH0uIEFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgc2VjdGlvbiB3aXRoIGEgbmFtZSB3aGljaAotCWlzIGFscmVhZHkgaW4gdXNlIHJldHVybnMgaXRzIHBvaW50ZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKLQlzZWN0aW9uIGNoYWluLgotCi0JSXQgaGFzIHRoZSBmdW5ueSBuYW1lIHNpbmNlIHRoaXMgaXMgdGhlIHdheSBpdCB1c2VkIHRvIGJlCi0JYmVmb3JlIGl0IHdhcyByZXdyaXR0ZW4uLi4uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIHRoaXMgQkZELgotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotCi0qLwotCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHNlYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIENyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZgotICAgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciBAdmFye2FiZmR9LiAgQ3JlYXRlIGEgbmV3IHNlY3Rpb24gZXZlbiBpZiB0aGVyZQotICAgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUuCi0KLSAgIFJldHVybiA8PE5VTEw+PiBhbmQgc2V0IDw8YmZkX2Vycm9yPj4gb24gZXJyb3I7IHBvc3NpYmxlIGVycm9ycyBhcmU6Ci0gICBvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgQHZhcnthYmZkfS4KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLSBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLSovCi0KLXNlY19wdHIKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBhc2VjdGlvbiAqKnByZXYgPSAmYWJmZC0+c2VjdGlvbnM7Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBwcmV2ID0gJnNlY3QtPm5leHQ7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3c2VjdC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPmluZGV4ID0gYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotICBuZXdzZWN0LT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBuZXdzZWN0LT51c2VyZGF0YSA9IE5VTEw7Ci0gIG5ld3NlY3QtPmNvbnRlbnRzID0gTlVMTDsKLSAgbmV3c2VjdC0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY2F0aW9uID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NfY291bnQgPSAwOwotICBuZXdzZWN0LT5saW5lX2ZpbGVwb3MgPSAwOwotICBuZXdzZWN0LT5vd25lciA9IGFiZmQ7Ci0gIG5ld3NlY3QtPmNvbWRhdCA9IE5VTEw7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIHdob3Mgb25seSBqb2IgaXMgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiBUaGlzIGlzCi0gICAgIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgcmVsb2NzIHdoaWNoIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiBhCi0gICAgIHNlY3Rpb24uICAqLwotICBuZXdzZWN0LT5zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAobmV3c2VjdC0+c3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+dmFsdWUgPSAwOwotICBuZXdzZWN0LT5zeW1ib2wtPnNlY3Rpb24gPSBuZXdzZWN0OwotICBuZXdzZWN0LT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIG5ld3NlY3QtPnN5bWJvbF9wdHJfcHRyID0gJm5ld3NlY3QtPnN5bWJvbDsKLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9uZXdfc2VjdGlvbl9ob29rLCAoYWJmZCwgbmV3c2VjdCkpICE9IHRydWUpCi0gICAgewotICAgICAgZnJlZSAobmV3c2VjdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnByZXYgPSBuZXdzZWN0OwotICByZXR1cm4gbmV3c2VjdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbgotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIExpa2UgPDxiZmRfbWFrZV9zZWN0aW9uX2FueXdheT4+LCBidXQgcmV0dXJuIDw8TlVMTD4+ICh3aXRob3V0IGNhbGxpbmcKLSAgIGJmZF9zZXRfZXJyb3IgKCkpIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlY3Rpb24gY2hhaW4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhCi0gICBzZWN0aW9uIG5hbWVkIEB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgcmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQKLSAgIDw8YmZkX2Vycm9yPj4uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0FCU19TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9VTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2luZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotCXJldHVybiBOVUxMOwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIC8qIFRoZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHVzZWQ7IGdvIGFoZWFkIGFuZCBtYWtlIGEgbmV3IHNlY3Rpb24uICAqLwotICByZXR1cm4gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2ZsYWdzKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY30gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LiBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywKLQk8PGZhbHNlPj4gb24gZXJyb3IuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgc2VjdGlvbiBjYW5ub3QgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgYXR0cmlidXRlcwotCXJlcXVlc3RlZC4gRm9yIGV4YW1wbGUsIGEgLmJzcyBzZWN0aW9uIGluIDw8YS5vdXQ+PiBtYXkgbm90Ci0JaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmllbGQgc2V0LgotCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotI2lmIDAKLSAgLyogSWYgeW91IHRyeSB0byBjb3B5IGEgdGV4dCBzZWN0aW9uIGZyb20gYW4gaW5wdXQgZmlsZSAod2hlcmUgaXQKLSAgICAgaGFzIHRoZSBTRUNfQ09ERSBmbGFnIHNldCkgdG8gYW4gb3V0cHV0IGZpbGUsIHRoaXMgbG9zZXMgYmlnIGlmCi0gICAgIHRoZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSBkb2Vzbid0IGhhdmUgdGhlIFNFQ19DT0RFCi0gICAgIHNldCAtIHdoaWNoIGl0IGRvZXNuJ3QsIGF0IGxlYXN0IG5vdCBmb3IgYS5vdXQuICBGSVhNRSAqLwotCi0gIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBzZWN0aW9uLT5mbGFncyA9IGZsYWdzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFwX292ZXJfc2VjdGlvbnMKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyhiZmQgKmFiZmQsCi0JCQkJICAgdm9pZCAoKmZ1bmMpKGJmZCAqYWJmZCwKLQkJCQkJCWFzZWN0aW9uICpzZWN0LAotCQkJCQkJUFRSIG9iaiksCi0JCQkJICAgUFRSIG9iaik7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gQHZhcntmdW5jfSBmb3IgZWFjaCBzZWN0aW9uCi0JYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9LCBwYXNzaW5nIEB2YXJ7b2JqfSBhcyBhbgotCWFyZ3VtZW50LiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXMgaWYgYnkKLQotfAlmdW5jKGFiZmQsIHRoZV9zZWN0aW9uLCBvYmopOwotCi0JVGhpcyBpcyB0aGUgcHJlZmVyZWQgbWV0aG9kIGZvciBpdGVyYXRpbmcgb3ZlciBzZWN0aW9uczsgYW4KLQlhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB1c2UgYSBsb29wOgotCi18CSAgIHNlY3Rpb24gKnA7Ci18CSAgIGZvciAocCA9IGFiZmQtPnNlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotfAkgICAgICBmdW5jKGFiZmQsIHAsIC4uLikKLQotCi0qLwotCi0vKlZBUkFSR1MyKi8KLXZvaWQKLWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgb3BlcmF0aW9uLCB1c2VyX3N0b3JhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAoKm9wZXJhdGlvbikgUEFSQU1TICgoYmZkICogYWJmZCwgYXNlY3Rpb24gKiBzZWN0LCBQVFIgb2JqKSk7Ci0gICAgIFBUUiB1c2VyX3N0b3JhZ2U7Ci17Ci0gIGFzZWN0aW9uICpzZWN0OwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3QgIT0gTlVMTDsgaSsrLCBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICAoKm9wZXJhdGlvbikgKGFiZmQsIHNlY3QsIHVzZXJfc3RvcmFnZSk7Ci0KLSAgaWYgKGkgIT0gYWJmZC0+c2VjdGlvbl9jb3VudCkJLyogRGVidWdnaW5nICovCi0gICAgYWJvcnQgKCk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX3NpemUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9zaXplKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpOwotCi1ERVNDUklQVElPTgotCVNldCBAdmFye3NlY30gdG8gdGhlIHNpemUgQHZhcnt2YWx9LiBJZiB0aGUgb3BlcmF0aW9uIGlzCi0Jb2ssIHRoZW4gPDx0cnVlPj4gaXMgcmV0dXJuZWQsIGVsc2UgPDxmYWxzZT4+LgotCi0JUG9zc2libGUgZXJyb3IgcmV0dXJuczoKLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVdyaXRpbmcgaGFzIHN0YXJ0ZWQgdG8gdGhlIEJGRCwgc28gc2V0dGluZyB0aGUgc2l6ZSBpcyBpbnZhbGlkLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcHRyLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgdmFsOwotewotICAvKiBPbmNlIHlvdSd2ZSBzdGFydGVkIHdyaXRpbmcgdG8gYW55IHNlY3Rpb24geW91IGNhbm5vdCBjcmVhdGUgb3IgY2hhbmdlCi0gICAgIHRoZSBzaXplIG9mIGFueSBvdGhlcnMuICovCi0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcHRyLT5fY29va2VkX3NpemUgPSB2YWw7Ci0gIHB0ci0+X3Jhd19zaXplID0gdmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgICAgICBiZmRfc2l6ZV90eXBlIGNvdW50KTsKLQotCi1ERVNDUklQVElPTgotCVNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIEB2YXJ7c2VjdGlvbn0gaW4gQkZECi0JQHZhcnthYmZkfSB0byB0aGUgZGF0YSBzdGFydGluZyBpbiBtZW1vcnkgYXQgQHZhcntkYXRhfS4gVGhlCi0JZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdCBvZmZzZXQKLQlAdmFye29mZnNldH0gZm9yIEB2YXJ7Y291bnR9IG9jdGV0cy4KLQotCi0KLQlOb3JtYWxseSA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9ub19jb250ZW50cz4+IC0KLQlUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4KLQlhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0JbyBhbmQgc29tZSBtb3JlIHRvbwotCi0JVGhpcyByb3V0aW5lIGlzIGZyb250IGVuZCB0byB0aGUgYmFjayBlbmQgZnVuY3Rpb24KLQk8PF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCi0qLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyhhYmZkLHNlYykgXAotKHNlYy0+cmVsb2NfZG9uZSBcCi0gPyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoc2VjKSBcCi0gOiBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykpCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzejsKLQotICBpZiAoIShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6Ci0gICAgICB8fCBjb3VudCA+IHN6Ci0gICAgICB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGZvciB1cGRhdGUuIGBvdXRwdXRfaGFzX2JlZ3VuJyBzb21lIHRpbWUgYWdvIHdoZW4KLQkgICB0aGUgZmlsZSB3YXMgY3JlYXRlZC4gIERvIG5vdCByZWNvbXB1dGUgc2VjdGlvbnMgc2l6ZXMgb3IgYWxpZ25tZW50cwotCSAgIGluIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudC4gICovCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpKQotICAgIHsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVhZCBkYXRhIGZyb20gQHZhcntzZWN0aW9ufSBpbiBCRkQgQHZhcnthYmZkfQotCWludG8gbWVtb3J5IHN0YXJ0aW5nIGF0IEB2YXJ7bG9jYXRpb259LiBUaGUgZGF0YSBpcyByZWFkIGF0IGFuCi0Jb2Zmc2V0IG9mIEB2YXJ7b2Zmc2V0fSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VjdGlvbiwKLQlhbmQgaXMgcmVhZCBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQlJZiB0aGUgY29udGVudHMgb2YgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSA8PFNFQ19DT05TVFJVQ1RPUj4+Ci0JZmxhZyBzZXQgYXJlIHJlcXVlc3RlZCBvciBpZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCTw8U0VDX0hBU19DT05URU5UUz4+IGZsYWcgc2V0LCB0aGVuIHRoZSBAdmFye2xvY2F0aW9ufSBpcyBmaWxsZWQKLQl3aXRoIHplcm9lcy4gSWYgbm8gZXJyb3JzIG9jY3VyLCA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZQotCTw8ZmFsc2U+Pi4KLQotCi0KLSovCi1ib29sZWFuCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPCAwKQotICAgIHsKLSAgICBiYWRfdmFsOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBFdmVuIGlmIHJlbG9jX2RvbmUgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB1bnJlbG9jYXRlZAotICAgICBjb250ZW50cywgc28gd2Ugd2FudCB0aGUgcmF3IHNpemUuICAqLwotICBzeiA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzeiB8fCBjb3VudCA+IHN6IHx8IG9mZnNldCArIGNvdW50ID4gc3opCi0gICAgZ290byBiYWRfdmFsOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIC8qIERvbid0IGJvdGhlci4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgewotICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5IChsb2NhdGlvbiwgc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIChzaXplX3QpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsCi0JCSAgIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYyk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzZWN9IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzZWN0aW9uIEB2YXJ7b3NlY30gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgXAotLgkJKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0qLwotCi0vKgotRlVOQ1RJT04KLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQotU1lOT1BTSVMKLQl2b2lkIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlY3Rpb24pOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSBAdmFye3NlY3Rpb259IGZyb20gdGhlIG91dHB1dC4gIElmIHRoZSBvdXRwdXQgc2VjdGlvbgotCWJlY29tZXMgZW1wdHksIHJlbW92ZSBpdCBmcm9tIHRoZSBvdXRwdXQgYmZkLiAgQHZhcntpbmZvfSBtYXkKLQliZSBOVUxMOyBpZiBpdCBpcyBub3QsIGl0IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dAotCXNlY3Rpb24gaXMgZW1wdHkuCi0qLwotdm9pZAotX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGFzZWN0aW9uICoqc3BwLCAqb3M7Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCwgKnBwOwotICBib29sZWFuIGtlZXBfb3M7Ci0KLSAgLyogRXhjaXNlIHRoZSBpbnB1dCBzZWN0aW9uIGZyb20gdGhlIGxpbmsgb3JkZXIuCi0KLSAgICAgRklYTUU6IEZvciBhbGwgY2FsbHMgdGhhdCBJIGNhbiBzZWUgdG8gdGhpcyBmdW5jdGlvbiwgdGhlIGxpbmsKLSAgICAgb3JkZXJzIGhhdmUgbm90IHlldCBiZWVuIHNldCB1cC4gIFNvIHdoeSBhcmUgd2UgY2hlY2tpbmcgdGhlbT8gLS0KLSAgICAgSWFuICovCi0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZvciAocCA9IG9zLT5saW5rX29yZGVyX2hlYWQsIHBwID0gTlVMTDsgcCAhPSBOVUxMOyBwcCA9IHAsIHAgPSBwLT5uZXh0KQotICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JJiYgcC0+dS5pbmRpcmVjdC5zZWN0aW9uID09IHMpCi0gICAgICB7Ci0JaWYgKHBwKQotCSAgcHAtPm5leHQgPSBwLT5uZXh0OwotCWVsc2UKLQkgIG9zLT5saW5rX29yZGVyX2hlYWQgPSBwLT5uZXh0OwotCWlmICghcC0+bmV4dCkKLQkgIG9zLT5saW5rX29yZGVyX3RhaWwgPSBwcDsKLQlicmVhazsKLSAgICAgIH0KLQotICBrZWVwX29zID0gb3MtPmxpbmtfb3JkZXJfaGVhZCAhPSBOVUxMOwotCi0gIGlmICghIGtlZXBfb3MgJiYgaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqYWJmZDsKLSAgICAgIGZvciAoYWJmZCA9IGluZm8tPmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqaXM7Ci0JICBmb3IgKGlzID0gYWJmZC0+c2VjdGlvbnM7IGlzICE9IE5VTEw7IGlzID0gaXMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoaXMgIT0gcyAmJiBpcy0+b3V0cHV0X3NlY3Rpb24gPT0gb3MpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoaXMgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgaWYgKGFiZmQgIT0gTlVMTCkKLQlrZWVwX29zID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzIGVtcHR5LCByZW1vdmUgaXQgdG9vLiAgQ2FyZWZ1bCBhYm91dCBzZWN0aW9ucwotICAgICB0aGF0IGhhdmUgYmVlbiBkaXNjYXJkZWQgaW4gdGhlIGxpbmsgc2NyaXB0IC0tIHRoZXkgYXJlIG1hcHBlZCB0byAKLSAgICAgYmZkX2Fic19zZWN0aW9uLCB3aGljaCBoYXMgbm8gb3duZXIuICAqLwotICBpZiAoIWtlZXBfb3MgJiYgb3MtPm93bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChzcHAgPSAmb3MtPm93bmVyLT5zZWN0aW9uczsgKnNwcDsgc3BwID0gJigqc3BwKS0+bmV4dCkKLQlpZiAoKnNwcCA9PSBvcykKLQkgIHsKLQkgICAgKnNwcCA9IG9zLT5uZXh0OwotCSAgICBvcy0+b3duZXItPnNlY3Rpb25fY291bnQtLTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5jIGIvYmZkL3NvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJiNjlmLi4wMDAwMDAwCi0tLSBhL2JmZC9zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDYzMjYgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIFNPTSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpIHx8IGRlZmluZWQoSE9TVF9IUFBBTVBFSVgpCi0KLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJzb20uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBNYWdpYyBub3QgZGVmaW5lZCBpbiBzdGFuZGFyZCBIUC1VWCBoZWFkZXIgZmlsZXMgdW50aWwgOC4wICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MxXzAKLSNkZWZpbmUgQ1BVX1BBX1JJU0MxXzAgMHgyMEIKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzFfMCAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8xCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8xIDB4MjEwCi0jZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzEgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzJfMAotI2RlZmluZSBDUFVfUEFfUklTQzJfMCAweDIxNAotI2VuZGlmIC8qIENQVV9QQV9SSVNDMl8wICovCi0KLSNpZm5kZWYgX1BBX1JJU0MxXzBfSUQKLSNkZWZpbmUgX1BBX1JJU0MxXzBfSUQgQ1BVX1BBX1JJU0MxXzAKLSNlbmRpZiAvKiBfUEFfUklTQzFfMF9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMV8xX0lECi0jZGVmaW5lIF9QQV9SSVNDMV8xX0lEIENQVV9QQV9SSVNDMV8xCi0jZW5kaWYgLyogX1BBX1JJU0MxXzFfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQzJfMF9JRAotI2RlZmluZSBfUEFfUklTQzJfMF9JRCBDUFVfUEFfUklTQzJfMAotI2VuZGlmIC8qIF9QQV9SSVNDMl8wX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0NfTUFYSUQKLSNkZWZpbmUgX1BBX1JJU0NfTUFYSUQJMHgyRkYKLSNlbmRpZiAvKiBfUEFfUklTQ19NQVhJRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDX0lECi0jZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pCQlcCi0gICAgKCgoX19tX251bSkgPT0gX1BBX1JJU0MxXzBfSUQpIHx8CVwKLSAgICAgKChfX21fbnVtKSA+PSBfUEFfUklTQzFfMV9JRCAmJiAoX19tX251bSkgPD0gX1BBX1JJU0NfTUFYSUQpKQotI2VuZGlmIC8qIF9QQV9SSVNDX0lEICovCi0KLQotLyogSElVWCBpbiBpdCdzIGluZmluaXRlIHN0dXBpZGl0eSBjaGFuZ2VkIHRoZSBuYW1lcyBmb3Igc2V2ZXJhbCAid2VsbAotICAga25vd24iIGNvbnN0YW50cy4gIFdvcmsgYXJvdW5kIHN1Y2ggYnJhaW5kYW1hZ2UuICBUcnkgdGhlIEhQVVggdmVyc2lvbgotICAgZmlyc3QsIHRoZW4gdGhlIEhJVVggdmVyc2lvbiwgYW5kIGZpbmFsbHkgcHJvdmlkZSBhIGRlZmF1bHQuICAqLwotI2lmZGVmIEhQVVhfQVVYX0lECi0jZGVmaW5lIEVYRUNfQVVYX0lEIEhQVVhfQVVYX0lECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChFWEVDX0FVWF9JRCkgJiYgZGVmaW5lZCAoSElVWF9BVVhfSUQpCi0jZGVmaW5lIEVYRUNfQVVYX0lEIEhJVVhfQVVYX0lECi0jZW5kaWYKLQotI2lmbmRlZiBFWEVDX0FVWF9JRAotI2RlZmluZSBFWEVDX0FVWF9JRCAwCi0jZW5kaWYKLQotLyogU2l6ZSAoaW4gY2hhcnMpIG9mIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyB1c2VkIGR1cmluZyBmaXh1cCBhbmQgc3RyaW5nCi0gICB0YWJsZSB3cml0ZXMuICAgKi8KLSAgIAotI2RlZmluZSBTT01fVE1QX0JVRlNJWkUgODE5MgotCi0vKiBTaXplIG9mIHRoZSBoYXNoIHRhYmxlIGluIGFyY2hpdmVzLiAgKi8KLSNkZWZpbmUgU09NX0xTVF9IQVNIX1NJWkUgMzEKLQotLyogTWF4IG51bWJlciBvZiBTT01zIHRvIGJlIGZvdW5kIGluIGFuIGFyY2hpdmUuICAqLwotI2RlZmluZSBTT01fTFNUX01PRFVMRV9MSU1JVCAxMDI0Ci0KLS8qIEdlbmVyaWMgYWxpZ25tZW50IG1hY3JvLiAgKi8KLSNkZWZpbmUgU09NX0FMSUdOKHZhbCwgYWxpZ25tZW50KSBcCi0gICgoKHZhbCkgKyAoYWxpZ25tZW50KSAtIDEpICYgfigoYWxpZ25tZW50KSAtIDEpKQotCi0vKiBTT00gYWxsb3dzIGFueSBvbmUgb2YgdGhlIGZvdXIgcHJldmlvdXMgcmVsb2NhdGlvbnMgdG8gYmUgcmV1c2VkCi0gICB3aXRoIGEgIlJfUFJFVl9GSVhVUCIgcmVsb2NhdGlvbiBlbnRyeS4gIFNpbmNlIFJfUFJFVl9GSVhVUAotICAgcmVsb2NhdGlvbnMgYXJlIGFsd2F5cyBhIHNpbmdsZSBieXRlLCB1c2luZyBhIFJfUFJFVl9GSVhVUCBpbnN0ZWFkCi0gICBvZiBzb21lIG11bHRpLWJ5dGUgcmVsb2NhdGlvbiBtYWtlcyBvYmplY3QgZmlsZXMgc21hbGxlci4gCi0KLSAgIE5vdGUgb25lIHNpZGUgZWZmZWN0IG9mIHVzaW5nIGEgUl9QUkVWX0ZJWFVQIGlzIHRoZSByZWxvY2F0aW9uIHRoYXQKLSAgIGlzIGJlaW5nIHJlcGVhdGVkIG1vdmVzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLwotc3RydWN0IHJlbG9jX3F1ZXVlCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpyZWxvYzsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgfSByZWxvY19xdWV1ZVs0XTsKLQotLyogVGhpcyBmdWxseSBkZXNjcmliZXMgdGhlIHN5bWJvbCB0eXBlcyB3aGljaCBtYXkgYmUgYXR0YWNoZWQgdG8KLSAgIGFuIEVYUE9SVCBvciBJTVBPUlQgZGlyZWN0aXZlLiAgT25seSBTT00gdXNlcyB0aGlzIGZvcm1hdGlvbgotICAgKEVMRiBoYXMgbm8gbmVlZCBmb3IgaXQpLiAgKi8KLXR5cGVkZWYgZW51bQotewotICBTWU1CT0xfVFlQRV9VTktOT1dOLAotICBTWU1CT0xfVFlQRV9BQlNPTFVURSwKLSAgU1lNQk9MX1RZUEVfQ09ERSwKLSAgU1lNQk9MX1RZUEVfREFUQSwKLSAgU1lNQk9MX1RZUEVfRU5UUlksCi0gIFNZTUJPTF9UWVBFX01JTExJQ09ERSwKLSAgU1lNQk9MX1RZUEVfUExBQkVMLAotICBTWU1CT0xfVFlQRV9QUklfUFJPRywKLSAgU1lNQk9MX1RZUEVfU0VDX1BST0csCi19IHBhX3N5bWJvbF90eXBlOwotCi1zdHJ1Y3Qgc2VjdGlvbl90b190eXBlCi17Ci0gIGNoYXIgKnNlY3Rpb247Ci0gIGNoYXIgdHlwZTsKLX07Ci0KLS8qIEFzc29ydGVkIHN5bWJvbCBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgQkZEIHN5bWJvbAotICAgYW5kL29yIHRoZSBCRkQgYmFja2VuZCBwcml2YXRlIHN5bWJvbCBkYXRhLiAgKi8KLXN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGU7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfc2NvcGU7Ci0gIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfaW5mbzsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF92YWx1ZTsKLSAgdW5zaWduZWQgaW50IHByaXZfbGV2ZWw7Ci0gIHVuc2lnbmVkIGludCBzZWNvbmRhcnlfZGVmOwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gc29tX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3Rfc2V0dXAgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgc3RydWN0IGhlYWRlciAqLAotCQkJCQkJICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGhlYWRlciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJICAgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NldF9yZWxvY19pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKiBzb21fbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkgICAgICBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkJICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIHNvbV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgc29tX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0JCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYmZkX3ZtYSwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNvbV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzZWN0aW9uICogYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCAKLQkJCQkJc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfc29tX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCQkgICAgIGFzeW1ib2wgKiwgUFRSLAotCQkJCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwKLQkJCQkJCSAgICAgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHNvbV9yZWxvY19xdWV1ZV9maW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogdHJ5X3ByZXZfZml4dXAgUEFSQU1TICgoYmZkICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19za2lwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2FkZGVuZCBQQVJBTVMgKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICAgIHVuc2lnbmVkIGludCAqLAotCQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19jYWxsIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIGFyZWxlbnQgKiwgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zdWJzcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zeW1zIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3Vic3BhY2VzIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY29tcHV0ZV9jaGVja3N1bSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3ByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzb21fc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5pc2hfd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmVwX2Zvcl9maXh1cHMgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9maXh1cHMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgYXN5bWJvbCAqKiwgdW5zaWduZWQgaW50LAotCQkJCQkJIHVuc2lnbmVkICosCi0JCQkJCQkgQ09NUFVOSVQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JlZ2luX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBjaGFyIHNvbV9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHNvbV9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgc3ltaW5kZXggKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKLQkJCQkJCSAgIGNhcnN5bSAqKnN5bXMpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwKLQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc3RydWN0IGxzdF9oZWFkZXIsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3Vic3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX2NvbnRhaW5lciBQQVJBTVMgKChhc2VjdGlvbiAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0JCi0vKiBNYXAgU09NIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotCi0gICBUaGlzIHRhYmxlIGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgc3Vic3BhY2VzIGFzIGRlZmluZWQgaW4gdGhlIAotICAgY3VycmVudCAiUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zIiwgJFVOV0lORCQgd2hpY2ggZm9yIAotICAgc29tZSByZWFzb24gd2FzIGxlZnQgb3V0LCBhbmQgc2VjdGlvbnMgc3BlY2lmaWMgdG8gZW1iZWRkZWQgc3RhYnMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9IHsKLSAgeyIkVEVYVCQiLCAndCd9LAotICB7IiRTSExJQl9JTkZPJCIsICd0J30sCi0gIHsiJE1JTExJQ09ERSQiLCAndCd9LAotICB7IiRMSVQkIiwgJ3QnfSwKLSAgeyIkQ09ERSQiLCAndCd9LAotICB7IiRVTldJTkRfU1RBUlQkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EJCIsICd0J30sCi0gIHsiJFBSSVZBVEUkIiwgJ2QnfSwKLSAgeyIkUExUJCIsICdkJ30sCi0gIHsiJFNITElCX0RBVEEkIiwgJ2QnfSwKLSAgeyIkREFUQSQiLCAnZCd9LAotICB7IiRTSE9SVERBVEEkIiwgJ2cnfSwKLSAgeyIkRExUJCIsICdkJ30sCi0gIHsiJEdMT0JBTCQiLCAnZyd9LAotICB7IiRTSE9SVEJTUyQiLCAncyd9LAotICB7IiRCU1MkIiwgJ2InfSwKLSAgeyIkR0RCX1NUUklOR1MkIiwgJ04nfSwKLSAgeyIkR0RCX1NZTUJPTFMkIiwgJ04nfSwKLSAgezAsIDB9Ci19OwotCi0vKiBBYm91dCB0aGUgcmVsb2NhdGlvbiBmb3JtYXR0aW5nIHRhYmxlLi4uCi0KLSAgIFRoZXJlIGFyZSAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZQotICAgcmVsb2NhdGlvbiBvcGNvZGUgYXZhaWxhYmxlIGluIFNPTS4gIFdlIGluZGV4IHRoZSB0YWJsZSBieQotICAgdGhlIHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlIG5hbWVzIGFuZCBvcGVyYXRpb25zIGFyZSB0aG9zZQotICAgZGVmaW5lZCBieSBhLm91dF84MDAgKDQpLgotCi0gICBSaWdodCBub3cgdGhpcyB0YWJsZSBpcyBvbmx5IHVzZWQgdG8gY291bnQgYW5kIHBlcmZvcm0gbWluaW1hbAotICAgcHJvY2Vzc2luZyBvbiByZWxvY2F0aW9uIHN0cmVhbXMgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnRlcm5hbGl6ZWQKLSAgIGludG8gQkZEIGFuZCBzeW1ib2xpY2FsbHkgcHJpbnRlZCBieSB1dGlsaXRpZXMuICBUbyBtYWtlIGFjdHVhbCB1c2UgCi0gICBvZiB0aGVtIHdvdWxkIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQsIEJGRCdzIGNvbmNlcHQgb2YgcmVsb2NhdGlvbnMKLSAgIGlzIGZhciB0b28gc2ltcGxlIHRvIGhhbmRsZSBTT00gcmVsb2NhdGlvbnMuICBUaGUgYmFzaWMgYXNzdW1wdGlvbgotICAgdGhhdCBhIHJlbG9jYXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGluZGVwZW5kZW50IG9mIG90aGVyCi0gICByZWxvY2F0aW9ucyBiZWZvcmUgYW4gb2JqZWN0IGZpbGUgaXMgd3JpdHRlbiBpcyBpbnZhbGlkIGZvciBTT00uCi0KLSAgIFRoZSBTT00gcmVsb2NhdGlvbnMgYXJlIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBhcyBhIHN0cmVhbSwgdGhleQotICAgc3BlY2lmeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24KLSAgIHdoaWxlIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgZGF0YSBpbiBzb21lIG1hbm5lci4gIFRoZXkgYWxzbyBjYW4gCi0gICBzcGVjaWZ5IHRoYXQgYSB2YXJpYWJsZSBudW1iZXIgb2YgemVyb3Mgb3IgdW5pbml0aWFsaXplZCBkYXRhIGJlCi0gICBpbnNlcnRlZCBvbiBpbiB0aGUgb3V0cHV0IHNlZ21lbnQgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgU29tZQotICAgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGF0IHNvbWUgcHJldmlvdXMgcmVsb2NhdGlvbiBiZSByZS1hcHBsaWVkIGF0Ci0gICB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQvb3V0cHV0IHNlY3Rpb25zLiAgQW5kIGZpbmFsbHkgYSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIGhhdmUgZWZmZWN0cyBvbiBvdGhlciBzZWN0aW9ucyAoUl9FTlRSWSwgUl9FWElULAotICAgUl9VTldJTkRfQVVYIGFuZCBhIHZhcmlldHkgb2Ygb3RoZXJzKS4gIFRoZXJlIGlzbid0IGV2ZW4gZW5vdWdoIHJvb20KLSAgIGluIHRoZSBCRkQgcmVsb2NhdGlvbiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIHBlcmZvcm0gYWxsIHRoZSByZWxvY2F0aW9ucy4KLQotICAgRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgaGFzIHRocmVlIGZpZWxkcy4gCi0KLSAgIFRoZSBmaXJzdCBlbnRyeSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgImNsYXNzIiBvZiByZWxvY2F0aW9ucy4gIFRoaXMKLSAgIGluZGV4IGNhbiB0aGVuIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSB3aXRoaW4gdGhlIHJlbG9jYXRpb24gaXRzZWxmLgotCi0gICBUaGUgc2Vjb25kIGZpZWxkIGlzIGEgZm9ybWF0IHN0cmluZyB3aGljaCBhY3R1YWxseSBjb250cm9scyBwcm9jZXNzaW5nCi0gICBvZiB0aGUgcmVsb2NhdGlvbi4gIEl0IHVzZXMgYSBzaW1wbGUgcG9zdGZpeCBtYWNoaW5lIHRvIGRvIGNhbGN1bGF0aW9ucwotICAgYmFzZWQgb24gdmFyaWFibGVzL2NvbnN0YW50cyBmb3VuZCBpbiB0aGUgc3RyaW5nIGFuZCB0aGUgcmVsb2NhdGlvbgotICAgc3RyZWFtLiAgCi0KLSAgIFRoZSB0aGlyZCBmaWVsZCBzcGVjaWZ5cyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlbG9jYXRpb24gbWF5IHVzZSAKLSAgIGEgY29uc3RhbnQgKFYpIGZyb20gdGhlIHByZXZpb3VzIFJfREFUQV9PVkVSUklERSByYXRoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi0gICBWYXJpYWJsZXM6ICAKLSAgCi0gICBMID0gaW5wdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgRCA9IGluZGV4IGludG8gY2xhc3Mgb2YgcmVsb2NhdGlvbnMKLSAgIE0gPSBvdXRwdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgTiA9IHN0YXRlbWVudCBudW1iZXIgKHVudXNlZD8pCi0gICBPID0gc3RhY2sgb3BlcmF0aW9uCi0gICBSID0gcGFyYW1ldGVyIHJlbG9jYXRpb24gYml0cwotICAgUyA9IHN5bWJvbCBpbmRleAotICAgVCA9IGZpcnN0IDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBVID0gc2Vjb25kIDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBWID0gYSBsaXRlcmFsIGNvbnN0YW50ICh1c3VhbGx5IHVzZWQgaW4gdGhlIG5leHQgcmVsb2NhdGlvbikKLSAgIFAgPSBhIHByZXZpb3VzIHJlbG9jYXRpb24KLSAgCi0gICBMb3dlciBjYXNlIGxldHRlcnMgKHN0YXJ0aW5nIHdpdGggJ2InKSByZWZlciB0byBmb2xsb3dpbmcgCi0gICBieXRlcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAnYicgaXMgdGhlIG5leHQgMSBieXRlLAotICAgYyBpcyB0aGUgbmV4dCAyIGJ5dGVzLCBkIGlzIHRoZSBuZXh0IDMgYnl0ZXMsIGV0Yy4uLiAgCi0gICBUaGlzIGlzIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdAotICAgbWFrZXMgb3VyIGxpZmUgYSBsaXZpbmcgaGVsbC4KLQotICAgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VkIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgTm90ZQotICAgdGhlIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbC4gCi0KLSAgICcrJywgIioiIGFuZCAiPSIgcmVwcmVzZW50cyB0aGUgb2J2aW91cyBwb3N0Zml4IG9wZXJhdG9ycy4KLSAgICc8JyByZXByZXNlbnRzIGEgbGVmdCBzaGlmdC4gCi0KLSAgIFN0YWNrIE9wZXJhdGlvbnM6Ci0KLSAgIFBhcmFtZXRlciBSZWxvY2F0aW9uIEJpdHM6Ci0KLSAgIFVud2luZCBFbnRyaWVzOiAgCi0gICAKLSAgIFByZXZpb3VzIFJlbG9jYXRpb25zOiAgVGhlIGluZGV4IGZpZWxkIHJlcHJlc2VudHMgd2hpY2ggaW4gdGhlIHF1ZXVlCi0gICBvZiA0IHByZXZpb3VzIGZpeHVwcyBzaG91bGQgYmUgcmUtYXBwbGllZC4KLQotICAgTGl0ZXJhbCBDb25zdGFudHM6ICBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFkZGVuZAotICAgcGFydHMgb2YgcmVsb2NhdGlvbnMgd2hlbiB0aGVzZSBjb25zdGFudHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlCi0gICBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUgdGhlIGluc3RydWN0aW9uCi0gICBhZGRpbCBmb28tJGdsb2JhbCQtMHgxMjM0IHdvdWxkIHVzZSBhbiBvdmVycmlkZSBmb3IgIjB4MTIzNCIgcmF0aGVyCi0gICB0aGFuIHN0b3JpbmcgaXQgaW50byB0aGUgYWRkaWwgaXRzZWxmLiAgKi8KLQotc3RydWN0IGZpeHVwX2Zvcm1hdAotewotICBpbnQgRDsKLSAgY2hhciAqZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgc29tX2ZpeHVwX2Zvcm1hdHNbMjU2XSA9Ci17Ci0gIC8qIFJfTk9fUkVMT0NBVElPTiAqLwotICAwLCAgICJMRDErNCo9IiwgICAgICAgLyogMHgwMCAqLwotICAxLCAgICJMRDErNCo9IiwJLyogMHgwMSAqLwotICAyLCAgICJMRDErNCo9IiwJLyogMHgwMiAqLwotICAzLCAgICJMRDErNCo9IiwJLyogMHgwMyAqLwotICA0LCAgICJMRDErNCo9IiwJLyogMHgwNCAqLwotICA1LCAgICJMRDErNCo9IiwJLyogMHgwNSAqLwotICA2LCAgICJMRDErNCo9IiwJLyogMHgwNiAqLwotICA3LCAgICJMRDErNCo9IiwJLyogMHgwNyAqLwotICA4LCAgICJMRDErNCo9IiwJLyogMHgwOCAqLwotICA5LCAgICJMRDErNCo9IiwJLyogMHgwOSAqLwotICAxMCwgICJMRDErNCo9IiwJLyogMHgwYSAqLwotICAxMSwgICJMRDErNCo9IiwJLyogMHgwYiAqLwotICAxMiwgICJMRDErNCo9IiwJLyogMHgwYyAqLwotICAxMywgICJMRDErNCo9IiwJLyogMHgwZCAqLwotICAxNCwgICJMRDErNCo9IiwJLyogMHgwZSAqLwotICAxNSwgICJMRDErNCo9IiwJLyogMHgwZiAqLwotICAxNiwgICJMRDErNCo9IiwJLyogMHgxMCAqLwotICAxNywgICJMRDErNCo9IiwJLyogMHgxMSAqLwotICAxOCwgICJMRDErNCo9IiwJLyogMHgxMiAqLwotICAxOSwgICJMRDErNCo9IiwJLyogMHgxMyAqLwotICAyMCwgICJMRDErNCo9IiwJLyogMHgxNCAqLwotICAyMSwgICJMRDErNCo9IiwJLyogMHgxNSAqLwotICAyMiwgICJMRDErNCo9IiwJLyogMHgxNiAqLwotICAyMywgICJMRDErNCo9IiwJLyogMHgxNyAqLwotICAwLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTggKi8KLSAgMSwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE5ICovCi0gIDIsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYSAqLwotICAzLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWIgKi8KLSAgMCwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxYyAqLwotICAxLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFkICovCi0gIDIsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWUgKi8KLSAgMCwgICAiTGQxKz0iLCAgICAgICAgIC8qIDB4MWYgKi8KLSAgLyogUl9aRVJPRVMgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIwICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjEgKi8KLSAgLyogUl9VTklOSVQgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIyICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjMgKi8KLSAgLyogUl9SRUxPQ0FUSU9OICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI0ICovCi0gIC8qIFJfREFUQV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI1ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI2ICovCi0gIC8qIFJfREFUQV9QTEVCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjcgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjggKi8KLSAgLyogUl9TUEFDRV9SRUYgKi8KLSAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjkgKi8KLSAgLyogUl9SRVBFQVRFRF9JTklUICovCi0gIDAsICAgICJMND1NYjErNCo9IiwJLyogMHgyYSAqLwotICAxLCAgICAiTGI0Kj1NYjErTCo9IiwJLyogMHgyYiAqLwotICAyLCAgICAiTGI0Kj1NZDErNCo9IiwJLyogMHgyYyAqLwotICAzLCAgICAiTGQxKz1NZTErPSIsCS8qIDB4MmQgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLwotICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCi0gIC8qIFJfUENSRUxfQ0FMTCAqLwotICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLwotICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLwotICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLwotICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLwotICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLwotICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLwotICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLwotICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLwotICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLwotICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLwotICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZSAqLwotICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDNmICovCi0gIC8qIFJfQUJTX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGEgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGIgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGMgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZSAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZiAqLwotICAvKiBSX0RQX1JFTEFUSVZFICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDUwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDUxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDUyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDUzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDU0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDU1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDU2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDU3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDU4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDU5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDVhICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDViICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDVjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDVkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDVlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDVmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDYwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDYxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDYyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDYzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDY0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDY1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDY2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDY3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDY4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDY5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDZhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDZiICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDZjICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDZkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDZlICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDZmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweDcwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweDcxICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDczICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc2ICovCi0gIDAsICAgICIiLCAgICAgIAkvKiAweDc3ICovCi0gIC8qIFJfRExUX1JFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHg3OCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHg3OSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLCAgICAgICAgCS8qIDB4N2EgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2QgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdmICovCi0gIC8qIFJfQ09ERV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDgwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDgxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDgyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDgzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDg0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDg1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDg2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDg3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDg4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDg5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDhxICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDhiICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDhjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDhkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDhlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDhmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDkwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDkxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDkyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDkzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDk0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDk1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDk2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDk3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDk4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDk5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDlhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDliICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDljICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDlkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDllICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDlmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweGEwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweGExICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGEzICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE2ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTcgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE5ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWEgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWQgKi8KLSAgLyogUl9NSUxMSV9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YWUgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YWYgKi8KLSAgLyogUl9DT0RFX1BMQUJFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHhiMCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHhiMSAqLwotICAvKiBSX0JSRUFLUE9JTlQgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhiMiAqLwotICAvKiBSX0VOVFJZICovCi0gIDAsICAgICJUZT1VZT0iLCAgICAgICAvKiAweGIzICovCi0gIDEsICAgICJVZj0iLAkgICAgICAgIC8qIDB4YjQgKi8KLSAgLyogUl9BTFRfRU5UUlkgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiNSAqLwotICAvKiBSX0VYSVQgKi8KLSAgMCwgICAgIiIsCQkvKiAweGI2ICovCi0gIC8qIFJfQkVHSU5fVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjcgKi8KLSAgLyogUl9FTkRfVFJZICovCi0gIDAsICAgICJSMD0iLAkgICAgICAgIC8qIDB4YjggKi8KLSAgMSwgICAgIlJiNCo9IiwJLyogMHhiOSAqLwotICAyLCAgICAiUmQ0Kj0iLAkvKiAweGJhICovCi0gIC8qIFJfQkVHSU5fQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYiAqLwotICAvKiBSX0VORF9CUlRBQiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGJjICovCi0gIC8qIFJfU1RBVEVNRU5UICovCi0gIDAsICAgICJOYj0iLAkgICAgICAgIC8qIDB4YmQgKi8KLSAgMSwgICAgIk5jPSIsCSAgICAgICAgLyogMHhiZSAqLwotICAyLCAgICAiTmQ9IiwJICAgICAgICAvKiAweGJmICovCi0gIC8qIFJfREFUQV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzAgKi8KLSAgLyogUl9DT0RFX0VYUFIgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhjMSAqLwotICAvKiBSX0ZTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMyICovCi0gIC8qIFJfTFNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzMgKi8KLSAgLyogUl9SU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjNCAqLwotICAvKiBSX05fTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzUgKi8KLSAgLyogUl9TX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM2ICovCi0gIC8qIFJfRF9NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNyAqLwotICAvKiBSX1JfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzggKi8KLSAgLyogUl9EQVRBX09WRVJSSURFICovCi0gIDAsICAgICJWMD0iLAkgICAgICAgIC8qIDB4YzkgKi8KLSAgMSwgICAgIlZiPSIsCSAgICAgICAgLyogMHhjYSAqLwotICAyLCAgICAiVmM9IiwJICAgICAgICAvKiAweGNiICovCi0gIDMsICAgICJWZD0iLAkgICAgICAgIC8qIDB4Y2MgKi8KLSAgNCwgICAgIlZlPSIsCSAgICAgICAgLyogMHhjZCAqLwotICAvKiBSX1RSQU5TTEFURUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhjZSAqLwotICAvKiBSX0FVWF9VTldJTkQgKi8KLSAgMCwgICAgIlNkPVZmPUVmPSIsICAgIC8qIDB4Y2YgKi8KLSAgLyogUl9DT01QMSAqLwotICAwLCAgICAiT2I9IiwJICAgICAgICAvKiAweGQwICovCi0gIC8qIFJfQ09NUDIgKi8KLSAgMCwgICAgIk9iPVNkPSIsCS8qIDB4ZDEgKi8KLSAgLyogUl9DT01QMyAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkMiAqLwotICAvKiBSX1BSRVZfRklYVVAgKi8KLSAgMCwgICAgIlAiLCAgIAkgICAgICAgIC8qIDB4ZDMgKi8KLSAgMSwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDQgKi8KLSAgMiwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDUgKi8KLSAgMywgICAgIlAiLAkgICAgICAgIC8qIDB4ZDYgKi8KLSAgLyogUl9TRUNfU1RNVCAqLwotICAwLAkiIiwJCS8qIDB4ZDcgKi8KLSAgLyogUl9OMFNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDggKi8KLSAgLyogUl9OMVNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDkgKi8KLSAgLyogUl9MSU5FVEFCICovCi0gIDAsCSJFYj1TZD1WZT0iLAkvKiAweGRhICovCi0gIC8qIFJfTElORVRBQl9FU0MgKi8KLSAgMCwJIkViPU1iPSIsCS8qIDB4ZGIgKi8KLSAgLyogUl9MVFBfT1ZFUlJJREUgKi8KLSAgMCwJIiIsCQkvKiAweGRjICovCi0gIC8qIFJfQ09NTUVOVCAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkZCAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsCSIiLAkJLyogMHhkZSAqLwotICAwLAkiIiwJCS8qIDB4ZGYgKi8KLSAgMCwJIiIsCQkvKiAweGUwICovCi0gIDAsCSIiLAkJLyogMHhlMSAqLwotICAwLAkiIiwJCS8qIDB4ZTIgKi8KLSAgMCwJIiIsCQkvKiAweGUzICovCi0gIDAsCSIiLAkJLyogMHhlNCAqLwotICAwLAkiIiwJCS8qIDB4ZTUgKi8KLSAgMCwJIiIsCQkvKiAweGU2ICovCi0gIDAsCSIiLAkJLyogMHhlNyAqLwotICAwLAkiIiwJCS8qIDB4ZTggKi8KLSAgMCwJIiIsCQkvKiAweGU5ICovCi0gIDAsCSIiLAkJLyogMHhlYSAqLwotICAwLAkiIiwJCS8qIDB4ZWIgKi8KLSAgMCwJIiIsCQkvKiAweGVjICovCi0gIDAsCSIiLAkJLyogMHhlZCAqLwotICAwLAkiIiwJCS8qIDB4ZWUgKi8KLSAgMCwJIiIsCQkvKiAweGVmICovCi0gIDAsCSIiLAkJLyogMHhmMCAqLwotICAwLAkiIiwJCS8qIDB4ZjEgKi8KLSAgMCwJIiIsCQkvKiAweGYyICovCi0gIDAsCSIiLAkJLyogMHhmMyAqLwotICAwLAkiIiwJCS8qIDB4ZjQgKi8KLSAgMCwJIiIsCQkvKiAweGY1ICovCi0gIDAsCSIiLAkJLyogMHhmNiAqLwotICAwLAkiIiwJCS8qIDB4ZjcgKi8KLSAgMCwJIiIsCQkvKiAweGY4ICovCi0gIDAsCSIiLAkJLyogMHhmOSAqLwotICAwLAkiIiwJCS8qIDB4ZmEgKi8KLSAgMCwJIiIsCQkvKiAweGZiICovCi0gIDAsCSIiLAkJLyogMHhmYyAqLwotICAwLAkiIiwJCS8qIDB4ZmQgKi8KLSAgMCwJIiIsCQkvKiAweGZlICovCi0gIDAsCSIiLAkJLyogMHhmZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMV9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDQwLAotICAweDQxLAotICAweDQyLAotICAweDQzLAotICAweDQ0LAotICAweDQ1LAotICAweDQ2LAotICAweDQ3LAotICAweDQ4LAotICAweDQ5LAotICAweDRhLAotICAweDRiLAotICAweDYwLAotICAweDgwLAotICAweGEwLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMl9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDgwLAotICAweDgyLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wM19vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDAyLAotICAtMQotfTsKLQotLyogVGhlc2UgYXBwYXJlbnRseSBhcmUgbm90IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaCAoaHB1eDcpLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0FVWF9VTldJTkQKLSNkZWZpbmUgUl9BVVhfVU5XSU5EIDB4Y2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfU0VDX1NUTVQKLSNkZWZpbmUgUl9TRUNfU1RNVCAweGQ3Ci0jZW5kaWYKLQotLyogQW5kIHRoZXNlIGZpcnN0IGFwcGVhcmVkIGluIGhwdXgxMC4gICovCi0jaWZuZGVmIFJfU0hPUlRfUENSRUxfTU9ERQotI2RlZmluZSBOT19QQ1JFTF9NT0RFUwotI2RlZmluZSBSX1NIT1JUX1BDUkVMX01PREUgMHgzZQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MT05HX1BDUkVMX01PREUKLSNkZWZpbmUgUl9MT05HX1BDUkVMX01PREUgMHgzZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUIKLSNkZWZpbmUgUl9MSU5FVEFCIDB4ZGEKLSNlbmRpZgotCi0jaWZuZGVmIFJfTElORVRBQl9FU0MKLSNkZWZpbmUgUl9MSU5FVEFCX0VTQyAweGRiCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xUUF9PVkVSUklERQotI2RlZmluZSBSX0xUUF9PVkVSUklERSAweGRjCi0jZW5kaWYKLQotI2lmbmRlZiBSX0NPTU1FTlQKLSNkZWZpbmUgUl9DT01NRU5UIDB4ZGQKLSNlbmRpZgotCi0jZGVmaW5lIFNPTV9IT1dUTyhUWVBFLCBOQU1FKQlcCi0gIEhPV1RPKFRZUEUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsIE5BTUUsIGZhbHNlLCAwLCAwLCBmYWxzZSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc29tX2hwcGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRUxPQ0FUSU9OIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9EQVRBX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9QTEFCRUwifSwKLSAge1JfU1BBQ0VfUkVGLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TUEFDRV9SRUYifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfU0hPUlRfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0hPUlRfUENSRUxfTU9ERSJ9LAotICB7Ul9MT05HX1BDUkVMX01PREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xPTkdfUENSRUxfTU9ERSJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0RMVF9SRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RMVF9SRUwifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9DT0RFX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9QTEFCRUwifSwKLSAge1JfQlJFQUtQT0lOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQlJFQUtQT0lOVCJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfRU5UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VOVFJZIn0sCi0gIHtSX0FMVF9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUxUX0VOVFJZIn0sCi0gIHtSX0VYSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VYSVQifSwKLSAge1JfQkVHSU5fVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CRUdJTl9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfQkVHSU5fQlJUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX0JSVEFCIn0sCi0gIHtSX0VORF9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX0JSVEFCIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX0RBVEFfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9FWFBSIn0sCi0gIHtSX0NPREVfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9FWFBSIn0sCi0gIHtSX0ZTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0ZTRUwifSwKLSAge1JfTFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFNFTCJ9LAotICB7Ul9SU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SU0VMIn0sCi0gIHtSX05fTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTl9NT0RFIn0sCi0gIHtSX1NfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU19NT0RFIn0sCi0gIHtSX0RfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRF9NT0RFIn0sCi0gIHtSX1JfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUl9NT0RFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9UUkFOU0xBVEVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9UUkFOU0xBVEVEIn0sCi0gIHtSX0FVWF9VTldJTkQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FVWF9VTldJTkQifSwKLSAge1JfQ09NUDEsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAxIn0sCi0gIHtSX0NPTVAyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMiJ9LAotICB7Ul9DT01QMywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDMifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9TRUNfU1RNVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0VDX1NUTVQifSwKLSAge1JfTjBTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04wU0VMIn0sCi0gIHtSX04xU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OMVNFTCJ9LAotICB7Ul9MSU5FVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCIn0sCi0gIHtSX0xJTkVUQUJfRVNDLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCX0VTQyJ9LAotICB7Ul9MVFBfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xUUF9PVkVSUklERSJ9LAotICB7Ul9DT01NRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01NRU5UIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9fTsKLSAgCi0vKiBJbml0aWFsaXplIHRoZSBTT00gcmVsb2NhdGlvbiBxdWV1ZS4gIEJ5IGRlZmluaXRpb24gdGhlIHF1ZXVlIGhvbGRzCi0gICB0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSBmaXh1cHMuICAqLwotICAKLXN0YXRpYyB2b2lkCi1zb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocXVldWUpCi0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzBdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMF0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMV0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzJdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMl0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzNdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbM10uc2l6ZSA9IDA7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyByZWxvY2F0aW9uIGludG8gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2luc2VydCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gcXVldWVbMF0ucmVsb2M7Ci0gIHF1ZXVlWzFdLnNpemUgPSBxdWV1ZVswXS5zaXplOwotICBxdWV1ZVswXS5yZWxvYyA9IHA7Ci0gIHF1ZXVlWzBdLnNpemUgPSBzaXplOwotfQotCi0vKiBXaGVuIGFuIGVudHJ5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlIGlzIHJldXNlZCwgdGhlIGVudHJ5IG1vdmVzCi0gICB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9yZWxvY19xdWV1ZV9maXggKHF1ZXVlLCBpbmRleCkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGluZGV4ID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5kZXggPT0gMykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzNdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzNdLnNpemU7Ci0gICAgICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICAgICAgcXVldWVbM10uc2l6ZSA9IHF1ZXVlWzJdLnNpemU7Ci0gICAgICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgaW50Ci1zb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpZiAocXVldWVbMF0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMF0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzBdLnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChxdWV1ZVsxXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVsxXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMV0uc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHF1ZXVlWzJdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzJdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsyXS5zaXplKQotICAgIHJldHVybiAyOwotICBpZiAocXVldWVbM10ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbM10ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzNdLnNpemUpCi0gICAgcmV0dXJuIDM7Ci0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCBzaXplLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IHF1ZXVlX2luZGV4ID0gc29tX3JlbG9jX3F1ZXVlX2ZpbmQgKHAsIHNpemUsIHF1ZXVlKTsKLQotICBpZiAocXVldWVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgLyogRm91bmQgdGhpcyBpbiBhIHByZXZpb3VzIGZpeHVwLiAgVW5kbyB0aGUgZml4dXAgd2UKLQkganVzdCBidWlsdCBhbmQgdXNlIFJfUFJFVl9GSVhVUCBpbnN0ZWFkLiAgV2Ugc2F2ZWQgCi0JIGEgdG90YWwgb2Ygc2l6ZSAtIDEgYnl0ZXMgaW4gdGhlIGZpeHVwIHN0cmVhbS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCArIHF1ZXVlX2luZGV4LCBwKTsKLSAgICAgIHAgKz0gMTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSAxOwotICAgICAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIHF1ZXVlX2luZGV4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSk7Ci0gICAgICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gc2l6ZTsKLSAgICAgIHAgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0vKiBFbWl0IHRoZSBwcm9wZXIgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgdGhlIG5leHQgU0tJUAotICAgYnl0ZXMgd2l0aG91dCBhbnkgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UKLSAgIHJlbG9jYXRpb24gc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSAKLSAgIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIC8qIFVzZSBhIDQgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkgd2l0aCBhIG1heGltYWwgdmFsdWUKLSAgICAgdGhlbiBSX1BSRVZfRklYVVBzIHRvIGdldCB0aGUgZGlmZmVyZW5jZSBkb3duIHRvIGEKLSAgICAgcmVhc29uYWJsZSBzaXplLiAgKi8KLSAgaWYgKHNraXAgPj0gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIHNraXAgLT0gMHgxMDAwMDAwOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgICAgd2hpbGUgKHNraXAgPj0gMHgxMDAwMDAwKQotCXsKLQkgIHNraXAgLT0gMHgxMDAwMDAwOwotCSAgYmZkX3B1dF84IChhYmZkLCBSX1BSRVZfRklYVVAsIHApOwotCSAgcCsrOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICAvKiBObyBuZWVkIHRvIGFkanVzdCBxdWV1ZSBoZXJlIHNpbmNlIHdlIGFyZSByZXBlYXRpbmcgdGhlCi0JICAgICBtb3N0IHJlY2VudCBmaXh1cC4gICovCi0JfQotICAgIH0KLSAgCi0gIC8qIFRoZSBkaWZmZXJlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDB4MTAwMDAwMC4gIFVzZSBvbmUgCi0gICAgIG1vcmUgUl9OT19SRUxPQ0FUSU9OIGVudHJ5IHRvIGdldCB0byB0aGUgcmlnaHQgZGlmZmVyZW5jZS4gICovCi0gIGlmICgoc2tpcCAmIDMpID09IDAgJiYgc2tpcCA8PSAweGMwMDAwICYmIHNraXAgPiAwKQotICAgIHsKLSAgICAgIC8qIERpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW1wbGUgc2luZ2xlLWJ5dGUKLQkgUl9OT19SRUxPQ0FUSU9OIGVudHJ5LiAgKi8KLSAgICAgIGlmIChza2lwIDw9IDB4NjApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAoc2tpcCA+PiAyKSAtIDEsIHApOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICBwKys7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0d28gYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZSBpZiAoc2tpcCA8PSAweDEwMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyNCArICgoKHNraXAgPj4gMikgLSAxKSA+PiA4KSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMiwgcXVldWUpOwotCX0KLSAgICAgIC8qIEhhbmRsZSBpdCB3aXRoIGEgdGhyZWUgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMjggKyAoKChza2lwID4+IDIpIC0gMSkgPj4gMTYpLCBwKTsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotCX0KLSAgICB9Ci0gIC8qIFVnaC4gIFB1bnQgYW5kIHVzZSBhIDQgYnl0ZSBlbnRyeS4gICovCi0gIGVsc2UgaWYgKHNraXAgPiAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMzEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCAoc2tpcCAtIDEpID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBza2lwIC0gMSwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX0RBVEFfT1ZFUlJJREUgZml4dXBzIHRvIGhhbmRsZSBhIG5vbnplcm8gYWRkZW5kCi0gICBmcm9tIGEgQkZEIHJlbG9jYXRpb24uICBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHN1YnNwYWNlIHJlbG9jYXRpb24KLSAgIHN0cmVhbSB2aWEgU1VCU1BBQ0VfUkVMT0NfU0laRV9QOyBhbHNvIHJldHVybiB0aGUgY3VycmVudCBwb2ludGVyCi0gICBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGFkZGVuZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmICgodW5zaWduZWQpKGFkZGVuZCkgKyAweDgwIDwgMHgxMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7IAotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMCA8IDB4MTAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAyLCBwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMDAwIDwgMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9EQVRBX09WRVJSSURFICsgMywgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCA+PiAxNiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyA0LCBwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1zb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIGJmZF9yZWxvYywgc3ltX251bSwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBpbnQgc3ltX251bTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IGFyZ19iaXRzID0gSFBQQV9SX0FSR19SRUxPQyAoYmZkX3JlbG9jLT5hZGRlbmQpOwotICBpbnQgcnRuX2JpdHMgPSBhcmdfYml0cyAmIDB4MzsKLSAgaW50IHR5cGUsIGRvbmUgPSAwOwotICAKLSAgLyogWW91J2xsIG5ldmVyIGJlbGlldmUgYWxsIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSByZWxvY2F0aW9ucwotICAgICBmb3IgZnVuY3Rpb24gY2FsbHMuICBIYXZpbmcgdG8gY29tcHV0ZSBhbmQgcGFjayB0aGUgYXJndW1lbnQKLSAgICAgcmVsb2NhdGlvbiBiaXRzIGlzIHRoZSByZWFsIG5pZ2h0bWFyZS4KLSAgICAgCi0gICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGhvdyB0aGlzIHdvcmtzLCBqdXN0IGZvcmdldCBpdC4gIFlvdSByZWFsbHkKLSAgICAgZG8gbm90IHdhbnQgdG8ga25vdyBhYm91dCB0aGlzIGJyYWluZGFtYWdlLiAgKi8KLQotICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgInNpbXBsZSIgcmVsb2NhdGlvbi4gIFNpbXBsZQotICAgICByZWxvY2F0aW9ucyBoYXZlIGEgc3ltYm9sIG51bWJlciA8IDB4MTAwIGFuZCBoYXZlIHNpbXBsZSBlbmNvZGluZ3MKLSAgICAgb2YgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0gIGlmIChzeW1fbnVtIDwgMHgxMDApCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfYml0cykKLQl7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkgIHR5cGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDg6Ci0JY2FzZSAxIDw8IDggfCAxOgotCSAgdHlwZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDE6Ci0JICB0eXBlID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMToKLQkgIHR5cGUgPSAzOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDIgfCAxOgotCSAgdHlwZSA9IDQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogTm90IG9uZSBvZiB0aGUgZWFzeSBlbmNvZGluZ3MuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQotCSAgICAgaGFuZGxlZCBieSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgYmVsb3cuICAqLwotCSAgdHlwZSA9IC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHR5cGUgIT0gLTEpCi0JewotCSAgLyogQWNjb3VudCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0b28uICAqLwotCSAgaWYgKHJ0bl9iaXRzKQotCSAgICB0eXBlICs9IDU7Ci0KLQkgIC8qIEVtaXQgYSAyIGJ5dGUgcmVsb2NhdGlvbi4gIFRoZW4gc2VlIGlmIGl0IGNhbiBiZSBoYW5kbGVkCi0JICAgICB3aXRoIGEgcmVsb2NhdGlvbiB3aGljaCBpcyBhbHJlYWR5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIHR5cGUsIHApOwotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JICBkb25lID0gMTsKLQl9Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBjb3VsZCBub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2ltcGxlIHJlbG9jYXRpb24sIHRoZW4gZG8gYSBoYXJkCi0gICAgIG9uZS4gIEhhcmQgcmVsb2NhdGlvbnMgb2NjdXIgaWYgdGhlIHN5bWJvbCBudW1iZXIgd2FzIHRvbyBoaWdoIG9yIGlmCi0gICAgIHRoZSBlbmNvZGluZyBvZiBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaXMgdG9vIGNvbXBsZXguICAqLwotICBpZiAoISBkb25lKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFzayBhYm91dCB0aGVzZSBtYWdpYyBzZXF1ZW5jZXMuICBJIHRvb2sgdGhlbSBzdHJhaWdodAotCSBmcm9tIGdhcy0xLjM2IHdoaWNoIHRvb2sgdGhlbSBmcm9tIHRoZSBhLm91dCBtYW4gcGFnZS4gICovCi0gICAgICB0eXBlID0gcnRuX2JpdHM7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDYgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0MDsKLSAgICAgIGVsc2UKLQl0eXBlICs9ICgzICogKGFyZ19iaXRzID4+IDggJiAzKSArIChhcmdfYml0cyA+PiA2ICYgMykpICogNDA7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDIgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0OwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gNCAmIDMpICsgKGFyZ19iaXRzID4+IDIgJiAzKSkgKiA0OwotICAgICAgCi0gICAgICAvKiBPdXRwdXQgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVsb2NhdGlvbi4gIFRoZXNlIGRlc2NyaWJlCi0JIHRoZSBsZW5ndGggb2YgdGhlIHJlbG9jYXRpb24gYW5kIGVuY29kaW5nIHN0eWxlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEwCi0JCSArIDIgKiAoc3ltX251bSA+PSAweDEwMCkgKyAodHlwZSA+PSAweDEwMCksCi0JCSBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdHlwZSwgcCArIDEpOwotICAgICAgCi0gICAgICAvKiBOb3cgb3V0cHV0IHRoZSBzeW1ib2wgaW5kZXggYW5kIHNlZSBpZiB0aGlzIGJpemFycmUgcmVsb2NhdGlvbgotCSBqdXN0IGhhcHBlbmVkIHRvIGJlIGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLSAgICAgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMik7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotCX0KLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0KLS8qIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFgsIGJhc2UgMiwgY29uc2lkZXJpbmcgWCB1bnNpZ25lZC4gCi0gICBBYm9ydCAtMSBpZiBYIGlzIG5vdCBhIHBvd2VyIG9yIHR3byBvciBpcyB6ZXJvLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIGludCBsb2cgPSAwOwotCi0gIC8qIFRlc3QgZm9yIDAgb3IgYSBwb3dlciBvZiAyLiAgKi8KLSAgaWYgKHggPT0gMCB8fCB4ICE9ICh4ICYgLXgpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoKHggPj49IDEpICE9IDApCi0gICAgbG9nKys7Ci0gIHJldHVybiBsb2c7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhwcGFfc29tX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBHaXZlbiBhIGdlbmVyaWMgSFBQQSByZWxvY2F0aW9uIHR5cGUsIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXQsCi0gICBhbmQgYSBmaWVsZCBzZWxlY3RvciwgcmV0dXJuIG9uZSBvciBtb3JlIGFwcHJvcHJpYXRlIFNPTSByZWxvY2F0aW9ucy4gICovCi0KLWludCAqKgotaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgc3ltX2RpZmYsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZmllbGQ7Ci0gICAgIGludCBzeW1fZGlmZjsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpbnQgKmZpbmFsX3R5cGUsICoqZmluYWxfdHlwZXM7Ci0KLSAgZmluYWxfdHlwZXMgPSAoaW50ICoqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50ICopICogNik7Ci0gIGZpbmFsX3R5cGUgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLSAgaWYgKCFmaW5hbF90eXBlcyB8fCAhZmluYWxfdHlwZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgZmllbGQgc2VsZWN0b3IgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCByZWxvY2F0aW9ucyB0byBiZSAKLSAgICAgZ2VuZXJhdGVkLiAgSXQncyBpbXBvc3NpYmxlIHRvIGtub3cgYXQgdGhpcyBtb21lbnQgaWYgYWRkaXRpb25hbAotICAgICByZWxvY2F0aW9ucyB3aWxsIGJlIG5lZWRlZCwgc28gd2UgbWFrZSB0aGVtLiAgVGhlIGNvZGUgdG8gYWN0dWFsbHkKLSAgICAgd3JpdGUgdGhlIHJlbG9jYXRpb24vZml4dXAgc3RyZWFtIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZwotICAgICBhbnkgcmVkdW5kYW50IHJlbG9jYXRpb25zLiAgKi8KLSAgc3dpdGNoIChmaWVsZCkKLSAgICB7Ci0gICAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGNhc2UgZV9wc2VsOgotICAgICAgY2FzZSBlX2xwc2VsOgotICAgICAgY2FzZSBlX3Jwc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1sxXSA9IE5VTEw7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfdHNlbDoKLSAgICAgIGNhc2UgZV9sdHNlbDoKLSAgICAgIGNhc2UgZV9ydHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV90c2VsKQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCWVsc2UgaWYgKGZpZWxkID09IGVfbHRzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JZWxzZQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGNhc2UgZV9yc3NlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1NfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHNlbDoKLSAgICAgIGNhc2UgZV9yc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTl9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIGNhc2UgZV9yZHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX0RfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICBjYXNlIGVfcnJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9SX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX25zZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMVNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbmxzZWw6Ci0gICAgICBjYXNlIGVfbmxyc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTjBTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzFdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZpZWxkID09IGVfbmxzZWwpCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX05fTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1syXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbM10gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotICAgIH0KLSAgCi0gIHN3aXRjaCAoYmFzZV90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFBQQToKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBQTEFCRUxzIGdldCB0aGVpciBvd24gcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfcHNlbAotCSAgfHwgZmllbGQgPT0gZV9scHNlbAotCSAgfHwgZmllbGQgPT0gZV9ycHNlbCkKLQl7Ci0JICAvKiBBIFBMQUJFTCByZWxvY2F0aW9uIHRoYXQgaGFzIGEgc2l6ZSBvZiAzMiBiaXRzIG11c3QKLQkgICAgIGJlIGEgUl9EQVRBX1BMQUJFTC4gIEFsbCBvdGhlcnMgYXJlIFJfQ09ERV9QTEFCRUxzLiAgKi8KLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0NPREVfUExBQkVMOwotCX0KLSAgICAgIC8qIFBJQyBzdHVmZi4gICovCi0gICAgICBlbHNlIGlmIChmaWVsZCA9PSBlX3RzZWwKLQkgIHx8IGZpZWxkID09IGVfbHRzZWwKLQkgIHx8IGZpZWxkID09IGVfcnRzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RMVF9SRUw7Ci0gICAgICAvKiBBIHJlbG9jYXRpb24gaW4gdGhlIGRhdGEgc3BhY2UgaXMgYWx3YXlzIGEgZnVsbCAzMmJpdHMuICAqLwotICAgICAgZWxzZSBpZiAoZm9ybWF0ID09IDMyKQotCXsKLQkgICpmaW5hbF90eXBlID0gUl9EQVRBX09ORV9TWU1CT0w7Ci0KLQkgIC8qIElmIHRoZXJlJ3Mgbm8gU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJGRAotCSAgICAgc3ltYm9sLCB0aGVuIHNldCB0aGUgc3ltYm9sIHR5cGUgdG8gU1RfREFUQS4KLQotCSAgICAgT25seSBkbyB0aGlzIGlmIHRoZSB0eXBlIGlzIGdvaW5nIHRvIGRlZmF1bHQgbGF0ZXIgd2hlbgotCSAgICAgd2Ugd3JpdGUgdGhlIG9iamVjdCBmaWxlLgotCi0JICAgICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgbGlua2VyIG5ldmVyIGVuY291bnRlcnMgYW4KLQkgICAgIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGludm9sdmluZyBhbiBTVF9DT0RFIHN5bWJvbC4KLQotCSAgICAgVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZwotCSAgICAgdGFibGVzLgotCi0JICAgICBOb3RlIHRoYXQgb25lIGRheSB3ZSBtYXkgbmVlZCB0byBhbHNvIGVtaXQgQkVHSU5fQlJUQUIgYW5kCi0JICAgICBFTkRfQlJUQUIgdG8gcHJldmVudCB0aGUgbGlua2VyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc25zCi0JICAgICBpbiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucy4gICovCi0JICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfR09UT0ZGOgotICAgICAgLyogTW9yZSBQTEFCRUwgc3BlY2lhbCBjYXNlcy4gICovCi0gICAgICBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCSpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0hQUEFfQ09NUExFWDoKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9OT05FOgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgLyogUmlnaHQgbm93IHdlIGNhbiBkZWZhdWx0IGFsbCB0aGVzZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6Ci0gICAgICB7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JLyogSWYgd2UgaGF2ZSBzaG9ydCBhbmQgbG9uZyBwY3JlbCBtb2RlcywgdGhlbiBnZW5lcmF0ZSB0aGUgcHJvcGVyCi0JICAgbW9kZSBzZWxlY3RvciwgdGhlbiB0aGUgcGNyZWwgcmVsb2NhdGlvbi4gIFJlZHVuZGFudCBzZWxlY3RvcnMKLQkgICB3aWxsIGJlIGVsaW1pbnRlZCBhcyB0aGUgcmVsb2NzIGFyZSBzaXplZCBhbmQgZW1pdHRlZC4gICovCi0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZvcm1hdCA9PSAxNykKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfU0hPUlRfUENSRUxfTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xPTkdfUENSRUxfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotI2VuZGlmCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVjdCBlbnRyeSBpbiB0aGUgUEEgU09NIHJlbG9jYXRpb24KLSAgIGhvd3RvIHRhYmxlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfTk9fUkVMT0NBVElPTiArIDI1NSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIDA7Ci19Ci0KLS8qIFBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgYW4gb2JqZWN0LiAgU2F2ZSByZXN1bHRzIG9mIHRoaXMKLSAgIGluaXRpYWxpemF0aW9uIGluIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3NldHVwIChhYmZkLCBmaWxlX2hkcnAsIGF1eF9oZHJwLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcnA7Ci0gICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmF1eF9oZHJwOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGZvdW5kOwotCi0gIC8qIHNvbV9ta29iamVjdCB3aWxsIHNldCBiZmRfZXJyb3IgaWYgc29tX21rb2JqZWN0IGZhaWxzLiAgKi8KLSAgaWYgKHNvbV9ta29iamVjdCAoYWJmZCkgIT0gdHJ1ZSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgQkZEIGZsYWdzIGJhc2VkIG9uIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBTT00uICAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0KLSAgc3dpdGNoIChmaWxlX2hkcnAtPmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgREVNQU5EX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKERfUEFHRUQgfCBXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gICAgICBicmVhazsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIHRoZSBzYXZlZCBleGVjIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEgKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgYnJhaW5kYW1hZ2VkIE9TRjEgbGlua2VyIHN3aXRjaGVkIGV4ZWNfZmxhZ3MgYW5kIGV4ZWNfZW50cnkhCi0KLSAgICAgV2UgdXNlZCB0byBpZGVudGlmeSBPU0YxIGJpbmFyaWVzIGJhc2VkIG9uIE5FV19WRVJTSU9OX0lELCBidXQKLSAgICAgYXBwYXJlbnRseSB0aGUgbGF0ZXN0IEhQVVggbGlua2VyIGlzIHVzaW5nIE5FV19WRVJTSU9OX0lEIG5vdy4KLQotICAgICBJdCdzIGFib3V0IHRpbWUsIE9TRiBoYXMgdXNlZCB0aGUgbmV3IGlkIHNpbmNlIGF0IGxlYXN0IDE5OTI7Ci0gICAgIEhQVVggZGlkbid0IHN0YXJ0IHRpbGwgbmVhcmx5IDE5OTUhLgotICAgIAotICAgICBUaGUgbmV3IGFwcHJvYWNoIGV4YW1pbmVzIHRoZSBlbnRyeSBmaWVsZC4gIElmIGl0J3MgemVybyBvciBub3QgNAotICAgICBieXRlIGFsaWduZWQgdGhlbiBpdCdzIG5vdCBhIHByb3BlciBjb2RlIGFkZHJlc3MgYW5kIHdlIGd1ZXNzIGl0J3MKLSAgICAgcmVhbGx5IHRoZSBleGVjdXRhYmxlIGZsYWdzLiAgKi8KLSAgZm91bmQgPSAwOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID49IHNlY3Rpb24tPnZtYQotCSAgJiYgYXV4X2hkcnAtPmV4ZWNfZW50cnkgPCBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUpCi0JZm91bmQgPSAxOwotICAgIH0KLSAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID09IDAKLSAgICAgIHx8IChhdXhfaGRycC0+ZXhlY19lbnRyeSAmIDB4MykgIT0gMAotICAgICAgfHwgISBmb3VuZCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19lbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZW50cnkgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9ocHBhLCBwYTEwKTsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF90b3RhbDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzYXZlZCBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSB0byBOVUxMLiAgCi0gICAgIFNhdmUgaW1wb3J0YW50IG9mZnNldHMgYW5kIHNpemVzIGZyb20gdGhlIFNPTSBoZWFkZXIgaW50bwotICAgICB0aGUgQkZELiAgKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gKGNoYXIgICopIE5VTEw7Ci0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IChzb21fc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3Nfc2l6ZTsKLSAgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9sb2NhdGlvbiArIGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uCi0JCQkJKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uCi0JCQkJICArIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQgPSBmaWxlX2hkcnAtPnN5c3RlbV9pZDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ29udmVydCBhbGwgb2YgdGhlIHNwYWNlIGFuZCBzdWJzcGFjZSBpbmZvIGludG8gQkZEIHNlY3Rpb25zLiAgRWFjaCBzcGFjZQotICAgY29udGFpbnMgYSBudW1iZXIgb2Ygc3Vic3BhY2VzLCB3aGljaCBpbiB0dXJuIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4KLSAgIHJlZ2lvbnMgb2YgdGhlIGV4ZWMgZmlsZSwgYW5kIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHByb2dyYW0gcnVucyBpbi4KLSAgIEJGRCBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIHNwYWNlcyB3aWxsIG92ZXJsYXAgdGhlIHNlY3Rpb25zIGZvciB0aGUKLSAgIGFzc29jaWF0ZWQgc3Vic3BhY2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNldHVwX3NlY3Rpb25zIChhYmZkLCBmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGNoYXIgKnNwYWNlX3N0cmluZ3M7Ci0gIHVuc2lnbmVkIGludCBzcGFjZV9pbmRleCwgaTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2Vfc2VjdGlvbnMsICpzZWN0aW9uOwotCi0gIC8qIEZpcnN0LCByZWFkIGluIHNwYWNlIG5hbWVzICovCi0KLSAgc3BhY2Vfc3RyaW5ncyA9IGJmZF9tYWxsb2MgKGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpOwotICBpZiAoIXNwYWNlX3N0cmluZ3MgJiYgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiwgCi0gIAkJU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChzcGFjZV9zdHJpbmdzLCAxLCBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplLCBhYmZkKQotICAgICAgIT0gZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBzcGFjZSBkaWN0aW9uYXJpZXMsIGJ1aWxkaW5nIHVwIHNlY3Rpb25zICovCi0gIGZvciAoc3BhY2VfaW5kZXggPSAwOyBzcGFjZV9pbmRleCA8IGZpbGVfaGRyLT5zcGFjZV90b3RhbDsgc3BhY2VfaW5kZXgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3BhY2U7Ci0gICAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3Vic3BhY2UsIHNhdmVfc3Vic3BhY2U7Ci0gICAgICBpbnQgc3Vic3BhY2VfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqc3BhY2VfYXNlY3Q7Ci0gICAgICBjaGFyICpuZXduYW1lOwotCi0gICAgICAvKiBSZWFkIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGVsZW1lbnQgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2VfaW5kZXggKiBzaXplb2Ygc3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnNwYWNlLCAxLCBzaXplb2Ygc3BhY2UsIGFiZmQpICE9IHNpemVvZiBzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHNwYWNlIG5hbWUgc3RyaW5nICovCi0gICAgICBzcGFjZS5uYW1lLm5fbmFtZSA9IHNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotICAgICAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIGl0ICovCi0gICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotICAgICAgaWYgKCFuZXduYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzcGFjZS5uYW1lLm5fbmFtZSk7Ci0JCQkgICAKLSAgICAgIHNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICAgICAgaWYgKCFzcGFjZV9hc2VjdCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgIGlmIChzcGFjZS5pc19sb2FkYWJsZSA9PSAwKQotCXNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gICAgICAvKiBTZXQgdXAgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BhY2UuICAqLwotICAgICAgaWYgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc3BhY2VfYXNlY3QsIHNwYWNlLmlzX2RlZmluZWQsCi0JCQkJCSAgc3BhY2UuaXNfcHJpdmF0ZSwgc3BhY2Uuc29ydF9rZXksCi0JCQkJCSAgc3BhY2Uuc3BhY2VfbnVtYmVyKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSWYgdGhlIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMsIHRoZW4gd2UncmUgZG9uZS4gICovCi0gICAgICBpZiAoc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93LCByZWFkIGluIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogU2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2VzIGZvciBsb29wIGJlbG93ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzdGFydCBhZGRyZXNzIGFuZCBmaWxlIGxvYyBmcm9tIHRoZSBmaXJzdCBzdWJzcGFjZSByZWNvcmQgKi8KLSAgICAgIHNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLSAgICAgIHNwYWNlX2FzZWN0LT5maWxlcG9zID0gc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0gICAgICBpZiAoc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBzYXZlX3N1YnNwYWNlIHNvIHdlIGNhbiByZWxpYWJseSBkZXRlcm1pbmUgaWYgdGhpcwotCSBsb29wIHBsYWNlZCBhbnkgdXNlZnVsIHZhbHVlcyBpbnRvIGl0LiAgKi8KLSAgICAgIG1lbXNldCAoJnNhdmVfc3Vic3BhY2UsIDAsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0KLSAgICAgIC8qIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2VzLCBidWlsZGluZyB1cCBtb3JlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2luZGV4ID0gMDsgc3Vic3BhY2VfaW5kZXggPCBzcGFjZS5zdWJzcGFjZV9xdWFudGl0eTsKLQkgICBzdWJzcGFjZV9pbmRleCsrKQotCXsKLQkgIGFzZWN0aW9uICpzdWJzcGFjZV9hc2VjdDsKLQotCSAgLyogUmVhZCBpbiB0aGUgbmV4dCBzdWJzcGFjZSAqLwotCSAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZXR1cCB0aGUgc3Vic3BhY2UgbmFtZSBzdHJpbmcgKi8KLQkgIHN1YnNwYWNlLm5hbWUubl9uYW1lID0gc3Vic3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0JICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN1YnNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotCSAgaWYgKCFuZXduYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHN0cmNweSAobmV3bmFtZSwgc3Vic3BhY2UubmFtZS5uX25hbWUpOwotCi0JICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgdGhpcyBzdWJzcGFjZSAqLwotCSAgc3Vic3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0JICBpZiAoIXN1YnNwYWNlX2FzZWN0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU3RvcmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzdWJzcGFjZV9hc2VjdCwgc3BhY2VfYXNlY3QsCi0JCQkJCQkgc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cywKLQkJCQkJCSBzdWJzcGFjZS5zb3J0X2tleSwKLQkJCQkJCSBzdWJzcGFjZS5xdWFkcmFudCkgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBLZWVwIGFuIGVhc3kgbWFwcGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBhbmQgc2VjdGlvbnMuIAotCSAgICAgTm90ZSB3ZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgc3Vic3BhY2VzIGluIHRoZQotCSAgICAgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFNvIHRvIG1ha2UgdGhlIHRhcmdldCBpbmRleCBjb21lIG91dCBjb3JyZWN0bHksIHdlCi0JICAgICBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlIGhlYWRlciBpbiB0YXJnZXQKLQkgICAgIGluZGV4LCB0aGVuIHNvcnQgdXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZQotCSAgICAgaGVhZGVyIGFzIHRoZSBrZXkuICBUaGVuIHdlIGNhbiBhc3NpZ24gY29ycmVjdAotCSAgICAgc3Vic3BhY2UgaW5kaWNlcy4gICovCi0JICB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIHN1YnNwYWNlX2FzZWN0LT50YXJnZXRfaW5kZXggPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN1YnNwYWNlKTsKLQotCSAgLyogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUvU0VDX0RBVEEgYXMgc3BlY2lmaWVkCi0JICAgICBieSB0aGUgYWNjZXNzX2NvbnRyb2xfYml0cyBpbiB0aGUgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIHN3aXRjaCAoc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cyA+PiA0KQotCSAgICB7Ci0JICAgIC8qIFJlYWRvbmx5IGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBOb3JtYWwgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFJlYWRvbmx5IGNvZGUgYW5kIHRoZSBnYXRld2F5cy4KLQkgICAgICAgR2F0ZXdheXMgaGF2ZSBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBtYXAKLQkgICAgICAgaW50byBhbnl0aGluZyBCRkQga25vd3MgYWJvdXQuICAqLwotCSAgICBjYXNlIDB4MjoKLQkgICAgY2FzZSAweDQ6Ci0JICAgIGNhc2UgMHg1OgotCSAgICBjYXNlIDB4NjoKLQkgICAgY2FzZSAweDc6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIGR5bmFtaWMgKHdyaXRhYmxlKSBjb2RlLiAgKi8KLQkgICAgY2FzZSAweDM6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIGlmIChzdWJzcGFjZS5kdXBfY29tbW9uIHx8IHN1YnNwYWNlLmlzX2NvbW1vbikgCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgZWxzZSBpZiAoc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoID4gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLQkgIGlmIChzdWJzcGFjZS5pc19sb2FkYWJsZSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgZWxzZQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotCSAgaWYgKHN1YnNwYWNlLmNvZGVfb25seSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCi0JICAvKiBCb3RoIGZpbGVfbG9jX2luaXRfdmFsdWUgYW5kIGluaXRpYWxpemF0aW9uX2xlbmd0aCB3aWxsCi0JICAgICBiZSB6ZXJvIGZvciBhIEJTUyBsaWtlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID09IDAKLQkgICAgICAmJiBzdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGggPT0gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzICY9IH4oU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucy4KLQkgICAgIFRoZSBmaXh1cF9yZXF1ZXN0X3F1YW50aXR5IGlzIGEgYnl0ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZgotCSAgICAgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW07IGl0IGlzIG5vdCB0aGUgYWN0dWFsIG51bWJlcgotCSAgICAgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5ICE9IDApCi0JICAgIHsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxfZmlsZXBvcyA9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfaW5kZXg7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2VfYXNlY3QpLT5yZWxvY19zaXplCi0JCT0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKLQkgICAgICAvKiBXZSBjYW4gbm90IGRldGVybWluZSB0aGlzIHlldC4gIFdoZW4gd2UgcmVhZCBpbiB0aGUgCi0JCSByZWxvY2F0aW9uIHRhYmxlIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluLiAgKi8KLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsb2NfY291bnQgPSAtMTsKLQkgICAgfQotCi0JICAvKiBVcGRhdGUgc2F2ZV9zdWJzcGFjZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA+IHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQkgICAgc2F2ZV9zdWJzcGFjZSA9IHN1YnNwYWNlOwotCi0JICBzdWJzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5maWxlcG9zID0gKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgICsgY3VycmVudF9vZmZzZXQpOwotCSAgc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0JICBpZiAoc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGEgLm8gd2hpY2ggZGVmaW5lcyBzeW1ib2xzIGluIG90aGVyd2lzZQotICAgICAgICAgZW1wdHkgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCXsKLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAwOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNldHVwIHRoZSBzaXplcyBmb3IgdGhlIHNwYWNlIHNlY3Rpb24gYmFzZWQgdXBvbiB0aGUgaW5mbyBpbiB0aGUKLQkgICAgIGxhc3Qgc3Vic3BhY2Ugb2YgdGhlIHNwYWNlLiAgKi8KLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9zdGFydAotCQkJCSAgICAgICAtIHNwYWNlX2FzZWN0LT52bWEKLQkJCQkgICAgICAgKyBzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCk7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gKHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAtIHNwYWNlX2FzZWN0LT5maWxlcG9zCi0JCQkJICAgICsgc2F2ZV9zdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGgpOwotCX0KLSAgICB9Ci0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHJlYWQgaW4gYWxsIHRoZSBzdWJzcGFjZSByZWNvcmRzLCB3ZSBuZWVkIHRvIGFzc2lnbgotICAgICBhIHRhcmdldCBpbmRleCB0byBlYWNoIHN1YnNwYWNlLiAgKi8KLSAgc3Vic3BhY2Vfc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHRvdGFsX3N1YnNwYWNlcwotCQkJCQkJKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldID0gc2VjdGlvbjsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIHFzb3J0IChzdWJzcGFjZV9zZWN0aW9ucywgdG90YWxfc3Vic3BhY2VzLAotCSBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3N1YnNwYWNlcyk7Ci0gIAotICAvKiBzdWJzcGFjZV9zZWN0aW9ucyBpcyBub3cgc29ydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc3Vic3BhY2VzCi0gICAgIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICBBc3NpZ24gYW4gaW5kZXggdG8gZWFjaCBvbmUgbm93LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3N1YnNwYWNlczsgaSsrKQotICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldLT50YXJnZXRfaW5kZXggPSBpOwotCi0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGEgU09NIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgZmlsZV9oZHI7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgYXV4X2hkcjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBzb21fZW50cnkgc29tX2VudHJ5OwotI2RlZmluZSBFTlRSWV9TSVpFIHNpemVvZihzdHJ1Y3Qgc29tX2VudHJ5KQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCFfUEFfUklTQ19JRCAoZmlsZV9oZHIuc3lzdGVtX2lkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGZpbGVfaGRyLmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfTUFHSUNfQ05YCi0gICAgY2FzZSBTSEFSRURfTUFHSUNfQ05YOgotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIEVYRUNMSUJNQUdJQwotICAgIGNhc2UgRVhFQ0xJQk1BR0lDOgotICAgICAgLyogUmVhZCB0aGUgbHN0IGhlYWRlciBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTT00gZGlyZWN0b3J5IGJlZ2lucyAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIFNMU1RIRFIsIGFiZmQpICE9IFNMU1RIRFIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFBvc2l0aW9uIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfaGVhZGVyLmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzb21fZW50cnksIDEsIEVOVFJZX1NJWkUsIGFiZmQpICE9IEVOVFJZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE5vdyBwb3NpdGlvbiB0byB0aGUgZmlyc3QgU09NICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29tX2VudHJ5LmxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBjdXJyZW50X29mZnNldCA9IHNvbV9lbnRyeS5sb2NhdGlvbjsKLQotICAgICAgLyogQW5kIGZpbmFsbHksIHJlLXJlYWQgdGhlIHNvbSBoZWFkZXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmaWxlX2hkci52ZXJzaW9uX2lkICE9IFZFUlNJT05fSUQKLSAgICAgICYmIGZpbGVfaGRyLnZlcnNpb25faWQgIT0gTkVXX1ZFUlNJT05fSUQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGF1eF9oZWFkZXJfc2l6ZSBmaWVsZCBpbiB0aGUgZmlsZSBoZWFkZXIgaXMgemVybywgdGhlbiB0aGlzCi0gICAgIG9iamVjdCBpcyBhbiBpbmNvbXBsZXRlIGV4ZWN1dGFibGUgKGEgLm8gZmlsZSkuICBEbyBub3QgdHJ5IHRvIHJlYWQKLSAgICAgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4gICovCi0gIG1lbXNldCAoJmF1eF9oZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICBpZiAoZmlsZV9oZHIuYXV4X2hlYWRlcl9zaXplICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGF1eF9oZHIsIDEsIEFVWF9IRFJfU0laRSwgYWJmZCkgIT0gQVVYX0hEUl9TSVpFKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIGlmICghc2V0dXBfc2VjdGlvbnMgKGFiZmQsICZmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpKQotICAgIHsKLSAgICAgIC8qIHNldHVwX3NlY3Rpb25zIGRvZXMgbm90IGJ1YmJsZSB1cCBhIGJmZCBlcnJvciBjb2RlLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbGlkIFNPTSBvYmplY3QuICBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgcmV0dXJuIHNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsICZmaWxlX2hkciwgJmF1eF9oZHIsIGN1cnJlbnRfb2Zmc2V0KTsKLX0KLQotLyogQ3JlYXRlIGEgU09NIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnRkYXRhLnNvbV9kYXRhID0gKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnNvbV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlIGhlYWRlci4gIFRoaXMgcm91dGluZSBtYWtlcwotICAgbm90IGF0dGVtcHQgYXQgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBhIGZ1bGwgZXhlY3V0YWJsZTsgaXQKLSAgIGlzIG9ubHkgbWVhbnQgdG8gaGFuZGxlIHJlbG9jYXRhYmxlIG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3ByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTWFrZSBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gIGZpbGVfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSk7Ci0gIGlmIChmaWxlX2hkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCkgPSBmaWxlX2hkcjsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotCi0gICAgICAvKiBNYWtlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gICAgICBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gICAgICBpZiAob2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBERU1BTkRfTUFHSUM7Ci0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSEFSRV9NQUdJQzsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNITF9NQUdJQzsKLSNlbmRpZgotICAgICAgZWxzZQotCWZpbGVfaGRyLT5hX21hZ2ljID0gRVhFQ19NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxlX2hkci0+YV9tYWdpYyA9IFJFTE9DX01BR0lDOwotCi0gIC8qIE9ubHkgbmV3IGZvcm1hdCBTT00gaXMgc3VwcG9ydGVkLiAgKi8KLSAgZmlsZV9oZHItPnZlcnNpb25faWQgPSBORVdfVkVSU0lPTl9JRDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBhbmQgZW1iZWRkaW5nIHRpbWVzdGFtcHMgaXMgbm90IGFsd2F5cwotICAgICBhIHdpc2UgdGhpbmcgdG8gZG8sIGl0IG1ha2VzIGNvbXBhcmluZyBvYmplY3RzIGR1cmluZyBhIG11bHRpLXN0YWdlCi0gICAgIGJvb3RzdHJhcCBkaWZmaWN1bHQuICAqLwotICBmaWxlX2hkci0+ZmlsZV90aW1lLnNlY3MgPSAwOwotICBmaWxlX2hkci0+ZmlsZV90aW1lLm5hbm9zZWNzID0gMDsgCi0KLSAgZmlsZV9oZHItPmVudHJ5X3NwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X3N1YnNwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X29mZnNldCA9IDA7Ci0gIGZpbGVfaGRyLT5wcmVzdW1lZF9kcCA9IDA7Ci0KLSAgLyogTm93IGl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMgdHJhbnNsYXRpbmcgaW5mb3JtYXRpb24gZnJvbQotICAgICBCRkQgc2VjdGlvbnMgdG8gU09NIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyB3aGljaCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIGEgc3BhY2Ugb3IKLQkgc3Vic3BhY2UuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBTZXQgc3BhY2UgYXR0cmlidXRlcy4gIE5vdGUgbW9zdCBhdHRyaWJ1dGVzIG9mIFNPTSBzcGFjZXMKLQkgICAgIGFyZSBzZXQgYmFzZWQgb24gdGhlIHN1YnNwYWNlcyBpdCBjb250YWlucy4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bG9hZGVyX2ZpeF9pbmRleCA9IC0xOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmluaXRfcG9pbnRlcl9pbmRleCA9IC0xOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zb3J0X2tleSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19kZWZpbmVkID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQ7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfcHJpdmF0ZSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNwYWNlX251bWJlciA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgc3Vic3BhY2UgYXR0cmlidXRlcy4gIEJhc2ljIHN0dWZmIGlzIGRvbmUgaGVyZSwgYWRkaXRpb25hbAotCSAgICAgYXR0cmlidXRlcyBhcmUgZmlsbGVkIGluIGxhdGVyIGFzIG1vcmUgaW5mb3JtYXRpb24gYmVjb21lcwotCSAgICAgYXZhaWxhYmxlLiAgKi8KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19JU19DT01NT04pCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZHVwX2NvbW1vbiA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2NvbW1vbiA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmNvZGVfb25seSA9IDE7Ci0KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9zdGFydCA9IAotCSAgICBzZWN0aW9uLT52bWE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2VfbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aW5pdGlhbGl6YXRpb25fbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWxpZ25tZW50ID0gCi0JICAgIDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zb3J0X2tleSA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFjY2Vzc19jb250cm9sX2JpdHMgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnF1YWRyYW50ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQ7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3NwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgIT0gc2VjdGlvbgotICAgICAgJiYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICE9IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzdWJzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNlY3Rpb24KLSAgICAgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICA9PSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3Vic3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNwYWNlIGNvbnRhaW5pbnMgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSXQKLSAgIGlzIHNhZmUgdG8gYXNzdW1lIHNwYWNlIHJlYWxseSBpcyBhIHNwYWNlLCBhbmQgc3Vic3BhY2UgcmVhbGx5Ci0gICBpcyBhIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19jb250YWluZXIgKHNwYWNlLCBzdWJzcGFjZSkKLSAgICAgYXNlY3Rpb24gKnNwYWNlLCAqc3Vic3BhY2U7Ci17Ci0gIHJldHVybiAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzcGFjZQotCSAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAgICAgPT0gc3BhY2UpKTsKLX0KLQotLyogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgICBjb3VudCArPSBzb21faXNfc3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3Vic3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIGNvdW50ICs9IHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3ltMSBhbmQgc3ltMi4KLQotICAgV2UgZGVzaXJlIHN5bWJvbHMgdG8gYmUgb3JkZXJlZCBzdGFydGluZyB3aXRoIHRoZSBzeW1ib2wgd2l0aCB0aGUKLSAgIGhpZ2hlc3QgcmVsb2NhdGlvbiBjb3VudCBkb3duIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgbG93ZXN0IHJlbG9jYXRpb24KLSAgIGNvdW50LiAgRG9pbmcgc28gY29tcGFjdHMgdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zeW1zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXN5bWJvbCAqKnN5bTEgPSAoYXN5bWJvbCAqKikgYXJnMTsKLSAgYXN5bWJvbCAqKnN5bTIgPSAoYXN5bWJvbCAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgLyogR2V0IHJlbG9jYXRpb24gY291bnQgZm9yIGVhY2ggc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBjb3VudAotICAgICBpcyBzdG9yZWQgaW4gdGhlIHVkYXRhIHBvaW50ZXIgZm9yIHNlY3Rpb24gc3ltYm9scyEgICovCi0gIGlmICgoKnN5bTEpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDEgPSAoKnN5bTEpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQxID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMSktPnJlbG9jX2NvdW50OwotCi0gIGlmICgoKnN5bTIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDIgPSAoKnN5bTIpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQyID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMiktPnJlbG9jX2NvdW50OwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoY291bnQxIDwgY291bnQyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChjb3VudDEgPiBjb3VudDIpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN1YnNwYWNlMQotICAgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zdWJzcGFjZXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc2VjdGlvbiAqKnN1YnNwYWNlMSA9IChhc2VjdGlvbiAqKikgYXJnMTsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTIgPSAoYXNlY3Rpb24gKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIGlmICgoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQZXJmb3JtIHZhcmlvdXMgd29yayBpbiBwcmVwYXJhdGlvbiBmb3IgZW1pdHRpbmcgdGhlIGZpeHVwIHN0cmVhbS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLCBzeW1zLCBudW1fc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1fc3ltczsKLXsKLSAgaW50IGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLSAgLyogTW9zdCBTT00gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGEgc3ltYm9sIGhhdmUgYSBsZW5ndGggd2hpY2ggaXMKLSAgICAgZGVwZW5kZW50IG9uIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sLiAgU28gc3ltYm9scyB3aGljaCBhcmUKLSAgICAgdXNlZCBvZnRlbiBpbiByZWxvY2F0aW9ucyBzaG91bGQgaGF2ZSBhIHNtYWxsIGluZGV4LiAgKi8KLQotICAvKiBGaXJzdCBpbml0aWFsaXplIHRoZSBjb3VudGVycyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgYSBzZWN0aW9uIHN5bWJvbDsgdGhlc2UgaGF2ZSBubyBwb2ludGVycyBiYWNrIHRvIHRoZQotCSBTT00gc3ltYm9sIGluZm8uICBTbyB3ZSBqdXN0IHVzZSB0aGUgdWRhdGEgZmllbGQgdG8gaG9sZCB0aGUKLQkgcmVsb2NhdGlvbiBjb3VudC4gICovCi0gICAgICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKSA9PSBOVUxMCi0JICB8fCBzeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQl7Ci0JICBzeW1zW2ldLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW1zW2ldLT51ZGF0YS5pID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKS0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB0aGUgY291bnRlcnMgYXJlIGluaXRpYWxpemVkLCBtYWtlIGEgd2VpZ2h0ZWQgY291bnQKLSAgICAgb2YgaG93IG9mdGVuIGEgZ2l2ZW4gc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIERvZXMgdGhpcyBzZWN0aW9uIGhhdmUgYW55IHJlbG9jYXRpb25zPyAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCByZWxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgYXJlbGVudCAqcmVsb2MgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbltpXTsKLQkgIGludCBzY2FsZTsKLQotCSAgLyogQSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlICpBQlMqIHNlY3Rpb24gcmVhbGx5Ci0JICAgICBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgTGlrZXdpc2UgaWYgdGhlIHN5bWJvbCBpc24ndCBhc3NvY2lhdGVkCi0JICAgICB3aXRoIGFueSBzZWN0aW9uLiAgKi8KLQkgIGlmIChyZWxvYy0+c3ltX3B0cl9wdHIgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNjYWxpbmcgdG8gZW5jb3VyYWdlIHN5bWJvbHMgaW52b2x2ZWQgaW4gUl9EUF9SRUxBVElWRSAKLQkgICAgIGFuZCBSX0NPREVfT05FX1NZTUJPTCByZWxvY2F0aW9ucyB0byBjb21lIGZpcnN0LiAgVGhlc2UKLQkgICAgIHR3byByZWxvY2F0aW9ucyBoYXZlIHNpbmdsZSBieXRlIHZlcnNpb25zIGlmIHRoZSBzeW1ib2wKLQkgICAgIGluZGV4IGlzIHZlcnkgc21hbGwuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0RQX1JFTEFUSVZFCi0JICAgICAgfHwgcmVsb2MtPmhvd3RvLT50eXBlID09IFJfQ09ERV9PTkVfU1lNQk9MKQotCSAgICBzY2FsZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNjYWxlID0gMTsKLQotCSAgLyogSGFuZGxlIHNlY3Rpb24gc3ltYm9scyBieSBzdG9yaW5nIHRoZSBjb3VudCBpbiB0aGUgdWRhdGEKLQkgICAgIGZpZWxkLiAgSXQgd2lsbCBub3QgYmUgdXNlZCBhbmQgdGhlIGNvdW50IGlzIHZlcnkgaW1wb3J0YW50Ci0JICAgICBmb3IgdGhlc2Ugc3ltYm9scy4gICovCi0JICBpZiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgewotCSAgICAgICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSA9Ci0JCSgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSArIHNjYWxlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEEgbm9ybWFsIHN5bWJvbC4gIEluY3JlbWVudCB0aGUgY291bnQuICAqLwotCSAgc29tX3N5bWJvbF9kYXRhICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+cmVsb2NfY291bnQgKz0gc2NhbGU7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0aGUgY2Fub25pY2FsCi0gICAgIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBudW1fc3ltcywgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bXMpOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IHNvcnRlZF9zeW1zOwotCi0gIC8qIENvbXB1dGUgdGhlIHN5bWJvbCBpbmRleGVzLCB0aGV5IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSByZWxvY2F0aW9uCi0gICAgIGNvZGUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBBIHNlY3Rpb24gc3ltYm9sLiAgQWdhaW4sIHRoZXJlIGlzIG5vIHBvaW50ZXIgdG8gYmFja2VuZCBzeW1ib2wKLQkgaW5mb3JtYXRpb24sIHNvIHdlIHJldXNlIHRoZSB1ZGF0YSBmaWVsZCBhZ2Fpbi4gICovCi0gICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXNvcnRlZF9zeW1zW2ldLT51ZGF0YS5pID0gaTsKLSAgICAgIGVsc2UKLSAgICAgICAgc29tX3N5bWJvbF9kYXRhIChzb3J0ZWRfc3ltc1tpXSktPmluZGV4ID0gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgdG90YWxfcmVsb2Nfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9yZWxvY19zaXplcDsKLXsKLSAgdW5zaWduZWQgaW50IGksIGo7Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IG51bV9zcGFjZXMgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWw7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogQWxsIHRoZSBmaXh1cHMgZm9yIGEgcGFydGljdWxhciBzdWJzcGFjZSBhcmUgZW1pdHRlZCBpbiBhIHNpbmdsZQotICAgICBzdHJlYW0uICBBbGwgdGhlIHN1YnNwYWNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNwYWNlIGFyZSBlbWl0dGVkCi0gICAgIGFzIGEgc2luZ2xlIHN0cmVhbS4KLQotICAgICBTbywgdG8gZ2V0IGFsbCB0aGUgbG9jYXRpb25zIGNvcnJlY3Qgb25lIG11c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUKLSAgICAgc3BhY2VzLCBmb3IgZWFjaCBzcGFjZSBpdGVyYXRlIHRocm91Z2ggaXRzIHN1YnNwYWNlcyBhbmQgb3V0cHV0IGEKLSAgICAgZml4dXBzIHN0cmVhbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpbnQgcmVsb2Nfb2Zmc2V0LCBjdXJyZW50X3JvdW5kaW5nX21vZGU7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0gCSAgaW50IGN1cnJlbnRfY2FsbF9tb2RlOwotI2VuZGlmCi0KLQkgIC8qIEZpbmQgYSBzdWJzcGFjZSBvZiB0aGlzIHNwYWNlLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgc3Vic3BhY2UgZG9lcyBub3QgaGF2ZSByZWFsIGRhdGEsIHRoZW4gd2UgYXJlCi0JICAgICBmaW5pc2VkIHdpdGggaXQuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCQk9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHNvbWUgcmVsb2NhdGlvbnMuICBQdXQgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBpbmRleCBpbnRvIHRoZSBzdWJzcGFjZSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkgICAgPSB0b3RhbF9yZWxvY19zaXplOwotCi0JICAvKiBUbyBtYWtlIGxpZmUgZWFzaWVyIHN0YXJ0IG92ZXIgd2l0aCBhIGNsZWFuIHNsYXRlIGZvciAKLQkgICAgIGVhY2ggc3Vic3BhY2UuICBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGZvciB0aGlzIHN1YnNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIG91dCBpdHMgZml4dXAKLQkgICAgIHN0cmVhbS4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZSwgU0VFS19TRVQpIDwgMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBCdWZmZXIgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBKdXN0IHBlcmZvcm0gc29tZQotCSAgICAgaW5pdGlhbGl6YXRpb24gaGVyZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0JICByZWxvY19vZmZzZXQgPSAwOwotCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IFJfTl9NT0RFOwotI2lmbmRlZiBOT19QQ1JFTF9NT0RFUwotCSAgY3VycmVudF9jYWxsX21vZGUgPSBSX1NIT1JUX1BDUkVMX01PREU7Ci0jZW5kaWYKLQotCSAgLyogVHJhbnNsYXRlIGVhY2ggQkZEIHJlbG9jYXRpb24gaW50byBvbmUgb3IgbW9yZSBTT00gCi0JICAgICByZWxvY2F0aW9ucy4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKmJmZF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW2pdOwotCSAgICAgIHVuc2lnbmVkIGludCBza2lwOwotCSAgICAgIGludCBzeW1fbnVtOwotCi0JICAgICAgLyogR2V0IHRoZSBzeW1ib2wgbnVtYmVyLiAgUmVtZW1iZXIgaXQncyBzdG9yZWQgaW4gYSAKLQkJIHNwZWNpYWwgcGxhY2UgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0JICAgICAgaWYgKCgqYmZkX3JlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCQlzeW1fbnVtID0gKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQkgICAgICBlbHNlCi0JCXN5bV9udW0gPSBzb21fc3ltYm9sX2RhdGEgKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+aW5kZXg7Ci0JICAgICAgCi0JICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBjb3VwbGUgcmVsb2NhdGlvbnMsCi0JCSB0aGVuIGR1bXAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEFsc28gcmVpbml0aWFsaXplCi0JCSB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gCi0KLQkJIE5vIHNpbmdsZSBCRkQgcmVsb2NhdGlvbiBjb3VsZCBldmVyIHRyYW5zbGF0ZSBpbnRvIG1vcmUKLQkJIHRoYW4gMTAwIGJ5dGVzIG9mIFNPTSByZWxvY2F0aW9ucyAoMjBieXRlcyBpcyBwcm9iYWJseSB0aGUKLQkJIHVwcGVyIGxpbWl0LCBidXQgbGVhdmUgbG90cyBvZiBzcGFjZSBmb3IgZ3Jvd3RoKS4gICovCi0JICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyAxMDAgPiBTT01fVE1QX0JVRlNJWkUpCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBwID0gdG1wX3NwYWNlOwotCQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0JCX0KLQotCSAgICAgIC8qIEVtaXQgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgYW55IGJ5dGVzIHdoaWNoIHdlcmUKLQkJIHNraXBwZWQuICAqLwotCSAgICAgIHNraXAgPSBiZmRfcmVsb2MtPmFkZHJlc3MgLSByZWxvY19vZmZzZXQ7Ci0JICAgICAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLAotCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCSAgICAgIC8qIFVwZGF0ZSByZWxvY19vZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KLQotCQkgTWFueSByZWxvY2F0aW9ucyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcy4gIFRoZXkKLQkJIGFyZSBtYXJrZXJzLCBvciBzZXQgc3RhdGUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gc29tZQotCQkgbGF0ZXIgcmVsb2NhdGlvbi4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9FTlRSWToKLQkJY2FzZSBSX0FMVF9FTlRSWToKLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9DT01QMToKLQkJY2FzZSBSX0NPTVAyOgotCQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JCWNhc2UgUl9FTkRfQlJUQUI6Ci0JCWNhc2UgUl9CRUdJTl9UUlk6Ci0JCWNhc2UgUl9FTkRfVFJZOgotCQljYXNlIFJfTjBTRUw6Ci0JCWNhc2UgUl9OMVNFTDoKLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLQkJY2FzZSBSX1NIT1JUX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0jZW5kaWYKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3MgKyA0OwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdlIGNhcmUgYWJvdXQuICAqLwotCSAgICAgIHN3aXRjaCAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIFJfUENSRUxfQ0FMTDoKLQkJY2FzZSBSX0FCU19DQUxMOgotCQkgIHAgPSBzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgYmZkX3JlbG9jLCBzeW1fbnVtLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPREVfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RQX1JFTEFUSVZFOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgc3ltX251bSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN5bV9udW0gPCAweDEwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzIsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDMzLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMSk7Ci0JCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsgCi0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9EQVRBX09ORV9TWU1CT0w6Ci0JCWNhc2UgUl9EQVRBX1BMQUJFTDoKLQkJY2FzZSBSX0NPREVfUExBQkVMOgotCQljYXNlIFJfRExUX1JFTDoKLQkJICAvKiBBY2NvdW50IGZvciBhbnkgYWRkZW5kIHVzaW5nIFJfREFUQV9PVkVSUklERS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gUl9EQVRBX09ORV9TWU1CT0wKLQkJICAgICAgJiYgYmZkX3JlbG9jLT5hZGRlbmQpCi0JCSAgICBwID0gc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAsIAotCQkJCQkgICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7Ci0KLQkJICBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VOVFJZOgotCQkgIHsKLQkJICAgIGludCB0bXA7Ci0JCSAgICBhcmVsZW50ICp0bXBfcmVsb2MgPSBOVUxMOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBSX0VOVFJZLCBwKTsKLQotCQkgICAgLyogUl9FTlRSWSByZWxvY2F0aW9ucyBoYXZlIDY0IGJpdHMgb2YgYXNzb2NpYXRlZAotCQkgICAgICAgZGF0YS4gIFVuZm9ydHVuYXRlbHkgdGhlIGFkZGVuZCBmaWVsZCBvZiBhIGJmZAotCQkgICAgICAgcmVsb2NhdGlvbiBpcyBvbmx5IDMyIGJpdHMuICBTbywgd2Ugc3BsaXQgdXAKLQkJICAgICAgIHRoZSA2NGJpdCB1bndpbmQgaW5mb3JtYXRpb24gYW5kIHN0b3JlIHBhcnQgaW4KLQkJICAgICAgIHRoZSBSX0VOVFJZIHJlbG9jYXRpb24sIGFuZCB0aGUgcmVzdCBpbiB0aGUgUl9FWElUCi0JCSAgICAgICByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwICsgMSk7Ci0JCQotCQkgICAgLyogRmluZCB0aGUgbmV4dCBSX0VYSVQgcmVsb2NhdGlvbi4gICovCi0JCSAgICBmb3IgKHRtcCA9IGo7IHRtcCA8IHN1YnNlY3Rpb24tPnJlbG9jX2NvdW50OyB0bXArKykKLQkJICAgICAgewotCQkgICAgICAgIHRtcF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW3RtcF07Ci0JCQlpZiAodG1wX3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0VYSVQpCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGlmICh0bXAgPT0gc3Vic2VjdGlvbi0+cmVsb2NfY291bnQpCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICBiZmRfcHV0XzMyIChhYmZkLCB0bXBfcmVsb2MtPmFkZGVuZCwgcCArIDUpOwotCQkgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJcCwgOSwgcmVsb2NfcXVldWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgIAotCQljYXNlIFJfTl9NT0RFOgotCQljYXNlIFJfU19NT0RFOgotCQljYXNlIFJfRF9NT0RFOgotCQljYXNlIFJfUl9NT0RFOgotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiByZXF1ZXN0cyB0aGUgY3VycmVudCByb3VuZGluZwotCQkgICAgIG1vZGUsIHRoZW4gaXQgaXMgcmVkdW5kYW50LiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBjdXJyZW50X3JvdW5kaW5nX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9TSE9SVF9QQ1JFTF9NT0RFOgotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfY2FsbF9tb2RlKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgICAgIHAgKz0gMTsKLQkJICAgICAgY3VycmVudF9jYWxsX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9BTFRfRU5UUlk6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX04wU0VMOgotCQljYXNlIFJfTjFTRUw6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FTkRfVFJZOgotCQkgIC8qIFRoZSBlbmQgb2YgYSBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9uLiAgVGhlIHJlbG9jJ3MKLQkJICAgICBhZGRlbmQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCSAgICAgY29kZS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kID09IDApCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGVsc2UgaWYgKGJmZF9yZWxvYy0+YWRkZW5kIDwgMTAyNCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMSk7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgKGJmZF9yZWxvYy0+YWRkZW5kIC8gNCkgPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMik7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgICAgICAKLQkJY2FzZSBSX0NPTVAxOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDQ0LCBwICsgMSk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPTVAyOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDgwLCBwICsgMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgNSwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT0RFX0VYUFI6Ci0JCWNhc2UgUl9EQVRBX0VYUFI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCS8qIFB1dCBhICJSX1JFU0VSVkVEIiByZWxvY2F0aW9uIGluIHRoZSBzdHJlYW0gaWYKLQkJICAgd2UgaGl0IHNvbWV0aGluZyB3ZSBkbyBub3QgdW5kZXJzdGFuZC4gIFRoZSBsaW5rZXIKLQkJICAgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgdGhpcyBldmVyIGhhcHBlbnMuICAqLwotCQlkZWZhdWx0OgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIExhc3QgQkZEIHJlbG9jYXRpb24gZm9yIGEgc3Vic3BhY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAgICAgTWFwIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZSB3aXRoIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMuICAqLwotCSAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKSAKLQkJCSAgICAgICAgICAgICAgLSByZWxvY19vZmZzZXQsCi0JCQkgICAgICBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAvKiBTY3JpYmJsZSBvdXQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBwID0gdG1wX3NwYWNlOwotCi0JICB0b3RhbF9yZWxvY19zaXplICs9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9xdWFudGl0eQotCSAgICA9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JfQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotICAqdG90YWxfcmVsb2Nfc2l6ZXAgPSB0b3RhbF9yZWxvY19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzdHJpbmdfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci17Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcyAob3JkZXIgaXMgbm90IGltcG9ydGFudCkKLSAgICAgYnVpbGRpbmcgdXAgYW5kIHdyaXRpbmcgc3RyaW5nIHRhYmxlIGVudHJpZXMgZm9yIHRoZWlyIG5hbWVzLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgLyogT25seSB3b3JrIHdpdGggc3BhY2Uvc3Vic3BhY2VzOyBhdm9pZCBhbnkgb3RoZXIgc2VjdGlvbnMKLQkgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1hZGUgKC50ZXh0IGZvciBleGFtcGxlKS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lLiAgKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgRWFjaCBlbnRyeSB3aWxsIHRha2UgNCBieXRlcyB0bwotCSBob2xkIHRoZSBzdHJpbmcgbGVuZ3RoICsgdGhlIHN0cmluZyBpdHNlbGYgKyBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkgCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIEFsaWdubWVudCBpc3N1ZXMgYXJlIGFscmVhZHkgaGFuZGxlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgcCArPSA0OwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgaW5kZXggaW4gdGhlIHNwYWNlL3N1YnNwYWNlIHJlY29yZHMuICAqLwotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotICAgICAgZWxzZQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHArKzsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uZSB3aXRoIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmdzLiAgV3JpdGUgb3V0IGFueSBpbmZvcm1hdGlvbgotICAgICBjb250YWluZWQgaW4gYSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywgbnVtX3N5bXMsIHN0cmluZ19zaXplcCwKLQkJCSAgY29tcGlsYXRpb25fdW5pdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgaW50IG51bV9zeW1zOwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLSAgICAgQ09NUFVOSVQgKmNvbXBpbGF0aW9uX3VuaXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpjb21wWzRdOwotCi0gIC8qIFRoaXMgZ2V0cyBhIGJpdCBncnVlc29tZSBiZWNhdXNlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgVGhlCi0gICAgIHN0cmluZ3Mgd2l0aGluIHRoZSBjb21waWxhdGlvbiB1bml0IGFyZSBwYXJ0IG9mIHRoZSBzeW1ib2wKLSAgICAgc3RyaW5ncywgYnV0IGRvbid0IGhhdmUgc3ltYm9sX2RpY3Rpb25hcnkgZW50cmllcy4gIFNvLCBtYW51YWxseQotICAgICB3cml0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGNvbXBsaWF0aW9uIHVuaXQgaGVhZGVyLiAgT24gaW5wdXQsIHRoZQotICAgICBjb21waWxhdGlvbiB1bml0IGhlYWRlciBjb250YWlucyBsb2NhbCBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gICAgIE1vdmUgdGhlbSBhc2lkZS4gICovCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGNvbXBbMF0gPSBjb21waWxhdGlvbl91bml0LT5uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMV0gPSBjb21waWxhdGlvbl91bml0LT5sYW5ndWFnZV9uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMl0gPSBjb21waWxhdGlvbl91bml0LT5wcm9kdWN0X2lkLm5fbmFtZTsKLSAgICAgIGNvbXBbM10gPSBjb21waWxhdGlvbl91bml0LT52ZXJzaW9uX2lkLm5fbmFtZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkgIGludCBsZW5ndGggPSBzdHJsZW4gKGNvbXBbaV0pOwotCi0JICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAKLQkgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotCSAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAhPSBwIC0gdG1wX3NwYWNlKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgICAgIHAgPSB0bXBfc3BhY2U7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mCi0JICAgICB0aGUgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMKLQkgICAgIGFsc28gYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXgKLQkgICAgIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCSAgcCArPSA0OwotCi0JICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotCSAgc3RyY3B5IChwLCBjb21wW2ldKTsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgMDoJCi0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5sYW5ndWFnZV9uYW1lLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5wcm9kdWN0X2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT52ZXJzaW9uX2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcCArPSBsZW5ndGggKyAxOwotCSAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLQkgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLQkgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBzdHJpbmdzX3NpemUrKzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSBzdHJsZW4gKHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0gICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzIGFsc28KLQkgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXggZmllbGQgaW4gdGhlCi0JIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICBzb21fc3ltYm9sX2RhdGEoc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQgPSBzdHJpbmdzX3NpemU7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0gICAgICAgIHsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQkgIHArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBTY3JpYmJsZSBvdXQgYW55IHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW4gdGhlIFNPTSBoZWFkZXJzLCAKLSAgIHNwYWNlL3N1YnNwYWNlIGRpY3Rpb25hcmllcywgcmVsb2NhdGlvbiBzdHJlYW1zLCBldGMuICBCZWdpbgotICAgd3JpdGluZyBwYXJ0cyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNvbV9iZWdpbl93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIG51bV9zcGFjZXMsIG51bV9zdWJzcGFjZXMsIGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXIgPSBOVUxMOwotCi0gIC8qIFRoZSBmaWxlIGhlYWRlciB3aWxsIGFsd2F5cyBiZSBmaXJzdCBpbiBhbiBvYmplY3QgZmlsZSwgCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgaW4gcmFuZG9tIGxvY2F0aW9ucy4gIFRvIGtlZXAgdGhpbmdzCi0gICAgICJzaW1wbGUiIEJGRCB3aWxsIGxheSBvdXQgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBtYW5uZXIgc3VnZ2VzdGVkCi0gICAgIGJ5IHRoZSBQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMuICAqLwotCi0gIC8qIEJlZm9yZSBhbnkgb3V0cHV0IGNhbiByZWFsbHkgYmVnaW4gb2Zmc2V0cyBmb3IgYWxsIHRoZSBtYWpvcgotICAgICBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZSBjb21wdXRlZC4gIFNvLCBzdGFydGluZwotICAgICB3aXRoIHRoZSBpbml0aWFsIGZpbGUgaGVhZGVyIGNvbXB1dGUgKGFuZCBzb21ldGltZXMgd3JpdGUpCi0gICAgIGVhY2ggcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGZpbGUgaGVhZGVyLCBpdCdzIGNvbnRlbnRzIGFyZSBub3QgY29tcGxldGUKLSAgICAgeWV0LCBzbyBpdCBjYW4gbm90IGJlIHdyaXR0ZW4gYXQgdGhpcyB0aW1lLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKTsgIAotCi0gIC8qIEFueSBhdXhpbGlhcnkgaGVhZGVycyB3aWxsIGZvbGxvdyB0aGUgZmlsZSBoZWFkZXIuICBSaWdodCBub3cKLSAgICAgd2Ugc3VwcG9ydCBvbmx5IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaGVhZGVycy4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgPSAwOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgLyogUGFydHMgb2YgdGhlIGV4ZWMgaGVhZGVyIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbwotCSBkZWxheSB3cml0aW5nIHRoZSBoZWFkZXIgaXRzZWxmLiAgRmlsbCBpbiB0aGUgZGVmYXVsdHMsCi0JIGFuZCB3cml0ZSBpdCBsYXRlci4gICovCi0gICAgICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZQotCSs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIudHlwZSA9IEVYRUNfQVVYX0lEOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIubGVuZ3RoID0gNDA7Ci0gICAgfQotICBpZiAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGNvcHlyaWdodCBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnM7IHdlIGhhdmUgbm8gaW5pdGlhbGl6YXRpb24KLSAgICAgcG9pbnRlcnMsIHNvIGN1cnJlbnQgb2Zmc2V0IGRvZXMgbm90IGNoYW5nZS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X3RvdGFsID0gMDsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3BhY2UgcmVjb3Jkcy4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHNwYWNlcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHNwYWNlIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzcGFjZSBoZWFkZXJzCi0gICAgIGF0IHRoaXMgdGltZS4gICovCi0gIG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbCA9IG51bV9zcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN1YnNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4KLQotICAgICBBIHZhcmlldHkgaWYgZmllbGRzIGluIHRoZSBzdWJzcGFjZSByZWNvcmQgYXJlIHN0aWxsIHVua25vd24gYXQKLSAgICAgdGhpcyB0aW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSwgZml4dXAgc3RyZWFtIGxvY2F0aW9uL3NpemUsIGV0YykuICAqLwotICBudW1fc3Vic3BhY2VzID0gc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfdG90YWwgPSBudW1fc3Vic3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3Vic3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgaXMgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWVzLiAgV2Ugd2lsbAotICAgICBidWlsZCBhbmQgd3JpdGUgdGhlIHN0cmluZyB0YWJsZSBvbiB0aGUgZmx5LiAgQXQgdGhlIHNhbWUgdGltZQotICAgICB3ZSB3aWxsIGZpbGwgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUgaW5kZXggZmllbGRzLiAgKi8KLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLQotICAvKiBNYXJrIHRoZSBvZmZzZXQgb2YgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZSBpbiB0aGUgCi0gICAgIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHNwYWNlIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmc3RyaW5nc19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIHRoZSBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgY29tcGlsYXRpb24gdW5pdC4gKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDA7Ci0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKSAKLSAgICB7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAxOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gQ09NUFVOSVRTWjsgCi0gICAgfQotCi0gIC8qIE5vdyBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRhYmxlIHN1YnNwYWNlcywgdGFraW5nCi0gICAgIGNhcmUgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgc3RheXMgcHJvcGVybHkgYWxpZ25lZC4gICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotICAgICAgaW50IGZpcnN0X3N1YnNwYWNlOwotICAgICAgdW5zaWduZWQgaW50IHN1YnNwYWNlX29mZnNldCA9IDA7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMTsKLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBpbiB0aGUgc3BhY2UsIGFuZCB3ZSBhcmUKLQkgICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gdGFrZSBjYXJlIHRvIG1ha2Ugc3VyZSBhbGwKLQkgICAgIHRoZSBhbGlnbm1lbnRzIGFyZSBjb3JyZWN0IGFuZCB1cGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgIGlmIChmaXJzdF9zdWJzcGFjZQotCSAgICAgICYmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkpCi0JICAgIHsKLQkgICAgICAvKiBEZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMgaGF2ZSBlYWNoIHNwYWNlIGFsaWduZWQgdG8gYQotCQkgcGFnZSBib3VuZGFyeS4gIFNoYXJhYmxlIGV4ZWN1dGFibGVzICh3cml0ZS1wcm90ZWN0ZWQKLQkJIHRleHQpIGhhdmUganVzdCB0aGUgcHJpdmF0ZSAoYWthIGRhdGEgJiBic3MpIHNwYWNlIGFsaWduZWQKLQkJIHRvIGEgcGFnZSBib3VuZGFyeS4gIFVnaC4gIE5vdCB0cnVlIGZvciBIUFVYLgotCi0JCSBUaGUgSFBVWCBrZXJuZWwgcmVxdWlyZXMgdGhlIHRleHQgdG8gYWx3YXlzIGJlIHBhZ2UgYWxpZ25lZAotCQkgd2l0aGluIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4ZWN1dGFibGUncyB0eXBlLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRF9QQUdFRCB8IERZTkFNSUMpCi0JCSAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCSAgfHwgKChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JCSAgICAgICYmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKSkpCi0JCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0JICAgICAgLyogVXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUgJiYgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBICYmIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kbWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgZXhhY3RseSB3aGVyZSB3ZSBhcmUgd2l0aGluIGEgcGFydGljdWxhcgotCQkgc3BhY2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgYnJhaW5kYW1hZ2VkIEhQVVgKLQkJIGxvYWRlciB3aWxsIGNyZWF0ZSBob2xlcyBiZXR3ZWVuIHN1YnNwYWNlcyAqYW5kKiAKLQkJIHN1YnNwYWNlIGFsaWdubWVudHMgYXJlICpOT1QqIHByZXNlcnZlZC4gIFdoYXQgYSBjcm9jay4gICovCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ID0gc3Vic2VjdGlvbi0+dm1hOwotCi0JICAgICAgLyogT25seSBkbyB0aGlzIGZvciB0aGUgZmlyc3Qgc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UuICAqLwotCSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgYnJhaW5kYW1hZ2VkIEhQVVggbG9hZGVyIG1heSBoYXZlIGNyZWF0ZWQgYSBob2xlCi0JCSBiZXR3ZWVuIHR3byBzdWJzcGFjZXMuICBJdCBpcyAqbm90KiBzdWZmaWNpZW50IHRvIHVzZQotCQkgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9ucyB3aXRoaW4gdGhlIHN1YnNwYWNlcyB0bwotCQkgYWNjb3VudCBmb3IgdGhlc2UgaG9sZXMgLS0gSSd2ZSBydW4gaW50byBhdCBsZWFzdCBvbmUKLQkJIGNhc2Ugd2hlcmUgdGhlIGxvYWRlciBsZWZ0IG9uZSBjb2RlIHN1YnNwYWNlIHVuYWxpZ25lZAotCQkgaW4gYSBmaW5hbCBleGVjdXRhYmxlLgotCi0JCSBUbyBjb21iYXQgdGhpcyB3ZSBrZWVwIGEgY3VycmVudCBvZmZzZXQgd2l0aGluIGVhY2ggc3BhY2UsCi0JCSBhbmQgdXNlIHRoZSBzdWJzcGFjZSB2bWEgZmllbGRzIHRvIGRldGVjdCBhbmQgcHJlc2VydmUKLQkJIGhvbGVzLiAgV2hhdCBhIGNyb2NrIQotCi0JCSBwcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdW5sb2FkYWJsZSBzcGFjZS9zdWJzcGFjZXMuICAqLwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgIH0KLQotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjb2RlICYgZGF0YS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgICAgICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBic3Mgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSAwOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogRmluYWxseSBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0gICAgIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHN0YXJ0IHRoZSB1bmxvYWRhYmxlIHN0dWZmIG9uIGl0cwotICAgICBvd24gcGFnZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiBtYWtlIHN1cmUgdG8gc2VlayB0byBhbmQgd3JpdGUKLSAgICAgb25lIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgYW55IG5lY2Vzc2FyeQotICAgICB6ZXJvcyBhcmUgZmlsbGVkIGluLiAgVWdoLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0IC0gMSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICIiLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9zaXplCi0gICAgPSBjdXJyZW50X29mZnNldCAtIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwotCi0gIC8qIExvYWRlciBmaXh1cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYW55IHdheSBzaGFwZSBvciBmb3JtLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF9sb2NhdGlvbiA9IDA7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfdG90YWwgPSAwOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NIHNvIGZhci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsbHksIHNjcmliYmxlIG91dCB0aGUgdmFyaW91cyBoZWFkZXJzIHRvIHRoZSBkaXNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGludCBpLCBudW1fc3ltcywgc3RyaW5nc19zaXplOwotICBpbnQgc3Vic3BhY2VfaW5kZXggPSAwOwotICBmaWxlX3B0ciBsb2NhdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzeW1ib2wgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGF0IHRoaXMgdGltZS4gCi0KLSAgICAgVGhlc2UgdXNlZCB0byBiZSBvdXRwdXQgYmVmb3JlIHRoZSBzdWJzcGFjZSBjb250ZW50cywgYnV0IHRoZXkKLSAgICAgd2VyZSBtb3ZlZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEgc3R1cGlkIGJ1ZyBpbiB0aGUgaHB1eCBsaW5rZXIKLSAgICAgKGZpeGVkIGluIGhwdXgxMCkuICAqLwotICBjdXJyZW50X29mZnNldCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLQotICBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfdG90YWwgPSBudW1fc3ltczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzeW1ib2wgc3RyaW5ncy4KLSAgICAgQWxpZ24gdGhlbSB0byBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsCi0JCQkJbnVtX3N5bXMsICZzdHJpbmdzX3NpemUsCi0JCQkJb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBEbyBwcmVwIHdvcmsgYmVmb3JlIGhhbmRsaW5nIGZpeHVwcy4gICovCi0gIHNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsCi0JCSAgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpLAotCQkgICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgdGhlIGZpeHVwIHN0cmVhbSB3aGljaCBzdGFydHMgb24gYQotICAgICB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogV3JpdGUgdGhlIGZpeHVwcyBhbmQgdXBkYXRlIGZpZWxkcyBpbiBzdWJzcGFjZSBoZWFkZXJzIHdoaWNoCi0gICAgIHJlbGF0ZSB0byB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmdG90YWxfcmVsb2Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X3RvdGFsID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplOwotIAotICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGlzIGNvbXBsZXRlLCBidWlsZCBhbmQKLSAgICAgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN1YnNwYWNlcyBhcmUgd3JpdHRlbiBmaXJzdCBzbyB0aGF0IHdlIGNhbiBzZXQgdXAgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgdGhlbSBpbiB0aGVpciBjb250YWluaW5nIHNwYWNlcyBhcyB0aGUgc3Vic3BhY2UgaXMgd3JpdHRlbi4gICovCi0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBsb2FkYWJsZSBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZQotCSAgICAgb3Igc3Vic3BhY2UuICBPciBkb2VzIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUKLQkgICAgIGhhcyBubyByZWFsIGJpdHMgb24gdGhlIGRpc2spLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBBbHNvCi0JICAgICBzZXQgImlzX2xvYWRhYmxlIiBpbiB0aGUgY29udGFpbmluZyBzcGFjZS4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHN1YnNwYWNlX2luZGV4Kys7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoZSBjdXJyZW50IHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogTm93IHJlcGVhdCB0aGUgcHJvY2VzcyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuICAqLwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZSBvcgotCSAgICAgc3Vic3BhY2UsIG9yIHdoaWNoIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUgaGFuZGxlZAotCSAgICAgaW4gdGhlIGxvYWRhYmxlIHNwYWNlcy9zdWJzcGFjZXMgY29kZSBhYm92ZSkuICAqLwotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQ2xlYXIKLQkgICAgICJpc19sb2FkYWJsZSIuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQkgIHN1YnNwYWNlX2luZGV4Kys7IAotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhpcyBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEFsbCB0aGUgc3Vic3BhY2UgZGljdGlvbmRhcnkgcmVjb3JkcyBhcmUgd3JpdHRlbiwgYW5kIGFsbCB0aGUKLSAgICAgZmllbGRzIGFyZSBzZXQgdXAgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4KLQotICAgICBTZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQgc3RhcnQgd3JpdGluZyB0aGUgc3BhY2UKLSAgICAgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIER1bXAgaXRzIGhlYWRlciAgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LAotCQkgICAgIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLAotCQkgICAgIENPTVBVTklUU1osIDEsIGFiZmQpICE9IENPTVBVTklUU1opCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBvZiB0aGUgc3lzdGVtX2lkIGhhcyB0byBoYXBwZW4gdmVyeSBsYXRlIG5vdyB0aGF0IGNvcHlpbmcgb2YKLSAgICAgQkZEIHByaXZhdGUgZGF0YSBoYXBwZW5zICphZnRlciogc2VjdGlvbiBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMjApCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MyXzA7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGExMSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMTsKLSAgZWxzZQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBoZWFkZXIganVzdCBiZWZvcmUgd3JpdGluZwotICAgICB0aGUgaGVhZGVyIHRvIGRpc2suICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y2hlY2tzdW0gPSBzb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCk7Ci0KLSAgLyogT25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHdyaXRlIG91dCB0aGUgZmlsZSBoZWFkZXIuICBJdCBpcyBhbHdheXMKLSAgICAgYXQgbG9jYXRpb24gemVyby4gIFNlZWsgdGhlcmUgYW5kIHdyaXRlIGl0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSwKLQkJIHNpemVvZiAoc3RydWN0IGhlYWRlciksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIGxvbmcgdG1wLCBzb21fbGVuZ3RoOwotICAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXI7Ci0KLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19mbGFncyA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFnczsKLQotICAgICAgLyogT2ggam95cy4gIFJhbSBzb21lIG9mIHRoZSBCU1MgZGF0YSBpbnRvIHRoZSBEQVRBIHNlY3Rpb24KLQkgdG8gYmUgY29tcGF0YWJsZSB3aXRoIGhvdyB0aGUgaHAgbGlua2VyIG1ha2VzIG9iamVjdHMKLQkgKHNhdmVzIG1lbW9yeSBzcGFjZSkuICAqLwotICAgICAgdG1wID0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemU7Ci0gICAgICB0bXAgPSBTT01fQUxJR04gKHRtcCwgUEFfUEFHRVNJWkUpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgLT0gKHRtcCAtIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplKTsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA8IDApCi0JZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPSAwOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPSB0bXA7Ci0KLSAgICAgIC8qIE5vdyBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gIFRoZSBpZGVhIGlzIHRvIGNhdGNoIGJvZ29ucyBub3cgYW5kCi0JIGluZm9ybSB0aGUgdXNlciwgaW5zdGVhZCBvZiBzaWxlbnRseSBnZW5lcmF0aW5nIGEgYm9ndXMgZmlsZS4gICovCi0gICAgICBzb21fbGVuZ3RoID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY190c2l6ZSA+IHNvbV9sZW5ndGgKLQkgIHx8IGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPiBzb21fbGVuZ3RoKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBleGVjX2hlYWRlciwgQVVYX0hEUl9TSVpFLCAxLCBhYmZkKQotCSAgIT0gQVVYX0hEUl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciBhIFNPTSBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb3VudCwgaTsKLSAgdW5zaWduZWQgbG9uZyAqYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcgKikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCk7Ci0KLSAgY2hlY2tzdW0gPSAwOwotICBjb3VudCA9IHNpemVvZiAoc3RydWN0IGhlYWRlcikgLyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBjaGVja3N1bSBePSAqKGJ1ZmZlciArIGkpOwotCi0gIHJldHVybiBjaGVja3N1bTsKLX0KLQotc3RhdGljIHZvaWQKLXNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqaW5mbzsKLXsKLSAgLyogSW5pdGlhbGl6ZS4gICovCi0gIG1lbXNldCAoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pKTsKLQotICAvKiBUaGUgSFAgU09NIGxpbmtlciByZXF1aXJlcyBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGFsbCBzeW1ib2xzIChpbmNsdWRpbmcgdW5kZWZpbmVkIHN5bWJvbHMhKS4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBhbiBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudCBkb2VzIG5vdAotICAgICBhbHdheXMgbWF0Y2ggd2hhdCB0aGUgbGlua2VyIHdhbnRzLiAgU2V2ZXJlIGJyYWluZGFtYWdlLiAgKi8KLQkgCi0gIC8qIFNlY3Rpb24gc3ltYm9scyB3aWxsIG5vdCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc2lnbmVkIHRvCi0gICAgIHRoZW0geWV0LiAgQXNzaWduIGFsbCBzZWN0aW9uIHN5bWJvbHMgdHlwZSBTVF9EQVRBLiAgKi8KLSAgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbXVzdCBoYXZlIHNjb3BlIFNTX1VOU0FUIGFuZCB0eXBlCi0JIFNUX1NUT1JBR0Ugb3IgdGhlIGxpbmtlciB3aWxsIGNob2tlLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NUT1JBR0U7Ci0JfQotCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sIHdpdGhvdXQgYW4gYXNzb2NpYXRlZAotCSB0eXBlLiAgVGhpcyBoYXBwZW5zIGlmIHRoZSB1c2VyIGltcG9ydGVkIHRoZSBzeW1ib2wKLQkgd2l0aG91dCBhIHR5cGUgYW5kIHRoZSBzeW1ib2wgd2FzIG5ldmVyIGRlZmluZWQKLQkgbG9jYWxseS4gIElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIHRoaXMgc3ltYm9sLCB0aGVuCi0JIGFzc2lnbiBpdCB0eXBlIFNUX0NPREUgKHRoZSBIUCBsaW5rZXIgcmVxdWlyZXMgdW5kZWZpbmVkCi0JIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBoYXZlIHR5cGUgU1RfQ09ERSByYXRoZXIgdGhhbiBTVF9FTlRSWSkuICAqLwotICAgICAgZWxzZSBpZiAoKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQl8fCBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JICAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICAmJiBzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQotICAgICAgLyogSGFuZGxlIGZ1bmN0aW9uIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLQkgVGhleSBzaG91bGQgaGF2ZSB0eXBlIFNUX0VOVFJZLiAgQWxzbyByZXRyaWV2ZSB0aGUgYXJndW1lbnQKLQkgcmVsb2NhdGlvbiBiaXRzIGZyb20gdGhlIFNPTSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfRU5UUlkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERQotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0VOVFJZOwotCSAgaW5mby0+YXJnX3JlbG9jID0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCSAgaW5mby0+cHJpdl9sZXZlbD0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbDsKLQl9Ci0KLSAgICAgIC8qIEZvciB1bmtub3duIHN5bWJvbHMgc2V0IHRoZSBzeW1ib2wncyB0eXBlIGJhc2VkIG9uIHRoZSBzeW1ib2wncwotCSBzZWN0aW9uIChTVF9EQVRBIGZvciBEQVRBIHNlY3Rpb25zLCBTVF9DT0RFIGZvciBDT0RFIHNlY3Rpb25zKS4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JewotCSAgaWYgKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCSAgZWxzZQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0JfQotICAKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0KLSAgICAgIC8qIEZyb20gbm93IG9uIGl0J3MgYSB2ZXJ5IHNpbXBsZSBtYXBwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0RBVEEpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9NSUxMSUNPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BMQUJFTCkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BMQUJFTDsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUFJJX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfU0VDX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TRUNfUFJPRzsKLSAgICB9Ci0JCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHN5bWJvbCdzIHNjb3BlLiAgRXhwb3J0ZWQgZGF0YSB3aGljaCBpcyBub3QKLSAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZSBTU19VTklWRVJTQUwuICBOb3RlIHNjb3BlCi0gICAgIG9mIGNvbW1vbiBzeW1ib2xzIHdhcyBoYW5kbGVkIGVhcmxpZXIhICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotICBlbHNlIGlmIChzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTklWRVJTQUw7Ci0gIC8qIEFueXRoaW5nIGVsc2Ugd2hpY2ggaXMgbm90IGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUKLSAgICAgU1NfTE9DQUwuICAqLwotICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19MT0NBTDsKLQotICAvKiBOb3cgc2V0IHRoZSBzeW1ib2xfaW5mbyBmaWVsZC4gIEl0IGhhcyBubyByZWFsIG1lYW5pbmcKLSAgICAgZm9yIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9scywgYnV0IHRoZSBIUCBsaW5rZXIgd2lsbAotICAgICBjaG9rZSBpZiBpdCdzIG5vdCBzZXQgdG8gc29tZSAicmVhc29uYWJsZSIgdmFsdWUuICBXZQotICAgICB1c2UgemVybyBhcyBhIHJlYXNvbmFibGUgdmFsdWUuICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IDA7Ci0gIC8qIEZvciBhbGwgb3RoZXIgc3ltYm9scywgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNvbnRhaW5zIHRoZSAKLSAgICAgc3Vic3BhY2UgaW5kZXggb2YgdGhlIHNwYWNlIHRoaXMgc3ltYm9sIGlzIGNvbnRhaW5lZCBpbi4gICovCi0gIGVsc2UKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IHN5bS0+c2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0gIC8qIFNldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICAqLwotICBpbmZvLT5zeW1ib2xfdmFsdWUgPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWE7Ci0KLSAgLyogVGhlIHNlY29uZGFyeV9kZWYgZmllbGQgaXMgZm9yIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChzeW0tPmZsYWdzICYgQlNGX1dFQUspCi0gICAgaW5mby0+c2Vjb25kYXJ5X2RlZiA9IHRydWU7Ci0gIGVsc2UKLSAgICBpbmZvLT5zZWNvbmRhcnlfZGVmID0gZmFsc2U7Ci0KLX0KLQotLyogQnVpbGQgYW5kIHdyaXRlLCBpbiBvbmUgYmlnIGNodW5rLCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBmb3IKLSAgIHRoaXMgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBmaWxlX3B0ciBzeW10YWJfbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uOwotICBhc3ltYm9sICoqYmZkX3N5bXMgPSBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKTsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc29tX3N5bXRhYiA9IE5VTEw7Ci0gIGludCBpLCBzeW10YWJfc2l6ZTsKLQotICAvKiBDb21wdXRlIHRvdGFsIHN5bWJvbCB0YWJsZSBzaXplIGFuZCBhbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeQotICAgICB0byBob2xkIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgYnVpbGQgaXQuICAqLwotICBzeW10YWJfc2l6ZSA9IG51bV9zeW1zICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgc29tX3N5bXRhYiA9IChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICopIGJmZF9tYWxsb2MgKHN5bXRhYl9zaXplKTsKLSAgaWYgKHNvbV9zeW10YWIgPT0gTlVMTCAmJiBzeW10YWJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHNvbV9zeW10YWIsIDAsIHN5bXRhYl9zaXplKTsKLQotICAvKiBXYWxrIG92ZXIgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotICAgICAgLyogVGhpcyBpcyByZWFsbHkgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHN0cmluZ3MgdGFibGUuICAKLQkgQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUsIHRoZSBpbmRleCBoYXMgYWxyZWFkeSBiZWVuIAotCSBjb21wdXRlZCBhbmQgc3RvcmVkIGludG8gdGhlIG5hbWUgZmllbGQgaW4gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX3N5bXRhYltpXS5uYW1lLm5fc3RyeCA9IHNvbV9zeW1ib2xfZGF0YShiZmRfc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQ7Ci0KLSAgICAgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0gICAgICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChhYmZkLCBiZmRfc3ltc1tpXSwgJmluZm8pOwotCi0gICAgICAvKiBOb3cgdXNlIGl0LiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3R5cGUgPSBpbmZvLnN5bWJvbF90eXBlOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfc2NvcGUgPSBpbmZvLnN5bWJvbF9zY29wZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uYXJnX3JlbG9jID0gaW5mby5hcmdfcmVsb2M7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLSAgICAgIHNvbV9zeW10YWJbaV0ueGxlYXN0ID0gMzsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0gICAgICBzb21fc3ltdGFiW2ldLnNlY29uZGFyeV9kZWYgPSBpbmZvLnNlY29uZGFyeV9kZWY7Ci0gICAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgaXMgcmVhZHksIHNlZWsgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGFuZAotICAgICBzY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2xvY2F0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3N5bXRhYiwgc3ltdGFiX3NpemUsIDEsIGFiZmQpICE9IHN5bXRhYl9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHNvbV9zeW10YWIgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fc3ltdGFiKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgaW4gU09NIGZvcm1hdC4gICovICAKLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KLSAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZwotCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gKHNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkpOwotfQotCi0MCi0vKiBSZWFkIGFuZCBzYXZlIHRoZSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpzdHJpbmd0YWI7Ci0KLSAgLyogVXNlIHRoZSBzYXZlZCB2ZXJzaW9uIGlmIGl0cyBhdmFpbGFibGUuICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSSBkb24ndCB0aGluayB0aGlzIGNhbiBjdXJyZW50bHkgaGFwcGVuLCBhbmQgSSdtIG5vdCBzdXJlIGl0IHNob3VsZAotICAgICByZWFsbHkgYmUgYW4gZXJyb3IsIGJ1dCBpdCdzIGJldHRlciB0aGFuIGdldHRpbmcgdW5wcmVkaWN0YWJsZSByZXN1bHRzCi0gICAgIGZyb20gdGhlIGhvc3QncyBtYWxsb2Mgd2hlbiBwYXNzZWQgYSBzaXplIG9mIHplcm8uICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuZCByZWFkIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBzdHJpbmd0YWIgPSBiZmRfbWFsbG9jIChvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0gIGlmIChzdHJpbmd0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbXNldCAoc3RyaW5ndGFiLCAwLCBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAoYmZkX3JlYWQgKHN0cmluZ3RhYiwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpCi0gICAgICAhPSBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCi0gIG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSA9IHN0cmluZ3RhYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgKGluIGJ5dGVzKSByZXF1aXJlZCB0byBob2xkIHRoZSBzeW1ib2wKLSAgIHRhYmxlIGZvciB0aGlzIG9iamVjdC4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgU09NIHN1YnNwYWNlIGluZGV4IHRvIGEgQkZEIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc3ltYm9sOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBUaGUgbWVhbmluZyBvZiB0aGUgc3ltYm9sX2luZm8gZmllbGQgY2hhbmdlcyBmb3IgZnVuY3Rpb25zCi0gICAgIHdpdGhpbiBleGVjdXRhYmxlcy4gIFNvIG9ubHkgdXNlIHRoZSBxdWljayBzeW1ib2xfaW5mbyBtYXBwaW5nIGZvcgotICAgICBpbmNvbXBsZXRlIG9iamVjdHMgYW5kIG5vbi1mdW5jdGlvbiBzeW1ib2xzIGluIGV4ZWN1dGFibGVzLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgfHwgKHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfRU5UUlkKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfUFJJX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfU0VDX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfTUlMTElDT0RFKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBzeW1ib2wtPnN5bWJvbF9pbmZvOwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JaWYgKHNlY3Rpb24tPnRhcmdldF9pbmRleCA9PSBpbmRleCAmJiBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCSAgcmV0dXJuIHNlY3Rpb247Ci0KLSAgICAgIC8qIENvdWxkIGJlIGEgc3ltYm9sIGZyb20gYW4gZXh0ZXJuYWwgbGlicmFyeSAoc3VjaCBhcyBhbiBPTU9TCi0JIHNoYXJlZCBsaWJyYXJ5KS4gIERvbid0IGFib3J0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gc3ltYm9sLT5zeW1ib2xfdmFsdWU7Ci0KLSAgICAgIC8qIEZvciBleGVjdXRhYmxlcyB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoZSBzeW1ib2wncyBhZGRyZXNzIGFuZAotCSBmaW5kIG91dCB3aGF0IHNlY3Rpb24gd291bGQgY29udGFpbiB0aGF0IGFkZHJlc3MuICAgWXVrLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpZiAodmFsdWUgPj0gc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgdmFsdWUgPD0gc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+X2Nvb2tlZF9zaXplCi0JICAgICAgJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgICAgcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLX0KLQotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3ltYm9sIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGludCBzeW1zaXplID0gc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgY2hhciAqc3RyaW5ndGFiOwotICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpidWYgPSBOVUxMLCAqYnVmcCwgKmVuZGJ1ZnA7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltLCAqc3ltYmFzZTsKLQotICAvKiBSZXR1cm4gc2F2ZWQgdmFsdWUgaWYgaXQgZXhpc3RzLiAgKi8KLSAgaWYgKG9ial9zb21fc3ltdGFiIChhYmZkKSAhPSBOVUxMKQotICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0KLSAgLyogU3BlY2lhbCBjYXNlLiAgVGhpcyBpcyAqbm90KiBhbiBlcnJvci4gICovCi0gIGlmIChzeW1ib2xfY291bnQgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIGlmICghc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3RyaW5ndGFiID0gb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpOwotCi0gIHN5bWJhc2UgPSAoKHNvbV9zeW1ib2xfdHlwZSAqKQotCSAgICAgYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1iYXNlID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoc3ltYmFzZSwgMCwgc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBTT00gcmVwcmVzZW50YXRpb24uICAqLwotICBidWYgPSBiZmRfbWFsbG9jIChzeW1ib2xfY291bnQgKiBzeW1zaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN5bWJvbF9jb3VudCAqIHN5bXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChidWYsIHN5bWJvbF9jb3VudCAqIHN5bXNpemUsIDEsIGFiZmQpIAotICAgICAgIT0gc3ltYm9sX2NvdW50ICogc3ltc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBzeW1ib2xzIGFuZCBpbnRlcm5hbGl6ZSB0aGVtLiAgKi8KLSAgZW5kYnVmcCA9IGJ1ZiArIHN5bWJvbF9jb3VudDsKLSAgZm9yIChidWZwID0gYnVmLCBzeW0gPSBzeW1iYXNlOyBidWZwIDwgZW5kYnVmcDsgKytidWZwKQotICAgIHsKLQotICAgICAgLyogSSBkb24ndCB0aGluayB3ZSBjYXJlIGFib3V0IHRoZXNlLiAgKi8KLSAgICAgIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICB8fCBidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZXQgc29tZSBwcml2YXRlIGRhdGEgd2UgY2FyZSBhYm91dC4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTlVMTCkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0FCU09MVVRFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0RBVEEpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0RBVEE7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9DT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9DT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUFJJX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BSSV9QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU0VDX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfRU5UUlkpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTUlMTElDT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9QTEFCRUwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKLSAgICAgIGVsc2UKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9IGJ1ZnAtPmFyZ19yZWxvYzsKLQotICAgICAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBidWZwLT5zeW1ib2xfdmFsdWU7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gMDsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzID0gMDsKLQotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfdHlwZSkKLQl7Ci0JY2FzZSBTVF9FTlRSWToKLQljYXNlIFNUX01JTExJQ09ERToKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICBicmVhazsKLQotCWNhc2UgU1RfU1RVQjoKLQljYXNlIFNUX0NPREU6Ci0JY2FzZSBTVF9QUklfUFJPRzoKLQljYXNlIFNUX1NFQ19QUk9HOgotCSAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9Ci0JICAgIHN5bS0+c3ltYm9sLnZhbHVlICYgMHgzOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfjB4MzsKLQkgIC8qIElmIHRoZSBzeW1ib2wncyBzY29wZSBpcyBTU19VTlNBVCwgdGhlbiB0aGVzZSBhcmUKLQkgICAgIHVuZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQkgIGlmIChidWZwLT5zeW1ib2xfc2NvcGUgPT0gU1NfVU5TQVQpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgIAotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSGFuZGxlIHNjb3BpbmcgYW5kIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfc2NvcGUpCi0JewotCS8qIHN5bWJvbF9pbmZvIGZpZWxkIGlzIHVuZGVmaW5lZCBmb3IgU1NfRVhURVJOQUwgYW5kIFNTX1VOU0FUIHN5bWJvbHMsCi0JICAgc28gdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ltYm9sIGNhbid0IGJlIGtub3duLiAgKi8KLQljYXNlIFNTX0VYVEVSTkFMOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBicmVhazsKLQotCWNhc2UgU1NfVU5TQVQ6Ci0JICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOSVZFUlNBTDoKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCi0jaWYgMAotCS8qIFNTX0dMT0JBTCBhbmQgU1NfTE9DQUwgYXJlIHR3byBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmcuCi0JICAgU291bmQgZHVtYj8gIEl0IGlzLiAgKi8KLQljYXNlIFNTX0dMT0JBTDoKLSNlbmRpZgotCWNhc2UgU1NfTE9DQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGEgd2VhayBzeW1ib2wuICAqLwotICAgICAgaWYgKGJ1ZnAtPnNlY29uZGFyeV9kZWYpCi0gICAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9XRUFLOwotCi0gICAgICAvKiBNYXJrIHNlY3Rpb24gc3ltYm9scyBhbmQgc3ltYm9scyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4KLQkgTm90ZSAkU1RBUlQkIGlzIGEgbWFnaWMgY29kZSBzeW1ib2wsIE5PVCBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzeW0tPnN5bWJvbC5uYW1lWzBdID09ICckJwotCSAgJiYgc3ltLT5zeW1ib2wubmFtZVtzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpIC0gMV0gPT0gJyQnCi0JICAmJiAhc3RyY21wIChzeW0tPnN5bWJvbC5uYW1lLCBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lKSkKLQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0gICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDIiLCA0KSkKLQl7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW0tPnN5bWJvbC5uYW1lID0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+bmFtZTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDEiLCA0KSkKLQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBOb3RlIGluY3JlbWVudCBhdCBib3R0b20gb2YgbG9vcCwgc2luY2Ugd2Ugc2tpcCBzb21lIHN5bWJvbHMKLSAgICAgICAgIHdlIGNhbiBub3QgaW5jbHVkZSBpdCBhcyBwYXJ0IG9mIHRoZSBmb3Igc3RhdGVtZW50LiAgKi8KLSAgICAgIHN5bSsrOwotICAgIH0KLQotICAvKiBXZSBtb2RpZnkgdGhlIHN5bWJvbCBjb3VudCB0byByZWNvcmQgdGhlIG51bWJlciBvZiBCRkQgc3ltYm9scyB3ZQotICAgICBjcmVhdGVkLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW0gLSBzeW1iYXNlOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAgKi8KLSAgb2JqX3NvbV9zeW10YWIgKGFiZmQpID0gc3ltYmFzZTsKLSBzdWNjZXNzZnVsX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiAodHJ1ZSk7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSBhIFNPTSBzeW1ib2wgdGFibGUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzCi0gICBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGludCBpOwotICBzb21fc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBzeW1iYXNlID0gb2JqX3NvbV9zeW10YWIgKGFiZmQpOwotCi0gIGZvciAoOyBpID4gMDsgaS0tLCBsb2NhdGlvbisrLCBzeW1iYXNlKyspCi0gICAgKmxvY2F0aW9uID0gJnN5bWJhc2UtPnN5bWJvbDsKLQotICAvKiBGaW5hbCBudWxsIHBvaW50ZXIuICAqLwotICAqbG9jYXRpb24gPSAwOwotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLX0KLQotLyogTWFrZSBhIFNPTSBzeW1ib2wuICBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXNvbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzb21fc3ltYm9sX3R5cGUgKm5ldyA9Ci0gIChzb21fc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgInNvbSAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0Jc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID8gc3ltYm9sLT5zZWN0aW9uLT5uYW1lIDogIigqbm9uZSopIjsKLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCWZwcmludGYgKGZpbGUsICIgJXNcdCVzIiwgc2VjdGlvbl9uYW1lLCBzeW1ib2wtPm5hbWUpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogQ291bnQgb3IgcHJvY2VzcyB2YXJpYWJsZS1sZW5ndGggU09NIGZpeHVwIHJlY29yZHMuCi0KLSAgIFRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gd2UgdXNlIHRoaXMgY29kZSBib3RoIHRvIGNvbXB1dGUgdGhlIG51bWJlcgotICAgb2YgcmVsb2NhdGlvbnMgcmVxdWVzdGVkIGJ5IGEgc3RyZWFtLCBhbmQgdG8gaW50ZXJuYWxpemUgdGhlIHN0cmVhbS4KLQotICAgV2hlbiBjb21wdXRpbmcgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0gdGhlCi0gICB2YXJpYWJsZXMgcnB0ciwgc2VjdGlvbiwgYW5kIHN5bWJvbHMgaGF2ZSBubyBtZWFuaW5nLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGZpeHVwIHN0cmVhbS4gIFdoZW4KLSAgIG5vdCBqdXN0IGNvdW50aW5nIAotCi0gICBUaGlzIG5lZWRzIGF0IGxlYXN0IHR3byBvciB0aHJlZSBtb3JlIHBhc3NlcyB0byBnZXQgaXQgY2xlYW5lZCB1cC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9zZXRfcmVsb2NfaW5mbyAoZml4dXAsIGVuZCwgaW50ZXJuYWxfcmVsb2NzLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQotICAgICB1bnNpZ25lZCBjaGFyICpmaXh1cDsKLSAgICAgdW5zaWduZWQgaW50IGVuZDsKLSAgICAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4ganVzdF9jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IG9wLCB2YXJuYW1lLCBkZWFsbG9jYXRlX2NvbnRlbnRzID0gMDsKLSAgdW5zaWduZWQgY2hhciAqZW5kX2ZpeHVwcyA9ICZmaXh1cFtlbmRdOwotICBjb25zdCBzdHJ1Y3QgZml4dXBfZm9ybWF0ICpmcDsKLSAgY2hhciAqY3A7Ci0gIHVuc2lnbmVkIGNoYXIgKnNhdmVfZml4dXA7Ci0gIGludCB2YXJpYWJsZXNbMjZdLCBzdGFja1syMF0sIGMsIHYsIGNvdW50LCBwcmV2X2ZpeHVwLCAqc3AsIHNhdmVkX3Vud2luZF9iaXRzOwotICBjb25zdCBpbnQgKnN1Ym9wOwotICBhcmVsZW50ICpycHRyPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCi0jZGVmaW5lCXZhcihjKQkJdmFyaWFibGVzWyhjKSAtICdBJ10KLSNkZWZpbmUJcHVzaCh2KQkJKCpzcCsrID0gKHYpKQotI2RlZmluZQlwb3AoKQkJKCotLXNwKQotI2RlZmluZQllbXB0eXN0YWNrKCkJKHNwID09IHN0YWNrKQotCi0gIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0gIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOwotICBtZW1zZXQgKHN0YWNrLCAwLCBzaXplb2YgKHN0YWNrKSk7Ci0gIGNvdW50ID0gMDsKLSAgcHJldl9maXh1cCA9IDA7Ci0gIHNhdmVkX3Vud2luZF9iaXRzID0gMDsKLSAgc3AgPSBzdGFjazsKLQotICB3aGlsZSAoZml4dXAgPCBlbmRfZml4dXBzKQotICAgIHsKLQotICAgICAgLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGZpeHVwLiAgV2UnbGwgdXNlCi0JIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gcHV0IHRoaXMgZml4dXAKLQkgb24gdGhlIHF1ZXVlLiAgKi8KLSAgICAgIHNhdmVfZml4dXAgPSBmaXh1cDsKLQotICAgICAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLwotICAgICAgb3AgPSAqZml4dXArKzsKLSAgICAgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKLQotICAgICAgLyogSGFuZGxlIGEgcmVxdWVzdCBmb3IgYSBwcmV2aW91cyBmaXh1cC4gICovCi0gICAgICBpZiAoKmZwLT5mb3JtYXQgPT0gJ1AnKQotCXsKLQkgIC8qIEdldCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByZXYgZml4dXAsIG1vdmUKLQkgICAgIHRoZSByZXBlYXRlZCBmaXh1cCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuICAqLwotCSAgZml4dXAgPSByZWxvY19xdWV1ZVtmcC0+RF0ucmVsb2M7Ci0JICBzb21fcmVsb2NfcXVldWVfZml4IChyZWxvY19xdWV1ZSwgZnAtPkQpOwotCSAgcHJldl9maXh1cCA9IDE7Ci0KLQkgIC8qIEdldCB0aGUgZml4dXAgY29kZSBhbmQgaXRzIGFzc29jaWF0ZWQgZm9ybWF0LiAgKi8KLQkgIG9wID0gKmZpeHVwKys7Ci0JICBmcCA9ICZzb21fZml4dXBfZm9ybWF0c1tvcF07Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGZpeHVwIHdpbGwgYmUgcGFzc2VkIHRvIEJGRCwgc2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gICAgICBpZiAoISBqdXN0X2NvdW50Ci0JICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04KLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfREFUQV9PVkVSUklERSkKLQl7Ci0JICBycHRyLT5hZGRyZXNzID0gb2Zmc2V0OwotCSAgcnB0ci0+aG93dG8gPSAmc29tX2hwcGFfaG93dG9fdGFibGVbb3BdOwotCSAgcnB0ci0+YWRkZW5kID0gMDsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JfQotCi0gICAgICAvKiBTZXQgZGVmYXVsdCBpbnB1dCBsZW5ndGggdG8gMC4gIEdldCB0aGUgb3Bjb2RlIGNsYXNzIGluZGV4Ci0JIGludG8gRC4gICovCi0gICAgICB2YXIgKCdMJykgPSAwOwotICAgICAgdmFyICgnRCcpID0gZnAtPkQ7Ci0gICAgICB2YXIgKCdVJykgPSBzYXZlZF91bndpbmRfYml0czsKLQotICAgICAgLyogR2V0IHRoZSBvcGNvZGUgZm9ybWF0LiAgKi8KLSAgICAgIGNwID0gZnAtPmZvcm1hdDsKLQotICAgICAgLyogUHJvY2VzcyB0aGUgZm9ybWF0IHN0cmluZy4gIFBhcnNpbmcgaGFwcGVucyBpbiB0d28gcGhhc2VzLAotCSBwYXJzZSBSSFMsIHRoZW4gYXNzaWduIHRvIExIUy4gIFJlcGVhdCB1bnRpbCBubyBtb3JlIAotCSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgKi8KLSAgICAgIHdoaWxlICgqY3ApCi0JewotCSAgLyogVGhlIHZhcmlhYmxlIHRoaXMgcGFzcyBpcyBnb2luZyB0byBjb21wdXRlIGEgdmFsdWUgZm9yLiAgKi8KLQkgIHZhcm5hbWUgPSAqY3ArKzsKLQotCSAgLyogU3RhcnQgcHJvY2Vzc2luZyBSSFMuICBDb250aW51ZSB1bnRpbCBhIE5VTEwgb3IgJz0nIGlzIGZvdW5kLiAgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjID0gKmNwKys7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFibGUsIHB1c2ggaXQgb24gdGhlIHN0YWNrLiAgKi8KLQkgICAgICBpZiAoaXN1cHBlciAoYykpCi0JCXB1c2ggKHZhciAoYykpOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLCB0aGVuIGl0IHJlcHJlc2VudHMKLQkJIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBmaXh1cCBzdHJlYW0gdG8gYmUgcHVzaGVkIG9udG8KLQkJIHRoZSBzdGFjay4gICovCi0JICAgICAgZWxzZSBpZiAoaXNsb3dlciAoYykpCi0JCXsKLQkJICBpbnQgYml0cyA9IChjIC0gJ2EnKSAqIDg7Ci0JCSAgZm9yICh2ID0gMDsgYyA+ICdhJzsgLS1jKQotCQkgICAgdiA9ICh2IDw8IDgpIHwgKmZpeHVwKys7Ci0JCSAgaWYgKHZhcm5hbWUgPT0gJ1YnKQotCQkgICAgdiA9IHNpZ25fZXh0ZW5kICh2LCBiaXRzKTsKLQkJICBwdXNoICh2KTsKLQkJfQotCi0JICAgICAgLyogQSBkZWNpbWFsIGNvbnN0YW50LiAgUHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpKQotCQl7Ci0JCSAgdiA9IGMgLSAnMCc7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCpjcCkpCi0JCSAgICB2ID0gKHYgKiAxMCkgKyAoKmNwKysgLSAnMCcpOwotCQkgIHB1c2ggKHYpOwotCQl9Ci0JICAgICAgZWxzZQotCi0JCS8qIEFuIG9wZXJhdG9yLiAgUG9wIHR3byB0d28gdmFsdWVzIGZyb20gdGhlIHN0YWNrIGFuZAotCQkgICB1c2UgdGhlbSBhcyBvcGVyYW5kcyB0byB0aGUgZ2l2ZW4gb3BlcmF0aW9uLiAgUHVzaAotCQkgICB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gYmFjayBvbiB0aGUgc3RhY2suICAqLwotCQlzd2l0Y2ggKGMpCi0JCSAgewotCQkgIGNhc2UgJysnOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgKz0gcG9wICgpOwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICcqJzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ICo9IHBvcCAoKTsKLQkJICAgIHB1c2ggKHYpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnPCc6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiA9IHBvcCAoKSA8PCB2OwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICB9Ci0JICB3aGlsZSAoKmNwICYmICpjcCAhPSAnPScpOwotCi0JICAvKiBNb3ZlIG92ZXIgdGhlIGVxdWFsIG9wZXJhdG9yLiAgKi8KLQkgIGNwKys7Ci0KLQkgIC8qIFBvcCB0aGUgUkhTIG9mZiB0aGUgc3RhY2suICAqLwotCSAgYyA9IHBvcCAoKTsKLQotCSAgLyogUGVyZm9ybSB0aGUgYXNzaWdubWVudC4gICovCi0JICB2YXIgKHZhcm5hbWUpID0gYzsKLQotCSAgLyogSGFuZGxlIHNpZGUgZWZmZWN0cy4gYW5kIHNwZWNpYWwgJ08nIHN0YWNrIGNhc2VzLiAgKi8KLQkgIHN3aXRjaCAodmFybmFtZSkKLQkgICAgewotCSAgICAvKiBDb25zdW1lIHNvbWUgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3BhY2UuICAqLwotCSAgICBjYXNlICdMJzoKLQkgICAgICBvZmZzZXQgKz0gYzsKLQkgICAgICBicmVhazsKLQkgICAgLyogQSBzeW1ib2wgdG8gdXNlIGluIHRoZSByZWxvY2F0aW9uLiAgTWFrZSBhIG5vdGUKLQkgICAgICAgb2YgdGhpcyBpZiB3ZSBhcmUgbm90IGp1c3QgY291bnRpbmcuICAqLwotCSAgICBjYXNlICdTJzoKLQkgICAgICBpZiAoISBqdXN0X2NvdW50KQotCQlycHRyLT5zeW1fcHRyX3B0ciA9ICZzeW1ib2xzW2NdOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGEgZnVuY3Rpb24gY2FsbC4gICovCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIGlmICghIGp1c3RfY291bnQpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdG1wID0gdmFyICgnUicpOwotCQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0KLQkJICBpZiAoKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfUENSRUxfQ0FMTAotCQkgICAgICAgJiYgUl9QQ1JFTF9DQUxMICsgMTAgPiBvcCkKLQkJICAgICAgfHwgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwKLQkJCSAgJiYgUl9BQlNfQ0FMTCArIDEwID4gb3ApKQotCQkgICAgewotCQkgICAgICAvKiBTaW1wbGUgZW5jb2RpbmcuICAqLwotCQkgICAgICBpZiAodG1wID4gNCkKLQkJCXsKLQkJCSAgdG1wIC09IDU7Ci0JCQkgIHJwdHItPmFkZGVuZCB8PSAxOwotCQkJfQotCQkgICAgICBpZiAodG1wID09IDQpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMSA8PCAyOwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMykKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAyKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNjsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDEpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4OwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7Ci0KLQkJICAgICAgLyogRmlyc3QgcGFydCBpcyBlYXN5IC0tIGxvdyBvcmRlciB0d28gYml0cyBhcmUKLQkJCSBkaXJlY3RseSBjb3BpZWQsIHRoZW4gc2hpZnRlZCBhd2F5LiAgKi8KLQkJICAgICAgcnB0ci0+YWRkZW5kID0gdG1wICYgMHgzOwotCQkgICAgICB0bXAgPj49IDI7Ci0KLQkJICAgICAgLyogRGl2aW5nIHRoZSByZXN1bHQgYnkgMTAgZ2l2ZXMgdXMgdGhlIHNlY29uZAotCQkJIHBhcnQuICBJZiBpdCBpcyA5LCB0aGVuIHRoZSBmaXJzdCB0d28gd29yZHMKLQkJCSBhcmUgYSBkb3VibGUgcHJlY2lzaW9uIHBhcmFtYXRlciwgZWxzZSBpdCBpcwotCQkJIDMgKiB0aGUgZmlyc3QgYXJnIGJpdHMgKyB0aGUgMm5kIGFyZyBiaXRzLiAgKi8KLQkJICAgICAgdG1wMSA9IHRtcCAvIDEwOwotCQkgICAgICB0bXAgLT0gdG1wMSAqIDEwOwotCQkgICAgICBpZiAodG1wMSA9PSA5KQotCQkJcnB0ci0+YWRkZW5kICs9ICgweGUgPDwgNik7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogR2V0IHRoZSB0d28gcGllY2VzLiAgKi8KLQkJCSAgdG1wMiA9IHRtcDEgLyAzOwotCQkJICB0bXAxIC09IHRtcDIgKiAzOwotCQkJICAvKiBQdXQgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KLQkJCSAgcnB0ci0+YWRkZW5kICs9ICh0bXAyIDw8IDgpICsgKHRtcDEgPDwgNik7Ci0JCQl9Ci0KLQkJICAgICAgLyogV2hhdCdzIGxlZnQgaXMgdGhlIHRoaXJkIHBhcnQuICBJdCdzIHVucGFja2VkCi0JCQkganVzdCBsaWtlIHRoZSBzZWNvbmQuICAqLwotCQkgICAgICBpZiAodG1wID09IDkpCi0JCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCAyKTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICB0bXAyID0gdG1wIC8gMzsKLQkJCSAgdG1wIC09IHRtcDIgKiAzOwotCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgNCkgKyAodG1wIDw8IDIpOwotCQkJfQotCQkgICAgfQotCQkgIHJwdHItPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKHJwdHItPmFkZGVuZCwgMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgLyogSGFuZGxlIHRoZSBsaW5rZXIgZXhwcmVzc2lvbiBzdGFjay4gICovCi0JICAgIGNhc2UgJ08nOgotCSAgICAgIHN3aXRjaCAob3ApCi0JCXsKLQkJY2FzZSBSX0NPTVAxOgotCQkgIHN1Ym9wID0gY29tcDFfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJY2FzZSBSX0NPTVAyOgotCQkgIHN1Ym9wID0gY29tcDJfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJY2FzZSBSX0NPTVAzOgotCQkgIHN1Ym9wID0gY29tcDNfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIHdoaWxlICgqc3Vib3AgPD0gKHVuc2lnbmVkIGNoYXIpIGMpCi0JCSsrc3Vib3A7Ci0JICAgICAgLS1zdWJvcDsKLQkgICAgICBicmVhazsKLQkgICAgLyogVGhlIGxvd2VyIDMydW53aW5kIGJpdHMgbXVzdCBiZSBwZXJzaXN0ZW50LiAgKi8KLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgc2F2ZWRfdW53aW5kX2JpdHMgPSB2YXIgKCdVJyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgdXNlZCBhIHByZXZpb3VzIGZpeHVwLCBjbGVhbiB1cCBhZnRlciBpdC4gICovCi0gICAgICBpZiAocHJldl9maXh1cCkKLQl7Ci0JICBmaXh1cCA9IHNhdmVfZml4dXAgKyAxOwotCSAgcHJldl9maXh1cCA9IDA7Ci0JfQotICAgICAgLyogUXVldWUgaXQuICAqLwotICAgICAgZWxzZSBpZiAoZml4dXAgPiBzYXZlX2ZpeHVwICsgMSkKLQlzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChzYXZlX2ZpeHVwLCBmaXh1cCAtIHNhdmVfZml4dXAsIHJlbG9jX3F1ZXVlKTsKLQotICAgICAgLyogV2UgZG8gbm90IHBhc3MgUl9EQVRBX09WRVJSSURFIG9yIFJfTk9fUkVMT0NBVElPTiAKLQkgZml4dXBzIHRvIEJGRC4gICovCi0gICAgICBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFCi0JICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04pCi0JewotCSAgLyogRG9uZSB3aXRoIGEgc2luZ2xlIHJlbG9jdGlvbi4gTG9vcCBiYWNrIHRvIHRoZSB0b3AuICAqLwotCSAgaWYgKCEganVzdF9jb3VudCkKLQkgICAgewotCSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VOVFJZKQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdUJyk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9FWElUKQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdVJyk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCi0JCSAgICAgICB8fCBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0FCU19DQUxMKQotCQk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9EQVRBX09ORV9TWU1CT0wpCi0JCXsKLQkJICB1bnNpZ25lZCBhZGRlbmQgPSB2YXIgKCdWJyk7Ci0KLQkJICAvKiBUcnkgd2hhdCB3YXMgc3BlY2lmaWVkIGluIFJfREFUQV9PVkVSUklERSBmaXJzdAotCQkgICAgIChpZiBhbnl0aGluZykuICBUaGVuIHRoZSBoYXJkIHdheSB1c2luZyB0aGUKLQkJICAgICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQkJICBycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7Ci0KLQkJICBpZiAocnB0ci0+YWRkZW5kID09IDAgJiYgIXNlY3Rpb24tPmNvbnRlbnRzKQotCQkgICAgewotCQkgICAgICAvKiBHb3QgdG8gcmVhZCB0aGUgZGFtbiBjb250ZW50cyBmaXJzdC4gIFdlIGRvbid0Ci0JCSAgICAgICAgIGJvdGhlciBzYXZpbmcgdGhlIGNvbnRlbnRzICh5ZXQpLiAgQWRkIGl0IG9uZQotCQkJIGRheSBpZiB0aGUgbmVlZCBhcmlzZXMuICAqLwotCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9IGJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCi0JCSAgICAgIGRlYWxsb2NhdGVfY29udGVudHMgPSAxOwotCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHNlY3Rpb24tPm93bmVyLAotCQkJCQkJc2VjdGlvbiwKLQkJCQkJCXNlY3Rpb24tPmNvbnRlbnRzLAotCQkJCQkJMCwKLQkJCQkJCXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAocnB0ci0+YWRkZW5kID09IDApCi0JCSAgICBycHRyLT5hZGRlbmQgPSBiZmRfZ2V0XzMyIChzZWN0aW9uLT5vd25lciwKLQkJCQkJICAgICAgIChzZWN0aW9uLT5jb250ZW50cwotCQkJCQkJKyBvZmZzZXQgLSB2YXIgKCdMJykpKTsKLQkJCQotCQl9Ci0JICAgICAgZWxzZQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7Ci0JICAgICAgcnB0cisrOwotCSAgICB9Ci0JICBjb3VudCsrOwotCSAgLyogTm93IHRoYXQgd2UndmUgaGFuZGxlZCBhICJmdWxsIiByZWxvY2F0aW9uLCByZXNldAotCSAgICAgc29tZSBzdGF0ZS4gICovCi0JICBtZW1zZXQgKHZhcmlhYmxlcywgMCwgc2l6ZW9mICh2YXJpYWJsZXMpKTsKLQkgIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKLQl9Ci0gICAgfQotICBpZiAoZGVhbGxvY2F0ZV9jb250ZW50cykKLSAgICBmcmVlIChzZWN0aW9uLT5jb250ZW50cyk7Ci0KLSAgcmV0dXJuIGNvdW50OwotCi0jdW5kZWYgdmFyCi0jdW5kZWYgcHVzaAotI3VuZGVmIHBvcAotI3VuZGVmIGVtcHR5c3RhY2sKLX0KLQotLyogUmVhZCBpbiB0aGUgcmVsb2NzIChha2EgZml4dXBzIGluIFNPTSB0ZXJtcykgZm9yIGEgc2VjdGlvbi4gCi0KLSAgIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgY2FsbHMgdGhpcyByb3V0aW5lIHdpdGggSlVTVF9DT1VOVCAKLSAgIHNldCB0byB0cnVlIHRvIGluZGljYXRlIGl0IG9ubHkgbmVlZHMgYSBjb3VudCBvZiB0aGUgbnVtYmVyCi0gICBvZiBhY3R1YWwgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBqdXN0X2NvdW50OwotewotICBjaGFyICpleHRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBmaXh1cF9zdHJlYW1fc2l6ZTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICB1bnNpZ25lZCBpbnQgbnVtX3JlbG9jczsKLQotICBmaXh1cF9zdHJlYW1fc2l6ZSA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zaXplOwotICAvKiBJZiB0aGVyZSB3ZXJlIG5vIHJlbG9jYXRpb25zLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiByZWxvY19jb3VudCBpcyAtMSwgdGhlbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gaGFzIG5vdCBiZWVuIAotICAgICBwYXJzZWQuICBXZSBtdXN0IGRvIHNvIG5vdyB0byBrbm93IGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IC0xKQotICAgIHsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGZpeHVwX3N0cmVhbV9zaXplKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gKGNoYXIgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBmb3Jtcy4gKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgKyBzZWN0aW9uLT5yZWxfZmlsZXBvcywKLQkJICAgIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZml4dXBfc3RyZWFtX3NpemUsIGFiZmQpCi0JICAhPSBmaXh1cF9zdHJlYW1fc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIExldCBjYWxsZXJzIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZm91bmQuCi0JIGFsc28gc2F2ZSB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gYXMgd2Ugd2lsbAotCSBuZWVkIGl0IGFnYWluLiAgKi8KLSAgICAgIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsCi0JCQkJCQkgZml4dXBfc3RyZWFtX3NpemUsCi0JCQkJCQkgTlVMTCwgTlVMTCwgTlVMTCwgdHJ1ZSk7Ci0KLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW0gPSBleHRlcm5hbF9yZWxvY3M7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBjYWxsZXIgb25seSB3YW50ZWQgYSBjb3VudCwgdGhlbiByZXR1cm4gbm93LiAgKi8KLSAgaWYgKGp1c3RfY291bnQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbnVtX3JlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBleHRlcm5hbF9yZWxvY3MgPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtOwotICAvKiBSZXR1cm4gc2F2ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbG9jYXRpb25zIGlmIGl0IGlzIGF2YWlsYWJsZS4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uICE9IChhcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgKG51bV9yZWxvY3MgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHJvY2VzcyBhbmQgaW50ZXJuYWxpemUgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsIGZpeHVwX3N0cmVhbV9zaXplLAotCQkgICAgICBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKTsKLQotICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgRnJlZSB0aGVtLiAgKi8KLSAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IE5VTEw7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLwotICBzZWN0aW9uLT5yZWxvY2F0aW9uID0gaW50ZXJuYWxfcmVsb2NzOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVsb2NhdGlvbgotICAgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8gCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICAvKiBJZiBzZWN0aW9uIGhhcyByZWxvY2F0aW9ucywgdGhlbiByZWFkIGluIHRoZSByZWxvY2F0aW9uIHN0cmVhbQotICAgICBhbmQgcGFyc2UgaXQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykKLSAgICB7Ci0gICAgICBpZiAoISBzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBOVUxMLCB0cnVlKSkKLQlyZXR1cm4gLTE7Ci0gICAgICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotICAgIH0KLSAgLyogVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgcmVsb2NhdGlvbnMgZnJvbSBTT00gKGV4dGVybmFsKSBmb3JtIGludG8gQkZEIGludGVybmFsCi0gICBmb3JtLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgaW50IGNvdW50OwotCi0gIGlmIChzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICB3aGlsZSAoY291bnQtLSkKLSAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotCi0vKiBBIGhvb2sgdG8gc2V0IHVwIG9iamVjdCBmaWxlIGRlcGVuZGVudCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9Ci0gICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IDM7Ci0KLSAgLyogV2UgYWxsb3cgbW9yZSB0aGFuIHRocmVlIHNlY3Rpb25zIGludGVybmFsbHkgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHN5bWJvbAotICAgdG8gdGhlIG91dHB1dCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXN5bWJvbCAqaXN5bWJvbDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICpvc3ltYm9sOwotewotICBzdHJ1Y3Qgc29tX3N5bWJvbCAqaW5wdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIGlzeW1ib2w7Ci0gIHN0cnVjdCBzb21fc3ltYm9sICpvdXRwdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIG9zeW1ib2w7Ci0KLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgb25seSBwcml2YXRlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gY29weSBpcyB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgotICAgICBiaXRzLiAgKi8KLSAgb3V0cHV0X3N5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9Ci0gICAgaW5wdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uCi0gICB0byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjdGlvbjsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgKCFzb21faXNfc3BhY2UgKGlzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChpc2VjdGlvbikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhCi0gICAgPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0gICAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWVtY3B5IChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSwKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKGlzZWN0aW9uKS0+Y29weV9kYXRhLAotCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLQotICAvKiBSZXBhcmVudCBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lcikKLSAgICBzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0KLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQsICpvYmZkOwotewotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCB0aGUgZGF0YSB3ZSBuZWVkLiAgKi8KLSAgb2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID0gKHN0cnVjdCBzb21fZXhlY19kYXRhICopCi0gICAgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOwotICBpZiAob2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgbWVtY3B5IChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCksIG9ial9zb21fZXhlY19kYXRhIChpYmZkKSwKLQkgIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQKLSAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0X2tleSwgc3BudW0pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBpbnQgZGVmaW5lZDsKLSAgICAgaW50IHByaXZhdGU7Ci0gICAgIHVuc2lnbmVkIGludCBzb3J0X2tleTsKLSAgICAgaW50IHNwbnVtOwotewotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbWFnaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEKLQk9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLQkgIGJmZF96YWxsb2MgKHNlY3Rpb24tPm93bmVyLAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICAgICAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleSA9IHNvcnRfa2V5OwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19kZWZpbmVkID0gZGVmaW5lZDsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfcHJpdmF0ZSA9IHByaXZhdGU7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IHNlY3Rpb247Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlciA9IHNwbnVtOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc3Vic2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQgCi0gICBpbiB0aGUgQkZEIGRhdGEgc3RydWN0dXJlcy4gICovCi0KLWJvb2xlYW4KLWJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgY29udGFpbmVyLCBhY2Nlc3MsCi0JCQkJICAgc29ydF9rZXksIHF1YWRyYW50KQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OwotICAgICBpbnQgcXVhZHJhbnQ7Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQotCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmFjY2Vzc19jb250cm9sX2JpdHMgPSBhY2Nlc3M7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnF1YWRyYW50ID0gcXVhZHJhbnQ7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZnVsbCBTT00gc3ltYm9sIHR5cGUuICBTT00gbmVlZHMgZmFyIG1vcmUgc3ltYm9sIGluZm9ybWF0aW9uCi0gICB0aGFuIGFueSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXQgSSdtIGF3YXJlIG9mLiAgSXQgaXMgbWFuZGF0b3J5Ci0gICB0byBiZSBhYmxlIHRvIGtub3cgaWYgYSBzeW1ib2wgaXMgYW4gZW50cnkgcG9pbnQsIG1pbGxpY29kZSwgZGF0YSwKLSAgIGNvZGUsIGFic29sdXRlLCBzdG9yYWdlIHJlcXVlc3QsIG9yIHByb2NlZHVyZSBsYWJlbC4gIElmIHlvdSBnZXQKLSAgIHRoZSBzeW1ib2wgdHlwZSB3cm9uZyB5b3VyIHByb2dyYW0gd2lsbCBub3QgbGluay4gICovCi0KLXZvaWQKLWJmZF9zb21fc2V0X3N5bWJvbF90eXBlIChzeW1ib2wsIHR5cGUpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPSB0eXBlOwotfQotCi0vKiBBdHRhY2ggYW4gYXV4aWxpYXJ5IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKLSAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotYm9vbGVhbgotYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoYWJmZCwgdHlwZSwgc3RyaW5nKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICh0eXBlID09IFZFUlNJT05fQVVYX0lEKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBpbnQgcGFkID0gMDsKLQotICAgICAgaWYgKGxlbiAlIDQpCi0JcGFkID0gKDQgLSAobGVuICUgNCkpOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgPSAoc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKikKLQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCi0JCQkgICAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7Ci0gICAgICBpZiAoIW9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQudHlwZSA9IFZFUlNJT05fQVVYX0lEOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCArPSBzaXplb2YgKGludCk7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKLSAgICAgIHN0cm5jcHkgKG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT51c2VyX3N0cmluZywgc3RyaW5nLCBsZW4pOwotICAgIH0KLSAgZWxzZSBpZiAodHlwZSA9PSBDT1BZUklHSFRfQVVYX0lEKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBpbnQgcGFkID0gMDsKLQotICAgICAgaWYgKGxlbiAlIDQpCi0JcGFkID0gKDQgLSAobGVuICUgNCkpOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSA9IChzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKikKLQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCi0JCQkgICAgKyBzaXplb2YgKHVuc2lnbmVkIGludCkgKyBsZW4gKyBwYWQpOwotICAgICAgaWYgKCFvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gQ09QWVJJR0hUX0FVWF9JRDsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPnN0cmluZ19sZW5ndGggPSBsZW47Ci0gICAgICBzdHJjcHkgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmNvcHlyaWdodCwgc3RyaW5nKTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBdHRhY2ggYW4gY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgdG8gdGhlIEJGRCBiYWNrZW5kIHNvIHRoYXQgaXQgbWF5IGJlCi0gICB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCAoYWJmZCwgbmFtZSwgbGFuZ3VhZ2VfbmFtZSwgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25faWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2VfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJvZHVjdF9pZDsKLSAgICAgY29uc3QgY2hhciAqdmVyc2lvbl9pZDsKLXsKLSAgQ09NUFVOSVQgKm4gPSAoQ09NUFVOSVQgKikgYmZkX3phbGxvYyAoYWJmZCwgQ09NUFVOSVRTWik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jZGVmaW5lIFNUUkRVUChmKSBcCi0gIGlmIChmICE9IE5VTEwpIFwKLSAgICB7IFwKLSAgICAgIG4tPmYubl9uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGYpICsgMSk7IFwKLSAgICAgIGlmIChuLT5mLm5fbmFtZSA9PSBOVUxMKSBcCi0JcmV0dXJuIGZhbHNlOyBcCi0gICAgICBzdHJjcHkgKG4tPmYubl9uYW1lLCBmKTsgXAotICAgIH0KLQotICBTVFJEVVAgKG5hbWUpOwotICBTVFJEVVAgKGxhbmd1YWdlX25hbWUpOwotICBTVFJEVVAgKHByb2R1Y3RfaWQpOwotICBTVFJEVVAgKHZlcnNpb25faWQpOwotCi0jdW5kZWYgU1RSRFVQCi0KLSAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSA9IG47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKShvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCBiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKTEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KLSAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZwotCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOwotICAgIH0KLQotICAvKiBPbmx5IHdyaXRlIHN1YnNwYWNlcyB3aGljaCBoYXZlICJyZWFsIiBjb250ZW50cyAoZWcuIHRoZSBjb250ZW50cwotICAgICBhcmUgbm90IGdlbmVyYXRlZCBhdCBydW4gdGltZSBieSB0aGUgT1MpLiAgKi8KLSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pCi0gICAgICB8fCAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlayB0byB0aGUgcHJvcGVyIG9mZnNldCB3aXRoaW4gdGhlIG9iamVjdCBmaWxlIGFuZCB3cml0ZSB0aGUKLSAgICAgZGF0YS4gICovCi0gIG9mZnNldCArPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZTsgCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIC8qIEFsbG93IGFueSBhcmNoaXRlY3R1cmUgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBTT00gYmFja2VuZCAqLwotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiAoZmFsc2UpOwotfQotCi1zdGF0aWMgaW50Ci1zb21fc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiKSk7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0gICBTT00gc2VjdGlvbiBTLCBvciAnPycgZm9yIGFuIHVua25vd24gU09NIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgY2hhcgotc29tX3NlY3Rpb25fdHlwZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSAqdDsKLQotICBmb3IgKHQgPSAmc3R0WzBdOyB0LT5zZWN0aW9uOyB0KyspCi0gICAgaWYgKCFzdHJjbXAgKHMsIHQtPnNlY3Rpb24pKQotICAgICAgcmV0dXJuIHQtPnR5cGU7Ci0gIHJldHVybiAnPyc7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvbV9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBjaGFyIGM7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0MnOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnVSc7Ci0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdJJzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICByZXR1cm4gJ1cnOwotICBpZiAoIShzeW1ib2wtPmZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpICE9IE5VTEwKLQkgICYmIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gc29tX3NlY3Rpb25fdHlwZSAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgZWxzZQotICAgIHJldHVybiAnPyc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBjID0gdG91cHBlciAoYyk7Ci0gIHJldHVybiBjOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgU09NIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICByZXQtPnR5cGUgPSBzb21fZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpOwotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZStzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBOZWNlc3NhcnkKLSAgIHNvIHRoYXQgd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvciBhbGwgdGhlIGNhcnN5bXMgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyICpsc3RfaGVhZGVyOwotICAgICBzeW1pbmRleCAqY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIGhhc2hfdGFibGUgPSAKLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQotCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIGNvdW50ZXIhICAqLwotICAqY291bnQgPSAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzIHRhYmxlIGlzIGFuIGFycmF5IG9mIDMyYml0IGZpbGUgb2Zmc2V0cwotICAgICB3aGljaCBwb2ludCB0byB0aGUgaGFzaCBjaGFpbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhhc2hfdGFibGUsIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2FsayBlYWNoIGNoYWluIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBvbiB0aGF0IHBhcnRpY3VsYXIKLSAgICAgY2hhaW4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHN0X2hlYWRlci0+aGFzaF9zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkIGxzdF9zeW1ib2w7Ci0KLSAgICAgIC8qIEFuIGVtcHR5IGNoYWluIGhhcyB6ZXJvIGFzIGl0J3MgZmlsZSBvZmZzZXQuICAqLwotICAgICAgaWYgKGhhc2hfdGFibGVbaV0gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlayB0byB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgaGFzaF90YWJsZVtpXSwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGlzIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSBjb3VudGVyLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKCpjb3VudCkrKzsKLQotICAgICAgLyogTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBvbiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCi0JICAvKiBTZWVrIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X3N5bWJvbC5uZXh0X2VudHJ5LCBTRUVLX1NFVCkKLQkgICAgICA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBSZWFkIHRoZSBzeW1ib2wgaW4gYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgKCpjb3VudCkrKzsKLQl9Ci0gICAgfQotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBGaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzIChTWU1TKSBmcm9tIHRoZSBhcmNoaXZlIGRlc2NyaWJlZAotICAgYnkgQUJGRCBhbmQgTFNUX0hFQURFUi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgbHN0X2hlYWRlciwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKLSAgICAgY2Fyc3ltICoqc3ltczsKLXsKLSAgdW5zaWduZWQgaW50IGksIGxlbjsKLSAgY2Fyc3ltICpzZXQgPSBzeW1zWzBdOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBzdHJ1Y3Qgc29tX2VudHJ5ICpzb21fZGljdCA9IE5VTEw7Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgaGFzaF90YWJsZSA9IAotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+aGFzaF9zaXplCi0JCQkJICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+bW9kdWxlX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBpZiAoc29tX2RpY3QgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKLSAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNlZWsgdG8gYW5kIHJlYWQgaW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmlsbAotICAgICBpbiB0aGUgY2Fyc3ltJ3MgZmlsZXBvcyBmaWVsZC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgc29tX2RpY3QsIGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCwgCi0JCXNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdhbGsgZWFjaCBjaGFpbiBmaWxsaW5nIGluIHRoZSBjYXJzeW1zIGFzIHdlIGdvIGFsb25nLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOwotCi0gICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KLSAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZWsgdG8gYW5kIHJlYWQgdGhlIGZpcnN0IHN5bWJvbCBvbiB0aGUgY2hhaW4uICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGZpcnN0IGdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIHN0b3JlZAotCSBhcyBhIDMyYml0IGludGVnZXIganVzdCBiZWZvcmUgdGhlIHN5bWJvbC4KLQotCSBPbmUgbWlnaHQgYXNrIHdoeSB3ZSBkb24ndCBqdXN0IHJlYWQgaW4gdGhlIGVudGlyZSBzdHJpbmcgdGFibGUKLQkgYW5kIGluZGV4IGludG8gaXQuICBXZWxsLCBhY2NvcmRpbmcgdG8gdGhlIFNPTSBBQkkgdGhlIHN0cmluZwotCSBpbmRleCBjYW4gcG9pbnQgKmFueXdoZXJlKiBpbiB0aGUgYXJjaGl2ZSB0byBzYXZlIHNwYWNlLCBzbyBqdXN0Ci0JIHVzaW5nIHRoZSBzdHJpbmcgdGFibGUgd291bGQgbm90IGJlIHNhZmUuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MKLQkJCSAgICArIGxzdF9zeW1ib2wubmFtZS5uX3N0cnggLSA0LCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLSAgICAgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICAgICAgaWYgKCFzZXQtPm5hbWUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNldC0+bmFtZVtsZW5dID0gMDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCi0JIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQotICAgICAgLyogR28gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLSAgICAgIHNldCsrOwotCi0gICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wgYW5kIHJlYWQgaXQgaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpIDwwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFNlZWsgdG8gdGhlIG5hbWUgbGVuZ3RoICYgc3RyaW5nIGFuZCByZWFkIHRoZW0gaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MgCi0JCQkJKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLQkgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCSAgaWYgKCFzZXQtPm5hbWUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc2V0LT5uYW1lW2xlbl0gPSAwOwotCi0JICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldC4gIE5vdGUgdGhhdCB0aGUgImxvY2F0aW9uIiBmaWVsZCBwb2ludHMKLQkgICAgIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0JICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgICAgICAgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCi0JICAvKiBHbyBvbiB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgc2V0Kys7Ci0JfQotICAgIH0KLSAgLyogSWYgd2UgaGF2ZW4ndCBkaWVkIGJ5IG5vdywgdGhlbiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCB0aGUgZW50aXJlIAotICAgICBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIHRoZSBMU1QgZnJvbSB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBhcl9oZHIgYXJfaGVhZGVyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgLyogU3BlY2lhbCBjYXNlcy4gICovCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRm9yIGFyY2hpdmVzIHdpdGhvdXQgLm8gZmlsZXMgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZWFkIGluIGFuZCBzYW5pdHkgY2hlY2sgdGhlIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmYXJfaGVhZGVyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKGFyX2hlYWRlci5hcl9mbWFnLCBBUkZNQUcsIDIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEhvdyBiaWcgaXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGVudHJ5PyAgKi8KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoYXJfaGVhZGVyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2F2ZSBvZmYgdGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWFsIHVzZXIgZGF0YS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpICsgcGFyc2VkX3NpemU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICBXZSdsbCBtYWtlIGhlYXZ5IHVzZSBvZiB0aGlzCi0gICAgIGluIGp1c3QgYSBtaW51dGUuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgaWYgKGxzdF9oZWFkZXIuYV9tYWdpYyAhPSBMSUJNQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZl9jb3VudCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAtIHBhcnNlZF9zaXplIAotCQkJKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5pdGlhbGl6YWUgdGhlIGNhY2hlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzLiAgKi8KLSAgaWYgKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIChhYmZkLCAmbHN0X2hlYWRlciwgJmFyZGF0YS0+c3ltZGVmcykKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWVrIGJhY2sgdG8gdGhlICJmaXJzdCIgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIE5vdGUgdGhlICJmaXJzdCIKLSAgICAgZmlsZSBtYXkgYmUgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3RpZnkgdGhlIGdlbmVyaWMgYXJjaGl2ZSBjb2RlIHRoYXQgd2UgaGF2ZSBhIHN5bWJvbCBtYXAuICAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQmVnaW4gcHJlcGFyaW5nIHRvIHdyaXRlIGEgU09NIGxpYnJhcnkgc3ltYm9sIHRhYmxlLgotCi0gICBBcyBwYXJ0IG9mIHRoZSBwcmVwIHdvcmsgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzCi0gICBhbmQgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgbnVtX3N5bXMsIHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICpudW1fc3ltcywgKnN0cmluZ3NpemU7Ci17Ci0gIGJmZCAqY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gICpudW1fc3ltcyA9IDA7Ci0gICpzdHJpbmdzaXplID0gMDsKLQotICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBCRkQgd2l0aGluIHRoaXMgYXJjaGl2ZS4gICovCi0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOwotICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKLQkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JewotCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bSA9IG9ial9zb21fc3ltdGFiIChjdXJyX2JmZCk7Ci0gICAgICBjdXJyX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoY3Vycl9iZmQpOwotCi0gICAgICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHRvIGRldGVybWluZSBpZiBpdCBiZWxvbmdzIGluIHRoZQotCSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3Vycl9jb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotCSAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLQkgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGN1cnJfYmZkLCAmc3ltLT5zeW1ib2wsICZpbmZvKTsKLQotCSAgLyogU2hvdWxkIHdlIGluY2x1ZGUgdGhpcyBzeW1ib2w/ICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfTlVMTAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE9ubHkgZ2xvYmFsIHN5bWJvbHMgYW5kIHVuc2F0aXNmaWVkIGNvbW1vbnMuICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3Njb3BlICE9IFNTX1VOSVZFUlNBTAotCSAgICAgICYmIGluZm8uc3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERvIG5vIGluY2x1ZGUgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBCdW1wIHRoZSB2YXJpb3VzIGNvdW50ZXJzLCBiZWluZyBjYXJlZnVsIHRvIGhvbm9yCi0JICAgICBhbGlnbm1lbnQgY29uc2lkZXJhdGlvbnMgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAoKm51bV9zeW1zKSsrOwotCSAgKnN0cmluZ3NpemUgPSAqc3RyaW5nc2l6ZSArIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyA1OwotCSAgd2hpbGUgKCpzdHJpbmdzaXplICUgNCkKLQkgICAgKCpzdHJpbmdzaXplKSsrOwotCX0KLQotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYXNoIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHByZXNlbnRlZCBpbiB0aGUKLSAgIFNPTSBBQkkuICAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHN5bWJvbC0+bmFtZSk7Ci0KLSAgLyogTmFtZXMgd2l0aCBsZW5ndGggMSBhcmUgc3BlY2lhbC4gICovCi0gIGlmIChsZW4gPT0gMSkKLSAgICByZXR1cm4gMHgxMDAwMTAwIHwgKHN5bWJvbC0+bmFtZVswXSA8PCAxNikgfCBzeW1ib2wtPm5hbWVbMF07Ci0KLSAgcmV0dXJuICgobGVuICYgMHg3ZikgPDwgMjQpIHwgKHN5bWJvbC0+bmFtZVsxXSA8PCAxNikKLQkgIHwgKHN5bWJvbC0+bmFtZVtsZW4tMl0gPDwgOCkgfCBzeW1ib2wtPm5hbWVbbGVuLTFdOwotfQotCi0vKiBEbyB0aGUgYnVsayBvZiB0aGUgd29yayByZXF1aXJlZCB0byB3cml0ZSB0aGUgU09NIGxpYnJhcnkKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0gICAKLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ19zaXplLCBsc3QsIGVsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG5zeW1zLCBzdHJpbmdfc2l6ZTsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICAgICB1bnNpZ25lZCBlbGVuZ3RoOwotewotICBmaWxlX3B0ciBsc3RfZmlsZXBvczsKLSAgY2hhciAqc3RyaW5ncyA9IE5VTEwsICpwOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKmxzdF9zeW1zID0gTlVMTCwgKmN1cnJfbHN0X3N5bTsKLSAgYmZkICpjdXJyX2JmZDsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKipsYXN0X2hhc2hfZW50cnkgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgY3Vycl9zb21fb2Zmc2V0LCBzb21faW5kZXggPSAwOwotCi0gIGhhc2hfdGFibGUgPQotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0Lm1vZHVsZV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0Lm1vZHVsZV9jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxhc3RfaGFzaF9lbnRyeSA9Ci0gICAgKChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKiopCi0gICAgIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKSkpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvdHMgb2YgZmllbGRzIGFyZSBmaWxlIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIGxzdCByZWNvcmQuICBTbyBzYXZlIGl0cyBsb2NhdGlvbi4gICovCi0gIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gIG1lbXNldCAoaGFzaF90YWJsZSwgMCwgNCAqIGxzdC5oYXNoX3NpemUpOwotICBtZW1zZXQgKHNvbV9kaWN0LCAwLCBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIG1lbXNldCAobGFzdF9oYXNoX2VudHJ5LCAwLCAJCi0JICBsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpOwotCi0gIC8qIFN5bWJvbHMgaGF2ZSBzb21faW5kZXggZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIGluZGV4IG9mIGVhY2ggU09NIGluIHRoZSBhcmNoaXZlLgotCi0gICAgIFRoZSBTT00gZGljdGlvbmFyeSBoYXMgKGFtb25nIG90aGVyIHRoaW5ncykgdGhlIGFic29sdXRlIGZpbGUKLSAgICAgcG9zaXRpb24gZm9yIHRoZSBTT00gd2hpY2ggYSBwYXJ0aWN1bGFyIGRpY3Rpb25hcnkgZW50cnkKLSAgICAgZGVzY3JpYmVzLiAgV2UgaGF2ZSB0byBjb21wdXRlIHRoYXQgaW5mb3JtYXRpb24gYXMgd2UgaXRlcmF0ZQotICAgICB0aHJvdWdoIHRoZSBTT01zL3N5bWJvbHMuICAqLwotICBzb21faW5kZXggPSAwOwotCi0gIC8qIFdlIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdHdpY2UgYXMgdGhlIGxvY2F0aW9uCi0gICAgIGluIHRoZSBTT00gZGljdGlvbmFyeSBpcyB0aGUgYWN0dWFsIG9mZnNldCBvZiB0aGUgU09NLCBub3QgdGhlCi0gICAgIGFyY2hpdmUgaGVhZGVyIGJlZm9yZSB0aGUgU09NLiAgKi8KLSAgY3Vycl9zb21fb2Zmc2V0ID0gOCArIDIgKiBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgbHN0LmZpbGVfZW5kOwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGFyY2hpdmUgaGVhZGVyIGFuZCB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgIGV4dGVuZGVkIHN0cmluZyB0YWJsZS4gIE5vdGUgdGhhdCBlbGVuZ3RoIGluY2x1ZGVzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUhICAqLwotICBpZiAoZWxlbmd0aCkKLSAgICBjdXJyX3NvbV9vZmZzZXQgKz0gZWxlbmd0aDsKLQotICAvKiBNYWtlIHN1cmUgd2UncmUgcHJvcGVybHkgYWxpZ25lZC4gICovCi0gIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLQotICAvKiBGSVhNRSBzaG91bGQgYmUgZG9uZSB3aXRoIGJ1ZmZlcnMganVzdCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLwotICBsc3Rfc3ltcyA9IGJmZF9tYWxsb2MgKG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKTsKLSAgaWYgKGxzdF9zeW1zID09IE5VTEwgJiYgbnN5bXMgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc3RyaW5ncyA9IGJmZF9tYWxsb2MgKHN0cmluZ19zaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCAmJiBzdHJpbmdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBzdHJpbmdzOwotICBjdXJyX2xzdF9zeW0gPSBsc3Rfc3ltczsKLQotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGN1cnJfY291bnQsIGk7Ci0gICAgICBzb21fc3ltYm9sX3R5cGUgKnN5bTsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIGZvciBub24tU09NIG9iamVjdHMuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdAotCSAgfHwgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQl7Ci0JICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiByZWFkLCB0aGVuIHNuYWcgYSBwb2ludGVyCi0JIHRvIGl0LiAgSXQncyBhIGxpdHRsZSBzbGltZXkgdG8gZ3JhYiB0aGUgc3ltYm9scyB2aWEgb2JqX3NvbV9zeW10YWIsCi0JIGJ1dCBkb2luZyBzbyBhdm9pZHMgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeS4gICovCi0gICAgICBpZiAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoY3Vycl9iZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOwotICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLQkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0JICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7Ci0KLQkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKLQkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3ltYm9sIGZyb20gdGhpcyBTT00sIHRoZW4gdXBkYXRlCi0JICAgICB0aGUgU09NIGRpY3Rpb25hcnkgdG9vLiAgKi8KLQkgIGlmIChzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID09IDApCi0JICAgIHsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID0gY3Vycl9zb21fb2Zmc2V0OwotCSAgICAgIHNvbV9kaWN0W3NvbV9pbmRleF0ubGVuZ3RoID0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpOwotCSAgICB9Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIGxzdCBzeW1ib2wgcmVjb3JkLiAgKi8KLQkgIGN1cnJfbHN0X3N5bS0+aGlkZGVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c2Vjb25kYXJ5X2RlZiA9IGluZm8uc2Vjb25kYXJ5X2RlZjsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3R5cGUgPSBpbmZvLnN5bWJvbF90eXBlOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfc2NvcGUgPSBpbmZvLnN5bWJvbF9zY29wZTsKLQkgIGN1cnJfbHN0X3N5bS0+Y2hlY2tfbGV2ZWwgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5tdXN0X3F1YWxpZnkgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5pbml0aWFsbHlfZnJvemVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bWVtb3J5X3Jlc2lkZW50ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aXNfY29tbW9uID0gYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKTsKLQkgIGN1cnJfbHN0X3N5bS0+ZHVwX2NvbW1vbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnhsZWFzdCA9IDM7Ci0JICBjdXJyX2xzdF9zeW0tPmFyZ19yZWxvYyA9IGluZm8uYXJnX3JlbG9jOwotCSAgY3Vycl9sc3Rfc3ltLT5uYW1lLm5fc3RyeCA9IHAgLSBzdHJpbmdzICsgNDsKLQkgIGN1cnJfbHN0X3N5bS0+cXVhbGlmaWVyX25hbWUubl9zdHJ4ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2luZm8gPSBpbmZvLnN5bWJvbF9pbmZvOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfdmFsdWUgPSBpbmZvLnN5bWJvbF92YWx1ZSB8IGluZm8ucHJpdl9sZXZlbDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2Rlc2NyaXB0b3IgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5yZXNlcnZlZCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnNvbV9pbmRleCA9IHNvbV9pbmRleDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSA9IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggKCZzeW0tPnN5bWJvbCk7Ci0JICBjdXJyX2xzdF9zeW0tPm5leHRfZW50cnkgPSAwOwotCi0JICAvKiBJbnNlcnQgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0JICBpZiAoaGFzaF90YWJsZVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqdG1wOwotCi0JICAgICAgLyogVGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgYXQgdGhlIGhlYWQgb2YgdGhpcyBoYXNoIGNoYWluLAotCQkgc28gdGFjayB0aGlzIHN5bWJvbCBvbnRvIHRoZSBlbmQgb2YgdGhlIGNoYWluLiAgKi8KLQkgICAgICB0bXAgPSBsYXN0X2hhc2hfZW50cnlbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV07Ci0JICAgICAgdG1wLT5uZXh0X2VudHJ5Ci0JCT0gKGN1cnJfbHN0X3N5bSAtIGxzdF9zeW1zKSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKQotCQkgICsgbHN0Lmhhc2hfc2l6ZSAqIDQgCi0JCSAgKyBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KQotCQkgICsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZpcnN0IGVudHJ5IGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0JICAgICAgaGFzaF90YWJsZVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0KLQkgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3ltYm9sIHdlIGFkZGVkIHRvIHRoaXMgY2hhaW4gc28gd2UgY2FuCi0JICAgICBlYXNpbHkgdXBkYXRlIGl0cyBuZXh0X2VudHJ5IHBvaW50ZXIuICAqLwotCSAgbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdCi0JICAgID0gY3Vycl9sc3Rfc3ltOwotCi0KLQkgIC8qIFVwZGF0ZSB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSksIHApOwotCSAgcCArPSA0OwotCSAgc3RyY3B5IChwLCBzeW0tPnN5bWJvbC5uYW1lKTsKLQkgIHAgKz0gc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSArIDE7Ci0JICB3aGlsZSAoKGludClwICUgNCkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0KLQkgIC8qIEhlYWQgdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLQkgIGN1cnJfbHN0X3N5bSsrOwotCX0KLQotICAgICAgLyogS2VlcCB0cmFjayBvZiB3aGVyZSBlYWNoIFNPTSB3aWxsIGZpbmFsbHkgcmVzaWRlOyB0aGVuIGxvb2sKLQkgYXQgdGhlIG5leHQgQkZELiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCArPSBhcmVsdF9zaXplIChjdXJyX2JmZCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotIAotICAgICAgLyogQSBwYXJ0aWN1bGFyIG9iamVjdCBpbiB0aGUgYXJjaGl2ZSBtYXkgaGF2ZSBhbiBvZGQgbGVuZ3RoOyB0aGUKLQkgbGlua2VyIHJlcXVpcmVzIG9iamVjdHMgYmVnaW4gb24gYW4gZXZlbiBib3VuZGFyeS4gIFNvIHJvdW5kCi0JIHVwIHRoZSBjdXJyZW50IG9mZnNldCBhcyBuZWNlc3NhcnkuICAqLwotICAgICAgY3Vycl9zb21fb2Zmc2V0ID0gKGN1cnJfc29tX29mZnNldCArIDB4MSkgJiB+MHgxOwotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICAgIHNvbV9pbmRleCsrOwotICAgIH0KLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaGFzaF90YWJsZSwgbHN0Lmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdC5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX2RpY3QsIGxzdC5tb2R1bGVfY291bnQsCi0JCSBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpLCBhYmZkKQotICAgICAgIT0gbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGxzdF9zeW1zLCBuc3ltcywgc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpLCBhYmZkKQotICAgICAgIT0gbnN5bXMgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQW5kIGZpbmFsbHkgdGhlIHN0cmluZ3MuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzdHJpbmdzLCBzdHJpbmdfc2l6ZSwgMSwgYWJmZCkgIT0gc3RyaW5nX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ICE9IE5VTEwpCi0gICAgZnJlZSAobGFzdF9oYXNoX2VudHJ5KTsKLSAgaWYgKGxzdF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAobHN0X3N5bXMpOwotICBpZiAoc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHN0cmluZ3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ICE9IE5VTEwpCi0gICAgZnJlZSAobGFzdF9oYXNoX2VudHJ5KTsKLSAgaWYgKGxzdF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAobHN0X3N5bXMpOwotICBpZiAoc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHN0cmluZ3MpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBMU1QgZm9yIHRoZSBhcmNoaXZlLgotCi0gICBZb3UnbGwgbmV2ZXIgYmVsaWV2ZSB0aGlzIGlzIHJlYWxseSBob3cgYXJtYXBzIGFyZSBoYW5kbGVkIGluIFNPTS4uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIGJmZCAqY3Vycl9iZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpLCBsc3Rfc2l6ZSwgbnN5bXMsIHN0cmluZ3NpemU7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3Q7Ci0gIGludCAqcDsKLSAKLSAgLyogV2UnbGwgdXNlIHRoaXMgZm9yIHRoZSBhcmNoaXZlJ3MgZGF0ZSBhbmQgbW9kZSBsYXRlci4gICovCi0gIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJnN0YXRidWYpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIEZ1ZGdlIGZhY3Rvci4gICovCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcm1hcF90aW1lc3RhbXAgPSBzdGF0YnVmLnN0X210aW1lICsgNjA7Ci0KLSAgLyogQWNjb3VudCBmb3IgdGhlIGxzdCBoZWFkZXIgZmlyc3QuICAqLwotICBsc3Rfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIHRoZSBMU1QgaGVhZGVyLiAgKi8KLSAgLyogRklYTUU6ICBEbyB3ZSBuZWVkIHRvIGV4YW1pbmUgZWFjaCBlbGVtZW50IHRvIGRldGVybWluZSB0aGUKLSAgICAgbGFyZ2VzdCBpZCBudW1iZXI/ICAqLwotICBsc3Quc3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MxXzA7Ci0gIGxzdC5hX21hZ2ljID0gTElCTUFHSUM7Ci0gIGxzdC52ZXJzaW9uX2lkID0gVkVSU0lPTl9JRDsKLSAgbHN0LmZpbGVfdGltZS5zZWNzID0gMDsKLSAgbHN0LmZpbGVfdGltZS5uYW5vc2VjcyA9IDA7Ci0KLSAgbHN0Lmhhc2hfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5oYXNoX3NpemUgPSBTT01fTFNUX0hBU0hfU0laRTsKLQotICAvKiBIYXNoIHRhYmxlIGlzIGEgU09NX0xTVF9IQVNIX1NJWkUgMzJiaXQgb2Zmc2V0cy4gICovCi0gIGxzdF9zaXplICs9IDQgKiBTT01fTFNUX0hBU0hfU0laRTsKLQotICAvKiBXZSBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgU09NcyBpbiB0aGlzIGFyY2hpdmUuICAqLwotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbHN0Lm1vZHVsZV9jb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE9ubHkgdHJ1ZSBTT00gb2JqZWN0cyBjb3VudC4gICovCi0gICAgICBpZiAoY3Vycl9iZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0Ci0JICAmJiBjdXJyX2JmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotCWxzdC5tb2R1bGVfY291bnQrKzsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgfQotICBsc3QubW9kdWxlX2xpbWl0ID0gbHN0Lm1vZHVsZV9jb3VudDsKLSAgbHN0LmRpcl9sb2MgPSBsc3Rfc2l6ZTsKLSAgbHN0X3NpemUgKz0gc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSAqIGxzdC5tb2R1bGVfY291bnQ7Ci0KLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBpbXBvcnQvZXhwb3J0IHRhYmxlcywgYXV4aWxpYXJ5IGhlYWRlcnMsCi0gICAgIG9yIGZyZWUgbGlzdHMgeWV0LiAgTWFrZSB0aGUgbGlua2VyIHdvcmsgYSBsaXR0bGUgaGFyZGVyCi0gICAgIHRvIG1ha2Ugb3VyIGxpZmUgZWFzaWVyLiAgKi8KLQotICBsc3QuZXhwb3J0X2xvYyA9IDA7Ci0gIGxzdC5leHBvcnRfY291bnQgPSAwOwotICBsc3QuaW1wb3J0X2xvYyA9IDA7Ci0gIGxzdC5hdXhfbG9jID0gMDsKLSAgbHN0LmF1eF9zaXplID0gMDsKLQotICAvKiBDb3VudCBob3cgbWFueSBzeW1ib2xzIHdlIHdpbGwgaGF2ZSBvbiB0aGUgaGFzaCBjaGFpbnMgYW5kIHRoZQotICAgICBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlIChhYmZkLCAmbnN5bXMsICZzdHJpbmdzaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbHN0X3NpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpICogbnN5bXM7Ci0KLSAgLyogRm9yIHRoZSBzdHJpbmcgdGFibGUuICBPbmUgZGF5IHdlIG1pZ2h0IGFjdHVhbGx5IHVzZSB0aGlzIGluZm8KLSAgICAgdG8gYXZvaWQgc21hbGwgc2Vla3MvcmVhZHMgd2hlbiByZWFkaW5nIGFyY2hpdmVzLiAgKi8KLSAgbHN0LnN0cmluZ19sb2MgPSBsc3Rfc2l6ZTsKLSAgbHN0LnN0cmluZ19zaXplID0gc3RyaW5nc2l6ZTsKLSAgbHN0X3NpemUgKz0gc3RyaW5nc2l6ZTsKLQotICAvKiBTT00gQUJJIHNheXMgdGhpcyBtdXN0IGJlIHplcm8uICAqLwotICBsc3QuZnJlZV9saXN0ID0gMDsKLSAgbHN0LmZpbGVfZW5kID0gbHN0X3NpemU7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0uICBNdXN0IGhhcHBlbiBhZnRlciB0aGUgZW50aXJlIGxzdCBoZWFkZXIKLSAgICAgaGFzIGZpbGxlZCBpbi4gICovCi0gIHAgPSAoaW50ICopJmxzdDsKLSAgbHN0LmNoZWNrc3VtID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpL3NpemVvZiAoaW50KSAtIDE7IGkrKykKLSAgICBsc3QuY2hlY2tzdW0gXj0gKnArKzsKLQotICBzcHJpbnRmIChoZHIuYXJfbmFtZSwgIi8gICAgICAgICAgICAgICAiKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3VpZCwgIiVsZCIsIChsb25nKSBnZXR1aWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfZ2lkLCAiJWxkIiwgKGxvbmcpIGdldGdpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9tb2RlLCAiJS04byIsICh1bnNpZ25lZCBpbnQpIHN0YXRidWYuc3RfbW9kZSk7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBsc3Rfc2l6ZSk7Ci0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFueSBudWxscyBpbnRvIHNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFNjcmliYmxlIG91dCB0aGUgYXIgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBzY3JpYmJsZSBvdXQgdGhlIGxzdCBoZWFkZXIuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmbHN0LCAxLCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBCdWlsZCBhbmQgd3JpdGUgdGhlIGFybWFwLiAgKi8KLSAgaWYgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmIChhYmZkLCBuc3ltcywgc3RyaW5nc2l6ZSwgbHN0LCBlbGVuZ3RoKQotICAgICAgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogRG9uZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGcmVlIGFsbCBpbmZvcm1hdGlvbiB3ZSBoYXZlIGNhY2hlZCBmb3IgdGhpcyBCRkQuICBXZSBjYW4gYWx3YXlzCi0gICByZWFkIGl0IGFnYWluIGxhdGVyIGlmIHdlIG5lZWQgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpvOwotCi0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2RlZmluZSBGUkVFKHgpIGlmICh4ICE9IE5VTEwpIHsgZnJlZSAoeCk7IHggPSBOVUxMOyB9Ci0gIC8qIEZyZWUgdGhlIG5hdGl2ZSBzdHJpbmcgYW5kIHN5bWJvbCB0YWJsZXMuICAqLwotICBGUkVFIChvYmpfc29tX3N5bXRhYiAoYWJmZCkpOwotICBGUkVFIChvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgLyogRnJlZSB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gLTE7Ci0gICAgICBGUkVFIChzb21fc2VjdGlvbl9kYXRhIChvKS0+cmVsb2Nfc3RyZWFtKTsKLSAgICAgIC8qIEZyZWUgdGhlIGdlbmVyaWMgcmVsb2NhdGlvbnMuICAqLwotICAgICAgRlJFRSAoby0+cmVsb2NhdGlvbik7Ci0gICAgfQotI3VuZGVmIEZSRUUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIG9mIG1pc2NlbGxhbmVvdXMgc3VwcG9ydCBmdW5jdGlvbnMuICovCi0KLS8qIExpbmtlciBzdXBwb3J0IGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNvbV9pc19zdWJzcGFjZSAoc2VjKSAmJiBzZWMtPl9yYXdfc2l6ZSA+IDI0MDAwMCk7Ci19Ci0KLSNkZWZpbmUJc29tX2Nsb3NlX2FuZF9jbGVhbnVwCQlzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBzb21fcmVhZF9hcl9oZHIJCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgc29tX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgc29tX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIHNvbV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBzb21fdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBzb21fc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgc29tX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAJYmZkX3RydWUKLSNkZWZpbmUgc29tX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBzb21fZ2V0X2xpbmVubyAgICAgICAgICAgICAgICAgIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc29tX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAlfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc29tX3JlYWRfbWluaXN5bWJvbHMJCV9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNvbV9taW5pc3ltYm9sX3RvX3N5bWJvbAlfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBzb21fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHNvbV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHNvbV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBzb21fYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgc29tX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgc29tX2JmZF9nY19zZWN0aW9ucwkJYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotCi1jb25zdCBiZmRfdGFyZ2V0IHNvbV92ZWMgPQotewotICAic29tIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEIHwgRFlOQU1JQyksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotCi0vKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgMCwKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNCwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIHNvbV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0Ci0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc29tX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc29tX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotI3VuZGVmIHNvbQotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotCi0jZW5kaWYgLyogSE9TVF9IUFBBSFBVWCB8fCBIT1NUX0hQUEFCU0QgfHwgSE9TVF9IUFBBT1NGICovCmRpZmYgLS1naXQgYS9iZmQvc29tLmggYi9iZmQvc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzc4MDQuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU09NX0gKLSNkZWZpbmUgX1NPTV9ICi0KLSNpbmNsdWRlICJsaWJocHBhLmgiCi0KLSNpbmNsdWRlIDxhLm91dC5oPgotI2luY2x1ZGUgPGxzdC5oPgotI2luY2x1ZGUgPGFyLmg+Ci0KLS8qIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBjdXJyZW50bHkgdXNlIGFueXRoaW5nIGZyb20gdGhlc2UKLSAgIHR3byBpbmNsdWRlIGZpbGVzLCBidXQgaXQncyBsaWtlbHkgdG8gbmVlZCB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotI2lmZGVmIFJfRExUX1JFTAotI2luY2x1ZGUgPHNobC5oPgotI2luY2x1ZGUgPGRsLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0vKiBCU0QgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNjaGVtZSBmb3Igb2JqZWN0IGZpbGUgaWRlbnRpZmljYXRpb24uCi0gICBzbyBmb3Igbm93LCBkZWZpbmUgX1BBX1JJU0NfSUQgdG8gYWNjZXB0IGFueSByYW5kb20gdmFsdWUgZm9yIGEgbW9kZWwKLSAgIG51bWJlci4gICovCi0jdW5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkgMQotI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLwotCi0jZGVmaW5lIEZJTEVfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpCi0jZGVmaW5lIEFVWF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9leGVjX2F1eGhkcikKLQotdHlwZWRlZiBzdHJ1Y3Qgc29tX3N5bWJvbAotICB7Ci0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgdW5zaWduZWQgaW50IHNvbV90eXBlOwotCi0gICAgLyogU3RydWN0dXJlZCBsaWtlIHRoZSBFTEYgdGNfZGF0YSB1bmlvbi4gIEFsbG93cyBtb3JlIGNvZGUgc2hhcmluZwotICAgICAgIGluIEdBUyB0aGlzIHdheS4gICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzdHJ1Y3QKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9wcml2X2xldmVsOwotCX0gYXA7Ci0JUFRSIGFueTsKLSAgICAgIH0KLSAgICB0Y19kYXRhOwotCi0gICAgLyogSW5kZXggb2YgdGhpcyBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIE9ubHkgdXNlZCB3aGVuCi0gICAgICAgYnVpbGRpbmcgcmVsb2NhdGlvbiBzdHJlYW1zIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qIEhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgQnkgc29ydGluZwotICAgICAgIHRoZSBzeW1ib2xzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQgd2UgY2FuIHNpZ25pZmljYW50bHkKLSAgICAgICByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCByZWxvY19jb3VudDsKLQotICAgIC8qIER1cmluZyBvYmplY3QgZmlsZSB3cml0aW5nLCB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sCi0gICAgICAgaW4gdGhlIFNPTSBzdHJpbmcgdGFibGUuICovCi0gICAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7Ci0gIH0KLXNvbV9zeW1ib2xfdHlwZTsKLQotLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIG1hZ2ljIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIEJGRCdzCi0gICBwcml2YXRlIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBhbiBvYmpjb3B5L3N0cmlwIHJ1bi4gICovCi1zdHJ1Y3Qgc29tX2V4ZWNfZGF0YQotICB7Ci0gICAgLyogU29ydC1vZiBhIG1hZ2ljIG51bWJlci4gIEJTRCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICAgICBuYXRpdmUgZXhlY3V0YWJsZXMgYW5kIGhwdXggZXhlY3V0YWJsZXMuICAqLwotICAgIHNob3J0IHN5c3RlbV9pZDsKLQotICAgIC8qIE1hZ2ljIGV4ZWMgZmxhZ3MuICBUaGVzZSBjb250cm9sIHRoaW5ncyBsaWtlIHdoZXRoZXIgb3Igbm90Ci0gICAgICAgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNpbmcgaXMgYWxsb3dlZCBhbmQgdGhlIGxpa2UuICAqLwotICAgIGxvbmcgZXhlY19mbGFnczsKLQotICAgIC8qIEFkZCBtb3JlIHN0dWZmIGhlcmUgYXMgbmVlZGVkLiAgR29vZCBleGFtcGxlcyBvZiBpbmZvcm1hdGlvbgotICAgICAgIHdlIG1pZ2h0IHdhbnQgdG8gcGFzcyB3b3VsZCBiZSBwcmVzdW1lZF9kcCwgZW50cnlfKiBhbmQgbWF5YmUKLSAgICAgICBvdGhlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB9OwotCi1zdHJ1Y3Qgc29tZGF0YQotICB7Ci0gICAgLyogQWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGVjdXRhYmxlIHdoaWNoIGxpdmVzCi0gICAgICAgaW4gdGhlIHByaXZhdGUgQkZEIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgY29waWVkIGZyb20KLSAgICAgICB0aGUgaW5wdXQgYmZkIHRvIHRoZSBvdXRwdXQgYmZkIGR1cmluZyBhIG9iamNvcHkvc3RyaXAuICAqLwotICAgIHN0cnVjdCBzb21fZXhlY19kYXRhICpleGVjX2RhdGE7Ci0KLSAgICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgZmlsZXMgYW5kIGFyZQotICAgICAgIGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2guICBUaGV5IG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weQotICAgICAgIG9yIHN0cmlwIHRvIHdvcmsuICAqLwotICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICAgIHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqY29weXJpZ2h0X2F1eF9oZHI7Ci0gICAgc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKnZlcnNpb25fYXV4X2hkcjsKLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hkcjsKLSAgICBDT01QVU5JVCAqY29tcF91bml0OwotCi0gICAgLyogUG9pbnRlcnMgdG8gYSBzYXZlZCBjb3B5IG9mIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMuICBUaGVzZQotICAgICAgIG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weSBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzb21fc3ltYm9sX3R5cGUgKnN5bXRhYjsKLSAgICBjaGFyICpzdHJpbmd0YWI7Ci0gICAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgICAgbm8gZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgZXhlY19oZHIuCi0gICAgICAgVGhlc2Ugb2Zmc2V0cyBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0KLSAgICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLSAgICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLSAgICBmaWxlX3B0ciByZWxvY19maWxlcG9zOwotICAgIHVuc2lnbmVkIHN0cmluZ3RhYl9zaXplOwotICB9OwotCi1zdHJ1Y3Qgc29tX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tZGF0YSBhOwotICB9OwotCi0vKiBTdWJzdHJ1Y3R1cmUgb2Ygc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uCi0gICB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBieSB0aGUgZ2VuZXJpYyBCRkQgc2VjdGlvbiBzdHJ1Y3R1cmUsCi0gICBidXQgd2hpY2ggbXVzdCBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkgb3Igc3RyaXAuICAqLwotc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICAvKiBWYXJpb3VzIGZpZWxkcyBpbiBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyB0aGF0IHdlIG5lZWQKLSAgICAgICB0byBwYXNzIGFyb3VuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHNvcnRfa2V5IDogODsKLSAgICB1bnNpZ25lZCBpbnQgYWNjZXNzX2NvbnRyb2xfYml0cyA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGlzX2RlZmluZWQgOiAxOwotICAgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVhZHJhbnQgOiAyOwotCi0gICAgLyogRm9yIHN1YnNwYWNlcywgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUKLSAgICAgICBzcGFjZSBpbiB3aGljaCB0aGUgc3Vic3BhY2UgaXMgY29udGFpbmVkLiAgRm9yIHNwYWNlcyBpdCBwb2ludHMKLSAgICAgICBiYWNrIHRvIHRoZSBzZWN0aW9uIGZvciB0aGlzIHNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotCi0gICAgLyogVGhlIHVzZXItc3BlY2lmaWVkIHNwYWNlIG51bWJlci4gIEl0IGlzIHdyb25nIHRvIHVzZSB0aGlzIGFzCi0gICAgICAgYW4gaW5kZXggc2luY2UgZHVwbGljYXRlcyBhbmQgaG9sZXMgYXJlIGFsbG93ZWQuICAqLwotICAgIGludCBzcGFjZV9udW1iZXI7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMsIAotICAgICAgIGFuZCB0aGUgbWFueSBzdWJzcGFjZSBmbGFncyB3ZSBkbyBub3QgcmVwcmVzZW50IHlldC4gICovCi0gIH07Ci0KLS8qIFVzZWQgdG8ga2VlcCBleHRyYSBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc2VjdGlvbi4KLQotICAgcmVsb2Nfc2l6ZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0sIG5vdGUgdGhpcwotICAgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGFzIFNPTSByZWxvY2F0aW9ucwotICAgYXJlIHZhcmlhYmxlIGxlbmd0aC4gCi0KLSAgIHJlbG9jX3N0cmVhbSBpcyB0aGUgYWN0dWFsIHN0cmVhbSBvZiByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqY29weV9kYXRhOwotICAgIHVuc2lnbmVkIGludCByZWxvY19zaXplOwotICAgIGNoYXIgKnJlbG9jX3N0cmVhbTsKLSAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKnNwYWNlX2RpY3Q7Ci0gICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzdWJzcGFjZV9kaWN0OwotICB9OwotCi0jZGVmaW5lIHNvbWRhdGEoYmZkKQkJCSgoYmZkKS0+dGRhdGEuc29tX2RhdGEtPmEpCi0jZGVmaW5lIG9ial9zb21fZXhlY19kYXRhKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19kYXRhKQotI2RlZmluZSBvYmpfc29tX2ZpbGVfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZmlsZV9oZHIpCi0jZGVmaW5lIG9ial9zb21fZXhlY19oZHIoYmZkKQkJKHNvbWRhdGEoYmZkKS5leGVjX2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb3B5cmlnaHRfaGRyKGJmZCkJKHNvbWRhdGEoYmZkKS5jb3B5cmlnaHRfYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV92ZXJzaW9uX2hkcihiZmQpCShzb21kYXRhKGJmZCkudmVyc2lvbl9hdXhfaGRyKQotI2RlZmluZSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQoYmZkKQkoc29tZGF0YShiZmQpLmNvbXBfdW5pdCkKLSNkZWZpbmUgb2JqX3NvbV9zeW10YWIoYmZkKQkJKHNvbWRhdGEoYmZkKS5zeW10YWIpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3RyaW5ndGFiKQotI2RlZmluZSBvYmpfc29tX3N5bV9maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUgb2JqX3NvbV9zdHJfZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiX3NpemUoYmZkKQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYl9zaXplKQotI2RlZmluZSBvYmpfc29tX3JlbG9jX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnJlbG9jX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc29ydGVkX3N5bXMoYmZkKQkoc29tZGF0YShiZmQpLnNvcnRlZF9zeW1zKQotI2RlZmluZSBzb21fc2VjdGlvbl9kYXRhKHNlYykgXAotICAoKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCAqKXNlYy0+dXNlZF9ieV9iZmQpCi0jZGVmaW5lIHNvbV9zeW1ib2xfZGF0YShzeW1ib2wpCQkoKHNvbV9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpCi0KLQotLyogRGVmaW5lcyBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2F0aW9uIGFzCi0gICBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZSAKLSAgIGJldHdlZW4gdGhlIHR3byBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX05PX1JFTE9DQVRJT04KLSNkZWZpbmUJUl9IUFBBCQkJCVJfQ09ERV9PTkVfU1lNQk9MCi0jZGVmaW5lCVJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BDUkVMX0NBTEwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9BQlNfQ0FMTAotI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9EUF9SRUxBVElWRQotI2RlZmluZSBSX0hQUEFfRU5UUlkJCQlSX0VOVFJZCi0jZGVmaW5lIFJfSFBQQV9FWElUCQkJUl9FWElUCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9DT01QMQotI2RlZmluZSBSX0hQUEFfQkVHSU5fQlJUQUIJCVJfQkVHSU5fQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0VORF9CUlRBQgkJUl9FTkRfQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX1RSWQkJUl9CRUdJTl9UUlkKLSNkZWZpbmUgUl9IUFBBX0VORF9UUlkJCQlSX0VORF9UUlkKLQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBtb3N0bHkgZm9yIHVzZSBieSBHQVMuICAqLwotYm9vbGVhbiBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBpbnQsCi0JCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOwotYm9vbGVhbiBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgIGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKLXZvaWQgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgUEFSQU1TICgoYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfYXV4X2hkciBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLWludCAqKiBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBpbnQsIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkgICBpbnQsIGFzeW1ib2wgKikpOwotYm9vbGVhbiBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmIC8qIF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbGludXguYyBiL2JmZC9zcGFyY2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTI5YjMuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIHNwYXJjIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFICAgICAgICA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgICAgICAgIDB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZSAgICAgICAgR09UX1JFRl9QUkVGSVggICJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIFBMVF9SRUZfUFJFRklYICAiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0gICAgICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLSAgICAgICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0gICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgICBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgICAgICAgICAgICAgICAgICAgIFwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKCYodGFibGUpLT5yb290LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLwotICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCi0gICAgIFdoeSBub3Q/ICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMtPl9yYXdfc2l6ZSA9IDA7Ci0gIHMtPmNvbnRlbnRzID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLSAgICAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgICAgIHsKLSAgICAgICAgIHN0cnVjdCBmaXh1cCAqZjsKLQotICAgICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0gICAgICAgICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0gICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgIH0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KLSAgaWYgKGluc2VydCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCi0gICAgICAgIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gICAgICAgICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAotICAgICAgICAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KLSAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKLSAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCi0gICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAotICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAotICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQotICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGZpeHVwICpmLCAqZjE7Ci0gIGludCBpc19wbHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7Ci0gIGJvb2xlYW4gZXhpc3RzOwotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCi0gICAgICAgICAgICAgICAgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0gICAgICAgYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLSAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgc3RyY3B5IChhbGxvYywgbmFtZSk7Ci0gICAgICAgICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7Ci0gICAgICAgICAqcCsrID0gJ1wwJzsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCi0gICAgICAgICAgICBhbGxvYywgcCk7Ci0gICAgICAgICBmcmVlIChhbGxvYyk7Ci0gICAgICAgfQotCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0Ci0gICAgIGl0LiAgKi8KLSAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCi0gICAgewotICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAotICAgICAgICBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQotICAgICAgICByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KLSAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KLSAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotICAgICAgICB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLSAgICAgICAgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0gICAgICAgIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotICAgICAgICBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLSAgICAgICAgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLSAgICAgICAgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAgIHx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKLSAgICAgICB7Ci0gICAgICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50Ci0gICAgICAgICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKLSAgICAgICAgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cwotICAgICAgICAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KLSAgICAgICAgIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotICAgICAgICAgICAgICBmMSAhPSBOVUxMOwotICAgICAgICAgICAgICBmMSA9IGYxLT5uZXh0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQotICAgICAgICAgICAgICAgICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIGlmIChmMS0+aCA9PSBoMSkKLSAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICBpZiAoISBleGlzdHMKLSAgICAgICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmMS0+aCA9IGgxOwotICAgICAgICAgICAgIGYxLT5qdW1wID0gaXNfcGx0OwotICAgICAgICAgICAgIGYxLT5idWlsdGluID0gMDsKLSAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICBpZiAoISBleGlzdHMKLSAgICAgICAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotICAgICAgICAgICAgIGlmIChmID09IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotICAgICAgICBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCi0gIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF90YWxseV9zeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUUikgaW5mbyk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKLSAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdwotICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotICAgICAgIHsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotICAgICAgICAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7Ci0gICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCi0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZpeHVwc193cml0dGVuID0gMDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLAotICAgICAgICAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotICAgICAgICAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0KLSAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7Ci0gIGZpeHVwX3RhYmxlICs9IDQ7Ci0KLSAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgewotICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICAgfQotCi0gICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChmLT5qdW1wKQotICAgICAgIHsKLSAgICAgICAgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KLSAgICAgICAgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsKLQkgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDEsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoISBmLT5idWlsdGluKQotICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLSAgICAgICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgICAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgIH0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotICAgICAgIHsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvc3BhcmNseW54LmMgYi9iZmQvc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmNhZTUuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciBTcGFyYyBiaW5hcmllcyB1bmRlciBMeW54T1MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfc3BhcmMKLQotI2VuZGlmCi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+LiAqLwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9VTktOT1dOIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMTAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV82ODAyMCBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX1NQQVJDKQotCi0vKgotVGhlIGZpbGUgQGNvZGV7YW91dGYxLmh9IGNvbnRhaW5zIHRoZSBjb2RlIGZvciBCRkQncwotYS5vdXQgYmFjayBlbmQuIENvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGJhY2sgZW5kIGlzIGdpdmVuIGJ5IHRoZXNlCi10d28gcHJlcHJvY2Vzc29yIG5hbWVzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBBUkNIX1NJWkUKLVRoaXMgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciAzMiBvciA2NCwgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgYW4KLWludCBpbiB0aGUgdGFyZ2V0IGZvcm1hdC4gSXQgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMgd2hpY2gKLXBlcmZvcm0gdGhlIG1lbW9yeS9kaXNrIG1hcHBpbmcgb2Ygc3RydWN0dXJlcy4KLQotVGhlIDY0IGJpdCBiYWNrZW5kIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIGhvc3QgY29tcGlsZXIgc3VwcG9ydHMgNjQKLWludHMgKGVnIGxvbmcgbG9uZyB3aXRoIGdjYyksIGJ5IGRlZmluaW5nIHRoZSBuYW1lIEBjb2Rle0JGRF9IT1NUXzY0X0JJVH0gaW4gQGNvZGV7YmZkLmh9LgotV2l0aCB0aGlzIG5hbWUgZGVmaW5lZCwgQGVtcGh7YWxsfSBiZmQgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHdpdGggNjRiaXQKLWFyaXRobWV0aWMsIG5vdCBqdXN0IHRob3NlIHRvIGEgNjRiaXQgdGFyZ2V0LgotCi1AaXRlbSBUQVJHRVROQU1FCi1UaGUgbmFtZSBwdXQgaW50byB0aGUgdGFyZ2V0IHZlY3Rvci4KLUBpdGVtCi1AZW5kIHRhYmxlCi0KLSovCi0KLS8qU1VQUFJFU1M1NTgqLwotLypTVVBQUkVTUzUyOSovCi0KLXZvaWQKLU5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBsb25nIG1hY2hpbmU7Ci0gIHN3aXRjaCAobWFjaHR5cGUpCi0gICAgewotCi0gICAgY2FzZSBNX1VOS05PV046Ci0gICAgICAvKiBTb21lIFN1bjNzIG1ha2UgbWFnaWMgbnVtYmVycyB3aXRob3V0IGNwdSB0eXBlcyBpbiB0aGVtLCBzbwotCSB3ZSdsbCBkZWZhdWx0IHRvIHRoZSA2ODAwMC4gKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDEwOgotICAgIGNhc2UgTV9IUDIwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDIwOgotICAgIGNhc2UgTV9IUDMwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8zODY6Ci0gICAgY2FzZSBNXzM4Nl9EWU5JWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8yOUs6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYTI5azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fSFBVWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChBQkZELCBFWEVDKSBcCi0gIE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKLSAgY2hvb3NlX3JlbG9jX3NpemUoQUJGRCk7Ci0KLS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1jaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEx5bnhPUyBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX202ODAxMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMTApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9tYWNoX202ODAyMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMjApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8yOUspOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgfQotCi0gIGNob29zZV9yZWxvY19zaXplIChhYmZkKTsKLQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfc2V0X3NpemVzIHNwYXJjbHlueF9zZXRfc2l6ZXMKLXN0YXRpYyBib29sZWFuCi1zcGFyY2x5bnhfc2V0X3NpemVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBzcGFyY2x5bnhfYW91dF9iYWNrZW5kID0KLXsKLSAgMCwgMSwgMCwgMSwgMCwgc3BhcmNseW54X3NldF9zaXplcywgMCwKLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotDAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMJTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YQkJCSZzcGFyY2x5bnhfYW91dF9iYWNrZW5kCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoKTsKLWludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoKTsKLWJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wICgpOwotCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AgbHlueF9jb3JlX2ZpbGVfcAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbmV0YnNkLmMgYi9iZmQvc3BhcmNuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3N2JiOC4uMDAwMDAwMAotLS0gYS9iZmQvc3BhcmNuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL3NwYXJjIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotLyogU1BBUkMgY2hpcHMgdXNlIGVpdGhlciA0SyBvciA4SyBwYWdlcywgYnV0IG9iamVjdCBmaWxlcyBhbHdheXMKLSAgIGFzc3VtZSA4SyBwYWdlIGFsaWdubWVudCBzbyB0aGV5IHdpbGwgd29yayBvbiBlaXRoZXIgb25lLiAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MjAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBERUZBVUxUX01JRCAJTV9TUEFSQ19ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NyZWMuYyBiL2JmZC9zcmVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjY5YjAuLjAwMDAwMDAKLS0tIGEvYmZkL3NyZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBzLXJlY29yZCBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNVQlNFQ1RJT04KLQlTLVJlY29yZCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCQotCU9yZGluYXJ5IFMtUmVjb3JkcyBjYW5ub3QgaG9sZCBhbnl0aGluZyBidXQgYWRkcmVzc2VzIGFuZAotCWRhdGEsIHNvIHRoYXQncyBhbGwgdGhhdCB3ZSBpbXBsZW1lbnQuCi0KLQlUaGUgb25seSBpbnRlcmVzdGluZyB0aGluZyBpcyB0aGF0IFMtUmVjb3JkcyBtYXkgY29tZSBvdXQgb2YKLQlvcmRlciBhbmQgdGhlcmUgaXMgbm8gaGVhZGVyLCBzbyBhbiBpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQKLQl0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhZGRyZXNzZXMgdXNlZCB0byBjcmVhdGUKLQl0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBvbmx5IHNlY3Rpb24gd2UgY3JlYXRlLiAgV2UKLQlhcmJpdHJhcmlseSBjYWxsIHRoaXMgc2VjdGlvbiAiLnRleHQiLgotCi0JV2hlbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgaXMgY2FsbGVkIHRoZSBmaWxlIGlzIHJlYWQKLQlhZ2FpbiwgYW5kIHRoaXMgdGltZSB0aGUgZGF0YSBpcyBwbGFjZWQgaW50byBhIGJmZF9hbGxvYydkCi0JYXJlYS4KLQotCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCi0JdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCi0KLQlBbiBzIHJlY29yZCBsb29rcyBsaWtlOgotCQotRVhBTVBMRQotCVM8dHlwZT48bGVuZ3RoPjxhZGRyZXNzPjxkYXRhPjxjaGVja3N1bT4KLQkKLURFU0NSSVBUSU9OCi0JV2hlcmUKLQlvIGxlbmd0aAotCWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHVwdG8gdGhlIGNoZWNrc3VtLiBOb3RlIHRoYXQKLQl0aGlzIGlzIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJzIGZvbGxvd2luZywgc2luY2UgaXQgdGFrZXMgdHdvCi0JY2hhcnMgdG8gcmVwcmVzZW50IGEgYnl0ZS4KLQlvIHR5cGUKLQlpcyBvbmUgb2Y6Ci0JMCkgaGVhZGVyIHJlY29yZAotCTEpIHR3byBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQkyKSB0aHJlZSBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQkzKSBmb3VyIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAotCTcpIGZvdXIgYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAotCTgpIHRocmVlIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk5KSB0d28gYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAotCQotCW8gYWRkcmVzcwotCWlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIGZvbGxvd2luZywgb3IgaW4gdGhlIGNhc2Ugb2YKLQlhIHRlcm1pbmF0aW9uIHJlY29yZCwgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGltYWdlCi0JbyBkYXRhCi0JaXMgdGhlIGRhdGEuCi0JbyBjaGVja3N1bQotCWlzIHRoZSBzdW0gb2YgYWxsIHRoZSByYXcgYnl0ZSBkYXRhIGluIHRoZSByZWNvcmQsIGZyb20gdGhlIGxlbmd0aAotCXVwd2FyZHMsIG1vZHVsbyAyNTYgYW5kIHN1YnRyYWN0ZWQgZnJvbSAyNTUuCi0KLQotU1VCU0VDVElPTgotCVN5bWJvbCBTLVJlY29yZCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCVNvbWUgSUNFIGVxdWlwbWVudCB1bmRlcnN0YW5kcyBhbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKLQlTLVJlY29yZCBmb3JtYXQ7IHN5bWJvbHMgYW5kIHRoZWlyIGFkZHJlc3NlcyBjYW4gYmUgc2VudAotCWJlZm9yZSB0aGUgZGF0YS4KLQotCVRoZSBmb3JtYXQgb2YgdGhpcyBpczoKLQkoJCQgPG1vZHVsZW5hbWU+Ci0JCSg8c3BhY2U+IDxzeW1ib2w+IDxhZGRyZXNzPikqKQotCSQkCi0KLQlzbyBhIHNob3J0IHN5bWJvbCB0YWJsZSBjb3VsZCBsb29rIGxpa2U6Ci0KLUVYQU1QTEUKLQkkJCBmbGFzaC54Ci0JJCQgZmxhc2guYwotCSAgX3BvcnQ2ICQwCi0JICBfZGVsYXkgJDQKLQkgIF9zdGFydCAkMTQKLQkgIF9ldGV4dCAkODAzNgotCSAgX2VkYXRhICQ4MDM2Ci0gCSAgX2VuZCAkODAzNgotCSQkCi0KLURFU0NSSVBUSU9OCi0JV2UgYWxsb3cgc3ltYm9scyB0byBiZSBhbnl3aGVyZSBpbiB0aGUgZGF0YSBzdHJlYW0gLSB0aGUgbW9kdWxlIG5hbWVzCi0JYXJlIGFsd2F5cyBpZ25vcmVkLgotCQkKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgdm9pZCBzcmVjX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX3ByaW50X3N5bWJvbAotIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX2dldF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIHNyZWNfYmFkX2J5dGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3NjYW4gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzcmVjX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3ltYm9sc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19yZWFkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICopKTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqLAotCQkJCQkgIGNvbnN0IGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbmV3X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHNyZWNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBhc3ltYm9sICpzcmVjX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNyZWNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotc3RhdGljIENPTlNUIGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi0jZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKLSNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIFRPSEVYKGQsIHgsIGNoKSBcCi0JZFsxXSA9IGRpZ3NbKHgpICYgMHhmXTsgXAotCWRbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07IFwKLQljaCArPSAoKHgpICYgMHhmZik7Ci0jZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLwotCi1zdGF0aWMgdm9pZAotc3JlY19pbml0ICgpCi17Ci0gIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOwotCi0gIGlmIChpbml0ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgaW5pdGVkID0gdHJ1ZTsKLSAgICAgIGhleF9pbml0ICgpOwotICAgIH0KLX0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uIGEgbGluZSBpcyBGRiAqLwotI2RlZmluZSBNQVhDSFVOSyAweGZmCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGZpdCBvbnRvIGEgbGluZSBvbiBvdXRwdXQgKi8KLSNkZWZpbmUgQ0hVTksgMTYKLQotLyogV2hlbiB3cml0aW5nIGFuIFMtcmVjb3JkIGZpbGUsIHRoZSBTLXJlY29yZHMgY2FuIG5vdCBiZSBvdXRwdXQgYXMKLSAgIHRoZXkgYXJlIHNlZW4uICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlbSBpbiBtZW1vcnkuICAqLwotCi1zdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0Ci17Ci0gIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3Qgc3JlY19kYXRhX2xpc3RfdHlwZTsKLQotLyogV2hlbiBzY2FubmluZyB0aGUgUy1yZWNvcmQgZmlsZSwgYSBsaW5rZWQgbGlzdCBvZiBzcmVjX3N5bWJvbAotICAgc3RydWN0dXJlcyBpcyBidWlsdCB0byByZXByZXNlbnQgdGhlIHN5bWJvbCB0YWJsZSAoaWYgdGhlcmUgaXMKLSAgIG9uZSkuICAqLwotCi1zdHJ1Y3Qgc3JlY19zeW1ib2wKLXsKLSAgc3RydWN0IHNyZWNfc3ltYm9sICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIFRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QKLSAgewotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmhlYWQ7Ci0gICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqdGFpbDsKLSAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnN5bWJvbHM7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW10YWlsOwotICAgIGFzeW1ib2wgKmNzeW1ib2xzOwotICB9Ci10ZGF0YV90eXBlOwotCi1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKiwKLQkJCQkJICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKikpOwotCi0vKiBTZXQgdXAgdGhlIFMtcmVjb3JkIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT50eXBlID0gMTsKLSAgICAgIHRkYXRhLT5oZWFkID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gTlVMTDsKLSAgICAgIHRkYXRhLT5zeW1ib2xzID0gTlVMTDsKLSAgICAgIHRkYXRhLT5zeW10YWlsID0gTlVMTDsKLSAgICAgIHRkYXRhLT5jc3ltYm9scyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGFuIFMgcmVjb3JkIGZpbGUuICBTZXQgKkVSUk9SUFRSIGlmIGFuIGVycm9yCi0gICBvY2N1cnJlZC4gIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgaW50Ci1zcmVjX2dldF9ieXRlIChhYmZkLCBlcnJvcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuICplcnJvcnB0cjsKLXsKLSAgYmZkX2J5dGUgYzsKLQotICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQkqZXJyb3JwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbnQpIChjICYgMHhmZik7Ci19Ci0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAotICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZwotICAgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcikKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICAgICBpbnQgYzsKLSAgICAgYm9vbGVhbiBlcnJvcjsKLXsKLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGlmICghIGVycm9yKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoISBpc3ByaW50IChjKSkKLQlzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBjOwotCSAgYnVmWzFdID0gJ1wwJzsKLQl9Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6JWQ6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gUy1yZWNvcmQgZmlsZVxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sIGJ1Zik7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIG5ldyBzeW1ib2wgZm91bmQgaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX25ld19zeW1ib2wgKGFiZmQsIG5hbWUsIHZhbCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHNyZWNfc3ltYm9sICpuOwotCi0gIG4gPSAoc3RydWN0IHNyZWNfc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3JlY19zeW1ib2wpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPnZhbCA9IHZhbDsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID09IE5VTEwpCi0gICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID0gbjsKLSAgZWxzZQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbC0+bmV4dCA9IG47Ci0gIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbCA9IG47Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gICsrYWJmZC0+c3ltY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgdGhlIFMgcmVjb3JkIGZpbGUgYW5kIHR1cm4gaXQgaW50byBzZWN0aW9ucy4gIFdlIGNyZWF0ZSBhIG5ldwotICAgc2VjdGlvbiBmb3IgZWFjaCBjb250aWd1b3VzIHNldCBvZiBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NjYW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm8gPSAxOwotICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gIGJmZF9ieXRlICpidWYgPSBOVUxMOwotICBzaXplX3QgYnVmc2l6ZSA9IDA7Ci0gIGFzZWN0aW9uICpzZWMgPSBOVUxMOwotICBjaGFyICpzeW1idWYgPSBOVUxMOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgLyogV2Ugb25seSBidWlsZCBzZWN0aW9ucyBmcm9tIGNvbnRpZ3VvdXMgUy1yZWNvcmRzLCBzbyBpZiB0aGlzCi0gICAgICAgICBpcyBub3QgYW4gUy1yZWNvcmQsIHRoZW4gc3RvcCBidWlsZGluZyBhIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGMgIT0gJ1MnICYmIGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpCi0Jc2VjID0gTlVMTDsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQotCWNhc2UgJ1xuJzoKLQkgICsrbGluZW5vOwotCSAgYnJlYWs7Ci0KLQljYXNlICdccic6Ci0JICBicmVhazsKLQotCWNhc2UgJyQnOgotCSAgLyogU3RhcnRpbmcgYSBtb2R1bGUgbmFtZSwgd2hpY2ggd2UgaWdub3JlLiAgKi8KLQkgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9ICdcbicKLQkJICYmIGMgIT0gRU9GKQotCSAgICA7Ci0JICBpZiAoYyA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICArK2xpbmVubzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlICcgJzoKLQkgIGRvCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWxjOwotCSAgICAgIGNoYXIgKnAsICpzeW1uYW1lOwotCSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0JICAgICAgLyogU3RhcnRpbmcgYSBzeW1ib2wgZGVmaW5pdGlvbi4gICovCi0JICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCi0JCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0JCTsKLQotCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotCQlicmVhazsKLQotCSAgICAgIGlmIChjID09IEVPRikKLQkJewotCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhbGMgPSAxMDsKLQkgICAgICBzeW1idWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChhbGMgKyAxKTsKLQkgICAgICBpZiAoc3ltYnVmID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcCA9IHN5bWJ1ZjsKLQotCSAgICAgICpwKysgPSBjOwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmICEgaXNzcGFjZSAoYykpCi0JCXsKLQkJICBpZiAoKHVuc2lnbmVkIGludCkgKHAgLSBzeW1idWYpID49IGFsYykKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbjsKLQotCQkgICAgICBhbGMgKj0gMjsKLQkJICAgICAgbiA9IChjaGFyICopIGJmZF9yZWFsbG9jIChzeW1idWYsIGFsYyArIDEpOwotCQkgICAgICBpZiAobiA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIHAgPSBuICsgKHAgLSBzeW1idWYpOwotCQkgICAgICBzeW1idWYgPSBuOwotCQkgICAgfQotCi0JCSAgKnArKyA9IGM7Ci0JCX0KLQotCSAgICAgIGlmIChjID09IEVPRikKLQkJewotCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAqcCsrID0gJ1wwJzsKLQkgICAgICBzeW1uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltYnVmKTsKLQkgICAgICBpZiAoc3ltbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBzdHJjcHkgKHN5bW5hbWUsIHN5bWJ1Zik7Ci0JICAgICAgZnJlZSAoc3ltYnVmKTsKLQkgICAgICBzeW1idWYgPSBOVUxMOwotCi0JICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCi0JCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0JCTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogU2tpcCBhIGRvbGxhciBzaWduIGJlZm9yZSB0aGUgaGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYyA9PSAnJCcpCi0JCXsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJICBpZiAoYyA9PSBFT0YpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3ltdmFsID0gMDsKLQkgICAgICB3aGlsZSAoSVNIRVggKGMpKQotCQl7Ci0JCSAgc3ltdmFsIDw8PSA0OwotCQkgIHN5bXZhbCArPSBOSUJCTEUgKGMpOwotCQkgIGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpOwotCQl9Ci0KLQkgICAgICBpZiAoISBzcmVjX25ld19zeW1ib2wgKGFiZmQsIHN5bW5hbWUsIHN5bXZhbCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICB3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKTsKLQotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytsaW5lbm87Ci0JICBlbHNlIGlmIChjICE9ICdccicpCi0JICAgIHsKLQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBicmVhazsKLSAgICAKLQljYXNlICdTJzoKLQkgIHsKLQkgICAgZmlsZV9wdHIgcG9zOwotCSAgICBjaGFyIGhkclszXTsKLQkgICAgdW5zaWduZWQgaW50IGJ5dGVzOwotCSAgICBiZmRfdm1hIGFkZHJlc3M7Ci0JICAgIGJmZF9ieXRlICpkYXRhOwotCi0JICAgIC8qIFN0YXJ0aW5nIGFuIFMtcmVjb3JkLiAgKi8KLQotCSAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSAxOwotCi0JICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgIGlmICghIElTSEVYIChoZHJbMV0pIHx8ICEgSVNIRVggKGhkclsyXSkpCi0JICAgICAgewotCQlpZiAoISBJU0hFWCAoaGRyWzFdKSkKLQkJICBjID0gaGRyWzFdOwotCQllbHNlCi0JCSAgYyA9IGhkclsyXTsKLQkJc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIH0KLQotCSAgICBieXRlcyA9IEhFWCAoaGRyICsgMSk7Ci0JICAgIGlmIChieXRlcyAqIDIgPiBidWZzaXplKQotCSAgICAgIHsKLQkJaWYgKGJ1ZiAhPSBOVUxMKQotCQkgIGZyZWUgKGJ1Zik7Ci0JCWJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChieXRlcyAqIDIpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCWJ1ZnNpemUgPSBieXRlcyAqIDI7Ci0JICAgICAgfQotCi0JICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAvKiBJZ25vcmUgdGhlIGNoZWNrc3VtIGJ5dGUuICAqLwotCSAgICAtLWJ5dGVzOwotCi0JICAgIGFkZHJlc3MgPSAwOwotCSAgICBkYXRhID0gYnVmOwotCSAgICBzd2l0Y2ggKGhkclswXSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnMCc6Ci0JICAgICAgY2FzZSAnNSc6Ci0JCS8qIFByb2xvZ3VlLS1pZ25vcmUgdGhlIGZpbGUgbmFtZSwgYnV0IHN0b3AgYnVpbGRpbmcgYQotICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gYXQgdGhpcyBwb2ludC4gICovCi0JCXNlYyA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMyc6Ci0JCWFkZHJlc3MgPSBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMic6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLS1ieXRlczsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcxJzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCWJ5dGVzIC09IDI7Ci0KLQkJaWYgKHNlYyAhPSBOVUxMCi0JCSAgICAmJiBzZWMtPnZtYSArIHNlYy0+X3Jhd19zaXplID09IGFkZHJlc3MpCi0JCSAgewotCQkgICAgLyogVGhpcyBkYXRhIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICAgIHNlYy0+X3Jhd19zaXplICs9IGJ5dGVzOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGNoYXIgc2VjYnVmWzIwXTsKLQkJICAgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICAgIHNwcmludGYgKHNlY2J1ZiwgIi5zZWMlZCIsIGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxKTsKLQkJICAgIHNlY25hbWUgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc2VjYnVmKSArIDEpOwotCQkgICAgc3RyY3B5IChzZWNuYW1lLCBzZWNidWYpOwotCQkgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSk7Ci0JCSAgICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLQkJICAgIHNlYy0+dm1hID0gYWRkcmVzczsKLQkJICAgIHNlYy0+bG1hID0gYWRkcmVzczsKLQkJICAgIHNlYy0+X3Jhd19zaXplID0gYnl0ZXM7Ci0JCSAgICBzZWMtPmZpbGVwb3MgPSBwb3M7Ci0JCSAgfQotCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNyc6Ci0JCWFkZHJlc3MgPSBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOCc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICc5JzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0KLQkJLyogVGhpcyBpcyBhIHRlcm1pbmF0aW9uIHJlY29yZC4gICovCi0JCWFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBhZGRyZXNzOwotCi0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCi0JCXJldHVybiB0cnVlOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3ltYnVmKTsKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zcmVjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJbNF07Ci0KLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJ1MnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUgd2l0aCBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3ltYm9sc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJbMl07Ci0KLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJyQnIHx8IGJbMV0gIT0gJyQnKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogUmVhZCBpbiB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGNvbnRlbnRzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGludCBjOwotICBiZmRfc2l6ZV90eXBlIHNvZmFyID0gMDsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGhkclszXTsKLSAgICAgIHVuc2lnbmVkIGludCBieXRlczsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIGJmZF9ieXRlICpkYXRhOwotCi0gICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc3JlY19zY2FuIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBzbyB3ZQotICAgICAgICAgb3VnaHQgdG8ga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJ1MnKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDMsIGFiZmQpICE9IDMpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIEJGRF9BU1NFUlQgKElTSEVYIChoZHJbMV0pICYmIElTSEVYIChoZHJbMl0pKTsKLQotICAgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCi0gICAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQl7Ci0JICBpZiAoYnVmICE9IE5VTEwpCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkgIGlmIChidWYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBidWZzaXplID0gYnl0ZXMgKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGJ5dGVzICogMiwgYWJmZCkgIT0gYnl0ZXMgKiAyKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBhZGRyZXNzID0gMDsKLSAgICAgIGRhdGEgPSBidWY7Ci0gICAgICBzd2l0Y2ggKGhkclswXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIEJGRF9BU1NFUlQgKHNvZmFyID09IHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICBpZiAoYnVmICE9IE5VTEwpCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICByZXR1cm4gdHJ1ZTsKLQotCWNhc2UgJzMnOgotCSAgYWRkcmVzcyA9IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICAtLWJ5dGVzOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICcyJzoKLQkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICAtLWJ5dGVzOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICcxJzoKLQkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYnl0ZXMgLT0gMjsKLQotCSAgaWYgKGFkZHJlc3MgIT0gc2VjdGlvbi0+dm1hICsgc29mYXIpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBjb21lIHRvIHRoZSBlbmQgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBEb24ndCBjb25zaWRlciBjaGVja3N1bS4gICovCi0JICAtLWJ5dGVzOwotCi0JICB3aGlsZSAoYnl0ZXMtLSAhPSAwKQotCSAgICB7Ci0JICAgICAgY29udGVudHNbc29mYXJdID0gSEVYIChkYXRhKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgKytzb2ZhcjsKLQkgICAgfQotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTAotCSAgJiYgc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBzcmVjX3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFdlIGFjY2VwdCBhbiB1bmtub3duIGFyY2hpdGVjdHVyZSBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpOwotfQotCi0vKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBTcmVjb3JkcyBmb3IgYSBzcGx1cmdlIGJlZm9yZSBvdXRwdXQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICplbnRyeTsKLQotICBlbnRyeSA9ICgoc3JlY19kYXRhX2xpc3RfdHlwZSAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzcmVjX2RhdGFfbGlzdF90eXBlKSkpOwotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJ5dGVzX3RvX2RvCi0gICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBieXRlc190b19kbyk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbWNweSAoKFBUUikgZGF0YSwgbG9jYXRpb24sIChzaXplX3QpIGJ5dGVzX3RvX2RvKTsKLQotICAgICAgaWYgKChzZWN0aW9uLT5sbWEgKyBvZmZzZXQgKyBieXRlc190b19kbyAtIDEpIDw9IDB4ZmZmZikKLQl7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmZmZgotCSAgICAgICAmJiB0ZGF0YS0+dHlwZSA8PSAyKQotCXsKLQkgIHRkYXRhLT50eXBlID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGRhdGEtPnR5cGUgPSAzOwotCX0KLQotICAgICAgZW50cnktPmRhdGEgPSBkYXRhOwotICAgICAgZW50cnktPndoZXJlID0gc2VjdGlvbi0+bG1hICsgb2Zmc2V0OwotICAgICAgZW50cnktPnNpemUgPSBieXRlc190b19kbzsKLQotICAgICAgLyogU29ydCB0aGUgcmVjb3JkcyBieSBhZGRyZXNzLiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZgotICAgICAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLQkgICYmIGVudHJ5LT53aGVyZSA+PSB0ZGF0YS0+dGFpbC0+d2hlcmUpCi0JewotCSAgdGRhdGEtPnRhaWwtPm5leHQgPSBlbnRyeTsKLQkgIGVudHJ5LT5uZXh0ID0gTlVMTDsKLQkgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlZ2lzdGVyIHNyZWNfZGF0YV9saXN0X3R5cGUgKipsb29rOwotCi0JICBmb3IgKGxvb2sgPSAmdGRhdGEtPmhlYWQ7Ci0JICAgICAgICpsb29rICE9IE5VTEwgJiYgKCpsb29rKS0+d2hlcmUgPCBlbnRyeS0+d2hlcmU7Ci0JICAgICAgIGxvb2sgPSAmKCpsb29rKS0+bmV4dCkKLQkgICAgOwotCSAgZW50cnktPm5leHQgPSAqbG9vazsKLQkgICpsb29rID0gZW50cnk7Ci0JICBpZiAoZW50cnktPm5leHQgPT0gTlVMTCkKLQkgICAgdGRhdGEtPnRhaWwgPSBlbnRyeTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb2YgdHlwZSwgb2YgdGhlIHN1cHBsaWVkIG51bWJlciBvZiBieXRlcy4gVGhlCi0gICBzdXBwbGllZCBieXRlcyBhbmQgbGVuZ3RoIGRvbid0IGhhdmUgYSBjaGVja3N1bS4gVGhhdCdzIHdvcmtlZCBvdXQKLSAgIGhlcmUKLSovCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIHR5cGUsIGFkZHJlc3MsIGRhdGEsIGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmVuZDsKLXsKLSAgY2hhciBidWZmZXJbTUFYQ0hVTktdOwotICB1bnNpZ25lZCBpbnQgY2hlY2tfc3VtID0gMDsKLSAgQ09OU1QgYmZkX2J5dGUgKnNyYyA9IGRhdGE7Ci0gIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLSAgY2hhciAqbGVuZ3RoOwotICBiZmRfc2l6ZV90eXBlIHdybGVuOwotCi0gICpkc3QrKyA9ICdTJzsKLSAgKmRzdCsrID0gJzAnICsgdHlwZTsKLQotICBsZW5ndGggPSBkc3Q7Ci0gIGRzdCArPSAyOwkJCS8qIGxlYXZlIHJvb20gZm9yIGRzdCovCi0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA3OgotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gMjQpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgMjoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDE2KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgOToKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAwOgotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gOCksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzKSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIGZvciAoc3JjID0gZGF0YTsgc3JjIDwgZW5kOyBzcmMrKykKLSAgICB7Ci0gICAgICBUT0hFWCAoZHN0LCAqc3JjLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGxlbmd0aCAqLwotICBUT0hFWCAobGVuZ3RoLCAoZHN0IC0gbGVuZ3RoKSAvIDIsIGNoZWNrX3N1bSk7Ci0gIGNoZWNrX3N1bSAmPSAweGZmOwotICBjaGVja19zdW0gPSAyNTUgLSBjaGVja19zdW07Ci0gIFRPSEVYIChkc3QsIGNoZWNrX3N1bSwgY2hlY2tfc3VtKTsKLSAgZHN0ICs9IDI7Ci0KLSAgKmRzdCsrID0gJ1xyJzsKLSAgKmRzdCsrID0gJ1xuJzsKLSAgd3JsZW4gPSBkc3QgLSBidWZmZXI7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyW01BWENIVU5LXTsKLSAgYmZkX2J5dGUgKmRzdCA9IGJ1ZmZlcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSSdsbCBwdXQgYW4gYXJiaXRhcnkgNDAgY2hhciBsaW1pdCBvbiBoZWFkZXIgc2l6ZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgNDAgJiYgYWJmZC0+ZmlsZW5hbWVbaV07IGkrKykKLSAgICB7Ci0gICAgICAqZHN0KysgPSBhYmZkLT5maWxlbmFtZVtpXTsKLSAgICB9Ci0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgYnVmZmVyLCBkc3QpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zZWN0aW9uIChhYmZkLCB0ZGF0YSwgbGlzdCkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLSAgICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqbGlzdDsKLXsKLSAgdW5zaWduZWQgaW50IG9jdGV0c193cml0dGVuID0gMDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gbGlzdC0+ZGF0YTsKLQotICB3aGlsZSAob2N0ZXRzX3dyaXR0ZW4gPCBsaXN0LT5zaXplKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIHVuc2lnbmVkIGludCBvY3RldHNfdGhpc19jaHVuayA9IGxpc3QtPnNpemUgLSBvY3RldHNfd3JpdHRlbjsKLQotICAgICAgaWYgKG9jdGV0c190aGlzX2NodW5rID4gQ0hVTkspCi0Jb2N0ZXRzX3RoaXNfY2h1bmsgPSBDSFVOSzsKLQotICAgICAgYWRkcmVzcyA9IGxpc3QtPndoZXJlICsgb2N0ZXRzX3dyaXR0ZW4gLyBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKTsKLQotICAgICAgaWYgKCEgc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgICAgdGRhdGEtPnR5cGUsCi0JCQkgICAgICAgYWRkcmVzcywKLQkJCSAgICAgICBsb2NhdGlvbiwKLQkJCSAgICAgICBsb2NhdGlvbiArIG9jdGV0c190aGlzX2NodW5rKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jdGV0c193cml0dGVuICs9IG9jdGV0c190aGlzX2NodW5rOwotICAgICAgbG9jYXRpb24gKz0gb2N0ZXRzX3RoaXNfY2h1bms7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMTAgLSB0ZGF0YS0+dHlwZSwKLQkJCSAgICBhYmZkLT5zdGFydF9hZGRyZXNzLCBidWZmZXIsIGJ1ZmZlcik7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgLyogRHVtcCBvdXQgdGhlIHN5bWJvbHMgb2YgYSBiZmQgKi8KLSAgaW50IGk7Ci0gIGludCBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChjb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYXN5bWJvbCAqKnRhYmxlID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkICVzXHJcbiIsIGFiZmQtPmZpbGVuYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXsKLQkgIGFzeW1ib2wgKnMgPSB0YWJsZVtpXTsKLQkgIGlmICghIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgcykKLQkgICAgICAmJiAocy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBkdW1wIG91dCBub24gZGVidWcgc3ltYm9scyAqLwotCSAgICAgIGJmZF9zaXplX3R5cGUgbDsKLQkgICAgICBjaGFyIGJ1ZjJbNDBdLCAqcDsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYyLAotCQkJICAgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bG1hCi0JCQkgICArIHMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIHAgPSBidWYyOwotCSAgICAgIHdoaWxlIChwWzBdID09ICcwJyAmJiBwWzFdICE9IDApCi0JCXArKzsKLQkgICAgICBzcHJpbnRmIChidWZmZXIsICIgICVzICQlc1xyXG4iLCBzLT5uYW1lLCBwKTsKLQkgICAgICBsID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbCwgMSwgYWJmZCkgIT0gbCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgXHJcbiIpOwotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHN5bWJvbHM7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICBzcmVjX2RhdGFfbGlzdF90eXBlICpsaXN0OwotCi0gIGlmIChzeW1ib2xzKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBzcmVjX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3YW5kZXIgdGhvdWdoIGFsbCB0aGUgc2VjdGlvbnMgcHJvdmlkZWQgYW5kIG91dHB1dCB0aGVtICovCi0gIGxpc3QgPSB0ZGF0YS0+aGVhZDsKLQotICB3aGlsZSAobGlzdCAhPSAoc3JlY19kYXRhX2xpc3RfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAwKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotc3JlY19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc3JlY19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqY3N5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGNzeW1ib2xzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9sczsKLSAgaWYgKGNzeW1ib2xzID09IE5VTEwpCi0gICAgewotICAgICAgYXN5bWJvbCAqYzsKLSAgICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqczsKLQotICAgICAgY3N5bWJvbHMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICBpZiAoY3N5bWJvbHMgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+Y3N5bWJvbHMgPSBjc3ltYm9sczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzLCBjID0gY3N5bWJvbHM7Ci0JICAgcyAhPSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0LCArK2MpCi0JewotCSAgYy0+dGhlX2JmZCA9IGFiZmQ7Ci0JICBjLT5uYW1lID0gcy0+bmFtZTsKLQkgIGMtPnZhbHVlID0gcy0+dmFsOwotCSAgYy0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgYy0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBjLT51ZGF0YS5wID0gTlVMTDsKLQl9Ci0gICAgfQotCQotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBjc3ltYm9scysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNyZWNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCSAgICAgICBzeW1ib2wtPm5hbWUpOwotCi0gICAgfQotfQotCi0jZGVmaW5lCXNyZWNfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHNyZWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHNyZWNfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0jZGVmaW5lIHNyZWNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBzcmVjX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzcmVjX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHNyZWNfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBzcmVjX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc3JlY19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIHNyZWNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzcmVjX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgc3JlY19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgc3JlY19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBzcmVjX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNyZWNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgc3JlY19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYyA9Ci17Ci0gICJzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzcmVjX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotCi0KLQotY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYyA9Ci17Ci0gICJzeW1ib2xzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzeW1ib2xzcmVjX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvc3RhYi1zeW1zLmMgYi9iZmQvc3RhYi1zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmU2YzguLjAwMDAwMDAKLS0tIGEvYmZkL3N0YWItc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGFibGUgb2Ygc3RhYiBuYW1lcyBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIJCS8qIFZhbHVlIGRvZXNuJ3QgbWF0dGVyLiAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBJZ25vcmUgZHVwbGljYXRlIHN0YWIgY29kZXM7IGp1c3QgcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBmaXJzdAotICAgb25lLiAgKi8KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIF9fZGVmaW5lX25hbWUoQ09ERSwgU1RSSU5HKQotI2RlZmluZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZShOQU1FLCBDT0RFLCBTVFJJTkcpCi0KLS8qIFRoZXNlIGFyZSBub3QgcmVhbGx5IHN0YWIgc3ltYm9scywgYnV0IGl0IGlzCi0gICBjb252ZW5pZW50IHRvIGhhdmUgdGhlbSBoZXJlIGZvciB0aGUgc2FrZSBvZiBubS4KLSAgIEZvciBjb21wbGV0ZW5lc3MsIHdlIGNvdWxkIGFsc28gYWRkIE5fVEVYVCBldGMsIGJ1dCB0aG9zZQotICAgYXJlIG5ldmVyIG5lZWRlZCwgc2luY2Ugbm0gdHJlYXRzIHRob3NlIHNwZWNpYWxseS4gKi8KLSNkZWZpbmUgRVhUUkFfU1lNQk9MUyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQSwgIlNFVEEiKS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUVCwgIlNFVFQiKS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRELCAiU0VURCIpLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEIsICJTRVRCIikvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRWLCAiU0VUViIpLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gKi8gXAotICBfX2RlZmluZV9uYW1lIChOX0lORFIsICJJTkRSIikgXAotICBfX2RlZmluZV9uYW1lIChOX1dBUk5JTkcsICJXQVJOSU5HIikKLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3N0YWJfbmFtZSAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0jZGVmaW5lIF9fZGVmaW5lX25hbWUodmFsLCBzdHIpIGNhc2UgdmFsOiByZXR1cm4gc3RyOwotI2luY2x1ZGUgImFvdXQvc3RhYi5kZWYiCi0gICAgICBFWFRSQV9TWU1CT0xTCi0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N0YWJzLmMgYi9iZmQvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhYzE2Ny4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKiBTdGFicyBpbiBzZWN0aW9ucyBsaW5raW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMsIGFzIHVzZWQKLSAgIG9uIENPRkYgYW5kIEVMRi4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgotICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKLSAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4KLQotICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoaXMgdW5pdCwgYW5kIHRoZSBkZXNjIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YKLSAgIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotLyogQSBoYXNoIHRhYmxlIHVzZWQgZm9yIGhlYWRlciBmaWxlcyB3aXRoIE5fQklOQ0wgZW50cmllcy4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIHRvdGFscyB0aGF0IHdlIGhhdmUgZm91bmQgZm9yIGEgcGFydGljdWxhciBoZWFkZXIKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqbmV4dDsKLSAgYmZkX3ZtYSB0b3RhbDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTGlzdCBvZiB0b3RhbHMgd2UgaGF2ZSBmb3VuZCBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnRvdGFsczsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0YWJfbGlua19pbmNsdWRlc19sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzLCBzb21lIG9mCi0gICB3aGljaCBtaWdodCBiZSBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0KLXN0cnVjdCBzdGFiX2V4Y2xfbGlzdAotewotICAvKiBUaGUgbmV4dCBzeW1ib2wgdG8gY29udmVydC4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqbmV4dDsKLSAgLyogVGhlIG9mZnNldCB0byB0aGlzIHN5bWJvbCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGJmZF9zaXplX3R5cGUgb2Zmc2V0OwotICAvKiBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoaXMgc3ltYm9sIChOX0JJTkNMIG9yIE5fRVhDTCkuICAqLwotICBpbnQgdHlwZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCB3aXRoIGVhY2ggLnN0YWIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbwotewotICAvKiBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzIHdoaWNoIHNob3VsZCBiZQotICAgICBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqZXhjbHM7Ci0KLSAgLyogVGhpcyBpcyB1c2VkIHRvIG1hcCBpbnB1dCBzdGFiIG9mZnNldHMgd2l0aGluIHRoZWlyIHNlY3Rpb25zCi0gICAgIHRvIG91dHB1dCBzdGFiIG9mZnNldHMsIHRvIHRha2UgaW50byBhY2NvdW50IHN0YWJzIHRoYXQgaGF2ZQotICAgICBiZWVuIGRlbGV0ZWQuICBJZiBpdCBpcyBOVUxMLCB0aGUgb3V0cHV0IG9mZnNldHMgYXJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBpbnB1dCBvZmZzZXRzLCBiZWNhdXNlIG5vIHN0YWJzIGhhdmUgYmVlbiBkZWxldGVkIGZyb20KLSAgICAgdGhpcyBzZWN0aW9uLiAgT3RoZXJ3aXNlIHRoZSBpJ3RoIGVudHJ5IGlzIHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgb2Ygc3RhYnMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBwcmlvciB0byB0aGUgaSd0aAotICAgICBzdGFiLiAqLwotICBiZmRfc2l6ZV90eXBlICpjdW11bGF0aXZlX3NraXBzOwotCi0gIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIGluZGljZXMuICBGb3IgZWFjaCBzdGFiIHN5bWJvbCwgd2UKLSAgICAgc3RvcmUgdGhlIHN0cmluZyBpbmRleCBoZXJlLiAgSWYgYSBzdGFiIHN5bWJvbCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBvdXRwdXQsIHRoZSBzdHJpbmcgaW5kZXggaXMgLTEuICAqLwotICBiZmRfc2l6ZV90eXBlIHN0cmlkeHNbMV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhYnMgaW4gc2VjdGlvbnMKLSAgIGluZm9ybWF0aW9uIHdoaWxlIGxpbmtpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9pbmZvCi17Ci0gIC8qIEEgaGFzaCB0YWJsZSB1c2VkIHRvIGhvbGQgc3RhYnMgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cmluZ3M7Ci0gIC8qIFRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZSBpbmNsdWRlczsKLSAgLyogVGhlIGZpcnN0IC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3RhYnN0cjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi0vKiBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50b3RhbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnB1dCBmaWxlIGZyb20gdGhlIGFkZF9zeW1ib2xzCi0gICBwYXNzIG9mIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwgcHNpbmZvLCBzdGFic2VjLCBzdGFic3Ryc2VjLCBwc2VjaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIGFzZWN0aW9uICpzdGFic3Ryc2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotewotICBib29sZWFuIGZpcnN0OwotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBiZmRfYnl0ZSAqc3RhYmJ1ZiA9IE5VTEw7Ci0gIGJmZF9ieXRlICpzdGFic3RyYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmLCBza2lwOwotICBiZmRfc2l6ZV90eXBlICpwc3RyaWR4OwotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgPT0gMAotICAgICAgfHwgc3RhYnN0cnNlYy0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RhYnNlYy0+X3Jhd19zaXplICUgU1RBQlNJWkUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZXNlIHN0YWIgc3ltYm9scy4KLSAgICAgICAgIERvbid0IHRyeSB0byBvcHRpbWl6ZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzdHJzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFdlIHNob3VsZG4ndCBzZWUgcmVsb2NhdGlvbnMgaW4gdGhlIHN0cmluZ3MsIGFuZCB3ZSBhcmVuJ3QKLSAgICAgICAgIHByZXBhcmVkIHRvIGhhbmRsZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uKSkKLSAgICAgIHx8IChzdGFic3Ryc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uKSkpCi0gICAgewotICAgICAgLyogQXQgbGVhc3Qgb25lIG9mIHRoZSBzZWN0aW9ucyBpcyBiZWluZyBkaXNjYXJkZWQgZnJvbSB0aGUKLSAgICAgICAgIGxpbmssIHNvIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBmaXJzdCA9IGZhbHNlOwotCi0gIGlmICgqcHNpbmZvID09IE5VTEwpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhYnMgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mLiAgKi8KLSAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICpwc2luZm8gPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN0YWJfaW5mbykpOwotICAgICAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLSAgICAgIHNpbmZvLT5zdHJpbmdzID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChzaW5mby0+c3RyaW5ncyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaXJzdCBieXRlIGlzIHplcm8uICAqLwotICAgICAgKHZvaWQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2luZm8tPnN0cmluZ3MsICIiLCB0cnVlLCB0cnVlKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJnNpbmZvLT5pbmNsdWRlcy5yb290LAotCQkJCSAgIHN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jLAotCQkJCSAgIDI1MSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzaW5mby0+c3RhYnN0ciA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnN0YWJzdHIiKTsKLSAgICAgIHNpbmZvLT5zdGFic3RyLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RFQlVHR0lORzsKLSAgICB9Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGluZm9ybWF0aW9uIHdlIGFyZSBnb2luZyB0byBzdG9yZSBmb3IgdGhpcyAuc3RhYgotICAgICBzZWN0aW9uLiAgKi8KLQotICBjb3VudCA9IHN0YWJzZWMtPl9yYXdfc2l6ZSAvIFNUQUJTSVpFOwotCi0gICpwc2VjaW5mbyA9IGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8pCi0JCQkgICsgKGNvdW50IC0gMSkgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKSk7Ci0gIGlmICgqcHNlY2luZm8gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0gIHNlY2luZm8tPmV4Y2xzID0gTlVMTDsKLSAgc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9IE5VTEw7Ci0gIG1lbXNldCAoc2VjaW5mby0+c3RyaWR4cywgMCwgY291bnQgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLQotICAvKiBSZWFkIHRoZSBzdGFicyBpbmZvcm1hdGlvbiBmcm9tIGFiZmQuICAqLwotCi0gIHN0YWJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnNlYy0+X3Jhd19zaXplKTsKLSAgc3RhYnN0cmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzdGFic3Ryc2VjLT5fcmF3X3NpemUpOwotICBpZiAoc3RhYmJ1ZiA9PSBOVUxMIHx8IHN0YWJzdHJidWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzZWMsIHN0YWJidWYsIDAsCi0JCQkJICBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnN0cnNlYywgc3RhYnN0cmJ1ZiwgMCwKLQkJCQkgICAgIHN0YWJzdHJzZWMtPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzdGFicyBzeW1ib2xzLCB3b3JrIG91dCB0aGUgbmV3IHN0cmluZyBpbmRpY2VzLAotICAgICBhbmQgaWRlbnRpZnkgTl9CSU5DTCBzeW1ib2xzIHdoaWNoIGNhbiBiZSBlbGltaW5hdGVkLiAgKi8KLQotICBzdHJvZmYgPSAwOwotICBuZXh0X3N0cm9mZiA9IDA7Ci0gIHNraXAgPSAwOwotCi0gIHN5bWVuZCA9IHN0YWJidWYgKyBzdGFic2VjLT5fcmF3X3NpemU7Ci0gIGZvciAoc3ltID0gc3RhYmJ1ZiwgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICAgc3ltIDwgc3ltZW5kOwotICAgICAgIHN5bSArPSBTVEFCU0laRSwgKytwc3RyaWR4KQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0gICAgICBpZiAoKnBzdHJpZHggIT0gMCkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYnkgYW4gTl9CSU5DTCBwYXNzLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgdHlwZSA9IHN5bVtUWVBFT0ZGXTsKLQotICAgICAgaWYgKHR5cGUgPT0gMCkKLQl7Ci0JICAvKiBTcGVjaWFsIHR5cGUgMCBzdGFicyBpbmRpY2F0ZSB0aGUgb2Zmc2V0IHRvIHRoZSBuZXh0Ci0gICAgICAgICAgICAgc3RyaW5nIHRhYmxlLiAgV2Ugb25seSBjb3B5IHRoZSB2ZXJ5IGZpcnN0IG9uZS4gICovCi0JICBzdHJvZmYgPSBuZXh0X3N0cm9mZjsKLQkgIG5leHRfc3Ryb2ZmICs9IGJmZF9nZXRfMzIgKGFiZmQsIHN5bSArIDgpOwotCSAgaWYgKCEgZmlyc3QpCi0JICAgIHsKLQkgICAgICAqcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkgICAgICArK3NraXA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSB0aGUgc3RyaW5nIGluIHRoZSBoYXNoIHRhYmxlLCBhbmQgcmVjb3JkIHRoZSBpbmRleC4gICovCi0gICAgICBzdHJpbmcgPSAoKGNoYXIgKikgc3RhYnN0cmJ1ZgotCQkrIHN0cm9mZgotCQkrIGJmZF9nZXRfMzIgKGFiZmQsIHN5bSArIFNUUkRYT0ZGKSk7Ci0gICAgICAqcHN0cmlkeCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoc2luZm8tPnN0cmluZ3MsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIEFuIE5fQklOQ0wgc3ltYm9sIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIHN0YWJzIGVudHJpZXMKLQkgZm9yIGEgaGVhZGVyIGZpbGUuICBXZSBuZWVkIHRvIHNjYW4gYWhlYWQgdG8gdGhlIG5leHQgTl9FSU5DTAotCSBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCi0JIHN5bWJvbCBuYW1lcywgbm90IGluY2x1ZGluZyB0aGUgZmlsZSBudW1iZXJzIGluIHR5cGVzICh0aGUKLQkgZmlyc3QgbnVtYmVyIGFmdGVyIGFuIG9wZW4gcGFyZW50aGVzaXMpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IE5fQklOQ0wpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0JICBpbnQgbmVzdDsKLQkgIGJmZF9ieXRlICppbmNsX3N5bTsKLQkgIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7Ci0JICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdDsKLQkgIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqbmU7Ci0KLQkgIHZhbCA9IDA7Ci0JICBuZXN0ID0gMDsKLQkgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRTsKLQkgICAgICAgaW5jbF9zeW0gPCBzeW1lbmQ7Ci0JICAgICAgIGluY2xfc3ltICs9IFNUQUJTSVpFKQotCSAgICB7Ci0JICAgICAgaW50IGluY2xfdHlwZTsKLQotCSAgICAgIGluY2xfdHlwZSA9IGluY2xfc3ltW1RZUEVPRkZdOwotCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCXsKLQkJICBpZiAobmVzdCA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgLS1uZXN0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCSsrbmVzdDsKLQkgICAgICBlbHNlIGlmIChuZXN0ID09IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpzdHI7Ci0KLQkJICBzdHIgPSAoKGNoYXIgKikgc3RhYnN0cmJ1ZgotCQkJICsgc3Ryb2ZmCi0JCQkgKyBiZmRfZ2V0XzMyIChhYmZkLCBpbmNsX3N5bSArIFNUUkRYT0ZGKSk7Ci0JCSAgZm9yICg7ICpzdHIgIT0gJ1wwJzsgc3RyKyspCi0JCSAgICB7Ci0JCSAgICAgIHZhbCArPSAqc3RyOwotCQkgICAgICBpZiAoKnN0ciA9PSAnKCcpCi0JCQl7Ci0JCQkgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLQkJCSAgKytzdHI7Ci0JCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnN0cikpCi0JCQkgICAgKytzdHI7Ci0JCQkgIC0tc3RyOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUgc2FtZQotCSAgICAgdmFsdWUsIHRoZW4gcmVwbGFjZWQgdGhpcyBvbmUgd2l0aCBhbiBOX0VYQ0wgc3ltYm9sLiAgKi8KLQkgIGluY2xfZW50cnkgPSBzdGFiX2xpbmtfaW5jbHVkZXNfbG9va3VwICgmc2luZm8tPmluY2x1ZGVzLCBzdHJpbmcsCi0JCQkJCQkgIHRydWUsIHRydWUpOwotCSAgaWYgKGluY2xfZW50cnkgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAodCA9IGluY2xfZW50cnktPnRvdGFsczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgaWYgKHQtPnRvdGFsID09IHZhbCkKLQkgICAgICBicmVhazsKLQotCSAgLyogUmVjb3JkIHRoaXMgc3ltYm9sLCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkgIG5lID0gKHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAqbmUpOwotCSAgaWYgKG5lID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbmUtPm9mZnNldCA9IHN5bSAtIHN0YWJidWY7Ci0JICBuZS0+dmFsID0gdmFsOwotCSAgbmUtPnR5cGUgPSBOX0JJTkNMOwotCSAgbmUtPm5leHQgPSBzZWNpbmZvLT5leGNsczsKLQkgIHNlY2luZm8tPmV4Y2xzID0gbmU7Ci0KLQkgIGlmICh0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlCi0JCSB3aXRoIHRoaXMgc2V0IG9mIHN0YWJzIHN0cmluZ3MuICAqLwotCSAgICAgIHQgPSAoKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICopCi0JCSAgIGJmZF9oYXNoX2FsbG9jYXRlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QsIHNpemVvZiAqdCkpOwotCSAgICAgIGlmICh0ID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHQtPnRvdGFsID0gdmFsOwotCSAgICAgIHQtPm5leHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7Ci0JICAgICAgaW5jbF9lbnRyeS0+dG90YWxzID0gdDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSAqaW5jbF9wc3RyaWR4OwotCi0JICAgICAgLyogV2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyIGZpbGUgYmVmb3JlLiAgVGVsbCB0aGUgZmluYWwKLQkJIHBhc3MgdG8gY2hhbmdlIHRoZSB0eXBlIHRvIE5fRVhDTC4gICovCi0JICAgICAgbmUtPnR5cGUgPSBOX0VYQ0w7Ci0KLQkgICAgICAvKiBNYXJrIHRoZSBza2lwcGVkIHN5bWJvbHMuICAqLwotCi0JICAgICAgbmVzdCA9IDA7Ci0JICAgICAgZm9yIChpbmNsX3N5bSA9IHN5bSArIFNUQUJTSVpFLCBpbmNsX3BzdHJpZHggPSBwc3RyaWR4ICsgMTsKLQkJICAgaW5jbF9zeW0gPCBzeW1lbmQ7Ci0JCSAgIGluY2xfc3ltICs9IFNUQUJTSVpFLCArK2luY2xfcHN0cmlkeCkKLQkJewotCQkgIGludCBpbmNsX3R5cGU7Ci0KLQkJICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKLQotCQkgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG5lc3QgPT0gMCkKLQkJCXsKLQkJCSAgKmluY2xfcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkJCSAgKytza2lwOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgLS1uZXN0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkgICAgKytuZXN0OwotCQkgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgKmluY2xfcHN0cmlkeCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQkJICAgICAgKytza2lwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZyZWUgKHN0YWJidWYpOwotICBzdGFiYnVmID0gTlVMTDsKLSAgZnJlZSAoc3RhYnN0cmJ1Zik7Ci0gIHN0YWJzdHJidWYgPSBOVUxMOwotCi0gIC8qIFdlIG5lZWQgdG8gc2V0IHRoZSBzZWN0aW9uIHNpemVzIHN1Y2ggdGhhdCB0aGUgbGlua2VyIHdpbGwKLSAgICAgY29tcHV0ZSB0aGUgb3V0cHV0IHNlY3Rpb24gc2l6ZXMgY29ycmVjdGx5LiAgV2Ugc2V0IHRoZSAuc3RhYgotICAgICBzaXplIHRvIG5vdCBpbmNsdWRlIHRoZSBlbnRyaWVzIHdlIGRvbid0IHdhbnQuICBXZSBzZXQKLSAgICAgU0VDX0VYQ0xVREUgZm9yIHRoZSAuc3RhYnN0ciBzZWN0aW9uLCBzbyB0aGF0IGl0IHdpbGwgYmUgZHJvcHBlZAotICAgICBmcm9tIHRoZSBsaW5rLiAgV2UgcmVjb3JkIHRoZSBzaXplIG9mIHRoZSBzdHJ0YWIgaW4gdGhlIGZpcnN0Ci0gICAgIC5zdGFic3RyIHNlY3Rpb24gd2Ugc2F3LCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IHNldCBTRUNfRVhDTFVERQotICAgICBmb3IgdGhhdCBzZWN0aW9uLiAgKi8KLSAgc3RhYnNlYy0+X2Nvb2tlZF9zaXplID0gKGNvdW50IC0gc2tpcCkgKiBTVEFCU0laRTsKLSAgaWYgKHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHN0YWJzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICBzdGFic3Ryc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgc2luZm8tPnN0YWJzdHItPl9jb29rZWRfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGBjdW11bGF0aXZlX3NraXBzJyBhcnJheSBub3cgdGhhdCBzdGFicyBoYXZlIGJlZW4KLSAgICAgZGVsZXRlZCBmb3IgdGhpcyBzZWN0aW9uLiAqLwotCi0gIGlmIChza2lwICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBpLCBvZmZzZXQ7Ci0gICAgICBiZmRfc2l6ZV90eXBlICpwc2tpcHM7Ci0KLSAgICAgIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPQotCShiZmRfc2l6ZV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLSAgICAgIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHBza2lwcyA9IHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHM7Ci0gICAgICBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgIG9mZnNldCA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwc2tpcHMrKywgcHN0cmlkeCsrKQotCXsKLQkgICpwc2tpcHMgPSBvZmZzZXQ7Ci0JICBpZiAoKnBzdHJpZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBvZmZzZXQgKz0gU1RBQlNJWkU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChvZmZzZXQgIT0gMCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3RhYmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN0YWJidWYpOwotICBpZiAoc3RhYnN0cmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN0YWJzdHJidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgc3RhYiBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgcmVsb2NhdGVkCi0gICBjb250ZW50cy4gICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyAob3V0cHV0X2JmZCwgcHNpbmZvLCBzdGFic2VjLCBwc2VjaW5mbywgY29udGVudHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqZTsKLSAgYmZkX2J5dGUgKnN5bSwgKnRvc3ltLCAqc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlICpwc3RyaWR4OwotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotCi0gIGlmIChzZWNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKLQkJCQkgICAgIHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0KLSAgLyogSGFuZGxlIGVhY2ggTl9CSU5DTCBlbnRyeS4gICovCi0gIGZvciAoZSA9IHNlY2luZm8tPmV4Y2xzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpleGNsX3N5bTsKLQotICAgICAgQkZEX0FTU0VSVCAoZS0+b2Zmc2V0IDwgc3RhYnNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGV4Y2xfc3ltID0gY29udGVudHMgKyBlLT5vZmZzZXQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBlLT52YWwsIGV4Y2xfc3ltICsgVkFMT0ZGKTsKLSAgICAgIGV4Y2xfc3ltW1RZUEVPRkZdID0gZS0+dHlwZTsKLSAgICB9Ci0KLSAgLyogQ29weSBvdmVyIGFsbCB0aGUgc3RhYnMgc3ltYm9scywgb21pdHRpbmcgdGhlIG9uZXMgd2UgZG9uJ3Qgd2FudCwKLSAgICAgYW5kIGNvcnJlY3RpbmcgdGhlIHN0cmluZyBpbmRpY2VzIGZvciB0aG9zZSB3ZSBkbyB3YW50LiAgKi8KLSAgdG9zeW0gPSBjb250ZW50czsKLSAgc3ltZW5kID0gY29udGVudHMgKyBzdGFic2VjLT5fcmF3X3NpemU7Ci0gIGZvciAoc3ltID0gY29udGVudHMsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgIHN5bSA8IHN5bWVuZDsKLSAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKLSAgICB7Ci0gICAgICBpZiAoKnBzdHJpZHggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXsKLQkgIGlmICh0b3N5bSAhPSBzeW0pCi0JICAgIG1lbWNweSAodG9zeW0sIHN5bSwgU1RBQlNJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKnBzdHJpZHgsIHRvc3ltICsgU1RSRFhPRkYpOwotCi0JICBpZiAoc3ltW1RZUEVPRkZdID09IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBoZWFkZXIgc3ltYm9sIGZvciB0aGUgc3RhYnMgc2VjdGlvbi4gIFdlCi0gICAgICAgICAgICAgICAgIGRvbid0IHJlYWxseSBuZWVkIG9uZSwgc2luY2Ugd2UgaGF2ZSBtZXJnZWQgYWxsIHRoZQotICAgICAgICAgICAgICAgICBpbnB1dCBzdGFicyBzZWN0aW9ucyBpbnRvIG9uZSwgYnV0IHdlIGdlbmVyYXRlIG9uZQotICAgICAgICAgICAgICAgICBmb3IgdGhlIGJlbmVmaXQgb2YgcmVhZGVycyB3aGljaCBleHBlY3QgdG8gc2VlIG9uZS4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc3ltID09IGNvbnRlbnRzKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyksCi0JCQkgIHRvc3ltICsgVkFMT0ZGKTsKLQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLAotCQkJICBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplIC8gU1RBQlNJWkUgLSAxLAotCQkJICB0b3N5bSArIERFU0NPRkYpOwotCSAgICB9Ci0KLQkgIHRvc3ltICs9IFNUQUJTSVpFOwotCX0KLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9zaXplX3R5cGUpICh0b3N5bSAtIGNvbnRlbnRzKSA9PSBzdGFic2VjLT5fY29va2VkX3NpemUpOwotCi0gIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgIGNvbnRlbnRzLCBzdGFic2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChvdXRwdXRfYmZkLCBwc2luZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLQotICBpZiAoc2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoZSBzZWN0aW9uIHdhcyBkaXNjYXJkZWQgZnJvbSB0aGUgbGluay4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpKQotCSAgICAgIDw9IHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKLQkJICsgc2luZm8tPnN0YWJzdHItPm91dHB1dF9vZmZzZXQpLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAob3V0cHV0X2JmZCwgc2luZm8tPnN0cmluZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24uICAqLwotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzaW5mby0+c3RyaW5ncyk7Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZzaW5mby0+aW5jbHVkZXMucm9vdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhbiBhZGRyZXNzIGluIHRoZSAuc3RhYiBzZWN0aW9uLiAgR2l2ZW4gT0ZGU0VUIHdpdGhpbgotICAgU1RBQlNFQywgdGhpcyByZXR1cm5zIHRoZSBuZXcgb2Zmc2V0IGluIHRoZSBhZGp1c3RlZCBzdGFiIHNlY3Rpb24sCi0gICBvciAtMSBpZiB0aGUgYWRkcmVzcyByZWZlcnMgdG8gYSBzdGFiIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQuICAqLwotCi1iZmRfdm1hCi1fYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIG9mZnNldCkKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAqcHNpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBvZmZzZXQ7Ci0KLSAgaWYgKG9mZnNldCA+PSBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIG9mZnNldCAtIChzdGFic2VjLT5fY29va2VkX3NpemUgLSBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzKQotICAgIHsKLSAgICAgIGJmZF92bWEgaTsKLQotICAgICAgaSA9IG9mZnNldCAvIFNUQUJTSVpFOwotCi0gICAgICBpZiAoc2VjaW5mby0+c3RyaWR4cyBbaV0gPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHJldHVybiBvZmZzZXQgLSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzIFtpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zdGFtcC1oLmluIGIvYmZkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvYmZkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JmZC9zdW5vcy5jIGIvYmZkL3N1bm9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTY4NTcuLjAwMDAwMDAKLS0tIGEvYmZkL3N1bm9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ4ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zdW5vcy1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3Vub3NfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFN0YXRpYyByb3V0aW5lcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3Vub3NfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKLQkgICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fc3RkX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZXh0X3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JICAgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3Qgc3Vub3NfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCBzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0KLS8qID8/PyBXaGVyZSBzaG91bGQgdGhpcyBnbz8gICovCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCi0gICgoKG10eXBlKSA9PSBNX1NQQVJDICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIDApICE9IE5VTEwpIFwKLSAgIHx8ICgobXR5cGUpID09IE1fU1BBUkNMRVQgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KSAhPSBOVUxMKSBcCi0gICB8fCAoKG10eXBlKSA9PSBNX1NQQVJDTElURV9MRSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpICE9IE5VTEwpIFwKLSAgIHx8ICgoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfbTY4aywgMCkgIT0gTlVMTCkpCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2luY2x1ZGUgImFvdXRmMS5oIgotCi0vKiBUaGUgU3VuT1MgNC4xLjQgL3Vzci9pbmNsdWRlL2xvY2FsZS5oIGRlZmluZXMgdmFsaWQgYXMgYSBtYWNyby4gICovCi0jdW5kZWYgdmFsaWQKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZQotICAgaW4gb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKS4gICovCi0KLXN0cnVjdCBzdW5vc19keW5hbWljX2luZm8KLXsKLSAgLyogV2hldGhlciB3ZSBmb3VuZCBhbnkgZHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gdmFsaWQ7Ci0gIC8qIER5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZHluaW5mbzsKLSAgLyogTnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZHluc3ltX2NvdW50OwotICAvKiBSZWFkIGluIG5saXN0cyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpkeW5zeW07Ci0gIC8qIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqY2Fub25pY2FsX2R5bnN5bTsKLSAgLyogUmVhZCBpbiBkeW5hbWljIHN0cmluZyB0YWJsZS4gICovCi0gIGNoYXIgKmR5bnN0cjsKLSAgLyogTnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5yZWxfY291bnQ7Ci0gIC8qIFJlYWQgaW4gZHluYW1pYyByZWxvY3MuICBUaGlzIG1heSBiZSByZWxvY19zdGRfZXh0ZXJuYWwgb3IKLSAgICAgcmVsb2NfZXh0X2V4dGVybmFsLiAgKi8KLSAgUFRSIGR5bnJlbDsKLSAgLyogYXJlbGVudCBzdHJ1Y3R1cmVzIGZvciBkeW5hbWljIHJlbG9jcy4gICovCi0gIGFyZWxlbnQgKmNhbm9uaWNhbF9keW5yZWw7Ci19OwotCi0vKiBUaGUgaGFzaCB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMgaXMgY29tcG9zZWQgb2YgdHdvIHdvcmQgZW50cmllcy4KLSAgIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oIGZvciBkZXRhaWxzLiAgKi8KLQotI2RlZmluZSBIQVNIX0VOVFJZX1NJWkUgKDIgKiBCWVRFU19JTl9XT1JEKQotCi0vKiBSZWFkIGluIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBsb2NhdGVzIHRoZSBfX0RZTkFNSUMKLSAgIHN0cnVjdHVyZSBhbmQgdXNlcyBpdCB0byBmaW5kIHRoZSBkeW5hbWljX2xpbmsgc3RydWN0dXJlLiAgSXQKLSAgIGNyZWF0ZXMgYW5kIHNhdmVzIGEgc3Vub3NfZHluYW1pY19pbmZvIHN0cnVjdHVyZS4gIElmIGl0IGNhbid0IGZpbmQKLSAgIF9fRFlOQU1JQywgaXQgc2V0cyB0aGUgdmFsaWQgZmllbGQgb2YgdGhlIHN1bm9zX2R5bmFtaWNfaW5mbwotICAgc3RydWN0dXJlIHRvIGZhbHNlIHRvIGF2b2lkIGRvaW5nIHRoaXMgd29yayBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotICBhc2VjdGlvbiAqZHluc2VjOwotICBiZmRfdm1hIGR5bm9mZjsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBkeW5pbmZvOwotICB1bnNpZ25lZCBsb25nIGR5bnZlcjsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rIGxpbmtpbmZvOwotCi0gIGlmIChvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpICE9IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mbyA9ICgoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKQotCSAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKSkpOwotICBpZiAoIWluZm8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT52YWxpZCA9IGZhbHNlOwotICBpbmZvLT5keW5zeW0gPSBOVUxMOwotICBpbmZvLT5keW5zdHIgPSBOVUxMOwotICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gTlVMTDsKLSAgaW5mby0+ZHlucmVsID0gTlVMTDsKLSAgaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9IE5VTEw7Ci0gIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPSAoUFRSKSBpbmZvOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIGxvb2sgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sIHRvIGxvY2F0ZSB0aGUgZHluYW1pYwotICAgICBsaW5raW5nIGluZm9ybWF0aW9uLgotICAgICBIb3dldmVyIHRoaXMgaW5oaWJpdHMgcmVjb3ZlcmluZyB0aGUgZHluYW1pYyBzeW1ib2xzIGZyb20gYQotICAgICBzdHJpcHBlZCBvYmplY3QgZmlsZSwgc28gYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgZHluYW1pYyBsaW5raW5nCi0gICAgIGluZm9ybWF0aW9uIGlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24uCi0gICAgIFdlIGNvdWxkIHZlcmlmeSB0aGlzIGFzc3VtcHRpb24gbGF0ZXIgYnkgbG9va2luZyB0aHJvdWdoIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHMgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpLCAoUFRSKSAmZHluaW5mbywKLQkJCQkgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGR5bmluZm8pKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bnZlciA9IEdFVF9XT1JEIChhYmZkLCBkeW5pbmZvLmxkX3ZlcnNpb24pOwotICBpZiAoZHludmVyICE9IDIgJiYgZHludmVyICE9IDMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2ZmID0gR0VUX1dPUkQgKGFiZmQsIGR5bmluZm8ubGQpOwotCi0gIC8qIGR5bm9mZiBpcyBhIHZpcnR1YWwgYWRkcmVzcy4gIEl0IGlzIHByb2JhYmx5IGFsd2F5cyBpbiB0aGUgLmRhdGEKLSAgICAgc2VjdGlvbiwgYnV0IHRoaXMgY29kZSBzaG91bGQgd29yayBldmVuIGlmIGl0IG1vdmVzLiAgKi8KLSAgaWYgKGR5bm9mZiA8IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0gICAgZHluc2VjID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICBlbHNlCi0gICAgZHluc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotICBkeW5vZmYgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgZHluc2VjKTsKLSAgaWYgKGR5bm9mZiA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGR5bnNlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBleGVjdXRhYmxlIGFwcGVhcnMgdG8gYmUgZHluYW1pY2FsbHkgbGlua2VkIGluIGEgd2F5IHRoYXQgd2UKLSAgICAgY2FuIHVuZGVyc3RhbmQuICAqLwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGR5bnNlYywgKFBUUikgJmxpbmtpbmZvLCBkeW5vZmYsCi0JCQkJICAoYmZkX3NpemVfdHlwZSkgc2l6ZW9mIGxpbmtpbmZvKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTd2FwIGluIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBpbmZvLT5keW5pbmZvLmxkX2xvYWRlZCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9sb2FkZWQpOwotICBpbmZvLT5keW5pbmZvLmxkX25lZWQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfbmVlZCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcnVsZXMpOwotICBpbmZvLT5keW5pbmZvLmxkX2dvdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9nb3QpOwotICBpbmZvLT5keW5pbmZvLmxkX3BsdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9wbHQpOwotICBpbmZvLT5keW5pbmZvLmxkX3JlbCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9yZWwpOwotICBpbmZvLT5keW5pbmZvLmxkX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfaGFzaCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3RhYiA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zdGFiKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zdGFiX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3RhYl9oYXNoKTsKLSAgaW5mby0+ZHluaW5mby5sZF9idWNrZXRzID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2J1Y2tldHMpOwotICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3ltYm9scyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N5bWJfc2l6ZSk7Ci0gIGluZm8tPmR5bmluZm8ubGRfdGV4dCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF90ZXh0KTsKLSAgaW5mby0+ZHluaW5mby5sZF9wbHRfc3ogPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcGx0X3N6KTsKLQotICAvKiBSZXBvcnRlZGx5IHRoZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBvZmZzZXQgYnkgdGhlIHNpemUgb2YgdGhlCi0gICAgIGV4ZWMgaGVhZGVyIGluIGFuIE5NQUdJQyBmaWxlLiAgKi8KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSBuX21hZ2ljKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXhlY19ieXRlc19zaXplID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLQotICAgICAgaW5mby0+ZHluaW5mby5sZF9uZWVkICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9yZWwgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9oYXNoICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfc3RhYiArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgKz0gZXhlY19ieXRlc19zaXplOwotICAgIH0KLQotICAvKiBUaGUgb25seSB3YXkgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24gYXBwZWFycyB0bwotICAgICBiZSB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gaXQgYW5kIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpbmZvLT5keW5zeW1fY291bnQgPSAoKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyAtIGluZm8tPmR5bmluZm8ubGRfc3RhYikKLQkJCS8gRVhURVJOQUxfTkxJU1RfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGluZm8tPmR5bnN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUKLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scwotCQkJCSAgLSBpbmZvLT5keW5pbmZvLmxkX3N0YWIpKTsKLQotICAvKiBTaW1pbGFybHksIHRoZSByZWxvY3MgZW5kIGF0IHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgaW5mby0+ZHlucmVsX2NvdW50ID0gKChpbmZvLT5keW5pbmZvLmxkX2hhc2ggLSBpbmZvLT5keW5pbmZvLmxkX3JlbCkKLQkJCS8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgQkZEX0FTU0VSVCAoaW5mby0+ZHlucmVsX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpCi0JICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5keW5pbmZvLmxkX2hhc2gKLQkJCQkgIC0gaW5mby0+ZHluaW5mby5sZF9yZWwpKTsKLQotICBpbmZvLT52YWxpZCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLQotICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoaW5mby0+ZHluc3ltX2NvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJlYWQgdGhlIGV4dGVybmFsIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyBubGlzdCBzdHJ1Y3R1cmVzLiAgKi8KLSAgaWYgKGluZm8tPmR5bnN5bSA9PSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotICAgICAgaW5mby0+ZHluc3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAoaW5mby0+ZHluc3ltX2NvdW50Ci0JCQkJICAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKSk7Ci0gICAgICBpZiAoaW5mby0+ZHluc3ltID09IE5VTEwgJiYgaW5mby0+ZHluc3ltX2NvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N0YWIsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAotCQkJRVhURVJOQUxfTkxJU1RfU0laRSwgYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5zeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKSkKLQl7Ci0JICBpZiAoaW5mby0+ZHluc3ltICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHluc3ltKTsKLQkgICAgICBpbmZvLT5keW5zeW0gPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGR5bmFtaWMgc3RyaW5ncy4gICovCi0gIGlmIChpbmZvLT5keW5zdHIgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5zdHIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplKTsKLSAgICAgIGlmIChpbmZvLT5keW5zdHIgPT0gTlVMTCAmJiBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5zdHIsIDEsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplLAotCQkJYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSkpCi0JewotCSAgaWYgKGluZm8tPmR5bnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnN0cik7Ci0JICAgICAgaW5mby0+ZHluc3RyID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN0b3JhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN0b3JhZ2U7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICBpZiAoISBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotCi0jaWZkZWYgQ0hFQ0tfRFlOQU1JQ19IQVNICi0gIC8qIENoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZSBieSBtYWtpbmcgc3VyZQotICAgICB0aGF0IGVhY2ggc3ltYm9sIGNhbiBiZSBsb2NhdGVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgewotICAgIGJmZF9zaXplX3R5cGUgdGFibGVfc2l6ZTsKLSAgICBiZmRfYnl0ZSAqdGFibGU7Ci0gICAgYmZkX3NpemVfdHlwZSBpOwotCi0gICAgaWYgKGluZm8tPmR5bmluZm8ubGRfYnVja2V0cyA+IGluZm8tPmR5bnN5bV9jb3VudCkKLSAgICAgIGFib3J0ICgpOwotICAgIHRhYmxlX3NpemUgPSBpbmZvLT5keW5pbmZvLmxkX3N0YWIgLSBpbmZvLT5keW5pbmZvLmxkX2hhc2g7Ci0gICAgdGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAodGFibGVfc2l6ZSk7Ci0gICAgaWYgKHRhYmxlID09IE5VTEwgJiYgdGFibGVfc2l6ZSAhPSAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX2hhc2gsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKChQVFIpIHRhYmxlLCAxLCB0YWJsZV9zaXplLCBhYmZkKSAhPSB0YWJsZV9zaXplKQotICAgICAgYWJvcnQgKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQotICAgICAgewotCXVuc2lnbmVkIGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBoYXNoOwotCi0JbmFtZSA9ICgodW5zaWduZWQgY2hhciAqKSBpbmZvLT5keW5zdHIKLQkJKyBHRVRfV09SRCAoYWJmZCwgaW5mby0+ZHluc3ltW2ldLmVfc3RyeCkpOwotCWhhc2ggPSAwOwotCXdoaWxlICgqbmFtZSAhPSAnXDAnKQotCSAgaGFzaCA9IChoYXNoIDw8IDEpICsgKm5hbWUrKzsKLQloYXNoICY9IDB4N2ZmZmZmZmY7Ci0JaGFzaCAlPSBpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHM7Ci0Jd2hpbGUgKEdFVF9XT1JEIChhYmZkLCB0YWJsZSArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpICE9IGkpCi0JICB7Ci0JICAgIGhhc2ggPSBHRVRfV09SRCAoYWJmZCwKLQkJCSAgICAgdGFibGUgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7Ci0JICAgIGlmIChoYXNoID09IDAgfHwgaGFzaCA+PSB0YWJsZV9zaXplIC8gSEFTSF9FTlRSWV9TSVpFKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotICAgIGZyZWUgKHRhYmxlKTsKLSAgfQotI2VuZGlmIC8qIENIRUNLX0RZTkFNSUNfSEFTSCAqLwotCi0gIC8qIEdldCB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgbmxpc3QKLSAgICAgc3RydWN0dXJlcy4gICovCi0gIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltID09IChhb3V0X3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGluZm8tPmR5bnN5bV9jb3VudAotCQkJCQkgICAgKiBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKSkpOwotICAgICAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPT0gTlVMTCAmJiBpbmZvLT5keW5zeW1fY291bnQgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfdHJhbnNsYXRlX3N5bWJvbF90YWJsZSAoYWJmZCwgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSwKLQkJCQkJICAgIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAotCQkJCQkgICAgaW5mby0+ZHluc3RyLAotCQkJCQkgICAgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUsCi0JCQkJCSAgICB0cnVlKSkKLQl7Ci0JICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmNhbm9uaWNhbF9keW5zeW0pOwotCSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAvKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGR5bmFtaWMgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQotICAgICpzdG9yYWdlKysgPSAoYXN5bWJvbCAqKSAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSArIGkpOwotICAqc3RvcmFnZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGluZm8tPmR5bnN5bV9jb3VudDsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLQotICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoaW5mby0+ZHlucmVsX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gKFBUUikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgaWYgKCEgaW5mby0+dmFsaWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGR5bmFtaWMgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICBpZiAoaW5mby0+ZHlucmVsID09IE5VTEwpCi0gICAgewotICAgICAgaW5mby0+ZHlucmVsID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgIChpbmZvLT5keW5yZWxfY291bnQKLQkJCQkgICAgICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKTsKLSAgICAgIGlmIChpbmZvLT5keW5yZWwgPT0gTlVMTCAmJiBpbmZvLT5keW5yZWxfY291bnQgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfcmVsLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5yZWwsIGluZm8tPmR5bnJlbF9jb3VudCwKLQkJCW9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSwgYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5yZWxfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKQotCXsKLQkgIGlmIChpbmZvLT5keW5yZWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5yZWwpOwotCSAgICAgIGluZm8tPmR5bnJlbCA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgYXJlbGVudCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgcmVsb2MKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnRvOwotCi0gICAgICBpbmZvLT5jYW5vbmljYWxfZHlucmVsID0gKChhcmVsZW50ICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaW5mby0+ZHlucmVsX2NvdW50Ci0JCQkJCSAgICAqIHNpemVvZiAoYXJlbGVudCkpKSk7Ci0gICAgICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSBOVUxMICYmIGluZm8tPmR5bnJlbF9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIAotICAgICAgdG8gPSBpbmZvLT5jYW5vbmljYWxfZHlucmVsOwotCi0gICAgICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnA7Ci0JICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpwZW5kOwotCi0JICBwID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgaW5mby0+ZHlucmVsOwotCSAgcGVuZCA9IHAgKyBpbmZvLT5keW5yZWxfY291bnQ7Ci0JICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgdG8rKykKLQkgICAgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcCwgdG8sIHN5bXMsCi0JCQkJCSAgaW5mby0+ZHluc3ltX2NvdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcDsKLQkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnBlbmQ7Ci0KLQkgIHAgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBpbmZvLT5keW5yZWw7Ci0JICBwZW5kID0gcCArIGluZm8tPmR5bnJlbF9jb3VudDsKLQkgIGZvciAoOyBwIDwgcGVuZDsgcCsrLCB0bysrKQotCSAgICBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBwLCB0bywgc3ltcywKLQkJCQkJICBpbmZvLT5keW5zeW1fY291bnQpOwotCX0KLSAgICB9Ci0KLSAgLyogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSBkeW5hbWljIGFyZWxlbnQgc3RydWN0dXJlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5keW5yZWxfY291bnQ7IGkrKykKLSAgICAqc3RvcmFnZSsrID0gaW5mby0+Y2Fub25pY2FsX2R5bnJlbCArIGk7Ci0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gaW5mby0+ZHlucmVsX2NvdW50OwotfQotDAotLyogQ29kZSB0byBoYW5kbGUgbGlua2luZyBvZiBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQotLyogQSBTUEFSQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBpcyAxMiBieXRlcy4gIFRoZSBmaXJzdCBlbnRyeQotICAgaW4gdGhlIHRhYmxlIGlzIGEganVtcCB3aGljaCBpcyBmaWxsZWQgaW4gYnkgdGhlIHJ1bnRpbWUgbGlua2VyLgotICAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdCBlbnRyeSwKLSAgIGZvbGxvd2VkIGJ5IGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24gdGFibGUgZW5jb2RlZCB0byBsb29rIGxpa2UKLSAgIGEgc2V0aGkgb2YgJWcwLiAgKi8KLQotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfU0laRSAoMTIpCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBzcGFyY19wbHRfZmlyc3RfZW50cnlbU1BBUkNfUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgLyogc2V0aGkgJWhpKDApLCVnMTsgYWRkcmVzcyBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLwotICAweDMsIDAsIDAsIDAsCi0gIC8qIGptcCAlZzE7IG9mZnNldCBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLwotICAweDgxLCAweGMwLCAweDYwLCAwLAotICAvKiBub3AgKi8KLSAgMHgxLCAwLCAwLCAwCi19OwotCi0vKiBzYXZlICVzcCwgLTk2LCAlc3AgKi8KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQwIDB4OWRlM2JmYTAKLS8qIGNhbGw7IGFkZHJlc3MgZmlsbGVkIGluIGxhdGVyLiAgKi8KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQxIDB4NDAwMDAwMDAKLS8qIHNldGhpOyByZWxvYyBpbmRleCBmaWxsZWQgaW4gbGF0ZXIuICAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDIgMHgwMTAwMDAwMAotCi0vKiBUaGlzIHNlcXVlbmNlIGlzIHVzZWQgd2hlbiBmb3IgdGhlIGp1bXAgdGFibGUgZW50cnkgdG8gYSBkZWZpbmVkCi0gICBzeW1ib2wgaW4gYSBjb21wbGV0ZSBleGVjdXRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIGxpbmtpbmcgUElDCi0gICBjb21waWxlZCBjb2RlIHdoaWNoIGlzIG5vdCBiZWluZyBwdXQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLS8qIHNldGhpIDxhZGRyZXNzIHRvIGJlIGZpbGxlZCBpbiBsYXRlcj4sICVnMSAqLwotI2RlZmluZSBTUEFSQ19QTFRfUElDX1dPUkQwIDB4MDMwMDAwMDAKLS8qIGptcCAlZzEgKyA8YWRkcmVzcyB0byBiZSBmaWxsZWQgaW4gbGF0ZXI+ICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDEgMHg4MWMwNjAwMAotLyogbm9wICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDIgMHgwMTAwMDAwMAotCi0vKiBBbiBtNjhrIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGlzIDggYnl0ZXMuICBUaGUgZmlyc3QgZW50cnkKLSAgIGluIHRoZSB0YWJsZSBpcyBhIGp1bXAgd2hpY2ggaXMgZmlsbGVkIGluIHRoZSBieSB0aGUgcnVudGltZQotICAgbGlua2VyLiAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdAotICAgZW50cnksIGZvbGxvd2VkIGJ5IGEgdHdvIGJ5dGUgaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gICovCi0KLSNkZWZpbmUgTTY4S19QTFRfRU5UUllfU0laRSAoOCkKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIG02OGtfcGx0X2ZpcnN0X2VudHJ5W002OEtfUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgLyogam1wcyBAIyAqLwotICAweDRlLCAweGY5LAotICAvKiBGaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIgd2l0aCBhIG1hZ2ljIGFkZHJlc3MuICAqLwotICAwLCAwLCAwLCAwLAotICAvKiBOb3QgdXNlZD8gICovCi0gIDAsIDAKLX07Ci0KLS8qIGJzcmwgKi8KLSNkZWZpbmUgTTY4S19QTFRfRU5UUllfV09SRDAgKDB4NjFmZikKLS8qIFJlbWFpbmluZyB3b3JkcyBmaWxsZWQgaW4gbGF0ZXIuICAqLwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIHN5bWJvbCwgdGhpcyBpcyBpdHMgaW5kZXggaW50byB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIC0xLiAgQXMgdGhlIGxpbmtlciBsb29rcyBhdAotICAgICB0aGUgaW5wdXQgZmlsZXMsIGl0IGNoYW5nZXMgdGhpcyB0byAtMiBpZiBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4sCi0gICAgIHRoZSBsaW5rZXIgd2lsbCBrbm93IHdoZXRoZXIgdG8gYnVpbGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZTsgaWYKLSAgICAgaXQgZG9lcyBidWlsZCBvbmUsIHRoaXMgYmVjb21lcyB0aGUgaW5kZXggaW50byB0aGUgdGFibGUuICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgbmFtZSBpbiB0aGUKLSAgICAgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHVzZWQgZm9yIHRoaXMgc3ltYm9sLiAgSWYKLSAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgR09UIGVudHJ5LCB0aGlzIGlzIDAuICAqLwotICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0KLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB1c2VkIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgUExUIGVudHJ5LCB0aGlzIGlzIDAuICAqLwotICBiZmRfdm1hIHBsdF9vZmZzZXQ7Ci0KLSAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfUkVGX1JFR1VMQVIgMDEKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19SRUZfRFlOQU1JQyAwNAotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfREVGX0RZTkFNSUMgMDEwCi0gIC8qIFN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfQ09OU1RSVUNUT1IgMDIwCi19OwotCi0vKiBUaGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBvYmplY3Qgd2hpY2ggaG9sZHMgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19uZWVkZWQ7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSAuZ290IHRhYmxlLiAgKi8KLSAgYm9vbGVhbiBnb3RfbmVlZGVkOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgc2l6ZV90IGR5bnN5bWNvdW50OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHNpemVfdCBidWNrZXRjb3VudDsKLQotICAvKiBUaGUgbGlzdCBvZiBkeW5hbWljIG9iamVjdHMgbmVlZGVkIGJ5IGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbgotICAgICB0aGUgbGluay4gICovCi0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOwotCi0gIC8qIFRoZSBvZmZzZXQgb2YgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpbnRvIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBiZmRfdm1hIGdvdF9iYXNlOwotfTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdW5vc19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmR5bmluZHggPSAtMTsKLSAgICAgIHJldC0+ZHluc3RyX2luZGV4ID0gLTE7Ci0gICAgICByZXQtPmdvdF9vZmZzZXQgPSAwOwotICAgICAgcmV0LT5wbHRfb2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1zdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBzdW5vc19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSBmYWxzZTsKLSAgcmV0LT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCA9IGZhbHNlOwotICByZXQtPmdvdF9uZWVkZWQgPSBmYWxzZTsKLSAgcmV0LT5keW5zeW1jb3VudCA9IDA7Ci0gIHJldC0+YnVja2V0Y291bnQgPSAwOwotICByZXQtPm5lZWRlZCA9IE5VTEw7Ci0gIHJldC0+Z290X2Jhc2UgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdW5vc19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgU3VuT1MgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIHN1bm9zX2hhc2hfdGFibGUocCkgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIENyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhCi0gICBkeW5hbWljIG9iamVjdCwgb3IgaWYgd2UgYXJlIGxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUuICBBQkZEIGlzIGEKLSAgIGJmZCB3ZSBjYW4gYXR0YWNoIHRoZSBkeW5hbWljIHNlY3Rpb25zIHRvLiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbAotICAgbG9vayBmb3IgdGhlc2Ugc3BlY2lhbCBzZWN0aW9ucyBuYW1lcyBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICBwbGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBTZWUgaW5jbHVkZS9hb3V0L3N1bjQuaCBmb3IgbW9yZSBkZXRhaWxzCi0gICBvZiB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGhvbGRzIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uOiB0aGUKLQkgc3VuNF9keW5hbWljIHN0cnVjdHVyZSwgdGhlIGR5bmFtaWMgZGVidWdnZXIgaW5mb3JtYXRpb24sIGFuZAotCSB0aGUgc3VuNF9keW5hbWljX2xpbmsgc3RydWN0dXJlLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmdvdCBzZWN0aW9uIGhvbGRzIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9nb3QgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5wbHQgc2VjdGlvbiBob2xkcyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGUKLQkgYWRkcmVzcyBpcyBwdXQgaW4gdGhlIGxkX3BsdCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19DT0RFKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZHlucmVsIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgcmVsb2NzLiAgVGhlIGFkZHJlc3MgaXMKLQkgcHV0IGluIHRoZSBsZF9yZWwgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHlucmVsIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5oYXNoIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZS4gIFRoZSBhZGRyZXNzCi0JIGlzIHB1dCBpbiB0aGUgbGRfaGFzaCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5zeW0gc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9zdGFiIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZHluc3RyIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZS4KLQkgVGhlIGFkZHJlc3MgaXMgcHV0IGluIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN0ciIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoKG5lZWRlZCAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKLSAgICAgIHx8IGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBiZmQgKmR5bm9iajsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBkeW5hbWljIHN5bWJvbHMgZHVyaW5nIGEgbGluay4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhLm91dAotICAgYmFja2VuZCBsaW5rZXIgZm9yIGVhY2ggb2JqZWN0IGl0IGVuY291bnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbywgc3ltc3AsIHN5bV9jb3VudHAsIHN0cmluZ3NwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKipzeW1zcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3ltX2NvdW50cDsKLSAgICAgY2hhciAqKnN0cmluZ3NwOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmRpbmZvOwotICB1bnNpZ25lZCBsb25nIG5lZWQ7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSByZXF1aXJlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sCi0JCQkJCSAgICgoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCQkJCQkgICAgICYmICEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQkJCQkgICAgPyB0cnVlCi0JCQkJCSAgICA6IGZhbHNlKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gZm9yIGEgbm9ybWFsIG9iamVjdC4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogV2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUgc2VjdGlvbnMgaW4gYSBkeW5hbWljIG9iamVjdCBpbiB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBXZSBoYWNrIGJ5IHNpbXBseSBjbG9iYmVyaW5nIHRoZSBsaXN0IG9mIHNlY3Rpb25zCi0gICAgIGluIHRoZSBCRkQuICBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgbW9yZSBjbGVhbmx5IGJ5LCBzYXksIGEgbmV3Ci0gICAgIHNlY3Rpb24gZmxhZzsgdGhlIGV4aXN0aW5nIFNFQ19ORVZFUl9MT0FEIGZsYWcgaXMgbm90IHRoZSBvbmUgd2UKLSAgICAgd2FudCwgYmVjYXVzZSB0aGF0IG9uZSBzdGlsbCBpbXBsaWVzIHRoYXQgdGhlIHNlY3Rpb24gdGFrZXMgdXAKLSAgICAgc3BhY2UgaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3Qgb2JqZWN0IHdlIGhhdmUKLSAgICAgc2Vlbiwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotICBpZiAoYWJmZCAhPSBkeW5vYmopCi0gICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMDsKLQkgICBzID0gcy0+bmV4dCkKLQk7Ci0gICAgICBhYmZkLT5zZWN0aW9ucyA9IHM7Ci0gICAgfQotCi0gIC8qIFRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGp1c3QgaWdub3JlIGR5bmFtaWMgb2JqZWN0cyB3aGVuIC1yIGlzCi0gICAgIHVzZWQuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkKLSAgICAgbWF0Y2ggdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgLm5lZWQgYW5kIGEgLnJ1bGVzIHNlY3Rpb25zLiAgVGhlc2UgYXJlIG9ubHkKLSAgICAgbmVlZGVkIGlmIHRoZXJlIHJlYWxseSBpcyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLCBzbyB0aGV5Ci0gICAgIGFyZSBub3QgYWRkZWQgYnkgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgLm5lZWQgc2VjdGlvbiBob2xkcyB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZXRzCi0JIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQgYXQgcnVudGltZS4gIFRoZSBhZGRyZXNzIG9mIHRoaXMKLQkgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX25lZWQgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5uZWVkIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLAotCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgLnJ1bGVzIHNlY3Rpb24gaG9sZHMgdGhlIHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQKLQkgb2JqZWN0cy4gIFRoZSBhZGRyZXNzIG9mIHRoaXMgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX3J1bGVzCi0JIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucnVsZXMiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUGljayB1cCB0aGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZXR1cm4gdGhlbSB0byB0aGUgY2FsbGVyLiAgKi8KLSAgaWYgKCEgc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gICpzeW1zcCA9IGRpbmZvLT5keW5zeW07Ci0gICpzeW1fY291bnRwID0gZGluZm8tPmR5bnN5bV9jb3VudDsKLSAgKnN0cmluZ3NwID0gZGluZm8tPmR5bnN0cjsKLQotICAvKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW55IG90aGVyIG9iamVjdHMgbmVlZGVkIGJ5IHRoaXMgb25lLiAgKi8KLSAgbmVlZCA9IGRpbmZvLT5keW5pbmZvLmxkX25lZWQ7Ci0gIHdoaWxlIChuZWVkICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmWzE2XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgZmxhZ3M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBtYWpvcl92bm8sIG1pbm9yX3ZubzsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqKnBwOwotICAgICAgY2hhciAqbmFtZWJ1ZiwgKnA7Ci0gICAgICBzaXplX3QgYWxjOwotICAgICAgYmZkX2J5dGUgYjsKLSAgICAgIGNoYXIgKm5hbWVjb3B5OwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5lZWQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYnVmLCAxLCAxNiwgYWJmZCkgIT0gMTYpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGb3IgdGhlIGZvcm1hdCBvZiBhbiBsZF9uZWVkIGVudHJ5LCBzZWUgYW91dC9zdW40LmguICBXZQotICAgICAgICAgc2hvdWxkIHByb2JhYmx5IGRlZmluZSBzdHJ1Y3RzIGZvciB0aGlzIG1hbmlwdWxhdGlvbi4gICovCi0KLSAgICAgIG5hbWUgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYpOwotICAgICAgZmxhZ3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYgKyA0KTsKLSAgICAgIG1ham9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyA4KTsKLSAgICAgIG1pbm9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyAxMCk7Ci0gICAgICBuZWVkID0gYmZkX2dldF8zMiAoYWJmZCwgYnVmICsgMTIpOwotCi0gICAgICBuZWVkZWQgPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KSkpOwotICAgICAgaWYgKG5lZWRlZCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5lZWRlZC0+YnkgPSBhYmZkOwotCi0gICAgICAvKiBXZSByZXR1cm4gdGhlIG5hbWUgYXMgWy1sXW5hbWVbLm1hal1bLm1pbl0uICAqLwotICAgICAgYWxjID0gMzA7Ci0gICAgICBuYW1lYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0gICAgICBpZiAobmFtZWJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHAgPSBuYW1lYnVmOwotCi0gICAgICBpZiAoKGZsYWdzICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICAqcCsrID0gJy0nOwotCSAgKnArKyA9ICdsJzsKLQl9Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5hbWUsIFNFRUtfU0VUKSAhPSAwKQotCXsKLQkgIGZyZWUgKG5hbWVidWYpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgZG8KLQl7Ci0JICBpZiAoYmZkX3JlYWQgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCSAgICB7Ci0JICAgICAgZnJlZSAobmFtZWJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICgoc2l6ZV90KSAocCAtIG5hbWVidWYpID49IGFsYykKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBhbGMgKj0gMjsKLQkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChuYW1lYnVmKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7Ci0JICAgICAgbmFtZWJ1ZiA9IG47Ci0JICAgIH0KLQotCSAgKnArKyA9IGI7Ci0JfQotICAgICAgd2hpbGUgKGIgIT0gJ1wwJyk7Ci0KLSAgICAgIGlmIChtYWpvcl92bm8gPT0gMCkKLQkqcCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBtYWpidWZbMzBdOwotCSAgY2hhciBtaW5idWZbMzBdOwotCi0JICBzcHJpbnRmIChtYWpidWYsICIuJWQiLCBtYWpvcl92bm8pOwotCSAgaWYgKG1pbm9yX3ZubyA9PSAwKQotCSAgICBtaW5idWZbMF0gPSAnXDAnOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChtaW5idWYsICIuJWQiLCBtaW5vcl92bm8pOwotCi0JICBpZiAoKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKSA+PSBhbGMpCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgYWxjID0gKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKTsKLQkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChuYW1lYnVmKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7Ci0JICAgICAgbmFtZWJ1ZiA9IG47Ci0JICAgIH0KLQotCSAgc3RyY3B5IChwLCBtYWpidWYpOwotCSAgc3RyY2F0IChwLCBtaW5idWYpOwotCX0KLQotICAgICAgbmFtZWNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgICAgIGlmIChuYW1lY29weSA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKG5hbWVidWYpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHN0cmNweSAobmFtZWNvcHksIG5hbWVidWYpOwotICAgICAgZnJlZSAobmFtZWJ1Zik7Ci0gICAgICBuZWVkZWQtPm5hbWUgPSBuYW1lY29weTsKLQotICAgICAgbmVlZGVkLT5uZXh0ID0gTlVMTDsKLQotICAgICAgZm9yIChwcCA9ICZzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotCSAgICpwcCAhPSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgICpwcCA9IG5lZWRlZDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGludCBuZXdfZmxhZzsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9JTkRJUkVDVCB8IEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SKSkgIT0gMAotICAgICAgfHwgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgY29weSwKLQkJCQlmYWxzZSk7Ci0gIGVsc2UKLSAgICBoID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChoYXNocCAhPSBOVUxMKQotICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIC8qIFRyZWF0IGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlIC5ic3MKLSAgICAgc2VjdGlvbiBvZiB0aGUgZHluYW1pYyBvYmplY3QuICBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHNwYWNlCi0gICAgIGZvciBpdCBpbiBvdXIgcHJvY2VzcyBpbWFnZS4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX25ldwotICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZGVmaW5pbmcgdGhlIHN5bWJvbCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4gIFRoaXMKLQkgaXMgYSBwb3RlbnRpYWwgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQl7Ci0JICAvKiBUaGUgZGVmaW5pdGlvbiB3ZSBhcmUgYWRkaW5nIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4KLQkgICAgIFdlIGRvIG5vdCB3YW50IHRoaXMgbmV3IGRlZmluaXRpb24gdG8gb3ZlcnJpZGUgdGhlCi0JICAgICBleGlzdGluZyBkZWZpbml0aW9uLCBzbyB3ZSBwcmV0ZW5kIGl0IGlzIGp1c3QgYQotCSAgICAgcmVmZXJlbmNlLiAgKi8KLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogVGhlIGV4aXN0aW5nIGRlZmluaXRpb24gaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgV2UKLQkgICAgIHdhbnQgdG8gb3ZlcnJpZGUgaXQgd2l0aCB0aGUgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLgotCSAgICAgQ2xvYmJlciB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbi4gICovCi0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIFdlCi0JICAgICB3YW50IHRvIG92ZXJyaWRlIGl0IHdpdGggdGhlIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4KLQkgICAgIENsb2JiZXIgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uICBXZSBjYW4ndCBzZXQgaXQgdG8gbmV3LAotCSAgICAgYmVjYXVzZSBpdCBpcyBvbiB0aGUgdW5kZWZpbmVkIGxpc3QuICAqLwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOwotCX0KLSAgICB9Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcgotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoaXMgc3ltYm9sCi0gICAgICAgICBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBBIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBhY3R1YWxseSBhCi0gICAgICAgICBkZWZpbml0aW9uLCBhbHRob3VnaCB0aGUgdHlwZSB3aWxsIGJlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAgICBhdCB0aGlzIHBvaW50LiAgV2Ugd2FudCB0byBpZ25vcmUgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUKLSAgICAgICAgIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0JICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhpcwotICAgICAgICAgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBBcyBhYm92ZSwgd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlCi0gICAgICAgICBvZiB0aGUgY29uc3RydWN0b3Igc3ltYm9sIGZyb20gdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICAvKiBTZXQgYSBmbGFnIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLQkgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4gIEtlZXAgYSBjb3VudCBvZiB0aGUKLQkgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbCBpcyBvbmUKLQkgd2hpY2ggaXMgcmVmZXJlbmNlZCBvciBkZWZpbmVkIGJ5IGJvdGggYSByZWd1bGFyIG9iamVjdCBhbmQgYQotCSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX1JFRl9SRUdVTEFSOwotCSAgZWxzZQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX0RFRl9SRUdVTEFSOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19SRUZfRFlOQU1JQzsKLQkgIGVsc2UKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19ERUZfRFlOQU1JQzsKLQl9Ci0gICAgICBoLT5mbGFncyB8PSBuZXdfZmxhZzsKLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmIChoLT5mbGFncyAmIChTVU5PU19ERUZfUkVHVUxBUiB8IFNVTk9TX1JFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JaC0+ZmxhZ3MgfD0gU1VOT1NfQ09OU1RSVUNUT1I7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgQkZELiAgKi8KLQotLypBUkdTVVNFRCovCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci19Ci0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IG1hZGUgdG8gYSBzeW1ib2wgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBleGFtaW5lZCBhbGwgdGhlIGlucHV0IG9iamVjdHMuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LCBpdCBtZXJlbHkgbWVhbnMgdGhhdCBubyBvYmplY3QgcmVmZXJzCi0gICAgIHRvIGl0LCBhbmQgd2UgY2FuIGp1c3QgaWdub3JlIGl0IGF0IHRoaXMgcG9pbnQuICAqLwotICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgX19EWU5BTUlDIHN5bWJvbCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkIHx8IHN0cmNtcCAobmFtZSwgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zIGNyZWF0ZWQgaW4KLSAgIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgU3VuT1MgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplcyBvZiB0aGUKLSAgIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgdmFyaW91cwotICAgc2VjdGlvbnMuICBUaGlzIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgcmVhZGluZyBhbGwgdGhlIHJlbG9jcyBzbwotICAgdGhhdCB3ZSBjYW4gd29yayBvdXQgd2hpY2ggb25lcyBuZWVkIHRvIGJlY29tZSBkeW5hbWljIHJlbG9jcy4gIElmCi0gICBpbmZvLT5rZWVwX21lbW9yeSBpcyB0cnVlLCB3ZSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5OyBvdGhlcndpc2UsCi0gICB3ZSBkaXNjYXJkIHRoZW0sIGFuZCB3aWxsIHJlYWQgdGhlbSBhZ2FpbiBsYXRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIHNkeW5wdHIsIHNuZWVkcHRyLAotCQkJCSBzcnVsZXNwdHIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2R5bnB0cjsKLSAgICAgYXNlY3Rpb24gKipzbmVlZHB0cjsKLSAgICAgYXNlY3Rpb24gKipzcnVsZXNwdHI7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgYnVja2V0Y291bnQ7Ci0gIHNpemVfdCBoYXNoYWxsb2M7Ci0gIHNpemVfdCBpOwotICBiZmQgKnN1YjsKLQotICAqc2R5bnB0ciA9IE5VTEw7Ci0gICpzbmVlZHB0ciA9IE5VTEw7Ci0gICpzcnVsZXNwdHIgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEJ3MgYW5kIHJlYWQgdGhlaXIgcmVsb2NzLiAgSXQgd291bGQKLSAgICAgYmUgYmV0dGVyIGlmIHdlIGRpZG4ndCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkKLSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZHluYW1pYyByZWxvY3Mgd2UgbmVlZCwgYW5kLCBtb3JlCi0gICAgIGltcG9ydGFudGx5LCB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8ga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZAotICAgICBnZXQgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgaWYgKChzdWItPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgJiYgc3ViLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpCi0JewotCSAgaWYgKCEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX3RleHRzZWMgKHN1YiksCi0JCQkJICAgZXhlY19oZHIgKHN1YiktPmFfdHJzaXplKQotCSAgICAgIHx8ICEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX2RhdGFzZWMgKHN1YiksCi0JCQkJICAgICAgZXhlY19oZHIgKHN1YiktPmFfZHJzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZHluc3ltY291bnQgPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBkeW5hbWljIG9iamVjdHMgaW4gdGhlIGxpbmssIGFuZCB3ZSBkb24ndCBuZWVkCi0gICAgIHRvIGJ1aWxkIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkCi0gICAgICAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gd2FzIG1lbnRpb25lZCwgZGVmaW5lIGl0LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggIT0gTlVMTCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5mbGFncyB8PSBTVU5PU19ERUZfUkVHVUxBUjsKLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIHNldAotICAgICAgICAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byBiZSAweDEwMDAgYnl0ZXMgaW50byB0aGUgc2VjdGlvbiwKLSAgICAgICAgIHNvIHRoYXQgMTMgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHgxMDAwKQotCWgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSAgICAgIGVsc2UKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAwOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X2Jhc2UgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBhbnkgc2hhcmVkIG9iamVjdHMgaW4gdGhlIGxpbmssIHRoZW4gd2UgbmVlZCB0byBzZXQKLSAgICAgdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgewotICAgICAgKnNkeW5wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaXMgYWx3YXlzIHRoZSBzYW1lIHNpemUuICAqLwotICAgICAgcyA9ICpzZHlucHRyOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMpCi0JCSAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUKLQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluaykpOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBhcyB3ZSByZWFkIHRoZSBpbnB1dCBmaWxlcy4gIFdlCi0JIHdpbGwgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlICguZHluc3ltKSBhbmQgdGhlIGhhc2gKLQkgdGFibGUgKC5oYXNoKSB3aGVuIHdlIGJ1aWxkIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UKLQkgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZQotCSBzeW1ib2xzLiAgV2UgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZSAoLmR5bnN0cikKLQkgaW4gYSB0cmF2ZXJzYWwgb2YgdGhlIHN5bWJvbCB0YWJsZSB1c2luZwotCSBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMganVzdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZGl2aWRlZAotCSBieSBmb3VyLiAgVG8gY29tcHV0ZSB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSwgd2UKLQkgbXVzdCBhY3R1YWxseSBjb21wdXRlIHRoZSBoYXNoIHRhYmxlLiAgTm9ybWFsbHkgd2UgbmVlZAotCSBleGFjdGx5IGFzIG1hbnkgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcyB0aGVyZSBhcmUKLQkgZHluYW1pYyBzeW1ib2xzLCBidXQgaWYgc29tZSBvZiB0aGUgYnVja2V0cyBhcmUgbm90IHVzZWQgd2UKLQkgd2lsbCBuZWVkIGFkZGl0aW9uYWwgZW50cmllcy4gIEluIHRoZSB3b3JzdCBjYXNlLCBldmVyeQotCSBzeW1ib2wgd2lsbCBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgYW5kIHdlIHdpbGwgbmVlZAotCSBCVUNLRVRDT1VOVCAtIDEgZXh0cmEgZW50cmllcy4gICovCi0gICAgICBpZiAoZHluc3ltY291bnQgPj0gNCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50IC8gNDsKLSAgICAgIGVsc2UgaWYgKGR5bnN5bWNvdW50ID4gMCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50OwotICAgICAgZWxzZQotCWJ1Y2tldGNvdW50ID0gMTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBoYXNoYWxsb2MgPSAoZHluc3ltY291bnQgKyBidWNrZXRjb3VudCAtIDEpICogSEFTSF9FTlRSWV9TSVpFOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIGhhc2hhbGxvYyk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBkeW5zeW1jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgaGFzaGFsbG9jKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBidWNrZXRjb3VudDsgaSsrKQotCVBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgLTEsIHMtPmNvbnRlbnRzICsgaSAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBidWNrZXRjb3VudCAqIEhBU0hfRU5UUllfU0laRTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIC8qIFNjYW4gYWxsIHRoZSBzeW1ib2xzLCBwbGFjZSB0aGVtIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwKLQkgYW5kIGJ1aWxkIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICBXZSByZXVzZSBkeW5zeW1jb3VudCBhcyBhCi0JIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB3ZSBoYXZlIGFkZGVkIHNvIGZhci4gICovCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSAwOwotICAgICAgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQlzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLAotCQkJCShQVFIpIGluZm8pOwotICAgICAgQkZEX0FTU0VSVCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID09IGR5bnN5bWNvdW50KTsKLQotICAgICAgLyogVGhlIFN1bk9TIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8gYWxpZ24gdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0JIHN5bWJvbCBzdHJpbmdzIHRvIGEgbXVsdGlwbGUgb2YgOC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0JIGltcG9ydGFudCwgYnV0IGl0IGNhbid0IGh1cnQgbXVjaC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAmIDcpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLQkgIGFkZCA9IDggLSAocy0+X3Jhd19zaXplICYgNyk7Ci0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsCi0JCQkJCSAgICAgICAoc2l6ZV90KSAocy0+X3Jhd19zaXplICsgYWRkKSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0IChjb250ZW50cyArIHMtPl9yYXdfc2l6ZSwgMCwgKHNpemVfdCkgYWRkKTsKLQkgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBzLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSB3b3JrZWQgb3V0IHRoZSBzaXplcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgdGFibGUgYW5kIHRoZSBkeW5hbWljIHJlbG9jcywgYWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlbS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoZHlub2JqKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIG1lbWNweSAocy0+Y29udGVudHMsIHNwYXJjX3BsdF9maXJzdF9lbnRyeSwgU1BBUkNfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBtNjhrX3BsdF9maXJzdF9lbnRyeSwgTTY4S19QTFRfRU5UUllfU0laRSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCi0gICAgIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICBzLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc25lZWRwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgKnNydWxlc3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBQVFIgcmVsb2NzOwotICBQVFIgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gIGlmIChyZWxfc2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHJlbG9jcyA9IGZyZWVfcmVsb2NzID0gYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqbjsKLQotICAgICAgbiA9ICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKG4gPT0gTlVMTCkKLQlyZWxvY3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9hb3V0X3NlY3Rpb25fZGF0YSAoc2VjLCBuKTsKLQkgIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLQkgIGFvdXRfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSByZWxvY3M7Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgYWJmZCkgIT0gcmVsX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLAotCQkJCSAgIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkgICByZWxfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4KLSAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgZG8gdGhlIHdyb25nCi0gICB0aGluZyBpZiB0aGUgc3ltYm9sIGlzIGFjdHVhbGx5IGRhdGE7IEkgZG9uJ3QgdGhpbmsgdGhlIFN1biAzCi0gICBuYXRpdmUgbGlua2VyIGhhbmRsZXMgdGhpcyBjYXNlIGNvcnJlY3RseSBlaXRoZXIuICBJZiB0aGUgc3ltYm9sIGlzCi0gICBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYwotICAgcmVsb2MuICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBQSUMgcmVsb2NzIGhlcmUgYnkKLSAgIGJ1aWxkaW5nIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc3BsdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsID0gTlVMTDsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbCwgKnJlbGVuZDsKLQotICAvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBtNjhrIHBsdCBlbnRyaWVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbTY4aykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBOVUxMOwotCi0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19TVERfU0laRTsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBXZSBvbmx5IHdhbnQgcmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQl7Ci0JICBpZiAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykgPT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgc3ltYm9sIGluZGV4LiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgIGVsc2UKLQlyX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGl0IHdpbGwgaW4gYW55IGNhc2UKLQkgICAgIGJlIGNhdWdodCBpbiB0aGUgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY29tbW9uIHN5bWJvbHMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBzbwotCSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0uICBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoYXQKLQkgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgc3ltYm9sIGFuZCBtYXJrZWQgaXQgdW5kZWZpbmVkOwotCSBpZiB0aGUgc3ltYm9sIGlzIHJlYWxseSB1bmRlZmluZWQsIHRoZW4gU1VOT1NfREVGX0RZTkFNSUMKLQkgd2lsbCBiZSB6ZXJvLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2dvdDsKLQotCSAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApOwotICAgICAgQkZEX0FTU0VSVCAoaC0+cGx0X29mZnNldCAhPSAwCi0JCSAgfHwgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgPyAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICYgRFlOQU1JQykgIT0gMAotCQkgICAgICA6IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApKTsKLQotICAgICAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgb25seSBieSBhIGR5bmFtaWMKLQkgb2JqZWN0LiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIFByZXN1bWFibHkgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCBhcyBiZWluZyB1bmRlZmluZWQgYnkKLQkgICAgIGFuIGVhcmxpZXIgcmVsb2MuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl7Ci0JICBiZmQgKnN1YjsKLQotCSAgLyogVGhpcyByZWxvYyBpcyBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBJdCBtdXN0IGJlCi0JICAgICBjb3BpZWQgaW50byB0aGUgZHluYW1pYyByZWxvY3MuICBXZSBtYXJrIHRoZSBzeW1ib2wgYXMKLQkgICAgIGJlaW5nIHVuZGVmaW5lZC4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IHN1YjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBXZSBtdXN0IGdpdmUgaXQgYW4KLQkgICAgIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgaWYgd2UgaGF2ZSBub3QKLQkgICAgIGFscmVhZHkgZG9uZSBzby4gIFdlIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sCi0JICAgICB0byB0aGUgLnBsdCBzZWN0aW9uOyB0aGlzIHdpbGwgY2F1c2UgcmVsb2NzIGFnYWluc3QgaXQgdG8KLQkgICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChoLT5wbHRfb2Zmc2V0ID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID09IDApCi0JCXNwbHQtPl9yYXdfc2l6ZSA9IE02OEtfUExUX0VOVFJZX1NJWkU7Ci0JICAgICAgaC0+cGx0X29mZnNldCA9IHNwbHQtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJewotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gc3BsdDsKLQkJICBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSBzcGx0LT5fcmF3X3NpemU7Ci0JCX0KLQotCSAgICAgIHNwbHQtPl9yYXdfc2l6ZSArPSBNNjhLX1BMVF9FTlRSWV9TSVpFOwotCi0JICAgICAgLyogV2UgbWF5IGFsc28gbmVlZCBhIGR5bmFtaWMgcmVsb2MgZW50cnkuICAqLwotCSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uIHVzaW5nIGV4dGVuZGVkIHJlbG9jcy4gIFdlCi0gICBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBmb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZHluYW1pYwotICAgc3ltYm9sLiAgSWYgdGhlIHJlbG9jIGlzIGEgV0RJU1AzMCwgYW5kIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uLCBhbiBlbnRyeSBpcyBtYWRlIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4KLSAgIE90aGVyd2lzZSwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgcmVsb2MgYXMgYSBkeW5hbWljIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxvY3MsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgU1BBUkMgcGx0IGVudHJpZXMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9zcGFyYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBOVUxMOwotCi0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0KLSAgICAgIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIHJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgIHJfdHlwZSA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgcl90eXBlID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotCX0KLQotICAgICAgaWYgKHJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueQotCQkgY2FzZSBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgYmFzZSByZWxhdGl2ZSByZWxvYywgd2UgbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluCi0gICAgICAgICB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCXsKLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLwotCSAgICAgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkJc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JICAgIH0KLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdF9vZmZzZXQgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBoLT5nb3Rfb2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9pbmRleCA+PSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWJub3JtYWwsIGJ1dCBzaG91bGQgYmUgY2F1Z2h0IGluIHRoZQotCQkgICAgIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPQotCQkgICAgKGJmZF92bWEgKikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJICAgIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKQotCQkJCQkgICAgICogc2l6ZW9mIChiZmRfdm1hKSkpOwotCQkgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gQllURVNfSU5fV09SRDsKLQotCSAgLyogSWYgd2UgYXJlIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LCBvciBpZiB0aGUgc3ltYm9sIGlzCi0JICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlIHdpbGwgbmVlZCBhIGR5bmFtaWMgcmVsb2MKLQkgICAgIGVudHJ5LiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0JICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPdGhlcndpc2UsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gcmVsb2NzIGFnYWluc3Qgc3ltYm9scwotICAgICAgICAgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMgYnV0IG5vdCBpbiByZWd1bGFyIG9iamVjdHMuICBXZQotICAgICAgICAgb25seSBuZWVkIHRvIGNvbnNpZGVyIHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgcl9leHRlcm4pCi0JewotCSAgLyogQnV0LCBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0bwotICAgICAgICAgICAgIGdlbmVyYXRlIGFuIGFic29sdXRlIHJlbG9jLiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCXsKLQkJICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgdHJ1ZSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkJICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkJICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkJICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkJICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY29tbW9uIHN5bWJvbHMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBzbwotCSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0uICBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoYXQKLQkgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgc3ltYm9sIGFuZCBtYXJrZWQgaXQgdW5kZWZpbmVkOwotCSBpZiB0aGUgc3ltYm9sIGlzIHJlYWxseSB1bmRlZmluZWQsIHRoZW4gU1VOT1NfREVGX0RZTkFNSUMKLQkgd2lsbCBiZSB6ZXJvLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAotCSAgJiYgISBpbmZvLT5zaGFyZWQKLQkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgICAgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCi0JICAmJiAhIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgdW5kZWZpbmVkLiAgRG9uJ3QgZG8gYW55dGhpbmcKLSAgICAgICAgICAgICBoZXJlOyBqdXN0IGxldCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lIHJlcG9ydCBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKLQkJICB8fCBpbmZvLT5zaGFyZWQKLQkJICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAotCQkgIHx8IGluZm8tPnNoYXJlZAotCQkgIHx8IGgtPnBsdF9vZmZzZXQgIT0gMAotCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAmIERZTkFNSUMpICE9IDAKLQkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7Ci0KLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCi0JIG9iamVjdCwgb3IgaXQgaXMgYSBqdW1wIHRhYmxlIHJlbG9jIGZyb20gUElDIGNvbXBpbGVkIGNvZGUuICAqLwotCi0gICAgICBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIFByZXN1bWFibHkgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCBhcyBiZWluZyB1bmRlZmluZWQgYnkKLQkgICAgIGFuIGVhcmxpZXIgcmVsb2MuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl7Ci0JICBiZmQgKnN1YjsKLQotCSAgLyogVGhpcyByZWxvYyBpcyBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBJdCBtdXN0IGJlCi0JICAgICBjb3BpZWQgaW50byB0aGUgZHluYW1pYyByZWxvY3MuICBXZSBtYXJrIHRoZSBzeW1ib2wgYXMKLQkgICAgIGJlaW5nIHVuZGVmaW5lZC4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICAgIHsKLQkgICAgICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCi0JICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90Ci0JICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAotCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCi0JICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0JICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQotCQlzcGx0LT5fcmF3X3NpemUgPSBTUEFSQ19QTFRfRU5UUllfU0laRTsKLQkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCQkgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OwotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKLQkJfQotCi0JICAgICAgc3BsdC0+X3Jhd19zaXplICs9IFNQQVJDX1BMVF9FTlRSWV9TSVpFOwotCi0JICAgICAgLyogV2Ugd2lsbCBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LCB1bmxlc3MgdGhpcwotICAgICAgICAgICAgICAgICBpcyBhIEpNUF9UQkwgcmVsb2MgcHJvZHVjZWQgYnkgbGlua2luZyBQSUMgY29tcGlsZWQKLSAgICAgICAgICAgICAgICAgY29kZSwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IG92ZXIKLSAgICAgICAgICAgICBhbnkgcmVsb2Mgb3RoZXIgdGhhbiBhIGp1bXAgdGFibGUgcmVsb2MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCAmJiByX3R5cGUgIT0gUkVMT0NfSk1QX1RCTCkKLQkgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBoYXNoIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgYW5kIHRvIG1hcmsgYXMgd3JpdHRlbiBhbGwKLSAgIHN5bWJvbHMgZnJvbSBkeW5hbWljIG9iamVjdHMgd2hpY2ggd2UgZG8gbm90IHBsYW4gdG8gd3JpdGUgb3V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotCi0gIC8qIFNldCB0aGUgd3JpdHRlbiBmbGFnIGZvciBzeW1ib2xzIHdlIGRvIG5vdCB3YW50IHRvIHdyaXRlIG91dCBhcwotICAgICBwYXJ0IG9mIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYWxsIHN5bWJvbHMgd2hpY2ggYXJlCi0gICAgIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4gIEZvciBzb21lIHJlYXNvbiBzeW1ib2xzCi0gICAgIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QgYW5kIGRlZmluZWQgYnkgYSBkeW5hbWljCi0gICAgIG9iamVjdCBkbyBub3Qgc2VlbSB0byBzaG93IHVwIGluIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIEl0IGlzCi0gICAgIHBvc3NpYmxlIGZvciBhIHN5bWJvbCB0byBoYXZlIG9ubHkgU1VOT1NfUkVGX1JFR1VMQVIgc2V0IGhlcmUsIGl0Ci0gICAgIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIHR1cm5lZCBpbnRvIGEgY29tbW9uIHN5bWJvbAotICAgICBiZWNhdXNlIGl0IHdhcyBmb3VuZCBpbiBhbiBhcmNoaXZlIG9iamVjdCB3aGljaCB3YXMgbm90IGluY2x1ZGVkCi0gICAgIGluIHRoZSBsaW5rLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwKQotICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgICAgcmVndWxhciBvYmplY3QsIHNlZSB3aGV0aGVyIHdlIGdhdmUgaXQgYSByZWFzb25hYmxlIHZhbHVlIHdoaWxlCi0gICAgIHNjYW5uaW5nIHRoZSByZWxvY3MuICAqLwotCi0gIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQkgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBjdXJyZW50bHkgZGVmaW5lZCBpbiBhIGR5bmFtaWMgc2VjdGlvbgotCSAgICAgd2hpY2ggaXMgbm90IGJlaW5nIHB1dCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLQkgICAgIGltcGxpZXMgdGhhdCB0aGVyZSBpcyBubyByZWxvYyBhZ2FpbnN0IHRoZSBzeW1ib2wuICBJJ20KLQkgICAgIG5vdCBzdXJlIHdoeSB0aGlzIGNhc2Ugd291bGQgZXZlciBvY2N1ci4gIEluIGFueSBjYXNlLCB3ZQotCSAgICAgY2hhbmdlIHRoZSBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgKi8KLQkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBmaWxlLCBhZGQgaXQKLSAgICAgdG8gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiAoU1VOT1NfREVGX1JFR1VMQVIgfCBTVU5PU19SRUZfUkVHVUxBUikpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICAgdW5zaWduZWQgY2hhciAqbmFtZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgICAgIGJmZCAqZHlub2JqOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID09IC0yKTsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAgICAgaC0+ZHluaW5keCA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgICAgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGJvdGhlciB0byBjb25zdHJ1Y3QgYSBCRkQgaGFzaCB0YWJsZSBmb3IgdGhlIHN0cmluZ3MKLQkgd2hpY2ggYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVXNpbmcgYSBoYXNoCi0JIHRhYmxlIGZvciB0aGUgcmVndWxhciBzeW1ib2xzIGlzIGJlbmVmaWNpYWwsIGJlY2F1c2UgdGhlCi0JIHJlZ3VsYXIgc3ltYm9scyBpbmNsdWRlcyB0aGUgZGVidWdnaW5nIHN5bWJvbHMsIHdoaWNoIGhhdmUKLQkgbG9uZyBuYW1lcyBhbmQgYXJlIG9mdGVuIGR1cGxpY2F0ZWQgaW4gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0JIFRoZXJlIGFyZSBubyBkZWJ1Z2dpbmcgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywKLQkJCQkJICAgcy0+X3Jhd19zaXplICsgbGVuICsgMSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCi0gICAgICBoLT5keW5zdHJfaW5kZXggPSBzLT5fcmF3X3NpemU7Ci0gICAgICBzdHJjcHkgKChjaGFyICopIGNvbnRlbnRzICsgcy0+X3Jhd19zaXplLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgcy0+X3Jhd19zaXplICs9IGxlbiArIDE7Ci0KLSAgICAgIC8qIEFkZCBpdCB0byB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIG5hbWUgPSAodW5zaWduZWQgY2hhciAqKSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBoYXNoID0gMDsKLSAgICAgIHdoaWxlICgqbmFtZSAhPSAnXDAnKQotCWhhc2ggPSAoaGFzaCA8PCAxKSArICpuYW1lKys7Ci0gICAgICBoYXNoICY9IDB4N2ZmZmZmZmY7Ci0gICAgICBoYXNoICU9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKEdFVF9TV09SRCAoZHlub2JqLCBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpID09IC0xKQotCVBVVF9XT1JEIChkeW5vYmosIGgtPmR5bmluZHgsIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBuZXh0OwotCi0JICBuZXh0ID0gR0VUX1dPUkQgKGR5bm9iaiwKLQkJCSAgIChzLT5jb250ZW50cwotCQkJICAgICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRQotCQkJICAgICsgQllURVNfSU5fV09SRCkpOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplIC8gSEFTSF9FTlRSWV9TSVpFLAotCQkgICAgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBoLT5keW5pbmR4LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBuZXh0LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSArIEJZVEVTX0lOX1dPUkQpOwotCSAgcy0+X3Jhd19zaXplICs9IEhBU0hfRU5UUllfU0laRTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMaW5rIGEgZHluYW1pYyBvYmplY3QuICBXZSBhY3R1YWxseSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGF0Ci0gICB0aGlzIHBvaW50LiAgVGhpcyBlbnRyeSBwb2ludCBleGlzdHMgdG8gcHJldmVudCB0aGUgcmVndWxhciBsaW5rZXIKLSAgIGNvZGUgZnJvbSBkb2luZyBhbnl0aGluZyB3aXRoIHRoZSBvYmplY3QuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0IChpbmZvLCBhYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGR5bmFtaWMgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGZpbmFsIHRyYXZlcnNhbAotICAgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBpbnQgdHlwZTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm91dHN5bTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGZpbGwgaW4gdGhlCi0gICAgIHRhYmxlIGVudHJ5LiAgKi8KLSAgaWYgKGgtPnBsdF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmQgKmR5bm9iajsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF92bWEgcl9hZGRyZXNzOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBwID0gc3BsdC0+Y29udGVudHMgKyBoLT5wbHRfb2Zmc2V0OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQotICAgICAgcl9hZGRyZXNzID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaC0+cGx0X29mZnNldCk7Ci0KLSAgICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfRU5UUllfV09SRDAsIHApOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIChTUEFSQ19QTFRfRU5UUllfV09SRDEKLQkJCSAgICsgKCgoLSAoaC0+cGx0X29mZnNldCArIDQpID4+IDIpCi0JCQkgICAgICAgJiAweDNmZmZmZmZmKSkpLAotCQkJICBwICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX0VOVFJZX1dPUkQyICsgcy0+cmVsb2NfY291bnQsCi0JCQkgIHAgKyA4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBoLT5yb290LnJvb3QudS5kZWYudmFsdWUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIFNQQVJDX1BMVF9QSUNfV09SRDAgKyAoKHZhbCA+PiAxMCkgJiAweDNmZmZmZiksCi0JCQkgIHApOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIFNQQVJDX1BMVF9QSUNfV09SRDEgKyAodmFsICYgMHgzZmYpLAotCQkJICBwICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX1BJQ19XT1JEMiwgcCArIDgpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2FyY2hfbTY4azoKLQkgIGlmICghIGluZm8tPnNoYXJlZCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkKLQkgICAgYWJvcnQgKCk7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCBNNjhLX1BMVF9FTlRSWV9XT1JEMCwgcCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoLSAoaC0+cGx0X29mZnNldCArIDIpKSwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgcy0+cmVsb2NfY291bnQsIHAgKyA2KTsKLQkgIHJfYWRkcmVzcyArPSAyOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gYWRkIGEganVtcCB0YWJsZSByZWxvYywgdW5sZXNzIHRoaXMgaXMgdGhlCi0gICAgICAgICByZXN1bHQgb2YgYSBKTVBfVEJMIHJlbG9jIGZyb20gUElDIGNvbXBpbGVkIGNvZGUuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID49IDApOwotCSAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQotCQkgICAgICA8IHMtPl9yYXdfc2l6ZSk7Ci0JICBwID0gcy0+Y29udGVudHMgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChvdXRwdXRfYmZkKTsKLQkgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAob3V0cHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0JICAgICAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkcmVzcywgc3JlbC0+cl9hZGRyZXNzKTsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCk7Ci0JCSAgc3JlbC0+cl90eXBlWzBdID0gKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcKLQkJCQkgICAgIHwgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIHNyZWwtPnJfdHlwZVswXSA9IChSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCi0JCQkJICAgICB8IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOwotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZHJlc3MsIGVyZWwtPnJfYWRkcmVzcyk7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBlcmVsLT5yX3R5cGVbMF0gPQotCQkgICAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKLQkJICAgICB8IChSRUxPQ19KTVBfU0xPVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRykpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgZXJlbC0+cl90eXBlWzBdID0KLQkJICAgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCi0JCSAgICAgfCAoUkVMT0NfSk1QX1NMT1QgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpKTsKLQkJfQotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgZXJlbC0+cl9hZGRlbmQpOwotCSAgICB9Ci0KLQkgICsrcy0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLCB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCi0gICAgIGVsc2UuICBXZSBvbmx5IGNoZWNrIHRoaXMgYWZ0ZXIgaGFuZGxpbmcgdGhlIFBMVCBlbnRyeSwgYmVjYXVzZQotICAgICB3ZSBjYW4gaGF2ZSBhIFBMVCBlbnRyeSBmb3IgYSBub25keW5hbWljIHN5bWJvbCB3aGVuIGxpbmtpbmcgUElDCi0gICAgIGNvbXBpbGVkIGNvZGUgZnJvbSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPCAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoaC0+cm9vdC5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgLyogQXZvaWQgdmFyaWFibGUgbm90IGluaXRpYWxpemVkIHdhcm5pbmdzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQlzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQlvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JQkZEX0FTU0VSVCAoYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLQkJICAgIHx8IG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlpZiAoaC0+cGx0X29mZnNldCAhPSAwCi0JICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgewotCSAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0JICAgIHZhbCA9IDA7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9URVhUCi0JCSAgICAgIDogTl9XRUFLVCk7Ci0JICAgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fREFUQQotCQkgICAgICA6IE5fV0VBS0QpOwotCSAgICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fQlNTCi0JCSAgICAgIDogTl9XRUFLQik7Ci0JICAgIGVsc2UKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fQUJTCi0JCSAgICAgIDogTl9XRUFLQSk7Ci0JICAgIHR5cGUgfD0gTl9FWFQ7Ci0JICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICB0eXBlID0gTl9VTkRGIHwgTl9FWFQ7Ci0gICAgICB2YWwgPSBoLT5yb290LnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgdHlwZSA9IE5fV0VBS1U7Ci0gICAgICB2YWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAiLmR5bnN5bSIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvdXRzeW0gPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCSAgICAocy0+Y29udGVudHMgKyBoLT5keW5pbmR4ICogRVhURVJOQUxfTkxJU1RfU0laRSkpOwotCi0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0tPmVfdHlwZSk7Ci0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfb3RoZXIpOwotCi0gIC8qIEZJWE1FOiBUaGUgbmF0aXZlIGxpbmtlciBkb2Vzbid0IHVzZSAwIGZvciBkZXNjLiAgSXQgc2VlbXMgdG8gdXNlCi0gICAgIG9uZSBsZXNzIHRoYW4gdGhlIGRlc2MgdmFsdWUgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBhbHRob3VnaCB0aGF0Ci0gICAgIHNlZW1zIHVubGlrZWx5LiAgKi8KLSAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfZGVzYyk7Ci0KLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIGgtPmR5bnN0cl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsLCBvdXRzeW0tPmVfdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHRoaXMKLSAgIGlzIGEgcmVsb2Mgd2hpY2ggYXJlIGFyZSBnb2luZyB0byBjb3B5IGFzIGEgZHluYW1pYyByZWxvYywgdGhlbgotICAgY29weSBpdCBvdmVyLCBhbmQgdGVsbCB0aGUgY2FsbGVyIHRvIG5vdCBib3RoZXIgcHJvY2Vzc2luZyB0aGlzCi0gICByZWxvYy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaGFyZywgcmVsb2MsCi0JCQkgICBjb250ZW50cywgc2tpcCwgcmVsb2NhdGlvbnApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgUFRSIHJlbG9jOwotICAgICBiZmRfYnl0ZSAqY29udGVudHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiAqc2tpcDsKLSAgICAgYmZkX3ZtYSAqcmVsb2NhdGlvbnA7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBiZmQgKmR5bm9iajsKLSAgYm9vbGVhbiBiYXNlcmVsOwotICBib29sZWFuIGptcHRibDsKLSAgYm9vbGVhbiBwY3JlbDsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9ieXRlICpwOwotICBsb25nIGluZHg7Ci0KLSAgKnNraXAgPSBmYWxzZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIGgtPnBsdF9vZmZzZXQgIT0gMAotICAgICAgJiYgKGluZm8tPnNoYXJlZAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotCi0gICAgICAvKiBSZWRpcmVjdCB0aGUgcmVsb2NhdGlvbiB0byB0aGUgUExUIGVudHJ5LiAgKi8KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgKnJlbG9jYXRpb25wID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgaC0+cGx0X29mZnNldCk7Ci0gICAgfQotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0gICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXsKLQkgIGJhc2VyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLQkgIGptcHRibCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLQkgIHBjcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiYXNlcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0JICBqbXB0YmwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKSk7Ci0JICBwY3JlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLSAgICAgIGludCByX3R5cGU7Ci0KLSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvYzsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0Jcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgICBlbHNlCi0Jcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gICAgICBiYXNlcmVsID0gKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpOwotICAgICAgam1wdGJsID0gcl90eXBlID09IFJFTE9DX0pNUF9UQkw7Ci0gICAgICBwY3JlbCA9IChyX3R5cGUgPT0gUkVMT0NfRElTUDgKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX0RJU1AxNgotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfRElTUDMyCi0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDMwCi0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDIyKTsKLSAgICAgIC8qIFdlIGRvbid0IGNvbnNpZGVyIHRoZSBQQzEwIGFuZCBQQzIyIHR5cGVzIHRvIGJlIFBDIHJlbGF0aXZlLAotICAgICAgICAgYmVjYXVzZSB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuICAqLwotICAgIH0KLQotICBpZiAoYmFzZXJlbCkKLSAgICB7Ci0gICAgICBiZmRfdm1hICpnb3Rfb2Zmc2V0cDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCWdvdF9vZmZzZXRwID0gJmgtPmdvdF9vZmZzZXQ7Ci0gICAgICBlbHNlIGlmIChhZGF0YSAoaW5wdXRfYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCWdvdF9vZmZzZXRwID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCSAgaW50IHJfaW5kZXg7Ci0KLQkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvYzsKLQkgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLQkgICAgewotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXJfaW5kZXggPSAoKHNyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCQkgICB8IChzcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IHNyZWwtPnJfaW5kZXhbMl0pOwotCSAgICAgIGVsc2UKLQkJcl9pbmRleCA9ICgoc3JlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJCSAgIHwgKHNyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgc3JlbC0+cl9pbmRleFswXSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJcl9pbmRleCA9ICgoZXJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgIHwgKGVyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgZXJlbC0+cl9pbmRleFsyXSk7Ci0JICAgICAgZWxzZQotCQlyX2luZGV4ID0gKChlcmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJICAgfCAoZXJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBlcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgfQotCi0JICBnb3Rfb2Zmc2V0cCA9IGFkYXRhIChpbnB1dF9iZmQpLmxvY2FsX2dvdF9vZmZzZXRzICsgcl9pbmRleDsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGdvdF9vZmZzZXRwICE9IE5VTEwgJiYgKmdvdF9vZmZzZXRwICE9IDApOwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotICAgICAgLyogV2Ugc2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBoYXZlCi0JIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIEdPVCBlbnRyeS4gICovCi0gICAgICBpZiAoKCpnb3Rfb2Zmc2V0cCAmIDEpID09IDApCi0JewotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8ICghIGluZm8tPnNoYXJlZAotCQkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkpKQotCSAgICBQVVRfV09SRCAoZHlub2JqLCAqcmVsb2NhdGlvbnAsIHNnb3QtPmNvbnRlbnRzICsgKmdvdF9vZmZzZXRwKTsKLQkgIGVsc2UKLQkgICAgUFVUX1dPUkQgKGR5bm9iaiwgMCwgc2dvdC0+Y29udGVudHMgKyAqZ290X29mZnNldHApOwotCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgfHwgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQotCSAgICB7Ci0JICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBHTE9CX0RBVCBvciAzMiByZWxvYyB0byB0ZWxsIHRoZQotICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciB0byBmaWxsIGluIHRoaXMgZW50cnkgaW4gdGhlIHRhYmxlLiAgKi8KLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQotCQkJICA8IHMtPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICBwID0gKHMtPmNvbnRlbnRzCi0JCSAgICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlpbmR4ID0gaC0+ZHluaW5keDsKLQkgICAgICBlbHNlCi0JCWluZHggPSAwOwotCi0JICAgICAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQotCQl7Ci0JCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotCQkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotCQkgIFBVVF9XT1JEIChkeW5vYmosCi0JCQkgICAgKCpnb3Rfb2Zmc2V0cAotCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKLQkJCSAgICBzcmVsLT5yX2FkZHJlc3MpOwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzcmVsLT5yX3R5cGVbMF0gPSAyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUc7Ci0JCSAgICAgIGVsc2UKLQkJCXNyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwotCQkJICAgfCAoMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc3JlbC0+cl90eXBlWzBdID0gMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFOwotCQkgICAgICBlbHNlCi0JCQlzcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJICAgfCBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQotCQkJICAgfCBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUKLQkJCSAgIHwgKDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCQkgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOwotCQkgIFBVVF9XT1JEIChkeW5vYmosCi0JCQkgICAgKCpnb3Rfb2Zmc2V0cAotCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKLQkJCSAgICBlcmVsLT5yX2FkZHJlc3MpOwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JCSAgICB7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICBSRUxPQ18zMiA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQkJICAgICAgZWxzZQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKLQkJCSAgIHwgKFJFTE9DX0dMT0JfREFUIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgUkVMT0NfMzIgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0JCSAgICAgIGVsc2UKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCi0JCQkgICB8IChSRUxPQ19HTE9CX0RBVAotCQkJICAgICAgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpKTsKLQkJICAgIH0KLQkJICBQVVRfV09SRCAoZHlub2JqLCAwLCBlcmVsLT5yX2FkZGVuZCk7Ci0JCX0KLQotCSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQotCSAgKmdvdF9vZmZzZXRwIHw9IDE7Ci0JfQotCi0gICAgICAqcmVsb2NhdGlvbnAgPSAoc2dvdC0+dm1hCi0JCSAgICAgICsgKCpnb3Rfb2Zmc2V0cCAmfiAxKQotCQkgICAgICAtIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfYmFzZSk7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBmb3IgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpZiAoaCA9PSBOVUxMCi0JICB8fCBoLT5keW5pbmR4ID09IC0xCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDAKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5keW5pbmR4ID09IC0xCi0JICAgICAgfHwgam1wdGJsCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgcmVsb2Mgd2UgYXJlIHN1cHBvc2VkIHRvIGNvcHkuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopIDwgcy0+X3Jhd19zaXplKTsKLQotICBwID0gcy0+Y29udGVudHMgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopOwotCi0gIC8qIENvcHkgdGhlIHJlbG9jIG92ZXIuICAqLwotICBtZW1jcHkgKHAsIHJlbG9jLCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICBpbmR4ID0gaC0+ZHluaW5keDsKLSAgZWxzZQotICAgIGluZHggPSAwOwotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJKEdFVF9XT1JEIChkeW5vYmosIHNyZWwtPnJfYWRkcmVzcykKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJc3JlbC0+cl9hZGRyZXNzKTsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JewotCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgLyogRklYTUU6IFdlIG1heSBoYXZlIHRvIGNoYW5nZSB0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlCi0gICAgICAgICByZWxvYy4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoR0VUX1dPUkQgKGR5bm9iaiwgZXJlbC0+cl9hZGRyZXNzKQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQllcmVsLT5yX2FkZHJlc3MpOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQl7Ci0JICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICBpZiAocGNyZWwgJiYgaCAhPSBOVUxMKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgYWRkZW5kIGZvciB0aGUgY2hhbmdlIGluIGFkZHJlc3MuICAqLwotCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJICAgIChHRVRfV09SRCAoZHlub2JqLCBlcmVsLT5yX2FkZGVuZCkKLQkJICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKSksCi0JCSAgICBlcmVsLT5yX2FkZGVuZCk7Ci0JfQotICAgIH0KLQotICArK3MtPnJlbG9jX2NvdW50OwotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgKnNraXAgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19maW5pc2hfZHluYW1pY19saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKm87Ci0gIGFzZWN0aW9uICpzOwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQKLSAgICAgICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSAubmVlZCBzZWN0aW9uLiAgVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBmaWxsZWQgaXQKLSAgICAgaW4sIGJ1dCB3aXRoIG9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZgotICAgICByZWFsIGFkZHJlc3Nlcy4gIE5vdyB0aGF0IHdlIGtub3cgdGhlIHNlY3Rpb24gbG9jYXRpb24sIHdlIGNhbgotICAgICBmaWxsIGluIHRoZSBmaW5hbCB2YWx1ZXMuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgZmlsZXBvczsKLSAgICAgIGJmZF9ieXRlICpwOwotCi0gICAgICBmaWxlcG9zID0gcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcCA9IHMtPmNvbnRlbnRzOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIFBVVF9XT1JEIChkeW5vYmosIEdFVF9XT1JEIChkeW5vYmosIHApICsgZmlsZXBvcywgcCk7Ci0JICB2YWwgPSBHRVRfV09SRCAoZHlub2JqLCBwICsgMTIpOwotCSAgaWYgKHZhbCA9PSAwKQotCSAgICBicmVhazsKLQkgIFBVVF9XT1JEIChkeW5vYmosIHZhbCArIGZpbGVwb3MsIHAgKyAxMik7Ci0JICBwICs9IDE2OwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSAuZ290IHNlY3Rpb24gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgIGR5bmFtaWMgaW5mb3JtYXRpb24sIHVubGVzcyB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgaWYgKGluZm8tPnNoYXJlZCB8fCBzZHluLT5fcmF3X3NpemUgPT0gMCkKLSAgICBQVVRfV09SRCAoZHlub2JqLCAwLCBzLT5jb250ZW50cyk7Ci0gIGVsc2UKLSAgICBQVVRfV09SRCAoZHlub2JqLCBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkgICAgICBzLT5jb250ZW50cyk7Ci0KLSAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAotCSAgJiYgby0+Y29udGVudHMgIT0gTlVMTCkKLQl7Ci0JICBCRkRfQVNTRVJUIChvLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgICAgICYmIG8tPm91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBhYmZkKTsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJCSAgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNkeW4tPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBlc2Q7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZXNkbDsKLQotICAgICAgLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDMsIGVzZC5sZF92ZXJzaW9uKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCXNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZW9mIGVzZCwKLQkJZXNkLmxkZCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZHluLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIHNpemVvZiBlc2QKLQkJICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAotCQllc2QubGQpOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNkeW4tPm91dHB1dF9zZWN0aW9uLCAmZXNkLAotCQkJCSAgICAgIHNkeW4tPm91dHB1dF9vZmZzZXQsIHNpemVvZiBlc2QpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfbG9hZGVkKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpOwotICAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKLQlQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9uZWVkKTsKLSAgICAgIGVsc2UKLQlQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCSAgZXNkbC5sZF9uZWVkKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLSAgICAgIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0JUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfcnVsZXMpOwotICAgICAgZWxzZQotCVBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJICBlc2RsLmxkX3J1bGVzKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfZ290KTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfcGx0KTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9wbHRfc3opOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCSAgPT0gcy0+X3Jhd19zaXplKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9yZWwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX2hhc2gpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfc3RhYik7Ci0KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX3N0YWJfaGFzaCk7Ci0KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+YnVja2V0Y291bnQsCi0JCWVzZGwubGRfYnVja2V0cyk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9zeW1ib2xzKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9zeW1iX3NpemUpOwotCi0gICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdGV4dCBhcmVhIGlzIHRoZSBzaXplIG9mIHRoZSAudGV4dCBzZWN0aW9uCi0JIHJvdW5kZWQgdXAgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IFNob3VsZCB0aGUgcGFnZSBzaXplIGJlCi0JIGNvbmRpdGlvbmFsIG9uIHNvbWV0aGluZz8gICovCi0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQlCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCAweDIwMDApLAotCQllc2RsLmxkX3RleHQpOwotICAKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2R5bi0+b3V0cHV0X3NlY3Rpb24sICZlc2RsLAotCQkJCSAgICAgIChzZHluLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgc2l6ZW9mIGVzZAotCQkJCSAgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKSwKLQkJCQkgICAgICBzaXplb2YgZXNkbCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zeW1zLmMgYi9iZmQvc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQ2ZjU4Li4wMDAwMDAwCi0tLSBhL2JmZC9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA2ICswLDAgQEAKLS8qIEdlbmVyaWMgc3ltYm9sLXRhYmxlIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlTeW1ib2xzCi0KLQlCRkQgdHJpZXMgdG8gbWFpbnRhaW4gYXMgbXVjaCBzeW1ib2wgaW5mb3JtYXRpb24gYXMgaXQgY2FuIHdoZW4KLQlpdCBtb3ZlcyBpbmZvcm1hdGlvbiBmcm9tIGZpbGUgdG8gZmlsZS4gQkZEIHBhc3NlcyBpbmZvcm1hdGlvbgotCXRvIGFwcGxpY2F0aW9ucyB0aG91Z2ggdGhlIDw8YXN5bWJvbD4+IHN0cnVjdHVyZS4gV2hlbiB0aGUKLQlhcHBsaWNhdGlvbiByZXF1ZXN0cyB0aGUgc3ltYm9sIHRhYmxlLCBCRkQgcmVhZHMgdGhlIHRhYmxlIGluCi0JdGhlIG5hdGl2ZSBmb3JtIGFuZCB0cmFuc2xhdGVzIHBhcnRzIG9mIGl0IGludG8gdGhlIGludGVybmFsCi0JZm9ybWF0LiBUbyBtYWludGFpbiBtb3JlIHRoYW4gdGhlIGluZm9ybWF0aW9uIHBhc3NlZCB0bwotCWFwcGxpY2F0aW9ucywgc29tZSB0YXJnZXRzIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBgYGJlaGluZCB0aGUKLQlzY2VuZXMnJyBpbiBhIHN0cnVjdHVyZSBvbmx5IHRoZSBwYXJ0aWN1bGFyIGJhY2sgZW5kIGtub3dzCi0JYWJvdXQuIEZvciBleGFtcGxlLCB0aGUgY29mZiBiYWNrIGVuZCBrZWVwcyB0aGUgb3JpZ2luYWwKLQlzeW1ib2wgdGFibGUgc3RydWN0dXJlIGFzIHdlbGwgYXMgdGhlIGNhbm9uaWNhbCBzdHJ1Y3R1cmUgd2hlbgotCWEgQkZEIGlzIHJlYWQgaW4uIE9uIG91dHB1dCwgdGhlIGNvZmYgYmFjayBlbmQgY2FuIHJlY29uc3RydWN0Ci0JdGhlIG91dHB1dCBzeW1ib2wgdGFibGUgc28gdGhhdCBubyBpbmZvcm1hdGlvbiBpcyBsb3N0LCBldmVuCi0JaW5mb3JtYXRpb24gdW5pcXVlIHRvIGNvZmYgd2hpY2ggQkZEIGRvZXNuJ3Qga25vdyBvcgotCXVuZGVyc3RhbmQuIElmIGEgY29mZiBzeW1ib2wgdGFibGUgd2VyZSByZWFkLCBidXQgd2VyZSB3cml0dGVuCi0JdGhyb3VnaCBhbiBhLm91dCBiYWNrIGVuZCwgYWxsIHRoZSBjb2ZmIHNwZWNpZmljIGluZm9ybWF0aW9uCi0Jd291bGQgYmUgbG9zdC4gVGhlIHN5bWJvbCB0YWJsZSBvZiBhIEJGRAotCWlzIG5vdCBuZWNlc3NhcmlseSByZWFkIGluIHVudGlsIGEgY2Fub25pY2FsaXplIHJlcXVlc3QgaXMKLQltYWRlLiBUaGVuIHRoZSBCRkQgYmFjayBlbmQgZmlsbHMgaW4gYSB0YWJsZSBwcm92aWRlZCBieSB0aGUKLQlhcHBsaWNhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYW5vbmljYWwgaW5mb3JtYXRpb24uICBUbwotCW91dHB1dCBzeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZXMgQkZEIHdpdGggYSB0YWJsZSBvZgotCXBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIDw8YXN5bWJvbD4+cy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zCi0JbGlrZSB0aGUgbGlua2VyIHRvIG91dHB1dCBhIHN5bWJvbCBhcyBpdCB3YXMgcmVhZCwgc2luY2UgdGhlIGBgYmVoaW5kCi0JdGhlIHNjZW5lcycnIGluZm9ybWF0aW9uIHdpbGwgYmUgc3RpbGwgYXZhaWxhYmxlLgotQG1lbnUKLUAqIFJlYWRpbmcgU3ltYm9sczo6Ci1AKiBXcml0aW5nIFN5bWJvbHM6OgotQCogTWluaSBTeW1ib2xzOjoKLUAqIHR5cGVkZWYgYXN5bWJvbDo6Ci1AKiBzeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zOjoKLUBlbmQgbWVudQotCi1JTk9ERQotUmVhZGluZyBTeW1ib2xzLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlSZWFkaW5nIHN5bWJvbHMKLQotCVRoZXJlIGFyZSB0d28gc3RhZ2VzIHRvIHJlYWRpbmcgYSBzeW1ib2wgdGFibGUgZnJvbSBhIEJGRDoKLQlhbGxvY2F0aW5nIHN0b3JhZ2UsIGFuZCB0aGUgYWN0dWFsIHJlYWRpbmcgcHJvY2Vzcy4gVGhpcyBpcyBhbgotCWV4Y2VycHQgZnJvbSBhbiBhcHBsaWNhdGlvbiB3aGljaCByZWFkcyB0aGUgc3ltYm9sIHRhYmxlOgotCi18CSAgbG9uZyBzdG9yYWdlX25lZWRlZDsKLXwJICBhc3ltYm9sICoqc3ltYm9sX3RhYmxlOwotfAkgIGxvbmcgbnVtYmVyX29mX3N5bWJvbHM7Ci18CSAgbG9uZyBpOwotfAotfAkgIHN0b3JhZ2VfbmVlZGVkID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotfAotfCAgICAgICAgIGlmIChzdG9yYWdlX25lZWRlZCA8IDApCi18ICAgICAgICAgICBGQUlMCi18Ci18CSAgaWYgKHN0b3JhZ2VfbmVlZGVkID09IDApIHsKLXwJICAgICByZXR1cm4gOwotfAkgIH0KLXwJICBzeW1ib2xfdGFibGUgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZV9uZWVkZWQpOwotfAkgICAgLi4uCi18CSAgbnVtYmVyX29mX3N5bWJvbHMgPQotfAkgICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1ib2xfdGFibGUpOwotfAotfCAgICAgICAgIGlmIChudW1iZXJfb2Zfc3ltYm9scyA8IDApCi18ICAgICAgICAgICBGQUlMCi18Ci18CSAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9zeW1ib2xzOyBpKyspIHsKLXwJICAgICBwcm9jZXNzX3N5bWJvbCAoc3ltYm9sX3RhYmxlW2ldKTsKLXwJICB9Ci0KLQlBbGwgc3RvcmFnZSBmb3IgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpcyBpbiBhbiBvYmphbGxvYwotCWNvbm5lY3RlZCB0byB0aGUgQkZEOyBpdCBpcyBmcmVlZCB3aGVuIHRoZSBCRkQgaXMgY2xvc2VkLgotCi0KLUlOT0RFCi1Xcml0aW5nIFN5bWJvbHMsIE1pbmkgU3ltYm9scywgUmVhZGluZyBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JV3JpdGluZyBzeW1ib2xzCi0KLQlXcml0aW5nIG9mIGEgc3ltYm9sIHRhYmxlIGlzIGF1dG9tYXRpYyB3aGVuIGEgQkZEIG9wZW4gZm9yCi0Jd3JpdGluZyBpcyBjbG9zZWQuIFRoZSBhcHBsaWNhdGlvbiBhdHRhY2hlcyBhIHZlY3RvciBvZgotCXBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIHN5bWJvbHMgdG8gdGhlIEJGRCBiZWluZyB3cml0dGVuLCBhbmQKLQlmaWxscyBpbiB0aGUgc3ltYm9sIGNvdW50LiBUaGUgY2xvc2UgYW5kIGNsZWFudXAgY29kZSByZWFkcwotCXRocm91Z2ggdGhlIHRhYmxlIHByb3ZpZGVkIGFuZCBwZXJmb3JtcyBhbGwgdGhlIG5lY2Vzc2FyeQotCW9wZXJhdGlvbnMuIFRoZSBCRkQgb3V0cHV0IGNvZGUgbXVzdCBhbHdheXMgYmUgcHJvdmlkZWQgd2l0aCBhbgotCWBgb3duZWQnJyBzeW1ib2w6IG9uZSB3aGljaCBoYXMgY29tZSBmcm9tIGFub3RoZXIgQkZELCBvciBvbmUKLQl3aGljaCBoYXMgYmVlbiBjcmVhdGVkIHVzaW5nIDw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4uICBIZXJlIGlzIGFuCi0JZXhhbXBsZSBzaG93aW5nIHRoZSBjcmVhdGlvbiBvZiBhIHN5bWJvbCB0YWJsZSB3aXRoIG9ubHkgb25lIGVsZW1lbnQ6Ci0KLXwJI2luY2x1ZGUgImJmZC5oIgotfAltYWluKCkKLXwJewotfAkgIGJmZCAqYWJmZDsKLXwJICBhc3ltYm9sICpwdHJzWzJdOwotfAkgIGFzeW1ib2wgKm5ldzsKLXwKLXwJICBhYmZkID0gYmZkX29wZW53KCJmb28iLCJhLm91dC1zdW5vcy1iaWciKTsKLXwJICBiZmRfc2V0X2Zvcm1hdChhYmZkLCBiZmRfb2JqZWN0KTsKLXwJICBuZXcgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci18CSAgbmV3LT5uYW1lID0gImR1bW15X3N5bWJvbCI7Ci18CSAgbmV3LT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5KGFiZmQsICIudGV4dCIpOwotfAkgIG5ldy0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotfAkgIG5ldy0+dmFsdWUgPSAweDEyMzQ1OwotfAotfAkgIHB0cnNbMF0gPSBuZXc7Ci18CSAgcHRyc1sxXSA9IChhc3ltYm9sICopMDsKLXwKLXwJICBiZmRfc2V0X3N5bXRhYihhYmZkLCBwdHJzLCAxKTsKLXwJICBiZmRfY2xvc2UoYWJmZCk7Ci18CX0KLXwKLXwJLi9tYWtlc3ltCi18CW5tIGZvbwotfAkwMDAxMjM0NSBBIGR1bW15X3N5bWJvbAotCi0JTWFueSBmb3JtYXRzIGNhbm5vdCByZXByZXNlbnQgYXJiaXRhcnkgc3ltYm9sIGluZm9ybWF0aW9uOyBmb3IKLSAJaW5zdGFuY2UsIHRoZSA8PGEub3V0Pj4gb2JqZWN0IGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBhbgotCWFyYml0YXJ5IG51bWJlciBvZiBzZWN0aW9ucy4gQSBzeW1ib2wgcG9pbnRpbmcgdG8gYSBzZWN0aW9uCi0Jd2hpY2ggaXMgbm90IG9uZSAgb2YgPDwudGV4dD4+LCA8PC5kYXRhPj4gb3IgPDwuYnNzPj4gY2Fubm90Ci0JYmUgZGVzY3JpYmVkLgotCi1JTk9ERQotTWluaSBTeW1ib2xzLCB0eXBlZGVmIGFzeW1ib2wsIFdyaXRpbmcgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCU1pbmkgU3ltYm9scwotCi0JTWluaSBzeW1ib2xzIHByb3ZpZGUgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgc3ltYm9sIHRhYmxlLgotCVRoZXkgdXNlIGxlc3MgbWVtb3J5IHNwYWNlLCBidXQgcmVxdWlyZSBtb3JlIHRpbWUgdG8gYWNjZXNzLgotCVRoZXkgY2FuIGJlIHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBubSBvciBvYmpkdW1wLCB3aGljaCBtYXkKLQloYXZlIHRvIGhhbmRsZSBzeW1ib2wgdGFibGVzIG9mIGV4dHJlbWVseSBsYXJnZSBleGVjdXRhYmxlcy4KLQotCVRoZSA8PGJmZF9yZWFkX21pbmlzeW1ib2xzPj4gZnVuY3Rpb24gd2lsbCByZWFkIHRoZSBzeW1ib2xzCi0JaW50byBtZW1vcnkgaW4gYW4gaW50ZXJuYWwgZm9ybS4gIEl0IHdpbGwgcmV0dXJuIGEgPDx2b2lkICo+PgotCXBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnksIGEgc3ltYm9sIGNvdW50LCBhbmQgdGhlIHNpemUgb2YKLQllYWNoIHN5bWJvbC4gIFRoZSBwb2ludGVyIGlzIGFsbG9jYXRlZCB1c2luZyA8PG1hbGxvYz4+LCBhbmQKLQlzaG91bGQgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi0KLQlUaGUgZnVuY3Rpb24gPDxiZmRfbWluaXN5bWJvbF90b19zeW1ib2w+PiB3aWxsIHRha2UgYSBwb2ludGVyCi0JdG8gYSBtaW5pc3ltYm9sLCBhbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHJldHVybmVkIGJ5Ci0JPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+PiwgYW5kIHJldHVybiBhIDw8YXN5bWJvbD4+IHN0cnVjdHVyZS4KLQlUaGUgcmV0dXJuIHZhbHVlIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBmcm9tCi0JPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+PiB3aGljaCB3YXMgcGFzc2VkIGluLgotCi0qLwotCi0KLQotLyoKLURPQ0RECi1JTk9ERQotdHlwZWRlZiBhc3ltYm9sLCBzeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zLCBNaW5pIFN5bWJvbHMsIFN5bWJvbHMKLQotKi8KLS8qCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhc3ltYm9sCi0KLQlBbiA8PGFzeW1ib2w+PiBoYXMgdGhlIGZvcm06Ci0KLSovCi0KLS8qCi1DT0RFX0ZSQUdNRU5UCi0KLS4KLS50eXBlZGVmIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkKLS57Ci0uCXsqIEEgcG9pbnRlciB0byB0aGUgQkZEIHdoaWNoIG93bnMgdGhlIHN5bWJvbC4gVGhpcyBpbmZvcm1hdGlvbgotLgkgICBpcyBuZWNlc3Nhcnkgc28gdGhhdCBhIGJhY2sgZW5kIGNhbiB3b3JrIG91dCB3aGF0IGFkZGl0aW9uYWwKLS4gICAJICAgaW5mb3JtYXRpb24gKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpcyBjYXJyaWVkCi0uCSAgIHdpdGggdGhlIHN5bWJvbC4KLS4KLS4JICAgVGhpcyBmaWVsZCBpcyAqYWxtb3N0KiByZWR1bmRhbnQsIHNpbmNlIHlvdSBjYW4gdXNlIHNlY3Rpb24tPm93bmVyCi0uCSAgIGluc3RlYWQsIGV4Y2VwdCB0aGF0IHNvbWUgc3ltYm9scyBwb2ludCB0byB0aGUgZ2xvYmFsIHNlY3Rpb25zCi0uCSAgIGJmZF97YWJzLGNvbSx1bmR9X3NlY3Rpb24uICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IG1ha2luZwotLgkgICB0aGVzZSBnbG9iYWxzIGJlIHBlci1iZmQgKG9yIHBlci10YXJnZXQtZmxhdm9yKS4gIEZJWE1FLiAqfQotLgotLiAgc3RydWN0IF9iZmQgKnRoZV9iZmQ7IHsqIFVzZSBiZmRfYXN5bWJvbF9iZmQoc3ltKSB0byBhY2Nlc3MgdGhpcyBmaWVsZC4gKn0KLS4KLS4JeyogVGhlIHRleHQgb2YgdGhlIHN5bWJvbC4gVGhlIG5hbWUgaXMgbGVmdCBhbG9uZSwgYW5kIG5vdCBjb3BpZWQ7IHRoZQotLgkgICBhcHBsaWNhdGlvbiBtYXkgbm90IGFsdGVyIGl0LiAqfQotLiAgQ09OU1QgY2hhciAqbmFtZTsKLS4KLS4JeyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGlzIHJlYWxseSBzaG91bGQgYmUgYSB1bmlvbiBvZiBhCi0uICAgICAgICAgIG51bWVyaWMgdmFsdWUgd2l0aCBhIHBvaW50ZXIsIHNpbmNlIHNvbWUgZmxhZ3MgaW5kaWNhdGUgdGhhdAotLiAgICAgICAgICBhIHBvaW50ZXIgdG8gYW5vdGhlciBzeW1ib2wgaXMgc3RvcmVkIGhlcmUuICAqfQotLiAgc3ltdmFsdWUgdmFsdWU7Ci0uCi0uCXsqIEF0dHJpYnV0ZXMgb2YgYSBzeW1ib2w6ICp9Ci0uCi0uI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBsb2NhbCBzY29wZTsgPDxzdGF0aWM+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlCi0uIAkgICBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfTE9DQUwJMHgwMQotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGU7IGluaXRpYWxpemVkIGRhdGEgaW4gPDxDPj4uIFRoZQotLgkgICB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfR0xPQkFMCTB4MDIKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlIGFuZCBpcyBleHBvcnRlZC4gVGhlIHZhbHVlIGlzCi0uCSAgIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9FWFBPUlQJQlNGX0dMT0JBTCB7KiBubyByZWFsIGRpZmZlcmVuY2UgKn0KLS4KLS4JeyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgotLgkgICA8PEJTRl9MT0NBTD4+LCA8PEJTRl9GT1JUX0NPTU0+PiwgIDw8QlNGX1VOREVGSU5FRD4+IG9yCi0uCSAgIDw8QlNGX0dMT0JBTD4+ICp9Ci0uCi0uCXsqIFRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgcmVjb3JkLiBUaGUgdmFsdWUgaGFzIGFuIGFyYml0YXJ5Ci0uCSAgIG1lYW5pbmcsIHVubGVzcyBCU0ZfREVCVUdHSU5HX1JFTE9DIGlzIGFsc28gc2V0LiAgKn0KLS4jZGVmaW5lIEJTRl9ERUJVR0dJTkcJMHgwOAotLgotLgl7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotLgkgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKn0KLS4jZGVmaW5lIEJTRl9GVU5DVElPTiAgICAweDEwCi0uCi0uCXsqIFVzZWQgYnkgdGhlIGxpbmtlci4gKn0KLS4jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0uI2RlZmluZSBCU0ZfS0VFUF9HICAgICAgMHg0MAotLgotLgl7KiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotLgkgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKn0KLS4jZGVmaW5lIEJTRl9XRUFLICAgICAgICAweDgwCi0uCi0uICAgICAgIHsqIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotLgkgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKn0KLS4jZGVmaW5lIEJTRl9TRUNUSU9OX1NZTSAweDEwMAotLgotLgl7KiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0uCSAgIGFsbG9jYXRlZC4gKn0KLS4jZGVmaW5lIEJTRl9PTERfQ09NTU9OICAweDIwMAotLgotLgl7KiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICp9Ci0uI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotLgotLgl7KiBJbiBzb21lIGZpbGVzIHRoZSB0eXBlIG9mIGEgc3ltYm9sIHNvbWV0aW1lcyBhbHRlcnMgaXRzCi0uCSAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLS4JICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0uCSAgIGRlY2xhcmVkIGFuZCBub3QgYXQgdGhlIGVuZCBvZiBhIHNlY3Rpb24uICBUaGlzIGJpdCBpcyBzZXQKLS4gIAkgICBieSB0aGUgdGFyZ2V0IEJGRCBwYXJ0IHRvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uLiAqfQotLgotLiNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyB0aGUgbGFiZWwgb2YgY29uc3RydWN0b3Igc2VjdGlvbi4gKn0KLS4jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLS4JICAgd2FybmluZy4gIFRoZSBuYW1lIG9mIHRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4gYWJvdXQ7Ci0uCSAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0uCSAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX1dBUk5JTkcgICAgICAgMHgxMDAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotLgkgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKn0KLS4jZGVmaW5lIEJTRl9JTkRJUkVDVCAgICAgIDB4MjAwMAotLgotLgl7KiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotLgkgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX0ZJTEUgICAgICAgICAgMHg0MDAwCi0uCi0uCXsqIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICp9Ci0uI2RlZmluZSBCU0ZfRFlOQU1JQwkgICAweDgwMDAKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZGF0YSBvYmplY3QuICBVc2VkIGluIEVMRiwgYW5kIHBlcmhhcHMKLS4gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX09CSkVDVAkgICAweDEwMDAwCi0uCi0uICAgICAgIHsqIFRoaXMgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICBCU0ZfREVCVUdHSU5HIHNob3VsZCBiZSBzZXQKLS4gICAgICAgICAgYXMgd2VsbC4gICp9Ci0uI2RlZmluZSBCU0ZfREVCVUdHSU5HX1JFTE9DIDB4MjAwMDAKLS4KLS4gIGZsYWd3b3JkIGZsYWdzOwotLgotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLS4JICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotLiAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKn0KLS4gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0uCi0uCXsqIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICp9Ci0uICB1bmlvbgotLiAgICB7Ci0uICAgICAgUFRSIHA7Ci0uICAgICAgYmZkX3ZtYSBpOwotLiAgICB9IHVkYXRhOwotLgotLn0gYXN5bWJvbDsKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi1zdGF0aWMgY2hhciBjb2ZmX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyoKLURPQ0RECi1JTk9ERQotc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgICwgdHlwZWRlZiBhc3ltYm9sLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JU3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucwotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotCXRvIDw8YXN5bWJvbHM+PiBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgQHZhcnthYmZkfSwKLQlpbmNsdWRpbmcgYSB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluCi0JdGhlIEJGRCwgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgotCi0uI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbAotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBAdmFye3N5bX0gaW4gdGhlIEJGRCBAdmFye2FiZmR9IGlzCi0JYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLgotKi8KLQotYm9vbGVhbgotYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzeW0tPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgc3ltLT5uYW1lKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIGEgc3ltYm9sIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lfSBpbiB0aGUgQkZECi0JQHZhcnthYmZkfSBpcyBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4KLQlmYWxzZS4gIFRoaXMganVzdCBjaGVja3Mgd2hldGhlciB0aGUgbmFtZSBoYXMgdGhlIGZvcm0gb2YgYQotCWxvY2FsIGxhYmVsLgotCi0uI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYgotCi1ERVNDUklQVElPTgotCVJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIEB2YXJ7YWJmZH0sIGFuZCBmaWxscyBpbgotCXRoZSB2ZWN0b3IgQHZhcntsb2NhdGlvbn0gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQKLQlhIHRyYWlsaW5nIE5VTEwuCi0JUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHN5bWJvbCBwb2ludGVycywgbm90Ci0JaW5jbHVkaW5nIHRoZSBOVUxMLgotCi0KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLS4gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotCi0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3ltdGFiCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3N5bXRhYiAoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JQXJyYW5nZSB0aGF0IHdoZW4gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSBpcyBjbG9zZWQsCi0JdGhlIHRhYmxlIEB2YXJ7bG9jYXRpb259IG9mIEB2YXJ7Y291bnR9IHBvaW50ZXJzIHRvIHN5bWJvbHMKLQl3aWxsIGJlIHdyaXR0ZW4uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24sIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotewotICBpZiAoKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB8fCAoYmZkX3JlYWRfcCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSBsb2NhdGlvbjsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCk7Ci0KLURFU0NSSVBUSU9OCi0JUHJpbnQgdGhlIHZhbHVlIGFuZCBmbGFncyBvZiB0aGUgQHZhcntzeW1ib2x9IHN1cHBsaWVkIHRvIHRoZQotCXN0cmVhbSBAdmFye2ZpbGV9LgotKi8KLXZvaWQKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKGFyZywgc3ltYm9sKQotICAgICBQVFIgYXJnOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhcmc7Ci0gIGZsYWd3b3JkIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBpZiAoc3ltYm9sLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICB9Ci0KLSAgLyogVGhpcyBwcmVzdW1lcyB0aGF0IGEgc3ltYm9sIGNhbiBub3QgYmUgYm90aCBCU0ZfREVCVUdHSU5HIGFuZAotICAgICBCU0ZfRFlOQU1JQywgbm9yIG1vcmUgdGhhbiBvbmUgb2YgQlNGX0ZVTkNUSU9OLCBCU0ZfRklMRSwgYW5kCi0gICAgIEJTRl9PQkpFQ1QuICAqLwotICBmcHJpbnRmIChmaWxlLCAiICVjJWMlYyVjJWMlYyVjIiwKLQkgICAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JICAgID8gKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICchJyA6ICdsJwotCSAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotCSAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0NPTlNUUlVDVE9SKSA/ICdDJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9XQVJOSU5HKSA/ICdXJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9JTkRJUkVDVCkgPyAnSScgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfREVCVUdHSU5HKSA/ICdkJyA6ICh0eXBlICYgQlNGX0RZTkFNSUMpID8gJ0QnIDogJyAnLAotCSAgICgodHlwZSAmIEJTRl9GVU5DVElPTikKLQkgICAgPyAnRicKLQkgICAgOiAoKHR5cGUgJiBCU0ZfRklMRSkKLQkgICAgICAgPyAnZicKLQkgICAgICAgOiAoKHR5cGUgJiBCU0ZfT0JKRUNUKSA/ICdPJyA6ICcgJykpKSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sCi0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9Ci0JYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZQotCWluZm9ybWF0aW9uIHN1cnJvdW5kaW5nIHRoZSA8PGFzeW1ib2w+Pi4gQnVpbGRpbmcgeW91ciBvd24KLQk8PGFzeW1ib2w+PiBhbmQgcG9pbnRpbmcgdG8gaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlCi0JaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLgotCi0uI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfSwKLQl0byBiZSB1c2VkIGFzIGEgZGVidWdnaW5nIHN5bWJvbC4gIEZ1cnRoZXIgZGV0YWlscyBvZiBpdHMgdXNlIGhhdmUKLQl5ZXQgdG8gYmUgd29ya2VkIG91dC4KLQotLiNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLSovCi0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgQ09OU1QgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogTWFwIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotICAgVGhpcyB0YWJsZSBpcyBwcm9iYWJseSBpbmNvbXBsZXRlLiAgSXQgaXMgc29ydGVkIGZvciBjb252ZW5pZW5jZSBvZgotICAgYWRkaW5nIGVudHJpZXMuICBTaW5jZSBpdCBpcyBzbyBzaG9ydCwgYSBsaW5lYXIgc2VhcmNoIGlzIHVzZWQuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPQotewotICB7IipERUJVRyoiLCAnTid9LAotICB7Ii5ic3MiLCAnYid9LAotICB7Inplcm92YXJzIiwgJ2InfSwJCS8qIE1SSSAuYnNzICovCi0gIHsiLmRhdGEiLCAnZCd9LAotICB7InZhcnMiLCAnZCd9LAkJLyogTVJJIC5kYXRhICovCi0gIHsiLnJkYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIucm9kYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIuc2JzcyIsICdzJ30sCQkvKiBTbWFsbCBCU1MgKHVuaW5pdGlhbGl6ZWQgZGF0YSkuICAqLwotICB7Ii5zY29tbW9uIiwgJ2MnfSwJCS8qIFNtYWxsIGNvbW1vbi4gICovCi0gIHsiLnNkYXRhIiwgJ2cnfSwJCS8qIFNtYWxsIGluaXRpYWxpemVkIGRhdGEuICAqLwotICB7Ii50ZXh0IiwgJ3QnfSwKLSAgeyJjb2RlIiwgJ3QnfSwJCS8qIE1SSSAudGV4dCAqLwotICB7Ii5kcmVjdHZlIiwgJ2knfSwgICAgICAgICAgICAvKiBNU1ZDJ3MgLmRyZWN0aXZlIHNlY3Rpb24gKi8KLSAgeyIuaWRhdGEiLCAnaSd9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5pZGF0YSAoaW1wb3J0KSBzZWN0aW9uICovCi0gIHsiLmVkYXRhIiwgJ2UnfSwgICAgICAgICAgICAgIC8qIE1TVkMncyAuZWRhdGEgKGV4cG9ydCkgc2VjdGlvbiAqLwotICB7Ii5wZGF0YSIsICdwJ30sICAgICAgICAgICAgICAvKiBNU1ZDJ3MgLnBkYXRhIChzdGFjayB1bndpbmQpIHNlY3Rpb24gKi8KLSAgeyIuZGVidWciLCAnTid9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5kZWJ1ZyAobm9uLXN0YW5kYXJkIGRlYnVnIHN5bXMpICovCi0gIHswLCAwfQotfTsKLQotLyogUmV0dXJuIHRoZSBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KLSAgIHNlY3Rpb24gUywgb3IgJz8nIGZvciBhbiB1bmtub3duIENPRkYgc2VjdGlvbi4gIAotCi0gICBDaGVjayBmb3IgYW55IGxlYWRpbmcgc3RyaW5nIHdoaWNoIG1hdGNoZXMsIHNvIC50ZXh0NSByZXR1cm5zCi0gICAndCcgYXMgd2VsbCBhcyAudGV4dCAqLwotCi1zdGF0aWMgY2hhcgotY29mZl9zZWN0aW9uX3R5cGUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgKnQ7Ci0KLSAgZm9yICh0ID0gJnN0dFswXTsgdC0+c2VjdGlvbjsgdCsrKSAKLSAgICBpZiAoIXN0cm5jbXAgKHMsIHQtPnNlY3Rpb24sIHN0cmxlbiAodC0+c2VjdGlvbikpKQotICAgICAgcmV0dXJuIHQtPnR5cGU7Ci0KLSAgcmV0dXJuICc/JzsKLX0KLQotI2lmbmRlZiBpc2xvd2VyCi0jZGVmaW5lIGlzbG93ZXIoYykgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykKLSNlbmRpZgotI2lmbmRlZiB0b3VwcGVyCi0jZGVmaW5lIHRvdXBwZXIoYykgKGlzbG93ZXIoYykgPyAoKGMpICYgfjB4MjApIDogKGMpKQotI2VuZGlmCi0KLS8qCi1GVU5DVElPTgotCWJmZF9kZWNvZGVfc3ltY2xhc3MKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3ltYm9sCi0JY2xhc3Mgb2YgQHZhcntzeW1ib2x9LCBvciAnPycgZm9yIGFuIHVua25vd24gY2xhc3MuCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9kZWNvZGVfc3ltY2xhc3MoYXN5bWJvbCAqc3ltYm9sKTsKLSovCi1pbnQKLWJmZF9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBjaGFyIGM7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0MnOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0JewotCSAgLyogSWYgd2VhaywgZGV0ZXJtaW5lIGlmIGl0J3Mgc3BlY2lmaWNhbGx5IGFuIG9iamVjdAotCSAgICAgb3Igbm9uLW9iamVjdCB3ZWFrLiAgKi8KLQkgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX09CSkVDVCkKLQkgICAgcmV0dXJuICd2JzsKLQkgIGVsc2UKLQkgICAgcmV0dXJuICd3JzsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuICdVJzsKLSAgICB9Ci0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdJJzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZWFrLCBkZXRlcm1pbmUgaWYgaXQncyBzcGVjaWZpY2FsbHkgYW4gb2JqZWN0Ci0JIG9yIG5vbi1vYmplY3Qgd2Vhay4gICovCi0gICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9PQkpFQ1QpCi0JcmV0dXJuICdWJzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gJ1cnOwotICAgIH0KLSAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gY29mZl9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gJz8nOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgYyA9IHRvdXBwZXIgKGMpOwotICByZXR1cm4gYzsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBqdXN0IHlldCwgYnV0IHdlIHdpbGwgc29vbjoKLSAgICAgTl9TRVRWOiAndic7Ci0gICAgIE5fU0VUQTogJ2wnOwotICAgICBOX1NFVFQ6ICd4JzsKLSAgICAgTl9TRVREOiAneic7Ci0gICAgIE5fU0VUQjogJ3MnOwotICAgICBOX0lORFI6ICdpJzsKLSAgICAgKi8KLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyAKLQotREVTQ1JJUFRJT04KLQlSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBjbGFzcyBzeW1ib2wgcmV0dXJuZWQgYnkKLQliZmRfZGVjb2RlX3N5bWNsYXNzIHJlcHJlc2VudHMgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQlSZXR1cm5zIHplcm8gb3RoZXJ3aXNlLgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyAoaW50IHN5bWNsYXNzKTsKLSovCi0KLWJvb2xlYW4KLWJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgKHN5bWNsYXNzKQotICAgICBpbnQgc3ltY2xhc3M7Ci17Ci0gIHJldHVybiBzeW1jbGFzcyA9PSAnVScgfHwgc3ltY2xhc3MgPT0gJ3cnIHx8IHN5bWNsYXNzID09ICd2JzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3N5bWJvbF9pbmZvCi0KLURFU0NSSVBUSU9OCi0JRmlsbCBpbiB0aGUgYmFzaWMgaW5mbyBhYm91dCBzeW1ib2wgdGhhdCBubSBuZWVkcy4KLQlBZGRpdGlvbmFsIGluZm8gbWF5IGJlIGFkZGVkIGJ5IHRoZSBiYWNrLWVuZHMgYWZ0ZXIKLQljYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc3ltYm9sX2luZm8oYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KTsKLSovCi0KLXZvaWQKLWJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgcmV0LT50eXBlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKLSAgCi0gIGlmIChiZmRfaXNfdW5kZWZpbmVkX3N5bWNsYXNzIChyZXQtPnR5cGUpKQotICAgIHJldC0+dmFsdWUgPSAwOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgCi0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIEB2YXJ7aXN5bX0gaW4gdGhlIEJGRAotCUB2YXJ7aWJmZH0gdG8gdGhlIHN5bWJvbCBAdmFye29zeW19IGluIHRoZSBCRkQgQHZhcntvYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29zZWN9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAotLgkJKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQotCi0qLwotCi0vKiBUaGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIG1pbmkgc3ltYm9scy4KLSAgIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBiYWNrZW5kIGRvZXMgbm90IHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAotICAgdmVyc2lvbi4gIEl0IGp1c3QgdXNlcyBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzIGFzIG1pbmkgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bWNvdW50OwotCi0gIGlmIChkeW5hbWljKQotICAgIHN0b3JhZ2UgPSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgZWxzZQotICAgIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0b3JhZ2UpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChkeW5hbWljKQotICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGVsc2UKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAqbWluaXN5bXNwID0gKFBUUikgc3ltczsKLSAgKnNpemVwID0gc2l6ZW9mIChhc3ltYm9sICopOwotICByZXR1cm4gc3ltY291bnQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoc3ltcyk7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgYSBtaW5pc3ltYm9sIHRvCi0gICBhbiBhc3ltYm9sLiAgV2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHN5bSBhcmd1bWVudCB3ZSBhcmUgcGFzc2VkOwotICAgd2UganVzdCByZXR1cm4gdGhlIGFzeW1ib2wgdGhlIG1pbmlzeW1ib2wgcG9pbnRzIHRvLiAgKi8KLQotLypBUkdTVVNFRCovCi1hc3ltYm9sICoKLV9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBkeW5hbWljIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuICooYXN5bWJvbCAqKikgbWluaXN5bTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiAuc3RhYiBhbmQgLnN0YWJzdHIKLSAgIHNlY3Rpb25zIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlIGFuZCBsaW5lIGNsb3Nlc3QgdG8gYSBkZXNpcmVkCi0gICBsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBieSBDT0ZGIGFuZCBFTEYgdGFyZ2V0cy4gIEl0IHNldHMgKnBmb3VuZAotICAgdG8gdHJ1ZSBpZiBpdCBmaW5kcyBzb21lIGluZm9ybWF0aW9uLiAgVGhlICpwaW5mbyBmaWVsZCBpcyB1c2VkIHRvCi0gICBwYXNzIGNhY2hlZCBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0IG9mIHRoaXMgcm91dGluZTsgdGhpcyBmaXJzdCB0aW1lCi0gICB0aGUgcm91dGluZSBpcyBjYWxsZWQgZm9yIGEgQkZELCAqcGluZm8gc2hvdWxkIGJlIE5VTEwuICBUaGUgdmFsdWUKLSAgIHBsYWNlZCBpbiAqcGluZm8gc2hvdWxkIGJlIHNhdmVkIHdpdGggdGhlIEJGRCwgYW5kIHBhc3NlZCBiYWNrIGVhY2gKLSAgIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICAqLwotCi0vKiBXZSB1c2UgYSBjYWNoZSBieSBkZWZhdWx0LiAgKi8KLQotI2RlZmluZSBFTkFCTEVfQ0FDSElORwotCi0vKiBXZSBrZWVwIGFuIGFycmF5IG9mIGluZGV4ZW50cnkgc3RydWN0dXJlcyB0byByZWNvcmQgd2hlcmUgaW4gdGhlCi0gICBzdGFicyBzZWN0aW9uIHdlIHNob3VsZCBsb29rIHRvIGZpbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEKLSAgIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0KLXN0cnVjdCBpbmRleGVudHJ5Ci17Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSAqc3RhYjsKLSAgYmZkX2J5dGUgKnN0cjsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWU7Ci0gIGNoYXIgKmZpbGVfbmFtZTsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLX07Ci0KLS8qIENvbXBhcmUgdHdvIGluZGV4ZW50cnkgc3RydWN0dXJlcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWNtcGluZGV4ZW50cnkgKGEsIGIpCi0gICAgIGNvbnN0IFBUUiAqYTsKLSAgICAgY29uc3QgUFRSICpiOwotewotICBjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqY29udGVzdGFudEEgPSAoY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKikgYTsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRCID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGI7Ci0KLSAgaWYgKGNvbnRlc3RhbnRBLT52YWwgPCBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoY29udGVzdGFudEEtPnZhbCA+IGNvbnRlc3RhbnRCLT52YWwpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCBpbiAqcGluZm8uICAqLwotCi1zdHJ1Y3Qgc3RhYl9maW5kX2luZm8KLXsKLSAgLyogVGhlIC5zdGFiIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgLyogVGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFiIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RhYnM7Ci0gIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpzdHJzOwotCi0gIC8qIEEgdGFibGUgdGhhdCBpbmRleGVzIHN0YWJzIGJ5IG1lbW9yeSBhZGRyZXNzLiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmluZGV4dGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBpbmRleHRhYmxlLiAgKi8KLSAgaW50IGluZGV4dGFibGVzaXplOwotCi0jaWZkZWYgRU5BQkxFX0NBQ0hJTkcKLSAgLyogQ2FjaGVkIHZhbHVlcyB0byByZXN0YXJ0IHF1aWNrbHkuICAqLwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqY2FjaGVkX2luZGV4ZW50cnk7Ci0gIGJmZF92bWEgY2FjaGVkX29mZnNldDsKLSAgYmZkX2J5dGUgKmNhY2hlZF9zdGFiOwotICBjaGFyICpjYWNoZWRfZmlsZV9uYW1lOwotI2VuZGlmCi0KLSAgLyogU2F2ZWQgcHRyIHRvIG1hbGxvYydlZCBmaWxlbmFtZS4gICovCi0gIGNoYXIgKmZpbGVuYW1lOwotfTsKLQotYm9vbGVhbgotX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwgcGZvdW5kLAotCQkJCSAgICAgcGZpbGVuYW1lLCBwZm5uYW1lLCBwbGluZSwgcGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotICAgICBjb25zdCBjaGFyICoqcGZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICoqcGZubmFtZTsKLSAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKLSAgICAgUFRSICpwaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfZmluZF9pbmZvICppbmZvOwotICBiZmRfc2l6ZV90eXBlIHN0YWJzaXplLCBzdHJzaXplOwotICBiZmRfYnl0ZSAqc3RhYiwgKnN0cjsKLSAgYmZkX2J5dGUgKmxhc3Rfc3RhYiA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgc3Ryb2ZmOwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXhlbnRyeTsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWUsICpmaWxlX25hbWU7Ci0gIGludCBzYXdfZnVuOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgKnBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAqcGZubmFtZSA9IE5VTEw7Ci0gICpwbGluZSA9IDA7Ci0KLSAgLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCi0KLSAgICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aAotICAgICBvZiB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotICBpbmZvID0gKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqKSAqcGluZm87Ci0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX3NpemUsIHJlbG9jX2NvdW50OwotICAgICAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgICAgIGludCBpOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLQotICAgICAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICppbmZvKTsKLSAgICAgIGlmIChpbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogV2hlbiB1c2luZyB0aGUgbGlua2VyIC0tc3BsaXQtYnktZmlsZSBvcgotCSAtLXNwbGl0LWJ5LXJlbG9jIG9wdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgLnN0YWIgYW5kCi0JIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIHNwbGl0LiAgV2Ugc2hvdWxkIGhhbmRsZSB0aGF0LiAgKi8KLQotICAgICAgaW5mby0+c3RhYnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGluZm8tPnN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZXQgKnBpbmZvIHNvIHRoYXQgd2UKLSAgICAgICAgICAgICBjYW4gcmV0dXJuIHF1aWNrbHkgaW4gdGhlIGluZm8gIT0gTlVMTCBjYXNlIGFib3ZlLiAgKi8KLQkgICpwaW5mbyA9IChQVFIpIGluZm87Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0YWJzaXplID0gaW5mby0+c3RhYnNlYy0+X3Jhd19zaXplOwotICAgICAgc3Ryc2l6ZSA9IGluZm8tPnN0cnNlYy0+X3Jhd19zaXplOwotCi0gICAgICBpbmZvLT5zdGFicyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YWJzaXplKTsKLSAgICAgIGluZm8tPnN0cnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJzaXplKTsKLSAgICAgIGlmIChpbmZvLT5zdGFicyA9PSBOVUxMIHx8IGluZm8tPnN0cnMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3RhYnNlYywgaW5mby0+c3RhYnMsIDAsCi0JCQkJICAgICAgc3RhYnNpemUpCi0JICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3Ryc2VjLCBpbmZvLT5zdHJzLCAwLAotCQkJCQkgc3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3ZSBoYXZlIHRvIHJlbG9jYXRlCi0JIHRoZSBlbnRyaWVzIGluIC5zdGFiLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNpbXBsZSAzMiBiaXQKLQkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSwgc28KLQkgdGhpcyBzaG91bGQgYmUgbm8gYmlnIGRlYWwuICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGluZm8tPnN0YWJzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBpbmZvLT5zdGFic2VjLCByZWxvY192ZWN0b3IsCi0JCQkJCSAgICBzeW1ib2xzKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JewotCSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChyZWxvY19jb3VudCA+IDApCi0JewotCSAgYXJlbGVudCAqKnByOwotCi0JICBmb3IgKHByID0gcmVsb2NfdmVjdG9yOyAqcHIgIT0gTlVMTDsgcHIrKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCi0JICAgICAgciA9ICpwcjsKLQkgICAgICBpZiAoci0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5zaXplICE9IDIKLQkJICB8fCByLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotCQkgIHx8IHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgIHx8IHItPmhvd3RvLT5iaXRwb3MgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkJICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICAgIHZhbCAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0JICAgICAgc3ltID0gKnItPnN5bV9wdHJfcHRyOwotCSAgICAgIHZhbCArPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWEgKyByLT5hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JZnJlZSAocmVsb2NfdmVjdG9yKTsKLQotICAgICAgLyogRmlyc3QgdGltZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGJ1aWxkIGEgdGFibGUgbWF0Y2hpbmcKLQkgZnVuY3Rpb24gVk0gYWRkcmVzc2VzIHRvIHN0YWJzLCB0aGVuIHNvcnQgYmFzZWQgb24gc3RhcnRpbmcKLQkgVk0gYWRkcmVzcy4gIERvIHRoaXMgaW4gdHdvIHBhc3Nlczogb25jZSB0byBjb3VudCBob3cgbWFueQotCSB0YWJsZSBlbnRyaWVzIHdlJ2xsIG5lZWQsIGFuZCBhIHNlY29uZCB0byBhY3R1YWxseSBidWlsZCB0aGUKLQkgdGFibGUuICAqLwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IDA7Ci0gICAgICBzYXdfZnVuID0gMTsKLSAgICAgIGZvciAoc3RhYiA9IGluZm8tPnN0YWJzOyBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSBTVEFCU0laRSkKLQl7Ci0JICBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX1NPKQotCSAgICB7Ci0JICAgICAgLyogTl9TTyB3aXRoIG51bGwgbmFtZSBpbmRpY2F0ZXMgRU9GICovCi0JICAgICAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRikgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBpZiB3ZSBkaWQgbm90IHNlZSBhIGZ1bmN0aW9uIGRlZiwgbGVhdmUgc3BhY2UgZm9yIG9uZS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0JICAgICAgc2F3X2Z1biA9IDA7Ci0KLQkgICAgICAvKiB0d28gTl9TTydzIGluIGEgcm93IGlzIGEgZmlsZW5hbWUgYW5kIGRpcmVjdG9yeS4gU2tpcCAqLwotCSAgICAgIGlmIChzdGFiICsgU1RBQlNJWkUgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgJiYgKihzdGFiICsgU1RBQlNJWkUgKyBUWVBFT0ZGKSA9PSBOX1NPKQotCQl7Ci0JCSAgc3RhYiArPSBTVEFCU0laRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdGFiW1RZUEVPRkZdID09IE5fRlVOKQotCSAgICB7Ci0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGUgPSAoKHN0cnVjdCBpbmRleGVudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIChzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KQotCQkJCSAgICAgICogaW5mby0+aW5kZXh0YWJsZXNpemUpKSk7Ci0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIHNhd19mdW4gPSAxOwotCi0gICAgICBmb3IgKGkgPSAwLCBzdHJvZmYgPSAwLCBzdGFiID0gaW5mby0+c3RhYnMsIHN0ciA9IGluZm8tPnN0cnM7Ci0JICAgaSA8IGluZm8tPmluZGV4dGFibGVzaXplICYmIHN0YWIgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotCSAgIHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCSAgICAgIGlmICgoYmZkX3NpemVfdHlwZSkgKChpbmZvLT5zdHJzICsgc3Ryc2l6ZSkgLSBzdHIpIDwgc3Ryb2ZmKQotCQlicmVhazsKLQkgICAgICBzdHIgKz0gc3Ryb2ZmOwotCSAgICAgIHN0cm9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TTzoKLQkgICAgICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotCi0JICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBuZXcgaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JICAgICAgICAgYSBOVUxMIGZ1bmN0aW9uIG5hbWUgaWYgdGhlcmUgd2VyZSBubyBOX0ZVTnMgaW4gYSBmaWxlLgotCSAgICAgICAgIE5vdGUgdGhhdCBhIE5fU08gd2l0aG91dCBhIGZpbGUgbmFtZSBpcyBhbiBFT0YgYW5kCi0JICAgICAgICAgdGhlcmUgY291bGQgYmUgMiBOX1NPIGZvbGxvd2luZyBpdCB3aXRoIHRoZSBuZXcgZmlsZW5hbWUgCi0JICAgICAgICAgYW5kIGRpcmVjdG9yeS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQl7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBsYXN0X3N0YWIgKyBWQUxPRkYpOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkJICArK2k7Ci0JCX0KLQkgICAgICBzYXdfZnVuID0gMDsKLQkgICAgICAKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGlmICgqZmlsZV9uYW1lID09ICdcMCcpCi0JCXsKLQkJICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgZmlsZV9uYW1lID0gTlVMTDsKLQkJICBzYXdfZnVuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxhc3Rfc3RhYiA9IHN0YWI7Ci0JCSAgaWYgKHN0YWIgKyBTVEFCU0laRSA+PSBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgICAgIHx8ICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgIT0gTl9TTykKLQkJICAgIHsKLQkJICAgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogVHdvIGNvbnNlY3V0aXZlIE5fU09zIGFyZSBhIGRpcmVjdG9yeSBhbmQgYQotCQkJIGZpbGUgbmFtZS4gICovCi0JCSAgICAgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCSAgICAgIGRpcmVjdG9yeV9uYW1lID0gZmlsZV9uYW1lOwotCQkgICAgICBmaWxlX25hbWUgPSAoKGNoYXIgKikgc3RyCi0JCQkJICAgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9GVU46Ci0JICAgICAgLyogQSBmdW5jdGlvbiBuYW1lLiAgKi8KLQkgICAgICBzYXdfZnVuID0gMTsKLQkgICAgICBuYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gTlVMTDsKLQotCSAgICAgIGZ1bmN0aW9uX25hbWUgPSBuYW1lOwotCi0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IHN0YWI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IGZ1bmN0aW9uX25hbWU7Ci0JICAgICAgKytpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCXsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotCSAgKytpOwotCX0KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICArK2k7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVzaXplID0gaTsKLSAgICAgIHFzb3J0IChpbmZvLT5pbmRleHRhYmxlLCBpLCBzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KSwgY21waW5kZXhlbnRyeSk7Ci0KLSAgICAgICpwaW5mbyA9IChQVFIpIGluZm87Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBwYXNzZWQgYSBzZWN0aW9uIHJlbGF0aXZlIG9mZnNldC4gIFRoZSBvZmZzZXRzIGluIHRoZQotICAgICBzdGFicyBpbmZvcm1hdGlvbiBhcmUgYWJzb2x1dGUuICAqLwotICBvZmZzZXQgKz0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotICBpZiAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgIT0gTlVMTAotICAgICAgJiYgb2Zmc2V0ID49IGluZm8tPmNhY2hlZF9vZmZzZXQKLSAgICAgICYmIG9mZnNldCA8IChpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSArIDEpLT52YWwpCi0gICAgewotICAgICAgc3RhYiA9IGluZm8tPmNhY2hlZF9zdGFiOwotICAgICAgaW5kZXhlbnRyeSA9IGluZm8tPmNhY2hlZF9pbmRleGVudHJ5OwotICAgICAgZmlsZV9uYW1lID0gaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIC8qIENhY2hlIG5vbi1leGlzdGFudCBvciBpbnZhbGlkLiAgRG8gYmluYXJ5IHNlYXJjaCBvbgotICAgICAgICAgaW5kZXh0YWJsZS4gICovCi0KLSAgICAgIGxvbmcgbG93LCBoaWdoOwotICAgICAgbG9uZyBtaWQgPSAtMTsKLQotICAgICAgaW5kZXhlbnRyeSA9IE5VTEw7Ci0KLSAgICAgIGxvdyA9IDA7Ci0gICAgICBoaWdoID0gaW5mby0+aW5kZXh0YWJsZXNpemUgLSAxOwotICAgICAgd2hpbGUgKGxvdyAhPSBoaWdoKQotCXsKLQkgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0JICBpZiAob2Zmc2V0ID49IGluZm8tPmluZGV4dGFibGVbbWlkXS52YWwKLQkgICAgICAmJiBvZmZzZXQgPCBpbmZvLT5pbmRleHRhYmxlW21pZCArIDFdLnZhbCkKLQkgICAgewotCSAgICAgIGluZGV4ZW50cnkgPSAmaW5mby0+aW5kZXh0YWJsZVttaWRdOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsID4gb2Zmc2V0KQotCSAgICBoaWdoID0gbWlkOwotCSAgZWxzZQotCSAgICBsb3cgPSBtaWQgKyAxOwotCX0KLQotICAgICAgaWYgKGluZGV4ZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgc3RhYiA9IGluZGV4ZW50cnktPnN0YWIgKyBTVEFCU0laRTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZGV4ZW50cnktPmZpbGVfbmFtZTsKLSAgICB9Ci0KLSAgZGlyZWN0b3J5X25hbWUgPSBpbmRleGVudHJ5LT5kaXJlY3RvcnlfbmFtZTsKLSAgc3RyID0gaW5kZXhlbnRyeS0+c3RyOwotCi0gIGZvciAoOyBzdGFiIDwgKGluZGV4ZW50cnkrMSktPnN0YWI7IHN0YWIgKz0gU1RBQlNJWkUpCi0gICAgewotICAgICAgYm9vbGVhbiBkb25lOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCXsKLQljYXNlIE5fU09MOgotCSAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgICpwbGluZSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NMSU5FOgotCWNhc2UgTl9EU0xJTkU6Ci0JY2FzZSBOX0JTTElORToKLQkgIC8qIEEgbGluZSBudW1iZXIuICBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCSAgdmFsID0gaW5kZXhlbnRyeS0+dmFsICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFZBTE9GRik7Ci0JICBpZiAodmFsIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgICpwbGluZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyBERVNDT0ZGKTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0JICAgICAgaW5mby0+Y2FjaGVkX3N0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmNhY2hlZF9vZmZzZXQgPSB2YWw7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSA9IGluZGV4ZW50cnk7Ci0jZW5kaWYKLQkgICAgfQotCSAgaWYgKHZhbCA+IG9mZnNldCkKLQkgICAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgTl9GVU46Ci0JY2FzZSBOX1NPOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb25lKQotCWJyZWFrOwotICAgIH0KLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICBpZiAoZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgICpwZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgZGlybGVuOwotCi0gICAgICBkaXJsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKTsKLSAgICAgIGlmIChpbmZvLT5maWxlbmFtZSA9PSBOVUxMCi0JICB8fCBzdHJuY21wIChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUsIGRpcmxlbikgIT0gMAotCSAgfHwgc3RyY21wIChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQotCSAgICBmcmVlIChpbmZvLT5maWxlbmFtZSk7Ci0JICBpbmZvLT5maWxlbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKGRpcmxlbiArCi0JCQkJCQlzdHJsZW4gKGZpbGVfbmFtZSkKLQkJCQkJCSsgMSk7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUpOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKTsKLQl9Ci0KLSAgICAgICpwZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICAvKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWV0aGluZyBsaWtlIG1haW46RigwLDEpLCBzbyB3ZSB3YW50Ci0gICAgICAgICB0byBjbG9iYmVyIHRoZSBjb2xvbi4gIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBuYW1lLCBzaW5jZSB0aGUKLSAgICAgICAgIHN0cmluZyBpcyBpbiBvdXIgb3duIGxvY2FsIHN0b3JhZ2UgYW55aG93LiAgKi8KLQotICAgICAgcyA9IHN0cmNociAoaW5kZXhlbnRyeS0+ZnVuY3Rpb25fbmFtZSwgJzonKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICAqcGZubmFtZSA9IGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5c2RlcC5oIGIvYmZkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNlYWMwLi4wMDAwMDAwCi0tLSBhL2JmZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBCRkQgbGlicmFyeQotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRF9TWVNERVBfSAotI2RlZmluZSBCRkRfU1lTREVQX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhKGRlZmluZWQoZXJybm8pIHx8IGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0lOQ19FUlJOTykpCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT19SRE9OTFkKLSNkZWZpbmUgT19SRE9OTFkgMAotI2VuZGlmCi0jaWZuZGVmIE9fV1JPTkxZCi0jZGVmaW5lIE9fV1JPTkxZIDEKLSNlbmRpZgotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSIDIKLSNlbmRpZgotI2lmbmRlZiBPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotCi0jaW5jbHVkZSAiZmlsZW5hbWVzLmgiCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLWV4dGVybiBQVFIgcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotI2luY2x1ZGUgPGxpYmludGwuaD4KLS8qIE5vdGUgdGhlIHVzZSBvZiBkZ2V0ZXh0KCkgYW5kIFBBQ0tBR0UgaGVyZSwgcmF0aGVyIHRoYW4gZ2V0dGV4dCgpLgotICAgCi0gICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkgaXMgdXNlZCB0byBidWlsZCBhIGxpYnJhcnkgd2hpY2gKLSAgIHdpbGwgYmUgbGlua2VkIHdpdGggY29kZSBpbiBvdGhlciBkaXJlY3RvcmllcyB0byBmb3JtIHByb2dyYW1zLiAgV2Ugd2FudCB0bwotICAgbWFpbnRhaW4gYSBzZXBlcmF0ZSB0cmFuc2xhdGlvbiBmaWxlIGZvciB0aGlzIGRpcmVjdG9yeSBob3dldmVyLCByYXRoZXIKLSAgIHRoYW4gYmVpbmcgZm9yY2VkIHRvIG1lcmdlIGl0IHdpdGggdGhhdCBvZiBhbnkgcHJvZ3JhbSBsaW5rZWQgdG8gbGliYmZkLgotICAgVGhpcyBpcyBhIGxpYnJhcnksIHNvIGl0IGNhbm5vdCBkZXBlbmQgb24gdGhlIGNhdGFsb2cgY3VycmVudGx5IGxvYWRlZC4KLQotICAgSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGV4dHJhY3QgbWVzc2FnZXMgd2UKLSAgIHVzZSB0aGUgT1BDT0RFUyBkb21haW4gcmF0aGVyIHRoYW4gdGhlIGRvbWFpbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGluY2x1ZGVkCi0gICB0aGUgYmZkIGxpYnJhcnksIChlZyBPQkpEVU1QKS4gIEhlbmNlIHdlIHVzZSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotICAgYW5kIGRlZmluZSBQQUNLQUdFIHRvIGJlICdiZmQnLiAgKFNlZSB0aGUgY29kZSBpbiBjb25maWd1cmUpLiAgKi8KLSNkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jaWZkZWYgZ2V0dGV4dF9ub29wCi0jZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jZWxzZQotI2RlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQotIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC90YXJnZXRzLmMgYi9iZmQvdGFyZ2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIxNTUyLi4wMDAwMDAwCi0tLSBhL2JmZC90YXJnZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY2ICswLDAgQEAKLS8qIEdlbmVyaWMgdGFyZ2V0LWZpbGUtdHlwZSBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJmbm1hdGNoLmgiCi0KLS8qCi1TRUNUSU9OIAotCVRhcmdldHMKLQotREVTQ1JJUFRJT04KLQlFYWNoIHBvcnQgb2YgQkZEIHRvIGEgZGlmZmVyZW50IG1hY2hpbmUgcmVxdXJpZXMgdGhlIGNyZWF0aW9uCi0Jb2YgYSB0YXJnZXQgYmFjayBlbmQuIEFsbCB0aGUgYmFjayBlbmQgcHJvdmlkZXMgdG8gdGhlIHJvb3QKLQlwYXJ0IG9mIEJGRCBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwotCXdoaWNoIHBlcmZvcm0gY2VydGFpbiBsb3cgbGV2ZWwgb3BlcmF0aW9ucyBvbiBmaWxlcy4gQkZECi0JdHJhbnNsYXRlcyB0aGUgYXBwbGljYXRpb25zJ3MgcmVxdWVzdHMgdGhyb3VnaCBhIHBvaW50ZXIgaW50bwotCWNhbGxzIHRvIHRoZSBiYWNrIGVuZCByb3V0aW5lcy4gCi0KLQlXaGVuIGEgZmlsZSBpcyBvcGVuZWQgd2l0aCA8PGJmZF9vcGVucj4+LCBpdHMgZm9ybWF0IGFuZAotCXRhcmdldCBhcmUgdW5rbm93bi4gQkZEIHVzZXMgdmFyaW91cyBtZWNoYW5pc21zIHRvIGRldGVybWluZQotCWhvdyB0byBpbnRlcnByZXQgdGhlIGZpbGUuIFRoZSBvcGVyYXRpb25zIHBlcmZvcm1lZCBhcmU6Ci0KLQlvIENyZWF0ZSBhIEJGRCBieSBjYWxsaW5nIHRoZSBpbnRlcm5hbCByb3V0aW5lCi0JPDxfYmZkX25ld19iZmQ+PiwgdGhlbiBjYWxsIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4gd2l0aCB0aGUKLQl0YXJnZXQgc3RyaW5nIHN1cHBsaWVkIHRvIDw8YmZkX29wZW5yPj4gYW5kIHRoZSBuZXcgQkZEIHBvaW50ZXIuIAotCi0JbyBJZiBhIG51bGwgdGFyZ2V0IHN0cmluZyB3YXMgcHJvdmlkZWQgdG8gPDxiZmRfZmluZF90YXJnZXQ+PiwKLQlsb29rIHVwIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8PEdOVVRBUkdFVD4+IGFuZCB1c2UKLQl0aGF0IGFzIHRoZSB0YXJnZXQgc3RyaW5nLiAKLQotCW8gSWYgdGhlIHRhcmdldCBzdHJpbmcgaXMgc3RpbGwgPDxOVUxMPj4sIG9yIHRoZSB0YXJnZXQgc3RyaW5nIGlzCi0JPDxkZWZhdWx0Pj4sIHRoZW4gdXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSB0YXJnZXQgdmVjdG9yCi0JYXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgc2V0IDw8dGFyZ2V0X2RlZmF1bHRlZD4+IGluIHRoZSBCRkQgdG8KLQljYXVzZSA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzLgotCUB4cmVme2JmZF90YXJnZXR9LiAgQHhyZWZ7Rm9ybWF0c30uCi0KLQlvIE90aGVyd2lzZSwgaW5zcGVjdCB0aGUgZWxlbWVudHMgaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlvbmUgYnkgb25lLCB1bnRpbCBhIG1hdGNoIG9uIHRhcmdldCBuYW1lIGlzIGZvdW5kLiBXaGVuIGZvdW5kLAotCXVzZSBpdC4gCi0KLQlvIE90aGVyd2lzZSByZXR1cm4gdGhlIGVycm9yIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gdG8KLQk8PGJmZF9vcGVucj4+LgotCi0JbyA8PGJmZF9vcGVucj4+IGF0dGVtcHRzIHRvIG9wZW4gdGhlIGZpbGUgdXNpbmcKLQk8PGJmZF9vcGVuX2ZpbGU+PiwgYW5kIHJldHVybnMgdGhlIEJGRC4KLQotCU9uY2UgdGhlIEJGRCBoYXMgYmVlbiBvcGVuZWQgYW5kIHRoZSB0YXJnZXQgc2VsZWN0ZWQsIHRoZSBmaWxlCi0JZm9ybWF0IG1heSBiZSBkZXRlcm1pbmVkLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZwotCTw8YmZkX2NoZWNrX2Zvcm1hdD4+IG9uIHRoZSBCRkQgd2l0aCBhIHN1Z2dlc3RlZCBmb3JtYXQuIAotCUlmIDw8dGFyZ2V0X2RlZmF1bHRlZD4+IGhhcyBiZWVuIHNldCwgZWFjaCBwb3NzaWJsZSB0YXJnZXQKLQl0eXBlIGlzIHRyaWVkIHRvIHNlZSBpZiBpdCByZWNvZ25pemVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgotCTw8YmZkX2NoZWNrX2Zvcm1hdD4+IHJldHVybnMgPDx0cnVlPj4gd2hlbiB0aGUgY2FsbGVyIGd1ZXNzZXMgcmlnaHQuCi1AbWVudQotQCogYmZkX3RhcmdldDo6Ci1AZW5kIG1lbnUKLSovCi0KLQotLyoKLQotSU5PREUKLQliZmRfdGFyZ2V0LCAgLCBUYXJnZXRzLCBUYXJnZXRzCi1ET0NERAotU1VCU0VDVElPTgotCWJmZF90YXJnZXQKLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEKLQl0YXJnZXQuIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCBhbmQgd2hpY2gKLQlyb3V0aW5lcyB0byBjYWxsIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucy4gICAKLQotCUV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlIHdpdGggaXRzIDw8eHZlYz4+Ci0JbWVtYmVyLiAKLQotCVRoZSBtYWNyb3MgYmVsb3cgYXJlIHVzZWQgdG8gZGlzcGF0Y2ggdG8gZnVuY3Rpb25zIHRocm91Z2ggdGhlCi0JPDxiZmRfdGFyZ2V0Pj4gdmVjdG9yLiBUaGV5IGFyZSB1c2VkIGluIGEgbnVtYmVyIG9mIG1hY3JvcyBmdXJ0aGVyCi0JZG93biBpbiBAZmlsZXtiZmQuaH0sIGFuZCBhcmUgYWxzbyB1c2VkIHdoZW4gY2FsbGluZyB2YXJpb3VzCi0Jcm91dGluZXMgYnkgaGFuZCBpbnNpZGUgdGhlIEJGRCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBAdmFye2FyZ2xpc3R9Ci0JYXJndW1lbnQgbXVzdCBiZSBwYXJlbnRoZXNpemVkOyBpdCBjb250YWlucyBhbGwgdGhlIGFyZ3VtZW50cwotCXRvIHRoZSBjYWxsZWQgZnVuY3Rpb24uIAotCi0JVGhleSBtYWtlIHRoZSBkb2N1bWVudGF0aW9uIChtb3JlKSB1bnBsZWFzYW50IHRvIHJlYWQsIHNvIGlmCi0Jc29tZW9uZSB3YW50cyB0byBmaXggdGhpcyBhbmQgbm90IGJyZWFrIHRoZSBhYm92ZSwgcGxlYXNlIGRvLgotCi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORAotLiNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLS4gICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCi0uICAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotLiNlbmRpZgotCi0JRm9yIG9wZXJhdGlvbnMgd2hpY2ggaW5kZXggb24gdGhlIEJGRCBmb3JtYXQ6Ci0KLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICAgICAgICAgICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkKLS4KLS4jaWZkZWYgREVCVUdfQkZEX1NFTkQKLS4jdW5kZWYgQkZEX1NFTkRfRk1UCi0uI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLS4gICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkgOiBcCi0uICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggZGVmaW5lcyB0aGUgdHlwZSBvZiBCRkQgdGhpcyBpcy4gIFRoZQotCTw8eHZlYz4+IG1lbWJlciBvZiB0aGUgc3RydWN0IDw8YmZkPj4gaXRzZWxmIHBvaW50cyBoZXJlLiAgRWFjaAotCW1vZHVsZSB0aGF0IGltcGxlbWVudHMgYWNjZXNzIHRvIGEgZGlmZmVyZW50IHRhcmdldCB1bmRlciBCRkQsCi0JZGVmaW5lcyBvbmUgb2YgdGhlc2UuCi0KLQotCUZJWE1FLCB0aGVzZSBuYW1lcyBzaG91bGQgYmUgcmF0aW9uYWxpc2VkIHdpdGggdGhlIG5hbWVzIG9mCi0JdGhlIGVudHJ5IHBvaW50cyB3aGljaCBjYWxsIHRoZW0uIFRvbyBiYWQgd2UgY2FuJ3QgaGF2ZSBvbmUKLQltYWNybyB0byBkZWZpbmUgdGhlbSBib3RoISAKLQotLmVudW0gYmZkX2ZsYXZvdXIgewotLiAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotLn07Ci0uCi0uZW51bSBiZmRfZW5kaWFuIHsgQkZEX0VORElBTl9CSUcsIEJGRF9FTkRJQU5fTElUVExFLCBCRkRfRU5ESUFOX1VOS05PV04gfTsKLS4KLS57KiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKn0KLS50eXBlZGVmIHN0cnVjdCBiZmRfbGlua19pbmZvIF9iZmRfbGlua19pbmZvOwotLgotLnR5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKLS57Ci0KLUlkZW50aWZpZXMgdGhlIGtpbmQgb2YgdGFyZ2V0LCBlLmcuLCBTdW5PUzQsIFVsdHJpeCwgZXRjLgotCi0uICBjaGFyICpuYW1lOwotCi1UaGUgImZsYXZvdXIiIG9mIGEgYmFjayBlbmQgaXMgYSBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzCi1vZiBhIGZpbGUuCi0KLS4gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLQotVGhlIG9yZGVyIG9mIGJ5dGVzIHdpdGhpbiB0aGUgZGF0YSBhcmVhIG9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZW5kaWFuIGJ5dGVvcmRlcjsKLQotVGhlIG9yZGVyIG9mIGJ5dGVzIHdpdGhpbiB0aGUgaGVhZGVyIHBhcnRzIG9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZW5kaWFuIGhlYWRlcl9ieXRlb3JkZXI7Ci0KLUEgbWFzayBvZiBhbGwgdGhlIGZsYWdzIHdoaWNoIGFuIGV4ZWN1dGFibGUgbWF5IGhhdmUgc2V0IC0KLWZyb20gdGhlIHNldCA8PEJGRF9OT19GTEFHUz4+LCA8PEhBU19SRUxPQz4+LCAuLi48PERfUEFHRUQ+Pi4KLQotLiAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYSBzZWN0aW9uIG1heSBoYXZlIHNldCAtIGZyb20KLXRoZSBzZXQgPDxTRUNfTk9fRkxBR1M+PiwgPDxTRUNfQUxMT0M+PiwgLi4uPDxTRVRfTkVWRVJfTE9BRD4+LgotCi0uICBmbGFnd29yZCBzZWN0aW9uX2ZsYWdzOwotCi1UaGUgY2hhcmFjdGVyIG5vcm1hbGx5IGZvdW5kIGF0IHRoZSBmcm9udCBvZiBhIHN5bWJvbCAKLShpZiBhbnkpLCBwZXJoYXBzIGBfJy4KLQotLiAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOwotCi1UaGUgcGFkIGNoYXJhY3RlciBmb3IgZmlsZSBuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIGNoYXIgYXJfcGFkX2NoYXI7ICAgICAgICAgICAgCi0KLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyLgotCi0uICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKLQotRW50cmllcyBmb3IgYnl0ZSBzd2FwcGluZyBmb3IgZGF0YS4gVGhlc2UgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcgotZW50cnkgcG9pbnRzLCBzaW5jZSB0aGV5IGRvbid0IHRha2UgYSBCRkQgYXN0aGUgZmlyc3QgYXJndW1lbnQuCi1DZXJ0YWluIG90aGVyIGhhbmRsZXJzIGNvdWxkIGRvIHRoZSBzYW1lLgotCi0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLUJ5dGUgc3dhcHBpbmcgZm9yIHRoZSBoZWFkZXJzCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotRm9ybWF0IGRlcGVuZGVudCByb3V0aW5lczogdGhlc2UgYXJlIHZlY3RvcnMgb2YgZW50cnkgcG9pbnRzCi13aXRoaW4gdGhlIHRhcmdldCB2ZWN0b3Igc3RydWN0dXJlLCBvbmUgZm9yIGVhY2ggZm9ybWF0IHRvIGNoZWNrLgotCi1DaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkLiAgUmV0dXJuIGEgPDxiZmRfdGFyZ2V0ICo+PiBvciB6ZXJvLiAKLQotLiAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1Xcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgPDxiZmRfY2xvc2U+Pi4gCi0KLS4gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3dyaXRlX2NvbnRlbnRzW2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVRoZSBnZW5lcmFsIHRhcmdldCB2ZWN0b3IuICBUaGVzZSB2ZWN0b3JzIGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGUKLUJGRF9KVU1QX1RBQkxFIG1hY3Jvcy4KLQotLgotLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLS5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLS5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLS5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uCi0uICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9Ci0uICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0uCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKLS4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9Ci0uICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotLgotLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLS4KLS4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uCi0uICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLS5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLS5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0uICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLS4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLS4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLS4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLS4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLS4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLS5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi0uQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi0uQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLS4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0uI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLS4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLS4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLS4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLS4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLS4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0uICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9Ci0uICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgdm9pZCAqcHRyLAotLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLS4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLS4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLS4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0uICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0uICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLS4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQotLiAgcmVsb2NfaG93dG9fdHlwZSAqCi0uICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi0uQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0uICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0uICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0uICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLS4KLS4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLS4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KLS4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0uICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLS4KLS4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotCi1BIHBvaW50ZXIgdG8gYW4gYWx0ZXJuYXRpdmUgYmZkX3RhcmdldCBpbiBjYXNlIHRoZSBjdXJyZW50IG9uZSBpcyBub3QKLXNhdGlzZmFjdG9yeS4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB0YXJnZXQgY3B1IHN1cHBvcnRzIGJvdGggYmlnCi1hbmQgbGl0dGxlIGVuZGlhbiBjb2RlLCBhbmQgdGFyZ2V0IGNob3NlbiBieSB0aGUgbGlua2VyIGhhcyB0aGUgd3JvbmcKLWVuZGlhbm5lc3MuICBUaGUgZnVuY3Rpb24gb3Blbl9vdXRwdXQoKSBpbiBsZC9sZGxhbmcuYyB1c2VzIHRoaXMgZmllbGQKLXRvIGZpbmQgYW4gYWx0ZXJuYXRpdmUgb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlLgotCi0uIHsqIE9wcG9zaXRlIGVuZGlhbiB2ZXJzaW9uIG9mIHRoaXMgdGFyZ2V0LiAgKn0gIAotLiBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqIGFsdGVybmF0aXZlX3RhcmdldDsKLS4gCi0KLURhdGEgZm9yIHVzZSBieSBiYWNrLWVuZCByb3V0aW5lcywgd2hpY2ggaXNuJ3QgZ2VuZXJpYyBlbm91Z2ggdG8gYmVsb25nCi1pbiB0aGlzIHN0cnVjdHVyZS4KLQotLiBQVFIgYmFja2VuZF9kYXRhOwotLiAKLS59IGJmZF90YXJnZXQ7Ci0KLSovCi0KLS8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgotICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KLSAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQotICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtbmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19iaWdfaG9zdDsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdDsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lZmlfYXBwX2lhMzJfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VmaV9hcHBfaWE2NF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2lhNjRfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9pYTY0X2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYXZyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzNzBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k5NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wal92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcGpsX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtaXBzbHBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1pcHNscGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5ld3NvczNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfaTM4Nl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBubG0zMl9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBubG0zMl9hbHBoYV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBubG0zMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBjNTMybmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBjNTMybWFjaGFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcHBjYm9vdF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCByaXNjaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcG1hY194Y29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCByczYwMDBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHJzNjAwMGNvZmY2NF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGxwZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGxwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsZV9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNwYXJjbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN1bm9zX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljMzBfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWM1NHhfY29mZjBfYmVoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWM1NHhfY29mZjFfYmVoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzU0eF9jb2ZmMl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWM1NHhfY29mZjJfYmVoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzgwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2YXhuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZtc192YXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgd2UzMmtjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHc2NV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB6OGtjb2ZmX3ZlYzsKLQotLyogc3JlYyBpcyBhbHdheXMgaW5jbHVkZWQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYzsKLQotLyogYmluYXJ5IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjOwotCi0vKiBpaGV4IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYzsKLQotLyogQWxsIG9mIHRoZSB4dmVjcyBmb3IgY29yZSBmaWxlcy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocHV4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHBwYWJzZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXRic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHB0cmFjZV9jb3JlX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW10gPSB7Ci0KLSNpZmRlZiBTRUxFQ1RfVkVDUwotCi0JU0VMRUNUX1ZFQ1MsCi0KLSNlbHNlIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0jaWZkZWYgREVGQVVMVF9WRUNUT1IKLQkmREVGQVVMVF9WRUNUT1IsCi0jZW5kaWYKLQkvKiBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0JICAgd2l0aCBvdGhlciB2ZWN0b3IgbGlzdHMgLS0gdGhlIGRlY2xzIGFib3ZlIGFuZAotCSAgIHRoZSBjYXNlIHN0YXRlbWVudCBpbiBjb25maWd1cmUuaW4uCi0JICAgVmVjdG9ycyB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMsIG9yIGFyZW4ndCBmaW5pc2hlZCwKLQkgICBzaG91bGQgaGF2ZSBhbiBlbnRyeSBoZXJlIHdpdGggI2lmIDAgYXJvdW5kIGl0LCB0byBzaG93IHRoYXQKLQkgICBpdCB3YXNuJ3Qgb21pdHRlZCBieSBtaXN0YWtlLiAgKi8KLQkmYTI5a2NvZmZfYmlnX3ZlYywKLQkmYV9vdXRfYWRvYmVfdmVjLAotI2lmIDAJCQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYW91dF9taXBzX2JpZ192ZWMsCi0jZW5kaWYKLQkmYW91dF9taXBzX2xpdHRsZV92ZWMsCi0JJmJfb3V0X3ZlY19iaWdfaG9zdCwKLQkmYl9vdXRfdmVjX2xpdHRsZV9ob3N0LAotCi0JJmJmZF9lZmlfYXBwX2lhMzJfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lZmlfYXBwX2lhNjRfdmVjLAotI2VuZGlmCi0KLQkvKiBUaGlzLCBhbmQgb3RoZXIgdmVjdG9ycywgbWF5IG5vdCBiZSB1c2VkIGluIGFueSAqLm10IGNvbmZpZ3VyYXRpb24uCi0JICAgQnV0IHRoYXQgZG9lcyBub3QgbWVhbiB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4gIElmIGNvbmZpZ3VyZWQgd2l0aAotCSAgIC0tZW5hYmxlLXRhcmdldHM9YWxsLCBvYmpkdW1wIG9yIGdkYiBzaG91bGQgYmUgYWJsZSB0byBleGFtaW5lCi0JICAgdGhlIGZpbGUgZXZlbiBpZiB3ZSBkb24ndCByZWNvZ25pemUgdGhlIG1hY2hpbmUgdHlwZS4gICovCi0JJmJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2FscGhhX3ZlYywKLQkmYmZkX2VsZjY0X2hwcGFfdmVjLAotCSZiZmRfZWxmNjRfaWE2NF9saXR0bGVfdmVjLAotCSZiZmRfZWxmNjRfaWE2NF9iaWdfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9hdnJfdmVjLAotCSZiZmRfZWxmMzJfYmlnYXJjX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9iaWdhcm1fdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYywKLQkmYmZkX2VsZjMyX2JpZ21pcHNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9iaWdtaXBzX3ZlYywKLSNlbmRpZgotCSZiZmRfZWxmMzJfZDEwdl92ZWMsCi0JJmJmZF9lbGYzMl9kMzB2X3ZlYywKLQkmYmZkX2VsZjMyX2hwcGFfdmVjLAotCSZiZmRfZWxmMzJfaTM3MF92ZWMsCi0JJmJmZF9lbGYzMl9pMzg2X3ZlYywKLQkmYmZkX2VsZjMyX2k4NjBfdmVjLAotCSZiZmRfZWxmMzJfaTk2MF92ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9tMzJyX3ZlYywKLQkmYmZkX2VsZjMyX21uMTAyMDBfdmVjLAotCSZiZmRfZWxmMzJfbW4xMDMwMF92ZWMsCi0JJmJmZF9lbGYzMl9tNjhrX3ZlYywKLQkmYmZkX2VsZjMyX204OGtfdmVjLAotCSZiZmRfZWxmMzJfc3BhcmNfdmVjLAotCSZiZmRfZWxmMzJfcGpfdmVjLAotCSZiZmRfZWxmMzJfcGpsX3ZlYywKLQkmYmZkX2VsZjMyX3Bvd2VycGNfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYywKLQkmYmZkX2VsZjMyX3Y4NTBfdmVjLAotCSZiZmRfZWxmMzJfZnIzMF92ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9iaWdfdmVjLAotCSZiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYywKLSNpZmRlZiBCRkQ2NAkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCi0JJmJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMsCi0JJmJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMsCi0jZW5kaWYKLSNpZiAwCi0JJmJmZF9lbGY2NF9zcGFyY192ZWMsCi0jZW5kaWYKLQkvKiBXZSBkb24ndCBpbmNsdWRlIGNpc2NvX2NvcmVfKl92ZWMuICBBbHRob3VnaCBpdCBoYXMgYSBtYWdpYyBudW1iZXIsCi0JICAgdGhlIG1hZ2ljIG51bWJlciBpc24ndCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBhbmQgdGh1cwotCSAgIG1pZ2h0IHNwdXJpb3VzbHkgbWF0Y2ggb3RoZXIga2luZHMgb2YgZmlsZXMuICAqLwotI2lmZGVmIEJGRDY0Ci0JJmRlbW9fNjRfdmVjLAkvKiBPbmx5IGNvbXBpbGVkIGlmIGhvc3QgaGFzIGxvbmctbG9uZyBzdXBwb3J0ICovCi0jZW5kaWYKLQkmZWNvZmZfYmlnX3ZlYywKLQkmZWNvZmZfbGl0dGxlX3ZlYywKLQkmZWNvZmZfYmlnbGl0dGxlX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZlY29mZmFscGhhX2xpdHRsZV92ZWMsCi0jZW5kaWYKLQkmaDgzMDBjb2ZmX3ZlYywKLQkmaDg1MDBjb2ZmX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJmhvc3RfYW91dF92ZWMsCi0jZW5kaWYKLSNpZiAwCQkJCS8qIENsYXNoZXMgd2l0aCBzdW5vc19iaWdfdmVjIG1hZ2ljIG5vLiAgKi8KLQkmaHAzMDBic2RfdmVjLAotI2VuZGlmCi0JJmhwMzAwaHB1eF92ZWMsCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0gICAgICAgICZzb21fdmVjLAotI2VuZGlmCi0JJmkzODZhb3V0X3ZlYywKLQkmaTM4NmJzZF92ZWMsCi0JJmkzODZjb2ZmX3ZlYywKLQkmaTM4NmZyZWVic2RfdmVjLAotCSZpODYwY29mZl92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlX3ZlYywKLQkmYmZkX3Bvd2VycGNsZV9wZV92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlaV92ZWMsCi0JJmJmZF9wb3dlcnBjbGVfcGVpX3ZlYywKLQkmZ28zMmNvZmZfdmVjLAotCSZnbzMyc3R1YmJlZGNvZmZfdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmaTM4NmxpbnV4X3ZlYywKLSNlbmRpZgotCSZpMzg2bHlueF9hb3V0X3ZlYywKLQkmaTM4Nmx5bnhfY29mZl92ZWMsCi0jaWYgMAotCS8qIE5vIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmVzIGZvciBNYWNoIDMgZXhlY3V0YWJsZXMuICAqLwotCSZpMzg2bWFjaDNfdmVjLAotI2VuZGlmCi0JJmkzODZtc2Rvc192ZWMsCi0JJmkzODZuZXRic2RfdmVjLAotCSZpMzg2b3M5a192ZWMsCi0JJmkzODZwZV92ZWMsCi0JJmkzODZwZWlfdmVjLAotCSZhcm1jb2ZmX2xpdHRsZV92ZWMsCi0JJmFybWNvZmZfYmlnX3ZlYywKLQkmYXJtbmV0YnNkX3ZlYywKLQkmYXJtcGVfbGl0dGxlX3ZlYywKLQkmYXJtcGVfYmlnX3ZlYywKLQkmYXJtcGVpX2xpdHRsZV92ZWMsCi0JJmFybXBlaV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZV9saXR0bGVfdmVjLAotCSZhcm1fZXBvY19wZV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYywKLQkmYXJtX2Vwb2NfcGVpX2JpZ192ZWMsCi0JJmljb2ZmX2JpZ192ZWMsCi0JJmljb2ZmX2xpdHRsZV92ZWMsCi0JJmllZWVfdmVjLAotCSZtNjhrY29mZl92ZWMsCi0JJm02OGtjb2ZmdW5fdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmbTY4a2xpbnV4X3ZlYywKLSNlbmRpZgotCSZtNjhrbHlueF9hb3V0X3ZlYywKLQkmbTY4a2x5bnhfY29mZl92ZWMsCi0JJm02OGtuZXRic2RfdmVjLAotCSZtNjhrc3lzdmNvZmZfdmVjLAotCSZtODhrYmNzX3ZlYywKLQkmbTg4a21hY2gzX3ZlYywKLQkmbWNvcmVfcGVfYmlnX3ZlYywKLQkmbWNvcmVfcGVfbGl0dGxlX3ZlYywKLQkmbWNvcmVfcGVpX2JpZ192ZWMsCi0JJm1jb3JlX3BlaV9saXR0bGVfdmVjLAotCSZuZXdzb3MzX3ZlYywKLQkmbmxtMzJfaTM4Nl92ZWMsCi0JJm5sbTMyX3NwYXJjX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZubG0zMl9hbHBoYV92ZWMsCi0jZW5kaWYKLQkmcGM1MzJuZXRic2RfdmVjLAotI2lmIDAKLQkvKiBXZSBoYXZlIG5vIG9hc3lzIHRvb2xzIGFueW1vcmUsIHNvIHdlIGNhbid0IHRlc3QgYW55IG9mIHRoaXMKLQkgICBhbnltb3JlLiBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoZSBzdHVmZiB5b3Vyc2VsZiwgZ28gYWhlYWQuLi4KLQkgICBzdGV2ZUBjeWdudXMuY29tCi0JICAgV29yc2UsIHNpbmNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBmb3IgYXJjaGl2ZXMsIHRoZXJlCi0JICAgY2FuIGJlIGFubm95aW5nIHRhcmdldCBtaXMtbWF0Y2hlcy4gICovCi0JJm9hc3lzX3ZlYywKLSNlbmRpZgotCSZwYzUzMm1hY2hhb3V0X3ZlYywKLSNpZiAwCi0JLyogV2UgaGF2ZSBubyB3YXkgb2YgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgZnJvbSBvdGhlciBhLm91dCB2YXJpYW50cyAqLwotCSZhb3V0X2FybV9iaWdfdmVjLAotCSZhb3V0X2FybV9saXR0bGVfdmVjLAotCSZyaXNjaXhfdmVjLAotI2VuZGlmCi0jaWYgMAotCS8qIFRoaXMgaGFzIHRoZSBzYW1lIG1hZ2ljIG51bWJlciBhcyBSUy82MDAwLiAqLwotCSZwbWFjX3hjb2ZmX3ZlYywKLSNlbmRpZgotCSZyczYwMDBjb2ZmX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZyczYwMDBjb2ZmNjRfdmVjLAotI2VuZGlmCi0JJnBwY2Jvb3RfdmVjLAotCSZzaGNvZmZfdmVjLAotCSZzaGxjb2ZmX3ZlYywKLQkmc2hjb2ZmX3NtYWxsX3ZlYywKLQkmc2hsY29mZl9zbWFsbF92ZWMsCi0JJnNwYXJjbGVfYW91dF92ZWMsCi0JJnNwYXJjbGludXhfdmVjLAotCSZzcGFyY2x5bnhfYW91dF92ZWMsCi0JJnNwYXJjbHlueF9jb2ZmX3ZlYywKLQkmc3BhcmNuZXRic2RfdmVjLAotCSZzdW5vc19iaWdfdmVjLAotCSZhb3V0MF9iaWdfdmVjLAotCSZ0aWMzMF9hb3V0X3ZlYywKLQkmdGljMzBfY29mZl92ZWMsCi0JJnRpYzU0eF9jb2ZmMF92ZWMsCi0JJnRpYzU0eF9jb2ZmMF9iZWhfdmVjLAotCSZ0aWM1NHhfY29mZjFfdmVjLAotCSZ0aWM1NHhfY29mZjFfYmVoX3ZlYywKLQkmdGljNTR4X2NvZmYyX3ZlYywKLQkmdGljNTR4X2NvZmYyX2JlaF92ZWMsCi0JJnRpYzgwY29mZl92ZWMsCi0JJnZheG5ldGJzZF92ZWMsCi0JJnZlcnNhZG9zX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZ2bXNfYWxwaGFfdmVjLAotI2VuZGlmCi0JJnZtc192YXhfdmVjLAotCSZ3ZTMya2NvZmZfdmVjLAotCSZ6OGtjb2ZmX3ZlYywKLQotI2VuZGlmIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0vKiBBbHdheXMgc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4gICovCi0JJnNyZWNfdmVjLAotCSZzeW1ib2xzcmVjX3ZlYywKLS8qIEFuZCB0ZWtoZXggKi8KLQkmdGVraGV4X3ZlYywKLS8qIExpa2V3aXNlIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLQkmYmluYXJ5X3ZlYywKLS8qIExpa2V3aXNlIGZvciBpaGV4LiAgKi8KLQkmaWhleF92ZWMsCi0KLS8qIEFkZCBhbnkgcmVxdWlyZWQgdHJhZGl0aW9uYWwtY29yZS1maWxlLWhhbmRsZXIuICAqLwotCi0jaWZkZWYgQUlYMzg2X0NPUkUKLQkmYWl4Mzg2X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSFBVWF9DT1JFCi0JJmhwdXhfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBIUFBBQlNEX0NPUkUKLQkmaHBwYWJzZF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIElSSVhfQ09SRQotCSZpcml4X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgTkVUQlNEX0NPUkUKLQkmbmV0YnNkX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgT1NGX0NPUkUKLQkmb3NmX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgU0NPNV9DT1JFCi0JJnNjbzVfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZglUUkFEX0NPUkUKLQkmdHJhZF9jb3JlX3ZlYywKLSNlbmRpZgotCi0jaWZkZWYJUFRSQUNFX0NPUkUKLQkmcHRyYWNlX2NvcmVfdmVjLAotI2VuZGlmCi0KLQlOVUxMIC8qIGVuZCBvZiBsaXN0IG1hcmtlciAqLwotfTsKLQotLyogYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGNvbnRhaW5zIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCB2ZWN0b3IsCi0gICBpZiB0aGVyZSBpcyBvbmUsIG9yIHplcm8gaWYgdGhlcmUgaXNuJ3QuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXSA9IHsKLSNpZmRlZiBERUZBVUxUX1ZFQ1RPUgotCSZERUZBVUxUX1ZFQ1RPUiwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLS8qIFdoZW4gdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLCBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgcHV0cyB0aGUKLSAgIG5hbWVzIG9mIHRoZSBtYXRjaGluZyB0YXJnZXRzIGluIGFuIGFycmF5LiAgVGhpcyB2YXJpYWJsZSBpcyB0aGUgbWF4aW11bQotICAgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUgYXJyYXkgY291bGQgcG9zc2libHkgbmVlZC4gICovCi1jb25zdCBzaXplX3QgX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXMgPSBzaXplb2YoYmZkX3RhcmdldF92ZWN0b3IpL3NpemVvZigqYmZkX3RhcmdldF92ZWN0b3IpOwotDAotLyogVGhpcyBhcnJheSBtYXBzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgb250byBCRkQgdmVjdG9ycy4gICovCi0KLXN0cnVjdCB0YXJnbWF0Y2gKLXsKLSAgLyogVGhlIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0gIGNvbnN0IGNoYXIgKnRyaXBsZXQ7Ci0gIC8qIFRoZSBCRkQgdmVjdG9yLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGVuIHRoZSB2ZWN0b3IgaXMgZm91bmQgYnkKLSAgICAgc2VhcmNoaW5nIGZvcndhcmQgZm9yIHRoZSBuZXh0IHN0cnVjdHVyZSB3aXRoIGEgbm9uIE5VTEwgdmVjdG9yCi0gICAgIGZpZWxkLiAgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdmVjdG9yOwotfTsKLQotLyogdGFyZ21hdGNoLmggaXMgYnVpbHQgYnkgTWFrZWZpbGUgb3V0IG9mIGNvbmZpZy5iZmQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggYmZkX3RhcmdldF9tYXRjaFtdID0gewotI2luY2x1ZGUgInRhcmdtYXRjaC5oIgotICB7IE5VTEwsIE5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmZpbmRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBGaW5kIGEgdGFyZ2V0IHZlY3RvciwgZ2l2ZW4gYSBuYW1lIG9yIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWZpbmRfdGFyZ2V0IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKLSAgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCAqbWF0Y2g7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgKCp0YXJnZXQpLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuICp0YXJnZXQ7Ci0KLSAgLyogSWYgd2UgY291bGRuJ3QgbWF0Y2ggb24gdGhlIGV4YWN0IG5hbWUsIHRyeSBtYXRjaGluZyBvbiB0aGUKLSAgICAgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgRklYTUU6IFdlIHNob3VsZCBydW4gdGhlIHRyaXBsZXQgdGhyb3VnaAotICAgICBjb25maWcuc3ViIGZpcnN0LCBidXQgdGhhdCBpcyBoYXJkLiAgKi8KLSAgZm9yIChtYXRjaCA9ICZiZmRfdGFyZ2V0X21hdGNoWzBdOyBtYXRjaC0+dHJpcGxldCAhPSBOVUxMOyBtYXRjaCsrKQotICAgIHsKLSAgICAgIGlmIChmbm1hdGNoIChtYXRjaC0+dHJpcGxldCwgbmFtZSwgMCkgPT0gMCkKLQl7Ci0JICB3aGlsZSAobWF0Y2gtPnZlY3RvciA9PSBOVUxMKQotCSAgICArK21hdGNoOwotCSAgcmV0dXJuIG1hdGNoLT52ZWN0b3I7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2RlZmF1bHRfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChjb25zdCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGRlZmF1bHQgdGFyZ2V0IHZlY3RvciB0byB1c2Ugd2hlbiByZWNvZ25pemluZyBhIEJGRC4KLQlUaGlzIHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIHdoaWNoIG1heSBiZSBhIEJGRCB0YXJnZXQKLQluYW1lIG9yIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBiZmRfZGVmYXVsdF92ZWN0b3JbMF0tPm5hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKG5hbWUpOwotICBpZiAodGFyZ2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9kZWZhdWx0X3ZlY3RvclswXSA9IHRhcmdldDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9maW5kX3RhcmdldAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKmJmZF9maW5kX3RhcmdldChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIHRoZSBvYmplY3QgdGFyZ2V0Ci0JbmFtZWQgQHZhcnt0YXJnZXRfbmFtZX0uICBJZiBAdmFye3RhcmdldF9uYW1lfSBpcyA8PE5VTEw+PiwgY2hvb3NlIHRoZQotCW9uZSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPDxHTlVUQVJHRVQ+PjsgaWYgdGhhdCBpcyBudWxsIG9yIG5vdAotCWRlZmluZWQsIHRoZW4gY2hvb3NlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0IGxpc3QuCi0JUGFzc2luZyBpbiB0aGUgc3RyaW5nICJkZWZhdWx0IiBvciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAotCXZhcmlhYmxlIHRvICJkZWZhdWx0IiB3aWxsIGNhdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0Ci0JbGlzdCB0byBiZSByZXR1cm5lZCwgYW5kICJ0YXJnZXRfZGVmYXVsdGVkIiB3aWxsIGJlIHNldCBpbiB0aGUKLQlCRkQuICBUaGlzIGNhdXNlcyA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIG92ZXIgYWxsIHRoZQotCXRhcmdldHMgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBiZWluZyByZWFkLiAgIAotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZmluZF90YXJnZXQgKHRhcmdldF9uYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICp0YXJnZXRfbmFtZTsKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICp0YXJnbmFtZTsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQotICAgIHRhcmduYW1lID0gdGFyZ2V0X25hbWU7Ci0gIGVsc2UKLSAgICB0YXJnbmFtZSA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotCi0gIC8qIFRoaXMgaXMgc2FmZTsgdGhlIHZlY3RvciBjYW5ub3QgYmUgbnVsbCAqLwotICBpZiAodGFyZ25hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKHRhcmduYW1lLCAiZGVmYXVsdCIpID09IDApCi0gICAgewotICAgICAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7Ci0gICAgICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwpCi0JYWJmZC0+eHZlYyA9IGJmZF9kZWZhdWx0X3ZlY3RvclswXTsKLSAgICAgIGVsc2UKLQlhYmZkLT54dmVjID0gYmZkX3RhcmdldF92ZWN0b3JbMF07Ci0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsKLSAgICB9Ci0KLSAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOwotCi0gIHRhcmdldCA9IGZpbmRfdGFyZ2V0ICh0YXJnbmFtZSk7Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT54dmVjID0gdGFyZ2V0OwotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfdGFyZ2V0X2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX3RhcmdldF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkCi0JdmVjdG9yIG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHZhbGlkIEJGRCB0YXJnZXRzLiBEbyBub3QKLQltb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGg9IDA7Ci0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgJiYgISBkZWZpbmVkIChfX1NURENfXykKLSAgLyogVGhlIG5hdGl2ZSBjb21waWxlciBvbiB0aGUgSFA5MDAwLzcwMCBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIGl0Ci0gICAgIHRvIGxvb3AgZW5kbGVzc2x5IHdoZW4gY29tcGlsaW5nIHRoaXMgZmlsZS4gIFRoaXMgYXZvaWRzIGl0LiAgKi8KLSAgdm9sYXRpbGUKLSNlbmRpZgotICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OwotICBDT05TVCAgY2hhciAqKm5hbWVfbGlzdCwgKipuYW1lX3B0cjsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICB2ZWNfbGVuZ3RoKys7Ci0KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3QgPSAoQ09OU1QgY2hhciAqKikKLSAgICBiZmRfem1hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotCi0gIGlmIChuYW1lX2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICAqKG5hbWVfcHRyKyspID0gKCp0YXJnZXQpLT5uYW1lOwotCi0gIHJldHVybiBuYW1lX2xpc3Q7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZWFjaF9mb3JfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqIGJmZF9zZWFyY2hfZm9yX3RhcmdldCAoaW50ICgqIHNlYXJjaF9mdW5jKShjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKiksIHZvaWQgKik7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdHJhbnNmZXIgdmVjdG9yIGluIHRoZSBsaXN0IG9mCi0JdHJhbnNmZXIgdmVjdG9ycyBtYWludGFpbmVkIGJ5IEJGRCB0aGF0IHByb2R1Y2VzIGEgbm9uLXplcm8KLQlyZXN1bHQgd2hlbiBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIEB2YXJ7c2VhcmNoX2Z1bmN9LiAgVGhlCi0JcGFyYW1ldGVyIEB2YXJ7ZGF0YX0gaXMgcGFzc2VkLCB1bmV4YW1pbmVkLCB0byB0aGUgc2VhcmNoCi0JZnVuY3Rpb24uCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9zZWFyY2hfZm9yX3RhcmdldCAoc2VhcmNoX2Z1bmMsIGRhdGEpCi0gICAgIGludCAoKiBzZWFyY2hfZnVuYykgUEFSQU1TICgoY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldCwgdm9pZCAqIGRhdGEpKTsKLSAgICAgdm9pZCAqIGRhdGE7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqIHRhcmdldDsKLQotICBmb3IgKHRhcmdldCA9IGJmZF90YXJnZXRfdmVjdG9yOyAqIHRhcmdldCAhPSBOVUxMOyB0YXJnZXQgKyspCi0gICAgaWYgKHNlYXJjaF9mdW5jICgqIHRhcmdldCwgZGF0YSkpCi0gICAgICByZXR1cm4gKiB0YXJnZXQ7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvdGFyZ21hdGNoLnNlZCBiL2JmZC90YXJnbWF0Y2guc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQwZTcyLi4wMDAwMDAwCi0tLSBhL2JmZC90YXJnbWF0Y2guc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotMSwvU1RBUlQgT0YgdGFyZ21hdGNoLmgvCWQKLS9FTkQgT0YgdGFyZ21hdGNoLmgvLCQJCWQKLXMvXiNpZi9LRUVQICNpZi8KLXMvXiNlbmRpZi9LRUVQICNlbmRpZi8KLXMvXlsgCV0qIy4qJC8vCi1zL15LRUVQICMvIy8KLXMvWyAJXSpcXCQvLwotdCBsYWIxCi0JOmxhYjEKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKnwveyAiXDEiLCBOVUxMIH0sL2cKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKikveyAiXDEiLC9nCi10IGxhYjIKLXMvXlsgCV0qdGFyZ19kZWZ2ZWM9XChbXiAJXSpcKS8jaWYgIWRlZmluZWQgKFNFTEVDVF9WRUNTKSB8fCBkZWZpbmVkIChIQVZFX1wxKS8KLXQgbGFiMwotcy8uKj0uKi8vCi1zLzs7Ly8KLWIKLQk6bGFiMgotSAotZAotCTpsYWIzCi1HCi1zL1xuLyVFT0wlL2cKLXMvXChkZWZpbmVkIChIQVZFX1wpXChbXildKlwpXCguKlwpL1wxXDJcM1wKLVwmXDIgfSxcCi0jZW5kaWYvCi1zLyVFT0wlL1wKLS9nCi1wCi1zLy4qLy9nCi1zL1xuLy9nCi1oCmRpZmYgLS1naXQgYS9iZmQvdGVraGV4LmMgYi9iZmQvdGVraGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmZlNzUuLjAwMDAwMDAKLS0tIGEvYmZkL3Rla2hleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgRXh0ZW5kZWQgVGVrdHJvbml4IEhleCBGb3JtYXQgIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JVGVrdHJvbml4IEhleCBGb3JtYXQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlUZWsgSGV4IHJlY29yZHMgY2FuIGhvbGQgc3ltYm9scyBhbmQgZGF0YSwgYnV0IG5vdAotCXJlbG9jYXRpb25zLiBUaGVpciBtYWluIGFwcGxpY2F0aW9uIGlzIGNvbW11bmljYXRpb24gd2l0aAotCWRldmljZXMgbGlrZSBQUk9NIHByb2dyYW1tZXJzIGFuZCBJQ0UgZXF1aXBtZW50LgotCQotCUl0IHNlZW1zIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBkZXNjaWJlZCBhcyBiZWluZyByZWFsbHkgYmlnLAotICAgICAgICB0aGUgZXhhbXBsZSBJIGhhdmUgc2F5cyB0aGF0IHRoZSB0ZXh0IHNlY3Rpb24gaXMgMC4uZmZmZmZmZmYuCi0JQkZEIHdvdWxkIGJhcmYgd2l0aCB0aGlzLCBtYW55IGFwcHMgd291bGQgdHJ5IHRvIGFsbG9jIDRHQiB0bwotCXJlYWQgaW4gdGhlIGZpbGUuCi0KLQlUZXggSGV4IG1heSBjb250YWluIG1hbnkgc2VjdGlvbnMsIGJ1dCB0aGUgZGF0YSB3aGljaCBjb21lcyBpbgotCWhhcyBubyB0YWcgc2F5aW5nIHdoaWNoIHNlY3Rpb24gaXQgYmVsb25ncyB0bywgc28gd2UgY3JlYXRlCi0Jb25lIHNlY3Rpb24gZm9yIGVhY2ggYmxvY2sgb2YgZGF0YSwgY2FsbGVkICJibGtubm5uIiB3aGljaCB3ZQotCXN0aWNrIGFsbCB0aGUgZGF0YSBpbnRvLgotCi0JVGVrSGV4IG1heSBjb21lIG91dCBvZiAJb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4KLQlpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQgIHRvIGRpc2NvdmVyIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0JYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlIHRoZSB2bWEgYW5kIHNpemUgb2YgdGhlIHNlY3Rpb25zIHdlCi0JY3JlYXRlLgotCVdlIHJlYWQgaW4gdGhlIGRhdGEgaW50byBwYWdlcyBvZiBDSFVOS19NQVNLKzEgc2l6ZSBhbmQgcmVhZAotCXRoZW0gb3V0IGZyb20gdGhhdCB3aGVuZXZlciB3ZSBuZWVkIHRvLgotCi0JQW55IG51bWJlciBvZiBzZWN0aW9ucyBtYXkgYmUgY3JlYXRlZCBmb3Igb3V0cHV0LCB3ZSBzYXZlIHRoZW0KLQl1cCBhbmQgb3V0cHV0IHRoZW0gd2hlbiBpdCdzIHRpbWUgdG8gY2xvc2UgdGhlIGJmZC4KLQotCi0JQSBUZWtIZXggcmVjb3JkIGxvb2tzIGxpa2U6Ci1FWEFNUExFCi0JJTxibG9jayBsZW5ndGg+PHR5cGU+PGNoZWNrc3VtPjxzdHVmZj48Y3I+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWNvcmQgbm90IGluY2x1ZGluZyB0aGUgJSBzaWduLgotCW8gdHlwZQotCWlzIG9uZSBvZjoKLQkzKSBzeW1ib2wgcmVjb3JkCi0JNikgZGF0YSByZWNvcmQKLQk4KSB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQotVGhlIGRhdGEgY2FuIGNvbWUgb3V0IG9mIG9yZGVyLCBhbmQgbWF5IGJlIGRpc2NvbnRpZ291cy4gVGhpcyBpcyBhCi1zZXJpYWwgcHJvdG9jb2wsIHNvIGJpZyBmaWxlcyBhcmUgdW5saWtlbHksIHNvIHdlIGtlZXAgYSBsaXN0IG9mIDhrIGNodW5rcwotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgYmZkX3ZtYSBsb3c7Ci0gICAgYmZkX3ZtYSBoaWdoOwotICB9IGFkZHJfcmFuZ2VfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QKLSAgewotCi0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICpwcmV2OwotCi0gIH0gdGVraGV4X3N5bWJvbF90eXBlOwotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLXN0YXRpYyBjaGFyIHN1bV9ibG9ja1syNTZdOwotCi0jZGVmaW5lIE5PVF9IRVggMjAKLSNkZWZpbmUgTklCQkxFKHgpIGhleF92YWx1ZSh4KQotI2RlZmluZSBIRVgoYnVmZmVyKSAoKE5JQkJMRSgoYnVmZmVyKVswXSk8PDQpICsgTklCQkxFKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgVE9IRVgoZCx4KSBcCi0oZClbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLShkKVswXSA9IGRpZ3NbKCh4KT4+NCkmMHhmXTsKLSNkZWZpbmUJSVNIRVgoeCkgIGhleF9wKHgpCi0KLXN0YXRpYyB2b2lkIHRla2hleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGdldHZhbHVlIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRla2hleF9wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgdGVraGV4X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHRla2hleF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgb3V0IFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZXN5bSBQQVJBTVMgKChjaGFyICoqLCBDT05TVCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyaXRldmFsdWUgUEFSQU1TICgoY2hhciAqKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9hcmNoX21hY2gKLSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgbW92ZV9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJvb2xlYW4pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0ZWtoZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgdGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgdm9pZCBwYXNzX292ZXIgUEFSQU1TICgoYmZkICosIHZvaWQgKCopKGJmZCosIGludCwgY2hhciAqKSkpOwotc3RhdGljIHZvaWQgZmlyc3RfcGhhc2UgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hKSk7Ci1zdGF0aWMgc3RydWN0IGRhdGFfc3RydWN0ICpmaW5kX2NodW5rIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGdldHN5bSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiopKTsKLQotLyoKLUhlcmUncyBhbiBleGFtcGxlCi0lM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKLSUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCi0lMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAotJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKLSUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCi0lMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAotJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKLSUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCi0lMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCi0lMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKLSUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0Ci0lMDcgOCAxMCAxMAotCi1leHBsYW5hdGlvbjoKLSUzQTZDNjQ4MDAwNEU1NkZGRkM0RTcxNzA2M0IwQUVGRkZDNkQwNjUyQUVGRkZDNjBGMjRFNUU0RTc1Ci0gXiBeXiBeICAgICBeLWRhdGEKLSB8IHx8ICstLS0tLS0gNCBjaGFyIGludGVnZXIgMHg4MDAwCi0gfCB8Ky0tLS0tLS0tIGNoZWNrc3VtCi0gfCArLS0tLS0tLS0tIHR5cGUgNiAoZGF0YSByZWNvcmQpCi0gKy0tLS0tLS0tLS0tIGxlbmd0aCAzYSBjaGFycwotIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDNhICg1OCBjaGFycykgLS0tLS0tLS0tLS0tLS0tLS0tLT4KLQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotICAgICAgXiAgICAgICAgIF5eIF4tIDggY2hhcmFjdGVyIGludGVnZXIgMHhmZmZmZmZmZgotICAgICAgfCAgICAgICAgIHwrLSAgIDEgY2hhcmFjdGVyIGludGVnZXIgMAotICAgICAgfCAgICAgICAgICstLSAgIHR5cGUgMSBzeW1ib2wgKHNlY3Rpb24gZGVmaW5pdGlvbikKLSAgICAgICstLS0tLS0tLS0tLS0gICA5IGNoYXIgc3ltYm9sIFRfU0VHTUVOVAotCi0lMkIzQUI5VF9TRUdNRU5UN0RnY2NfY29tcGlsZWQkMTA4N2hlbGxvJGMxMAotJTM3MzgyOVRfU0VHTUVOVDgwaW50JHQxJHIxJCQyMTQ3NDEwODBjaGFyJHQyJHIyJDAkMTI3MTAKLSUzNzM3NjlUX1NFR01FTlQ4MGxvbmckaW50JHQzJHIxJCQxMDgwdW5zaWduZWQkaW50JHQ0JDEwCi0lMzczQ0E5VF9TRUdNRU5UODBsb25nJHVuc2lnbmVkJGluMTA4MHNob3J0JGludCR0NiRyMSQxMAotJTM3MzA0OVRfU0VHTUVOVDgwbG9uZyRsb25nJGludCR0NzEwODBzaG9ydCR1bnNpZ25lZCRpMTAKLSUzNzNBMjlUX1NFR01FTlQ4MGxvbmckbG9uZyR1bnNpZ24xMDgwc2lnbmVkJGNoYXIkdDEwJDEwCi0lMzczRDY5VF9TRUdNRU5UODB1bnNpZ25lZCRjaGFyJHQxMTA4MGZsb2F0JHQxMiRyMSQ0JDAxMAotJTM3M0QxOVRfU0VHTUVOVDgwZG91YmxlJHQxMyRyMSQ4JDEwODBsb25nJGRvdWJsZSR0MTQkMTAKLSUyNzM0RDlUX1NFR01FTlQ4QnZvaWQkdDE1JDE1MTAzNV9tYWluMTAKLSUyRjNDQTlUX1NFR01FTlQ4MSQxMDgxJDE2ODEkMUU4MSQyMTQ4N21haW4kRjExMAotJTI4MzJGOVRfU0VHTUVOVDgzaSQxOEZGRkZGRkZDODEkMTQ4MSQyMTQKLSUwNzgxMDEwCi0KLVR1cm5zIGludG8KLXNhY0B0aGVwdWIkIC4vb2JqZHVtcCAtZHggLW0gbTY4ayBmCi0KLWY6ICAgICBmaWxlIGZvcm1hdCB0ZWtoZXgKLS0tLS0teC0tLSA5LzU1NzI4IC0xMzQyMTk0MTYgU2VwIDI5IDE1OjEzIDE5OTUgZgotYXJjaGl0ZWN0dXJlOiBVTktOT1dOISwgZmxhZ3MgMHgwMDAwMDAxMDoKLUhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAKLVNFQ1RJT04gMCBbRDAwMDAwMDAwXQk6IHNpemUgMDAwMjAwMDAgdm1hIDAwMDAwMDAwIGFsaWduIDIqKjAKLSBBTExPQywgTE9BRAotU0VDVElPTiAxIFtEMDAwMDgwMDBdCTogc2l6ZSAwMDAwMjAwMSB2bWEgMDAwMDgwMDAgYWxpZ24gMioqMAotCi1TRUNUSU9OIDIgW1RfU0VHTUVOVF0JOiBzaXplIGZmZmZmZmZmIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCi0KLVNZTUJPTCBUQUJMRToKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBnY2NfY29tcGlsZWQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgaGVsbG8kYwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGludCR0MSRyMSQkMjE0NzQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBjaGFyJHQyJHIyJDAkMTI3Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRpbnQkdDMkcjEkJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHVuc2lnbmVkJGludCR0NCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJHVuc2lnbmVkJGluCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkaW50JHQ2JHIxJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyRpbnQkdDcKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaG9ydCR1bnNpZ25lZCRpCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRsb25nJHVuc2lnbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNpZ25lZCRjaGFyJHQxMCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRjaGFyJHQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZmxvYXQkdDEyJHIxJDQkMAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGRvdWJsZSR0MTMkcjEkOCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGRvdWJsZSR0MTQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdm9pZCR0MTUkMTUKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBfbWFpbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBtYWluJEYxCi1mY2ZmZmZmZiAgZyAgICAgICBUX1NFR01FTlQgaSQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtEMDAwMDAwMDBdOiAobm9uZSkKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDA4MDAwXTogKG5vbmUpCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW1RfU0VHTUVOVF06IChub25lKQotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIEQwMDAwMDAwMDoKLS4uLgotMDAwMDgwMDAgKCQrKTdmZjAgbGlua3cgZnAsIy00Ci0wMDAwODAwNCAoJCspN2ZmNCBub3AKLTAwMDA4MDA2ICgkKyk3ZmY2IG1vdmVsICM5OSxkMAotMDAwMDgwMDggKCQrKTdmZjggY21wbCBmcEAoLTQpLGQwCi0wMDAwODAwYyAoJCspN2ZmYyBibHRzIDAwMDA4MDE0ICgkKyk4MDA0Ci0wMDAwODAwZSAoJCspN2ZmZSBhZGRxbCAjMSxmcEAoLTQpCi0wMDAwODAxMiAoJCspODAwMiBicmFzIDAwMDA4MDA2ICgkKyk3ZmY2Ci0wMDAwODAxNCAoJCspODAwNCB1bmxrIGZwCi0wMDAwODAxNiAoJCspODAwNiBydHMKLS4uLgotCi0qLwotCi1zdGF0aWMgdm9pZAotdGVraGV4X2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOwotICBpbnQgdmFsOwotCi0gIGlmIChpbml0ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgaW5pdGVkID0gdHJ1ZTsKLSAgICAgIGhleF9pbml0ICgpOwotICAgICAgdmFsID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpICsgJzAnXSA9IHZhbCsrOwotCX0KLSAgICAgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKLQl9Ci0gICAgICBzdW1fYmxvY2tbJyQnXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWyclJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snLiddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJ18nXSA9IHZhbCsrOwotICAgICAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpXSA9IHZhbCsrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdlIGNhbm5vdCBvdXRwdXQgb3VyIHRla2hleG9yZHMgYXMgd2Ugc2VlIHRoZW0sIHdlIGhhdmUgdG8gZ2x1ZSB0aGVtCi0gICB0b2dldGhlciwgdGhpcyBpcyBkb25lIGluIHRoaXMgc3RydWN0dXJlIDogKi8KLQotc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotCi19OwotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF90eXBlOwotCi0jZGVmaW5lIENIVU5LX01BU0sgMHgxZmZmCi0KLXN0cnVjdCBkYXRhX3N0cnVjdAotICB7Ci0gICAgY2hhciBjaHVua19kYXRhW0NIVU5LX01BU0sgKyAxXTsKLSAgICBjaGFyIGNodW5rX2luaXRbQ0hVTktfTUFTSyArIDFdOwotICAgIGJmZF92bWEgdm1hOwotICAgIHN0cnVjdCBkYXRhX3N0cnVjdCAqbmV4dDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0Ci17Ci0gIHRla2hleF9kYXRhX2xpc3RfdHlwZSAqaGVhZDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqc3ltYm9sczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkYXRhOwotfSB0ZGF0YV90eXBlOwotCi0jZGVmaW5lIGVuZGEoeCkgKHgtPnZtYSArIHgtPnNpemUpCi0KLXN0YXRpYyBiZmRfdm1hCi1nZXR2YWx1ZSAoc3JjcCkKLSAgICAgY2hhciAqKnNyY3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpzcmNwOwotICBiZmRfdm1hIHZhbHVlID0gMDsKLSAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxNjsKLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgIHZhbHVlID0gdmFsdWUgPDwgNCB8IGhleF92YWx1ZSgqc3JjKyspOwotICAgIH0KLSAgKnNyY3AgPSBzcmM7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2V0c3ltIChkc3RwLCBzcmNwKQotICAgICBjaGFyICpkc3RwOwotICAgICBjaGFyICoqc3JjcDsKLXsKLSAgY2hhciAqc3JjID0gKnNyY3A7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGVuID0gaGV4X3ZhbHVlKCpzcmMrKyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE2OwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgZHN0cFtpXSA9IHNyY1tpXTsKLSAgZHN0cFtpXSA9IDA7Ci0gICpzcmNwID0gc3JjICsgaTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqCi1maW5kX2NodW5rIChhYmZkLCB2bWEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2bWE7Ci17Ci0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOwotCi0gIHZtYSAmPSB+Q0hVTktfTUFTSzsKLSAgd2hpbGUgKGQgJiYgKGQtPnZtYSkgIT0gdm1hKQotICAgIHsKLSAgICAgIGQgPSBkLT5uZXh0OwotICAgIH0KLSAgaWYgKCFkKQotICAgIHsKLSAgICAgIGNoYXIgKnNuYW1lID0gYmZkX2FsbG9jIChhYmZkLCAxMik7Ci0KLSAgICAgIC8qIE5vIGNodW5rIGZvciB0aGlzIGFkZHJlc3MsIHNvIG1ha2Ugb25lIHVwICovCi0gICAgICBkID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZGF0YV9zdHJ1Y3QpKTsKLQotICAgICAgaWYgKCFzbmFtZSB8fCAhZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbWVtc2V0IChkLT5jaHVua19pbml0LCAwLCBDSFVOS19NQVNLICsgMSk7Ci0gICAgICBtZW1zZXQgKGQtPmNodW5rX2RhdGEsIDAsIENIVU5LX01BU0sgKyAxKTsKLSAgICAgIGQtPm5leHQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgIGQtPnZtYSA9IHZtYTsKLSAgICAgIGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhID0gZDsKLSAgICB9Ci0gIHJldHVybiBkOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2J5dGUgKGFiZmQsIHZhbHVlLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICAvKiBGaW5kIHRoZSBjaHVuayB0aGF0IHRoaXMgYnl0ZSBuZWVkcyBhbmQgcHV0IGl0IGluICovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGFkZHIpOwotCi0gIGQtPmNodW5rX2RhdGFbYWRkciAmIENIVU5LX01BU0tdID0gdmFsdWU7Ci0gIGQtPmNodW5rX2luaXRbYWRkciAmIENIVU5LX01BU0tdID0gMTsKLX0KLQotLyogVGhlIGZpcnN0IHBhc3MgaXMgdG8gZmluZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBzZWN0aW9ucywgYW5kIHNlZQotICBob3cgYmlnIHRoZSBkYXRhIGlzICovCi1zdGF0aWMgdm9pZAotZmlyc3RfcGhhc2UgKGFiZmQsIHR5cGUsIHNyYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3JjOwotewotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGludCBsZW47Ci0gIGNoYXIgc3ltWzE3XTsJCQkvKiBBIHN5bWJvbCBjYW4gb25seSBiZSAxNmNoYXJzIGxvbmcgKi8KLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJzYnOgotICAgICAgLyogRGF0YSByZWNvcmQgLSByZWFkIGl0IGFuZCBzdG9yZSBpdCAqLwotICAgICAgewotCWJmZF92bWEgYWRkciA9IGdldHZhbHVlICgmc3JjKTsKLQotCXdoaWxlICgqc3JjKQotCSAgewotCSAgICBpbnNlcnRfYnl0ZSAoYWJmZCwgSEVYIChzcmMpLCBhZGRyKTsKLQkgICAgc3JjICs9IDI7Ci0JICAgIGFkZHIrKzsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJzMnOgotICAgICAgLyogU3ltYm9sIHJlY29yZCwgcmVhZCB0aGUgc2VnbWVudCAqLwotICAgICAgbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzeW0pOwotICAgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgY2hhciAqbiA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0KLQkgIGlmICghbikKLQkgICAgYWJvcnQoKTsJCS8qIEZJWE1FICovCi0JICBtZW1jcHkgKG4sIHN5bSwgbGVuICsgMSk7Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbik7Ci0JfQotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgc3dpdGNoICgqc3JjKQotCSAgICB7Ci0JICAgIGNhc2UgJzEnOgkJLyogc2VjdGlvbiByYW5nZSAqLwotCSAgICAgIHNyYysrOwotCSAgICAgIHNlY3Rpb24tPnZtYSA9IGdldHZhbHVlICgmc3JjKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgIGNhc2UgJzgnOgotCSAgICAgIC8qIFN5bWJvbHMsIGFkZCB0byBzZWN0aW9uICovCi0JICAgICAgewotCQl0ZWtoZXhfc3ltYm9sX3R5cGUgKm5ldyA9Ci0JCSh0ZWtoZXhfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgICAgc2l6ZW9mICh0ZWtoZXhfc3ltYm9sX3R5cGUpKTsKLQkJY2hhciB0eXBlID0gKCpzcmMpOwotCi0JCWlmICghbmV3KQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCQlzcmMrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkJYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0JCW5ldy0+cHJldiA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOwotCQlhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9scyA9IG5ldzsKLQkJbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotCQluZXctPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQkJaWYgKCFuZXctPnN5bWJvbC5uYW1lKQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW1lbWNweSAoKGNoYXIgKikgKG5ldy0+c3ltYm9sLm5hbWUpLCBzeW0sIGxlbiArIDEpOwotCQluZXctPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbjsKLQkJaWYgKHR5cGUgPD0gJzQnKQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQkJZWxzZQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCQluZXctPnN5bWJvbC52YWx1ZSA9IGdldHZhbHVlICgmc3JjKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBQYXNzIG92ZXIgYW4gdGVraGV4LCBjYWxsaW5nIG9uZSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIG9uIGVhY2gKLSAgIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXNzX292ZXIgKGFiZmQsIGZ1bmMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOwotewotICB1bnNpZ25lZCBpbnQgY2hhcnNfb25fbGluZTsKLSAgYm9vbGVhbiBlb2YgPSBmYWxzZTsKLQotICAvKiBUbyB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAoZW9mID09IGZhbHNlKQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgLyogRmluZCBmaXJzdCAnJScgKi8KLSAgICAgIGVvZiA9IChib29sZWFuKSAoYmZkX3JlYWQgKHNyYywgMSwgMSwgYWJmZCkgIT0gMSk7Ci0gICAgICB3aGlsZSAoKnNyYyAhPSAnJScgJiYgIWVvZikKLQl7Ci0JICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOwotCX0KLSAgICAgIGlmIChlb2YpCi0JYnJlYWs7Ci0gICAgICBzcmMrKzsKLQotICAgICAgLyogRmV0Y2ggdGhlIHR5cGUgYW5kIHRoZSBsZW5ndGggYW5kIHRoZSBjaGVja3N1bSAqLwotICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIDUsIGFiZmQpICE9IDUpCi0JYWJvcnQgKCk7IC8qIEZJWE1FICovCi0KLSAgICAgIHR5cGUgPSBzcmNbMl07Ci0KLSAgICAgIGlmICghSVNIRVggKHNyY1swXSkgfHwgIUlTSEVYIChzcmNbMV0pKQotCWJyZWFrOwotCi0gICAgICBjaGFyc19vbl9saW5lID0gSEVYIChzcmMpIC0gNTsJLyogQWxyZWFkeSByZWFkIGZpdmUgY2hhciAqLwotCi0gICAgICBpZiAoYmZkX3JlYWQgKHNyYywgMSwgY2hhcnNfb25fbGluZSwgYWJmZCkgIT0gY2hhcnNfb25fbGluZSkKLQlhYm9ydCAoKTsgLyogRklYTUUgKi8KLSAgICAgIHNyY1tjaGFyc19vbl9saW5lXSA9IDA7CS8qIHB1dCBhIG51bGwgYXQgdGhlIGVuZCAqLwotCi0gICAgICBmdW5jIChhYmZkLCB0eXBlLCBzcmMpOwotICAgIH0KLQotfQotCi1zdGF0aWMgbG9uZwotdGVraGV4X2dldF9zeW10YWIgKGFiZmQsIHRhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKip0YWJsZTsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpwID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgdGFibGVbY10gPSAwOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWJsZVstLWNdID0gJihwLT5zeW1ib2wpOwotICAgICAgcCA9IHAtPnByZXY7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotc3RhdGljIGxvbmcKLXRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKHN0cnVjdCB0ZWtoZXhfYXN5bWJvbF9zdHJ1Y3QgKikpOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotCi0gIGlmICghdGRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YSA9IHRkYXRhOwotICB0ZGF0YS0+dHlwZSA9IDE7Ci0gIHRkYXRhLT5oZWFkID0gKHRla2hleF9kYXRhX2xpc3RfdHlwZSAqKSBOVUxMOwotICB0ZGF0YS0+c3ltYm9scyA9IChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKikgTlVMTDsKLSAgdGRhdGEtPmRhdGEgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBsb29rcyBsaWtlIGl0J3MgaW4gVGVrSGV4IGZvcm1hdC4gSnVzdCBsb29rCi0gIGZvciBhIHBlcmNlbnQgc2lnbiBhbmQgc29tZSBoZXggZGlnaXRzICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXRla2hleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJbNF07Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYlswXSAhPSAnJScgfHwgIUlTSEVYIChiWzFdKSB8fCAhSVNIRVggKGJbMl0pIHx8ICFJU0hFWCAoYlszXSkpCi0gICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0KLSAgdGVraGV4X21rb2JqZWN0IChhYmZkKTsKLQotICBwYXNzX292ZXIgKGFiZmQsIGZpcnN0X3BoYXNlKTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgZ2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYm9vbGVhbiBnZXQ7Ci17Ci0gIGJmZF92bWEgYWRkcjsKLSAgY2hhciAqbG9jYXRpb24gPSAoY2hhciAqKSBsb2NhdGlvbnA7Ci0gIGJmZF92bWEgcHJldl9udW1iZXIgPSAxOwkvKiBOb3RoaW5nIGNhbiBoYXZlIHRoaXMgYXMgYSBoaWdoIGJpdCovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLQotICBmb3IgKGFkZHIgPSBzZWN0aW9uLT52bWE7IGNvdW50ICE9IDA7IGNvdW50LS0sIGFkZHIrKykKLSAgICB7Ci0KLSAgICAgIGJmZF92bWEgY2h1bmtfbnVtYmVyID0gYWRkciAmIH5DSFVOS19NQVNLOwkvKiBHZXQgaGlnaCBiaXRzIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJmZF92bWEgbG93X2JpdHMgPSBhZGRyICYgQ0hVTktfTUFTSzsKLQotICAgICAgaWYgKGNodW5rX251bWJlciAhPSBwcmV2X251bWJlcikKLQl7Ci0JICAvKiBEaWZmZXJlbnQgY2h1bmssIHNvIG1vdmUgcG9pbnRlciAqLwotCSAgZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGNodW5rX251bWJlcik7Ci0JfQotCi0gICAgICBpZiAoZ2V0KQotCXsKLQkgIGlmIChkLT5jaHVua19pbml0W2xvd19iaXRzXSkKLQkgICAgewotCSAgICAgICpsb2NhdGlvbiA9IGQtPmNodW5rX2RhdGFbbG93X2JpdHNdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGQtPmNodW5rX2RhdGFbbG93X2JpdHNdID0gKmxvY2F0aW9uOwotCSAgZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10gPSAoKmxvY2F0aW9uICE9IDApOwotCX0KLQotICAgICAgbG9jYXRpb24rKzsKLQotICAgIH0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICBtb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgdHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIHdlIGhhdmUgdG8gc2F2ZSB1cCBhbGwgdGhlIFRla2hleG9yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0LAotICAgICovCi0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlyc3QgdGltZSBhcm91bmQsIGFsbG9jYXRlIGVub3VnaCBzZWN0aW9ucyB0byBob2xkIGFsbCB0aGUgY2h1bmtzICovCi0gICAgICBhc2VjdGlvbiAqcyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQkgICAgewotCSAgICAgIGZvciAodm1hID0gcy0+dm1hICYgfkNIVU5LX01BU0s7Ci0JCSAgIHZtYSA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgdm1hICs9IENIVU5LX01BU0spCi0JCWZpbmRfY2h1bmsgKGFiZmQsIHZtYSk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8sIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGV2YWx1ZSAoZHN0LCB2YWx1ZSkKLSAgICAgY2hhciAqKmRzdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW47Ci0gIGludCBzaGlmdDsKLQotICBmb3IgKGxlbiA9IDgsIHNoaWZ0ID0gMjg7IHNoaWZ0OyBzaGlmdCAtPSA0LCBsZW4tLSkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlID4+IHNoaWZ0KSAmIDB4ZikKLQl7Ci0JICAqcCsrID0gbGVuICsgJzAnOwotCSAgd2hpbGUgKGxlbikKLQkgICAgewotCSAgICAgICpwKysgPSBkaWdzWyh2YWx1ZSA+PiBzaGlmdCkgJiAweGZdOwotCSAgICAgIHNoaWZ0IC09IDQ7Ci0JICAgICAgbGVuLS07Ci0JICAgIH0KLQkgICpkc3QgPSBwOwotCSAgcmV0dXJuOwotCi0JfQotICAgIH0KLSAgKnArKyA9ICcxJzsKLSAgKnArKyA9ICcwJzsKLSAgKmRzdCA9IHA7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZXN5bSAoZHN0LCBzeW0pCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIENPTlNUIGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW4gPSAoc3ltID8gc3RybGVuIChzeW0pIDogMCk7Ci0KLSAgaWYgKGxlbiA+PSAxNikKLSAgICB7Ci0gICAgICAqcCsrID0gJzAnOwotICAgICAgbGVuID0gMTY7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuID09IDApCi0JewotCSAgKnArKyA9ICcxJzsKLQkgIHN5bSA9ICIkIjsKLQkgIGxlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSBkaWdzW2xlbl07Ci0JfQotICAgIH0KLQotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgKnArKyA9ICpzeW0rKzsKLSAgICB9Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotb3V0IChhYmZkLCB0eXBlLCBzdGFydCwgZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdGFydDsKLSAgICAgY2hhciAqZW5kOwotewotICBpbnQgc3VtID0gMDsKLSAgY2hhciAqczsKLSAgY2hhciBmcm9udFs2XTsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICBmcm9udFswXSA9ICclJzsKLSAgVE9IRVggKGZyb250ICsgMSwgZW5kIC0gc3RhcnQgKyA1KTsKLSAgZnJvbnRbM10gPSB0eXBlOwotCi0gIGZvciAocyA9IHN0YXJ0OyBzIDwgZW5kOyBzKyspCi0gICAgewotICAgICAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgKnNdOwotICAgIH0KLQotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFsxXV07CS8qICBsZW5ndGggKi8KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMl1dOwotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFszXV07CS8qIHR5cGUgKi8KLSAgVE9IRVggKGZyb250ICsgNCwgc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoZnJvbnQsIDEsIDYsIGFiZmQpICE9IDYpCi0gICAgYWJvcnQgKCk7Ci0gIGVuZFswXSA9ICdcbic7Ci0gIHdybGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICBpZiAoYmZkX3dyaXRlIChzdGFydCwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYnl0ZXNfd3JpdHRlbjsKLSAgY2hhciBidWZmZXJbMTAwXTsKLSAgYXN5bWJvbCAqKnA7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQ7Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgLyogQW5kIHRoZSByYXcgZGF0YSAqLwotICBmb3IgKGQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgICBkICE9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgICAgICBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgbG93OwotCi0gICAgICBDT05TVCBpbnQgc3BhbiA9IDMyOwotICAgICAgaW50IGFkZHI7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IGluIGJsb2NrcyBvZiAzMiBieXRlcyAqLwotCi0gICAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQ0hVTktfTUFTSyArIDE7IGFkZHIgKz0gc3BhbikKLQl7Ci0JICBpbnQgbmVlZCA9IDA7Ci0KLQkgIC8qIENoZWNrIHRvIHNlZSBpZiBuZWNlc3NhcnkgKi8KLQkgIGZvciAobG93ID0gMDsgIW5lZWQgJiYgbG93IDwgc3BhbjsgbG93KyspCi0JICAgIHsKLQkgICAgICBpZiAoZC0+Y2h1bmtfaW5pdFthZGRyICsgbG93XSkKLQkJbmVlZCA9IDE7Ci0JICAgIH0KLQkgIGlmIChuZWVkKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgYWRkciArIGQtPnZtYSk7Ci0JICAgICAgZm9yIChsb3cgPSAwOyBsb3cgPCBzcGFuOyBsb3crKykKLQkJewotCQkgIFRPSEVYIChkc3QsIGQtPmNodW5rX2RhdGFbYWRkciArIGxvd10pOwotCQkgIGRzdCArPSAyOwotCQl9Ci0JICAgICAgb3V0IChhYmZkLCAnNicsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIHdyaXRlIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPm5hbWUpOwotICAgICAgKmRzdCsrID0gJzEnOwotICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dm1hKTsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBvdXQgKGFiZmQsICczJywgYnVmZmVyLCBkc3QpOwotICAgIH0KLQotICAvKiBBbmQgdGhlIHN5bWJvbHMgKi8KLSAgaWYgKGFiZmQtPm91dHN5bWJvbHMpCi0gICAgewotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9sczsgKnA7IHArKykKLQl7Ci0JICBpbnQgc2VjdGlvbl9jb2RlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoKnApOwotCi0JICBpZiAoc2VjdGlvbl9jb2RlICE9ICc/JykKLQkgICAgewkJCS8qIGRvIG5vdCBpbmNsdWRlIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBhc3ltYm9sICpzID0gKnA7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPnNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgc3dpdGNoIChzZWN0aW9uX2NvZGUpCi0JCXsKLQkJY2FzZSAnQSc6Ci0JCSAgKmRzdCsrID0gJzInOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJICAqZHN0KysgPSAnNic7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdCJzoKLQkJY2FzZSAnTyc6Ci0JCSAgKmRzdCsrID0gJzQnOwotCQkgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ28nOgotCQkgICpkc3QrKyA9ICc4JzsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6Ci0JCSAgKmRzdCsrID0gJzMnOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICAqZHN0KysgPSAnNyc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQljYXNlICdVJzoKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLQkgICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPnZtYSk7Ci0JICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQW5kIHRoZSB0ZXJtaW5hdG9yICovCi0gIGlmIChiZmRfd3JpdGUgKCIlMDc4MTAxMFxuIiwgMSwgOSwgYWJmZCkgIT0gOSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXRla2hleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi10ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQotICAodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0KSk7Ci0KLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuZXctPnByZXYgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiAmKG5ldy0+c3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgfQotfQotCi0jZGVmaW5lCXRla2hleF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdGVraGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSB0ZWtoZXhfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0jZGVmaW5lIHRla2hleF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHRla2hleF9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgdGVraGV4X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHRla2hleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHRla2hleF9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHRla2hleF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB0ZWtoZXhfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSB0ZWtoZXhfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHRla2hleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgdGVraGV4X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHRla2hleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotI2RlZmluZSB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWMgPQotewotICAidGVraGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEVYRUNfUCB8CQkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfU1lNUyB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfUkVMT0MgfCBIQVNfTE9DQUxTIHwKLSAgIFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICB0ZWtoZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICB0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdHJhZC1jb3JlLmMgYi9iZmQvdHJhZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDEyYzAuLjAwMDAwMDAKLS0tIGEvYmZkL3RyYWQtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgdHJhZGl0aW9uYWwgVW5peCBjb3JlIGZpbGVzIChVLWFyZWEgYW5kIHJhdyBzZWN0aW9ucykKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBIQVZFX0RJUkVOVF9ICi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZgotIyBpZmRlZiBIQVZFX1NZU19ESVJfSAotIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgotIyBlbmRpZgotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLQotI2lmZGVmIFRSQURfSEVBREVSCi0jaW5jbHVkZSBUUkFEX0hFQURFUgotI2VuZGlmCi0KLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgICAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICAgICAgc3RydWN0IHVzZXIgdTsKLSAgICB9OwotCi0jZGVmaW5lIGNvcmVfdXBhZ2UoYmZkKSAoJigoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUpKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnJlZ19zZWN0aW9uKQotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICp0cmFkX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICoJCXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50CQl0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgkJdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBIYW5kbGUgNC4yLXN0eWxlIChhbmQgcGVyaGFwcyBhbHNvIHN5c1Ytc3R5bGUpIGNvcmUgZHVtcCBmaWxlLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotdHJhZF91bml4X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHVzZXIgdTsKLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnJhd3B0cjsKLQotI2lmZGVmIFRSQURfQ09SRV9VU0VSX09GRlNFVAotICAvKiBJZiBkZWZpbmVkLCB0aGlzIG1hY3JvIGlzIHRoZSBmaWxlIHBvc2l0aW9uIG9mIHRoZSB1c2VyIHN0cnVjdC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgVFJBRF9DT1JFX1VTRVJfT0ZGU0VULCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIAotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KLSAgaWYgKHUudV9kc2l6ZSA+IDB4MTAwMDAwMCkJLyogUmVtZW1iZXIsIGl0J3MgaW4gcGFnZXMuLi4gKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHUudV9zc2l6ZSA+IDB4MTAwMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IHRoZSBzaXplIGNsYWltZWQgaXMgbm8gZ3JlYXRlciB0aGFuIHRoZSBmaWxlIHNpemUuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLSAgICBpZiAoZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGlmICgodW5zaWduZWQgbG9uZykgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0JCQkJIC0gdS51X3RzaXplCi0jZW5kaWYKLQkJCQkgKyB1LnVfc3NpemUpKQotCT4gKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSNpZm5kZWYgVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFCi0gICAgaWYgKCh1bnNpZ25lZCBsb25nKSAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpCi0jaWZkZWYgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAotCS8qIFNvbWUgc3lzdGVtcyB3cml0ZSB0aGUgZmlsZSB0b28gYmlnLiAgKi8KLQkJCSArIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQKLSNlbmRpZgotCQkJICkKLQk8ICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JLyogVGhlIGZpbGUgaXMgdG9vIGJpZy4gIE1heWJlIGl0J3Mgbm90IGEgY29yZSBmaWxlCi0JICAgb3Igd2Ugb3RoZXJ3aXNlIGhhdmUgYmFkIHZhbHVlcyBmb3IgdV9kc2l6ZSBhbmQgdV9zc2l6ZSkuICAqLwotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotI2VuZGlmCi0gIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KLSAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLwotICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKLQkJYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOQlBHICogdS51X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiBVUEFHRVM7IC8qIExhcmdlciB0aGFuIHNpemVvZiBzdHJ1Y3QgdSAqLwotCi0gIC8qIFdoYXQgYSBoYWNrLi4uIHdlJ2QgbGlrZSB0byBzdGVhbCBpdCBmcm9tIHRoZSBleGVjIGZpbGUsCi0gICAgIHNpbmNlIHRoZSB1cGFnZSBkb2VzIG5vdCBzZWVtIHRvIHByb3ZpZGUgaXQuICBGSVhNRS4gICovCi0jaWZkZWYgSE9TVF9EQVRBX1NUQVJUX0FERFIKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gSE9TVF9EQVRBX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1RFWFRfU1RBUlRfQUREUiArIChOQlBHICogdS51X3RzaXplKTsKLSNlbmRpZgotCi0jaWZkZWYgSE9TVF9TVEFDS19TVEFSVF9BRERSCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gSE9TVF9TVEFDS19FTkRfQUREUiAtIChOQlBHICogdS51X3NzaXplKTsKLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtIHRoZSBlbnRpcmUKLSAgICAgdXBhZ2UgYW5kIHN0YWNrLiAgdS51X2FyMCBwb2ludHMgdG8gd2hlcmUgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4KLSAgICAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLCB0aG91Z2guICBPbmUgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKLSAgICAgcmVnaXN0ZXJzIG1pZ2h0IGJlIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzCi0gICAgIGZyb20gKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlIGFkZHJlc3MKLSAgICAgaW4ga2VybmVsIG1lbW9yeSwgYW5kIG9uIG90aGVyIHN5c3RlbXMgaXQgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLSAgICAgCi0gICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFjdHVhbGx5IGFyZSwKLSAgICAgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4gIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAKLSAgICAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbiB1cCBzbyB0aGF0IGl0cyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCi0gICAgIDAgaXMgYXQgdGhlIHBsYWNlIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlIHJlZ3MsCi0gICAgIHVzaW5nIG1pbm9yIHRyaWNrZXJ5IHRvIGdldCBhcm91bmQgdGhlIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gLSAoYmZkX3ZtYSkgdS51X2FyMDsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTkJQRyAqIFVQQUdFUzsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoTkJQRyAqIFVQQUdFUykgKyBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyB0aGUgdXBhZ2UgKi8KLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi10cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmbmRlZiBOT19DT1JFX0NPTU1BTkQKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0gIHJldHVybiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGlnbm9yZV9hYmZkKTsKLSNlbHNlCi0gIHJldHVybiAtMTsJCS8qIEZJWE1FLCB3aGVyZSBpcyBpdD8gKi8KLSNlbmRpZgotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmV4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgdHJhZF91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodHJhZF91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC92YXhuZXRic2QuYyBiL2JmZC92YXhuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzN2QwOS4uMDAwMDAwMAotLS0gYS9iZmQvdmF4bmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9WQVggYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxMDI0Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX3ZheAotI2RlZmluZQlERUZBVUxUX01JRCAJTV9WQVhfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVCh2YXhuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtdmF4LW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3ZlcnNhZG9zLmMgYi9iZmQvdmVyc2Fkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlYmRhNC4uMDAwMDAwMAotLS0gYS9iZmQvdmVyc2Fkb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFZFUlNBZG9zLUUgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KLQotICAgVmVyc2Fkb3MgaXMgYSBNb3Rvcm9sYSB0cmFkZW1hcmsuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFNVQlNFQ1RJT04KLSAgIFZFUlNBZG9zLUUgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlIGZvcm1hdAotCi0gICBERVNDUklQVElPTgotCi0gICBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZWFkaW5nIG9mIFZFUlNBZG9zIHJlbG9jYXRlYWJsZQotICAgb2JqZWN0IGZpbGVzLgotCi0gICBBIFZFUlNBZG9zIGZpbGUgbG9va3MgbGlrZSBjb250YWlucwotCi0gICBvIEluZGVudGlmaWNhdGlvbiBSZWNvcmQKLSAgIG8gRXh0ZXJuYWwgU3ltYm9sIERlZmluaXRpb24gUmVjb3JkCi0gICBvIE9iamVjdCBUZXh0IFJlY3JvZAotICAgbyBFbmQgUmVjb3JkCi0KLQotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotCi1zdGF0aWMgYm9vbGVhbiB2ZXJzYWRvc19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdmVyc2Fkb3Nfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnZlcnNhZG9zX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotI2RlZmluZSBWSEVBREVSICcxJwotI2RlZmluZSBWRVNUREVGICcyJwotI2RlZmluZSBWT1RSICczJwotI2RlZmluZSBWRU5EICc0JwotCi0KLSNkZWZpbmUgRVNfQkFTRSAxNwkJLyogZmlyc3Qgc3ltYm9sIGhhcyBlc2RpZCAxNyAqLwotCi0vKiBQZXIgZmlsZSB0YXJnZXQgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0KLS8qIG9uZSBmb3IgZWFjaCBzZWN0aW9uICovCi1zdHJ1Y3QgZXNkaWQKLSAgewotICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogcHRyIHRvIGJmZCB2ZXJzaW9uICovCi0gICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7CS8qIHVzZWQgdG8gYnVpbGQgaW1hZ2UgKi8KLSAgICBpbnQgcGM7Ci0gICAgaW50IHJlbG9jczsJCQkvKiByZWxvYyBjb3VudCwgdmFsaWQgZW5kIG9mIHBhc3MgMSAqLwotICAgIGludCBkb25lcmVsOwkJLyogaGF2ZSByZWxvY3MgYmVlbiB0cmFuc2xhdGVkICovCi0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBpbnQgZXNfZG9uZTsJCS8qIGNvdW50IG9mIHN5bWJvbCBpbmRleCwgc3RhcnRzIGF0IEVTX0JBU0UgKi8KLSAgICBhc3ltYm9sICpzeW1ib2xzOwkJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2xzICovCi0gICAgY2hhciAqc3RyaW5nczsJCS8qIHN0cmluZ3Mgb2YgYWxsIHRoZSBhYm92ZSAqLwotICAgIGludCBzdHJpbmdsZW47CQkvKiBsZW4gb2Ygc3RyaW5nIHRhYmxlICh2YWxpZCBlbmQgb2YgcGFzczEpICovCi0gICAgaW50IG5zZWNzeW1zOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zICovCi0KLSAgICBpbnQgbmRlZnM7CQkJLyogbnVtYmVyIG9mIGV4cG9ydGVkIHN5bWJvbHMgKHRoZXkgZG9udCBnZXQgZXNkaWRzKSAqLwotICAgIGludCBucmVmczsJCQkvKiBudW1iZXIgb2YgaW1wb3J0ZWQgc3ltYm9scyAgKHZhbGlkIGVuZCBvZiBwYXNzMSkgKi8KLQotICAgIGludCByZWZfaWR4OwkJLyogY3VycmVudCBwcm9jZXNzZWQgdmFsdWUgb2YgdGhlIGFib3ZlICovCi0gICAgaW50IGRlZl9pZHg7Ci0KLSAgICBpbnQgcGFzc18yX2RvbmU7Ci0KLSAgICBzdHJ1Y3QgZXNkaWQgZVsxNl07CQkvKiBwZXIgc2VjdGlvbiBpbmZvICovCi0gICAgaW50IGFsZXJ0OwkJCS8qIHRvIHNlZSBpZiB3ZSdyZSB0cmFtcGxpbmcgKi8KLSAgICBhc3ltYm9sICpyZXN0WzI1NiAtIDE2XTsJLyogcGVyIHN5bWJvbCBpbmZvICovCi0KLSAgfQotdGRhdGFfdHlwZTsKLQotI2RlZmluZSBWREFUQShhYmZkKSAgICAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSkKLSNkZWZpbmUgRURBVEEoYWJmZCwgbikgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEtPmVbbl0pCi0jZGVmaW5lIFJEQVRBKGFiZmQsIG4pICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhLT5yZXN0W25dKQotCi1zdHJ1Y3QgZXh0X290cgotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsKLSAgICB1bnNpZ25lZCBjaGFyIG1hcFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVzZGlkOwotICAgIHVuc2lnbmVkIGNoYXIgZGF0YVsyMDBdOwotICB9OwotCi1zdHJ1Y3QgZXh0X3ZoZWFkZXIKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7CQkJLyogcmVjb3JkIHR5cGUgKi8KLSAgICBjaGFyIG5hbWVbMTBdOwkJLyogbW9kdWxlIG5hbWUgKi8KLSAgICBjaGFyIHJldjsJCQkvKiBtb2R1bGUgcmV2IG51bWJlciAqLwotICAgIGNoYXIgbGFuZzsKLSAgICBjaGFyIHZvbFs0XTsKLSAgICBjaGFyIHVzZXJbMl07Ci0gICAgY2hhciBjYXRbOF07Ci0gICAgY2hhciBmbmFtZVs4XTsKLSAgICBjaGFyIGV4dFsyXTsKLSAgICBjaGFyIHRpbWVbM107Ci0gICAgY2hhciBkYXRlWzNdOwotICAgIGNoYXIgcmVzdFsyMTFdOwotICB9OwotCi1zdHJ1Y3QgZXh0X2VzZAotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsKLSAgICB1bnNpZ25lZCBjaGFyIGVzZF9lbnRyaWVzWzFdOwotICB9OwotI2RlZmluZSBFU0RfQUJTIAkwCi0jZGVmaW5lIEVTRF9DT01NT04gCTEKLSNkZWZpbmUgRVNEX1NURF9SRUxfU0VDIDIKLSNkZWZpbmUgRVNEX1NIUlRfUkVMX1NFQyAzCi0jZGVmaW5lIEVTRF9YREVGX0lOX1NFQyA0Ci0jZGVmaW5lIEVTRF9YUkVGX1NZTSAgICA3Ci0jZGVmaW5lIEVTRF9YUkVGX1NFQwk2Ci0jZGVmaW5lIEVTRF9YREVGX0lOX0FCUyA1Ci11bmlvbiBleHRfYW55Ci0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgc3RydWN0IGV4dF92aGVhZGVyIGhlYWRlcjsKLSAgICBzdHJ1Y3QgZXh0X2VzZCBlc2Q7Ci0gICAgc3RydWN0IGV4dF9vdHIgb3RyOwotICB9OwotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLwotCi0KLQotCi0KLS8qIFNldCB1cCB0aGUgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICBWREFUQSAoYWJmZCktPmFsZXJ0ID0gMHgxMjM0NTY3ODsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAotICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZwotICAgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbmFtZSwgdmFsLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHNudW07Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBhc3ltYm9sICpuID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzICsgc251bTsKLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPnZhbHVlID0gdmFsOwotICBuLT5zZWN0aW9uID0gc2VjOwotICBuLT50aGVfYmZkID0gYWJmZDsKLSAgbi0+ZmxhZ3MgPSAwOwotICByZXR1cm4gbjsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfcmVjb3JkIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5pb24gZXh0X2FueSAqcHRyOwotewotICBiZmRfcmVhZCAoJnB0ci0+c2l6ZSwgMSwgMSwgYWJmZCk7Ci0gIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgcHRyICsgMSwgMSwgcHRyLT5zaXplLCBhYmZkKSAhPSBwdHItPnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF80IChwcCkKLSAgICAgdW5zaWduZWQgY2hhciAqKnBwOwotewotICB1bnNpZ25lZCBjaGFyICpwID0gKnBwOwotICAqcHAgKz0gNDsKLSAgcmV0dXJuIChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10gPDwgMCk7Ci19Ci0KLXZvaWQKLWdldF8xMCAocHAsIG5hbWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKipwcDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqcCA9IChjaGFyICopICpwcDsKLSAgaW50IGxlbiA9IDEwOwotICAqcHAgKz0gbGVuOwotICB3aGlsZSAoKnAgIT0gJyAnCi0JICYmIGxlbikKLSAgICB7Ci0gICAgICAqbmFtZSsrID0gKnArKzsKLSAgICAgIGxlbi0tOwotICAgIH0KLSAgKm5hbWUgPSAwOwotfQotCi1zdGF0aWMgY2hhciAqCi1uZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpuID0gVkRBVEEgKGFiZmQpLT5zdHJpbmdzOwotICBzdHJjcHkgKFZEQVRBIChhYmZkKS0+c3RyaW5ncywgbmFtZSk7Ci0gIFZEQVRBIChhYmZkKS0+c3RyaW5ncyArPSBzdHJsZW4gKFZEQVRBIChhYmZkKS0+c3RyaW5ncykgKyAxOwotICByZXR1cm4gbjsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19lc2QgKGFiZmQsIGVzZCwgcGFzcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0X2VzZCAqZXNkOwotICAgICBpbnQgcGFzczsKLXsKLSAgLyogUmVhZCB0aHJvdWdoIHRoZSBleHQgZGVmIGZvciB0aGUgZXN0IGVudHJpZXMgKi8KLSAgaW50IHRvZ28gPSBlc2QtPnNpemUgLSAyOwotICBiZmRfdm1hIHNpemU7Ci0gIGJmZF92bWEgc3RhcnQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGNoYXIgbmFtZVsxMV07Ci0gIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGVzZC0+ZXNkX2VudHJpZXM7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuZCA9IHB0ciArIHRvZ287Ci0gIHdoaWxlIChwdHIgPCBlbmQpCi0gICAgewotICAgICAgaW50IHNjbiA9ICpwdHIgJiAweGY7Ci0gICAgICBpbnQgdHlwID0gKCpwdHIgPj4gNCkgJiAweGY7Ci0KLSAgICAgIC8qIERlY2xhcmUgdGhpcyBzZWN0aW9uICovCi0gICAgICBzcHJpbnRmIChuYW1lLCAiJWQiLCBzY24pOwotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBzdHJkdXAgKG5hbWUpKTsKLSAgICAgIHNlYy0+dGFyZ2V0X2luZGV4ID0gc2NuOwotICAgICAgRURBVEEgKGFiZmQsIHNjbikuc2VjdGlvbiA9IHNlYzsKLSAgICAgIHB0cisrOwotICAgICAgc3dpdGNoICh0eXApCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIEVTRF9YUkVGX1NFQzoKLQljYXNlIEVTRF9YUkVGX1NZTToKLQkgIHsKLQkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPnJlZl9pZHgrKzsKLQkgICAgZ2V0XzEwICgmcHRyLCBuYW1lKTsKLQkgICAgaWYgKHBhc3MgPT0gMSkKLQkgICAgICB7Ci0JCVZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAobmFtZSkgKyAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IGVzaWR4OwotCQlhc3ltYm9sICpzOwotCQljaGFyICpuID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpOwotCQlzID0gdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbiwgMCwKLQkJCQkJICZiZmRfdW5kX3NlY3Rpb24sIHNjbik7Ci0JCWVzaWR4ID0gVkRBVEEgKGFiZmQpLT5lc19kb25lKys7Ci0JCVJEQVRBIChhYmZkLCBlc2lkeCAtIEVTX0JBU0UpID0gczsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCi0JY2FzZSBFU0RfQUJTOgotCSAgc2l6ZSA9IGdldF80ICgmcHRyKTsKLQkgIHN0YXJ0ID0gZ2V0XzQgKCZwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBFU0RfU1REX1JFTF9TRUM6Ci0JY2FzZSBFU0RfU0hSVF9SRUxfU0VDOgotCSAgewotCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGdldF80ICgmcHRyKTsKLQkgICAgc2VjLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIEVTRF9YREVGX0lOX0FCUzoKLQkgIHNlYyA9IChhc2VjdGlvbiAqKSAmIGJmZF9hYnNfc2VjdGlvbjsKLQljYXNlIEVTRF9YREVGX0lOX1NFQzoKLQkgIHsKLQkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPmRlZl9pZHgrKzsKLQkgICAgbG9uZyB2YWw7Ci0JICAgIGdldF8xMCAoJnB0ciwgbmFtZSk7Ci0JICAgIHZhbCA9IGdldF80ICgmcHRyKTsKLQkgICAgaWYgKHBhc3MgPT0gMSkKLQkgICAgICB7Ci0JCS8qIEp1c3QgcmVtZW1iZXIgdGhlIHN5bWJvbCAqLwotCQlWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWFzeW1ib2wgKnM7Ci0JCWNoYXIgKm4gPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSk7Ci0JCXMgPSB2ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtICsgVkRBVEEgKGFiZmQpLT5ucmVmcywgbiwgdmFsLCBzZWMsIHNjbik7Ci0JCXMtPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotI2RlZmluZSBSX1JFTFdPUkQgMQotI2RlZmluZSBSX1JFTExPTkcgMgotI2RlZmluZSBSX1JFTFdPUkRfTkVHIDMKLSNkZWZpbmUgUl9SRUxMT05HX05FRyA0Ci0KLXJlbG9jX2hvd3RvX3R5cGUgdmVyc2Fkb3NfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIit2MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIit2MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfUkVMV09SRF9ORUcsIDAsIC0xLCAxNiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICItdjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxMT05HX05FRywgMCwgLTIsIDMyLCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIi12MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0KLXN0YXRpYyBpbnQKLWdldF9vZmZzZXQgKGxlbiwgcHRyKQotICAgICBpbnQgbGVuOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGludCB2YWwgPSAwOwotICBpZiAobGVuKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdmFsID0gKnB0cisrOwotICAgICAgaWYgKHZhbCAmIDB4ODApCi0JdmFsIHw9IH4weGZmOwotICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKQotCXZhbCA9ICh2YWwgPDwgOCkgfCAqcHRyKys7Ci0gICAgfQotCi0gIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX290ciAoYWJmZCwgb3RyLCBwYXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRfb3RyICpvdHI7Ci0gICAgIGludCBwYXNzOwotewotICB1bnNpZ25lZCBsb25nIHNoaWZ0OwotICB1bnNpZ25lZCBjaGFyICpzcmNwID0gb3RyLT5kYXRhOwotICB1bnNpZ25lZCBjaGFyICplbmRwID0gKHVuc2lnbmVkIGNoYXIgKikgb3RyICsgb3RyLT5zaXplOwotICB1bnNpZ25lZCBpbnQgYml0cyA9IChvdHItPm1hcFswXSA8PCAyNCkKLSAgfCAob3RyLT5tYXBbMV0gPDwgMTYpCi0gIHwgKG90ci0+bWFwWzJdIDw8IDgpCi0gIHwgKG90ci0+bWFwWzNdIDw8IDApOwotCi0gIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKTsKLSAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBlc2RpZC0+Y29udGVudHM7Ci0gIGludCBuZWVkX2NvbnRlbnRzID0gMDsKLSAgdW5zaWduZWQgaW50IGRzdF9pZHggPSBlc2RpZC0+cGM7Ci0KLSAgZm9yIChzaGlmdCA9ICgxIDw8IDMxKTsgc2hpZnQgJiYgc3JjcCA8IGVuZHA7IHNoaWZ0ID4+PSAxKQotICAgIHsKLSAgICAgIGlmIChiaXRzICYgc2hpZnQpCi0JewotCSAgaW50IGZsYWcgPSAqc3JjcCsrOwotCSAgaW50IGVzZGlkcyA9IChmbGFnID4+IDUpICYgMHg3OwotCSAgaW50IHNpemVpbndvcmRzID0gKChmbGFnID4+IDMpICYgMSkgPyAyIDogMTsKLQkgIGludCBvZmZzZXRsZW4gPSBmbGFnICYgMHg3OwotCSAgaW50IGo7Ci0KLQotCSAgaWYgKGVzZGlkcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSB6ZXJvIGVzZGlkIG1lYW5zIHRoZSBuZXcgcGMgaXMgdGhlIG9mZnNldCBnaXZlbiAqLwotCSAgICAgIGRzdF9pZHggKz0gZ2V0X29mZnNldCAob2Zmc2V0bGVuLCBzcmNwKTsKLQkgICAgICBzcmNwICs9IG9mZnNldGxlbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHZhbCA9IGdldF9vZmZzZXQgKG9mZnNldGxlbiwgc3JjcCArIGVzZGlkcyk7Ci0JICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJbmVlZF9jb250ZW50cyA9IDE7Ci0JICAgICAgZWxzZQotCQlmb3IgKGogPSAwOyBqIDwgc2l6ZWlud29yZHMgKiAyOyBqKyspCi0JCSAgewotCQkgICAgY29udGVudHNbZHN0X2lkeCArIChzaXplaW53b3JkcyAqIDIpIC0gaiAtIDFdID0gdmFsOwotCQkgICAgdmFsID4+PSA4OwotCQkgIH0KLQotCSAgICAgIGZvciAoaiA9IDA7IGogPCBlc2RpZHM7IGorKykKLQkJewotCQkgIGludCBlc2RpZCA9ICpzcmNwKys7Ci0KLQkJICBpZiAoZXNkaWQpCi0JCSAgICB7Ci0JCSAgICAgIGludCBybiA9IEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkucmVsb2NzKys7Ci0JCSAgICAgIGlmIChwYXNzID09IDEpCi0JCQl7Ci0JCQkgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgZGF0YSwgCi0JCQkgICAgIGp1c3QgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIGEgcmVsb2MgKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhcmVsZW50ICpuID0KLQkJCSAgRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5zZWN0aW9uLT5yZWxvY2F0aW9uICsgcm47Ci0JCQkgIG4tPmFkZHJlc3MgPSBkc3RfaWR4OwotCi0JCQkgIG4tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIGVzZGlkOwotCQkJICBuLT5hZGRlbmQgPSAwOwotCQkJICBuLT5ob3d0byA9IHZlcnNhZG9zX2hvd3RvX3RhYmxlICsgKChqICYgMSkgKiAyKSArIChzaXplaW53b3JkcyAtIDEpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgc3JjcCArPSBvZmZzZXRsZW47Ci0JICAgICAgZHN0X2lkeCArPSBzaXplaW53b3JkcyAqIDI7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmVlZF9jb250ZW50cyA9IDE7Ci0JICBpZiAoZHN0X2lkeCA8IGVzZGlkLT5zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIGlmIChwYXNzID09IDIpCi0JICAgICAgewotCQkvKiBhYnNvbHV0ZSBjb2RlLCBjb21lcyBpbiAxNiBiaXQgbHVtcHMgKi8KLQkJY29udGVudHNbZHN0X2lkeF0gPSBzcmNwWzBdOwotCQljb250ZW50c1tkc3RfaWR4ICsgMV0gPSBzcmNwWzFdOwotCSAgICAgIH0KLQkgIGRzdF9pZHggKz0gMjsKLQkgIHNyY3AgKz0gMjsKLQl9Ci0gICAgfQotICBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnBjID0gZHN0X2lkeDsKLQotICBpZiAoIWNvbnRlbnRzICYmIG5lZWRfY29udGVudHMpCi0gICAgZXNkaWQtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBlc2RpZC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCi19Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBsb29wID0gMTsKLSAgaW50IGk7Ci0gIGludCBqOwotICBpbnQgbnNlY3MgPSAwOwotCi0gIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5ucmVmcyA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+bmRlZnMgPSAwOwotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPmRlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPnBhc3NfMl9kb25lID0gMDsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICB1bmlvbiBleHRfYW55IGFueTsKLSAgICAgIGlmICghZ2V0X3JlY29yZCAoYWJmZCwgJmFueSkpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBzd2l0Y2ggKGFueS5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBWSEVBREVSOgotCSAgYnJlYWs7Ci0JY2FzZSBWRU5EOgotCSAgbG9vcCA9IDA7Ci0JICBicmVhazsKLQljYXNlIFZFU1RERUY6Ci0JICBwcm9jZXNzX2VzZCAoYWJmZCwgJmFueS5lc2QsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSBWT1RSOgotCSAgcHJvY2Vzc19vdHIgKGFiZmQsICZhbnkub3RyLCAxKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NzIGFuZCBzZWN0aW9ucyAqLwotCi0gIFZEQVRBIChhYmZkKS0+bnJlZnMgPSBWREFUQSAoYWJmZCktPnJlZl9pZHg7Ci0gIFZEQVRBIChhYmZkKS0+bmRlZnMgPSBWREFUQSAoYWJmZCktPmRlZl9pZHg7Ci0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+ZGVmX2lkeCA9IDA7Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBWREFUQSAoYWJmZCktPm5yZWZzICsgVkRBVEEgKGFiZmQpLT5uZGVmczsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBpKTsKLSAgICAgIGlmIChlc2RpZC0+c2VjdGlvbikKLQl7Ci0JICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NhdGlvbgotCSAgICA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50KSAqIGVzZGlkLT5yZWxvY3MpOwotCi0JICBlc2RpZC0+cGMgPSAwOwotCi0JICBpZiAoZXNkaWQtPmNvbnRlbnRzKQotCSAgICBlc2RpZC0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEOwotCi0JICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NfY291bnQgPSBlc2RpZC0+cmVsb2NzOwotCSAgaWYgKGVzZGlkLT5yZWxvY3MpCi0JICAgIGVzZGlkLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0KLQkgIGVzZGlkLT5yZWxvY3MgPSAwOwotCi0JICAvKiBBZGQgYW4gZW50cnkgaW50byB0aGUgc3ltYm9sIHRhYmxlIGZvciBpdCAqLwotCSAgbnNlY3MrKzsKLQkgIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAoZXNkaWQtPnNlY3Rpb24tPm5hbWUpICsgMTsKLQl9Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ICs9IG5zZWNzOwotCi0gIFZEQVRBIChhYmZkKS0+c3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChhc3ltYm9sKSAqIChhYmZkLT5zeW1jb3VudCkpOwotCi0gIFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4pOwotCi0gIGlmICgoVkRBVEEgKGFiZmQpLT5zeW1ib2xzID09IE5VTEwgJiYgYWJmZC0+c3ltY291bnQgPiAwKQotICAgICAgfHwgKFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9PSBOVUxMICYmIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuID4gMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjdHVhbGx5IGZpbGwgaW4gdGhlIHNlY3Rpb24gc3ltYm9scywKLSAgICAgd2Ugc3RpY2sgdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAqLwotCi0gIGZvciAoaiA9IFZEQVRBIChhYmZkKS0+bnJlZnMgKyBWREFUQSAoYWJmZCktPm5kZWZzLCBpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgaSk7Ci0gICAgICBhc2VjdGlvbiAqc2VjID0gZXNkaWQtPnNlY3Rpb247Ci0gICAgICBpZiAoc2VjKQotCXsKLQkgIGFzeW1ib2wgKnMgPSBWREFUQSAoYWJmZCktPnN5bWJvbHMgKyBqOwotCSAgcy0+bmFtZSA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBzZWMtPm5hbWUpOwotCSAgcy0+c2VjdGlvbiA9IHNlYzsKLQkgIHMtPmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgcy0+dmFsdWUgPSAwOwotCSAgcy0+dGhlX2JmZCA9IGFiZmQ7Ci0JICBqKys7Ci0JfQotICAgIH0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIC8qIFNldCB0aGlzIHRvIG5zZWNzIC0gc2luY2Ugd2UndmUgYWxyZWFkeSBwbGFudGVkIHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbHMgKi8KLSAgVkRBVEEgKGFiZmQpLT5uc2Vjc3ltcyA9IG5zZWNzOwotCi0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotCi0vKiBDaGVjayB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgaXMgYSB2ZXJzYWRvcyAgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXZlcnNhZG9zX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRfdmhlYWRlciBleHQ7Ci0gIHVuc2lnbmVkIGNoYXIgbGVuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAoJmV4dC50eXBlLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgZ3Vlc3MgdGhhdCB0aGUgbGFuZ3VhZ2UgZmllbGQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiAxMC4KLSAgICAgSW4gc2FtcGxlIGZpbGVzLCBpdCBpcyBhbHdheXMgZWl0aGVyIDAgb3IgMS4gIENoZWNraW5nIGZvciB0aGlzCi0gICAgIHByZXZlbnRzIGNvbmZ1c2lvbiB3aXRoIEludGVsIEhleCBmaWxlcy4gICovCi0gIGlmIChleHQudHlwZSAhPSBWSEVBREVSCi0gICAgICB8fCBleHQubGFuZyA+IDEwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBsb29rcyBsaWtlIGEgcmVjb3JkLCBidWlsZCB0aGUgdGRhdGEgYW5kIHJlYWQgaW4uICAqLwotCi0gIGlmICghdmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhdmVyc2Fkb3Nfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3Bhc3NfMiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bmlvbiBleHRfYW55IGFueTsKLQotICBpZiAoVkRBVEEgKGFiZmQpLT5wYXNzXzJfZG9uZSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIFZEQVRBIChhYmZkKS0+ZXNfZG9uZSA9IEVTX0JBU0U7Ci0KLQotICAvKiByZWFkIHJlY29yZHMgdGlsbCB3ZSBnZXQgdG8gd2hlcmUgd2Ugd2FudCB0byBiZSAqLwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGdldF9yZWNvcmQgKGFiZmQsICZhbnkpOwotICAgICAgc3dpdGNoIChhbnkuaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgVkVORDoKLQkgIFZEQVRBIChhYmZkKS0+cGFzc18yX2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JY2FzZSBWRVNUREVGOgotCSAgcHJvY2Vzc19lc2QgKGFiZmQsICZhbnkuZXNkLCAyKTsKLQkgIGJyZWFrOwotCWNhc2UgVk9UUjoKLQkgIHByb2Nlc3Nfb3RyIChhYmZkLCAmYW55Lm90ciwgMik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKCF2ZXJzYWRvc19wYXNzXzIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtZW1jcHkgKGxvY2F0aW9uLAotCSAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuY29udGVudHMgKyBvZmZzZXQsCi0JICAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgdmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3Nfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGludAotdmVyc2Fkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXZlcnNhZG9zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi12ZXJzYWRvc19nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBhc3ltYm9sICpzOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0KLSAgZm9yIChpID0gMCwgcyA9IFZEQVRBIChhYmZkKS0+c3ltYm9sczsKLSAgICAgICBpIDwgc3ltY291bnQ7Ci0gICAgICAgcysrLCBpKyspCi0gICAgewotICAgICAgKmFsb2NhdGlvbisrID0gczsKLSAgICB9Ci0KLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCSAgICAgICBzeW1ib2wtPm5hbWUpOwotCi0gICAgfQotfQotCi1sb25nCi12ZXJzYWRvc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotCi1sb25nCi12ZXJzYWRvc19jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFyZWxlbnQgKnNyYzsKLQotICB2ZXJzYWRvc19wYXNzXzIgKGFiZmQpOwotICBzcmMgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBpZiAoIUVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmRvbmVyZWwpCi0gICAgewotICAgICAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCA9IDE7Ci0gICAgICAvKiB0cmFuc2xhdGUgZnJvbSBpbmRleGVzIHRvIHN5bXB0ciBwdHJzICovCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICBpbnQgZXNkaWQgPSAoaW50KSBzcmNbY291bnRdLnN5bV9wdHJfcHRyOwotCi0JICBpZiAoZXNkaWQgPT0gMCkKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGVzZGlkIDwgRVNfQkFTRSkJLyogU2VjdGlvbiByZWxhdGl2ZSB0aGluZyAqLwotCSAgICB7Ci0JICAgICAgc3RydWN0IGVzZGlkICplID0gJkVEQVRBIChhYmZkLCBlc2RpZCAtIDEpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgLyoqIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gc2VjdGlvbiB3aGljaCB3YXMKLQkJICAgbmV2ZXIgZGVjbGFyZWQgISAqLwotCQl9Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGUtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGVzZGlkIC0gRVNfQkFTRTsKLQkgICAgfQotCi0JfQotICAgIH0KLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICAqcmVscHRyKysgPSBzcmMrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNkZWZpbmUJdmVyc2Fkb3NfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSB2ZXJzYWRvc19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB2ZXJzYWRvc19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgdmVyc2Fkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB2ZXJzYWRvc19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHZlcnNhZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIHZlcnNhZG9zX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSB2ZXJzYWRvc19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjID0KLXsKLSAgInZlcnNhZG9zIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICB2ZXJzYWRvc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICB2ZXJzYWRvc19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdm1zLWdzZC5jIGIvYmZkL3Ztcy1nc2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzZmU2OS4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLWdzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI3ICswLDAgQEAKLS8qIHZtcy1nc2QuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLgotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB0eXBpY2FsIHNlY3Rpb25zIGZvciB2YXggb2JqZWN0IGZpbGVzICAqLwotCi0jZGVmaW5lIFZBWF9DT0RFX05BTUUJCSIkQ09ERSIKLSNkZWZpbmUgVkFYX0RBVEFfTkFNRQkJIiREQVRBIgotI2RlZmluZSBWQVhfQUREUkVTU19EQVRBX05BTUUJIiRBRERSRVNTX0RBVEEiCi0KLS8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIGV2YXggb2JqZWN0IGZpbGVzICAqLwotCi0jZGVmaW5lIEVWQVhfQUJTX05BTUUJCSIkQUJTJCIKLSNkZWZpbmUgRVZBWF9DT0RFX05BTUUJCSIkQ09ERSQiCi0jZGVmaW5lIEVWQVhfTElOS19OQU1FCQkiJExJTkskIgotI2RlZmluZSBFVkFYX0RBVEFfTkFNRQkJIiREQVRBJCIKLSNkZWZpbmUgRVZBWF9CU1NfTkFNRQkJIiRCU1MkIgotI2RlZmluZSBFVkFYX1JFQURPTkxZQUREUl9OQU1FCSIkUkVBRE9OTFlfQUREUiQiCi0jZGVmaW5lIEVWQVhfUkVBRE9OTFlfTkFNRQkiJFJFQURPTkxZJCIKLSNkZWZpbmUgRVZBWF9MSVRFUkFMX05BTUUJIiRMSVRFUkFMJCIKLSNkZWZpbmUgRVZBWF9DT01NT05fTkFNRQkiJENPTU1PTiQiCi0jZGVmaW5lIEVWQVhfTE9DQUxfTkFNRQkJIiRMT0NBTCQiCi0KLXN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IHsKLSAgY2hhciAqbmFtZTsJCQkvKiBuYW1lIG9mIHNlY3Rpb24gKi8KLSAgaW50IHZmbGFnc19hbHdheXM7Ci0gIGZsYWd3b3JkIGZsYWdzX2Fsd2F5czsJLyogZmxhZ3Mgd2Ugc2V0IGFsd2F5cyAqLwotICBpbnQgdmZsYWdzX2hhc3NpemU7Ci0gIGZsYWd3b3JkIGZsYWdzX2hhc3NpemU7CS8qIGZsYWdzIHdlIHNldCBpZiB0aGUgc2VjdGlvbiBoYXMgYSBzaXplID4gMCAqLwotfTsKLQotLyogVGhlc2UgZmxhZ3MgYXJlIGRlY2NydGwvdmF4Y3J0bCAob3BlblZNUyA2LjIgVkFYKSBjb21wYXRpYmxlICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgdmF4X3NlY3Rpb25fZmxhZ3NbXSA9IHsKLSAgeyBWQVhfQ09ERV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRXxHUFNfU19NX1JEKSwKLQkoU0VDX0NPREUpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRXxHUFNfU19NX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBWQVhfREFUQV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0RBVEEpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBWQVhfQUREUkVTU19EQVRBX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgTlVMTCwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9PVlJ8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9PVlJ8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0KLX07Ci0KLQotLyogVGhlc2UgZmxhZ3MgYXJlIGRlY2NydGwvdmF4Y3J0bCAob3BlblZNUyA2LjIgQWxwaGEpIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCBldmF4X3NlY3Rpb25fZmxhZ3NbXSA9IHsKLSAgeyBFVkFYX0FCU19OQU1FLAotCShFR1BTX1NfVl9TSFIpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1NIUiksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9DT0RFX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX0VYRSksCi0JKFNFQ19DT0RFKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xJVEVSQUxfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTElOS19OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0RBVEFfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9CU1NfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19OT19GTEFHUyksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfUkVBRE9OTFlBRERSX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9SRUFET05MWV9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MT0NBTF9OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBOVUxMLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQotfTsKLQotLyogUmV0cmlldmUgYmZkIHNlY3Rpb24gZmxhZ3MgYnkgbmFtZSBhbmQgc2l6ZSAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi12bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0ICpzZWN0aW9uX2ZsYWdzOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGkgPSAwOwotCi0gIHdoaWxlIChzZWN0aW9uX2ZsYWdzW2ldLm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKFBSSVYoaXNfdmF4KT8KLQkgICAgc3RyY2FzZWNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKToKLQkgICAgc3RyY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpKSA9PSAwKQotCXsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfaGFzc2l6ZTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfYWx3YXlzOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0gIGlmIChzaXplID4gMCkKLSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOwotICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7Ci19Ci0KLQotLyogUmV0cmlldmUgdm1zIHNlY3Rpb24gZmxhZ3MgYnkgbmFtZSBhbmQgc2l6ZSAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi12bXNfZXNlY2ZsYWdfYnlfbmFtZSAoc2VjdGlvbl9mbGFncywgbmFtZSwgc2l6ZSkKLSAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaSA9IDA7Ci0KLSAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0gIGlmIChzaXplID4gMCkKLSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfaGFzc2l6ZTsKLSAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2Fsd2F5czsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgVk1TX0RFQlVHCi0vKiBkZWJ1ZyAqLwotCi1zdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgeyBjaGFyICpuYW1lOyBmbGFnd29yZCB2YWx1ZTsgfTsKLQotLyogQ29udmVydCBmbGFnIHRvIHByaW50YWJsZSBzdHJpbmcgICovCi0KLXN0YXRpYyBjaGFyICoKLWZsYWcyc3RyKGZsYWdkZXNjLCBmbGFncykKLSAgICAgc3RydWN0IGZsYWdkZXNjc3RydWN0ICpmbGFnZGVzYzsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0KLSAgc3RhdGljIGNoYXIgcmVzWzY0XTsKLSAgaW50IG5leHQgPSAwOwotCi0gIHJlc1swXSA9IDA7Ci0gIHdoaWxlIChmbGFnZGVzYy0+bmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MgJiBmbGFnZGVzYy0+dmFsdWUpICE9IDApCi0JewotCSAgaWYgKG5leHQpCi0JICAgIHN0cmNhdChyZXMsICIsIik7Ci0JICBlbHNlCi0JICAgIG5leHQgPSAxOwotCSAgc3RyY2F0IChyZXMsIGZsYWdkZXNjLT5uYW1lKTsKLQl9Ci0gICAgICBmbGFnZGVzYysrOwotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIGlucHV0IHJvdXRpbmVzICovCi0KLS8qIFByb2Nlc3MgR1NEL0VHU0QgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9nc2QgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHN0YXRpYyBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgZ3BzZmxhZ2Rlc2NbXSA9Ci0gIHsKLSAgICB7ICJQSUMiLCAweDAwMDEgfSwKLSAgICB7ICJMSUIiLCAweDAwMDIgfSwKLSAgICB7ICJPVlIiLCAweDAwMDQgfSwKLSAgICB7ICJSRUwiLCAweDAwMDggfSwKLSAgICB7ICJHQkwiLCAweDAwMTAgfSwKLSAgICB7ICJTSFIiLCAweDAwMjAgfSwKLSAgICB7ICJFWEUiLCAweDAwNDAgfSwKLSAgICB7ICJSRCIsICAweDAwODAgfSwKLSAgICB7ICJXUlQiLCAweDAxMDAgfSwKLSAgICB7ICJWRUMiLCAweDAyMDAgfSwKLSAgICB7ICJOT01PRCIsIDB4MDQwMCB9LAotICAgIHsgIkNPTSIsIDB4MDgwMCB9LAotICAgIHsgTlVMTCwgMCB9Ci0gIH07Ci0KLSAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBnc3lmbGFnZGVzY1tdID0KLSAgewotICAgIHsgIldFQUsiLCAweDAwMDEgfSwKLSAgICB7ICJERUYiLCAgMHgwMDAyIH0sCi0gICAgeyAiVU5JIiwgIDB4MDAwNCB9LAotICAgIHsgIlJFTCIsICAweDAwMDggfSwKLSAgICB7ICJDT01NIiwgMHgwMDEwIH0sCi0gICAgeyAiVkVDRVAiLCAweDAwMjAgfSwKLSAgICB7ICJOT1JNIiwgMHgwMDQwIH0sCi0gICAgeyBOVUxMLCAwIH0KLSAgfTsKLSNlbmRpZgotCi0gIGludCBnc2RfdHlwZSwgZ3NkX3NpemU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgY2hhciAqbmFtZTsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLSAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkcjsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBwc2VjdF9pZHggPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgIkdTRC9FR1NEICglZC8leClcbiIsIG9ianR5cGUsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChvYmp0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgRU9CSl9TX0NfRUdTRDoKLSAJUFJJVih2bXNfcmVjKSArPSA4OwkvKiBza2lwIHR5cGUsIHNpemUsIGxfdGVtcCAqLwotCVBSSVYocmVjX3NpemUpIC09IDg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9CSl9TX0NfR1NEOgotCVBSSVYodm1zX3JlYykgKz0gMTsKLQlQUklWKHJlY19zaXplKSAtPSAxOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIGNhbGN1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIGVhY2ggc2VjdGlvbiAgKi8KLSAgYmFzZV9hZGRyID0gMEw7Ci0KLSAgYWJmZC0+c3ltY291bnQgPSAwOwotCi0gIHdoaWxlIChQUklWKHJlY19zaXplKSA+IDApCi0gICAgewotICAgICAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSAgICAgIGlmIChvYmp0eXBlID09IE9CSl9TX0NfR1NEKQotCXsKLQkgIGdzZF90eXBlID0gKnZtc19yZWM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCB2bXNfcmVjLCAmZ3NkX3R5cGUsICZnc2Rfc2l6ZSk7Ci0JICBnc2RfdHlwZSArPSBFVkFYX09GRlNFVDsKLQl9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiZ3NkX3R5cGUgJWRcbiIsIGdzZF90eXBlKTsKLSNlbmRpZgotCi0gICAgICBzd2l0Y2ggKGdzZF90eXBlKQotCXsKLQkgIGNhc2UgR1NEX1NfQ19QU0M6Ci0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uCi0JICAgICAgICovCi0KLQkgICAgICBhc2VjdGlvbiAqb2xkX3NlY3Rpb24gPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIkdTRF9TX0NfUFNDXG4iKTsKLSNlbmRpZgotCSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpc24ndCBhIGJmZCBzZWN0aW9uLiAgKi8KLQotCSAgICAgIGlmIChQUklWKGlzX3ZheCkgJiYgKHBzZWN0X2lkeCA8IChhYmZkLT5zZWN0aW9uX2NvdW50LTEpKSkKLQkJewotCQkgIC8qIGNoZWNrIGZvciB0ZW1wb3Jhcnkgc2VjdGlvbiBmcm9tIFRJUiByZWNvcmQuICAqLwotCi0JCSAgaWYgKHBzZWN0X2lkeCA8IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JCSAgICBvbGRfc2VjdGlvbiA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0X2lkeF07Ci0JCSAgZWxzZQotCQkgICAgb2xkX3NlY3Rpb24gPSAwOwotCQl9Ci0KLQkgICAgICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDgpOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLQkgICAgICBpZiAoIXNlY3Rpb24pCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImJmZF9tYWtlX3NlY3Rpb24gKCVzKSBmYWlsZWQiKSwKLQkJCQkJIG5hbWUpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBiZmRfZ2V0bDMyKHZtc19yZWMgKyA0KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHZheF9zZWN0aW9uX2ZsYWdzLCBuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JCW5ld19mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fT1ZSKQotCQluZXdfZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFncyAoJXMsICV4KSBmYWlsZWQiKSwKLQkJICAgICBuYW1lLCBuZXdfZmxhZ3MpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHZtc19yZWNbMV07Ci0JICAgICAgYWxpZ25fYWRkciA9ICgxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcik7Ci0JICAgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQotCQliYXNlX2FkZHIgKz0gKGFsaWduX2FkZHIgLSAoYmFzZV9hZGRyICUgYWxpZ25fYWRkcikpOwotCSAgICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKLQkgICAgICBiYXNlX2FkZHIgKz0gc2VjdGlvbi0+X3Jhd19zaXplOwotCi0JICAgICAgLyogZ2xvYmFsIHNlY3Rpb24gaXMgY29tbW9uIHN5bWJvbCAgKi8KLQotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBHUFNfU19NX0dCTCkKLQkJewotCQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkJICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7Ci0KLQkJICBzeW1ib2wtPnZhbHVlID0gMDsKLQkJICBzeW1ib2wtPnNlY3Rpb24gPSBzZWN0aW9uOwotCQkgIHN5bWJvbC0+ZmxhZ3MgPSAoQlNGX0dMT0JBTHxCU0ZfU0VDVElPTl9TWU18QlNGX09MRF9DT01NT04pOwotCQl9Ci0KLQkgICAgICAvKiBjb3B5IHNhdmVkIGNvbnRlbnRzIGlmIG9sZF9zZWN0aW9uIHNldCAgKi8KLQotCSAgICAgIGlmIChvbGRfc2VjdGlvbiAhPSAwKQotCQl7Ci0JCSAgc2VjdGlvbi0+Y29udGVudHMgPSBvbGRfc2VjdGlvbi0+Y29udGVudHM7Ci0JCSAgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSA8IG9sZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIlNpemUgbWlzbWF0Y2ggc2VjdGlvbiAlcz0lbHgsICVzPSVseCIpLAotCQkJIG9sZF9zZWN0aW9uLT5uYW1lLAotCQkJICh1bnNpZ25lZCBsb25nKSBvbGRfc2VjdGlvbi0+X3Jhd19zaXplLAotCQkJIHNlY3Rpb24tPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPiBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQotCQkgICAgewotCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSAgICBiZmRfcmVhbGxvYyAob2xkX3NlY3Rpb24tPmNvbnRlbnRzLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkJICByZXR1cm4gLTE7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkJYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JCSAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdClzZWN0aW9uLT5fcmF3X3NpemUpOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoNCwgImdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkJIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChncHNmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0JICAgICAgdm1zX2RlYnVnICg0LCAiJWQgYnl0ZXMgYXQgMHglMDhseCAobWVtICVwKVxuIiwKLQkJCSBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0KLQkgICAgICBnc2Rfc2l6ZSA9IHZtc19yZWNbOF0gKyA5OwotCi0JICAgICAgcHNlY3RfaWR4Kys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfRVBNOgotCSAgY2FzZSBHU0RfU19DX0VQTVc6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGVwbVxuIik7Ci0jZW5kaWYKLQkgIC8qRkFMTFRIUlUqLwotCSAgY2FzZSBHU0RfU19DX1NZTToKLQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCSAgICB7Ci0JICAgICAgaW50IG5hbWVfb2Zmc2V0LCB2YWx1ZV9vZmZzZXQ7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkKLQkgICAgICAgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1NZTShXKVxuIik7Ci0jZW5kaWYKLQkgICAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMik7Ci0JICAgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fV0VBSykKLQkJbmV3X2ZsYWdzIHw9IEJTRl9XRUFLOwotCi0JICAgICAgc3dpdGNoIChnc2RfdHlwZSkKLQkJewotCQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JCSAgICBuYW1lX29mZnNldCA9IDExOwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIEdTRF9TX0NfRVBNVzoKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTI7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU06Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gOTsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZV9vZmZzZXQgPSA0OwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCQkgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fREVGKQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCQkgICAgICBuYW1lX29mZnNldCA9IDEwOwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDU7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIHNhdmUgc3ltYm9sIGluIHZtc19zeW1ib2xfdGFibGUgKi8KLQotCSAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLAotCQkJX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIG5hbWVfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCXsKLQkJICBpbnQgcHNlY3Q7Ci0KLQkJICBzeW1ib2wtPnZhbHVlID0gYmZkX2dldGwzMiAodm1zX3JlYyt2YWx1ZV9vZmZzZXQpOwotCQkgIGlmICgoZ3NkX3R5cGUgPT0gR1NEX1NfQ19TWU1XKQotCQkgICAgICB8fCAoZ3NkX3R5cGUgPT0gR1NEX1NfQ19FUE1XKSkKLQkJICAgIHBzZWN0ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIHZhbHVlX29mZnNldCAtIDIpOwotCQkgIGVsc2UKLQkJICAgIHBzZWN0ID0gdm1zX3JlY1t2YWx1ZV9vZmZzZXQtMV07Ci0KLQkJICBzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKilwc2VjdDsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcoNCwgImdzZCBzeW0gZGVmICMlZCAoJXMsICVkIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQkgICAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkJewotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcgKDQsICJnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlcyBbJXBdLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkJc3ltYm9sLT5uYW1lLCBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0ciAoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1tuYW1lX29mZnNldF0gKyBuYW1lX29mZnNldCArIDE7Ci0JICAgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgY2FzZSBHU0RfU19DX1BSTzoKLQkgIGNhc2UgR1NEX1NfQ19QUk9XOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBwcm9cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19JREM6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGlkY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0VOVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZW52XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFNZOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsc3lcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MRVBNOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsZXBtXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFBSTzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgbHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NQU0M6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHNwc2NcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19TWU1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBzeW12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRVBNVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1BST1Y6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb3ZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfUFNDICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uICAqLwotCi0JICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzEyKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICBpZiAoIXNlY3Rpb24pCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICBuZXdfZmxhZ3MgPSB2bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBldmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIChpbnQpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JICAgICAgbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIG5ld19mbGFncykpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzRdOwotCSAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQotCSAgICAgIGJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKLQkgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkgYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiAtMTsKLQkgICAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICB2bXNfZGVidWcoNCwgImVnc2QgcHNjICVkICglcywgZmxhZ3MgJTA0eD0lcykgIiwKLQkJICAgICAgIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgdm1zX2RlYnVnKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkgICAgICAgc2VjdGlvbi0+X3Jhd19zaXplLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPmNvbnRlbnRzKTsKLSNlbmRpZgotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX1NZTSArIEVWQVhfT0ZGU0VUOgotCSAgewotCSAgICAvKiBzeW1ib2wgc3BlY2lmaWNhdGlvbiAoZGVmaW5pdGlvbiBvciByZWZlcmVuY2UpICAqLwotCi0JICAgIHN5bWJvbCA9IF9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQkgICAgaWYgKHN5bWJvbCA9PSAwKQotCSAgICAgIHJldHVybiAtMTsKLQotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIG5ld19mbGFncyA9IEJTRl9OT19GTEFHUzsKLQotCSAgICBpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfV0VBSykKLQkgICAgICBuZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgaWYgKHZtc19yZWNbNl0gJiBFR1NZX1NfVl9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JICAgICAgewotCQlzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMzIpOwotCQlpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfTk9STSkKLQkJICB7ICAgICAgICAgLyogcHJvYyBkZWYgKi8KLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgfQotCQlzeW1ib2wtPnZhbHVlID0gYmZkX2dldGw2NCAodm1zX3JlYys4KTsKLQkJc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopKCh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyICh2bXNfcmVjKzI4KSk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gZGVmICMlZCAoJXMsICVkLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdzeWZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZWxzZQkvKiBzeW1ib2wgcmVmZXJlbmNlICovCi0JICAgICAgewotCSAgICAgICAgc3ltYm9sLT5uYW1lID0KLQkJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzgpOwotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImVnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+ZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0KLQkgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAgKi8KLQotCSAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgc3ltYm9sLT5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0JICAgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgICAgewotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIC0xOwotCSAgICAgIH0KLQkgICAgaWYgKGVudHJ5LT5zeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKQotCSAgICAgIHsJCQkJCS8qIEZJWE1FID8sIERFQyBDIGdlbmVyYXRlcyB0aGlzICovCi0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiRUdTRF9TX0NfU1lNOiBkdXBsaWNhdGUgXCIlc1wiXG4iLCBzeW1ib2wtPm5hbWUpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQllbnRyeS0+c3ltYm9sID0gc3ltYm9sOwotCQlQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JCWFiZmQtPnN5bWNvdW50Kys7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX0lEQyArIEVWQVhfT0ZGU0VUOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiKSwgZ3NkX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gLTE7Ci0KLQl9IC8qIHN3aXRjaCAqLwotCi0gICAgICBQUklWKHJlY19zaXplKSAtPSBnc2Rfc2l6ZTsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gZ3NkX3NpemU7Ci0KLSAgICB9IC8qIHdoaWxlIChyZWNzaXplID4gMCkgKi8KLQotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIG91dHB1dCByb3V0aW5lcyAqLwotCi0vKiBXcml0ZSBzZWN0aW9uIGFuZCBzeW1ib2wgZGlyZWN0b3J5IG9mIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICB1bnNpZ25lZCBpbnQgc3ltbnVtOwotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotICBjaGFyIGR1bW15X25hbWVbMTBdOwotICBjaGFyICpzbmFtZTsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2dzZCAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICAvKiBvdXRwdXQgc2VjdGlvbnMgICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICIlZCBzZWN0aW9ucyBmb3VuZFxuIiwgYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0jZW5kaWYKLQotICAvKiBlZ3NkIGlzIHF1YWR3b3JkIGFsaWduZWQgICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQotICB3aGlsZSAoc2VjdGlvbiAhPSAwKQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiU2VjdGlvbiAjJWQgJXMsICVkIGJ5dGVzXG4iLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSwgKGludClzZWN0aW9uLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLQkvKiAxMyBieXRlcyBlZ3NkLCBtYXggMzEgY2hhcnMgbmFtZSAtPiBzaG91bGQgYmUgNDQgYnl0ZXMgKi8KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCi0JewotCSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQl9Ci0KLQkvKiBDcmVhdGUgZHVtbXkgc2VjdGlvbnMgdG8ga2VlcCBjb25zZWN1dGl2ZSBpbmRpY2VzICovCi0KLSAgICAgIHdoaWxlIChzZWN0aW9uLT5pbmRleCAtIGxhc3RfaW5kZXggPiAxKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMywgImluZGV4ICVkLCBsYXN0ICVkXG4iLCBzZWN0aW9uLT5pbmRleCwgbGFzdF9pbmRleCk7Ci0jZW5kaWYKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIHNwcmludGYgKGR1bW15X25hbWUsICIuRFVNTVklMDJkIiwgbGFzdF9pbmRleCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZHVtbXlfbmFtZSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCSAgbGFzdF9pbmRleCsrOwotCX0KLQotICAgICAgLyogRG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Nlc2FyeSBmb3IgdGhlIGxpbmtlciBidXQgZm9yIG5vdyBpdCBrZWVwcwotCSB2bXNfc2x1cnBfZ3NkIGhhcHB5ICAqLwotCi0gICAgICBzbmFtZSA9IChjaGFyICopc2VjdGlvbi0+bmFtZTsKLSAgICAgIGlmICgqc25hbWUgPT0gJy4nKQotCXsKLQkgIHNuYW1lKys7Ci0JICBpZiAoKCpzbmFtZSA9PSAndCcpICYmIChzdHJjbXAgKHNuYW1lLCAidGV4dCIpID09IDApKQotCSAgICBzbmFtZSA9IFBSSVYoaXNfdmF4KT9WQVhfQ09ERV9OQU1FOkVWQVhfQ09ERV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnZCcpICYmIChzdHJjbXAgKHNuYW1lLCAiZGF0YSIpID09IDApKQotCSAgICBzbmFtZSA9IFBSSVYoaXNfdmF4KT9WQVhfREFUQV9OQU1FOkVWQVhfREFUQV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnYicpICYmIChzdHJjbXAgKHNuYW1lLCAiYnNzIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9CU1NfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxpbmsiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xJTktfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ3InKSAmJiAoc3RyY21wIChzbmFtZSwgInJkYXRhIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9SRUFET05MWV9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGl0ZXJhbCIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTElURVJBTF9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnYycpICYmIChzdHJjbXAgKHNuYW1lLCAiY29tbSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfQ09NTU9OX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsY29tbSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTE9DQUxfTkFNRTsKLQl9Ci0gICAgICBlbHNlCi0Jc25hbWUgPSBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHNuYW1lLCBFT0JKX1NfQ19TRUNTSVopOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1BTQywgLTEpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgJiAweGZmKTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotCXsKLQkgIG5ld19mbGFncyA9IChFR1BTX1NfVl9PVlJ8RUdQU19TX1ZfUkVMfEVHUFNfU19WX0dCTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0R8RUdQU19TX1ZfQ09NKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmV3X2ZsYWdzID0gdm1zX2VzZWNmbGFnX2J5X25hbWUgKGV2YXhfc2VjdGlvbl9mbGFncywgc25hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBuZXdfZmxhZ3MpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgc25hbWUpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAgICAgbGFzdF9pbmRleCA9IHNlY3Rpb24tPmluZGV4OwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotCi0gIC8qIG91dHB1dCBzeW1ib2xzICAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIiVkIHN5bWJvbHMgZm91bmRcbiIsIGFiZmQtPnN5bWNvdW50KTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQotICAgIHsKLQotICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwotICAgICAgaWYgKCooc3ltYm9sLT5uYW1lKSA9PSAnXycpCi0JewotCSAgaWYgKHN0cmNtcCAoc3ltYm9sLT5uYW1lLCAiX19tYWluIikgPT0gMCkKLQkgICAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSlzeW1ib2wtPnZhbHVlKTsKLQl9Ci0gICAgICBvbGRfZmxhZ3MgPSBzeW1ib2wtPmZsYWdzOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZJTEUpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkgPT0gMCkJLyogbm90IHhkZWYgKi8KLQkgICYmICghYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSkJLyogYW5kIG5vdCB4cmVmICovCi0JY29udGludWU7CQkJCQkvKiBkb250IG91dHB1dCAqLwotCi0gICAgICAvKiAxMyBieXRlcyBlZ3NkLCBtYXggNjQgY2hhcnMgbmFtZSAtPiBzaG91bGQgYmUgNzcgYnl0ZXMgICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDgwKSA8IDApCi0JewotCSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwkJLyogcHJlcGFyZSBvdXRwdXQgZm9yIHN1YnJlY29yZHMgKi8KLQl9Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfU1lNLCAtMSk7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CQkJLyogZGF0YSB0eXBlLCBhbGlnbm1lbnQgKi8KLQotICAgICAgbmV3X2ZsYWdzID0gMDsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9XRUFLKQotCW5ld19mbGFncyB8PSBFR1NZX1NfVl9XRUFLOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkJCS8qIC5jb21tICAqLwotCW5ld19mbGFncyB8PSAoRUdTWV9TX1ZfV0VBS3xFR1NZX1NfVl9DT01NKTsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9GVU5DVElPTikKLQl7Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfTk9STTsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9SRUw7Ci0JfQotICAgICAgaWYgKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkKLQl7Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfREVGOwotCSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9SRUw7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBuZXdfZmxhZ3MpOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQkJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQl7Ci0JICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCSAgICAgKChhc3ltYm9sICopKHN5bWJvbC0+dWRhdGEucCkpLT52YWx1ZSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJICAgICAoKChhc3ltYm9sICopKHN5bWJvbC0+dWRhdGEucCkpCi0JCQkJICAgICAgLT5zZWN0aW9uLT5pbmRleCkpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzeW1ib2wtPnNlY3Rpb24tPmluZGV4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpOwkvKiBMX1ZBTFVFICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIDApOwkJCS8qIExfQ09ERV9BRERSRVNTICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwkJCS8qIExfQ0FfUFNJTkRYICovCi0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOy8qIExfUFNJTkRYICovCi0JICAgIH0KLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW1ib2wtPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDgpOwotICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7IAotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1oZHIuYyBiL2JmZC92bXMtaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzZiMzIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1oZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiB2bXMtaGRyLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWTVMvVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRU1IIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIGFuZAotICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVFT00gcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKiBSZWFkICYgcHJvY2VzcyBlbWggcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLSAgaW50IHN1YnR5cGU7Ci0KLSAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDIsICJIRFIvRU1IXG4iKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIE9CSl9TX0NfSERSOgotCXN1YnR5cGUgPSB2bXNfcmVjWzFdOwotCWJyZWFrOwotICAgICAgY2FzZSBFT0JKX1NfQ19FTUg6Ci0Jc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzdWJ0eXBlID0gLTE7Ci0gICAgfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygzLCAic3VidHlwZSAlZFxuIiwgc3VidHlwZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHN1YnR5cGUpCi0gICAgewotCi0gICAgICBjYXNlIE1IRF9TX0NfTUhEOgotCS8qCi0JICogbW9kdWxlIGhlYWRlcgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbMl07Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgNSk7Ci0JcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQlwdHIgKz0gKnB0ciArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19MTk06Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19TUkM6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19UVEw6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19DUFI6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19NVEM6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19HVFg6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19NSEQgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqIG1vZHVsZSBoZWFkZXIKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzZdOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gxID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPQotCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKLQlwdHIgPSB2bXNfcmVjICsgMjAgKyB2bXNfcmVjWzIwXSArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9Ci0JICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCXB0ciArPSAqcHRyICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19MTk0gKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19UVEwgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0KLQkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19DUFIgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfR1RYICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICB9IC8qIHN3aXRjaCAqLwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KLQotCi0vKiBNYW51ZmFjdXJlIGEgVk1TIGxpa2UgdGltZSBvbiBhIHVuaXggYmFzZWQgc3lzdGVtLgotICAgc3RvbGVuIGZyb20gb2JqLXZtcy5jICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1nZXRfdm1zX3RpbWVfc3RyaW5nICgpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRidWZbMThdOwotI2lmbmRlZiBWTVMKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSAgY2hhciAqcG50OwotICB0aW1lX3QgdGltZWI7Ci0gIHRpbWUgKCZ0aW1lYik7Ci0gIHBudCA9IGN0aW1lICgmdGltZWIpOwotICBwbnRbM10gPSAwOwotICBwbnRbN10gPSAwOwotICBwbnRbMTBdID0gMDsKLSAgcG50WzE2XSA9IDA7Ci0gIHBudFsyNF0gPSAwOwotICBzcHJpbnRmICh0YnVmLCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7Ci0jZWxzZQotI2luY2x1ZGUgPHN0YXJsZXQuaD4KLSAgc3RydWN0Ci0gIHsKLSAgICBpbnQgU2l6ZTsKLSAgICB1bnNpZ25lZCBjaGFyICpQdHI7Ci0gIH0gRGVzY3JpcHRvcjsKLSAgRGVzY3JpcHRvci5TaXplID0gMTc7Ci0gIERlc2NyaXB0b3IuUHRyID0gdGJ1ZjsKLSAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwotI2VuZGlmIC8qIG5vdCBWTVMgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXN0aW1lc3RyaW5nOiclcydcbiIsIHRidWYpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRidWY7Ci19Ci0KLQotLyogd3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHVuc2lnbmVkIGludCBzeW1udW07Ci0gIGludCBoYWRfY2FzZSA9IDA7Ci0gIGludCBoYWRfZmlsZSA9IDA7Ci0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7Ci0KLSAgLyogTUhEICovCi0KLSAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19IRFIpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIEVPQkpfU19DX1NUUkxWTCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgTUFYX09VVFJFQ19TSVpFKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgLyogc3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uICovCi0KLSAgICAgIGNoYXIgKmZuYW1lLCAqZm91dCwgKmZwdHI7Ci0KLSAgICAgIGZwdHIgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGZwdHIpICsgMSk7Ci0gICAgICBzdHJjcHkgKGZuYW1lLCBmcHRyKTsKLSAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKLSAgICAgIGlmIChmb3V0ID09IDApCi0JZm91dCA9IHN0cmNociAoZm5hbWUsICc6Jyk7Ci0gICAgICBpZiAoZm91dCAhPSAwKQotCWZvdXQrKzsKLSAgICAgIGVsc2UKLQlmb3V0ID0gZm5hbWU7Ci0KLSAgICAgIC8qIHN0cmlwIC5vYmogc3VmZml4ICAqLwotCi0gICAgICBmcHRyID0gc3RycmNociAoZm5hbWUsICcuJyk7Ci0gICAgICBpZiAoKGZwdHIgIT0gMCkKLQkgICYmIChzdHJjYXNlY21wIChmcHRyLCAiLk9CSiIpID09IDApKQotCSpmcHRyID0gMDsKLQotICAgICAgZnB0ciA9IGZvdXQ7Ci0gICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKLQl7Ci0JICBpZiAoaXNsb3dlciAoKmZwdHIpKQotCSAgICAqZnB0ciA9IHRvdXBwZXIgKCpmcHRyKTsKLQkgIGZwdHIrKzsKLQkgIGlmICgoKmZwdHIgPT0gJzsnKQotCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCi0JICAgICpmcHRyID0gMDsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7Ci0gICAgfQotICBlbHNlCi0gICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKLQotICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgQkZEX1ZFUlNJT04pOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwotICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIExNTiAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJHQVMgcHJvR0lTIiwgMTApOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIFNSQyAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7Ci0KLSAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCi0gICAgewotICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwotCi0gICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQotCXsKLQkgIGlmIChzdHJuY21wICgoY2hhciAqKXN5bWJvbC0+bmFtZSwgIjxDQVNFOiIsIDYpID09IDApCi0JICAgIHsKLQkgICAgICBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKLQkgICAgICBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykgPSBzeW1ib2wtPm5hbWVbN10gLSAnMCc7Ci0KLQkgICAgICBpZiAoaGFkX2ZpbGUpCi0JCWJyZWFrOwotCSAgICAgIGhhZF9jYXNlID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKilzeW1ib2wtPm5hbWUsIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7Ci0JICBpZiAoaGFkX2Nhc2UpCi0JICAgIGJyZWFrOwotCSAgaGFkX2ZpbGUgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN5bW51bSA9PSBhYmZkLT5zeW1jb3VudCkKLSAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikibm9uYW1lIiwgNik7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBUVEwgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19UVEwpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiVFRMIiwgMyk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogQ1BSICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsCi0JCQkgKHVuc2lnbmVkIGNoYXIgKikiR05VIEJGRCBwb3J0ZWQgYnkgS2xhdXMgS+RtcGYgMTk5NC0xOTk2IiwKLQkJCSAzOSk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBQcm9jZXNzIEVPTS9FRU9NIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwotI2VuZGlmCi0KLSAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7Ci0KLSAgaWYgKChvYmp0eXBlID09IE9CSl9TX0NfRU9NKSAKLSAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdG90YWxfbHBzID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDQpOwotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID0gKih2bXNfcmVjICsgOCk7Ci0gICAgICBpZiAoUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID4gMSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IGZhbHNlOwotICAgICAgaWYgKFBSSVYocmVjX3NpemUpID4gMTApCi0JewotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSB0cnVlOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKLQotCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHI7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZW9tICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgb2JqdHlwZSwgLTEpOwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID4+IDEpKTsKLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBjb21wbGV0aW9uIGNvZGUgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBmaWxsIGJ5dGUgKi8KLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSAhPSAoYmZkX3ZtYSktMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKLSAgICAgIGlmIChzZWN0aW9uID09IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjdGlvbi0+aW5kZXgpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJICAgICAodW5zaWduZWQgbG9uZykgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtbWlzYy5jIGIvYmZkL3Ztcy1taXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMTE5MmMuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1taXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ2ICswLDAgQEAKLS8qIHZtcy1taXNjLmMgLS0gTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgVk1TX0RFQlVHCi0vKiBkZWJ1ZyBmdW5jdGlvbnMgKi8KLQotLyogZGVidWcgZnVuY3Rpb24gZm9yIGFsbCB2bXMgZXh0ZW5zaW9ucwotICAgZXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlIFZNU19ERUJVRyBmb3IgYQotICAgbnVtZXJpY2FsIHZhbHVlIG9uIHRoZSBmaXJzdCBjYWxsCi0gICBhbGwgZXJyb3IgbGV2ZWxzIGJlbG93IHRoaXMgdmFsdWUgYXJlIHByaW50ZWQKLSAgCi0gICBsZXZlbHM6Ci0gICAxCXRvcGxldmVsIGJmZCBjYWxscyAoZnVuY3Rpb25zIGZyb20gdGhlIGJmZCB2ZWN0b3IpCi0gICAyCWZ1bmN0aW9ucyBjYWxsZWQgYnkgYmZkIGNhbGxzCi0gICAuLi4KLSAgIDkJYWxtb3N0IGV2ZXJ5dGhpbmcKLQotICAgbGV2ZWwgaXMgYWxzbyBpZGVudGF0aW9uIGxldmVsLiBJbmRlbnRhdGlvbiBpcyBwZXJmb3JtZWQKLSAgIGlmIGxldmVsID4gMAotCSovCi0KLSNpZiBfX1NURENfXwotdm9pZAotX2JmZF92bXNfZGVidWcgKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7Ci0gIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOwotICBjaGFyICplcHRyOwotICB2YV9saXN0IGFyZ3M7Ci0gIGludCBhYnNsdmwgPSAobGV2ZWwgPiAwKT9sZXZlbDotbGV2ZWw7Ci0KLSAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQotCXsKLQkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7Ci0JICBvdXRwdXQgPSBzdGRlcnI7Ci0JfQotICAgICAgZWxzZQotCW1pbl9sZXZlbCA9IDA7Ci0gICAgfQotICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoYWJzbHZsID4gbWluX2xldmVsKQotICAgIHJldHVybjsKLQotICB3aGlsZSgtLWxldmVsPjApCi0gICAgZnByaW50ZihvdXRwdXQsICIgIik7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZmcHJpbnRmKG91dHB1dCwgZm9ybWF0LCBhcmdzKTsKLSAgZmZsdXNoKG91dHB1dCk7Ci0gIHZhX2VuZChhcmdzKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi12b2lkCi1fYmZkX3Ztc19kZWJ1ZyAobGV2ZWwsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikKLSAgICAgaW50IGxldmVsOwotICAgICBjaGFyICpmb3JtYXQ7Ci0gICAgIGxvbmcgYTE7IGxvbmcgYTI7IGxvbmcgYTM7Ci0gICAgIGxvbmcgYTQ7IGxvbmcgYTU7IGxvbmcgYTY7Ci17Ci0gIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7Ci0gIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOwotICBjaGFyICplcHRyOwotCi0gIGlmIChtaW5fbGV2ZWwgPT0gLTEpCi0gICAgewotICAgICAgaWYgKChlcHRyID0gZ2V0ZW52KCJWTVNfREVCVUciKSkgIT0gTlVMTCkKLQl7Ci0JICBtaW5fbGV2ZWwgPSBhdG9pKGVwdHIpOwotCSAgb3V0cHV0ID0gc3RkZXJyOwotCX0KLSAgICAgIGVsc2UKLQltaW5fbGV2ZWwgPSAwOwotICAgIH0KLSAgaWYgKG91dHB1dCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGxldmVsID4gbWluX2xldmVsKQotICAgIHJldHVybjsKLQotICB3aGlsZSgtLWxldmVsPjApCi0gICAgZnByaW50ZihvdXRwdXQsICIgIik7Ci0gIGZwcmludGYob3V0cHV0LCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwotICBmZmx1c2gob3V0cHV0KTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotCi0vKiBhIGRlYnVnIGZ1bmN0aW9uCi0gICBoZXggZHVtcCAnc2l6ZScgYnl0ZXMgc3RhcnRpbmcgYXQgJ3B0cicgICovCi0KLXZvaWQKLV9iZmRfaGV4ZHVtcCAobGV2ZWwsIHB0ciwgc2l6ZSwgb2Zmc2V0KQotICAgICBpbnQgbGV2ZWw7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBvZmZzZXQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmxwdHIgPSBwdHI7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGxvbmcgc3RhcnQgPSBvZmZzZXQ7Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgewotICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKLQl2bXNfZGVidWcgKGxldmVsLCAiJTA4bHg6Iiwgc3RhcnQpOwotICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgJTAyeCIsICpwdHIrKyk7Ci0gICAgICBjb3VudCsrOwotICAgICAgc3RhcnQrKzsKLSAgICAgIGlmIChzaXplID09IDApCi0JewotCSAgd2hpbGUgKChjb3VudCUxNikgIT0gMCkKLQkgICAgewotCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICAgIik7Ci0JICAgICAgY291bnQrKzsKLQkgICAgfQotCX0KLSAgICAgIGlmICgoY291bnQlMTYpID09IDApCi0JewotCSAgdm1zX2RlYnVnICgtbGV2ZWwsICIgIik7Ci0JICB3aGlsZSAobHB0ciA8IHB0cikKLQkgICAgewotCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiJWMiLCAoKmxwdHIgPCAzMik/Jy4nOipscHRyKTsKLQkgICAgICBscHRyKys7Ci0JICAgIH0KLQkgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKLQl9Ci0gICAgfQotICBpZiAoKGNvdW50JTE2KSAhPSAwKQotICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotDAotLyogaGFzaCBmdW5jdGlvbnMKLQotICAgVGhlc2UgYXJlIG5lZWRlZCB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLwotCi0vKiBhbGxvY2F0ZSBuZXcgdm1zX2hhc2hfZW50cnkKLSAgIGtlZXAgdGhlIHN5bWJvbCBuYW1lIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGJmZCBzeW1ib2wgaW4gdGhlIHRhYmxlICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF92bXNfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICB2bXNfc3ltYm9sX2VudHJ5ICpyZXQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg1LCAiX2JmZF92bXNfaGFzaF9uZXdmdW5jKCVwLCAlcCwgJXMpXG4iLCBlbnRyeSwgdGFibGUsIHN0cmluZyk7Ci0jZW5kaWYKLQotICBpZiAoZW50cnkgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEwpCi0gICAgewotICAgICAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAodm1zX3N5bWJvbF9lbnRyeSkpOwotICAgICAgaWYgKHJldCA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilOVUxMOwotCX0KLSAgICAgIGVudHJ5ID0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0gICAgfQotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLQotICByZXQgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZyk7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX2hhc2hfbmV3ZnVuYyByZXQgJXBcbiIsIHJldCk7Ci0jZW5kaWYKLQotICByZXQtPnN5bWJvbCA9IChhc3ltYm9sICopTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKXJldDsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgaW5wdXQgZnVuY3Rpb25zICovCi0KLS8qIFJldHVybiB0eXBlIGFuZCBsZW5ndGggZnJvbSByZWNvcmQgaGVhZGVyIChidWYpIG9uIEFscGhhLiAgKi8KLQotdm9pZAotX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIGJ1ZiwgdHlwZSwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgKnR5cGU7Ci0gICAgIGludCAqbGVuZ3RoOwotewotICBpZiAodHlwZSAhPSAwKQotICAgICp0eXBlID0gYmZkX2dldGwxNiAoYnVmKTsKLSAgYnVmICs9IDI7Ci0gIGlmIChsZW5ndGggIT0gMCkKLSAgICAqbGVuZ3RoID0gYmZkX2dldGwxNiAoYnVmKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEwLCAiX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgdHlwZSAleCwgbGVuZ3RoICV4XG4iLCAodHlwZT8qdHlwZTowKSwgKGxlbmd0aD8qbGVuZ3RoOjApKTsKLSNlbmRpZgotCi0KLSAgcmV0dXJuOwotfQotCi0KLS8qIEdldCBuZXh0IHJlY29yZCBmcm9tIG9iamVjdCBmaWxlIHRvIHZtc19idWYKLSAgIHNldCBQUklWKGJ1Zl9zaXplKSBhbmQgcmV0dXJuIGl0Ci0gIAotICAgdGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgc2luY2UgaXQgc2hvdWxkIGJlIHBvcnRhYmxlLgotICAKLSAgIHRoZSBvcGVuVk1TIG9iamVjdCBmaWxlIGhhcyAndmFyaWFibGUgbGVuZ3RoJyB3aGljaCBtZWFucyB0aGF0Ci0gICByZWFkKCkgcmV0dXJucyBkYXRhIGluIGNodW5rcyBvZiAoaG9wZWZ1bGx5KSBjb3JyZWN0IGFuZCBleHBlY3RlZAotICAgc2l6ZS4gVGhlIGxpbmtlciAoYW5kIG90aGVyIHRvb2xzIG9uIHZtcykgZGVwZW5kIG9uIHRoYXQuIFVuaXggZG9lc24ndAotICAga25vdyBhYm91dCAnZm9ybWF0dGVkJyBmaWxlcywgc28gcmVhZGluZyBhbmQgd3JpdGluZyBzdWNoIGFuIG9iamVjdAotICAgZmlsZSBpbiBhIHVuaXggZW52aXJvbm1lbnQgaXMgbm90IHRyaXZpYWwuCi0gIAotICAgV2l0aCB0aGUgdG9vbCAnZmlsZScgKGF2YWlsYWJsZSBvbiBhbGwgdm1zIGZ0cCBzaXRlcyksIG9uZQotICAgY2FuIHZpZXcgYW5kIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiBhIGZpbGUuIENoYW5naW5nIGZyb20KLSAgICd2YXJpYWJsZSBsZW5ndGgnIHRvICdmaXhlZCBsZW5ndGgsIDUxMiBieXRlcycgcmV2ZWFscyB0aGUKLSAgIHJlY29yZCBsZW5ndGggYXQgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgZXZlcnkgcmVjb3JkLiBUaGUgc2FtZQotICAgaGFwcGVucyBkdXJpbmcgdGhlIHRyYW5zZmVyIG9mIG9iamVjdCBmaWxlcyBmcm9tIHZtcyB0byB1bml4LAotICAgYXQgbGVhc3Qgd2l0aCB1Y3gsIGRlYydzIGltcGxlbWVudGF0aW9uIG9mIHRjcC9pcC4KLSAgCi0gICBUaGUgdm1zIGZvcm1hdCByZXBlYXRzIHRoZSBsZW5ndGggYXQgYnl0ZXMgMiAmIDMgb2YgZXZlcnkgcmVjb3JkLgotICAKLSAgIE9uIHRoZSBmaXJzdCBjYWxsIChmaWxlX2Zvcm1hdCA9PSBGRl9VTktOT1dOKSB3ZSBjaGVjayBpZgotICAgdGhlIGZpcnN0IGFuZCB0aGUgdGhpcmQgYnl0ZSBwYWlyICghKSBvZiB0aGUgcmVjb3JkIG1hdGNoLgotICAgSWYgdGhleSBkbyBpdCdzIGFuIG9iamVjdCBmaWxlIGluIGFuIHVuaXggZW52aXJvbm1lbnQgb3Igd2l0aAotICAgd3JvbmcgYXR0cmlidXRlcyAoRkZfRk9SRUlHTiksIGVsc2Ugd2Ugc2hvdWxkIGJlIGluIGEgdm1zCi0gICBlbnZpcm9ubWVudCB3aGVyZSByZWFkKCkgcmV0dXJucyB0aGUgcmVjb3JkIHNpemUgKEZGX05BVElWRSkuCi0gIAotICAgcmVhZGluZyBpcyBhbHdheXMgZG9uZSBpbiAyIHN0ZXBzLgotICAgZmlyc3QganVzdCB0aGUgcmVjb3JkIGhlYWRlciBpcyByZWFkIGFuZCB0aGUgbGVuZ3RoIGV4dHJhY3RlZAotICAgYnkgZ2V0X2hlYWRlcl92YWx1ZXMKLSAgIHRoZW4gdGhlIHJlYWQgYnVmZmVyIGlzIGFkanVzdGVkIGFuZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFyZQotICAgcmVhZCBpbi4KLSAgCi0gICBhbGwgZmlsZSBpL28gaXMgYWx3YXlzIGRvbmUgb24gZXZlbiBmaWxlIHBvc2l0aW9ucyAgKi8KLQotaW50Ci1fYmZkX3Ztc19nZXRfcmVjb3JkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB0ZXN0X2xlbiwgdGVzdF9zdGFydCwgcmVtYWluaW5nOwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX2dldF9yZWNvcmRcbiIpOwotI2VuZGlmCi0KLSAgLyogbWluaW11bSBpcyA2IGJ5dGVzIG9uIEFscGhhCi0gICAgICgyIGJ5dGVzIGxlbmd0aCwgMiBieXRlcyByZWNvcmQgaWQsIDIgYnl0ZXMgbGVuZ3RoIHJlcGVhdGVkKQotCi0gICAgIG9uIFZBWCB0aGVyZSdzIG5vIGxlbmd0aCBpbmZvcm1hdGlvbiBpbiB0aGUgcmVjb3JkCi0gICAgIHNvIHN0YXJ0IHdpdGggT0JKX1NfQ19NQVhSRUNTSVogICovCi0KLSAgaWYgKFBSSVYoYnVmX3NpemUpID09IDApCi0gICAgewotICAgICAgaWYgKFBSSVYoaXNfdmF4KSkKLQl7Ci0JICBQUklWKHZtc19idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChPQkpfU19DX01BWFJFQ1NJWik7Ci0JICBQUklWKGJ1Zl9zaXplKSA9IE9CSl9TX0NfTUFYUkVDU0laOwotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9WQVg7Ci0JfQotICAgICAgZWxzZQotCVBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKDYpOwotICAgIH0KLQotICB2bXNfYnVmID0gUFJJVih2bXNfYnVmKTsKLQotICBpZiAodm1zX2J1ZiA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzd2l0Y2ggKFBSSVYoZmlsZV9mb3JtYXQpKQotICAgIHsKLSAgICAgIGNhc2UgRkZfVU5LTk9XTjoKLSAgICAgIGNhc2UgRkZfRk9SRUlHTjoKLQl0ZXN0X2xlbiA9IDY7CQkJLyogcHJvYmUgNiBieXRlcyAqLwotCXRlc3Rfc3RhcnQgPSAyOwkJCS8qIHdoZXJlIHRoZSByZWNvcmQgc3RhcnRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9OQVRJVkU6Ci0JdGVzdF9sZW4gPSA0OwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkZfVkFYOgotCXRlc3RfbGVuID0gMDsKLQl0ZXN0X3N0YXJ0ID0gMDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBvZGQgYWxpZ25tZW50IGJ5dGUgICovCi0KLSAgaWYgKGJmZF90ZWxsIChhYmZkKSAmIDEpCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCAxLCBhYmZkKSAhPSAxKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qIHJlYWQgdGhlIHJlY29yZCBoZWFkZXIgb24gQWxwaGEuICAqLwotCi0gIGlmICgodGVzdF9sZW4gIT0gMCkKLSAgICAgICYmIChiZmRfcmVhZCAoUFJJVih2bXNfYnVmKSwgMSwgdGVzdF9sZW4sIGFiZmQpCi0JICAhPSAoYmZkX3NpemVfdHlwZSkgdGVzdF9sZW4pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogY2hlY2sgZmlsZSBmb3JtYXQgb24gZmlyc3QgY2FsbCAgKi8KLQotICBpZiAoUFJJVihmaWxlX2Zvcm1hdCkgPT0gRkZfVU5LTk9XTikKLSAgICB7CQkJCQkJLyogcmVjb3JkIGxlbmd0aCByZXBlYXRzID8gKi8KLSAgICAgIGlmICggKHZtc19idWZbMF0gPT0gdm1zX2J1Zls0XSkKLSAgICAgICAgJiYgKHZtc19idWZbMV0gPT0gdm1zX2J1Zls1XSkpCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9GT1JFSUdOOwkvKiBZOiBmb3JlaWduIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9OQVRJVkU7CS8qIE46IG5hdGl2ZSBlbnZpcm9ubWVudCAqLwotCSAgdGVzdF9zdGFydCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX2xlbmd0aCkgPSBiZmRfcmVhZCAodm1zX2J1ZiwgMSwgUFJJVihidWZfc2l6ZSksIGFiZmQpOwotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPD0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWY7Ci0gICAgfQotICBlbHNlCQkvKiBBbHBoYSAgKi8KLSAgICB7Ci0gICAgICAvKiBleHRyYWN0IHZtcyByZWNvcmQgbGVuZ3RoICAqLwotCi0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX2J1Zit0ZXN0X3N0YXJ0LCBOVUxMLAotCQkJCSAgJlBSSVYocmVjX2xlbmd0aCkpOwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHRoYXQncyB3aGF0IHRoZSBsaW5rZXIgbWFudWFsIHNheXMgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gRU9CSl9TX0NfTUFYUkVDU0laKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICAqLwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IFBSSVYoYnVmX3NpemUpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSByZWFsbG9jICh2bXNfYnVmLCBQUklWKHJlY19sZW5ndGgpKTsKLQkgIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCSAgaWYgKHZtc19idWYgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgUFJJVihidWZfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotCX0KLQotICAgICAgLyogcmVhZCB0aGUgcmVtYWluaW5nIHJlY29yZCAgKi8KLQotICAgICAgcmVtYWluaW5nID0gUFJJVihyZWNfbGVuZ3RoKSAtIHRlc3RfbGVuICsgdGVzdF9zdGFydDsKLQotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgxMCwgImJmZF9yZWFkIHJlbWFpbmluZyAlZFxuIiwgcmVtYWluaW5nKTsKLSNlbmRpZgotICAgICAgaWYgKGJmZF9yZWFkICh2bXNfYnVmICsgdGVzdF9sZW4sIDEsIHJlbWFpbmluZywgYWJmZCkgIT0KLQkgIChiZmRfc2l6ZV90eXBlKSByZW1haW5pbmcpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIFBSSVYodm1zX3JlYykgPSB2bXNfYnVmICsgdGVzdF9zdGFydDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxMSwgImJmZF9yZWFkIHJlY19sZW5ndGggJWRcbiIsIFBSSVYocmVjX2xlbmd0aCkpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFBSSVYocmVjX2xlbmd0aCk7Ci19Ci0KLQotLyogZ2V0IG5leHQgdm1zIHJlY29yZCBmcm9tIGZpbGUKLSAgIHVwZGF0ZSB2bXNfcmVjIGFuZCByZWNfbGVuZ3RoIHRvIG5ldyAocmVtYWluaW5nKSB2YWx1ZXMgICovCi0KLWludAotX2JmZF92bXNfbmV4dF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQgKGxlbiAlZCwgc2l6ZSAlZClcbiIsCi0JICAgICAgUFJJVihyZWNfbGVuZ3RoKSwgUFJJVihyZWNfc2l6ZSkpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiAwKQotICAgIHsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gUFJJVihyZWNfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKF9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpIDw9IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX3R5cGUpID0gKihQUklWKHZtc19yZWMpKTsKLSAgICAgIFBSSVYocmVjX3NpemUpID0gUFJJVihyZWNfbGVuZ3RoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgUFJJVih2bXNfcmVjKSwgJlBSSVYocmVjX3R5cGUpLAotCQkJCSAgJlBSSVYocmVjX3NpemUpKTsKLSAgICB9Ci0gIFBSSVYocmVjX2xlbmd0aCkgLT0gUFJJVihyZWNfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQ6IHJlYyAlcCwgc2l6ZSAlZCwgbGVuZ3RoICVkLCB0eXBlICVkXG4iLAotCSAgICAgIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpLCBQUklWKHJlY19sZW5ndGgpLAotCSAgICAgIFBSSVYocmVjX3R5cGUpKTsKLSNlbmRpZgotCi0gIHJldHVybiBQUklWKHJlY190eXBlKTsKLX0KLQotCi0MCi0vKiBDb3B5IHNpemVkIHN0cmluZyAoc3RyaW5nIHdpdGggZml4ZWQgbGVuZ3RoKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHNpemUgaXMgc3RyaW5nIGxlbmd0aCAoc2l6ZSBvZiByZWNvcmQpICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChzdHIsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnN0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm5ld3N0ciA9IGJmZF9tYWxsb2MgKHNpemUgKyAxKTsKLQotICBpZiAobmV3c3RyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN0cm5jcHkgKG5ld3N0ciwgKGNoYXIgKilzdHIsIHNpemUpOwotICBuZXdzdHJbc2l6ZV0gPSAwOwotCi0gIHJldHVybiBuZXdzdHI7Ci19Ci0KLS8qIENvcHkgY291bnRlZCBzdHJpbmcgKHN0cmluZyB3aXRoIGxlbmd0aCBhdCBmaXJzdCBieXRlKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHB0ciBwb2ludHMgdG8gbGVuZ3RoIGJ5dGUgb24gZW50cnkgICovCi0KLWNoYXIgKgotX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGludCBsZW4gPSAqcHRyKys7Ci0KLSAgcmV0dXJuIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIGxlbik7Ci19Ci0KLQwKLS8qIHN0YWNrIHJvdXRpbmVzIGZvciB2bXMgRVRJUiBjb21tYW5kcyAqLwotCi0vKiBQdXNoIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLwotCi12b2lkCi1fYmZkX3Ztc19wdXNoIChhYmZkLCB2YWwsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbDsKLSAgICAgaW50IHBzZWN0OwotewotICBzdGF0aWMgaW50IGxhc3RfcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiPHB1c2ggJTAxNmx4KCVkKSBhdCAlZD5cbiIsIHZhbCwgcHNlY3QsIFBSSVYoc3RhY2twdHIpKTsKLSNlbmRpZgotCi0gIGlmIChwc2VjdCA+PSAwKQotICAgIGxhc3RfcHNlY3QgPSBwc2VjdDsKLQotICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWUgPSB2YWw7Ci0gIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA9IGxhc3RfcHNlY3Q7Ci0gIFBSSVYoc3RhY2twdHIpKys7Ci0gIGlmIChQUklWKHN0YWNrcHRyKSA+PSBTVEFDS1NJWkUpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIpLCBQUklWKHN0YWNrcHRyKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQb3AgdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggICovCi0KLXVxdWFkCi1fYmZkX3Ztc19wb3AgKGFiZmQsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqcHNlY3Q7Ci17Ci0gIHVxdWFkIHZhbHVlOwotCi0gIGlmIChQUklWKHN0YWNrcHRyKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayB1bmRlcmZsb3cgaW4gX2JmZF92bXNfcG9wIikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKS0tOwotICB2YWx1ZSA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS52YWx1ZTsKLSAgaWYgKChwc2VjdCAhPSBOVUxMKSAmJiAoUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0ID49IDApKQotICAgICpwc2VjdCA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICI8cG9wICUwMTZseCglZCk+XG4iLCB2YWx1ZSwgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0KTsKLSNlbmRpZgotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgb3V0cHV0IGZ1bmN0aW9ucyAqLwotCi0vKiBHQVMgdGVuZHMgdG8gd3JpdGUgc2VjdGlvbnMgaW4gbGl0dGxlIGNodW5rcyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgd2hpY2ggd2UgY2FuJ3QgdXNlIGRpcmVjdGx5LiBTbyB3ZSBzYXZlIHRoZSBsaXR0bGUgY2h1bmtzIGluIGxpbmtlZAotICAgbGlzdHMgKG9uZSBwZXIgc2VjdGlvbikgYW5kIHdyaXRlIHRoZW0gbGF0ZXIuICAqLwotCi0vKiBBZGQgYSBuZXcgdm1zX3NlY3Rpb24gc3RydWN0dXJlIHRvIHZtc19zZWN0aW9uX3RhYmxlCi0gICAtIGZvcndhcmQgY2hhaW5pbmcgLSAgKi8KLQotc3RhdGljIHZtc19zZWN0aW9uICoKLWFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotewotICB2bXNfc2VjdGlvbiAqc3B0ciwgKm5ld3B0cjsKLQotICBzcHRyID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdOwotICBpZiAoc3B0ciAhPSBOVUxMKQotICAgIHJldHVybiBzcHRyOwotCi0gIG5ld3B0ciA9ICh2bXNfc2VjdGlvbiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHZtc19zZWN0aW9uKSk7Ci0gIGlmIChuZXdwdHIgPT0gKHZtc19zZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3B0ci0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgaWYgKG5ld3B0ci0+Y29udGVudHMgPT0gKHVuc2lnbmVkIGNoYXIgKilOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdwdHItPm9mZnNldCA9IDA7Ci0gIG5ld3B0ci0+c2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgbmV3cHRyLT5uZXh0ID0gMDsKLSAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdID0gbmV3cHRyOwotICByZXR1cm4gbmV3cHRyOwotfQotCi0KLS8qIFNhdmUgc2VjdGlvbiBkYXRhICYgb2Zmc2V0IHRvIGFuIHZtc19zZWN0aW9uIHN0cnVjdHVyZQotICAgdm1zX3NlY3Rpb25fdGFibGVbXSBob2xkcyB0aGUgdm1zX3NlY3Rpb24gY2hhaW4gICovCi0KLWJvb2xlYW4KLV9iZmRfc2F2ZV92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotCi0gIGlmIChzZWN0aW9uLT5pbmRleCA+PSBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb3VudCA9PSAoYmZkX3NpemVfdHlwZSkwKQotICAgIHJldHVybiB0cnVlOwotICBzcHRyID0gYWRkX25ld19jb250ZW50cyAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChzcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHNwdHItPmNvbnRlbnRzICsgb2Zmc2V0LCBkYXRhLCAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogR2V0IHZtc19zZWN0aW9uIHBvaW50ZXIgdG8gc2F2ZWQgY29udGVudHMgZm9yIHNlY3Rpb24gIyBpbmRleCAgKi8KLQotdm1zX3NlY3Rpb24gKgotX2JmZF9nZXRfdm1zX3NlY3Rpb24gKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgaWYgKGluZGV4ID49ICBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2luZGV4XTsKLX0KLQotDAotLyogT2JqZWN0IG91dHB1dCByb3V0aW5lcyAgKi8KLQotLyogQmVnaW4gbmV3IHJlY29yZCBvciByZWNvcmQgaGVhZGVyCi0gICB3cml0ZSAyIGJ5dGVzIHJlY3R5cGUKLSAgIHdyaXRlIDIgYnl0ZXMgcmVjb3JkIGxlbmd0aCAoZmlsbGVkIGluIGF0IGZsdXNoKQotICAgd3JpdGUgMiBieXRlcyBoZWFkZXIgdHlwZSAob21taXR0ZWQgaWYgcmVjaGVhZCA9PSAtMSkgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgcmVjdHlwZSwgcmVjaGVhZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcmVjdHlwZTsKLSAgICAgaW50IHJlY2hlYWQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbih0eXBlICVkLCBoZWFkICVkKVxuIiwgcmVjdHlwZSwKLQkgICAgICByZWNoZWFkKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWN0eXBlKTsKLQotICAvKiBzYXZlIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uIHRvIGZpbGwgaW4gbGVuZ2h0IGxhdGVyICAqLwotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBQUklWKGxlbmd0aF9wb3MpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2JlZ2luOiBsZW5ndGhfcG9zID0gJWRcbiIsCi0JICAgICAgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsMCk7CQkvKiBwbGFjZWhvbGRlciBmb3IgbGVuZ3RoICovCi0KLSAgaWYgKHJlY2hlYWQgIT0gLTEpCi0gICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLHJlY2hlYWQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBTZXQgcmVjb3JkL3N1YnJlY29yZCBhbGlnbm1lbnQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIGFsaWdudG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFsaWdudG87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQoJWQpXG4iLCBhbGlnbnRvKTsKLSNlbmRpZgotCi0gIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSBhbGlnbnRvOwotICByZXR1cm47Ci19Ci0KLQotLyogUHJlcGFyZSBmb3Igc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wdXNoKHB1c2hlZF9zaXplID0gJWQpXG4iLCBQUklWKG91dHB1dF9zaXplKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hfbGV2ZWwpKys7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBFbmQgb2Ygc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3BvcChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihwdXNoZWRfc2l6ZSkpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3A6IGxlbmd0aF9wb3MgPSAlZFxuIiwgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hlZF9zaXplKSA9IDA7Ci0gIFBSSVYocHVzaF9sZXZlbCktLTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEZsdXNoIHVud3JpdHRlbiBvdXRwdXQsIGVuZHMgY3VycmVudCByZWNvcmQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgcmVhbF9zaXplID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIGludCBhbGlnbmNvdW50OwotICBpbnQgbGVuZ3RoOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9mbHVzaChyZWFsX3NpemUgPSAlZCwgcHVzaGVkX3NpemUgJWQgYXQgbGVucG9zICVkKVxuIiwKLQkgICAgICByZWFsX3NpemUsIFBSSVYocHVzaGVkX3NpemUpLCBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBsZW5ndGggPSByZWFsX3NpemUgLSBQUklWKHB1c2hlZF9zaXplKTsKLSAgZWxzZQotICAgIGxlbmd0aCA9IHJlYWxfc2l6ZTsKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotICBhbGlnbmNvdW50ID0gKFBSSVYob3V0cHV0X2FsaWdubWVudCkKLQkJLSAobGVuZ3RoICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KSkpICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJhbGlnbjogYWRkaW5nICVkIGJ5dGVzXG4iLCBhbGlnbmNvdW50KTsKLSNlbmRpZgotCi0gIHdoaWxlKGFsaWduY291bnQtLSA+IDApCi0gICAgewotICAgICAgUFJJVihvdXRwdXRfYnVmKVtyZWFsX3NpemUrK10gPSAwOwotI2lmIDAKLSAgICAgIC8qIHRoaXMgaXMgd2h5IEkgKmxvdmUqIHZtczogaW5jb25zaXN0ZW5jeSA6LX0KLQkgYWxpZ25tZW50IGlzIGFkZGVkIHRvIHRoZSBzdWJyZWNvcmQgbGVuZ3RoCi0JIGJ1dCBub3QgdG8gdGhlIHJlY29yZCBsZW5ndGggICovCi0gICAgICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0jZW5kaWYKLQlsZW5ndGgrKzsKLSAgICB9Ci0KLSAgLyogcHV0IGxlbmd0aCB0byBidWZmZXIgICovCi0gIFBSSVYob3V0cHV0X3NpemUpID0gUFJJVihsZW5ndGhfcG9zKTsKLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPT0gMCkKLSAgICB7Ci0jaWZuZGVmIFZNUwotCS8qIHdyaXRlIGxlbmd0aCBmaXJzdCwgc2VlIEZGX0ZPUkVJR04gaW4gdGhlIGlucHV0IHJvdXRpbmVzICovCi0gICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZikrMiwgMiwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7Ci0jZW5kaWYKLSAgICAgIGZ3cml0ZSAoUFJJVihvdXRwdXRfYnVmKSwgcmVhbF9zaXplLCAxLCAoRklMRSAqKWFiZmQtPmlvc3RyZWFtKTsKLQotICAgICAgUFJJVihvdXRwdXRfc2l6ZSkgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gcmVhbF9zaXplOwotICAgICAgUFJJVihwdXNoZWRfc2l6ZSkgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIEVuZCByZWNvcmQgb3V0cHV0ICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9lbmRcbiIpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogY2hlY2sgcmVtYWluaW5nIGJ1ZmZlciBzaXplCi0KLSAgIHJldHVybiB3aGF0J3MgbGVmdC4gICovCi0KLWludAotX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCBzaXplKQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgc2l6ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2NoZWNrKCVkKVxuIiwgc2l6ZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gKE1BWF9PVVRSRUNfU0laRSAtIChQUklWKG91dHB1dF9zaXplKSArIHNpemUgKyBNSU5fT1VUUkVDX0xVRlQpKTsKLX0KLQotCi0vKiBPdXRwdXQgYnl0ZSAoOCBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYnl0ZSglMDJ4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF84IChhYmZkLCB2YWx1ZSAmIDB4ZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDE7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgc2hvcnQgKDE2IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKCUwNHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSAmIDB4ZmZmZiwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gMjsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBsb25nICgzMiBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2xvbmcgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDQ7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgcXVhZCAoNjQgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfcXVhZCglMDE2bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzY0KGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSA4OwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGMtc3RyaW5nIGFzIGNvdW50ZWQgc3RyaW5nICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci1pbnQgbGVuOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jb3VudGVkKCVzKVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgbGVuID0gc3RybGVuICh2YWx1ZSk7Ci0gIGlmIChsZW4gPT0gMCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHplcm8gYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAobGVuID4gMjU1KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgbGVuICYgMHhmZik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXZhbHVlLCBsZW4pOwotfQotCi0KLS8qIE91dHB1dCBjaGFyYWN0ZXIgYXJlYSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGRhdGEsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBpbnQgbGVuZ3RoOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZHVtcCglZClcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAoUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpLCBkYXRhLCBsZW5ndGgpOwotICBQUklWKG91dHB1dF9zaXplKSArPSBsZW5ndGg7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBjb3VudCBieXRlcyBvZiB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIHZhbHVlLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGludCBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2ZpbGwodmFsICUwMnggdGltZXMgJWQpXG4iLCB2YWx1ZSwgY291bnQpOwotI2VuZGlmCi0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuOwotICBtZW1zZXQgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgdmFsdWUsIGNvdW50KTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gY291bnQ7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyogR2VuZXJhdGUgYSBsZW5ndGgtaGFzaGVkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byBtYXhsZW4gY2hhcnMpLiAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIGluLCBtYXhsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqaW47Ci0gICAgIGludCBtYXhsZW47Ci17Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgaW50IGluX2xlbjsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICBpbnQgaTsKLSAgc3RhdGljIGNoYXIgb3V0YnVmW0VPQkpfU19DX1NZTVNJWisxXTsKLSAgY2hhciAqb3V0ID0gb3V0YnVmOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1Zyg0LCAiX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFwiJXNcIlxuIiwgaW4pOwotI2VuZGlmCi0KLSAgaWYgKG1heGxlbiA+IEVPQkpfU19DX1NZTVNJWikKLSAgICBtYXhsZW4gPSBFT0JKX1NfQ19TWU1TSVo7Ci0KLSAgbmV3X25hbWUgPSBvdXQ7CQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLiAgKi8KLQotICAvKiBXZSBtYXkgbmVlZCB0byB0cnVuY2F0ZSB0aGUgc3ltYm9sLCBzYXZlIHRoZSBoYXNoIGZvciBsYXRlci4gICovCi0KLSAgaW5fbGVuID0gc3RybGVuIChpbik7Ci0KLSAgcmVzdWx0ID0gKGluX2xlbiA+IG1heGxlbikgPyBoYXNoX3N0cmluZyAoaW4pIDogMDsKLQotICBvbGRfbmFtZSA9IGluOwotCi0gIC8qIERvIHRoZSBsZW5ndGggY2hlY2tpbmcuICAqLwotCi0gIGlmIChpbl9sZW4gPD0gbWF4bGVuKQotICAgIHsKLSAgICAgIGkgPSBpbl9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpKQotCWkgPSBtYXhsZW4tOTsKLSAgICAgIGVsc2UKLQlpID0gbWF4bGVuOwotICAgIH0KLQotICBzdHJuY3B5IChvdXQsIGluLCBpKTsKLSAgaW4gKz0gaTsKLSAgb3V0ICs9IGk7Ci0KLSAgaWYgKChpbl9sZW4gPiBtYXhsZW4pCi0gICAgICAmJiBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKLSAgICBzcHJpbnRmIChvdXQsICJfJTA4bHgiLCByZXN1bHQpOwotICBlbHNlCi0gICAgKm91dCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICItLT4gWyVkXVwiJXNcIlxuIiwgc3RybGVuIChvdXRidWYpLCBvdXRidWYpOwotI2VuZGlmCi0KLSAgaWYgKGluX2xlbiA+IG1heGxlbgotCSYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JJiYgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpKQotICAgIHByaW50ZiAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLQotICByZXR1cm4gb3V0YnVmOwotfQotCi0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW5ld19zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg3LCAgIm5ld19zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3ltYm9sID09IDApCi0gICAgcmV0dXJuIHN5bWJvbDsKLSAgc3ltYm9sLT5uYW1lID0gbmFtZTsKLSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGVudGVyIGEgbmV3IHByaXZhdGUgc3ltYm9sLiAgKi8KLQotdm1zX3N5bWJvbF9lbnRyeSAqCi1fYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICAiX2JmZF92bXNfZW50ZXJfc3ltYm9sICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCi0gIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDgsICAiY3JlYXRpbmcgaGFzaCBlbnRyeSBmb3IgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0gICAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoZW50cnkgIT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW1ib2w7Ci0JICBzeW1ib2wgPSBuZXdfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzeW1ib2wgIT0gMCkKLQkgICAgewotCSAgICAgIGVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JICAgICAgUFJJVihnc2Rfc3ltX2NvdW50KSsrOwotCSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZW50cnkgPSAwOwotCX0KLSAgICAgIGVsc2UKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImZhaWxlZCB0byBlbnRlciAlcyIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJmb3VuZCBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICItPiBlbnRyeSAlcCwgZW50cnktPnN5bWJvbCAlcFxuIiwgZW50cnksIGVudHJ5LT5zeW1ib2wpOwotI2VuZGlmCi0gIHJldHVybiBlbnRyeTsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtdGlyLmMgYi9iZmQvdm1zLXRpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRiMWIzLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtdGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDg3ICswLDAgQEAKLS8qIHZtcy10aXIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVElSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBhYmJyZXZpYXRpb25zIGFyZSB1c2VkOgotCi0JY3MJY291bnRlZCBzdHJpbmcgKGFzY2lpIHN0cmluZyB3aXRoIGxlbmd0aCBieXRlKQotCWJ5CWJ5dGUgKDEgYnl0ZSkKLQlzaAlzaG9ydCAoMiBieXRlLCAxNiBiaXQpCi0JbHcJbG9uZ3dvcmQgKDQgYnl0ZSwgMzIgYml0KQotCXF3CXF1YWR3b3JkICg4IGJ5dGUsIDY0IGJpdCkKLQlkYQlkYXRhIHN0cmVhbSAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotc3RhdGljIHZvaWQgaW1hZ2Vfc2V0X3B0ciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBwc2VjdCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9pbmNfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9kdW1wIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfYiBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfdyBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfbCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGltYWdlX3dyaXRlX3EgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2hlY2tfc2VjdGlvbiAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9mZnNldDsKLQotICBvZmZzZXQgPSBQUklWKGltYWdlX3B0cikgLSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50czsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAob2Zmc2V0ICsgc2l6ZSkgPiBQUklWKGltYWdlX3NlY3Rpb24pLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPSBiZmRfcmVhbGxvYyAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMsIG9mZnNldCArIHNpemUpOwotICAgICAgaWYgKFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzID09IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJObyBNZW0gISIpKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5fcmF3X3NpemUgPSBvZmZzZXQgKyBzaXplOwotICAgICAgUFJJVihpbWFnZV9wdHIpID0gUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgKyBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiByb3V0aW5lcyB0byBmaWxsIHNlY3Rpb25zIGNvbnRlbnRzIGR1cmluZyB0aXIvZXRpciByZWFkICovCi0KLS8qIEluaXRpYWxpemUgaW1hZ2UgYnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfc2V0X3B0ciAoYWJmZCwgcHNlY3QsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcHNlY3Q7Ci0gICAgIHVxdWFkIG9mZnNldDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJpbWFnZV9zZXRfcHRyICglZD0lcywgJWQpXG4iLAotCQlwc2VjdCwgUFJJVihzZWN0aW9ucylbcHNlY3RdLT5uYW1lLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpID0gUFJJVihzZWN0aW9ucylbcHNlY3RdLT5jb250ZW50cyArIG9mZnNldDsKLSAgUFJJVihpbWFnZV9zZWN0aW9uKSA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0XTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEluY3JlbWVudCBpbWFnZSBidWZmZXIgcG9pbnRlciBieSBvZmZzZXQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9pbmNfcHRyIChhYmZkLCBvZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX2luY19wdHIgKCVkKVxuIiwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gIFBSSVYoaW1hZ2VfcHRyKSArPSBvZmZzZXQ7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIER1bXAgbXVsdGlwbGUgYnl0ZXMgdG8gc2VjdGlvbiBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2R1bXAgKGFiZmQsIHB0ciwgc2l6ZSwgb2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgaW50IHNpemU7Ci0gICAgaW50IG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgImltYWdlX2R1bXAgZnJvbSAoJXAsICVkKSB0byAoJXApXG4iLCBwdHIsIHNpemUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgcHRyLCBzaXplLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCBzaXplKSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKnB0cisrOwotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgYnl0ZSB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2IoJTAyeClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAxKSkKLSAgICByZXR1cm47Ci0KLSAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKHZhbHVlICYgMHhmZik7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSAyLWJ5dGUgd29yZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3cgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICJpbWFnZV93cml0ZV93KCUwNHgpXG4iLCAoaW50KXZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgMikpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsMTYgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gMjsKLQotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgNC1ieXRlIGxvbmcgdG8gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9sIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2wgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA0KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwzMiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA0OwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA4LWJ5dGUgcXVhZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3EgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3EgKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgOCkpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsNjQgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gODsKLQotICByZXR1cm47Ci19Ci0MCi0KLSNkZWZpbmUgSElHSEJJVChvcCkgKChvcCAmIDB4ODAwMDAwMDBMKSA9PSAweDgwMDAwMDAwTCkKLQotLyogZXRpcl9zdGEKLSAgCi0gICB2bXMgc3RhY2sgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTggb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RhIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHN0YWNrICovCi0KLSAgICAgIC8qIHN0YWNrIGdsb2JhbAotCSAgIGFyZzogY3MJc3ltYm9sIG5hbWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSBvZiBzeW1ib2wgKGhpZ2ggYml0cyBzZXQgdG8gMCkgICovCi0KLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0dCTDoKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgIkVUSVJfU19DX1NUQV9HQkw6IG5vIHN5bWJvbCBcIiVzXCJcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTAsIC0xKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSksIC0xKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgbG9uZ3dvcmQKLQkgICBhcmc6IGx3CXZhbHVlCi0KLQkgICBzdGFjayAzMiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTFc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBxdwl2YWx1ZQotCi0JICAgc3RhY2sgNjQgYml0IHZhbHVlIG9mIHN5bWJvbAkgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUVc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsNjQocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0Ci0JICAgYXJnOiBsdwlzZWN0aW9uIGluZGV4Ci0JICAJcXcJc2lnbmVkIHF1YWR3b3JkIG9mZnNldCAobG93IDMyIGJpdHMpCi0KLQkgICBzdGFjayBxdyBhcmd1bWVudCBhbmQgc2VjdGlvbiBpbmRleAotCSAgIChzZWUgRVRJUl9TX0NfU1RPX09GRiwgRVRJUl9TX0NfQ1RMX1NFVFJCKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUFE6Ci0gIAl7Ci0JICB1cXVhZCBkdW1teTsKLQkgIHVuc2lnbmVkIGludCBwc2VjdDsKLQotCSAgcHNlY3QgPSBiZmRfZ2V0bDMyIChwdHIpOwotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGR1bW15ID0gYmZkX2dldGw2NCAocHRyKzQpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQkvKiBhbGwgbm90IHN1cHBvcnRlZCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTEk6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9NT0Q6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9DS0FSRzoKLQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5zdXBwb3J0ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSB0cnVlXG4iKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICAgZXRpcl9zdG8KLSAgCi0gICB2bXMgc3RvcmUgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTkgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RvIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0byAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgICAgLyogc3RvcmUgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0I6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiBieXRlIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHdvcmQ6IHBvcCBzdGFjaywgd3JpdGUgd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19XOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0jaWYgMAotICAgICAgaWYgKGlzX3NoYXJlKQkJLyogRklYTUUgKi8KLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVE9fQjogd29yZCBmaXh1cHMgbm90IHN1cHBvcnRlZCIpOwotI2VuZGlmCi0gICAgICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGxvbmd3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIGxvbmd3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0xXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBxdWFkd29yZDogcG9wIHN0YWNrLCB3cml0ZSBxdWFkd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19RVzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLSAgICAgIGltYWdlX3dyaXRlX3EgKGFiZmQsIGR1bW15KTsJCS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZSByZXBlYXRlZDogcG9wIHN0YWNrIGZvciByZXBlYXQgY291bnQKLQkgYXJnOiBsdwlieXRlIGNvdW50Ci0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU1SOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyKzQsIHNpemUsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGdsb2JhbDogd3JpdGUgc3ltYm9sIHZhbHVlCi0JIGFyZzogY3MJZ2xvYmFsIHN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBjb2RlIGFkZHJlc3M6IHdyaXRlIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgKHByb2NlZHVyZSkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19DQToKLSAgICAgIHsKLQl2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQljaGFyICpuYW1lOwotCi0JbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fQ0E6IG5vIHN5bWJvbCBcIiVzXCIiKSwKLQkJCQkgICBuYW1lKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX3EgKGFiZmQsICh1cXVhZCkoZW50cnktPnN5bWJvbC0+dmFsdWUpKTsJLyogRklYTUUsIHJlbG9jICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbm90IHN1cHBvcnRlZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1JCOgotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0FCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fUkIvQUI6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIHN0b3JlIG9mZnNldCB0byBwc2VjdDogcG9wIHN0YWNrLCBhZGQgbG93IDMyIGJpdHMgdG8gYmFzZSBvZiBwc2VjdAotICAgICAgIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX09GRjoKLSAgICAgIHsKLQl1cXVhZCBxOwotCWludCBwc2VjdDsKLQotCXEgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JcSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCWltYWdlX3dyaXRlX3EgKGFiZmQsIHEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZQotCSBhcmc6IGx3CWNvdW50IG9mIGJ5dGVzCi0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU06Ci0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gYmZkX2dldGwzMiAocHRyKTsKLQlpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdGhpcyBjb2RlIGlzICdyZXNlcnZlZCB0byBkaWdpdGFsJyBhY2NvcmRpbmcgdG8gdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCwKLQkgaG93ZXZlciBpdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIERFQyBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIGluIHRoZSBpbmNsdWRlIGZpbGUuCi0JIEZJWE1FLCBzaW5jZSB0aGUgZm9sbG93aW5nIGlzIGp1c3QgYSBndWVzcwotCSBzdG9yZSBnbG9iYWwgbG9uZ3dvcmQ6IHN0b3JlIDMyYml0IHZhbHVlIG9mIHN5bWJvbAotCSBhcmc6IGNzCXN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMX0xXOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RPX0dCTF9MVzogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpMCk7CS8qIEZJWE1FLCByZWxvYyAqLwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX2wgKGFiZmQsICh1bnNpZ25lZCBsb25nKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFBfUFNCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19ISU5UX0dCTDogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9QUzoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICAgYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICAgYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICAgYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gIAotICAgc2VlIHRhYmxlIEItMTAgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfb3ByIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyBvcDEsIG9wMjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfb3ByICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogb3BlcmF0aW9uICovCi0KLSAgICAgIC8qIG5vLW9wICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTk9QOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGFkZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FERDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3VidHJhY3QgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9TVUI6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG11bHRpcGx5ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTVVMOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkaXZpZGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ESVY6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGlmIChvcDIgPT0gMCkKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMEwsIC0xKTsKLSAgICAgIGVsc2UKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGFuZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FORDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBpbmNsdXNpdmUgb3IJICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9JT1I6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgZXhjbHVzaXZlIG9yICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfRU9SOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBuZWdhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ORUc6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNvbXBsZW1lbnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9DT006Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiAtMUwpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogaW5zZXJ0IGZpZWxkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfSU5TVjoKLSAgICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhcml0aG1ldGljIHNoaWZ0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQVNIOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBpZiAob3AyIDwgMCkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0Jb3AxID4+PSAtb3AyOwotICAgICAgZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQlvcDEgPDw9IG9wMjsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB1bnNpZ25lZCBzaGlmdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1VTSDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1VTSDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByb3RhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ST1Q6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ST1Q6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc2VsZWN0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfU0VMOgotICAgICAgaWYgKChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCkgJiAweDAxTCkKLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JFREVGOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGVmaW5lIGEgbGl0ZXJhbCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RGTElUOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfREZMSVQ6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIE9QUiBjbWQgJWQiKSwgY21kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBjb250cm9sIGNvbW1hbmRzCi0gIAotICAgc2VlIHRhYmxlIEItMTEgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfY3RsIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkCSBkdW1teTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9jdGwgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NFVFJCOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlOiBpbmNyZW1lbnQgaW1hZ2UgbG9jYXRpb24gY291bnRlciBieSBvZmZzZXQKLQkgYXJnOiBsdwlvZmZzZXQgdmFsdWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9BVUdSQjoKLSAgICAgIGR1bW15ID0gYmZkX2dldGwzMiAocHRyKTsKLSAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkZWZpbmUgbG9jYXRpb246IHBvcCBpbmRleCwgc2F2ZSBsb2NhdGlvbiBjb3VudGVyIHVuZGVyIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0RGTE9DOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU1RMT0M6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RhY2sgZGVmaW5lZCBsb2NhdGlvbjogcG9wIGluZGV4LCBwdXNoIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TVEtETDoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBzdG9yZSBjb25kaXRpb25hbCBjb21tYW5kcwotICAKLSAgIHNlZSB0YWJsZSBCLTEyIGFuZCBCLTEzIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCi0KLXN0YXRpYyBib29sZWFuCi1ldGlyX3N0YyAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YyAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIDIwMCBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xQOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjAxIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciB3aXRoIFByb2NlZHVyZSBTaWduYXR1cmUKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGNzCXByb2NlZHVyZSBuYW1lCi0JIGJ5CXNpZ25hdHVyZSBsZW5ndGgKLQkgZGEJc2lnbmF0dXJlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFBfUFNCOgotICAgICAgaW1hZ2VfaW5jX3B0ciAoYWJmZCwgMTYpOwkvKiBza2lwIGVudHJ5LHByb2N2YWwgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDIgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJZ2xvYmFsIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjAzIFN0b3JlLWNvbmRpdGlvbmFsIENvZGUgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19HQ0E6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjA0IFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGx3CXBzZWN0IGluZGV4Ci0JIHF3CW9mZnNldCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX1BTOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfUFM6IG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogMjA1IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTk9QX0dCTDoKLQotICAgICAgLyogMjA2IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfUFM6Ci0KLSAgICAgIC8qIDIwNyBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JTUl9HQkw6Ci0KLSAgICAgIC8qIDIwOCBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX1BTOgotCi0gICAgICAvKiAyMDkgU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MREFfR0JMOgotCi0gICAgICAvKiAyMTAgU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MREFfUFM6Ci0KLSAgICAgIC8qIDIxMSBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX0dCTDoKLQotICAgICAgLyogMjEyIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JPSF9QUzoKLQotICAgICAgLyogMjEzIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTkJIX0dCTDoKLQotICAgICAgLyogMjE0IFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTkJIX1BTOgotLyogRklYTUUgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUQ194eDogKCVkKSBub3Qgc3VwcG9ydGVkIiwgY21kKTsgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAgIlJlc2VydmVkIFNUQyBjbWQgJWQiLCBjbWQpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1uZXdfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IGlkeDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGNoYXIgc25hbWVbMTZdOwotICBjaGFyICpuYW1lOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAgIm5ld19zZWN0aW9uICVkXG4iLCBpZHgpOwotI2VuZGlmCi0gIHNwcmludGYgKHNuYW1lLCBTRUNUSU9OX05BTUVfVEVNUExBVEUsIGlkeCk7Ci0KLSAgbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc25hbWUpICsgMSk7Ci0gIGlmIChuYW1lID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgc25hbWUpOwotCi0gIHNlY3Rpb24gPSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChzZWN0aW9uID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDYsICAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIsIG5hbWUpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2VjdGlvbi0+X3Jhd19zaXplID0gMDsKLSAgc2VjdGlvbi0+dm1hID0gMDsKLSAgc2VjdGlvbi0+Y29udGVudHMgPSAwOwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSAwOwotICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLSAgc2VjdGlvbi0+aW5kZXggPSBpZHg7Ci0KLSAgcmV0dXJuIHNlY3Rpb247Ci19Ci0KLQotc3RhdGljIGludAotYWxsb2Nfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAgImFsbG9jX3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLQotICBQUklWKHNlY3Rpb25zKSA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIChpZHgrMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoUFJJVihzZWN0aW9uX2NvdW50KSA8PSBpZHgpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPSBuZXdfc2VjdGlvbiAoYWJmZCwgUFJJVihzZWN0aW9uX2NvdW50KSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpKys7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0aXJfc3RhCi0gKgotICogdmF4IHN0YWNrIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0YV94eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTMgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdGEgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBpbnQgY21kID0gKnB0cisrOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0YSAlZFxuIiwgY21kKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgLyogc3RhY2sgKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfR0JMOgotCS8qCi0JICogc3RhY2sgZ2xvYmFsCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKQotCSAqLwotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0KLSAgICAgICAgICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NCOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlLCBzaWduIGV4dGVuZCB0byAzMiBiaXQKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NXOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFc6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgbG9uZ3dvcmQKLQkgKiBhcmc6IGx3CXZhbHVlCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZyliZmRfZ2V0bDMyIChwdHIpLCAtMSk7Ci0JcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BCOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGJ5dGUgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWJ5CXNpZ25lZCBieXRlIG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BCKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gKGxvbmcpKnB0cisrOwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BXOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUFc6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgd29yZCBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJc2gJc2lnbmVkIHNob3J0IG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BXKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gYmZkX2dldGwxNihwdHIpOyBwdHIrPTI7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUEw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQTDoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBsb25nIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglsdwlzaWduZWQgbG9uZ3dvcmQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEwpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOyBwdHIgKz0gNDsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VQjoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlCi0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKnB0cisrLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VVzoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZyliZmRfZ2V0bDE2KHB0ciksIC0xKTsKLQlwdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0JGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stZnJvbS1pbWFnZSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfRVBNOgotCS8qCi0JICogc3RhY2sgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1lbnRyeS1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQ0tBUkc6Ci0JLyoKLQkgKiBjb21wYXJlIHByb2NlZHVyZSBhcmd1bWVudAotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKglieQlhcmd1bWVudCBpbmRleAotCSAqCWRhCWFyZ3VtZW50IGRlc2NyaXB0b3IKLQkgKgotCSAqIGNvbXBhcmUgYXJndW1lbnQgZGVzY3JpcHRvciB3aXRoIHN5bWJvbCBhcmd1bWVudCAoQVJHJFZfUEFTU01FQ0gpCi0JICogYW5kIHN0YWNrIFRSVUUgKGFyZ3MgbWF0Y2gpIG9yIEZBTFNFIChhcmdzIGRvbnQgbWF0Y2gpIHZhbHVlCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUEFTU01FQ0ggbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDFMLCAtMSk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFNZOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIHZhbHVlCi0JICogYXJnOglzaAllbnZpcm9ubWVudCBpbmRleAotCSAqCWNzCXN5bWJvbCBuYW1lCi0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1sb2NhbC1zeW1ib2wgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MSVQ6Ci0JLyoKLQkgKiBzdGFjayBsaXRlcmFsCi0gCSAqIGFyZzoJYnkJbGl0ZXJhbCBpbmRleAotCSAqCi0JICogc3RhY2sgbGl0ZXJhbAotCSAqLwotCXB0cisrOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MRVBNOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIGVudHJ5IHBvaW50IG1hc2sKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIHB0clstMV0pOwotCXJldHVybiBOVUxMOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiB0aXJfc3RvCi0gKgotICogdmF4IHN0b3JlIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0b194eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTQgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdG8gKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgc2l6ZTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0byAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1NCOgotCS8qCi0JICogc3RvcmUgc2lnbmVkIGJ5dGU6IHBvcCBzdGFjaywgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU1c6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwkvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xXOgotCS8qCi0JICogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQkQ6Ci0JLyoKLQkgKiBzdG9yZSBieXRlIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMSwgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMSk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1dEOgotCS8qCi0JICogc3RvcmUgd29yZCBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzIsIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDIpOwotCWltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19MRDoKLQkvKgotCSAqIHN0b3JlIGxvbmcgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYys0LCB3cml0ZSBsb25nCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyA0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xJOgotCS8qCi0JICogc3RvcmUgc2hvcnQgbGl0ZXJhbDogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSURSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgZGF0YSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSUNSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgMHg5Zik7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SSVZCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIHZhcmlhYmxlIGJ5dGVzCi0JICogMS1ieXRlIGNvdW50IG4gZmllbGQgZm9sbG93ZWQgYnkgbiBieXRlcyBvZiBkYXRhCi0JICogcG9wIHN0YWNrLCB3cml0ZSBuIGJ5dGVzIDxzdGFjaz4gdGltZXMKLQkgKi8KLQlzaXplID0gKnB0cisrOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCAwKTsKLQlwdHIgKz0gc2l6ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQjoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVzoKLQkvKgotCSAqIHN0b3JlIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SQjoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVzoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JMOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19WUFM6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1VTQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVUI6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUElSUjoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaW1wbGVtZW50ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogc3RhY2sgb3BlcmF0b3IgY29tbWFuZHMKLSAqIGFsbCAzMiBiaXQgc2lnbmVkIGFyaXRobWV0aWMKLSAqIGFsbCB3b3JkIGp1c3QgbGlrZSBhIHN0YWNrIGNhbGN1bGF0b3IKLSAqIGFyZ3VtZW50cyBhcmUgcG9wcGVkIGZyb20gc3RhY2ssIHJlc3VsdHMgYXJlIHB1c2hlZCBvbiBzdGFjawotICoKLSAqIHNlZSB0YWJsZSA3LTUgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9vcHIgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX29wciAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gIC8qIG9wZXJhdGlvbiAqLwotICAgICAgY2FzZSBUSVJfU19DX09QUl9OT1A6Ci0JLyoKLQkgKiBuby1vcAotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQUREOgotCS8qCi0JICogYWRkCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TVUI6Ci0JLyoKLQkgKiBzdWJ0cmFjdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfTVVMOgotCS8qCi0JICogbXVsdGlwbHkKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RJVjoKLQkvKgotCSAqIGRpdmlkZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAob3AyID09IDApCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykwTCwgLTEpOwotCWVsc2UKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BTkQ6Ci0JLyoKLQkgKiBsb2dpY2FsIGFuZAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU9SOgotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JLyoKLQkgKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgotCSAqLwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0VPUjoKLQkvKgotCSAqIGxvZ2ljYWwgZXhjbHVzaXZlIG9yCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ORUc6Ci0JLyoKLQkgKiBuZWdhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQ09NOgotCS8qCi0JICogY29tcGxlbWVudAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0lOU1Y6Ci0JLyoKLQkgKiBpbnNlcnQgZmllbGQKLQkgKi8KLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAgKCJUSVJfU19DX09QUl9JTlNWIGluY29tcGxldGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FTSDoKLQkvKgotCSAqIGFyaXRobWV0aWMgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1VTSDoKLQkvKgotCSAqIHVuc2lnbmVkIHNoaWZ0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChISUdIQklUKG9wMSkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfVVNIIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ST1Q6Ci0JLyoKLQkgKiByb3RhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQoMCkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TRUw6Ci0JLyoKLQkgKiBzZWxlY3QKLQkgKi8KLQlpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQllbHNlCi0JICB7Ci0JICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMSwgLTEpOwotCSAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfUkVERUY6Ci0JLyoKLQkgKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbgotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUkVERUYgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RGTElUOgotCS8qCi0JICogZGVmaW5lIGEgbGl0ZXJhbAotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jdGwgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotLyoKLSAqIGNvbnRyb2wgY29tbWFuZHMKLSAqCi0gKiBzZWUgdGFibGUgNy02IG9mIHRoZSBWQVgvVk1TIGxpbmtlciBtYW51YWwKLSAqLwotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfY3RsICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU0VUUkI6Ci0JLyoKLQkgKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICB7Ci0JICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgIH0KLQlpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0FVR1JCOgotCS8qCi0JICogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSAqIGFyZzogbHcJb2Zmc2V0IHZhbHVlCi0JICovCi0JZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9ERkxPQzoKLQkvKgotCSAqIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9ERkxPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU1RMT0M6Ci0JLyoKLQkgKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVElSX1NfQ19DVExfU1RLREw6Ci0JLyoKLQkgKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9TVEtETCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogaGFuZGxlIGNvbW1hbmQgZnJvbSBUSVIgc2VjdGlvbgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jbWQgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICB1bnNpZ25lZCBjaGFyICogKCpleHBsYWluKShiZmQgKiwgdW5zaWduZWQgY2hhciAqKTsKLSAgfSB0aXJfdGFibGVbXSA9IHsKLSAgICB7IDAsCQkgVElSX1NfQ19NQVhTVEFDT0QsIHRpcl9zdGEgfQotICAgLHsgVElSX1NfQ19NSU5TVE9DT0QsIFRJUl9TX0NfTUFYU1RPQ09ELCB0aXJfc3RvIH0KLSAgICx7IFRJUl9TX0NfTUlOT1BSQ09ELCBUSVJfU19DX01BWE9QUkNPRCwgdGlyX29wciB9Ci0gICAseyBUSVJfU19DX01JTkNUTENPRCwgVElSX1NfQ19NQVhDVExDT0QsIHRpcl9jdGwgfQotICAgLHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAidGlyX2NtZCAlZC8leFxuIiwgKnB0ciwgKnB0cik7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgaWYgKCpwdHIgJiAweDgwKQkJCQkvKiBzdG9yZSBpbW1lZGlhdGUgKi8KLSAgICB7Ci0gICAgICBpID0gMTI4IC0gKCpwdHIrKyAmIDB4N2YpOwotICAgICAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBpLCAwKTsKLSAgICAgIHB0ciArPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh0aXJfdGFibGVbaV0ubWluY29kID49IDApCi0JewotCSAgaWYgKCAodGlyX3RhYmxlW2ldLm1pbmNvZCA8PSAqcHRyKSAKLQkgICAgJiYgKCpwdHIgPD0gdGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JICAgIHsKLQkgICAgICBwdHIgPSB0aXJfdGFibGVbaV0uZXhwbGFpbiAoYWJmZCwgcHRyKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaSsrOwotCX0KLSAgICAgIGlmICh0aXJfdGFibGVbaV0ubWluY29kIDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iaiBjb2RlICVkIG5vdCBmb3VuZCIpLCAqcHRyKTsKLQkgIHB0ciA9IDA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qIGhhbmRsZSBjb21tYW5kIGZyb20gRVRJUiBzZWN0aW9uICAqLwotCi1zdGF0aWMgaW50Ci1ldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgbWluY29kOwotICAgIGludCBtYXhjb2Q7Ci0gICAgYm9vbGVhbiAoKmV4cGxhaW4pIFBBUkFNUygoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqKSk7Ci0gIH0gZXRpcl90YWJsZVtdID0gewotICAgIHsgRVRJUl9TX0NfTUlOU1RBQ09ELCBFVElSX1NfQ19NQVhTVEFDT0QsIGV0aXJfc3RhIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVE9DT0QsIEVUSVJfU19DX01BWFNUT0NPRCwgZXRpcl9zdG8gfSwKLSAgICB7IEVUSVJfU19DX01JTk9QUkNPRCwgRVRJUl9TX0NfTUFYT1BSQ09ELCBldGlyX29wciB9LAotICAgIHsgRVRJUl9TX0NfTUlOQ1RMQ09ELCBFVElSX1NfQ19NQVhDVExDT0QsIGV0aXJfY3RsIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVENDT0QsIEVUSVJfU19DX01BWFNUQ0NPRCwgZXRpcl9zdGMgfSwKLSAgICB7IC0xLCAtMSwgTlVMTCB9Ci0gIH07Ci0KLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiZXRpcl9jbWQgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICB3aGlsZSAoZXRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoIChldGlyX3RhYmxlW2ldLm1pbmNvZCA8PSBjbWQpIAotCSYmIChjbWQgPD0gZXRpcl90YWJsZVtpXS5tYXhjb2QpKQotCXsKLQkgIGlmICghZXRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBjbWQsIHB0cikpCi0JICAgIHJldHVybiAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZDogPSAwXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKE9CSiRDX1RJUikKLSAgIGhhbmRsZSB0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX3RpciAoYWJmZCwgcHRyLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotewotICB1bnNpZ25lZCBjaGFyICptYXhwdHI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX3RpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBwdHIgPSB0aXJfY21kIChhYmZkLCBwdHIpOwotICAgICAgaWYgKHB0ciA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzIChFT0JKJENfRVRJUikKLSAgIGhhbmRsZSBldGlyIHJlY29yZCAgKi8KLQotc3RhdGljIGludAotYW5hbHl6ZV9ldGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIGludCBjbWQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ICVkIGJ5dGVzXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgbWF4cHRyID0gcHRyICsgbGVuZ3RoOwotCi0gIHdoaWxlIChwdHIgPCBtYXhwdHIpCi0gICAgewotICAgICAgY21kID0gYmZkX2dldGwxNiAocHRyKTsKLSAgICAgIGxlbmd0aCA9IGJmZF9nZXRsMTYgKHB0ciArIDIpOwotICAgICAgcmVzdWx0ID0gZXRpcl9jbWQgKGFiZmQsIGNtZCwgcHRyKzQpOwotICAgICAgaWYgKHJlc3VsdCAhPSAwKQotCWJyZWFrOwotICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ID0gJWRcbiIsIHJlc3VsdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRVRJUiByZWNvcmQKLSAgCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJUSVIvRVRJUlxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FVElSOgotCVBSSVYodm1zX3JlYykgKz0gNDsJLyogc2tpcCB0eXBlLCBzaXplICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gNDsKLQlyZXN1bHQgPSBhbmFseXplX2V0aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19USVI6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwkvKiBza2lwIHR5cGUgKi8KLQlQUklWKHJlY19zaXplKSAtPSAxOwotCXJlc3VsdCA9IGFuYWx5emVfdGlyIChhYmZkLCBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IC0xOwotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRURCRyByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJEQkcvRURCR1xuIik7Ci0jZW5kaWYKLQotICBhYmZkLT5mbGFncyB8PSAoSEFTX0RFQlVHIHwgSEFTX0xJTkVOTyk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgRVRCVCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRCVC9FVEJUXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgTE5LIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiTE5LXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotDAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCQkJCQkJCQkJKi8KLS8qCVdSSVRFIEVUSVIgU0VDVElPTgkJCQkJCSovCi0vKgkJCQkJCQkJCSovCi0vKgl0aGlzIGlzIHN0aWxsIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgdGhlcmVmb3JlIG5vdCBkb2N1bWVudGVkCSovCi0vKgkJCQkJCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBzdGFydF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCwgdXF1YWQgb2Zmc2V0LCBib29sZWFuIGp1c3RvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIHN0b19pbW0gUEFSQU1TICgoYmZkICphYmZkLCB2bXNfc2VjdGlvbiAqc3B0ciwgYmZkX3ZtYSB2YWRkciwgaW50IGluZGV4KSk7Ci1zdGF0aWMgdm9pZCBlbmRfZXRpcl9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0gICAgIGJmZF92bWEgdmFkZHI7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqY3B0cjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgInN0b19pbW0gJWQgYnl0ZXNcbiIsIHNwdHItPnNpemUpOwotICBfYmZkX2hleGR1bXAgKDksIHNwdHItPmNvbnRlbnRzLCAoaW50KXNwdHItPnNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgc3NpemUgPSBzcHRyLT5zaXplOwotICBjcHRyID0gc3B0ci0+Y29udGVudHM7Ci0KLSAgd2hpbGUgKHNzaXplID4gMCkKLSAgICB7Ci0KLSAgICAgIHNpemUgPSBzc2l6ZTsJCQkJLyogdHJ5IGFsbCB0aGUgcmVzdCAqLwotCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCBzaXplKSA8IDApCi0JewkJCQkJLyogZG9lc24ndCBmaXQsIHNwbGl0ICEgKi8KLQkgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgaW5kZXgsIHZhZGRyLCBmYWxzZSk7Ci0JICBzaXplID0gX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAwKTsJLyogZ2V0IG1heCBzaXplICovCi0JICBpZiAoc2l6ZSA+IHNzaXplKQkJCS8qIG1vcmUgdGhhbiB3aGF0J3MgbGVmdCA/ICovCi0JICAgIHNpemUgPSBzc2l6ZTsKLQl9Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfU1RPX0lNTSwgLTEpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzaXplKSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgY3B0ciwgc2l6ZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoMTAsICJkdW1wZWQgJWQgYnl0ZXNcbiIsIHNpemUpOwotICAgICAgX2JmZF9oZXhkdW1wICgxMCwgY3B0ciwgKGludClzaXplLCAoaW50KXZhZGRyKTsKLSNlbmRpZgotCi0gICAgICB2YWRkciArPSBzaXplOwotICAgICAgc3NpemUgLT0gc2l6ZTsKLSAgICAgIGNwdHIgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdGFydCBFVElSIHJlY29yZCBmb3Igc2VjdGlvbiAjaW5kZXggYXQgdmlydHVhbCBhZGRyIG9mZnNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1zdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgaW5kZXgsIG9mZnNldCwganVzdG9mZnNldCkKLSAgICBiZmQgKmFiZmQ7Ci0gICAgaW50IGluZGV4OwotICAgIHVxdWFkIG9mZnNldDsKLSAgICBib29sZWFuIGp1c3RvZmZzZXQ7Ci17Ci0gIGlmICghanVzdG9mZnNldCkKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VUSVIsIC0xKTsJLyogb25lIEVUSVIgcGVyIHNlY3Rpb24gKi8KLSAgICAgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVEFfUFEsIC0xKTsJLyogcHVzaCBzdGFydCBvZmZzZXQgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKWluZGV4KTsKLSAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsICh1cXVhZClvZmZzZXQpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfQ1RMX1NFVFJCLCAtMSk7CS8qIHN0YXJ0ID0gcG9wICgpICovCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIGVuZCBldGlyIHJlY29yZCAgKi8KLXN0YXRpYyB2b2lkCi1lbmRfZXRpcl9yZWNvcmQgKGFiZmQpCi0gICAgYmZkICphYmZkOwotewotICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7IAotfQotCi0vKiB3cml0ZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotICBpbnQgbmV4dG9mZnNldDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90aXIgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgNCk7Ci0KLSAgbmV4dG9mZnNldCA9IDA7Ci0gIFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID0gMTsKLQotICAvKiBkdW1wIGFsbCBvdGhlciBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAid3JpdGluZyAlZC4gc2VjdGlvbiAnJXMnICglZCBieXRlcylcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KShzZWN0aW9uLT5fcmF3X3NpemUpKTsNCi0jZW5kaWYKLQotICAgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoKGkgPSBzZWN0aW9uLT5yZWxvY19jb3VudCkgPD0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiKSwKLQkJCQkgICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICoqcnB0cjsKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIiVkIHJlbG9jYXRpb25zOlxuIiwgaSk7Ci0JICAgICAgcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCSAgICAgIHdoaWxlIChpLS0gPiAwKQotCQl7Ci0JCSAgX2JmZF92bXNfZGVidWcgKDQsICJzeW0gJXMgaW4gc2VjICVzLCB2YWx1ZSAlMDhseCwgYWRkciAlMDhseCwgb2ZmICUwOGx4LCBsZW4gJWQ6ICVzXG4iLAotCQkJICAgICAgKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+c2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgIChsb25nKSgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT52YWx1ZSwKLQkJCSAgICAgICgqcnB0ciktPmFkZHJlc3MsICgqcnB0ciktPmFkZGVuZCwKLQkJCSAgICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSgoKnJwdHIpLT5ob3d0byksCi0JCQkgICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCSAgcnB0cisrOwotCQl9Ci0JICAgIH0KLSNlbmRpZgotCX0KLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkpCi0JewotCSAgYmZkX3ZtYSB2YWRkcjsJCS8qIHZpcnR1YWwgYWRkciBpbiBzZWN0aW9uICovCi0KLQkgIHNwdHIgPSBfYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbi0+aW5kZXgpOwotCSAgaWYgKHNwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHZhZGRyID0gKGJmZF92bWEpKHNwdHItPm9mZnNldCk7Ci0KLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwgKHVxdWFkKSBzcHRyLT5vZmZzZXQsCi0JCQkgICAgIGZhbHNlKTsKLQotCSAgd2hpbGUgKHNwdHIgIT0gTlVMTCkJCQkJLyogb25lIFNUQV9QUSwgQ1RMX1NFVFJCIHBlciB2bXNfc2VjdGlvbiAqLwotCSAgICB7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCQkJLyogY2hlY2sgZm9yIHJlbG9jcyAqLwotCQl7Ci0JCSAgYXJlbGVudCAqKnJwdHIgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQkJICBpbnQgaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCQkgIGZvciAoOzspCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgYWRkciA9ICgqcnB0ciktPmFkZHJlc3M7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgbGVuID0gYmZkX2dldF9yZWxvY19zaXplICgoKnJwdHIpLT5ob3d0byk7Ci0JCSAgICAgIGlmIChzcHRyLT5vZmZzZXQgPCBhZGRyKQkJLyogc3B0ciBzdGFydHMgYmVmb3JlIHJlbG9jICovCi0JCQl7Ci0JCQkgIGJmZF9zaXplX3R5cGUgYmVmb3JlID0gYWRkciAtIHNwdHItPm9mZnNldDsKLQkJCSAgaWYgKHNwdHItPnNpemUgPD0gYmVmb3JlKQkJLyogY29tcGxldGUgYmVmb3JlICovCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UJCQkJLyogcGFydGx5IGJlZm9yZSAqLwotCQkJICAgIHsKLQkJCSAgICAgIGludCBhZnRlciA9IHNwdHItPnNpemUgLSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5zaXplID0gYmVmb3JlOwotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+c2l6ZSA9IGFmdGVyOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc3B0ci0+b2Zmc2V0ID09IGFkZHIpCS8qIHNwdHIgc3RhcnRzIGF0IHJlbG9jICovCi0JCQl7Ci0JCQkgIGFzeW1ib2wgKnN5bSA9ICooKnJwdHIpLT5zeW1fcHRyX3B0cjsKLQkJCSAgYXNlY3Rpb24gKnNlYyA9IHN5bS0+c2VjdGlvbjsKLQotCQkJICBzd2l0Y2ggKCgqcnB0ciktPmhvd3RvLT50eXBlKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfUkVGTE9ORzoKLQkJCSAgICAgIHsKLQkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCQk8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAotCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCQkJICAgICAgewotCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJCTwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkwsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9RVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX1FXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCi0JCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fT0ZGLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9ISU5UOgotCQkJICAgICAgewotCQkJCWludCBoaW50X3NpemU7Ci0KLQkJCQloaW50X3NpemUgPSBzcHRyLT5zaXplOwotCQkJCXNwdHItPnNpemUgPSBsZW47Ci0JCQkJc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCQlzcHRyLT5zaXplID0gaGludF9zaXplOwotI2lmIDAKLQkJCQl2bXNfb3V0cHV0X2JlZ2luKGFiZmQsIEVUSVJfU19DX1NUT19ISU5UX0dCTCwgLTEpOwotCQkJCXZtc19vdXRwdXRfbG9uZyhhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCXZtc19vdXRwdXRfcXVhZChhYmZkLCAodXF1YWQpYWRkcik7Ci0KLQkJCQl2bXNfb3V0cHV0X2NvdW50ZWQoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCXZtc19vdXRwdXRfZmx1c2goYWJmZCk7Ci0jZW5kaWYKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgQUxQSEFfUl9MSU5LQUdFOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCi0JCQkJICB7Ci0JCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgfQotCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQlFVElSX1NfQ19TVENfTFBfUFNCLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQUklWKHZtc19saW5rYWdlX2luZGV4KSk7Ci0JCQkJUFJJVih2bXNfbGlua2FnZV9pbmRleCkgKz0gMjsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX0NPREVBRERSOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJICAgIHN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJICAgIDwgMCkKLQkJCQkgIHsKLQkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgIH0KLQkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJRVRJUl9TX0NfU1RPX0NBLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgcmVsb2NhdGlvbiAlcyIpLAotCQkJCQkJICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0KLQkJCSAgdmFkZHIgKz0gbGVuOwotCi0JCQkgIGlmIChsZW4gPT0gc3B0ci0+c2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBsZW47Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gbGVuOwotCQkJICAgICAgc3B0ci0+c2l6ZSAtPSBsZW47Ci0JCQkgICAgICBpLS07Ci0JCQkgICAgICBycHRyKys7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCQkJCQkvKiBzcHRyIHN0YXJ0cyBhZnRlciByZWxvYyAqLwotCQkJewotCQkJICBpLS07CQkJCS8qIGNoZWNrIG5leHQgcmVsb2MgKi8KLQkJCSAgcnB0cisrOwotCQkJfQotCi0JCSAgICAgIGlmIChpPT0wKQkJCQkvKiBhbGwgcmVsb2MgY2hlY2tlZCAqLwotCQkJewotCQkJICBpZiAoc3B0ci0+c2l6ZSA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsJLyogZHVtcCByZXN0ICovCi0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9IC8qIGZvciAoOzspICovCi0JCX0gLyogaWYgU0VDX1JFTE9DICovCi0JICAgICAgZWxzZQkJCQkJCS8qIG5vIHJlbG9jcywganVzdCBkdW1wICovCi0JCXsKLQkJICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCX0KLQotCSAgICAgIHNwdHIgPSBzcHRyLT5uZXh0OwotCi0JICAgIH0gLyogd2hpbGUgKHNwdHIgIT0gMCkgKi8KLQotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQotCX0gLyogaGFzX2NvbnRlbnRzICovCi0KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KGFiZmQsIDIpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiB3cml0ZSB0cmFjZWJhY2sgZGF0YSBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfdGJ0ICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIGRlYnVnIGluZm8gZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2RiZyAoJXAsIG9ianR5cGUpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5jIGIvYmZkL3Ztcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkxYmE0Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NDYgKzAsMCBAQAotLyogdm1zLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDk3LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi1zdGF0aWMgYm9vbGVhbiB2bXNfaW5pdGlhbGl6ZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBwcml2X3NlY3Rpb25fY291bnQ7Ci1zdGF0aWMgYm9vbGVhbiBmaWxsX3NlY3Rpb25fcHRyIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maXh1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29weV9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmVsb2NfbmlsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp2bXNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbWtvYmplY3QgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiB4MSwgZmlsZV9wdHIgeDIsCi0JICAgYmZkX3NpemVfdHlwZSB4MykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfd2luZG93ICp3LCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICpzcmMsIGJmZCAqZGVzdCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqc3JjYmZkLCBhc2VjdGlvbiAqc3Jjc2VjLCBiZmQgKmRzdGJmZCwgYXNlY3Rpb24gKmRzdHNlYykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSAgUEFSQU1TICgoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKmZpbGUpKTsKLXN0YXRpYyBjaGFyICp2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmQgKmJiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqKnRhYmxvYywgYmZkX3NpemVfdHlwZSAqdGFibGVuLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lKSk7Ci1zdGF0aWMgdm9pZCB2bXNfdHJ1bmNhdGVfYXJuYW1lCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqcGF0aG5hbWUsIGNoYXIgKmFyaGRyKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwgc3RydWN0IG9ybCAqbWFwLAotCSAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLXN0YXRpYyBQVFIgdm1zX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJmZCAqdm1zX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICphYmZkLCBzeW1pbmRleCBpbmRleCkpOwotc3RhdGljIGJmZCAqdm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOwotc3RhdGljIGJvb2xlYW4gdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgaW50IHZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqc3RhdCkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgdm9pZCB2bXNfcHJpbnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCwgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotc3RhdGljIHZvaWQgdm1zX2dldF9zeW1ib2xfaW5mbwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYWxlbnQgKnZtc19nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYXN5bWJvbCAqKnN5bWJvbHMsIGJmZF92bWEgb2Zmc2V0LAotCSAgIGNvbnN0IGNoYXIgKipmaWxlLCBjb25zdCBjaGFyICoqZnVuYywgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci1zdGF0aWMgbG9uZyB2bXNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgUFRSICptaW5pc3ltc3AsIHVuc2lnbmVkIGludCAqc2l6ZXApKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMsIGNvbnN0IFBUUiBtaW5pc3ltLCBhc3ltYm9sICpzeW0pKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGFyZWxlbnQgKipsb2NhdGlvbiwKLQkgICBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKnZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICphYmZkLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotc3RhdGljIGludCB2bXNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIHJlbG9jKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsIGJmZF9ieXRlICpkYXRhLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgYm9vbGVhbiAqYWdhaW4pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfZ2Nfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKiphcmVsLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotI2RlZmluZSB2bXNfbWFrZV9lbXB0eV9zeW1ib2wgX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wKLQwKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjID0KLXsKLSAgInZtcy1hbHBoYSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TCi0gICB8IFdQX1RFWFQgfCBEX1BBR0VEKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWMgPQotewotICAidm1zLXZheCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TIAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQKLSAgIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19MT0NBTFMpLAotCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIHZtc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIHZtc19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgdm1zX21rb2JqZWN0LAkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDICh2bXMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBJbml0aWFsaXplIHByaXZhdGUgZGF0YSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19pbml0aWFsaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBpOwotCi0gIGlmIChhYmZkLT50ZGF0YS5hbnkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKS0xKTsKLQotICBhYmZkLT50ZGF0YS5hbnkgPSAoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgdm1zX3ByaXZhdGVfZGF0YV9zdHJ1Y3QpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZmRlZiBfX0FMUEhBCi0gIFBSSVYoaXNfdmF4KSA9IDA7Ci0jZWxzZQotICBQUklWKGlzX3ZheCkgPSAxOwotI2VuZGlmCi0gIFBSSVYodm1zX2J1ZikgPSAwOwotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0gIFBSSVYocmVjX2xlbmd0aCkgPSAwOwotICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1VOS05PV047Ci0gIFBSSVYoZml4dXBfZG9uZSkgPSBmYWxzZTsKLSAgUFJJVihzZWN0aW9ucykgPSBOVUxMOwotCi0gIFBSSVYoc3RhY2spID0gKChzdHJ1Y3Qgc3RhY2tfc3RydWN0ICopCi0JCSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdGFja19zdHJ1Y3QpICogU1RBQ0tTSVpFKSk7Ci0gIGlmIChQUklWKHN0YWNrKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMToKLSAgICAgIGZyZWUgKGFiZmQtPnRkYXRhLmFueSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hbnkgPSAwOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgUFJJVihzdGFja3B0cikgPSAwOwotCi0gIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgaWYgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPT0gMCkKLSAgICB7Ci0gICAgIHZtc19pbml0X25vX21lbTI6Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgICBnb3RvIHZtc19pbml0X25vX21lbTE7Ci0gICAgfQotCi0gIGlmICghYmZkX2hhc2hfdGFibGVfaW5pdCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgX2JmZF92bXNfaGFzaF9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAoKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QgKikKLQkJCSAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9jYXRpb25fc3RydWN0KQotCQkJCSAgICAgICogTE9DQVRJT05fU0FWRV9TSVpFKSk7Ci0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMzoKLSAgICAgIGZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgICBnb3RvIHZtc19pbml0X25vX21lbTI7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLQotICBQUklWKG91dHB1dF9idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChNQVhfT1VUUkVDX1NJWkUpOwotICBpZiAoUFJJVihvdXRwdXRfYnVmKSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYobG9jYXRpb25fc3RhY2spKTsKLSAgICAgIFBSSVYobG9jYXRpb25fc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMzsKLSAgICB9Ci0gIFBSSVYocHVzaF9sZXZlbCkgPSAwOwotICBQUklWKHB1c2hlZF9zaXplKSA9IDA7Ci0gIFBSSVYobGVuZ3RoX3BvcykgPSAyOwotICBQUklWKG91dHB1dF9zaXplKSA9IDA7Ci0gIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSAxOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpbGwgc3ltYm9sLT5zZWN0aW9uIHdpdGggc2VjdGlvbiBwdHIKLSAgIHN5bWJvbC0+c2VjdGlvbiBpcyBmaWxsZWQgd2l0aCB0aGUgc2VjdGlvbiBpbmRleCBmb3IgZGVmaW5lZCBzeW1ib2xzCi0gICBkdXJpbmcgcmVhZGluZyB0aGUgR1NEL0VHU0Qgc2VjdGlvbi4gQnV0IHdlIG5lZWQgdGhlIHBvaW50ZXIgdG8gdGhlCi0gICBiZmQgc2VjdGlvbiBsYXRlci4KLQotICAgSXQgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGZvciByZWZlcmVuY2VkICh1bmRlZmluZWQgc2VjdGlvbikgc3ltYm9scwotCi0gICBjYWxsZWQgZnJvbSBiZmRfaGFzaF90cmF2ZXJzZSBpbiB2bXNfZml4dXBfc2VjdGlvbnMgICovCi0KLXN0YXRpYyBib29sZWFuCi1maWxsX3NlY3Rpb25fcHRyIChlbnRyeSwgc2VjdGlvbnMpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIFBUUiBzZWN0aW9uczsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIHN5bSA9ICAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbDsKLSAgc2VjID0gc3ltLT5zZWN0aW9uOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgImZpbGxfc2VjdGlvbl9wdHI6IHN5bSAlcCwgc2VjICVwXG4iLCBzeW0sIHNlYyk7Ci0jZW5kaWYKLQotICAvKiBmaWxsIGZvcndhcmQgcmVmZXJlbmNlcyAodGhlc2UgY29udGFpbiBzZWN0aW9uIG51bWJlciwgbm90IHNlY3Rpb24gcHRyKS4gICovCi0KLSAgaWYgKCh1bnNpZ25lZCBpbnQpIHNlYyA8IHByaXZfc2VjdGlvbl9jb3VudCkKLSAgICB7Ci0gICAgICBzZWMgPSAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbC0+c2VjdGlvbiA9Ci0JKChhc2VjdGlvbiAqKilzZWN0aW9ucylbKGludClzZWNdOwotICAgIH0KLQotICBpZiAoc3RyY21wIChzeW0tPm5hbWUsIHNlYy0+bmFtZSkgPT0gMCkKLSAgICBzeW0tPmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaXh1cCBzZWN0aW9ucwotICAgc2V0IHVwIGFsbCBwb2ludGVycyBhbmQgYXJyYXlzLCBjb3VudGVycyBhbmQgc2l6ZXMgYXJlIGZpeGVkIG5vdwotCi0gICB3ZSBidWlsZCBhIHByaXZhdGUgc2VjdGlvbnMgdmVjdG9yIGZvciBlYXN5IGFjY2VzcyBzaW5jZSBzZWN0aW9ucwotICAgYXJlIGFsd2F5cyByZWZlcmVuY2VkIGJ5IGFuIGluZGV4IG51bWJlci4KLQotICAgYWxsb2MgUFJJVihzZWN0aW9ucykgYWNjb3JkaW5nIHRvIGFiZmQtPnNlY3Rpb25fY291bnQKLQljb3B5IGFiZmQtPnNlY3Rpb25zIHRvIFBSSVYoc2VjdGlvbnMpICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChQUklWKGZpeHVwX2RvbmUpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qCi0gICAqIHRyYXZlcnNlIHN5bWJvbCB0YWJsZSBhbmQgZmlsbCBpbiBhbGwgc2VjdGlvbiBwb2ludGVycwotICAgKi8KLQotICAvKiBjYW4ndCBwcm92aWRlIHNlY3Rpb24gY291bnQgYXMgYXJndW1lbnQgdG8gZmlsbF9zZWN0aW9uX3B0cigpLiAgKi8KLSAgcHJpdl9zZWN0aW9uX2NvdW50ID0gUFJJVihzZWN0aW9uX2NvdW50KTsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIGZpbGxfc2VjdGlvbl9wdHIsCi0JCSAgICAoUFRSKShQUklWKHNlY3Rpb25zKSkpOwotCi0gIFBSSVYoZml4dXBfZG9uZSkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgotICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBvYmplY3QgZmlsZSBvciB6ZXJvIGlmIG5vdC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCi12bXNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGVyciA9IDA7Ci0gIGludCBwcmV2X3R5cGU7Ci0gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjdG9yID0gMDsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb2JqZWN0X3AoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgU0VFS19TRVQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcHJldl90eXBlID0gLTE7Ci0KLSAgZG8KLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDcsICJyZWFkaW5nIGF0ICUwOGx4XG4iLCBiZmRfdGVsbChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIGlmIChfYmZkX3Ztc19uZXh0X3JlY29yZCAoYWJmZCkgPCAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgIm5leHRfcmVjb3JkIGZhaWxlZFxuIik7ICAgICAgCi0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoKHByZXZfdHlwZSA9PSBFT0JKX1NfQ19FR1NEKQotCSAgICYmIChQUklWKHJlY190eXBlKSAhPSBFT0JKX1NfQ19FR1NEKSkKLQl7Ci0JICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOwotI2VuZGlmCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXZfdHlwZSA9IFBSSVYocmVjX3R5cGUpOwotCi0gICAgICBpZiAodGFyZ2V0X3ZlY3RvciA9PSAwKQotCXsKLQkgIGlmIChwcmV2X3R5cGUgPD0gT0JKX1NfQ19NQVhSRUNUWVApCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX3ZheF92ZWM7Ci0JICBlbHNlCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX2FscGhhX3ZlYzsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocHJldl90eXBlKQotCXsKLQkgIGNhc2UgT0JKX1NfQ19IRFI6Ci0JICBjYXNlIEVPQkpfU19DX0VNSDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19FT006Ci0JICBjYXNlIE9CSl9TX0NfRU9NVzoKLQkgIGNhc2UgRU9CSl9TX0NfRUVPTToKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JICBjYXNlIEVPQkpfU19DX0VHU0Q6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfVElSOgotCSAgY2FzZSBFT0JKX1NfQ19FVElSOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0RCRzoKLQkgIGNhc2UgRU9CSl9TX0NfRURCRzoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZGJnIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19UQlQ6Ci0JICBjYXNlIEVPQkpfU19DX0VUQlQ6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RidCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfTE5LOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9sbmsgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZXJyID0gLTE7Ci0JfQotICAgICAgaWYgKGVyciAhPSAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgInNsdXJwIHR5cGUgJWQgZmFpbGVkIHdpdGggJWRcbiIsIHByZXZfdHlwZSwgZXJyKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICB3aGlsZSAoKHByZXZfdHlwZSAhPSBFT0JKX1NfQ19FRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NVykpOwotCi0gIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfdmF4X3ZlYykKLSAgICB7Ci0gICAgICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJ2bXNfZml4dXBfc2VjdGlvbnMgZmFpbGVkXG4iKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gdmF4ICAqLwotIAotICAgICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJ2YXgiKTsKLSAgICAgIFBSSVYgKGlzX3ZheCkgPSAxOwotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyB2YXhcbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfYWxwaGFfdmVjKQotICAgIHsKLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gYWxwaGEgICovCi0gCi0gICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoImFscGhhIik7Ci0gICAgICBQUklWIChpc192YXgpID0gMDsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggaXMgYWxwaGFcbiIpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChhcmNoID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBub3QgZm91bmRcbiIpOwotI2VuZGlmCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLQotICByZXR1cm4gdGFyZ2V0X3ZlY3RvcjsKLX0KLQotCi0vKiBDaGVjayB0aGUgZm9ybWF0IGZvciBhIGZpbGUgYmVpbmcgcmVhZC4KLSAgIFJldHVybiBhIChiZmRfdGFyZ2V0ICopIGlmIGl0J3MgYW4gYXJjaGl2ZSBmaWxlIG9yIHplcm8uICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKgotdm1zX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19hcmNoaXZlX3AoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbWtvYmplY3QoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgewotI2lmZGVmIF9fVkFYCi0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOwotI2Vsc2UKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKLSNlbmRpZgotICAgIGlmIChhcmNoID09IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogV3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4sIGF0IGJmZF9jbG9zZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc193cml0ZV9vYmplY3RfY29udGVudHMoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMCkJCQkvKiB3ZSBoYXZlIHNlY3Rpb25zICovCi0gICAgewotICAgICAgaWYgKFBSSVYoaXNfdmF4KSkKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBPQkpfU19DX0hEUikgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgT0JKX1NfQ19HU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIE9CSl9TX0NfVElSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBPQkpfU19DX1RCVCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgT0JKX1NfQ19EQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMjU1KQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT01XKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIE9CSl9TX0NfRU9NKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgRU9CSl9TX0NfRU1IKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBFT0JKX1NfQ19FR1NEKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBFT0JKX1NfQ19FVElSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBFT0JKX1NfQ19FVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBFT0JKX1NfQ19FREJHKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBFT0JKX1NfQ19FRU9NKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gNC4xLCBnZW5lcmljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjOwotICB2bXNfc2VjdGlvbiAqZXMsICplczE7Ci0gIGludCBpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jbG9zZV9hbmRfY2xlYW51cCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIGlmIChhYmZkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKFBSSVYodm1zX2J1ZikgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHZtc19idWYpKTsKLSAgICAgIFBSSVYodm1zX2J1ZikgPSBOVUxMOwotICAgIH0KLSAgUFJJVihidWZfc2l6ZSkgPSAwOwotCi0gIGlmIChQUklWKG91dHB1dF9idWYpICE9IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihvdXRwdXRfYnVmKSk7Ci0gICAgICBQUklWKG91dHB1dF9idWYpID0gMDsKLSAgICB9Ci0KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0gIHdoaWxlIChzZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cykKLQlmcmVlIChzZWMtPmNvbnRlbnRzKTsKLSAgICAgIHNlYyA9IHNlYy0+bmV4dDsKLSAgICB9Ci0KLSAgaWYgKFBSSVYoc2VjdGlvbnMpICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihzZWN0aW9ucykpOwotICAgICAgUFJJVihzZWN0aW9ucykgPSBOVUxMOwotICAgIH0KLQotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSkKLSAgICB7Ci0gICAgICBiZmRfaGFzaF90YWJsZV9mcmVlIChQUklWKHZtc19zeW1ib2xfdGFibGUpKTsKLSAgICAgIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAwOwotICAgIH0KLQotICBpZiAoUFJJVihzdGFjaykpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihzdGFjaykpOwotICAgICAgUFJJVihzdGFjaykgPSAwOwotICAgIH0KLQotICBpZiAoUFJJVihsb2NhdGlvbl9zdGFjaykpCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgVk1TX1NFQ1RJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBlcyA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldOwotICAgICAgd2hpbGUgKGVzICE9IE5VTEwpCi0JewotCSAgZXMxID0gZXMtPm5leHQ7Ci0JICBmcmVlIChlcyk7Ci0JICBlcyA9IGVzMTsKLQl9Ci0gICAgICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpXSA9IE5VTEw7Ci0gICB9Ci0KLSAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgYWJmZC0+dGRhdGEuYW55ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX25ld19zZWN0aW9uX2hvb2sgKCVwLCBbJWRdJXMpLCBjb3VudCAlZFxuIiwgYWJmZCwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjdGlvbiwgNCk7Ci0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiBQUklWKHNlY3Rpb25fY291bnQpKQotICAgIHsKLSAgICAgIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIGFiZmQtPnNlY3Rpb25fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucykgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInNlY3Rpb25fY291bnQ6ICVkXG4iLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSNlbmRpZgotICBQUklWKHNlY3Rpb25zKVtzZWN0aW9uLT5pbmRleF0gPSBzZWN0aW9uOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDcsICIlZDogJXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGJ1Ziwgb2Zmc2V0LCBidWZfc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBidWYgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnVmX3NpemUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCAlcywgJXAsIG9mZiAlbGQsIHNpemUgJWQpXG4iLAotCQkgYWJmZCwgc2VjdGlvbi0+bmFtZSwgYnVmLCBvZmZzZXQsIChpbnQpYnVmX3NpemUpOwotI2VuZGlmCi0KLSAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uCi0gICBidWYgcG9pbnRzIHRvIGEgYnVmZmVyIG9mIGJ1Zl9zaXplIGJ5dGVzIHRvIGJlIGZpbGxlZCB3aXRoCi0gICBzZWN0aW9uIGRhdGEgKHN0YXJ0aW5nIGF0IG9mZnNldCBpbnRvIHNlY3Rpb24pICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyAoYWJmZCwgc2VjdGlvbiwgdywgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF93aW5kb3cgKncgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyglcCwgJXMsICVwLCBvZmYgJWxkLCBjb3VudCAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCB3LCBvZmZzZXQsIChpbnQpY291bnQpOwotI2VuZGlmCi0KLSAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC4yLCBjb3B5IHByaXZhdGUgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKnNyYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmRlc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgc3JjLCBkZXN0KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBNZXJnZSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUKLSAgIHRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLSAgIG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLSAgICAgTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKCVwLCAlcClcbiIsIGliZmQsIG9iZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KLSAgIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotICAgcmV0dXJucyBhcmU6Ci0KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyglcCwgJWx4KVxuIiwgYWJmZCwgKGxvbmcpZmxhZ3MpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKHNyY2JmZCwgc3Jjc2VjLCBkc3RiZmQsIGRzdHNlYykKLSAgICAgYmZkICpzcmNiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNyY3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmRzdGJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqZHN0c2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSglcCwgJXMsICVwLCAlcylcbiIsCi0JCSBzcmNiZmQsIHNyY3NlYy0+bmFtZSwgZHN0YmZkLCBkc3RzZWMtPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuIAotdm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW0sIG9iZmQsIG9zeW0pCi0gICAgIGJmZCAqaWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICppc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpvc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIGliZmQsIGlzeW0tPm5hbWUsIG9iZmQsIG9zeW0tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC4zLCBjb3JlIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiBhIHJlYWQtb25seSBzdHJpbmcgZXhwbGFpbmluZyB3aGljaCBwcm9ncmFtIHdhcyBydW5uaW5nCi0gICB3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBhYmZkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgd2hpY2ggY2F1c2VkIHRoZSBjb3JlIGR1bXAgd2hpY2gKLSAgIGdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIGFiZmQgaXMgYXR0YWNoZWQgdG8uICAqLwotCi1zdGF0aWMgaW50Ci12bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBjb3JlIGZpbGUgYXR0YWNoZWQgdG8gY29yZV9iZmQgd2FzIGdlbmVyYXRlZAotICAgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0byBleGVjX2JmZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGFiZmQsIGJiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmJiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCglcCwgJXApXG4iLCBhYmZkLCBiYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjQsIGFyY2hpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGFyY2hpdmUgbWFwLgotICAgUmV0dXJuIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfYXJtYXAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqdGFibG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVHJ1bmNhdGUgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSB0byBtYXRjaCBzeXN0ZW0tZGVwZW5kZW50IHJlc3RyaWN0aW9ucyAgKi8KLQotc3RhdGljIHZvaWQKLXZtc190cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmFyaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc190cnVuY2F0ZV9hcm5hbWUoJXAsICVzLCAlcylcbiIsIGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0jZW5kaWYKLSAgcmV0dXJuOwotfQotCi0KLS8qID8/Pwl3cml0ZSBhcmNoaXZlIG1hcCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzdHJpZHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX2FybWFwKCVwLCAlZCwgJXAsICVkICVkKVxuIiwKLQlhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhcmNoaXZlIGhlYWRlciA/Pz8gICovCi0KLXN0YXRpYyBQVFIKLXZtc19yZWFkX2FyX2hkciAoYWJmZCkKLSAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX2FyX2hkciglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAoUFRSKTA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIEB2YXJ7YXJjaGl2ZX0sIGNvbnRhaW5pbmcgYW4gYXJjaGl2ZSBhbmQgTlVMTCwgb3BlbgotICAgYW4gaW5wdXQgQkZEIG9uIHRoZSBmaXJzdCBjb250YWluZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGF0LgotICAgU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcyB0aGUgYXJjaGl2ZSBhbmQgdGhlIHByZXZpb3VzIHJldHVybiB2YWx1ZQotICAgdG8gcmV0dXJuIGEgY3JlYXRlZCBCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuCi0gICBOVUxMIGlzIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKnByZXYgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSglcCwgJXApXG4iLCBhcmNoLCBwcmV2KTsKLSNlbmRpZgotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIEJGRCB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzeW1ib2wgaW4gQUJGRCBpbmRleGVkIGJ5Ci0gICBJTkRFWC4gIElOREVYIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYmZkX2dldF9uZXh0X21hcGVudC4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2VsdF9hdF9pbmRleCglcCwgJXApXG4iLCBhYmZkLCBpbmRleCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KGFiZmQsIGluZGV4KTsKLX0KLQotCi0vKiA/Pz8KLSAgIC0+IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgICovCi0KLXN0YXRpYyBpbnQKLXZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHN0YXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnN0YXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQoJXAsICVwKVxuIiwgYWJmZCwgc3RhdCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIG5ldyBmdW5jdGlvbiBpbiBiZmQgMi41ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC41LCBzeW1ib2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKLSAgIHRvIGFzeW1ib2xzIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIEJGRCBhYmZkLCBpbmNsdWRpbmcgYQotICAgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbiB0aGUgQkZELAotICAgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKSwgJWQgc3ltYm9sc1xuIiwgYWJmZCwgUFJJVihnc2Rfc3ltX2NvdW50KSk7Ci0jZW5kaWYKLSAgcmV0dXJuIChQUklWKGdzZF9zeW1fY291bnQpKzEpICogc2l6ZW9mKGFzeW1ib2wgKik7Ci19Ci0KLQotLyogQ29weSBzeW1ib2xzIGZyb20gaGFzaCB0YWJsZSB0byBzeW1ib2wgdmVjdG9yCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19nZXRfc3ltdGFiCi0gICBpbml0IGNvdW50ZXIgdG8gMCBpZiBlbnRyeSA9PSAwICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29weV9zeW1ib2xzIChlbnRyeSwgYXJnKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBQVFIgYXJnOwotewotICBiZmQgKmFiZmQgPSAoYmZkICopIGFyZzsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkJLyogaW5pdCBjb3VudGVyICovCi0gICAgUFJJVihzeW1udW0pID0gMDsKLSAgZWxzZQkJCS8qIGZpbGwgdmVjdG9yLCBpbmMgY291bnRlciAqLwotICAgIFBSSVYoc3ltY2FjaGUpW1BSSVYoc3ltbnVtKSsrXSA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIGFiZmQsIGFuZCBmaWxscyBpbiB0aGUgdmVjdG9yCi0gICBsb2NhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIGFuZCBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIHJldHVybiAjIG9mIHN5bWJvbHMgcmVhZCAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0JLyogaW5pdCBjb3VudGVyICovCi0gICh2b2lkKWNvcHlfc3ltYm9scygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopMCwgYWJmZCk7Ci0KLQkvKiB0cmF2ZXJzZSB0YWJsZSBhbmQgZmlsbCBzeW1ib2xzIHZlY3RvciAqLwotCi0gIFBSSVYoc3ltY2FjaGUpID0gc3ltYm9sczsKLSAgYmZkX2hhc2hfdHJhdmVyc2UoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgY29weV9zeW1ib2xzLCAoUFRSKWFiZmQpOwotCi0gIHN5bWJvbHNbUFJJVihnc2Rfc3ltX2NvdW50KV0gPSBOVUxMOwotCi0gIHJldHVybiBQUklWKGdzZF9zeW1fY291bnQpOwotfQotCi0KLS8qIENyZWF0ZSBhIG5ldyBhc3ltYm9sIHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBhYmZkIGFuZCByZXR1cm4gYSBwb2ludGVyCi0gICB0byBpdC4KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoIGJhY2sgZW5kIGhhcyBwcml2YXRlIGluZm9ybWF0aW9uCi0gICBzdXJyb3VuZGluZyB0aGUgYXN5bWJvbC4gQnVpbGRpbmcgeW91ciBvd24gYXN5bWJvbCBhbmQgcG9pbnRpbmcgdG8gaXQKLSAgIHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMgbGF0ZXIgb24uICAqLwotCi1hc3ltYm9sICoKLV9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbCA9IChhc3ltYm9sICopYmZkX3phbGxvYyhhYmZkLCBzaXplb2YoYXN5bWJvbCkpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgIl9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoc3ltYm9sID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHN5bWJvbC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBQcmludCBzeW1ib2wgdG8gZmlsZSBhY2NvcmRpbmcgdG8gaG93LiBob3cgaXMgb25lIG9mCi0gICBiZmRfcHJpbnRfc3ltYm9sX25hbWUJanVzdCBwcmludCB0aGUgbmFtZQotICAgYmZkX3ByaW50X3N5bWJvbF9tb3JlCXByaW50IG1vcmUgKD8/PykKLSAgIGJmZF9wcmludF9zeW1ib2xfYWxsCXByaW50IGFsbCB3ZSBrbm93LCB3aGljaCBpcyBub3QgbXVjaCByaWdodCBub3cgOi0pICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcHJpbnRfc3ltYm9sKCVwLCAlcCwgJXAsICVkKVxuIiwgYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLQlmcHJpbnRmKChGSUxFICopZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLQl7Ci0JICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLQkgIGZwcmludGYoKEZJTEUgKilmaWxlLCIgJS04cyAlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCBpbiByZXQuCi0KLSAgIGZpbGwgdHlwZSwgdmFsdWUgYW5kIG5hbWUKLSAgIHR5cGU6Ci0JQQlhYnNvbHV0ZQotCUIJYnNzIHNlZ21lbnQgc3ltYm9sCi0JQwljb21tb24gc3ltYm9sCi0JRAlkYXRhIHNlZ21lbnQgc3ltYm9sCi0JZglmaWxlbmFtZQotCXQJYSBzdGF0aWMgZnVuY3Rpb24gc3ltYm9sCi0JVAl0ZXh0IHNlZ21lbnQgc3ltYm9sCi0JVQl1bmRlZmluZWQKLQktCWRlYnVnICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW1ib2xfaW5mbyglcCwgJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sLCByZXQpOwotI2VuZGlmCi0KLSAgc2VjID0gc3ltYm9sLT5zZWN0aW9uOwotCi0gIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQyc7Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQSc7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnVSc7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnSSc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgIHJldC0+dHlwZSA9ICdUJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgcmV0LT50eXBlID0gJ0QnOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgcmV0LT50eXBlID0gJ0InOwotICBlbHNlCi0gICAgcmV0LT50eXBlID0gJy0nOwotCi0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9sIHN5bSBpbiB0aGUgQkZEIGFiZmQgaXMKLSAgIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoJXAsICVzKVxuIiwgYWJmZCwgbmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0KLS8qIEdldCBzb3VyY2UgbGluZSBudW1iZXIgZm9yIHN5bWJvbCAgKi8KLQotc3RhdGljIGFsZW50ICoKLXZtc19nZXRfbGluZW5vIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9saW5lbm8oJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlIGFuZAotICAgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUgd2FudGVkCi0gICBsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZSwgZnVuYywgbGluZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZmluZF9uZWFyZXN0X2xpbmUoJXAsICVzLCAlcCwgJWxkLCA8cmV0PiwgPHJldD4sIDxyZXQ+KVxuIiwKLQkgICAgICBhYmZkLCBzZWN0aW9uLT5uYW1lLCBzeW1ib2xzLCAobG9uZyBpbnQpb2Zmc2V0KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLSAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAoYWJmZCwgcHRyLCBzaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdm9pZCAqcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sKCVwLCAlcCwgJWxkKVxuIiwgYWJmZCwgcHRyLCBzaXplKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKLSAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCi0gICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX21pbmlzeW1ib2xzKCVwLCAlZCwgJXAsICVkKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCAqc2l6ZXApOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci19Ci0KLS8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgotICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCi0gICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZtc19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgY29uc3QgUFRSIG1pbmlzeW07Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sKCVwLCAlZCwgJXAsICVwKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotfQotCi0vKi0tIFBhcnQgNC42LCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBzZWN0IGF0dGFjaGVkIHRvIGJmZCBhYmZkLgotICAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQoJXAsICVzKVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIC0xTDsKLX0KLQotCi0vKiBDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZEIGFiZmQgYW5kIHRyYW5zbGF0ZSB0aGUKLSAgIGV4dGVybmFsIGZvcm0gb2YgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gc2VjIGludG8gdGhlCi0gICBpbnRlcm5hbCBjYW5vbmljYWwgZm9ybS4gIFBsYWNlIHRoZSB0YWJsZSBpbnRvIG1lbW9yeSBhdCBsb2MsIHdoaWNoIGhhcwotICAgYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuCi0gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvciAtMSBvbiBlcnJvci4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX3JlbG9jKCVwLCAlcywgPHJldD4sIDxyZXQ+KVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiB0aGlzIGlzIGp1c3QgY29waWVkIGZyb20gZWNvZmYtYWxwaGEsIG5lZWRzIHRvIGJlIGZpeGVkIHByb2JhYmx5ICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAicmVsb2NfbmlsKGFiZmQgJXAsIG91dHB1dF9iZmQgJXApXG4iLCBhYmZkLCBvdXRwdXRfYmZkKTsKLSAgdm1zX2RlYnVnICgyLCAiSW4gc2VjdGlvbiAlcywgc3ltYm9sICVzXG4iLAotCXNlYy0+bmFtZSwgc3ltLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAicmVsb2Mgc3ltICVzLCBhZGRyICUwOGx4LCBhZGRlbmQgJTA4bHgsIHJlbG9jIGlzIGEgJXNcbiIsCi0JCXJlbG9jLT5zeW1fcHRyX3B0clswXS0+bmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZHJlc3MsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRlbmQsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgImRhdGEgYXQgJXBcbiIsIGRhdGEpOwotLyogIF9iZmRfaGV4ZHVtcCAoMiwgZGF0YSwgYmZkX2dldF9yZWxvY19zaXplKHJlbG9jLT5ob3d0byksMCk7ICovCi0jZW5kaWYKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIYWNrLiBMaW5rYWdlIGlzIGRvbmUgYnkgbGlua2VyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElOS0FHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgOCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjU2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElOS0FHRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgcHJvY2VkdXJlLCB3cml0dGVuIGFzIDMyIGJpdCB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0NPREVBRERSLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJDT0RFQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuIGludm9rZWQsIHdpbGwgcGVyZm9ybQotICAgdGhlIHJlbG9jYXRpb24gY29kZSBvbiBkYXRhIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBub3RlZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLXZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IGFscGhhX3R5cGU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cCglcCwgJWQpXHQiLCBhYmZkLCBjb2RlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRkxPTkc7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOglhbHBoYV90eXBlID0gQUxQSEFfUl9CUkFERFI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfSElOVDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUw2NDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOglhbHBoYV90eXBlID0gQUxQSEFfUl9MSU5LQUdFOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOglhbHBoYV90eXBlID0gQUxQSEFfUl9DT0RFQUREUjsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoInJlbG9jICglZCkgaXMgKlVOS05PV04qIiwgY29kZSk7Ci0JcmV0dXJuIChjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIE5VTEw7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJyZWxvYyBpcyAlc1xuIiwgYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV0ubmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQotCi0vKi0tIFBhcnQgNC43LCB3cml0aW5nIGFuIG9iamVjdCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIGFiZmQgdG8gYXJjaCBhbmQgbWFjaC4KLSAgIEZpbmQgdGhlIGNvcnJlY3QgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGFyY2hfaW5mbwotICAgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2ggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9hcmNoX21hY2goJXAsICVkLCAlbGQpXG4iLCBhYmZkLCBhcmNoLCBtYWNoKTsKLSNlbmRpZgotICBhYmZkLT5hcmNoX2luZm8gPSBiZmRfc2Nhbl9hcmNoKCJhbHBoYSIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNlY3Rpb24gaW4gQkZEIGFiZmQgdG8gdGhlIGRhdGEgc3RhcnRpbmcKLSAgIGluIG1lbW9yeSBhdCBkYXRhLiBUaGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdAotICAgb2Zmc2V0IG9mZnNldCBmb3IgY291bnQgYnl0ZXMuCi0KLSAgIE5vcm1hbGx5IHRydWUgaXMgcmV0dXJuZWQsIGVsc2UgZmFsc2UuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotICAgbyBiZmRfZXJyb3Jfbm9fY29udGVudHMgLSBUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQlTRUNfSEFTX0NPTlRFTlRTIGF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KLSAgIG8gYW5kIHNvbWUgbW9yZSB0b28gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCBzZWMgJXMsIGxvYyAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsb2NhdGlvbiwgKGxvbmcgaW50KW9mZnNldCwgKGludCljb3VudCk7Ci0gIHZtc19kZWJ1ZyAoMiwgInNlY3JhdyAlZCwgc2VjY29va2VkICVkXG4iLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSwgKGludClzZWN0aW9uLT5fY29va2VkX3NpemUpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0KLS8qLS0gUGFydCA0LjgsIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci12bXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2l6ZW9mX2hlYWRlcnMoJXAsICVzKVxuIiwgYWJmZCwgKHJlbG9jKT8iVHJ1ZSI6IkZhbHNlIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCi0gICB3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi12bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX2J5dGUgKmRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoJXAsICVwLCAlcCwgJXAsICVzLCAlcClcbiIsCi0JCQlhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsIChyZWxvY2F0ZWFibGUpPyJUcnVlIjoiRmFsc2UiLCBzeW1ib2xzKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiA/Pz8gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKmFnYWluIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsYXhfc2VjdGlvbiglcCwgJXMsICVwLCA8cmV0PilcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2Nfc2VjdGlvbnMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0gICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi12bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLSAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9maW5hbF9saW5rKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuOSwgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZpbGUpCi0gICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgdm9pZCAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQotCi0KLS8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBhcmVsLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqKmFyZWwgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5oIGIvYmZkL3Ztcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQzOTg2Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0jdW5kZWYgdm1zCi0vKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFZNU19ICi0jZGVmaW5lIFZNU19ICi0KLQotLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KLQotLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAotI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKLSNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAotI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAotI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNwotI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQotI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMwotI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgotI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNwotI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAotI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQotI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAotI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKLSNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNwotI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAotI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQotI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAotI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKLSNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgotI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKLSNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQotI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKLSNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAotI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKLSNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgotI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKLSNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKLSNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKLSNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKLSNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKLQotI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0KLS8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLwotCi0jZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCi0jZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCi0jZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCi0jZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCi0jZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0Ci0jZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1Ci0jZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2Ci0jZGVmaW5lIEdTRF9TX0NfSURDICAgICA3Ci0jZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4Ci0jZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5Ci0jZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAotI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKLSNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCi0jZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMwotI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKLSNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1Ci0jZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1Ci0KLSNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLwotI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KLQotI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQotI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgotI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAotI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAotI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKLSNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCi0jZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAotI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4Ci0jZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKLSNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgotI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQotI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQotCi0jZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKLSNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgotI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0Ci0jZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAotI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCi0jZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKLSNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCi0jZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKLSNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAotI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKLSNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAotCi0jZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCi0jZGVmaW5lIEdTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIEdTWV9TX01fVU5JICAgICA0Ci0jZGVmaW5lIEdTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKLSNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgotI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0Ci0jZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKLSNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCi0jZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCi0KLSNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQotI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgotCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCi0jZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KLSNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLwotI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKLSNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0vKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE1IRF9TX0NfTUhEIDAKLSNkZWZpbmUgTUhEX1NfQ19MTk0gMQotI2RlZmluZSBNSERfU19DX1NSQyAyCi0jZGVmaW5lIE1IRF9TX0NfVFRMIDMKLSNkZWZpbmUgTUhEX1NfQ19DUFIgNAotI2RlZmluZSBNSERfU19DX01UQyA1Ci0jZGVmaW5lIE1IRF9TX0NfR1RYIDYKLSNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgotCi0jZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLwotI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLwotI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLwotI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCi0jZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCi0jZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLwotCi0vKiB2bXMuYy4gICovCi0KLWV4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogdm1zLWdzZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtbWhkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy10aXIuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCi0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCi0jZGVmaW5lIEFMUEhBX1JfSElOVAkJMwotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKLSNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCi0jZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKLQotLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLwotI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCi0jZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKLSNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKLSNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0KLSNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLwotLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCi0KLSNpZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKLSNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OwotfSB2bXNfc2VjdGlvbjsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOwotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKLSAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX0gdm1zX3JlbG9jOwotCi0vKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KLQotc3RydWN0IGhkcl9zdHJ1YyB7Ci0gIGludCBoZHJfYl9zdHJsdmw7Ci0gIGxvbmcgaGRyX2xfYXJjaDE7Ci0gIGxvbmcgaGRyX2xfYXJjaDI7Ci0gIGxvbmcgaGRyX2xfcmVjc2l6OwotICBjaGFyICpoZHJfdF9uYW1lOwotICBjaGFyICpoZHJfdF92ZXJzaW9uOwotICBjaGFyICpoZHJfdF9kYXRlOwotICBjaGFyICpoZHJfY19sbm07Ci0gIGNoYXIgKmhkcl9jX3NyYzsKLSAgY2hhciAqaGRyX2NfdHRsOwotfTsKLQotCi0vKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KLQotc3RydWN0IGVvbV9zdHJ1YyB7Ci0gIGxvbmcgZW9tX2xfdG90YWxfbHBzOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKLSAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKLSAgbG9uZyBlb21fbF9wc2luZHg7Ci0gIGxvbmcgZW9tX2xfdGZyYWRyOwotfTsKLQotZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLX0gdm1zX3N5bWJvbF9lbnRyeTsKLQotLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKLSAgdXF1YWQgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIFNUQUNLU0laRSA4MTkyCi0KLS8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KLQotc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgotCi0jZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKLQotc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKLSAgaW50IGlzX3ZheDsKLSAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCi0JCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCi0JCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KLSAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KLSAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCi0gIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLwotICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KLSAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OwotCi0gIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCi0gIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsJCS8qICMgb2Ygc2VjdGlvbnMgaW4gZm9sbG93aW5nIGFycmF5ICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwkJCS8qIGFycmF5IG9mIEdTRC9FR1NEIHNlY3Rpb25zICAqLwotICBpbnQgZ3NkX3N5bV9jb3VudDsJCQkvKiAjIG9mIEdTRC9FR1NEIHN5bWJvbHMgICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwkJCS8qIHZlY3RvciBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBzdHJ1Y3QgcHJvY192YWx1ZSAqcHJvY2VkdXJlOwotCi0gIHN0cnVjdCBzdGFja19zdHJ1Y3QgKnN0YWNrOwotICBpbnQgc3RhY2twdHI7Ci0KLSAgdm1zX3NlY3Rpb24gKnZtc19zZWN0aW9uX3RhYmxlW1ZNU19TRUNUSU9OX0NPVU5UXTsKLQotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnZtc19zeW1ib2xfdGFibGU7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1jYWNoZTsKLSAgaW50IHN5bW51bTsKLQotICBzdHJ1Y3QgbG9jYXRpb25fc3RydWN0ICpsb2NhdGlvbl9zdGFjazsKLQotICBhc2VjdGlvbiAqaW1hZ2Vfc2VjdGlvbjsJCS8qIHNlY3Rpb24gZm9yIGltYWdlX3B0ciAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW1hZ2VfcHRyOwkJLyogYSBwb2ludGVyIHRvIHNlY3Rpb24tPmNvbnRlbnRzICovCi0KLSAgdW5zaWduZWQgY2hhciBwZHNjWzhdOwkJLyogcHJvY2VkdXJlIGRlc2NyaXB0b3IgKi8KLQotICAvKiBPdXRwdXQgcm91dGluZSBzdG9yYWdlICAqLwotCi0gIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWY7CQkvKiBvdXRwdXQgZGF0YSAgKi8KLSAgaW50IHB1c2hfbGV2ZWw7Ci0gIGludCBwdXNoZWRfc2l6ZTsKLSAgaW50IGxlbmd0aF9wb3M7Ci0gIGludCBvdXRwdXRfc2l6ZTsKLSAgaW50IG91dHB1dF9hbGlnbm1lbnQ7Ci0KLSAgLyogbGlua2FnZSBpbmRleCBjb3VudGVyCi0gICB1c2VkIGJ5IGNvbmRpdGlvbmFsIHN0b3JlIGNvbW1hbmRzIChFVElSX1NfQ19TVENfKSAgKi8KLQotICBpbnQgdm1zX2xpbmthZ2VfaW5kZXg7Ci0KLSAgLyogc2VlIHRjLWFscGhhLmMgb2YgZ2FzIGZvciBhIGRlc2NyaXB0aW9uLiAgKi8KLSAgaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKywgaGFzaCBpbnN0ZWFkIG9mIHRydW5jYXRlICovCi0gIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1ILCBzaG93IGhhc2hpbmcvdHJ1bmNhdGlvbiAqLwotfTsKLQotI2RlZmluZSBQUklWKG5hbWUpCSgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0ICopYWJmZC0+dGRhdGEuYW55KS0+bmFtZQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRV9URU1QTEFURSAiX19TRUNfXyVkIgotCi0jaWYgVk1TX0RFQlVHCi1leHRlcm4gdm9pZCBfYmZkX3Ztc19kZWJ1ZyBQQVJBTVMoKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pKTsKLWV4dGVybiB2b2lkIF9iZmRfaGV4ZHVtcAotICBQQVJBTVMgKChpbnQgbGV2ZWwsIHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBvZmZzZXQpKTsKLQotI2RlZmluZSB2bXNfZGVidWcgX2JmZF92bXNfZGVidWcKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX3Ztc19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgKnR5cGUsIGludCAqbGVuZ3RoKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX2dldF9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX25leHRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gY2hhciAqX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqc3RyLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqcHRyKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19wdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgdmFsLCBpbnQgcHNlY3QpKTsKLWV4dGVybiB1cXVhZCBfYmZkX3Ztc19wb3AgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgKnBzZWN0KSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgZGF0YSwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9iZWdpbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGludCByZWN0eXBlLCBpbnQgcmVjaGVhZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBhbGlnbnRvKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9wb3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2J5dGUgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9zaG9ydCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2xvbmcgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcXVhZCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKnZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZHVtcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkJCSAgIGludCBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9maWxsIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gY2hhciAqX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqaW4sIGludCBtYXhsZW4pKTsKLQotZXh0ZXJuIHZtc19zeW1ib2xfZW50cnkgKl9iZmRfdm1zX2VudGVyX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQotI2VuZGlmIC8qIFZNU19IICovCmRpZmYgLS1naXQgYS9iZmQveGNvZmYtdGFyZ2V0LmggYi9iZmQveGNvZmYtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDNhYzkuLjAwMDAwMDAKLS0tIGEvYmZkL3hjb2ZmLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgYmFja2VuZHMgYmFzZWQgb24gSUJNIFJTLzYwMDAgIlhDT0ZGNjQiIGZpbGVzLgotICAgQ29weXJpZ2h0IDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlOwkJCQkJXAotICAgIGludGVybmFsLnJfc2l6ZSA9CQkJCQkJCVwKLSAgICAgICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZAkJXAotCT8gMHg4MAkJCQkJCQkJXAotCTogMCkJCQkJCQkJCVwKLSAgICAgICB8IChob3d0by0+Yml0c2l6ZSAtIDEpKTsJCQkJCQlcCi0gIH0KLQwKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgX2JmZF94Y29mZl9ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCBfYmZkX3hjb2ZmX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX3hjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfeGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX3hjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNkZWZpbmUgQ09SRV9GSUxFX1AgX2JmZF9kdW1teV90YXJnZXQKLQotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgXAotICBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotI2lmZGVmIEFJWF9DT1JFCi0jdW5kZWYgQ09SRV9GSUxFX1AKLSNkZWZpbmUgQ09SRV9GSUxFX1AgcnM2MDAwY29mZl9jb3JlX3AKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogcnM2MDAwY29mZl9jb3JlX3AgKCk7Ci1leHRlcm4gYm9vbGVhbiByczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKCk7Ci0KLSN1bmRlZgljb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgXAotCQkJCSAgICAgcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotZXh0ZXJuIGNoYXIgKnJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1leHRlcm4gaW50IHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0KLSN1bmRlZgljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMJcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmIC8qIEFJWF9DT1JFICovCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIGx5bnhfY29yZV9maWxlX3AKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAotCQkJCQkJCSAgICBiZmQgKmV4ZWNfYmZkKSk7Ci0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotZXh0ZXJuIGNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1leHRlcm4gaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX2djX3NlY3Rpb25zIGNvZmZfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogWENPRkYgYXJjaGl2ZXMgZG8gbm90IGhhdmUgYW55dGhpbmcgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4KLSAgIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfeGNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF94Y29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfeGNvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotCi0vKiBXZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCBnZXRfZWx0X2F0X2luZGV4IHJvdXRpbmUuICAqLwotCi0jZGVmaW5lIF9iZmRfeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotCi0vKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhIHRpbWVzdGFtcC4gICovCi0KLSNkZWZpbmUgX2JmZF94Y29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIF9iZmRfeGNvZmZfcnR5cGUyaG93dG8KLSAgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKl9iZmRfeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfeGNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gUFRSIF9iZmRfeGNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBiZmQgKl9iZmRfeGNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX3hjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgX2JmZF94Y29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF94Y29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3hjb2ZmX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfeGNvZmZfc3dhcF9hdXhfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0KLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX2luIF9iZmRfeGNvZmZfc3dhcF9zeW1faW4KLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9vdXQgX2JmZF94Y29mZl9zd2FwX3N5bV9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2F1eF9pbiBfYmZkX3hjb2ZmX3N3YXBfYXV4X2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfb3V0IF9iZmRfeGNvZmZfc3dhcF9hdXhfb3V0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9TWU0gPQotewotICBUQVJHRVRfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfeGNvZmZfYXJjaGl2ZV9wLCBDT1JFX0ZJTEVfUH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX3hjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQveGNvZmZsaW5rLmMgYi9iZmQveGNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTE3YjAuLjAwMDAwMDAKLS0tIGEvYmZkL3hjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0MSArMCwwIEBACi0vKiBQT1dFUi9Qb3dlclBDIFhDT0ZGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFhDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBJbiBvcmRlciB0byBzdXBwb3J0IGxpbmtpbmcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgaW50byBhbgotICAgWENPRkYgZm9ybWF0LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0gICBiZmRfdGFyZ2V0IGlzIGFuIFhDT0ZGIHZlY3Rvci4gIEZJWE1FOiBXZSBuZWVkIHRvIHJldGhpbmsgdGhpcwotICAgd2hvbGUgYXBwcm9hY2guICAqLwotI2RlZmluZSBYQ09GRl9YVkVDUCh4dikgXAotICAoc3RyY21wICgoeHYpLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSA9PSAwIFwKLSAgIHx8IHN0cmNtcCAoKHh2KS0+bmFtZSwgImFpeGNvZmY2NC1yczYwMDAiKSA9PSAwIFwKLSAgIHx8IHN0cmNtcCAoKHh2KS0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgPT0gMCkKLQotLyogR2V0IHRoZSBYQ09GRiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIGEgQkZELiAgKi8KLSNkZWZpbmUgb2JqX3hjb2ZmX3N5bV9oYXNoZXMoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYmZkKSkKLQotLyogWENPRkYgcmVsb2NhdGlvbiB0eXBlcy4gIFRoZXNlIHByb2JhYmx5IGJlbG9uZyBpbiBhIGhlYWRlciBmaWxlCi0gICBzb21ld2hlcmUuICBUaGUgcmVsb2NhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZnVuY3Rpb24KLSAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaW4gdGhpcyBmaWxlLiAgKi8KLQotI2RlZmluZSBSX1BPUyAgICgweDAwKQotI2RlZmluZSBSX05FRyAgICgweDAxKQotI2RlZmluZSBSX1JFTCAgICgweDAyKQotI2RlZmluZSBSX1RPQyAgICgweDAzKQotI2RlZmluZSBSX1JUQiAgICgweDA0KQotI2RlZmluZSBSX0dMICAgICgweDA1KQotI2RlZmluZSBSX1RDTCAgICgweDA2KQotI2RlZmluZSBSX0JBICAgICgweDA4KQotI2RlZmluZSBSX0JSICAgICgweDBhKQotI2RlZmluZSBSX1JMICAgICgweDBjKQotI2RlZmluZSBSX1JMQSAgICgweDBkKQotI2RlZmluZSBSX1JFRiAgICgweDBmKQotI2RlZmluZSBSX1RSTCAgICgweDEyKQotI2RlZmluZSBSX1RSTEEgICgweDEzKQotI2RlZmluZSBSX1JSVEJJICgweDE0KQotI2RlZmluZSBSX1JSVEJBICgweDE1KQotI2RlZmluZSBSX0NBSSAgICgweDE2KQotI2RlZmluZSBSX0NSRUwgICgweDE3KQotI2RlZmluZSBSX1JCQSAgICgweDE4KQotI2RlZmluZSBSX1JCQUMgICgweDE5KQotI2RlZmluZSBSX1JCUiAgICgweDFhKQotI2RlZmluZSBSX1JCUkMgICgweDFiKQotCi0vKiBUaGUgZmlyc3Qgd29yZCBvZiBnbG9iYWwgbGlua2FnZSBjb2RlLiAgVGhpcyBtdXN0IGJlIG1vZGlmaWVkIGJ5Ci0gICBmaWxsaW5nIGluIHRoZSBjb3JyZWN0IFRPQyBvZmZzZXQuICAqLwotCi0jZGVmaW5lIFhDT0ZGX0dMSU5LX0ZJUlNUICgweDgxODIwMDAwKQkvKiBsd3ogcjEyLDAocjIpICovCi0KLS8qIFRoZSByZW1haW5pbmcgd29yZHMgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhjb2ZmX2dsaW5rX2NvZGVbXSA9Ci17Ci0gIDB4OTA0MTAwMTQsCS8qIHN0dyByMiwyMChyMSkgKi8KLSAgMHg4MDBjMDAwMCwJLyogbHd6IHIwLDAocjEyKSAqLwotICAweDgwNGMwMDA0LAkvKiBsd3ogcjIsNChyMTIpICovCi0gIDB4N2MwOTAzYTYsCS8qIG10Y3RyIHIwICovCi0gIDB4NGU4MDA0MjAsCS8qIGJjdHIgKi8KLSAgMHgwLAkJLyogc3RhcnQgb2YgdHJhY2ViYWNrIHRhYmxlICovCi0gIDB4MDAwYzgwMDAsCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAJCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotfTsKLQotI2RlZmluZSBYQ09GRl9HTElOS19TSVpFIFwKLSAgKCgoc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXSkgKiA0KSArIDQpCi0KLS8qIFdlIHJldXNlIHRoZSBTRUNfUk9NIGZsYWcgYXMgYSBtYXJrIGZsYWcgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgdXNlZCBvbiBpbnB1dCBzZWN0aW9ucy4gICovCi0KLSNkZWZpbmUgU0VDX01BUksgKFNFQ19ST00pCi0KLS8qIFRoZSBsZGhkciBzdHJ1Y3R1cmUuICBUaGlzIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkaGRyCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlcjogY3VycmVudGx5IGFsd2F5cyAxLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3ZlcnNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbnN5bXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25yZWxvYzsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW1wb3J0IGZpbGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lzdGxlbjsKLSAgLyogVGhlIG51bWJlciBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbmltcGlkOwotICAvKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyIHNlY3Rpb24gdG8gdGhlIGZpcnN0Ci0gICAgIGVudHJ5IGluIHRoZSBpbXBvcnQgZmlsZSB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pbXBvZmY7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdGxlbjsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N0b2ZmOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkaGRyCi17Ci0gIGJmZF9ieXRlIGxfdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgbF9uc3ltc1s0XTsKLSAgYmZkX2J5dGUgbF9ucmVsb2NbNF07Ci0gIGJmZF9ieXRlIGxfaXN0bGVuWzRdOwotICBiZmRfYnl0ZSBsX25pbXBpZFs0XTsKLSAgYmZkX2J5dGUgbF9pbXBvZmZbNF07Ci0gIGJmZF9ieXRlIGxfc3RsZW5bNF07Ci0gIGJmZF9ieXRlIGxfc3RvZmZbNF07Ci19OwotCi0jZGVmaW5lIExESERSU1ogKDggKiA0KQotCi0vKiBUaGUgbGRzeW0gc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN5bWJvbCBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHN5bQotewotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgbmFtZSBpZiA8PSBTWU1OTUxFTiBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGNoYXIgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBaZXJvIGlmIHRoZSBzeW1ib2wgbmFtZSBpcyBtb3JlIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX3plcm9lczsKLQkgIC8qIFRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZQotICAgICAgICAgICAgIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX29mZnNldDsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgLyogVGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gIGJmZF92bWEgbF92YWx1ZTsKLSAgLyogVGhlIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0gIHNob3J0IGxfc2NudW07Ci0gIC8qIFRoZSBzeW1ib2wgdHlwZSBhbmQgZmxhZ3MuICAqLwotICBjaGFyIGxfc210eXBlOwotICAvKiBUaGUgc3ltYm9sIHN0b3JhZ2UgY2xhc3MuICAqLwotICBjaGFyIGxfc21jbGFzOwotICAvKiBUaGUgaW1wb3J0IGZpbGUgSUQuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaWZpbGU7Ci0gIC8qIE9mZnNldCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgY2hlY2sgc3RyaW5nLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3Bhcm07Ci19OwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBfbF9uYW1lW1NZTU5NTEVOXTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF9ieXRlIF9sX3plcm9lc1s0XTsKLQkgIGJmZF9ieXRlIF9sX29mZnNldFs0XTsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgYmZkX2J5dGUgbF92YWx1ZVs0XTsKLSAgYmZkX2J5dGUgbF9zY251bVsyXTsKLSAgYmZkX2J5dGUgbF9zbXR5cGVbMV07Ci0gIGJmZF9ieXRlIGxfc21jbGFzWzFdOwotICBiZmRfYnl0ZSBsX2lmaWxlWzRdOwotICBiZmRfYnl0ZSBsX3Bhcm1bNF07Ci19OwotCi0jZGVmaW5lIExEU1lNU1ogKDggKyAzICogNCArIDIgKyAyKQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZm9yIHRoZSBsX3NtdHlwZSBmaWVsZCAodGhlIGxvd2VyIHRocmVlIGJpdHMgYXJlIGFuCi0gICBYVFlfKiB2YWx1ZSkuICAqLwotCi0vKiBJbXBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0lNUE9SVCAoMHg0MCkKLS8qIEVudHJ5IHBvaW50LiAgKi8KLSNkZWZpbmUgTF9FTlRSWSAoMHgyMCkKLS8qIEV4cG9ydGVkIHN5bWJvbC4gICovCi0jZGVmaW5lIExfRVhQT1JUICgweDEwKQotCi0vKiBUaGUgbGRyZWwgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHJlbG9jIGluIHRoZQotICAgLmxvYWRlciBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkcmVsCi17Ci0gIC8qIFRoZSByZWxvYyBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICAvKiBUaGUgc3ltYm9sIHRhYmxlIGluZGV4IGluIHRoZSAubG9hZGVyIHNlY3Rpb24gc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N5bW5keDsKLSAgLyogVGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgc2l6ZS4gICovCi0gIHNob3J0IGxfcnR5cGU7Ci0gIC8qIFRoZSBzZWN0aW9uIG51bWJlciB0aGlzIHJlbG9jYXRpb24gYXBwbGllcyB0by4gICovCi0gIHNob3J0IGxfcnNlY25tOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkcmVsCi17Ci0gIGJmZF9ieXRlIGxfdmFkZHJbNF07Ci0gIGJmZF9ieXRlIGxfc3ltbmR4WzRdOwotICBiZmRfYnl0ZSBsX3J0eXBlWzJdOwotICBiZmRfYnl0ZSBsX3JzZWNubVsyXTsKLX07Ci0KLSNkZWZpbmUgTERSRUxTWiAoMiAqIDQgKyAyICogMikKLQotLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlCi17Ci0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuZXh0OwotICAvKiBUaGUgcGF0aC4gICovCi0gIGNvbnN0IGNoYXIgKnBhdGg7Ci0gIC8qIFRoZSBmaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpmaWxlOwotICAvKiBUaGUgbWVtYmVyIG5hbWUuICAqLwotICBjb25zdCBjaGFyICptZW1iZXI7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgWENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgdGhpcyBpcyB0aGUgLnRjCi0gICAgIHNlY3Rpb24gd2hpY2ggaG9sZHMgaXQuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYSBUT0MgZW50cnkgKHRoZSBYQ09GRl9TRVRfVE9DIGZsYWcgaXMKLQkgc2V0KSwgdGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRvY19zZWN0aW9uLiAgKi8KLSAgICAgIGJmZF92bWEgdG9jX29mZnNldDsKLSAgICAgIC8qIElmIHRoZSBUT0MgZW50cnkgY29tZXMgZnJvbSBhbiBpbnB1dCBmaWxlLCB0aGlzIGlzIHNldCB0byB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBvZiB0aGUgQ19ISURFWFQgWE1DX1RDIG9yIFhNQ19URCBzeW1ib2wuICAqLwotICAgICAgbG9uZyB0b2NfaW5keDsKLSAgICB9IHU7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCB3aGljaCBpcyBjYWxsZWQsIHRoaXMKLSAgICAgZmllbGQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSWYgdGhpcyBzeW1ib2wKLSAgICAgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGlzIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpkZXNjcmlwdG9yOwotCi0gIC8qIFRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZSBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLQotICAvKiBJZiBYQ09GRl9CVUlMVF9MRFNZTSBpcyBzZXQsIHRoaXMgaXMgdGhlIC5sb2FkZXIgc3ltYm9sIHRhYmxlCi0gICAgIGluZGV4LiAgSWYgWENPRkZfQlVJTERfTERTWU0gaXMgY2xlYXIsIGFuZCBYQ09GRl9JTVBPUlQgaXMgc2V0LAotICAgICB0aGlzIGlzIHRoZSBsX2lmaWxlIHZhbHVlLiAgKi8KLSAgbG9uZyBsZGluZHg7Ci0KLSAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX1JFRl9SRUdVTEFSICgwMSkKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9SRUdVTEFSICgwMikKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9EWU5BTUlDICgwNCkKLSAgLyogU3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvYyBiZWluZyBjb3BpZWQgaW50byB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgWENPRkZfTERSRUwgKDAxMCkKLSAgLyogU3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIFhDT0ZGX0VOVFJZICgwMjApCi0gIC8qIFN5bWJvbCBpcyBjYWxsZWQ7IHRoaXMgaXMsIGl0IGFwcGVhcnMgaW4gYSBSX0JSIHJlbG9jLiAgKi8KLSNkZWZpbmUgWENPRkZfQ0FMTEVEICgwNDApCi0gIC8qIFN5bWJvbCBuZWVkcyB0aGUgVE9DIGVudHJ5IGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhDT0ZGX1NFVF9UT0MgKDAxMDApCi0gIC8qIFN5bWJvbCBpcyBleHBsaWNpdGx5IGltcG9ydGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfSU1QT1JUICgwMjAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBleHBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0VYUE9SVCAoMDQwMCkKLSAgLyogU3ltYm9sIGhhcyBiZWVuIHByb2Nlc3NlZCBieSB4Y29mZl9idWlsZF9sZHN5bXMuICAqLwotI2RlZmluZSBYQ09GRl9CVUlMVF9MRFNZTSAoMDEwMDApCi0gIC8qIFN5bWJvbCBpcyBtZW50aW9uZWQgYnkgYSBzZWN0aW9uIHdoaWNoIHdhcyBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9NQVJLICgwMjAwMCkKLSAgLyogU3ltYm9sIHNpemUgaXMgcmVjb3JkZWQgaW4gc2l6ZV9saXN0IGxpc3QgZnJvbSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgWENPRkZfSEFTX1NJWkUgKDA0MDAwKQotICAvKiBTeW1ib2wgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgWENPRkZfREVTQ1JJUFRPUiAoMDEwMDAwKQotICAvKiBNdWx0aXBsZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gZm9yIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEICgwMjAwMDApCi0KLSAgLyogVGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgc21jbGFzOwotfTsKLQotLyogVGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSAuZGVidWcgc3RyaW5nIGhhc2ggdGFibGUuICBXZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyB3aGlsZQotICAgICByZWFkaW5nIHRoZSBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgLmRlYnVnCi0gICAgIHNlY3Rpb24gd2lsbCBiZSBiZWZvcmUgd2UgYXNzaWduIHNlY3Rpb24gcG9zaXRpb25zLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotCi0gIC8qIFRoZSAuZGVidWcgc2VjdGlvbiB3ZSB3aWxsIHVzZSBmb3IgdGhlIGZpbmFsIG91dHB1dC4gICovCi0gIGFzZWN0aW9uICpkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqbG9hZGVyX3NlY3Rpb247Ci0KLSAgLyogQSBjb3VudCBvZiBub24gVE9DIHJlbGF0aXZlIHJlbG9jcyB3aGljaCB3aWxsIG5lZWQgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGluIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotICBzaXplX3QgbGRyZWxfY291bnQ7Ci0KLSAgLyogVGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgLyogVGhlIC5nbCBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqbGlua2FnZV9zZWN0aW9uOwotCi0gIC8qIFRoZSAudGMgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCB0b2MgZW50cmllcyB3ZSBidWlsZCBmb3IgZ2xvYmFsCi0gICAgIGxpbmthZ2UgY29kZS4gICovCi0gIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKLQotICAvKiBUaGUgLmRzIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgd2hpY2ggd2UKLSAgICAgY3JlYXRlIGZvciBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgYXNlY3Rpb24gKmRlc2NyaXB0b3Jfc2VjdGlvbjsKLQotICAvKiBUaGUgbGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmltcG9ydHM7Ci0KLSAgLyogUmVxdWlyZWQgYWxpZ25tZW50IG9mIHNlY3Rpb25zIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLSAgLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seS4gICovCi0gIGJvb2xlYW4gdGV4dHJvOwotCi0gIC8qIFdoZXRoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBkb25lLiAgKi8KLSAgYm9vbGVhbiBnYzsKLQotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGhhdmUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgfSAqc2l6ZV9saXN0OwotCi0gIC8qIE1hZ2ljIHNlY3Rpb25zOiBfdGV4dCwgX2V0ZXh0LCBfZGF0YSwgX2VkYXRhLCBfZW5kLCBlbmQuICAqLwotICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgZHVyaW5nIHRoZQotICAgZmluYWwgbGluayBwaGFzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogSWYgdGhlcmUgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGFuZCB0aGUKLSAgICAgaW5kZXggb2YgdGhlIFRPQyBzeW1ib2wgaXMgbm90IGtub3duIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLAotICAgICBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGlzIGxpbmtlZCBsaXN0LiAgVGhpcyBpcyBub3QgYW4gYXJyYXksCi0gICAgIGxpa2UgcmVsX2hhc2hlcywgYmVjYXVzZSB0aGlzIGNhc2UgaXMgcXVpdGUgdW5jb21tb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICB9ICp0b2NfcmVsX2hhc2hlczsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLXN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBBcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZQotICAgICB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfZmlsZV9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBUT0Mgc3ltYm9sLiAgKi8KLSAgbG9uZyB0b2Nfc3ltaW5keDsKLSAgLyogU3RhcnQgb2YgLmxvYWRlciBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICpsZHN5bTsKLSAgLyogTmV4dCAubG9hZGVyIHJlbG9jIHRvIHN3YXAgb3V0LiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICpsZHJlbDsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzdGFydCBvZiBsaW5lIG51bWJlcnMuICAqLwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci19OwotCi1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGludGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGV4dGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHN5bV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICosIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkcmVsX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICosIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICp4Y29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHhjb2ZmX2ZpbmRfcmVsb2MKLSAgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9zaXplX3R5cGUsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFya19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9tYXJrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3ZWVwIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2J1aWxkX2xkc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgaW50IHhjb2ZmX3NvcnRfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0MCi0vKiBSb3V0aW5lcyB0byBzd2FwIGluZm9ybWF0aW9uIGluIHRoZSBYQ09GRiAubG9hZGVyIHNlY3Rpb24uICBJZiB3ZQotICAgZXZlciBuZWVkIHRvIHdyaXRlIGFuIFhDT0ZGIGxvYWRlciwgdGhpcyBzdHVmZiB3aWxsIG5lZWQgdG8gYmUKLSAgIG1vdmVkIHRvIGFub3RoZXIgZmlsZSBzaGFyZWQgYnkgdGhlIGxpbmtlciAod2hpY2ggWENPRkYgY2FsbHMgdGhlCi0gICBgYGJpbmRlcicnKSBhbmQgdGhlIGxvYWRlci4gICovCi0KLS8qIFN3YXAgaW4gdGhlIGxkaGRyIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGRzdC0+bF92ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24pOwotICBkc3QtPmxfbnN5bXMgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbnN5bXMpOwotICBkc3QtPmxfbnJlbG9jID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYyk7Ci0gIGRzdC0+bF9pc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaXN0bGVuKTsKLSAgZHN0LT5sX25pbXBpZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQpOwotICBkc3QtPmxfaW1wb2ZmID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZik7Ci0gIGRzdC0+bF9zdGxlbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbik7Ci0gIGRzdC0+bF9zdG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24sIGRzdC0+bF92ZXJzaW9uKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zLCBkc3QtPmxfbnN5bXMpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbnJlbG9jLCBkc3QtPmxfbnJlbG9jKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbiwgZHN0LT5sX2lzdGxlbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQsIGRzdC0+bF9uaW1waWQpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfaW1wb2ZmLCBkc3QtPmxfaW1wb2ZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0bGVuLCBkc3QtPmxfc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYsIGRzdC0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgaW4gdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpkc3Q7Ci17Ci0gIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfemVyb2VzKSAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgZHN0LT5fbC5fbF9sLl9sX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgZHN0LT5sX3ZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlKTsKLSAgZHN0LT5sX3NjbnVtID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3NjbnVtKTsKLSAgZHN0LT5sX3NtdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSk7Ci0gIGRzdC0+bF9zbWNsYXMgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbWNsYXMpOwotICBkc3QtPmxfaWZpbGUgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaWZpbGUpOwotICBkc3QtPmxfcGFybSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoc3JjLT5fbC5fbF9sLl9sX3plcm9lcyAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIDAsIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX29mZnNldCwgZHN0LT5fbC5fbF9sLl9sX29mZnNldCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFsdWUsIGRzdC0+bF92YWx1ZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSwgZHN0LT5sX3NjbnVtKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc210eXBlLCBkc3QtPmxfc210eXBlKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc21jbGFzLCBkc3QtPmxfc21jbGFzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlLCBkc3QtPmxfaWZpbGUpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfcGFybSwgZHN0LT5sX3Bhcm0pOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqZHN0OwotewotICBkc3QtPmxfdmFkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIpOwotICBkc3QtPmxfc3ltbmR4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3N5bW5keCk7Ci0gIGRzdC0+bF9ydHlwZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9ydHlwZSk7Ci0gIGRzdC0+bF9yc2Vjbm0gPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkcmVsIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkcmVsX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZHN0OwotewotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIsIGRzdC0+bF92YWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgsIGRzdC0+bF9zeW1uZHgpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUsIGRzdC0+bF9ydHlwZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9yc2Vjbm0sIGRzdC0+bF9yc2Vjbm0pOwotfQotDAotLyogUm91dGluZXMgdG8gcmVhZCBYQ09GRiBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBkb24ndCByZWFsbHkKLSAgIGJlbG9uZyBoZXJlLCBidXQgd2UgYWxyZWFkeSBoYXZlIHRoZSBsZHN5bSBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIGhlcmUuICAqLwotCi0vKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPnVzZWRfYnlfYmZkID0gYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPQotCShiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnN5bXMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogR2V0IHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgcHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnBzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLSAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGNvbnRlbnRzICsgbGRoZHIubF9zdG9mZjsKLQotICBzeW1idWYgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgbGRoZHIubF9uc3ltcyAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGNvbnRlbnRzICsgTERIRFJTWik7Ci0gIGVsc3ltZW5kID0gZWxzeW0gKyBsZGhkci5sX25zeW1zOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKywgc3ltYnVmKyssIHBzeW1zKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCXN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBTWU1OTUxFTjsgaSsrKQotCSAgICBpZiAobGRzeW0uX2wuX2xfbmFtZVtpXSA9PSAnXDAnKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGkgPCBTWU1OTUxFTikKLQkgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IChjaGFyICopIGVsc3ltLT5fbC5fbF9uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYzsKLQotCSAgICAgIGMgPSBiZmRfYWxsb2MgKGFiZmQsIFNZTU5NTEVOICsgMSk7Ci0JICAgICAgaWYgKGMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIG1lbWNweSAoYywgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgICAgIGNbU1lNTk1MRU5dID0gJ1wwJzsKLQkgICAgICBzeW1idWYtPnN5bWJvbC5uYW1lID0gYzsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxkc3ltLmxfc21jbGFzID09IFhNQ19YTykKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICAgIGxkc3ltLmxfc2NudW0pOwotICAgICAgc3ltYnVmLT5zeW1ib2wudmFsdWUgPSBsZHN5bS5sX3ZhbHVlIC0gc3ltYnVmLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0gICAgICBzeW1idWYtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgIT0gMCkKLQlzeW1idWYtPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQKLSAgICAgICAgIHdpdGggdGhlIGxvYWRlciBzeW1ib2wuICAqLwotCi0gICAgICAqcHN5bXMgPSAoYXN5bWJvbCAqKSBzeW1idWY7Ci0gICAgfQotCi0gICpwc3ltcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnN5bXM7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJldHVybiAobGRoZHIubF9ucmVsb2MgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogVGhlIHR5cGljYWwgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2R5bmFtaWNfcmVsb2MgPQotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogR2V0IHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHByZWxvY3MsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnByZWxvY3M7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGFyZWxlbnQgKnJlbGJ1ZjsKLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICplbHJlbCwgKmVscmVsZW5kOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJlbGJ1ZiA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgbGRoZHIubF9ucmVsb2MgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKHJlbGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JICAgKGNvbnRlbnRzICsgTERIRFJTWiArIGxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0gIGVscmVsZW5kID0gZWxyZWwgKyBsZGhkci5sX25yZWxvYzsKLSAgZm9yICg7IGVscmVsIDwgZWxyZWxlbmQ7IGVscmVsKyssIHJlbGJ1ZisrLCBwcmVsb2NzKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gICAgICB4Y29mZl9zd2FwX2xkcmVsX2luIChhYmZkLCBlbHJlbCwgJmxkcmVsKTsKLQotICAgICAgaWYgKGxkcmVsLmxfc3ltbmR4ID49IDMpCi0JcmVsYnVmLT5zeW1fcHRyX3B0ciA9IHN5bXMgKyAobGRyZWwubF9zeW1uZHggLSAzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc3dpdGNoIChsZHJlbC5sX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgbmFtZSA9ICIudGV4dCI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBuYW1lID0gIi5kYXRhIjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyOgotCSAgICAgIG5hbWUgPSAiLmJzcyI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsYnVmLT5hZGRyZXNzID0gbGRyZWwubF92YWRkcjsKLSAgICAgIHJlbGJ1Zi0+YWRkZW5kID0gMDsKLQotICAgICAgLyogTW9zdCBkeW5hbWljIHJlbG9jcyBoYXZlIHRoZSBzYW1lIHR5cGUuICBGSVhNRTogVGhpcyBpcyBvbmx5Ci0gICAgICAgICBjb3JyZWN0IGlmIGxkcmVsLmxfcnR5cGUgPT0gMC4gIEluIG90aGVyIGNhc2VzLCB3ZSBzaG91bGQgdXNlCi0gICAgICAgICBhIGRpZmZlcmVudCBob3d0by4gICovCi0gICAgICByZWxidWYtPmhvd3RvID0gJnhjb2ZmX2R5bmFtaWNfcmVsb2M7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGxfcnNlY25tIGZpZWxkLiAgKi8KLQotICAgICAgKnByZWxvY3MgPSByZWxidWY7Ci0gICAgfQotCi0gICpwcmVsb2NzID0gTlVMTDsKLQotICByZXR1cm4gbGRoZHIubF9ucmVsb2M7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gICAgICByZXQtPnUudG9jX2luZHggPSAtMTsKLSAgICAgIHJldC0+ZGVzY3JpcHRvciA9IE5VTEw7Ci0gICAgICByZXQtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldC0+bGRpbmR4ID0gLTE7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+c21jbGFzID0gWE1DX1VBOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwgeGNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmRlYnVnX3N0cnRhYiA9IF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIHJldC0+ZGVidWdfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+bG9hZGVyX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxkcmVsX2NvdW50ID0gMDsKLSAgbWVtc2V0ICgmcmV0LT5sZGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIpKTsKLSAgcmV0LT5saW5rYWdlX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPnRvY19zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5kZXNjcmlwdG9yX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmltcG9ydHMgPSBOVUxMOwotICByZXQtPmZpbGVfYWxpZ24gPSAwOwotICByZXQtPnRleHRybyA9IGZhbHNlOwotICByZXQtPmdjID0gZmFsc2U7Ci0gIG1lbXNldCAocmV0LT5zcGVjaWFsX3NlY3Rpb25zLCAwLCBzaXplb2YgcmV0LT5zcGVjaWFsX3NlY3Rpb25zKTsKLQotICAvKiBUaGUgbGlua2VyIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGEgZnVsbCBhLm91dCBoZWFkZXIuICBXZSBuZWVkIHRvCi0gICAgIHJlY29yZCB0aGF0IGZhY3Qgbm93LCBiZWZvcmUgdGhlIHNpemVvZl9oZWFkZXJzIHJvdXRpbmUgY291bGQgYmUKLSAgICAgY2FsbGVkLiAgKi8KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgWENPRkYgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotDAotLyogUmVhZCBpbnRlcm5hbCByZWxvY3MgZm9yIGFuIFhDT0ZGIGNzZWN0LiAgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kCi0gICBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3Mgd2hpY2ggdHJpZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYW55Ci0gICByZWxvY3Mgd2hpY2ggbWF5IGhhdmUgYmVlbiBjYWNoZWQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgoteGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCSAgICByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYm9vbGVhbiBjYWNoZTsKLSAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPT0gTlVMTAotICAgICAgJiYgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQotICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5lbmNsb3Npbmc7Ci0KLSAgICAgIGlmIChlbmNsb3NpbmcgIT0gTlVMTAotCSAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpID09IE5VTEwKLQkgICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzID09IE5VTEwpCi0JICAmJiBjYWNoZQotCSAgJiYgZW5jbG9zaW5nLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgaWYgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgZW5jbG9zaW5nLCB0cnVlLAotCQkJCQkgICAgICBleHRlcm5hbF9yZWxvY3MsIGZhbHNlLAotCQkJCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpCi0JICAgICAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3Qgb2ZmOwotCi0JICBvZmYgPSAoKHNlYy0+cmVsX2ZpbGVwb3MgLSBlbmNsb3NpbmctPnJlbF9maWxlcG9zKQotCQkgLyBiZmRfY29mZl9yZWxzeiAoYWJmZCkpOwotCSAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQkgICAgcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgKyBvZmY7Ci0JICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywKLQkJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmLAotCQkgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotCSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCQkJIHJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcyk7Ci19Ci0MCi0vKiBHaXZlbiBhbiBYQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIHhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLQotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICAvKiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGRvIHRoZSB1c3VhbCBzZWFyY2guICBXZSB0aGVuIG5lZWQKLSAgICAgICAgIHRvIGNoZWNrIHRoZSBhcmNoaXZlIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMsIGJlY2F1c2UKLSAgICAgICAgIHRoZXkgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcCBldmVuIHRob3VnaCB0aGV5Ci0gICAgICAgICBzaG91bGQsIHBlcmhhcHMsIGJlIGluY2x1ZGVkLiAgSWYgdGhlIGFyY2hpdmUgaGFzIG5vIG1hcCwgd2UKLSAgICAgICAgIGp1c3QgY29uc2lkZXIgZWFjaCBvYmplY3QgZmlsZSBpbiB0dXJuLCBzaW5jZSB0aGF0IGFwcGFyZW50bHkKLSAgICAgICAgIGlzIHdoYXQgdGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotICAgICAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLQl7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCQkgKGFiZmQsIGluZm8sIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHsKLQliZmQgKm1lbWJlcjsKLQotCW1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0Jd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KQotCQkmJiAoISBiZmRfaGFzX21hcCAoYWJmZCkKLQkJICAgIHx8ICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLQkJCSYmIChtZW1iZXItPmZsYWdzICYgSEFTX1NZTVMpID09IDApKSkKLQkgICAgICB7Ci0JCWJvb2xlYW4gbmVlZGVkOwotCi0JCWlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChtZW1iZXIsIGluZm8sICZuZWVkZWQpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKG5lZWRlZCkKLQkJICBtZW1iZXItPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIH0KLQkgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgbWVtYmVyKTsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIFhDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgeGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmsKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm4geGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUICYmIHN5bS5uX3NjbnVtICE9IE5fVU5ERUYpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgWENPRkYgbGlua2VycyBkbyBub3QgYnJpbmcgaW4gYW4gb2JqZWN0IGZpbGUgd2hpY2gKLQkgICAgIGRlZmluZXMgaXQuICBXZSBhbHNvIGRvbid0IGJyaW5nIGluIHN5bWJvbHMgdG8gc2F0aXNmeQotCSAgICAgdW5kZWZpbmVkIHJlZmVyZW5jZXMgaW4gc2hhcmVkIG9iamVjdHMuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYwotCQkgIHx8ICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBsb2FkZXIgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBkeW5hbWljIG9iamVjdAotICAgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgVGhlIG5hdGl2ZSBsaW5rZXIgdXNlcyB0aGUgbG9hZGVyCi0gICBzeW1ib2xzLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIHNvIHdlIGRvIHRvby4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBzeW1ib2xzLCBzbyBkb24ndCB0cnkgdG8gaW5jbHVkZSBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYnVmID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCW5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChuYW1idWYsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgIG5hbWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCSAgbmFtZSA9IG5hbWJ1ZjsKLQl9Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgICAgICAgdW5kZWZpbmVkLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0gICAgICAgICBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JICAgICAgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgc2hhcmVkIG9iamVjdC4gICovCi0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpbmRleCBvZiByZWxvYyBpbiBSRUxPQ1Mgd2l0aCB0aGUgbGVhc3QgYWRkcmVzcyBncmVhdGVyCi0gICB0aGFuIG9yIGVxdWFsIHRvIEFERFJFU1MuICBUaGUgcmVsb2NzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi14Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGNvdW50LCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfc2l6ZV90eXBlIG1pbiwgbWF4LCB0aGlzOwotCi0gIGlmIChjb3VudCA8IDIpCi0gICAgewotICAgICAgaWYgKGNvdW50ID09IDEgJiYgcmVsb2NzWzBdLnJfdmFkZHIgPCBhZGRyZXNzKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICBtaW4gPSAwOwotICBtYXggPSBjb3VudDsKLQotICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggb3ZlciAobWluLG1heF0uICAqLwotICB3aGlsZSAobWluICsgMSA8IG1heCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJhZGRyOwotCi0gICAgICB0aGlzID0gKG1heCArIG1pbikgLyAyOwotICAgICAgcmFkZHIgPSByZWxvY3NbdGhpc10ucl92YWRkcjsKLSAgICAgIGlmIChyYWRkciA+IGFkZHJlc3MpCi0JbWF4ID0gdGhpczsKLSAgICAgIGVsc2UgaWYgKHJhZGRyIDwgYWRkcmVzcykKLQltaW4gPSB0aGlzOwotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IHRoaXM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChyZWxvY3NbbWluXS5yX3ZhZGRyIDwgYWRkcmVzcykKLSAgICByZXR1cm4gbWluICsgMTsKLQotICB3aGlsZSAobWluID4gMAotCSAmJiByZWxvY3NbbWluIC0gMV0ucl92YWRkciA9PSBhZGRyZXNzKQotICAgIC0tbWluOwotCi0gIHJldHVybiBtaW47Ci19Ci0KLS8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgWENPRkYgaXMgYSB3ZWlyZCBmb3JtYXQuICBBIG5vcm1hbCBYQ09GRiAubyBmaWxlcyB3aWxsIGhhdmUgdGhyZWUKLSAgIENPRkYgc2VjdGlvbnMtLS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MtLWJ1dCBlYWNoIENPRkYgc2VjdGlvbiB3aWxsCi0gICBjb250YWluIG1hbnkgY3NlY3RzLiAgVGhlc2UgY3NlY3RzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHN5bWJvbAotICAgdGFibGUuICBGcm9tIHRoZSBsaW5rZXIncyBwb2ludCBvZiB2aWV3LCBlYWNoIGNzZWN0IG11c3QgYmUKLSAgIGNvbnNpZGVyZWQgYSBzZWN0aW9uIGluIGl0cyBvd24gcmlnaHQuICBGb3IgZXhhbXBsZSwgYSBUT0MgZW50cnkgaXMKLSAgIGhhbmRsZWQgYXMgYSBzbWFsbCBYTUNfVEMgY3NlY3QuICBUaGUgbGlua2VyIG11c3QgYmUgYWJsZSB0byBtZXJnZQotICAgZGlmZmVyZW50IFRPQyBlbnRyaWVzIHRvZ2V0aGVyLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgYmUgYWJsZSB0bwotICAgZXh0cmFjdCB0aGUgWE1DX1RDIGNzZWN0cyBmcm9tIHRoZSAuZGF0YSBzZWN0aW9uIG9mIHRoZSBpbnB1dCAubwotICAgZmlsZS4KLQotICAgRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBvdXIgbGlua2VyLCB0aGlzIGlzLCBvZiBjb3Vyc2UsIGEgaGlkZW91cwotICAgbmlnaHRtYXJlLiAgV2UgY29wZSBieSBhY3R1YWxseSBjcmVhdGluZyBzZWN0aW9ucyBmb3IgZWFjaCBjc2VjdCwKLSAgIGFuZCBkaXNjYXJkaW5nIHRoZSBvcmlnaW5hbCBzZWN0aW9ucy4gIFdlIHRoZW4gaGF2ZSB0byBoYW5kbGUgdGhlCi0gICByZWxvY2F0aW9uIGVudHJpZXMgY2FyZWZ1bGx5LCBzaW5jZSB0aGUgb25seSB3YXkgdG8gdGVsbCB3aGljaAotICAgY3NlY3QgdGhleSBiZWxvbmcgdG8gaXMgdG8gZXhhbWluZSB0aGUgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGRlZmF1bHRfY29weTsKLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqKmNzZWN0X2NhY2hlOwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYXNlY3Rpb24gKm87Ci0gIGFzZWN0aW9uICpsYXN0X3JlYWw7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBhc2VjdGlvbiAqY3NlY3Q7Ci0gIHVuc2lnbmVkIGludCBjc2VjdF9pbmRleDsKLSAgYXNlY3Rpb24gKmZpcnN0X2NzZWN0OwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IHJlbG9jX2luZm9fc3RydWN0Ci0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgICAgIGJmZF9ieXRlICpsaW5lbm9zOwotICAgIH0gKnJlbG9jX2luZm8gPSBOVUxMOwotCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBidWlsZCBhIC5sb2FkZXIgc2VjdGlvbiwgc28gd2UgZG8gaXQgaGVyZS4gIFRoaXMKLQkgd29uJ3Qgd29yayBpZiB3ZSdyZSBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUgd2l0aCBubwotCSBYQ09GRiBpbnB1dCBmaWxlcy4gIEZJWE1FLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmxvYWRlciIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBsaW5rYWdlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmdsIik7Ci0JICBpZiAobHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgbHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIFRPQyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqdHNlYzsKLQotCSAgdHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRjIik7Ci0JICBpZiAodHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbiA9IHRzZWM7Ci0JICB0c2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICB0c2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmRzZWM7Ci0KLQkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5kcyIpOwotCSAgaWYgKGRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGRzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPT0gTlVMTAotCSAgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZGVidWciKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPSBkc2VjOwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBpbmZvLT5zdGF0aWNfbGluaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuX3RtYXNrID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIChzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIEJlY2F1c2Ugb2YgdGhlIHdlaXJkIHN0dWZmIHdlIGFyZSBkb2luZyB3aXRoIFhDT0ZGIGNzZWN0cywgd2UgY2FuCi0gICAgIG5vdCBlYXNpbHkgZGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb24gYSBzeW1ib2wgaXMgaW4sIHNvIHdlIHN0b3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoZSBpbnB1dCBmaWxlLiAgKi8KLSAgY3NlY3RfY2FjaGUgPSAoKGFzZWN0aW9uICoqKQotCQkgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKGNzZWN0X2NhY2hlID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNzZWN0cyA9IGNzZWN0X2NhY2hlOwotICBtZW1zZXQgKGNzZWN0X2NhY2hlLCAwLCAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCi0gIC8qIFdoaWxlIHNwbGl0dGluZyBzZWN0aW9ucyBpbnRvIGNzZWN0cywgd2UgbmVlZCB0byBhc3NpZ24gdGhlCi0gICAgIHJlbG9jcyBjb3JyZWN0bHkuICBUaGUgcmVsb2NzIGFuZCB0aGUgY3NlY3RzIG11c3QgYm90aCBiZSBpbgotICAgICBvcmRlciBieSBWTUEgd2l0aGluIGEgZ2l2ZW4gc2VjdGlvbiwgc28gd2UgaGFuZGxlIHRoaXMgYnkKLSAgICAgc2Nhbm5pbmcgYWxvbmcgdGhlIHJlbG9jcyBhcyB3ZSBwcm9jZXNzIHRoZSBjc2VjdHMuICBXZSBpbmRleAotICAgICBpbnRvIHJlbG9jX2luZm8gdXNpbmcgdGhlIHNlY3Rpb24gdGFyZ2V0X2luZGV4LiAgKi8KLSAgcmVsb2NfaW5mbyA9ICgoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0ICopCi0JCWJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSkpOwotICBpZiAocmVsb2NfaW5mbyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKChQVFIpIHJlbG9jX2luZm8sIDAsCi0JICAoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfaW5mb19zdHJ1Y3QpKTsKLQotICAvKiBSZWFkIGluIHRoZSByZWxvY3MgYW5kIGxpbmUgbnVtYmVycyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbGFzdF9yZWFsID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgbGFzdF9yZWFsID0gbzsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgIHhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwKLQkJCQkJZmFsc2UsIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0KLQkgICAgKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMsIDAsCi0JCSAgby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQl9Ci0KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgby0+bGluZW5vX2NvdW50ID4gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbGluZW5vczsKLQotCSAgbGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5saW5lbm9fY291bnQgKiBsaW5lc3opOwotCSAgaWYgKGxpbmVub3MgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IGxpbmVub3M7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LCBhYmZkKQotCQkgICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgY3NlY3QgPSBOVUxMOwotICBjc2VjdF9pbmRleCA9IDA7Ci0gIGZpcnN0X2NzZWN0ID0gTlVMTDsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgaW50IHNtdHlwOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpzZXRfdG9jOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIC8qIEluIHRoaXMgcGFzcyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgd2l0aCBjc2VjdAotICAgICAgICAgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCAmJiBzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQpCi0JewotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUgJiYgY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICAgIGNzZWN0ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0JICBlbHNlIGlmIChmaXJzdF9jc2VjdCA9PSBOVUxMIHx8IHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgZWxzZQotCSAgICAqY3NlY3RfY2FjaGUgPSBOVUxMOwotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotCSAgY3NlY3RfY2FjaGUgKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBpdCwKLSAgICAgICAgIGFuZCB3ZSdyZSBub3Qgc3RyaXBwaW5nIGl0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kCi0gICAgICAgICBhZGQgdGhlbSB0byB0aGUgY291bnQgZm9yIHRoaXMgY3NlY3QuICBJbiB0aGUgZmluYWwgbGluayBwYXNzCi0gICAgICAgICB3ZSBhcmUgZ29pbmcgdG8gYXR0YWNoIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJ5IHN5bWJvbCwKLSAgICAgICAgIHJhdGhlciB0aGFuIGJ5IHNlY3Rpb24sIGluIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZQotICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgc3ltLm5fbnVtYXV4ID4gMQotCSAgJiYgY3NlY3QgIT0gTlVMTAotCSAgJiYgSVNGQ04gKHN5bS5uX3R5cGUpKQotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhsaW47Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIHN5bWVzeiksCi0JCQkJc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJCTAsIHN5bS5uX251bWF1eCwgKFBUUikgJmF1eGxpbik7Ci0JICBpZiAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKLQotCSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5lbmNsb3Npbmc7Ci0JICAgICAgaWYgKGVuY2xvc2luZyA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IGAlcycgaGFzIGxpbmUgbnVtYmVycyBidXQgbm8gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBsaW5vZmYgPSAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cgotCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0JICAgICAgaWYgKGxpbm9mZiA8IGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KQotCQl7Ci0JCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47Ci0JCSAgYmZkX2J5dGUgKmxpbnBzdGFydDsKLQotCQkgIGxpbnBzdGFydCA9IChyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5saW5lbm9zCi0JCQkgICAgICAgKyBsaW5vZmYpOwotCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wc3RhcnQsIChQVFIpICZsaW4pOwotCQkgIGlmIChsaW4ubF9sbm5vID09IDAKLQkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBsaW4ubF9hZGRyLmxfc3ltbmR4Ci0JCQkgID09ICgoZXN5bQotCQkJICAgICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgICAgLyBzeW1lc3opKSkKLQkJICAgIHsKLQkJICAgICAgYmZkX2J5dGUgKmxpbnBlbmQsICpsaW5wOwotCi0JCSAgICAgIGxpbnBlbmQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJCSArIGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkJICAgICAgZm9yIChsaW5wID0gbGlucHN0YXJ0ICsgbGluZXN6OwotCQkJICAgbGlucCA8IGxpbnBlbmQ7Ci0JCQkgICBsaW5wICs9IGxpbmVzeikKLQkJCXsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAoUFRSKSAmbGluKTsKLQkJCSAgaWYgKGxpbi5sX2xubm8gPT0gMCkKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgICAgY3NlY3QtPmxpbmVub19jb3VudCArPSAobGlucCAtIGxpbnBzdGFydCkgLyBsaW5lc3o7Ci0JCSAgICAgIC8qIFRoZSBzZXR0aW5nIG9mIGxpbmVfZmlsZXBvcyB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgaWYgYWxsIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3NlY3QgYXJlIGNvbnRpZ3VvdXM7IHRoaXMgb25seSBtYXR0ZXJzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHJlcG9ydGluZy4gICovCi0JCSAgICAgIGlmIChjc2VjdC0+bGluZV9maWxlcG9zID09IDApCi0JCQljc2VjdC0+bGluZV9maWxlcG9zID0KLQkJCSAgYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQaWNrIHVwIHRoZSBjc2VjdCBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAoc3ltLm5fbnVtYXV4ID09IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY2xhc3MgJWQgc3ltYm9sIGAlcycgaGFzIG5vIGF1eCBlbnRyaWVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltLm5fc2NsYXNzLCBuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwKLQkJCSAgICAoUFRSKSAoZXN5bSArIHN5bWVzeiAqIHN5bS5uX251bWF1eCksCi0JCQkgICAgc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJICAgIHN5bS5uX251bWF1eCAtIDEsIHN5bS5uX251bWF1eCwKLQkJCSAgICAoUFRSKSAmYXV4KTsKLQotICAgICAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIHNlY3Rpb24gPSBOVUxMOwotICAgICAgdmFsdWUgPSAwOwotICAgICAgc2V0X3RvYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoc210eXApCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIGNzZWN0IHR5cGUgJWQiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzbXR5cCk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JY2FzZSBYVFlfRVI6Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgfHwgc3ltLm5fc2NudW0gIT0gTl9VTkRFRgotCSAgICAgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywgc3ltLm5fc2NudW0sCi0JCSBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBBbiBYTUNfWE8gZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIGFjdHVhbGx5IGEgcmVmZXJlbmNlIHRvCi0gICAgICAgICAgICAgYW4gYWJzb2x1dGUgbG9jYXRpb24uICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19YTykKLQkgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWx1ZSA9IHN5bS5uX3ZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX1NEOgotCSAgLyogVGhpcyBpcyBhIGNzZWN0IGRlZmluaXRpb24uICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGNzZWN0ID0gTlVMTDsKLQkgIGNzZWN0X2luZGV4ID0gLTE7Ci0KLQkgIC8qIFdoZW4gd2Ugc2VlIGEgVE9DIGFuY2hvciwgd2UgcmVjb3JkIHRoZSBUT0MgdmFsdWUuICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JCSAgfHwgYXV4LnhfY3NlY3QueF9zY25sZW4ubCAhPSAwKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFhNQ19UQzAgc3ltYm9sIGAlcycgaXMgY2xhc3MgJWQgc2NubGVuICVkIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywKLQkJICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHhjb2ZmX2RhdGEgKGFiZmQpLT50b2MgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICAvKiBXZSBtdXN0IG1lcmdlIFRPQyBlbnRyaWVzIGZvciB0aGUgc2FtZSBzeW1ib2wuICBXZSBjYW4KLQkgICAgIG1lcmdlIHR3byBUT0MgZW50cmllcyBpZiB0aGV5IGFyZSBib3RoIENfSElERVhULCB0aGV5Ci0JICAgICBib3RoIGhhdmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgYm90aCA0IGJ5dGVzIGxvbmcsIGFuZAotCSAgICAgdGhleSBib3RoIGhhdmUgYSByZWxvY2F0aW9uIHRhYmxlIGVudHJ5IGZvciBhbiBleHRlcm5hbAotCSAgICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKLQkgICAgIHRoYXQgd2UgbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWNrLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiBzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3Njbmxlbi5sID09IDQKLQkgICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLQotCSAgICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICByZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICAgICAgcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICBzeW0ubl92YWx1ZSk7Ci0JICAgICAgcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkgICAgICBpZiAocmVsaW5keCA8IGVuY2xvc2luZy0+cmVsb2NfY291bnQKLQkJICAmJiByZWwtPnJfdmFkZHIgPT0gKGJmZF92bWEpIHN5bS5uX3ZhbHVlCi0JCSAgJiYgcmVsLT5yX3NpemUgPT0gMzEKLQkJICAmJiByZWwtPnJfdHlwZSA9PSBSX1BPUykKLQkJewotCQkgIGJmZF9ieXRlICplcmVsc3ltOwotCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgcmVsc3ltOwotCi0JCSAgZXJlbHN5bSA9ICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCSAgICAgKyByZWwtPnJfc3ltbmR4ICogc3ltZXN6KTsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXJlbHN5bSwgKFBUUikgJnJlbHN5bSk7Ci0JCSAgaWYgKHJlbHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqcmVsbmFtZTsKLQkJICAgICAgY2hhciByZWxidWZbU1lNTk1MRU4gKyAxXTsKLQkJICAgICAgYm9vbGVhbiBjb3B5OwotCQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZSBUT0MgZW50cnkgaXMKLQkJCSBmb3IgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0JCSAgICAgIHJlbG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZyZWxzeW0sCi0JCQkJCQkJCXJlbGJ1Zik7Ci0JCSAgICAgIGlmIChyZWxuYW1lID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBvbmx5IG1lcmdlIFRPQyBlbnRyaWVzIGlmIHRoZSBUQyBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIHN5bWJvbCBuYW1lLiAgVGhpcyBoYW5kbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBjYXNlLCBidXQgbm90IGNvbW1vbiBjYXNlcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1lNLlA0IHdoaWNoIGdjYyBnZW5lcmF0ZXMgdG8gc3RvcmUgU1lNICsgNAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBUT0MuICBGSVhNRS4gICovCi0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHJlbG5hbWUpID09IDApCi0JCQl7Ci0JCQkgIGNvcHkgPSAoISBpbmZvLT5rZWVwX21lbW9yeQotCQkJCSAgfHwgcmVsc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKTsKLQkJCSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAgcmVsbmFtZSwgdHJ1ZSwgY29weSwKLQkJCQkJCSAgICAgIGZhbHNlKTsKLQkJCSAgaWYgKGggPT0gTlVMTCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICAvKiBBdCB0aGlzIHBvaW50IGgtPnJvb3QudHlwZSBjb3VsZCBiZQotCQkJICAgICBiZmRfbGlua19oYXNoX25ldy4gIFRoYXQgc2hvdWxkIGJlIE9LLAotCQkJICAgICBzaW5jZSB3ZSBrbm93IGZvciBzdXJlIHRoYXQgd2Ugd2lsbCBjb21lCi0JCQkgICAgIGFjcm9zcyB0aGlzIHN5bWJvbCBhcyB3ZSBzdGVwIHRocm91Z2ggdGhlCi0JCQkgICAgIGZpbGUuICAqLwotCi0JCQkgIC8qIFdlIHN0b3JlIGggaW4gKnN5bV9oYXNoIGZvciB0aGUKLQkJCSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkJCSAgICAgZnVuY3Rpb24uICAqLwotCQkJICAqc3ltX2hhc2ggPSBoOwotCi0JCQkgIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIGFzZWN0aW9uICoqcmVsX2NzZWN0czsKLQotCQkJICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgVE9DIGVudHJ5IGZvciB0aGlzCi0JCQkJIHN5bWJvbCwgc28gd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMKLQkJCQkgb25lLiAgKi8KLQkJCSAgICAgIHJlbF9jc2VjdHMgPQotCQkJCXJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0czsKLQkJCSAgICAgIHJlbF9jc2VjdHNbcmVsaW5keF0gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBUT0MgZW50cnkgZm9yCi0JCQkgICAgIHRoaXMgc3ltYm9sLiAgKi8KLQkJCSAgc2V0X3RvYyA9IGg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgV2UgZ2V0IHRoZSBuYW1lIGZyb20KLQkgICAgIHRoZSBjc2VjdCBzdG9yYWdlIG1hcHBpbmcgY2xhc3MsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4KLQkgICAgIGFjY3VtdWxhdGUgc2ltaWxhciBjc2VjdHMgdG9nZXRoZXIuICAqLwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqY3NlY3RfbmFtZV9ieV9jbGFzc1tdID0KLQkgICAgICB7Ci0JCSIucHIiLCAiLnJvIiwgIi5kYiIsICIudGMiLCAiLnVhIiwgIi5ydyIsICIuZ2wiLCAiLnhvIiwKLQkJIi5zdiIsICIuYnMiLCAiLmRzIiwgIi51YyIsICIudGkiLCAiLnRiIiwgTlVMTCwgIi50YzAiLAotCQkiLnRkIgotCSAgICAgIH07Ci0JICAgIGNvbnN0IGNoYXIgKmNzZWN0X25hbWU7Ci0JICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLQkgICAgaWYgKChhdXgueF9jc2VjdC54X3NtY2xhcyA+PQotCQkgc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3MgLyBzaXplb2YgY3NlY3RfbmFtZV9ieV9jbGFzc1swXSkKLQkJfHwgY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc10gPT0gTlVMTCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBzbWNsYXMgJWQiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIGF1eC54X2NzZWN0Lnhfc21jbGFzKTsKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIH0KLQotCSAgICBjc2VjdF9uYW1lID0gY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc107Ci0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIGNzZWN0X25hbWUpOwotCSAgICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgZW5jbG9zaW5nID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBzeW0ubl9zY251bSk7Ci0JICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlbmNsb3NpbmcpCi0JCSYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPCBlbmNsb3NpbmctPnZtYQotCQkgICAgfHwgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSArIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJCT4gZW5jbG9zaW5nLT52bWEgKyBlbmNsb3NpbmctPl9yYXdfc2l6ZSkpKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0JICAgIGNzZWN0LT52bWEgPSBzeW0ubl92YWx1ZTsKLQkgICAgY3NlY3QtPmZpbGVwb3MgPSAoZW5jbG9zaW5nLT5maWxlcG9zCi0JCQkgICAgICArIHN5bS5uX3ZhbHVlCi0JCQkgICAgICAtIGVuY2xvc2luZy0+dm1hKTsKLQkgICAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIGNzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBTTVRZUF9BTElHTiAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLQkgICAgLyogUmVjb3JkIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoaXMgbmV3Ci0JICAgICAgIHNlY3Rpb24uICAqLwotCSAgICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY3NlY3QtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nID0gZW5jbG9zaW5nOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGluZW5vX2NvdW50ID0KLQkgICAgICBlbmNsb3NpbmctPmxpbmVub19jb3VudDsKLQotCSAgICBpZiAoZW5jbG9zaW5nLT5vd25lciA9PSBhYmZkKQotCSAgICAgIHsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0JCWJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JCWFzZWN0aW9uICoqcmVsX2NzZWN0OwotCi0JCXJlbG9jcyA9IHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkJcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICAgIGNzZWN0LT52bWEpOwotCQlyZWwgPSByZWxvY3MgKyByZWxpbmR4OwotCQlyZWxfY3NlY3QgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0uY3NlY3RzCi0JCQkgICAgICsgcmVsaW5keCk7Ci0JCWNzZWN0LT5yZWxfZmlsZXBvcyA9IChlbmNsb3NpbmctPnJlbF9maWxlcG9zCi0JCQkJICAgICAgKyByZWxpbmR4ICogYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkJd2hpbGUgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgICAgICAmJiAqcmVsX2NzZWN0ID09IE5VTEwKLQkJICAgICAgICYmIHJlbC0+cl92YWRkciA8IGNzZWN0LT52bWEgKyBjc2VjdC0+X3Jhd19zaXplKQotCQkgIHsKLQkJICAgICpyZWxfY3NlY3QgPSBjc2VjdDsKLQkJICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JCSAgICArK2NzZWN0LT5yZWxvY19jb3VudDsKLQkJICAgICsrcmVsaW5keDsKLQkJICAgICsrcmVsOwotCQkgICAgKytyZWxfY3NlY3Q7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgZmllbGRzIGFuZCBzZWN0aW9uIGZsYWdzCi0JICAgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgLyBzeW1lc3opOwotCi0JICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgICBmaXJzdF9jc2VjdCA9IGNzZWN0OwotCi0JICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIENfRVhULCB3ZSB0cmVhdCBpdCBhcyBzdGFydGluZyBhdCB0aGUKLQkgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNlY3Rpb24uICAqLwotCSAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IGNzZWN0OwotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCi0JICAgIC8qIElmIHRoaXMgaXMgYSBUT0Mgc2VjdGlvbiBmb3IgYSBzeW1ib2wsIHJlY29yZCBpdC4gICovCi0JICAgIGlmIChzZXRfdG9jICE9IE5VTEwpCi0JICAgICAgc2V0X3RvYy0+dG9jX3NlY3Rpb24gPSBjc2VjdDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBYVFlfTEQ6Ci0JICAvKiBUaGlzIGlzIGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoZSB4X3NjbmxlbiBmaWVsZCBpcyB0aGUKLSAgICAgICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNzZWN0LiAgSSBiZWxpZXZlIHRoYXQgdGhpcyBtdXN0Ci0gICAgICAgICAgICAgYWx3YXlzIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgWFRZX1NEIHN5bWJvbCwgc28gSSB3aWxsCi0gICAgICAgICAgICAgaW5zaXN0IG9uIGl0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBiYWQ7Ci0KLQkgICAgYmFkID0gZmFsc2U7Ci0JICAgIGlmIChhdXgueF9jc2VjdC54X3Njbmxlbi5sIDwgMAotCQl8fCAoYXV4LnhfY3NlY3QueF9zY25sZW4ubAotCQkgICAgPj0gZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkpCi0JICAgICAgYmFkID0gdHJ1ZTsKLQkgICAgaWYgKCEgYmFkKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHNbYXV4LnhfY3NlY3QueF9zY25sZW4ubF07Ci0JCWlmIChzZWN0aW9uID09IE5VTEwKLQkJICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JCSAgYmFkID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGlmIChiYWQpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IG1pc3BsYWNlZCBYVFlfTEQgYCVzJyIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgdmFsdWUgPSBzeW0ubl92YWx1ZSAtIGNzZWN0LT52bWE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0NNOgotCSAgLyogVGhpcyBpcyBhbiB1bml0aWFsaXplZCBjc2VjdC4gIFdlIGNvdWxkIGJhc2UgdGhlIG5hbWUgb24KLSAgICAgICAgICAgICB0aGUgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGV4Y2VwdCBmb3IKLSAgICAgICAgICAgICBhbiBYTUNfVEQgc3ltYm9sLiAgSWYgdGhpcyBjc2VjdCBpcyBleHRlcm5hbGx5IHZpc2libGUsCi0gICAgICAgICAgICAgaXQgaXMgYSBjb21tb24gc3ltYm9sLiAgV2UgcHV0IFhNQ19URCBzeW1ib2xzIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgbmFtZWQgLnRvY2JzcywgYW5kIHJlbHkgb24gdGhlIGxpbmtlciBzY3JpcHQgdG8gcHV0IHRoYXQKLSAgICAgICAgICAgICBpbiB0aGUgVE9DIGFyZWEuICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEQpCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIudG9jYnNzIik7Ci0JICBlbHNlCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuYnNzIik7Ci0JICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICBjc2VjdC0+X3Jhd19zaXplID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCSAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgd2hpY2ggd2UgZG8gbm90IGJvdGhlciB0byBzZXQuICAqLwotCi0JICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAvIHN5bWVzeik7Ci0KLQkgIGNzZWN0LT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmZpcnN0X3N5bW5keCA9IGNzZWN0X2luZGV4OwotCi0JICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBjc2VjdDsKLQkgICAgICB2YWx1ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzLiAgKi8KLSAgICAgIGlmICgoc210eXAgPT0gWFRZX1NEIHx8IHNtdHlwID09IFhUWV9DTSkKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19UQwotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgIT0gWE1DX1REKQotCXsKLQkgIGludCBpOwotCi0JICBpID0gLTE7Ci0JICBpZiAobmFtZVswXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiX3RleHQiKSA9PSAwKQotCQlpID0gMDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZXRleHQiKSA9PSAwKQotCQlpID0gMTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZGF0YSIpID09IDApCi0JCWkgPSAyOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lZGF0YSIpID09IDApCi0JCWkgPSAzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lbmQiKSA9PSAwKQotCQlpID0gNDsKLQkgICAgfQotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAnZScgJiYgc3RyY21wIChuYW1lLCAiZW5kIikgPT0gMCkKLQkgICAgaSA9IDU7Ci0KLQkgIGlmIChpICE9IC0xKQotCSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3BlY2lhbF9zZWN0aW9uc1tpXSA9IGNzZWN0OwotCX0KLQotICAgICAgLyogTm93IHdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFkZCB0aGUgc3ltYm9sIHRvIHRoZQotICAgICAgICAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCXsKLQkgIGJvb2xlYW4gY29weTsKLQotCSAgQkZEX0FTU0VSVCAoc2VjdGlvbiAhPSBOVUxMKTsKLQotCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgY29weSA9IGRlZmF1bHRfY29weTsKLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAotCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBjb3B5ID0gdHJ1ZTsKLQotCSAgLyogVGhlIEFJWCBsaW5rZXIgYXBwZWFycyB0byBvbmx5IGRldGVjdCBtdWx0aXBsZSBzeW1ib2wKLQkgICAgIGRlZmluaXRpb25zIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbC4gIElmCi0JICAgICBhIHN5bWJvbCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLCBhbmQgdGhlIG9ubHkKLQkgICAgIHJlZmVyZW5jZXMgYXJlIGZyb20gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBpdC4gIEl0IGRvZXMgbm90IG1lcmdlIHRoZSBkaWZmZXJlbnQKLQkgICAgIGRlZmluaXRpb25zLCBidXQgaGFuZGxlcyB0aGVtIGluZGVwZW5kZW50bHkuICBPbiB0aGUKLQkgICAgIG90aGVyIGhhbmQsIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlLCB0aGUgbGlua2VyIHJlcG9ydHMKLQkgICAgIGFuIGVycm9yLgotCi0JICAgICBUaGlzIG1hdHRlcnMgYmVjYXVzZSB0aGUgQUlYIDxuZXQvbmV0X2dsb2JhbHMuaD4gaGVhZGVyCi0JICAgICBmaWxlIGFjdHVhbGx5IGRlZmluZXMgYW4gaW5pdGlhbGl6ZWQgYXJyYXksIHNvIHdlIGhhdmUgdG8KLQkgICAgIGFjdHVhbGx5IHBlcm1pdCB0aGF0IHRvIHdvcmsuCi0KLQkgICAgIEp1c3QgdG8gbWFrZSBtYXR0ZXJzIGV2ZW4gbW9yZSBjb25mdXNpbmcsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgd2hlbmV2ZXIKLQkgICAgIHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBpbiBhbiBhcmNoaXZlIHJhdGhlciB0aGFuIGFuCi0JICAgICBvYmplY3QgZmlsZS4gIFRoaXMgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG1hbm5lciBpbgotCSAgICAgd2hpY2ggaXQgaGFuZGxlcyBhcmNoaXZlczogSSB0aGluayBpdCBtYXkgbG9hZCB0aGUgZW50aXJlCi0JICAgICBhcmNoaXZlIGluIGFzIHNlcGFyYXRlIGNzZWN0cywgYW5kIHRoZW4gbGV0IGdhcmJhZ2UKLQkgICAgIGNvbGxlY3Rpb24gZGlzY2FyZCBzeW1ib2xzLgotCi0JICAgICBXZSBhbHNvIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHN0YXRpY2FsbHkgbGlua2luZyBhCi0JICAgICBzaGFyZWQgb2JqZWN0LCB3aGljaCB3aWxsIGNhdXNlIHN5bWJvbCByZWRlZmluaXRpb25zLAotCSAgICAgYWx0aG91Z2ggdGhpcyBpcyBhbiBlYXNpZXIgY2FzZSB0byBkZXRlY3QuICAqLwotCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkJKnN5bV9oYXNoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGVsc2UKLQkJKnN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsCi0JCQkJCQkJICAgdHJ1ZSwgY29weSwgZmFsc2UpKTsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHNlY29uZCBkZWZpbml0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmICgoKnN5bV9oYXNoKS0+c21jbGFzICE9IFhNQ19HTAotCQkJICB8fCBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfR0wKLQkJCSAgfHwgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICAgJiBEWU5BTUlDKSA9PSAwKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBub3QgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIG9yIHRoaXMgc3ltYm9sIGlzIGdsb2JhbCBsaW5rYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29kZS4gIElmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QsIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB3ZSB3YW50IHRvIHVzZSB0aGUgbmV3IHN5bWJvbC4gICovCi0JCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgICAgICB2YWx1ZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICYgRFlOQU1JQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBpdC4gICovCi0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkJICAgICAgKCpzeW1faGFzaCktPnJvb3QudS51bmRlZi5hYmZkID0KLQkJCSgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiBpbiBhbiBvYmplY3QgY29udGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gYXJjaGl2ZS4gIEp1c3QgaWdub3JlIGl0LiAgU2VlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgYWJvdmUuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5yb290Lm5leHQgIT0gTlVMTAotCQkJICAgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gJigqc3ltX2hhc2gpLT5yb290KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UsIHdlIGp1c3QgY29udGludWUgYW5kIHBlcm1pdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgU2VlIHRoZSBjb21tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gICovCi0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBhdXgueF9jc2VjdC54X3NtY2xhcykKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHN5bWJvbHMgYXJlIGJvdGggY3NlY3RzIG9mIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBUaGVyZSBpcyBhdCBsZWFzdCBhIGNoYW5jZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIHNlbWktbGVnaXRpbWF0ZSByZWRlZmluaXRpb24uICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gWENPRkZfTVVMVElQTFlfREVGSU5FRDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKSAhPSAwCi0JCSAgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICAgJiYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKLQkJCSAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgotCQkgICAgIFJlcG9ydCB0aGUgZXJyb3Igbm93LiAgU2VlIHRoZSBjb21tZW50IGFib3ZlCi0JCSAgICAgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gIFdlIGNvdWxkCi0JCSAgICAgYWxzbyBkbyB0aGlzIHdpdGggd2FybmluZyBzeW1ib2xzLCBidXQgSSdtIG5vdAotCQkgICAgIHN1cmUgdGhlIFhDT0ZGIGxpbmtlciBpcyB3aG9sbHkgcHJlcGFyZWQgdG8KLQkJICAgICBoYW5kbGUgdGhlbSwgYW5kIHRoYXQgd291bGQgb25seSBiZSBhIHdhcm5pbmcsCi0JCSAgICAgbm90IGFuIGVycm9yLiAgKi8KLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCi0JCQkgKGluZm8sICgqc3ltX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAwLAotCQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIC8qIFRyeSBub3QgdG8gZ2l2ZSB0aGlzIGVycm9yIHRvbyBtYW55IHRpbWVzLiAgKi8KLQkJICAoKnN5bV9oYXNoKS0+ZmxhZ3MgJj0gflhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBtYXkgY2FsbCB0aGUgbGlua2VyIHRvCi0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIGxpbmtlciBtYXkgdHJ5IHRvIHJlYWQKLQkgICAgIHRoZSBzeW1ib2wgdGFibGUgdG8gZ2l2ZSBhIGdvb2QgZXJyb3IuICBSaWdodCBub3csIHRoZQotCSAgICAgbGluZSBudW1iZXJzIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNpbmNlIHRoZXkgYXJlCi0JICAgICBjb3VudGVkIGJvdGggaW4gdGhlIHJlYWwgc2VjdGlvbnMgYW5kIGluIHRoZSBuZXcgY3NlY3RzLgotCSAgICAgV2UgbmVlZCB0byBsZWF2ZSB0aGUgY291bnQgaW4gdGhlIHJlYWwgc2VjdGlvbnMgc28gdGhhdAotCSAgICAgdGhlIGxpbmtlciBjYW4gcmVwb3J0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXJyb3IKLQkgICAgIGNvcnJlY3RseSwgc28gdGVtcG9yYXJpbHkgY2xvYmJlciB0aGUgbGluayB0byB0aGUgY3NlY3RzCi0JICAgICBzbyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBub3QgdHJ5IHRvIHJlYWQgdGhlIGxpbmUgbnVtYmVycwotCSAgICAgYSBzZWNvbmQgdGltZSBmcm9tIHRoZSBjc2VjdHMuICAqLwotCSAgQkZEX0FTU0VSVCAobGFzdF9yZWFsLT5uZXh0ID09IGZpcnN0X2NzZWN0KTsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgdHJ1ZSwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGFzdF9yZWFsLT5uZXh0ID0gZmlyc3RfY3NlY3Q7Ci0KLQkgIGlmIChzbXR5cCA9PSBYVFlfQ00pCi0JICAgIHsKLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5zZWN0aW9uICE9IGNzZWN0KQotCQl7Ci0JCSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY29tbW9uIGNzZWN0IHdlIGp1c3QgY3JlYXRlZC4gICovCi0JCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JCSAgICAgPSBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGludCBmbGFnOwotCi0JICAgICAgaWYgKHNtdHlwID09IFhUWV9FUiB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JCWZsYWcgPSBYQ09GRl9SRUZfUkVHVUxBUjsKLQkgICAgICBlbHNlCi0JCWZsYWcgPSBYQ09GRl9ERUZfUkVHVUxBUjsKLQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gZmxhZzsKLQotCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+c21jbGFzID09IFhNQ19VQQotCQkgIHx8IGZsYWcgPT0gWENPRkZfREVGX1JFR1VMQVIpCi0JCSgqc3ltX2hhc2gpLT5zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKLQkgICAgfQotCX0KLQotICAgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLSAgICAgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGxhc3RfcmVhbCA9PSBOVUxMIHx8IGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gZmlyc3RfY3NlY3Q7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIHNpemUgYW5kIHRoZSBsaW5lIG51bWJlciBjb3VudCwgc2luY2UgdGhlCi0JIGRhdGEgaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICBEb24ndCByZXNldCB0aGUgc2l6ZSBvZgotCSB0aGUgLmRlYnVnIHNlY3Rpb24sIHNpbmNlIHdlIG5lZWQgdG8gcmVhZCBpdCBiZWxvdyBpbgotCSBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5kZWJ1ZyIpICE9IDApCi0Jby0+X3Jhd19zaXplID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBpOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JICBhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCSAgcmVsID0gcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkgIHJlbF9jc2VjdCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsKyssIHJlbF9jc2VjdCsrKQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfY3NlY3QgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiByZWxvYyAlczolZCBub3QgaW4gY3NlY3QiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSwgaSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFdlIGlkZW50aWZ5IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSBjYWxsZWQsIHNvIHRoYXQgd2UKLQkJIGNhbiBjcmVhdGUgZ2x1ZSBjb2RlIGZvciBjYWxscyB0byBmdW5jdGlvbnMgaW1wb3J0ZWQKLQkJIGZyb20gZHluYW1pYyBvYmplY3RzLiAgKi8KLQkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0JCSAgJiYgKnJlbF9jc2VjdCAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyCi0JCSAgJiYgKHJlbC0+cl90eXBlID09IFJfQlIKLQkJICAgICAgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCi0JCSAgJiYgb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3JlbC0+cl9zeW1uZHhdICE9IE5VTEwpCi0JCXsKLQkJICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XTsKLQkJICBoLT5mbGFncyB8PSBYQ09GRl9DQUxMRUQ7Ci0JCSAgLyogSWYgdGhlIHN5bWJvbCBuYW1lIHN0YXJ0cyB3aXRoIGEgcGVyaW9kLCBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgb2YgYSBmdW5jdGlvbi4gIElmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIFRoaXMgc2hvdWxkIGRvIG5vCi0gICAgICAgICAgICAgICAgICAgICBoYXJtLCBiZWNhdXNlIGFueSByZWd1bGFyIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLiAgSXQgaGVscHMsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBpZGVudGlmeSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgb2JqZWN0IGlmIGEgZHluYW1pYyBvYmplY3QgZGVmaW5lcyBpdC4gICovCi0JCSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCSAgICAgICYmIGgtPmRlc2NyaXB0b3IgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcgKyAxLAotCQkJCQkJICAgIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJCXsKLQkJCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkJIChpbmZvLCBhYmZkLCBoZHMtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAoZmxhZ3dvcmQpIDAsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCQkJICB0cnVlLAotCQkJCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGRzKSkpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkJICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0gTlVMTDsKLQotCSAgLyogUmVzZXQgU0VDX1JFTE9DIGFuZCB0aGUgcmVsb2NfY291bnQsIHNpbmNlIHRoZSByZWxvYwotCSAgICAgaW5mb3JtYXRpb24gaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICAqLwotCSAgby0+ZmxhZ3MgJj1+IFNFQ19SRUxPQzsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQotCSAgLyogSWYgd2UgYXJlIG5vdCBrZWVwaW5nIG1lbW9yeSwgZnJlZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyk7Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGcmVlIHVwIHRoZSBsaW5lIG51bWJlcnMuICBGSVhNRTogV2UgY291bGQgY2FjaGUgdGhlc2UKLSAgICAgICAgIHNvbWV3aGVyZSBmb3IgdGhlIGZpbmFsIGxpbmssIHRvIGF2b2lkIHJlYWRpbmcgdGhlbSBhZ2Fpbi4gICovCi0gICAgICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxvY19pbmZvKTsKLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zKTsKLQl9Ci0gICAgZnJlZSAocmVsb2NfaW5mbyk7Ci0gICAgfQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSN1bmRlZiBOX1RNQVNLCi0jdW5kZWYgTl9CVFNIRlQKLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBkeW5hbWljIG9iamVjdCB0byB0aGUKLSAgIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmJ1ZjsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLSAgY29uc3QgY2hhciAqYm5hbWU7Ci0gIGNvbnN0IGNoYXIgKm1uYW1lOwotICBjb25zdCBjaGFyICpzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICoqcHA7Ci0KLSAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIGEgZHluYW1pYyBvYmplY3QgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYW4gWENPRkYKLSAgICAgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogWENPRkYgc2hhcmVkIG9iamVjdCB3aGVuIG5vdCBwcm9kdWNpbmcgWENPRkYgb3V0cHV0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzeW1ib2xzIHdlIHVzZSBmcm9tIGEgZHluYW1pYyBvYmplY3QgYXJlIG5vdCB0aGUgc3ltYm9scyBpbgotICAgICB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSwgYnV0LCByYXRoZXIsIHRoZSBzeW1ib2xzIGluIHRoZSBleHBvcnQKLSAgICAgdGFibGUuICBJZiB0aGVyZSBpcyBhIGdsb2JhbCBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aGljaCBpcwotICAgICBub3QgaW4gdGhlIGV4cG9ydCB0YWJsZSwgdGhlIGxvYWRlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgaXQsCi0gICAgIHNvIHdlIGRvbid0IHdhbnQgdG8gZmluZCBpdCBlaXRoZXIuICBBbHNvLCBvbiBBSVggNC4xLjMsIHNoci5vIGluCi0gICAgIGxpYmMuYSBoYXMgc3ltYm9scyBpbiB0aGUgZXhwb3J0IHRhYmxlIHdoaWNoIGFyZSBub3QgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gICovCi0KLSAgLyogUmVhZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCByZWFsbHkgdXNlIHRoZQotICAgICBvX3NubG9hZGVyIGZpZWxkIGluIHRoZSBhLm91dCBoZWFkZXIsIHJhdGhlciB0aGFuIGdyYWJiaW5nIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUuICAqLwotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBmcm9tIHRoaXMgb2JqZWN0LCBzbyB0aGF0IHRoZXkgZG8gbm90IGdldAotICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pID09IExEU1lNU1opOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gbGRzeW07Ci0gICAgICBjaGFyIG5hbWJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICAvKiBOb3JtYWxseSB3ZSBjb3VsZCBub3QgY2FsbCB4Y29mZl9saW5rX2hhc2hfbG9va3VwIGluIGFuIGFkZAotCSBzeW1ib2xzIHJvdXRpbmUsIHNpbmNlIHdlIG1pZ2h0IG5vdCBiZSB1c2luZyBhbiBYQ09GRiBoYXNoCi0JIHRhYmxlLiAgSG93ZXZlciwgd2UgdmVyaWZpZWQgYWJvdmUgdGhhdCB3ZSBhcmUgdXNpbmcgYW4gWENPRkYKLQkgaGFzaCB0YWJsZS4gICovCi0KLSAgICAgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwKLQkJCQkgIHRydWUsIHRydWUpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9EWU5BTUlDOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYW5kIHRoZSBCRkQgaXQgd2FzIGZvdW5kIGluIGlzCi0JIG5vdCBhIGR5bmFtaWMgb2JqZWN0LCBjaGFuZ2UgdGhlIEJGRCB0byB0aGlzIGR5bmFtaWMgb2JqZWN0LAotCSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgaW1wb3J0IGZpbGUgSUQuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LnVuZGVmLmFiZmQgPT0gTlVMTAotCSAgICAgIHx8IChoLT5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKLQloLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICAvKiBXZSBkbyBub3Qgd2FudCB0byBhZGQgdGhpcyB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLQl9Ci0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1VBCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQloLT5zbWNsYXMgPSBsZHN5bS5sX3NtY2xhczsKLQotICAgICAgLyogVW5sZXNzIHRoaXMgaXMgYW4gWE1DX1hPIHN5bWJvbCwgd2UgZG9uJ3QgYm90aGVyIHRvIGFjdHVhbGx5Ci0gICAgICAgICBkZWZpbmUgaXQsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBzZWN0aW9uIHRvIHB1dCBpdCBpbiBhbnlob3cuCi0gICAgICAgICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyBoYW5kbGUgdGhlIERFRl9EWU5BTUlDIGZsYWcKLSAgICAgICAgIGNvcnJlY3RseS4gICovCi0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1hPCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gYWJzb2x1dGUgdmFsdWUuICAqLwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIHRoZW4gaXQKLQkgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBjb2RlIGFzIHdlbGwuICAqLwotICAgICAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfRFMKLQkgIHx8IChoLT5zbWNsYXMgPT0gWE1DX1hPICYmIG5hbWVbMF0gIT0gJy4nKSkKLQloLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHNubTsKLQotCSAgICAgIGRzbm0gPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0JICAgICAgaWYgKGRzbm0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRzbm1bMF0gPSAnLic7Ci0JICAgICAgc3RyY3B5IChkc25tICsgMSwgbmFtZSk7Ci0JICAgICAgaGRzID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIGRzbm0sCi0JCQkJCSAgICB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgICAgICBmcmVlIChkc25tKTsKLQkgICAgICBpZiAoaGRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJewotCQkgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgaGRzLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGxpc3QuICAqLwotCQl9Ci0KLQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgICAgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JICAgIH0KLQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQkgIGlmIChoZHMtPnNtY2xhcyA9PSBYTUNfVUEpCi0JICAgIGhkcy0+c21jbGFzID0gWE1DX1BSOwotCi0JICAvKiBBbiBhYnNvbHV0ZSBzeW1ib2wgYXBwZWFycyB0byBhY3R1YWxseSBkZWZpbmUgY29kZSwgbm90IGEKLQkgICAgIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIGlzIGhvdyBzb21lIG1hdGggZnVuY3Rpb25zIGFyZQotCSAgICAgaW1wbGVtZW50ZWQgb24gQUlYIDQuMS4gICovCi0JICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgICAgICYmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQkgICAgewotCSAgICAgIGhkcy0+c21jbGFzID0gWE1DX1hPOwotCSAgICAgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMpCi0gICAgewotICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyk7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoaXMgZmlsZSBpbiB0aGUgaW1wb3J0IGZpbGVzLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlKSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aCBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgbGlzdCBmb3IgYQotICAgICBzaGFyZWQgb2JqZWN0IGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgVGhlIGZpbGUgbmFtZSBpcyB0aGUKLSAgICAgYmFzZSBuYW1lLiAgKi8KLSAgbi0+cGF0aCA9ICIiOwotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBtbmFtZSA9ICIiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZC0+bXlfYXJjaGl2ZSk7Ci0gICAgICBtbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgIH0KLSAgcyA9IHN0cnJjaHIgKGJuYW1lLCAnLycpOwotICBpZiAocyAhPSBOVUxMKQotICAgIGJuYW1lID0gcyArIDE7Ci0gIG4tPmZpbGUgPSBibmFtZTsKLSAgbi0+bWVtYmVyID0gbW5hbWU7Ci0KLSAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGltcG9ydCBmaWxlIG51bWJlciBpcyByZXNlcnZlZAotICAgICBmb3IgTElCUEFUSC4gICovCi0gIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotICAgICAgICpwcCAhPSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0gICAgOwotICAqcHAgPSBuOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5pbXBvcnRfZmlsZV9pZCA9IGM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4KLSAgIGhhbmRsZWQsIGJ1dCBiZWZvcmUgdGhlIHNlY3Rpb25zIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkuICAqLwotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIG5vdCBiZWluZyBnYXJiYWdlLCBpbmNsdWRpbmcgdGhlIHNlY3Rpb24gaW4gd2hpY2gKLSAgIGl0IGlzIGRlZmluZWQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJvb2xlYW4KLXhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGhzZWMpCi0JICAmJiAoaHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQl7Ci0JICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoc2VjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIChoLT50b2Nfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoLT50b2Nfc2VjdGlvbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIG1hcmsgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGEgZ2l2ZW4gc2VjdGlvbiwgbWFyawotICAgaXQsIGFuZCBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGRlZmluZSBzeW1ib2xzIHRvIHdoaWNoIGl0IHJlZmVycy4KLSAgIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29rIGF0IHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQKLSAgIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIG5lZWQgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbWFyayAoaW5mbywgc2VjKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMtPmZsYWdzIHw9IFNFQ19NQVJLOwotCi0gIGlmIChzZWMtPm93bmVyLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipocCwgKipocGVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLCAqcmVsZW5kOwotCi0gICAgICAvKiBNYXJrIGFsbCB0aGUgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24uICAqLwotCi0gICAgICBocCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmZpcnN0X3N5bW5keCk7Ci0gICAgICBocGVuZCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxhc3Rfc3ltbmR4KTsKLSAgICAgIGZvciAoOyBocCA8IGhwZW5kOyBocCsrKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAqaHA7Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICByZWwgPSB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoc2VjLT5vd25lciwgc2VjLCB0cnVlLAotCQkJCQkgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJCQkgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKTsKLQkgIGlmIChyZWwgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVsZW5kID0gcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQkgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnJzZWM7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGlmICgodW5zaWduZWQgaW50KSByZWwtPnJfc3ltbmR4Ci0JCSAgPiBvYmpfcmF3X3N5bWVudF9jb3VudCAoc2VjLT5vd25lcikpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChzZWMtPm93bmVyKVtyZWwtPnJfc3ltbmR4XTsKLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcnNlYyA9IHhjb2ZmX2RhdGEgKHNlYy0+b3duZXIpLT5jc2VjdHNbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKHJzZWMgIT0gTlVMTAotCQkgICYmIChyc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgcnNlYykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICAgICAgfHwgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotCQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCQkgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCQkgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotCQkJICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkJCSAgICAgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKLQkJCQkgICYmIChoLT5kZXNjcmlwdG9yLT5mbGFncwotCQkJCSAgICAgICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKSkpCi0JCSAgICBicmVhazsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFJfUE9TOgotCQljYXNlIFJfTkVHOgotCQljYXNlIFJfUkw6Ci0JCWNhc2UgUl9STEE6Ci0JCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0JCSAgaWYgKGggIT0gTlVMTCkKLQkJICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0xEUkVMOwotCQkgIGJyZWFrOwotCQljYXNlIFJfVE9DOgotCQljYXNlIFJfR0w6Ci0JCWNhc2UgUl9UQ0w6Ci0JCWNhc2UgUl9UUkw6Ci0JCWNhc2UgUl9UUkxBOgotCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKLQkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeQotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5rZWVwX3JlbG9jcykKLQkgICAgewotCSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZQotICAgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dlZXAgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBmcm9tIG5vbi1YQ09GRiBpbnB1dCBmaWxlcy4gIEtlZXAKLSAgICAgICAgICAgICAgICAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgbW9tZW50LiAgKi8KLQkgICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IKLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbgotCQkgIHx8IHN0cmNtcCAoby0+bmFtZSwgIi5kZWJ1ZyIpID09IDApCi0JCW8tPmZsYWdzIHw9IFNFQ19NQVJLOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG8tPl9yYXdfc2l6ZSA9IDA7Ci0JCSAgby0+cmVsb2NfY291bnQgPSAwOwotCQkgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFJlY29yZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgc2V0LiAgVGhpcyBpcyB1c2VkIHRvIG91dHB1dCB0aGUKLSAgIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgc2l6ZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbjsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyB3aWxsIGhhcmRseSBldmVyIGJlIGNhbGxlZC4gIEkgZG9uJ3Qgd2FudCB0byBidXJuIGZvdXIgYnl0ZXMKLSAgICAgcGVyIGdsb2JhbCBzeW1ib2wsIHNvIGluc3RlYWQgdGhlIHNpemUgaXMga2VwdCBvbiBhIGxpbmtlZCBsaXN0Ci0gICAgIGF0dGFjaGVkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3Q7Ci0gIG4tPmggPSBoOwotICBuLT5zaXplID0gc2l6ZTsKLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNpemVfbGlzdCA9IG47Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSEFTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEltcG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCB2YWwsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkgaW1wbWVtYmVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEEgc3ltYm9sIG5hbWUgd2hpY2ggc3RhcnRzIHdpdGggYSBwZXJpb2QgaXMgdGhlIGNvZGUgZm9yIGEKLSAgICAgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgdGhlbiBhZGQgYW4gdW5kZWZpbmVkCi0gICAgIHN5bWJvbCBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBpbXBvcnQgdGhhdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHZhbCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCXsKLQkgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQloLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUpOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQkgICAgfQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotCSAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMCk7Ci0JICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQl9Ci0KLSAgICAgIC8qIE5vdywgaWYgdGhlIGRlc2NyaXB0b3IgaXMgdW5kZWZpbmVkLCBpbXBvcnQgdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgd2Ugd2VyZSB0b2xkIHRvIGltcG9ydC4gIEZJWE1FOiBJcwotICAgICAgICAgdGhpcyBjb3JyZWN0IGluIGFsbCBjYXNlcz8gICovCi0gICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JaCA9IGhkczsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSU1QT1JUOwotCi0gIGlmICh2YWwgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikKLQkgICAgICB8fCBoLT5yb290LnUuZGVmLnZhbHVlICE9IHZhbCkpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgIG91dHB1dF9iZmQsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHZhbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHZhbDsKLSAgICB9Ci0KLSAgLyogV2Ugb3ZlcmxvYWQgdGhlIGxkaW5keCBmaWVsZCB0byBob2xkIHRoZSBsX2lmaWxlIHZhbHVlIGZvciB0aGlzCi0gICAgIHN5bWJvbC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmxkc3ltID09IE5VTEwpOwotICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgPT0gMCk7Ci0gIGlmIChpbXBwYXRoID09IE5VTEwpCi0gICAgaC0+bGRpbmR4ID0gLTE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYzsKLSAgICAgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gICAgICAvKiBXZSBzdGFydCBjIGF0IDEgYmVjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGltcG9ydCBsaXN0IGlzCi0gICAgICAgICByZXNlcnZlZCBmb3IgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLwotICAgICAgZm9yIChwcCA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0cywgYyA9IDE7Ci0JICAgKnBwICE9IE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQsICsrYykKLQl7Ci0JICBpZiAoc3RyY21wICgoKnBwKS0+cGF0aCwgaW1wcGF0aCkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoKCpwcCktPmZpbGUsIGltcGZpbGUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5tZW1iZXIsIGltcG1lbWJlcikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoKnBwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuOwotCi0JICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLQkgICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG4tPm5leHQgPSBOVUxMOwotCSAgbi0+cGF0aCA9IGltcHBhdGg7Ci0JICBuLT5maWxlID0gaW1wZmlsZTsKLQkgIG4tPm1lbWJlciA9IGltcG1lbWJlcjsKLQkgICpwcCA9IG47Ci0JfQotCi0gICAgICBoLT5sZGluZHggPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXhwb3J0IGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHN5c2NhbGwpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBib29sZWFuIHN5c2NhbGwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0VYUE9SVDsKLQotICAvKiBGSVhNRTogSSdtIG5vdCBhdCBhbGwgc3VyZSB3aGF0IHN5c2NhbGwgaXMgc3VwcG9zZWQgdG8gbWVhbiwgc28KLSAgICAgSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIGl0IHVudGlsIHNvbWVib2R5IGV4cGxhaW5zIGl0LiAgKi8KLQotICAvKiBTZWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBJdCBtYXkgYmUgb25lIGV2ZW4gdGhvdWdoCi0gICAgIGl0IGlzIG5vdCBzbyBtYXJrZWQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMAotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSAhPSAnLicpCi0gICAgewotICAgICAgY2hhciAqZm5uYW1lOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGZuOwotCi0gICAgICBmbm5hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpICsgMik7Ci0gICAgICBpZiAoZm5uYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm5uYW1lWzBdID0gJy4nOwotICAgICAgc3RyY3B5IChmbm5hbWUgKyAxLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIGhmbiA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBmbm5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBmcmVlIChmbm5hbWUpOwotICAgICAgaWYgKGhmbiAhPSBOVUxMCi0JICAmJiBoZm4tPnNtY2xhcyA9PSBYTUNfUFIKLQkgICYmIChoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JICBoLT5kZXNjcmlwdG9yID0gaGZuOwotCSAgaGZuLT5kZXNjcmlwdG9yID0gaDsKLQl9Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnYXJiYWdlIGNvbGxlY3QgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0IHRoZSBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNvZGUuICBXZSBub3JtYWxseSBkb24ndCBoYXZlIHRvCi0gICAgIHdvcnJ5IGFib3V0IHRoaXMsIGJlY2F1c2UgdGhlIGRlc2NyaXB0b3Igd2lsbCBiZSBhdHRhY2hlZCB0byBhCi0gICAgIHNlY3Rpb24gd2l0aCByZWxvY3MsIGJ1dCBpZiB3ZSBhcmUgY3JlYXRpbmcgdGhlIGRlc2NyaXB0b3IKLSAgICAgb3Vyc2VsdmVzIHRob3NlIHJlbG9jcyB3aWxsIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBtYXJrIGNvZGUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaC0+ZGVzY3JpcHRvcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ291bnQgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgZm9yIHJlbG9jcwotICAgZ2VuZXJhdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCB0eXBpY2FsbHkgZm9yIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAgIGFuZCBkZXN0cnVjdG9ycy4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICAgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBubyBzdWNoIHN5bWJvbCIpLCBuYW1lKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfUkVGX1JFR1VMQVIgfCBYQ09GRl9MRFJFTDsKLSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0gIAotICAvKiBNYXJrIHRoZSBzeW1ib2wgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIHRvIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICBhc3NpZ25zIGEgdmFsdWUuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLAotCQkJICAgICAgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2gKLSAgIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbwotewotICAvKiBTZXQgaWYgYSBwcm9ibGVtIG9jY3VycmVkLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIExpbmsgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFdoZXRoZXIgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQuICAqLwotICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKLSAgLyogTnVtYmVyIG9mIGxkc3ltIHN0cnVjdHVyZXMuICAqLwotICBzaXplX3QgbGRzeW1fY291bnQ7Ci0gIC8qIFNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19zaXplOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBiZmRfYnl0ZSAqc3RyaW5nczsKLSAgLyogQWxsb2NhdGVkIHNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19hbGM7Ci19OwotCi0vKiBCdWlsZCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFhDT0ZGIGxpbmtlcgotICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZSBvZiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbiBiZWZvcmUgdGhlIGxpbmtlciBsYXlzIG91dCB0aGUgb3V0cHV0IGZpbGUuCi0gICBMSUJQQVRIIGlzIHRoZSBsaWJyYXJ5IHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQgb2JqZWN0czsgdGhpcyBpcwotICAgbm9ybWFsbHkgYnVpbHQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbGlua2VyLiAgRU5UUlkKLSAgIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wgKHRoZSAtZSBsaW5rZXIgb3B0aW9uKS4KLSAgIEZJTEVfQUxJR04gaXMgdGhlIGFsaWdubWVudCB0byB1c2UgZm9yIHNlY3Rpb25zIHdpdGhpbiB0aGUgZmlsZQotICAgKHRoZSAtSCBsaW5rZXIgb3B0aW9uKS4gIE1BWFNUQUNLIGlzIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgKHRoZQotICAgLWJtYXhzdGFjayBsaW5rZXIgb3B0aW9uKS4gIE1BWERBVEEgaXMgdGhlIG1heGltdW0gZGF0YSBzaXplICh0aGUKLSAgIC1ibWF4ZGF0YSBsaW5rZXIgb3B0aW9uKS4gIEdDIGlzIHdoZXRoZXIgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uCi0gICAodGhlIC1iZ2MgbGlua2VyIG9wdGlvbikuICBNT0RUWVBFIGlzIHRoZSBtb2R1bGUgdHlwZSAodGhlCi0gICAtYm1vZHR5cGUgbGlua2VyIG9wdGlvbikuICBURVhUUk8gaXMgd2hldGhlciB0aGUgdGV4dCBzZWN0aW9uIG11c3QKLSAgIGJlIHJlYWQgb25seSAodGhlIC1idGV4dHJvIGxpbmtlciBvcHRpb24pLiAgRVhQT1JUX0RFRklORURTIGlzCi0gICB3aGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkICh0aGUgLXVuaXggbGlua2VyCi0gICBvcHRpb24pLiAgU1BFQ0lBTF9TRUNUSU9OUyBpcyBzZXQgYnkgdGhpcyByb3V0aW5lIHRvIGNzZWN0cyB3aXRoCi0gICBtYWdpYyBuYW1lcyBsaWtlIF9lbmQuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBsaWJwYXRoLCBlbnRyeSwKLQkJCQkgZmlsZV9hbGlnbiwgbWF4c3RhY2ssIG1heGRhdGEsIGdjLAotCQkJCSBtb2R0eXBlLCB0ZXh0cm8sIGV4cG9ydF9kZWZpbmVkcywKLQkJCQkgc3BlY2lhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbGlicGF0aDsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotICAgICBib29sZWFuIGdjOwotICAgICBpbnQgbW9kdHlwZTsKLSAgICAgYm9vbGVhbiB0ZXh0cm87Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2RlZmluZWRzOwotICAgICBhc2VjdGlvbiAqKnNwZWNpYWxfc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhlbnRyeTsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyBsZGluZm87Ci0gIGludCBpOwotICBzaXplX3QgaW1wc2l6ZSwgaW1wY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqZmw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqbGRoZHI7Ci0gIGJmZF9zaXplX3R5cGUgc3RvZmY7Ci0gIHJlZ2lzdGVyIGNoYXIgKm91dDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkICpzdWI7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLSAgYmZkX2J5dGUgKmRlYnVnX2NvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQlzcGVjaWFsX3NlY3Rpb25zW2ldID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBsZGluZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGxkaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgbGRpbmZvLmluZm8gPSBpbmZvOwotICBsZGluZm8uZXhwb3J0X2RlZmluZWRzID0gZXhwb3J0X2RlZmluZWRzOwotICBsZGluZm8ubGRzeW1fY291bnQgPSAwOwotICBsZGluZm8uc3RyaW5nX3NpemUgPSAwOwotICBsZGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gIGxkaW5mby5zdHJpbmdfYWxjID0gMDsKLQotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bWF4c3RhY2sgPSBtYXhzdGFjazsKLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heGRhdGEgPSBtYXhkYXRhOwotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bW9kdHlwZSA9IG1vZHR5cGU7Ci0KLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gPSBmaWxlX2FsaWduOwotICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dGV4dHJvID0gdGV4dHJvOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIGhlbnRyeSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZW50cnkgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgZW50cnksCi0JCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaGVudHJ5ICE9IE5VTEwpCi0JaGVudHJ5LT5mbGFncyB8PSBYQ09GRl9FTlRSWTsKLSAgICB9Ci0KLSAgLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgZ2MKLSAgICAgIHx8IGhlbnRyeSA9PSBOVUxMCi0gICAgICB8fCAoaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGdjID0gZmFsc2U7Ci0gICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+Z2MgPSBmYWxzZTsKLQotICAgICAgLyogV2Ugc3RpbGwgbmVlZCB0byBjYWxsIHhjb2ZmX21hcmssIGluIG9yZGVyIHRvIHNldCBsZHJlbF9jb3VudAotICAgICAgICAgY29ycmVjdGx5LiAgKi8KLSAgICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgbykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX3N3ZWVwIChpbmZvKTsKLSAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IHRydWU7Ci0gICAgfQotCi0gIC8qIFJldHVybiBzcGVjaWFsIHNlY3Rpb25zIHRvIHRoZSBjYWxsZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JICAmJiBnYwotCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQlzZWMgPSBOVUxMOwotICAgICAgc3BlY2lhbF9zZWN0aW9uc1tpXSA9IHNlYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmlucHV0X2JmZHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBpbiB0aGlzIGJpemFycmUgY2FzZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgeGNvZmZfYnVpbGRfbGRzeW1zLAotCQkJICAgIChQVFIpICZsZGluZm8pOwotICBpZiAobGRpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICBFYWNoIGltcG9ydCBmaWxlIElECi0gICAgIGNvbnNpc3RzIG9mIHRocmVlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzOiB0aGUgcGF0aCwgdGhlIGZpbGUKLSAgICAgbmFtZSwgYW5kIHRoZSBhcmNoaXZlIG1lbWJlciBuYW1lLiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0Ci0gICAgIG9mIG5hbWVzIGlzIHRoZSBwYXRoIHRvIHVzZSB0byBmaW5kIG9iamVjdHMsIHdoaWNoIHRoZSBsaW5rZXIgaGFzCi0gICAgIHBhc3NlZCBpbiBhcyB0aGUgbGlicGF0aCBhcmd1bWVudC4gIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGgKLSAgICAgZW50cnkgaW4gdGhlIG90aGVyIGltcG9ydCBmaWxlIG5hbWVzIGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgKi8KLSAgaW1wc2l6ZSA9IHN0cmxlbiAobGlicGF0aCkgKyAzOwotICBpbXBjb3VudCA9IDE7Ci0gIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICB7Ci0gICAgICArK2ltcGNvdW50OwotICAgICAgaW1wc2l6ZSArPSAoc3RybGVuIChmbC0+cGF0aCkKLQkJICArIHN0cmxlbiAoZmwtPmZpbGUpCi0JCSAgKyBzdHJsZW4gKGZsLT5tZW1iZXIpCi0JCSAgKyAzKTsKLSAgICB9Ci0KLSAgLyogU2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgbGRoZHIgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyOwotICBsZGhkci0+bF92ZXJzaW9uID0gMTsKLSAgbGRoZHItPmxfbnN5bXMgPSBsZGluZm8ubGRzeW1fY291bnQ7Ci0gIGxkaGRyLT5sX25yZWxvYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKLSAgbGRoZHItPmxfaXN0bGVuID0gaW1wc2l6ZTsKLSAgbGRoZHItPmxfbmltcGlkID0gaW1wY291bnQ7Ci0gIGxkaGRyLT5sX2ltcG9mZiA9IChMREhEUlNaCi0JCSAgICAgKyBsZGhkci0+bF9uc3ltcyAqIExEU1lNU1oKLQkJICAgICArIGxkaGRyLT5sX25yZWxvYyAqIExEUkVMU1opOwotICBsZGhkci0+bF9zdGxlbiA9IGxkaW5mby5zdHJpbmdfc2l6ZTsKLSAgc3RvZmYgPSBsZGhkci0+bF9pbXBvZmYgKyBpbXBzaXplOwotICBpZiAobGRpbmZvLnN0cmluZ19zaXplID09IDApCi0gICAgbGRoZHItPmxfc3RvZmYgPSAwOwotICBlbHNlCi0gICAgbGRoZHItPmxfc3RvZmYgPSBzdG9mZjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgQWxsb2NhdGUKLSAgICAgc3BhY2UgZm9yIGl0LiAgKi8KLSAgbHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbjsKLSAgbHNlYy0+X3Jhd19zaXplID0gc3RvZmYgKyBsZGhkci0+bF9zdGxlbjsKLSAgbHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgbHNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKGxzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2V0IHVwIHRoZSBoZWFkZXIuICAqLwotICB4Y29mZl9zd2FwX2xkaGRyX291dCAob3V0cHV0X2JmZCwgbGRoZHIsCi0JCQkoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGxzZWMtPmNvbnRlbnRzKTsKLQotICAvKiBTZXQgdXAgdGhlIGltcG9ydCBmaWxlIG5hbWVzLiAgKi8KLSAgb3V0ID0gKGNoYXIgKikgbHNlYy0+Y29udGVudHMgKyBsZGhkci0+bF9pbXBvZmY7Ci0gIHN0cmNweSAob3V0LCBsaWJwYXRoKTsKLSAgb3V0ICs9IHN0cmxlbiAobGlicGF0aCkgKyAxOwotICAqb3V0KysgPSAnXDAnOwotICAqb3V0KysgPSAnXDAnOwotICBmb3IgKGZsID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLQotICAgICAgcyA9IGZsLT5wYXRoOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICAgIHMgPSBmbC0+ZmlsZTsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgICBzID0gZmwtPm1lbWJlcjsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAoKGJmZF9ieXRlICopIG91dCAtIGxzZWMtPmNvbnRlbnRzKSA9PSBzdG9mZik7Ci0KLSAgLyogU2V0IHVwIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKGxkaW5mby5zdHJpbmdfc2l6ZSA+IDApCi0gICAgewotICAgICAgbWVtY3B5IChvdXQsIGxkaW5mby5zdHJpbmdzLCBsZGluZm8uc3RyaW5nX3NpemUpOwotICAgICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOwotICAgICAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBzZXQgdXAgdGhlIHN5bWJvbCB0YWJsZSBvciB0aGUgcmVsb2NzIHlldCwgYmVjYXVzZSB3ZQotICAgICBkb24ndCB5ZXQga25vdyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICBUaGUKLSAgICAgLmxvYWRlciBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbAotICAgICBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCBpbiB4Y29mZl9saW5rX2lucHV0X2JmZCBvcgotICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgVGhlIC5sb2FkZXIgcmVsb2NzIGFyZSB3cml0dGVuIG91dAotICAgICB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbCByZWxvY3MgYXJlIGhhbmRsZWQgaW4KLSAgICAgeGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbjsKLSAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgZG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24sIGZpZ3VyZSBvdXQgdGhlIGNvbnRlbnRzCi0gICAgIG9mIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gIGRlYnVnX3N0cnRhYiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zdHJ0YWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YmRlYjsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKLSAgICAgIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotCi0gICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JY29udGludWU7Ci0gICAgICBzdWJkZWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ViLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoc3ViZGViID09IE5VTEwgfHwgc3ViZGViLT5fcmF3X3NpemUgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgIHx8IGluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCi0JewotCSAgc3ViZGViLT5fcmF3X3NpemUgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKHN1YikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBkZWJ1Z19pbmRleCA9ICgodW5zaWduZWQgbG9uZyAqKQotCQkgICAgIGJmZF96YWxsb2MgKHN1Yiwgc3ltY291bnQgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKSk7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX2RhdGEgKHN1YiktPmRlYnVnX2luZGljZXMgPSBkZWJ1Z19pbmRleDsKLQotICAgICAgLyogR3JhYiB0aGUgY29udGVudHMgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgV2UgdXNlIG1hbGxvYyBhbmQKLQkgY29weSB0aGUgbmFtZXMgaW50byB0aGUgZGVidWcgc3RyaW5ndGFiLCByYXRoZXIgdGhhbgotCSBiZmRfYWxsb2MsIGJlY2F1c2UgSSBleHBlY3QgdGhhdCwgd2hlbiBsaW5raW5nIG1hbnkgZmlsZXMKLQkgdG9nZXRoZXIsIG1hbnkgb2YgdGhlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZS4gIFN0b3JpbmcgdGhlCi0JIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgc2hvdWxkIHNhdmUgc3BhY2UgaW4gdGhpcyBjYXNlLiAgKi8KLSAgICAgIGRlYnVnX2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN1YmRlYi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkZWJ1Z19jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdWIsIHN1YmRlYiwgKFBUUikgZGVidWdfY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzdWJkZWItPl9yYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChzdWIpLT5jc2VjdHM7Ci0KLSAgICAgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoc3ViKTsKLSAgICAgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoc3ViKTsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7Ci0gICAgICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChzdWIsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0JICAqZGVidWdfaW5kZXggPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmICpjc2VjdHBwICE9IE5VTEwKLQkgICAgICAmJiAoISBnYwotCQkgIHx8ICgoKmNzZWN0cHApLT5mbGFncyAmIFNFQ19NQVJLKSAhPSAwCi0JCSAgfHwgKmNzZWN0cHAgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQkgICAgICAmJiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChzdWIsICZzeW0pKQotCSAgICB7Ci0JICAgICAgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gKGNoYXIgKikgZGVidWdfY29udGVudHMgKyBzeW0uX24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZGVidWdfc3RydGFiLCBuYW1lLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgICpkZWJ1Z19pbmRleCA9IGluZHg7Ci0JICAgIH0KLQotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBjc2VjdHBwICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBkZWJ1Z19pbmRleCArPSBzeW0ubl9udW1hdXggKyAxOwotCX0KLQotICAgICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICAgICAgZGVidWdfY29udGVudHMgPSBOVUxMOwotCi0gICAgICAvKiBDbGVhciB0aGUgc2l6ZSBvZiBzdWJkZWIsIHNvIHRoYXQgaXQgaXMgbm90IGluY2x1ZGVkIGRpcmVjdGx5Ci0JIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCXsKLQkgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKHN1YikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbi0+X3Jhd19zaXplID0KLSAgICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGRlYnVnX3N0cnRhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsZGluZm8uc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKGxkaW5mby5zdHJpbmdzKTsKLSAgaWYgKGRlYnVnX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLCBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfYnVpbGRfbGRzeW1zIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICpsZGluZm8gPSAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICopIHA7Ci0gIHNpemVfdCBsZW47Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnCi0gICAgIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX1JFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQotCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0KLSAgLyogSWYgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQsIG1hcmsgdGhlbSBub3cuICBXZQotICAgICBkb24ndCB3YW50IHRvIGV4cG9ydCB0aGUgYWN0dWFsIGZ1bmN0aW9ucywganVzdCB0aGUgZnVuY3Rpb24KLSAgICAgZGVzY3JpcHRvcnMuICAqLwotICBpZiAobGRpbmZvLT5leHBvcnRfZGVmaW5lZHMKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKLSAgICB7Ci0gICAgICBib29sZWFuIGV4cG9ydDsKLQotICAgICAgLyogV2UgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGRlZmluZWQgYnkgYW4gb2JqZWN0Ci0JIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSB3aGljaCBjb250YWlucyBhIHNoYXJlZCBvYmplY3QuICBUaGUKLQkgcmF0aW9uYWxlIGlzIHRoYXQgaWYgYW4gYXJjaGl2ZSBjb250YWlucyBib3RoIGFuIHVuc2hhcmVkIGFuZAotCSBhIHNoYXJlZCBvYmplY3QsIHRoZW4gdGhlcmUgbXVzdCBiZSBzb21lIHJlYXNvbiB0aGF0IHRoZQotCSB1bnNoYXJlZCBvYmplY3QgaXMgdW5zaGFyZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0Ci0JIHByb3ZpZGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIGl0LiAgSW4gcGFydGljdWxhciwgdGhpcyBzb2x2ZXMKLQkgYSBidWcgaW52b2x2aW5nIHRoZSBfc2F2ZWZOTiBzZXQgb2YgZnVuY3Rpb25zLiAgZ2NjIHdpbGwgY2FsbAotCSB0aG9zZSBmdW5jdGlvbnMgd2l0aG91dCBwcm92aWRpbmcgYSBzbG90IHRvIHJlc3RvcmUgdGhlIFRPQywKLQkgc28gaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGJlIGxpbmtlZCBpbiBkaXJlY3RseQotCSBhbmQgbm90IGZyb20gYSBzaGFyZWQgb2JqZWN0LCB3aGljaCBtZWFucyB0aGF0IGEgc2hhcmVkCi0JIG9iamVjdCB3aGljaCBhbHNvIGhhcHBlbnMgdG8gbGluayB0aGVtIGluIG11c3Qgbm90IGV4cG9ydAotCSB0aGVtLiAgVGhpcyBpcyBjb25mdXNpbmcsIGJ1dCBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mCi0JIGEgZGlmZmVyZW50IGFwcHJvYWNoLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIGNhbiwgb2YgY291cnNlLAotCSBiZSBleHBvcnRlZCBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGV4cG9ydCA9IHRydWU7Ci0gICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JewotCSAgYmZkICphcmJmZCwgKm1lbWJlcjsKLQotCSAgYXJiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlOwotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJiZmQsIChiZmQgKikgTlVMTCk7Ci0JICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCQl7Ci0JCSAgZXhwb3J0ID0gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgbWVtYmVyKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGV4cG9ydCkKLQloLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gZ2FyYmFnZSBjb2xsZWN0IHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIGluCi0gICAgIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gbWFyayB0aGVtLiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyID09IE5VTEwKLQkgIHx8IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT54dmVjCi0JICAgICAgIT0gbGRpbmZvLT5pbmZvLT5oYXNoLT5jcmVhdG9yKSkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBjYWxsZWQgYW5kIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgb3IgaXQKLSAgICAgaXMgaW1wb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgaXQuCi0gICAgIChVbmxlc3Mgd2UgZGlkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgd2UgZGlkbid0IG5lZWQgdGhpcwotICAgICBzeW1ib2wuKSAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSA9PSAnLicKLSAgICAgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotICAgICAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JICAgICAgJiYgKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKQotICAgICAgJiYgKCEgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZHM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGgtPnNtY2xhcyA9IFhNQ19HTDsKLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotICAgICAgc2VjLT5fcmF3X3NpemUgKz0gWENPRkZfR0xJTktfU0laRTsKLQotICAgICAgLyogVGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgcmVxdWlyZXMgYSBUT0MgZW50cnkgZm9yIHRoZQotICAgICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCSAgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICYmIChoZHMtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApOwotICAgICAgaGRzLT5mbGFncyB8PSBYQ09GRl9NQVJLOwotICAgICAgaWYgKGhkcy0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBoZHMtPnRvY19zZWN0aW9uID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+dG9jX3NlY3Rpb247Ci0JICBoZHMtPnUudG9jX29mZnNldCA9IGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgIGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSA0OwotCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudDsKLQkgICsraGRzLT50b2Nfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBoZHMtPmluZHggPSAtMjsKLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfU0VUX1RPQyB8IFhDT0ZGX0xEUkVMOwotCi0JICAvKiBXZSBuZWVkIHRvIGNhbGwgeGNvZmZfYnVpbGRfbGRzeW1zIHJlY3Vyc2l2ZWx5IGhlcmUsCi0gICAgICAgICAgICAgYmVjYXVzZSB3ZSBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCBoZHMgb24gdGhlIHRyYXZlcnNhbC4gICovCi0JICB4Y29mZl9idWlsZF9sZHN5bXMgKGhkcywgcCk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBleHBvcnRlZCwgYnV0IG5vdCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHRyeSB0bwotICAgICBkZWZpbmUgaXQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotCSAgJiYgKGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5kZXNjcmlwdG9yLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiBUaGlzIGlzIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgICAgIGEgZGVmaW5lZCBlbnRyeSBwb2ludC4gIFdlIGNhbiBidWlsZCB1cCBhIGZ1bmN0aW9uCi0gICAgICAgICAgICAgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIEFJWCBsaW5rZXIKLSAgICAgICAgICAgICBhY3R1YWxseSBkb2VzIHRoaXMsIGFuZCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0bwotICAgICAgICAgICAgIGRvIGl0IGFzIHdlbGwuICAqLwotCSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgaC0+c21jbGFzID0gWE1DX0RTOwotCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICBzZWMtPl9yYXdfc2l6ZSArPSAxMjsKLQotCSAgLyogQSBmdW5jdGlvbiBkZXNjcmlwdG9yIHVzZXMgdHdvIHJlbG9jczogb25lIGZvciB0aGUKLSAgICAgICAgICAgICBhc3NvY2lhdGVkIGNvZGUsIGFuZCBvbmUgZm9yIHRoZSBUT0MgYWRkcmVzcy4gICovCi0JICB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudCArPSAyOwotCSAgc2VjLT5yZWxvY19jb3VudCArPSAyOwotCi0JICAvKiBXZSBoYW5kbGUgd3JpdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXNjcmlwdG9yIGluCi0gICAgICAgICAgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbC4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygid2FybmluZzogYXR0ZW1wdCB0byBleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCBgJXMnIiksCi0JICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGgtPmxkc3ltID0gTlVMTDsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBzdGlsbCBhIGNvbW1vbiBzeW1ib2wsIGFuZCBpdCB3YXNuJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0ZWQsIHdlIG5lZWQgdG8gYWN0dWFsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGl0IGluIHRoZSAuYnNzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0gICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkKLSAgICAgICYmIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19jb21fc2VjdGlvbiAoaC0+cm9vdC51LmMucC0+c2VjdGlvbikpOwotICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbiBpZiBpdCBpcyBtZW50aW9uZWQKLSAgICAgaW4gYSByZWxvYyB3aGljaCB3ZSBhcmUgY29weWluZyB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGFuZCBpdCB3YXMKLSAgICAgbm90IGRlZmluZWQgb3IgY29tbW9uLCBvciBpZiBpdCBpcyB0aGUgZW50cnkgcG9pbnQsIG9yIGlmIGl0IGlzCi0gICAgIGJlaW5nIGV4cG9ydGVkLiAgKi8KLQotICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0xEUkVMKSA9PSAwCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCBpZiB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZAotICAgICB3ZSBkaWQgbm90IG1hcmsgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgewotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIG1heSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgc3ltYm9sIGR1ZSB0byB0aGUgcmVjdXJzaXZlCi0gICAgIGNhbGwgYWJvdmUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgdGhpcyBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc3ltYm9scy4gICovCi0KLSAgQkZEX0FTU0VSVCAoaC0+bGRzeW0gPT0gTlVMTCk7Ci0gIGgtPmxkc3ltID0gKChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikKLQkgICAgICBiZmRfemFsbG9jIChsZGluZm8tPm91dHB1dF9iZmQsCi0JCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkc3ltKSkpOwotICBpZiAoaC0+bGRzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0gICAgaC0+bGRzeW0tPmxfaWZpbGUgPSBoLT5sZGluZHg7Ci0KLSAgLyogVGhlIGZpcnN0IDMgc3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIHJlc2VydmVkIHRvIGluZGljYXRlIHRoZQotICAgICBzZWN0aW9ucy4gICovCi0gIGgtPmxkaW5keCA9IGxkaW5mby0+bGRzeW1fY291bnQgKyAzOwotCi0gICsrbGRpbmZvLT5sZHN5bV9jb3VudDsKLQotICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICBpZiAobGVuIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGgtPmxkc3ltLT5fbC5fbF9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGRpbmZvLT5zdHJpbmdfc2l6ZSArIGxlbiArIDMgPiBsZGluZm8tPnN0cmluZ19hbGMpCi0JewotCSAgc2l6ZV90IG5ld2FsYzsKLQkgIGJmZF9ieXRlICpuZXdzdHJpbmdzOwotCi0JICBuZXdhbGMgPSBsZGluZm8tPnN0cmluZ19hbGMgKiAyOwotCSAgaWYgKG5ld2FsYyA9PSAwKQotCSAgICBuZXdhbGMgPSAzMjsKLQkgIHdoaWxlIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IG5ld2FsYykKLQkgICAgbmV3YWxjICo9IDI7Ci0KLQkgIG5ld3N0cmluZ3MgPSAoKGJmZF9ieXRlICopCi0JCQliZmRfcmVhbGxvYyAoKFBUUikgbGRpbmZvLT5zdHJpbmdzLCBuZXdhbGMpKTsKLQkgIGlmIChuZXdzdHJpbmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsZGluZm8tPnN0cmluZ19hbGMgPSBuZXdhbGM7Ci0JICBsZGluZm8tPnN0cmluZ3MgPSBuZXdzdHJpbmdzOwotCX0KLQotICAgICAgYmZkX3B1dF8xNiAobGRpbmZvLT5vdXRwdXRfYmZkLCBsZW4gKyAxLAotCQkgIGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUpOwotICAgICAgc3RyY3B5IChsZGluZm8tPnN0cmluZ3MgKyBsZGluZm8tPnN0cmluZ19zaXplICsgMiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgaC0+bGRzeW0tPl9sLl9sX2wuX2xfb2Zmc2V0ID0gbGRpbmZvLT5zdHJpbmdfc2l6ZSArIDI7Ci0gICAgICBsZGluZm8tPnN0cmluZ19zaXplICs9IGxlbiArIDM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0JVSUxUX0xEU1lNOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgcmVsc3o7Ci0gIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IGxpbmVzejsKLSAgYmZkICpzdWI7Ci0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby50b2Nfc3ltaW5keCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBmaW5mby5sZHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX2xkc3ltICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWikpOwotICBmaW5mby5sZHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWgotCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNvZmYubGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVyIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIERldGVybWluZSBhIGZldyBtYXhpbXVtIHNpemVzLiAgKi8KLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfbGluZW5vX2NvdW50ID0gMDsKLSAgbWF4X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIG8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkJICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAotCQkgICYmICh4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudAotCQkgICAgICA+IG1heF9saW5lbm9fY291bnQpKQotCQltYXhfbGluZW5vX2NvdW50ID0KLQkJICB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gIT0gMCkKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIGZpbGVfYWxpZ247Ci0KLSAgICAgIGZpbGVfYWxpZ24gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbjsKLSAgICAgIGlmIChmaWxlX2FsaWduICE9IDApCi0JewotCSAgYm9vbGVhbiBzYXdfY29udGVudHM7Ci0JICBpbnQgaW5keDsKLQkgIGFzZWN0aW9uICoqb3A7Ci0JICBmaWxlX3B0ciBzb2ZhcjsKLQotCSAgLyogSW5zZXJ0IC5wYWQgc2VjdGlvbnMgYmVmb3JlIGV2ZXJ5IHNlY3Rpb24gd2hpY2ggaGFzCi0gICAgICAgICAgICAgY29udGVudHMgYW5kIGlzIGxvYWRlZCwgaWYgaXQgaXMgcHJlY2VkZWQgYnkgc29tZSBvdGhlcgotICAgICAgICAgICAgIHNlY3Rpb24gd2hpY2ggaGFzIGNvbnRlbnRzIGFuZCBpcyBsb2FkZWQuICAqLwotCSAgc2F3X2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZvciAob3AgPSAmYWJmZC0+c2VjdGlvbnM7ICpvcCAhPSBOVUxMOyBvcCA9ICYoKm9wKS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKCgqb3ApLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXNhd19jb250ZW50cyA9IGZhbHNlOwotCSAgICAgIGVsc2UgaWYgKCgoKm9wKS0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JCSAgICAgICAmJiAoKCpvcCktPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBpZiAoISBzYXdfY29udGVudHMpCi0JCSAgICBzYXdfY29udGVudHMgPSB0cnVlOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKm4sICpob2xkOwotCi0JCSAgICAgIGhvbGQgPSAqb3A7Ci0JCSAgICAgICpvcCA9IE5VTEw7Ci0JCSAgICAgIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5wYWQiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoKm9wID09IG4pOwotCQkgICAgICBuLT5uZXh0ID0gaG9sZDsKLQkJICAgICAgbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgICBuLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotCQkgICAgICBzYXdfY29udGVudHMgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBuZXcKLSAgICAgICAgICAgICBzZWN0aW9ucy4gICovCi0JICBpbmR4ID0gMDsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgKytpbmR4OwotCSAgICAgIG8tPnRhcmdldF9pbmRleCA9IGluZHg7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBpbnQpIGluZHggPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLQkgIC8qIFdvcmsgb3V0IGFwcHJvcHJpYXRlIHNpemVzIGZvciB0aGUgLnBhZCBzZWN0aW9ucyB0byBmb3JjZQotICAgICAgICAgICAgIGVhY2ggc2VjdGlvbiB0byBsYW5kIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoaXMgYml0IG9mCi0gICAgICAgICAgICAgY29kZSBrbm93cyB3aGF0IGNvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBnb2luZwotICAgICAgICAgICAgIHRvIGRvLiAgKi8KLQkgIHNvZmFyID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLQkgIHNvZmFyICs9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0JICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICBpZiAoby0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IG8tPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JICAgICAgc29mYXIgKz0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXsKLQkJICBiZmRfdm1hIHBhZ2VvZmY7Ci0KLQkJICBCRkRfQVNTRVJUIChvLT5fcmF3X3NpemUgPT0gMCk7Ci0JCSAgcGFnZW9mZiA9IHNvZmFyICYgKGZpbGVfYWxpZ24gLSAxKTsKLQkJICBpZiAocGFnZW9mZiAhPSAwKQotCQkgICAgewotCQkgICAgICBvLT5fcmF3X3NpemUgPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKLQkJICAgICAgc29mYXIgKz0gZmlsZV9hbGlnbiAtIHBhZ2VvZmY7Ci0JCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkJICAgIHNvZmFyICs9IEJGRF9BTElHTiAoby0+X3Jhd19zaXplLAotCQkJCQkxIDw8IG8tPmFsaWdubWVudF9wb3dlcik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZSBuZWVkIHRvIGtlZXAgZm9yIHRoZSByZWxvY3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLSAgICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0gICAgICAgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotICAgICAgewotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQlmaW5mby5zZWN0aW9uX2luZm9baV0udG9jX3JlbF9oYXNoZXMgPSBOVUxMOwotICAgICAgfQotICB9Ci0KLSAgLyogU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgSG93ZXZlciwgd2Ugc3RpbGwKLSAgICAgICAgICAgICBhbGxvY2F0ZSB0aGUgYnVmZmVycywgc28gdGhhdCBsYXRlciBjb2RlIGRvZXNuJ3QgaGF2ZSB0bwotICAgICAgICAgICAgIHdvcnJ5IGFib3V0IHdoZXRoZXIgd2UgYXJlIHN0cmlwcGluZyBvciBub3QuICAqLwotCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQkgICAgby0+cmVsX2ZpbGVwb3MgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICAgICAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKLQkgICAgfQotCi0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LgotCSAgICAgV2UgY291bGQgYmFja3BhdGNoIHRoZSBmaWxlIGxhdGVyLCBJIHN1cHBvc2UsIGFsdGhvdWdoIGl0Ci0JICAgICB3b3VsZCBiZSBzbG93LiAgKi8KLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgZmluZm8ubGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gIFdlIHdhbnQgYXQgbGVhc3QgNiBzeW1ib2xzLCBzaW5jZSB0aGF0IGlzIHRoZQotICAgICBudW1iZXIgd2hpY2ggeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCBtYXkgbmVlZC4gICovCi0gIG1heF9zeW1fY291bnQgPSA2OwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCQkgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPnRvYyA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPnh2ZWMgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgeGNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSAtMS4gIFdyaXRlCi0gICAgIGl0IG91dCBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSAtMTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scyB3aGljaCBkbyBub3QgY29tZSBmcm9tIFhDT0ZGCi0gICAgIGlucHV0IGZpbGVzLiAgKi8KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLAotCQkJICAgIChQVFIpICZmaW5mbyk7Ci0KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cgdGhlCi0gICAgIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbiBmaW5hbGx5Ci0gICAgIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqdG9jX3JlbF9oYXNoOwotICAgICAgYmZkX2J5dGUgKmVyZWw7Ci0KLSAgICAgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JewotCSAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQl7Ci0JICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKCpyZWxfaGFzaCktPmluZHggPCAwKQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJIChpbmZvLCAoKnJlbF9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCBvLCBpcmVsLT5yX3ZhZGRyKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAoKnJlbF9oYXNoKS0+aW5keCA9IDA7Ci0JCX0KLQkgICAgICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OwotCSAgICB9Ci0JfQotCi0gICAgICBmb3IgKHRvY19yZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnRvY19yZWxfaGFzaGVzOwotCSAgIHRvY19yZWxfaGFzaCAhPSBOVUxMOwotCSAgIHRvY19yZWxfaGFzaCA9IHRvY19yZWxfaGFzaC0+bmV4dCkKLQl7Ci0JICBpZiAodG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4IDwgMCkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJICAgICAoaW5mbywgdG9jX3JlbF9oYXNoLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgICAoYmZkICopIE5VTEwsIG8sIHRvY19yZWxfaGFzaC0+cmVsLT5yX3ZhZGRyKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keCA9IDA7Ci0JICAgIH0KLQkgIHRvY19yZWxfaGFzaC0+cmVsLT5yX3N5bW5keCA9IHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keDsKLQl9Ci0KLSAgICAgIC8qIFhDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlIHJlbG9jcyBiZSBzb3J0ZWQgYnkgYWRkcmVzcy4gIFdlIHRlbmQKLSAgICAgICAgIHRvIHByb2R1Y2UgdGhlbSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlaXIgY29udGFpbmluZyBjc2VjdHMKLSAgICAgICAgIGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgYnkKLSAgICAgICAgIGFkZHJlc3MuICBTbyB3ZSBzb3J0IHRoZW0gaGVyZS4gIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgICAgIGRvIHRoaXMuICAqLwotICAgICAgcXNvcnQgKChQVFIpIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcywKLQkgICAgIG8tPnJlbG9jX2NvdW50LCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyksCi0JICAgICB4Y29mZl9zb3J0X3JlbG9jcyk7Ci0KLSAgICAgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0gICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCWJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQlhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGxvYWRlciBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopIGZpbmZvLmxkcmVsCi0JICAgICAgPT0gKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKLQkJICArIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkci5sX2ltcG9mZikpOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCi0JCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCV9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAotCQkoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgc3RyaW5nIHRhYmxlLiAgKi8KLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uOwotICBpZiAobyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAgICAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKLSAgICAgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBvLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgPj0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKSk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBvLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIG8tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGRlYnVnX3N0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kZXg7Ci0gIGxvbmcgKmluZGV4cDsKLSAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHVuc2lnbmVkIGludCBpbmNsczsKLSAgYXNlY3Rpb24gKm9saW5lOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogV2UgY2FuIGp1c3Qgc2tpcCBEWU5BTUlDIGZpbGVzLCB1bmxlc3MgdGhpcyBpcyBhIHN0YXRpYyBsaW5rLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBmaW5mby0+aW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIHN5bV9oYXNoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHM7Ci0gIGRlYnVnX2luZGV4ID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5kaWNlczsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIGluY2xzID0gMDsKLSAgb2xpbmUgPSBOVUxMOwotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGludCBzbXR5cCA9IDA7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBib29sZWFuIHJlcXVpcmU7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wsIHdlIG5lZWQgdGhlIGNzZWN0Ci0gICAgICAgICBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQl7Ci0JICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPiAwKTsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsCi0JCQkJKFBUUikgKGVzeW0gKyBpc3ltZXN6ICogaXN5bXAtPm5fbnVtYXV4KSwKLQkJCQlpc3ltcC0+bl90eXBlLCBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJaXN5bXAtPm5fbnVtYXV4IC0gMSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCShQVFIpICZhdXgpOwotCSAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0JfQotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbiwgc3dhcCBvdXQgdGhlCi0gICAgICAgICAubG9hZGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sCi0gICAgICAgICByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbCwgdGhvdWdoLCB0aGVuIHdhaXQgdW50aWwgd2UgZ2V0Ci0gICAgICAgICB0byB0aGUgZGVmaW5pdGlvbi4gICovCi0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgKnN5bV9oYXNoICE9IE5VTEwKLQkgICYmICgqc3ltX2hhc2gpLT5sZHN5bSAhPSBOVUxMCi0JICAmJiAoc210eXAgIT0gWFRZX0VSCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkpCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLQkgIGggPSAqc3ltX2hhc2g7Ci0JICBsZHN5bSA9IGgtPmxkc3ltOwotCSAgaWYgKGlzeW0ubl9zY251bSA+IDApCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgbGRzeW0tPmxfdmFsdWUgPSAoaXN5bS5uX3ZhbHVlCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9IGlzeW0ubl9zY251bTsKLQkgICAgICBsZHN5bS0+bF92YWx1ZSA9IGlzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICBsZHN5bS0+bF9zbXR5cGUgPSBzbXR5cDsKLQkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0JICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgICAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKLQkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FTlRSWTsKLQotCSAgbGRzeW0tPmxfc21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0KLQkgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UgaWYgKGxkc3ltLT5sX2lmaWxlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCQlsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkICppbXBiZmQ7Ci0KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgIGltcGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotCQkgIGVsc2UKLQkJICAgIGltcGJmZCA9IE5VTEw7Ci0KLQkJICBpZiAoaW1wYmZkID09IE5VTEwpCi0JCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gZmluZm8tPm91dHB1dF9iZmQtPnh2ZWMpOwotCQkgICAgICBsZHN5bS0+bF9pZmlsZSA9IHhjb2ZmX2RhdGEgKGltcGJmZCktPmltcG9ydF9maWxlX2lkOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgbGRzeW0tPmxfcGFybSA9IDA7Ci0KLQkgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKLQkgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgbGRzeW0sCi0JCQkJZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7Ci0JICBoLT5sZHN5bSA9IE5VTEw7Ci0KLQkgIC8qIEZpbGwgaW4gc25lbnRyeSBub3cgdGhhdCB3ZSBrbm93IHRoZSB0YXJnZXRfaW5kZXguICAqLwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkgICAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnNuZW50cnkgPQotCSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0KLSAgICAgICppbmRleHAgPSAtMTsKLQotICAgICAgc2tpcCA9IGZhbHNlOwotICAgICAgcmVxdWlyZSA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBza2lwcGluZyB0aGlzIGNzZWN0LCB3ZSB3YW50IHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCpjc2VjdHBwID09IE5VTEwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHdlIGdhcmJhZ2UgY29sbGVjdGVkIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYwotCSAgJiYgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspID09IDAKLQkgICYmICpjc2VjdHBwICE9IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIEFuIFhDT0ZGIGxpbmtlciBhbHdheXMgc2tpcHMgQ19TVEFUIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfU1RBVCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2Ugc2tpcCBhbGwgYnV0IHRoZSBmaXJzdCBUT0MgYW5jaG9yLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQl7Ci0JICBpZiAoZmluZm8tPnRvY19zeW1pbmR4ICE9IC0xKQotCSAgICBza2lwID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdG9jdmFsLCB0b2NlbmQ7Ci0KLQkgICAgICB0b2N2YWwgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlzeW0ubl92YWx1ZQotCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICAgIC8qIFdlIHdhbnQgdG8gZmluZCBvdXQgaWYgdG9jdmFsIGlzIGEgZ29vZCB2YWx1ZSB0byB1c2UKLSAgICAgICAgICAgICAgICAgYXMgdGhlIFRPQyBhbmNob3ItLXRoYXQgaXMsIHdoZXRoZXIgd2UgY2FuIGFjY2VzcyBhbGwKLSAgICAgICAgICAgICAgICAgb2YgdGhlIFRPQyB1c2luZyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0b2N2YWwuICBUaGlzCi0gICAgICAgICAgICAgICAgIHRlc3QgYXNzdW1lcyB0aGF0IHRoZSBUT0MgY29tZXMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgb3V0cHV0IHNlY3Rpb24sIGFzIGl0IGRvZXMgaW4gdGhlIGRlZmF1bHQgbGlua2VyCi0gICAgICAgICAgICAgICAgIHNjcmlwdC4gIEZJWE1FOiBUaGlzIGRvZXNuJ3QgaGFuZGxlIC50b2Nic3Mgc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIFhNQ19URCBjb21tb24gc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCi0JICAgICAgdG9jZW5kID0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHgxMDAwMCA8IHRvY2VuZCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIpLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSAodG9jZW5kIC0gdG9jdmFsKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHg4MDAwIDwgdG9jZW5kKQotCQl7Ci0JCSAgYmZkX3ZtYSB0b2NhZGQ7Ci0KLQkJICB0b2NhZGQgPSB0b2NlbmQgLSAodG9jdmFsICsgMHg4MDAwKTsKLQkJICB0b2N2YWwgKz0gdG9jYWRkOwotCQkgIGlzeW0ubl92YWx1ZSArPSB0b2NhZGQ7Ci0JCX0KLQotCSAgICAgIGZpbmZvLT50b2Nfc3ltaW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnRvYyA9IHRvY3ZhbDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnNudG9jID0KLQkJKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICByZXF1aXJlID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBza2lwIHJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgc210eXAgPT0gWFRZX0VSCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBjYW4gc2tpcCBjb21tb24gc3ltYm9scyBpZiB0aGV5IGdvdCBkZWZpbmVkIHNvbWV3aGVyZQotICAgICAgICAgZWxzZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiBzbXR5cCA9PSBYVFlfQ00KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPnNlY3Rpb24gIT0gKmNzZWN0cHApCi0JICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uICE9ICpjc2VjdHBwKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogU2tpcCBsb2NhbCBzeW1ib2xzIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZW0uICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwKLQkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JICAgICAgfHwgc210eXAgIT0gWFRZX1NEKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICAmJiBpc3ltLm5fc2NudW0gPT0gTl9ERUJVRykKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICBXZSBkb24ndCBoYW5kbGUKLQkgdGhpcyBjb3JyZWN0bHkgZm9yIHN5bWJvbHMgd2hvc2UgbmFtZXMgYXJlIGluIHRoZSAuZGVidWcKLQkgc2VjdGlvbjsgdG8gZ2V0IGl0IHJpZ2h0IHdlIHdvdWxkIG5lZWQgYSBuZXcgYmZkX3N0cnRhYl9oYXNoCi0JIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc3RyaW5nIGdpdmVuIHRoZSBpbmRleC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpCi0JICAmJiAoZGVidWdfaW5kZXggPT0gTlVMTCB8fCAqZGVidWdfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKLQkJCQkgICAgZmFsc2UpID09IE5VTEwpKQotCSAgICAgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCQkgICAgICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkJICB8fCBzbXR5cCAhPSBYVFlfU0QpKQotCQkgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gbm90IHNraXAgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLwotICAgICAgaWYgKHNraXAKLQkgICYmIHJlcXVpcmUKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0Jc2tpcCA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCi0JCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBJZiAqZGVidWdfaW5kZXggIT0gLTEsIHRoZQotCQkgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCAmJiAqZGVidWdfaW5kZXggIT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCQlpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX2luZGV4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKLQkJCQkJCQkgKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKLQkJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19CU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19ERUNMCi0JICAgICAgJiYgaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGlzeW0ubl9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgaXN5bS5uX3ZhbHVlICs9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfRklMRSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUKLQkgICAgIG5leHQgQ19GSUxFIHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCi0JICAgICBpcyAtMS4gIFdlIHRyeSB0byBnZXQgdGhpcyByaWdodCwgYmVsb3csIGp1c3QgYmVmb3JlIHdlCi0JICAgICB3cml0ZSB0aGUgc3ltYm9scyBvdXQsIGJ1dCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHdlIG1heQotCSAgICAgaGF2ZSB0byB3cml0ZSB0aGUgc3ltYm9sIG91dCB0d2ljZS4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotCQkgICYmIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSAhPSAobG9uZykgb3V0cHV0X2luZGV4KQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjb3JyZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgfQotCi0JICAvKiBUaGUgdmFsdWUgb2YgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sIGlzIGEgZmlsZSBvZmZzZXQKLSAgICAgICAgICAgICBpbnRvIHRoZSBsaW5lIG51bWJlcnMuICBXZSB1cGRhdGUgdGhlIHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgICAgICAgICAgIHdlIGhhbmRsZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfQklOQ0wKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRUlOQ0wpCi0JICAgIHsKLQkgICAgICBpc3ltLm5fdmFsdWUgPSBmaW5mby0+bGluZV9maWxlcG9zOwotCSAgICAgICsraW5jbHM7Ci0JICAgIH0KLQotCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotCi0JICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OwotCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaW5keCA9ICgoZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkgICAgICAvIGlzeW1lc3opOwotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgICAgIGgtPmluZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIHN5bWJvbCBpbiB0aGUgVE9DIHdoaWNoIHdlIG1heSBoYXZlIG1lcmdlZAotICAgICAgICAgICAgIChjbGFzcyBYTUNfVEMpLCByZW1lbWJlciB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSBUT0MKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiAqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICAgICAgKCpzeW1faGFzaCktPnUudG9jX2luZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgb3V0cHV0X2luZGV4ICs9IGFkZDsKLQkgIG91dHN5bSArPSBhZGQgKiBvc3ltZXN6OwotCX0KLQotICAgICAgZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgY3NlY3RwcCArPSBhZGQ7Ci0gICAgICBzeW1faGFzaCArPSBhZGQ7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCkKLQlkZWJ1Z19pbmRleCArPSBhZGQ7Ci0gICAgICArK2luZGV4cDsKLSAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQotCSppbmRleHArKyA9IC0xOwotICAgIH0KLQotICAvKiBGaXggdXAgdGhlIGF1eCBlbnRyaWVzIGFuZCB0aGUgQ19CU1RBVCBzeW1ib2xzLiAgVGhpcyBtdXN0IGJlCi0gICAgIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3Qgc3ltYm9sCi0gICAgIGluZGljZXMgdW50aWwgd2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgd2hpY2ggc3ltYm9scyB3ZSBhcmUgZ29pbmcKLSAgICAgdG8ga2VlcC4gICovCi0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgaW50IGFkZDsKLQotICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKLQotICAgICAgaWYgKCppbmRleHAgPCAwKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgaTsKLQotCSAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JTVEFUKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQlNUQVQgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdGFibGUKLSAgICAgICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLwotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLCAoUFRSKSBvdXRzeW0sIChQVFIpICZpc3ltKTsKLQkgICAgICBpbmR4ID0gaXN5bS5uX3ZhbHVlOwotCSAgICAgIGlmIChpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCXsKLQkJICBsb25nIHN5bWluZHg7Ci0KLQkJICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgaXN5bS5uX3ZhbHVlID0gc3ltaW5keDsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJfQotCSAgICB9Ci0KLQkgIGVzeW0gKz0gaXN5bWVzejsKLQkgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCi0JCQkJICAgIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCSAgICAoUFRSKSAmYXV4KTsKLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlsZSBuYW1lIChvciBzb21lIGNvbW1lbnQgcHV0IGluIGJ5Ci0JCSAgICAgdGhlIGNvbXBpbGVyKS4gIElmIGl0IGlzIGxvbmcsIHdlIG11c3QgcHV0IGl0IGluCi0JCSAgICAgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eC54X2ZpbGUueF9uLnhfemVyb2VzID09IDAKLQkJICAgICAgJiYgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgICAgICBCRkRfQVNTRVJUIChhdXgueF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXgueF9maWxlLnhfbi54X29mZnNldDsKLQkJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgZmlsZW5hbWUsCi0JCQkJCQkgaGFzaCwgY29weSk7Ci0JCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQKLQkJCXx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJICAgICAgICYmIGkgKyAxID09IGlzeW1wLT5uX251bWF1eCkKLQkJewotCQkgIC8qIFdlIGRvbid0IHN1cHBvcnQgdHlwZSBjaGVja2luZy4gIEkgZG9uJ3Qga25vdyBpZgotICAgICAgICAgICAgICAgICAgICAgYW55Ym9keSBkb2VzLiAgKi8KLQkJICBhdXgueF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLQkJICAvKiBJIGRvbid0IHRoaW5rIGFueWJvZHkgdXNlcyB0aGVzZSBmaWVsZHMsIGJ1dCB3ZSdkCi0gICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgY2xvYmJlciB0aGVtIGp1c3QgaW4gY2FzZS4gICovCi0JCSAgYXV4LnhfY3NlY3QueF9zdGFiID0gMDsKLQkJICBhdXgueF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0JCSAgaWYgKFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfTEQpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkJICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgbG9uZyBzeW1pbmR4OwotCi0JCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCQkgIGVsc2UKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQkJICAgICAgaWYgKGluZHggPiAwCi0JCQkgICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgLyogV2UgbG9vayBmb3J3YXJkIHRocm91Z2ggdGhlIHN5bWJvbCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHN5bWJvbCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZWx5IHJpZ2h0LiAgKi8KLQkJCSAgd2hpbGUgKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgICsraW5keDsKLQkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKLQkJCSAgZWxzZQotCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXgueF9zeW0ueF90YWduZHgubDsKLQkJICBpZiAoaW5keCA+IDAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBsb25nIHN5bWluZHg7Ci0KLQkJICAgICAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKHN5bWluZHggPCAwKQotCQkJYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkgICAgICBlbHNlCi0JCQlhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZwotCQkgdGhlbS4gIFdlIGRvIHRoaXMgb24gYSBzeW1ib2wgYnkgc3ltYm9sIGJhc2lzIGluCi0JCSBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAotCQkgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JCSAgJiYgaSA9PSAwCi0JCSAgJiYgaXN5bXAtPm5fbnVtYXV4ID4gMQotCQkgICYmIElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICYmIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkJewotCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCQkgICAgICAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfc29tZSkKLQkJICAgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkJICAgICAgdW5zaWduZWQgaW50IGVuY19jb3VudDsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCi0JCSAgICAgIG8gPSAqY3NlY3RwcDsKLQkJICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+ZW5jbG9zaW5nOwotCQkgICAgICBlbmNfY291bnQgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5saW5lbm9fY291bnQ7Ci0JCSAgICAgIGlmIChvbGluZSAhPSBlbmNsb3NpbmcpCi0JCQl7Ci0JCQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLAotCQkJCQllbmNsb3NpbmctPmxpbmVfZmlsZXBvcywKLQkJCQkJU0VFS19TRVQpICE9IDAKLQkJCSAgICAgIHx8IChiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwKLQkJCQkJICAgIGVuY19jb3VudCwgaW5wdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogZW5jX2NvdW50KSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIG9saW5lID0gZW5jbG9zaW5nOwotCQkJfQotCi0JCSAgICAgIGxpbm9mZiA9IChhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyCi0JCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIChQVFIpIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiksCi0JCQkJCSAgICAgICAoUFRSKSAmbGluKTsKLQkJICAgICAgaWYgKGxpbi5sX2xubm8gIT0gMAotCQkJICB8fCAoKGJmZF9zaXplX3R5cGUpIGxpbi5sX2FkZHIubF9zeW1uZHgKLQkJCSAgICAgICE9ICgoZXN5bQotCQkJCSAgIC0gaXN5bWVzegotCQkJCSAgIC0gKChiZmRfYnl0ZSAqKQotCQkJCSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpKQotCQkJCSAgLyBpc3ltZXN6KSkpCi0JCQlhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gMDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfYnl0ZSAqbGlucGVuZCwgKmxpbnA7Ci0JCQkgIGJmZF92bWEgb2Zmc2V0OwotCQkJICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0JCQkgIGxpbi5sX2FkZHIubF9zeW1uZHggPSAqaW5kZXhwOwotCQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZsaW4sCi0JCQkJCQkgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zCi0JCQkJCQkJICAgKyBsaW5vZmYpKTsKLQotCQkJICBsaW5wZW5kID0gKGZpbmZvLT5saW5lbm9zCi0JCQkJICAgICArIGVuY19jb3VudCAqIGxpbmVzeik7Ci0JCQkgIG9mZnNldCA9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgby0+b3V0cHV0X29mZnNldAotCQkJCSAgICAtIG8tPnZtYSk7Ci0JCQkgIGZvciAobGlucCA9IGZpbmZvLT5saW5lbm9zICsgbGlub2ZmICsgbGluZXN6OwotCQkJICAgICAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgICAgIGxpbnAgKz0gbGluZXN6KQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAgICAgKFBUUikgJmxpbik7Ci0JCQkgICAgICBpZiAobGluLmxfbG5ubyA9PSAwKQotCQkJCWJyZWFrOwotCQkJICAgICAgbGluLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkoUFRSKSAmbGluLAotCQkJCQkJCShQVFIpIGxpbnApOwotCQkJICAgIH0KLQotCQkJICBjb3VudCA9IChsaW5wIC0gKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSkgLyBsaW5lc3o7Ci0KLQkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQotCQkJICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkJCVNFRUtfU0VUKSAhPSAwCi0JCQkgICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiwKLQkJCQkJICAgICBsaW5lc3osIGNvdW50LCBvdXRwdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogY291bnQpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9IGNvdW50OwotCi0JCQkgIGlmIChpbmNscyA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaWlzcCwgKmlpc3BlbmQ7Ci0JCQkgICAgICBsb25nICppaW5kcDsKLQkJCSAgICAgIGJmZF9ieXRlICpvb3M7Ci0JCQkgICAgICBpbnQgaWlhZGQ7Ci0KLQkJCSAgICAgIC8qIFVwZGF0ZSBhbnkgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVmZXIgdG8gYSBsaW5lIG51bWJlciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHdlIGp1c3Qgb3V0cHV0LiAgKi8KLQkJCSAgICAgIGlpc3AgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLQkJCSAgICAgIGlpc3BlbmQgPSAoaWlzcAotCQkJCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBpaW5kcCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLQkJCSAgICAgIG9vcyA9IGZpbmZvLT5vdXRzeW1zOwotCQkJICAgICAgd2hpbGUgKGlpc3AgPCBpaXNwZW5kKQotCQkJCXsKLQkJCQkgIGlmICgqaWluZHAgPj0gMAotCQkJCSAgICAgICYmIChpaXNwLT5uX3NjbGFzcyA9PSBDX0JJTkNMCi0JCQkJCSAgfHwgaWlzcC0+bl9zY2xhc3MgPT0gQ19FSU5DTCkKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA+PSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyArIGxpbm9mZikKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA8IChlbmNsb3NpbmctPmxpbmVfZmlsZXBvcwotCQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KSkpCi0JCQkJICAgIHsKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlpczsKLQotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAoUFRSKSBvb3MsCi0JCQkJCQkJICAgIChQVFIpICZpaXMpOwotCQkJCSAgICAgIGlpcy5uX3ZhbHVlID0KLQkJCQkJKGlpc3AtPm5fdmFsdWUKLQkJCQkJIC0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MKLQkJCQkJIC0gbGlub2ZmCi0JCQkJCSArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOwotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIChQVFIpICZpaXMsCi0JCQkJCQkJICAgICAoUFRSKSBvb3MpOwotCQkJCSAgICAgIC0taW5jbHM7Ci0JCQkJICAgIH0KLQotCQkJCSAgaWlhZGQgPSAxICsgaWlzcC0+bl9udW1hdXg7Ci0JCQkJICBpZiAoKmlpbmRwID49IDApCi0JCQkJICAgIG9vcyArPSBpaWFkZCAqIG9zeW1lc3o7Ci0JCQkJICBpaXNwICs9IGlpYWRkOwotCQkJCSAgaWluZHAgKz0gaWlhZGQ7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBpc3ltcC0+bl90eXBlLAotCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCSAgICAgIG91dHN5bSArPSBvc3ltZXN6OwotCSAgICAgIGVzeW0gKz0gaXN5bWVzejsKLQkgICAgfQotCX0KLQotICAgICAgaW5kZXhwICs9IGFkZDsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgIGNzZWN0cHAgKz0gYWRkOwotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpOwotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSB0cnVlOwotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgby0+X3Jhd19zaXplID09IDAKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGhhdmUgc2V0IGZpbGVwb3MgY29ycmVjdGx5IGZvciB0aGUgc2VjdGlvbnMgd2UgY3JlYXRlZCB0bwotICAgICAgICAgcmVwcmVzZW50IGNzZWN0cywgc28gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHNob3VsZCB3b3JrLiAgKi8KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgZmluZm8tPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGludCB0YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgbG9uZyByX3N5bW5keDsKLQotCSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIHRhcmdldF9pbmRleCA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9yZWxvY3MgPSAoeGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICB0cnVlLAotCQkJICAgICAgKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCSAgICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0cykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0JICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCSAgICAgIGJvb2xlYW4gcXVpZXQ7Ci0KLQkgICAgICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JICAgICAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkgICAgICByX3N5bW5keCA9IGlyZWwtPnJfc3ltbmR4OwotCi0JICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCQloID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocl9zeW1uZHggIT0gLTEgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQkJewotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19URAotCQkgICAgICAmJiAoaXJlbC0+cl90eXBlID09IFJfVE9DCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX0dMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RDTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkwKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVFJMQSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgdGhlIG9uZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmVsb2MgaXMgZm9yLiAgV2Ugd2FudCB0byBtYWtlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWxvYyBhZ2FpbnN0IHRoZSBUT0MgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgc3ltYm9sIGl0c2VsZi4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkJICAgICAgaWYgKGgtPnUudG9jX2luZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPnUudG9jX2luZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbjsKLQkJCSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzaTsKLQotCQkJICBuID0gKChzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2gpKSk7Ci0JCQkgIGlmIChuID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBzaSA9IGZpbmZvLT5zZWN0aW9uX2luZm8gKyB0YXJnZXRfaW5kZXg7Ci0JCQkgIG4tPm5leHQgPSBzaS0+dG9jX3JlbF9oYXNoZXM7Ci0JCQkgIG4tPmggPSBoOwotCQkJICBuLT5yZWwgPSBpcmVsOwotCQkJICBzaS0+dG9jX3JlbF9oYXNoZXMgPSBuOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLwotCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQotCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAotCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKLQkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKLQkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KLQkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCi0JCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLwotCQkJICAqcmVsX2hhc2ggPSBoOwotCQkJICBoLT5pbmR4ID0gLTI7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tyX3N5bW5keF07Ci0KLQkJICAgICAgaWYgKGluZHggPT0gLTEpCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCi0JCQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgYSBUQzAgVE9DIGFuY2hvciBhcmUKLQkJCSAgICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBiZSBhZ2FpbnN0Ci0JCQkgICAgIHRoZSBUT0MgYW5jaG9yIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJCSAgaWYgKGlzLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCQkJICAgICAgJiYgaXMtPm5fbnVtYXV4ID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBQVFIgYXV4cHRyOwotCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkJICAgICAgYXV4cHRyID0gKChQVFIpCi0JCQkJCSgoKGJmZF9ieXRlICopCi0JCQkJCSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCQkJICsgKChyX3N5bW5keCArIGlzLT5uX251bWF1eCkKLQkJCQkJICAgICogaXN5bWVzeikpKTsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIGF1eHB0ciwKLQkJCQkJCSAgICBpcy0+bl90eXBlLCBpcy0+bl9zY2xhc3MsCi0JCQkJCQkgICAgaXMtPm5fbnVtYXV4IC0gMSwKLQkJCQkJCSAgICBpcy0+bl9udW1hdXgsCi0JCQkJCQkgICAgKFBUUikgJmF1eCk7Ci0JCQkgICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9TRAotCQkJCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQkJCQlpbmR4ID0gZmluZm8tPnRvY19zeW1pbmR4OwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCQkJICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgd2UgYXJlCi0JCQkgICAgIHN0cmlwcGluZy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZQotCQkJICAgICB0aGlzIGNhc2UsIGJ1dCBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGggaXQuICAqLwotCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0KLQkJCSAgbmFtZSA9IChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLQkJCQkgIChpbnB1dF9iZmQsIGlzLCBidWYpKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG8sCi0JCQkJICBpcmVsLT5yX3ZhZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBxdWlldCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgIC8qIFRoaXMgcmVsb2MgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLQkJICAgICBzZWN0aW9uLiAgKi8KLQkJICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLQkJICBpZiAocl9zeW1uZHggPT0gLTEpCi0JCSAgICBsZHJlbC5sX3N5bW5keCA9IC0xOwotCQkgIGVsc2UgaWYgKGggPT0gTlVMTAotCQkJICAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkJc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkJICAgICAgZWxzZQotCQkJc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JCSAgICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuZGF0YSIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmJzcyIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICBzZWMtPm5hbWUpOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDApCi0JCQl7Ci0JCQkgIC8qIFdlIGFscmVhZHkgY2FsbGVkIHRoZSB1bmRlZmluZWRfc3ltYm9sCi0JCQkgICAgIGNhbGxiYWNrIGZvciB0aGlzIHJlbG9jYXRpb24sIGluCi0JCQkgICAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24uICBEb24ndAotCQkJICAgICBpc3N1ZSBhbnkgbW9yZSB3YXJuaW5ncy4gICovCi0JCQkgIHF1aWV0ID0gdHJ1ZTsKLQkJCX0KLQkJICAgICAgaWYgKGgtPmxkaW5keCA8IDAgJiYgISBxdWlldCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotCQkgICAgfQotCQkgIGxkcmVsLmxfcnR5cGUgPSAoaXJlbC0+cl9zaXplIDw8IDgpIHwgaXJlbC0+cl90eXBlOwotCQkgIGxkcmVsLmxfcnNlY25tID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT50ZXh0cm8KLQkJICAgICAgJiYgc3RyY21wIChvLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMAotCQkgICAgICAmJiAhIHF1aWV0KQotCQkgICAgewotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogbG9hZGVyIHJlbG9jIGluIHJlYWQtb25seSBzZWN0aW9uICVzIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBvLT5vdXRwdXRfc2VjdGlvbikpOwotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwKLQkJCQkJZmluZm8tPmxkcmVsKTsKLQkJICBCRkRfQVNTRVJUIChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHJlbCkgPT0gTERSRUxTWik7Ci0JCSAgKytmaW5mby0+bGRyZWw7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCi0JCQkJICAgICAgID8gby0+X2Nvb2tlZF9zaXplCi0JCQkJICAgICAgIDogby0+X3Jhd19zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSBrZWVwX3N5bXM7Ci0KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI3VuZGVmIE5fVE1BU0sKLSN1bmRlZiBOX0JUU0hGVAotCi0vKiBXcml0ZSBvdXQgYSBub24tWENPRkYgZ2xvYmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBwOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBnYXJiYWdlIGNvbGxlY3RlZCwganVzdCBza2lwIGl0LiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgbmVlZCBhIC5sb2FkZXIgc2VjdGlvbiBlbnRyeSwgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKGgtPmxkc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLSAgICAgIGJmZCAqaW1wYmZkOwotCi0gICAgICBsZHN5bSA9IGgtPmxkc3ltOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JewotCSAgbGRzeW0tPmxfdmFsdWUgPSAwOwotCSAgbGRzeW0tPmxfc2NudW0gPSBOX1VOREVGOwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX0VSOwotCSAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGxkc3ltLT5sX3ZhbHVlID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLQkgIGxkc3ltLT5sX3NjbnVtID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX1NEOwotCSAgaW1wYmZkID0gc2VjLT5vd25lcjsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0gICAgICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOwotCi0gICAgICBsZHN5bS0+bF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgICAgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JbGRzeW0tPmxfaWZpbGUgPSAwOwotICAgICAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKLQl7Ci0JICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlIGlmIChpbXBiZmQgPT0gTlVMTCkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoaW1wYmZkLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpOwotCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxkc3ltLT5sX3Bhcm0gPSAwOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChMRFNZTVNaID09IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSk7Ci0gICAgICB4Y29mZl9zd2FwX2xkc3ltX291dCAob3V0cHV0X2JmZCwgbGRzeW0sIGZpbmZvLT5sZHN5bSArIGgtPmxkaW5keCAtIDMpOwotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBuZWVkcyBnbG9iYWwgbGlua2FnZSBjb2RlLCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5saW5rYWdlX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3ZtYSB0b2NvZmY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgbG9hZHMgYQotICAgICAgICAgc3BlY2lmaWMgVE9DIGVsZW1lbnQuICAqLwotICAgICAgdG9jb2ZmID0gKGgtPmRlc2NyaXB0b3ItPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKTsKLSAgICAgIGlmICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSAhPSAwKQotCXRvY29mZiArPSBoLT5kZXNjcmlwdG9yLT51LnRvY19vZmZzZXQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBYQ09GRl9HTElOS19GSVJTVCB8ICh0b2NvZmYgJiAweGZmZmYpLCBwKTsKLSAgICAgIGZvciAoaSA9IDAsIHAgKz0gNDsKLQkgICBpIDwgc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXTsKLQkgICBpKyssIHAgKz0gNCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB4Y29mZl9nbGlua19jb2RlW2ldLCBwKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHdyaXRlIG91dCB0aGUgcmVxdWlyZWQKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnRvY3NlYzsKLSAgICAgIGFzZWN0aW9uICpvc2VjOwotICAgICAgaW50IG9pbmR4OwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpcnN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpcmF1eDsKLQotICAgICAgdG9jc2VjID0gaC0+dG9jX3NlY3Rpb247Ci0gICAgICBvc2VjID0gdG9jc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgdG9jc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnUudG9jX29mZnNldCk7Ci0gICAgICBpZiAoaC0+aW5keCA+PSAwKQotCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoLT5pbmR4ID0gLTI7Ci0JICBpcmVsLT5yX3N5bW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZW1pdCBhIHN5bWJvbCB0byBkZWZpbmUgYSBjc2VjdCB3aGljaCBob2xkcyB0aGUKLSAgICAgICAgIHJlbG9jLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotCSAgICBzdHJuY3B5IChpcnN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBib29sZWFuIGhhc2g7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaGFzaCA9IHRydWU7Ci0JICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JCWhhc2ggPSBmYWxzZTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgaGFzaCwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlyc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICAgICBpcnN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIGlyc3ltLm5fdmFsdWUgPSBpcmVsLT5yX3ZhZGRyOwotCSAgaXJzeW0ubl9zY251bSA9IG9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGlyc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0JICBpcnN5bS5uX3R5cGUgPSBUX05VTEw7Ci0JICBpcnN5bS5uX251bWF1eCA9IDE7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyc3ltLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIG1lbXNldCAoJmlyYXV4LCAwLCBzaXplb2YgaXJhdXgpOwotCSAgaXJhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCSAgaXJhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gNDsKLQkgIGlyYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfVEM7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyYXV4LCBUX05VTEwsIENfSElERVhULAotCQkJCSAwLCAxLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIGlmIChoLT5pbmR4ID49IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmVuJ3QgZ29pbmcgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGJlbG93LCBzbyB3ZQotCQkgbmVlZCB0byB3cml0ZSB0aGVtIG91dCBub3cuICAqLwotCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJICAgICArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCkpKSwKLQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCQkgb3V0cHV0X2JmZCkKLQkJICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0JCShvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0JICAgICAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgc3BlY2lhbGx5IGRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciwgd3JpdGUKLSAgICAgaXQgb3V0LiAgVGhlIGZpcnN0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvZGUKLSAgICAgaXRzZWxmLCB0aGUgc2Vjb25kIHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFRPQywgYW5kIHRoZSB0aGlyZAotICAgICB3b3JkIGlzIHplcm8uICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgIGludCBvaW5keDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OwotICAgICAgYXNlY3Rpb24gKmVzZWM7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0gICAgICBhc2VjdGlvbiAqdHNlYzsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBvaW5keCA9IG9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIHAgPSBzZWMtPmNvbnRlbnRzICsgaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgaGVudHJ5ID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIEJGRF9BU1NFUlQgKGhlbnRyeSAhPSBOVUxMCi0JCSAgJiYgKGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoZW50cnktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLSAgICAgIGVzZWMgPSBoZW50cnktPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBlc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaGVudHJ5LT5yb290LnUuZGVmLnZhbHVlKSwKLQkJICBwKTsKLQotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBlc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MsIHAgKyA0KTsKLQotICAgICAgdHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAob3V0cHV0X2JmZCwKLQkJCQkJICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c250b2MpOwotCi0gICAgICArK2lyZWw7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyA0KTsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gdHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuZGF0YSIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7Ci0gICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OwotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgICAgICsrZmluZm8tPmxkcmVsOwotICAgIH0KLQotICBpZiAoaC0+aW5keCA+PSAwIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGgtPmZsYWdzICYgKFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfREVGX1JFR1VMQVIpKSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmYXV4LCAwLCBzaXplb2YgYXV4KTsKLQotICBoLT5pbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBoYXNoOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gICAgICBoYXNoID0gdHJ1ZTsKLSAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCWhhc2ggPSBmYWxzZTsKLSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGhhc2gsCi0JCQkJIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9FUjsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgJiYgaC0+c21jbGFzID09IFhNQ19YTykKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikpOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICpsOwotCi0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfSEFTX1NJWkUpICE9IDApCi0JewotCSAgZm9yIChsID0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zaXplX2xpc3Q7Ci0JICAgICAgIGwgIT0gTlVMTDsKLQkgICAgICAgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobC0+aCA9PSBoKQotCQl7Ci0JCSAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IGwtPnNpemU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaXN5bS5uX3NjbnVtID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfQ007Ci0gICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgaXN5bS5uX251bWF1eCA9IDE7Ci0KLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIGlzeW0ubl9zY2xhc3MsIDAsIDEsCi0JCQkgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnNtY2xhcyAhPSBYTUNfWE8pCi0gICAgewotICAgICAgLyogV2UganVzdCBvdXRwdXQgYW4gU0Qgc3ltYm9sLiAgTm93IG91dHB1dCBhbiBMRCBzeW1ib2wuICAqLwotCi0gICAgICBoLT5pbmR4ICs9IDI7Ci0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0gICAgICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgVF9OVUxMLCBDX0VYVCwgMCwgMSwKLQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLSAgICAgIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLCBvdXRwdXRfYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0gICAgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYXNlY3Rpb24gKmhzZWM7Ci0gIGJmZF92bWEgaHZhbDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLSAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkgICAgIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIGh2YWwgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGh2YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhzZWMgPSBOVUxMOwotICAgICAgaHZhbCA9IDA7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotICBpZiAoaHNlYyAhPSBOVUxMKQotICAgIGFkZGVuZCArPSAoaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBodmFsKTsKLQotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkgIGhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCSAgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChoLT5pbmR4ID49IDApCi0gICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotICBlbHNlCi0gICAgewotICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQgd3JpdHRlbiBvdXQuICAqLwotICAgICAgaC0+aW5keCA9IC0yOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0gICAgfQotCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBpcmVsLT5yX3NpemUgPSBob3d0by0+Yml0c2l6ZSAtIDE7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGlyZWwtPnJfc2l6ZSB8PSAweDgwOwotCi0gICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIC8qIE5vdyBvdXRwdXQgdGhlIHJlbG9jIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotCi0gIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotCi0gIGlmIChoc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLQotICAgICAgc2VjbmFtZSA9IGhzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lOwotCi0gICAgICBpZiAoc3RyY21wIChzZWNuYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNlY25hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLCBzZWNuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaC0+bGRpbmR4IDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICB9Ci0KLSAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7Ci0gIGxkcmVsLmxfcnNlY25tID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgKytmaW5mby0+bGRyZWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgcmVsb2NzIGJ5IFZNQS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLXhjb2ZmX3NvcnRfcmVsb2NzIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIxID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICpyMiA9IChjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcDI7Ci0KLSAgaWYgKHIxLT5yX3ZhZGRyID4gcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHIxLT5yX3ZhZGRyIDwgcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBSUy82MDAwL1BPV0VSL1Bvd2VyUEMuCi0gICBUaGlzIGlzIGN1cnJlbnRseSB0aGUgb25seSBwcm9jZXNzb3Igd2hpY2ggdXNlcyBYQ09GRjsgSSBob3BlIHRoYXQKLSAgIHdpbGwgbmV2ZXIgY2hhbmdlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJCSBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIC8qIFJlbG9jYXRpb24gdHlwZSBSX1JFRiBpcyBhIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlIHdoaWNoIGlzCi0gICAgICAgICBtZXJlbHkgdXNlZCB0byBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBmcm9tIG9jY3VycmluZyBmb3IKLSAgICAgICAgIHRoZSBjc2VjdCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB3aGljaCBpdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1JFRikKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JICBhZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCSAgYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICAvKiBXZSBidWlsZCB0aGUgaG93dG8gaW5mb3JtYXRpb24gb24gdGhlIGZseS4gICovCi0KLSAgICAgIGhvd3RvLnR5cGUgPSByZWwtPnJfdHlwZTsKLSAgICAgIGhvd3RvLnJpZ2h0c2hpZnQgPSAwOwotICAgICAgaG93dG8uc2l6ZSA9IDI7Ci0gICAgICBob3d0by5iaXRzaXplID0gKHJlbC0+cl9zaXplICYgMHgxZikgKyAxOwotICAgICAgaG93dG8ucGNfcmVsYXRpdmUgPSBmYWxzZTsKLSAgICAgIGhvd3RvLmJpdHBvcyA9IDA7Ci0gICAgICBpZiAoKHJlbC0+cl9zaXplICYgMHg4MCkgIT0gMCkKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDsKLSAgICAgIGVsc2UKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOwotICAgICAgaG93dG8uc3BlY2lhbF9mdW5jdGlvbiA9IE5VTEw7Ci0gICAgICBob3d0by5uYW1lID0gImludGVybmFsIjsKLSAgICAgIGhvd3RvLnBhcnRpYWxfaW5wbGFjZSA9IHRydWU7Ci0gICAgICBpZiAoaG93dG8uYml0c2l6ZSA9PSAzMikKLQlob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gMHhmZmZmZmZmZjsKLSAgICAgIGVsc2UKLQl7Ci0JICBob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gKDEgPDwgaG93dG8uYml0c2l6ZSkgLSAxOwotCSAgaWYgKGhvd3RvLmJpdHNpemUgPT0gMTYpCi0JICAgIGhvd3RvLnNpemUgPSAxOwotCX0KLSAgICAgIGhvd3RvLnBjcmVsX29mZnNldCA9IGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgLyogSGFjayB0byBtYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBUT0MgYW5jaG9yIHZhbHVlCi0gICAgICAgICAgICAgICAgIGlmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCB0aGUgVE9DIGFuY2hvci4gICovCi0JICAgICAgaWYgKHNlYy0+bmFtZVszXSA9PSAnMCcKLQkJICAmJiBzdHJjbXAgKHNlYy0+bmFtZSwgIi50YzAiKSA9PSAwKQotCQl2YWwgPSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jOwotCSAgICAgIGVsc2UKLQkJdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIEV2ZXJ5IHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QgaXMgZGVmaW5lZCBzb21ld2hlcmUuICAqLwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBEb24ndCB0cnkgdG8gcHJvY2VzcyB0aGUgcmVsb2MuICBJdCBjYW4ndCBoZWxwLCBhbmQKLSAgICAgICAgICAgICAgICAgaXQgbWF5IGdlbmVyYXRlIGFub3RoZXIgZXJyb3IuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIHRvb2sgdGhlIHJlbG9jYXRpb24gdHlwZSBkZWZpbml0aW9ucyBmcm9tIHR3byBkb2N1bWVudHM6Ci0JIHRoZSBQb3dlclBDIEFJWCBWZXJzaW9uIDQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgRmlyc3QKLQkgRWRpdGlvbiAoQXByaWwgMTk5MiksIGFuZCB0aGUgUG93ZXJPcGVuIEFCSSwgQmlnLUVuZGlhbgotCSAzMi1CaXQgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gKEp1bmUgMzAsIDE5OTQpLiAgRGlmZmVyZW5jZXMKLQkgYmV0d2VlbiB0aGUgZG9jdW1lbnRzIGFyZSBub3RlZCBiZWxvdy4gICovCi0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgUl9SVEI6Ci0JY2FzZSBSX1JSVEJJOgotCWNhc2UgUl9SUlRCQToKLQkgIC8qIFRoZXNlIHJlbG9jcyBhcmUgZGVmaW5lZCBieSB0aGUgUG93ZXJQQyBBQkkgdG8gYmUKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2hlcyB3aGljaCB1c2UgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlIHByb2dyYW0gY291bnRlci4gIEkgY2FuJ3QKLSAgICAgICAgICAgICBxdWl0ZSBmaWd1cmUgb3V0IHdoZW4gdGhpcyBpcyB1c2VmdWwuICBUaGVzZSByZWxvY3MgYXJlCi0gICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgdGhlIFBvd2VyT3BlbiBBQkkuICAqLwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCAodW5zaWduZWQgaW50KSByZWwtPnJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIFJfUE9TOgotCSAgLyogU2ltcGxlIHBvc2l0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBSX05FRzoKLQkgIC8qIFNpbXBsZSBuZWdhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIHZhbCA9IC0gdmFsOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JFTDoKLQkgIC8qIFNpbXBsZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgUl9UT0M6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGlucHV0IGZpbGUgVE9DIHRvCi0gICAgICAgICAgICAgdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSB3YW50IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmluYWwKLSAgICAgICAgICAgICBUT0MgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSBoYXZlOgotCSAgICAgICAgIGlzeW0gPSBpVE9DICsgaW4KLQkJIGlpbnNuID0gaW4gKyBvCi0JCSBvc3ltID0gb1RPQyArIG9uCi0JCSBvaW5zbiA9IG9uICsgbwotCSAgICAgc28gd2UgbXVzdCBjaGFuZ2UgaW5zbiBieSBvbiAtIGluLgotCSAgICAgKi8KLQljYXNlIFJfR0w6Ci0JICAvKiBHbG9iYWwgbGlua2FnZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgcmVsb2NhdGlvbgotICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLwotCWNhc2UgUl9UQ0w6Ci0JICAvKiBMb2NhbCBvYmplY3QgVE9DIGFkZHJlc3MuICBJIGNhbid0IGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNhc2UgUl9HTC4gICovCi0JY2FzZSBSX1RSTDoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgQSBUT0MgcmVsYXRpdmUgbG9hZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzIGluc3RydWN0aW9uLgotICAgICAgICAgICAgIEZJWE1FOiBXZSBkb24ndCBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgb3B0aW1pemF0aW9uLiAgKi8KLQljYXNlIFJfVFJMQToKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSBsb2FkCi0gICAgICAgICAgICAgYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdAotICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwgJiYgaC0+c21jbGFzICE9IFhNQ19URCkKLQkgICAgewotCSAgICAgIGlmIChoLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcmVsLT5yX3ZhZGRyLAotCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JICAgICAgdmFsID0gKGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQotCSAgdmFsID0gKCh2YWwgLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKQotCQkgLSAoc3ltLT5uX3ZhbHVlIC0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+dG9jKSk7Ci0JICBhZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0JBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCi0gICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQljYXNlIFJfQ0FJOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBjYWxsIHdoaWNoCi0gICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhIHJlbGF0aXZlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCQToKLQkgIC8qIEFic29sdXRlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2guICAqLwotCWNhc2UgUl9SQkFDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGFuIGFic29sdXRlIGJyYW5jaAotICAgICAgICAgICAgIHRvIGEgc3ltYm9sLiAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQlJDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGEgcmVsYXRpdmUgYnJhbmNoLgotICAgICAgICAgICAgIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfQlI6Ci0JICAvKiBSZWxhdGl2ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DUkVMOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhIHJlbGF0aXZlIGNhbGwgd2hpY2ggbWF5Ci0gICAgICAgICAgICAgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuIGFic29sdXRlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUjoKLQkgIC8qIEEgcmVsYXRpdmUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4KLSAgICAgICAgICAgICBhYnNvbHV0ZSBicmFuY2guICBGSVhNRTogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMsCi0gICAgICAgICAgICAgYWx0aG91Z2ggd2Ugc2hvdWxkIGZvciBzeW1ib2xzIG9mIHN0b3JhZ2UgbWFwcGluZyBjbGFzcwotICAgICAgICAgICAgIFhNQ19YTy4gICovCi0JICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7Ci0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfUkw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cyB0aGlzCi0gICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgY2FzZSBSX1BPUy4gICovCi0JICBicmVhazsKLQljYXNlIFJfUkxBOgotCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgYWRkcmVzcwotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZC4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMKLSAgICAgICAgICAgICB0aGlzIGlzIHRoZSBzYW1lIGFzIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2Ugc2VlIGFuIFJfQlIgb3IgUl9SQlIgcmVsb2Mgd2hpY2ggaXMganVtcGluZyB0byBnbG9iYWwKLSAgICAgICAgIGxpbmthZ2UgY29kZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlIGNyb3Igbm9wCi0gICAgICAgICBpbnN0cnVjdGlvbiwgd2UgcmVwbGFjZSB0aGUgY3JvciB3aXRoIGx3eiByMiwyMChyMSkuICBUaGlzCi0gICAgICAgICByZXN0b3JlcyB0aGUgVE9DIGFmdGVyIHRoZSBnbGluayBjb2RlLiAgQ29udHJhcml3aXNlLCBpZiB0aGUKLSAgICAgICAgIGNhbGwgaXMgZm9sbG93ZWQgYnkgYSBsd3ogcjIsMjAocjEpLCBidXQgdGhlIGNhbGwgaXMgbm90Ci0gICAgICAgICBnb2luZyB0byBnbG9iYWwgbGlua2FnZSBjb2RlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgbG9hZCB3aXRoIGEKLSAgICAgICAgIGNyb3IuICAqLwotICAgICAgaWYgKChyZWwtPnJfdHlwZSA9PSBSX0JSIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCSAgJiYgaCAhPSBOVUxMCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgOAotCSAgICAgIDw9IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkpCi0JewotCSAgYmZkX2J5dGUgKnBuZXh0OwotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBwbmV4dCA9IGNvbnRlbnRzICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkgKyA0OwotCSAgbmV4dCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgcG5leHQpOwotCi0JICAvKiBUaGUgX3B0cmdsIGZ1bmN0aW9uIGlzIG1hZ2ljLiAgSXQgaXMgdXNlZCBieSB0aGUgQUlYCi0gICAgICAgICAgICAgY29tcGlsZXIgdG8gY2FsbCBhIGZ1bmN0aW9uIHRocm91Z2ggYSBwb2ludGVyLiAgKi8KLQkgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0dMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiLl9wdHJnbCIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobmV4dCA9PSAweDRkZWY3YjgyCQkvKiBjcm9yIDE1LDE1LDE1ICovCi0JCSAgfHwgbmV4dCA9PSAweDRmZmZmYjgyKQkvKiBjcm9yIDMxLDMxLDMxICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg4MDQxMDAxNCwgcG5leHQpOyAvKiBsd3ogcjEsMjAocjEpICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4ODA0MTAwMTQpCQkvKiBsd3ogcjEsMjAocjEpICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg0ZmZmZmI4MiwgcG5leHQpOyAvKiBjcm9yIDMxLDMxLDMxICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaW5jbHVkZXMgdGhlIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAoaG93dG8ucGNfcmVsYXRpdmUpCi0JYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKCZob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICBjaGFyIGhvd3RvX25hbWVbMTBdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgc3ByaW50ZiAoaG93dG9fbmFtZSwgIjB4JTAyeCIsIHJlbC0+cl90eXBlKTsKLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG9fbmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvY29uZmlnLW1sLmluIGIvY29uZmlnLW1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNmN2NmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy1tbC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0jIENvbmZpZ3VyZSBmcmFnbWVudCBpbnZva2VkIGluIHRoZSBwb3N0LXRhcmdldCBzZWN0aW9uIGZvciBzdWJkaXJzCi0jIHdhbnRpbmcgbXVsdGlsaWIgc3VwcG9ydC4KLSMKLSMgSXQgaXMgYWR2aXNhYmxlIHRvIHN1cHBvcnQgYSBmZXcgLS1lbmFibGUvLS1kaXNhYmxlIG9wdGlvbnMgdG8gbGV0IHRoZQotIyB1c2VyIHNlbGVjdCB3aGljaCBsaWJyYXJpZXMgcy9oZSByZWFsbHkgd2FudHMuCi0jCi0jIFN1YmRpcmVjdG9yaWVzIHdpc2hpbmcgdG8gdXNlIG11bHRpbGliIHNob3VsZCBwdXQgdGhlIGZvbGxvd2luZyBsaW5lcwotIyBpbiB0aGUgInBvc3QtdGFyZ2V0IiBzZWN0aW9uIG9mIGNvbmZpZ3VyZS5pbi4KLSMKLSMgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdIDsgdGhlbgotIyAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLi9jb25maWctbWwuaW4KLSMgICBlbHNlCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi9jb25maWctbWwuaW4KLSMgICBmaQotIyBlbHNlCi0jICAgLiAke3NyY2Rpcn0vLi4vY29uZmlnLW1sLmluCi0jIGZpCi0jCi0jIFNlZSBsaWJyeC9jb25maWd1cmUuaW4gaW4gdGhlIGxpYmcrKyBkaXN0cmlidXRpb24gZm9yIGFuIGV4YW1wbGUgb2YgaG93Ci0jIHRvIGhhbmRsZSBhdXRvY29uZidkIGxpYnJhcmllcy4KLSMKLSMgVGhpbmdzIGFyZSBjb21wbGljYXRlZCBiZWNhdXNlIDYgc2VwYXJhdGUgY2FzZXMgbXVzdCBiZSBoYW5kbGVkOgotIyAyIChuYXRpdmUsIGNyb3NzKSB4IDMgKGFic29sdXRlLXBhdGgsIHJlbGF0aXZlLW5vdC1kb3QsIGRvdCkgPSA2LgotIwotIyBzcmNkaXI9LiBpcyBzcGVjaWFsLiAgSXQgbXVzdCBoYW5kbGUgbWFrZSBwcm9ncmFtcyB0aGF0IGRvbid0IGhhbmRsZSBWUEFUSC4KLSMgVG8gaW1wbGVtZW50IHRoaXMsIGEgc3ltbGluayB0cmVlIGlzIGJ1aWx0IGZvciBlYWNoIGxpYnJhcnkgYW5kIGZvciBlYWNoCi0jIG11bHRpbGliIHN1YmRpci4KLSMKLSMgVGhlIGJ1aWxkIHRyZWUgaXMgbGF5ZWQgb3V0IGFzCi0jCi0jIC4vCi0jICAgbGliZysrCi0jICAgbmV3bGliCi0jICAgbTY4MDIwLwotIyAgICAgICAgICBsaWJnKysKLSMgICAgICAgICAgbmV3bGliCi0jICAgICAgICAgIG02ODg4MS8KLSMgICAgICAgICAgICAgICAgIGxpYmcrKwotIyAgICAgICAgICAgICAgICAgbmV3bGliCi0jCi0jIFRoZSBuaWNlIGZlYXR1cmUgYWJvdXQgdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IGludGVyLWxpYnJhcnkgcmVmZXJlbmNlcwotIyBpbiB0aGUgYnVpbGQgdHJlZSB3b3JrIHdpdGhvdXQgaGF2aW5nIHRvIGNhcmUgd2hlcmUgeW91IGFyZS4gIE5vdGUgdGhhdAotIyBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMgYWxzbyB3b3JrIGluIHRoZSBzb3VyY2UgdHJlZSBiZWNhdXNlIHN5bWxpbmsgdHJlZXMKLSMgYXJlIGJ1aWx0IHdoZW4gc3JjZGlyPS4KLSMKLSMgVW5mb3J0dW5hdGVseSwgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgbGlicmFyaWVzIGluIHRoZSBidWlsZCB0cmVlIHJlcXVpcmVzCi0jIHRoZSB1c2VyIHRvIG1hbnVhbGx5IGNob29zZSB3aGljaCBsaWJyYXJ5IHRvIHVzZSBhcyBHQ0Mgd29uJ3QgYmUgYWJsZSB0bwotIyBmaW5kIHRoZSByaWdodCBvbmUuICBUaGlzIGlzIHZpZXdlZCBhcyB0aGUgbGVzc2VyIG9mIHR3byBldmlscy4KLSMKLSMgQ29uZmlndXJlIHZhcmlhYmxlczoKLSMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG9yICR7dGFyZ2V0X2FsaWFzfSBmb3IgY3Jvc3MuCi0jIFNldCBieSB0b3AgbGV2ZWwgTWFrZWZpbGUuCi0jICR7d2l0aF9tdWx0aXNyY3RvcH0gPSBob3cgbWFueSBsZXZlbHMgb2YgbXVsdGlsaWJzIHRoZXJlIGFyZSBpbiB0aGUgc291cmNlCi0jIHRyZWUuICBJdCBleGlzdHMgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UgdHJlZToKLSMgJHtzcmNkaXJ9IGlzIG5vdCBjb25zdGFudC4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSA9IG5hbWUgb2YgbXVsdGlsaWIgc3ViZGlyZWN0b3J5IChlZzogbTY4MDIwL202ODg4MSkuCi0jCi0jIE1ha2VmaWxlIHZhcmlhYmxlczoKLSMgTVVMVElTUkNUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHNvdXJjZSB0cmVlICgrMSBpZiBjcm9zcykKLSMgKEZJWE1FOiBub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiAke3dpdGhfbXVsdGlzcmN0b3B9LiAgQ2hlY2sgb3V0LikuCi0jIE1VTFRJQlVJTERUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIGJ1aWxkIHRyZWUKLSMgTVVMVElESVJTID0gbGlzdCBvZiBtdWx0aWxpYiBzdWJkaXJzIChlZzogbTY4MDAwIG02ODAyMCAuLi4pCi0jIChvbmx5IGRlZmluZWQgaW4gZWFjaCBsaWJyYXJ5J3MgbWFpbiBNYWtlZmlsZSkuCi0jIE1VTFRJU1VCRElSID0gaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGggbGVhZGluZyAnLycgKGVnOiAvbTY4MDAwKQotIyAob25seSBkZWZpbmVkIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyKS4KLQotIyBGSVhNRTogTXVsdGlsaWIgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbgotIyBuZXdsaWIuICBJdCBpcyB1cCB0byBlYWNoIHRhcmdldCB0byB0dXJuIG9uIG11bHRpbGliIHN1cHBvcnQgZm9yIHRoZSBvdGhlcgotIyBsaWJyYXJpZXMgYXMgZGVzaXJlZC4KLQotIyBXZSBoYXZlIHRvIGhhbmRsZSBiZWluZyBpbnZva2VkIGJ5IGJvdGggQ3lnbnVzIGNvbmZpZ3VyZSBhbmQgQXV0b2NvbmYuCi0jCi0jIEN5Z251cyBjb25maWd1cmUgaW5jb21pbmcgdmFyaWFibGVzOgotIyBzcmNkaXIsIHN1YmRpciwgaG9zdCwgYXJndW1lbnRzCi0jCi0jIEF1dG9jb25mIGluY29taW5nIHZhcmlhYmxlczoKLSMgc3JjZGlyLCBob3N0LCBhY19jb25maWd1cmVfYXJncwotIwotIyBXZSAqY291bGQqIGZpZ3VyZSBzcmNkaXIgYW5kIGhvc3Qgb3V0LCBidXQgd2UnZCBoYXZlIHRvIGRvIHdvcmsgdGhhdAotIyBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgdG8gZmlndXJlIHRoZW0gb3V0IGFuZCByZXF1aXJpbmcgdGhlc2UgdHdvCi0jIHNlZW1zIHJlYXNvbmFibGUuCi0jIE5vdGUgdGhhdCBgaG9zdCcgaW4gdGhpcyBjYXNlIGlzIEdDQydzIGB0YXJnZXQnLiAgVGFyZ2V0IGxpYnJhcmllcyBhcmUKLSMgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QuCi0KLWlmIFsgLW4gIiR7YWNfY29uZmlndXJlX2FyZ3N9IiBdOyB0aGVuCi0gIE1ha2VmaWxlPSR7YWNfZmlsZS1NYWtlZmlsZX0KLSAgbWxfY29uZmlnX3NoZWxsPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gIG1sX2FyZ3VtZW50cz0iJHthY19jb25maWd1cmVfYXJnc30iCi0gIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci1lbHNlCi0gIE1ha2VmaWxlPSR7TWFrZWZpbGUtTWFrZWZpbGV9Ci0gIG1sX2NvbmZpZ19zaGVsbD0ke2NvbmZpZ19zaGVsbC0vYmluL3NofQotICBtbF9hcmd1bWVudHM9IiR7YXJndW1lbnRzfSIKLSAgaWYgWyAtbiAiJHtzdWJkaXJ9IiAtYSAiJHtzdWJkaXJ9IiAhPSAiLiIgXSA7IHRoZW4KLSAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfS8ke3N1YmRpcn0KLSAgZWxzZQotICAgIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci0gIGZpCi1maQotCi0jIFNjYW4gYWxsIHRoZSBhcmd1bWVudHMgYW5kIHNldCBhbGwgdGhlIG9uZXMgd2UgbmVlZC4KLQotbWxfdmVyYm9zZT0tLXZlcmJvc2UKLWZvciBvcHRpb24gaW4gJHttbF9hcmd1bWVudHN9Ci1kbwotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qKSA7OwotICAtKikgb3B0aW9uPS0kb3B0aW9uIDs7Ci0gIGVzYWMKLQotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qPSopCi0Jb3B0YXJnPWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tZGlzYWJsZS0qKQotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PW5vCi0JOzsKLSAgLS1lbmFibGUtKikKLQljYXNlICIkb3B0aW9uIiBpbgotCSo9KikJOzsKLQkqKQlvcHRhcmc9eWVzIDs7Ci0JZXNhYwotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0tbm9yZWN1cnNpb24gfCAtLW5vKikKLQltbF9ub3JlY3Vyc2lvbj15ZXMKLQk7OwotICAtLXNpbGVudCB8IC0tc2lsKiB8IC0tcXVpZXQgfCAtLXEqKQotCW1sX3ZlcmJvc2U9LS1zaWxlbnQKLQk7OwotICAtLXZlcmJvc2UgfCAtLXYgfCAtLXZlcmIqKQotCW1sX3ZlcmJvc2U9LS12ZXJib3NlCi0JOzsKLSAgLS13aXRoLSopCi0JY2FzZSAiJG9wdGlvbiIgaW4KLQkqPSopCTs7Ci0JKikJb3B0YXJnPXllcyA7OwotCWVzYWMKLQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQlldmFsICR3aXRob3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0td2l0aG91dC0qKQotCXdpdGhvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6b3V0Ojo7czotOl86ZydgCi0JZXZhbCAkd2l0aG9wdD1ubwotCTs7Ci0gIGVzYWMKLWRvbmUKLQotIyBPbmx5IGRvIHRoaXMgaWYgLS1lbmFibGUtbXVsdGlsaWIuCi1pZiBbICIke2VuYWJsZV9tdWx0aWxpYn0iID0geWVzIF07IHRoZW4KLQotIyBDb21wdXRlIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnkKLSMgKGllOiBub3QgYSBtdWx0aWxpYiBzdWJkaXJlY3RvcnksIGFuZCBub3QgYSBzdWJkaXJlY3RvcnkgbGlrZSBsaWJnKysvc3JjKS4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSB0ZWxscyB1cyB3ZSdyZSBpbiB0aGUgcmlnaHQgYnJhbmNoLCBidXQgd2UgY291bGQgYmUKLSMgaW4gYSBzdWJkaXIgb2YgdGhhdC4KLSMgPz8/IFRoZSBwcmV2aW91cyB2ZXJzaW9uIGNvdWxkIHZvaWQgdGhpcyB0ZXN0IGJ5IHNlcGFyYXRpbmcgdGhlIHByb2Nlc3MgaW50bwotIyB0d28gZmlsZXM6IG9uZSB0aGF0IG9ubHkgdGhlIGxpYnJhcnkncyB0b3BsZXZlbCBjb25maWd1cmUuaW4gcmFuICh0bwotIyBjb25maWd1cmUgdGhlIG11bHRpbGliIHN1YmRpcnMpLCBhbmQgYW5vdGhlciB0aGF0IGFsbCBjb25maWd1cmUuaW4ncyByYW4gdG8KLSMgdXBkYXRlIHRoZSBNYWtlZmlsZS4gIEl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGNvbGxhcHNlIGFsbCBtdWx0aWxpYiBzdXBwb3J0Ci0jIGludG8gb25lIGZpbGUsIGJ1dCBpdCBkb2VzIGxlYXZlIHVzIHdpdGggaGF2aW5nIHRvIHBlcmZvcm0gdGhpcyB0ZXN0LgotbWxfdG9wbGV2ZWxfcD1ubwotaWYgWyAteiAiJHt3aXRoX211bHRpc3ViZGlyfSIgXTsgdGhlbgotICBpZiBbICIke3NyY2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICAjIFVzZSAke21sX3JlYWxzcmNkaXJ9IGluc3RlYWQgb2YgJHtzcmNkaXJ9IGhlcmUgdG8gYWNjb3VudCBmb3IgJHtzdWJkaXJ9LgotICAgICMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG90aGVyd2lzZSB0YXJnZXQgYWxpYXMuCi0gICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLSAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLSAgICAgIG1sX3RvcGxldmVsX3A9eWVzCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgSWYgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnksIHNldCBtdWx0aWRpcnMgdG8gdGhlCi0jIG11bHRpbGliIHN1YmRpcnMgdG8gc3VwcG9ydC4gIFRoaXMgbGl2ZXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIG5lZWQKLSMgYG11bHRpZGlycycgc2V0IHJpZ2h0IGF3YXkuCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLQotbXVsdGlkaXJzPQotZm9yIGkgaW4gYCR7Q0MtZ2NjfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvCi0gIGRpcj1gZWNobyAkaSB8IHNlZCAtZSAncy87LiokLy8nYAotICBpZiBbICIke2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICB0cnVlCi0gIGVsc2UKLSAgICBpZiBbIC16ICIke211bHRpZGlyc30iIF07IHRoZW4KLSAgICAgIG11bHRpZGlycz0iJHtkaXJ9IgotICAgIGVsc2UKLSAgICAgIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7ZGlyfSIKLSAgICBmaQotICBmaQotZG9uZQotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBob3N0IHRoZXkgcnVuIG9uLCBzbyB3ZSBjaGVjawotIyAkaG9zdCBoZXJlLCBub3QgJHRhcmdldC4KLQotY2FzZSAiJHtob3N0fSIgaW4KLWFyYy0qLWVsZiopCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiAhPSB4eWVzIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpiZSopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotYXJtLSotKikKLQlpZiBbIHgiJGVuYWJsZV9mcHUiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpmcHUqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfMjZiaXQiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICoyNmJpdCopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV91bmRlcnNjb3JlIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqdW5kZXIqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfaW50ZXJ3b3JrIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqaW50ZXJ3b3JrKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKmxlKiApIDogOzsKLQkgICAgICAqYmUqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1tNjgqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjg4ODEgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODg4MSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMDAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAwMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMjAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAyMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLW1pcHMqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NpbmdsZV9mbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc2luZ2xlKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICplbCogKSA6IDs7Ci0JICAgICAgKmViKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLXBvd2VycGMqLSotKiB8IHJzNjAwMCotKi0qKQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VyY3B1ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgIHBvd2VyIHwgKi9wb3dlciB8ICovcG93ZXIvKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VycGNjcHUgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnBvd2VycGMqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJwY29zID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1saW51eCogfCAqbWNhbGwtc29sYXJpcyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWxpdHRsZSogfCAqbWJpZyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9zeXN2ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1zeXN2KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2FpeCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtYWl4KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotZXNhYwotCi0jIFJlbW92ZSBleHRyYW5lb3VzIGJsYW5rcyBmcm9tIG11bHRpZGlycy4KLSMgVGVzdHMgbGlrZSBgaWYgWyAtbiAiJG11bHRpZGlycyIgXScgcmVxdWlyZSBpdC4KLW11bHRpZGlycz1gZWNobyAiJG11bHRpZGlycyIgfCBzZWQgLWUgJ3MvXlsgXVsgXSovLycgLWUgJ3MvWyBdWyBdKiQvLycgLWUgJ3MvWyBdWyBdKi8gL2cnYAotCi0jIEFkZCBjb2RlIHRvIGxpYnJhcnkncyB0b3AgbGV2ZWwgbWFrZWZpbGUgdG8gaGFuZGxlIGJ1aWxkaW5nIHRoZSBtdWx0aWxpYgotIyBzdWJkaXJzLgotCi1jYXQgPiBNdWx0aS50ZW0gPDxcRU9GCi0KLSMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCi0jIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgotbXVsdGktZG86Ci0JaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIHJvb3RwcmU9YHB3ZGAvOyBleHBvcnQgcm9vdHByZTsgXAotCSAgc3Jjcm9vdHByZT1gY2QgJChzcmNkaXIpOyBwd2RgLzsgZXhwb3J0IHNyY3Jvb3RwcmU7IFwKLQkgIGxpYj1gZWNobyAkJHtyb290cHJlfSB8IHNlZCAtZSAncyxeLiovXChbXi9dW14vXSpcKS8kJCxcMSwnYDsgXAotCSAgY29tcGlsZXI9IiQoQ0MpIjsgXAotCSAgZm9yIGkgaW4gYCQke2NvbXBpbGVyfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvIFwKLQkgICAgZGlyPWBlY2hvICQkaSB8IHNlZCAtZSAncy87LiokJC8vJ2A7IFwKLQkgICAgaWYgWyAiJCR7ZGlyfSIgPSAiLiIgXTsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBpZiBbIC1kIC4uLyQke2Rpcn0vJCR7bGlifSBdOyB0aGVuIFwKLQkJZmxhZ3M9YGVjaG8gJCRpIHwgc2VkIC1lICdzL15bXjtdKjsvLycgLWUgJ3MvQC8gLS9nJ2A7IFwKLQkJaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIFwKLQkJCQlDRkxBR1M9IiQoQ0ZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlDWFhGTEFHUz0iJChDWFhGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ0ZMQUdTPSIkKExJQkNGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ1hYRkxBR1M9IiQoTElCQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxERkxBR1M9IiQoTERGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJJChETykpOyB0aGVuIFwKLQkJICB0cnVlOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgdHJ1ZTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotIyBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIGFuIEAtc2lnbiBpbiBmcm9udCBvZiB0aGUgYGlmJy4KLSMgTGVhdmUgb3V0IHVudGlsIHRoaXMgaXMgdGVzdGVkIGEgYml0IG1vcmUuCi1tdWx0aS1jbGVhbjoKLQlpZiBbIC16ICIkKE1VTFRJRElSUykiIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbGliPWBwd2QgfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkkJCxcMSwnYDsgXAotCSAgZm9yIGRpciBpbiBNYWtlZmlsZSAkKE1VTFRJRElSUyk7IGRvIFwKLQkgICAgaWYgWyAtZiAuLi8kJHtkaXJ9LyQke2xpYn0vTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgICAgaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoRE8pKTsgXAotCSAgICAgIHRoZW4gdHJ1ZTsgXAotCSAgICAgIGVsc2UgZXhpdCAxOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLUVPRgotCi1jYXQgJHtNYWtlZmlsZX0gTXVsdGkudGVtID4gTWFrZWZpbGUudGVtCi1ybSAtZiAke01ha2VmaWxlfSBNdWx0aS50ZW0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLQotaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICBlY2hvICJBZGRpbmcgbXVsdGlsaWIgc3VwcG9ydCB0byBNYWtlZmlsZSBpbiAke21sX3JlYWxzcmNkaXJ9IgotICBpZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gICAgZWNobyAibXVsdGlkaXJzPSR7bXVsdGlkaXJzfSIKLSAgZmkKLSAgZWNobyAid2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9IgotZmkKLQotaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLSAgICBtbF9zcmNkb3Rkb3Q9Ii4uLyIKLSAgZWxzZQotICAgIG1sX3NyY2RvdGRvdD0iIgotICBmaQotZWxzZQotICBtbF9zcmNkb3Rkb3Q9IiIKLWZpCi0KLWlmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KLSAgbWxfc3ViZGlyPQotICBtbF9idWlsZGRvdGRvdD0KLSAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAotZWxzZQotICBtbF9zdWJkaXI9Ii8ke3dpdGhfbXVsdGlzdWJkaXJ9IgotICAjIFRoZSAnW14vXVteL10qJyBhcHBlYXJzIHRoYXQgd2F5IHRvIHdvcmsgYXJvdW5kIGEgU3VuT1Mgc2VkIGJ1Zy4KLSAgbWxfYnVpbGRkb3Rkb3Q9YGVjaG8gJHt3aXRoX211bHRpc3ViZGlyfSB8IHNlZCAtZSAnczpbXi9dW14vXSo6Li46ZydgLwotICBpZiBbICIkc3JjZGlyIiA9ICIuIiBdOyB0aGVuCi0gICAgbWxfc3JjZG90ZG90PSR7bWxfc3JjZG90ZG90fSR7bWxfYnVpbGRkb3Rkb3R9Ci0gIGVsc2UKLSAgICA6ICMgbWxfc3JjZG90ZG90PSAjIGFscmVhZHkgc2V0Ci0gIGZpCi1maQotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gIG1sX2RvPSckKE1BS0UpJwotICBtbF9jbGVhbj0nJChNQUtFKScKLWVsc2UKLSAgbWxfZG89dHJ1ZQotICBtbF9jbGVhbj10cnVlCi1maQotCi0jIFRPUCBpcyB1c2VkIGJ5IG5ld2xpYiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZSBmb3IgdGhpcyBwdXJwb3NlLgotIyBNVUxUSXtTUkMsQlVJTER9VE9QIGFyZSB0aGUgcHJvcGVyIG9uZXMgdG8gdXNlLiAgTVVMVElTUkNUT1AgaXMgZW1wdHkKLSMgd2hlbiBzcmNkaXIgIT0gYnVpbGRkaXIuICBNVUxUSUJVSUxEVE9QIGlzIGFsd2F5cyBzb21lIG51bWJlciBvZiAuLi8ncy4KLSMgRklYTUU6IG5ld2xpYiBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHVzZSBNVUxUSXtTUkMsQlVJTER9VE9QIHNvIHdlIGNhbgotIyBkZWxldGUgVE9QLiAgTmV3bGliIG1heSB3aXNoIHRvIGNvbnRpbnVlIHRvIHVzZSBUT1AgZm9yIGl0cyBvd24gcHVycG9zZXMKLSMgb2YgY291cnNlLgotIyBNVUxUSURJUlMgaXMgbm9uLWVtcHR5IGZvciB0aGUgY3B1IHRvcCBsZXZlbCBNYWtlZmlsZSAoZWc6IG5ld2xpYi9NYWtlZmlsZSkKLSMgYW5kIGxpc3RzIHRoZSBzdWJkaXJlY3RvcmllcyB0byByZWN1cnNlIGludG8uCi0jIE1VTFRJU1VCRElSIGlzIG5vbi1lbXB0eSBpbiBlYWNoIGNwdSBzdWJkaXJlY3RvcnkncyBNYWtlZmlsZQotIyAoZWc6IG5ld2xpYi9oODMwMGgvTWFrZWZpbGUpIGFuZCBpcyB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGgKLSMgYSBsZWFkaW5nICcvJy4KLSMgTVVMVElETyBpcyB1c2VkIGZvciB0YXJnZXRzIGxpa2UgYWxsLCBpbnN0YWxsLCBhbmQgY2hlY2sgd2hlcmUKLSMgJChGTEFHU19UT19QQVNTKSBhdWdtZW50ZWQgd2l0aCB0aGUgc3ViZGlyJ3MgY29tcGlsZXIgb3B0aW9uIGlzIG5lZWRlZC4KLSMgTVVMVElDTEVBTiBpcyB1c2VkIGZvciB0aGUgKmNsZWFuIHRhcmdldHMuCi0jCi0jID8/PyBJdCBpcyBwb3NzaWJsZSB0byBtZXJnZSBNVUxUSURPIGFuZCBNVUxUSUNMRUFOIGludG8gb25lLiAgVGhleSBhcmUKLSMgY3VycmVudGx5IGtlcHQgc2VwYXJhdGUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSAqY2xlYW4gdGFyZ2V0cyB0byByZXF1aXJlCi0jIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNvbXBpbGVyICh3aGljaCBNVUxUSURPIGN1cnJlbnRseSByZXF1aXJlcykgYW5kCi0jIHRoZXJlZm9yZSB3ZSdkIGhhdmUgdG8gcmVjb3JkIHRoZSBkaXJlY3Rvcnkgb3B0aW9ucyBhcyB3ZWxsIGFzIG5hbWVzCi0jIChjdXJyZW50bHkgd2UganVzdCByZWNvcmQgdGhlIG5hbWVzIGFuZCB1c2UgLS1wcmludC1tdWx0aS1saWIgdG8gZ2V0IHRoZQotIyBvcHRpb25zKS4KLQotc2VkIC1lICJzOl5UT1BbIAldKj1bIAldKlwoWy4vXSpcKVsgCV0qJDpUT1AgPSAke21sX2J1aWxkZG90ZG90fVwxOiIgXAotICAgIC1lICJzOl5NVUxUSVNSQ1RPUFsgCV0qPS4qJDpNVUxUSVNSQ1RPUCA9ICR7bWxfc3JjZG90ZG90fToiIFwKLSAgICAtZSAiczpeTVVMVElCVUlMRFRPUFsgCV0qPS4qJDpNVUxUSUJVSUxEVE9QID0gJHttbF9idWlsZGRvdGRvdH06IiBcCi0gICAgLWUgInM6Xk1VTFRJRElSU1sgCV0qPS4qJDpNVUxUSURJUlMgPSAke211bHRpZGlyc306IiBcCi0gICAgLWUgInM6Xk1VTFRJU1VCRElSWyAJXSo9LiokOk1VTFRJU1VCRElSID0gJHttbF9zdWJkaXJ9OiIgXAotICAgIC1lICJzOl5NVUxUSURPWyAJXSo9LiokOk1VTFRJRE8gPSAkbWxfZG86IiBcCi0gICAgLWUgInM6Xk1VTFRJQ0xFQU5bIAldKj0uKiQ6TVVMVElDTEVBTiA9ICRtbF9jbGVhbjoiIFwKLQkke01ha2VmaWxlfSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgJHtNYWtlZmlsZX0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi0jIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwsIGNvbmZpZ3VyZSBlYWNoIG11bHRpbGliIHN1YmRpci4KLSMgVGhpcyBpcyBkb25lIGF0IHRoZSBlbmQgYmVjYXVzZSB0aGlzIGlzIHRoZSBsb29wIHRoYXQgcnVucyBjb25maWd1cmUKLSMgaW4gZWFjaCBtdWx0aWxpYiBzdWJkaXIgYW5kIGl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGZpbmlzaCB1cGRhdGluZyB0aGUKLSMgTWFrZWZpbGUgYmVmb3JlIGdvaW5nIG9uIHRvIGNvbmZpZ3VyZSB0aGUgc3ViZGlycy4KLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotCi0jIFdlIG11c3QgZnJlc2hseSBjb25maWd1cmUgZWFjaCBzdWJkaXJlY3RvcnkuICBUaGlzIGJpdCBvZiBjb2RlIGlzCi0jIGFjdHVhbGx5IHBhcnRpYWxseSBzdG9sZW4gZnJvbSB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LiAgRklYTUUuCi0KLWlmIFsgLW4gIiR7bXVsdGlkaXJzfSIgXSAmJiBbIC16ICIke21sX25vcmVjdXJzaW9ufSIgXTsgdGhlbgotCi0gIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXJzICR7bXVsdGlkaXJzfSIKLSAgICBlY2hvICJwd2Q6IGBwd2RgIgotICBmaQotCi0gIG1sX29yaWdkaXI9YHB3ZGAKLSAgbWxfbGliZGlyPWBlY2hvICRtbF9vcmlnZGlyIHwgc2VkIC1lICdzLF4uKi8sLCdgCi0gICMgY2QgdG8gdG9wLWxldmVsLWJ1aWxkLWRpci8ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLSAgY2QgLi4KLQotICBmb3IgbWxfZGlyIGluICR7bXVsdGlkaXJzfTsgZG8KLQotICAgIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlIGluIG11bHRpbGliIHN1YmRpciAke21sX2Rpcn0iCi0gICAgICBlY2hvICJwd2Q6IGBwd2RgIgotICAgIGZpCi0KLSAgICBpZiBbIC1kICR7bWxfZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9OyBmaQotICAgIGlmIFsgLWQgJHttbF9kaXJ9LyR7bWxfbGliZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgZmkKLQotICAgICMgRWc6IGlmICR7bWxfZGlyfSA9IG02ODAwMC9tNjg4ODEsIGRvdGRvdCA9IC4uLy4uLwotICAgIGRvdGRvdD0uLi9gZWNobyAke21sX2Rpcn0gfCBzZWQgLWUgJ3N8W14vXXx8ZycgLWUgJ3N8L3wuLi98ZydgCi0KLSAgICBjYXNlICR7c3JjZGlyfSBpbgotICAgICIuIikKLSAgICAgIGVjaG8gQnVpbGRpbmcgc3ltbGluayB0cmVlIGluIGBwd2RgLyR7bWxfZGlyfS8ke21sX2xpYmRpcn0KLSAgICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLQltbF91bnN1YmRpcj0iLi4vIgotICAgICAgZWxzZQotCW1sX3Vuc3ViZGlyPSIiCi0gICAgICBmaQotICAgICAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07Ci0gICAgICAgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn1zeW1saW5rLXRyZWUgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn0ke21sX2xpYmRpcn0gIiIpCi0gICAgICBpZiBbIC1mICR7bWxfZGlyfS8ke21sX2xpYmRpcn0vTWFrZWZpbGUgXTsgdGhlbgotCWlmIFsgeCIke01BS0V9IiA9IHggXTsgdGhlbgotCSAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IG1ha2UgZGlzdGNsZWFuKQotCWVsc2UKLQkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyAke01BS0V9IGRpc3RjbGVhbikKLQlmaQotICAgICAgZmkKLSAgICAgIG1sX25ld3NyY2Rpcj0iLiIKLSAgICAgIG1sX3NyY2Rpcm9wdGlvbj0KLSAgICAgIG11bHRpc3JjdG9wPSR7ZG90ZG90fQotICAgICAgOzsKLSAgICAqKQotICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICBtbF9uZXdzcmNkaXI9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICBtbF9uZXdzcmNkaXI9JHtkb3Rkb3R9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBtbF9zcmNkaXJvcHRpb249Ii1zcmNkaXI9JHttbF9uZXdzcmNkaXJ9IgotICAgICAgbXVsdGlzcmN0b3A9Ci0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgIC8qKSAgICAgbWxfcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICopICAgICAgbWxfcmVjcHJvZz0ke2RvdGRvdH0ke3Byb2duYW1lfSA7OwotICAgIGVzYWMKLQotICAgICMgRklYTUU6IFBPUERJUj0ke1BXRD1gcHdkYH0gZG9lc24ndCB3b3JrIGhlcmUuCi0gICAgTUxfUE9QRElSPWBwd2RgCi0gICAgY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfQotCi0gICAgaWYgWyAtZiAke21sX25ld3NyY2Rpcn0vY29uZmlndXJlIF07IHRoZW4KLSAgICAgIG1sX3JlY3Byb2c9JHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZQotICAgIGZpCi0gICAgaWYgZXZhbCAke21sX2NvbmZpZ19zaGVsbH0gJHttbF9yZWNwcm9nfSBcCi0JLS13aXRoLW11bHRpc3ViZGlyPSR7bWxfZGlyfSAtLXdpdGgtbXVsdGlzcmN0b3A9JHttdWx0aXNyY3RvcH0gXAotCSR7bWxfYXJndW1lbnRzfSAke21sX3NyY2Rpcm9wdGlvbn0gOyB0aGVuCi0gICAgICB0cnVlCi0gICAgZWxzZQotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGNkICR7TUxfUE9QRElSfQotCi0gIGRvbmUKLQotICBjZCAke21sX29yaWdkaXJ9Ci1maQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLWZpICMgJHtlbmFibGVfbXVsdGlsaWJ9ID0geWVzCmRpZmYgLS1naXQgYS9jb25maWcuZ3Vlc3MgYi9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0ZmFhZWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmd1ZXNzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MCArMCwwIEBACi0jISAvYmluL3NoCi0jIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwCi0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXZlcnNpb249JzIwMDAtMDUtMzAnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LgotIwotIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCi0jIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAotIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KLSMKLSMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgotIwotIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKLSMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KLSMKLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0KLQotT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhpcyBzeXN0ZW0uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0IgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICIkMSIgaW4KLSAgICAtLXZlcnNpb24gfCAtLXZlcnMqIHwgLVYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGV4ZWMgPiYyCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSIKLSAgICAgICBlY2hvICIkaGVscCIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi0jIFVzZSAkSE9TVF9DQyBpZiBkZWZpbmVkLiAkQ0MgbWF5IHBvaW50IHRvIGEgY3Jvc3MtY29tcGlsZXIKLWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHg7IHRoZW4KLSAgaWYgdGVzdCB4IiRIT1NUX0NDIiAhPSB4OyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSIkSE9TVF9DQyIKLSAgZWxzZQotICAgIGlmIHRlc3QgeCIkQ0MiICE9IHg7IHRoZW4KLSAgICAgIENDX0ZPUl9CVUlMRD0iJENDIgotICAgIGVsc2UKLSAgICAgIENDX0ZPUl9CVUlMRD1jYwotICAgIGZpCi0gIGZpCi1maQotCi0KLSMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCi0jIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgOC8yNC85NC4pCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KLVVOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgotCi1kdW1teT1kdW1teS0kJAotdHJhcCAncm0gLWYgJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15OyBleGl0IDEnIDEgMiAxNQotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICAqOk5ldEJTRDoqOiopCi0JIyBOZXRic2QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKLQkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCi0JIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKLQkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCi0JIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuCi0JIyBEZXRlcm1pbmUgdGhlIG1hY2hpbmUvdmVuZG9yIChpcyB0aGUgdmVuZG9yIHJlbGV2YW50KS4KLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICBhbWlnYSkgbWFjaGluZT1tNjhrLWNibSA7OwotCSAgICBhcm0zMikgbWFjaGluZT1hcm0tdW5rbm93biA7OwotCSAgICBhdGFyaSopIG1hY2hpbmU9bTY4ay1hdGFyaSA7OwotCSAgICBzdW4zKikgbWFjaGluZT1tNjhrLXN1biA7OwotCSAgICBtYWM2OGspIG1hY2hpbmU9bTY4ay1hcHBsZSA7OwotCSAgICBtYWNwcGMpIG1hY2hpbmU9cG93ZXJwYy1hcHBsZSA7OwotCSAgICBocDNbMC05XVswNV0pIG1hY2hpbmU9bTY4ay1ocCA7OwotCSAgICBpYm1ydHxyb21wLWlibSkgbWFjaGluZT1yb21wLWlibSA7OwotCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORX0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LgotCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQl0aGVuCi0JICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KLQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JICAgIG9zPW5ldGJzZAotCWVsc2UKLQkgICAgb3M9bmV0YnNkZWxmCi0JZmkKLQkjIFRoZSBPUyByZWxlYXNlCi0JcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKLQkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKLQkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCi0JZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCi0JZXhpdCAwIDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgotCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQljYXQgPDxFT0YgPiRkdW1teS5zCi0JLmRhdGEKLVwkTGZvcm1hdDoKLQkuYnl0ZSAzNywxMDAsNDUsMzcsMTIwLDEwLDAJIyAiJWQtJXhcbiIKLQotCS50ZXh0Ci0JLmdsb2JsIG1haW4KLQkuYWxpZ24gNAotCS5lbnQgbWFpbgotbWFpbjoKLQkuZnJhbWUgXCQzMCwxNixcJDI2LDAKLQlsZGdwIFwkMjksMChcJDI3KQotCS5wcm9sb2d1ZSAxCi0JLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgXCQwCi0JbGRhIFwkMiwtMQotCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayBcJDIsXCQxCi0JbGRhIFwkMTYsXCRMZm9ybWF0Ci0JbW92IFwkMCxcJDE3Ci0Jbm90IFwkMSxcJDE4Ci0JanNyIFwkMjYscHJpbnRmCi0JbGRncCBcJDI5LDAoXCQyNikKLQltb3YgMCxcJDE2Ci0JanNyIFwkMjYsZXhpdAotCS5lbmQgbWFpbgotRU9GCi0JJENDX0ZPUl9CVUlMRCAkZHVtbXkucyAtbyAkZHVtbXkgMj4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQljYXNlIGAuLyRkdW1teWAgaW4KLQkJCTAtMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMS0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxLTEpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxLTEwMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkyLTMwMykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQkJMi0zMDcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IgotCQkJCTs7Ci0JCWVzYWMKLQlmaQotCXJtIC1mICRkdW1teS5zICRkdW1teQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0JZXhpdCAwIDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7Ci0gICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCi0JZWNobyBtNjhrLWNibS1zeXN2NAotCWV4aXQgMDs7Ci0gICAgYW1pZ2E6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDAgOzsKLSAgICBhcmM2NDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhrbWlwczpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgMDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQotICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAotICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKLSAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCi0gICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKLSAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAotICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAotICAgICMgYmUgbm8gcHJvYmxlbS4KLSAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLwotCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0jZWxzZQotCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7Ci0jZW5kaWYKLQkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2VuZGlmCi0JICBleGl0ICgtMSk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAkZHVtbXkuYyAtbyAkZHVtbXkgXAotCSAgJiYgLi8kZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAotCSAgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KLQl0aGVuCi0JICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAotCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQotCSAgICB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCSAgICBlbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCSAgICBmaQotCWVsc2UKLQkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaT84NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi0JCXJtIC1mICRkdW1teS5jICRkdW1teQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKLQllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKLQllbHNlCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKLQlmaQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6NCkKLQlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IGhlYWQgLTEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRUhsICR7SUJNX0NQVV9JRH0gfCBncmVwIFBPV0VSID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj00LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLSAgICAgICAgICAgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCi0KLSAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgotICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSAgICAgICAgICAgICAgaW50IG1haW4gKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQotICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCi0gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKLSAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQl9IGJyZWFrOwotICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLwotICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgICAgIH0KLUVPRgotCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsICkgJiYgSFBfQVJDSD1gLi8kZHVtbXlgCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZXNhYwotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOT8/KjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaT84NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIGhwcGEqOk9wZW5CU0Q6KjoqKQotCWVjaG8gaHBwYS11bmtub3duLW9wZW5ic2QKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpYLU1QOio6KjoqKQotCWVjaG8geG1wLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZLTI6KjoqOiopCi0JZWNobyBjcmF5Mi1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gImYzMDAtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAxOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgIGVjaG8gZjMwMS1mdWppdHN1LXV4cHZgZWNobyAkVU5BTUVfUkVMRUFTRSB8IHNlZCAncy8gLiovLydgCi0gICAgICAgZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgaT84NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KLQllY2hvIGkzODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OwotICAgICo6TGludXg6KjoqKQotCi0JIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KLQkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50Ci0JIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgotCWxkX2hlbHBfc3RyaW5nPWBjZCAvOyBsZCAtLWhlbHAgMj4mMWAKLQlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF9lbXVsYXRpb25zIiBpbgotCSAgKmlhNjQpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBpPzg2bGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBlbGZfaT84NikKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBpPzg2Y29mZikKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIgotCQlleGl0IDAKLQkJOzsKLQkgIHNwYXJjbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IgotCQlleGl0IDAKLQkJOzsKLQkgIGFybWxpbnV4KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBlbGYzMmFybSopCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBhcm1lbGZfbGludXgqKQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251IgotCQlleGl0IDAKLQkJOzsKLQkgIG02OGtsaW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiCi0JCWV4aXQgMAotCQk7OwotCSAgZWxmMzJwcGMgfCBlbGYzMnBwY2xpbnV4KQotCQkjIERldGVybWluZSBMaWIgVmVyc2lvbgotCQljYXQgPiRkdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLWV4dGVybiBjaGFyIF9fbGliY192ZXJzaW9uW107Ci1leHRlcm4gY2hhciBfX2xpYmNfcmVsZWFzZVtdOwotI2VuZGlmCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pCi0gIHByaW50ZigiJXMgJXNcbiIsIF9fbGliY192ZXJzaW9uLCBfX2xpYmNfcmVsZWFzZSk7Ci0jZWxzZQotICBwcmludGYoInVua293blxuIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkJTElCQz0iIgotCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJLi8kZHVtbXkgfCBncmVwIDFcLjk5ID4gL2Rldi9udWxsCi0JCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJCUxJQkM9ImxpYmMxIgotCQkJZmkKLQkJZmkKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQkJZXhpdCAwCi0JCTs7Ci0JICBzaGVsZl9saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSIKLQkJZXhpdCAwCi0JCTs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgotCQljYXQgPDxFT0YgPiRkdW1teS5zCi0JCQkuZGF0YQotCQlcJExmb3JtYXQ6Ci0JCQkuYnl0ZSAzNywxMDAsNDUsMzcsMTIwLDEwLDAJIyAiJWQtJXhcbiIKLQotCQkJLnRleHQKLQkJCS5nbG9ibCBtYWluCi0JCQkuYWxpZ24gNAotCQkJLmVudCBtYWluCi0JCW1haW46Ci0JCQkuZnJhbWUgXCQzMCwxNixcJDI2LDAKLQkJCWxkZ3AgXCQyOSwwKFwkMjcpCi0JCQkucHJvbG9ndWUgMQotCQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgXCQwCi0JCQlsZGEgXCQyLC0xCi0JCQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCQkJbGRhIFwkMTYsXCRMZm9ybWF0Ci0JCQltb3YgXCQwLFwkMTcKLQkJCW5vdCBcJDEsXCQxOAotCQkJanNyIFwkMjYscHJpbnRmCi0JCQlsZGdwIFwkMjksMChcJDI2KQotCQkJbW92IDAsXCQxNgotCQkJanNyIFwkMjYsZXhpdAotCQkJLmVuZCBtYWluCi1FT0YKLQkJTElCQz0iIgotCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJY2FzZSBgLi8kZHVtbXlgIGluCi0JCQkwLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTEtMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMS0xKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMS0xMDEpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMi0zMDMpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJCTItMzA3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIKLQkJCQk7OwotCQkJZXNhYwotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzICRkdW1teSB8IFwKLQkJCSAgZ3JlcCBsZC5zby4xID4gL2Rldi9udWxsCi0JCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJCUxJQkM9ImxpYmMxIgotCQkJZmkKLQkJZmkKLQkJcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID4kZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJzMzkwIjsgdGhlbgotCSAgZWNobyBzMzkwLWlibS1saW51eCAmJiBleGl0IDAKLQllbHNlCi0JICAjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkKLQkgICMgb3Igb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCSAgIyBHQ0Mgd2FudHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBsaW51eC1nbnVvbGRsZCBhbmQgbGludXgtZ251YW91dC4KLQkgICMgSWYgbGQgZG9lcyBub3QgcHJvdmlkZSAqYW55KiAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgIyB0aGF0IG1lYW5zIGl0IGlzIGdudW9sZGxkLgotCSAgZWNobyAiJGxkX2hlbHBfc3RyaW5nIiB8IGdyZXAgPi9kZXYvbnVsbCAyPiYxICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICB0ZXN0ICQ/ICE9IDAgJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIgJiYgZXhpdCAwCi0KLQkgIGNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICBpPzg2KQotCSAgICBWRU5ET1I9cGM7Ci0JICAgIDs7Ci0JICAqKQotCSAgICBWRU5ET1I9dW5rbm93bjsKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JICBjYXQgPiRkdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCi0JaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSNlbHNlCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKLSNlbmRpZgotI2lmZGVmIF9fRUxGX18KLSMgaWZkZWYgX19HTElCQ19fCi0jICBpZiBfX0dMSUJDX18gPj0gMgotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotIyAgZWxzZQotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyBlbmRpZgotI2Vsc2UKLSAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWFvdXRcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZmkgOzsKLSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuICBlYXJsaWVyIHZlcnNpb25zCi0jIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aCBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLSAgICBpPzg2OkRZTklYL3B0eDo0KjoqKQotCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjQuKjoqIHwgaT84NjpTWVNURU1fVjo0Lio6KikKLQlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjU6NyopCi0gICAgICAgICMgRml4ZWQgYXQgKGFueSkgUGVudGl1bSBvciBiZXR0ZXIKLSAgICAgICAgVU5BTUVfTUFDSElORT1pNTg2Ci0gICAgICAgIGlmIFsgJHtVTkFNRV9TWVNURU19ID0gIlVuaXhXYXJlIiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tc2NvLXN5c3Yke1VOQU1FX1JFTEVBU0V9dXcke1VOQU1FX1ZFUlNJT059Ci0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpPzg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6THlueE9TOjIuKjoqIHwgaT84NjpMeW54T1M6My5bMDFdKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzoqOjYqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWVjaG8gYHVuYW1lIC1wYC1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAieDg2cGMiOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9cGMKLQlmaQotCWVjaG8gYHVuYW1lIC1wYC0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngKLQlleGl0IDAgOzsKLSAgICAqOlFOWDoqOjQqKQotCWVjaG8gaTM4Ni1wYy1xbngKLQlleGl0IDAgOzsKLSAgICBOU1ItVzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBCUzIwMDA6UE9TSVgqOio6KikKLQllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKLQlleGl0IDAgOzsKLSAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotY2F0ID4kZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9TRVFVRU5UXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNlbmRpZgotbWFpbiAoKQotewotI2lmIGRlZmluZWQgKHNvbnkpCi0jaWYgZGVmaW5lZCAoTUlQU0VCKQotICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAotICAgICBJIGRvbid0IGtub3cuLi4uICAqLwotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCi0jaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgotI2Vsc2UKLQkgICIiCi0jZW5kaWYKLSAgICAgICAgICk7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBpZiAodmVyc2lvbiA8IDQpCi0gICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotI2lmICFkZWZpbmVkICh1bHRyaXgpCi0gIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsICYmIC4vJGR1bW15ICYmIHJtICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLXJtIC1mICRkdW1teS5jICRkdW1teQotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBlc2FjCi1maQotCi1jYXQgPiYyIDw8RU9GCi0kMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCi0KLVRoZSAkdmVyc2lvbiB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGNhbm5vdCByZWNvZ25pemUgeW91ciBzeXN0ZW0gdHlwZS4KLVBsZWFzZSBkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzOgotCi0gICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9jb25maWcvCi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB2ZXJzaW9uID0gJHZlcnNpb24KLQotdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0KLS91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCi0KLWhvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKLQotVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KLVVOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9Ci1VTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19Ci1VTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQotRU9GCi0KLWV4aXQgMQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidmVyc2lvbj0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnLmlmIGIvY29uZmlnLmlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwMjY5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5pZgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMhIC9kZXYvbnVsbAotIyBEb24ndCBjYWxsIGl0IGRpcmVjdGx5LiBUaGlzIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBpcyBjYWxsZWQgdG8KLSMgZGV0ZXJtaW5lOgotIwotIwkxLiBsaWJzdGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGlic3RkYysrLgotIwkyLiBjeHhfaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIGMrKy4KLSMJMy4gbGliY19pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGliYy4KLSMKLQotIyBHZXQgdGhlIHRvcCBsZXZlbCBzcmMgZGlyLgotaWYgWyAteiAiJHt0b3BzcmNkaXJ9IiAtYSAteiAiJHt0b3Bfc3JjZGlyfSIgXQotdGhlbgotICBlY2hvICJVbmRlZmluZWQgdG9wIGxldmVsIHNyYyBkaXI6IHRvcHNyY2RpciBhbmQgdG9wX3NyY2RpciBhcmUgZW1wdHkiID4mMgotICBleGl0IDEKLWZpCi0KLWlmIFsgLW4gIiR7dG9wc3JjZGlyfSIgXQotdGhlbgotICBpZl90b3BzcmNkaXI9JHt0b3BzcmNkaXJ9Ci1lbHNlCi0gIGlmX3RvcHNyY2Rpcj0ke3RvcF9zcmNkaXJ9Ci1maQotCi1pZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gXTsgdGhlbgotIyBXZSBjaGVjayBsaWJzdGRjKysgZm9yIGxpYnN0ZGN4eF9pbnRlcmZhY2UuCi1saWJzdGRjeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vbGlic3RkYysrL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCi1lbHNlCi1saWJzdGRjeHhfaW50ZXJmYWNlPQotZmkKLQotaWYgWyAtZiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIF07IHRoZW4KLSMgV2UgY2hlY2sgZ2NjL2NwIGZvciBjeHhfaW50ZXJmYWNlLgotY3h4X2ludGVyZmFjZT1gZ3JlcCAiXklOVEVSRkFDRSIgJHtpZl90b3BzcmNkaXJ9L2djYy9jcC9NYWtlZmlsZS5pbiB8IHNlZCAncy9JTlRFUkZBQ0VbIAldKj1bIAldKlwoLipcKS9cMS8nYAotZWxzZQotY3h4X2ludGVyZmFjZT0KLWZpCi0KLSMgVGhlIHRyaWNraWVzdCBwYXJ0IGlzIGxpYmNfaW50ZXJmYWNlLgotaWYgWyAteiAiJHtsaWJjX2ludGVyZmFjZX0iIF0KLXRoZW4KLSAgY2FzZSAke3RhcmdldF9vc30gaW4KLSAgKmxpbnV4KmxpYmMxKnwqbGludXgqbGliYzUqKQotICAgIGNhc2UgJHt0YXJnZXRfYWxpYXN9IGluCi0gICAgKmFscGhhKnwqcG93ZXJwYyopCi0gICAgICBsaWJjX2ludGVyZmFjZT0tbGliYzUuOS0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS0KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gICpsaW51eCpnbnUqKQotICAgICMgV2UgaGF2ZSB0byB3b3JrIGhhcmRlciB0byBmaWd1cmUgaXQgb3V0LgotICAgIGlmIFsgJHt0YXJnZXRfYWxpYXN9ID0gJHtidWlsZF9hbGlhc30gXQotICAgIHRoZW4KLSAgICAgIGR1bW15PWlmJCQKLSAgICAgIGNhdCA+JGR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPiAgICAgICAgICAgICAgICAgICAgICAKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7ICAgICAgICAgIAotICAgICBjaGFyICphcmd2W107Ci17Ci0gIHByaW50ZigiJWRcbiIsIF9fR0xJQkNfTUlOT1JfXyk7Ci0gIHJldHVybiAwOwotfQotRU9GCi0gICAgICAke0NDLWNjfSAkZHVtbXkuYyAtbyAkZHVtbXkgMj4vZGV2L251bGwKLSAgICAgIGlmIFsgIiQ/IiA9IDAgXQotICAgICAgdGhlbgotCWxpYmNfaW50ZXJmYWNlPS1saWJjNi5gLi8kZHVtbXlgLQotCXJtIC1mICRkdW1teS5jICRkdW1teQotICAgICAgZWxzZQotCSMgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQllY2hvICJDYW5ub3QgZmluZCB0aGUgR05VIEMgbGlicmFyeSBtaW5vciB2ZXJzaW9uIG51bWJlci4iID4mMgotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWV4aXQgMQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIENyb3NzIGNvbXBpbGluZy4gQXNzdW1lIGdsaWJjIDIuMS4KLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNi4xLQotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBsaWJjX2ludGVyZmFjZT0tCi0gICAgOzsKLSAgZXNhYwotZmkKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDE0YTQzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LCB2ZXJzaW9uIDEuMS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotdmVyc2lvbj0nMjAwMC0wNS0zMCcKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCi0gICAgICAgJDAgW09QVElPTl0gQUxJQVMKLQotQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdCIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAiJDEiIGluCi0gICAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBleGVjID4mMgotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEiCi0gICAgICAgZWNobyAiJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPS12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBpYTY0IHwgbTMyciB8IG02OGsgfCBtNjgwMDAgfCBtODhrIHwgbnMzMmsgfCBhcmMgfCBhcm0gXAotCQl8IGFybWVbbGJdIHwgcHlyYW1pZCB8IG1uMTAyMDAgfCBtbjEwMzAwIHwgdHJvbiB8IGEyOWsgXAotCQl8IDU4MCB8IGk5NjAgfCBoODMwMCBcCi0JCXwgeDg2IHwgcHBjYmUgfCBtaXBzYmUgfCBtaXBzbGUgfCBzaGJlIHwgc2hsZSB8IGFybWJlIHwgYXJtbGUgXAotCQl8IGhwcGEgfCBocHBhMS4wIHwgaHBwYTEuMSB8IGhwcGEyLjAgfCBocHBhMi4wdyB8IGhwcGEyLjBuIFwKLQkJfCBocHBhNjQgXAotCQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFwY2E1WzY3XSBcCi0JCXwgYWxwaGFldjZbNzhdIFwKLQkJfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAotCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgXAotCQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCB8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JCXwgbWlwczY0dnI1MDAwIHwgbWlwcnM2NHZyNTAwMGVsIHwgbWNvcmUgXAotCQl8IHNwYXJjIHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyYzY0IHwgc3BhcmN2OSB8IHY4NTAgfCBjNHggXAotCQl8IHRodW1iIHwgZDEwdiB8IGZyMzAgfCBhdnIpCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgejhrIHwgdjcwIHwgaDg1MDAgfCB3NjUgfCBwaiB8IHBqbCkKLQkJOzsKLQotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWlbMzQ1NjddODYpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCSMgRklYTUU6IGNsZWFuIHVwIHRoZSBmb3JtYXR0aW5nIGhlcmUuCi0JdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2N104Ni0qIHwgaTg2MC0qIHwgaWE2NC0qIHwgbTMyci0qIHwgbTY4ay0qIHwgbTY4MDAwLSogXAotCSAgICAgIHwgbTg4ay0qIHwgc3BhcmMtKiB8IG5zMzJrLSogfCBmeDgwLSogfCBhcmMtKiB8IGFybS0qIHwgY1sxMjNdKiBcCi0JICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiBcCi0JICAgICAgfCBwb3dlci0qIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGg4NTAwLSogfCBpOTYwLSogXAotCSAgICAgIHwgeG1wLSogfCB5bXAtKiBcCi0JICAgICAgfCB4ODYtKiB8IHBwY2JlLSogfCBtaXBzYmUtKiB8IG1pcHNsZS0qIHwgc2hiZS0qIHwgc2hsZS0qIHwgYXJtYmUtKiB8IGFybWxlLSogXAotCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMHctKiBcCi0JICAgICAgfCBocHBhMi4wbi0qIHwgaHBwYTY0LSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTVbNjddLSogXAotCSAgICAgIHwgYWxwaGFldjZbNzhdLSogXAotCSAgICAgIHwgd2UzMmstKiB8IGN5ZHJhLSogfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogXAotCSAgICAgIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCi0JICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAotCSAgICAgIHwgc3BhcmM2NC0qIHwgc3BhcmN2OS0qIHwgc3BhcmM4NngtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCi0JICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JICAgICAgfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCSAgICAgIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiB8IG1jb3JlLSogXAotCSAgICAgIHwgZjMwMS0qIHwgYXJtdiotKiB8IHMzOTAtKiB8IHN2MS0qIHwgdDNlLSogXAotCSAgICAgIHwgbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGQxMHYtKiBcCi0JICAgICAgfCB0aHVtYi0qIHwgdjg1MC0qIHwgZDMwdi0qIHwgdGljMzAtKiB8IGMzMC0qIHwgZnIzMC0qIFwKLQkgICAgICB8IGJzMjAwMC0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCB5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXkyKQotCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCVtjdGpdOTAtY3JheSkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTY3XTg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWlbMzQ1NjddODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpWzM0NTY3XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2N104NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWkzODYtZ28zMiB8IGdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaTM4Ni1taW5ndzMyIHwgbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHNlbCotbGludXgqKQotCQliYXNpY19tYWNoaW5lPW1pcHNlbC11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotICAgICAgICBwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4ZW4pCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yKQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhlbi0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSopCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9dDNlLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0gICAgICAgICAgICAgICBiYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotICAgICAgICAgICAgICAgOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhtcCkKLQkJYmFzaWNfbWFjaGluZT14bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0gICAgICAgIHhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW1pcHMpCi0JCWlmIFsgeCRvcyA9IHgtbGludXgtZ251IF07IHRoZW4KLQkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCWVsc2UKLQkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCWZpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjkpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKLQkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGlbMzQ1NjddODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8qKQotCQlvcz0tbnRvLXFueAotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbnMyICkKLQkgICAgICAgIG9zPS1uZXh0c3RlcDIKLQkJOzsKLQktbnNrKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLSpNaU5UKQotCSAgICAgICAgb3M9LW1pbnQKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLXJlYmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzAxLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKiB8IC1vcGVuZWQqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC0qTWlOVCkKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAidmVyc2lvbj0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnL0NoYW5nZUxvZyBiL2NvbmZpZy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzQ2YjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIG1oLWkzNzBwaWM6IE5ldyBmaWxlLgotCSogbXQtaTM3MHBpYzogTmV3IGZpbGUuCi0KLTIwMDAtMDItMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC13aW5jZTogbmV3IGZpbGU6IE1ha2VmaWxlIGZyYWdtZW50IGZvciBXaW5DRSB0YXJnZXRzLgotCi0yMDAwLTAxLTA2ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIG1oLWFpeDQzOiBEZWxldGUsIG1vdmUgdG8gbXQtYWl4NDMuCi0JKiBtdC1haXg0MzogTmV3IGZpbGUuCi0KLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1kMzB2OiBOZXcgZmlsZSwgcGFzcyAtZyAtT3MgLVdhLC1DIGFzIGRlZmF1bHQgb3B0aW9ucy4KLQotMTk5OS0wMi0wOCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEFkZGVkIG1hY3JvcyB0byBmaW5kIGl0Y2wgZmlsZXMuCi0JRXhwb3J0IFRDTF9DRkxBR1MgZnJvbSB0Y2xDb25maWcuc2guCi0JRXhwb3J0IFRDTF9MSUJfRlVMTF9QQVRILCBUS19MSUJfRlVMTF9QQVRILCBJVENMX0xJQl9GVUxMX1BBVEgsCi0JSVRLX0xJQl9GVUxMX1BBVEgsIGFuZCBUSVhfTElCX0ZVTExfUEFUSAotCVJlcGxhY2UgVElYIG1hY3JvcyB3aXRoIGJldHRlciBvbmVzIGZyb20gc25hdmlnYXRvci4KLQotVHVlIEZlYiAgMiAyMjo1MToyMSAxOTk5IFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIG1oLWFybXBpYzogTmV3IGZpbGUuICBQYXRjaCBmcm9tIEppbSBQaWNrIDxqaW1AamltcGljay5jb20+LgotCSogbXQtYXJtcGljOiBMaWtld2lzZS4KLQotTW9uIEphbiAxOCAxOTo0MTowOCAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFjdGl2YXRlIGNvbW1lbnRlZCBvdXQgZGVwZW5kZW5jaWVzIGZvcgotCWdkYjogbGlidGVybWNhcC4KLQotV2VkIE5vdiAxOCAyMDoyOTo0NiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFkZCBleHRyYSBsaWJ0ZXJtY2FwIHRhcmdldCBpbmZvcm1hdGlvbi4KLQlBZGQgY29tbWVudGVkIG91dCBkZXBlbmRlbmN5IGZvciBnZGIgdG8gbGlidGVybWNhcCBmb3IKLQlmdXR1cmUgcmVhZGxpbmUgcmVxdWlyZW1lbnQuCi0KLU1vbiBOb3YgIDIgMTU6MTU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBkZWxldGUKLSAgICAgICAgKiBtaC1jeWd3aW46IHdhcyBtaC1jeWd3aW4zMgotCi0xOTk4LTEwLTI2ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogVENMSERJUiBhbmQgVEtIRElSIG5lZWQgdG8gYmUgcnVuIHRocm91Z2gKLQljeWdwYXRoIGZvciBNaWNyb3NvZnQgYnVpbGRzLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogUmUtZXhwb3J0ZWQgVENMX0xJQlMgYW5kIFRDTF9MRF9TRUFSQ0hfRkxBR1MKLQliZWNhdXNlIGl0Y2wgbmVlZHMgdGhlbS4KLQotTW9uIEF1ZyAzMSAxNzo1MDo1MyAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogbWgtYWl4NDMgKE5NX0ZPUl9UQVJHRVQpOiBBZGQgLVgzMl82NCBhcyB3ZWxsLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBtaC1haXg0MzogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTAgMDA6MTU6NDcgMTk5OCAgSEogTHUgKGhqbEBnbnUub3JnKQotCi0JKiBtdC1saW51eCAoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0xOTk4LTA1LTI5ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBjb2xsZWN0aW9uIG9mIGdlbmVyaWMgYXV0b2NvbmYgbWFjcm9zLgotCQotV2VkIEFwciAyMiAxMjoyNDoyOCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbXQtb3NwYWNlOiBOZXcgZmlsZSwgc3VwcG9ydCB1c2luZyAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gY29tcGlsZQotCXRoZSBsaWJyYXJpZXMuCi0KLVdlZCBBcHIgMjIgMTA6NTM6MTQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG10LWxpbnV4IChDWFhGTEFHU19GT1JfVEFSR0VUKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBDWFhGTEFHUy4KLQotU2F0IEFwciAxMSAyMjo0MzoxNyAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIG1oLXN2c3Y1OiBOZXcgZmlsZSAtIHN1cHBvcnQgZm9yIFNDTyBVbml4V2FyZSA3IC8gU1ZSNS4KLQotVGh1IE1hciAyNiAwMTo1NDoyNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogc3RvcCBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgZG9zcmVsLgotCi1UaHUgU2VwIDExIDE2OjQzOjI3IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbWgtZWxmYWxwaGFwaWMsIG10LWVsZmFscGhhcGljOiBOZXcgZmlsZXMuCi0KLVdlZCBKdWwgMjMgMTI6MzI6MTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBtaC1nbzMyIChDRkxBR1MpOiBEb24ndCBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi0KLU1vbiBKdW4gMTYgMTk6MDY6NDEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbWgtcHBjcGljOiBOZXcgZmlsZS4KLQkqIG10LXBwY3BpYzogTmV3IGZpbGUuCi0KLVRodSBNYXIgMjcgMTU6NTI6NDAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IG92ZXJyaWRlIENYWEZMQUdTLCBzZXR0aW5nIHRvIC1PMiBvbmx5Ci0JKG5vIGRlYnVnKQotCi1UdWUgTWFyIDI1IDE4OjE2OjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBkZWJ1ZyBpbmZvCi0JaXNuJ3QgaW5jbHVkZWQgaW4gY3lnd2luMzItaG9zdGVkIGxpYmdjYzIuYSBieSBkZWZhdWx0Ci0KLVdlZCBKYW4gIDggMTk6NTY6NDMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBDRkxBR1Mgc28gZGVidWcgaW5mbyBpc24ndCBpbmNsdWRlZAotICAgICAgICBpbiBjeWd3aW4zMi1ob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdAotCi1UdWUgRGVjIDMxIDE2OjA0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbGludXg6IFJlbW92ZS4KLQotTW9uIE5vdiAxMSAxMDoyOTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG10LXBwYzogRGVsZXRlIGZpbGUsIG9wdGlvbnMgbW92ZWQgdG8gbmV3bGliIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMTowMyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogbWgtZGd1eDM4NjogTmV3IGZpbGUuICB4ODYgZGd1eCBzcGVjaWZpYyBmbGFncwotCi1Nb24gU2VwIDMwIDE1OjEwOjA3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoRVhUUkFMSUJTX1BQQ19YQ09GRik6IE5ldywgd2FzIEVYVFJBTElCU19QUEMuCi0JKEVYVFJBTElCU19QUEMpOiBVc2Ugc2hhcmVkIGxpYnJhcmllcyBpbnN0ZWFkIG9mIHhjb2ZmLgotCi1TYXQgQXVnIDE3IDA0OjU2OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHNrYXJvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBkb24ndCAtRF9XSU4zMiBoZXJlIGFueW1vcmUKLQotVGh1IEF1ZyAxNSAxOTo0Njo0NCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKFNFR0ZMQUdfNjhLLCBTRUdGTEFHX1BQQyk6IFJlbW92ZS4KLQkoRVhUUkFMSUJTX1BQQyk6IEFkZCBsaWJnY2MueGNvZmYuCi0KLVRodSBBdWcgIDggMTQ6NTE6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtdC1wcGM6IE5ldyBmaWxlLCBhZGQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSB0byBhbGwKLQl0YXJnZXQgYnVpbGRzIGZvciBQb3dlclBDIGVhYmkgdGFyZ2V0cy4KLQotRnJpIEp1bCAxMiAxMjowNjowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdzogTmV3IHN1YmRpciwgTWFjIE1QVyBjb25maWd1cmF0aW9uIHN1cHBvcnQgYml0cy4KLQotTW9uIEp1bCAgOCAxNzozMDo1MiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg2OiBOZXcgZmlsZS4KLQotTW9uIEp1bCAgOCAxNToxNTozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIG10LXNwYXJjcGljIChQSUNGTEFHX0ZPUl9UQVJHRVQpOiBVc2UgLWZQSUMuCi0KLUZyaSBKdWwgIDUgMTE6NDk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1pcml4NCAoUkFOTElCKTogRG9uJ3QgZGVmaW5lOyBJcml4IDQgZG9lcyBoYXZlIHJhbmxpYi4KLQotU3VuIEp1biAyMyAyMjo1OToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogbmV3IGZpbGUuICBMaWtlIG1oLWdvMzIgd2l0aG91dCB0aGUgQ0ZMQUdTIGVudHJ5LgotCi1UdWUgTWFyIDI2IDE0OjEwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtZ28zMiAoQ0ZMQUdTKTogRGVmaW5lLgotCi1UaHUgTWFyIDE0IDE5OjIwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbmVjdjQ6IE5ldyBmaWxlLgotCi1UaHUgRmViIDE1IDEzOjA3OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtY3h1eCAoQ0MpOiBOZXcgdmFyaWFibGUuCi0JKENGTEFHUywgTERGTEFHUyk6IFJlbW92ZS4KLQkqIG1oLW5jcnN2cjQzIChDQyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTKTogUmVtb3ZlLgotCSogbWgtc29sYXJpcyAoQ0ZMQUdTKTogUmVtb3ZlLgotCi0JKiBtaC1nbzMyOiBSZW1vdmUgbW9zdCB2YXJpYWJsZSBzZXR0aW5ncywgc2luY2UgdGhleSBwcmVzdW1lZCBhCi0JQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIGlzIG5vdyBoYW5kbGVkIGNvcnJlY3RseSBieSB0aGUgY29uZmlndXJlCi0Jc2NyaXB0LgotCi0JKiBtaC1zcGFyY3BpYyAoUElDRkxBRyk6IFNldCB0byAtZlBJQywgbm90IC1mcGljLgotCi1Nb24gRmViIDEyIDE0OjUzOjM5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtaC1tNjhrcGljLCBtdC1tNjhrcGljOiBOZXcgZmlsZXMuCi0KLVRodSBGZWIgIDEgMTQ6MTU6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQ19NV0M2OEspOiBBZGQgb3B0aW9ucyBzaW1pbGFyIHRvIHRob3NlIHVzZWQKLQlpbiBDQ19NV0NQUEMsIGFuZCAtbWM2ODAyMCAtbW9kZWwgZmFyLgotCShBUl9NV0xJTks2OEspOiBBZGQgLXhtIGxpYnJhcnkuCi0JKEFSX0FSKTogRGVmaW5lLgotCShDQ19MRF9NV0xJTks2OEspOiBSZW1vdmUgLWQuCi0JKEVYVFJBTElCU19NV0M2OEspOiBEZWZpbmUuCi0KLVRodSBKYW4gMjUgMTY6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1uY3JzdnI0MyAoQ0ZMQUdTKTogUmVtb3ZlIC1Ibm9jb3B5ci4KLQotVHVlIE5vdiAgNyAxNTo0MTozMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKENDX01XQzY4SywgQ0NfTVdDUFBDKTogUmVtb3ZlIHVudXNlZCBpbmNsdWRlIHBhdGguCi0JKENDX01XQ1BQQyk6IEFkZCAtbXB3X2NoYXJzLCBkaXNhYmxlIHdhcm5pbmdzLCBhZGQgY29tbWVudHMKLQlleHBsYWluaW5nIHJlYXNvbnMgZm9yIHZhcmlvdXMgZmxhZ3MuCi0JKEVYVFJBTElCU19QUEMsIEVYVFJBTElCU19NV0NQUEMgKTogUHV0IHJ1bnRpbWUgbGlicmFyeSBmaXJzdC4KLQkKLUZyaSBPY3QgMTMgMTQ6NDQ6MjUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIG1oLWFpeCwgbWgtc3VuOiAgUmVtb3ZlZC4KLQotCSogbWgtZGVjc3RhdGlvbiAoWDExX0VYVFJBX0NGTEFHUyk6IERlZmluZS4KLQotCSogbWgtc2NvLCBtaC1zb2xhcmlzLCBtaC1zeXN2NCAoWDExX0VYVFJBX0xJQlMpOiBEZWZpbmUuCi0KLSAgICAgICAgKiBtaC1ocDMwMCwgbWgtaHB1eCwgbWgtaHB1eDgsIG1oLXNvbGFyaXMsIG1oLXN1bjMsIG1oLXN5c3Y0OiBEb24ndCAKLQloYXJkY29kZSBsb2NhdGlvbiBvZiBYIHN0dWZmIGhlcmUuCi0KLVRodSBTZXAgMjggMTM6MTQ6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3OiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgNjhLIGFuZCBQb3dlck1hYwotCWNvbXBpbGVycywgYWRkIGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IGFuZCBsaW5rIHN0ZXBzIGZvcgotCVBvd2VyTWFjcy4KLQotVGh1IFNlcCAxNCAwODoyMDowNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKENDKTogQWRkICJDQyA9IGNjIC1XcCwtSDI1NjAwMCIgdG8gYXZvaWQKLQkidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIHRoZSBIUFVYIGNvbXBpbGVyLgotCi1UaHUgQXVnIDE3IDE3OjI4OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKFJBTkxJQik6IFVzZSAiYXIgdHMiLCBpbiBjYXNlIEdOVSBhciB3YXMgdXNlZCBhbmQKLQlkaWRuJ3QgYnVpbGQgYSBzeW1ib2wgdGFibGUuCi0KLVRodSBKdW4gMjIgMTc6NDc6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTlNJX1BST1RPVFlQRVMuCi0KLU1vbiBBcHIgMTAgMTI6Mjk6NDggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChFWFRSQUxJQlMpOiBBbHdheXMgbGluayBpbiBNYXRoLm8sIENTQU5FTElCLm8sCi0gICAgICAgIGFuZCBUb29sTGlicy5vLgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTE1PU1RfU1REQy4KLQkoQ0ZMQUdTKTogUmVtb3ZlIEFMTU9TVF9TVERDLCAtbWM2ODg4MS4KLQkoTERGTEFHUyk6IGFkZCAtdy4KLQotCSogbXB3LW1oLW1wdyAoQ0ZMQUdTKTogQWRkIC1iIG9wdGlvbiB0byBwdXQgc3RyaW5ncyBhdCB0aGUgZW5kcyBvZgotCWZ1bmN0aW9ucy4KLQotCSogbXB3LW1oLW1wdzogTmV3IGZpbGUsIGhvc3QgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZm9yIE1QVy4KLQotRnJpIE1hciAzMSAxMTozNToxNyAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtdC1uZXR3YXJlOiBOZXcgZmlsZS4KLQotTW9uIE1hciAxMyAxMjozMToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWhwdXg4OiBOZXcgZmlsZS4KLQkqIG1oLWhwdXg6IFVzZSBYMTFSNSByYXRoZXIgdGhhbiBYMTFSNC4KLQotVGh1IEZlYiAgOSAxMTowNDoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWxpbnV4IChTWVNWKTogRG9uJ3QgZGVmaW5lLgotCShSQU5MSUIpOiBEb24ndCBkZWZpbmUuCi0KLVdlZCBKYW4gMTEgMTY6Mjk6MzQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIG0/LSpwaWMgKExJQkNYWEZMQUdTKTogQWRkIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLgotCi1UaHUgTm92ICAzIDE3OjI3OjE5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg0IChDQyk6IEluY3JlYXNlIG1heGltdW0gc3RyaW5nIGxlbmd0aC4KLQotCSogbWgtc2NvIChDQyk6IERlZmluZSBhd2F5IGNvbnN0LCBpdCBkb2Vzbid0IHdvcmsgcmlnaHQ7IGVsZW1lbnRzCi0Jb2YgYXJyYXlzIG9mIHB0ci10by1jb25zdCBhcmUgY29uc2lkZXJlZCBjb25zdCB0aGVtc2VsdmVzLgotCi1TYXQgSnVsIDE2IDEyOjE3OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbWgtY3h1eDogTmV3IGZpbGUsIGZyb20gQm9iIFJ1c2sgKHJydXNrQG1haWwuY3NkLmhhcnJpcy5jb20pLgotCi1TYXQgSnVuICA0IDE3OjIyOjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBtaC1uY3JzdnI0MzogIE5ldyBmaWxlIGZyb20gVG9tIE1jQ29ubmVsbAotCTx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotVGh1IE1heSAxOSAwMDozMjoxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbWgtaHB1eCAoQ0MpOiBBZGQgLVdwLC1IMjU2MDAwIHRvIGF2b2lkICJ0b28gbXVjaCBkZWZpbmluZyIKLQllcnJvcnMgZnJvbSB0aGUgSFBVWCA4IGNvbXBpbGVycy4KLQotV2VkIE1heSAgNCAyMDoxNDo0NyAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG1oLWx5bnhyczZrOiBzZXQgU0hFTEwgdG8gL2Jpbi9iYXNoCi0KLVR1ZSBBcHIgMTIgMTI6Mzg6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaC1pcml4NCAoQ0MpOiBDaGFuZ2UgLVhOaDE1MDAgdG8gLVhOaDIwMDAuCi0KLVNhdCBEZWMgMjUgMjA6MDM6NDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG10LWhwcGE6IERlbGV0ZS4KLQotVHVlIE5vdiAxNiAyMjo1NDozOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtYTY4YnNkOiBEZWZpbmUgQ0MgdG8gZ2NjLgotCi1Nb24gTm92IDE1IDE2OjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1saW51eDogRG9uJ3QgcHV0IC1zdGF0aWMgaW4gTERGTEFHUy4gIEFkZCBjb21tZW50cy4KLQotTW9uIE5vdiAxNSAxMzozNzo1OCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIG1oLXN5c3Y0IChBUl9GTEFHUyk6IGNoYW5nZSBmcm9tIGNxIHRvIGNyCi0KLUZyaSBOb3YgIDUgMDg6MTI6MzIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBtaC11bml4d2FyZTogcmVtb3ZlLiAgSXQncyB0aGUgc2FtZSBhcyBzeXN2NCwgYW5kIGNvbmZpZy5ndWVzcwotCWNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuICBTbyBkb24ndCBhbGxvdyBza2V3LgotCi1XZWQgT2N0IDIwIDIwOjM1OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1ocDMwMDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZSwgYnV0IGFkZCBjb21tZW50IGV4cGxhaW5pbmcuCi0KLVR1ZSBPY3QgMTkgMTg6NTg6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWhwMzAwOiBEb24ndCBkZWZpbmUgQ0ZMQUdTIHRvIGVtcHR5LiAgV2h5IHNob3VsZCBocDMwMCBiZQotCWRpZmZlcmVudCBmcm9tIGFueXRoaW5nIGVsc2U/ICAoImdkYiBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIG5hdGl2ZQotCWRlYnVnIGZvcm1hdCIgaXNuJ3QgYSBnb29kIGVub3VnaCBhbnN3ZXIgYmVjYXVzZSB3ZSBtaWdodCBiZSB1c2luZwotCWdjYykuCi0KLVR1ZSBPY3QgIDUgMTI6MTc6NDAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaC1hbHBoYW9zZjogUmVtb3ZlLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0IGdkYiBrbm93cwotCWhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIEp1bCAgNiAxMToyNzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtaC1hbHBoYW9zZjogTmV3IGZpbGUuCi0KLVRodSBKdWwgIDEgMTU6NDk6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLXJpc2NvczogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMTQgMTI6MDM6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaC1haXgsIG1oLWFpeDM4NiwgbWgtZGVjc3RhdGlvbiwgbWgtZGVsdGE4OCwgbWgtaHB1eCwgbWgtaXJpeDQsCi0JbWgtbmNyMzAwMCwgbWgtc29sYXJpcywgbWgtc3lzdiwgbWgtc3lzdjQ6IHJlbW92ZSBJTlNUQUxMPWNwIGxpbmUsCi0Jbm93IHRoYXQgd2UncmUgdXNpbmcgaW5zdGFsbC5zaCBnbG9iYWxseQotCi1GcmkgSnVuICA0IDE2OjA5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWgtc3lzdjQgKElOU1RBTEwpOiBVc2UgY3AsIG5vdCAvdXNyL3VjYi9pbnN0YWxsLgotCi1UaHUgQXByICA4IDExOjIxOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbXQtYTI5aywgbXQtZWJtb24yOWssIG10LW9zNjhrLCBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrLAotCW10LXZ4d29ya3M2OCwgbXQtdnh3b3Jrczk2MDogUmVtb3ZlZCBvYnNvbGV0ZSwgdW51c2VkIHRhcmdldAotCU1ha2VmaWxlIGZyYWdtZW50IGZpbGVzLgotCi1Nb24gTWFyICA4IDE1OjA1OjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWgtYWl4Mzg2OiBOZXcgZmlsZTsgb2xkIG1oLWFpeCwgcGx1cyBuby1vcCBSQU5MSUIuCi0KLVRodSBPY3QgIDEgMTM6NTA6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtaC1zb2xhcmlzOiBJTlNUQUxMIGlzIE5PVCAvdXNyL3VjYi9pbnN0YWxsCi0KLU1vbiBBdWcgMjQgMTQ6MjU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrOiByZW5hbWVkIGZyb20gbXQtT1NFKi4KLQotVHVlIEp1bCAyMSAwMjoxMTowMSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG10LU9TRTY4aywgbXQtNjgwMDAwOiBuZXcgY29uZmlncy4KLQotVGh1IEp1bCAxNiAxNzoxMjowOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1oLWlyaXg0OiBtZXJnZWQgY2hhbmdlcyBmcm9tIHByb2dyZXNzaXZlLgotCi1UdWUgSnVuICA5IDIzOjI5OjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogRXZlcnl3aGVyZTogQ2hhbmdlIFJBTkxJQj1lY2hvPi9kZXYvbnVsbCAod2hpY2ggY29uZnVzZXMKLQlzb21lIHNoZWxscyAtIGFuZCBJIGRvbid0IGJsYW1lIHRoZW0pIHRvIFJBTkxJQj10cnVlLgotCSogbWgtc29sYXJpczogIFVzZSAvdXNyL3VjYi9pbnN0YWxsIGZvciBJTlNUQUxMLgotCi1TdW4gTWF5IDMxIDE0OjQ1OjIzIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIG1oLXNvbGFyaXMyOiBBZGQgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIFNvbGFyaXMgMiAoc3lzdiwgbm8gcmFubGliKQotCi1GcmkgQXByIDEwIDIzOjEwOjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtaC1uY3IzMDAwOiAgQWRkIG5ldyBjb25maWd1cmF0aW9uIGZvciBOQ1IgMzAwMC4KLQotVHVlIERlYyAxMCAwMDoxMDo1NSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZzogZnJlc2ggY2hhbmdlbG9nLgotCmRpZmYgLS1naXQgYS9jb25maWcvYWNpbmNsdWRlLm00IGIvY29uZmlnL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc5OWNlZC4uMDAwMDAwMAotLS0gYS9jb25maWcvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTk5NCArMCwwIEBACi1kbmwgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGludG8gYWxsIGFueSBvdGhlciBhY2luY2x1ZGUgZmlsZSB0aGF0IG5lZWRzCi1kbmwgdG8gdXNlIHRoZXNlIG1hY3Jvcy4KLQotZG5sIFRoaXMgaXMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgY2FsbHMgb3VyIG93biBBQ19QUk9HX0NDX1dPUktTLAotZG5sIGFuZCBkb2Vzbid0IGNhbGwgQUNfUFJPR19DWFhfR05VLCBjYXVzZSB3ZSB0ZXN0IGZvciB0aGF0IGluICBBQ19QUk9HX0NDX1dPUktTLgotZG5sIFdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci1kbmwgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mIGl0c2VsZi4KLWRubCBGaW5kIGEgd29ya2luZyBHKysgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DWFhfQ1JPU1MsCi1bQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NYWENQUF0pCi1BQ19DSEVDS19QUk9HUyhDWFgsICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKyssIGdjYykKLQotQ1lHX0FDX1BST0dfR1hYX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ3h4ID0geWVzOyB0aGVuCi0gIEdYWD15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENYWEZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENYWEZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgQ1hYRkxBR1M9Ci0gIEFDX1BST0dfQ1hYX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR1hYPQotICB0ZXN0ICIke0NYWEZMQUdTK3NldH0iID0gc2V0IHx8IENYWEZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHKysgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HWFhfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQ1BMVVNQTFVTCi1kbmwgVHJ5IGEgdGVzdCBjYXNlLiBXZSBvbmx5IGNvbXBpbGUsIGJlY2F1c2UgaXQncyBjbG9zZSB0byBpbXBvc3NpYmxlCi1kbmwgdG8gZ2V0IGEgY29ycmVjdCBmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSB3aXRoIGEgY3Jvc3MgY29tcGlsZXIuIEZvcgotZG5sIG1vc3QgY3Jvc3MgY29tcGlsZXJzLCB0aGlzIHRlc3QgaXMgYm9ndXMuIEZvciBHKyssIHdlIGNhbiB1c2UgdmFyaW91cwotZG5sIG90aGVyIGNvbXBpbGUgbGluZSBvcHRpb25zIHRvIGdldCBhIGRlY2VudCBpZGVhIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyCi1kbmwgYWN0dWFsbHkgZG9lcyB3b3JrLCBldmVuIHRob3VnaCB3ZSBjYW4ndCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dAotZG5sIG1vcmUgaW5mbyBhYm91dCB0aGUgdGFyZ2V0IGl0J3MgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MKLWRubCBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi0KLWRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi1kbmwgQ1hYIGlzIHNldC4gVGhpcyBpcyBhbHNvIHdoYXQgQ1hYIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQKLWRubCBNYWtlZmlsZS4KLWlmIHRlc3QgeCIke0NYWH0iID0geGMrKyA7IHRoZW4KLSAgICBDWFg9YGVjaG8gZ2NjIHwgc2VkIC1lICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9ImAKLWZpCi0KLWRubCBHZXQgRysrJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1saWJnY2NwYXRoPWAke0NYWH0gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19neHg9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2d4eD1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHKyssIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19neHh9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPW5vCi0gICAgQUNfTVNHX0VSUk9SKCR7Q1hYfSBpcyBhIG5vbi13b3JraW5nIGNyb3NzIGNvbXBpbGVyKQotZWxzZQotICAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9eWVzIAotZmkKLQotQUNfTEFOR19SRVNUT1JFCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2N4eF93b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jeHhfd29ya3MiID0geG5vOyB0aGVuCi0gIEFDX01TR19FUlJPUihbaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuXSkKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEcrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXJdKQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jeHhfY3Jvc3MpCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCi1BQ19TVUJTVChDWFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIGEgd29ya2luZyBHQ0MgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBnY2MgY29tcGlsZXIuCi1kbmwgVGhpcyBpcyBiYXNlZCBvbiB0aGUgbWFjcm9zIGFib3ZlIGZvciBHKysuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DQ19DUk9TUywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ0NQUF0pCi1BQ19DSEVDS19QUk9HUyhDQywgY2MsIGdjYykKLQotQ1lHX0FDX1BST0dfR0NDX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBBQ19QUk9HX0NDX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdYWD0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHQ0MgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HQ0NfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHY2MgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotZG5sIFRyeSBhIHRlc3QgY2FzZS4gV2Ugb25seSBjb21waWxlLCBiZWNhdXNlIGl0J3MgY2xvc2UgdG8gaW1wb3NzaWJsZQotZG5sIHRvIGdldCBhIGNvcnJlY3QgZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgd2l0aCBhIGNyb3NzCi1kbmwgY29tcGlsZXIuIEZvciBtb3N0IGNyb3NzIGNvbXBpbGVycywgdGhpcyB0ZXN0IGlzIGJvZ3VzLiBGb3IgRysrLAotZG5sIHdlIGNhbiB1c2UgdmFyaW91cyBvdGhlciBjb21waWxlIGxpbmUgb3B0aW9ucyB0byBnZXQgYSBkZWNlbnQgaWRlYQotZG5sIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyIGFjdHVhbGx5IGRvZXMgd29yaywgZXZlbiB0aG91Z2ggd2UgY2FuJ3QKLWRubCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCBtb3JlIGluZm8gYWJvdXQgdGhlIHRhcmdldCBpdCdzCi1kbmwgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgotCi1kbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcwotZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENDIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuCi1pZiB0ZXN0IHgiJHtDQ30iID0geGNjIDsgdGhlbgotICAgIENDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi1maQotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHY2MsIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLSAgICBBQ19NU0dfRVJST1IoJHtDQ30gaXMgYSBub24td29ya2luZyBjcm9zcyBjb21waWxlcikgICAgCi1lbHNlCi0gICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jY193b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jY193b3JrcyIgPSB4bm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDKysgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy5dKQotZmkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgR2NjIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlcl0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2NjX2Nyb3NzKQotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi1BQ19TVUJTVChDQykKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIEJGRCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFuZAotZG5sIG1hbmlwdWxhdGUgb2JqZWN0IG9yIGV4ZWN1dGFibGUgZmlsZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9CRkQsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBoZWFkZXIgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9iZmQvYmZkLmgiIDsgdGhlbgotCWFjX2N2X2NfYmZkaD1gKGNkICRpL2JmZDsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19iZmRofSIgIT0geDsgdGhlbgotICAgIEJGREhESVI9Ii1JJHthY19jdl9jX2JmZGh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChCRkRIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkbGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2JmZC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19iZmRsaWI9YChjZCAkaS9iZmQ7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1kbmwgV2UgbGlzdCB0d28gZGlyZWN0b3JpZXMgY2F1c2UgYmZkIG5vdyB1c2VzIGxpYnRvb2wKLWlmIHRlc3QgeCIke2FjX2N2X2NfYmZkbGlifSIgIT0geDsgdGhlbgotICAgIEJGRExJQj0iLUwke2FjX2N2X2NfYmZkbGlifSAtTCR7YWNfY3ZfY19iZmRsaWJ9Ly5saWJzIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKEJGRExJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiBUaGlzIGRlZmluZXMgbWFueSBjb21tb25seSB1c2VkIEMKLWRubCBmdW5jdGlvbnMgdGhhdCBleGlzdHMgaW4gdmFyaW91cyBzdGF0ZXMgYmFzZWQgb24gdGhlIHVuZGVybHlpbmcgT1MuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJFUlRZLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJlcnR5IGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZXJ0eSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9saWJpYmVydHkvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfbGliZXJ0eT1gKGNkICRpL2xpYmliZXJ0eTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZXJ0eX0iICE9IHg7IHRoZW4KLSAgICBMSUJFUlRZPSItTCR7YWNfY3ZfY19saWJlcnR5fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJlcnR5fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCRVJUWSkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIG9wY29kZXMgbGlicmFyeS4gVGhpcyBpcyB1c2VkIHRvIGRvIGRpc3Nhc2VtYmxpZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9PUENPREVTLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBvcGNvZGVzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfb3BjLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL29wY29kZXMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2Nfb3BjPWAoY2QgJGkvb3Bjb2RlczsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfb3BjfSIgIT0geDsgdGhlbgotICAgIE9QQ09ERVNMSUI9Ii1MJHthY19jdl9jX29wY30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfb3BjfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoT1BDT0RFU0xJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIExvb2sgZm9yIHRoZSBEZWphR251IGhlYWRlciBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyBmaWxlCi1kbmwgZGVmaW5lcyB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gdGVzdGluZyBzdXBwb3J0LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfREVKQUdOVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgdGVzdGluZyBzdXBwb3J0IGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19kZWphZ251LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZS9kZWphZ251LmgiIDsgdGhlbgotCWFjX2N2X2NfZGVqYWdudT1gKGNkICRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfZGVqYWdudX0iICE9IHg7IHRoZW4KLSAgICBERUpBR05VSERJUj0iLUkke2FjX2N2X2NfZGVqYWdudX0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGVqYWdudX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2RlamFnbnVsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliL2hvc3R1dGlsLmV4cCIgOyB0aGVuCi0JYWNfY3ZfY19kZWphZ251bGliPWAoY2QgJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19kZWphZ251bGlifSIgIT0geDsgdGhlbgotICAgIERFSkFHTlVMSUI9IiR7YWNfY3ZfY19kZWphZ251bGlifSIKLWVsc2UKLSAgICBERUpBR05VTElCPSIiCi1maQotQUNfTVNHX0NIRUNLSU5HKGZvciBydW50ZXN0IGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3J1bnRlc3QsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9kZWphZ251L3J1bnRlc3QiIDsgdGhlbgotCWFjX2N2X2NfcnVudGVzdD1gKGNkICRzcmNkaXIvJGkvZGVqYWdudTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfcnVudGVzdH0iICE9IHg7IHRoZW4KLSAgICBSVU5URVNURElSPSIke2FjX2N2X2NfcnVudGVzdH0iCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19ydW50ZXN0fSkKLWVsc2UKLSAgICBSVU5URVNURElSPSIiCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKFJVTlRFU1RESVIpCi1BQ19TVUJTVChERUpBR05VTElCKQotQUNfU1VCU1QoREVKQUdOVUhESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBsaWJpbnRsIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUuIFRoaXMgaXMgZm9yCi1kbmwgIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JTlRMLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBpbnRsIGhlYWRlciBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbnRsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbnRsL2xpYmludGwuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsaD1gKGNkICRpL2ludGw7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGh9IiAhPSB4OyB0aGVuCi0gICAgSU5UTEhESVI9Ii1JJHthY19jdl9jX2ludGxofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbnRsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmludGwgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2ludGxsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaW50bC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsbGliPWAoY2QgJGkvaW50bDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGxpYn0iICE9IHg7IHRoZW4KLSAgICBJTlRMTElCPSItTCR7YWNfY3ZfY19pbnRsbGlifSAtbGludGwiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaW50bGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBzaW11bGF0b3IgbGlicmFyeS4KLUFDX0RFRlVOKENZR19BQ19QQVRIX1NJTSwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWNhc2UgIiR0YXJnZXRfY3B1IiBpbgotICAgIHBvd2VycGMpCXRhcmdldF9kaXI9cHBjIDs7Ci0gICAgc3BhcmMqKQl0YXJnZXRfZGlyPWVyYzMyIDs7Ci0gICAgbWlwcyopCXRhcmdldF9kaXI9bWlwcyA7OwotICAgICopCQl0YXJnZXRfZGlyPSR0YXJnZXRfY3B1IDs7Ci1lc2FjCi1kbmwgRmlyc3QgbG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgaGVhZGVyIGZpbGUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1oLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbmNsdWRlL3JlbW90ZS1zaW0uaCIgOyB0aGVuCi0JYWNfY3ZfY19zaW1oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltaH0iICE9IHg7IHRoZW4KLSAgICBTSU1IRElSPSItSSR7YWNfY3ZfY19zaW1ofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1ofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoU0lNSERJUikKLQotZG5sIFNlZSB3aGV0aGVyIGl0J3MgYSBkZXZvIG9yIEZvdW5kcnkgYnJhbmNoIHNpbXVsYXRvcgotQUNfTVNHX0NIRUNLSU5HKFdoZXRoZXIgdGhpcyBpcyBhIGRldm8gc2ltdWxhdG9yICkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3NpbWRldm8sWwotICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFNJTUhESVIiCi0gICAgQUNfRUdSRVBfSEVBREVSKFtTSU1fREVTQyBzaW1fb3Blbi4qc3RydWN0IF9iZmRdLCByZW1vdGUtc2ltLmgsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz15ZXMsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz1ubykKLV0pCi1pZiB0ZXN0IHgiJGFjX2N2X2Nfc2ltZGV2byIgPSB4InllcyIgOyB0aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfREVWT19TSU0pCi1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltZGV2b30pCi1BQ19TVUJTVChIQVZFX0RFVk9fU0lNKQotCi1kbmwgTmV4dCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1saWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvc2ltLyR0YXJnZXRfZGlyL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX3NpbWxpYj1gKGNkICRpL3NpbS8kdGFyZ2V0X2RpcjsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltbGlifSIgIT0geDsgdGhlbgotICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZG5sIEZJWE1FOiB0aGlzIGlzIGtpbmRhIGJvZ3VzLCBjYXVzZSB1bXRpbWF0ZWx5IHRoZSBUTSB3aWxsIGJ1aWxkCi0gICAgZG5sIGFsbCB0aGUgbGlicmFyaWVzIGZvciBzZXZlcmFsIGFyY2hpdGVjdHVyZXMuIEJ1dCBmb3Igbm93LCB0aGlzCi0gICAgZG5sIHdpbGwgd29yayB0aWxsIHRoZW4uCi1kbmwgICAgIEFDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIgbGlicmFyaWVzKQotICAgIGRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi0gICAgZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENYWCBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkCi0gICAgZG5sIE1ha2VmaWxlLgotICAgIENST1NTX0dDQz1gZWNobyBnY2MgfCBzZWQgLWUgInMvXi8kdGFyZ2V0LyJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotY2hhbmdlcXVvdGUoLCkKLSAgICBnY2NwYXRoPWAke0NST1NTX0dDQ30gLS1wcmludC1saWJnY2MgfCBzZWQgLWUgJ3M6W2EtejAtOUEtWlwuXC1dKi9saWJnY2MuYTo6JyAtZSAnczpsaWIvZ2NjLWxpYi86OidgbGliCi1jaGFuZ2VxdW90ZShbLF0pCi0gICAgaWYgdGVzdCAtZiAkZ2NjcGF0aC9saWJzaW0uYSAtbyAtZiAkZ2NjcGF0aC9saWJzaW0uc28gOyB0aGVuCi0gICAgICAgIGFjX2N2X2Nfc2ltbGliPSIkZ2NjcGF0aC8iCi0gICAgICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLQlBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1saWJ9KQotICAgIGVsc2UKLSAgICAgICAgQU1fQ09ORElUSU9OQUwoUFNJTSwgdGVzdCB4JHBzaW0gPSB4bm8pCi0JU0lNTElCPSIiCi0JQUNfTVNHX1JFU1VMVChub25lKQotZG5sICAgICAgICAgYWNfY3ZfY19zaW1saWI9bm9uZQotICAgIGZpCi1maQotQUNfU1VCU1QoU0lNTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJJQkVSVFksIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmliZXJ0eS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19saWJpYj1gKGNkICRpL2xpYmliZXJ0eS87IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmlifSIgIT0geDsgdGhlbgotICAgIExJQklCRVJUWT0iLUwke2FjX2N2X2NfbGliaWJ9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmlifSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCSUJFUlRZKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9ERVZPLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGRldm8gaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGV2b2gsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIiA7IHRoZW4KLQlhY19jdl9jX2Rldm9oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2Rldm9ofSIgIT0geDsgdGhlbgotICAgIERFVk9IRElSPSItSSR7YWNfY3ZfY19kZXZvaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGV2b2h9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChERVZPSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIElERSBsaWJyYXJ5IGFuZCBoZWFkZXJzLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSURFLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1JREVIRElSPQotSURFTElCPQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRlaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRlL3NyYy9ldmVudC5oIiA7IHRoZW4KLQlhY19jdl9jX2lkZWg9YChjZCAke3NyY2Rpcn0vJGkvbGliaWRlL3NyYzsgcHdkKWA7Ci0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWh9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iLUkke2FjX2N2X2NfaWRlaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBMSUJJREUgVENMIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRldGNsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRldGNsL3NyYy9pZGV0Y2wuaCIgOyB0aGVuCi0JYWNfY3ZfY19pZGV0Y2xoPWAoY2QgJHtzcmNkaXJ9LyRpL2xpYmlkZXRjbC9zcmM7IHB3ZClgOwotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xofSIgIT0geDsgdGhlbgotICAgIElERUhESVI9IiR7SURFSERJUn0gLUkke2FjX2N2X2NfaWRldGNsaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRldGNsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWgyLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfaWRlaDI9YChjZCAkaS9saWJpZGUvc3JjOyBwd2QpYDsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlaDJ9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iJHtJREVIRElSfSAtSSR7YWNfY3ZfY19pZGVoMn0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaDJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2lkZWxpYj1gKGNkICRpL2xpYmlkZS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iLUwke2FjX2N2X2NfaWRlbGlifSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotZG5sIGZpbmQgbGliaWRkZXRjbC5hIGlmIGl0IGV4aXN0cwotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgVENMIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGV0Y2xsaWIsWwotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGV0Y2wvc3JjL01ha2VmaWxlIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pZGV0Y2xsaWI9YChjZCAkaS9saWJpZGV0Y2wvc3JjOyBwd2QpYAotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi1maQotXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZXRjbGxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iJHtJREVMSUJ9IC1MJHthY19jdl9jX2lkZXRjbGxpYn0iCi0gICAgIElERVRDTExJQj0iLWxpZGV0Y2wiCi0gICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZXRjbGxpYn0pCi1lbHNlCi0gICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJREVIRElSKQotQUNfU1VCU1QoSURFTElCKQotQUNfU1VCU1QoSURFVENMTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCBhbGwgdGhlIElMVSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lMVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUga2VybmVsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbC9tZXRob2QuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aH0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBrZXJuZWwgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoNSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbHUvcnVudGltZS9rZXJuZWwvaWx1Y29uZi5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWg1PWAoY2QgJGkvaWx1L3J1bnRpbWUva2VybmVsOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoNX0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWg1fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoNX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQysrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jcHAvcmVzb3VyY2UuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoMj1gKGNkICR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvY3BwOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoMn0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWgyfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoMn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQyBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDMsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jL3Jlc291cmNlLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDM9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2MgIDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDN9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoM30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDN9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIEMgcnVudGltZSBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDQsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2MvaWx1Y3N0dWIuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoND1gKGNkICR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9jICA7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWg0fSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDR9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWg0fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVwYXRoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2lsdS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbHVwYXRoPWAoY2QgJGkvaWx1OyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1JTFVUT1A9JHthY19jdl9jX2lsdXBhdGh9Ci0KLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliLFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9rZXJuZWwvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWJ9L2xpYmlsdS5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0gICAKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBDKysgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjIsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWIyPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWIyfS9saWJpbHUtYysrLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIEMgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjMsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2MvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliMz1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjN9L2xpYmlsdS1jLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIFRrIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI0LFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9tYWlubG9vcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWI0PWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL21haW5sb29wOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjR9L2xpYmlsdS10ay5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1bGlifSIgPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiA9IHg7IHRoZW4KLSAgSUxVSERJUj0iIgotZmkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVsaWJ9IiAhPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiAhPSB4OyB0aGVuCi0gICAgSUxVTElCPSItTCR7YWNfY3ZfY19pbHVsaWJ9IC1MJHthY19jdl9jX2lsdWxpYjJ9IC1MJHthY19jdl9jX2lsdWxpYjN9IC1MJHthY19jdl9jX2lsdWxpYjR9IgotZWxzZQotICAgIElMVUxJQj0iIgotZmkKLQotaWYgdGVzdCB4IiR7SUxVTElCfSIgPSB4OyB0aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgbGlicmFyaWVzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcikKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI1LFsKLSAgICBOQVRJVkVfR0NDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBpdCdzIGxpYnJhcmllcwotICAgIGFjX2N2X2NfaWx1bGliNT1gJHtOQVRJVkVfR0NDfSAtLXByaW50LWxpYmdjYyB8IHNlZCAtZSAnczpsaWIvZ2NjLWxpYi8uKjo6J2BsaWIKLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2lsdWxpYjUvbGliaWx1LWMuYSAtbyAtZiAkYWNfY3ZfY19pbHVsaWI1L2xpYmlsdS1jLnNvIDsgdGhlbgotICAgICAgICBpZiB0ZXN0IHgiJHtJTFVIRElSfSIgPSB4OyB0aGVuCi0gICAgICAgICAgICAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVsaWI1fS8uLi9pbmNsdWRlIgotICAgICAgICBmaQotICAgICAgICBJTFVMSUI9Ii1MJHthY19jdl9jX2lsdWxpYjV9IgotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVsaWI1fSkKLSAgICBlbHNlCi0gICAgICAgIGFjX2N2X2NfaWx1bGliPW5vbmUKLSAgICAgICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGZpCi1maV0pCi1BQ19TVUJTVChJTFVIRElSKQotQUNfU1VCU1QoSUxVTElCKQotQUNfU1VCU1QoSUxVVE9QKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgVGhpcyBkZWZpbmVzIHRoZSBieXRlIG9yZGVyIGZvciB0aGUgaG9zdC4gV2UgY2FuJ3QgdXNlCi1kbmwgQUNfQ19CSUdFTkRJQU4sIGNhdXNlIHdlIHdhbnQgdG8gY3JlYXRlIGEgY29uZmlnIGZpbGUgYW5kCi1kbmwgc3Vic3RpdHVlIHRoZSByZWFsIHZhbHVlLCBzbyB0aGUgaGVhZGVyIGZpbGVzIHdvcmsgcmlnaHQKLUFDX0RFRlVOKENZR19BQ19DX0VORElBTiwgWwotQUNfTVNHX0NIRUNLSU5HKHRvIHNlZSBpZiB0aGlzIGlzIGEgbGl0dGxlIGVuZGlhbiBob3N0KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGl0dGxlX2VuZGlhbiwgWwotYWNfY3ZfY19saXR0bGVfZW5kaWFuPXVua25vd24KLSMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCi1BQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPl0sIFsKLSNpZiAhQllURV9PUkRFUiB8fCAhX0JJR19FTkRJQU4gfHwgIV9MSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmXSwgWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0xJVFRMRV9FTkRJQU4gb3Igbm90LgotQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCi0jaWYgQllURV9PUkRFUiAhPSBfTElUVExFX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWZdLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8pCi1dKQotaWYgdGVzdCAke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0gPSB1bmtub3duOyB0aGVuCi1vbGRfY2ZsYWdzPSRDRkxBR1MKLUNGTEFHUz0tZwotQUNfVFJZX1JVTihbCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbMF0gPT0gMSk7Ci19XSwKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj1ubywKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj15ZXMsWwotZG5sIFllcywgdGhpcyBpcyB1Z2x5LCBhbmQgb25seSB1c2VkIGZvciBhIGNhbmFkaWFuIGNyb3NzIGFueXdheS4gVGhpcwotZG5sIGlzIGp1c3QgdG8ga2VlcCBjb25maWd1cmUgZnJvbSBzdG9wcGluZyBoZXJlLgotY2FzZSAiJHtob3N0fSIgaW4KLWNoYW5nZXF1b3RlKCwpCi0gICBpWzM0NTZdODYtKi0qKSBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzIDs7Ci0gICBzcGFyYyotKi0qKSAgICBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8gOzsKLWNoYW5nZXF1b3RlKFssXSkKLSAgKikgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgY3Jvc3MgY29tcGlsZSB0aGlzIHRlc3QpIDs7Ci1lc2FjXSkKLUNGTEFHUz0kb2xkX2NmbGFncwotZmldKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpdHRsZV9lbmRpYW59IiA9IHh5ZXM7IHRoZW4KLSAgICBBQ19ERUZJTkUoTElUVExFX0VORElBTl9IT1NUKQotICAgIEVORElBTj0iQ1lHX0xTQkZJUlNUIjsKLWVsc2UKLSAgICBFTkRJQU49IkNZR19NU0JGSVJTVCI7Ci1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0pCi1BQ19TVUJTVChFTkRJQU4pCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBMb29rIGZvciB0aGUgcGF0aCB0byBsaWJnY2MsIHNvIHdlIGNhbiB1c2UgaXQgdG8gZGlyZWN0bHkgbGluawotZG5sIGluIGxpYmdjYy5hIHdpdGggTEQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHQ0MsCi1bQUNfTVNHX0NIRUNLSU5HKFtMb29raW5nIGZvciB0aGUgcGF0aCB0byBsaWJnY2MuYV0pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIAotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICBnY2NwYXRoPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKLSAgIExJQkdDQz0iLUwke2djY3BhdGh9IgotICAgQUNfTVNHX1JFU1VMVCgke2djY3BhdGh9KQotZWxzZQotICAgTElCR0NDPSIiCi0gICBBQ19NU0dfRVJST1IoTm90IHVzaW5nIGdjYykKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfU1VCU1QoTElCR0NDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgV2FybmluZzogdHJhbnNpdGlvbiBvZiB2ZXJzaW9uIDkgdG8gMTAgd2lsbCBicmVhayB0aGlzIGFsZ29yaXRobQotZG5sIGJlY2F1c2UgMTAgc29ydHMgYmVmb3JlIDkuIFdlIGFsc28gbG9vayBmb3IganVzdCB0Y2wuIFdlIGhhdmUgdG8KLWRubCBiZSBjYXJlZnVsIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggc3R1ZmYgbGlrZSB0Y2xYIGJ5IGFjY2lkZW50LgotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0wsIFsKLSAgICBDWUdfQUNfUEFUSF9UQ0xICi0gICAgQ1lHX0FDX1BBVEhfVENMQ09ORklHCi0gICAgQ1lHX0FDX0xPQURfVENMQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX3RjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRjbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKHRjbGluY2x1ZGUsIFsgIC0td2l0aC10Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX3RjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX3RjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYy90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RjbGNvbmZpZy8kaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGFjX2N2X2NfdGNsY29uZmlnLyRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUY2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICB0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJHRjbHBhdGgvdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgY2hlY2sgaWYgaXRzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQotICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2wuaDsgdGhlbgotICAgICAgICBhY19jdl9jX3RjbGg9JGNjcGF0aAotICAgIGZpCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX0NIRUNLX0hFQURFUih0Y2wuaCwgYWNfY3ZfY190Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY190Y2xoPSIiKQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi1maQotXSkKLSAgVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGNsIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9fdGNsPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190Y2xofWAiCi0JICAgIGFjX2N2X2NfdGNsaD0iYGVjaG8gJHRtcCB8IHNlZCAtZSBzI1xcXFxcXFxcIy8jZ2AiCi0JZmkKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi0gICAgICAgIFRDTEhESVI9Ii1JJHthY19jdl9jX3RjbGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUQ0xIRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIGNvbmZpZ3VyYXRpb24KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RDTENPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGNsY29uZmlnCi1pZiB0ZXN0IHgiJHtub190Y2x9IiA9IHggOyB0aGVuCi0gIGRubCB3ZSByZXNldCBub190Y2wgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RjbD10cnVlCi0gICAgQUNfQVJHX1dJVEgodGNsY29uZmlnLCBbICAtLXdpdGgtdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0Y2wgY29uZmlndXJhdGlvbiAodGNsQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX3RjbGNvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRjbCBjb25maWd1cmF0aW9uIHNjcmlwdF0pCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsY29uZmlnLFsKLQotICAgIGRubCBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHt3aXRoX3RjbGNvbmZpZ307IHB3ZClgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0Y2xDb25maWcuc2hdKQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBkbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgc291cmNlIHRyZWUKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90Y2xDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkc3JjZGlyLyRpL3VuaXg7IHB3ZClgCi0JICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIGxvY2F0aW9ucwotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS90Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICB0Y2xjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICAgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR0Y2xjb25mcGF0aC90Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkaS91bml4L3RjbENvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0JY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCi0gICAgICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2xDb25maWcuc2g7IHRoZW4KLQkgICAgYWNfY3ZfY190Y2xjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBUQ0xDT05GSUc9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUY2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RjbD0iIgotICAgICAgICBUQ0xDT05GSUc9JHthY19jdl9jX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHtUQ0xDT05GSUd9KQotICAgICBmaQotZmkKLUFDX1NVQlNUKFRDTENPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9UQ0xDT05GSUcsIFsKLSAgICAuICRUQ0xDT05GSUcKLQotZG5sIEFDX1NVQlNUKFRDTF9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NQUpPUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NSU5PUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9DQykKLSAgICBBQ19TVUJTVChUQ0xfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKFRDTF9MSUJfRlVMTF9QQVRIKQotICAgIEFDX1NVQlNUKFRDTF9MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9DRkxBR1MpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9FWEVDX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9TSExJQl9DRkxBR1MpCi0gICAgQUNfU1VCU1QoVENMX1NITElCX0xEKQotZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfTERfTElCUykKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfU1VGRklYKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgQUNfU1VCU1QoVENMX0RMX0xJQlMpCi0gICAgQUNfU1VCU1QoVENMX0xEX0ZMQUdTKQotICAgIEFDX1NVQlNUKFRDTF9MRF9TRUFSQ0hfRkxBR1MpCi1kbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQotZG5sIEFDX1NVQlNUKFRDTF9DT01QQVRfT0JKUykKLSAgICBBQ19TVUJTVChUQ0xfUkFOTElCKQotICAgIEFDX1NVQlNUKFRDTF9CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChUQ0xfTElCX1NQRUMpCi1kbmwgQUNfU1VCU1QoVENMX0xJQl9WRVJTSU9OU19PSykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1NIQVJFRF9MSUJfU1VGRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEssIFsKLSAgICBDWUdfQUNfUEFUSF9US0gKLSAgICBDWUdfQUNfUEFUSF9US0NPTkZJRwotICAgIENZR19BQ19MT0FEX1RLQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEtILCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi0jIElmIHRoZSBkaXJlY3RvcnkgKHByZXN1bWFibHkgc3ltbGluaykgbmFtZWQgInRrIiBleGlzdHMsIHVzZSB0aGF0IG9uZQotIyBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlcnMuICBTYW1lIGxvZ2ljIGlzIHVzZWQgd2hlbiBjaG9vc2luZyBsaWJyYXJ5Ci0jIGFuZCBhZ2FpbiB3aXRoIFRjbC4gVGhlIHNlYXJjaCBvcmRlciBpcyB0aGUgYmVzdCBwbGFjZSB0byBsb29rIGZpcnN0LCB0aGVuIGluCi0jIGRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlLiBUaGUgbG9vcCBicmVha3MgaWYgdGhlIHRyaWdnZXIgZmlsZSBpcyBmb3VuZC4KLSMgTm90ZSB0aGUgZ3Jvc3MgbGl0dGxlIGNvbnZlcnNpb24gaGVyZSBvZiBzcmNkaXIgYnkgY2QnaW5nIHRvIHRoZSBmb3VuZAotIyBkaXJlY3RvcnkuIFRoaXMgY29udmVydHMgdGhlIHBhdGggZnJvbSBhIHJlbGF0aXZlIHRvIGFuIGFic29sdXRlLCBzbwotIyByZWN1cnNpdmUgY2FjaGUgdmFyaWFibGVzIGZvciB0aGUgcGF0aCB3aWxsIHdvcmsgcmlnaHQuIFdlIGNoZWNrIGFsbAotIyB0aGUgcG9zc2libGUgcGF0aHMgaW4gb25lIGxvb3AgcmF0aGVyIHRoYW4gbWFueSBzZXBlcmF0ZSBsb29wcyB0byBzcGVlZAotIyB0aGluZ3MgdXAuCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10a2luY2x1ZGUKLSMKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190az10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgodGtpbmNsdWRlLCBbICAtLXdpdGgtdGtpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0ayBoZWFkZXJzIGFyZV0sIHdpdGhfdGtpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190a2gsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfdGtpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS90ay5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljL3RrLmggOyB0aGVuCi0gICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRrIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGtjb25maWcvJGkvZ2VuZXJpYy90ay5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190a2g9YChjZCAkYWNfY3ZfY190a2NvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUayBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90ayogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGtwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0a3BhdGgvdGsqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlci4gV2UgZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZwotICAgIGRubCBBQ19DSEVDS19IRUFERVIsIGNhdXNlIHRoaXMgZG9lc24ndCBkZXBlbmQgaW4gaGF2aW5nIFggY29uZmlndXJlZC4KLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCi0gICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrLmg7IHRoZW4KLQlhY19jdl9jX3RraD0kY2NwYXRoCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RraH0pCi1maQotXSkKLSAgVEtIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRrIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCA7IHRoZW4KLSAgICBub190az0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190a2h9YCIKLQkgICAgYWNfY3ZfY190a2g9ImBlY2hvICR0bXAgfCBzZWQgLWUgcyNcXFxcXFxcXCMvI2dgIgotCWZpCi0gICAgICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kIGluICR7YWNfY3ZfY190a2h9XSkKLSAgICAgICAgVEtIRElSPSItSSR7YWNfY3ZfY190a2h9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUS0hESVIpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9US0NPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGtjb25maWcKLWlmIHRlc3QgeCIke25vX3RrfSIgPSB4IDsgdGhlbgotICBkbmwgd2UgcmVzZXQgbm9fdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RrPXRydWUKLSAgICBBQ19BUkdfV0lUSCh0a2NvbmZpZywgWyAgLS13aXRoLXRrY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0ayBjb25maWd1cmF0aW9uICh0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF90a2NvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRrIGNvbmZpZ3VyYXRpb24gc2NyaXB0XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190a2NvbmZpZyxbCi0KLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGtjb25maWd9L3RrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAke3dpdGhfdGtjb25maWd9OyBwd2QpYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0a0NvbmZpZy5zaF0pCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgIGRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90a0NvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJHNyY2Rpci8kaS91bml4OyBwd2QpYAotCSAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBsb2NhdGlvbnMKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRrIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRpL3RrKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgdGtjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgICAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAkdGtjb25mcGF0aC90ayogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRpL3VuaXgvdGtDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKLSAgICAgICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrQ29uZmlnLnNoOyB0aGVuCi0JICAgIGFjX2N2X2NfdGtjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIFRLQ09ORklHPSIiCi0gICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RrPSIiCi0gICAgICAgIFRLQ09ORklHPSR7YWNfY3ZfY190a2NvbmZpZ30vdGtDb25maWcuc2gKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke1RLQ09ORklHfSkKLSAgICAgZmkKLWZpCi1BQ19TVUJTVChUS0NPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX1RLQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJFRLQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKFRLX1ZFUlNJT04pCi1kbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19NQUpPUl9WRVJTSU9OKQotZG5sICAgIEFDX1NVQlNUKFRLX01JTk9SX1ZFUlNJT04pCi0gICAgQUNfU1VCU1QoVEtfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZVTExfUEFUSCkKLSAgICBBQ19TVUJTVChUS19MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVEtfUFJFRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19FWEVDX1BSRUZJWCkKLSAgICBBQ19TVUJTVChUS19CVUlMRF9JTkNMVURFUykKLSAgICBBQ19TVUJTVChUS19YSU5DTFVERVMpCi0gICAgQUNfU1VCU1QoVEtfWExJQlNXKQotICAgIEFDX1NVQlNUKFRLX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKFRLX0xJQl9TUEVDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTCwgWwotICAgIENZR19BQ19QQVRIX0lUQ0xICi0gICAgQ1lHX0FDX1BBVEhfSVRDTExJQgotICAgIENZR19BQ19QQVRIX0lUQ0xTSAotICAgIENZR19BQ19QQVRIX0lUQ0xNS0lEWAotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIEl0Y2wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggSXRjbCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfaXRjbGNvbmZpZy8kaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY19pdGNsaD1gKGNkICRhY19jdl9jX2l0Y2xjb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkaS9zcmM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19DSEVDS19IRUFERVIoaXRjbC5oLCBhY19jdl9jX2l0Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY19pdGNsaD0iIikKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLWZpCi1dKQotICBJVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IEl0Y2wgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLSAgICAgICAgSVRDTEhESVI9Ii1JJHthY19jdl9jX2l0Y2xofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoSVRDTEhESVIpCi1dKQotCi1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBsaWJyYXJ5Ci1kbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xsaWIKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xMSUIsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1pZiB0ZXN0IHgiJHtub19pdGNsfSIgPSB4IDsgdGhlbgotICAgIGRubCB3ZSByZXNldCBub19pdGNsIGluY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX2l0Y2w9dHJ1ZQotICAgIEFDX0FSR19XSVRIKGl0Y2xsaWIsCi0JWyAgLS13aXRoLWl0Y2xsaWIgICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRjbCBsaWJyYXJ5IGlzXSwKLSAgICAgICAgd2l0aF9pdGNsbGliPSR7d2l0aHZhbH0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRjbCBsaWJyYXJ5XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsbGliLFsKLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsbGliIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgdGVzdCB4IiR7d2l0aF9pdGNsbGlifSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xsaWJ9L2xpYml0Y2wkVENMX1NIQVJFRF9MSUJfU1VGRklYIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7d2l0aF9pdGNsbGlifTsgcHdkKWAvbGliaXRjbCRUQ0xfU0hBUkVEX0xJQl9TVUZGSVgKLQllbHNlCi0JICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsbGlifS9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYIjsgdGhlbgotCSAJYWNfY3ZfY19pdGNsbGliPWAoY2QgJHt3aXRoX2l0Y2xsaWJ9OyBwd2QpYC9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYCi0JICAgIGZpCi0JZmkKLSAgICBmaQotICAgIGRubCB0aGVuIGNoZWNrIGZvciBhICBJdGNsIGxpYnJhcnkuIFNpbmNlIHRoZXNlIGFyZSB1bmluc3RhbGxlZCwKLSAgICBkbmwgdXNlIHRoZSBzaW1wbGUgbGliIG5hbWUgcm9vdC4gCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgaXRjbHBhdGg9JGkvaXRjbAotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC4kVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCi0JICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaXRjbHBhdGgvc3JjOyBwd2QpYAotICAgICAgICBlbGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC5hIjsgdGhlbgotCSAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGl0Y2xwYXRoL3NyYzsgcHdkKWAKLQlmaQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBmb3IgaSBpbiAke2Rpcmxpc3R9OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAke3NyY2Rpcn0vJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIGl0Y2xwYXRoPSR7c3JjZGlyfS8kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR7aXRjbHBhdGh9L2l0Y2wqIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkaS9zcmMvbGliaXRjbCRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KLQkgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpL3NyYzsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbGlmIHRlc3QgLWYgIiRpL3NyYy9saWJpdGNsLmEiOyB0aGVuCi0JICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaS9zcmM7IHB3ZClgCi0JICAgICAgICBicmVhawotCSAgICBmaQkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBkbmwgc2VlIGlmIG9uZSBpcyBjb252ZW5pZW50bHkgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7Y2NwYXRofS9saWJpdGNsJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgotCSAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke2NjcGF0aH07IHB3ZClgCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHtjY3BhdGh9L2xpYml0Y2wuYSI7IHRoZW4KLQkgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHtjY3BhdGh9OyBwd2QpYAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIElUQ0xMSUI9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBJdGNsIGxpYnJhcnkpCi0gICAgZWxzZQotICAgICAgICBJVENMTElCPSItTCR7YWNfY3ZfY19pdGNsbGlifSIKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbGxpYn0pCi0gICAgICAgIG5vX2l0Y2w9IiIKLSAgICBmaQotZmkKLQotQUNfUFJPVklERShbJDBdKQotQUNfU1VCU1QoSVRDTExJQikKLV0pCi0KLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaXRjbF9zaCBzY3JpcHQKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xTSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2l0Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgaXRjbF9zaCBzY3JpcHQpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbHNoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbHNoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsX3NoXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICRpL3NyYzsgcHdkKWAvaXRjbF9zaAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX1BBVEhfUFJPRyhhY19jdl9jX2l0Y2xzaCwgaXRjbF9zaCkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xzaH0pCi1maQotXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIHRoZSBpdGNsX3NoIHNjcmlwdF0pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiAhPSB4IDsgdGhlbgotICAgIG5vX2l0Y2w9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsc2h9KQotICAgIElUQ0xTSD0iJHthY19jdl9jX2l0Y2xzaH0iCi1maQotQUNfU1VCU1QoSVRDTFNIKQotXSkKLQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBpdGNsX3NoIHNjcmlwdAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTE1LSURYLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0KQotQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xta2lkeCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbF9zaF0pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvbGlicmFyeS9pdGNsX21raW5kZXgudGNsIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJGkvbGlicmFyeTsgcHdkKWAvaXRjbF9ta2luZGV4LnRjbAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2Avc2hhcmUKLSAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkY2NwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2l0Y2xfbWtpbmRleC50Y2wgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICRpOyBwd2QpYC9pdGNsX21raW5kZXgudGNsCi0gICAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi1dKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgdGhlIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0XSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xta2lkeH0pCi0gICAgSVRDTE1LSURYPSIke2FjX2N2X2NfaXRjbG1raWR4fSIKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJVENMTUtJRFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSB0aXggc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGl4aW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYLCBbCi0gICAgQ1lHX0FDX1BBVEhfVElYSAotICAgIENZR19BQ19QQVRIX1RJWExJQgotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RJWEgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190aXg9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBUaXggaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSCh0aXhpbmNsdWRlLCBbICAtLXdpdGgtdGl4aW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGl4IGhlYWRlcnMgYXJlXSwgd2l0aF90aXhpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190aXhoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRpeGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF90aXhpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGl4aW5jbHVkZX0vdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWMvdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRpeCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190aXhjb25maWcvJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGl4aD1gKGNkICRhY19jdl9jX3RpeGNvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGl4IHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RpeCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGl4cGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGl4IHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRpeCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0aXhwYXRoL3RpeCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RpeGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0KLSAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyLiBXZSBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nCi0gICAgZG5sIEFDX0NIRUNLX0hFQURFUiwgY2F1c2UgdGhpcyBkb2Vzbid0IGRlcGVuZCBpbiBoYXZpbmcgWCBjb25maWd1cmVkLgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKLSAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGl4Lmg7IHRoZW4KLQlhY19jdl9jX3RpeGg9aW5zdGFsbGVkCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RpeGh9KQotZmkKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUaXggaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCA7IHRoZW4KLSAgICBub190aXg9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190aXhofSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIFRJWEhESVI9Ii1JJHthY19jdl9jX3RpeGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUSVhIRElSKQotXSkKLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRpeCBjb25maWd1cmF0aW9uCi0jIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGl4Y29uZmlnCi0jCi0KLWlmIHRlc3QgeCIke25vX3RpeH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub190aXggaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICBub190aXg9dHJ1ZQotICBBQ19BUkdfV0lUSCh0aXhjb25maWcsIFsgIC0td2l0aC10aXhjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRpeCBjb25maWd1cmF0aW9uICh0aXhDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfdGl4Y29uZmlnPSR7d2l0aHZhbH0pCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIFRpeCBjb25maWd1cmF0aW9uXSkKLSAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4Y29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4Y29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gIGlmIHRlc3QgeCIke3dpdGhfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGl4Y29uZmlnfS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAke3dpdGhfdGl4Y29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGl4Q29uZmlnLnNoXSkKLSAgICBmaQotICBmaQotCi0gICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIFRpeCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJLi4vdGl4IFwKLQkJYGxzIC1kciAuLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCSR7c3JjZGlyfS8uLi90aXggXAotCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90aXhbWzQtOV1dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIFRJWENPTkZJRz0iIyBubyBUaXggY29uZmlncyBmb3VuZCIKLSAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRpeCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICBlbHNlCi0gICAgbm9fdGl4PQotICAgIFRJWENPTkZJRz0ke2FjX2N2X2NfdGl4Y29uZmlnfS90aXhDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUSVhDT05GSUcpCi0gIGZpCi1maQotCi1dKQotCi0jIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSMgZnJvbSBQQVRIX1RJWENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9USVhDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkVElYQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRJWENPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChUSVhfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoVElYX0xJQl9GVUxMX1BBVEgpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgY29uZmlndXJhdGlvbgotIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub19pdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgbm9faXRjbD10cnVlCi0gIEFDX0FSR19XSVRIKGl0Y2xjb25maWcsIFsgIC0td2l0aC1pdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyBpdGNsIGNvbmZpZ3VyYXRpb24gKGl0Y2xDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfaXRjbGNvbmZpZz0ke3dpdGh2YWx9KQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGNsIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsY29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICBpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICR7d2l0aF9pdGNsY29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRjbCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCS4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbC9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgSVRDTENPTkZJRz0iIyBubyBpdGNsIGNvbmZpZ3MgZm91bmQiCi0gICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBpdGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGNsPQotICAgIElUQ0xDT05GSUc9JHthY19jdl9jX2l0Y2xjb25maWd9L2l0Y2xDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVENMQ09ORklHKQotICBmaQotZmkKLQotXSkKLQotIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi0jIGZyb20gUEFUSF9JVENMQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUQ0xDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkSVRDTENPTkZJRyIgOyB0aGVuCi0gICAgICAuICRJVENMQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUQ0xfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoSVRDTF9TSCkKLSAgICBBQ19TVUJTVChJVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKElUQ0xfTElCX0ZVTExfUEFUSCkKLQotXSkKLQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVEtDT05GSUcsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgaXRrIGNvbmZpZ3VyYXRpb24KLSMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGtjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRrfSIgPSB4IDsgdGhlbgotICAjIHdlIHJlc2V0IG5vX2l0ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gIG5vX2l0az10cnVlCi0gIEFDX0FSR19XSVRIKGl0a2NvbmZpZywgWyAgLS13aXRoLWl0a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRrIGNvbmZpZ3VyYXRpb24gKGl0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF9pdGtjb25maWc9JHt3aXRodmFsfSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRrIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGtjb25maWcsWwotCi0gICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGtjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgdGVzdCB4IiR7d2l0aF9pdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGtjb25maWd9L2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICR7d2l0aF9pdGtjb25maWd9OyBwd2QpYAotICAgIGVsc2UKLSAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGtDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRrIGxpYnJhcnkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkuLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyIC4uLy4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAuLi8uLi8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBJVENMQ09ORklHPSIjIG5vIGl0ayBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGs9Ci0gICAgSVRLQ09ORklHPSR7YWNfY3ZfY19pdGtjb25maWd9L2l0a0NvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUS0NPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfSVRLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUS0NPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRJVEtDT05GSUciIDsgdGhlbgotICAgICAgLiAkSVRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUS19CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChJVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoSVRLX0xJQl9GVUxMX1BBVEgpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGxpYmd1aSBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1saWJndWlpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUksIFsKLSAgICBDWUdfQUNfUEFUSF9MSUJHVUlICi0gICAgQ1lHX0FDX1BBVEhfTElCR1VJTElCCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fbGliZ3VpPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgTGliZ3VpIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgobGliZ3VpaW5jbHVkZSwgWyAgLS13aXRoLWxpYmd1aWluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGxpYmd1aSBoZWFkZXJzIGFyZV0sIHdpdGhfbGliZ3VpaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZ3VpaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1saWJndWlpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfbGliZ3VpaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L2d1aXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19saWJndWloPWAoY2QgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2xpYmd1aWluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggTGliZ3VpIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWljb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2xpYmd1aWNvbmZpZy8kaS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgTGliZ3VpIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2xpYmd1aSogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgbGliZ3VpcGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgTGliZ3VpIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIExpYmd1aSwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRsaWJndWlwYXRoL2xpYmd1aSogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICRpL3NyYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKGd1aXRjbC5oLCBhY19jdl9jX2xpYmd1aWg9aW5zdGFsbGVkLCBhY19jdl9jX2xpYmd1aWg9IiIpCi1maQotXSkKLUxJQkdVSUhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBhbnkgTGliZ3VpIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHggOyB0aGVuCi0gICAgbm9fbGliZ3VpPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBMSUJHVUlIRElSPSItSSR7YWNfY3ZfY19saWJndWlofSIKLSAgICBmaQotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWh9KQotQUNfU1VCU1QoTElCR1VJSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIEdVSSBsaWJyYXJ5Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUlMSUIsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkgIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBHVUkgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmd1aS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2xpYmd1aWxpYj1gKGNkICRpL2xpYmd1aS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpCi1dKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpbGlifSIgIT0geCA7IHRoZW4KLSAgICAgR1VJTElCPSIke0dVSUxJQn0gLUwke2FjX2N2X2NfbGliZ3VpbGlifSIKLSAgICAgTElCR1VJTElCPSItbGd1aSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZ3VpbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfU1VCU1QoR1VJTElCKQotQUNfU1VCU1QoTElCR1VJTElCKQotXSkKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hNjhic2QgYi9jb25maWcvbWgtYTY4YnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxMjg5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hNjhic2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1SQU5MSUI9dHJ1ZQotCi0jTm9uZSBvZiB0aGUgQXBvbGxvIGNvbXBpbGVycyBjYW4gY29tcGlsZSBnYXMgb3IgYmludXRpbHMuICBUaGUgcHJlcHJvY2Vzc29yCi0jIGNob2tlcyBvbiBiZmQsIHRoZSBjb21waWxlciB3b24ndCBsZXQgeW91IGFzc2lnbiBpbnRlZ2VycyB0byBlbnVtcywgYW5kCi0jIG90aGVyIHByb2JsZW1zLiAgRGVmaW5pbmcgQ0MgdG8gZ2NjIGlzIGEgcXVlc3Rpb25hYmxlIHdheSB0byBzYXkgImRvbid0IHVzZQotIyB0aGUgYXBvbGxvIGNvbXBpbGVyIiAodGhlIHByZWZlcnJlZCB2ZXJzaW9uIG9mIEdDQyBjb3VsZCBiZSBjYWxsZWQgY2MsCi0jIG9yIHdoYXRldmVyKSwgYnV0IEknbSBub3Qgc3VyZSBsZWF2aW5nIENDIGFzIGNjIGlzIGFueSBiZXR0ZXIuLi4KLQotI0NDPWNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRE5PX1NUREFSRwotQ0M9Z2NjCi0KLUJJU09OPXlhY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXgzODYgYi9jb25maWcvbWgtYWl4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjZDFjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXgzODYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1SQU5MSUIgPSBAOgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFwb2xsbzY4IGIvY29uZmlnL21oLWFwb2xsbzY4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk3ZWQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcG9sbG82OAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotSERFRklORVMgPSAtRFVTRwotUkFOTElCPXRydWUKLUNDPSBjYyAtQSBhbnNpIC1BIHJ1bnR5cGUsYW55IC1BIHN5c3R5cGUsYW55IC1VX19TVERDX18gLURVU0cKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hcm1waWMgYi9jb25maWcvbWgtYXJtcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcm1waWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3h1eCBiL2NvbmZpZy9taC1jeHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIyYTE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1jeHV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBIYXJyaXMgQ1gvVVggNyAoYW5kIG1heWJlIDYpLCBiYXNlZCBvbiBzeXN2NCBjb25maWd1cmF0aW9uLgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKLQotIyBVbmRlciBDWC9VWCwgd2Ugd2FudCB0byB0ZWxsIHRoZSBjb21waWxlciB0byB1c2UgQU5TSSBtb2RlLgotQ0M9Y2MgLVhhCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3lnd2luIGIvY29uZmlnL21oLWN5Z3dpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMDI3Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtY3lnd2luCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUz1hbGwtbGlidGVybWNhcAotRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTPWluc3RhbGwtbGlidGVybWNhcAotCi1hbGwtZ2RiOiBhbGwtbGlidGVybWNhcAotCi1pbnN0YWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZWNzdGF0aW9uIGIvY29uZmlnL21oLWRlY3N0YXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjAxOTIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRlY3N0YXRpb24KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNDID0gY2MgLVdmLC1YTmcxMDAwCi0KLSMgZm9yIFgxMSwgc2luY2UgdGhlIG5hdGl2ZSBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMgYXJlIHJlYWxseSBicm9rZW4gd2hlbgotIyBpdCBjb21lcyB0byBmdW5jdGlvbiBwcm90b3R5cGVzLiAgCi1YMTFfRVhUUkFfQ0ZMQUdTID0gIi1ETmVlZEZ1bmN0aW9uUHJvdG90eXBlcz0wIgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRlbHRhODggYi9jb25maWcvbWgtZGVsdGE4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5YzQ1My4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGVsdGE4OAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotUkFOTElCID0gdHJ1ZQotCi0KLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXggYi9jb25maWcvbWgtZGd1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODVkNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGd1eAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotSERFRklORVM9LURIT1NUX1NZUz1ER1VYX1NZUwotQ0M9Z2NjIC1XYWxsIC1hbnNpIC1EX191c2luZ19ER1VYCi1SQU5MSUI9dHJ1ZQotCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGd1eDM4NiBiL2NvbmZpZy9taC1kZ3V4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTg4NWMzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZ3V4Mzg2CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBmcm9tIG1oLWRndXgKLUhERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKLUNDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAotUkFOTElCID0gdHJ1ZQotCi0jIGZyb20gbWgtc3lzdjQKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQotQ1hYRkxBR1M9LU8KLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCi0KLSMgZnJvbSBhbmdlbGEKLSMgbm8gZGVidWdnaW5nIGR1ZSB0byBicm9rZW4gY29tcGlsZXIsIHVzZSBCU0Qgc3R5bGUgdGltZW9mZGF5Ci1DRkxBR1M9LU8gLURfQlNEX1RJTUVPRkRBWV9GTEFWT1IKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRqZ3BwIGIvY29uZmlnL21oLWRqZ3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIwMDdiLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kamdwcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBXZSBkb24ndCB3YW50IHRvIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb24gRE9TLiAgVW5mb3J0dW5hdGVseSwKLSMgdGhpcyByZXF1aXJlcyB0aGF0IHdlIHNldCBDRkxBR1MuCi0jIFRoaXMgdXNlZCB0byBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi1DRkxBR1M9LU8yCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZWxmYWxwaGFwaWMgYi9jb25maWcvbWgtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwMzAwIGIvY29uZmlnL21oLWhwMzAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE3MjRkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocDMwMAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotIyBBdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIEhQVVggY29tcGlsZXIuCi1DQyA9IGNjIC1XcCwtSDI1NjAwMAotIyBJZiAiYXIiIGluICRQQVRIIGlzIEdOVSBhciwgdGhlIHN5bWJvbCB0YWJsZSBtYXkgbmVlZCByZWJ1aWxkaW5nLgotIyBJZiBpdCdzIEhQL1VYIGFyLCB0aGlzIHNob3VsZCBiZSBoYXJtbGVzcy4KLVJBTkxJQiA9IGFyIHRzCi0KLSMgTmF0aXZlIGNjIGNhbid0IGJvb3RzdHJhcCBnY2Mgd2l0aCAtZy4gIERlZmluaW5nIENGTEFHUyBoZXJlIGxvc2VzIChhKQotIyBmb3Igbm9uLWdjYyBkaXJlY3RvcmllcywgKGIpIGlmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIG5vdAotIyBuYXRpdmUgY2MuICBOZWl0aGVyIChhKSBub3IgKGIpIGhhcyBhIHRyaXZpYWwgZml4IHRob3VnaC4KLQotQ0ZMQUdTID0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4IGIvY29uZmlnL21oLWhwdXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzFjOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwdXgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4OCBiL2NvbmZpZy9taC1ocHV4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MWM5ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHB1eDgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pMzcwcGljIGIvY29uZmlnL21oLWkzNzBwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWkzNzBwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaW50ZXJpeCBiL2NvbmZpZy9taC1pbnRlcml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4ZWNmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pbnRlcml4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBUaGUgc2hlbGwgbWF5IG5vdCBiZSBpbiAvYmluLiAKLVNIRUxMID0gc2gKLVJBTkxJQiA9IHRydWUKLQotIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIEludGVyaXgtaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4gVGhpcyBpcyBhbHNvIGEgd29ya2Fyb3VuZAotIyBmb3IgTEQgY3Jhc2ggd2hlbiBidWlsZGluZyBzaGFyZWQgbGlic3RkYysrLgotQ0ZMQUdTPS1PMgotQ1hYRkxBR1M9LU8yCi0KLSMgV2UgYWxzbyBuZWVkIHRvIG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGxpYmdjYzIgd2lsbCBiZQotIyBidWlsdCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1MSUJHQ0MyX0RFQlVHX0NGTEFHUz0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NCBiL2NvbmZpZy9taC1pcml4NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3MjE0NS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTQueC4KLSMgVGVsbCBjb21waWxlciB0byB1c2UgSyZSIEMuICBXZSBjYW4ndCBjb21waWxlIHVuZGVyIHRoZSBTR0kgQW5zaQotIyBlbnZpcm9ubWVudC4gIEFsc28gYnVtcCBzd2l0Y2ggdGFibGUgc2l6ZSBzbyB0aGF0IGNwLXBhcnNlIHdpbGwKLSMgY29tcGlsZS4gIEJ1bXAgc3RyaW5nIGxlbmd0aCBsaW1pdCBzbyBsaW5rZXIgYnVpbGRzLgotCi1DQyA9IGNjIC1jY2tyIC1XZiwtWE5nMTUwMCAtV2YsLVhOazEwMDAgLVdmLC1YTmgyMDAwIC1XZiwtWE5sODE5MgotU1lTViA9IC1EU1lTVgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg1IGIvY29uZmlnL21oLWlyaXg1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ3Yzk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNS54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg2IGIvY29uZmlnL21oLWlyaXg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1YzE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNi54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBTcGVjaWZ5IHRoZSBBQkksIHRvIGVuc3VyZSB0aGF0IGFsbCBJcml4IDYgc3lzdGVtcyB3aWxsIGJlaGF2ZSB0aGUgc2FtZS4KLSMgQWxzbywgdXNpbmcgLTMyIGF2b2lkcyBidWdzIHRoYXQgZXhpc3QgaW4gdGhlIG4zMi9uNjQgc3VwcG9ydCBpbiBzb21lCi0jIHZlcnNpb25zIG9mIHRoZSBTR0kgY29tcGlsZXIuCi1DQyA9IGNjIC0zMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhvcyBiL2NvbmZpZy9taC1seW54b3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmNiNzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhvcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyAvYmluL2NjIGlzIGxlc3MgdGhhbiB1c2VmdWwgZm9yIG91ciBwdXJwb3Nlcy4gIEFsd2F5cyB1c2UgR0NDCi1DQyA9IC9iaW4vZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueHJzNmsgYi9jb25maWcvbWgtbHlueHJzNmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzkzOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhyczZrCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIEx5bnhPUyBydW5uaW5nIG9uIHRoZSByczYwMDAgZG9lc24ndCBoYXZlIHJhbmxpYgotUkFOTElCID0gdHJ1ZQotCi0jIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKLUNDID0gL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCi0jIC9iaW4vc2ggaXMgdG9vIGJ1Z2d5LCBzbyB1c2UgL2Jpbi9iYXNoIGluc3RlYWQuCi1TSEVMTCA9IC9iaW4vYmFzaApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW02OGtwaWMgYi9jb25maWcvbWgtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1taW5ndzMyIGIvY29uZmlnL21oLW1pbmd3MzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDgzOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW1pbmd3MzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gV2luMzItaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4KLUNGTEFHUz0tTzIKLUNYWEZMQUdTPS1PMgotCi0jIFdlIGFsc28gbmVlZCB0byBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBsaWJnY2MyIHdpbGwgYmUKLSMgYnVpbHQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotTElCR0NDMl9ERUJVR19DRkxBR1M9Ci0KLSMgY3VzdG9tIGluc3RhbGxhdGlvbiBydWxlcyBmb3IgbWluZ3czMiAoYXBwZW5kIC5leGUgdG8gYmluYXJpZXMsIGV0Yy4pCi0jIElOU1RBTExfRE9TUkVMPWluc3RhbGwtZG9zcmVsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmNyMzAwMCBiL2NvbmZpZy9taC1uY3IzMDAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJkODAzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uY3IzMDAwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNCkgc3lzdGVtLgotCi0jIFRoZSBOQ1IgMzAwMCBzaGlwcyB3aXRoIGEgTWV0YVdhcmUgY29tcGlsZXIgaW5zdGFsbGVkIGFzIC9iaW4vY2MuCi0jIFRoaXMgY29tcGlsZXIgbm90IG9ubHkgZW1pdHMgb2Jub3hpb3VzIGNvcHlyaWdodCBtZXNzYWdlcyBldmVyeSB0aW1lCi0jIHlvdSBydW4gaXQsIGJ1dCBpdCBjaG9rZXMgYW5kIGRpZXMgb24gYSB3aG9sZSBidW5jaCBvZiBHTlUgc291cmNlCi0jIGZpbGVzLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgQVQmVCBjb21waWxlciBpbnN0YWxsZWQgaW4gL3Vzci9jY3MvQVRUL2NjLgotIyBVbmZvcnR1bmF0ZWx5IHRob3VnaCwgdGhlIEFUJlQgY29tcGlsZXIgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIHRoYXQKLSMgdGhlIGFzc2VtYmxlciBiYXJmcyBvbiBpZiAtZyBpcyB1c2VkLCBzbyBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYXMgd2VsbC4KLUNDID0gL3Vzci9jY3MvQVRUL2NjCi1DRkxBR1MgPQotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3JzdnI0MyBiL2NvbmZpZy9taC1uY3JzdnI0MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiMDk5MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmNyc3ZyNDMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgSG9zdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFuIE5DUiAzMDAwIChpNDg2L1NWUjQzKSBzeXN0ZW0uCi0KLSMgVGhlIE1ldGFXYXJlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSBjb3B5cmlnaHQgbWVzc2FnZSB1bmxlc3MgeW91Ci0jIHR1cm4gaXQgb2ZmIGJ5IGFkZGluZyB0aGUgLUhub2NvcHlyIGZsYWcuCi1DQyA9IGNjIC1Ibm9jb3B5cgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmVjdjQgYi9jb25maWcvbWgtbmVjdjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODc3MzYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5lY3Y0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBIb3N0IE1ha2VmaWxlIGZyYWdtZW50IGZvciBORUMgTUlQUyBTVlI0LgotCi0jIFRoZSBDIGNvbXBpbGVyIG9uIE5FQyBNSVBTIFNWUjQgbmVlZHMgYmlnZ2VyIHRhYmxlcy4KLUNDID0gY2MgLVpYTmQ9NTAwMCAtWlhOZz0xMDAwCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBORUMgLWxYMTEgbmVlZHMgc29tZSBvdGhlciBsaWJyYXJpZXMuCi1YMTFfRVhUUkFfTElCUyA9IC1sc29ja2V0IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcGFwaWMgYi9jb25maWcvbWgtcGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBwY3BpYyBiL2NvbmZpZy9taC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1yaXNjb3MgYi9jb25maWcvbWgtcmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2YjMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRoaXMgaXMgZm9yIGEgTUlQUyBydW5uaW5nIFJJU0Mvb3MgNC41MkMuCi0KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEdEQiwgYnV0IG5lZWRzIHRvIGJlIGluIHRoZSB0b3AtbGV2ZWwgbWFrZSBiZWNhdXNlCi0jIGlmIGEgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIHRoZSBic2QgaGVhZGVycyBhbmQgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKLSMgc3lzdiBzeXN0ZW0gbGlicmFyaWVzIGFsbCBoZWxsIGNhbiBicmVhayBsb29zZSAoZS5nLiBhIGptcF9idWYgbWlnaHQgYmUKLSMgYSBkaWZmZXJlbnQgc2l6ZSkuCi0jIHB0cmFjZSgyKSBhcHBhcmVudGx5IGhhcyBwcm9ibGVtcyBpbiB0aGUgQlNEIGVudmlyb25tZW50LiAgTm8gd29ya2Fyb3VuZCBpcwotIyBrbm93biBleGNlcHQgdG8gc2VsZWN0IHRoZSBzeXN2IGVudmlyb25tZW50LiAgQ291bGQgd2UgdXNlIC9wcm9jIGluc3RlYWQ/Ci0jIFRoZXNlICJzeXN2IGVudmlyb25tZW50cyIgYW5kICJic2QgZW52aXJvbm1lbnRzIiBvZnRlbiBlbmQgdXAgYmVpbmcgYSBwYWluLgotIwotIyBUaGlzIGlzIG5vdCBwYXJ0IG9mIENGTEFHUyBiZWNhdXNlIHBlcmhhcHMgbm90IGFsbCBDIGNvbXBpbGVycyBoYXZlIHRoaXMKLSMgb3B0aW9uLgotQ0M9IGNjIC1zeXN0eXBlIHN5c3YKLQotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNjbyBiL2NvbmZpZy9taC1zY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzM3YzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNjbworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBZb3UgbWF5IG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSBiaXNvbi4KLSMgQklTT04gPSB5YWNjIC1TbTEwNDAwCi0jIFRoZSBuYXRpdmUgQyBjb21waWxlciBib3RjaGVzIHNvbWUgc2ltcGxlIHVzZXMgb2YgY29uc3QuICBVbmZvcnR1bmF0ZWx5LAotIyBpdCBkb2Vzbid0IGRlZmluZWQgYW55dGhpbmcgbGlrZSAiX19zY29fXyIgZm9yIHVzIHRvIHRlc3QgZm9yIGluIGFuc2lkZWNsLmguCi1DQyA9IGNjIC1EY29uc3Q9Ci0KLVgxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxtIC1saW50bCAtbG1hbGxvYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNvbGFyaXMgYi9jb25maWcvbWgtc29sYXJpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiZWE1NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc29sYXJpcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTdW5zIHJ1bm5pbmcgU29sYXJpcyAyCi0KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbCAtbHNvY2tldApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNwYXJjcGljIGIvY29uZmlnL21oLXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRiYzIyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zdW4zIGIvY29uZmlnL21oLXN1bjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDUxNTUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN1bjMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgU3VuJ3MgQyBjb21waWxlciBuZWVkcyB0aGUgLUogZmxhZyB0byBiZSBhYmxlIHRvIGNvbXBpbGUgY3AtcGFyc2UuYwotIyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBqdW1wIHRhYmxlcyAoLUogc2F5cyB0byB1c2UgYSAzMiBiaXQgdGFibGUpCi1DQyA9IGNjIC1KCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdiBiL2NvbmZpZy9taC1zeXN2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIxMTg3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NCBiL2NvbmZpZy9taC1zeXN2NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNjY1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y1IGIvY29uZmlnL21oLXN5c3Y1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzOGU1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2NQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNCAtRFNWUjUKLVJBTkxJQiA9IHRydWUKLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtdmF4dWx0MiBiL2NvbmZpZy9taC12YXh1bHQyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUyZGM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC12YXh1bHQyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFRoZSBvbGQgQlNEIHBjYyBpc24ndCB1cCB0byBjb21waWxpbmcgcGFydHMgb2YgZ2RiIHNvIHVzZSBnY2MKLUNDID0gZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgteDg2cGljIGIvY29uZmlnL21oLXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy1taC1tcHcgYi9jb25maWcvbXB3LW1oLW1wdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZWY0Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3LW1oLW1wdworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIFRoaXMgaXMgYW4gTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCi0jIFNpbmNlIHRoZXJlIGFyZSBhIG11bHRpcGxpY2l0eSBvZiBNYWMgY29tcGlsZXJzIGFuZCB0d28gZGlmZmVyZW50Ci0jIHByb2Nlc3NvcnMsIHRoaXMgZmlsZSBpcyBwcmltYXJpbHkgYSBsaWJyYXJ5IG9mIG9wdGlvbnMgZm9yIGVhY2gKLSMgY29tcGlsZXIuICBTb21lYm9keSBlbHNlIChzdWNoIGFzIGEgY29uZmlndXJlIG9yIGJ1aWxkIHNjcmlwdCkgd2lsbAotIyBtYWtlIHRoZSBhY3R1YWwgY2hvaWNlLgotCi0jIENvbXBpbGVyIHRvIHVzZSBmb3IgY29tcGlsaW5nLgotCi1DQ19NUFdfQyA9IEMgLWQgTVBXX0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC13Ci0KLUNDX1NDID0gU0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC1pICcnIC1pIDoKLQotQ0NfTVdDNjhLID0gTVdDNjhLIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZiAtbWM2ODAyMCAtbW9kZWwgZmFyCi0KLUNDX1BQQ0MgPSBQUENDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtdwotCi1DQ19NUkMgPSBNckMgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1pICcnIC1pIDogLWptCi0KLUNDX1NNckMgPSBTTXJDIC1kIE1QVwotCi0jICItbXB3X2NoYXJzIiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHTlUgc291cmNlcyBvZnRlbiBtaXggc2lnbmVkIGFuZAotIyB1bnNpZ25lZCBjYXN1YWxseS4KLSMgIi13IG9mZiIgaXMgbm90IGEgZ3JlYXQgaWRlYSwgYnV0IENXNyBpcyBjb21wbGFpbmluZyBhYm91dCBlbnVtCi0jIGFzc2lnbm1lbnRzLgotIyAiLW9wdCBnbG9iYWwscGVlcCxsNCxzcGVlZCIgaXMgc29tZXRpbWVzIGdvb2QsIGFuZCBzb21ldGltZXMgYmFkLgotIyBXZSBtdXN0IHVzZSB7Q0luY2x1ZGVzfSBzbyB0aGF0IE1QVyB0b29scyB3aWxsIHdvcms7IHtNV0NJbmNsdWRlc30KLSMgZGVmaW5lcyBzdGRvdXQsIGlzbG93ZXIsIGV0YywgaW4gd2F5cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBNUFcncwotIyBydW50aW1lLiAgSG93ZXZlciwgdGhpcyBjYW5ub3QgYmUgZG9uZSB2aWEgIC1pICJ7Q0luY2x1ZGVzfSIsIHNpbmNlCi0jIHRoYXQgZG9lcyBub3QgYWZmZWN0IGhvdyA8Pi10eXBlIGluY2x1ZGVzIGhhcHBlbjsgaW5zdGVhZCwgdGhlIHZhcmlhYmxlCi0jIE1XQ0luY2x1ZGVzIG11c3QgYmUgc2V0IHRvIHBvaW50IGF0IHtDSW5jbHVkZXN9LgotCi1DQ19NV0NQUEMgPSBNV0NQUEMgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmCi0KLSMgTm90ZSB0aGF0IEdDQyBkb2VzICpub3QqIHdpcmUgaW4gYSBkZWZpbml0aW9uIG9mICJwYXNjYWwiLCBzbyB0aGF0Ci0jIGl0IGNhbiBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5IGlmIGRlc2lyZWQuCi0KLUNDXzY4S19HQ0MgPSBnQyAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKLQotQ0NfUFBDX0dDQyA9IGdDIC1EcG93ZXJjPTEgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCi0KLSMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgQ0ZMQUdTLgotCi1DRkxBR1MgPSAKLQotIyBUb29sIHRvIHVzZSBmb3IgbWFraW5nIGxpYnJhcmllcy9hcmNoaXZlcy4KLQotQVJfTElCID0gTGliCi0KLUFSX01XTElOSzY4SyA9IE1XTGluazY4SyAteG0gbGlicmFyeQotCi1BUl9QUENMSU5LID0gUFBDTGluayAteG0gbGlicmFyeQotCi1BUl9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXhtIGxpYnJhcnkKLQotQVJfQVIgPSBhcgotCi1BUl9GTEFHUyA9IC1vCi0KLVJBTkxJQl9OVUxMID0gbnVsbC1jb21tYW5kCi0KLVJBTkxJQl9SQU5MSUIgPSByYW5saWIKLQotIyBDb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZy4KLQotQ0NfTERfTElOSyA9IExpbmsgLXcgLWQgLW1vZGVsIGZhciB7Q0NfTERfVE9PTF9GTEFHU30KLQotQ0NfTERfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uIC1tb2RlbCBmYXIKLQotQ0NfTERfUFBDTElOSyA9IFBQQ0xpbmsgLW1haW4gX19zdGFydCAtb3V0cHV0Zm9ybWF0IHhjb2ZmCi0KLUNDX0xEX01XTElOS1BQQyA9IE1XTGlua1BQQyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbgotCi1DQ19MRF9HTEQgPSBnQwotCi0jIEV4dGVuc2lvbiBmb3IgbGlua2VyIG91dHB1dC4KLQotUFJPR19FWFRfNjhLID0KLQotUFJPR19FWFRfWENPRkYgPSAueGNvZmYKLQotIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBMREZMQUdTLgotCi1MREZMQUdTID0gLXcKLQotQ0NfTERfVE9PTF9GTEFHUyA9IC1jICdNUFMgJyAtdCBNUFNUCi0KLSMgTGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4KLQotIyBJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgbWF0aCBsaWJyYXJpZXMgYXJlIG5vdAotIyBuZWVkZWQgZXhjZXB0IHRvIHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzY2FsYiwKLSMgd2hpY2ggaXMgY2FsbGVkIGZyb20gbGRleHAsIHdoaWNoIGlzIHJlZmVyZW5jZWQKLSMgaW4gdGhlIG02OGsgb3Bjb2RlcyBsaWJyYXJ5LgotCi1FWFRSQUxJQlNfQyA9IFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iVG9vbExpYnMubwotCi1FWFRSQUxJQlNfTVdDNjhLID0gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7TVc2OEtMaWJyYXJpZXN9TVBXIEFOU0kgKDRpKSBDLjY4Sy5MaWIiCi0KLUVYVFJBTElCU19QUENfWENPRkYgPSBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJNYXRoTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLQotRVhUUkFMSUJTX1BQQyA9IFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotCi1FWFRSQUxJQlNfTVdDUFBDID0gXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTVdTdGRDUnVudGltZS5MaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vCi0KLSMgVG9vbCB0byBtYWtlIFBFRiB3aXRoLCBpZiBuZWVkZWQuCi0KLU1BS0VQRUZfTlVMTCA9IG51bGwtY29tbWFuZAotCi1NQUtFUEVGX1BQQyA9IE1ha2VQRUYKLQotTUFLRVBFRl9GTEFHUyA9IFxPcHRpb24tZAotCS1sIEludGVyZmFjZUxpYi54Y29mZj1JbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JLWwgTWF0aExpYi54Y29mZj1NYXRoTGliIFxPcHRpb24tZAotCS1sIFN0ZENMaWIueGNvZmY9U3RkQ0xpYgotCi1NQUtFUEVGX1RPT0xfRkxBR1MgPSAtZnQgTVBTVCAtZmMgJ01QUyAnCi0KLSMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlLgotCi1SRVpfNjhLID0gUmV6Ci0KLVJFWl9QUEMgPSBSZXogLWQgV0FOVF9DRlJHCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nIGIvY29uZmlnL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGVmYmYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1UdWUgTm92IDI2IDEyOjM0OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEZpeCBzb21lIGNvbW1lbnRzLgotCi1Nb24gU2VwIDE2IDE0OjQyOjUyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKEhMREVOVik6IEVkaXQgb3V0IGFsbCByZWZlcmVuY2VzLgotCi1UaHUgQXVnIDE1IDE5OjQ5OjIzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogdHJ1ZTogTmV3IHNjcmlwdCwgaWRlbnRpY2FsIHRvIG1wdy10cnVlLgotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIGFuZCBAU0VHTUVOVF9GTEFHKClACi0JdG8gdGhlIGVkaXRvcnMgZm9yIGNvbXBpbGUgY29tbWFuZHMuCi0KLVRodSBBdWcgIDEgMTU6MDE6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctdHJ1ZSwgbXB3LXRvdWNoLCBudWxsLWNvbW1hbmQ6IE5ldyBzY3JpcHRzLgotCSogUkVBRE1FOiBEZXNjcmliZSB1c2FnZSBpbiBtb3JlIGRldGFpbC4KLQotVHVlIERlYyAxMiAxNDo1MTo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBEb24ndCBlZGl0IG91dCAidmVyc2lvbj0iIG9jY3VycmVuY2VzLgotCi1GcmkgRGVjICAxIDExOjQ2OjE4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKGJpbmRpciwgbGliZGlyKTogRWRpdCB0aGUgcG9zaXRpb25zIG9mCi0JcGF0aG5hbWUgc2VwYXJhdG9ycyB0byB3b3JrIHdpdGggb3RoZXIgcGF0aG5hbWVzIGJldHRlci4KLQotVHVlIE5vdiAgNyAxNTowODowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgY29tbWVudCBhYm91dCBEdXBsaWNhdGUgdnMgQ2F0ZW5hdGUsCi0JYWRkIGFkZGl0aW9uYWwgcGF0dGVybiBmb3IgZWRpdGluZyBsaW5rLWNvbXBpbGUgY29tbWFuZHMuCi0KLVR1ZSBPY3QgMjQgMTQ6Mjg6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIGhhbmRsaW5nIGZvciAqLnRhYi5baGNdIGZpbGVzLgotCShDSElMTF9GT1JfVEFSR0VULCBDSElMTF9MSUIpOiBFZGl0IG91dCB0cmlja3kgZGVmaW5pdGlvbnMKLQlvZiB0aGVzZS4KLQotVGh1IFNlcCAyOCAyMTowNToxMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZ2VuZXJpYyBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlCi0JVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGUgc3ludGF4LgotCi1GcmkgTWFyIDE3IDExOjUxOjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBDbGFyaWZ5IGluc3RydWN0aW9ucy4KLQkqIGZpOiBSZW1vdmUuCi0KLVdlZCBEZWMgMjEgMTU6NDU6NTMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNb3ZlSWZDaGFuZ2UsIFJFQURNRSwgZmksIGZvcndhcmQtaW5jbHVkZSwgb3Blbi1icmFjZSwKLSAgICAgICAgdHItN3RvOC1zcmM6IE5ldyBmaWxlcy4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlIGIvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmMxMjUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFJlbmFtZSBhIGZpbGUgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBhIHByZXZpb3VzbHkgZXhpc3RpbmcKLSMgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgbWFrZSBmcm9tIGRvaW5nCi0jIHRvbyBtdWNoIHdvcmsgaWYgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBoYXZlbid0IGNoYW5nZWQuCi0KLSMgVGhpcyBpcyBhbiBNUFcgdHJhbnNsYXRpb24gb2YgdGhlIHN0YW5kYXJkIEdOVSBzaCBzY3JpcHQgbW92ZS1pZi1jaGFuZ2UuCi0KLVNldCBleGl0IDAKLQotSWYgImBleGlzdHMgLWYgInsyfSJgIgotICBDb21wYXJlICJ7MX0iICJ7Mn0iID5kZXY6bnVsbAotICBJZiB7c3RhdHVzfSAhPSAwCi0gICAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi0gIEVsc2UKLSAgICBFY2hvICJ7Mn0iIGlzIHVuY2hhbmdlZAotICAgIERlbGV0ZSAtaSAteSAiezF9IgotICBFbmQKLUVsc2UKLSAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi1FbmQKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvUkVBRE1FIGIvY29uZmlnL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDcwMGEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBNUFcgc2NyaXB0cyBhbmQgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgdG8KLWJ1aWxkIEN5Z251cyBHTlUgdG9vbHMgZm9yIE1QVy4gIFRoZSBzY3JpcHRzIHNob3VsZCBiZSBzb21ld2hlcmUgb24gdGhlCi1jb21tYW5kIHBhdGg7IG91ciB1c3VhbCBwcmFjdGljZSBoYXMgYmVlbiB0byBoYXZlIGEgc2VwYXJhdGUgZGlyZWN0b3J5Ci1mb3IgdGhlIHNjcmlwdHMsIGFuZCBwdXQgdGhlIHRvb2xzIChieWFjYywgZmxleCwgYW5kIHNlZCBhdCBsZWFzdCkgdGhlcmUKLWFsc287IHRoZW4gaXQncyBlYXNpZXIgdG8gZHJhZyB0aGUgc3VwcG9ydCBiaXRzIGFyb3VuZCBhcyBhIGdyb3VwLCBvciB0bwotdXBncmFkZSBNUFcgdmVyc2lvbnMuICBUaGUgY29tcGxldGUgcGFja2FnZSBvZiBzY3JpcHRzIGFuZCB0b29sIGJpbmFyaWVzCi1pcyB1c3VhbGx5IGF2YWlsYWJsZSBhcyBwdWIvbWFjL2J1aWxkdG9vbHMuY3B0LmhxeCBvbiBmdHAuY3lnbnVzLmNvbS4KLQotInRyLTd0bzgtc3JjIiBpcyBhY3R1YWxseSB0aGUgc291cmNlIHRvIGFuIE1QVyBzY3JpcHQgdGhhdCB0cmFuc2Zvcm1zCi1zZXF1ZW5jZXMgbGlrZSAiXE9wdGlvbi1kIiBpbnRvIHRoZSBhY3R1YWwgOC1iaXQgY2hhcnMgdGhhdCBNUFcgbmVlZHMuCi1JdCdzIG9ubHkgdGhlIHNvdXJjZSBiZWNhdXNlIGl0IGNhbid0IGl0c2VsZiBpbmNsdWRlIGFueSA4LWJpdCBjaGFycy4KLUl0ICpjYW4qIGJlIHByb2Nlc3NlZCBpbnRvIGEgZ2VudWluZSAidHItN3RvOCIgYnkgdXNpbmcgaXRzZWxmOgotCi0JdHItN3RvOCB0ci03dG84LXNyYyB8IHNlZCAtZSAncy9TcmMvLycgPm5ldy10ci03dG84Ci0KLVVzZSB0aGlzIHRvIHZlcmlmeToKLQotCWNvbXBhcmUgdHItN3RvOCBuZXctdHItN3RvOAotCi1JZiB5b3UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgdHItN3RvOCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5Ci1yZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiXE9wdGlvbi1kIiB3aXRoIHJlYWwgT3B0aW9uLWQgKHdoaWNoIGxvb2tzCi1saWtlIGEgZGVsdGEpLCB0aGVuIGRvIHNpbWlsYXJseSB3aXRoIGFsbCB0aGUgb3RoZXIgIlxPcHRpb24tLi4uIgotc3RyaW5ncywgYW5kIHRoZW4gY2hhbmdlICJcU3JjT3B0aW9uLWQiIGludG8gdGhlIHN0cmluZyAiXE9wdGlvbi1kIi4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlIGIvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDZiZDcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUVjaG8gJyNpbmNsdWRlJyC2IiJ7MX0itiIgPiJ7Mn0iLnRlbQotTW92ZUlmQ2hhbmdlICJ7Mn0iLnRlbSAiezJ9IgotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkIGIvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkM2M3Ny4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZXMuCi0jIFRoZXNlIGFyZSBub21pbmFsbHkgZ2VuZXJpYywgYnV0IHdvcmsgYmVzdCBvbiB0aGUgbWFrZWZpbGVzIHVzZWQKLSMgZm9yIEdOVSBwcm9ncmFtcy4KLQotIyBXaGFjayBvdXQgYW55IGNvbW1lbnRlZC1vdXQgbGluZXMgdGhhdCBhcmUgcHJvYmFibHkgY29tbWFuZHM7Ci0jIHRoZXkgY2FuIG9ubHkgY2F1c2UgdHJvdWJsZSBsYXRlciBvbi4KLS9eIwkvZAotCi0jIENoYW5nZSBkZXBlbmRlbmN5IGNoYXIuCi0vOiQvcy86LyBcXE9wdGlvbi1mL2cKLS9eW14gCTojXVteOl0qOi9zL1woWyAJXSpcKTpcKFsgCV0qXCkvIFxcT3B0aW9uLWYgL2cKLQotIyBDaGFuZ2Ugc3ludGF4IG9mIE1ha2VmaWxlIHZhcnMuCi0vXCQvcy9cJHtcKFthLXpBLVowLTlfLV0qXCl9L3tcMX0vZwotL1wkL3MvXCQoXChbYS16QS1aMC05Xy1dKlwpKS97XDF9L2cKLS8gJEAvcy8gJEAvIHtUYXJnfS8KLQotIyBEb3VibGUtJCBhcmUgbGl0ZXJhbHMgdG8gVW5peCBidXQgbm90IHRvIE1QVyBtYWtlLgotL1wkXCQvcy9cJFwkLyQvZwotCi0jIENoYW5nZSBwYXRobmFtZSBzeW50YXguCi0vXC8vcyxcLlwuL1wvXC5cLi8sOjo6LGcKLS9cLy9zLFwuXC4vLDo6LGcKLS9cLlwvL3MsXC4vLDosZwotL1wvL3MsLyw6LGcKLSMgVW5kbyBleGNlc3MgY2hhbmdlcy4KLS9hbmQvcyxhbmQ6b3IkLGFuZC9vciwKLS9hbmQvcyxhbmQ6b3IgLGFuZC9vciAsCi0vd2FudC9zLHdhbnQ6bmVlZCx3YW50L25lZWQsCi0jIEZpeGluZyB1cCBzZWQgY29tbWFuZHMuCi0vLWUvc18iOlwoW146XSpcKTpkIl8iL1wxL2QiX2cKLS8tZS9zXyI6XChbXjpdKlwpOiw6XChbXjpdKlwpOmQiXyIvXDEvLC9cMi9kIl9nCi0KLS89L3MvID0gXC4kLyA9IDovCi0KLSMgTWFrZSB0aGVzZSBnbyBhd2F5IHNvIHRoYXQgbGF0ZXIgZWRpdHMgbm90IGNvbmZ1c2VkLgotL0hMREVOVi9zL3tITERFTlZ9Ly8KLQotIyBDb21tZW50IG91dCBhbnkgZXhwbGljaXQgc3JjZGlyIHNldHRpbmcuCi0vc3JjZGlyL3MvXnNyY2Rpci8jIHNyY2Rpci8KLQotL0JBU0VESVIvcy9eQkFTRURJUiA9LiokL0JBU0VESVIgPSAie3NyY3Jvb3R9Ii8KLS97QkFTRURJUn06L3Mve0JBU0VESVJ9Oi97QkFTRURJUn0vZwotL3tzcmNkaXJ9Oi9zL3tzcmNkaXJ9Oi8ie3NyY2Rpcn0iL2cKLS8ie3NyY2Rpcn0iOi9zLyJ7c3JjZGlyfSI6LyJ7c3JjZGlyfSIvZwotCi0jIFR3ZWFrIHNvbWUgY29udmVudGlvbnMgdGhhdCBhcmUgYmFja3dhcmRzIGZvciB0aGUgTWFjLgotL2JpbmRpci9zL3tleGVjX3ByZWZpeH06YmluL3tleGVjX3ByZWZpeH1iaW46LwotL2xpYmRpci9zL3tleGVjX3ByZWZpeH06bGliL3tleGVjX3ByZWZpeH1saWI6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmdzIG9mIGFueXRoaW5nIHNldCBieSBtcHcgaG9zdCBjb25maWcuCi0vQ0Mvcy9eQ0MgKj0vI0NDID0vCi0vQ0ZMQUdTL3MvXkNGTEFHUyAqPS8jQ0ZMQUdTID0vCi0vQVIvcy9eQVIgKj0vI0FSID0vCi0vQVJfRkxBR1Mvcy9eQVJfRkxBR1MgKj0vI0FSX0ZMQUdTID0vCi0vUkFOTElCL3MvXlJBTkxJQiAqPS8jUkFOTElCID0vCi0vQ0NfTEQvcy9eQ0NfTEQgKj0vI0NDX0xEID0vCi0vTERGTEFHUy9zL15MREZMQUdTICo9LyNMREZMQUdTID0vCi0KLSMgQ2hhbmdlIC1JIHVzYWdlcy4KLS8tSS9zLy1JXC4vLWkgOi9nCi0vLUkvcy8tSTo6YmZkLy1pIDo6YmZkOi9nCi0vLUkvcy8tSTo6aW5jbHVkZS8taSA6OmluY2x1ZGU6L2cKLS8tSS9zLy1JLy1pIC9nCi0KLSMgQ2hhbmdlIC1EIHVzYWdlLgotLy1EL3MvXChbID1dXCktRFwoW14gXSpcKS9cMS1kIFwyL2cKLQotIyBDaGFuZ2UgY29udGludWF0aW9uIGNoYXIuCi0vXFwkL3MvXFwkL1xcT3B0aW9uLWQvCi0KLSMgQ2hhbmdlIHdpbGRjYXJkIGNoYXIuCi0vXCovcy9cKi9cXE9wdGlvbi14L2cKLQotIyBDaGFuZ2UgcGF0aCBvZiB2YXJpb3VzIHR5cGVzIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMgcnVsZSBkb2VzIG5vdCBhbGxvdwotIyBmb3IgZmlsZSBuYW1lcyB3aXRoIG11bHRpcGxlIGRvdHMgaW4gdGhlIG5hbWUuCi0vXC5bY2hseV0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpL1wxIntzfSJcMi5cMy9nCi0vXC5bY2hseV0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLlwoW2NobHldXCkvIntzfSJcMS5cMi8KLSMgQWxsb3cgZmlsZXMgbmFtZWQgKi50YWIuW2NoXSBhcyBhIHNwZWNpYWwgY2FzZS4KLS9cLnRhYlwuW2NoXS9zL1woWyAJPjw9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvXDEie3N9IlwyLlwzL2cKLS9cLnRhYlwuW2NoXS9zL15cKFstYS16QS1aMC05XyR7fToiXSpcLnRhYlwpXC5cKFtjaF1cKS8ie3N9IlwxLlwyLwotIyBGaXggc29tZSBvdmVyZW50aHVzaWFzbXMuCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c3JjZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpZGlyfS8ie1wxZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpRElSfS8ie1wxRElSfSIvZwotL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKWRpcn0iLyJ7XDFkaXJ9Ii9nCi0ve3N9L3MvIntzfSIie1woW2EtekEtWjAtOV9dKlwpRElSfSIvIntcMURJUn0iL2cKLS97c30vcy8ie3N9IjovOi9nCi0ve3N9L3MvXiJ7c30iLy9nCi0ve3N9L3MvIntzfSIie3N9Ii8ie3N9Ii9nCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c30iL2cKLS97c30vcy8ie3NyY2Rpcn0iIntzfSIvIntzfSIvZwotCi0jIFRoZSAuZGVmIGZpbGVzIGFyZSBhbHNvIHR5cGljYWxseSBzb3VyY2UgZmlsZXMuCi0vXC5kZWYvcy9cKFsgCT48XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi9cMSJ7c30iXDIuZGVmL2cKLS9cLmRlZi9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuZGVmLyJ7c30iXDEuZGVmL2cKLQotIyBDaGFuZ2UgZXh0ZW5zaW9uIGFuZCBwYXRoIG9mIG9iamVjdHMuCi0vXC5vL3MvXChbIAk9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLm8vXDEie299IlwyLmMuby9nCi0vXC5vL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vLyJ7b30iXDEuYy5vLwotIyBBbGxvdyAqLnRhYi5vIGZpbGVzIGFzIGEgc3BlY2lhbCBjYXNlIG9mIGEgMi1kb3QtbmFtZSBmaWxlLgotL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC50YWJcLm8vXDEie299IlwyLnRhYi5jLm8vZwotL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vLyJ7b30iXDEudGFiLmMuby8KLSMgQ2xlYW4gdXAuCi0vIntvfSIvcy8ie299IiJ7b30iLyJ7b30iL2cKLS8ie299Ii9zL14ie299IlwoW2EtekEtWjAtOV9dKlwpPS9cMT0vCi0KLSMgQ2hhbmdlIGV4dGVuc2lvbiBvZiBsaWJzLgotL1wuYS9zL2xpYlwoW2Etel0qXClcLmEvbGliXDEuby9nCi0KLSMgUmVtb3ZlIG5vbi1mYWlsIG9wdGlvbi4KLS8tL3MvXlwoWyAJXSpcKS0vXDEvCi0jIEZpeCBvdmVyZWFnZXJuZXNzZXMgLSBhc3N1bWVzIG5vIG9uZS1sZXR0ZXIgY29tbWFuZHMuCi0vXlsgCV0qW2Etel0gL3MvXlwoWyAJXSpcKVwoW2Etel1cKSAvXDEtXDIgLwotCi0jIFJlbW92ZSBub24tZWNobyBvcHRpb24uICh3YXRjaCBvdXQgZm9yIGF1dG9jb25mIHRoaW5ncykKLS9AL3MvXlwoWyAJXSpcKUAvXDEvCi0KLSMgQ2hhbmdlIGNwIHRvIER1cGxpY2F0ZS4KLSMgQ2F0ZW5hdGUgaXMgcGVyaGFwcyBtb3JlIGFjY3VyYXRlLCBidXQgdGhlIHBhdHRlcm4gd291bGQgaGF2ZSB0bwotIyBpZGVudGlmeSB0aGUgb3V0cHV0IGZpbGUgYW5kIGFkZCBhICc+JyByZWRpcmVjdGlvbiBpbnRvIGl0LgotL2NwL3MvXlwoWyAJXSpcKWNwIC9cMUR1cGxpY2F0ZSAtZCAteSAvCi0jIENoYW5nZSBtdiB0byBSZW5hbWUuCi0vbXYvcy9eXChbIAldKlwpbXYgL1wxUmVuYW1lIC15IC8KLS9SZW5hbWUvcy9eXChbIAldKlwpUmVuYW1lIC15IC1mL1wxUmVuYW1lIC15LwotIyBDaGFuZ2Ugcm0gdG8gRGVsZXRlLgotL3JtIC1yZi9zL15cKFsgCV0qXClybSAtcmYgL1wxRGVsZXRlIC1pIC15IC8KLS9ybSAtZi9zL15cKFsgCV0qXClybSAtZiAvXDFEZWxldGUgLWkgLXkgLwotL3JtL3MvXlwoWyAJXSpcKXJtIC9cMURlbGV0ZSAtaSAteSAvCi0jIE5vdGUgdGhhdCB3ZSBkb24ndCBtZXNzIHdpdGggbG4gLSBkaXJlY3Rvcnktc3BlY2lmaWMgc2NyaXB0cwotIyBtdXN0IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggc3ltbGlua3MuCi0jIENoYW5nZSBjYXQgdG8gQ2F0ZW5hdGUuCi0vY2F0L3MvXlwoWyAJXSpcKWNhdCAvXDFDYXRlbmF0ZSAvCi0jIENoYW5nZSB0b3VjaCB0byBtcHctdG91Y2guCi0vdG91Y2gvcy9eXChbIAldKlwpdG91Y2ggL1wxbXB3LXRvdWNoIC8KLSMgQ2hhbmdlIG1rZGlyIHRvIE5ld0ZvbGRlci4KLS9ta2Rpci9zL15cKFsgCV0qXClta2RpciAvXDFOZXdGb2xkZXIgLwotIyBDaGFuZ2UgdmFyIHNldHRpbmcgdG8gU2V0LgotLz0vcy9eXChbIAldKlwpXChbLWEtekEtWjAtOV9dKlwpPVwoW147XSpcKTsgXFxPcHRpb24tZC9cMVNldCBcMiBcMy8KLQotIyBDaGFuZ2UgdGVzdHMuCi0vaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICEgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqdGhlbiBcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLQotL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotCi0vaWYgL3MvaWYgXFsgLWQgXChbXiBdKlwpIF0gKjsgdGhlbiB0cnVlICo7IGVsc2UgbWtkaXIgXChbXiA7XSpcKSAqOyBmaS9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIgTmV3Rm9sZGVyIFwyIEVuZCBJZi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSA9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgPT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAhPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLQotL15bIAldKmVsc2UgdHJ1ZSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQotCi0vZWxzZS9zL15cKFsgCV0qXCllbHNlWyAJXSokL1wxRWxzZS8KLS9lbHNlL3MvXlwoWyAJXSpcKWVsc2VbOyAJXSpcXE9wdGlvbi1kJC9cMUVsc2UvCi0KLS9eWyAJXSplbHNlWyAJXSp0cnVlWyAJXSokL2NcCi0JRWxzZVwKLQkJbXB3LXRydWUKLQotL15bIAldKmVsc2VbIAldKnRydWVbOyAJXSpmaSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQlFbmQgSWYKLQotL2ZpL3MvXlwoWyAJXSpcKWZpICokL1wxRW5kLwotL2ZpL3MvXlwoWyAJXSpcKWZpICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotCi0jIENoYW5nZSBsb29waW5nLgotL2Zvci9zL15cKFsgCV0qXClmb3IgXChbLWEtekEtWjAtOV9dKlwpIGluIFwoW147XSpcKTsgKmRvICpcXE9wdGlvbi1kL1wxRm9yIFwyIEluIFwzLwotL15cKFsgCV0qXClkbyAqXFxPcHRpb24tZC9kCi0vZG9uZS9zL15cKFsgCV0qXClkb25lICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotL2RvbmUvcy9eXChbIAldKlwpZG9uZSQvXDFFbmQvCi0KLSMgVHJhaWxpbmcgc2VtaWNvbG9ucyBhbmQgY29udGludWVkIGxpbmVzIGFyZSB1bm5lZWRlZCBzaCBzeW50YXguCi0vOyBcXE9wdGlvbi1kL3MvOyBcXE9wdGlvbi1kLy8KLQotIyBDaGFuZ2UgbW92ZS1pZi1jaGFuZ2UgdG8gTW92ZUlmQ2hhbmdlLgotL21vdmUtaWYtY2hhbmdlL3MvXChbXiAJXSpcKW1vdmUtaWYtY2hhbmdlL01vdmVJZkNoYW5nZS9nCi0KLSMgQ2hhbmdlICQoU0hFTEwpIHRvIHRoZSBzY3JpcHQgbmFtZSBieSBpdHNlbGYuCi0vU0hFTEwvcy9eXChbIAldKlwpe1NIRUxMfSAvXDEvCi0KLSMgQ2hhbmdlIHN5bnRheCBvZiBkZWZhdWx0IHJ1bGUgZGVwZW5kZW5jeS4KLS9eXC5jXC5vL3MvXlwuY1wubyBcXE9wdGlvbi1mJC8uYy5vIFxcT3B0aW9uLWYgLmMvCi0KLSMgQ2hhbmdlIGRlZmF1bHQgcnVsZSdzIGFjdGlvbi4KLS97Q0N9IC1jL3Mve0NDfSAtYyBcKC4qXCkgXCQ8JC97Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyBcMSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm8vCi0KLSMgVGhpcyBpcyBwcmV0dHkgZGlzZ3VzdGluZywgYnV0IEkgY2FuJ3Qgc2VlbSB0byBkZXRlY3QgZW1wdHkgcnVsZXMuCi0vT3B0aW9uLWYkL3MvT3B0aW9uLWYkL09wdGlvbi1mIF9vbGRlc3QvZwotCi0jIFJlbW92ZSAtYyBmcm9tIGV4cGxpY2l0IGNvbXBpbGVyIGNhbGxzLiAoYnV0IHNob3VsZCBub3QgaWYgR0NDKQotIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKVwuYy97XDFDQ31cMiBAREFTSF9DX0ZMQUdAIFwzIlw0Ilw1LmMgLW8gIntvfSJcNS5jLm8vCi0jIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNvdXJjZSBmaWxlIHRoYXQgaXMgInt4eHh9ImRpcjpmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKTpcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNTpcNi5jIC1vICJ7b30iXDYuYy5vLwotCi0jIENoYW5nZSBsaW5raW5nIGNjIHRvIGxpbmtpbmcgc2VxdWVuY2UuCi0vLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKXtMREZMQUdTfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDUgLW8gXDZ7UFJPR19FWFR9IFw3XAotXDF7TUFLRVBFRn0gXDZ7UFJPR19FWFR9IC1vIFw2IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcNi5yIC1vIFw2IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w2JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLS8tby9zL15cKFsgCV0qXCl7Q0N9IFwoLipcKXtcKFtBLVpfXSpcKUNGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKXtMREZMQUdTfSBcKC4qXCkkL1wxe0NDX0xEfSBcMiB7XDNDRkxBR1N9IFw0IHtMREZMQUdTfSBcNiAtbyBcNXtQUk9HX0VYVH0gXDdcCi1cMXtNQUtFUEVGfSBcNXtQUk9HX0VYVH0gLW8gXDUge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9Ilw1LnIgLW8gXDUgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDUnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotLy1vL3MvXlwoWyAJXSpcKXtIT1NUX0NDfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtIT1NUX0NDX0xEfSBcMiAtbyBcM3tQUk9HX0VYVH0gXDRcCi1cMXtNQUtFUEVGfSBcM3tQUk9HX0VYVH0gLW8gXDMge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9IlwzLnIgLW8gXDMgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDMnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotCi0jIENvbW1lbnQgb3V0IC5OT0VYUE9SVCBydWxlcy4KLS9cLk5PRVhQT1JUL3MvXlwuTk9FWFBPUlQvI1wuTk9FWFBPUlQvCi0jIENvbW1lbnQgb3V0IC5QSE9OWSBydWxlcy4KLS9cLlBIT05ZL3MvXlwuUEhPTlkvI1wuUEhPTlkvCi0jIENvbW1lbnQgb3V0IC5QUkVDSU9VUyBydWxlcy4KLS9cLlBSRUNJT1VTL3MvXlwuUFJFQ0lPVVMvI1wuUFJFQ0lPVVMvCi0jIENvbW1lbnQgb3V0IC5TVUZGSVhFUyBydWxlcy4KLS9cLlNVRkZJWEVTL3MvXlwuU1VGRklYRVMvI1wuU1VGRklYRVMvCi0KLSMgU2V0IHRoZSBpbnN0YWxsIHByb2dyYW0gYXBwcm9wcmlhdGVseS4KLS9JTlNUQUxML3MvXklOU1RBTEwgKj0gKmAuKmA6aW5zdGFsbC5zaCAtYy9JTlNUQUxMID0gRHVwbGljYXRlIC15LwotCi0jIERvbid0IHRyeSB0byBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIHRyZWUncyBvd24gdG9vbHMuCi0vYmlzb24vcy9gLipiaXNvbjpiaXNvbi4qYC9iaXNvbiAteS8KLS9ieWFjYy9zL2AuKmJ5YWNjOmJ5YWNjLipgL2J5YWNjLwotL2ZsZXgvcy9gLipmbGV4OmZsZXguKmAvZmxleC8KLQotIyBUdXJuIHRyYW5zZm9ybWVkIEMgY29tbWVudHMgaW4gZWNobyBjb21tYW5kcyBiYWNrIGludG8gY29tbWVudHMuCi0vZWNoby9zLGVjaG8gJ1woLipcKTpcXE9wdGlvbi14XCguKlwpXFxPcHRpb24teDpcKC4qXCknLGVjaG8gJ1wxLypcMiovXDMnLAotCi0jIFdoYWNrIG91dCB2YXJpb3VzIGNsZXZlciBleHByZXNzaW9ucyB0aGF0IHNlYXJjaCBmb3IgdG9vbHMsIHNpbmNlCi0jIHRoZSBjbGV2ZXIgY29kZSBpcyB0b28gL2Jpbi9zaCBzcGVjaWZpYy4KLQotL15BUl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1BUl9GT1JfVEFSR0VUID0gOjpiaW51dGlsczphclwKLQotCi0vXlJBTkxJQl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1SQU5MSUJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6cmFubGliXAotCi0KLS9eUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IC8sL3JhbmxpYiBdICkkL2NcCi1SQU5MSUJfVEVTVF9GT1JfVEFSR0VUID0gXAotCi0KLS9eRVhQRUNUID0gYC8sL2AkL2NcCi1FWFBFQ1QgPSBcCi0KLQotL15SVU5URVNUID0gYC8sL2AkL2NcCi1SVU5URVNUID0gXAotCi0KLS9eQ0NfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ0NfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNYWF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DWFhfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNISUxMX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNISUxMX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DSElMTF9MSUIgPSBgLywvYCQvY1wKLUNISUxMX0xJQiA9IFwKLQotL3Nhbml0L3Mve3N0YXJ0LXNhbml0Li4uLVthLXowLTldKn0vLwotL3Nhbml0L3Mve2VuZC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KLQotIyBBZGQgc3RhbmRhcmQgZGVmaW5lcyBhbmQgZGVmYXVsdCBydWxlcy4KLS9eIyBzcmNkaXIvYVwKLVwKLXMgPSAie3NyY2Rpcn0iXAotXAotbyA9IDpcCi1cCi0ie299IiBcXE9wdGlvbi1mIDogIntzfSIKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9tcHctdG91Y2ggYi9jb25maWcvbXB3L21wdy10b3VjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2E1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L21wdy10b3VjaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyAiVG91Y2giIGNvbW1hbmQuCi0KLUlmICJgRXhpc3RzICJ7MX0iYCIgIT0gIiIKLQlTZXRGaWxlIC1tIC4gInsxfSIKLUVsc2UKLQlFY2hvICcgJyA+ICJ7MX0iCi1FbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDRjOGUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L29wZW4tYnJhY2UgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDY1ZGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9vcGVuLWJyYWNlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgotIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCi0KLUVjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYjY0OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TdHJlYW1FZGl0IC1lIFxPcHRpb24tZAotICAnL1xPcHRpb24teC8gXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1kLyAiXE9wdGlvbi1kXE9wdGlvbi1kIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWYvICJcT3B0aW9uLWRcT3B0aW9uLWYiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tOC8gIlxPcHRpb24tZFxPcHRpb24tOCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi01LyAiXE9wdGlvbi1kXE9wdGlvbi01IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXgvICJcT3B0aW9uLWRcT3B0aW9uLXgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tci8gIlxPcHRpb24tZFxPcHRpb24tciIgLWMgXE9wdGlvbi01JyAgXE9wdGlvbi1kCi0gICJ7MX0iCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RydWUgYi9jb25maWcvbXB3L3RydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXQtYWl4NDMgYi9jb25maWcvbXQtYWl4NDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjc1MGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWFpeDQzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEFJWCA0LjMgYW5kIGFib3ZlIHJlcXVpcmVzIC1YMzJfNjQgZmxhZyB0byBhbGwgYXIgYW5kIG5tIGNvbW1hbmRzCi0jIHRvIGhhbmRsZSBib3RoIDMyLWJpdCBhbmQgNjQtYml0IG9iamVjdHMuCi1BUl9GT1JfVEFSR0VUPWFyIC1YMzJfNjQKLU5NX0ZPUl9UQVJHRVQ9bm0gLVgzMl82NApkaWZmIC0tZ2l0IGEvY29uZmlnL210LWFybXBpYyBiL2NvbmZpZy9tdC1hcm1waWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWFybXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWQzMHYgYi9jb25maWcvbXQtZDMwdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0Yjc3NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtZDMwdgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSMgVHVybiBvZmYgd2FybmluZ3MgYWJvdXQgc3ltYm9scyBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMKLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcyAtV2EsLUMKLSBDWFhGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWVsZmFscGhhcGljIGIvY29uZmlnL210LWVsZmFscGhhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1lbGZhbHBoYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWkzNzBwaWMgYi9jb25maWcvbXQtaTM3MHBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtaTM3MHBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWxpbnV4IGIvY29uZmlnL210LWxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDllNmYxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBXaGVuIHVzaW5nIGdsaWJjIDIgb24gTGludXggd2UgbXVzdCBhbHdheXMgdXNlIHZ0YWJsZSB0aHVua3MuCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykgLWZ2dGFibGUtdGh1bmtzIC1EX0dOVV9TT1VSQ0UKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1tNjhrcGljIGIvY29uZmlnL210LW02OGtwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW02OGtwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1uZXR3YXJlIGIvY29uZmlnL210LW5ldHdhcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODJmOWIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW5ldHdhcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HREJfTkxNX0RFUFMgPSBhbGwtZ2NjIGFsbC1sZApkaWZmIC0tZ2l0IGEvY29uZmlnL210LW9zcGFjZSBiL2NvbmZpZy9tdC1vc3BhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDkxMDQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW9zcGFjZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wYXBpYyBiL2NvbmZpZy9tdC1wYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtcGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wcGNwaWMgYi9jb25maWcvbXQtcHBjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wcGNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1zcGFyY3BpYyBiL2NvbmZpZy9tdC1zcGFyY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWMyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtc3BhcmNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC12ODEwIGIvY29uZmlnL210LXY4MTAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGE2YzIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXY4MTAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUNDX0ZPUl9UQVJHRVQgPSBjYTczMiAtYW5zaQotQVNfRk9SX1RBUkdFVCA9IGFzNzMyCi1BUl9GT1JfVEFSR0VUID0gYXI3MzIKLVJBTkxJQl9GT1JfVEFSR0VUID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXdpbmNlIGIvY29uZmlnL210LXdpbmNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdkNjdiLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC13aW5jZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRm9yIFdpbmRvd3MgQ0UsIHdlIG5lZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gdGhhdCBjb252ZXJ0cywgY29waWVzLAotIyBhbmQgcmVuYW1lcyB0aGUgcGxhdGZvcm0gU0RLIGZpbGVzIGludG8gZ2NjIGRpcmVjdG9yaWVzLgotCi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUzo9JChFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUykgYWxsLXV0aWxzCi1FWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVM6PSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKSBpbnN0YWxsLXV0aWxzCi0KLWFsbC11dGlscyA6IGFsbC1saWJpYmVydHkKLQotaW5zdGFsbC11dGlscyA6IGFsbC1saWJpYmVydHkKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXg4NnBpYyBiL2NvbmZpZy9tdC14ODZwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXg4NnBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmJkMWExLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMjIyBXQVJOSU5HOiB0aGlzIGZpbGUgY29udGFpbnMgZW1iZWRkZWQgdGFicy4gIERvIG5vdCBydW4gdW50YWJpZnkgb24gdGhpcyBmaWxlLgotCi0jIENvbmZpZ3VyYXRpb24gc2NyaXB0Ci0jIENvcHlyaWdodCAoQykgMTk4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCi0KLSMKLSMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KLSMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgotIwotIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCi0jIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKLSMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgotIwotCi1leHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCi0KLXJlbW92ZT1ybQotaGFyZF9saW5rPWxuCi1zeW1ib2xpY19saW5rPSdsbiAtcycKLQotI2ZvciBUZXN0Ci0jcmVtb3ZlPSJlY2hvIHJtIgotI2hhcmRfbGluaz0iZWNobyBsbiIKLSNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgotCi0jIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgotCi1NYWtlZmlsZT1NYWtlZmlsZQotTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KLWFyZ3VtZW50cz0KLWJ1aWxkX2FsaWFzPQotY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKLWNhY2hlX2ZpbGVfb3B0aW9uPQotY29uZmlnZGlycz0KLWV4dHJhY29uZmlnZGlycz0KLWRpcm9wdGlvbnM9Ci1leGVjX3ByZWZpeD0KLWV4ZWNfcHJlZml4b3B0aW9uPQotZmF0YWw9Ci1mbG9hdGluZ19wb2ludD1kZWZhdWx0Ci1nYXM9ZGVmYXVsdAotZ2NjX3ZlcnNpb249Ci1nY2NfdmVyc2lvbl90cmlnZ2VyPQotaG9zdF9hbGlhcz1OT0hPU1QKLWhvc3RfbWFrZWZpbGVfZnJhZz0KLW1vdmVpZmNoYW5nZT0KLW5vcmVjdXJzaW9uPQotb3RoZXJfb3B0aW9ucz0KLXBhY2thZ2VfbWFrZWZpbGVfZnJhZz0KLXBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KLXByZWZpeD0vdXNyL2xvY2FsCi1wcm9nbmFtZT0KLXByb2dyYW1fcHJlZml4PQotcHJvZ3JhbV9wcmVmaXhvcHRpb249Ci1wcm9ncmFtX3N1ZmZpeD0KLXByb2dyYW1fc3VmZml4b3B0aW9uPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249Ci1yZWRpcmVjdD0KLXJlbW92aW5nPQotc2l0ZT0KLXNpdGVfbWFrZWZpbGVfZnJhZz0KLXNpdGVfb3B0aW9uPQotc3JjZGlyPQotc3JjdHJpZ2dlcj0KLXN1YmRpcnM9Ci10YXJnZXRfYWxpYXM9Tk9UQVJHRVQKLXRhcmdldF9tYWtlZmlsZV9mcmFnPQotdW5kZWZzPU5PVU5ERUZTCi12ZXJzaW9uPSIkUmV2aXNpb24kIgoteDExPWRlZmF1bHQKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCi0KLSMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQotIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQotIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgotIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgotY2FzZSAiJHtPU1RZUEV9IiBpbgotKndpbjMyKikKLSAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCi0gICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgotICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgotCUNPTkZJR19TSEVMTD0ke1NIRUxMfQotCWV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGVsc2UKLQlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KLQkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLQkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0JICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0JICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgotCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCi0JICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKLQlkb25lCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWNvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1OT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKLQotIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KLSMjCi0jIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCi0jIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgotIyMKLSMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKLSMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KLSMjCi0KLXByb2duYW1lPSQwCi0jIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KLWlmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQotCi1jYXNlICIke3Byb2duYW1lfSIgaW4KLS8qKSA7OwotKi8qKSA7OwotKikKLSAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAotICAgICAgICA7OwotZXNhYwotCi0jIExvb3Agb3ZlciBhbGwgYXJncwotCi13aGlsZSA6Ci1kbwotCi0jIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCi0JY2FzZSAkIyBpbgotCTApCi0JCWJyZWFrCi0JCTs7Ci0JZXNhYwotCi0jIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQotCW9wdGlvbj0kMQotCXNoaWZ0Ci0KLSMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCi0Jb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qKSA7OwotCS0qKSBvcHRpb249LSRvcHRpb24gOzsKLQllc2FjCi0JCQotIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qPSopCi0JCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKLSMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKLQktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKLQkJb3B0YXJnPSQxCi0JCXNoaWZ0Ci0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCi0JCTs7Ci0JLS12KQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCi0JCTs7Ci0JLS0qKQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKLQkJOzsKLQllc2FjCi0KLSMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCi0JY2FzZSAkb3B0aW9uIGluCi0KLQktLWJpKikKLQkJYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWJ1aWxkKiB8IC0tYnUqKQotCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCi0JCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1jYWNoZSopCi0JCWNhY2hlX2ZpbGU9JG9wdGFyZwotCQk7OwotCS0tZGEqKQotCQlkYXRhZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1kaXNhYmxlLSopCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JCWV2YWwgJGVuYWJsZW9wdD1ubwotCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS1lbmFibGUtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKLQkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgotCQk7OwotCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCi0JCWV4ZWNfcHJlZml4PSRvcHRhcmcKLQkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLWdhcyB8IC0tZyopCi0JCWdhcz15ZXMKLQkJOzsKLQktLWhlbHAgfCAtLWhlKikKLQkJZmF0YWw9eWVzCi0JCTs7Ci0JLS1ob3N0KiB8IC0taG8qKQotCQljYXNlICRob3N0X2FsaWFzIGluCi0JCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1pbmMqKQotCQlpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1pbmYqKQotCQlpbmZvZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1saWJkKikKLQkJbGliZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmUqKQotCQlsaWJleGVjZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1sbyopCi0JCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLW1hKikKLQkJbWFuZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLW5mcCB8IC0tbmYqKQotCQlmbG9hdGluZ19wb2ludD1ubwotCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCi0JCTs7Ci0JLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCQlub3JlY3Vyc2lvbj15ZXMKLQkJOzsKLQktLW9sKikKLQkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tcHJlZml4KiB8IC0tcHJlKikKLQkJcHJlZml4PSRvcHRhcmcKLQkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQotCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCi0JCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCi0JCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQotCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCi0JCTs7Ci0JLS1ybSkKLQkJcmVtb3Zpbmc9LS1ybQotCQk7OwotCS0tc2IqKQotCQlzYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaCopCi0JCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JCXJlZGlyZWN0PSI+L2Rldi9udWxsIgotCQl2ZXJib3NlPS0tc2lsZW50Ci0JCTs7Ci0JLS1zaXRlKiB8IC0tc2l0KikKLQkJc2l0ZT0kb3B0YXJnCi0JCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKLQkJOzsKLQktLXNyY2RpciovIHwgLS1zciovKQotICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCi0gICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKLSAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCi0gICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgotCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKLQkJOzsKLQktLXNyY2RpciogfCAtLXNyKikKLQkJc3JjZGlyPSRvcHRhcmcKLQkJOzsKLQktLXN5KikKLQkJc3lzY29uZmRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgotCQk7OwotCS0tdGFyZ2V0KiB8IC0tdGEqKQotCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLXRtcGRpciogfCAtLXRtKikKLQkJVE1QRElSPSRvcHRhcmcKLQkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgotCQk7OwotCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JCXJlZGlyZWN0PQotCQl2ZXJib3NlPS0tdmVyYm9zZQotCQk7OwotCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCi0JCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKLQkJZXhpdCAwCi0JCTs7Ci0JLS13aXRoLSopCi0JCWNhc2UgIiRvcHRpb24iIGluCi0JCSo9KikJOzsKLQkJKikJb3B0YXJnPXllcyA7OwotCQllc2FjCi0KLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXdpdGhvdXQtKikKLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD1ubwotCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS14KQl3aXRoX3g9eWVzCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCi0JCTs7Ci0JLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCi0JCTs7Ci0JLS0qKQotCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCi0JCWV4aXQgMQotCQk7OwotCSopCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQllc2FjCi1kb25lCi0KLSMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUwotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KLQotY2FzZSAiJHtmYXRhbH0iIGluCi0iIikKLQkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKLQkjIHNhbWUgdGltZS4KLQljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KLQlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQotCQk7OwotCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCi0JICAgZmF0YWw9eWVzCi0JICAgYnJlYWsgMgotCQk7OwotCWVzYWMKLQotCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgotCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQlOT0hPU1QpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgotCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KLQkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCi0JCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCi0JCQl0aGVuCi0JCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCi0JCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKLQkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KLQkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQotCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KLQkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJCQlOT1RBUkdFVCkgOzsKLQkJCQkqKQotCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCi0JCQkJCXRoZW4KLQkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcwotCQkJCQlmaQotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCi0JCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCWVsc2UKLQkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCi0JCQkJZmF0YWw9eWVzCi0JCQlmaQotCQkJOzsKLQkJKikKLQkJCWhvc3RfYWxpYXM9JHVuZGVmcwotCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCXVuZGVmcz1OT1VOREVGUwotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQotCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKLQkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCi0JY2FzZSAkdGFyZ2V0X2FsaWFzIGluCi0JTk9UQVJHRVQpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcwotCQkJOzsKLQkJKikKLQkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCTs7Ci0JCWVzYWMKLQllc2FjCi0JOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KLQlleGVjIDE+JjIKLQllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQotCWVjaG8KLQllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KLQllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKLQllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJwotCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKLQllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKLQllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJwotCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCi0JZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKLQllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJwotCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKLQllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCi0JZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJwotCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKLQllY2hvCi0JZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJwotCWVjaG8KLQlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLQkJY2F0IGNvbmZpZy5zdGF0dXMKLQlmaQotCi0JZXhpdCAxCi1maQotCi1jb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCi1tb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAotdG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAotCi0KLSMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KLWlmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0gICAgICAgIHRydWUKLWVsc2UKLSAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLXRvdWNoIGNvbmZpZy5qdW5rCi1pZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi1ybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKQotCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0JIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KLQlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCi0JCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgotCQlleGl0IDEKLQlmaQotCXB3ZD1gcHdkYAotCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAotCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgotCQlzcmNkaXI9LgotCWZpCi1lc2FjCi0KLSMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCi0KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIuIikgOzsKLSopCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotZXNhYwotCi0KLSMgZGVmYXVsdCBleGVjX3ByZWZpeAotY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0iIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7Ci0qKSA7OwotZXNhYwotCi0jIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKLSMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgotaWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgotICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCi0gICAgZ2NjX3ZlcnNpb249YGdyZXAgdmVyc2lvbl9zdHJpbmcgJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXJ9IHwgc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJ2AKLWVsc2UKLSAgICAjIElmIGdjYydzIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgZGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUuCi0gICAgaWYgWyAtZiAke3RvcHNyY2Rpcn0vZ2NjL3ZlcnNpb24uYyBdIDsgdGhlbgotCWdjY192ZXJzaW9uX3RyaWdnZXI9JHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMKLQlnY2NfdmVyc2lvbj1gZ3JlcCB2ZXJzaW9uX3N0cmluZyAke2djY192ZXJzaW9uX3RyaWdnZXJ9IHwgc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJ2AKLQljYXNlICIkYXJndW1lbnRzIiBpbgotCSAgKi0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyKiApCi0JICAgIDs7Ci0JICAqICkKLQkgICAgIyBNYWtlIHN1cmUgY29uZmlndXJlLmluIGtub3dzIGFib3V0IHRoaXMuCi0JICAgIGFyZ3VtZW50cz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJGFyZ3VtZW50cyIKLQkgICAgOzsKLQllc2FjCi0Jd2l0aG9wdGlvbnM9Ii0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyICR3aXRob3B0aW9ucyIKLSAgICBmaQotZmkKLQotIyMjIGJyZWFrIHVwICR7c3JjZGlyfS9jb25maWd1cmUuaW4uCi1jYXNlICJgZ3JlcCAnXiMgcGVyXC1ob3N0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbmAiIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyAke3NyY2Rpcn0vY29uZmlndXJlLmluIGhhcyBubyBcInBlci1ob3N0OlwiIGxpbmUuIDE+JjIKLQkjIENoZWNrIGZvciBhIGRpcmVjdG9yeSB0aGF0J3MgYmVlbiBjb252ZXJ0ZWQgdG8gdXNlIGF1dG9jb25mIHNpbmNlCi0JIyBpdCB3YXMgbGFzdCBjb25maWd1cmVkLgotCWlmIGdyZXAgQUNfT1VUUFVUICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPi9kZXYvbnVsbCA7IHRoZW4KLQkgIGVjaG8gJyoqKicgSG1tLCBsb29rcyBsaWtlIHRoaXMgZGlyZWN0b3J5IGhhcyBiZWVuIGF1dG9jb25maXNjYXRlZC4gMT4mMgotCSAgaWYgWyAtciAke3NyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuCi0JICAgIGVjaG8gJyoqKicgUnVubmluZyB0aGUgbG9jYWwgY29uZmlndXJlIHNjcmlwdC4gMT4mMgotCSAgICBjYXNlICIke2NhY2hlX2ZpbGV9IiBpbgotCSAgICAiIikgY2FjaGVfZmlsZV9vcHRpb249IDs7Ci0JICAgICopICBjYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPSR7Y2FjaGVfZmlsZX0iIDs7Ci0JICAgIGVzYWMKLQkgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke3NyY2Rpcn0iCi0JICAgIGNhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgotCSAgICAiIikgYnVpbGRvcHQ9IDs7Ci0JICAgICopICBidWlsZG9wdD0iLS1idWlsZD0ke2J1aWxkX2FsaWFzfSIgOzsKLQkgICAgZXNhYwotCSAgICBldmFsIGV4ZWMgJHtjb25maWdfc2hlbGx9ICR7c3JjZGlyfS9jb25maWd1cmUgJHt2ZXJib3NlfSBcCi0JCSR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGFyZ2V0X2FsaWFzfSBcCi0JCSR7cHJlZml4b3B0aW9ufSAke3RtcGRpcm9wdGlvbn0gJHtleGVjX3ByZWZpeG9wdGlvbn0gXAotCQkke3NyY2Rpcm9wdGlvbn0gJHtkaXJvcHRpb25zfSBcCi0JCSR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259IFwKLQkJJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSAke3NpdGVfb3B0aW9ufSBcCi0JCSR7d2l0aG9wdGlvbnN9ICR7d2l0aG91dG9wdGlvbnN9IFwKLQkJJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSBcCi0JCSR7Y2FjaGVfZmlsZV9vcHRpb259ICR7cmVtb3Zpbmd9ICR7b3RoZXJfb3B0aW9uc30gJHtyZWRpcmVjdH0KLQkgIGVsc2UKLQkgICAgZWNobyAnKioqJyBUaGVyZSBpcyBubyBjb25maWd1cmUgc2NyaXB0IHByZXNlbnQgdGhvdWdoLiAxPiYyCi0JICBmaQotCWZpCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiYGdyZXAgJ14jIHBlclwtdGFyZ2V0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbmAiIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyAke3NyY2Rpcn0vY29uZmlndXJlLmluIGhhcyBubyBcInBlci10YXJnZXQ6XCIgbGluZS4gMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgIiR7VE1QRElSfSIgaW4KLSIiKSBUTVBESVI9L3RtcCA7IGV4cG9ydCBUTVBESVIgOzsKLSopIDs7Ci1lc2FjCi0KLSMga2VlcCB0aGlzIGZpbGVuYW1lIHNob3J0IGZvciAmJSolJCojIDE0IGNoYXIgZmlsZSBuYW1lcyBhbmQgOCszIGZpbGUgbmFtZXMKLXRtcGZpbGU9JHtUTVBESVJ9L2NOZiQkCi0jIE5vdGUgdGhhdCB1bmRlciBtYW55IHZlcnNpb25zIG9mIHNoIGEgdHJhcCBoYW5kbGVyIGZvciAwIHdpbGwgKm92ZXJyaWRlKiBhbnkKLSMgZXhpdCBzdGF0dXMgeW91IGV4cGxpY2l0bHkgc3BlY2lmeSEgIEF0IHRoaXMgcG9pbnQsIHRoZSBvbmx5IG5vbi1lcnJvciBleGl0Ci0jIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdDsgdGhlc2UgYWN0aW9ucyBhcmUgZHVwbGljYXRlZCB0aGVyZSwgbWludXMKLSMgdGhlICJleGl0IDEiLiAgRG9uJ3QgdXNlICJleGl0IDAiIGFueXdoZXJlIGFmdGVyIHRoaXMgd2l0aG91dCByZXNldHRpbmcgdGhlCi0jIHRyYXAgaGFuZGxlciwgb3IgeW91J2xsIGxvc2UuCi10cmFwICJybSAtZiBNYWtlZmlsZS50ZW0gJHt0bXBmaWxlfS5jb20gJHt0bXBmaWxlfS50Z3QgJHt0bXBmaWxlfS5oc3QgJHt0bXBmaWxlfS5wb3M7IGV4aXQgMSIgMCAxIDIgMTUKLQotIyBzcGxpdCAke3NyY2Rpcn0vY29uZmlndXJlLmluIGludG8gY29tbW9uLCBwZXItaG9zdCwgcGVyLXRhcmdldCwKLSMgYW5kIHBvc3QtdGFyZ2V0IHBhcnRzLiAgUG9zdC10YXJnZXQgaXMgb3B0aW9uYWwuCi1zZWQgLWUgJy9eIyBwZXJcLWhvc3Q6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0uY29tCi1zZWQgLWUgJzEsL14jIHBlclwtaG9zdDovZCcgLWUgJy9eIyBwZXJcLXRhcmdldDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5oc3QKLWlmIGdyZXAgJ14jIHBvc3QtdGFyZ2V0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgotICBzZWQgLWUgJzEsL14jIHBlclwtdGFyZ2V0Oi9kJyAtZSAnL14jIHBvc3RcLXRhcmdldDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS50Z3QKLSAgc2VkIC1lICcxLC9eIyBwb3N0XC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnBvcwotZWxzZQotICBzZWQgLWUgJzEsL14jIHBlclwtdGFyZ2V0Oi9kJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS50Z3QKLSAgZWNobyA+JHt0bXBmaWxlfS5wb3MKLWZpCi0KLSMjIyBkbyBjb21tb24gcGFydCBvZiBjb25maWd1cmUuaW4KLQotIyBJZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXIgZG9lcyBub3QgZXhpc3QsIGJ1dCB0aGUgImdjYyIgZGlyZWN0b3J5IGRvZXMsCi0jIHdlIHdpbGwgc2tpcCB0aGlzIGRpcmVjdG9yeTsgaW4gdGhpcyBjYXNlIHRoZSBzdWItZGlyZWN0b3J5J3MgY29tbW9uIHBhcnQKLSMgb2YgY29uZmlndXJlLmluIHdpbGwgY3JlYXRlIGEgc21hbGwgc2hlbGwgc2NyaXB0ICJza2lwLXRoaXMtZGlyIiBjb250YWluaW5nCi0jIGNvbW1hbmRzIHRvIGNvbXBsZXRlbHkgY2xlYW4gdXAgYW55IHRlbXBvcmFyeSBvciBjcmVhdGVkIGZpbGVzLgotCi0uICR7dG1wZmlsZX0uY29tCi0KLWlmIHRlc3QgLWYgc2tpcC10aGlzLWRpcjsgdGhlbgotCSMgUGVyZm9ybSB0aGUgc2FtZSBjbGVhbnVwIGFzIHRoZSB0cmFwIGhhbmRsZXIsIG1pbnVzIHRoZSAiZXhpdCAxIiBvZiBjb3Vyc2UsCi0JIyBhbmQgcmVzZXQgdGhlIHRyYXAgaGFuZGxlci4KLQl0cmFwIDAKLQlybSAtZiBNYWtlZmlsZSogJHt0bXBmaWxlfS5jb20gJHt0bXBmaWxlfS50Z3QgJHt0bXBmaWxlfS5oc3QgJHt0bXBmaWxlfS5wb3MKLQkjIEV4ZWN1dGUgdGhlIGZpbmFsIGNsZWFuLXVwIGFjdGlvbnMKLQkke2NvbmZpZ19zaGVsbH0gc2tpcC10aGlzLWRpcgotCSMgYW5kIHN0b3AgY29uZmlndXJpbmcgdGhpcyBkaXJlY3RvcnkuCi0JZXhpdCAwCi1maQotCi0jIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiBjb25maWd1cmUuaW4KLWNhc2UgIiR7c3JjdHJpZ2dlcn0iIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyBzcmN0cmlnZ2VyIG5vdCBzZXQgaW4gJHtQV0Q9YHB3ZGB9L2NvbmZpZ3VyZS5pbi4gIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICIke2J1aWxkX2FsaWFzfSIgaW4KLSIiKQotCWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KLQkgICAgYnVpbGRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotCSAgICBidWlsZF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi0JICAgIGJ1aWxkX29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCSAgICBidWlsZD0ke2J1aWxkX2NwdX0tJHtidWlsZF92ZW5kb3J9LSR7YnVpbGRfb3N9Ci0JICAgIGJ1aWxkX2FsaWFzPSR7aG9zdF9hbGlhc30KLQlmaQotCTs7Ci0qKQotCWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2J1aWxkX2FsaWFzfWAgOyB0aGVuCi0JICAgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IgotCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0JICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLQkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0JICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLQllbHNlCi0JICAgIGVjaG8gIlVucmVjb2duaXplZCBidWlsZCBzeXN0ZW0gbmFtZSAke2J1aWxkX2FsaWFzfS4iIDE+JjIKLQkgICAgZXhpdCAxCi0JZmkKLQk7OwotZXNhYwotCi1pZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtob3N0X2FsaWFzfWAgOyB0aGVuCi0gICAgdHJ1ZQotZWxzZQotICAgIGVjaG8gIlVucmVjb2duaXplZCBob3N0IHN5c3RlbSBuYW1lICR7aG9zdF9hbGlhc30uIiAxPiYyCi0gICAgZXhpdCAxCi1maQotaG9zdF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1ob3N0PSR7aG9zdF9jcHV9LSR7aG9zdF92ZW5kb3J9LSR7aG9zdF9vc30KLQotLiAke3RtcGZpbGV9LmhzdAotCi1pZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHt0YXJnZXRfYWxpYXN9YCA7IHRoZW4KLSAgICB0cnVlCi1lbHNlCi0gICAgZWNobyAiVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gbmFtZSAke3RhcmdldF9hbGlhc30uIiAxPiYyCi0gICAgZXhpdCAxCi1maQotdGFyZ2V0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi10YXJnZXQ9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9LSR7dGFyZ2V0X29zfQotCi0uICR7dG1wZmlsZX0udGd0Ci0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIiKQotICAgICAgICBzcmNkaXJkZWZhdWx0ZWQ9MQotICAgICAgICBzcmNkaXI9LgotICAgICAgICBpZiBbICEgLXIgJHtzcmN0cmlnZ2VyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgIHNyY2Rpcj0uLgotICAgICAgICBmaQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotaWYgWyAhIC1yICR7c3JjZGlyfS8ke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCi0gICAgICAgIGNhc2UgIiR7c3JjZGlyZGVmYXVsdGVkfSIgaW4KLSAgICAgICAgIiIpIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vJHtzcmNkaXJ9IiAxPiYyIDs7Ci0gICAgICAgICopICBlY2hvICcqKionICIke3Byb2duYW1lfTogQ2FuJ3QgZmluZCAke3NyY25hbWV9IHNvdXJjZXMgaW4gJHtQV0Q9YHB3ZGB9Ly4gb3IgJHtQV0Q9YHB3ZGB9Ly4uIiAxPiYyIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBlY2hvICcqKionIFwoQXQgbGVhc3QgJHtzcmN0cmlnZ2VyfSBpcyBtaXNzaW5nLlwpIDE+JjIKLSAgICAgICAgZXhpdCAxCi1maQotCi0jIFNvbWUgc3lzdGVtcyAoZS5nLiwgb25lIG9mIHRoZSBpMzg2LWFpeCBzeXN0ZW1zIHRoZSBnYXMgdGVzdGVycyBhcmUKLSMgdXNpbmcpIGRvbid0IGhhbmRsZSAiXCQiIGNvcnJlY3RseSwgc28gZG9uJ3QgdXNlIGl0IGhlcmUuCi10b29sZGlyPSckKGV4ZWNfcHJlZml4KScvJHt0YXJnZXRfYWxpYXN9Ci0KLWlmIFsgIiR7aG9zdF9hbGlhc30iICE9ICIke3RhcmdldF9hbGlhc30iIF0gOyB0aGVuCi0gICAgaWYgWyAiJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0iID0gIiIgXSA7IHRoZW4KLSAgICAgICAgaWYgWyAiJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0iID0gIiIgXSA7IHRoZW4gCi0gICAgICAgICAgICBpZiBbICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LSA7Ci0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi1maQotCi0jIE1lcmdlIHByb2dyYW1fcHJlZml4IGFuZCBwcm9ncmFtX3N1ZmZpeCBvbnRvIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0jIChwcm9ncmFtX3N1ZmZpeCB1c2VkIHRvIHVzZSAkLCBidXQgaXQncyBoYXJkIHRvIHByZXNlcnZlICQgdGhyb3VnaCBib3RoCi0jIG1ha2UgYW5kIHNoLikKLWlmIFsgIiR7cHJvZ3JhbV9zdWZmaXh9IiAhPSAiIiBdIDsgdGhlbgotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXFxcXCguKlxcXFwpLFxcXFwxJHtwcm9ncmFtX3N1ZmZpeH0sICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iCi1maQotCi1pZiBbICIke3Byb2dyYW1fcHJlZml4fSIgIT0gIiIgXSA7IHRoZW4KLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSItZSBzLF4sJHtwcm9ncmFtX3ByZWZpeH0sICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iCi1maQotCi0jIElmIENDIGFuZCBDWFggYXJlIG5vdCBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBhbmQgdGhlIE1ha2VmaWxlCi0jIGV4aXN0cywgdHJ5IHRvIGV4dHJhY3QgdGhlbSBmcm9tIGl0LiAgVGhpcyBpcyB0byBoYW5kbGUgcnVubmluZwotIyAuL2NvbmZpZy5zdGF0dXMgYnkgaGFuZC4KLWlmIFsgLXogIiR7Q0N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DQ1sgCV0qPS8gcy9DQ1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDQz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q0ZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ0ZMQUdTWyAJXSo9LyBzL0NGTEFHU1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NYWH0iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNYWFsgCV0qPS8gcy9DWFhbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ1hYPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDWFhGTEFHU30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNYWEZMQUdTWyAJXSo9LyBzL0NYWEZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENYWEZMQUdTPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgWUFDQy4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIGJpc29uIG9yIGJ5YWNjIGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gJ2Jpc29uIC15JyBieWFjYyB5YWNjCi1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfWUFDQz0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfWUFDQyIgJiYgYnJlYWsKLWRvbmUKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTTQuICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBtNCBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluIGdtNCBnbnVtNCBtNAotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gICB9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9NND0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfTTQiICYmIGJyZWFrCi1kb25lCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIExFWC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIGZsZXggaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiBmbGV4IGxleAotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX0xFWD0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfTEVYIiAmJiBicmVhawotZG9uZQotCi1pZiBbICIke2J1aWxkfSIgIT0gIiR7aG9zdH0iIF07IHRoZW4KLSAgIyBJZiB3ZSBhcmUgZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgaW4gd2hpY2ggdGhlIGhvc3QgYW5kIGJ1aWxkIHN5c3RlbXMKLSAgIyBhcmUgbm90IHRoZSBzYW1lLCB3ZSBzZXQgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHRvb2xzLgotCi0gIHRvb2xzPSJBUiBBUl9GT1JfVEFSR0VUIEFTIEFTX0ZPUl9UQVJHRVQgQklTT04gQ0NfRk9SX0JVSUxEIgotICB0b29scz0iJHt0b29sc30gQ0NfRk9SX1RBUkdFVCBDWFhfRk9SX1RBUkdFVCIKLSAgdG9vbHM9IiR7dG9vbHN9IERMTFRPT0wgRExMVE9PTF9GT1JfVEFSR0VUIEdDQ19GT1JfVEFSR0VUIEhPU1RfUFJFRklYIgotICB0b29scz0iJHt0b29sc30gSE9TVF9QUkVGSVhfMSBMRCBMRF9GT1JfVEFSR0VUIExFWCBNQUtFSU5GTyBOTSIKLSAgdG9vbHM9IiR7dG9vbHN9IE5NX0ZPUl9UQVJHRVQgUkFOTElCIFJBTkxJQl9GT1JfVEFSR0VUIgotICB0b29scz0iJHt0b29sc30gV0lORFJFUyBXSU5EUkVTX0ZPUl9UQVJHRVQgWUFDQyIKLQotICBmb3IgdmFyIGluICR7dG9vbHN9OyBkbwotICAgIGlmIFsgLXogImBldmFsICdlY2hvICQnIiR7dmFyfSJgIiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICAgICAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eJyIke3Zhcn0iJ1sgCV0qPS8gcy8nIiR7dmFyfSInWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgXAotCTwgTWFrZWZpbGUgPiBNYWtlZmlsZS52Ci0gICAgICB0PWB0YWlsIC0xIE1ha2VmaWxlLnZgCi0gICAgICBpZiBbIC1uICIke3R9IiBdOyB0aGVuCi0JZXZhbCAiJHt2YXJ9PScke3R9JyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBNYWtlZmlsZS52Ci0gICAgZmkKLSAgZG9uZQotCi0gIEFSPSR7QVItJHtob3N0X2FsaWFzfS1hcn0KLSAgQVJfRk9SX1RBUkdFVD0ke0FSX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFyfQotICBBUz0ke0FTLSR7aG9zdF9hbGlhc30tYXN9Ci0gIEFTX0ZPUl9UQVJHRVQ9JHtBU19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1hc30KLSAgQklTT049JHtCSVNPTi1iaXNvbn0KLSAgQ0M9JHtDQy0ke2hvc3RfYWxpYXN9LWdjY30KLSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIifQotICBDWFg9JHtDWFgtJHtob3N0X2FsaWFzfS1jKyt9Ci0gIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0gIENDX0ZPUl9CVUlMRD0ke0NDX0ZPUl9CVUlMRC1nY2N9Ci0gIENDX0ZPUl9UQVJHRVQ9JHtDQ19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1nY2N9Ci0gIENYWF9GT1JfVEFSR0VUPSR7Q1hYX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWMrK30KLSAgRExMVE9PTD0ke0RMTFRPT0wtJHtob3N0X2FsaWFzfS1kbGx0b29sfQotICBETExUT09MX0ZPUl9UQVJHRVQ9JHtETExUT09MX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWRsbHRvb2x9Ci0gIEdDQ19GT1JfVEFSR0VUPSR7R0NDX0ZPUl9UQVJHRVQtJHtDQ19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1nY2N9fQotICBIT1NUX1BSRUZJWD0ke2J1aWxkX2FsaWFzfS0KLSAgSE9TVF9QUkVGSVhfMT0ke2J1aWxkX2FsaWFzfS0KLSAgTEQ9JHtMRC0ke2hvc3RfYWxpYXN9LWxkfQotICBMRF9GT1JfVEFSR0VUPSR7TERfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbGR9Ci0gIE1BS0VJTkZPPSR7TUFLRUlORk8tbWFrZWluZm99Ci0gIE5NPSR7Tk0tJHtob3N0X2FsaWFzfS1ubX0KLSAgTk1fRk9SX1RBUkdFVD0ke05NX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LW5tfQotICBSQU5MSUI9JHtSQU5MSUItJHtob3N0X2FsaWFzfS1yYW5saWJ9Ci0gIFJBTkxJQl9GT1JfVEFSR0VUPSR7UkFOTElCX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LXJhbmxpYn0KLSAgV0lORFJFUz0ke1dJTkRSRVMtJHtob3N0X2FsaWFzfS13aW5kcmVzfQotICBXSU5EUkVTX0ZPUl9UQVJHRVQ9JHtXSU5EUkVTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LXdpbmRyZXN9Ci0KLSAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvYmlzb247IHRoZW4KLQlZQUNDPSJiaXNvbiAteSIKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci9ieWFjYzsgdGhlbgotCVlBQ0M9YnlhY2MKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci95YWNjOyB0aGVuCi0JWUFDQz15YWNjCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIFsgLXogIiR7WUFDQ30iIF07IHRoZW4KLSAgICAgIFlBQ0M9ImJpc29uIC15IgotICAgIGZpCi0gIGZpCi0KLSAgaWYgWyAteiAiJHtMRVh9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9mbGV4OyB0aGVuCi0JTEVYPWZsZXgKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci9sZXg7IHRoZW4KLQlMRVg9bGV4Ci0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIExFWD0ke0xFWC1mbGV4fQotICBmaQotCi0gICMgRXhwb3J0IHZhcmlhYmxlcyB3aGljaCBhdXRvY29uZiBtaWdodCB0cnkgdG8gc2V0LgotICBleHBvcnQgQVMKLSAgZXhwb3J0IEFSCi0gIGV4cG9ydCBDQ19GT1JfQlVJTEQKLSAgZXhwb3J0IERMTFRPT0wKLSAgZXhwb3J0IExECi0gIGV4cG9ydCBOTQotICBleHBvcnQgUkFOTElCCi0gIGV4cG9ydCBXSU5EUkVTCi1lbHNlCi0gICMgSWYgQ0MgaXMgc3RpbGwgbm90IHNldCwgdHJ5IHRvIGdldCBnY2MuCi0gIGlmIFsgLXogIiR7Q0N9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLQlDQz0iZ2NjIgotCWVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotCWlmIHRlc3QgLXogImAke0NDfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLQllbHNlCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItTzIifQotCWZpCi0Jcm0gLWYgY29uZnRlc3QqCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIENDPSR7Q0MtY2N9Ci0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIke0NGTEFHU30iOyB0aGVuCi0gICAgICAjIEhlcmUgQ0MgaXMgc2V0IGJ1dCBDRkxBR1MgaXMgbm90LiAgVXNlIGEgcXVpY2sgaGFjayB0byB1c2UgLU8yIGlmIENDCi0gICAgICAjIGlzIHNldCB0byBhIHZlcnNpb24gb2YgZ2NjLgotICAgICAgY2FzZSAiJHtDQ30iIGluCi0gICAgICAqZ2NjKQotCWVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotCWlmIHRlc3QgLXogImAke0NDfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLQllbHNlCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItTzIifQotCWZpCi0Jcm0gLWYgY29uZnRlc3QqCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBmaQotCi0gIENYWD0ke0NYWC0iYysrIn0KLSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyJ9Ci0gIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci1maQotCi1leHBvcnQgQ0MKLWV4cG9ydCBDWFgKLWV4cG9ydCBDRkxBR1MKLWV4cG9ydCBDWFhGTEFHUwotCi0jIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBpbiBjb25maWd1cmUuaW4sIG5vdCBjb25maWd1cmUKLWNhc2UgIiRob3N0IiBpbgotCSpnbzMyKikKLQkgICAgZW5hYmxlX2dkYnRrPW5vIDs7Ci0JKm1zZG9zZGpncHAqKQotCSAgICBlbmFibGVfZ2RidGs9bm8gOzsKLWVzYWMKLQotIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgaW4gY29uZmlndXJlLmluLCBub3QgY29uZmlndXJlCi0jIERldGVybWluZSB3aGV0aGVyIGdkYiBuZWVkcyB0ay90Y2wgb3Igbm90LgotaWYgWyAiJGVuYWJsZV9nZGJ0ayIgIT0gIm5vIiBdOyB0aGVuCi0JR0RCX1RLPSJhbGwtdGNsIGFsbC10ayBhbGwtaXRjbCBhbGwtdGl4IGFsbC1saWJndWkiCi1lbHNlCi0JR0RCX1RLPSIiCi1maQotCi1mb3Igc3ViZGlyIGluIC4gJHtzdWJkaXJzfSA7IGRvCi0KLSAgICAjICR7c3ViZGlyfSBpcyByZWxhdGl2ZSBwYXRoIGZyb20gLiB0byB0aGUgZGlyZWN0b3J5IHdlJ3JlIGN1cnJlbnRseQotICAgICMgY29uZmlndXJpbmcuCi0gICAgIyAke2ludnN1YmRpcn0gaXMgaW52ZXJzZSBvZiAke3N1YmRpciksICp3aXRoKiB0cmFpbGluZyAvLCBpZiBuZWVkZWQuCi0gICAgaW52c3ViZGlyPWBlY2hvICR7c3ViZGlyfS8gfCBzZWQgLWUgJ3N8XC4vfHxnJyAtZSAnc3xbXi9dKi98Li4vfGcnYAotCi0gICAgIyMjIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHNyY2RpcgotICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgIi4iKSAgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9LiA7OwotICAgICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgICAgICAgICAgbWFrZXNyY2Rpcj1gZWNobyAke3NyY2Rpcn0vJHtzdWJkaXJ9IHwgc2VkIC1lICdzfC9cLiR8fCdgCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICBjYXNlICIke3N1YmRpcn0iIGluCi0gICAgICAgICAgICAgICAgLikgbWFrZXNyY2Rpcj0ke3NyY2Rpcn0gOzsKLSAgICAgICAgICAgICAgICAqKSBtYWtlc3JjZGlyPSR7aW52c3ViZGlyfSR7c3JjZGlyfS8ke3N1YmRpcn0gOzsKLSAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiBbICIke3N1YmRpcn0vIiAhPSAiLi8iIF0gOyB0aGVuCi0gICAgICAgIE1ha2VmaWxlPSR7c3ViZGlyfS9NYWtlZmlsZQotICAgIGZpCi0KLSAgICBpZiBbICEgLWQgJHtzdWJkaXJ9IF0gOyB0aGVuCi0gICAgICAgIGlmIG1rZGlyICR7c3ViZGlyfSA7IHRoZW4KLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7c3ViZGlyfSIgMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICIke3JlbW92aW5nfSIgaW4KLSAgICAiIikKLSAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAuKSA7OwotICAgICAgICAqKSBldmFsIGVjaG8gQnVpbGRpbmcgaW4gJHtzdWJkaXJ9ICR7cmVkaXJlY3R9IDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICAjIEZJWE1FIFNob3VsZCB0aGlzIGJlIGRvbmUgcmVjdXJzaXZlbHkgPz8/IChVc2VmdWwgZm9yIGUuZy4gZ2RidGVzdCkKLSAgICAgICAgIyBTZXQgdXAgdGhlIGxpc3Qgb2YgbGlua3MgdG8gYmUgbWFkZS4KLSAgICAgICAgIyAke2xpbmtzfSBpcyB0aGUgbGlzdCBvZiBsaW5rIG5hbWVzLCBhbmQgJHtmaWxlc30gaXMgdGhlIGxpc3Qgb2YgbmFtZXMgdG8gbGluayB0by4KLQotICAgICAgICAjIE1ha2UgdGhlIGxpbmtzLgotICAgICAgICBjb25maWdsaW5rcz0iJHtsaW5rc30iCi0gICAgICAgIGlmIFsgLXIgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBtdiAtZiAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke3N1YmRpcn0vY29uZmlnLmJhY2sKLSAgICAgICAgZmkKLSAgICAgICAgd2hpbGUgWyAtbiAiJHtmaWxlc30iIF0gOyBkbwotICAgICAgICAgICAgICAgICMgc2V0IGZpbGUgdG8gY2FyIG9mIGZpbGVzLCBmaWxlcyB0byBjZHIgb2YgZmlsZXMKLSAgICAgICAgICAgICAgICBzZXQgJHtmaWxlc307IGZpbGU9JDE7IHNoaWZ0OyBmaWxlcz0kKgotICAgICAgICAgICAgICAgIHNldCAke2xpbmtzfTsgbGluaz0kMTsgc2hpZnQ7IGxpbmtzPSQqCi0KLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtzcmNkaXJ9LyR7ZmlsZX0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgIGlmIFsgISAtciAke2ZpbGV9IF0gOyB0aGVuCi0JCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBjYW5ub3QgY3JlYXRlIGEgbGluayBcIiR7bGlua31cIiwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgInNpbmNlIHRoZSBmaWxlIFwiJHtzcmNkaXJ9LyR7ZmlsZX1cIiBkb2VzIG5vdCBleGlzdC4iIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotCQkgIGVsc2UKLQkJCXNyY2ZpbGU9JHtmaWxlfQotCQkgIGZpCi0JCWVsc2UKLQkJCXNyY2ZpbGU9JHtzcmNkaXJ9LyR7ZmlsZX0KLSAgICAgICAgICAgICAgICBmaQotCi0gICAgICAgICAgICAgICAgJHtyZW1vdmV9IC1mICR7bGlua30KLQkJIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluawotCQlpZiAke3N5bWJvbGljX2xpbmt9ICR7c3JjZmlsZX0gJHtsaW5rfSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JCQl0cnVlCi0JCWVsc2UKLQkJCSMgV2UgbmVlZCB0byByZS1yZW1vdmUgdGhlIGZpbGUgYmVjYXVzZSBMeW54IGxlYXZlcyBhIAotCQkJIyB2ZXJ5IHN0cmFuZ2UgZGlyZWN0b3J5IHRoZXJlIHdoZW4gaXQgZmFpbHMgYW4gTkZTIHN5bWxpbmsuCi0JCQkke3JlbW92ZX0gLXIgLWYgJHtsaW5rfQotCQkJJHtoYXJkX2xpbmt9ICR7c3JjZmlsZX0gJHtsaW5rfQotCQlmaQotICAgICAgICAgICAgICAgIGlmIFsgISAtciAke2xpbmt9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogdW5hYmxlIHRvIGxpbmsgXCIke2xpbmt9XCIgdG8gXCIke3NyY2ZpbGV9XCIuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICBmaQotCi0gICAgICAgICAgICAgICAgZWNobyAiTGlua2VkIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIKLSAgICAgICAgZG9uZQotCi0gICAgICAgICMgQ3JlYXRlIGEgLmdkYmluaXQgZmlsZSB3aGljaCBydW5zIHRoZSBvbmUgaW4gc3JjZGlyCi0gICAgICAgICMgYW5kIHRlbGxzIEdEQiB0byBsb29rIHRoZXJlIGZvciBzb3VyY2UgZmlsZXMuCi0KLSAgICAgICAgaWYgWyAtciAke3NyY2Rpcn0vJHtzdWJkaXJ9Ly5nZGJpbml0IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgY2FzZSAke3NyY2Rpcn0gaW4KLSAgICAgICAgICAgICAgICAuKSA7OwotICAgICAgICAgICAgICAgICopIGNhdCA+ICR7c3ViZGlyfS8uZ2RiaW5pdCA8PEVPRgotIyAke05PX0VESVR9Ci1kaXIgJHttYWtlc3JjZGlyfQotZGlyIC4KLXNvdXJjZSAke21ha2VzcmNkaXJ9Ly5nZGJpbml0Ci1FT0YKLSAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICBmaQotCi0gICAgICAgICMgSW5zdGFsbCBhIG1ha2VmaWxlLCBhbmQgbWFrZSBpdCBzZXQgVlBBVEgKLSAgICAgICAgIyBpZiBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgc291cmNlcyBhcmUgZm91bmQuCi0gICAgICAgICMgQWxzbyBjaGFuZ2UgaXRzIHZhbHVlIG9mIHNyY2Rpci4KLSAgICAgICAgIyBOT1RFOiBNYWtlZmlsZSBnZW5lcmF0aW9uIGNvbnN0aXR1dGVzIHRoZSBtYWpvcml0eSBvZiB0aGUgdGltZSBpbiBjb25maWd1cmUuICBIZW5jZSwgdGhpcyBzZWN0aW9uIGhhcwotICAgICAgICAjIGJlZW4gc29tZXdoYXQgb3B0aW1pemVkIGFuZCBpcyBwZXJoYXBzIGEgYml0IHR3aXN0eS4KLQotICAgICAgICAjIGNvZGUgaXMgb3JkZXIgc28gYXMgdG8gdHJ5IHRvIHNlZCB0aGUgc21hbGxlc3QgaW5wdXQgZmlsZXMgd2Uga25vdy4KLSAgICAgICAgIyBzbyBkbyB0aGVzZSBzZXBhcmF0ZWx5IGJlY2F1c2UgSSBkb24ndCB0cnVzdCB0aGUgb3JkZXIgb2Ygc2VkIC1lIGV4cHJlc3Npb25zLgotCi0gICAgICAgICMgdGhlIGZpdmUgbWFrZWZpbGUgZnJhZ21lbnRzIE1VU1QgZW5kIHVwIGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGUgaW4gdGhpcyBvcmRlcjogCi0gICAgICAgICMgcGFja2FnZSBtYWNyb3MsIHRhcmdldCwgaG9zdCwgc2l0ZSwgYW5kIHBhY2thZ2UgcnVsZXMuCi0KLSAgICAgICAgaWYgWyAtZiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59IF0gOyB0aGVuCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHBhY2thZ2UgZnJvbSAiTWFrZWZpbGUuaW4iIChvciB3aGF0ZXZlciBpdCdzIGNhbGxlZCkgaW50byBNYWtlZmlsZS50ZW0uCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBjcCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWc9JHtzcmNkaXJ9LyR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30iICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtNYWtlZmlsZV9pbn0gPiAke01ha2VmaWxlfS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgcnVsZXMgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9LnRlbQotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIGZvciB0aGlzIHNpdGUuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgICBjYXNlICIke3NpdGV9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIHNpdGVfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vY29uZmlnL21zLSR7c2l0ZX0KLQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtzaXRlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtzaXRlX21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSB0aGUgbWFrZWZpbGUgZm9yIHRoaXMgaG9zdC4KLSAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgIGNhc2UgIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke2hvc3RfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke2hvc3RfbWFrZWZpbGVfZnJhZ30iICR7TWFrZWZpbGV9ID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgRXhwZWN0ZWQgaG9zdCBtYWtlZmlsZSBmcmFnbWVudCBcIiR7aG9zdF9tYWtlZmlsZV9mcmFnfVwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgaXMgbWlzc2luZyBpbiAke1BXRD1gcHdkYH0uIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7c3ViZGlyKS9NYWtlZmlsZS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSB0aGUgbWFrZWZpbGUgZm9yIHRoaXMgdGFyZ2V0LgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPiAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfQotCi0gICAgICAgICAgICAjIEVtaXQgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoaXMgcGFja2FnZSdzIG1hY3Jvcy4KLSAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iICR7TWFrZWZpbGV9ID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgRXhwZWN0ZWQgcGFja2FnZSBtYWtlZmlsZSBmcmFnbWVudCBcIiR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfVwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgaXMgbWlzc2luZyBpbiAke1BXRD1gcHdkYH0uIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyByZWFsIGNvcHkgbm93IGluICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQotICAgICAgICAgICAgIyBwcmVwZW5kIHdhcm5pbmcgYWJvdXQgZWRpdHRpbmcsIGFuZCBhIGJ1bmNoIG9mIHZhcmlhYmxlcy4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXQgPiAke01ha2VmaWxlfSA8PEVPRgotIyAke05PX0VESVR9Ci1WUEFUSCA9ICR7bWFrZXNyY2Rpcn0KLWxpbmtzID0gJHtjb25maWdsaW5rc30KLWhvc3RfYWxpYXMgPSAke2hvc3RfYWxpYXN9Ci1ob3N0X2NwdSA9ICR7aG9zdF9jcHV9Ci1ob3N0X3ZlbmRvciA9ICR7aG9zdF92ZW5kb3J9Ci1ob3N0X29zID0gJHtob3N0X29zfQotaG9zdF9jYW5vbmljYWwgPSAke2hvc3RfY3B1fS0ke2hvc3RfdmVuZG9yfS0ke2hvc3Rfb3N9Ci10YXJnZXRfYWxpYXMgPSAke3RhcmdldF9hbGlhc30KLXRhcmdldF9jcHUgPSAke3RhcmdldF9jcHV9Ci10YXJnZXRfdmVuZG9yID0gJHt0YXJnZXRfdmVuZG9yfQotdGFyZ2V0X29zID0gJHt0YXJnZXRfb3N9Ci10YXJnZXRfY2Fub25pY2FsID0gJHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9LSR7dGFyZ2V0X29zfQotRU9GCi0JICAgIGNhc2UgIiR7YnVpbGR9IiBpbgotCSAgICAgICIiKSA7OwotCSAgICAgICopICBjYXQgPj4gJHtNYWtlZmlsZX0gPDwgRU9GCi1idWlsZF9hbGlhcyA9ICR7YnVpbGRfYWxpYXN9Ci1idWlsZF9jcHUgPSAke2J1aWxkX2NwdX0KLWJ1aWxkX3ZlbmRvciA9ICR7YnVpbGRfdmVuZG9yfQotYnVpbGRfb3MgPSAke2J1aWxkX29zfQotYnVpbGRfY2Fub25pY2FsID0gJHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotRU9GCi0JICAgIGVzYWMKLQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gcGFja2FnZV9tYWtlZmlsZV9mcmFnID0gJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikgIGVjaG8gcGFja2FnZV9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgY2FzZSAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyB0YXJnZXRfbWFrZWZpbGVfZnJhZyA9ICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikgIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIGhvc3RfbWFrZWZpbGVfZnJhZyA9ICR7aG9zdF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIGhvc3RfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7aG9zdF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGlmIFsgIiR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgIT0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvIHNpdGVfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7c2l0ZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBmaSAKLQotCSAgICAjIHJlY29yZCBpZiB3ZSB3YW50IHRvIGJ1aWxkIHNoYXJlZCBsaWJzLgotCSAgICBpZiB0ZXN0IC16ICIke2VuYWJsZV9zaGFyZWR9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfc2hhcmVkID0gbm8gPj4gJHtNYWtlZmlsZX0KLQkgICAgZWxzZQotCSAgICAgICAgZWNobyBlbmFibGVfc2hhcmVkID0gJHtlbmFibGVfc2hhcmVkfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCSAgICAjIHJlY29yZCBpZiB3ZSB3YW50IHRvIHJ1bXRpbWUgbGlicmFyeSBzdHVmZiBpbnN0YWxsZWQgaW4gbGlic3ViZGlyLgotCSAgICBpZiB0ZXN0IC16ICIke2VuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlic30iOyB0aGVuCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzID0gJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9ID4+ICR7TWFrZWZpbGV9Ci0JICAgIGZpCi0KLQkgICAgIyBFbWl0IGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBmaWxlIGNvbnRhaW5pbmcgZ2NjJ3MKLQkgICAgIyB2ZXJzaW9uIG51bWJlci4KLQkgICAgZWNobyBnY2NfdmVyc2lvbl90cmlnZ2VyID0gJHtnY2NfdmVyc2lvbl90cmlnZ2VyfSA+PiAke01ha2VmaWxlfQotCSAgICAjIEFuZCBlbWl0IGEgbWFjcm8gZGVmaW5pbmcgZ2NjJ3MgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb24gPSAke2djY192ZXJzaW9ufSA+PiAke01ha2VmaWxlfQotCi0gICAgICAgICAgICAjIHJlc2V0IHByZWZpeCwgZXhlY19wcmVmaXgsIHNyY2RpciwgU1VCRElSUywgTk9OU1VCRElSUywKLSAgICAgICAgICAgICMgcmVtb3ZlIGFueSBmb3JtIGZlZWRzLgotICAgICAgICAgICAgaWYgWyAteiAiJHtzdWJkaXJzfSIgXTsgdGhlbgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50bTIKLSAgICAgICAgICAgICAgICBzZWQgLWUgInM6XlNVQkRJUlNbIAldKj0uKiQ6U1VCRElSUyA9ICR7Y29uZmlnZGlyc306IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5OT05TVUJESVJTWyAJXSo9LiokOk5PTlNVQkRJUlMgPSAke25vY29uZmlnZGlyc306IiBcCi0gICAgICAgICAgICAgICAgICAgICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50bTIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotCSAgICBmaQotCSAgICBzZWQgICAgIC1lICJzfF5wcmVmaXhbIAldKj0uKiR8cHJlZml4ID0gJHtwcmVmaXh9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeZXhlY19wcmVmaXhbIAldKj0uKiR8ZXhlY19wcmVmaXggPSAke2V4ZWNfcHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmJpbmRpclsgCV0qPS4qJHxiaW5kaXIgPSAke2JpbmRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zYmluZGlyWyAJXSo9LiokfHNiaW5kaXIgPSAke3NiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZXhlY2RpclsgCV0qPS4qJHxsaWJleGVjZGlyID0gJHtsaWJleGVjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmRhdGFkaXJbIAldKj0uKiR8ZGF0YWRpciA9ICR7ZGF0YWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zeXNjb25mZGlyWyAJXSo9LiokfHN5c2NvbmZkaXIgPSAke3N5c2NvbmZkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2hhcmVkc3RhdGVkaXJbIAldKj0uKiR8c2hhcmVkc3RhdGVkaXIgPSAke3NoYXJlZHN0YXRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxvY2Fsc3RhdGVkaXJbIAldKj0uKiR8bG9jYWxzdGF0ZWRpciA9ICR7bG9jYWxzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5saWJkaXJbIAldKj0uKiR8bGliZGlyID0gJHtsaWJkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5jbHVkZWRpclsgCV0qPS4qJHxpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm9sZGluY2x1ZGVkaXJbIAldKj0uKiR8b2xkaW5jbHVkZWRpciA9ICR7b2xkaW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5pbmZvZGlyWyAJXSo9LiokfGluZm9kaXIgPSAke2luZm9kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebWFuZGlyWyAJXSo9LiokfG1hbmRpciA9ICR7bWFuZGlyfXwiIFwKLQkJICAgIC1lICIvXkNDWyAJXSo9L3sKLQkJCTpsb29wMQotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDEKLQkJCXMlXkNDWyAJXSo9LiokJUNDID0gJHtDQ30lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DWFhbIAldKj0vewotCQkJOmxvb3AyCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMgotCQkJcyVeQ1hYWyAJXSo9LiokJUNYWCA9ICR7Q1hYfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNGTEFHU1sgCV0qPS97Ci0JCQk6bG9vcDMKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AzCi0JCQlzJV5DRkxBR1NbIAldKj0uKiQlQ0ZMQUdTID0gJHtDRkxBR1N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYRkxBR1NbIAldKj0vewotCQkJOmxvb3A0Ci0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wNAotCQkJcyVeQ1hYRkxBR1NbIAldKj0uKiQlQ1hYRkxBR1MgPSAke0NYWEZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICJzfF5TSEVMTFsJIF0qPS4qJHxTSEVMTCA9ICR7Y29uZmlnX3NoZWxsfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNyY2RpclsgCV0qPS4qJHxzcmNkaXIgPSAke21ha2VzcmNkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAicy8MLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fcHJlZml4WyAJXSo9LiokOnByb2dyYW1fcHJlZml4ID0gJHtwcm9ncmFtX3ByZWZpeH06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3N1ZmZpeFsgCV0qPS4qJDpwcm9ncmFtX3N1ZmZpeCA9ICR7cHJvZ3JhbV9zdWZmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV90cmFuc2Zvcm1fbmFtZVsgCV0qPS4qJDpwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnRvb2xkaXJbIAldKj0uKiR8dG9vbGRpciA9ICR7dG9vbGRpcn18IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9ZQUNDWwkgXSo9LiokOkRFRkFVTFRfWUFDQyA9ICR7REVGQVVMVF9ZQUNDfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX0xFWFsJIF0qPS4qJDpERUZBVUxUX0xFWCA9ICR7REVGQVVMVF9MRVh9OiIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfTTRbICBdKj0uKiQ6REVGQVVMVF9NNCA9ICR7REVGQVVMVF9NNH06IiBcCi0gICAgICAgICAgICAgICAgICAgICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPj4gJHtNYWtlZmlsZX0KLSAgCi0JICAgIHNlZCAtZSAiczpeR0RCX1RLWwkgXSo9LiokOkdEQl9USyA9ICR7R0RCX1RLfToiICR7TWFrZWZpbGV9ID4ke01ha2VmaWxlfS50ZW0KLQkgICAgbXYgLWYgJHtNYWtlZmlsZX0udGVtICR7TWFrZWZpbGV9Ci0KLQkgICAgIyBJZiB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MsIHByZXNldCB0aGUgdmFsdWVzIG9mIG1hbnkgbW9yZQotCSAgICAjIHRvb2xzLgotCSAgICBpZiBbICIke2J1aWxkfSIgIT0gIiR7aG9zdH0iIF07IHRoZW4KLQkJZm9yIHZhciBpbiAke3Rvb2xzfTsgZG8KLQkJICAgIHZhbD1gZXZhbCAnZWNobyAkJyIke3Zhcn0iYAotCQkgICAgc2VkIC1lICIvXiR7dmFyfVsgCV0qPS97Ci0JCQkgICA6bG9vcDEKLQkJCSAgIC9cXFxcJC8gTgotCQkJICAgL1xcXFwkLyBiIGxvb3AxCi0JCQkgICBzL1xcXFxcXG4vL2cKLQkJCSAgIHMlXiR7dmFyfVsgCV0qPS4qJCUke3Zhcn0gPSAke3ZhbH0lCi0JCQkgICB9IiAke01ha2VmaWxlfSA+ICR7TWFrZWZpbGV9LnRlbQotCQkgICAgbXYgLWYgJHtNYWtlZmlsZX0udGVtICR7TWFrZWZpbGV9Ci0JCWRvbmUKLQkgICAgZmkKLQotICAgICAgICAgICAgIyBmaW5hbCBjb3B5IG5vdyBpbiAke01ha2VmaWxlfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZWNobyAiTm8gTWFrZWZpbGUuaW4gZm91bmQgaW4gJHtzcmNkaXJ9LyR7c3ViZGlyfSwgdW5hYmxlIHRvIGNvbmZpZ3VyZSIgMT4mMgotICAgICAgICBmaQotCi0gICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQotICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSB1c2luZz0gOzsKLSAgICAgICAgKikgdXNpbmc9ImFuZCBcIiR7aG9zdF9tYWtlZmlsZV9mcmFnfVwiIiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgIiIpIDs7Ci0gICAgICAgICopIHVzaW5nPSIke3VzaW5nfSBhbmQgXCIke3NpdGVfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIG5ld3VzaW5nPWBlY2hvICIke3VzaW5nfSIgfCBzZWQgJ3MvYW5kL3VzaW5nLydgCi0gICAgICAgIHVzaW5nPSR7bmV3dXNpbmd9Ci0gICAgICAgIGVjaG8gIkNyZWF0ZWQgXCIke01ha2VmaWxlfVwiIGluIiAke1BXRD1gcHdkYH0gJHt1c2luZ30KLQotICAgICAgICAuICR7dG1wZmlsZX0ucG9zCi0KLSAgICAgICAgIyBkZXNjcmliZSB0aGUgY2hvc2VuIGNvbmZpZ3VyYXRpb24gaW4gY29uZmlnLnN0YXR1cy4KLSAgICAgICAgIyBNYWtlIHRoYXQgZmlsZSBhIHNoZWxsc2NyaXB0IHdoaWNoIHdpbGwgcmVlc3RhYmxpc2gKLSAgICAgICAgIyB0aGUgc2FtZSBjb25maWd1cmF0aW9uLiAgVXNlZCBpbiBNYWtlZmlsZXMgdG8gcmVidWlsZAotICAgICAgICAjIE1ha2VmaWxlcy4KLQotICAgICAgICBjYXNlICIke25vcmVjdXJzaW9ufSIgaW4KLSAgICAgICAgIiIpIGFyZ3VtZW50cz0iJHthcmd1bWVudHN9IC0tbm9yZWN1cnNpb24iIDs7Ci0gICAgICAgICopIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBpZiBbICR7c3ViZGlyfSA9IC4gXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIiMhL2Jpbi9zaAotIyAke05PX0VESVR9Ci0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gIiMhL2Jpbi9zaAotIyAke05PX0VESVR9Ci0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Ci1jZCAke2ludnN1YmRpcn0KLSR7cHJvZ25hbWV9IiAke2FyZ3VtZW50c30gICIKLSMgJHt1c2luZ30iID4gJHtzdWJkaXJ9L2NvbmZpZy5uZXcKLSAgICAgICAgZmkKLSAgICAgICAgY2htb2QgYSt4ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGlmIFsgLXIgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrICR7c3ViZGlyfS9jb25maWcuc3RhdHVzCi0gICAgICAgIGZpCi0JJHtjb25maWdfc2hlbGx9ICR7bW92ZWlmY2hhbmdlfSAke3N1YmRpcn0vY29uZmlnLm5ldyAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICA7OwotCi0gICAgKikgIHJtIC1mICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9jb25maWcuc3RhdHVzICR7bGlua3N9IDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIElmIHRoZXJlIGFyZSBzdWJkaXJlY3RvcmllcywgdGhlbiByZWN1ci4KLWlmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7Y29uZmlnZGlyc30iIF0gOyB0aGVuIAotICAgICAgICBmb3IgY29uZmlnZGlyIGluICR7Y29uZmlnZGlyc30gJHtleHRyYWNvbmZpZ2RpcnN9IDsgZG8KLQotCQkjIElmIGNvbmZpZ2RpciBjb250YWlucyAnLCcgaXQgaXMKLQkJIyBzcmNkaXIsYnVpbGRkaXIsdGFyZ2V0X2FsaWFzCi0JCSMgVGhlc2UgY29tZSBmcm9tIGV4dHJhY29uZmlnZGlycy4KLQkJY2FzZSAke2NvbmZpZ2Rpcn0gaW4KLQkJKiwqKQotCQkgICAgZXZhbCBgZWNobyAke2NvbmZpZ2Rpcn0gfCBzZWQgLWUgJ3MvXChbXixdKlwpLFwoW14sXSpcKSxcKC4qXCkvY2ZnX2Rpcj1cMSBibGRfZGlyPVwyIHRndF9hbGlhcz1cMy8nYAotCQkgICAgOzsKLQkJKikKLQkJICAgIGNmZ19kaXI9JHtjb25maWdkaXJ9Ci0JCSAgICBibGRfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgdGd0X2FsaWFzPSR7dGFyZ2V0X2FsaWFzfQotCQkgICAgOzsKLQkJZXNhYwotCi0gICAgICAgICAgICAgICAgaWYgWyAtZCAke3NyY2Rpcn0vJHtjZmdfZGlyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCBlY2hvIENvbmZpZ3VyaW5nICR7Y29uZmlnZGlyfS4uLiAke3JlZGlyZWN0fQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIi4iKSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1kIC4vJHtibGRfZGlyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1rZGlyIC4vJHtibGRfZGlyfSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7YmxkX2Rpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBPUERJUj0ke1BXRD1gcHdkYH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNkICR7YmxkX2Rpcn0gCi0KLSMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgbmV3c3JjZGlyPSR7c3JjZGlyfSA7OyAjIG5vIC1zcmNkaXIgb3B0aW9uLiAgV2UncmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgID86KikgIyBhYnNvbHV0ZSBwYXRoIG9uIHdpbjMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0uLi8ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKLQotCQkJIyBIYW5kbGUgLS1jYWNoZS1maWxlPS4uL1hYWAotCQkJY2FzZSAiJHtjYWNoZV9maWxlfSIgaW4KLQkJCSIiKSAjIGVtcHR5Ci0JCQkJOzsKLQkJCS8qKSAjIGFic29sdXRlIHBhdGgKLQkJCQljYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPSR7Y2FjaGVfZmlsZX0iCi0JCQkJOzsKLQkJCT86KikgIyBhYnNvbHV0ZSBwYXRoIG9uIHdpbjMyCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQkqKSAjIHJlbGF0aXZlIHBhdGgKLQkJCQljYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPS4uLyR7Y2FjaGVfZmlsZX0iCi0JCQkJOzsKLQkJCWVzYWMKLQotIyMjIGNoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZSwgb3RoZXJ3aXNlIGZpeCBwb3NzaWJseSByZWxhdGl2ZSBwcm9nbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Byb2c9JHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBbIC1mICR7bmV3c3JjZGlyfS9jb25maWd1cmUuaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtwcm9nbmFtZX0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKSAgICAgcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiopICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikgICAgICByZWNwcm9nPS4uLyR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKLQkJCWVsc2UKLQkJCQlldmFsIGVjaG8gTm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiAke2NmZ19kaXJ9ICR7cmVkaXJlY3R9Ci0JCQkJcmVjcHJvZz0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0KLSMjIyBUaGUgcmVjdXJzaW9uIGxpbmUgaXMgaGVyZS4KLQkJCWlmIFsgISAteiAiJHtyZWNwcm9nfSIgXSA7IHRoZW4KLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiBldmFsICR7Y29uZmlnX3NoZWxsfSAke3JlY3Byb2d9ICR7dmVyYm9zZX0gJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0Z3RfYWxpYXN9IFwKLSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICR7cHJlZml4b3B0aW9ufSAke3RtcGRpcm9wdGlvbn0gJHtleGVjX3ByZWZpeG9wdGlvbn0gXAotICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgJHtzcmNkaXJvcHRpb259ICR7ZGlyb3B0aW9uc30gJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSAke3NpdGVfb3B0aW9ufSAke3dpdGhvcHRpb25zfSAke3dpdGhvdXRvcHRpb25zfSAke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259ICR7Y2FjaGVfZmlsZV9vcHRpb259ICR7cmVtb3Zpbmd9ICR7b3RoZXJfb3B0aW9uc30gJHtyZWRpcmVjdH0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZQotCQkJCQllY2hvIENvbmZpZ3VyZSBpbiBgcHdkYCBmYWlsZWQsIGV4aXRpbmcuIDE+JjIKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgICAgICAgICAgCWZpCi0JCQlmaQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke1BPUERJUn0KLSAgICAgICAgICAgICAgICBmaQotICAgICAgICBkb25lCi1maQotCi0jIFBlcmZvcm0gdGhlIHNhbWUgY2xlYW51cCBhcyB0aGUgdHJhcCBoYW5kbGVyLCBtaW51cyB0aGUgImV4aXQgMSIgb2YgY291cnNlLAotIyBhbmQgcmVzZXQgdGhlIHRyYXAgaGFuZGxlci4KLXJtIC1mICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zCi10cmFwIDAKLQotZXhpdCAwCi0KLSMKLSMgTG9jYWwgVmFyaWFibGVzOgotIyBmaWxsLWNvbHVtbjogMTMxCi0jIEVuZDoKLSMKLQotIyBlbmQgb2YgY29uZmlndXJlCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGYxMzUuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNiArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KLSMjIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQotIyMgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjawotIyMgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuICAKLQotIyMgQmUgd2FybmVkLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbmZpZ3VyZS5pbiBmaWxlcy4gIFRoZXJlIGFyZSB0aG9zZQotIyMgdXNlZCBieSBBdXRvY29uZiwgd2hpY2ggYXJlIG1hY3JvcyB3aGljaCBhcmUgZXhwYW5kZWQgaW50byBhIGNvbmZpZ3VyZQotIyMgc2NyaXB0IGJ5IGF1dG9jb25mLiAgVGhlIG90aGVyIHNvcnQsIG9mIHdoaWNoIHRoaXMgaXMgb25lLCBpcyBleGVjdXRlZAotIyMgYnkgQ3lnbnVzIGNvbmZpZ3VyZS4gIAotCi0jIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0d28gc3lzdGVtcywgY2hlY2sgb3V0IHRoZSBkb2N1bWVudGF0aW9uCi0jIyBmb3IgJ0F1dG9jb25mJyAoYXV0b2NvbmYudGV4aSkgYW5kICdDb25maWd1cmUnIChjb25maWd1cmUudGV4aSkuICAKLQotIyAgIENvcHlyaWdodCAoQykgMTk5Mi05OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyBUbyBhZGQgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSB0cmVlLCBmaXJzdCBjaG9vc2Ugd2hldGhlciBpdCBpcyBhIHRhcmdldAotIyMjIG9yIGEgaG9zdCBkZXBlbmRlbnQgdG9vbC4gIFRoZW4gcHV0IGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QKLSMjIyAobGlicmFyeSBvciB0b29scywgaG9zdCBvciB0YXJnZXQpLCBkb2luZyBhIGRlcGVuZGVuY3kgc29ydC4gIEZvcgotIyMjIGV4YW1wbGUsIGdkYiByZXF1aXJlcyB0aGF0IGJ5YWNjIChvciBiaXNvbikgYmUgYnVpbHQgZmlyc3QsIHNvIGl0IGlzIGluCi0jIyMgdGhlICR7aG9zdF90b29sc30gbGlzdCBhZnRlciBieWFjYyBhbmQgYmlzb24uICAKLQotCi0jIHRoZXNlIGxpYnJhcmllcyBhcmUgdXNlZCBieSB2YXJpb3VzIHByb2dyYW1zIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIwotaG9zdF9saWJzPSJpbnRsIG1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggZGIgdGNsIHRrIHRjbDguMSB0azguMSB0Y2xYIGl0Y2wgdGl4IGxpYmd1aSIKLQotaWYgWyAiJHtlbmFibGVfZ2RiZ3VpfSIgPSAieWVzIiBdIDsgdGhlbgotCWhvc3RfbGlicz0iJHtob3N0X2xpYnN9IGxpYmd1aSIKLWZpCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIyBOb3RlLCB0aGUgcG93ZXJwYy1lYWJpIGJ1aWxkIGRlcGVuZHMgb24gc2ltIG9jY3VycmluZyBiZWZvcmUgZ2RiIGluIG9yZGVyIHRvCi0jIGtub3cgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdGhlIHNpbXVsYXRvci4KLWhvc3RfdG9vbHM9InRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIHNpbSBnZGIgbWFrZSBwYXRjaCBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBhc2ggYmFzaCBiemlwMiBtNCBhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2c3NyYyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2sgZmluZHV0aWxzIHNuYXZpZ2F0b3IgbGlidG9vbCBnZXR0ZXh0IHppcCIKLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0IGZvciB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBhbmQgYXJlIGJ1aWx0IGFmdGVyCi0jIHRoZSBob3N0IGxpYnJhcmllcyBhbmQgdGhlIGhvc3QgdG9vbHMgKHdoaWNoIG1heSBiZSBhIGNyb3NzIGNvbXBpbGVyKQotIwotdGFyZ2V0X2xpYnM9InRhcmdldC1saWJpYmVydHkgXAotCQl0YXJnZXQtbGliZ2xvc3MgXAotCQl0YXJnZXQtbmV3bGliIFwKLQkJdGFyZ2V0LWxpYmlvIFwKLQkJdGFyZ2V0LWxpYnJ4IFwKLQkJdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JCXRhcmdldC1saWJnKysiCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgbGlicywgYW5kIGFyZSBpbnRlbmRlZCB0byBydW4gb25seQotIyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50Ci0jCi0jIG5vdGU6IGFueSBwcm9ncmFtIHRoYXQgKnVzZXMqIGxpYnJhcmllcyB0aGF0IGFyZSBpbiB0aGUgInRhcmdldF9saWJzIgotIyBsaXN0IGJlbG9uZ3MgaW4gdGhpcyBsaXN0LiAgdGhvc2UgcHJvZ3JhbXMgYXJlIGFsc28gdmVyeSBsaWtlbHkKLSMgY2FuZGlkYXRlcyBmb3IgdGhlICJuYXRpdmVfb25seSIgbGlzdCB3aGljaCBmb2xsb3dzCi0jCi10YXJnZXRfdG9vbHM9InRhcmdldC1leGFtcGxlcyB0YXJnZXQtZ3JvZmYgdGFyZ2V0LWdwZXJmIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGVzZSB0d28gbGlzdHMgYXJlIG9mIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSMjICR7Y29uZmlnZGlyc30gbGlzdCBmb3IgZWl0aGVyIGNyb3NzLWNvbXBpbGF0aW9ucyBvciBmb3IgbmF0aXZlLQotIyMgY29tcGlsYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgdG8KLSMjIGNyb3NzLWNvbXBpbGUgRW1hY3MsIG5vciBpcyBpdCB0ZXJyaWJseSB1c2VmdWwgdG8gY29tcGlsZSB0YXJnZXQtbGliaWJlcnR5IGluCi0jIyBhIG5hdGl2ZSBlbnZpcm9ubWVudC4gIAotCi0jIGRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGluIHRoZSBuYXRpdmUgZW52aXJvbm1lbnQgb25seQotIwotIyBUaGlzIG11c3QgYmUgYSBzaW5nbGUgbGluZSBiZWNhdXNlIG9mIHRoZSB3YXkgaXQgaXMgc2VhcmNoZWQgYnkgZ3JlcCBpbgotIyB0aGUgY29kZSBiZWxvdy4KLW5hdGl2ZV9vbmx5PSJhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGN2c3NyYyBlbWFjcyBlbWFjczE5IGZpbGV1dGlscyBmaW5kIGdhd2sgZ2V0dGV4dCBncmVwIGd6aXAgaGVsbG8gaW5kZW50IGlzcGVsbCBtNCByY3MgcmVjb2RlIHNlZCBzaGVsbHV0aWxzIHRhciB0ZXh0dXRpbHMgZ2FzaCB1dWRlY29kZSB3ZGlmZiBncHJvZiB0YXJnZXQtZ3JvZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCB0aW1lIGFzaCBiYXNoIGJ6aXAyIHBybXMgc25hdmlnYXRvciBnbnVzZXJ2IHRhcmdldC1ncGVyZiIKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiBhIGNyb3NzIGVudmlyb25tZW50IG9ubHkKLSMKLWNyb3NzX29ubHk9InRhcmdldC1saWJnbG9zcyB0YXJnZXQtbmV3bGliIHRhcmdldC1jeWdtb24gdGFyZ2V0LW9wY29kZXMgdGFyZ2V0LWxpYnN0dWIiCi0KLSMjIEFsbCB0b29scyBiZWxvbmcgaW4gb25lIG9mIHRoZSBmb3VyIGNhdGVnb3JpZXMsIGFuZCBhcmUgYXNzaWduZWQgYWJvdmUKLSMjIFdlIGFzc2lnbiAke2NvbmZpZ2RpcnN9IHRoaXMgd2F5IHRvIHJlbW92ZSBhbGwgZW1iZWRkZWQgbmV3bGluZXMuICBUaGlzCi0jIyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBjb25maWd1cmUgd2lsbCBjaG9rZSBpZiB0aGV5IGV2ZXIgZ2V0IHRocm91Z2guCi0jIyAke2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSBob3N0IHRvb2xzLgotIyMgJHt0YXJnZXRfY29uZmlnZGlyc30gaXMgZGlyZWN0b3JpZXMgd2UgYnVpbGQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLSMKLWNvbmZpZ2RpcnM9YGVjaG8gJHtob3N0X2xpYnN9ICR7aG9zdF90b29sc31gCi10YXJnZXRfY29uZmlnZGlycz1gZWNobyAke3RhcmdldF9saWJzfSAke3RhcmdldF90b29sc31gCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXNyY3RyaWdnZXI9bW92ZS1pZi1jaGFuZ2UKLXNyY25hbWU9ImdudSBkZXZlbG9wbWVudCBwYWNrYWdlIgotCi0jIFRoaXMgZ2V0cyBzZXQgbm9uLWVtcHR5IGZvciBzb21lIG5ldCByZWxlYXNlcyBvZiBwYWNrYWdlcy4KLWFwcGRpcnM9IiIKLQotIyBwZXItaG9zdDoKLQotIyBXb3JrIGluIGRpc3RyaWJ1dGlvbnMgdGhhdCBjb250YWluIG5vIGNvbXBpbGVyIHRvb2xzLCBsaWtlIEF1dG9jb25mLgotaWYgWyAtZCAke3NyY2Rpcn0vY29uZmlnIF07IHRoZW4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIG02OGstaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwMzAwIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcG9sbG82OCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1ic2QqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hNjhic2QiCi0gICAgOzsKLSAgbTg4ay1kZy1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eCIKLSAgICA7OwotICBtODhrLWhhcnJpcy1jeHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3h1eCIKLSAgICA7OwotICBtODhrLW1vdG9yb2xhLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWx0YTg4IgotICAgIDs7Ci0gIG1pcHMqLWRlYy11bHRyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWNzdGF0aW9uIgotICAgIDs7Ci0gIG1pcHMqLW5lYy1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5lY3Y0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg2IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg1IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4MyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXJpc2NvcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWRndXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZ3V4Mzg2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5jcnN2cjQzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3IzMDAwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zY28iCi0gICAgOzsKLSAgaVszNDU2XTg2LSotdWRrKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjUiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotaXNjKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGpncHAiCi0gICAgOzsKLSAgKi1jeWd3aW4qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1jeWd3aW4iCi0gICAgOzsKLSAgKi1taW5ndzMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbWluZ3czMiIKLSAgICA7OwotICAqLWludGVyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pbnRlcml4IgotICAgIDs7Ci0gICotd2luZG93cyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXdpbmRvd3MiCi0gICAgOzsKLSAgdmF4LSotdWx0cml4MiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXZheHVsdDIiCi0gICAgOzsKLSAgKi0qLXNvbGFyaXMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc29sYXJpcyIKLSAgICA7OwotICBtNjhrLXN1bi1zdW5vcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN1bjMiCi0gICAgOzsKLSAgKi1ocC1ocHV4Wzc4XSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXg4IgotICAgIDs7Ci0gICotaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXgiCi0gICAgOzsKLSAgKi0qLWhpdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gIHJzNjAwMC0qLWx5bnhvcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWx5bnhyczZrIgotICAgIDs7Ci0gICotKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54b3MiCi0gICAgOzsKLSAgKi0qLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjQiCi0gICAgOzsKLSAgKi0qLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci1lc2FjCi1maQotCi0jIElmIHdlIGFyZW4ndCBnb2luZyB0byBiZSB1c2luZyBnY2MsIHNlZSBpZiB3ZSBjYW4gZXh0cmFjdCBhIGRlZmluaXRpb24KLSMgb2YgQ0MgZnJvbSB0aGUgZnJhZ21lbnQuCi1pZiBbIC16ICIke0NDfSIgXSAmJiBbICIke2J1aWxkfSIgPSAiJHtob3N0fSIgXTsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3VuZD0KLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLSAgICAgIGZvdW5kPXllcwotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotICBpZiBbIC16ICIke2ZvdW5kfSIgXSAmJiBbIC1uICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF0gJiYgWyAtZiAiJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXTsgdGhlbgotICAgIHh4PWBzZWQgLW4gLWUgJ3MvXlsgCV0qQ0NbIAldKj1bIAldKlwoLipcKSQvXDEvcCcgPCAke3NyY2Rpcn0vJHtob3N0X21ha2VmaWxlX2ZyYWd9YAotICAgIGlmIFsgLW4gIiR7eHh9IiBdIDsgdGhlbgotICAgICAgQ0M9JHh4Ci0gICAgZmkKLSAgZmkKLWZpCi0KLSMgV2UgZGVmYXVsdCB0byAtLXdpdGgtc2hhcmVkIG9uIHBsYXRmb3JtcyB3aGVyZSAtZnBpYyBpcyBtZWFuaW5nbGVzcy4KLSMgV2VsbCwgd2UgZG9uJ3QgeWV0LCBidXQgd2Ugd2lsbC4KLWlmIGZhbHNlICYmIFsgIiR7aG9zdH0iID0gIiR7dGFyZ2V0fSIgXSAmJiBbIHgke2VuYWJsZV9zaGFyZWR9ID0geCBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgICBhbHBoYSotZGVjLW9zZiopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgYWxwaGEqLSotbGludXgqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIG1pcHMtc2dpLWlyaXg1KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICAqKQkJCWVuYWJsZV9zaGFyZWQ9bm8gOzsKLSAgZXNhYwotZmkKLQotY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLSAgeWVzKSBzaGFyZWQ9eWVzIDs7Ci0gIG5vKSBzaGFyZWQ9bm8gOzsKLSAgIiIpIHNoYXJlZD1ubyA7OwotICAqKSBzaGFyZWQ9eWVzIDs7Ci1lc2FjCi0KLWlmIFsgeCR7c2hhcmVkfSA9IHh5ZXMgXTsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICAgIGFscGhhKi0qLWxpbnV4KikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1lbGZhbHBoYXBpYyIKLSAgICAgIDs7Ci0gICAgYXJtKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYXJtcGljIgotICAgICAgOzsKLSAgICBocHBhKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcGFwaWMiCi0gICAgICA7OwotICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQ3lnd2luLgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXg4NnBpYyIKLSAgICAgIDs7Ci0gICAgaTM3MC0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaTM3MHBpYyIKLSAgICAgIDs7Ci0gICAgc3BhcmM2NC0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3BhcmNwaWMiCi0gICAgICA7OwotICAgIHBvd2VycGMqLSotYWl4KikKLSAgICAgICMgV2UgZG9uJ3Qgd2FudCAtZlBJQyBvbiBBSVguCi0gICAgICA7OwotICAgIHBvd2VycGMqLSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1wcGNwaWMiCi0gICAgICA7OwotICAgICotKi0qKQotICAgICAgaWYgdGVzdCAtZiAke3NyY2Rpcn0vY29uZmlnL21oLSR7aG9zdF9jcHV9cGljOyB0aGVuCi0gICAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC0ke2hvc3RfY3B1fXBpYyIKLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi1maQotCi1ybSAtZiBtaC1mcmFnCi1pZiBbIC1uICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF0gOyB0aGVuCi0gIGZvciBmIGluICR7aG9zdF9tYWtlZmlsZV9mcmFnfQotICBkbwotICAgIGNhdCAke3NyY2Rpcn0vJGYgPj4gbWgtZnJhZwotICBkb25lCi0gIGhvc3RfbWFrZWZpbGVfZnJhZz1taC1mcmFnCi1maQotCi0jIHBlci10YXJnZXQ6Ci0KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgdjgxMCopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC12ODEwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICBwb3dlcnBjLSotbmV0d2FyZSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1uZXR3YXJlIgotICAgIDs7Ci0gICotKi1saW51eC1nbnUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbGludXgiCi0gICAgOzsKLSAgKi0qLWFpeDQuWzM0NTY3ODldKiB8ICotKi1haXhbNTY3ODldLiopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1haXg0MyIKLSAgICA7OwotICBtaXBzKi0qLXBlIHwgc2gqLSotcGUgfCAqYXJtLXdpbmNlLXBlKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtd2luY2UiCi0gICAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgYWx3YXlzIHVzZSAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gYnVpbGQKLSMgdGhlIHRhcmdldCBsaWJyYXJpZXMsIHNpbWlsYXJseSBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgLU9zCi0jIG9uIHNlbGVjdGVkIHBsYXRmb3Jtcy4KLWNhc2UgIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX06JHt0YXJnZXR9IiBpbgotICB5ZXM6KikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICA6ZDMwdi0qKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZDMwdiIKLSAgICA7OwotICA6bTMyci0qIHwgOmQxMHYtKiB8IDpmcjMwLSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCi0gICAgOzsKLSAgbm86KiB8IDoqKQotICAgIDs7Ci0gICopCi0gICAgZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX1cIiBmb3IgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGZsYWc7IGlnbm9yZWQiIDE+JjIKLSAgICA7OwotZXNhYwotCi1za2lwZGlycz0KLWdhc2Rpcj1nYXMKLXVzZV9nbnVfbGQ9Ci11c2VfZ251X2FzPQotCi0jIHNvbWUgdG9vbHMgYXJlIHNvIGRlcGVuZGVudCB1cG9uIFgxMSB0aGF0IGlmIHdlJ3JlIG5vdCBidWlsZGluZyB3aXRoIFgsIAotIyBpdCdzIG5vdCBldmVuIHdvcnRoIHRyeWluZyB0byBjb25maWd1cmUsIG11Y2ggbGVzcyBidWlsZCwgdGhhdCB0b29sLgotCi1jYXNlICR7d2l0aF94fSBpbgotICB5ZXMgfCAiIikgICMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgdHJlZSBpcyB0aGF0IFgxMSBpcyBhdmFpbGFibGUKLQk7OwotICBubykKLQlza2lwZGlycz0iJHtza2lwZGlyc30gdGsgbGliZ3VpIGdhc2giCi0JOzsKLSAgKikKLSAgICAJZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7d2l0aF94fVwiIGZvciAtd2l0aC14IGZsYWc7IGlnbm9yZWQiIDE+JjIKLSAgICAJOzsKLWVzYWMKLQotIyBTb21lIHRvb2xzIGFyZSBvbmx5IHN1aXRhYmxlIGZvciBidWlsZGluZyBpbiBhICJuYXRpdmUiIHNpdHVhdGlvbi4KLSMgVGhvc2UgYXJlIGFkZGVkIHdoZW4gd2UgaGF2ZSBhIGhvc3Q9PXRhcmdldCBjb25maWd1cmF0aW9uLiAgRm9yIGNyb3NzCi0jIHRvb2xjaGFpbnMsIHdlIGFkZCBzb21lIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZnVsIGluIGEKLSMgY3Jvc3MtY29tcGlsZXIuCi0KLWlzX2Nyb3NzX2NvbXBpbGVyPQotCi1pZiBbIHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgXSA7IHRoZW4KLQkjIHdoZW4gZG9pbmcgYSBuYXRpdmUgdG9vbGNoYWluLCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cwotCSMgdGhhdCBhcmUgaW4gdGhlICdjcm9zcyBvbmx5JyBsaXN0Ci0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7Y3Jvc3Nfb25seX0iCi0JaXNfY3Jvc3NfY29tcGlsZXI9bm8KLWVsc2UKLQkjIHNpbWlsYXJseSwgZG9uJ3QgYnVpbGQgdGhlIHRhcmdldHMgaW4gdGhlICduYXRpdmUgb25seScgCi0JIyBsaXN0IHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlcgotCXNraXBkaXJzPSIke3NraXBkaXJzfSAke25hdGl2ZV9vbmx5fSIKLQlpc19jcm9zc19jb21waWxlcj15ZXMKLWZpCQotCi0jIFdlIGFsd2F5cyB3YW50IHRvIHVzZSB0aGUgc2FtZSBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeSwgc28gdGhhdCBkZWphZ251Ci0jIGNhbiByZWxpYWJseSBmaW5kIGl0LgotdGFyZ2V0X3N1YmRpcj0ke3RhcmdldF9hbGlhc30KLQotaWYgWyAhIC1kICR7dGFyZ2V0X3N1YmRpcn0gXSA7IHRoZW4KLSAgaWYgbWtkaXIgJHt0YXJnZXRfc3ViZGlyfSA7IHRoZW4gdHJ1ZQotICBlbHNlCi0gICAgZWNobyAiJyoqKiBjb3VsZCBub3QgbWFrZSAke1BXRD1gcHdkYH0vJHt0YXJnZXRfc3ViZGlyfSIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkKLQotY29weV9kaXJzPQotCi0jIEhhbmRsZSAtLXdpdGgtaGVhZGVycz1YWFguICBUaGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGRpcmVjdG9yeSBhcmUKLSMgY29waWVkIHRvICQodG9vbGRpcikvc3lzLWluY2x1ZGUuCi1pZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgotICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtaGVhZGVycyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZwotICAgIGV4aXQgMQotICBmaQotICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSAgIiIpIHg9JHtwcmVmaXh9IDs7Ci0gICopIHg9JHtleGVjX3ByZWZpeH0gOzsKLSAgZXNhYwotICBjb3B5X2RpcnM9IiR7Y29weV9kaXJzfSAke3dpdGhfaGVhZGVyc30gJHgvJHt0YXJnZXRfYWxpYXN9L3N5cy1pbmNsdWRlIgotZmkKLQotIyBIYW5kbGUgLS13aXRoLWxpYnM9WFhYLiAgTXVsdGlwbGUgZGlyZWN0b3JpZXMgYXJlIHBlcm1pdHRlZC4gIFRoZQotIyBjb250ZW50cyBhcmUgY29waWVkIHRvICQodG9vbGRpcikvbGliLgotaWYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geG5vIF07IHRoZW4KLSAgICBlY2hvIDE+JjIgJyoqKicgLS13aXRoLWxpYnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBjcm9zcyBjb21waWxpbmcKLSAgICBleGl0IDEKLSAgZmkKLSAgIyBDb3B5IHRoZSBsaWJyYXJpZXMgaW4gcmV2ZXJzZSBvcmRlciwgc28gdGhhdCBmaWxlcyBpbiB0aGUgZmlyc3QgbmFtZWQKLSAgIyBsaWJyYXJ5IG92ZXJyaWRlIGZpbGVzIGluIHN1YnNlcXVlbnQgbGlicmFyaWVzLgotICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSAgIiIpIHg9JHtwcmVmaXh9IDs7Ci0gICopIHg9JHtleGVjX3ByZWZpeH0gOzsKLSAgZXNhYwotICBmb3IgbCBpbiAke3dpdGhfbGlic307IGRvCi0gICAgY29weV9kaXJzPSIkbCAkeC8ke3RhcmdldF9hbGlhc30vbGliICR7Y29weV9kaXJzfSIKLSAgZG9uZQotZmkKLQotIyBJZiBib3RoIC0td2l0aC1oZWFkZXJzIGFuZCAtLXdpdGgtbGlicyBhcmUgc3BlY2lmaWVkLCBkZWZhdWx0IHRvCi0jIC0td2l0aG91dC1uZXdsaWIuCi1pZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF0gJiYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCIke3dpdGhfbmV3bGlifSIgPSB4IF07IHRoZW4KLSAgICB3aXRoX25ld2xpYj1ubwotICBmaQotZmkKLQotIyBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi8tLXdpdGhvdXQtbmV3bGliLgotaWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4bm8gXTsgdGhlbgotICBza2lwZGlycz0iJHtza2lwZGlyc30gdGFyZ2V0LW5ld2xpYiIKLWVsaWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4eWVzIF07IHRoZW4KLSAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi1maQotCi0jIERlZmF1bHQgdG8gdXNpbmcgLS13aXRoLXN0YWJzIGZvciBjZXJ0YWluIHRhcmdldHMuCi1pZiBbIHgke3dpdGhfc3RhYnN9ID0geCBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgbWlwcyotKi1pcml4NiopCi0gICAgOzsKLSAgbWlwcyotKi0qIHwgYWxwaGEqLSotb3NmKikKLSAgICB3aXRoX3N0YWJzPXllczsKLSAgICB3aXRob3B0aW9ucz0iJHt3aXRob3B0aW9uc30gLS13aXRoLXN0YWJzIgotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLSMgSGFuZGxlICR7Y29weV9kaXJzfQotc2V0IGZub3JkICR7Y29weV9kaXJzfQotc2hpZnQKLXdoaWxlIFsgJCMgIT0gMCBdOyBkbwotICBpZiBbIC1mICQyL0NPUElFRCBdICYmIFsgeCJgY2F0ICQyL0NPUElFRGAiID0geCIkMSIgXTsgdGhlbgotICAgIDoKLSAgZWxzZQotICAgIGVjaG8gQ29weWluZyAkMSB0byAkMgotCi0gICAgIyBVc2UgdGhlIGluc3RhbGwgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgcmVxdWlyZWQKLSAgICAjIHBhcmVudCBkaXJlY3Rvcmllcy4KLSAgICBpZiBbIC1kICQyIF07IHRoZW4KLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICBlY2hvID5jb25maWcudGVtcAotICAgICAgJHtzcmNkaXJ9L2luc3RhbGwtc2ggLWMgLW0gNjQ0IGNvbmZpZy50ZW1wICQyL0NPUElFRAotICAgIGZpCi0KLSAgICAjIENvcHkgdGhlIGRpcmVjdG9yeSwgYXNzdW1pbmcgd2UgaGF2ZSB0YXIuCi0gICAgIyBGSVhNRTogU2hvdWxkIHdlIHVzZSBCIGluIHRoZSBzZWNvbmQgdGFyPyAgTm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgaXQuCi0gICAgKGNkICQxOyB0YXIgLWNmIC0gLikgfCAoY2QgJDI7IHRhciAteHBmIC0pCi0KLSAgICAjIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBjb3JyZWN0bHkgYWRqdXN0IGFsbAotICAgICMgc3ltbGlua3MuICBJZiBzb21lYm9keSBjYW4gZmlndXJlIG91dCBob3cgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5Ci0gICAgIyBoZXJlLCBmZWVsIGZyZWUgdG8gYWRkIHRoZSBjb2RlLgotCi0gICAgZWNobyAkMSA+ICQyL0NPUElFRAotICBmaQotICBzaGlmdDsgc2hpZnQKLWRvbmUKLQotIyBDb25maWd1cmUgZXh0cmEgZGlyZWN0b3JpZXMgd2hpY2ggYXJlIGhvc3Qgc3BlY2lmaWMKLQotY2FzZSAiJHtob3N0fSIgaW4KLQlpWzM0NTZdODYtKi1nbzMyKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKLQlpWzM0NTZdODYtKi1taW5ndzMyKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKLQkqLWN5Z3dpbiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBsaWJ0ZXJtY2FwIGRvc3JlbCIgOzsKLWVzYWMKLQotIyBSZW1vdmUgbW9yZSBwcm9ncmFtcyBmcm9tIGNvbnNpZGVyYXRpb24sIGJhc2VkIG9uIHRoZSBob3N0IG9yIAotIyB0YXJnZXQgdGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgYSBwb3J0IG9mIHRoZSBwcm9ncmFtIGRvZXNuJ3QKLSMgZXhpc3QgeWV0LgotCi1ub2NvbmZpZ2RpcnM9IiIKLQotY2FzZSAiJHtob3N0fSIgaW4KLSAgaVszNDU2XTg2LSotdnN0YSkKLSAgICBub2NvbmZpZ2RpcnM9InRjbCBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIGdwcm9mIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdvMzIqIHwgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCi0gICAgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYgZ2V0dGV4dCIKLQk7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKikKLSAgICAjIG5vY29uZmlnZGlycz0idGNsIHRrIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICBub2NvbmZpZ2RpcnM9ImV4cGVjdCBkZWphZ251IGN2cyBhdXRvY29uZiBhdXRvbWFrZSBzZW5kLXByIHJjcyBndWlsZSBwZXJsIHRleGluZm8gYXBhY2hlIGluZXQgbGlidG9vbCIKLQk7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRrIGl0Y2wgdGl4IGxpYmd1aSBnZGIiCi0gICAgIDs7Ci0gICotKi1jeWd3aW4qKQotICAgICBub2NvbmZpZ2RpcnM9ImF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCIKLSAgICA7OwotICAqLSotbmV0YnNkKikKLSAgICBub2NvbmZpZ2RpcnM9InJjcyIKLSAgICA7OwotICBwcGMqLSotcGUpCi0gICAgIG5vY29uZmlnZGlycz0icGF0Y2ggZGlmZiBtYWtlIHRrIHRjbCBleHBlY3QgZGVqYWdudSBjdnNzcmMgYXV0b2NvbmYgYXV0b21ha2UgdGV4aW5mbyBiaXNvbiBzZW5kLXByIGdwcm9mIHJjcyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICA7OwotZXNhYwotCi0KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgKi0qLW5ldHdhcmUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGlicnggdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliaWJlcnR5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotcnRlbXMqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLXZ4d29ya3MqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotZGVjLW9zZiopCi0gICAgIyBsZCB3b3JrcywgYnV0IGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIGVtYWNzIGRvZXNuJ3QKLSAgICAjIHdvcmsuICBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeS4gIEknbSBub3Qgc3VyZSBhYm91dCBmaWxldXRpbHMuCi0gICAgIyBnYXMgZG9lc24ndCBnZW5lcmF0ZSBleGNlcHRpb24gaW5mb3JtYXRpb24uCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyBsZCBlbWFjcyBmaWxldXRpbHMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBsZCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotKi1saW51eCopCi0gICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgYWxwaGEqLSotKikKLSAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNoKi0qLXBlfG1pcHMqLSotcGV8KmFybS13aW5jZS1wZSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmphdmEgdGFyZ2V0LWxpYmZmaSB0YXJnZXQtemxpYiIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWJvZWhtLWdjIHRhcmdldC1xdGhyZWFkcyB0YXJnZXQtZXhhbXBsZXMiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJyeCB0YXJnZXQtbGliaWJlcnR5IHRleGluZm8gc2VuZC1wciIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGNsIHRpeCB0ayBpdGNsIGxpYmd1aSBzaW0iCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGV4cGVjdCBkZWphZ251IgotICAgICMgdGhlIEMrKyBsaWJyYXJpZXMgZG9uJ3QgYnVpbGQgb24gdG9wIG9mIENFJ3MgQyBsaWJyYXJpZXMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyIKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1uZXdsaWIiCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgICotKi1jeWd3aW4qKSA7OyAjIGtlZXAgZ2RiIGFuZCByZWFkbGluZQotICAgICAgKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiByZWFkbGluZSB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliZysrIgotCSA7OwotICAgIGVzYWMKLSAgICA7OwotICBhcmMtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotcGUqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotY29mZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotZWxmKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBhcm0tKi1vYWJpKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGM0eC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB0aHVtYi0qLWNvZmYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB0aHVtYi0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHRodW1iLSotb2FiaSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHRodW1iLSotcGUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhcm0tKi1yaXNjaXgqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgZDEwdi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIgotICAgIDs7Ci0gIGQzMHYtKi0qKQotICAgIDs7Ci0gIGZyMzAtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBoODMwMCotKi0qIHwgXAotICBoODUwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBocHBhKi0qLSplbGYqIHwgXAotICBocHBhKi0qLWxpbnV4LWdudSogfCBcCi0gIGhwcGEqLSotbGl0ZXMqIHwgXAotICBocHBhKjY0Ki0qLSopCi0gICAgIyBEbyBjb25maWd1cmUgbGQvYmludXRpbHMvZ2FzIGZvciB0aGUgYWJvdmUgY2FzZXMuCi0gICAgOzsKLSAgaHBwYSotKi0qKQotICAgICMgSFAncyBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseSAoYnV0IG9uIEJTRCBhbmQgTWFjaAotICAgICMgY2MgaXMgZ2NjLCBhbmQgb24gYW55IHN5c3RlbSBhIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBjYyB0bwotICAgICMgd2hhdGV2ZXIgdGhleSB3YW50LiAgRklYTUUsIGVtYWNzIGVtYWNzMTkpLgotICAgIGNhc2UgIiR7Q0N9IiBpbgotCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKLSAgICAgICAgKikgOzsKLSAgICBlc2FjCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHNoZWxsdXRpbHMiCi0gICAgOzsKLSAgaWE2NCotKi1lbGYqKQotICAgICMgTm8gZ2RiIHN1cHBvcnQgeWV0LgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0aXggcmVhZGxpbmUgbW1hbGxvYyBsaWJndWkgaXRjbCBnZGIiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotY29mZiB8IGlbMzQ1Nl04Ni0qLWVsZikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLSAgICAgICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ28zMiogfCBpWzM0NTZdLSotbXNkb3NkamdwcCopCi0gICAgIyBidXQgZG9uJ3QgYnVpbGQgZ2RiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKikKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC1taW5ndyIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZXhwZWN0IHRhcmdldC1saWJnbG9zcyIKLQotICAgICMgQ2FuJ3QgYnVpbGQgZ2RiIGZvciBtaW5ndzMyIGlmIG5vdCBuYXRpdmUuCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLW1pbmd3MzIpIDs7ICMga2VlcCBnZGIgdGNsIHRrIGV4cGVjdCBldGMuCi0gICAgICAqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsgICAgCi0gICotKi1jeWd3aW4qKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYnRlcm1jYXAgdGFyZ2V0LXdpbnN1cCIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgICMgYWx3YXlzIGJ1aWxkIG5ld2xpYi4KLSAgICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKLQotICAgICMgQ2FuJ3QgYnVpbGQgZ2RiIGZvciBDeWd3aW4gaWYgbm90IG5hdGl2ZS4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgKi0qLWN5Z3dpbiopIDs7ICMga2VlcCBnZGIgdGNsIHRrIGV4cGVjdCBldGMuCi0gICAgICAqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggbGliZ3VpIGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7ICAgIAotICBpWzM0NTZdODYtKi1wZSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLSAgICAjIFRoZSBsaW5rZXIgZG9lcyBub3QgeWV0IGtub3cgYWJvdXQgd2VhayBzeW1ib2xzIGluIENPRkYsCi0gICAgIyBhbmQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gaGFuZGxlIG1peGVkIEVMRiBhbmQgQ09GRi4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NCopCi0gICAgIyBUaGUgU1lTVjQgQyBjb21waWxlciBkb2Vzbid0IGhhbmRsZSBFbWFjcyBjb3JyZWN0bHkKLSAgICBjYXNlICIke0NDfSIgaW4KLQkiIiB8IGNjKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkiIDs7Ci0gICAgICAgICopIDs7Ci0gICAgZXNhYwotICAgICMgYnV0IHRoYXQncyBva2F5IHNpbmNlIGVtYWNzIGRvZXNuJ3Qgd29yayBhbnl3YXkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYmVvcyopCi0gICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIDs7Ci0gIG02OGstKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBtNjhrLSotY29mZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG1uMTAyMDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG1uMTAzMDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgcG93ZXJwYy0qLWFpeCopCi0gICAgIyBjb3BpZWQgZnJvbSByczYwMDAtKi0qIGVudHJ5Ci0gICAgIyBUaGUgY29uZmlndXJlIGFuZCBidWlsZCBvZiBsZCBhcmUgY3VycmVudGx5IGRpc2FibGVkIGJlY2F1c2UKLSAgICAjIEdOVSBsZCBpcyBrbm93biB0byBiZSBicm9rZW4gZm9yIEFJWCA0LjIgYW5kIDQuMyAoYXQgbGVhc3QpCi0gICAgIyBUaGUgc3ltcHRvbSBpcyB0aGF0IEdEQnRrIDQuMTggZmFpbHMgYXQgc3RhcnR1cCB3aXRoIGEgc2VnZmF1bHQKLSAgICAjIGlmIGxpbmtlZCBieSBHTlUgbGQsIGJ1dCBub3QgaWYgbGlua2VkIGJ5IHRoZSBuYXRpdmUgbGQuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIGN2c3NyYyB0YXJnZXQtbGliZ2xvc3MgbGQiCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHBvd2VycGMqLSotd2lubnQqIHwgcG93ZXJwYyotKi1wZSogfCBwcGMqLSotcGUpCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIG1ha2UgZXhwZWN0IHRhcmdldC1saWJnbG9zcyBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotICAgIDs7Ci0gICAgIyBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBjYW4gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKLSAgcG93ZXJwY2xlLSotc29sYXJpcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBzaW0gbWFrZSB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICA7OwotICBwb3dlcnBjLSotZWFiaSkKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgcnM2MDAwLSotbHlueG9zKikKLSAgICAjIFRoZSBDVlMgc2VydmVyIGNvZGUgZG9lc24ndCB3b3JrIG9uIHRoZSBSUy82MDAwCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIGdwcm9mIGN2c3NyYyIKLSAgICA7OwotICByczYwMDAtKi1haXgqKQotICAgICMgVGhlIGNvbmZpZ3VyZSBhbmQgYnVpbGQgb2YgbGQgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCBiZWNhdXNlCi0gICAgIyBHTlUgbGQgaXMga25vd24gdG8gYmUgYnJva2VuIGZvciBBSVggNC4yIGFuZCA0LjMgKGF0IGxlYXN0KQotICAgICMgVGhlIHN5bXB0b20gaXMgdGhhdCBHREJ0ayA0LjE4IGZhaWxzIGF0IHN0YXJ0dXAgd2l0aCBhIHNlZ2ZhdWx0Ci0gICAgIyBpZiBsaW5rZWQgYnkgR05VIGxkLCBidXQgbm90IGlmIGxpbmtlZCBieSB0aGUgbmF0aXZlIGxkLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiBsZCIKLSAgICB1c2VfZ251X2xkPW5vCi0gICAgOzsKLSAgcnM2MDAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiCi0gICAgOzsKLSAgbTY4ay1hcG9sbG8tKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgYmludXRpbHMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgICMgVGhlIEdOVSBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotICAgICMgZW1hY3MgaXMgZW1hY3MgMTgsIHdoaWNoIGRvZXMgbm90IHdvcmsgb24gSXJpeCA1IChlbWFjczE5IGRvZXMgd29yaykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgZ3Byb2YgZW1hY3MgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDYqKQotICAgICMgVGhlIEdOVSBhc3NlbWJsZXIgZG9lcyBub3Qgc3VwcG9ydCBJUklYIDYuCi0gICAgIyBlbWFjcyBpcyBlbWFjcyAxOCwgd2hpY2ggZG9lcyBub3Qgd29yayBvbiBJcml4IDUgKGVtYWNzMTkgZG9lcyB3b3JrKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMgZ3Byb2YgZW1hY3MgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotbGludXgqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWJzZCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzdHgzOS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIiAgICMgc2FtZSBhcyBnZW5lcmljIG1pcHMKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgOzsKLSAgbWlwcyotKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICA7OwotICByb21wLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGxkIGdhcyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBzaC0qLSopCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLXZzdGEpIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLWdvMzIqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgKikgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyBncHJvZiAvIC8nYCA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNwYXJjLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHNwYXJjNjQtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmNsaXRlLSotKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmMtKi1zdW5vczQqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGdkYnRlc3QgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgZWxzZQotICAgICAgICAgICB1c2VfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICB2ODEwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGdhcyBnY2MgZ2RiIGxkIHRhcmdldC1saWJpbyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdjg1MC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwZS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwZWEtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdmF4LSotdm1zKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdmF4LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLWxpbnV4KikKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgKi0qLWx5bnhvcyopCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAKLSAgKi0qLW1hY29zKiB8IFwKLSAgKi0qLW1wdyopCi0gICAgIyBNYWNzIHdhbnQgYSByZXNvdXJjZSBjb21waWxlci4KLSAgICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBncmV6IgotICAgIDs7ICAgIAotZXNhYwotCi0jIElmIHdlIGFyZW4ndCBidWlsZGluZyBuZXdsaWIsIHRoZW4gZG9uJ3QgYnVpbGQgbGliZ2xvc3MsIHNpbmNlIGxpYmdsb3NzCi0jIGRlcGVuZHMgdXBvbiBzb21lIG5ld2xpYiBoZWFkZXIgZmlsZXMuCi1jYXNlICIke25vY29uZmlnZGlyc30iIGluCi0gICp0YXJnZXQtbGliZ2xvc3MqKSA7OwotICAqdGFyZ2V0LW5ld2xpYiopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiIDs7Ci1lc2FjCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgbGQgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfbGQgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2xkPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCIKLWZpCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgYXMgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfYXMgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2FzPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMiCi1maQotCi0jIFJlbW92ZSB0aGUgZW50cmllcyBpbiAkc2tpcGRpcnMgYW5kICRub2NvbmZpZ2RpcnMgZnJvbSAkY29uZmlnZGlycyBhbmQKLSMgJHRhcmdldF9jb25maWdkaXJzLgotIyBJZiB3ZSBoYXZlIHRoZSBzb3VyY2UgZm9yICRub2NvbmZpZ2RpcnMgZW50cmllcywgYWRkIHRoZW0gdG8gJG5vdHN1cHAuCi0KLW5vdHN1cHA9IiIKLWZvciBkaXIgaW4gLiAkc2tpcGRpcnMgJG5vY29uZmlnZGlycyA7IGRvCi0gIGRpcm5hbWU9YGVjaG8gJGRpciB8IHNlZCAtZSBzL3RhcmdldC0vL2dgCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgY29uZmlnZGlycz1gZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB0YXJnZXRfY29uZmlnZGlycz1gZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBzZWQgLWUgInMvICR7ZGlyfSAvIC8iYAotICAgIGlmIFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUgXSBcCi0JfHwgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCi0gICAgICBpZiBlY2hvICIgJHtza2lwZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQl0cnVlCi0gICAgICBlbHNlCi0Jbm90c3VwcD0iJG5vdHN1cHAgJGRpciIKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWRvbmUKLQotIyBTb21ldGltZXMgdGhlIHRvb2xzIGFyZSBkaXN0cmlidXRlZCB3aXRoIGxpYmliZXJ0eSBidXQgd2l0aCBubyBvdGhlcgotIyBsaWJyYXJpZXMuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gYnVpbGQgdGFyZ2V0LWxpYmliZXJ0eS4KLWlmIFsgLW4gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIG90aGVycz0KLSAgZm9yIGkgaW4gYGVjaG8gJHt0YXJnZXRfY29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgaWYgWyAiJGkiICE9ICJsaWJpYmVydHkiIF07IHRoZW4KLSAgICAgIGlmIFsgLXIgJHNyY2Rpci8kaS9jb25maWd1cmUgXSB8fCBbIC1yICRzcmNkaXIvJGkvY29uZmlndXJlLmluIF07IHRoZW4KLQlvdGhlcnM9eWVzOwotCWJyZWFrOwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIGlmIFsgLXogIiR7b3RoZXJzfSIgXTsgdGhlbgotICAgIHRhcmdldF9jb25maWdkaXJzPQotICBmaQotZmkKLQotIyBEZWNvbmZpZ3VyZSBhbGwgc3ViZGlyZWN0b3JpZXMsIGluIGNhc2Ugd2UgYXJlIGNoYW5naW5nIHRoZQotIyBjb25maWd1cmF0aW9uIGZyb20gb25lIHdoZXJlIGEgc3ViZGlyZWN0b3J5IGlzIHN1cHBvcnRlZCB0byBvbmUgd2hlcmUgaXQKLSMgaXMgbm90LgotaWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHtjb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIHJtIC1mICRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke3RhcmdldF9jb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke3RhcmdldF9jb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBybSAtZiAke3RhcmdldF9zdWJkaXJ9LyRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi0KLSMgUHJvZHVjZSBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIHN1YmRpcnMgd2UgY2FuJ3QgY29uZmlndXJlLgotIyBUaGlzIGlzbid0IGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgaW4gdGhlIEN5Z251cyB0cmVlLCBidXQgaW4gdGhlIGluZGl2aWR1YWwKLSMgRlNGIHJlbGVhc2VzLCBpdCdzIGltcG9ydGFudCB0byBsZXQgcGVvcGxlIGtub3cgd2hlbiB0aGVpciBtYWNoaW5lIGlzbid0Ci0jIHN1cHBvcnRlZCBieSB0aGUgb25lIG9yIHR3byBwcm9ncmFtcyBpbiBhIHBhY2thZ2UuCi0KLWlmIFsgLW4gIiR7bm90c3VwcH0iIF0gJiYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF07IHRoZW4KLSAgIyBJZiAkYXBwZGlycyBpcyBub24tZW1wdHksIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSBkaXJlY3RvcmllcyBtdXN0IHN0aWxsCi0gICMgYmUgY29uZmlndXJlZCwgb3Igd2UgZXJyb3Igb3V0LiAgKEUuZy4sIGlmIHRoZSBnYXMgcmVsZWFzZSBzdXBwb3J0cyBhCi0gICMgc3BlY2lmaWVkIHRhcmdldCBpbiBzb21lIHN1YmRpcnMgYnV0IG5vdCB0aGUgZ2FzIHN1YmRpciwgd2Ugc2hvdWxkbid0Ci0gICMgcHJldGVuZCB0aGF0IGFsbCBpcyB3ZWxsLikKLSAgaWYgWyAtbiAiJGFwcGRpcnMiIF07IHRoZW4KLSAgICBmb3IgZGlyIGluICRhcHBkaXJzIDsgZG8KLSAgICAgIGlmIFsgLXIgJGRpci9NYWtlZmlsZS5pbiBdOyB0aGVuCi0JaWYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLQlpZiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLW4gIiRhcHBkaXJzIiBdOyB0aGVuCi0gICAgICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLiIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLSAgIyBPa2F5LCBzb21lIGFwcGxpY2F0aW9uIHdpbGwgYnVpbGQsIG9yIHdlIGRvbid0IGNhcmUgdG8gY2hlY2suICBTdGlsbAotICAjIG5vdGlmeSBvZiBzdWJkaXJzIG5vdCBnZXR0aW5nIGJ1aWx0LgotICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBzdWJkaXJlY3RvcmllczoiIDE+JjIKLSAgZWNobyAiICAgICR7bm90c3VwcH0iIDE+JjIKLSAgZWNobyAiICAgIChBbnkgb3RoZXIgZGlyZWN0b3JpZXMgc2hvdWxkIHN0aWxsIHdvcmsgZmluZS4pIiAxPiYyCi1maQotCi0jIFNldCB3aXRoX2dudV9hcyBhbmQgd2l0aF9nbnVfbGQgYXMgYXBwcm9wcmlhdGUuCi0jCi0jIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5Ci0jIGlzIGF2YWlsYWJsZSwgYW5kIGJ5IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zCi0jIGhhdmUgcmVxdWVzdGVkIHRoYXQgdGhpcyBtYWdpYyBub3QgaGFwcGVuLgotIyAKLSMgVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFsd2F5cyBvdmVycmlkZSB0aGUgZXhwbGljaXQgc2V0dGluZ3MgaW4gCi0jIGNvbmZpZ3VyZS5pbiwgYW5kIHRoZSBzZXR0aW5ncyBpbiBjb25maWd1cmUuaW4gb3ZlcnJpZGUgdGhpcyBtYWdpYy4KLSMKLSMgSWYgdGhlIGRlZmF1bHQgZm9yIGEgdG9vbGNoYWluIGlzIHRvIHVzZSBHTlUgYXMgYW5kIGxkLCBhbmQgeW91IGRvbid0IAotIyB3YW50IHRvIGRvIHRoYXQsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIC0td2l0aG91dC1nbnUtYXMgYW5kCi0jIC0td2l0aG91dC1nbnUtbGQgb3B0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLWlmIFsgeCR7dXNlX2dudV9hc30gPSB4IF0gOyB0aGVuCi0gIGlmIFsgeCR7d2l0aF9nbnVfYXN9ICE9IHhubyBdICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtnYXNkaXJ9ICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS8ke2dhc2Rpcn0gXSA7IHRoZW4KLSAgICB3aXRoX2dudV9hcz15ZXMKLSAgICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1nbnUtYXMiCi0gIGZpCi1maQotCi1pZiBbIHgke3VzZV9nbnVfbGR9ID0geCBdIDsgdGhlbgotICBpZiBbIHgke3dpdGhfZ251X2xkfSAhPSB4bm8gXSAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiIGxkICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9sZCBdIDsgdGhlbgotICAgIHdpdGhfZ251X2xkPXllcwotICAgIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLWdudS1sZCIKLSAgZmkKLWZpCi0KLSMgSWYgdXNpbmcgbmV3bGliLCBhZGQgLS13aXRoLW5ld2xpYiB0byB0aGUgd2l0aG9wdGlvbnMgc28gdGhhdCBnY2MvY29uZmlndXJlCi0jIGNhbiBkZXRlY3QgdGhpcyBjYXNlLgotCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiB0YXJnZXQtbmV3bGliICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9uZXdsaWIgXSA7IHRoZW4KLSAgd2l0aF9uZXdsaWI9eWVzCi0gIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLW5ld2xpYiIKLWZpCi0KLWlmIFsgeCR7c2hhcmVkfSA9IHh5ZXMgXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgaHBwYSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQteDg2cGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQUlYLgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1wcGNwaWMiCi0gICAgICA7OwotICAgIGFscGhhKi0qLWxpbnV4KikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgICopCi0gICAgICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9jb25maWcvbXQtJHt0YXJnZXRfY3B1fXBpYzsgdGhlbgotICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LSR7dGFyZ2V0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbXQtZnJhZwotaWYgWyAtbiAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIF0gOyB0aGVuCi0gIGZvciBmIGluICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9Ci0gIGRvCi0gICAgY2F0ICR7c3JjZGlyfS8kZiA+PiBtdC1mcmFnCi0gIGRvbmUKLSAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9bXQtZnJhZwotZmkKLQotIyBwb3N0LXRhcmdldDoKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgaXMgYWJsZSB0byBnZW5lcmF0ZSBhbiBleGVjdXRhYmxlLiAgSWYgaXQKLSMgY2FuJ3QsIHdlIGFyZSBwcm9iYWJseSBpbiB0cm91YmxlLiAgV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHdlIGNhbiBydW4gdGhlCi0jIGV4ZWN1dGFibGUtLXdlIG1pZ2h0IGJlIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXItLXdlIG9ubHkgY2FyZSB3aGV0aGVyIGl0Ci0jIGNhbiBiZSBjcmVhdGVkLiAgQXQgdGhpcyBwb2ludCB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0IGhhcyBzZXQgQ0MuCi1lY2hvICJpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNvbmZ0ZXN0LmMKLSR7Q0N9IC1vIGNvbmZ0ZXN0ICR7Q0ZMQUdTfSAke0NQUEZMQUdTfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMKLWlmIFsgJD8gPSAwIF0gJiYgWyAtcyBjb25mdGVzdCAtbyAtcyBjb25mdGVzdC5leGUgXTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gMT4mMiAiKioqIFRoZSBjb21tYW5kICcke0NDfSAtbyBjb25mdGVzdCAke0NGTEFHU30gJHtDUFBGTEFHU30gJHtMREZMQUdTfSBjb25mdGVzdC5jJyBmYWlsZWQuIgotICBlY2hvIDE+JjIgIioqKiBZb3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENDIHRvIGEgd29ya2luZyBjb21waWxlci4iCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBleGl0IDEKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotIyBUaGUgU29sYXJpcyAvdXNyL3VjYi9jYyBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgdG8gd29yay4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIHNwYXJjLXN1bi1zb2xhcmlzMiopCi0gICAgICBDQ0JBU0U9ImBlY2hvICR7Q0MtY2N9IHwgc2VkICdzLyAuKiQvLydgIgotICAgICAgaWYgWyAiYC91c3IvYmluL3doaWNoICRDQ0JBU0VgIiA9ICIvdXNyL3VjYi9jYyIgXSA7IHRoZW4KLSAgICAgICAgICBjb3VsZF91c2U9Ci0gICAgICAgICAgWyAtZCAvb3B0L1NVTldzcHJvL2JpbiBdICYmIGNvdWxkX3VzZT0iL29wdC9TVU5Xc3Byby9iaW4iCi0gICAgICAgICAgaWYgWyAtZCAvb3B0L2N5Z251cy9iaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgY291bGRfdXNlPSIvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGNvdWxkX3VzZT0iJGNvdWxkX3VzZSBvciAvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgZmkKLSAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYy4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIgUEFUSCBvciBDQyAiCi0gICAgICAgICAgICBlY2hvICJ2YXJpYWJsZSBhbmQgcmVydW4gY29uZmlndXJlLiIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYywgd2hlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgQyBjb21waWxlciBmcm9tIgotICAgICAgICAgICAgZWNobyAiJGNvdWxkX3VzZS4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIiCi0gICAgICAgICAgICBlY2hvICJQQVRIIG9yIENDIHZhcmlhYmxlIGFuZCByZXJ1biBjb25maWd1cmUuIgotICAgICAgICBmaQotICAgICAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHNldCwgd2UgbXVzdCBzZXQgTERfTElCUkFSWV9QQVRIIHNvIHRoYXQgdGhlCi0jIGJpbnV0aWxzIHRvb2xzIHdpbGwgZmluZCBsaWJiZmQuc28uCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBzZWQgLWUgJ3MvXlNFVF9MSUJfUEFUSFsgCV0qPS4qJC9TRVRfTElCX1BBVEggPSAkKFJFQUxMWV9TRVRfTElCX1BBVEgpLycgXAotICAgICAgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgcm0gLWYgTWFrZWZpbGUKLSAgbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWhwdXgqKQotICAgIHNlZCAtZSAncy9eUlBBVEhfRU5WVkFSWyAJXSo9LiokL1JQQVRIX0VOVlZBUiA9IFNITElCX1BBVEgvJyBcCi0JTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgICBybSAtZiBNYWtlZmlsZQotICAgIG12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLSMgUmVjb3JkIHRhcmdldF9jb25maWdkaXJzIGFuZCB0aGUgY29uZmlndXJlIGFyZ3VtZW50cyBpbiBNYWtlZmlsZS4KLXRhcmdldF9jb25maWdkaXJzPWBlY2hvICIke3RhcmdldF9jb25maWdkaXJzfSIgfCBzZWQgLWUgJ3MvdGFyZ2V0LS8vZydgCi10YXJnYXJncz1gZWNobyAiJHthcmd1bWVudHN9IiB8IFwKLQlzZWQgLWUgJ3MvLS1ub1teIAldKi8vJyBcCi0JICAgIC1lICdzLy0tY2FjaGVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0taG9bYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tYnVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tdGFbYS16LV0qPVteIAldKi8vJ2AKLQotIyBQYXNzaW5nIGEgLS13aXRoLWNyb3NzLWhvc3QgYXJndW1lbnQgbGV0cyB0aGUgdGFyZ2V0IGxpYnJhcmllcyBrbm93Ci0jIHdoZXRoZXIgdGhleSBhcmUgYmVpbmcgYnVpbHQgd2l0aCBhIGNyb3NzLWNvbXBpbGVyIG9yIGJlaW5nIGJ1aWx0Ci0jIG5hdGl2ZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2Ugb3RoZXIgbWVjaGFuaXNtcyB0byBtYWtlIHRoZQotIyBzb3J0cyBvZiBkZWNpc2lvbnMgdGhleSB3YW50IHRvIG1ha2Ugb24gdGhpcyBiYXNpcy4gIFBsZWFzZSBjb25zaWRlcgotIyB0aGlzIG9wdGlvbiB0byBiZSBkZXByZWNhdGVkLiAgRklYTUUuCi1pZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHh5ZXMgXTsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLWNyb3NzLWhvc3Q9JHtob3N0X2FsaWFzfSAke3RhcmdhcmdzfSIKLWZpCi0KLSMgRGVmYXVsdCB0byAtLWVuYWJsZS1tdWx0aWxpYi4KLWlmIFsgeCR7ZW5hYmxlX211bHRpbGlifSA9IHggXTsgdGhlbgotICB0YXJnYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHt0YXJnYXJnc30iCi1maQotCi0jIFBhc3MgLS13aXRoLW5ld2xpYiBpZiBhcHByb3ByaWF0ZS4gIE5vdGUgdGhhdCB0YXJnZXRfY29uZmlnZGlycyBoYXMKLSMgY2hhbmdlZCBmcm9tIHRoZSBlYXJsaWVyIHNldHRpbmcgb2Ygd2l0aF9uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiBuZXdsaWIgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L25ld2xpYiBdIDsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLW5ld2xpYiAke3RhcmdhcmdzfSIKLWZpCi0KLSMgcHJvdmlkZSBhIHByb3BlciBneHhfaW5jbHVkZV9kaXIuCi0jIE5vdGUsIGlmIHlvdSBjaGFuZ2UgdGhlIGRlZmF1bHQsIG1ha2Ugc3VyZSB0byBmaXggYm90aCBoZXJlIGFuZCBpbgotIyB0aGUgZ2NjLCBsaWJpbywgbGlic3RkYysrIGFuZCBsaWJnKysgc3ViZGlyZWN0b3JpZXMuCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWd4eC1pbmNsdWRlLWRpciBvciAtLXdpdGhvdXQtZ3h4LWluY2x1ZGUtZGlyIHdhcyBnaXZlbi4KLWd4eF9pbmNsdWRlX2Rpcj0KLWlmIHRlc3QgLW4gIiR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9IjsgdGhlbgotICBjYXNlICIke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfSIgaW4KLSAgICB5ZXMgKQotICAgICAgZWNobyAiY29uZmlndXJlLmluOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZ2l2ZW4gZm9yIGcrKyBpbmNsdWRlIGRpcmVjdG9yeSIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIG5vICkKLSAgICAgIDs7Ci0gICAgKiApCi0gICAgICBneHhfaW5jbHVkZV9kaXI9JHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0KLSAgICAgIDs7Ci0gIGVzYWMKLWZpCi1pZiB0ZXN0IHgke2d4eF9pbmNsdWRlX2Rpcn0gPSB4OyB0aGVuCi0gIGlmIHRlc3QgeCR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA9IHh5ZXM7IHRoZW4KLSAgICBneHhfaW5jbHVkZV9kaXI9JyR7bGlic3ViZGlyfS9pbmNsdWRlL2crKycKLSAgZWxzZQotICAgIC4gJHt0b3BzcmNkaXJ9L2NvbmZpZy5pZgotICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9L2luY2x1ZGUvZysrJy0ke2xpYnN0ZGN4eF9pbnRlcmZhY2V9Ci0gIGZpCi1lbHNlCi0gIGd4eF9pbmNsdWRlX2Rpcj0ke2d4eF9pbmNsdWRlX2Rpcn0KLWZpCi0KLXRhcmdhcmdzPSItLWhvc3Q9JHt0YXJnZXRfYWxpYXN9IC0tYnVpbGQ9JHtidWlsZF9hbGlhc30gJHt0YXJnYXJnc30iCi1zZWQgLWUgInM6XlRBUkdFVF9DT05GSUdESVJTWyAJXSo9LiokOlRBUkdFVF9DT05GSUdESVJTID0gJHt0YXJnZXRfY29uZmlnZGlyc306IiBcCi0gICAgLWUgInMlXkNPTkZJR19BUkdVTUVOVFNbIAldKj0uKiQlQ09ORklHX0FSR1VNRU5UUyA9ICR7dGFyZ2FyZ3N9JSIgXAotICAgIC1lICJzJV5UQVJHRVRfU1VCRElSWyAJXSo9LiokJVRBUkdFVF9TVUJESVIgPSAke3RhcmdldF9zdWJkaXJ9JSIgXAotICAgIC1lICJzJV5neHhfaW5jbHVkZV9kaXJbIAldKj0uKiQlZ3h4X2luY2x1ZGVfZGlyPSR7Z3h4X2luY2x1ZGVfZGlyfSUiIFwKLSAgICAgICBNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgTWFrZWZpbGUKLW12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCmRpZmYgLS1naXQgYS9kanVucGFjay5iYXQgYi9kanVucGFjay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwOWY1ZWQuLjAwMDAwMDAKLS0tIGEvZGp1bnBhY2suYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotQGVjaG8gb2ZmDQotUmVtDQotUmVtIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HOiBUaGlzIGZpbGUgbmVlZHMgdG8gaGF2ZSBET1MgQ1JMRiBlbmQtb2YtbGluZQ0KLVJlbSBmb3JtYXQsIG9yIGVsc2Ugc3RvY2sgRE9TL1dpbmRvd3Mgc2hlbGxzIHdpbGwgcmVmdXNlIHRvIHJ1biBpdC4NCi1SZW0NCi1SZW0gVGhpcyBiYXRjaCBmaWxlIHVucGFja3MgdGhlIEdEQiBkaXN0cmlidXRpb24gd2hpbGUgc2ltdWx0YW5lb3VzbHkNCi1SZW0gcmVuYW1pbmcgc29tZSBvZiB0aGUgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGludmFsaWQgb24gRE9TIG9yIGNvbmZsaWN0DQotUmVtIHdpdGggb3RoZXIgZmlsZSBuYW1lcyBhZnRlciB0cnVuY2F0aW9uIHRvIERPUyA4KzMgbmFtZXNwYWNlLg0KLVJlbQ0KLVJlbSBJbnZva2UgbGlrZSB0aGlzOg0KLVJlbQ0KLVJlbSAgICAgZGp1bnBhY2sgZ2RiLVhZWi50YXINCi1SZW0NCi1SZW0gd2hlcmUgWFlaIGlzIHRoZSB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBhcmd1bWVudCBpbmNsdWRlcyBsZWFkaW5nDQotUmVtIGRpcmVjdG9yaWVzLCBpdCBNVVNUIHVzZSBiYWNrc2xhc2hlcywgbm90IGZvcndhcmQgc2xhc2hlcy4NCi1SZW0NCi1SZW0gVGhlIGZvbGxvd2luZyAyIGxpbmVzIG5lZWQgdG8gYmUgY2hhbmdlZCB3aXRoIGVhY2ggbmV3IEdEQiByZWxlYXNlLCB0bw0KLVJlbSBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUgb2YgdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgd2hlcmUgdGhlIEdEQg0KLVJlbSBkaXN0cmlidXRpb24gdW5wYWNrcyBpdHNlbGYuDQotc2V0IEdEQlZFUj1nZGItNS4wDQotaWYgIiVHREJWRVIlIj09ImdkYi01LjAiIEdvVG8gRW52T2sNCi1SZW0gSWYgdGhlaXIgZW52aXJvbm1lbnQgc3BhY2UgaXMgdG9vIHNtYWxsLCByZS1leGVjIHdpdGggYSBsYXJnZXIgb25lDQotY29tbWFuZC5jb20gL2U6NDA5NiAvYyAlMCAlMQ0KLUdvVG8gRW5kDQotOkVudk9rDQotaWYgbm90IGV4aXN0ICUxIEdvVG8gTm9BcmNoaXZlDQotZGp0YXIgLXggLXAgLW8gJUdEQlZFUiUvZ2RiL2NvbmZpZy9kamdwcC9mbmNoYW5nZS5sc3QgJTEgPiBmbmNoYW5nZS50bXANCi1SZW0gVGhlIGZvbGxvd2luZyB1c2VzIGEgZmVhdHVyZSBvZiBDT1BZIHdoZXJlYnkgaXQgZG9lcyBub3QgY29weQ0KLVJlbSBlbXB0eSBmaWxlcy4gIFdlIG5lZWQgdGhhdCBiZWNhdXNlIHRoZSBwcmV2aW91cyBsaW5lIHdpbGwgY3JlYXRlDQotUmVtIGFuIGVtcHR5IGZuY2hhbmdlLnRtcCBldmVuIGlmIHRoZSBjb21tYW5kIGZhaWxlZCBmb3Igc29tZSByZWFzb24uDQotY29weSBmbmNoYW5nZS50bXAganVuay50bXAgPiBudWwNCi1pZiBub3QgZXhpc3QganVuay50bXAgR29UbyBOb0RqVGFyDQotZGVsIGp1bmsudG1wDQotc2VkIC1lICdzLEBWQCwlR0RCVkVSJSxnJyA8IGZuY2hhbmdlLnRtcCA+IGZuY2hhbmdlLmxzdA0KLVJlbSBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdGhlIHJlYXNvbiBmb3IgdXNpbmcgQ09QWS4NCi1jb3B5IGZuY2hhbmdlLmxzdCBqdW5rLnRtcCA+IG51bA0KLWlmIG5vdCBleGlzdCBqdW5rLnRtcCBHb1RvIE5vU2VkDQotZGVsIGp1bmsudG1wDQotZGp0YXIgLXggLW4gZm5jaGFuZ2UubHN0ICUxDQotR29UbyBFbmQNCi06Tm9TZWQNCi1lY2hvIEZBSUw6IFNlZCBpcyBub3QgYXZhaWxhYmxlLg0KLUdvVG8gRW5kDQotOk5vRGpUYXINCi1lY2hvIEZBSUw6IERKVEFSIGlzIG5vdCBhdmFpbGFibGUgb3Igbm8gZm5jaGFuZ2UubHN0IGZpbGUgaW4gJTEuDQotR29UbyBFbmQNCi06Tm9BcmNoaXZlDQotZWNobyBGQUlMOiB0aGUgZmlsZSAlMSBkb2VzIG5vdCBzZWVtIHRvIGV4aXN0Lg0KLWVjaG8gUmVtZW1iZXIgdGhhdCAlMSBjYW5ub3QgdXNlIGZvcndhcmQgc2xhc2hlcywgb25seSBiYWNrc2xhc2hlcy4NCi1Hb1RvIEVuZA0KLTpFbmQNCi1zZXQgR0RCVkVSPQ0KZGlmZiAtLWdpdCBhL2V0Yy9DaGFuZ2VMb2cgYi9ldGMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzYTNlLi4wMDAwMDAwCi0tLSBhL2V0Yy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotMTk5OS0wNC0wMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBhZGQtbG9nLmVsLCBhZGQtbG9nLnZpOiBOZXcgZmlsZXMuCi0KLVdlZCBKYW4gMjAgMDE6MzM6NTAgMTk5OSAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBSZW1vdmUgc29tZSBjaGVja3MgdGhhdCBhcmUgbm8gbG9uZ2VyIHZhbGlkLgotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvZnIzMC50ZXhpOiBOZXcgZG9jdW1lbnQuCi0JCi1UaHUgT2N0ICAxIDIxOjE1OjU5IDE5OTggIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLWZpeCwgY3Jvc3MtdG9vbHMtZml4OiBSZXBsYWNlIC91c3IvaW5jbHVkZQotCXdpdGggJHtGSVhJTkNESVJ9LgotCi1UdWUgQXVnIDExIDE5OjIyOjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlICh2ZXJzaW9uKTogVXBkYXRlIGNhbGN1bGF0aW9uLgotCi1GcmkgSnVuIDEyIDIxOjM0OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRleGk6IFZhcmlvdXMgYWRkaXRpb25zLgotCSogTWFrZWZpbGUuaW4gKFRFWEkySFRNTCwgRFZJUFMpOiBOZXcgdmFyaWFibGVzLgotCShzdGFuZGFyZHMucHMpOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUuZHZpKTogQ29weSAudGluIGZpbGVzIGluIGFzIHdlbGwuCi0JKGNvbmZpZ3VyZS5wcywgY29uZmlndXJlLmh0bWwpOiBOZXcgdGFyZ2V0cy4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2LmpwZyBhbmQgY29uZmlnYnVpbGQuanBnLgotCSogY29uZmlnZGV2LmZpZzogTmV3IGZpbGUuCi0JKiBjb25maWdkZXYuZWluOiBOZXcgZmlsZSAoRVBTIHZlcnNpb24gb2YgY29uZmlnZGV2LmZpZykuCi0JKiBjb25maWdkZXYuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgotCSogY29uZmlnYnVpbGQuZmlnOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2J1aWxkLmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCi0JKiBjb25maWdidWlsZC5qaW46IE5ldyBmaWxlIChKUEVHIHZlcnNpb24gb2YgY29uZmlnYnVpbGQuZmlnKS4KLQotV2VkIEp1biAxMCAxNDo0MToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2Rldi50aW46IE5ldyBmaWxlLgotCSogY29uZmlnYnVpbGQudGluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChNQUtFSU5GTyk6IFVzZSBtYWtlaW5mbyBmcm9tIHRleGluZm8gZGlyZWN0b3J5IGlmCi0JaXQgZXhpc3RzLgotCShURVhJMkRWSSk6IExpa2V3aXNlIGZvciB0ZXhpMmR2aS4KLQkoSU5GT0ZJTEVTKTogQWRkIGNvbmZpZ3VyZS5pbmZvLgotCShEVklGSUxFUyk6IEFkZCBjb25maWd1cmUuZHZpLgotCShpbmZvKTogT25seSBidWlsZCBpbmZvIGZpbGVzIGlmIHRoZSBzb3VyY2UgZmlsZXMgZXhpc3QuCi0JKGluc3RhbGwtaW5mbyk6IE9ubHkgaW5zdGFsbCBpbmZvIGZpbGVzIGlmIHRoZXkgZXhpc3QuCi0JKGR2aSk6IE9ubHkgYnVpbGQgRFZJIGZpbGVzIGlmIHRoZSBzb3VyY2VzIGZpbGVzIGV4aXN0LgotCShjb25maWd1cmUuaW5mbyk6IE5ldyB0YXJnZXQuCi0JKGNvbmZpZ3VyZS5kdmkpOiBOZXcgdGFyZ2V0LgotCShjbGVhbik6IFJlbW92ZSBjb25maWdkZXYgYW5kIGNvbmZpZ2J1aWxkIGRlcml2ZWQgZmlsZXMuCi0KLQlSZW1vdmUgb2Jzb2xldGUgZG9jdW1lbnRhdGlvbi4KLQkqIGludHJvLnRleGk6IFJlbW92ZS4KLQkqIGluc3RhbGwudGV4aTogUmVtb3ZlLgotCSogY29uZmlnLW5hbWVzLnRleGk6IFJlbW92ZS4KLQkqIHNjcmVlbjEuZXBzOiBSZW1vdmUuCi0JKiBzY3JlZW4xLm9iajogUmVtb3ZlLgotCSogc2NyZWVuMi5lcHM6IFJlbW92ZS4KLQkqIHNjcmVlbjIub2JqOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGFib3ZlLgotCi1UaHUgTWF5IDIxIDE0OjM0OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IEFkZCBub3RlIGFib3V0IGlnbm9yaW5nIGxpbmtlcgotCXdhcm5pbmcgbWVzc2FnZSB3aGVuIHVzaW5nIC0tc3VwcG9ydC1vbGQtY29kZS4KLQotTW9uIE1heSAxOCAxNDoyNzozNyAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5LCBjcm9zcy10b29scy1maXg6Ci0JVXNlICRHQ0N2biByYXRoZXIgdGhhbiBzdWJzdGl0dXRlIGV2ZXJ5d2hlcmUuCi0KLVRodSBNYXkgMTQgMTQ6NDM6MTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2FybS1pbnRlcndvcmsudGV4aTogRG9jdW1lbnQgZGxsdG9vbCBzdXBwb3J0IG9mCi0JaW50ZXJ3b3JraW5nLiAKLQotVGh1IE1heSAgNyAxNjo0OTozOCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gVENMX0xJQlJBUlksIFRLX0xJQlJBUlksCi0JYW5kIEdEQlRLX0ZJTEVOQU1FLgotCi1XZWQgQXByICAxIDE3OjExOjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IEFSTS90aHVtYiBpbnRlcndvcmtpbmcuIAotCi1UdWUgTWFyIDMxIDE1OjI4OjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbnMuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbmRhcmRzLmluZm8pOiBEZXBlbmQgdXBvbiBtYWtlLXN0ZC50ZXhpLgotCi1UdWUgTWFyIDI0IDE2OjEzOjI2IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzCi0JZm9yIE5UIG5hdGl2ZSBidWlsZHMuIAotCi1Nb24gTWFyICA5IDE2OjQxOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlIChiaW5wcm9ncyk6IEFkZCBvYmpjb3B5LgotCi1UdWUgRmViIDI0IDE4OjExOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBhcy5uZXcgLT4gYXMtbmV3LCBsZC5uZXcgLT4gbGQtbmV3Ci0Jbm0ubmV3IC0+IG5tLW5ldy4gIE1ha2Ugc3ltbGlua3MgdG8gY3J0Ki5vLgotCi1GcmkgTm92IDIxIDEyOjU0OjU4IDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC0tbm8tc3BsaXQgYXJndW1lbnQgdG8gYXZvaWQgY3JlYXRpbmcgZmlsZXMKLQl3aXRoIG5hbWVzIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLVRodSBTZXAgMjUgMTM6MTM6MTEgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBlcm4uY3lnbnVzLmNvbSkKLQotCSogaW50cm8udGV4aTogQWRkIGNsb3NpbmcgaWZzZXQuCi0KLU1vbiBTZXAgIDEgMTA6MzE6MzIgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IE1vdmUgc2V0dGluZyBIT1NUIGFuZCBUQVJHRVQgdG8gdGhlIGJlZ2lubmluZwotCW9mIHRoZSBmaWxlIGZvciBlZGl0aW5nIGNvbnZlbmllbmNlLgotCi1Nb24gU2VwICAxIDEwOjI4OjM3IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluLjogTW9yZSBmcmllbmRseSBvcHRpb25zL21lc3NhZ2VzIHdoZW4gZXh0cmFjdGluZwotCWZyb20gYSBmaWxlIGluc3RlYWQgb2YgYSB0YXBlIGRldmljZS4KLQotVHVlIEp1biAxNyAxNTo1MDoyMyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogQWRkIC91c3IvYnNkIHRvIFBBVEggZm9yIElyaXggKGhvbWUgb2YgY29tcHJlc3MpCi0KLVRodSBKdW4gMTIgMTM6NDc6MDAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluIChzaG93X2V4ZWNfcHJlZml4X21zZyk6IGZpeCBxdW90aW5nCi0KLVdlZCBKdW4gIDQgMTU6MzE6NDMgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogcmVidWlsZGluZy50ZXhpOiBSZW1vdmVkLgotCi1TYXQgTWF5IDI0IDE4OjAyOjIwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjcm9zcy10b29scy1maXg6ICBSZW1vdmUgaG9zdCBjaGVjayBzaW5jZSBpdCBkb2Vzbid0IG1hdHRlcgotCWZvciB0aGlzIGNhc2UuCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBjbGVhbiB1cCBtb3JlIHVudXNlZCBob3N0cy4KLQkqIEluc3RhbGwuaW4sIGNyb3NzLXRvb2xzLWZpeCwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5OgotCUhhY2sgZm9yIGhvc3QgY2hlY2sgdG8gbm90IHdhcm4gdGhlIHVzZXIgZm9yIGNlcnRhaW4gY2FzZXMuCi0KLUZyaSBNYXkgMjMgMjM6NDY6MTAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IFJlbW92ZSBhIGxvdCBvZiB1bnVzZWQgY29kZQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZSB0byBUQVBFZGZsdCwgdXNlIHZhcmlhYmxlcyBpbnN0ZWFkIG9mCi0Jc3RyaW5nIHN1YnN0aXR1dGlvbiB3aGVuIGFibGUuCi0KLUZyaSBBcHIgMTEgMTc6MjU6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBmaWxlIG5hbWVkIGluIEFDX0lOSVQgdG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTEgMTg6MTI6NDIgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogQmFjayBvdXQgY2hhbmdlIHRvIElOU1RBTExIT1NUIHRvCi0JY2FsbCBhbGwgSVJJWCBzeXN0ZW1zICJtaXBzLXNnaS1pcml4NCIKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyZS50ZXhpIGFuZCBjZmctcGFwZXIudGV4aS4KLQotVGh1IEFwciAxMCAyMzoyNjo0NSAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBzcmN0cmVlLnRleGksIGVtYWNzLXJlbG5vdGVzLnRleGksIGNmZy1wYXBlci50ZXhpOiBSZW1vdmUuCi0JKiBJbnN0YWxsLmluOiBSZW1vdmUgVWx0cml4LXNwZWNpZmljIGhhY2tzLgotCVVwZGF0ZSBDeWdudXMgcGhvbmUgbnVtYmVycy4KLQkoZ3Vlc3Nfc3lzdGVtKTogUmVtb3ZlIHNvbWUgb2xkIHN5c3RlbXMgKFVsdHJpeCwgT1NGMSB2MSAmIDIsCi0JbTY4ay1IUFVYLCBtNjhrIFN1bk9TLCBldGMuKQotCShzaG93X2dudV9yb290X21zZyk6IFJlbW92ZS4KLQlSZW1vdmVkIGFsbCB0aGUgcmVtb3ZlIG9wdGlvbiBjb2RlLgotCi1UaHUgQXByIDEwIDIzOjIzOjMzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5tYW4sIGNvbmZpZ3VyZS50ZXhpOiBSZW1vdGUuCi0KLU1vbiBBcHIgIDcgMTg6MTU6MDAgMTk5NyAgQnJlbmRhbiBLZWhvZSA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0gICAgICAgICogRml4IHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgT1NGMSA0LjAgdG8gcmVjb2duaXplIGVpdGhlcgotICAgICAgICBWNC4qIG9yIFg0LioKLQotTW9uIEFwciAgNyAxNTozNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgotCi1UdWUgTm92IDE5IDE1OjM2OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBOZXcgZmlsZS4KLQotV2VkIE9jdCAyMyAwMDozNDowNyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogTG90cyBvZiBwYXRjaGVzIGZyb20gcHJvZ3Jlc3NpdmUuLi4KLSAJKiBJbnN0YWxsLmluOiByZXN0b3JlIERET1BUUyBmb3IgQUlYIDQueAotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6IGFkZCBjYXNlIGZvciBERyBBdmlpb24KLSAJKiBzdWJzdC1zdHJpbmdzOiBmaXggdHlwbyBpbiBJTlNUQUxMZGlyIHZhciBzZXR0aW5nCi0gCSogY29tcC10b29scy12ZXJpZnk6IHNldCBTSExJQl9QQVRIIGZvciBzaGFyZWQgbGlicwotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6ICBhZGQgY2FzZSBmb3Igc29sYXJpczIuNQotIAkqIEluc3RhbGwuaW46IGZpeCByZWdyZXNzaW9uIGZvciBocHBhMS4xIGNoZWNrCi0gCSogY29tcC10b29scy1maXg6IHNldCBMRF9MSUJSQVJZX1BBVEgKLSAJKiBjb21wLXRvb2xzLWZpeDogSWYgZml4aW5jbHVkZXMgZml4ZXMgL3Vzci9pbmNsdWRlL2xpbWl0cy5oLAotIAlpbnN0YWxsIGl0IGFzIHN5c2xpbWl0cy5oLgotCi1XZWQgT2N0IDE2IDE5OjIwOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogVHJlYXQgcG93ZXJwYy1pYm0tYWl4NC4xIHRoZSBzYW1lIGFzCi0JcnM2MDAwLWlibS1haXg0LjEsIHNpbmNlIHRoZSBjb21waWxlciBub3cgdXNlcyBjb21tb24gbW9kZSBieQotCWRlZmF1bHQuCi0KLVdlZCBPY3QgIDIgMTU6Mzk6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogY29uZmlndXJlLmluIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgT2N0ICAyIDE0OjMzOjU4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3dpdGNoIHRvIGF1dG9jb25mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZTogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBhdXRvY29uZi1zdWJzdGl0dXRlZCB2YWx1ZXMuCi0KLVR1ZSBKdW4gMjUgMTg6NTY6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBDaGFuZ2VkIHRvICQocHJlZml4KS9zaGFyZS4KLQotRnJpIE1hciAyOSAxMTozODowMSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUubWFuOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVdlZCBEZWMgIDYgMTU6NDA6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tcC10b29scy1maXggKGZpeGluY2x1ZGVzKTogRGVmaW5lIEZJWFBST1RPX0RFRklORVMgZnJvbQotCS4uLi9pbnN0YWxsLXRvb2xzL2ZpeHByb3RvLWRlZmluZXMuCi0KLVN1biBOb3YgMTIgMTk6MzE6MjcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5ICh2ZXJpZnlfY3h4X2luaXRpYWxpemVycyk6IGRlbGV0ZSBhcmd2LAotCWFyZ2MgZGVjbGFyYXRpb25zLCBhZGQgLXN0YXRpYyB0byBjb21waWxlIGxpbmUuCi0JKHZlcmlmeV9jeHhfaGVsbG9fd29ybGQpOiBkZWxldGUgYXJndiwgYXJnYyBkZWNsYXJhdGlvbnMsIGFkZAotCS1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgotCi1XZWQgU2VwIDIwIDEzOjIxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotTW9uIEF1ZyAyOCAxNzoyNTo0OSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoUEFUSCk6ICBhZGQgL3Vzci91Y2IgdG8gJFBBVEggKGZvciBTdW5PUyA0LjEueCkuCi0KLVR1ZSBBdWcgMTUgMjE6NTE6NTggMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IE1hdGNoIE9TRi8xIHYzLnggYXMgdGhlIHNhbWUgYXMgCi0gICAgICAgIHYyLngtLXYyLnggYmluYXJpZXMgYXJlIHVwd2FyZCBjb21wYXRpYmxlLgotCi1UdWUgQXVnIDE1IDIxOjQ2OjU0IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiByZWNvZ25pemUgSFAgOTAwMC84MDAgc3lzdGVtcyBhcyB0aGUKLQlzYW1lIGFzIEhQIDkwMDAvNzAwIHN5c3RlbXMuCi0KLVR1ZSBBdWcgIDggMTM6MTE6NTYgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluOiBGb3IgZW1hY3MsIHJ1biBzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cgYW5kIGV4aXQuCi0JKHNob3dfZW1hY3NfYWx0ZXJuYXRlX21zZyk6IE5ldyBtZXNzYWdlIHNheWluZyBob3cgZW1hY3MgY2FuJ3QgYmUKLQlpbnN0YWxsZWQgaW4gYW4gYWx0ZXJuYXRlIHByZWZpeC4KLQotVGh1IEp1biAgOCAwMDo0Mjo1NiAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0gICAgICAgICogc3Vic3Qtc3RyaW5nczogY2hhbmdlIGR1IGNvbW1hbmRzIHRvICRCSU5ESVIvLiAmICRTUkNESVIvLiBqdXN0Ci0gICAgICAgIGluIGNhc2UgdGhleSBhcmUgc3ltbGlua3MuCi0KLVR1ZSBBcHIgMTggMTQ6MjM6MTAgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjZGstZml4OiBFeHRyYWN0ZWQgdGFibGUgb2YgdGFyZ2V0cyB0aGF0IGRvbid0IG5lZWQgdGhlaXIKLQkgIGhlYWRlcnMgZml4ZWQgZnJvbSBnY2MncyBjb25maWd1cmUgc2NyaXB0LgotCi0JKiBjZGstZml4LCBjZGstdmVyaWZ5OiBVc2UgJHtIT1NUfSBpbnN0ZWFkIG9mIHx8SE9TVHN0cnx8Ci0KLQkqIGNkay1maXgsIGNkay12ZXJpZnk6IE5ldyBmaWxlcywgaW5zdGFsbCBzY3JpcHQgZnJhZ21lbnRzIHVzZWQKLQkgIGZvciBDeWdudXMgRGV2ZWxvcGVyJ3MgS2l0LgotCi0JKiBJbnN0YWxsLmluIChkb19ta2Rpcik6IE5ldyBmdW5jdGlvbi4KLQotCSogSW5zdGFsbC5pbjogQWRkZWQgc3VwcG9ydCBmb3IgLS13aXRoIGFuZCAtLXdpdGhvdXQgb3B0aW9ucy4KLQkgIENoYW5nZWQgc28gdGhhdCB0YXBlIGNvbW1hbmRzIGFyZSBub3QgcnVuIHdoZW4gZXh0cmFjdGluZyAKLQkgIGZyb20gYSBmaWxlLgotCSAgKGRvX210KTogQ2hhbmdlZCB0byB0YWtlIG9ubHkgb25lIGFyZ3VtZW50LgotCi1XZWQgTWFyIDI5IDExOjE2OjM4IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGNhdGNoIFVOQU1FPT1hbHBoYS1kZWMtb3NmMi54IGFuZCBjb3JyZWN0IGVudHJ5IGZvcgotCWFscGhhLWRlYy1vc2YxLngKLQkKLUZyaSBKYW4gMjcgMTI6MDQ6MjkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzdWJzdC1zdHJpbmdzIChtaXBzLXNnaS1pcml4NSk6IE5ldyBlbnRyeSBpbiB0YWJsZS4KLQotVGh1IEphbiAxOSAxMjoxNTo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW46IE1ham9yIHJld3JpdGUsIGJ1bmRsZSBkZXBlbmRlbnQgY29kZSAoZm9yIGV4YW1wbGUsCi0JICBmaXhpbmNsdWRlcyBmb3IgY29tcC10b29scykgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBJbnN0YWxsCi0JICBzY3JpcHQgd2hlbiBpdCBpcyBnZW5lcmF0ZWQuCi0KLVR1ZSBKYW4gMTcgMTY6NTE6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBSZWJ1aWxkIHVzaW5nICQoU0hFTEwpLgotCi1UaHUgTm92ICAzIDE5OjMwOjMzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gaW5mby4KLQotRnJpIEF1ZyAxOSAxNjoxNjozOCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0ICRGSVhfSEVBREVSIHNvIGZpeHByb3RvIGNhbiBmaW5kIGZpeC1oZWFkZXIuCi0KLUZyaSBNYXkgIDYgMTY6MTg6NTggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogYWRkIGEgc2VtaWNvbG9uIGluIHRoZSBpZiBzdGF0ZW1lbnQuCi0KLUZyaSBBcHIgMjkgMTY6NTY6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjZmctcGFwZXIudGV4aTogVXBkYXRlIHNvbWUgb3V0ZGF0ZWQgaW5mb3JtYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQYXNzIGZpbGUsIG5vdCBkaXJlY3RvcnksIGFzIGxhc3QKLQlhcmcgdG8gSU5TVEFMTF9EQVRBLgotCSh1bmluc3RhbGwpOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXByIDI4IDE0OjQyOjIyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IENvbW1lbnQgb3V0IEBzbWFsbGJvb2suCi0KLQkqIE1ha2VmaWxlLmluOiBEZWZpbmUgVEVYSTJEVkkgYW5kIFRFWElESVIsIGFuZCB1c2UgdGhlIGxhdHRlci4KLQlSZW1vdmUgaW5mbyBmaWxlcyBpbiByZWFsY2xlYW4sIG5vdCBjbGVhbiwgcGVyIGNvZGluZyBzdGFuZGFyZHMuCi0JUmVtb3ZlIFRlWCBvdXRwdXQgaW4gY2xlYW4uCi0KLVR1ZSBBcHIgMjYgMTc6MTg6MDMgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuICBUaGlzIGlzIHRoZSBzYW1lCi0JbWVzc2FnZXMgYXMgSSBsb2dnZWQgaW4gTWFyY2ggNCAxOTk0LCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIGZvdW5kCi0JdGhlIGNoYW5nZSBoYWRuJ3QgYmVlbiBkb25lLiAgSSdsbCBoYXZlIHRvIGRpZyB0aHJvdWdoIHRoZSBsb2dzCi0JYW5kIGZpbmQgb3V0IHdoYXQgSSByZWFsbHkgZGlkIGRvIHRoYXQgZGF5LiA6KQotCi1Nb24gQXByIDI1IDIwOjI4OjE5IDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46ICB1c2UgZXZhbCB0byBjYWxsIGRvX210KCkgZm9yIFVsdHJpeCBicm9rZW5uZXNzLgotCi1Nb24gQXByIDI1IDIwOjAwOjAwIDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4oZG9fbXQpOiBleGl0IHdpdGggZXJyb3Igc3RhdHVzIDEgaWYgIyBvZiBwYXJhbWV0ZXJzCi0JIT0gMy4KLQotTW9uIEFwciAyNSAxOTo0MjozNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiAgbG9zZSBUQVBFX0ZPUldBUkQgYW5kIFRBUEVfUkVXSU5ELCBhZGQgZG9fbXQoKQotCXRvIGRvIGFsbCB0YXBlIG1vdmVtZW50IG9wZXJhdGlvbnMuICBDdXJyZW50bHkgdW50ZXN0ZWQuICBBZGRyZXNzZXMKLQlQUiAjIDQ4ODYgZnJvbSBidWxsLgotCi0JKiBJbnN0YWxsLmluOiBhZGQgMTk5NCB0byB0aGUgY29weXJpZ2h0IHRoaW5nLgotCi1GcmkgQXByIDIyIDE5OjA1OjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotRnJpIEFwciAyMiAxNTo0NjoxMCAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBBZGQgJERET1BUUywgaGFzIGBgYnM9MTI0YicnIGZvciBhbGwgc3lzdGVtcyBleGNlcHQKLQlBSVggKHNvbWUgdmVyc2lvbnMgb2YgQUlYIGRvbid0IHVuZGVyc3RhbmQgYnM9MTI0Yi4gIFNpbGx5IE9TKS4KLQotTW9uIEFwciAgNCAyMjo1NTowNSAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogbnVsbCBvdXQgJFRPT0xTIGJlZm9yZSBhZGRpbmcgc3R1ZmYgdG8gaXQKLQlub24tZGVzdHJ1Y3RpdmVseS4KLQotV2VkIE1hciAzMCAyMTo0NTozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBGaXggdHlwby4KLQotCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZGlzYWJsZS0uCi0KLU1vbiBNYXIgMjggMTM6MjI6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1TYXQgTWFyIDI2IDA5OjIxOjQ0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBNYXIgMjUgMjI6NTk6NDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aSwgY29uZmlndXJlLm1hbjogRG9jdW1lbnQgLS1lbmFibGUtKiBvcHRpb25zLgotCi1XZWQgTWFyIDIzIDIzOjM4OjI0IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0IENQUCB0byBiZSBnY2MgLUUgZm9yIGZpeGluY2x1ZGVzLgotCi1XZWQgTWFyIDIzIDEzOjQyOjQ4IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW46IHNldCBQQVRIIHRvICRQQVRIOi9iaW46L3Vzci9iaW4gc28gd2UgY2FuIHBpY2sKLSAgICAgICAgdXAgbmF0aXZlIHRvb2xzIGV2ZW4gaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRoZW0gaW4gaGlzCi0gICAgICAgIHBhdGguCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiBgYGhwcGEtMS4xLWhwLWhwdXgnJyAtPiBgYGhwcGExLjEtaHAtaHB1eCcnLgotCi1UdWUgTWFyIDE1IDIyOjA5OjIwIDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLSAgICAgICAgCi0gICAgICAgICogSW5zdGFsbC5pbjogVEFQRV9SRVdJTkQgYW5kIFRBUEVfRk9SV0FSRCB2YXJpYWJsZXMgZm9yIFVuaXh1bmF3YXJlLAotICAgICAgICBhZGRlZCBzd2l0Y2ggc3RhdGVtZW50IHRvIGRldGVjdCBpZiBzeXN0ZW0gaXMgVW5peHVuYXdhcmUuCi0KLUZyaSBNYXIgIDQgMTI6MTA6MzAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuCi0KLVdlZCBOb3YgIDMgMDI6NTg6MDIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBvdXRwdXQgVEVYQlVORExFIGZvciBtb3JlIGluc3RhbGwgbm90ZXMgbWF0Y2hpbmcKLQkqIGluc3RhbGwtdGV4aS5pbjogIFBSTVMgaW5mbyBub3cgZXhpc3RzCi0KLVR1ZSBPY3QgMjYgMTY6NTc6MTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBtYXRjaCBzb2xhcmlzKi4gIEFsc28sIGFkZCBkZWZhdWx0IGNhc2UgdG8gY2F0Y2gKLQkgIGFuZCBlcnJvciBvdXQgZm9yIHVucmVjb2duaXplZCBzeXN0ZW1zLgotCi1UaHUgQXVnIDE5IDE4OjIxOjMxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogaGFuZGxlIHRoZSBuZXcgZml4cHJvdG8gd29yawotCi1Nb24gSnVsIDE5IDEyOjA1OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcmVtb3ZlICJNVD10Y3RsIiBmb3IgQUlYIChub3QgbmVlZGVkLCBhbmQgYmFyZWx5Ci0Jd29ya2VkIGFueXdheSkKLQotTW9uIEp1biAxNCAxOTowOToyMiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBjaGFuZ2VkIEhPU1QgdG8gcmVjb2duaXplIFNvbGFyaXMgZm9yIGluc3RhbGwgbm90ZXMKLQotVGh1IEp1biAxMCAxNjowMToyNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBkb3MtaW5zdC50ZXhpOiAgbmV3IGZpbGUuCi0KLVdlZCBKdW4gIDkgMTk6MjM6NTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAcnRsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBpbnN0YWxsLXRleGkuaW46ICAgICAgICBhZGRlZCBjb25kaXRpb25hbHMgKG5lYXJseSBjb21wbGV0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmVkIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgcmVsZWFzZXMgKG5vdCBkb25lKQotCi1XZWQgSnVuICA5IDE1OjUzOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlIElOU1RBTExfREFUQS4KLQkoe2Rpc3QscmVhbH1jbGVhbik6IEFsc28gZGVsZXRlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzLgotCi1GcmkgSnVuICA0IDE3OjA5OjU2IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBkYXRhIGZvciBPU19TVFJJTkcKLQotCSogc3Vic3Qtc3RyaW5nczogIGFkZGVkIHN1cHBvcnQgZm9yIE9TX1NUUklORwotCi1UaHUgSnVuICAzIDAwOjM3OjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcHVsbCBDT1BZSU5HIGFuZCBDT1BZSU5HLkxJQiBvZmYgb2YgdGhlIHRhcGUgCi0KLVR1ZSBKdW4gIDEgMTY6NTI6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiByZXBsYWNlIFJFTEVBU0VfRElSIHRvbwotCi1Nb24gTWFyIDIyIDIzOjU1OjI3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVdlZCBNYXIgMTcgMDI6MjE6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBmaXggJ3NvdXJjZSBvbmx5JyBleHRyYWN0aW9uIGJ1ZyB3aGVyZSBpdCBsb29rZWQgZm9yCi0JdGhlIHNyYyBkaXIgdW5kZXIgSC08aG9zdD4vc3JjIGluc3RlYWQgb2Ygc3JjOyBhbHNvIHJlbW92ZSBzdHJheQotCXJlZmVyZW5jZSB0byBFTUFDU0hJQklOCi0KLU1vbiBNYXIgMTUgMDE6MjU6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtYWtlLXN0ZHMudGV4aTogYWRkZWQgJ2luc3RhbGxjaGVjaycgdG8gdGhlIHN0YW5kYXJkIHRhcmdldHMKLQotVHVlIE1hciAgOSAxOTo0ODoyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWSwgdXBkYXRlZCB2ZXJzaW9uIGZyb20gdGhlIEZTRgotCi1UdWUgRmViICA5IDEyOjQwOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogQWRkZWQgLUkkKHNyY2RpcikgdG8gZmluZAotCW1ha2Utc3Rkcy50ZXhpLgotCi1Nb24gRmViICAxIDE2OjMyOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLCB3aGljaCBpbmNsdWRlczoKLQotCSogbWFrZS1zdGRzLnRleGk6IG5ldyBmaWxlCi0KLU1vbiBOb3YgMzAgMDE6MzE6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLXRleGkuaW4sIHJlbG5vdGVzLnRleGksIGludHJvLnRleGk6IGNoYW5nZWQgQ3lnbnVzIHBob25lCi0JbnVtYmVycyBmcm9tIHRoZSBvbGQgUGFsbyBBbHRvIG9uZXMgdG8gdGhlIG5ldyBNdG4uIFZpZXcgbnVtYmVycwotCi1Nb24gTm92IDE2IDE2OjUwOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSAkKFJNKSB0byAicm0gLWYiCi0KLVN1biBPY3QgMTEgMTY6MDU6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnRyby50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWQotCmRpZmYgLS1naXQgYS9ldGMvTWFrZWZpbGUuaW4gYi9ldGMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGM4YzkuLjAwMDAwMDAKLS0tIGEvZXRjL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgCi0jIE1ha2VmaWxlLmluIGZvciBldGMKLSMKLQotcHJlZml4IAkJPSBAcHJlZml4QAotZXhlY19wcmVmaXggCT0gQGV4ZWNfcHJlZml4QAotCi1zcmNkaXIgID0gQHNyY2RpckAKLVZQQVRICT0gQHNyY2RpckAKLQotYmluZGlyICA9IEBiaW5kaXJACi1saWJkaXIgID0gQGxpYmRpckAKLXRvb2xkaXIgPSAkKGxpYmRpcikKLWRhdGFkaXIgPSBAZGF0YWRpckAKLQotbWFuZGlyICA9IEBtYW5kaXJACi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLW1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgotbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCi1tYW40ZGlyID0gJChtYW5kaXIpL21hbjQKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotbWFuNmRpciA9ICQobWFuZGlyKS9tYW42Ci1tYW43ZGlyID0gJChtYW5kaXIpL21hbjcKLW1hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAotbWFuOWRpciA9ICQobWFuZGlyKS9tYW45Ci1pbmZvZGlyID0gQGluZm9kaXJACi0KLVNIRUxMID0gL2Jpbi9zaAotCi1JTlNUQUxMIAk9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSAgICA9IEBJTlNUQUxMX0RBVEFACi0KLU1BS0VJTkZPID0gYGlmIFsgLWYgLi4vdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyBdOyBcCi0JdGhlbiBlY2hvIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm87IFwKLQllbHNlIGVjaG8gbWFrZWluZm87IGZpYAotVEVYSTJEVkkgPSBgaWYgWyAtZiAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmkgXTsgXAotCXRoZW4gZWNobyAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IFwKLQllbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSTJIVE1MID0gdGV4aTJodG1sCi1EVklQUyA9IGR2aXBzCi0KLSMgV2hlcmUgdG8gZmluZCB0ZXhpbmZvLnRleCB0byBmb3JtYXQgZG9jdW1lbnRhdGlvbiB3aXRoIFRlWC4KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vdGV4aW5mbwotCi0jIyMjIEhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi1JTkZPRklMRVMgPSBzdGFuZGFyZHMuaW5mbyBjb25maWd1cmUuaW5mbwotRFZJRklMRVMgPSBzdGFuZGFyZHMuZHZpIGNvbmZpZ3VyZS5kdmkKLQotYWxsOgotCi1pbnN0YWxsOgotCi11bmluc3RhbGw6Ci0KLWluZm86Ci0JZm9yIGYgaW4gJChJTkZPRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmluZm8kJC8udGV4aS8nYDsgdGhlbiBcCi0JICAgIGlmICQoTUFLRSkgIk1BS0VJTkZPPSQoTUFLRUlORk8pIiAkJGY7IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1pbmZvOiBpbmZvCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21raW5zdGFsbGRpcnMgJChpbmZvZGlyKQotCWlmIHRlc3QgISAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCi0JaWYgdGVzdCAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBcCi0JICBmb3IgaSBpbiBzdGFuZGFyZHMuaW5mbyo7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAotCSAgZG9uZTsgXAotCWZpCi0JaWYgdGVzdCAhIC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKLQlpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIFwKLQkgIGZvciBpIGluIGNvbmZpZ3VyZS5pbmZvKjsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotZHZpOgotCWZvciBmIGluICQoRFZJRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmR2aSQkLy50ZXhpLydgOyB0aGVuIFwKLQkgICAgaWYgJChNQUtFKSAiVEVYSTJEVkk9JChURVhJMkRWSSkiICQkZjsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1zdGFuZGFyZHMuaW5mbzogJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpICQoc3JjZGlyKS9tYWtlLXN0ZHMudGV4aQotCSQoTUFLRUlORk8pIC0tbm8tc3BsaXQgLUkkKHNyY2RpcikgLW8gc3RhbmRhcmRzLmluZm8gJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCi0KLXN0YW5kYXJkcy5kdmk6ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCi1zdGFuZGFyZHMucHM6IHN0YW5kYXJkcy5kdmkKLQkkKERWSVBTKSBzdGFuZGFyZHMuZHZpIC1vIHN0YW5kYXJkcy5wcwotCi0jIG1ha2VpbmZvIHJlcXVpcmVzIGltYWdlcyB0byBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi1jb25maWd1cmUuaW5mbzogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4KLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdkZXYudGluIGNvbmZpZ2Rldi50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1aWxkLnR4dAotCSQoTUFLRUlORk8pIC1JJChzcmNkaXIpIC1vIGNvbmZpZ3VyZS5pbmZvICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0KLSMgdGV4aTJkdmkgd2FudHMgYm90aCB0aGUgLnR4dCBhbmQgdGhlIC5lcHMgZmlsZXMuCi1jb25maWd1cmUuZHZpOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcwotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQotIyBkdmlwcyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci1jb25maWd1cmUucHM6IGNvbmZpZ3VyZS5kdmkgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gY29uZmlnZGV2LmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4gY29uZmlnYnVpbGQuZXBzCi0JJChEVklQUykgY29uZmlndXJlLmR2aSAtbyBjb25maWd1cmUucHMKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCi1jb25maWd1cmUuaHRtbDogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0JJChURVhJMkhUTUwpIC1zcGxpdF9jaGFwdGVyICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCi1jbGVhbjoKLQlybSAtZiAqLmF1eCAqLmNwICouY3BzICouZHZpICouZm4gKi5mbnMgKi5reSAqLmt5cyAqLmxvZwotCXJtIC1mICoucGcgKi5wZ3MgKi50b2MgKi50cCAqLnRwcyAqLnZyICoudnJzCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQlybSAtZiBjb25maWdkZXYuanBnIGNvbmZpZ2J1aWxkLmpwZwotCi1tb3N0bHljbGVhbjogY2xlYW4KLQotZGlzdGNsZWFuOiAgIGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKLQotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46ICAgZGlzdGNsZWFuCi0Jcm0gLWYgKi5pbmZvKgotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoaG9zdF9tYWtlZmlsZV9mcmFnKSAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIyB0aGVzZSBsYXN0IHRhcmdldHMgYXJlIGZvciBzdGFuZGFyZHMudGV4aSBjb25mb3JtYW5jZQotZGlzdDoKLWNoZWNrOgotaW5zdGFsbGNoZWNrOgotVEFHUzoKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLmVsIGIvZXRjL2FkZC1sb2cuZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzg4ZTguLjAwMDAwMDAKLS0tIGEvZXRjL2FkZC1sb2cuZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotOzs7ID09PT09PT09PT09PSBOT1RFIFdFTEwhID09PT09PT09PT09PT0KLTs7OwotOzs7IFlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgZmlsZSBpZiB5b3UncmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEVtYWNzCi07OzsgcHJpb3IgdG8gMjAuMSB0byB3b3JrIG9uIEdEQi4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCi07OzsgYW5kIHRoZSBzdGFuZGFyZCBhZGQtbG9nLmVsIHByb3ZpZGVkIHdpdGggMTkuMzQgaXMgdGhhdCBpdAotOzs7IGdlbmVyYXRlcyBkYXRlcyB1c2luZyB0aGUgdGVyc2VyIGZvcm1hdCB1c2VkIGJ5IEVtYWNzIDIwLiAgVGhpcyBpcwotOzs7IHRoZSBmb3JtYXQgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBHREIgQ2hhbmdlTG9ncy4KLTs7OwotOzs7IFRvIHVzZSB0aGlzIGNvZGUsIHlvdSBzaG91bGQgY3JlYXRlIGEgZGlyZWN0b3J5IGB+L2VsaXNwJywgc2F2ZSB0aGUgY29kZQotOzs7IGJlbG93IGluIGB+L2VsaXNwL2FkZC1sb2cuZWwnLCBhbmQgdGhlbiBwdXQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbgotOzs7IHlvdXIgYH4vLmVtYWNzJyBmaWxlLCB0byB0ZWxsIEVtYWNzIHdoZXJlIHRvIGZpbmQgaXQ6Ci07OzsgCi07OzsgKHNldHEgbG9hZC1wYXRoCi07OzsgICAgICAgKGNvbnMgKGV4cGFuZC1maWxlLW5hbWUgIn4vZWxpc3AiKQotOzs7ICAgICAgICAgICAgIGxvYWQtcGF0aCkpCi07OzsgCi07OzsgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyBieXRlLWNvbXBpbGUgaXQgLS0tIGl0J2xsIHJ1biBhIGxpdHRsZQotOzs7IGZhc3RlciwgYW5kIHVzZSBhIGxpdHRsZSBsZXNzIG1lbW9yeS4gIChOb3QgdGhhdCB0aG9zZSBtYXR0ZXIgbXVjaCBmb3IKLTs7OyB0aGlzIGZpbGUuKSAgVG8gZG8gdGhhdCwgYWZ0ZXIgeW91J3ZlIHNhdmVkIHRoZSB0ZXh0IGFzCi07Ozsgfi9lbGlzcC9hZGQtbG9nLmVsLCBicmluZyBpdCB1cCBpbiBFbWFjcywgYW5kIHR5cGUKLTs7OyAKLTs7OyAgICAgQy11IE0teCBieXRlLWNvbXBpbGUtZmlsZQotOzs7Ci07OzsgLS0tIEppbSBCbGFuZHkKLQotOzs7IGFkZC1sb2cuZWwgLS0tIGNoYW5nZSBsb2cgbWFpbnRlbmFuY2UgY29tbWFuZHMgZm9yIEVtYWNzCi0KLTs7IENvcHlyaWdodCAoQykgMTk4NSwgMTk4NiwgMTk4OCwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotOzsgS2V5d29yZHM6IG1haW50Ci0KLTs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KLQotOzsgR05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLTs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci07OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi07OyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotOzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi07OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLTs7IGFsb25nIHdpdGggR05VIEVtYWNzOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi07OyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLTs7IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi07OzsgQ29tbWVudGFyeToKLQotOzsgVGhpcyBmYWNpbGl0eSBpcyBkb2N1bWVudGVkIGluIHRoZSBFbWFjcyBNYW51YWwuCi0KLTs7OyBDb2RlOgotCi0oZGVmdmFyIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lIG5pbAotICAiKk5hbWUgb2YgYSBjaGFuZ2UgbG9nIGZpbGUgZm9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XS4iKQotCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1mdW5jdGlvbiBuaWwKLSAgIlwKLSpJZiBub24tbmlsLCBmdW5jdGlvbiB0byBndWVzcyBuYW1lIG9mIGN1cnJlbnQgZnVuY3Rpb24gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgotXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGNhbGxzIHRoaXMgZnVuY3Rpb24gKGlmIG5pbCwgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicKLWluc3RlYWQpIHdpdGggbm8gYXJndW1lbnRzLiAgSXQgcmV0dXJucyBhIHN0cmluZyBvciBuaWwgaWYgaXQgY2Fubm90IGd1ZXNzLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdmFyIGFkZC1sb2ctZnVsbC1uYW1lIG5pbAotICAiKkZ1bGwgbmFtZSBvZiB1c2VyLCBmb3IgaW5jbHVzaW9uIGluIENoYW5nZUxvZyBkYWlseSBoZWFkZXJzLgotVGhpcyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGB1c2VyLWZ1bGwtbmFtZScgZnVuY3Rpb24uIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ2YXIgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MgbmlsCi0gICIqRWxlY3Ryb25pYyBtYWlsIGFkZHJlc3Mgb2YgdXNlciwgZm9yIGluY2x1c2lvbiBpbiBDaGFuZ2VMb2cgZGFpbHkgaGVhZGVycy4KLVRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGB1c2VyLW1haWwtYWRkcmVzcycuIikKLQotKGRlZnZhciBjaGFuZ2UtbG9nLWZvbnQtbG9jay1rZXl3b3JkcwotICAnKCgiXltTTVRXRl0uKyIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKQk7IERhdGUgbGluZS4KLSAgICAoIl5cdFxcKiBcXChbXiA6XG5dK1xcKSIgMSBmb250LWxvY2stY29tbWVudC1mYWNlKQk7IEZpbGUgbmFtZS4KLSAgICAoIihcXChbXilcbl0rXFwpKToiIDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpCTsgRnVuY3Rpb24gbmFtZS4KLSAgIkFkZGl0aW9uYWwgZXhwcmVzc2lvbnMgdG8gaGlnaGxpZ2h0IGluIENoYW5nZSBMb2cgbW9kZS4iKQotCi0oZGVmdmFyIGNoYW5nZS1sb2ctbW9kZS1tYXAgbmlsCi0gICJLZXltYXAgZm9yIENoYW5nZSBMb2cgbWFqb3IgbW9kZS4iKQotKGlmIGNoYW5nZS1sb2ctbW9kZS1tYXAKLSAgICBuaWwKLSAgKHNldHEgY2hhbmdlLWxvZy1tb2RlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkKLSAgKGRlZmluZS1rZXkgY2hhbmdlLWxvZy1tb2RlLW1hcCAiXE0tcSIgJ2NoYW5nZS1sb2ctZmlsbC1wYXJhZ3JhcGgpKQotCi0oZGVmdW4gY2hhbmdlLWxvZy1uYW1lICgpCi0gIChvciBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZQotICAgICAgKGlmIChlcSBzeXN0ZW0tdHlwZSAndmF4LXZtcykgCi0JICAiJENIQU5HRV9MT0ckLlRYVCIgCi0JKGlmIChvciAoZXEgc3lzdGVtLXR5cGUgJ21zLWRvcykgKGVxIHN5c3RlbS10eXBlICd3aW5kb3dzLW50KSkKLQkgICAgImNoYW5nZWxvIgotCSAgIkNoYW5nZUxvZyIpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gcHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUgKCkKLSAgIlByb21wdCBmb3IgYSBjaGFuZ2UgbG9nIG5hbWUuIgotICAobGV0KiAoKGRlZmF1bHQgKGNoYW5nZS1sb2ctbmFtZSkpCi0JIChuYW1lIChleHBhbmQtZmlsZS1uYW1lCi0JCShyZWFkLWZpbGUtbmFtZSAoZm9ybWF0ICJMb2cgZmlsZSAoZGVmYXVsdCAlcyk6ICIgZGVmYXVsdCkKLQkJCQluaWwgZGVmYXVsdCkpKSkKLSAgICA7OyBIYW5kbGUgc29tZXRoaW5nIHRoYXQgaXMgc3ludGFjdGljYWxseSBhIGRpcmVjdG9yeSBuYW1lLgotICAgIDs7IExvb2sgZm9yIENoYW5nZUxvZyBvciB3aGF0ZXZlciBpbiB0aGF0IGRpcmVjdG9yeS4KLSAgICAoaWYgKHN0cmluZz0gKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgbmFtZSkgIiIpCi0JKGV4cGFuZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZGVmYXVsdCkKLQkJCSAgbmFtZSkKLSAgICAgIDs7IEhhbmRsZSBzcGVjaWZ5aW5nIGEgZmlsZSB0aGF0IGlzIGEgZGlyZWN0b3J5LgotICAgICAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIG5hbWUpCi0JICAoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBkZWZhdWx0KQotCQkJICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IG5hbWUpKQotCW5hbWUpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gZmluZC1jaGFuZ2UtbG9nICgmb3B0aW9uYWwgZmlsZS1uYW1lKQotICAiRmluZCBhIGNoYW5nZSBsb2cgZmlsZSBmb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGFuZCByZXR1cm4gdGhlIG5hbWUuCi0KLU9wdGlvbmFsIGFyZyBGSUxFLU5BTUUgc3BlY2lmaWVzIHRoZSBmaWxlIHRvIHVzZS4KLUlmIEZJTEUtTkFNRSBpcyBuaWwsIHVzZSB0aGUgdmFsdWUgb2YgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgaXMgbmlsLCBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgJ0NoYW5nZUxvZycKLVwob3Igd2hhdGV2ZXIgd2UgdXNlIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbSkuCi0KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgY29udGFpbnMgYSBsZWFkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4KLXNpbXBseSBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE90aGVyd2lzZSwgc2VhcmNoIGluIHRoZSBjdXJyZW50IAotZGlyZWN0b3J5IGFuZCBpdHMgc3VjY2Vzc2l2ZSBwYXJlbnRzIGZvciBhIGZpbGUgc28gbmFtZWQuCi0KLU9uY2UgYSBmaWxlIGlzIGZvdW5kLCBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGlzIHNldCBsb2NhbGx5IGluIHRoZQotY3VycmVudCBidWZmZXIgdG8gdGhlIGNvbXBsZXRlIGZpbGUgbmFtZS4iCi0gIDs7IElmIHVzZXIgc3BlY2lmaWVkIGEgZmlsZSBuYW1lIG9yIGlmIHRoaXMgYnVmZmVyIGtub3dzIHdoaWNoIG9uZSB0byB1c2UsCi0gIDs7IGp1c3QgdXNlIHRoYXQuCi0gIChvciBmaWxlLW5hbWUKLSAgICAgIChzZXRxIGZpbGUtbmFtZSAoYW5kIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lCi0JCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkKLQkJCSAgIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKSkKLSAgICAgIChwcm9nbgotCTs7IENoYXNlIGxpbmtzIGluIHRoZSBzb3VyY2UgZmlsZQotCTs7IGFuZCB1c2UgdGhlIGNoYW5nZSBsb2cgaW4gdGhlIGRpciB3aGVyZSBpdCBwb2ludHMuCi0JKHNldHEgZmlsZS1uYW1lIChvciAoYW5kIGJ1ZmZlci1maWxlLW5hbWUKLQkJCQkgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkgIChmaWxlLWNoYXNlLWxpbmtzIGJ1ZmZlci1maWxlLW5hbWUpKSkKLQkJCSAgICBkZWZhdWx0LWRpcmVjdG9yeSkpCi0JKGlmIChmaWxlLWRpcmVjdG9yeS1wIGZpbGUtbmFtZSkKLQkgICAgKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIChjaGFuZ2UtbG9nLW5hbWUpIGZpbGUtbmFtZSkpKQotCTs7IENoYXNlIGxpbmtzIGJlZm9yZSB2aXNpdGluZyB0aGUgZmlsZS4KLQk7OyBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgYSBzaW5nbGUgY2hhbmdlIGxvZyBmaWxlCi0JOzsgZm9yIHNldmVyYWwgcmVsYXRlZCBkaXJlY3Rvcmllcy4KLQkoc2V0cSBmaWxlLW5hbWUgKGZpbGUtY2hhc2UtbGlua3MgZmlsZS1uYW1lKSkKLQkoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZS1uYW1lKSkKLQk7OyBNb3ZlIHVwIGluIHRoZSBkaXIgaGllcmFyY2h5IHRpbGwgd2UgZmluZCBhIGNoYW5nZSBsb2cgZmlsZS4KLQkobGV0ICgoZmlsZTEgZmlsZS1uYW1lKQotCSAgICAgIHBhcmVudC1kaXIpCi0JICAod2hpbGUgKGFuZCAobm90IChvciAoZ2V0LWZpbGUtYnVmZmVyIGZpbGUxKSAoZmlsZS1leGlzdHMtcCBmaWxlMSkpKQotCQkgICAgICAocHJvZ24gKHNldHEgcGFyZW50LWRpcgotCQkJCSAgIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJICAgIChkaXJlY3RvcnktZmlsZS1uYW1lCi0JCQkJICAgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlMSkpKSkKLQkJCSAgICAgOzsgR2l2ZSB1cCBpZiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgcm9vdCBkaXIuCi0JCQkgICAgIChub3QgKHN0cmluZz0gKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZTEpCi0JCQkJCSAgIHBhcmVudC1kaXIpKSkpCi0JICAgIDs7IE1vdmUgdXAgdG8gdGhlIHBhcmVudCBkaXIgYW5kIHRyeSBhZ2Fpbi4KLQkgICAgKHNldHEgZmlsZTEgKGV4cGFuZC1maWxlLW5hbWUgCi0JCQkgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgKGNoYW5nZS1sb2ctbmFtZSkpCi0JCQkgcGFyZW50LWRpcikpKQotCSAgOzsgSWYgd2UgZm91bmQgYSBjaGFuZ2UgbG9nIGluIGEgcGFyZW50LCB1c2UgdGhhdC4KLQkgIChpZiAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlMSkgKGZpbGUtZXhpc3RzLXAgZmlsZTEpKQotCSAgICAgIChzZXRxIGZpbGUtbmFtZSBmaWxlMSkpKSkpCi0gIDs7IE1ha2UgYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGlzIGJ1ZmZlciBzbyB3ZSBuZWVkbid0IHNlYXJjaCBhZ2Fpbi4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpIGZpbGUtbmFtZSkKLSAgZmlsZS1uYW1lKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5ICgmb3B0aW9uYWwgd2hvYW1pIGZpbGUtbmFtZSBvdGhlci13aW5kb3cgbmV3LWVudHJ5KQotICAiRmluZCBjaGFuZ2UgbG9nIGZpbGUgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBJZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLVRoaXJkIGFyZyBPVEhFUi1XSU5ET1cgbm9uLW5pbCBtZWFucyB2aXNpdCBpbiBvdGhlciB3aW5kb3cuCi1Gb3VydGggYXJnIE5FVy1FTlRSWSBub24tbmlsIG1lYW5zIGFsd2F5cyBjcmVhdGUgYSBuZXcgZW50cnkgYXQgdGhlIGZyb250OwotbmV2ZXIgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIGVudHJ5LiIKLSAgKGludGVyYWN0aXZlIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkgICAgIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKQotICAob3IgYWRkLWxvZy1mdWxsLW5hbWUKLSAgICAgIChzZXRxIGFkZC1sb2ctZnVsbC1uYW1lICh1c2VyLWZ1bGwtbmFtZSkpKQotICAob3IgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MKLSAgICAgIChzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzIHVzZXItbWFpbC1hZGRyZXNzKSkKLSAgKGlmIHdob2FtaQotICAgICAgKHByb2duCi0JKHNldHEgYWRkLWxvZy1mdWxsLW5hbWUgKHJlYWQtaW5wdXQgIkZ1bGwgbmFtZTogIiBhZGQtbG9nLWZ1bGwtbmFtZSkpCi0JIDs7IE5vdGUgdGhhdCBzb21lIHNpdGVzIGhhdmUgcm9vbSBhbmQgcGhvbmUgbnVtYmVyIGZpZWxkcyBpbgotCSA7OyBmdWxsIG5hbWUgd2hpY2ggbG9vayBzaWxseSB3aGVuIGluc2VydGVkLiAgUmF0aGVyIHRoYW4gZG8KLQkgOzsgYW55dGhpbmcgYWJvdXQgdGhhdCBoZXJlLCBsZXQgdXNlciBnaXZlIHByZWZpeCBhcmd1bWVudCBzbyB0aGF0Ci0JIDs7IHMvaGUgY2FuIGVkaXQgdGhlIGZ1bGwgbmFtZSBmaWVsZCBpbiBwcm9tcHRlciBpZiBzL2hlIHdhbnRzLgotCShzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzCi0JICAgICAgKHJlYWQtaW5wdXQgIk1haWxpbmcgYWRkcmVzczogIiBhZGQtbG9nLW1haWxpbmctYWRkcmVzcykpKSkKLSAgKGxldCAoKGRlZnVuIChmdW5jYWxsIChvciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4tZnVuY3Rpb24KLQkJCSAgICAnYWRkLWxvZy1jdXJyZW50LWRlZnVuKSkpCi0JcGFyYWdyYXBoLWVuZCBlbnRyeSkKLQotICAgIChzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoZmluZC1jaGFuZ2UtbG9nIGZpbGUtbmFtZSkpKQotCi0gICAgOzsgU2V0IEVOVFJZIHRvIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGluIHRoZSBuZXcgZW50cnkuCi0gICAgKGFuZCBidWZmZXItZmlsZS1uYW1lCi0JIDs7IE5ldmVyIHdhbnQgdG8gYWRkIGEgY2hhbmdlIGxvZyBlbnRyeSBmb3IgdGhlIENoYW5nZUxvZyBmaWxlIGl0c2VsZi4KLQkgKG5vdCAoc3RyaW5nPSBidWZmZXItZmlsZS1uYW1lIGZpbGUtbmFtZSkpCi0JIChzZXRxIGVudHJ5IChpZiAoc3RyaW5nLW1hdGNoCi0JCQkgIChjb25jYXQgIl4iIChyZWdleHAtcXVvdGUgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkJCSAgICAgZmlsZS1uYW1lKSkpCi0JCQkgIGJ1ZmZlci1maWxlLW5hbWUpCi0JCQkgKHN1YnN0cmluZyBidWZmZXItZmlsZS1uYW1lIChtYXRjaC1lbmQgMCkpCi0JCSAgICAgICAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBidWZmZXItZmlsZS1uYW1lKSkpKQotCi0gICAgKGlmIChhbmQgb3RoZXItd2luZG93IChub3QgKGVxdWFsIGZpbGUtbmFtZSBidWZmZXItZmlsZS1uYW1lKSkpCi0JKGZpbmQtZmlsZS1vdGhlci13aW5kb3cgZmlsZS1uYW1lKQotICAgICAgKGZpbmQtZmlsZSBmaWxlLW5hbWUpKQotICAgIChvciAoZXEgbWFqb3ItbW9kZSAnY2hhbmdlLWxvZy1tb2RlKQotCShjaGFuZ2UtbG9nLW1vZGUpKQotICAgICh1bmRvLWJvdW5kYXJ5KQotICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0gICAgKGxldCAoKGhlYWRpbmcgKGZvcm1hdCAiJXMgICVzICA8JXM+IgotCQkJICAgKGZvcm1hdC10aW1lLXN0cmluZyAiJVktJW0tJWQiKQotCQkJICAgYWRkLWxvZy1mdWxsLW5hbWUKLQkJCSAgIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzKSkpCi0gICAgICAoaWYgKGxvb2tpbmctYXQgKHJlZ2V4cC1xdW90ZSBoZWFkaW5nKSkKLQkgIChmb3J3YXJkLWxpbmUgMSkKLQkoaW5zZXJ0IGhlYWRpbmcgIlxuXG4iKSkpCi0KLSAgICA7OyBTZWFyY2ggb25seSB3aXRoaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4KLSAgICAoaWYgKGxvb2tpbmctYXQgIlxuKlteXG4qIFx0XSIpCi0JKHNraXAtY2hhcnMtZm9yd2FyZCAiXG4iKQotICAgICAgKGZvcndhcmQtcGFyYWdyYXBoIDEpKQotICAgIChzZXRxIHBhcmFncmFwaC1lbmQgKHBvaW50KSkKLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotCi0gICAgOzsgTm93IGluc2VydCB0aGUgbmV3IGxpbmUgZm9yIHRoaXMgZW50cnkuCi0gICAgKGNvbmQgKChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqXFwqXFxzICokIiBwYXJhZ3JhcGgtZW5kIHQpCi0JICAgOzsgUHV0IHRoaXMgZmlsZSBuYW1lIGludG8gdGhlIGV4aXN0aW5nIGVtcHR5IGVudHJ5LgotCSAgIChpZiBlbnRyeQotCSAgICAgICAoaW5zZXJ0IGVudHJ5KSkpCi0JICAoKGFuZCAobm90IG5ldy1lbnRyeSkKLQkJKGxldCAoY2FzZS1mb2xkLXNlYXJjaCkKLQkJICAocmUtc2VhcmNoLWZvcndhcmQKLQkJICAgKGNvbmNhdCAocmVnZXhwLXF1b3RlIChjb25jYXQgIiogIiBlbnRyeSkpCi0JCQkgICA7OyBEb24ndCBhY2NlcHQgYGZvby5iYXInIHdoZW4KLQkJCSAgIDs7IGxvb2tpbmcgZm9yIGBmb28nOgotCQkJICAgIlxcKFxccyBcXHxbKCksOl1cXCkiKQotCQkgICBwYXJhZ3JhcGgtZW5kIHQpKSkKLQkgICA7OyBBZGQgdG8gdGhlIGV4aXN0aW5nIGVudHJ5IGZvciB0aGUgc2FtZSBmaWxlLgotCSAgIChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqJFxcfF5cXHMgXFwqIikKLQkgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JICAgOzsgRGVsZXRlIGV4Y2VzcyBlbXB0eSBsaW5lczsgbWFrZSBqdXN0IDIuCi0JICAgKHdoaWxlIChhbmQgKG5vdCAoZW9icCkpIChsb29raW5nLWF0ICJeXFxzICokIikpCi0JICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1saW5lIDEpIChwb2ludCkpKSkKLQkgICAoaW5zZXJ0ICJcblxuIikKLQkgICAoZm9yd2FyZC1saW5lIC0yKQotCSAgIChpbmRlbnQtcmVsYXRpdmUtbWF5YmUpKQotCSAgKHQKLQkgICA7OyBNYWtlIGEgbmV3IGVudHJ5LgotCSAgIChmb3J3YXJkLWxpbmUgMSkKLQkgICAod2hpbGUgKGxvb2tpbmctYXQgIlxcc1ciKQotCSAgICAgKGZvcndhcmQtbGluZSAxKSkKLQkgICAod2hpbGUgKGFuZCAobm90IChlb2JwKSkgKGxvb2tpbmctYXQgIl5cXHMgKiQiKSkKLQkgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpKQotCSAgIChpbnNlcnQgIlxuXG5cbiIpCi0JICAgKGZvcndhcmQtbGluZSAtMikKLQkgICAoaW5kZW50LXRvIGxlZnQtbWFyZ2luKQotCSAgIChpbnNlcnQgIiogIiAob3IgZW50cnkgIiIpKSkpCi0gICAgOzsgTm93IGluc2VydCB0aGUgZnVuY3Rpb24gbmFtZSwgaWYgd2UgaGF2ZSBvbmUuCi0gICAgOzsgUG9pbnQgaXMgYXQgdGhlIGVudHJ5IGZvciB0aGlzIGZpbGUsCi0gICAgOzsgZWl0aGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgYXQgdGhlIGZpcnN0IGJsYW5rIGxpbmUuCi0gICAgKGlmIGRlZnVuCi0JKHByb2duCi0JICA7OyBNYWtlIGl0IGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLQkgICh1bmRvLWJvdW5kYXJ5KQotCSAgKGluc2VydCAoaWYgKHNhdmUtZXhjdXJzaW9uCi0JCQkoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJCShsb29raW5nLWF0ICJcXHMgKiQiKSkgCi0JCSAgICAgICIiCi0JCSAgICAiICIpCi0JCSAgIigiIGRlZnVuICIpOiAiKSkKLSAgICAgIDs7IE5vIGZ1bmN0aW9uIG5hbWUsIHNvIHB1dCBpbiBhIGNvbG9uIHVubGVzcyB3ZSBoYXZlIGp1c3QgYSBzdGFyLgotICAgICAgKGlmIChub3QgKHNhdmUtZXhjdXJzaW9uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJIChsb29raW5nLWF0ICJcXHMgKlxcKFxcKlxccyAqXFwpPyQiKSkpCi0JICAoaW5zZXJ0ICI6ICIpKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdyAoJm9wdGlvbmFsIHdob2FtaSBmaWxlLW5hbWUpCi0gICJGaW5kIGNoYW5nZSBsb2cgZmlsZSBpbiBvdGhlciB3aW5kb3cgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBcCi1JZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4iCi0gIChpbnRlcmFjdGl2ZSAoaWYgY3VycmVudC1wcmVmaXgtYXJnCi0JCSAgIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkJIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKSkKLSAgKGFkZC1jaGFuZ2UtbG9nLWVudHJ5IHdob2FtaSBmaWxlLW5hbWUgdCkpCi07OzsjIyNhdXRvbG9hZCAoZGVmaW5lLWtleSBjdGwteC00LW1hcCAiYSIgJ2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdykKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBjaGFuZ2UtbG9nLW1vZGUgKCkKLSAgIk1ham9yIG1vZGUgZm9yIGVkaXRpbmcgY2hhbmdlIGxvZ3M7IGxpa2UgSW5kZW50ZWQgVGV4dCBNb2RlLgotUHJldmVudHMgbnVtZXJpYyBiYWNrdXBzIGFuZCBzZXRzIGBsZWZ0LW1hcmdpbicgdG8gOCBhbmQgYGZpbGwtY29sdW1uJyB0byA3NC4KLU5ldyBsb2cgZW50cmllcyBhcmUgdXN1YWxseSBtYWRlIHdpdGggXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIG9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvd10uCi1FYWNoIGVudHJ5IGJlaGF2ZXMgYXMgYSBwYXJhZ3JhcGgsIGFuZCB0aGUgZW50cmllcyBmb3Igb25lIGRheSBhcyBhIHBhZ2UuCi1SdW5zIGBjaGFuZ2UtbG9nLW1vZGUtaG9vaycuIgotICAoaW50ZXJhY3RpdmUpCi0gIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCi0gIChpbmRlbnRlZC10ZXh0LW1vZGUpCi0gIChzZXRxIG1ham9yLW1vZGUgJ2NoYW5nZS1sb2ctbW9kZQotCW1vZGUtbmFtZSAiQ2hhbmdlIExvZyIKLQlsZWZ0LW1hcmdpbiA4Ci0JZmlsbC1jb2x1bW4gNzQKLSAgICBpbmRlbnQtdGFicy1tb2RlIHQKLSAgICB0YWItd2lkdGggOCkKLSAgKHVzZS1sb2NhbC1tYXAgY2hhbmdlLWxvZy1tb2RlLW1hcCkKLSAgOzsgTGV0IGVhY2ggZW50cnkgYmVoYXZlIGFzIG9uZSBwYXJhZ3JhcGg6Ci0gIDs7IFdlIHJlYWxseSBkbyB3YW50ICJeIiBpbiBwYXJhZ3JhcGgtc3RhcnQgYmVsb3c6IGl0IGlzIG9ubHkgdGhlIGxpbmVzIHRoYXQKLSAgOzsgYmVnaW4gYXQgY29sdW1uIDAgKGRlc3BpdGUgdGhlIGxlZnQtbWFyZ2luIG9mIDgpIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc3RhcnQpICJcXHMgKiRcXHxcZlxcfF5cXHN3IikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXNlcGFyYXRlKSAiXFxzICokXFx8XGZcXHxeXFxzdyIpCi0gIDs7IExldCBhbGwgZW50cmllcyBmb3Igb25lIGRheSBiZWhhdmUgYXMgb25lIHBhZ2UuCi0gIDs7IE1hdGNoIG51bGwgc3RyaW5nIG9uIHRoZSBkYXRlLWxpbmUgc28gdGhhdCB0aGUgZGF0ZS1saW5lCi0gIDs7IGlzIGdyb3VwZWQgd2l0aCB3aGF0IGZvbGxvd3MuCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhZ2UtZGVsaW1pdGVyKSAiXlxcPFxcfF5cZiIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3ZlcnNpb24tY29udHJvbCkgJ25ldmVyKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdhZGFwdGl2ZS1maWxsLXJlZ2V4cCkgIlxccyAqIikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWRlZmF1bHRzKQotICAgICAgICcoY2hhbmdlLWxvZy1mb250LWxvY2sta2V5d29yZHMgdCkpCi0gIChydW4taG9va3MgJ2NoYW5nZS1sb2ctbW9kZS1ob29rKSkKLQotOzsgSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgZ2VuZXJhbCBmZWF0dXJlIHRvIHJlcGxhY2UgdGhpcy4gIFRoZSBpZGVhIEkKLTs7IGhhdmUgaXMgYSB2YXJpYWJsZSBnaXZpbmcgYSByZWdleHAgbWF0Y2hpbmcgdGV4dCB3aGljaCBzaG91bGQgbm90IGJlCi07OyBtb3ZlZCBmcm9tIGJvbCBieSBmaWxsaW5nLiAgY2hhbmdlLWxvZy1tb2RlIHdvdWxkIHNldCB0aGlzIHRvICJeXFxzICpcXHMoIi4KLTs7IEJ1dCBJIGRvbid0IGZlZWwgdXAgdG8gaW1wbGVtZW50aW5nIHRoYXQgdG9kYXkuCi0oZGVmdW4gY2hhbmdlLWxvZy1maWxsLXBhcmFncmFwaCAoJm9wdGlvbmFsIGp1c3RpZnkpCi0gICJGaWxsIHRoZSBwYXJhZ3JhcGgsIGJ1dCBwcmVzZXJ2ZSBvcGVuIHBhcmVudGhlc2VzIGF0IGJlZ2lubmluZyBvZiBsaW5lcy4KLVByZWZpeCBhcmcgbWVhbnMganVzdGlmeSBhcyB3ZWxsLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKGVuZCAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtcGFyYWdyYXBoKSAocG9pbnQpKSkKLQkoYmVnIChzYXZlLWV4Y3Vyc2lvbiAoYmFja3dhcmQtcGFyYWdyYXBoKShwb2ludCkpKQotCShwYXJhZ3JhcGgtc3RhcnQgKGNvbmNhdCBwYXJhZ3JhcGgtc3RhcnQgIlxcfFxccyAqXFxzKCIpKSkKLSAgICAoZmlsbC1yZWdpb24gYmVnIGVuZCBqdXN0aWZ5KSkpCi0MCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwCi0gICJeXFwoW0EtWl1bQS1aXyBdKltBLVpfXVxcfFstX2EtekEtWl0rXFwpWyBcdF0qWzo9XSIKLSAgIipIZXVyaXN0aWMgcmVnZXhwIHVzZWQgYnkgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicgZm9yIHVua25vd24gbWFqb3IgbW9kZXMuIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtbG9nLWN1cnJlbnQtZGVmdW4gKCkKLSAgIlJldHVybiBuYW1lIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gcG9pbnQgaXMgaW4sIG9yIG5pbC4KLQotVW5kZXJzdGFuZHMgQywgTGlzcCwgTGFUZVggKFwiZnVuY3Rpb25zXCIgYXJlIGNoYXB0ZXJzLCBzZWN0aW9ucywgLi4uKSwKLVRleGluZm8gKEBub2RlIHRpdGxlcyksIFBlcmwsIGFuZCBGb3J0cmFuLgotCi1PdGhlciBtb2RlcyBhcmUgaGFuZGxlZCBieSBhIGhldXJpc3RpYyB0aGF0IGxvb2tzIGluIHRoZSAxMEsgYmVmb3JlCi1wb2ludCBmb3IgdXBwZXJjYXNlIGhlYWRpbmdzIHN0YXJ0aW5nIGluIHRoZSBmaXJzdCBjb2x1bW4gb3IKLWlkZW50aWZpZXJzIGZvbGxvd2VkIGJ5IGA6JyBvciBgPScsIHNlZSB2YXJpYWJsZQotYGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwJy4KLQotSGFzIGEgcHJlZmVyZW5jZSBvZiBsb29raW5nIGJhY2t3YXJkcy4iCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCShsZXQgKChsb2NhdGlvbiAocG9pbnQpKSkKLQkgIChjb25kICgobWVtcSBtYWpvci1tb2RlICcoZW1hY3MtbGlzcC1tb2RlIGxpc3AtbW9kZSBzY2hlbWUtbW9kZQotCQkJCQkJICAgIGxpc3AtaW50ZXJhY3Rpb24tbW9kZSkpCi0JCSA7OyBJZiB3ZSBhcmUgbm93IHByZWNpc2VseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZGVmdW4sCi0JCSA7OyBtYWtlIHN1cmUgYmVnaW5uaW5nLW9mLWRlZnVuIGZpbmRzIHRoYXQgb25lCi0JCSA7OyByYXRoZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgotCQkgKG9yIChlb2JwKSAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIDs7IE1ha2Ugc3VyZSB3ZSBhcmUgcmVhbGx5IGluc2lkZSB0aGUgZGVmdW4gZm91bmQsIG5vdCBhZnRlciBpdC4KLQkJIChpZiAoYW5kIChsb29raW5nLWF0ICJcXHMoIikKLQkJCSAgKHByb2duIChlbmQtb2YtZGVmdW4pCi0JCQkJICg8IGxvY2F0aW9uIChwb2ludCkpKQotCQkJICAocHJvZ24gKGZvcndhcmQtc2V4cCAtMSkKLQkJCQkgKD49IGxvY2F0aW9uIChwb2ludCkpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChpZiAobG9va2luZy1hdCAiXFxzKCIpCi0JCQkgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgICAgICAgKGZvcndhcmQtc2V4cCAxKQotCQkgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiICciKQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKSkpCi0JCSgoYW5kIChtZW1xIG1ham9yLW1vZGUgJyhjLW1vZGUgYysrLW1vZGUgYysrLWMtbW9kZSBvYmpjLW1vZGUpKQotCQkgICAgICAoc2F2ZS1leGN1cnNpb24gKGJlZ2lubmluZy1vZi1saW5lKQotCQkJCSAgICAgIDs7IFVzZSBlcSBpbnN0ZWFkIG9mID0gaGVyZSB0byBhdm9pZAotCQkJCSAgICAgIDs7IGVycm9yIHdoZW4gYXQgYm9iIGFuZCBjaGFyLWFmdGVyCi0JCQkJICAgICAgOzsgcmV0dXJucyBuaWwuCi0JCQkJICAgICAgKHdoaWxlIChlcSAoY2hhci1hZnRlciAoLSAocG9pbnQpIDIpKSA/XFwpCi0JCQkJCShmb3J3YXJkLWxpbmUgLTEpKQotCQkJCSAgICAgIChsb29raW5nLWF0ICJbIFx0XSojWyBcdF0qZGVmaW5lWyBcdF0iKSkpCi0JCSA7OyBIYW5kbGUgYSBDIG1hY3JvIGRlZmluaXRpb24uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCSAod2hpbGUgKGVxIChjaGFyLWFmdGVyICgtIChwb2ludCkgMikpID9cXCkgO25vdCA9OyBub3RlIGFib3ZlCi0JCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkgKHNlYXJjaC1mb3J3YXJkICJkZWZpbmUiKQotCQkgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLQkJIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkgICAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpCi0JCSgobWVtcSBtYWpvci1tb2RlICcoYy1tb2RlIGMrKy1tb2RlIGMrKy1jLW1vZGUgb2JqYy1tb2RlKSkKLQkJIChiZWdpbm5pbmctb2YtbGluZSkKLQkJIDs7IFNlZSBpZiB3ZSBhcmUgaW4gdGhlIGJlZ2lubmluZyBwYXJ0IG9mIGEgZnVuY3Rpb24sCi0JCSA7OyBiZWZvcmUgdGhlIG9wZW4gYnJhY2UuICBJZiBzbywgYWR2YW5jZSBmb3J3YXJkLgotCQkgKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIntcXHxcXChcXHMgKiRcXCkiKSkKLQkJICAgKGZvcndhcmQtbGluZSAxKSkKLQkJIChvciAoZW9icCkKLQkJICAgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIChpZiAocHJvZ24gKGVuZC1vZi1kZWZ1bikKLQkJCSAgICAoPCBsb2NhdGlvbiAocG9pbnQpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCSAgICAgICAobGV0IChiZWcgdGVtKQotCi0JCQkgKGZvcndhcmQtbGluZSAtMSkKLQkJCSA7OyBTa2lwIGJhY2sgb3ZlciB0eXBlZGVmcyBvZiBhcmdsaXN0LgotCQkJICh3aGlsZSAoYW5kIChub3QgKGJvYnApKQotCQkJCSAgICAgKGxvb2tpbmctYXQgIlsgXHRcbl0iKSkKLQkJCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkJIDs7IFNlZSBpZiB0aGlzIGlzIHVzaW5nIHRoZSBERUZVTiBtYWNybyB1c2VkIGluIEVtYWNzLAotCQkJIDs7IG9yIHRoZSBERUZVTiBtYWNybyB1c2VkIGJ5IHRoZSBDIGxpYnJhcnkuCi0JCQkgKGlmIChjb25kaXRpb24tY2FzZSBuaWwKLQkJCQkgKGFuZCAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGVuZC1vZi1saW5lKQotCQkJCQkod2hpbGUgKD0gKHByZWNlZGluZy1jaGFyKSA/XFwpCi0JCQkJCSAgKGVuZC1vZi1saW5lIDIpKQotCQkJCQkoYmFja3dhcmQtc2V4cCAxKQotCQkJCQkoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCQkJCShzZXRxIHRlbSAocG9pbnQpKQotCQkJCQkobG9va2luZy1hdCAiREVGVU5cXGIiKSkKLQkJCQkgICAgICAoPj0gbG9jYXRpb24gdGVtKSkKLQkJCSAgICAgICAoZXJyb3IgbmlsKSkKLQkJCSAgICAgKHByb2duCi0JCQkgICAgICAgKGdvdG8tY2hhciB0ZW0pCi0JCQkgICAgICAgKGRvd24tbGlzdCAxKQotCQkJICAgICAgIChpZiAoPSAoY2hhci1hZnRlciAocG9pbnQpKSA/XCIpCi0JCQkJICAgKHByb2duCi0JCQkJICAgICAoZm9yd2FyZC1zZXhwIDEpCi0JCQkJICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgLCIpKSkKLQkJCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChsb29raW5nLWF0ICJeWystXSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldC1tZXRob2QtZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgT3JkaW5hcnkgQyBmdW5jdGlvbiBzeW50YXguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGJlZyAocG9pbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCAoY29uZGl0aW9uLWNhc2UgbmlsCi0JCQkJCSAgOzsgUHJvdGVjdCBhZ2FpbnN0ICJVbmJhbGFuY2VkIHBhcmVucyIgZXJyb3IuCi0JCQkJCSAgKHByb2duCi0JCQkJCSAgICAoZG93bi1saXN0IDEpIDsgaW50byBhcmdsaXN0Ci0JCQkJCSAgICAoYmFja3dhcmQtdXAtbGlzdCAxKQotCQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpCi0JCQkJCSAgICB0KQotCQkJCQkoZXJyb3IgbmlsKSkKLQkJCQkgICAgICA7OyBWZXJpZnkgaW5pdGlhbCBwb3Mgd2FzIGFmdGVyCi0JCQkJICAgICAgOzsgcmVhbCBzdGFydCBvZiBmdW5jdGlvbi4KLQkJCQkgICAgICAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGdvdG8tY2hhciBiZWcpCi0JCQkJCTs7IEZvciB0aGlzIHB1cnBvc2UsIGluY2x1ZGUgdGhlIGxpbmUKLQkJCQkJOzsgdGhhdCBoYXMgdGhlIGRlY2wga2V5d29yZHMuICBUaGlzCi0JCQkJCTs7IG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUKLQkJCQkJOzsgY29tbWVudHMgYmVmb3JlIHRoZSBmdW5jdGlvbi4KLQkJCQkJKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCi0JCQkJCQkgICAgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCQkgICAgICAoZm9yd2FyZC1saW5lIC0xKQotCQkJCQkJICAgICAgKGxvb2tpbmctYXQgIlteXG5cZl0iKSkpCi0JCQkJCSAgKGZvcndhcmQtbGluZSAtMSkpCi0JCQkJCSg+PSBsb2NhdGlvbiAocG9pbnQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IENvbnNpc3RlbmN5IGNoZWNrOiBnb2luZyBkb3duIGFuZCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgc2hvdWxkbid0IHRha2UgdXMgYmFjayBiZWZvcmUgQkVHLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD4gKHBvaW50KSBiZWcpKQotCQkJCSAobGV0IChlbmQgbWlkZGxlKQotCQkJCSAgIDs7IERvbid0IGluY2x1ZGUgYW55IGZpbmFsIG5ld2xpbmUKLQkJCQkgICA7OyBpbiB0aGUgbmFtZSB3ZSB1c2UuCi0JCQkJICAgKGlmICg9IChwcmVjZWRpbmctY2hhcikgP1xuKQotCQkJCSAgICAgICAoZm9yd2FyZC1jaGFyIC0xKSkKLQkJCQkgICAoc2V0cSBlbmQgKHBvaW50KSkKLQkJCQkgICAoYmFja3dhcmQtc2V4cCAxKQotCQkJCSAgIDs7IE5vdyBmaW5kIHRoZSByaWdodCBiZWdpbm5pbmcgb2YgdGhlIG5hbWUuCi0JCQkJICAgOzsgSW5jbHVkZSBjZXJ0YWluIGtleXdvcmRzIGlmIHRoZXkKLQkJCQkgICA7OyBwcmVjZWRlIHRoZSBuYW1lLgotCQkJCSAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgIChmb3J3YXJkLXdvcmQgLTEpCi0JCQkJICAgOzsgSWdub3JlIHRoZXNlIHN1YnBhcnRzIG9mIGEgY2xhc3MgZGVjbAotCQkJCSAgIDs7IGFuZCBtb3ZlIGJhY2sgdG8gdGhlIGNsYXNzIG5hbWUgaXRzZWxmLgotCQkJCSAgICh3aGlsZSAobG9va2luZy1hdCAicHVibGljIFxcfHByaXZhdGUgIikKLQkJCQkgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQ6IikKLQkJCQkgICAgIChzZXRxIGVuZCAocG9pbnQpKQotCQkJCSAgICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkgICAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgICAgKGZvcndhcmQtd29yZCAtMSkpCi0JCQkJICAgKGFuZCAoYm9scCkKLQkJCQkJKGxvb2tpbmctYXQgInN0cnVjdCBcXHx1bmlvbiBcXHxjbGFzcyAiKQotCQkJCQkoc2V0cSBtaWRkbGUgKHBvaW50KSkpCi0JCQkJICAgKGJ1ZmZlci1zdWJzdHJpbmcgbWlkZGxlIGVuZCkpKSkpKSkpKQotCQkoKG1lbXEgbWFqb3ItbW9kZQotCQkgICAgICAgJyhUZVgtbW9kZSBwbGFpbi1UZVgtbW9kZSBMYVRlWC1tb2RlOzsgdGV4LW1vZGUuZWwKLQkJCQkgIHBsYWluLXRleC1tb2RlIGxhdGV4LW1vZGU7OyBjbXV0ZXguZWwKLQkJCQkgICkpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZAotCQkgICAgICAiXFxcXFxcKHN1YlxcKSpcXChzZWN0aW9uXFx8cGFyYWdyYXBoXFx8Y2hhcHRlclxcKSIgbmlsIHQpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAoMSsgKHBvaW50KSk7OyB3aXRob3V0IGluaXRpYWwgYmFja3NsYXNoCi0JCQkJCSAocHJvZ24KLQkJCQkJICAgKGVuZC1vZi1saW5lKQotCQkJCQkgICAocG9pbnQpKSkpKSkKLQkJKChlcSBtYWpvci1tb2RlICd0ZXhpbmZvLW1vZGUpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXkBub2RlWyBcdF0rXFwoW14sXG5dK1xcKSIgbmlsIHQpCi0JCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCSAgICAgICAobWF0Y2gtZW5kIDEpKSkpCi0JCSgoZXEgbWFqb3ItbW9kZSAncGVybC1tb2RlKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5zdWJbIFx0XStcXChbXiBcdFxuXStcXCkiIG5pbCB0KQotCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkgICAgICAgKG1hdGNoLWVuZCAxKSkpKQotICAgICAgICAgICAgICAgICgoZXEgbWFqb3ItbW9kZSAnZm9ydHJhbi1tb2RlKQotICAgICAgICAgICAgICAgICA7OyBtdXN0IGJlIGluc2lkZSBmdW5jdGlvbiBib2R5IGZvciB0aGlzIHRvIHdvcmsKLSAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1mb3J0cmFuLXN1YnByb2dyYW0pCi0gICAgICAgICAgICAgICAgIChsZXQgKChjYXNlLWZvbGQtc2VhcmNoIHQpKSA7IGNhc2UtaW5zZW5zaXRpdmUKLSAgICAgICAgICAgICAgICAgICA7OyBzZWFyY2ggZm9yIGZvcnRyYW4gc3VicHJvZ3JhbSBzdGFydAotICAgICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQKLQkJCSAiXlsgXHRdKlxcKHByb2dyYW1cXHxzdWJyb3V0aW5lXFx8ZnVuY3Rpb25cCi1cXHxbIFx0YS16MC05Kl0qWyBcdF0rZnVuY3Rpb25cXCkiCi0JCQkgbmlsIHQpCi0gICAgICAgICAgICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAgICAgICAgICAgICAgIDs7IG1vdmUgdG8gRU9MIG9yIGJlZm9yZSBmaXJzdCBsZWZ0IHBhcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZCAiWyhcbl0iIG5pbCB0KQotCQkJICAgICAocHJvZ24gKGZvcndhcmQtY2hhciAtMSkKLQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpKQotCQkJICAgKGVuZC1vZi1saW5lKSkKLQkJCSA7OyBVc2UgdGhlIG5hbWUgcHJlY2VkaW5nIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9nbiAoZm9yd2FyZC1zZXhwIC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpKSkpKSkpCi0JCSh0Ci0JCSA7OyBJZiBhbGwgZWxzZSBmYWlscywgdHJ5IGhldXJpc3RpY3MKLQkJIChsZXQgKGNhc2UtZm9sZC1zZWFyY2gpCi0JCSAgIChlbmQtb2YtbGluZSkKLQkJICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAKLQkJCQkJICAgKC0gKHBvaW50KSAxMDAwMCkKLQkJCQkJICAgdCkKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkJIChtYXRjaC1lbmQgMSkpKSkpKSkpCi0gICAgKGVycm9yIG5pbCkpKQotCi0oZGVmdmFyIGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCkKLQotOzsgU3Vicm91dGluZSB1c2VkIHdpdGhpbiBnZXQtbWV0aG9kLWRlZmluaXRpb24uCi07OyBBZGQgdGhlIGxhc3QgbWF0Y2ggaW4gdGhlIGJ1ZmZlciB0byB0aGUgZW5kIG9mIGBtZCcsCi07OyBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIEVORDsgbW92ZSB0byB0aGUgZW5kIG9mIHRoYXQgbWF0Y2guCi0oZGVmdW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgKGVuZCkKLSAgKHNldHEgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kCi0JKGNvbmNhdCBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgCi0JCShidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKLQkJZW5kKSkKLSAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKLQotOzsgRm9yIG9iamVjdGl2ZSBDLCByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIGlmIHdlIGFyZSBpbiBhIG1ldGhvZC4KLShkZWZ1biBnZXQtbWV0aG9kLWRlZmluaXRpb24gKCkKLSAgKGxldCAoKGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiWyIpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5AaW1wbGVtZW50YXRpb25cXHMtKlxcKFtBLVphLXpfXSpcXCkiIG5pbCB0KQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIgIikpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGNvbmQKLSAgICAgICAoKHJlLXNlYXJjaC1mb3J3YXJkICJeXFwoWy0rXVxcKVsgXHRcblxmXHJdKlxcKChbXildKilcXCk/XFxzLSoiIG5pbCB0KQotCShnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiIikKLQkod2hpbGUgKG5vdCAobG9va2luZy1hdCAiW3s7XSIpKQotCSAgKGxvb2tpbmctYXQKLQkgICAiXFwoW0EtWmEtel9dKjo/XFwpXFxzLSpcXCgoW14pXSopXFwpP1tBLVphLXpfXSpbIFx0XG5cZlxyXSoiKQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIiKSkKLQkoY29uY2F0IGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiXSIpKSkpKSkKLQotCi0ocHJvdmlkZSAnYWRkLWxvZykKLQotOzs7IGFkZC1sb2cuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9ldGMvYWRkLWxvZy52aSBiL2V0Yy9hZGQtbG9nLnZpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4Yzc3Li4wMDAwMDAwCi0tLSBhL2V0Yy9hZGQtbG9nLnZpCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmVpbiBiL2V0Yy9jb25maWdidWlsZC5laW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGUyMTQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmVpbgorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0lIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAotJSVUaXRsZTogY29uZmlnYnVpbGQuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogRnJpIEp1biAxMiAyMDoxMzoxNiAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzIyIDE3MwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMjI2LjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzODI1IDkwMCBsICAzODI1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIyMjAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyNjI1IDIzMjUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAyODUwIDIxMDAgbSA0MTI1IDIxMDAgbCAgNDEyNSAyNjI1IGwgIDI4NTAgMjYyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDMzNzUgMTQyNSBtIDMzNzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzNDA1LjAwIDE5ODAuMDAgbSAzMzc1LjAwIDIxMDAuMDAgbCAzMzQ1LjAwIDE5ODAuMDAgbCAgMzM3NS41MCAxOTgwLjUwIGwgMzQwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUxMDAgOTAwIG0gNjMwMCA5MDAgbCAgNjMwMCAxMzUwIGwgIDUxMDAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2MjUgMTM1MCBtIDU2MjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NjU1LjAwIDE5ODAuMDAgbSA1NjI1LjAwIDIxMDAuMDAgbCA1NTk1LjAwIDE5ODAuMDAgbCAgNTYyNS41MCAxOTgwLjUwIGwgNTY1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUyMDUgMjEwMCBtIDUxMDAgMjEwMCA1MTAwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDUxMDAgMjYyNSA2MjcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjYyNSA2Mzc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjEwMCA1MjA1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTYyNSAyNjI1IG0gNTYyNSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU2NTUuMDAgMzE4MC4wMCBtIDU2MjUuMDAgMzMwMC4wMCBsIDU1OTUuMDAgMzE4MC4wMCBsICA1NjI1LjUwIDMxODAuNTAgbCA1NjU1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNTEwMCAzMzAwIG0gNjIyNSAzMzAwIGwgIDYyMjUgMzc1MCBsICA1MTAwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDI4NTAgMjQwMCBtIDIzMjUgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gMjQ0NS4wMCAyNDMwLjAwIG0gMjMyNS4wMCAyNDAwLjAwIGwgMjQ0NS4wMCAyMzcwLjAwIGwgIDI0NDUuNTAgMjQwMC41MCBsIDI0NDUuMDAgMjQzMC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDQxMjUgMjQwMCBtIDUxMDAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gNDk4MC4wMCAyMzcwLjAwIG0gNTEwMC4wMCAyNDAwLjAwIGwgNDk4MC4wMCAyNDMwLjAwIGwgIDQ5ODAuNTAgMjQwMC41MCBsIDQ5ODAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAxOTUwIDMzMDAgbCAgMTk1MCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMzYwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuaCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAxMjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01MjUwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAzNjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlKSBjb2wtMSBzaG93IGdyCi0kRjJwc0VuZAotcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmZpZyBiL2V0Yy9jb25maWdidWlsZC5maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzU5MmQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSNGSUcgMy4xCi1Qb3J0cmFpdAotQ2VudGVyCi1JbmNoZXMKLTEyMDAgMgotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDE0MjUgMTUwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDI2MjUgMTUwMCAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI5MjUgOTAwIDM4MjUgOTAwIDM4MjUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjMyNSAyNjI1IDIzMjUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIzMjUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyODUwIDIxMDAgNDEyNSAyMTAwIDQxMjUgMjYyNSAyODUwIDI2MjUgMjg1MCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzc1IDE0MjUgMzM3NSAyMTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDUxMDAgOTAwIDYzMDAgOTAwIDYzMDAgMTM1MCA1MTAwIDEzNTAgNTEwMCA5MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgMTM1MCA1NjI1IDIxMDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNjM3NSAyNjI1IDYzNzUgMjEwMCA1MTAwIDIxMDAgNTEwMCAyNjI1IDYzNzUgMjYyNQotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNTYyNSAyNjI1IDU2MjUgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1MTAwIDMzMDAgNjIyNSAzMzAwIDYyMjUgMzc1MCA1MTAwIDM3NTAgNTEwMCAzMzAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyODUwIDI0MDAgMjMyNSAyNDAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MTI1IDI0MDAgNTEwMCAyNDAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgMzMwMCAxOTUwIDMzMDAgMTk1MCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjQ1IDEyMDAgMTIwMCBjb25maWcuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDEyMDAgY29uZmlndXJlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgMzAwMCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCAxMjAwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjAwIDEyMDAgMzYwMCBjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDUyNTAgMTIwMCBNYWtlZmlsZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDUyNTAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NzUgNTI1MCAzNjAwIE1ha2VmaWxlXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmppbiBiL2V0Yy9jb25maWdidWlsZC5qaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Y2Q5MzkuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmppbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC50aW4gYi9ldGMvY29uZmlnYnVpbGQudGluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkNmZlLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC50aW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAgIGNvbmZpZy5pbiAgICAgICAgKmNvbmZpZ3VyZSogICAgICBNYWtlZmlsZS5pbgotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAqY29uZmlnLnN0YXR1cyo8PT09PT09Kz09PT09PT09PT0+KmNvbmZpZy5zdGF0dXMqCi0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICAgY29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmVpbiBiL2V0Yy9jb25maWdkZXYuZWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgzNzg1Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZWluCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLSUhUFMtQWRvYmUtMi4wIEVQU0YtMi4wCi0lJVRpdGxlOiBjb25maWdkZXYuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogTW9uIEp1biAxNSAxNzozNToxOSAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzQ0IDMxNwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMzcwLjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzOTc1IDkwMCBsICAzOTc1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTU1MCA5MDAgbSA2NzUwIDkwMCBsICA2NzUwIDEzNTAgbCAgNTU1MCAxMzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzc1MCAxODAwIG0gNTAyNSAxODAwIGwgIDUwMjUgMjI1MCBsICAzNzUwIDIyNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTU1IDIxMDAgbSAxMDUwIDIxMDAgMTA1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAxMDUwIDI2MjUgMjA3MCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDI2MjUgMjE3NSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDIxMDAgMTE1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU1NTAgMzMwMCBtIDY2NzUgMzMwMCBsICA2Njc1IDM3NTAgbCAgNTU1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTY1NSAyMTAwIG0gNTU1MCAyMTAwIDU1NTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNTU1MCAyNjI1IDY0OTUgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyNjI1IDY2MDAgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyMTAwIDU2NTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzNzUwIDM2MDAgbSA0ODc1IDM2MDAgbCAgNDg3NSA0MDUwIGwgIDM3NTAgNDA1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM4NTUgMjcwMCBtIDM3NTAgMjcwMCAzNzUwIDMwNDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgMzE1MCA0NTQ1IDMxNTAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMzE1MCA0NjUwIDI4MDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMjcwMCAzODU1IDI3MDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjg1MCA1NzAwIG0gMzc1MCA1NzAwIGwgIDM3NTAgNjE1MCBsICAyODUwIDYxNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzMDMwIDQ4MDAgbSAyOTI1IDQ4MDAgMjkyNSA1MTQ1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyOTI1IDUyNTAgMzY0NSA1MjUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDUyNTAgMzc1MCA0OTA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDQ4MDAgMzAzMCA0ODAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDE1MDAgMTQyNSBtIDE1MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDE5ODAuMDAgbSAxNTAwLjAwIDIxMDAuMDAgbCAxNDcwLjAwIDE5ODAuMDAgbCAgMTUwMC41MCAxOTgwLjUwIGwgMTUzMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTQyNSBtIDMzMDAgNDgwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzMzMwLjAwIDQ2ODAuMDAgbSAzMzAwLjAwIDQ4MDAuMDAgbCAzMjcwLjAwIDQ2ODAuMDAgbCAgMzMwMC41MCA0NjgwLjUwIGwgMzMzMC4wMCA0NjgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTU3NSBtIDE4NzUgMTU3NSBsICAxODc1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTkwNS4wMCAxOTgwLjAwIG0gMTg3NS4wMCAyMTAwLjAwIGwgMTg0NS4wMCAxOTgwLjAwIGwgIDE4NzUuNTAgMTk4MC41MCBsIDE5MDUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE1NzUgbSA1NzAwIDE1NzUgbCAgNTcwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU3MzAuMDAgMTk4MC4wMCBtIDU3MDAuMDAgMjEwMC4wMCBsIDU2NzAuMDAgMTk4MC4wMCBsICA1NzAwLjUwIDE5ODAuNTAgbCA1NzMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjIyNSAxMzUwIG0gNjIyNSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYyNTUuMDAgMTk4MC4wMCBtIDYyMjUuMDAgMjEwMC4wMCBsIDYxOTUuMDAgMTk4MC4wMCBsICA2MjI1LjUwIDE5ODAuNTAgbCA2MjU1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjA3NSAyNjI1IG0gNjA3NSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYxMDUuMDAgMzE4MC4wMCBtIDYwNzUuMDAgMzMwMC4wMCBsIDYwNDUuMDAgMzE4MC4wMCBsICA2MDc1LjUwIDMxODAuNTAgbCA2MTA1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAyMjUwIG0gNDIwMCAyNzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMjU4MC4wMCBtIDQyMDAuMDAgMjcwMC4wMCBsIDQxNzAuMDAgMjU4MC4wMCBsICA0MjAwLjUwIDI1ODAuNTAgbCA0MjMwLjAwIDI1ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAzMTUwIG0gNDIwMCAzNjAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMzQ4MC4wMCBtIDQyMDAuMDAgMzYwMC4wMCBsIDQxNzAuMDAgMzQ4MC4wMCBsICA0MjAwLjUwIDM0ODAuNTAgbCA0MjMwLjAwIDM0ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCA0MDUwIG0gNDIwMCA0NTAwIGwgIDM2NzUgNDUwMCBsICAzNjc1IDQ4MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzcwNS4wMCA0NjgwLjAwIG0gMzY3NS4wMCA0ODAwLjAwIGwgMzY0NS4wMCA0NjgwLjAwIGwgIDM2NzUuNTAgNDY4MC41MCBsIDM3MDUuMDAgNDY4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzc1IDUyNTAgbSAzMzc1IDU3MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzQwNS4wMCA1NTgwLjAwIG0gMzM3NS4wMCA1NzAwLjAwIGwgMzM0NS4wMCA1NTgwLjAwIGwgIDMzNzUuNTAgNTU4MC41MCBsIDM0MDUuMDAgNTU4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDI5MjUgbSAzNzUwIDI5MjUgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzYzMC4wMCAyODk1LjAwIG0gMzc1MC4wMCAyOTI1LjAwIGwgMzYzMC4wMCAyOTU1LjAwIGwgIDM2MzAuNTAgMjkyNS41MCBsIDM2MzAuMDAgMjg5NS4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxNTAwIDI2MjUgbSAxNTAwIDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAzMTgwLjAwIG0gMTUwMC4wMCAzMzAwLjAwIGwgMTQ3MC4wMCAzMTgwLjAwIGwgIDE1MDAuNTAgMzE4MC41MCBsIDE1MzAuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAyMTAwIDMzMDAgbCAgMjEwMCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDQ4NzUgMzgyNSBtIDUyNTAgMzgyNSBsICA1MjUwIDI0MDAgbCAgNTU1MCAyNDAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU0MzAuMDAgMjM3MC4wMCBtIDU1NTAuMDAgMjQwMC4wMCBsIDU0MzAuMDAgMjQzMC4wMCBsICA1NDMwLjUwIDI0MDAuNTAgbCA1NDMwLjAwIDIzNzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChhY2NvbmZpZy5oKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuYW0pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMjEwMCBtCi1ncyAxIC0xIHNjIChhY2luY2x1ZGUubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvaGVhZGVyKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTU3MDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvbWFrZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzkwMCAzOTAwIG0KLWdzIDEgLTEgc2MgKGFjbG9jYWwubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMzAwMCBtCi1ncyAxIC0xIHNjIChhY2xvY2FsKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDYwMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDUxMDAgbQotZ3MgMSAtMSBzYyAoYXV0b2NvbmYpIGNvbC0xIHNob3cgZ3IKLSRGMnBzRW5kCi1yZXN0b3JlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmZpZyBiL2V0Yy9jb25maWdkZXYuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM4NmVjLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZmlnCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI0ZJRyAzLjEKLVBvcnRyYWl0Ci1DZW50ZXIKLUluY2hlcwotMTIwMCAyCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgOTAwIDIxMDAgOTAwIDIxMDAgMTQyNSAxMDUwIDE0MjUgMTA1MCA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjkyNSA5MDAgMzk3NSA5MDAgMzk3NSAxNDI1IDI5MjUgMTQyNSAyOTI1IDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDkwMCA2NzUwIDkwMCA2NzUwIDEzNTAgNTU1MCAxMzUwIDU1NTAgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDM3NTAgMTgwMCA1MDI1IDE4MDAgNTAyNSAyMjUwIDM3NTAgMjI1MCAzNzUwIDE4MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjE3NSAyNjI1IDIxNzUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIxNzUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDMzMDAgNjY3NSAzMzAwIDY2NzUgMzc1MCA1NTUwIDM3NTAgNTU1MCAzMzAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDY2MDAgMjYyNSA2NjAwIDIxMDAgNTU1MCAyMTAwIDU1NTAgMjYyNSA2NjAwIDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMzc1MCAzNjAwIDQ4NzUgMzYwMCA0ODc1IDQwNTAgMzc1MCA0MDUwIDM3NTAgMzYwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA0NjUwIDMxNTAgNDY1MCAyNzAwIDM3NTAgMjcwMCAzNzUwIDMxNTAgNDY1MCAzMTUwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI4NTAgNTcwMCAzNzUwIDU3MDAgMzc1MCA2MTUwIDI4NTAgNjE1MCAyODUwIDU3MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMzc1MCA1MjUwIDM3NTAgNDgwMCAyOTI1IDQ4MDAgMjkyNSA1MjUwIDM3NTAgNTI1MAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAxNDI1IDE1MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNDI1IDMzMDAgNDgwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDMKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNTc1IDE4NzUgMTU3NSAxODc1IDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTU3NSA1NzAwIDE1NzUgNTcwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MjI1IDEzNTAgNjIyNSAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MDc1IDI2MjUgNjA3NSAzMzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDIyNTAgNDIwMCAyNzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDMxNTAgNDIwMCAzNjAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDQwNTAgNDIwMCA0NTAwIDM2NzUgNDUwMCAzNjc1IDQ4MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzNzUgNTI1MCAzMzc1IDU3MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMjkyNSAzNzUwIDI5MjUKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMjYyNSAxNTAwIDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCAzMzAwIDIxMDAgMzMwMCAyMTAwIDM3NTAgMTA1MCAzNzUwIDEwNTAgMzMwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDg3NSAzODI1IDUyNTAgMzgyNSA1MjUwIDI0MDAgNTU1MCAyNDAwCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDc4MCAxMjAwIDEyMDAgYWNjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgODg1IDMwMDAgMTIwMCBjb25maWd1cmUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk0NSA1NzAwIDEyMDAgTWFrZWZpbGUuYW1cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk5MCAzOTAwIDIxMDAgYWNpbmNsdWRlLm00XDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NDAgMTIwMCAyNDAwIGF1dG9oZWFkZXJcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDY0NSAxMjAwIDM2MDAgY29uZmlnLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NTUgNTcwMCAzNjAwIE1ha2VmaWxlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA3MzUgNTcwMCAyNDAwIGF1dG9tYWtlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4MTAgMzkwMCAzOTAwIGFjbG9jYWwubTRcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDU0MCAzOTAwIDMwMDAgYWNsb2NhbFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzA1IDMwMDAgNjAwMCBjb25maWd1cmVcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDY2MCAzMDAwIDUxMDAgYXV0b2NvbmZcMDAxCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmppbiBiL2V0Yy9jb25maWdkZXYuamluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjExYTcxLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuamluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi50aW4gYi9ldGMvY29uZmlnZGV2LnRpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliNmYzNC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LnRpbgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSAgIGFjY29uZmlnLmggICAgICAgY29uZmlndXJlLmluICAgICAgICAgICAgICAgICBNYWtlZmlsZS5hbQotICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICB8ICAtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8Ci0gICAgICAgfCAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotICAgICAgIHYgIHYgICAgICAgICAgICAgfCAgICBhY2luY2x1ZGUubTQgICAgIHwgICAgIHwKLSAgICphdXRvaGVhZGVyKiAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIC0tLT4qYXV0b21ha2UqIAotICAgICAgIHYgICAgICAgICAgICAgICAgfC0tLT4qYWNsb2NhbCogICB8ICAgICAgIHwgICAgICAKLSAgIGNvbmZpZy5pbiAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICAgICB2ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIHwgICBNYWtlZmlsZS5pbgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBhY2xvY2FsLm00LS0tCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgICAgICAgICAgICAgICAgICphdXRvY29uZioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlIGIvZXRjL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAxZmNlZi4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1NTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgotIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KLSMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KLWNhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKLXMlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCi1zJVxbJVxcJiVnCi1zJVxdJVxcJiVnCi1zJVwkJSQkJWcKLUVPRgotREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCi1ybSAtZiBjb25mdGVzdC5kZWZzCi0KLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUuaW4gYi9ldGMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg1MDY4Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuNSkKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLUFDX1BST0dfSU5TVEFMTAotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLnRleGkgYi9ldGMvY29uZmlndXJlLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDAxNjcuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjY0NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgY29uZmlndXJlLmluZm8KLUBzZXR0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBkaXJjYXRlZ29yeSBHTlUgYWRtaW4KLUBkaXJlbnRyeQotKiBjb25maWd1cmU6IChjb25maWd1cmUpLglUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AZW5kIGRpcmVudHJ5Ci0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTk4IEN5Z251cyBTb2x1dGlvbnMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLQotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AYXV0aG9yIElhbiBMYW5jZSBUYXlsb3IKLQotQHBhZ2UKLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OCBDeWdudXMgU29sdXRpb25zCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uCi1hcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OgkJSW50cm9kdWN0aW9uLgotKiBHZXR0aW5nIFN0YXJ0ZWQ6OgkJR2V0dGluZyBTdGFydGVkLgotKiBGaWxlczo6CQkJRmlsZXMuCi0qIENvbmZpZ3VyYXRpb24gTmFtZXM6OgkJQ29uZmlndXJhdGlvbiBOYW1lcy4KLSogQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHM6OglDcm9zcyBDb21waWxhdGlvbiBUb29scy4KLSogQ2FuYWRpYW4gQ3Jvc3M6OgkJQ2FuYWRpYW4gQ3Jvc3MuCi0qIEN5Z251cyBDb25maWd1cmU6OgkJQ3lnbnVzIENvbmZpZ3VyZS4KLSogTXVsdGlsaWJzOjoJCQlNdWx0aWxpYnMuCi0qIEZBUTo6CQkJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zLgotKiBJbmRleDo6CQkJSW5kZXguCi1AZW5kIG1lbnUKLQotQGVuZCBpZmluZm8KLQotQG5vZGUgSW50cm9kdWN0aW9uCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbXMuICBJdAotZGVzY3JpYmVzIGhvdyBhdXRvY29uZiwgYXV0b21ha2UsIGxpYnRvb2wsIGFuZCBtYWtlIGZpdCB0b2dldGhlci4gIEl0Ci1hbHNvIGluY2x1ZGVzIGEgZGlzY3Vzc2lvbiBvZiB0aGUgb2xkZXIgQ3lnbnVzIGNvbmZpZ3VyZSBzeXN0ZW0uCi0KLVRoaXMgZG9jdW1lbnQgZG9lcyBub3QgZGVzY3JpYmUgaW4gZGV0YWlsIGhvdyB0byB1c2UgZWFjaCBvZiB0aGUgdG9vbHM7Ci1zZWUgdGhlIHJlc3BlY3RpdmUgbWFudWFscyBmb3IgdGhhdC4gIEluc3RlYWQsIGl0IGRlc2NyaWJlcyB3aGljaCBmaWxlcwotdGhlIGRldmVsb3BlciBtdXN0IHdyaXRlLCB3aGljaCBmaWxlcyBhcmUgbWFjaGluZSBnZW5lcmF0ZWQgYW5kIGhvdyB0aGV5Ci1hcmUgZ2VuZXJhdGVkLCBhbmQgd2hlcmUgY2VydGFpbiBjb21tb24gcHJvYmxlbXMgc2hvdWxkIGJlIGFkZHJlc3NlZC4KLQotQGlmbm90aHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZyB0aGUgYXV0b2NvbmYgbWFudWFsIGJ5Ci1EYXZpZCBNYWNLZW56aWUgKEBweHJlZntUb3AsICwgYXV0b2NvbmYgb3ZlcnZpZXcsIGF1dG9jb25mLCBBdXRvY29uZn0pLAotdGhlIGF1dG9tYWtlIG1hbnVhbCBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXkgKEBweHJlZntUb3AsICwKLWF1dG9tYWtlIG92ZXJ2aWV3LCBhdXRvbWFrZSwgR05VIEF1dG9tYWtlfSksIHRoZSBsaWJ0b29sIG1hbnVhbCBieQotR29yZG9uIE1hdHppZ2tlaXQgKEBweHJlZntUb3AsICwgbGlidG9vbCBvdmVydmlldywgbGlidG9vbCwgR05VCi1saWJ0b29sfSksIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkgSy4gUmljaGFyZCBQaXhsZXkuCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZwotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl90b2MuaHRtbCwgdGhlCi1hdXRvY29uZiBtYW51YWx9IGJ5IERhdmlkIE1hY0tlbnppZSwKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b21ha2UvYXV0b21ha2VfdG9jLmh0bWwsIHRoZQotYXV0b21ha2UgbWFudWFsfSBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXksCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2xpYnRvb2wvbGlidG9vbF90b2MuaHRtbCwgdGhlCi1saWJ0b29sIG1hbnVhbH0gYnkgR29yZG9uIE1hdHppZ2tlaXQsIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkKLUsuIFJpY2hhcmQgUGl4bGV5LgotQGVuZCBpZmh0bWwKLQotQG1lbnUKLSogR29hbHM6OgkJCUdvYWxzLgotKiBUb29sczo6CQkJVGhlIHRvb2xzLgotKiBIaXN0b3J5OjoJCQlIaXN0b3J5LgotKiBCdWlsZGluZzo6CQkJQnVpbGRpbmcuCi1AZW5kIG1lbnUKLQotQG5vZGUgR29hbHMKLUBzZWN0aW9uIEdvYWxzCi1AY2luZGV4IGdvYWxzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gaGFzIHR3byBtYWluIGdvYWxzLgotCi1UaGUgZmlyc3QgaXMgdG8gc2ltcGxpZnkgdGhlIGRldmVsb3BtZW50IG9mIHBvcnRhYmxlIHByb2dyYW1zLiAgVGhlCi1zeXN0ZW0gcGVybWl0cyB0aGUgZGV2ZWxvcGVyIHRvIGNvbmNlbnRyYXRlIG9uIHdyaXRpbmcgdGhlIHByb2dyYW0sCi1zaW1wbGlmeWluZyBtYW55IGRldGFpbHMgb2YgcG9ydGFiaWxpdHkgYWNyb3NzIFVuaXggYW5kIGV2ZW4gV2luZG93cwotc3lzdGVtcywgYW5kIHBlcm1pdHRpbmcgdGhlIGRldmVsb3BlciB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQgdGhlCi1wcm9ncmFtIHVzaW5nIHNpbXBsZSBydWxlcyByYXRoZXIgdGhhbiBjb21wbGV4IE1ha2VmaWxlcy4KLQotVGhlIHNlY29uZCBpcyB0byBzaW1wbGlmeSB0aGUgYnVpbGRpbmcgb2YgcHJvZ3JhbXMgZGlzdHJpYnV0ZWQgYXMgc291cmNlCi1jb2RlLiAgQWxsIHByb2dyYW1zIGFyZSBidWlsdCB1c2luZyBhIHNpbXBsZSwgc3RhbmRhcmRpemVkLCB0d28gc3RlcAotcHJvY2Vzcy4gIFRoZSBwcm9ncmFtIGJ1aWxkZXIgbmVlZCBub3QgaW5zdGFsbCBhbnkgc3BlY2lhbCB0b29scyBpbgotb3JkZXIgdG8gYnVpbGQgdGhlIHByb2dyYW0uCi0KLUBub2RlIFRvb2xzCi1Ac2VjdGlvbiBUb29scwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGlzIGNvbXByaXNlZCBvZiBzZXZlcmFsIGRpZmZlcmVudAotdG9vbHMuICBQcm9ncmFtIGRldmVsb3BlcnMgbXVzdCBidWlsZCBhbmQgaW5zdGFsbCBhbGwgb2YgdGhlc2UgdG9vbHMuCi0KLVBlb3BsZSB3aG8ganVzdCB3YW50IHRvIGJ1aWxkIHByb2dyYW1zIGZyb20gZGlzdHJpYnV0ZWQgc291cmNlcyBub3JtYWxseQotZG8gbm90IG5lZWQgYW55IHNwZWNpYWwgdG9vbHMgYmV5b25kIGEgVW5peCBzaGVsbCwgYSBtYWtlIHByb2dyYW0sIGFuZCBhCi1DIGNvbXBpbGVyLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGF1dG9jb25mCi1wcm92aWRlcyBhIGdlbmVyYWwgcG9ydGFiaWxpdHkgZnJhbWV3b3JrLCBiYXNlZCBvbiB0ZXN0aW5nIHRoZSBmZWF0dXJlcwotb2YgdGhlIGhvc3Qgc3lzdGVtIGF0IGJ1aWxkIHRpbWUuCi1AaXRlbSBhdXRvbWFrZQotYSBzeXN0ZW0gZm9yIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIGEgcHJvZ3JhbSwgcGVybWl0dGluZyB0aGUgZGV2ZWxvcGVyCi10byB3cml0ZSBhIHNpbXBsaWZpZWQgQGZpbGV7TWFrZWZpbGV9LgotQGl0ZW0gbGlidG9vbAotYSBzdGFuZGFyZGl6ZWQgYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLUBpdGVtIGdldHRleHQKLXByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB0cmFuc2xhdGlvbiBvZiB0ZXh0IG1lc3NhZ2VzIGludG8gb3RoZXIKLWxhbmd1YWdlczsgbm90IHJlYWxseSBkaXNjdXNzZWQgaW4gdGhpcyBkb2N1bWVudC4KLUBpdGVtIG00Ci1hdXRvY29uZiByZXF1aXJlcyB0aGUgR05VIHZlcnNpb24gb2YgbTQ7IHRoZSBzdGFuZGFyZCBVbml4IG00IGRvZXMgbm90Ci1zdWZmaWNlLgotQGl0ZW0gcGVybAotYXV0b21ha2UgcmVxdWlyZXMgcGVybC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSGlzdG9yeQotQHNlY3Rpb24gSGlzdG9yeQotQGNpbmRleCBoaXN0b3J5Ci0KLVRoaXMgaXMgYSB2ZXJ5IGJyaWVmIGFuZCBwcm9iYWJseSBpbmFjY3VyYXRlIGhpc3RvcnkuCi0KLUFzIHRoZSBudW1iZXIgb2YgVW5peCB2YXJpYW50cyBpbmNyZWFzZWQgZHVyaW5nIHRoZSAxOTgwcywgaXQgYmVjYW1lCi1oYXJkZXIgdG8gd3JpdGUgcHJvZ3JhbXMgd2hpY2ggY291bGQgcnVuIG9uIGFsbCB2YXJpYW50cy4gIFdoaWxlIGl0IHdhcwotb2Z0ZW4gcG9zc2libGUgdG8gdXNlIEBjb2RleyNpZmRlZn0gdG8gaWRlbnRpZnkgcGFydGljdWxhciBzeXN0ZW1zLAotZGV2ZWxvcGVycyBmcmVxdWVudGx5IGRpZCBub3QgaGF2ZSBhY2Nlc3MgdG8gZXZlcnkgc3lzdGVtLCBhbmQgdGhlCi1jaGFyYWN0ZXJpc3RpY3Mgb2Ygc29tZSBzeXN0ZW1zIGNoYW5nZWQgZnJvbSB2ZXJzaW9uIHRvIHZlcnNpb24uCi0KLUJ5IDE5OTIsIGF0IGxlYXN0IHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIGhhZCBiZWVuIGRldmVsb3BlZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgTWV0YWNvbmZpZyBwcm9ncmFtLCBieSBMYXJyeSBXYWxsLCBIYXJsYW4gU3Rlbm4sIGFuZCBSYXBoYWVsCi1NYW5mcmVkaS4KLUBpdGVtCi1UaGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQsIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LCBhbmQgdGhlIGdjYyBjb25maWd1cmUKLXNjcmlwdCwgYnkgUmljaGFyZCBTdGFsbG1hbi4gIFRoZXNlIHVzZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcHByb2FjaCwKLWFuZCB0aGUgZGV2ZWxvcGVycyBjb21tdW5pY2F0ZWQgcmVndWxhcmx5LgotQGl0ZW0KLVRoZSBhdXRvY29uZiBwcm9ncmFtLCBieSBEYXZpZCBNYWNLZW56aWUuCi1AZW5kIGl0ZW1pemUKLQotVGhlIE1ldGFjb25maWcgcHJvZ3JhbSBpcyBzdGlsbCB1c2VkIGZvciBQZXJsIGFuZCBhIGZldyBvdGhlciBwcm9ncmFtcy4KLUl0IGlzIHBhcnQgb2YgdGhlIERpc3QgcGFja2FnZS4gIEkgZG8gbm90IGtub3cgaWYgaXQgaXMgYmVpbmcgZGV2ZWxvcGVkLgotCi1JbiAxOTk0LCBEYXZpZCBNYWNLZW56aWUgYW5kIG90aGVycyBtb2RpZmllZCBhdXRvY29uZiB0byBpbmNvcnBvcmF0ZSBhbGwKLXRoZSBmZWF0dXJlcyBvZiBDeWdudXMgY29uZmlndXJlLiAgU2luY2UgdGhlbiwgdGhlcmUgaGFzIGJlZW4gYSBzbG93IGJ1dAotc3RlYWR5IGNvbnZlcnNpb24gb2YgR05VIHByb2dyYW1zIGZyb20gQ3lnbnVzIGNvbmZpZ3VyZSB0byBhdXRvY29uZi4gZ2NjCi1oYXMgYmVlbiBjb252ZXJ0ZWQsIGVsaW1pbmF0aW5nIHRoZSBnY2MgY29uZmlndXJlIHNjcmlwdC4KLQotR05VIGF1dG9jb25mIHdhcyByZWd1bGFybHkgbWFpbnRhaW5lZCB1bnRpbCBsYXRlIDE5OTYuICBBcyBvZiB0aGlzCi13cml0aW5nIGluIEp1bmUsIDE5OTgsIGl0IGhhcyBubyBwdWJsaWMgbWFpbnRhaW5lci4KLQotTW9zdCBwcm9ncmFtcyBhcmUgYnVpbHQgdXNpbmcgdGhlIG1ha2UgcHJvZ3JhbSwgd2hpY2ggcmVxdWlyZXMgdGhlCi1kZXZlbG9wZXIgdG8gd3JpdGUgTWFrZWZpbGVzIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIHRoZSBwcm9ncmFtcy4KLVNpbmNlIG1vc3QgcHJvZ3JhbXMgYXJlIGJ1aWx0IGluIHByZXR0eSBtdWNoIHRoZSBzYW1lIHdheSwgdGhpcyBsZWQgdG8gYQotbG90IG9mIGR1cGxpY2F0aW9uLgotCi1UaGUgWCBXaW5kb3cgc3lzdGVtIGlzIGJ1aWx0IHVzaW5nIHRoZSBpbWFrZSB0b29sLCB3aGljaCB1c2VzIGEgZGF0YWJhc2UKLW9mIHJ1bGVzIHRvIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRpb24uICBIb3dldmVyLCBidWlsZGluZyBhIHRvb2wgd2hpY2gKLXdhcyBkZXZlbG9wZWQgdXNpbmcgaW1ha2UgcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBoYXZlIGltYWtlCi1pbnN0YWxsZWQsIHZpb2xhdGluZyBvbmUgb2YgdGhlIGdvYWxzIG9mIHRoZSBHTlUgc3lzdGVtLgotCi1UaGUgbmV3IEJTRCBtYWtlIHByb3ZpZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBvZiBNYWtlZmlsZSBmcmFnbWVudHMsCi13aGljaCBwZXJtaXRzIGRldmVsb3BlcnMgdG8gd3JpdGUgdmVyeSBzaW1wbGUgTWFrZWZpbGVzLiAgSG93ZXZlciwgdGhpcwotcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBpbnN0YWxsIHRoZSBuZXcgQlNEIG1ha2UgcHJvZ3JhbS4KLQotSW4gMTk5NCwgRGF2aWQgTWFjS2VuemllIHdyb3RlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIGF1dG9tYWtlLCB3aGljaAotcGVybWl0dGVkIHdyaXRpbmcgYSBzaW1wbGUgYnVpbGQgZGVzY3JpcHRpb24gd2hpY2ggd2FzIGNvbnZlcnRlZCBpbnRvIGEKLU1ha2VmaWxlIHdoaWNoIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHN0YW5kYXJkIG1ha2UgcHJvZ3JhbS4gIEluIDE5OTUsIFRvbQotVHJvbWV5IGNvbXBsZXRlbHkgcmV3cm90ZSBhdXRvbWFrZSBpbiBQZXJsLCBhbmQgaGUgY29udGludWVzIHRvIGVuaGFuY2UKLWl0LgotCi1WYXJpb3VzIGZyZWUgcGFja2FnZXMgYnVpbHQgbGlicmFyaWVzLCBhbmQgYnkgYXJvdW5kIDE5OTUgc2V2ZXJhbAotaW5jbHVkZWQgc3VwcG9ydCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgotSG93ZXZlciwgdGhlcmUgd2FzIG5vIGNvbnNpc3RlbnQgYXBwcm9hY2guICBJbiBlYXJseSAxOTk2LCBHb3Jkb24KLU1hdHppZ2tlaXQgYmVnYW4gd29ya2luZyBvbiBsaWJ0b29sLCB3aGljaCBwcm92aWRlZCBhIHN0YW5kYXJkaXplZAotYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgd2FzIGludGVncmF0ZWQgaW50bwotYXV0b21ha2UgZnJvbSB0aGUgc3RhcnQuCi0KLVRoZSBkZXZlbG9wbWVudCBvZiBhdXRvbWFrZSBhbmQgbGlidG9vbCB3YXMgZHJpdmVuIGJ5IHRoZSBHTklUUyBwcm9qZWN0LAotYSBncm91cCBvZiBHTlUgbWFpbnRhaW5lcnMgd2hvIGRlc2lnbmVkIHN0YW5kYXJkaXplZCB0b29scyB0byBoZWxwIG1lZXQKLXRoZSBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotQG5vZGUgQnVpbGRpbmcKLUBzZWN0aW9uIEJ1aWxkaW5nCi0KLU1vc3QgcmVhZGVycyBvZiB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHJlYWR5IGtub3cgaG93IHRvIGJ1aWxkIGEgdG9vbCBieQotcnVubmluZyBAc2FtcHtjb25maWd1cmV9IGFuZCBAc2FtcHttYWtlfS4gIFRoaXMgc2VjdGlvbiBtYXkgc2VydmUgYXMgYQotcXVpY2sgaW50cm9kdWN0aW9uIG9yIHJlbWluZGVyLgotCi1CdWlsZGluZyBhIHRvb2wgaXMgbm9ybWFsbHkgYXMgc2ltcGxlIGFzIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfQotZm9sbG93ZWQgYnkgQHNhbXB7bWFrZX0uICBZb3Ugc2hvdWxkIG5vcm1hbGx5IHJ1biBAc2FtcHtjb25maWd1cmV9IGZyb20KLWFuIGVtcHR5IGRpcmVjdG9yeSwgdXNpbmcgc29tZSBwYXRoIHRvIHJlZmVyIHRvIHRoZSBAc2FtcHtjb25maWd1cmV9Ci1zY3JpcHQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBydW4KLUBzYW1we2NvbmZpZ3VyZX0gaXMgY2FsbGVkIHRoZSBAZGZue29iamVjdCBkaXJlY3Rvcnl9LgotCi1JbiBvcmRlciB0byB1c2UgYSBvYmplY3QgZGlyZWN0b3J5IHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UKLWRpcmVjdG9yeSwgeW91IG11c3QgYmUgdXNpbmcgdGhlIEdOVSB2ZXJzaW9uIG9mIEBzYW1we21ha2V9LCB3aGljaCBoYXMKLXRoZSByZXF1aXJlZCBAc2FtcHtWUEFUSH0gc3VwcG9ydC4gIERlc3BpdGUgdGhpcyByZXN0cmljdGlvbiwgdXNpbmcgYQotZGlmZmVyZW50IG9iamVjdCBkaXJlY3RvcnkgaXMgaGlnaGx5IHJlY29tbWVuZGVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUl0IGtlZXBzIHRoZSBmaWxlcyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBidWlsZCBmcm9tIGNsdXR0ZXJpbmcgdXAgeW91cgotc291cmNlcy4KLUBpdGVtIAotSXQgcGVybWl0cyB5b3UgdG8gcmVtb3ZlIHRoZSBidWlsdCBmaWxlcyBieSBzaW1wbHkgcmVtb3ZpbmcgdGhlIGVudGlyZQotYnVpbGQgZGlyZWN0b3J5LgotQGl0ZW0KLUl0IHBlcm1pdHMgeW91IHRvIGJ1aWxkIGZyb20gdGhlIHNhbWUgc291cmNlcyB3aXRoIHNldmVyYWwgc2V0cyBvZgotY29uZmlndXJlIG9wdGlvbnMgc2ltdWx0YW5lb3VzbHkuCi1AZW5kIGl0ZW1pemUKLQotSWYgeW91IGRvbid0IGhhdmUgR05VIEBzYW1we21ha2V9LCB5b3Ugd2lsbCBoYXZlIHRvIHJ1biBAc2FtcHtjb25maWd1cmV9Ci1pbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIEFsbCBHTlUgcGFja2FnZXMgc2hvdWxkIHN1cHBvcnQgdGhpczsgaW4KLXBhcnRpY3VsYXIsIEdOVSBwYWNrYWdlcyBzaG91bGQgbm90IGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgR05VCi1Ac2FtcHttYWtlfS4KLQotQWZ0ZXIgcnVubmluZyBAc2FtcHtjb25maWd1cmV9LCB5b3UgY2FuIGJ1aWxkIHRoZSB0b29scyBieSBydW5uaW5nCi1Ac2FtcHttYWtlfS4KLQotVG8gaW5zdGFsbCB0aGUgdG9vbHMsIHJ1biBAc2FtcHttYWtlIGluc3RhbGx9LiAgSW5zdGFsbGluZyB0aGUgdG9vbHMKLXdpbGwgY29weSB0aGUgcHJvZ3JhbXMgYW5kIGFueSByZXF1aXJlZCBzdXBwb3J0IGZpbGVzIHRvIHRoZQotQGRmbntpbnN0YWxsYXRpb24gZGlyZWN0b3J5fS4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbGF0aW9uCi1kaXJlY3RvcnkgaXMgY29udHJvbGxlZCBieSBAc2FtcHtjb25maWd1cmV9IG9wdGlvbnMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotSW4gdGhlIEN5Z251cyB0cmVlIGF0IHByZXNlbnQsIHRoZSBpbmZvIGZpbGVzIGFyZSBidWlsdCBhbmQgaW5zdGFsbGVkIGFzCi1hIHNlcGFyYXRlIHN0ZXAuICBUbyBidWlsZCB0aGVtLCBydW4gQHNhbXB7bWFrZSBpbmZvfS4gIFRvIGluc3RhbGwgdGhlbSwKLXJ1biBAc2FtcHttYWtlIGluc3RhbGwtaW5mb30uCi0KLUFsbCBAc2FtcHtjb25maWd1cmV9IHNjcmlwdHMgc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBvcHRpb25zLiAgVGhlCi1tb3N0IGludGVyZXN0aW5nIG9uZXMgYXJlIEBzYW1wey0td2l0aH0gYW5kIEBzYW1wey0tZW5hYmxlfSBvcHRpb25zCi13aGljaCBhcmUgZ2VuZXJhbGx5IHNwZWNpZmljIHRvIHBhcnRpY3VsYXIgdG9vbHMuICBZb3UgY2FuIHVzdWFsbHkgdXNlCi10aGUgQHNhbXB7LS1oZWxwfSBvcHRpb24gdG8gZ2V0IGEgbGlzdCBvZiBpbnRlcmVzdGluZyBvcHRpb25zIGZvciBhCi1wYXJ0aWN1bGFyIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVRoZSBvbmx5IGdlbmVyaWMgb3B0aW9ucyB5b3UgYXJlIGxpa2VseSB0byB1c2UgYXJlIHRoZSBAc2FtcHstLXByZWZpeH0KLWFuZCBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zLiAgVGhlc2Ugb3B0aW9ucyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZQotaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgQHNhbXB7LS1wcmVmaXh9IG9wdGlvbiB3aWxsIGhvbGQgbWFjaGluZQotaW5kZXBlbmRlbnQgZmlsZXMgc3VjaCBhcyBpbmZvIGZpbGVzLgotCi1UaGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24sIHdoaWNoIGlzCi1ub3JtYWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgQHNhbXB7LS1wcmVmaXh9IGRpcmVjdG9yeSwgd2lsbCBob2xkCi1tYWNoaW5lIGRlcGVuZGVudCBmaWxlcyBzdWNoIGFzIGV4ZWN1dGFibGVzLgotCi1UaGUgZGVmYXVsdCBmb3IgQHNhbXB7LS1wcmVmaXh9IGlzIEBmaWxley91c3IvbG9jYWx9LiAgVGhlIGRlZmF1bHQgZm9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgQHNhbXB7LS1wcmVmaXh9LgotCi1UaGUgY29udmVudGlvbiB1c2VkIGluIEN5Z251cyByZWxlYXNlcyBpcyB0byB1c2UgYSBAc2FtcHstLXByZWZpeH0KLW9wdGlvbiBvZiBAZmlsZXsvdXNyL2N5Z251cy9AdmFye3JlbGVhc2V9fSwgd2hlcmUgQHZhcntyZWxlYXNlfSBpcyB0aGUKLW5hbWUgb2YgdGhlIHJlbGVhc2UsIGFuZCB0byB1c2UgYSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24gb2YKLUBmaWxley91c3IvY3lnbnVzL0B2YXJ7cmVsZWFzZX0vSC1AdmFye2hvc3R9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUKLWNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgaG9zdCBzeXN0ZW0gKEBweHJlZntDb25maWd1cmF0aW9uIE5hbWVzfSkuCi0KLURvIG5vdCB1c2UgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgdGhlIG9iamVjdCBkaXJlY3RvcnkgYXMgdGhlIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5LiAgVGhhdCB3aWxsIGp1c3QgbGVhZCB0byBjb25mdXNpb24uCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZAotQGNoYXB0ZXIgR2V0dGluZyBTdGFydGVkCi0KLVRvIHN0YXJ0IHVzaW5nIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gd2l0aCB5b3VyIHNvZnR3YXJlCi1wYWNrYWdlLCB5b3UgbXVzdCB3cml0ZSB0aHJlZSBmaWxlcywgYW5kIHlvdSBtdXN0IHJ1biBzb21lIHRvb2xzIHRvCi1tYW51YWxseSBnZW5lcmF0ZSBhZGRpdGlvbmFsIGZpbGVzLgotCi1AbWVudQotKiBXcml0ZSBjb25maWd1cmUuaW46OgkJV3JpdGUgY29uZmlndXJlLmluLgotKiBXcml0ZSBNYWtlZmlsZS5hbTo6CQlXcml0ZSBNYWtlZmlsZS5hbS4KLSogV3JpdGUgYWNjb25maWcuaDo6CQlXcml0ZSBhY2NvbmZpZy5oLgotKiBHZW5lcmF0ZSBmaWxlczo6CQlHZW5lcmF0ZSBmaWxlcy4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGU6OglFeGFtcGxlLgotQGVuZCBtZW51Ci0KLUBub2RlIFdyaXRlIGNvbmZpZ3VyZS5pbgotQHNlY3Rpb24gV3JpdGUgY29uZmlndXJlLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZ3VyZS5pbn0sIHdyaXRpbmcKLQotWW91IG11c3QgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgaXMgYW4gYXV0b2NvbmYKLWlucHV0IGZpbGUsIGFuZCB0aGUgYXV0b2NvbmYgbWFudWFsIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCB0aGlzIGZpbGUKLXNob3VsZCBsb29rIGxpa2UuCi0KLVlvdSB3aWxsIHdyaXRlIHRlc3RzIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHRvIGNoZWNrIGZvcgotY29uZGl0aW9ucyB0aGF0IG1heSBjaGFuZ2UgZnJvbSBvbmUgc3lzdGVtIHRvIGFub3RoZXIsIHN1Y2ggYXMgdGhlCi1wcmVzZW5jZSBvZiBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlcyBvciBmdW5jdGlvbnMuCi0KLUZvciBleGFtcGxlLCBub3QgYWxsIHN5c3RlbXMgc3VwcG9ydCB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbi4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiB3aGVuIGl0IGlzCi1hdmFpbGFibGUsIGFuZCB0byB1c2Ugc29tZSBvdGhlciBmdW5jdGlvbiB3aGVuIGl0IGlzIG5vdCwgeW91IHdvdWxkCi1jaGVjayBmb3IgdGhpcyBieSBwdXR0aW5nIEBzYW1we0FDX0NIRUNLX0ZVTkNTKGdldHRpbWVvZmRheSl9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LgotCi1XaGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1biBhdCBidWlsZCB0aW1lLCB0aGlzIHdpbGwgYXJyYW5nZSB0bwotZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7SEFWRV9HRVRUSU1FT0ZEQVl9IHRvIHRoZSB2YWx1ZSAxIGlmCi10aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGFuZCB0byBub3QgZGVmaW5lIHRoZQotbWFjcm8gYXQgYWxsIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgWW91ciBjb2RlIGNhbiB0aGVuIHVzZQotQHNhbXB7I2lmZGVmfSB0byB0ZXN0IHdoZXRoZXIgaXQgaXMgc2FmZSB0byBjYWxsIEBzYW1we2dldHRpbWVvZmRheX0uCi0KLUlmIHlvdSBoYXZlIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSwgdGhlIEBzYW1we2F1dG9zY2FufSBwcm9ncmFtIG1heQotaGVscCBpZGVudGlmeSBwb3RlbnRpYWwgcG9ydGFiaWxpdHkgcHJvYmxlbXMsIGFuZCBoZW5jZSBjb25maWd1cmUgdGVzdHMKLXRoYXQgeW91IHdpbGwgd2FudCB0byB1c2UuCi1AaWZub3RodG1sCi1AeHJlZntJbnZva2luZyBhdXRvc2NhbiwgLCAsIGF1dG9jb25mLCB0aGUgYXV0b2NvbmYgbWFudWFsfS4KLUBlbmQgaWZub3RodG1sCi1AaWZodG1sCi1TZWUgQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl80Lmh0bWwsIHRoZQotYXV0b3NjYW4gZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1Bbm90aGVyIGhhbmR5IHRvb2wgZm9yIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSBpcyBAc2FtcHtpZm5hbWVzfS4gIFRoaXMKLXdpbGwgc2hvdyB5b3UgYWxsIHRoZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzIHRoYXQgdGhlIGNvZGUgYWxyZWFkeQotdXNlcy4KLUBpZm5vdGh0bWwKLUB4cmVme0ludm9raW5nIGlmbmFtZXMsICwgLCBhdXRvY29uZiwgdGhlIGF1dG9jb25mIG1hbnVhbH0uCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotU2VlIEB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfNS5odG1sLCB0aGUKLWlmbmFtZXMgZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1CZXNpZGVzIHRoZSBwb3J0YWJpbGl0eSB0ZXN0cyB3aGljaCBhcmUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyCi1wYWNrYWdlLCBldmVyeSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZwotbWFjcm9zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIEFDX0lOSVQKLUBjaW5kZXggQHNhbXB7QUNfSU5JVH0KLVRoaXMgbWFjcm8gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX0lOSVQoZm9vLmMpfS4KLQotQGl0ZW0gQUNfUFJFUkVRKEB2YXJ7VkVSU0lPTn0pCi1AY2luZGV4IEBzYW1we0FDX1BSRVJFUX0KLVRoaXMgbWFjcm8gaXMgb3B0aW9uYWwuICBJdCBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZgotQHNhbXB7YXV0b2NvbmZ9IHRoYXQgeW91IGFyZSB1c2luZy4gIFRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20KLXJ1bm5pbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mIEBzYW1we2F1dG9jb25mfSBhbmQgcGVyaGFwcyBnZXR0aW5nIGFuCi1pbnZhbGlkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX1BSRVJFUSgyLjEyKX0uCi0KLUBpdGVtIEFNX0lOSVRfQVVUT01BS0UKLUBjaW5kZXggQHNhbXB7QU1fSU5JVF9BVVRPTUFLRX0KLVRoaXMgbWFjcm8gdGFrZXMgdHdvIGFyZ3VtZW50czogdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGFuZCBhIHZlcnNpb24KLW51bWJlci4gIEZvciBleGFtcGxlLCBAc2FtcHtBTV9JTklUX0FVVE9NQUtFKGZvbywgMS4wKX0uICAoVGhpcyBtYWNybyBpcwotbm90IG5lZWRlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSkuCi0KLUBpdGVtIEFNX0NPTkZJR19IRUFERVIKLUBjaW5kZXggQHNhbXB7QU1fQ09ORklHX0hFQURFUn0KLVRoaXMgbWFjcm8gbmFtZXMgdGhlIGhlYWRlciBmaWxlIHdoaWNoIHdpbGwgaG9sZCB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvCi1kZWZpbml0aW9ucyBhdCBydW4gdGltZS4gIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIEBmaWxle2NvbmZpZy5ofS4gIFlvdXIKLXNvdXJjZXMgd291bGQgdGhlbiB1c2UgQHNhbXB7I2luY2x1ZGUgImNvbmZpZy5oIn0gdG8gaW5jbHVkZSBpdC4KLQotVGhpcyBtYWNybyBtYXkgb3B0aW9uYWxseSBuYW1lIHRoZSBpbnB1dCBmaWxlIGZvciB0aGF0IGhlYWRlciBmaWxlOyBieQotZGVmYXVsdCwgdGhpcyBpcyBAZmlsZXtjb25maWcuaC5pbn0sIGJ1dCB0aGF0IGZpbGUgbmFtZSB3b3JrcyBwb29ybHkgb24KLURPUyBmaWxlc3lzdGVtcy4gIFRoZXJlZm9yZSwgaXQgaXMgb2Z0ZW4gYmV0dGVyIHRvIG5hbWUgaXQgZXhwbGljaXRseSBhcwotQGZpbGV7Y29uZmlnLmlufS4KLQotVGhpcyBpcyB3aGF0IHlvdSBzaG91bGQgbm9ybWFsbHkgcHV0IGluIEBmaWxle2NvbmZpZ3VyZS5pbn06Ci1AZXhhbXBsZQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBAc2FtcHtBQ19DT05GSUdfSEVBREVSfQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB1c2UgQHNhbXB7QUNfQ09ORklHX0hFQURFUn0gcmF0aGVyIHRoYW4KLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9KS4KLQotQGl0ZW0gQU1fTUFJTlRBSU5FUl9NT0RFCi1AY2luZGV4IEBzYW1we0FNX01BSU5UQUlORVJfTU9ERX0KLVRoaXMgbWFjcm8gYWx3YXlzIGFwcGVhcnMgaW4gQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHRzLiAgT3RoZXIgcHJvZ3JhbXMKLW1heSBvciBtYXkgbm90IHVzZSBpdC4KLQotSWYgdGhpcyBtYWNybyBpcyB1c2VkLCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24gaXMKLXJlcXVpcmVkIHRvIGVuYWJsZSBhdXRvbWF0aWMgcmVidWlsZGluZyBvZiBnZW5lcmF0ZWQgZmlsZXMgdXNlZCBieSB0aGUKLWNvbmZpZ3VyZSBzeXN0ZW0uICBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyB0aGF0IGRldmVsb3BlcnMgYmUgYXdhcmUgb2YsCi1hbmQgdXNlLCB0aGF0IG9wdGlvbi4KLQotSWYgdGhpcyBtYWNybyBpcyBub3QgdXNlZCwgdGhlbiB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYWx3YXlzIGJlCi1yZWJ1aWx0IGF1dG9tYXRpY2FsbHkuICBUaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHdyb25nIHZlcnNpb25zCi1vZiBhdXRvY29uZiwgYXV0b21ha2UsIG9yIG90aGVycyBhcmUgaW4gdGhlIGJ1aWxkZXIncyBAc2FtcHtQQVRIfS4KLQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgbWFjcm8pLgotCi1AaXRlbSBBQ19FWEVFWFQKLUBjaW5kZXggQHNhbXB7QUNfRVhFRVhUfQotQGNpbmRleCBAc2FtcHtBTV9FWEVFWFR9Ci1FaXRoZXIgdGhpcyBtYWNybyBvciBAc2FtcHtBTV9FWEVFWFR9IGFsd2F5cyBhcHBlYXJzIGluIEN5Z251cyBjb25maWd1cmUKLWZpbGVzLiAgT3RoZXIgcHJvZ3JhbXMgbWF5IG9yIG1heSBub3QgdXNlIG9uZSBvZiB0aGVtLgotCi1UaGlzIG1hY3JvIGxvb2tzIGZvciB0aGUgZXhlY3V0YWJsZSBzdWZmaXggdXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0uICBPbgotVW5peCBzeXN0ZW1zLCB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuICBPbiBXaW5kb3dzIHN5c3RlbXMsIHRoaXMgaXMKLUBzYW1wey5leGV9LiAgVGhpcyBtYWNybyBkaXJlY3RzIGF1dG9tYWtlIHRvIHVzZSB0aGUgZXhlY3V0YWJsZSBzdWZmaXgKLWFzIGFwcHJvcHJpYXRlIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbXMuICBUaGlzIG1hY3JvIGRvZXMgbm90IHRha2UgYW55Ci1hcmd1bWVudHMuCi0KLVRoZSBAc2FtcHtBQ19FWEVFWFR9IGZvcm0gaXMgbmV3LCBhbmQgaXMgcGFydCBvZiBhIEN5Z251cyBwYXRjaCB0bwotYXV0b2NvbmYgdG8gc3VwcG9ydCBjb21waWxpbmcgd2l0aCBWaXN1YWwgQysrLiAgT2xkZXIgcHJvZ3JhbXMgdXNlCi1Ac2FtcHtBTV9FWEVFWFR9IGluc3RlYWQuCi0KLShQcm9ncmFtcyB3aGljaCBkbyBub3QgdXNlIGF1dG9tYWtlIHVzZSBuZWl0aGVyIEBzYW1we0FDX0VYRUVYVH0gbm9yCi1Ac2FtcHtBTV9FWEVFWFR9KS4KLQotQGl0ZW0gQUNfUFJPR19DQwotQGNpbmRleCBAc2FtcHtBQ19QUk9HX0NDfQotSWYgeW91IGFyZSB3cml0aW5nIEMgY29kZSwgeW91IHdpbGwgbm9ybWFsbHkgd2FudCB0byB1c2UgdGhpcyBtYWNyby4gIEl0Ci1sb2NhdGVzIHRoZSBDIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4KLQotSG93ZXZlciwgaWYgdGhpcyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaXMgZm9yIGEgbGlicmFyeSB3aGljaCBpcyB0bwotYmUgY29tcGlsZWQgYnkgYSBjcm9zcyBjb21waWxlciB3aGljaCBtYXkgbm90IGZ1bGx5IHdvcmssIHRoZW4geW91IHdpbGwKLW5vdCB3YW50IHRvIHVzZSBAc2FtcHtBQ19QUk9HX0NDfS4gIEluc3RlYWQsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGEKLXZhcmlhbnQgd2hpY2ggZG9lcyBub3QgY2FsbCB0aGUgbWFjcm8gQHNhbXB7QUNfUFJPR19DQ19XT1JLU30uICBFeGFtcGxlcwotY2FuIGJlIGZvdW5kIGluIHZhcmlvdXMgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlcyBmb3IgbGlicmFyaWVzIHRoYXQgYXJlCi1jb21waWxlZCB3aXRoIGNyb3NzIGNvbXBpbGVycywgc3VjaCBhcyBsaWJpYmVydHkgb3IgbGliZ2xvc3MuICBUaGlzIGlzCi1lc3NlbnRpYWxseSBhIGJ1ZyBpbiBhdXRvY29uZiwgYW5kIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgYSBiZXR0ZXIKLXdvcmthcm91bmQgYXQgc29tZSBwb2ludC4KLQotQGl0ZW0gQUNfUFJPR19DWFgKLUBjaW5kZXggQHNhbXB7QUNfUFJPR19DWFh9Ci1JZiB5b3UgYXJlIHdyaXRpbmcgQysrIGNvZGUsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8uICBJdAotbG9jYXRlcyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4gIFRoZQotc2FtZSBjcm9zcyBjb21waWxlciBjb21tZW50cyBhcHBseSBhcyBmb3IgQHNhbXB7QUNfUFJPR19DQ30uCi0KLUBpdGVtIEFNX1BST0dfTElCVE9PTAotQGNpbmRleCBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9Ci1JZiB5b3Ugd2FudCB0byBidWlsZCBsaWJyYXJpZXMsIGFuZCB5b3Ugd2FudCB0byBwZXJtaXQgdGhlbSB0byBiZQotc2hhcmVkLCBvciB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QgbGlicmFyaWVzIHdoaWNoIHdlcmUgYnVpbHQgdXNpbmcKLWxpYnRvb2wsIHRoZW4geW91IHdpbGwgbmVlZCB0aGlzIG1hY3JvLiAgVGhpcyBtYWNybyBpcyByZXF1aXJlZCBpbiBvcmRlcgotdG8gdXNlIGxpYnRvb2wuCi0KLUBjaW5kZXggQHNhbXB7QU1fRElTQUJMRV9TSEFSRUR9Ci1CeSBkZWZhdWx0LCB0aGlzIHdpbGwgY2F1c2UgYWxsIGxpYnJhcmllcyB0byBiZSBidWlsdCBhcyBzaGFyZWQKLWxpYnJhcmllcy4gIFRvIHByZXZlbnQgdGhpcy0tdG8gY2hhbmdlIHRoZSBkZWZhdWx0LS11c2UKLUBzYW1we0FNX0RJU0FCTEVfU0hBUkVEfSBiZWZvcmUgQHNhbXB7QU1fUFJPR19MSUJUT09MfS4gIFRoZSBjb25maWd1cmUKLW9wdGlvbnMgQHNhbXB7LS1lbmFibGUtc2hhcmVkfSBhbmQgQHNhbXB7LS1kaXNhYmxlLXNoYXJlZH0gbWF5IGJlIHVzZWQKLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0IGJ1aWxkIHRpbWUuCi0KLUBpdGVtIEFDX0RFRklORShfR05VX1NPVVJDRSkKLUBjaW5kZXggQHNhbXB7X0dOVV9TT1VSQ0V9Ci1HTlUgcGFja2FnZXMgc2hvdWxkIG5vcm1hbGx5IGluY2x1ZGUgdGhpcyBsaW5lIGJlZm9yZSBhbnkgb3RoZXIgZmVhdHVyZQotdGVzdHMuICBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIEBzYW1we19HTlVfU09VUkNFfSB3aGVuIGNvbXBpbGluZywgd2hpY2gKLWRpcmVjdHMgdGhlIGxpYmMgaGVhZGVyIGZpbGVzIHRvIHByb3ZpZGUgdGhlIHN0YW5kYXJkIEdOVSBzeXN0ZW0KLWludGVyZmFjZXMgaW5jbHVkaW5nIGFsbCBHTlUgZXh0ZW5zaW9ucy4gIElmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsCi1jZXJ0YWluIEdOVSBleHRlbnNpb25zIG1heSBub3QgYmUgYXZhaWxhYmxlLgotCi1AaXRlbSBBQ19PVVRQVVQKLUBjaW5kZXggQHNhbXB7QUNfT1VUUFVUfQotVGhpcyBtYWNybyB0YWtlcyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB3aGljaCB0aGUgY29uZmlndXJlIHByb2Nlc3Mgc2hvdWxkCi1wcm9kdWNlLiAgVGhpcyBpcyBub3JtYWxseSBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgQGZpbGV7TWFrZWZpbGV9IGZpbGVzCi1pbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuICBJZiB5b3VyIHBhY2thZ2UgbGl2ZXMgZW50aXJlbHkgaW4gYSBzaW5nbGUKLWRpcmVjdG9yeSwgeW91IHdvdWxkIHVzZSBzaW1wbHkgQHNhbXB7QUNfT1VUUFVUKE1ha2VmaWxlKX0uICBJZiB5b3UgYWxzbwotaGF2ZSwgZm9yIGV4YW1wbGUsIGEgQGZpbGV7bGlifSBzdWJkaXJlY3RvcnksIHlvdSB3b3VsZCB1c2UKLUBzYW1we0FDX09VVFBVVChNYWtlZmlsZSBsaWIvTWFrZWZpbGUpfS4KLUBlbmQgdGFibGUKLQotSWYgeW91IHdhbnQgdG8gdXNlIGxvY2FsbHkgZGVmaW5lZCBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59Ci1maWxlLCB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgYSBAZmlsZXthY2luY2x1ZGUubTR9IGZpbGUgd2hpY2gKLWRlZmluZXMgdGhlbSAoaWYgbm90IHVzaW5nIGF1dG9tYWtlLCB0aGlzIGZpbGUgaXMgY2FsbGVkCi1AZmlsZXthY2xvY2FsLm00fSkuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHB1dCBzZXBhcmF0ZSBtYWNyb3MgaW4gYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnksIGFuZCBwdXQgQHNhbXB7QUNMT0NBTF9BTUZMQUdTID0gLUkgbTR9IGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmFtfSBmaWxlIHNvIHRoYXQgdGhlIEBzYW1we2FjbG9jYWx9IHByb2dyYW0gd2lsbCBiZSBhYmxlCi10byBmaW5kIHRoZW0uCi0KLVRoZSBkaWZmZXJlbnQgbWFjcm8gcHJlZml4ZXMgaW5kaWNhdGUgd2hpY2ggdG9vbCBkZWZpbmVzIHRoZSBtYWNyby4KLU1hY3JvcyB3aGljaCBzdGFydCB3aXRoIEBzYW1we0FDX30gYXJlIHBhcnQgb2YgYXV0b2NvbmYuICBNYWNyb3Mgd2hpY2gKLXN0YXJ0IHdpdGggQHNhbXB7QU1ffSBhcmUgcHJvdmlkZWQgYnkgYXV0b21ha2Ugb3IgbGlidG9vbC4KLQotQG5vZGUgV3JpdGUgTWFrZWZpbGUuYW0KLUBzZWN0aW9uIFdyaXRlIE1ha2VmaWxlLmFtCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmFtfSwgd3JpdGluZwotCi1Zb3UgbXVzdCB3cml0ZSB0aGUgZmlsZSBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIGlzIGFuIGF1dG9tYWtlIGlucHV0Ci1maWxlLCBhbmQgdGhlIGF1dG9tYWtlIG1hbnVhbCBkZXNjcmliZXMgaW4gZGV0YWlsIHdoYXQgdGhpcyBmaWxlIHNob3VsZAotbG9vayBsaWtlLgotCi1UaGUgYXV0b21ha2UgY29tbWFuZHMgaW4gQGZpbGV7TWFrZWZpbGUuYW19IG1vc3RseSBsb29rIGxpa2UgdmFyaWFibGUKLWFzc2lnbm1lbnRzIGluIGEgQGZpbGV7TWFrZWZpbGV9LiAgYXV0b21ha2UgcmVjb2duaXplcyBzcGVjaWFsIHZhcmlhYmxlCi1uYW1lcywgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIG1ha2UgcnVsZXMgdG8gdGhlIG91dHB1dCBhcyBuZWVkZWQuCi0KLVRoZXJlIHdpbGwgYmUgb25lIEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIGZvciBlYWNoIGRpcmVjdG9yeSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGVhY2ggZGlyZWN0b3J5IHdpdGggc3ViZGlyZWN0b3JpZXMsIHRoZSBAZmlsZXtNYWtlZmlsZS5hbX0KLWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLVNVQkRJUlMgPSBAdmFye2Rpcn0gQHZhcntkaXJ9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntkaXJ9IGlzIHRoZSBuYW1lIG9mIGEgc3ViZGlyZWN0b3J5LgotCi1Gb3IgZWFjaCBAZmlsZXtNYWtlZmlsZS5hbX0sIHRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcKLUBmaWxle01ha2VmaWxlfSBpbiB0aGUgQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59LgotCi1FdmVyeSBAZmlsZXtNYWtlZmlsZS5hbX0gd3JpdHRlbiBhdCBDeWdudXMgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgcHV0cyBhdXRvbWFrZSBpbnRvIEN5Z251cyBtb2RlLiAgU2VlIHRoZSBhdXRvbWFrZSBtYW51YWwgZm9yCi1kZXRhaWxzLgotCi1Zb3UgbWF5IHRvIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBzYW1we2F1dG9tYWtlfSB0aGF0IHlvdSBhcmUKLXVzaW5nIG9uIHRoZSBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBsaW5lLiAgRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIDEuMwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbSBydW5uaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZgotQHNhbXB7YXV0b21ha2V9IGFuZCBwZXJoYXBzIGdldHRpbmcgYW4gaW52YWxpZCBAZmlsZXtNYWtlZmlsZS5pbn0uCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBwcm9ncmFtLCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdAotcHJvZ3JhbSBpcyBidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1iaW5fUFJPR1JBTVMgPSBAdmFye3Byb2dyYW19Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBAdmFye3Byb2dyYW19IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLiAgWW91IHdpbGwgdGhlbiB3YW50IGEKLWxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotQHZhcntwcm9ncmFtfV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntmaWxlfSBpcyB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlIHRvIGxpbmsgaW50byB0aGUKLXByb2dyYW0gKGUuZy4sIEBzYW1we2Zvby5jfSkuCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBsaWJyYXJ5LCBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBsaWJyYXJ5IHRvCi1ldmVyIGJlIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0Ci1saWJyYXJ5IGlzIGJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYl9MSUJSQVJJRVMgPSBsaWJAdmFye25hbWV9LmEKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIEBzYW1we2xpYkB2YXJ7bmFtZX0uYX0gaXMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuICBZb3Ugd2lsbCB0aGVuCi13YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJAdmFye25hbWV9X2FfU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZmlsZX0gaXMgdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSB0byBhZGQgdG8gdGhlCi1saWJyYXJ5LgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgbGlicmFyeSwgYW5kIHlvdSB3YW50IHRvIHBlcm1pdCBidWlsZGluZyB0aGUKLWxpYnJhcnkgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQgbGlicmFyeSBpcwotYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliX0xUTElCUkFSSUVTID0gbGliQHZhcntuYW1lfS5sYQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQHNhbXB7TFRMSUJSQVJJRVN9LCBhbmQgdGhlIEBzYW1wey5sYX0gZXh0ZW5zaW9uLCBpbmRpY2F0ZSBhCi1saWJyYXJ5IHRvIGJlIGJ1aWx0IHVzaW5nIGxpYnRvb2wuICBBcyB1c3VhbCwgeW91IHdpbGwgdGhlbiB3YW50IGEgbGluZQotbGlrZQotQHNtYWxsZXhhbXBsZQotbGliQHZhcntuYW1lfV9sYV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzdHJpbmdzIEBzYW1we2Jpbn0gYW5kIEBzYW1we2xpYn0gdGhhdCBhcHBlYXIgYWJvdmUgaW4KLUBzYW1we2Jpbl9QUk9HUkFNU30gYW5kIEBzYW1we2xpYl9MSUJSQVJJRVN9IGFyZSBub3QgYXJiaXRyYXJ5LiAgVGhleQotcmVmZXIgdG8gcGFydGljdWxhciBkaXJlY3Rvcmllcywgd2hpY2ggbWF5IGJlIHNldCBieSB0aGUgQHNhbXB7LS1iaW5kaXJ9Ci1hbmQgQHNhbXB7LS1saWJkaXJ9IG9wdGlvbnMgdG8gQGZpbGV7Y29uZmlndXJlfS4gIElmIHRob3NlIG9wdGlvbnMgYXJlCi1ub3QgdXNlZCwgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgQHNhbXB7LS1wcmVmaXh9IG9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zIHRvIEBmaWxle2NvbmZpZ3VyZX0uICBJdCBpcyBwb3NzaWJsZSB0byB1c2UKLW90aGVyIG5hbWVzIGlmIHRoZSBwcm9ncmFtIG9yIGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBzb21lIG90aGVyCi1kaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBtYXkgYWxzbyBjb250YWluIGFsbW9zdCBhbnl0aGluZyB0aGF0IG1heQotYXBwZWFyIGluIGEgbm9ybWFsIEBmaWxle01ha2VmaWxlfS4gIGF1dG9tYWtlIGFsc28gc3VwcG9ydHMgbWFueSBvdGhlcgotc3BlY2lhbCB2YXJpYWJsZXMsIGFzIHdlbGwgYXMgY29uZGl0aW9uYWxzLgotCi1TZWUgdGhlIGF1dG9tYWtlIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQG5vZGUgV3JpdGUgYWNjb25maWcuaAotQHNlY3Rpb24gV3JpdGUgYWNjb25maWcuaAotQGNpbmRleCBAZmlsZXthY2NvbmZpZy5ofSwgd3JpdGluZwotCi1JZiB5b3UgYXJlIGdlbmVyYXRpbmcgYSBwb3J0YWJpbGl0eSBoZWFkZXIgZmlsZSwgKGkuZS4sIHlvdSBhcmUgdXNpbmcKLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8KLXdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEl0IHdpbGwgaGF2ZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmcKLWxpbmVzLgotCi1Ac21hbGxleGFtcGxlCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBWRVJTSU9OCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJlcXVpcmVtZW50IGlzIHJlYWxseSBhIGJ1ZyBpbiB0aGUgc3lzdGVtLCBhbmQgdGhlIHJlcXVpcmVtZW50IG1heQotYmUgZWxpbWluYXRlZCBhdCBzb21lIGxhdGVyIGRhdGUuCi0KLVRoZSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlIHdpbGwgYWxzbyBzaW1pbGFyIGNvbW1lbnQgYW5kIEBzYW1weyN1bmRlZn0KLWxpbmVzIGZvciBhbnkgdW51c3VhbCBtYWNyb3MgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgaW5jbHVkaW5nCi1hbnkgbWFjcm8gd2hpY2ggYXBwZWFycyBpbiBhIEBzYW1we0FDX0RFRklORX0gbWFjcm8uCi0KLUluIHBhcnRpY3VsYXIsIGlmIHlvdSBhcmUgd3JpdGluZyBhIEdOVSBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgaW5jbHVkZQotQHNhbXB7QUNfREVGSU5FKF9HTlVfU09VUkNFKX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufSBhcyBzdWdnZXN0ZWQgYWJvdmUsCi15b3Ugd2lsbCBuZWVkIGxpbmVzIGxpa2UgdGhpcyBpbiBAZmlsZXthY2NvbmZpZy5ofToKLUBzbWFsbGV4YW1wbGUKLS8qIEVuYWJsZSBHTlUgZXh0ZW5zaW9ucy4gICovCi0jdW5kZWYgX0dOVV9TT1VSQ0UKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vcm1hbGx5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBwcm9ncmFtIHdpbGwgaW5mb3JtIHlvdSBvZiBhbnkgc3VjaAotcmVxdWlyZW1lbnRzIGJ5IHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBpcyBydW4uICBIb3dldmVyLCBpZgoteW91IGRvIGFueXRoaW5nIHBhcnRpY3VsYXIgb2RkIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCB5b3UKLXdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZW50cmllcyBhcHBlYXIgaW4KLUBmaWxle2FjY29uZmlnLmh9LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIG1heSBub3QgYmUKLWF2YWlsYWJsZSBpbiB0aGUgQGZpbGV7Y29uZmlnLmh9IGZpbGUgd2hpY2ggeW91ciBjb2RlIHdpbGwgdXNlLgotCi0oVGhlZSBAc2FtcHtQQUNLQUdFfSBhbmQgQHNhbXB7VkVSU0lPTn0gbGluZXMgYXJlIG5vdCByZXF1aXJlZCBpZiB5b3UKLWFyZSBub3QgdXNpbmcgYXV0b21ha2UsIGFuZCBpbiB0aGF0IGNhc2UgeW91IG1heSBub3QgbmVlZCBhCi1AZmlsZXthY2NvbmZpZy5ofSBmaWxlIGF0IGFsbCkuCi0KLUBub2RlIEdlbmVyYXRlIGZpbGVzCi1Ac2VjdGlvbiBHZW5lcmF0ZSBmaWxlcwotCi1PbmNlIHlvdSBoYXZlIHdyaXR0ZW4gQGZpbGV7Y29uZmlndXJlLmlufSwgQGZpbGV7TWFrZWZpbGUuYW19LAotQGZpbGV7YWNjb25maWcuaH0sIGFuZCBwb3NzaWJseSBAZmlsZXthY2luY2x1ZGUubTR9LCB5b3UgbXVzdCB1c2UKLWF1dG9jb25mIGFuZCBhdXRvbWFrZSBwcm9ncmFtcyB0byBwcm9kdWNlIHRoZSBmaXJzdCB2ZXJzaW9ucyBvZiB0aGUKLWdlbmVyYXRlZCBmaWxlcy4gIFRoaXMgaXMgZG9uZSBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZgotY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzYW1we2FjbG9jYWx9IGFuZCBAc2FtcHthdXRvbWFrZX0gY29tbWFuZHMgYXJlIHBhcnQgb2YgdGhlIGF1dG9tYWtlCi1wYWNrYWdlLCBhbmQgdGhlIEBzYW1we2F1dG9jb25mfSBhbmQgQHNhbXB7YXV0b2hlYWRlcn0gY29tbWFuZHMgYXJlIHBhcnQKLW9mIHRoZSBhdXRvY29uZiBwYWNrYWdlLgotCi1JZiB5b3UgYXJlIHVzaW5nIGEgQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSBmb3IgeW91ciBtYWNyb3MsIHlvdSB3aWxsIG5lZWQKLXRvIHVzZSB0aGUgQHNhbXB7LUkgbTR9IG9wdGlvbiB3aGVuIHlvdSBydW4gQHNhbXB7YWNsb2NhbH0uCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgdXNlIHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4KLXJ1bm5pbmcgQHNhbXB7YXV0b21ha2V9IGNvbW1hbmQgaW4gb3JkZXIgdG8gY29weSB0aGUgcmVxdWlyZWQgc3VwcG9ydAotZmlsZXMgaW50byB5b3VyIHNvdXJjZSBkaXJlY3RvcnkuCi0KLUlmIHlvdSBhcmUgdXNpbmcgbGlidG9vbCwgeW91IG11c3QgYnVpbGQgYW5kIGluc3RhbGwgdGhlIGxpYnRvb2wgcGFja2FnZQotd2l0aCB0aGUgc2FtZSBAc2FtcHstLXByZWZpeH0gYW5kIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMgYXMgeW91Ci11c2VkIHdpdGggdGhlIGF1dG9jb25mIGFuZCBhdXRvbWFrZSBwYWNrYWdlcy4gIFlvdSBtdXN0IGRvIHRoaXMgYmVmb3JlCi1ydW5uaW5nIGFueSBvZiB0aGUgYWJvdmUgY29tbWFuZHMuICBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzCi10cmVlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biB0aGUgQHNhbXB7bGlidG9vbGl6ZX0gcHJvZ3JhbSB0byBjb3B5IHRoZQotbGlidG9vbCBzdXBwb3J0IGZpbGVzIGludG8geW91ciBkaXJlY3RvcnkuCi0KLU9uY2UgeW91IGhhdmUgbWFuYWdlZCB0byBydW4gdGhlc2UgY29tbWFuZHMgd2l0aG91dCBnZXR0aW5nIGFueSBlcnJvcnMsCi15b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBlbXB0eSBkaXJlY3RvcnksIGFuZCBydW4gdGhlIEBzYW1we2NvbmZpZ3VyZX0KLXNjcmlwdCB3aGljaCB3aWxsIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IEBzYW1we2F1dG9jb25mfSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSBzZXQgb2YKLU1ha2VmaWxlcyB3aGljaCB3aWxsIGluY2x1ZGUgcnVsZXMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIGFsbCB0aGUKLWdlbmVyYXRlZCBmaWxlcy4KLQotQWZ0ZXIgZG9pbmcgdGhhdCwgd2hlbmV2ZXIgeW91IGhhdmUgY2hhbmdlZCBzb21lIG9mIHRoZSBpbnB1dCBmaWxlcyBhbmQKLXdhbnQgdG8gcmVnZW5lcmF0ZWQgdGhlIG90aGVyIGZpbGVzLCBnbyB0byB5b3VyIG9iamVjdCBkaXJlY3RvcnkgYW5kIHJ1bgotQHNhbXB7bWFrZX0uICBEb2luZyB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0cnlpbmcgdG8gcmVidWlsZCB0aGUKLWZpbGVzIG1hbnVhbGx5LCBiZWNhdXNlIHRoZXJlIGFyZSBjb21wbGV4IG9yZGVyIGRlcGVuZGVuY2llcyBhbmQgaXQgaXMKLWVhc3kgdG8gZm9yZ2V0IHNvbWV0aGluZy4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUKLUBzZWN0aW9uIEV4YW1wbGUKLQotTGV0J3MgY29uc2lkZXIgYSB0cml2aWFsIGV4YW1wbGUuCi0KLVN1cHBvc2Ugd2Ugd2FudCB0byB3cml0ZSBhIHNpbXBsZSB2ZXJzaW9uIG9mIEBzYW1we3RvdWNofS4gIE91ciBwcm9ncmFtLAotd2hpY2ggd2Ugd2lsbCBjYWxsIEBzYW1we3Bva2V9LCB3aWxsIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFyZ3VtZW50LAotYW5kIHVzZSB0aGUgQHNhbXB7dXRpbWV9IHN5c3RlbSBjYWxsIHRvIHNldCB0aGUgbW9kaWZpY2F0aW9uIGFuZCBhY2Nlc3MKLXRpbWVzIG9mIHRoZSBmaWxlIHRvIHRoZSBjdXJyZW50IHRpbWUuICBXZSB3YW50IHRoaXMgcHJvZ3JhbSB0byBiZQotaGlnaGx5IHBvcnRhYmxlLgotCi1XZSdsbCBmaXJzdCBzZWUgd2hhdCB0aGlzIGxvb2tzIGxpa2Ugd2l0aG91dCB1c2luZyBhdXRvY29uZiBhbmQKLWF1dG9tYWtlLCBhbmQgdGhlbiBzZWUgd2hhdCBpdCBsb29rcyBsaWtlIHdpdGggdGhlbS4KLQotQG1lbnUKLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMTo6CQlGaXJzdCBUcnkuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDI6OgkJU2Vjb25kIFRyeS4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMzo6CQlUaGlyZCBUcnkuCi0qIEdlbmVyYXRlIEZpbGVzIGluIEV4YW1wbGU6OgkJR2VuZXJhdGUgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMQotQHN1YnNlY3Rpb24gRmlyc3QgVHJ5Ci0KLUhlcmUgaXMgb3VyIGZpcnN0IHRyeSBhdCBAc2FtcHtwb2tlLmN9LiAgTm90ZSB0aGF0IHdlJ3ZlIHdyaXR0ZW4gaXQKLXdpdGhvdXQgQU5TSS9JU08gQyBwcm90b3R5cGVzLCBzaW5jZSB3ZSB3YW50IGl0IHRvIGJlIGhpZ2hseSBwb3J0YWJsZS4KLQotQGV4YW1wbGUKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aW1lLmg+Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotV2UgYWxzbyB3cml0ZSBhIHNpbXBsZSBAZmlsZXtNYWtlZmlsZX0uCi0KLUBleGFtcGxlCi1DQyA9IGdjYwotQ0ZMQUdTID0gLWcgLU8yCi0KLWFsbDogcG9rZQotCi1wb2tlOiBwb2tlLm8KLQkkKENDKSAtbyBwb2tlICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotQGVuZCBleGFtcGxlCi0KLVNvIGZhciwgc28gZ29vZC4KLQotVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGEgZmV3IHByb2JsZW1zLgotCi1PbiBvbGRlciBVbml4IHN5c3RlbXMgZGVyaXZlZCBmcm9tIEJTRCA0LjMsIHRoZSBAc2FtcHt1dGltZX0gc3lzdGVtIGNhbGwKLWRvZXMgbm90IGFjY2VwdCBhIHNlY29uZCBhcmd1bWVudCBvZiBAc2FtcHtOVUxMfS4gIE9uIHRob3NlIHN5c3RlbXMsIHdlCi1uZWVkIHRvIHBhc3MgYSBwb2ludGVyIHRvIEBzYW1we3N0cnVjdCB1dGltYnVmfSBzdHJ1Y3R1cmUuCi1VbmZvcnR1bmF0ZWx5LCBldmVuIG9sZGVyIHN5c3RlbXMgZG9uJ3QgZGVmaW5lIHRoYXQgc3RydWN0dXJlOyBvbiB0aG9zZQotc3lzdGVtcywgd2UgbmVlZCB0byBwYXNzIGFuIGFycmF5IG9mIHR3byBAc2FtcHtsb25nfSB2YWx1ZXMuCi0KLVRoZSBoZWFkZXIgZmlsZSBAZmlsZXtzdGRsaWIuaH0gd2FzIGludmVudGVkIGJ5IEFOU0kgQywgYW5kIG9sZGVyCi1zeXN0ZW1zIGRvbid0IGhhdmUgYSBjb3B5LiAgV2UgaW5jbHVkZWQgaXQgYWJvdmUgdG8gZ2V0IGEgZGVjbGFyYXRpb24gb2YKLUBzYW1we2V4aXR9LgotCi1XZSBjYW4gZmluZCBzb21lIG9mIHRoZXNlIHBvcnRhYmlsaXR5IHByb2JsZW1zIGJ5IHJ1bm5pbmcKLUBzYW1we2F1dG9zY2FufSwgd2hpY2ggd2lsbCBjcmVhdGUgYSBAZmlsZXtjb25maWd1cmUuc2Nhbn0gZmlsZSB3aGljaCB3ZQotY2FuIHVzZSBhcyBhIHByb3RvdHlwZSBmb3Igb3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZS4gIEkgd29uJ3Qgc2hvdwotdGhlIG91dHB1dCwgYnV0IGl0IHdpbGwgbm90aWNlIHRoZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBAc2FtcHt1dGltZX0KLWFuZCBAZmlsZXtzdGRsaWIuaH0uCi0KLUluIG91ciBAZmlsZXtNYWtlZmlsZX0sIHdlIGRvbid0IHByb3ZpZGUgYW55IHdheSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtLgotVGhpcyBkb2Vzbid0IG1hdHRlciBtdWNoIGZvciBzdWNoIGEgc2ltcGxlIGV4YW1wbGUsIGJ1dCBhIHJlYWwgcHJvZ3JhbQotd2lsbCBuZWVkIGFuIEBzYW1we2luc3RhbGx9IHRhcmdldC4gIEZvciB0aGF0IG1hdHRlciwgd2Ugd2lsbCBhbHNvIHdhbnQKLWEgQHNhbXB7Y2xlYW59IHRhcmdldC4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMgotQHN1YnNlY3Rpb24gU2Vjb25kIFRyeQotCi1IZXJlIGlzIG91ciBzZWNvbmQgdHJ5IGF0IHRoaXMgcHJvZ3JhbS4KLQotV2UgbW9kaWZ5IEBmaWxle3Bva2UuY30gdG8gdXNlIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gY29udHJvbCB3aGF0Ci1mZWF0dXJlcyBhcmUgYXZhaWxhYmxlLiAgKEkndmUgY2hlYXRlZCBhIGJpdCBieSB1c2luZyB0aGUgc2FtZSBtYWNybwotbmFtZXMgd2hpY2ggYXV0b2NvbmYgd2lsbCB1c2UpLgotCi1AZXhhbXBsZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBIQVZFX1VUSU1FX0gKLSNpbmNsdWRlIDx1dGltZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VVElNRV9OVUxMCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZm5kZWYgSEFWRV9TVFJVQ1RfVVRJTUJVRgotCi1zdHJ1Y3QgdXRpbWJ1ZgotQHsKLSAgbG9uZyBhY3RpbWU7Ci0gIGxvbmcgbW9kdGltZTsKLUB9OwotCi0jZW5kaWYKLQotc3RhdGljIGludAotdXRpbWVfbm93IChmaWxlKQotICAgICBjaGFyICpmaWxlOwotQHsKLSAgc3RydWN0IHV0aW1idWYgbm93OwotCi0gIG5vdy5hY3RpbWUgPSBub3cubW9kdGltZSA9IHRpbWUgKE5VTEwpOwotICByZXR1cm4gdXRpbWUgKGZpbGUsICZub3cpOwotQH0KLQotI2RlZmluZSB1dGltZShmLCBwKSB1dGltZV9ub3cgKGYpCi0KLSNlbmRpZiAvKiBIQVZFX1VUSU1FX05VTEwgICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyB0aGUgYXNzb2NpYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBXZSd2ZSBhZGRlZCBzdXBwb3J0IGZvciB0aGUKLXByZXByb2Nlc3NvciBmbGFncyB3ZSB1c2UuICBXZSd2ZSBhbHNvIGFkZGVkIEBzYW1we2luc3RhbGx9IGFuZAotQHNhbXB7Y2xlYW59IHRhcmdldHMuCi0KLUBleGFtcGxlCi0jIFNldCB0aGlzIHRvIHlvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLWJpbmRpciA9IC91c3IvbG9jYWwvYmluCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgeW91IGhhdmUgdGhlIHN0YW5kYXJkIEFOU0kvSVNPIEMgaGVhZGVyIGZpbGVzLgotIyBTVERDX0hEUlMgPSAtRFNURENfSEVBREVSUwotCi0jIFVuY29tbWVudCB0aGlzIGlmIHlvdSBoYXZlIHV0aW1lLmguCi0jIFVUSU1FX0ggPSAtREhBVkVfVVRJTUVfSAotCi0jIFVuY29tbWVudCB0aGlzIGlmIHV0aW1lIChGSUxFLCBOVUxMKSB3b3JrcyBvbiB5b3VyIHN5c3RlbS4KLSMgVVRJTUVfTlVMTCA9IC1ESEFWRV9VVElNRV9OVUxMCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgc3RydWN0IHV0aW1idWYgaXMgZGVmaW5lZCBpbiB1dGltZS5oLgotIyBVVElNQlVGID0gLURIQVZFX1NUUlVDVF9VVElNQlVGCi0KLUNDID0gZ2NjCi1DRkxBR1MgPSAtZyAtTzIKLQotQUxMX0NGTEFHUyA9ICQoU1REQ19IRFJTKSAkKFVUSU1FX0gpICQoVVRJTUVfTlVMTCkgJChVVElNQlVGKSAkKENGTEFHUykKLQotYWxsOiBwb2tlCi0KLXBva2U6IHBva2UubwotCSQoQ0MpIC1vIHBva2UgJChBTExfQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgcG9rZS5jCi0KLWluc3RhbGw6IHBva2UKLQljcCBwb2tlICQoYmluZGlyKS9wb2tlCi0KLWNsZWFuOgotCXJtIHBva2UgcG9rZS5vCi1AZW5kIGV4YW1wbGUKLQotU29tZSBwcm9ibGVtcyB3aXRoIHRoaXMgYXBwcm9hY2ggc2hvdWxkIGJlIGNsZWFyLgotCi1Vc2VycyB3aG8gd2FudCB0byBjb21waWxlIHBva2Ugd2lsbCBoYXZlIHRvIGtub3cgaG93IEBzYW1we3V0aW1lfSB3b3Jrcwotb24gdGhlaXIgc3lzdGVtcywgc28gdGhhdCB0aGV5IGNhbiB1bmNvbW1lbnQgdGhlIEBmaWxle01ha2VmaWxlfQotY29ycmVjdGx5LgotCi1UaGUgaW5zdGFsbGF0aW9uIGlzIGRvbmUgdXNpbmcgQHNhbXB7Y3B9LCBidXQgbWFueSBzeXN0ZW1zIGhhdmUgYW4KLUBzYW1we2luc3RhbGx9IHByb2dyYW0gd2hpY2ggbWF5IGJlIHVzZWQsIGFuZCB3aGljaCBzdXBwb3J0cyBvcHRpb25hbAotZmVhdHVyZXMgc3VjaCBhcyBzdHJpcHBpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgaW5zdGFsbGVkCi1iaW5hcnkuCi0KLVRoZSB1c2Ugb2YgQGZpbGV7TWFrZWZpbGV9IHZhcmlhYmxlcyBsaWtlIEBzYW1we0NDfSwgQHNhbXB7Q0ZMQUdTfSBhbmQKLUBzYW1we0xERkxBR1N9IGZvbGxvd3MgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIHN0YW5kYXJkcy4gIFRoaXMgaXMKLWNvbnZlbmllbnQgZm9yIGFsbCBwYWNrYWdlcywgc2luY2UgaXQgcmVkdWNlcyBzdXJwcmlzZXMgZm9yIHVzZXJzLgotSG93ZXZlciwgaXQgaXMgZWFzeSB0byBnZXQgdGhlIGRldGFpbHMgd3JvbmcsIGFuZCB3aW5kIHVwIHdpdGggYQotc2xpZ2h0bHkgbm9uc3RhbmRhcmQgZGlzdHJpYnV0aW9uLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAzCi1Ac3Vic2VjdGlvbiBUaGlyZCBUcnkKLQotRm9yIG91ciB0aGlyZCB0cnkgYXQgdGhpcyBwcm9ncmFtLCB3ZSB3aWxsIHdyaXRlIGEgQGZpbGV7Y29uZmlndXJlLmlufQotc2NyaXB0IHRvIGRpc2NvdmVyIHRoZSBjb25maWd1cmF0aW9uIGZlYXR1cmVzIG9uIHRoZSBob3N0IHN5c3RlbSwgcmF0aGVyCi10aGFuIHJlcXVpcmluZyB0aGUgdXNlciB0byBlZGl0IHRoZSBAZmlsZXtNYWtlZmlsZX0uICBXZSB3aWxsIGFsc28gd3JpdGUKLWEgQGZpbGV7TWFrZWZpbGUuYW19IHJhdGhlciB0aGFuIGEgQGZpbGV7TWFrZWZpbGV9LgotCi1UaGUgb25seSBjaGFuZ2UgdG8gQGZpbGV7cG9rZS5jfSBpcyB0byBhZGQgYSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGUKLWZpbGU6Ci1Ac21hbGxleGFtcGxlCi0jaW5jbHVkZSAiY29uZmlnLmgiCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgbmV3IEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpcyBhcyBmb2xsb3dzLgotCi1AZXhhbXBsZQotQUNfSU5JVChwb2tlLmMpCi1BTV9JTklUX0FVVE9NQUtFKHBva2UsIDEuMCkKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfUFJPR19DQwotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlModXRpbWUuaCkKLUFDX0VHUkVQX0hFQURFUih1dGltYnVmLCB1dGltZS5oLCBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfVVRJTUJVRikpCi1BQ19GVU5DX1VUSU1FX05VTEwKLUFDX09VVFBVVChNYWtlZmlsZSkKLUBlbmQgZXhhbXBsZQotCi1UaGUgZmlyc3QgZm91ciBtYWNyb3MgaW4gdGhpcyBmaWxlLCBhbmQgdGhlIGxhc3Qgb25lLCB3ZXJlIGRlc2NyaWJlZAotYWJvdmU7IHNlZSBAcmVme1dyaXRlIGNvbmZpZ3VyZS5pbn0uICBJZiB3ZSBvbWl0IHRoZXNlIG1hY3JvcywgdGhlbiB3aGVuCi13ZSBydW4gQHNhbXB7YXV0b21ha2V9IHdlIHdpbGwgZ2V0IGEgcmVtaW5kZXIgdGhhdCB3ZSBuZWVkIHRoZW0uCi0KLVRoZSBvdGhlciBtYWNyb3MgYXJlIHN0YW5kYXJkIGF1dG9jb25mIG1hY3Jvcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBBQ19IRUFERVJfU1REQwotQ2hlY2sgZm9yIHN0YW5kYXJkIEMgaGVhZGVycy4KLUBpdGVtIEFDX0NIRUNLX0hFQURFUlMKLUNoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlIGV4aXN0cy4KLUBpdGVtIEFDX0VHUkVQX0hFQURFUgotQ2hlY2sgZm9yIGEgcGFydGljdWxhciBzdHJpbmcgaW4gYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlLCBpbiB0aGlzIGNhc2UKLWNoZWNraW5nIGZvciBAc2FtcHt1dGltYnVmfSBpbiBAZmlsZXt1dGltZS5ofS4KLUBpdGVtIEFDX0ZVTkNfVVRJTUVfTlVMTAotQ2hlY2sgd2hldGhlciBAc2FtcHt1dGltZX0gYWNjZXB0cyBhIE5VTEwgc2Vjb25kIGFyZ3VtZW50IHRvIHNldCB0aGUKLWZpbGUgY2hhbmdlIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4KLUBlbmQgdGFibGUKLQotU2VlIHRoZSBhdXRvY29uZiBtYW51YWwgZm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KLQotVGhlIG5ldyBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBpcyBhcyBmb2xsb3dzLiAgTm90ZSBob3cgc2ltcGxlIHRoaXMgaXMKLWNvbXBhcmVkIHRvIG91ciBlYXJsaWVyIEBmaWxle01ha2VmaWxlfS4KLQotQGV4YW1wbGUKLWJpbl9QUk9HUkFNUyA9IHBva2UKLQotcG9rZV9TT1VSQ0VTID0gcG9rZS5jCi1AZW5kIGV4YW1wbGUKLQotVGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBidWlsZCBhIHNpbmdsZSBwcm9ncmFtIG5hbWUgQHNhbXB7cG9rZX0uICBJdAotc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgYmluYXJ5IGRpcmVjdG9yeSwgd2hpY2ggd2UgY2FsbGVkCi1Ac2FtcHtiaW5kaXJ9IGVhcmxpZXIuICBUaGUgcHJvZ3JhbSBAc2FtcHtwb2tlfSBpcyBidWlsdCBmcm9tIHRoZSBzb3VyY2UKLWZpbGUgQGZpbGV7cG9rZS5jfS4KLQotV2UgbXVzdCBhbHNvIHdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEJlc2lkZXMgQHNhbXB7UEFDS0FHRX0gYW5kCi1Ac2FtcHtWRVJTSU9OfSwgd2hpY2ggbXVzdCBiZSBtZW50aW9uZWQgZm9yIGFsbCBwYWNrYWdlcyB3aGljaCB1c2UKLWF1dG9tYWtlLCB3ZSBtdXN0IGluY2x1ZGUgQHNhbXB7SEFWRV9TVFJVQ1RfVVRJTUJVRn0sIHNpbmNlIHdlIG1lbnRpb25lZAotaXQgaW4gYW4gQHNhbXB7QUNfREVGSU5FfS4KLQotQGV4YW1wbGUKLS8qIE5hbWUgb2YgcGFja2FnZS4gICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogV2hldGhlciB1dGltZS5oIGRlZmluZXMgc3RydWN0IHV0aW1idWYuICAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1VUSU1CVUYKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBHZW5lcmF0ZSBGaWxlcyBpbiBFeGFtcGxlCi1Ac3Vic2VjdGlvbiBHZW5lcmF0ZSBGaWxlcwotCi1XZSBtdXN0IG5vdyBnZW5lcmF0ZSB0aGUgb3RoZXIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB3ZSBydW4gQHNhbXB7YXV0b2hlYWRlcn0sIGl0IHdpbGwgcmVtaW5kIHVzIG9mIGFueSBtYWNyb3Mgd2UgZm9yZ290Ci10byBhZGQgdG8gQGZpbGV7YWNjb25maWcuaH0uCi0KLVdoZW4gd2UgcnVuIEBzYW1we2F1dG9tYWtlfSwgaXQgd2lsbCB3YW50IHRvIGFkZCBzb21lIGZpbGVzIHRvIG91cgotZGlzdHJpYnV0aW9uLiAgSXQgd2lsbCBhZGQgdGhlbSBhdXRvbWF0aWNhbGx5IGlmIHdlIHVzZSB0aGUKLUBzYW1wey0tYWRkLW1pc3Npbmd9IG9wdGlvbi4KLQotQnkgZGVmYXVsdCwgQHNhbXB7YXV0b21ha2V9IHdpbGwgcnVuIGluIEdOVSBtb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0Ci13aWxsIHdhbnQgdXMgdG8gY3JlYXRlIGNlcnRhaW4gYWRkaXRpb25hbCBmaWxlczsgYXMgb2YgdGhpcyB3cml0aW5nLCBpdAotd2lsbCB3YW50IEBmaWxle05FV1N9LCBAZmlsZXtSRUFETUV9LCBAZmlsZXtBVVRIT1JTfSwgYW5kCi1AZmlsZXtDaGFuZ2VMb2d9LCBhbGwgb2Ygd2hpY2ggYXJlIGZpbGVzIHdoaWNoIHNob3VsZCBhcHBlYXIgaW4gYQotc3RhbmRhcmQgR05VIGRpc3RyaWJ1dGlvbi4gIFdlIGNhbiBlaXRoZXIgYWRkIHRob3NlIGZpbGVzLCBvciBydW4KLUBzYW1we2F1dG9tYWtlfSB3aXRoIHRoZSBAc2FtcHstLWZvcmVpZ259IG9wdGlvbi4KLQotUnVubmluZyB0aGVzZSB0b29scyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMsIGFsbCBvZiB3aGljaCBhcmUKLWRlc2NyaWJlZCBpbiB0aGUgbmV4dCBjaGFwdGVyLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQGZpbGV7YWNsb2NhbC5tNH0KLUBpdGVtCi1AZmlsZXtjb25maWd1cmV9Ci1AaXRlbQotQGZpbGV7Y29uZmlnLmlufQotQGl0ZW0KLUBmaWxle01ha2VmaWxlLmlufQotQGl0ZW0KLUBmaWxle3N0YW1wLWguaW59Ci1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZXMKLUBjaGFwdGVyIEZpbGVzCi0KLUFzIHdhcyBzZWVuIGluIHRoZSBwcmV2aW91cyBjaGFwdGVyLCB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi11c2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmaWxlcy4gIFRoZSBkZXZlbG9wZXIgbXVzdCB3cml0ZSBhIGZldyBmaWxlcy4KLVRoZSBvdGhlcnMgYXJlIGdlbmVyYXRlZCBieSB2YXJpb3VzIHRvb2xzLgotCi1UaGUgc3lzdGVtIGlzIHJhdGhlciBmbGV4aWJsZSwgYW5kIGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXMuCi1JbiBkZXNjcmliaW5nIHRoZSBmaWxlcyB0aGF0IGl0IHVzZXMsIEkgd2lsbCBkZXNjcmliZSB0aGUgY29tbW9uIGNhc2UsCi1hbmQgbWVudGlvbiBzb21lIG90aGVyIGNhc2VzIHRoYXQgbWF5IGFyaXNlLgotCi1AbWVudQotKiBEZXZlbG9wZXIgRmlsZXM6OgkJRGV2ZWxvcGVyIEZpbGVzLgotKiBCdWlsZCBGaWxlczo6CQkJQnVpbGQgRmlsZXMuCi0qIFN1cHBvcnQgRmlsZXM6OgkJU3VwcG9ydCBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBEZXZlbG9wZXIgRmlsZXMKLUBzZWN0aW9uIERldmVsb3BlciBGaWxlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmaWxlcyB3cml0dGVuIG9yIGdlbmVyYXRlZCBieSB0aGUgZGV2ZWxvcGVyCi1vZiBhIHBhY2thZ2UuCi0KLUBtZW51Ci0qIERldmVsb3BlciBGaWxlcyBQaWN0dXJlOjoJRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUuCi0qIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzOjoJV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMuCi0qIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXM6OglHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIERldmVsb3BlciBGaWxlcyBQaWN0dXJlCi1Ac3Vic2VjdGlvbiBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZQotCi1IZXJlIGlzIGEgcGljdHVyZSBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIHdyaXR0ZW4gYnkgdGhlIGRldmVsb3BlciwgdGhlCi1nZW5lcmF0ZWQgZmlsZXMgd2hpY2ggd291bGQgYmUgaW5jbHVkZWQgd2l0aCBhIGNvbXBsZXRlIHNvdXJjZQotZGlzdHJpYnV0aW9uLCBhbmQgdGhlIHRvb2xzIHdoaWNoIGNyZWF0ZSB0aG9zZSBmaWxlcy4KLUBpZmluZm8KLVRoZSBmaWxlIG5hbWVzIGFyZSBwbGFpbiB0ZXh0IGFuZCB0aGUgdG9vbCBuYW1lcyBhcmUgZW5jbG9zZWQgYnkKLUBzYW1weyp9IGNoYXJhY3RlcnMKLUBlbmQgaWZpbmZvCi1AaWZub3RpbmZvCi1UaGUgZmlsZSBuYW1lcyBhcmUgaW4gcmVjdGFuZ2xlcyB3aXRoIHNxdWFyZSBjb3JuZXJzIGFuZCB0aGUgdG9vbCBuYW1lcwotYXJlIGluIHJlY3RhbmdsZXMgd2l0aCByb3VuZGVkIGNvcm5lcnMKLUBlbmQgaWZub3RpbmZvCi0oZS5nLiwgQHNhbXB7YXV0b2hlYWRlcn0gaXMgdGhlIG5hbWUgb2YgYSB0b29sLCBub3QgdGhlIG5hbWUgb2YgYSBmaWxlKS4KLQotQGltYWdle2NvbmZpZ2Rldn0KLQotQG5vZGUgV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgd3JpdHRlbiBieSB0aGUgZGV2ZWxvcGVyLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZS5pbgotQGNpbmRleCBAZmlsZXtjb25maWd1cmUuaW59Ci1UaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdC4gIFRoaXMgc2NyaXB0IGNvbnRhaW5zIGludm9jYXRpb25zIG9mCi1hdXRvY29uZiBtYWNyb3MuICBJdCBtYXkgYWxzbyBjb250YWluIG9yZGluYXJ5IHNoZWxsIHNjcmlwdCBjb2RlLiAgVGhpcwotZmlsZSB3aWxsIGNvbnRhaW4gZmVhdHVyZSB0ZXN0cyBmb3IgcG9ydGFiaWxpdHkgaXNzdWVzLiAgVGhlIGxhc3QgdGhpbmcKLWluIHRoZSBmaWxlIHdpbGwgbm9ybWFsbHkgYmUgYW4gQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBsaXN0aW5nIHdoaWNoCi1maWxlcyB0byBjcmVhdGUgd2hlbiB0aGUgYnVpbGRlciBydW5zIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgVGhpcyBmaWxlCi1pcyBhbHdheXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgR05VIGNvbmZpZ3VyZSBzeXN0ZW0uICBAeHJlZntXcml0ZQotY29uZmlndXJlLmlufS4KLQotQGl0ZW0gTWFrZWZpbGUuYW0KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuYW19Ci1UaGlzIGlzIHRoZSBhdXRvbWFrZSBpbnB1dCBmaWxlLiAgSXQgZGVzY3JpYmVzIGhvdyB0aGUgY29kZSBzaG91bGQgYmUKLWJ1aWx0LiAgSXQgY29uc2lzdHMgb2YgZGVmaW5pdGlvbnMgb2YgYXV0b21ha2UgdmFyaWFibGVzLiAgSXQgbWF5IGFsc28KLWNvbnRhaW4gb3JkaW5hcnkgTWFrZWZpbGUgdGFyZ2V0cy4gIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCB3aGVuIHVzaW5nCi1hdXRvbWFrZSAobmV3ZXIgdG9vbHMgbm9ybWFsbHkgdXNlIGF1dG9tYWtlLCBidXQgdGhlcmUgYXJlIHN0aWxsIG9sZGVyCi10b29scyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbnZlcnRlZCwgaW4gd2hpY2ggdGhlIGRldmVsb3BlciB3cml0ZXMKLUBmaWxle01ha2VmaWxlLmlufSBkaXJlY3RseSkuICBAeHJlZntXcml0ZSBNYWtlZmlsZS5hbX0uCi0KLUBpdGVtIGFjY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7YWNjb25maWcuaH0KLVdoZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY3JlYXRlcyBhIHBvcnRhYmlsaXR5IGhlYWRlciBmaWxlLCBieSB1c2luZwotQHNhbXB7QU1fQ09ORklHX0hFQURFUn0gKG9yLCBpZiBub3QgdXNpbmcgYXV0b21ha2UsCi1Ac2FtcHtBQ19DT05GSUdfSEVBREVSfSksIHRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlc2NyaWJlIG1hY3JvcyB3aGljaCBhcmUKLW5vdCByZWNvZ25pemVkIGJ5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBjb21tYW5kLiAgVGhpcyBpcyBub3JtYWxseSBhCi1mYWlybHkgdW5pbnRlcmVzdGluZyBmaWxlLCBjb25zaXN0aW5nIG9mIGEgY29sbGVjdGlvbiBvZiBAc2FtcHsjdW5kZWZ9Ci1saW5lcyB3aXRoIGNvbW1lbnRzLiAgTm9ybWFsbHkgYW55IGNhbGwgdG8gQHNhbXB7QUNfREVGSU5FfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufSB3aWxsIHJlcXVpcmUgYSBsaW5lIGluIHRoaXMgZmlsZS4gQHhyZWZ7V3JpdGUKLWFjY29uZmlnLmh9LgotCi1AaXRlbSBhY2luY2x1ZGUubTQKLUBjaW5kZXggQGZpbGV7YWNpbmNsdWRlLm00fQotVGhpcyBmaWxlIGlzIG5vdCBhbHdheXMgcmVxdWlyZWQuICBJdCBkZWZpbmVzIGxvY2FsIGF1dG9jb25mIG1hY3Jvcy4KLVRoZXNlIG1hY3JvcyBtYXkgdGhlbiBiZSB1c2VkIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBJZiB5b3UgZG9uJ3QgbmVlZAotYW55IGxvY2FsIGF1dG9jb25mIG1hY3JvcywgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZpbGUgYXQgYWxsLiAgSW4KLWZhY3QsIGluIGdlbmVyYWwsIHlvdSBuZXZlciBuZWVkIGxvY2FsIGF1dG9jb25mIG1hY3Jvcywgc2luY2UgeW91IGNhbgotcHV0IGV2ZXJ5dGhpbmcgaW4gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IHNvbWV0aW1lcyBhIGxvY2FsIG1hY3JvIGlzCi1jb252ZW5pZW50LgotCi1OZXdlciB0b29scyBtYXkgb21pdCBAZmlsZXthY2luY2x1ZGUubTR9LCBhbmQgaW5zdGVhZCB1c2UgYQotc3ViZGlyZWN0b3J5LCB0eXBpY2FsbHkgbmFtZWQgQGZpbGV7bTR9LCBhbmQgZGVmaW5lCi1Ac2FtcHtBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNH0gaW4gQGZpbGV7TWFrZWZpbGUuYW19IHRvIGZvcmNlCi1Ac2FtcHthY2xvY2FsfSB0byBsb29rIHRoZXJlIGZvciBtYWNybyBkZWZpbml0aW9ucy4gIFRoZSBtYWNybwotZGVmaW5pdGlvbnMgYXJlIHRoZW4gcGxhY2VkIGluIHNlcGFyYXRlIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7YWNpbmNsdWRlLm00fSBmaWxlIGlzIG9ubHkgdXNlZCB3aGVuIHVzaW5nIGF1dG9tYWtlOyBpbiBvbGRlcgotdG9vbHMsIHRoZSBkZXZlbG9wZXIgd3JpdGVzIEBmaWxle2FjbG9jYWwubTR9IGRpcmVjdGx5LCBpZiBpdCBpcyBuZWVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLQotVGhlIGZvbGxvd2luZyBmaWxlcyB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRldmVsb3Blci4KLQotV2hlbiB1c2luZyBhdXRvbWFrZSwgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IG5vdCBnZW5lcmF0ZWQgbWFudWFsbHkKLWFmdGVyIHRoZSBmaXJzdCB0aW1lLiAgSW5zdGVhZCwgdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gY29udGFpbnMKLXJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCB0aGUgZmlsZXMgYXMgcmVxdWlyZWQuICBXaGVuCi1Ac2FtcHtBTV9NQUlOVEFJTkVSX01PREV9IGlzIHVzZWQgaW4gQGZpbGV7Y29uZmlndXJlLmlufSAodGhlIG5vcm1hbAotY2FzZSBpbiBDeWdudXMgY29kZSksIHRoZSBhdXRvbWF0aWMgcmVidWlsZGluZyBydWxlcyB3aWxsIG9ubHkgYmUKLWRlZmluZWQgaWYgeW91IGNvbmZpZ3VyZSB1c2luZyB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfQotb3B0aW9uLgotCi1XaGVuIHVzaW5nIGF1dG9tYXRpYyByZWJ1aWxkaW5nLCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZQotdmFyaW91cyB0b29scyBoYXZlIGJlZW4gYnVpbHQgYW5kIGluc3RhbGxlZCBvbiB5b3VyIEBzYW1we1BBVEh9LiAgVXNpbmcKLWF1dG9tYXRpYyByZWJ1aWxkaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCwgc28gbXVjaCBzbyB0aGF0IEknbSBub3QKLWdvaW5nIHRvIGV4cGxhaW4gd2hhdCB5b3UgaGF2ZSB0byBkbyBpZiB5b3UgZG9uJ3QgdXNlIGl0LgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtjb25maWd1cmV9Ci1UaGlzIGlzIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoaWNoIHdpbGwgYmUgcnVuIHdoZW4gYnVpbGRpbmcgdGhlCi1wYWNrYWdlLiAgVGhpcyBpcyBnZW5lcmF0ZWQgYnkgQHNhbXB7YXV0b2NvbmZ9IGZyb20gQGZpbGV7Y29uZmlndXJlLmlufQotYW5kIEBmaWxle2FjbG9jYWwubTR9LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdC4KLQotQGl0ZW0gTWFrZWZpbGUuaW4KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuaW59Ci1UaGlzIGlzIHRoZSBmaWxlIHdoaWNoIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgdHVybiBpbnRvIHRoZQotQGZpbGV7TWFrZWZpbGV9IGF0IGJ1aWxkIHRpbWUuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5Ci1Ac2FtcHthdXRvbWFrZX0gZnJvbSBAZmlsZXtNYWtlZmlsZS5hbX0uICBJZiB5b3UgYXJlbid0IHVzaW5nIGF1dG9tYWtlLAoteW91IG11c3Qgd3JpdGUgdGhpcyBmaWxlIHlvdXJzZWxmLiAgVGhpcyBmaWxlIGlzIHByZXR0eSBtdWNoIGEgbm9ybWFsCi1AZmlsZXtNYWtlZmlsZX0sIHdpdGggc29tZSBjb25maWd1cmUgc3Vic3RpdHV0aW9ucyBmb3IgY2VydGFpbgotdmFyaWFibGVzLgotCi1AaXRlbSBhY2xvY2FsLm00Ci1AY2luZGV4IEBmaWxle2FjbG9jYWwubTR9Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSB0aGUgQHNhbXB7YWNsb2NhbH0gcHJvZ3JhbSwgYmFzZWQgb24gdGhlCi1jb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IGFuZCBAZmlsZXthY2luY2x1ZGUubTR9IChvciwgYXMgbm90ZWQgaW4KLXRoZSBkZXNjcmlwdGlvbiBvZiBAZmlsZXthY2luY2x1ZGUubTR9IGFib3ZlLCBvbiB0aGUgY29udGVudHMgb2YgYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnkpLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIGF1dG9jb25mCi1tYWNyb3Mgd2hpY2ggQHNhbXB7YXV0b2NvbmZ9IHdpbGwgdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgZmlsZQotQGZpbGV7Y29uZmlndXJlfS4gIFRoZXNlIGF1dG9jb25mIG1hY3JvcyBtYXkgYmUgZGVmaW5lZCBieSB5b3UgaW4KLUBmaWxle2FjaW5jbHVkZS5tNH0gb3IgdGhleSBtYXkgYmUgZGVmaW5lZCBieSBvdGhlciBwYWNrYWdlcyBzdWNoIGFzCi1hdXRvbWFrZSwgbGlidG9vbCBvciBnZXR0ZXh0LiAgSWYgeW91IGFyZW4ndCB1c2luZyBhdXRvbWFrZSwgeW91IHdpbGwKLW5vcm1hbGx5IHdyaXRlIHRoaXMgZmlsZSB5b3Vyc2VsZjsgaW4gdGhhdCBjYXNlLCBpZiBAZmlsZXtjb25maWd1cmUuaW59Ci11c2VzIG9ubHkgc3RhbmRhcmQgYXV0b2NvbmYgbWFjcm9zLCB0aGlzIGZpbGUgd2lsbCBub3QgYmUgbmVlZGVkIGF0IGFsbC4KLQotQGl0ZW0gY29uZmlnLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZy5pbn0KLUBjaW5kZXggQGZpbGV7Y29uZmlnLmguaW59Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSBAc2FtcHthdXRvaGVhZGVyfSBiYXNlZCBvbiBAZmlsZXthY2NvbmZpZy5ofSBhbmQKLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBBdCBidWlsZCB0aW1lLCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGRlZmluZQotc29tZSBvZiB0aGUgbWFjcm9zIGluIGl0IHRvIGNyZWF0ZSBAZmlsZXtjb25maWcuaH0sIHdoaWNoIG1heSB0aGVuIGJlCi1pbmNsdWRlZCBieSB5b3VyIHByb2dyYW0uICBUaGlzIHBlcm1pdHMgeW91ciBDIGNvZGUgdG8gdXNlIHByZXByb2Nlc3NvcgotY29uZGl0aW9uYWxzIHRvIGNoYW5nZSBpdHMgYmVoYXZpb3VyIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1ob3N0IHN5c3RlbS4gIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBjYWxsZWQgQGZpbGV7Y29uZmlnLmguaW59LgotCi1AaXRlbSBzdGFtcC5oLWluCi1AY2luZGV4IEBmaWxle3N0YW1wLWguaW59Ci1UaGlzIHJhdGhlciB1bmludGVyZXN0aW5nIGZpbGUsIHdoaWNoIEkgb21pdHRlZCBmcm9tIHRoZSBwaWN0dXJlLCBpcwotZ2VuZXJhdGVkIGJ5IEBzYW1we2F1dG9tYWtlfS4gIEl0IGFsd2F5cyBjb250YWlucyB0aGUgc3RyaW5nCi1Ac2FtcHt0aW1lc3RhbXB9LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmlufSBpcyB1cCB0byBkYXRlLiAgVXNpbmcgYSB0aW1lc3RhbXAgZmlsZSBtZWFucyB0aGF0Ci1AZmlsZXtjb25maWcuaW59IGNhbiBiZSBtYXJrZWQgYXMgdXAgdG8gZGF0ZSB3aXRob3V0IGFjdHVhbGx5IGNoYW5naW5nCi1pdHMgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaW59IGRlcGVuZHMKLXVwb24gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IGl0IGlzIGVhc3kgdG8gY2hhbmdlIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGFmZmVjdCBAZmlsZXtjb25maWcuaW59LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCdWlsZCBGaWxlcwotQHNlY3Rpb24gQnVpbGQgRmlsZXMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIGFuZAotYnVpbGQgdGltZS4gIFRoZXNlIGFyZSB0aGUgZmlsZXMgd2hpY2ggc29tZWJvZHkgd2hvIGJ1aWxkcyB0aGUgcGFja2FnZQotd2lsbCBzZWUuCi0KLU9mIGNvdXJzZSwgdGhlIGRldmVsb3BlciB3aWxsIGFsc28gYnVpbGQgdGhlIHBhY2thZ2UuICBUaGUgZGlzdGluY3Rpb24KLWJldHdlZW4gZGV2ZWxvcGVyIGZpbGVzIGFuZCBidWlsZCBmaWxlcyBpcyBub3QgdGhhdCB0aGUgZGV2ZWxvcGVyIGRvZXMKLW5vdCBzZWUgdGhlIGJ1aWxkIGZpbGVzLCBidXQgdGhhdCBzb21lYm9keSB3aG8gb25seSBidWlsZHMgdGhlIHBhY2thZ2UKLWRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGRldmVsb3BlciBmaWxlcy4KLQotQG1lbnUKLSogQnVpbGQgRmlsZXMgUGljdHVyZTo6CQlCdWlsZCBGaWxlcyBQaWN0dXJlLgotKiBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbjo6CUJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uLgotQGVuZCBtZW51Ci0KLUBub2RlIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLQotSGVyZSBpcyBhIHBpY3R1cmUgb2YgdGhlIGZpbGVzIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBhdCBidWlsZCB0aW1lLgotQGZpbGV7Y29uZmlnLnN0YXR1c30gaXMgYm90aCBhIGNyZWF0ZWQgZmlsZSBhbmQgYSBzaGVsbCBzY3JpcHQgd2hpY2ggaXMKLXJ1biB0byBjcmVhdGUgb3RoZXIgZmlsZXMsIGFuZCB0aGUgcGljdHVyZSBhdHRlbXB0cyB0byBzaG93IHRoYXQuCi0KLUBpbWFnZXtjb25maWdidWlsZH0KLQotQG5vZGUgQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uCi0KLVRoaXMgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgYnVpbGQgdGltZS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWcuc3RhdHVzCi1AY2luZGV4IEBmaWxle2NvbmZpZy5zdGF0dXN9Ci1UaGUgZmlyc3Qgc3RlcCBpbiBidWlsZGluZyBhIHBhY2thZ2UgaXMgdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHQuICBUaGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBjcmVhdGUgdGhlIGZpbGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9LCB3aGljaCBpcyBpdHNlbGYgYSBzaGVsbCBzY3JpcHQuICBXaGVuIHlvdSBmaXJzdAotcnVuIEBmaWxle2NvbmZpZ3VyZX0sIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4gQGZpbGV7Y29uZmlnLnN0YXR1c30uCi1BbiBAZmlsZXtNYWtlZmlsZX0gZGVyaXZlZCBmcm9tIGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZS5pbn0KLXdpbGwgY29udGFpbiBydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJ1biBAZmlsZXtjb25maWcuc3RhdHVzfSBhZ2FpbiB3aGVuCi1uZWNlc3NhcnkgdG8gcmVjcmVhdGUgY2VydGFpbiBmaWxlcyBpZiB0aGVpciBpbnB1dHMgY2hhbmdlLgotCi1AaXRlbSBNYWtlZmlsZQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZX0KLVRoaXMgaXMgdGhlIGZpbGUgd2hpY2ggbWFrZSB3aWxsIHJlYWQgdG8gYnVpbGQgdGhlIHByb2dyYW0uICBUaGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHNjcmlwdCB3aWxsIHRyYW5zZm9ybSBAZmlsZXtNYWtlZmlsZS5pbn0gaW50bwotQGZpbGV7TWFrZWZpbGV9LgotCi1AaXRlbSBjb25maWcuaAotQGNpbmRleCBAZmlsZXtjb25maWcuaH0KLVRoaXMgZmlsZSBkZWZpbmVzIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB3aGljaCBDIGNvZGUgY2FuIHVzZSB0byBhZGp1c3QKLWl0cyBiZWhhdmlvdXIgb24gZGlmZmVyZW50IHN5c3RlbXMuICBUaGUgQGZpbGV7Y29uZmlnLnN0YXR1c30gc2NyaXB0Ci13aWxsIHRyYW5zZm9ybSBAZmlsZXtjb25maWcuaW59IGludG8gQGZpbGV7Y29uZmlnLmh9LgotCi1AaXRlbSBjb25maWcuY2FjaGUKLUBjaW5kZXggQGZpbGV7Y29uZmlnLmNhY2hlfQotVGhpcyBmaWxlIGRpZCBub3QgZml0IG5lYXRseSBpbnRvIHRoZSBwaWN0dXJlLCBhbmQgSSBvbWl0dGVkIGl0LiAgSXQgaXMKLXVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNhY2hlIHJlc3VsdHMgYmV0d2VlbiBydW5zLiAgVGhpcwotY2FuIGJlIGFuIGltcG9ydGFudCBzcGVlZHVwLiAgSWYgeW91IG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59IGluIHN1Y2gKLWEgd2F5IHRoYXQgdGhlIHJlc3VsdHMgb2Ygb2xkIHRlc3RzIHNob3VsZCBjaGFuZ2UgKHBlcmhhcHMgeW91IGhhdmUKLWFkZGVkIGEgbmV3IGxpYnJhcnkgdG8gQHNhbXB7TERGTEFHU30pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gcmVtb3ZlCi1AZmlsZXtjb25maWcuY2FjaGV9IHRvIGZvcmNlIHRoZSB0ZXN0cyB0byBiZSByZXJ1bi4KLQotVGhlIGF1dG9jb25mIG1hbnVhbCBleHBsYWlucyBob3cgdG8gc2V0IHVwIGEgc2l0ZSBzcGVjaWZpYyBjYWNoZSBmaWxlLgotVGhpcyBjYW4gc3BlZWQgdXAgcnVubmluZyBAZmlsZXtjb25maWd1cmV9IHNjcmlwdHMgb24geW91ciBzeXN0ZW0uCi0KLUBpdGVtIHN0YW1wLmgKLUBjaW5kZXggQGZpbGV7c3RhbXAtaH0KLVRoaXMgZmlsZSwgd2hpY2ggSSBvbWl0dGVkIGZyb20gdGhlIHBpY3R1cmUsIGlzIHNpbWlsYXIgdG8KLUBmaWxle3N0YW1wLWguaW59LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmh9IGlzIHVwIHRvIGRhdGUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaH0KLWRlcGVuZHMgdXBvbiBAZmlsZXtjb25maWcuc3RhdHVzfSwgYnV0IGl0IGlzIGVhc3kgZm9yCi1AZmlsZXtjb25maWcuc3RhdHVzfSB0byBjaGFuZ2UgaW4gYSB3YXkgd2hpY2ggZG9lcyBub3QgYWZmZWN0Ci1AZmlsZXtjb25maWcuaH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1cHBvcnQgRmlsZXMKLUBzZWN0aW9uIFN1cHBvcnQgRmlsZXMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSByZXF1aXJlcyBzZXZlcmFsIHN1cHBvcnQgZmlsZXMgdG8gYmUKLWluY2x1ZGVkIHdpdGggeW91ciBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gY29uY2VybgoteW91cnNlbGYgd2l0aCB0aGVzZS4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCBtb3N0IGFyZSBhbHJlYWR5Ci1wcmVzZW50LiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkIHdpdGggeW91ciBzb3VyY2UgYnkKLUBzYW1we2F1dG9tYWtlfSAod2l0aCB0aGUgQHNhbXB7LS1hZGQtbWlzc2luZ30gb3B0aW9uKSBhbmQKLUBzYW1we2xpYnRvb2xpemV9LgotCi1Zb3UgZG9uJ3QgaGF2ZSB0byBwdXQgdGhlIHN1cHBvcnQgZmlsZXMgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuICBZb3UKLWNhbiBwdXQgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSwgYW5kIHVzZSB0aGUgQHNhbXB7QUNfQ09ORklHX0FVWF9ESVJ9Ci1tYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59IHRvIHRlbGwgQHNhbXB7YXV0b21ha2V9IGFuZCB0aGUKLUBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdoZXJlIHRoZXkgYXJlLgotCi1JbiB0aGlzIHNlY3Rpb24sIEkgZGVzY3JpYmUgdGhlIHN1cHBvcnQgZmlsZXMsIHNvIHRoYXQgeW91IGNhbiBrbm93IHdoYXQKLXRoZXkgYXJlIGFuZCB3aHkgdGhleSBhcmUgdGhlcmUuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gQUJPVVQtTkxTCi1BZGRlZCBieSBhdXRvbWFrZSBpZiB5b3UgYXJlIHVzaW5nIGdldHRleHQuICBUaGlzIGlzIGEgZG9jdW1lbnRhdGlvbgotZmlsZSBhYm91dCB0aGUgZ2V0dGV4dCBwcm9qZWN0LgotQGl0ZW0gYW5zaTJrbnIuYwotVXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IGlmIHlvdSBwdXQgQHNhbXB7YW5zaTJrbnJ9Ci1pbiBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBpbiBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIHBlcm1pdHMKLWNvbXBpbGluZyBBTlNJIEMgY29kZSB3aXRoIGEgSyZSIEMgY29tcGlsZXIuCi1AaXRlbSBhbnNpMmtuci4xCi1UaGUgbWFuIHBhZ2Ugd2hpY2ggZ29lcyB3aXRoIEBmaWxle2Fuc2kya25yLmN9LgotQGl0ZW0gY29uZmlnLmd1ZXNzCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24KLXdoaWNoIGl0IGlzIHJ1bi4KLUBpdGVtIGNvbmZpZy5zdWIKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNhbm9uaWNhbGl6ZXMgYSBjb25maWd1cmF0aW9uIG5hbWUgZW50ZXJlZCBieSBhCi11c2VyLgotQGl0ZW0gZWxpc3AtY29tcAotVXNlZCB0byBjb21waWxlIEVtYWNzIExJU1AgZmlsZXMuCi1AaXRlbSBpbnN0YWxsLXNoCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBpbnN0YWxscyBhIHByb2dyYW0uICBUaGlzIGlzIHVzZWQgaWYgdGhlIGNvbmZpZ3VyZQotc2NyaXB0IGNhbiBub3QgZmluZCBhbiBpbnN0YWxsIGJpbmFyeS4KLUBpdGVtIGx0Y29uZmlnCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGNvbmZpZ3VyZXMgbGlidG9vbCBmb3IKLXRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvbiB3aGljaCBpdCBpcyB1c2VkLgotQGl0ZW0gbHRtYWluLnNoCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIHRoZSBhY3R1YWwgbGlidG9vbCBzY3JpcHQgd2hpY2ggaXMgdXNlZCwgYWZ0ZXIKLWl0IGlzIGNvbmZpZ3VyZWQgYnkgQGZpbGV7bHRjb25maWd9IHRvIGJ1aWxkIGEgbGlicmFyeS4KLUBpdGVtIG1kYXRlLXNoCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gcHJldHR5Ci1wcmludCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlLiAgVGhpcyBpcyB1c2VkIHRvIG1haW50YWluIHZlcnNpb24KLW51bWJlcnMgZm9yIHRleGluZm8gZmlsZXMuCi1AaXRlbSBtaXNzaW5nCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGlmIHNvbWUgdG9vbCBpcyBtaXNzaW5nIGVudGlyZWx5LiAgVGhpcyBpcyB1c2VkIGJ5Ci1hbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIGF2b2lkIGNlcnRhaW4gc29ydHMgb2YKLXRpbWVzdGFtcCBwcm9ibGVtcy4KLUBpdGVtIG1raW5zdGFsbGRpcnMKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNyZWF0ZXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgcGFyZW50Ci1kaXJlY3Rvcmllcy4gIFRoaXMgaXMgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9Ci1kdXJpbmcgaW5zdGFsbGF0aW9uLgotQGl0ZW0gdGV4aW5mby50ZXgKLVJlcXVpcmVkIGlmIHlvdSBoYXZlIGFueSB0ZXhpbmZvIGZpbGVzLiAgVGhpcyBpcyB1c2VkIHdoZW4gY29udmVydGluZwotVGV4aW5mbyBmaWxlcyBpbnRvIERWSSB1c2luZyBAc2FtcHt0ZXhpMmR2aX0gYW5kIEBUZVh7fS4KLUBpdGVtIHlsd3JhcAotQSBzaGVsbCBzY3JpcHQgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIHJ1bgotcHJvZ3JhbXMgbGlrZSBAc2FtcHtiaXNvbn0sIEBzYW1we3lhY2N9LCBAc2FtcHtmbGV4fSwgYW5kIEBzYW1we2xleH0uCi1UaGVzZSBwcm9ncmFtcyBkZWZhdWx0IHRvIHByb2R1Y2luZyBvdXRwdXQgZmlsZXMgd2l0aCBhIGZpeGVkIG5hbWUsIGFuZAotdGhlIEBmaWxle3lsd3JhcH0gc2NyaXB0IHJ1bnMgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSB0byBhdm9pZCBmaWxlIG5hbWUKLWNvbmZsaWN0cyB3aGVuIHVzaW5nIGEgcGFyYWxsZWwgbWFrZSBwcm9ncmFtLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2hhcHRlciBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2luZGV4IGNvbmZpZ3VyYXRpb24gbmFtZXMKLUBjaW5kZXggY29uZmlndXJhdGlvbiB0cmlwbGV0cwotQGNpbmRleCB0cmlwbGV0cwotQGNpbmRleCBob3N0IG5hbWVzCi1AY2luZGV4IGhvc3QgdHJpcGxldHMKLUBjaW5kZXggY2Fub25pY2FsIHN5c3RlbSBuYW1lcwotQGNpbmRleCBzeXN0ZW0gbmFtZXMKLUBjaW5kZXggc3lzdGVtIHR5cGVzCi0KLVRoZSBHTlUgY29uZmlndXJlIHN5c3RlbSBuYW1lcyBhbGwgc3lzdGVtcyB1c2luZyBhIEBkZm57Y29uZmlndXJhdGlvbgotbmFtZX0uICBBbGwgc3VjaCBuYW1lcyB1c2VkIHRvIGJlIHRyaXBsZXRzICh0aGV5IG1heSBub3cgY29udGFpbiBmb3VyCi1wYXJ0cyBpbiBjZXJ0YWluIGNhc2VzKSwgYW5kIHRoZSB0ZXJtIEBkZm57Y29uZmlndXJhdGlvbiB0cmlwbGV0fSBpcwotc3RpbGwgc2Vlbi4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb246OglDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbi4KLSogVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lczo6CQlVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uCi1Ac2VjdGlvbiBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbgotCi1UaGlzIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi1AdmFye2NwdX0tQHZhcnttYW51ZmFjdHVyZXJ9LUB2YXJ7b3BlcmF0aW5nX3N5c3RlbX0uICBJbiBzb21lIGNhc2VzLAotdGhpcyBpcyBleHRlbmRlZCB0byBhIGZvdXIgcGFydCBmb3JtOgotQHZhcntjcHV9LUB2YXJ7bWFudWZhY3R1cmVyfS1AdmFye2tlcm5lbH0tQHZhcntvcGVyYXRpbmdfc3lzdGVtfS4KLQotV2hlbiB1c2luZyBhIGNvbmZpZ3VyYXRpb24gbmFtZSBpbiBhIGNvbmZpZ3VyZSBvcHRpb24sIGl0IGlzIG5vcm1hbGx5Ci1ub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYW4gZW50aXJlIG5hbWUuICBJbiBwYXJ0aWN1bGFyLCB0aGUKLUB2YXJ7bWFudWZhY3R1cmVyfSBmaWVsZCBpcyBvZnRlbiBvbWl0dGVkLCBsZWFkaW5nIHRvIHN0cmluZ3Mgc3VjaCBhcwotQHNhbXB7aTM4Ni1saW51eH0gb3IgQHNhbXB7c3BhcmMtc3Vub3N9LiAgVGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN1Yn0gd2lsbCB0cmFuc2xhdGUgdGhlc2Ugc2hvcnRlbmVkIHN0cmluZ3MgaW50byB0aGUKLWNhbm9uaWNhbCBmb3JtLiAgYXV0b2NvbmYgd2lsbCBhcnJhbmdlIGZvciBAZmlsZXtjb25maWcuc3VifSB0byBiZSBydW4KLWF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpcyBuZWVkZWQuCi0KLVRoZSBmaWVsZHMgb2YgYSBjb25maWd1cmF0aW9uIG5hbWUgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBjcHUKLVRoZSB0eXBlIG9mIHByb2Nlc3Nvci4gIFRoaXMgaXMgdHlwaWNhbGx5IHNvbWV0aGluZyBsaWtlIEBzYW1we2kzODZ9IG9yCi1Ac2FtcHtzcGFyY30uICBNb3JlIHNwZWNpZmljIHZhcmlhbnRzIGFyZSB1c2VkIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we21pcHNlbH0gdG8gaW5kaWNhdGUgYSBsaXR0bGUgZW5kaWFuIE1JUFMgcHJvY2Vzc29yLgotQGl0ZW0gbWFudWZhY3R1cmVyCi1BIHNvbWV3aGF0IGZyZWVmb3JtIGZpZWxkIHdoaWNoIGluZGljYXRlcyB0aGUgbWFudWZhY3R1cmVyIG9mIHRoZQotc3lzdGVtLiAgVGhpcyBpcyBvZnRlbiBzaW1wbHkgQHNhbXB7dW5rbm93bn0uICBPdGhlciBjb21tb24gc3RyaW5ncyBhcmUKLUBzYW1we3BjfSBmb3IgYW4gSUJNIFBDIGNvbXBhdGlibGUgc3lzdGVtLCBvciB0aGUgbmFtZSBvZiBhIHdvcmtzdGF0aW9uCi12ZW5kb3IsIHN1Y2ggYXMgQHNhbXB7c3VufS4KLUBpdGVtIG9wZXJhdGluZ19zeXN0ZW0KLVRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdoaWNoIGlzIHJ1biBvbiB0aGUgc3lzdGVtLiAgVGhpcyB3aWxsCi1iZSBzb21ldGhpbmcgbGlrZSBAc2FtcHtzb2xhcmlzMi41fSBvciBAc2FtcHtpcml4Ni4zfS4gIFRoZXJlIGlzIG5vCi1wYXJ0aWN1bGFyIHJlc3RyaWN0aW9uIG9uIHRoZSB2ZXJzaW9uIG51bWJlciwgYW5kIHN0cmluZ3MgbGlrZQotQHNhbXB7YWl4NC4xLjQuMH0gYXJlIHNlZW4uICBGb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCB3aGljaCBoYXMgbm8KLW9wZXJhdGluZyBzeXN0ZW0sIHRoaXMgZmllbGQgbm9ybWFsbHkgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9iamVjdCBmaWxlCi1mb3JtYXQsIHN1Y2ggYXMgQHNhbXB7ZWxmfSBvciBAc2FtcHtjb2ZmfS4KLUBpdGVtIGtlcm5lbAotVGhpcyBpcyB1c2VkIG1haW5seSBmb3IgR05VL0xpbnV4LiAgQSB0eXBpY2FsIEdOVS9MaW51eCBjb25maWd1cmF0aW9uCi1uYW1lIGlzIEBzYW1we2k1ODYtcGMtbGludXgtZ251bGliYzF9LiAgSW4gdGhpcyBjYXNlIHRoZSBrZXJuZWwsCi1Ac2FtcHtsaW51eH0sIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBAc2FtcHtnbnVsaWJjMX0uCi1AZW5kIHRhYmxlCi0KLVRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLmd1ZXNzfSB3aWxsIG5vcm1hbGx5IHByaW50IHRoZSBjb3JyZWN0Ci1jb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24gd2hpY2ggaXQgaXMgcnVuLiAgSXQgZG9lcyBieQotcnVubmluZyBAc2FtcHt1bmFtZX0gYW5kIGJ5IGV4YW1pbmluZyBvdGhlciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1zeXN0ZW0uCi0KLUJlY2F1c2UgQGZpbGV7Y29uZmlnLmd1ZXNzfSBjYW4gbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBjb25maWd1cmF0aW9uCi1uYW1lIGZvciBhIG1hY2hpbmUsIGl0IGlzIG5vcm1hbGx5IG9ubHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYQotY29uZmlndXJhdGlvbiBuYW1lIHdoZW4gYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlciBvciB3aGVuIGJ1aWxkaW5nIHVzaW5nCi1hIGNyb3NzLWNvbXBpbGVyLgotCi1Abm9kZSBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi1Ac2VjdGlvbiBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi0KLUEgY29uZmlndXJlIHNjcmlwdCB3aWxsIHNvbWV0aW1lcyBoYXZlIHRvIG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBhCi1jb25maWd1cmF0aW9uIG5hbWUuICBZb3Ugd2lsbCBuZWVkIHRvIGRvIHRoaXMgaWYgeW91IGhhdmUgdG8gY29tcGlsZQotY29kZSBkaWZmZXJlbnRseSBiYXNlZCBvbiBzb21ldGhpbmcgd2hpY2ggY2FuIG5vdCBiZSB0ZXN0ZWQgdXNpbmcgYQotc3RhbmRhcmQgYXV0b2NvbmYgZmVhdHVyZSB0ZXN0LgotCi1JdCBpcyBub3JtYWxseSBiZXR0ZXIgdG8gdGVzdCBmb3IgcGFydGljdWxhciBmZWF0dXJlcywgcmF0aGVyIHRoYW4gdG8KLXRlc3QgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGlzIGlzIGJlY2F1c2UgYXMgVW5peCBldm9sdmVzLAotZGlmZmVyZW50IHN5c3RlbXMgY29weSBmZWF0dXJlcyBmcm9tIG9uZSBhbm90aGVyLiAgRXZlbiBpZiB5b3UgbmVlZCB0bwotZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgotbmFtZSwgeW91IHNob3VsZCBkZWZpbmUgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIGZlYXR1cmUsIHJhdGhlciB0aGFuCi1kZWZpbmluZyBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFydGljdWxhciBzeXN0ZW0geW91IGFyZSBvbi4KLQotVGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBpcyBub3JtYWxseSBkb25lIHVzaW5nIGEgY2FzZSBzdGF0ZW1lbnQKLWluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGUgY2FzZSBzdGF0ZW1lbnQgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZQotdGhlIGZvbGxvd2luZywgYXNzdW1pbmcgdGhhdCBAc2FtcHtob3N0fSBpcyBhIHNoZWxsIHZhcmlhYmxlIGhvbGRpbmcgYQotY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSAod2hpY2ggd2lsbCBiZSB0aGUgY2FzZSBpZgotQGZpbGV7Y29uZmlndXJlLmlufSB1c2VzIHRoZSBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gb3IKLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IG1hY3JvKS4KLQotQHNtYWxsZXhhbXBsZQotY2FzZSAiJEB7aG9zdEB9IiBpbgotaVszNDU2XTg2LSotbGludXgtZ251KikgZG8gc29tZXRoaW5nIDs7Ci1zcGFyYyotc3VuLXNvbGFyaXMyLls1Njc4OV0qKSBkbyBzb21ldGhpbmcgOzsKLXNwYXJjKi1zdW4tc29sYXJpcyopIGRvIHNvbWV0aGluZyA7OwotbWlwcyotKi1lbGYqKSBkbyBzb21ldGhpbmcgOzsKLWVzYWMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUl0IGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgdG8gdXNlIEBzYW1weyp9IGFmdGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtCi1maWVsZCwgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5Ci1AZmlsZXtjb25maWcuZ3Vlc3N9LgotCi1JbiBtb3N0IGNhc2VzIHlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gbWF0Y2ggYSByYW5nZSBvZiBwcm9jZXNzb3IgdHlwZXMuCi1Gb3IgbW9zdCBwcm9jZXNzb3IgZmFtaWxpZXMsIGEgdHJhaWxpbmcgQHNhbXB7Kn0gc3VmZmljZXMsIGFzIGluCi1Ac2FtcHttaXBzKn0gYWJvdmUuICBGb3IgdGhlIGkzODYgZmFtaWx5LCBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mCi1Ac2FtcHtpWzM0NTZdODZ9IHN1ZmZpY2VzIGF0IHByZXNlbnQuICBGb3IgdGhlIG02OGsgZmFtaWx5LCB5b3Ugd2lsbAotbmVlZCBzb21ldGhpbmcgbGlrZSBAc2FtcHttNjgqfS4gIE9mIGNvdXJzZSwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIG1hdGNoCi1vbiB0aGUgcHJvY2Vzc29yLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgcmVwbGFjZSB0aGUgZW50aXJlIGZpZWxkIGJ5IGEKLUBzYW1weyp9LCBhcyBpbiBAc2FtcHsqLSotaXJpeCp9LgotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBUb29scwotQGNoYXB0ZXIgQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMKLUBjaW5kZXggY3Jvc3MgdG9vbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBjYW4gYmUgdXNlZCB0byBidWlsZCBAZGZue2Nyb3NzCi1jb21waWxhdGlvbn0gdG9vbHMuICBBIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wgaXMgYSB0b29sIHdoaWNoIHJ1bnMgb24KLW9uZSBzeXN0ZW0gYW5kIHByb2R1Y2VzIGNvZGUgd2hpY2ggcnVucyBvbiBhbm90aGVyIHN5c3RlbS4KLQotQG1lbnUKLSogQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHM6OgkJQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMuCi0qIEhvc3QgYW5kIFRhcmdldDo6CQkJSG9zdCBhbmQgVGFyZ2V0LgotKiBVc2luZyB0aGUgSG9zdCBUeXBlOjoJCQlVc2luZyB0aGUgSG9zdCBUeXBlLgotKiBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQ6OiAgICAgICAJU3BlY2lmeWluZyB0aGUgVGFyZ2V0LgotKiBVc2luZyB0aGUgVGFyZ2V0IFR5cGU6OgkJVXNpbmcgdGhlIFRhcmdldCBUeXBlLgotKiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWU6OglDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLUBlbmQgbWVudQotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cwotQHNlY3Rpb24gQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMKLQotQGNpbmRleCBjcm9zcyBjb21waWxlcgotQSBjb21waWxlciB3aGljaCBwcm9kdWNlcyBwcm9ncmFtcyB3aGljaCBydW4gb24gYSBkaWZmZXJlbnQgc3lzdGVtIGlzIGEKLWNyb3NzIGNvbXBpbGF0aW9uIGNvbXBpbGVyLCBvciBzaW1wbHkgYSBAZGZue2Nyb3NzIGNvbXBpbGVyfS4KLVNpbWlsYXJseSwgd2Ugc3BlYWsgb2YgY3Jvc3MgYXNzZW1ibGVycywgY3Jvc3MgbGlua2VycywgZXRjLgotCi1JbiB0aGUgbm9ybWFsIGNhc2UsIGEgY29tcGlsZXIgcHJvZHVjZXMgY29kZSB3aGljaCBydW5zIG9uIHRoZSBzYW1lCi1zeXN0ZW0gYXMgdGhlIG9uZSBvbiB3aGljaCB0aGUgY29tcGlsZXIgcnVucy4gIFdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvCi1kaXN0aW5ndWlzaCB0aGlzIGNhc2UgZnJvbSB0aGUgY3Jvc3MgY29tcGlsYXRpb24gY2FzZSwgc3VjaCBhIGNvbXBpbGVyCi1pcyBjYWxsZWQgYSBAZGZue25hdGl2ZSBjb21waWxlcn0uICBTaW1pbGFybHksIHdlIHNwZWFrIG9mIG5hdGl2ZQotYXNzZW1ibGVycywgZXRjLgotCi1BbHRob3VnaCB0aGUgZGVidWdnZXIgaXMgbm90IHN0cmljdGx5IHNwZWFraW5nIGEgY29tcGlsYXRpb24gdG9vbCwgaXQgaXMKLW5ldmVydGhlbGVzcyBtZWFuaW5nZnVsIHRvIHNwZWFrIG9mIGEgY3Jvc3MgZGVidWdnZXI6IGEgZGVidWdnZXIgd2hpY2gKLWlzIHVzZWQgdG8gZGVidWcgY29kZSB3aGljaCBydW5zIG9uIGFub3RoZXIgc3lzdGVtLiAgRXZlcnl0aGluZyB0aGF0IGlzCi1zYWlkIGJlbG93IGFib3V0IGNvbmZpZ3VyaW5nIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzIGFwcGxpZXMgdG8gdGhlCi1kZWJ1Z2dlciBhcyB3ZWxsLgotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQKLUBzZWN0aW9uIEhvc3QgYW5kIFRhcmdldAotQGNpbmRleCBob3N0IHN5c3RlbQotQGNpbmRleCB0YXJnZXQgc3lzdGVtCi0KLVdoZW4gYnVpbGRpbmcgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHN5c3RlbXMKLWludm9sdmVkOiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biwgYW5kIHRoZSBzeXN0ZW0gZm9yCi13aGljaCB0aGUgdG9vbHMgZ2VuZXJhdGUgY29kZS4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4gaXMgY2FsbGVkIHRoZSBAZGZue2hvc3R9IHN5c3RlbS4KLQotVGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhlIHRvb2xzIGdlbmVyYXRlIGNvZGUgaXMgY2FsbGVkIHRoZSBAZGZue3RhcmdldH0KLXN5c3RlbS4KLQotRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBjb21waWxlciB3aGljaCBydW5zIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0gYW5kIGdlbmVyYXRlcyBFTEYgcHJvZ3JhbXMgZm9yIGEgTUlQUyBlbWJlZGRlZCBzeXN0ZW0uICBJbiB0aGlzCi1jYXNlIHRoZSBHTlUvTGludXggc3lzdGVtIGlzIHRoZSBob3N0LCBhbmQgdGhlIE1JUFMgRUxGIHN5c3RlbSBpcyB0aGUKLXRhcmdldC4gIFN1Y2ggYSBjb21waWxlciBjb3VsZCBiZSBjYWxsZWQgYSBHTlUvTGludXggY3Jvc3MgTUlQUyBFTEYKLWNvbXBpbGVyLCBvciwgZXF1aXZhbGVudGx5LCBhIEBzYW1we2kzODYtbGludXgtZ251fSBjcm9zcwotQHNhbXB7bWlwcy1lbGZ9IGNvbXBpbGVyLgotCi1OYXR1cmFsbHksIG1vc3QgcHJvZ3JhbXMgYXJlIG5vdCBjcm9zcyBjb21waWxhdGlvbiB0b29scy4gIEZvciB0aG9zZQotcHJvZ3JhbXMsIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gc3BlYWsgb2YgYSB0YXJnZXQuICBJdCBvbmx5IG1ha2VzCi1zZW5zZSB0byBzcGVhayBvZiBhIHRhcmdldCBmb3IgdG9vbHMgbGlrZSBAc2FtcHtnY2N9IG9yIHRoZQotQHNhbXB7YmludXRpbHN9IHdoaWNoIGFjdHVhbGx5IHByb2R1Y2UgcnVubmluZyBjb2RlLiAgRm9yIGV4YW1wbGUsIGl0Ci1kb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNwZWFrIG9mIHRoZSB0YXJnZXQgb2YgYSB0b29sIGxpa2UgQHNhbXB7Ymlzb259Ci1vciBAc2FtcHttYWtlfS4KLQotTW9zdCBjcm9zcyBjb21waWxhdGlvbiB0b29scyBjYW4gYWxzbyBzZXJ2ZSBhcyBuYXRpdmUgdG9vbHMuICBGb3IgYQotbmF0aXZlIGNvbXBpbGF0aW9uIHRvb2wsIGl0IGlzIHN0aWxsIG1lYW5pbmdmdWwgdG8gc3BlYWsgb2YgYSB0YXJnZXQuCi1Gb3IgYSBuYXRpdmUgdG9vbCwgdGhlIHRhcmdldCBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdC4gIEZvciBleGFtcGxlLCBmb3IKLWEgR05VL0xpbnV4IG5hdGl2ZSBjb21waWxlciwgdGhlIGhvc3QgaXMgR05VL0xpbnV4LCBhbmQgdGhlIHRhcmdldCBpcwotYWxzbyBHTlUvTGludXguCi0KLUBub2RlIFVzaW5nIHRoZSBIb3N0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBIb3N0IFR5cGUKLQotSW4gYWxtb3N0IGFsbCBjYXNlcyB0aGUgaG9zdCBzeXN0ZW0gaXMgdGhlIHN5c3RlbSBvbiB3aGljaCB5b3UgcnVuIHRoZQotQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBvbiB3aGljaCB5b3UgYnVpbGQgdGhlIHRvb2xzIChmb3IgdGhlIGNhc2UKLXdoZW4gdGhleSBkaWZmZXIsIEBweHJlZntDYW5hZGlhbiBDcm9zc30pLgotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfQotSWYgeW91ciBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGtub3cgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUKLWhvc3Qgc3lzdGVtLCBhbmQgdGhlIHBhY2thZ2UgaXMgbm90IGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCBhbmQKLXRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIGEgdGFyZ2V0LCBwdXQgQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBtYWNybyB3aWxsIGFycmFuZ2UgdG8gZGVmaW5lIGEgZmV3IHNoZWxsCi12YXJpYWJsZXMgd2hlbiB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgaXMgcnVuLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGhvc3QKLVRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBob3N0LiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlCi1kZXRlcm1pbmVkIGJ5IHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbHRob3VnaCB0aGUKLXVzZXIgaXMgcGVybWl0dGVkIHRvIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fQotb3B0aW9uLgotQGl0ZW0gaG9zdF9hbGlhcwotSW4gdGhlIHVudXN1YWwgY2FzZSB0aGF0IHRoZSB1c2VyIHVzZWQgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sCi10aGlzIHdpbGwgYmUgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0taG9zdH0uICBJbiB0aGUgbm9ybWFsIGNhc2UsIHRoaXMKLXdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIEBzYW1we2hvc3R9IHZhcmlhYmxlLgotQGl0ZW0gaG9zdF9jcHUKLUBpdGVteCBob3N0X3ZlbmRvcgotQGl0ZW14IGhvc3Rfb3MKLVRoZSBmaXJzdCB0aHJlZSBwYXJ0cyBvZiB0aGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZS4KLUBlbmQgdGFibGUKLQotVGhlIHNoZWxsIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCBieSBwdXR0aW5nIHNoZWxsIGNvZGUgaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBGb3IgYW4gZXhhbXBsZSwgc2VlIEByZWZ7VXNpbmcgQ29uZmlndXJhdGlvbgotTmFtZXN9LgotCi1Abm9kZSBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQKLUBzZWN0aW9uIFNwZWNpZnlpbmcgdGhlIFRhcmdldAotCi1CeSBkZWZhdWx0LCB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzCi10aGUgc2FtZSBhcyB0aGUgaG9zdC4gIFRoaXMgaXMgdGhlIG1vcmUgY29tbW9uIGNhc2U7IGZvciBleGFtcGxlLCBpdAotbGVhZHMgdG8gYSBuYXRpdmUgY29tcGlsZXIgcmF0aGVyIHRoYW4gYSBjcm9zcyBjb21waWxlci4KLQotQGNpbmRleCBAc2FtcHstLXRhcmdldH0gb3B0aW9uCi1AY2luZGV4IHRhcmdldCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIHRhcmdldAotSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZQotdGFyZ2V0IGV4cGxpY2l0bHkgYnkgdXNpbmcgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2hlbiB5b3UgcnVuCi1Ac2FtcHtjb25maWd1cmV9LiAgVGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fSBpcyB0aGUgY29uZmlndXJhdGlvbgotbmFtZSBvZiB0aGUgc3lzdGVtIGZvciB3aGljaCB5b3Ugd2lzaCB0byBnZW5lcmF0ZSBjb2RlLgotQHhyZWZ7Q29uZmlndXJhdGlvbiBOYW1lc30uCi0KLUZvciBleGFtcGxlLCB0byBidWlsZCB0b29scyB3aGljaCBnZW5lcmF0ZSBjb2RlIGZvciBhIE1JUFMgRUxGIGVtYmVkZGVkCi1zeXN0ZW0sIHlvdSB3b3VsZCB1c2UgQHNhbXB7LS10YXJnZXQgbWlwcy1lbGZ9LgotCi1Abm9kZSBVc2luZyB0aGUgVGFyZ2V0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBUYXJnZXQgVHlwZQotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19Ci1XaGVuIHdyaXRpbmcgQGZpbGV7Y29uZmlndXJlLmlufSBmb3IgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3Ugd2lsbAotbmVlZCB0byB1c2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldC4gIFRvIGRvIHRoaXMsIHB1dAotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufS4KLQotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gd2lsbCBsb29rIGZvciBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYW5kCi1jYW5vbmljYWxpemUgaXQgdXNpbmcgdGhlIEBmaWxle2NvbmZpZy5zdWJ9IHNoZWxsIHNjcmlwdC4gIEl0IHdpbGwgYWxzbwotcnVuIEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSAoQHB4cmVme1VzaW5nIHRoZSBIb3N0IFR5cGV9KS4KLQotVGhlIHRhcmdldCB0eXBlIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXMuICBOb3RlCi10aGF0IHRoZSBob3N0IHZlcnNpb25zIG9mIHRoZXNlIHZhcmlhYmxlcyB3aWxsIGFsc28gYmUgZGVmaW5lZCBieQotQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9LgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHRhcmdldAotVGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHRhcmdldC4KLUBpdGVtIHRhcmdldF9hbGlhcwotVGhlIGFyZ3VtZW50IHRvIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLiAgSWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5Ci1hIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBAc2FtcHtob3N0X2FsaWFzfS4KLUBpdGVtIHRhcmdldF9jcHUKLUBpdGVteCB0YXJnZXRfdmVuZG9yCi1AaXRlbXggdGFyZ2V0X29zCi1UaGUgZmlyc3QgdGhyZWUgcGFydHMgb2YgdGhlIGNhbm9uaWNhbCB0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lLgotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgaWYgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0gYXJlIHRoZSBzYW1lIHN0cmluZywgeW91IGNhbgotYXNzdW1lIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24uICBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHlvdSBjYW4gYXNzdW1lIGEKLWNyb3NzIGNvbmZpZ3VyYXRpb24uCi0KLUl0IGlzIGFyZ3VhYmx5IHBvc3NpYmxlIGZvciBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSB0byByZXByZXNlbnQKLXRoZSBzYW1lIHN5c3RlbSwgYnV0IGZvciB0aGUgc3RyaW5ncyB0byBub3QgYmUgaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsCi1pZiBAc2FtcHtjb25maWcuZ3Vlc3N9IHJldHVybnMgQHNhbXB7c3BhcmMtc3VuLXN1bm9zNC4xLjR9LCBhbmQgc29tZWJvZHkKLWNvbmZpZ3VyZXMgd2l0aCBAc2FtcHstLXRhcmdldCBzcGFyYy1zdW4tc3Vub3M0LjF9LCB0aGVuIHRoZSBzbGlnaHQKLWRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucyBvZiBTdW5PUyBtYXkgYmUgdW5pbXBvcnRhbnQgZm9yCi15b3VyIHRvb2wuICBIb3dldmVyLCBpbiB0aGUgZ2VuZXJhbCBjYXNlIGl0IGNhbiBiZSBxdWl0ZSBkaWZmaWN1bHQgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBjb25maWd1cmF0aW9uIG5hbWVzIGFyZQotc2lnbmlmaWNhbnQgb3Igbm90LiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUgdXNlciBzcGVjaWZpZXMgYQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3aXRob3V0IHNwZWNpZnlpbmcgYSBAc2FtcHstLWhvc3R9IG9wdGlvbiwgaXQgaXMKLWFzc3VtZWQgdGhhdCB0aGUgdXNlciB3YW50cyB0byBjb25maWd1cmUgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLgotCi1UaGUgdmFyaWFibGVzIEBzYW1we3RhcmdldH0gYW5kIEBzYW1we3RhcmdldF9hbGlhc30gc2hvdWxkIGJlIGhhbmRsZWQKLWRpZmZlcmVudGx5LgotCi1JbiBnZW5lcmFsLCB3aGVuZXZlciB0aGUgdXNlciBtYXkgYWN0dWFsbHkgc2VlIGEgc3RyaW5nLAotQHNhbXB7dGFyZ2V0X2FsaWFzfSBzaG91bGQgYmUgdXNlZC4gIFRoaXMgaW5jbHVkZXMgYW55dGhpbmcgd2hpY2ggbWF5Ci1hcHBlYXIgaW4gdGhlIGZpbGUgc3lzdGVtLCBzdWNoIGFzIGEgZGlyZWN0b3J5IG5hbWUgb3IgcGFydCBvZiBhIHRvb2wKLW5hbWUuICBJdCBhbHNvIGluY2x1ZGVzIGFueSB0b29sIG91dHB1dCwgdW5sZXNzIGl0IGlzIGNsZWFybHkgbGFiZWxsZWQKLWFzIHRoZSBjYW5vbmljYWwgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZS4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0bwotdXNlIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIHRvIHNwZWNpZnkgaG93IHRoZSB0b29sIHdpbGwgYXBwZWFyIHRvCi10aGUgb3V0c2lkZSB3b3JsZC4KLQotT24gdGhlIG90aGVyIGhhbmQsIHdoZW4gY2hlY2tpbmcgZm9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdGFyZ2V0Ci1zeXN0ZW0sIEBzYW1we3RhcmdldH0gc2hvdWxkIGJlIHVzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSB3aWRlIHZhcmlldHkgb2YKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb25zIG1heSBtYXAgaW50byB0aGUgc2FtZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbgotbmFtZS4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gZHVwbGljYXRlIHRoZSBjYW5vbmljYWxpemF0aW9uIGRvbmUgYnkKLUBzYW1we2NvbmZpZy5zdWJ9IGluIHlvdXIgb3duIGNvZGUuCi0KLUJ5IGNvbnZlbnRpb24sIGNyb3NzIHRvb2xzIGFyZSBpbnN0YWxsZWQgd2l0aCBhIHByZWZpeCBvZiB0aGUgYXJndW1lbnQKLXVzZWQgd2l0aCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYWxzbyBrbm93biBhcyBAc2FtcHt0YXJnZXRfYWxpYXN9Ci0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgSWYgdGhlIHVzZXIgZG9lcyBub3QgdXNlIHRoZQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYW5kIHRodXMgaXMgYnVpbGRpbmcgYSBuYXRpdmUgdG9vbCwgbm8gcHJlZml4IGlzCi11c2VkLgotCi1Gb3IgZXhhbXBsZSwgaWYgZ2NjIGlzIGNvbmZpZ3VyZWQgd2l0aCBAc2FtcHstLXRhcmdldCBtaXBzLWVsZn0sIHRoZW4KLXRoZSBpbnN0YWxsZWQgYmluYXJ5IHdpbGwgYmUgbmFtZWQgQHNhbXB7bWlwcy1lbGYtZ2NjfS4gIElmIGdjYyBpcwotY29uZmlndXJlZCB3aXRob3V0IGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgdGhlbiB0aGUgaW5zdGFsbGVkIGJpbmFyeQotd2lsbCBiZSBuYW1lZCBAc2FtcHtnY2N9LgotCi1UaGUgYXV0b2NvbmYgbWFjcm8gQHNhbXB7QUNfQVJHX1BST0dSQU19IHdpbGwgaGFuZGxlIHRoaXMgZm9yIHlvdS4gIElmCi15b3UgYXJlIHVzaW5nIGF1dG9tYWtlLCBubyBtb3JlIG5lZWQgYmUgZG9uZTsgdGhlIHByb2dyYW1zIHdpbGwKLWF1dG9tYXRpY2FsbHkgYmUgaW5zdGFsbGVkIHdpdGggdGhlIGNvcnJlY3QgcHJlZml4ZXMuICBPdGhlcndpc2UsIHNlZQotdGhlIGF1dG9jb25mIGRvY3VtZW50YXRpb24gZm9yIEBzYW1we0FDX0FSR19QUk9HUkFNfS4KLQotQG5vZGUgQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLQotVGhlIEN5Z251cyB0cmVlIGlzIHVzZWQgZm9yIHZhcmlvdXMgcGFja2FnZXMgaW5jbHVkaW5nIGdkYiwgdGhlIEdOVQotYmludXRpbHMsIGFuZCBlZ2NzLiAgSXQgaXMgYWxzbywgb2YgY291cnNlLCB1c2VkIGZvciBDeWdudXMgcmVsZWFzZXMuCi0KLUluIHRoZSBDeWdudXMgdHJlZSwgdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB1c2VzIHRoZSBvbGQKLUN5Z251cyBjb25maWd1cmUgc3lzdGVtLCBub3QgYXV0b2NvbmYuICBUaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlLmlufQotaXMgd3JpdHRlbiB0byBidWlsZCBwYWNrYWdlcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBzb3VyY2UgdHJlZSwgYW5kCi1zdXBwb3J0cyBidWlsZGluZyBhIGxhcmdlIG51bWJlciBvZiB0b29scyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLgotCi1UaGUgQ3lnbnVzIHRyZWUgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24uICBUaGUKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYXBwbGllcyByZWN1cnNpdmVseSB0byBldmVyeSBzdWJkaXJlY3RvcnksIGFuZAotcGVybWl0cyBidWlsZGluZyBhbiBlbnRpcmUgc2V0IG9mIGNyb3NzIHRvb2xzIGF0IG9uY2UuCi0KLUBtZW51Ci0qIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXM6OgkJSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcy4KLSogVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHM6OglUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cy4KLSogTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlOjogICAgICAgICBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUuCi0qIFRhcmdldCBsaWJpYmVydHk6OgkJCVRhcmdldCBsaWJpYmVydHkKLUBlbmQgbWVudQotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi1Ac3Vic2VjdGlvbiBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi0KLVRoZSBDeWdudXMgdHJlZSBkaXN0aW5ndWlzaGVzIGhvc3QgbGlicmFyaWVzIGZyb20gdGFyZ2V0IGxpYnJhcmllcy4KLQotSG9zdCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggdGhlIGNvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW1zCi13aGljaCBydW4gb24gdGhlIGhvc3QsIHdoaWNoIGlzIGNhbGxlZCB0aGUgaG9zdCBjb21waWxlci4gIFRoaXMgaW5jbHVkZXMKLWxpYnJhcmllcyBzdWNoIGFzIEBzYW1we2JmZH0gYW5kIEBzYW1we3RjbH0uICBUaGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0Ci13aXRoIHRoZSBob3N0IGNvbXBpbGVyLCBhbmQgYXJlIGxpbmtlZCBpbnRvIHByb2dyYW1zIGxpa2UgdGhlIGJpbnV0aWxzCi1vciBnY2Mgd2hpY2ggcnVuIG9uIHRoZSBob3N0LgotCi1UYXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuICBJZiBnY2MgaXMgcHJlc2VudAotaW4gdGhlIHNvdXJjZSB0cmVlLCB0aGVuIHRoZSB0YXJnZXQgY29tcGlsZXIgaXMgdGhlIGdjYyB0aGF0IGlzIGJ1aWx0Ci11c2luZyB0aGUgaG9zdCBjb21waWxlci4gIFRhcmdldCBsaWJyYXJpZXMgYXJlIGxpYnJhcmllcyBzdWNoIGFzCi1Ac2FtcHtuZXdsaWJ9IGFuZCBAc2FtcHtsaWJzdGRjKyt9LiAgVGhlc2UgbGlicmFyaWVzIGFyZSBub3QgbGlua2VkIGludG8KLXRoZSBob3N0IHByb2dyYW1zLCBidXQgYXJlIGluc3RlYWQgbWFkZSBhdmFpbGFibGUgZm9yIHVzZSB3aXRoIHByb2dyYW1zCi1idWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuCi0KLUZvciB0aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIGFzc3VtZSB0aGF0IGdjYyBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UKLXRyZWUsIHNvIHRoYXQgaXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1UaGVyZSBpcyBhIGNvbXBsaWNhdGlvbiBoZXJlLiAgVGhlIGNvbmZpZ3VyZSBwcm9jZXNzIG5lZWRzIHRvIGtub3cgd2hpY2gKLWNvbXBpbGVyIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRvIGJ1aWxkIGEgdG9vbDsgb3RoZXJ3aXNlLCB0aGUgZmVhdHVyZQotdGVzdHMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICBUaGUgQ3lnbnVzIHRyZWUgaGFuZGxlcyB0aGlzIGJ5IG5vdAotY29uZmlndXJpbmcgdGhlIHRhcmdldCBsaWJyYXJpZXMgdW50aWwgdGhlIHRhcmdldCBjb21waWxlciBpcyBidWlsdC4gIEluCi1vcmRlciB0byBwZXJtaXQgZXZlcnl0aGluZyB0byBidWlsZCB1c2luZyBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhcmdldCBsaWJyYXJpZXMKLWlzIGFjdHVhbGx5IHRyaWdnZXJlZCBkdXJpbmcgdGhlIG1ha2Ugc3RlcC4KLQotV2hlbiB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCwgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gaXMKLW5vdCB1c2VkLiAgSW5zdGVhZCwgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQgd2l0aCB0aGUgYXJndW1lbnQKLW9mIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGZvciB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLiAgSWYgbm8KLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2FzIHVzZWQgZm9yIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24sIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24gd2lsbCBiZSBwYXNzZWQgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZQotQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQuICBBbnkgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIHBhc3NlZAotZG93biB1bmNoYW5nZWQuCi0KLVRoaXMgdHJhbnNsYXRpb24gb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGlzIGRvbmUgYmVjYXVzZSBzaW5jZSB0aGUKLXRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbXBpbGVkIHdpdGggdGhlIHRhcmdldCBjb21waWxlciwgdGhleSBhcmUgYmVpbmcKLWJ1aWx0IGluIG9yZGVyIHRvIHJ1biBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uICBCeQotdGhlIGRlZmluaXRpb24gb2YgaG9zdCwgdGhpcyBtZWFucyB0aGF0IHRoZWlyIGhvc3Qgc3lzdGVtIGlzIHRoZSBzYW1lIGFzCi10aGUgdGFyZ2V0IHN5c3RlbSBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLgotCi1UaGUgc2FtZSBwcm9jZXNzIGlzIHVzZWQgZm9yIGJvdGggYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEV2ZW4gd2hlbiB1c2luZyBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMgd2lsbCBiZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyB0aGUgbmV3bHkgYnVpbHQgY29tcGlsZXIuCi1UaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIHRoZSBDKysgbGlicmFyaWVzLCBzaW5jZSB0aGVyZSBpcyBubwotcmVhc29uIHRvIGFzc3VtZSB0aGF0IHRoZSBDKysgY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgaG9zdCB0b29scyAoaWYKLXRoZXJlIGV2ZW4gaXMgb25lKSB1c2VzIHRoZSBzYW1lIEFCSSBhcyB0aGUgZysrIGNvbXBpbGVyIHdoaWNoIHdpbGwgYmUKLXVzZWQgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi0KLVRoZXJlIGlzIG9uZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZQotbm9ybWFsbHkgY29uZmlndXJlZCBhbmQgYnVpbHQgYXMgc2libGluZ3Mgb2YgdGhlIGhvc3QgdG9vbHMuICBJbiBhIGNyb3NzCi1jb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgbm9ybWFsbHkgYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkKLXdob3NlIG5hbWUgaXMgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fS4gIFRoaXMgaXMgbWFpbmx5IGZvcgotaGlzdG9yaWNhbCByZWFzb25zLgotCi1UbyBzdW1tYXJpemUsIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgY29uZmlndXJlcyBhbGwKLXRoZSBob3N0IGxpYnJhcmllcyBhbmQgdG9vbHMsIGJ1dCBkb2VzIG5vdCBjb25maWd1cmUgYW55IG9mIHRoZSB0YXJnZXQKLWxpYnJhcmllcy4gIFJ1bm5pbmcgQHNhbXB7bWFrZX0gdGhlbiBkb2VzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1CdWlsZCB0aGUgaG9zdCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIGhvc3QgcHJvZ3JhbXMsIGluY2x1ZGluZyBnY2MuICBOb3RlIHRoYXQgd2UgY2FsbCBnY2MgYm90aCBhCi1ob3N0IHByb2dyYW0gKHNpbmNlIGl0IHJ1bnMgb24gdGhlIGhvc3QpIGFuZCBhIHRhcmdldCBjb21waWxlciAoc2luY2UgaXQKLWdlbmVyYXRlcyBjb2RlIGZvciB0aGUgdGFyZ2V0KS4KLUBpdGVtCi1Vc2luZyB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0IGNvbXBpbGVyLCBjb25maWd1cmUgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhlIHN0ZXBzIG5lZWQgbm90IGJlIGRvbmUgaW4gcHJlY2lzZWx5IHRoaXMgb3JkZXIsIHNpbmNlIHRoZXkgYXJlCi1hY3R1YWxseSBjb250cm9sbGVkIGJ5IEBmaWxle01ha2VmaWxlfSB0YXJnZXRzLgotCi1Abm9kZSBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cwotQHN1YnNlY3Rpb24gVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMKLQotVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB5b3UgbXVzdCBrbm93IGluIG9yZGVyIHRvIHdyaXRlIGEgY29uZmlndXJlCi1zY3JpcHQgZm9yIGEgdGFyZ2V0IGxpYnJhcnkuICBUaGlzIGlzIGp1c3QgYSBxdWljayBza2V0Y2gsIGFuZCBiZWdpbm5lcnMKLXNob3VsZG4ndCB3b3JyeSBpZiB0aGV5IGRvbid0IGZvbGxvdyBldmVyeXRoaW5nIGhlcmUuCi0KLVRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyBhIG5ld2x5IGJ1aWx0IHRhcmdldAotY29tcGlsZXIuICBUaGVyZSBtYXkgbm90IGJlIGFueSBzdGFydHVwIGZpbGVzIG9yIGxpYnJhcmllcyBmb3IgdGhpcwotdGFyZ2V0IGNvbXBpbGVyLiAgSW4gZmFjdCwgdGhvc2UgZmlsZXMgd2lsbCBwcm9iYWJseSBiZSBidWlsdCBhcyBwYXJ0IG9mCi1zb21lIHRhcmdldCBsaWJyYXJ5LCB3aGljaCBuYXR1cmFsbHkgbWVhbnMgdGhhdCB0aGV5IHdpbGwgbm90IGV4aXN0IHdoZW4KLXlvdXIgdGFyZ2V0IGxpYnJhcnkgaXMgY29uZmlndXJlZC4KLQotVGhpcyBtZWFucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBhIHRhcmdldCBsaWJyYXJ5IG1heSBub3QgdXNlCi1hbnkgdGVzdCB3aGljaCByZXF1aXJlcyBkb2luZyBhIGxpbmsuICBUaGlzIHVuZm9ydHVuYXRlbHkgaW5jbHVkZXMgbWFueQotdXNlZnVsIGF1dG9jb25mIG1hY3Jvcywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19GVU5DU30uICBhdXRvY29uZiBtYWNyb3MKLXdoaWNoIGRvIGEgY29tcGlsZSBidXQgbm90IGEgbGluaywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19IRUFERVJTfSwgbWF5Ci1iZSB1c2VkLgotCi1UaGlzIGlzIGEgc2V2ZXJlIHJlc3RyaWN0aW9uLCBidXQgbm9ybWFsbHkgbm90IGEgZmF0YWwgb25lLCBhcyB0YXJnZXQKLWxpYnJhcmllcyBjYW4gb2Z0ZW4gYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBvdGhlciB0YXJnZXQgbGlicmFyaWVzLCBhbmQKLXRodXMga25vdyB3aGljaCBmdW5jdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUuCi0KLUFzIG9mIHRoaXMgd3JpdGluZywgdGhlIGF1dG9jb25mIG1hY3JvIEBzYW1we0FDX1BST0dfQ0N9IGRvZXMgYSBsaW5rIHRvCi1tYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgd29ya3MuICBUaGlzIG1heSBmYWlsIGluIGEgdGFyZ2V0IGxpYnJhcnksCi1zbyB0YXJnZXQgbGlicmFyaWVzIG11c3QgdXNlIGEgZGlmZmVyZW50IHNldCBvZiBtYWNyb3MgdG8gbG9jYXRlIHRoZQotY29tcGlsZXIuICBTZWUgdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpbiBhIGRpcmVjdG9yeSBsaWtlCi1AZmlsZXtsaWJpYmVydHl9IG9yIEBmaWxle2xpYmdsb3NzfSBmb3IgYW4gZXhhbXBsZS4KLQotQXMgbm90ZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRhcmdldCBsaWJyYXJpZXMgYXJlIHNvbWV0aW1lcyBidWlsdAotaW4gZGlyZWN0b3JpZXMgd2hpY2ggYXJlIHNpYmxpbmdzIHRvIHRoZSBob3N0IHRvb2xzLCBhbmQgYXJlIHNvbWV0aW1lcwotYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkuICBUaGUgQHNhbXB7LS13aXRoLXRhcmdldC1zdWJkaXJ9IGNvbmZpZ3VyZQotb3B0aW9uIHdpbGwgYmUgcGFzc2VkIHdoZW4gdGhlIGxpYnJhcnkgaXMgY29uZmlndXJlZC4gIEl0cyB2YWx1ZSB3aWxsIGJlCi1hbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHRhcmdldCBsaWJyYXJ5IGlzIGEgc2libGluZy4gIEl0cyB2YWx1ZSB3aWxsIGJlCi10aGUgbmFtZSBvZiB0aGUgc3ViZGlyZWN0b3J5IGlmIHRoZSB0YXJnZXQgbGlicmFyeSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLQotSWYgdGhlIG92ZXJhbGwgYnVpbGQgaXMgbm90IGEgbmF0aXZlIGJ1aWxkIChpLmUuLCB0aGUgb3ZlcmFsbCBjb25maWd1cmUKLXVzZWQgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24pLCB0aGVuIHRoZSBsaWJyYXJ5IHdpbGwgYmUgY29uZmlndXJlZAotd2l0aCB0aGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiB3aWxsCi1iZSB0aGUgaG9zdCBzeXN0ZW0gb2YgdGhlIG92ZXJhbGwgYnVpbGQuICBSZWNhbGwgdGhhdCB0aGUgaG9zdCBzeXN0ZW0gb2YKLXRoZSBsaWJyYXJ5IHdpbGwgYmUgdGhlIHRhcmdldCBvZiB0aGUgb3ZlcmFsbCBidWlsZC4gIElmIHRoZSBvdmVyYWxsCi1idWlsZCBpcyBhIG5hdGl2ZSBidWlsZCwgdGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gd2lsbCBub3QgYmUKLXVzZWQuCi0KLUEgbGlicmFyeSB3aGljaCBjYW4gYmUgYnVpbHQgYm90aCBzdGFuZGFsb25lIGFuZCBhcyBhIHRhcmdldCBsaWJyYXJ5IG1heQotd2FudCB0byBpbnN0YWxsIGl0c2VsZiBpbnRvIGRpZmZlcmVudCBkaXJlY3RvcmllcyBkZXBlbmRpbmcgdXBvbiB0aGUKLWNhc2UuICBXaGVuIGJ1aWx0IHN0YW5kYWxvbmUsIG9yIHdoZW4gYnVpbHQgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQKLWJlIGluc3RhbGxlZCBpbiBAc2FtcHskKGxpYmRpcil9LiAgV2hlbiBidWlsdCBhcyBhIHRhcmdldCBsaWJyYXJ5IHdoaWNoCi1pcyBub3QgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIGluIEBzYW1weyQodG9vbGRpcikvbGlifS4KLVRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlCi1jYXNlcy4KLQotVGhpcyBzYW1lIHRlc3Qgb2YgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG1heSBiZSB1c2VkIHRvIHNlZSB3aGV0aGVyIGl0Ci1pcyBPSyB0byB1c2UgbGluayB0ZXN0cyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIElmIHRoZQotQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbiB0aGUgbGlicmFyeSBpcyBiZWluZwotYnVpbHQgZWl0aGVyIHN0YW5kYWxvbmUgb3IgbmF0aXZlLCBhbmQgYSBsaW5rIHNob3VsZCB3b3JrLgotCi1Abm9kZSBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUKLUBzdWJzZWN0aW9uIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZQotCi1UaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgZGVmaW5lcyB0YXJnZXRzIGZvcgotZXZlcnkga25vd24gc3ViZGlyZWN0b3J5LgotCi1Gb3IgZXZlcnkgc3ViZGlyZWN0b3J5IEB2YXJ7ZGlyfSB3aGljaCBob2xkcyBhIGhvc3QgbGlicmFyeSBvciBwcm9ncmFtLAotdGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7YWxsLUB2YXJ7ZGlyfX0gd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkKLW9yIHByb2dyYW0uCi0KLVRoZXJlIGFyZSBkZXBlbmRlbmNpZXMgYW1vbmcgaG9zdCB0b29scy4gIEZvciBleGFtcGxlLCBidWlsZGluZyBnY2MKLXJlcXVpcmVzIGZpcnN0IGJ1aWxkaW5nIGdhcywgYmVjYXVzZSB0aGUgZ2NjIGJ1aWxkIHByb2Nlc3MgaW52b2tlcyB0aGUKLXRhcmdldCBhc3NlbWJsZXIuICBUaGVzZSBkZXBlbmRlbmNpZXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0uCi0KLUZvciBldmVyeSBzdWJkaXJlY3RvcnkgQHZhcntkaXJ9IHdoaWNoIGhvbGRzIGEgdGFyZ2V0IGxpYnJhcnksIHRoZQotQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gd2lsbCBjb25maWd1cmUKLXRoYXQgbGlicmFyeS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2FsbC10YXJnZXQtQHZhcntkaXJ9fQotd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkuCi0KLUV2ZXJ5IEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQgZGVwZW5kcyB1cG9uCi1Ac2FtcHthbGwtZ2NjfSwgc2luY2UgZ2NjLCB0aGUgdGFyZ2V0IGNvbXBpbGVyLCBpcyByZXF1aXJlZCB0byBjb25maWd1cmUKLXRoZSB0b29sLiAgRXZlcnkgQHNhbXB7YWxsLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldCBkZXBlbmRzIHVwb24gdGhlCi1jb3JyZXNwb25kaW5nIEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQuCi0KLVRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIHRhcmdldHMgd2hpY2ggbWF5IGJlIG9mIGludGVyZXN0IGZvciBlYWNoCi1kaXJlY3Rvcnk6IEBzYW1we2luc3RhbGwtQHZhcntkaXJ9fSwgQHNhbXB7Y2xlYW4tQHZhcntkaXJ9fSwgYW5kCi1Ac2FtcHtjaGVjay1AdmFye2Rpcn19LiAgVGhlcmUgYXJlIGFsc28gY29ycmVzcG9uZGluZyBAc2FtcHt0YXJnZXR9Ci12ZXJzaW9ucyBvZiB0aGVzZSBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgLCBzdWNoIGFzCi1Ac2FtcHtpbnN0YWxsLXRhcmdldC1AdmFye2Rpcn19LgotCi1Abm9kZSBUYXJnZXQgbGliaWJlcnR5Ci1Ac3Vic2VjdGlvbiBUYXJnZXQgbGliaWJlcnR5Ci0KLVRoZSBAZmlsZXtsaWJpYmVydHl9IHN1YmRpcmVjdG9yeSBpcyBjdXJyZW50bHkgYSBzcGVjaWFsIGNhc2UsIGluIHRoYXQKLWl0IGlzIHRoZSBvbmx5IGRpcmVjdG9yeSB3aGljaCBpcyBidWlsdCBib3RoIHVzaW5nIHRoZSBob3N0IGNvbXBpbGVyIGFuZAotdXNpbmcgdGhlIHRhcmdldCBjb21waWxlci4KLQotVGhpcyBpcyBiZWNhdXNlIHRoZSBmaWxlcyBpbiBAZmlsZXtsaWJpYmVydHl9IGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlCi1ob3N0IHRvb2xzLCBhbmQgdGhleSBhcmUgYWxzbyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgQGZpbGV7bGlic3RkYysrfQotdGFyZ2V0IGxpYnJhcnkgYXMgc3VwcG9ydCBjb2RlLgotCi1UaGlzIGR1YWxpdHkgZG9lcyBub3QgcG9zZSBhbnkgcGFydGljdWxhciBkaWZmaWN1bHRpZXMuICBJdCBtZWFucyB0aGF0Ci10aGVyZSBhcmUgdGFyZ2V0cyBmb3IgYm90aCBAc2FtcHthbGwtbGliaWJlcnR5fSBhbmQKLUBzYW1we2FsbC10YXJnZXQtbGliaWJlcnR5fS4KLQotSW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgd2hlbiB0YXJnZXQgbGlicmFyaWVzIGFyZSBub3QgYnVpbHQgaW4gYQotc3ViZGlyZWN0b3J5LCB0aGUgc2FtZSBvYmplY3RzIGFyZSBub3JtYWxseSB1c2VkIGFzIGJvdGggdGhlIGhvc3QgYnVpbGQKLWFuZCB0aGUgdGFyZ2V0IGJ1aWxkLiAgVGhpcyBpcyBub3JtYWxseSBPSywgc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zCi1vbmx5IEMgY29kZSwgYW5kIGluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gdGhlIHJlc3VsdHMgb2YgdGhlIGhvc3QKLWNvbXBpbGVyIGFuZCB0aGUgdGFyZ2V0IGNvbXBpbGVyIGFyZSBub3JtYWxseSBpbnRlcm9wZXJhYmxlLgotCi1Jcml4IDYgaXMgYWdhaW4gYW4gZXhjZXB0aW9uIGhlcmUsIHNpbmNlIHRoZSBTR0kgbmF0aXZlIGNvbXBpbGVyCi1kZWZhdWx0cyB0byB1c2luZyB0aGUgQHNhbXB7TzMyfSBBQkksIGFuZCBnY2MgZGVmYXVsdHMgdG8gdXNpbmcgdGhlCi1Ac2FtcHtOMzJ9IEFCSS4gIE9uIElyaXggNiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIGEKLXN1YmRpcmVjdG9yeSBldmVuIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCBhdm9pZGluZyB0aGlzIHByb2JsZW0uCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgbGlicmFyaWVzIGJ1aWx0IGZvciBib3RoIHRoZSBob3N0IGFuZCB0aGUKLXRhcmdldCwgYnV0IHRoZXJlIGlzIG5vIGNvbmNlcHR1YWwgcHJvYmxlbSB3aXRoIGFkZGluZyBtb3JlLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcwotQGNoYXB0ZXIgQ2FuYWRpYW4gQ3Jvc3MKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MKLUBjaW5kZXggYnVpbGRpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyCi1AY2luZGV4IGNyb3NzIGNvbXBpbGVyLCBidWlsZGluZyB3aXRoCi0KLUl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHRvIGJ1aWxkIGEKLXByb2dyYW0gd2hpY2ggd2lsbCBydW4gb24gYSBzeXN0ZW0gd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhlIHRvb2xzIGFyZSBidWlsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZAotcHJvZ3JhbXMgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLQotVGhpcyBpcyByZWZlcnJlZCB0byBhcyBhIEBkZm57Q2FuYWRpYW4gQ3Jvc3N9LgotCi1AbWVudQotKiBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlOjoJCUNhbmFkaWFuIENyb3NzIEV4YW1wbGUuCi0qIENhbmFkaWFuIENyb3NzIENvbmNlcHRzOjoJCUNhbmFkaWFuIENyb3NzIENvbmNlcHRzLgotKiBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzOjoJCUJ1aWxkIENyb3NzIEhvc3QgVG9vbHMuCi0qIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnM6OgkJQnVpbGQgYW5kIEhvc3QgT3B0aW9ucy4KLSogQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUuCi0qIENDcm9zcyBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZS4KLSogU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zczo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzLgotQGVuZCBtZW51Ci0KLUBub2RlIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoaWxlIHJ1bm5pbmcgb24gYSBHTlUvTGludXgsIHlvdSBjYW4gYnVpbGQgYSBwcm9ncmFtIHdoaWNoIHdpbGwgcnVuIG9uCi1hIFNvbGFyaXMgc3lzdGVtLiAgWW91IHdvdWxkIHVzZSBhIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHRvCi1idWlsZCB0aGUgcHJvZ3JhbS4KLQotT2YgY291cnNlLCB5b3UgY291bGQgbm90IHJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW0gb24geW91ciBHTlUvTGludXgKLXN5c3RlbS4gIFlvdSB3b3VsZCBoYXZlIHRvIGNvcHkgaXQgb3ZlciB0byBhIFNvbGFyaXMgc3lzdGVtIGJlZm9yZSB5b3UKLXdvdWxkIHJ1biBpdC4KLQotT2YgY291cnNlLCB5b3UgY291bGQgYWxzbyBzaW1wbHkgYnVpbGQgdGhlIHByb2dyYW1zIG9uIHRoZSBTb2xhcmlzCi1zeXN0ZW0gaW4gdGhlIGZpcnN0IHBsYWNlLiAgSG93ZXZlciwgcGVyaGFwcyB0aGUgU29sYXJpcyBzeXN0ZW0gaXMgbm90Ci1hdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uOyBwZXJoYXBzIHlvdSBhY3R1YWxseSBkb24ndCBoYXZlIG9uZSwgYnV0IHlvdQotd2FudCB0byBidWlsZCB0aGUgdG9vbHMgZm9yIHNvbWVib2R5IGVsc2UgdG8gdXNlLiAgT3IgcGVyaGFwcyB5b3VyCi1HTlUvTGludXggc3lzdGVtIGlzIG11Y2ggZmFzdGVyIHRoYW4geW91ciBTb2xhcmlzIHN5c3RlbS4KLQotQSBDYW5hZGlhbiBDcm9zcyBidWlsZCBpcyBtb3N0IGZyZXF1ZW50bHkgdXNlZCB3aGVuIGJ1aWxkaW5nIHByb2dyYW1zIHRvCi1ydW4gb24gYSBub24tVW5peCBzeXN0ZW0sIHN1Y2ggYXMgRE9TIG9yIFdpbmRvd3MuICBJdCBtYXkgYmUgc2ltcGxlciB0bwotY29uZmlndXJlIGFuZCBidWlsZCBvbiBhIFVuaXggc3lzdGVtIHRoYW4gdG8gc3VwcG9ydCB0aGUgY29uZmlndXJhdGlvbgotbWFjaGluZXJ5IG9uIGEgbm9uLVVuaXggc3lzdGVtLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcyBDb25jZXB0cwotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMKLQotV2hlbiBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzLCB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGRpZmZlcmVudCBzeXN0ZW1zCi1pbnZvbHZlZDogdGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgYXJlIGJlaW5nIGJ1aWx0LCBhbmQgdGhlIHN5c3RlbQotb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyBhcmUgYmVpbmcgYnVpbHQgaXMgY2FsbGVkIHRoZSBAZGZue2J1aWxkfQotc3lzdGVtLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biBpcyBjYWxsZWQgdGhlIGhvc3Qgc3lzdGVtLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBidWlsZGluZyBhIFNvbGFyaXMgcHJvZ3JhbSBvbiBhIEdOVS9MaW51eAotc3lzdGVtLCBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsCi1hbmQgdGhlIGhvc3Qgc3lzdGVtIHdvdWxkIGJlIFNvbGFyaXMuCi0KLUl0IGlzLCBvZiBjb3Vyc2UsIHBvc3NpYmxlIHRvIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbgotQ3Jvc3MgKGkuZS4sIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBjcm9zcyBjb21waWxlcikuICBJbiB0aGlzCi1jYXNlLCB0aGUgc3lzdGVtIGZvciB3aGljaCB0aGUgcmVzdWx0aW5nIGNyb3NzIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlCi1pcyBjYWxsZWQgdGhlIHRhcmdldCBzeXN0ZW0uICAoRm9yIGEgbW9yZSBjb21wbGV0ZSBkaXNjdXNzaW9uIG9mIGhvc3QKLWFuZCB0YXJnZXQgc3lzdGVtcywgQHB4cmVme0hvc3QgYW5kIFRhcmdldH0pLgotCi1BbiBleGFtcGxlIG9mIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbiBDcm9zcyB3b3VsZCBiZQotYnVpbGRpbmcgYSBXaW5kb3dzIGNyb3NzIE1JUFMgRUxGIGNvbXBpbGVyIG9uIGEgR05VL0xpbnV4IHN5c3RlbS4gIEluCi10aGlzIGNhc2UgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsIHRoZSBob3N0IHN5c3RlbSB3b3VsZCBiZQotV2luZG93cywgYW5kIHRoZSB0YXJnZXQgc3lzdGVtIHdvdWxkIGJlIE1JUFMgRUxGLgotCi1UaGUgbmFtZSBDYW5hZGlhbiBDcm9zcyBjb21lcyBmcm9tIHRoZSBjYXNlIHdoZW4gdGhlIGJ1aWxkLCBob3N0LCBhbmQKLXRhcmdldCBzeXN0ZW1zIGFyZSBhbGwgZGlmZmVyZW50LiAgQXQgdGhlIHRpbWUgdGhhdCB0aGVzZSBpc3N1ZXMgd2VyZQotYWxsIGJlaW5nIGhhc2hlZCBvdXQsIENhbmFkYSBoYWQgdGhyZWUgbmF0aW9uYWwgcG9saXRpY2FsIHBhcnRpZXMuCi0KLUBub2RlIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLUBzZWN0aW9uIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLQotSW4gb3JkZXIgdG8gY29uZmlndXJlIGEgcHJvZ3JhbSBmb3IgYSBDYW5hZGlhbiBDcm9zcyBidWlsZCwgeW91IG11c3QKLWZpcnN0IGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBzZXQgb2YgY3Jvc3MgdG9vbHMgeW91IHdpbGwgdXNlIHRvIGJ1aWxkIHRoZQotcHJvZ3JhbS4KLQotVGhlc2UgdG9vbHMgd2lsbCBiZSBidWlsZCBjcm9zcyBob3N0IHRvb2xzLiAgVGhhdCBpcywgdGhleSB3aWxsIHJ1biBvbgotdGhlIGJ1aWxkIHN5c3RlbSwgYW5kIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgcnVucyBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLUl0IGlzIGVhc3kgdG8gY29uZnVzZSB0aGUgbWVhbmluZyBvZiBidWlsZCBhbmQgaG9zdCBoZXJlLiAgQWx3YXlzCi1yZW1lbWJlciB0aGF0IHRoZSBidWlsZCBzeXN0ZW0gaXMgd2hlcmUgeW91IGFyZSBkb2luZyB0aGUgYnVpbGQsIGFuZCB0aGUKLWhvc3Qgc3lzdGVtIGlzIHdoZXJlIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSB3aWxsIHJ1bi4gIFRoZXJlZm9yZSwgeW91Ci1uZWVkIGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4KLQotSW4gZ2VuZXJhbCwgeW91IG11c3QgaGF2ZSBhIGNvbXBsZXRlIGNyb3NzIGVudmlyb25tZW50IGluIG9yZGVyIHRvIGRvCi10aGUgYnVpbGQuICBUaGlzIG5vcm1hbGx5IG1lYW5zIGEgY3Jvc3MgY29tcGlsZXIsIGNyb3NzIGFzc2VtYmxlciwgYW5kCi1zbyBmb3J0aCwgYXMgd2VsbCBhcyBsaWJyYXJpZXMgYW5kIGluY2x1ZGUgZmlsZXMgZm9yIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQHNlY3Rpb24gQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQGNpbmRleCBjb25maWd1cmluZyBhIGNhbmFkaWFuIGNyb3NzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzLCBjb25maWd1cmluZwotCi1XaGVuIHlvdSBydW4gQGZpbGV7Y29uZmlndXJlfSwgeW91IG11c3QgdXNlIGJvdGggdGhlIEBzYW1wey0tYnVpbGR9IGFuZAotQHNhbXB7LS1ob3N0fSBvcHRpb25zLgotCi1AY2luZGV4IEBzYW1wey0tYnVpbGR9IG9wdGlvbgotQGNpbmRleCBidWlsZCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIGJ1aWxkIHN5c3RlbQotVGhlIEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZgotdGhlIGJ1aWxkIHN5c3RlbS4gIFRoaXMgY2FuIG5vcm1hbGx5IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUKLUBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UKLUBzYW1wey0tYnVpbGQ9YGNvbmZpZy5ndWVzc2B9LgotCi1AY2luZGV4IEBzYW1wey0taG9zdH0gb3B0aW9uCi1AY2luZGV4IGhvc3Qgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSBob3N0Ci1UaGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YKLXRoZSBob3N0IHN5c3RlbS4KLQotQXMgd2UgZXhwbGFpbmVkIGVhcmxpZXIsIEBmaWxle2NvbmZpZy5ndWVzc30gaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQKLXZhbHVlIGZvciB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gKEBweHJlZntVc2luZyB0aGUgSG9zdCBUeXBlfSkuICBXZQotY2FuIG5vdyBzZWUgdGhhdCBzaW5jZSBAZmlsZXtjb25maWcuZ3Vlc3N9IHJldHVybnMgdGhlIHR5cGUgb2Ygc3lzdGVtIG9uCi13aGljaCBpdCBpcyBydW4sIGl0IHJlYWxseSBpZGVudGlmaWVzIHRoZSBidWlsZCBzeXN0ZW0uICBTaW5jZSB0aGUgaG9zdAotc3lzdGVtIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIHRoZSBidWlsZCBzeXN0ZW0gKGkuZS4sIHBlb3BsZSBkbyBub3QKLW5vcm1hbGx5IGJ1aWxkIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIpLCBpdCBpcyByZWFzb25hYmxlIHRvIHVzZSB0aGUKLXJlc3VsdCBvZiBAZmlsZXtjb25maWcuZ3Vlc3N9IGFzIHRoZSBkZWZhdWx0IGZvciB0aGUgaG9zdCBzeXN0ZW0gd2hlbgotdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIG5vdCB1c2VkLgotCi1JdCBtaWdodCBzZWVtIHRoYXQgaWYgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIHdlcmUgdXNlZCB3aXRob3V0IHRoZQotQHNhbXB7LS1idWlsZH0gb3B0aW9uIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY291bGQgcnVuCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHRvIGRldGVybWluZSB0aGUgYnVpbGQgc3lzdGVtLCBhbmQgcHJlc3VtZSBhCi1DYW5hZGlhbiBDcm9zcyBpZiB0aGUgcmVzdWx0IG9mIEBmaWxle2NvbmZpZy5ndWVzc30gZGlmZmVyZWQgZnJvbSB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLiAgSG93ZXZlciwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgc29tZSBjb25maWd1cmUKLXNjcmlwdHMgYXJlIHJvdXRpbmVseSBydW4gdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sIHJhdGhlcgotdGhhbiB1c2luZyB0aGUgZGVmYXVsdCBmcm9tIEBmaWxle2NvbmZpZy5ndWVzc30uICBBcyBub3RlZCBlYXJsaWVyLCBpdAotaXMgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gcmVsaWFibHkgY29tcGFyZSBjb25maWd1cmF0aW9uIG5hbWVzCi0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQsIGJ1dCB0aGUgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIG5vdCB1c2VkLAotdGhlbiB0aGUgYnVpbGQgc3lzdGVtIGRlZmF1bHRzIHRvIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlLgotCi1JZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKLWNyb3NzIHRvb2xzIHdoaWNoIHlvdSB3YW50IHRvIHVzZSB0byBidWlsZCB0aGUgcHJvZ3JhbS4gIFRoaXMgaXMgZG9uZSBieQotc2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdC4KLQotWW91IG11c3Qgbm9ybWFsbHkgc2V0IGF0IGxlYXN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q0N9LAotQHNhbXB7QVJ9LCBhbmQgQHNhbXB7UkFOTElCfSB0byB0aGUgY3Jvc3MgdG9vbHMgd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRvCi1idWlsZC4KLQotRm9yIHNvbWUgcHJvZ3JhbXMsIHlvdSBtdXN0IHNldCBhZGRpdGlvbmFsIGNyb3NzIHRvb2xzIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we0FTfSwgQHNhbXB7TER9LCBvciBAc2FtcHtOTX0uCi0KLVlvdSB3b3VsZCBzZXQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZSBidWlsZCBjcm9zcyB0b29scyB3aGljaAoteW91IGFyZSBnb2luZyB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgU29sYXJpcyBwcm9ncmFtIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0sIGFuZCB5b3VyIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHdlcmUgbmFtZWQKLUBzYW1we3NvbGFyaXMtZ2NjfSwgdGhlbiB5b3Ugd291bGQgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQHNhbXB7Q0N9IHRvIEBzYW1we3NvbGFyaXMtZ2NjfS4KLQotQG5vZGUgQ0Nyb3NzIGluIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZQotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBjeWdudXMgdHJlZQotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzIHdoZW4KLXVzaW5nIHRoZSBDeWdudXMgdHJlZS4KLQotQG1lbnUKLSogU3RhbmRhcmQgQ3lnbnVzIENDcm9zczo6CUJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0uCi0qIENyb3NzIEN5Z251cyBDQ3Jvc3M6OgkJQnVpbGRpbmcgYSBDcm9zcyBQcm9ncmFtLgotQGVuZCBtZW51Ci0KLUBub2RlIFN0YW5kYXJkIEN5Z251cyBDQ3Jvc3MKLUBzdWJzZWN0aW9uIEJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0KLQotV2hlbiBjb25maWd1cmluZyBhIENhbmFkaWFuIENyb3NzIGluIHRoZSBDeWdudXMgdHJlZSwgYWxsIHRoZQotYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCB0bwotQHNhbXB7QHZhcntob3N0fS1AdmFye3Rvb2x9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiwgYW5kIEB2YXJ7dG9vbH0gaXMgdGhlIG5hbWUgb2YgdGhlIHRvb2wgKGUuZy4sCi1Ac2FtcHtnY2N9LCBAc2FtcHthc30sIGV0Yy4pLiAgVGhlc2UgdG9vbHMgbXVzdCBiZSBvbiB5b3VyIEBzYW1we1BBVEh9LgotCi1BZGRpbmcgYSBwcmVmaXggb2YgQHZhcntob3N0fSB3aWxsIGdpdmUgdGhlIHVzdWFsIG5hbWUgZm9yIHRoZSBidWlsZAotY3Jvc3MgaG9zdCB0b29scy4gIFRvIHNlZSB0aGlzLCBjb25zaWRlciB0aGF0IHdoZW4gdGhlc2UgY3Jvc3MgdG9vbHMKLXdlcmUgYnVpbHQsIHRoZXkgd2VyZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCB0bwotcHJvZHVjZSBjb2RlIGZvciB0aGUgaG9zdCBzeXN0ZW0uICBUaGF0IGlzLCB0aGV5IHdlcmUgY29uZmlndXJlZCB3aXRoIGEKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgc3lzdGVtIHdoaWNoIHdlIGFyZSBub3cKLWNhbGxpbmcgdGhlIGhvc3QuICBSZWNhbGwgdGhhdCB0aGUgZGVmYXVsdCBuYW1lIGZvciBpbnN0YWxsZWQgY3Jvc3MKLXRvb2xzIHVzZXMgdGhlIHRhcmdldCBzeXN0ZW0gYXMgYSBwcmVmaXggKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0Ci1UeXBlfSkuICBTaW5jZSB0aGF0IGlzIHRoZSBzeXN0ZW0gd2hpY2ggd2UgYXJlIG5vdyBjYWxsaW5nIHRoZSBob3N0LAotQHZhcntob3N0fSBpcyB0aGUgcmlnaHQgcHJlZml4IHRvIHVzZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBjb25maWd1cmUgd2l0aCBAc2FtcHstLWJ1aWxkPWkzODYtbGludXgtZ251fSBhbmQKLUBzYW1wey0taG9zdD1zb2xhcmlzfSwgdGhlbiB0aGUgQ3lnbnVzIHRyZWUgd2lsbCBhdXRvbWF0aWNhbGx5IGRlZmF1bHQKLXRvIHVzaW5nIHRoZSBjb21waWxlciBAc2FtcHtzb2xhcmlzLWdjY30uICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkKLWJ1aWx0IGFuZCBpbnN0YWxsZWQgdGhpcyBjb21waWxlciwgcHJvYmFibHkgYnkgZG9pbmcgYSBidWlsZCB3aXRoIG5vCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiBhbmQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gb2YKLUBzYW1we3NvbGFyaXN9LgotCi1Abm9kZSBDcm9zcyBDeWdudXMgQ0Nyb3NzCi1Ac3Vic2VjdGlvbiBCdWlsZGluZyBhIENyb3NzIFByb2dyYW0KLQotVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29uc2lkZXJhdGlvbnMgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcwotY29tcGlsZXIsIHJhdGhlciB0aGFuIGEgbmF0aXZlIGNvbXBpbGVyLCBpbiB0aGUgQ3lnbnVzIHRyZWUgdXNpbmcgYQotQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoZW4geW91IGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB0aGVuIHRoZSB0YXJnZXQKLWxpYnJhcmllcyB3aWxsIG5vcm1hbGx5IGJlIGJ1aWx0IHdpdGggdGhlIG5ld2x5IGJ1aWx0IHRhcmdldCBjb21waWxlcgotKEBweHJlZntIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzfSkuICBIb3dldmVyLCB0aGlzIHdpbGwgbm90IHdvcmsgd2hlbgotYnVpbGRpbmcgd2l0aCBhIENhbmFkaWFuIENyb3NzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBuZXdseSBidWlsdCB0YXJnZXQKLWNvbXBpbGVyIHdpbGwgYmUgYSBwcm9ncmFtIHdoaWNoIHJ1bnMgb24gdGhlIGhvc3Qgc3lzdGVtLCBhbmQgdGhlcmVmb3JlCi13aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtLgotCi1UaGVyZWZvcmUsIHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlciB3aXRoIHRoZSBDeWdudXMgdHJlZSwgeW91IG11c3QKLWZpcnN0IGluc3RhbGwgYSBzZXQgb2YgYnVpbGQgY3Jvc3MgdGFyZ2V0IHRvb2xzLiAgVGhlc2UgdG9vbHMgd2lsbCBiZQotdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1Ob3RlIHRoYXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudCBvZiBhIENhbmFkaWFuIENyb3NzIGluIGdlbmVyYWwuICBGb3IKLWV4YW1wbGUsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGp1c3QgdGhlIGhvc3QgY3Jvc3MgdGFyZ2V0IHRvb2xzCi1vbiB0aGUgYnVpbGQgc3lzdGVtLCB0byBjb3B5IHRoZSB0b29scyB0byB0aGUgaG9zdCBzeXN0ZW0sIGFuZCB0byBidWlsZAotdGhlIHRhcmdldCBsaWJyYXJpZXMgb24gdGhlIGhvc3Qgc3lzdGVtLiAgVGhlIHJlcXVpcmVtZW50IGZvciBidWlsZAotY3Jvc3MgdGFyZ2V0IHRvb2xzIGlzIGltcG9zZWQgYnkgdGhlIEN5Z251cyB0cmVlLCB3aGljaCBleHBlY3RzIHRvIGJlCi1hYmxlIHRvIGJ1aWxkIGJvdGggaG9zdCBwcm9ncmFtcyBhbmQgdGFyZ2V0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLiAgQmVjYXVzZSBpdCBidWlsZHMgdGhlc2UgaW4gYSBzaW5nbGUKLXN0ZXAsIGl0IGV4cGVjdHMgdG8gYmUgYWJsZSB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBvbiB0aGUgYnVpbGQKLXN5c3RlbSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IHVzZSBhIGJ1aWxkIGNyb3NzIHRhcmdldCB0b29sY2hhaW4uCi0KLUZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvIGJ1aWxkIGEgV2luZG93cyBjcm9zcyBNSVBTIEVMRiBjb21waWxlcgotb24gYSBHTlUvTGludXggc3lzdGVtLiAgWW91IG11c3QgaGF2ZSBwcmV2aW91c2x5IGluc3RhbGxlZCBib3RoIGEKLUdOVS9MaW51eCBjcm9zcyBXaW5kb3dzIGNvbXBpbGVyIGFuZCBhIEdOVS9MaW51eCBjcm9zcyBNSVBTIEVMRgotY29tcGlsZXIuCi0KLUluIG9yZGVyIHRvIGJ1aWxkIHRoZSBXaW5kb3dzIChjb25maWd1cmF0aW9uIG5hbWUgQHNhbXB7aTM4Ni1jeWd3aW4zMn0pCi1jcm9zcyBNSVBTIEVMRiAoY29uZmlndXJlIG5hbWUgQHNhbXB7bWlwcy1lbGZ9KSBjb21waWxlciwgeW91IG1pZ2h0Ci1leGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgKGxvbmcgY29tbWFuZCBsaW5lcyBhcmUgYnJva2VuIGFjcm9zcwotbGluZXMgd2l0aCBhIHRyYWlsaW5nIGJhY2tzbGFzaCBhcyBhIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIpLgotCi1AZXhhbXBsZQotbWtkaXIgbGludXgteC1jeWd3aW4zMgotY2QgbGludXgteC1jeWd3aW4zMgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLXRhcmdldCBpMzg2LWN5Z3dpbjMyIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBsaW51eC14LW1pcHMtZWxmCi1jZCBsaW51eC14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tdGFyZ2V0IG1pcHMtZWxmIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBjeWd3aW4zMi14LW1pcHMtZWxmCi1jZCBjeWd3aW4zMi14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tYnVpbGQ9aTM4Ni1saW51eC1nbnUgLS1ob3N0PWkzODYtY3lnd2luMzIgXAotICAtLXRhcmdldD1taXBzLWVsZiAtLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9L0gtaTM4Ni1jeWd3aW4zMgotbWFrZQotbWFrZSBpbnN0YWxsCi1AZW5kIGV4YW1wbGUKLQotWW91IHdvdWxkIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgQHZhcnt3aW5pbnN0YWxsZGlyfSBvdmVyIHRvIHRoZQotV2luZG93cyBtYWNoaW5lLCBhbmQgcnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbXMuCi0KLUBub2RlIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLUBzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLQotSWYgeW91IHdhbnQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCBhIHByb2dyYW0geW91IGFyZSBkZXZlbG9waW5nCi11c2luZyBhIENhbmFkaWFuIENyb3NzLCB5b3UgbXVzdCB0YWtlIHNvbWUgY2FyZSB3aGVuIHdyaXRpbmcgeW91cgotY29uZmlndXJlIGFuZCBtYWtlIHJ1bGVzLiAgU2ltcGxlIGNhc2VzIHdpbGwgbm9ybWFsbHkgd29yayBjb3JyZWN0bHkuCi1Ib3dldmVyLCBpdCBpcyBub3QgaGFyZCB0byB3cml0ZSBjb25maWd1cmUgYW5kIG1ha2UgdGVzdHMgd2hpY2ggd2lsbAotZmFpbCBpbiBhIENhbmFkaWFuIENyb3NzLgotCi1AbWVudQotKiBDQ3Jvc3MgaW4gQ29uZmlndXJlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMuCi0qIENDcm9zcyBpbiBNYWtlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gTWFrZWZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENDcm9zcyBpbiBDb25maWd1cmUKLUBzdWJzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gY29uZmlndXJlCi0KLUluIGEgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBhZnRlciBjYWxsaW5nIEBzYW1we0FDX1BST0dfQ0N9LCB5b3UgY2FuCi1maW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcyBjb25maWd1cmUgYnkgZXhhbWluaW5nIHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfS4gIEluIGEgQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIG1lYW5zCi10aGF0IHRoZSBjb21waWxlciBpcyBhIGNyb3NzIGNvbXBpbGVyLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we3llc30uICBJbiBhIG5vcm1hbCBjb25maWd1cmF0aW9uLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we25vfS4KLQotWW91IG9yZGluYXJpbHkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgYnVpbGQgc3lzdGVtIGluIGEKLWNvbmZpZ3VyZSBzY3JpcHQuICBIb3dldmVyLCBpZiB5b3UgZG8gbmVlZCB0aGF0IGluZm9ybWF0aW9uLCB5b3UgY2FuIGdldAotaXQgYnkgdXNpbmcgdGhlIG1hY3JvIEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19LCB0aGUgc2FtZSBtYWNybyB0aGF0IGlzCi11c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IHN5c3RlbS4gIFRoaXMgbWFjcm8gd2lsbCBzZXQgdGhlIHZhcmlhYmxlcwotQHNhbXB7YnVpbGR9LCBAc2FtcHtidWlsZF9hbGlhc30sIEBzYW1we2J1aWxkX2NwdX0sIEBzYW1we2J1aWxkX3ZlbmRvcn0sCi1hbmQgQHNhbXB7YnVpbGRfb3N9LCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBzaW1pbGFyIEBzYW1we3RhcmdldH0gYW5kCi1Ac2FtcHtob3N0fSB2YXJpYWJsZXMsIGV4Y2VwdCB0aGF0IHRoZXkgZGVzY3JpYmUgdGhlIGJ1aWxkIHN5c3RlbS4KLQotV2hlbiB3cml0aW5nIHRlc3RzIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0sIHlvdSBtdXN0IHJlbWVtYmVyIHRoYXQgeW91Ci13YW50IHRvIHRlc3QgdGhlIGhvc3QgZW52aXJvbm1lbnQsIG5vdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQuCi0KLU1hY3JvcyBsaWtlIEBzYW1we0FDX0NIRUNLX0ZVTkNTfSB3aGljaCB1c2UgdGhlIGNvbXBpbGVyIHdpbGwgdGVzdCB0aGUKLWhvc3QgZW52aXJvbm1lbnQuICBUaGF0IGlzIGJlY2F1c2UgdGhlIHRlc3RzIHdpbGwgYmUgZG9uZSBieSBydW5uaW5nIHRoZQotY29tcGlsZXIsIHdoaWNoIGlzIGFjdHVhbGx5IGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4gIElmIHRoZQotY29tcGlsZXIgY2FuIGZpbmQgdGhlIGZ1bmN0aW9uLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHByZXNlbnQKLWluIHRoZSBob3N0IGVudmlyb25tZW50LgotCi1UZXN0cyBsaWtlIEBzYW1we3Rlc3QgLWYgL2Rldi9wdHlwMH0sIG9uIHRoZSBvdGhlciBoYW5kLCB3aWxsIHRlc3QgdGhlCi1idWlsZCBlbnZpcm9ubWVudC4gIFJlbWVtYmVyIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVubmluZyBvbiB0aGUKLWJ1aWxkIHN5c3RlbSwgbm90IHRoZSBob3N0IHN5c3RlbS4gIElmIHlvdXIgY29uZmlndXJlIHNjcmlwdHMgZXhhbWluZXMKLWZpbGVzLCB0aG9zZSBmaWxlcyB3aWxsIGJlIG9uIHRoZSBidWlsZCBzeXN0ZW0uICBXaGF0ZXZlciB5b3UgZGV0ZXJtaW5lCi1iYXNlZCBvbiB0aG9zZSBmaWxlcyBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgY2FzZSBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLU1vc3QgYXV0b2NvbmYgbWFjcm9zIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIGEgQ2FuYWRpYW4gQ3Jvc3MuICBUaGUgbWFpbgotZXhjZXB0aW9uIGlzIEBzYW1we0FDX1RSWV9SVU59LiAgVGhpcyBtYWNybyB0cmllcyB0byBjb21waWxlIGFuZCBydW4gYQotdGVzdCBwcm9ncmFtLiAgVGhpcyB3aWxsIGZhaWwgaW4gYSBDYW5hZGlhbiBDcm9zcywgYmVjYXVzZSB0aGUgcHJvZ3JhbQotd2lsbCBiZSBjb21waWxlZCBmb3IgdGhlIGhvc3Qgc3lzdGVtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgbm90IHJ1bgotb24gdGhlIGJ1aWxkIHN5c3RlbS4KLQotVGhlIEBzYW1we0FDX1RSWV9SVU59IG1hY3JvIHByb3ZpZGVzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRlbGwgdGhlCi1jb25maWd1cmUgc2NyaXB0IHdoYXQgdG8gZG8gaW4gYSBDYW5hZGlhbiBDcm9zcy4gIElmIHRoYXQgYXJndW1lbnQgaXMKLW5vdCBwcmVzZW50LCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIHdoZW4geW91IHJ1biBAc2FtcHthdXRvY29uZn06Ci1Ac21hbGxleGFtcGxlCi13YXJuaW5nOiBBQ19UUllfUlVOIGNhbGxlZCB3aXRob3V0IGRlZmF1bHQgdG8gYWxsb3cgY3Jvc3MgY29tcGlsaW5nCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSByZXN1bHRpbmcgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBub3Qgd29yawotd2l0aCBhIENhbmFkaWFuIENyb3NzLgotCi1JbiBzb21lIGNhc2VzIHdoaWxlIGl0IG1heSBiZXR0ZXIgdG8gcGVyZm9ybSBhIHRlc3QgYXQgY29uZmlndXJlIHRpbWUsCi1pdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIHRlc3QgYXQgcnVuIHRpbWUuICBJbiBzdWNoIGEgY2FzZSB5b3UKLWNhbiB1c2UgdGhlIGNyb3NzIGNvbXBpbGluZyBhcmd1bWVudCB0byBAc2FtcHtBQ19UUllfUlVOfSB0byB0ZWxsIHlvdXIKLXByb2dyYW0gdGhhdCB0aGUgdGVzdCBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGF0IGNvbmZpZ3VyZSB0aW1lLgotCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgYXV0b2NvbmYgbWFjcm9zIHdoaWNoIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGgKLWEgQ2FuYWRpYW4gQ3Jvc3M6IGEgcGFydGlhbCBsaXN0IGlzIEBzYW1we0FDX0ZVTkNfR0VUUEdSUH0sCi1Ac2FtcHtBQ19GVU5DX1NFVFBHUlB9LCBAc2FtcHtBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUR9LCBhbmQKLUBzYW1we0FDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMU30uICBUaGUgQHNhbXB7QUNfQ0hFQ0tfU0laRU9GfSBtYWNybyBpcwotZ2VuZXJhbGx5IG5vdCB2ZXJ5IHVzZWZ1bCB3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3M7IGl0IHBlcm1pdHMgYW4gb3B0aW9uYWwKLWFyZ3VtZW50IGluZGljYXRpbmcgdGhlIGRlZmF1bHQgc2l6ZSwgYnV0IHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoYXQKLXRoZSBjb3JyZWN0IGRlZmF1bHQgc2hvdWxkIGJlLgotCi1Abm9kZSBDQ3Jvc3MgaW4gTWFrZQotQHN1YnNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBNYWtlZmlsZXMuCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIG1ha2VmaWxlCi0KLVRoZSBtYWluIENhbmFkaWFuIENyb3NzIGlzc3VlIGluIGEgQGZpbGV7TWFrZWZpbGV9IGFyaXNlcyB3aGVuIHlvdSB3YW50Ci10byB1c2UgYSBzdWJzaWRpYXJ5IHByb2dyYW0gdG8gZ2VuZXJhdGUgY29kZSBvciBkYXRhIHdoaWNoIHlvdSB3aWxsIHRoZW4KLWluY2x1ZGUgaW4geW91ciByZWFsIHByb2dyYW0uCi0KLUlmIHlvdSBjb21waWxlIHRoaXMgc3Vic2lkaWFyeSBwcm9ncmFtIHVzaW5nIEBzYW1weyQoQ0MpfSBpbiB0aGUgdXN1YWwKLXdheSwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGl0LiAgVGhpcyBpcyBiZWNhdXNlIEBzYW1weyQoQ0MpfSB3aWxsCi1idWlsZCBhIHByb2dyYW0gZm9yIHRoZSBob3N0IHN5c3RlbSwgYnV0IHRoZSBwcm9ncmFtIGlzIGJlaW5nIGJ1aWx0IG9uCi10aGUgYnVpbGQgc3lzdGVtLgotCi1Zb3UgbXVzdCBpbnN0ZWFkIHVzZSBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtLCByYXRoZXIgdGhhbiB0aGUKLWhvc3Qgc3lzdGVtLiAgSW4gdGhlIEN5Z251cyB0cmVlLCB0aGlzIG1ha2UgdmFyaWFibGUKLUBzYW1weyQoQ0NfRk9SX0JVSUxEKX0gd2lsbCBob2xkIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0uCi0KLU5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBpbmNsdWRlIEBmaWxle2NvbmZpZy5ofSBpbiBhIGZpbGUgeW91IGFyZQotY29tcGlsaW5nIHdpdGggQHNhbXB7JChDQ19GT1JfQlVJTEQpfS4gIFRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsCi1idWlsZCBAZmlsZXtjb25maWcuaH0gd2l0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAgSG93ZXZlciwKLXlvdSBhcmUgY29tcGlsaW5nIHRoZSBmaWxlIHVzaW5nIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0gKGEKLW5hdGl2ZSBjb21waWxlcikuICBTdWJzaWRpYXJ5IHByb2dyYW1zIGFyZSBub3JtYWxseSBzaW1wbGUgZmlsdGVycyB3aGljaAotZG8gbm8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGl0IGlzIG5vcm1hbGx5IHBvc3NpYmxlIHRvIHdyaXRlIHRoZW0gaW4gYQotaGlnaGx5IHBvcnRhYmxlIGZhc2hpb24gc28gdGhhdCB0aGUgYWJzZW5jZSBvZiBAZmlsZXtjb25maWcuaH0gaXMgbm90Ci1jcnVjaWFsLgotCi1AY2luZGV4IEBzYW1we0hPU1RfQ0N9Ci1UaGUgZ2NjIEBmaWxle01ha2VmaWxlLmlufSBzaG93cyBhIGNvbXBsZXggc2l0dWF0aW9uIGluIHdoaWNoIGNlcnRhaW4KLWZpbGVzLCBzdWNoIGFzIEBmaWxle3J0bC5jfSwgbXVzdCBiZSBjb21waWxlZCBpbnRvIGJvdGggc3Vic2lkaWFyeQotcHJvZ3JhbXMgcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0gYW5kIGludG8gdGhlIGZpbmFsIHByb2dyYW0uICBUaGlzCi1hcHByb2FjaCBtYXkgYmUgb2YgaW50ZXJlc3QgZm9yIGFkdmFuY2VkIGJ1aWxkIHN5c3RlbSBoYWNrZXJzLiAgTm90ZQotdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGNvbXBpbGVyIGlzIHJhdGhlciBjb25mdXNpbmdseSBjYWxsZWQKLUBzYW1we0hPU1RfQ0N9LgotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlCi1AY2hhcHRlciBDeWdudXMgQ29uZmlndXJlCi1AY2luZGV4IGN5Z251cyBjb25maWd1cmUKLQotVGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IHByZWRhdGVzIGF1dG9jb25mLiAgQWxsIG9mIGl0cyBpbnRlcmVzdGluZwotZmVhdHVyZXMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZCBpbnRvIGF1dG9jb25mLiAgTm8gbmV3IHByb2dyYW1zIHNob3VsZAotYmUgd3JpdHRlbiB0byB1c2UgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0LgotCi1Ib3dldmVyLCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgc3RpbGwgdXNlZCBpbiBhIGZldyBwbGFjZXM6IGF0Ci10aGUgdG9wIG9mIHRoZSBDeWdudXMgdHJlZSBhbmQgaW4gYSBmZXcgdGFyZ2V0IGxpYnJhcmllcyBpbiB0aGUgQ3lnbnVzCi10cmVlLiAgVW50aWwgdGhvc2UgdXNlcyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBhdXRvY29uZiwgc29tZSBicmllZgotbm90ZXMgYXJlIGFwcHJvcHJpYXRlIGhlcmUuICBUaGlzIGlzIG5vdCBjb21wbGV0ZSBkb2N1bWVudGF0aW9uLCBidXQgaXQKLXNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcyBhIGd1aWRlIHdoaWxlIGV4YW1pbmluZyB0aGUgc2NyaXB0cwotdGhlbXNlbHZlcy4KLQotQG1lbnUKLSogQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3M6OgkJQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MuCi0qIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllczo6CUN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlIEJhc2ljcwotQHNlY3Rpb24gQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MKLQotQ3lnbnVzIGNvbmZpZ3VyZSBkb2VzIG5vdCB1c2UgYW55IGdlbmVyYXRlZCBmaWxlczsgdGhlcmUgaXMgbm8gcHJvZ3JhbQotY29ycmVzcG9uZGluZyB0byBAc2FtcHthdXRvY29uZn0uICBJbnN0ZWFkLCB0aGVyZSBpcyBhIHNpbmdsZSBzaGVsbAotc2NyaXB0IG5hbWVkIEBzYW1we2NvbmZpZ3VyZX0gd2hpY2ggbWF5IGJlIGZvdW5kIGF0IHRoZSB0b3Agb2YgdGhlCi1DeWdudXMgdHJlZS4gIFRoaXMgc2hlbGwgc2NyaXB0IHdhcyB3cml0dGVuIGJ5IGhhbmQ7IGl0IHdhcyBub3QKLWdlbmVyYXRlZCBieSBhdXRvY29uZiwgYW5kIGl0IGlzIGluY29ycmVjdCwgYW5kIGluZGVlZCBoYXJtZnVsLCB0byBydW4KLUBzYW1we2F1dG9jb25mfSBpbiB0aGUgdG9wIGxldmVsIG9mIGEgQ3lnbnVzIHRyZWUuCi0KLUN5Z251cyBjb25maWd1cmUgd29ya3MgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBieSBleGFtaW5pbmcgdGhlIGZpbGUKLUBmaWxle2NvbmZpZ3VyZS5pbn0gaW4gdGhhdCBkaXJlY3RvcnkuICBUaGF0IGZpbGUgaXMgYnJva2VuIGludG8gZm91cgotc2VwYXJhdGUgc2hlbGwgc2NyaXB0cy4KLQotVGhlIGZpcnN0IGlzIHRoZSBjb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0Ci1zdGFydHMgd2l0aCBAc2FtcHsjIHBlci1ob3N0On0uICBUaGlzIGlzIHRoZSBjb21tb24gcGFydC4KLQotVGhlIHNlY29uZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBlci10YXJnZXQ6fS4gIFRoaXMgaXMgdGhlIHBlciBob3N0IHBhcnQuCi0KLVRoZSB0aGlyZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBvc3QtdGFyZ2V0On0uICBUaGlzIGlzIHRoZSBwZXIgdGFyZ2V0IHBhcnQuCi0KLVRoZSBmb3VydGggaXMgdGhlIHJlbWFpbmRlciBvZiBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBpcyB0aGUgcG9zdAotdGFyZ2V0IHBhcnQuCi0KLUlmIGFueSBvZiB0aGVzZSBjb21tZW50IGxpbmVzIGFyZSBtaXNzaW5nLCB0aGUgY29ycmVzcG9uZGluZyBzaGVsbAotc2NyaXB0IGlzIGVtcHR5LgotCi1DeWdudXMgY29uZmlndXJlIHdpbGwgZmlyc3QgZXhlY3V0ZSB0aGUgY29tbW9uIHBhcnQuICBUaGlzIG11c3Qgc2V0IHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7c3JjdHJpZ2dlcn0gdG8gdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSwgdG8KLWNvbmZpcm0gdGhhdCBDeWdudXMgY29uZmlndXJlIGlzIGxvb2tpbmcgYXQgdGhlIHJpZ2h0IGRpcmVjdG9yeS4gIFRoaXMKLW1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlcyBAc2FtcHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IGFuZAotQHNhbXB7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHtidWlsZH0gYW5kIEBzYW1we2hvc3R9IHNoZWxsCi12YXJpYWJsZXMsIGFuZCBleGVjdXRlIHRoZSBwZXIgaG9zdCBwYXJ0LiAgVGhpcyBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7aG9zdF9tYWtlZmlsZV9mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHt0YXJnZXR9IHZhcmlhYmxlLCBhbmQgZXhlY3V0ZQotdGhlIHBlciB0YXJnZXQgcGFydC4gIFRoaXMgbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBzYW1we3RhcmdldF9tYWtlZmlsZV9mcmFnfS4KLQotQW55IG9mIHRoZXNlIHNjcmlwdHMgbWF5IHNldCB0aGUgQHNhbXB7c3ViZGlyc30gc2hlbGwgdmFyaWFibGUuICBUaGlzCi12YXJpYWJsZSBpcyBhIGxpc3Qgb2Ygc3ViZGlyZWN0b3JpZXMgd2hlcmUgYSBAZmlsZXtNYWtlZmlsZS5pbn0gZmlsZSBtYXkKLWJlIGZvdW5kLiAgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgbG9vayBmb3IgYQotQGZpbGV7TWFrZWZpbGUuaW59IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlIEBzYW1we3N1YmRpcnN9Ci1zaGVsbCB2YXJpYWJsZSBpcyBub3Qgbm9ybWFsbHkgdXNlZCwgYW5kIEkgYmVsaWV2ZSB0aGF0IHRoZSBvbmx5Ci1kaXJlY3Rvcnkgd2hpY2ggdXNlcyBpdCBhdCBwcmVzZW50IGlzIEBmaWxle25ld2xpYn0uCi0KLUZvciBlYWNoIEBmaWxle01ha2VmaWxlLmlufSwgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCi1hIEBmaWxle01ha2VmaWxlfSBieSBhZGRpbmcgZGVmaW5pdGlvbnMgZm9yIEBzYW1we21ha2V9IHZhcmlhYmxlcyBzdWNoCi1hcyBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSwgYW5kIGF1dG9tYXRpY2FsbHkgZWRpdGluZyB0aGUgdmFsdWVzCi1vZiBAc2FtcHttYWtlfSB2YXJpYWJsZXMgc3VjaCBhcyBAc2FtcHtwcmVmaXh9IGlmIHRoZXkgYXJlIHByZXNlbnQuCi0KLUFsc28sIGlmIGFueSBvZiB0aGUgQHNhbXB7bWFrZWZpbGVfZnJhZ30gc2hlbGwgdmFyaWFibGVzIGFyZSBzZXQsIEN5Z251cwotY29uZmlndXJlIHdpbGwgaW50ZXJwcmV0IHRoZW0gYXMgZmlsZSBuYW1lcyByZWxhdGl2ZSB0byBlaXRoZXIgdGhlCi13b3JraW5nIGRpcmVjdG9yeSBvciB0aGUgc291cmNlIGRpcmVjdG9yeSwgYW5kIHdpbGwgcmVhZCB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIGludG8gdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBUaGUgZmlsZSBjb250ZW50cyB3aWxsIGJlCi1yZWFkIGluIGFmdGVyIHRoZSBmaXJzdCBsaW5lIGluIEBmaWxle01ha2VmaWxlLmlufSB3aGljaCBzdGFydHMgd2l0aAotQHNhbXB7IyMjI30uCi0KLVRoZXNlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMgYXJlIHVzZWQgdG8gY3VzdG9taXplIGJlaGF2aW91ciBmb3IgYQotcGFydGljdWxhciBob3N0IG9yIHRhcmdldC4gIFRoZXkgc2VydmUgdG8gc2VsZWN0IHBhcnRpY3VsYXIgZmlsZXMgdG8KLWNvbXBpbGUsIGFuZCB0byBkZWZpbmUgcGFydGljdWxhciBwcmVwcm9jZXNzb3IgbWFjcm9zIGJ5IHByb3ZpZGluZwotdmFsdWVzIGZvciBAc2FtcHttYWtlfSB2YXJpYWJsZXMgd2hpY2ggYXJlIHRoZW4gdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCi1DeWdudXMgY29uZmlndXJlLCB1bmxpa2UgYXV0b2NvbmYsIG5vcm1hbGx5IGRvZXMgbm90IGRvIGZlYXR1cmUgdGVzdHMsCi1hbmQgbm9ybWFsbHkgcmVxdWlyZXMgc3VwcG9ydCB0byBiZSBhZGRlZCBtYW51YWxseSBmb3IgZWFjaCBuZXcgaG9zdC4KLQotVGhlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudCBzdXBwb3J0IGlzIHNpbWlsYXIgdG8gdGhlIGF1dG9jb25mCi1Ac2FtcHtBQ19TVUJTVF9GSUxFfSBtYWNyby4KLQotQWZ0ZXIgY3JlYXRpbmcgZWFjaCBAZmlsZXtNYWtlZmlsZX0sIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQgd2lsbCBiZSBydW4KLShpLmUuLCBpdCBtYXkgYmUgcnVuIHNldmVyYWwgdGltZXMpLiAgVGhpcyBzY3JpcHQgbWF5IGZ1cnRoZXIgY3VzdG9taXplCi10aGUgQGZpbGV7TWFrZWZpbGV9LiAgV2hlbiBpdCBpcyBydW4sIHRoZSBzaGVsbCB2YXJpYWJsZSBAc2FtcHtNYWtlZmlsZX0KLXdpbGwgaG9sZCB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9LCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1kaXJlY3RvcnkgY29tcG9uZW50LgotCi1MaWtlIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgQ3lnbnVzIGNvbmZpZ3VyZQotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle2NvbmZpZy5zdGF0dXN9IHdoaWNoLCB3aGVuIHJ1biwgd2lsbAotYXV0b21hdGljYWxseSByZWNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi4gIFRoZSBAZmlsZXtjb25maWcuc3RhdHVzfSBmaWxlCi13aWxsIHNpbXBseSBleGVjdXRlIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBhZ2FpbiB3aXRoIHRoZQotYXBwcm9wcmlhdGUgYXJndW1lbnRzLgotCi1Bbnkgb2YgdGhlIHBhcnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGVzCi1Ac2FtcHtmaWxlc30gYW5kIEBzYW1we2xpbmtzfS4gIEN5Z251cyBjb25maWd1cmUgd2lsbCBzZXQgdXAgc3ltbGlua3MKLWZyb20gdGhlIG5hbWVzIGluIEBzYW1we2xpbmtzfSB0byB0aGUgZmlsZXMgbmFtZWQgaW4gQHNhbXB7ZmlsZXN9LiAgVGhpcwotaXMgc2ltaWxhciB0byB0aGUgYXV0b2NvbmYgQHNhbXB7QUNfTElOS19GSUxFU30gbWFjcm8uCi0KLUZpbmFsbHksIGFueSBvZiB0aGUgcGFydHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7Y29uZmlnZGlyc30gdG8gYSBzZXQgb2Ygc3ViZGlyZWN0b3JpZXMuICBJZiBpdCBpcyBzZXQsCi1DeWdudXMgY29uZmlndXJlIHdpbGwgcmVjdXJzaXZlbHkgcnVuIHRoZSBjb25maWd1cmUgcHJvY2VzcyBpbiBlYWNoCi1zdWJkaXJlY3RvcnkuICBJZiB0aGUgc3ViZGlyZWN0b3J5IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgaXQgd2lsbAotY29udGFpbiBhIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBidXQgbm8gQGZpbGV7Y29uZmlndXJlfSBmaWxlLCBpbgotd2hpY2ggY2FzZSBDeWdudXMgY29uZmlndXJlIHdpbGwgaW52b2tlIGl0c2VsZiByZWN1cnNpdmVseS4gIElmIHRoZQotc3ViZGlyZWN0b3J5IGhhcyBhIEBmaWxle2NvbmZpZ3VyZX0gZmlsZSwgQ3lnbnVzIGNvbmZpZ3VyZSBhc3N1bWVzIHRoYXQKLWl0IGlzIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIHNpbXBseSBpbnZva2VzCi1pdCBkaXJlY3RseS4KLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzCi1Ac2VjdGlvbiBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMKLUBjaW5kZXggQGZpbGV7bGlic3RkYysrfSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7bGliaW99IGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtsaWJnKyt9IGNvbmZpZ3VyZQotCi1UaGUgQysrIGxpYnJhcnkgY29uZmlndXJlIHN5c3RlbSwgd3JpdHRlbiBieSBQZXIgQm90aG5lciwgZGVzZXJ2ZXMKLXNwZWNpYWwgbWVudGlvbi4gIEl0IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgYnV0IGl0IGRvZXMgZmVhdHVyZSB0ZXN0aW5nCi1saWtlIHRoYXQgZG9uZSBieSBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHRzLiAgVGhpcwotYXBwcm9hY2ggaXMgdXNlZCBpbiB0aGUgbGlicmFyaWVzIEBmaWxle2xpYmlvfSwgQGZpbGV7bGlic3RkYysrfSwgYW5kCi1AZmlsZXtsaWJnKyt9LgotCi1Nb3N0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBvdXQgYnkgdGhlIHNoZWxsCi1zY3JpcHQgQGZpbGV7bGliaW8vY29uZmlnLnNoYXJlZH0uICBFYWNoIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBzZXRzCi1jZXJ0YWluIHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gaW52b2tlcyBAZmlsZXtjb25maWcuc2hhcmVkfSB0byBjcmVhdGUKLXR3byBwYWNrYWdlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMuICBUaGVzZSBmcmFnbWVudHMgYXJlIHRoZW4KLWluY29ycG9yYXRlZCBpbnRvIHRoZSByZXN1bHRpbmcgQGZpbGV7TWFrZWZpbGV9IGJ5IHRoZSBDeWdudXMgY29uZmlndXJlCi1zY3JpcHQuCi0KLVRoZSBmaWxlIEBmaWxle19HX2NvbmZpZy5ofSBpcyBjcmVhdGVkIGluIHRoZSBAZmlsZXtsaWJpb30gb2JqZWN0Ci1kaXJlY3RvcnkgYnkgcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2xpYmlvL2dlbi1wYXJhbXN9LiAgVGhpcwotc2hlbGwgc2NyaXB0IHVzZXMgZmVhdHVyZSB0ZXN0cyB0byBkZWZpbmUgbWFjcm9zIGFuZCB0eXBlZGVmcyBpbgotQGZpbGV7X0dfY29uZmlnLmh9LgotCi1Abm9kZSBNdWx0aWxpYnMKLUBjaGFwdGVyIE11bHRpbGlicwotQGNpbmRleCBtdWx0aWxpYnMKLQotRm9yIHNvbWUgdGFyZ2V0cyBnY2MgbWF5IGhhdmUgZGlmZmVyZW50IHByb2Nlc3NvciByZXF1aXJlbWVudHMgZGVwZW5kaW5nCi11cG9uIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgQW4gb2J2aW91cyBleGFtcGxlIGlzIHRoZQotQHNhbXB7LW1zb2Z0LWZsb2F0fSBvcHRpb24gc3VwcG9ydGVkIG9uIHNldmVyYWwgcHJvY2Vzc29ycy4gIFRoaXMgb3B0aW9uCi1tZWFucyB0aGF0IHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIG5vdCBhdmFpbGFibGUsIHdoaWNoIG1lYW5zCi10aGF0IGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgbXVzdCBiZSBkb25lIGJ5IGNhbGxpbmcgYW4gZW11bGF0aW9uCi1zdWJyb3V0aW5lIHJhdGhlciB0aGFuIGJ5IHVzaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgotCi1Gb3Igc3VjaCBvcHRpb25zLCBnY2MgaXMgb2Z0ZW4gY29uZmlndXJlZCB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMKLXR3aWNlOiBvbmNlIHdpdGggQHNhbXB7LW1zb2Z0LWZsb2F0fSBhbmQgb25jZSB3aXRob3V0LiAgV2hlbiBnY2MKLWNvbXBpbGVzIHRhcmdldCBsaWJyYXJpZXMgbW9yZSB0aGFuIG9uY2UsIHRoZSByZXN1bHRpbmcgbGlicmFyaWVzIGFyZQotY2FsbGVkIEBkZm57bXVsdGlsaWJzfS4KLQotTXVsdGlsaWJzIGFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSwgYnV0Ci13ZSBkaXNjdXNzIHRoZW0gaGVyZSBzaW5jZSB0aGV5IHJlcXVpcmUgc3VwcG9ydCBpbiB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0cyBhbmQgQGZpbGV7TWFrZWZpbGV9cyB1c2VkIGZvciB0YXJnZXQgbGlicmFyaWVzLgotCi1AbWVudQotKiBNdWx0aWxpYnMgaW4gZ2NjOjoJCSAgICAgICAgTXVsdGlsaWJzIGluIGdjYy4KLSogTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXM6OglNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBNdWx0aWxpYnMgaW4gZ2NjCi1Ac2VjdGlvbiBNdWx0aWxpYnMgaW4gZ2NjCi0KLUluIGdjYywgbXVsdGlsaWJzIGFyZSBkZWZpbmVkIGJ5IHNldHRpbmcgdGhlIHZhcmlhYmxlCi1Ac2FtcHtNVUxUSUxJQl9PUFRJT05TfSBpbiB0aGUgdGFyZ2V0IEBmaWxle01ha2VmaWxlfSBmcmFnbWVudC4gIFNldmVyYWwKLW90aGVyIEBzYW1we01VTFRJTElCfSB2YXJpYWJsZXMgbWF5IGFsc28gYmUgZGVmaW5lZCB0aGVyZS4gIEB4cmVme1RhcmdldAotRnJhZ21lbnQsICwgVGhlIFRhcmdldCBNYWtlZmlsZSBGcmFnbWVudCwgZ2NjLCBVc2luZyBhbmQgUG9ydGluZyBHTlUKLUNDfS4KLQotSWYgeW91IGhhdmUgYnVpbHQgZ2NjLCB5b3UgY2FuIHNlZSB3aGF0IG11bHRpbGlicyBpdCB1c2VzIGJ5IHJ1bm5pbmcgaXQKLXdpdGggdGhlIEBzYW1wey1wcmludC1tdWx0aS1saWJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgQHNhbXB7Ljt9IG1lYW5zCi10aGF0IG5vIG11bHRpbGlicyBhcmUgdXNlZC4gIEluIGdlbmVyYWwsIHRoZSBvdXRwdXQgaXMgYSBzZXF1ZW5jZSBvZgotbGluZXMsIG9uZSBwZXIgbXVsdGlsaWIuICBUaGUgZmlyc3QgcGFydCBvZiBlYWNoIGxpbmUsIHVwIHRvIHRoZQotQHNhbXB7O30sIGlzIHRoZSBuYW1lIG9mIHRoZSBtdWx0aWxpYiBkaXJlY3RvcnkuICBUaGUgc2Vjb25kIHBhcnQgaXMgYQotbGlzdCBvZiBjb21waWxlciBvcHRpb25zIHNlcGFyYXRlZCBieSBAc2FtcHtAQH0gY2hhcmFjdGVycy4KLQotTXVsdGlsaWJzIGFyZSBidWlsdCBpbiBhIHRyZWUgb2YgZGlyZWN0b3JpZXMuICBUaGUgdG9wIG9mIHRoZSB0cmVlLAotcmVwcmVzZW50ZWQgYnkgQHNhbXB7Ln0gaW4gdGhlIGxpc3Qgb2YgbXVsdGlsaWIgZGlyZWN0b3JpZXMsIGlzIHRoZQotZGVmYXVsdCBsaWJyYXJ5IHRvIHVzZSB3aGVuIG5vIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZC4gIFRoZQotc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHRyZWUgaG9sZCB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSB0byB1c2Ugd2hlbgotcGFydGljdWxhciBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkLgotCi1Abm9kZSBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcwotQHNlY3Rpb24gTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMKLQotVGhlIHRhcmdldCBsaWJyYXJpZXMgaW4gdGhlIEN5Z251cyB0cmVlIGFyZSBhdXRvbWF0aWNhbGx5IGJ1aWx0IHdpdGgKLW11bHRpbGlicy4gIFRoYXQgbWVhbnMgdGhhdCBlYWNoIGxpYnJhcnkgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMuCi0KLVRoaXMgZGVmYXVsdCBpcyBzZXQgaW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGJ5IGFkZGluZwotQHNhbXB7LS1lbmFibGUtbXVsdGlsaWJ9IHRvIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gY29uZmlndXJlCi13aGVuIGl0IGlzIHJ1biBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgKEBweHJlZntIb3N0IGFuZCBUYXJnZXQKLUxpYnJhcmllc30pLgotCi1FYWNoIHRhcmdldCBsaWJyYXJ5IHVzZXMgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWctbWwuaW59LCB3cml0dGVuCi1ieSBEb3VnIEV2YW5zLCB0byBwcmVwYXJlIHRvIGJ1aWxkIHRhcmdldCBsaWJyYXJpZXMuICBUaGlzIHNoZWxsIHNjcmlwdAotaXMgaW52b2tlZCBhZnRlciB0aGUgQGZpbGV7TWFrZWZpbGV9IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlCi1AZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIElmIG11bHRpbGlicyBhcmUgbm90IGVuYWJsZWQsIGl0IGRvZXMgbm90aGluZywKLW90aGVyd2lzZSBpdCBtb2RpZmllcyB0aGUgQGZpbGV7TWFrZWZpbGV9IHRvIHN1cHBvcnQgbXVsdGlsaWJzLgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgbWFrZXMgb25lIGNvcHkgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBmb3IKLWVhY2ggbXVsdGlsaWIgaW4gdGhlIGFwcHJvcHJpYXRlIHN1YmRpcmVjdG9yeS4gIFdoZW4gY29uZmlndXJpbmcgaW4gdGhlCi1zb3VyY2UgZGlyZWN0b3J5ICh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLCBpdCB3aWxsIGJ1aWxkIGEgc3ltbGluawotdHJlZSBvZiB0aGUgc291cmNlcyBpbiBlYWNoIHN1YmRpcmVjdG9yeS4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IHNldHMgc2V2ZXJhbCB2YXJpYWJsZXMgaW4gdGhlIHZhcmlvdXMKLUBmaWxle01ha2VmaWxlfXMuICBUaGUgQGZpbGV7TWFrZWZpbGUuaW59IG11c3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IKLXRoZXNlIHZhcmlhYmxlcyBhbHJlYWR5OyBAZmlsZXtjb25maWctbWwuaW59IHNpbXBseSBjaGFuZ2VzIHRoZSBleGlzdGluZwotdmFsdWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZQotdmFyaWFibGVzIHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIHRoZSBzdWJkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBNVUxUSVNSQ1RPUAotQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIGEgc2VxdWVuY2Ugb2YgQHNhbXB7Li4vfSBzdHJpbmdzLAotd2hlcmUgdGhlIG51bWJlciBvZiBzdHJpbmdzIGlzIHRoZSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZQotc291cmNlIHRyZWUuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlIGVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJQlVJTERUT1AKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byBhIHNlcXVlbmNlIG9mIEBzYW1wey4uL30gc3RyaW5ncywKLXdoZXJlIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpcyBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZSBvYmplY3QKLWRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgVGhpcyB3aWxsCi1kaWZmZXIgZnJvbSBAc2FtcHtNVUxUSVNSQ1RPUH0gd2hlbiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWUKLSh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLgotQGl0ZW0gTVVMVElESVJTCi1JbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBvbmx5LCBAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMKLXRvIHRoZSBsaXN0IG9mIG11bHRpbGliIHN1YmRpcmVjdG9yaWVzLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZQotZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElTVUJESVIKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHRvCi11c2UgZm9yIHRoaXMgc3ViZGlyZWN0b3J5LCB3aXRoIGEgbGVhZGluZyBAc2FtcHsvfS4gIFRoZSBkZWZhdWx0IHZhbHVlCi1zaG9sZCBiZSB0aGUgZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElETwotQGl0ZW14IE1VTFRJQ0xFQU4KLUluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IG9ubHksIEBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQKLXRoZXNlIHZhcmlhYmxlcyB0byBjb21tYW5kcyB0byB1c2Ugd2hlbiBkb2luZyBhIHJlY3Vyc2l2ZSBtYWtlLiAgVGhlc2UKLXZhcmlhYmxlcyBzaG91bGQgYm90aCBkZWZhdWx0IHRvIHRoZSBzdHJpbmcgQHNhbXB7dHJ1ZX0sIHNvIHRoYXQgYnkKLWRlZmF1bHQgbm90aGluZyBoYXBwZW5zLgotQGVuZCB0YWJsZQotCi1BbGwgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHNob3VsZCB1c2UgdGhlCi12YXJpYWJsZSBAc2FtcHtNVUxUSVNSQ1RPUH0uICBJbnN0ZWFkIG9mIHdyaXRpbmcgQHNhbXB7JChzcmNkaXIpLy4ufSwKLXlvdSBtdXN0IHdyaXRlIEBzYW1weyQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4ufS4KLQotU2ltaWxhcmx5LCByZWZlcmVuY2VzIHRvIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdCBkaXJlY3Rvcnkgc2hvdWxkIHVzZQotdGhlIHZhcmlhYmxlIEBzYW1we01VTFRJQlVJTERUT1B9LgotCi1JbiB0aGUgaW5zdGFsbGF0aW9uIHRhcmdldCwgdGhlIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIHRoZQotc3ViZGlyZWN0b3J5IEBzYW1we01VTFRJU1VCRElSfS4gIEluc3RlYWQgb2YgaW5zdGFsbGluZwotQHNhbXB7JChsaWJkaXIpL2xpYmZvby5hfSwgaW5zdGFsbAotQHNhbXB7JChsaWJkaXIpJChNVUxUSVNVQkRJUikvbGliZm9vLmF9LgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgYWxzbyBtb2RpZmllcyB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0gdG8gYWRkIEBzYW1we211bHRpLWRvfSBhbmQgQHNhbXB7bXVsdGktY2xlYW59IHRhcmdldHMKLXdoaWNoIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgbXVsdGlsaWJzLgotCi1UaGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgRE89YWxsIG11bHRpLWRvCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIGFzc3VtZXMgdGhhdCBAc2FtcHskKEZMQUdTX1RPX1BBU1MpfSBpcyBkZWZpbmVkIGFzIGEgc2V0IG9mCi12YXJpYWJsZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIEBzYW1we21ha2V9LiAgVGhpcyB3aWxsCi1idWlsZCBhbGwgdGhlIG11bHRpbGlicy4gIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtNVUxUSURPfQotaXMgQHNhbXB7dHJ1ZX0sIHNvIGJ5IGRlZmF1bHQgdGhpcyBjb21tYW5kIHdpbGwgZG8gbm90aGluZy4gIEl0IHdpbGwKLW9ubHkgZG8gc29tZXRoaW5nIGluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IGlmIG11bHRpbGlicyB3ZXJlCi1lbmFibGVkLgotCi1UaGUgQHNhbXB7aW5zdGFsbH0gdGFyZ2V0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIGluY2x1ZGUgdGhlCi1mb2xsb3dpbmcgY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIERPPWluc3RhbGwgbXVsdGktZG8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIGdlbmVyYWwsIGFueSBvcGVyYXRpb24sIG90aGVyIHRoYW4gY2xlYW4sIHdoaWNoIHNob3VsZCBiZSBwZXJmb3JtZWQKLW9uIGFsbCB0aGUgbXVsdGlsaWJzIHNob3VsZCB1c2UgYSBAc2FtcHskKE1VTFRJRE8pfSBsaW5lLCBzZXR0aW5nIHRoZQotdmFyaWFibGUgQHNhbXB7RE99IHRvIHRoZSB0YXJnZXQgb2YgZWFjaCByZWN1cnNpdmUgY2FsbCB0byBAc2FtcHttYWtlfS4KLQotVGhlIEBzYW1we2NsZWFufSB0YXJnZXRzIChAc2FtcHtjbGVhbn0sIEBzYW1we21vc3RseWNsZWFufSwgZXRjLikgc2hvdWxkCi11c2UgQHNhbXB7JChNVUxUSUNMRUFOKX0uICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we2NsZWFufSB0YXJnZXQgc2hvdWxkCi1kbyB0aGlzOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJQ0xFQU4pIERPPWNsZWFuIG11bHRpLWNsZWFuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBGQVEKLUBjaGFwdGVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gV2hpY2ggZG8gSSBydW4gZmlyc3QsIEBzYW1we2F1dG9jb25mfSBvciBAc2FtcHthdXRvbWFrZX0/Ci1FeGNlcHQgd2hlbiB5b3UgZmlyc3QgYWRkIGF1dG9jb25mIG9yIGF1dG9tYWtlIHN1cHBvcnQgdG8gYSBwYWNrYWdlLCB5b3UKLXNob3VsZG4ndCBydW4gZWl0aGVyIGJ5IGhhbmQuICBJbnN0ZWFkLCBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBhbmQgbGV0IEBzYW1we21ha2V9IHRha2UgY2FyZSBvZgotaXQuCi0KLUBjaW5kZXggdW5kZWZpbmVkIG1hY3JvcwotQGl0ZW0gQHNhbXB7YXV0b2NvbmZ9IHNheXMgc29tZXRoaW5nIGFib3V0IHVuZGVmaW5lZCBtYWNyb3MuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBhcmUKLW5vdCBkZWZpbmVkIGJ5IEBzYW1we2F1dG9jb25mfS4gIFlvdSBtYXkgYmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YKLUBzYW1we2F1dG9jb25mfTsgdHJ5IGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGEgbmV3ZXIgb25lLiAgTWFrZSBzdXJlIHRoZQotbmV3bHkgaW5zdGFsbGxlZCBAc2FtcHthdXRvY29uZn0gaXMgZmlyc3Qgb24geW91ciBAc2FtcHtQQVRIfS4gIEFsc28sCi1zZWUgdGhlIG5leHQgcXVlc3Rpb24uCi0KLUBjaW5kZXggQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGluIEBmaWxle2NvbmZpZ3VyZX0KLUBjaW5kZXggQHNhbXB7QU1fUFJPR19MSUJUT09MfSBpbiBAZmlsZXtjb25maWd1cmV9Ci1AaXRlbSBNeSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBoYXMgc3R1ZmYgbGlrZSBAc2FtcHtDWV9HTlVfR0VUVEVYVH0gaW4gaXQuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBzaG91bGQKLWJlIGRlZmluZWQgaW4geW91ciBAZmlsZXthY2xvY2FsLm00fSBmaWxlLCBidXQgYXJlbid0LiAgVGhpcyB1c3VhbGx5Ci1tZWFucyB0aGF0IEBzYW1we2FjbG9jYWx9IHdhcyBub3QgYWJsZSB0byBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiB0aGUKLW1hY3Jvcy4gIE1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBhbGwgdGhlIHBhY2thZ2VzIHlvdSBuZWVkLgotSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIGxpYnRvb2wgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0FNX1BST0dfTElCVE9PTH0gaXMgZGVmaW5lZCkgYW5kIGdldHRleHQgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0NZX0dOVV9HRVRURVhUfSBpcyBkZWZpbmVkLCBhdCBsZWFzdCBpbiB0aGUgQ3lnbnVzIHZlcnNpb24gb2YKLWdldHRleHQpLgotCi1AY2luZGV4IEBmaWxle01ha2VmaWxlfSwgZ2FyYmFnZSBjaGFyYWN0ZXJzCi1AaXRlbSBNeSBAZmlsZXtNYWtlZmlsZX0gaGFzIEBzYW1we0BAfSBjaGFyYWN0ZXJzIGluIGl0LgotVGhpcyBtYXkgbWVhbiB0aGF0IHlvdSB0cmllZCB0byB1c2UgYW4gYXV0b2NvbmYgc3Vic3RpdHV0aW9uIGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmlufSB3aXRob3V0IGFkZGluZyB0aGUgYXBwcm9wcmlhdGUgQHNhbXB7QUNfU1VCU1R9IGNhbGwKLXRvIHlvdXIgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBPciBpdCBtYXkganVzdCBtZWFuIHRoYXQgeW91IG5lZWQgdG8KLXJlYnVpbGQgQGZpbGV7TWFrZWZpbGV9IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgVG8gcmVidWlsZAotQGZpbGV7TWFrZWZpbGV9IGZyb20gQGZpbGV7TWFrZWZpbGUuaW59LCBydW4gdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN0YXR1c30gd2l0aCBubyBhcmd1bWVudHMuICBJZiB5b3UgbmVlZCB0byBmb3JjZQotQGZpbGV7Y29uZmlndXJlfSB0byBydW4gYWdhaW4sIGZpcnN0IHJ1biBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30uCi1UaGVzZSBydW5zIGFyZSBub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMsCi1idXQgaWYgeW91ciBAZmlsZXtNYWtlZmlsZX0gaGFzIGdvdHRlbiBtZXNzZWQgdXAgeW91J2xsIG5lZWQgdG8gaGVscAotdGhlbSBhbG9uZy4KLQotQGNpbmRleCBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30KLUBpdGVtIFdoeSBkbyBJIGhhdmUgdG8gcnVuIGJvdGggQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9IGFuZCBAc2FtcHtjb25maWcuc3RhdHVzfT8KLU5vcm1hbGx5LCB5b3UgZG9uJ3Q7IHRoZXkgd2lsbCBiZSBydW4gYXV0b21hdGljYWxseSBieSBAZmlsZXtNYWtlZmlsZX0KLXRhcmdldHMuICBJZiB5b3UgZG8gbmVlZCB0byBydW4gdGhlbSwgdXNlIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfQotdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUKLWZpcnN0IHRpbWUgeW91IHJhbiBpdC4gIFVzZSBAc2FtcHtjb25maWcuc3RhdHVzfSAod2l0aCBubyBhcmd1bWVudHMpIHRvCi1yZWdlbmVyYXRlIGFsbCBmaWxlcyAoQGZpbGV7TWFrZWZpbGV9LCBAZmlsZXtjb25maWcuaH0sIGV0Yy4pIGJhc2VkIG9uCi10aGUgcmVzdWx0cyBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIFRoZSB0d28gY2FzZXMgYXJlIHNlcGFyYXRlIGJlY2F1c2UKLWl0IGlzbid0IGFsd2F5cyBuZWNlc3NhcnkgdG8gcmVnZW5lcmF0ZSBhbGwgdGhlIGZpbGVzIGFmdGVyIHJ1bm5pbmcKLUBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cyBnZW5lcmF0ZWQKLWJ5IGF1dG9tYWtlIHdpbGwgdXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q09ORklHX0ZJTEVTfSBhbmQKLUBzYW1we0NPTkZJR19IRUFERVJTfSB0byBvbmx5IHJlZ2VuZXJhdGUgZmlsZXMgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AaXRlbSBXaGF0IGlzIHRoZSBDeWdudXMgdHJlZT8KLVRoZSBDeWdudXMgdHJlZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2thZ2VzIGluY2x1ZGluZyBnZGIsIHRoZSBHTlUKLWJpbnV0aWxzLCBhbmQgZWdjcy4gIEl0IGlzIGFsc28sIG9mIGNvdXJzZSwgdXNlZCBmb3IgQ3lnbnVzIHJlbGVhc2VzLgotSXQgaXMgdGhlIGJ1aWxkIHN5c3RlbSB3aGljaCB3YXMgZGV2ZWxvcGVkIGF0IEN5Z251cywgdXNpbmcgdGhlIEN5Z251cwotY29uZmlndXJlIHNjcmlwdC4gIEl0IHBlcm1pdHMgYnVpbGRpbmcgbWFueSBkaWZmZXJlbnQgcGFja2FnZXMgd2l0aCBhCi1zaW5nbGUgY29uZmlndXJlIGFuZCBtYWtlLiAgVGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGluIHRoZSB0cmVlIGFyZSBiZWluZwotY29udmVydGVkIHRvIGF1dG9jb25mLCBidXQgdGhlIGdlbmVyYWwgYnVpbGQgc3RydWN0dXJlIHJlbWFpbnMgaW50YWN0LgotCi1AaXRlbSBXaHkgZG8gSSBoYXZlIHRvIGtlZXAgcmVidWlsZGluZyBhbmQgcmVpbnN0YWxsaW5nIHRoZSB0b29scz8KLUkga25vdywgaXQncyBhIHBhaW4uICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYnVncyBpbiB0aGUgdG9vbHMKLXRoZW1zZWx2ZXMgd2hpY2ggbmVlZCB0byBiZSBmaXhlZCwgYW5kIGVhY2ggdGltZSB0aGF0IGhhcHBlbnMgZXZlcnlib2R5Ci13aG8gdXNlcyB0aGUgdG9vbHMgbmVlZCB0byByZWluc3RhbGwgbmV3IHZlcnNpb25zIG9mIHRoZW0uICBJIGRvbid0IGtub3cKLWlmIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgY2xldmVyIGZpeCB1bnRpbCB0aGUgdG9vbHMgc3RhYmlsaXplLgotCi1AaXRlbSBXaHkgbm90IGp1c3QgaGF2ZSBhIEN5Z251cyB0cmVlIEBzYW1we21ha2V9IHRhcmdldCB0byB1cGRhdGUgdGhlIHRvb2xzPwotVGhlIHRvb2xzIHVuZm9ydHVuYXRlbHkgbmVlZCB0byBiZSBpbnN0YWxsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi1UaGF0IG1lYW5zIHRoYXQgdGhleSBtdXN0IGJlIGJ1aWx0IHVzaW5nIGFuIGFwcHJvcHJpYXRlIHByZWZpeCwgYW5kIGl0Ci1zZWVtcyB1bndpc2UgdG8gYXNzdW1lIHRoYXQgZXZlcnkgY29uZmlndXJhdGlvbiB1c2VzIGFuIGFwcHJvcHJpYXRlCi1wcmVmaXguICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoZW0gd29yayBpbiBwbGFjZSwgb3IgaXQgbWlnaHQgYmUKLXBvc3NpYmxlIHRvIGluc3RhbGwgdGhlbSBpbiBzb21lIHN1YmRpcmVjdG9yeTsgc28gZmFyIHRoZXNlIGFwcHJvYWNoZXMKLWhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2V0Yy9tYWtlLXN0ZHMudGV4aSBiL2V0Yy9tYWtlLXN0ZHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0OTc2NC4uMDAwMDAwMAotLS0gYS9ldGMvbWFrZS1zdGRzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotQGNvbW1lbnQgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJvdGggc3RhbmRhcmRzLnRleGkgYW5kIG1ha2UudGV4aW5mby4KLUBjb21tZW50IEl0IHdhcyBicm9rZW4gb3V0IG9mIHN0YW5kYXJkcy50ZXhpIG9uIDEvNi85MyBieSByb2xhbmQuCi0KLUBub2RlIE1ha2VmaWxlIENvbnZlbnRpb25zCi1AY2hhcHRlciBNYWtlZmlsZSBDb252ZW50aW9ucwotQGNvbW1lbnQgc3RhbmRhcmRzLnRleGkgZG9lcyBub3QgcHJpbnQgYW4gaW5kZXgsIGJ1dCBtYWtlLnRleGluZm8gZG9lcy4KLUBjaW5kZXggbWFrZWZpbGUsIGNvbnZlbnRpb25zIGZvcgotQGNpbmRleCBjb252ZW50aW9ucyBmb3IgbWFrZWZpbGVzCi1AY2luZGV4IHN0YW5kYXJkcyBmb3IgbWFrZWZpbGVzCi0KLVRoaXMKLUBpZmluZm8KLW5vZGUKLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBpZnNldCBDT0RFU1RECi1zZWN0aW9uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBDT0RFU1RECi1jaGFwdGVyCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZ0ZXgKLWRlc2NyaWJlcyBjb252ZW50aW9ucyBmb3Igd3JpdGluZyB0aGUgTWFrZWZpbGVzIGZvciBHTlUgcHJvZ3JhbXMuCi0KLUBtZW51Ci0qIE1ha2VmaWxlIEJhc2ljczo6CQlHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLSogVXRpbGl0aWVzIGluIE1ha2VmaWxlczo6CVV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLSogQ29tbWFuZCBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCi0qIERpcmVjdG9yeSBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBJbnN0YWxsYXRpb24gRGlyZWN0b3JpZXMKLSogU3RhbmRhcmQgVGFyZ2V0czo6CQlTdGFuZGFyZCBUYXJnZXRzIGZvciBVc2VycwotKiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllczo6ICBUaHJlZSBjYXRlZ29yaWVzIG9mIGNvbW1hbmRzIGluIHRoZSBgaW5zdGFsbCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlOiBub3JtYWwsIHByZS1pbnN0YWxsIGFuZCBwb3N0LWluc3RhbGwuCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFrZWZpbGUgQmFzaWNzCi1Ac2VjdGlvbiBHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhpcyBsaW5lOgotCi1AZXhhbXBsZQotU0hFTEwgPSAvYmluL3NoCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci10byBhdm9pZCB0cm91YmxlIG9uIHN5c3RlbXMgd2hlcmUgdGhlIEBjb2Rle1NIRUxMfSB2YXJpYWJsZSBtaWdodCBiZQotaW5oZXJpdGVkIGZyb20gdGhlIGVudmlyb25tZW50LiAgKFRoaXMgaXMgbmV2ZXIgYSBwcm9ibGVtIHdpdGggR05VCi1AY29kZXttYWtlfS4pCi0KLURpZmZlcmVudCBAY29kZXttYWtlfSBwcm9ncmFtcyBoYXZlIGluY29tcGF0aWJsZSBzdWZmaXggbGlzdHMgYW5kCi1pbXBsaWNpdCBydWxlcywgYW5kIHRoaXMgc29tZXRpbWVzIGNyZWF0ZXMgY29uZnVzaW9uIG9yIG1pc2JlaGF2aW9yLiAgU28KLWl0IGlzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGUgc3VmZml4IGxpc3QgZXhwbGljaXRseSB1c2luZyBvbmx5IHRoZQotc3VmZml4ZXMgeW91IG5lZWQgaW4gdGhlIHBhcnRpY3VsYXIgTWFrZWZpbGUsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBmaXJzdCBsaW5lIGNsZWFycyBvdXQgdGhlIHN1ZmZpeCBsaXN0LCB0aGUgc2Vjb25kIGludHJvZHVjZXMgYWxsCi1zdWZmaXhlcyB3aGljaCBtYXkgYmUgc3ViamVjdCB0byBpbXBsaWNpdCBydWxlcyBpbiB0aGlzIE1ha2VmaWxlLgotCi1Eb24ndCBhc3N1bWUgdGhhdCBAZmlsZXsufSBpcyBpbiB0aGUgcGF0aCBmb3IgY29tbWFuZCBleGVjdXRpb24uICBXaGVuCi15b3UgbmVlZCB0byBydW4gcHJvZ3JhbXMgdGhhdCBhcmUgYSBwYXJ0IG9mIHlvdXIgcGFja2FnZSBkdXJpbmcgdGhlCi1tYWtlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgaXQgdXNlcyBAZmlsZXsuL30gaWYgdGhlIHByb2dyYW0gaXMgYnVpbHQgYXMKLXBhcnQgb2YgdGhlIG1ha2Ugb3IgQGZpbGV7JChzcmNkaXIpL30gaWYgdGhlIGZpbGUgaXMgYW4gdW5jaGFuZ2luZyBwYXJ0Ci1vZiB0aGUgc291cmNlIGNvZGUuICBXaXRob3V0IG9uZSBvZiB0aGVzZSBwcmVmaXhlcywgdGhlIGN1cnJlbnQgc2VhcmNoCi1wYXRoIGlzIHVzZWQuCi0KLVRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEBmaWxley4vfSAodGhlIEBkZm57YnVpbGQgZGlyZWN0b3J5fSkgYW5kCi1AZmlsZXskKHNyY2RpcikvfSAodGhlIEBkZm57c291cmNlIGRpcmVjdG9yeX0pIGlzIGltcG9ydGFudCBiZWNhdXNlCi11c2VycyBjYW4gYnVpbGQgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnkgdXNpbmcgdGhlIEBzYW1wey0tc3JjZGlyfSBvcHRpb24KLXRvIEBmaWxle2NvbmZpZ3VyZX0uICBBIHJ1bGUgb2YgdGhlIGZvcm06Ci0KLUBzbWFsbGV4YW1wbGUKLWZvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKLSAgICAgICAgc2VkIC1lIHNlZHNjcmlwdCBmb28ubWFuID4gZm9vLjEKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2lsbCBmYWlsIHdoZW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyBub3QgdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UKLUBmaWxle2Zvby5tYW59IGFuZCBAZmlsZXtzZWRzY3JpcHR9IGFyZSBpbiB0aGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVdoZW4gdXNpbmcgR05VIEBjb2Rle21ha2V9LCByZWx5aW5nIG9uIEBzYW1we1ZQQVRIfSB0byBmaW5kIHRoZSBzb3VyY2UKLWZpbGUgd2lsbCB3b3JrIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGEgc2luZ2xlIGRlcGVuZGVuY3kgZmlsZSwKLXNpbmNlIHRoZSBAY29kZXttYWtlfSBhdXRvbWF0aWMgdmFyaWFibGUgQHNhbXB7JDx9IHdpbGwgcmVwcmVzZW50IHRoZQotc291cmNlIGZpbGUgd2hlcmV2ZXIgaXQgaXMuICAoTWFueSB2ZXJzaW9ucyBvZiBAY29kZXttYWtlfSBzZXQgQHNhbXB7JDx9Ci1vbmx5IGluIGltcGxpY2l0IHJ1bGVzLikgIEEgTWFrZWZpbGUgdGFyZ2V0IGxpa2UKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jIGJhci5jIC1vIGZvby5vCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXNob3VsZCBpbnN0ZWFkIGJlIHdyaXR0ZW4gYXMKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jICQ8IC1vICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbiBvcmRlciB0byBhbGxvdyBAc2FtcHtWUEFUSH0gdG8gd29yayBjb3JyZWN0bHkuICBXaGVuIHRoZSB0YXJnZXQgaGFzCi1tdWx0aXBsZSBkZXBlbmRlbmNpZXMsIHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1weyQoc3JjZGlyKX0gaXMgdGhlIGVhc2llc3QKLXdheSB0byBtYWtlIHRoZSBydWxlIHdvcmsgd2VsbC4gIEZvciBleGFtcGxlLCB0aGUgdGFyZ2V0IGFib3ZlIGZvcgotQGZpbGV7Zm9vLjF9IGlzIGJlc3Qgd3JpdHRlbiBhczoKLQotQHNtYWxsZXhhbXBsZQotZm9vLjEgOiBmb28ubWFuIHNlZHNjcmlwdAotICAgICAgICBzZWQgLWUgJChzcmNkaXIpL3NlZHNjcmlwdCAkKHNyY2RpcikvZm9vLm1hbiA+ICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIGRpc3RyaWJ1dGlvbnMgdXN1YWxseSBjb250YWluIHNvbWUgZmlsZXMgd2hpY2ggYXJlIG5vdCBzb3VyY2UKLWZpbGVzLS0tZm9yIGV4YW1wbGUsIEluZm8gZmlsZXMsIGFuZCB0aGUgb3V0cHV0IGZyb20gQXV0b2NvbmYsIEF1dG9tYWtlLAotQmlzb24gb3IgRmxleC4gIFNpbmNlIHRoZXNlIGZpbGVzIG5vcm1hbGx5IGFwcGVhciBpbiB0aGUgc291cmNlCi1kaXJlY3RvcnksIHRoZXkgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIG5vdCBpbiB0aGUKLWJ1aWxkIGRpcmVjdG9yeS4gIFNvIE1ha2VmaWxlIHJ1bGVzIHRvIHVwZGF0ZSB0aGVtIHNob3VsZCBwdXQgdGhlCi11cGRhdGVkIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1Ib3dldmVyLCBpZiBhIGZpbGUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBkaXN0cmlidXRpb24sIHRoZW4gdGhlCi1NYWtlZmlsZSBzaG91bGQgbm90IHB1dCBpdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSBidWlsZGluZyBhCi1wcm9ncmFtIGluIG9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHNvdXJjZSBkaXJlY3RvcnkKLWluIGFueSB3YXkuCi0KLVRyeSB0byBtYWtlIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uIHRhcmdldHMsIGF0IGxlYXN0IChhbmQgYWxsIHRoZWlyCi1zdWJ0YXJnZXRzKSB3b3JrIGNvcnJlY3RseSB3aXRoIGEgcGFyYWxsZWwgQGNvZGV7bWFrZX0uCi0KLUBub2RlIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLUBzZWN0aW9uIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLQotV3JpdGUgdGhlIE1ha2VmaWxlIGNvbW1hbmRzIChhbmQgYW55IHNoZWxsIHNjcmlwdHMsIHN1Y2ggYXMKLUBjb2Rle2NvbmZpZ3VyZX0pIHRvIHJ1biBpbiBAY29kZXtzaH0sIG5vdCBpbiBAY29kZXtjc2h9LiAgRG9uJ3QgdXNlIGFueQotc3BlY2lhbCBmZWF0dXJlcyBvZiBAY29kZXtrc2h9IG9yIEBjb2Rle2Jhc2h9LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgYW5kIHRoZSBNYWtlZmlsZSBydWxlcyBmb3IgYnVpbGRpbmcgYW5kCi1pbnN0YWxsYXRpb24gc2hvdWxkIG5vdCB1c2UgYW55IHV0aWxpdGllcyBkaXJlY3RseSBleGNlcHQgdGhlc2U6Ci0KLUBjIGRkIGZpbmQKLUBjIGd1bnppcCBnemlwIG1kNXN1bQotQGMgbWtmaWZvIG1rbm9kIHRlZSB1bmFtZSAKLQotQGV4YW1wbGUKLWNhdCBjbXAgY3AgZGlmZiBlY2hvIGVncmVwIGV4cHIgZmFsc2UgZ3JlcCBpbnN0YWxsLWluZm8KLWxuIGxzIG1rZGlyIG12IHB3ZCBybSBybWRpciBzZWQgc2xlZXAgc29ydCB0YXIgdGVzdCB0b3VjaCB0cnVlCi1AZW5kIGV4YW1wbGUKLQotVGhlIGNvbXByZXNzaW9uIHByb2dyYW0gQGNvZGV7Z3ppcH0gY2FuIGJlIHVzZWQgaW4gdGhlIEBjb2Rle2Rpc3R9IHJ1bGUuCi0KLVN0aWNrIHRvIHRoZSBnZW5lcmFsbHkgc3VwcG9ydGVkIG9wdGlvbnMgZm9yIHRoZXNlIHByb2dyYW1zLiAgRm9yCi1leGFtcGxlLCBkb24ndCB1c2UgQHNhbXB7bWtkaXIgLXB9LCBjb252ZW5pZW50IGFzIGl0IG1heSBiZSwgYmVjYXVzZQotbW9zdCBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQuCi0KLUl0IGlzIGEgZ29vZCBpZGVhIHRvIGF2b2lkIGNyZWF0aW5nIHN5bWJvbGljIGxpbmtzIGluIG1ha2VmaWxlcywgc2luY2UgYQotZmV3IHN5c3RlbXMgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotCi1UaGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZCBpbnN0YWxsYXRpb24gY2FuIGFsc28gdXNlIGNvbXBpbGVycwotYW5kIHJlbGF0ZWQgcHJvZ3JhbXMsIGJ1dCBzaG91bGQgZG8gc28gdmlhIEBjb2Rle21ha2V9IHZhcmlhYmxlcyBzbyB0aGF0IHRoZQotdXNlciBjYW4gc3Vic3RpdHV0ZSBhbHRlcm5hdGl2ZXMuICBIZXJlIGFyZSBzb21lIG9mIHRoZSBwcm9ncmFtcyB3ZQotbWVhbjoKLQotQGV4YW1wbGUKLWFyIGJpc29uIGNjIGZsZXggaW5zdGFsbCBsZCBsZGNvbmZpZyBsZXgKLW1ha2UgbWFrZWluZm8gcmFubGliIHRleGkyZHZpIHlhY2MKLUBlbmQgZXhhbXBsZQotCi1Vc2UgdGhlIGZvbGxvd2luZyBAY29kZXttYWtlfSB2YXJpYWJsZXMgdG8gcnVuIHRob3NlIHByb2dyYW1zOgotCi1AZXhhbXBsZQotJChBUikgJChCSVNPTikgJChDQykgJChGTEVYKSAkKElOU1RBTEwpICQoTEQpICQoTERDT05GSUcpICQoTEVYKQotJChNQUtFKSAkKE1BS0VJTkZPKSAkKFJBTkxJQikgJChURVhJMkRWSSkgJChZQUNDKQotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IHVzZSBAY29kZXtyYW5saWJ9IG9yIEBjb2Rle2xkY29uZmlnfSwgeW91IHNob3VsZCBtYWtlIHN1cmUKLW5vdGhpbmcgYmFkIGhhcHBlbnMgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBwcm9ncmFtIGluIHF1ZXN0aW9uLgotQXJyYW5nZSB0byBpZ25vcmUgYW4gZXJyb3IgZnJvbSB0aGF0IGNvbW1hbmQsIGFuZCBwcmludCBhIG1lc3NhZ2UgYmVmb3JlCi10aGUgY29tbWFuZCB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgZmFpbHVyZSBvZiB0aGlzIGNvbW1hbmQgZG9lcyBub3QgbWVhbgotYSBwcm9ibGVtLiAgKFRoZSBBdXRvY29uZiBAc2FtcHtBQ19QUk9HX1JBTkxJQn0gbWFjcm8gY2FuIGhlbHAgd2l0aAotdGhpcy4pCi0KLUlmIHlvdSB1c2Ugc3ltYm9saWMgbGlua3MsIHlvdSBzaG91bGQgaW1wbGVtZW50IGEgZmFsbGJhY2sgZm9yIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSBzeW1ib2xpYyBsaW5rcy4KLQotQWRkaXRpb25hbCB1dGlsaXRpZXMgdGhhdCBjYW4gYmUgdXNlZCB2aWEgTWFrZSB2YXJpYWJsZXMgYXJlOgotCi1AZXhhbXBsZQotY2hncnAgY2htb2QgY2hvd24gbWtub2QKLUBlbmQgZXhhbXBsZQotCi1JdCBpcyBvayB0byB1c2Ugb3RoZXIgdXRpbGl0aWVzIGluIE1ha2VmaWxlIHBvcnRpb25zIChvciBzY3JpcHRzKQotaW50ZW5kZWQgb25seSBmb3IgcGFydGljdWxhciBzeXN0ZW1zIHdoZXJlIHlvdSBrbm93IHRob3NlIHV0aWxpdGllcwotZXhpc3QuCi0KLUBub2RlIENvbW1hbmQgVmFyaWFibGVzCi1Ac2VjdGlvbiBWYXJpYWJsZXMgZm9yIFNwZWNpZnlpbmcgQ29tbWFuZHMKLQotTWFrZWZpbGVzIHNob3VsZCBwcm92aWRlIHZhcmlhYmxlcyBmb3Igb3ZlcnJpZGluZyBjZXJ0YWluIGNvbW1hbmRzLCBvcHRpb25zLAotYW5kIHNvIG9uLgotCi1JbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIHJ1biBtb3N0IHV0aWxpdHkgcHJvZ3JhbXMgdmlhIHZhcmlhYmxlcy4KLVRodXMsIGlmIHlvdSB1c2UgQmlzb24sIGhhdmUgYSB2YXJpYWJsZSBuYW1lZCBAY29kZXtCSVNPTn0gd2hvc2UgZGVmYXVsdAotdmFsdWUgaXMgc2V0IHdpdGggQHNhbXB7QklTT04gPSBiaXNvbn0sIGFuZCByZWZlciB0byBpdCB3aXRoCi1AY29kZXskKEJJU09OKX0gd2hlbmV2ZXIgeW91IG5lZWQgdG8gdXNlIEJpc29uLgotCi1GaWxlIG1hbmFnZW1lbnQgdXRpbGl0aWVzIHN1Y2ggYXMgQGNvZGV7bG59LCBAY29kZXtybX0sIEBjb2Rle212fSwgYW5kCi1zbyBvbiwgbmVlZCBub3QgYmUgcmVmZXJyZWQgdG8gdGhyb3VnaCB2YXJpYWJsZXMgaW4gdGhpcyB3YXksIHNpbmNlIHVzZXJzCi1kb24ndCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoIG90aGVyIHByb2dyYW1zLgotCi1FYWNoIHByb2dyYW0tbmFtZSB2YXJpYWJsZSBzaG91bGQgY29tZSB3aXRoIGFuIG9wdGlvbnMgdmFyaWFibGUgdGhhdCBpcwotdXNlZCB0byBzdXBwbHkgb3B0aW9ucyB0byB0aGUgcHJvZ3JhbS4gIEFwcGVuZCBAc2FtcHtGTEFHU30gdG8gdGhlCi1wcm9ncmFtLW5hbWUgdmFyaWFibGUgbmFtZSB0byBnZXQgdGhlIG9wdGlvbnMgdmFyaWFibGUgbmFtZS0tLWZvcgotZXhhbXBsZSwgQGNvZGV7QklTT05GTEFHU30uICAoVGhlIG5hbWVzIEBjb2Rle0NGTEFHU30gZm9yIHRoZSBDCi1jb21waWxlciwgQGNvZGV7WUZMQUdTfSBmb3IgeWFjYywgYW5kIEBjb2Rle0xGTEFHU30gZm9yIGxleCwgYXJlCi1leGNlcHRpb25zIHRvIHRoaXMgcnVsZSwgYnV0IHdlIGtlZXAgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIHN0YW5kYXJkLikKLVVzZSBAY29kZXtDUFBGTEFHU30gaW4gYW55IGNvbXBpbGF0aW9uIGNvbW1hbmQgdGhhdCBydW5zIHRoZQotcHJlcHJvY2Vzc29yLCBhbmQgdXNlIEBjb2Rle0xERkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQKLWRvZXMgbGlua2luZyBhcyB3ZWxsIGFzIGluIGFueSBkaXJlY3QgdXNlIG9mIEBjb2Rle2xkfS4KLQotSWYgdGhlcmUgYXJlIEMgY29tcGlsZXIgb3B0aW9ucyB0aGF0IEBlbXBoe211c3R9IGJlIHVzZWQgZm9yIHByb3BlcgotY29tcGlsYXRpb24gb2YgY2VydGFpbiBmaWxlcywgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiBAY29kZXtDRkxBR1N9LgotVXNlcnMgZXhwZWN0IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBAY29kZXtDRkxBR1N9IGZyZWVseSB0aGVtc2VsdmVzLgotSW5zdGVhZCwgYXJyYW5nZSB0byBwYXNzIHRoZSBuZWNlc3Nhcnkgb3B0aW9ucyB0byB0aGUgQyBjb21waWxlcgotaW5kZXBlbmRlbnRseSBvZiBAY29kZXtDRkxBR1N9LCBieSB3cml0aW5nIHRoZW0gZXhwbGljaXRseSBpbiB0aGUKLWNvbXBpbGF0aW9uIGNvbW1hbmRzIG9yIGJ5IGRlZmluaW5nIGFuIGltcGxpY2l0IHJ1bGUsIGxpa2UgdGhpczoKLQotQHNtYWxsZXhhbXBsZQotQ0ZMQUdTID0gLWcKLUFMTF9DRkxBR1MgPSAtSS4gJChDRkxBR1MpCi0uYy5vOgotICAgICAgICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKEFMTF9DRkxBR1MpICQ8Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1EbyBpbmNsdWRlIHRoZSBAc2FtcHstZ30gb3B0aW9uIGluIEBjb2Rle0NGTEFHU30sIGJlY2F1c2UgdGhhdCBpcyBub3QKLUBlbXBoe3JlcXVpcmVkfSBmb3IgcHJvcGVyIGNvbXBpbGF0aW9uLiAgWW91IGNhbiBjb25zaWRlciBpdCBhIGRlZmF1bHQKLXRoYXQgaXMgb25seSByZWNvbW1lbmRlZC4gIElmIHRoZSBwYWNrYWdlIGlzIHNldCB1cCBzbyB0aGF0IGl0IGlzCi1jb21waWxlZCB3aXRoIEdDQyBieSBkZWZhdWx0LCB0aGVuIHlvdSBtaWdodCBhcyB3ZWxsIGluY2x1ZGUgQHNhbXB7LU99Ci1pbiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtDRkxBR1N9IGFzIHdlbGwuCi0KLVB1dCBAY29kZXtDRkxBR1N9IGxhc3QgaW4gdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQsIGFmdGVyIG90aGVyIHZhcmlhYmxlcwotY29udGFpbmluZyBjb21waWxlciBvcHRpb25zLCBzbyB0aGUgdXNlciBjYW4gdXNlIEBjb2Rle0NGTEFHU30gdG8KLW92ZXJyaWRlIHRoZSBvdGhlcnMuCi0KLUBjb2Rle0NGTEFHU30gc2hvdWxkIGJlIHVzZWQgaW4gZXZlcnkgaW52b2NhdGlvbiBvZiB0aGUgQyBjb21waWxlciwKLWJvdGggdGhvc2Ugd2hpY2ggZG8gY29tcGlsYXRpb24gYW5kIHRob3NlIHdoaWNoIGRvIGxpbmtpbmcuCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle0lOU1RBTEx9LCB3aGljaCBpcyB0aGUKLWJhc2ljIGNvbW1hbmQgZm9yIGluc3RhbGxpbmcgYSBmaWxlIGludG8gdGhlIHN5c3RlbS4KLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGFsc28gZGVmaW5lIHRoZSB2YXJpYWJsZXMgQGNvZGV7SU5TVEFMTF9QUk9HUkFNfQotYW5kIEBjb2Rle0lOU1RBTExfREFUQX0uICAoVGhlIGRlZmF1bHQgZm9yIGVhY2ggb2YgdGhlc2Ugc2hvdWxkIGJlCi1AY29kZXskKElOU1RBTEwpfS4pICBUaGVuIGl0IHNob3VsZCB1c2UgdGhvc2UgdmFyaWFibGVzIGFzIHRoZSBjb21tYW5kcwotZm9yIGFjdHVhbCBpbnN0YWxsYXRpb24sIGZvciBleGVjdXRhYmxlcyBhbmQgbm9uZXhlY3V0YWJsZXMKLXJlc3BlY3RpdmVseS4gIFVzZSB0aGVzZSB2YXJpYWJsZXMgYXMgZm9sbG93czoKLQotQGV4YW1wbGUKLSQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQobGliZGlyKS9saWJmb28uYQotQGVuZCBleGFtcGxlCi0KLU9wdGlvbmFsbHksIHlvdSBtYXkgcHJlcGVuZCB0aGUgdmFsdWUgb2YgQGNvZGV7REVTVERJUn0gdG8gdGhlIHRhcmdldAotZmlsZW5hbWUuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgaW5zdGFsbGVyIHRvIGNyZWF0ZSBhIHNuYXBzaG90IG9mIHRoZQotaW5zdGFsbGF0aW9uIHRvIGJlIGNvcGllZCBvbnRvIHRoZSByZWFsIHRhcmdldCBmaWxlc3lzdGVtIGxhdGVyLiAgRG8gbm90Ci1zZXQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IGluIHlvdXIgTWFrZWZpbGUsIGFuZCBkbyBub3QgaW5jbHVkZSBpdAotaW4gYW55IGluc3RhbGxlZCBmaWxlcy4gIFdpdGggc3VwcG9ydCBmb3IgQGNvZGV7REVTVERJUn0sIHRoZSBhYm92ZQotZXhhbXBsZXMgYmVjb21lOgotCi1AZXhhbXBsZQotJChJTlNUQUxMX1BST0dSQU0pIGZvbyAkKERFU1RESVIpJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQoREVTVERJUikkKGxpYmRpcikvbGliZm9vLmEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUFsd2F5cyB1c2UgYSBmaWxlIG5hbWUsIG5vdCBhIGRpcmVjdG9yeSBuYW1lLCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mCi10aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgVXNlIGEgc2VwYXJhdGUgY29tbWFuZCBmb3IgZWFjaCBmaWxlIHRvIGJlCi1pbnN0YWxsZWQuCi0KLUBub2RlIERpcmVjdG9yeSBWYXJpYWJsZXMKLUBzZWN0aW9uIFZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBzaG91bGQgYWx3YXlzIGJlIG5hbWVkIGJ5IHZhcmlhYmxlcywgc28gaXQgaXMKLWVhc3kgdG8gaW5zdGFsbCBpbiBhIG5vbnN0YW5kYXJkIHBsYWNlLiAgVGhlIHN0YW5kYXJkIG5hbWVzIGZvciB0aGVzZQotdmFyaWFibGVzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGV5IGFyZSBiYXNlZCBvbiBhIHN0YW5kYXJkIGZpbGVzeXN0ZW0KLWxheW91dDsgdmFyaWFudHMgb2YgaXQgYXJlIHVzZWQgaW4gU1ZSNCwgNC40QlNELCBMaW51eCwgVWx0cml4IHY0LCBhbmQKLW90aGVyIG1vZGVybiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotVGhlc2UgdHdvIHZhcmlhYmxlcyBzZXQgdGhlIHJvb3QgZm9yIHRoZSBpbnN0YWxsYXRpb24uICBBbGwgdGhlIG90aGVyCi1pbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGJlIHN1YmRpcmVjdG9yaWVzIG9mIG9uZSBvZiB0aGVzZSB0d28sCi1hbmQgbm90aGluZyBzaG91bGQgYmUgZGlyZWN0bHkgaW5zdGFsbGVkIGludG8gdGhlc2UgdHdvIGRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHByZWZpeAotQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkCi1iZWxvdy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle3ByZWZpeH0gc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWx9LgotV2hlbiBidWlsZGluZyB0aGUgY29tcGxldGUgR05VIHN5c3RlbSwgdGhlIHByZWZpeCB3aWxsIGJlIGVtcHR5IGFuZAotQGZpbGV7L3Vzcn0gd2lsbCBiZSBhIHN5bWJvbGljIGxpbmsgdG8gQGZpbGV7L30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBwcmVmaXhAQH0uKQotCi1SdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9Ci1mcm9tIHRoZSBvbmUgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbSBzaG91bGQgQHZhcntub3R9IHJlY29tcGlsZQotdGhlIHByb2dyYW0uCi0KLUBpdGVtIGV4ZWNfcHJlZml4Ci1BIHByZWZpeCB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2Ygc29tZSBvZiB0aGUKLXZhcmlhYmxlcyBsaXN0ZWQgYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0gc2hvdWxkCi1iZSBAY29kZXskKHByZWZpeCl9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAZXhlY19wcmVmaXhAQH0uKQotCi1HZW5lcmFsbHksIEBjb2RleyQoZXhlY19wcmVmaXgpfSBpcyB1c2VkIGZvciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KLW1hY2hpbmUtc3BlY2lmaWMgZmlsZXMgKHN1Y2ggYXMgZXhlY3V0YWJsZXMgYW5kIHN1YnJvdXRpbmUgbGlicmFyaWVzKSwKLXdoaWxlIEBjb2RleyQocHJlZml4KX0gaXMgdXNlZCBkaXJlY3RseSBmb3Igb3RoZXIgZGlyZWN0b3JpZXMuCi0KLVJ1bm5pbmcgQHNhbXB7bWFrZSBpbnN0YWxsfSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIG9mIEBjb2Rle2V4ZWNfcHJlZml4fQotZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUgdGhlCi1wcm9ncmFtLgotQGVuZCB0YWJsZQotCi1FeGVjdXRhYmxlIHByb2dyYW1zIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCB1c2VycyBjYW4gcnVuLgotVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9iaW59LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQoZXhlY19wcmVmaXgpL2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBiaW5kaXJAQH0uKQotCi1AaXRlbSBzYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCBjYW4gYmUgcnVuIGZyb20KLXRoZSBzaGVsbCwgYnV0IGFyZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgdG8gc3lzdGVtIGFkbWluaXN0cmF0b3JzLiAgVGhpcwotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2Jpbn0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChleGVjX3ByZWZpeCkvc2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzYmluZGlyQEB9LikKLQotQGl0ZW0gbGliZXhlY2RpcgotQGNvbW1lbnQgVGhpcyBwYXJhZ3JhcGggYWRqdXN0ZWQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZCA1anVsOTQKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZXhlY3V0YWJsZSBwcm9ncmFtcyB0byBiZSBydW4gYnkgb3RoZXIKLXByb2dyYW1zIHJhdGhlciB0aGFuIGJ5IHVzZXJzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlCi1AZmlsZXsvdXNyL2xvY2FsL2xpYmV4ZWN9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGliZXhlY30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJleGVjZGlyQEB9LikKLUBlbmQgdGFibGUKLQotRGF0YSBmaWxlcyB1c2VkIGJ5IHRoZSBwcm9ncmFtIGR1cmluZyBpdHMgZXhlY3V0aW9uIGFyZSBkaXZpZGVkIGludG8KLWNhdGVnb3JpZXMgaW4gdHdvIHdheXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Tb21lIGZpbGVzIGFyZSBub3JtYWxseSBtb2RpZmllZCBieSBwcm9ncmFtczsgb3RoZXJzIGFyZSBuZXZlciBub3JtYWxseQotbW9kaWZpZWQgKHRob3VnaCB1c2VycyBtYXkgZWRpdCBzb21lIG9mIHRoZXNlKS4KLQotQGl0ZW0KLVNvbWUgZmlsZXMgYXJlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZCBieSBhbGwKLW1hY2hpbmVzIGF0IGEgc2l0ZTsgc29tZSBhcmUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZAotb25seSBieSBtYWNoaW5lcyBvZiB0aGUgc2FtZSBraW5kIGFuZCBvcGVyYXRpbmcgc3lzdGVtOyBvdGhlcnMgbWF5IG5ldmVyCi1iZSBzaGFyZWQgYmV0d2VlbiB0d28gbWFjaGluZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhpcyBtYWtlcyBmb3Igc2l4IGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLiAgSG93ZXZlciwgd2Ugd2FudCB0bwotZGlzY291cmFnZSB0aGUgdXNlIG9mIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMsIGFzaWRlIGZyb20gb2JqZWN0Ci1maWxlcyBhbmQgbGlicmFyaWVzLiAgSXQgaXMgbXVjaCBjbGVhbmVyIHRvIG1ha2Ugb3RoZXIgZGF0YSBmaWxlcwotYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50LCBhbmQgaXQgaXMgZ2VuZXJhbGx5IG5vdCBoYXJkLgotCi1UaGVyZWZvcmUsIGhlcmUgYXJlIHRoZSB2YXJpYWJsZXMgTWFrZWZpbGVzIHNob3VsZCB1c2UgdG8gc3BlY2lmeQotZGlyZWN0b3JpZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gZGF0YWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGRhdGEKLWZpbGVzLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9zaGFyZX0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChwcmVmaXgpL3NoYXJlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGRhdGFkaXJAQH0uKQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgc2VlIEBmaWxleyQoaW5mb2Rpcil9Ci1hbmQgQGZpbGV7JChpbmNsdWRlZGlyKX0gYmVsb3cuCi0KLUBpdGVtIHN5c2NvbmZkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGRhdGEgZmlsZXMgdGhhdCBwZXJ0YWluIHRvIGEKLXNpbmdsZSBtYWNoaW5lLS10aGF0IGlzIHRvIHNheSwgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nIGEgaG9zdC4gIE1haWxlcgotYW5kIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmaWxlcywgQGZpbGV7L2V0Yy9wYXNzd2R9LCBhbmQgc28gZm9ydGggYmVsb25nCi1oZXJlLiAgQWxsIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgb3JkaW5hcnkgQVNDSUkgdGV4dAotZmlsZXMuICBUaGlzIGRpcmVjdG9yeSBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9ldGN9LCBidXQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9ldGN9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc3lzY29uZmRpckBAfS4pCi0KLURvIG5vdCBpbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUgaW4gdGhpcyBkaXJlY3RvcnkgKHRoZXkgcHJvYmFibHkgYmVsb25nCi1pbiBAZmlsZXskKGxpYmV4ZWNkaXIpfSBvciBAZmlsZXskKHNiaW5kaXIpfSkuICBBbHNvIGRvIG5vdCBpbnN0YWxsCi1maWxlcyB0aGF0IGFyZSBtb2RpZmllZCBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiB0aGVpciB1c2UgKHByb2dyYW1zCi13aG9zZSBwdXJwb3NlIGlzIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIGV4Y2x1ZGVkKS4KLVRob3NlIHByb2JhYmx5IGJlbG9uZyBpbiBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfS4KLQotQGl0ZW0gc2hhcmVkc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgZmlsZXMgd2hpY2gKLXRoZSBwcm9ncmFtcyBtb2RpZnkgd2hpbGUgdGhleSBydW4uICBUaGlzIHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9jb219LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChwcmVmaXgpL2NvbX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzaGFyZWRzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxvY2Fsc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZGF0YSBmaWxlcyB3aGljaCB0aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlCi10aGV5IHJ1biwgYW5kIHRoYXQgcGVydGFpbiB0byBvbmUgc3BlY2lmaWMgbWFjaGluZS4gIFVzZXJzIHNob3VsZCBuZXZlcgotbmVlZCB0byBtb2RpZnkgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlJ3MKLW9wZXJhdGlvbjsgcHV0IHN1Y2ggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiBzZXBhcmF0ZSBmaWxlcyB0aGF0IGdvCi1pbiBAZmlsZXskKGRhdGFkaXIpfSBvciBAZmlsZXskKHN5c2NvbmZkaXIpfS4gIEBmaWxleyQobG9jYWxzdGF0ZWRpcil9Ci1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC92YXJ9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS92YXJ9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbG9jYWxzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxpYmRpcgotVGhlIGRpcmVjdG9yeSBmb3Igb2JqZWN0IGZpbGVzIGFuZCBsaWJyYXJpZXMgb2Ygb2JqZWN0IGNvZGUuICBEbyBub3QKLWluc3RhbGwgZXhlY3V0YWJsZXMgaGVyZSwgdGhleSBwcm9iYWJseSBvdWdodCB0byBnbyBpbiBAZmlsZXskKGxpYmV4ZWNkaXIpfQotaW5zdGVhZC4gIFRoZSB2YWx1ZSBvZiBAY29kZXtsaWJkaXJ9IHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9saWJ9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGlifS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxpYmRpckBAfS4pCi0KLUBpdGVtIGluZm9kaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIEluZm8gZmlsZXMgZm9yIHRoaXMgcGFja2FnZS4gIEJ5Ci1kZWZhdWx0LCBpdCBzaG91bGQgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmZvfSwgYnV0IGl0IHNob3VsZCBiZSB3cml0dGVuCi1hcyBAZmlsZXskKHByZWZpeCkvaW5mb30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmZvZGlyQEB9LikKLQotQGl0ZW0gbGlzcGRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBhbnkgRW1hY3MgTGlzcCBmaWxlcyBpbiB0aGlzIHBhY2thZ2UuICBCeQotZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfSwgYnV0IGl0Ci1zaG91bGQgYmUgd3JpdHRlbiBhcyBAZmlsZXskKHByZWZpeCkvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfS4KLQotSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgdGhlIGRlZmF1bHQgYXMgQHNhbXB7QEBsaXNwZGlyQEB9LgotSW4gb3JkZXIgdG8gbWFrZSBAc2FtcHtAQGxpc3BkaXJAQH0gd29yaywgeW91IG5lZWQgdGhlIGZvbGxvd2luZyBsaW5lcwotaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGU6Ci0KLUBleGFtcGxlCi1saXNwZGlyPSckQHtkYXRhZGlyQH0vZW1hY3Mvc2l0ZS1saXNwJwotQUNfU1VCU1QobGlzcGRpcikKLUBlbmQgZXhhbXBsZQotCi1AaXRlbSBpbmNsdWRlZGlyCi1AYyByZXdyaXR0ZW4gdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZAotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBoZWFkZXIgZmlsZXMgdG8gYmUgaW5jbHVkZWQgYnkgdXNlcgotcHJvZ3JhbXMgd2l0aCB0aGUgQyBAc2FtcHsjaW5jbHVkZX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4gIFRoaXMKLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL2luY2x1ZGV9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGluY2x1ZGVkaXJAQH0uKQotCi1Nb3N0IGNvbXBpbGVycyBvdGhlciB0aGFuIEdDQyBkbyBub3QgbG9vayBmb3IgaGVhZGVyIGZpbGVzIGluIGRpcmVjdG9yeQotQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfS4gIFNvIGluc3RhbGxpbmcgdGhlIGhlYWRlciBmaWxlcyB0aGlzIHdheSBpcwotb25seSB1c2VmdWwgd2l0aCBHQ0MuICBTb21ldGltZXMgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGJlY2F1c2Ugc29tZQotbGlicmFyaWVzIGFyZSBvbmx5IHJlYWxseSBpbnRlbmRlZCB0byB3b3JrIHdpdGggR0NDLiAgQnV0IHNvbWUgbGlicmFyaWVzCi1hcmUgaW50ZW5kZWQgdG8gd29yayB3aXRoIG90aGVyIGNvbXBpbGVycy4gIFRoZXkgc2hvdWxkIGluc3RhbGwgdGhlaXIKLWhlYWRlciBmaWxlcyBpbiB0d28gcGxhY2VzLCBvbmUgc3BlY2lmaWVkIGJ5IEBjb2Rle2luY2x1ZGVkaXJ9IGFuZCBvbmUKLXNwZWNpZmllZCBieSBAY29kZXtvbGRpbmNsdWRlZGlyfS4KLQotQGl0ZW0gb2xkaW5jbHVkZWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBAc2FtcHsjaW5jbHVkZX0gaGVhZGVyIGZpbGVzIGZvciB1c2Ugd2l0aAotY29tcGlsZXJzIG90aGVyIHRoYW4gR0NDLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB5b3UgY2FuIHdyaXRlIGl0IGFzIEBzYW1we0BAb2xkaW5jbHVkZWRpckBAfS4pCi0KLVRoZSBNYWtlZmlsZSBjb21tYW5kcyBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgdmFsdWUgb2YKLUBjb2Rle29sZGluY2x1ZGVkaXJ9IGlzIGVtcHR5LiAgSWYgaXQgaXMsIHRoZXkgc2hvdWxkIG5vdCB0cnkgdG8gdXNlCi1pdDsgdGhleSBzaG91bGQgY2FuY2VsIHRoZSBzZWNvbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBoZWFkZXIgZmlsZXMuCi0KLUEgcGFja2FnZSBzaG91bGQgbm90IHJlcGxhY2UgYW4gZXhpc3RpbmcgaGVhZGVyIGluIHRoaXMgZGlyZWN0b3J5IHVubGVzcwotdGhlIGhlYWRlciBjYW1lIGZyb20gdGhlIHNhbWUgcGFja2FnZS4gIFRodXMsIGlmIHlvdXIgRm9vIHBhY2thZ2UKLXByb3ZpZGVzIGEgaGVhZGVyIGZpbGUgQGZpbGV7Zm9vLmh9LCB0aGVuIGl0IHNob3VsZCBpbnN0YWxsIHRoZSBoZWFkZXIKLWZpbGUgaW4gdGhlIEBjb2Rle29sZGluY2x1ZGVkaXJ9IGRpcmVjdG9yeSBpZiBlaXRoZXIgKDEpIHRoZXJlIGlzIG5vCi1AZmlsZXtmb28uaH0gdGhlcmUgb3IgKDIpIHRoZSBAZmlsZXtmb28uaH0gdGhhdCBleGlzdHMgY2FtZSBmcm9tIHRoZSBGb28KLXBhY2thZ2UuCi0KLVRvIHRlbGwgd2hldGhlciBAZmlsZXtmb28uaH0gY2FtZSBmcm9tIHRoZSBGb28gcGFja2FnZSwgcHV0IGEgbWFnaWMKLXN0cmluZyBpbiB0aGUgZmlsZS0tLXBhcnQgb2YgYSBjb21tZW50LS0tYW5kIEBjb2Rle2dyZXB9IGZvciB0aGF0IHN0cmluZy4KLUBlbmQgdGFibGUKLQotVW5peC1zdHlsZSBtYW4gcGFnZXMgYXJlIGluc3RhbGxlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBtYW5kaXIKLVRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBtYW4gcGFnZXMgKGlmIGFueSkgZm9yIHRoaXMKLXBhY2thZ2UuICBJdCB3aWxsIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvbWFufSwgYnV0IHlvdSBzaG91bGQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9tYW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbWFuZGlyQEB9LikKLQotQGl0ZW0gbWFuMWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBzZWN0aW9uIDEgbWFuIHBhZ2VzLiAgV3JpdGUgaXQgYXMKLUBmaWxleyQobWFuZGlyKS9tYW4xfS4KLUBpdGVtIG1hbjJkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAyIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCi1AZmlsZXskKG1hbmRpcikvbWFuMn0KLUBpdGVtIEBkb3Rze30KLQotQHN0cm9uZ3tEb24ndCBtYWtlIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gZm9yIGFueSBHTlUgc29mdHdhcmUgYmUgYQotbWFuIHBhZ2UuICBXcml0ZSBhIG1hbnVhbCBpbiBUZXhpbmZvIGluc3RlYWQuICBNYW4gcGFnZXMgYXJlIGp1c3QgZm9yCi10aGUgc2FrZSBvZiBwZW9wbGUgcnVubmluZyBHTlUgc29mdHdhcmUgb24gVW5peCwgd2hpY2ggaXMgYSBzZWNvbmRhcnkKLWFwcGxpY2F0aW9uIG9ubHkufQotCi1AaXRlbSBtYW5leHQKLVRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGZvciB0aGUgaW5zdGFsbGVkIG1hbiBwYWdlLiAgVGhpcyBzaG91bGQgY29udGFpbgotYSBwZXJpb2QgZm9sbG93ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0OyBpdCBzaG91bGQgbm9ybWFsbHkgYmUgQHNhbXB7LjF9LgotCi1AaXRlbSBtYW4xZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMSBtYW4gcGFnZXMuCi1AaXRlbSBtYW4yZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMiBtYW4gcGFnZXMuCi1AaXRlbSBAZG90c3t9Ci1Vc2UgdGhlc2UgbmFtZXMgaW5zdGVhZCBvZiBAc2FtcHttYW5leHR9IGlmIHRoZSBwYWNrYWdlIG5lZWRzIHRvIGluc3RhbGwgbWFuCi1wYWdlcyBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gb2YgdGhlIG1hbnVhbC4KLUBlbmQgdGFibGUKLQotQW5kIGZpbmFsbHksIHlvdSBzaG91bGQgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gc3JjZGlyCi1UaGUgZGlyZWN0b3J5IGZvciB0aGUgc291cmNlcyBiZWluZyBjb21waWxlZC4gIFRoZSB2YWx1ZSBvZiB0aGlzCi12YXJpYWJsZSBpcyBub3JtYWxseSBpbnNlcnRlZCBieSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzaGVsbCBzY3JpcHQuCi0oSWYgeW91IGFyZSB1c2luZyBBdXRjb25mLCB1c2UgQHNhbXB7c3JjZGlyID0gQEBzcmNkaXJAQH0uKQotQGVuZCB0YWJsZQotCi1Gb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotQGMgSSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgY29tbWVudHMgaGVyZSBzbGlnaHRseSB0byBmaXggYW4gb3ZlcmZ1bGwKLUBjIGhib3gsIHNvIHRoZSBtYWtlIG1hbnVhbCBjYW4gZm9ybWF0IGNvcnJlY3RseS4gLS1yb2xhbmQKLSMgQ29tbW9uIHByZWZpeCBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotIyBOT1RFOiBUaGlzIGRpcmVjdG9yeSBtdXN0IGV4aXN0IHdoZW4geW91IHN0YXJ0IHRoZSBpbnN0YWxsLgotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLSMgV2hlcmUgdG8gcHV0IHRoZSBleGVjdXRhYmxlIGZvciB0aGUgY29tbWFuZCBgZ2NjJy4KLWJpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgotIyBXaGVyZSB0byBwdXQgdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLgotbGliZXhlY2RpciA9ICQoZXhlY19wcmVmaXgpL2xpYmV4ZWMKLSMgV2hlcmUgdG8gcHV0IHRoZSBJbmZvIGZpbGVzLgotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3VyIHByb2dyYW0gaW5zdGFsbHMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgaW50byBvbmUgb2YgdGhlCi1zdGFuZGFyZCB1c2VyLXNwZWNpZmllZCBkaXJlY3RvcmllcywgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIGdyb3VwIHRoZW0KLWludG8gYSBzdWJkaXJlY3RvcnkgcGFydGljdWxhciB0byB0aGF0IHByb2dyYW0uICBJZiB5b3UgZG8gdGhpcywgeW91Ci1zaG91bGQgd3JpdGUgdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgdG8gY3JlYXRlIHRoZXNlIHN1YmRpcmVjdG9yaWVzLgotCi1EbyBub3QgZXhwZWN0IHRoZSB1c2VyIHRvIGluY2x1ZGUgdGhlIHN1YmRpcmVjdG9yeSBuYW1lIGluIHRoZSB2YWx1ZSBvZgotYW55IG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkIGFib3ZlLiAgVGhlIGlkZWEgb2YgaGF2aW5nIGEgdW5pZm9ybSBzZXQgb2YKLXZhcmlhYmxlIG5hbWVzIGZvciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgaXMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCi1zcGVjaWZ5IHRoZSBleGFjdCBzYW1lIHZhbHVlcyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgR05VIHBhY2thZ2VzLiAgSW4KLW9yZGVyIGZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgYWxsIHRoZSBwYWNrYWdlcyBtdXN0IGJlIGRlc2lnbmVkIHNvIHRoYXQKLXRoZXkgd2lsbCB3b3JrIHNlbnNpYmx5IHdoZW4gdGhlIHVzZXIgZG9lcyBzby4KLQotQG5vZGUgU3RhbmRhcmQgVGFyZ2V0cwotQHNlY3Rpb24gU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKLQotQWxsIEdOVSBwcm9ncmFtcyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHRhcmdldHMgaW4gdGhlaXIgTWFrZWZpbGVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGFsbAotQ29tcGlsZSB0aGUgZW50aXJlIHByb2dyYW0uICBUaGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuICBUaGlzCi10YXJnZXQgbmVlZCBub3QgcmVidWlsZCBhbnkgZG9jdW1lbnRhdGlvbiBmaWxlczsgSW5mbyBmaWxlcyBzaG91bGQKLW5vcm1hbGx5IGJlIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIGFuZCBEVkkgZmlsZXMgc2hvdWxkIGJlIG1hZGUKLW9ubHkgd2hlbiBleHBsaWNpdGx5IGFza2VkIGZvci4KLQotQnkgZGVmYXVsdCwgdGhlIE1ha2UgcnVsZXMgc2hvdWxkIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCBAc2FtcHstZ30sIHNvCi10aGF0IGV4ZWN1dGFibGUgcHJvZ3JhbXMgaGF2ZSBkZWJ1Z2dpbmcgc3ltYm9scy4gIFVzZXJzIHdobyBkb24ndCBtaW5kCi1iZWluZyBoZWxwbGVzcyBjYW4gc3RyaXAgdGhlIGV4ZWN1dGFibGVzIGxhdGVyIGlmIHRoZXkgd2lzaC4KLQotQGl0ZW0gaW5zdGFsbAotQ29tcGlsZSB0aGUgcHJvZ3JhbSBhbmQgY29weSB0aGUgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgYW5kIHNvIG9uIHRvCi10aGUgZmlsZSBuYW1lcyB3aGVyZSB0aGV5IHNob3VsZCByZXNpZGUgZm9yIGFjdHVhbCB1c2UuICBJZiB0aGVyZSBpcyBhCi1zaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCBhIHByb2dyYW0gaXMgcHJvcGVybHkgaW5zdGFsbGVkLCB0aGlzIHRhcmdldAotc2hvdWxkIHJ1biB0aGF0IHRlc3QuCi0KLURvIG5vdCBzdHJpcCBleGVjdXRhYmxlcyB3aGVuIGluc3RhbGxpbmcgdGhlbS4gIERldmlsLW1heS1jYXJlIHVzZXJzIGNhbgotdXNlIHRoZSBAY29kZXtpbnN0YWxsLXN0cmlwfSB0YXJnZXQgdG8gZG8gdGhhdC4KLQotSWYgcG9zc2libGUsIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQgcnVsZSBzbyB0aGF0IGl0IGRvZXMgbm90Ci1tb2RpZnkgYW55dGhpbmcgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZ3JhbSB3YXMgYnVpbHQsIHByb3ZpZGVkCi1Ac2FtcHttYWtlIGFsbH0gaGFzIGp1c3QgYmVlbiBkb25lLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBidWlsZGluZyB0aGUKLXByb2dyYW0gdW5kZXIgb25lIHVzZXIgbmFtZSBhbmQgaW5zdGFsbGluZyBpdCB1bmRlciBhbm90aGVyLgotCi1UaGUgY29tbWFuZHMgc2hvdWxkIGNyZWF0ZSBhbGwgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIGZpbGVzIGFyZSB0byBiZQotaW5zdGFsbGVkLCBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QuICBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlcyBAY29kZXtwcmVmaXh9IGFuZAotQGNvZGV7ZXhlY19wcmVmaXh9LCBhcyB3ZWxsIGFzIGFsbCBzdWJkaXJlY3RvcmllcyB0aGF0IGFyZSBuZWVkZWQuCi1PbmUgd2F5IHRvIGRvIHRoaXMgaXMgYnkgbWVhbnMgb2YgYW4gQGNvZGV7aW5zdGFsbGRpcnN9IHRhcmdldAotYXMgZGVzY3JpYmVkIGJlbG93LgotCi1Vc2UgQHNhbXB7LX0gYmVmb3JlIGFueSBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgbWFuIHBhZ2UsIHNvIHRoYXQKLUBjb2Rle21ha2V9IHdpbGwgaWdub3JlIGFueSBlcnJvcnMuICBUaGlzIGlzIGluIGNhc2UgdGhlcmUgYXJlIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSB0aGUgVW5peCBtYW4gcGFnZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnN0YWxsZWQuCi0KLVRoZSB3YXkgdG8gaW5zdGFsbCBJbmZvIGZpbGVzIGlzIHRvIGNvcHkgdGhlbSBpbnRvIEBmaWxleyQoaW5mb2Rpcil9Ci13aXRoIEBjb2RleyQoSU5TVEFMTF9EQVRBKX0gKEBweHJlZntDb21tYW5kIFZhcmlhYmxlc30pLCBhbmQgdGhlbiBydW4KLXRoZSBAY29kZXtpbnN0YWxsLWluZm99IHByb2dyYW0gaWYgaXQgaXMgcHJlc2VudC4gIEBjb2Rle2luc3RhbGwtaW5mb30KLWlzIGEgcHJvZ3JhbSB0aGF0IGVkaXRzIHRoZSBJbmZvIEBmaWxle2Rpcn0gZmlsZSB0byBhZGQgb3IgdXBkYXRlIHRoZQotbWVudSBlbnRyeSBmb3IgdGhlIGdpdmVuIEluZm8gZmlsZTsgaXQgaXMgcGFydCBvZiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotSGVyZSBpcyBhIHNhbXBsZSBydWxlIHRvIGluc3RhbGwgYW4gSW5mbyBmaWxlOgotCi1AY29tbWVudCBUaGlzIGV4YW1wbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCBmb3IgdGhlIE1ha2UgbWFudWFsLgotQGNvbW1lbnQgUGxlYXNlIGRvIG5vdCByZWZvcm1hdCBpdCB3aXRob3V0IHRhbGtpbmcgdG8gcm9sYW5kQGdudS5haS5taXQuZWR1LgotQHNtYWxsZXhhbXBsZQotJChERVNURElSKSQoaW5mb2RpcikvZm9vLmluZm86IGZvby5pbmZvCi0gICAgICAgICQoUE9TVF9JTlNUQUxMKQotIyBUaGVyZSBtYXkgYmUgYSBuZXdlciBpbmZvIGZpbGUgaW4gLiB0aGFuIGluIHNyY2Rpci4KLSAgICAgICAgLWlmIHRlc3QgLWYgZm9vLmluZm87IHRoZW4gZD0uOyBcCi0gICAgICAgICBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotICAgICAgICAkKElOU1RBTExfREFUQSkgJCRkL2Zvby5pbmZvICQoREVTVERJUikkQEA7IFwKLSMgUnVuIGluc3RhbGwtaW5mbyBvbmx5IGlmIGl0IGV4aXN0cy4KLSMgVXNlIGBpZicgaW5zdGVhZCBvZiBqdXN0IHByZXBlbmRpbmcgYC0nIHRvIHRoZQotIyBsaW5lIHNvIHdlIG5vdGljZSByZWFsIGVycm9ycyBmcm9tIGluc3RhbGwtaW5mby4KLSMgV2UgdXNlIGAkKFNIRUxMKSAtYycgYmVjYXVzZSBzb21lIHNoZWxscyBkbyBub3QKLSMgZmFpbCBncmFjZWZ1bGx5IHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBjb21tYW5kLgotICAgICAgICBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbicgXAotICAgICAgICAgICA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotICAgICAgICAgIGluc3RhbGwtaW5mbyAtLWRpci1maWxlPSQoREVTVERJUikkKGluZm9kaXIpL2RpciBcCi0gICAgICAgICAgICAgICAgICAgICAgICQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOyBcCi0gICAgICAgIGVsc2UgdHJ1ZTsgZmkKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCi1jb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Ci1jb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQKLUNhdGVnb3JpZXN9LgotCi1AaXRlbSB1bmluc3RhbGwKLURlbGV0ZSBhbGwgdGhlIGluc3RhbGxlZCBmaWxlcy0tLXRoZSBjb3BpZXMgdGhhdCB0aGUgQHNhbXB7aW5zdGFsbH0KLXRhcmdldCBjcmVhdGVzLgotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUsCi1vbmx5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLgotCi1UaGUgdW5pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIGRpdmlkZWQgaW50byB0aHJlZSBjYXRlZ29yaWVzLCBqdXN0IGxpa2UKLXRoZSBpbnN0YWxsYXRpb24gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllc30uCi0KLUBpdGVtIGluc3RhbGwtc3RyaXAKLUxpa2UgQGNvZGV7aW5zdGFsbH0sIGJ1dCBzdHJpcCB0aGUgZXhlY3V0YWJsZSBmaWxlcyB3aGlsZSBpbnN0YWxsaW5nCi10aGVtLiAgSW4gbWFueSBjYXNlcywgdGhlIGRlZmluaXRpb24gb2YgdGhpcyB0YXJnZXQgY2FuIGJlIHZlcnkgc2ltcGxlOgotCi1Ac21hbGxleGFtcGxlCi1pbnN0YWxsLXN0cmlwOgotICAgICAgICAkKE1BS0UpIElOU1RBTExfUFJPR1JBTT0nJChJTlNUQUxMX1BST0dSQU0pIC1zJyBcCi0gICAgICAgICAgICAgICAgaW5zdGFsbAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm9ybWFsbHkgd2UgZG8gbm90IHJlY29tbWVuZCBzdHJpcHBpbmcgYW4gZXhlY3V0YWJsZSB1bmxlc3MgeW91IGFyZSBzdXJlCi10aGUgcHJvZ3JhbSBoYXMgbm8gYnVncy4gIEhvd2V2ZXIsIGl0IGNhbiBiZSByZWFzb25hYmxlIHRvIGluc3RhbGwgYQotc3RyaXBwZWQgZXhlY3V0YWJsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB3aGlsZSBzYXZpbmcgdGhlIHVuc3RyaXBwZWQKLWV4ZWN1dGFibGUgZWxzZXdoZXJlIGluIGNhc2UgdGhlcmUgaXMgYSBidWcuCi0KLUBjb21tZW50IFRoZSBncmF0dWl0b3VzIGJsYW5rIGxpbmUgaGVyZSBpcyB0byBtYWtlIHRoZSB0YWJsZSBsb29rIGJldHRlcgotQGNvbW1lbnQgaW4gdGhlIHByaW50ZWQgTWFrZSBtYW51YWwuICBQbGVhc2UgbGVhdmUgaXQgaW4uCi1AaXRlbSBjbGVhbgotCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkKLWJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgRG9uJ3QgZGVsZXRlIHRoZSBmaWxlcyB0aGF0IHJlY29yZCB0aGUKLWNvbmZpZ3VyYXRpb24uICBBbHNvIHByZXNlcnZlIGZpbGVzIHRoYXQgY291bGQgYmUgbWFkZSBieSBidWlsZGluZywgYnV0Ci1ub3JtYWxseSBhcmVuJ3QgYmVjYXVzZSB0aGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggdGhlbS4KLQotRGVsZXRlIEBmaWxley5kdml9IGZpbGVzIGhlcmUgaWYgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gZGlzdGNsZWFuCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIGNyZWF0ZWQgYnkKLWNvbmZpZ3VyaW5nIG9yIGJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgSWYgeW91IGhhdmUgdW5wYWNrZWQgdGhlIHNvdXJjZQotYW5kIGJ1aWx0IHRoZSBwcm9ncmFtIHdpdGhvdXQgY3JlYXRpbmcgYW55IG90aGVyIGZpbGVzLCBAc2FtcHttYWtlCi1kaXN0Y2xlYW59IHNob3VsZCBsZWF2ZSBvbmx5IHRoZSBmaWxlcyB0aGF0IHdlcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gbW9zdGx5Y2xlYW4KLUxpa2UgQHNhbXB7Y2xlYW59LCBidXQgbWF5IHJlZnJhaW4gZnJvbSBkZWxldGluZyBhIGZldyBmaWxlcyB0aGF0IHBlb3BsZQotbm9ybWFsbHkgZG9uJ3Qgd2FudCB0byByZWNvbXBpbGUuICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we21vc3RseWNsZWFufQotdGFyZ2V0IGZvciBHQ0MgZG9lcyBub3QgZGVsZXRlIEBmaWxle2xpYmdjYy5hfSwgYmVjYXVzZSByZWNvbXBpbGluZyBpdAotaXMgcmFyZWx5IG5lY2Vzc2FyeSBhbmQgdGFrZXMgYSBsb3Qgb2YgdGltZS4KLQotQGl0ZW0gbWFpbnRhaW5lci1jbGVhbgotRGVsZXRlIGFsbW9zdCBldmVyeXRoaW5nIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCi1yZWNvbnN0cnVjdGVkIHdpdGggdGhpcyBNYWtlZmlsZS4gIFRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLWRlbGV0ZWQgYnkgQGNvZGV7ZGlzdGNsZWFufSwgcGx1cyBtb3JlOiBDIHNvdXJjZSBmaWxlcyBwcm9kdWNlZCBieQotQmlzb24sIHRhZ3MgdGFibGVzLCBJbmZvIGZpbGVzLCBhbmQgc28gb24uCi0KLVRoZSByZWFzb24gd2Ugc2F5IGBgYWxtb3N0IGV2ZXJ5dGhpbmcnJyBpcyB0aGF0IHJ1bm5pbmcgdGhlIGNvbW1hbmQKLUBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgQGZpbGV7Y29uZmlndXJlfSBldmVuIGlmCi1AZmlsZXtjb25maWd1cmV9IGNhbiBiZSByZW1hZGUgdXNpbmcgYSBydWxlIGluIHRoZSBNYWtlZmlsZS4gIE1vcmUgZ2VuZXJhbGx5LAotQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBzaG91bGQgbm90IGRlbGV0ZSBhbnl0aGluZyB0aGF0IG5lZWRzIHRvCi1leGlzdCBpbiBvcmRlciB0byBydW4gQGZpbGV7Y29uZmlndXJlfSBhbmQgdGhlbiBiZWdpbiB0byBidWlsZCB0aGUKLXByb2dyYW0uICBUaGlzIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbjsgQGNvZGV7bWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkCi1kZWxldGUgZXZlcnl0aGluZyBlbHNlIHRoYXQgY2FuIGJlIHJlYnVpbHQuCi0KLVRoZSBAc2FtcHttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhIG1haW50YWluZXIgb2YKLXRoZSBwYWNrYWdlLCBub3QgYnkgb3JkaW5hcnkgdXNlcnMuICBZb3UgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0bwotcmVjb25zdHJ1Y3Qgc29tZSBvZiB0aGUgZmlsZXMgdGhhdCBAc2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IGRlbGV0ZXMuCi1TaW5jZSB0aGVzZSBmaWxlcyBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgd2UgZG9uJ3QKLXRha2UgY2FyZSB0byBtYWtlIHRoZW0gZWFzeSB0byByZWNvbnN0cnVjdC4gIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRvCi11bnBhY2sgdGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGFnYWluLCBkb24ndCBibGFtZSB1cy4KLQotVG8gaGVscCBtYWtlIHVzZXJzIGF3YXJlIG9mIHRoaXMsIHRoZSBjb21tYW5kcyBmb3IgdGhlIHNwZWNpYWwKLUBjb2Rle21haW50YWluZXItY2xlYW59IHRhcmdldCBzaG91bGQgc3RhcnQgd2l0aCB0aGVzZSB0d286Ci0KLUBzbWFsbGV4YW1wbGUKLUBAZWNobyAnVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IGl0JwotQEBlY2hvICdkZWxldGVzIGZpbGVzIHRoYXQgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLicKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFRBR1MKLVVwZGF0ZSBhIHRhZ3MgdGFibGUgZm9yIHRoaXMgcHJvZ3JhbS4KLUBjIEFEUjogaG93PwotCi1AaXRlbSBpbmZvCi1HZW5lcmF0ZSBhbnkgSW5mbyBmaWxlcyBuZWVkZWQuICBUaGUgYmVzdCB3YXkgdG8gd3JpdGUgdGhlIHJ1bGVzIGlzIGFzCi1mb2xsb3dzOgotCi1Ac21hbGxleGFtcGxlCi1pbmZvOiBmb28uaW5mbwotCi1mb28uaW5mbzogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoTUFLRUlORk8pICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle01BS0VJTkZPfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgQGNvZGV7bWFrZWluZm99IHByb2dyYW0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi4KLQotTm9ybWFsbHkgYSBHTlUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggSW5mbyBmaWxlcywgYW5kIHRoYXQgbWVhbnMgdGhlCi1JbmZvIGZpbGVzIGFyZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgVGhlcmVmb3JlLCB0aGUgTWFrZQotcnVsZSBmb3IgYW4gaW5mbyBmaWxlIHNob3VsZCB1cGRhdGUgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBXaGVuCi11c2VycyBidWlsZCB0aGUgcGFja2FnZSwgb3JkaW5hcmlseSBNYWtlIHdpbGwgbm90IHVwZGF0ZSB0aGUgSW5mbyBmaWxlcwotYmVjYXVzZSB0aGV5IHdpbGwgYWxyZWFkeSBiZSB1cCB0byBkYXRlLgotCi1AaXRlbSBkdmkKLUdlbmVyYXRlIERWSSBmaWxlcyBmb3IgYWxsIFRleGluZm8gZG9jdW1lbnRhdGlvbi4KLUZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1kdmk6IGZvby5kdmkKLQotZm9vLmR2aTogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoVEVYSTJEVkkpICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle1RFWEkyRFZJfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgcHJvZ3JhbSBAY29kZXt0ZXhpMmR2aX0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi5AZm9vdG5vdGV7QGNvZGV7dGV4aTJkdml9IHVzZXMgQFRlWHt9IHRvIGRvIHRoZSByZWFsIHdvcmsKLW9mIGZvcm1hdHRpbmcuIEBUZVh7fSBpcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCBUZXhpbmZvLn0gIEFsdGVybmF0aXZlbHksCi13cml0ZSBqdXN0IHRoZSBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvdyBHTlUgQGNvZGV7bWFrZX0gdG8gcHJvdmlkZSB0aGUgY29tbWFuZC4KLQotQGl0ZW0gZGlzdAotQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIHRhciBmaWxlIGZvciB0aGlzIHByb2dyYW0uICBUaGUgdGFyIGZpbGUgc2hvdWxkIGJlCi1zZXQgdXAgc28gdGhhdCB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgdGFyIGZpbGUgc3RhcnQgd2l0aCBhIHN1YmRpcmVjdG9yeQotbmFtZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBmb3IuICBUaGlzCi1uYW1lIGNhbiBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlci4KLQotRm9yIGV4YW1wbGUsIHRoZSBkaXN0cmlidXRpb24gdGFyIGZpbGUgb2YgR0NDIHZlcnNpb24gMS40MCB1bnBhY2tzIGludG8KLWEgc3ViZGlyZWN0b3J5IG5hbWVkIEBmaWxle2djYy0xLjQwfS4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IGFwcHJvcHJpYXRlbHkKLW5hbWVkLCB1c2UgQGNvZGV7bG59IG9yIEBjb2Rle2NwfSB0byBpbnN0YWxsIHRoZSBwcm9wZXIgZmlsZXMgaW4gaXQsIGFuZAotdGhlbiBAY29kZXt0YXJ9IHRoYXQgc3ViZGlyZWN0b3J5LgotCi1Db21wcmVzcyB0aGUgdGFyIGZpbGUgZmlsZSB3aXRoIEBjb2Rle2d6aXB9LiAgRm9yIGV4YW1wbGUsIHRoZSBhY3R1YWwKLWRpc3RyaWJ1dGlvbiBmaWxlIGZvciBHQ0MgdmVyc2lvbiAxLjQwIGlzIGNhbGxlZCBAZmlsZXtnY2MtMS40MC50YXIuZ3p9LgotCi1UaGUgQGNvZGV7ZGlzdH0gdGFyZ2V0IHNob3VsZCBleHBsaWNpdGx5IGRlcGVuZCBvbiBhbGwgbm9uLXNvdXJjZSBmaWxlcwotdGhhdCBhcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUgaW4gdGhlCi1kaXN0cmlidXRpb24uCi1AaWZzZXQgQ09ERVNURAotQHhyZWZ7UmVsZWFzZXMsICwgTWFraW5nIFJlbGVhc2VzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIENPREVTVEQKLUB4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlcywgc3RhbmRhcmRzLCBHTlUgQ29kaW5nIFN0YW5kYXJkc30uCi1AZW5kIGlmY2xlYXIKLQotQGl0ZW0gY2hlY2sKLVBlcmZvcm0gc2VsZi10ZXN0cyAoaWYgYW55KS4gIFRoZSB1c2VyIG11c3QgYnVpbGQgdGhlIHByb2dyYW0gYmVmb3JlCi1ydW5uaW5nIHRoZSB0ZXN0cywgYnV0IG5lZWQgbm90IGluc3RhbGwgdGhlIHByb2dyYW07IHlvdSBzaG91bGQgd3JpdGUKLXRoZSBzZWxmLXRlc3RzIHNvIHRoYXQgdGhleSB3b3JrIHdoZW4gdGhlIHByb2dyYW0gaXMgYnVpbHQgYnV0IG5vdAotaW5zdGFsbGVkLgotQGVuZCB0YWJsZQotCi1UaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1Z2dlc3RlZCBhcyBjb252ZW50aW9uYWwgbmFtZXMsIGZvciBwcm9ncmFtcwotaW4gd2hpY2ggdGhleSBhcmUgdXNlZnVsLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGluc3RhbGxjaGVjawotUGVyZm9ybSBpbnN0YWxsYXRpb24gdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsCi10aGUgcHJvZ3JhbSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuICBZb3Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdAotQGZpbGV7JChiaW5kaXIpfSBpcyBpbiB0aGUgc2VhcmNoIHBhdGguCi0KLUBpdGVtIGluc3RhbGxkaXJzCi1JdCdzIHVzZWZ1bCB0byBhZGQgYSB0YXJnZXQgbmFtZWQgQHNhbXB7aW5zdGFsbGRpcnN9IHRvIGNyZWF0ZSB0aGUKLWRpcmVjdG9yaWVzIHdoZXJlIGZpbGVzIGFyZSBpbnN0YWxsZWQsIGFuZCB0aGVpciBwYXJlbnQgZGlyZWN0b3JpZXMuCi1UaGVyZSBpcyBhIHNjcmlwdCBjYWxsZWQgQGZpbGV7bWtpbnN0YWxsZGlyc30gd2hpY2ggaXMgY29udmVuaWVudCBmb3IKLXRoaXM7IHlvdSBjYW4gZmluZCBpdCBpbiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotQGMgSXQncyBpbiAvZ2QvZ251L2xpYi9ta2luc3RhbGxkaXJzLgotWW91IGNhbiB1c2UgYSBydWxlIGxpa2UgdGhpczoKLQotQGNvbW1lbnQgVGhpcyBoYXMgYmVlbiBjYXJlZnVsbHkgZm9ybWF0dGVkIHRvIGxvb2sgZGVjZW50IGluIHRoZSBNYWtlIG1hbnVhbC4KLUBjb21tZW50IFBsZWFzZSBiZSBzdXJlIG5vdCB0byBtYWtlIGl0IGV4dGVuZCBhbnkgZnVydGhlciB0byB0aGUgcmlnaHQuLS1yb2xhbmQKLUBzbWFsbGV4YW1wbGUKLSMgTWFrZSBzdXJlIGFsbCBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgKGUuZy4gJChiaW5kaXIpKQotIyBhY3R1YWxseSBleGlzdCBieSBtYWtpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi1pbnN0YWxsZGlyczogbWtpbnN0YWxsZGlycwotICAgICAgICAkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKGJpbmRpcikgJChkYXRhZGlyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobGliZGlyKSAkKGluZm9kaXIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChtYW5kaXIpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUuCi1JdCBzaG91bGQgZG8gbm90aGluZyBidXQgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXMKLUBzZWN0aW9uIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCi0KLUBjaW5kZXggcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcwotQGNpbmRleCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcwotV2hlbiB3cml0aW5nIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQsIHlvdSBtdXN0IGNsYXNzaWZ5IGFsbCB0aGUKLWNvbW1hbmRzIGludG8gdGhyZWUgY2F0ZWdvcmllczogbm9ybWFsIG9uZXMsIEBkZm57cHJlLWluc3RhbGxhdGlvbn0KLWNvbW1hbmRzIGFuZCBAZGZue3Bvc3QtaW5zdGFsbGF0aW9ufSBjb21tYW5kcy4KLQotTm9ybWFsIGNvbW1hbmRzIG1vdmUgZmlsZXMgaW50byB0aGVpciBwcm9wZXIgcGxhY2VzLCBhbmQgc2V0IHRoZWlyCi1tb2Rlcy4gIFRoZXkgbWF5IG5vdCBhbHRlciBhbnkgZmlsZXMgZXhjZXB0IHRoZSBvbmVzIHRoYXQgY29tZSBlbnRpcmVseQotZnJvbSB0aGUgcGFja2FnZSB0aGV5IGJlbG9uZyB0by4KLQotUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgbWF5IGFsdGVyIG90aGVyIGZpbGVzOwotaW4gcGFydGljdWxhciwgdGhleSBjYW4gZWRpdCBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcyBvciBkYXRhIGJhc2VzLgotCi1QcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgZXhlY3V0ZWQgYmVmb3JlIHRoZSBub3JtYWwKLWNvbW1hbmRzLCBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIHR5cGljYWxseSBydW4gYWZ0ZXIgdGhlCi1ub3JtYWwgY29tbWFuZHMuCi0KLVRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIGEgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZCBpcyB0byBydW4KLUBjb2Rle2luc3RhbGwtaW5mb30uICBUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGggYSBub3JtYWwgY29tbWFuZCwgc2luY2UKLWl0IGFsdGVycyBhIGZpbGUgKHRoZSBJbmZvIGRpcmVjdG9yeSkgd2hpY2ggZG9lcyBub3QgY29tZSBlbnRpcmVseSBhbmQKLXNvbGVseSBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGluc3RhbGxlZC4gIEl0IGlzIGEgcG9zdC1pbnN0YWxsYXRpb24KLWNvbW1hbmQgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRoZSBub3JtYWwgY29tbWFuZCB3aGljaAotaW5zdGFsbHMgdGhlIHBhY2thZ2UncyBJbmZvIGZpbGVzLgotCi1Nb3N0IHByb2dyYW1zIGRvbid0IG5lZWQgYW55IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMsIGJ1dCB3ZSBoYXZlIHRoZQotZmVhdHVyZSBqdXN0IGluIGNhc2UgaXQgaXMgbmVlZGVkLgotCi1UbyBjbGFzc2lmeSB0aGUgY29tbWFuZHMgaW4gdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgaW50byB0aGVzZSB0aHJlZQotY2F0ZWdvcmllcywgaW5zZXJ0IEBkZm57Y2F0ZWdvcnkgbGluZXN9IGFtb25nIHRoZW0uICBBIGNhdGVnb3J5IGxpbmUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgZm9yIHRoZSBjb21tYW5kcyB0aGF0IGZvbGxvdy4KLQotQSBjYXRlZ29yeSBsaW5lIGNvbnNpc3RzIG9mIGEgdGFiIGFuZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpYWwgTWFrZQotdmFyaWFibGUsIHBsdXMgYW4gb3B0aW9uYWwgY29tbWVudCBhdCB0aGUgZW5kLiAgVGhlcmUgYXJlIHRocmVlCi12YXJpYWJsZXMgeW91IGNhbiB1c2UsIG9uZSBmb3IgZWFjaCBjYXRlZ29yeTsgdGhlIHZhcmlhYmxlIG5hbWUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkuICBDYXRlZ29yeSBsaW5lcyBhcmUgbm8tb3BzIGluIG9yZGluYXJ5IGV4ZWN1dGlvbgotYmVjYXVzZSB0aGVzZSB0aHJlZSBNYWtlIHZhcmlhYmxlcyBhcmUgbm9ybWFsbHkgdW5kZWZpbmVkIChhbmQgeW91Ci1AZW1waHtzaG91bGQgbm90fSBkZWZpbmUgdGhlbSBpbiB0aGUgbWFrZWZpbGUpLgotCi1IZXJlIGFyZSB0aGUgdGhyZWUgcG9zc2libGUgY2F0ZWdvcnkgbGluZXMsIGVhY2ggd2l0aCBhIGNvbW1lbnQgdGhhdAotZXhwbGFpbnMgd2hhdCBpdCBtZWFuczoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9JTlNUQUxMKSAgICAgIyBAcntQcmUtaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKFBPU1RfSU5TVEFMTCkgICAgIyBAcntQb3N0LWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChOT1JNQUxfSU5TVEFMTCkgICMgQHJ7Tm9ybWFsIGNvbW1hbmRzIGZvbGxvdy59Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgZG9uJ3QgdXNlIGEgY2F0ZWdvcnkgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBAY29kZXtpbnN0YWxsfQotcnVsZSwgYWxsIHRoZSBjb21tYW5kcyBhcmUgY2xhc3NpZmllZCBhcyBub3JtYWwgdW50aWwgdGhlIGZpcnN0IGNhdGVnb3J5Ci1saW5lLiAgSWYgeW91IGRvbid0IHVzZSBhbnkgY2F0ZWdvcnkgbGluZXMsIGFsbCB0aGUgY29tbWFuZHMgYXJlCi1jbGFzc2lmaWVkIGFzIG5vcm1hbC4KLQotVGhlc2UgYXJlIHRoZSBjYXRlZ29yeSBsaW5lcyBmb3IgQGNvZGV7dW5pbnN0YWxsfToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9VTklOU1RBTEwpICAgICAjIEBye1ByZS11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChQT1NUX1VOSU5TVEFMTCkgICAgIyBAcntQb3N0LXVuaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKE5PUk1BTF9VTklOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVHlwaWNhbGx5LCBhIHByZS11bmluc3RhbGwgY29tbWFuZCB3b3VsZCBiZSB1c2VkIGZvciBkZWxldGluZyBlbnRyaWVzCi1mcm9tIHRoZSBJbmZvIGRpcmVjdG9yeS4KLQotSWYgdGhlIEBjb2Rle2luc3RhbGx9IG9yIEBjb2Rle3VuaW5zdGFsbH0gdGFyZ2V0IGhhcyBhbnkgZGVwZW5kZW5jaWVzCi13aGljaCBhY3QgYXMgc3Vicm91dGluZXMgb2YgaW5zdGFsbGF0aW9uLCB0aGVuIHlvdSBzaG91bGQgc3RhcnQKLUBlbXBoe2VhY2h9IGRlcGVuZGVuY3kncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSwgYW5kIHN0YXJ0IHRoZQotbWFpbiB0YXJnZXQncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSBhbHNvLiAgVGhpcyB3YXksIHlvdSBjYW4KLWVuc3VyZSB0aGF0IGVhY2ggY29tbWFuZCBpcyBwbGFjZWQgaW4gdGhlIHJpZ2h0IGNhdGVnb3J5IHJlZ2FyZGxlc3Mgb2YKLXdoaWNoIG9mIHRoZSBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgcnVuLgotCi1QcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcyBzaG91bGQgbm90IHJ1biBhbnkKLXByb2dyYW1zIGV4Y2VwdCBmb3IgdGhlc2U6Ci0KLUBleGFtcGxlCi1bIGJhc2VuYW1lIGJhc2ggY2F0IGNoZ3JwIGNobW9kIGNob3duIGNtcCBjcCBkZCBkaWZmIGVjaG8KLWVncmVwIGV4cGFuZCBleHByIGZhbHNlIGZncmVwIGZpbmQgZ2V0b3B0IGdyZXAgZ3VuemlwIGd6aXAKLWhvc3RuYW1lIGluc3RhbGwgaW5zdGFsbC1pbmZvIGtpbGwgbGRjb25maWcgbG4gbHMgbWQ1c3VtCi1ta2RpciBta2ZpZm8gbWtub2QgbXYgcHJpbnRlbnYgcHdkIHJtIHJtZGlyIHNlZCBzb3J0IHRlZQotdGVzdCB0b3VjaCB0cnVlIHVuYW1lIHhhcmdzIHllcwotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggYmluYXJ5IHBhY2thZ2VzCi1UaGUgcmVhc29uIGZvciBkaXN0aW5ndWlzaGluZyB0aGUgY29tbWFuZHMgaW4gdGhpcyB3YXkgaXMgZm9yIHRoZSBzYWtlCi1vZiBtYWtpbmcgYmluYXJ5IHBhY2thZ2VzLiAgVHlwaWNhbGx5IGEgYmluYXJ5IHBhY2thZ2UgY29udGFpbnMgYWxsIHRoZQotZXhlY3V0YWJsZXMgYW5kIG90aGVyIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQsIGFuZCBoYXMgaXRzIG93bgotbWV0aG9kIG9mIGluc3RhbGxpbmcgdGhlbS0tLXNvIGl0IGRvZXMgbm90IG5lZWQgdG8gcnVuIHRoZSBub3JtYWwKLWluc3RhbGxhdGlvbiBjb21tYW5kcy4gIEJ1dCBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZSBkb2VzIG5lZWQgdG8KLWV4ZWN1dGUgdGhlIHByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLgotCi1Qcm9ncmFtcyB0byBidWlsZCBiaW5hcnkgcGFja2FnZXMgd29yayBieSBleHRyYWN0aW5nIHRoZQotcHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMuICBIZXJlIGlzIG9uZSB3YXkgb2YKLWV4dHJhY3RpbmcgdGhlIHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLW1ha2UgLW4gaW5zdGFsbCAtbyBhbGwgXAotICAgICAgUFJFX0lOU1RBTEw9cHJlLWluc3RhbGwgXAotICAgICAgUE9TVF9JTlNUQUxMPXBvc3QtaW5zdGFsbCBcCi0gICAgICBOT1JNQUxfSU5TVEFMTD1ub3JtYWwtaW5zdGFsbCBcCi0gIHwgZ2F3ayAtZiBwcmUtaW5zdGFsbC5hd2sKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgdGhlIGZpbGUgQGZpbGV7cHJlLWluc3RhbGwuYXdrfSBjb3VsZCBjb250YWluIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLSQwIH4gL15cdFsgXHRdKihub3JtYWxfaW5zdGFsbHxwb3N0X2luc3RhbGwpWyBcdF0qJC8gQHtvbiA9IDBAfQotb24gQHtwcmludCAkMEB9Ci0kMCB+IC9eXHRbIFx0XSpwcmVfaW5zdGFsbFsgXHRdKiQvIEB7b24gPSAxQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSByZXN1bHRpbmcgZmlsZSBvZiBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwKLXNjcmlwdCBhcyBwYXJ0IG9mIGluc3RhbGxpbmcgdGhlIGJpbmFyeSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvZXRjL3N0YW5kYXJkcy50ZXhpIGIvZXRjL3N0YW5kYXJkcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBiZjhiLi4wMDAwMDAwCi0tLSBhL2V0Yy9zdGFuZGFyZHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwOTMgKzAsMCBAQAotXGlucHV0IHRleGluZm8gQGMgLSotdGV4aW5mby0qLQotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgc3RhbmRhcmRzLmluZm8KLUBzZXR0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZToKLUBzZXQgbGFzdHVwZGF0ZSBNYXJjaCAxMywgMTk5OAotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBTdGFuZGFyZHM6IChzdGFuZGFyZHMpLiAgICAgICAgR05VIGNvZGluZyBzdGFuZGFyZHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AYyBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi0KLUBjIFRoaXMgaXMgdXNlZCBieSBhIGNyb3NzIHJlZiBpbiBtYWtlLXN0ZHMudGV4aQotQHNldCBDT0RFU1REICAxCi1AaWZ0ZXgKLUBzZXQgQ0hBUFRFUiBjaGFwdGVyCi1AZW5kIGlmdGV4Ci1AaWZpbmZvCi1Ac2V0IENIQVBURVIgbm9kZQotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotR05VIENvZGluZyBTdGFuZGFyZHMKLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi1AYXV0aG9yIFJpY2hhcmQgU3RhbGxtYW4KLUBhdXRob3IgbGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfQotQHBhZ2UKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcCwgUHJlZmFjZSwgKGRpciksIChkaXIpCi1AdG9wIFZlcnNpb24KLQotTGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfS4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIFByZWZhY2U6OiAgICAgICAgICAgICAgICAgICAgIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotKiBJbnRlbGxlY3R1YWwgUHJvcGVydHk6OiAgICAgICBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotKiBEZXNpZ24gQWR2aWNlOjogICAgICAgICAgICAgICBHZW5lcmFsIFByb2dyYW0gRGVzaWduCi0qIFByb2dyYW0gQmVoYXZpb3I6OiAgICAgICAgICAgIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcwotKiBXcml0aW5nIEM6OiAgICAgICAgICAgICAgICAgICBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLSogRG9jdW1lbnRhdGlvbjo6ICAgICAgICAgICAgICAgRG9jdW1lbnRpbmcgUHJvZ3JhbXMKLSogTWFuYWdpbmcgUmVsZWFzZXM6OiAgICAgICAgICAgVGhlIFJlbGVhc2UgUHJvY2VzcwotQGVuZCBtZW51Ci0KLUBub2RlIFByZWZhY2UKLUBjaGFwdGVyIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotCi1UaGUgR05VIENvZGluZyBTdGFuZGFyZHMgd2VyZSB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIG90aGVyIEdOVQotUHJvamVjdCB2b2x1bnRlZXJzLiAgVGhlaXIgcHVycG9zZSBpcyB0byBtYWtlIHRoZSBHTlUgc3lzdGVtIGNsZWFuLAotY29uc2lzdGVudCwgYW5kIGVhc3kgdG8gaW5zdGFsbC4gIFRoaXMgZG9jdW1lbnQgY2FuIGFsc28gYmUgcmVhZCBhcyBhCi1ndWlkZSB0byB3cml0aW5nIHBvcnRhYmxlLCByb2J1c3QgYW5kIHJlbGlhYmxlIHByb2dyYW1zLiAgSXQgZm9jdXNlcyBvbgotcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBidXQgbWFueSBvZiB0aGUgcnVsZXMgYW5kIHByaW5jaXBsZXMgYXJlIHVzZWZ1bAotZXZlbiBpZiB5b3Ugd3JpdGUgaW4gYW5vdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFRoZSBydWxlcyBvZnRlbgotc3RhdGUgcmVhc29ucyBmb3Igd3JpdGluZyBpbiBhIGNlcnRhaW4gd2F5LgotCi1Db3JyZWN0aW9ucyBvciBzdWdnZXN0aW9ucyBmb3IgdGhpcyBkb2N1bWVudCBzaG91bGQgYmUgc2VudCB0bwotQGVtYWlse2dudUBAZ251Lm9yZ30uICBJZiB5b3UgbWFrZSBhIHN1Z2dlc3Rpb24sIHBsZWFzZSBpbmNsdWRlIGEKLXN1Z2dlc3RlZCBuZXcgd29yZGluZyBmb3IgaXQ7IG91ciB0aW1lIGlzIGxpbWl0ZWQuICBXZSBwcmVmZXIgYSBjb250ZXh0Ci1kaWZmIHRvIHRoZSBAZmlsZXtzdGFuZGFyZHMudGV4aX0gb3IgQGZpbGV7bWFrZS1zdGRzLnRleGl9IGZpbGVzLCBidXQgaWYKLXlvdSBkb24ndCBoYXZlIHRob3NlIGZpbGVzLCBwbGVhc2UgbWFpbCB5b3VyIHN1Z2dlc3Rpb24gYW55d2F5LgotCi1UaGlzIHJlbGVhc2Ugb2YgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdhcyBsYXN0IHVwZGF0ZWQKLUB2YWx1ZXtsYXN0dXBkYXRlfS4KLQotQG5vZGUgSW50ZWxsZWN0dWFsIFByb3BlcnR5Ci1AY2hhcHRlciBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgaG93IHlvdSBjYW4gbWFrZSBzdXJlIHRoYXQgR05VIHNvZnR3YXJlCi1yZW1haW5zIHVuZW5jdW1iZXJlZC4KLQotQG1lbnUKLSogUmVhZGluZyBOb24tRnJlZSBDb2RlOjogICAgICAgUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCi0qIENvbnRyaWJ1dGlvbnM6OiAgICAgICAgICAgICAgIEFjY2VwdGluZyBDb250cmlidXRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVhZGluZyBOb24tRnJlZSBDb2RlCi1Ac2VjdGlvbiBSZWZlcnJpbmcgdG8gUHJvcHJpZXRhcnkgUHJvZ3JhbXMKLQotRG9uJ3QgaW4gYW55IGNpcmN1bXN0YW5jZXMgcmVmZXIgdG8gVW5peCBzb3VyY2UgY29kZSBmb3Igb3IgZHVyaW5nCi15b3VyIHdvcmsgb24gR05VISAgKE9yIHRvIGFueSBvdGhlciBwcm9wcmlldGFyeSBwcm9ncmFtcy4pCi0KLUlmIHlvdSBoYXZlIGEgdmFndWUgcmVjb2xsZWN0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgYSBVbml4IHByb2dyYW0sCi10aGlzIGRvZXMgbm90IGFic29sdXRlbHkgbWVhbiB5b3UgY2FuJ3Qgd3JpdGUgYW4gaW1pdGF0aW9uIG9mIGl0LCBidXQKLWRvIHRyeSB0byBvcmdhbml6ZSB0aGUgaW1pdGF0aW9uIGludGVybmFsbHkgYWxvbmcgZGlmZmVyZW50IGxpbmVzLAotYmVjYXVzZSB0aGlzIGlzIGxpa2VseSB0byBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBVbml4IHZlcnNpb24KLWlycmVsZXZhbnQgYW5kIGRpc3NpbWlsYXIgdG8geW91ciByZXN1bHRzLgotCi1Gb3IgZXhhbXBsZSwgVW5peCB1dGlsaXRpZXMgd2VyZSBnZW5lcmFsbHkgb3B0aW1pemVkIHRvIG1pbmltaXplCi1tZW1vcnkgdXNlOyBpZiB5b3UgZ28gZm9yIHNwZWVkIGluc3RlYWQsIHlvdXIgcHJvZ3JhbSB3aWxsIGJlIHZlcnkKLWRpZmZlcmVudC4gIFlvdSBjb3VsZCBrZWVwIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBpbiBjb3JlIGFuZCBzY2FuIGl0Ci10aGVyZSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvLiAgVXNlIGEgc21hcnRlciBhbGdvcml0aG0gZGlzY292ZXJlZCBtb3JlCi1yZWNlbnRseSB0aGFuIHRoZSBVbml4IHByb2dyYW0uICBFbGltaW5hdGUgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcy4gIERvCi1pdCBpbiBvbmUgcGFzcyBpbnN0ZWFkIG9mIHR3byAod2UgZGlkIHRoaXMgaW4gdGhlIGFzc2VtYmxlcikuCi0KLU9yLCBvbiB0aGUgY29udHJhcnksIGVtcGhhc2l6ZSBzaW1wbGljaXR5IGluc3RlYWQgb2Ygc3BlZWQuICBGb3Igc29tZQotYXBwbGljYXRpb25zLCB0aGUgc3BlZWQgb2YgdG9kYXkncyBjb21wdXRlcnMgbWFrZXMgc2ltcGxlciBhbGdvcml0aG1zCi1hZGVxdWF0ZS4KLQotT3IgZ28gZm9yIGdlbmVyYWxpdHkuICBGb3IgZXhhbXBsZSwgVW5peCBwcm9ncmFtcyBvZnRlbiBoYXZlIHN0YXRpYwotdGFibGVzIG9yIGZpeGVkLXNpemUgc3RyaW5ncywgd2hpY2ggbWFrZSBmb3IgYXJiaXRyYXJ5IGxpbWl0czsgdXNlCi1keW5hbWljIGFsbG9jYXRpb24gaW5zdGVhZC4gIE1ha2Ugc3VyZSB5b3VyIHByb2dyYW0gaGFuZGxlcyBOVUxzIGFuZAotb3RoZXIgZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgZmlsZXMuICBBZGQgYSBwcm9ncmFtbWluZyBsYW5ndWFnZQotZm9yIGV4dGVuc2liaWxpdHkgYW5kIHdyaXRlIHBhcnQgb2YgdGhlIHByb2dyYW0gaW4gdGhhdCBsYW5ndWFnZS4KLQotT3IgdHVybiBzb21lIHBhcnRzIG9mIHRoZSBwcm9ncmFtIGludG8gaW5kZXBlbmRlbnRseSB1c2FibGUgbGlicmFyaWVzLgotT3IgdXNlIGEgc2ltcGxlIGdhcmJhZ2UgY29sbGVjdG9yIGluc3RlYWQgb2YgdHJhY2tpbmcgcHJlY2lzZWx5IHdoZW4KLXRvIGZyZWUgbWVtb3J5LCBvciB1c2UgYSBuZXcgR05VIGZhY2lsaXR5IHN1Y2ggYXMgb2JzdGFja3MuCi0KLQotQG5vZGUgQ29udHJpYnV0aW9ucwotQHNlY3Rpb24gQWNjZXB0aW5nIENvbnRyaWJ1dGlvbnMKLQotSWYgc29tZW9uZSBlbHNlIHNlbmRzIHlvdSBhIHBpZWNlIG9mIGNvZGUgdG8gYWRkIHRvIHRoZSBwcm9ncmFtIHlvdSBhcmUKLXdvcmtpbmcgb24sIHdlIG5lZWQgbGVnYWwgcGFwZXJzIHRvIHVzZSBpdC0tLXRoZSBzYW1lIHNvcnQgb2YgbGVnYWwKLXBhcGVycyB3ZSB3aWxsIG5lZWQgdG8gZ2V0IGZyb20geW91LiAgQGVtcGh7RWFjaH0gc2lnbmlmaWNhbnQKLWNvbnRyaWJ1dG9yIHRvIGEgcHJvZ3JhbSBtdXN0IHNpZ24gc29tZSBzb3J0IG9mIGxlZ2FsIHBhcGVycyBpbiBvcmRlcgotZm9yIHVzIHRvIGhhdmUgY2xlYXIgdGl0bGUgdG8gdGhlIHByb2dyYW0uICBUaGUgbWFpbiBhdXRob3IgYWxvbmUgaXMgbm90Ci1lbm91Z2guCi0KLVNvLCBiZWZvcmUgYWRkaW5nIGluIGFueSBjb250cmlidXRpb25zIGZyb20gb3RoZXIgcGVvcGxlLCBwbGVhc2UgdGVsbAotdXMsIHNvIHdlIGNhbiBhcnJhbmdlIHRvIGdldCB0aGUgcGFwZXJzLiAgVGhlbiB3YWl0IHVudGlsIHdlIHRlbGwgeW91Ci10aGF0IHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNpZ25lZCBwYXBlcnMsIGJlZm9yZSB5b3UgYWN0dWFsbHkgdXNlIHRoZQotY29udHJpYnV0aW9uLgotCi1UaGlzIGFwcGxpZXMgYm90aCBiZWZvcmUgeW91IHJlbGVhc2UgdGhlIHByb2dyYW0gYW5kIGFmdGVyd2FyZC4gIElmCi15b3UgcmVjZWl2ZSBkaWZmcyB0byBmaXggYSBidWcsIGFuZCB0aGV5IG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcywgd2UKLW5lZWQgbGVnYWwgcGFwZXJzIGZvciB0aGF0IGNoYW5nZS4KLQotVGhpcyBhbHNvIGFwcGxpZXMgdG8gY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gZmlsZXMuICBGb3IgY29weXJpZ2h0Ci1sYXcsIGNvbW1lbnRzIGFuZCBjb2RlIGFyZSBqdXN0IHRleHQuICBDb3B5cmlnaHQgYXBwbGllcyB0byBhbGwga2luZHMgb2YKLXRleHQsIHNvIHdlIG5lZWQgbGVnYWwgcGFwZXJzIGZvciBhbGwga2luZHMuCi0KLVlvdSBkb24ndCBuZWVkIHBhcGVycyBmb3IgY2hhbmdlcyBvZiBhIGZldyBsaW5lcyBoZXJlIG9yIHRoZXJlLCBzaW5jZQotdGhleSBhcmUgbm90IHNpZ25pZmljYW50IGZvciBjb3B5cmlnaHQgcHVycG9zZXMuICBBbHNvLCB5b3UgZG9uJ3QgbmVlZAotcGFwZXJzIGlmIGFsbCB5b3UgZ2V0IGZyb20gdGhlIHN1Z2dlc3Rpb24gaXMgc29tZSBpZGVhcywgbm90IGFjdHVhbCBjb2RlCi13aGljaCB5b3UgdXNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3cml0ZSBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB0aGUKLXByb2JsZW0sIHlvdSBkb24ndCBuZWVkIHRvIGdldCBwYXBlcnMuCi0KLVdlIGtub3cgdGhpcyBpcyBmcnVzdHJhdGluZzsgaXQncyBmcnVzdHJhdGluZyBmb3IgdXMgYXMgd2VsbC4gIEJ1dCBpZgoteW91IGRvbid0IHdhaXQsIHlvdSBhcmUgZ29pbmcgb3V0IG9uIGEgbGltYi0tLWZvciBleGFtcGxlLCB3aGF0IGlmIHRoZQotY29udHJpYnV0b3IncyBlbXBsb3llciB3b24ndCBzaWduIGEgZGlzY2xhaW1lcj8gIFlvdSBtaWdodCBoYXZlIHRvIHRha2UKLXRoYXQgY29kZSBvdXQgYWdhaW4hCi0KLVRoZSB2ZXJ5IHdvcnN0IHRoaW5nIGlzIGlmIHlvdSBmb3JnZXQgdG8gdGVsbCB1cyBhYm91dCB0aGUgb3RoZXIKLWNvbnRyaWJ1dG9yLiAgV2UgY291bGQgYmUgdmVyeSBlbWJhcnJhc3NlZCBpbiBjb3VydCBzb21lIGRheSBhcyBhCi1yZXN1bHQuCi0KLVdlIGhhdmUgbW9yZSBkZXRhaWxlZCBhZHZpY2UgZm9yIG1haW50YWluZXJzIG9mIHByb2dyYW1zOyBpZiB5b3UgaGF2ZQotcmVhY2hlZCB0aGUgc3RhZ2Ugb2YgYWN0dWFsbHkgbWFpbnRhaW5pbmcgYSBwcm9ncmFtIGZvciBHTlUgKHdoZXRoZXIKLXJlbGVhc2VkIG9yIG5vdCksIHBsZWFzZSBhc2sgdXMgZm9yIGEgY29weS4KLQotQG5vZGUgRGVzaWduIEFkdmljZQotQGNoYXB0ZXIgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgc29tZSBvZiB0aGUgaXNzdWVzIHlvdSBzaG91bGQgdGFrZSBpbnRvCi1hY2NvdW50IHdoZW4gZGVzaWduaW5nIHlvdXIgcHJvZ3JhbS4KLQotQG1lbnUKLSogQ29tcGF0aWJpbGl0eTo6ICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucwotKiBVc2luZyBFeHRlbnNpb25zOjogICAgICAgICAgICBVc2luZyBub24tc3RhbmRhcmQgZmVhdHVyZXMKLSogQU5TSSBDOjogICAgICAgICAgICAgICAgICAgICAgVXNpbmcgQU5TSSBDIGZlYXR1cmVzCi0qIFNvdXJjZSBMYW5ndWFnZTo6ICAgICAgICAgICAgIFVzaW5nIGxhbmd1YWdlcyBvdGhlciB0aGFuIEMKLUBlbmQgbWVudQotCi1Abm9kZSBDb21wYXRpYmlsaXR5Ci1Ac2VjdGlvbiBDb21wYXRpYmlsaXR5IHdpdGggT3RoZXIgSW1wbGVtZW50YXRpb25zCi0KLVdpdGggb2NjYXNpb25hbCBleGNlcHRpb25zLCB1dGlsaXR5IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgZm9yIEdOVQotc2hvdWxkIGJlIHVwd2FyZCBjb21wYXRpYmxlIHdpdGggdGhvc2UgaW4gQmVya2VsZXkgVW5peCwgYW5kIHVwd2FyZAotY29tcGF0aWJsZSB3aXRoIEBzY3thbnNpfSBDIGlmIEBzY3thbnNpfSBDIHNwZWNpZmllcyB0aGVpciBiZWhhdmlvciwgYW5kCi11cHdhcmQgY29tcGF0aWJsZSB3aXRoIEBzY3tQT1NJWH0gaWYgQHNje1BPU0lYfSBzcGVjaWZpZXMgdGhlaXIKLWJlaGF2aW9yLgotCi1XaGVuIHRoZXNlIHN0YW5kYXJkcyBjb25mbGljdCwgaXQgaXMgdXNlZnVsIHRvIG9mZmVyIGNvbXBhdGliaWxpdHkKLW1vZGVzIGZvciBlYWNoIG9mIHRoZW0uCi0KLUBzY3thbnNpfSBDIGFuZCBAc2N7UE9TSVh9IHByb2hpYml0IG1hbnkga2luZHMgb2YgZXh0ZW5zaW9ucy4gIEZlZWwgZnJlZQotdG8gbWFrZSB0aGUgZXh0ZW5zaW9ucyBhbnl3YXksIGFuZCBpbmNsdWRlIGEgQHNhbXB7LS1hbnNpfSwKLUBzYW1wey0tcG9zaXh9LCBvciBAc2FtcHstLWNvbXBhdGlibGV9IG9wdGlvbiB0byB0dXJuIHRoZW0gb2ZmLgotSG93ZXZlciwgaWYgdGhlIGV4dGVuc2lvbiBoYXMgYSBzaWduaWZpY2FudCBjaGFuY2Ugb2YgYnJlYWtpbmcgYW55IHJlYWwKLXByb2dyYW1zIG9yIHNjcmlwdHMsIHRoZW4gaXQgaXMgbm90IHJlYWxseSB1cHdhcmQgY29tcGF0aWJsZS4gIFRyeSB0bwotcmVkZXNpZ24gaXRzIGludGVyZmFjZS4KLQotTWFueSBHTlUgcHJvZ3JhbXMgc3VwcHJlc3MgZXh0ZW5zaW9ucyB0aGF0IGNvbmZsaWN0IHdpdGggUE9TSVggaWYgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtQT1NJWExZX0NPUlJFQ1R9IGlzIGRlZmluZWQgKGV2ZW4gaWYgaXQgaXMKLWRlZmluZWQgd2l0aCBhIG51bGwgdmFsdWUpLiAgUGxlYXNlIG1ha2UgeW91ciBwcm9ncmFtIHJlY29nbml6ZSB0aGlzCi12YXJpYWJsZSBpZiBhcHByb3ByaWF0ZS4KLQotV2hlbiBhIGZlYXR1cmUgaXMgdXNlZCBvbmx5IGJ5IHVzZXJzIChub3QgYnkgcHJvZ3JhbXMgb3IgY29tbWFuZAotZmlsZXMpLCBhbmQgaXQgaXMgZG9uZSBwb29ybHkgaW4gVW5peCwgZmVlbCBmcmVlIHRvIHJlcGxhY2UgaXQKLWNvbXBsZXRlbHkgd2l0aCBzb21ldGhpbmcgdG90YWxseSBkaWZmZXJlbnQgYW5kIGJldHRlci4gIChGb3IgZXhhbXBsZSwKLUBjb2Rle3ZpfSBpcyByZXBsYWNlZCB3aXRoIEVtYWNzLikgIEJ1dCBpdCBpcyBuaWNlIHRvIG9mZmVyIGEgY29tcGF0aWJsZQotZmVhdHVyZSBhcyB3ZWxsLiAgKFRoZXJlIGlzIGEgZnJlZSBAY29kZXt2aX0gY2xvbmUsIHNvIHdlIG9mZmVyIGl0LikKLQotQWRkaXRpb25hbCB1c2VmdWwgZmVhdHVyZXMgbm90IGluIEJlcmtlbGV5IFVuaXggYXJlIHdlbGNvbWUuCi0KLUBub2RlIFVzaW5nIEV4dGVuc2lvbnMKLUBzZWN0aW9uIFVzaW5nIE5vbi1zdGFuZGFyZCBGZWF0dXJlcwotCi1NYW55IEdOVSBmYWNpbGl0aWVzIHRoYXQgYWxyZWFkeSBleGlzdCBzdXBwb3J0IGEgbnVtYmVyIG9mIGNvbnZlbmllbnQKLWV4dGVuc2lvbnMgb3ZlciB0aGUgY29tcGFyYWJsZSBVbml4IGZhY2lsaXRpZXMuICBXaGV0aGVyIHRvIHVzZSB0aGVzZQotZXh0ZW5zaW9ucyBpbiBpbXBsZW1lbnRpbmcgeW91ciBwcm9ncmFtIGlzIGEgZGlmZmljdWx0IHF1ZXN0aW9uLgotCi1PbiB0aGUgb25lIGhhbmQsIHVzaW5nIHRoZSBleHRlbnNpb25zIGNhbiBtYWtlIGEgY2xlYW5lciBwcm9ncmFtLgotT24gdGhlIG90aGVyIGhhbmQsIHBlb3BsZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtCi11bmxlc3MgdGhlIG90aGVyIEdOVSB0b29scyBhcmUgYXZhaWxhYmxlLiAgVGhpcyBtaWdodCBjYXVzZSB0aGUKLXByb2dyYW0gdG8gd29yayBvbiBmZXdlciBraW5kcyBvZiBtYWNoaW5lcy4KLQotV2l0aCBzb21lIGV4dGVuc2lvbnMsIGl0IG1pZ2h0IGJlIGVhc3kgdG8gcHJvdmlkZSBib3RoIGFsdGVybmF0aXZlcy4KLUZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIGBga2V5d29yZCcnIEBjb2Rle0lOTElORX0KLWFuZCBkZWZpbmUgdGhhdCBhcyBhIG1hY3JvIHRvIGV4cGFuZCBpbnRvIGVpdGhlciBAY29kZXtpbmxpbmV9IG9yCi1ub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLgotCi1JbiBnZW5lcmFsLCBwZXJoYXBzIGl0IGlzIGJlc3Qgbm90IHRvIHVzZSB0aGUgZXh0ZW5zaW9ucyBpZiB5b3UgY2FuCi1zdHJhaWdodGZvcndhcmRseSBkbyB3aXRob3V0IHRoZW0sIGJ1dCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgdGhleQotYXJlIGEgYmlnIGltcHJvdmVtZW50LgotCi1BbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIGFyZSB0aGUgbGFyZ2UsIGVzdGFibGlzaGVkIHByb2dyYW1zIChzdWNoIGFzCi1FbWFjcykgd2hpY2ggcnVuIG9uIGEgZ3JlYXQgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgU3VjaCBwcm9ncmFtcyB3b3VsZAotYmUgYnJva2VuIGJ5IHVzZSBvZiBHTlUgZXh0ZW5zaW9ucy4KLQotQW5vdGhlciBleGNlcHRpb24gaXMgZm9yIHByb2dyYW1zIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZgotY29tcGlsYXRpb246IGFueXRoaW5nIHRoYXQgbXVzdCBiZSBjb21waWxlZCB3aXRoIG90aGVyIGNvbXBpbGVycyBpbgotb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBHTlUgY29tcGlsYXRpb24gZmFjaWxpdGllcy4gIElmIHRoZXNlIHJlcXVpcmUKLXRoZSBHTlUgY29tcGlsZXIsIHRoZW4gbm8gb25lIGNhbiBjb21waWxlIHRoZW0gd2l0aG91dCBoYXZpbmcgdGhlbQotaW5zdGFsbGVkIGFscmVhZHkuICBUaGF0IHdvdWxkIGJlIG5vIGdvb2QuCi0KLUBub2RlIEFOU0kgQwotQHNlY3Rpb24gQHNje2Fuc2l9IEMgYW5kIHByZS1Ac2N7YW5zaX0gQwotCi1EbyBub3QgZXZlciB1c2UgdGhlIGBgdHJpZ3JhcGgnJyBmZWF0dXJlIG9mIEBzY3thbnNpfSBDLgotCi1Ac2N7YW5zaX0gQyBpcyB3aWRlc3ByZWFkIGVub3VnaCBub3cgdGhhdCBpdCBpcyBvayB0byB3cml0ZSBuZXcgcHJvZ3JhbXMKLXRoYXQgdXNlIEBzY3thbnNpfSBDIGZlYXR1cmVzIChhbmQgdGhlcmVmb3JlIHdpbGwgbm90IHdvcmsgaW4KLW5vbi1Ac2N7YW5zaX0gY29tcGlsZXJzKS4gIEFuZCBpZiBhIHByb2dyYW0gaXMgYWxyZWFkeSB3cml0dGVuIGluCi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9Ci1jb21waWxlcnMuCi0KLUhvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9IGNvbXBpbGVycyBpbiBtb3N0IHByb2dyYW1zLAotc28geW91IG1pZ2h0IHN0aWxsIGNvbnNpZGVyIGRvaW5nIHNvIHdoZW4geW91IHdyaXRlIGEgcHJvZ3JhbS4gIEluc3RlYWQKLW9mIHdyaXRpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gQHNje2Fuc2l9IHByb3RvdHlwZSBmb3JtLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKGludCB4LCBpbnQgeSkKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdyaXRlIHRoZSBkZWZpbml0aW9uIGluIHByZS1Ac2N7YW5zaX0gc3R5bGUgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKHgsIHkpCi0gICAgIGludCB4LCB5OwotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYW5kIHVzZSBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHByb3RvdHlwZToKLQotQGV4YW1wbGUKLWludCBmb28gKGludCwgaW50KTsKLUBlbmQgZXhhbXBsZQotCi1Zb3UgbmVlZCBzdWNoIGEgZGVjbGFyYXRpb24gYW55d2F5LCBpbiBhIGhlYWRlciBmaWxlLCB0byBnZXQgdGhlIGJlbmVmaXQKLW9mIEBzY3thbnNpfSBDIHByb3RvdHlwZXMgaW4gYWxsIHRoZSBmaWxlcyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotQW5kIG9uY2UgeW91IGhhdmUgaXQsIHlvdSBsb3NlIG5vdGhpbmcgYnkgd3JpdGluZyB0aGUgZnVuY3Rpb24KLWRlZmluaXRpb24gaW4gdGhlIHByZS1Ac2N7YW5zaX0gc3R5bGUuCi0KLUlmIHlvdSBkb24ndCBrbm93IG5vbi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGxlYXJuIGl0OyBqdXN0Ci13cml0ZSBpbiBAc2N7YW5zaX0gQy4KLQotQG5vZGUgU291cmNlIExhbmd1YWdlCi1Ac2VjdGlvbiBVc2luZyBMYW5ndWFnZXMgT3RoZXIgVGhhbiBDCi0KLVVzaW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBDIGlzIGxpa2UgdXNpbmcgYSBub24tc3RhbmRhcmQgZmVhdHVyZTogaXQKLXdpbGwgY2F1c2UgdHJvdWJsZSBmb3IgdXNlcnMuICBFdmVuIGlmIEdDQyBzdXBwb3J0cyB0aGUgb3RoZXIgbGFuZ3VhZ2UsCi11c2VycyBtYXkgZmluZCBpdCBpbmNvbnZlbmllbnQgdG8gaGF2ZSB0byBpbnN0YWxsIHRoZSBjb21waWxlciBmb3IgdGhhdAotb3RoZXIgbGFuZ3VhZ2UgaW4gb3JkZXIgdG8gYnVpbGQgeW91ciBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQotd3JpdGUgeW91ciBwcm9ncmFtIGluIEMrKywgcGVvcGxlIHdpbGwgaGF2ZSB0byBpbnN0YWxsIHRoZSBDKysgY29tcGlsZXIKLWluIG9yZGVyIHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtLiAgVGh1cywgaXQgaXMgYmV0dGVyIGlmIHlvdSB3cml0ZSBpbiBDLgotCi1CdXQgdGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBpcyBubyBkaXNhZHZhbnRhZ2UgaW4gdXNpbmcKLXNvbWUgb3RoZXIgbGFuZ3VhZ2U6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1JdCBpcyBva2F5IHRvIHVzZSBhbm90aGVyIGxhbmd1YWdlIGlmIHlvdXIgcHJvZ3JhbSBjb250YWlucyBhbgotaW50ZXJwcmV0ZXIgZm9yIHRoYXQgbGFuZ3VhZ2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gbGlua3Mgd2l0aCBHVUlMRSwgaXQgaXMgb2sgdG8gd3JpdGUgcGFydCBvZgotdGhlIHByb2dyYW0gaW4gU2NoZW1lIG9yIGFub3RoZXIgbGFuZ3VhZ2Ugc3VwcG9ydGVkIGJ5IEdVSUxFLgotCi1AaXRlbQotSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpbiBhIHRvb2wgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgotdXNlIHdpdGggdGhhdCBsYW5ndWFnZS4KLQotVGhpcyBpcyBva2F5IGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyB3YW50IHRvIGJ1aWxkIHRoZSB0b29sIHdpbGwgYmUKLXRob3NlIHdobyBoYXZlIGluc3RhbGxlZCB0aGUgb3RoZXIgbGFuZ3VhZ2UgYW55d2F5LgotCi1AaXRlbQotSWYgYW4gYXBwbGljYXRpb24gaXMgb2YgaW50ZXJlc3QgdG8gYSBuYXJyb3cgY29tbXVuaXR5LCB0aGVuIHBlcmhhcHMKLWl0J3Mgbm90IGltcG9ydGFudCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5jb252ZW5pZW50IHRvIGluc3RhbGwuCi1AZW5kIGl0ZW1pemUKLQotQyBoYXMgb25lIG90aGVyIGFkdmFudGFnZSBvdmVyIEMrKyBhbmQgb3RoZXIgY29tcGlsZWQgbGFuZ3VhZ2VzOiBtb3JlCi1wZW9wbGUga25vdyBDLCBzbyBtb3JlIHBlb3BsZSB3aWxsIGZpbmQgaXQgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkgdGhlCi1wcm9ncmFtIGlmIGl0IGlzIHdyaXR0ZW4gaW4gQy4KLQotQG5vZGUgUHJvZ3JhbSBCZWhhdmlvcgotQGNoYXB0ZXIgUHJvZ3JhbSBCZWhhdmlvciBmb3IgQWxsIFByb2dyYW1zCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgcm9idXN0IHNvZnR3YXJlLiBJdCBhbHNvCi1kZXNjcmliZXMgZ2VuZXJhbCBzdGFuZGFyZHMgZm9yIGVycm9yIG1lc3NhZ2VzLCB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSwKLWFuZCBob3cgbGlicmFyaWVzIHNob3VsZCBiZWhhdmUuCi0KLUBtZW51Ci0qIFNlbWFudGljczo6ICAgICAgICAgICAgICAgICAgIFdyaXRpbmcgcm9idXN0IHByb2dyYW1zCi0qIExpYnJhcmllczo6ICAgICAgICAgICAgICAgICAgIExpYnJhcnkgYmVoYXZpb3IKLSogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcwotKiBVc2VyIEludGVyZmFjZXM6OiAgICAgICAgICAgICBTdGFuZGFyZHMgZm9yIGNvbW1hbmQgbGluZSBpbnRlcmZhY2VzCi0qIE9wdGlvbiBUYWJsZTo6ICAgICAgICAgICAgICAgIFRhYmxlIG9mIGxvbmcgb3B0aW9ucy4KLSogTWVtb3J5IFVzYWdlOjogICAgICAgICAgICAgICAgV2hlbiBhbmQgaG93IHRvIGNhcmUgYWJvdXQgbWVtb3J5IG5lZWRzCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VtYW50aWNzCi1Ac2VjdGlvbiBXcml0aW5nIFJvYnVzdCBQcm9ncmFtcwotCi1Bdm9pZCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBsZW5ndGggb3IgbnVtYmVyIG9mIEBlbXBoe2FueX0gZGF0YQotc3RydWN0dXJlLCBpbmNsdWRpbmcgZmlsZSBuYW1lcywgbGluZXMsIGZpbGVzLCBhbmQgc3ltYm9scywgYnkgYWxsb2NhdGluZwotYWxsIGRhdGEgc3RydWN0dXJlcyBkeW5hbWljYWxseS4gIEluIG1vc3QgVW5peCB1dGlsaXRpZXMsIGBgbG9uZyBsaW5lcwotYXJlIHNpbGVudGx5IHRydW5jYXRlZCcnLiAgVGhpcyBpcyBub3QgYWNjZXB0YWJsZSBpbiBhIEdOVSB1dGlsaXR5LgotCi1VdGlsaXRpZXMgcmVhZGluZyBmaWxlcyBzaG91bGQgbm90IGRyb3AgTlVMIGNoYXJhY3RlcnMsIG9yIGFueSBvdGhlcgotbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBAZW1waHtpbmNsdWRpbmcgdGhvc2Ugd2l0aCBjb2RlcyBhYm92ZSAwMTc3fS4gIFRoZQotb25seSBzZW5zaWJsZSBleGNlcHRpb25zIHdvdWxkIGJlIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yCi1pbnRlcmZhY2UgdG8gY2VydGFpbiB0eXBlcyBvZiBwcmludGVycyB0aGF0IGNhbid0IGhhbmRsZSB0aG9zZSBjaGFyYWN0ZXJzLgotCi1DaGVjayBldmVyeSBzeXN0ZW0gY2FsbCBmb3IgYW4gZXJyb3IgcmV0dXJuLCB1bmxlc3MgeW91IGtub3cgeW91IHdpc2ggdG8KLWlnbm9yZSBlcnJvcnMuICBJbmNsdWRlIHRoZSBzeXN0ZW0gZXJyb3IgdGV4dCAoZnJvbSBAY29kZXtwZXJyb3J9IG9yCi1lcXVpdmFsZW50KSBpbiBAZW1waHtldmVyeX0gZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBhIGZhaWxpbmcKLXN5c3RlbSBjYWxsLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGFueSBhbmQgdGhlIG5hbWUgb2YgdGhlCi11dGlsaXR5LiAgSnVzdCBgYGNhbm5vdCBvcGVuIGZvby5jJycgb3IgYGBzdGF0IGZhaWxlZCcnIGlzIG5vdAotc3VmZmljaWVudC4KLQotQ2hlY2sgZXZlcnkgY2FsbCB0byBAY29kZXttYWxsb2N9IG9yIEBjb2Rle3JlYWxsb2N9IHRvIHNlZSBpZiBpdAotcmV0dXJuZWQgemVyby4gIENoZWNrIEBjb2Rle3JlYWxsb2N9IGV2ZW4gaWYgeW91IGFyZSBtYWtpbmcgdGhlIGJsb2NrCi1zbWFsbGVyOyBpbiBhIHN5c3RlbSB0aGF0IHJvdW5kcyBibG9jayBzaXplcyB0byBhIHBvd2VyIG9mIDIsCi1AY29kZXtyZWFsbG9jfSBtYXkgZ2V0IGEgZGlmZmVyZW50IGJsb2NrIGlmIHlvdSBhc2sgZm9yIGxlc3Mgc3BhY2UuCi0KLUluIFVuaXgsIEBjb2Rle3JlYWxsb2N9IGNhbiBkZXN0cm95IHRoZSBzdG9yYWdlIGJsb2NrIGlmIGl0IHJldHVybnMKLXplcm8uICBHTlUgQGNvZGV7cmVhbGxvY30gZG9lcyBub3QgaGF2ZSB0aGlzIGJ1ZzogaWYgaXQgZmFpbHMsIHRoZQotb3JpZ2luYWwgYmxvY2sgaXMgdW5jaGFuZ2VkLiAgRmVlbCBmcmVlIHRvIGFzc3VtZSB0aGUgYnVnIGlzIGZpeGVkLiAgSWYKLXlvdSB3aXNoIHRvIHJ1biB5b3VyIHByb2dyYW0gb24gVW5peCwgYW5kIHdpc2ggdG8gYXZvaWQgbG9zc2FnZSBpbiB0aGlzCi1jYXNlLCB5b3UgY2FuIHVzZSB0aGUgR05VIEBjb2Rle21hbGxvY30uCi0KLVlvdSBtdXN0IGV4cGVjdCBAY29kZXtmcmVlfSB0byBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHRoYXQgd2FzCi1mcmVlZC4gIEFueXRoaW5nIHlvdSB3YW50IHRvIGZldGNoIGZyb20gdGhlIGJsb2NrLCB5b3UgbXVzdCBmZXRjaCBiZWZvcmUKLWNhbGxpbmcgQGNvZGV7ZnJlZX0uCi0KLUlmIEBjb2Rle21hbGxvY30gZmFpbHMgaW4gYSBub25pbnRlcmFjdGl2ZSBwcm9ncmFtLCBtYWtlIHRoYXQgYSBmYXRhbAotZXJyb3IuICBJbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCByZWFkcyBjb21tYW5kcyBmcm9tIHRoZQotdXNlciksIGl0IGlzIGJldHRlciB0byBhYm9ydCB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIHRvIHRoZSBjb21tYW5kCi1yZWFkZXIgbG9vcC4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGtpbGwgb3RoZXIgcHJvY2Vzc2VzIHRvIGZyZWUgdXAKLXZpcnR1YWwgbWVtb3J5LCBhbmQgdGhlbiB0cnkgdGhlIGNvbW1hbmQgYWdhaW4uCi0KLVVzZSBAY29kZXtnZXRvcHRfbG9uZ30gdG8gZGVjb2RlIGFyZ3VtZW50cywgdW5sZXNzIHRoZSBhcmd1bWVudCBzeW50YXgKLW1ha2VzIHRoaXMgdW5yZWFzb25hYmxlLgotCi1XaGVuIHN0YXRpYyBzdG9yYWdlIGlzIHRvIGJlIHdyaXR0ZW4gaW4gZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLCB1c2UKLWV4cGxpY2l0IEMgY29kZSB0byBpbml0aWFsaXplIGl0LiAgUmVzZXJ2ZSBDIGluaXRpYWxpemVkIGRlY2xhcmF0aW9ucwotZm9yIGRhdGEgdGhhdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotQGMgQURSOiB3aHk/Ci0KLVRyeSB0byBhdm9pZCBsb3ctbGV2ZWwgaW50ZXJmYWNlcyB0byBvYnNjdXJlIFVuaXggZGF0YSBzdHJ1Y3R1cmVzIChzdWNoCi1hcyBmaWxlIGRpcmVjdG9yaWVzLCB1dG1wLCBvciB0aGUgbGF5b3V0IG9mIGtlcm5lbCBtZW1vcnkpLCBzaW5jZSB0aGVzZQotYXJlIGxlc3MgbGlrZWx5IHRvIHdvcmsgY29tcGF0aWJseS4gIElmIHlvdSBuZWVkIHRvIGZpbmQgYWxsIHRoZSBmaWxlcwotaW4gYSBkaXJlY3RvcnksIHVzZSBAY29kZXtyZWFkZGlyfSBvciBzb21lIG90aGVyIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLgotVGhlc2Ugd2lsbCBiZSBzdXBwb3J0ZWQgY29tcGF0aWJseSBieSBHTlUuCi0KLUJ5IGRlZmF1bHQsIHRoZSBHTlUgc3lzdGVtIHdpbGwgcHJvdmlkZSB0aGUgc2lnbmFsIGhhbmRsaW5nIGZ1bmN0aW9ucyBvZgotQHNje0JTRH0gYW5kIG9mIEBzY3tQT1NJWH0uICBTbyBHTlUgc29mdHdhcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlCi10aGVzZS4KLQotSW4gZXJyb3IgY2hlY2tzIHRoYXQgZGV0ZWN0IGBgaW1wb3NzaWJsZScnIGNvbmRpdGlvbnMsIGp1c3QgYWJvcnQuCi1UaGVyZSBpcyB1c3VhbGx5IG5vIHBvaW50IGluIHByaW50aW5nIGFueSBtZXNzYWdlLiAgVGhlc2UgY2hlY2tzCi1pbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGJ1Z3MuICBXaG9ldmVyIHdhbnRzIHRvIGZpeCB0aGUgYnVncyB3aWxsIGhhdmUKLXRvIHJlYWQgdGhlIHNvdXJjZSBjb2RlIGFuZCBydW4gYSBkZWJ1Z2dlci4gIFNvIGV4cGxhaW4gdGhlIHByb2JsZW0gd2l0aAotY29tbWVudHMgaW4gdGhlIHNvdXJjZS4gIFRoZSByZWxldmFudCBkYXRhIHdpbGwgYmUgaW4gdmFyaWFibGVzLCB3aGljaAotYXJlIGVhc3kgdG8gZXhhbWluZSB3aXRoIHRoZSBkZWJ1Z2dlciwgc28gdGhlcmUgaXMgbm8gcG9pbnQgbW92aW5nIHRoZW0KLWVsc2V3aGVyZS4KLQotRG8gbm90IHVzZSBhIGNvdW50IG9mIGVycm9ycyBhcyB0aGUgZXhpdCBzdGF0dXMgZm9yIGEgcHJvZ3JhbS4KLUBlbXBoe1RoYXQgZG9lcyBub3Qgd29ya30sIGJlY2F1c2UgZXhpdCBzdGF0dXMgdmFsdWVzIGFyZSBsaW1pdGVkIHRvIDgKLWJpdHMgKDAgdGhyb3VnaCAyNTUpLiAgQSBzaW5nbGUgcnVuIG9mIHRoZSBwcm9ncmFtIG1pZ2h0IGhhdmUgMjU2Ci1lcnJvcnM7IGlmIHlvdSB0cnkgdG8gcmV0dXJuIDI1NiBhcyB0aGUgZXhpdCBzdGF0dXMsIHRoZSBwYXJlbnQgcHJvY2Vzcwotd2lsbCBzZWUgMCBhcyB0aGUgc3RhdHVzLCBhbmQgaXQgd2lsbCBhcHBlYXIgdGhhdCB0aGUgcHJvZ3JhbSBzdWNjZWVkZWQuCi0KLUlmIHlvdSBtYWtlIHRlbXBvcmFyeSBmaWxlcywgY2hlY2sgdGhlIEBjb2Rle1RNUERJUn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlOyBpZiB0aGF0IHZhcmlhYmxlIGlzIGRlZmluZWQsIHVzZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotaW5zdGVhZCBvZiBAZmlsZXsvdG1wfS4KLQotQG5vZGUgTGlicmFyaWVzCi1Ac2VjdGlvbiBMaWJyYXJ5IEJlaGF2aW9yCi0KLVRyeSB0byBtYWtlIGxpYnJhcnkgZnVuY3Rpb25zIHJlZW50cmFudC4gIElmIHRoZXkgbmVlZCB0byBkbyBkeW5hbWljCi1zdG9yYWdlIGFsbG9jYXRpb24sIGF0IGxlYXN0IHRyeSB0byBhdm9pZCBhbnkgbm9ucmVlbnRyYW5jeSBhc2lkZSBmcm9tCi10aGF0IG9mIEBjb2Rle21hbGxvY30gaXRzZWxmLgotCi1IZXJlIGFyZSBjZXJ0YWluIG5hbWUgY29udmVudGlvbnMgZm9yIGxpYnJhcmllcywgdG8gYXZvaWQgbmFtZQotY29uZmxpY3RzLgotCi1DaG9vc2UgYSBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBsb25nLgotQWxsIGV4dGVybmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCi1wcmVmaXguICBJbiBhZGRpdGlvbiwgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIG9mIHRoZXNlIGluIGFueSBnaXZlbgotbGlicmFyeSBtZW1iZXIuICBUaGlzIHVzdWFsbHkgbWVhbnMgcHV0dGluZyBlYWNoIG9uZSBpbiBhIHNlcGFyYXRlCi1zb3VyY2UgZmlsZS4KLQotQW4gZXhjZXB0aW9uIGNhbiBiZSBtYWRlIHdoZW4gdHdvIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFsd2F5cyB1c2VkCi10b2dldGhlciwgc28gdGhhdCBubyByZWFzb25hYmxlIHByb2dyYW0gY291bGQgdXNlIG9uZSB3aXRob3V0IHRoZQotb3RoZXI7IHRoZW4gdGhleSBjYW4gYm90aCBnbyBpbiB0aGUgc2FtZSBmaWxlLgotCi1FeHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBkb2N1bWVudGVkIGVudHJ5IHBvaW50cyBmb3IgdGhlIHVzZXIKLXNob3VsZCBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoIEBzYW1we199LiAgVGhleSBzaG91bGQgYWxzbyBjb250YWluCi10aGUgY2hvc2VuIG5hbWUgcHJlZml4IGZvciB0aGUgbGlicmFyeSwgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGgKLW90aGVyIGxpYnJhcmllcy4gIFRoZXNlIGNhbiBnbyBpbiB0aGUgc2FtZSBmaWxlcyB3aXRoIHVzZXIgZW50cnkKLXBvaW50cyBpZiB5b3UgbGlrZS4KLQotU3RhdGljIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGFzIHlvdSBsaWtlIGFuZCBuZWVkIG5vdAotZml0IGFueSBuYW1pbmcgY29udmVudGlvbi4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBGb3JtYXR0aW5nIEVycm9yIE1lc3NhZ2VzCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gY29tcGlsZXJzIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotRXJyb3IgbWVzc2FnZXMgZnJvbSBvdGhlciBub25pbnRlcmFjdGl2ZSBwcm9ncmFtcyBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OkB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBmaWxlLCBvciBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIG5vIHJlbGV2YW50IHNvdXJjZSBmaWxlLgotCi1JbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCBpcyByZWFkaW5nIGNvbW1hbmRzIGZyb20gYQotdGVybWluYWwpLCBpdCBpcyBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgdGhlIHByb2dyYW0gbmFtZSBpbiBhbiBlcnJvcgotbWVzc2FnZS4gIFRoZSBwbGFjZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9ncmFtIGlzIHJ1bm5pbmcgaXMgaW4gdGhlCi1wcm9tcHQgb3Igd2l0aCB0aGUgc2NyZWVuIGxheW91dC4gIChXaGVuIHRoZSBzYW1lIHByb2dyYW0gcnVucyB3aXRoCi1pbnB1dCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gYSB0ZXJtaW5hbCwgaXQgaXMgbm90IGludGVyYWN0aXZlIGFuZAotd291bGQgZG8gYmVzdCB0byBwcmludCBlcnJvciBtZXNzYWdlcyB1c2luZyB0aGUgbm9uaW50ZXJhY3RpdmUgc3R5bGUuKQotCi1UaGUgc3RyaW5nIEB2YXJ7bWVzc2FnZX0gc2hvdWxkIG5vdCBiZWdpbiB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgd2hlbgotaXQgZm9sbG93cyBhIHByb2dyYW0gbmFtZSBhbmQvb3IgZmlsZSBuYW1lLiAgQWxzbywgaXQgc2hvdWxkIG5vdCBlbmQKLXdpdGggYSBwZXJpb2QuCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gaW50ZXJhY3RpdmUgcHJvZ3JhbXMsIGFuZCBvdGhlciBtZXNzYWdlcyBzdWNoIGFzCi11c2FnZSBtZXNzYWdlcywgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4gIEJ1dCB0aGV5IHNob3VsZCBub3QKLWVuZCB3aXRoIGEgcGVyaW9kLgotCi1Abm9kZSBVc2VyIEludGVyZmFjZXMKLUBzZWN0aW9uIFN0YW5kYXJkcyBmb3IgQ29tbWFuZCBMaW5lIEludGVyZmFjZXMKLQotUGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIGEgdXRpbGl0eSBkZXBlbmQgb24gdGhlIG5hbWUgdXNlZAotdG8gaW52b2tlIGl0LiAgSXQgaXMgdXNlZnVsIHNvbWV0aW1lcyB0byBtYWtlIGEgbGluayB0byBhIHV0aWxpdHkKLXdpdGggYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hhdCBpdCBkb2VzLgotCi1JbnN0ZWFkLCB1c2UgYSBydW4gdGltZSBvcHRpb24gb3IgYSBjb21waWxhdGlvbiBzd2l0Y2ggb3IgYm90aAotdG8gc2VsZWN0IGFtb25nIHRoZSBhbHRlcm5hdGUgYmVoYXZpb3JzLgotCi1MaWtld2lzZSwgcGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9ncmFtIGRlcGVuZCBvbiB0aGUKLXR5cGUgb2Ygb3V0cHV0IGRldmljZSBpdCBpcyB1c2VkIHdpdGguICBEZXZpY2UgaW5kZXBlbmRlbmNlIGlzIGFuCi1pbXBvcnRhbnQgcHJpbmNpcGxlIG9mIHRoZSBzeXN0ZW0ncyBkZXNpZ247IGRvIG5vdCBjb21wcm9taXNlIGl0Ci1tZXJlbHkgdG8gc2F2ZSBzb21lb25lIGZyb20gdHlwaW5nIGFuIG9wdGlvbiBub3cgYW5kIHRoZW4uCi0KLUlmIHlvdSB0aGluayBvbmUgYmVoYXZpb3IgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIGEKLXRlcm1pbmFsLCBhbmQgYW5vdGhlciBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBvdXRwdXQgaXMgYSBmaWxlIG9yIGEKLXBpcGUsIHRoZW4gaXQgaXMgdXN1YWxseSBiZXN0IHRvIG1ha2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhlIG9uZSB0aGF0Ci1pcyB1c2VmdWwgd2l0aCBvdXRwdXQgdG8gYSB0ZXJtaW5hbCwgYW5kIGhhdmUgYW4gb3B0aW9uIGZvciB0aGUgb3RoZXIKLWJlaGF2aW9yLgotCi1Db21wYXRpYmlsaXR5IHJlcXVpcmVzIGNlcnRhaW4gcHJvZ3JhbXMgdG8gZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG91dHB1dAotZGV2aWNlLiAgSXQgd291bGQgYmUgZGlzYXN0cm91cyBpZiBAY29kZXtsc30gb3IgQGNvZGV7c2h9IGRpZCBub3QgZG8gc28KLWluIHRoZSB3YXkgYWxsIHVzZXJzIGV4cGVjdC4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN1cHBsZW1lbnQgdGhlCi1wcm9ncmFtIHdpdGggYSBwcmVmZXJyZWQgYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCi1vdXRwdXQgZGV2aWNlIHR5cGUuICBGb3IgZXhhbXBsZSwgd2UgcHJvdmlkZSBhIEBjb2Rle2Rpcn0gcHJvZ3JhbSBtdWNoCi1saWtlIEBjb2Rle2xzfSBleGNlcHQgdGhhdCBpdHMgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IGlzIGFsd2F5cwotbXVsdGktY29sdW1uIGZvcm1hdC4KLQotSXQgaXMgYSBnb29kIGlkZWEgdG8gZm9sbG93IHRoZSBAc2N7UE9TSVh9IGd1aWRlbGluZXMgZm9yIHRoZQotY29tbWFuZC1saW5lIG9wdGlvbnMgb2YgYSBwcm9ncmFtLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlCi1AY29kZXtnZXRvcHR9IHRvIHBhcnNlIHRoZW0uICBOb3RlIHRoYXQgdGhlIEdOVSB2ZXJzaW9uIG9mIEBjb2Rle2dldG9wdH0KLXdpbGwgbm9ybWFsbHkgcGVybWl0IG9wdGlvbnMgYW55d2hlcmUgYW1vbmcgdGhlIGFyZ3VtZW50cyB1bmxlc3MgdGhlCi1zcGVjaWFsIGFyZ3VtZW50IEBzYW1wey0tfSBpcyB1c2VkLiAgVGhpcyBpcyBub3Qgd2hhdCBAc2N7UE9TSVh9Ci1zcGVjaWZpZXM7IGl0IGlzIGEgR05VIGV4dGVuc2lvbi4KLQotUGxlYXNlIGRlZmluZSBsb25nLW5hbWVkIG9wdGlvbnMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byB0aGUKLXNpbmdsZS1sZXR0ZXIgVW5peC1zdHlsZSBvcHRpb25zLiAgV2UgaG9wZSB0byBtYWtlIEdOVSBtb3JlIHVzZXIKLWZyaWVuZGx5IHRoaXMgd2F5LiAgVGhpcyBpcyBlYXN5IHRvIGRvIHdpdGggdGhlIEdOVSBmdW5jdGlvbgotQGNvZGV7Z2V0b3B0X2xvbmd9LgotCi1PbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgbG9uZy1uYW1lZCBvcHRpb25zIGlzIHRoYXQgdGhleSBjYW4gYmUKLWNvbnNpc3RlbnQgZnJvbSBwcm9ncmFtIHRvIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgdXNlcnMgc2hvdWxkIGJlIGFibGUKLXRvIGV4cGVjdCB0aGUgYGB2ZXJib3NlJycgb3B0aW9uIG9mIGFueSBHTlUgcHJvZ3JhbSB3aGljaCBoYXMgb25lLCB0byBiZQotc3BlbGxlZCBwcmVjaXNlbHkgQHNhbXB7LS12ZXJib3NlfS4gIFRvIGFjaGlldmUgdGhpcyB1bmlmb3JtaXR5LCBsb29rIGF0Ci10aGUgdGFibGUgb2YgY29tbW9uIGxvbmctb3B0aW9uIG5hbWVzIHdoZW4geW91IGNob29zZSB0aGUgb3B0aW9uIG5hbWVzCi1mb3IgeW91ciBwcm9ncmFtIChAcHhyZWZ7T3B0aW9uIFRhYmxlfSkuCi0KLUl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgZm9yIGZpbGUgbmFtZXMgZ2l2ZW4gYXMgb3JkaW5hcnkgYXJndW1lbnRzIHRvCi1iZSBpbnB1dCBmaWxlcyBvbmx5OyBhbnkgb3V0cHV0IGZpbGVzIHdvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBvcHRpb25zCi0ocHJlZmVyYWJseSBAc2FtcHstb30gb3IgQHNhbXB7LS1vdXRwdXR9KS4gIEV2ZW4gaWYgeW91IGFsbG93IGFuIG91dHB1dAotZmlsZSBuYW1lIGFzIGFuIG9yZGluYXJ5IGFyZ3VtZW50IGZvciBjb21wYXRpYmlsaXR5LCB0cnkgdG8gcHJvdmlkZSBhbgotb3B0aW9uIGFzIGFub3RoZXIgd2F5IHRvIHNwZWNpZnkgaXQuICBUaGlzIHdpbGwgbGVhZCB0byBtb3JlIGNvbnNpc3RlbmN5Ci1hbW9uZyBHTlUgdXRpbGl0aWVzLCBhbmQgZmV3ZXIgaWRpb3N5bmNyYWNpZXMgZm9yIHVzZXJzIHRvIHJlbWVtYmVyLgotCi1BbGwgcHJvZ3JhbXMgc2hvdWxkIHN1cHBvcnQgdHdvIHN0YW5kYXJkIG9wdGlvbnM6IEBzYW1wey0tdmVyc2lvbn0KLWFuZCBAc2FtcHstLWhlbHB9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0tdmVyc2lvbgotVGhpcyBvcHRpb24gc2hvdWxkIGRpcmVjdCB0aGUgcHJvZ3JhbSB0byBpbmZvcm1hdGlvbiBhYm91dCBpdHMgbmFtZSwKLXZlcnNpb24sIG9yaWdpbiBhbmQgbGVnYWwgc3RhdHVzLCBhbGwgb24gc3RhbmRhcmQgb3V0cHV0LCBhbmQgdGhlbiBleGl0Ci1zdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZCBhcmd1bWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb25jZSB0aGlzCi1pcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkIG5vdCBwZXJmb3JtIGl0cyBub3JtYWwgZnVuY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGlzIG1lYW50IHRvIGJlIGVhc3kgZm9yIGEgcHJvZ3JhbSB0byBwYXJzZTsgdGhlIHZlcnNpb24KLW51bWJlciBwcm9wZXIgc3RhcnRzIGFmdGVyIHRoZSBsYXN0IHNwYWNlLiAgSW4gYWRkaXRpb24sIGl0IGNvbnRhaW5zCi10aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgcHJvZ3JhbSwgaW4gdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ncmFtJ3MgbmFtZSBzaG91bGQgYmUgYSBjb25zdGFudCBzdHJpbmc7IEBlbXBoe2Rvbid0fSBjb21wdXRlIGl0Ci1mcm9tIEBjb2Rle2FyZ3ZbMF19LiAgVGhlIGlkZWEgaXMgdG8gc3RhdGUgdGhlIHN0YW5kYXJkIG9yIGNhbm9uaWNhbAotbmFtZSBmb3IgdGhlIHByb2dyYW0sIG5vdCBpdHMgZmlsZSBuYW1lLiAgVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZmluZAotb3V0IHRoZSBwcmVjaXNlIGZpbGUgbmFtZSB3aGVyZSBhIGNvbW1hbmQgaXMgZm91bmQgaW4gQGNvZGV7UEFUSH0uCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGEgc3Vic2lkaWFyeSBwYXJ0IG9mIGEgbGFyZ2VyIHBhY2thZ2UsIG1lbnRpb24gdGhlCi1wYWNrYWdlIG5hbWUgaW4gcGFyZW50aGVzZXMsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWVtYWNzc2VydmVyIChHTlUgRW1hY3MpIDE5LjMwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JZiB0aGUgcGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzCi1wcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIsIHlvdSBjYW4gbWVudGlvbiB0aGUgcGFja2FnZSB2ZXJzaW9uIG51bWJlcgotanVzdCBiZWZvcmUgdGhlIGNsb3NlLXBhcmVudGhlc2lzLgotCi1JZiB5b3UgQHN0cm9uZ3tuZWVkfSB0byBtZW50aW9uIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgbGlicmFyaWVzIHdoaWNoCi1hcmUgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIHRoaXMgcHJvZ3JhbSwKLXlvdSBjYW4gZG8gc28gYnkgcHJpbnRpbmcgYW4gYWRkaXRpb25hbCBsaW5lIG9mIHZlcnNpb24gaW5mbyBmb3IgZWFjaAotbGlicmFyeSB5b3Ugd2FudCB0byBtZW50aW9uLiAgVXNlIHRoZSBzYW1lIGZvcm1hdCBmb3IgdGhlc2UgbGluZXMgYXMgZm9yCi10aGUgZmlyc3QgbGluZS4KLQotUGxlYXNlIGRvIG5vdCBtZW50aW9uIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgdGhlIHByb2dyYW0gdXNlcyBgYGp1c3QKLWZvciBjb21wbGV0ZW5lc3MnJy0tLXRoYXQgd291bGQgcHJvZHVjZSBhIGxvdCBvZiB1bmhlbHBmdWwgY2x1dHRlci4KLVBsZWFzZSBtZW50aW9uIGxpYnJhcnkgdmVyc2lvbiBudW1iZXJzIG9ubHkgaWYgeW91IGZpbmQgaW4gcHJhY3RpY2UgdGhhdAotdGhleSBhcmUgdmVyeSBpbXBvcnRhbnQgdG8geW91IGluIGRlYnVnZ2luZy4KLQotVGhlIGZvbGxvd2luZyBsaW5lLCBhZnRlciB0aGUgdmVyc2lvbiBudW1iZXIgbGluZSBvciBsaW5lcywgc2hvdWxkIGJlIGEKLWNvcHlyaWdodCBub3RpY2UuICBJZiBtb3JlIHRoYW4gb25lIGNvcHlyaWdodCBub3RpY2UgaXMgY2FsbGVkIGZvciwgcHV0Ci1lYWNoIG9uIGEgc2VwYXJhdGUgbGluZS4KLQotTmV4dCBzaG91bGQgZm9sbG93IGEgYnJpZWYgc3RhdGVtZW50IHRoYXQgdGhlIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwKLWFuZCB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIGNvcHkgYW5kIGNoYW5nZSBpdCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuICBJZgotdGhlIHByb2dyYW0gaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCwgc2F5IHNvIGhlcmUuICBBbHNvIG1lbnRpb24gdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4KLQotSXQgaXMgb2sgdG8gZmluaXNoIHRoZSBvdXRwdXQgd2l0aCBhIGxpc3Qgb2YgdGhlIG1ham9yIGF1dGhvcnMgb2YgdGhlCi1wcm9ncmFtLCBhcyBhIHdheSBvZiBnaXZpbmcgY3JlZGl0LgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBvdXRwdXQgdGhhdCBmb2xsb3dzIHRoZXNlIHJ1bGVzOgotCi1Ac21hbGxleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzQuNQotQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotR05VIEVtYWNzIGNvbWVzIHdpdGggTk8gV0FSUkFOVFksCi10byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCi1Zb3UgbWF5IHJlZGlzdHJpYnV0ZSBjb3BpZXMgb2YgR05VIEVtYWNzCi11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWF0dGVycywKLXNlZSB0aGUgZmlsZXMgbmFtZWQgQ09QWUlORy4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBzaG91bGQgYWRhcHQgdGhpcyB0byB5b3VyIHByb2dyYW0sIG9mIGNvdXJzZSwgZmlsbGluZyBpbiB0aGUgcHJvcGVyCi15ZWFyLCBjb3B5cmlnaHQgaG9sZGVyLCBuYW1lIG9mIHByb2dyYW0sIGFuZCB0aGUgcmVmZXJlbmNlcyB0bwotZGlzdHJpYnV0aW9uIHRlcm1zLCBhbmQgY2hhbmdpbmcgdGhlIHJlc3Qgb2YgdGhlIHdvcmRpbmcgYXMgbmVjZXNzYXJ5LgotCi1UaGlzIGNvcHlyaWdodCBub3RpY2Ugb25seSBuZWVkcyB0byBtZW50aW9uIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGluCi13aGljaCBjaGFuZ2VzIHdlcmUgbWFkZS0tLXRoZXJlJ3Mgbm8gbmVlZCB0byBsaXN0IHRoZSB5ZWFycyBmb3IgcHJldmlvdXMKLXZlcnNpb25zJyBjaGFuZ2VzLiAgWW91IGRvbid0IGhhdmUgdG8gbWVudGlvbiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbgotdGhlc2Ugbm90aWNlcywgaWYgdGhhdCBpcyBpbmNvbnZlbmllbnQsIHNpbmNlIGl0IGFwcGVhcmVkIGluIHRoZSBmaXJzdAotbGluZS4KLQotQGl0ZW0gLS1oZWxwCi1UaGlzIG9wdGlvbiBzaG91bGQgb3V0cHV0IGJyaWVmIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBpbnZva2UgdGhlCi1wcm9ncmFtLCBvbiBzdGFuZGFyZCBvdXRwdXQsIHRoZW4gZXhpdCBzdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZAotYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcyBpcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkCi1ub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgotCi1OZWFyIHRoZSBlbmQgb2YgdGhlIEBzYW1wey0taGVscH0gb3B0aW9uJ3Mgb3V0cHV0IHRoZXJlIHNob3VsZCBiZSBhIGxpbmUKLXRoYXQgc2F5cyB3aGVyZSB0byBtYWlsIGJ1ZyByZXBvcnRzLiAgSXQgc2hvdWxkIGhhdmUgdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1SZXBvcnQgYnVncyB0byBAdmFye21haWxpbmctYWRkcmVzc30uCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgT3B0aW9uIFRhYmxlCi1Ac2VjdGlvbiBUYWJsZSBvZiBMb25nIE9wdGlvbnMKLQotSGVyZSBpcyBhIHRhYmxlIG9mIGxvbmcgb3B0aW9ucyB1c2VkIGJ5IEdOVSBwcm9ncmFtcy4gIEl0IGlzIHN1cmVseQotaW5jb21wbGV0ZSwgYnV0IHdlIGFpbSB0byBsaXN0IGFsbCB0aGUgb3B0aW9ucyB0aGF0IGEgbmV3IHByb2dyYW0gbWlnaHQKLXdhbnQgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYgeW91IHVzZSBuYW1lcyBub3QgYWxyZWFkeSBpbiB0aGUgdGFibGUsCi1wbGVhc2Ugc2VuZCBAZW1haWx7Z251QEBnbnUub3JnfSBhIGxpc3Qgb2YgdGhlbSwgd2l0aCB0aGVpcgotbWVhbmluZ3MsIHNvIHdlIGNhbiB1cGRhdGUgdGhlIHRhYmxlLgotCi1AYyBQbGVhc2UgbGVhdmUgbmV3bGluZXMgYmV0d2VlbiBpdGVtcyBpbiB0aGlzIHRhYmxlOyBpdCdzIG11Y2ggZWFzaWVyCi1AYyB0byB1cGRhdGUgd2hlbiBpdCBpc24ndCBjb21wbGV0ZWx5IHNxdWFzaGVkIHRvZ2V0aGVyIGFuZCB1bnJlYWRhYmxlLgotQGMgV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNob3J0IG9wdGlvbiBmb3IgYSBsb25nIG9wdGlvbiBuYW1lLCBwdXQKLUBjIGEgc2VtaWNvbG9uIGJldHdlZW4gdGhlIGxpc3RzIG9mIHRoZSBwcm9ncmFtcyB0aGF0IHVzZSB0aGVtLCBub3QgYQotQGMgcGVyaW9kLiAgIC0tZnJpZWRtYW4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBhZnRlci1kYXRlCi1Ac2FtcHstTn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYWxsCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZHV9LCBAY29kZXtsc30sIEBjb2Rle25tfSwgQGNvZGV7c3R0eX0sIEBjb2Rle3VuYW1lfSwKLWFuZCBAY29kZXt1bmV4cGFuZH0uCi0KLUBpdGVtIGFsbC10ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGFsbW9zdC1hbGwKLUBzYW1wey1BfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGFwcGVuZAotQHNhbXB7LWF9IGluIEBjb2Rle2V0YWdzfSwgQGNvZGV7dGVlfSwgQGNvZGV7dGltZX07Ci1Ac2FtcHstcn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYXJjaGl2ZQotQHNhbXB7LWF9IGluIEBjb2Rle2NwfS4KLQotQGl0ZW0gYXJjaGl2ZS1uYW1lCi1Ac2FtcHstbn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGFyZ2xlbmd0aAotQHNhbXB7LWx9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gYXNjaWkKLUBzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYXNzaWduCi1Ac2FtcHstdn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGFzc3VtZS1uZXcKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSBhc3N1bWUtb2xkCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gYXV0by1jaGVjawotQHNhbXB7LWF9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGF1dG8tcGFnZXIKLUBzYW1wey1hfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGF1dG8tcmVmZXJlbmNlCi1Ac2FtcHstQX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gYXZvaWQtd3JhcHMKLUBzYW1wey1ufSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGJhY2t3YXJkLXNlYXJjaAotQHNhbXB7LUJ9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gYmFzZW5hbWUKLUBzYW1wey1mfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gYmF0Y2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBiYXVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gYmVmb3JlCi1Ac2FtcHstYn0gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gYmluYXJ5Ci1Ac2FtcHstYn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBiaXRzLXBlci1jb2RlCi1Ac2FtcHstYn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGJsb2NrLXNpemUKLVVzZWQgaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGJsb2NrcwotQHNhbXB7LWJ9IGluIEBjb2Rle2hlYWR9IGFuZCBAY29kZXt0YWlsfS4KLQotQGl0ZW0gYnJlYWstZmlsZQotQHNhbXB7LWJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGJyaWVmCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gbWFrZSBvdXRwdXQgc2hvcnRlci4KLQotQGl0ZW0gYnl0ZXMKLUBzYW1wey1jfSBpbiBAY29kZXtoZWFkfSwgQGNvZGV7c3BsaXR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGNAdHsrK30KLUBzYW1wey1DfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGNhdGVuYXRlCi1Ac2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY2QKLVVzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gdXNlLgotCi1AaXRlbSBjaGFuZ2VzCi1Ac2FtcHstY30gaW4gQGNvZGV7Y2hncnB9IGFuZCBAY29kZXtjaG93bn0uCi0KLUBpdGVtIGNsYXNzaWZ5Ci1Ac2FtcHstRn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBjb2xvbnMKLUBzYW1wey1jfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBjb21tYW5kCi1Ac2FtcHstY30gaW4gQGNvZGV7c3V9OwotQHNhbXB7LXh9IGluIEdEQi4KLQotQGl0ZW0gY29tcGFyZQotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNvbXBhdAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29tcHJlc3MKLUBzYW1wey1afSBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY29uY2F0ZW5hdGUKLUBzYW1wey1BfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb25maXJtYXRpb24KLUBzYW1wey13fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb250ZXh0Ci1Vc2VkIGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBjb3B5bGVmdAotQHNhbXB7LVcgY29weWxlZnR9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBjb3B5cmlnaHQKLUBzYW1wey1DfSBpbiBAY29kZXtwdHh9LCBAY29kZXtyZWNvZGV9LCBhbmQgQGNvZGV7d2RpZmZ9OwotQHNhbXB7LVcgY29weXJpZ2h0fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29yZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGNvdW50Ci1Ac2FtcHstcX0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gY291bnQtbGlua3MKLUBzYW1wey1sfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIGNyZWF0ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcGlvfS4KLQotQGl0ZW0gY3V0LW1hcmsKLUBzYW1wey1jfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY3hyZWYKLUBzYW1wey14fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGRhdGUKLUBzYW1wey1kfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIGRlYnVnCi1Ac2FtcHstZH0gaW4gTWFrZSBhbmQgQGNvZGV7bTR9OwotQHNhbXB7LXR9IGluIEJpc29uLgotCi1AaXRlbSBkZWZpbmUKLUBzYW1wey1EfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGRlZmluZXMKLUBzYW1wey1kfSBpbiBCaXNvbiBhbmQgQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBkZWxldGUKLUBzYW1wey1EfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBkZXJlZmVyZW5jZQotQHNhbXB7LUx9IGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcGlvfSwgQGNvZGV7ZHV9LAotQGNvZGV7bHN9LCBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGVyZWZlcmVuY2UtYXJncwotQHNhbXB7LUR9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gZGlhY3JpdGljcwotQHNhbXB7LWR9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGRpY3Rpb25hcnktb3JkZXIKLUBzYW1wey1kfSBpbiBAY29kZXtsb29rfS4KLQotQGl0ZW0gZGlmZgotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRpZ2l0cwotQHNhbXB7LW59IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGRpcmVjdG9yeQotU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZSwgaW4gdmFyaW91cyBwcm9ncmFtcy4gIEluIEBjb2Rle2xzfSwgaXQKLW1lYW5zIHRvIHNob3cgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGVpciBjb250ZW50cy4gIEluCi1AY29kZXtybX0gYW5kIEBjb2Rle2xufSwgaXQgbWVhbnMgdG8gbm90IHRyZWF0IGxpbmtzIHRvIGRpcmVjdG9yaWVzCi1zcGVjaWFsbHkuCi0KLUBpdGVtIGRpc2NhcmQtYWxsCi1Ac2FtcHsteH0gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBkaXNjYXJkLWxvY2FscwotQHNhbXB7LVh9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gZHJ5LXJ1bgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIGVkCi1Ac2FtcHstZX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVsaWRlLWVtcHR5LWZpbGVzCi1Ac2FtcHsten0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gZW5kLWRlbGV0ZQotQHNhbXB7LXh9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW5kLWluc2VydAotQHNhbXB7LXp9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW50aXJlLW5ldy1maWxlCi1Ac2FtcHstTn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVudmlyb25tZW50LW92ZXJyaWRlcwotQHNhbXB7LWV9IGluIE1ha2UuCi0KLUBpdGVtIGVvZgotQHNhbXB7LWV9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXBvY2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBlcnJvci1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGVycm9yLW91dHB1dAotQHNhbXB7LW99IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZXNjYXBlCi1Ac2FtcHstYn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBleGNsdWRlLWZyb20KLUBzYW1wey1YfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBleGVjCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZXhpdAotQHNhbXB7LXh9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXhpdC0wCi1Ac2FtcHstZX0gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gZXhwYW5kLXRhYnMKLUBzYW1wey10fSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gZXhwcmVzc2lvbgotQHNhbXB7LWV9IGluIEBjb2Rle3NlZH0uCi0KLUBpdGVtIGV4dGVybi1vbmx5Ci1Ac2FtcHstZ30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBleHRyYWN0Ci1Ac2FtcHstaX0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZmFjZXMKLUBzYW1wey1mfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBmYXN0Ci1Ac2FtcHstZn0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBmYXRhbC13YXJuaW5ncwotQHNhbXB7LUV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZmlsZQotQHNhbXB7LWZ9IGluIEBjb2Rle2luZm99LCBAY29kZXtnYXdrfSwgTWFrZSwgQGNvZGV7bXR9LCBhbmQgQGNvZGV7dGFyfTsKLUBzYW1wey1ufSBpbiBAY29kZXtzZWR9OwotQHNhbXB7LXJ9IGluIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gZmllbGQtc2VwYXJhdG9yCi1Ac2FtcHstRn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGZpbGUtcHJlZml4Ci1Ac2FtcHstYn0gaW4gQmlzb24uCi0KLUBpdGVtIGZpbGUtdHlwZQotQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gZmlsZXMtZnJvbQotQHNhbXB7LVR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGZpbGwtY29sdW1uCi1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gZmxhZy10cnVuY2F0aW9uCi1Ac2FtcHstRn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZml4ZWQtb3V0cHV0LWZpbGVzCi1Ac2FtcHsteX0gaW4gQmlzb24uCi0KLUBpdGVtIGZvbGxvdwotQHNhbXB7LWZ9IGluIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBmb290bm90ZS1zdHlsZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGZvcmNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fSwgYW5kIEBjb2Rle3JtfS4KLQotQGl0ZW0gZm9yY2UtcHJlZml4Ci1Ac2FtcHstRn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGZvcm1hdAotVXNlZCBpbiBAY29kZXtsc30sIEBjb2Rle3RpbWV9LCBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gZnJlZXplLXN0YXRlCi1Ac2FtcHstRn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBmdWxsbmFtZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGdhcC1zaXplCi1Ac2FtcHstZ30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZ2V0Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZ3JhcGhpYwotQHNhbXB7LWl9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gZ3JhcGhpY3MKLUBzYW1wey1nfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBncm91cAotQHNhbXB7LWd9IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBnemlwCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGhhc2hzaXplCi1Ac2FtcHstSH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBoZWFkZXIKLUBzYW1wey1ofSBpbiBAY29kZXtvYmpkdW1wfSBhbmQgQGNvZGV7cmVjb2RlfQotCi1AaXRlbSBoZWFkaW5nCi1Ac2FtcHstSH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gaGVscAotVXNlZCB0byBhc2sgZm9yIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uLgotCi1AaXRlbSBoZXJlLWRlbGltaXRlcgotQHNhbXB7LWR9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBoaWRlLWNvbnRyb2wtY2hhcnMKLUBzYW1wey1xfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGlkbGUKLUBzYW1wey11fSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBpZmRlZgotQHNhbXB7LUR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUKLUBzYW1wey1JfSBpbiBAY29kZXtsc307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gaWdub3JlLWFsbC1zcGFjZQotQHNhbXB7LXd9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtYmFja3VwcwotQHNhbXB7LUJ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaWdub3JlLWJsYW5rLWxpbmVzCi1Ac2FtcHstQn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1jYXNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7bG9va30gYW5kIEBjb2Rle3B0eH07Ci1Ac2FtcHstaX0gaW4gQGNvZGV7ZGlmZn0gYW5kIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWVycm9ycwotQHNhbXB7LWl9IGluIE1ha2UuCi0KLUBpdGVtIGlnbm9yZS1maWxlCi1Ac2FtcHstaX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gaWdub3JlLWluZGVudGF0aW9uCi1Ac2FtcHstSX0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBpZ25vcmUtaW5pdC1maWxlCi1Ac2FtcHstZn0gaW4gT2xlby4KLQotQGl0ZW0gaWdub3JlLWludGVycnVwdHMKLUBzYW1wey1pfSBpbiBAY29kZXt0ZWV9LgotCi1AaXRlbSBpZ25vcmUtbWF0Y2hpbmctbGluZXMKLUBzYW1wey1JfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLXNwYWNlLWNoYW5nZQotQHNhbXB7LWJ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtemVyb3MKLUBzYW1wey1pfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbmNsdWRlCi1Ac2FtcHstaX0gaW4gQGNvZGV7ZXRhZ3N9OwotQHNhbXB7LUl9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gaW5jbHVkZS1kaXIKLUBzYW1wey1JfSBpbiBNYWtlLgotCi1AaXRlbSBpbmNyZW1lbnRhbAotQHNhbXB7LUd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGluZm8KLUBzYW1wey1pfSwgQHNhbXB7LWx9LCBhbmQgQHNhbXB7LW19IGluIEZpbmdlci4KLQotQGl0ZW0gaW5pdGlhbAotQHNhbXB7LWl9IGluIEBjb2Rle2V4cGFuZH0uCi0KLUBpdGVtIGluaXRpYWwtdGFiCi1Ac2FtcHstVH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlub2RlCi1Ac2FtcHstaX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpbnRlcmFjdGl2ZQotQHNhbXB7LWl9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIEBjb2Rle3JtfTsKLUBzYW1wey1lfSBpbiBAY29kZXttNH07Ci1Ac2FtcHstcH0gaW4gQGNvZGV7eGFyZ3N9OwotQHNhbXB7LXd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGludGVybWl4LXR5cGUKLUBzYW1wey1wfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gam9icwotQHNhbXB7LWp9IGluIE1ha2UuCi0KLUBpdGVtIGp1c3QtcHJpbnQKLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSBrZWVwLWdvaW5nCi1Ac2FtcHsta30gaW4gTWFrZS4KLQotQGl0ZW0ga2VlcC1maWxlcwotQHNhbXB7LWt9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGtpbG9ieXRlcwotQHNhbXB7LWt9IGluIEBjb2Rle2R1fSBhbmQgQGNvZGV7bHN9LgotCi1AaXRlbSBsYW5ndWFnZQotQHNhbXB7LWx9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbGVzcy1tb2RlCi1Ac2FtcHstbH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBsZXZlbC1mb3ItZ3ppcAotQHNhbXB7LWd9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBsaW5lLWJ5dGVzCi1Ac2FtcHstQ30gaW4gQGNvZGV7c3BsaXR9LgotCi1AaXRlbSBsaW5lcwotVXNlZCBpbiBAY29kZXtzcGxpdH0sIEBjb2Rle2hlYWR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGxpbmsKLUBzYW1wey1sfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbGludAotQGl0ZW14IGxpbnQtb2xkCi1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBsaXN0Ci1Ac2FtcHstdH0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHstbH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gbGlzdAotQHNhbXB7LXR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGxpdGVyYWwKLUBzYW1wey1OfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGxvYWQtYXZlcmFnZQotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIGxvZ2luCi1Vc2VkIGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gbWFjaGluZQotTm8gbGlzdGluZyBvZiB3aGljaCBwcm9ncmFtcyBhbHJlYWR5IHVzZSB0aGlzOwotc29tZW9uZSBzaG91bGQgY2hlY2sgdG8KLXNlZSBpZiBhbnkgYWN0dWFsbHkgZG8sIGFuZCB0ZWxsIEBlbWFpbHtnbnVAQGdudS5vcmd9LgotCi1AaXRlbSBtYWNyby1uYW1lCi1Ac2FtcHstTX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gbWFpbAotQHNhbXB7LW19IGluIEBjb2Rle2hlbGxvfSBhbmQgQGNvZGV7dW5hbWV9LgotCi1AaXRlbSBtYWtlLWRpcmVjdG9yaWVzCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIG1ha2VmaWxlCi1Ac2FtcHstZn0gaW4gTWFrZS4KLQotQGl0ZW0gbWFwcGVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gbWF4LWFyZ3MKLUBzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1jaGFycwotQHNhbXB7LW59IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWxpbmVzCi1Ac2FtcHstbH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtbG9hZAotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIG1heC1wcm9jcwotQHNhbXB7LVB9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWVzZwotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIG1lc3NhZ2UKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBtaW5pbWFsCi1Ac2FtcHstZH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIG1peGVkLXV1ZW5jb2RlCi1Ac2FtcHstTX0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG1vZGUKLUBzYW1wey1tfSBpbiBAY29kZXtpbnN0YWxsfSwgQGNvZGV7bWtkaXJ9LCBhbmQgQGNvZGV7bWtmaWZvfS4KLQotQGl0ZW0gbW9kaWZpY2F0aW9uLXRpbWUKLUBzYW1wey1tfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBtdWx0aS12b2x1bWUKLUBzYW1wey1NfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBuYW1lLXByZWZpeAotQHNhbXB7LWF9IGluIEJpc29uLgotCi1AaXRlbSBuZXN0aW5nLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBuZXQtaGVhZGVycwotQHNhbXB7LWF9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuZXctZmlsZQotQHNhbXB7LVd9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWJ1aWx0aW4tcnVsZXMKLUBzYW1wey1yfSBpbiBNYWtlLgotCi1AaXRlbSBuby1jaGFyYWN0ZXItY291bnQKLUBzYW1wey13fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY2hlY2stZXhpc3RpbmcKLUBzYW1wey14fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY29tbW9uCi1Ac2FtcHstM30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1jcmVhdGUKLUBzYW1wey1jfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIG5vLWRlZmluZXMKLUBzYW1wey1EfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIG5vLWRlbGV0ZWQKLUBzYW1wey0xfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWRlcmVmZXJlbmNlCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3B9LgotCi1AaXRlbSBuby1pbnNlcnRlZAotQHNhbXB7LTJ9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8ta2VlcC1nb2luZwotQHNhbXB7LVN9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWxpbmVzCi1Ac2FtcHstbH0gaW4gQmlzb24uCi0KLUBpdGVtIG5vLXBpcGluZwotQHNhbXB7LVB9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby1wcm9mCi1Ac2FtcHstZX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby1yZWdleAotQHNhbXB7LVJ9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbm8tc29ydAotQHNhbXB7LXB9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbm8tc3BsaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBuby1zdGF0aWMKLUBzYW1wey1hfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWUKLUBzYW1wey1FfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWVzdGFtcAotQHNhbXB7LW19IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby12YWxpZGF0ZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIG5vLXdhaXQKLVVzZWQgaW4gQGNvZGV7ZW1hY3NjbGllbnR9LgotCi1AaXRlbSBuby13YXJuCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gaW5oaWJpdCB3YXJuaW5ncy4KLQotQGl0ZW0gbm9kZQotQHNhbXB7LW59IGluIEBjb2Rle2luZm99LgotCi1AaXRlbSBub2RlbmFtZQotQHNhbXB7LW59IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gbm9ubWF0Y2hpbmcKLUBzYW1wey1mfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbnN0dWZmCi1Ac2FtcHstbn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIG51bGwKLUBzYW1wey0wfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG51bWJlcgotQHNhbXB7LW59IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWJlci1ub25ibGFuawotQHNhbXB7LWJ9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWVyaWMtc29ydAotQHNhbXB7LW59IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbnVtZXJpYy11aWQtZ2lkCi1Ac2FtcHstbn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2xzfS4KLQotQGl0ZW0gbngKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBvbGQtYXJjaGl2ZQotQHNhbXB7LW99IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIG9sZC1maWxlCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gb25lLWZpbGUtc3lzdGVtCi1Ac2FtcHstbH0gaW4gQGNvZGV7dGFyfSwgQGNvZGV7Y3B9LCBhbmQgQGNvZGV7ZHV9LgotCi1AaXRlbSBvbmx5LWZpbGUKLUBzYW1wey1vfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBvbmx5LXByb2YKLUBzYW1wey1mfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG9ubHktdGltZQotQHNhbXB7LUZ9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gb3V0cHV0Ci1JbiB2YXJpb3VzIHByb2dyYW1zLCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgotCi1AaXRlbSBvdXRwdXQtcHJlZml4Ci1Ac2FtcHstb30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG92ZXJyaWRlCi1Ac2FtcHstb30gaW4gQGNvZGV7cm19LgotCi1AaXRlbSBvdmVyd3JpdGUKLUBzYW1wey1jfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBvd25lcgotQHNhbXB7LW99IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBwYWdpbmF0ZQotQHNhbXB7LWx9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBwYXJhZ3JhcGgtaW5kZW50Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gcGFyZW50cwotQHNhbXB7LXB9IGluIEBjb2Rle21rZGlyfSBhbmQgQGNvZGV7cm1kaXJ9LgotCi1AaXRlbSBwYXNzLWFsbAotQHNhbXB7LXB9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gcGFzcy10aHJvdWdoCi1Ac2FtcHstcH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHBvcnQKLUBzYW1wey1QfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBwb3J0YWJpbGl0eQotQHNhbXB7LWN9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBwb3NpeAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcHJlZml4LWJ1aWx0aW5zCi1Ac2FtcHstUH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBwcmVmaXgKLUBzYW1wey1mfSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBwcmVzZXJ2ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcH0uCi0KLUBpdGVtIHByZXNlcnZlLWVudmlyb25tZW50Ci1Ac2FtcHstcH0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBwcmVzZXJ2ZS1tb2RpZmljYXRpb24tdGltZQotQHNhbXB7LW19IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBwcmVzZXJ2ZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHByZXNlcnZlLXBlcm1pc3Npb25zCi1Ac2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcHJpbnQKLUBzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcHJpbnQtY2hhcnMKLUBzYW1wey1MfSBpbiBAY29kZXtjbXB9LgotCi1AaXRlbSBwcmludC1kYXRhLWJhc2UKLUBzYW1wey1wfSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1kaXJlY3RvcnkKLUBzYW1wey13fSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1maWxlLW5hbWUKLUBzYW1wey1vfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50LXN5bWRlZnMKLUBzYW1wey1zfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50ZXIKLUBzYW1wey1wfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHByb21wdAotQHNhbXB7LXB9IGluIEBjb2Rle2VkfS4KLQotQGl0ZW0gcXVlcnktdXNlcgotQHNhbXB7LVh9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBxdWVzdGlvbgotQHNhbXB7LXF9IGluIE1ha2UuCi0KLUBpdGVtIHF1aWV0Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LiAgQHN0cm9uZ3tOb3RlOn0gZXZlcnkKLXByb2dyYW0gYWNjZXB0aW5nIEBzYW1wey0tcXVpZXR9IHNob3VsZCBhY2NlcHQgQHNhbXB7LS1zaWxlbnR9IGFzIGEKLXN5bm9ueW0uCi0KLUBpdGVtIHF1aWV0LXVuc2hhcgotQHNhbXB7LVF9IGluIEBjb2Rle3NoYXJ9Ci0KLUBpdGVtIHF1b3RlLW5hbWUKLUBzYW1wey1RfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHJjcwotQHNhbXB7LW59IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByZS1pbnRlcnZhbAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcmVhZC1mdWxsLWJsb2NrcwotQHNhbXB7LUJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHJlYWRub3cKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSByZWNvbgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIHJlY29yZC1udW1iZXIKLUBzYW1wey1SfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSByZWN1cnNpdmUKLVVzZWQgaW4gQGNvZGV7Y2hncnB9LCBAY29kZXtjaG93bn0sIEBjb2Rle2NwfSwgQGNvZGV7bHN9LCBAY29kZXtkaWZmfSwKLWFuZCBAY29kZXtybX0uCi0KLUBpdGVtIHJlZmVyZW5jZS1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIHJlZmVyZW5jZXMKLUBzYW1wey1yfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSByZWdleAotQHNhbXB7LXJ9IGluIEBjb2Rle3RhY30gYW5kIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gcmVsZWFzZQotQHNhbXB7LXJ9IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gcmVsb2FkLXN0YXRlCi1Ac2FtcHstUn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSByZWxvY2F0aW9uCi1Ac2FtcHstcn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIHJlbmFtZQotQHNhbXB7LXJ9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSByZXBsYWNlCi1Ac2FtcHstaX0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSByZXBvcnQtaWRlbnRpY2FsLWZpbGVzCi1Ac2FtcHstc30gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJlc2V0LWFjY2Vzcy10aW1lCi1Ac2FtcHstYX0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHJldmVyc2UKLUBzYW1wey1yfSBpbiBAY29kZXtsc30gYW5kIEBjb2Rle25tfS4KLQotQGl0ZW0gcmV2ZXJzZWQtZWQKLUBzYW1wey1mfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmlnaHQtc2lkZS1kZWZzCi1Ac2FtcHstUn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2FtZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNhbWUtcGVybWlzc2lvbnMKLUBzYW1wey1wfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzYXZlCi1Ac2FtcHstZ30gaW4gQGNvZGV7c3R0eX0uCi0KLUBpdGVtIHNlCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gc2VudGVuY2UtcmVnZXhwCi1Ac2FtcHstU30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2VwYXJhdGUtZGlycwotQHNhbXB7LVN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc2VwYXJhdG9yCi1Ac2FtcHstc30gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gc2VxdWVuY2UKLVVzZWQgYnkgQGNvZGV7cmVjb2RlfSB0byBjaG9zZSBmaWxlcyBvciBwaXBlcyBmb3Igc2VxdWVuY2luZyBwYXNzZXMuCi0KLUBpdGVtIHNoZWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBzaG93LWFsbAotQHNhbXB7LUF9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNob3ctYy1mdW5jdGlvbgotQHNhbXB7LXB9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBzaG93LWVuZHMKLUBzYW1wey1FfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaG93LWZ1bmN0aW9uLWxpbmUKLUBzYW1wey1GfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc2hvdy10YWJzCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2lsZW50Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LgotQHN0cm9uZ3tOb3RlOn0gZXZlcnkgcHJvZ3JhbSBhY2NlcHRpbmcKLUBzYW1wey0tc2lsZW50fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tcXVpZXR9IGFzIGEgc3lub255bS4KLQotQGl0ZW0gc2l6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gc29ydAotVXNlZCBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHNvdXJjZQotQHNhbXB7LVcgc291cmNlfSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gc3BhcnNlCi1Ac2FtcHstU30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc3BlZWQtbGFyZ2UtZmlsZXMKLUBzYW1wey1IfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc3BsaXQtYXQKLUBzYW1wey1FfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBzcGxpdC1zaXplLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHNxdWVlemUtYmxhbmsKLUBzYW1wey1zfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzdGFydC1kZWxldGUKLUBzYW1wey13fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0YXJ0LWluc2VydAotQHNhbXB7LXl9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gc3RhcnRpbmctZmlsZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtkaWZmfSB0byBzcGVjaWZ5IHdoaWNoIGZpbGUgd2l0aGluCi1hIGRpcmVjdG9yeSB0byBzdGFydCBwcm9jZXNzaW5nIHdpdGguCi0KLUBpdGVtIHN0YXRpc3RpY3MKLUBzYW1wey1zfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0ZGluLWZpbGUtbGlzdAotQHNhbXB7LVN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzdG9wCi1Ac2FtcHstU30gaW4gTWFrZS4KLQotQGl0ZW0gc3RyaWN0Ci1Ac2FtcHstc30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gc3RyaXAKLUBzYW1wey1zfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gc3RyaXAtYWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBzdHJpcC1kZWJ1ZwotQHNhbXB7LVN9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gc3VibWl0dGVyCi1Ac2FtcHstc30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHN1ZmZpeAotQHNhbXB7LVN9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0uCi0KLUBpdGVtIHN1ZmZpeC1mb3JtYXQKLUBzYW1wey1ifSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBzdW0KLUBzYW1wey1zfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIHN1bW1hcml6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc3ltYm9saWMKLUBzYW1wey1zfSBpbiBAY29kZXtsbn0uCi0KLUBpdGVtIHN5bWJvbHMKLVVzZWQgaW4gR0RCIGFuZCBAY29kZXtvYmpkdW1wfS4KLQotQGl0ZW0gc3luY2xpbmVzCi1Ac2FtcHstc30gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBzeXNuYW1lCi1Ac2FtcHstc30gaW4gQGNvZGV7dW5hbWV9LgotCi1AaXRlbSB0YWJzCi1Ac2FtcHstdH0gaW4gQGNvZGV7ZXhwYW5kfSBhbmQgQGNvZGV7dW5leHBhbmR9LgotCi1AaXRlbSB0YWJzaXplCi1Ac2FtcHstVH0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSB0ZXJtaW5hbAotQHNhbXB7LVR9IGluIEBjb2Rle3RwdXR9IGFuZCBAY29kZXt1bH0uCi1Ac2FtcHstdH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSB0ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHRleHQtZmlsZXMKLUBzYW1wey1UfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gdGltZQotVXNlZCBpbiBAY29kZXtsc30gYW5kIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gdG8tc3Rkb3V0Ci1Ac2FtcHstT30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdG90YWwKLUBzYW1wey1jfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHRvdWNoCi1Ac2FtcHstdH0gaW4gTWFrZSwgQGNvZGV7cmFubGlifSwgYW5kIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIHRyYWNlCi1Ac2FtcHstdH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSB0cmFkaXRpb25hbAotQHNhbXB7LXR9IGluIEBjb2Rle2hlbGxvfTsKLUBzYW1wey1XIHRyYWRpdGlvbmFsfSBpbiBAY29kZXtnYXdrfTsKLUBzYW1wey1HfSBpbiBAY29kZXtlZH0sIEBjb2Rle200fSwgYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHR0eQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHR5cGVkZWZzCi1Ac2FtcHstdH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlZGVmcy1hbmQtYysrCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlc2V0LW1vZGUKLUBzYW1wey10fSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSB1bmNvbXByZXNzCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdW5jb25kaXRpb25hbAotQHNhbXB7LXV9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSB1bmRlZmluZQotQHNhbXB7LVV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gdW5kZWZpbmVkLW9ubHkKLUBzYW1wey11fSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHVwZGF0ZQotQHNhbXB7LXV9IGluIEBjb2Rle2NwfSwgQGNvZGV7Y3RhZ3N9LCBAY29kZXttdn0sIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHVzYWdlCi1Vc2VkIGluIEBjb2Rle2dhd2t9OyBzYW1lIGFzIEBzYW1wey0taGVscH0uCi0KLUBpdGVtIHV1ZW5jb2RlCi1Ac2FtcHstQn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZhbmlsbGEtb3BlcmF0aW9uCi1Ac2FtcHstVn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZlcmJvc2UKLVByaW50IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHJvZ3Jlc3MuICBNYW55IHByb2dyYW1zIHN1cHBvcnQgdGhpcy4KLQotQGl0ZW0gdmVyaWZ5Ci1Ac2FtcHstV30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLgotCi1AaXRlbSB2ZXJzaW9uLWNvbnRyb2wKLUBzYW1wey1WfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgotCi1AaXRlbSB2Z3JpbmQKLUBzYW1wey12fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIHZvbHVtZQotQHNhbXB7LVZ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHdoYXQtaWYKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSB3aG9sZS1zaXplLWxpbWl0Ci1Ac2FtcHstbH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHdpZHRoCi1Ac2FtcHstd30gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSB3b3JkLXJlZ2V4cAotQHNhbXB7LVd9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHdyaXRhYmxlCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gemVyb3MKLUBzYW1wey16fSBpbiBAY29kZXtncHJvZn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1lbW9yeSBVc2FnZQotQHNlY3Rpb24gTWVtb3J5IFVzYWdlCi0KLUlmIGl0IHR5cGljYWxseSB1c2VzIGp1c3QgYSBmZXcgbWVnIG9mIG1lbW9yeSwgZG9uJ3QgYm90aGVyIG1ha2luZyBhbnkKLWVmZm9ydCB0byByZWR1Y2UgbWVtb3J5IHVzYWdlLiAgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGltcHJhY3RpY2FsIGZvcgotb3RoZXIgcmVhc29ucyB0byBvcGVyYXRlIG9uIGZpbGVzIG1vcmUgdGhhbiBhIGZldyBtZWcgbG9uZywgaXQgaXMKLXJlYXNvbmFibGUgdG8gcmVhZCBlbnRpcmUgaW5wdXQgZmlsZXMgaW50byBjb3JlIHRvIG9wZXJhdGUgb24gdGhlbS4KLQotSG93ZXZlciwgZm9yIHByb2dyYW1zIHN1Y2ggYXMgQGNvZGV7Y2F0fSBvciBAY29kZXt0YWlsfSwgdGhhdCBjYW4KLXVzZWZ1bGx5IG9wZXJhdGUgb24gdmVyeSBsYXJnZSBmaWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHVzaW5nIGEKLXRlY2huaXF1ZSB0aGF0IHdvdWxkIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiBmaWxlcyBpdCBjYW4gaGFuZGxlLgotSWYgYSBwcm9ncmFtIHdvcmtzIGJ5IGxpbmVzIGFuZCBjb3VsZCBiZSBhcHBsaWVkIHRvIGFyYml0cmFyeQotdXNlci1zdXBwbGllZCBpbnB1dCBmaWxlcywgaXQgc2hvdWxkIGtlZXAgb25seSBhIGxpbmUgaW4gbWVtb3J5LCBiZWNhdXNlCi10aGlzIGlzIG5vdCB2ZXJ5IGhhcmQgYW5kIHVzZXJzIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIG9wZXJhdGUgb24gaW5wdXQKLWZpbGVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHdpbGwgZml0IGluIGNvcmUgYWxsIGF0IG9uY2UuCi0KLUlmIHlvdXIgcHJvZ3JhbSBjcmVhdGVzIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcywganVzdCBtYWtlIHRoZW0gaW4KLWNvcmUgYW5kIGdpdmUgYSBmYXRhbCBlcnJvciBpZiBAY29kZXttYWxsb2N9IHJldHVybnMgemVyby4KLQotQG5vZGUgV3JpdGluZyBDCi1AY2hhcHRlciBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gcHJvdmlkZXMgYWR2aWNlIG9uIGhvdyBiZXN0IHRvIHVzZSB0aGUgQyBsYW5ndWFnZQotd2hlbiB3cml0aW5nIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogRm9ybWF0dGluZzo6ICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0qIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRpbmcgWW91ciBXb3JrCi0qIFN5bnRhY3RpYyBDb252ZW50aW9uczo6ICAgICAgIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKLSogTmFtZXM6OiAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0qIFN5c3RlbSBQb3J0YWJpbGl0eTo6ICAgICAgICAgIFBvcnRhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zCi0qIENQVSBQb3J0YWJpbGl0eTo6ICAgICAgICAgICAgIFN1cHBvcnRpbmcgdGhlIHJhbmdlIG9mIENQVSB0eXBlcwotKiBTeXN0ZW0gRnVuY3Rpb25zOjogICAgICAgICAgICBQb3J0YWJpbGl0eSBhbmQgYGBzdGFuZGFyZCcnIGxpYnJhcnkgZnVuY3Rpb25zCi0qIEludGVybmF0aW9uYWxpemF0aW9uOjogICAgICAgIFRlY2huaXF1ZXMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uCi0qIE1tYXA6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB5b3UgY2FuIHNhZmVseSB1c2UgQGNvZGV7bW1hcH0uCi1AZW5kIG1lbnUKLQotQG5vZGUgRm9ybWF0dGluZwotQHNlY3Rpb24gRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0KLUl0IGlzIGltcG9ydGFudCB0byBwdXQgdGhlIG9wZW4tYnJhY2UgdGhhdCBzdGFydHMgdGhlIGJvZHkgb2YgYSBDCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVybywgYW5kIGF2b2lkIHB1dHRpbmcgYW55IG90aGVyIG9wZW4tYnJhY2Ugb3IKLW9wZW4tcGFyZW50aGVzaXMgb3Igb3Blbi1icmFja2V0IGluIGNvbHVtbiB6ZXJvLiAgU2V2ZXJhbCB0b29scyBsb29rCi1mb3Igb3Blbi1icmFjZXMgaW4gY29sdW1uIHplcm8gdG8gZmluZCB0aGUgYmVnaW5uaW5ncyBvZiBDIGZ1bmN0aW9ucy4KLVRoZXNlIHRvb2xzIHdpbGwgbm90IHdvcmsgb24gY29kZSBub3QgZm9ybWF0dGVkIHRoYXQgd2F5LgotCi1JdCBpcyBhbHNvIGltcG9ydGFudCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gc3RhcnQgdGhlIG5hbWUgb2YgdGhlCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgaGVscHMgcGVvcGxlIHRvIHNlYXJjaCBmb3IgZnVuY3Rpb24KLWRlZmluaXRpb25zLCBhbmQgbWF5IGFsc28gaGVscCBjZXJ0YWluIHRvb2xzIHJlY29nbml6ZSB0aGVtLiAgVGh1cywKLXRoZSBwcm9wZXIgZm9ybWF0IGlzIHRoaXM6Ci0KLUBleGFtcGxlCi1zdGF0aWMgY2hhciAqCi1jb25jYXQgKHMxLCBzMikgICAgICAgIC8qIE5hbWUgc3RhcnRzIGluIGNvbHVtbiB6ZXJvIGhlcmUgKi8KLSAgICAgY2hhciAqczEsICpzMjsKLUB7ICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBicmFjZSBpbiBjb2x1bW4gemVybyBoZXJlICovCi0gIEBkb3Rze30KLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciwgaWYgeW91IHdhbnQgdG8gdXNlIEBzY3thbnNpfSBDLCBmb3JtYXQgdGhlIGRlZmluaXRpb24gbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotc3RhdGljIGNoYXIgKgotY29uY2F0IChjaGFyICpzMSwgY2hhciAqczIpCi1AewotICBAZG90c3t9Ci1AfQotQGVuZCBleGFtcGxlCi0KLUluIEBzY3thbnNpfSBDLCBpZiB0aGUgYXJndW1lbnRzIGRvbid0IGZpdCBuaWNlbHkgb24gb25lIGxpbmUsCi1zcGxpdCBpdCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQKLWxvdHNfb2ZfYXJncyAoaW50IGFuX2ludGVnZXIsIGxvbmcgYV9sb25nLCBzaG9ydCBhX3Nob3J0LAotICAgICAgICAgICAgICBkb3VibGUgYV9kb3VibGUsIGZsb2F0IGFfZmxvYXQpCi1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotRm9yIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgd2UgcHJlZmVyIGNvZGUgZm9ybWF0dGVkIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmICh4IDwgZm9vICh5LCB6KSkKLSAgaGFoYSA9IGJhcls0XSArIDU7Ci1lbHNlCi0gIEB7Ci0gICAgd2hpbGUgKHopCi0gICAgICBAewotICAgICAgICBoYWhhICs9IGZvbyAoeiwgeik7Ci0gICAgICAgIHotLTsKLSAgICAgIEB9Ci0gICAgcmV0dXJuICsreCArIGJhciAoKTsKLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1XZSBmaW5kIGl0IGVhc2llciB0byByZWFkIGEgcHJvZ3JhbSB3aGVuIGl0IGhhcyBzcGFjZXMgYmVmb3JlIHRoZQotb3Blbi1wYXJlbnRoZXNlcyBhbmQgYWZ0ZXIgdGhlIGNvbW1hcy4gIEVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGNvbW1hcy4KLQotV2hlbiB5b3Ugc3BsaXQgYW4gZXhwcmVzc2lvbiBpbnRvIG11bHRpcGxlIGxpbmVzLCBzcGxpdCBpdAotYmVmb3JlIGFuIG9wZXJhdG9yLCBub3QgYWZ0ZXIgb25lLiAgSGVyZSBpcyB0aGUgcmlnaHQgd2F5OgotCi1AZXhhbXBsZQotaWYgKGZvb190aGlzX2lzX2xvbmcgJiYgYmFyID4gd2luICh4LCB5LCB6KQotICAgICYmIHJlbWFpbmluZ19jb25kaXRpb24pCi1AZW5kIGV4YW1wbGUKLQotVHJ5IHRvIGF2b2lkIGhhdmluZyB0d28gb3BlcmF0b3JzIG9mIGRpZmZlcmVudCBwcmVjZWRlbmNlIGF0IHRoZSBzYW1lCi1sZXZlbCBvZiBpbmRlbnRhdGlvbi4gIEZvciBleGFtcGxlLCBkb24ndCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotbW9kZSA9IChpbm1vZGVbal0gPT0gVk9JRG1vZGUKLSAgICAgICAgfHwgR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pCi0gICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7Ci1AZW5kIGV4YW1wbGUKLQotSW5zdGVhZCwgdXNlIGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgdGhlIGluZGVudGF0aW9uIHNob3dzIHRoZSBuZXN0aW5nOgotCi1AZXhhbXBsZQotbW9kZSA9ICgoaW5tb2RlW2pdID09IFZPSURtb2RlCi0gICAgICAgICB8fCAoR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pKSkKLSAgICAgICAgPyBvdXRtb2RlW2pdIDogaW5tb2RlW2pdKTsKLUBlbmQgZXhhbXBsZQotCi1JbnNlcnQgZXh0cmEgcGFyZW50aGVzZXMgc28gdGhhdCBFbWFjcyB3aWxsIGluZGVudCB0aGUgY29kZSBwcm9wZXJseS4KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGluZGVudGF0aW9uIGxvb2tzIG5pY2UgaWYgeW91IGRvIGl0IGJ5IGhhbmQsCi1idXQgRW1hY3Mgd291bGQgbWVzcyBpdCB1cDoKLQotQGV4YW1wbGUKLXYgPSBydXAtPnJ1X3V0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV91dGltZS50dl91c2VjLzEwMDAKLSAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMDsKLUBlbmQgZXhhbXBsZQotCi1CdXQgYWRkaW5nIGEgc2V0IG9mIHBhcmVudGhlc2VzIHNvbHZlcyB0aGUgcHJvYmxlbToKLQotQGV4YW1wbGUKLXYgPSAocnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCi0gICAgICsgcnVwLT5ydV9zdGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfc3RpbWUudHZfdXNlYy8xMDAwKTsKLUBlbmQgZXhhbXBsZQotCi1Gb3JtYXQgZG8td2hpbGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1kbwotICBAewotICAgIGEgPSBmb28gKGEpOwotICBAfQotd2hpbGUgKGEgPiAwKTsKLUBlbmQgZXhhbXBsZQotCi1QbGVhc2UgdXNlIGZvcm1mZWVkIGNoYXJhY3RlcnMgKGNvbnRyb2wtTCkgdG8gZGl2aWRlIHRoZSBwcm9ncmFtIGludG8KLXBhZ2VzIGF0IGxvZ2ljYWwgcGxhY2VzIChidXQgbm90IHdpdGhpbiBhIGZ1bmN0aW9uKS4gIEl0IGRvZXMgbm90IG1hdHRlcgotanVzdCBob3cgbG9uZyB0aGUgcGFnZXMgYXJlLCBzaW5jZSB0aGV5IGRvIG5vdCBoYXZlIHRvIGZpdCBvbiBhIHByaW50ZWQKLXBhZ2UuICBUaGUgZm9ybWZlZWRzIHNob3VsZCBhcHBlYXIgYWxvbmUgb24gbGluZXMgYnkgdGhlbXNlbHZlcy4KLQotCi1Abm9kZSBDb21tZW50cwotQHNlY3Rpb24gQ29tbWVudGluZyBZb3VyIFdvcmsKLQotRXZlcnkgcHJvZ3JhbSBzaG91bGQgc3RhcnQgd2l0aCBhIGNvbW1lbnQgc2F5aW5nIGJyaWVmbHkgd2hhdCBpdCBpcyBmb3IuCi1FeGFtcGxlOiBAc2FtcHtmbXQgLSBmaWx0ZXIgZm9yIHNpbXBsZSBmaWxsaW5nIG9mIHRleHR9LgotCi1QbGVhc2Ugd3JpdGUgdGhlIGNvbW1lbnRzIGluIGEgR05VIHByb2dyYW0gaW4gRW5nbGlzaCwgYmVjYXVzZSBFbmdsaXNoCi1pcyB0aGUgb25lIGxhbmd1YWdlIHRoYXQgbmVhcmx5IGFsbCBwcm9ncmFtbWVycyBpbiBhbGwgY291bnRyaWVzIGNhbgotcmVhZC4gIElmIHlvdSBkbyBub3Qgd3JpdGUgRW5nbGlzaCB3ZWxsLCBwbGVhc2Ugd3JpdGUgY29tbWVudHMgaW4KLUVuZ2xpc2ggYXMgd2VsbCBhcyB5b3UgY2FuLCB0aGVuIGFzayBvdGhlciBwZW9wbGUgdG8gaGVscCByZXdyaXRlIHRoZW0uCi1JZiB5b3UgY2FuJ3Qgd3JpdGUgY29tbWVudHMgaW4gRW5nbGlzaCwgcGxlYXNlIGZpbmQgc29tZW9uZSB0byB3b3JrIHdpdGgKLXlvdSBhbmQgdHJhbnNsYXRlIHlvdXIgY29tbWVudHMgaW50byBFbmdsaXNoLgotCi1QbGVhc2UgcHV0IGEgY29tbWVudCBvbiBlYWNoIGZ1bmN0aW9uIHNheWluZyB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLAotd2hhdCBzb3J0cyBvZiBhcmd1bWVudHMgaXQgZ2V0cywgYW5kIHdoYXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZgotYXJndW1lbnRzIG1lYW4gYW5kIGFyZSB1c2VkIGZvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIGluCi13b3JkcyB0aGUgbWVhbmluZyBvZiB0aGUgQyBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIGlmIGEgQyB0eXBlIGlzIGJlaW5nCi11c2VkIGluIGl0cyBjdXN0b21hcnkgZmFzaGlvbi4gIElmIHRoZXJlIGlzIGFueXRoaW5nIG5vbnN0YW5kYXJkIGFib3V0Ci1pdHMgdXNlIChzdWNoIGFzIGFuIGFyZ3VtZW50IG9mIHR5cGUgQGNvZGV7Y2hhciAqfSB3aGljaCBpcyByZWFsbHkgdGhlCi1hZGRyZXNzIG9mIHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIGEgc3RyaW5nLCBub3QgdGhlIGZpcnN0KSwgb3IgYW55Ci1wb3NzaWJsZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3Qgd29yayB0aGUgd2F5IG9uZSB3b3VsZCBleHBlY3QgKHN1Y2ggYXMsCi10aGF0IHN0cmluZ3MgY29udGFpbmluZyBuZXdsaW5lcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayksIGJlIHN1cmUKLXRvIHNheSBzby4KLQotQWxzbyBleHBsYWluIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlcmUgaXMgb25lLgotCi1QbGVhc2UgcHV0IHR3byBzcGFjZXMgYWZ0ZXIgdGhlIGVuZCBvZiBhIHNlbnRlbmNlIGluIHlvdXIgY29tbWVudHMsIHNvCi10aGF0IHRoZSBFbWFjcyBzZW50ZW5jZSBjb21tYW5kcyB3aWxsIHdvcmsuICBBbHNvLCBwbGVhc2Ugd3JpdGUKLWNvbXBsZXRlIHNlbnRlbmNlcyBhbmQgY2FwaXRhbGl6ZSB0aGUgZmlyc3Qgd29yZC4gIElmIGEgbG93ZXItY2FzZQotaWRlbnRpZmllciBjb21lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VudGVuY2UsIGRvbid0IGNhcGl0YWxpemUgaXQhCi1DaGFuZ2luZyB0aGUgc3BlbGxpbmcgbWFrZXMgaXQgYSBkaWZmZXJlbnQgaWRlbnRpZmllci4gIElmIHlvdSBkb24ndAotbGlrZSBzdGFydGluZyBhIHNlbnRlbmNlIHdpdGggYSBsb3dlciBjYXNlIGxldHRlciwgd3JpdGUgdGhlIHNlbnRlbmNlCi1kaWZmZXJlbnRseSAoZS5nLiwgYGBUaGUgaWRlbnRpZmllciBsb3dlci1jYXNlIGlzIEBkb3Rze30nJykuCi0KLVRoZSBjb21tZW50IG9uIGEgZnVuY3Rpb24gaXMgbXVjaCBjbGVhcmVyIGlmIHlvdSB1c2UgdGhlIGFyZ3VtZW50Ci1uYW1lcyB0byBzcGVhayBhYm91dCB0aGUgYXJndW1lbnQgdmFsdWVzLiAgVGhlIHZhcmlhYmxlIG5hbWUgaXRzZWxmCi1zaG91bGQgYmUgbG93ZXIgY2FzZSwgYnV0IHdyaXRlIGl0IGluIHVwcGVyIGNhc2Ugd2hlbiB5b3UgYXJlIHNwZWFraW5nCi1hYm91dCB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIGl0c2VsZi4gIFRodXMsIGBgdGhlIGlub2RlCi1udW1iZXIgTk9ERV9OVU0nJyByYXRoZXIgdGhhbiBgYGFuIGlub2RlJycuCi0KLVRoZXJlIGlzIHVzdWFsbHkgbm8gcHVycG9zZSBpbiByZXN0YXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluCi10aGUgY29tbWVudCBiZWZvcmUgaXQsIGJlY2F1c2UgdGhlIHJlYWRlciBjYW4gc2VlIHRoYXQgZm9yIGhpbXNlbGYuCi1UaGVyZSBtaWdodCBiZSBhbiBleGNlcHRpb24gd2hlbiB0aGUgY29tbWVudCBpcyBzbyBsb25nIHRoYXQgdGhlIGZ1bmN0aW9uCi1pdHNlbGYgd291bGQgYmUgb2ZmIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KLQotVGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBvbiBlYWNoIHN0YXRpYyB2YXJpYWJsZSBhcyB3ZWxsLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi0vKiBOb256ZXJvIG1lYW5zIHRydW5jYXRlIGxpbmVzIGluIHRoZSBkaXNwbGF5OwotICAgemVybyBtZWFucyBjb250aW51ZSB0aGVtLiAgKi8KLWludCB0cnVuY2F0ZV9saW5lczsKLUBlbmQgZXhhbXBsZQotCi1FdmVyeSBAc2FtcHsjZW5kaWZ9IHNob3VsZCBoYXZlIGEgY29tbWVudCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHNob3J0Ci1jb25kaXRpb25hbHMgKGp1c3QgYSBmZXcgbGluZXMpIHRoYXQgYXJlIG5vdCBuZXN0ZWQuICBUaGUgY29tbWVudCBzaG91bGQKLXN0YXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGNvbmRpdGlvbmFsIHRoYXQgaXMgZW5kaW5nLCBAZW1waHtpbmNsdWRpbmcKLWl0cyBzZW5zZX0uICBAc2FtcHsjZWxzZX0gc2hvdWxkIGhhdmUgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbgotQGVtcGh7YW5kIHNlbnNlfSBvZiB0aGUgY29kZSB0aGF0IGZvbGxvd3MuICBGb3IgZXhhbXBsZToKLQotQGV4YW1wbGUKLUBncm91cAotI2lmZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBub3QgZm9vICovCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBub3QgZm9vICovCi1AZW5kIGdyb3VwCi1AZ3JvdXAKLSNpZmRlZiBmb28KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYnV0LCBieSBjb250cmFzdCwgd3JpdGUgdGhlIGNvbW1lbnRzIHRoaXMgd2F5IGZvciBhIEBzYW1weyNpZm5kZWZ9OgotCi1AZXhhbXBsZQotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBmb28gKi8KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZW5kaWYgLyogbm90IGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFN5bnRhY3RpYyBDb252ZW50aW9ucwotQHNlY3Rpb24gQ2xlYW4gVXNlIG9mIEMgQ29uc3RydWN0cwotCi1QbGVhc2UgZXhwbGljaXRseSBkZWNsYXJlIGFsbCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLgotRG9uJ3Qgb21pdCB0aGVtIGp1c3QgYmVjYXVzZSB0aGV5IGFyZSBAY29kZXtpbnR9cy4KLQotRGVjbGFyYXRpb25zIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGFwcGVhciBsYXRlciBpbiB0aGUKLXNvdXJjZSBmaWxlIHNob3VsZCBhbGwgZ28gaW4gb25lIHBsYWNlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotKHNvbWV3aGVyZSBiZWZvcmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gdGhlIGZpbGUpLCBvciBlbHNlCi1zaG91bGQgZ28gaW4gYSBoZWFkZXIgZmlsZS4gIERvbid0IHB1dCBAY29kZXtleHRlcm59IGRlY2xhcmF0aW9ucyBpbnNpZGUKLWZ1bmN0aW9ucy4KLQotSXQgdXNlZCB0byBiZSBjb21tb24gcHJhY3RpY2UgdG8gdXNlIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcyAod2l0aAotbmFtZXMgbGlrZSBAY29kZXt0ZW19KSBvdmVyIGFuZCBvdmVyIGZvciBkaWZmZXJlbnQgdmFsdWVzIHdpdGhpbiBvbmUKLWZ1bmN0aW9uLiAgSW5zdGVhZCBvZiBkb2luZyB0aGlzLCBpdCBpcyBiZXR0ZXIgZGVjbGFyZSBhIHNlcGFyYXRlIGxvY2FsCi12YXJpYWJsZSBmb3IgZWFjaCBkaXN0aW5jdCBwdXJwb3NlLCBhbmQgZ2l2ZSBpdCBhIG5hbWUgd2hpY2ggaXMKLW1lYW5pbmdmdWwuICBUaGlzIG5vdCBvbmx5IG1ha2VzIHByb2dyYW1zIGVhc2llciB0byB1bmRlcnN0YW5kLCBpdCBhbHNvCi1mYWNpbGl0YXRlcyBvcHRpbWl6YXRpb24gYnkgZ29vZCBjb21waWxlcnMuICBZb3UgY2FuIGFsc28gbW92ZSB0aGUKLWRlY2xhcmF0aW9uIG9mIGVhY2ggbG9jYWwgdmFyaWFibGUgaW50byB0aGUgc21hbGxlc3Qgc2NvcGUgdGhhdCBpbmNsdWRlcwotYWxsIGl0cyB1c2VzLiAgVGhpcyBtYWtlcyB0aGUgcHJvZ3JhbSBldmVuIGNsZWFuZXIuCi0KLURvbid0IHVzZSBsb2NhbCB2YXJpYWJsZXMgb3IgcGFyYW1ldGVycyB0aGF0IHNoYWRvdyBnbG9iYWwgaWRlbnRpZmllcnMuCi0KLURvbid0IGRlY2xhcmUgbXVsdGlwbGUgdmFyaWFibGVzIGluIG9uZSBkZWNsYXJhdGlvbiB0aGF0IHNwYW5zIGxpbmVzLgotU3RhcnQgYSBuZXcgZGVjbGFyYXRpb24gb24gZWFjaCBsaW5lLCBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQKLW9mIHRoaXM6Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLWludCAgICBmb28sCi0gICAgICAgYmFyOwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd3JpdGUgZWl0aGVyIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQgZm9vLCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciB0aGlzOgotCi1AZXhhbXBsZQotaW50IGZvbzsKLWludCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oSWYgdGhleSBhcmUgZ2xvYmFsIHZhcmlhYmxlcywgZWFjaCBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgcHJlY2VkaW5nIGl0Ci1hbnl3YXkuKQotCi1XaGVuIHlvdSBoYXZlIGFuIEBjb2Rle2lmfS1AY29kZXtlbHNlfSBzdGF0ZW1lbnQgbmVzdGVkIGluIGFub3RoZXIKLUBjb2Rle2lmfSBzdGF0ZW1lbnQsIGFsd2F5cyBwdXQgYnJhY2VzIGFyb3VuZCB0aGUgQGNvZGV7aWZ9LUBjb2Rle2Vsc2V9LgotVGh1cywgbmV2ZXIgd3JpdGUgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgaWYgKGJhcikKLSAgICB3aW4gKCk7Ci0gIGVsc2UKLSAgICBsb3NlICgpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYWx3YXlzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEB7Ci0gICAgaWYgKGJhcikKLSAgICAgIHdpbiAoKTsKLSAgICBlbHNlCi0gICAgICBsb3NlICgpOwotICBAfQotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBoYXZlIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgbmVzdGVkIGluc2lkZSBvZiBhbiBAY29kZXtlbHNlfQotc3RhdGVtZW50LCBlaXRoZXIgd3JpdGUgQGNvZGV7ZWxzZSBpZn0gb24gb25lIGxpbmUsIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEBkb3Rze30KLWVsc2UgaWYgKGJhcikKLSAgQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2l0aCBpdHMgQGNvZGV7dGhlbn0tcGFydCBpbmRlbnRlZCBsaWtlIHRoZSBwcmVjZWRpbmcgQGNvZGV7dGhlbn0tcGFydCwKLW9yIHdyaXRlIHRoZSBuZXN0ZWQgQGNvZGV7aWZ9IHdpdGhpbiBicmFjZXMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgQGRvdHN7fQotZWxzZQotICBAewotICAgIGlmIChiYXIpCi0gICAgICBAZG90c3t9Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgZGVjbGFyZSBib3RoIGEgc3RydWN0dXJlIHRhZyBhbmQgdmFyaWFibGVzIG9yIHR5cGVkZWZzIGluIHRoZQotc2FtZSBkZWNsYXJhdGlvbi4gIEluc3RlYWQsIGRlY2xhcmUgdGhlIHN0cnVjdHVyZSB0YWcgc2VwYXJhdGVseQotYW5kIHRoZW4gdXNlIGl0IHRvIGRlY2xhcmUgdGhlIHZhcmlhYmxlcyBvciB0eXBlZGVmcy4KLQotVHJ5IHRvIGF2b2lkIGFzc2lnbm1lbnRzIGluc2lkZSBAY29kZXtpZn0tY29uZGl0aW9ucy4gIEZvciBleGFtcGxlLAotZG9uJ3Qgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLWlmICgoZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbykpID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbnN0ZWFkLCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbyk7Ci1pZiAoZm9vID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgbWFrZSB0aGUgcHJvZ3JhbSB1Z2x5IHRvIHBsYWNhdGUgQGNvZGV7bGludH0uICBQbGVhc2UgZG9uJ3QgaW5zZXJ0IGFueQotY2FzdHMgdG8gQGNvZGV7dm9pZH0uICBaZXJvIHdpdGhvdXQgYSBjYXN0IGlzIHBlcmZlY3RseSBmaW5lIGFzIGEgbnVsbAotcG9pbnRlciBjb25zdGFudCwgZXhjZXB0IHdoZW4gY2FsbGluZyBhIHZhcmFyZ3MgZnVuY3Rpb24uCi0KLUBub2RlICBOYW1lcwotQHNlY3Rpb24gTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0KLVRoZSBuYW1lcyBvZiBnbG9iYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gYSBwcm9ncmFtIHNlcnZlIGFzCi1jb21tZW50cyBvZiBhIHNvcnQuICBTbyBkb24ndCBjaG9vc2UgdGVyc2UgbmFtZXMtLS1pbnN0ZWFkLCBsb29rIGZvcgotbmFtZXMgdGhhdCBnaXZlIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaWFibGUgb3IKLWZ1bmN0aW9uLiAgSW4gYSBHTlUgcHJvZ3JhbSwgbmFtZXMgc2hvdWxkIGJlIEVuZ2xpc2gsIGxpa2Ugb3RoZXIKLWNvbW1lbnRzLgotCi1Mb2NhbCB2YXJpYWJsZSBuYW1lcyBjYW4gYmUgc2hvcnRlciwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIG9ubHkgd2l0aGluCi1vbmUgY29udGV4dCwgd2hlcmUgKHByZXN1bWFibHkpIGNvbW1lbnRzIGV4cGxhaW4gdGhlaXIgcHVycG9zZS4KLQotUGxlYXNlIHVzZSB1bmRlcnNjb3JlcyB0byBzZXBhcmF0ZSB3b3JkcyBpbiBhIG5hbWUsIHNvIHRoYXQgdGhlIEVtYWNzCi13b3JkIGNvbW1hbmRzIGNhbiBiZSB1c2VmdWwgd2l0aGluIHRoZW0uICBTdGljayB0byBsb3dlciBjYXNlOyByZXNlcnZlCi11cHBlciBjYXNlIGZvciBtYWNyb3MgYW5kIEBjb2Rle2VudW19IGNvbnN0YW50cywgYW5kIGZvciBuYW1lLXByZWZpeGVzCi10aGF0IGZvbGxvdyBhIHVuaWZvcm0gY29udmVudGlvbi4KLQotRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgdXNlIG5hbWVzIGxpa2UgQGNvZGV7aWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnfTsKLWRvbid0IHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lDYW50UmVhZFRoaXN9LgotCi1WYXJpYWJsZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGNvbW1hbmQtbGluZSBvcHRpb25zIGhhdmUgYmVlbgotc3BlY2lmaWVkIHNob3VsZCBiZSBuYW1lZCBhZnRlciB0aGUgbWVhbmluZyBvZiB0aGUgb3B0aW9uLCBub3QgYWZ0ZXIKLXRoZSBvcHRpb24tbGV0dGVyLiAgQSBjb21tZW50IHNob3VsZCBzdGF0ZSBib3RoIHRoZSBleGFjdCBtZWFuaW5nIG9mCi10aGUgb3B0aW9uIGFuZCBpdHMgbGV0dGVyLiAgRm9yIGV4YW1wbGUsCi0KLUBleGFtcGxlCi1AZ3JvdXAKLS8qIElnbm9yZSBjaGFuZ2VzIGluIGhvcml6b250YWwgd2hpdGVzcGFjZSAoLWIpLiAgKi8KLWludCBpZ25vcmVfc3BhY2VfY2hhbmdlX2ZsYWc7Ci1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3Ugd2FudCB0byBkZWZpbmUgbmFtZXMgd2l0aCBjb25zdGFudCBpbnRlZ2VyIHZhbHVlcywgdXNlCi1AY29kZXtlbnVtfSByYXRoZXIgdGhhbiBAc2FtcHsjZGVmaW5lfS4gIEdEQiBrbm93cyBhYm91dCBlbnVtZXJhdGlvbgotY29uc3RhbnRzLgotCi1Vc2UgZmlsZSBuYW1lcyBvZiAxNCBjaGFyYWN0ZXJzIG9yIGxlc3MsIHRvIGF2b2lkIGNyZWF0aW5nIGdyYXR1aXRvdXMKLXByb2JsZW1zIG9uIG9sZGVyIFN5c3RlbSBWIHN5c3RlbXMuICBZb3UgY2FuIHVzZSB0aGUgcHJvZ3JhbQotQGNvZGV7ZG9zY2hrfSB0byB0ZXN0IGZvciB0aGlzLiAgQGNvZGV7ZG9zY2hrfSBhbHNvIHRlc3RzIGZvciBwb3RlbnRpYWwKLW5hbWUgY29uZmxpY3RzIGlmIHRoZSBmaWxlcyB3ZXJlIGxvYWRlZCBvbnRvIGFuIE1TLURPUyBmaWxlCi1zeXN0ZW0tLS1zb21ldGhpbmcgeW91IG1heSBvciBtYXkgbm90IGNhcmUgYWJvdXQuCi0KLUBub2RlIFN5c3RlbSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBTeXN0ZW0gVHlwZXMKLQotSW4gdGhlIFVuaXggd29ybGQsIGBgcG9ydGFiaWxpdHknJyByZWZlcnMgdG8gcG9ydGluZyB0byBkaWZmZXJlbnQgVW5peAotdmVyc2lvbnMuICBGb3IgYSBHTlUgcHJvZ3JhbSwgdGhpcyBraW5kIG9mIHBvcnRhYmlsaXR5IGlzIGRlc2lyYWJsZSwgYnV0Ci1ub3QgcGFyYW1vdW50LgotCi1UaGUgcHJpbWFyeSBwdXJwb3NlIG9mIEdOVSBzb2Z0d2FyZSBpcyB0byBydW4gb24gdG9wIG9mIHRoZSBHTlUga2VybmVsLAotY29tcGlsZWQgd2l0aCB0aGUgR05VIEMgY29tcGlsZXIsIG9uIHZhcmlvdXMgdHlwZXMgb2YgQHNje2NwdX0uICBUaGUKLWFtb3VudCBhbmQga2luZHMgb2YgdmFyaWF0aW9uIGFtb25nIEdOVSBzeXN0ZW1zIG9uIGRpZmZlcmVudCBAc2N7Y3B1fXMKLXdpbGwgYmUgY29tcGFyYWJsZSB0byB0aGUgdmFyaWF0aW9uIGFtb25nIExpbnV4LWJhc2VkIEdOVSBzeXN0ZW1zIG9yCi1hbW9uZyBCU0Qgc3lzdGVtcyB0b2RheS4gIFNvIHRoZSBraW5kcyBvZiBwb3J0YWJpbGl0eSB0aGF0IGFyZSBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnkgYXJlIHF1aXRlIGxpbWl0ZWQuCi0KLUJ1dCBtYW55IHVzZXJzIGRvIHJ1biBHTlUgc29mdHdhcmUgb24gbm9uLUdOVSBVbml4IG9yIFVuaXgtbGlrZSBzeXN0ZW1zLgotU28gc3VwcG9ydGluZyBhIHZhcmlldHkgb2YgVW5peC1saWtlIHN5c3RlbXMgaXMgZGVzaXJhYmxlLCBhbHRob3VnaCBub3QKLXBhcmFtb3VudC4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFjaGlldmUgcG9ydGFiaWxpdHkgdG8gbW9zdCBVbml4LWxpa2Ugc3lzdGVtcyBpcyB0bwotdXNlIEF1dG9jb25mLiAgSXQncyB1bmxpa2VseSB0aGF0IHlvdXIgcHJvZ3JhbSBuZWVkcyB0byBrbm93IG1vcmUKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHBsYXRmb3JtIHRoYW4gQXV0b2NvbmYgY2FuIHByb3ZpZGUsIHNpbXBseQotYmVjYXVzZSBtb3N0IG9mIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgc3VjaCBrbm93bGVkZ2UgaGF2ZSBhbHJlYWR5IGJlZW4KLXdyaXR0ZW4uCi0KLUF2b2lkIHVzaW5nIHRoZSBmb3JtYXQgb2Ygc2VtaS1pbnRlcm5hbCBkYXRhIGJhc2VzIChlLmcuLCBkaXJlY3RvcmllcykKLXdoZW4gdGhlcmUgaXMgYSBoaWdoZXItbGV2ZWwgYWx0ZXJuYXRpdmUgKEBjb2Rle3JlYWRkaXJ9KS4KLQotQXMgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbm90IGxpa2UgVW5peCwgc3VjaCBhcyBNU0RPUywgV2luZG93cywgdGhlCi1NYWNpbnRvc2gsIFZNUywgYW5kIE1WUywgc3VwcG9ydGluZyB0aGVtIGlzIHVzdWFsbHkgc28gbXVjaCB3b3JrIHRoYXQgaXQKLWlzIGJldHRlciBpZiB5b3UgZG9uJ3QuCi0KLVRoZSBwbGFubmVkIEdOVSBrZXJuZWwgaXMgbm90IGZpbmlzaGVkIHlldCwgYnV0IHlvdSBjYW4gdGVsbCB3aGljaAotZmFjaWxpdGllcyBpdCB3aWxsIHByb3ZpZGUgYnkgbG9va2luZyBhdCB0aGUgR05VIEMgTGlicmFyeSBNYW51YWwuICBUaGUKLUdOVSBrZXJuZWwgaXMgYmFzZWQgb24gTWFjaCwgc28gdGhlIGZlYXR1cmVzIG9mIE1hY2ggd2lsbCBhbHNvIGJlCi1hdmFpbGFibGUuICBIb3dldmVyLCBpZiB5b3UgdXNlIE1hY2ggZmVhdHVyZXMsIHlvdSdsbCBwcm9iYWJseSBoYXZlCi10cm91YmxlIGRlYnVnZ2luZyB5b3VyIHByb2dyYW0gdG9kYXkuCi0KLUBub2RlIENQVSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBAc2N7Y3B1fXMKLQotRXZlbiBHTlUgc3lzdGVtcyB3aWxsIGRpZmZlciBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGFtb25nIEBzY3tjcHV9Ci10eXBlcy0tLWZvciBleGFtcGxlLCBkaWZmZXJlbmNlIGluIGJ5dGUgb3JkZXJpbmcgYW5kIGFsaWdubWVudAotcmVxdWlyZW1lbnRzLiAgSXQgaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVuY2VzLgotSG93ZXZlciwgZG9uJ3QgbWFrZSBhbnkgZWZmb3J0IHRvIGNhdGVyIHRvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGFuCi1AY29kZXtpbnR9IHdpbGwgYmUgbGVzcyB0aGFuIDMyIGJpdHMuICBXZSBkb24ndCBzdXBwb3J0IDE2LWJpdCBtYWNoaW5lcwotaW4gR05VLgotCi1Eb24ndCBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBhbiBAY29kZXtpbnR9IG9iamVjdCBpcyBhbHNvIHRoZQotYWRkcmVzcyBvZiBpdHMgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZS4gIFRoaXMgaXMgZmFsc2Ugb24gYmlnLWVuZGlhbgotbWFjaGluZXMuICBUaHVzLCBkb24ndCBtYWtlIHRoZSBmb2xsb3dpbmcgbWlzdGFrZToKLQotQGV4YW1wbGUKLWludCBjOwotQGRvdHN7fQotd2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpCi0gIHdyaXRlKGZpbGVfZGVzY3JpcHRvciwgJmMsIDEpOwotQGVuZCBleGFtcGxlCi0KLVdoZW4gY2FsbGluZyBmdW5jdGlvbnMsIHlvdSBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1wb2ludGVycyBvZiB2YXJpb3VzIHR5cGVzLCBvciBiZXR3ZWVuIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gIE9uIG1vc3QKLW1hY2hpbmVzLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYW55d2F5LiAgQXMgZm9yIHRoZSBmZXcgbWFjaGluZXMgd2hlcmUKLXRoZXJlIGlzIGEgZGlmZmVyZW5jZSwgYWxsIG9mIHRoZW0gc3VwcG9ydCBAc2N7YW5zaX0gQywgc28geW91IGNhbiB1c2UKLXByb3RvdHlwZXMgKGNvbmRpdGlvbmFsaXplZCB0byBiZSBhY3RpdmUgb25seSBpbiBAc2N7YW5zaX0gQykgdG8gbWFrZQotdGhlIGNvZGUgd29yayBvbiB0aG9zZSBzeXN0ZW1zLgotCi1JbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBvayB0byBwYXNzIGludGVnZXIgYW5kIHBvaW50ZXIgYXJndW1lbnRzCi1pbmRpc2NyaW1pbmF0ZWx5IHRvIHRoZSBzYW1lIGZ1bmN0aW9uLCBhbmQgdXNlIG5vIHByb3RvdHlwZSBvbiBhbnkKLXN5c3RlbS4gIEZvciBleGFtcGxlLCBtYW55IEdOVSBwcm9ncmFtcyBoYXZlIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbnMKLXRoYXQgcGFzcyB0aGVpciBhcmd1bWVudHMgYWxvbmcgdG8gQGNvZGV7cHJpbnRmfSBhbmQgZnJpZW5kczoKLQotQGV4YW1wbGUKLWVycm9yIChzLCBhMSwgYTIsIGEzKQotICAgICBjaGFyICpzOwotICAgICBpbnQgYTEsIGEyLCBhMzsKLUB7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVycm9yOiAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBzLCBhMSwgYTIsIGEzKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JbiBwcmFjdGljZSwgdGhpcyB3b3JrcyBvbiBhbGwgbWFjaGluZXMsIGFuZCBpdCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBhbnkKLWBgY29ycmVjdCcnIGFsdGVybmF0aXZlLiAgQmUgc3VyZSBAZW1waHtub3R9IHRvIHVzZSBhIHByb3RvdHlwZQotZm9yIHN1Y2ggZnVuY3Rpb25zLgotCi1Ib3dldmVyLCBhdm9pZCBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uCi1UaGVzZSBhc3N1bXB0aW9ucyByZWFsbHkgcmVkdWNlIHBvcnRhYmlsaXR5LCBhbmQgaW4gbW9zdCBwcm9ncmFtcyB0aGV5Ci1hcmUgZWFzeSB0byBhdm9pZC4gIEluIHRoZSBjYXNlcyB3aGVyZSBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIGlzCi1lc3NlbnRpYWwtLS1zdWNoIGFzLCBhIExpc3AgaW50ZXJwcmV0ZXIgd2hpY2ggc3RvcmVzIHR5cGUgaW5mb3JtYXRpb24gYXMKLXdlbGwgYXMgYW4gYWRkcmVzcyBpbiBvbmUgd29yZC0tLWl0IGlzIG9rIHRvIGRvIHNvLCBidXQgeW91J2xsIGhhdmUgdG8KLW1ha2UgZXhwbGljaXQgcHJvdmlzaW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHdvcmQgc2l6ZXMuCi0KLUBub2RlIFN5c3RlbSBGdW5jdGlvbnMKLUBzZWN0aW9uIENhbGxpbmcgU3lzdGVtIEZ1bmN0aW9ucwotCi1DIGltcGxlbWVudGF0aW9ucyBkaWZmZXIgc3Vic3RhbnRpYWxseS4gIEBzY3thbnNpfSBDIHJlZHVjZXMgYnV0IGRvZXMgbm90Ci1lbGltaW5hdGUgdGhlIGluY29tcGF0aWJpbGl0aWVzOyBtZWFud2hpbGUsIG1hbnkgdXNlcnMgd2lzaCB0byBjb21waWxlCi1HTlUgc29mdHdhcmUgd2l0aCBwcmUtQHNje2Fuc2l9IGNvbXBpbGVycy4gIFRoaXMgY2hhcHRlciBnaXZlcwotcmVjb21tZW5kYXRpb25zIGZvciBob3cgdG8gdXNlIHRoZSBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgQyBsaWJyYXJ5Ci1mdW5jdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbG9zcyBvZiBwb3J0YWJpbGl0eS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLURvbid0IHVzZSB0aGUgdmFsdWUgb2YgQGNvZGV7c3ByaW50Zn0uICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLWNoYXJhY3RlcnMgd3JpdHRlbiBvbiBzb21lIHN5c3RlbXMsIGJ1dCBub3Qgb24gYWxsIHN5c3RlbXMuCi0KLUBpdGVtCi1AY29kZXttYWlufSBzaG91bGQgYmUgZGVjbGFyZWQgdG8gcmV0dXJuIHR5cGUgQGNvZGV7aW50fS4gIEl0IHNob3VsZAotdGVybWluYXRlIGVpdGhlciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9IG9yIGJ5IHJldHVybmluZyB0aGUgaW50ZWdlcgotc3RhdHVzIGNvZGU7IG1ha2Ugc3VyZSBpdCBjYW5ub3QgZXZlciByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgotCi1AaXRlbQotRG9uJ3QgZGVjbGFyZSBzeXN0ZW0gZnVuY3Rpb25zIGV4cGxpY2l0bHkuCi0KLUFsbW9zdCBhbnkgZGVjbGFyYXRpb24gZm9yIGEgc3lzdGVtIGZ1bmN0aW9uIGlzIHdyb25nIG9uIHNvbWUgc3lzdGVtLgotVG8gbWluaW1pemUgY29uZmxpY3RzLCBsZWF2ZSBpdCB0byB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyB0byBkZWNsYXJlCi1zeXN0ZW0gZnVuY3Rpb25zLiAgSWYgdGhlIGhlYWRlcnMgZG9uJ3QgZGVjbGFyZSBhIGZ1bmN0aW9uLCBsZXQgaXQKLXJlbWFpbiB1bmRlY2xhcmVkLgotCi1XaGlsZSBpdCBtYXkgc2VlbSB1bmNsZWFuIHRvIHVzZSBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCBpbgotcHJhY3RpY2UgdGhpcyB3b3JrcyBmaW5lIGZvciBtb3N0IHN5c3RlbSBsaWJyYXJ5IGZ1bmN0aW9ucyBvbiB0aGUKLXN5c3RlbXMgd2hlcmUgdGhpcyByZWFsbHkgaGFwcGVuczsgdGh1cywgdGhlIGRpc2FkdmFudGFnZSBpcyBvbmx5Ci10aGVvcmV0aWNhbC4gIEJ5IGNvbnRyYXN0LCBhY3R1YWwgZGVjbGFyYXRpb25zIGhhdmUgZnJlcXVlbnRseSBjYXVzZWQKLWFjdHVhbCBjb25mbGljdHMuCi0KLUBpdGVtCi1JZiB5b3UgbXVzdCBkZWNsYXJlIGEgc3lzdGVtIGZ1bmN0aW9uLCBkb24ndCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcy4KLVVzZSBhbiBvbGQtc3R5bGUgZGVjbGFyYXRpb24sIG5vdCBhbiBAc2N7YW5zaX0gcHJvdG90eXBlLiAgVGhlIG1vcmUgeW91Ci1zcGVjaWZ5IGFib3V0IHRoZSBmdW5jdGlvbiwgdGhlIG1vcmUgbGlrZWx5IGEgY29uZmxpY3QuCi0KLUBpdGVtCi1JbiBwYXJ0aWN1bGFyLCBkb24ndCB1bmNvbmRpdGlvbmFsbHkgZGVjbGFyZSBAY29kZXttYWxsb2N9IG9yCi1AY29kZXtyZWFsbG9jfS4KLQotTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIHRob3NlIGZ1bmN0aW9ucyBqdXN0IG9uY2UsIGluIGZ1bmN0aW9ucwotY29udmVudGlvbmFsbHkgbmFtZWQgQGNvZGV7eG1hbGxvY30gYW5kIEBjb2Rle3hyZWFsbG9jfS4gIFRoZXNlCi1mdW5jdGlvbnMgY2FsbCBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSwgcmVzcGVjdGl2ZWx5LCBhbmQKLWNoZWNrIHRoZSByZXN1bHRzLgotCi1CZWNhdXNlIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30gYXJlIGRlZmluZWQgaW4geW91ciBwcm9ncmFtLAoteW91IGNhbiBkZWNsYXJlIHRoZW0gaW4gb3RoZXIgZmlsZXMgd2l0aG91dCBhbnkgcmlzayBvZiB0eXBlIGNvbmZsaWN0LgotCi1PbiBtb3N0IHN5c3RlbXMsIEBjb2Rle2ludH0gaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIGEgcG9pbnRlcjsgdGh1cywgdGhlCi1jYWxscyB0byBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSB3b3JrIGZpbmUuICBGb3IgdGhlIGZldwotZXhjZXB0aW9uYWwgc3lzdGVtcyAobW9zdGx5IDY0LWJpdCBtYWNoaW5lcyksIHlvdSBjYW4gdXNlCi1Ac3Ryb25ne2NvbmRpdGlvbmFsaXplZH0gZGVjbGFyYXRpb25zIG9mIEBjb2Rle21hbGxvY30gYW5kCi1AY29kZXtyZWFsbG9jfS0tLW9yIHB1dCB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcwotc3BlY2lmaWMgdG8gdGhvc2Ugc3lzdGVtcy4KLQotQGl0ZW0KLVRoZSBzdHJpbmcgZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQuICBTb21lIFVuaXggc3lzdGVtcyBoYXZlCi1hIGhlYWRlciBmaWxlIEBmaWxle3N0cmluZy5ofTsgb3RoZXJzIGhhdmUgQGZpbGV7c3RyaW5ncy5ofS4gIE5laXRoZXIKLWZpbGUgbmFtZSBpcyBwb3J0YWJsZS4gIFRoZXJlIGFyZSB0d28gdGhpbmdzIHlvdSBjYW4gZG86IHVzZSBBdXRvY29uZiB0bwotZmlndXJlIG91dCB3aGljaCBmaWxlIHRvIGluY2x1ZGUsIG9yIGRvbid0IGluY2x1ZGUgZWl0aGVyIGZpbGUuCi0KLUBpdGVtCi1JZiB5b3UgZG9uJ3QgaW5jbHVkZSBlaXRoZXIgc3RyaW5ncyBmaWxlLCB5b3UgY2FuJ3QgZ2V0IGRlY2xhcmF0aW9ucyBmb3IKLXRoZSBzdHJpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlIGluIHRoZSB1c3VhbCB3YXkuCi0KLVRoYXQgY2F1c2VzIGxlc3Mgb2YgYSBwcm9ibGVtIHRoYW4geW91IG1pZ2h0IHRoaW5rLiAgVGhlIG5ld2VyIEBzY3thbnNpfQotc3RyaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYXZvaWRlZCBhbnl3YXkgYmVjYXVzZSBtYW55IHN5c3RlbXMgc3RpbGwKLWRvbid0IHN1cHBvcnQgdGhlbS4gIFRoZSBzdHJpbmcgZnVuY3Rpb25zIHlvdSBjYW4gdXNlIGFyZSB0aGVzZToKLQotQGV4YW1wbGUKLXN0cmNweSAgIHN0cm5jcHkgICBzdHJjYXQgICBzdHJuY2F0Ci1zdHJsZW4gICBzdHJjbXAgICAgc3RybmNtcAotc3RyY2hyICAgc3RycmNocgotQGVuZCBleGFtcGxlCi0KLVRoZSBjb3B5IGFuZCBjb25jYXRlbmF0ZSBmdW5jdGlvbnMgd29yayBmaW5lIHdpdGhvdXQgYSBkZWNsYXJhdGlvbiBhcwotbG9uZyBhcyB5b3UgZG9uJ3QgdXNlIHRoZWlyIHZhbHVlcy4gIFVzaW5nIHRoZWlyIHZhbHVlcyB3aXRob3V0IGEKLWRlY2xhcmF0aW9uIGZhaWxzIG9uIHN5c3RlbXMgd2hlcmUgdGhlIHdpZHRoIG9mIGEgcG9pbnRlciBkaWZmZXJzIGZyb20KLXRoZSB3aWR0aCBvZiBAY29kZXtpbnR9LCBhbmQgcGVyaGFwcyBpbiBvdGhlciBjYXNlcy4gIEl0IGlzIHRyaXZpYWwgdG8KLWF2b2lkIHVzaW5nIHRoZWlyIHZhbHVlcywgc28gZG8gdGhhdC4KLQotVGhlIGNvbXBhcmUgZnVuY3Rpb25zIGFuZCBAY29kZXtzdHJsZW59IHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24KLW9uIG1vc3Qgc3lzdGVtcywgcG9zc2libHkgYWxsIHRoZSBvbmVzIHRoYXQgR05VIHNvZnR3YXJlIHJ1bnMgb24uCi1Zb3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdGhlbSBAc3Ryb25ne2NvbmRpdGlvbmFsbHl9IG9uIGEKLWZldyBzeXN0ZW1zLgotCi1UaGUgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHRvIHJldHVybiBAY29kZXtjaGFyICp9LiAgTHVja2lseSwKLXRoZXJlIGlzIG5vIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSB0eXBlIHRoZXkgcmV0dXJuLiAgQnV0IHRoZXJlIGlzCi12YXJpYXRpb24gaW4gdGhlaXIgbmFtZXMuICBTb21lIHN5c3RlbXMgZ2l2ZSB0aGVzZSBmdW5jdGlvbnMgdGhlIG5hbWVzCi1AY29kZXtpbmRleH0gYW5kIEBjb2Rle3JpbmRleH07IG90aGVyIHN5c3RlbXMgdXNlIHRoZSBuYW1lcwotQGNvZGV7c3RyY2hyfSBhbmQgQGNvZGV7c3RycmNocn0uICBTb21lIHN5c3RlbXMgc3VwcG9ydCBib3RoIHBhaXJzIG9mCi1uYW1lcywgYnV0IG5laXRoZXIgcGFpciB3b3JrcyBvbiBhbGwgc3lzdGVtcy4KLQotWW91IHNob3VsZCBwaWNrIGEgc2luZ2xlIHBhaXIgb2YgbmFtZXMgYW5kIHVzZSBpdCB0aHJvdWdob3V0IHlvdXIKLXByb2dyYW0uICAoTm93YWRheXMsIGl0IGlzIGJldHRlciB0byBjaG9vc2UgQGNvZGV7c3RyY2hyfSBhbmQKLUBjb2Rle3N0cnJjaHJ9IGZvciBuZXcgcHJvZ3JhbXMsIHNpbmNlIHRob3NlIGFyZSB0aGUgc3RhbmRhcmQgQHNje2Fuc2l9Ci1uYW1lcy4pICBEZWNsYXJlIGJvdGggb2YgdGhvc2UgbmFtZXMgYXMgZnVuY3Rpb25zIHJldHVybmluZyBAY29kZXtjaGFyCi0qfS4gIE9uIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aG9zZSBuYW1lcywgZGVmaW5lIHRoZW0gYXMgbWFjcm9zCi1pbiB0ZXJtcyBvZiB0aGUgb3RoZXIgcGFpci4gIEZvciBleGFtcGxlLCBoZXJlIGlzIHdoYXQgdG8gcHV0IGF0IHRoZQotYmVnaW5uaW5nIG9mIHlvdXIgZmlsZSAob3IgaW4gYSBoZWFkZXIpIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmFtZXMKLUBjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9IHRocm91Z2hvdXQ6Ci0KLUBleGFtcGxlCi0jaWZuZGVmIEhBVkVfU1RSQ0hSCi0jZGVmaW5lIHN0cmNociBpbmRleAotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSUkNIUgotI2RlZmluZSBzdHJyY2hyIHJpbmRleAotI2VuZGlmCi0KLWNoYXIgKnN0cmNociAoKTsKLWNoYXIgKnN0cnJjaHIgKCk7Ci1AZW5kIGV4YW1wbGUKLUBlbmQgaXRlbWl6ZQotCi1IZXJlIHdlIGFzc3VtZSB0aGF0IEBjb2Rle0hBVkVfU1RSQ0hSfSBhbmQgQGNvZGV7SEFWRV9TVFJSQ0hSfSBhcmUKLW1hY3JvcyBkZWZpbmVkIGluIHN5c3RlbXMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGV4aXN0LgotT25lIHdheSB0byBnZXQgdGhlbSBwcm9wZXJseSBkZWZpbmVkIGlzIHRvIHVzZSBBdXRvY29uZi4KLQotQG5vZGUgSW50ZXJuYXRpb25hbGl6YXRpb24KLUBzZWN0aW9uIEludGVybmF0aW9uYWxpemF0aW9uCi0KLUdOVSBoYXMgYSBsaWJyYXJ5IGNhbGxlZCBHTlUgZ2V0dGV4dCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gdHJhbnNsYXRlIHRoZQotbWVzc2FnZXMgaW4gYSBwcm9ncmFtIGludG8gdmFyaW91cyBsYW5ndWFnZXMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzCi1saWJyYXJ5IGluIGV2ZXJ5IHByb2dyYW0uICBVc2UgRW5nbGlzaCBmb3IgdGhlIG1lc3NhZ2VzIGFzIHRoZXkgYXBwZWFyCi1pbiB0aGUgcHJvZ3JhbSwgYW5kIGxldCBnZXR0ZXh0IHByb3ZpZGUgdGhlIHdheSB0byB0cmFuc2xhdGUgdGhlbSBpbnRvCi1vdGhlciBsYW5ndWFnZXMuCi0KLVVzaW5nIEdOVSBnZXR0ZXh0IGludm9sdmVzIHB1dHRpbmcgYSBjYWxsIHRvIHRoZSBAY29kZXtnZXR0ZXh0fSBtYWNybwotYXJvdW5kIGVhY2ggc3RyaW5nIHRoYXQgbWlnaHQgbmVlZCB0cmFuc2xhdGlvbi0tLWxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXByaW50ZiAoZ2V0dGV4dCAoIlByb2Nlc3NpbmcgZmlsZSBgJXMnLi4uIikpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwZXJtaXRzIEdOVSBnZXR0ZXh0IHRvIHJlcGxhY2UgdGhlIHN0cmluZyBAY29kZXsiUHJvY2Vzc2luZyBmaWxlCi1gJXMnLi4uIn0gd2l0aCBhIHRyYW5zbGF0ZWQgdmVyc2lvbi4KLQotT25jZSBhIHByb2dyYW0gdXNlcyBnZXR0ZXh0LCBwbGVhc2UgbWFrZSBhIHBvaW50IG9mIHdyaXRpbmcgY2FsbHMgdG8KLUBjb2Rle2dldHRleHR9IHdoZW4geW91IGFkZCBuZXcgc3RyaW5ncyB0aGF0IGNhbGwgZm9yIHRyYW5zbGF0aW9uLgotCi1Vc2luZyBHTlUgZ2V0dGV4dCBpbiBhIHBhY2thZ2UgaW52b2x2ZXMgc3BlY2lmeWluZyBhIEBkZm57dGV4dCBkb21haW4KLW5hbWV9IGZvciB0aGUgcGFja2FnZS4gIFRoZSB0ZXh0IGRvbWFpbiBuYW1lIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlCi10cmFuc2xhdGlvbnMgZm9yIHRoaXMgcGFja2FnZSBmcm9tIHRoZSB0cmFuc2xhdGlvbnMgZm9yIG90aGVyIHBhY2thZ2VzLgotTm9ybWFsbHksIHRoZSB0ZXh0IGRvbWFpbiBuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUKLXBhY2thZ2UtLS1mb3IgZXhhbXBsZSwgQHNhbXB7ZmlsZXV0aWxzfSBmb3IgdGhlIEdOVSBmaWxlIHV0aWxpdGllcy4KLQotVG8gZW5hYmxlIGdldHRleHQgdG8gd29yayB3ZWxsLCBhdm9pZCB3cml0aW5nIGNvZGUgdGhhdCBtYWtlcwotYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiB3b3JkcyBvciBzZW50ZW5jZXMuICBXaGVuIHlvdSB3YW50Ci10aGUgcHJlY2lzZSB0ZXh0IG9mIGEgc2VudGVuY2UgdG8gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGRhdGEsIHVzZSB0d28gb3IKLW1vcmUgYWx0ZXJuYXRpdmUgc3RyaW5nIGNvbnN0YW50cyBlYWNoIGNvbnRhaW5pbmcgYSBjb21wbGV0ZSBzZW50ZW5jZXMsCi1yYXRoZXIgdGhhbiBpbnNlcnRpbmcgY29uZGl0aW9uYWxpemVkIHdvcmRzIG9yIHBocmFzZXMgaW50byBhIHNpbmdsZQotc2VudGVuY2UgZnJhbWV3b3JrLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCBub3QgdG8gZG86Ci0KLUBleGFtcGxlCi1wcmludGYgKCIlZCBmaWxlJXMgcHJvY2Vzc2VkIiwgbmZpbGVzLAotICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ibGVtIHdpdGggdGhhdCBleGFtcGxlIGlzIHRoYXQgaXQgYXNzdW1lcyB0aGF0IHBsdXJhbHMgYXJlIG1hZGUKLWJ5IGFkZGluZyBgcycuICBJZiB5b3UgYXBwbHkgZ2V0dGV4dCB0byB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotcHJpbnRmIChnZXR0ZXh0ICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIpLCBuZmlsZXMsCi0gICAgICAgIG5maWxlcyAhPSAxID8gInMiIDogIiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdGhlIG1lc3NhZ2UgY2FuIHVzZSBkaWZmZXJlbnQgd29yZHMsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlIGZvcmNlZCB0byB1c2UKLWBzJyBmb3IgdGhlIHBsdXJhbC4gIEhlcmUgaXMgYSBiZXR0ZXIgd2F5OgotCi1AZXhhbXBsZQotcHJpbnRmICgobmZpbGVzICE9IDEgPyAiJWQgZmlsZXMgcHJvY2Vzc2VkIgotICAgICAgICAgOiAiJWQgZmlsZSBwcm9jZXNzZWQiKSwKLSAgICAgICAgbmZpbGVzKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgd2F5LCB5b3UgY2FuIGFwcGx5IGdldHRleHQgdG8gZWFjaCBvZiB0aGUgdHdvIHN0cmluZ3MKLWluZGVwZW5kZW50bHk6Ci0KLUBleGFtcGxlCi1wcmludGYgKChuZmlsZXMgIT0gMSA/IGdldHRleHQgKCIlZCBmaWxlcyBwcm9jZXNzZWQiKQotICAgICAgICAgOiBnZXR0ZXh0ICgiJWQgZmlsZSBwcm9jZXNzZWQiKSksCi0gICAgICAgIG5maWxlcyk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIGNhbiBiZSBhbnkgbWV0aG9kIG9mIGZvcm1pbmcgdGhlIHBsdXJhbCBvZiB0aGUgd29yZCBmb3IgYGBmaWxlJycsIGFuZAotYWxzbyBoYW5kbGVzIGxhbmd1YWdlcyB0aGF0IHJlcXVpcmUgYWdyZWVtZW50IGluIHRoZSB3b3JkIGZvcgotYGBwcm9jZXNzZWQnJy4KLQotQSBzaW1pbGFyIHByb2JsZW0gYXBwZWFycyBhdCB0aGUgbGV2ZWwgb2Ygc2VudGVuY2Ugc3RydWN0dXJlIHdpdGggdGhpcwotY29kZToKLQotQGV4YW1wbGUKLXByaW50ZiAoIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyVzIGJlZW4gZG9uZS5cbiIsCi0gICAgICAgIGYtPnRyaWVkX2ltcGxpY2l0ID8gIiIgOiAiIG5vdCIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQWRkaW5nIEBjb2Rle2dldHRleHR9IGNhbGxzIHRvIHRoaXMgY29kZSBjYW5ub3QgZ2l2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yCi1hbGwgbGFuZ3VhZ2VzLCBiZWNhdXNlIG5lZ2F0aW9uIGluIHNvbWUgbGFuZ3VhZ2VzIHJlcXVpcmVzIGFkZGluZyB3b3JkcwotYXQgbW9yZSB0aGFuIG9uZSBwbGFjZSBpbiB0aGUgc2VudGVuY2UuICBCeSBjb250cmFzdCwgYWRkaW5nCi1AY29kZXtnZXR0ZXh0fSBjYWxscyBkb2VzIHRoZSBqb2Igc3RyYWlnaHRmb3dhcmRseSBpZiB0aGUgY29kZSBzdGFydHMKLW91dCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1wcmludGYgKGYtPnRyaWVkX2ltcGxpY2l0Ci0gICAgICAgID8gIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyBiZWVuIGRvbmUuXG4iLAotICAgICAgICA6ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgbm90IGJlZW4gZG9uZS5cbiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2RlIE1tYXAKLUBzZWN0aW9uIE1tYXAKLQotRG9uJ3QgYXNzdW1lIHRoYXQgQGNvZGV7bW1hcH0gZWl0aGVyIHdvcmtzIG9uIGFsbCBmaWxlcyBvciBmYWlscwotZm9yIGFsbCBmaWxlcy4gIEl0IG1heSB3b3JrIG9uIHNvbWUgZmlsZXMgYW5kIGZhaWwgb24gb3RoZXJzLgotCi1UaGUgcHJvcGVyIHdheSB0byB1c2UgQGNvZGV7bW1hcH0gaXMgdG8gdHJ5IGl0IG9uIHRoZSBzcGVjaWZpYyBmaWxlIGZvcgotd2hpY2ggeW91IHdhbnQgdG8gdXNlIGl0LS0tYW5kIGlmIEBjb2Rle21tYXB9IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIG9uCi1kb2luZyB0aGUgam9iIGluIGFub3RoZXIgd2F5IHVzaW5nIEBjb2Rle3JlYWR9IGFuZCBAY29kZXt3cml0ZX0uCi0KLVRoZSByZWFzb24gdGhpcyBwcmVjYXV0aW9uIGlzIG5lZWRlZCBpcyB0aGF0IHRoZSBHTlUga2VybmVsICh0aGUgSFVSRCkKLXByb3ZpZGVzIGEgdXNlci1leHRlbnNpYmxlIGZpbGUgc3lzdGVtLCBpbiB3aGljaCB0aGVyZSBjYW4gYmUgbWFueQotZGlmZmVyZW50IGtpbmRzIG9mIGBgb3JkaW5hcnkgZmlsZXMuJycgIE1hbnkgb2YgdGhlbSBzdXBwb3J0Ci1AY29kZXttbWFwfSwgYnV0IHNvbWUgZG8gbm90LiAgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgcHJvZ3JhbXMgaGFuZGxlCi1hbGwgdGhlc2Uga2luZHMgb2YgZmlsZXMuCi0KLUBub2RlIERvY3VtZW50YXRpb24KLUBjaGFwdGVyIERvY3VtZW50aW5nIFByb2dyYW1zCi0KLUBtZW51Ci0qIEdOVSBNYW51YWxzOjogICAgICAgICAgICAgICAgIFdyaXRpbmcgcHJvcGVyIG1hbnVhbHMuCi0qIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlsczo6ICAgIFNwZWNpZmljIHN0cnVjdHVyZSBjb252ZW50aW9ucy4KLSogTkVXUyBGaWxlOjogICAgICAgICAgICAgICAgICAgTkVXUyBmaWxlcyBzdXBwbGVtZW50IG1hbnVhbHMuCi0qIENoYW5nZSBMb2dzOjogICAgICAgICAgICAgICAgIFJlY29yZGluZyBDaGFuZ2VzCi0qIE1hbiBQYWdlczo6ICAgICAgICAgICAgICAgICAgIE1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LgotKiBSZWFkaW5nIG90aGVyIE1hbnVhbHM6OiAgICAgICBIb3cgZmFyIHlvdSBjYW4gZ28gaW4gbGVhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBtYW51YWxzLgotQGVuZCBtZW51Ci0KLUBub2RlIEdOVSBNYW51YWxzCi1Ac2VjdGlvbiBHTlUgTWFudWFscwotCi1UaGUgcHJlZmVycmVkIHdheSB0byBkb2N1bWVudCBwYXJ0IG9mIHRoZSBHTlUgc3lzdGVtIGlzIHRvIHdyaXRlIGEKLW1hbnVhbCBpbiB0aGUgVGV4aW5mbyBmb3JtYXR0aW5nIGxhbmd1YWdlLiAgU2VlIHRoZSBUZXhpbmZvIG1hbnVhbCwKLWVpdGhlciB0aGUgaGFyZGNvcHksIG9yIHRoZSBvbi1saW5lIHZlcnNpb24gYXZhaWxhYmxlIHRocm91Z2gKLUBjb2Rle2luZm99IG9yIHRoZSBFbWFjcyBJbmZvIHN1YnN5c3RlbSAoQGtiZHtDLWggaX0pLgotCi1Qcm9ncmFtbWVycyBvZnRlbiBmaW5kIGl0IG1vc3QgbmF0dXJhbCB0byBzdHJ1Y3R1cmUgdGhlIGRvY3VtZW50YXRpb24KLWZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdGhleSBrbm93LiAgQnV0Ci10aGlzIHN0cnVjdHVyZSBpcyBub3QgbmVjZXNzYXJpbHkgZ29vZCBmb3IgZXhwbGFpbmluZyBob3cgdG8gdXNlIHRoZQotcHJvZ3JhbTsgaXQgbWF5IGJlIGlycmVsZXZhbnQgYW5kIGNvbmZ1c2luZyBmb3IgYSB1c2VyLgotCi1BdCBldmVyeSBsZXZlbCwgZnJvbSB0aGUgc2VudGVuY2VzIGluIGEgcGFyYWdyYXBoIHRvIHRoZSBncm91cGluZyBvZgotdG9waWNzIGludG8gc2VwYXJhdGUgbWFudWFscywgdGhlIHJpZ2h0IHdheSB0byBzdHJ1Y3R1cmUgZG9jdW1lbnRhdGlvbgotaXMgYWNjb3JkaW5nIHRvIHRoZSBjb25jZXB0cyBhbmQgcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgaGF2ZSBpbiBtaW5kCi13aGVuIHJlYWRpbmcgaXQuICBTb21ldGltZXMgdGhpcyBzdHJ1Y3R1cmUgb2YgaWRlYXMgbWF0Y2hlcyB0aGUKLXN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvZnR3YXJlIGJlaW5nIGRvY3VtZW50ZWQtLS1idXQKLW9mdGVuIHRoZXkgYXJlIGRpZmZlcmVudC4gIE9mdGVuIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGxlYXJuaW5nIHRvCi13cml0ZSBnb29kIGRvY3VtZW50YXRpb24gaXMgbGVhcm5pbmcgdG8gbm90aWNlIHdoZW4geW91IGFyZSBzdHJ1Y3R1cmluZwotdGhlIGRvY3VtZW50YXRpb24gbGlrZSB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCB0aGluayBhYm91dCBiZXR0ZXIKLWFsdGVybmF0aXZlcy4KLQotRm9yIGV4YW1wbGUsIGVhY2ggcHJvZ3JhbSBpbiB0aGUgR05VIHN5c3RlbSBwcm9iYWJseSBvdWdodCB0byBiZQotZG9jdW1lbnRlZCBpbiBvbmUgbWFudWFsOyBidXQgdGhpcyBkb2VzIG5vdCBtZWFuIGVhY2ggcHJvZ3JhbSBzaG91bGQKLWhhdmUgaXRzIG93biBtYW51YWwuICBUaGF0IHdvdWxkIGJlIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZQotaW1wbGVtZW50YXRpb24sIHJhdGhlciB0aGFuIHRoZSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB0aGUgdXNlcgotdW5kZXJzdGFuZC4KLQotSW5zdGVhZCwgZWFjaCBtYW51YWwgc2hvdWxkIGNvdmVyIGEgY29oZXJlbnQgQGVtcGh7dG9waWN9LiAgRm9yIGV4YW1wbGUsCi1pbnN0ZWFkIG9mIGEgbWFudWFsIGZvciBAY29kZXtkaWZmfSBhbmQgYSBtYW51YWwgZm9yIEBjb2Rle2RpZmYzfSwgd2UKLWhhdmUgb25lIG1hbnVhbCBmb3IgYGBjb21wYXJpc29uIG9mIGZpbGVzJycgd2hpY2ggY292ZXJzIGJvdGggb2YgdGhvc2UKLXByb2dyYW1zLCBhcyB3ZWxsIGFzIEBjb2Rle2NtcH0uICBCeSBkb2N1bWVudGluZyB0aGVzZSBwcm9ncmFtcwotdG9nZXRoZXIsIHdlIGNhbiBtYWtlIHRoZSB3aG9sZSBzdWJqZWN0IGNsZWFyZXIuCi0KLVRoZSBtYW51YWwgd2hpY2ggZGlzY3Vzc2VzIGEgcHJvZ3JhbSBzaG91bGQgZG9jdW1lbnQgYWxsIG9mIHRoZQotcHJvZ3JhbSdzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBhbGwgb2YgaXRzIGNvbW1hbmRzLiAgSXQgc2hvdWxkIGdpdmUKLWV4YW1wbGVzIG9mIHRoZWlyIHVzZS4gIEJ1dCBkb24ndCBvcmdhbml6ZSB0aGUgbWFudWFsIGFzIGEgbGlzdCBvZgotZmVhdHVyZXMuICBJbnN0ZWFkLCBvcmdhbml6ZSBpdCBsb2dpY2FsbHksIGJ5IHN1YnRvcGljcy4gIEFkZHJlc3MgdGhlCi1xdWVzdGlvbnMgdGhhdCBhIHVzZXIgd2lsbCBhc2sgd2hlbiB0aGlua2luZyBhYm91dCB0aGUgam9iIHRoYXQgdGhlCi1wcm9ncmFtIGRvZXMuCi0KLUluIGdlbmVyYWwsIGEgR05VIG1hbnVhbCBzaG91bGQgc2VydmUgYm90aCBhcyB0dXRvcmlhbCBhbmQgcmVmZXJlbmNlLgotSXQgc2hvdWxkIGJlIHNldCB1cCBmb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gZWFjaCB0b3BpYyB0aHJvdWdoIEluZm8sCi1hbmQgZm9yIHJlYWRpbmcgc3RyYWlnaHQgdGhyb3VnaCAoYXBwZW5kaXhlcyBhc2lkZSkuICBBIEdOVSBtYW51YWwKLXNob3VsZCBnaXZlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gYSBiZWdpbm5lciByZWFkaW5nIHRocm91Z2ggZnJvbSB0aGUKLXN0YXJ0LCBhbmQgc2hvdWxkIGFsc28gcHJvdmlkZSBhbGwgdGhlIGRldGFpbHMgdGhhdCBoYWNrZXJzIHdhbnQuCi0KLVRoYXQgaXMgbm90IGFzIGhhcmQgYXMgaXQgZmlyc3Qgc291bmRzLiAgQXJyYW5nZSBlYWNoIGNoYXB0ZXIgYXMgYQotbG9naWNhbCBicmVha2Rvd24gb2YgaXRzIHRvcGljLCBidXQgb3JkZXIgdGhlIHNlY3Rpb25zLCBhbmQgd3JpdGUgdGhlaXIKLXRleHQsIHNvIHRoYXQgcmVhZGluZyB0aGUgY2hhcHRlciBzdHJhaWdodCB0aHJvdWdoIG1ha2VzIHNlbnNlLiAgRG8KLWxpa2V3aXNlIHdoZW4gc3RydWN0dXJpbmcgdGhlIGJvb2sgaW50byBjaGFwdGVycywgYW5kIHdoZW4gc3RydWN0dXJpbmcgYQotc2VjdGlvbiBpbnRvIHBhcmFncmFwaHMuICBUaGUgd2F0Y2h3b3JkIGlzLCBAZW1waHthdCBlYWNoIHBvaW50LCBhZGRyZXNzCi10aGUgbW9zdCBmdW5kYW1lbnRhbCBhbmQgaW1wb3J0YW50IGlzc3VlIHJhaXNlZCBieSB0aGUgcHJlY2VkaW5nIHRleHQufQotCi1JZiBuZWNlc3NhcnksIGFkZCBleHRyYSBjaGFwdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW51YWwgd2hpY2gKLWFyZSBwdXJlbHkgdHV0b3JpYWwgYW5kIGNvdmVyIHRoZSBiYXNpY3Mgb2YgdGhlIHN1YmplY3QuICBUaGVzZSBwcm92aWRlCi10aGUgZnJhbWV3b3JrIGZvciBhIGJlZ2lubmVyIHRvIHVuZGVyc3RhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hbnVhbC4gIFRoZQotQmlzb24gbWFudWFsIHByb3ZpZGVzIGEgZ29vZCBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgotCi1Eb24ndCB1c2UgVW5peCBtYW4gcGFnZXMgYXMgYSBtb2RlbCBmb3IgaG93IHRvIHdyaXRlIEdOVSBkb2N1bWVudGF0aW9uOwotbW9zdCBvZiB0aGVtIGFyZSB0ZXJzZSwgYmFkbHkgc3RydWN0dXJlZCwgYW5kIGdpdmUgaW5hZGVxdWF0ZQotZXhwbGFuYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgY29uY2VwdHMuICAoVGhlcmUgYXJlLCBvZiBjb3Vyc2UKLWV4Y2VwdGlvbnMuKSAgQWxzbyBVbml4IG1hbiBwYWdlcyB1c2UgYSBwYXJ0aWN1bGFyIGZvcm1hdCB3aGljaCBpcwotZGlmZmVyZW50IGZyb20gd2hhdCB3ZSB1c2UgaW4gR05VIG1hbnVhbHMuCi0KLVBsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgcGF0aG5hbWUnJyB0aGF0IGlzIHVzZWQgaW4gVW5peAotZG9jdW1lbnRhdGlvbjsgdXNlIGBgZmlsZSBuYW1lJycgKHR3byB3b3JkcykgaW5zdGVhZC4gIFdlIHVzZSB0aGUgdGVybQotYGBwYXRoJycgb25seSBmb3Igc2VhcmNoIHBhdGhzLCB3aGljaCBhcmUgbGlzdHMgb2YgZmlsZSBuYW1lcy4KLQotUGxlYXNlIGRvIG5vdCB1c2UgdGhlIHRlcm0gYGBpbGxlZ2FsJycgdG8gcmVmZXIgdG8gZXJyb25lb3VzIGlucHV0IHRvIGEKLWNvbXB1dGVyIHByb2dyYW0uICBQbGVhc2UgdXNlIGBgaW52YWxpZCcnIGZvciB0aGlzLCBhbmQgcmVzZXJ2ZSB0aGUgdGVybQotYGBpbGxlZ2FsJycgZm9yIHZpb2xhdGlvbnMgb2YgbGF3LgotCi1Abm9kZSBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKLUBzZWN0aW9uIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlscwotCi1UaGUgdGl0bGUgcGFnZSBvZiB0aGUgbWFudWFsIHNob3VsZCBzdGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbXMgb3IKLXBhY2thZ2VzIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbC4gIFRoZSBUb3Agbm9kZSBvZiB0aGUgbWFudWFsIHNob3VsZAotYWxzbyBjb250YWluIHRoaXMgaW5mb3JtYXRpb24uICBJZiB0aGUgbWFudWFsIGlzIGNoYW5naW5nIG1vcmUKLWZyZXF1ZW50bHkgdGhhbiBvciBpbmRlcGVuZGVudCBvZiB0aGUgcHJvZ3JhbSwgYWxzbyBzdGF0ZSBhIHZlcnNpb24KLW51bWJlciBmb3IgdGhlIG1hbnVhbCBpbiBib3RoIG9mIHRoZXNlIHBsYWNlcy4KLQotRWFjaCBwcm9ncmFtIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbCBzaG91bGQgc2hvdWxkIGhhdmUgYSBub2RlIG5hbWVkCi1Ac2FtcHtAdmFye3Byb2dyYW19IEludm9jYXRpb259IG9yIEBzYW1we0ludm9raW5nIEB2YXJ7cHJvZ3JhbX19LiAgVGhpcwotbm9kZSAodG9nZXRoZXIgd2l0aCBpdHMgc3Vibm9kZXMsIGlmIGFueSkgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ncmFtJ3MKLWNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGhvdyB0byBydW4gaXQgKHRoZSBzb3J0IG9mIGluZm9ybWF0aW9uIHBlb3BsZQotd291bGQgbG9vayBpbiBhIG1hbiBwYWdlIGZvcikuICBTdGFydCB3aXRoIGFuIEBzYW1we0BAZXhhbXBsZX0KLWNvbnRhaW5pbmcgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCB0aGUgcHJvZ3JhbQotdXNlcy4KLQotQWx0ZXJuYXRpdmVseSwgcHV0IGEgbWVudSBpdGVtIGluIHNvbWUgbWVudSB3aG9zZSBpdGVtIG5hbWUgZml0cyBvbmUgb2YKLXRoZSBhYm92ZSBwYXR0ZXJucy4gIFRoaXMgaWRlbnRpZmllcyB0aGUgbm9kZSB3aGljaCB0aGF0IGl0ZW0gcG9pbnRzIHRvCi1hcyB0aGUgbm9kZSBmb3IgdGhpcyBwdXJwb3NlLCByZWdhcmRsZXNzIG9mIHRoZSBub2RlJ3MgYWN0dWFsIG5hbWUuCi0KLVRoZXJlIHdpbGwgYmUgYXV0b21hdGljIGZlYXR1cmVzIGZvciBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSBuYW1lIGFuZAotcXVpY2tseSByZWFkaW5nIGp1c3QgdGhpcyBwYXJ0IG9mIGl0cyBtYW51YWwuCi0KLUlmIG9uZSBtYW51YWwgZGVzY3JpYmVzIHNldmVyYWwgcHJvZ3JhbXMsIGl0IHNob3VsZCBoYXZlIHN1Y2ggYSBub2RlIGZvcgotZWFjaCBwcm9ncmFtIGRlc2NyaWJlZC4KLQotQG5vZGUgTkVXUyBGaWxlCi1Ac2VjdGlvbiBUaGUgTkVXUyBGaWxlCi0KLUluIGFkZGl0aW9uIHRvIGl0cyBtYW51YWwsIHRoZSBwYWNrYWdlIHNob3VsZCBoYXZlIGEgZmlsZSBuYW1lZAotQGZpbGV7TkVXU30gd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIHVzZXItdmlzaWJsZSBjaGFuZ2VzIHdvcnRoCi1tZW50aW9uaW5nLiAgSW4gZWFjaCBuZXcgcmVsZWFzZSwgYWRkIGl0ZW1zIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBhbmQKLWlkZW50aWZ5IHRoZSB2ZXJzaW9uIHRoZXkgcGVydGFpbiB0by4gIERvbid0IGRpc2NhcmQgb2xkIGl0ZW1zOyBsZWF2ZQotdGhlbSBpbiB0aGUgZmlsZSBhZnRlciB0aGUgbmV3ZXIgaXRlbXMuICBUaGlzIHdheSwgYSB1c2VyIHVwZ3JhZGluZyBmcm9tCi1hbnkgcHJldmlvdXMgdmVyc2lvbiBjYW4gc2VlIHdoYXQgaXMgbmV3LgotCi1JZiB0aGUgQGZpbGV7TkVXU30gZmlsZSBnZXRzIHZlcnkgbG9uZywgbW92ZSBzb21lIG9mIHRoZSBvbGRlciBpdGVtcwotaW50byBhIGZpbGUgbmFtZWQgQGZpbGV7T05FV1N9IGFuZCBwdXQgYSBub3RlIGF0IHRoZSBlbmQgcmVmZXJyaW5nIHRoZQotdXNlciB0byB0aGF0IGZpbGUuCi0KLUBub2RlIENoYW5nZSBMb2dzCi1Ac2VjdGlvbiBDaGFuZ2UgTG9ncwotCi1LZWVwIGEgY2hhbmdlIGxvZyB0byBkZXNjcmliZSBhbGwgdGhlIGNoYW5nZXMgbWFkZSB0byBwcm9ncmFtIHNvdXJjZQotZmlsZXMuICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlIGludmVzdGlnYXRpbmcgYnVncyBpbiB0aGUKLWZ1dHVyZSB3aWxsIGtub3cgYWJvdXQgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGludHJvZHVjZWQgdGhlIGJ1Zy4KLU9mdGVuIGEgbmV3IGJ1ZyBjYW4gYmUgZm91bmQgYnkgbG9va2luZyBhdCB3aGF0IHdhcyByZWNlbnRseSBjaGFuZ2VkLgotTW9yZSBpbXBvcnRhbnRseSwgY2hhbmdlIGxvZ3MgY2FuIGhlbHAgeW91IGVsaW1pbmF0ZSBjb25jZXB0dWFsCi1pbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBieSBnaXZpbmcgeW91IGEKLWhpc3Rvcnkgb2YgaG93IHRoZSBjb25mbGljdGluZyBjb25jZXB0cyBhcm9zZSBhbmQgd2hvIHRoZXkgY2FtZSBmcm9tLgotCi1AbWVudQotKiBDaGFuZ2UgTG9nIENvbmNlcHRzOjogICAgICAgICAKLSogU3R5bGUgb2YgQ2hhbmdlIExvZ3M6OiAgICAgICAgCi0qIFNpbXBsZSBDaGFuZ2VzOjogICAgICAgICAgICAgIAotKiBDb25kaXRpb25hbCBDaGFuZ2VzOjogICAgICAgICAKLUBlbmQgbWVudQotCi1Abm9kZSBDaGFuZ2UgTG9nIENvbmNlcHRzCi1Ac3Vic2VjdGlvbiBDaGFuZ2UgTG9nIENvbmNlcHRzCi0KLVlvdSBjYW4gdGhpbmsgb2YgdGhlIGNoYW5nZSBsb2cgYXMgYSBjb25jZXB0dWFsIGBgdW5kbyBsaXN0Jycgd2hpY2gKLWV4cGxhaW5zIGhvdyBlYXJsaWVyIHZlcnNpb25zIHdlcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbi4KLVBlb3BsZSBjYW4gc2VlIHRoZSBjdXJyZW50IHZlcnNpb247IHRoZXkgZG9uJ3QgbmVlZCB0aGUgY2hhbmdlIGxvZwotdG8gdGVsbCB0aGVtIHdoYXQgaXMgaW4gaXQuICBXaGF0IHRoZXkgd2FudCBmcm9tIGEgY2hhbmdlIGxvZyBpcyBhCi1jbGVhciBleHBsYW5hdGlvbiBvZiBob3cgdGhlIGVhcmxpZXIgdmVyc2lvbiBkaWZmZXJlZC4KLQotVGhlIGNoYW5nZSBsb2cgZmlsZSBpcyBub3JtYWxseSBjYWxsZWQgQGZpbGV7Q2hhbmdlTG9nfSBhbmQgY292ZXJzIGFuCi1lbnRpcmUgZGlyZWN0b3J5LiAgRWFjaCBkaXJlY3RvcnkgY2FuIGhhdmUgaXRzIG93biBjaGFuZ2UgbG9nLCBvciBhCi1kaXJlY3RvcnkgY2FuIHVzZSB0aGUgY2hhbmdlIGxvZyBvZiBpdHMgcGFyZW50IGRpcmVjdG9yeS0taXQncyB1cCB0bwoteW91LgotCi1Bbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIHJlY29yZCBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHdpdGggYSB2ZXJzaW9uCi1jb250cm9sIHN5c3RlbSBzdWNoIGFzIFJDUyBvciBDVlMuICBUaGlzIGNhbiBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseQotdG8gYSBAZmlsZXtDaGFuZ2VMb2d9IGZpbGUuCi0KLVRoZXJlJ3Mgbm8gbmVlZCB0byBkZXNjcmliZSB0aGUgZnVsbCBwdXJwb3NlIG9mIHRoZSBjaGFuZ2VzIG9yIGhvdyB0aGV5Ci13b3JrIHRvZ2V0aGVyLiAgSWYgeW91IHRoaW5rIHRoYXQgYSBjaGFuZ2UgY2FsbHMgZm9yIGV4cGxhbmF0aW9uLCB5b3UncmUKLXByb2JhYmx5IHJpZ2h0LiAgUGxlYXNlIGRvIGV4cGxhaW4gaXQtLS1idXQgcGxlYXNlIHB1dCB0aGUgZXhwbGFuYXRpb24KLWluIGNvbW1lbnRzIGluIHRoZSBjb2RlLCB3aGVyZSBwZW9wbGUgd2lsbCBzZWUgaXQgd2hlbmV2ZXIgdGhleSBzZWUgdGhlCi1jb2RlLiAgRm9yIGV4YW1wbGUsIGBgTmV3IGZ1bmN0aW9uJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZyB3aGVuCi15b3UgYWRkIGEgZnVuY3Rpb24sIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBiZWZvcmUgdGhlCi1mdW5jdGlvbiBkZWZpbml0aW9uIHRvIGV4cGxhaW4gd2hhdCBpdCBkb2VzLgotCi1Ib3dldmVyLCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIHdyaXRlIG9uZSBsaW5lIHRvIGRlc2NyaWJlIHRoZQotb3ZlcmFsbCBwdXJwb3NlIG9mIGEgYmF0Y2ggb2YgY2hhbmdlcy4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFkZCBhbiBlbnRyeSB0byBAZmlsZXtDaGFuZ2VMb2d9IGlzIHdpdGggdGhlIEVtYWNzCi1jb21tYW5kIEBrYmR7TS14IGFkZC1jaGFuZ2UtbG9nLWVudHJ5fS4gIEFuIGVudHJ5IHNob3VsZCBoYXZlIGFuCi1hc3RlcmlzaywgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgZmlsZSwgYW5kIHRoZW4gaW4gcGFyZW50aGVzZXMgdGhlIG5hbWUKLW9mIHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzIG9yIHdoYXRldmVyLCBmb2xsb3dlZCBieSBhIGNvbG9uLgotVGhlbiBkZXNjcmliZSB0aGUgY2hhbmdlcyB5b3UgbWFkZSB0byB0aGF0IGZ1bmN0aW9uIG9yIHZhcmlhYmxlLgotCi1Abm9kZSBTdHlsZSBvZiBDaGFuZ2UgTG9ncwotQHN1YnNlY3Rpb24gU3R5bGUgb2YgQ2hhbmdlIExvZ3MKLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBjaGFuZ2UgbG9nIGVudHJpZXM6Ci0KLUBleGFtcGxlCi0qIHJlZ2lzdGVyLmVsIChpbnNlcnQtcmVnaXN0ZXIpOiBSZXR1cm4gbmlsLgotKGp1bXAtdG8tcmVnaXN0ZXIpOiBMaWtld2lzZS4KLQotKiBzb3J0LmVsIChzb3J0LXN1YnIpOiBSZXR1cm4gbmlsLgotCi0qIHRleC1tb2RlLmVsICh0ZXgtYmlidGV4LWZpbGUsIHRleC1maWxlLCB0ZXgtcmVnaW9uKToKLVJlc3RhcnQgdGhlIHRleCBzaGVsbCBpZiBwcm9jZXNzIGlzIGdvbmUgb3Igc3RvcHBlZC4KLSh0ZXgtc2hlbGwtcnVubmluZyk6IE5ldyBmdW5jdGlvbi4KLQotKiBleHByLmMgKHN0b3JlX29uZV9hcmcpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX3RvX3JlZy4KLShleHBhbmRfY2FsbCk6IFJvdW5kIHVwIHdoZW4gZW1pdHRpbmcgVVNFIGluc25zLgotKiBzdG10LmMgKGFzc2lnbl9wYXJtcyk6IFJvdW5kIHNpemUgdXAgZm9yIG1vdmVfYmxvY2tfZnJvbV9yZWcuCi1AZW5kIGV4YW1wbGUKLQotSXQncyBpbXBvcnRhbnQgdG8gbmFtZSB0aGUgY2hhbmdlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBpbiBmdWxsLiAgRG9uJ3QKLWFiYnJldmlhdGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgbmFtZXMsIGFuZCBkb24ndCBjb21iaW5lIHRoZW0uCi1TdWJzZXF1ZW50IG1haW50YWluZXJzIHdpbGwgb2Z0ZW4gc2VhcmNoIGZvciBhIGZ1bmN0aW9uIG5hbWUgdG8gZmluZCBhbGwKLXRoZSBjaGFuZ2UgbG9nIGVudHJpZXMgdGhhdCBwZXJ0YWluIHRvIGl0OyBpZiB5b3UgYWJicmV2aWF0ZSB0aGUgbmFtZSwKLXRoZXkgd29uJ3QgZmluZCBpdCB3aGVuIHRoZXkgc2VhcmNoLgotCi1Gb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgYXJlIHRlbXB0ZWQgdG8gYWJicmV2aWF0ZSBncm91cHMgb2YgZnVuY3Rpb24KLW5hbWVzIGJ5IHdyaXRpbmcgQHNhbXB7KiByZWdpc3Rlci5lbCAoQHtpbnNlcnQsanVtcC10b0B9LXJlZ2lzdGVyKX07Ci10aGlzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2Ugc2VhcmNoaW5nIGZvciBAY29kZXtqdW1wLXRvLXJlZ2lzdGVyfSBvcgotQGNvZGV7aW5zZXJ0LXJlZ2lzdGVyfSB3b3VsZCBub3QgZmluZCB0aGF0IGVudHJ5LgotCi1TZXBhcmF0ZSB1bnJlbGF0ZWQgY2hhbmdlIGxvZyBlbnRyaWVzIHdpdGggYmxhbmsgbGluZXMuICBXaGVuIHR3bwotZW50cmllcyByZXByZXNlbnQgcGFydHMgb2YgdGhlIHNhbWUgY2hhbmdlLCBzbyB0aGF0IHRoZXkgd29yayB0b2dldGhlciwKLXRoZW4gZG9uJ3QgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gdGhlbS4gIFRoZW4geW91IGNhbiBvbWl0IHRoZSBmaWxlCi1uYW1lIGFuZCB0aGUgYXN0ZXJpc2sgd2hlbiBzdWNjZXNzaXZlIGVudHJpZXMgYXJlIGluIHRoZSBzYW1lIGZpbGUuCi0KLUBub2RlIFNpbXBsZSBDaGFuZ2VzCi1Ac3Vic2VjdGlvbiBTaW1wbGUgQ2hhbmdlcwotCi1DZXJ0YWluIHNpbXBsZSBraW5kcyBvZiBjaGFuZ2VzIGRvbid0IG5lZWQgbXVjaCBkZXRhaWwgaW4gdGhlIGNoYW5nZQotbG9nLgotCi1XaGVuIHlvdSBjaGFuZ2UgdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YgYSBmdW5jdGlvbiBpbiBhIHNpbXBsZSBmYXNoaW9uLAotYW5kIHlvdSBjaGFuZ2UgYWxsIHRoZSBjYWxsZXJzIG9mIHRoZSBmdW5jdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlCi1pbmRpdmlkdWFsIGVudHJpZXMgZm9yIGFsbCB0aGUgY2FsbGVycyB0aGF0IHlvdSBjaGFuZ2VkLiAgSnVzdCB3cml0ZSBpbgotdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBgYEFsbCBjYWxsZXJzIGNoYW5nZWQuJycKLQotQGV4YW1wbGUKLSoga2V5Ym9hcmQuYyAoRmNvbW1hbmRfZXhlY3V0ZSk6IE5ldyBhcmcgU1BFQ0lBTC4KLUFsbCBjYWxsZXJzIGNoYW5nZWQuCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3UgY2hhbmdlIGp1c3QgY29tbWVudHMgb3IgZG9jIHN0cmluZ3MsIGl0IGlzIGVub3VnaCB0byB3cml0ZSBhbgotZW50cnkgZm9yIHRoZSBmaWxlLCB3aXRob3V0IG1lbnRpb25pbmcgdGhlIGZ1bmN0aW9ucy4gIEp1c3QgYGBEb2MKLWZpeGVzJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZy4KLQotVGhlcmUncyBubyBuZWVkIHRvIG1ha2UgY2hhbmdlIGxvZyBlbnRyaWVzIGZvciBkb2N1bWVudGF0aW9uIGZpbGVzLgotVGhpcyBpcyBiZWNhdXNlIGRvY3VtZW50YXRpb24gaXMgbm90IHN1c2NlcHRpYmxlIHRvIGJ1Z3MgdGhhdCBhcmUgaGFyZAotdG8gZml4LiAgRG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBjb25zaXN0IG9mIHBhcnRzIHRoYXQgbXVzdCBpbnRlcmFjdCBpbiBhCi1wcmVjaXNlbHkgZW5naW5lZXJlZCBmYXNoaW9uLiAgVG8gY29ycmVjdCBhbiBlcnJvciwgeW91IG5lZWQgbm90IGtub3cKLXRoZSBoaXN0b3J5IG9mIHRoZSBlcnJvbmVvdXMgcGFzc2FnZTsgaXQgaXMgZW5vdWdoIHRvIGNvbXBhcmUgd2hhdCB0aGUKLWRvY3VtZW50YXRpb24gc2F5cyB3aXRoIHRoZSB3YXkgdGhlIHByb2dyYW0gYWN0dWFsbHkgd29ya3MuCi0KLUBub2RlIENvbmRpdGlvbmFsIENoYW5nZXMKLUBzdWJzZWN0aW9uIENvbmRpdGlvbmFsIENoYW5nZXMKLQotQyBwcm9ncmFtcyBvZnRlbiBjb250YWluIGNvbXBpbGUtdGltZSBAY29kZXsjaWZ9IGNvbmRpdGlvbmFscy4gIE1hbnkKLWNoYW5nZXMgYXJlIGNvbmRpdGlvbmFsOyBzb21ldGltZXMgeW91IGFkZCBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzCi1lbnRpcmVseSBjb250YWluZWQgaW4gYSBjb25kaXRpb25hbC4gIEl0IGlzIHZlcnkgdXNlZnVsIHRvIGluZGljYXRlIGluCi10aGUgY2hhbmdlIGxvZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hpY2ggdGhlIGNoYW5nZSBhcHBsaWVzLgotCi1PdXIgY29udmVudGlvbiBmb3IgaW5kaWNhdGluZyBjb25kaXRpb25hbCBjaGFuZ2VzIGlzIHRvIHVzZSBzcXVhcmUKLWJyYWNrZXRzIGFyb3VuZCB0aGUgbmFtZSBvZiB0aGUgY29uZGl0aW9uLgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUsIGRlc2NyaWJpbmcgYSBjaGFuZ2Ugd2hpY2ggaXMgY29uZGl0aW9uYWwgYnV0Ci1kb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gb3IgZW50aXR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0OgotCi1AZXhhbXBsZQotKiB4dGVybS5jIFtTT0xBUklTMl06IEluY2x1ZGUgc3RyaW5nLmguCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBkZXNjcmliaW5nIGEgbmV3IGRlZmluaXRpb24gd2hpY2ggaXMgZW50aXJlbHkKLWNvbmRpdGlvbmFsLiAgVGhpcyBuZXcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hY3JvIEBjb2Rle0ZSQU1FX1dJTkRPV19QfSBpcwotdXNlZCBvbmx5IHdoZW4gQGNvZGV7SEFWRV9YX1dJTkRPV1N9IGlzIGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0qIGZyYW1lLmggW0hBVkVfWF9XSU5ET1dTXSAoRlJBTUVfV0lORE9XX1ApOiBNYWNybyBkZWZpbmVkLgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZm9yIGEgY2hhbmdlIHdpdGhpbiB0aGUgZnVuY3Rpb24gQGNvZGV7aW5pdF9kaXNwbGF5fSwKLXdob3NlIGRlZmluaXRpb24gYXMgYSB3aG9sZSBpcyB1bmNvbmRpdGlvbmFsLCBidXQgdGhlIGNoYW5nZXMgdGhlbXNlbHZlcwotYXJlIGNvbnRhaW5lZCBpbiBhIEBzYW1weyNpZmRlZiBIQVZFX0xJQk5DVVJTRVN9IGNvbmRpdGlvbmFsOgotCi1AZXhhbXBsZQotKiBkaXNwbmV3LmMgKGluaXRfZGlzcGxheSkgW0hBVkVfTElCTkNVUlNFU106IElmIFgsIGNhbGwgdGdldGVudC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB0aGF0IHRha2VzIGFmZmVjdCBvbmx5IHdoZW4KLWEgY2VydGFpbiBtYWNybyBpcyBAZW1waHtub3R9IGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0oZ2V0aG9zdG5hbWUpIFshSEFWRV9TT0NLRVRTXTogUmVwbGFjZSB3aXRoIHdpbnNvY2sgdmVyc2lvbi4KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBNYW4gUGFnZXMKLUBzZWN0aW9uIE1hbiBQYWdlcwotCi1JbiB0aGUgR05VIHByb2plY3QsIG1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBvcgotZXhwZWN0ZWQgZm9yIGV2ZXJ5IEdOVSBwcm9ncmFtIHRvIGhhdmUgYSBtYW4gcGFnZSwgYnV0IHNvbWUgb2YgdGhlbSBkby4KLUl0J3MgeW91ciBjaG9pY2Ugd2hldGhlciB0byBpbmNsdWRlIGEgbWFuIHBhZ2UgaW4geW91ciBwcm9ncmFtLgotCi1XaGVuIHlvdSBtYWtlIHRoaXMgZGVjaXNpb24sIGNvbnNpZGVyIHRoYXQgc3VwcG9ydGluZyBhIG1hbiBwYWdlCi1yZXF1aXJlcyBjb250aW51YWwgZWZmb3J0IGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBpcyBjaGFuZ2VkLiAgVGhlIHRpbWUKLXlvdSBzcGVuZCBvbiB0aGUgbWFuIHBhZ2UgaXMgdGltZSB0YWtlbiBhd2F5IGZyb20gbW9yZSB1c2VmdWwgd29yay4KLQotRm9yIGEgc2ltcGxlIHByb2dyYW0gd2hpY2ggY2hhbmdlcyBsaXR0bGUsIHVwZGF0aW5nIHRoZSBtYW4gcGFnZSBtYXkgYmUKLWEgc21hbGwgam9iLiAgVGhlbiB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIG5vdCB0byBpbmNsdWRlIGEgbWFuIHBhZ2UsIGlmCi15b3UgaGF2ZSBvbmUuCi0KLUZvciBhIGxhcmdlIHByb2dyYW0gdGhhdCBjaGFuZ2VzIGEgZ3JlYXQgZGVhbCwgdXBkYXRpbmcgYSBtYW4gcGFnZSBtYXkKLWJlIGEgc3Vic3RhbnRpYWwgYnVyZGVuLiAgSWYgYSB1c2VyIG9mZmVycyB0byBkb25hdGUgYSBtYW4gcGFnZSwgeW91IG1heQotZmluZCB0aGlzIGdpZnQgY29zdGx5IHRvIGFjY2VwdC4gIEl0IG1heSBiZSBiZXR0ZXIgdG8gcmVmdXNlIHRoZSBtYW4KLXBhZ2UgdW5sZXNzIHRoZSBzYW1lIHBlcnNvbiBhZ3JlZXMgdG8gdGFrZSBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvcgotbWFpbnRhaW5pbmcgaXQtLS1zbyB0aGF0IHlvdSBjYW4gd2FzaCB5b3VyIGhhbmRzIG9mIGl0IGVudGlyZWx5LiAgSWYKLXRoaXMgdm9sdW50ZWVyIGxhdGVyIGNlYXNlcyB0byBkbyB0aGUgam9iLCB0aGVuIGRvbid0IGZlZWwgb2JsaWdlZCB0bwotcGljayBpdCB1cCB5b3Vyc2VsZjsgaXQgbWF5IGJlIGJldHRlciB0byB3aXRoZHJhdyB0aGUgbWFuIHBhZ2UgZnJvbSB0aGUKLWRpc3RyaWJ1dGlvbiB1bnRpbCBzb21lb25lIGVsc2UgYWdyZWVzIHRvIHVwZGF0ZSBpdC4KLQotV2hlbiBhIHByb2dyYW0gY2hhbmdlcyBvbmx5IGEgbGl0dGxlLCB5b3UgbWF5IGZlZWwgdGhhdCB0aGUKLWRpc2NyZXBhbmNpZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBtYW4gcGFnZSByZW1haW5zIHVzZWZ1bCB3aXRob3V0Ci11cGRhdGluZy4gIElmIHNvLCBwdXQgYSBwcm9taW5lbnQgbm90ZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hbgotcGFnZSBleHBsYWluaW5nIHRoYXQgeW91IGRvbid0IG1haW50YWluIGl0IGFuZCB0aGF0IHRoZSBUZXhpbmZvIG1hbnVhbAotaXMgbW9yZSBhdXRob3JpdGF0aXZlLiAgVGhlIG5vdGUgc2hvdWxkIHNheSBob3cgdG8gYWNjZXNzIHRoZSBUZXhpbmZvCi1kb2N1bWVudGF0aW9uLgotCi1Abm9kZSBSZWFkaW5nIG90aGVyIE1hbnVhbHMKLUBzZWN0aW9uIFJlYWRpbmcgb3RoZXIgTWFudWFscwotCi1UaGVyZSBtYXkgYmUgbm9uLWZyZWUgYm9va3Mgb3IgZG9jdW1lbnRhdGlvbiBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZQotcHJvZ3JhbSB5b3UgYXJlIGRvY3VtZW50aW5nLgotCi1JdCBpcyBvayB0byB1c2UgdGhlc2UgZG9jdW1lbnRzIGZvciByZWZlcmVuY2UsIGp1c3QgYXMgdGhlIGF1dGhvciBvZiBhCi1uZXcgYWxnZWJyYSB0ZXh0Ym9vayBjYW4gcmVhZCBvdGhlciBib29rcyBvbiBhbGdlYnJhLiAgQSBsYXJnZSBwb3J0aW9uCi1vZiBhbnkgbm9uLWZpY3Rpb24gYm9vayBjb25zaXN0cyBvZiBmYWN0cywgaW4gdGhpcyBjYXNlIGZhY3RzIGFib3V0IGhvdwotYSBjZXJ0YWluIHByb2dyYW0gd29ya3MsIGFuZCB0aGVzZSBmYWN0cyBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUgZm9yCi1ldmVyeW9uZSB3aG8gd3JpdGVzIGFib3V0IHRoZSBzdWJqZWN0LiAgQnV0IGJlIGNhcmVmdWwgbm90IHRvIGNvcHkgeW91cgotb3V0bGluZSBzdHJ1Y3R1cmUsIHdvcmRpbmcsIHRhYmxlcyBvciBleGFtcGxlcyBmcm9tIHByZWV4aXN0aW5nIG5vbi1mcmVlCi1kb2N1bWVudGF0aW9uLiAgQ29weWluZyBmcm9tIGZyZWUgZG9jdW1lbnRhdGlvbiBtYXkgYmUgb2s7IHBsZWFzZSBjaGVjawotd2l0aCB0aGUgRlNGIGFib3V0IHRoZSBpbmRpdmlkdWFsIGNhc2UuCi0KLUBub2RlIE1hbmFnaW5nIFJlbGVhc2VzCi1AY2hhcHRlciBUaGUgUmVsZWFzZSBQcm9jZXNzCi0KLU1ha2luZyBhIHJlbGVhc2UgaXMgbW9yZSB0aGFuIGp1c3QgYnVuZGxpbmcgdXAgeW91ciBzb3VyY2UgZmlsZXMgaW4gYQotdGFyIGZpbGUgYW5kIHB1dHRpbmcgaXQgdXAgZm9yIEZUUC4gIFlvdSBzaG91bGQgc2V0IHVwIHlvdXIgc29mdHdhcmUgc28KLXRoYXQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIGEgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgWW91ciBNYWtlZmlsZQotc2hvdWxkIGNvbmZvcm0gdG8gdGhlIEdOVSBzdGFuZGFyZHMgZGVzY3JpYmVkIGJlbG93LCBhbmQgeW91ciBkaXJlY3RvcnkKLWxheW91dCBzaG91bGQgYWxzbyBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZHMgZGlzY3Vzc2VkIGJlbG93LiAgRG9pbmcgc28KLW1ha2VzIGl0IGVhc3kgdG8gaW5jbHVkZSB5b3VyIHBhY2thZ2UgaW50byB0aGUgbGFyZ2VyIGZyYW1ld29yayBvZgotYWxsIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbjo6ICAgICAgICAgICAgICAgSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKLSogTWFrZWZpbGUgQ29udmVudGlvbnM6OglNYWtlZmlsZSBDb252ZW50aW9ucwotKiBSZWxlYXNlczo6ICAgICAgICAgICAgICAgICAgICBNYWtpbmcgUmVsZWFzZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDb25maWd1cmF0aW9uCi1Ac2VjdGlvbiBIb3cgQ29uZmlndXJhdGlvbiBTaG91bGQgV29yawotCi1FYWNoIEdOVSBkaXN0cmlidXRpb24gc2hvdWxkIGNvbWUgd2l0aCBhIHNoZWxsIHNjcmlwdCBuYW1lZAotQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc2NyaXB0IGlzIGdpdmVuIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUKLWtpbmQgb2YgbWFjaGluZSBhbmQgc3lzdGVtIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHByb2dyYW0gZm9yLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgbXVzdCByZWNvcmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzbwotdGhhdCB0aGV5IGFmZmVjdCBjb21waWxhdGlvbi4KLQotT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2UgYSBsaW5rIGZyb20gYSBzdGFuZGFyZCBuYW1lIHN1Y2ggYXMKLUBmaWxle2NvbmZpZy5ofSB0byB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGNob3NlbiBzeXN0ZW0uCi1JZiB5b3UgdXNlIHRoaXMgdGVjaG5pcXVlLCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBAZW1waHtub3R9IGNvbnRhaW4gYQotZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuaH0uICBUaGlzIGlzIHNvIHRoYXQgcGVvcGxlIHdvbid0IGJlIGFibGUgdG8KLWJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUFub3RoZXIgdGhpbmcgdGhhdCBAY29kZXtjb25maWd1cmV9IGNhbiBkbyBpcyB0byBlZGl0IHRoZSBNYWtlZmlsZS4gIElmCi15b3UgZG8gdGhpcywgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEgZmlsZSBuYW1lZAotQGZpbGV7TWFrZWZpbGV9LiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluY2x1ZGUgYSBmaWxlIEBmaWxle01ha2VmaWxlLmlufSB3aGljaAotY29udGFpbnMgdGhlIGlucHV0IHVzZWQgZm9yIGVkaXRpbmcuICBPbmNlIGFnYWluLCB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlCi13b24ndCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUlmIEBjb2Rle2NvbmZpZ3VyZX0gZG9lcyB3cml0ZSB0aGUgQGZpbGV7TWFrZWZpbGV9LCB0aGVuIEBmaWxle01ha2VmaWxlfQotc2hvdWxkIGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7TWFrZWZpbGV9IHdoaWNoIGNhdXNlcyBAY29kZXtjb25maWd1cmV9Ci10byBiZSByZXJ1biwgc2V0dGluZyB1cCB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHNldCB1cCBsYXN0Ci10aW1lLiAgVGhlIGZpbGVzIHRoYXQgQGNvZGV7Y29uZmlndXJlfSByZWFkcyBzaG91bGQgYmUgbGlzdGVkIGFzCi1kZXBlbmRlbmNpZXMgb2YgQGZpbGV7TWFrZWZpbGV9LgotCi1BbGwgdGhlIGZpbGVzIHdoaWNoIGFyZSBvdXRwdXQgZnJvbSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkCi1oYXZlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgZXhwbGFpbmluZyB0aGF0IHRoZXkgd2VyZSBnZW5lcmF0ZWQKLWF1dG9tYXRpY2FsbHkgdXNpbmcgQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgaXMgc28gdGhhdCB1c2VycyB3b24ndCB0aGluawotb2YgdHJ5aW5nIHRvIGVkaXQgdGhlbSBieSBoYW5kLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIHdyaXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfQotd2hpY2ggZGVzY3JpYmVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCB3aGVuIHRoZQotcHJvZ3JhbSB3YXMgbGFzdCBjb25maWd1cmVkLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBhIHNoZWxsIHNjcmlwdCB3aGljaCwKLWlmIHJ1biwgd2lsbCByZWNyZWF0ZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFjY2VwdCBhbiBvcHRpb24gb2YgdGhlIGZvcm0KLUBzYW1wey0tc3JjZGlyPUB2YXJ7ZGlybmFtZX19IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3VyY2VzIGFyZSBmb3VuZAotKGlmIGl0IGlzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBidWlsZAotdGhlIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHNvIHRoYXQgdGhlIGFjdHVhbCBzb3VyY2UgZGlyZWN0b3J5Ci1pcyBub3QgbW9kaWZpZWQuCi0KLUlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgQHNhbXB7LS1zcmNkaXJ9LCB0aGVuIEBjb2Rle2NvbmZpZ3VyZX0gc2hvdWxkCi1jaGVjayBib3RoIEBmaWxley59IGFuZCBAZmlsZXsuLn0gdG8gc2VlIGlmIGl0IGNhbiBmaW5kIHRoZSBzb3VyY2VzLiAgSWYKLWl0IGZpbmRzIHRoZSBzb3VyY2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMsIGl0IHNob3VsZCB1c2UgdGhlbSBmcm9tCi10aGVyZS4gIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJlcG9ydCB0aGF0IGl0IGNhbm5vdCBmaW5kIHRoZSBzb3VyY2VzLCBhbmQKLXNob3VsZCBleGl0IHdpdGggbm9uemVybyBzdGF0dXMuCi0KLVVzdWFsbHkgdGhlIGVhc3kgd2F5IHRvIHN1cHBvcnQgQHNhbXB7LS1zcmNkaXJ9IGlzIGJ5IGVkaXRpbmcgYQotZGVmaW5pdGlvbiBvZiBAY29kZXtWUEFUSH0gaW50byB0aGUgTWFrZWZpbGUuICBTb21lIHJ1bGVzIG1heSBuZWVkIHRvCi1yZWZlciBleHBsaWNpdGx5IHRvIHRoZSBzcGVjaWZpZWQgc291cmNlIGRpcmVjdG9yeS4gIFRvIG1ha2UgdGhpcwotcG9zc2libGUsIEBjb2Rle2NvbmZpZ3VyZX0gY2FuIGFkZCB0byB0aGUgTWFrZWZpbGUgYSB2YXJpYWJsZSBuYW1lZAotQGNvZGV7c3JjZGlyfSB3aG9zZSB2YWx1ZSBpcyBwcmVjaXNlbHkgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgYWxzbyB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyB0aGUKLXR5cGUgb2Ygc3lzdGVtIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIGZvci4gIFRoaXMgYXJndW1lbnQgc2hvdWxkIGxvb2sgbGlrZQotdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7Y3B1fS1AdmFye2NvbXBhbnl9LUB2YXJ7c3lzdGVtfQotQGVuZCBleGFtcGxlCi0KLUZvciBleGFtcGxlLCBhIFN1biAzIG1pZ2h0IGJlIEBzYW1we202OGstc3VuLXN1bm9zNC4xfS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG5lZWRzIHRvIGJlIGFibGUgdG8gZGVjb2RlIGFsbCBwbGF1c2libGUKLWFsdGVybmF0aXZlcyBmb3IgaG93IHRvIGRlc2NyaWJlIGEgbWFjaGluZS4gIFRodXMsIEBzYW1we3N1bjMtc3Vub3M0LjF9Ci13b3VsZCBiZSBhIHZhbGlkIGFsaWFzLiAgRm9yIG1hbnkgcHJvZ3JhbXMsIEBzYW1we3ZheC1kZWMtdWx0cml4fSB3b3VsZAotYmUgYW4gYWxpYXMgZm9yIEBzYW1we3ZheC1kZWMtYnNkfSwgc2ltcGx5IGJlY2F1c2UgdGhlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIFVsdHJpeCBhbmQgQHNje0JTRH0gYXJlIHJhcmVseSBub3RpY2VhYmxlLCBidXQgYSBmZXcgcHJvZ3JhbXMKLW1pZ2h0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KLUBjIFJlYWwgNC40QlNEIG5vdyBydW5zIG9uIHNvbWUgU3Vucy4KLQotVGhlcmUgaXMgYSBzaGVsbCBzY3JpcHQgY2FsbGVkIEBmaWxle2NvbmZpZy5zdWJ9IHRoYXQgeW91IGNhbiB1c2UKLWFzIGEgc3Vicm91dGluZSB0byB2YWxpZGF0ZSBzeXN0ZW0gdHlwZXMgYW5kIGNhbm9uaWNhbGl6ZSBhbGlhc2VzLgotCi1PdGhlciBvcHRpb25zIGFyZSBwZXJtaXR0ZWQgdG8gc3BlY2lmeSBpbiBtb3JlIGRldGFpbCB0aGUgc29mdHdhcmUKLW9yIGhhcmR3YXJlIHByZXNlbnQgb24gdGhlIG1hY2hpbmUsIGFuZCBpbmNsdWRlIG9yIGV4Y2x1ZGUgb3B0aW9uYWwKLXBhcnRzIG9mIHRoZSBwYWNrYWdlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0tZW5hYmxlLUB2YXJ7ZmVhdHVyZX1AcntbfT1AdmFye3BhcmFtZXRlcn1AcntdfQotQ29uZmlndXJlIHRoZSBwYWNrYWdlIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9wdGlvbmFsIHVzZXItbGV2ZWwKLWZhY2lsaXR5IGNhbGxlZCBAdmFye2ZlYXR1cmV9LiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2hvb3NlIHdoaWNoCi1vcHRpb25hbCBmZWF0dXJlcyB0byBpbmNsdWRlLiAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7ZmVhdHVyZX0sIGlmIGl0IGlzIGJ1aWx0IGJ5IGRlZmF1bHQuCi0KLU5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIEBzdHJvbmd7ZXZlcn0gY2F1c2Ugb25lIGZlYXR1cmUgdG8KLXJlcGxhY2UgYW5vdGhlci4gIE5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIGV2ZXIgc3Vic3RpdHV0ZSBvbmUKLXVzZWZ1bCBiZWhhdmlvciBmb3IgYW5vdGhlciB1c2VmdWwgYmVoYXZpb3IuICBUaGUgb25seSBwcm9wZXIgdXNlIGZvcgotQHNhbXB7LS1lbmFibGV9IGlzIGZvciBxdWVzdGlvbnMgb2Ygd2hldGhlciB0byBidWlsZCBwYXJ0IG9mIHRoZSBwcm9ncmFtCi1vciBleGNsdWRlIGl0LgotCi1AaXRlbSAtLXdpdGgtQHZhcntwYWNrYWdlfQotQGMgQHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KLVRoZSBwYWNrYWdlIEB2YXJ7cGFja2FnZX0gd2lsbCBiZSBpbnN0YWxsZWQsIHNvIGNvbmZpZ3VyZSB0aGlzIHBhY2thZ2UKLXRvIHdvcmsgd2l0aCBAdmFye3BhY2thZ2V9LgotCi1AYyAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQGMgQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7cGFja2FnZX0sIGlmIGl0IGlzIHVzZWQgYnkgZGVmYXVsdC4KLQotUG9zc2libGUgdmFsdWVzIG9mIEB2YXJ7cGFja2FnZX0gaW5jbHVkZSAKLUBzYW1we2dudS1hc30gKG9yIEBzYW1we2dhc30pLCBAc2FtcHtnbnUtbGR9LCBAc2FtcHtnbnUtbGliY30sCi1Ac2FtcHtnZGJ9LAotQHNhbXB7eH0sIAotYW5kCi1Ac2FtcHt4LXRvb2xraXR9LgotCi1EbyBub3QgdXNlIGEgQHNhbXB7LS13aXRofSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIHRvIHVzZSB0bwotZmluZCBjZXJ0YWluIGZpbGVzLiAgVGhhdCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB3aGF0IEBzYW1wey0td2l0aH0KLW9wdGlvbnMgYXJlIGZvci4KLQotQGl0ZW0gLS1uZnAKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgbm8gZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yLgotCi1AaXRlbSAtLWdhcwotVGhlIHRhcmdldCBtYWNoaW5lIGFzc2VtYmxlciBpcyBHQVMsIHRoZSBHTlUgYXNzZW1ibGVyLgotVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgtZ251LWFzfSBpbnN0ZWFkLgotCi1AaXRlbSAtLXgKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgdGhlIFggV2luZG93IFN5c3RlbSBpbnN0YWxsZWQuCi1UaGlzIGlzIG9ic29sZXRlOyB1c2VycyBzaG91bGQgdXNlIEBzYW1wey0td2l0aC14fSBpbnN0ZWFkLgotQGVuZCB0YWJsZQotCi1BbGwgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHRzIHNob3VsZCBhY2NlcHQgYWxsIG9mIHRoZXNlIGBgZGV0YWlsJycKLW9wdGlvbnMsIHdoZXRoZXIgb3Igbm90IHRoZXkgbWFrZSBhbnkgZGlmZmVyZW5jZSB0byB0aGUgcGFydGljdWxhcgotcGFja2FnZSBhdCBoYW5kLiAgSW4gcGFydGljdWxhciwgdGhleSBzaG91bGQgYWNjZXB0IGFueSBvcHRpb24gdGhhdAotc3RhcnRzIHdpdGggQHNhbXB7LS13aXRoLX0gb3IgQHNhbXB7LS1lbmFibGUtfS4gIFRoaXMgaXMgc28gdXNlcnMgd2lsbAotYmUgYWJsZSB0byBjb25maWd1cmUgYW4gZW50aXJlIEdOVSBzb3VyY2UgdHJlZSBhdCBvbmNlIHdpdGggYSBzaW5nbGUgc2V0Ci1vZiBvcHRpb25zLgotCi1Zb3Ugd2lsbCBub3RlIHRoYXQgdGhlIGNhdGVnb3JpZXMgQHNhbXB7LS13aXRoLX0gYW5kIEBzYW1wey0tZW5hYmxlLX0KLWFyZSBuYXJyb3c6IHRoZXkgQHN0cm9uZ3tkbyBub3R9IHByb3ZpZGUgYSBwbGFjZSBmb3IgYW55IHNvcnQgb2Ygb3B0aW9uCi15b3UgbWlnaHQgdGhpbmsgb2YuICBUaGF0IGlzIGRlbGliZXJhdGUuICBXZSB3YW50IHRvIGxpbWl0IHRoZSBwb3NzaWJsZQotY29uZmlndXJhdGlvbiBvcHRpb25zIGluIEdOVSBzb2Z0d2FyZS4gIFdlIGRvIG5vdCB3YW50IEdOVSBwcm9ncmFtcyB0bwotaGF2ZSBpZGlvc3luY3JhdGljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLQotUGFja2FnZXMgdGhhdCBwZXJmb3JtIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgbWF5IHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24uCi1JbiBzdWNoIGEgY2FzZSwgdGhlIGhvc3QgYW5kIHRhcmdldCBtYWNoaW5lcyBmb3IgdGhlIHByb2dyYW0gbWF5IGJlCi1kaWZmZXJlbnQuICBUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIG5vcm1hbGx5IHRyZWF0IHRoZQotc3BlY2lmaWVkIHR5cGUgb2Ygc3lzdGVtIGFzIGJvdGggdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQsIHRodXMgcHJvZHVjaW5nCi1hIHByb2dyYW0gd2hpY2ggd29ya3MgZm9yIHRoZSBzYW1lIHR5cGUgb2YgbWFjaGluZSB0aGF0IGl0IHJ1bnMgb24uCi0KLVRoZSB3YXkgdG8gYnVpbGQgYSBjcm9zcy1jb21waWxlciwgY3Jvc3MtYXNzZW1ibGVyLCBvciB3aGF0IGhhdmUgeW91LCBpcwotdG8gc3BlY2lmeSB0aGUgb3B0aW9uIEBzYW1wey0taG9zdD1AdmFye2hvc3R0eXBlfX0gd2hlbiBydW5uaW5nCi1AY29kZXtjb25maWd1cmV9LiAgVGhpcyBzcGVjaWZpZXMgdGhlIGhvc3Qgc3lzdGVtIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi10eXBlIG9mIHRhcmdldCBzeXN0ZW0uICBUaGUgc3ludGF4IGZvciBAdmFye2hvc3R0eXBlfSBpcyB0aGUgc2FtZSBhcwotZGVzY3JpYmVkIGFib3ZlLgotCi1Cb290c3RyYXBwaW5nIGEgY3Jvc3MtY29tcGlsZXIgcmVxdWlyZXMgY29tcGlsaW5nIGl0IG9uIGEgbWFjaGluZSBvdGhlcgotdGhhbiB0aGUgaG9zdCBpdCB3aWxsIHJ1biBvbi4gIENvbXBpbGF0aW9uIHBhY2thZ2VzIGFjY2VwdCBhCi1jb25maWd1cmF0aW9uIG9wdGlvbiBAc2FtcHstLWJ1aWxkPUB2YXJ7aG9zdHR5cGV9fSBmb3Igc3BlY2lmeWluZyB0aGUKLWNvbmZpZ3VyYXRpb24gb24gd2hpY2ggeW91IHdpbGwgY29tcGlsZSB0aGVtLCBpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50Ci1mcm9tIHRoZSBob3N0LgotCi1Qcm9ncmFtcyBmb3Igd2hpY2ggY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBtZWFuaW5nZnVsIG5lZWQgbm90IGFjY2VwdCB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLCBiZWNhdXNlIGNvbmZpZ3VyaW5nIGFuIGVudGlyZSBvcGVyYXRpbmcgc3lzdGVtIGZvcgotY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBhIG1lYW5pbmdmdWwgdGhpbmcuCi0KLVNvbWUgcHJvZ3JhbXMgaGF2ZSB3YXlzIG9mIGNvbmZpZ3VyaW5nIHRoZW1zZWx2ZXMgYXV0b21hdGljYWxseS4gIElmCi15b3VyIHByb2dyYW0gaXMgc2V0IHVwIHRvIGRvIHRoaXMsIHlvdXIgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgY2FuIHNpbXBseQotaWdub3JlIG1vc3Qgb2YgaXRzIGFyZ3VtZW50cy4KLQotQGNvbW1lbnQgVGhlIG1ha2VmaWxlIHN0YW5kYXJkcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgaXMgYWxzbwotQGNvbW1lbnQgaW5jbHVkZWQgYnkgbWFrZS50ZXhpbmZvLiAgRG9uZSBieSByb2xhbmRAZ251LmFpLm1pdC5lZHUgb24gMS82LzkzLgotQGNvbW1lbnQgRm9yIHRoaXMgZG9jdW1lbnQsIHR1cm4gY2hhcHRlcnMgaW50byBzZWN0aW9ucywgZXRjLgotQGxvd2Vyc2VjdGlvbnMKLUBpbmNsdWRlIG1ha2Utc3Rkcy50ZXhpCi1AcmFpc2VzZWN0aW9ucwotCi1Abm9kZSBSZWxlYXNlcwotQHNlY3Rpb24gTWFraW5nIFJlbGVhc2VzCi0KLVBhY2thZ2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiBAY29kZXtGb28gdmVyc2lvbiA2OS45Nn0gdXAgaW4gYSBnemlwcGVkIHRhcgotZmlsZSB3aXRoIHRoZSBuYW1lIEBmaWxle2Zvby02OS45Ni50YXIuZ3p9LiAgSXQgc2hvdWxkIHVucGFjayBpbnRvIGEKLXN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtmb28tNjkuOTZ9LgotCi1CdWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgcHJvZ3JhbSBzaG91bGQgbmV2ZXIgbW9kaWZ5IGFueSBvZiB0aGUgZmlsZXMKLWNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgZmlsZXMgdGhhdCBmb3JtCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIGluIGFueSB3YXkgbXVzdCBiZSBjbGFzc2lmaWVkIGludG8gQGRmbntzb3VyY2UKLWZpbGVzfSBhbmQgQGRmbntub24tc291cmNlIGZpbGVzfS4gIFNvdXJjZSBmaWxlcyBhcmUgd3JpdHRlbiBieSBodW1hbnMKLWFuZCBuZXZlciBjaGFuZ2VkIGF1dG9tYXRpY2FsbHk7IG5vbi1zb3VyY2UgZmlsZXMgYXJlIHByb2R1Y2VkIGZyb20KLXNvdXJjZSBmaWxlcyBieSBwcm9ncmFtcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgTWFrZWZpbGUuCi0KLU5hdHVyYWxseSwgYWxsIHRoZSBzb3VyY2UgZmlsZXMgbXVzdCBiZSBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgSXQgaXMgb2theQotdG8gaW5jbHVkZSBub24tc291cmNlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24sIHByb3ZpZGVkIHRoZXkgYXJlCi11cC10by1kYXRlIGFuZCBtYWNoaW5lLWluZGVwZW5kZW50LCBzbyB0aGF0IGJ1aWxkaW5nIHRoZSBkaXN0cmlidXRpb24KLW5vcm1hbGx5IHdpbGwgbmV2ZXIgbW9kaWZ5IHRoZW0uICBXZSBjb21tb25seSBpbmNsdWRlIG5vbi1zb3VyY2UgZmlsZXMKLXByb2R1Y2VkIGJ5IEJpc29uLCBAY29kZXtsZXh9LCBAVGVYe30sIGFuZCBAY29kZXttYWtlaW5mb307IHRoaXMgaGVscHMgYXZvaWQKLXVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIG91ciBkaXN0cmlidXRpb25zLCBzbyB0aGF0IHVzZXJzIGNhbgotaW5zdGFsbCB3aGljaGV2ZXIgcGFja2FnZXMgdGhleSB3YW50IHRvIGluc3RhbGwuCi0KLU5vbi1zb3VyY2UgZmlsZXMgdGhhdCBtaWdodCBhY3R1YWxseSBiZSBtb2RpZmllZCBieSBidWlsZGluZyBhbmQKLWluc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIEBzdHJvbmd7bmV2ZXJ9IGJlIGluY2x1ZGVkIGluIHRoZQotZGlzdHJpYnV0aW9uLiAgU28gaWYgeW91IGRvIGRpc3RyaWJ1dGUgbm9uLXNvdXJjZSBmaWxlcywgYWx3YXlzIG1ha2UKLXN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSB3aGVuIHlvdSBtYWtlIGEgbmV3IGRpc3RyaWJ1dGlvbi4KLQotTWFrZSBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBkaXN0cmlidXRpb24gdW5wYWNrcyAoYXMKLXdlbGwgYXMgYW55IHN1YmRpcmVjdG9yaWVzKSBhcmUgYWxsIHdvcmxkLXdyaXRhYmxlIChvY3RhbCBtb2RlIDc3NykuCi1UaGlzIGlzIHNvIHRoYXQgb2xkIHZlcnNpb25zIG9mIEBjb2Rle3Rhcn0gd2hpY2ggcHJlc2VydmUgdGhlCi1vd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlcyBmcm9tIHRoZSB0YXIgYXJjaGl2ZSB3aWxsIGJlCi1hYmxlIHRvIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyBldmVuIGlmIHRoZSB1c2VyIGlzIHVucHJpdmlsZWdlZC4KLQotTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZSB3b3JsZC1yZWFkYWJsZS4KLQotTWFrZSBzdXJlIHRoYXQgbm8gZmlsZSBuYW1lIGluIHRoZSBkaXN0cmlidXRpb24gaXMgbW9yZSB0aGFuIDE0Ci1jaGFyYWN0ZXJzIGxvbmcuICBMaWtld2lzZSwgbm8gZmlsZSBjcmVhdGVkIGJ5IGJ1aWxkaW5nIHRoZSBwcm9ncmFtCi1zaG91bGQgaGF2ZSBhIG5hbWUgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMKLXRoYXQgc29tZSBzeXN0ZW1zIGFkaGVyZSB0byBhIGZvb2xpc2ggaW50ZXJwcmV0YXRpb24gb2YgdGhlIFBPU0lYCi1zdGFuZGFyZCwgYW5kIHJlZnVzZSB0byBvcGVuIGEgbG9uZ2VyIG5hbWUsIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgYXMKLXRoZXkgZGlkIGluIHRoZSBwYXN0LgotCi1Eb24ndCBpbmNsdWRlIGFueSBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGl0c2VsZi4gIElmIHRoZSB0YXIKLWZpbGUgY29udGFpbnMgc3ltYm9saWMgbGlua3MsIHRoZW4gcGVvcGxlIGNhbm5vdCBldmVuIHVucGFjayBpdCBvbgotc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc3ltYm9saWMgbGlua3MuICBBbHNvLCBkb24ndCB1c2UgbXVsdGlwbGUKLW5hbWVzIGZvciBvbmUgZmlsZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGJlY2F1c2UgY2VydGFpbiBmaWxlCi1zeXN0ZW1zIGNhbm5vdCBoYW5kbGUgdGhpcyBhbmQgdGhhdCBwcmV2ZW50cyB1bnBhY2tpbmcgdGhlCi1kaXN0cmlidXRpb24uCi0KLVRyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGZpbGUgbmFtZXMgd2lsbCBiZSB1bmlxdWUgb24gTVMtRE9TLiAgQQotbmFtZSBvbiBNUy1ET1MgY29uc2lzdHMgb2YgdXAgdG8gOCBjaGFyYWN0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLXBlcmlvZCBhbmQgdXAgdG8gdGhyZWUgY2hhcmFjdGVycy4gIE1TLURPUyB3aWxsIHRydW5jYXRlIGV4dHJhCi1jaGFyYWN0ZXJzIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgcGVyaW9kLiAgVGh1cywKLUBmaWxle2Zvb2JhcmhhY2tlci5jfSBhbmQgQGZpbGV7Zm9vYmFyaGFja2VyLm99IGFyZSBub3QgYW1iaWd1b3VzOyB0aGV5Ci1hcmUgdHJ1bmNhdGVkIHRvIEBmaWxle2Zvb2JhcmhhLmN9IGFuZCBAZmlsZXtmb29iYXJoYS5vfSwgd2hpY2ggYXJlCi1kaXN0aW5jdC4KLQotSW5jbHVkZSBpbiB5b3VyIGRpc3RyaWJ1dGlvbiBhIGNvcHkgb2YgdGhlIEBmaWxle3RleGluZm8udGV4fSB5b3UgdXNlZAotdG8gdGVzdCBwcmludCBhbnkgQGZpbGV7Ki50ZXhpbmZvfSBvciBAZmlsZXsqLnRleGl9IGZpbGVzLgotCi1MaWtld2lzZSwgaWYgeW91ciBwcm9ncmFtIHVzZXMgc21hbGwgR05VIHNvZnR3YXJlIHBhY2thZ2VzIGxpa2UgcmVnZXgsCi1nZXRvcHQsIG9ic3RhY2ssIG9yIHRlcm1jYXAsIGluY2x1ZGUgdGhlbSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZpbGUuCi1MZWF2aW5nIHRoZW0gb3V0IHdvdWxkIG1ha2UgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlIGEgbGl0dGxlIHNtYWxsZXIgYXQKLXRoZSBleHBlbnNlIG9mIHBvc3NpYmxlIGluY29udmVuaWVuY2UgdG8gYSB1c2VyIHdobyBkb2Vzbid0IGtub3cgd2hhdAotb3RoZXIgZmlsZXMgdG8gZ2V0LgotCi1AY29udGVudHMKLQotQGJ5ZQotTG9jYWwgdmFyaWFibGVzOgotdXBkYXRlLWRhdGUtbGVhZGluZy1yZWdleHA6ICJAYyBUaGlzIGRhdGUgaXMgYXV0b21hZ2ljYWxseSB1cGRhdGVkIHdoZW4geW91IHNhdmUgdGhpcyBmaWxlOlxuQHNldCBsYXN0dXBkYXRlICIKLXVwZGF0ZS1kYXRlLXRyYWlsaW5nLXJlZ2V4cDogIiIKLWV2YWw6IChsb2FkICIvZ2QvZ251b3JnL3VwZGF0ZS1kYXRlLmVsIikKLWV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndXBkYXRlLWRhdGUpCi1FbmQ6CmRpZmYgLS1naXQgYS9nZGIvQ2hhbmdlTG9nIGIvZ2RiL0NoYW5nZUxvZwppbmRleCA2YjUxYzQwLi4yNzY2MTRkIDEwMDY0NAotLS0gYS9nZGIvQ2hhbmdlTG9nCisrKyBiL2dkYi9DaGFuZ2VMb2cKQEAgLTEsMjU5ICsxLDMgQEAKLTIwMDAtMDYtMDUgIERhbmllbCBCZXJsaW4gIDxkYW5AY2dzb2Z0d2FyZS5jb20+Ci0KLQkqIGMtZXhwLnkgKHl5bGV4KTogdGVtcGxhdGUgaGFuZGxpbmcgZml4ZXMuCi0KLTIwMDAtMDYtMDMgIERhbmllbCBCZXJsaW4gIDxkYW5AY2dzb2Z0d2FyZS5jb20+Ci0KLQkqIHN5bXRhYi5oIChWVEJMX1BSRUZJWF9QKTogQWRkIG5ld2VyIGcrKyB2dGJsIHByZWZpeCB0byBwcmVmaXggbGlzdC4KLQotCSogc3ltdGFiLmMgKGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCk6IENoYW5nZSB0byBzdG9wIGZvcmNpbmcgbGluZWFyIHNlYXJjaGVzCi0Jb24gQysrIHdoZW4gd2UgZmFpbCB0aGUgYmluYXJ5IHNlYXJjaCwgYnkgZG9pbmcgdGhlIGJpbmFyeSBzZWFyY2ggcmlnaHQuCi0KLTIwMDAtMDUtMzAgIERhbmllbCBCZXJsaW4gIDxkYW5AY2dzb2Z0d2FyZS5jb20+Ci0KLQkqIGJ1aWxkc3ltLmMgKGhhc2huYW1lKTogQ2hhbmdlIHRvIHVzZSBoYXNoIGZ1bmN0aW9uIGZyb20gYmNhY2hlLmMvLmgKLQotCSogYmNhY2hlLmMgKGhhc2gpOiBDaGFuZ2UgdG8gbmV3ZXIgaGFzaCBmdW5jdGlvbi4KLQotCSogYmNhY2hlLmggKGhhc2gpOiBQcm90b3R5cGUgZm9yIGhhc2ggZnVuY3Rpb24KLQotCSogZHdhcmYycmVhZC5jIChUWVBFX0hBU0hfU0laRSk6IE5ldyBkZWZpbmUgZm9yIGNvbnRyb2xsaW5nIHNpemUKLQlvZiB0eXBlIGhhc2guCi0JKGR3YXJmMl9jYWNoZWRfdHlwZXMpOiBOZXcgdmFyaWFibGUgdGhhdCBpcyB0aGUgY2FjaGVkIHR5cGVzLgotCSh0YWdfdHlwZV90b190eXBlKTogRG8gdGhlIGFjdHVhbCBjYWNoaW5nIG9mIHR5cGVzIGhlcmUuCi0KLTIwMDAtMDYtMDUgIE1hcmsgS2V0dGVuaXMgIDxrZXR0ZW5pc0BnbnUub3JnPgotCi0JKiBhY2NvbmZpZy5oLCBjb25maWd1cmUuaW4sIGkzODZic2QuYyAoSEFWRV9TVFJVQ1RfUkVHX1JfRlMpOgotCVJlbmFtZWQgZnJvbSBIQVZFX1JfRlMuCi0JKEhBVkVfU1RSVUNUX1JFR19HUyk6IFJlbmFtZWQgZnJvbSBIQVZFX1JfR1MuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0KLVN1biBKdW4gIDQgMTQ6MDA6MDEgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBUT0RPOiBVcGRhdGUuICBNZW50aW9uIEdOVS9MaW51eC9TUEFSQyBwcm9ibGVtcy4KLQotV2VkIE1heSAzMSAyMTo0MTozNyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdkYmFyY2guc2ggKFBPSU5URVJfVE9fQUREUkVTUywgQUREUkVTU19UT19QT0lOVEVSKTogQ2hhbmdlIGJ1ZgotIAl0byBhIHZvaWQgcG9pbnRlci4gIFVwZGF0ZSBpbml0aWFsIHZhbHVlcy4KLQkqIGdkYmFyY2guaCwgZ2RiYXJjaC5jOiBSZS1nZW5lcmF0ZS4KLQkKLQkqIGZpbmR2YXIuYyAoYWRkcmVzc190b19zaWduZWRfcG9pbnRlciwKLSAJc2lnbmVkX3BvaW50ZXJfdG9fYWRkcmVzcyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBpbmZlcmlvci5oIChzaWduZWRfcG9pbnRlcl90b19hZGRyZXNzLAotIAlzaWduZWRfYWRkcmVzc190b19wb2ludGVyKTogRGVjbGFyZS4KLQotCSogaW5mZXJpb3IuaCwgZmluZHZhci5jICh1bnNpZ25lZF9wb2ludGVyX3RvX2FkZHJlc3MsCi0gCWFkZHJlc3NfdG9fdW5zaWduZWRfcG9pbnRlcik6IFJlbmFtZSBnZW5lcmljX2FkZHJlc3NfdG9fcG9pbnRlcgotIAlhbmQgZ2VuZXJpY19wb2ludGVyX3RvX2FkZHJlc3MuICBVcGRhdGUgc2lnbmF0dXJlcyB0byBtYXRjaAotIAlnZGJhcmNoIGNoYW5nZXMuCi0KLQkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoUE9JTlRFUl9UT19BRERSRVNTLCBBRERSRVNTX1RPX1BPSU5URVIpOgotIAlEZWZpbmUuIE1JUFMgaGFzIHNpZ25lZCBwb2ludGVycy4KLQotCSogZGVmcy5oLCB1dGlscy5jIChob3N0X3BvaW50ZXJfdG9fYWRkcmVzcywKLSAJYWRkcmVzc190b19ob3N0X3BvaW50ZXIpOiBOZXcgZnVuY3Rpb25zLgotCSogaXJpeDUtbmF0LmMgKG5leHRfbGlua19tYXBfbWVtYmVyLCBmaXJzdF9saW5rX21hcF9tZW1iZXIpLAotIAlwcm9jZnMuYyAocHJvY19zZXRfd2F0Y2hwb2ludCwgcHJvY19pdGVyYXRlX292ZXJfbWFwcGluZ3MpOiBVc2UuCi0KLQkqIGlyaXg1LW5hdC5jIChzb2xpYl9tYXBfc2VjdGlvbnMsIHN5bWJvbF9hZGRfc3R1Yik6IENoYW5nZQotIAlmdW5jdGlvbiBzaWduYXR1cmUgdG8gbWF0Y2ggY2F0Y2hfZXJyb3JzX2Z0eXBlLgotCi0JKiBUT0RPOiBVcGRhdGUuIEdEQiBidWlsZHMgdXNpbmcgdGhlIElSSVggbmF0aXZlIGNvbXBpbGVyLgotCQotU2F0IEp1biAgMyAyMDo0Mzo1OSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGRlZnMuaCAoc3Ryc2lnbmFsLCBzYWZlX3N0cnNpZ25hbCk6IERlbGV0ZSBkZWNsYXJhdGlvbnMuCi0JKiB1dGlscy5jIChzYWZlX3N0cnNpZ25hbCk6IERlbGV0ZS4KLQkqIGNvcmVsb3cuYyAoY29yZV9vcGVuKTogUmVwbGFjZSBzYXZlX3N0cnNpZ25hbCB3aXRoCi0gCXRhcmdldF9zaWduYWxfdG9fc3RyaW5nICsgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QuCi0JKiBUT0RPOiBEb2N1bWVudCBwcm9ibGVtcyB3aXRoIHRhcmdldF9zaWduYWxfZnJvbV9ob3N0LgotCi0yMDAwLTA2LTAzICBLZXZpbiBCdWV0dG5lciAgPGtldmluYkByZWRoYXQuY29tPgotCi0JKiBhbm5vdGF0ZS5jLCBhbm5vdGF0ZS5oLCBicmVha3BvaW50LmMsIGNvbW1hbmQuYywgY29tbWFuZC5oLAotCWNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmgsIGNvcmVmaWxlLmMsIGQxMHYtdGRlcC5jLAotCWQzMHYtdGRlcC5jLCBkYnhyZWFkLmMsIGRjYWNoZS5jLCBkY2FjaGUuaCwgZHNyZWMuYywKLQlkdmUzOTAwLXJvbS5jLCBleGVjLmMsIGZvcmstY2hpbGQuYywgZ2RiY29yZS5oLCBocHV4LXRocmVhZC5jLAotCWxhbmd1YWdlLmgsIGxpbnV4LXRocmVhZC5jLCBtZGVidWdyZWFkLmMsIG1vbml0b3IuaCwgb2NkLmMsCi0JcHJvY2ZzLmMsIHB0eDQtbmF0LmMsIHJlbW90ZS1zaW0uYywgcmVtb3RlLXV0aWxzLmgsIHJlbW90ZS5jLAotCXJzNjAwMC10ZGVwLmMsIHNlci1vY2QuYywgc29sLXRocmVhZC5jLCBzcGFyY2wtdGRlcC5jLAotCXN0YWJzcmVhZC5oLCBzdGFjay5jLCBzeW1maWxlLmMsIHN5bWZpbGUuaCwgc3ltdGFiLmgsCi0JdGFyZ2V0LmMsIHRhcmdldC5oLCB0b3AuYywgdHJhY2Vwb2ludC5jLCB0cmFjZXBvaW50LmgsCi0JdHVpL3R1aS5oLCB0dWkvdHVpSU8uYywgdXRpbHMuYywgdjg1MGljZS5jLCB2YXJvYmouYywKLQl3aW4zMi1uYXQuYywgd2luY2UuYywgeGNvZmZzb2xpYi5jLCB4Y29mZnNvbGliLmg6IEVsaW1pbmF0ZQotCVBBUkFNUyBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgZGVjbGFyYXRpb25zLiAKLQotMjAwMC0wNi0wMyAgQ2hyaXN0b3BoZXIgRmF5bG9yICA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIHdpbjMyLW5hdC5jIChzYWZlX3N5bWJvbF9maWxlX2FkZF9jbGVhbnVwKTogRW5zdXJlIHRoYXQgZ2RiX3N0ZGVyciBpcwotCWZsdXNoZWQgYmVmb3JlIGRlbGV0aW5nIGFuZCByZXN0b3JpbmcgaXQuCi0JKHNhZmVfc3ltYm9sX2ZpbGVfYWRkKTogRW5zdXJlIHRoYXQgZ2RiX3N0ZGVyciBpcyBmbHVzaGVkIGJlZm9yZQotCXJlYXNzaWduaW5nIGl0LgotCShoYW5kbGVfbG9hZF9kbGwpOiBTcGxpdCBpbnRvIHR3byBmdW5jdGlvbnMgc28gdGhhdCBXRkkgY2FuIGhhbmRsZQotCXNoYXJlZCBsaWJyYXJ5IGV2ZW50cy4KLQkoY2hpbGRfc29saWJfbG9hZGVkX2xpYnJhcnlfcGF0aG5hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNoaWxkX2NsZWFyX3NvbGlicyk6IE5ldyBmdW5jdGlvbi4gIENsZWFycyBzaGFyZWQgbGlicmFyeSBsaXN0LgotCShjaGlsZF9zb2xpYl9hZGQpOiBOZXcgZnVuY3Rpb24uICBBZGRzIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMuCi0JKGRsbF9zeW1ib2xfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZXMgImRsbC1zeW1ib2wiIGNvbW1hbmQuCi0JKGluZm9fZGxsX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIGluZm8KLQkic2hhcmVkbGlicmFyeSIgY29tbWFuZC4KLQkoaGFuZGxlX2V4Y2VwdGlvbnMpOiBFbGltaW5hdGUgJ2lnbm9yZV90cmFwJyBhcmd1bWVudC4KLQkoZ2V0X2NoaWxkX2RlYnVnX2V2ZW50KTogRWxpbWluYXRlIHR3byBhcmd1bWVudHMuICBSZXR1cm4gInBpZCIgd2hlbgotCWFwcHJvcHJpYXRlLiAgQnJlYWsgb3V0IG9uIG1vc3QgZXZlbnRzIHRvIGFsbG93IFdGSSB0byBoYW5kbGUgc3R1ZmYuCi0JKGNoaWxkX3dhaXQpOiBBY2NvbW9kYXRlIGdldF9jaGlsZF9kZWJ1Z19ldmVudCBjaGFuZ2VzLgotCShjaGlsZF9hdHRhY2gpOiBDbGVhciB0aHJlYWQgbGlzdCBhbmQgbGlzdCBvZiBsb2FkZWQgZGxscy4KLQkoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogQ2xlYXIgbGlzdCBvZiBsb2FkZWQgZGxscy4gIFVzZQotCXdhaXRfZm9yX2luZmVyaW9yIGluIGEgbG9vcCB0byBsb29rIGZvciBmaXJzdCAidHJhcCIuCi0JKGNoaWxkX3Jlc3VtZSk6IEF2b2lkIGFjY2Vzc2luZyBhIHBvc3NpYmx5LWZyZWVkIHRocmVhZCBwb2ludGVyLgotCShfaW5pdGlhbGl6ZV9pbmZ0YXJnKTogQWRkICJkbGwtc3ltYm9scyIsICJzaGFyZWRsaWJyYXJ5IiwgYW5kICJpbmZvCi0Jc2hhcmVkbGlicmFyeSIgY29tbWFuZHMuCi0JKiBjb25maWcvaTM4Ni90bS1jeWd3aW4uaDogQWRkIHNvbWUgc2hhcmVkIGxpYnJhcnkgKGFrYSBETEwpIGhvb2tzLgotCi0yMDAwLTA2LTAyICBDaHJpc3RvcGhlciBGYXlsb3IgIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogd2luMzItbmF0LmM6IEZpeCB1cCBnY2Mgd2FybmluZ3MgdGhyb3VnaG91dC4KLQkoaGFuZGxlX2xvYWRfZGxsKTogQ2hhbmdlIERMTCBuYW1lIHRvIGxvd2VyIGNhc2UuCi0JKGhhbmRsZV9leGNlcHRpb24pOiBBZGQgYSBzZWNvbmQgYXJndW1lbnQgaW5kaWNhdGluZyB3aGV0aGVyIGEKLQlicmVha3BvaW50IHNob3VsZCBiZSBpZ25vcmVkLiAgUmV0dXJuIGEgMCBpZiB0aGUgYnJlYWtwb2ludCB3YXMKLQlpZ25vcmVkLgotCShnZXRfY2hpbGRfZGVidWdfZXZlbnQpOiBQYXNzIGFyZ3VtZW50IHRvIGhhbmRsZV9leGNlcHRpb24gdG8gY29udHJvbAotCXdoZXRoZXIgYSBicmVha3BvaW50IHNob3VsZCBiZSBpZ25vcmVkLgotCShjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiBVc2UgbW9kZXJuIGN5Z3dpbiBBUEkuICBFeHBsaWNpdGx5IGNsZWFyCi0JbGFzdF9zaWcuICBQYXNzIEZJUlNUX0VYQ0VQVElPTiB0byBnZXRfY2hpbGRfZGVidWdfZXZlbnQgZm9yIGRldGVjdGlvbgotCW9mIGZpcnN0IGJyZWFrcG9pbnQuCi0KLTIwMDAtMDYtMDIgIENocmlzdG9waGVyIEZheWxvciAgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERldGVjdCBjb3JyZWN0IHZlcnNpb25zIG9mIGRsbHRvb2wgYW5kIHdpbmRyZXMgd2hlbgotCWNyb3NzLWNvbXBpbGluZy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMjAwMC0wNi0wMiAgSi5ULiBDb25rbGluICA8anRjQHJlZGJhY2suY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgcGF0dGVybiBmb3IgaVszNDU2XTg2LSotbmV0YnNkZWxmKi4KLQkqIGNvbmZpZy9pMzg2L25ic2RlbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYvdG0tbmJzZGVsZi5oOiBOZXcgZmlsZS4KLQkKLQkqIGNvbmZpZy9pMzg2L3RtLW5ic2QuaDogY2hhbmdlIGluY2x1ZGUgb2YgdG0tbmJzZC5oIHRvIAotCXRoZSBtb3JlIGV4cGxpY2l0IGNvbmZpZy90bS1uYnNkLmguCi0KLTIwMDAtMDYtMDIgIE1hcmsgS2V0dGVuaXMgIDxrZXR0ZW5pc0BnbnUub3JnPgotCi0JKiBhbHBoYWJzZC1uYXQuYyAoc3VwcGx5X2ZwcmVnc2V0KTogU3Vic3RyYWN0IEZQMF9SRUdOVU0gZnJvbQotCXJlZ2lzdGVyIG51bWJlciB3aGVuIHVzZWQgYXMgaW5kZXggaW50byBmcHJfcmVncyBhcnJheS4KLQotVHVlIE1heSAzMCAxMzozMTo1NyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGRlZnMuaCAoVEFSR0VUX0ZMT0FUX0ZPUk1BVCwgVEFSR0VUX0RPVUJMRV9GT1JNQVQsCi0gCVRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQpOiBEZWxldGUuCi0KLQkqIGdkYmFyY2guc2g6IEFkZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkIGV4cHJlc3Npb25zLgotIAkoVEFSR0VUX0ZMT0FUX0ZPUk1BVCwgVEFSR0VUX0RPVUJMRV9GT1JNQVQsCi0gCVRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQpOiBBZGQuICBJbmNsdWRlICJmbG9hdGZvcm1hdC5oIi4KLQkqIGdkYmFyY2guaCwgZ2RiYXJjaC5jOiBSZWdlbmVyYXRlLgotCQotCSogYXJjaC11dGlscy5jIChkZWZhdWx0X3NpbmdsZV9mb3JtYXQsIGRlZmF1bHRfZG91YmxlX2Zvcm1hdCwKLSAJZGVmYXVsdF9sb25nX2RvdWJsZV9mb3JtYXQpOiBOZXcgZnVuY3Rpb25zLiBJbmNsdWRlCi0gCSJmbG9hdGZvcm1hdC5oIgotCSogYXJjaC11dGlscy5oOiBEZWNsYXJlLgotCQotCSogZDEwdi10ZGVwLmMgKGQxMHZfZ2RiYXJjaF9pbml0KTogU2V0IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAgCU5vdGUgdGhhdCBsb25nIGRvdWJsZSBpcyA2NCBiaXQsIHRoZSByZXN0IGFyZSAzMiBiaXQuICBJbmNsdWRlCi0gCSJmbG9hdGZvcm1hdC5oIi4KLQotMjAwMC0wNi0wMiAgTWFyayBLZXR0ZW5pcyAgPGtldHRlbmlzQGdudS5vcmc+Ci0KLQkqIGNvbmZpZy9hbHBoYS9ubS1mYnNkLmggKENBTk5PVF9TVEVQX0JSRUFLUE9JTlQpOiBEZWZpbmUuCi0KLTIwMDAtMDYtMDEgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBzZWFkb2cuY3lnbnVzLmNvbT4KLQotCSogc29sLXRocmVhZC5jIChyd19jb21tb24pOiBDaXJjdW1zdGFuY2VzIChlZy4gYSBidWcgaW4gU3VuJ3MgCi0JdGhyZWFkX2RiIGxpYnJhcnkpIG1heSBjYXVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIGFuCi0JaWxsZWdhbCBhZGRyZXNzLCBpbiB3aGljaCBjYXNlIHByb2Nmc190b194ZmVyX21lbW9yeSB3aWxsIAotCXJldHVybiB6ZXJvLiAgUmV0dXJuIGFuIGVycm9yIGNvZGUgaW5zdGVhZCBvZiBsb29waW5nIGZvcmV2ZXIuCi0KLVRodSBKdW4gIDEgMjA6MDU6MjYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBUT0RPOiBNb3JlIHN1Z2dlc3Rpb25zIGFkZGVkLgotCi0yMDAwLTA1LTMxICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFjay5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBBZGQgcGF0dGVybnMgZm9yIGlbMzQ1Nl04Ni0qLW5ldGJzZGFvdXQqCi0JYW5kIGlbMzQ1Nl04Ni0qLW5ldGJzZGVsZiouCi0JKiBjb25maWcvaTM4Ni9ubS1uYnNkZWxmLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYvbmJzZGVsZi5taDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy9pMzg2L25tLW5ic2QuaDogY2hhbmdlIGluY2x1ZGUgb2Ygbm0tbmJzZC5oIHRvIAotCXRoZSBtb3JlIGV4cGxpY2l0IGNvbmZpZy9ubS1uYnNkLmguCi0JKiBjb25maWcvaTM4Ni90bS1uYnNkLmg6IGNoYW5nZSBpbmNsdWRlIG9mIHRtLWkzODZic2QuaCB0bwotIAl0bS1pMzg2LmguCi0JKFNJR1RSQU1QX1NUQVJULCBTSUdUUkFNUF9FTkQsIFNJR0NPTlRFWFRfUENfT0ZGU0VUKTogRGVmaW5lLgotCi0yMDAwLTA2LTAxICBNYXJrIEtldHRlbmlzICA8a2V0dGVuaXNAZ251Lm9yZz4KLQotCSogTkVXUzogTWVudGlvbiBGcmVlQlNEL0FscGhhIGFuZCBGcmVlQlNEL2kzODYgMy54IGFuZCB1cCBhcyBuZXcKLQluYXRpdmUgY29uZmlndXJhdGlvbnMuCi0KLQkqIGkzODZic2QtbmF0LmM6IEluY2x1ZGUgImdyZWdzZXQuaCIuCi0JKENBTk5PVF9TVE9SRV9SRUdJU1RFUik6IERlZmluZSB0byBjYW5ub3RfZmV0Y2hfcmVnaXN0ZXIgaW5zdGVhZAotCW9mIENBTk5PVF9GRVRDSF9SRUdJU1RFUiwgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoc3VwcGx5X2dyZWdzZXQpOiBDYWxsIHN1cHBseV9yZWdpc3RlciB3aXRoIE5VTEwgYXMgaXRzIHNlY29uZAotCWFyZ3VtZW50IGluc3RlYWQgb2Ygc3VwcGx5aW5nIG91ciBvd24gemVyb2VkIG91dCBidWZmZXIuCi0JKGZpbGxfZ3JlZ3NldCk6IENvcHkgY29udGVudHMgb2YgY29ycmVjdCByZWdpc3RlcnMgaW5zdGVhZCBvZiB0aGUKLQljb250ZW50cyBvZiByZWdpc3RlciBSRUdOTy4KLQotMjAwMC0wNS0zMSAgS2V2aW4gQnVldHRuZXIgIDxrZXZpbmJAcmVkaGF0LmNvbT4KLQotCSogZ251LXJlZ2V4LmMgKHJlX21hdGNoXzJfaW50ZXJuYWwpOiBSZXZlcnQgMjAwMC0wNS0yNwotCXBhdGNoIHdoaWNoIHJlbW92ZWQgdXNlIG9mIFBBUkFNUyBmcm9tIGRlY2xhcmF0aW9uLiAgVGhpcwotCWZpbGUgc2hvdWxkIG5vdCBoYXZlIGJlZW4gdG91Y2hlZCBhcyBpdCBpcyBzdXBwb3NlZCB0byB0cmFjawotCXRoZSB2ZXJzaW9uIGluIGdsaWJjLgotCi0yMDAwLTA1LTMxICBNYXJrIEtldHRlbmlzICA8a2V0dGVuaXNAZ251Lm9yZz4KLQotCUFkZCBzdXBwb3J0IGZvciBGcmVlQlNEL0FscGhhLgotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS50Z3QgKGFscGhhKi0qLWZyZWVic2QqKTogTmV3IGVudHJ5LgotCSogYWxwaGFic2QtbmF0LmMsIGNvbmZpZy9hbHBoYS9mYnNkLm1oLCBjb25maWcvYWxwaGEvZmJzZC5tdCwKLQljb25maWcvYWxwaGEvbm0tZmJzZC5oLCBjb25maWcvYWxwaGEvdG0tZmJzZC5oLAotCWNvbmZpZy9hbHBoYS94bS1mYnNkLmg6IE5ldyBmaWxlcy4KLQotMjAwMC0wNS0zMSAgUGllcnJlIE11bGxlciAgPG11bGxlckBzb3VyY2V3YXJlLmN5Z251cy5jb20+Ci0KLQkqIE1BSU5UQUlORVJTOiBBZGQgbXlzZWxmIHRvICJXcml0ZSBBZnRlciBBcHByb3ZhbCIgbGlzdC4KLQotVHVlIE1heSAzMCAxODo0ODozMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIFRPRE86IFJlLW9yZ2FuaXplLgotCi1UdWUgTWF5IDMwIDExOjIyOjI4IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2RiYXJjaC5zaDogQWRkIGZpZWxkIGBgcG9zdGRlZmF1bHQnJy4gIFJlbmFtZSBmaWVsZHMKLSAJYGBzdGFydHVwJycgYW5kIGBgZGVmYXVsdCcnIHRvIGBgc3RhdGljZGVmYXVsdCcnIGFuZAotIAlgYHByZWRlZmF1bHQnJy4gIEZpeCBpbml0aWFsaXphdGlvbiBvZiB2YWxpZF9wLiAgQ3JlYXRlL2NvbXBhcmUKLSAJZ2RiYXJjaC5sb2cuCi0KLU1vbiBNYXkgMjkgMjI6NDc6MTYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaCAoR0RCX0dSRUdTRVRfVCwgR0RCX0ZQUkVHU0VUX1QpOgotIAlEZWZpbmUuCi0JKiBjb25maWcvc3BhcmMveG0tc3VuNHNvbDIuaDogKEdEQl9HUkVHU0VUX1RZUEUsCi0gCUdEQl9GUFJFR1NFVF9UWVBFKTogRGVsZXRlLgotCi1Nb24gTWF5IDI5IDE1OjQxOjEwIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc3ltdGFiLmggKG1ha2VfY2xlYW51cF9mcmVlX3NlYXJjaF9zeW1ib2xzKTogQWRkIGRlY2xhcmF0aW9uLgotCSogc3ltdGFiLmMgKG1ha2VfY2xlYW51cF9mcmVlX3NlYXJjaF9zeW1ib2xzLAotIAlkb19mcmVlX3NlYXJjaF9zeW1ib2xzX2NsZWFudXApOiBOZXcgZnVuY3Rpb25zLgotCShzZWFyY2hfc3ltYm9scywgc3ltdGFiX3N5bWJvbF9pbmZvLCByYnJlYWtfY29tbWFuZCk6IFVwZGF0ZS4KLQkoc2VhcmNoX3N5bWJvbHMpOiBQYXNzIGBgc3InJywgYW5kIG5vdCBpdHMgYWRkcmVzcywgdG8KLSAJbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMuCi0KLTIwMDAtMDUtMjggIEtldmluIEJ1ZXR0bmVyICA8a2V2aW5iQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZy9ubS1saW51eC5oIChHREJfR1JFR1NFVF9ULCBHREJfRlBSRUdTRVRfVCk6IEZpeCB0eXBvcy4KLQogMjAwMC0wNS0yNyAgS2V2aW4gQnVldHRuZXIgIDxrZXZpbmJAcmVkaGF0LmNvbT4KIAogCSogYWJ1Zy1yb20uYywgYWxwaGEtbmF0LmMsIGFscGhhLXRkZXAuYywgYW5ub3RhdGUuYywKQEAgLTM1MiwyNCArOTYsNiBAQAogCXhjb2Zmc29saWIuYywgeG1vZGVtLmgsIHo4ay10ZGVwLmM6IFJlbW92ZSBQQVJBTVMgZnJvbSBmdW5jdGlvbgogCWRlY2xhcmF0aW9ucy4KIAotMjAwMC0wNS0yNiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQHNlYWRvZy5jeWdudXMuY29tPgotCi0JKiBncmVnc2V0Lmg6IE5ldyBmaWxlLiAgVHlwZWRlZnMgZm9yIGdkYl9ncmVnc2V0X3QgYW5kIAotCWdkYl9mcHJlZ3NldF90LCBwcm90b3R5cGVzIGZvciBzdXBwbHlfZ3JlZ3NldCBhbmQgZnJpZW5kcy4KLQkqIHByb2Nmcy5jOiBJbmNsdWRlIGdyZWdzZXQuaC4gIERlbGV0ZSBsb2NhbCBwcm90b3R5cGVzIGZvcgotCXN1cHBseV9ncmVnc2V0IGV0Yy4sIGFuZCBsb2NhbCB0eXBlZGVmIGdkYl9ncmVnc2V0X3QgZXRjLgotCSogc29sLXRocmVhZC5jOiBJbmNsdWRlIGdyZWdzZXQuaCwgZGVsZXRlIGxvY2FsIHByb3RvdHlwZXMsIAotCWFkZCBhcHByb3ByaWF0ZSBjYXN0cyB0byBnZGJfZ3JlZ3NldF90LgotCSogdXctdGhyZWFkLmMsIGxpbi10aHJlYWQuYywgY29yZS1zb2wyLmMsIGNvcmUtcmVnc2V0LmMsIAotCXNwYXJjLXRkZXAuYywgcHR4NC1uYXQuYywgcHBjLWxpbnV4LW5hdC5jLCBtaXBzdjQtbmF0LmMsIAotCW04OGstbmF0LmMsIG02OGtsaW51eC1uYXQuYywgbTY4ay10ZGVwLmMsIGlyaXg1LW5hdC5jLCAKLQlpcml4NC1uYXQuYywgaWE2NC1saW51eC1uYXQuYywgaTM4NnY0LW5hdC5jLCBjeHV4LW5hdC5jLAotCWFybS1saW51eC1uYXQuYywgYWxwaGEtbmF0LmM6IEluY2x1ZGUgZ3JlZ3NldC5oLgotCSogY29uZmlnL25tLWxpbnV4Lmg6IERlZmluZSBHREJfR1JFR1NFVF9ULCBHREJfRlBSRUdFVF9ULgotCSogY29uZmlnL3NwYXJjL25tLXN1bjRzb2wyLmg6IERpdHRvLgotCSogY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmg6IChHREJfR1JFR1NFVF9UWVBFLAotIAlHREJfRlBSRUdTRVRfVFlQRSk6IERlbGV0ZSAocmVwbGFjZWQgYnkgR0RCX0dSRUdTRVRfVCBldGMuKQotCiBUaHUgTWF5IDI1IDE2OjU2OjA1IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KIAogCSogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIG5jdXJzZXMuaC4KZGlmZiAtLWdpdCBhL2dkYi9NQUlOVEFJTkVSUyBiL2dkYi9NQUlOVEFJTkVSUwppbmRleCAyZWFmZDY3Li41Y2Q3NDhjIDEwMDY0NAotLS0gYS9nZGIvTUFJTlRBSU5FUlMKKysrIGIvZ2RiL01BSU5UQUlORVJTCkBAIC03Niw4ICs3Niw2IEBACiAJCQlQZXRlciBTY2hhdWVyCQlQZXRlci5TY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUKIFNvbGFyaXMvU1BBUkMgbmF0aXZlICYgaG9zdAogCQkJRGF2aWQgVGF5bG9yCQl0YXlsb3JAY3lnbnVzLmNvbQotTWFjIE9TIFgJCUtsZWUgRGllbmVzCQlrZGllbmVzQGFwcGxlLmNvbQotCQkJSmltIEluZ2hhbQkJamluZ2hhbUBhcHBsZS5jb20KIAogQ29yZTogR2VuZXJpYyBjb21wb25lbnRzIHVzZWQgYnkgYWxsIG9mIEdEQgogCkBAIC0xMDQsOSArMTAyLDYgQEAKIGxhbmd1YWdlIHN1cHBvcnQJRGF2aWQgVGF5bG9yCQl0YXlsb3JAY3lnbnVzLmNvbQogICBDKysgc3VwcG9ydAkJRGFuaWVsIEJlcmxpbgkJZGFuQGNnc29mdHdhcmUuY29tCiAgIEphdmEgc3VwcG9ydAkJQW50aG9ueSBHcmVlbiAJCWdyZWVuQGN5Z251cy5jb20KLSAgT2JqZWN0aXZlLUMvQysrCUtsZWUgRGllbmVzCQlrZGllbmVzQGFwcGxlLmNvbQotCQkJSmltIEluZ2hhbQkJamltZ2hhbUBhcHBsZS5jb20KLSAgUGFzY2FsIHN1cHBvcnQJUGllcnJlIE11bGxlcgkJbXVsbGVyQHNvdXJjZXdhcmUuY3lnbnVzLmNvbQogZXhwcmVzc2lvbiBldmFsCQlEYXZpZCBUYXlsb3IJCXRheWxvckBjeWdudXMuY29tCiBkZWZzLmgJCQlEYXZpZCBUYXlsb3IJCXRheWxvckBjeWdudXMuY29tCiB1dGlscy5jCQkJRGF2aWQgVGF5bG9yCQl0YXlsb3JAY3lnbnVzLmNvbQpAQCAtMTcyLDcgKzE2Nyw2IEBACiBKb25hdGhhbiBMYXJtb3VyCQkJCWpsYXJtb3VyQHJlZGhhdC5jby51awogR2xlbiBNY0NyZWFkeQkJCQkJZ2ttQGN5Z251cy5jb20KIEdhcnkgVGhvbWFzCQkJCQlndGhvbWFzQHJlZGhhdC5jb20KLVBpZXJyZSBNdWxsZXIJCQkJCW11bGxlckBzb3VyY2V3YXJlLmN5Z251cy5jb20KIAogCiAqIEluZGljYXRlcyBmb2xrcyB3ZSBuZWVkIHRvIGdldCBLZXJiZXJvcy9TU0ggYWNjb3VudHMgcmVhZHkgc28gdGhleQpkaWZmIC0tZ2l0IGEvZ2RiL05FV1MgYi9nZGIvTkVXUwppbmRleCA0ZjY4ZTgxLi4xNzY1YTcyIDEwMDY0NAotLS0gYS9nZGIvTkVXUworKysgYi9nZGIvTkVXUwpAQCAtMSwxNSArMSw2IEBACiAJCVdoYXQgaGFzIGNoYW5nZWQgaW4gR0RCPwogCSAgICAgKE9yZ2FuaXplZCByZWxlYXNlIGJ5IHJlbGVhc2UpCiAKLSoqKiBDaGFuZ2VzIHNpbmNlIEdEQiA1LjA6Ci0KLSogTmV3IG5hdGl2ZSBjb25maWd1cmF0aW9ucwotCi1BbHBoYSBGcmVlQlNECQkJCQlhbHBoYSotKi1mcmVlYnNkKgoteDg2IEZyZWVCU0QgMy54IGFuZCA0LngJCQkJaVszNDU2XTg2Ki1mcmVlYnNkWzM0XSoKLQotRnJlZUJTRCB2ZXJzaW9ucyBiZWZvcmUgMi4yIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgotCiAqKiogQ2hhbmdlcyBpbiBHREIgNS4wOgogCiAqIEltcHJvdmVkIHN1cHBvcnQgZm9yIGRlYnVnZ2luZyBGUCBwcm9ncmFtcyBvbiB4ODYgdGFyZ2V0cwpkaWZmIC0tZ2l0IGEvZ2RiL1RPRE8gYi9nZGIvVE9ETwppbmRleCBiZWY3MTU1Li5iNGMxMThjIDEwMDY0NAotLS0gYS9nZGIvVE9ETworKysgYi9nZGIvVE9ETwpAQCAtNCwxMyArNCwyNCBAQAogZmluZCBvdXQgd2hldGhlciBhbnlvbmUgZWxzZSBpcyB3b3JraW5nIG9uIGl0LgogCiAKLQkJS25vd24gcHJvYmxlbXMgaW4gR0RCIDUuMAotCQk9PT09PT09PT09PT09PT09PT09PT09PT09CisJCQlLbm93biBwcm9ibGVtcyBpbiBHREIgNS4wCisJCQk9PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEJlbG93IGlzIGEgbGlzdCBvZiBwcm9ibGVtcyBpZGVudGlmaWVkIGR1cmluZyB0aGUgR0RCIDUuMCByZWxlYXNlCiBjeWNsZS4gIFBlb3BsZSBob3BlIHRvIGhhdmUgdGhlc2UgcHJvYmxlbXMgZml4ZWQgaW4gYSBmb2xsb3ctb24KIHJlbGVhc2UuCiAKKyhUaGUgbmFtZXMgaW4gcGFyZW4gaW5kaWNhdGUgcGVvcGxlIHRoYXQgcG9zdGVkIHRoZSBvcmlnaW5hbCBwcm9ibGVtLikKKworLS0KKworR0RCIHJlcXVpcmVzIEdDQyB0byBidWlsZCB1bmRlciBJUklYCisKK0lSSVgsIGJlaW5nIG1vcmUgcGVkYW50aWMgdGhhbiBHQ0MgcmVwb3J0cyBhcyBlcnJvcnMgY2VydGFpbgorYXNzaWdubWVudHMgdGhhdCBHQ0MgdHJlYXRzIGFzIHdhcm5pbmdzLgorCitUaGlzIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGJ5IGJ1aWxkaW5nIEdEQiB3aXRoIHRoZSBHQ0MgY29tcGlsZXIuCisKIC0tCiAKIFRoZSBCRkQgZGlyZWN0b3J5IHJlcXVpcmVzIGJ1Zy1maXhlZCBBVVRPTUFLRSBldC5hbC4KQEAgLTI0LDcgKzM1LDg4IEBACiAKIC0tCiAKK0dlbmVyaWM6IGxpbi10aHJlYWQgY2Fubm90IGhhbmRsZSB0aHJlYWQgZXhpdCAoTWFyayBLZXR0ZW5pcywgTWljaGFlbAorU255ZGVyKSBodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwNTI1Lmh0bWwKKworVGhlIHRocmVhZF9kYiBhc3Npc3RlZCBkZWJ1Z2dpbmcgY29kZSBkb2Vzbid0IGhhbmRsZSBleGl0aW5nIHRocmVhZHMKK3Byb3Blcmx5LCBhdCBsZWFzdCBpbiBjb21iaW5hdGlvbiB3aXRoIGdsaWJjIDIuMS4zICh0aGUgZnJhbWV3b3JrIGlzCit0aGVyZSwganVzdCBub3QgdGhlIGFjdHVhbCBjb2RlKS4gIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcHJvYmxlbXMKK3RoYXQgcHJldmVudCB0aGlzIGZyb20gd29ya2luZy4KKworQXMgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgcG9pbnQsIHRoZSBwcmUgdGhyZWFkX2RiIGNvZGUgZGlkIG5vdCB3b3JrCitlaXRoZXIuCisKKy0tCisKK0phdmEgKEFudGhvbnkgR3JlZW4sIERhdmlkIFRheWxvcikKKworQW50aG9ueSBHcmVlbiBoYXMgYSBudW1iZXIgb2YgSmF2YSBwYXRjaGVzIHRoYXQgZGlkIG5vdCBtYWtlIGl0IGludG8KK3RoZSA1LjAgcmVsZWFzZS4KKworUGF0Y2g6IGphdmEgdGVzdHMKK2h0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC1xMS9tc2cwMDUxMi5odG1sCisKK1BhdGNoOiBqYXZhIGJvb2xlYW5zCitodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtcTEvbXNnMDA1MTUuaHRtbAorCitQYXRjaDogaGFuZGxlIE5fTUFJTiBzdGFiCitodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtcTEvbXNnMDA1MjcuaHRtbAorCistLQorCitQYXNjYWwgKFBpZXJyZSBNdWxsZXIsIERhdmlkIFRheWxvcikKKworUGllcnJlIE11bGxlciBoYXMgY29udHJpYnV0ZWQgcGF0Y2hlcyBmb3IgYWRkaW5nIFBhc2NhbCBMYW5ndWFnZQorc3VwcG9ydCB0byBHREIuCisKKzIgcGFzY2FsIGxhbmd1YWdlIHBhdGNoZXMgaW5zZXJ0ZWQgaW4gZGF0YWJhc2UKK2h0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtcTEvbXNnMDA1MjEuaHRtbAorCitJbmRlbnQgLWdudSA/CitodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwNDk2Lmh0bWwKKworLS0KKworR05VL0xpbnV4L3g4NiBhbmQgcmFuZG9tIHRocmVhZCBzaWduYWxzIChhbmQgU29sYXJpcy9TUEFSQyBidXQgbm90CitTb2xhcmlzL3g4NikuCitodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwMzM2Lmh0bWwKKworQ2hyaXN0b3BoZXIgQmxpenphcmQgd3JpdGVzOgorCitTbywgSSd2ZSBkb25lIHNvbWUgbW9yZSBkaWdnaW5nIGludG8gdGhpcyBhbmQgaXQgbG9va3MgbGlrZSBKaW0KK0tpbmdkb24gaGFzIHJlcG9ydGVkIHRoaXMgcHJvYmxlbSBpbiB0aGUgcGFzdDoKKworaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9idWctZ2RiLzE5OTktMTAvbXNnMDAwNTguaHRtbAorCitJIGNhbiByZXByb2R1Y2UgdGhpcyBwcm9ibGVtIGJvdGggd2l0aCBhbmQgd2l0aG91dCBUb20ncyBwYXRjaC4gIEhhcworYW55b25lIHNlZW4gdGhpcyBiZWZvcmU/ICBNYXliZSBoYXZlIGEgc29sdXRpb24gZm9yIGl0IGhhbmdpbmcgYXJvdW5kPworOikKKworVGhlcmUncyBhIHRlc3QgY2FzZSBmb3IgdGhpcyBkb2N1bWVudGVkIGF0OgorCit3aGVuIGRlYnVnZ2luZyB0aHJlYWRlZCBhcHBsaWNhdGlvbnMgeW91IGdldCBleHRyYSBTSUdUUkFQcworaHR0cDovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTk1NjUKKworW1RoZXJlIHNob3VsZCBiZSBhIEdEQiB0ZXN0Y2FzZSAtIGNhZ25leV0KKworLS0KKworUG9zc2libGUgcmVncmVzc2lvbnMgd2l0aCBzb21lIGRldmVsIEdDQ3MuCitodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwNDc1Lmh0bWwKKworZ2NjLTIuOTUuMiBvdXRwdXRzIGEgbGluZSBub3RlICpiZWZvcmUqIHRoZSBwcm9sb2d1ZSAoYW5kIG9uZSBmb3IgdGhlCitjbG9zaW5nIGJyYWNlIGFmdGVyIHRoZSBlcGlsb2d1ZSwgaW5zdGVhZCBvZiBiZWZvcmUgaXQsIGFzIGl0IHVzZWQgdG8KK2JlKS4gQnkgZGlzYWJsaW5nIHRoZSBSVEwtc3R5bGUgcHJvbG9ndWUgZ2VuZXJhdGluZyBtZWNoYW5pc20KKyh1bmRvY3VtZW50ZWQgR0NDIG9wdGlvbiAtbW5vLXNjaGVkdWxlLXByb2xvZ3VlKSwgeW91IGdldCBiYWNrIHRoZQordHJhZGl0aW9uYWwgYmVoYXZpb3VyLgoraHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC1xMS9tc2cwMDUxMC5odG1sCisKK1RoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KKworLS0KKwogUkZEOiBpbmZydW4uYzogTm8gYnBzdGF0X3N0b3Bfc3RhdHVzIGNhbGwgYWZ0ZXIgcHJvY2VlZCBvdmVyIGJyZWFrPworKFBldGVyIFNjaGF1ZXIpCiBodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtcTEvbXNnMDA2NjUuaHRtbAogCiBHREIgbWlzc2VzIHdhdGNocG9pbnQgdHJpZ2dlcnMgYWZ0ZXIgcHJvY2VlZGluZyBvdmVyIGEgYnJlYWtwb2ludCBvbgpAQCAtNzcsNTEgKzE2OSwyOSBAQAogCiAtLQogCi1HREIgNS4wIGRvZXNuJ3Qgd29yayBvbiBMaW51eC9TUEFSQworR0RCNSBUT1Qgb24gdW5peHdhcmUgNworaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC0wNC9tc2cwMDExOS5odG1sCisKK1JvYmVydCBMaXBlIHdyaXRlczoKKz4gSSBqdXN0IHNwdW4gdGhlIHRvcCBvZiB0cmVlIG9mIHRoZSBHREI1IGJyYW5jaCBvbiBVbml4V2FyZSA3LiAgQXMgYQorPiBwcmFjdGljYWwgbWF0dGVyLCB0aGUgY3VycmVudCB0aHJlYWQgc3VwcG9ydCBpcyBzb21ld2hhdCBtb3JlIGFubm95aW5nCis+IHRoYW4gd2hlbiBHREIgd2FzIHRocmVhZC11bmF3YXJlLgogCiAtLQogCi0JCUNvZGUgQ2xlYW51cHM6IE5leHQgUmVsZWFzZQotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCUNvZGUgQ2xlYW51cHMKKwkJCT09PT09PT09PT09PT0KIAogVGhlIGZvbGxvd2luZyBhcmUgc21hbGwgY2xlYW51cHMgdGhhdCB3aWxsIGhvcGVmdWxseSBiZSBjb21wbGV0ZWQgYnkKIHRoZSBmb2xsb3cgb24gdG8gNS4wLgogCiAtLQogCi1EZWxldGUgbWFjcm8gVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRS4KK0FUVFJJQlVURV9VTlVTRUQKIAotUGF0Y2hlcyBpbiB0aGUgZGF0YWJhc2UuCi0KLS0tCi0KLVB1cmdlIFBBUkFNUy4KLQotRWxpbWluYXRlIGFsbCB1c2VzIG9mIFBBUkFNUyBpbiBHREIncyBzb3VyY2UgY29kZS4KLQotLS0KLQotRWxpbWluYXRpb24gb2YgbWFrZV9jbGVhbnVwX2Z1bmMuIChBbmRyZXcgQ2FnbmV5KQotCi1tYWtlX2NsZWFudXBfZnVuYyBlbGltaW5hdGlvbgotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwNzkxLmh0bWwKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC1xMS9tc2cwMDgxNC5odG1sCi0KLS0tCi0KLUZpeCBjb3B5cmlnaHQgbm90aWNlcy4KLQotVHVybnMgb3V0IHRoYXQgYGAxOTk4LTIwMDAnJyBpc24ndCBjb25zaWRlcmVkIHZhbGlkIDotKAotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDUvbXNnMDA0NjcuaHRtbAotCi0tLQotCi0JCUNvZGUgQ2xlYW51cHM6IEdlbmVyYWwKLQkJPT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgZm9sbG93aW5nIGFyZSBtb3JlIGdlbmVyYWwgY2xlYW51cHMgYW5kIGZpeGVzLiAgVGhleSBhcmUgbm90IHRpZWQKLXRvIGFueSBzcGVjaWZpYyByZWxlYXNlLgorVGhlIG5lZWQgZm9yIHRoaXMgYXMgYWxtb3N0IGJlZW4gZWxpbWluYXRlZC4gIFRoZSBuZXh0IHZlcnNpb24gb2YgR0NDCisoYXNzdW1pbmcgY2FnbmV5IGdldHMgdGhlIHJlbGV2YW50IHBhdGNoIGNvbW1pdHRlZCkgd2lsbCBiZSBhYmxlIHRvCitzdXByZXNzIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZ3MuCiAKIC0tCiAKQEAgLTE0MCwxMiArMjEwLDk1IEBACiAKIC0tCiAKK0RlbGV0ZSBtYWNybyBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFLgorCitQYXRjaGVzIGluIHRoZSBkYXRhYmFzZS4KKworLS0KKworVXBkYXRlZCByZWFkbGluZQorCitSZWFkbGluZSA0Lj8gaXMgb3V0LiAgQSBtZXJnZSB3b3VsZG4ndCBodXJ0LgorCistLQorCitQdXJnZSBQQVJBTVMKKworRWxpbWluYXRlIGFsbCB1c2VzIG9mIFBBUkFNUyBpbiBHREIncyBzb3VyY2UgY29kZS4KKworLS0KKworRWxpbWluYXRpb24gb2YgbWFrZV9jbGVhbnVwX2Z1bmMuIChBbmRyZXcgQ2FnbmV5KQorCittYWtlX2NsZWFudXBfZnVuYyBlbGltaW5hdGlvbgoraHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwNzkxLmh0bWwKK2h0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC1xMS9tc2cwMDgxNC5odG1sCisKKy0tCisKIEVsaW1pbmF0aW9uIG9mIGBgKGNhdGNoX2Vycm9yc19mdHlwZSAqKSBmdW5jJycuCiAKIExpa2UgbWFrZV9jbGVhbnVwX2Z1bmMgaXQgaXNuJ3QgcG9ydGFibGUuCiAKIC0tCiAKK1JlOiBWYXJpb3VzIEMrKyB0aGluZ3MKKwordmFsdWVfaGVhZG9mL3ZhbHVlX2Zyb21fdnRhYmxlX2luZm8gYXJlIHdvcnRobGVzcywgYW5kIHNob3VsZCBiZSByZW1vdmVkLgorVGhlIG9uZSBwbGFjZSBpbiBwcmludGNtZC5jIHRoYXQgdXNlcyBpdCBzaG91bGQgdXNlIHRoZSBSVFRJIGZ1bmN0aW9ucy4KKworUlRUSSBmb3IgZysrIHNob3VsZCBiZSB1c2luZyB0aGUgdHlwZWluZm8gZnVuY3Rpb25zIHJhdGhlciB0aGFuIHRoZSB2dGFibGVzLgorVGhlIHR5cGVpbmZvIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF0IG9mZnNldCA0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdnRhYmxlLAorYW5kIGFyZSBhbHdheXMgcmlnaHQuIFRoZSB2dGFibGVzIHdpbGwgaGF2ZSB3ZWlyZCBuYW1lcyBsaWtlIEU6OlZCIHNvbWV0aW1lcy4KK1RoZSB0eXBlaW5mbyBmdW5jdGlvbiB3aWxsIGFsd2F5cyBiZSAiRSB0eXBlX2luZm8gZnVuY3Rpb24iLCBvciBzb21lc3VjaC4KKwordmFsdWVfdmlydHVhbF9mbl9maWVsZCBuZWVkcyB0byBiZSBmaXhlZCBzbyB0aGVyZSBhcmUgbm8gZmFpbHVyZXMgZm9yIHZpcnR1YWwKK2Z1bmN0aW9ucyBmb3IgQysrIHVzaW5nIGcrKy4KKworVGVzdHN1aXRlIGNhc2VzIGFyZSB0aGUgbWFqb3IgcHJpb3JpdHkgcmlnaHQgbm93IGZvciBDKysgc3VwcG9ydCwgc2luY2UgaSBoYXZlCit0byBtYWtlIGEgbG90IG9mIGNoYW5nZXMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBicmVhayBlYWNoIG90aGVyLgorCistLQorCitGaXggYGBzZXQgYXJjaGl0ZWN0dXJlIDx0YWI+JycKKworVGhpcyBjb21tYW5kIHNob3VsZCBleHBhbmQgdG8gYSBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcy4KK0F0IHByZXNlbnQgYGBpbmZvIGFyY2hpdGVjdHVyZScnIG5lZWRzIHRvIGJlIHVzZWQuICBUaGF0IGlzIHNpbXBseQord3JvbmcuICBJdCBpbnZvbHZlcyB0aGUgdXNlIG9mIGFkZF9zZXRfZW51bV9jbWQoKS4KKworLS0KKworR0RCQVJDSCBjbGVhbnVwIChBbmRyZXcgQ2FnbmV5KQorCitUaGUgbm9uLWdlbmVyYXRlZCBwYXJ0cyBvZiBnZGJhcmNoLntzaCxoLGN9IHNob3VsZCBiZSBzZXBhcmF0ZWQgb3V0CitpbnRvIGFyY2gtdXRpbHMuW2hjXS4KKworRG9jdW1lbnQgdGhhdCBnZGJhcmNoX2luaXRfZnR5cGUgY291bGQgZWFzaWx5IGZhaWwgYmVjYXVzZSBpdCBkaWRuJ3QKK2lkZW50aWZ5IGFuIGFyY2hpdGVjdHVyZS4KKworLS0KKworTWlncmF0ZSBxZlRocmVhZEluZm8gcGFja2V0IC0+IHFUaHJlYWRJbmZvLiAoQW5kcmV3IENhZ25leSkKKworQWRkIHN1cHBvcnQgZm9yIHBhY2tldCBlbmFibGUvZGlzYWJsZSBjb21tYW5kcyB3aXRoIHRoZXNlIHRocmVhZAorcGFja2V0cy4gIEdlbmVyYWwgY2xlYW51cC4KKworW1BBVENIXSBEb2N1bWVudCB0aGUgVGhyZWFkSW5mbyByZW1vdGUgcHJvdG9jb2wgcXVlcmllcworaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwODMyLmh0bWwKKworW1BBVENIXSAiaW5mbyB0aHJlYWRzIiBxdWVyaWVzIGZvciByZW1vdGUuYworaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwODMxLmh0bWwKKworLS0KKworCQkJR2VuZXJhbCBDbGVhbnVwcyAvIEZpeGVzCisJCQk9PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBhcmUgbW9yZSBnZW5lcmFsIGNsZWFudXBzIGFuZCBmaXhlcy4gIFRoZXkgYXJlIG5vdCB0aWVkCit0byBhbnkgc3BlY2lmaWMgcmVsZWFzZS4KKworLS0KKwogTnVrZSBVU0cgZGVmaW5lLgogCiAtLQpAQCAtMTU3LDYgKzMxMCwzMiBAQAogCiAtLQogCitVcGRhdGUgQUxQSEEgc28gdGhhdCBpdCB1c2VzIGBgc3RydWN0IGZyYW1lX2V4dHJhX2luZm8nJyBpbnN0ZWFkIG9mCitFWFRSQV9GUkFNRV9JTkZPLgorCitUaGlzIGlzIGEgYmFycmllciB0byByZXBsYWNpbmcgbWlwc19leHRyYV9mdW5jX2luZm8gd2l0aCBzb21ldGhpbmcKK3RoYXQgd29ya3Mgd2l0aCBtdWx0aS1hcmNoLgorCistLQorCitNdWx0aS1hcmNoICBtaXBzX2V4dHJhX2Z1bmNfaW5mby4KKworVGhpcyBmaXJzdCBuZWVkcyB0aGUgYWxwaGEgdG8gYmUgdXBkYXRlZCBzbyB0aGF0IGl0IHVzZXMgYGBzdHJ1Y3QKK2ZyYW1lX2V4dHJhX2luZm8nJy4KKworLS0KKworU2VuZCBub3JtYWwgb3V0cHV0IHRvIGdkYl9zdGRvdXQuCitTZW5kIGVycm9yIG1lc3NhZ2VzIHRvIGdkYl9zdGRlcnJvci4KK1NlbmQgZGVidWcgYW5kIGxvZyBvdXRwdXQgbG9nIGdkYl9zdGRsb2cuCisKK0dEQiBzdGlsbCBjb250YWlucyBtYW55IGNhc2VzIHdoZXJlIChmKXByaW50ZiBvciBwcmludGZfZmlsdGVyZWQgKCkgaXMKK3VzZWQgd2hlbiBpdCBzaG91bGQgYmUgc2VuZGluZyB0aGUgbWVzc2FnZXMgdG8gZ2RiX3N0ZGVycm9yIG9yCitnZGJfc3RkbG9nLiAgVGhlIHRob3VnaHQgb2YgI2RlZmluaW5nIHByaW50ZiB0byBzb21ldGhpbmcgaGFzIGNyb3NzZWQKK3Blb3BsZXMgbWluZHMgOy0pCisKKy0tCisKIFJhdGlvbmFsaXplIHRoZSBob3N0LWVuZGlhbiBjb2RlIChncmVwIGZvciBIT1NUX0JZVEVfT1JERVIpLgogCiBBdCBwcmVzZW50IGRlZnMuaCBpbmNsdWRlcyA8ZW5kaWFuLmg+ICh3aGljaCBpcyBsaW51eCBzcGVjaWZpYykgeWV0CkBAIC0xNzMsMzggKzM1Miw5IEBACiAKIC0tCiAKLVJlcGxhY2Ugc3Ryc2F2ZSgpICsgbXN0cnNhdmUoKSB3aXRoIGxpYmliZXJ0eTp4c3RyZHVwKCkuCitSYXRpb25haXplIHNhdmVzdHJpbmcoKSwgbXNhdmVzdHJpbmcoKSBhbmQgbXN0cnNhdmUoKS4KIAotLS0KLQotUmVwbGFjZSBzYXZlc3RyaW5nKCkgd2l0aCBzb21ldGhpbmcgZnJvbSBsaWJpYmVydHkuCi0KLUFuIHhzdHJsZHVwKCk/IGJ1dCB0aGF0IHdvdWxkIGhhdmUgZGlmZmVyZW50IHNlbWFudGljcy4KLQotLS0KLQotUmF0aW9uYWxpemUgdXNlIG9mIGZsb2F0Zm9ybWF0X3Vua25vd24gaW4gR0RCIHNvdXJjZXMuCi0KLUluc3RlYWQgb2YgZGVmYXVsdGluZyB0byBmbG9hdGZvcm1hdF91bmtub3duLCBzaG91bGQgaG9zdHMvdGFyZ2V0cwotc3BlY2lmeSB0aGUgdmFsdWUgZXhwbGljaXRseT8KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLTA1L21zZzAwNDQ3Lmh0bWwKLQotLS0KLQotQWRkIGEgYGBuYW1lJycgbWVtYmVyIHRvIGluY2x1ZGUvZmxvYXRmb3JtYXQuaDpzdHJ1Y3QgZmxvYXRmb3JtYXQuCi1QcmludCB0aGF0IG5hbWUgaW4gZ2RiYXJjaC5jLgotCi0tLQotCi1Tb3J0IG91dCB0aGUgaGFycmlzIG1lc3MgaW4gaW5jbHVkZS9mbG9hdGZvcm1hdC5oIChpdCBoYXJkd2lyZXMgdHdvCi1kaWZmZXJlbnQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cykuCi0KLS0tCi0KLVNlZSBvZiB0aGUgR0RCIGxvY2FsIGZsb2F0Zm9ybWF0X2RvX2RvdWJsZXN0KCkgYW5kIGxpYmliZXJ0eSdzCi1mbG9hdGZvcm1hdF90b19kb3VibGUgKHdoaWNoIHdhcyBvbmNlIEdEQidzIC4uLikgY2FuIGJlIG1lcmdlZCBzb21lCi1ob3cuCitJbiBnZW5lcmFsIGxpYmliZXJ0eSdzIHhzdHJkdXAgKCkgY2FuIGJlIHVzZWQuCiAKIC0tCiAKQEAgLTIxNCw2ICszNjQsNjYgQEAKIAogLS0KIAorQ2hlY2svY2xlYW51cCBNSSBkb2N1bWVudGF0aW9uLgorCitUaGUgbGlzdCBvZiBjb21tYW5kcyBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gbmVlZHMgdG8gYmUKK2NoZWNrZWQgYWdhaW5zdCB0aGUgbWktY21kcy5jIHRhYmxlIGluIGEgbWVjaGFuaWNhbCB3YXkgKHNvIHRoYXQgdGhleQordHdvIGNhbiBiZSBrZXB0IHVwLXRvLWRhdGUpLgorCistLQorCitFbGltaW5hdGUgZXJyb3JfYmVnaW4oKS4KKworV2l0aCB1aV9maWxlLCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgc3RhdGVmdWxsIGVycm9yX2JlZ2luICgpCitmdW5jdGlvbi4KKworLS0KKworQWRkIGJ1aWx0LWJ5LCBidWlsZC1kYXRlLCB0bSwgeG0sIG5tIGFuZCBhbnl0aGluZyBlbHNlIGludG8gZ2RiIGJpbmFyeQorc28gdGhhdCB5b3UgY2FuIHNlZSBob3cgdGhlIEdEQiB3YXMgY3JlYXRlZC4KKworU29tZSBvZiB0aGVzZSAoKm0uaCkgd291bGQgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBjb25maWcuaC4gIFRoYXQKK2luIHR1cm4gd291bGQgZml4IGEgbG9uZyBzdGFuZGluZyBidWcgd2hlcmUgYnkgdGhlIGJ1aWxkIHByb2Nlc3MgbWFueQorbm90IG5vdGljZSBhIGNoYW5nZWQgdG0uaCBmaWxlLiAgU2luY2UgZXZlcnl0aGluZyBkZXBlbmRzIG9uIGNvbmZpZy5oLAorYSBjaGFuZ2UgdG8gKm0uaCBmb3JjZXMgYSBjaGFuZ2UgdG8gY29uZmlnLmggYW5kLCBjb25zZXF1ZW50bHkgZm9yY2VzCithIHJlYnVpbGQuCisKKy0tCisKK1JlcGxhY2UgZ2RiX3N0ZHRhcmcgd2l0aCBnZGJfdGFyZ291dCAoYW5kIHBvc3NpYmx5IGdkYl90YXJnZXJyKS4KKworZ2RiX3N0ZHRhcmcgaXMgZWFzaWx5IGNvbmZ1c2VkIHdpdGggZ2RiX3N0ZGFyZy4KKworLS0KKworUmVtb3RlIHByb3RvY29sIGRvY28gZmVlZGJhY2suCisKK1RvbyBtdWNoIGZlZWRiYWNrIHRvIG1lbnRpb24gbmVlZHMgdG8gYmUgbWVyZ2VkIGluICg5MDE2NjApLiAgU2VhcmNoCitmb3IgdGhlIHdvcmQgYGByZW1vdGUnJy4KKworLS0KKworc2V0L3Nob3cgcmVtb3RlIFgtcGFja2V0IC4uLgorCitgYChnZGIpIGhlbHAgc2V0IHJlbW90ZSBYLXBhY2tldCcnIGRvZXNuJ3QgbGlzdCB0aGUgYXBwbGljYWJsZQorcmVzcG9uc2VzLiAgVGhlIGhlbHAgbWVzc2FnZSBuZWVkcyB0byBiZSBleHBhbmRlZC4KKworLS0KKworRXh0cmEgdWlfZmlsZSBtZXRob2RzIC0gZHVtcC4KKworVGhlc2UgYXJlIGZvciBkZWJ1Z2dpbmcgLyB0ZXN0aW5nLiAgQW4gYXNpZGUgaXMgdG8gc2V0IHVwIGEgd2hpdGVib3gKK3Rlc3RzdWl0ZSBmb3Iga2V5IGludGVybmFscyBzdWNoIGFzIHVpX2ZpbGUuCisKKy0tCisKK0FkZCBhbiAiaW5mbyBiZmQiIGNvbW1hbmQgdGhhdCBkaXNwbGF5cyBzdXBwb3J0ZWQgb2JqZWN0IGZvcm1hdHMsCitzaW1pbGFybHkgdG8gb2JqZHVtcCAtaS4KKworSXMgdGhlcmUgYSBjb21tYW5kIGFscmVhZHk/CisKKy0tCisKIEVsaW1pbmF0ZSBQVFIuICBJU08tQyBhbGxvd3MgYGB2b2lkIConJy4KIAogLS0KQEAgLTIzNCw0NjQgKzQ0NCw4IEBACiAKIC0tCiAKLVVwZGF0ZWQgcmVhZGxpbmUKLQotUmVhZGxpbmUgNC4/IGlzIG91dC4gIEEgbWVyZ2Ugd291bGRuJ3QgaHVydC4gIFBhdGNoZXMgYXJlIGluOgotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDUvbXNnMDA0MzYuaHRtbAotCi0tLQotCi1EZXByZWNhdGUgImZnIi4gIEFwcGFyZW50bHkgYGBmZycnIGlzIGFjdHVhbGx5IGNvbnRpbnVlLgotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDUvbXNnMDA0MTcuaHRtbAotCi0tLQotCi1EZXByZWNhdGUgY3VycmVudCB1c2Ugb2YgYGBmbG9hdGZvcm1hdF91bmtub3duJycuCi0KLVJlcXVpcmUgYWxsIHRhcmdldHMgdG8gZXhwbGljaXRseSBwcm92aWRlIHRoZWlyIGZsb2F0IGZvcm1hdCBpbnN0ZWFkCi1vZiBkZWZhdWx0aW5nIHRvIGZsb2F0Zm9ybWF0IHVua25vd24uICBEb2luZyB0aGUgbGF0dGVyIGxlYWRzIHRvIG5hc3R5Ci1idWdzLgotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDUvbXNnMDA0NDcuaHRtbAotCi0tLQotCi1SYXRpb25hbGl6ZSBmbG9hdGZvcm1hdF90b19kb3VibGUoKSB2cyBmbG9hdGZvcm1hdF90b19kb3VibGVzdCgpLgotCi1Mb29rcyBsaWtlIEdEQiBtaWdyYXRlZCBmbG9hdGZvcm1hdF90b19kb3VibGUoKSB0byBsaWJpYmVydHkgYnV0IHRoZW4KLXR1cm5lZCBhcm91bmQgYW5kIGNyZWF0ZWQgYSAuLi5fdG9fZG91Ymxlc3QoKSB0aGUgbGF0dGVyIGNvbnRhaW5pbmcKLXNldmVyYWwgYnVnIGZpeGVzLgotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDUvbXNnMDA0NzIuaHRtbAotCi0tLQotCi1Nb3ZlIGZsb2F0Zm9ybWF0X2lhNjRfZXh0IHRvIGxpYmliZXJ0eS9pbmNsdWRlIGZsb2F0Zm9ybWF0LltjaF0uCi0KLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC0wNS9tc2cwMDQ2Ni5odG1sCi0KLS0tCi0KLUFsd2F5cyBidWlsZCBzZXItdGNwLmMuCi0KLVRoZSBwYXRjaCBhcyBzdWJtaXR0ZWQgd2FzIGp1c3QgZ29pbmcgdG8gYWRkIHNlci10Y3AuYyB0byB0aGUgQWxwaGEncwotbWFrZWZpbGUuICBBIGJldHRlciBwYXRjaCBpcyB0byBpbnN0ZWFkIGFkZCBzZXItdGNwLmMgdG8gU0VSX0hBUkRXQVJFCi1hbmQgbWFrZSBpdCBhIHN0YW5kYXJkIHBhcnQgb2YgYWxsIGRlYnVnZ2Vycy4KLQotSWYgcHJvYmxlbXMgb2NjdXJlIHRoZW4gY29uZmlndXJlLmluIGNhbiBzb3J0IHRoZW0gb3V0LgotCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi1wYXRjaGVzLzIwMDAtMDQvbXNnMDA1NDQuaHRtbAotCi0tLQotCi1Gb2xsb3cgdGhyb3VnaCBgbWFrZSBjaGVjaycgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLVdoZW4gdGhlIHNyY3dhcmUgdHJlZSBpcyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtc2hhcmVkLCB0aGUgYGV4cGVjdCcKLXByb2dyYW0gd29uJ3QgcnVuIHByb3Blcmx5LiAgSmltIFdpbHNvbiBmb3VuZCBvdXQgZ2RiIGhhcyBhIGxvY2FsIGhhY2sKLXRvIHNldCBMRF9MSUJSQVJZX1BBVEgsIGJ1dCwgQUZBSUssIG5vIG90aGVyIHByb2plY3QgaGFzIGJlZW4gaGFja2VkCi1zaW1pbGFybHkuCi0KLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtcTEvbXNnMDA4NDUuaHRtbAotCi0tLQotCi0KLQkJCU5ldyBGZWF0dXJlcyBhbmQgRml4ZXMKLQkJCT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlc2UgYXJlIGhhcmRlciB0aGFuIGNsZWFudXBzIGJ1dCBlYXNpZXIgdGhhbiB3b3JrIGludm9sdmluZwotZnVuZGFtZW50YWwgYXJjaGl0ZWN0dXJhbCBjaGFuZ2UuCi0KLS0tCi0KLUFkZCBidWlsdC1ieSwgYnVpbGQtZGF0ZSwgdG0sIHhtLCBubSBhbmQgYW55dGhpbmcgZWxzZSBpbnRvIGdkYiBiaW5hcnkKLXNvIHRoYXQgeW91IGNhbiBzZWUgaG93IHRoZSBHREIgd2FzIGNyZWF0ZWQuCi0KLVNvbWUgb2YgdGhlc2UgKCptLmgpIHdvdWxkIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlnLmguICBUaGF0Ci1pbiB0dXJuIHdvdWxkIGZpeCBhIGxvbmcgc3RhbmRpbmcgYnVnIHdoZXJlIGJ5IHRoZSBidWlsZCBwcm9jZXNzIG1hbnkKLW5vdCBub3RpY2UgYSBjaGFuZ2VkIHRtLmggZmlsZS4gIFNpbmNlIGV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiBjb25maWcuaCwKLWEgY2hhbmdlIHRvICptLmggZm9yY2VzIGEgY2hhbmdlIHRvIGNvbmZpZy5oIGFuZCwgY29uc2VxdWVudGx5IGZvcmNlcwotYSByZWJ1aWxkLgotCi0tLQotCi1BZGQgYW4gImluZm8gYmZkIiBjb21tYW5kIHRoYXQgZGlzcGxheXMgc3VwcG9ydGVkIG9iamVjdCBmb3JtYXRzLAotc2ltaWxhcmx5IHRvIG9iamR1bXAgLWkuCi0KLUlzIHRoZXJlIGEgY29tbWFuZCBhbHJlYWR5PwotCi0tLQotCi1GaXggYGBJJ20gc29ycnksIERhdmUsIEkgY2FuJ3QgZG8gdGhhdC4nJyBmcm9tIHN5bWZpbGUuYy4KLQotVGhpcyByZXF1aXJlcyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLQotLS0KLQotQ29udmVydCBHREIgYnVpbGQgcHJvY2VzcyB0byBBVVRPTUFLRS4KLQotU2VlIGFsc28gc3ViLWRpcmVjdG9yeSBjb25maWd1cmUgYmVsb3cuCi0KLS0tCi0KLUNsZWFudXAgY29uZmlndXJ5IHN1cHBvcnQgZm9yIG9wdGlvbmFsIHN1Yi1kaXJlY3Rvcmllcy4KLQotQ2hlY2sgaG93IEdDQyBoYW5kbGVzIG11bHRpcGxlIGZyb250IGVuZHMgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaW5ncwotY291bGQgd29yay4gIEEgdGVudGF0aXZlIGZpcnN0IHN0ZXAgaXMgdG8gcmF0aW9uYWxpemUgdGhpbmdzIHNvIHRoYXQKLWFsbCBzdWIgZGlyZWN0b3JpZXMgYXJlIGhhbmRsZWQgaW4gYSBmYXNoaW9uIHNpbWlsYXIgdG8gZ2RiL21pLgotCi1TZWUgYWxzbyBhdXRvbWFrZSBhYm92ZS4KLQotLS0KLQotUmVzdHJ1Y3R1cmUgZ2RiIGRpcmVjdG9yeSB0cmVlIHNvIHRoYXQgaXQgYXZvaWRzIGFueSA4LjMgYW5kIDE0Ci1maWxlbmFtZSBwcm9ibGVtcy4KLQotLS0KLQotQWRkIGEgdHJhbnNjcmlwdCBtZWNoYW5pc20gdG8gR0RCLgotCi1TdWNoIGEgbWVjaGFuaXNtIG1pZ2h0IGxvZyBhbGwgZ2RiIGlucHV0IGFuZCBvdXRwdXQgdG8gYSBmaWxlIGluIGEKLWZvcm0gdGhhdCB3b3VsZCBhbGxvdyBpdCB0byBiZSByZXBsYXllZC4gIEl0IGNvdWxkIGludm9sdmUgYGBnZGIKLS0tdHJhbnNjcmlwdD1GSUxFJycgb3IgaXQgY291bGQgaW52b2x2ZSBgYChnZGIpIHRyYW5zY3JpcHQgZmlsZScnLgotCi0tLQotCi1DYW4gdGhlIHhkZXAgZmlsZXMgYmUgcmVwbGFjZWQgYnkgYXV0b2NvbmY/Ci0KLS0tCi0KLURvY3VtZW50IHRyYWNlIG1hY2hpbmVyeQotCi0tLQotCi1Eb2N1bWVudCB1aS1vdXQgYW5kIHVpLWZpbGUuCi0KLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtMDQvbXNnMDAxMjEuaHRtbAotCi0tLQotCi1VcGRhdGUgdGV4aW5mby50ZXggdG8gbGF0ZXN0PwotCi0KLQotLS0KLQotSW5jb3Jwb3JhdGUgYWdlbnRleHByLnRleGkgaW50byBnZGIudGV4aW5mbwotCi1hZ2VudGV4cHIudGV4aSBtb3N0bHkgZGVzY3JpYmVzIHRoZSBkZXRhaWxzIG9mIHRoZSBieXRlIGNvZGUgdXNlZCBmb3IKLXRyYWNlcG9pbnRzLCBub3QgdGhlIGludGVybmFscyBvZiB0aGUgc3VwcG9ydCBmb3IgdGhpcyBpbiBHREIuICBTbyBpdAotbG9va3MgbGlrZSBnZGIudGV4aW5mbyBpcyBhIGJldHRlciBwbGFjZSBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLTA0L21zZzAwNTY2Lmh0bWwKLQotLS0KLQotRG9jdW1lbnQgb3ZlcmxheSBtYWNoaW5lcnkuCi0KLS0tCi0KLWBgKGdkYikgY2F0Y2ggc2lnbmFsIFNJR05BTCcnCi0KLU92ZXJsYXBzIHdpdGggYGBoYW5kbGUgU0lHTkFMJycgYnV0IHRoZSBpbXBsaWVkIGJlaGF2b3VyIGlzIGRpZmZlcmVudC4KLVlvdSBjYW4gYXR0YWNoIGNvbW1hbmRzIHRvIGEgY2F0Y2ggYnV0IG5vdCBhIGhhbmRsZS4gIEEgaGFuZGxlIGhhcyBhCi1saW1pdGVkIG51bWJlciBvZiBoYXJkd2lyZWQgYWN0aW9ucy4KLQotLS0KLQotR2V0IHRoZSBUVUkgd29ya2luZyBvbiBhbGwgcGxhdGZvcm1zLgotCi0tLQotCi1BZGQgc3VwcG9ydCBmb3IgYGBnZGIgLS0tIFBST0dSQU0gQVJHUyAuLi4nJy4KLUFkZCBzdXBwb3J0IGZvciBgYGdkYiAtY21kPS4uLicnCi0KLUFsb25nIHdpdGggbWFueSB2YXJpYXRpb25zLiAgQ2hlY2s6Ci0KLT8/Pz8/IGZvciBhIGZ1bGwgZGlzY3Vzc2lvbi4KLQotZm9yIGEgZGlzY3Vzc2lvbi4KLQotLS0KLQotSW1wbGVtZW50IGBgKGdkYikgIWxzJycuCi0KLVdoaWNoIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gYGAoZ2RiKSAhIGxzJycuICBJbXBsZW1lbnRpbmcgdGhlIGxhdHRlcgotaXMgdHJpdmlhbC4KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC1xMS9tc2cwMDAzNC5odG1sCi0KLS0tCi0KLVJlcGxhY2UgdGhlIGNvZGUgdGhhdCB1c2VzIHRoZSBob3N0IEZQVSB3aXRoIGFuIGVtdWxhdG9yIG9mIHRoZSB0YXJnZXQKLUZQVS4KLQotLS0KLQotCQkJVGhyZWFkIFN1cHBvcnQKLQkJCT09PT09PT09PT09PT09Ci0KLS0tCi0KLUdlbmVyaWM6IGxpbi10aHJlYWQgY2Fubm90IGhhbmRsZSB0aHJlYWQgZXhpdCAoTWFyayBLZXR0ZW5pcywgTWljaGFlbAotU255ZGVyKSBodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwNTI1Lmh0bWwKLQotVGhlIHRocmVhZF9kYiBhc3Npc3RlZCBkZWJ1Z2dpbmcgY29kZSBkb2Vzbid0IGhhbmRsZSBleGl0aW5nIHRocmVhZHMKLXByb3Blcmx5LCBhdCBsZWFzdCBpbiBjb21iaW5hdGlvbiB3aXRoIGdsaWJjIDIuMS4zICh0aGUgZnJhbWV3b3JrIGlzCi10aGVyZSwganVzdCBub3QgdGhlIGFjdHVhbCBjb2RlKS4gIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcHJvYmxlbXMKLXRoYXQgcHJldmVudCB0aGlzIGZyb20gd29ya2luZy4KLQotQXMgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgcG9pbnQsIHRoZSBwcmUgdGhyZWFkX2RiIGNvZGUgZGlkIG5vdCB3b3JrCi1laXRoZXIuCi0KLS0tCi0KLUdOVS9MaW51eC94ODYgYW5kIHJhbmRvbSB0aHJlYWQgc2lnbmFscyAoYW5kIFNvbGFyaXMvU1BBUkMgYnV0IG5vdAotU29sYXJpcy94ODYpLgotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC1xMS9tc2cwMDMzNi5odG1sCi0KLUNocmlzdG9waGVyIEJsaXp6YXJkIHdyaXRlczoKLQotU28sIEkndmUgZG9uZSBzb21lIG1vcmUgZGlnZ2luZyBpbnRvIHRoaXMgYW5kIGl0IGxvb2tzIGxpa2UgSmltCi1LaW5nZG9uIGhhcyByZXBvcnRlZCB0aGlzIHByb2JsZW0gaW4gdGhlIHBhc3Q6Ci0KLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvYnVnLWdkYi8xOTk5LTEwL21zZzAwMDU4Lmh0bWwKLQotSSBjYW4gcmVwcm9kdWNlIHRoaXMgcHJvYmxlbSBib3RoIHdpdGggYW5kIHdpdGhvdXQgVG9tJ3MgcGF0Y2guICBIYXMKLWFueW9uZSBzZWVuIHRoaXMgYmVmb3JlPyAgTWF5YmUgaGF2ZSBhIHNvbHV0aW9uIGZvciBpdCBoYW5naW5nIGFyb3VuZD8KLTopCi0KLVRoZXJlJ3MgYSB0ZXN0IGNhc2UgZm9yIHRoaXMgZG9jdW1lbnRlZCBhdDoKLQotd2hlbiBkZWJ1Z2dpbmcgdGhyZWFkZWQgYXBwbGljYXRpb25zIHlvdSBnZXQgZXh0cmEgU0lHVFJBUHMKLWh0dHA6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD05NTY1Ci0KLVtUaGVyZSBzaG91bGQgYmUgYSBHREIgdGVzdGNhc2UgLSBjYWduZXldCi0KLS0tCi0KLUdEQjUgVE9UIG9uIHVuaXh3YXJlIDcKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtMDQvbXNnMDAxMTkuaHRtbAotCi1Sb2JlcnQgTGlwZSB3cml0ZXM6Ci0+IEkganVzdCBzcHVuIHRoZSB0b3Agb2YgdHJlZSBvZiB0aGUgR0RCNSBicmFuY2ggb24gVW5peFdhcmUgNy4gIEFzIGEKLT4gcHJhY3RpY2FsIG1hdHRlciwgdGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgc29tZXdoYXQgbW9yZSBhbm5veWluZwotPiB0aGFuIHdoZW4gR0RCIHdhcyB0aHJlYWQtdW5hd2FyZS4KLQotLS0KLQotTWlncmF0ZSBxZlRocmVhZEluZm8gcGFja2V0IC0+IHFUaHJlYWRJbmZvLiAoQW5kcmV3IENhZ25leSkKLQotQWRkIHN1cHBvcnQgZm9yIHBhY2tldCBlbmFibGUvZGlzYWJsZSBjb21tYW5kcyB3aXRoIHRoZXNlIHRocmVhZAotcGFja2V0cy4gIEdlbmVyYWwgY2xlYW51cC4KLQotW1BBVENIXSBEb2N1bWVudCB0aGUgVGhyZWFkSW5mbyByZW1vdGUgcHJvdG9jb2wgcXVlcmllcwotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwODMyLmh0bWwKLQotW1BBVENIXSAiaW5mbyB0aHJlYWRzIiBxdWVyaWVzIGZvciByZW1vdGUuYwotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwODMxLmh0bWwKLQotLS0KLQotCQkJTGFuZ3VhZ2UgU3VwcG9ydAotCQkJPT09PT09PT09PT09PT09PQotCi1OZXcgbGFuZ3VhZ2VzIGNvbWUgb250byB0aGUgc2NlbmUgYWxsIHRoZSB0aW1lLgotCi0tLQotCi1QYXNjYWwgKFBpZXJyZSBNdWxsZXIsIERhdmlkIFRheWxvcikKLQotUGllcnJlIE11bGxlciBoYXMgY29udHJpYnV0ZWQgcGF0Y2hlcyBmb3IgYWRkaW5nIFBhc2NhbCBMYW5ndWFnZQotc3VwcG9ydCB0byBHREIuCi0KLTIgcGFzY2FsIGxhbmd1YWdlIHBhdGNoZXMgaW5zZXJ0ZWQgaW4gZGF0YWJhc2UKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtcTEvbXNnMDA1MjEuaHRtbAotCi1JbmRlbnQgLWdudSA/Ci1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwNDk2Lmh0bWwKLQotLS0KLQotSmF2YSAoQW50aG9ueSBHcmVlbiwgRGF2aWQgVGF5bG9yKQotCi1BbnRob255IEdyZWVuIGhhcyBhIG51bWJlciBvZiBKYXZhIHBhdGNoZXMgdGhhdCBkaWQgbm90IG1ha2UgaXQgaW50bwotdGhlIDUuMCByZWxlYXNlLgotCi1QYXRjaDogamF2YSB0ZXN0cwotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGItcGF0Y2hlcy8yMDAwLXExL21zZzAwNTEyLmh0bWwKLQotUGF0Y2g6IGphdmEgYm9vbGVhbnMKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC1xMS9tc2cwMDUxNS5odG1sCi0KLVBhdGNoOiBoYW5kbGUgTl9NQUlOIHN0YWIKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLXBhdGNoZXMvMjAwMC1xMS9tc2cwMDUyNy5odG1sCi0KLS0tCi0KLVtDb21taW5nLi4uXQotCi1Nb2RpZnkgZ2RiIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggUGFzY2FsLgotCi0tLQotCi1SZTogVmFyaW91cyBDKysgdGhpbmdzCi0KLXZhbHVlX2hlYWRvZi92YWx1ZV9mcm9tX3Z0YWJsZV9pbmZvIGFyZSB3b3J0aGxlc3MsIGFuZCBzaG91bGQgYmUKLXJlbW92ZWQuICBUaGUgb25lIHBsYWNlIGluIHByaW50Y21kLmMgdGhhdCB1c2VzIGl0IHNob3VsZCB1c2UgdGhlIFJUVEkKLWZ1bmN0aW9ucy4KLQotUlRUSSBmb3IgZysrIHNob3VsZCBiZSB1c2luZyB0aGUgdHlwZWluZm8gZnVuY3Rpb25zIHJhdGhlciB0aGFuIHRoZQotdnRhYmxlcy4gIFRoZSB0eXBlaW5mbyBmdW5jdGlvbnMgYXJlIGFsd2F5cyBhdCBvZmZzZXQgNCBmcm9tIHRoZQotYmVnaW5uaW5nIG9mIHRoZSB2dGFibGUsIGFuZCBhcmUgYWx3YXlzIHJpZ2h0LiBUaGUgdnRhYmxlcyB3aWxsIGhhdmUKLXdlaXJkIG5hbWVzIGxpa2UgRTo6VkIgc29tZXRpbWVzLiAgVGhlIHR5cGVpbmZvIGZ1bmN0aW9uIHdpbGwgYWx3YXlzCi1iZSAiRSB0eXBlX2luZm8gZnVuY3Rpb24iLCBvciBzb21lc3VjaC4KLQotdmFsdWVfdmlydHVhbF9mbl9maWVsZCBuZWVkcyB0byBiZSBmaXhlZCBzbyB0aGVyZSBhcmUgbm8gZmFpbHVyZXMgZm9yCi12aXJ0dWFsIGZ1bmN0aW9ucyBmb3IgQysrIHVzaW5nIGcrKy4KLQotVGVzdHN1aXRlIGNhc2VzIGFyZSB0aGUgbWFqb3IgcHJpb3JpdHkgcmlnaHQgbm93IGZvciBDKysgc3VwcG9ydCwKLXNpbmNlIGkgaGF2ZSB0byBtYWtlIGEgbG90IG9mIGNoYW5nZXMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBicmVhawotZWFjaCBvdGhlci4KLQotLS0KLQotQWRkIHN1cHBvcnQgZm9yIE1vZHVsYTMKLQotR2V0IERFQy9Db21wYXEgdG8gY29udHJpYnV0ZSB0aGVpciBNb2R1bGEtMyBzdXBwb3J0LgotCi0tLQotCi0JCVJlbW90ZSBQcm90b2NvbCBTdXBwb3J0Ci0JCT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS0tCi0KLXNldC9zaG93IHJlbW90ZSBYLXBhY2tldCAuLi4KLQotYGAoZ2RiKSBoZWxwIHNldCByZW1vdGUgWC1wYWNrZXQnJyBkb2Vzbid0IGxpc3QgdGhlIGFwcGxpY2FibGUKLXJlc3BvbnNlcy4gIFRoZSBoZWxwIG1lc3NhZ2UgbmVlZHMgdG8gYmUgZXhwYW5kZWQuCi0KLS0tCi0KLVJlbW90ZSBwcm90b2NvbCBkb2NvIGZlZWRiYWNrLgotCi1Ub28gbXVjaCBmZWVkYmFjayB0byBtZW50aW9uIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiAoOTAxNjYwKS4gIFNlYXJjaAotZm9yIHRoZSB3b3JkIGBgcmVtb3RlJycuCi0KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC1xMS9tc2cwMDAyMy5odG1sCi1odHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL21sL2dkYi8yMDAwLXExL21zZzAwMDU2Lmh0bWwKLWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbWwvZ2RiLzIwMDAtcTEvbXNnMDAzODIuaHRtbAotCi0tLQotCi1HREIgZG9lc24ndCByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbSByZW1vdGUgcHJvdG9jb2wgZXJyb3JzLgotCi1HREIgd2Fzbid0IGNoZWNraW5nIGZvciBOQUtzIGZyb20gdGhlIHJlbW90ZSB0YXJnZXQuICBJbnN0ZWFkIGEgTkFLIGlzCi1pZ25vcmVkIGFuZCBhIHRpbWVvdXQgaXMgcmVxdWlyZWQgYmVmb3JlIEdEQiByZXRyaWVzLiAgQSBwcmUtY3Vyc29yIHRvCi1maXhpbmcgdGhpcyB0aGlzIGlzIG1ha2luZyBHREIncyByZW1vdGUgcHJvdG9jb2wgcGFja2V0IG1vcmUgcm9idXN0LgotCi1XaGlsZSBkb3dubG9hZGluZyB0byBhIHJlbW90ZSBwcm90b2NvbCB0YXJnZXQsIGdkYiBpZ25vcmVzIHBhY2tldAotZXJyb3JzIGluIHNvIGZhciBhcyBpdCB3aWxsIGNvbnRpbnVlIHRvIGVkb3dubG9hZCB3aXRoIGNodW5rIE4rMSBldmVuCi1pZiBjaHVuayBOIHdhcyBub3QgY29ycmVjdGx5IHNlbnQuICBUaGlzIGNhdXNlcyBnZGIuYmFzZS9yZW1vdGUuZXhwIHRvCi10YWtlIGEgcGFpbmZ1bGx5IGxvbmcgdGltZSB0byBydW4uICBBcyBhIFBTIHRoYXQgdGVzdCBuZWVkcyB0byBiZQotZml4ZWQgc28gdGhhdCBpdCBidWlsZHMgb24gMTYgYml0IG1hY2hpbmVzLgotCi0tLQotCi1BZGQgdGhlIGN5Y2xlIHN0ZXAgY29tbWFuZC4KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC1xMS9tc2cwMDIzNy5odG1sCi0KLS0tCi0KLVJlc29sdmUgaG93IHRvIHNjYWxlIHRoaW5ncyB0byBzdXBwb3J0IHZlcnkgbGFyZ2UgcGFja2V0cy4KLQotLS0KLQotUmVzb2x2ZSBob3cgdG8gaGFuZGxlIGEgdGFyZ2V0IHRoYXQgY2hhbmdlcyB0aGluZ3MgbGlrZSBpdHMgZW5kaWFuZXNzCi1vbiB0aGUgZmx5IC0gc2hvdWxkIGl0IGJlIHJldHVybmVkIGluIHRoZSBgYFQnJyBwYWNrZXQ/Ci0KLVVuZGVybHlpbmcgcHJvYmxlbSBpcyB0aGF0IHRoZSByZWdpc3RlciBmaWxlIGlzIHRhcmdldCBlbmRpYW4uICBJZiB0aGUKLXRhcmdldCBlbmRpYW5lc3MgY2hhbmdlcyBnZGIgZG9lc24ndCBrbm93LgotCi0tLQotCi0JCQlTeW1ib2wgU3VwcG9ydAotCQkJPT09PT09PT09PT09PT0KLQotSWYgLyB3aGVuIEdEQiBzdGFydHMgdG8gc3VwcG9ydCB0aGUgZGVidWdnaW5nIG9mIG11bHRpLXByb2Nlc3NvcgotKHJhdGhlciB0aGFuIG11bHRpLXRocmVhZCkgYXBwbGljYXRpb25zIHRoZSBzeW10YWIgY29kZSB3aWxsIG5lZWQgdG8KLWJlIHVwZGF0ZWQgYSBsaXR0bGUgc28gdGhhdCBzZXZlcmFsIGluZGVwZW5kYW50IHN5bWJvbCB0YWJsZXMgYXJlCi1hY3RpdmUgYXQgYSBnaXZlbiB0aW1lLgotCi1UaGUgb3RoZXIgaW50ZXJlc3RpbmcgY2hhbmdlIGlzIGEgY2xhcmlmaWNhdGlvbiBvZiB0aGUgZXhhY3QgbWVhbmluZwotb2YgQ09SRV9BRERSIGFuZCB0aGF0IGhhcyBoYWQgY29uc2VxdWVuY2VzIGZvciBhIGZldyB0YXJnZXRzICh0aGF0Ci13ZXJlIGFidXNpbmcgdGhhdCBkYXRhIHR5cGUpLgotCi0tLQotCi1JbnZlc3RpYWdhdGUgd2F5cyBvZiByZWR1Y2luZyBtZW1vcnkuCi0KLS0tCi0KLUludmVzdGlnYXRlIHdheXMgb2YgaW1wcm92aW5nIGxvYWQgdGltZS4KLQotLS0KLQotR2V0IHRoZSBkMTB2IHRvIHVzZSBQT0lOVEVSX1RPX0FERFJFU1MgYW5kIEFERFJFU1NfVE9fUE9JTlRFUi4KLQotQ29uc2VxdWVuY2Ugb2YgcmVjZW50IHN5bXRhYiBjbGFyaWZpY2F0aW9uLiAgTm8gbWFya3MgZm9yIGZpZ3VyaW5nIG91dAotd2hvIG1haW50YWlucyB0aGUgZDEwdi4KLQotLS0KLQotR2V0IHRoZSBNSVBTIHRvIGNvcnJlY3RseSBzaWduIGV4dGVuZCBhbGwgYWRkcmVzcyA8LT4gcG9pbnRlcgotY29udmVyc2lvbnMuCi0KLUNvbnNlcXVlbmNlIG9mIHJlY2VudCBzeW10YWIgY2xhcmlmaWNhdGlvbi4gIE5vIG1hcmtzIGZvciBmaWd1cmluZyBvdXQKLXdobyBtYWludGFpbnMgdGhlIE1JUFMuCi0KLS0tCi0KLQkJCVRlc3RzdWl0ZSBTdXBwb3J0Ci0JCQk9PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgbmV2ZXIgdG8gbWFueSB0ZXN0Y2FzZXMuCi0KLS0tCi0KLUJldHRlciB0aHJlYWQgdGVzdHN1aXRlLgotCi0tLQotCi1CZXR0ZXIgQysrIHRlc3RzdWl0ZS4KLQotLS0KLQotTG9vayBhdCBhZGRpbmcgYSBHREIgc3BlY2lmaWMgdGVzdHN1aXRlIGRpcmVjdG9yeSBzbyB0aGF0IHdoaXRlIGJveAotdGVzdHMgb2Yga2V5IGludGVybmFscyBjYW4gYmUgYWRkZWQgKGVnIHVpX2ZpbGUpLgotCi0tLQotCi1TZXBhcmF0ZSBvdXQgdGVzdHMgdGhhdCBpbnZvbHZlIHRoZSBmbG9hdGluZyBwb2ludCAoRlApLgotCi0oU29tZXRoaW5nIGZvciBwZW9wbGUgYnJpbmluZyB1cCBuZXcgdGFyZ2V0cykuICBGUCBhbmQgbm9uLWZwIHRlc3RzCi1hcmUgY29tYmluZWQuICBJIHRoaW5rIHRoZXJlIHNob3VsZCBiZSBzZXQgb2YgYmFzaWMgdGVzdHMgdGhhdAotZXhlcmNpc2UgcHVyZSBpbnRlZ2VyIHN1cHBvcnQgYW5kIHRoZW4gYSBtb3JlIGV4cGFuZGVkIHNldCB0aGF0Ci1leGVyY2lzZSBGUCBhbmQgRlAvaW50ZWdlciBpbnRlcmFjdGlvbnMuCi0KLUFzIGFuIGV4YW1wbGUsIHRoZSBNSVBTLCBmb3IgbjMyIGFzIHByb2JsZW1zIHdpdGggcGFzc2luZyBGUCdzIGFuZAotc3RydWN0cy4gIFNpbmNlIG1vc3QgaW5mZXJpb3IgY2FsbCB0ZXN0cyBpbmNsdWRlIEZQIGl0IGlzIGRpZmZpY3VsdCB0bwotZGV0ZXJtaW5lIG9mIHRoZSBpbnRlZ2VyIHRlc3RzIGFyZSBvay4KLQotLS0KLQotCQlBcmNoaXRlY3R1cmFsIENoYW5nZXM6IEdlbmVyYWwKLQkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQlBcmNoaXRlY3R1cmFsIENoYW5nZXMKKwkJCT09PT09PT09PT09PT09PT09PT09PQogCiBUaGVzZSBhcmUgaGFyZGVyIHRoYW4gc2ltcGxlIGNsZWFudXBzIC8gZml4ZXMgYW5kLCBjb25zZXF1ZW50bHkKIGludm9sdmUgbW9yZSB3b3JrLiAgVHlwaWNhbGx5IGFuIEFyY2hpdGVjdHVyYWwgQ2hhbmdlIHdpbGwgYmUgYnJva2VuCkBAIC02OTksMTUgKzQ1Myw2IEBACiAKIC0tCiAKLUNsZWFudXAgc29mdHdhcmUgc2luZ2xlIHN0ZXAuCi0KLUF0IHByZXNlbnQgbWFueSB0YXJnZXRzIGltcGxlbWVudCBzb2Z0d2FyZSBzaW5nbGUgc3RlcCBieSBkaXJlY3RseQotYmxhdHRpbmcgbWVtb3J5IChzZWUgcnM2MDAwLXRkZXAuYykuICBUaG9zZSB0YXJnZXRzIHNob3VsZCByZWdpc3RlcgotdGhlIGFwcGxpY2FibGUgYnJlYWtwb2ludHMgdXNpbmcgdGhlIGJyZWFrcG9pbnQgZnJhbWV3b3JrLiAgUGVyaGFwaHMgYQotbmV3IGludGVybmFsIGJyZWFrcG9pbnQgY2xhc3MgYGBzdGVwJycgaXMgbmVlZGVkLgotCi0tLQotCiBSZXBsYWNlIFJFQURfRlAoKSB3aXRoIEZSQU1FX0hBTkRMRSgpLgogCiBSRUFEX0ZQKCkgaXMgYSBoYW5nb3ZlciBmcm9tIHRoZSBkYXlzIG9mIHRoZSB2YXggd2hlbiB0aGUgQUJJIHJlYWxseQpAQCAtNzIyLDYgKzQ2NywxNyBAQAogCiAtLQogCitNSSdzIGlucHV0IGRvZXMgbm90IHVzZSBidWZmZXJpbmcuCisKK0F0IHByZXNlbnQgdGhlIE1JIGludGVyZmFjZSByZWFkcyByYXcgY2hhcmFjdGVycyBvZiBmcm9tIGFuIHVuYnVmZmVyZWQKK0ZELiAgVGhpcyBpcyB0byBhdm9pZCBzZXZlcmFsIG5hc3R5IGJ1ZmZlci9yYWNlIGNvbmRpdGlvbnMuICBUaGF0IGNvZGUKK3Nob3VsZCBiZSBjaGFuZ2VkIHNvIHRoYXQgaXQgcmVnaXN0ZXJzIGl0cyBzZWxmIHdpdGggdGhlIGV2ZW50IGxvb3AKKyhvbiB0aGUgaW5wdXQgRkQpIGFuZCB0aGVuIHB1c2ggY29tbWFuZHMgdXAgdG8gTUkgYXMgdGhleSBhcnJpdmUuCisKK1RoZSBzZXJpYWwgY29kZSBhbHJlYWR5IGRvZXMgdGhpcy4KKworLS0KKwogUmVnaXN0ZXIgQ2FjaGUgQ2xlYW51cCAoYmVsb3cgZnJvbSBBbmRyZXcgQ2FnbmV5KQogCiBJIHdvdWxkIGRlcGljdCB0aGUgY3VycmVudCByZWdpc3RlciBhcmNoaXRlY3R1cmUgYXMgc29tZXRoaW5nIGxpa2U6CkBAIC04NDEsNiArNTk3LDEyIEBACiAKIC0tCiAKK0ZpeCBgYEknbSBzb3JyeSwgRGF2ZSwgSSBjYW4ndCBkbyB0aGF0LicnIGZyb20gc3ltZmlsZS5jLgorCitUaGlzIHJlcXVpcmVzIGludGVybmF0aW9uYWxpemF0aW9uLgorCistLQorCiBDaGVjayB0aGF0IEdEQiBjYW4gaGFuZGxlIGFsbCBCRkQgYXJjaGl0ZWN0dXJlcyAoQW5kcmV3IENhZ25leSkKIAogVGhlcmUgc2hvdWxkIGJlIGEgdGVzdCB0aGF0IGNoZWNrcyB0aGF0IEJGRC9HREIgYXJlIGluIHN5bmMgd2l0aApAQCAtODUwLDc1ICs2MTIsOSBAQAogCiAtLQogCi0JCUFyY2hpdGVjdHVyYWwgQ2hhbmdlOiBNdWx0aS1hcmNoIGV0IGFsLgotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FkZCBzdXBwb3J0IGZvciBNb2R1bGEzCiAKLVRoZSBsb25nIHRlcm0gb2JqZWN0aXZlIGlzIHRvIHJlbW92ZSBhbGwgYXNzdW1wdGlvbnMgdGhhdCB0aGVyZSBpcyBhCi1zaW5nbGUgdGFyZ2V0IHdpdGggYSBzaW5nbGUgYWRkcmVzcyBzcGFjZSB3aXRoIGEgc2luZ2xlIGluc3RydWN0aW9uCi1zZXQgYXJjaGl0ZWN0dXJlIGFuZCBzaW5nbGUgYXBwbGljYXRpb24gYmluYXJ5IGludGVyZmFjZS4KLQotVGhpcyBpcyBhbiBvbmdvaW5nIGVmZm9ydC4gIFRoZSBmaXJzdCBtaWxlc3RvbmUgaXMgdG8gZW5hYmxlCi1gYG11bHRpLWFyY2gnJyB3aGVyZSBieSBhbGwgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMgYXJlIG1hZGUgYXQKLXJ1bnRpbWUuCi0KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGBgZ2RiYXJjaCcnIGlzIHJlYWxseSBgYGdkYmFiaScnIGFuZAotYGBnZGJpc2EnJy4gIE9uY2UgdGhpbmdzIGFyZSBtdWx0aS1hcmNoZWQgYnJlYWtpbmcgdGhhdCBkb3duIGNvcnJlY3RseQotd2lsbCBiZWNvbWUgbXVjaCBlYXNpZXIuCi0KLS0tCi0KLUdEQkFSQ0ggY2xlYW51cCAoQW5kcmV3IENhZ25leSkKLQotVGhlIG5vbi1nZW5lcmF0ZWQgcGFydHMgb2YgZ2RiYXJjaC57c2gsaCxjfSBzaG91bGQgYmUgc2VwYXJhdGVkIG91dAotaW50byBhcmNoLXV0aWxzLltoY10uCi0KLURvY3VtZW50IHRoYXQgZ2RiYXJjaF9pbml0X2Z0eXBlIGNvdWxkIGVhc2lseSBmYWlsIGJlY2F1c2UgaXQgZGlkbid0Ci1pZGVudGlmeSBhbiBhcmNoaXRlY3R1cmUuCi0KLS0tCi0KLUZpeCBCRUxJRVZFX1BQQ19QUk9NT1RJT04uICBDaGFuZ2UgaXQgdG8gQkVMSUVWRV9QUENfUFJPTU9USU9OX1A/Ci0KLUF0IHByZXNlbnQgdGhlcmUgaXMgc3RpbGwgI2lmZGVmIEJFTElFVkVfUFBDX1BST01PVElPTiBjb2RlIGluIHRoZQotc3ltdGFiIGZpbGUuCi0KLS0tCi0KLUZpeCBgYHNldCBhcmNoaXRlY3R1cmUgPHRhYj4nJwotCi1UaGlzIGNvbW1hbmQgc2hvdWxkIGV4cGFuZCB0byBhIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzLgotQXQgcHJlc2VudCBgYGluZm8gYXJjaGl0ZWN0dXJlJycgbmVlZHMgdG8gYmUgdXNlZC4gIFRoYXQgaXMgc2ltcGx5Ci13cm9uZy4gIEl0IGludm9sdmVzIHRoZSB1c2Ugb2YgYWRkX3NldF9lbnVtX2NtZCgpLgotCi0tLQotCi1GaXggdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QoKSBldGMuCi0KLVRoZSBuYW1lIGlzIHdyb25nIGZvciBzdGFydGVycy4gIGBgdGFyZ2V0X3NpZ25hbCcnIHNob3VsZCBwcm9iYWJseSBiZQotYGBnZGJfc2lnbmFsJycuICBgYGZyb21faG9zdCcnIHNob3VsZCBiZSBgYGZyb21fdGFyZ2V0X3NpZ25hbCcnLgotQWZ0ZXIgdGhhdCBpdCBuZWVkcyB0byBiZSBtdWx0aS1hcmNoZWQgYW5kIG1hZGUgaW5kZXBlbmRhbnQgb2YgYW55Ci1ob3N0IHNpZ25hbCBudW1iZXJpbmcuCi0KLS0tCi0KLVVwZGF0ZSBBTFBIQSBzbyB0aGF0IGl0IHVzZXMgYGBzdHJ1Y3QgZnJhbWVfZXh0cmFfaW5mbycnIGluc3RlYWQgb2YKLUVYVFJBX0ZSQU1FX0lORk8uCi0KLVRoaXMgaXMgYSBiYXJyaWVyIHRvIHJlcGxhY2luZyBtaXBzX2V4dHJhX2Z1bmNfaW5mbyB3aXRoIHNvbWV0aGluZwotdGhhdCB3b3JrcyB3aXRoIG11bHRpLWFyY2guCi0KLS0tCi0KLU11bHRpLWFyY2ggIG1pcHNfZXh0cmFfZnVuY19pbmZvLgotCi1UaGlzIGZpcnN0IG5lZWRzIHRoZSBhbHBoYSB0byBiZSB1cGRhdGVkIHNvIHRoYXQgaXQgdXNlcyBgYHN0cnVjdAotZnJhbWVfZXh0cmFfaW5mbycnLgotCi0tLQotCi1SYXRpb25hbGl6ZSBUQVJHRVRfU0lOR0xFX0ZPUk1BVCBhbmQgVEFSR0VUX1NJTkdMRV9CSVQgZXQgYWwuCi0KLVN1cmVseSBvbmUgb2YgdGhlbSBpcyByZWR1bmRhbnQuCitHZXQgREVDL0NvbXBhcSB0byBjb250cmlidXRlIHRoZWlyIE1vZHVsYS0zIHN1cHBvcnQuCiAKIC0tCiAKQEAgLTkyNiw2ICs2MjIsNDQgQEAKIAogLS0KIAorQ29udmVydCBHREIgYnVpbGQgcHJvY2VzcyB0byBBVVRPTUFLRS4KKworU2VlIGFsc28gc3ViLWRpcmVjdG9yeSBjb25maWd1cmUgYmVsb3cuCisKKy0tCisKK0NsZWFudXAgY29uZmlndXJ5IHN1cHBvcnQgZm9yIG9wdGlvbmFsIHN1Yi1kaXJlY3Rvcmllcy4KKworQ2hlY2sgaG93IEdDQyBoYW5kbGVzIG11bHRpcGxlIGZyb250IGVuZHMgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaW5ncworY291bGQgd29yay4gIEEgdGVudGF0aXZlIGZpcnN0IHN0ZXAgaXMgdG8gcmF0aW9uYWxpemUgdGhpbmdzIHNvIHRoYXQKK2FsbCBzdWIgZGlyZWN0b3JpZXMgYXJlIGhhbmRsZWQgaW4gYSBmYXNoaW9uIHNpbWlsYXIgdG8gZ2RiL21pLgorCitTZWUgYWxzbyBhdXRvbWFrZSBhYm92ZS4KKworLS0KKworUmVzdHJ1Y3R1cmUgZ2RiIGRpcmVjdG9yeSB0cmVlIHNvIHRoYXQgaXQgYXZvaWRzIGFueSA4LjMgYW5kIDE0CitmaWxlbmFtZSBwcm9ibGVtcy4KKworLS0KKworQ2FuIHRoZSB4ZGVwIGZpbGVzIGJlIHJlcGxhY2VkIGJ5IGF1dG9jb25mPworQ2FuIHRoZSB0bS5oIGFuZCBubS5oIGZpbGVzIGJlIGVsaW1pbmF0ZWQgYnkgbXVsdGktYXJjaC4KKworLS0KKworQWRkIGEgdHJhbnNjcmlwdCBtZWNoYW5pc20gdG8gR0RCLgorCitTdWNoIGEgbWVjaGFuaXNtIG1pZ2h0IGxvZyBhbGwgZ2RiIGlucHV0IGFuZCBvdXRwdXQgdG8gYSBmaWxlIGluIGEKK2Zvcm0gdGhhdCB3b3VsZCBhbGxvdyBpdCB0byBiZSByZXBsYXllZC4gIEl0IGNvdWxkIGludm9sdmUgYGBnZGIKKy0tdHJhbnNjcmlwdD1GSUxFJycgb3IgaXQgY291bGQgaW52b2x2ZSBgYChnZGIpIHRyYW5zY3JpcHQgZmlsZScnLgorCistLQorCitNYWtlIE1JIGludGVyZmFjZSBhY2Nlc3NhYmxlIGZyb20gZXhpc3RpbmcgQ0xJLgorCistLQorCiBTZWxlY3QgdGhlIGluaXRpYWwgbXVsdGktYXJjaCBJU0EgLyBBQkkgYmFzZWQgb24gLS10YXJnZXQgb3Igc2ltaWxhci4KIAogQXQgcHJlc2VudCB0aGUgZGVmYXVsdCBpcyBiYXNlZCBvbiB3aGF0IGV2ZXIgaXMgZmlyc3QgaW4gdGhlIEJGRApAQCAtOTM4LDEwNyArNjcyLDYgQEAKIAogRW5hYmxlIHRoZSBjb2RlIHRvIHJlY29nbml6ZSAtLWVuYWJsZS10YXJnZXRzPS4uLi4gbGlrZSBCSU5VVElMUyBkb2VzLgogCi1DYW4gdGhlIHRtLmggYW5kIG5tLmggZmlsZXMgYmUgZWxpbWluYXRlZCBieSBtdWx0aS1hcmNoLgotCi0tLQotCi0JQXJjaGl0ZWN0dXJhbCBDaGFuZ2U6IE1JLCBMSUJHREIgYW5kIHNjcmlwdGluZyBsYW5ndWFnZXMKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TZWUgYWxzbyBhcmNoaXRlY3R1cmFsIGNoYW5nZXMgcmVsYXRlZCB0byB0aGUgZXZlbnQgbG9vcC4gIExJQkdEQgotY2FuJ3QgYmUgZmluaXNoZWQgdW50aWwgdGhlcmUgaXMgYSBnZW5lcmljIGV2ZW50IGxvb3AgYmVpbmcgdXNlZCBieQotYWxsIHRhcmdldHMuCi0KLVRoZSBsb25nIHRlcm0gb2JqZWN0aXZlIGlzIGl0IHRvIGJlIHBvc3NpYmxlIHRvIGludGVncmF0ZSBHREIgaW50bwotc2NyaXB0aW5nIGxhbmd1YWdlcy4KLQotLS0KLQotSW1wbGVtZW50IGdlbmVyaWMgYGAoZ2RiKSBjb21tbWFuZCA+IGZpbGUnJwotCi1PbmNlIGV2ZXJ5dGhpbmcgaXMgZ29pbmcgdGhyb3VnaCB1aV9maWxlIGl0IHNob3VsZCBiZSBjb21lIGZhaXJseQotZWFzeS4KLQotaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9tbC9nZGIvMjAwMC0wNC9tc2cwMDEwNC5odG1sCi0KLS0tCi0KLVJlcGxhY2UgZ2RiX3N0ZHRhcmcgd2l0aCBnZGJfdGFyZ291dCAoYW5kIHBvc3NpYmx5IGdkYl90YXJnZXJyKS4KLQotZ2RiX3N0ZHRhcmcgaXMgZWFzaWx5IGNvbmZ1c2VkIHdpdGggZ2RiX3N0ZGFyZy4KLQotLS0KLQotRXh0cmEgdWlfZmlsZSBtZXRob2RzIC0gZHVtcC4KLQotVmVyeSB1c2VmdWwgZm9yIHdoaXRlYm94IHRlc3RpbmcuCi0KLS0tCi0KLUVsaW1pbmF0ZSBlcnJvcl9iZWdpbigpLgotCi1XaXRoIHVpX2ZpbGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZSBzdGF0ZWZ1bGwgZXJyb3JfYmVnaW4gKCkKLWZ1bmN0aW9uLgotCi0tLQotCi1TZW5kIG5vcm1hbCBvdXRwdXQgdG8gZ2RiX3N0ZG91dC4KLVNlbmQgZXJyb3IgbWVzc2FnZXMgdG8gZ2RiX3N0ZGVycm9yLgotU2VuZCBkZWJ1ZyBhbmQgbG9nIG91dHB1dCBsb2cgZ2RiX3N0ZGxvZy4KLQotR0RCIHN0aWxsIGNvbnRhaW5zIG1hbnkgY2FzZXMgd2hlcmUgKGYpcHJpbnRmIG9yIHByaW50Zl9maWx0ZXJlZCAoKSBpcwotdXNlZCB3aGVuIGl0IHNob3VsZCBiZSBzZW5kaW5nIHRoZSBtZXNzYWdlcyB0byBnZGJfc3RkZXJyb3Igb3IKLWdkYl9zdGRsb2cuICBUaGUgdGhvdWdodCBvZiAjZGVmaW5pbmcgcHJpbnRmIHRvIHNvbWV0aGluZyBoYXMgY3Jvc3NlZAotcGVvcGxlcyBtaW5kcyA7LSkKLQotLS0KLQotUmUtZG8gR0RCJ3Mgb3V0cHV0IHBhZ2VyLgotCi1HREIncyBvdXRwdXQgcGFnZXIgc3RpbGwgcmVsaWVzIG9uIHBlb3BsZSBjb3JyZWN0bHkgdXNpbmcgKl9maWx0ZXJlZAotZm9yIGdkYl9zdGRvdXQgYW5kICpfdW5maWx0ZXJlZCBmb3IgZ2RiX3N0ZGxvZyAvIGdkYl9zdGRlcnIuCi1Ib3BlZnVsbHksIHdpdGggYWxsIG5vcm1hbCBvdXRwdXQgZ29pbmcgdG8gZ2RiX3N0ZG91dCwgdGhlIHBhZ2VyIGNhbgotanVzdCBsb29rIGF0IHRoZSB1aV9maWxlIHRoYXQgdGhlIG91dHB1dCBpcyBvbiBhbmQgdGhlbiB1c2UgdGhhdCB0bwotZGVjaWRlIHdoYXQgdG8gZG8gYWJvdXQgcGFnaW5nLiAgU291bmRzIGdvb2QgaW4gdGhlb3J5LgotCi0tLQotCi1DaGVjay9jbGVhbnVwIE1JIGRvY3VtZW50YXRpb24uCi0KLVRoZSBsaXN0IG9mIGNvbW1hbmRzIHNwZWNpZmllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBuZWVkcyB0byBiZQotY2hlY2tlZCBhZ2FpbnN0IHRoZSBtaS1jbWRzLmMgdGFibGUgaW4gYSBtZWNoYW5pY2FsIHdheSAoc28gdGhhdCB0aGV5Ci10d28gY2FuIGJlIGtlcHQgdXAtdG8tZGF0ZSkuCi0KLS0tCi0KLUNvbnZlcnQgTUkgaW50byBsaWJnZGIKLQotTUkgcHJvdmlkZXMgYSB0ZXh0IGludGVyZmFjZSBpbnRvIHdoYXQgc2hvdWxkIGJlIG1hbnkgb2YgdGhlIGxpYmdkYgotZnVuY3Rpb25zLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRob3NlIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2VwYXJhdGVkCi1pbnRvIHRoZSBNSSBpbnRlcmZhY2UgYW5kIHRoZSBmdW5jdGlvbnMgcHJvcGVyLiAgVGhvc2UgZnVuY3Rpb25zIGJlaW5nCi1tb3ZlZCB0byBnZGIvbGliIHNheS4KLQotLS0KLQotQ3JlYXRlIGxpYmdkYi5oCi0KLVRoZSBmaXJzdCBwYXJ0IGNhbiBhbHJlYWR5IGJlIGZvdW5kIGluIGRlZnMuaC4KLQotLS0KLQotTUkncyBpbnB1dCBkb2VzIG5vdCB1c2UgYnVmZmVyaW5nLgotCi1BdCBwcmVzZW50IHRoZSBNSSBpbnRlcmZhY2UgcmVhZHMgcmF3IGNoYXJhY3RlcnMgb2YgZnJvbSBhbiB1bmJ1ZmZlcmVkCi1GRC4gIFRoaXMgaXMgdG8gYXZvaWQgc2V2ZXJhbCBuYXN0eSBidWZmZXIvcmFjZSBjb25kaXRpb25zLiAgVGhhdCBjb2RlCi1zaG91bGQgYmUgY2hhbmdlZCBzbyB0aGF0IGl0IHJlZ2lzdGVycyBpdHMgc2VsZiB3aXRoIHRoZSBldmVudCBsb29wCi0ob24gdGhlIGlucHV0IEZEKSBhbmQgdGhlbiBwdXNoIGNvbW1hbmRzIHVwIHRvIE1JIGFzIHRoZXkgYXJyaXZlLgotCi1UaGUgc2VyaWFsIGNvZGUgYWxyZWFkeSBkb2VzIHRoaXMuCi0KLS0tCi0KLU1ha2UgTUkgaW50ZXJmYWNlIGFjY2Vzc2FibGUgZnJvbSBleGlzdGluZyBDTEkuCi0KIC0tCiAKIEFkZCBhIGJyZWFrcG9pbnQtZWRpdCBjb21tYW5kIHRvIE1JLgpAQCAtMTA1NiwxMiArNjg5LDIxIEBACiAKIC0tCiAKLUFkZCBhIG1lY2hhbmlzbSB0byByZWplY3QgY2VydGFpbiBleHByZXNzaW9uIGNsYXNzZXMgdG8gTUkKK1JlLWRvIEdEQidzIG91dHB1dCBwYWdlci4KKworR0RCJ3Mgb3V0cHV0IHBhZ2VyIHN0aWxsIHJlbGllcyBvbiBwZW9wbGUgY29ycmVjdGx5IHVzaW5nICpfZmlsdGVyZWQKK2ZvciBnZGJfc3Rkb3V0IGFuZCAqX3VuZmlsdGVyZWQgZm9yIGdkYl9zdGRsb2cgLyBnZGJfc3RkZXJyLgorSG9wZWZ1bGx5LCB3aXRoIGFsbCBub3JtYWwgb3V0cHV0IGdvaW5nIHRvIGdkYl9zdGRvdXQsIHRoZSBwYWdlciBjYW4KK2p1c3QgbG9vayBhdCB0aGUgdWlfZmlsZSB0aGF0IHRoZSBvdXRwdXQgaXMgb24gYW5kIHRoZW4gdXNlIHRoYXQgdG8KK2RlY2lkZSB3aGF0IHRvIGRvIGFib3V0IHBhZ2luZy4gIFNvdW5kcyBnb29kIGluIHRoZW9yeS4KKworLS0KKworQWRkIG1lY2hhbmlzbSB0byByZWplY3QgZXhwcmVzc2lvbiBjbGFzc2VzIHRvIE1JCiAKIFRoZXJlIGFyZSBzaXR1dGF0aW9ucyB3aGVyZSB5b3UgZG9uJ3Qgd2FudCBHREIncyBleHByZXNzaW9uCiBwYXJzZXIvZXZhbHVhdG9yIHRvIHBlcmZvcm0gaW5mZXJpb3IgZnVuY3Rpb24gY2FsbHMgb3IgdmFyaWFibGUKLWFzc2lnbm1lbnRzLiAgQSB3YXkgb2YgcmVzdHJpY3RpbmcgdGhlIGV4cHJlc3Npb24gcGFyc2VyIHNvIHRoYXQgc3VjaAotb3BlcmF0aW9ucyBhcmUgbm90IGFjY2VwdGVkIHdvdWxkIGJlIHZlcnkgaGVscGZ1bC4KK2Fzc2lnbm1lbnRzLgogCiAtLQogCkBAIC0xMDgwLDYgKzcyMiwyMCBAQAogCiAtLQogCitHREIgZG9lc24ndCByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbSByZW1vdGUgcHJvdG9jb2wgZXJyb3JzLgorCitHREIgd2Fzbid0IGNoZWNraW5nIGZvciBOQUtzIGZyb20gdGhlIHJlbW90ZSB0YXJnZXQuICBJbnN0ZWFkIGEgTkFLIGlzCitpZ25vcmVkIGFuZCBhIHRpbWVvdXQgaXMgcmVxdWlyZWQgYmVmb3JlIEdEQiByZXRyaWVzLiAgQSBwcmUtY3Vyc29yIHRvCitmaXhpbmcgdGhpcyB0aGlzIGlzIG1ha2luZyBHREIncyByZW1vdGUgcHJvdG9jb2wgcGFja2V0IG1vcmUgcm9idXN0LgorCitXaGlsZSBkb3dubG9hZGluZyB0byBhIHJlbW90ZSBwcm90b2NvbCB0YXJnZXQsIGdkYiBpZ25vcmVzIHBhY2tldAorZXJyb3JzIGluIHNvIGZhciBhcyBpdCB3aWxsIGNvbnRpbnVlIHRvIGVkb3dubG9hZCB3aXRoIGNodW5rIE4rMSBldmVuCitpZiBjaHVuayBOIHdhcyBub3QgY29ycmVjdGx5IHNlbnQuICBUaGlzIGNhdXNlcyBnZGIuYmFzZS9yZW1vdGUuZXhwIHRvCit0YWtlIGEgcGFpbmZ1bGx5IGxvbmcgdGltZSB0byBydW4uICBBcyBhIFBTIHRoYXQgdGVzdCBuZWVkcyB0byBiZQorZml4ZWQgc28gdGhhdCBpdCBidWlsZHMgb24gMTYgYml0IG1hY2hpbmVzLgorCistLQorCiBNb3ZlIGdkYl9sYXN0ZXJyIHRvIHVpX291dD8KIAogVGhlIHdheSBHREIgdGhyb3dzIGVycm9ycyBhbmQgcmVjb3JkcyB0aGVtIG5lZWRzIGEgcmUtdGhpbmsuICB1aV9vdXQKQEAgLTEwODgsMjUgKzc0NCw2IEBACiAKIC0tCiAKLQkJQXJjaGl0ZWN0dXJhbCBDaGFuZ2U6IEFzeW5jCi0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGlsZSBHREIgdXNlcyBhbiBldmVudCBsb29wIHdoZW4gcHJvbXB0aW5nIHRoZSB1c2VyIGZvciBpbnB1dC4gIFRoYXQKLWV2ZW50IGxvb3AgaXMgbm90IGV4cGxvaXRlZCBieSB0YXJnZXRzIHdoZW4gdGhleSBhbGxvdyB0aGUgdGFyZ2V0Ci1wcm9ncmFtIHRvIGNvbnRpbnVlLiAgVHlwaWNhbGx5IHRhcmdldHMgc3RpbGwgYmxvY2sgaW4gKHRhcmdldF93YWl0KCkpCi11bnRpbCB0aGUgcHJvZ3JhbSBhZ2FpbiBoYWx0cy4KLQotVGhlIGNsb3Nlc3QgYSB0YXJnZXQgY29tZXMgdG8gc3VwcG9ydGluZyBmdWxsIGFzeW5jaHJvbm91cyBtb2RlIGFyZQotdGhlIHJlbW90ZSB0YXJnZXRzIGBgYXN5bmMnJyBhbmQgYGBleHRlbmRlZC1hc3luYycnLgotCi0tLQotCi1Bc3luY2hyb25vdXMgZXhwcmVzc2lvbiBldmFsdWF0b3IKLQotSW5mZXJpb3IgZnVuY3Rpb24gY2FsbHMgaGFuZyBHREIuCi0KLS0tCi0KIEZpeCBpbXBsZW1lbnRhdGlvbiBvZiAgYGB0YXJnZXQgeHh4JycuCiAKIEF0IHByZXNlbnQgd2hlbiB0aGUgdXNlciBzcGVjaWZpZXMgYGB0YXJnZXQgeHh4eCcnLCB0aGUgQ0xJIG1hcHMgdGhhdApAQCAtMTEzNCw0MiArNzcxLDE0IEBACiAKIC0tCiAKLU1ha2UgInRhcmdldCB4eHgiIGNvbW1hbmQgaW50ZXJydXB0aWJsZS4KLQotQXMgdGhpbmdzIGJlY29tZSBhc3luYyB0aGlzIGJlY29tZXMgcG9zc2libGUuICBBIHRhcmdldCB3b3VsZCBzdGFydAotdGhlIGNvbm5lY3QgYW5kIHRoZW4gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGV2ZW50IGxvb3AuICBBIGNudHJsLWMKLXdvdWxkIG5vdGlmeSB0aGUgdGFyZ2V0IHRoYXQgdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBhYmFuZG9uZWQgYW5kIHRoZQotdGFyZ2V0IGNvZGUgY291bGQgcmVzcG9uZC4KK0RvY3VtZW50IHRyYWNlIG1hY2hpbmVyeQogCiAtLQogCi1BZGQgYSAic3VzcGVuZCIgc3ViY29tbWFuZCBvZiB0aGUgImNvbnRpbnVlIiBjb21tYW5kIHRvIHN1c3BlbmQgZ2RiCi13aGlsZSBjb250aW51aW5nICBleGVjdXRpb24gb2YgdGhlIHN1YnByb2Nlc3MuICBVc2VmdWwgd2hlbiB5b3UgYXJlCi1kZWJ1Z2dpbmcgc2VydmVycyBhbmQgeW91IHdhbnQgdG8gZG9kZ2Ugb3V0IGFuZCBpbml0aWF0ZSBhIGNvbm5lY3Rpb24KLXRvIGEgc2VydmVyIHJ1bm5pbmcgdW5kZXIgZ2RiLgotCi1baGV5IGFzeW5jISFdCitEb2N1bWVudCBvdmVybGF5IG1hY2hpbmVyeS4KIAogLS0KIAotCQkJVE9ETyBGQVEKLQkJCT09PT09PT09Ci0KLUZyZXF1ZW50bHkgcmVxdWVzdGVkIGJ1dCBub3QgYXBwcm92ZWQgcmVxdWVzdHMuCi0KLS0tCi0KLUVsaW1pbmF0ZSB1bnVzZWQgYXJndW1lbnQgd2FybmluZ3MgdXNpbmcgQVRUUklCVVRFX1VOVVNFRC4KLQotVGhlIGJlbmVmaXRzIG9uIHRoaXMgb25lIGFyZSB0aG91Z2h0IHRvIGJlIG1hcmdpbmFsIC0gR0RCcyBkZXNpZ24KLW1lYW5zIHRoYXQgdW51c2VkIHBhcmFtZXRlcnMgYXJlIHZlcnkgY29tbW9uLiAgR0NDIDMuMCB3aWxsIGFsc28KLWluY2x1ZGUgdGhlIG9wdGlvbiAtV25vLXVudXNlZC1wYXJhbWV0ZXIgd2hpY2ggbWVhbnMgdGhhdCBgYC1XYWxsCi0tV25vLXVudXNlZC1wYXJhbWV0ZXJzIC1XZXJyb3InJyBjYW4gYmUgc3BlY2lmaWVkLgotCi0tLQotCi0KLQogCQkJTGVnYWN5IFdpc2ggTGlzdAogCQkJPT09PT09PT09PT09PT09PQogCkBAIC0xMjAyLDExICs4MTEsNiBAQAogCiBNYWtlIHNpbmdsZV9zdGVwKCkgaW5zZXJ0IGFuZCByZW1vdmUgYnJlYWtwb2ludHMgaW4gb25lIG9wZXJhdGlvbi4KIAotW0lmIHRoaXMgaXMgdGFsa2luZyBhYm91dCBoYXZpbmcgc2luZ2xlX3N0ZXAoKSBpbnNlcnQgdGhlIGJyZWFrcG9pbnRzLAotcnVuIHRoZSB0YXJnZXQgdGhlbiBwdWxsIHRoZSBicmVha3BvaW50cyB0aGVuIGl0IGlzIHdyb25nLiAgVGhlCi1mdW5jdGlvbiBoYXMgdG8gcmV0dXJuIGFzIGNvbnRyb2wgaGFzIHRvIGV2ZW50dWFsbHkgYmUgcGFzc2VkIGJhY2sgdG8KLXRoZSBtYWluIGV2ZW50IGxvb3AuXQotCiAtLQogCiBTcGVlZCB1cCBzaW5nbGUgc3RlcHBpbmcgYnkgYXZvaWRpbmcgZXh0cmFuZW91cyBwdHJhY2UgY2FsbHMuCkBAIC0xMzEyLDYgKzkxNiwxMCBAQAogCiAtLQogCitNYWtlICJ0YXJnZXQgeHh4IiBjb21tYW5kIGludGVycnVwdGlibGUuCisKKy0tCisKIFtlbGVuYSAtIGRlbGV0ZSB0aGlzXQogCiBIYW5kbGUgYWRkX2ZpbGUgd2l0aCBzZXBhcmF0ZSB0ZXh0LCBkYXRhLCBhbmQgYnNzIGFkZHJlc3Nlcy4gIE1heWJlCkBAIC0xNTUxLDYgKzExNTksMTUgQEAKIAogLS0KIAorQWRkIGEgInN1c3BlbmQiIHN1YmNvbW1hbmQgb2YgdGhlICJjb250aW51ZSIgY29tbWFuZCB0byBzdXNwZW5kIGdkYgord2hpbGUgY29udGludWluZyAgZXhlY3V0aW9uIG9mIHRoZSBzdWJwcm9jZXNzLiAgVXNlZnVsIHdoZW4geW91IGFyZQorZGVidWdnaW5nIHNlcnZlcnMgYW5kIHlvdSB3YW50IHRvIGRvZGdlIG91dCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uCit0byBhIHNlcnZlciBydW5uaW5nIHVuZGVyIGdkYi4KKworW2hleSBhc3luYyEhXQorCistLQorCiBNb2RpZnkgdGhlIGhhbmRsaW5nIG9mIHN5bWJvbHMgZ3JvdXBlZCB0aHJvdWdoIEJJTkNML0VJTkNMIHN0YWJzIHRvCiBhbGxvY2F0ZSBhIHBhcnRpYWwgc3ltdGFiIGZvciBlYWNoIEJJTkNML0VJTkNMIGdyb3VwaW5nLiAgVGhpcyB3aWxsCiBzZXJpb3VzbHkgZGVjcmVhc2UgdGhlIHNpemUgb2YgaW50ZXItcHN5bXRhYiBkZXBlbmRlbmNpZXMgYW5kIGhlbmNlCkBAIC0xNTU5LDYgKzExNzYsMTIgQEAKIAogLS0KIAorW0NvbW1pbmcuLi5dCisKK01vZGlmeSBnZGIgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBQYXNjYWwuCisKKy0tCisKIEFkZCBhIGNvbW1hbmQgZm9yIHNlYXJjaGluZyBtZW1vcnksIGEgbGEgYWRiLiAgSXQgc3BlY2lmaWVzIHNpemUsCiBtYXNrLCB2YWx1ZSwgc3RhcnQgYWRkcmVzcy4gIEFEQiBzZWFyY2hlcyB1bnRpbCBpdCBmaW5kcyBpdCBvciBoaXRzCiBhbiBlcnJvciAob3IgaXMgaW50ZXJydXB0ZWQpLgpkaWZmIC0tZ2l0IGEvZ2RiL2FjY29uZmlnLmggYi9nZGIvYWNjb25maWcuaAppbmRleCA3NGMzYjZmLi4wYTI0YjY5IDEwMDY0NAotLS0gYS9nZGIvYWNjb25maWcuaAorKysgYi9nZGIvYWNjb25maWcuaApAQCAtMiwxMCArMiwxMCBAQAogI3VuZGVmIF9NU0VfSU5UX0gKIAogLyogRGVmaW5lIGlmIHlvdXIgc3RydWN0IHJlZyBoYXMgcl9mcy4gICovCi0jdW5kZWYgSEFWRV9TVFJVQ1RfUkVHX1JfRlMKKyN1bmRlZiBIQVZFX1JfRlMKIAogLyogRGVmaW5lIGlmIHlvdXIgc3RydWN0IHJlZyBoYXMgcl9ncy4gICovCi0jdW5kZWYgSEFWRV9TVFJVQ1RfUkVHX1JfR1MKKyN1bmRlZiBIQVZFX1JfR1MKIAogLyogRGVmaW5lIGlmIHBzdGF0dXNfdCB0eXBlIGlzIGF2YWlsYWJsZSAqLwogI3VuZGVmIEhBVkVfUFNUQVRVU19UCmRpZmYgLS1naXQgYS9nZGIvYWxwaGFic2QtbmF0LmMgYi9nZGIvYWxwaGFic2QtbmF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTM3YTguLjAwMDAwMDAKLS0tIGEvZ2RiL2FscGhhYnNkLW5hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qIE5hdGl2ZS1kZXBlbmRlbnQgY29kZSBmb3IgQWxwaGEgQlNEJ3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiaW5mZXJpb3IuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotCi0jaWZkZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dSRUdTRVRfVAotdHlwZWRlZiBzdHJ1Y3QgcmVnIGdyZWdzZXRfdDsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRlBSRUdTRVRfVAotdHlwZWRlZiBzdHJ1Y3QgZnByZWcgZnByZWdzZXRfdDsKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ3JlZ3NldC5oIgotCi0vKiBOdW1iZXIgb2YgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gICovCi0jZGVmaW5lIE5VTV9HUkVHUyAgMzIKLQotLyogTnVtYmVyIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICovCi0jZGVmaW5lIE5VTV9GUFJFR1MgMzEKLQwKLQotLyogVHJhbnNmZXJpbmcgdGhlIHJlZ2lzdGVycyBiZXR3ZWVuIEdEQiwgaW5mZXJpb3JzIGFuZCBjb3JlIGZpbGVzLiAgKi8KLQotLyogRmlsbCBHREIncyByZWdpc3RlciBhcnJheSB3aXRoIHRoZSBnZW5lcmVhbC1wdXJwb3NlIHJlZ2lzdGVyIHZhbHVlcwotICAgaW4gKkdSRUdTRVRQLiAgKi8KLQotdm9pZAotc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRfdCAqZ3JlZ3NldHApCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fR1JFR1M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoQ0FOTk9UX0ZFVENIX1JFR0lTVEVSIChpKSkKLQlzdXBwbHlfcmVnaXN0ZXIgKGksIE5VTEwpOwotICAgICAgZWxzZQotCXN1cHBseV9yZWdpc3RlciAoaSwgKGNoYXIgKikgJmdyZWdzZXRwLT5yX3JlZ3NbaV0pOwotICAgIH0KLQotICAvKiBUaGUgUEMgdHJhdmVscyBpbiB0aGUgUl9aRVJPIHNsb3QuICAqLwotICBzdXBwbHlfcmVnaXN0ZXIgKFBDX1JFR05VTSwgKGNoYXIgKikgJmdyZWdzZXRwLT5yX3JlZ3NbUl9aRVJPXSk7Ci19Ci0KLS8qIEZpbGwgcmVnaXN0ZXIgUkVHTk8gKGlmIGl0IGlzIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyKSBpbgotICAgKkdSRUdTRVRQUyB3aXRoIHRoZSB2YWx1ZSBpbiBHREIncyByZWdpc3RlciBhcnJheS4gIElmIFJFR05PIGlzIC0xLAotICAgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4gICovCi0KLXZvaWQKLWZpbGxfZ3JlZ3NldCAoZ3JlZ3NldF90ICpncmVnc2V0cCwgaW50IHJlZ25vKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dSRUdTOyBpKyspCi0gICAgaWYgKChyZWdubyA9PSAtMSB8fCByZWdubyA9PSBpKSAmJiAhIENBTk5PVF9TVE9SRV9SRUdJU1RFUiAoaSkpCi0gICAgICBtZW1jcHkgKCZncmVnc2V0cC0+cl9yZWdzW2ldLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKGkpXSwKLQkgICAgICBSRUdJU1RFUl9SQVdfU0laRSAoaSkpOwotCi0gIC8qIFRoZSBQQyB0cmF2ZWxzIGluIHRoZSBSX1pFUk8gc2xvdC4gICovCi0gIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA9PSBQQ19SRUdOVU0pCi0gICAgbWVtY3B5ICgmZ3JlZ3NldHAtPnJfcmVnc1tSX1pFUk9dLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBDX1JFR05VTSldLAotCSAgICBSRUdJU1RFUl9SQVdfU0laRSAoUENfUkVHTlVNKSk7Ci19Ci0KLS8qIEZpbGwgR0RCJ3MgcmVnaXN0ZXIgYXJyYXkgd2l0aCB0aGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgdmFsdWVzCi0gICBpbiAqRlBSRUdTRVRQLiAgKi8KLQotdm9pZAotc3VwcGx5X2ZwcmVnc2V0IChmcHJlZ3NldF90ICpmcHJlZ3NldHApCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IEZQMF9SRUdOVU07IGkgPCBGUDBfUkVHTlVNICsgTlVNX0ZQUkVHUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChDQU5OT1RfRkVUQ0hfUkVHSVNURVIgKGkpKQotCXN1cHBseV9yZWdpc3RlciAoaSwgTlVMTCk7Ci0gICAgICBlbHNlCi0Jc3VwcGx5X3JlZ2lzdGVyIChpLCAoY2hhciAqKSAmZnByZWdzZXRwLT5mcHJfcmVnc1tpIC0gRlAwX1JFR05VTV0pOwotICAgIH0KLQotICBzdXBwbHlfcmVnaXN0ZXIgKEZQQ1JfUkVHTlVNLCAoY2hhciAqKSAmZnByZWdzZXRwLT5mcHJfY3IpOwotfQotCi0vKiBGaWxsIHJlZ2lzdGVyIFJFR05PIChpZiBpdCBpcyBhIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyKSBpbgotICAgKkZQUkVHU0VUUCB3aXRoIHRoZSB2YWx1ZSBpbiBHREIncyByZWdpc3RlciBhcnJheS4gIElmIFJFR05PIGlzIC0xLAotICAgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4gICovCi0KLXZvaWQKLWZpbGxfZnByZWdzZXQgKGZwcmVnc2V0X3QgKmZwcmVnc2V0cCwgaW50IHJlZ25vKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSBGUDBfUkVHTlVNOyBpIDwgRlAwX1JFR05VTSArIE5VTV9GUFJFR1M7IGkrKykKLSAgICBpZiAoKHJlZ25vID09IC0xIHx8IHJlZ25vID09IGkpICYmICEgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChpKSkKLSAgICAgIG1lbWNweSAoJmZwcmVnc2V0cC0+ZnByX3JlZ3NbaSAtIEZQMF9SRUdOVU1dLAotCSAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoaSldLCBSRUdJU1RFUl9SQVdfU0laRSAoaSkpOwotCi0gIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA9PSBGUENSX1JFR05VTSkKLSAgICBtZW1jcHkgKCZmcHJlZ3NldHAtPmZwcl9jciwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENSX1JFR05VTSldLAotCSAgICBSRUdJU1RFUl9SQVdfU0laRSAoRlBDUl9SRUdOVU0pKTsKLX0KLQotLyogRmV0Y2ggcmVnaXN0ZXIgUkVHTk8gZnJvbSB0aGUgaW5mZXJpb3IuICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcwotICAgZm9yIGFsbCByZWdpc3RlcnMgKGluY2x1ZGluZyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKS4gICovCi0KLXZvaWQKLWZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHJlZ25vKQotewotICBncmVnc2V0X3QgZ3JlZ3M7Ci0KLSAgaWYgKHB0cmFjZSAoUFRfR0VUUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJmdyZWdzLCAwKSA9PSAtMSkKLSAgICBwZXJyb3Jfd2l0aF9uYW1lICgiQ291bGRuJ3QgZ2V0IHJlZ2lzdGVycyIpOwotCi0gIHN1cHBseV9ncmVnc2V0ICgmZ3JlZ3MpOwotCi0gIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA+PSBGUDBfUkVHTlVNKQotICAgIHsKLSAgICAgIGZwcmVnc2V0X3QgZnByZWdzOwotCi0gICAgICBpZiAocHRyYWNlIChQVF9HRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKLQkJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmZwcmVncywgMCkgPT0gLTEpCi0JcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkbid0IGdldCBmbG9hdGluZyBwb2ludCBzdGF0dXMiKTsKLQotICAgICAgc3VwcGx5X2ZwcmVnc2V0ICgmZnByZWdzKTsKLSAgICB9Ci0KLSAgLyogUmVzZXQgdmlydHVhbCBmcmFtZSBwb2ludGVyLiAgKi8KLSAgc3VwcGx5X3JlZ2lzdGVyIChGUF9SRUdOVU0sIE5VTEwpOwotfQotCi0vKiBTdG9yZSByZWdpc3RlciBSRUdOTyBiYWNrIGludG8gdGhlIGluZmVyaW9yLiAgSWYgUkVHTk8gaXMgLTEsIGRvCi0gICB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzIChpbmNsdWRpbmcgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycykuICAqLwotCi12b2lkCi1zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByZWdubykKLXsKLSAgZ3JlZ3NldF90IGdyZWdzOwotCi0gIGlmIChwdHJhY2UgKFBUX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpICZncmVncywgMCkgPT0gLTEpCi0gICAgcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkbid0IGdldCByZWdpc3RlcnMiKTsKLQotICBmaWxsX2dyZWdzZXQgKCZncmVncywgcmVnbm8pOwotCi0gIGlmIChwdHJhY2UgKFBUX1NFVFJFR1MsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpICZncmVncywgMCkgPT0gLTEpCi0gICAgcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkbid0IHdyaXRlIHJlZ2lzdGVycyIpOwotCi0gIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA+PSBGUDBfUkVHTlVNKQotICAgIHsKLSAgICAgIGZwcmVnc2V0X3QgZnByZWdzOwotCi0gICAgICBpZiAocHRyYWNlIChQVF9HRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKLQkJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmZwcmVncywgMCkgPT0gLTEpCi0JcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkbid0IGdldCBmbG9hdGluZyBwb2ludCBzdGF0dXMiKTsKLQotICAgICAgZmlsbF9mcHJlZ3NldCAoJmZwcmVncywgcmVnbm8pOwotCi0gICAgICBpZiAocHRyYWNlIChQVF9TRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKLQkJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmZwcmVncywgMCkgPT0gLTEpCi0JcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkbid0IHdyaXRlIGZsb2F0aW5nIHBvaW50IHN0YXR1cyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkYi9hbm5vdGF0ZS5jIGIvZ2RiL2Fubm90YXRlLmMKaW5kZXggZWUyNjI5MC4uMDc5YTg2YiAxMDA2NDQKLS0tIGEvZ2RiL2Fubm90YXRlLmMKKysrIGIvZ2RiL2Fubm90YXRlLmMKQEAgLTM0LDExICszNCwxMSBAQAogCiBzdGF0aWMgdm9pZCBicmVha3BvaW50X2NoYW5nZWQgKHN0cnVjdCBicmVha3BvaW50ICopOwogCi12b2lkICgqYW5ub3RhdGVfc3RhcnRpbmdfaG9vaykgKHZvaWQpOwotdm9pZCAoKmFubm90YXRlX3N0b3BwZWRfaG9vaykgKHZvaWQpOwotdm9pZCAoKmFubm90YXRlX3NpZ25hbGxlZF9ob29rKSAodm9pZCk7Ci12b2lkICgqYW5ub3RhdGVfc2lnbmFsX2hvb2spICh2b2lkKTsKLXZvaWQgKCphbm5vdGF0ZV9leGl0ZWRfaG9vaykgKHZvaWQpOwordm9pZCAoKmFubm90YXRlX3N0YXJ0aW5nX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgKCphbm5vdGF0ZV9zdG9wcGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgKCphbm5vdGF0ZV9zaWduYWxsZWRfaG9vaykgUEFSQU1TICgodm9pZCkpOwordm9pZCAoKmFubm90YXRlX3NpZ25hbF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkICgqYW5ub3RhdGVfZXhpdGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKIAogc3RhdGljIGludCBpZ25vcmVfY291bnRfY2hhbmdlZCA9IDA7CiAKZGlmZiAtLWdpdCBhL2dkYi9hbm5vdGF0ZS5oIGIvZ2RiL2Fubm90YXRlLmgKaW5kZXggM2U0NzExMi4uZmRhOGIxNyAxMDA2NDQKLS0tIGEvZ2RiL2Fubm90YXRlLmgKKysrIGIvZ2RiL2Fubm90YXRlLmgKQEAgLTk4LDggKzk4LDggQEAKIGV4dGVybiB2b2lkIGFubm90YXRlX2VsdCAodm9pZCk7CiBleHRlcm4gdm9pZCBhbm5vdGF0ZV9hcnJheV9zZWN0aW9uX2VuZCAodm9pZCk7CiAKLWV4dGVybiB2b2lkICgqYW5ub3RhdGVfc3RhcnRpbmdfaG9vaykgKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCphbm5vdGF0ZV9zdG9wcGVkX2hvb2spICh2b2lkKTsKLWV4dGVybiB2b2lkICgqYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2spICh2b2lkKTsKLWV4dGVybiB2b2lkICgqYW5ub3RhdGVfc2lnbmFsX2hvb2spICh2b2lkKTsKLWV4dGVybiB2b2lkICgqYW5ub3RhdGVfZXhpdGVkX2hvb2spICh2b2lkKTsKK2V4dGVybiB2b2lkICgqYW5ub3RhdGVfc3RhcnRpbmdfaG9vaykgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgKCphbm5vdGF0ZV9zdG9wcGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICgqYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICgqYW5ub3RhdGVfc2lnbmFsX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICgqYW5ub3RhdGVfZXhpdGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKZGlmZiAtLWdpdCBhL2dkYi9hcmNoLXV0aWxzLmMgYi9nZGIvYXJjaC11dGlscy5jCmluZGV4IGJlMjQzM2QuLmEwMTJiNDIgMTAwNjQ0Ci0tLSBhL2dkYi9hcmNoLXV0aWxzLmMKKysrIGIvZ2RiL2FyY2gtdXRpbHMuYwpAQCAtNDEsOCArNDEsNiBAQAogI2luY2x1ZGUgInN5bWZpbGUuaCIJCS8qIGZvciBvdmVybGF5IGZ1bmN0aW9ucyAqLwogI2VuZGlmCiAKLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgotCiAvKiBDb252ZW5pZW5jZSBtYWNybyBmb3IgYWxsb2N0aW5nIHR5cGVzYWZlIG1lbW9yeS4gKi8KIAogI2lmbmRlZiBYTUFMTE9DCkBAIC0xNjUsNDcgKzE2Myw2IEBACiB9CiAKIAotLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgVEFSR0VUX3tGTE9BVCxET1VCTEV9X0ZPUk1BVCAqLwotCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKgotZGVmYXVsdF9mbG9hdF9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKQotewotI2lmIEdEQl9NVUxUSV9BUkNICi0gIGludCBieXRlX29yZGVyID0gZ2RiYXJjaF9ieXRlX29yZGVyIChnZGJhcmNoKTsKLSNlbHNlCi0gIGludCBieXRlX29yZGVyID0gVEFSR0VUX0JZVEVfT1JERVI7Ci0jZW5kaWYKLSAgc3dpdGNoIChieXRlX29yZGVyKQotICAgIHsKLSAgICBjYXNlIEJJR19FTkRJQU46Ci0gICAgICByZXR1cm4gJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZzsKLSAgICBjYXNlIExJVFRMRV9FTkRJQU46Ci0gICAgICByZXR1cm4gJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2xpdHRsZTsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxfZXJyb3IgKCJkZWZhdWx0X2Zsb2F0X2Zvcm1hdDogYmFkIGJ5dGUgb3JkZXIiKTsKLSAgICB9Ci19Ci0KLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICoKLWRlZmF1bHRfZG91YmxlX2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpCi17Ci0jaWYgR0RCX01VTFRJX0FSQ0gKLSAgaW50IGJ5dGVfb3JkZXIgPSBnZGJhcmNoX2J5dGVfb3JkZXIgKGdkYmFyY2gpOwotI2Vsc2UKLSAgaW50IGJ5dGVfb3JkZXIgPSBUQVJHRVRfQllURV9PUkRFUjsKLSNlbmRpZgotICBzd2l0Y2ggKGJ5dGVfb3JkZXIpCi0gICAgewotICAgIGNhc2UgQklHX0VORElBTjoKLSAgICAgIHJldHVybiAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnOwotICAgIGNhc2UgTElUVExFX0VORElBTjoKLSAgICAgIHJldHVybiAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnRlcm5hbF9lcnJvciAoImRlZmF1bHRfZG91YmxlX2Zvcm1hdDogYmFkIGJ5dGUgb3JkZXIiKTsKLSAgICB9Ci19Ci0KIC8qICovCiAKIGV4dGVybiBpbml0aWFsaXplX2ZpbGVfZnR5cGUgX19pbml0aWFsaXplX2dkYmFyY2hfdXRpbHM7CmRpZmYgLS1naXQgYS9nZGIvYXJjaC11dGlscy5oIGIvZ2RiL2FyY2gtdXRpbHMuaAppbmRleCBhOWZmNmY1Li41NzYyY2RkIDEwMDY0NAotLS0gYS9nZGIvYXJjaC11dGlscy5oCisrKyBiL2dkYi9hcmNoLXV0aWxzLmgKQEAgLTYzLDggKzYzLDQgQEAKIGV4dGVybiBpbnQgY29yZV9hZGRyX2xlc3N0aGFuIChDT1JFX0FERFIgbGhzLCBDT1JFX0FERFIgcmhzKTsKIGV4dGVybiBpbnQgY29yZV9hZGRyX2dyZWF0ZXJ0aGFuIChDT1JFX0FERFIgbGhzLCBDT1JFX0FERFIgcmhzKTsKIAotLyogRmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZGVmYXVsdF9mbG9hdF9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmRlZmF1bHRfZG91YmxlX2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9iY2FjaGUuYyBiL2dkYi9iY2FjaGUuYwppbmRleCBmY2ZmNTVlLi45NmMwMWJhIDEwMDY0NAotLS0gYS9nZGIvYmNhY2hlLmMKKysrIGIvZ2RiL2JjYWNoZS5jCkBAIC0yOCwyNSArMjgsNDIgQEAKICNpbmNsdWRlICJiY2FjaGUuaCIKICNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCQkvKiBGb3IgbWVtY3B5IGRlY2xhcmF0aW9uICovCiAKLS8qIFRoZSBvbGQgaGFzaCBmdW5jdGlvbiB3YXMgc3RvbGVuIGZyb20gU0RCTS4gVGhpcyBpcyB3aGF0IERCIDMuMCB1c2VzIG5vdywKLSAqIGFuZCBpcyBiZXR0ZXIgdGhhbiB0aGUgb2xkIG9uZS4gCi0gKi8KKwogDAorLyogVGhlIGhhc2ggZnVuY3Rpb24uICAqLworCiB1bnNpZ25lZCBsb25nCi1oYXNoKHZvaWQgKmFkZHIsIGludCBsZW5ndGgpCitoYXNoICh2b2lkICphZGRyLCBpbnQgbGVuZ3RoKQogewotCQljb25zdCB1bnNpZ25lZCBjaGFyICprLCAqZTsKLQkJdW5zaWduZWQgbG9uZyBoOwotCQkKLQkJayA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopYWRkcjsKLQkJZSA9IGsrbGVuZ3RoOwotCQlmb3IgKGg9MDsgazwgZTsrK2spCi0JCXsKLQkJCQloICo9MTY3Nzc2MTk7Ci0JCQkJaCBePSAqazsKLQkJfQotCQlyZXR1cm4gKGgpOworICAvKiBJZiBpdCdzIGEgc2hvcnQgc3RyaW5nLCBoYXNoIG9uIGV2ZXJ5IGNoYXJhY3Rlci4gIE90aGVyd2lzZSwgc2FtcGxlCisgICAgIGNoYXJhY3RlcnMgZnJvbSB0aHJvdWdob3V0IHRoZSBzdHJpbmcuICAqLworICBpZiAobGVuZ3RoIDw9IDY0KQorICAgIHsKKyAgICAgIGNoYXIgKmJ5dGUgPSBhZGRyOworICAgICAgdW5zaWduZWQgbG9uZyBoID0gMDsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJaCA9IGggKiA2NTc5MyBeIChoID4+IChzaXplb2YgKGgpICogOCAtIDYpKSBeIGJ5dGVbaV07CisKKyAgICAgIHJldHVybiBoOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKmJ5dGUgPSBhZGRyOworICAgICAgaW50IG4sIGk7CisgICAgICB1bnNpZ25lZCBsb25nIGggPSAwOworCisgICAgICBmb3IgKG4gPSBpID0gMDsgbiA8IDY0OyBuKyspCisJeworCSAgaCA9IGggKiA2NTc5MyArIChoID4+IChzaXplb2YgKGgpICogOCAtIDYpKSArIGJ5dGVbaV07CisJICBpID0gaCAlIGxlbmd0aDsKKwl9CisKKyAgICAgIHJldHVybiBoOworICAgIH0KIH0KKwogDAogLyogR3Jvd2luZyB0aGUgYmNhY2hlJ3MgaGFzaCB0YWJsZS4gICovCiAKZGlmZiAtLWdpdCBhL2dkYi9iY2FjaGUuaCBiL2dkYi9iY2FjaGUuaAppbmRleCA1MzU1ZTc0Li40NzM1YWY3IDEwMDY0NAotLS0gYS9nZGIvYmNhY2hlLmgKKysrIGIvZ2RiL2JjYWNoZS5oCkBAIC0xMjUsNiArMTI1LDUgQEAKICAgIGtpbmQgb2YgZGF0YSBCQ0FDSEUgaG9sZHMuICBTdGF0aXN0aWNzIGFyZSBwcmludGVkIHVzaW5nCiAgICBgcHJpbnRmX2ZpbHRlcmVkJyBhbmQgaXRzIGlsay4gICovCiBleHRlcm4gdm9pZCBwcmludF9iY2FjaGVfc3RhdGlzdGljcyAoc3RydWN0IGJjYWNoZSAqYmNhY2hlLCBjaGFyICp0eXBlKTsKLS8qIFRoZSBoYXNoIGZ1bmN0aW9uICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBoYXNoKHZvaWQgKmFkZHIsIGludCBsZW5ndGgpOworCiAjZW5kaWYgLyogQkNBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9icmVha3BvaW50LmMgYi9nZGIvYnJlYWtwb2ludC5jCmluZGV4IGM4MGM0NTMuLmQ3YWVhZTMgMTAwNjQ0Ci0tLSBhL2dkYi9icmVha3BvaW50LmMKKysrIGIvZ2RiL2JyZWFrcG9pbnQuYwpAQCAtNzM5Niw3ICs3Mzk2LDcgQEAKIHN0YXRpYyB2b2lkCiBtYXBfYnJlYWtwb2ludF9udW1iZXJzIChhcmdzLCBmdW5jdGlvbikKICAgICAgY2hhciAqYXJnczsKLSAgICAgdm9pZCAoKmZ1bmN0aW9uKSAoc3RydWN0IGJyZWFrcG9pbnQgKik7CisgICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKikpOwogewogICByZWdpc3RlciBjaGFyICpwID0gYXJnczsKICAgY2hhciAqcDE7CmRpZmYgLS1naXQgYS9nZGIvYnVpbGRzeW0uYyBiL2dkYi9idWlsZHN5bS5jCmluZGV4IDcwMTA1YmUuLmRmZjkyOTMgMTAwNjQ0Ci0tLSBhL2dkYi9idWlsZHN5bS5jCisrKyBiL2dkYi9idWlsZHN5bS5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgogI2luY2x1ZGUgImV4cHJlc3Npb24uaCIJCS8qIEZvciAiZW51bSBleHBfb3Bjb2RlIiB1c2VkIGJ5Li4uICovCiAjaW5jbHVkZSAibGFuZ3VhZ2UuaCIJCS8qIEZvciAibG9uZ2VzdF9sb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSIgKi8KLSNpbmNsdWRlICJiY2FjaGUuaCIKKwogLyogQXNrIGJ1aWxkc3ltLmggdG8gZGVmaW5lIHRoZSB2YXJzIGl0IG5vcm1hbGx5IGRlY2xhcmVzIGBleHRlcm4nLiAgKi8KICNkZWZpbmUJRVhURVJOCiAvKiovCkBAIC0xMDU1LDEzICsxMDU1LDMzIEBACiAgIHJldHVybiBuZXc7CiB9CiAMCi0KIC8qIENvbXB1dGUgYSBzbWFsbCBpbnRlZ2VyIGhhc2ggY29kZSBmb3IgdGhlIGdpdmVuIG5hbWUuICovCiAKIGludAogaGFzaG5hbWUgKGNoYXIgKm5hbWUpCiB7Ci0gICAgcmV0dXJuIChoYXNoKG5hbWUsc3RybGVuKG5hbWUpKSAlIEhBU0hTSVpFKTsKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IG5hbWU7CisgIHJlZ2lzdGVyIGludCB0b3RhbCA9IHBbMF07CisgIHJlZ2lzdGVyIGludCBjOworCisgIGMgPSBwWzFdOworICB0b3RhbCArPSBjIDw8IDI7CisgIGlmIChjKQorICAgIHsKKyAgICAgIGMgPSBwWzJdOworICAgICAgdG90YWwgKz0gYyA8PCA0OworICAgICAgaWYgKGMpCisJeworCSAgdG90YWwgKz0gcFszXSA8PCA2OworCX0KKyAgICB9CisKKyAgLyogRW5zdXJlIHJlc3VsdCBpcyBwb3NpdGl2ZS4gICovCisgIGlmICh0b3RhbCA8IDApCisgICAgeworICAgICAgdG90YWwgKz0gKDEwMDAgPDwgNik7CisgICAgfQorICByZXR1cm4gKHRvdGFsICUgSEFTSFNJWkUpOwogfQogDAogCmRpZmYgLS1naXQgYS9nZGIvYy1leHAueSBiL2dkYi9jLWV4cC55CmluZGV4IGQ0MjkxZjcuLmE1MjQxNmYgMTAwNjQ0Ci0tLSBhL2dkYi9jLWV4cC55CisrKyBiL2dkYi9jLWV4cC55CkBAIC0xNDMzLDYgKzE0MzMsOCBAQAogCiAgICAgICBpZiAoYyA9PSAnPCcpCiAJeyAKKyAgICAgICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpCisgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogU2NhbiBhaGVhZCB0byBnZXQgcmVzdCBvZiB0aGUgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbi4gIE5vdGUKICAgICAgICAgICAgICAgICAgIHRoYXQgd2UgbG9vayBhaGVhZCBvbmx5IHdoZW4gdGhlICc8JyBhZGpvaW5zIG5vbi13aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzOyBmb3IgY29tcGFyaXNvbiBleHByZXNzaW9ucywgZS5nLiAiYSA8IGIgPiBjIiwKQEAgLTE0NDIsNiArMTQ0NCwyNiBAQAogICAgICAgICAgICAgICAgaWYgKHApCiAgICAgICAgICAgICAgICAgIG5hbWVsZW4gPSBwIC0gdG9rc3RhcnQ7CiAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7IAorCSAgICAgICBpbnQgaSA9IG5hbWVsZW47CisJICAgICAgIGludCBuZXN0aW5nX2xldmVsID0gMTsKKwkgICAgICAgd2hpbGUgKHRva3N0YXJ0WysraV0pCisJCSB7CisJCSAgIGlmICh0b2tzdGFydFtpXSA9PSAnPCcpCisJCSAgICAgbmVzdGluZ19sZXZlbCsrOworCQkgICBlbHNlIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCisJCSAgICAgeworCQkgICAgICAgaWYgKC0tbmVzdGluZ19sZXZlbCA9PSAwKQorCQkJIGJyZWFrOworCQkgICAgIH0KKwkJIH0KKwkgICAgICAgaWYgKHRva3N0YXJ0W2ldID09ICc+JykKKwkJIG5hbWVsZW4gPSBpOworCSAgICAgICBlbHNlCisJCSBicmVhazsKKwkgICAgIH0KIAl9CiAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKICAgICB9CmRpZmYgLS1naXQgYS9nZGIvY29tbWFuZC5jIGIvZ2RiL2NvbW1hbmQuYwppbmRleCAwMmVlNDc0Li45ZjBlNDc2IDEwMDY0NAotLS0gYS9nZGIvY29tbWFuZC5jCisrKyBiL2dkYi9jb21tYW5kLmMKQEAgLTg0LDcgKzg0LDcgQEAKIGFkZF9jbWQgKG5hbWUsIGNsYXNzLCBmdW4sIGRvYywgbGlzdCkKICAgICAgY2hhciAqbmFtZTsKICAgICAgZW51bSBjb21tYW5kX2NsYXNzIGNsYXNzOwotICAgICB2b2lkICgqZnVuKSAoY2hhciAqLCBpbnQpOworICAgICB2b2lkICgqZnVuKSBQQVJBTVMgKChjaGFyICosIGludCkpOwogICAgICBjaGFyICpkb2M7CiAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqbGlzdDsKIHsKQEAgLTE2OCw3ICsxNjgsNyBAQAogYWRkX2FiYnJldl9jbWQgKG5hbWUsIGNsYXNzLCBmdW4sIGRvYywgbGlzdCkKICAgICAgY2hhciAqbmFtZTsKICAgICAgZW51bSBjb21tYW5kX2NsYXNzIGNsYXNzOwotICAgICB2b2lkICgqZnVuKSAoY2hhciAqLCBpbnQpOworICAgICB2b2lkICgqZnVuKSBQQVJBTVMgKChjaGFyICosIGludCkpOwogICAgICBjaGFyICpkb2M7CiAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqbGlzdDsKIHsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQlhbGxvd191bmtub3duLCBsaXN0KQogICAgICBjaGFyICpuYW1lOwogICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7Ci0gICAgIHZvaWQgKCpmdW4pIChjaGFyICosIGludCk7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CiAgICAgIGNoYXIgKmRvYzsKICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipwcmVmaXhsaXN0OwogICAgICBjaGFyICpwcmVmaXhuYW1lOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJCSAgICAgICBhbGxvd191bmtub3duLCBsaXN0KQogICAgICBjaGFyICpuYW1lOwogICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7Ci0gICAgIHZvaWQgKCpmdW4pIChjaGFyICosIGludCk7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CiAgICAgIGNoYXIgKmRvYzsKICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipwcmVmaXhsaXN0OwogICAgICBjaGFyICpwcmVmaXhuYW1lOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbW1hbmQuaCBiL2dkYi9jb21tYW5kLmgKaW5kZXggZjZjNDZlOS4uOTYyODMyMyAxMDA2NDQKLS0tIGEvZ2RiL2NvbW1hbmQuaAorKysgYi9nZGIvY29tbWFuZC5oCkBAIC0xMDgsMTEgKzEwOCwxMiBAQAogICAgIHVuaW9uCiAgICAgICB7CiAJLyogSWYgdHlwZSBpcyBub3Rfc2V0X2NtZCwgY2FsbCBpdCBsaWtlIHRoaXM6ICAqLwotCXZvaWQgKCpjZnVuYykgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSk7CisJdm9pZCAoKmNmdW5jKSBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKIAogCS8qIElmIHR5cGUgaXMgY21kX3NldCBvciBzaG93X2NtZCwgZmlyc3Qgc2V0IHRoZSB2YXJpYWJsZXMsIGFuZAogCSAgIHRoZW4gY2FsbCB0aGlzLiAgKi8KLQl2b2lkICgqc2Z1bmMpIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHksIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICogYyk7CisJdm9pZCAoKnNmdW5jKSBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHksCisJCQkgICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiBjKSk7CiAgICAgICB9CiAgICAgZnVuY3Rpb247CiAjZGVmaW5lIE5PX0ZVTkNUSU9OICgodm9pZCAoKikgUEFSQU1TKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKSkgMCkKQEAgLTE4NSw3ICsxODYsNyBAQAogICAgICAgIHJldHVybmVkIHJlbGF0aXZlIHRvIHRoaXMgcG9zaXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBURVhUIGlzICJmb28iCiAgICAgICAgYW5kIHdlIHdhbnQgdG8gY29tcGxldGUgdG8gImZvb2JhciIuICBJZiBXT1JEIGlzICJvbyIsIHJldHVybgogICAgICAgICJvb2JhciI7IGlmIFdPUkQgaXMgImJhei9mb28iLCByZXR1cm4gImJhei9mb29iYXIiLiAgKi8KLSAgICBjaGFyICoqKCpjb21wbGV0ZXIpIChjaGFyICp0ZXh0LCBjaGFyICp3b3JkKTsKKyAgICBjaGFyICoqKCpjb21wbGV0ZXIpIFBBUkFNUyAoKGNoYXIgKnRleHQsIGNoYXIgKndvcmQpKTsKIAogICAgIC8qIFR5cGUgb2YgInNldCIgb3IgInNob3ciIGNvbW1hbmQgKG9yIFNFVF9OT1RfU0VUIGlmIG5vdCAic2V0IgogICAgICAgIG9yICJzaG93IikuICAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy5pbiBiL2dkYi9jb25maWcuaW4KaW5kZXggZmFmNWNkNC4uN2E2MzRjMSAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZy5pbgorKysgYi9nZGIvY29uZmlnLmluCkBAIC02MywxMCArNjMsMTAgQEAKICN1bmRlZiBfTVNFX0lOVF9ICiAKIC8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCByZWcgaGFzIHJfZnMuICAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1JFR19SX0ZTCisjdW5kZWYgSEFWRV9SX0ZTCiAKIC8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCByZWcgaGFzIHJfZ3MuICAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1JFR19SX0dTCisjdW5kZWYgSEFWRV9SX0dTCiAKIC8qIERlZmluZSBpZiB0aGUgcHJmcHJlZ3NldF90IHR5cGUgaXMgYnJva2VuLiAqLwogI3VuZGVmIFBSRlBSRUdTRVRfVF9CUk9LRU4KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYWxwaGEvZmJzZC5taCBiL2dkYi9jb25maWcvYWxwaGEvZmJzZC5taApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYjVlNS4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2FscGhhL2Zic2QubWgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgSG9zdDogRnJlZUJTRC9BbHBoYQotWERFUEZJTEVTPSBzZXItdGNwLm8KLU5BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIHNvbGliLm8gXAotCWNvcmVsb3cubyBjb3JlLXJlZ3NldC5vIGFscGhhYnNkLW5hdC5vCi1YTV9GSUxFPSB4bS1mYnNkLmgKLU5BVF9GSUxFPSBubS1mYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYWxwaGEvZmJzZC5tdCBiL2dkYi9jb25maWcvYWxwaGEvZmJzZC5tdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMzk3Ny4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2FscGhhL2Zic2QubXQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGFyZ2V0OiBGcmVlQlNEL0FscGhhCi1UREVQRklMRVM9IGFscGhhLXRkZXAubwotVE1fRklMRT0gdG0tZmJzZC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FscGhhL25tLWZic2QuaCBiL2dkYi9jb25maWcvYWxwaGEvbm0tZmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTMyMWI5Li4wMDAwMDAwCi0tLSBhL2dkYi9jb25maWcvYWxwaGEvbm0tZmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgRnJlZUJTRC9BbHBoYS4KLSAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDg5LCA5MiwgOTYsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTk1fRkJTRF9ICi0jZGVmaW5lIE5NX0ZCU0RfSAotCi0vKiBUeXBlIG9mIHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgYHB0cmFjZScgc3lzdGVtIGNhbGwuICAqLwotI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGNhZGRyX3QKLQotLyogT3ZlcnJpZGUgY29waWVzIG9mIHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzIGluIGBpbmZwdHJhY2UuYycuICAqLwotI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKLQotLyogV2UgY2FuIGF0dGFjaCBhbmQgZGV0YWNoLiAgKi8KLSNkZWZpbmUgQVRUQUNIX0RFVEFDSAotCi0vKiBUaGUgQWxwaGEgZG9lcyBub3Qgc3RlcCBvdmVyIGEgYnJlYWtwb2ludC4gICovCi0jZGVmaW5lIENBTk5PVF9TVEVQX0JSRUFLUE9JTlQKLQwKLQotLyogU2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gICovCi0KLSNkZWZpbmUgU1ZSNF9TSEFSRURfTElCUwotCi0jaW5jbHVkZSAic29saWIuaCIJCS8qIFN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMuICovCi0jaW5jbHVkZSAiZWxmL2NvbW1vbi5oIgkJLyogQWRkaXRpb25hbCBFTEYgc2hhcmVkIGxpYnJhcnkgaW5mby4gKi8KLQotI2VuZGlmIC8qIE5NX0ZCU0RfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS90bS1mYnNkLmggYi9nZGIvY29uZmlnL2FscGhhL3RtLWZic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwODZlNC4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2FscGhhL3RtLWZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIFRhcmdldC1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEZyZWVCU0QvQWxwaGEuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVE1fRkJTRF9ICi0jZGVmaW5lIFRNX0ZCU0RfSAotCi0jaW5jbHVkZSAiYWxwaGEvdG0tYWxwaGEuaCIKLQotLyogTnVtYmVyIG9mIHRyYXBzIHRoYXQgaGFwcGVuIGJldHdlZW4gZXhlYydpbmcgdGhlIHNoZWxsIHRvIHJ1biBhbgotICAgaW5mZXJpb3IsIGFuZCB3aGVuIHdlIGZpbmFsbHkgZ2V0IHRvIHRoZSBpbmZlcmlvciBjb2RlLiAgVGhlCi0gICBkZWZhdWx0IGlzIHJpZ2h0IGZvciBGcmVlQlNELiAgKi8KLQotI3VuZGVmIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVECi0KLSNlbmRpZiAvKiBUTV9GQlNEX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYWxwaGEveG0tZmJzZC5oIGIvZ2RiL2NvbmZpZy9hbHBoYS94bS1mYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTk1MTIuLjAwMDAwMDAKLS0tIGEvZ2RiL2NvbmZpZy9hbHBoYS94bS1mYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBIb3N0LWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgRnJlZUJTRC9pMzg2LgotICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFhNX0ZCU0RfSAotI2RlZmluZSBYTV9GQlNEX0gKLQotI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotCi0jZW5kaWYgLyogWE1fRkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbmJzZGVsZi5taCBiL2dkYi9jb25maWcvaTM4Ni9uYnNkZWxmLm1oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzE5NzU0Li4wMDAwMDAwCi0tLSBhL2dkYi9jb25maWcvaTM4Ni9uYnNkZWxmLm1oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIE5ldEJTRAotWERFUEZJTEVTPSBzZXItdGNwLm8KLU5BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBcCi0JaTM4Nm5ic2QtbmF0Lm8gc29saWIubwotWE1fRklMRT0geG0tbmJzZC5oCi1OQVRfRklMRT0gbm0tbmJzZGVsZi5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbmJzZGVsZi5tdCBiL2dkYi9jb25maWcvaTM4Ni9uYnNkZWxmLm10CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgyMTczLi4wMDAwMDAwCi0tLSBhL2dkYi9jb25maWcvaTM4Ni9uYnNkZWxmLm10CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIFRhcmdldDogSW50ZWwgMzg2IHJ1bm5pbmcgTmV0QlNECi1UREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCi1UTV9GSUxFPSB0bS1uYnNkZWxmLmgKLQotR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctbmJzZC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLW5ic2QuaAppbmRleCA3ZGU3MmU4Li43NGVkZDJmIDEwMDY0NAotLS0gYS9nZGIvY29uZmlnL2kzODYvbm0tbmJzZC5oCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1uYnNkLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgTk1fTkJTRF9ICiAKIC8qIEdldCBnZW5lcmljIE5ldEJTRCBuYXRpdmUgZGVmaW5pdGlvbnMuICovCi0jaW5jbHVkZSAiY29uZmlnL25tLW5ic2QuaCIKKyNpbmNsdWRlICJubS1uYnNkLmgiCiAKICNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAogCShhZGRyKSA9IGkzODZfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L25tLW5ic2RlbGYuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1uYnNkZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNmMxZWMuLjAwMDAwMDAKLS0tIGEvZ2RiL2NvbmZpZy9pMzg2L25tLW5ic2RlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIE5hdGl2ZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIE5ldEJTRCwgZm9yIEdEQi4KLSAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE5NX05CU0RFTEZfSAotI2RlZmluZSBOTV9OQlNERUxGX0gKLQotI2RlZmluZSBTVlI0X1NIQVJFRF9MSUJTCi0jaW5jbHVkZSAiaTM4Ni9ubS1uYnNkLmgiCi0KLSNlbmRpZiAvKiBOTV9OQlNERUxGX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni90bS1jeWd3aW4uaCBiL2dkYi9jb25maWcvaTM4Ni90bS1jeWd3aW4uaAppbmRleCA1YWU5N2JiLi41OTdlYTUxIDEwMDY0NAotLS0gYS9nZGIvY29uZmlnL2kzODYvdG0tY3lnd2luLmgKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWN5Z3dpbi5oCkBAIC0yNCwyMCArMjQsOCBAQAogCiAjaW5jbHVkZSAiaTM4Ni90bS1pMzg2di5oIgogCi0jaWYgMAogI2RlZmluZSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpIHNraXBfdHJhbXBvbGluZV9jb2RlIChwYywgbmFtZSkKICNkZWZpbmUgU0tJUF9UUkFNUE9MSU5FX0NPREUocGMpICAgICAgICAgICBza2lwX3RyYW1wb2xpbmVfY29kZSAocGMsIDApCiBleHRlcm4gQ09SRV9BRERSIHNraXBfdHJhbXBvbGluZV9jb2RlIChDT1JFX0FERFIgcGMsIGNoYXIgKm5hbWUpOwotI2VuZGlmCiAKLSNkZWZpbmUgU09MSUJfQUREKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykgY2hpbGRfc29saWJfYWRkKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykKLSNkZWZpbmUgU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBjaGlsZF9zb2xpYl9sb2FkZWRfbGlicmFyeV9wYXRobmFtZShwaWQpCi0jZGVmaW5lIENMRUFSX1NPTElCIGNoaWxkX2NsZWFyX3NvbGliCi0jZGVmaW5lIEFERF9TSEFSRURfU1lNQk9MX0ZJTEVTIGRsbF9zeW1ib2xfY29tbWFuZAotCi1zdHJ1Y3QgdGFyZ2V0X29wczsKLWNoYXIgKmN5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKTsKLXZvaWQgY2hpbGRfc29saWJfYWRkIChjaGFyICosIGludCwgc3RydWN0IHRhcmdldF9vcHMgKik7Ci1jaGFyICpjaGlsZF9zb2xpYl9sb2FkZWRfbGlicmFyeV9wYXRobmFtZShpbnQpOwotdm9pZCBjaGlsZF9jbGVhcl9zb2xpYiAodm9pZCk7Ci12b2lkIGRsbF9zeW1ib2xfY29tbWFuZCAoY2hhciAqLCBpbnQpOworZXh0ZXJuIGNoYXIgKmN5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKTsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni90bS1uYnNkLmggYi9nZGIvY29uZmlnL2kzODYvdG0tbmJzZC5oCmluZGV4IGEyNGFjMGQuLjg4NWM4MDkgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWcvaTM4Ni90bS1uYnNkLmgKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLW5ic2QuaApAQCAtMSw1ICsxLDUgQEAKIC8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBpMzg2IHJ1bm5pbmcgdW5kZXIgTmV0QlNELgotICAgQ29weXJpZ2h0IDE5OTQsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgogCkBAIC0yMyw4ICsyMyw4IEBACiAKICNkZWZpbmUgSEFWRV9JMzg3X1JFR1MKIAotI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgotI2luY2x1ZGUgImNvbmZpZy90bS1uYnNkLmgiCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2YnNkLmgiCisjaW5jbHVkZSAidG0tbmJzZC5oIgogCiBleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIGkzODZuYnNkX3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKICNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKSBcCkBAIC00MywxNiArNDMsNCBAQAogCiAjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKIAotDAotLyogU3VwcG9ydCBmb3Igc2lnbmFsIGhhbmRsZXJzLiAgKi8KLQotLyogVGhlIHNpZ3RyYW1wIGlzIGFib3ZlIHRoZSB1c2VyIHN0YWNrIGFuZCBpbW1lZGlhdGVseSBiZWxvdyB0aGUgCi0gICB1c2VyIGFyZWEuICBVc2luZyBjb25zdGFudHMgaGVyZSBhbGxvd3MgZm9yIGNyb3NzIGRlYnVnZ2luZy4gKi8KLQotI2RlZmluZSBTSUdUUkFNUF9TVEFSVChwYykJMHhiZmJmZGYyMAotI2RlZmluZSBTSUdUUkFNUF9FTkQocGMpCTB4YmZiZmRmZjAKLQotLyogT2Zmc2V0IHRvIHNhdmVkIFBDIGluIHNpZ2NvbnRleHQsIGZyb20gPHN5cy9zaWduYWwuaD4uICAqLwotI2RlZmluZSBTSUdDT05URVhUX1BDX09GRlNFVCAyMAotCiAjZW5kaWYgLyogVE1fTkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tbmJzZGVsZi5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLW5ic2RlbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4MDJjNS4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2kzODYvdG0tbmJzZGVsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYgcnVubmluZyB1bmRlciBOZXRCU0QuCi0gICBDb3B5cmlnaHQgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUTV9OQlNERUxGX0gKLSNkZWZpbmUgVE1fTkJTREVMRl9ICi0KLSNpbmNsdWRlICJpMzg2L3RtLW5ic2QuaCIKLQotI3VuZGVmIFVTRV9TVFJVQ1RfQ09OVkVOVElPTgotCi0jZW5kaWYgLyogVE1fTkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tbWlwcy5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLW1pcHMuaAppbmRleCA5ZDA3ZTg3Li5jNWNjNjNhIDEwMDY0NAotLS0gYS9nZGIvY29uZmlnL21pcHMvdG0tbWlwcy5oCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1taXBzLmgKQEAgLTU4Nyw4ICs1ODcsMyBAQAogCiAvKiBDb21tYW5kIHRvIHNldCB0aGUgcHJvY2Vzc29yIHR5cGUuICovCiBleHRlcm4gdm9pZCBtaXBzX3NldF9wcm9jZXNzb3JfdHlwZV9jb21tYW5kIChjaGFyICosIGludCk7Ci0KLQotLyogTUlQUyBzaWduIGV4dGVuZHMgYWRkcmVzc2VzICovCi0jZGVmaW5lIFBPSU5URVJfVE9fQUREUkVTUyhUWVBFLEJVRikgKHNpZ25lZF9wb2ludGVyX3RvX2FkZHJlc3MgKFRZUEUsIEJVRikpCi0jZGVmaW5lIEFERFJFU1NfVE9fUE9JTlRFUihUWVBFLEJVRixBRERSKSAoYWRkcmVzc190b19zaWduZWRfcG9pbnRlciAoVFlQRSwgQlVGLCBBRERSKSkKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbm0tbGludXguaCBiL2dkYi9jb25maWcvbm0tbGludXguaAppbmRleCA0MGFlZDU3Li4zNzZlYjkzIDEwMDY0NAotLS0gYS9nZGIvY29uZmlnL25tLWxpbnV4LmgKKysrIGIvZ2RiL2NvbmZpZy9ubS1saW51eC5oCkBAIC01OSw1ICs1OSw1IEBACiAvKiBVc2UgZWxmX2dyZWdzZXRfdCBhbmQgZWxmX2ZwcmVnc2V0X3QsIHJhdGhlciB0aGFuCiAgICBncmVnc2V0X3QgYW5kIGZwcmVnc2V0X3QuICAqLwogCi0jZGVmaW5lIEdEQl9HUkVHU0VUX1QgIGVsZl9ncmVnc2V0X3QKLSNkZWZpbmUgR0RCX0ZQUkVHU0VUX1QgZWxmX2ZwcmVnc2V0X3QKKyNkZWZpbmUgR0RCX0dSRUdTRVRfVCAgcHJncmVnc2V0X3QKKyNkZWZpbmUgR0RCX0ZQUkVHU0VUX1QgcHJmcHJlZ3NldF90CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCBiL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oCmluZGV4IDViYmE3NzguLjM2ODY2YjMgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oCkBAIC01MTIsNyArNTEyLDcgQEAKIC8qIEhvb2sgaW4gcnM2MDAwLXRkZXAuYyBmb3IgZGV0ZXJtaW5pbmcgdGhlIFRPQyBhZGRyZXNzIHdoZW4KICAgIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZSBpbmZlcmlvci4gICovCiBleHRlcm4KLUNPUkVfQUREUiAoKmZpbmRfdG9jX2FkZHJlc3NfaG9vaykgKENPUkVfQUREUik7CitDT1JFX0FERFIgKCpmaW5kX3RvY19hZGRyZXNzX2hvb2spIFBBUkFNUyAoKENPUkVfQUREUikpOwogCiAvKiB4Y29mZnJlYWQuYyBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgVE9DIG9mZnNldAogICAgZm9yIGEgZ2l2ZW4gb2JqZWN0IGZpbGUuCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL25tLXN1bjRzb2wyLmggYi9nZGIvY29uZmlnL3NwYXJjL25tLXN1bjRzb2wyLmgKaW5kZXggMjEwNzA3NS4uNGEyNDcxMCAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZy9zcGFyYy9ubS1zdW40c29sMi5oCisrKyBiL2dkYi9jb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaApAQCAtMzAsMTMgKzMwLDYgQEAKIAogI2RlZmluZSBQUlNWQUREUl9CUk9LRU4KIAotLyogZ2RiIHdhbnRzIHRvIHVzZSB0aGUgcHJncmVnc2V0X3QgaW50ZXJmYWNlIHJhdGhlciB0aGFuCi0gICB0aGUgZ3JlZ3NldF90IGludGVyZmFjZSwgcGFydGx5IGJlY2F1c2UgdGhhdCdzIHdoYXQncwotICAgdXNlZCBpbiBjb3JlLXNvbDIuYyAqLwotCi0jZGVmaW5lIEdEQl9HUkVHU0VUX1QgcHJncmVnc2V0X3QKLSNkZWZpbmUgR0RCX0ZQUkVHU0VUX1QgcHJmcHJlZ3NldF90Ci0KICNpZmRlZiBORVdfUFJPQ19BUEkJLyogU29sYXJpcyA2IGFuZCBhYm92ZSBjYW4gZG8gSFcgd2F0Y2hwb2ludHMgKi8KIAogI2RlZmluZSBUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmggYi9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmgKaW5kZXggM2VkYjVhYi4uMDEyMThmZCAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZy9zcGFyYy94bS1zdW40c29sMi5oCisrKyBiL2dkYi9jb25maWcvc3BhcmMveG0tc3VuNHNvbDIuaApAQCAtMjYsNiArMjYsMTMgQEAKIAogI2luY2x1ZGUgInhtLXN5c3Y0LmgiCiAKKy8qIGdkYiB3YW50cyB0byB1c2UgdGhlIHByZ3JlZ3NldF90IGludGVyZmFjZSByYXRoZXIgdGhhbgorICAgdGhlIGdyZWdzZXRfdCBpbnRlcmZhY2UsIHBhcnRseSBiZWNhdXNlIHRoYXQncyB3aGF0J3MKKyAgIHVzZWQgaW4gY29yZS1zb2wyLmMgKi8KKworI2RlZmluZSBHREJfR1JFR1NFVF9UWVBFIHByZ3JlZ3NldF90CisjZGVmaW5lIEdEQl9GUFJFR1NFVF9UWVBFIHByZnByZWdzZXRfdAorCiAvKiBUaGVzZSBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGluIFNWUjQgKGJ1dCBzaG91bGQgYmUsIEZJWE1FISkuICAqLwogI3VuZGVmCURPX0RFRkVSUkVEX1NUT1JFUwogI3VuZGVmCUNMRUFSX0RFRkVSUkVEX1NUT1JFUwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZ3VyZSBiL2dkYi9jb25maWd1cmUKaW5kZXggOWM1YzRhNi4uYmZhNDA3OCAxMDA3NTUKLS0tIGEvZ2RiL2NvbmZpZ3VyZQorKysgYi9nZGIvY29uZmlndXJlCkBAIC03Myw2ICs3Myw3IEBACiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAogc2lsZW50PQogc2l0ZT0KK3NpdGVmaWxlPQogc3JjZGlyPQogdGFyZ2V0PU5PTkUKIHZlcmJvc2U9CkBAIC0xODcsNiArMTg4LDcgQEAKICAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCiAgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCiAgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCiAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKIERpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKICAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCkBAIC0zNTcsNiArMzU5LDExIEBACiAgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCiAgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKIAorICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCisgICAgYWNfcHJldj1zaXRlZmlsZSA7OworICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQorICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OworCiAgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCiAgICAgYWNfcHJldj1zcmNkaXIgOzsKICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKQEAgLTUyMiwxMiArNTI5LDE2IEBACiBzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKIAogIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCitpZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCisgIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICAgIGVsc2UKKyAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgICBmaQogICBmaQorZWxzZQorICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgogZmkKIGZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwogICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgpAQCAtNTY4LDcgKzU3OSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3MjogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjU4MzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQogICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKQEAgLTU5NCw3ICs2MDUsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjI0LDcgKzYzNSw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2Mzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02NzUsNyArNjg2LDcgQEAKICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03MDcsNyArNzE4LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzExOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorZWNobyAiY29uZmlndXJlOjcyMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKIAogYWNfZXh0PWMKICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KQEAgLTcxOCwxMiArNzI5LDEyIEBACiAKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCiAKLSNsaW5lIDcyMiAiY29uZmlndXJlIgorI2xpbmUgNzMzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogbWFpbigpe3JldHVybigwKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKICAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgogICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KQEAgLTc0OSwxMiArNzYwLDEyIEBACiAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1MzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiY29uZmlndXJlOjc2NDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQogZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorZWNobyAiY29uZmlndXJlOjc2OTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTc2Myw3ICs3NzQsNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgYWNfY3ZfcHJvZ19nY2M9eWVzCiBlbHNlCiAgIGFjX2N2X3Byb2dfZ2NjPW5vCkBAIC03ODIsNyArNzkzLDcgQEAKIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogQ0ZMQUdTPQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitlY2hvICJjb25maWd1cmU6Nzk3OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC04MTQsNyArODI1LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MTg6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo4Mjk6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CkBAIC04MjksMTMgKzg0MCwxMyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MzMgImNvbmZpZ3VyZSIKKyNsaW5lIDg0NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CkBAIC04NDYsMTMgKzg1NywxMyBAQAogICBybSAtcmYgY29uZnRlc3QqCiAgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODUwICJjb25maWd1cmUiCisjbGluZSA4NjEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjg1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgOgpAQCAtODYzLDEzICs4NzQsMTMgQEAKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg2NyAiY29uZmlndXJlIgorI2xpbmUgODc4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxhc3NlcnQuaD4KIFN5bnRheCBFcnJvcgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTg5NCw5ICs5MDUsOSBAQAogZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFJWCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODk4OiBjaGVja2luZyBmb3IgQUlYIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo5MDk6IGNoZWNraW5nIGZvciBBSVgiID4mNQogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTAwICJjb25maWd1cmUiCisjbGluZSA5MTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2lmZGVmIF9BSVgKICAgeWVzCkBAIC05MTgsNyArOTI5LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTIyOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitlY2hvICJjb25maWd1cmU6OTMzOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CiBpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKICAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQogdGhlbgpAQCAtOTQyLDcgKzk1Myw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR7Q0MtY2N9IG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NDY6IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1CitlY2hvICJjb25maWd1cmU6OTU3OiBjaGVja2luZyBmb3IgJHtDQy1jY30gb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3Byb2dfY2Nfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC05NTgsNyArOTY5LDcgQEAKIGRvCiAgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NjIgImNvbmZpZ3VyZSIKKyNsaW5lIDk3MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTk5NSw3ICsxMDA2LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYW1fY3ZfcHJvZ19jY19zdGRjPSIkYWNfYXJnIjsgYnJlYWsKIGVsc2UKQEAgLTEwNjYsNyArMTA3Nyw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDcwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMDgxOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKIAogaG9zdF9hbGlhcz0kaG9zdAogY2FzZSAiJGhvc3RfYWxpYXMiIGluCkBAIC0xMDg3LDcgKzEwOTgsNyBAQAogZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMTAyOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQogCiB0YXJnZXRfYWxpYXM9JHRhcmdldAogY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KQEAgLTExMDUsNyArMTExNiw3IEBACiBlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgogCiBlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwOTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorZWNobyAiY29uZmlndXJlOjExMjA6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKIAogYnVpbGRfYWxpYXM9JGJ1aWxkCiBjYXNlICIkYnVpbGRfYWxpYXMiIGluCkBAIC0xMTMwLDcgKzExNDEsNyBAQAogCiBBTExfTElOR1VBUz0KIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMzQ6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorZWNobyAiY29uZmlndXJlOjExNDU6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQogc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMTU5LDcgKzExNzAsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjExNzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTE4NywxMiArMTE5OCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMjAyOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk2ICJjb25maWd1cmUiCisjbGluZSAxMjA3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTEyMDAsNyArMTIxMSw3IEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTIxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTEyMTcsNyArMTIyOCw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjIxICJjb25maWd1cmUiCisjbGluZSAxMjMyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KIEVPRgpAQCAtMTIzNSw3ICsxMjQ2LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMzkgImNvbmZpZ3VyZSIKKyNsaW5lIDEyNTAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogRU9GCkBAIC0xMjU2LDcgKzEyNjcsNyBAQAogICA6CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNjAgImNvbmZpZ3VyZSIKKyNsaW5lIDEyNzEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKQEAgLTEyNjcsNyArMTI3OCw3IEBACiBleGl0ICgwKTsgfQogCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIDoKIGVsc2UKQEAgLTEyOTEsMTIgKzEzMDIsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitlY2hvICJjb25maWd1cmU6MTMwNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzAwICJjb25maWd1cmUiCisjbGluZSAxMzExICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC0xMzQ1LDcgKzEzNTYsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzYwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19jb25zdD15ZXMKIGVsc2UKQEAgLTEzNjYsMjEgKzEzNzcsMjEgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNzA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQorZWNobyAiY29uZmlndXJlOjEzODE6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfY3ZfY19pbmxpbmU9bm8KIGZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3NyAiY29uZmlndXJlIgorI2xpbmUgMTM4OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogfSAkYWNfa3cgZm9vKCkgewogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzODQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKIGVsc2UKQEAgLTE0MDYsMTIgKzE0MTcsMTIgQEAKIGVzYWMKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDEwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQorZWNobyAiY29uZmlndXJlOjE0MjE6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0MTUgImNvbmZpZ3VyZSIKKyNsaW5lIDE0MjYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmIFNURENfSEVBREVSUwpAQCAtMTQzOSwxMiArMTQ1MCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0MzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICJjb25maWd1cmU6MTQ1NDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ4ICJjb25maWd1cmUiCisjbGluZSAxNDU5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTE0NzQsMTkgKzE0ODUsMTkgQEAKICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCiAjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Nzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNDg5OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ4MyAiY29uZmlndXJlIgorI2xpbmUgMTQ5NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YWxsb2NhLmg+CiBpbnQgbWFpbigpIHsKIGNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwogZWxzZQpAQCAtMTUwNywxMiArMTUxOCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxMTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitlY2hvICJjb25maWd1cmU6MTUyMjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTE2ICJjb25maWd1cmUiCisjbGluZSAxNTI3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2lmZGVmIF9fR05VQ19fCkBAIC0xNTQwLDcgKzE1NTEsNyBAQAogY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCiBlbHNlCkBAIC0xNTcyLDEyICsxNTgzLDEyIEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU3NjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitlY2hvICJjb25maWd1cmU6MTU4NzogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1ODEgImNvbmZpZ3VyZSIKKyNsaW5lIDE1OTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQogd2ViZWNyYXkKQEAgLTE2MDIsMTIgKzE2MTMsMTIgQEAKIGlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjE2MTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTEgImNvbmZpZ3VyZSIKKyNsaW5lIDE2MjIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMTYzMCw3ICsxNjQxLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTE2NTcsNyArMTY2OCw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjYxOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjcyOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNjY1LDcgKzE2NzYsNyBAQAogICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2NjkgImNvbmZpZ3VyZSIKKyNsaW5lIDE2ODAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZmluZF9zdGFja19kaXJlY3Rpb24gKCkKIHsKQEAgLTE2ODQsNyArMTY5NSw3IEBACiAgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQogZWxzZQpAQCAtMTcwOSwxNyArMTcyMCwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNzI0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTcxOCAiY29uZmlndXJlIgorI2xpbmUgMTcyOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTczNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTE3NDgsMTIgKzE3NTksMTIgQEAKIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjE3NjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTcgImNvbmZpZ3VyZSIKKyNsaW5lIDE3NjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMTc3Niw3ICsxNzg3LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTE4MDEsNyArMTgxMiw3IEBACiBkb25lCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQorZWNobyAiY29uZmlndXJlOjE4MTY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTgwOSw3ICsxODIwLDcgQEAKICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODEzICJjb25maWd1cmUiCisjbGluZSAxODI0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCkBAIC0xOTQ5LDcgKzE5NjAsNyBAQAogfQogCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCiBlbHNlCkBAIC0xOTc3LDE3ICsxOTg4LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjE5OTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTg2ICJjb25maWd1cmUiCisjbGluZSAxOTk3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTkxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjAxNywxMiArMjAyOCwxMiBAQAogX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjAzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAyNiAiY29uZmlndXJlIgorI2xpbmUgMjAzNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yMDQ1LDcgKzIwNTYsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjA3NCwxMiArMjA4NSwxMiBAQAogICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjA4OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA4MyAiY29uZmlndXJlIgorI2xpbmUgMjA5NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yMTAyLDcgKzIxMTMsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjEzNiwxOSArMjE0NywxOSBAQAogCiAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitlY2hvICJjb25maWd1cmU6MjE1MTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQ1ICJjb25maWd1cmUiCisjbGluZSAyMTU2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxsb2NhbGUuaD4KIGludCBtYWluKCkgewogcmV0dXJuIExDX01FU1NBR0VTCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKIGVsc2UKQEAgLTIxNjksNyArMjE4MCw3IEBACiAgICAgZmkKICAgZmkKICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3MzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTg0OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQogICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCkBAIC0yMTg5LDcgKzIyMDAsNyBAQAogRU9GCiAKICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDQ6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQogICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCiAgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCkBAIC0yMjA4LDE3ICsyMjE5LDE3IEBACiAKIAlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIxMjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitlY2hvICJjb25maWd1cmU6MjIyMzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxNyAiY29uZmlndXJlIgorI2xpbmUgMjIyOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8bGliaW50bC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjMzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjIzNSwxOSArMjI0NiwxOSBAQAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjM5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjUwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDQgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGxpYmludGwuaD4KIGludCBtYWluKCkgewogcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKIGVsc2UKQEAgLTIyNjMsNyArMjI3NCw3IEBACiAKIAkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCiAJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjY3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjc4OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0yMjcxLDcgKzIyODIsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxpbnRsICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNzUgImNvbmZpZ3VyZSIKKyNsaW5lIDIyODYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTIyODIsNyArMjI5Myw3IEBACiBiaW5kdGV4dGRvbWFpbigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0yMjk4LDE5ICsyMzA5LDE5IEBACiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgogICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQorZWNobyAiY29uZmlndXJlOjIzMTM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMwNyAiY29uZmlndXJlIgorI2xpbmUgMjMxOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKIGVsc2UKQEAgLTIzMzgsNyArMjM0OSw3IEBACiAJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjIzNTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjM3MiwxMiArMjM4MywxMiBAQAogCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjM4NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4MSAiY29uZmlndXJlIgorI2xpbmUgMjM5MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yNDAwLDcgKzI0MTEsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjQyNyw3ICsyNDM4LDcgQEAKIAkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MjQ0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjQ2Myw3ICsyNDc0LDcgQEAKIAkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjQ5NSw3ICsyNTA2LDcgQEAKIGZpCiAKIAkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ5OSAiY29uZmlndXJlIgorI2xpbmUgMjUxMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtMjUwMyw3ICsyNTE0LDcgQEAKIAkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBDQVRPQkpFWFQ9LmdtbwogCQkgICBEQVRBRElSTkFNRT1zaGFyZQpAQCAtMjUzNSw3ICsyNTQ2LDcgQEAKICAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjI1NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjU2OSw3ICsyNTgwLDcgQEAKICAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MjU4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjYwNSw3ICsyNjE2LDcgQEAKICAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNjIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjY5NSw3ICsyNzA2LDcgQEAKICAgICAgICBMSU5HVUFTPQogICAgICBlbHNlCiAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5OTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CitlY2hvICJjb25maWd1cmU6MjcxMDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CiAgICAgICAgTkVXX0xJTkdVQVM9CiAgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCiAgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCkBAIC0yNzIzLDE3ICsyNzM0LDE3IEBACiAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgogCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcyNzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitlY2hvICJjb25maWd1cmU6MjczODogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMiAiY29uZmlndXJlIgorI2xpbmUgMjc0MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjgzNSw3ICsyODQ2LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6Mjg1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FXSycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yODc2LDcgKzI4ODcsNyBAQAogIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgogIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODgwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyODkxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0yOTM3LDcgKzI5NDgsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6Mjk1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTI5NjksNyArMjk4MCw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjI5ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzAwMSw3ICszMDEyLDcgQEAKICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjMwMTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzAzMyw3NiArMzA0NCwxMiBAQAogZmkKIGZpCiAKLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH13aW5kcmVzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXdpbmRyZXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA3MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1dJTkRSRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkV0lORFJFUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19XSU5EUkVTPSIkV0lORFJFUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfV0lORFJFUz0iJHthY190b29sX3ByZWZpeH13aW5kcmVzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19XSU5EUkVTIiAmJiBhY19jdl9wcm9nX1dJTkRSRVM9IndpbmRyZXMiCi1maQotZmkKLVdJTkRSRVM9IiRhY19jdl9wcm9nX1dJTkRSRVMiCi1pZiB0ZXN0IC1uICIkV0lORFJFUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRXSU5EUkVTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KIGZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKIGRvCiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjMwNTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTMxMzYsNyArMzA4Myw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bWlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW1pZzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjMwODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19NSUcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzE4NywxMiArMzEzNCwxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE5MTogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMTM4OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE5NiAiY29uZmlndXJlIgorI2xpbmUgMzE0MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CkBAIC0zMjA5LDcgKzMxNTYsNyBAQAogaW50IGk7CiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTYwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAogZWxzZQpAQCAtMzIyOSwxMiArMzE3NiwxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjMzOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICJjb25maWd1cmU6MzE4MDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIzOCAiY29uZmlndXJlIgorI2xpbmUgMzE4NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0zMjQyLDcgKzMxODksNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjMxOTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0zMjU5LDcgKzMyMDYsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI2MyAiY29uZmlndXJlIgorI2xpbmUgMzIxMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiBFT0YKQEAgLTMyNzcsNyArMzIyNCw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjgxICJjb25maWd1cmUiCisjbGluZSAzMjI4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KIEVPRgpAQCAtMzI5OCw3ICszMjQ1LDcgQEAKICAgOgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzAyICJjb25maWd1cmUiCisjbGluZSAzMjQ5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0zMzA5LDcgKzMyNTYsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICA6CiBlbHNlCkBAIC0zMzUyLDE3ICszMjk5LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM1NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjMzMDM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzYxICJjb25maWd1cmUiCisjbGluZSAzMzA4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzY2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzEzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMzM4OSwxMiArMzMzNiwxMiBAQAogZG9uZQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzkzOiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMzQwOiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzk4ICJjb25maWd1cmUiCisjbGluZSAzMzQ1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMzQ0NiwxMiArMzM5MywxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDUwOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitlY2hvICJjb25maWd1cmU6MzM5NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDU1ICJjb25maWd1cmUiCisjbGluZSAzNDAyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC0zNTAwLDcgKzM0NDcsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19jb25zdD15ZXMKIGVsc2UKQEAgLTM1MjQsMTIgKzM0NzEsMTIgQEAKIGZvciBhY19mdW5jIGluIHNldHBnaWQgc2JyayBzaWdhY3Rpb24gaXNhc2NpaSBiemVybyBiY29weSBidG93YyBwb2xsIHNpZ3Byb2NtYXNrCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTI4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjM0NzU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzMgImNvbmZpZ3VyZSIKKyNsaW5lIDM0ODAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMzU1Miw3ICszNDk5LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTM1NzksMTkgKzM1MjYsMTkgQEAKICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCiAjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1ODM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNTMwOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU4OCAiY29uZmlndXJlIgorI2xpbmUgMzUzNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YWxsb2NhLmg+CiBpbnQgbWFpbigpIHsKIGNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwogZWxzZQpAQCAtMzYxMiwxMiArMzU1OSwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYxNjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitlY2hvICJjb25maWd1cmU6MzU2MzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjIxICJjb25maWd1cmUiCisjbGluZSAzNTY4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2lmZGVmIF9fR05VQ19fCkBAIC0zNjQ1LDcgKzM1OTIsNyBAQAogY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCiBlbHNlCkBAIC0zNjc3LDEyICszNjI0LDEyIEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY4MTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitlY2hvICJjb25maWd1cmU6MzYyODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2ODYgImNvbmZpZ3VyZSIKKyNsaW5lIDM2MzMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQogd2ViZWNyYXkKQEAgLTM3MDcsMTIgKzM2NTQsMTIgQEAKIGlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzExOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjM2NTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3MTYgImNvbmZpZ3VyZSIKKyNsaW5lIDM2NjMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMzczNSw3ICszNjgyLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTM3NjIsNyArMzcwOSw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzY2OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNzEzOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zNzcwLDcgKzM3MTcsNyBAQAogICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NzQgImNvbmZpZ3VyZSIKKyNsaW5lIDM3MjEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZmluZF9zdGFja19kaXJlY3Rpb24gKCkKIHsKQEAgLTM3ODksNyArMzczNiw3IEBACiAgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQogZWxzZQpAQCAtMzgxNCw4NCArMzc2MSw4NCBAQAogIyBTZWUgaWYgbWFjaGluZS9yZWcuaCBzdXBwb3J0cyB0aGUgJWZzIGFuZCAlZ3MgaTM4NiBzZWdtZW50IHJlZ2lzdGVycy4KICMgT2xkZXIgaTM4NiBCU0QncyBkb24ndCBoYXZlIHRoZSByX2ZzIGFuZCByX2dzIG1lbWJlcnMgb2YgYHN0cnVjdCByZWcnLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJfZnMgaW4gc3RydWN0IHJlZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgxODogY2hlY2tpbmcgZm9yIHJfZnMgaW4gc3RydWN0IHJlZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCitlY2hvICJjb25maWd1cmU6Mzc2NTogY2hlY2tpbmcgZm9yIHJfZnMgaW4gc3RydWN0IHJlZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3N0cnVjdF9yX2ZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgyMyAiY29uZmlndXJlIgorI2xpbmUgMzc3MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KIGludCBtYWluKCkgewogc3RydWN0IHJlZyByOyByLnJfZnM7CiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgzMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcz15ZXMKKyAgZ2RiX2N2X3N0cnVjdF9yX2ZzPXllcwogZWxzZQogICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzPW5vCisgIGdkYl9jdl9zdHJ1Y3Rfcl9mcz1ubwogZmkKIHJtIC1mIGNvbmZ0ZXN0KgogZmkKIAotZWNobyAiJGFjX3QiIiRnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzIiAxPiY2Ci1pZiB0ZXN0ICRnZGJfY3Zfc3RydWN0X3JlZ19yX2ZzID0geWVzOyB0aGVuCitlY2hvICIkYWNfdCIiJGdkYl9jdl9zdHJ1Y3Rfcl9mcyIgMT4mNgoraWYgdGVzdCAkZ2RiX2N2X3N0cnVjdF9yX2ZzID0geWVzOyB0aGVuCiAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUlVDVF9SRUdfUl9GUyAxCisjZGVmaW5lIEhBVkVfUl9GUyAxCiBFT0YKIAogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NTA6IGNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorZWNobyAiY29uZmlndXJlOjM3OTc6IGNoZWNraW5nIGZvciByX2dzIGluIHN0cnVjdCByZWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9zdHJ1Y3Rfcl9ncycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4NTUgImNvbmZpZ3VyZSIKKyNsaW5lIDM4MDIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CiBpbnQgbWFpbigpIHsKIHN0cnVjdCByZWcgcjsgci5yX2dzOwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgwOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCi0gIGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3M9eWVzCisgIGdkYl9jdl9zdHJ1Y3Rfcl9ncz15ZXMKIGVsc2UKICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAgIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncz1ubworICBnZGJfY3Zfc3RydWN0X3JfZ3M9bm8KIGZpCiBybSAtZiBjb25mdGVzdCoKIGZpCiAKLWVjaG8gIiRhY190IiIkZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncyIgMT4mNgotaWYgdGVzdCAkZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncyA9IHllczsgdGhlbgorZWNobyAiJGFjX3QiIiRnZGJfY3Zfc3RydWN0X3JfZ3MiIDE+JjYKK2lmIHRlc3QgJGdkYl9jdl9zdHJ1Y3Rfcl9ncyA9IHllczsgdGhlbgogICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFJVQ1RfUkVHX1JfR1MgMQorI2RlZmluZSBIQVZFX1JfR1MgMQogRU9GCiAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQVFJBQ0VfR0VUUkVHUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg4MzogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRSRUdTIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozODMwOiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFJFR1MiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3B0cmFjZV9nZXRyZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg4OCAiY29uZmlndXJlIgorI2xpbmUgMzgzNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgogaW50IG1haW4oKSB7CiBQVFJBQ0VfR0VUUkVHUzsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODk1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0cmVncz15ZXMKIGVsc2UKQEAgLTM5MTIsMTkgKzM4NTksMTkgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQVFJBQ0VfR0VUWEZQUkVHUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkxNjogY2hlY2tpbmcgZm9yIFBUUkFDRV9HRVRYRlBSRUdTIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozODYzOiBjaGVja2luZyBmb3IgUFRSQUNFX0dFVFhGUFJFR1MiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3B0cmFjZV9nZXR4ZnByZWdzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkyMSAiY29uZmlndXJlIgorI2xpbmUgMzg2OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgogaW50IG1haW4oKSB7CiBQVFJBQ0VfR0VUWEZQUkVHUzsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTI4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBnZGJfY3ZfaGF2ZV9wdHJhY2VfZ2V0eGZwcmVncz15ZXMKIGVsc2UKQEAgLTM5NDUsNyArMzg5Miw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc29ja2V0cGFpciBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk0OTogY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIgaW4gLWxzb2NrZXQiID4mNQorZWNobyAiY29uZmlndXJlOjM4OTY6IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIGluIC1sc29ja2V0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nc29ja2V0cGFpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMzk1Myw3ICszOTAwLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sc29ja2V0ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NTcgImNvbmZpZ3VyZSIKKyNsaW5lIDM5MDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTM5NjQsNyArMzkxMSw3IEBACiBzb2NrZXRwYWlyKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTM5OTQsMTIgKzM5NDEsMTIgQEAKIGZvciBhY19mdW5jIGluIHNvY2tldHBhaXIKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5OTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6Mzk0NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAwMyAiY29uZmlndXJlIgorI2xpbmUgMzk1MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC00MDIyLDcgKzM5NjksNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtNDA0OSwxMiArMzk5NiwxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNTM6IGNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQorZWNobyAiY29uZmlndXJlOjQwMDA6IGNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDU4ICJjb25maWd1cmUiCisjbGluZSA0MDA1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC00MDc1LDcgKzQwMjIsNyBAQAogY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgbWFsbG9jCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDI2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwogZWxzZQpAQCAtNDA5NiwxMiArNDA0MywxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMDA6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MDQ3OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTA1ICJjb25maWd1cmUiCisjbGluZSA0MDUyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC00MTIyLDcgKzQwNjksNyBAQAogY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA3MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jPW5vCiBlbHNlCkBAIC00MTQzLDEyICs0MDkwLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE0NzogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQorZWNobyAiY29uZmlndXJlOjQwOTQ6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNTIgImNvbmZpZ3VyZSIKKyNsaW5lIDQwOTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTQxNjksNyArNDExNiw3IEBACiBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE3MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTIwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KIGVsc2UKQEAgLTQxOTAsMTIgKzQxMzcsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3IgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE5NDogY2hlY2tpbmcgd2hldGhlciBzdHJlcnJvciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MTQxOiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxOTkgImNvbmZpZ3VyZSIKKyNsaW5lIDQxNDYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTQyMTYsNyArNDE2Myw3IEBACiBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJlcnJvcgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE2NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcj1ubwogZWxzZQpAQCAtNDIzNywxMiArNDE4NCwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI0MTogY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitlY2hvICJjb25maWd1cmU6NDE4ODogY2hlY2tpbmcgd2hldGhlciBzdHJkdXAgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmR1cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNDYgImNvbmZpZ3VyZSIKKyNsaW5lIDQxOTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTQyNjMsNyArNDIxMCw3IEBACiBjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJkdXAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZHVwPW5vCiBlbHNlCkBAIC00Mjg0LDEyICs0MjMxLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mjg4OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0MjM1OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI5MyAiY29uZmlndXJlIgorI2xpbmUgNDI0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNDMxMCw3ICs0MjU3LDcgQEAKIGNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI2MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KIGVsc2UKQEAgLTQzMzcsOSArNDI4NCw5IEBACiAjIGNvdWxkIGJlIGV4cHVuZ2VkLiAtLWpzbSAxOTk5LTAzLTIyCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBIUFVYIHNhdmVfc3RhdGUgc3RydWN0dXJlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzQxOiBjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIgPiY1CitlY2hvICJjb25maWd1cmU6NDI4ODogY2hlY2tpbmcgZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUiID4mNQogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM0MyAiY29uZmlndXJlIgorI2xpbmUgNDI5MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+CiBFT0YKQEAgLTQzNTQsNyArNDMwMSw3IEBACiBybSAtZiBjb25mdGVzdCoKIAogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM1OCAiY29uZmlndXJlIgorI2xpbmUgNDMwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+CiBFT0YKQEAgLTQ0MTgsMTkgKzQzNjUsMTkgQEAKIAogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfcHJvY2ZzX2giID0geWVzOyB0aGVuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDIyOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1CitlY2hvICJjb25maWd1cmU6NDM2OTogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQogIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQyNyAiY29uZmlndXJlIgorI2xpbmUgNDM3NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgogaW50IG1haW4oKSB7CiBwc3RhdHVzX3QgYXZhcgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM4MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCiBlbHNlCkBAIC00NDUyLDE5ICs0Mzk5LDE5IEBACiAgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2CiAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBycnVuX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDU2OiBjaGVja2luZyBmb3IgcHJydW5fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorZWNobyAiY29uZmlndXJlOjQ0MDM6IGNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIgPiY1CiAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ2MSAiY29uZmlndXJlIgorI2xpbmUgNDQwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgogaW50IG1haW4oKSB7CiBwcnJ1bl90IGF2YXIKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJydW5fdD15ZXMKIGVsc2UKQEAgLTQ0ODYsMTkgKzQ0MzMsMTkgQEAKICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90IiAxPiY2CiAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0OTA6IGNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NDM3OiBjaGVja2luZyBmb3IgZ3JlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1CiAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDk1ICJjb25maWd1cmUiCisjbGluZSA0NDQyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CiBpbnQgbWFpbigpIHsKIGdyZWdzZXRfdCBhdmFyCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUwMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdD15ZXMKIGVsc2UKQEAgLTQ1MjAsMTkgKzQ0NjcsMTkgQEAKICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3QiIDE+JjYKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MjQ6IGNoZWNraW5nIGZvciBmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1CitlY2hvICJjb25maWd1cmU6NDQ3MTogY2hlY2tpbmcgZm9yIGZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTI5ICJjb25maWd1cmUiCisjbGluZSA0NDc2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CiBpbnQgbWFpbigpIHsKIGZwcmVnc2V0X3QgYXZhcgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ4MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90PXllcwogZWxzZQpAQCAtNDU1NCwxOSArNDUwMSwxOSBAQAogIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3QiIDE+JjYKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTU4OiBjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NTA1OiBjaGVja2luZyBmb3IgcHJncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU2MyAiY29uZmlndXJlIgorI2xpbmUgNDUxMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgogaW50IG1haW4oKSB7CiBwcmdyZWdzZXRfdCBhdmFyCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU3MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldF90PXllcwogZWxzZQpAQCAtNDU4OCwxOSArNDUzNSwxOSBAQAogIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZ3JlZ3NldF90IiAxPiY2CiAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTI6IGNoZWNraW5nIGZvciBwcmZwcmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NTM5OiBjaGVja2luZyBmb3IgcHJmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1CiAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTk3ICJjb25maWd1cmUiCisjbGluZSA0NTQ0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CiBpbnQgbWFpbigpIHsKIHByZnByZWdzZXRfdCBhdmFyCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDYwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3ByZnByZWdzZXRfdD15ZXMKIGVsc2UKQEAgLTQ2MjIsMTkgKzQ1NjksMTkgQEAKICBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QiIDE+JjYKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwaWRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MjY6IGNoZWNraW5nIGZvciBsd3BpZF90IGluIHN5cy9wcm9jZnMuaCIgPiY1CitlY2hvICJjb25maWd1cmU6NDU3MzogY2hlY2tpbmcgZm9yIGx3cGlkX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjMxICJjb25maWd1cmUiCisjbGluZSA0NTc4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CiBpbnQgbWFpbigpIHsKIGx3cGlkX3QgYXZhcgogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2Mzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BpZF90PXllcwogZWxzZQpAQCAtNDY1NiwxOSArNDYwMywxOSBAQAogIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cGlkX3QiIDE+JjYKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjYwOiBjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NjA3OiBjaGVja2luZyBmb3IgcHNhZGRyX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY2NSAiY29uZmlndXJlIgorI2xpbmUgNDYxMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgogaW50IG1haW4oKSB7CiBwc2FkZHJfdCBhdmFyCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY3MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjE5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzYWRkcl90PXllcwogZWxzZQpAQCAtNDY5NCw3ICs0NjQxLDcgQEAKICAgICAgICAgCiAgIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcmZwcmVnc2V0X3QgPSB5ZXM7IHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHByZnByZWdzZXRfdCB0eXBlIGlzIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY5ODogY2hlY2tpbmcgd2hldGhlciBwcmZwcmVnc2V0X3QgdHlwZSBpcyBicm9rZW4iID4mNQorZWNobyAiY29uZmlndXJlOjQ2NDU6IGNoZWNraW5nIHdoZXRoZXIgcHJmcHJlZ3NldF90IHR5cGUgaXMgYnJva2VuIiA+JjUKICAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDcwMiw3ICs0NjQ5LDcgQEAKICAgZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW49eWVzCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MDYgImNvbmZpZ3VyZSIKKyNsaW5lIDQ2NTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KICAgICAgICBpbnQgbWFpbiAoKQpAQCAtNDcxMiw3ICs0NjU5LDcgQEAKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgZ2RiX2N2X3ByZnByZWdzZXRfdF9icm9rZW49bm8KIGVsc2UKQEAgLTQ3MzcsMTIgKzQ2ODQsMTIgQEAKIAogICAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzQxOiBjaGVja2luZyBmb3IgUElPQ1NFVCBpb2N0bCBlbnRyeSBpbiBzeXMvcHJvY2ZzLmgiID4mNQorZWNobyAiY29uZmlndXJlOjQ2ODg6IGNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIgPiY1CiAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3NDYgImNvbmZpZ3VyZSIKKyNsaW5lIDQ2OTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNDc1NSw3ICs0NzAyLDcgQEAKICAgCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc1OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQ9eWVzCiBlbHNlCkBAIC00Nzc3LDcgKzQ3MjQsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1haW4gaW4gLWxtIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzgxOiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0iID4mNQorZWNobyAiY29uZmlndXJlOjQ3Mjg6IGNoZWNraW5nIGZvciBtYWluIGluIC1sbSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIG0nXydtYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00Nzg1LDE0ICs0NzMyLDE0IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbG0gICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc4OSAiY29uZmlndXJlIgorI2xpbmUgNDczNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogbWFpbigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC00ODIxLDcgKzQ3NjgsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWxjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODI1OiBjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sYyIgPiY1CitlY2hvICJjb25maWd1cmU6NDc3MjogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBjJ18nd2N0eXBlIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00ODI5LDcgKzQ3NzYsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxjICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MzMgImNvbmZpZ3VyZSIKKyNsaW5lIDQ3ODAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTQ4NDAsNyArNDc4Nyw3IEBACiB3Y3R5cGUoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNDg1OSw3ICs0ODA2LDcgQEAKIGVsc2UKICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg2MzogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciID4mNQorZWNobyAiY29uZmlndXJlOjQ4MTA6IGNoZWNraW5nIGZvciB3Y3R5cGUgaW4gLWx3IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gdydfJ3djdHlwZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtNDg2Nyw3ICs0ODE0LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODcxICJjb25maWd1cmUiCisjbGluZSA0ODE4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC00ODc4LDcgKzQ4MjUsNyBAQAogd2N0eXBlKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTQ5MTAsMTIgKzQ4NTcsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MTQ6IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBjb21waWxlciIgPiY1CitlY2hvICJjb25maWd1cmU6NDg2MTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfY19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTE5ICJjb25maWd1cmUiCisjbGluZSA0ODY2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC00OTI1LDcgKzQ4NzIsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZ2RiX2N2X2NfbG9uZ19sb25nPXllcwogZWxzZQpAQCAtNDk0Nyw3ICs0ODk0LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTUxOiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0ODk4OiBjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQgaW4gcHJpbnRmIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNDk1NSw3ICs0OTAyLDcgQEAKICAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPW5vCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NTkgImNvbmZpZ3VyZSIKKyNsaW5lIDQ5MDYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbiAoKSB7CkBAIC00OTY5LDcgKzQ5MTYsNyBAQAogICByZXR1cm4gKHN0cmNtcCAoIjB4MDEyMzQ1Njc4OWFiY2RlZiIsIGJ1ZikpOwogfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5NzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmc9eWVzCiBlbHNlCkBAIC00OTkzLDE5ICs0OTQwLDE5IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5OTc6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0OTQ0OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBjb21waWxlciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMDIgImNvbmZpZ3VyZSIKKyNsaW5lIDQ5NDkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIGxvbmcgZG91YmxlIGZvbzsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDA5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5NTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2xvbmdfZG91YmxlPXllcwogZWxzZQpAQCAtNTAyNyw3ICs0OTc0LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMzE6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHByaW50ZiIgPiY1CitlY2hvICJjb25maWd1cmU6NDk3ODogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gcHJpbnRmIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MDM1LDcgKzQ5ODIsNyBAQAogICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT1ubwogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDM5ICJjb25maWd1cmUiCisjbGluZSA0OTg2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4gKCkgewpAQCAtNTA0NSw3ICs0OTkyLDcgQEAKICAgcmV0dXJuIChzdHJuY21wICgiMy4xNDE1OSIsIGJ1ZiwgNykpOwogfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT15ZXMKIGVsc2UKQEAgLTUwNjksNyArNTAxNiw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwNzM6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MDIwOiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBzY2FuZiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MDc3LDcgKzUwMjQsNyBAQAogICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPW5vCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwODEgImNvbmZpZ3VyZSIKKyNsaW5lIDUwMjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbiAoKSB7CkBAIC01MDg3LDcgKzUwMzQsNyBAQAogICByZXR1cm4gIShmID4gMy4xNDE1OSAmJiBmIDwgMy4xNDE2MCk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGU9eWVzCiBlbHNlCkBAIC01MTEzLDE3ICs1MDYwLDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTExNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjUwNjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTIyICJjb25maWd1cmUiCisjbGluZSA1MDY5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTI3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtNTE1MiwxMiArNTA5OSwxMiBAQAogZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNTY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6NTEwMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE2MSAiY29uZmlndXJlIgorI2xpbmUgNTEwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC01MTgwLDcgKzUxMjcsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE4NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtNTIwNSw3ICs1MTUyLDcgQEAKIGRvbmUKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTIwOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitlY2hvICJjb25maWd1cmU6NTE1NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MjEzLDcgKzUxNjAsNyBAQAogICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMTcgImNvbmZpZ3VyZSIKKyNsaW5lIDUxNjQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KQEAgLTUzNTMsNyArNTMwMCw3IEBACiB9CiAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKIGVsc2UKQEAgLTUzODIsNyArNTMyOSw3IEBACiAgICBjYXNlICR7aG9zdF9vc30gaW4KICAgIGhwdXgqKQogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEhQVVgvT1NGIHRocmVhZCBzdXBwb3J0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mzg2OiBjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiID4mNQorZWNobyAiY29uZmlndXJlOjUzMzM6IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1CiAgICAgICBpZiB0ZXN0IC1mIC91c3IvaW5jbHVkZS9kY2UvY21hX2NvbmZpZy5oIDsgdGhlbgogICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KICAgICAgICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKQEAgLTU0MDEsNyArNTM0OCw3IEBACiAgICAgICA7OwogICAgc29sYXJpcyopCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgU29sYXJpcyB0aHJlYWQgZGVidWdnaW5nIGxpYnJhcnkiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0MDU6IGNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIgPiY1CitlY2hvICJjb25maWd1cmU6NTM1MjogY2hlY2tpbmcgZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5IiA+JjUKICAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEgOyB0aGVuCiAgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CiAgICAgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKQEAgLTU0MTEsNyArNTM1OCw3IEBACiAgICAgICAgICBDT05GSUdfT0JTPSIke0NPTkZJR19PQlN9IHNvbC10aHJlYWQubyIKICAgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSBzb2wtdGhyZWFkLmMiCiAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0MTU6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CitlY2hvICJjb25maWd1cmU6NTM2MjogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZGwnXydkbG9wZW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTU0MTksNyArNTM2Niw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGRsICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU0MjMgImNvbmZpZ3VyZSIKKyNsaW5lIDUzNzAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTU0MzAsNyArNTM3Nyw3IEBACiBkbG9wZW4oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzgxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNTQ2MiwxNyArNTQwOSwxNyBAQAogICAgICAgICAgICAgIyBhbGwgc3ltYm9scyB2aXNpYmxlIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KICAgICAgICAgICAgIGhvbGRfbGRmbGFncz0kTERGTEFHUwogICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ2NjogY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIgPiY1CitlY2hvICJjb25maWd1cmU6NTQxMzogY2hlY2tpbmcgZm9yIHRoZSBsZCAtZXhwb3J0LWR5bmFtaWMgZmxhZyIgPiY1CiAgICAgICAgICAgICBMREZMQUdTPSIke0xERkxBR1N9IC1XbCwtZXhwb3J0LWR5bmFtaWMiCiAgICAgICAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDY5ICJjb25maWd1cmUiCisjbGluZSA1NDE2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiBpbnQgaTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZm91bmQ9eWVzCiBlbHNlCkBAIC01NDkxLDEzICs1NDM4LDEzIEBACiAJICMgU3VuIHJhbmRvbWx5IHR3ZWFrZWQgdGhlIHByb3RvdHlwZXMgaW4gPHByb2Nfc2VydmljZS5oPgogCSAjIGF0IG9uZSBwb2ludC4KIAkgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0OTU6IGNoZWNraW5nIGlmIDxwcm9jX3NlcnZpY2UuaD4gaXMgb2xkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NDQyOiBjaGVja2luZyBpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCIgPiY1CiAJIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIAogCSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTAxICJjb25maWd1cmUiCisjbGluZSA1NDQ4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCQkjaW5jbHVkZSA8cHJvY19zZXJ2aWNlLmg+CkBAIC01NTA4LDcgKzU0NTUsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTUxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQ9bm8KIGVsc2UKQEAgLTU2NDUsNyArNTU5Miw3IEBACiBpZiB0ZXN0ICJ4JHtidWlsZF93YXJuaW5nc30iICE9IHggLWEgIngkR0NDIiA9IHh5ZXMKIHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjQ5OiBjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NTk2OiBjaGVja2luZyBjb21waWxlciB3YXJuaW5nIGZsYWdzIiA+JjUKICAgICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKICAgICAjIGNvbXBpbGVkIHdpdGggaXQgZW5hYmxlZC4KICAgICBmb3IgdyBpbiAke2J1aWxkX3dhcm5pbmdzfTsgZG8KQEAgLTU3MDgsMTIgKzU2NTUsMTIgQEAKIAogaWYgdGVzdCAkd2FudF9pbmNsdWRlZF9yZWdleCA9IGZhbHNlOyB0aGVuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgcmVnZXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3MTI6IGNoZWNraW5nIGZvciBHTlUgcmVnZXgiID4mNQorZWNobyAiY29uZmlndXJlOjU2NTk6IGNoZWNraW5nIGZvciBHTlUgcmVnZXgiID4mNQogICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X2hhdmVfZ251X3JlZ2V4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTcxNyAiY29uZmlndXJlIgorI2xpbmUgNTY2NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC01NzI1LDcgKzU2NzIsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTcyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1Njc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZ2RiX2N2X2hhdmVfZ251X3JlZ2V4PXllcwogZWxzZQpAQCAtNTc1NCwxMiArNTcwMSwxMiBAQAogCiAjIEluIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQsIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIGZsYWdzLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGN5Z3dpbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTc1ODogY2hlY2tpbmcgZm9yIGN5Z3dpbiIgPiY1CitlY2hvICJjb25maWd1cmU6NTcwNTogY2hlY2tpbmcgZm9yIGN5Z3dpbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X29zX2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU3NjMgImNvbmZpZ3VyZSIKKyNsaW5lIDU3MTAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQpAQCAtNTc4MCw2ICs1NzI3LDExIEBACiAKIGVjaG8gIiRhY190IiIkZ2RiX2N2X29zX2N5Z3dpbiIgMT4mNgogCitETExUT09MPSR7RExMVE9PTC1kbGx0b29sfQorV0lORFJFUz0ke1dJTkRSRVMtd2luZHJlc30KKworCisKIGlmIHRlc3QgeCRnZGJfaG9zdCA9IHhnbzMyOyB0aGVuCiAgIFRFUk1fTElCPQogZWxzZQpAQCAtNTc4OCw3ICs1NzQwLDcgQEAKIGVsc2UKICAgVEVSTV9MSUI9CiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTc5MjogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NzQ0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBuY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtNTc5Niw3ICs1NzQ4LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sbmN1cnNlcyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODAwICJjb25maWd1cmUiCisjbGluZSA1NzUyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC01ODA3LDcgKzU3NTksNyBAQAogdGdldGVudCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTgxMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC01ODI2LDcgKzU3NzgsNyBAQAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sSGN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTgzMDogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxIY3Vyc2VzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NzgyOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBIY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtNTgzNCw3ICs1Nzg2LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sSGN1cnNlcyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODM4ICJjb25maWd1cmUiCisjbGluZSA1NzkwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC01ODQ1LDcgKzU3OTcsNyBAQAogdGdldGVudCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC01ODY0LDcgKzU4MTYsNyBAQAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWxpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTg2ODogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1ODIwOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1saWIiID4mNQogYWNfbGliX3Zhcj1gZWNobyB0ZXJtbGliJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtNTg3Miw3ICs1ODI0LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdGVybWxpYiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODc2ICJjb25maWd1cmUiCisjbGluZSA1ODI4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC01ODgzLDcgKzU4MzUsNyBAQAogdGdldGVudCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC01OTAyLDcgKzU4NTQsNyBAQAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWNhcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkwNjogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1ODU4OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQogYWNfbGliX3Zhcj1gZWNobyB0ZXJtY2FwJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtNTkxMCw3ICs1ODYyLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdGVybWNhcCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1OTE0ICJjb25maWd1cmUiCisjbGluZSA1ODY2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC01OTIxLDcgKzU4NzMsNyBAQAogdGdldGVudCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTkyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4Nzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC01OTQwLDcgKzU4OTIsNyBAQAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTQ0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbGN1cnNlcyIgPiY1CitlY2hvICJjb25maWd1cmU6NTg5NjogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBjdXJzZXMnXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC01OTQ4LDcgKzU5MDAsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxjdXJzZXMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTk1MiAiY29uZmlndXJlIgorI2xpbmUgNTkwNCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtNTk1OSw3ICs1OTExLDcgQEAKIHRnZXRlbnQoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU5NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1OTE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNTk3OCw3ICs1OTMwLDcgQEAKIGVsc2UKICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTgyOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1OTM0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1pbmZvIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gdGVybWluZm8nXyd0Z2V0ZW50IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC01OTg2LDcgKzU5MzgsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWx0ZXJtaW5mbyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1OTkwICJjb25maWd1cmUiCisjbGluZSA1OTQyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC01OTk3LDcgKzU5NDksNyBAQAogdGdldGVudCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjAwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU5NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC02MTU1LDcgKzYxMDcsNyBAQAogZmkKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGNsIGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNTk6IGNoZWNraW5nIGZvciBUY2wgY29uZmlndXJhdGlvbiIgPiY1CitlY2hvICJjb25maWd1cmU6NjExMTogY2hlY2tpbmcgZm9yIFRjbCBjb25maWd1cmF0aW9uIiA+JjUKICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfdGNsY29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYyNjMsNyArNjIxNSw3IEBACiBmaQogCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUayBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjY3OiBjaGVja2luZyBmb3IgVGsgY29uZmlndXJhdGlvbiIgPiY1CitlY2hvICJjb25maWd1cmU6NjIxOTogY2hlY2tpbmcgZm9yIFRrIGNvbmZpZ3VyYXRpb24iID4mNQogICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY190a2NvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02MzU5LDcgKzYzMTEsNyBAQAogCiBub190Y2w9dHJ1ZQogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzNjM6IGNoZWNraW5nIGZvciBUY2wgcHJpdmF0ZSBoZWFkZXJzLiBkaXI9JHtjb25maWdkaXJ9IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MzE1OiBjaGVja2luZyBmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSIgPiY1CiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRjbGluY2x1ZGUgb3IgLS13aXRob3V0LXRjbGluY2x1ZGUgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3RjbGluY2x1ZGUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgd2l0aHZhbD0iJHdpdGhfdGNsaW5jbHVkZSIKQEAgLTY0MjUsMTcgKzYzNzcsMTcgQEAKIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KICAgIGFjX3NhZmU9YGVjaG8gInRjbEludC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Y2xJbnQuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQyOTogY2hlY2tpbmcgZm9yIHRjbEludC5oIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MzgxOiBjaGVja2luZyBmb3IgdGNsSW50LmgiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY0MzQgImNvbmZpZ3VyZSIKKyNsaW5lIDYzODYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHRjbEludC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MzkxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtNjQ5NSw3ICs2NDQ3LDcgQEAKICMKIG5vX3RrPXRydWUKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0OTk6IGNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiID4mNQorZWNobyAiY29uZmlndXJlOjY0NTE6IGNoZWNraW5nIGZvciBUayBwcml2YXRlIGhlYWRlcnMiID4mNQogIyBDaGVjayB3aGV0aGVyIC0td2l0aC10a2luY2x1ZGUgb3IgLS13aXRob3V0LXRraW5jbHVkZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfdGtpbmNsdWRlK3NldH0iID0gc2V0OyB0aGVuCiAgIHdpdGh2YWw9IiR3aXRoX3RraW5jbHVkZSIKQEAgLTY1NjEsMTcgKzY1MTMsMTcgQEAKIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgogICAgYWNfc2FmZT1gZWNobyAidGsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGsuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjU2NTogY2hlY2tpbmcgZm9yIHRrLmgiID4mNQorZWNobyAiY29uZmlndXJlOjY1MTc6IGNoZWNraW5nIGZvciB0ay5oIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NTcwICJjb25maWd1cmUiCisjbGluZSA2NTIyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDx0ay5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTc1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTI3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtNjYxNyw3ICs2NTY5LDcgQEAKIAogCSAgIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjIxOiBjaGVja2luZyBmb3IgSXRjbCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQorZWNobyAiY29uZmlndXJlOjY1NzM6IGNoZWNraW5nIGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1CiBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgogICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vLi4vLi4vaXRjbCAke3NyY2Rpcn0vLi4vaXRjbC9pdGNsOyBkbwogICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy9pdGNsLmggOyB0aGVuCkBAIC02NjQwLDcgKzY1OTIsNyBAQAogCiAJICAgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSXRrIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY0NDogY2hlY2tpbmcgZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQorZWNobyAiY29uZmlndXJlOjY1OTY6IGNoZWNraW5nIGZvciBJdGsgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiA+JjUKIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRraH0iID0geCA7IHRoZW4KICAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrOyBkbwogICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy9pdGsuaCA7IHRoZW4KQEAgLTY2NjMsNyArNjYxNSw3IEBACiAKIAkgICAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjY3OiBjaGVja2luZyBmb3IgVGl4IHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSIgPiY1CitlY2hvICJjb25maWd1cmU6NjYxOTogY2hlY2tpbmcgZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0iID4mNQogaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgogICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vdGl4ICR7c3JjZGlyfS8uLi8uLi90aXggJHtzcmNkaXJ9Ly4uLy4uLy4uL3RpeCA7IGRvCiAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RpeC5oIDsgdGhlbgpAQCAtNjcwMSw3ICs2NjUzLDcgQEAKIGZpCiAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjcwNTogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1CitlY2hvICJjb25maWd1cmU6NjY1NzogY2hlY2tpbmcgZm9yIEl0Y2wgY29uZmlndXJhdGlvbiIgPiY1CiAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2l0Y2xjb25maWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjgxMyw3ICs2NzY1LDcgQEAKIGZpCiAKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEl0ayBjb25maWd1cmF0aW9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODE3OiBjaGVja2luZyBmb3IgSXRrIGNvbmZpZ3VyYXRpb24iID4mNQorZWNobyAiY29uZmlndXJlOjY3Njk6IGNoZWNraW5nIGZvciBJdGsgY29uZmlndXJhdGlvbiIgPiY1CiAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2l0a2NvbmZpZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02OTI1LDcgKzY4NzcsNyBAQAogZmkKIAogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGl4IGNvbmZpZ3VyYXRpb24iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5Mjk6IGNoZWNraW5nIGZvciBUaXggY29uZmlndXJhdGlvbiIgPiY1CitlY2hvICJjb25maWd1cmU6Njg4MTogY2hlY2tpbmcgZm9yIFRpeCBjb25maWd1cmF0aW9uIiA+JjUKICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfdGl4Y29uZmlnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTcwNjQsNyArNzAxNiw3IEBACiAjIFVzZXMgYWNfIHZhcnMgYXMgdGVtcHMgdG8gYWxsb3cgY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIGNhY2hlIGFuZCBjaGVja3MuCiAjIC0td2l0aG91dC14IG92ZXJyaWRlcyBldmVyeXRoaW5nIGVsc2UsIGJ1dCBkb2VzIG5vdCB0b3VjaCB0aGUgY2FjaGUuCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgWCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA2ODogY2hlY2tpbmcgZm9yIFgiID4mNQorZWNobyAiY29uZmlndXJlOjcwMjA6IGNoZWNraW5nIGZvciBYIiA+JjUKIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCkBAIC03MTI2LDEyICs3MDc4LDEyIEBACiAKICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcxMzAgImNvbmZpZ3VyZSIKKyNsaW5lIDcwODIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCR4X2RpcmVjdF90ZXN0X2luY2x1ZGU+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxMzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjcwODc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC03MjAwLDE0ICs3MTUyLDE0IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyMDQgImNvbmZpZ3VyZSIKKyNsaW5lIDcxNTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKICR7eF9kaXJlY3RfdGVzdF9mdW5jdGlvbn0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcyMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgogIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCkBAIC03NDg5LDcgKzc0NDEsNyBAQAogbGlua3M9IiR7bGlua3N9IG5tLmgiCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQ5MzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICJjb25maWd1cmU6NzQ0NTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTc1MTMsMTIgKzc0NjUsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTE3OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3NDY5OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NTIyICJjb25maWd1cmUiCisjbGluZSA3NDc0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC03NTI5LDcgKzc0ODEsNyBAQAogcmV0dXJuIF9fQ1lHV0lOX187CiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzUzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDg1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY3lnd2luPXllcwogZWxzZQpAQCAtNzU0NiwxOSArNzQ5OCwxOSBAQAogQ1lHV0lOPQogdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1NTA6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3NTAyOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc1NTUgImNvbmZpZ3VyZSIKKyNsaW5lIDc1MDcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiBfX01JTkdXMzJfXzsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NTYyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc1MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9taW5ndzMyPXllcwogZWxzZQpAQCAtNzU3Nyw3ICs3NTI5LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1ODE6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitlY2hvICJjb25maWd1cmU6NzUzMzogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNzU4NywxMCArNzUzOSwxMCBAQAogICBybSAtZiBjb25mdGVzdCoKICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0CiAgIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NTkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzU0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgogICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCiAgICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKKyAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKICAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7CiAgICAgICBlc2FjCiAgICAgZG9uZQpAQCAtNzc5MSw4ICs3NzQzLDYgQEAKIHMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwogcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKIHMlQEFSQCUkQVIlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAV0lORFJFU0AlJFdJTkRSRVMlZwogcyVAWUFDQ0AlJFlBQ0MlZwogcyVATUlHQCUkTUlHJWcKIHMlQENPTkZJR19MREZMQUdTQCUkQ09ORklHX0xERkxBR1MlZwpAQCAtNzgwMSw2ICs3NzUxLDggQEAKIHMlQE1NQUxMT0NfQ0ZMQUdTQCUkTU1BTExPQ19DRkxBR1MlZwogcyVATU1BTExPQ0AlJE1NQUxMT0MlZwogcyVAUkVHRVhAJSRSRUdFWCVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBXSU5EUkVTQCUkV0lORFJFUyVnCiBzJUBURVJNX0xJQkAlJFRFUk1fTElCJWcKIHMlQFdJTjMyTElCU0AlJFdJTjMyTElCUyVnCiBzJUBMSUJHVUlAJSRMSUJHVUklZwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZ3VyZS5ob3N0IGIvZ2RiL2NvbmZpZ3VyZS5ob3N0CmluZGV4IGRiNzIwYjEuLmQ0ODlhM2YgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWd1cmUuaG9zdAorKysgYi9nZGIvY29uZmlndXJlLmhvc3QKQEAgLTM0LDcgKzM0LDYgQEAKIGFscGhhKi0qLW9zZjIqKQkJZ2RiX2hvc3Q9YWxwaGEtb3NmMiA7OwogYWxwaGEqLSotb3NmWzM0NTY3ODldKikJZ2RiX2hvc3Q9YWxwaGEtb3NmMyA7OwogYWxwaGEqLSotbGludXgqKQlnZGJfaG9zdD1hbHBoYS1saW51eCA7OwotYWxwaGEqLSotZnJlZWJzZCopCWdkYl9ob3N0PWZic2QgOzsKIAogYXJtKi0qLWxpbnV4KikJCWdkYl9ob3N0PWxpbnV4IDs7CiBhcm0qLSotKikJCWdkYl9ob3N0PWFybSA7OwpAQCAtNTcsOCArNTYsNiBAQAogaVszNDU2XTg2LSotYnNkKikJZ2RiX2hvc3Q9aTM4NmJzZCA7OwogaVszNDU2XTg2LSotZGd1eCopCWdkYl9ob3N0PWkzODZkZ3V4IDs7CiBpWzM0NTZdODYtKi1mcmVlYnNkKikJZ2RiX2hvc3Q9ZmJzZCA7OwotaVszNDU2XTg2LSotbmV0YnNkZWxmKikJZ2RiX2hvc3Q9bmJzZGVsZiA7OwotaVszNDU2XTg2LSotbmV0YnNkYW91dCopIGdkYl9ob3N0PW5ic2QgOzsKIGlbMzQ1Nl04Ni0qLW5ldGJzZCopCWdkYl9ob3N0PW5ic2QgOzsKIGlbMzQ1Nl04Ni0qLWdvMzIqKQlnZGJfaG9zdD1nbzMyIDs7CiBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgZ2RiX2hvc3Q9Z28zMiA7OwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZ3VyZS5pbiBiL2dkYi9jb25maWd1cmUuaW4KaW5kZXggZDdhNzI1ZS4uNjMyNjRiYiAxMDA2NDQKLS0tIGEvZ2RiL2NvbmZpZ3VyZS5pbgorKysgYi9nZGIvY29uZmlndXJlLmluCkBAIC03OCw4ICs3OCw2IEBACiBBQ19QUk9HX0lOU1RBTEwKIEFDX0NIRUNLX1RPT0woQVIsIGFyKQogQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLUFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCkKLUFDX0NIRUNLX1RPT0woV0lORFJFUywgd2luZHJlcykKIEFDX1BST0dfWUFDQwogCiBkbmwgTWlHIGlzIG5lZWRlZCBmb3IgdGhlIEh1cmQuCkBAIC0xMTYsMTcgKzExNCwxNyBAQAogCiAjIFNlZSBpZiBtYWNoaW5lL3JlZy5oIHN1cHBvcnRzIHRoZSAlZnMgYW5kICVncyBpMzg2IHNlZ21lbnQgcmVnaXN0ZXJzLgogIyBPbGRlciBpMzg2IEJTRCdzIGRvbid0IGhhdmUgdGhlIHJfZnMgYW5kIHJfZ3MgbWVtYmVycyBvZiBgc3RydWN0IHJlZycuCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHJfZnMgaW4gc3RydWN0IHJlZ10sIGdkYl9jdl9zdHJ1Y3RfcmVnX3JfZnMsCitBQ19DQUNIRV9DSEVDSyhbZm9yIHJfZnMgaW4gc3RydWN0IHJlZ10sIGdkYl9jdl9zdHJ1Y3Rfcl9mcywKIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+XSwgW3N0cnVjdCByZWcgcjsgci5yX2ZzO10sCi1nZGJfY3Zfc3RydWN0X3JlZ19yX2ZzPXllcywgZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcz1ubyldKQotaWYgdGVzdCAkZ2RiX2N2X3N0cnVjdF9yZWdfcl9mcyA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfUkVHX1JfRlMpCitnZGJfY3Zfc3RydWN0X3JfZnM9eWVzLCBnZGJfY3Zfc3RydWN0X3JfZnM9bm8pXSkKK2lmIHRlc3QgJGdkYl9jdl9zdHJ1Y3Rfcl9mcyA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9SX0ZTKQogZmkKLUFDX0NBQ0hFX0NIRUNLKFtmb3Igcl9ncyBpbiBzdHJ1Y3QgcmVnXSwgZ2RiX2N2X3N0cnVjdF9yZWdfcl9ncywKK0FDX0NBQ0hFX0NIRUNLKFtmb3Igcl9ncyBpbiBzdHJ1Y3QgcmVnXSwgZ2RiX2N2X3N0cnVjdF9yX2dzLAogW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD5dLCBbc3RydWN0IHJlZyByOyByLnJfZ3M7XSwKLWdkYl9jdl9zdHJ1Y3RfcmVnX3JfZ3M9eWVzLCBnZGJfY3Zfc3RydWN0X3JlZ19yX2dzPW5vKV0pCi1pZiB0ZXN0ICRnZGJfY3Zfc3RydWN0X3JlZ19yX2dzID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX1NUUlVDVF9SRUdfUl9HUykKK2dkYl9jdl9zdHJ1Y3Rfcl9ncz15ZXMsIGdkYl9jdl9zdHJ1Y3Rfcl9ncz1ubyldKQoraWYgdGVzdCAkZ2RiX2N2X3N0cnVjdF9yX2dzID0geWVzOyB0aGVuCisgIEFDX0RFRklORShIQVZFX1JfR1MpCiBmaQogCiBkbmwgU2VlIGlmIHB0cmFjZS5oIHByb3ZpZGVzIHRoZSBQVFJBQ0VfR0VUUkVHUyByZXF1ZXN0LgpAQCAtNjA5LDYgKzYwNywxMSBAQAogbG9zZQogI2VuZGlmXSxbZ2RiX2N2X29zX2N5Z3dpbj15ZXNdLFtnZGJfY3Zfb3NfY3lnd2luPW5vXSldKQogCitETExUT09MPSR7RExMVE9PTC1kbGx0b29sfQorV0lORFJFUz0ke1dJTkRSRVMtd2luZHJlc30KK0FDX1NVQlNUKERMTFRPT0wpCitBQ19TVUJTVChXSU5EUkVTKQorCiBkbmwgRmlndXJlIG91dCB3aGljaCB0ZXJtIGxpYnJhcnkgdG8gdXNlLgogaWYgdGVzdCB4JGdkYl9ob3N0ID0geGdvMzI7IHRoZW4KICAgVEVSTV9MSUI9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlndXJlLnRndCBiL2dkYi9jb25maWd1cmUudGd0CmluZGV4IDk5ZGVmZjIuLjRiNjBlNDQgMTAwNjQ0Ci0tLSBhL2dkYi9jb25maWd1cmUudGd0CisrKyBiL2dkYi9jb25maWd1cmUudGd0CkBAIC00Niw3ICs0Niw2IEBACiAKIGFscGhhKi0qLW9zZiopCQlnZGJfdGFyZ2V0PWFscGhhLW9zZjEgOzsKIGFscGhhKi0qLWxpbnV4KikJZ2RiX3RhcmdldD1hbHBoYS1saW51eCA7OwotYWxwaGEqLSotZnJlZWJzZCopCWdkYl90YXJnZXQ9ZmJzZCA7OwogCiBhcmMtKi0qKQkJZ2RiX3RhcmdldD1hcmMgOzsKIApAQCAtODgsOCArODcsNiBAQAogaVszNDU2XTg2LSotYWl4KikJZ2RiX3RhcmdldD1pMzg2YWl4IDs7CiBpWzM0NTZdODYtKi1ic2QqKQlnZGJfdGFyZ2V0PWkzODZic2QgOzsKIGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQlnZGJfdGFyZ2V0PWZic2QgOzsKLWlbMzQ1Nl04Ni0qLW5ldGJzZGVsZiopCWdkYl90YXJnZXQ9bmJzZGVsZgotCQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9IGdkYnNlcnZlciIgOzsKIGlbMzQ1Nl04Ni0qLW5ldGJzZCopCWdkYl90YXJnZXQ9bmJzZCAKIAkJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBnZGJzZXJ2ZXIiIDs7CiBpWzM0NTZdODYtKi1vczlrKQlnZGJfdGFyZ2V0PWkzODZvczlrIDs7CmRpZmYgLS1naXQgYS9nZGIvY29yZWZpbGUuYyBiL2dkYi9jb3JlZmlsZS5jCmluZGV4IGM4NzcyZGUuLjk3YzNjZmUgMTAwNjQ0Ci0tLSBhL2dkYi9jb3JlZmlsZS5jCisrKyBiL2dkYi9jb3JlZmlsZS5jCkBAIC01MSw3ICs1MSw3IEBACiAgICBvbGQgY29kZSB0aGF0IGFzc3VtZWQgdGhhdCBvbmx5IG9uZSBob29rIGNvdWxkIGJlIHNldCwgYW5kIHdoaWNoIGNhbGxlZAogICAgZXhlY19maWxlX2Rpc3BsYXlfaG9vayBkaXJlY3RseS4gICovCiAKLXR5cGVkZWYgdm9pZCAoKmhvb2tfdHlwZSkgKGNoYXIgKik7Cit0eXBlZGVmIHZvaWQgKCpob29rX3R5cGUpIFBBUkFNUyAoKGNoYXIgKikpOwogCiBob29rX3R5cGUgZXhlY19maWxlX2Rpc3BsYXlfaG9vazsJLyogdGhlIG9yaWdpbmFsIGhvb2sgKi8KIHN0YXRpYyBob29rX3R5cGUgKmV4ZWNfZmlsZV9leHRyYV9ob29rczsJLyogYXJyYXkgb2YgYWRkaXRpb25hbCBob29rcyAqLwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHZvaWQKIHNwZWNpZnlfZXhlY19maWxlX2hvb2sgKGhvb2spCi0gICAgIHZvaWQgKCpob29rKSAoY2hhciAqKTsKKyAgICAgdm9pZCAoKmhvb2spIFBBUkFNUyAoKGNoYXIgKikpOwogewogICBob29rX3R5cGUgKm5ld19hcnJheTsKIApkaWZmIC0tZ2l0IGEvZ2RiL2NvcmVsb3cuYyBiL2dkYi9jb3JlbG93LmMKaW5kZXggNDMxNjNkOS4uOTQwNzc2ZCAxMDA2NDQKLS0tIGEvZ2RiL2NvcmVsb3cuYworKysgYi9nZGIvY29yZWxvdy5jCkBAIC0xLDUgKzEsNSBAQAogLyogQ29yZSBkdW1wIGFuZCBleGVjdXRhYmxlIGZpbGUgZnVuY3Rpb25zIGJlbG93IHRhcmdldCB2ZWN0b3IsIGZvciBHREIuCi0gICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMjAwMAorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCkBAIC0zMzcsMTIgKzMzNyw4IEBACiAKICAgc2lnZ3kgPSBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChjb3JlX2JmZCk7CiAgIGlmIChzaWdneSA+IDApCi0gICAgLyogTk9URTogdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QoKSBjb252ZXJ0cyBhIHRhcmdldCBzaWduYWwgdmFsdWUKLSAgICAgICBpbnRvIGdkYidzIGludGVybmFsIHNpZ25hbCB2YWx1ZS4gIFVuZm9ydHVuYXRseSBnZGIncyBpbnRlcm5hbAotICAgICAgIHZhbHVlIGlzIGNhbGxlZCBgYHRhcmdldF9zaWduYWwnJyBhbmQgdGhpcyBmdW5jdGlvbiBnb3QgdGhlCi0gICAgICAgbmFtZSAuLi5fZnJvbV9ob3N0KCkuICovCiAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsICVkLCAlcy5cbiIsIHNpZ2d5LAotCQkgICAgIHRhcmdldF9zaWduYWxfdG9fc3RyaW5nICh0YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAoc2lnZ3kpKSk7CisJCSAgICAgc2FmZV9zdHJzaWduYWwgKHNpZ2d5KSk7CiAKICAgLyogQnVpbGQgdXAgdGhyZWFkIGxpc3QgZnJvbSBCRkQgc2VjdGlvbnMuICovCiAKZGlmZiAtLWdpdCBhL2dkYi9kMTB2LXRkZXAuYyBiL2dkYi9kMTB2LXRkZXAuYwppbmRleCAzYWFiNDk0Li43YWM0MTc0IDEwMDY0NAotLS0gYS9nZGIvZDEwdi10ZGVwLmMKKysrIGIvZ2RiL2QxMHYtdGRlcC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJhcmNoLXV0aWxzLmgiCiAKLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgogI2luY2x1ZGUgInNpbS1kMTB2LmgiCiAKICN1bmRlZiBYTUFMTE9DCkBAIC0xNTk3LDI2ICsxNTk2LDkgQEAKICAgc2V0X2dkYmFyY2hfaW50X2JpdCAoZ2RiYXJjaCwgMiAqIFRBUkdFVF9DSEFSX0JJVCk7CiAgIHNldF9nZGJhcmNoX2xvbmdfYml0IChnZGJhcmNoLCA0ICogVEFSR0VUX0NIQVJfQklUKTsKICAgc2V0X2dkYmFyY2hfbG9uZ19sb25nX2JpdCAoZ2RiYXJjaCwgNCAqIFRBUkdFVF9DSEFSX0JJVCk7Ci0gIC8qIE5PVEU6IFRoZSBkMTB2IGFzIGEgMzIgYml0IGBgZmxvYXQnJyBhbmQgYGBkb3VibGUnJy4gYGBsb25nCi0gICAgIGRvdWJsZScnIGlzIDY0IGJpdHMuICovCiAgIHNldF9nZGJhcmNoX2Zsb2F0X2JpdCAoZ2RiYXJjaCwgNCAqIFRBUkdFVF9DSEFSX0JJVCk7CiAgIHNldF9nZGJhcmNoX2RvdWJsZV9iaXQgKGdkYmFyY2gsIDQgKiBUQVJHRVRfQ0hBUl9CSVQpOwogICBzZXRfZ2RiYXJjaF9sb25nX2RvdWJsZV9iaXQgKGdkYmFyY2gsIDggKiBUQVJHRVRfQ0hBUl9CSVQpOwotICBzd2l0Y2ggKGluZm8uYnl0ZV9vcmRlcikKLSAgICB7Ci0gICAgY2FzZSBCSUdfRU5ESUFOOgotICAgICAgc2V0X2dkYmFyY2hfZmxvYXRfZm9ybWF0IChnZGJhcmNoLCAmZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnKTsKLSAgICAgIHNldF9nZGJhcmNoX2RvdWJsZV9mb3JtYXQgKGdkYmFyY2gsICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcpOwotICAgICAgc2V0X2dkYmFyY2hfbG9uZ19kb3VibGVfZm9ybWF0IChnZGJhcmNoLCAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTElUVExFX0VORElBTjoKLSAgICAgIHNldF9nZGJhcmNoX2Zsb2F0X2Zvcm1hdCAoZ2RiYXJjaCwgJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2xpdHRsZSk7Ci0gICAgICBzZXRfZ2RiYXJjaF9kb3VibGVfZm9ybWF0IChnZGJhcmNoLCAmZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfbGl0dGxlKTsKLSAgICAgIHNldF9nZGJhcmNoX2xvbmdfZG91YmxlX2Zvcm1hdCAoZ2RiYXJjaCwgJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxfZXJyb3IgKCJkMTB2X2dkYmFyY2hfaW5pdDogYmFkIGJ5dGUgb3JkZXIgZm9yIGZsb2F0IGZvcm1hdCIpOwotICAgIH0KIAogICBzZXRfZ2RiYXJjaF91c2VfZ2VuZXJpY19kdW1teV9mcmFtZXMgKGdkYmFyY2gsIDEpOwogICBzZXRfZ2RiYXJjaF9jYWxsX2R1bW15X2xlbmd0aCAoZ2RiYXJjaCwgMCk7CkBAIC0xNjgyLDggKzE2NjQsOCBAQAogfQogCiAKLWV4dGVybiB2b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSAodm9pZCk7Ci1leHRlcm4gdm9pZCAoKnRhcmdldF93YWl0X2xvb3BfaG9vaykgKHZvaWQpOworZXh0ZXJuIHZvaWQgKCp0YXJnZXRfcmVzdW1lX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICgqdGFyZ2V0X3dhaXRfbG9vcF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CiAKIHZvaWQKIF9pbml0aWFsaXplX2QxMHZfdGRlcCAoKQpkaWZmIC0tZ2l0IGEvZ2RiL2QzMHYtdGRlcC5jIGIvZ2RiL2QzMHYtdGRlcC5jCmluZGV4IGNlYTAzNTAuLjEwYTI0MDQgMTAwNjQ0Ci0tLSBhL2dkYi9kMzB2LXRkZXAuYworKysgYi9nZGIvZDMwdi10ZGVwLmMKQEAgLTEzNjUsOCArMTM2NSw4IEBACiAgICAgfQogfQogCi1leHRlcm4gdm9pZCAoKnRhcmdldF9yZXN1bWVfaG9vaykgKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCp0YXJnZXRfd2FpdF9sb29wX2hvb2spICh2b2lkKTsKK2V4dGVybiB2b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKnRhcmdldF93YWl0X2xvb3BfaG9vaykgUEFSQU1TICgodm9pZCkpOwogCiB2b2lkCiBfaW5pdGlhbGl6ZV9kMzB2X3RkZXAgKCkKZGlmZiAtLWdpdCBhL2dkYi9kYnhyZWFkLmMgYi9nZGIvZGJ4cmVhZC5jCmluZGV4IDEwZTE1MzUuLjMyNTE1MjUgMTAwNjQ0Ci0tLSBhL2dkYi9kYnhyZWFkLmMKKysrIGIvZ2RiL2RieHJlYWQuYwpAQCAtODA5LDcgKzgwOSw3IEBACiAgICAgaW50IHN5bV9pZHg7CiAgICAgaW50IHN5bV9lbmQ7CiAgICAgaW50IHN5bW51bTsKLSAgICBpbnQgKCpmdW5jKSAoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bWJvbCAqLCBjaGFyICopOworICAgIGludCAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKSk7CiAgICAgLyogb3RoZXIgc3RhdGUgZGVwZW5kYW5jaWVzIGluY2x1ZGU6CiAgICAgICAgKGFzc3VtcHRpb24gaXMgdGhhdCB0aGVzZSB3aWxsIG5vdCBjaGFuZ2Ugc2luY2UgcHJvY2Vzc19ub3cgRklYTUUhISkKICAgICAgICBzdHJpbmd0YWJfZ2xvYmFsCkBAIC04MjgsNyArODI4LDcgQEAKIHByb2Nlc3NfbGF0ZXIgKHN5bSwgcCwgZikKICAgICAgc3RydWN0IHN5bWJvbCAqc3ltOwogICAgICBjaGFyICpwOwotICAgICBpbnQgKCpmKSAoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bWJvbCAqLCBjaGFyICopOworICAgICBpbnQgKCpmKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKikpOwogewogCiAgIC8qIEFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIHRoZSBkZWZlcnJlZCBsaXN0LiAgKi8KQEAgLTg2Nyw3ICs4NjcsNyBAQAogICBzdHJ1Y3Qgc3ltYm9sICpzeW07CiAgIGNoYXIgKnN0YWJzOwogICBpbnQgZXJyOwotICBpbnQgKCpmdW5jKSAoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bWJvbCAqLCBjaGFyICopOworICBpbnQgKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKikpOwogCiAgIC8qIFNhdmUgdGhlIHN0YXRlIG9mIG91ciBjYWxsZXIsIHdlJ2xsIHdhbnQgdG8gcmVzdG9yZSBpdCBiZWZvcmUKICAgICAgcmV0dXJuaW5nLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9kY2FjaGUuYyBiL2dkYi9kY2FjaGUuYwppbmRleCA1MzhmNzdlLi44ZmQ2YThmIDEwMDY0NAotLS0gYS9nZGIvZGNhY2hlLmMKKysrIGIvZ2RiL2RjYWNoZS5jCkBAIC00NzgsNyArNDc4LDcgQEAKIAogICBpZiAoZGNhY2hlX2VuYWJsZWRfcCkKICAgICB7Ci0gICAgICBpbnQgKCp4ZnVuYykgKERDQUNIRSAqIGRjYWNoZSwgQ09SRV9BRERSIGFkZHIsIGNoYXIgKnB0cik7CisgICAgICBpbnQgKCp4ZnVuYykgUEFSQU1TICgoRENBQ0hFICogZGNhY2hlLCBDT1JFX0FERFIgYWRkciwgY2hhciAqcHRyKSk7CiAgICAgICB4ZnVuYyA9IHNob3VsZF93cml0ZSA/IGRjYWNoZV9wb2tlX2J5dGUgOiBkY2FjaGVfcGVla19ieXRlOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCmRpZmYgLS1naXQgYS9nZGIvZGNhY2hlLmggYi9nZGIvZGNhY2hlLmgKaW5kZXggZDEzNzA4Zi4uZWY5NDY1YSAxMDA2NDQKLS0tIGEvZ2RiL2RjYWNoZS5oCisrKyBiL2dkYi9kY2FjaGUuaApAQCAtMjMsNyArMjMsOSBAQAogI2lmbmRlZiBEQ0FDSEVfSAogI2RlZmluZSBEQ0FDSEVfSAogCi10eXBlZGVmIGludCAoKm1lbXhmZXJmdW5jKSAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwgaW50IGxlbik7Cit0eXBlZGVmIGludCAoKm1lbXhmZXJmdW5jKSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwKKwkJCQkgICAgY2hhciAqbXlhZGRyLAorCQkJCSAgICBpbnQgbGVuKSk7CiAKIHR5cGVkZWYgc3RydWN0IGRjYWNoZV9zdHJ1Y3QgRENBQ0hFOwogCmRpZmYgLS1naXQgYS9nZGIvZGVmcy5oIGIvZ2RiL2RlZnMuaAppbmRleCA0MDBmNjMwLi5iMTFlZGQxIDEwMDY0NAotLS0gYS9nZGIvZGVmcy5oCisrKyBiL2dkYi9kZWZzLmgKQEAgLTU2LDYgKzU2LDkgQEAKIAogI2luY2x1ZGUgImxpYmliZXJ0eS5oIgogCisvKiBsaWJpYmVydHkuaCBjYW4ndCBkZWNsYXJlIHRoaXMgb25lLCBidXQgZXZpZGVudGx5IHdlIGNhbi4gICovCitleHRlcm4gY2hhciAqc3Ryc2lnbmFsIChpbnQpOworCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKIAogI2lmZGVmIFVTRV9NTUFMTE9DCkBAIC0yOTAsNiArMjkzLDggQEAKIAogZXh0ZXJuIGNoYXIgKnNhZmVfc3RyZXJyb3IgKGludCk7CiAKK2V4dGVybiBjaGFyICpzYWZlX3N0cnNpZ25hbCAoaW50KTsKKwogZXh0ZXJuIHZvaWQgaW5pdF9tYWxsb2MgKHZvaWQgKik7CiAKIGV4dGVybiB2b2lkIHJlcXVlc3RfcXVpdCAoaW50KTsKQEAgLTM2OSw5ICszNzQsNiBAQAogCiBleHRlcm4gdm9pZCBpbml0X3BhZ2VfaW5mbyAodm9pZCk7CiAKLWV4dGVybiBDT1JFX0FERFIgaG9zdF9wb2ludGVyX3RvX2FkZHJlc3MgKHZvaWQgKnB0cik7Ci1leHRlcm4gdm9pZCAqYWRkcmVzc190b19ob3N0X3BvaW50ZXIgKENPUkVfQUREUiBhZGRyKTsKLQogLyogRnJvbSBkZW1hbmdsZS5jICovCiAKIGV4dGVybiB2b2lkIHNldF9kZW1hbmdsaW5nX3N0eWxlIChjaGFyICopOwpAQCAtMTExMiw2ICsxMTE0LDIxIEBACiAjZGVmaW5lIEhPU1RfTE9OR19ET1VCTEVfRk9STUFUICZmbG9hdGZvcm1hdF91bmtub3duCiAjZW5kaWYKIAorI2lmbmRlZiBUQVJHRVRfRkxPQVRfRk9STUFUCisjZGVmaW5lIFRBUkdFVF9GTE9BVF9GT1JNQVQgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gXAorCQkJICAgICA/ICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcgXAorCQkJICAgICA6ICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUpCisjZW5kaWYKKyNpZm5kZWYgVEFSR0VUX0RPVUJMRV9GT1JNQVQKKyNkZWZpbmUgVEFSR0VUX0RPVUJMRV9GT1JNQVQgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gXAorCQkJICAgICAgPyAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnIFwKKwkJCSAgICAgIDogJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSkKKyNlbmRpZgorCisjaWZuZGVmIFRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQKKyNkZWZpbmUgVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVCAmZmxvYXRmb3JtYXRfdW5rbm93bgorI2VuZGlmCisKIC8qIFVzZSBgbG9uZyBkb3VibGUnIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIGl0LiAgKE5vdGUgdGhhdCB0aGlzIGlzIG5vdAogICAgbmVjZXNzYXJpbHkgYW55IGxvbmdlciB0aGFuIGBkb3VibGUnLiAgT24gU3VuT1MvZ2NjLCBpdCdzIHRoZSBzYW1lIGFzCiAgICBkb3VibGUuKSAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHREIgaW50ZXJuYWxseSBjb252ZXJ0cyBhbGwgZmxvYXRpbmcKZGlmZiAtLWdpdCBhL2dkYi9kb2MvQ2hhbmdlTG9nIGIvZ2RiL2RvYy9DaGFuZ2VMb2cKaW5kZXggOGQ5NWViYS4uYmY0Yzc5ZiAxMDA2NDQKLS0tIGEvZ2RiL2RvYy9DaGFuZ2VMb2cKKysrIGIvZ2RiL2RvYy9DaGFuZ2VMb2cKQEAgLTEsMTIgKzEsMyBAQAotRnJpIE1heSAyNiAxNTo1NTozMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChwZGYsIGdkYmludC5wZGYsIGdkYi5wZGYsIHN0YWJzLnBkZik6IE5ldyB0YXJnZXRzLgotICAJR2VuZXJhdGUgdXNpbmcgcGRmdGV4LgotCShQREZURVgpOiBEZWZpbmUuCi0gCShTVEFHRVNUVUZGLCBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6IEFkZCAqLnBkZi4KLQkoZ2RiLnRleGluZm8sIGdkYmludC50ZXhpbmZvLCBzdGFicy50ZXhpbmZvKTogV2hlbiBUZVggaW5zZXJ0IHRoZQotIAlAY29udGVudHMgYXQgdGhlIHN0YXJ0LgotCiAyMDAwLTA1LTI0ICBFbGkgWmFyZXRza2lpICA8ZWxpekBpcy5lbHRhLmNvLmlsPgogCiAJKiBnZGIudGV4aW5mbzogUmVtb3ZlIGR1cGxpY2F0ZSBAc3luY29kZWluZGV4LiAgRnJvbSBCcmlhbgpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9NYWtlZmlsZS5pbiBiL2dkYi9kb2MvTWFrZWZpbGUuaW4KaW5kZXggMDI1YzIwZS4uYWQzNzg3ZSAxMDA2NDQKLS0tIGEvZ2RiL2RvYy9NYWtlZmlsZS5pbgorKysgYi9nZGIvZG9jL01ha2VmaWxlLmluCkBAIC05Miw5ICs5Miw2IEBACiAjIFByb2dyYW0gdG8gZ2VuZXJhdGUgUG9zdHNjcmlwdCBmaWxlcyBmcm9tIERWSSBmaWxlcy4KIERWSVBTID0gZHZpcHMKIAotIyBQcm9ncmFtIHRvIGdlbmVyYXRlIFBERiBmaWxlcyBmcm9tIHRleCBmaWxlcy4KLVBERlRFWCA9IHBkZnRleAotCiAjIE1haW4gR0RCIG1hbnVhbCdzIHNvdXJjZSBmaWxlcwogU0ZJTEVTX0lOQ0xVREVEID0gZ2RiLWNmZy50ZXhpICQoc3JjZGlyKS9hbm5vdGF0ZS50ZXhpCiAKQEAgLTExMiw4ICsxMDksNyBAQAogZHZpOiBnZGIuZHZpIGdkYmludC5kdmkgc3RhYnMuZHZpIHJlZmNhcmQuZHZpCiBwczogZ2RiLnBzIGdkYmludC5wcyBzdGFicy5wcyByZWZjYXJkLnBzCiBodG1sOiBnZGJfdG9jLmh0bWwgZ2RiaW50X3RvYy5odG1sIHN0YWJzX3RvYy5odG1sCi1wZGY6IGdkYi5wZGYgZ2RiaW50LnBkZiBzdGFicy5wZGYKLWFsbC1kb2M6IGluZm8gZHZpIHBzICMgcGRmCithbGwtZG9jOiBpbmZvIGR2aSBwcwogZGlzdHN0dWZmOiBpbmZvCiAKIGluc3RhbGwtaW5mbzogaW5mbwpAQCAtMTM0LDcgKzEzMCw3IEBACiAJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChodG1sZGlyKS8kJGkgOyBcCiAJZG9uZQogCi1TVEFHRVNUVUZGID0gKi5pbmZvKiBnZGItYWxsLnRleGkgR0RCdm4udGV4aSAqLnBzICouZHZpICoucGRmCitTVEFHRVNUVUZGID0gKi5pbmZvKiBnZGItYWxsLnRleGkgR0RCdm4udGV4aSAqLnBzICouZHZpCiAKICMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCiBzdGFnZTE6IGZvcmNlCkBAIC0xODUsNyArMTgxLDcgQEAKICMgImNsZWFuIiBvciAiZGlzdGNsZWFuIi4gIFVzZSBtYWludGFpbmVyLWNsZWFuIHRvIHJlbW92ZSB0aGVtLgogCiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogZGlzdGNsZWFuCi0Jcm0gLWYgR0RCdm4udGV4aSAqLmluZm8qICouZHZpICoucHMgKi5odG1sICoucGRmCisJcm0gLWYgR0RCdm4udGV4aSAqLmluZm8qICouZHZpICoucHMgKi5odG1sCiAKICMgR0RCIFFVSUNLIFJFRkVSRU5DRSAoZHZpIG91dHB1dCkKIHJlZmNhcmQuZHZpIDogcmVmY2FyZC50ZXggJChSRUZFRElUUykKQEAgLTI0NywxOCArMjQzLDYgQEAKIGdkYi5wczogZ2RiLmR2aQogCSQoRFZJUFMpIC1vICRAICQ/CiAKLWdkYi5wZGY6ICR7U0ZJTEVTX0RPQ30KLQlpZiBbICEgLWYgLi9HREJ2bi50ZXhpIF07IHRoZW4gXAotCQkodGVzdCAiJCRMTl9TIiA9ICJsbiAtcyIgJiYgbG4gLXMgJChzcmNkaXIpL0dEQnZuLnRleGkgLikgfHwgXAotCQlsbiAkKHNyY2RpcikvR0RCdm4udGV4aSAuIHx8IFwKLQkJY3AgJChzcmNkaXIpL0dEQnZuLnRleGkgLiA7IGVsc2UgdHJ1ZTsgZmkKLQkkKFNFVF9URVhJTlBVVFMpICQoUERGVEVYKSBnZGIudGV4aW5mbwotCSQoU0VUX1RFWElOUFVUUykgJChQREZURVgpIGdkYi50ZXhpbmZvCi0JJChURVhJTkRFWCkgZ2RiLj8/Ci0JJChTRVRfVEVYSU5QVVRTKSAkKFBERlRFWCkgZ2RiLnRleGluZm8KLQlybSAtZiBnZGIuYXV4IGdkYi5jcCogZ2RiLmZuKiBnZGIua3kqIGdkYi5sb2cgZ2RiLnBnKiBnZGIudG9jIFwKLQkJZ2RiLnRwKiBnZGIudnIqCi0KICMgR0RCIE1BTlVBTDogaW5mbyBmaWxlCiAjIFdlJ3JlIHVzaW5nIHRleGluZm8gMy4xMjsgb2xkZXIgbWFrZWluZm8ncyBtYXkgbm90IGJlIGFibGUgdG8KICMgY29wZSB3aXRoIGFsbCB0aGUgbWFya3VwLiAgCkBAIC0zODYsMTMgKzM3MCw2IEBACiBnZGJpbnQucHMgOiBnZGJpbnQuZHZpCiAJJChEVklQUykgLW8gJEAgJD8KIAotZ2RiaW50LnBkZjogZ2RiaW50LmR2aQotCSQoU0VUX1RFWElOUFVUUykgJChQREZURVgpIGdkYmludC50ZXhpbmZvCi0JJChURVhJTkRFWCkgZ2RiaW50Lj8/Ci0JJChTRVRfVEVYSU5QVVRTKSAkKFBERlRFWCkgZ2RiaW50LnRleGluZm8KLQlybSAtZiBnZGJpbnQuYXV4IGdkYmludC5jcCogZ2RiaW50LmZuKiBnZGJpbnQua3kqIFwKLQkJZ2RiaW50LmxvZyBnZGJpbnQucGcqIGdkYmludC50b2MgZ2RiaW50LnRwKiBnZGJpbnQudnIqCi0KICMgR0RCIElOVEVSTkFMUyBNQU5VQUw6IGluZm8gZmlsZQogCiBnZGJpbnQuaW5mbzogZ2RiaW50LnRleGluZm8KQEAgLTQyMiwxMyArMzk5LDYgQEAKIHN0YWJzLnBzOiBzdGFicy5kdmkKIAkkKERWSVBTKSAtbyAkQCAkPwogCi1zdGFicy5wZGY6IHN0YWJzLmR2aQotCSQoU0VUX1RFWElOUFVUUykgJChQREZURVgpIHN0YWJzLnRleGluZm8KLQkkKFRFWElOREVYKSBzdGFicy4/PwotCSQoU0VUX1RFWElOUFVUUykgJChQREZURVgpIHN0YWJzLnRleGluZm8KLQlybSAtZiBzdGFicy5hdXggc3RhYnMuY3AqIHN0YWJzLmZuKiBzdGFicy5reSogXAotCQlzdGFicy5sb2cgc3RhYnMucGcqIHN0YWJzLnRvYyBzdGFicy50cCogc3RhYnMudnIqCi0KIGZvcmNlOgogCiBNYWtlZmlsZTogTWFrZWZpbGUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpIGNvbmZpZy5zdGF0dXMKZGlmZiAtLWdpdCBhL2dkYi9kb2MvZ2RiLnRleGluZm8gYi9nZGIvZG9jL2dkYi50ZXhpbmZvCmluZGV4IDkxNGUwYWIuLmI4NjMwY2MgMTAwNjQ0Ci0tLSBhL2dkYi9kb2MvZ2RiLnRleGluZm8KKysrIGIvZ2RiL2RvYy9nZGIudGV4aW5mbwpAQCAtMjA2LDExICsyMDYsNiBAQAogCiBAZW5kIGlmaHRtbAogCi1AYyBUZVggY2FuIGhhbmRsZSB0aGUgY29udGVudHMgYXQgdGhlIHN0YXJ0IGJ1dCBtYWtlaW5mbyAzLjEyIGNhbiBub3QKLUBpZnRleAotQGNvbnRlbnRzCi1AZW5kIGlmdGV4Ci0KIEBub2RlIFN1bW1hcnkKIEB1bm51bWJlcmVkIFN1bW1hcnkgb2YgQHZhbHVle0dEQk59CiAKQEAgLTEyODc5LDEyICsxMjg3NCw1IEBACiAlIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMTk5MS4KIEBlbmQgdGV4CiAKLUBjIFRlWCBjYW4gaGFuZGxlIHRoZSBjb250ZW50cyBhdCB0aGUgc3RhcnQgYnV0IG1ha2VpbmZvIDMuMTIgY2FuIG5vdAotQGlmaW5mbwogQGNvbnRlbnRzCi1AZW5kIGlmaW5mbwotQGlmaHRtbAotQGNvbnRlbnRzCi1AZW5kIGlmaHRtbAotCiBAYnllCmRpZmYgLS1naXQgYS9nZGIvZG9jL2dkYmludC50ZXhpbmZvIGIvZ2RiL2RvYy9nZGJpbnQudGV4aW5mbwppbmRleCA1MzJkMjIzLi40MzllYWVhIDEwMDY0NAotLS0gYS9nZGIvZG9jL2dkYmludC50ZXhpbmZvCisrKyBiL2dkYi9kb2MvZ2RiaW50LnRleGluZm8KQEAgLTYzLDExICs2Myw2IEBACiAKIEBlbmQgdGl0bGVwYWdlCiAKLUBjIFRlWCBjYW4gaGFuZGxlIHRoZSBjb250ZW50cyBhdCB0aGUgc3RhcnQgYnV0IG1ha2VpbmZvIDMuMTIgY2FuIG5vdAotQGlmdGV4Ci1AY29udGVudHMKLUBlbmQgaWZ0ZXgKLQogQG5vZGUgVG9wCiBAYyBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgKGJ1dCBvbmx5IGZvciBpbmZvLAogQGMgbm90IGZvciBUZVgpLiAgRXhpc3RpbmcgR05VIG1hbnVhbHMgc2VlbSBpbmNvbnNpc3RlbnQgb24gdGhpcyBwb2ludC4KQEAgLTMzODgsMTIgKzMzODMsNiBAQAogCiBAZW5kIHRhYmxlCiAKLUBjIFRlWCBjYW4gaGFuZGxlIHRoZSBjb250ZW50cyBhdCB0aGUgc3RhcnQgYnV0IG1ha2VpbmZvIDMuMTIgY2FuIG5vdAotQGlmaW5mbwotQGNvbnRlbnRzCi1AZW5kIGlmaW5mbwotQGlmaHRtbAotQGNvbnRlbnRzCi1AZW5kIGlmaHRtbAogCitAY29udGVudHMKIEBieWUKZGlmZiAtLWdpdCBhL2dkYi9kb2Mvc3RhYnMudGV4aW5mbyBiL2dkYi9kb2Mvc3RhYnMudGV4aW5mbwppbmRleCBhNGVhMWRjLi44MjM5Y2U3IDEwMDY0NAotLS0gYS9nZGIvZG9jL3N0YWJzLnRleGluZm8KKysrIGIvZ2RiL2RvYy9zdGFicy50ZXhpbmZvCkBAIC04NiwxMCArODYsNiBAQAogQGVuZCBtZW51CiBAZW5kIGlmaW5mbwogCi1AYyBUZVggY2FuIGhhbmRsZSB0aGUgY29udGVudHMgYXQgdGhlIHN0YXJ0IGJ1dCBtYWtlaW5mbyAzLjEyIGNhbiBub3QKLUBpZnRleAotQGNvbnRlbnRzCi1AZW5kIGlmdGV4CiAKIEBub2RlIE92ZXJ2aWV3CiBAY2hhcHRlciBPdmVydmlldyBvZiBTdGFicwpAQCAtNDAxOSwxMiArNDAxNSw1IEBACiAKIEBwcmludGluZGV4IGZuCiAKLUBjIFRlWCBjYW4gaGFuZGxlIHRoZSBjb250ZW50cyBhdCB0aGUgc3RhcnQgYnV0IG1ha2VpbmZvIDMuMTIgY2FuIG5vdAotQGlmaW5mbwogQGNvbnRlbnRzCi1AZW5kIGlmaW5mbwotQGlmaHRtbAotQGNvbnRlbnRzCi1AZW5kIGlmaHRtbAotCiBAYnllCmRpZmYgLS1naXQgYS9nZGIvZHNyZWMuYyBiL2dkYi9kc3JlYy5jCmluZGV4IDMxYjhmYzIuLmU5ZDg5ZjYgMTAwNjQ0Ci0tLSBhL2dkYi9kc3JlYy5jCisrKyBiL2dkYi9kc3JlYy5jCkBAIC01MSw3ICs1MSw3IEBACiAgICAgIGludCBtYXhyZWNzaXplOwogICAgICBpbnQgZmxhZ3M7CiAgICAgIGludCBoYXNobWFyazsKLSAgICAgaW50ICgqd2FpdGFjaykgKHZvaWQpOworICAgICBpbnQgKCp3YWl0YWNrKSBQQVJBTVMgKCh2b2lkKSk7CiB7CiAgIGJmZCAqYWJmZDsKICAgYXNlY3Rpb24gKnM7CmRpZmYgLS1naXQgYS9nZGIvZHZlMzkwMC1yb20uYyBiL2dkYi9kdmUzOTAwLXJvbS5jCmluZGV4IDRjZDAzNWYuLmJkYmIwM2QgMTAwNjQ0Ci0tLSBhL2dkYi9kdmUzOTAwLXJvbS5jCisrKyBiL2dkYi9kdmUzOTAwLXJvbS5jCkBAIC0zMSw3ICszMSw3IEBACiAKIC8qIFR5cGUgb2YgZnVuY3Rpb24gcGFzc2VkIHRvIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCiAKLXR5cGVkZWYgdm9pZCAoKnNlY3Rpb25fbWFwX2Z1bmMpIChiZmQgKiBhYmZkLCBhc2VjdGlvbiAqIHNlY3QsIFBUUiBvYmopOwordHlwZWRlZiB2b2lkICgqc2VjdGlvbl9tYXBfZnVuYykgUEFSQU1TICgoYmZkICogYWJmZCwgYXNlY3Rpb24gKiBzZWN0LCBQVFIgb2JqKSk7CiAKIC8qIFBhY2tldCBlc2NhcGUgY2hhcmFjdGVyIHVzZWQgYnkgRGVuc2FuIG1vbml0b3IuICAqLwogCkBAIC05NSwxMyArOTUsMTMgQEAKICAgIGZvcm1hdCwgYW5kIHRob3NlIHRoYXQgY2FuJ3QgYmUgbW9kaWZpZWQgYXQgYWxsLiAgSW4gdGhvc2UgY2FzZXMKICAgIHdlIGhhdmUgdG8gdXNlIG91ciBvd24gZnVuY3Rpb25zIHRvIGZldGNoIGFuZCBzdG9yZSB0aGVpciB2YWx1ZXMuICAqLwogCi1zdGF0aWMgdm9pZCAoKm9yaWdfbW9uaXRvcl9mZXRjaF9yZWdpc3RlcnMpIChpbnQgcmVnbm8pOwotc3RhdGljIHZvaWQgKCpvcmlnX21vbml0b3Jfc3RvcmVfcmVnaXN0ZXJzKSAoaW50IHJlZ25vKTsKK3N0YXRpYyB2b2lkICgqb3JpZ19tb25pdG9yX2ZldGNoX3JlZ2lzdGVycykgUEFSQU1TICgoaW50IHJlZ25vKSk7CitzdGF0aWMgdm9pZCAoKm9yaWdfbW9uaXRvcl9zdG9yZV9yZWdpc3RlcnMpIFBBUkFNUyAoKGludCByZWdubykpOwogCiAvKiBQb2ludGVyIHRvIHN0YXRpYyBmdW5jdGlvbiBpbiBtb25pdG9yLiBmb3IgbG9hZGluZyBwcm9ncmFtcy4KICAgIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBsb2FkaW5nIFMtcmVjb3JkcyB2aWEgdGhlIHNlcmlhbCBsaW5rLiAgKi8KIAotc3RhdGljIHZvaWQgKCpvcmlnX21vbml0b3JfbG9hZCkgKGNoYXIgKmZpbGUsIGludCBmcm9tX3R0eSk7CitzdGF0aWMgdm9pZCAoKm9yaWdfbW9uaXRvcl9sb2FkKSBQQVJBTVMgKChjaGFyICpmaWxlLCBpbnQgZnJvbV90dHkpKTsKIAogLyogVGhpcyBmbGFnIGlzIHNldCBpZiBhIGZhc3QgZXRoZXJuZXQgZG93bmxvYWQgc2hvdWxkIGJlIHVzZWQuICAqLwogCmRpZmYgLS1naXQgYS9nZGIvZHdhcmYycmVhZC5jIGIvZ2RiL2R3YXJmMnJlYWQuYwppbmRleCBiNmEzNDBmLi43M2NjZDA2IDEwMDY0NAotLS0gYS9nZGIvZHdhcmYycmVhZC5jCisrKyBiL2dkYi9kd2FyZjJyZWFkLmMKQEAgLTM1LDE1ICszNSwxNCBAQAogI2luY2x1ZGUgImJ1aWxkc3ltLmgiCiAjaW5jbHVkZSAiZGVtYW5nbGUuaCIKICNpbmNsdWRlICJleHByZXNzaW9uLmgiCi0KICNpbmNsdWRlICJsYW5ndWFnZS5oIgogI2luY2x1ZGUgImNvbXBsYWludHMuaCIKLSNpbmNsdWRlICJiY2FjaGUuaCIKKwogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0vKiAuZGVidWdfaW5mbyBoZWFkZXIgZm9yIGEgY29tcGlsYXRpb24gdW5pdAorLyogLmRlYnVnX2luZm8gaGVhZGVyIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgCiAgICBCZWNhdXNlIG9mIGFsaWdubWVudCBjb25zdHJhaW50cywgdGhpcyBzdHJ1Y3R1cmUgaGFzIHBhZGRpbmcgYW5kIGNhbm5vdAogICAgYmUgbWFwcGVkIGRpcmVjdGx5IG9udG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCiB0eXBlZGVmIHN0cnVjdCBjb21wX3VuaXRfaGVhZGVyCkBAIC0yNjgsMTEgKzI2Nyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGllX2luZm8gKmRpZV9yZWZfdGFibGVbUkVGX0hBU0hfU0laRV07CiAKLSNpZm5kZWYgVFlQRV9IQVNIX1NJWkUKLSNkZWZpbmUgVFlQRV9IQVNIX1NJWkUgNDA5NgotI2VuZGlmCi1zdGF0aWMgc3RydWN0IHR5cGUgKmR3YXJmMl9jYWNoZWRfdHlwZXNbVFlQRV9IQVNIX1NJWkVdOwotCiAvKiBPYnN0YWNrIGZvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBzdG9yYWdlIHVzZWQgZHVyaW5nIHN5bWJvbCByZWFkaW5nLiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBkd2FyZjJfdG1wX29ic3RhY2s7CiAKQEAgLTMzOSw3ICszMzMsNyBAQAogc3RhdGljIGludCBmcmFtZV9iYXNlX3JlZzsKIHN0YXRpYyBDT1JFX0FERFIgZnJhbWVfYmFzZV9vZmZzZXQ7CiAKLS8qIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gZWFjaCBzeW1ib2wgdmFsdWUuICBGSVhNRTogIEdlbmVyYWxpemUgdG8KKy8qIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gZWFjaCBzeW1ib2wgdmFsdWUuICBGSVhNRTogIEdlbmVyYWxpemUgdG8gCiAgICB0aGUgc2VjdGlvbl9vZmZzZXRzIHN0cnVjdHVyZSB1c2VkIGJ5IGRieHJlYWQgKG9uY2UgdGhpcyBpcyBkb25lLAogICAgcGFzcyB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBudW1iZXIgdG8gZW5kX3N5bXRhYikuICAqLwogc3RhdGljIENPUkVfQUREUiBiYXNlYWRkcjsJLyogQWRkIHRvIGVhY2ggc3ltYm9sIHZhbHVlICovCkBAIC0zOTY2LDkgKzM5NjAsOSBAQAogCiAgICBEV19BVF9uYW1lOiAgICAgICAgICAvc3JjZGlyL2xpc3QwLmMKICAgIERXX0FUX2NvbXBfZGlyOiAgICAgICAgICAgICAgL2NvbXBkaXIKLSAgIGZpbGVzLmZpbGVzWzBdLm5hbWU6IGxpc3QwLmgKKyAgIGZpbGVzLmZpbGVzWzBdLm5hbWU6IGxpc3QwLmggICAgICAgICAKICAgIGZpbGVzLmZpbGVzWzBdLmRpcjogIC9zcmNkaXIKLSAgIGZpbGVzLmZpbGVzWzFdLm5hbWU6IGxpc3QwLmMKKyAgIGZpbGVzLmZpbGVzWzFdLm5hbWU6IGxpc3QwLmMgICAgICAgICAKICAgIGZpbGVzLmZpbGVzWzFdLmRpcjogIC9zcmNkaXIKIAogICAgVGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBsaXN0MC5jIGhhcyB0byBlbmQgdXAgaW4gYSBzaW5nbGUKQEAgLTQ0NTUsMzggKzQ0NDksNyBAQAogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7Ci0gICAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lKTsKLSAgICAgIGlmIChhdHRyICYmIERXX1NUUklORyAoYXR0cikpCi0JewotCSAgY2hhciAqYXR0cm5hbWU9RFdfU1RSSU5HIChhdHRyKTsKLQkgIHVuc2lnbmVkIGxvbmcgaGFzaHZhbD1oYXNoKGF0dHJuYW1lLCBzdHJsZW4oYXR0cm5hbWUpKSAlIFRZUEVfSEFTSF9TSVpFOwotCi0JICBpZiAoZHdhcmYyX2NhY2hlZF90eXBlc1toYXNodmFsXSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZW9mdHlwZTsKLQkgICAgICBuYW1lb2Z0eXBlID0gVFlQRV9OQU1FKGR3YXJmMl9jYWNoZWRfdHlwZXNbaGFzaHZhbF0pID09IE5VTEwgPyBUWVBFX1RBR19OQU1FKGR3YXJmMl9jYWNoZWRfdHlwZXNbaGFzaHZhbF0pIDogVFlQRV9OQU1FKGR3YXJmMl9jYWNoZWRfdHlwZXNbaGFzaHZhbF0pOwotCSAgICAgIGlmIChzdHJjbXAoYXR0cm5hbWUsIG5hbWVvZnR5cGUpID09IDApCi0JCXsKLQkJICBkaWUtPnR5cGU9ZHdhcmYyX2NhY2hlZF90eXBlc1toYXNodmFsXTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlYWRfdHlwZV9kaWUgKGRpZSwgb2JqZmlsZSk7Ci0JCSAgZHdhcmYyX2NhY2hlZF90eXBlc1toYXNodmFsXSA9IGRpZS0+dHlwZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWFkX3R5cGVfZGllIChkaWUsIG9iamZpbGUpOwotCSAgICAgIGR3YXJmMl9jYWNoZWRfdHlwZXNbaGFzaHZhbF0gPSBkaWUtPnR5cGU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVhZF90eXBlX2RpZSAoZGllLCBvYmpmaWxlKTsKLQl9Ci0KKyAgICAgIHJlYWRfdHlwZV9kaWUgKGRpZSwgb2JqZmlsZSk7CiAgICAgICBpZiAoIWRpZS0+dHlwZSkKIAl7CiAJICBkdW1wX2RpZSAoZGllKTsKZGlmZiAtLWdpdCBhL2dkYi9leGVjLmMgYi9nZGIvZXhlYy5jCmluZGV4IDc2ZDQ5MjguLjA2MjBkZDMgMTAwNjQ0Ci0tLSBhL2dkYi9leGVjLmMKKysrIGIvZ2RiL2V4ZWMuYwpAQCAtNDcsNyArNDcsNyBAQAogCiBzdHJ1Y3Qgdm1hcCAqbWFwX3ZtYXAgKGJmZCAqLCBiZmQgKik7CiAKLXZvaWQgKCpmaWxlX2NoYW5nZWRfaG9vaykgKGNoYXIgKik7Cit2b2lkICgqZmlsZV9jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKGNoYXIgKikpOwogCiAvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KIApAQCAtNDczLDcgKzQ3Myw3IEBACiAgIGJvb2xlYW4gcmVzOwogICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqcDsKICAgQ09SRV9BRERSIG5leHRzZWN0YWRkciwgbWVtZW5kOwotICBib29sZWFuICgqeGZlcl9mbikgKGJmZCAqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKTsKKyAgYm9vbGVhbiAoKnhmZXJfZm4pIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CiAgIGFzZWN0aW9uICpzZWN0aW9uOwogCiAgIGlmIChsZW4gPD0gMCkKZGlmZiAtLWdpdCBhL2dkYi9maW5kdmFyLmMgYi9nZGIvZmluZHZhci5jCmluZGV4IDU1NzFlZGUuLmFkZjdkZGIgMTAwNjQ0Ci0tLSBhL2dkYi9maW5kdmFyLmMKKysrIGIvZ2RiL2ZpbmR2YXIuYwpAQCAtMTIxMCwzMCArMTIxMCwyMCBAQAogLyogR2l2ZW4gYSBwb2ludGVyIG9mIHR5cGUgVFlQRSBpbiB0YXJnZXQgZm9ybSBpbiBCVUYsIHJldHVybiB0aGUKICAgIGFkZHJlc3MgaXQgcmVwcmVzZW50cy4gICovCiBDT1JFX0FERFIKLXVuc2lnbmVkX3BvaW50ZXJfdG9fYWRkcmVzcyAoc3RydWN0IHR5cGUgKnR5cGUsIHZvaWQgKmJ1ZikKK2dlbmVyaWNfcG9pbnRlcl90b19hZGRyZXNzIChzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqYnVmKQogewogICByZXR1cm4gZXh0cmFjdF9hZGRyZXNzIChidWYsIFRZUEVfTEVOR1RIICh0eXBlKSk7CiB9CiAKLUNPUkVfQUREUgotc2lnbmVkX3BvaW50ZXJfdG9fYWRkcmVzcyAoc3RydWN0IHR5cGUgKnR5cGUsIHZvaWQgKmJ1ZikKLXsKLSAgcmV0dXJuIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgVFlQRV9MRU5HVEggKHR5cGUpKTsKLX0KIAogLyogR2l2ZW4gYW4gYWRkcmVzcywgc3RvcmUgaXQgYXMgYSBwb2ludGVyIG9mIHR5cGUgVFlQRSBpbiB0YXJnZXQKICAgIGZvcm1hdCBpbiBCVUYuICAqLwogdm9pZAotdW5zaWduZWRfYWRkcmVzc190b19wb2ludGVyIChzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmLCBDT1JFX0FERFIgYWRkcikKK2dlbmVyaWNfYWRkcmVzc190b19wb2ludGVyIChzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqYnVmLCBDT1JFX0FERFIgYWRkcikKIHsKICAgc3RvcmVfYWRkcmVzcyAoYnVmLCBUWVBFX0xFTkdUSCAodHlwZSksIGFkZHIpOwogfQogCi12b2lkCi1hZGRyZXNzX3RvX3NpZ25lZF9wb2ludGVyIChzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmLCBDT1JFX0FERFIgYWRkcikKLXsKLSAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgVFlQRV9MRU5HVEggKHR5cGUpLCBhZGRyKTsKLX0KIAwKIC8qIFdpbGwgY2FsbGluZyByZWFkX3Zhcl92YWx1ZSBvciBsb2NhdGVfdmFyX3ZhbHVlIG9uIFNZTSBlbmQKICAgIHVwIGNhcmluZyB3aGF0IGZyYW1lIGl0IGlzIGJlaW5nIGV2YWx1YXRlZCByZWxhdGl2ZSB0bz8gIFNZTSBtdXN0CmRpZmYgLS1naXQgYS9nZGIvZm9yay1jaGlsZC5jIGIvZ2RiL2ZvcmstY2hpbGQuYwppbmRleCAwOTk2ZmJkLi4xYWNiMjhhIDEwMDY0NAotLS0gYS9nZGIvZm9yay1jaGlsZC5jCisrKyBiL2dkYi9mb3JrLWNoaWxkLmMKQEAgLTEwMyw5ICsxMDMsOSBAQAogICAgICBjaGFyICpleGVjX2ZpbGU7CiAgICAgIGNoYXIgKmFsbGFyZ3M7CiAgICAgIGNoYXIgKiplbnY7Ci0gICAgIHZvaWQgKCp0cmFjZW1lX2Z1bikgKHZvaWQpOwotICAgICB2b2lkICgqaW5pdF90cmFjZV9mdW4pIChpbnQpOwotICAgICB2b2lkICgqcHJlX3RyYWNlX2Z1bikgKHZvaWQpOworICAgICB2b2lkICgqdHJhY2VtZV9mdW4pIFBBUkFNUyAoKHZvaWQpKTsKKyAgICAgdm9pZCAoKmluaXRfdHJhY2VfZnVuKSBQQVJBTVMgKChpbnQpKTsKKyAgICAgdm9pZCAoKnByZV90cmFjZV9mdW4pIFBBUkFNUyAoKHZvaWQpKTsKICAgICAgY2hhciAqc2hlbGxfZmlsZTsKIHsKICAgaW50IHBpZDsKZGlmZiAtLWdpdCBhL2dkYi9nZGJhcmNoLmMgYi9nZGIvZ2RiYXJjaC5jCmluZGV4IDU1YWZlMTEuLmJjYWQ3YjkgMTAwNjQ0Ci0tLSBhL2dkYi9nZGJhcmNoLmMKKysrIGIvZ2RiL2dkYmFyY2guYwpAQCAtNTgsNyArNTgsNiBAQAogI2VuZGlmCiAjaW5jbHVkZSAic3ltY2F0LmgiCiAKLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgogCiAvKiBTdGF0aWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCiAKQEAgLTIyMSw5ICsyMjAsNiBAQAogICBnZGJhcmNoX3N0YWNrX2FsaWduX2Z0eXBlICpzdGFja19hbGlnbjsKICAgZ2RiYXJjaF9yZWdfc3RydWN0X2hhc19hZGRyX2Z0eXBlICpyZWdfc3RydWN0X2hhc19hZGRyOwogICBnZGJhcmNoX3NhdmVfZHVtbXlfZnJhbWVfdG9zX2Z0eXBlICpzYXZlX2R1bW15X2ZyYW1lX3RvczsKLSAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZmxvYXRfZm9ybWF0OwotICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiBkb3VibGVfZm9ybWF0OwotICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiBsb25nX2RvdWJsZV9mb3JtYXQ7CiB9OwogCiAKQEAgLTMzNSw5ICszMzEsNiBAQAogICAwLAogICAwLAogICAwLAotICAwLAotICAwLAotICAwLAogICAvKiBzdGFydHVwX2dkYmFyY2goKSAqLwogfTsKIHN0cnVjdCBnZGJhcmNoICpjdXJyZW50X2dkYmFyY2ggPSAmc3RhcnR1cF9nZGJhcmNoOwpAQCAtMzgzLDggKzM3Niw4IEBACiAgIGdkYmFyY2gtPmNhbGxfZHVtbXlfc3RhY2tfYWRqdXN0X3AgPSAtMTsKICAgZ2RiYXJjaC0+Y29lcmNlX2Zsb2F0X3RvX2RvdWJsZSA9IGRlZmF1bHRfY29lcmNlX2Zsb2F0X3RvX2RvdWJsZTsKICAgZ2RiYXJjaC0+cmVnaXN0ZXJfY29udmVydGlibGUgPSBnZW5lcmljX3JlZ2lzdGVyX2NvbnZlcnRpYmxlX25vdDsKLSAgZ2RiYXJjaC0+cG9pbnRlcl90b19hZGRyZXNzID0gdW5zaWduZWRfcG9pbnRlcl90b19hZGRyZXNzOwotICBnZGJhcmNoLT5hZGRyZXNzX3RvX3BvaW50ZXIgPSB1bnNpZ25lZF9hZGRyZXNzX3RvX3BvaW50ZXI7CisgIGdkYmFyY2gtPnBvaW50ZXJfdG9fYWRkcmVzcyA9IGdlbmVyaWNfcG9pbnRlcl90b19hZGRyZXNzOworICBnZGJhcmNoLT5hZGRyZXNzX3RvX3BvaW50ZXIgPSBnZW5lcmljX2FkZHJlc3NfdG9fcG9pbnRlcjsKICAgZ2RiYXJjaC0+cmV0dXJuX3ZhbHVlX29uX3N0YWNrID0gZ2VuZXJpY19yZXR1cm5fdmFsdWVfb25fc3RhY2tfbm90OwogICBnZGJhcmNoLT5wcm9sb2d1ZV9mcmFtZWxlc3NfcCA9IGdlbmVyaWNfcHJvbG9ndWVfZnJhbWVsZXNzX3A7CiAgIGdkYmFyY2gtPmJyZWFrcG9pbnRfZnJvbV9wYyA9IGxlZ2FjeV9icmVha3BvaW50X2Zyb21fcGM7CkBAIC02NDQsMTIgKzYzNyw2IEBACiAgIC8qIFNraXAgdmVyaWZ5IG9mIHN0YWNrX2FsaWduLCBoYXMgcHJlZGljYXRlICovCiAgIC8qIFNraXAgdmVyaWZ5IG9mIHJlZ19zdHJ1Y3RfaGFzX2FkZHIsIGhhcyBwcmVkaWNhdGUgKi8KICAgLyogU2tpcCB2ZXJpZnkgb2Ygc2F2ZV9kdW1teV9mcmFtZV90b3MsIGhhcyBwcmVkaWNhdGUgKi8KLSAgaWYgKGdkYmFyY2gtPmZsb2F0X2Zvcm1hdCA9PSAwKQotICAgIGdkYmFyY2gtPmZsb2F0X2Zvcm1hdCA9IGRlZmF1bHRfZmxvYXRfZm9ybWF0IChnZGJhcmNoKTsKLSAgaWYgKGdkYmFyY2gtPmRvdWJsZV9mb3JtYXQgPT0gMCkKLSAgICBnZGJhcmNoLT5kb3VibGVfZm9ybWF0ID0gZGVmYXVsdF9kb3VibGVfZm9ybWF0IChnZGJhcmNoKTsKLSAgaWYgKGdkYmFyY2gtPmxvbmdfZG91YmxlX2Zvcm1hdCA9PSAwKQotICAgIGdkYmFyY2gtPmxvbmdfZG91YmxlX2Zvcm1hdCA9ICZmbG9hdGZvcm1hdF91bmtub3duOwogfQogCiAKQEAgLTExOTgsMjEgKzExODUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBjdXJyZW50X2dkYmFyY2gtPnNhdmVfZHVtbXlfZnJhbWVfdG9zCiAgICAgICAgICAgICAgICAgICAgICAgLypTQVZFX0RVTU1ZX0ZSQU1FX1RPUyAoKSovKTsKICNlbmRpZgotI2lmZGVmIFRBUkdFVF9GTE9BVF9GT1JNQVQKLSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAotICAgICAgICAgICAgICAgICAgICAgICJnZGJhcmNoX3VwZGF0ZTogVEFSR0VUX0ZMT0FUX0ZPUk1BVCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAobG9uZykgVEFSR0VUX0ZMT0FUX0ZPUk1BVCk7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHRVRfRE9VQkxFX0ZPUk1BVAotICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCi0gICAgICAgICAgICAgICAgICAgICAgImdkYmFyY2hfdXBkYXRlOiBUQVJHRVRfRE9VQkxFX0ZPUk1BVCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAobG9uZykgVEFSR0VUX0RPVUJMRV9GT1JNQVQpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVAotICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCi0gICAgICAgICAgICAgICAgICAgICAgImdkYmFyY2hfdXBkYXRlOiBUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUID0gJWxkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUKTsKLSNlbmRpZgogICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCiAgICAgICAgICAgICAgICAgICAgICAgImdkYmFyY2hfdXBkYXRlOiBHREJfTVVMVElfQVJDSCA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIEdEQl9NVUxUSV9BUkNIKTsKQEAgLTIxMzQsNyArMjEwNiw3IEBACiB9CiAKIENPUkVfQUREUgotZ2RiYXJjaF9wb2ludGVyX3RvX2FkZHJlc3MgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmKQorZ2RiYXJjaF9wb2ludGVyX3RvX2FkZHJlc3MgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqYnVmKQogewogICBpZiAoZ2RiYXJjaC0+cG9pbnRlcl90b19hZGRyZXNzID09IDApCiAgICAgaW50ZXJuYWxfZXJyb3IgKCJnZGJhcmNoOiBnZGJhcmNoX3BvaW50ZXJfdG9fYWRkcmVzcyBpbnZhbGlkIik7CkBAIC0yMTUxLDcgKzIxMjMsNyBAQAogfQogCiB2b2lkCi1nZGJhcmNoX2FkZHJlc3NfdG9fcG9pbnRlciAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIHN0cnVjdCB0eXBlICp0eXBlLCB2b2lkICpidWYsIENPUkVfQUREUiBhZGRyKQorZ2RiYXJjaF9hZGRyZXNzX3RvX3BvaW50ZXIgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqYnVmLCBDT1JFX0FERFIgYWRkcikKIHsKICAgaWYgKGdkYmFyY2gtPmFkZHJlc3NfdG9fcG9pbnRlciA9PSAwKQogICAgIGludGVybmFsX2Vycm9yICgiZ2RiYXJjaDogZ2RiYXJjaF9hZGRyZXNzX3RvX3BvaW50ZXIgaW52YWxpZCIpOwpAQCAtMjg0OCw1MSArMjgyMCw2IEBACiAgIGdkYmFyY2gtPnNhdmVfZHVtbXlfZnJhbWVfdG9zID0gc2F2ZV9kdW1teV9mcmFtZV90b3M7CiB9CiAKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqCi1nZGJhcmNoX2Zsb2F0X2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpCi17Ci0gIGlmIChnZGJhcmNoX2RlYnVnID49IDIpCi0gICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAiZ2RiYXJjaF9mbG9hdF9mb3JtYXQgY2FsbGVkXG4iKTsKLSAgcmV0dXJuIGdkYmFyY2gtPmZsb2F0X2Zvcm1hdDsKLX0KLQotdm9pZAotc2V0X2dkYmFyY2hfZmxvYXRfZm9ybWF0IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZmxvYXRfZm9ybWF0KQotewotICBnZGJhcmNoLT5mbG9hdF9mb3JtYXQgPSBmbG9hdF9mb3JtYXQ7Ci19Ci0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqCi1nZGJhcmNoX2RvdWJsZV9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKQotewotICBpZiAoZ2RiYXJjaF9kZWJ1ZyA+PSAyKQotICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgImdkYmFyY2hfZG91YmxlX2Zvcm1hdCBjYWxsZWRcbiIpOwotICByZXR1cm4gZ2RiYXJjaC0+ZG91YmxlX2Zvcm1hdDsKLX0KLQotdm9pZAotc2V0X2dkYmFyY2hfZG91YmxlX2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiBkb3VibGVfZm9ybWF0KQotewotICBnZGJhcmNoLT5kb3VibGVfZm9ybWF0ID0gZG91YmxlX2Zvcm1hdDsKLX0KLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICoKLWdkYmFyY2hfbG9uZ19kb3VibGVfZm9ybWF0IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCkKLXsKLSAgaWYgKGdkYmFyY2hfZGVidWcgPj0gMikKLSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJnZGJhcmNoX2xvbmdfZG91YmxlX2Zvcm1hdCBjYWxsZWRcbiIpOwotICByZXR1cm4gZ2RiYXJjaC0+bG9uZ19kb3VibGVfZm9ybWF0OwotfQotCi12b2lkCi1zZXRfZ2RiYXJjaF9sb25nX2RvdWJsZV9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiBsb25nX2RvdWJsZV9mb3JtYXQpCi17Ci0gIGdkYmFyY2gtPmxvbmdfZG91YmxlX2Zvcm1hdCA9IGxvbmdfZG91YmxlX2Zvcm1hdDsKLX0KLQogCiAvKiBLZWVwIGEgcmVnaXN0cmFyeSBvZiBwZXItYXJjaGl0ZWN0dXJlIGRhdGEtcG9pbnRlcnMgcmVxdWlyZWQgYnkgR0RCCiAgICBtb2R1bGVzLiAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYmFyY2guaCBiL2dkYi9nZGJhcmNoLmgKaW5kZXggMTg3NTc3NC4uNzEyMWEyMiAxMDA2NDQKLS0tIGEvZ2RiL2dkYmFyY2guaAorKysgYi9nZGIvZ2RiYXJjaC5oCkBAIC01OTIsMTEgKzU5MiwxMSBAQAogCiAvKiBEZWZhdWx0IChmdW5jdGlvbikgZm9yIG5vbi0gbXVsdGktYXJjaCBwbGF0Zm9ybXMuICovCiAjaWYgKEdEQl9NVUxUSV9BUkNIID09IDApICYmICFkZWZpbmVkIChQT0lOVEVSX1RPX0FERFJFU1MpCi0jZGVmaW5lIFBPSU5URVJfVE9fQUREUkVTUyh0eXBlLCBidWYpICh1bnNpZ25lZF9wb2ludGVyX3RvX2FkZHJlc3MgKHR5cGUsIGJ1ZikpCisjZGVmaW5lIFBPSU5URVJfVE9fQUREUkVTUyh0eXBlLCBidWYpIChnZW5lcmljX3BvaW50ZXJfdG9fYWRkcmVzcyAodHlwZSwgYnVmKSkKICNlbmRpZgogCi10eXBlZGVmIENPUkVfQUREUiAoZ2RiYXJjaF9wb2ludGVyX3RvX2FkZHJlc3NfZnR5cGUpIChzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmKTsKLWV4dGVybiBDT1JFX0FERFIgZ2RiYXJjaF9wb2ludGVyX3RvX2FkZHJlc3MgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmKTsKK3R5cGVkZWYgQ09SRV9BRERSIChnZGJhcmNoX3BvaW50ZXJfdG9fYWRkcmVzc19mdHlwZSkgKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICpidWYpOworZXh0ZXJuIENPUkVfQUREUiBnZGJhcmNoX3BvaW50ZXJfdG9fYWRkcmVzcyAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICpidWYpOwogZXh0ZXJuIHZvaWQgc2V0X2dkYmFyY2hfcG9pbnRlcl90b19hZGRyZXNzIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgZ2RiYXJjaF9wb2ludGVyX3RvX2FkZHJlc3NfZnR5cGUgKnBvaW50ZXJfdG9fYWRkcmVzcyk7CiAjaWYgR0RCX01VTFRJX0FSQ0gKICNpZiAoR0RCX01VTFRJX0FSQ0ggPiAxKSB8fCAhZGVmaW5lZCAoUE9JTlRFUl9UT19BRERSRVNTKQpAQCAtNjA2LDExICs2MDYsMTEgQEAKIAogLyogRGVmYXVsdCAoZnVuY3Rpb24pIGZvciBub24tIG11bHRpLWFyY2ggcGxhdGZvcm1zLiAqLwogI2lmIChHREJfTVVMVElfQVJDSCA9PSAwKSAmJiAhZGVmaW5lZCAoQUREUkVTU19UT19QT0lOVEVSKQotI2RlZmluZSBBRERSRVNTX1RPX1BPSU5URVIodHlwZSwgYnVmLCBhZGRyKSAodW5zaWduZWRfYWRkcmVzc190b19wb2ludGVyICh0eXBlLCBidWYsIGFkZHIpKQorI2RlZmluZSBBRERSRVNTX1RPX1BPSU5URVIodHlwZSwgYnVmLCBhZGRyKSAoZ2VuZXJpY19hZGRyZXNzX3RvX3BvaW50ZXIgKHR5cGUsIGJ1ZiwgYWRkcikpCiAjZW5kaWYKIAotdHlwZWRlZiB2b2lkIChnZGJhcmNoX2FkZHJlc3NfdG9fcG9pbnRlcl9mdHlwZSkgKHN0cnVjdCB0eXBlICp0eXBlLCB2b2lkICpidWYsIENPUkVfQUREUiBhZGRyKTsKLWV4dGVybiB2b2lkIGdkYmFyY2hfYWRkcmVzc190b19wb2ludGVyIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgc3RydWN0IHR5cGUgKnR5cGUsIHZvaWQgKmJ1ZiwgQ09SRV9BRERSIGFkZHIpOwordHlwZWRlZiB2b2lkIChnZGJhcmNoX2FkZHJlc3NfdG9fcG9pbnRlcl9mdHlwZSkgKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICpidWYsIENPUkVfQUREUiBhZGRyKTsKK2V4dGVybiB2b2lkIGdkYmFyY2hfYWRkcmVzc190b19wb2ludGVyIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKmJ1ZiwgQ09SRV9BRERSIGFkZHIpOwogZXh0ZXJuIHZvaWQgc2V0X2dkYmFyY2hfYWRkcmVzc190b19wb2ludGVyIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgZ2RiYXJjaF9hZGRyZXNzX3RvX3BvaW50ZXJfZnR5cGUgKmFkZHJlc3NfdG9fcG9pbnRlcik7CiAjaWYgR0RCX01VTFRJX0FSQ0gKICNpZiAoR0RCX01VTFRJX0FSQ0ggPiAxKSB8fCAhZGVmaW5lZCAoQUREUkVTU19UT19QT0lOVEVSKQpAQCAtMTA5MSw0NSArMTA5MSw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiBEZWZhdWx0ICh2YWx1ZSkgZm9yIG5vbi0gbXVsdGktYXJjaCBwbGF0Zm9ybXMuICovCi0jaWYgKEdEQl9NVUxUSV9BUkNIID09IDApICYmICFkZWZpbmVkIChUQVJHRVRfRkxPQVRfRk9STUFUKQotI2RlZmluZSBUQVJHRVRfRkxPQVRfRk9STUFUIChkZWZhdWx0X2Zsb2F0X2Zvcm1hdCAoY3VycmVudF9nZGJhcmNoKSkKLSNlbmRpZgotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZ2RiYXJjaF9mbG9hdF9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKTsKLWV4dGVybiB2b2lkIHNldF9nZGJhcmNoX2Zsb2F0X2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqIGZsb2F0X2Zvcm1hdCk7Ci0jaWYgR0RCX01VTFRJX0FSQ0gKLSNpZiAoR0RCX01VTFRJX0FSQ0ggPiAxKSB8fCAhZGVmaW5lZCAoVEFSR0VUX0ZMT0FUX0ZPUk1BVCkKLSNkZWZpbmUgVEFSR0VUX0ZMT0FUX0ZPUk1BVCAoZ2RiYXJjaF9mbG9hdF9mb3JtYXQgKGN1cnJlbnRfZ2RiYXJjaCkpCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBEZWZhdWx0ICh2YWx1ZSkgZm9yIG5vbi0gbXVsdGktYXJjaCBwbGF0Zm9ybXMuICovCi0jaWYgKEdEQl9NVUxUSV9BUkNIID09IDApICYmICFkZWZpbmVkIChUQVJHRVRfRE9VQkxFX0ZPUk1BVCkKLSNkZWZpbmUgVEFSR0VUX0RPVUJMRV9GT1JNQVQgKGRlZmF1bHRfZG91YmxlX2Zvcm1hdCAoY3VycmVudF9nZGJhcmNoKSkKLSNlbmRpZgotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZ2RiYXJjaF9kb3VibGVfZm9ybWF0IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCk7Ci1leHRlcm4gdm9pZCBzZXRfZ2RiYXJjaF9kb3VibGVfZm9ybWF0IChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZG91YmxlX2Zvcm1hdCk7Ci0jaWYgR0RCX01VTFRJX0FSQ0gKLSNpZiAoR0RCX01VTFRJX0FSQ0ggPiAxKSB8fCAhZGVmaW5lZCAoVEFSR0VUX0RPVUJMRV9GT1JNQVQpCi0jZGVmaW5lIFRBUkdFVF9ET1VCTEVfRk9STUFUIChnZGJhcmNoX2RvdWJsZV9mb3JtYXQgKGN1cnJlbnRfZ2RiYXJjaCkpCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBEZWZhdWx0ICh2YWx1ZSkgZm9yIG5vbi0gbXVsdGktYXJjaCBwbGF0Zm9ybXMuICovCi0jaWYgKEdEQl9NVUxUSV9BUkNIID09IDApICYmICFkZWZpbmVkIChUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUKQotI2RlZmluZSBUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUICgmZmxvYXRmb3JtYXRfdW5rbm93bikKLSNlbmRpZgotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICogZ2RiYXJjaF9sb25nX2RvdWJsZV9mb3JtYXQgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKTsKLWV4dGVybiB2b2lkIHNldF9nZGJhcmNoX2xvbmdfZG91YmxlX2Zvcm1hdCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqIGxvbmdfZG91YmxlX2Zvcm1hdCk7Ci0jaWYgR0RCX01VTFRJX0FSQ0gKLSNpZiAoR0RCX01VTFRJX0FSQ0ggPiAxKSB8fCAhZGVmaW5lZCAoVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVCkKLSNkZWZpbmUgVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVCAoZ2RiYXJjaF9sb25nX2RvdWJsZV9mb3JtYXQgKGN1cnJlbnRfZ2RiYXJjaCkpCi0jZW5kaWYKLSNlbmRpZgotCiBleHRlcm4gc3RydWN0IGdkYmFyY2hfdGRlcCAqZ2RiYXJjaF90ZGVwIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCk7CiAKIApkaWZmIC0tZ2l0IGEvZ2RiL2dkYmFyY2guc2ggYi9nZGIvZ2RiYXJjaC5zaAppbmRleCBiZjdiNDdjLi5jYmM3Y2YzIDEwMDc1NQotLS0gYS9nZGIvZ2RiYXJjaC5zaAorKysgYi9nZGIvZ2RiYXJjaC5zaApAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9sb2NhbC9iaW4vYmFzaCAtdQorIyEvdXNyL2xvY2FsL2Jpbi9iYXNoCiAKICMgQXJjaGl0ZWN0dXJlIGNvbW1hbmRzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCiAjIENvcHlyaWdodCAxOTk4LTIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0zNCw2MiArMzQsMTUgQEAKIH0KIAogCisjIERFRkFVTFQgaXMgYSB2YWxpZCBmYWxsYmFjayBkZWZpbml0aW9uIG9mIGEgTUFDUk8gd2hlbgorIyBtdWx0aS1hcmNoIGlzIG5vdCBlbmFibGVkLgorZGVmYXVsdF9pc19mYWxsYmFja19wICgpCit7CisgICAgWyAiJHtkZWZhdWx0fSIgIT0gIiIgLWEgIiR7aW52YWxpZF9wfSIgPSAiMCIgXQorfQorCiAjIEZvcm1hdCBvZiB0aGUgaW5wdXQgdGFibGUKLXJlYWQ9ImNsYXNzIGxldmVsIG1hY3JvIHJldHVybnR5cGUgZnVuY3Rpb24gZm9ybWFsIGFjdHVhbCBhdHRyaWIgc3RhdGljZGVmYXVsdCBwcmVkZWZhdWx0IHBvc3RkZWZhdWx0IGludmFsaWRfcCBmbXQgcHJpbnQgcHJpbnRfcCBkZXNjcmlwdGlvbiIKLQotZG9fcmVhZCAoKQotewotICAgIGlmIGV2YWwgcmVhZCAkcmVhZAotICAgIHRoZW4KLQl0ZXN0ICIke3N0YXRpY2RlZmF1bHR9IiB8fCBzdGF0aWNkZWZhdWx0PTAKLQkjIE5PVCBZRVQ6IEJyZWFrcyBCRUxJRVZFX1BDQ19QUk9NT1RJT04gYW5kIGNvbmZ1c2VzIG5vbi0KLQkjIG11bHRpLWFyY2ggZGVmYXVsdHMuCi0JIyB0ZXN0ICIke3ByZWRlZmF1bHR9IiB8fCBwcmVkZWZhdWx0PTAKLQl0ZXN0ICIke2ZtdH0iIHx8IGZtdD0iJWxkIgotCXRlc3QgIiR7cHJpbnR9IiB8fCBwcmludD0iKGxvbmcpICR7bWFjcm99IgotCWNhc2UgIiR7aW52YWxpZF9wfSIgaW4KLQkgICAgMCApIHZhbGlkX3A9MSA7OwotCSAgICAiIiApCi0JCWlmIFsgIiR7cHJlZGVmYXVsdH0iIF0KLQkJdGhlbgotCQkgICAgI2ludmFsaWRfcD0iZ2RiYXJjaC0+JHtmdW5jdGlvbn0gPT0gJHtwcmVkZWZhdWx0fSIKLQkJICAgIHZhbGlkX3A9ImdkYmFyY2gtPiR7ZnVuY3Rpb259ICE9ICR7cHJlZGVmYXVsdH0iCi0JCWVsc2UKLQkJICAgICNpbnZhbGlkX3A9ImdkYmFyY2gtPiR7ZnVuY3Rpb259ID09IDAiCi0JCSAgICB2YWxpZF9wPSJnZGJhcmNoLT4ke2Z1bmN0aW9ufSAhPSAwIgotCQlmaQotCQk7OwotCSAgICAqICkgdmFsaWRfcD0iISgke2ludmFsaWRfcH0pIgotCWVzYWMKLQotCSMgUFJFREVGQVVMVCBpcyBhIHZhbGlkIGZhbGxiYWNrIGRlZmluaXRpb24gb2YgTUVNQkVSIHdoZW4KLQkjIG11bHRpLWFyY2ggaXMgbm90IGVuYWJsZWQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZGVmYXVsdAotCSMgdmFsdWUsIHdoZW4gbXVsdGktYXJjaCBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuCi0JIyBub3QgbXVsdGktYXJjaC4gIFBPU1RERUZBVUxUIGlzIGFsd2F5cyBhIHZhbGlkIGRlZmluaXRpb24gb2YKLQkjIE1FTUJFUiBhcyB0aGlzIGFnYWluIGVuc3VyZXMgY29uc2lzdGVuY3kuCi0JaWYgWyAiJHtwb3N0ZGVmYXVsdH0iICE9ICIiIF0KLQl0aGVuCi0JICAgIGZhbGxiYWNrZGVmYXVsdD0iJHtwb3N0ZGVmYXVsdH0iCi0JZWxpZiBbICIke3ByZWRlZmF1bHR9IiAhPSAiIiBdCi0JdGhlbgotCSAgICBmYWxsYmFja2RlZmF1bHQ9IiR7cHJlZGVmYXVsdH0iCi0JZWxzZQotCSAgICBmYWxsYmFja2RlZmF1bHQ9IiIKLQlmaQotCSNOT1QgWUVUOgotCSMgU2VlIGdkYmFyY2gubG9nIGZvciBiYXNpYyB2ZXJpZmljYXRpb24gb2YgZGF0YWJhc2UKLQk6Ci0gICAgZWxzZQotCWZhbHNlCi0gICAgZmkKLX0KLQotCi1mYWxsYmFja19kZWZhdWx0X3AgKCkKLXsKLSAgICBbICIke3Bvc3RkZWZhdWx0fSIgIT0gIiIgLWEgIiR7aW52YWxpZF9wfSIgIT0gIjAiIF0gXAotCXx8IFsgIiR7cHJlZGVmYXVsdH0iICE9ICIiIC1hICIke2ludmFsaWRfcH0iID0gIjAiIF0KLX0KK3JlYWQ9ImNsYXNzIGxldmVsIG1hY3JvIHJldHVybnR5cGUgZnVuY3Rpb24gZm9ybWFsIGFjdHVhbCBhdHRyaWIgc3RhcnR1cCBkZWZhdWx0IGludmFsaWRfcCBmbXQgcHJpbnQgcHJpbnRfcCBkZXNjcmlwdGlvbiIKIAogY2xhc3NfaXNfdmFyaWFibGVfcCAoKQogewpAQCAtMTEyLDYgKzY1LDMzIEBACiB9CiAKIAorZG9fcmVhZCAoKQoreworICAgIGlmIGV2YWwgcmVhZCAkcmVhZAorICAgIHRoZW4KKwl0ZXN0ICIke3N0YXJ0dXB9IiB8fCBzdGFydHVwPTAKKwl0ZXN0ICIke2ZtdH0iIHx8IGZtdD0iJWxkIgorCXRlc3QgIiR7cHJpbnR9IiB8fCBwcmludD0iKGxvbmcpICR7bWFjcm99IgorCSNGSVhNRToKKwkjU2hvdWxkIHNldCBERUZBVUxUIHRvIHplcm8gYW5kIGZvcmNlIHRoZSB1c2VyIHRvIHByb3ZpZGUKKwkjYW4gaW52YWxpZF9wPTAKKwkjdGVzdCAiJHtkZWZhdWx0fSIgfHwgZGVmYXVsdD0wIC0gTk8KKwljYXNlICIke2ludmFsaWRfcH0iIGluCisJICAgIDAgKSB2YWxpZF9wPTEgOzsKKwkgICAgIiIgKSB0ZXN0ICIke2RlZmF1bHR9IiAmJiB2YWxpZF9wPSJnZGJhcmNoLT4ke2Z1bmN0aW9ufSAhPSAke2RlZmF1bHR9IgorCQkjTk9UX1lFVAorCQkjdGVzdCAiJHtkZWZhdWx0fSIgJiYgaW52YWxpZF9wPSJnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9PSAke2RlZmF1bHR9IgorCQk7OworCSAgICAqICkgdmFsaWRfcD0iISgke2ludmFsaWRfcH0pIgorCWVzYWMKKwkjTk9UIFlFVDoKKwk6CisgICAgZWxzZQorCWZhbHNlCisgICAgZmkKK30KKworCiAjIGR1bXAgb3V0L3ZlcmlmeSB0aGUgZG9jbwogZm9yIGZpZWxkIGluICR7cmVhZH0KIGRvCkBAIC0xNjksNjYgKzE0OSwzMiBAQAogCSMgQW55IEdDQyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSBmdW5jdGlvbgogCSMgZGVjbGFyYXRpb24uICBBdCBwcmVzZW50IHRoaXMgZmllbGQgaXMgdW51c2VkLgogCi0gICAgc3RhdGljZGVmYXVsdCApIDogOzsKKyAgICBzdGFydHVwICkgOiA7OwogCiAJIyBUbyBoZWxwIHdpdGggdGhlIEdEQiBzdGFydHVwIGEgc3RhdGljIGdkYmFyY2ggb2JqZWN0IGlzCi0JIyBjcmVhdGVkLiAgU1RBVElDREVGQVVMVCBpcyB0aGUgdmFsdWUgdG8gaW5zZXJ0IGludG8gdGhhdAotCSMgc3RhdGljIGdkYmFyY2ggb2JqZWN0LiAgU2luY2UgdGhpcyBhIHN0YXRpYyBvYmplY3Qgb25seQotCSMgc2ltcGxlIGV4cHJlc3Npb25zIGNhbiBiZSB1c2VkLgorCSMgY3JlYXRlZC4gIFNUQVJUVVAgaXMgdGhlIHZhbHVlIHRvIGluc2VydCBpbnRvIHRoYXQgc3RhdGljCisJIyBnZGJhcmNoIG9iamVjdC4KIAotCSMgSWYgU1RBVElDREVGQVVMVCBpcyBlbXB0eSwgemVybyBpcyB1c2VkLgorCSMgQnkgZGVmYXVsdCBgYDAnJyBpcyB1c2VkLgogCi0gICAgcHJlZGVmYXVsdCApIDogOzsKKyAgICBkZWZhdWx0ICkgOiA7OwogCi0JIyBBIGluaXRpYWwgdmFsdWUgdG8gYXNzaWduIHRvIE1FTUJFUiBvZiB0aGUgZnJlc2hseQotCSMgbWFsbG9jKCllZCBnZGJhcmNoIG9iamVjdC4gIEFmdGVyIHRoZSBnZGJhcmNoIG9iamVjdCBoYXMKLQkjIGJlZW4gaW5pdGlhbGl6ZWQgdXNpbmcgUFJFREVGQVVMVCwgaXQgaXMgcGFzc2VkIHRvIHRoZQotCSMgdGFyZ2V0IGNvZGUgZm9yIGZ1cnRoZXIgdXBkYXRlcy4KKwkjIEFueSBpbml0aWFsIHZhbHVlIHRvIGFzc2lnbiB0byBhIG5ldyBnZGJhcmNoIG9iamVjdCBhZnRlciBpdAorCSMgYXMgYmVlbiBtYWxsb2MoKWVkLiAgWmVybyBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAKLQkjIElmIFBSRURFRkFVTFQgaXMgZW1wdHksIHplcm8gaXMgdXNlZC4KLQotCSMgV2hlbiBQT1NUREVGQVVMVCBpcyBlbXB0eSwgYSBub24tZW1wdHkgUFJFREVGQVVMVCBhbmQgYSB6ZXJvCi0JIyBJTlZBTElEX1Agd2lsbCBiZSB1c2VkIGFzIGRlZmF1bHQgdmFsdWVzIHdoZW4gd2hlbgotCSMgbXVsdGktYXJjaCBpcyBkaXNhYmxlZC4gIFNwZWNpZnkgYSB6ZXJvIFBSRURFRkFVTFQgZnVuY3Rpb24KLQkjIHRvIG1ha2UgdGhhdCBmYWxsYmFjayBjYWxsIGludGVybmFsX2Vycm9yKCkuCi0KLQkjIFZhcmlhYmxlIGRlY2xhcmF0aW9ucyBjYW4gcmVmZXIgdG8gYGBnZGJhcmNoJycgd2hpY2ggd2lsbAotCSMgY29udGFpbiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuICBDYXJlIHNob3VsZCBiZSB0YWtlbi4KLQotICAgIHBvc3RkZWZhdWx0ICkgOiA7OwotCi0JIyBBIHZhbHVlIHRvIGFzc2lnbiB0byBNRU1CRVIgb2YgdGhlIG5ldyBnZGJhcmNoIG9iamVjdCBzaG91bGQKLQkjIHRoZSB0YXJnZXQgY29kZSBmYWlsIHRvIGNoYW5nZSB0aGUgUFJFREVGQVVMVCB2YWx1ZS4gIEFsc28KLQkjIHVzZSBQT1NUREVGQVVMVCBhcyB0aGUgZmFsbGJhY2sgdmFsdWUgZm9yIHRoZSBub24tCi0JIyBtdWx0aS1hcmNoIGNhc2UuCi0KLQkjIElmIFBPU1RERUZBVUxUIGlzIGVtcHR5LCBubyBwb3N0IHVwZGF0ZSBpcyBwZXJmb3JtZWQuCi0KLQkjIElmIGJvdGggSU5WQUxJRF9QIGFuZCBQT1NUREVGQVVMVCBhcmUgbm9uLWVtcHR5IHRoZW4KLQkjIElOVkFMSURfUCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIE1FTUJFUiBzaG91bGQgYmUKLQkjIGNoYW5nZWQgdG8gUE9TVERFRkFVTFQuCi0KLQkjIFlvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIGEgemVybyBJTlZBTElEX1AgYW5kIGEgUE9TVERFRkFVTFQuCi0KLQkjIFZhcmlhYmxlIGRlY2xhcmF0aW9ucyBjYW4gcmVmZXIgdG8gYGBnZGJhcmNoJycgd2hpY2ggd2lsbAotCSMgY29udGFpbiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuICBDYXJlIHNob3VsZCBiZSB0YWtlbi4KKwkjIFNwZWNpZnkgYSBub24tZW1wdHkgREVGQVVMVCBhbmQgYSB6ZXJvIElOVkFMSURfUCB0byBjcmVhdGUgYQorCSMgZmFsbGJhY2sgdmFsdWUgb3IgZnVuY3Rpb24gZm9yIHdoZW4gbXVsdGktYXJjaCBpcyBkaXNhYmxlZC4KKwkjIFNwZWNpZnkgYSB6ZXJvIERFRkFVTFQgZnVuY3Rpb24gdG8gbWFrZSB0aGF0IGZhbGxiYWNrCisJIyBpbGxlZ2FsIHRvIGNhbGwuCiAKICAgICBpbnZhbGlkX3AgKSA6IDs7CiAKLQkjIEEgcHJlZGljYXRlIGVxdWF0aW9uIHRoYXQgdmFsaWRhdGVzIE1FTUJFUi4gIE5vbi16ZXJvIGlzCisJIyBBIHByZWRpY2F0ZSBlcXVhdGlvbiB0aGF0IHZhbGlkYXRlcyBNRU1CRVIuIE5vbi16ZXJvIGlzCiAJIyByZXR1cm5lZCBpZiB0aGUgY29kZSBjcmVhdGluZyB0aGUgbmV3IGFyY2hpdGVjdHVyZSBmYWlsZWQgdG8KLQkjIGluaXRpYWxpemUgTUVNQkVSIG9yIHRoZSBpbml0aWFsaXplZCB0aGUgbWVtYmVyIGlzIGludmFsaWQuCi0JIyBJZiBQT1NUREVGQVVMVCBpcyBub24tZW1wdHkgdGhlbiBNRU1CRVIgd2lsbCBiZSB1cGRhdGVkIHRvCi0JIyB0aGF0IHZhbHVlLiAgSWYgUE9TVERFRkFVTFQgaXMgZW1wdHkgdGhlbiBpbnRlcm5hbF9lcnJvcigpCi0JIyBpcyBjYWxsZWQuCi0KLQkjIElmIElOVkFMSURfUCBpcyBlbXB0eSwgYSBjaGVjayB0aGF0IE1FTUJFUiBpcyBubyBsb25nZXIKLQkjIGVxdWFsIHRvIFBSRURFRkFVTFQgaXMgdXNlZC4KLQotCSMgVGhlIGV4cHJlc3Npb24gYGAwJycgZGlzYWJsZXMgdGhlIElOVkFMSURfUCBjaGVjayBtYWtpbmcKLQkjIFBSRURFRkFVTFQgYSBsZWdpdGltYXRlIHZhbHVlLgotCi0JIyBTZWUgYWxzbyBQUkVERUZBVUxUIGFuZCBQT1NUREVGQVVMVC4KKwkjIGluaXRpYWxpemUgdGhlIE1FTUJFUiBvciBpbml0aWFsaXplZCB0aGUgbWVtYmVyIHRvIHNvbWV0aGluZworCSMgaW52YWxpZC4gQnkgZGVmYXVsdCwgYSBjaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyBubyBsb25nZXIKKwkjIGVxdWFsIHRvIERFRkFVTFQgaXMgcGVyZm9ybWVkLiAgVGhlIGVxdWF0aW9uIGBgMCcnIGRpc2FibGVzCisJIyB0aGUgaW52YWxpZF9wIGNoZWNrLgogCiAgICAgZm10ICkgOiA7OwogCkBAIC0yMzYsMTQgKzE4MiwxNCBAQAogCSMgTUVNQkVSLiAgU29tZXRpbWVzICIlcyIgaXMgdXNlZnVsLiAgRm9yIGZ1bmN0aW9ucywgdGhpcyBpcwogCSMgaWdub3JlZCBhbmQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgaXMgcHJpbnRlZC4KIAotCSMgSWYgRk1UIGlzIGVtcHR5LCBgYCVsZCcnIGlzIHVzZWQuICAKKwkjIEJ5IGRlZmF1bHQgYGBgJWxkJycgaXMgdXNlZC4gIAogCiAgICAgcHJpbnQgKSA6IDs7CiAKIAkjIEFuIG9wdGlvbmFsIGVxdWF0aW9uIHRoYXQgY2FzdHMgTUVNQkVSIHRvIGEgdmFsdWUgc3VpdGFibGUKIAkjIGZvciBmb3JtYXR0aW5nIGJ5IEZNVC4KIAotCSMgSWYgUFJJTlQgaXMgZW1wdHksIGBgKGxvbmcpJycgaXMgdXNlZC4KKwkjIEJ5IGRlZmF1bHQgYGAobG9uZyknJyBpcyB1c2VkLgogCiAgICAgcHJpbnRfcCApIDogOzsKIApAQCAtMjUzLDExICsxOTksOSBAQAogCSMgICBleHAgLT4gV3JhcCBwcmludCB1cCBpbiBgYGlmICgke3ByaW50X3B9KSAuLi4KIAkjICAgYGAnJyAtPiBObyBwcmVkaWNhdGUKIAotCSMgSWYgUFJJTlRfUCBpcyBlbXB0eSwgYGAxJycgaXMgYWx3YXlzIHVzZWQuCi0KICAgICBkZXNjcmlwdGlvbiApIDogOzsKIAotCSMgQ3VycmVudGx5IHVudXNlZC4KKyAgICAgICMgQ3VycmVudGx5IHVudXNlZC4KIAogICAgICopIGV4aXQgMTs7CiAgIGVzYWMKQEAgLTI2OSwxMSArMjEzLDExIEBACiB7CiAgICMgU2VlIGJlbG93IChET0NPKSBmb3IgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZAogICBjYXQgPDxFT0YgfAotaToyOlRBUkdFVF9BUkNISVRFQ1RVUkU6Y29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKjpiZmRfYXJjaF9pbmZvOjo6OiZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDo6OjolczpUQVJHRVRfQVJDSElURUNUVVJFLT5wcmludGFibGVfbmFtZTpUQVJHRVRfQVJDSElURUNUVVJFICE9IE5VTEwKK2k6MjpUQVJHRVRfQVJDSElURUNUVVJFOmNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICo6YmZkX2FyY2hfaW5mbzo6OjomYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q6OjolczpUQVJHRVRfQVJDSElURUNUVVJFLT5wcmludGFibGVfbmFtZTpUQVJHRVRfQVJDSElURUNUVVJFICE9IE5VTEwKICMKIGk6MjpUQVJHRVRfQllURV9PUkRFUjppbnQ6Ynl0ZV9vcmRlcjo6OjpCSUdfRU5ESUFOCiAjCi12OjE6VEFSR0VUX0JGRF9WTUFfQklUOmludDpiZmRfdm1hX2JpdDo6Ojo4ICogc2l6ZW9mICh2b2lkKik6VEFSR0VUX0FSQ0hJVEVDVFVSRS0+Yml0c19wZXJfYWRkcmVzczo6MAordjoxOlRBUkdFVF9CRkRfVk1BX0JJVDppbnQ6YmZkX3ZtYV9iaXQ6Ojo6OCAqIHNpemVvZiAodm9pZCopOlRBUkdFVF9BUkNISVRFQ1RVUkUtPmJpdHNfcGVyX2FkZHJlc3M6MAogdjoxOlRBUkdFVF9QVFJfQklUOmludDpwdHJfYml0Ojo6OjggKiBzaXplb2YgKHZvaWQqKTowCiAjdjoxOlRBUkdFVF9DSEFSX0JJVDppbnQ6Y2hhcl9iaXQ6Ojo6OCAqIHNpemVvZiAoY2hhcik6MAogdjoxOlRBUkdFVF9TSE9SVF9CSVQ6aW50OnNob3J0X2JpdDo6Ojo4ICogc2l6ZW9mIChzaG9ydCk6MApAQCAtMjgzLDcgKzIyNyw3IEBACiB2OjE6VEFSR0VUX0ZMT0FUX0JJVDppbnQ6ZmxvYXRfYml0Ojo6OjggKiBzaXplb2YgKGZsb2F0KTowCiB2OjE6VEFSR0VUX0RPVUJMRV9CSVQ6aW50OmRvdWJsZV9iaXQ6Ojo6OCAqIHNpemVvZiAoZG91YmxlKTowCiB2OjE6VEFSR0VUX0xPTkdfRE9VQkxFX0JJVDppbnQ6bG9uZ19kb3VibGVfYml0Ojo6OjggKiBzaXplb2YgKGxvbmcgZG91YmxlKTowCi12OjE6SUVFRV9GTE9BVDppbnQ6aWVlZV9mbG9hdDo6OjowOjA6OjA6OjoKK3Y6MTpJRUVFX0ZMT0FUOmludDppZWVlX2Zsb2F0Ojo6OjA6MDowOjo6CiAjCiBmOjE6VEFSR0VUX1JFQURfUEM6Q09SRV9BRERSOnJlYWRfcGM6aW50IHBpZDpwaWQ6OjA6MAogZjoxOlRBUkdFVF9XUklURV9QQzp2b2lkOndyaXRlX3BjOkNPUkVfQUREUiB2YWwsIGludCBwaWQ6dmFsLCBwaWQ6OjA6MApAQCAtMjk2LDEwICsyNDAsMTAgQEAKIHY6MjpTUF9SRUdOVU06aW50OnNwX3JlZ251bTo6OjowOi0xCiB2OjI6RlBfUkVHTlVNOmludDpmcF9yZWdudW06Ojo6MDotMQogdjoyOlBDX1JFR05VTTppbnQ6cGNfcmVnbnVtOjo6OjA6LTEKLXY6MjpGUDBfUkVHTlVNOmludDpmcDBfcmVnbnVtOjo6OjA6LTE6OjAKLXY6MjpOUENfUkVHTlVNOmludDpucGNfcmVnbnVtOjo6OjA6LTE6OjAKLXY6MjpOTlBDX1JFR05VTTppbnQ6bm5wY19yZWdudW06Ojo6MDotMTo6MAotZjoyOlJFR0lTVEVSX05BTUU6Y2hhciAqOnJlZ2lzdGVyX25hbWU6aW50IHJlZ25yOnJlZ25yOjo6bGVnYWN5X3JlZ2lzdGVyX25hbWU6OjAKK3Y6MjpGUDBfUkVHTlVNOmludDpmcDBfcmVnbnVtOjo6OjA6LTE6MAordjoyOk5QQ19SRUdOVU06aW50Om5wY19yZWdudW06Ojo6MDotMTowCit2OjI6Tk5QQ19SRUdOVU06aW50Om5ucGNfcmVnbnVtOjo6OjA6LTE6MAorZjoyOlJFR0lTVEVSX05BTUU6Y2hhciAqOnJlZ2lzdGVyX25hbWU6aW50IHJlZ25yOnJlZ25yOjo6bGVnYWN5X3JlZ2lzdGVyX25hbWU6MAogdjoyOlJFR0lTVEVSX1NJWkU6aW50OnJlZ2lzdGVyX3NpemU6Ojo6MDotMQogdjoyOlJFR0lTVEVSX0JZVEVTOmludDpyZWdpc3Rlcl9ieXRlczo6OjowOi0xCiBmOjI6UkVHSVNURVJfQllURTppbnQ6cmVnaXN0ZXJfYnl0ZTppbnQgcmVnX25yOnJlZ19ucjo6MDowCkBAIC0zMTEsMzIgKzI1NSwzMiBAQAogIwogdjoxOlVTRV9HRU5FUklDX0RVTU1ZX0ZSQU1FUzppbnQ6dXNlX2dlbmVyaWNfZHVtbXlfZnJhbWVzOjo6OjA6LTEKIHY6MjpDQUxMX0RVTU1ZX0xPQ0FUSU9OOmludDpjYWxsX2R1bW15X2xvY2F0aW9uOjo6OjA6MAotZjoyOkNBTExfRFVNTVlfQUREUkVTUzpDT1JFX0FERFI6Y2FsbF9kdW1teV9hZGRyZXNzOnZvaWQ6OjowOjA6OmdkYmFyY2gtPmNhbGxfZHVtbXlfbG9jYXRpb24gPT0gQVRfRU5UUllfUE9JTlQgJiYgZ2RiYXJjaC0+Y2FsbF9kdW1teV9hZGRyZXNzID09IDAKLXY6MjpDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVDpDT1JFX0FERFI6Y2FsbF9kdW1teV9zdGFydF9vZmZzZXQ6Ojo6MDotMTo6OjB4JTA4bHgKLXY6MjpDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUOkNPUkVfQUREUjpjYWxsX2R1bW15X2JyZWFrcG9pbnRfb2Zmc2V0Ojo6OjA6LTE6OjoweCUwOGx4CitmOjI6Q0FMTF9EVU1NWV9BRERSRVNTOkNPUkVfQUREUjpjYWxsX2R1bW15X2FkZHJlc3M6dm9pZDo6OjA6MDpnZGJhcmNoLT5jYWxsX2R1bW15X2xvY2F0aW9uID09IEFUX0VOVFJZX1BPSU5UICYmIGdkYmFyY2gtPmNhbGxfZHVtbXlfYWRkcmVzcyA9PSAwOgordjoyOkNBTExfRFVNTVlfU1RBUlRfT0ZGU0VUOkNPUkVfQUREUjpjYWxsX2R1bW15X3N0YXJ0X29mZnNldDo6OjowOi0xOjoweCUwOGx4Cit2OjI6Q0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVDpDT1JFX0FERFI6Y2FsbF9kdW1teV9icmVha3BvaW50X29mZnNldDo6OjowOi0xOjoweCUwOGx4CiB2OjE6Q0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVF9QOmludDpjYWxsX2R1bW15X2JyZWFrcG9pbnRfb2Zmc2V0X3A6Ojo6MDotMQotdjoyOkNBTExfRFVNTVlfTEVOR1RIOmludDpjYWxsX2R1bW15X2xlbmd0aDo6OjowOi0xOjo6OjpDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEJFRk9SRV9URVhUX0VORCB8fCBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEFGVEVSX1RFWFRfRU5ECit2OjI6Q0FMTF9EVU1NWV9MRU5HVEg6aW50OmNhbGxfZHVtbXlfbGVuZ3RoOjo6OjA6LTE6Ojo6Q0FMTF9EVU1NWV9MT0NBVElPTiA9PSBCRUZPUkVfVEVYVF9FTkQgfHwgQ0FMTF9EVU1NWV9MT0NBVElPTiA9PSBBRlRFUl9URVhUX0VORAogZjoyOlBDX0lOX0NBTExfRFVNTVk6aW50OnBjX2luX2NhbGxfZHVtbXk6Q09SRV9BRERSIHBjLCBDT1JFX0FERFIgc3AsIENPUkVfQUREUiBmcmFtZV9hZGRyZXNzOnBjLCBzcCwgZnJhbWVfYWRkcmVzczo6MDowCiB2OjE6Q0FMTF9EVU1NWV9QOmludDpjYWxsX2R1bW15X3A6Ojo6MDotMQotdjoyOkNBTExfRFVNTVlfV09SRFM6TE9OR0VTVCAqOmNhbGxfZHVtbXlfd29yZHM6Ojo6MDpsZWdhY3lfY2FsbF9kdW1teV93b3Jkczo6MDoweCUwOGx4Ci12OjI6U0laRU9GX0NBTExfRFVNTVlfV09SRFM6aW50OnNpemVvZl9jYWxsX2R1bW15X3dvcmRzOjo6OjA6bGVnYWN5X3NpemVvZl9jYWxsX2R1bW15X3dvcmRzOjowOjB4JTA4bHgKLXY6MTpDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVF9QOmludDpjYWxsX2R1bW15X3N0YWNrX2FkanVzdF9wOjo6OjA6LTE6OjoweCUwOGx4Ci12OjI6Q0FMTF9EVU1NWV9TVEFDS19BREpVU1Q6aW50OmNhbGxfZHVtbXlfc3RhY2tfYWRqdXN0Ojo6OjA6OjpnZGJhcmNoLT5jYWxsX2R1bW15X3N0YWNrX2FkanVzdF9wICYmIGdkYmFyY2gtPmNhbGxfZHVtbXlfc3RhY2tfYWRqdXN0ID09IDA6MHglMDhseDo6Q0FMTF9EVU1NWV9TVEFDS19BREpVU1RfUAotZjoyOkZJWF9DQUxMX0RVTU1ZOnZvaWQ6Zml4X2NhbGxfZHVtbXk6Y2hhciAqZHVtbXksIENPUkVfQUREUiBwYywgQ09SRV9BRERSIGZ1biwgaW50IG5hcmdzLCBzdHJ1Y3QgdmFsdWUgKiphcmdzLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgaW50IGdjY19wOmR1bW15LCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3A6OjowCit2OjI6Q0FMTF9EVU1NWV9XT1JEUzpMT05HRVNUICo6Y2FsbF9kdW1teV93b3Jkczo6OjowOmxlZ2FjeV9jYWxsX2R1bW15X3dvcmRzOjA6MHglMDhseAordjoyOlNJWkVPRl9DQUxMX0RVTU1ZX1dPUkRTOmludDpzaXplb2ZfY2FsbF9kdW1teV93b3Jkczo6OjowOmxlZ2FjeV9zaXplb2ZfY2FsbF9kdW1teV93b3JkczowOjB4JTA4bHgKK3Y6MTpDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVF9QOmludDpjYWxsX2R1bW15X3N0YWNrX2FkanVzdF9wOjo6OjA6LTE6OjB4JTA4bHgKK3Y6MjpDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVDppbnQ6Y2FsbF9kdW1teV9zdGFja19hZGp1c3Q6Ojo6MDo6Z2RiYXJjaC0+Y2FsbF9kdW1teV9zdGFja19hZGp1c3RfcCAmJiBnZGJhcmNoLT5jYWxsX2R1bW15X3N0YWNrX2FkanVzdCA9PSAwOjB4JTA4bHg6OkNBTExfRFVNTVlfU1RBQ0tfQURKVVNUX1AKK2Y6MjpGSVhfQ0FMTF9EVU1NWTp2b2lkOmZpeF9jYWxsX2R1bW15OmNoYXIgKmR1bW15LCBDT1JFX0FERFIgcGMsIENPUkVfQUREUiBmdW4sIGludCBuYXJncywgc3RydWN0IHZhbHVlICoqYXJncywgc3RydWN0IHR5cGUgKnR5cGUsIGludCBnY2NfcDpkdW1teSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wOjowOjAKICMKLXY6MjpCRUxJRVZFX1BDQ19QUk9NT1RJT046aW50OmJlbGlldmVfcGNjX3Byb21vdGlvbjo6Ojo6OjoKLXY6MjpCRUxJRVZFX1BDQ19QUk9NT1RJT05fVFlQRTppbnQ6YmVsaWV2ZV9wY2NfcHJvbW90aW9uX3R5cGU6Ojo6Ojo6Ci1mOjI6Q09FUkNFX0ZMT0FUX1RPX0RPVUJMRTppbnQ6Y29lcmNlX2Zsb2F0X3RvX2RvdWJsZTpzdHJ1Y3QgdHlwZSAqZm9ybWFsLCBzdHJ1Y3QgdHlwZSAqYWN0dWFsOmZvcm1hbCwgYWN0dWFsOjo6ZGVmYXVsdF9jb2VyY2VfZmxvYXRfdG9fZG91YmxlOjowCit2OjI6QkVMSUVWRV9QQ0NfUFJPTU9USU9OOmludDpiZWxpZXZlX3BjY19wcm9tb3Rpb246Ojo6MDo6Ojo6Cit2OjI6QkVMSUVWRV9QQ0NfUFJPTU9USU9OX1RZUEU6aW50OmJlbGlldmVfcGNjX3Byb21vdGlvbl90eXBlOjo6OjA6Ojo6OgorZjoyOkNPRVJDRV9GTE9BVF9UT19ET1VCTEU6aW50OmNvZXJjZV9mbG9hdF90b19kb3VibGU6c3RydWN0IHR5cGUgKmZvcm1hbCwgc3RydWN0IHR5cGUgKmFjdHVhbDpmb3JtYWwsIGFjdHVhbDo6OmRlZmF1bHRfY29lcmNlX2Zsb2F0X3RvX2RvdWJsZTowCiBmOjE6R0VUX1NBVkVEX1JFR0lTVEVSOnZvaWQ6Z2V0X3NhdmVkX3JlZ2lzdGVyOmNoYXIgKnJhd19idWZmZXIsIGludCAqb3B0aW1pemVkLCBDT1JFX0FERFIgKmFkZHJwLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUsIGludCByZWdudW0sIGVudW0gbHZhbF90eXBlICpsdmFsOnJhd19idWZmZXIsIG9wdGltaXplZCwgYWRkcnAsIGZyYW1lLCByZWdudW0sIGx2YWw6OmdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyOjAKICMKLWY6MTpSRUdJU1RFUl9DT05WRVJUSUJMRTppbnQ6cmVnaXN0ZXJfY29udmVydGlibGU6aW50IG5yOm5yOjo6Z2VuZXJpY19yZWdpc3Rlcl9jb252ZXJ0aWJsZV9ub3Q6OjAKLWY6MjpSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUw6dm9pZDpyZWdpc3Rlcl9jb252ZXJ0X3RvX3ZpcnR1YWw6aW50IHJlZ251bSwgc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKmZyb20sIGNoYXIgKnRvOnJlZ251bSwgdHlwZSwgZnJvbSwgdG86OjowOjowCi1mOjI6UkVHSVNURVJfQ09OVkVSVF9UT19SQVc6dm9pZDpyZWdpc3Rlcl9jb252ZXJ0X3RvX3JhdzpzdHJ1Y3QgdHlwZSAqdHlwZSwgaW50IHJlZ251bSwgY2hhciAqZnJvbSwgY2hhciAqdG86dHlwZSwgcmVnbnVtLCBmcm9tLCB0bzo6OjA6OjAKK2Y6MTpSRUdJU1RFUl9DT05WRVJUSUJMRTppbnQ6cmVnaXN0ZXJfY29udmVydGlibGU6aW50IG5yOm5yOjo6Z2VuZXJpY19yZWdpc3Rlcl9jb252ZXJ0aWJsZV9ub3Q6MAorZjoyOlJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTDp2b2lkOnJlZ2lzdGVyX2NvbnZlcnRfdG9fdmlydHVhbDppbnQgcmVnbnVtLCBzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqZnJvbSwgY2hhciAqdG86cmVnbnVtLCB0eXBlLCBmcm9tLCB0bzo6OjA6MAorZjoyOlJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXOnZvaWQ6cmVnaXN0ZXJfY29udmVydF90b19yYXc6c3RydWN0IHR5cGUgKnR5cGUsIGludCByZWdudW0sIGNoYXIgKmZyb20sIGNoYXIgKnRvOnR5cGUsIHJlZ251bSwgZnJvbSwgdG86OjowOjAKICMKLWY6MjpQT0lOVEVSX1RPX0FERFJFU1M6Q09SRV9BRERSOnBvaW50ZXJfdG9fYWRkcmVzczpzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmOnR5cGUsIGJ1Zjo6OnVuc2lnbmVkX3BvaW50ZXJfdG9fYWRkcmVzczo6MAotZjoyOkFERFJFU1NfVE9fUE9JTlRFUjp2b2lkOmFkZHJlc3NfdG9fcG9pbnRlcjpzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmLCBDT1JFX0FERFIgYWRkcjp0eXBlLCBidWYsIGFkZHI6Ojp1bnNpZ25lZF9hZGRyZXNzX3RvX3BvaW50ZXI6OjAKK2Y6MjpQT0lOVEVSX1RPX0FERFJFU1M6Q09SRV9BRERSOnBvaW50ZXJfdG9fYWRkcmVzczpzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqYnVmOnR5cGUsIGJ1Zjo6OmdlbmVyaWNfcG9pbnRlcl90b19hZGRyZXNzOjAKK2Y6MjpBRERSRVNTX1RPX1BPSU5URVI6dm9pZDphZGRyZXNzX3RvX3BvaW50ZXI6c3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKmJ1ZiwgQ09SRV9BRERSIGFkZHI6dHlwZSwgYnVmLCBhZGRyOjo6Z2VuZXJpY19hZGRyZXNzX3RvX3BvaW50ZXI6MAogIwotZjoyOlJFVFVSTl9WQUxVRV9PTl9TVEFDSzppbnQ6cmV0dXJuX3ZhbHVlX29uX3N0YWNrOnN0cnVjdCB0eXBlICp0eXBlOnR5cGU6OjpnZW5lcmljX3JldHVybl92YWx1ZV9vbl9zdGFja19ub3Q6OjAKK2Y6MjpSRVRVUk5fVkFMVUVfT05fU1RBQ0s6aW50OnJldHVybl92YWx1ZV9vbl9zdGFjazpzdHJ1Y3QgdHlwZSAqdHlwZTp0eXBlOjo6Z2VuZXJpY19yZXR1cm5fdmFsdWVfb25fc3RhY2tfbm90OjAKIGY6MjpFWFRSQUNUX1JFVFVSTl9WQUxVRTp2b2lkOmV4dHJhY3RfcmV0dXJuX3ZhbHVlOnN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICpyZWdidWYsIGNoYXIgKnZhbGJ1Zjp0eXBlLCByZWdidWYsIHZhbGJ1Zjo6MDowCiBmOjE6UFVTSF9BUkdVTUVOVFM6Q09SRV9BRERSOnB1c2hfYXJndW1lbnRzOmludCBuYXJncywgc3RydWN0IHZhbHVlICoqYXJncywgQ09SRV9BRERSIHNwLCBpbnQgc3RydWN0X3JldHVybiwgQ09SRV9BRERSIHN0cnVjdF9hZGRyOm5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHI6OjA6MAogZjoyOlBVU0hfRFVNTVlfRlJBTUU6dm9pZDpwdXNoX2R1bW15X2ZyYW1lOnZvaWQ6LTo6OjAKQEAgLTM0NCwxMiArMjg4LDEyIEBACiBmOjI6UE9QX0ZSQU1FOnZvaWQ6cG9wX2ZyYW1lOnZvaWQ6LTo6OjAKICMKICMgSSB3aXNoIHRoYXQgdGhlc2Ugd291bGQganVzdCBnbyBhd2F5Li4uLgotZjoyOkQxMFZfTUFLRV9EQUREUjpDT1JFX0FERFI6ZDEwdl9tYWtlX2RhZGRyOkNPUkVfQUREUiB4Ong6OjowOjowCi1mOjI6RDEwVl9NQUtFX0lBRERSOkNPUkVfQUREUjpkMTB2X21ha2VfaWFkZHI6Q09SRV9BRERSIHg6eDo6OjA6OjAKLWY6MjpEMTBWX0RBRERSX1A6aW50OmQxMHZfZGFkZHJfcDpDT1JFX0FERFIgeDp4Ojo6MDo6MAotZjoyOkQxMFZfSUFERFJfUDppbnQ6ZDEwdl9pYWRkcl9wOkNPUkVfQUREUiB4Ong6OjowOjowCi1mOjI6RDEwVl9DT05WRVJUX0RBRERSX1RPX1JBVzpDT1JFX0FERFI6ZDEwdl9jb252ZXJ0X2RhZGRyX3RvX3JhdzpDT1JFX0FERFIgeDp4Ojo6MDo6MAotZjoyOkQxMFZfQ09OVkVSVF9JQUREUl9UT19SQVc6Q09SRV9BRERSOmQxMHZfY29udmVydF9pYWRkcl90b19yYXc6Q09SRV9BRERSIHg6eDo6OjA6OjAKK2Y6MjpEMTBWX01BS0VfREFERFI6Q09SRV9BRERSOmQxMHZfbWFrZV9kYWRkcjpDT1JFX0FERFIgeDp4Ojo6MDowCitmOjI6RDEwVl9NQUtFX0lBRERSOkNPUkVfQUREUjpkMTB2X21ha2VfaWFkZHI6Q09SRV9BRERSIHg6eDo6OjA6MAorZjoyOkQxMFZfREFERFJfUDppbnQ6ZDEwdl9kYWRkcl9wOkNPUkVfQUREUiB4Ong6OjowOjAKK2Y6MjpEMTBWX0lBRERSX1A6aW50OmQxMHZfaWFkZHJfcDpDT1JFX0FERFIgeDp4Ojo6MDowCitmOjI6RDEwVl9DT05WRVJUX0RBRERSX1RPX1JBVzpDT1JFX0FERFI6ZDEwdl9jb252ZXJ0X2RhZGRyX3RvX3JhdzpDT1JFX0FERFIgeDp4Ojo6MDowCitmOjI6RDEwVl9DT05WRVJUX0lBRERSX1RPX1JBVzpDT1JFX0FERFI6ZDEwdl9jb252ZXJ0X2lhZGRyX3RvX3JhdzpDT1JFX0FERFIgeDp4Ojo6MDowCiAjCiBmOjI6U1RPUkVfU1RSVUNUX1JFVFVSTjp2b2lkOnN0b3JlX3N0cnVjdF9yZXR1cm46Q09SRV9BRERSIGFkZHIsIENPUkVfQUREUiBzcDphZGRyLCBzcDo6OjAKIGY6MjpTVE9SRV9SRVRVUk5fVkFMVUU6dm9pZDpzdG9yZV9yZXR1cm5fdmFsdWU6c3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGJ1Zjp0eXBlLCB2YWxidWY6OjowCkBAIC0zNjAsMTggKzMwNCwxOCBAQAogZjoyOklOSVRfRVhUUkFfRlJBTUVfSU5GTzp2b2lkOmluaXRfZXh0cmFfZnJhbWVfaW5mbzppbnQgZnJvbWxlYWYsIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTpmcm9tbGVhZiwgZnJhbWU6OjowCiAjCiBmOjI6U0tJUF9QUk9MT0dVRTpDT1JFX0FERFI6c2tpcF9wcm9sb2d1ZTpDT1JFX0FERFIgaXA6aXA6OjA6MAotZjoyOlBST0xPR1VFX0ZSQU1FTEVTU19QOmludDpwcm9sb2d1ZV9mcmFtZWxlc3NfcDpDT1JFX0FERFIgaXA6aXA6OjA6Z2VuZXJpY19wcm9sb2d1ZV9mcmFtZWxlc3NfcDo6MAorZjoyOlBST0xPR1VFX0ZSQU1FTEVTU19QOmludDpwcm9sb2d1ZV9mcmFtZWxlc3NfcDpDT1JFX0FERFIgaXA6aXA6OjA6Z2VuZXJpY19wcm9sb2d1ZV9mcmFtZWxlc3NfcDowCiBmOjI6SU5ORVJfVEhBTjppbnQ6aW5uZXJfdGhhbjpDT1JFX0FERFIgbGhzLCBDT1JFX0FERFIgcmhzOmxocywgcmhzOjowOjAKLWY6MjpCUkVBS1BPSU5UX0ZST01fUEM6dW5zaWduZWQgY2hhciAqOmJyZWFrcG9pbnRfZnJvbV9wYzpDT1JFX0FERFIgKnBjcHRyLCBpbnQgKmxlbnB0cjpwY3B0ciwgbGVucHRyOjo6bGVnYWN5X2JyZWFrcG9pbnRfZnJvbV9wYzo6MAotZjoyOk1FTU9SWV9JTlNFUlRfQlJFQUtQT0lOVDppbnQ6bWVtb3J5X2luc2VydF9icmVha3BvaW50OkNPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZTphZGRyLCBjb250ZW50c19jYWNoZTo6MDpkZWZhdWx0X21lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDo6MAotZjoyOk1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVDppbnQ6bWVtb3J5X3JlbW92ZV9icmVha3BvaW50OkNPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZTphZGRyLCBjb250ZW50c19jYWNoZTo6MDpkZWZhdWx0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDo6MAorZjoyOkJSRUFLUE9JTlRfRlJPTV9QQzp1bnNpZ25lZCBjaGFyICo6YnJlYWtwb2ludF9mcm9tX3BjOkNPUkVfQUREUiAqcGNwdHIsIGludCAqbGVucHRyOnBjcHRyLCBsZW5wdHI6OjpsZWdhY3lfYnJlYWtwb2ludF9mcm9tX3BjOjAKK2Y6MjpNRU1PUllfSU5TRVJUX0JSRUFLUE9JTlQ6aW50Om1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDpDT1JFX0FERFIgYWRkciwgY2hhciAqY29udGVudHNfY2FjaGU6YWRkciwgY29udGVudHNfY2FjaGU6OjA6ZGVmYXVsdF9tZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ6MAorZjoyOk1FTU9SWV9SRU1PVkVfQlJFQUtQT0lOVDppbnQ6bWVtb3J5X3JlbW92ZV9icmVha3BvaW50OkNPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZTphZGRyLCBjb250ZW50c19jYWNoZTo6MDpkZWZhdWx0X21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDowCiB2OjI6REVDUl9QQ19BRlRFUl9CUkVBSzpDT1JFX0FERFI6ZGVjcl9wY19hZnRlcl9icmVhazo6OjowOi0xCiB2OjI6RlVOQ1RJT05fU1RBUlRfT0ZGU0VUOkNPUkVfQUREUjpmdW5jdGlvbl9zdGFydF9vZmZzZXQ6Ojo6MDotMQogIwotZjoyOlJFTU9URV9UUkFOU0xBVEVfWEZFUl9BRERSRVNTOnZvaWQ6cmVtb3RlX3RyYW5zbGF0ZV94ZmVyX2FkZHJlc3M6Q09SRV9BRERSIGdkYl9hZGRyLCBpbnQgZ2RiX2xlbiwgQ09SRV9BRERSICpyZW1fYWRkciwgaW50ICpyZW1fbGVuOmdkYl9hZGRyLCBnZGJfbGVuLCByZW1fYWRkciwgcmVtX2xlbjo6OmdlbmVyaWNfcmVtb3RlX3RyYW5zbGF0ZV94ZmVyX2FkZHJlc3M6OjAKK2Y6MjpSRU1PVEVfVFJBTlNMQVRFX1hGRVJfQUREUkVTUzp2b2lkOnJlbW90ZV90cmFuc2xhdGVfeGZlcl9hZGRyZXNzOkNPUkVfQUREUiBnZGJfYWRkciwgaW50IGdkYl9sZW4sIENPUkVfQUREUiAqcmVtX2FkZHIsIGludCAqcmVtX2xlbjpnZGJfYWRkciwgZ2RiX2xlbiwgcmVtX2FkZHIsIHJlbV9sZW46OjpnZW5lcmljX3JlbW90ZV90cmFuc2xhdGVfeGZlcl9hZGRyZXNzOjAKICMKIHY6MjpGUkFNRV9BUkdTX1NLSVA6Q09SRV9BRERSOmZyYW1lX2FyZ3Nfc2tpcDo6OjowOi0xCi1mOjI6RlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT046aW50OmZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uOnN0cnVjdCBmcmFtZV9pbmZvICpmaTpmaTo6OmdlbmVyaWNfZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb25fbm90OjowCitmOjI6RlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT046aW50OmZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uOnN0cnVjdCBmcmFtZV9pbmZvICpmaTpmaTo6OmdlbmVyaWNfZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb25fbm90OjAKIGY6MjpGUkFNRV9DSEFJTjpDT1JFX0FERFI6ZnJhbWVfY2hhaW46c3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOmZyYW1lOjowOjAKIGY6MTpGUkFNRV9DSEFJTl9WQUxJRDppbnQ6ZnJhbWVfY2hhaW5fdmFsaWQ6Q09SRV9BRERSIGNoYWluLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqdGhpc2ZyYW1lOmNoYWluLCB0aGlzZnJhbWU6OjA6MAogZjoyOkZSQU1FX1NBVkVEX1BDOkNPUkVfQUREUjpmcmFtZV9zYXZlZF9wYzpzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk6Zmk6OjA6MApAQCAtMzgzLDI4ICszMjcsMjMgQEAKIEY6MjpTVEFDS19BTElHTjpDT1JFX0FERFI6c3RhY2tfYWxpZ246Q09SRV9BRERSIHNwOnNwOjowOjAKIEY6MjpSRUdfU1RSVUNUX0hBU19BRERSOmludDpyZWdfc3RydWN0X2hhc19hZGRyOmludCBnY2NfcCwgc3RydWN0IHR5cGUgKnR5cGU6Z2NjX3AsIHR5cGU6OjA6MAogRjoyOlNBVkVfRFVNTVlfRlJBTUVfVE9TOnZvaWQ6c2F2ZV9kdW1teV9mcmFtZV90b3M6Q09SRV9BRERSIHNwOnNwOjowOjAKLSMKLXY6MjpUQVJHRVRfRkxPQVRfRk9STUFUOmNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqOmZsb2F0X2Zvcm1hdDo6Ojo6OmRlZmF1bHRfZmxvYXRfZm9ybWF0IChnZGJhcmNoKQotdjoyOlRBUkdFVF9ET1VCTEVfRk9STUFUOmNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqOmRvdWJsZV9mb3JtYXQ6Ojo6OjpkZWZhdWx0X2RvdWJsZV9mb3JtYXQgKGdkYmFyY2gpCi12OjI6VEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVDpjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKjpsb25nX2RvdWJsZV9mb3JtYXQ6Ojo6OjomZmxvYXRmb3JtYXRfdW5rbm93bgogRU9GCiAgIGdyZXAgLXYgJ14jJwogfQogCi0jCi0jIFRoZSAubG9nIGZpbGUKLSMKLWV4ZWMgPiBuZXctZ2RiYXJjaC5sb2cKLWZ1bmN0aW9uX2xpc3QgfCB3aGlsZSBkb19yZWFkICMgZXZhbCByZWFkICRyZWFkCi1kbwotICAgIGNhdCA8PEVPRgorCisjIGR1bXAgaXQgb3V0CitpZiB0cnVlCit0aGVuCisgICAgZXhlYyA+IG5ldy1nZGJhcmNoCisgICAgZnVuY3Rpb25fbGlzdCB8IHdoaWxlIGRvX3JlYWQgIyBldmFsIHJlYWQgJHJlYWQKKyAgICBkbworCWNhdCA8PEVPRgogJHtjbGFzc30gJHttYWNyb30oJHthY3R1YWx9KQogICAke3JldHVybnR5cGV9ICR7ZnVuY3Rpb259ICgkZm9ybWFsKSR7YXR0cmlifQogICAgIGxldmVsPSR7bGV2ZWx9Ci0gICAgc3RhdGljZGVmYXVsdD0ke3N0YXRpY2RlZmF1bHR9Ci0gICAgcHJlZGVmYXVsdD0ke3ByZWRlZmF1bHR9Ci0gICAgcG9zdGRlZmF1bHQ9JHtwb3N0ZGVmYXVsdH0KLSAgICBmYWxsYmFja2RlZmF1bHQ9JHtmYWxsYmFja2RlZmF1bHR9CisgICAgc3RhcnR1cD0ke3N0YXJ0dXB9CisgICAgZGVmYXVsdD0ke2RlZmF1bHR9CiAgICAgaW52YWxpZF9wPSR7aW52YWxpZF9wfQogICAgIHZhbGlkX3A9JHt2YWxpZF9wfQogICAgIGZtdD0ke2ZtdH0KQEAgLTQxMiwyMyArMzUxLDE1IEBACiAgICAgcHJpbnRfcD0ke3ByaW50X3B9CiAgICAgZGVzY3JpcHRpb249JHtkZXNjcmlwdGlvbn0KIEVPRgotICAgIGlmIGNsYXNzX2lzX3ByZWRpY2F0ZV9wICYmIGZhbGxiYWNrX2RlZmF1bHRfcAotICAgIHRoZW4KLQllY2hvICJFcnJvcjogcHJlZGljYXRlIGZ1bmN0aW9uIGNhbiBub3QgaGF2ZSBhIG5vbi0gbXVsdGktYXJjaCBkZWZhdWx0IiAxPiYyCi0Ja2lsbCAkJAotCWV4aXQgMQotICAgIGZpCi0gICAgaWYgWyAiJHtpbnZhbGlkX3B9IiA9ICIwIiAtYSAiJHtwb3N0ZGVmYXVsdH0iICE9ICIiIF0KLSAgICB0aGVuCi0JZWNobyAiRXJyb3I6IHBvc3RkZWZhdWx0IGlzIHVzZWxlc3Mgd2hlbiBpbnZhbGlkX3A9MCIgMT4mMgotCWtpbGwgJCQKLQlleGl0IDEKLSAgICBmaQotZG9uZQotCi1leGVjIDE+JjIKLWNvbXBhcmVfbmV3IGdkYmFyY2gubG9nCi0KKwlpZiBjbGFzc19pc19wcmVkaWNhdGVfcCAmJiBkZWZhdWx0X2lzX2ZhbGxiYWNrX3AKKwl0aGVuCisJICAgIGVjaG8gIkVycm9yOiBwcmVkaWNhdGUgZnVuY3Rpb24gY2FuIG5vdCBoYXZlIGEgbm9uLSBtdWx0aS1hcmNoIGRlZmF1bHQiIDE+JjIKKwkgICAga2lsbCAkJAorCSAgICBleGl0IDEKKwlmaQorICAgIGRvbmUKKyAgICBleGVjIDE+JjIKK2ZpCiAKIGNvcHlyaWdodCAoKQogewpAQCAtNTU3LDEzICs0ODgsMTIgQEAKICAgICBmaQogICAgIGlmIGNsYXNzX2lzX3ZhcmlhYmxlX3AKICAgICB0aGVuCi0JaWYgZmFsbGJhY2tfZGVmYXVsdF9wIHx8IGNsYXNzX2lzX3ByZWRpY2F0ZV9wCisJaWYgZGVmYXVsdF9pc19mYWxsYmFja19wIHx8IGNsYXNzX2lzX3ByZWRpY2F0ZV9wCiAJdGhlbgogCSAgICBlY2hvICIiCiAJICAgIGVjaG8gIi8qIERlZmF1bHQgKHZhbHVlKSBmb3Igbm9uLSBtdWx0aS1hcmNoIHBsYXRmb3Jtcy4gKi8iCiAJICAgIGVjaG8gIiNpZiAoR0RCX01VTFRJX0FSQ0ggPT0gMCkgJiYgIWRlZmluZWQgKCR7bWFjcm99KSIKLQkgICAgZWNobyAiI2RlZmluZSAke21hY3JvfSAoJHtmYWxsYmFja2RlZmF1bHR9KSIgXAotCQl8IHNlZCAtZSAncy9cKFteYS16X11cKVwoZ2RiYXJjaFteYS16X11cKS9cMWN1cnJlbnRfXDIvZycKKwkgICAgZWNobyAiI2RlZmluZSAke21hY3JvfSAoJHtkZWZhdWx0fSkiCiAJICAgIGVjaG8gIiNlbmRpZiIKIAlmaQogCWVjaG8gIiIKQEAgLTU3NywxOCArNTA3LDE2IEBACiAgICAgZmkKICAgICBpZiBjbGFzc19pc19mdW5jdGlvbl9wCiAgICAgdGhlbgotCWlmIGZhbGxiYWNrX2RlZmF1bHRfcCB8fCBjbGFzc19pc19wcmVkaWNhdGVfcAorCWlmIGRlZmF1bHRfaXNfZmFsbGJhY2tfcCB8fCBjbGFzc19pc19wcmVkaWNhdGVfcAogCXRoZW4KIAkgICAgZWNobyAiIgogCSAgICBlY2hvICIvKiBEZWZhdWx0IChmdW5jdGlvbikgZm9yIG5vbi0gbXVsdGktYXJjaCBwbGF0Zm9ybXMuICovIgogCSAgICBlY2hvICIjaWYgKEdEQl9NVUxUSV9BUkNIID09IDApICYmICFkZWZpbmVkICgke21hY3JvfSkiCi0JICAgIGlmIFsgIiR7ZmFsbGJhY2tkZWZhdWx0fSIgPSAiMCIgXQorCSAgICBpZiBbICIke2RlZmF1bHR9IiA9ICIwIiBdCiAJICAgIHRoZW4KIAkJZWNobyAiI2RlZmluZSAke21hY3JvfSgke2FjdHVhbH0pIChpbnRlcm5hbF9lcnJvciAoXCIke21hY3JvfVwiKSwgMCkiCiAJICAgIGVsc2UKLQkJIyBGSVhNRTogU2hvdWxkIGJlIHBhc3NpbmcgY3VycmVudF9nZGJhcmNoIHRocm91Z2ghCi0JCWVjaG8gIiNkZWZpbmUgJHttYWNyb30oJHthY3R1YWx9KSAoJHtmYWxsYmFja2RlZmF1bHR9ICgke2FjdHVhbH0pKSIgXAotCQkgICAgfCBzZWQgLWUgJ3MvXChbXmEtel9dXClcKGdkYmFyY2hbXmEtel9dXCkvXDFjdXJyZW50X1wyL2cnCisJCWVjaG8gIiNkZWZpbmUgJHttYWNyb30oJHthY3R1YWx9KSAoJHtkZWZhdWx0fSAoJHthY3R1YWx9KSkiCiAJICAgIGZpCiAJICAgIGVjaG8gIiNlbmRpZiIKIAlmaQpAQCAtOTQ5LDcgKzg3Nyw2IEBACiAjZW5kaWYKICNpbmNsdWRlICJzeW1jYXQuaCIKIAotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCiAKIC8qIFN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KIApAQCAtMTA1Niw3ICs5ODMsNyBAQAogZG8KICAgICBpZiBjbGFzc19pc19pbmZvX3AKICAgICB0aGVuCi0JZWNobyAiICAke3N0YXRpY2RlZmF1bHR9LCIKKwllY2hvICIgICR7c3RhcnR1cH0sIgogICAgIGZpCiBkb25lCiBjYXQgPDxFT0YKQEAgLTEwNzAsNyArOTk3LDcgQEAKIGRvCiAgICAgaWYgY2xhc3NfaXNfZnVuY3Rpb25fcCB8fCBjbGFzc19pc192YXJpYWJsZV9wCiAgICAgdGhlbgotCWVjaG8gIiAgJHtzdGF0aWNkZWZhdWx0fSwiCisJZWNobyAiICAke3N0YXJ0dXB9LCIKICAgICBmaQogZG9uZQogY2F0IDw8RU9GCkBAIC0xMTExLDkgKzEwMzgsOSBAQAogZG8KICAgICBpZiBjbGFzc19pc19mdW5jdGlvbl9wIHx8IGNsYXNzX2lzX3ZhcmlhYmxlX3AKICAgICB0aGVuCi0JaWYgWyAiJHtwcmVkZWZhdWx0fSIgIT0gIiIgLWEgIiR7cHJlZGVmYXVsdH0iICE9ICIwIiBdCisJaWYgWyAiJHtkZWZhdWx0fSIgIT0gIiIgLWEgIiR7ZGVmYXVsdH0iICE9ICIwIiBdCiAJdGhlbgotCSAgZWNobyAiICBnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9ICR7cHJlZGVmYXVsdH07IgorCSAgZWNobyAiICBnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9ICR7ZGVmYXVsdH07IgogCWZpCiAgICAgZmkKIGRvbmUKQEAgLTExNzAsMjggKzEwOTcsMTUgQEAKIAllbGlmIGNsYXNzX2lzX3ByZWRpY2F0ZV9wCiAJdGhlbgogCSAgICBlY2hvICIgIC8qIFNraXAgdmVyaWZ5IG9mICR7ZnVuY3Rpb259LCBoYXMgcHJlZGljYXRlICovIgotCSMgRklYTUU6IFNlZSBkb19yZWFkIGZvciBwb3RlbnRpYWwgc2ltcGxpZmljYXRpb24KLSAJZWxpZiBbICIke2ludmFsaWRfcH0iIC1hICIke3Bvc3RkZWZhdWx0fSIgXQotCXRoZW4KLQkgICAgZWNobyAiICBpZiAoJHtpbnZhbGlkX3B9KSIKLQkgICAgZWNobyAiICAgIGdkYmFyY2gtPiR7ZnVuY3Rpb259ID0gJHtwb3N0ZGVmYXVsdH07IgotCWVsaWYgWyAiJHtwcmVkZWZhdWx0fSIgLWEgIiR7cG9zdGRlZmF1bHR9IiBdCi0JdGhlbgotCSAgICBlY2hvICIgIGlmIChnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9PSAke3ByZWRlZmF1bHR9KSIKLQkgICAgZWNobyAiICAgIGdkYmFyY2gtPiR7ZnVuY3Rpb259ID0gJHtwb3N0ZGVmYXVsdH07IgotCWVsaWYgWyAiJHtwb3N0ZGVmYXVsdH0iIF0KLQl0aGVuCi0JICAgIGVjaG8gIiAgaWYgKGdkYmFyY2gtPiR7ZnVuY3Rpb259ID09IDApIgotCSAgICBlY2hvICIgICAgZ2RiYXJjaC0+JHtmdW5jdGlvbn0gPSAke3Bvc3RkZWZhdWx0fTsiCi0JZWxpZiBbICIke2ludmFsaWRfcH0iIF0KKyAJZWxpZiBbICIke2ludmFsaWRfcH0iIF0KIAl0aGVuCiAJICAgIGVjaG8gIiAgaWYgKChHREJfTVVMVElfQVJDSCA+PSAke2xldmVsfSkiCiAJICAgIGVjaG8gIiAgICAgICYmICgke2ludmFsaWRfcH0pKSIKIAkgICAgZWNobyAiICAgIGludGVybmFsX2Vycm9yIChcImdkYmFyY2g6IHZlcmlmeV9nZGJhcmNoOiAke2Z1bmN0aW9ufSBpbnZhbGlkXCIpOyIKLQllbGlmIFsgIiR7cHJlZGVmYXVsdH0iIF0KKwllbGlmIFsgIiR7ZGVmYXVsdH0iIF0KIAl0aGVuCiAJICAgIGVjaG8gIiAgaWYgKChHREJfTVVMVElfQVJDSCA+PSAke2xldmVsfSkiCi0JICAgIGVjaG8gIiAgICAgICYmIChnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9PSAke3ByZWRlZmF1bHR9KSkiCisJICAgIGVjaG8gIiAgICAgICYmIChnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9PSAke2RlZmF1bHR9KSkiCiAJICAgIGVjaG8gIiAgICBpbnRlcm5hbF9lcnJvciAoXCJnZGJhcmNoOiB2ZXJpZnlfZ2RiYXJjaDogJHtmdW5jdGlvbn0gaW52YWxpZFwiKTsiCiAJZmkKICAgICBmaQpAQCAtMTMxMyw5ICsxMjI3LDkgQEAKIAl0aGVuCiAJICBlY2hvICIgIGlmICgke2ludmFsaWRfcH0pIgogCSAgZWNobyAiICAgIGludGVybmFsX2Vycm9yIChcImdkYmFyY2g6IGdkYmFyY2hfJHtmdW5jdGlvbn0gaW52YWxpZFwiKTsiCi0JZWxpZiBbICIke3ByZWRlZmF1bHR9IiBdCisJZWxpZiBbICIke2RlZmF1bHR9IiBdCiAJdGhlbgotCSAgZWNobyAiICBpZiAoZ2RiYXJjaC0+JHtmdW5jdGlvbn0gPT0gJHtwcmVkZWZhdWx0fSkiCisJICBlY2hvICIgIGlmIChnZGJhcmNoLT4ke2Z1bmN0aW9ufSA9PSAke2RlZmF1bHR9KSIKIAkgIGVjaG8gIiAgICBpbnRlcm5hbF9lcnJvciAoXCJnZGJhcmNoOiBnZGJhcmNoXyR7ZnVuY3Rpb259IGludmFsaWRcIik7IgogCWZpCiAJZWNobyAiICBpZiAoZ2RiYXJjaF9kZWJ1ZyA+PSAyKSIKZGlmZiAtLWdpdCBhL2dkYi9nZGJjb3JlLmggYi9nZGIvZ2RiY29yZS5oCmluZGV4IGJkZjE0YzIuLmJiNGU3NmYgMTAwNjQ0Ci0tLSBhL2dkYi9nZGJjb3JlLmgKKysrIGIvZ2RiL2dkYmNvcmUuaApAQCAtNzgsMTIgKzc4LDEyIEBACiAMCiAvKiBIb29rIGZvciBgZXhlY19maWxlX2NvbW1hbmQnIGNvbW1hbmQgdG8gY2FsbC4gICovCiAKLWV4dGVybiB2b2lkICgqZXhlY19maWxlX2Rpc3BsYXlfaG9vaykgKGNoYXIgKmZpbGVuYW1lKTsKK2V4dGVybiB2b2lkICgqZXhlY19maWxlX2Rpc3BsYXlfaG9vaykgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKIAogLyogSG9vayBmb3IgImZpbGVfY29tbWFuZCIsIHdoaWNoIGlzIG1vcmUgdXNlZnVsIHRoYW4gYWJvdmUKICAgIChiZWNhdXNlIGl0IGlzIGludm9rZWQgQUZURVIgc3ltYm9scyBhcmUgcmVhZCwgbm90IGJlZm9yZSkgKi8KIAotZXh0ZXJuIHZvaWQgKCpmaWxlX2NoYW5nZWRfaG9vaykgKGNoYXIgKmZpbGVuYW1lKTsKK2V4dGVybiB2b2lkICgqZmlsZV9jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CiAKIGV4dGVybiB2b2lkIHNwZWNpZnlfZXhlY19maWxlX2hvb2sgKHZvaWQgKCpob29rKSAoY2hhciAqZmlsZW5hbWUpKTsKIApAQCAtMTQzLDEzICsxNDMsMTMgQEAKICAgICAgICBhbm90aGVyIGZpbGUpLiAgUmV0dXJucyBub256ZXJvIGlmIHRoZSBoYW5kbGVyIHJlY29nbml6ZXMgdGhlCiAgICAgICAgZm9ybWF0LCB6ZXJvIG90aGVyd2lzZS4gKi8KIAotICAgIGludCAoKmNoZWNrX2Zvcm1hdCkgKGJmZCAqKTsKKyAgICBpbnQgKCpjaGVja19mb3JtYXQpIFBBUkFNUyAoKGJmZCAqKSk7CiAKICAgICAvKiBDb3JlIGZpbGUgaGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIHRvIGFzayBpZiBpdCBjYW4gaGFuZGxlIGEKICAgICAgICBnaXZlbiBjb3JlIGZpbGUgZm9ybWF0IG9yIG5vdC4gIFJldHVybnMgemVybyBpZiBpdCBjYW4ndCwKICAgICAgICBub256ZXJvIG90aGVyd2lzZS4gKi8KIAotICAgIGludCAoKmNvcmVfc25pZmZlcikgKHN0cnVjdCBjb3JlX2ZucyAqLCBiZmQgKik7CisgICAgaW50ICgqY29yZV9zbmlmZmVyKSBQQVJBTVMgKChzdHJ1Y3QgY29yZV9mbnMgKiwgYmZkICopKTsKIAogICAgIC8qIEV4dHJhY3QgdGhlIHJlZ2lzdGVyIHZhbHVlcyBvdXQgb2YgdGhlIGNvcmUgZmlsZSBhbmQgc3RvcmUgdGhlbSB3aGVyZQogICAgICAgIGByZWFkX3JlZ2lzdGVyJyB3aWxsIGZpbmQgdGhlbS4KQEAgLTE3Miw5ICsxNzIsOSBAQAogICAgICAgIHJlZ2lzdGVycyBpbiBhIGxhcmdlIHVwYWdlLXBsdXMtc3RhY2sgIi5yZWciIHNlY3Rpb24uICBPcmlnaW5hbCB1cGFnZQogICAgICAgIGFkZHJlc3MgWCBpcyBhdCBsb2NhdGlvbiBjb3JlX3JlZ19zZWN0K3grcmVnX2FkZHIuICovCiAKLSAgICB2b2lkICgqY29yZV9yZWFkX3JlZ2lzdGVycykgKGNoYXIgKmNvcmVfcmVnX3NlY3QsCi0JCQkJIHVuc2lnbmVkIGNvcmVfcmVnX3NpemUsCi0JCQkJIGludCB3aGljaCwgQ09SRV9BRERSIHJlZ19hZGRyKTsKKyAgICB2b2lkICgqY29yZV9yZWFkX3JlZ2lzdGVycykgUEFSQU1TICgoY2hhciAqY29yZV9yZWdfc2VjdCwKKwkJCQkJIHVuc2lnbmVkIGNvcmVfcmVnX3NpemUsCisJCQkJCSBpbnQgd2hpY2gsIENPUkVfQUREUiByZWdfYWRkcikpOwogCiAgICAgLyogRmluZHMgdGhlIG5leHQgc3RydWN0IGNvcmVfZm5zLiAgVGhleSBhcmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAogICAgICAgIGluIHdoYXRldmVyIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbnMgcG9pbnRlZCB0bzsgYW4gCmRpZmYgLS1naXQgYS9nZGIvZ251LXJlZ2V4LmMgYi9nZGIvZ251LXJlZ2V4LmMKaW5kZXggZjdmYWE4Yy4uMDUzNzkyOSAxMDA2NDQKLS0tIGEvZ2RiL2dudS1yZWdleC5jCisrKyBiL2dkYi9nbnUtcmVnZXguYwpAQCAtMzU2LDEyICszNTYsMTAgQEAKICNkZWZpbmUgZmFsc2UgMAogI2RlZmluZSB0cnVlIDEKIAotc3RhdGljIGludCByZV9tYXRjaF8yX2ludGVybmFsIFBBUkFNUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcCwKLQkJCQkJY29uc3QgY2hhciAqc3RyaW5nMSwgaW50IHNpemUxLAotCQkJCQljb25zdCBjaGFyICpzdHJpbmcyLCBpbnQgc2l6ZTIsCi0JCQkJCWludCBwb3MsCi0JCQkJCXN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MsCi0JCQkJCWludCBzdG9wKSk7CitzdGF0aWMgaW50IHJlX21hdGNoXzJfaW50ZXJuYWwgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcCwKKwkJCQljb25zdCBjaGFyICpzdHJpbmcxLCBpbnQgc2l6ZTEsCisJCQkJY29uc3QgY2hhciAqc3RyaW5nMiwgaW50IHNpemUyLAorCQkJCWludCBwb3MsIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MsIGludCBzdG9wKTsKIAwKIC8qIFRoZXNlIGFyZSB0aGUgY29tbWFuZCBjb2RlcyB0aGF0IGFwcGVhciBpbiBjb21waWxlZCByZWd1bGFyCiAgICBleHByZXNzaW9ucy4gIFNvbWUgb3Bjb2RlcyBhcmUgZm9sbG93ZWQgYnkgYXJndW1lbnQgYnl0ZXMuICBBCmRpZmYgLS1naXQgYS9nZGIvaHB1eC10aHJlYWQuYyBiL2dkYi9ocHV4LXRocmVhZC5jCmluZGV4IGYyN2QxMmIuLjliZDYxMjkgMTAwNjQ0Ci0tLSBhL2dkYi9ocHV4LXRocmVhZC5jCisrKyBiL2dkYi9ocHV4LXRocmVhZC5jCkBAIC01MjQsNyArNTI0LDcgQEAKICAqLwogCiAvKiBTYXZlZCBwb2ludGVyIHRvIHByZXZpb3VzIG93bmVyIG9mIHRoZSBuZXdfb2JqZmlsZSBldmVudC4gKi8KLXN0YXRpYyB2b2lkICgqdGFyZ2V0X25ld19vYmpmaWxlX2NoYWluKSAoc3RydWN0IG9iamZpbGUgKik7CitzdGF0aWMgdm9pZCAoKnRhcmdldF9uZXdfb2JqZmlsZV9jaGFpbikgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOwogCiB2b2lkCiBocHV4X3RocmVhZF9uZXdfb2JqZmlsZSAob2JqZmlsZSkKZGlmZiAtLWdpdCBhL2dkYi9pMzg2YnNkLW5hdC5jIGIvZ2RiL2kzODZic2QtbmF0LmMKaW5kZXggZjExODJlYS4uYzRkZWY3ZSAxMDA2NDQKLS0tIGEvZ2RiL2kzODZic2QtbmF0LmMKKysrIGIvZ2RiL2kzODZic2QtbmF0LmMKQEAgLTM4LDkgKzM4LDYgQEAKIHR5cGVkZWYgc3RydWN0IGZwcmVnIGZwcmVnc2V0X3Q7CiAjZW5kaWYKIAotI2luY2x1ZGUgImdyZWdzZXQuaCIKLQwKLQogLyogSW4gb2xkZXIgQlNEIHZlcnNpb25zIHdlIGNhbm5vdCBnZXQgYXQgc29tZSBvZiB0aGUgc2VnbWVudAogICAgcmVnaXN0ZXJzLiAgRnJlZUJTRCBmb3IgZXhhbXBsZSBkaWRuJ3Qgc3VwcG9ydCB0aGUgJWZzIGFuZCAlZ3MKICAgIHJlZ2lzdGVycyB1bnRpbCB0aGUgMy4wIHJlbGVhc2UuICBXZSBoYXZlIGF1dG9jb25mIGNoZWNrcyBmb3IgdGhlaXIKQEAgLTUzLDcgKzUwLDcgQEAKIAogLyogUmVnaXN0ZXJzIHdlIHNob3VsZG4ndCB0cnkgdG8gc3RvcmUuICAqLwogI2lmICFkZWZpbmVkIChDQU5OT1RfU1RPUkVfUkVHSVNURVIpCi0jZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgY2Fubm90X2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSBDQU5OT1RfRkVUQ0hfUkVHSVNURVIgKHJlZ25vKQogI2VuZGlmCiAKIC8qIE9mZnNldCB0byB0aGUgZ3JlZ3NldF90IGxvY2F0aW9uIHdoZXJlIFJFRyBpcyBzdG9yZWQuICAqLwpAQCAtNzgsMTIgKzc1LDEyIEBACiAgIFJFR19PRkZTRVQgKHJfc3MpLAogICBSRUdfT0ZGU0VUIChyX2RzKSwKICAgUkVHX09GRlNFVCAocl9lcyksCi0jaWZkZWYgSEFWRV9TVFJVQ1RfUkVHX1JfRlMKKyNpZmRlZiBIQVZFX1JfRlMKICAgUkVHX09GRlNFVCAocl9mcyksCiAjZWxzZQogICAtMSwKICNlbmRpZgotI2lmZGVmIEhBVkVfU1RSVUNUX1JFR19SX0dTCisjaWZkZWYgSEFWRV9SX0dTCiAgIFJFR19PRkZTRVQgKHJfZ3MpCiAjZWxzZQogICAtMQpAQCAtMTA5LDEyICsxMDYsMTYgQEAKIHZvaWQKIHN1cHBseV9ncmVnc2V0IChncmVnc2V0X3QgKmdyZWdzZXRwKQogeworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOwogICBpbnQgaTsKIAogICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dSRUdTOyBpKyspCiAgICAgewogICAgICAgaWYgKENBTk5PVF9GRVRDSF9SRUdJU1RFUiAoaSkpCi0Jc3VwcGx5X3JlZ2lzdGVyIChpLCBOVUxMKTsKKwl7CisJICBtZW1zZXQgKGJ1ZiwgMCwgUkVHSVNURVJfUkFXX1NJWkUgKGkpKTsKKwkgIHN1cHBseV9yZWdpc3RlciAoaSwgYnVmKTsKKwl9CiAgICAgICBlbHNlCiAJc3VwcGx5X3JlZ2lzdGVyIChpLCBSRUdfQUREUiAoZ3JlZ3NldHAsIGkpKTsKICAgICB9CkBAIC0xMzEsNyArMTMyLDcgQEAKIAogICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dSRUdTOyBpKyspCiAgICAgaWYgKChyZWdubyA9PSAtMSB8fCByZWdubyA9PSBpKSAmJiAhIENBTk5PVF9TVE9SRV9SRUdJU1RFUiAoaSkpCi0gICAgICBtZW1jcHkgKFJFR19BRERSIChncmVnc2V0cCwgaSksICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoaSldLAorICAgICAgbWVtY3B5IChSRUdfQUREUiAoZ3JlZ3NldHAsIGkpLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sCiAJICAgICAgUkVHSVNURVJfUkFXX1NJWkUgKGkpKTsKIH0KIApAQCAtMTc5LDcgKzE4MCw3IEBACiAKICAgICAgIHN1cHBseV9mcHJlZ3NldCAoJmZwcmVncyk7CiAgICAgfQotfQorfSAgCiAKIC8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuICBJZiBSRUdOTyBpcyAtMSwgZG8KICAgIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMgKGluY2x1ZGluZyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKS4gICovCmRpZmYgLS1naXQgYS9nZGIvaW5mZXJpb3IuaCBiL2dkYi9pbmZlcmlvci5oCmluZGV4IDI2Nzk4YTUuLjhlMTcyMDIgMTAwNjQ0Ci0tLSBhL2dkYi9pbmZlcmlvci5oCisrKyBiL2dkYi9pbmZlcmlvci5oCkBAIC0xNjAsMTMgKzE2MCwxMCBAQAogCiBleHRlcm4gdm9pZCBnZW5lcmljX3RhcmdldF93cml0ZV9mcCAoQ09SRV9BRERSKTsKIAotZXh0ZXJuIENPUkVfQUREUiB1bnNpZ25lZF9wb2ludGVyX3RvX2FkZHJlc3MgKHN0cnVjdCB0eXBlICp0eXBlLCB2b2lkICpidWYpOworZXh0ZXJuIENPUkVfQUREUiBnZW5lcmljX3BvaW50ZXJfdG9fYWRkcmVzcyAoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKmJ1Zik7CiAKLWV4dGVybiB2b2lkIHVuc2lnbmVkX2FkZHJlc3NfdG9fcG9pbnRlciAoc3RydWN0IHR5cGUgKnR5cGUsIHZvaWQgKmJ1ZiwKLQkJCQkJIENPUkVfQUREUiBhZGRyKTsKLWV4dGVybiBDT1JFX0FERFIgc2lnbmVkX3BvaW50ZXJfdG9fYWRkcmVzcyAoc3RydWN0IHR5cGUgKnR5cGUsIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBhZGRyZXNzX3RvX3NpZ25lZF9wb2ludGVyIChzdHJ1Y3QgdHlwZSAqdHlwZSwgdm9pZCAqYnVmLAotCQkJCSAgICAgICBDT1JFX0FERFIgYWRkcik7CitleHRlcm4gdm9pZCBnZW5lcmljX2FkZHJlc3NfdG9fcG9pbnRlciAoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKmJ1ZiwKKwkJCQkJQ09SRV9BRERSIGFkZHIpOwogCiBleHRlcm4gdm9pZCB3YWl0X2Zvcl9pbmZlcmlvciAodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2dkYi9pcml4NS1uYXQuYyBiL2dkYi9pcml4NS1uYXQuYwppbmRleCBlYTM3YjhjLi4xMjkwN2M1IDEwMDY0NAotLS0gYS9nZGIvaXJpeDUtbmF0LmMKKysrIGIvZ2RiL2lyaXg1LW5hdC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogc3RhdGljIHZvaWQgaW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGNoYXIgKiwgaW50KTsKIAotc3RhdGljIGludCBzeW1ib2xfYWRkX3N0dWIgKHZvaWQgKik7CitzdGF0aWMgaW50IHN5bWJvbF9hZGRfc3R1YiAoY2hhciAqKTsKIAogc3RhdGljIHN0cnVjdCBzb19saXN0ICpmaW5kX3NvbGliIChzdHJ1Y3Qgc29fbGlzdCAqKTsKIApAQCAtMzY0LDcgKzM2NCw3IEBACiAKIHN0YXRpYyBDT1JFX0FERFIgbG9jYXRlX2Jhc2UgKHZvaWQpOwogCi1zdGF0aWMgaW50IHNvbGliX21hcF9zZWN0aW9ucyAodm9pZCAqKTsKK3N0YXRpYyBpbnQgc29saWJfbWFwX3NlY3Rpb25zIChjaGFyICopOwogCiAvKgogCkBAIC0zOTQsNyArMzk0LDggQEAKICAqLwogCiBzdGF0aWMgaW50Ci1zb2xpYl9tYXBfc2VjdGlvbnMgKHZvaWQgKmFyZykKK3NvbGliX21hcF9zZWN0aW9ucyAoYXJnKQorICAgICBjaGFyICphcmc7CiB7CiAgIHN0cnVjdCBzb19saXN0ICpzbyA9IChzdHJ1Y3Qgc29fbGlzdCAqKSBhcmc7CS8qIGNhdGNoX2Vycm9ycyBib2dvbiAqLwogICBjaGFyICpmaWxlbmFtZTsKQEAgLTQ1OSw3ICs0NjAsNiBAQAogICAvKiBGcmVlIHRoZSBmaWxlIG5hbWVzLCBjbG9zZSB0aGUgZmlsZSBub3cuICAqLwogICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKIAotICAvKiBtdXN0IGJlIG5vbi16ZXJvICovCiAgIHJldHVybiAoMSk7CiB9CiAKQEAgLTU2NCwxMyArNTY0LDEyIEBACiAgICAgcmV0dXJuIE5VTEw7CiAKICAgLyogR2V0IGZpcnN0IGxpc3QgZW50cnkuICAqLwotICAvKiBUaGUgTUlQUyBTaWduIGV4dGVuZHMgYWRkcmVzc2VzLiAqLwotICBsbGFkZHIgPSBob3N0X3BvaW50ZXJfdG9fYWRkcmVzcyAobGlzdHApOworICBsbGFkZHIgPSAoQ09SRV9BRERSKSBsaXN0cDsKICAgcmVhZF9tZW1vcnkgKGxsYWRkciwgKGNoYXIgKikgJmxpc3Rfb2xkLCBzaXplb2YgKHN0cnVjdCBvYmpfbGlzdCkpOwogCiAgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGlzdCBpcyB0aGUgb2JqZWN0IGZpbGUgd2UgYXJlIGRlYnVnZ2luZywKICAgICAgc28gc2tpcCBpdC4gICovCi0gIG5leHRfbGxhZGRyID0gaG9zdF9wb2ludGVyX3RvX2FkZHJlc3MgKGxpc3Rfb2xkLm5leHQpOworICBuZXh0X2xsYWRkciA9IChDT1JFX0FERFIpIGxpc3Rfb2xkLm5leHQ7CiAKICNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCiAgIGlmIChsaXN0X29sZC5kYXRhID09IE5FV19PQkpfSU5GT19NQUdJQykKQEAgLTYzMCw3ICs2MjksNyBAQAogCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChsbS0+bF9sbGFkZHIsCiAJCQkJICAgICAgIChjaGFyICopICZsaXN0X29sZCwKIAkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2xpc3QpKTsKLQkgIG5leHRfbGxhZGRyID0gaG9zdF9wb2ludGVyX3RvX2FkZHJlc3MgKGxpc3Rfb2xkLm5leHQpOworCSAgbmV4dF9sbGFkZHIgPSAoQ09SRV9BRERSKSBsaXN0X29sZC5uZXh0OwogCX0KICNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCiAgICAgICBlbHNlIGlmIChsbS0+bF92YXJpYW50ID09IE9CSl9MSVNUXzMyKQpAQCAtNjgzLDcgKzY4Miw3IEBACiAKICAgbmV3X2xtLT5sX3ZhcmlhbnQgPSBPQkpfTElTVF9PTEQ7CiAgIG5ld19sbS0+bF9sbGFkZHIgPSBsbGFkZHI7Ci0gIG5ld19sbS0+bF9uZXh0ID0gaG9zdF9wb2ludGVyX3RvX2FkZHJlc3MgKGxpc3Rfb2xkLm5leHQpOworICBuZXdfbG0tPmxfbmV4dCA9IChDT1JFX0FERFIpIGxpc3Rfb2xkLm5leHQ7CiAKICNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCiAgIGlmIChsaXN0X29sZC5kYXRhID09IE5FV19PQkpfSU5GT19NQUdJQykKQEAgLTgxOSw3ICs4MTgsOCBAQAogLyogQSBzbWFsbCBzdHViIHRvIGdldCB1cyBwYXN0IHRoZSBhcmctcGFzc2luZyBwaW5ob2xlIG9mIGNhdGNoX2Vycm9ycy4gICovCiAKIHN0YXRpYyBpbnQKLXN5bWJvbF9hZGRfc3R1YiAodm9pZCAqYXJnKQorc3ltYm9sX2FkZF9zdHViIChhcmcpCisgICAgIGNoYXIgKmFyZzsKIHsKICAgcmVnaXN0ZXIgc3RydWN0IHNvX2xpc3QgKnNvID0gKHN0cnVjdCBzb19saXN0ICopIGFyZzsJCS8qIGNhdGNoX2VycnMgYm9nb24gKi8KICAgQ09SRV9BRERSIHRleHRfYWRkciA9IDA7CkBAIC04NDgsNyArODQ4LDYgQEAKICAgc2VjdGlvbl9hZGRycy5vdGhlclswXS5hZGRyID0gdGV4dF9hZGRyOwogICBzby0+b2JqZmlsZSA9IHN5bWJvbF9maWxlX2FkZCAoc28tPnNvX25hbWUsIHNvLT5mcm9tX3R0eSwKIAkJCQkgJnNlY3Rpb25fYWRkcnMsIDAsIDApOwotICAvKiBtdXN0IGJlIG5vbi16ZXJvICovCiAgIHJldHVybiAoMSk7CiB9CiAKZGlmZiAtLWdpdCBhL2dkYi9sYW5ndWFnZS5oIGIvZ2RiL2xhbmd1YWdlLmgKaW5kZXggMTg1YmM5MS4uMDU0YzZjZiAxMDA2NDQKLS0tIGEvZ2RiL2xhbmd1YWdlLmgKKysrIGIvZ2RiL2xhbmd1YWdlLmgKQEAgLTE0MSwxNSArMTQxLDE1IEBACiAKICAgICAvKiBQYXJzZXIgZnVuY3Rpb24uICovCiAKLSAgICBpbnQgKCpsYV9wYXJzZXIpICh2b2lkKTsKKyAgICBpbnQgKCpsYV9wYXJzZXIpIFBBUkFNUyAoKHZvaWQpKTsKIAogICAgIC8qIFBhcnNlciBlcnJvciBmdW5jdGlvbiAqLwogCi0gICAgdm9pZCAoKmxhX2Vycm9yKSAoY2hhciAqKTsKKyAgICB2b2lkICgqbGFfZXJyb3IpIFBBUkFNUyAoKGNoYXIgKikpOwogCiAgICAgLyogRXZhbHVhdGUgYW4gZXhwcmVzc2lvbi4gKi8KLSAgICBzdHJ1Y3QgdmFsdWUgKigqZXZhbHVhdGVfZXhwKSAoc3RydWN0IHR5cGUgKiwgc3RydWN0IGV4cHJlc3Npb24gKiwKLQkJCQkgICBpbnQgKiwgZW51bSBub3NpZGUpOworICAgIHN0cnVjdCB2YWx1ZSAqKCpldmFsdWF0ZV9leHApIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosCisJCQkJCSAgIGludCAqLCBlbnVtIG5vc2lkZSkpOwogCiAgICAgdm9pZCAoKmxhX3ByaW50Y2hhcikgKGludCBjaCwgc3RydWN0IHVpX2ZpbGUgKiBzdHJlYW0pOwogCkBAIC0xNTksNyArMTU5LDcgQEAKIAogICAgIHZvaWQgKCpsYV9lbWl0Y2hhcikgKGludCBjaCwgc3RydWN0IHVpX2ZpbGUgKiBzdHJlYW0sIGludCBxdW90ZXIpOwogCi0gICAgc3RydWN0IHR5cGUgKigqbGFfZnVuZF90eXBlKSAoc3RydWN0IG9iamZpbGUgKiwgaW50KTsKKyAgICBzdHJ1Y3QgdHlwZSAqKCpsYV9mdW5kX3R5cGUpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIGludCkpOwogCiAgICAgLyogUHJpbnQgYSB0eXBlIHVzaW5nIHN5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBsYW5ndWFnZS4gKi8KIApkaWZmIC0tZ2l0IGEvZ2RiL2xpbnV4LXRocmVhZC5jIGIvZ2RiL2xpbnV4LXRocmVhZC5jCmluZGV4IGYyNWM3NjMuLjE0NjQ4MWMgMTAwNjQ0Ci0tLSBhL2dkYi9saW51eC10aHJlYWQuYworKysgYi9nZGIvbGludXgtdGhyZWFkLmMKQEAgLTkwMiw3ICs5MDIsNyBAQAogICovCiAKIC8qIFNhdmVkIHBvaW50ZXIgdG8gcHJldmlvdXMgb3duZXIgb2YgdGhlIG5ld19vYmpmaWxlIGV2ZW50LiAqLwotc3RhdGljIHZvaWQgKCp0YXJnZXRfbmV3X29iamZpbGVfY2hhaW4pIChzdHJ1Y3Qgb2JqZmlsZSAqKTsKK3N0YXRpYyB2b2lkICgqdGFyZ2V0X25ld19vYmpmaWxlX2NoYWluKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKIHZvaWQKIGxpbnV4dGhyZWFkc19uZXdfb2JqZmlsZSAob2JqZmlsZSkKZGlmZiAtLWdpdCBhL2dkYi9tZGVidWdyZWFkLmMgYi9nZGIvbWRlYnVncmVhZC5jCmluZGV4IGUzNzc0MzUuLmYxN2RjOTMgMTAwNjQ0Ci0tLSBhL2dkYi9tZGVidWdyZWFkLmMKKysrIGIvZ2RiL21kZWJ1Z3JlYWQuYwpAQCAtNjk5LDcgKzY5OSw4IEBACiAgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOwogewogICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIHZvaWQgKCpjb25zdCBzd2FwX3N5bV9pbikgKGJmZCAqLCBQVFIsIFNZTVIgKikgPSBkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbjsKKyAgdm9pZCAoKmNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKSA9CisgIGRlYnVnX3N3YXAtPnN3YXBfc3ltX2luOwogICBjaGFyICpuYW1lOwogICBzdHJ1Y3Qgc3ltYm9sICpzOwogICBzdHJ1Y3QgYmxvY2sgKmI7CkBAIC0yMjUzLDkgKzIyNTQsMTIgQEAKICAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwogICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemU7CiAgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZTsKLSAgdm9pZCAoKmNvbnN0IHN3YXBfZXh0X2luKSAoYmZkICosIFBUUiwgRVhUUiAqKSA9IGRlYnVnX3N3YXAtPnN3YXBfZXh0X2luOwotICB2b2lkICgqY29uc3Qgc3dhcF9zeW1faW4pIChiZmQgKiwgUFRSLCBTWU1SICopID0gZGVidWdfc3dhcC0+c3dhcF9zeW1faW47Ci0gIHZvaWQgKCpjb25zdCBzd2FwX3JmZF9pbikgKGJmZCAqLCBQVFIsIFJGRFQgKikgPSBkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbjsKKyAgdm9pZCAoKmNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQorICA9IGRlYnVnX3N3YXAtPnN3YXBfZXh0X2luOworICB2b2lkICgqY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCisgID0gZGVidWdfc3dhcC0+c3dhcF9zeW1faW47CisgIHZvaWQgKCpjb25zdCBzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSkKKyAgPSBkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbjsKICAgaW50IGZfaWR4LCBzX2lkeDsKICAgSERSUiAqaGRyID0gJmRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlcjsKICAgLyogUnVubmluZyBwb2ludGVycyAqLwpAQCAtMzE2Myw3ICszMTY3LDggQEAKICAgICAgQ09SRV9BRERSIHN2YWx1ZTsKIHsKICAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICB2b2lkICgqY29uc3Qgc3dhcF9zeW1faW4pIChiZmQgKiwgUFRSLCBTWU1SICopID0gZGVidWdfc3dhcC0+c3dhcF9zeW1faW47CisgIHZvaWQgKCpjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkKKyAgPSBkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbjsKICAgY2hhciAqZXh0X3N5bSA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KIAkJICAgKyAoKGZoLT5pc3ltQmFzZSArIGN1cl9zZHggKyAxKSAqIGV4dGVybmFsX3N5bV9zaXplKSk7CiAgIFNZTVIgc2g7CkBAIC0zMjU1LDggKzMyNjAsOCBAQAogewogICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOwogICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotICB2b2lkICgqc3dhcF9zeW1faW4pIChiZmQgKiwgUFRSLCBTWU1SICopOwotICB2b2lkICgqc3dhcF9wZHJfaW4pIChiZmQgKiwgUFRSLCBQRFIgKik7CisgIHZvaWQgKCpzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSk7CisgIHZvaWQgKCpzd2FwX3Bkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKICAgaW50IGk7CiAgIHN0cnVjdCBzeW10YWIgKnN0OwogICBGRFIgKmZoOwpkaWZmIC0tZ2l0IGEvZ2RiL21vbml0b3IuaCBiL2dkYi9tb25pdG9yLmgKaW5kZXggMjNmYWQ1Ny4uYmE0NDEzMyAxMDA2NDQKLS0tIGEvZ2RiL21vbml0b3IuaAorKysgYi9nZGIvbW9uaXRvci5oCkBAIC05NSwxNSArOTUsMTYgQEAKICAgICAgICBHREIgd2l0aCB0aGUgdmFsdWUgb2YgYSByZWdpc3Rlci4gICovCiAgICAgY2hhciAqZHVtcF9yZWdpc3RlcnM7CS8qIENvbW1hbmQgdG8gZHVtcCBhbGwgcmVncyBhdCBvbmNlICovCiAgICAgY2hhciAqcmVnaXN0ZXJfcGF0dGVybjsJLyogUGF0dGVybiB0aGF0IHBpY2tzIG91dCByZWdpc3RlciBmcm9tIHJlZyBkdW1wICovCi0gICAgdm9pZCAoKnN1cHBseV9yZWdpc3RlcikgKGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICp2YWwsIGludCB2YWxsZW4pOworICAgIHZvaWQgKCpzdXBwbHlfcmVnaXN0ZXIpIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgICAgY2hhciAqdmFsLCBpbnQgdmFsbGVuKSk7CiAgICAgdm9pZCAoKmxvYWRfcm91dGluZSkgUEFSQU1TICgoc2VyaWFsX3QgZGVzYywgY2hhciAqZmlsZSwKIAkJCQkgIGludCBoYXNobWFyaykpOwkvKiBEb3dubG9hZCByb3V0aW5lICovCiAgICAgaW50ICgqZHVtcHJlZ3MpIFBBUkFNUyAoKHZvaWQpKTsJLyogcm91dGluZSB0byBkdW1wIGFsbCByZWdpc3RlcnMgKi8KICAgICBpbnQgKCpjb250aW51ZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CS8qIEVtaXQgdGhlIGNvbnRpbnVlIGNvbW1hbmQgKi8KLSAgICBpbnQgKCp3YWl0X2ZpbHRlcikgKGNoYXIgKmJ1ZiwJLyogTWF5YmUgY29udGFpbnMgcmVnaXN0ZXJzICovCi0JCQlpbnQgYnVmbWF4LAotCQkJaW50ICpyZXNwb25zZV9sZW5ndGgsCi0JCQlzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKiBzdGF0dXMpOworICAgIGludCAoKndhaXRfZmlsdGVyKSBQQVJBTVMgKChjaGFyICpidWYsCS8qIE1heWJlIGNvbnRhaW5zIHJlZ2lzdGVycyAqLworCQkJCWludCBidWZtYXgsCisJCQkJaW50ICpyZXNwb25zZV9sZW5ndGgsCisJCQkJc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICogc3RhdHVzKSk7CiAgICAgY2hhciAqbG9hZDsJCQkvKiBsb2FkIGNvbW1hbmQgKi8KICAgICBjaGFyICpsb2FkcmVzcDsJCS8qIFJlc3BvbnNlIHRvIGxvYWQgY29tbWFuZCAqLwogICAgIGNoYXIgKnByb21wdDsJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KZGlmZiAtLWdpdCBhL2dkYi9vY2QuYyBiL2dkYi9vY2QuYwppbmRleCAxZWVlZDc3Li4wMzNkN2QyIDEwMDY0NAotLS0gYS9nZGIvb2NkLmMKKysrIGIvZ2RiL29jZC5jCkBAIC0xNDA5LDcgKzE0MDksNyBAQAogewogICBpbnQgc3RhdHVzLCBwa3RsZW47CiAgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47IAotICB2b2lkICgqc3RvcmVfcmVnaXN0ZXJzX3RtcCkgKGludCk7CisgIHZvaWQgKCpzdG9yZV9yZWdpc3RlcnNfdG1wKSBQQVJBTVMgKChpbnQpKTsKIAogICBpZiAoIW9jZF9kZXNjKQogICAgIGVycm9yICgiTm90IGNvbm5lY3RlZCB0byBPQ0QgZGV2aWNlLiIpOwpkaWZmIC0tZ2l0IGEvZ2RiL3Byb2Nmcy5jIGIvZ2RiL3Byb2Nmcy5jCmluZGV4IGIxMjdjNWYuLjJlNGRhZWQgMTAwNjQ0Ci0tLSBhL2dkYi9wcm9jZnMuYworKysgYi9nZGIvcHJvY2ZzLmMKQEAgLTI1NjIsNyArMjU2Miw3IEBACiAgIHByd2F0Y2hfdCAqcHdhdGNoOwogCiAgIHB3YXRjaCAgICAgICAgICAgID0gKHByd2F0Y2hfdCAqKSAmYXJnLndhdGNoOwotICBwd2F0Y2gtPnByX3ZhZGRyICA9IGFkZHJlc3NfdG9faG9zdF9wb2ludGVyIChhZGRyKTsKKyAgcHdhdGNoLT5wcl92YWRkciAgPSBhZGRyOwogICBwd2F0Y2gtPnByX3NpemUgICA9IGxlbjsKICAgcHdhdGNoLT5wcl93ZmxhZ3MgPSB3ZmxhZ3M7CiAjaWYgZGVmaW5lZChORVdfUFJPQ19BUEkpICYmIGRlZmluZWQgKFBDV0FUQ0gpCkBAIC0yNTk4LDcgKzI1OTgsNyBAQAogICAgZXZlcnkgdGltZSwgSSBkb24ndCBuZWVkIHRvIGxzZWVrIGl0LiAgKi8KIGludAogcHJvY19pdGVyYXRlX292ZXJfbWFwcGluZ3MgKGZ1bmMpCi0gICAgIGludCAoKmZ1bmMpIChpbnQsIENPUkVfQUREUik7CisgICAgIGludCAoKmZ1bmMpIFBBUkFNUyAoKGludCwgQ09SRV9BRERSKSk7CiB7CiAgIHN0cnVjdCBwcm1hcCAqbWFwOwogICBwcm9jaW5mbyAqcGk7CkBAIC0yNjgzLDggKzI2ODMsNyBAQAogCSBub3QgYSBwcm9ibGVtLiAgKi8KIAogICAgICAgLyogU3RvcCBsb29waW5nIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi16ZXJvLiAgKi8KLSAgICAgIGZ1bmNzdGF0ID0gKCpmdW5jKSAoZmQsIGhvc3RfcG9pbnRlcl90b19hZGRyZXNzIChtYXBbaV0ucHJfdmFkZHIpKTsKLSAgICAgIGlmIChmdW5jc3RhdCAhPSAwKQorICAgICAgaWYgKChmdW5jc3RhdCA9ICgqZnVuYykgKGZkLCAoQ09SRV9BRERSKSBtYXBbaV0ucHJfdmFkZHIpKSAhPSAwKQogCWJyZWFrOwogICAgIH0KICNlbmRpZgpAQCAtMzE0MSw3ICszMTQwLDcgQEAKIGludAogcHJvY19pdGVyYXRlX292ZXJfdGhyZWFkcyAocGksIGZ1bmMsIHB0cikKICAgICAgcHJvY2luZm8gKnBpOwotICAgICBpbnQgKCpmdW5jKSAocHJvY2luZm8gKiwgcHJvY2luZm8gKiwgdm9pZCAqKTsKKyAgICAgaW50ICAgICAoKmZ1bmMpIFBBUkFNUyAoKHByb2NpbmZvICosIHByb2NpbmZvICosIHZvaWQgKikpOwogICAgICB2b2lkICAgICAqcHRyOwogewogICBwcm9jaW5mbyAqdGhyZWFkLCAqbmV4dDsKZGlmZiAtLWdpdCBhL2dkYi9wdHg0LW5hdC5jIGIvZ2RiL3B0eDQtbmF0LmMKaW5kZXggZDFhNTI0OC4uMmZmNzk5NSAxMDA2NDQKLS0tIGEvZ2RiL3B0eDQtbmF0LmMKKysrIGIvZ2RiL3B0eDQtbmF0LmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogLyogdGhpcyBjb3VsZCB1c2UgZWxmX2ludGVycHJldGVyKCkgZnJvbSBlbGZyZWFkLmMgKi8KIGludAogcHJvY19pdGVyYXRlX292ZXJfbWFwcGluZ3MgKGZ1bmMpCi0gICAgIGludCAoKmZ1bmMpIChpbnQsIENPUkVfQUREUik7CisgICAgIGludCAoKmZ1bmMpIFBBUkFNUyAoKGludCwgQ09SRV9BRERSKSk7CiB7CiAgIHZhZGRyX3QgY3Vyc2VnLCBtZW1wdHI7CiAgIHB0X3ZzZWdfdCBwdjsKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtc2ltLmMgYi9nZGIvcmVtb3RlLXNpbS5jCmluZGV4IDMzNzdmZWYuLjExZjE3ZGQgMTAwNjQ0Ci0tLSBhL2dkYi9yZW1vdGUtc2ltLmMKKysrIGIvZ2RiL3JlbW90ZS1zaW0uYwpAQCAtNDIsNyArNDIsNyBAQAogCiBleHRlcm4gdm9pZCBfaW5pdGlhbGl6ZV9yZW1vdGVfc2ltICh2b2lkKTsKIAotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgKGludCBzaWdubyk7CitleHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKIAogc3RhdGljIHZvaWQgZHVtcF9tZW0gKGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtdXRpbHMuaCBiL2dkYi9yZW1vdGUtdXRpbHMuaAppbmRleCBkODJlYThkLi4wYmQwZTBkIDEwMDY0NAotLS0gYS9nZGIvcmVtb3RlLXV0aWxzLmgKKysrIGIvZ2RiL3JlbW90ZS11dGlscy5oCkBAIC03NywxMCArNzcsMTAgQEAKICAgICBEQ0FDSEUgKmRjYWNoZTsKICAgICBjaGFyICpwcm9tcHQ7CiAgICAgc3RydWN0IHRhcmdldF9vcHMgKm9wczsKLSAgICBpbnQgKCpjbGVhcl9hbGxfYnJlYWtwb2ludHMpICh2b2lkKTsKKyAgICBpbnQgKCpjbGVhcl9hbGxfYnJlYWtwb2ludHMpIFBBUkFNUyAoKHZvaWQpKTsKICAgICBtZW14ZmVyZnVuYyByZWFkZnVuYzsKICAgICBtZW14ZmVyZnVuYyB3cml0ZWZ1bmM7Ci0gICAgdm9pZCAoKmNoZWNraW4pICh2b2lkKTsKKyAgICB2b2lkICgqY2hlY2tpbikgUEFSQU1TICgodm9pZCkpOwogICB9OwogCiBleHRlcm4gc3RydWN0IGdyX3NldHRpbmdzICpncl9zZXR0aW5nczsKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUuYyBiL2dkYi9yZW1vdGUuYwppbmRleCBmYmU5NTlhLi5jNDBmN2FmIDEwMDY0NAotLS0gYS9nZGIvcmVtb3RlLmMKKysrIGIvZ2RiL3JlbW90ZS5jCkBAIC02MDMsOCArNjAzLDkgQEAKICAgICAgc3RydWN0IHBhY2tldF9jb25maWcgKmNvbmZpZzsKICAgICAgY2hhciAqbmFtZTsKICAgICAgY2hhciAqdGl0bGU7Ci0gICAgIHZvaWQgKCpzZXRfZnVuYykgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiBjKTsKLSAgICAgdm9pZCAoKnNob3dfZnVuYykgKGNoYXIgKm5hbWUsIGludCBmcm9tX3R0eSk7CisgICAgIHZvaWQgKCpzZXRfZnVuYykgUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5LAorCQkJICAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICogYykpOworICAgICB2b2lkICgqc2hvd19mdW5jKSBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipzZXRsaXN0OwogICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKnNob3dsaXN0OwogewpAQCAtNzMwLDggKzczMSw4IEBACiAvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gaG9vayBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgc2V0IGluIG9yZGVyIHRvCiAgICBtb2RpZnkgcmVzdW1lL3dhaXQgYmVoYXZpb3IgZm9yIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuICAqLwogCi12b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSAodm9pZCk7Ci12b2lkICgqdGFyZ2V0X3dhaXRfbG9vcF9ob29rKSAodm9pZCk7Cit2b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkICgqdGFyZ2V0X3dhaXRfbG9vcF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CiAMCiAKIApAQCAtMjQ0NCw3ICsyNDQ1LDcgQEAKIAogLyogU2VuZCBeQyB0byB0YXJnZXQgdG8gaGFsdCBpdC4gIFRhcmdldCB3aWxsIHJlc3BvbmQsIGFuZCBzZW5kIHVzIGEKICAgIHBhY2tldC4gICovCi1zdGF0aWMgdm9pZCAoKm9mdW5jKSAoaW50KTsKK3N0YXRpYyB2b2lkICgqb2Z1bmMpIFBBUkFNUyAoKGludCkpOwogCiAvKiBUaGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSdzIHN0b3Agcm91dGluZS4gVGhpcyBmdW5jdGlvbiBpcyBpbnN0YWxsZWQKICAgIGFzIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0lOVC4gVGhlIGZpcnN0IHRpbWUgYSB1c2VyIHJlcXVlc3RzIGEKZGlmZiAtLWdpdCBhL2dkYi9yczYwMDAtdGRlcC5jIGIvZ2RiL3JzNjAwMC10ZGVwLmMKaW5kZXggZWVhZGFlNS4uZTY4ZGE0NyAxMDA2NDQKLS0tIGEvZ2RiL3JzNjAwMC10ZGVwLmMKKysrIGIvZ2RiL3JzNjAwMC10ZGVwLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgIGluZmVyaW9yIHVuZGVyIEFJWC4gVGhlIGluaXRpYWxpemF0aW9uIGNvZGUgaW4gcnM2MDAwLW5hdC5jIHNldHMKICAgIHRoaXMgaG9vayB0byBwb2ludCB0byBmaW5kX3RvY19hZGRyZXNzLiAgKi8KIAotQ09SRV9BRERSICgqZmluZF90b2NfYWRkcmVzc19ob29rKSAoQ09SRV9BRERSKSA9IE5VTEw7CitDT1JFX0FERFIgKCpmaW5kX3RvY19hZGRyZXNzX2hvb2spIFBBUkFNUyAoKENPUkVfQUREUikpID0gTlVMTDsKIAogLyogU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIApkaWZmIC0tZ2l0IGEvZ2RiL3Nlci1vY2QuYyBiL2dkYi9zZXItb2NkLmMKaW5kZXggYzVjNzEwMy4uNzMzZDY5MiAxMDA2NDQKLS0tIGEvZ2RiL3Nlci1vY2QuYworKysgYi9nZGIvc2VyLW9jZC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaWZkZWYgX1dJTjMyCiAvKiBPbiBXaW5kb3dzLCB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gYSBmdW5jdGlvbiBpbgogICAgdGhlIHdpZ2dsZXIgRExMLiAgKi8KLXN0YXRpYyBpbnQgKCpkbGxfZG9fY29tbWFuZCkgKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgKCpkbGxfZG9fY29tbWFuZCkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKICNlbmRpZgogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9nZGIvc29sLXRocmVhZC5jIGIvZ2RiL3NvbC10aHJlYWQuYwppbmRleCA1NjNkYmQwLi5lNzQ5YjA2IDEwMDY0NAotLS0gYS9nZGIvc29sLXRocmVhZC5jCisrKyBiL2dkYi9zb2wtdGhyZWFkLmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogICovCiAKIC8qIFNhdmVkIHBvaW50ZXIgdG8gcHJldmlvdXMgb3duZXIgb2YgdGhlIG5ld19vYmpmaWxlIGV2ZW50LiAqLwotc3RhdGljIHZvaWQgKCp0YXJnZXRfbmV3X29iamZpbGVfY2hhaW4pIChzdHJ1Y3Qgb2JqZmlsZSAqKTsKK3N0YXRpYyB2b2lkICgqdGFyZ2V0X25ld19vYmpmaWxlX2NoYWluKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKIHZvaWQKIHNvbF90aHJlYWRfbmV3X29iamZpbGUgKG9iamZpbGUpCkBAIC0xMDkwLDIwICsxMDkwLDYgQEAKIAogCSAgcmV0dXJuIFBTX0VSUjsKIAl9Ci0gICAgICBlbHNlIGlmIChjYyA9PSAwKQotCXsKLQkgIGlmIChkb3dyaXRlID09IDApCi0JICAgIHdhcm5pbmcgKCJyd19jb21tb24gKCk6IHVuYWJsZSB0byByZWFkIGF0IGFkZHIgMHglbHgiLCAKLQkJICAgICAobG9uZykgYWRkcik7Ci0JICBlbHNlCi0JICAgIHdhcm5pbmcgKCJyd19jb21tb24gKCk6IHVuYWJsZSB0byB3cml0ZSBhdCBhZGRyIDB4JWx4IiwgCi0JCSAgICAgKGxvbmcpIGFkZHIpOwotCi0JICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKLQotCSAgcmV0dXJuIFBTX0VSUjsKLQl9Ci0KICAgICAgIHNpemUgLT0gY2M7CiAgICAgICBidWYgKz0gY2M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjbC10ZGVwLmMgYi9nZGIvc3BhcmNsLXRkZXAuYwppbmRleCAyZTllMjk1Li5lY2YwYmYxIDEwMDY0NAotLS0gYS9nZGIvc3BhcmNsLXRkZXAuYworKysgYi9nZGIvc3BhcmNsLXRkZXAuYwpAQCAtNTYwLDkgKzU2MCw5IEBACiAgICAgIGNoYXIgKnRhcmdldF9uYW1lOwogICAgICBjaGFyICphcmdzOwogICAgICBpbnQgZnJvbV90dHk7Ci0gICAgIHZvaWQgKCp3cml0ZV9yb3V0aW5lKSAoYmZkICogZnJvbV9iZmQsIGFzZWN0aW9uICogZnJvbV9zZWMsCi0JCQkgICAgZmlsZV9wdHIgZnJvbV9hZGRyLCBiZmRfdm1hIHRvX2FkZHIsIGludCBsZW4pOwotICAgICB2b2lkICgqc3RhcnRfcm91dGluZSkgKGJmZF92bWEgZW50cnkpOworICAgICB2b2lkICgqd3JpdGVfcm91dGluZSkgUEFSQU1TICgoYmZkICogZnJvbV9iZmQsIGFzZWN0aW9uICogZnJvbV9zZWMsCisJCQkgICAgIGZpbGVfcHRyIGZyb21fYWRkciwgYmZkX3ZtYSB0b19hZGRyLCBpbnQgbGVuKSk7CisgICAgIHZvaWQgKCpzdGFydF9yb3V0aW5lKSBQQVJBTVMgKChiZmRfdm1hIGVudHJ5KSk7CiB7CiAgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CiAgIGFzZWN0aW9uICpzZWN0aW9uOwpkaWZmIC0tZ2l0IGEvZ2RiL3N0YWJzcmVhZC5oIGIvZ2RiL3N0YWJzcmVhZC5oCmluZGV4IDZhZTNkOGIuLmM4OTlmNTAgMTAwNjQ0Ci0tLSBhL2dkYi9zdGFic3JlYWQuaAorKysgYi9nZGIvc3RhYnNyZWFkLmgKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiBleHRlcm4gdm9pZCBwcm9jZXNzX2xhdGVyCiAgIChzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKiwKLSAgIGludCAoKmYpIChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKikpOworICAgaW50ICgqZikgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bWJvbCAqLCBjaGFyICopKSk7CiAKIGV4dGVybiBpbnQgc3ltYm9sX3JlZmVyZW5jZV9kZWZpbmVkIChjaGFyICoqKTsKIApkaWZmIC0tZ2l0IGEvZ2RiL3N0YWNrLmMgYi9nZGIvc3RhY2suYwppbmRleCBhY2QxNmI0Li42YzExYTk4IDEwMDY0NAotLS0gYS9nZGIvc3RhY2suYworKysgYi9nZGIvc3RhY2suYwpAQCAtNDYsNyArNDYsNyBAQAogCiB2b2lkIGxvY2Fsc19pbmZvIChjaGFyICosIGludCk7CiAKLXZvaWQgKCpzZWxlY3RlZF9mcmFtZV9sZXZlbF9jaGFuZ2VkX2hvb2spIChpbnQpOwordm9pZCAoKnNlbGVjdGVkX2ZyYW1lX2xldmVsX2NoYW5nZWRfaG9vaykgUEFSQU1TICgoaW50KSk7CiAKIHZvaWQgX2luaXRpYWxpemVfc3RhY2sgKHZvaWQpOwogCmRpZmYgLS1naXQgYS9nZGIvc3ltZmlsZS5jIGIvZ2RiL3N5bWZpbGUuYwppbmRleCA3MjZiZDI0Li42MGI0MDhiIDEwMDY0NAotLS0gYS9nZGIvc3ltZmlsZS5jCisrKyBiL2dkYi9zeW1maWxlLmMKQEAgLTY4LDkgKzY4LDkgQEAKIAkJCSAgICB1bnNpZ25lZCBsb25nIHNlY3Rpb25fc2l6ZSwgCiAJCQkgICAgdW5zaWduZWQgbG9uZyB0b3RhbF9zZW50LCAKIAkJCSAgICB1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUpOwotdm9pZCAoKnByZV9hZGRfc3ltYm9sX2hvb2spIChjaGFyICopOwotdm9pZCAoKnBvc3RfYWRkX3N5bWJvbF9ob29rKSAodm9pZCk7Ci12b2lkICgqdGFyZ2V0X25ld19vYmpmaWxlX2hvb2spIChzdHJ1Y3Qgb2JqZmlsZSAqKTsKK3ZvaWQgKCpwcmVfYWRkX3N5bWJvbF9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKK3ZvaWQgKCpwb3N0X2FkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgodm9pZCkpOwordm9pZCAoKnRhcmdldF9uZXdfb2JqZmlsZV9ob29rKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKIHN0YXRpYyB2b2lkIGNsZWFyX3N5bXRhYl91c2Vyc19jbGVhbnVwICh2b2lkICppZ25vcmUpOwogCkBAIC0yNTU0LDcgKzI1NTQsOCBAQAogCiAvKiBUYXJnZXQgdmVjdG9yIGZvciByZWZyZXNoaW5nIG92ZXJsYXkgbWFwcGVkIHN0YXRlICovCiBzdGF0aWMgdm9pZCBzaW1wbGVfb3ZlcmxheV91cGRhdGUgKHN0cnVjdCBvYmpfc2VjdGlvbiAqKTsKLXZvaWQgKCp0YXJnZXRfb3ZlcmxheV91cGRhdGUpIChzdHJ1Y3Qgb2JqX3NlY3Rpb24gKikgPSBzaW1wbGVfb3ZlcmxheV91cGRhdGU7Cit2b2lkICgqdGFyZ2V0X292ZXJsYXlfdXBkYXRlKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqX3NlY3Rpb24gKikpCis9IHNpbXBsZV9vdmVybGF5X3VwZGF0ZTsKIAogLyogRnVuY3Rpb246IHNlY3Rpb25faXNfb3ZlcmxheSAoU0VDVElPTikKICAgIFJldHVybnMgdHJ1ZSBpZiBTRUNUSU9OIGhhcyBWTUEgbm90IGVxdWFsIHRvIExNQSwgaWUuIApkaWZmIC0tZ2l0IGEvZ2RiL3N5bWZpbGUuaCBiL2dkYi9zeW1maWxlLmgKaW5kZXggNTZjZjQ2NS4uMTc3MDg1YiAxMDA2NDQKLS0tIGEvZ2RiL3N5bWZpbGUuaAorKysgYi9nZGIvc3ltZmlsZS5oCkBAIC04OCwxMyArODgsMTMgQEAKICAgICAgICBjYWxsZWQgZHVyaW5nIHN5bWJvbF9maWxlX2FkZCwgd2hlbiB3ZSBiZWdpbiBkZWJ1Z2dpbmcgYW4gZW50aXJlbHkgbmV3CiAgICAgICAgcHJvZ3JhbS4gKi8KIAotICAgIHZvaWQgKCpzeW1fbmV3X2luaXQpIChzdHJ1Y3Qgb2JqZmlsZSAqKTsKKyAgICB2b2lkICgqc3ltX25ld19pbml0KSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKICAgICAvKiBSZWFkcyBhbnkgaW5pdGlhbCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIGZpbGUsIGFuZCBpbml0aWFsaXplcyB0aGUKICAgICAgICBzdHJ1Y3Qgc3ltX2ZucyBTRiBpbiBwcmVwYXJhdGlvbiBmb3Igc3ltX3JlYWQoKS4gIEl0IGlzIGNhbGxlZCBldmVyeQogICAgICAgIHRpbWUgd2UgcmVhZCBhIHN5bWJvbCBmaWxlIGZvciBhbnkgcmVhc29uLiAqLwogCi0gICAgdm9pZCAoKnN5bV9pbml0KSAoc3RydWN0IG9iamZpbGUgKik7CisgICAgdm9pZCAoKnN5bV9pbml0KSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKICAgICAvKiBzeW1fcmVhZCAob2JqZmlsZSwgbWFpbmxpbmUpCiAgICAgICAgUmVhZHMgYSBzeW1ib2wgZmlsZSBpbnRvIGEgcHN5bXRhYiAob3IgcG9zc2libHkgYSBzeW10YWIpLgpAQCAtMTA0LDEyICsxMDQsMTIgQEAKICAgICAgICBzeW1ib2wgZmlsZSAoZS5nLiBzaGFyZWQgbGlicmFyeSBvciBkeW5hbWljYWxseSBsb2FkZWQgZmlsZSkKICAgICAgICBpcyBiZWluZyByZWFkLiAgKi8KIAotICAgIHZvaWQgKCpzeW1fcmVhZCkgKHN0cnVjdCBvYmpmaWxlICosIGludCk7CisgICAgdm9pZCAoKnN5bV9yZWFkKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKIAogICAgIC8qIENhbGxlZCB3aGVuIHdlIGFyZSBmaW5pc2hlZCB3aXRoIGFuIG9iamZpbGUuICBTaG91bGQgZG8gYWxsIGNsZWFudXAKICAgICAgICB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIHRoZSBwYXJ0aWN1bGFyIG9iamZpbGUuICovCiAKLSAgICB2b2lkICgqc3ltX2ZpbmlzaCkgKHN0cnVjdCBvYmpmaWxlICopOworICAgIHZvaWQgKCpzeW1fZmluaXNoKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CiAKICAgICAvKiBUaGlzIGZ1bmN0aW9uIHByb2R1Y2VzIGEgZmlsZS1kZXBlbmRlbnQgc2VjdGlvbl9vZmZzZXRzIHN0cnVjdHVyZSwKICAgICAgICBhbGxvY2F0ZWQgaW4gdGhlIG9iamZpbGUncyBzdG9yYWdlLCBhbmQgYmFzZWQgb24gdGhlIHBhcmFtZXRlci4KQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAgIGEgc3RyaW5nLCB3aGVyZSBOVUxMIG1lYW5zIHRoZSBkZWZhdWx0LCBhbmQgb3RoZXJzIGFyZSBwYXJzZWQgaW4gYSBmaWxlCiAgICAgICAgZGVwZW5kZW50IHdheS4gKi8KIAotICAgIHZvaWQgKCpzeW1fb2Zmc2V0cykgKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX2FkZHJfaW5mbyAqKTsKKyAgICB2b2lkICgqc3ltX29mZnNldHMpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX2FkZHJfaW5mbyAqKSk7CiAKICAgICAvKiBGaW5kcyB0aGUgbmV4dCBzdHJ1Y3Qgc3ltX2Zucy4gIFRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKICAgICAgICBpbiB3aGF0ZXZlciBtb2R1bGUgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIHBvaW50ZWQgdG87IGFuIApkaWZmIC0tZ2l0IGEvZ2RiL3N5bXRhYi5jIGIvZ2RiL3N5bXRhYi5jCmluZGV4IDVmMGU4NGEuLjRlMTU4OTYgMTAwNjQ0Ci0tLSBhL2dkYi9zeW10YWIuYworKysgYi9nZGIvc3ltdGFiLmMKQEAgLTk1NCw3ICs5NTQsNyBAQAogICAgICpzeW10YWIgPSBOVUxMOwogICByZXR1cm4gMDsKIH0KLQkJCQkJCQkJCisKIC8qIExvb2ssIGluIHBhcnRpYWxfc3ltdGFiIFBTVCwgZm9yIHN5bWJvbCBOQU1FLiAgQ2hlY2sgdGhlIGdsb2JhbAogICAgc3ltYm9scyBpZiBHTE9CQUwsIHRoZSBzdGF0aWMgc3ltYm9scyBpZiBub3QgKi8KIApAQCAtOTY1LDIwICs5NjUsMjAgQEAKICAgICAgaW50IGdsb2JhbDsKICAgICAgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlOwogewotICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKnRlbXA7CiAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnN0YXJ0LCAqKnBzeW07CiAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnRvcCwgKipib3R0b20sICoqY2VudGVyOwogICBpbnQgbGVuZ3RoID0gKGdsb2JhbCA/IHBzdC0+bl9nbG9iYWxfc3ltcyA6IHBzdC0+bl9zdGF0aWNfc3ltcyk7CiAgIGludCBkb19saW5lYXJfc2VhcmNoID0gMTsKLSAgCisKICAgaWYgKGxlbmd0aCA9PSAwKQogICAgIHsKICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgfQorCiAgIHN0YXJ0ID0gKGdsb2JhbCA/CiAJICAgcHN0LT5vYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzdC0+Z2xvYmFsc19vZmZzZXQgOgogCSAgIHBzdC0+b2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwc3QtPnN0YXRpY3Nfb2Zmc2V0KTsKLSAgCisKICAgaWYgKGdsb2JhbCkJCQkvKiBUaGlzIG1lYW5zIHdlIGNhbiB1c2UgYSBiaW5hcnkgc2VhcmNoLiAqLwogICAgIHsKICAgICAgIGRvX2xpbmVhcl9zZWFyY2ggPSAwOwpAQCAtOTk2LDcgKzk5Niw5IEBACiAJICBpZiAoIShjZW50ZXIgPCB0b3ApKQogCSAgICBhYm9ydCAoKTsKIAkgIGlmICghZG9fbGluZWFyX3NlYXJjaAotCSAgICAgICYmIChTWU1CT0xfTEFOR1VBR0UgKCpjZW50ZXIpID09IGxhbmd1YWdlX2phdmEpKQorCSAgICAgICYmIChTWU1CT0xfTEFOR1VBR0UgKCpjZW50ZXIpID09IGxhbmd1YWdlX2NwbHVzCisJCSAgfHwgU1lNQk9MX0xBTkdVQUdFICgqY2VudGVyKSA9PSBsYW5ndWFnZV9qYXZhCisJICAgICAgKSkKIAkgICAgewogCSAgICAgIGRvX2xpbmVhcl9zZWFyY2ggPSAxOwogCSAgICB9CkBAIC0xMDExLDE1ICsxMDEzLDExIEBACiAJfQogICAgICAgaWYgKCEodG9wID09IGJvdHRvbSkpCiAJYWJvcnQgKCk7Ci0KLSAgICAgIC8qIGRqYiAtIDIwMDAtMDYtMDMgLSBVc2UgU1lNQk9MX01BVENIRVNfTkFNRSwgbm90IGEgc3RyY21wLCBzbwotCSB3ZSBkb24ndCBoYXZlIHRvIGZvcmNlIGEgbGluZWFyIHNlYXJjaCBvbiBDKysuIFByb2JhYmx5IGhvbGRzIHRydWUKLQkgZm9yIEpBVkEgYXMgd2VsbCwgbm8gd2F5IHRvIGNoZWNrLiovCi0gICAgICB3aGlsZSAoU1lNQk9MX01BVENIRVNfTkFNRSAoKnRvcCxuYW1lKSkKKyAgICAgIHdoaWxlIChTVFJFUSAoU1lNQk9MX05BTUUgKCp0b3ApLCBuYW1lKSkKIAl7CiAJICBpZiAoU1lNQk9MX05BTUVTUEFDRSAoKnRvcCkgPT0gbmFtZXNwYWNlKQogCSAgICB7Ci0JCSAgcmV0dXJuICgqdG9wKTsKKwkgICAgICByZXR1cm4gKCp0b3ApOwogCSAgICB9CiAJICB0b3ArKzsKIAl9CkBAIC0xMDI5LDcgKzEwMjcsNyBAQAogICAgICB3ZSBzaG91bGQgYWxzbyBkbyBhIGxpbmVhciBzZWFyY2guICovCiAKICAgaWYgKGRvX2xpbmVhcl9zZWFyY2gpCi0gICAgewkJCQorICAgIHsKICAgICAgIGZvciAocHN5bSA9IHN0YXJ0OyBwc3ltIDwgc3RhcnQgKyBsZW5ndGg7IHBzeW0rKykKIAl7CiAJICBpZiAobmFtZXNwYWNlID09IFNZTUJPTF9OQU1FU1BBQ0UgKCpwc3ltKSkKQEAgLTM1NjYsMTkgKzM1NjQsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQKLWRvX2ZyZWVfc2VhcmNoX3N5bWJvbHNfY2xlYW51cCAodm9pZCAqc3ltYm9scykKLXsKLSAgZnJlZV9zZWFyY2hfc3ltYm9scyAoc3ltYm9scyk7Ci19Ci0KLXN0cnVjdCBjbGVhbnVwICoKLW1ha2VfY2xlYW51cF9mcmVlX3NlYXJjaF9zeW1ib2xzIChzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqc3ltYm9scykKLXsKLSAgcmV0dXJuIG1ha2VfY2xlYW51cCAoZG9fZnJlZV9zZWFyY2hfc3ltYm9sc19jbGVhbnVwLCBzeW1ib2xzKTsKLX0KLQotCiAvKiBTZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgbWF0Y2hlcyB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIFJFR0VYUCwKICAgIHJldHVybmluZyB0aGUgcmVzdWx0cyBpbiAqTUFUQ0hFUy4KIApAQCAtMzgxMSw3ICszNzk2LDggQEAKIAkJICBpZiAodGFpbCA9PSBOVUxMKQogCQkgICAgewogCQkgICAgICBzciA9IHBzcjsKLQkJICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMgKHNyKTsKKwkJICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpCisJCQkJCQlmcmVlX3NlYXJjaF9zeW1ib2xzLCBzcik7CiAJCSAgICB9CiAJCSAgZWxzZQogCQkgICAgdGFpbC0+bmV4dCA9IHBzcjsKQEAgLTM4NTUsNyArMzg0MSw4IEBACiAJCQlpZiAodGFpbCA9PSBOVUxMKQogCQkJICB7CiAJCQkgICAgc3IgPSBwc3I7Ci0JCQkgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMgKHNyKTsKKwkJCSAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykKKwkJCQkJCSAgZnJlZV9zZWFyY2hfc3ltYm9scywgJnNyKTsKIAkJCSAgfQogCQkJZWxzZQogCQkJICB0YWlsLT5uZXh0ID0gcHNyOwpAQCAtMzk3MCw3ICszOTU3LDcgQEAKIAogICAvKiBtdXN0IG1ha2Ugc3VyZSB0aGF0IGlmIHdlJ3JlIGludGVycnVwdGVkLCBzeW1ib2xzIGdldHMgZnJlZWQgKi8KICAgc2VhcmNoX3N5bWJvbHMgKHJlZ2V4cCwga2luZCwgMCwgKGNoYXIgKiopIE5VTEwsICZzeW1ib2xzKTsKLSAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMgKHN5bWJvbHMpOworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9zZWFyY2hfc3ltYm9scywgc3ltYm9scyk7CiAKICAgcHJpbnRmX2ZpbHRlcmVkIChyZWdleHAKIAkJICAgPyAiQWxsICVzcyBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb24gXCIlc1wiOlxuIgpAQCAtNDAyMCw3ICs0MDA3LDYgQEAKICAgc3ltdGFiX3N5bWJvbF9pbmZvIChyZWdleHAsIEZVTkNUSU9OU19OQU1FU1BBQ0UsIGZyb21fdHR5KTsKIH0KIAotCiBzdGF0aWMgdm9pZAogdHlwZXNfaW5mbyAocmVnZXhwLCBmcm9tX3R0eSkKICAgICAgY2hhciAqcmVnZXhwOwpAQCAtNDA1OSw3ICs0MDQ1LDcgQEAKICAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKIAogICBzZWFyY2hfc3ltYm9scyAocmVnZXhwLCBGVU5DVElPTlNfTkFNRVNQQUNFLCAwLCAoY2hhciAqKikgTlVMTCwgJnNzKTsKLSAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMgKHNzKTsKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfc2VhcmNoX3N5bWJvbHMsIHNzKTsKIAogICBmb3IgKHAgPSBzczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKICAgICB7CkBAIC00NjY3LDcgKzQ2NTMsNiBAQAogICBhZGRfaW5mbyAoImZ1bmN0aW9ucyIsIGZ1bmN0aW9uc19pbmZvLAogCSAgICAiQWxsIGZ1bmN0aW9uIG5hbWVzLCBvciB0aG9zZSBtYXRjaGluZyBSRUdFWFAuIik7CiAKLSAgCiAgIC8qIEZJWE1FOiAgVGhpcyBjb21tYW5kIGhhcyBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIHByb2JsZW1zOgogICAgICAxLiAgSXQgcHJpbnRzIGJ1aWx0aW4gdHlwZXMgKGluIGEgdmVyeSBzdHJhbmdlIGFuZCBjb25mdXNpbmcgZmFzaGlvbikuCiAgICAgIDIuICBJdCBkb2Vzbid0IHByaW50IHJpZ2h0LCBlLmcuIHdpdGgKZGlmZiAtLWdpdCBhL2dkYi9zeW10YWIuaCBiL2dkYi9zeW10YWIuaAppbmRleCA3ZmI3OGRiLi4zMzRkMjY2IDEwMDY0NAotLS0gYS9nZGIvc3ltdGFiLmgKKysrIGIvZ2RiL3N5bXRhYi5oCkBAIC0xMDExLDcgKzEwMTEsNyBAQAogICAgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gd2hpY2ggd2lsbCByZWFkIGluIHRoZSBzeW10YWIgY29ycmVzcG9uZGluZyB0bwogICAgICAgIHRoaXMgcHN5bXRhYi4gICovCiAKLSAgICB2b2lkICgqcmVhZF9zeW10YWIpIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKik7CisgICAgdm9pZCAoKnJlYWRfc3ltdGFiKSBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOwogCiAgICAgLyogSW5mb3JtYXRpb24gdGhhdCBsZXRzIHJlYWRfc3ltdGFiKCkgbG9jYXRlIHRoZSBwYXJ0IG9mIHRoZSBzeW1ib2wgdGFibGUKICAgICAgICB0aGF0IHRoaXMgcHN5bXRhYiBjb3JyZXNwb25kcyB0by4gIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJpdmF0ZSB0byB0aGUKQEAgLTEwNTksMTEgKzEwNTksMTAgQEAKICAgIHN0eWxlLCB1c2luZyB0aHVua3MgKHdoZXJlICckJyBpcyByZWFsbHkgQ1BMVVNfTUFSS0VSKS4gKi8KIAogI2RlZmluZSBWVEJMX1BSRUZJWF9QKE5BTUUpIFwKLSAgKCgoTkFNRSlbMF0gPT0gJ18nIFwKKyAgKChOQU1FKVswXSA9PSAnXycgXAogICAgJiYgKCgoTkFNRSlbMV0gPT0gJ1YnICYmIChOQU1FKVsyXSA9PSAnVCcpIFwKICAgICAgICB8fCAoKE5BTUUpWzFdID09ICd2JyAmJiAoTkFNRSlbMl0gPT0gJ3QnKSkgXAotICAgJiYgaXNfY3BsdXNfbWFya2VyICgoTkFNRSlbM10pKSB8fCAoKE5BTUUpWzBdPT0nXycgJiYgKE5BTUUpWzFdPT0nXycgXAotICAgJiYgKE5BTUUpWzJdPT0ndicgJiYgKE5BTUUpWzNdPT0ndCcgJiYgKE5BTUUpWzRdPT0nXycpKQorICAgJiYgaXNfY3BsdXNfbWFya2VyICgoTkFNRSlbM10pKQogCiAvKiBNYWNybyB0aGF0IHlpZWxkcyBub24temVybyB2YWx1ZSBpZmYgTkFNRSBpcyB0aGUgcHJlZml4IGZvciBDKysgZGVzdHJ1Y3RvcgogICAgbmFtZXMuICBOb3RlIHRoYXQgdGhpcyBtYWNybyBpcyBnKysgc3BlY2lmaWMgKEZJWE1FKS4gICovCkBAIC0xNDQyLDYgKzE0NDEsNSBAQAogZXh0ZXJuIHZvaWQgc2VhcmNoX3N5bWJvbHMgKGNoYXIgKiwgbmFtZXNwYWNlX2VudW0sIGludCwgY2hhciAqKiwKIAkJCSAgICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqKik7CiBleHRlcm4gdm9pZCBmcmVlX3NlYXJjaF9zeW1ib2xzIChzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqKTsKLWV4dGVybiBzdHJ1Y3QgY2xlYW51cCAqbWFrZV9jbGVhbnVwX2ZyZWVfc2VhcmNoX3N5bWJvbHMgKHN0cnVjdCBzeW1ib2xfc2VhcmNoICopOwogCiAjZW5kaWYgLyogIWRlZmluZWQoU1lNVEFCX0gpICovCmRpZmYgLS1naXQgYS9nZGIvdGFyZ2V0LmMgYi9nZGIvdGFyZ2V0LmMKaW5kZXggYjk5MDU1ZC4uZTEwMjFkOCAxMDA2NDQKLS0tIGEvZ2RiL3RhcmdldC5jCisrKyBiL2dkYi90YXJnZXQuYwpAQCAtMjEyNiw3ICsyMTI2LDcgQEAKIH0KIAwKIC8qIFJldHVybnMgemVybyB0byBsZWF2ZSB0aGUgaW5mZXJpb3IgYWxvbmUsIG9uZSB0byBpbnRlcnJ1cHQgaXQuICAqLwotaW50ICgqdGFyZ2V0X2FjdGl2aXR5X2Z1bmN0aW9uKSAodm9pZCk7CitpbnQgKCp0YXJnZXRfYWN0aXZpdHlfZnVuY3Rpb24pIFBBUkFNUyAoKHZvaWQpKTsKIGludCB0YXJnZXRfYWN0aXZpdHlfZmQ7CiAMCiAvKiBDb252ZXJ0IGEgbm9ybWFsIHByb2Nlc3MgSUQgdG8gYSBzdHJpbmcuICBSZXR1cm5zIHRoZSBzdHJpbmcgaW4gYSBzdGF0aWMKZGlmZiAtLWdpdCBhL2dkYi90YXJnZXQuaCBiL2dkYi90YXJnZXQuaAppbmRleCA1YzY1MTQ5Li5iZmI0OGZhIDEwMDY0NAotLS0gYS9nZGIvdGFyZ2V0LmgKKysrIGIvZ2RiL3RhcmdldC5oCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgIG9uIFRBUkdFVF9BQ1RJVklUWV9GRC4gICovCiBleHRlcm4gaW50IHRhcmdldF9hY3Rpdml0eV9mZDsKIC8qIFJldHVybnMgemVybyB0byBsZWF2ZSB0aGUgaW5mZXJpb3IgYWxvbmUsIG9uZSB0byBpbnRlcnJ1cHQgaXQuICAqLwotZXh0ZXJuIGludCAoKnRhcmdldF9hY3Rpdml0eV9mdW5jdGlvbikgKHZvaWQpOworZXh0ZXJuIGludCAoKnRhcmdldF9hY3Rpdml0eV9mdW5jdGlvbikgUEFSQU1TICgodm9pZCkpOwogDAogc3RydWN0IHRocmVhZF9pbmZvOwkJLyogZndkIGRlY2wgZm9yIHBhcmFtZXRlciBsaXN0IGJlbG93OiAqLwogCkBAIC0zMjcsMTkgKzMyNywxOSBAQAogICAgIGNoYXIgKnRvX2RvYzsJCS8qIERvY3VtZW50YXRpb24uICBEb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nCiAJCQkJICAgbmV3bGluZSwgYW5kIHN0YXJ0cyB3aXRoIGEgb25lLWxpbmUgZGVzY3JpcC0KIAkJCQkgICB0aW9uIChwcm9iYWJseSBzaW1pbGFyIHRvIHRvX2xvbmduYW1lKS4gICovCi0gICAgdm9pZCAoKnRvX29wZW4pIChjaGFyICosIGludCk7Ci0gICAgdm9pZCAoKnRvX2Nsb3NlKSAoaW50KTsKLSAgICB2b2lkICgqdG9fYXR0YWNoKSAoY2hhciAqLCBpbnQpOwotICAgIHZvaWQgKCp0b19wb3N0X2F0dGFjaCkgKGludCk7Ci0gICAgdm9pZCAoKnRvX3JlcXVpcmVfYXR0YWNoKSAoY2hhciAqLCBpbnQpOwotICAgIHZvaWQgKCp0b19kZXRhY2gpIChjaGFyICosIGludCk7Ci0gICAgdm9pZCAoKnRvX3JlcXVpcmVfZGV0YWNoKSAoaW50LCBjaGFyICosIGludCk7Ci0gICAgdm9pZCAoKnRvX3Jlc3VtZSkgKGludCwgaW50LCBlbnVtIHRhcmdldF9zaWduYWwpOwotICAgIGludCAoKnRvX3dhaXQpIChpbnQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqKTsKLSAgICB2b2lkICgqdG9fcG9zdF93YWl0KSAoaW50LCBpbnQpOwotICAgIHZvaWQgKCp0b19mZXRjaF9yZWdpc3RlcnMpIChpbnQpOwotICAgIHZvaWQgKCp0b19zdG9yZV9yZWdpc3RlcnMpIChpbnQpOwotICAgIHZvaWQgKCp0b19wcmVwYXJlX3RvX3N0b3JlKSAodm9pZCk7CisgICAgdm9pZCAoKnRvX29wZW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgdm9pZCAoKnRvX2Nsb3NlKSBQQVJBTVMgKChpbnQpKTsKKyAgICB2b2lkICgqdG9fYXR0YWNoKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICAgIHZvaWQgKCp0b19wb3N0X2F0dGFjaCkgUEFSQU1TICgoaW50KSk7CisgICAgdm9pZCAoKnRvX3JlcXVpcmVfYXR0YWNoKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICAgIHZvaWQgKCp0b19kZXRhY2gpIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgdm9pZCAoKnRvX3JlcXVpcmVfZGV0YWNoKSBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50KSk7CisgICAgdm9pZCAoKnRvX3Jlc3VtZSkgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gdGFyZ2V0X3NpZ25hbCkpOworICAgIGludCAoKnRvX3dhaXQpIFBBUkFNUyAoKGludCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICopKTsKKyAgICB2b2lkICgqdG9fcG9zdF93YWl0KSBQQVJBTVMgKChpbnQsIGludCkpOworICAgIHZvaWQgKCp0b19mZXRjaF9yZWdpc3RlcnMpIFBBUkFNUyAoKGludCkpOworICAgIHZvaWQgKCp0b19zdG9yZV9yZWdpc3RlcnMpIFBBUkFNUyAoKGludCkpOworICAgIHZvaWQgKCp0b19wcmVwYXJlX3RvX3N0b3JlKSBQQVJBTVMgKCh2b2lkKSk7CiAKICAgICAvKiBUcmFuc2ZlciBMRU4gYnl0ZXMgb2YgbWVtb3J5IGJldHdlZW4gR0RCIGFkZHJlc3MgTVlBRERSIGFuZAogICAgICAgIHRhcmdldCBhZGRyZXNzIE1FTUFERFIuICBJZiBXUklURSwgdHJhbnNmZXIgdGhlbSB0byB0aGUgdGFyZ2V0LCBlbHNlCkBAIC0zNTksOCArMzU5LDkgQEAKICAgICAgICB0cmFuc2ZlciByaWdodCBhdCBNRU1BRERSLCBidXQgd2UgY291bGQgdHJhbnNmZXIgYXQgbGVhc3QKICAgICAgICBzb21ldGhpbmcgYXQgTUVNQUREUiArIE4uICAqLwogCi0gICAgaW50ICgqdG9feGZlcl9tZW1vcnkpIChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAotCQkJICAgaW50IGxlbiwgaW50IHdyaXRlLCBzdHJ1Y3QgdGFyZ2V0X29wcyAqIHRhcmdldCk7CisgICAgaW50ICgqdG9feGZlcl9tZW1vcnkpIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCisJCQkJICAgaW50IGxlbiwgaW50IHdyaXRlLAorCQkJCSAgIHN0cnVjdCB0YXJnZXRfb3BzICogdGFyZ2V0KSk7CiAKICNpZiAwCiAgICAgLyogRW5hYmxlIHRoaXMgYWZ0ZXIgNC4xMi4gICovCkBAIC0zNzUsNjIgKzM3Niw2MCBAQAogICAgICAgIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHNldCAqQUREUl9GT1VORCB0byAoQ09SRV9BRERSKTAgYW5kCiAgICAgICAgcmV0dXJuLiAgKi8KIAotICAgIHZvaWQgKCp0b19zZWFyY2gpIChpbnQgbGVuLCBjaGFyICpkYXRhLCBjaGFyICptYXNrLAotCQkgICAgICAgQ09SRV9BRERSIHN0YXJ0YWRkciwgaW50IGluY3JlbWVudCwKLQkJICAgICAgIENPUkVfQUREUiBsb3JhbmdlLCBDT1JFX0FERFIgaGlyYW5nZSwKLQkJICAgICAgIENPUkVfQUREUiAqIGFkZHJfZm91bmQsIGNoYXIgKmRhdGFfZm91bmQpOworICAgIHZvaWQgKCp0b19zZWFyY2gpIFBBUkFNUyAoKGludCBsZW4sIGNoYXIgKmRhdGEsIGNoYXIgKm1hc2ssCisJCQkgICAgICAgQ09SRV9BRERSIHN0YXJ0YWRkciwgaW50IGluY3JlbWVudCwKKwkJCSAgICAgICBDT1JFX0FERFIgbG9yYW5nZSwgQ09SRV9BRERSIGhpcmFuZ2UsCisJCQkgICAgICAgQ09SRV9BRERSICogYWRkcl9mb3VuZCwgY2hhciAqZGF0YV9mb3VuZCkpOwogCiAjZGVmaW5lCXRhcmdldF9zZWFyY2gobGVuLCBkYXRhLCBtYXNrLCBzdGFydGFkZHIsIGluY3JlbWVudCwgbG9yYW5nZSwgaGlyYW5nZSwgYWRkcl9mb3VuZCwgZGF0YV9mb3VuZCkJXAogICAgICgqY3VycmVudF90YXJnZXQudG9fc2VhcmNoKSAobGVuLCBkYXRhLCBtYXNrLCBzdGFydGFkZHIsIGluY3JlbWVudCwgXAogCQkJCSBsb3JhbmdlLCBoaXJhbmdlLCBhZGRyX2ZvdW5kLCBkYXRhX2ZvdW5kKQogI2VuZGlmCQkJCS8qIDAgKi8KIAotICAgIHZvaWQgKCp0b19maWxlc19pbmZvKSAoc3RydWN0IHRhcmdldF9vcHMgKik7Ci0gICAgaW50ICgqdG9faW5zZXJ0X2JyZWFrcG9pbnQpIChDT1JFX0FERFIsIGNoYXIgKik7Ci0gICAgaW50ICgqdG9fcmVtb3ZlX2JyZWFrcG9pbnQpIChDT1JFX0FERFIsIGNoYXIgKik7Ci0gICAgdm9pZCAoKnRvX3Rlcm1pbmFsX2luaXQpICh2b2lkKTsKLSAgICB2b2lkICgqdG9fdGVybWluYWxfaW5mZXJpb3IpICh2b2lkKTsKLSAgICB2b2lkICgqdG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0KSAodm9pZCk7Ci0gICAgdm9pZCAoKnRvX3Rlcm1pbmFsX291cnMpICh2b2lkKTsKLSAgICB2b2lkICgqdG9fdGVybWluYWxfaW5mbykgKGNoYXIgKiwgaW50KTsKLSAgICB2b2lkICgqdG9fa2lsbCkgKHZvaWQpOwotICAgIHZvaWQgKCp0b19sb2FkKSAoY2hhciAqLCBpbnQpOwotICAgIGludCAoKnRvX2xvb2t1cF9zeW1ib2wpIChjaGFyICosIENPUkVfQUREUiAqKTsKLSAgICB2b2lkICgqdG9fY3JlYXRlX2luZmVyaW9yKSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiopOwotICAgIHZvaWQgKCp0b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpIChpbnQpOwotICAgIHZvaWQgKCp0b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yKSAoaW50KTsKLSAgICB2b2lkICgqdG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcikgKGludCwgaW50ICopOwotICAgIHZvaWQgKCp0b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSkgKHZvaWQpOwotICAgIGludCAoKnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQpIChpbnQpOwotICAgIGludCAoKnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQpIChpbnQpOwotICAgIGludCAoKnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50KSAoaW50KTsKLSAgICBpbnQgKCp0b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCkgKGludCk7Ci0gICAgaW50ICgqdG9faGFzX2ZvcmtlZCkgKGludCwgaW50ICopOwotICAgIGludCAoKnRvX2hhc192Zm9ya2VkKSAoaW50LCBpbnQgKik7Ci0gICAgaW50ICgqdG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjKSAodm9pZCk7Ci0gICAgdm9pZCAoKnRvX3Bvc3RfZm9sbG93X3Zmb3JrKSAoaW50LCBpbnQsIGludCwgaW50KTsKLSAgICBpbnQgKCp0b19pbnNlcnRfZXhlY19jYXRjaHBvaW50KSAoaW50KTsKLSAgICBpbnQgKCp0b19yZW1vdmVfZXhlY19jYXRjaHBvaW50KSAoaW50KTsKLSAgICBpbnQgKCp0b19oYXNfZXhlY2QpIChpbnQsIGNoYXIgKiopOwotICAgIGludCAoKnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwpICh2b2lkKTsKLSAgICBpbnQgKCp0b19oYXNfc3lzY2FsbF9ldmVudCkgKGludCwgZW51bSB0YXJnZXRfd2FpdGtpbmQgKiwgaW50ICopOwotICAgIGludCAoKnRvX2hhc19leGl0ZWQpIChpbnQsIGludCwgaW50ICopOwotICAgIHZvaWQgKCp0b19tb3Vybl9pbmZlcmlvcikgKHZvaWQpOwotICAgIGludCAoKnRvX2Nhbl9ydW4pICh2b2lkKTsKLSAgICB2b2lkICgqdG9fbm90aWNlX3NpZ25hbHMpIChpbnQgcGlkKTsKLSAgICBpbnQgKCp0b190aHJlYWRfYWxpdmUpIChpbnQgcGlkKTsKLSAgICB2b2lkICgqdG9fZmluZF9uZXdfdGhyZWFkcykgKHZvaWQpOwotICAgIGNoYXIgKigqdG9fcGlkX3RvX3N0cikgKGludCk7Ci0gICAgY2hhciAqKCp0b19leHRyYV90aHJlYWRfaW5mbykgKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKLSAgICB2b2lkICgqdG9fc3RvcCkgKHZvaWQpOwotICAgIGludCAoKnRvX3F1ZXJ5KSAoaW50IC8qY2hhciAqLyAsIGNoYXIgKiwgY2hhciAqLCBpbnQgKik7CisgICAgdm9pZCAoKnRvX2ZpbGVzX2luZm8pIFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKyAgICBpbnQgKCp0b19pbnNlcnRfYnJlYWtwb2ludCkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKyAgICBpbnQgKCp0b19yZW1vdmVfYnJlYWtwb2ludCkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKyAgICB2b2lkICgqdG9fdGVybWluYWxfaW5pdCkgUEFSQU1TICgodm9pZCkpOworICAgIHZvaWQgKCp0b190ZXJtaW5hbF9pbmZlcmlvcikgUEFSQU1TICgodm9pZCkpOworICAgIHZvaWQgKCp0b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQpIFBBUkFNUyAoKHZvaWQpKTsKKyAgICB2b2lkICgqdG9fdGVybWluYWxfb3VycykgUEFSQU1TICgodm9pZCkpOworICAgIHZvaWQgKCp0b190ZXJtaW5hbF9pbmZvKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICAgIHZvaWQgKCp0b19raWxsKSBQQVJBTVMgKCh2b2lkKSk7CisgICAgdm9pZCAoKnRvX2xvYWQpIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgaW50ICgqdG9fbG9va3VwX3N5bWJvbCkgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIgKikpOworICAgIHZvaWQgKCp0b19jcmVhdGVfaW5mZXJpb3IpIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqKSk7CisgICAgdm9pZCAoKnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvcikgUEFSQU1TICgoaW50KSk7CisgICAgdm9pZCAoKnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IpIFBBUkFNUyAoKGludCkpOworICAgIHZvaWQgKCp0b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yKSBQQVJBTVMgKChpbnQsIGludCAqKSk7CisgICAgdm9pZCAoKnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lKSBQQVJBTVMgKCh2b2lkKSk7CisgICAgaW50ICgqdG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCkgUEFSQU1TICgoaW50KSk7CisgICAgaW50ICgqdG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCkgUEFSQU1TICgoaW50KSk7CisgICAgaW50ICgqdG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICAgIGludCAoKnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50KSBQQVJBTVMgKChpbnQpKTsKKyAgICBpbnQgKCp0b19oYXNfZm9ya2VkKSBQQVJBTVMgKChpbnQsIGludCAqKSk7CisgICAgaW50ICgqdG9faGFzX3Zmb3JrZWQpIFBBUkFNUyAoKGludCwgaW50ICopKTsKKyAgICBpbnQgKCp0b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMpIFBBUkFNUyAoKHZvaWQpKTsKKyAgICB2b2lkICgqdG9fcG9zdF9mb2xsb3dfdmZvcmspIFBBUkFNUyAoKGludCwgaW50LCBpbnQsIGludCkpOworICAgIGludCAoKnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICAgIGludCAoKnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICAgIGludCAoKnRvX2hhc19leGVjZCkgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisgICAgaW50ICgqdG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCkgUEFSQU1TICgodm9pZCkpOworICAgIGludCAoKnRvX2hhc19zeXNjYWxsX2V2ZW50KSBQQVJBTVMgKChpbnQsIGVudW0gdGFyZ2V0X3dhaXRraW5kICosIGludCAqKSk7CisgICAgaW50ICgqdG9faGFzX2V4aXRlZCkgUEFSQU1TICgoaW50LCBpbnQsIGludCAqKSk7CisgICAgdm9pZCAoKnRvX21vdXJuX2luZmVyaW9yKSBQQVJBTVMgKCh2b2lkKSk7CisgICAgaW50ICgqdG9fY2FuX3J1bikgUEFSQU1TICgodm9pZCkpOworICAgIHZvaWQgKCp0b19ub3RpY2Vfc2lnbmFscykgUEFSQU1TICgoaW50IHBpZCkpOworICAgIGludCAoKnRvX3RocmVhZF9hbGl2ZSkgUEFSQU1TICgoaW50IHBpZCkpOworICAgIHZvaWQgKCp0b19maW5kX25ld190aHJlYWRzKSBQQVJBTVMgKCh2b2lkKSk7CisgICAgY2hhciAqKCp0b19waWRfdG9fc3RyKSBQQVJBTVMgKChpbnQpKTsKKyAgICBjaGFyICooKnRvX2V4dHJhX3RocmVhZF9pbmZvKSBQQVJBTVMgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikpOworICAgIHZvaWQgKCp0b19zdG9wKSBQQVJBTVMgKCh2b2lkKSk7CisgICAgaW50ICgqdG9fcXVlcnkpIFBBUkFNUyAoKGludCAvKmNoYXIgKi8gLCBjaGFyICosIGNoYXIgKiwgaW50ICopKTsKICAgICB2b2lkICgqdG9fcmNtZCkgKGNoYXIgKmNvbW1hbmQsIHN0cnVjdCB1aV9maWxlICpvdXRwdXQpOwotICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKigqdG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjaykgKGVudW0KLQkJCQkJCQkgICAgIGV4Y2VwdGlvbl9ldmVudF9raW5kLAotCQkJCQkJCSAgICAgaW50KTsKLSAgICBzdHJ1Y3QgZXhjZXB0aW9uX2V2ZW50X3JlY29yZCAqKCp0b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQpICh2b2lkKTsKLSAgICBjaGFyICooKnRvX3BpZF90b19leGVjX2ZpbGUpIChpbnQgcGlkKTsKLSAgICBjaGFyICooKnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSkgKGNoYXIgKik7CisgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKCp0b19lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKSBQQVJBTVMgKChlbnVtIGV4Y2VwdGlvbl9ldmVudF9raW5kLCBpbnQpKTsKKyAgICBzdHJ1Y3QgZXhjZXB0aW9uX2V2ZW50X3JlY29yZCAqKCp0b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQpIFBBUkFNUyAoKHZvaWQpKTsKKyAgICBjaGFyICooKnRvX3BpZF90b19leGVjX2ZpbGUpIFBBUkFNUyAoKGludCBwaWQpKTsKKyAgICBjaGFyICooKnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSkgUEFSQU1TICgoY2hhciAqKSk7CiAgICAgZW51bSBzdHJhdGEgdG9fc3RyYXR1bTsKICAgICBzdHJ1Y3QgdGFyZ2V0X29wcwogICAgICAqRE9OVF9VU0U7CQkJLyogZm9ybWVybHkgdG9fbmV4dCAqLwpAQCAtMTEwMiw3ICsxMTAxLDcgQEAKICAqIGNhbiByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIChzb21ldGhpbmcgbGlrZSB3aXRoIHNpZ25hbCBoYW5kbGVycykuCiAgKi8KIAotZXh0ZXJuIHZvaWQgKCp0YXJnZXRfbmV3X29iamZpbGVfaG9vaykgKHN0cnVjdCBvYmpmaWxlICopOworZXh0ZXJuIHZvaWQgKCp0YXJnZXRfbmV3X29iamZpbGVfaG9vaykgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOwogCiAjaWZuZGVmIHRhcmdldF9waWRfb3JfdGlkX3RvX3N0cgogI2RlZmluZSB0YXJnZXRfcGlkX29yX3RpZF90b19zdHIoSUQpIFwKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvZ2RiL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKaW5kZXggY2ZlNTRjZS4uYjZmNGVlNSAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKQEAgLTEsMTQgKzEsMyBAQAotMjAwMC0wNi0wMyAgRGFuaWVsIEJlcmxpbiAgPGRhbkBjZ3NvZnR3YXJlLmNvbT4KLQotCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwIChkb190ZXN0cyk6IE1ha2UgYWxsIG9mIHRoZXNlIHdvcmsgdW5kZXIKLQlnKyssIGFuZCBzdG9wIHNraXBwaW5nIHRoZW0uIAotCi0JKiBnZGIuYysrL25hbWVzcGFjZS5leHA6IE1vdmUgZnJvbSBnZGIuaHAvZ2RiLmFDQyB0byBoZXJlLCBtYWtlIGl0Ci0Jd29yayB1bmRlciBnKysuCi0KLQkqIGdkYi5jKysvbWlzYy5jYzogRml4IGFtYmlndW91cyBpbml0aWFsaXphdGlvbiB3aXRoIGNvcnJlY3QgaW5pdGlhbGl6YXRpb24uCi0JCi0KIDIwMDAtMDUtMTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBzZWFkb2cuY3lnbnVzLmNvbT4KIAogCSogZ2RiLmJhc2UvYW5ub3RhMS5leHAgKGFubm90YXRlLXNpZ25hbC1oYW5kbGVyLWNhbGxlcik6CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvTWFrZWZpbGUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvTWFrZWZpbGUuaW4KaW5kZXggZWU4ZTI2My4uNThlZjk0YiAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL01ha2VmaWxlLmluCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9NYWtlZmlsZS5pbgpAQCAtMyw3ICszLDcgQEAKIAogRVhFQ1VUQUJMRVMgPSBhbWJpZ3VvdXMgYW5ub3RhMiBhbm9uLXVuaW9uIGNwbHVzZnVuY3MgY3R0aWFkZCBcCiAJZGVyaXZhdGlvbiBpbmhlcml0IGxvY2FsIG1lbWJlci1wdHIgbWV0aG9kIG1pc2MgXAotICAgICAgICBvdmVybG9hZCBvdmxkYnJlYWsgcmVmLXR5cCByZWYtdHlwMiB0ZW1wbGF0ZXMgdXNlcmRlZiB2aXJ0ZnVuYyBuYW1lc3BhY2UKKyAgICAgICAgb3ZlcmxvYWQgb3ZsZGJyZWFrIHJlZi10eXAgcmVmLXR5cDIgdGVtcGxhdGVzIHVzZXJkZWYgdmlydGZ1bmMKIAogYWxsOiAKIAlAZWNobyAiTm90aGluZyB0byBiZSBkb25lIGZvciBhbGwuLi4iCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvY3R0aS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvY3R0aS5leHAKaW5kZXggZmIxNmIyMi4uMTM1ZGNmNCAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2N0dGkuZXhwCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jdHRpLmV4cApAQCAtMSw0ICsxLDQgQEAKLWAjIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogCiAjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00MiwxNCArNDIsMTUgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKK2lmIHsgJGdjY19jb21waWxlZCB9IHRoZW4geyBjb250aW51ZSB9CiAKLWlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlMX0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTN9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7Ci0gICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgotfQorI2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlMX0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTN9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisjICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyN9CiAKLSNzZXQgY21kbGluZSAiJENYWF9GT1JfVEFSR0VUICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTF9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlMn0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUzfSAtZyAtbyAke2JpbmZpbGV9Igorc2V0IGNtZGxpbmUgIiRDWFhfRk9SX1RBUkdFVCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUxfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTJ9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlM30gLWcgLW8gJHtiaW5maWxlfSIKIAotI3JlbW90ZV9leGVjIGJ1aWxkICRjbWRsaW5lCityZW1vdGVfZXhlYyBidWlsZCAkY21kbGluZQogCiBnZGJfZXhpdAogZ2RiX3N0YXJ0CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWlzYy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9taXNjLmNjCmluZGV4IDMwOTA4MDAuLjdjMjEyY2MgMTAwNjQ0Ci0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9taXNjLmNjCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9taXNjLmNjCkBAIC0yMTUsMTYgKzIxNSw2IEBACiAKICAgLy8gPz8/Pz8gPSAxMTsgIChnX0QuQTo6YSA9IDExOyBpcyBhbWJpZ3VvdXMpCiAgIC8vID8/Pz8/ID0gMTI7ICAoZ19ELkE6OnggPSAxMjsgaXMgYW1iaWd1b3VzKQotLyogZGpiIDYtMy0yMDAwCi0KLQlUaGlzIHNob3VsZCB0YWtlIGNhcmUgb2YgaXQuIFJhdGhlciB0aGFuIHRyeSB0byBpbml0aWFsaXplIHVzaW5nIGFuIGFtYmlndW91cwotCWNvbnN0cnVjdCwgdXNlIDIgdW5hbWJpZ3VvdXMgb25lcyBmb3IgZWFjaC4gU2luY2UgdGhlIGFtYmlndW91cyBhL3ggbWVtYmVyIGlzCi0JY29taW5nIGZyb20gQywgYW5kIEIsIGluaXRpYWxpemUgRCdzIEM6OmEsIGFuZCBCOjphLCBhbmQgRCdzIEM6OnggYW5kIEI6OnguCi0gKi8KLSAgZ19ELkM6OmEgPSAxNTsKLSAgZ19ELkM6OnggPSAxMjsKLSAgZ19ELkI6OmEgPSAxMTsKLSAgZ19ELkI6OnggPSAxMjsKICAgZ19ELkI6OmIgPSAxMzsKICAgZ19ELkI6OnggPSAxNDsKICAgLy8gPz8/Pz8gPSAxNTsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9uYW1lc3BhY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL25hbWVzcGFjZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOThjOTAuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL25hbWVzcGFjZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1Ci0KLSMgdGVzdHMgZm9yIG5hbWVzcGFjZXMKLSMgV3JpdHRlbiBieSBTYXRpc2ggUGFpIDxwYWlAYXBvbGxvLmhwLmNvbT4gMTk5Ny0wNy0yMwotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCi0KLSMgTm90ZTogVGhlc2UgdGVzdHMgYXJlIGdlYXJlZCB0byB0aGUgSFAgYUNDIGNvbXBpbGVyLAotIyB3aGljaCBoYXMgYW4gaWRpb3N5bmNyYXRpYyB3YXkgb2YgZW1pdHRpbmcgZGVidWcgaW5mbwotIyBmb3IgbmFtZXNwYWNlcy4KLSMgTm90ZTogQXMgb2YgMjAwMC0wNi0wMywgdGhlc2UgcGFzcyB1bmRlciBnKysgLSBkamIKLQotCi1pZiAkdHJhY2VsZXZlbCB0aGVuIHsKLSAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCi0gICAgICAgIH0KLQotc2V0IHBybXNfaWQgMAotc2V0IGJ1Z19pZCAwCi0KLQotc2V0IHRlc3RmaWxlICJuYW1lc3BhY2UiCi1zZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYwotc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQotCi1pZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0gewotICAgIHJldHVybiAtMTsKLX0KLQotCi0KLWlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7Ci0gICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhCi11dG9tYXRpY2FsbHkgZmFpbC4iCi19Ci0KLQotCi1nZGJfZXhpdAotZ2RiX3N0YXJ0Ci1nZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKLWdkYl9sb2FkICR7YmluZmlsZX0KLQotCi0jCi0jIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCi0jCi1pZiAhW3J1bnRvX21haW5dIHRoZW4gewotICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCi0gICAgY29udGludWUKLX0KLQotc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgotICAgIHNlbmRfZ2RiICJjb250XG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0gICAgICAgIC1yZSAiQnJlYWsuKiBtYXJrZXIxIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qJGdkYl9wcm9tcHQgJCIgewotICAgICAgICAgICAgc2VuZF9nZGIgInVwXG4iCi0gICAgICAgICAgICBnZGJfZXhwZWN0IHsKLSAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJ1cCBmcm9tIG1hcmtlcjEiIH0KLSAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidXAgZnJvbSBtYXJrZXIxIiB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIG1hcmtlcjEiICB9Ci0gICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gbWFya2VyMSIgIH0KLSAgICB9Ci0KLSMgQWNjZXNzIGEgZGF0YSBpdGVtIGluc2lkZSBhIG5hbWVzcGFjZSB1c2luZyBjb2xvbnMgYW5kCi0jIHNpbmdsZSBxdW90ZXMgOi0oCi0KLXNlbmRfZ2RiICJwcmludCAnQUFBOjpjJ1xuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxcJFxbMC05XF0qID0gMCAnXFxcXDAwMCdcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCAnQUFBOjpjJyIgfQotICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgJ0FBQTo6YyciIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgJ0FBQTo6YyciIH0KLX0KLQotIyBBbiBvYmplY3QgZGVjbGFyZWQgdXNpbmcgInVzaW5nIi4KLQotc2VuZF9nZGIgInByaW50IGluYVxuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxcJFxbMC05XF0rID0ge3h4ID0gMzN9LiokZ2RiX3Byb21wdCAkIiB7Ci0gICAgICBwYXNzICJwcmludCBpbmEiCi0gICB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBpbmEiIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgaW5hIiB9Ci19Ci0KLXNlbmRfZ2RiICJwdHlwZSBpbmFcbiIKLWdkYl9leHBlY3QgewotICAgLXJlICJ0eXBlID0gY2xhc3MgKEFBQTo6fClpbkEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgeHg7XHJcblxbIFxdKlxyXG5cWyBcXSouKmludCBmdW1cXChpbnRcXCk7XHJcblx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKLSAgICAgICBwYXNzICJwdHlwZSBpbmEiCi0gICB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBpbmEiIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHR5cGUgaW5hIiB9Ci19Ci0KLSMgQ2hlY2sgYWxsIGZ1bmN0aW9ucyBhcmUga25vd24gdG8gR0RCCi0KLXNldHVwX3hmYWlsIGhwcGEqLSotKjExKiBDTExiczE0ODY5Ci1zZW5kX2dkYiAiaW5mbyBmdW5jIHh5enFcbiIKLWdkYl9leHBlY3QgewotICAgLXJlICJBbGwgZnVuY3Rpb25zLipGaWxlLipuYW1lc3BhY2UuY2M6XHJcbmludCBBQUE6OkFfeHl6cVxcKGludFxcKTtcclxuaW50IEJCQjo6Ql94eXpxXFwoaW50XFwpO1xyXG5jaGFyIEFBQTo6eHl6cVxcKGNoYXJcXCk7XHJcbmNoYXIgQkJCOjp4eXpxXFwoY2hhclxcKTtcclxuY2hhciBCQkI6OkNDQzo6eHl6cVxcKGNoYXJcXCk7XHJcbmNoYXIgQkJCOjpDbGFzczo6eHl6cVxcKGNoYXJcXCk7XHJcbiRnZGJfcHJvbXB0ICQiIHsKLSAgICAgICBwYXNzICJpbmZvIGZ1bmMgeHl6cSIKLSAgIH0gICAgCi0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbmZvIGZ1bmMgeHl6cSIgfQotICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBpbmZvIGZ1bmMgeHl6cSIgfQotfQotCi0jIENhbGwgYSBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZQotCi1zZW5kX2dkYiAicHJpbnQgJ0FBQTo6eHl6cScoJ3gnKVxuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxcJFxbMC05XF0qID0gOTcgJ2EnXHJcbiRnZGJfcHJvbXB0ICQiIHsKLSAgICAgICBwYXNzICJwcmludCAnQUFBOjp4eXpxJygneCcpIgotICAgfQotICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgJ0FBQTo6eHl6cScoJ3gnKSIgfQotICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAnQUFBOjp4eXpxJygneCcpIiB9Ci19Ci0gICAgICAgCi0jIEJyZWFrIG9uIGEgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2UKLQotc2VuZF9nZGIgImJyZWFrIEFBQTo6eHl6cVxuIgotZ2RiX2V4cGVjdCB7Ci0gICAgLXJlICJCcmVha3BvaW50LiphdCAkaGV4OiBmaWxlLipuYW1lc3BhY2UuY2MsIGxpbmUgNDJcXC5cclxuJGdkYl9wcm9tcHQgJCIgewotICAgICAgICAgcGFzcyAiYnJlYWsgQUFBOjp4eXpxIgotICAgIH0gICAgCi0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBBQUE6Onh5enEiIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYnJlYWsgQUFBOjp4eXpxIiB9Ci19Ci0KLSMgQ2FsbCBhIGZ1bmN0aW9uIGluIGEgbmVzdGVkIG5hbWVzcGFjZQotCi1zZW5kX2dkYiAicHJpbnQgJ0JCQjo6Q0NDOjp4eXpxJygneCcpXG4iCi1nZGJfZXhwZWN0IHsKLSAgIC1yZSAiXFwkXFswLTlcXSogPSAxMjIgJ3onXHJcbiRnZGJfcHJvbXB0ICQiIHsKLSAgICAgICBwYXNzICJwcmludCAnQkJCOjpDQ0M6Onh5enEnKCd4JykiCi0gICB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAnQkJCOjpDQ0M6Onh5enEnKCd4JykiIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgJ0JCQjo6Q0NDOjp4eXpxJygneCcpIiB9Ci19Ci0gICAgICAgCi0jIEJyZWFrIG9uIGEgZnVuY3Rpb24gaW4gYSBuZXN0ZWQgbmFtZXNwYWNlCi0KLXNlbmRfZ2RiICJicmVhayBCQkI6OkNDQzo6eHl6cVxuIgotZ2RiX2V4cGVjdCB7Ci0gICAgLXJlICJCcmVha3BvaW50LiphdCAkaGV4OiBmaWxlLipuYW1lc3BhY2UuY2MsIGxpbmUgNThcXC5cclxuJGdkYl9wcm9tcHQgJCIgewotICAgICAgICAgcGFzcyAiYnJlYWsgQkJCOjpDQ0M6Onh5enEiCi0gICAgfSAgICAKLSAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImJyZWFrIEJCQjo6Q0NDOjp4eXpxIiB9Ci0gICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJyZWFrIEJCQjo6Q0NDOjp4eXpxIiB9Ci19Ci0KLSMgUHJpbnQgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIGluIGEgY2xhc3MgaW4gYSBuYW1lc3BhY2UKLQotc2VuZF9nZGIgInByaW50ICdCQkI6OkNsYXNzOjp4eXpxJ1xuIgotZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxcJFxbMC05XF0qID0gXHtjaGFyIFxcKChCQkI6OnwpQ2xhc3MgXFwqLCAoY2hhcnxpbnQpXFwpXH0gJGhleCA8QkJCOjpDbGFzczo6eHl6cVxcKGNoYXJcXCk+XHJcbiRnZGJfcHJvbXB0ICQiIHsKLSAgICAgICBwYXNzICJwcmludCAnQkJCOjpDbGFzcyc6Onh5enEiCi0gICB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAnQkJCOjpDbGFzcyc6Onh5enEiIH0KLSAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgJ0JCQjo6Q2xhc3MnOjp4eXpxIiB9Ci19Ci0KLSMgQnJlYWsgb24gYSBmdW5jdGlvbiBpbiBhIGNsYXNzIGluIGEgbmFtZXNwYWNlCi0KLXNlbmRfZ2RiICJicmVhayBCQkI6OkNsYXNzOjp4eXpxXG4iCi1nZGJfZXhwZWN0IHsKLSAgICAtcmUgIkJyZWFrcG9pbnQuKmF0ICRoZXg6IGZpbGUuKm5hbWVzcGFjZS5jYywgbGluZSA2M1xcLlxyXG4kZ2RiX3Byb21wdCAkIiB7Ci0gICAgICAgICBwYXNzICJicmVhayBCQkI6OkNsYXNzOjp4eXpxIgotICAgIH0gICAgCi0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBCQkI6OkNsYXNzOjp4eXpxIiB9Ci0gICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJyZWFrIEJCQjo6Q2xhc3M6Onh5enEiIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3RlbXBsYXRlcy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuY2MKaW5kZXggY2U0NDgxYS4uMWVmMDEwMCAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3RlbXBsYXRlcy5jYworKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdGVtcGxhdGVzLmNjCkBAIC03MTQsOCArNzE0LDggQEAKIAogICAgIC8vIE5ldyB0ZXN0cyBhZGRlZCBoZXJlCiAKLSAgRm9vPGludD4gZmludD17MCwwfTsKLSAgRm9vPGNoYXI+IGZjaGFyPXswLDB9OworICBGb288aW50PiBmaW50OworICBGb288Y2hhcj4gZmNoYXI7CiAgIEZvbzx2b2xhdGlsZSBjaGFyICo+IGZ2cGNoYXIgPSB7MCwgMH07CiAKICAgQmFyPGludCwgMzM+IGJpbnQ7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdGVtcGxhdGVzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwCmluZGV4IDkxYWNjODIuLjViODg3NWUgMTAwNjQ0Ci0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwCkBAIC0yMDksNiArMjA5LDcgQEAKIAogZG9fdGVzdHMKIAoraWYgeyEkaHBfYUNDX2NvbXBpbGVyfSB7Y29udGludWV9CiAKICMgTW9yZSB0ZXN0cyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMsCiAjIHRlbXBsYXRlcyB3aXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zLCBuZXN0ZWQgdGVtcGxhdGVzLCBldGMuCkBAIC0yMTYsMjEgKzIxNyw3IEBACiAjIHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiBtYW5nbGluZwogIyBzY2hlbWVzLiAKICMgQWRkZWQgYnkgU2F0aXNoIFBhaSA8cGFpQGFwb2xsby5ocC5jb20+IDE5OTctMDktMjUgCi0jIEFzIG9mIDIwMDAtMDYtMDMsIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGltcHJvdmVkIHRvIHRoZSBwb2ludCB0aGF0IGcrKyBjYW4KLSMgcGFzcyBhbGwgb2YgdGhlc2VzLCBleGNsdWRpbmcgd2hhdCBhcHBlYXJzIHRvIGJlIG9uZSB0aGF0IGV4cG9zZXMgYSBzdGFicyBidWcuIC0gZGpiCiAKLSMgSSBkb24ndCBrbm93IGhvdyBIUCBjb3VsZCBiZSBwYXNzaW5nIHRoZXNlIHRlc3RzIHdpdGhvdXQgdGhpcy4gVGhleQotIyB3ZXJlbid0IGJyZWFrcG9pbnRpbmcgcGFzdCBhIHBvaW50IHdoZXJlIHRoZSBiZWxvdyBleHByZXNzaW9ucyB3ZXJlCi0jIGluaXRpYWxpemVkIGluIHRoZSBhY3R1YWwgc291cmNlLiAtIGRqYgotCi1zZW5kX2dkYiAiYiA3NzBcbiIKLWdkYl9leHBlY3QgewotCQktcmUgIi4qJGdkYl9wcm9tcHQgJCIKLX0KLXNlbmRfZ2RiICJjXG4iCi1nZGJfZXhwZWN0IHsKLQkJLXJlICIuKiRnZGJfcHJvbXB0ICQiCi19CiBzZW5kX2dkYiAicHJpbnQgZmludFxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCiAgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7eCA9IDAsIHQgPSAwXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgZmludCIgfQpAQCAtMjQ4LDkgKzIzNSw2IEBACiAjIFRlbXBsYXRlIEZvbzxUPgogCiBzZXR1cF94ZmFpbCBocHBhMi4wdy0qLSogQ0xMYnMxNjA5MgotIyBnKysgY2FuJ3QgZG8gdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gaW4gZGVidWcgaW5mbyB0cmljaywgc28gd2UKLSMgZmFpbCB0aGlzIGJlY2F1c2UgaXQncyBub3QgYSByZWFsIHR5cGUuCi1pZiB7ISRocF9hQ0NfY29tcGlsZXJ9IHsgc2V0dXBfeGZhaWwgKi0qLSogfQogc2VuZF9nZGIgInB0eXBlIEZvb1xuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCiAgICAtcmUgInR5cGUgPSB0ZW1wbGF0ZSA8KGNsYXNzIHwpVD4gKGNsYXNzIHwpRm9vIFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSpUIHQ7XHJcblxcfVxyXG50ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczpcclxuXFsgXHRcXSooY2xhc3MgfClGb288dm9sYXRpbGUgY2hhciBcXCo+XHJcblxbIFx0XF0qKGNsYXNzIHwpRm9vPGNoYXI+XHJcblxbIFx0XF0qKGNsYXNzIHwpRm9vPGludD5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBGb28iIH0KQEAgLTI2Myw3ICsyNDcsNyBAQAogCiBzZW5kX2dkYiAicHR5cGUgZmludFxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCi0gICAtcmUgInR5cGUgPSAoY2xhc3MgfClGb288aW50PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKi4qaW50IGZvb1xcKGludCwgaW50XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBmaW50IiB9CisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClGb288aW50PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKmludCBmb29cXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgZmludCIgfQogICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgZmludCIgfQogICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgZmludCIgfQogfQpAQCAtMjcyLDcgKzI1Niw3IEBACiAKIHNlbmRfZ2RiICJwdHlwZSBmY2hhclxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCi0gICAtcmUgInR5cGUgPSAoY2xhc3MgfClGb288Y2hhcj4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmNoYXIgdDtcclxuXHJcblxbIFx0XF0qLipjaGFyIGZvb1xcKGludCwgY2hhclxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgZmNoYXIiIH0KKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUZvbzxjaGFyPiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qY2hhciB0O1xyXG5cclxuXFsgXHRcXSpjaGFyIGZvb1xcKGludCwgY2hhclxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgZmNoYXIiIH0KICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIGZjaGFyIiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBmY2hhciIgfQogfQpAQCAtMjgxLDcgKzI2NSw3IEBACiAKIHNlbmRfZ2RiICJwdHlwZSBmdnBjaGFyXG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUZvbzx2b2xhdGlsZSBjaGFyIFxcKj4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKi4qY2hhci4qXFwqdDtcclxuXHJcblxbIFx0XF0qLipjaGFyIFxcKiBmb29cXChpbnQsLipjaGFyLipcXCpcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGZ2cGNoYXIiIH0KKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUZvbzx2b2xhdGlsZSBjaGFyIFxcKj4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKnZvbGF0aWxlIGNoYXIgXFwqdDtcclxuXHJcblxbIFx0XF0qdm9sYXRpbGUgY2hhciBcXCogZm9vXFwoaW50LCB2b2xhdGlsZSBjaGFyIFxcKlxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgZnZwY2hhciIgfQogICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgZnZwY2hhciIgfQogICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgZnZwY2hhciIgfQogfQpAQCAtMjkwLDcgKzI3NCw3IEBACiAKIHNlbmRfZ2RiICJwcmludCBGb288dm9sYXRpbGUgY2hhciAqPjo6Zm9vXG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAiXFwkXFswLTlcXSogPSBcXHsuKmNoYXIgXFwqXFwoKGNsYXNzIHwpRm9vPHZvbGF0aWxlIGNoYXIgXFwqPiBcXCosIGludCwgLipjaGFyIFxcKlxcKVxcfSAkaGV4IDxGb288LipjaGFyLipcXCo+Ojpmb29cXChpbnQsIC4qY2hhci4qXFwqXFwpPlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IEZvbzx2b2xhdGlsZSBjaGFyICo+Ojpmb28iIH0KKyAgIC1yZSAiXFwkXFswLTlcXSogPSBcXHt2b2xhdGlsZSBjaGFyIFxcKlxcKChjbGFzcyB8KUZvbzx2b2xhdGlsZSBjaGFyIFxcKj4gXFwqLCBpbnQsIHZvbGF0aWxlIGNoYXIgXFwqXFwpXFx9ICRoZXggPEZvbzx2b2xhdGlsZSBjaGFyIFxcKj46OmZvb1xcKGludCwgdm9sYXRpbGUgY2hhciBcXCpcXCk+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgRm9vPHZvbGF0aWxlIGNoYXIgKj46OmZvbyIgfQogICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgRm9vPHZvbGF0aWxlIGNoYXIgKj46OmZvbyIgfQogICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgRm9vPHZvbGF0aWxlIGNoYXIgKj46OmZvbyIgfQogfQpAQCAtMjk4LDggKzI4Miw2IEBACiAjIFRlbXBsYXRlIEJhcjxULCBpbnQ+CiAKIHNldHVwX3hmYWlsIGhwcGEyLjB3LSotKiBDTExiczE2MDkyCi0jIHNhbWUgYXMgRm9vIGZvciBnKysKLWlmIHshJGhwX2FDQ19jb21waWxlcn0geyBzZXR1cF94ZmFpbCAqLSotKiB9CiBzZW5kX2dkYiAicHR5cGUgQmFyXG4iICAgCiBnZGJfZXhwZWN0IHsgICAKICAgIC1yZSAidHlwZSA9IHRlbXBsYXRlIDwoY2xhc3MgfClULCAoY2xhc3MgfClzej4gKGNsYXNzIHwpQmFyIFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSpUIHQ7XHJcblxcfVxyXG50ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczpcclxuXFsgXHRcXSooY2xhc3MgfClCYXI8aW50LChcXChpbnRcXCl8KTE+XHJcblxbIFx0XF0qKGNsYXNzIHwpQmFyPGludCwoXFwoaW50XFwpfCkzMz5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBCYXIiIH0KQEAgLTMxMCwxNCArMjkyLDEwIEBACiAKIAogIyBwdHlwZSBCYXI8aW50LDMzPgotIyBzdGFicyBzY3Jld3MgdGhpcyB0ZXN0IHJveWFsbHkuIAotIyBJdCB0aGlua3MgaXQgaGFzIGEgYmFkbHkgbWFuZ2xlZCBuYW1lLgotIyBJIGJsYW1lIHN0YWJzLCB0aGUgb3RoZXIgZm9ybWF0cyBnZXQgaXQgcmlnaHQuIC1kamIKLWdldF9kZWJ1Z19mb3JtYXQKLXNldHVwX3hmYWlsX2Zvcm1hdCAic3RhYnMiCisKIHNlbmRfZ2RiICJwdHlwZSBiaW50XG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhcjxpbnQsKFxcKGludFxcKXwpMzM+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qLippbnQgYmFyXFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGJpbnQiIH0KKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhcjxpbnQsKFxcKGludFxcKXwpMzM+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qaW50IGJhclxcKGludCwgaW50XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBiaW50IiB9CiAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBiaW50IiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBiaW50IiB9CiB9CkBAIC0zMjYsNyArMzA0LDcgQEAKIAogc2VuZF9nZGIgInB0eXBlIGJpbnQyXG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhcjxpbnQsKFxcKGludFxcKXwpMT4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmludCB0O1xyXG5cclxuXFsgXHRcXSouKmludCBiYXJcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgYmludDIiIH0KKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhcjxpbnQsKFxcKGludFxcKXwpMT4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmludCB0O1xyXG5cclxuXFsgXHRcXSppbnQgYmFyXFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGJpbnQyIiB9CiAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBiaW50MiIgfQogICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgYmludDIiIH0KIH0KQEAgLTMzNCw4ICszMTIsNiBAQAogIyBUZW1wbGF0ZSBCYXo8VCwgY2hhcj4KIAogc2V0dXBfeGZhaWwgaHBwYTIuMHctKi0qIENMTGJzMTYwOTIKLSMgU2FtZSBhcyBGb28sIGZvciBnKysKLWlmIHshJGhwX2FDQ19jb21waWxlcn0geyBzZXR1cF94ZmFpbCAqLSotKiB9CiBzZW5kX2dkYiAicHR5cGUgQmF6XG4iICAgCiBnZGJfZXhwZWN0IHsgICAKICAgIC1yZSAidHlwZSA9IHRlbXBsYXRlIDwoY2xhc3MgfClULCAoY2xhc3MgfClzej4gKGNsYXNzIHwpQmF6IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSpUIHQ7XHJcblxcfVxyXG50ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczpcclxuXFsgXHRcXSooY2xhc3MgfClCYXo8Y2hhciwoXFwoY2hhclxcKXwpOTc+XHJcblxbIFx0XF0qKGNsYXNzIHwpQmF6PGludCwoXFwoY2hhclxcKXwpMTE1PlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIEJheiIgfQpAQCAtMzQ5LDcgKzMyNSw3IEBACiAKIHNlbmRfZ2RiICJwdHlwZSBiYXppbnRcbiIgICAKIGdkYl9leHBlY3QgeyAgIAotICAgLXJlICJ0eXBlID0gKGNsYXNzIHwpQmF6PGludCwoXFwoY2hhclxcKXwpKDExNXxcXCdzXFwnKT4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmludCB0O1xyXG5cclxuXFsgXHRcXSouKmludCBiYXpcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgYmF6aW50IiB9CisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClCYXo8aW50LChcXChjaGFyXFwpfCkxMTU+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qaW50IGJhelxcKGludCwgaW50XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBiYXppbnQiIH0KICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIGJhemludCIgfQogICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgYmF6aW50IiB9CiB9CkBAIC0zNTgsMTQgKzMzNCwxMyBAQAogCiBzZW5kX2dkYiAicHR5cGUgYmF6aW50MlxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCi0gICAtcmUgInR5cGUgPSAoY2xhc3MgfClCYXo8Y2hhciwoXFwoY2hhclxcKXwpKDk3fFxcJ2FcXCcpPiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qY2hhciB0O1xyXG5cclxuXFsgXHRcXSouKmNoYXIgYmF6XFwoaW50LCBjaGFyXFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBiYXppbnQyIiB9CisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClCYXo8Y2hhciwoXFwoY2hhclxcKXwpOTc+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSpjaGFyIHQ7XHJcblxyXG5cWyBcdFxdKmNoYXIgYmF6XFwoaW50LCBjaGFyXFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBiYXppbnQyIiB9CiAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBiYXppbnQyIiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBiYXppbnQyIiB9CiB9CiAKICMgVGVtcGxhdGUgUXV4PFQsIGludCAoKmYpKGludCkgPgotIyBTYW1lIGFzIEZvbyBmb3IgZysrCi1pZiB7ISRocF9hQ0NfY29tcGlsZXJ9IHtzZXR1cF94ZmFpbCAqLSotKn0KKwogc2VuZF9nZGIgInB0eXBlIFF1eFxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCiAgICAtcmUgInR5cGUgPSB0ZW1wbGF0ZSA8KGNsYXNzIHwpVCwgKGNsYXNzIHwpc3o+IChjbGFzcyB8KVF1eCBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qVCB0O1xyXG5cXH1cclxudGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6XHJcblxbIFx0XF0qKGNsYXNzIHwpUXV4PGludCwmc3RyaW5nPlxyXG5cWyBcdFxdKihjbGFzcyB8KVF1eDxjaGFyLCZzdHJpbmc+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgUXV4IiB9CkBAIC0zNzgsNyArMzUzLDcgQEAKIAogc2VuZF9nZGIgInB0eXBlIHF1eGludFxuIiAgIAogZ2RiX2V4cGVjdCB7ICAgCi0gICAtcmUgInR5cGUgPSBjbGFzcyBRdXg8aW50LCZzdHJpbmc+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qLippbnQgcXV4XFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIHF1eGludCIgfQorICAgLXJlICJ0eXBlID0gY2xhc3MgUXV4PGludCwmc3RyaW5nPiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKmludCBxdXhcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgcXV4aW50IiB9CiAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBxdXhpbnQiIH0KICAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHF1eGludCIgfQogfQpAQCAtMzk3LDggKzM3Miw2IEBACiAjIFRlbXBsYXRlIFNwZWM8VDEsIFQyPgogCiBzZXR1cF94ZmFpbCBocHBhMi4wdy0qLSogQ0xMYnMxNjA5MgotIyBTYW1lIGFzIEZvbyBmb3IgZysrCi1pZiB7ISRocF9hQ0NfY29tcGlsZXJ9IHsgc2V0dXBfeGZhaWwgKi0qLSogfQogc2VuZF9nZGIgInB0eXBlIFNwZWNcbiIgICAKIGdkYl9leHBlY3QgeyAgIAogICAgLXJlICJ0eXBlID0gdGVtcGxhdGUgPChjbGFzcyB8KVQxLCAoY2xhc3MgfClUMj4gKGNsYXNzIHwpU3BlYyBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxcfVxyXG50ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczpcclxuXFsgXHRcXSooY2xhc3MgfClTcGVjPGludCxpbnQgXFwqPlxyXG5cWyBcdFxdKihjbGFzcyB8KVNwZWM8aW50LGNoYXI+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgU3BlYyIgfQpAQCAtNDExLDcgKzM4NCw3IEBACiAKIHNlbmRfZ2RiICJwdHlwZSBzaWlwXG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAidHlwZSA9IGNsYXNzIFNwZWM8aW50LGludCBcXCo+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXHJcblxbIFx0XF0qLippbnQgc3BlY1xcKGludCBcXCpcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIHNpaXAiIH0KKyAgIC1yZSAidHlwZSA9IGNsYXNzIFNwZWM8aW50LGludCBcXCo+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXHJcblxbIFx0XF0qaW50IHNwZWNcXChpbnQgXFwqXFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBzaWlwIiB9CiAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBzaWlwIiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBzaWlwIiB9CiB9CkBAIC00MjAsNyArMzkzLDcgQEAKIAogc2VuZF9nZGIgInB0eXBlIEdhcnBseTxpbnQ+XG4iICAgCiBnZGJfZXhwZWN0IHsgICAKLSAgIC1yZSAidHlwZSA9IGNsYXNzIEdhcnBseTxpbnQ+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qLippbnQgZ2FycGx5XFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIEdhcnBseTxpbnQ+IiB9CisgICAtcmUgInR5cGUgPSBjbGFzcyBHYXJwbHk8aW50PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKmludCBnYXJwbHlcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgR2FycGx5PGludD4iIH0KICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIEdhcnBseTxpbnQ+IiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBHYXJwbHk8aW50PiIgfQogfQpAQCAtNDI5LDcgKzQwMiw3IEBACiAKIHNlbmRfZ2RiICJwdHlwZSBHYXJwbHk8R2FycGx5PGNoYXI+ID5cbiIgICAKIGdkYl9leHBlY3QgeyAgIAotICAgLXJlICJ0eXBlID0gKGNsYXNzIHwpR2FycGx5PEdhcnBseTxjaGFyPiA+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSouKihjbGFzcyB8KUdhcnBseTxjaGFyPiB0O1xyXG5cclxuXFsgXHRcXSouKihjbGFzcyB8KUdhcnBseTxjaGFyPiBnYXJwbHlcXChpbnQsIChjbGFzcyB8KUdhcnBseTxjaGFyPlxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgR2FycGx5PEdhcnBseTxjaGFyPiA+IiB9CisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClHYXJwbHk8R2FycGx5PGNoYXI+ID4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKihjbGFzcyB8KUdhcnBseTxjaGFyPiB0O1xyXG5cclxuXFsgXHRcXSooY2xhc3MgfClHYXJwbHk8Y2hhcj4gZ2FycGx5XFwoaW50LCAoY2xhc3MgfClHYXJwbHk8Y2hhcj5cXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIEdhcnBseTxHYXJwbHk8Y2hhcj4gPiIgfQogICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgR2FycGx5PEdhcnBseTxjaGFyPiA+IiB9CiAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBHYXJwbHk8R2FycGx5PGNoYXI+ID4iIH0KIH0KQEAgLTQzOCwxNiArNDExLDE2IEBACiAKIHNlbmRfZ2RiICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseVxuIgogZ2RiX2V4cGVjdCB7Ci0gICAtcmUgIlxcJFxbMC05XF0qID0gXFx7KGNsYXNzIHwpR2FycGx5PGNoYXI+IFxcKChjbGFzcyB8KUdhcnBseTxHYXJwbHk8Y2hhcj4gPiBcXCosIGludCwgKGNsYXNzIHwpR2FycGx5PGNoYXI+XFwpXFx9ICRoZXggPEdhcnBseTxHYXJwbHk8Y2hhcj5cWyBcdFxdKj46OmdhcnBseVxcKGludCwgKGNsYXNzIHwpR2FycGx5PGNoYXI+XFwpPlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IEdhcnBseTxHYXJwbHk8Y2hhcj4gPjo6Z2FycGx5IiB9CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7KGNsYXNzIHwpR2FycGx5PGNoYXI+IFxcKChjbGFzcyB8KUdhcnBseTxHYXJwbHk8Y2hhcj4gPiBcXCosIGludCwgKGNsYXNzIHwpR2FycGx5PGNoYXI+XFwpXFx9ICRoZXggPEdhcnBseTxHYXJwbHk8Y2hhcj4+OjpnYXJwbHlcXChpbnQsIChjbGFzcyB8KUdhcnBseTxjaGFyPlxcKT5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSIgfQogICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIH0KICAgIHRpbWVvdXQgeyBmYWlsICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSAodGltZW91dCkiIH0KIH0KIAotIyBkamIgLSAwNi0wMy0yMDAwCi0jIE5vdyBzaG91bGQgd29yayBmaW5lCi1zZW5kX2dkYiAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHlcbiIKLWdkYl9leHBlY3QgewotICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0ICRoZXg6IGZpbGUgLip0ZW1wbGF0ZXMuY2MsIGxpbmUuKlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgImJyZWFrIEdhcnBseTxHYXJwbHk8Y2hhcj4gPjo6Z2FycGx5IiB9Ci0gICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSIgfQotICAgdGltZW91dCB7IGZhaWwgImJyZWFrIEdhcnBseTxHYXJwbHk8Y2hhcj4gPjo6Z2FycGx5ICh0aW1lb3V0KSIgfQotfQorIyBVTkZPUlRVTkFURUxZLCAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIGRvZXNuJ3QgeWV0IHdvcmsuCisKKyNzZW5kX2dkYiAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkKKyNnZGJfZXhwZWN0IHsKKyMgICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSogYXQgJGhleDogZmlsZSAuKnRlbXBsYXRlcy5jYywgbGluZS4qXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIH0KKyMgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSIgfQorIyAgIHRpbWVvdXQgeyBmYWlsICJicmVhayBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSAodGltZW91dCkiIH0KKyN9CmRpZmYgLS1naXQgYS9nZGIvdG9wLmMgYi9nZGIvdG9wLmMKaW5kZXggM2JjNTVmOS4uY2NkOWNjMCAxMDA2NDQKLS0tIGEvZ2RiL3RvcC5jCisrKyBiL2dkYi90b3AuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIGFyZ3M6IGFuIGlucHV0IHN0cmVhbSwKICAgIGFuZCBhIHByb21wdCBzdHJpbmcuICAqLwogCi12b2lkICgqd2luZG93X2hvb2spIChGSUxFICosIGNoYXIgKik7Cit2b2lkICgqd2luZG93X2hvb2spIFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqKSk7CiAKIGludCBlcG9jaF9pbnRlcmZhY2U7CiBpbnQgeGdkYl92ZXJib3NlOwpAQCAtMzkyLDMxICszOTIsMzEgQEAKIC8qIENhbGxlZCBhZnRlciBtb3N0IG1vZHVsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLCBidXQgYmVmb3JlIHRha2luZyB1c2VycwogICAgY29tbWFuZCBmaWxlLiAgKi8KIAotdm9pZCAoKmluaXRfdWlfaG9vaykgKGNoYXIgKmFyZ3YwKTsKK3ZvaWQgKCppbml0X3VpX2hvb2spIFBBUkFNUyAoKGNoYXIgKmFyZ3YwKSk7CiAKIC8qIFRoaXMgaG9vayBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gZ2RiJ3MgbWFueSBtaW5pLWV2ZW50IGxvb3BzIHdoaWNoIGNvdWxkCiAgICBzdGVhbCBjb250cm9sIGZyb20gYSByZWFsIHVzZXIgaW50ZXJmYWNlJ3MgZXZlbnQgbG9vcC4gSXQgcmV0dXJucwogICAgbm9uLXplcm8gaWYgdGhlIHVzZXIgaXMgcmVxdWVzdGluZyBhIGRldGFjaCwgemVybyBvdGhlcndpc2UuICovCiAKLWludCAoKnVpX2xvb3BfaG9vaykgKGludCk7CitpbnQgKCp1aV9sb29wX2hvb2spIFBBUkFNUyAoKGludCkpOwogCiAvKiBDYWxsZWQgaW5zdGVhZCBvZiBjb21tYW5kX2xvb3AgYXQgdG9wIGxldmVsLiAgQ2FuIGJlIGludm9rZWQgdmlhCiAgICByZXR1cm5fdG9fdG9wX2xldmVsLiAgKi8KIAotdm9pZCAoKmNvbW1hbmRfbG9vcF9ob29rKSAodm9pZCk7Cit2b2lkICgqY29tbWFuZF9sb29wX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKIAogCiAvKiBDYWxsZWQgZnJvbSBwcmludF9mcmFtZV9pbmZvIHRvIGxpc3QgdGhlIGxpbmUgd2Ugc3RvcHBlZCBpbi4gICovCiAKLXZvaWQgKCpwcmludF9mcmFtZV9pbmZvX2xpc3RpbmdfaG9vaykgKHN0cnVjdCBzeW10YWIgKiBzLCBpbnQgbGluZSwKLQkJCQkgICAgICAgaW50IHN0b3BsaW5lLCBpbnQgbm9lcnJvcik7Cit2b2lkICgqcHJpbnRfZnJhbWVfaW5mb19saXN0aW5nX2hvb2spIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKiBzLCBpbnQgbGluZSwKKwkJCQkJICAgICAgIGludCBzdG9wbGluZSwgaW50IG5vZXJyb3IpKTsKIC8qIFJlcGxhY2VzIG1vc3Qgb2YgcXVlcnkuICAqLwogCi1pbnQgKCpxdWVyeV9ob29rKSAoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK2ludCAoKnF1ZXJ5X2hvb2spIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwogCiAvKiBSZXBsYWNlcyBtb3N0IG9mIHdhcm5pbmcuICAqLwogCi12b2lkICgqd2FybmluZ19ob29rKSAoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK3ZvaWQgKCp3YXJuaW5nX2hvb2spIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwogCiAvKiBUaGVzZSB0aHJlZSBmdW5jdGlvbnMgc3VwcG9ydCBnZXR0aW5nIGxpbmVzIG9mIHRleHQgZnJvbSB0aGUgdXNlci4gIFRoZXkKICAgIGFyZSB1c2VkIGluIHNlcXVlbmNlLiAgRmlyc3QgcmVhZGxpbmVfYmVnaW5faG9vayBpcyBjYWxsZWQgd2l0aCBhIHRleHQKQEAgLTQyOSw1MSArNDI5LDUxIEBACiAgICB0byBub3RpZnkgdGhlIEdVSSB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGludGVyYWN0aW9uIHdpbmRvdyBhbmQgaXQKICAgIGNhbiBjbG9zZSBpdC4gKi8KIAotdm9pZCAoKnJlYWRsaW5lX2JlZ2luX2hvb2spIChjaGFyICosIC4uLik7Ci1jaGFyICooKnJlYWRsaW5lX2hvb2spIChjaGFyICopOwotdm9pZCAoKnJlYWRsaW5lX2VuZF9ob29rKSAodm9pZCk7Cit2b2lkICgqcmVhZGxpbmVfYmVnaW5faG9vaykgUEFSQU1TICgoY2hhciAqLC4uLikpOworY2hhciAqKCpyZWFkbGluZV9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKK3ZvaWQgKCpyZWFkbGluZV9lbmRfaG9vaykgUEFSQU1TICgodm9pZCkpOwogCiAvKiBDYWxsZWQgYXMgYXBwcm9wcmlhdGUgdG8gbm90aWZ5IHRoZSBpbnRlcmZhY2Ugb2YgdGhlIHNwZWNpZmllZCBicmVha3BvaW50CiAgICBjb25kaXRpb25zLiAgKi8KIAotdm9pZCAoKmNyZWF0ZV9icmVha3BvaW50X2hvb2spIChzdHJ1Y3QgYnJlYWtwb2ludCAqIGJwdCk7Ci12b2lkICgqZGVsZXRlX2JyZWFrcG9pbnRfaG9vaykgKHN0cnVjdCBicmVha3BvaW50ICogYnB0KTsKLXZvaWQgKCptb2RpZnlfYnJlYWtwb2ludF9ob29rKSAoc3RydWN0IGJyZWFrcG9pbnQgKiBicHQpOwordm9pZCAoKmNyZWF0ZV9icmVha3BvaW50X2hvb2spIFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICogYnB0KSk7Cit2b2lkICgqZGVsZXRlX2JyZWFrcG9pbnRfaG9vaykgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKiBicHQpKTsKK3ZvaWQgKCptb2RpZnlfYnJlYWtwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqIGJwdCkpOwogCiAvKiBDYWxsZWQgYXMgYXBwcm9wcmlhdGUgdG8gbm90aWZ5IHRoZSBpbnRlcmZhY2UgdGhhdCB3ZSBoYXZlIGF0dGFjaGVkCiAgICB0byBvciBkZXRhY2hlZCBmcm9tIGFuIGFscmVhZHkgcnVubmluZyBwcm9jZXNzLiAqLwogCi12b2lkICgqYXR0YWNoX2hvb2spICh2b2lkKTsKLXZvaWQgKCpkZXRhY2hfaG9vaykgKHZvaWQpOwordm9pZCAoKmF0dGFjaF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkICgqZGV0YWNoX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKIAogLyogQ2FsbGVkIGR1cmluZyBsb25nIGNhbGN1bGF0aW9ucyB0byBhbGxvdyBHVUkgdG8gcmVwYWlyIHdpbmRvdyBkYW1hZ2UsIGFuZCB0bwogICAgY2hlY2sgZm9yIHN0b3AgYnV0dG9ucywgZXRjLi4uICovCiAKLXZvaWQgKCppbnRlcmFjdGl2ZV9ob29rKSAodm9pZCk7Cit2b2lkICgqaW50ZXJhY3RpdmVfaG9vaykgUEFSQU1TICgodm9pZCkpOwogCiAvKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJzIGhhdmUgY2hhbmdlZCwgYXMgYSBoaW50IHRvIGEgR1VJCiAgICB0byBtaW5pbWl6ZSB3aW5kb3cgdXBkYXRlLiAqLwogCi12b2lkICgqcmVnaXN0ZXJzX2NoYW5nZWRfaG9vaykgKHZvaWQpOwordm9pZCAoKnJlZ2lzdGVyc19jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKIAogLyogVGVsbCB0aGUgR1VJIHNvbWVvbmUgY2hhbmdlZCB0aGUgcmVnaXN0ZXIgUkVHTk8uIC0xIG1lYW5zCiAgICB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3Qga25vdyB3aGljaCByZWdpc3RlciBjaGFuZ2VkIG9yCiAgICB0aGF0IHNldmVyYWwgcmVnaXN0ZXJzIGhhdmUgY2hhbmdlZCAoc2VlIHZhbHVlX2Fzc2lnbikuICovCi12b2lkICgqcmVnaXN0ZXJfY2hhbmdlZF9ob29rKSAoaW50IHJlZ25vKTsKK3ZvaWQgKCpyZWdpc3Rlcl9jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKGludCByZWdubykpOwogCiAvKiBUZWxsIHRoZSBHVUkgc29tZW9uZSBjaGFuZ2VkIExFTiBieXRlcyBvZiBtZW1vcnkgYXQgQUREUiAqLwotdm9pZCAoKm1lbW9yeV9jaGFuZ2VkX2hvb2spIChDT1JFX0FERFIgYWRkciwgaW50IGxlbik7Cit2b2lkICgqbWVtb3J5X2NoYW5nZWRfaG9vaykgUEFSQU1TICgoQ09SRV9BRERSIGFkZHIsIGludCBsZW4pKTsKIAogLyogQ2FsbGVkIHdoZW4gZ29pbmcgdG8gd2FpdCBmb3IgdGhlIHRhcmdldC4gIFVzdWFsbHkgYWxsb3dzIHRoZSBHVUkgdG8gcnVuCiAgICB3aGlsZSB3YWl0aW5nIGZvciB0YXJnZXQgZXZlbnRzLiAgKi8KIAotaW50ICgqdGFyZ2V0X3dhaXRfaG9vaykgKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqIHN0YXR1cyk7CitpbnQgKCp0YXJnZXRfd2FpdF9ob29rKSBQQVJBTVMgKChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKiBzdGF0dXMpKTsKIAogLyogVXNlZCBieSBVSSBhcyBhIHdyYXBwZXIgYXJvdW5kIGNvbW1hbmQgZXhlY3V0aW9uLiAgTWF5IGRvIHZhcmlvdXMgdGhpbmdzCiAgICBsaWtlIGVuYWJsaW5nL2Rpc2FibGluZyBidXR0b25zLCBldGMuLi4gICovCiAKLXZvaWQgKCpjYWxsX2NvbW1hbmRfaG9vaykgKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICogYywgY2hhciAqY21kLAotCQkJICAgaW50IGZyb21fdHR5KTsKK3ZvaWQgKCpjYWxsX2NvbW1hbmRfaG9vaykgUEFSQU1TICgoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiBjLCBjaGFyICpjbWQsCisJCQkJICAgaW50IGZyb21fdHR5KSk7CiAKIC8qIENhbGxlZCBhZnRlciBhIGBzZXQnIGNvbW1hbmQgaGFzIGZpbmlzaGVkLiAgSXMgb25seSBydW4gaWYgdGhlCiAgICBgc2V0JyBjb21tYW5kIHN1Y2NlZWRlZC4gICovCkBAIC00ODIsNyArNDgyLDcgQEAKIAogLyogQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIGNoYW5nZXMuICBBcmd1bWVudCBpcyB0aHJlYWQgaWQuICAqLwogCi12b2lkICgqY29udGV4dF9ob29rKSAoaW50IGlkKTsKK3ZvaWQgKCpjb250ZXh0X2hvb2spIFBBUkFNUyAoKGludCBpZCkpOwogCiAvKiBUYWtlcyBjb250cm9sIGZyb20gZXJyb3IgKCkuICBUeXBpY2FsbHkgdXNlZCB0byBwcmV2ZW50IGxvbmdqbXBzIG91dCBvZiB0aGUKICAgIG1pZGRsZSBvZiB0aGUgR1VJLiAgVXN1YWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBjYXRjaCByb3V0aW5lLiAgKi8KQEAgLTc4Miw3ICs3ODIsNyBAQAogDAogZXh0ZXJuIHZvaWQgaW5pdF9wcm9jICh2b2lkKTsKIAotdm9pZCAoKnByZV9pbml0X3VpX2hvb2spICh2b2lkKTsKK3ZvaWQgKCpwcmVfaW5pdF91aV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CiAKICNpZmRlZiBfX01TRE9TX18KIHZvaWQKQEAgLTI5MzksNyArMjkzOSw3IEBACiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCiBhZGRfaW5mbyAobmFtZSwgZnVuLCBkb2MpCiAgICAgIGNoYXIgKm5hbWU7Ci0gICAgIHZvaWQgKCpmdW4pIChjaGFyICosIGludCk7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CiAgICAgIGNoYXIgKmRvYzsKIHsKICAgcmV0dXJuIGFkZF9jbWQgKG5hbWUsIG5vX2NsYXNzLCBmdW4sIGRvYywgJmluZm9saXN0KTsKQEAgLTMwMTMsNyArMzAxMyw3IEBACiBhZGRfY29tIChuYW1lLCBjbGFzcywgZnVuLCBkb2MpCiAgICAgIGNoYXIgKm5hbWU7CiAgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKLSAgICAgdm9pZCAoKmZ1bikgKGNoYXIgKiwgaW50KTsKKyAgICAgdm9pZCAoKmZ1bikgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKICAgICAgY2hhciAqZG9jOwogewogICByZXR1cm4gYWRkX2NtZCAobmFtZSwgY2xhc3MsIGZ1biwgZG9jLCAmY21kbGlzdCk7CmRpZmYgLS1naXQgYS9nZGIvdHJhY2Vwb2ludC5jIGIvZ2RiL3RyYWNlcG9pbnQuYwppbmRleCBhN2EzODg4Li41NjQwNDFjIDEwMDY0NAotLS0gYS9nZGIvdHJhY2Vwb2ludC5jCisrKyBiL2dkYi90cmFjZXBvaW50LmMKQEAgLTU4LDkgKzU4LDkgQEAKIAogCiBleHRlcm4gaW50IGluZm9fdmVyYm9zZTsKLWV4dGVybiB2b2lkICgqcmVhZGxpbmVfYmVnaW5faG9vaykgKGNoYXIgKiwgLi4uKTsKLWV4dGVybiBjaGFyICooKnJlYWRsaW5lX2hvb2spIChjaGFyICopOwotZXh0ZXJuIHZvaWQgKCpyZWFkbGluZV9lbmRfaG9vaykgKHZvaWQpOworZXh0ZXJuIHZvaWQgKCpyZWFkbGluZV9iZWdpbl9ob29rKSBQQVJBTVMgKChjaGFyICosLi4uKSk7CitleHRlcm4gY2hhciAqKCpyZWFkbGluZV9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkICgqcmVhZGxpbmVfZW5kX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKIGV4dGVybiB2b2lkIHhfY29tbWFuZCAoY2hhciAqLCBpbnQpOwogZXh0ZXJuIGludCBhZGRyZXNzcHJpbnQ7CS8qIFByaW50IG1hY2hpbmUgYWRkcmVzc2VzPyAqLwogCmRpZmYgLS1naXQgYS9nZGIvdHJhY2Vwb2ludC5oIGIvZ2RiL3RyYWNlcG9pbnQuaAppbmRleCA2ZjUwZjE5Li5hNzY4NTBlIDEwMDY0NAotLS0gYS9nZGIvdHJhY2Vwb2ludC5oCisrKyBiL2dkYi90cmFjZXBvaW50LmgKQEAgLTExNSwxMSArMTE1LDExIEBACiAKIC8qIEEgaG9vayB1c2VkIHRvIG5vdGlmeSB0aGUgVUkgb2YgdHJhY2Vwb2ludCBvcGVyYXRpb25zICovCiAKLXZvaWQgKCpjcmVhdGVfdHJhY2Vwb2ludF9ob29rKSAoc3RydWN0IHRyYWNlcG9pbnQgKik7Ci12b2lkICgqZGVsZXRlX3RyYWNlcG9pbnRfaG9vaykgKHN0cnVjdCB0cmFjZXBvaW50ICopOwotdm9pZCAoKm1vZGlmeV90cmFjZXBvaW50X2hvb2spIChzdHJ1Y3QgdHJhY2Vwb2ludCAqKTsKLXZvaWQgKCp0cmFjZV9maW5kX2hvb2spIChjaGFyICphcmcsIGludCBmcm9tX3R0eSk7Ci12b2lkICgqdHJhY2Vfc3RhcnRfc3RvcF9ob29rKSAoaW50IHN0YXJ0LCBpbnQgZnJvbV90dHkpOwordm9pZCAoKmNyZWF0ZV90cmFjZXBvaW50X2hvb2spIFBBUkFNUyAoKHN0cnVjdCB0cmFjZXBvaW50ICopKTsKK3ZvaWQgKCpkZWxldGVfdHJhY2Vwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgdHJhY2Vwb2ludCAqKSk7Cit2b2lkICgqbW9kaWZ5X3RyYWNlcG9pbnRfaG9vaykgUEFSQU1TICgoc3RydWN0IHRyYWNlcG9pbnQgKikpOwordm9pZCAoKnRyYWNlX2ZpbmRfaG9vaykgUEFSQU1TICgoY2hhciAqYXJnLCBpbnQgZnJvbV90dHkpKTsKK3ZvaWQgKCp0cmFjZV9zdGFydF9zdG9wX2hvb2spIFBBUkFNUyAoKGludCBzdGFydCwgaW50IGZyb21fdHR5KSk7CiAKIHN0cnVjdCB0cmFjZXBvaW50ICpnZXRfdHJhY2Vwb2ludF9ieV9udW1iZXIgKGNoYXIgKiosIGludCwgaW50KTsKIGludCBnZXRfdHJhY2VmcmFtZV9udW1iZXIgKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWkuaCBiL2dkYi90dWkvdHVpLmgKaW5kZXggNjk1ZDcwNy4uMjI3ODA1MiAxMDA2NDQKLS0tIGEvZ2RiL3R1aS90dWkuaAorKysgYi9nZGIvdHVpL3R1aS5oCkBAIC0yNiwxNSArMjYsMTUgQEAKIC8qIE9wYXF1ZSBkYXRhIHR5cGUgKi8KIHR5cGVkZWYgY2hhciAqT3BhcXVlOwogdHlwZWRlZgotT3BhcXVlICgqT3BhcXVlRnVuY1B0cikgKHZhX2xpc3QpOworT3BhcXVlICgqT3BhcXVlRnVuY1B0cikgUEFSQU1TICgodmFfbGlzdCkpOwogICAgICB0eXBlZGVmIGNoYXIgKipPcGFxdWVMaXN0OwogICAgICB0eXBlZGVmIE9wYXF1ZUxpc3QgT3BhcXVlUHRyOwogCiAvKiBHZW5lcmljIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLSAgICAgdHlwZWRlZiB2b2lkICgqVHVpVm9pZEZ1bmNQdHIpICh2YV9saXN0KTsKLSAgICAgdHlwZWRlZiBpbnQgKCpUdWlJbnRGdW5jUHRyKSAodmFfbGlzdCk7CisgICAgIHR5cGVkZWYgdm9pZCAoKlR1aVZvaWRGdW5jUHRyKSBQQVJBTVMgKCh2YV9saXN0KSk7CisgICAgIHR5cGVkZWYgaW50ICgqVHVpSW50RnVuY1B0cikgUEFSQU1TICgodmFfbGlzdCkpOwogLyoKLSAgIHR5cGVkZWYgT3BhcXVlICgqVHVpT3BhcXVlRnVuY1B0cikgKHZhX2xpc3QpOworICAgdHlwZWRlZiAgICAgT3BhcXVlICAgICAgICAgICAgKCpUdWlPcGFxdWVGdW5jUHRyKSBQQVJBTVMgKCh2YV9saXN0KSk7CiAgKi8KICAgICAgdHlwZWRlZiBPcGFxdWVGdW5jUHRyIFR1aU9wYXF1ZUZ1bmNQdHI7CiAKZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpSU8uYyBiL2dkYi90dWkvdHVpSU8uYwppbmRleCBjODQyN2MwLi4xMjU2YTUwIDEwMDY0NAotLS0gYS9nZGIvdHVpL3R1aUlPLmMKKysrIGIvZ2RiL3R1aS90dWlJTy5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIHR1aV90cHV0cyAoc3RyLCBhZmZjbnQsIHB1dGZ1bmMpCiAgICAgIGNoYXIgKnN0cjsKICAgICAgaW50IGFmZmNudDsKLSAgICAgaW50ICgqcHV0ZnVuYykgKGludCk7CisgICAgIGludCAoKnB1dGZ1bmMpIFBBUkFNUyAoKGludCkpOwogewogICBleHRlcm4gY2hhciAqcmxfcHJvbXB0OwkvKiB0aGUgcHJvbXB0IHN0cmluZyAqLwogCmRpZmYgLS1naXQgYS9nZGIvdXRpbHMuYyBiL2dkYi91dGlscy5jCmluZGV4IGIzYTNhZDkuLjUyMGE3OTMgMTAwNjQ0Ci0tLSBhL2dkYi91dGlscy5jCisrKyBiL2dkYi91dGlscy5jCkBAIC01MCw4ICs1MCw2IEBACiAjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJhbm5vdGF0ZS5oIgogCi0jaW5jbHVkZSAiaW5mZXJpb3IuaCIgLyogZm9yIHNpZ25lZF9wb2ludGVyX3RvX2FkZHJlc3MgKi8KLQogI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CiAKICN1bmRlZiBYTUFMTE9DCkBAIC02MCw3ICs1OCw3IEBACiAvKiByZWFkbGluZSBkZWZpbmVzIHRoaXMuICAqLwogI3VuZGVmIHNhdmVzdHJpbmcKIAotdm9pZCAoKmVycm9yX2JlZ2luX2hvb2spICh2b2lkKTsKK3ZvaWQgKCplcnJvcl9iZWdpbl9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CiAKIC8qIEhvbGRzIHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgaXNzdWVkIGJ5IGdkYiAqLwogCkBAIC00MjgsNyArNDI2LDcgQEAKICAgIGNtZF9jb250aW51YXRpb24uIFRoZSBuZXcgY29udGludWF0aW9uIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGZyb250LiovCiB2b2lkCiBhZGRfY29udGludWF0aW9uIChjb250aW51YXRpb25faG9vaywgYXJnX2xpc3QpCi0gICAgIHZvaWQgKCpjb250aW51YXRpb25faG9vaykgKHN0cnVjdCBjb250aW51YXRpb25fYXJnICopOworICAgICB2b2lkICgqY29udGludWF0aW9uX2hvb2spIFBBUkFNUyAoKHN0cnVjdCBjb250aW51YXRpb25fYXJnICopKTsKICAgICAgc3RydWN0IGNvbnRpbnVhdGlvbl9hcmcgKmFyZ19saXN0OwogewogICBzdHJ1Y3QgY29udGludWF0aW9uICpjb250aW51YXRpb25fcHRyOwpAQCAtNDkwLDcgKzQ4OCw3IEBACiAgICBpbnRlcm1lZGlhdGVfY29udGludWF0aW9uLiBUaGUgbmV3IGNvbnRpbnVhdGlvbiB3aWxsIGJlIGFkZGVkIGF0IHRoZSBmcm9udC4qLwogdm9pZAogYWRkX2ludGVybWVkaWF0ZV9jb250aW51YXRpb24gKGNvbnRpbnVhdGlvbl9ob29rLCBhcmdfbGlzdCkKLSAgICAgdm9pZCAoKmNvbnRpbnVhdGlvbl9ob29rKSAoc3RydWN0IGNvbnRpbnVhdGlvbl9hcmcgKik7CisgICAgIHZvaWQgKCpjb250aW51YXRpb25faG9vaykgUEFSQU1TICgoc3RydWN0IGNvbnRpbnVhdGlvbl9hcmcgKikpOwogICAgICBzdHJ1Y3QgY29udGludWF0aW9uX2FyZyAqYXJnX2xpc3Q7CiB7CiAgIHN0cnVjdCBjb250aW51YXRpb24gKmNvbnRpbnVhdGlvbl9wdHI7CkBAIC03NzQsNiArNzcyLDI2IEBACiAgIHJldHVybiAobXNnKTsKIH0KIAorLyogVGhlIHN0cnNpZ25hbCgpIGZ1bmN0aW9uIGNhbiByZXR1cm4gTlVMTCBmb3Igc2lnbmFsIHZhbHVlcyB0aGF0IGFyZQorICAgb3V0IG9mIHJhbmdlLiAgUHJvdmlkZSBhICJzYWZlIiB2ZXJzaW9uIHRoYXQgYWx3YXlzIHJldHVybnMgYQorICAgcHJpbnRhYmxlIHN0cmluZy4gKi8KKworY2hhciAqCitzYWZlX3N0cnNpZ25hbCAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgY2hhciAqbXNnOworICBzdGF0aWMgY2hhciBidWZbMzJdOworCisgIGlmICgobXNnID0gc3Ryc2lnbmFsIChzaWdubykpID09IE5VTEwpCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiKHVuZG9jdW1lbnRlZCBzaWduYWwgJWQpIiwgc2lnbm8pOworICAgICAgbXNnID0gYnVmOworICAgIH0KKyAgcmV0dXJuIChtc2cpOworfQorCisKIC8qIFByaW50IHRoZSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBmb3IgZXJybm8sIGFuZCBhbHNvIG1lbnRpb24gU1RSSU5HCiAgICBhcyB0aGUgZmlsZSBuYW1lIGZvciB3aGljaCB0aGUgZXJyb3Igd2FzIGVuY291bnRlcmVkLgogICAgVGhlbiByZXR1cm4gdG8gY29tbWFuZCBsZXZlbC4gICovCkBAIC0xNDAzLDggKzE0MjEsOCBAQAogc3RhdGljIHZvaWQKIHByaW50Y2hhciAoYywgZG9fZnB1dHMsIGRvX2ZwcmludGYsIHN0cmVhbSwgcXVvdGVyKQogICAgICBpbnQgYzsKLSAgICAgdm9pZCAoKmRvX2ZwdXRzKSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgdWlfZmlsZSAqKTsKLSAgICAgdm9pZCAoKmRvX2ZwcmludGYpIChzdHJ1Y3QgdWlfZmlsZSAqLCBjb25zdCBjaGFyICosIC4uLik7CisgICAgIHZvaWQgKCpkb19mcHV0cykgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgdWlfZmlsZSopKTsKKyAgICAgdm9pZCAoKmRvX2ZwcmludGYpIFBBUkFNUyAoKHN0cnVjdCB1aV9maWxlKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKICAgICAgc3RydWN0IHVpX2ZpbGUgKnN0cmVhbTsKICAgICAgaW50IHF1b3RlcjsKIHsKQEAgLTI5NjQsMjQgKzI5ODIsMyBAQAogICAgIH0KICAgcmV0dXJuIHN0cjsKIH0KLQotCi0vKiBDb252ZXJ0IHRvIC8gZnJvbSB0aGUgaG9zdHMgcG9pbnRlciB0byBHREIncyBpbnRlcm5hbCBDT1JFX0FERFIKLSAgIHVzaW5nIHRoZSB0YXJnZXQncyBjb252ZXJzaW9uIHJvdXRpbmVzLiAqLwotQ09SRV9BRERSCi1ob3N0X3BvaW50ZXJfdG9fYWRkcmVzcyAodm9pZCAqcHRyKQotewotICBpZiAoc2l6ZW9mIChwdHIpICE9IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfcHRyKSkKLSAgICBpbnRlcm5hbF9lcnJvciAoImNvcmVfYWRkcl90b192b2lkX3B0cjogYmFkIGNhc3QiKTsKLSAgcmV0dXJuIFBPSU5URVJfVE9fQUREUkVTUyAoYnVpbHRpbl90eXBlX3B0ciwgJnB0cik7Ci19Ci0KLXZvaWQgKgotYWRkcmVzc190b19ob3N0X3BvaW50ZXIgKENPUkVfQUREUiBhZGRyKQotewotICB2b2lkICpwdHI7Ci0gIGlmIChzaXplb2YgKHB0cikgIT0gVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9wdHIpKQotICAgIGludGVybmFsX2Vycm9yICgiY29yZV9hZGRyX3RvX3ZvaWRfcHRyOiBiYWQgY2FzdCIpOwotICBBRERSRVNTX1RPX1BPSU5URVIgKGJ1aWx0aW5fdHlwZV9wdHIsICZwdHIsIGFkZHIpOwotICByZXR1cm4gcHRyOwotfQpkaWZmIC0tZ2l0IGEvZ2RiL3Y4NTBpY2UuYyBiL2dkYi92ODUwaWNlLmMKaW5kZXggMjM2NGQyYS4uZWYyY2RmNyAxMDA2NDQKLS0tIGEvZ2RiL3Y4NTBpY2UuYworKysgYi9nZGIvdjg1MGljZS5jCkBAIC01NCw3ICs1NCw3IEBACiAKIGV4dGVybiB2b2lkIGNvbnRpbnVlX2NvbW1hbmQgKGNoYXIgKiwgaW50KTsKIAotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgKGludCk7CitleHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQpKTsKIAogLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgaW50IGluaXRfaGlkZGVuX3dpbmRvdyAodm9pZCk7CkBAIC04NTUsNyArODU1LDcgQEAKIGRvX2dkYiAoY21kLCBzdHIsIGZ1bmMsIGNvdW50KQogICAgICBjaGFyICpjbWQ7CiAgICAgIGNoYXIgKnN0cjsKLSAgICAgdm9pZCAoKmZ1bmMpIChjaGFyICosIGludCk7CisgICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChjaGFyICosIGludCkpOwogICAgICBpbnQgY291bnQ7CiB7CiAgIFJlcGx5TWVzc2FnZSAoKExSRVNVTFQpIDEpOwpkaWZmIC0tZ2l0IGEvZ2RiL3Zhcm9iai5jIGIvZ2RiL3Zhcm9iai5jCmluZGV4IGZhYWU1ZjguLmEyNjk5ZjcgMTAwNjQ0Ci0tLSBhL2dkYi92YXJvYmouYworKysgYi9nZGIvdmFyb2JqLmMKQEAgLTI4NywyOCArMjg3LDI4IEBACiAgICAgZW51bSB2YXJvYmpfbGFuZ3VhZ2VzIGxhbmd1YWdlOwogCiAgICAgLyogVGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiBQQVJFTlQuICovCi0gICAgaW50ICgqbnVtYmVyX29mX2NoaWxkcmVuKSAoc3RydWN0IHZhcm9iaiAqIHBhcmVudCk7CisgICAgaW50ICgqbnVtYmVyX29mX2NoaWxkcmVuKSBQQVJBTVMgKChzdHJ1Y3QgdmFyb2JqICogcGFyZW50KSk7CiAKICAgICAvKiBUaGUgbmFtZSAoZXhwcmVzc2lvbikgb2YgYSByb290IHZhcm9iai4gKi8KLSAgICBjaGFyICooKm5hbWVfb2ZfdmFyaWFibGUpIChzdHJ1Y3QgdmFyb2JqICogcGFyZW50KTsKKyAgICBjaGFyICooKm5hbWVfb2ZfdmFyaWFibGUpIFBBUkFNUyAoKHN0cnVjdCB2YXJvYmogKiBwYXJlbnQpKTsKIAogICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBJTkRFWCd0aCBjaGlsZCBvZiBQQVJFTlQuICovCi0gICAgY2hhciAqKCpuYW1lX29mX2NoaWxkKSAoc3RydWN0IHZhcm9iaiAqIHBhcmVudCwgaW50IGluZGV4KTsKKyAgICBjaGFyICooKm5hbWVfb2ZfY2hpbGQpIFBBUkFNUyAoKHN0cnVjdCB2YXJvYmogKiBwYXJlbnQsIGludCBpbmRleCkpOwogCiAgICAgLyogVGhlIHZhbHVlX3B0ciBvZiB0aGUgcm9vdCB2YXJpYWJsZSBST09ULiAqLwotICAgICAgdmFsdWVfcHRyICgqdmFsdWVfb2Zfcm9vdCkgKHN0cnVjdCB2YXJvYmogKiogcm9vdF9oYW5kbGUpOworICAgICAgdmFsdWVfcHRyICgqdmFsdWVfb2Zfcm9vdCkgUEFSQU1TICgoc3RydWN0IHZhcm9iaiAqKiByb290X2hhbmRsZSkpOwogCiAgICAgLyogVGhlIHZhbHVlX3B0ciBvZiB0aGUgSU5ERVgndGggY2hpbGQgb2YgUEFSRU5ULiAqLwotICAgICAgdmFsdWVfcHRyICgqdmFsdWVfb2ZfY2hpbGQpIChzdHJ1Y3QgdmFyb2JqICogcGFyZW50LCBpbnQgaW5kZXgpOworICAgICAgdmFsdWVfcHRyICgqdmFsdWVfb2ZfY2hpbGQpIFBBUkFNUyAoKHN0cnVjdCB2YXJvYmogKiBwYXJlbnQsIGludCBpbmRleCkpOwogCiAgICAgLyogVGhlIHR5cGUgb2YgdGhlIElOREVYJ3RoIGNoaWxkIG9mIFBBUkVOVC4gKi8KLSAgICBzdHJ1Y3QgdHlwZSAqKCp0eXBlX29mX2NoaWxkKSAoc3RydWN0IHZhcm9iaiAqIHBhcmVudCwgaW50IGluZGV4KTsKKyAgICBzdHJ1Y3QgdHlwZSAqKCp0eXBlX29mX2NoaWxkKSBQQVJBTVMgKChzdHJ1Y3QgdmFyb2JqICogcGFyZW50LCBpbnQgaW5kZXgpKTsKIAogICAgIC8qIElzIFZBUiBlZGl0YWJsZT8gKi8KLSAgICBpbnQgKCp2YXJpYWJsZV9lZGl0YWJsZSkgKHN0cnVjdCB2YXJvYmogKiB2YXIpOworICAgIGludCAoKnZhcmlhYmxlX2VkaXRhYmxlKSBQQVJBTVMgKChzdHJ1Y3QgdmFyb2JqICogdmFyKSk7CiAKICAgICAvKiBUaGUgY3VycmVudCB2YWx1ZSBvZiBWQVIuICovCi0gICAgY2hhciAqKCp2YWx1ZV9vZl92YXJpYWJsZSkgKHN0cnVjdCB2YXJvYmogKiB2YXIpOworICAgIGNoYXIgKigqdmFsdWVfb2ZfdmFyaWFibGUpIFBBUkFNUyAoKHN0cnVjdCB2YXJvYmogKiB2YXIpKTsKICAgfTsKIAogLyogQXJyYXkgb2Yga25vd24gc291cmNlIGxhbmd1YWdlIHJvdXRpbmVzLiAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3dpbjMyLW5hdC5jIGIvZ2RiL3dpbjMyLW5hdC5jCmluZGV4IDI5OGZkNTEuLmI0OTNlZDMgMTAwNjQ0Ci0tLSBhL2dkYi93aW4zMi1uYXQuYworKysgYi9nZGIvd2luMzItbmF0LmMKQEAgLTM0LDkgKzM0LDEzIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAid2luZGVmcy5oIgorI2Vsc2UgLyogb3RoZXIgV0lOMzIgY29tcGlsZXIgKi8KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8aW1hZ2VobHAuaD4KLSNpbmNsdWRlIDxzeXMvY3lnd2luLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgImJ1aWxkc3ltLmgiCiAjaW5jbHVkZSAic3ltZmlsZS5oIgpAQCAtNDgsNyArNTIsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAvKiBUaGUgdWkncyBldmVudCBsb29wLiAqLwotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgKGludCBzaWdubyk7CitleHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKIAogLyogSWYgd2UncmUgbm90IHVzaW5nIHRoZSBvbGQgQ3lnd2luIGhlYWRlciBmaWxlIHNldCwgZGVmaW5lIHRoZQogICAgZm9sbG93aW5nIHdoaWNoIG5ldmVyIHNob3VsZCBoYXZlIGJlZW4gaW4gdGhlIGdlbmVyaWMgV2luMzIgQVBJCkBAIC02Miw3ICs2Niw3IEBACiAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgaW4gYSBjeWd3aW4gaW5jbHVkZSBmaWxlLiAqLwogI2RlZmluZSBDWUdXSU5fU0lHTkFMX1NUUklORyAiY3lnd2luOiBzaWduYWwiCiAKLSNkZWZpbmUgQ0hFQ0soeCkJY2hlY2sgKHgsIF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDSEVDSyh4KSAJY2hlY2sgKHgsIF9fRklMRV9fLF9fTElORV9fKQogI2RlZmluZSBERUJVR19FWEVDKHgpCWlmIChkZWJ1Z19leGVjKQkJcHJpbnRmIHgKICNkZWZpbmUgREVCVUdfRVZFTlRTKHgpCWlmIChkZWJ1Z19ldmVudHMpCXByaW50ZiB4CiAjZGVmaW5lIERFQlVHX01FTSh4KQlpZiAoZGVidWdfbWVtb3J5KQlwcmludGYgeApAQCAtNzcsNiArODEsNyBAQAogCiBzdGF0aWMgaW50IGxhc3Rfc2lnID0gMDsJLyogU2V0IGlmIGEgc2lnbmFsIHdhcyByZWNlaXZlZCBmcm9tIHRoZQogCQkJCSAgIGRlYnVnZ2VkIHByb2Nlc3MgKi8KKwogLyogVGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIGluZm9ybWF0aW9uIHRoYXQgaXMKICAgIG5vdCBhdmFpbGFibGUgaW4gZ2RiJ3MgdGhyZWFkIHN0cnVjdHVyZS4gKi8KIHR5cGVkZWYgc3RydWN0IHRocmVhZF9pbmZvX3N0cnVjdApAQCAtOTAsNyArOTUsNyBAQAogICAgIFNUQUNLRlJBTUUgc2Y7CiAgIH0gdGhyZWFkX2luZm87CiAKLXN0YXRpYyB0aHJlYWRfaW5mbyB0aHJlYWRfaGVhZDsKK3N0YXRpYyB0aHJlYWRfaW5mbyB0aHJlYWRfaGVhZCA9IHtOVUxMfTsKIAogLyogVGhlIHByb2Nlc3MgYW5kIHRocmVhZCBoYW5kbGVzIGZvciB0aGUgYWJvdmUgY29udGV4dC4gKi8KIApAQCAtOTksNiArMTA0LDggQEAKIHN0YXRpYyBIQU5ETEUgY3VycmVudF9wcm9jZXNzX2hhbmRsZTsJLyogQ3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzICovCiBzdGF0aWMgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkOwkvKiBJbmZvIG9uIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgKi8KIHN0YXRpYyBEV09SRCBtYWluX3RocmVhZF9pZDsJLyogVGhyZWFkIElEIG9mIHRoZSBtYWluIHRocmVhZCAqLworc3RhdGljIGludCBpZ25vcmVfZmlyc3RfZmlyc3RfY2hhbmNlID0gMDsgLyogVHJ1ZSBpZiB3ZSBzaG91bGQgaWdub3JlIHRoZQorCQkJCQkgICAgIGZpcnN0IGZpcnN0IGNoYW5jZSBleGNlcHRpb24gdGhhdCB3ZSBnZXQuICovCiAKIC8qIENvdW50cyBvZiB0aGluZ3MuICovCiBzdGF0aWMgaW50IGV4Y2VwdGlvbl9jb3VudCA9IDA7CkBAIC0yNzUsNyArMjgyLDcgQEAKIGNoZWNrIChCT09MIG9rLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKIHsKICAgaWYgKCFvaykKLSAgICBwcmludGZfZmlsdGVyZWQgKCJlcnJvciByZXR1cm4gJXM6JWQgd2FzICVsdVxuIiwgZmlsZSwgbGluZSwgR2V0TGFzdEVycm9yICgpKTsKKyAgICBwcmludGZfZmlsdGVyZWQgKCJlcnJvciByZXR1cm4gJXM6JWQgd2FzICVkXG4iLCBmaWxlLCBsaW5lLCBHZXRMYXN0RXJyb3IgKCkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzg5LDcgKzM5Niw3IEBACiAgIGlmICghb2spCiAgICAgZ290byBmYWlsZWQ7CiAKLSAgZm9yIChpID0gMDsgaSA8IChpbnQpIChjYk5lZWRlZCAvIHNpemVvZiAoSE1PRFVMRSkpOyBpKyspCisgIGZvciAoaSA9IDA7IGkgPCBjYk5lZWRlZCAvIHNpemVvZiAoSE1PRFVMRSk7IGkrKykKICAgICB7CiAgICAgICBpZiAoISgqcHNhcGlfR2V0TW9kdWxlSW5mb3JtYXRpb24pIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAogCQkJCQkgICAgIERsbEhhbmRsZSBbaV0sCkBAIC00MDIsNyArNDA5LDcgQEAKIAkJCQkJICAgIGRsbF9uYW1lX3JldCwKIAkJCQkJICAgIE1BWF9QQVRIKTsKICAgICAgIGlmIChsZW4gPT0gMCkKLQllcnJvciAoIkVycm9yIGdldHRpbmcgZGxsIG5hbWU6ICV1XG4iLCBHZXRMYXN0RXJyb3IgKCkpOworCWVycm9yICgiRXJyb3IgZ2V0dGluZyBkbGwgbmFtZTogJXVcbiIsIEdldExhc3RFcnJvciAoKSk7IAogCiAgICAgICBpZiAoKERXT1JEKSAobWkubHBCYXNlT2ZEbGwpID09IEJhc2VBZGRyZXNzKQogCXJldHVybiAxOwpAQCAtNDEzLDggKzQyMCw2IEBACiAgIHJldHVybiAwOwogfQogCi0vKiBFbmNhcHN1bGF0ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgaW4gYSBjYWxsIHRvCi0gICBzeW1ib2xfZmlsZV9hZGRfYXJncyAqLwogc3RydWN0IHNhZmVfc3ltYm9sX2ZpbGVfYWRkX2FyZ3MKIHsKICAgY2hhciAqbmFtZTsKQEAgLTQyNSw4ICs0MzAsNiBAQAogICBzdHJ1Y3Qgb2JqZmlsZSAqcmV0OwogfTsKIAotLyogQ2FsbCBzeW1ib2xfZmlsZV9hZGQgd2l0aCBzdGRlcnIgcmVkaXJlY3RlZC4gIFdlIGRvbid0IGNhcmUgaWYgdGhlcmUKLSAgIGFyZSBlcnJvcnMuICovCiBzdGF0aWMgaW50CiBzYWZlX3N5bWJvbF9maWxlX2FkZF9zdHViICh2b2lkICphcmd2KQogewpAQCAtNDM2LDE2ICs0MzksMTMgQEAKICN1bmRlZiBwCiB9CiAKLS8qIFJlc3RvcmUgZ2RiJ3Mgc3RkZXJyIGFmdGVyIGNhbGxpbmcgc3ltYm9sX2ZpbGVfYWRkICovCiBzdGF0aWMgdm9pZAogc2FmZV9zeW1ib2xfZmlsZV9hZGRfY2xlYW51cCAodm9pZCAqZ2RiX3N0ZGVycnYpCiB7Ci0gIGdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7CiAgIHVpX2ZpbGVfZGVsZXRlIChnZGJfc3RkZXJyKTsKICAgZ2RiX3N0ZGVyciA9IChzdHJ1Y3QgdWlfZmlsZSAqKWdkYl9zdGRlcnJ2OwogfQogCi0vKiBzeW1ib2xfZmlsZV9hZGQgd3JhcHBlciB0aGF0IHByZXZlbnRzIGVycm9ycyBmcm9tIGJlaW5nIGRpc3BsYXllZC4gKi8KIHN0YXRpYyBzdHJ1Y3Qgb2JqZmlsZSAqCiBzYWZlX3N5bWJvbF9maWxlX2FkZCAoY2hhciAqbmFtZSwgaW50IGZyb21fdHR5LAogCQkgICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGRyX2luZm8gKmFkZHJzLApAQCAtNDU3LDcgKzQ1Nyw2IEBACiAKICAgY2xlYW51cCA9IG1ha2VfY2xlYW51cCAoc2FmZV9zeW1ib2xfZmlsZV9hZGRfY2xlYW51cCwgZ2RiX3N0ZGVycik7CiAKLSAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKICAgZ2RiX3N0ZGVyciA9IHVpX2ZpbGVfbmV3ICgpOwogICBwLm5hbWUgPSBuYW1lOwogICBwLmZyb21fdHR5ID0gZnJvbV90dHk7CkBAIC00NzAsMzIgKzQ2OSwyMiBAQAogICByZXR1cm4gcC5yZXQ7CiB9CiAKLS8qIE1haW50YWluIGEgbGlua2VkIGxpc3Qgb2YgInNvIiBpbmZvcm1hdGlvbi4gKi8KLXN0cnVjdCBzb19zdHVmZgotewotICBzdHJ1Y3Qgc29fc3R1ZmYgKm5leHQsICoqbGFzdDsKLSAgRFdPUkQgbG9hZF9hZGRyOwotICBjaGFyIG5hbWVbMF07Ci19IHNvbGliX3N0YXJ0LCAqc29saWJfZW5kOwotCi0vKiBSZW1lbWJlciB0aGUgbWF4aW11bSBETEwgbGVuZ3RoIGZvciBwcmludGluZyBpbiBpbmZvIGRsbCBjb21tYW5kLiAqLwotaW50IG1heF9kbGxfbmFtZV9sZW47Ci0KIC8qIFdhaXQgZm9yIGNoaWxkIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2UKICAgIG9mIGVycm9yOyBzdG9yZSBzdGF0dXMgdGhyb3VnaCBhcmd1bWVudCBwb2ludGVyIE9VUlNUQVRVUy4gICovCisKIHN0YXRpYyBpbnQKLWhhbmRsZV9sb2FkX2RsbCAoUFRSIGR1bW15IEFUVFJJQlVURV9VTlVTRUQpCitoYW5kbGVfbG9hZF9kbGwgKFBUUiBkdW1teSkKIHsKICAgTE9BRF9ETExfREVCVUdfSU5GTyAqZXZlbnQgPSAmY3VycmVudF9ldmVudC51LkxvYWREbGw7CiAgIERXT1JEIGRsbF9uYW1lX3B0cjsKICAgRFdPUkQgZG9uZTsKICAgY2hhciBkbGxfYnVmW01BWF9QQVRIICsgMV07Ci0gIHN0cnVjdCBzb19zdHVmZiAqc28sICpzb2xhc3Q7Ci0gIGNoYXIgKmRsbF9uYW1lID0gTlVMTDsKLSAgRFdPUkQgZGxsX2Jhc2UgPSAwOwotICBpbnQgbGVuOwotICBjaGFyICpwOworICBjaGFyICpwLCAqZGxsX25hbWUgPSBOVUxMOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1pbmZvOworICBzdHJ1Y3Qgc2VjdGlvbl9hZGRyX2luZm8gc2VjdGlvbl9hZGRyczsKIAorICBtZW1zZXQgKCZzZWN0aW9uX2FkZHJzLCAwLCBzaXplb2YgKHNlY3Rpb25fYWRkcnMpKTsKICAgZGxsX2J1ZlswXSA9IGRsbF9idWZbc2l6ZW9mIChkbGxfYnVmKSAtIDFdID0gJ1wwJzsKIAogICBpZiAoIXBzYXBpX2dldF9kbGxfbmFtZSAoKERXT1JEKSAoZXZlbnQtPmxwQmFzZU9mRGxsKSwgZGxsX2J1ZikpCkBAIC01MDgsNyArNDk3LDcgQEAKICAgICAgYSBwcm9ncmFtLiAgSXQgd2lsbCBub3Qgd29yayBmb3IgYXR0YWNoZWQgcHJvY2Vzc2VzLiAqLwogICBpZiAoZGxsX25hbWUgPT0gTlVMTCB8fCAqZGxsX25hbWUgPT0gJ1wwJykKICAgICB7Ci0gICAgICBEV09SRCBzaXplID0gZXZlbnQtPmZVbmljb2RlID8gc2l6ZW9mIChXQ0hBUikgOiBzaXplb2YgKGNoYXIpOworICAgICAgaW50IHNpemUgPSBldmVudC0+ZlVuaWNvZGUgPyBzaXplb2YgKFdDSEFSKSA6IHNpemVvZiAoY2hhcik7CiAgICAgICBpbnQgbGVuID0gMDsKICAgICAgIGNoYXIgYlsyXTsKIApAQCAtNTYyLDk5ICs1NTEsMTkgQEAKICAgaWYgKCFkbGxfbmFtZSkKICAgICByZXR1cm4gMTsKIAotICAodm9pZCkgc3RybHdyIChkbGxfbmFtZSk7Ci0KICAgd2hpbGUgKChwID0gc3RyY2hyIChkbGxfbmFtZSwgJ1xcJykpKQogICAgICpwID0gJy8nOwogCi0gIHNvID0gKHN0cnVjdCBzb19zdHVmZiAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzb19zdHVmZikgKyAgc3RybGVuIChkbGxfbmFtZSkgKyA4ICsgMik7Ci0gIHNvLT5sb2FkX2FkZHIgPSAoRFdPUkQpIGV2ZW50LT5scEJhc2VPZkRsbCArIDB4MTAwMDsKLSAgc3RyY3B5IChzby0+bmFtZSwgZGxsX25hbWUpOwotCi0gIHNvbGliX2VuZC0+bmV4dCA9IHNvOwotICBzb2xpYl9lbmQgPSBzbzsKLSAgc28tPm5leHQgPSBOVUxMOwotCi0gIGxlbiA9IHN0cmxlbiAoZGxsX25hbWUpOwotICBpZiAobGVuID4gbWF4X2RsbF9uYW1lX2xlbikKLSAgICBtYXhfZGxsX25hbWVfbGVuID0gbGVuOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBSZXR1cm4gbmFtZSBvZiBsYXN0IGxvYWRlZCBETEwuICovCi1jaGFyICoKLWNoaWxkX3NvbGliX2xvYWRlZF9saWJyYXJ5X3BhdGhuYW1lIChpbnQgcGlkKQotewotICByZXR1cm4gIXNvbGliX2VuZCB8fCAhc29saWJfZW5kLT5uYW1lWzBdPyBOVUxMIDogc29saWJfZW5kLT5uYW1lOwotfQotCi0vKiBDbGVhciBsaXN0IG9mIGxvYWRlZCBETExzLiAqLwotdm9pZAotY2hpbGRfY2xlYXJfc29saWJzICh2b2lkKQotewotICBzdHJ1Y3Qgc29fc3R1ZmYgKnNvLCAqc28xID0gc29saWJfc3RhcnQubmV4dDsKLQotICB3aGlsZSAoKHNvID0gc28xKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNvMSA9IHNvLT5uZXh0OwotICAgICAgZnJlZSAoc28pOwotICAgIH0KLQotICBzb2xpYl9zdGFydC5uZXh0ID0gTlVMTDsKLSAgc29saWJfZW5kID0gJnNvbGliX3N0YXJ0OwotICBtYXhfZGxsX25hbWVfbGVuID0gc2l6ZW9mICgiRExMIE5hbWUiKSAtIDE7Ci19Ci0KLS8qIEFkZCBETEwgc3ltYm9sIGluZm9ybWF0aW9uLiAqLwotdm9pZAotY2hpbGRfc29saWJfYWRkIChjaGFyICpmaWxlbmFtZSwgaW50IGZyb21fdHR5LCBzdHJ1Y3QgdGFyZ2V0X29wcyAqdCkKLXsKLSAgc3RydWN0IHNlY3Rpb25fYWRkcl9pbmZvIHNlY3Rpb25fYWRkcnM7Ci0KICAgLyogVGhlIHN5bWJvbHMgaW4gYSBkbGwgYXJlIG9mZnNldCBieSAweDEwMDAsIHdoaWNoIGlzIHRoZQogICAgICB0aGUgb2Zmc2V0IGZyb20gMCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiBhbiBpbWFnZSAtIGJlY2F1c2UKICAgICAgb2YgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuICovCiAKLSAgaWYgKCFzb2xpYl9lbmQgfHwgIXNvbGliX2VuZC0+bmFtZVswXSkKLSAgICByZXR1cm47Ci0KLSAgbWVtc2V0ICgmc2VjdGlvbl9hZGRycywgMCwgc2l6ZW9mIChzZWN0aW9uX2FkZHJzKSk7CiAgIHNlY3Rpb25fYWRkcnMub3RoZXJbMF0ubmFtZSA9ICIudGV4dCI7Ci0gIHNlY3Rpb25fYWRkcnMub3RoZXJbMF0uYWRkciA9IHNvbGliX2VuZC0+bG9hZF9hZGRyOwotICBzYWZlX3N5bWJvbF9maWxlX2FkZCAoc29saWJfZW5kLT5uYW1lLCAwLCAmc2VjdGlvbl9hZGRycywgMCwgT0JKRl9TSEFSRUQpOworICBzZWN0aW9uX2FkZHJzLm90aGVyWzBdLmFkZHIgPSAoaW50KSBldmVudC0+bHBCYXNlT2ZEbGwgKyAweDEwMDA7CisgIHNhZmVfc3ltYm9sX2ZpbGVfYWRkIChkbGxfbmFtZSwgMCwgJnNlY3Rpb25fYWRkcnMsIDAsIE9CSkZfU0hBUkVEKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCIleDolc1xuIiwgZXZlbnQtPmxwQmFzZU9mRGxsLCBkbGxfbmFtZSk7CiAKLSAgcmV0dXJuOwotfQotCi0vKiBMb2FkIERMTCBzeW1ib2wgaW5mby4gKi8KLXZvaWQKLWRsbF9zeW1ib2xfY29tbWFuZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQotewotICBzdHJ1Y3Qgc2VjdGlvbl9hZGRyX2luZm8gc2VjdGlvbl9hZGRyczsKLQotICBkb250X3JlcGVhdCAoKTsKLSAgCi0gIGlmIChhcmdzID09IE5VTEwpCi0gICAgZXJyb3IgKCJkbGwtc3ltYm9scyByZXF1aXJlcyBhIGZpbGUgbmFtZSIpOwotCi0gIHNhZmVfc3ltYm9sX2ZpbGVfYWRkIChhcmdzLCAwLCBOVUxMLCAwLCBPQkpGX1NIQVJFRCk7Ci19IAotCi0vKiBMaXN0IGN1cnJlbnRseSBsb2FkZWQgRExMcy4gKi8KLXZvaWQKLWluZm9fZGxsX2NvbW1hbmQgKGNoYXIgKmlnbm9yZSwgaW50IGZyb21fdHR5KQotewotICBzdHJ1Y3Qgc29fc3R1ZmYgKnNvID0gJnNvbGliX3N0YXJ0OwotCi0gIGlmICghc28tPm5leHQpCi0gICAgcmV0dXJuOwotCi0gIHByaW50ZiAoIiUqcyAgTG9hZCBBZGRyZXNzXG4iLCAtbWF4X2RsbF9uYW1lX2xlbiwgIkRMTCBOYW1lIik7Ci0gIHdoaWxlICgoc28gPSBzby0+bmV4dCkgIT0gTlVMTCkKLSAgICBwcmludGZfdW5maWx0ZXJlZCAoIiUqcyAgJTA4bHhcbiIsIC1tYXhfZGxsX25hbWVfbGVuLCBzby0+bmFtZSwgc28tPmxvYWRfYWRkcik7Ci0KLSAgcmV0dXJuOworICByZXR1cm4gMTsKIH0KIAogLyogSGFuZGxlIERFQlVHX1NUUklORyBvdXRwdXQgZnJvbSBjaGlsZCBwcm9jZXNzLgpAQCAtNjc0LDcgKzU4Myw3IEBACiAgIGlmIChzdHJuY21wIChzLCBDWUdXSU5fU0lHTkFMX1NUUklORywgc2l6ZW9mIChDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxKSAhPSAwKQogICAgIHsKICAgICAgIGlmIChzdHJuY21wIChzLCAiY1lnIiwgMykgIT0gMCkKLQl3YXJuaW5nICgiJXMiLCBzKTsKKwl3YXJuaW5nIChzKTsKICAgICB9CiAgIGVsc2UKICAgICB7CkBAIC02OTMsMjEgKzYwMiwyNSBAQAogc3RhdGljIGludAogaGFuZGxlX2V4Y2VwdGlvbiAoc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCiB7CisgIGludCBpOworICBpbnQgZG9uZSA9IDA7CiAgIHRocmVhZF9pbmZvICp0aDsKLSAgRFdPUkQgY29kZSA9IGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGU7CisgIGludCBmYyA9IGlnbm9yZV9maXJzdF9maXJzdF9jaGFuY2U7CiAKICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CiAKKyAgaWdub3JlX2ZpcnN0X2ZpcnN0X2NoYW5jZSA9IDA7CisKICAgLyogUmVjb3JkIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLwogICB0aCA9IHRocmVhZF9yZWMgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwgLTEpOwogCiAgIGxhc3Rfc2lnID0gMDsKIAotICBzd2l0Y2ggKGNvZGUpCisgIHN3aXRjaCAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkKICAgICB7CiAgICAgY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQUNDRVNTX1ZJT0xBVElPTiBhdCAweCUwOGx4XG4iLAotCSAgICAgICAoRFdPUkQpIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQUNDRVNTX1ZJT0xBVElPTiBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOwogICAgICAgbGFzdF9zaWcgPSBTSUdTRUdWOwogICAgICAgYnJlYWs7CkBAIC03MTUsNDIgKzYyOCw0NyBAQAogICAgIGNhc2UgU1RBVFVTX0ZMT0FUX0RJVklERV9CWV9aRVJPOgogICAgIGNhc2UgU1RBVFVTX0ZMT0FUX09WRVJGTE9XOgogICAgIGNhc2UgU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk86Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNUQUNLX09WRVJGTE9XIGF0IDB4JTA4bHhcbiIsCi0JICAgICAgIChEV09SRCkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTVEFDS19PVkVSRkxPVyBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9GUEU7Ci0gICAgICBsYXN0X3NpZyA9IFNJR0ZQRTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgU1RBVFVTX1NUQUNLX09WRVJGTE9XOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTVEFDS19PVkVSRkxPVyBhdCAweCUwOGx4XG4iLAotCSAgICAgICAoRFdPUkQpIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU1RBQ0tfT1ZFUkZMT1cgYXQgMHglMDh4XG4iLAorCSAgICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7CiAgICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VHVjsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhDRVBUSU9OX0JSRUFLUE9JTlQ6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIEJSRUFLUE9JTlQgYXQgMHglMDhseFxuIiwKLQkgICAgICAgKERXT1JEKSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7CisgICAgICBpZiAoZmMgJiYgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNlICYmCisJICAoKERXT1JEKSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzICYgMHhjMDAwMDAwMCkpCisJeworCSAgbGFzdF9zaWcgPSAtMTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQlJFQUtQT0lOVCBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBEQkdfQ09OVFJPTF9DOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBDT05UUk9MX0MgYXQgMHglMDhseFxuIiwKLQkgICAgICAgKERXT1JEKSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7CisgICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIENPTlRST0xfQyBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7CiAgICAgICBsYXN0X3NpZyA9IFNJR0lOVDsJLyogRklYTUUgLSBzaG91bGQgY2hlY2sgcGFzcyBzdGF0ZSAqLwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNJTkdMRV9TVEVQIGF0IDB4JTA4bHhcbiIsCi0JICAgICAgIChEV09SRCkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTSU5HTEVfU1RFUCBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTjoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU0lOR0xFX0lMTCBhdCAweCUwOGx4XG4iLAotCSAgICAgICAoRFdPUkQpIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU0lOR0xFX0lMTCBhdCAweCUwOHhcbiIsCisJICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTEw7CiAgICAgICBsYXN0X3NpZyA9IFNJR0lMTDsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjogdW5rbm93biB0YXJnZXQgZXhjZXB0aW9uIDB4JTA4bHggYXQgMHglMDhseFxuIiwKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiB1bmtub3duIHRhcmdldCBleGNlcHRpb24gMHglMDh4IGF0IDB4JTA4eFxuIiwKIAkJICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUsCi0JCShEV09SRCkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcyk7CisJCWN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpOwogICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047CiAgICAgICBicmVhazsKICAgICB9CkBAIC03NjcsNyArNjg1LDcgQEAKICAgdGhyZWFkX2luZm8gKnRoOwogICBCT09MIHJlczsKIAotICBERUJVR19FVkVOVFMgKCgiQ29udGludWVEZWJ1Z0V2ZW50IChjcGlkPSVsZCwgY3RpZD0lbGQsIERCR19DT05USU5VRSk7XG4iLAorICBERUJVR19FVkVOVFMgKCgiQ29udGludWVEZWJ1Z0V2ZW50IChjcGlkPSVkLCBjdGlkPSVkLCBEQkdfQ09OVElOVUUpO1xuIiwKIAkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCkpOwogICByZXMgPSBDb250aW51ZURlYnVnRXZlbnQgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCiAJCQkgICAgY3VycmVudF9ldmVudC5kd1RocmVhZElkLApAQCAtNzc1LDcgKzY5Myw3IEBACiAgIGNvbnRpbnVlX3N0YXR1cyA9IDA7CiAgIGlmIChyZXMpCiAgICAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsgKHRoID0gdGgtPm5leHQpICE9IE5VTEw7KQotICAgICAgaWYgKCgoaWQgPT0gLTEpIHx8IChpZCA9PSAoaW50KSB0aC0+aWQpKSAmJiB0aC0+c3VzcGVuZF9jb3VudCkKKyAgICAgIGlmICgoKGlkID09IC0xKSB8fCAoaWQgPT0gdGgtPmlkKSkgJiYgdGgtPnN1c3BlbmRfY291bnQpCiAJewogCSAgZm9yIChpID0gMDsgaSA8IHRoLT5zdXNwZW5kX2NvdW50OyBpKyspCiAJICAgICh2b2lkKSBSZXN1bWVUaHJlYWQgKHRoLT5oKTsKQEAgLTc4OSwyMyArNzA3LDI3IEBACiAgICBoYW5kbGluZyBieSBXRkkgKG9yIHdoYXRldmVyKS4KICAqLwogc3RhdGljIGludAotZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChpbnQgcGlkIEFUVFJJQlVURV9VTlVTRUQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQorZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cywKKwkJICAgICAgIERXT1JEIHRhcmdldF9ldmVudF9jb2RlLCBpbnQgKnJldHZhbCkKIHsKICAgaW50IGJyZWFrb3V0ID0gMDsKICAgQk9PTCBkZWJ1Z19ldmVudDsKICAgRFdPUkQgY29udGludWVfc3RhdHVzLCBldmVudF9jb2RlOwogICB0aHJlYWRfaW5mbyAqdGggPSBOVUxMOwogICBzdGF0aWMgdGhyZWFkX2luZm8gZHVtbXlfdGhyZWFkX2luZm87Ci0gIGludCByZXR2YWwgPSAwOwogCiAgIGlmICghKGRlYnVnX2V2ZW50ID0gV2FpdEZvckRlYnVnRXZlbnQgKCZjdXJyZW50X2V2ZW50LCAxMDAwKSkpCi0gICAgZ290byBvdXQ7CisgICAgeworICAgICAgKnJldHZhbCA9IDA7CisgICAgICBnb3RvIG91dDsKKyAgICB9CiAKICAgZXZlbnRfY291bnQrKzsKICAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVFOworICAqcmV0dmFsID0gMDsKIAogICBldmVudF9jb2RlID0gY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlOwotICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CisgIGJyZWFrb3V0ID0gZXZlbnRfY29kZSA9PSB0YXJnZXRfZXZlbnRfY29kZTsKIAogICBzd2l0Y2ggKGV2ZW50X2NvZGUpCiAgICAgewpAQCAtODIwLDcgKzc0Miw2IEBACiAgICAgICBpZiAoaW5mb192ZXJib3NlKQogCXByaW50Zl91bmZpbHRlcmVkICgiW05ldyAlc11cbiIsCiAJCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKSk7Ci0gICAgICByZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVhJVF9USFJFQURfREVCVUdfRVZFTlQ6CkBAIC04NDEsMTEgKzc2Miw4IEBACiAKICAgICAgIG1haW5fdGhyZWFkX2lkID0gaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOwogICAgICAgLyogQWRkIHRoZSBtYWluIHRocmVhZCAqLwotICAgICAgdGggPSBjaGlsZF9hZGRfdGhyZWFkIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkJICAgICBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFByb2Nlc3MpOwogICAgICAgdGggPSBjaGlsZF9hZGRfdGhyZWFkIChpbmZlcmlvcl9waWQsCiAJCQkgICAgIGN1cnJlbnRfZXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oVGhyZWFkKTsKLSAgICAgIHJldHZhbCA9IG91cnN0YXR1cy0+dmFsdWUucmVsYXRlZF9waWQgPSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoKQEAgLTg1Niw3ICs3NzQsOCBAQAogICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKICAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IGN1cnJlbnRfZXZlbnQudS5FeGl0UHJvY2Vzcy5kd0V4aXRDb2RlOwogICAgICAgQ2xvc2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpOwotICAgICAgcmV0dmFsID0gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZDsKKyAgICAgICpyZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOworICAgICAgYnJlYWtvdXQgPSAxOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIExPQURfRExMX0RFQlVHX0VWRU5UOgpAQCAtODY2LDkgKzc4NSw2IEBACiAJCSAgICAgIkxPQURfRExMX0RFQlVHX0VWRU5UIikpOwogICAgICAgY2F0Y2hfZXJyb3JzIChoYW5kbGVfbG9hZF9kbGwsIE5VTEwsIChjaGFyICopICIiLCBSRVRVUk5fTUFTS19BTEwpOwogICAgICAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CS8qIG1hcmsgYWxsIHJlZ3MgaW52YWxpZCAqLwotICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0xPQURFRDsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IDA7Ci0gICAgICByZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFVOTE9BRF9ETExfREVCVUdfRVZFTlQ6CkBAIC04ODMsOCArNzk5LDE0IEBACiAJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAogCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAogCQkgICAgICJFWENFUFRJT05fREVCVUdfRVZFTlQiKSk7Ci0gICAgICBoYW5kbGVfZXhjZXB0aW9uIChvdXJzdGF0dXMpOwotICAgICAgcmV0dmFsID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOworICAgICAgaWYgKGhhbmRsZV9leGNlcHRpb24gKG91cnN0YXR1cykpCisJKnJldHZhbCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAobGFzdF9zaWcgPj0gMCkKKwkgICAgY29udGludWVfc3RhdHVzID0gREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRDsKKwkgIGJyZWFrb3V0ID0gMDsKKwl9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDoJLyogbWVzc2FnZSBmcm9tIHRoZSBrZXJuZWwgKi8KQEAgLTg5MiwzMSArODE0LDMzIEBACiAJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAogCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAogCQkgICAgICJPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UIikpOwotICAgICAgaWYgKGhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nICggb3Vyc3RhdHVzKSkKLQlyZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOworICAgICAgaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKCBvdXJzdGF0dXMpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lbGQgdGlkPSVsZFxuIiwKLQkJCSAoRFdPUkQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCQkgKERXT1JEKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpOwotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICAgICAgICAgICAgICAgIHVua25vd24gZXZlbnQgY29kZSAlbGRcbiIsCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkXG4iLAorCQkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCisJCQkgY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAgICAgICAgICAgICAgICB1bmtub3duIGV2ZW50IGNvZGUgJWRcbiIsCiAJCQkgY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlKTsKICAgICAgIGJyZWFrOwogICAgIH0KIAotICBpZiAoIXJldHZhbCkKLSAgICBDSEVDSyAoY2hpbGRfY29udGludWUgKGNvbnRpbnVlX3N0YXR1cywgLTEpKTsKLSAgZWxzZQorICBpZiAoYnJlYWtvdXQpCiAgICAgY3VycmVudF90aHJlYWQgPSB0aCA/OiB0aHJlYWRfcmVjIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsIFRSVUUpOworICBlbHNlCisgICAgQ0hFQ0sgKGNoaWxkX2NvbnRpbnVlIChjb250aW51ZV9zdGF0dXMsIC0xKSk7CiAKIG91dDoKLSAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dXJuIGJyZWFrb3V0OwogfQogCiAvKiBXYWl0IGZvciBpbnRlcmVzdGluZyBldmVudHMgdG8gb2NjdXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLiAqLwogc3RhdGljIGludAogY2hpbGRfd2FpdCAoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCiB7CisgIERXT1JEIGV2ZW50X2NvZGU7CisgIGludCByZXR2YWw7CisKICAgLyogV2UgbG9vcCB3aGVuIHdlIGdldCBhIG5vbi1zdGFuZGFyZCBleGNlcHRpb24gcmF0aGVyIHRoYW4gcmV0dXJuCiAgICAgIHdpdGggYSBTUFVSSU9VUyBiZWNhdXNlIHJlc3VtZSBjYW4gdHJ5IGFuZCBzdGVwIG9yIG1vZGlmeSB0aGluZ3MsCiAgICAgIHdoaWNoIG5lZWRzIGEgY3VycmVudF90aHJlYWQtPmguICBCdXQgc29tZSBvZiB0aGVzZSBleGNlcHRpb25zIG1hcmsKQEAgLTkyNCwyMSArODQ4LDE4IEBACiAgICAgIGlzbid0IG5lY2Vzc2FyaWx5IHdoYXQgeW91IHRoaW5rIGl0IGlzLiAqLwogCiAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCByZXR2YWwgPSBnZXRfY2hpbGRfZGVidWdfZXZlbnQgKHBpZCwgb3Vyc3RhdHVzKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JcmV0dXJuIHJldHZhbDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgZGV0YWNoID0gMDsKKyAgICBpZiAoZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChwaWQsIG91cnN0YXR1cywgRVhDRVBUSU9OX0RFQlVHX0VWRU5ULCAmcmV0dmFsKSkKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgZWxzZQorICAgICAgeworCWludCBkZXRhY2ggPSAwOwogCi0JICBpZiAodWlfbG9vcF9ob29rICE9IE5VTEwpCi0JICAgIGRldGFjaCA9IHVpX2xvb3BfaG9vayAoMCk7CisJaWYgKHVpX2xvb3BfaG9vayAhPSBOVUxMKQorCSAgZGV0YWNoID0gdWlfbG9vcF9ob29rICgwKTsKIAotCSAgaWYgKGRldGFjaCkKLQkgICAgY2hpbGRfa2lsbF9pbmZlcmlvciAoKTsKLQl9Ci0gICAgfQorCWlmIChkZXRhY2gpCisJICBjaGlsZF9raWxsX2luZmVyaW9yICgpOworICAgICAgfQogfQogCiAvKiBBdHRhY2ggdG8gcHJvY2VzcyBQSUQsIHRoZW4gaW5pdGlhbGl6ZSBmb3IgZGVidWdnaW5nIGl0LiAgKi8KQEAgLTk2Myw5ICs4ODQsNiBAQAogICBleGNlcHRpb25fY291bnQgPSAwOwogICBldmVudF9jb3VudCA9IDA7CiAKLSAgY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKTsKLSAgY2hpbGRfY2xlYXJfc29saWJzICgpOwotCiAgIGlmIChmcm9tX3R0eSkKICAgICB7CiAgICAgICBjaGFyICpleGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKQEAgLTk4NCw3ICs5MDIsOSBAQAogfQogCiBzdGF0aWMgdm9pZAotY2hpbGRfZGV0YWNoIChjaGFyICphcmdzIEFUVFJJQlVURV9VTlVTRUQsIGludCBmcm9tX3R0eSkKK2NoaWxkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKIHsKICAgaWYgKGZyb21fdHR5KQogICAgIHsKQEAgLTEwMDIsNyArOTIyLDggQEAKIC8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCiAKIHN0YXRpYyB2b2lkCi1jaGlsZF9maWxlc19pbmZvIChzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQpCitjaGlsZF9maWxlc19pbmZvIChpZ25vcmUpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmU7CiB7CiAgIHByaW50Zl91bmZpbHRlcmVkICgiXHRVc2luZyB0aGUgcnVubmluZyBpbWFnZSBvZiAlcyAlcy5cbiIsCiAgICAgICBhdHRhY2hfZmxhZyA/ICJhdHRhY2hlZCIgOiAiY2hpbGQiLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7CkBAIC0xMDEwLDcgKzkzMSw5IEBACiAKIC8qIEFSR1NVU0VEICovCiBzdGF0aWMgdm9pZAotY2hpbGRfb3BlbiAoY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQsIGludCBmcm9tX3R0eSBBVFRSSUJVVEVfVU5VU0VEKQorY2hpbGRfb3BlbiAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7CiB7CiAgIGVycm9yICgiVXNlIHRoZSBcInJ1blwiIGNvbW1hbmQgdG8gc3RhcnQgYSBVbml4IGNoaWxkIHByb2Nlc3MuIik7CiB9CkBAIC0xMDM3LDE1ICs5NjAsMTcgQEAKICAgQk9PTCByZXQ7CiAgIERXT1JEIGZsYWdzOwogICBjaGFyICphcmdzOwotICBleHRlcm4gaW50IHN0b3BfYWZ0ZXJfdHJhcDsKKyAgRFdPUkQgZXZlbnRfY29kZTsKIAogICBpZiAoIWV4ZWNfZmlsZSkKLSAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkLCB1c2UgYHRhcmdldCBleGVjJy5cbiIpOworICAgIHsKKyAgICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBzcGVjaWZpZWQsIHVzZSBgdGFyZ2V0IGV4ZWMnLlxuIik7CisgICAgfQogCiAgIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7CiAgIHNpLmNiID0gc2l6ZW9mIChzaSk7CiAKLSAgY3lnd2luX2NvbnZfdG9fd2luMzJfcGF0aCAoZXhlY19maWxlLCByZWFsX3BhdGgpOworICBjeWd3aW4zMl9jb252X3RvX3dpbjMyX3BhdGggKGV4ZWNfZmlsZSwgcmVhbF9wYXRoKTsKIAogICBmbGFncyA9IERFQlVHX09OTFlfVEhJU19QUk9DRVNTOwogCkBAIC0xMDkxLDkgKzEwMTYsOSBAQAogCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7CiAJICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQogCSAgICAgIHsKLQkJaWYgKGN5Z3dpbl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKKwkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQogCQkgIGVudmxlbiArPSBsZW4KLQkJICAgICsgY3lnd2luX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdF9idWZfc2l6ZSAoZW52W2ldICsgbGVuKTsKKwkJICAgICsgY3lnd2luMzJfcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0X2J1Zl9zaXplIChlbnZbaV0gKyBsZW4pOwogCQllbHNlCiAJCSAgZW52bGVuICs9IHN0cmxlbiAoZW52W2ldKSArIDE7CiAJCWJyZWFrOwpAQCAtMTExNSwxMCArMTA0MCwxMCBAQAogCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7CiAJICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQogCSAgICAgIHsKLQkJaWYgKGN5Z3dpbl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKKwkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQogCQkgIHsKIAkJICAgIG1lbWNweSAodGVtcCwgZW52W2ldLCBsZW4pOwotCQkgICAgY3lnd2luX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdCAoZW52W2ldICsgbGVuLCB0ZW1wICsgbGVuKTsKKwkJICAgIGN5Z3dpbjMyX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdCAoZW52W2ldICsgbGVuLCB0ZW1wICsgbGVuKTsKIAkJICB9CiAJCWVsc2UKIAkJICBzdHJjcHkgKHRlbXAsIGVudltpXSk7CkBAIC0xMTU3LDIzICsxMDgyLDE3IEBACiAgIGluZmVyaW9yX3BpZCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCA9IHBpLmR3VGhyZWFkSWQ7CiAgIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKICAgY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKTsKLSAgY2hpbGRfY2xlYXJfc29saWJzICgpOwotICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKICAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CiAgIHRhcmdldF90ZXJtaW5hbF9pbml0ICgpOwogICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7Ci0gIGxhc3Rfc2lnID0gMDsKIAotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBzdG9wX2FmdGVyX3RyYXAgPSAxOwotICAgICAgd2FpdF9mb3JfaW5mZXJpb3IgKCk7Ci0gICAgICBpZiAoc3RvcF9zaWduYWwgIT0gVEFSR0VUX1NJR05BTF9UUkFQKQotCXJlc3VtZSAoMCwgc3RvcF9zaWduYWwpOwotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLSAgc3RvcF9hZnRlcl90cmFwID0gMDsKKyAgaWdub3JlX2ZpcnN0X2ZpcnN0X2NoYW5jZSA9IDE7CisKKyAgLyogUnVuIHVudGlsIHByb2Nlc3MgYW5kIHRocmVhZHMgYXJlIGxvYWRlZCAqLworICB3aGlsZSAoIWdldF9jaGlsZF9kZWJ1Z19ldmVudCAoaW5mZXJpb3JfcGlkLCAmZHVtbXksCisJCQkJIENSRUFURV9QUk9DRVNTX0RFQlVHX0VWRU5ULCAmcmV0KSkKKyAgICBjb250aW51ZTsKIAogICAvKiBjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSk7Ki8KICAgcHJvY2VlZCAoKENPUkVfQUREUikgLSAxLCBUQVJHRVRfU0lHTkFMXzAsIDApOwpAQCAtMTIwMCwyMSArMTExOSwyMSBAQAogCiBpbnQKIGNoaWxkX3hmZXJfbWVtb3J5IChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqb3VyLCBpbnQgbGVuLAotCQkgICBpbnQgd3JpdGUsIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQgQVRUUklCVVRFX1VOVVNFRCkKKwkJICAgaW50IHdyaXRlLCBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQogewogICBEV09SRCBkb25lOwogICBpZiAod3JpdGUpCiAgICAgewotICAgICAgREVCVUdfTUVNICgoImdkYjogd3JpdGUgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDhseFxuIiwKLQkJICBsZW4sIChEV09SRCkgbWVtYWRkcikpOworICAgICAgREVCVUdfTUVNICgoImdkYjogd3JpdGUgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAorCQkgIGxlbiwgbWVtYWRkcikpOwogICAgICAgV3JpdGVQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBWT0lEKSBtZW1hZGRyLCBvdXIsCiAJCQkgIGxlbiwgJmRvbmUpOwogICAgICAgRmx1c2hJbnN0cnVjdGlvbkNhY2hlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgbWVtYWRkciwgbGVuKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICBERUJVR19NRU0gKCgiZ2RiOiByZWFkIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4bHhcbiIsCi0JCSAgbGVuLCAoRFdPUkQpIG1lbWFkZHIpKTsKKyAgICAgIERFQlVHX01FTSAoKCJnZGI6IHJlYWQgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAorCQkgIGxlbiwgbWVtYWRkcikpOwogICAgICAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENWT0lEKSBtZW1hZGRyLCBvdXIsIGxlbiwKIAkJCSAmZG9uZSk7CiAgICAgfQpAQCAtMTI1NywyMCArMTE3NiwxOSBAQAogCiAgIC8qIEdldCBjb250ZXh0IGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkICovCiAgIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCBGQUxTRSk7Ci0gIGlmICh0aCkKKyAgaWYgKHN0ZXApCiAgICAgewotICAgICAgaWYgKHN0ZXApCi0JewotCSAgLyogU2luZ2xlIHN0ZXAgYnkgc2V0dGluZyB0IGJpdCAqLwotCSAgY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChQU19SRUdOVU0pOwotCSAgdGgtPmNvbnRleHQuRUZsYWdzIHw9IEZMQUdfVFJBQ0VfQklUOwotCX0KKyNpZmRlZiBpMzg2CisgICAgICAvKiBTaW5nbGUgc3RlcCBieSBzZXR0aW5nIHQgYml0ICovCisgICAgICBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKFBTX1JFR05VTSk7CisgICAgICB0aC0+Y29udGV4dC5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7CisjZW5kaWYKKyAgICB9CiAKLSAgICAgIGlmICh0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MpCi0JewotCSAgQ0hFQ0sgKFNldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpKTsKLQkgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IDA7Ci0JfQorICBpZiAodGgtPmNvbnRleHQuQ29udGV4dEZsYWdzKQorICAgIHsKKyAgICAgIENIRUNLIChTZXRUaHJlYWRDb250ZXh0ICh0aC0+aCwgJnRoLT5jb250ZXh0KSk7CisgICAgICB0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MgPSAwOwogICAgIH0KIAogICAvKiBBbGxvdyBjb250aW51aW5nIHdpdGggdGhlIHNhbWUgc2lnbmFsIHRoYXQgaW50ZXJydXB0ZWQgdXMuCkBAIC0xMzUwLDUwICsxMjY4LDQ4IEBACiB7CiAgIGluaXRfY2hpbGRfb3BzICgpOwogCi0gIGFkZF9jb20gKCJkbGwtc3ltYm9scyIsIGNsYXNzX2ZpbGVzLCBkbGxfc3ltYm9sX2NvbW1hbmQsCi0gICAgICAgICAgICJMb2FkIGRsbCBsaWJyYXJ5IHN5bWJvbHMgZnJvbSBGSUxFLiIpOwotCi0gIGFkZF9jb21fYWxpYXMgKCJzaGFyZWRsaWJyYXJ5IiwgImRsbC1zeW1ib2xzIiwgY2xhc3NfYWxpYXMsIDEpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoIm5ldy1jb25zb2xlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgibmV3LWNvbnNvbGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKIAkJICAoY2hhciAqKSAmbmV3X2NvbnNvbGUsCiAJCSAgIlNldCBjcmVhdGlvbiBvZiBuZXcgY29uc29sZSB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKIAkJICAmc2V0bGlzdCksCiAgICAgICZzaG93bGlzdCk7CiAKLSAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgibmV3LWdyb3VwIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgibmV3LWdyb3VwIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCiAJCSAgKGNoYXIgKikgJm5ld19ncm91cCwKIAkJICAiU2V0IGNyZWF0aW9uIG9mIG5ldyBncm91cCB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKIAkJICAmc2V0bGlzdCksCiAgICAgICZzaG93bGlzdCk7CiAKLSAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgiZGVidWdleGVjIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZGVidWdleGVjIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCiAJCSAgKGNoYXIgKikgJmRlYnVnX2V4ZWMsCiAJCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MuIiwKIAkJICAmc2V0bGlzdCksCiAgICAgICZzaG93bGlzdCk7CiAKLSAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgiZGVidWdldmVudHMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V2ZW50cyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAogCQkgIChjaGFyICopICZkZWJ1Z19ldmVudHMsCiAJCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV2ZW50cyBpbiBjaGlsZCBwcm9jZXNzLiIsCiAJCSAgJnNldGxpc3QpLAogICAgICAmc2hvd2xpc3QpOwogCi0gIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoImRlYnVnbWVtb3J5IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZGVidWdtZW1vcnkiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKIAkJICAoY2hhciAqKSAmZGVidWdfbWVtb3J5LAogCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IG1lbW9yeSBhY2Nlc3NlcyBpbiBjaGlsZCBwcm9jZXNzLiIsCiAJCSAgJnNldGxpc3QpLAogICAgICAmc2hvd2xpc3QpOwogCi0gIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoImRlYnVnZXhjZXB0aW9ucyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAorICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXhjZXB0aW9ucyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAogCQkgIChjaGFyICopICZkZWJ1Z19leGNlcHRpb25zLAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBleGNlcHRpb25zIGluIGNoaWxkIHByb2Nlc3MuIiwKKwkgICAgICAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV4Y2VwdGlvbnMgaW4gY2hpbGQgcHJvY2Vzcy4iLAogCQkgICZzZXRsaXN0KSwKICAgICAgJnNob3dsaXN0KTsKIAotICBhZGRfaW5mbyAoImRsbCIsIGluZm9fZGxsX2NvbW1hbmQsICJTdGF0dXMgb2YgbG9hZGVkIERMTHMuIik7Ci0gIGFkZF9pbmZvX2FsaWFzICgic2hhcmVkbGlicmFyeSIsICJkbGwiLCAxKTsKLQogICBhZGRfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKIH0KIApAQCAtMTQxMiw5ICsxMzI4LDkgQEAKIGN5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKQogewogICBzdGF0aWMgY2hhciBidWZbODBdOwotICBpZiAoKERXT1JEKSBwaWQgPT0gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkKKyAgaWYgKHBpZCA9PSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKQogICAgIHNwcmludGYgKGJ1ZiwgInByb2Nlc3MgJWQiLCBwaWQpOwogICBlbHNlCi0gICAgc3ByaW50ZiAoYnVmLCAidGhyZWFkICVsZC4weCV4IiwgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgcGlkKTsKKyAgICBzcHJpbnRmIChidWYsICJ0aHJlYWQgJWQuMHgleCIsIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIHBpZCk7CiAgIHJldHVybiBidWY7CiB9CmRpZmYgLS1naXQgYS9nZGIvd2luY2UuYyBiL2dkYi93aW5jZS5jCmluZGV4IDkxYWM1Y2YuLjUyYzg4MmMgMTAwNjQ0Ci0tLSBhL2dkYi93aW5jZS5jCisrKyBiL2dkYi93aW5jZS5jCkBAIC01OCw3ICs1OCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogCiAvKiBUaGUgdWkncyBldmVudCBsb29wLiAqLwotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgKGludCBzaWdubyk7CitleHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKIAogLyogSWYgd2UncmUgbm90IHVzaW5nIHRoZSBvbGQgQ3lnd2luIGhlYWRlciBmaWxlIHNldCwgZGVmaW5lIHRoZQogICAgZm9sbG93aW5nIHdoaWNoIG5ldmVyIHNob3VsZCBoYXZlIGJlZW4gaW4gdGhlIGdlbmVyaWMgV2luMzIgQVBJCmRpZmYgLS1naXQgYS9nZGIveGNvZmZzb2xpYi5jIGIvZ2RiL3hjb2Zmc29saWIuYwppbmRleCAzMzMyMjY4Li45M2MxMjQzIDEwMDY0NAotLS0gYS9nZGIveGNvZmZzb2xpYi5jCisrKyBiL2dkYi94Y29mZnNvbGliLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgIGhvb2sgaXMgaW5pdGlhbGl6ZWQgaW4gYnkgcnM2MDAwLW5hdC5jLiAgSWYgbm90LCBpdCBpcyBjdXJyZW50bHkgbGVmdAogICAgTlVMTCBhbmQgbmV2ZXIgY2FsbGVkLiAqLwogCi12b2lkICgqeGNvZmZfcmVsb2NhdGVfc3ltdGFiX2hvb2spICh1bnNpZ25lZCBpbnQpID0gTlVMTDsKK3ZvaWQgKCp4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vaykgUEFSQU1TICgodW5zaWduZWQgaW50KSkgPSBOVUxMOwogCiAjaWZkZWYgU09MSUJfU1lNQk9MU19NQU5VQUwKIApkaWZmIC0tZ2l0IGEvZ2RiL3hjb2Zmc29saWIuaCBiL2dkYi94Y29mZnNvbGliLmgKaW5kZXggZmJkM2Q1Yi4uNzA2OTQ5MyAxMDA2NDQKLS0tIGEvZ2RiL3hjb2Zmc29saWIuaAorKysgYi9nZGIveGNvZmZzb2xpYi5oCkBAIC01OCw0ICs1OCw0IEBACiAKIC8qIEhvb2sgZm9yIHN5bWJvbCB0YWJsZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICovCiAKLWV4dGVybiB2b2lkICgqeGNvZmZfcmVsb2NhdGVfc3ltdGFiX2hvb2spICh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgKCp4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vaykgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL0NPUFlJTkcgYi9pbmNsdWRlL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwNGY4Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE3NzggKzAsMCBAQAotVHVlIE1heSAzMCAxNjo1MzozNCAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGZsb2F0Zm9ybWF0LmggKHN0cnVjdCBmbG9hdGZvcm1hdCk6IEFkZCBmaWVsZCBuYW1lLgotCi0yMDAwLTA1LTI2ICBFbGkgWmFyZXRza2lpICA8ZWxpekBpcy5lbHRhLmNvLmlsPgotCi0JKiBmaWxlbmFtZXMuaDogTmV3IGZpbGUuCi0JKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNLCBJU19ESVJfU0VQQVJBVE9SKQotCShJU19BQlNPTFVURV9QQVRILCBGSUxFTkFNRV9DTVApOiBOZXcgbWFjcm9zLgotCi0yMDAwLTA1LTE3ICBTLiBCaGFyYWR3YWogWWFkYXZhbGxpICA8c2J5QHNjcnVncy5sa2cuZGVjLmNvbT4KLQkgICAgUmljayBHb3J0b24JICAgICAgICAgICAgPGdvcnRvbkBzY3J1Z3MubGtnLmRlYy5jb20+Ci0JICAgIAotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBlbWl0cmVsb2NhdGlvbnMgZmxhZy4KLQotMjAwMC0wNS0wOCAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzU0eCk6IERlY2xhcmUuCi0KLUZyaSBNYXkgIDUgMTY6NTE6MDMgMjAwMCAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvcnM2azY0LmggKFU4MDJUT0M2NE1BR0lDKTogQ2hhbmdlIHRvIFU4MDNYVE9DTUFHSUMuCi0KLU1vbiBBcHIgMjQgMTU6MjA6NTEgMjAwMCAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLQkqIGluY2x1ZGUvY29mZi9yczZrNjQuaDogTmV3IGZpbGUuCi0KLUZyaSBBcHIgMjEgMTM6MjA6NTMgMjAwMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQkJCSAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9pYTY0KTogRGVjbGFyZS4KLQotMjAwMC0wNC0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BsYXktdHJlZS5oIChzcGxheV90cmVlX3JlbW92ZSk6IERlY2xhcmUuCi0KLTIwMDAtMDQtMDQgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIGJpbi1idWdzLmggKFJFUE9SVF9CVUdTX1RPKTogUmVtb3ZlIHRyYW5zbGF0ZWQgcGFydC4KLQotMjAwMC0wNC0wMyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogYmluLWJ1Z3MuaDogTmV3IGZpbGUuCi0KLTIwMDAtMDMtMjcgIERlbmlzIENoZXJ0eWtvdiAgPGRlbmlzY0BvdmVydGEucnU+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9hdnIpOiBEZWNsYXJlLgotCi0yMDAwLTAzLTE0ICBCZXJuZCBTY2htaWR0ICA8YmVybmRzQGN5Z251cy5jby51az4KLQotCSogaGFzaHRhYi5oIChodGFiX3RyYXYpOiBNb2RpZnkgdHlwZSBzbyB0aGF0IGZpcnN0IGFyZyBpcyBvZiB0eXBlCi0Jdm9pZCAqKi4KLQkoaHRhYl9maW5kX3dpdGhfaGFzaCwgaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoKTogRGVjbGFyZSBuZXcKLQlmdW5jdGlvbnMuCi0KLTIwMDAtMDMtMDkgIEFsZXggU2FtdWVsICA8c2FtdWVsQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHBhcnRpdGlvbi5oOiBOZXcgZmlsZS4KLQotMjAwMC0wMy0wOSAgWmFjayBXZWluYmVyZyAgPHphY2tAd29sZXJ5LmN1bWIub3JnPgotCi0JKiBoYXNodGFiLmggKHN0cnVjdCBodGFiKTogQWRkIGRlbF9mLgotCShodGFiX2RlbCk6IE5ldyB0eXBlLgotCShodGFiX2NyZWF0ZSk6IEFkZCBmb3VydGggYXJndW1lbnQuCi0KLTIwMDAtMDMtMDggIFphY2sgV2VpbmJlcmcgIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4KLQotCSogaGFzaHRhYi5oIChoYXNoX3RhYmxlX3QpOiBSZW5hbWUgdG8gaHRhYl90LgotCShzdHJ1Y3QgaGFzaF90YWJsZSk6IFJlbmFtZSB0byBzdHJ1Y3QgaHRhYi4gIFNob3J0ZW4gZWxlbWVudAotCW5hbWVzLiAgUmVvcmRlciBlbGVtZW50cyBieSBzaXplLgotCShodGFiX2hhc2gsIGh0YWJfZXEsIGh0YWJfdHJhdik6IE5ldyB0eXBlZGVmcyBmb3IgdGhlIGNhbGxiYWNrCi0JZnVuY3Rpb24gcG9pbnRlcnMuCi0JKGhhc2hfdGFibGVfZW50cnlfdCk6IERpc2NhcmQ7IGp1c3QgdXNlIHZvaWQgKiBmb3IgZWxlbWVudAotCXR5cGUuCi0KLTIwMDAtMDMtMDEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogYmZkbGluay5oIChiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgYSBib29sZWFuIGFyZyB0bwotCXRoZSB1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9pMzcwKTogRGVjbGFyZS4KLQotMjAwMC0wMi0yMiAgQ2hhbmRyYSBDaGF2dmEgIDxjY2hhdnZhQGN5Z251cy5jb20+Ci0KLQkqIG9wY29kZS9kMzB2LmggKEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwKTogUmVkZWZpbmVkIGFzIG9wZXJhdGlvbgotCWNhbm5vdCBiZSBjb21iaW5lZCBpbiBwYXJhbGxlbCB3aXRoIEFERC9TVUJwcHAuCi0KLVR1ZSBGZWIgMjIgMTU6MTk6NTQgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV90cmFjZSk6IERvY3VtZW50IHJldHVybiB2YWx1ZXMuCi0JKHNpbV9zZXRfdHJhY2UpOiBEZWNsYXJlLiAgRGVwcmVjYXRlLgotCi0yMDAwLTAyLTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBDaGFuZ2UgYGxlbmd0aCcgcGFyYW0gb2YKLQlyZWFkX21lbW9yeV9mdW5jIHRvIHVuc2lnbmVkLiAgQ2hhbmdlIHR5cGUgb2YgYGJ1ZmZlcl9sZW5ndGgnIGFuZAotCWBvY3RldHNfcGVyX2J5dGUnIHRvIHVuc2lnbmVkLgotCShidWZmZXJfcmVhZF9tZW1vcnkpOiBDaGFuZ2UgYGxlbmd0aCcgcGFyYW0gdG8gdW5zaWduZWQuCi0KLTIwMDAtMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogQWRkIHByb3RvdHlwZXMgZm9yIEFSTSByZWdpc3RlciBuYW1lIGZ1bmN0aW9ucy4KLQotV2VkIEZlYiAgOSAxODo0NTo0OSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHdhaXQuaDogRGVsZXRlLiBObyBsb25nZXIgdXNlZCBieSBHREIuCi0KLVR1ZSBGZWIgIDggMTc6MDE6MTMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9yZXN1bWUpOiBDbGFyaWZ5IHVzZSBvZiBTSUdHTkFMLgotCShzaW1fc3RvcF9yZWFzb24pOiBDbGFyaWZ5IG1lYW5pbmcgb2Ygc2ltX3NpZ25hbGxlZC4KLQotMjAwMC0wMi0wMyAgVGltb3RoeSBXYWxsIDx0d2FsbEByZWRoYXQuY29tPgotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogQWRkZWQgb2N0ZXRzX3Blcl9ieXRlCi0JZmllbGQgYW5kIGluaXRpYWxpemUgaXQgdG8gb25lICgxKS4KLQkKLTIwMDAtMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQHJlZGhhdC5jb20+Ci0KLQkqIGRpcy1hc20uaDogQWRkIHByb3RvdHlwZSBmb3IgZGlzYXNzZW1ibGVyX3VzYWdlKCkuCi0JQWRkIHByb3RvdHlwZSBmb3IgYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb25zKCkuCi0JUmVtb3ZlIHByb3RvdHlwZSBmb3IgYXJtX3RvZ2dsZV9yZWduYW1lcygpLgotCUFkZCBwcm90b3R5cGUgZm9yIHBhcnNlX2FybV9kaXNhc3NlbWJsZXJfb3B0aW9uKCkuCi0KLVNhdCBKYW4gIDEgMTk6MDY6NTIgMjAwMCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYml0cmFuZ2UuY29tPgotCi0JKiBzeW1jYXQuaCAoU1RSSU5HWCkgWyFfX1NURENfXyB8fCBBTE1PU1RfU1REQ106IENoYW5nZSAiPyIgdG8gInMiCi0JdG8gc3RyaW5naWZ5IGFyZ3VtZW50IHMuCi0KLVdlZCBEZWMgMTUgMTE6MjI6NTYgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocC1zeW10YWIuaCAoSFBfTEFOR1VBR0VfRk9SVFJBTik6IE5ldyBlbnVtZXJhdGlvbiBjb25zdGFudC4KLQkoSFBfTEFOR1VBR0VfRjc3KTogRGVmaW5lIHVzaW5nIEhQX0xBTkdVQUdFX0ZPUlRSQU4uCi0KLTE5OTktMTItMTUgIERvdWcgRXZhbnMgIDxkamVAdHJhbnNtZXRhLmNvbT4KLQotCSogZGlzLWFzbS5oOiBFbmNsb3NlIGluIGV4dGVybiAiQyIgaWZkZWYgX19jcGx1c3BsdXMuCi0KLTE5OTktMTItMDUgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3RydWN0IHNwbGF5X3RyZWVfbm9kZSk6IFJlbmFtZSB0byAuLi4KLQkoc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zKTogLi4uIHRoaXMuCi0JKHN0cnVjdCBzcGxheV90cmVlKTogUmVuYW1lIHRvIC4uLgotCShzdHJ1Y3Qgc3BsYXlfdHJlZV9zKTogLi4uIHRoaXMuCi0KLTE5OTktMTEtMzAgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYW5zaWRlY2wuaCAoQVRUUklCVVRFX01BTExPQyk6IE5ldyBtYWNyby4KLQotCSogbGliaWJlcnR5LmggKGJ1aWxkYXJndiwgZHVwYXJndiwgY29uY2F0LCBjaG9vc2VfdGVtcF9iYXNlLAotCW1ha2VfdGVtcF9maWxlLCB4bWFsbG9jLCB4Y2FsbG9jLCB4c3RyZHVwLCB4bWVtZHVwKTogQWRkCi0JQVRUUklCVVRFX01BTExPQy4KLQkoeGF0ZXhpdCk6IFJlbW92ZSBfX0dOVUNfXyBjaGVjaywgYWRkIEFUVFJJQlVURV9OT1JFVFVSTi4KLQotMTk5OS0xMS0yOCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBsaWJpYmVydHkuaDogSW5jbHVkZSBzdGRhcmcuaCB3aGVuIEFOU0lfUFJPVE9UWVBFUyBpcyBkZWZpbmVkLgotCShhc3ByaW50ZiwgdmFzcHJpbnRmKTogUHJvdmlkZSBkZWNsYXJhdGlvbnMuCi0KLVdlZCBOb3YgMTAgMTI6NDM6MjEgMTk5OSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0JCQkgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYW5zaWRlY2wuaDogRGVmaW5lIGFuZCB0ZXN0IGBHQ0NfVkVSU0lPTicsIG5vdCBgSEFWRV9HQ0NfVkVSU0lPTicuCi0KLTE5OTktMTEtMDQgICAgICBKaW1teSBHdW8gICAgICAgPGd1b0BjdXAuaHAuY29tPgotCi0JKiBocC1zeW10YWIuaCAoZG50dF90eXBlX2ZwYXJhbSk6IEFkZCBkb2NfcmFuZ2VzLCBtaXNjX2tpbmQKLQlmaWVsZHMsIGNoYW5nZSBsb2NhdGlvbiB0eXBlIHRvIENPUkVfQUREUiBmcm9tIGludC4KLQkoZG50dF90eXBlX2NvbnN0KTogTmFtZSB0aGUgNXRoIGZpZWxkIGxvY2F0aW9uX3R5cGUuCi0KLVN1biBPY3QgMjQgMTk6MTE6MzIgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZDEwdi5oIChTSU1fRDEwVl9UUzJfRE1BUF9SRUdOVU0pOiBEZWZpbmUuCi0KLTE5OTktMTAtMjMgMDg6NTEgLTA3MDAgIFphY2sgV2VpbmJlcmcgIDx6YWNrQGJpdG1vdmVyLmNvbT4KLQotCSogaGFzaHRhYi5oOiBHaXZlIGhhc2hfdGFibGVfdCBhIHN0cnVjdCB0YWcuICBBZGQgcHJvdG90eXBlcwotCWZvciBjbGVhcl9oYXNoX3RhYmxlX3Nsb3QgYW5kIHRyYXZlcnNlX2hhc2hfdGFibGUuICBDb3JyZWN0Ci0JcHJvdG90eXBlIG9mIGFsbF9oYXNoX3RhYmxlX2NvbGxpc2lvbnMuCi0KLVNhdCBPY3QgMjMgMTk6MDA6MTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZDEwdi5oOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAxNSAwMTo0Nzo1MSAxOTk5ICBWbGFkaW1pciBNYWthcm92ICA8dm1ha2Fyb3ZAbG9vbnkuY3lnbnVzLmNvbT4KLQotCSogaGFzaHRhYi5oOiBOZXcgZmlsZS4KLQotMTk5OS0xMC0xMCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBhbnNpZGVjbC5oIChIQVZFX0dDQ19WRVJTSU9OKTogTmV3IG1hY3JvLiAgVXNlIGl0IGluc3RlYWQgb2YKLQlleHBsaWNpdGx5IHRlc3RpbmcgX19HTlVDX18gYW5kIF9fR05VQ19NSU5PUl9fLgotCi0JKEFUVFJJQlVURV9QUklOVEYpOiBVc2UgYF9fZm9ybWF0X18nLCBub3QgYGZvcm1hdCcuCi0KLTE5OTktMDktMjUgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbGliaWJlcnR5LmggKG1ha2VfdGVtcF9maWxlKTogIEFkZCBhIHByb3RvdHlwZS4KLQotVHVlIFNlcCAxNCAwMDozNTowMiAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6ICBPcGVuQlNEIGhhcyBhIGNvcnJlY3QgcHJvdG90eXBlLgotCSh4cmVhbGxvYyk6ICBSZW1vdmUgb3V0ZGF0ZWQgY29tbWVudC4KLQotMTk5OS0wOS0wNyAgSmVmZiBHYXJ6aWsgIDxqZ2FyemlrQHBvYm94LmNvbT4KLQotCSogbGliaWJlcnR5LmggKHhtZW1kdXApOiBBZGQgcHJvdG90eXBlIGZvciBuZXcgZnVuY3Rpb24uCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3BqKTogRGVjbGFyZS4KLQotMTk5OS0wOS0wMSAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfZ3Jvdywgb2JzdGFja19ncm93MCk6IE1vdmUgKGNoYXIqKSBjYXN0cwotCWluIGNhbGxzIHRvIGBfb2JzdGFja19tZW1jcHknIGZyb20gaGVyZSAuLi4KLQotCShfb2JzdGFja19tZW1jcHkpOiAuLi4gdG8gaGVyZSwgZXhjZXB0IGluIHRoZSBfX1NURENfXyBjYXNlIHdoaWNoCi0JZG9lc24ndCBuZWVkIGl0LgotCi0xOTk5LTA4LTMwICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oIChnZXRwd2QpOiBQcm90b3R5cGUuCi0KLTE5OTktMDgtMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9pbnNlcnQpOiBSZXR1cm4gdGhlIG5ldyBub2RlLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYW5zaWRlY2wuaDogQ29weSBhdHRyaWJ1dGUgc3VwcG9ydCBtYWNyb3MgZnJvbSBlZ2NzLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQWRkIGluaXRfZnVuY3Rpb24gYW5kCi0JZmluaV9mdW5jdGlvbi4KLQotMTk5OS0wNi0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbWlwcy5oIChFbGYzMl9JbnRlcm5hbF9Nc3ltKTogTmV3IHN0cnVjdHVyZS4KLQkoRWxmMzJfRXh0ZXJuYWxfTXN5bSk6IExpa2V3aXNlLgotCShFTEYzMl9NU19SRUxfSU5ERVgpOiBOZXcgbWFjcm8uCi0JKEVMRjMyX01TX0ZMQUdTKTogTGlrZXdpc2UuCi0JKEVMRjMyX01TX0lORk8pOiBMaWtld2lzZS4KLQkKLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoYXJtX3RvZ2dsZV9yZWduYW1lcyk6IE5ldyBwcm90b3R5cGUuCi0JKHN0cnVjdCBkaWFzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQ6IGRpc2Fzc2VtYmxlcl9vcHRpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9lbGZfdmVyc2lvbl9leHByKTogUmVuYW1lIGBtYXRjaCcgdG8gYHBhdHRlcm4nLgotCUFkZCBgbWF0Y2gnIGNhbGxiYWNrIGZ1bmN0aW9uLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBBZGQgbm9fdW5kZWZpbmVkLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcm90b3R5cGUgZm9yIHByaW50X2luc25fbWNvcmUuCi0KLTE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVjbGFyZS4KLQotMTk5OS0wMy0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5oIChzcGxheV90cmVlX2NvbXBhcmVfaW50cyk6IERlY2xhcmUuCi0KLVdlZCBNYXIgMjQgMTI6NDY6MjkgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQ3lnd2lueywzMn0gc2hvdWxkIGhhdmUgdGhlIHByb3RvdHlwZS4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfaW5mbyk6IGFkZCBmaWVsZCAibXBjODYwYzAiLgotCi1Nb24gRmViICAxIDIxOjA1OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBkaXMtYXNtLmggKHByaW50X2luc25faTM4Nl9hdHQpOiAgRGVjbGFyZS4KLSAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIERlY2xhcmUuCi0KLTE5OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogQ2FzdCBTVFJFQU0gYW5kCi0JRlBSSU5URl9GVU5DIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1XZWQgRGVjIDMwIDE2OjA3OjE0IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IGNoYW5nZSB2b2lkICogdG8gUFRSICh0d28gcGxhY2VzKS4KLQotTW9uIERlYyAxNCAwOTo1MzozMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotVHVlIERlYyAgOCAwMDozMDozMSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhbmQgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBjaGFuZ2UgdGhlIHR5cGUgb2Ygc3RyZWFtCi0JZnJvbSBGSUxFKiB0byB2b2lkKiwgZm9yIHVzZSB3aXRoIGdkYidzIG5ldyB0eXBlIEdEQl9GSUxFLgotCShmcHJpbnRmX2Z0eXBlKTogY2hhbmdlIEZJTEUqIHBhcmFtZXRlciB0eXBlIHRvIHZvaWQqLgotCi0JKiBkZW1hbmdsZS5oOiAoRE1HTF9FREcpOiBuZXcgbWFjcm8gZm9yIEt1Y2sgYW5kIEFzc29jaWF0ZXMKLQkoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgS3VjayBhbmQgQXNzb2Mgc3R5bGUKLQkoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGVkZ19kZW1hbmdsaW5nIHN0eWxlCi0JKEVER19ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk6IG5ldyBtYWNybwotCShFREdfREVNQU5HTElORyk6IG5ldyBtYWNybwotCShETUdMX0hQKTogbmV3IG1hY3JvLCBmb3IgSFAvYUNDIGNvbXBpbGVyLgotCShETUdMX1NUWUxFX01BU0spOiBtb2RpZnkgdG8gaW5jbHVkZSBuZXcgSFAncyBzdHlsZS4KLQkoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGhwX2RlbWFuZ2xpbmcgdmFsdWUuCi0JKEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvLgotCShBUk1fREVNQU5HTElORyk6IGNvZXJjZSB0byBpbnQuCi0JKEhQX0RFTUFOR0xJTkcpOiBuZXcgbWFjcm8uCi0KLQkqIGhwLXN5bXRhYi5oOiByZXdyaXR0ZW4sIGZyb20gSFAuCi0JKHF1aWNrX3Byb2NlZHVyZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShxdWlja19tb2R1bGUpOiBjaGFuZ2UgdHlwZSBvZiBsYW5ndWFnZSBmaWVsZCB0byB1bnNpZ25lZCBpbnQKLQkoc3RydWN0IGRudHRfdHlwZV9zdmFyKTogYWRkIGZpZWxkIHRocmVhZF9zcGVjaWZpYy4KLQkoaHBfbGFuZ3VhZ2UpOiBhZGQgbGFuZ3VhZ2VzIG1vZGNhbCBhbmQgZG1wYXNjYWwuCi0KLU1vbiBOb3YgMzAgMTU6MjU6NTggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYvc2guaCAoZWxmX3NoX3JlbG9jX3R5cGUpOiBBZGQgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DLAotCVJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCBSX1NIX1NXSVRDSDggYW5kIFJfU0hfbWF4LgotCi1GcmkgTm92IDIwIDEzOjE0OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgRnJlZUJTRC4KLQotRnJpIE5vdiAxMyAxOToxOToxMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oOiBQcm90b3R5cGUgeGNhbGxvYy4KLQotU3VuIE5vdiAgOCAxNzo0MjoyNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFuc2lkZWNsLmg6IFdyYXAgcHJvYmxlbWF0aWMgbWFjcm9zIHdpdGggIUlOX0dDQy4KLQotCSogZGVtYW5nbGUuaDogTmV2ZXIgZGVmaW5lIFBBUkFNUygpLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotU2F0IE5vdiAgNyAxODozMDoyMCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdmF4KTogRGVjbGFyZS4KLQotU2F0IE5vdiAgNyAxNjowNDowMyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi0xOTk4LTEwLTI2IDE2OjAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgb3B0aW1pemUuCi0KLVRodSBPY3QgMjIgMTk6NTg6MDAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBzcGxheS10cmVlLmg6IFdyYXAgZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIGluCi0JUEFSQU1TKCkgbWFjcm8uCi0KLTE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgIDkgMDA6MDI6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNZXJnZSBkZXZvIGFuZCBlZ2NzIGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0KLVNhdCBTZXAgIDUgMTI6MTY6MzMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGVkIGZyb20gZ2NjLgotCi0xOTk4LTA4LTAzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IENoYW5nZSBkZWNsIHRvIHVzZSBtb2Rlcm4gR0NDIGF0dHJpYnV0ZQotCXRvIGluZGljYXRlIGV4aXQgZG9lcyBub3QgcmV0dXJuLgotCi1Nb24gSnVuICAxIDEzOjQ4OjMyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLVR1ZSBNYXkgMjYgMjA6NTc6NDMgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmL3NwYXJjLmggKEVGX1NQQVJDX0xFREFUQSwgUl9TUEFSQ18zMkxFKTogQWRkZWQuCi0KLVR1ZSBGZWIgMjQgMTM6MDU6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTWVtYmVyIGBzeW1ib2wnIHJlbmFtZWQgdG8gYHN5bWJvbHMnCi0JYW5kIG1hZGUgYW4gImFzeW1ib2wgKioiLiAgTmV3IG1lbWJlciBudW1fc3ltYm9scy4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMTcgMTI6MzI6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkCi0gCXJlZ2lzdGVyIGxlbmd0aCBwYXJhbWV0ZXIuICBGdW5jdGlvbnMgcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YKLSAJcmVnaXN0ZXIuCi0KLVRodSBGZWIgMTIgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRvcHQuaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotV2VkIEZlYiAxMSAxNjo1NjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1jYXQuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgIDIgMTc6MTM6MzEgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzMwKTogRGVjbGFyZS4KLQotVGh1IEphbiAyMiAxNjoyMzo1OSAxOTk4ICBGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBmbGFnIElOU05fSEFTX1JFTE9DIHRvIHRlbGwgZGlzYXNzZW1ibHkKLQlmdW5jdGlvbiB0aGVyZSBpcyBhIHJlbG9jIG9uIHRoaXMgbGluZS4KLQotTW9uIERlYyAgOCAxMToyMjoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IFJlbW92ZSBwcm90b3R5cGUgb2YgZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uCi0Jbm8gbG9uZ2VyIGV4aXN0cy4KLQotVHVlIERlYyAgMiAxMDoyMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2FzbV9zeW1hZGRyKTogTmV3IHByb3RvdHlwZS4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYvc2guaCAoUl9TSF9TV0lUQ0g4KTogTmV3LgotCi1Nb24gRGVjICAxIDExOjI5OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDb21tZW50IG91dCBhcmcgbmFtZXMgaW4gcHJvdG90eXBlcy4KLQotV2VkIE5vdiAyNiAxNjo0Nzo1OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbnNpc3RhbnRseSB1c2UgbmFtZXMgZm9yIHByb3RvdHlwZQotCWFyZ3VtZW50cy4KLQotV2VkIE5vdiAyNiAxMTozOTozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ2hhbmdlIGJ5dGUgY291bnQgYXJndW1lbnRzIHRvCi0Je3JlYWQsd3JpdGV9X21lbSB0byBgaW50Jy4gIE5ldyBtZW1iZXIgYG1hZ2ljJy4KLQkoQ0JfU1lTQ0FMTF9NQUdJQyxDQl9TWVNDQUxMX0lOSVQpOiBOZXcgbWFjcm9zLgotCi1UdWUgTm92IDI1IDAxOjM1OjUyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3Qgc3RhdCk6IE1vdmUgZm9yd2FyZCBkZWNsIHVwLgotCShob3N0X2NhbGxiYWNrKTogUGFzcyBzdGF0IHN0cnVjdCBwb2ludGVyIHRvIHN0YXQsZnN0YXQuCi0JKENCX1NZU19ubm4pOiBSZW9yZ2FuaXplLgotCShDQl9TWVNDQUxMKTogTmV3IG1lbWJlcnMgcDEscDIuCi0JKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQpOiBEZWxldGUgZm91cnRoIGFyZy4KLQotU2F0IE5vdiAyMiAyMzozNDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3BfcmVhc29uKTogQ2xhcmlmeSBzaW1fc2lnbmFsbGVkIFNJR1JDCi0gCWFyZ3VtZW50LgotCi1Nb24gTm92IDE3IDE0OjAwOjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9UQVJHRVRfREVGU19NQVApOiBSZW5hbWVkIGZyb20gdGFyZ2V0X2RlZnNfbWFwLgotCShob3N0X2NhbGxiYWNrKTogQWRkIHN0YXQsIGZzdGF0LCBzeXNjYWxsX21hcCwgZXJybm9fbWFwLCBvcGVuX21hcCwKLQlzaWduYWxfbWFwLCBzdGF0X21hcC4KLQkoZXJybl9tYXAsb3Blbl9tYXApOiBSZW5hbWVkIHRvIGNiX2luaXRfZm9vX21hcC4KLQkoY2JfaG9zdF90b190YXJnZXRfZXJybm8sY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbQotCWhvc3RfdG9fdGFyZ2V0X2Vycm5vLHRhcmdldF90b19ob3N0X29wZW4uCi0JKGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyk6IEFkZCBwcm90b3R5cGUuCi0JKGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwpOiBMaWtld2lzZS4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IExpa2V3aXNlLgotCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCi0JKENCX1NZU197ZXhpdCxvcGVuLGNsb3NlLHJlYWQsd3JpdGUsbHNlZWssdW5saW5rLGdldHBpZCxraWxsLGZzdGF0LAotCWFyZ3ZsZW4sYXJndixjaGRpcixzdGF0LGNobW9kLHV0aW1lLHRpbWV9KTogRGVmaW5lLgotCShDQl9TWVNDQUxMKTogTmV3IHR5cGUuCi0JKENCX1JDKTogTmV3IGVudW0uCi0KLUZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCSogcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCi1UdWUgT2N0IDE0IDE2OjA3OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQKLQknc3ltYm9sX2F0X2FkZHJlc3NfZnVuYycuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGlzZSBuZXcgZmllbGQgd2l0aAotCWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MuCi0KLU1vbiBPY3QgMTMgMTA6MTc6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IENsYXJpZnkgc2ltX3JlYWQsIHNpbV93cml0ZSBNRU0gYXJndW1lbnQuCi0KLVdlZCBTZXAgMjQgMTg6MDM6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoU0lNX1JDKTogIEFkZCBhIGJ1bmNoIG9mIG5ldyByZXR1cm4gY29kZXMgZm9yCi0JYnJlYWtwb2ludCBzdHVmZi4KLQkqIEFkZCBmdW5jdGlvbnMgdG8gdGVsbCB0aGUgc2ltdWxhdG9yIHRvIHNldC9jbGVhci9lbmFibGUvZGlzYWJsZQotCWludHJpbnNpYyBicmVha3BvaW50cy4KLQotVGh1IEF1ZyAyOCAxOTo0MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChkdXBhcmd2KTogQWRkIHByb3RvdHlwZS4KLQotVHVlIEF1ZyAyNiAxMjoyNTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZy4gRG9jdW1lbnQuCi0KLU1vbiBBdWcgMjUgMTA6NTA6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KLQotRnJpIEF1ZyAgOCAxNjo0Mzo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGFyY19nZXRfZGlzYXNzZW1ibGVyKTogRGVjbGFyZS4KLQotV2VkIEp1bCAzMCAxMTozOTo1MCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoRE1HTF9KQVZBKTogIE5ldyBvcHRpb24gdG8gcmVxdWVzdCBKYXZhIGRlbWFuZ2xpbmcuCi0KLVR1ZSBKdWwgMjIgMTc6NTk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoUEVYRUNVVEVfKik6IERlZmluZS4KLQkocGV4ZWN1dGUsIHB3YWl0KTogRGVjbGFyZS4KLQotRnJpIEp1biAgNiAxMzowMjozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2tpbGwpOiBNYXJrIGFzIGRlcHJlY2lhdGVkLgotCi1GcmkgTWF5IDIzIDEzOjQzOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRhc2tfbGluayBtZW1iZXIuCi0KLVRodSBNYXkgMjIgMTE6MzI6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFJldmlldyBkb2N1bWVudGF0aW9uLiAgQ2xhcmlmeSByZXN0cmljdGlvbnMgb24KLSAJd2hlbiBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4KLQotV2VkIE1heSAyMSAxNjo0Nzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3NldF9wcm9maWxlX3NpemUpOiBBZGQgcHJvdG90eXBlLCBkb2N1bWVudCBhcwotIAlkZXByZWNpYXRlZC4KLQotVHVlIE1heSAyMCAwOTozMjoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgc3RydWN0LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERyb3AgU0lNX0RFU0MgYXJndW1lbnQuIERvY3VtZW50LgotCShzaW1fc2l6ZSk6IFJlbW92ZSByZWNlbnRseSBhZGRlZCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCi0KLU1vbiBNYXkgMTkgMTk6MTQ6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFBhc3MgU0QgaW50byBzaW1fc2l6ZS4KLQotVGh1IE1heSAxNSAwMToyNDoxNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaCAob2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcsIG9ic3RhY2tfY2h1bmtmdW4sCi0Jb2JzdGFja19mcmVlZnVuKTogRWxpbWluYXRlIGNvbXBpbGUgd2FybmluZ3MgaW4gZ2RiLgotCi1UdWUgTWF5IDEzIDEwOjIxOjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGZsYWcgYml0cyBGX0FQQ1NfMjYgYW5kCi0JRl9BUENTX1NFVCBmb3IgdGhlIGZfZmxhZ3MgZmllbGQgb2YgdGhlIGZpbGVoZHIgc3RydWN0dXJlLiAgQWRkZWQgbmV3Ci0JZmxhZ3M6IEZfQVBDUzI2LCBGX0FSTV8yLCBGX0FSTV8zLCBGX0FSTV83LCBGX0FSTV83VCB0byBzdG9yZQotCWluZm9ybWF0aW9uIGluIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUgdXNlZCBieSBCRkQKLQlyb3V0aW5lcy4KLQotVHVlIEFwciAyMiAxMDoyNDozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyk6IEFkZCBjb21tZW50cyBmb3IgcHJldmlvdXMKLQlmb3JtYXRzIGFuZCBhZGQgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCBwcmltYXJpbHkgZm9yIEFSTS4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZC4KLQotRnJpIEFwciAxOCAxMzowNDo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3ApOiBOZXcgaW50ZXJmYWNlIC0gYXN5bmNocm9ub3VzCi0gCW5vdGlmaWNhdGlvbiBvZiBhIHJlcXVlc3QgdG8gc3RvcCAvIHN1c3BlbmQgdGhlIHJ1bm5pbmcKLSAJc2ltdWxhdGlvbi4KLQotCSogcmVtb3RlLXNpbS5oIChlbnVtIHNpbV9zdG9wKTogQWRkIHNpbV9ydW5uaW5nIGFuZCBzaW1fcG9sbGluZyBhcwotIAlzdGF0ZXMgZm9yIHVzZSBpbnRlcm5hbCB0byBzaW11bGF0b3JzLgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1dCk6IFB1dCBhIG1hZ2ljIG51bWJlciBhdAotIAl0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QgdG8gYWxsb3cgYmFzaWMgY2hlY2tpbmcuCi0JKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCApOiBBZGQgcG9sbF9xdWl0IC0gc28KLSAJdGhhdCB0aGUgY29uc29sZSBldGMgY2FuIGJlIHBvbGxlZCBhdCByZWd1bGFyIGludGVydmFscy4KLQotVGh1IEFwciAxNyAwMjoxNzoxMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHN0cnVjdCBfYmZkKTogRGVjbGFyZS4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBgYWJmZCcuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBgc3RhcnRfYWRkcmVzcycuCi0KLVdlZCBBcHIgIDIgMTc6MDk6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3RyYWNlLCBzaW1fc2l6ZSk6IE1ha2UgdGhlc2UgZ2xvYmFsLiAgVGhleQotIAl3aWxsIGdvIGF3YXkgc2hvcnRseS4KLQotV2VkIEFwciAgMiAxNToyMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKFNJTV9PUEVOX0tJTkQsIFNJTV9SQyk6IE5ldyBlbnVtcy4KLQkoc2ltX29wZW4pOiBOZXcgYXJndW1lbnQgYGtpbmQnLgotCi1XZWQgQXByICAyIDE0OjQ1OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1GcmkgTWFyIDI4IDE1OjI5OjU0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oICh0b3AgbGV2ZWwpOiBJbmNsdWRlIHN0ZGFyZy5oIG9yIHZhcmFyZ3MuaCBpZgotCXZhX3N0YXJ0IGlzIG5vdCBkZWZpbmVkLgotCShob3N0X2NhbGxiYWNrX3N0cnVjdCk6IE1ha2UgeyxlfXZwcmludGZfZmlsdGVyZWQgdGFrZSBhIHZhX2xpc3QKLQlpbnN0ZWFkIG9mIHZvaWQgKiwgc2luY2UgdmFfbGlzdCBtaWdodCBiZSBhbiBhcnJheSBvciBzdHJ1Y3R1cmUKLQl0eXBlLgotCi1GcmkgTWFyIDI4IDE1OjQ0OjQxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEFkZCBwcm90b3R5cGUgZm9yIGdsaWJjIGFuZCBsaW51eC4KLQotTW9uIE1hciAxNyAxOToyMjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmg6IE5ldyBmaWxlLgotCi1Nb24gTWFyIDE3IDE0OjU3OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IE5ldyBmaWxlLCBjb3BpZWQgaW4gZnJvbSBnZGIvcmVtb3RlLXNpbS5oLiAgT25lCi0gCWRheSB0aGlzIHdpbGwgYmUgcGxhY2VkIGluIGEgZGlyZWN0b3J5IG9mIGl0cyBvd24uCi0KLVNhdCBNYXIgMTUgMTk6MDA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1UaHUgTWFyICA2IDE1OjQ2OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QpOiBBZGQgY2FsbGJhY2tzIC0KLSAJZmx1c2hfc3Rkb3V0LCB3cml0ZV9zdGRlcnIsIGZsdXNoX3N0ZGVyciwgdnByaW50Zl9maWx0ZXJlZCwKLSAJZXZwcmludGZfZmlsdGVyZWQuICBEZWxldGUgcmVkdW5kYW50IGNhbGxiYWNrcyAtIHByaW50Zl9maWx0ZXJlZC4KLQotVGh1IEZlYiAyNyAyMzoxODoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KLQlmaWVsZHMuCi0KLVR1ZSBGZWIgMjUgMDA6MTA6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGl6ZQotCWJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCi0KLU1vbiBGZWIgMjQgMTc6NDc6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIpOiBEZWZpbmUuCi0JKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyk6IERlZmluZS4KLQkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlKTogRGVmaW5lLgotCi1UaHUgRmViICA2IDE0OjIwOjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEFkZCBuZXcgZmllbGRzCi0JYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbiB0byBjb250cm9sIHRoZQotCWRpc3BsYXkgb2YgcmF3IGluc3RydWN0aW9ucy4KLQotRnJpIERlYyAyNyAyMjoxNzozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzgwKTogRGVjbGFyZS4KLQotU3VuIERlYyAgOCAxNzoxMToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChob3N0X2NhbGxiYWNrKTogTmV3IG1lbWJlciBgZXJyb3InLgotCi1XZWQgTm92IDIwIDAwOjQwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmg6IE5ldyBmaWxlLCBtb3ZlZCBoZXJlIGZyb20gZ2RiLgotCi1Nb24gTm92IDE4IDE2OjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5Lmg6IENoZWNraW4gYWdhaW47IGxhc3QgY2hlY2tpbiBmYWlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4Ci0Jc3lzdGVtIGhlYWRlcnMuCi0KLVR1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogTW92ZSBwcm90b3R5cGVzIGZyb20gYXJndi5jIGhlcmUuCi0KLVRodSBPY3QgMzEgMTQ6NTY6MTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW5zaWRlY2wuaCAoVlBBUkFNUyxWQV9TVEFSVCk6IERlZmluZS4KLQotRnJpIE9jdCAyNSAxMjowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IEFkZCBieXRlc19wZXJfbGluZSBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgotCi1UaHUgT2N0IDI0IDE3OjEwOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIHN5bWJvbCBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIHN5bWJvbCBmaWVsZC4KLQotVGh1IE9jdCAxNyAxMToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbTMycik6IERlY2xhcmUuCi0KLU1vbiBPY3QgMTQgMjM6NTY6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhyZWFsbG9jLgotCi1UaHUgT2N0ICAzIDEzOjQ1OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgMyAxMDozMzoxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShwcmludF9pbnNuX21uMTAyMDAsIHByaW50X2luc25fbW4xMDMwMCk6IERlY2xhcmUuCi0KLVdlZCBPY3QgIDIgMjE6MjQ6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbW4xMHgwMCk6IERlY2xhcmUuCi0KLU1vbiBTZXAgMzAgMTM6NTY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBSZW1vdmUgI2lmbmRlZiBQUklWQVRFX1hNQUxMT0MuCi0KLVNhdCBBdWcgMzEgMTM6Mjc6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdjg1MCk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMTMgMTY6MTA6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQ2hhbmdlIGJjb3B5IHRvIG1lbWNweS4gIFdvcmtzIGJldHRlciBvbiBQb3NpeAotCXN5c3RlbXMsIHdoaWNoIGdlbmVyYWxseSBsYWNrIGJjb3B5LgotCi1Nb24gQXVnIDEyIDE3OjAzOjE4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6ICBDaGFuZ2UgV0lOMzIgdG8gX1dJTjMyLgotCi1GcmkgSnVsIDI2IDEzOjU4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgZmxhdm91ciBmaWVsZC4KLQkocHJpbnRfaW5zbl9hbHBoYSk6IERlY2xhcmUuCi0JKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERvbid0IGRlY2xhcmUuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IEluaXRpYWxpemUgZmxhdm91ciBmaWVsZC4KLQotVHVlIEp1bCAyMyAxNzozNzo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKFBSSVZBVEVfWE1BTExPQyk6IEVuY2xvc2UgeG1hbGxvYy94cmVhbGxvYwotCWRlZmluaXRpb25zIGluc2lkZSAjaWZuZGVmIHNvIHRoYXQgcHJvZ3JhbXMgdGhhdCB3YW50IHRvCi0JY2FuIGRlZmluZSBQUklWQVRFX1hNQUxMT0MgYW5kIHRoZW4gZGVmaW5lIHhtYWxsb2MgYW5kCi0JeHJlYWxsb2MgYW55d2F5IHRoZXkgd2FudC4KLQkoYmFzZW5hbWUpOiBEb2N1bWVudCBpbiBzb3VyY2UgdGhhdCB3ZSBjYW4ndCBkZWNsYXJlIHRoZQotIAlwYXJhbWV0ZXIgdHlwZSBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGFjcm9zcwotCWRpZmZlcmVudCBzeXN0ZW1zLgotCi1Nb24gSnVsIDIyIDEzOjE2OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYWxwaGEpOiBEb24ndCBkZWNsYXJlLgotCShwcmludF9pbnNuX2FscGhhX29zZiwgcHJpbnRfaW5zbl9hbHBoYV92bXMpOiBEZWNsYXJlLgotCi1XZWQgSnVsIDE3IDE0OjQ1OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChwcmludF9pbnNuX2QxMHYpOiBEZWNsYXJlLgotCi1Nb24gSnVsIDE1IDE2OjU1OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIEdldCByaWQgb2YgZGVjbHMgZm9yIHByaW50X2luc25faTgwODYsCi0JcHJpbnRfaW5zbl9zcGFyYzY0IGFuZCBwcmludF9pbnNuX3NwYXJjbGl0ZS4KLQkqIChJTklUX0RJU0FTU0VNQkxFX0lORk8pOiAgU3BsaXQgaW50byB0d28gcGllY2VzLiAgT25lLAotCUlOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIIGluaXRzIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciBlbmRpYW4sCi0JbWFjaCwgYW5kIGFyY2guCi0KLUZyaSBKdWwgMTIgMTA6MTk6MjcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2k4MDg2KTogIERlY2xhcmUuCi0KLVdlZCBKdWwgIDMgMTY6MDI6MzkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBEZWNsYXJlLgotCi1UdWUgSnVuIDE4IDE2OjAyOjQ2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDBzKTogRGVjbGFyZS4KLQotVHVlIEp1biAxOCAxNToxMTozMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZm9wZW4tdm1zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuICA0IDE4OjU4OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBub3RpY2VfYWxsIGZpZWxkLgotCi1GcmkgQXByIDI2IDEwOjMzOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmggKCNpZmRlZiBJTl9HQ0MpOiAjaW5jbHVkZSAiZ2Fuc2lkZWNsLmgiLgotCShQUk9UTyxQVFIsY29uc3QpOiBEZWxldGUuCi0KLU1vbiBBcHIgMjIgMTc6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KLQotTW9uIEFwciAxNSAxNToxNjo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoY2hvb3NlX3RlbXBfYmFzZSk6IEFkZCBwcm90b3R5cGUuCi0KLVR1ZSBNYXIgMTIgMTc6Mjk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBEZWNsYXJlLgotCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCB3cmFwX2hhc2ggZmllbGQuCi0KLVdlZCBGZWIgMTQgMTY6NDk6MTcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5oIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpOiBEZWZpbmUKLQlpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX2VudW0uCi0KLUZyaSBGZWIgIDIgMTc6MDk6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoRElTQVNNX1JBV19JTlNOKTogRGVsZXRlLgotCi1UdWUgSmFuIDIzIDA5OjIxOjQ3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCBlbmRpYW4gdG8gQkZEX0VORElBTl9VTktOT1dOLgotCU5ldyBhcmd1bWVudCBGUFJJTlRGX0ZVTkMuCi0KLU1vbiBKYW4gMjIgMTY6Mzc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBtZW1iZXJzIGFyY2gsIG1hY2gsIGVuZGlhbi4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSB0aGVtLgotCShESVNBU01fUkFXX0lOU057LEZMQUd9KTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDExOjMyOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0KLUZyaSBKYW4gIDUgMDA6MDE6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmggKGVudW0gaWVlZV9yZWNvcmQpOiBBZGQgaWVlZV9hc25fcmVjb3JkX2VudW0sCi0JaWVlZV9hdF9yZWNvcmRfZW51bSwgaWVlZV90eV9yZWNvcmRfZW51bSwgaWVlZV9hdG5fcmVjb3JkX2VudW0sCi0JaWVlZV9iYl9yZWNvcmRfZW51bSwgYW5kIGllZWVfYmVfcmVjb3JkX2VudW0uCi0KLVdlZCBKYW4gIDMgMTM6MTI6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaDogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgotCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlY2xhcmUuCi0JKG9ic3RhY2tfbWVtb3J5X3VzZWQpOiBEZWZpbmUgbWFjcm8uCi0KLVRodSBEZWMgMjggMTE6NDI6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoeHN0cmR1cCk6IERlY2xhcmUuCi0KLVRodSBEZWMgMjEgMTQ6NDc6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB3YWl0Lmg6IFByb3RlY3QgYWxsIG1hY3JvcyB3aXRoICNpZm5kZWYuCi0KLVR1ZSBPY3QgMjQgMjE6NDU6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHN0YXRpY19saW5rIGZpZWxkLgotCi1UdWUgU2VwIDEyIDE2OjI4OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIHN5bWJvbCBwYXJhbWV0ZXIgdG8KLQl3YXJuaW5nIGNhbGxiYWNrLgotCi1GcmkgU2VwICAxIDEzOjExOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIHdhcm5pbmcgY2FsbGJhY2sKLQl0byB0YWtlIEJGRCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MgYXJndW1lbnRzLgotCi1UaHUgQXVnIDMxIDE2OjQ1OjEyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgUEUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjIgMDM6MTg6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSB4c3RyZXJyb3IuICBGcm9tIFBhdCBSYW5raW4uCi0KLU1vbiBBdWcgMjEgMTg6MTE6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KLQotV2VkIEF1ZyAgMiAwODoxNDoxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmM2NCk6IERlY2xhcmUuCi0KLU1vbiBKdWwgMTAgMTM6MjY6NDkgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHN5bWJvbGljLgotCi1TdW4gSnVsICAyIDE3OjQ4OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGJhc2VfZmlsZSB0bwotCVBUUi4KLQotVGh1IEp1biAyOSAwMDowMjo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkZWQgYmFzZV9maWxlIG1lbWJlci4KLQotVHVlIEp1biAyMCAxNjo0MDowNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhbnNpZGVjbC5oOiB3aW4zMnMgaXMgQU5TSSBlbm91Z2guCi0KLVRodSBNYXkgMTggMDQ6MjU6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2FybSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkocHJpbnRfaW5zbl97bGl0dGxlLGJpZ31fYXJtKTogTmV3IGRlY2xhcmF0aW9ucy4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlY2xhcmUuCi0KLVNhdCBNYXkgMTMgMTA6MTQ6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi9wZS5oOiBOZXcgZmlsZS4KLQkqIGJmZGxpbmsuaCAoc3Vic3l0ZW0sIHN0YWNrX2hlYXBfcGFyYW1ldGVycyk6IE5ldy4KLQkqIGNvZmYvaTM4Ni5oIChOVF9TRUNUSU9OX0FMSUdOTUVOVCwgTlRfRklMRV9BTElHTk1FTlQsCi0JTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBOZXcuCi0JKiBjb2ZmL2ludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIpOiAgTmV3IGZpZWxkcyBmb3IgUEUuCi0JKElNQUdFX0RBVEFfRElSRUNUT1JZKTogTmV3LgotCShpbnRlcm5hbF9hb3V0aGRyKTogTmV3IGZpZWxkcyBmb3IgUEUuCi0KLVRodSBNYXkgIDQgMTQ6MzY6NDIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgYW5zaWRlY2wuaCBpZiBJTl9HQ0MuCi0KLVR1ZSBGZWIgMjEgMDA6Mzc6MjggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBEb24ndCB1c2UgYml0ZmllbGQgZW51bWVyYXRpb25zLCB0aGUgSFAgQyBjb21waWxlcgotCWRvZXMgbm90IGhhbmRsZSB0aGVtIGNvcnJlY3RseS4KLQotVGh1IEZlYiAgOSAxNDoyMDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGU7IHNvbWUKLQlzeXN0ZW1zIGhhdmUgdGhpcyBpbiB0aGVpciBoZWFkZXIgZmlsZXMuCi0KLVdlZCBGZWIgIDggMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIGZvcm1hdCBvZiBjb21tb24KLQlzeW1ib2wgaW5mb3JtYXRpb24sIHRvIHJlbW92ZSByZXN0cmljdGlvbnMgb24gbWF4aW11bSBzaXplIGFuZAotCWFsaWdubWVudCBwb3dlciwgYnkgdXNpbmcgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGluc3RlYWQuCi0KLU1vbiBGZWIgIDYgMTQ6NTU6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfaGFzaF90eXBlKTogUmVuYW1lIGJmZF9saW5rX2hhc2hfd2VhawotCXRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgQWRkIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQotTW9uIEphbiAxNiAyMTowMDoyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoR0RCX0lOSVRfRElTQVNTRU1CTEVfSU5GTywgZXRjKTogUmVtb3ZlIGFsbAotCUdEQi1zcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotU3VuIEphbiAxNSAxODozOTozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3c2NSk6IERlY2xhcmUuCi0KLVRodSBKYW4gMTIgMTc6NTE6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGhleF9wKTogRml4IHNlbnNlIG9mIHRlc3QuCi0KLVdlZCBKYW4gMTEgMjI6MzY6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKF9oZXhfYXJyYXlfc2l6ZSwgX2hleF9iYWQsIF9oZXhfdmFsdWUsIGhleF9pbml0LAotCWhleF9wLCBoZXhfdmFsdWUpOiBOZXcgbWFjcm9zIGFuZCBkZWNsYXJhdGlvbnMsIGZvciBoZXguYy4KLQotRnJpIEphbiAgNiAxNzo0NDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogTWFrZSBpZGVtcG90ZW50LgotCi1XZWQgRGVjIDE0IDEzOjA4OjQzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogcHJvZ3Jlc3MuaDogTmV3IGZpbGUsIGVtcHR5IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCi0KLUZyaSBOb3YgMjUgMDA6MTQ6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzIGVtaXR0ZWQKLQlieSB0aGUgSFAgQyBjb21waWxlcnMuCi0KLUZyaSBOb3YgMTEgMTU6NDg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGZyb20gMjQKLQl0byAyNiBiaXRzLCBhbmQgY2hhbmdlIHUuYy5hbGlnbm1lbnRfcG93ZXIgZnJvbSA4IHRvIDYgYml0cy4gIDYKLQliaXQgaW4gdGhlIGFsaWdubWVudCBwb3dlciBpcyBlbm91Z2ggZm9yIGEgNjQgYml0IGFkZHJlc3Mgc3BhY2UuCi0KLU1vbiBPY3QgMzEgMTM6MDI6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19tYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVHVlIE9jdCAyNSAxMTozODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEZpeCBjb21tZW50cyBmb3IKLQltdWx0aXBsZV9jb21tb24gZmllbGQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dC9hb3V0NjQuaDogT25seSBkZWZpbmUgUU1BR0lDIGlmIGl0IGlzbid0IGFscmVhZHkgZGVmaW5lZC4KLQotCSogZGlzLWFzbS5oOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQotV2VkIEF1ZyAxMCAxMjo1MTo0MSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaCAoc3Ryc2lnbmFsKTogRG9jdW1lbnQgaXRzIGV4aXN0ZW5jZSBldmVuIGlmIHdlCi0JY2FuJ3QgZGVjbGFyZSBpdC4KLQotVHVlIEF1ZyAgMiAxNDo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBSZW1vdmUgdV9pbnQxNiwgdV9pbnQzMiwgYW5kIG93bmVyX2lkIHR5cGVkZWZzIGFuZAotCWV4cGFuZCB0aGVpciB1c2VzLiAgVGhvc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBNYWNoIGhlYWRlcnMuCi0KLUZyaSBKdWwgMjIgMTQ6MTc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGludG8gYQotCWJpdGZpZWxkLiAgQWRkIGZpZWxkIHUuYy5hbGlnbm1lbnRfcG93ZXIuCi0KLVN1biBKdWwgMTAgMDA6MjY6MzkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fbnMzMmsgZGVjbGFyYXRpb24uCi0KLU1vbiBKdW4gMjAgMTc6MTM6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2hhc2hfdGFibGUpOiBNYWtlIGNyZWF0b3IgYSBjb25zdCBwb2ludGVyLgotCi1TYXQgSnVuIDE4IDE2OjA5OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVGh1IEp1biAxNiAxNToxOTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHNoYXJlZC4KLQotTW9uIEp1biAgNiAxNDozOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgd3JpdHRlbiBmaWVsZDoKLQlub3QgbmVlZGVkIGZvciBhbGwgYmFja2VuZHMuCi0KLVRodSBBcHIgMjggMTk6MDY6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotCSogb2JzdGFjay5oOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLQlzdGRkZWYuaCBvciBnc3RkZGVmLmggaXMgaW5jbHVkZWQuCi0KLVR1ZSBNYXIgMjIgMTM6MDY6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSk6IEFkZCBiZmRfZGF0YV9saW5rX29yZGVyLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpOiBBZGQgZGF0YSBmaWVsZCB0byB1bmlvbi4KLQotTW9uIE1hciAyMSAxODo0NToyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IENoYW5nZSBiaXRzaXplIGFyZ3VtZW50Ci0JdG8gYWRkX3RvX3NldCB0byByZWxvYy4gIFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20gY29uc3RydWN0b3IuCi0JQ29tbWVudCB0aGF0IHJlbG9jX292ZXJmbG93LCByZWxvY19kYW5nZXJvdXMgYW5kIHVuYXR0YWNoZWRfcmVsb2MKLQltdXN0IGhhbmRsZSBOVUxMIHBvaW50ZXJzIGZvciByZWxvYyBsb2NhdGlvbi4KLQkoZW51bSBiZmRfbGlua19vcmRlcl90eXBlKTogQWRkIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgYW5kCi0JYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpOiBBZGQgcmVsb2MgZmllbGQgdG8gdW5pb24uCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyk6IERlZmluZS4KLQotTW9uIE1hciAxNCAxMjoyNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuaDogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0KLVR1ZSBNYXIgIDEgMTg6MTA6NDkgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBvczkwMDAgdGFyZ2V0IHNwZWNpZmljIGhlYWRlciBmaWxlLCB0aGUgaGVhZGVyIG9mIHRoZQotCW9iamVjdCBmaWxlIGlzIHVzZWQgbm93LgotCi1TdW4gRmViIDI3IDIxOjUyOjI2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5oOiBOZXcgZmlsZSwgaW50ZW5kZWQgdG8gcmVwbGFjZSBpZWVlLWZsb2F0LmguCi0KLVN1biBGZWIgMjAgMTc6MTU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKEFOU0lfUFJPVE9UWVBFUyk6IERlZmluZSBpZiB1c2luZyBBTlNJIHByb3RvdHlwZXMuCi0KLVdlZCBGZWIgMTYgMDE6MDc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaDogRG9uJ3QgZGVjbGFyZSBzdHJzaWduYWwsIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoCi0JU29sYXJpcyBzeXN0ZW0gaGVhZGVyIGZpbGVzLgotCi1TYXQgRmViIDEyIDIyOjExOjMyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJpYmVydHkuaCAoeGV4aXQpOiBVc2UgX192b2xhdGlsZV9fIHRvIGF2b2lkIGxvc2luZyBpZgotCWNvbXBpbGluZyB3aXRoIGdjYyAtdHJhZGl0aW9uYWwuCi0KLVRodSBGZWIgMTAgMTQ6MDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaDogTmV3IGZpbGUuICBEZWNsYXJlcyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKLQlsaWJpYmVydHkuCi0KLVR1ZSBGZWIgIDggMDU6MTk6NTIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JSGFuZGxlIG9ic3RhY2tfY2h1bmtfYWxsb2MgcmV0dXJuaW5nIE5VTEwuICBUaGlzIGFsbG93cwotCW9ic3RhY2tzIHRvIGJlIHVzZWQgYnkgbGlicmFyaWVzLCB3aXRob3V0IGZvcmNpbmcgdGhlbQotCXRvIGNhbGwgZXhpdCBvciBsb25nam1wLgotCSogb2JzdGFjay5oIChzdHJ1Y3Qgb2JzdGFjayk6IEFkZCBhbGxvY19mYWlsZWQgZmxhZy4KLQlfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSk6IERlY2xhcmUgdG8gcmV0dXJuIGludCwgbm90IHZvaWQuCi0JKG9ic3RhY2tfZmluaXNoKTogSWYgYWxsb2NfZmFpbGVkLCByZXR1cm4gTlVMTC4KLQkob2JzdGFja19iYXNlLCBvYnN0YWNrX25leHRfZnJlZSwgb2Jqc3RhY2tfb2JqZWN0X3NpemUpOgotCUlmIGFsbG9jX2ZhaWxlZCwgcmV0dXJuIDAuCi0JKG9ic3RhY2tfZ3Jvdywgb2JzdGFja19ncm93MCwgb2JzdGFja18xZ3Jvdywgb2JzdGFja19wdHJfZ3JvdywKLQlvYnN0YWNrX2ludF9ncm93LCBvYnN0YWNrX2JsYW5rKTogSWYgYWxsb2NfZmFpbGVkLCBkbyBub3RoaW5nIHRoYXQKLQljb3VsZCBjb3JydXB0IHRoZSBvYnN0YWNrLgotCi1Nb24gSmFuIDI0IDE1OjA2OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIG5hbWUsIHJlbG9jX25hbWUgYW5kCi0JYWRkZW5kIGFyZ21lbnRzIHRvIHJlbG9jX292ZXJmbG93IGNhbGxiYWNrLgotCi1GcmkgSmFuIDIxIDE5OjEzOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2JpZ19wb3dlcnBjLCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjLAotCXByaW50X2luc25fcnM2MDAwKTogRGVjbGFyZS4KLQotVGh1IEphbiAgNiAxNDoxNTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEFkZCBiaXRzaXplIGFyZ3VtZW50IHRvCi0JYWRkX3RvX3NldCBmaWVsZC4gIEFkZCBuZXcgY2FsbGJhY2sgbmFtZWQgY29uc3RydWN0b3IuCi0KLVRodSBEZWMgMzAgMTA6NDQ6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oOiBOZXcgZmlsZSBmb3IgbmV3IEJGRCBsaW5rZXIgYmFja2VuZCByb3V0aW5lcy4KLQotTW9uIE5vdiAyOSAxMDo0Mzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoZW51bSBkaXNfaW5zbl90eXVwZSk6IFJlbW92ZSBub24tQU5TSSB0cmFpbGluZyBjb21tYS4KLQotU2F0IE9jdCAgMiAyMDo0MjoyNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBNb3ZlIGNvbW1lbnQgdG8gcmlnaHQgcGxhY2UuCi0KLU1vbiBBdWcgIDkgMTk6MDM6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfY2h1bmtmdW4sIG9ic3RhY2tfZnJlZWZ1bik6IEFkZCBkZWZucyBmcm9tCi0JcHJldmlvdXMgdmVyc2lvbi4gIEFyZSB0aGVzZSBDeWdudXMgbG9jYWwgY2hhbmdlcz8KLQotRnJpIEF1ZyAgNiAxNzowNTo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oLCBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLU1vbiBBdWcgIDIgMTY6Mzc6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi9pMzg2Lmg6ICBBZGQgTHlueCBtYWdpYyBudW1iZXIuCi0KLU1vbiBBdWcgIDIgMTQ6NDU6MjkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIE1vdmUgZW51bSBvdXRzaWRlIG9mIHN0cnVjdCBkZWZuIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gQXVnICAyIDA4OjQ5OjMwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHdhaXQuaCAoV0VYSVRTVEFUVVMsIFdTVE9QU0lHKTogTWFzayBkb3duIHRvIDggYml0cy4gIFRoaXMgaXMKLQlmb3Igc3lzdGVtcyB0aGF0IHN0b3JlIHN0dWZmIGludG8gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIHdhaXQKLQlzdGF0dXMuCi0KLUZyaSBKdWwgMzAgMTg6Mzg6MDIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIEFkZCBuZXcgZmllbGRzIGluc25faW5mb192YWxpZCwgYnJhbmNoX2RlbGF5X2luc25zLAotCWRhdGFfc2l6ZSwgaW5zbl90eXBlLCB0YXJnZXQsIHRhcmdldDIuICBUaGVzZSBhcmUgdXNlZCB0byByZXR1cm4KLQlpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyBiYWNrIHRvIHRoZSBjYWxsaW5nCi0JcHJvZ3JhbS4gIEFkZCBjb21tZW50cywgbWFrZSBtb3JlIHJlYWRhYmxlLgotCi1Nb24gSnVsIDE5IDIyOjE0OjE0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG06ICBOZXcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTkxNL05ldFdhcmUgaW5jbHVkZXMuCi0KLVRodSBKdWwgMTUgMTI6MTA6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogTmV3IGZpZWxkIGFwcGxpY2F0aW9uX2RhdGEuCi0KLVRodSBKdWwgMTUgMTI6NDE6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIHByaW50X2luc25fbTg4ay4KLQotVGh1IEp1bCAgOCAwOTowNToyNiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBvcGNvZGUvaDgzMDAuaDogTG90cyBvZiBsaXR0bGUgZml4ZXMgZm9yIHRoZSBoOC8zMDBoLgotCi1GcmkgSnVsICAyIDEwOjMxOjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogVXNlIEFOU0kgbWFjcm9zIGlmIF9fbWlwcyBhbmQgX1NZU1RZUEVfU1ZSNCBhcmUKLQlkZWZpbmVkLCBzaW5jZSBSSVNDL09TIGNjIGhhbmRsZXMgQU5TSSBkZWNsYXJhdGlvbnMgaW4gU1ZSNCBtb2RlCi0JYnV0IGRvZXMgbm90IGRlZmluZSBfX1NURENfXy4KLQotU3VuIEp1biAyMCAxODoyNzo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBEb24ndCBuZWVkIHRvIGluY2x1ZGUgYW5zaWRlY2wuaCBhbnkgbW9yZS4KLQotRnJpIEp1biAxOCAwMzoyMjoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuaDogIEVsaW1pbmF0ZSAiaW50OF90eXBlIiwgImludDE2X3R5cGUiLCAiaW50MzJfdHlwZSIsIGFuZAotCXRoZWlyIHZhcmlhbnRzLiAgVGhlc2UgY2hhbmdlcyBhcmUgY29vcmRpbmF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nCi0JY2hhbmdlcyBpbiAuLi9iZmQvb2FzeXMuYy4KLQotV2VkIEp1biAxNiAxMDo0MzowOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBOb3RlIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZC4KLQotVHVlIEp1biAgOCAxMjoxNjowMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JIFN1cHBvcnQgZm9yIEg4LzMwMC1ICi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDAsIHByaW50X2luc25faDgzMDBoKTogRGVjbGFyZSBpdC4KLQkqIGNvZmYvaDgzMDAuaDogTmV3IG1hZ2ljIG51bWJlci4KLQkqIGNvZmYvaW50ZXJuYWwuaDogTmV3IHJlbG9jYXRpb25zLgotCSogb3Bjb2RlL2g4MzAwLmg6IExvdHMgb2YgbmV3IG9wY29kZXMuCi0KLVR1ZSBKdW4gIDEgMDc6MzU6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKGNvbnN0KTogRG9uJ3QgZGVmaW5lIGl0IGlmIGl0J3MgYWxyZWFkeSBkZWZpbmVkLgotCi1UaHUgTWF5IDI3IDE4OjE5OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2hwcGEpOiBEZWNsYXJlIGl0LgotCi0JKiBiZmQuaDogTW92ZWQgdG8gYmZkIGRpcmVjdG9yeS4gIFNtYWxsIHN0dWIgaGVyZSBpbmNsdWRlcyBpdAotCXdpdGhvdXQgcmVxdWlyaW5nICItSS4uL2JmZCIuCi0KLVRodSBBcHIgMjkgMTI6MDY6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIHdpdGggQlNGX0ZVTkNUSU9OLgotCi1Nb24gQXByIDI2IDE4OjE1OjUwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaCwgZGlzLWFzbS5oOiBVcGRhdGVkIHdpdGggSGl0YWNoaSBTSC4KLQotRnJpIEFwciAyMyAxODo0MTozOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgd2l0aCBhbHBoYSBjaGFuZ2VzLgotCSogZGlzLWFzbS5oOiBBZGRlZCBhbHBoYS4KLQotRnJpIEFwciAxNiAxNzozNTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3Igc2lnbmVkIGJmZF8qZ2V0XyouCi0KLVRodSBBcHIgMTUgMDk6MjQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZvciBmaWxlX3RydW5jYXRlZCBlcnJvci4KLQotVGh1IEFwciAgOCAxMDo1Mzo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IElmIG5vIEFOU0ksIGRlZmluZSBjb25zdCB0byBiZSBlbXB0eS4KLQotVGh1IEFwciAgMSAwOTowMDoxMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBEZWNsYXJlIGEyOWsgYW5kIGk5NjAgcHJpbnRfaW5zbl8qLgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcmludF9hZGRyZXNzX2Z1bmMgYW5kIHJlbGF0ZWQgc3R1ZmYuCi0KLQkqIGRpcy1hc20uaCAoZGlzX2FzbV9yZWFkX21lbW9yeSk6IEZpeCBwcm90b3R5cGUuCi0KLVdlZCBNYXIgMzEgMTc6NDA6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fc3BhcmMuCi0KLVdlZCBNYXIgMzEgMTc6NTE6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmb3IgQkZEX1JFTE9DX01JUFNfR1BSRUwgYW5kIGJmZF9bZ3NdZXRfZ3Bfc2l6ZQotCXByb3RvdHlwZXMuCi0KLVdlZCBNYXIgMzEgMTY6MzU6MTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAoZGlzYXNzZW1ibGVfaW5mbyk6ICBGaXggdHlwbyBpbiBwcm90b3R5cGUgb2YKLQlkaXNfYXNtX21lbW9yeV9lcnJvcigpLgotCi1UdWUgTWFyIDMwIDE5OjA5OjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlcl9pbmZvKTogQWRkIHJlYWRfbWVtb3J5X2Z1bmMsCi0JbWVtb3J5X2Vycm9yX2Z1bmMsIGJ1ZmZlciwgYW5kIGxlbmd0aC4KLQkoe0dEQl8sfUlOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCB0aGVtLgotCXByaW50X2luc25fKjogUmVtb3ZlIHNlY29uZCBhcmd1bWVudC4KLQotVHVlIE1hciAzMCAxNDo0ODo1NSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgbG1hIGZpZWxkIG9mIHNlY3Rpb24uCi0KLVR1ZSBNYXIgMzAgMTI6MjI6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IFVzZSBBTlNJIHZlcnNpb25zIG9uIEFJWCByZWdhcmRsZXNzIG9mIF9fU1REQ19fLgotCi1GcmkgTWFyIDE5IDE0OjQ5OjQ5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZCBoODUwMC4KLQotVGh1IE1hciAxOCAxMzo0OTowOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuaDogIE1vdmVkIGZyb20gLi4vZ2RiLgotCSogZGlzLWFzbS5oOiAgTmV3IGZpbGUuICBJbnRlcmZhY2UgdG8gZGlzLWFzc2VtYmxlci4KLQotVGh1IE1hciAxMSAxMDo1Mjo1NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoRE1HTF9OT19PUFRTKTogIEFkZCBkZWZpbmUgKHNldCB0byAwKSB0byB1c2UKLQlpbiBwbGFjZSBvZiBiYXJlIDAsIGZvciByZWFkYWJpbGl0eSByZWFzb25zLgotCi1UdWUgTWFyICAyIDE3OjUwOjExIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgd2l0aCBBUk0uCi0KLVR1ZSBGZWIgMjMgMTI6MjE6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBuZXcgZWxlbWVudHMgaW4gSlVNUF9UQUJMRS4KLQotVHVlIEZlYiAxNiAwMDo1MTozMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgZm9yIEJGRF9WRVJTSU9OIDIuMS4KLQotVHVlIEphbiAyNiAxMTo0OToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIFNFQ19JU19DT01NT04gZmxhZy4KLQotVHVlIEphbiAxOSAxMjoyNToxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIGJmZF9hc3ltYm9sX3ZhbHVlIGJ1ZyBmaXguCi0KLUZyaSBKYW4gIDggMTY6Mzc6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIHRvIGluY2x1ZGUgRUNPRkYgdGRhdGEgYW5kIHRhcmdldF9mbGF2b3VyLgotCi1TdW4gRGVjIDI3IDE3OjUyOjMwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIEFkZCBkZWNsYXJhdGlvbiBmb3IgYmZkX2dldF9zaXplKCkuCi0KLVR1ZSBEZWMgMjIgMjI6NDI6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBQcm90ZWN0IGZpbGUgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb25zIHdpdGgKLQkjaWYgIWRlZmluZWQoREVNQU5HTEVfSCkuLi4jZGVmaW5lIERFTUFOR0xFX0guLi4jZW5kaWYuCi0KLU1vbiBEZWMgMjEgMjE6MjU6NTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gZ2V0IGhwcGFfY29yZV9zdHJ1Y3QgZnJvbSBiZmQuYy4KLQotVGh1IERlYyAxNyAwMDo0MjozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gZ2V0IHRla2hleCB0ZGF0YSBuYW1lIGNoYW5nZSBmcm9tIGJmZC4KLQotTW9uIE5vdiAgOSAyMzo1NTo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogIFVwZGF0ZSBjb21tZW50cyB0byBkaXNjb3VyYWdlIHVzZSBvZiBFWEZVTi4KLQotVGh1IE5vdiAgNSAxNjozNTo0NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgdG8gYnJpbmcgaW4gU0VDX1NIQVJFRF9MSUJSQVJZLgotCi1UaHUgTm92ICA1IDAzOjIxOjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBFWEZVTiwgYmZkX3NlY2xldF9zdHJ1Y3QsIGFuZCBTREVGCi0JY2xlYW51cHMgaW4gYmZkLgotCi1XZWQgTm92ICA0IDA3OjI4OjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBib3V0LmggKE5fQ0FMTE5BTUUsIE5fQkFMTkFNRSk6IERlZmluZSBhcyBjaGFyLXR5cGUgdmFsdWVzLCBzbwotCXdpZGVuaW5nIHdvcmtzIGNvbnNpc3RlbnRseS4KLQotRnJpIE9jdCAxNiAwMzoxNzowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6ICBVcGRhdGUgdG8gUmV2aXNlZCBTdGFuZGFyZCBGU0YgVmVyc2lvbi4KLQotVGh1IE9jdCAxNSAyMTo0MzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oIChzdHJ1Y3Qgb3B0aW9uKTogdXNlIHRoZSBwcm92aWRlZCBlbnVtIGZvciBoYXNfYXJnLgotCi0JKiBkZW1hbmdsZS5oIChBVVRPX0RFTUFOR0xJTkcsIEdOVV9ERU1BTkdMSU5HLAotCSAgTFVDSURfREVNQU5HTElORyk6IHVsdHJpeCBjb21waWxlcnMgcmVxdWlyZSBlbnVtcyB0byBiZQotCSAgZW51bXMgYW5kIGludHMgdG8gYmUgaW50cyBhbmQgY2FzdHMgd2hlcmUgdGhleSBtZWV0LiAgY2FzdCBzb21lCi0JICBlbnVtcyBpbnRvIGludHMuCi0KLVRodSBPY3QgMTUgMDQ6MzU6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIGFmdGVyIGNvbW1lbnQgY2hhbmdlcy4KLQotVGh1IE9jdCAgOCAwOTowMzowMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmggKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcik6IG5ldyBtYWNybyBmb3IgZ2V0dGluZyBpbiB4dmVjCi0KLVRodSBTZXAgIDMgMDk6MTA6NTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiAgc2l6ZSBuZWVkcyB0byBiZSBzaWduZWQgaWYKLQlpdCdzIGdvaW5nIHRvIGhvbGQgbmVnYXRpdmUgdmFsdWVzLgotCi1TdW4gQXVnIDMwIDE3OjUwOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYi4gIE1hZGUgaW5kZXBlbmRlbnQKLQlvZiBnZGIuICBBbGxvdyBkZW1hbmdsaW5nIHN0eWxlIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYQotCXBhcmFtZXRlciB0byBjcGx1c19kZW1hbmdsZSgpLCBidXQgdXNpbmcgdGhlCi0JY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIGdsb2JhbCBhcyB0aGUgZGVmYXVsdC4KLQotU2F0IEF1ZyAyOSAxMDowNzo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgTWVyZ2UgY29tbWVudCBjaGFuZ2UgZnJvbSBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1UaHUgQXVnIDI3IDEyOjU5OjI5IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBhZGQgd2UzMmsKLQotVHVlIEF1ZyAyNSAxNTowNzo0NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IG5ldyBhZnRlciBaODAwMCBzdHVmZgotCi1Nb24gQXVnIDE3IDA5OjAxOjIzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogUmVnZW5lcmF0ZWQgYWZ0ZXIgcGFnZS9zZWdtZW50IHNpemUgY2hhbmdlcy4KLQotU2F0IEF1ZyAgMSAxMzo0NjozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiBNZXJnZSBjaGFuZ2VzIGZyb20gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotTW9uIEp1bCAyMCAyMTowNjoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oIChhcmVhX2lkLCBmbGFncyk6ICBSZW1vdmUsIHJlcGxhY2Ugd2l0aCBleHRyYV9hcmcsCi0JdXNlX2V4dHJhX2FyZywgYW5kIG1heWJlX2VtcHR5X29iamVjdC4KLQkqIG9ic3RhY2suaCAoT0JTVEFDS19NQVlCRV9FTVBUWV9PQkpFQ1QsIE9CU1RBQ0tfTU1BTExPQ19MSUtFKToKLQlSZW1vdmUsIHJlcGxhY2VkIGJ5IG1heWJlX2VtcHR5X29iamVjdCBhbmQgdXNlX2V4dHJhX2FyZyBiaXRmaWVsZHMuCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfZnVsbF9iZWdpbiwgX29ic3RhY2tfYmVnaW4pOiAgUmVtb3ZlIGFyZWFfaWQKLQlhbmQgZmxhZ3MgYXJndW1lbnRzLgotCSogb2JzdGFjay5oIChvYnN0YWNrX2FsbG9jX2FyZyk6ICBOZXcgbWFjcm8gdG8gc2V0IGV4dHJhX2FyZy4KLQotVGh1IEp1bCAxNiAwODoxMjo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IG5ldyBhZnRlciBhZGRpbmcgQkZEX0lTX1JFTEFYQUJMRQotCi1TYXQgSnVsICA0IDAzOjIyOjIzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlZ2VuIGFmdGVyIGFkZGluZyBCU0ZfRklMRS4KLQotTW9uIEp1biAyOSAxNDoxODozNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgc3VuZmlzaCkKLQotCSogb2JzdGFjay5oOiAgQ29udmVydCBiY29weSgpIHVzZSB0byBtZW1jcHkoKSwgd2hpY2ggaXMgbW9yZQotCXBvcnRhYmxlLCBtb3JlIHN0YW5kYXJkLCBhbmQgY2FuIHRha2UgYWR2YW50YWdlIG9mIGdjYydzIGJ1aWx0aW4KLQlmdW5jdGlvbnMgZm9yIGluY3JlYXNlZCBwZXJmb3JtYW5jZS4KLQotVGh1IEp1biAyNSAwNDo0NjowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoUEFSQU1TKTogIEluY29ycG9yYXRlIHRoaXMgbWFjcm8gZnJvbSBnZGIncyBkZWZzLmguCi0JSXQncyBhIGNsZWFuZXIgd2F5IHRvIGZvcndhcmQtZGVjbGFyZSBmdW5jdGlvbiBwcm90b3R5cGVzLgotCi1GcmkgSnVuIDE5IDE1OjQ2OjMyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgSFBQQSBtZXJnZS4KLQotVHVlIEp1biAxNiAyMTozMDo1NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IGdyYXR1aXRvdXMgd2hpdGUgc3BhY2UgY2hhbmdlcyBtZXJnZWQgZnJvbSBvdGhlciBwcmVwCi0JICByZWxlYXNlcy4KLQotVGh1IEp1biAxMSAwMToxMDo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZWdlbidkIGZyb20gYmZkLmMgYWZ0ZXIgcmVtb3ZpbmcgZWxmX2NvcmVfdGRhdGFfc3RydWN0LgotCi1Nb24gTWF5IDE4IDE3OjI5OjAzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBtYWtlLTMuNjIuMTEuCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIGdyZXAtMS42IChhbHBoYSkuCi0KLUZyaSBNYXkgIDggMTQ6NTM6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIGJpc29uLTEuMTguCi0KLVNhdCBNYXIgMTQgMTc6MjU6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIEFkZCAiYXJlYV9pZCIgYW5kICJmbGFncyIgbWVtYmVycyB0byBvYnN0YWNrCi0Jc3RydWN0dXJlLiAgQWRkIG9ic3RhY2tfY2h1bmtmdW4oKSBhbmQgb2JzdGFja19mcmVlZnVuKCkgdG8KLQlzZXQgZnVuY3Rpb25zIGV4cGxpY2l0bHkuICBDb252ZXJ0IG1heWJlX2VtcHR5X29iamVjdCB0bwotCWEgYml0IGluICJmbGFncyIuCi0KLVRodSBGZWIgMjcgMjI6MDE6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHdhaXQuaCAoV0lGU1RPUFBFRCk6ICBBZGQgSUJNIHJzNjAwMC1zcGVjaWZpYyB2ZXJzaW9uLgotCi1GcmkgRmViIDIxIDIwOjQ5OjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBBZGQgb2JzdGFja19mdWxsX2JlZ2luLgotCSogYmZkLmgsIG9ic3RhY2suaDogIFByb3RvbGludC4KLQotVGh1IEphbiAzMCAwMToxODo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZW1vdmUgY29tbWEgZnJvbSBlbnVtIGRlY2xhcmF0aW9uLgotCi1Nb24gSmFuIDI3IDIyOjAxOjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oIDogbmV3IHRhcmdldCBlbnRyLCBiZmRfcmVsYXhfc2VjdGlvbgotCi1XZWQgRGVjIDE4IDE3OjE5OjQ0IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBpZWVlLmgsIG9wY29kZS9tNjhrLmgsIG9wY29kZS9zcGFyYy5oOiAgQU5TSWZ5IGVudW1zLgotCi1UaHUgRGVjIDEyIDIwOjU5OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBmb3Blbi1zYW1lLmgsIGZvcGVuLWJpbi5oOiAgTmV3IGZpbGVzIGZvciBjb25maWd1cmluZwotCXdoZXRoZXIgZm9wZW4gZGlzdGluZ3Vpc2hlcyBiaW5hcnkgZmlsZXMgb3Igbm90LiAgRm9yIHVzZQotCWJ5IGhvc3QtZGVwZW5kZW50IGNvbmZpZyBmaWxlcy4KLQotU2F0IE5vdiAzMCAyMDo0Njo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IGNoYW5nZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQuCi0KLQkqIGNyZWF0ZWQgY29mZiwgZWxmIGFuZCBvcGNvZGUgYW5kIGFvdXQgZGlyZWN0b3JpZXMuIE1vdmVkOgotCi0JYW91dDY0LmgJPT0+IGFvdXQvYW91dDY0LmgKLQlhci5oCQk9PT4gYW91dC9hci5oCi0JYS5vdXQuZW5jYXAuaAk9PT4gYW91dC9lbmNhcC5oCi0JYS5vdXQuaG9zdC5oCT09PiBhb3V0L2hvc3QuaAotCWEub3V0LmhwLmgJPT0+IGFvdXQvaHAuaAotCWEub3V0LnN1bjQuaAk9PT4gYW91dC9zdW40LmgKLQlyYW5saWIuaAk9PT4gYW91dC9yYW5saWIuaAotCXJlbG9jLmgJCT09PiBhb3V0L3JlbG9jLmgKLQlzdGFiLmRlZgk9PT4gYW91dC9zdGFiLmRlZgotCXN0YWIuZ251LmgJPT0+IGFvdXQvc3RhYl9nbnUuaAotCi0JY29mZi1hMjlrLmgJPT0+IGNvZmYvYTI5ay5oCi0JY29mZi1oODMwMC5oCT09PiBjb2ZmL2g4MzAwLmgKLQljb2ZmLWkzODYuaAk9PT4gY29mZi9pMzg2LmgKLQljb2ZmLWk5NjAuaAk9PT4gY29mZi9pOTYwLmgKLQlpbnRlcm5hbGNvZmYuaAk9PT4gY29mZi9pbnRlcm5hbC5oCi0JY29mZi1tNjhrLmgJPT0+IGNvZmYvbTY4ay5oCi0JY29mZi1tODhrLmgJPT0+IGNvZmYvbTg4ay5oCi0JY29mZi1taXBzLmgJPT0+IGNvZmYvbWlwcy5oCi0JY29mZi1yczYwMDAuaAk9PT4gY29mZi9yczYwMDAuaAotCi0JZWxmLWNvbW1vbi5oCT09PiBlbGYvY29tbW9uLmgKLQlkd2FyZi5oCQk9PT4gZWxmL2R3YXJmLmgKLQllbGYtZXh0ZXJuYWwuaAk9PT4gZWxmL2V4dGVybmFsLmgKLQllbGYtaW50ZXJuYWwuaCAgPT0+IGVsZi9pbnRlcm5hbC5oCi0KLQlhMjlrLW9wY29kZS5oCT09PiBvcGNvZGUvYTI5ay5oCi0JYXJtLW9wY29kZS5oCT09PiBvcGNvZGUvYXJtLmgKLQloODMwMC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2g4MzAwLmgKLQlpMzg2LW9wY29kZS5oCT09PiBvcGNvZGUvaTM4Ni5oCi0JaTg2MC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2k4NjAuaAotCWk5NjAtb3Bjb2RlLmgJPT0+IG9wY29kZS9pOTYwLmgKLQltNjhrLW9wY29kZS5oCT09PiBvcGNvZGUvbTY4ay5oCi0JbTg4ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL204OGsuaAotCW1pcHMtb3Bjb2RlLmgJPT0+IG9wY29kZS9taXBzLmgKLQlucDEtb3Bjb2RlLmgJPT0+IG9wY29kZS9ucDEuaAotCW5zMzJrLW9wY29kZS5oCT09PiBvcGNvZGUvbnMzMmsuaAotCXBuLW9wY29kZS5oCT09PiBvcGNvZGUvcG4uaAotCXB5ci1vcGNvZGUuaAk9PT4gb3Bjb2RlL3B5ci5oCi0Jc3BhcmMtb3Bjb2RlLmgJPT0+IG9wY29kZS9zcGFyYy5oCi0JdGFob2Utb3Bjb2RlLmgJPT0+IG9wY29kZS90YWhvZS5oCi0JdmF4LW9wY29kZS5oCT09PiBvcGNvZGUvdmF4LmgKLQotCi0KLVdlZCBOb3YgMjcgMTA6Mzg6MzEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiAoaW50ZXJuYWxfc2NuaGRyKSB0b29rIG91dCAjZGVmIGRlcGVuZGVuY3ksIG5vdwotCXNfbnJlbG9jIGFuZCBzX25sbm5vIGFyZSBhbHdheXMgbG9uZy4gCShpbnRlcm5hbF9yZWxvYyk6IGFsbHdheXMKLQloYXMgYW4gb2Zmc2V0IGZpZWxkIG5vdy4KLQotRnJpIE5vdiAyMiAwODoxMjo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuaDogIExpbnQ7IHVzZSB1bnNpZ25lZCBjaGFycyBmb3IgZXh0ZXJuYWwgZmllbGRzLgotCSogaW50ZXJuYWxjb2ZmLmg6ICBMaW50OyBjYXN0IHN0b3JhZ2UgY2xhc3NlcyB0byBzaWduZWQgY2hhci4KLQotVGh1IE5vdiAyMSAyMTowMTowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6IFJlbW92ZSB0aGUgR05VIGV4dGVuZGVkIHR5cGUgY29kZXMgKGUuZy4gTl9TRVRUKS4KLQkqIGFvdXQ2NC5oOiAgVGhlIGhldXJpc3RpYyBmb3IgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbgotCXN1bm9zLXN0eWxlIGFuZCBic2Qtc3R5bGUgWk1BR0lDIGZpbGVzICh3cnQuIHdoZXJlIHRoZQotCXRleHQgc2VnbWVudCBzdGFydHMpIGlzIG1vdmVkIGludG8gKHRoZSBkZWZhdWx0IGRlZmluaXRpb24gb2YpCi0JdGhlIG1hY3JvIE5fSEVBREVSX0lOX1RFWFQuICBUaGlzIGRlZmluaXRpb24gaXMgb25seSB1c2VkCi0JaWYgbm8gb3RoZXIgZGVmaW5pdGlvbiBpcyB1c2VkIC0gZS5nLiBiZmQvbmV3c29zMy5jIGRlZmluZXMKLQlOX0hFQURFUl9JTl9URVhUKHgpIHRvIGJlIGFsd2F5cyAwIChhcyBiZWZvcmUpLgotCi1UaHUgTm92IDIxIDExOjUzOjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9UWFRBRERSLCBOX1RYVE9GRiwgTl9UWFRTSVpFKTogIE5ldyBkZWZpbml0aW9ucwotCXRoYXQgc2hvdWxkIGhhbmRsZSBhbGwgdXNlcy4gIExPR0lDQUxfIHZlcnNpb25zIGRlbGV0ZWQuCi0JRWxpbWluYXRlIE5fSEVBREVSX0lOX1RFWFQsIHVzaW5nIGFfZW50cnkgdG8gZGV0ZXJtaW5lIHdoaWNoCi0Ja2luZCBvZiB6bWFnaWMgYS5vdXQgZmlsZSB3ZSBhcmUgbG9va2luZyBhdC4KLQkqIGNvZmYtcnM2MDAwLmg6ICBUeXBvLgotCi1UdWUgTm92IDE5IDE4OjQzOjM3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKE5vdGU6ICBUaGlzIGlzIGEgcmV2aXNlZCBlbnRyeSwgYXMgd2FzIGFvdXQ2NC5oLikKLQkqIGFvdXQ2NC5oOiAgU29tZSBjbGVhbnVwcyBvZiBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGOgotCVdpbGwgbm93IHdvcmsgZm9yIGJvdGggb2xkLSBhbmQgbmV3LXN0eWxlIFpNQUdJQyBmaWxlcywKLQlkZXBlbmRpbmcgb24gTl9IRUFERVJfSU5fVEVYVCBtYWNyby4KLQlBZGQgTE9HSUNBTF9UWFRBRERSLCBMT0lDQUxfVFhUT0ZGIGFuZCBMT0dJQ0FMX1RYVFNJWkUKLQl0aGF0IGRvbid0IGNvdW50IHRoZSBleGVjIGhlYWRlciBhcyBwYXJ0Ci0Jb2YgdGhlIHRleHQgc2VnbWVudCwgdG8gYmUgY29uc2lzdGVudCB3aXRoIGJmZC4KLQkqIGEub3V0LnN1bjQuaDogIFNpbXBsaWZpZWQvZml4ZWQgZm9yIHByZXZpb3VzIGNoYW5nZS4KLQotTW9uIE5vdiAxOCAwMDowMjowNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFVwZGF0ZSB0byBEV0FSRiBkcmFmdCA1IHZlcnNpb24gZnJvbSBnY2MyLgotCi1UaHUgTm92IDE0IDE5OjQ0OjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogIEFkZGVkIGRlZnMgZm9yIGV4dGVuZGVkIEdOVSBzeW1ib2wgdHlwZXMsCi0Jc3VjaCBhcyBOX1NFVFQuICBUaGVzZSBhcmUgbm9ybWFsbHkgaWZkZWYnZCBvdXQgKGJlY2F1c2UKLQlvZiBjb25mbGljdHMgd2l0aCBhLm91dC5nbnUuaCksIGJ1dCBhcmUgdXNlZCBieSBiZmJfc3RhYl9uYW1lKCkuCi0KLVRodSBOb3YgMTQgMTk6MTc6MDMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi1jb21tb24uaDogIEFkZCBkZWZpbmVzIHRvIHN1cHBvcnQgRUxGIHN5bWJvbCB0YWJsZSBjb2RlLgotCi1Nb24gTm92IDExIDE5OjAxOjA2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYtaW50ZXJuYWwuaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1jb21tb24uaDogIEFkZCBzdXBwb3J0IGZvcgotCW5vdGUgc2VjdGlvbnMsIHdoaWNoIGFyZSB1c2VkIGluIEVMRiBjb3JlIGZpbGVzIHRvIGhvbGQgY29waWVzCi0Jb2YgdmFyaW91cyAvcHJvYyBzdHJ1Y3R1cmVzLgotCi1UaHUgTm92ICA3IDA4OjU4OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiB0b29rIG91dCB0aGUgTTg4IGRlcGVuZGVuY3kgaW4gdGhlIGxpbmVubwotCXN0cnVjdC4KLQkqIGNvZmYtbTg4ay5oOiBkZWZpbmVzIEdFVF9MSU5FTk9fTE5OTyBhbmQgUFVUX0xJTkVOT19MTk5PIHRvIHVzZQotCTMyYml0IGxpbm5vIGVudHJpZXMuCi0JKiBhMjlrLW9wY29kZS5oOiBmaXhlZCBlbmNvZGluZyBvZiBtdGFjYwotCi1TdW4gTm92ICAzIDExOjU0OjIyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmcm9tIC4uL2JmZC9iZmQtaW4uaCAocS52KS4KLQotRnJpIE5vdiAgMSAxMToxMzo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6ICBBZGQgeF9jc2VjdCBkZWZpbmVzLgotCi1GcmkgT2N0IDI1IDAzOjE4OjIwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgQ09GRi1yZWxhdGVkIGZpbGVzIGluIGBjb2ZmLUFSQ0guaCcgZm9ybS4KLQljb2ZmLWEyOWsuaCwgY29mZi1pMzg2LmgsIGNvZmYtaTk2MC5oLCBjb2ZmLW02OGsuaCwgY29mZi1tODhrLmgsCi0JY29mZi1taXBzLmgsIGNvZmYtcnM2MDAwLmggdG8gYmUgZXhhY3QuCi0KLVRodSBPY3QgMjQgMjI6MTE6MTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIHN1cHBvcnQsIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaPv0bmctVGjlbyBW9SwgYW5kCi0JSm9obiBHaWxtb3JlLgotCi0JKiBhLm91dC5nbnUuaDogIFVwZGF0ZSBzbGlnaHRseS4KLQkqIGJmZC5oOiAgQWRkIG5ldyBlcnJvciBjb2RlLCBmaXggZG9jLCBhZGQgYmZkX2FyY2hfcnM2MDAwLgotCSogaW50ZXJuYWxjb2ZmLmg6ICBBZGQgbW9yZSBGXyBjb2RlcyBmb3IgZmlsZWhkci4gIEFkZAotCXJzLzYwMDAtZGVwZW5kZW50IGZpZWxkcyB0byBhb3V0aGRyLiAgQWRkIHN0b3JhZ2UgY2xhc3NlcwotCXRvIHN5bWVudHMuICBBZGQgNjAwMC1zcGVjaWZpYyBhdXhlbnQuICBBZGQgcl9zaXplIGluIHJlbG9jLgotCSogcnM2MDAwY29mZi5jOiAgTmV3IGZpbGUuCi0KLVRodSBPY3QgMjQgMDQ6MTM6MjAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6IE5ldyBmaWxlIGZvciBkd2FyZiBzdXBwb3J0LiAgQ29waWVkIGZyb20gZ2NjMgotCWRpc3RyaWJ1dGlvbi4KLQotV2VkIE9jdCAxNiAxMzozMTo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6ICBSZW1vdmUgUEFHRV9TSVpFIGRlZmluZXM7IHRoZXkgYXJlIHRhcmdldC1kZXBlbmRlbnQuCi0JQWRkIE5fRk5fU0VRIGZvciBOX0ZOIHN5bWJvbCB0eXBlIHVzZWQgb24gU2VxdWVudCBtYWNoaW5lcy4KLQkqIHN0YWIuZGVmOiAgSW5jbHVkZSBOX0ZOX1NFUSBpbiB0YWJsZS4KLQkqIGJvdXQuaDogIEV4dGVybmFsIGZvcm1hdHMgb2Ygc3RydWN0dXJlcyB1c2UgdW5zaWduZWQgY2hhcnMuCi0KLUZyaSBPY3QgMTEgMTI6NDA6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDp1cGdyYWRlIGZyb20gYmZkLmMKLQkqIGludGVybmFsY29mZi5oOiBhZGQgbl9uYW1lLCBuX3plcm9lcyBhbmQgbl9vZmZzZXQgbWFjcm9zCi0JKiBhbWRjb2ZmLmg6IERlZmluZSBPTUFHSUMgYW5kIEFPVVRIRFJTWi4KLQotRnJpIE9jdCAxMSAxMDo1ODowNiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuaG9zdC5oOiBDaGFuZ2UgU0VHTUVOVF9TSVpFIHRvIDB4MTAwMCBmb3IgU29ueS4KLQkqIGJmZC5oIChhbGlnbl9wb3dlcik6IEFkZCAoYWN0dWFsbHkgbW92ZSkgY29tbWVudC4KLQotVHVlIE9jdCAgOCAxNToyOTozMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzL2gtcnRic2QuaDogRGVmaW5lIE1JU1NJTkdfVkZQUklOVCAoZm9yIGJpbnV0aWxzL2J1Y29tbS5jKS4KLQotU3VuIE9jdCAgNiAxOToyNDozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6ICBNb3ZlIHN0cnVjdCBpbnRlcm5hbF9leGVjIHRvIC4uL2JmZC9saWJhb3V0Lmggc28KLQlpdCBjYW4gYmUgc2hhcmVkIGJ5IGFsbCBgYS5vdXQtZmFtaWx5JyBjb2RlLiAgUmVuYW1lCi0JRVhURVJOQUxfTElTVF9TSVpFIHRvIEVYVEVSTkFMX05MSVNUX1NJWkUuICBVc2UgYmFzaWMgdHlwZXMKLQlmb3Igbmxpc3QgbWVtYmVycywgYW5kIG1ha2Ugc3RyeCBpbnRlZ3JhbCByYXRoZXIgdGhhbiBwb2ludGVyLgotCU1vcmUgY29tbWVudGFyeSBvbiBuX3R5cGUgdmFsdWVzLgotCSogYm91dC5oOiAgUHJvdmlkZSBhIHN0cnVjdCBleHRlcm5hbF9leGVjIHJhdGhlciB0aGFuIGFuCi0JaW50ZXJuYWxfZXhlYy4KLQkqIG02OGtjb2ZmLmg6ICBSZW1vdmUgYHRhZ2VudHJpZXMnIHdoaWNoIHNudWNrIGluIGZyb20gdGhlIGk5NjAKLQlDT0ZGIHBvcnQuCi0KLUZyaSBPY3QgIDQgMDE6MjU6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLW9wY29kZS5oOiAgUmVtb3ZlIGBfZW51bScgZnJvbSB0aGUgdHlwZWRlZiBmb3IgYW4gZW51bS4KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIGJmZCBjaGFuZ2VzLgotCi0JKiBzeXMvaC1pMzg2bWFjaC5oLCBzeXNkZXAuaDogIEFkZCAzODYgTWFjaCBob3N0IHN1cHBvcnQuCi0KLVR1ZSBPY3QgIDEgMDQ6NTg6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBlbGYtY29tbW9uLmgsIGVsZi1leHRlcm5hbC5oLCBlbGYtaW50ZXJuYWwuaDoKLQlBZGQgcHJlbGltaW5hcnkgRUxGIHN1cHBvcnQsIHN1ZmZpY2llbnQgZm9yIEdEQiwgZnJvbSBGcmVkIEZpc2guCi0JKiBzeXNkZXAuaCwgc3lzL2gtYW1peC5oOiAgU3VwcG9ydCBBbWlnYSBTVlI0LgotCi0JKiBzeXMvaC12YXh1bHQuaDogIE1ha2UgaXQgd29yay4gIChEYXZpZCBUYXlsb3IgPHRheWxvckB0aGluay5jb20+KQotCSogYS5vdXQudmF4Lmg6ICBSZW1vdmUgdW51c2VkIGFuZCBjb25mdXNpbmcgZmlsZS4KLQotTW9uIFNlcCAzMCAxMjo1MjozNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLmg6IERlZmluZSBORVdTT1MzX1NZUywgYW5kIHVzZSBpdC4KLQotRnJpIFNlcCAyMCAxMzozODoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmggKE5fRk4pOiAgSXRzIHZhbHVlICpyZWFsbHkgaXMqIDB4MUYuCi0JRml4IGl0LCBhbmQgYWRkIGNvbW1lbnRzIHdhcm5pbmcgYWJvdXQgb3ItaW5nIE5fRVhUIHdpdGggaXQKLQlhbmQvb3IgTl9XQVJOSU5HLgotCSogYW91dDY0LmggKE5fRk4pOiAgRml4IHZhbHVlLCBhZGQgY29tbWVudHMgYWJvdXQgTl9FWFQuCi0JKiBzdGFiLmRlZiAodGFibGUgYXQgZW5kKTogIFVwZGF0ZSB0byBzaG93IGFsbCB0aGUgdHlwZQotCXZhbHVlcyA8MHgyMCwgaW5jbHVkaW5nIGxvdyBvcmRlciBiaXRzLiAgTW92ZSBOX0ZOIHRvCi0JaXRzIHJpZ2h0ZnVsIHBsYWNlLgotCi1UdWUgU2VwIDE3IDE3OjQxOjM3IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5cy9oLWlyaXgzLmg6ICBzZ2kvaXJpeCBzdXBwb3J0LgotCi1UdWUgU2VwIDE3IDA3OjUyOjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWYgKE5fREVGRCk6ICBBZGQgR05VIE1vZHVsYS0yIGRlYnVnIHN0YWIsIGZyb20gQW5kcmV3Ci0JQmVlcnMuCi0KLVRodSBTZXAgMTIgMTQ6MTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaCAoU1lNTk1MRU4sIEZJTE5NTEVOLCBESU1OVU0pOiAgRGVmaW5lIHRoZXNlCi0JZm9yIGludGVybmFsY29mZiwgc2VwYXJhdGVseSBmcm9tIHRoZSB2YXJpb3VzIGV4dGVybmFsIGNvZmYncy4KLQkqIGFtZGNvZmYuaCwgYmNzODhrY29mZi5oLCBpMzg2Y29mZi5oLCBpbnRlbC1jb2ZmLmgsIG02OGtjb2ZmLmgsCi0JbTg4ay1iY3MuaDogUHJlZml4IFNZTU5NTEVOLCBGSUxOTUxFTiwgYW5kIERJTU5VTSB3aXRoIEVfJ3MgZm9yCi0JdGhlIGV4dGVybmFsIHN0cnVjdCBkZWZpbml0aW9ucy4KLQkqIGVjb2ZmLmg6IFJlbW92ZSB0aGVzZSAjZGVmaW5lJ3MsIGtsdWRnZSBubyBsb25nZXIgbmVlZGVkLgotCi0JKiBzeXMvaC11bHRyYTMuaDogIEFkZCBuZXcgVWx0cmFjb21wdXRlciBob3N0LgotCSogc3lzZGVwLmg6ICBBZGQgVUxUUkEzX1NZTTFfU1lTIGFuZCB1c2UgaXQuCi0KLVR1ZSBTZXAgMTAgMTA6MTE6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpMzg2Y29mZi5oIChMSU5FU1opOiAgQWx3YXlzIDYsIG5vdCBiYXNlZCBvbiBzaXplb2YoKS4KLQkoRml4IGZyb20gUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LikKLQotV2VkIFNlcCAgNCAwODo1ODozNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oLCBhb3V0NjQuaDogIEFkZCBOX1dBUk5JTkcuICBDaGFuZ2UgTl9GTiB0byAweDBFLAotCXRvIG1hdGNoIFN1bk9TIGFuZCBCU0QuICBBZGQgTl9DT01NIGFzIDB4MTIgZm9yIFN1bk9TIHNoYXJlZCBsaWIKLQlzdXBwb3J0LgotCSogc3RhYi5kZWY6ICBBZGQgTl9DT01NIHRvIHRhYmxlLCBmaXggb3ZlcmxhcCBjb21tZW50LgotCi1UdWUgU2VwICAzIDA2OjI5OjIwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCU1lcmdlIHdpdGggbGF0ZXN0IEZTRiB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcy4KLQotCSogc3RhYi5nbnUuaDogIEFkZCBMQVNUX1VOVVNFRF9TVEFCX0NPREUuCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSB0byBHUEwyLiAgTW92ZSBOX1dBUk5JTkcgb3V0LCBzaW5jZSBub3QgYQotCWRlYnVnIHN5bWJvbC4gIENoYW5nZSBjb21tZW50cywgYW5kIHJlb3JkZXIgdGFibGUgdG8gbnVtZXJpYwotCW9yZGVyLiAgVXBkYXRlIGZpbmFsIHRhYmxlIGNvbW1lbnQuCi0JKE5fRFNMSU5FLCBOX0JTTElORSk6ICBSZW51bWJlciBmcm9tIDB4NjYgYW5kIDB4NjgsIHRvIDB4NDYgYW5kIDB4NDguCi0KLQkqIG9ic3RhY2suaDogIEdQTDIuICBNZXJnZS4KLQotRnJpIEF1ZyAyMyAwMTo1NDoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oLCBhLm91dC5zdW40Lmg6ICBNYWtlIFNFR01FTlRfU0laRSBhYmxlIHRvIGRlcGVuZAotCW9uIHRoZSBwYXJ0aWN1bGFyIGEub3V0IGJlaW5nIGV4YW1pbmVkLgotCSogYS5vdXQuc3VuNC5oOiAgRGVmaW5lIHNlZ21lbnQgc2l6ZXMgZm9yIFN1bi0zJ3MgYW5kIFN1bi00J3MuCi0JKiBGSVhNRTogIGEub3V0LmdudS5oIGlzIGFsbW9zdCBvYnNvbGV0ZS4KLQkqIEZJWE1FOiAgYS5vdXQuc3VuNC5oIHNob3VsZCBiZSByZW5hbWVkIGEub3V0LnN1bi5oIG5vdy4KLQotV2VkIEF1ZyAyMSAyMDozMjoxMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIFN0YXJ0IGEgQ2hhbmdlTG9nIGZvciB0aGUgaW5jbHVkZXMgZGlyZWN0b3J5LgotCi0JKiBhLm91dC5nbnUuaCAoTl9GTik6ICBGaXggdmFsdWUgLS0gd2FzIDE1LCBzaG91bGQgYmUgMHgxRS4KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIGFsbG9jYXRpb24gdGFibGUgaW4gY29tbWVudHMgYXQgZW5kLAotCXRvIHJlZmxlY3QgcmVhbGl0eSBhcyBJIGtub3cgaXQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5zaWRlY2wuaCBiL2luY2x1ZGUvYW5zaWRlY2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzMDg2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Fuc2lkZWNsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyogQU5TSSBhbmQgdHJhZGl0aW9uYWwgQyBjb21wYXRhYmlsaXR5IG1hY3JvcwotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQU5TSSBhbmQgdHJhZGl0aW9uYWwgQyBjb21wYXRpYmlsaXR5IG1hY3JvcwotCi0gICBBTlNJIEMgaXMgYXNzdW1lZCBpZiBfX1NURENfXyBpcyAjZGVmaW5lZC4KLQotICAgTWFjcm8JQU5TSSBDIGRlZmluaXRpb24JVHJhZGl0aW9uYWwgQyBkZWZpbml0aW9uCi0gICAtLS0tLQktLS0tIC0gLS0tLS0tLS0tLQktLS0tLS0tLS0tLSAtIC0tLS0tLS0tLS0KLSAgIFBUUgkJYHZvaWQgKicJCWBjaGFyIConCi0gICBMT05HX0RPVUJMRQlgbG9uZyBkb3VibGUnCQlgZG91YmxlJwotICAgVk9MQVRJTEUJYHZvbGF0aWxlJwkJYCcKLSAgIFNJR05FRAlgc2lnbmVkJwkJYCcKLSAgIFBUUkNPTlNUCWB2b2lkICpjb25zdCcJCWBjaGFyIConCi0gICBBTlNJX1BST1RPVFlQRVMgIDEJCQlub3QgZGVmaW5lZAotCi0gICBDT05TVCBpcyBhbHNvIGRlZmluZWQsIGJ1dCBpcyBvYnNvbGV0ZS4gIEp1c3QgdXNlIGNvbnN0LgotCi0gICBvYnNvbGV0ZSAtLSAgICAgREVGVU4gKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCi0KLQlEZWZpbmVzIGZ1bmN0aW9uIE5BTUUuCi0KLQlBUkdMSVNUIGxpc3RzIHRoZSBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIGVuY2xvc2VkIGluCi0JcGFyZW50aGVzZXMuICBBUkdMSVNUIGJlY29tZXMgdGhlIGFyZ3VtZW50IGxpc3QgaW4gdHJhZGl0aW9uYWwgQy4KLQotCUFSR1MgbGlzdCB0aGUgYXJndW1lbnRzIHdpdGggdGhlaXIgdHlwZXMuICBJdCBiZWNvbWVzIGEgcHJvdG90eXBlIGluCi0JQU5TSSBDLCBhbmQgdGhlIHR5cGUgZGVjbGFyYXRpb25zIGluIHRyYWRpdGlvbmFsIEMuICBBcmd1bWVudHMgc2hvdWxkCi0JYmUgc2VwYXJhdGVkIHdpdGggYEFORCcuICBGb3IgZnVuY3Rpb25zIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKLQlhcmd1bWVudHMsIHRoZSBsYXN0IHRoaW5nIGxpc3RlZCBzaG91bGQgYmUgYERPVFMnLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgREVGVU5fVk9JRCAobmFtZSkKLQotCURlZmluZXMgYSBmdW5jdGlvbiBOQU1FLCB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMuCi0KLSAgIG9ic29sZXRlIC0tICAgICBFWEZVTiAobmFtZSwgKHByb3RvdHlwZSkpCS0tIG9ic29sZXRlLgotCi0JUmVwbGFjZWQgYnkgUEFSQU1TLiAgRG8gbm90IHVzZTsgd2lsbCBkaXNhcHBlYXIgc29tZWRheSBzb29uLgotCVdhcyB1c2VkIGluIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQlJbiBBTlNJIEMgaXQgaXMgYE5BTUUgUFJPVE9UWVBFJyAoc28gUFJPVE9UWVBFIHNob3VsZCBiZSBlbmNsb3NlZCBpbgotCXBhcmVudGhlc2VzKS4gIEluIHRyYWRpdGlvbmFsIEMgaXQgaXMgYE5BTUUoKScuCi0JRm9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMsIFBST1RPVFlQRSBzaG91bGQgYmUgYCh2b2lkKScuCi0KLSAgIG9ic29sZXRlIC0tICAgICBQUk9UTyAodHlwZSwgbmFtZSwgKHByb3RvdHlwZSkgICAgLS0gb2Jzb2xldGUuCi0KLQlUaGlzIG9uZSBoYXMgYWxzbyBiZWVuIHJlcGxhY2VkIGJ5IFBBUkFNUy4gIERvIG5vdCB1c2UuCi0KLSAgIFBBUkFNUyAoKGFyZ3MpKQotCi0JV2UgY291bGQgdXNlIHRoZSBFWEZVTiBtYWNybyB0byBoYW5kbGUgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgYnV0Ci0JdGhlIG5hbWUgaXMgbWlzbGVhZGluZyBhbmQgdGhlIHJlc3VsdCBpcyB1Z2x5LiAgU28gd2UganVzdCBkZWZpbmUgYQotCXNpbXBsZSBtYWNybyB0byBoYW5kbGUgdGhlIHBhcmFtZXRlciBsaXN0cywgYXMgaW46Ci0KLQkgICAgICBzdGF0aWMgaW50IGZvbyBQQVJBTVMgKChpbnQsIGNoYXIpKTsKLQotCVRoaXMgcHJvZHVjZXM6ICBgc3RhdGljIGludCBmb28oKTsnIG9yIGBzdGF0aWMgaW50IGZvbyAoaW50LCBjaGFyKTsnCi0KLQlFWEZVTiB3b3VsZCBoYXZlIGRvbmUgaXQgbGlrZSB0aGlzOgotCi0JICAgICAgc3RhdGljIGludCBFWEZVTiAoZm9vLCAoaW50LCBjaGFyKSk7Ci0KLQlidXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBleHRlcm5hbC4uLmFuZCBpdCdzIGhhcmQgdG8gdmlzdWFsbHkgcGFyc2UKLQl0aGUgZnVuY3Rpb24gbmFtZSBvdXQgb2YgdGhlIG1lc3MuICAgRVhGVU4gc2hvdWxkIGJlIGNvbnNpZGVyZWQKLQlvYnNvbGV0ZTsgbmV3IGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlIFBBUkFNUy4KLQotICAgRE9UUyBpcyBhbHNvIG9ic29sZXRlLgotCi0gICBFeGFtcGxlczoKLQotCWV4dGVybiBpbnQgcHJpbnRmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci0qLwotCi0jaWZuZGVmCV9BTlNJREVDTF9ICi0KLSNkZWZpbmUJX0FOU0lERUNMX0gJMQotCi0KLS8qIEV2ZXJ5IHNvdXJjZSBmaWxlIGluY2x1ZGVzIHRoaXMgZmlsZSwKLSAgIHNvIHRoZXkgd2lsbCBhbGwgZ2V0IHRoZSBzd2l0Y2ggZm9yIGxpbnQuICAqLwotLyogTElOVExJQlJBUlkgKi8KLQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9BSVgpIHx8IChkZWZpbmVkIChfX21pcHMpICYmIGRlZmluZWQgKF9TWVNUWVBFX1NWUjQpKSB8fCBkZWZpbmVkKF9XSU4zMikKLS8qIEFsbCBrbm93biBBSVggY29tcGlsZXJzIGltcGxlbWVudCB0aGVzZSB0aGluZ3MgKGJ1dCBkb24ndCBhbHdheXMKLSAgIGRlZmluZSBfX1NURENfXykuICBUaGUgUklTQy9PUyBNSVBTIGNvbXBpbGVyIGRlZmluZXMgdGhlc2UgdGhpbmdzCi0gICBpbiBTVlI0IG1vZGUsIGJ1dCBkb2VzIG5vdCBkZWZpbmUgX19TVERDX18uICAqLwotCi0jZGVmaW5lCVBUUgkJdm9pZCAqCi0jZGVmaW5lCVBUUkNPTlNUCXZvaWQgKkNPTlNUCi0jZGVmaW5lCUxPTkdfRE9VQkxFCWxvbmcgZG91YmxlCi0KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lCUFORAkJLAotI2RlZmluZQlOT0FSR1MJCXZvaWQKLSNkZWZpbmUJVk9MQVRJTEUJdm9sYXRpbGUKLSNkZWZpbmUJU0lHTkVECQlzaWduZWQKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQlwYXJhbWxpc3QKLSNkZWZpbmUgQU5TSV9QUk9UT1RZUEVTCQkJMQotCi0jZGVmaW5lIFZQQVJBTVMoQVJHUykJCQlBUkdTCi0jZGVmaW5lIFZBX1NUQVJUKHZhX2xpc3QsdmFyKQkJdmFfc3RhcnQodmFfbGlzdCx2YXIpCi0KLS8qIFRoZXNlIGFyZSBvYnNvbGV0ZS4gIERvIG5vdCB1c2UuICAqLwotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUgQ09OU1QJCQkJY29uc3QKLSNkZWZpbmUgRE9UUwkJCQksIC4uLgotI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KQl0eXBlIG5hbWUgYXJnbGlzdAotI2RlZmluZSBFWEZVTihuYW1lLCBwcm90bykJCW5hbWUgcHJvdG8KLSNkZWZpbmUgREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZShhcmdzKQotI2RlZmluZSBERUZVTl9WT0lEKG5hbWUpCQluYW1lKHZvaWQpCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2Vsc2UJLyogTm90IEFOU0kgQy4gICovCi0KLSNkZWZpbmUJUFRSCQljaGFyICoKLSNkZWZpbmUJUFRSQ09OU1QJUFRSCi0jZGVmaW5lCUxPTkdfRE9VQkxFCWRvdWJsZQotCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZQlBTkQJCTsKLSNkZWZpbmUJTk9BUkdTCi0jZGVmaW5lCVZPTEFUSUxFCi0jZGVmaW5lCVNJR05FRAotI2VuZGlmIC8qICFJTl9HQ0MgKi8KLQotI2lmbmRlZiBjb25zdCAvKiBzb21lIHN5c3RlbXMgZGVmaW5lIGl0IGluIGhlYWRlciBmaWxlcyBmb3Igbm9uLWFuc2kgbW9kZSAqLwotI2RlZmluZQljb25zdAotI2VuZGlmCi0KLSNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkJCSgpCi0KLSNkZWZpbmUgVlBBUkFNUyhBUkdTKQkJCSh2YV9hbGlzdCkgdmFfZGNsCi0jZGVmaW5lIFZBX1NUQVJUKHZhX2xpc3QsdmFyKQkJdmFfc3RhcnQodmFfbGlzdCkKLQotLyogVGhlc2UgYXJlIG9ic29sZXRlLiAgRG8gbm90IHVzZS4gICovCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZSBDT05TVAotI2RlZmluZSBET1RTCi0jZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpCXR5cGUgbmFtZSAoKQotI2RlZmluZSBFWEZVTihuYW1lLCBwcm90bykJCW5hbWUoKQotI2RlZmluZSBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQluYW1lIGFyZ2xpc3QgYXJnczsKLSNkZWZpbmUgREVGVU5fVk9JRChuYW1lKQkJbmFtZSgpCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2VuZGlmCS8qIEFOU0kgQy4gICovCi0KLS8qIFVzaW5nIE1BQ1JPKHgseSkgaW4gY3BwICNpZiBjb25kaXRpb25hbHMgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUKLSAgIG9sZGVyIHByZXByb2Nlc3NvcnMuICBUaHVzIHdlIGNhbid0IGRlZmluZSBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0jZGVmaW5lIEhBVkVfR0NDX1ZFUlNJT04oTUFKT1IsIE1JTk9SKSBcCi0gIChfX0dOVUNfXyA+IChNQUpPUikgfHwgKF9fR05VQ19fID09IChNQUpPUikgJiYgX19HTlVDX01JTk9SX18gPj0gKE1JTk9SKSkpCi0KLWFuZCB0aGVuIHRlc3QgIiNpZiBIQVZFX0dDQ19WRVJTSU9OKDIsNykiLgotCi1TbyBpbnN0ZWFkIHdlIHVzZSB0aGUgbWFjcm8gYmVsb3cgYW5kIHRlc3QgaXQgYWdhaW5zdCBzcGVjaWZpYyB2YWx1ZXMuICAqLwotCi0vKiBUaGlzIG1hY3JvIHNpbXBsaWZpZXMgdGVzdGluZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBnY2MsIGFuZCBpZiBpdAotICAgaXMgb2YgYSBwYXJ0aWN1bGFyIG1pbmltdW0gdmVyc2lvbi4gKEJvdGggbWFqb3IgJiBtaW5vciBudW1iZXJzIGFyZQotICAgc2lnbmlmaWNhbnQuKSAgVGhpcyBtYWNybyB3aWxsIGV2YWx1YXRlIHRvIDAgaWYgd2UgYXJlIG5vdCB1c2luZwotICAgZ2NjIGF0IGFsbC4gICovCi0jaWZuZGVmIEdDQ19WRVJTSU9OCi0jZGVmaW5lIEdDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMDAgKyBfX0dOVUNfTUlOT1JfXykKLSNlbmRpZiAvKiBHQ0NfVkVSU0lPTiAqLwotCi0vKiBEZWZpbmUgbWFjcm9zIGZvciBzb21lIGdjYyBhdHRyaWJ1dGVzLiAgVGhpcyBwZXJtaXRzIHVzIHRvIHVzZSB0aGUKLSAgIG1hY3JvcyBmcmVlbHksIGFuZCBrbm93IHRoYXQgdGhleSB3aWxsIGNvbWUgaW50byBwbGF5IGZvciB0aGUKLSAgIHZlcnNpb24gb2YgZ2NjIGluIHdoaWNoIHRoZXkgYXJlIHN1cHBvcnRlZC4gICovCi0KLSNpZiAoR0NDX1ZFUlNJT04gPCAyMDA3KQotIyBkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQotI2VuZGlmCi0KLS8qIEF0dHJpYnV0ZSBfX21hbGxvY19fIG9uIGZ1bmN0aW9ucyB3YXMgdmFsaWQgYXMgb2YgZ2NjIDIuOTYuICovCi0jaWZuZGVmIEFUVFJJQlVURV9NQUxMT0MKLSMgaWYgKEdDQ19WRVJTSU9OID49IDIwOTYpCi0jICBkZWZpbmUgQVRUUklCVVRFX01BTExPQyBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCi0jIGVsc2UKLSMgIGRlZmluZSBBVFRSSUJVVEVfTUFMTE9DCi0jIGVuZGlmIC8qIEdOVUMgPj0gMi45NiAqLwotI2VuZGlmIC8qIEFUVFJJQlVURV9NQUxMT0MgKi8KLQotLyogQXR0cmlidXRlcyBvbiBsYWJlbHMgd2VyZSB2YWxpZCBhcyBvZiBnY2MgMi45My4gKi8KLSNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRF9MQUJFTAotIyBpZiAoR0NDX1ZFUlNJT04gPj0gMjA5MykKLSMgIGRlZmluZSBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMIEFUVFJJQlVURV9VTlVTRUQKLSMgZWxzZQotIyAgZGVmaW5lIEFUVFJJQlVURV9VTlVTRURfTEFCRUwKLSMgZW5kaWYgLyogR05VQyA+PSAyLjkzICovCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRF9MQUJFTCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9VTlVTRUQKLSNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9OT1JFVFVSTgotI2RlZmluZSBBVFRSSUJVVEVfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX05PUkVUVVJOICovCi0KLSNpZm5kZWYgQVRUUklCVVRFX1BSSU5URgotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGKG0sIG4pIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCBtLCBuKSkpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMSBBVFRSSUJVVEVfUFJJTlRGKDEsIDIpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMiBBVFRSSUJVVEVfUFJJTlRGKDIsIDMpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMyBBVFRSSUJVVEVfUFJJTlRGKDMsIDQpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfNCBBVFRSSUJVVEVfUFJJTlRGKDQsIDUpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfNSBBVFRSSUJVVEVfUFJJTlRGKDUsIDYpCi0jZW5kaWYgLyogQVRUUklCVVRFX1BSSU5URiAqLwotCi0jZW5kaWYJLyogYW5zaWRlY2wuaAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZyBiL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NDVhNWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi1Nb24gQXByICAzIDEzOjI5OjA4IDIwMDAgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgotCi0JKiBhb3V0NjQuaCAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRyk6IFdyYXAgZGVmaW5pdGlvbiBpbiAjaWZuZGVmLgotCShSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFKTogRGl0dG8uCi0JKFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKTogRGl0dG8uCi0JKFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTogRGl0dG8uCi0JKFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKTogRGl0dG8uCi0JKFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTogRGl0dG8uCi0KLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhb3V0NjQuaCAoTl9TSEFSRURfTElCKTogRGVmaW5lIGFzIDAgaWYgVEVYVF9TVEFSVF9BRERSIGlzCi0JZGVmaW5lZCBhcyAwLgotCi1TdW4gSnVuIDI4IDExOjMzOjQ4IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogc3RhYi5kZWY6ICBBZGQgTl9BTElBUyBmcm9tIFN1blBybyBGNzcuCi0KLU1vbiBNYXIgMTEgMTI6MTU6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLmRlZjogVXNlIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIHJhdGhlciB0aGFuIF9fZGVmaW5lX3N0YWIKLQlmb3IgZHVwbGljYXRlIGVudHJpZXMgTl9CUk9XUyBhbmQgTl9NT0QyLgotCSogc3RhYl9nbnUuaCAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZwotCXN0YWIuZGVmLgotCi1GcmkgT2N0IDI3IDE3OjQ3OjE2IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFvdXQ2NC5oLCBob3N0LmgsIGhwMzAwaHB1eC5oLCBzdW40Lmg6IENoYW5nZWQgUEFHRV9TSVpFIHRvCi0JVEFSR0VUX1BBR0VfU0laRS4KLQotVHVlIFNlcCAxMiAxMjowNzowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoc3RydWN0IGludGVybmFsX3N1bjRfZHluYW1pY19saW5rKTogQ2hhbmdlIGFsbCBmaWVsZHMKLQlmcm9tIGxvbmcgdG8gdW5zaWduZWQgbG9uZy4KLQotV2VkIEp1bCAxMiAwMDoxNToxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogc3VuNC5oIChQQUdFX1NJWkUpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCi0KLVRodSBKdW4gMTYgMTQ6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoQk1BR0lDKTogRGVmaW5lLgotCi1TYXQgSnVuIDExIDE2OjE2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogYW91dDY0LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOiBEZWZpbmUuCi0JKiBzdGFiLmRlZjogVXBkYXRlIHN5bWJvbCB2YWx1ZSB0YWJsZS4KLQotVGh1IEp1biAgMiAxNzoxMzozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaCAoRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpOiBDb3JyZWN0IGZyb20gMjggdG8KLQkyNC4gIEZpeCB1cCBsZF9nb3QgY29tbWVudC4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGR5bml4My5oOiAgQ2xlYW51cCwgYWRhcHQgdG8gY3VycmVudCBiZmQgdmVyc2lvbi4KLQotU2F0IEZlYiAyNiAxMDoyNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1GcmkgRmViIDExIDEyOjU2OjA0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuaCAoQVJNQUcsIEFSTUFHQiwgQVJGTUFHKTogQ2hhbmdlICdcbicgdG8gJ1wwMTInLCBmb3IgZ3JlYXRlcgotCXBvcnRhYmlsaXR5LgotCi1GcmkgSmFuIDIxIDAwOjU5OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3VuNC5oOiBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCi1GcmkgSmFuICA3IDA4OjIwOjEzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9UWFRBRERSKTogQWRkIGNvbW1lbnQgcmVnYXJkaW5nIE9NQUdJQyBhbmQgTk1BR0lDLgotCi1TYXQgRGVjIDI1IDE0OjU1OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9EQVRPRkYpOiBEb24ndCBwYWQgKHJldmVydCBjaGFuZ2Ugb2YgOCBKdWwgMTk5MykuCi0KLVR1ZSBOb3YgMTYgMTU6NDM6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBOZXcgbWFjcm9zIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgYW5kIE5fRElTS19CTE9DS19TSVpFCi0JZm9yIExpbnV4IFpNQUdJQy4KLQkoTl9UWFRPRkYsIE5fREFUT0ZGKTogVXNlIHRoZW0uCi0KLVRodSBOb3YgIDQgMDA6MzM6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpOiBGaXhlZCB2YWx1ZSB0byBtYXRjaAotCXN1bjMgc3lzdGVtOyB1c2VkIHRvIG92ZXJsYXAgb3RoZXIgZmllbGRzLgotCShSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOiBMaWtld2lzZS4KLQotV2VkIE5vdiAgMyAxMzo0ODoyNyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSk6IE1ha2UgaXQgMHgxMCAoS2VuJ3MKLQlzdWdnZXN0aW9uKSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUuCi0KLUZyaSBPY3QgMjkgMTU6MDk6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaCAoTl9TSEFSRURfTElCKTogRGVmaW5lIHRvIGJlIDAuCi0KLU1vbiBTZXAgMTMgMjE6MDA6NTYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFQX1RJTUVfT0ZGU0VUKTogIEFkZCBhbmQgZGVzY3JpYmUuCi0KLU1vbiBBdWcgMjMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggW0FSQ0hfU0laRSAhPSA2NF06IEFsbG93IE5fQkFETUFHIHRvIGJlIG92ZXJyaWRkZW4uCi0KLU1vbiBBdWcgMTYgMTQ6MzA6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWJfZ251Lmg6IEluY2x1ZGUgYW91dC9zdGFiLmRlZiBub3QganVzdCBzdGFiLmRlZi4KLQotU3VuIEp1bCAxOCAyMTo0MTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGR5bml4My5oOiBOZXcsIGZvciBzeW1tZXRyeSBydW5uaW5nIGR5bml4LgotCi1UaHUgSnVsICA4IDEyOjUyOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9CQURNQUcpOiBSZWNvZ25pemUgUU1BR0lDLgotCU5fVFhUT0ZGLCBOX1RYVEFERFIsIE5fVFhUU0laRTogU3BlY2lhbCBjb2RlIGZvciBRTUFHSUMuCi0JTl9EQVRPRkY6IFBhZCB0ZXh0IHNpemUgaWYgd2UgbmVlZCB0by4KLQotRnJpIEp1biAxOCAxOToxOTozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWYgKE5fRUNPTUwpOiBGaXggY29tbWVudC4KLQotTW9uIE1heSAzMSAwOToyMTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6IFJlbW92ZSBTb2xhcmlzIGluZm9ybWF0aW9uIG9uIE5fRlVOIHN0YWJzdHJpbmcgZ3JhbW1hcjsKLQlJJ3ZlIHRyYW5zZmVycmVkIGl0IHRvIGdkYi9kb2Mvc3RhYnMudGV4aW5mbywgd2hlcmUgaXQgYmVsb25ncy4KLQotTW9uIE1heSAxMCAwNTo0ODo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IFBhdGNoIGZyb20gR2xlbm4gRW5nZWwgZm9yIGxpbmtlciBwcm9ibGVtIGFuZAotCWNvbXBhdGliaWxpdHkgZml4OgotCShPTUFHSUMsIE5NQUdJQyk6IE5ldyBkZWZpbml0aW9ucy4KLQkoU0hBUkVNQUdJQyk6IERlbGV0ZWQuCi0JKEhQVVhfRE9UX09fTUFHSUMpOiBOZXcgbWFjcm8uCi0JKF9OX0JBRE1BRyk6IEFkanVzdGVkLgotCShOX0hFQURFUl9JTl9URVhULCBOX0RBVEFERFIpOiBOZXcgbWFjcm9zLgotCi1UaHUgQXByIDI5IDEyOjA3OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaDogTmV3IGZpbGUgZnJvbSBHbGVubiBFbmdlbCwgZ2xlbm5lQGxzaWQuaHAuY29tLgotCi1UdWUgQXByIDI3IDA1OjUxOjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoc3RydWN0IGV4dGVybmFsX2V4ZWMsICpNQUdJQywgTl9CQURNQUcpOiBEb24ndCBkZWZpbmUKLQlpZiBgZXh0ZXJuYWxfZXhlYycgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKE5fREFUT0ZGLCBOX1RSRUxPRkYsIE5fRFJFTE9GRiwgTl9TWU1PRkYsIE5fU1RST0ZGKTogRG9uJ3QgZGVmaW5lCi0JaWYgYWxyZWFkeSBkZWZpbmVkLgotCShzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QsIEVYVEVSTkFMX05MSVNUX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYKLQlgZXh0ZXJuYWxfbmxpc3QnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi1TYXQgQXVnIDE1IDA0OjIzOjAyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhZG9iZS5oOiAgQWRkIGRlc2NyaXB0aW9uIG9mIGEub3V0LmFkb2JlIGZvcm1hdC4KLQotRnJpIEp1bCAgMyAwMDozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgbW9yZSBTb2xhcmlzIGRlZmluaXRpb25zLgotCSogc3RhYl9nbnUuaDogIEFkZCBOX1NPIGxhbmd1YWdlIHR5cGVzLCBhbmQgU29sYXJpcyBiYXNpYyBmbG9hdCB0eXBlcy4KLQotU3VuIEp1biAxNCAxMDo1Mzo1MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgZGVzY3JpcHRpb25zIG9mIFNvbGFyaXMtMiBzdGFiczsgYWRkIE5fVU5ERi4KLQotVGh1IEp1biAxMSAwMToxMjowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBBZGQgTl9PQkogYW5kIE5fT1BUIGZyb20gU29sYXJpcy0yLgotCi1UaHUgSmFuIDMwIDE4OjEyOjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiBOX1RYVFNJWkUgbmVlZHMgc29tZSBtb3JlIHBhcmVudGhlc2VzLgotCUkgZG9uJ3QgdHJ1c3QgQyBwcmVjZWRlbmNlLgotCi1XZWQgRGVjIDE4IDE0OjMyOjAxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiAgTW92ZSBjb21tb24gc3Vub3Mtc3BlY2lmaWMgdGVzdAotCXRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzIGludG8gbmV3IG1hY3JvIE5fU0hBUkVEX0xJQi4KLQlVc2UgaXQgdG8gc2ltcGxpZnkmcmVmb3JtYXQgTl9UWFRBRERSLCBOX1RYVE9GRiwgTl9UWFRTSVpFLgotCi1TYXQgTm92IDMwIDIwOjM0OjUyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGFvdXQ2NC5oLCBhci5oLCBlbmNhcC5oLCBob3N0LmgsIGhwLmgsIHJhbmxpYi5oLAotCXJlbG9jLmgsIHN0YWIuZGVmLCBzdGFiX2dudS5oLCBzdW40Lmg6IEFsbCBtb3ZlZCBmcm9tIHRoZQotCWRldm8vaW5jbHVkZSBkaXJlY3RvcnkKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmggYi9pbmNsdWRlL2FvdXQvYWRvYmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZjE1Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYWRvYmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKiBgYS5vdXQuYWRvYmUnIGRpZmZlcmVuY2VzIGZyb20gc3RhbmRhcmQgYS5vdXQgZmlsZXMgKi8KLQotI2lmbmRlZiBfX0FfT1VUX0FET0JFX0hfXwotI2RlZmluZSBfX0FfT1VUX0FET0JFX0hfXwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBTdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBpcyB0aGUgc2FtZS4gICovCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBvbiBkaXNrIG9mIHRoZSAzMi1iaXQgb3IgNjQtYml0IGV4ZWMgaGVhZGVyLiAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSN1bmRlZglaTUFHSUMKLSNkZWZpbmUJWk1BR0lDCTB4QUQwQkUJCS8qIEN1dGUsIGVoPyAgKi8KLSN1bmRlZglPTUFHSUMKLSN1bmRlZglOTUFHSUMKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkgICgoeCkuYV9pbmZvICE9IFpNQUdJQykKLQotLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IHNvbWUgbWFjaGluZXMgb3ZlcnJpZGUgdGhpcwotICAgdG8gYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLwotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0jdW5kZWYgTl9TRUdTSVpFICAgLyogRklYTUVYWFhYICovCi0KLS8qIFNlZ21lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhLm91dC5BZG9iZSBmb3JtYXQgaXMgc3BlY2lmaWVkIGFmdGVyIHRoZQotICAgZmlsZSBoZWFkZXIuICBJdCBjb250YWlucyBOIHNlZ21lbnQgZGVzY3JpcHRvcnMsIGZvbGxvd2VkIGJ5IG9uZSB3aXRoCi0gICBhIHR5cGUgb2YgemVyby4gIAotCi0gICBUaGUgYWN0dWFsIHRleHQgb2YgdGhlIHNlZ21lbnRzIHN0YXJ0cyBhdCBOX1RYVE9GRiBpbiB0aGUgZmlsZSwKLSAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgb3IgaG93IGZldyBzZWdtZW50IGhlYWRlcnMgdGhlcmUgYXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGNoYXIgZV90eXBlWzFdOwotCXVuc2lnbmVkIGNoYXIgZV9zaXplWzNdOwotCXVuc2lnbmVkIGNoYXIgZV92aXJ0YmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZmlsZWJhc2VbNF07Ci19OwotCi1zdHJ1Y3QgaW50ZXJuYWxfc2VnZGVzYyB7Ci0JdW5zaWduZWQgaW50CWFfdHlwZTo4OwkvKiBTZWdtZW50IHR5cGUgTl9URVhULCBOX0RBVEEsIDAgKi8KLQl1bnNpZ25lZCBpbnQgCWFfc2l6ZToyNDsJLyogU2VnbWVudCBzaXplICovCi0JYmZkX3ZtYQkJYV92aXJ0YmFzZTsJLyogVmlydHVhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgaW50CWFfZmlsZWJhc2U7CS8qIEJhc2UgYWRkcmVzcyBpbiBvYmplY3QgZmlsZSAqLwotfTsKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCi0vKiBUaGlzIGlzIGRvY3VtZW50ZWQgdG8gYmUgYXQgMTAyNCwgYnV0IGFwcGVhcnMgdG8gcmVhbGx5IGJlIGF0IDIwNDguCi0gICBGSVhNRT8hICAqLwotI2RlZmluZSBOX1RYVE9GRih4KQkyMDQ4Ci0KLSNkZWZpbmUJTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0jZGVmaW5lIE5fREFUQUREUih4KQotCi0jZGVmaW5lIE5fQlNTQUREUih4KQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQwKLS8qIFN5bWJvbHMgKi8KLXN0cnVjdCBleHRlcm5hbF9ubGlzdCB7Ci0gIGJmZF9ieXRlIGVfc3RyeFtCWVRFU19JTl9XT1JEXTsJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICBiZmRfYnl0ZSBlX3R5cGVbMV07CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgYmZkX2J5dGUgZV9vdGhlclsxXTsJCQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIGJmZF9ieXRlIGVfZGVzY1syXTsJCQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfYnl0ZSBlX3ZhbHVlW0JZVEVTX0lOX1dPUkRdOwkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0KLXN0cnVjdCBpbnRlcm5hbF9ubGlzdCB7Ci0gIHVuc2lnbmVkIGxvbmcgbl9zdHJ4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhciBuX3R5cGU7CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhciBuX290aGVyOwkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICB1bnNpZ25lZCBzaG9ydCBuX2Rlc2M7CQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfdm1hIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0vKiBUaGUgbl90eXBlIGZpZWxkIGlzIHRoZSBzeW1ib2wgdHlwZSwgY29udGFpbmluZzogICovCi0KLSNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUyAJMgkvKiBBYnNvbHV0ZSBzeW1ib2wgLS0gZGVmaW5lZCBhdCBwYXJ0aWN1bGFyIGFkZHIgKi8KLSNkZWZpbmUgTl9URVhUIAk0CS8qIFRleHQgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHRleHQgc2VnICovCi0jZGVmaW5lIE5fREFUQSAJNgkvKiBEYXRhIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiBkYXRhIHNlZyAqLwotI2RlZmluZSBOX0JTUyAJOAkvKiBCU1MgIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB6ZXJvJ2Qgc2VnICovCi0jZGVmaW5lCU5fQ09NTQkweDEyCS8qIENvbW1vbiBzeW1ib2wgKHZpc2libGUgYWZ0ZXIgc2hhcmVkIGxpYiBkeW5saW5rKSAqLwotI2RlZmluZSBOX0ZOCTB4MWYJLyogRmlsZSBuYW1lIG9mIC5vIGZpbGUgKi8KLSNkZWZpbmUJTl9GTl9TRVEgMHgwQwkvKiBOX0ZOIGZyb20gU2VxdWVudCBjb21waWxlcnMgKHNpZ2gpICovCi0vKiBOb3RlOiBOX0VYVCBjYW4gb25seSBiZSB1c2VmdWxseSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKLSAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKLSAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLwotI2RlZmluZSBOX0VYVCAJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKGFzIG9wcG9zZWQgdG8gbG9jYWwtdG8tdGhpcy1maWxlKSAqLwotI2RlZmluZSBOX1RZUEUgIDB4MWUKLSNkZWZpbmUgTl9TVEFCIAkweGUwCS8qIElmIGFueSBvZiB0aGVzZSBiaXRzIGFyZSBvbiwgaXQncyBhIGRlYnVnIHN5bWJvbCAqLwotCi0jZGVmaW5lIE5fSU5EUiAweDBhCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCi0gICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KLSAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKLSAgIGVsZW1lbnRzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxKQkJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9pbnRlcm5hbAotewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0gICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcwotICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCi0gICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotICAgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAotICAgICBpbiBmaWxlcyB0aGUgc3ltYm9sIHRhYmxlLgotICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgotICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLSAgICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bwotICAgICBiZSB1bmRvY3VtZW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9iYXNlcmVsOjE7CS8qIExpbmthZ2UgdGFibGUgcmVsYXRpdmUgKi8KLSAgdW5zaWduZWQgaW50IHJfam1wdGFibGU6MTsJLyogcGMtcmVsYXRpdmUgdG8ganVtcCB0YWJsZSAqLwotICB1bnNpZ25lZCBpbnQgcl9yZWxhdGl2ZToxOwkvKiAicmVsYXRpdmUgcmVsb2NhdGlvbiIgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotCi0vKiBFWFRFTkRFRCBSRUxPQ1MgICovCi0KLXN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZSByX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF9ieXRlIHJfYWRkZW5kW0JZVEVTX0lOX1dPUkRdOwkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkweDFGCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJMHhGOAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2VuZGlmCQkJCS8qIF9fQV9PVVRfQURPQkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYW91dDY0LmggYi9pbmNsdWRlL2FvdXQvYW91dDY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzg0NDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qIGBhLm91dCcgb2JqZWN0LWZpbGUgZGVmaW5pdGlvbnMsIGluY2x1ZGluZyBleHRlbnNpb25zIHRvIDY0LWJpdCBmaWVsZHMgKi8KLQotI2lmbmRlZiBfX0FfT1VUXzY0X0hfXwotI2RlZmluZSBfX0FfT1VUXzY0X0hfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotI2lmbmRlZiBleHRlcm5hbF9leGVjCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIE9NQUdJQyAweDEwMDEJCS8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTAwMgkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTAwMwkJLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0KLS8qIFRoZXJlIGlzIG5vIDY0LWJpdCBRTUFHSUMgYXMgZmFyIGFzIEkga25vdy4gICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgT01BR0lDIDA0MDcJCS8qIC4uLm9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDA0MTAJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgQk1BR0lDIDA0MTUJCS8qIFVzZWQgYnkgYSBiLm91dCBvYmplY3QuICAqLwotCi0vKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4KLSAgIEl0IGlzIHVzZWQgYnkgMzg2QlNEIChhbmQgdmFyaWFudHMpIGFuZCBMaW51eCwgYXQgbGVhc3QuICAqLwotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAzMTQKLSNlbmRpZgotIyBpZm5kZWYgTl9CQURNQUcKLSMgIGRlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgXAotCQkgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gUU1BR0lDKQotIyBlbmRpZiAvKiBOX0JBRE1BRyAqLwotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgUU1BR0lDCi0jZGVmaW5lIE5fSVNfUU1BR0lDKHgpIChOX01BR0lDICh4KSA9PSBRTUFHSUMpCi0jZWxzZQotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoMCkKLSNlbmRpZgotCi0vKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRBUkdFVF9QQUdFX1NJWkUgYW5kIE5fU0VHU0laRSBpcyB0aGF0IFRBUkdFVF9QQUdFX1NJWkUgaXMKLSAgIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgYXQgd2hpY2ggeW91IGNhbiBwYWdlIHNvbWV0aGluZywgdGh1cyBpdAotICAgY29udHJvbHMgdGhlIHBhZGRpbmcgKGlmIGFueSkgYmVmb3JlIHRoZSB0ZXh0IHNlZ21lbnQgb2YgYSBaTUFHSUMKLSAgIGZpbGUuICBOX1NFR1NJWkUgaXMgdGhlIHJlc29sdXRpb24gYXQgd2hpY2ggdGhpbmdzIGNhbiBiZSBtYXJrZWQgYXMKLSAgIHJlYWQtb25seSB2ZXJzdXMgcmVhZC93cml0ZSwgc28gaXQgY29udHJvbHMgdGhlIHBhZGRpbmcgYmV0d2VlbiB0aGUKLSAgIHRleHQgc2VnbWVudCBhbmQgdGhlIGRhdGEgc2VnbWVudCAoaW4gbWVtb3J5OyBvbiBkaXNrIHRoZSBwYWRkaW5nCi0gICBiZXR3ZWVuIHRoZW0gaXMgVEFSR0VUX1BBR0VfU0laRSkuICBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgYXJlIHRoZSBzYW1lCi0gICBmb3IgbW9zdCBtYWNoaW5lcywgYnV0IGRpZmZlcmVudCBmb3Igc3VuMy4gICovCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLQotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0MCi0vKiBWaXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBUaGlzIGlzIGdldHRpbmcgdmVyeSBjb21wbGljYXRlZC4gIEEgZ29vZCByZWFzb24gdG8gZGlzY2FyZCBhLm91dCBmb3JtYXQKLSAgIGZvciBzb21ldGhpbmcgdGhhdCBzcGVjaWZpZXMgdGhlc2UgZmllbGRzIGV4cGxpY2l0bHkuICBCdXQgdGlsIHRoZW4uLi4KLQotICAgKiBPTUFHSUMgYW5kIE5NQUdJQyBmaWxlczoKLSAgICAgICAob2JqZWN0IGZpbGVzOiB0ZXh0IGZvciAicmVsb2NhdGFibGUgYWRkciAwIiByaWdodCBhZnRlciB0aGUgaGVhZGVyKQotICAgICAgIHN0YXJ0IGF0IDAsIG9mZnNldCBpcyBFWEVDX0JZVEVTX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotICAgKiBUaGUgdGV4dCBhZGRyZXNzLCBvZmZzZXQsIGFuZCBzaXplIG9mIFpNQUdJQyBmaWxlcyBkZXBlbmQKLSAgICAgb24gdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmaWxlOgotICAgICAqIGVudHJ5IHBvaW50IGJlbG93IFRFWFRfU1RBUlRfQUREUjoKLSAgICAgICAoaGFjayBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcykKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgMCwgc2l6ZSBhcyBzdGF0ZWQuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyB0cnVlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUKLSAgICAgICBjYXNlIHdoZW4gdGhlIGVudHJ5IHBvaW50IGlzIEVYRUNfQllURVNfU0laRSBvciBmdXJ0aGVyIGludG8gYSBwYWdlKToKLSAgICAgICBubyBwYWRkaW5nIGlzIG5lZWRlZDsgdGV4dCBjYW4gc3RhcnQgYWZ0ZXIgZXhlYyBoZWFkZXIuICBTdW4KLSAgICAgICBjb25zaWRlcnMgdGhlIHRleHQgc2VnbWVudCBvZiBzdWNoIGZpbGVzIHRvIGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyOwotICAgICAgIGZvciBCRkQncyBwdXJwb3Nlcywgd2UgZG9uJ3QsIHdoaWNoIG1ha2VzIG1vcmUgd29yayBmb3IgdXMuCi0gICAgICAgc3RhcnQgYXQgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLAotICAgICAgIHNpemUgYXMgc3RhdGVkIG1pbnVzIEVYRUNfQllURVNfU0laRS4KLSAgICAgKiBJZiBOX0hFQURFUl9JTl9URVhUKHgpIGlzIGZhbHNlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUgY2FzZSB3aGVuCi0gICAgICAgdGhlIGVudHJ5IHBvaW50IGlzIGxlc3MgdGhhbiBFWEVDX0JZVEVTX1NJWkUgaW50byBhIHBhZ2UgKGUuZy4gcGFnZQotICAgICAgIGFsaWduZWQpKTogKHBhZGRpbmcgaXMgbmVlZGVkIHNvIHRoYXQgdGV4dCBjYW4gc3RhcnQgYXQgYSBwYWdlIGJvdW5kYXJ5KQotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiwgb2Zmc2V0IFRBUkdFVF9QQUdFX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotCi0gICAgU3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbWF5IHdhbnQgdG8gaGFyZHdpcmUgTl9IRUFERVJfSU5fVEVYVCwKLSAgICBmb3IgZWZmaWNpZW5jeSBvciB0byBhbGxvdyBwZW9wbGUgdG8gcGxheSBnYW1lcyB3aXRoIHRoZSBlbnRyeSBwb2ludC4KLSAgICBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZCAjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgYXMgMSBmb3Igc3Vub3MsCi0gICAgYW5kIGFzIDAgZm9yIG1vc3Qgb3RoZXIgaG9zdHMgKFNvbnkgTmV3cywgVmF4IFVsdHJpeCwgZXRjKS4KLSAgICAoRG8gdGhpcyBpbiB0aGUgYXBwcm9wcmlhdGUgYmZkIHRhcmdldCBmaWxlLikKLSAgICAoVGhlIGRlZmF1bHQgaXMgYSBoZXVyaXN0aWMgdGhhdCB3aWxsIGJyZWFrIGlmIHBlb3BsZSB0cnkgY2hhbmdpbmcKLSAgICB0aGUgZW50cnkgcG9pbnQsIHBlcmhhcHMgd2l0aCB0aGUgbGQgLWUgZmxhZy4pCi0KLSAgICAqIFFNQUdJQyBpcyBhbHdheXMgbGlrZSBhIFpNQUdJQyBmb3Igd2hpY2ggTl9IRUFERVJfSU5fVEVYVCBpcyB0cnVlLAotICAgIGFuZCBmb3Igd2hpY2ggdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaXMgVEFSR0VUX1BBR0VfU0laRSAob3Igc2hvdWxkIHRoaXMgYmUKLSAgICBTRUdNRU5UX1NJWkU/KSAoVEVYVF9TVEFSVF9BRERSIG9ubHkgYXBwbGllcyB0byBaTUFHSUMsIG5vdCB0byBRTUFHSUMpLgotICAgICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDIGZpbGVzOyBRTUFHSUMgYWx3YXlzIGhhcyB0aGUgaGVhZGVyCi0gICBpbiB0aGUgdGV4dC4gICovCi0jaWZuZGVmIE5fSEVBREVSX0lOX1RFWFQKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAoKCh4KS5hX2VudHJ5ICYgKFRBUkdFVF9QQUdFX1NJWkUtMSkpID49IEVYRUNfQllURVNfU0laRSkKLSNlbmRpZgotCi0vKiBTdW4gc2hhcmVkIGxpYnJhcmllcywgbm90IGxpbnV4LiAgVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IGZvciBaTUFHSUMKLSAgIGZpbGVzLiAgKi8KLSNpZm5kZWYgTl9TSEFSRURfTElCCi0jaWYgZGVmaW5lZCAoVEVYVF9TVEFSVF9BRERSKSAmJiBURVhUX1NUQVJUX0FERFIgPT0gMAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKDApCi0jZWxzZQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0jZW5kaWYKLQotLyogUmV0dXJuaW5nIDAgbm90IFRFWFRfU1RBUlRfQUREUiBmb3IgT01BR0lDIGFuZCBOTUFHSUMgaXMgYmFzZWQgb24KLSAgIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIC5vIGZpbGUsIG5vdCBhbgotICAgZXhlY3V0YWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBPTUFHSUMgKGJ1dCBtZWFucyB3ZSBkb24ndCB3b3JrCi0gICByaWdodCBvbiB0aGUgb3V0cHV0IGZyb20gbGQgLU4pOyBtb3JlIHF1ZXN0aW9uYWJsZSBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX1RYVEFERFIKLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoLyogVGhlIGFkZHJlc3Mgb2YgYSBRTUFHSUMgZmlsZSBpcyBhbHdheXMgb25lIHBhZ2UgaW4sICovIFwKLSAgICAgLyogd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8gXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyBUQVJHRVRfUEFHRV9TSVpFICsgRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0gICAgIE5fU0hBUkVEX0xJQih4KSA/IDAgOglcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUgOgkvKiBubyBwYWRkaW5nICovXAotCSAgICBURVhUX1NUQVJUX0FERFIJCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLQotLyogSWYgTl9IRUFERVJfSU5fVEVYVCBpcyBub3QgdHJ1ZSBmb3IgWk1BR0lDLCB0aGVyZSBpcyBzb21lIHBhZGRpbmcKLSAgIHRvIG1ha2UgdGhlIHRleHQgc2VnbWVudCBzdGFydCBhdCBhIGNlcnRhaW4gYm91bmRhcnkuICBGb3IgbW9zdAotICAgc3lzdGVtcywgdGhpcyBib3VuZGFyeSBpcyBUQVJHRVRfUEFHRV9TSVpFLiAgQnV0IGZvciBMaW51eCwgaW4gdGhlCi0gICB0aW1lLWhvbm9yZWQgdHJhZGl0aW9uIG9mIGNyYXp5IFpNQUdJQyBoYWNrcywgaXQgaXMgMTAyNCB3aGljaCBpcwotICAgbm90IHdoYXQgVEFSR0VUX1BBR0VfU0laRSBuZWVkcyB0byBiZSBmb3IgUU1BR0lDLiAgKi8KLQotI2lmbmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNkZWZpbmUgTl9ESVNLX0JMT0NLX1NJWkUoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBaTUFHSUNfRElTS19CTE9DS19TSVpFIDogVEFSR0VUX1BBR0VfU0laRSkKLQotLyogT2Zmc2V0IGluIGFuIGEub3V0IG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAqLwotI2lmbmRlZiBOX1RYVE9GRgotI2RlZmluZSBOX1RYVE9GRih4KQlcCi0gICAgKC8qIEZvciB7TyxOLFF9TUFHSUMsIG5vIHBhZGRpbmcuICAqLyBcCi0gICAgIE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDogXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpID8JXAotCSAgICBFWEVDX0JZVEVTX1NJWkUgOgkJCS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogU2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgSXQncyBhbHdheXMgYXMgc3RhdGVkLCBleGNlcHQgdGhhdCB3ZQotICAgb2Zmc2V0IGl0IHRvIGB1bmRvJyB0aGUgYWRqdXN0bWVudCB0byBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGCi0gICBmb3IgWk1BR0lDIGZpbGVzIHRoYXQgbm9taW5hbGx5IGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyCi0gICBhcyBwYXJ0IG9mIHRoZSBmaXJzdCBwYWdlIG9mIHRleHQuICAoQkZEIGRvZXNuJ3QgY29uc2lkZXIgdGhlCi0gICBleGVjIGhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuKSAgKi8KLSNpZm5kZWYgTl9UWFRTSVpFCi0jZGVmaW5lCU5fVFhUU0laRSh4KSBcCi0gICAgKC8qIEZvciBRTUFHSUMsIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBoZWFkZXIgcGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi9cCi0gICAgIE5fSVNfUU1BR0lDICh4KSA/ICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkUgOiBcCi0gICAgIChOX01BR0lDKHgpICE9IFpNQUdJQyB8fCBOX1NIQVJFRF9MSUIoeCkpID8gKHgpLmFfdGV4dCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSAgPwlcCi0JICAgICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkU6CS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgICh4KS5hX3RleHQJCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGluIHZpcnR1YWwgbWVtb3J5LgotICAgSXQgaXMgdGhlIHRleHQgc2VnbWVudCBhZGRyZXNzLCBwbHVzIHRleHQgc2VnbWVudCBzaXplLCByb3VuZGVkCi0gICB1cCB0byBhIE5fU0VHU0laRSBib3VuZGFyeSBmb3IgcHVyZSBvciBwYWdlYWJsZSBmaWxlcy4gKi8KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpIFwKLSAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KS0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCi0jZW5kaWYKLS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBCU1Mgc2VnbWVudCAtLSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGF0YSBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0JTU0FERFIoeCkJKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0KLS8qIE9mZnNldHMgb2YgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGZpbGUgYWZ0ZXIgdGhlIHRleHQgc2VnbWVudC4gICovCi0KLS8qIEZvciB7USxafU1BR0lDLCB0aGVyZSBpcyBwYWRkaW5nIHRvIG1ha2UgdGhlIGRhdGEgc2VnbWVudCBzdGFydCBvbgotICAgYSBwYWdlIGJvdW5kYXJ5LiAgTW9zdCBvZiB0aGUgdGltZSB0aGUgYV90ZXh0IGZpZWxkIChhbmQgdGh1cwotICAgTl9UWFRTSVpFKSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgcGFkZGluZy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgZm9yCi0gICBCU0RJIGFuZC9vciAzODZCU0QgaXQgc29tZXRpbWVzIGRvZXNuJ3QgY29udGFpbiB0aGUgcGFkZGluZywgYW5kCi0gICBwZXJoYXBzIHdlIHNob3VsZCBiZSBhZGRpbmcgaXQgaGVyZS4gIEJ1dCB0aGlzIHNlZW1zIGtpbmQgb2YKLSAgIHF1ZXN0aW9uYWJsZSBhbmQgcHJvYmFibHkgc2hvdWxkIGJlIEJTREkvMzg2QlNELXNwZWNpZmljIGlmIHdlIGRvCi0gICBkbyBpdC4KLQotICAgRm9yIE5NQUdJQyAoYXQgbGVhc3QgZm9yIGhwMzAwIEJTRCwgcHJvYmFibHkgb3RoZXJzKSwgdGhlcmUgaXMKLSAgIHBhZGRpbmcgaW4gbWVtb3J5IG9ubHksIG5vdCBvbiBkaXNrLCBzbyB3ZSBtdXN0ICpub3QqIGV2ZXIgcGFkIGhlcmUKLSAgIGZvciBOTUFHSUMuICAqLwotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpIFwKLSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1RSRUxPRkYKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNlbmRpZgotI2lmbmRlZiBOX0RSRUxPRkYKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNlbmRpZgotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TVFJPRkYKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2VuZGlmCi0MCi0vKiBTeW1ib2xzICovCi0jaWZuZGVmIGV4dGVybmFsX25saXN0Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIChCWVRFU19JTl9XT1JEKzQrQllURVNfSU5fV09SRCkKLSNlbmRpZgotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCi0gICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cwotICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQotICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKLSAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KLSNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLwotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUJcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCSgodW5zaWduZWQgaW50KSAweDYwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwNikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHgxMCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwOCkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCSgodW5zaWduZWQgaW50KSAweDA0KQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MjApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCSgodW5zaWduZWQgaW50KSAweDAyKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4NDApCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jaWZuZGVmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNlbmRpZgotCi0jaWZuZGVmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLSNlbmRpZgotCi0jaWZuZGVmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgxRikKLSNlbmRpZgotCi0jaWZuZGVmIFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNlbmRpZgotCi0jaWZuZGVmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweEY4KQotI2VuZGlmCi0KLSNpZm5kZWYgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotI2VuZGlmCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIC8qIEFsbCB0aGUgbmV3IG9uZXMgSSBjYW4gdGhpbmsgb2YsIGZvciBzcGFyYyB2OSAqLwotCi0gIFJFTE9DXzY0LAkJCS8qIGRhdGFbMDo2M10gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DX0RJU1A2NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfV0RJU1AyMSwJCS8qIGRhdGFbMDoyMF0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0RJU1AyMSwJCQkvKiBkYXRhWzA6MjBdID0gYWRkZW5kIC0gcGMgKyBzdiAgICAgICAgKi8KLSAgUkVMT0NfRElTUDE0LAkJCS8qIGRhdGFbMDoxM10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBRIC4KLSAgICAgV2hhdCBhcmUgdGhlIG90aGVyIG9uZXMsCi0gICAgIFNpbmNlIHRoaXMgaXMgYSBjbGVhbiBzbGF0ZSwgY2FuIHdlIHRocm93IGF3YXkgdGhlIG9uZXMgd2UgZG9udAotICAgICB1bmRlcnN0YW5kID8gU2hvdWxkIHdlIHNvcnQgdGhlIHZhbHVlcyA/IFdoYXQgYWJvdXQgdXNpbmcgYQotICAgICBtaWNyb2NvZGUgZm9ybWF0IGxpa2UgdGhlIDY4ayA/Ci0gICAgICovCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotLyogUS4KLSAgIFNob3VsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgYmUgNCBieXRlcyBvciA4IGJ5dGVzID8KLQotICAgUS4KLSAgIFdoYXQgYWJvdXQgYXJjaGl2ZSBpbmRleGVzID8KLQotICovCi0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUXzY0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FyLmggYi9pbmNsdWRlL2FvdXQvYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZGNkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2hpdmUgZmlsZSBkZWZpbml0aW9uIGZvciBHTlUgc29mdHdhcmUgKi8KLQotLyogU28gZmFyIHRoaXMgaXMgY29ycmVjdCBmb3IgQlNEaXNoIGFyY2hpdmVzLiAgRG9uJ3QgZm9yZ2V0IHRoYXQKLSAgIGZpbGVzIG11c3QgYmVnaW4gb24gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LiAqLwotCi0jaWZuZGVmIF9fR05VX0FSX0hfXwotI2RlZmluZSBfX0dOVV9BUl9IX18KLQotLyogTm90ZSB0aGF0IHRoZSB1c3VhbCAnXG4nIGluIG1hZ2ljIHN0cmluZ3MgbWF5IHRyYW5zbGF0ZSB0byBkaWZmZXJlbnQKLSAgIGNoYXJhY3RlcnMsIGFzIGFsbG93ZWQgYnkgQU5TSS4gICdcMDEyJyBoYXMgYSBmaXhlZCB2YWx1ZSwgYW5kIHJlbWFpbnMKLSAgIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBCU0Rpc2ggYXJjaGl2ZXMuICovCi0KLSNkZWZpbmUgQVJNQUcgICIhPGFyY2g+XDAxMiIJLyogRm9yIENPRkYgYW5kIGEub3V0IGFyY2hpdmVzICovCi0jZGVmaW5lIEFSTUFHQiAiITxib3V0PlwwMTIiCS8qIEZvciBiLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBTQVJNQUcgOAotI2RlZmluZSBBUkZNQUcgImBcMDEyIgotCi0vKiBUaGUgYXJfZGF0ZSBmaWVsZCBvZiB0aGUgYXJtYXAgKF9fLlNZTURFRikgbWVtYmVyIG9mIGFuIGFyY2hpdmUKLSAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRpcmUgZmlsZSwgb3IgCi0gICBCU0QtZGVyaXZlZCBsaW5rZXJzIGNvbXBsYWluLiAgV2Ugb3JpZ2luYWxseSB3cml0ZSB0aGUgYXJfZGF0ZSB3aXRoCi0gICB0aGlzIG9mZnNldCBmcm9tIHRoZSByZWFsIGZpbGUncyBtb2QtdGltZS4gIEFmdGVyIGZpbmlzaGluZyB0aGUKLSAgIGZpbGUsIHdlIHJld3JpdGUgYXJfZGF0ZSBpZiBpdCdzIG5vdCBzdGlsbCBncmVhdGVyIHRoYW4gdGhlIG1vZCBkYXRlLiAgKi8KLQotI2RlZmluZSBBUk1BUF9USU1FX09GRlNFVCAgICAgICA2MAotCi1zdHJ1Y3QgYXJfaGRyIHsKLSAgY2hhciBhcl9uYW1lWzE2XTsJCS8qIG5hbWUgb2YgdGhpcyBtZW1iZXIgKi8KLSAgY2hhciBhcl9kYXRlWzEyXTsJCS8qIGZpbGUgbXRpbWUgKi8KLSAgY2hhciBhcl91aWRbNl07CQkvKiBvd25lciB1aWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2dpZFs2XTsJCS8qIG93bmVyIGdpZDsgcHJpbnRlZCBhcyBkZWNpbWFsICovCi0gIGNoYXIgYXJfbW9kZVs4XTsJCS8qIGZpbGUgbW9kZSwgcHJpbnRlZCBhcyBvY3RhbCAgICovCi0gIGNoYXIgYXJfc2l6ZVsxMF07CQkvKiBmaWxlIHNpemUsIHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2ZtYWdbMl07CQkvKiBzaG91bGQgY29udGFpbiBBUkZNQUcgKi8KLX07Ci0KLSNlbmRpZiAvKiBfX0dOVV9BUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9keW5peDMuaCBiL2luY2x1ZGUvYW91dC9keW5peDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlZWViZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvZHluaXgzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogYS5vdXQgc3BlY2lmaWNzIGZvciBTZXF1ZW50IFN5bW1ldHJ5IHJ1bm5pbmcgRHluaXggMy54Ci0gKi8KLSNpZm5kZWYgQV9PVVRfRFlOSVgzX0gKLSNkZWZpbmUgQV9PVVRfRFlOSVgzX0gKLQotI2RlZmluZSBleHRlcm5hbF9leGVjIGR5bml4X2V4dGVybmFsX2V4ZWMKLQotLyogc3RydWN0IGV4ZWMgZm9yIER5bml4IDMKLSAqCi0gKiBhX2dkdGJsIGFuZCBhX2Jvb3RzdHJhcCBhcmUgb25seSBmb3Igc3RhbmRhbG9uZSBiaW5hcmllcy4KLSAqIFNoYXJlZCBkYXRhIGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGFzIG9mIER5bml4IDMuMSwKLSAqIGJ1dCBhcmUgc3VwcG9ydGVkIGJ5IER5bml4IGNvbXBpbGVyIHByb2dyYW1zLgotICovCi1zdHJ1Y3QgZHluaXhfZXh0ZXJuYWxfZXhlYyB7Ci0JdW5zaWduZWQgY2hhciBlX2luZm9bNF07Ci0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07Ci0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07Ci0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9nX2NvZGVbOF0sIGVfZ19kYXRhWzhdLCBlX2dfZGVzY1s4XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9zaGJzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkcnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jvb3RzdHJhcFs0NF07Ci0JdW5zaWduZWQgY2hhciBlX3Jlc2VydmVkWzEyXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmVyc2lvbls0XTsKLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSgxMjgpCi0KLS8qCi0gKiBBbGwgZXhlY3V0YWJsZXMgdW5kZXIgRHluaXggYXJlIGRlbWFuZCBwYWdlZCB3aXRoIHJlYWQtb25seSB0ZXh0LAotICogVGh1cyBubyBOTUFHSUMuCi0gKgotICogWk1BR0lDIGhhcyBhIHBhZ2Ugb2YgMHMgYXQgdmlydHVhbCAwLAotICogWE1BR0lDIGhhcyBhbiBpbnZhbGlkIHBhZ2UgYXQgdmlydHVhbCAwCi0gKi8KLSNkZWZpbmUgT01BR0lDCTB4MTJlYgkJLyogLm8gKi8KLSNkZWZpbmUgWk1BR0lDCTB4MjJlYgkJLyogemVybyBAIDAsIGRlbWFuZCBsb2FkICovCi0jZGVmaW5lIFhNQUdJQwkweDMyZWIJCS8qIGludmFsaWQgQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBTTUFHSUMJMHg0MmViCQkvKiBzdGFuZGFsb25lLCBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KLQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKE9NQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFpNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFhNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFNNQUdJQyAhPSBOX01BR0lDKHgpKSkKLQotI2RlZmluZSBOX0FERFJBREooeCkgKChaTUFHSUMgPT0gTl9NQUdJQyh4KSB8fCBYTUFHSUMgPT0gTl9NQUdJQyh4KSkgPyAweDEwMDAgOiAwKQotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIChFWEVDX0JZVEVTX1NJWkUpCi0jZGVmaW5lIE5fREFUT0ZGKHgpIChOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSkKLSNkZWZpbmUgTl9TSERBVE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1RSRUxPRkYoeCkgKE5fU0hEQVRPRkYoeCkgKyAoeCkuYV9zaGRhdGEpCi0jZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX1NIRFJFTE9GRih4KSAoTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotI2RlZmluZSBOX1NZTU9GRih4KSAoTl9TSERSRUxPRkYoeCkgKyAoeCkuYV9zaGRyc2l6ZSkKLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcykKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/IDAgXAotCSA6IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/ICgoeCkuYV90ZXh0KSBcCi0JIDogKCh4KS5hX3RleHQgLSBOX0FERFJBREooeCkgLSBFWEVDX0JZVEVTX1NJWkUpKQotCi0jZW5kaWYgLyogQV9PVVRfRFlOSVgzX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9lbmNhcC5oIGIvaW5jbHVkZS9hb3V0L2VuY2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTVkNDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2VuY2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogWWV0IEFub3RoZXIgVHJ5IGF0IGVuY2Fwc3VsYXRpbmcgYnNkIG9iamVjdCBmaWxlcyBpbiBjb2ZmLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYWNlIFdpbGxpc3NvbiAxMi85Lzg4Ci0KLSAgIFRoaXMgZmlsZSBpcyBvYnNvbGV0ZS4gIEl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBqdXN0IGRlZmluZSBhIGJ1bmNoCi0gICBvZiBzdHVmZiB0aGF0IEJGRCBjYW4gdXNlIHRvIGRvIGNvZmYtZW5jYXBzdWxhdGVkIGZpbGVzLiAgLS1nbnVAY3lnbnVzLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogV2Ugb25seSB1c2UgdGhlIGNvZmYgaGVhZGVycyB0byB0ZWxsIHRoZSBrZXJuZWwKLSAqIGhvdyB0byBleGVjIHRoZSBmaWxlLiAgVGhlcmVmb3JlLCB0aGUgb25seSBmaWVsZHMgdGhhdCBuZWVkIHRvIAotICogYmUgZmlsbGVkIGluIGFyZSB0aGUgc2NucHRyIGFuZCB2YWRkciBmb3IgdGhlIHRleHQgYW5kIGRhdGEKLSAqIHNlY3Rpb25zLCBhbmQgdGhlIHZhZGRyIGZvciB0aGUgYnNzLiAgQXMgZmFyIGFzIGNvZmYgaXMgY29uY2VybmVkLAotICogdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLCByZWxvY2F0aW9uLCBvciBsaW5lIG51bWJlcnMuCi0gKgotICogQSBub3JtYWwgYnNkIGhlYWRlciAoc3RydWN0IGV4ZWMpIGlzIHBsYWNlZCBhZnRlciB0aGUgY29mZiBoZWFkZXJzLAotICogYW5kIGJlZm9yZSB0aGUgcmVhbCB0ZXh0LiAgSSBkZWZpbmVkIGEgdGhlIG5ldyBmaWVsZHMgJ2FfbWFjaHR5cGUnCi0gKiBhbmQgYV9mbGFncy4gIElmIGFfbWFjaHR5cGUgaXMgTV8zODYsIGFuZCBhX2ZsYWdzICYgQV9FTkNBUCBpcwotICogdHJ1ZSwgdGhlbiB0aGUgYnNkIGhlYWRlciBpcyBwcmVjZWVkZWQgYnkgYSBjb2ZmIGhlYWRlci4gIE1hY3JvcwotICogbGlrZSBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIHVzZSB0aGlzIGZpZWxkIHRvIGZpbmQgdGhlIGJzZCBoZWFkZXIuCi0gKiAKLSAqIFRoZSBvbmx5IHByb2JsZW0gaXMgdG8gdHJhY2sgZG93biB0aGUgYnNkIGV4ZWMgaGVhZGVyLiAgVGhlCi0gKiBtYWNyb3MgSEVBREVSX09GRlNFVCwgZXRjIGRvIHRoaXMuCi0gKi8KLQotI2RlZmluZSBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUgMHgyMCAvKiBjb2ZmIGhlYWRlciBwcmVjZWRlcyBic2QgaGVhZGVyICovCi0KLS8qIERlc2NyaWJlIHRoZSBDT0ZGIGhlYWRlciB1c2VkIGZvciBlbmNhcHN1bGF0aW9uLiAgKi8KLQotc3RydWN0IGNvZmZoZWFkZXIKLXsKLSAgLyogZmlsZWhkciAqLwotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwotICBsb25nIGZfdGltZGF0OwotICBsb25nIGZfc3ltcHRyOwotICBsb25nIGZfbnN5bXM7Ci0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwotICAvKiBhb3V0aGRyICovCi0gIHNob3J0IG1hZ2ljOwotICBzaG9ydCB2c3RhbXA7Ci0gIGxvbmcgdHNpemU7Ci0gIGxvbmcgZHNpemU7Ci0gIGxvbmcgYnNpemU7Ci0gIGxvbmcgZW50cnk7Ci0gIGxvbmcgdGV4dF9zdGFydDsKLSAgbG9uZyBkYXRhX3N0YXJ0OwotICBzdHJ1Y3QgY29mZnNjbgotICAgIHsKLSAgICAgIGNoYXIgc19uYW1lWzhdOwotICAgICAgbG9uZyBzX3BhZGRyOwotICAgICAgbG9uZyBzX3ZhZGRyOwotICAgICAgbG9uZyBzX3NpemU7Ci0gICAgICBsb25nIHNfc2NucHRyOwotICAgICAgbG9uZyBzX3JlbHB0cjsKLSAgICAgIGxvbmcgc19sbm5vcHRyOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBzX25sbm5vOwotICAgICAgbG9uZyBzX2ZsYWdzOwotICAgIH0gc2Nuc1szXTsKLX07Ci0MCi0vKiBEZXNjcmliZSBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNhcHN1bGF0aW9uLAotICAgaW5jbHVkaW5nIGhvdyB0byBmaW5kIHRoZSBlbmNhcHN1bGF0ZWQgQlNEIGhlYWRlci4gICovCi0KLS8qIEZJWE1FLCB0aGlzIGlzIGR1bWIuICBUaGUgc2FtZSB0b29scyBjYW4ndCBoYW5kbGUgYS5vdXRzIGZvciBkaWZmZXJlbnQKLSAgIGFyY2hpdGVjdHVyZXMsIGp1c3QgYmVjYXVzZSBDT0ZGX01BR0lDIGlzIGRpZmZlcmVudDsgc28geW91IG5lZWQgYQotICAgc2VwYXJhdGUgR05VIG5tIGZvciBldmVyeSBhcmNoaXRlY3R1cmUhIT8gIFVuZm9ydHVuYXRlbHksIGl0IG5lZWRzIHRvCi0gICBiZSB0aGlzIHdheSwgc2luY2UgdGhlIENPRkZfTUFHSUMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUga2VybmVsCi0gICB3ZSdyZSB0cnlpbmcgdG8gZm9vbCBoZXJlLiAgKi8KLSAgIAotI2RlZmluZSBDT0ZGX01BR0lDX0kzODYgMDUxNCAvKiBJMzg2TUFHSUMgKi8KLSNkZWZpbmUgQ09GRl9NQUdJQ19NNjhLIDA1MjAgLyogTUM2OE1BR0lDICovCi0jZGVmaW5lCUNPRkZfTUFHSUNfQTI5SyAweDE3QQkvKiBVc2VkIGJ5IGFzbTI5ayBjcm9zcy10b29scyAqLwotCi0jaWZkZWYgQ09GRl9NQUdJQwotc2hvcnQgX19oZWFkZXJfb2Zmc2V0X3RlbXA7Ci0jZGVmaW5lIEhFQURFUl9PRkZTRVQoZikgXAotCShfX2hlYWRlcl9vZmZzZXRfdGVtcCA9IDAsIFwKLQkgZnJlYWQgKChjaGFyICopJl9faGVhZGVyX29mZnNldF90ZW1wLCBzaXplb2YgKHNob3J0KSwgMSwgKGYpKSwgXAotCSBmc2VlayAoKGYpLCAtc2l6ZW9mIChzaG9ydCksIDEpLCBcCi0JIF9faGVhZGVyX29mZnNldF90ZW1wPT1DT0ZGX01BR0lDID8gc2l6ZW9mKHN0cnVjdCBjb2ZmaGVhZGVyKSA6IDApCi0jZWxzZQotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIDAKLSNlbmRpZgotCi0jZGVmaW5lIEhFQURFUl9TRUVLKGYpIChmc2VlayAoKGYpLCBIRUFERVJfT0ZGU0VUKChmKSksIDEpKQotDAotLyogRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgQlNEIGhlYWRlcgotICAgdGhhdCBhcHBlYXJzIGluc2lkZSB0aGUgZW5jYXBzdWxhdGlvbi4gICovCi0KLS8qIEVuY2Fwc3VsYXRlZCBjb2ZmIGZpbGVzIHRoYXQgYXJlIGxpbmtlZCBaTUFHSUMgaGF2ZSBhIHRleHQgc2VnbWVudAotICAgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyIChhbmQgYSBtYXRjaGluZyBUWFRBRERSKSwgZXhjbHVkaW5nCi0gICB0aGUgaGVhZGVycyBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQgcHJvcGVyIGJ1dCBrZWVwaW5nIHRoZSBwaHlzaWNhbAotICAgbGF5b3V0IGFuZCB0aGUgdmlydHVhbCBtZW1vcnkgbGF5b3V0IHBhZ2UtYWxpZ25lZC4KLQotICAgTm9uLWVuY2Fwc3VsYXRlZCBhLm91dCBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0Ci0gICBzZWdtZW50IHRoYXQgc3RhcnRzIGF0IDAgYW5kIGFuIE5fVFhUQURSIHNpbWlsYXJseSBvZmZzZXQgdG8gMC4KLSAgIFRoZXkgdG9vIGFyZSBwYWdlLWFsaWduZWQgd2l0aCBlYWNoIG90aGVyLCBidXQgdGhleSBpbmNsdWRlIHRoZQotICAgYS5vdXQgaGVhZGVyIGFzIHBhcnQgb2YgdGhlIHRleHQuIAotCi0gICBUaGUgX05fSERST0ZGIGdldHMgc2l6ZW9mIHN0cnVjdCBleGVjIGFkZGVkIHRvIGl0LCBzbyB3ZSBoYXZlCi0gICB0byBjb21wZW5zYXRlIGhlcmUuICBTZWUgPGEub3V0LmdudS5oPi4gICovCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSN1bmRlZiBOX1RYVEFERFIKLSN1bmRlZiBOX0RBVEFERFIKLQotI2RlZmluZSBfTl9IRFJPRkYoeCkgKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotCi0vKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDogMCkKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0KLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSAoU0VHTUVOVF9TSVpFICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkgOiBcCi0JIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaG9zdC5oIGIvaW5jbHVkZS9hb3V0L2hvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNjIxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogUGFyYW1ldGVycyBhYm91dCB0aGUgYS5vdXQgZm9ybWF0LCBiYXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0gb24gd2hpY2gKLSAgIHRoZSBwcm9ncmFtIGlzIGNvbXBpbGVkLiAgKi8KLQotLyogQWRkcmVzcyBvZiBkYXRhIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4KLSAgIEl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCi0gICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLwotI2lmbmRlZiBTRUdNRU5UX1NJWkUKLSNpZiBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQotI2VuZGlmCi0jaWZkZWYJc29ueQotI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgxMDAwCi0jZW5kaWYJLyogU29ueS4gICovCi0jaWZkZWYgaXM2OGsKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKLSNlbmRpZgotI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg0MDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotI2VuZGlmIC8qIWRlZmluZWQoU0VHTUVOVF9TSVpFKSovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocC5oIGIvaW5jbHVkZS9hb3V0L2hwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmY0OWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBTcGVjaWFsIHZlcnNpb24gb2YgPGEub3V0Lmg+IGZvciB1c2UgdW5kZXIgaHAtdXguCi0gICBDb3B5cmlnaHQgMTk4OCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBGSUxFIElTIE9CU09MRVRFLiAgSXQgbmVlZHMgdG8gYmUgcmV2aXNlZCBhcyBhIHZhcmlhbnQgImV4dGVybmFsIgotICAgYS5vdXQgZm9ybWF0IGZvciB1c2Ugd2l0aCBCRkQuICAqLwotCi0vKiBUaGUgYGV4ZWMnIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCBsYXlvdXQgbXVzdCBiZSBjbG9zZSB0byBIUCdzIHdoZW4KLSAgIHdlIGFyZSBydW5uaW5nIG9uIGFuIEhQIHN5c3RlbSwgb3RoZXJ3aXNlIHdlIHdpbGwgbm90IGJlIGFibGUgdG8KLSAgIGV4ZWN1dGUgdGhlIHJlc3VsdGluZyBmaWxlLiAqLwotCi0vKiBBbGxvdyB0aGlzIGZpbGUgdG8gYmUgaW5jbHVkZWQgdHdpY2UuICovCi0jaWZuZGVmIF9fR05VX0VYRUNfTUFDUk9TX18KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgc2hvcnQgYV9tYWNodHlwZTsJLyogbWFjaGluZSB0eXBlICovCi0gIHVuc2lnbmVkIHNob3J0IGFfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUxOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUyOwotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwkvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwkvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTU7CS8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwkvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNzsJLyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTg7Ci19OwotCi0vKiBUZWxsIGEub3V0LmdudS5oIG5vdCB0byBkZWZpbmUgYHN0cnVjdCBleGVjJy4gICovCi0jZGVmaW5lIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0jaW5jbHVkZSAiLi4vYS5vdXQuZ251LmgiCi0KLSN1bmRlZiBOX01BR0lDCi0jdW5kZWYgTl9NQUNIVFlQRQotI3VuZGVmIE5fRkxBR1MKLSN1bmRlZiBOX1NFVF9JTkZPCi0jdW5kZWYgTl9TRVRfTUFHSUMKLSN1bmRlZiBOX1NFVF9NQUNIVFlQRQotI3VuZGVmIE5fU0VUX0ZMQUdTCi0KLSNkZWZpbmUgTl9NQUdJQyhleGVjKSAoKGV4ZWMpIC4gYV9tYWdpYykKLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGV4ZWMpIC4gYV9tYWNodHlwZSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpICgoKGV4ZWMpIC4gYV9tYWdpYykgPSAobWFnaWMpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgKCgoZXhlYykgLiBhX21hY2h0eXBlKSA9IChtYWNodHlwZSkpCi0KLSN1bmRlZiBOX0JBRE1BRwotI2RlZmluZSBOX0JBRE1BRyh4KSAoKF9OX0JBRE1BRyAoeCkpIHx8IChfTl9CQURNQUNIICh4KSkpCi0KLSNkZWZpbmUgX05fQkFETUFDSCh4KQkJCQkJCQlcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYJCQkJCVwKLSAoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDk4eDZfSUQpKQotCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLQotI2VuZGlmIC8qIF9fR05VX0VYRUNfTUFDUk9TX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaCBiL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTE5Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IChDKSAxOTg4LDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCi0KLXN0cnVjdCBocDMwMGhwdXhfZXhlY19ieXRlcwotewotICB1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMVs0XTsKLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMls0XTsKLSAgdW5zaWduZWQgY2hhciBlX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzKi8KLSAgdW5zaWduZWQgY2hhciBlX3Bhc3NpemVbNF07LyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07ICAgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3Vwc2l6ZVs0XTsvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2RyZWxvY3NbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07IC8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVuc2lvbiAqLwotfTsKLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCTY0Ci0KLXN0cnVjdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgZV92YWx1ZVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfbGVuZ3RoWzFdOwkvKiBsZW5ndGggb2YgYXNjaWkgc3ltYm9sIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfYWxtb2RbMl07CS8qIGFsaWdubWVudCBtb2QgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfc2hsaWJbMl07ICAgLyogaW5mbyBhYm91dCBkeW5hbWljIGxpbmtpbmcgKi8KLSAgfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAxMAotCi1zdHJ1Y3QgaHAzMDBocHV4X3JlbG9jCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFsyXTsgIC8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOyAgIC8qIHJlbG9jYXRpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9sZW5ndGhbMV07IC8qIGxlbmd0aCBvZiBpdGVtIHRvIHJlbG9jICAgICAgICAgICAgICAqLwotICB9OwotCi1zdHJ1Y3QgaHAzMDBocHV4X2hlYWRlcl9leHRlbnNpb24KLXsKLSAgICB1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHVuaXF1ZV9oZWFkZXJzWzEyKjRdOwotICAgIHVuc2lnbmVkIGNoYXIgZV9oZWFkZXJbMl07ICAgLyogdHlwZSBvZiBoZWFkZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfdmVyc2lvblsyXTsgIC8qIHZlcnNpb24gICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NpemVbNF07ICAgICAvKiBieXRlcyBmb2xsb3dpbmcqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07LyogZmlsZSBvZmZzZXQgb2YgbmV4dCBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lIEVYVEVSTkFMX0VYVEVOU0lPTl9IRUFERVJfU0laRSAoMTYqNCkKLQotLyogaHB1eCBzZXBhcmF0ZXMgb2JqZWN0IGZpbGVzICgweDEwNikgYW5kIGltcHVyZSBleGVjdXRhYmxlcyAoMHgxMDcpICAqLwotLyogYnV0IHRoZSBiZmQgY29kZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uIFNpbmNlIHdlIHdhbnQgdG8qLwotLyogcmVhZCBocHV4IC5vIGZpbGVzLCB3ZSBhZGQgYW4gc3BlY2lhbCBkZWZpbmUgYW5kIHVzZSBpdCBiZWxvdyBpbiAgICAqLwotLyogb2Zmc2V0IGFuZCBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEhQVVhfRE9UX09fTUFHSUMgMHgxMDYKLSNkZWZpbmUgT01BR0lDIDB4MTA3ICAgICAgIC8qIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTA4ICAgICAgIC8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTBCICAgICAgIC8qIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgICAgICAgICAgKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLQotI2lmIDAgLyogbGliYW91dC5oIG9ubHkgdXNlcyB0aGUgbG93ZXIgOCBiaXRzICovCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0jZW5kaWYKLSNkZWZpbmUgSFA5OHg2X0lEIDB4MEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDBDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKChOX01BR0lDKHgpPT1PTUFHSUMgfHwgTl9NQUdJQyh4KT09SFBVWF9ET1RfT19NQUdJQykgPyBcCi0gICAgICAgIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBfTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBIUFVYX0RPVF9PX01BR0lDIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyApCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jdW5kZWYgTl9EQVRPRkYKLSN1bmRlZiBOX1BBU09GRgotI3VuZGVmIE5fU1lNT0ZGCi0jdW5kZWYgTl9TVVBPRkYKLSN1bmRlZiBOX1RSRUxPRkYKLSN1bmRlZiBOX0RSRUxPRkYKLSN1bmRlZiBOX1NUUk9GRgotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1BBU09GRih4KSAgICAgKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9QQVNPRkYoeCkgICAvKiArICh4KS5hX3Bhc3NpemUqLyApCi0jZGVmaW5lIE5fU1VQT0ZGKHgpICAgICAoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fU1VQT0ZGKHgpICAgIC8qICsgMCAoeCkuYV9zdXBzaXplKi8gKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0VYVEhPRkYoeCkgICAgKCBOX0RSRUxPRkYoeCkgICAvKiAgKyAwICh4KS5hX2Ryc2l6ZSAqLykKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCAwIC8qIG5vIHN0cmluZyB0YWJsZSAqLyApCi0KLS8qIHVzZSB0aGVzZSB3aGVuIHRoZSBmaWxlIGhhcyBnbnUgc3ltYm9sIHRhYmxlcyAqLwotI2RlZmluZSBOX0dOVV9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fR05VX0RSRUxPRkYoeCkgKE5fR05VX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUpCi0jZGVmaW5lIE5fR05VX1NZTU9GRih4KSAgKE5fR05VX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MTAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotCi0jdW5kZWYgTl9TSEFSRURfTElCCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAgKCAwIC8qIG5vIHNoYXJlZCBsaWJyYXJpZXMgKi8gKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwcGEuaCBiL2luY2x1ZGUvYW91dC9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTg1ZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2luY2x1ZGUgImZpbGVoZHIuaCIKLSNpbmNsdWRlICJhb3V0aGRyLmgiCi0jaW5jbHVkZSAic2NuaGRyLmgiCi0jaW5jbHVkZSAic3BhY2VoZHIuaCIKLSNpbmNsdWRlICJzeW1zLmgiCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JhbmxpYi5oIGIvaW5jbHVkZS9hb3V0L3JhbmxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI2MDA1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yYW5saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHJhbmxpYi5oIC0tIGFyY2hpdmUgbGlicmFyeSBpbmRleCBtZW1iZXIgZGVmaW5pdGlvbiBmb3IgR05VLgotICAgQ29weXJpZ2h0IDE5OTAtMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBTeW1kZWYgbWVtYmVyIG9mIGFuIGFyY2hpdmUgY29udGFpbnMgdHdvIHRoaW5nczoKLSAgIGEgdGFibGUgdGhhdCBtYXBzIHN5bWJvbC1zdHJpbmcgb2Zmc2V0cyB0byBmaWxlIG9mZnNldHMsCi0gICBhbmQgYSBzeW1ib2wtc3RyaW5nIHRhYmxlLiAgQWxsIHRoZSBzeW1ib2wgbmFtZXMgYXJlCi0gICBydW4gdG9nZXRoZXIgKGVhY2ggd2l0aCB0cmFpbGluZyBudWxsKSBpbiB0aGUgc3ltYm9sLXN0cmluZwotICAgdGFibGUuICBUaGVyZSBpcyBhIHNpbmdsZSBsb25nd29yZCBieXRlY291bnQgb24gdGhlIGZyb250Ci0gICBvZiBlYWNoIG9mIHRoZXNlIHRhYmxlcy4gIFRodXMgaWYgd2UgaGF2ZSB0d28gc3ltYm9scywKLSAgICJmb28iIGFuZCAiX2JhciIsIHRoYXQgYXJlIGluIGFyY2hpdmUgbWVtYmVycyBhdCBvZmZzZXRzCi0gICAyMDAgYW5kIDkwMCwgaXQgd291bGQgbG9vayBsaWtlIHRoaXM6Ci0gICAgICAgIDE2CQk7IGJ5dGUgY291bnQgb2YgaW5kZXggdGFibGUKLSAgCTAJCTsgb2Zmc2V0IG9mICJmb28iIGluIHN0cmluZyB0YWJsZQotICAJMjAwCQk7IG9mZnNldCBvZiBmb28tbW9kdWxlIGluIGZpbGUKLSAgCTQJCTsgb2Zmc2V0IG9mICJiYXIiIGluIHN0cmluZyB0YWJsZQotICAJOTAwCQk7IG9mZnNldCBvZiBiYXItbW9kdWxlIGluIGZpbGUKLSAgCTkJCTsgYnl0ZSBjb3VudCBvZiBzdHJpbmcgdGFibGUKLSAgCSJmb29cMF9iYXJcMCIJOyBzdHJpbmcgdGFibGUgICovCi0KLSNkZWZpbmUJUkFOTElCTUFHCSJfXy5TWU1ERUYiCS8qIEFyY2hpdmUgZmlsZSBuYW1lIGNvbnRhaW5pbmcgaW5kZXggKi8KLSNkZWZpbmUJUkFOTElCU0tFVwkzCQkvKiBDcmVhdGlvbiB0aW1lIG9mZnNldCAqLwotCi0vKiBGb3JtYXQgb2YgX18uU1lNREVGOgotICAgRmlyc3QsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgJ3N5bWRlZicgZGF0YSB0aGF0IGZvbGxvd3MuCi0gICBTZWNvbmQsIHplcm8gb3IgbW9yZSAnc3ltZGVmJyBzdHJ1Y3R1cmVzLgotICAgVGhpcmQsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHN5bWJvbCBuYW1lIHN0cmluZ3MuCi0gICBGb3VydGgsIHplcm8gb3IgbW9yZSBzeW1ib2wgbmFtZSBzdHJpbmdzIChlYWNoIGZvbGxvd2VkIGJ5IGEgbnVsbCkuICAqLwotCi1zdHJ1Y3Qgc3ltZGVmCi0gIHsKLSAgICB1bmlvbgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc3RyaW5nX29mZnNldDsJLyogSW4gdGhlIGZpbGUgKi8KLQljaGFyICpuYW1lOwkJCS8qIEluIG1lbW9yeSwgc29tZXRpbWVzICovCi0gICAgICB9IHM7Ci0gICAgLyogdGhpcyBwb2ludHMgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGhlYWRlciAoQUtBIG1lbWJlciBoZWFkZXIgLS0KLSAgICAgICBhIHN0cnVjdCBhcl9oZHIpLCBub3QgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIG9yIGludG8gdGhlIGZpbGUpLgotICAgICAgIGluIG90aGVyIHdvcmRzIGl0IG9ubHkgdGVsbHMgeW91IHdoaWNoIGZpbGUgdG8gcmVhZCAqLyAgICAgICAKLSAgICB1bnNpZ25lZCBsb25nIGZpbGVfb2Zmc2V0OwotICB9OwotCi0vKiBDb21wYXRhYmlsaXR5IHdpdGggQlNEIGNvZGUgKi8KLQotI2RlZmluZQlyYW5saWIJc3ltZGVmCi0jZGVmaW5lCXJhbl91bglzCi0jZGVmaW5lCXJhbl9zdHJ4IHN0cmluZ19vZmZzZXQKLSNkZWZpbmUJcmFuX25hbWUgbmFtZQotI2RlZmluZQlyYW5fb2ZmCWZpbGVfb2Zmc2V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvcmVsb2MuaCBiL2luY2x1ZGUvYW91dC9yZWxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNjNTUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yZWxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogcmVsb2MuaCAtLSBIZWFkZXIgZmlsZSBmb3IgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTg5LTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBSZWxvY2F0aW9uIHR5cGVzIGZvciBhLm91dCBmaWxlcyB1c2luZyByZWxvY19pbmZvX2V4dGVuZGVkCi0gICAoU1BBUkMgYW5kIEFNRCAyOTAwMCkuICovCi0KLSNpZm5kZWYgX1JFTE9DX0hfUkVBRF8KLSNkZWZpbmUgX1JFTE9DX0hfUkVBRF8gMQotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJFTE9DXzgsICAgICAgICBSRUxPQ18xNiwgICAgICAgIFJFTE9DXzMyLCAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgICBSRUxPQ19ESVNQOCwgICAgUkVMT0NfRElTUDE2LCAgICBSRUxPQ19ESVNQMzIsIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgICBSRUxPQ19XRElTUDMwLCAgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCAgICAgUkVMT0NfMjIsCi0gICAgUkVMT0NfMTMsICAgICAgIFJFTE9DX0xPMTAsCi0gICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKLSAgICBSRUxPQ19CQVNFMTAsICAgUkVMT0NfQkFTRTEzLCAgICBSRUxPQ19CQVNFMjIsIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCAgICAgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgICBSRUxPQ19HTE9CX0RBVCwgIFJFTE9DX0pNUF9TTE9ULCBSRUxPQ19SRUxBVElWRSwKLSAgICBSRUxPQ18xMSwKLSAgICBSRUxPQ19XRElTUDJfMTQsCi0gICAgUkVMT0NfV0RJU1AxOSwKLSAgICBSRUxPQ19ISEkyMiwKLSAgICBSRUxPQ19ITE8xMCwKLSAgICAKLSAgICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICAgIFJFTE9DX0pVTVBUQVJHLCBSRUxPQ19DT05TVCwgICAgIFJFTE9DX0NPTlNUSCwKLSAgICAKLSAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAotICAgIAotICAgIE5PX1JFTE9DCi0gICAgfTsKLQotI2RlZmluZQlSRUxPQ19UWVBFX05BTUVTIFwKLSI4IiwJCSIxNiIsCQkiMzIiLAkJIkRJU1A4IiwJXAotIkRJU1AxNiIsCSJESVNQMzIiLAkiV0RJU1AzMCIsCSJXRElTUDIyIiwJXAotIkhJMjIiLAkJIjIyIiwJCSIxMyIsCQkiTE8xMCIsCQlcCi0iU0ZBX0JBU0UiLAkiU0ZBT0ZGMTMiLAkiQkFTRTEwIiwJIkJBU0UxMyIsCVwKLSJCQVNFMjIiLAkiUEMxMCIsCQkiUEMyMiIsCQkiSk1QX1RCTCIsCVwKLSJTRUdPRkYxNiIsCSJHTE9CX0RBVCIsCSJKTVBfU0xPVCIsCSJSRUxBVElWRSIsCVwKLSIxMSIsCQkiV0RJU1AyXzE0IiwJIldESVNQMTkiLCAJIkhISTIyIiwJXAotIkhMTzEwIiwJCQkJCQkJXAotIkpVTVBUQVJHIiwJIkNPTlNUIiwJIkNPTlNUSCIsCSJXRElTUDE0IiwJXAotIldESVNQMjEiLAlcCi0iTk9fUkVMT0MiCi0KLSNlbmRpZiAvKiBfUkVMT0NfSF9SRUFEXyAqLwotCi0vKiBlbmQgb2YgcmVsb2MuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWIuZGVmIGIvaW5jbHVkZS9hb3V0L3N0YWIuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJkMmRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIFRoaXMgdXNlcyBhbiBuX3R5cGUgb2YgMCwgd2hpY2ggaW4gYS5vdXQgZmlsZXMKLSAgIG92ZXJsYXBzIHRoZSBOX1VOREYgdXNlZCBmb3Igb3JkaW5hcnkgc3ltYm9scy4gIEluIEVMRiBmaWxlcywgdGhlCi0gICBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBpbiBhIGRpZmZlcmVudCBmaWxlIHNlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIGNvbmZsaWN0LgotICAgVGhpcyBzeW1ib2wncyBuX3ZhbHVlIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgc2VjdGlvbiBhc3NvY2lhdGVkCi0gICB3aXRoIHRoaXMgZmlsZS4gIFRoZSBzeW1ib2wncyBuX3N0cnggKHJlbGF0aXZlIHRvIHRoZSBqdXN0LXVwZGF0ZWQKLSAgIHN0cmluZyBzZWN0aW9uIHN0YXJ0IGFkZHJlc3MpIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSwKLSAgIGUuZy4gImZvby5jIiwgd2l0aG91dCBhbnkgcGF0aCBpbmZvcm1hdGlvbi4gIFRoZSBzeW1ib2wncyBuX2Rlc2MgZ2l2ZXMKLSAgIHRoZSBjb3VudCBvZiB1cGNvbWluZyBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgKG5vdCBpbmNsdWRpbmcKLSAgIHRoaXMgb25lKS4gICovCi0vKiBfX2RlZmluZV9zdGFiIChOX1VOREYsIDB4MDAsICJVTkRGIikgICovCi0KLS8qIEdsb2JhbCB2YXJpYWJsZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCi0gICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCi1fX2RlZmluZV9zdGFiIChOX0dTWU0sIDB4MjAsICJHU1lNIikKLQotLyogRnVuY3Rpb24gbmFtZSBmb3IgQlNEIEZvcnRyYW4uICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GTkFNRSwgMHgyMiwgIkZOQU1FIikKLQotLyogRnVuY3Rpb24gbmFtZSBvciB0ZXh0LXNlZ21lbnQgdmFyaWFibGUgZm9yIEMuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgIERlc2MgaXMgc3VwcG9zZWRseSBzdGFydGluZyBsaW5lIG51bWJlciwgYnV0IEdDQyBkb2Vzbid0IHNldCBpdAotICAgYW5kIERCWCBzZWVtcyBub3QgdG8gbWlzcyBpdC4gICovCi1fX2RlZmluZV9zdGFiIChOX0ZVTiwgMHgyNCwgIkZVTiIpCi0KLS8qIERhdGEtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgICJTdGF0aWMgU3ltIi4gICovCi1fX2RlZmluZV9zdGFiIChOX1NUU1lNLCAweDI2LCAiU1RTWU0iKQotCi0vKiBCU1Mtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xDU1lNLCAweDI4LCAiTENTWU0iKQotCi0vKiBOYW1lIG9mIG1haW4gcm91dGluZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9NQUlOLCAweDJhLCAiTUFJTiIpCi0KLS8qIFNvbGFyaXMyOiAgUmVhZC1vbmx5IGRhdGEgc3ltYm9scy4gICovCi1fX2RlZmluZV9zdGFiIChOX1JPU1lNLCAweDJjLCAiUk9TWU0iKQotCi0vKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KLSAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCi1fX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQotCi0vKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQotCi0vKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIExpa2UgTl9TTywgYnV0IGZvciB0aGUgb2JqZWN0IGZpbGUuICBUd28gaW4KLSAgIGEgcm93IHByb3ZpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIC5vIGZyb20gaXQuCi0gICBTb2xhcmlzMiB1c2VzIHRoaXMgdG8gYXZvaWQgcHV0dGluZyB0aGUgc3RhYnMgaW5mbyBpbnRvIHRoZSBsaW5rZWQKLSAgIGV4ZWN1dGFibGU7IHRoaXMgc3RhYiBnb2VzIGludG8gdGhlICIuc3RhYi5pbmRleCIgc2VjdGlvbiwgYW5kIHRoZSBkZWJ1Z2dlcgotICAgcmVhZHMgdGhlIHJlYWwgc3RhYnMgZGlyZWN0bHkgZnJvbSB0aGUgLm8gZmlsZXMgaW5zdGVhZC4gICovCi1fX2RlZmluZV9zdGFiIChOX09CSiwgMHgzOCwgIk9CSiIpCi0KLS8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgT3B0aW9ucyBmb3IgdGhlIGRlYnVnZ2VyLCByZWxhdGVkIHRvIHRoZQotICAgc291cmNlIGxhbmd1YWdlIGZvciB0aGlzIG1vZHVsZS4gIEUuZy4gd2hldGhlciB0byB1c2UgQU5TSQotICAgaW50ZWdyYWwgcHJvbW90aW9ucyBvciB0cmFkaXRpb25hbCBpbnRlZ3JhbCBwcm9tb3Rpb25zLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fT1BULCAweDNjLCAiT1BUIikKLQotLyogUmVnaXN0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBudW1iZXIgb2YgcmVnaXN0ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9SU1lNLCAweDQwLCAiUlNZTSIpCi0KLS8qIE1vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQuICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTTJDLCAweDQyLCAiTTJDIikKLQotLyogTGluZSBudW1iZXIgaW4gdGV4dCBzZWdtZW50LiAgRGVzYyBpcyB0aGUgbGluZSBudW1iZXI7Ci0gICB2YWx1ZSBpcyBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICBPbiBTb2xhcmlzMiwgdGhlIGxpbmUgbnVtYmVyIGlzCi0gICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TTElORSwgMHg0NCwgIlNMSU5FIikKLQotLyogU2ltaWxhciwgZm9yIGRhdGEgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0RTTElORSwgMHg0NiwgIkRTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBic3Mgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0JTTElORSwgMHg0OCwgIkJTTElORSIpCi0KLS8qIFN1bidzIHNvdXJjZS1jb2RlIGJyb3dzZXIgc3RhYnMuICA/PyBEb24ndCBrbm93IHdoYXQgdGhlIGZpZWxkcyBhcmUuCi0gICBTdXBwb3NlZGx5IHRoZSBmaWVsZCBpcyAicGF0aCB0byBhc3NvY2lhdGVkIC5jYiBmaWxlIi4gIFRISVMgVkFMVUUKLSAgIE9WRVJMQVBTIFdJVEggTl9CU0xJTkUhICAqLwotX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCi0KLS8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCi0gICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKLSAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQotICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCi1fX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQotCi0vKiBOZXcgaW4gU29sYXJpczIuICBGdW5jdGlvbiBzdGFydC9ib2R5L2VuZCBsaW5lIG51bWJlcnMuICAqLwotX19kZWZpbmVfc3RhYihOX0ZMSU5FLCAweDRDLCAiRkxJTkUiKQotCi0vKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKLSAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KLS8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKLS8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX01PRDIsIDB4NTAsICJNT0QyIikKLQotLyogR05VIEMrKyBgY2F0Y2gnIGNsYXVzZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgRGVzYyBpcyBub256ZXJvIGlmCi0gICB0aGlzIGVudHJ5IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgQ0FVR0hUIHN0YWIgc2F5aW5nIHdoYXQgZXhjZXB0aW9uCi0gICB3YXMgY2F1Z2h0LiAgTXVsdGlwbGUgQ0FVR0hUIHN0YWJzIG1lYW5zIHRoYXQgbXVsdGlwbGUgZXhjZXB0aW9ucwotICAgY2FuIGJlIGNhdWdodCBoZXJlLiAgSWYgRGVzYyBpcyAwLCBpdCBtZWFucyBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0Ci0gICBoZXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQ0FUQ0gsIDB4NTQsICJDQVRDSCIpCi0KLS8qIFN0cnVjdHVyZSBvciB1bmlvbiBlbGVtZW50LiAgVmFsdWUgaXMgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TU1lNLCAweDYwLCAiU1NZTSIpCi0KLS8qIFNvbGFyaXMyOiAgTGFzdCBzdGFiIGVtaXR0ZWQgZm9yIG1vZHVsZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VORE0sIDB4NjIsICJFTkRNIikKLQotLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgotICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4KLSAgIElmIG11bHRpcGxlIE5fU08ncyBhcHBlYXIsIHRoZSBmaXJzdCB0byBjb250YWluIGEgdHJhaWxpbmcgLyBpcyB0aGUKLSAgIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIFRoZSBmaXJzdCB0byBub3QgY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBzb3VyY2UgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgT3RoZXJzIChwZXJoYXBzCi0gICByZXN1bHRpbmcgZnJvbSBjZnJvbnQpIGFyZSBpZ25vcmVkLgotICAgT24gU29sYXJpczIsIHZhbHVlIGlzIHVuZGVmaW5lZCwgYnV0IGRlc2MgaXMgYSBzb3VyY2UtbGFuZ3VhZ2UgY29kZS4gICovCi0KLV9fZGVmaW5lX3N0YWIgKE5fU08sIDB4NjQsICJTTyIpCi0KLS8qIFN1blBybyBGNzc6ICBOYW1lIG9mIGFsaWFzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQUxJQVMsIDB4NmMsICJBTElBUyIpCi0KLS8qIEF1dG9tYXRpYyB2YXJpYWJsZSBpbiB0aGUgc3RhY2suICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBmcmFtZSBwb2ludGVyLgotICAgQWxzbyB1c2VkIGZvciB0eXBlIGRlc2NyaXB0aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xTWU0sIDB4ODAsICJMU1lNIikKLQotLyogQmVnaW5uaW5nIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE9ubHkgU3VuIHVzZXMgdGhpcy4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCBvbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgb3RoZXIgZmllbGRzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQklOQ0wsIDB4ODIsICJCSU5DTCIpCi0KLS8qIE5hbWUgb2Ygc3ViLXNvdXJjZSBmaWxlICgjaW5jbHVkZSBmaWxlKS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TT0wsIDB4ODQsICJTT0wiKQotCi0vKiBQYXJhbWV0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBhcmd1bWVudCBwb2ludGVyLgotICAgKE9uIG1vc3QgbWFjaGluZXMgdGhlIGFyZ3VtZW50IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZyYW1lIHBvaW50ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QU1lNLCAweGEwLCAiUFNZTSIpCi0KLS8qIEVuZCBvZiBhbiBpbmNsdWRlIGZpbGUuICBObyBuYW1lLgotICAgVGhpcyBhbmQgTl9CSU5DTCBhY3QgYXMgYnJhY2tldHMgYXJvdW5kIHRoZSBmaWxlJ3Mgb3V0cHV0LgotICAgSW4gYW4gb2JqZWN0IGZpbGUsIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRhdGEgaW4gdGhpcyBlbnRyeS4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VJTkNMLCAweGEyLCAiRUlOQ0wiKQotCi0vKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VOVFJZLCAweGE0LCAiRU5UUlkiKQotCi0vKiBCZWdpbm5pbmcgb2YgbGV4aWNhbCBibG9jay4KLSAgIFRoZSBkZXNjIGlzIHRoZSBuZXN0aW5nIGxldmVsIGluIGxleGljYWwgYmxvY2tzLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgotICAgVGhlIHZhcmlhYmxlcyBkZWNsYXJlZCBpbnNpZGUgdGhlIGJsb2NrICpwcmVjZWRlKiB0aGUgTl9MQlJBQyBzeW1ib2wuCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX0xCUkFDLCAweGMwLCAiTEJSQUMiKQotCi0vKiBQbGFjZSBob2xkZXIgZm9yIGRlbGV0ZWQgaW5jbHVkZSBmaWxlLiAgUmVwbGFjZXMgYSBOX0JJTkNMIGFuZCBldmVyeXRoaW5nCi0gICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBOX0VJTkNMLiAgVGhlIFN1biBsaW5rZXIgZ2VuZXJhdGVzIHRoZXNlIHdoZW4KLSAgIGl0IGZpbmRzIG11bHRpcGxlIGlkZW50aWNhbCBjb3BpZXMgb2YgdGhlIHN5bWJvbHMgZnJvbSBhbiBpbmNsdWRlIGZpbGUuCi0gICBUaGlzIGFwcGVhcnMgb25seSBpbiBvdXRwdXQgZnJvbSB0aGUgU3VuIGxpbmtlci4gICovCi1fX2RlZmluZV9zdGFiIChOX0VYQ0wsIDB4YzIsICJFWENMIikKLQotLyogTW9kdWxhLTIgc2NvcGUgaW5mb3JtYXRpb24uICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0NPUEUsIDB4YzQsICJTQ09QRSIpCi0KLS8qIEVuZCBvZiBhIGxleGljYWwgYmxvY2suICBEZXNjIG1hdGNoZXMgdGhlIE5fTEJSQUMncyBkZXNjLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIE9uIFNvbGFyaXMyLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCi0KLS8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKLQotLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKLSAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQotCi0vKiBNZW1iZXIgb2YgYSBjb21tb24gYmxvY2s7IHZhbHVlIGlzIG9mZnNldCB3aXRoaW4gdGhlIGNvbW1vbiBibG9jay4KLSAgIFRoaXMgc2hvdWxkIG9jY3VyIHdpdGhpbiBhIEJDT01NL0VDT01NIHBhaXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTCwgMHhlOCwgIkVDT01MIikKLQotLyogU29sYXJpczI6IFBhc2NhbCAid2l0aCIgc3RhdGVtZW50OiB0eXBlLCwwLDAsb2Zmc2V0ICovCi1fX2RlZmluZV9zdGFiIChOX1dJVEgsIDB4ZWEsICJXSVRIIikKLQotLyogVGhlc2UgU1RBQidzIGFyZSB1c2VkIG9uIEdvdWxkIHN5c3RlbXMgZm9yIE5vbi1CYXNlIHJlZ2lzdGVyIHN5bWJvbHMKLSAgIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuICBGSVhNRS4gIEkgaGF2ZSBhc3NpZ25lZCB0aGUgdmFsdWVzIGF0IHJhbmRvbQotICAgc2luY2UgSSBkb24ndCBoYXZlIGEgR291bGQgaGVyZS4gIEZpeHVwcyBmcm9tIEdvdWxkIGZvbGsgd2VsY29tZS4uLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OQlRFWFQsIDB4RjAsICJOQlRFWFQiKQotX19kZWZpbmVfc3RhYiAoTl9OQkRBVEEsIDB4RjIsICJOQkRBVEEiKQotX19kZWZpbmVfc3RhYiAoTl9OQkJTUywgIDB4RjQsICJOQkJTUyIpCi1fX2RlZmluZV9zdGFiIChOX05CU1RTLCAgMHhGNiwgIk5CU1RTIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJMQ1MsICAweEY4LCAiTkJMQ1MiKQotCi0vKiBTZWNvbmQgc3ltYm9sIGVudHJ5IGNvbnRhaW5pbmcgYSBsZW5ndGgtdmFsdWUgZm9yIHRoZSBwcmVjZWRpbmcgZW50cnkuCi0gICBUaGUgdmFsdWUgaXMgdGhlIGxlbmd0aC4gICovCi1fX2RlZmluZV9zdGFiIChOX0xFTkcsIDB4ZmUsICJMRU5HIikKLQwKLS8qIFRoZSBhYm92ZSBpbmZvcm1hdGlvbiwgaW4gbWF0cml4IGZvcm1hdC4KLQotCQkJU1RBQiBNQVRSSVgKLQlfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0JfCAwMCAtIDFGIGFyZSBub3QgZGJ4IHN0YWIgc3ltYm9scwkJfAotCXwgSW4gbW9zdCBjYXNlcywgdGhlIGxvdyBiaXQgaXMgdGhlIEVYVGVybmFsIGJpdHwKLQotCXwgMDAgVU5ERUYgIHwgMDIgQUJTCXwgMDQgVEVYVCAgIHwgMDYgREFUQQl8Ci0JfCAwMSAgfEVYVCAgfCAwMyAgfEVYVAl8IDA1ICB8RVhUICB8IDA3ICB8RVhUCXwKLQotCXwgMDggQlNTICAgIHwgMEEgSU5EUgl8IDBDIEZOX1NFUSB8IDBFIFdFQUtBCXwKLQl8IDA5ICB8RVhUICB8IDBCIAl8IDBEIFdFQUtVICB8IDBGIFdFQUtUCXwKLQotCXwgMTAgV0VBS0QgIHwgMTIgQ09NTQl8IDE0IFNFVEEgICB8IDE2IFNFVFQJfAotCXwgMTEgV0VBS0IgIHwgMTMJfCAxNSAJICAgIHwgMTcJfAotCi0JfCAxOCBTRVREICAgfCAxQSBTRVRCCXwgMUMgU0VUViAgIHwgMUUgV0FSTklOR3wKLQl8IDE5CSAgICB8IDFCCXwgMUQgCSAgICB8IDFGIEZOCXwKLQotCXxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLQl8IERlYnVnIGVudHJpZXMgd2l0aCBiaXQgMDEgc2V0IGFyZSB1bnVzZWQuCXwKLQl8IDIwIEdTWU0gICB8IDIyIEZOQU1FCXwgMjQgRlVOICAgIHwgMjYgU1RTWU0JfAotCXwgMjggTENTWU0gIHwgMkEgTUFJTgl8IDJDIFJPU1lNICB8IDJFCXwKLQl8IDMwIFBDCSAgICB8IDMyIE5TWU1TCXwgMzQgTk9NQVAgIHwgMzYJfAotCXwgMzggT0JKICAgIHwgM0EJfCAzQyBPUFQgICAgfCAzRQl8Ci0JfCA0MCBSU1lNICAgfCA0MiBNMkMJfCA0NCBTTElORSAgfCA0NiBEU0xJTkUgfAotCXwgNDggQlNMSU5FKnwgNEEgREVGRAl8IDRDIEZMSU5FICB8IDRFCXwKLQl8IDUwIEVIREVDTCp8IDUyCXwgNTQgQ0FUQ0ggIHwgNTYgICAgICAgIHwKLQl8IDU4ICAgICAgICB8IDVBICAgICAgICB8IDVDICAgICAgICB8IDVFCXwKLQl8IDYwIFNTWU0gICB8IDYyIEVORE0JfCA2NCBTTwkgICAgfCA2NiAJfAotCXwgNjggCSAgICB8IDZBCXwgNkMgQUxJQVMgIHwgNkUJfAotCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8Ci0JfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKLQl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAotCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8Ci0JfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKLQl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAotCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8Ci0JfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKLQl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAotCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8Ci0JfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAotCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8Ci0JfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKLQl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAotCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8Ci0JfCBFOCBFQ09NTCAgfCBFQSBXSVRICXwgRUMJICAgIHwgRUUJfAotCXwgRjAJICAgIHwgRjIJfCBGNAkgICAgfCBGNgl8Ci0JfCBGOAkgICAgfCBGQQl8IEZDCSAgICB8IEZFIExFTkcJfAotCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIDUwIEVIREVDTCBpcyBhbHNvIE1PRDIuCi0gKiA0OCBCU0xJTkUgaXMgYWxzbyBCUk9XUy4KLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmggYi9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGUxNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX19HTlVfU1RBQl9fCi0KLS8qIEluZGljYXRlIHRoZSBHTlUgc3RhYi5oIGlzIGluIHVzZS4gICovCi0KLSNkZWZpbmUgX19HTlVfU1RBQl9fCi0KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIE5BTUU9Q09ERSwKLSNkZWZpbmUgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0KLWVudW0gX19zdGFiX2RlYnVnX2NvZGUKLXsKLSNpbmNsdWRlICJhb3V0L3N0YWIuZGVmIgotTEFTVF9VTlVTRURfU1RBQl9DT0RFCi19OwotCi0jdW5kZWYgX19kZWZpbmVfc3RhYgotCi0vKiBEZWZpbml0aW9ucyBvZiAiZGVzYyIgZmllbGQgZm9yIE5fU08gc3RhYnMgaW4gU29sYXJpczIuICAqLwotCi0jZGVmaW5lCU5fU09fQVMJCTEKLSNkZWZpbmUJTl9TT19DCQkyCi0jZGVmaW5lCU5fU09fQU5TSV9DCTMKLSNkZWZpbmUJTl9TT19DQwkJNAkvKiBDKysgKi8KLSNkZWZpbmUJTl9TT19GT1JUUkFOCTUKLSNkZWZpbmUJTl9TT19QQVNDQUwJNgotCi0vKiBTb2xhcmlzMjogRmxvYXRpbmcgcG9pbnQgdHlwZSB2YWx1ZXMgaW4gYmFzaWMgdHlwZXMuICAqLwotCi0jZGVmaW5lCU5GX05PTkUJCTAKLSNkZWZpbmUJTkZfU0lOR0xFCTEJLyogSUVFRSAzMi1iaXQgKi8KLSNkZWZpbmUJTkZfRE9VQkxFCTIJLyogSUVFRSA2NC1iaXQgKi8KLSNkZWZpbmUJTkZfQ09NUExFWAkzCS8qIEZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMTYJNAkvKiBGb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgzMgk1CS8qIEZvcnRyYW4gY29tcGxleCoxNiAqLwotI2RlZmluZQlORl9MRE9VQkxFCTYJLyogTG9uZyBkb3VibGUgKHdoYXRldmVyIHRoYXQgaXMpICovCi0KLSNlbmRpZiAvKiBfX0dOVV9TVEFCXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N1bjQuaCBiL2luY2x1ZGUvYW91dC9zdW40LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmEwZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N1bjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyB2YWx1ZXMgZm9yIGEub3V0IGZpbGVzICovCi0KLS8qIFNvbWUgc3lzdGVtcywgZS5nLiwgQUlYLCBtYXkgaGF2ZSBkZWZpbmVkIHRoaXMgaW4gaGVhZGVyIGZpbGVzIGFscmVhZHkKLSAgIGluY2x1ZGVkLiAgKi8KLSN1bmRlZiBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCQkvKiA4Sy4gIGFrYSBOQlBHIGluIDxzeXMvcGFyYW0uaD4gKi8KLS8qIE5vdGUgdGhhdCBzb21lIFNQQVJDcyBoYXZlIDRLIHBhZ2VzLCBzb21lIDhLLCBzb21lIG90aGVycy4gICovCi0KLSNkZWZpbmUgU0VHX1NJWkVfU1BBUkMJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZQlTRUdfU0laRV9TVU4zCTB4MjAwMDAJCS8qIFJlc29sdXRpb24gb2Ygci93IHByb3RlY3Rpb24gaHcgKi8KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJVEFSR0VUX1BBR0VfU0laRQkvKiBMb2NhdGlvbiAwIGlzIG5vdCBhY2Nlc3NpYmxlICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotCi0vKiBOb24tZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgYWNjZXNzb3IgbWFjcm9zLi4uICovCi0KLS8qIFNlZ21lbnQgc2l6ZSB2YXJpZXMgb24gU3VuLTMgdmVyc3VzIFN1bi00LiAgKi8KLQotI2RlZmluZSBOX1NFR1NJWkUoeCkJKE5fTUFDSFRZUEUoeCkgPT0gTV9TUEFSQz8JU0VHX1NJWkVfU1BBUkM6CVwKLQkJCSBOX01BQ0hUWVBFKHgpID09IE1fNjgwMjA/CVNFR19TSVpFX1NVTjM6CVwKLQkJCS8qIEd1ZXNzPyAqLwkJCVRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIFZpcnR1YWwgQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgZnJvbSB0aGUgYS5vdXQgZmlsZS4gIEZvciBPTUFHSUMsCi0gICAoYWxtb3N0IGFsd2F5cyAidW5saW5rZWQgLm8ncyIgdGhlc2UgZGF5cyksIHNob3VsZCBiZSB6ZXJvLgotICAgU3VuIGFkZGVkIGEga2x1ZGdlIHNvIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBsaW5rZWQgWk1BR0lDIGdldAotICAgYW4gYWRkcmVzcyBvZiB6ZXJvIGlmIGFfZW50cnkgKCEhISkgaXMgbG93ZXIgdGhhbiB0aGUgb3RoZXJ3aXNlCi0gICBleHBlY3RlZCB0ZXh0IGFkZHJlc3MuICBUaGVzZSBrbHVkZ2VzIGhhdmUgZ290dGEgZ28hCi0gICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLwotCi0vKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdmVyc2lvbiBpbiBhb3V0NjQuaCAod2hpY2ggd2Ugb3ZlcnJpZGUgYnkgZGVmaW5pbmcKLSAgIGl0IGhlcmUpIG9ubHkgZm9yIE5NQUdJQyAod2UgcmV0dXJuIFRFWFRfU1RBUlRfQUREUitFWEVDX0JZVEVTX1NJWkU7Ci0gICB0aGV5IHJldHVybiAwKS4gICovCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAwIFwKLSAgICAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgJiYgKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpPyAwIFwKLSAgICAgOiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFKQotCi0vKiBXaGVuIGEgZmlsZSBpcyBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TIDQsIHRoZQotICAgZHluYW1pYyBiaXQgaW4gdGhlIGV4ZWMgaGVhZGVyIGlzIHNldCwgYW5kIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUgaXMgX19EWU5BTUlDLiAgSXRzIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMKLXsKLSAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICBTdW5PUyA0LjEueCBjcmVhdGVzIGZpbGVzCi0gICAgIHdpdGggdmVyc2lvbiBudW1iZXIgMywgd2hpY2ggaXMgd2hhdCB0aGlzIHN0cnVjdHVyZSBpcyBiYXNlZCBvbi4KLSAgICAgQWNjb3JkaW5nIHRvIGdkYiwgdmVyc2lvbiAyIGlzIHNpbWlsYXIuICBJIGJlbGlldmUgdGhhdCB2ZXJzaW9uIDIKLSAgICAgdXNlZCBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgdGhlcmUgbWF5Ci0gICAgIGhhdmUgYmVlbiBvdGhlciBkaWZmZXJlbmNlcy4gICovCi0gIGJmZF9ieXRlIGxkX3ZlcnNpb25bNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSAyOCBieXRlIHN0cnVjdHVyZSB1c2VkIGluIGRlYnVnZ2luZy4KLSAgICAgVGhlIGNvbnRlbnRzIGFyZSBmaWxsZWQgaW4gYXQgcnVuIHRpbWUgYnkgbGQuc28uICAqLwotICBiZmRfYnl0ZSBsZGRbNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYW5vdGhlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dAotICAgICBob3cgdG8gcmVsb2NhdGUgdGhlIGV4ZWN1dGFibGUgYXQgcnVuIHRpbWUuICAqLwotICBiZmRfYnl0ZSBsZFs0XTsKLX07Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBkZWJ1Z2dpbmcgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRlYnVnZ2VyCi0gICBmaWVsZCBvZiBfX0RZTkFNSUMuICAqLwotI2RlZmluZSBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSAoMjQpCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgbGlua2VyIGZpZWxkIG9mIF9fRFlOQU1JQy4gIEFzIGZhcgotICAgYXMgSSBjYW4gdGVsbCwgbW9zdCBvZiB0aGUgYWRkcmVzc2VzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBvZmZzZXRzCi0gICB3aXRoaW4gdGhlIGZpbGUsIGJ1dCBzb21lIGFyZSBhY3R1YWxseSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluawotewotICAvKiBMaW5rZWQgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gIFRoaXMgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUgYnkKLSAgICAgbGQuc28gYW5kIHByb2JhYmx5IGJ5IGRsb3Blbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfbG9hZGVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmplY3RzIHdoaWNoIG11c3QgYmUKLSAgICAgaW5jbHVkZWQgYXQgcnVudGltZS4gIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgaXMgMTYgYnl0ZXM6IHRoZSA0Ci0gICAgIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIG5hbWluZyB0aGUgb2JqZWN0IChlLmcuLCBmb3IgLWxjIHRoaXMKLSAgICAgaXMgImMiKTsgNCBieXRlcyBvZiBmbGFncy0tdGhlIGhpZ2ggYml0IGlzIHdoZXRoZXIgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgb2JqZWN0IHVzaW5nIHRoZSBsaWJyYXJ5IHBhdGg7IHRoZSAyIGJ5dGUgbWFqb3IgdmVyc2lvbgotICAgICBudW1iZXI7IHRoZSAyIGJ5dGUgbWlub3IgdmVyc2lvbiBudW1iZXI7IHRoZSA0IGJ5dGUgYWRkcmVzcyBvZgotICAgICB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCAoemVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5KS4gIFRoZQotICAgICB2ZXJzaW9uIG51bWJlcnMgc2VlbSB0byBvbmx5IGJlIG5vbi16ZXJvIHdoZW4gZG9pbmcgbGlicmFyeQotICAgICBzZWFyY2hpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX25lZWQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHBhdGggdG8gc2VhcmNoIGZvciB0aGUgc2hhcmVkIG9iamVjdHMgd2hpY2gKLSAgICAgbXVzdCBiZSBpbmNsdWRlZC4gIFRoaXMgcG9pbnRzIHRvIGEgc3RyaW5nIGluIFBBVEggZm9ybWF0IHdoaWNoCi0gICAgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgdG8gdGhlIGxpbmtlci4gIEFjY29yZGluZyB0bwotICAgICB0aGUgbWFuIHBhZ2UsIGxkLnNvIGltcGxpY2l0bHkgYWRkcyAke0xEX0xJQlJBUllfUEFUSH0gdG8gdGhlCi0gICAgIGJlZ2lubmluZyBvZiB0aGlzIHN0cmluZyBhbmQgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiB0byB0aGUKLSAgICAgZW5kLiAgVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLiAgVGhpcyBmaWVsZCBpcwotICAgICB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcGF0aC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcnVsZXM7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZQotICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlIHNlZW1zIHRvIGJlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN1bjRfZHluYW1pYyBzdHJ1Y3R1cmUgKHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBfX0RZTkFNSUMgc3ltYm9sKS4KLSAgICAgVGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgaXMgdXNlZCBmb3IgUElDIGNvZGUgdG8gaG9sZCB0aGUKLSAgICAgYWRkcmVzc2VzIG9mIHZhcmlhYmxlcy4gIEEgZHluYW1pY2FsbHkgbGlua2VkIGZpbGUgd2hpY2ggZG9lcyBub3QKLSAgICAgaXRzZWxmIGNvbnRhaW4gUElDIGNvZGUgaGFzIGEgZm91ciBieXRlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2dvdDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LgotCi0gICAgIE9uIGEgU1BBUkMsIHRoZSB0YWJsZSBpcyBjb21wb3NlZCBvZiAxMiBieXRlIGVudHJpZXMsIGVhY2ggb2YKLSAgICAgd2hpY2ggY29uc2lzdHMgb2YgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpcnN0IGVudHJ5IGlzCi0gICAgICAgICBzZXRoaSAlaGkoMCksJWcxCi0JIGptcCAlZzEKLQkgbm9wCi0gICAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgY2hhbmdlZCBieSBsZC5zbyBpbnRvIGEganVtcCBkaXJlY3RseSBpbnRvCi0gICAgIGxkLnNvIGl0c2VsZi4gIEVhY2ggc3Vic2VxdWVudCBlbnRyeSBpcwotICAgICAgICAgc2F2ZSAlc3AsIC05NiwgJXNwCi0JIGNhbGwgPGFkZHJlc3Mgb2YgZmlyc3QgZW50cnkgaW4gcHJvY2VkdXJlIGxpbmthZ2UgdGFibGU+Ci0JIDxyZWxvY19udW1iZXIgfCAweDAxMDAwMDAwPgotICAgICBUaGUgcmVsb2NfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgdGhlIHJlbG9jIHRvIHVzZSB0byByZXNvbHZlCi0gICAgIHRoaXMgZW50cnkuICBUaGUgcmVsb2Mgd2lsbCBiZSBhIEpNUF9TTE9UIHJlbG9jIGFnYWluc3Qgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBmaWxlIGJ1dCBzaG91bGQgYmUKLSAgICAgZGVmaW5lZCBpbiBhIHNoYXJlZCBvYmplY3QgKGlmIGl0IGlzIG5vdCwgbGQuc28gd2lsbCByZXBvcnQgYQotICAgICBydW50aW1lIGVycm9yIGFuZCBleGl0KS4gIFRoZSBjb25zdGFudCAweDAxMDAwMDAwMCB0dXJucyB0aGUKLSAgICAgcmVsb2MgbnVtYmVyIGludG8gYSBzZXRoaSBvZiAlZzAsIHdoaWNoIGRvZXMgbm90aGluZyBzaW5jZSAlZzAgaXMKLSAgICAgaGFyZHdpcmVkIHRvIHplcm8uCi0KLSAgICAgV2hlbiBvbmUgb2YgdGhlc2UgZW50cmllcyBpcyBleGVjdXRlZCwgaXQgd2luZHMgdXAgY2FsbGluZyBpbnRvCi0gICAgIGxkLnNvLiAgbGQuc28gbG9va3MgYXQgdGhlIHJlbG9jIG51bWJlciwgYXZhaWxhYmxlIHZpYSB0aGUgcmV0dXJuCi0gICAgIGFkZHJlc3MsIHRvIGRldGVybWluZSB3aGljaCBlbnRyeSB0aGlzIGlzLiAgSXQgdGhlbiBsb29rcyBhdCB0aGUKLSAgICAgcmVsb2MgYW5kIHBhdGNoZXMgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBpbnRvIGEgc2V0aGkgYW5kIGptcAotICAgICB0byB0aGUgcmVhbCBhZGRyZXNzIGZvbGxvd2VkIGJ5IGEgbm9wLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZWxvYwotICAgICBsb29rdXAgb25seSBoYXMgdG8gaGFwcGVuIG9uY2UsIGFuZCBpdCBhbHNvIG1lYW5zIHRoYXQgdGhlCi0gICAgIHJlbG9jYXRpb24gb25seSBuZWVkcyB0byBiZSBkb25lIGlmIHRoZSBmdW5jdGlvbiBpcyBhY3R1YWxseQotICAgICBjYWxsZWQuICBUaGUgcmVsb2NhdGlvbiBpcyBleHBlbnNpdmUgYmVjYXVzZSBsZC5zbyBtdXN0IGxvb2sgdXAKLSAgICAgdGhlIHN5bWJvbCBieSBuYW1lLgotCi0gICAgIFRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyBnaXZlbiBieSB0aGUgbGRfcGx0X3N6Ci0gICAgIGZpZWxkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jcy4gIFRoZXNlIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMKLSAgICAgb3JkaW5hcnkgcmVsb2NzLiAgU3ltYm9sIGluZGV4IG51bWJlcnMgcmVmZXIgdG8gdGhlIHN5bWJvbHMKLSAgICAgcG9pbnRlZCB0byBieSBsZF9zdGFiLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2YgcmVsb2NzIGlzIHRvIGFzc3VtZSB0aGF0IGFsbCB0aGUgYnl0ZXMgZnJvbSBsZF9yZWwgdG8KLSAgICAgbGRfaGFzaCBjb250YWluIHJlbG9jIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3JlbDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBoYXNoIHRhYmxlIGhhcwotICAgICByb3VnaGx5IHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZXJlIGFyZSBkeW5hbWljIHN5bWJvbHM7Ci0gICAgIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3Qgc2l6ZSBpcyB0byBhc3N1bWUgdGhhdAotICAgICBldmVyeSBieXRlIGZyb20gbGRfaGFzaCB0byBsZF9zdGFiIGlzIGRldm90ZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgICAgRWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBpcyBlaWdodCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyCi0gICAgIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgc2Vjb25kCi0gICAgIGZvdXIgYnl0ZXMgYXJlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZQotICAgICBidWNrZXQuICBUaGUgbGRfYnVja2V0cyBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIHNheSBCLgotICAgICBUaGUgZmlyc3QgQiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGVhY2ggc3RhcnQgYSBidWNrZXQgd2hpY2gKLSAgICAgaXMgY2hhaW5lZCB0aHJvdWdoIHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiBlYWNoIGVudHJ5LiAgQSB2YWx1ZQotICAgICBvZiB6ZXJvIGVuZHMgdGhlIGNoYWluLgotCi0gICAgIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNpbXBseQotICAgICAgICAgaCA9IDA7Ci0gICAgICAgICB3aGlsZSAoKnN0cmluZyAhPSAnXDAnKQotCSAgIGggPSAoaCA8PCAxKSArICpzdHJpbmcrKzsKLQkgaCAmPSAweDdmZmZmZmZmOwotCi0gICAgIFRvIGxvb2sgdXAgYSBzeW1ib2wsIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIG5hbWUuICBUYWtlCi0gICAgIHRoZSBtb2R1bG9zIG9mIGhhc2ggdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYnVja2V0cy4gIFN0YXJ0IGF0Ci0gICAgIHRoYXQgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTZWUgaWYgdGhlIHN5bWJvbCAoZnJvbSB0aGUgZmlyc3QKLSAgICAgZm91ciBieXRlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeSkgaGFzIHRoZSBuYW1lIHlvdSBhcmUgbG9va2luZwotICAgICBmb3IuICBJZiBub3QsIHVzZSB0aGUgY2hhaW4gZmllbGQgKHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiB0aGUKLSAgICAgaGFzaCB0YWJsZSBlbnRyeSkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIGJ1Y2tldC4KLSAgICAgSWYgdGhlIGNoYWluIGZpZWxkIGlzIHplcm8geW91IGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQotICAgICBidWNrZXQsIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4gICovIAotICB1bnNpZ25lZCBsb25nIGxkX2hhc2g7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYSBsaXN0IG9mCi0gICAgIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICBUaGUgc3RyaW5nIGluZGljZXMgYXJlIHJlbGF0aXZlIHRvCi0gICAgIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2Ygc3ltYm9scyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGJldHdlZW4gbGRfc3RhYgotICAgICBhbmQgbGRfc3ltYm9scyBhcmUgZXh0ZXJuYWxfbmxpc3Qgc3RydWN0dXJlcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYjsKLQotICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIEl0IHNlZW1zIHRvIGFsd2F5cyBiZSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zdGFiX2hhc2g7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9idWNrZXRzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhlIGZpcnN0IHN0cmluZyBpbiB0aGlzCi0gICAgIHN0cmluZyB0YWJsZSBuZWVkIG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1ib2xzOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1iX3NpemU7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRleHQgc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfdGV4dDsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3BsdF9zejsKLX07Ci0KLS8qIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgYmZkX2J5dGUgbGRfbG9hZGVkWzRdOwotICBiZmRfYnl0ZSBsZF9uZWVkWzRdOwotICBiZmRfYnl0ZSBsZF9ydWxlc1s0XTsKLSAgYmZkX2J5dGUgbGRfZ290WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRbNF07Ci0gIGJmZF9ieXRlIGxkX3JlbFs0XTsKLSAgYmZkX2J5dGUgbGRfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYls0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYl9oYXNoWzRdOwotICBiZmRfYnl0ZSBsZF9idWNrZXRzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1ib2xzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1iX3NpemVbNF07Ci0gIGJmZF9ieXRlIGxkX3RleHRbNF07Ci0gIGJmZF9ieXRlIGxkX3BsdF9zels0XTsKLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JmZGxpbmsuaCBiL2luY2x1ZGUvYmZkbGluay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg1Nzc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmZkbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8qIGJmZGxpbmsuaCAtLSBoZWFkZXIgZmlsZSBmb3IgQkZEIGxpbmsgcm91dGluZXMKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZETElOS19ICi0jZGVmaW5lIEJGRExJTktfSAotCi0vKiBXaGljaCBzeW1ib2xzIHRvIHN0cmlwIGR1cmluZyBhIGxpbmsuICAqLwotZW51bSBiZmRfbGlua19zdHJpcAotewotICBzdHJpcF9ub25lLAkJLyogRG9uJ3Qgc3RyaXAgYW55IHN5bWJvbHMuICAqLwotICBzdHJpcF9kZWJ1Z2dlciwJLyogU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICBzdHJpcF9zb21lLAkJLyoga2VlcF9oYXNoIGlzIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8ga2VlcC4gICovCi0gIHN0cmlwX2FsbAkJLyogU3RyaXAgYWxsIHN5bWJvbHMuICAqLwotfTsKLQotLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byBkaXNjYXJkIGR1cmluZyBhIGxpbmsuICBUaGlzIGlzIGlycmVsZXZhbnQKLSAgIGlmIHN0cmlwX2FsbCBpcyB1c2VkLiAgKi8KLWVudW0gYmZkX2xpbmtfZGlzY2FyZAotewotICBkaXNjYXJkX25vbmUsCQkvKiBEb24ndCBkaXNjYXJkIGFueSBsb2NhbHMuICAqLwotICBkaXNjYXJkX2wsCQkvKiBEaXNjYXJkIGxvY2FsIHRlbXBvcmFyeSBzeW1ib2xzLiAgKi8KLSAgZGlzY2FyZF9hbGwJCS8qIERpc2NhcmQgYWxsIGxvY2Fscy4gICovCi19OwotDAotLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhbiBlbnRyeSBpbiB0aGUgQkZEIGxpbmsgaGFzaAotICAgdGFibGUuICAqLwotCi1lbnVtIGJmZF9saW5rX2hhc2hfdHlwZQotewotICBiZmRfbGlua19oYXNoX25ldywJCS8qIFN5bWJvbCBpcyBuZXcuICAqLwotICBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCwJLyogU3ltYm9sIHNlZW4gYmVmb3JlLCBidXQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZndlYWssCS8qIFN5bWJvbCBpcyB3ZWFrIGFuZCB1bmRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2RlZmluZWQsCS8qIFN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfY29tbW9uLAkJLyogU3ltYm9sIGlzIGNvbW1vbi4gICovCi0gIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsCS8qIFN5bWJvbCBpcyBhbiBpbmRpcmVjdCBsaW5rLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF93YXJuaW5nCQkvKiBMaWtlIGluZGlyZWN0LCBidXQgd2FybiBpZiByZWZlcmVuY2VkLiAgKi8KLX07Ci0KLS8qIFRoZSBsaW5raW5nIHJvdXRpbmVzIHVzZSBhIGhhc2ggdGFibGUgd2hpY2ggdXNlcyB0aGlzIHN0cnVjdHVyZSBmb3IKLSAgIGl0cyBlbGVtZW50cy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Ci17Ci0gIC8qIEJhc2UgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVHlwZSBvZiB0aGlzIGVudHJ5LiAgKi8KLSAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgdHlwZTsKLQotICAvKiBVbmRlZmluZWQgYW5kIGNvbW1vbiBzeW1ib2xzIGFyZSBrZXB0IGluIGEgbGlua2VkIGxpc3QgdGhyb3VnaAotICAgICB0aGlzIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBub3QgaW4gdGhlIHVuaW9uIGJlY2F1c2UgdGhhdCB3b3VsZAotICAgICBmb3JjZSB1cyB0byByZW1vdmUgZW50cmllcyBmcm9tIHRoZSBsaXN0IHdoZW4gd2UgY2hhbmdlZCB0aGVpcgotICAgICB0eXBlLCB3aGljaCB3b3VsZCBmb3JjZSB0aGUgbGlzdCB0byBiZSBkb3VibHkgbGlua2VkLCB3aGljaCB3b3VsZAotICAgICB3YXN0ZSBtb3JlIG1lbW9yeS4gIFdoZW4gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wgaXMKLSAgICAgY3JlYXRlZCwgaXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgbGlzdCwgdGhlIGhlYWQgb2Ygd2hpY2ggaXMgaW4KLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBpdHNlbGYuICBBcyBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGV5IG5lZWQKLSAgICAgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdDsgYW55dGhpbmcgd2hpY2ggcmVhZHMgdGhlIGxpc3QgbXVzdAotICAgICBkb3VibGVjaGVjayB0aGUgc3ltYm9sIHR5cGUuCi0KLSAgICAgV2VhayBzeW1ib2xzIGFyZSBub3Qga2VwdCBvbiB0aGlzIGxpc3QuCi0KLSAgICAgRGVmaW5lZCBhbmQgZGVmd2VhayBzeW1ib2xzIHVzZSB0aGlzIGZpZWxkIGFzIGEgcmVmZXJlbmNlIG1hcmtlci4KLSAgICAgSWYgdGhlIGZpZWxkIGlzIG5vdCBOVUxMLCBvciB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgdGFpbCBvZiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LCB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQuICBJZiB0aGUKLSAgICAgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgYmVjb21lcyBkZWZpbmVkLCB0aGlzIGZpZWxkIHdpbGwKLSAgICAgYXV0b21hdGljYWxseSBiZSBub24tTlVMTCBzaW5jZSB0aGUgc3ltYm9sIHdpbGwgaGF2ZSBiZWVuIG9uIHRoZQotICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogQSB1bmlvbiBvZiBpbmZvcm1hdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogTm90aGluZyBpcyBrZXB0IGZvciBiZmRfaGFzaF9uZXcuICAqLwotICAgICAgLyogYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZCAqYWJmZDsJCS8qIEJGRCBzeW1ib2wgd2FzIGZvdW5kIGluLiAgKi8KLQl9IHVuZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWsuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgYmZkX3ZtYSB2YWx1ZTsJLyogU3ltYm9sIHZhbHVlLiAgKi8KLQkgIGFzZWN0aW9uICpzZWN0aW9uOwkvKiBTeW1ib2wgc2VjdGlvbi4gICovCi0JfSBkZWY7Ci0gICAgICAvKiBiZmRfbGlua19oYXNoX2luZGlyZWN0LCBiZmRfbGlua19oYXNoX3dhcm5pbmcuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmxpbms7CS8qIFJlYWwgc3ltYm9sLiAgKi8KLQkgIGNvbnN0IGNoYXIgKndhcm5pbmc7CS8qIFdhcm5pbmcgKGJmZF9saW5rX2hhc2hfd2FybmluZyBvbmx5KS4gICovCi0JfSBpOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9jb21tb24uICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIGxpbmtlciBuZWVkcyB0byBrbm93IHRocmVlIHRoaW5ncyBhYm91dCBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2xzOiB0aGUgc2l6ZSwgdGhlIGFsaWdubWVudCwgYW5kIHRoZSBzZWN0aW9uIGluCi0gICAgICAgICAgICAgd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgcGxhY2VkLiAgV2Ugc3RvcmUgdGhlIHNpemUKLSAgICAgICAgICAgICBoZXJlLCBhbmQgd2UgYWxsb2NhdGUgYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIGFuZCB0aGUgYWxpZ25tZW50LiAgVGhlIGFsaWdubWVudCBpcyBzdG9yZWQgYXMgYQotICAgICAgICAgICAgIHBvd2VyIG9mIHR3by4gIFdlIGRvbid0IHN0b3JlIGFsbCB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YKLSAgICAgICAgICAgICB0aGUgdW5pb247IHRoaXMgc3RydWN0dXJlIGlzIGEgbWFqb3Igc3BhY2UgdXNlciBpbiB0aGUKLSAgICAgICAgICAgICBsaW5rZXIuICAqLwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwkvKiBDb21tb24gc3ltYm9sIHNpemUuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5Ci0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwkvKiBBbGlnbm1lbnQuICAqLwotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCSAgICB9ICpwOwotCX0gYzsKLSAgICB9IHU7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBsaW5rIGhhc2ggdGFibGUuICBJdCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIGJmZF9oYXNoX3RhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBUaGUgYmFjayBlbmQgd2hpY2ggY3JlYXRlZCB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGluZGljYXRlcyB0aGUKLSAgICAgdHlwZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgd2hpY2ggaXMgc29tZXRpbWVzCi0gICAgIGltcG9ydGFudCBpbmZvcm1hdGlvbiB3aGVuIGxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudAotICAgICB0eXBlcyB0b2dldGhlci4gICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKmNyZWF0b3I7Ci0gIC8qIEEgbGlua2VkIGxpc3Qgb2YgdW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scywgbGlua2VkIHRocm91Z2ggdGhlCi0gICAgIG5leHQgZmllbGQgaW4gdGhlIGJmZF9saW5rX2hhc2hfZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmczsKLSAgLyogRW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIHRhaWwgb2YgdGhlIHVuZGVmcyBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmc190YWlsOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIGxpbmsgaGFzaCB0YWJsZS4gIElmIEZPTExPVyBpcyB0cnVlLCB0aGlzCi0gICBmb2xsb3dzIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QgYW5kIGJmZF9saW5rX2hhc2hfd2FybmluZyBsaW5rcyB0bwotICAgdGhlIHJlYWwgc3ltYm9sLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHksIGJvb2xlYW4gZm9sbG93KSk7Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIG1haW4gbGlua2VyIGhhc2ggdGFibGUgaWYgdGhlIHN5bWJvbCBtaWdodAotICAgYmUgd3JhcHBlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlcyB0byBhbgotICAgdW5kZWZpbmVkIHN5bWJvbCwgbm90IGZvciBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbC4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLQotLyogVHJhdmVyc2UgYSBsaW5rIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLAotCSAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpLAotCSAgIFBUUikpOwotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIHVuZGVmcyBsaXN0LiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2FkZF91bmRlZgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21tdW5pY2F0ZQotICAgYmV0d2VlbiBCRkQgYW5kIHRoZSBsaW5rZXIgd2hlbiBkb2luZyBhIGxpbmsuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaW5mbwotewotICAvKiBGdW5jdGlvbiBjYWxsYmFja3MuICAqLwotICBjb25zdCBzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzICpjYWxsYmFja3M7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4gICovCi0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCi0gIGJvb2xlYW4gZW1pdHJlbG9jYXRpb25zOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSAidGFzayBsaW5rZWQiIG9iamVjdCBmaWxlLAotICAgICBzaW1pbGFyIHRvIHJlbG9jYXRhYmxlIGJ1dCBhbHNvIHdpdGggZ2xvYmFscyBjb252ZXJ0ZWQgdG8gc3RhdGljcy4gKi8KLSAgYm9vbGVhbiB0YXNrX2xpbms7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIHNoYXJlZDsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIHByZS1iaW5kIHN5bWJvbHMgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzeW1ib2xpYzsKLSAgLyogdHJ1ZSBpZiBzaGFyZWQgb2JqZWN0cyBzaG91bGQgYmUgbGlua2VkIGRpcmVjdGx5LCBub3Qgc2hhcmVkLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbGluazsKLSAgLyogdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgc2hvdWxkIGJlIGluIGEgdHJhZGl0aW9uYWwgZm9ybWF0LiAgVGhpcwotICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXR0aW5nIG9mIHRoZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGZsYWcKLSAgICAgb24gdGhlIG91dHB1dCBmaWxlLCBidXQgbWF5IGJlIGNoZWNrZWQgd2hlbiByZWFkaW5nIHRoZSBpbnB1dAotICAgICBmaWxlcy4gICovCi0gIGJvb2xlYW4gdHJhZGl0aW9uYWxfZm9ybWF0OwotICAvKiB0cnVlIGlmIHdlIHdhbnQgdG8gcHJvZHVjZWQgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQKLSAgICAgbmVlZCBtdWNoIG1vcmUgdGltZSBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZC4gICovCi0gIGJvb2xlYW4gb3B0aW1pemU7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgIGV2ZW4gaWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIG5vX3VuZGVmaW5lZDsKLSAgLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcC4gICovCi0gIGVudW0gYmZkX2xpbmtfc3RyaXAgc3RyaXA7Ci0gIC8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZC4gICovCi0gIGVudW0gYmZkX2xpbmtfZGlzY2FyZCBkaXNjYXJkOwotICAvKiB0cnVlIGlmIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkIGluIG1lbW9yeSwgZmFsc2UgaWYgdGhleQotICAgICBzaG91bGQgYmUgZnJlZWQgYW5kIHJlcmVhZC4gICovCi0gIGJvb2xlYW4ga2VlcF9tZW1vcnk7Ci0gIC8qIFRoZSBsaXN0IG9mIGlucHV0IEJGRCdzIGludm9sdmVkIGluIHRoZSBsaW5rLiAgVGhlc2UgYXJlIGNoYWluZWQKLSAgICAgdG9nZXRoZXIgdmlhIHRoZSBsaW5rX25leHQgZmllbGQuICAqLwotICBiZmQgKmlucHV0X2JmZHM7Ci0gIC8qIElmIGEgc3ltYm9sIHNob3VsZCBiZSBjcmVhdGVkIGZvciBlYWNoIGlucHV0IEJGRCwgdGhpcyBpcyBzZWN0aW9uCi0gICAgIHdoZXJlIHRob3NlIHN5bWJvbHMgc2hvdWxkIGJlIHBsYWNlZC4gIEl0IG11c3QgYmUgYSBzZWN0aW9uIGluCi0gICAgIHRoZSBvdXRwdXQgQkZELiAgSXQgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8gc3VjaCBzeW1ib2xzCi0gICAgIHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgaXMgdG8gc3VwcG9ydCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMgaW4gdGhlCi0gICAgIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgKi8KLSAgYXNlY3Rpb24gKmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uOwotICAvKiBIYXNoIHRhYmxlIGhhbmRsZWQgYnkgQkZELiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmhhc2g7Ci0gIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwLiAgVGhpcyBpcyBOVUxMIHVubGVzcyBzdHJpcCBpcwotICAgICBzdHJpcF9zb21lLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICprZWVwX2hhc2g7Ci0gIC8qIHRydWUgaWYgZXZlcnkgc3ltYm9sIHNob3VsZCBiZSByZXBvcnRlZCBiYWNrIHZpYSB0aGUgbm90aWNlCi0gICAgIGNhbGxiYWNrLiAgKi8KLSAgYm9vbGVhbiBub3RpY2VfYWxsOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8gcmVwb3J0IGJhY2sgdmlhIHRoZSBub3RpY2UgY2FsbGJhY2suICBJZgotICAgICB0aGlzIGlzIE5VTEwsIGFuZCBub3RpY2VfYWxsIGlzIGZhbHNlLCB0aGVuIG5vIHN5bWJvbHMgYXJlCi0gICAgIHJlcG9ydGVkIGJhY2suICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKm5vdGljZV9oYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgd2hpY2ggYXJlIGJlaW5nIHdyYXBwZWQgKHRoZSAtLXdyYXAgbGlua2VyCi0gICAgIG9wdGlvbikuICBJZiB0aGlzIGlzIE5VTEwsIG5vIHN5bWJvbHMgYXJlIGJlaW5nIHdyYXBwZWQuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKndyYXBfaGFzaDsKLSAgLyogSWYgYSBiYXNlIG91dHB1dCBmaWxlIGlzIHdhbnRlZCwgdGhlbiB0aGlzIHBvaW50cyB0byBpdCAqLwotICBQVFIgYmFzZV9maWxlOwotCi0gIC8qIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhhdCBicmFuY2hlcyB3aGljaCBhcmUgcHJvYmxlbWF0aWMgZm9yIHRoZQotICBNUEM4NjAgQzAgKG9yIGVhcmxpZXIpIHNob3VsZCBiZSBjaGVja2VkIGZvciBhbmQgbW9kaWZpZWQuICBJdCBnaXZlcyB0aGUKLSAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRleHQgcGFnZS4gKi8KLSAgaW50IG1wYzg2MGMwOwotCi0gIC8qIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcwotICAgICBsb2FkZWQuICAqLwotICBjb25zdCBjaGFyICppbml0X2Z1bmN0aW9uOwotICAvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgaXMKLSAgICAgdW5sb2FkZWQuICAqLwotICBjb25zdCBjaGFyICpmaW5pX2Z1bmN0aW9uOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmVzIGhvbGRzIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZQotICAgY2FsbGVkIGJ5IHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGVhY2gKLSAgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBiZmRfbGlua19pbmZvIHN0cnVjdHVyZSBiZWluZyB1c2VkLiAgRWFjaAotICAgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwKLSAgIHRoZW4gdGhlIEJGRCBmdW5jdGlvbiB3aGljaCBjYWxsZWQgaXQgd2lsbCByZXR1cm4gd2l0aCBhIGZhaWx1cmUKLSAgIGluZGljYXRpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzCi17Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGFkZGVkIGZyb20gYW4KLSAgICAgYXJjaGl2ZS4gIEFCRkQgaXMgdGhlIGFyY2hpdmUgZWxlbWVudCBiZWluZyBhZGRlZC4gIE5BTUUgaXMgdGhlCi0gICAgIG5hbWUgb2YgdGhlIHN5bWJvbCB3aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgZWxlbWVudCB0byBiZSBwdWxsZWQKLSAgICAgaW4uICAqLwotICBib29sZWFuICgqYWRkX2FyY2hpdmVfZWxlbWVudCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKmFiZmQsCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGZvdW5kIHdpdGggbXVsdGlwbGUKLSAgICAgZGVmaW5pdGlvbnMuICBOQU1FIGlzIHRoZSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgb2xkIEJGRCwgT1NFQyBpcyB0aGUgb2xkIHNlY3Rpb24sIE9WQUwgaXMgdGhlIG9sZAotICAgICB2YWx1ZSwgTkJGRCBpcyB0aGUgbmV3IEJGRCwgTlNFQyBpcyB0aGUgbmV3IHNlY3Rpb24sIGFuZCBOVkFMIGlzCi0gICAgIHRoZSBuZXcgdmFsdWUuICBPQkZEIG1heSBiZSBOVUxMLiAgT1NFQyBhbmQgTlNFQyBtYXkgYmUKLSAgICAgYmZkX2NvbV9zZWN0aW9uIG9yIGJmZF9pbmRfc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9kZWZpbml0aW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgYmZkICpvYmZkLAotCQkJCQkgIGFzZWN0aW9uICpvc2VjLAotCQkJCQkgIGJmZF92bWEgb3ZhbCwKLQkJCQkJICBiZmQgKm5iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKm5zZWMsCi0JCQkJCSAgYmZkX3ZtYSBudmFsKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgbXVsdGlwbGUgdGltZXMuICBOQU1FIGlzIHRoZSBzeW1ib2wgYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotICAgICBPQkZEIGlzIHRoZSBCRkQgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbDsgaXQgbWF5IGJlIE5VTEwgaWYgdGhpcyBpcwotICAgICBub3Qga25vd24uICBPVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLCB3aGljaCBtYXkKLSAgICAgYmUgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWssCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBvciBiZmRfbGlua19oYXNoX2luZGlyZWN0LiAgSWYgT1RZUEUgaXMKLSAgICAgYmZkX2xpbmtfaGFzaF9jb21tb24sIE9TSVpFIGlzIHRoZSBzaXplIG9mIHRoZSBleGlzdGluZyBzeW1ib2wuCi0gICAgIE5CRkQgaXMgdGhlIEJGRCBvZiB0aGUgbmV3IHN5bWJvbC4gIE5UWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBuZXcKLSAgICAgc3ltYm9sLCBvbmUgb2YgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IKLSAgICAgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE5UWVBFIGlzIGJmZF9saW5rX2hhc2hfY29tbW9uLCBOU0laRQotICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbmV3IHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9jb21tb24pIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICBiZmQgKm9iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBvc2l6ZSwKLQkJCQkgICAgICBiZmQgKm5iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBuc2l6ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBhZGQgYSBzeW1ib2wgdG8gYSBzZXQuICBFTlRSWSBpcwotICAgICB0aGUgbGluayBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgc2V0IGl0c2VsZiAoZS5nLiwKLSAgICAgX19DVE9SX0xJU1RfXykuICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluCi0gICAgIHRoZSBzZXQgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhbHNvIHVzZWQgdG8KLSAgICAgZ2V0IHRoZSBzaXplIG9mIHRoZSBlbnRyeSB3aGVuIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgICBBQkZELCBTRUMgYW5kIFZBTFVFIGlkZW50aWZ5IHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gICovCi0gIGJvb2xlYW4gKCphZGRfdG9fc2V0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqZW50cnksCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYywKLQkJCQkgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfdm1hIHZhbHVlKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIG5hbWUgb2YgYSBnKysgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3RvciBpcyBmb3VuZC4gIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc29tZSBvYmplY3QgZmlsZQotICAgICBmb3JtYXRzLiAgQ09OU1RSVUNUT1IgaXMgdHJ1ZSBmb3IgYSBjb25zdHJ1Y3RvciwgZmFsc2UgZm9yIGEKLSAgICAgZGVzdHJ1Y3Rvci4gIFRoaXMgd2lsbCB1c2UgQkZEX1JFTE9DX0NUT1Igd2hlbiBnZW5lcmF0aW5nIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUuICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgZm91bmQuICBBQkZELAotICAgICBTRUNUSU9OIGFuZCBWQUxVRSBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBib29sZWFuICgqY29uc3RydWN0b3IpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLAotCQkJCSAgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBpc3N1ZSBhIGxpbmtlciB3YXJuaW5nLiAgRm9yCi0gICAgIGV4YW1wbGUsIHRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nCi0gICAgIHN5bWJvbC4gIFdBUk5JTkcgaXMgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLiAgU1lNQk9MIGlzIHRoZSBuYW1lCi0gICAgIG9mIHRoZSBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nOyBpdCBtYXkgYmUgTlVMTCBpZgotICAgICB0aGVyZSBpcyBub25lLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24KLSAgICAgd2hpY2ggdHJpZ2VycmVkIHRoZSB3YXJuaW5nOyBlaXRoZXIgQUJGRCBvciBTRUNUSU9OIG9yIGJvdGggbWF5Ci0gICAgIGJlIE5VTEwgaWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBrbm93bi4gICovCi0gIGJvb2xlYW4gKCp3YXJuaW5nKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJICAgICAgY29uc3QgY2hhciAqd2FybmluZywgY29uc3QgY2hhciAqc3ltYm9sLAotCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCSAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2NhdGlvbiBpcyBhdHRlbXB0ZWQgYWdhaW5zdAotICAgICBhbiB1bmRlZmluZWQgc3ltYm9sLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIHVuZGVmaW5lZC4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUKLSAgICAgcmVmZXJlbmNlIGlzIG1hZGUuIEZBVEFMIGluZGljYXRlcyB3aGV0aGVyIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMKLSAgICAgYSBmYXRhbCBlcnJvciBvciBub3QuIEluIHNvbWUgY2FzZXMgU0VDVElPTiBtYXkgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCp1bmRlZmluZWRfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBiZmQgKmFiZmQsCi0JCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgICBiZmRfdm1hIGFkZHJlc3MsCi0JCQkJICAgICAgIGJvb2xlYW4gZmF0YWwpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIG92ZXJmbG93IG9jY3Vycy4gIE5BTUUgaXMKLSAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBvciBzZWN0aW9uIHRoZSByZWxvYyBpcyBhZ2FpbnN0LAotICAgICBSRUxPQ19OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uLCBhbmQgQURERU5EIGlzIGFueQotICAgICBhZGRlbmQgdGhhdCBpcyB1c2VkLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUKLSAgICAgbG9jYXRpb24gYXQgd2hpY2ggdGhlIG92ZXJmbG93IG9jY3VyczsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqcmVsb2Nfb3ZlcmZsb3cpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZSwgYmZkX3ZtYSBhZGRlbmQsCi0JCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBkYW5nZXJvdXMgcmVsb2MgaXMgcGVyZm9ybWVkLgotICAgICBUaGUgY2Fub25pY2FsIGV4YW1wbGUgaXMgYW4gYTI5ayBJSENPTlNUIHJlbG9jIHdoaWNoIGRvZXMgbm90Ci0gICAgIGZvbGxvdyBhbiBJSElIQUxGIHJlbG9jLiAgTUVTU0FHRSBpcyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLgotICAgICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUKLSAgICAgcHJvYmxlbSBvY2N1cnJlZDsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqcmVsb2NfZGFuZ2Vyb3VzKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCi0JCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIGlzIGZvdW5kIHRvIGJlIGF0dGFjaGVkCi0gICAgIHRvIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIE5BTUUgaXMgdGhlIG5hbWUgb2YKLSAgICAgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mCi0gICAgIHRoZSByZWxvYzsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKLSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KLSAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqdW5hdHRhY2hlZF9yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaW4gbm90aWNlX2hhc2ggaXMKLSAgICAgZGVmaW5lZCBvciByZWZlcmVuY2VkLiAgTkFNRSBpcyB0aGUgc3ltYm9sLiAgQUJGRCwgU0VDVElPTiBhbmQKLSAgICAgQUREUkVTUyBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJZiBTRUNUSU9OIGlzCi0gICAgIGJmZF91bmRfc2VjdGlvbiwgdGhpcyBpcyBhIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gKCpub3RpY2UpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF92bWEgYWRkcmVzcykpOwotfTsKLQwKLS8qIFRoZSBsaW5rZXIgYnVpbGRzIGxpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCB0ZWxsIHRoZSBjb2RlIGhvdyB0bwotICAgaW5jbHVkZSBpbnB1dCBkYXRhIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2YgbGlua19vcmRlciBzdHJ1Y3R1cmVzLiAgKi8KLQotZW51bSBiZmRfbGlua19vcmRlcl90eXBlCi17Ci0gIGJmZF91bmRlZmluZWRfbGlua19vcmRlciwJLyogVW5kZWZpbmVkLiAgKi8KLSAgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIsCS8qIEJ1aWx0IGZyb20gYSBzZWN0aW9uLiAgKi8KLSAgYmZkX2ZpbGxfbGlua19vcmRlciwJCS8qIEZpbGwgd2l0aCBhIDE2IGJpdCBjb25zdGFudC4gICovCi0gIGJmZF9kYXRhX2xpbmtfb3JkZXIsCQkvKiBTZXQgdG8gZXhwbGljaXQgZGF0YS4gICovCi0gIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIsCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KLSAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzeW1ib2wuICAqLwotfTsKLQotLyogVGhpcyBpcyB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmUgaXRzZWxmLiAgVGhlc2UgZm9ybSBhIGNoYWluCi0gICBhdHRhY2hlZCB0byB0aGUgc2VjdGlvbiB3aG9zZSBjb250ZW50cyB0aGV5IGFyZSBkZXNjcmliaW5nLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyIAotewotICAvKiBOZXh0IGxpbmtfb3JkZXIgaW4gY2hhaW4uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5leHQ7Ci0gIC8qIFR5cGUgb2YgbGlua19vcmRlci4gICovCi0gIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOwotICAvKiBPZmZzZXQgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7ICAKLSAgLyogU2l6ZSB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotICB1bmlvbiAKLSAgICB7Ci0gICAgICBzdHJ1Y3QgCi0JewotCSAgLyogU2VjdGlvbiB0byBpbmNsdWRlLiAgSWYgdGhpcyBpcyB1c2VkLCB0aGVuCi0JICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiBtdXN0IGJlIHRoZSBzZWN0aW9uIHRoZQotCSAgICAgbGlua19vcmRlciBpcyBhdHRhY2hlZCB0bywgc2VjdGlvbi0+b3V0cHV0X29mZnNldCBtdXN0Ci0JICAgICBlcXVhbCB0aGUgbGlua19vcmRlciBvZmZzZXQgZmllbGQsIGFuZCBzZWN0aW9uLT5fcmF3X3NpemUKLQkgICAgIG11c3QgZXF1YWwgdGhlIGxpbmtfb3JkZXIgc2l6ZSBmaWVsZC4gIE1heWJlIHRoZXNlCi0JICAgICByZXN0cmljdGlvbnMgc2hvdWxkIGJlIHJlbGF4ZWQgc29tZWRheS4gICovCi0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQl9IGluZGlyZWN0OwotICAgICAgc3RydWN0Ci0JewotCSAgLyogVmFsdWUgdG8gZmlsbCB3aXRoLiAgKi8KLQkgIHVuc2lnbmVkIGludCB2YWx1ZTsKLQl9IGZpbGw7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBEYXRhIHRvIHB1dCBpbnRvIGZpbGUuICBUaGUgc2l6ZSBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyCi0JICAgICBvZiBieXRlcyB3aGljaCB0aGlzIGZpZWxkIHBvaW50cyB0by4gICovCi0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0JfSBkYXRhOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogRGVzY3JpcHRpb24gb2YgcmVsb2MgdG8gZ2VuZXJhdGUuICBVc2VkIGZvcgotCSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKLQkgICAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlci4gICovCi0JICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnA7Ci0JfSByZWxvYzsKLSAgICB9IHU7Ci19OwotCi0vKiBBIGxpbmtlciBvcmRlciBvZiB0eXBlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IKLSAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciBtZWFucyB0byBjcmVhdGUgYSByZWxvYyBhZ2FpbnN0IGEKLSAgIHNlY3Rpb24gb3Igc3ltYm9sLCByZXNwZWN0aXZlbHkuICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IC1VciB0bwotICAgZ2VuZXJhdGUgcmVsb2NzIGZvciB0aGUgY29uc3RydWN0b3IgdGFibGVzLiAgVGhlCi0gICBiZmRfbGlua19vcmRlcl9yZWxvYyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSByZWxvYyB0aGF0IEJGRCBzaG91bGQKLSAgIGNyZWF0ZS4gIEl0IGlzIHNpbWlsYXIgdG8gYSBhcmVsZW50LCBidXQgSSBkaWRuJ3QgdXNlIGFyZWxlbnQKLSAgIGJlY2F1c2UgdGhlIGxpbmtlciBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IG1vc3Qgc3ltYm9scywgYW5kCi0gICBhbnkgYXN5bWJvbCBzdHJ1Y3R1cmUgaXQgY3JlYXRlcyB3aWxsIGJlIHBhcnRpYWxseSBtZWFuaW5nbGVzcy4KLSAgIFRoaXMgaW5mb3JtYXRpb24gY291bGQgbG9naWNhbGx5IGJlIGluIHRoZSBiZmRfbGlua19vcmRlciBzdHJ1Y3QsCi0gICBidXQgSSBkaWRuJ3Qgd2FudCB0byB3YXN0ZSB0aGUgc3BhY2Ugc2luY2UgdGhlc2UgdHlwZXMgb2YgcmVsb2NzCi0gICBhcmUgcmVsYXRpdmVseSByYXJlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jCi17Ci0gIC8qIFJlbG9jIHR5cGUuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBGb3IgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBzZWN0aW9uCi0JIHRoZSByZWxvYyBzaG91bGQgYmUgYWdhaW5zdC4gIFRoaXMgbXVzdCBiZSBhIHNlY3Rpb24gaW4gdGhlCi0JIG91dHB1dCBCRkQsIG5vdCBhbnkgb2YgdGhlIGlucHV0IEJGRHMuICAqLwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAvKiBGb3IgdHlwZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0JIHN5bWJvbCB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICAqLwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB9IHU7Ci0KLSAgLyogQWRkZW5kIHRvIHVzZS4gIFRoZSBvYmplY3QgZmlsZSBzaG91bGQgY29udGFpbiB6ZXJvLiAgVGhlIEJGRAotICAgICBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgY29ycmVjdGx5LiAgRm9yIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyAoZS5nLiwgQ09GRikgdGhlCi0gICAgIGFkZGVuZCBtdXN0IGJlIHN0b3JlZCBpbnRvIGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIGZvciBzb21lCi0gICAgIChlLmcuLCBTUEFSQyBhLm91dCkgaXQgaXMga2VwdCBpbiB0aGUgcmVsb2MuICAqLwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGxpbmtfb3JkZXIgZm9yIGEgc2VjdGlvbi4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX29yZGVyICpiZmRfbmV3X2xpbmtfb3JkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUKLSAgIEVMRiBsaW5rZXIuICBUaGVzZSBzdHJ1Y3R1cmVzIGNvdWxkIGJlIG1hbmlwdWxhdGVkIGVudGlyZWx5IGluc2lkZQotICAgQkZELCBidXQgaXQgd291bGQgYmUgYSBwYWluLiAgSW5zdGVhZCwgdGhlIHJlZ3VsYXIgbGlua2VyIHNldHMgdXAKLSAgIHRoZXNlIHN0cnVjdHVyZXMsIGFuZCB0aGVuIHBhc3NlcyB0aGVtIGludG8gQkZELiAgKi8KLQotLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgYSB2ZXJzaW9uLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByCi17Ci0gIC8qIE5leHQgcmVndWxhciBleHByZXNzaW9uIGZvciB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKm5leHQ7Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbi4gICovCi0gIGNvbnN0IGNoYXIgKnBhdHRlcm47Ci0gIC8qIE1hdGNoaW5nIGZ1bmN0aW9uLiAgKi8KLSAgaW50ICgqbWF0Y2gpIFBBUkFNUygoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIGNvbnN0IGNoYXIgKikpOwotfTsKLQotLyogVmVyc2lvbiBkZXBlbmRlbmNpZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMKLXsKLSAgLyogTmV4dCBkZXBlbmRlbmN5IGZvciB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm5leHQ7Ci0gIC8qIFRoZSB2ZXJzaW9uIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnNpb25fbmVlZGVkOwotfTsKLQotLyogQSBub2RlIGluIHRoZSB2ZXJzaW9uIHRyZWUuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUKLXsKLSAgLyogTmV4dCB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpuZXh0OwotICAvKiBOYW1lIG9mIHRoaXMgdmVyc2lvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgaW50IHZlcm51bTsKLSAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZ2xvYmFsIHN5bWJvbHMgaW4gdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBsb2NhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbG9jYWxzOwotICAvKiBMaXN0IG9mIHZlcnNpb25zIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlcHM7Ci0gIC8qIEluZGV4IG9mIHRoZSB2ZXJzaW9uIG5hbWUuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyB2ZXJzaW9uIHRyZWUgd2FzIHVzZWQuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCi0gIGludCB1c2VkOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jpbi1idWdzLmggYi9pbmNsdWRlL2Jpbi1idWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTRhNjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW4tYnVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jaWZuZGVmIFJFUE9SVF9CVUdTX1RPCi0jZGVmaW5lIFJFUE9SVF9CVUdTX1RPCSJidWctZ251LXV0aWxzQGdudS5vcmciCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm91dC5oIGIvaW5jbHVkZS9ib3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzI4Y2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgJ2Eub3V0LmgnLiAgSXQgaXMgdG8gYmUgdXNlZCBpbiBhbGwKLSAqIEdOVSB0b29scyBtb2RpZmllZCB0byBzdXBwb3J0IHRoZSBpODA5NjAgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwKLSAqIG9yIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotLyogRklMRSBIRUFERVIKLSAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0gKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyB7Ci0JLyogU3RhbmRhcmQgc3R1ZmYgKi8KLQl1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsJLyogSWRlbnRpZmllcyB0aGlzIGFzIGEgYi5vdXQgZmlsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwkvKiBMZW5ndGggb2YgdGV4dCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwkvKiBMZW5ndGggb2YgZGF0YSAqLwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07CQkvKiBMZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsJLyogUnVudGltZSBzdGFydCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvICovCi0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvICovCi0KLQkvKiBBZGRlZCBmb3IgaTk2MCAqLwotCXVuc2lnbmVkIGNoYXIgZV90bG9hZFs0XTsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV9kbG9hZFs0XTsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV90YWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiB0ZXh0IHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZGFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX2JhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX3JlbGF4YWJsZVsxXTsJLyogQXNzZW1ibGVkIHdpdGggZW5vdWdoIGluZm8gdG8gYWxsb3cgbGlua2VyIHRvIHJlbGF4ICovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYykpCi0KLS8qIFRoZXNlIG1hY3JvcyB1c2UgdGhlIGFfeHh4IGZpZWxkIG5hbWVzLCBzaW5jZSB0aGV5IG9wZXJhdGUgb24gdGhlIGV4ZWMKLSAgIHN0cnVjdHVyZSBhZnRlciBpdCdzIGJlZW4gYnl0ZS1zd2FwcGVkIGFuZCByZWFsaWduZWQgb24gdGhlIGhvc3QgbWFjaGluZS4gKi8KLSNkZWZpbmUgTl9CQURNQUcoeCkJKCgoeCkuYV9pbmZvKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQlFWEVDX0JZVEVTX1NJWkUKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9UUkVMT0ZGCU5fVFJPRkYKLSNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0RSRUxPRkYJTl9EUk9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fREFUQUREUih4KQkoICh4KS5hX2Rsb2FkICkgICAgCi0KLS8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2lmICFkZWZpbmVkIChOX1RYVEFERFIpCi0jZGVmaW5lIE5fVFhUQUREUih4KSAwCi0jZW5kaWYKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QgewotCXVuaW9uIHsKLQkJY2hhcgkqbl9uYW1lOwotCQlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKLQkJbG9uZwluX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLwotCX0gbl91bjsKLQl1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCi0JY2hhcgluX290aGVyOwkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotCXNob3J0CW5fZGVzYzsKLQl1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci19OwotCi0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUKLSAqLwotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLSNkZWZpbmUgTl9TVEFCCTAzNDAJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCi0KLS8qIE1FQU5JTkcgT0YgJ25fb3RoZXInCi0gKgotICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgotICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgotICoKLSAqCTEgPD0gbl9vdGhlciA8PSAzMiA6Ci0gKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgotICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKLSAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCi0gKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCi0gKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgotICoKLSAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZwotICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKLSAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKLSAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCi0gKgkKLSAqCi0gKgluX290aGVyID09IE5fQkFMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKLSAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCi0gKgkJc3BlY2lmaWVkIHR3aWNlLgotICoKLSAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCi0gKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KLSAqLwotI2RlZmluZSBOX0NBTExOQU1FCSgoY2hhciktMSkKLSNkZWZpbmUgTl9CQUxOQU1FCSgoY2hhciktMikKLSNkZWZpbmUgSVNfQ0FMTE5BTUUoeCkJKE5fQ0FMTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19CQUxOQU1FKHgpCShOX0JBTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19PVEhFUih4KQkoKHgpPjAgJiYgKHgpIDw9MzIpCi0KLSNkZWZpbmUgYl9vdXRfcmVsb2NhdGlvbl9pbmZvIHJlbG9jYXRpb25faW5mbwotc3RydWN0IHJlbG9jYXRpb25faW5mbyB7Ci0JaW50CSByX2FkZHJlc3M7CS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLwotCXVuc2lnbmVkCi0jZGVmaW5lIHJfaW5kZXggcl9zeW1ib2xudW0KLQkJcl9zeW1ib2xudW06MjQsLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQsCi0JCQkJKglpZiByX2V4dGVybiBpcyBzZXQuICBPdGhlcndpc2Ugc2V0IHRvCi0JCQkJKgllaXRoZXIgTl9URVhULCBOX0RBVEEsIG9yIE5fQlNTIHRvCi0JCQkJKglpbmRpY2F0ZSBzZWN0aW9uIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMKLQkJCQkqCWJhc2VkLgotCQkJCSovCi0JCXJfcGNyZWw6MSwJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQotCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCQkJICovCi0JCXJfbGVuZ3RoOjIsCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJCQkgKgkwID0+IDEgYnl0ZQotCQkJCSAqCTEgPT4gMiBieXRlcyAtLSB1c2VkIGZvciAxMyBiaXQgcGNyZWwKLQkJCQkgKgkyID0+IDQgYnl0ZXMgCi0JCQkJICovCi0JCXJfZXh0ZXJuOjEsCi0JCXJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9kaXNwOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9jYWxsajoxLAkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotCQlyX3JlbGF4YWJsZToxOwkvKiAxIGlmIGVub3VnaCBpbmZvIGlzIGxlZnQgdG8gcmVsYXgKLQkJCQkgICB0aGUgZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTI4NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogUmVtb3RlIHRhcmdldCBzeXN0ZW0gY2FsbCBjYWxsYmFjayBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaW50ZXJmYWNlIGlzbid0IGludGVuZGVkIHRvIGJlIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGtpbmQKLSAgIG9mIHJlbW90ZSAoaGFyZHdhcmUsIHNpbXVsYXRvciwgd2hhdGV2ZXIpLiAgQXMgc3VjaCwgc3VwcG9ydCBmb3IgaXQKLSAgIChlLmcuIHNpbS9jb21tb24vY2FsbGJhY2suYykgc2hvdWxkICpub3QqIGxpdmUgaW4gdGhlIHNpbXVsYXRvciBzb3VyY2UKLSAgIHRyZWUsIG5vciBzaG91bGQgaXQgbGl2ZSBpbiB0aGUgZ2RiIHNvdXJjZSB0cmVlLiAgKi8KLQotLyogVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBoYW5kbGUgc3lzdGVtIGNhbGxzOgotCi0gICAxKSBIYXZlIGEgc2ltdWxhdG9yIGludGVyY2VwdCB0aGUgYXBwcm9wcmlhdGUgdHJhcCBpbnN0cnVjdGlvbiBhbmQKLSAgIGRpcmVjdGx5IHBlcmZvcm0gdGhlIHN5c3RlbSBjYWxsIG9uIGJlaGFsZiBvZiB0aGUgdGFyZ2V0IHByb2dyYW0uCi0gICBUaGlzIGlzIHRoZSB0eXBpY2FsIHdheSBvZiBoYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMuCi0gICBbSGFuZGxpbmcgc3lzdGVtIGNhbGxzIGZvciBlbWJlZGRlZCB0YXJnZXRzIGlzbid0IHRoYXQgbXVjaCBvZiBhbgotICAgb3h5bW9yb24gYXMgcnVubmluZyBjb21waWxlciB0ZXN0c3VpdGVzIG1ha2UgdXNlIG9mIHRoZSBjYXBhYmlsaXR5Ll0KLQotICAgVGhpcyBtZXRob2Qgb2Ygc3lzdGVtIGNhbGwgaGFuZGxpbmcgaXMgZG9uZSB3aGVuIFNUQVRFX0VOVklST05NRU5UCi0gICBpcyBFTlZJUk9OTUVOVF9VU0VSLgotCi0gICAyKSBIYXZlIGEgc2ltdWxhdG9yIGVtdWxhdGUgdGhlIGhhcmR3YXJlIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gICBJZiB0aGUgcHJvZ3JhbSBydW5uaW5nIG9uIHRoZSByZWFsIGhhcmR3YXJlIGNvbW11bmljYXRlcyB3aXRoIHNvbWUgc29ydAotICAgb2YgdGFyZ2V0IG1hbmFnZXIsIG9uZSB3b3VsZCB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHRoaXMgcHJvZ3JhbSBvbiB0aGUKLSAgIHNpbXVsYXRvciBhcyB3ZWxsLgotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX09QRVJBVElORy4KLSovCi0KLSNpZm5kZWYgQ0FMTEJBQ0tfSAotI2RlZmluZSBDQUxMQkFDS19ICi0KLS8qID8/PyBUaGUgcmVhc29uIHdoeSB3ZSBjaGVjayBmb3IgdmFfc3RhcnQgaGVyZSBzaG91bGQgYmUgZG9jdW1lbnRlZC4gICovCi0KLSNpZm5kZWYgdmFfc3RhcnQKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotDAotLyogTWFwcGluZyBvZiBob3N0L3RhcmdldCB2YWx1ZXMuICAqLwotLyogPz8/IEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9uZSBtaWdodCB3YW50IHRvIGFkZCBhIHN0cmluZyBvZiB0aGUKLSAgIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGhvc3RfdmFsOwotICBpbnQgdGFyZ2V0X3ZhbDsKLX0gQ0JfVEFSR0VUX0RFRlNfTUFQOwotCi0jZGVmaW5lIE1BWF9DQUxMQkFDS19GRFMgMTAKLQotLyogRm9yd2FyZCBkZWNsIGZvciBzdGF0L2ZzdGF0LiAgKi8KLXN0cnVjdCBzdGF0OwotCi10eXBlZGVmIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCBob3N0X2NhbGxiYWNrOwotCi1zdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgCi17Ci0gIGludCAoKmNsb3NlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50KSk7Ci0gIGludCAoKmdldF9lcnJubykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmlzYXR0eSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLSAgaW50ICgqbHNlZWspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBsb25nICwgaW50KSk7Ci0gIGludCAoKm9wZW4pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciosIGludCBtb2RlKSk7Ci0gIGludCAoKnJlYWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQsICBjaGFyICosIGludCkpOwotICBpbnQgKCpyZWFkX3N0ZGluKSBQQVJBTVMgKCggaG9zdF9jYWxsYmFjayAqLCBjaGFyICosIGludCkpOwotICBpbnQgKCpyZW5hbWUpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgaW50ICgqc3lzdGVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBsb25nICgqdGltZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBsb25nICopKTsKLSAgaW50ICgqdW5saW5rKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCp3cml0ZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgaW50ICgqd3JpdGVfc3Rkb3V0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0gIHZvaWQgKCpmbHVzaF9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCp3cml0ZV9zdGRlcnIpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0gIGludCAoKmZzdGF0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCwgc3RydWN0IHN0YXQgKikpOwotCi0gIC8qIFdoZW4gcHJlc2VudCwgY2FsbCB0byB0aGUgY2xpZW50IHRvIGdpdmUgaXQgdGhlIG9wb3J0dW5pdHkgdG8KLSAgICAgcG9sbCBhbnkgaW8gZGV2aWNlcyBmb3IgYSByZXF1ZXN0IHRvIHF1aXQgKGluZGljYXRlZCBieSBhIG5vbnplcm8KLSAgICAgcmV0dXJuIHZhbHVlKS4gKi8KLSAgaW50ICgqcG9sbF9xdWl0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBVc2VkIHdoZW4gdGhlIHRhcmdldCBoYXMgZ29uZSBhd2F5LCBzbyB3ZSBjYW4gY2xvc2Ugb3BlbgotICAgICBoYW5kbGVzIGFuZCBmcmVlIG1lbW9yeSBldGMgZXRjLiAgKi8KLSAgaW50ICgqc2h1dGRvd24pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCppbml0KSAgICAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0KLSAgLyogZGVwcmVjaWF0ZWQsIHVzZSB2cHJpbnRmX2ZpbHRlcmVkIC0gVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqcHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgLyogVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqdnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBTYW1lIGFzIHZwcmludGZfZmlsdGVyZWQgYnV0IHRvIHN0ZGVyci4gICovCi0gIHZvaWQgKCpldnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCAiZXhpdCIuCi0gICAgIEluIHRoZSBjYXNlIG9mIGdkYiAiZXhpdGluZyIgbWVhbnMgZG9pbmcgYSBsb25nam1wIGJhY2sgdG8gdGhlIG1haW4KLSAgICAgY29tbWFuZCBsb29wLiAgKi8KLSAgdm9pZCAoKmVycm9yKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgaW50IGxhc3RfZXJybm87CQkvKiBob3N0IGZvcm1hdCAqLwotCi0gIGludCBmZG1hcFtNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBmZG9wZW5bTUFYX0NBTExCQUNLX0ZEU107Ci0gIGNoYXIgYWx3YXlzb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLQotICAvKiBTeXN0ZW0gY2FsbCBudW1iZXJzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpzeXNjYWxsX21hcDsKLSAgLyogRXJybm8gdmFsdWVzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICplcnJub19tYXA7Ci0gIC8qIEZsYWdzIHRvIHRoZSBvcGVuIHN5c3RlbSBjYWxsLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpvcGVuX21hcDsKLSAgLyogU2lnbmFsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnNpZ25hbF9tYXA7Ci0gIC8qIExheW91dCBvZiBgc3RhdCcgc3RydWN0LgotICAgICBUaGUgZm9ybWF0IGlzIGEgc2VyaWVzIG9mICJuYW1lLGxlbmd0aCIgcGFpcnMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KLSAgICAgRW1wdHkgc3BhY2UgaXMgaW5kaWNhdGVkIHdpdGggYSBgbmFtZScgb2YgInNwYWNlIi4KLSAgICAgQWxsIHBhZGRpbmcgbXVzdCBiZSBleHBsaWNpdGx5IG1lbnRpb25lZC4KLSAgICAgTGVuZ3RocyBhcmUgaW4gYnl0ZXMuICBJZiB0aGlzIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGJpdHMsCi0gICAgIHVzZSAibmFtZS5iaXRzIi4KLSAgICAgRXhhbXBsZTogInN0X2Rldiw0OnN0X2lubyw0OnN0X21vZGUsNDouLi4iICAqLwotICBjb25zdCBjaGFyICpzdGF0X21hcDsKLQotICAvKiBNYXJrZXIgZm9yIHRob3NlIHdhbnRpbmcgdG8gZG8gc2FuaXR5IGNoZWNrcy4KLSAgICAgVGhpcyBzaG91bGQgcmVtYWluIHRoZSBsYXN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCB0byBoZWxwIGNhdGNoCi0gICAgIG1pc2NvbXBpbGF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUgSE9TVF9DQUxMQkFDS19NQUdJQyA0NzA1IC8qIHRlZHMgY29uc3RhbnQgKi8KLSAgaW50IG1hZ2ljOwotfTsKLQotZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKLQwKLS8qIENhbm9uaWNhbCB2ZXJzaW9ucyBvZiBzeXN0ZW0gY2FsbCBudW1iZXJzLgotICAgSXQncyBub3QgaW50ZW5kZWQgdG8gd2lsbHktbmlsbHkgdGhyb3cgZXZlcnkgc3lzdGVtIGNhbGwgZXZlciBoZWFyZAotICAgb2YgaW4gaGVyZS4gIE9ubHkgaW5jbHVkZSB0aG9zZSB0aGF0IGhhdmUgYW4gaW1wb3J0YW50IHVzZS4KLSAgID8/PyBPbmUgY2FuIGNlcnRhaW5seSBzdGFydCBhIGRpc2N1c3Npb24gb3ZlciB0aGUgb25lcyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgIGhlcmUsIGJ1dCB0aGF0IHdpbGwgYWx3YXlzIGJlIHRydWUuICAqLwotCi0vKiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgQU5TSSBDIHN1cHBvcnQgb2YgbGliYy4gICovCi0jZGVmaW5lCUNCX1NZU19leGl0CTEKLSNkZWZpbmUJQ0JfU1lTX29wZW4JMgotI2RlZmluZQlDQl9TWVNfY2xvc2UJMwotI2RlZmluZQlDQl9TWVNfcmVhZAk0Ci0jZGVmaW5lCUNCX1NZU193cml0ZQk1Ci0jZGVmaW5lCUNCX1NZU19sc2Vlawk2Ci0jZGVmaW5lCUNCX1NZU191bmxpbmsJNwotI2RlZmluZQlDQl9TWVNfZ2V0cGlkCTgKLSNkZWZpbmUJQ0JfU1lTX2tpbGwJOQotI2RlZmluZSBDQl9TWVNfZnN0YXQgICAgMTAKLS8qI2RlZmluZSBDQl9TWVNfc2JyawkxMSAtIG5vdCBjdXJyZW50bHkgYSBzeXN0ZW0gY2FsbCwgYnV0IHJlc2VydmVkLiAgKi8KLQotLyogQVJHViBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2FyZ3ZsZW4JMTIKLSNkZWZpbmUgQ0JfU1lTX2FyZ3YJMTMKLQotLyogVGhlc2UgYXJlIGV4dHJhcyBhZGRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2NoZGlyCTE0Ci0jZGVmaW5lIENCX1NZU19zdGF0CTE1Ci0jZGVmaW5lIENCX1NZU19jaG1vZCAJMTYKLSNkZWZpbmUgQ0JfU1lTX3V0aW1lIAkxNwotI2RlZmluZSBDQl9TWVNfdGltZSAJMTgKLQwKLS8qIFN0cnVjdCB1c2UgdG8gcGFzcyBhbmQgcmV0dXJuIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwZXJmb3JtIGEKLSAgIHN5c3RlbSBjYWxsLiAgKi8KLS8qIEZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIHRhcmdldCB3b3JkIHNpemUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjYl9zeXNjYWxsIHsKLSAgLyogVGhlIHRhcmdldCdzIHZhbHVlIG9mIHdoYXQgc3lzdGVtIGNhbGwgdG8gcGVyZm9ybS4gICovCi0gIGludCBmdW5jOwotICAvKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBzeXNjYWxsLiAgKi8KLSAgbG9uZyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0OwotCi0gIC8qIFRoZSByZXN1bHQuICAqLwotICBsb25nIHJlc3VsdDsKLSAgLyogU29tZSBzeXN0ZW0gY2FsbHMgaGF2ZSB0d28gcmVzdWx0cy4gICovCi0gIGxvbmcgcmVzdWx0MjsKLSAgLyogVGhlIHRhcmdldCdzIGVycm5vIHZhbHVlLCBvciAwIGlmIHN1Y2Nlc3MuCi0gICAgIFRoaXMgaXMgY29udmVydGVkIHRvIHRoZSB0YXJnZXQncyB2YWx1ZSB3aXRoIGhvc3RfdG9fdGFyZ2V0X2Vycm5vLiAgKi8KLSAgaW50IGVycmNvZGU7Ci0KLSAgLyogV29ya2luZyBzcGFjZSB0byBiZSB1c2VkIGJ5IG1lbW9yeSByZWFkL3dyaXRlIGNhbGxiYWNrcy4gICovCi0gIFBUUiBwMTsKLSAgUFRSIHAyOwotICBsb25nIHgxLHgyOwotCi0gIC8qIENhbGxiYWNrcyBmb3IgcmVhZGluZy93cml0aW5nIG1lbW9yeSAoZS5nLiBmb3IgcmVhZC93cml0ZSBzeXNjYWxscykuCi0gICAgID8/PyBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbWlnaHQgYmUgYmV0dGVyIHRvIHVzZSBmb3IgdGhlIGBjb3VudCcKLSAgICAgYXJndW1lbnQgaGVyZS4gIFdlIG1pbWljIHNpbV97cmVhZCx3cml0ZX0gZm9yIG5vdy4gIEJlIGNhcmVmdWwgdG8KLSAgICAgdGVzdCBhbnkgY2hhbmdlcyB3aXRoIC1XYWxsIC1XZXJyb3IsIG1peGVkIHNpZ25lZCBjb21wYXJpc29ucwotICAgICB3aWxsIGdldCB5b3UuICAqLwotICBpbnQgKCpyZWFkX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY2hhciAqIC8qYnVmKi8sCi0JCQkgICBpbnQgLypieXRlcyovKSk7Ci0gIGludCAoKndyaXRlX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICAgdW5zaWduZWQgbG9uZyAvKnRhZGRyKi8sIGNvbnN0IGNoYXIgKiAvKmJ1ZiovLAotCQkJICAgIGludCAvKmJ5dGVzKi8pKTsKLQotICAvKiBGb3Igc2FuaXR5IGNoZWNraW5nLCBzaG91bGQgYmUgbGFzdCBlbnRyeS4gICovCi0gIGludCBtYWdpYzsKLX0gQ0JfU1lTQ0FMTDsKLQotLyogTWFnaWMgbnVtYmVyIHNhbml0eSBjaGVja2VyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTQ0FMTF9NQUdJQyAweDEyMzQ0MzIxCi0KLS8qIE1hY3JvIHRvIGluaXRpYWxpemUgQ0JfU1lTQ0FMTC4gIENhbGxlZCBmaXJzdCwgYmVmb3JlIGZpbGxpbmcgaW4KLSAgIGFueSBmaWVsZHMuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX0lOSVQoc2MpIFwKLWRvIHsgXAotICBtZW1zZXQgKChzYyksIDAsIHNpemVvZiAoKihzYykpKTsgXAotICAoc2MpLT5tYWdpYyA9IENCX1NZU0NBTExfTUFHSUM7IFwKLX0gd2hpbGUgKDApCi0MCi0vKiBSZXR1cm4gY29kZXMgZm9yIHZhcmlvdXMgaW50ZXJmYWNlIHJvdXRpbmVzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgQ0JfUkNfT0sgPSAwLAotICAvKiBnZW5lcmljIGVycm9yICovCi0gIENCX1JDX0VSUiwKLSAgLyogZWl0aGVyIGZpbGUgbm90IGZvdW5kIG9yIG5vIHJlYWQgYWNjZXNzICovCi0gIENCX1JDX0FDQ0VTUywKLSAgQ0JfUkNfTk9fTUVNCi19IENCX1JDOwotCi0vKiBSZWFkIGluIHRhcmdldCB2YWx1ZXMgZm9yIHN5c3RlbSBjYWxsIG51bWJlcnMsIGVycm5vIHZhbHVlcywgc2lnbmFscy4gICovCi1DQl9SQyBjYl9yZWFkX3RhcmdldF9zeXNjYWxsX21hcHMgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IHN5c2NhbGwgZnVuY3Rpb24gbnVtYmVycy4gICovCi1pbnQgY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCB0byB0YXJnZXQgZXJybm8gdmFsdWUuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X2Vycm5vIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgdG8gaG9zdCBvcGVuIGZsYWdzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9vcGVuIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgc2lnbmFsIG51bWJlciB0byBob3N0LiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zaWduYWwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGhvc3Qgc2lnbmFsIG51bWJlciB0byB0YXJnZXQuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzdGF0IHN0cnVjdCB0byB0YXJnZXQuCi0gICBJZiBzdGF0IHN0cnVjdCBwdHIgaXMgTlVMTCwganVzdCBjb21wdXRlIHRhcmdldCBzdGF0IHN0cnVjdCBzaXplLgotICAgUmVzdWx0IGlzIHNpemUgb2YgdGFyZ2V0IHN0YXQgc3RydWN0IG9yIDAgaWYgZXJyb3IuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqLCBQVFIpKTsKLQotLyogUGVyZm9ybSBhIHN5c3RlbSBjYWxsLiAgKi8KLUNCX1JDIGNiX3N5c2NhbGwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBDQl9TWVNDQUxMICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nIGIvaW5jbHVkZS9jb2ZmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2Y2ExOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTE1ICswLDAgQEAKLTIwMDAtMDQtMTcgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0JCi0JKiB0aS5oOiBMb2FkIHBhZ2UgY2xlYW51cC4KLQkqIGludGVudGFsLmg6IEFkZCBsb2FkIHBhZ2UgZmllbGQuCi0JCi1Nb24gQXByIDE3IDE2OjQ0OjAxIDIwMDAgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBwZS5oIChQRVA2NEFPVVRIRFIpOiBOZXcgaGVhZGVyIGZvciBQRSsuCi0JKFBFUDY0QU9VVFNaKTogTmV3IG1hY3JvLgotCShJTUFHRV9TVUJTWVNURU1fVU5LTk9XTik6IE5ldyBtYWNyby4KLQkoSU1BR0VfU1VCU1lTVEVNX05BVElWRSk6IERpdHRvLgotCShJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUkpOiBEaXR0by4KLQkoSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ1VJKTogRGl0dG8uCi0JKElNQUdFX1NVQlNZU1RFTV9QT1NJWF9DVUkpOiBEaXR0by4KLQkoSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ0VfR1VJKTogRGl0dG8uCi0JKElNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT04pOiBEaXR0by4KLQkoSU1BR0VfU1VCU1lTVEVNX0VGSV9CT09UX1NFUlZJQ0VfRFJJVkVSKTogRGl0dG8uCi0JKElNQUdFX1NVQlNZU1RFTV9FRklfUlVOVElNRV9EUklWRVIpOiBEaXR0by4KLQkqIGludGVybmFsLmggKFBFX0RFRl9GSUxFX0FMSUdOTUVOVCk6IERlZmluZSBvbmx5IGlmIG5vdCBkZWZpbmVkCi0JYWxyZWFkeS4KLQkqIGlhNjQuaDogTmV3IGZpbGUuCi0KLTIwMDAtMDQtMTMgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIHRpLmggKEFERFJfTUFTSyk6IERvbid0IHVzZSB1bCBzdWZmaXggb24gY29uc3RhbnRzLgotCShQR19NQVNLKTogRGl0dG8uCi0KLTIwMDAtMDQtMTEgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0KLQkqIHRpLmg6IFJlbW92ZSBsb2FkIHBhZ2UgcmVmZXJlbmNlcyB1bnRpbCBsb2FkIHBhZ2VzIGFyZQotCXJlaW1wbGVtZW50ZWQuIAotCSogdGljNTR4Lmg6IERpdHRvLgotCQotMjAwMC0wNC0wNyAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogRml4IHNvbWUgY29tbWVudHMgcmVsYXRlZCB0byBUSSBDT0ZGIChpbnN0ZWFkIG9mIHRpYzgwKS4KLQkqIHRpLmg6IE5ldy4KLQkqIHRpYzU0eC5oOiBOZXcuCi0JCi1XZWQgQXByICA1IDIyOjA4OjQxIDIwMDAgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogc2guaCAoUl9TSF9MT09QX1NUQVJULCBSX1NIX0xPT1BfRU5EKTogRGVmaW5lLgotCi0yMDAwLTAzLTE1ICBLYXp1IEhpcmF0YSAgPGthenVAaHhpLmNvbT4KLQotCSogaW50ZXJuYWwuaDogRml4IGEgdHlwbyBpbiB0aGUgY29tbWVudCBmb3IgUl9NT1ZMMi4KLQotMjAwMC0wMi0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWlwc3BlLmggKE1JUFNfUEVfTUFHSUMpOiBEZWZpbmUuCi0JKiBzaC5oIChTSF9QRV9NQUdJQyk6IERlZmluZS4KLQotMjAwMC0wMi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4gIERKIERlbG9yaWUgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHNoLmg6IEFkZCBXaW5kb3dzIENFIGRlZmluaXRpb25zLgotCSogYXJtLmg6IEFkZCBXaW5kb3dzIENFIGRlZmluaXRpb25zLgotCSogbWlwc3BlLmg6IE5ldyBmaWxlOiBXaW5kb3dzIENFIGRlZmluaXRpb25zIGZvciBNSVBTLgotCSogcGUuaDogQWRkIGNvbnN0YW50cyBmb3IgSUxGIHN1cHBvcnQuCi0JCi0yMDAwLTAxLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZS5oOiBGaXggZm9ybWF0dGluZyBvZiBjb21tZW50cy4KLQkoSU1BR0VfRklMRV9BR0dSRVNTSVZFX1dTX1RSSU0pOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTEFSR0VfQUREUkVTU19BV0FSRSk6IERlZmluZS4KLQkoSU1BR0VfRklMRV8xNkJJVF9NQUNISU5FKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX1JFTU9WQUJMRV9SVU5fRlJPTV9TV0FQKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX1VQX1NZU1RFTV9PTkxZKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTik6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfQUxQSEE2NCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX0kzODYpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9JQTY0KTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfTTY4Syk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX01JUFMxNik6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVMTYpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfUjMwMDApOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1IxMDAwMCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1NIMyk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1NINCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1RIVU1CKTogRGVmaW5lLgotCi0xOTk5LTA5LTIwICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGludGVybmFsLmg6IERlbGV0ZSBib2d1cyBSX1BDTE9ORywgZHVwbGljYXRlIFJfUkVMQllURSBhbmQKLQlSX1JFTFdPUkQsIGFuZCByZXdyaXRlIHNvbWUgUl8qIGFzIGRlY2ltYWwuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBpbnRlcm5hbC5oIChEVFlQRSk6IERlZmluZS4KLQkqIHBlLmggKHN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkcik6IFJlbmFtZSBmcm9tCi0JZXh0ZXJuYWxfUEVfZmlsZWhkci4gIERlZmluZSBldmVuIGlmIENPRkZfSU1BR0VfV0lUSF9QRSBpcyBub3QKLQlkZWZpbmVkLgotCi0xOTk5LTA3LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoRl9TT0ZUX0ZMT0FUKTogUmVuYW1lIGZyb20gRl9TT0ZURkxPQVQuCi0KLTE5OTktMDYtMjEgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBhcm0uaCAoRl9TT0ZURkxPQVQpOiBEZWZpbmUuCi0KLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChGX0FSTV81KTogRGVmaW5lLgotCi1XZWQgSnVuICAyIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEJFT1NfRVhFX0lNQUdFX0JBU0UsIEJFT1NfRExMX0lNQUdFX0JBU0UpOiBOZXcuCi0KLU1vbiBNYXkgMTcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDLCBGX0FSTV8yLCBGX0FSTV8yYSwgRl9BUk1fMywgRl9BUk1fM00sCi0JRl9BUk1fNCwgRl9BUk1fNFQsIEZfQVBDUzI2KTogQ2hhbmdlZCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKLQlGX0FSTV8yYSwgRl9BUk1fM00sIEZfQVJNXzRULgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChJTUFHRV9SRUxfTUNPUkVfUlZBKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChHRVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCi0JKFBVVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGEncyBNQ29yZQotCXByb2Nlc3Nvci4gCi0KLVN1biBEZWMgIDYgMjE6MzY6MzcgMTk5OCAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBpbnRlcm5hbC5oIChDX1dFQUtFWFQpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDX0lOVCwgRl9BUk1fMiwgRl9BUk1fMywgRl9BUk1fNCwgRl9BUENTMjYpOgotCUNoYW5nZWQgdmFsdWVzIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggSU1BR0VfRklMRV8qIGNvZmYgaGVhZGVyCi0JZmxhZyB2YWx1ZXMuCi0JCi1XZWQgQXByICAxIDE2OjA2OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IERvY3VtZW50IG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIFRodW1iIHN5bWJvbAotCXR5cGVzLiAKLQotRnJpIE1hciAyNyAxNzoxNjo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKElTUFRSLCBJU0ZDTiwgSVNBUlkpOiBBZGQgY2FzdHMgdG8gdW5zaWduZWQgbG9uZy4KLQotTW9uIEZlYiAgMiAxNzoxMDozOCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC5oOiBOZXcgZmlsZS4KLQotRnJpIERlYyAxMiAxMTo0OTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9NUFBDUjE1Vyk6IE5ldyByZWxvY2F0aW9uIHR5cGUsIGZvciAxNSBiaXQgUEMgcmVsYXRpdmUKLQlvZmZzZXRzLgotCi1UdWUgRGVjICAyIDEwOjIxOjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChDT0ZGQVJNKTogTmV3IGRlZmluZS4KLQotU2F0IE5vdiAyMiAxNToxMDoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1RIVU1CRVhURlVOQywgQ19USFVNQlNUQVRGVU5DKTogQ29uc3RhbnRzIHRvCi0JZGVmaW5lIHN0YXRpYyBhbmQgZXh0ZXJuYWwgZnVuY3Rpb25zLgotCi0JKiBhcm0uaDogQWRkIGJpdHMgdG8gc3VwcG9ydCBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcywKLQl3aGVuIGltcGxlbWVudGVkLgotCi1GcmkgT2N0ICAzIDE0OjI1OjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IE1ha2UgY29uc3RhbnQgdXBwZXJjYXNlIGZvciBjb25zaXN0ZW5jeS4KLQotVHVlIEp1bCAyMiAxODoxODo1OCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGdvMzJleGUuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdWwgIDggMTI6MjM6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX1RBUkdFVF9JRCk6IEFkZCBkZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkcik6IEFkZCBmX3RhcmdldF9pZCBmaWVsZC4KLQotVHVlIEp1biAgMyAxNjo0NDoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBBZGQgc3RvcmFnZSBjbGFzc2VzIGZvciBUaHVtYiBzeW1ib2xzCi0KLU1vbiBNYXkgMjYgMTQ6MDc6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IENvcnJlY3QgdmFsdWUuCi0KLVNhdCBNYXkgIDMgMDg6MjQ6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfVUVYVCwgQ19TVEFUTEFCLCBDX0VYVExBQiwgQ19TWVNURU0pOgotCU5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwLgotCi1GcmkgQXByIDE4IDExOjUyOjU1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFscGhhLmggKEFMUEhBX0VDT0ZGX0JBRE1BRyk6IFJlY29nbml6ZSAqQlNEL2FscGhhIG1hZ2ljIHRvby4KLQkoQUxQSEFfUl9MSVRFUkFMU0xFQVpZKTogRGVmaW5lLgotCSogZWNvZmYuaCAoQUxQSEFfTUFHSUNfQlNEKTogRGVmaW5lLgotCi1XZWQgSmFuIDI5IDExOjMxOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChSX0lQUjEzLCBSX0FMSUdOKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDEzOjM0OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IE1vdmUgZGVmaW5pdGlvbnMKLQlmcm9tIGhlcmUuLi4KLQkqIGk5NjAuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IC4uLnRvIGhlcmUuCi0KLVdlZCBKYW4gMjIgMjA6MTA6NDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwTUFHSUMpOiBSZW5hbWVkIHRvIFRJQzgwX0FPVVRIRFJfTUFHSUMuCi0KLUZyaSBEZWMgMjcgMjI6MDU6NDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCi1UaHUgRGVjIDE5IDE2OjE4OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKF9MSVQpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjggMTI6NTQ6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oIChGSUxIU1opOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjYgMTY6MjQ6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IERlZmluZSBGSUxIU1osIEFPVVRTWiwgQU9VVEhEUlNaLCBTQ05IU1osIFNZTUVTWiwKLQlBVVhFU1osIExJTkVTWiwgUkVMU1ogYXMgbnVtZXJpYyBjb25zdGFudHMgcmF0aGVyIHRoYW4gdXNlcyBvZgotCXNpemVvZi4gIERlZmluZSBBT1VUSERSU1ogaW4gYWxsIGZpbGVzLgotCSogcGUuaCAoQU9VVFNaKTogRGVmaW5lIGJ5IGFkZGluZyB0byBBT1VUSERSU1ouCi0KLUZyaSBKdW4gMjEgMTE6MTc6NDYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IEFkZCBkZWNsYXJhdGlvbnMgZm9yIHJlbG9jYXRpb24gdHlwZXMgYWRkZWQgZm9yIEFscGhhCi0gCU9TRi8xIDMuMC4KLQotVHVlIEp1biAxOCAxNjowNDoyOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaCAoSDgzMDBTTUFHSUMpOiBEZWZpbmUuCi0JKEg4MzAwU0JBRE1BRyk6IERlZmluZS4KLQotTW9uIEp1biAxMCAxMTo1MzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfQkNDX0lOViwgUl9KTVBfREVMKTogTmV3IHJlbG9jYXRpb25zIGZvcgotCXJlbGF4aW5nIGluIHRoZSBIOC8zMDAgc2VyaWVzLgotCi1UaHUgTWF5IDE2IDE1OjQ5OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2guaCAoUl9TSF9DT0RFLCBSX1NIX0RBVEEsIFJfU0hfTEFCRUwpOiBEZWZpbmUuCi0KLVR1ZSBNYXkgIDcgMDA6MzY6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0pNUEwyKTogUmVuYW1lZCBmcm9tIFJfSk1QTF9COCB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBvdGhlciBzaW1pbGFyIHJlbG9jcy4KLQotCSogaW50ZXJuYWwuaCAoSDgvMzAwIHNwZWNpZmljIHJlbG9jcyk6IEFkZCBjb21tZW50cyBiZXR0ZXIKLQlleHBsYWluaW5nIHdoYXQgZWFjaCByZWxvYyBpcyB1c2VkIGZvci4KLQkoUl9NT1YxNkIxLCBSX01PVjE2QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZCMSBhbmQgUl9NT1ZCMi4KLQkoUl9NT1YyNEIxLCBSX01PVjI0QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZMQjEgYW5kIFJfTU9WTEIyLgotCShSX01PVkwxLCBSX01PVkwyKTogTmV3IHJlbG9jcy4KLQkKLUZyaSBNYXkgIDMgMTM6MDE6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX1BDUldPUkRfQik6IERlZmluZSBmb3IgdGhlIGg4MzAwIHJlbGF4aW5nCi0JbGlua2VyLgotCi1XZWQgTWF5ICAxIDE5OjIxOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoU0NOTk1MRU4pOiBEZWZpbmUuCi0JKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIpOiBVc2UgU0NOTk1MRU4gZm9yIHNfbmFtZSBmaWVsZC4KLQotRnJpIE1hciAyOSAxMzo0MToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IERlZmluZSBJTUFHRV9DT01EQVQgY29kZXMuCi0KLVdlZCBNYXIgMjcgMTc6Mjk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0uaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogQWRkIHhfY2hlY2tzdW0sIHhfYXNzb2NpYXRlZCwgYW5kCi0JeF9jb21kYXQgZmllbGRzIHRvIHhfc2NuIHN0cnVjdC4KLQkqIGkzODYuaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0JKiBwb3dlcnBjLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTY6MjU6NTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IEFkZCBjYWNoaW5nIGZpZWxkcy4KLQotVGh1IE1hciAxNCAxNToyMjo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfTUVNX0lORElSRUNUKTogTmV3IHJlbG9jIGZvciB0aGUgaDgzMDAuCi0gCi1GcmkgRmViICA5IDEwOjQ0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXV4LWNvZmYuaDogUmVuYW1lIGZyb20gYXV4LmgsIHRvIGF2b2lkIHByb2JsZW1zIG9uIGhhcGxlc3MgRE9TCi0Jc3lzdGVtcyB3aGljaCB0aGluayB0aGF0IGF1eCBpcyBhIGNvbSBwb3J0LgotCi1Nb24gRmViICA1IDE4OjM1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChGX0k5NjBIWCk6IERlZmluZS4KLQotV2VkIEphbiAzMSAxMzoxMTo1NCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYXV4Lmg6IE5ldyBmaWxlLgotCSogaW50ZXJuYWwuaCwgbTY4ay5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi1XZWQgTm92IDIyIDEzOjQ4OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoX1JDT05TVCwgU1RZUF9SQ09OU1QsIFJFTE9DX1NFQ1RJT05fUkNPTlNUKTogRGVmaW5lLgotCShOVU1fUkVMT0NfU0VDVElPTlMpOiBVcGRhdGUuCi0JKiBzeW1jb25zdC5oIChzY1JDb25zdCk6IERlZmluZS4KLQotVHVlIE5vdiAxNCAxODo1NDoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfTlRfV0VBSyk6IERlZmluZS4KLQotVGh1IE5vdiAgOSAxNDowODozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTVFlQX09WUkZMTyk6IERlZmluZS4KLQotVHVlIE5vdiAgNyAxNDozODo0NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi9wb3dlcnBjLmggKElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyk6IEFkZGVkIGRlZmluZS4KLQkqIGNvZmYvcGUuaDogQWRkZWQgZGVmaW5lcyBmb3IgZmlsZSBsZXZlbCBmbGFncwotCi1Nb24gTm92ICA2IDE3OjI4OjAxIDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogaTg2MC5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaTM4Ni5oLgotCi1XZWQgTm92ICAxIDE1OjI1OjE4IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBtNjhrLmggKFBBR0VNQUdJQ0VYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1NXQVBQRUQpOiBEZWZpbmUuCi0JKFBBR0VNQUdJQ1BFWEVDVFNITElCKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1BBR0VEKTogRGVmaW5lLgotCShfQ09NTUVOVCk6IERFRklORS4KLQkqIG04OGsuaCAoX0NPTU1FTlQpOiBEZWZpbmUuCi0KLVdlZCBPY3QgMTggMTg6MzY6MTkgMTk5NSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc3ltLmg6ICNpZiAwJ2Qgb3V0IHJ1bnRpbWVfcGRyIHN0cnVjdCBiZWNhdXNlIGl0IGNob2tlcyAKLQlWaXN1YWwgQysrIGFuZCB0aGVyZSBhcmVuJ3QgYW55IHJlZmVyZW5jZXMgdG8gaXQgZWxzZXdoZXJlIGluIGdkYi4KLQotTW9uIE9jdCAxNiAxMToxMjoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTTUFMTF9BT1VUU1opOiBEZWZpbmUuCi0KLQkqIGludGVybmFsLmggKFhNQ19URCk6IERlZmluZS4KLQotVHVlIE9jdCAxMCAxODo0MTowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fY3B1dHlwZSBmaWVsZC4KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogUmVuYW1lIG9fcmVzdjEgdG8gb19jcHV0eXBlLgotCi1Nb24gT2N0ICA5IDE0OjQ1OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLmggKEFPVVRIRFIpOiBBZGQgb19tYXhkYXRhIGZpZWxkLiAgQWRkIGNvbW1lbnRzLgotCShfUEFELCBfTE9BREVSKTogRGVmaW5lLgotCShTVFlQX0xPQURFUik6IERlZmluZS4KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4KLQotVGh1IE9jdCAgNSAxMDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmg6IERlZmluZSBzZWN0aW9uIG5hbWUgbWFjcm9zIGFuZCBTVFlQIG1hY3JvcyBmb3IgdmFyaW91cwotCUFscGhhIHNlY3Rpb25zOiAuZ290LCAuaGFzaCwgLmR5bnN5bSwgLmR5bnN0ciwgLnJlbC5keW4sIC5jb25mbGljLAotCS5jb21tZW50LCAubGlibGlzdCwgLmR5bmFtaWMuCi0KLVdlZCBPY3QgIDQgMTA6NTY6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IE1vdmVkIERPU01BR0lDIGFuZCBOVF9TSUdOQVRVUkUgZGVmaW5lcyBoZXJlCi0JKiBwb3dlcnBjLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JQWxzbyByZW1vdmVkIG90aGVyIHVudXNlZCBkZWZpbmVzICh2YXJpb3VzIE1BR0lDIG9uZXMpCi0JKiBpMzg2Lmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcm0uaDogcmVtb3ZlZCBET1NNQUdJQywgTlRfU0lHTkFUVVJFLCBhbmQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFwb2xsby5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogYWxwaGEuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGg4NTAwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODMwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaTk2MC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTg4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogd2UzMmsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHJzNjAwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbWlwcy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTY4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogejhrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiB3NjUuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHNwYXJjLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzaC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCi1GcmkgU2VwIDI5IDA4OjQwOjA4IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwb3dlcnBjLmg6IFJlZm9ybWF0dGVkIHRvIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0KLVdlZCBTZXAgMjcgMDY6NTA6NTAgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogcGUuaDogYWRkZWQgZGVmaW5lcyBmb3IgbW9yZSBzZWN0aW9uIGNoYXJhY3RlcmlzdGljcwotCSogcG93ZXJwYy5oIChuZXcgZmlsZSk6IGJhc2UgY29mZiBkZWZpbml0aW9ucyBmb3IgcHBjIFBFCi0KLVR1ZSBTZXAgMTIgMTI6MDg6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KTogQ2hhbmdlIG5fbnVtYXV4IGZpZWxkIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBTZXAgIDEgMTU6Mzk6MzYgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IHJwZHJfZXh0KTogRGVmaW5lLgotCi1UaHUgQXVnIDMxIDE2OjUxOjUwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIsIGludGVybmFsX2ZpbGVoZHIpOgotCWRvbid0IGluZGlyZWN0IHRoZSBwZSBzdHVmZi4KLQotVHVlIEF1ZyAyOSAxNDoxNjowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpMzg2LmggKE5UX0RFRl9SRVNFUlZFLCBOVF9ERUZfQ09NTUlUKTogTWFrZSB0aGUgc2FtZQotCWFzICd0aGUgb3RoZXInIGNvbXBpbGVyLgotCSogaW50ZXJuYWwuaCAoTlRfSU1BR0VfQkFTRSk6IERlbGV0ZWQuCi0JKE5UX0VYRV9JTUFHRV9CQVNFLCBOVF9ETExfSU1BR0VfQkFTRSk6IE5ldy4KLQkoUEVfREVGX1NFQ1RJT05fQUxJR05NRU5ULCBQRV9ERUZfRklMRV9BTElHTk1FTlQpOiBOZXcuCi0JKFJfSU1BR0VCQVNFKTogTmV3LgotCi1Nb24gQXVnIDIxIDE4OjEyOjE5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9maWxlaGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIuCi0JKGludGVybmFsX2FvdXRoZHIpOiBNb3ZlZCBQRSBzdHVmZiBpbnRvCi0JaW50ZXJhbmxfZXh0cmFfcGVfYW91dGhkci4KLQotTW9uIEp1bCAyNCAxNDowNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IE1vdmUgUl9TSF8qIHJlbG9jcyBmcm9tIGhlcmUuLi4KLQkqIHNoLmg6IC4uLnRvIGhlcmUuCi0JKFJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIpOiBEZWZpbmUuCi0JKFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgUl9TSF9BTElHTik6IERlZmluZS4KLQotVGh1IEp1biAyOSAwMDowNDoyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IEluY3JlYXNlIGEgbG90LgotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZQotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE5vdyBleHRlcm4uCi0KLVR1ZSBGZWIgMTQgMTc6NTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKTogRGVmaW5lLgotCi1TYXQgRmViICA0IDE0OjM4OjAzIDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogc3ltLmggKHN0cnVjdCBwZHIpOiBmaWVsZCAicHJvZiIgYWRkZWQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTMV9QUk9GXyopOiBhZGRlZCwgbWFjcm9zIGZvciBQRFJfQklUUypfUkVTRVJWRURfKgotCXVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBKYW4gMTUgMTg6Mzg6MzMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHc2NS5oOiBOZXcgZmlsZS4KLQotV2VkIE5vdiAyMyAyMjo0MzozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDX0JJRywgU0hfQVJDSF9NQUdJQ19MSVRUTEUpOiBOZXcuCi0JKFNIQkFETUFHKTogQ2hhbmdlZCB0byBzdWl0LgotCi1UdWUgSnVsIDI2IDE3OjQ2OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoRl9JOTYwSlgpOiBOZXcgbWFjcm8uCi0KLVdlZCBKdWwgIDYgMDA6NDg6NTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS5oOiAgQWRkIGRlZmluaXRpb25zIGZvciBhbHBoYSBmaWxlIGhlYWRlciBmbGFncywgZW5jb2RpbmcKLQl0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIGZpbGUuCi0KLU1vbiBKdW4gMjAgMTM6NDc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zd2FwX3Rpcl9pbik6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCk6IEFkZCBuZXcgZmllbGRzOiBzd2FwX3Rpcl9pbiwKLQlzd2FwX3JuZHhfaW4sIHN3YXBfdGlyX291dCwgc3dhcF9ybmR4X291dCwgcmVhZF9kZWJ1Z19pbmZvLgotCi1TdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZSBmb3Igc3RJbmRpcmVjdC4KLQotRnJpIEFwciAyMiAxMzowNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8pOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDKTogUmVuYW1lIGZyb20gU0hNQUdJQy4gIFNITUFHSUMgaXMgdXNlZCBieQotCXNldmVyYWwgdGFyZ2V0cyB0byBtZWFuIGEgc2hhcmVkIGxpYnJhcnkuCi0JKFNIQkFETUFHKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVRodSBBcHIgMTQgMTM6MDA6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfQklHKTogQ2hhbmdlZCBmcm9tIDB4MWUgdG8gMHgzZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSk6IERlZmluZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRSk6IERlZmluZS4KLQkoTUlQU19SX1BDUkVMMTYpOiBDaGFuZ2UgdmFsdWUgZnJvbSA4IHRvIDEyIHRvIG1hdGNoIElyaXggNC4KLQkoTUlQU19SX1JFTEhJKTogRGVmaW5lLgotCShNSVBTX1JfUkVMTE8pOiBEZWZpbmUuCi0JKE1JUFNfUl9TV0lUQ0gpOiBDaGFuZ2UgdmFsdWUgZnJvbSA5IHRvIDIyLgotCi1UaHUgQXByICA3IDE0OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfU1dJVENIKTogRGVmaW5lLgotCi1UaHUgTWFyIDMxIDE5OjI4OjMzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIpOiBBZGRlZCBjb21tZW50cyBmb3IgQXBvbGxvIGZpZWxkcy4KLQotVGh1IE1hciAzMSAxNjoyODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRUNPRkZfTElCKTogRGVmaW5lIGFzIHVzZWQgb24gSXJpeCA0LgotCi1GcmkgTWFyIDI1IDE3OjE2OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8pOiBBZGQgYWRqdXN0IGZpZWxkLgotCShzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0KTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjIyOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfUENSRUwxNik6IERlZmluZS4KLQotU2F0IEZlYiAyNiAxMDoyNjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmg6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0KLU1vbiBGZWIgMjEgMDk6NDg6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIHN5bS5oIChzdHJ1Y3QgcnVudGltZV9wZHIpOiBNYWtlIGZpZWxkIGFkciBiZmRfdm1hLCBub3QgdW5zaWduZWQKLQlsb25nLgotCShTWU1SKTogTWFrZSBmaWVsZCB2YWx1ZSBiZmRfdm1hLCBub3QgbG9uZy4KLQotRnJpIEZlYiAgNCAyMzozNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oIChTVFlQX0RFQlVHKTogRGVmaW5lLgotCi1XZWQgRmViICAyIDE0OjMxOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogQ2hhbmdlIHhfY3NlY3QueF9zY25sZW4gaW50bwotCWEgdW5pb24gb2YgYSBsb25nIGFuZCBhIHBvaW50ZXIgdG8gYSBzeW1ib2wuICBYQ09GRiBzb21ldGltZXMgdXNlcwotCXRoaXMgZmllbGQgYXMgYSBzeW1ib2wgaW5kZXguCi0KLU1vbiBKYW4gMTAgMjM6NTQ6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9kZWJ1Z19pbmZvKTogUmVtb3ZlIGZpZWxkcyBsaW5lX2VuZCwKLQlleHRlcm5hbF9kbnJfZW5kLCBleHRlcm5hbF9wZHJfZW5kLCBleHRlcm5hbF9zeW1fZW5kLAotCWV4dGVybmFsX29wdF9lbmQsIGV4dGVybmFsX2F1eF9lbmQsIHNzX2VuZCwgZXh0ZXJuYWxfZmRyX2VuZC4KLQlSZXBsYWNlIGlmZGJhc2Ugd2l0aCBpZmRtYXAuCi0KLVdlZCBKYW4gIDUgMTc6MDU6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRVhURU5ERVNDLCBTVFlQX0NPTU1FTlQsIFNUWVBfWERBVEEsIFNUWVBfUERBVEEpOgotCURlZmluZS4KLQotV2VkIEphbiAgNSAxNjo1ODoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKE5VTV9SRUxPQ19TRUNUSU9OUyk6IERlZmluZS4KLQotVHVlIERlYyAyMSAwOToyNDo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IFJlbmFtZSBmaWVsZCByX2FkZGVuZCB0bwotCXJfb2Zmc2V0LgotCi1TYXQgRGVjIDExIDE2OjEyOjMyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0RJU1A3LCBSX1NIX0lNTTE2KTogTmV3IHJlbG9jIHR5cGVzLgotCi1UdWUgTm92IDIzIDE0OjIzOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGRlZCAqX2VuZCBmaWVsZHMgZm9yIGFsbAotCXRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBwb2ludGVycy4KLQotCSogc3ltLmg6IE5hbWVkIHRoZSBFWFRSIHN0cnVjdHVyZSBlY29mZl9leHRyLgotCi1GcmkgTm92IDE5IDA4OjIxOjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChSRUxTWik6IFVzZSBjb3JyZWN0IHNpemUuCi0KLVdlZCBOb3YgMTcgMTc6MTg6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogRGVmaW5lLgotCi1UdWUgTm92ICAyIDE3OjU2OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmUuCi0KLVRodSBPY3QgMjggMTc6MDc6NTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKEkzODZMWU5YTUFHSUMpOiBSZW5hbWUgdG8gTFlOWENPRkZNQUdJQy4KLQkqIG02OGsuaCAoTFlOWENPRkZNQUdJQyk6IERlZmluZS4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UdWUgT2N0IDE5IDE1OjM0OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoZXh0ZXJuYWxfYW91dGhkcik6IFNwbGl0IGZvdXIgYnl0ZSBwYWRkaW5nIGZpZWxkIGludG8KLQl0d28gYnl0ZSBibGRyZXYgZmllbGQgYW5kIHR3byBieXRlIHBhZGRpbmcgZmllbGQuCi0KLQkqIGVjb2ZmLmggKF9MSVRBLCBfUERBVEEsIF9YREFUQSwgU1RZUF9MSVRBKTogRGVmaW5lZC4KLQotV2VkIE9jdCAxMyAxNTo1MjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCVN1biBPY3QgMTAgMTc6Mjc6MTAgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotCi0JKiBjb2ZmL2ludGVybmFsLmg6IEFkZGVkIG9fc3JpLCBvX2lubGliIGFuZCBvX3ZpZCBmb3IgQXBvbGxvcwotCQkJYXMgd2VsbCBhcyBSX0RJUjE2LgotCi0JKiBjb2ZmL2Fwb2xsby5oOiBOZXcgZmlsZQotCi1Nb24gT2N0IDExIDE3OjE2OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVHSU5GTywgc3RydWN0IGVjb2ZmX3JlZ2luZm8pOiBEZWZpbmUuCi0KLVR1ZSBPY3QgIDUgMTA6NTI6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oOiBDaGFuZ2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbAotCWVzY2FwZXMuCi0KLVR1ZSBTZXAgMjggMDM6Mjc6MDQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlY29mZi5oIChfRklOSSwgU1RZUF9FQ09GRl9GSU5JKTogIEFkZCB0byBzdXBwb3J0IC5maW5pIHNlY3Rpb24uCi0KLUZyaSBTZXAgMjQgMTE6NTM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEJBRE1BRyk6IFJlY29nbml6ZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQkqIGVjb2ZmLmg6IERlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQotVGh1IFNlcCAyMyAyMTowNzoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0KLVRodSBTZXAgMTYgMjA6Mjc6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzeW0uaCwgc3ltY29uc3QuaDogQWRkIGNvbW1lbnQgc3RhdGluZyB0aGVzZSBmaWxlcyBhcmUgbm90IHBhcnQKLQlvZiBHREIsIEdBUywgZXRjLiAgSW4gMTk5MSwgd2hlbiB3ZSBhc2tlZCBybXMgd2hldGhlciB3ZSBjb3VsZAotCWluY2x1ZGUgdGhlc2UgZmlsZXMgaW4gR0RCIChhbHRob3VnaCB0aGV5IGFyZSBjb3B5cmlnaHRlZCBieQotCXNvbWVvbmUgYmVzaWRlcyB0aGUgRlNGKSwgaGUgc2FpZCBpdCB3YXMgT0sgaWYgdGhleSB3ZXJlIG5vdAotCWNvbnNpZGVyZWQgcGFydCBvZiBHREIuCi0KLUZyaSBTZXAgMTAgMTc6NDA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfUFVUX0FOWSk6IENhc3QgdmFsIGFyZ3VtZW50IHRvIGJmZF92bWEuCi0KLQkqIGFscGhhLmMgKGV4dGVybmFsX2FvdXRoZHIpOiBOZWVkIGZvdXIgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuCi0JdnN0YW1wIGFuZCB0c2l6ZS4KLQotVHVlIFNlcCAgNyAxNDoyMDo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKEFVWF9HRVRfQU5ZLCBBVVhfUFVUX0FOWSk6IENoYW5nZWQgdG8gcmVmbGVjdCBmdXJ0aGVyCi0JY2hhbmdlIGluIGJmZCBzd2FwcGluZyByb3V0aW5lIG5hbWVzLgotCi1UdWUgU2VwICA3IDEwOjE1OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSk6IENoYW5nZSBuYW1lIG9mIF9kb19nZXRiMzIgdG8gcmVmbGVjdCBiZmQKLQljaGFuZ2VzLgotCi1GcmkgQXVnIDEzIDE0OjMwOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl9OT05FKTogRGVmaW5lLgotCi1UaHUgQXVnIDEyIDExOjI0OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoc3RydWN0IGV4dGVybmFsX3JlbG9jKTogQWRkIHJfc3ltbmR4IGZpZWxkLgotCShSRUxTWik6IENvcnJlY3QuCi0JKFJFTE9DX0JJVFMqKTogQ29ycmVjdC4KLQkoQUxQSEFfUl8qKTogRGVmaW5lLgotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl97WERBVEEsUERBVEEsRklOSSxMSVRBLEFCU30pOiBEZWZpbmUuCi0JKHJfZXh0ZXJuKTogVW5kZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpOiBNYWtlIHJfdmFkZHIgYmZkX3ZtYSByYXRoZXIKLQl0aGFuIGxvbmcuICBBZGQgcl9leHRlcm4gZmllbGQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTKik6IERlZmluZS4KLQkqIHN5bS5oIChQRFIpOiBHaXZlIGNvcnJlY3QgbmFtZXMgdG8gbmV3IGZpZWxkcy4KLQotCSogZWNvZmYuaDogTW92ZWQgTUlQUyByZWxvYyBkZWZpbml0aW9ucyBmcm9tIGhlcmUuLi4KLQkqIG1pcHMuaDogdG8gaGVyZS4KLQotVHVlIEF1ZyAgMyAxMToxNzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmg6IENvcnJlY3RlZCBleHRlcm5hbCBzeW1ib2xpYyBkZWJ1Z2dpbmcgc3RydWN0dXJlcyB0bwotCW1hdGNoIGFjdHVhbCB1c2FnZS4KLQkqIGludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIsIGludGVybmFsX2FvdXRoZHIsCi0JaW50ZXJuYWxfc2NuaGRyKTogQ2hhbmdlZCB0eXBlIG9mIHNvbWUgZmllbGRzIHRvIGJmZF92bWEgc28gdGhleQotCWNhbiBob2xkIDY0IGJpdHMuCi0JKiBzeW0uaCAoSERSUiwgRkRSLCBQRFIsIEVYVFIpOiBMaWtld2lzZS4KLQkoUERSKTogQWRkZWQgbmV3IGZpZWxkcyBmb3VuZCBvbiBBbHBoYS4KLQkqIHN5bWNvbnN0LmggKG1hZ2ljU3ltMik6IERlZmluZTsgbmV3IHZhbHVlIGZvdW5kIG9uIEFscGhhLgotCi0JKiBlY29mZi5oOiBOZXcgZmlsZS4KLQkqIGFscGhhLmgsIG1pcHMuaDogTW92ZWQgY29tbW9uIGluZm9ybWF0aW9uIGludG8gZWNvZmYuaC4gIE1vdmVkCi0JZXh0ZXJuYWwgc3RydWN0dXJlIGRlZmluaXRpb25zIGluIGZyb20gZWNvZmYtZXh0LmguCi0JKiBlY29mZi1leHQuaDogUmVtb3ZlZDsgaW5mb3JtYXRpb24gbm93IGluIGFscGhhLmggYW5kIG1pcHMuaC4KLQotU3VuIEp1bCAxOCAyMTo0Mzo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogUmVjb2duaXplIEkzODZQVFhNQUdJQy4KLQotRnJpIEp1bCAxNiAwOTo1NDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19BT1VUX3tPWn1NQUdJQyk6IFJlbmFtZWQgZnJvbSB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTI6MjM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IE1vdmUgeF9mY24gYmFjayBpbnNpZGUgeF9mY25hcnkuCi0JKHtHRVQsUFVUfV9GQ05fe0xOTk9QVFIsRU5ETkRYfSk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotU3VuIEp1bCAxMSAxODowMDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBEZWZpbmUgTUM2OEtCQ1NNQUdJQy4KLQotVGh1IEp1biAxMCAxMTo0NjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoX0lOSVQsIFNUWVBfTUlQU19JTklUKTogRGVmaW5lICh1c2VkIG9uIElyaXg0KS4KLQkoU1RZUF9PVEhFUl9MT0FEKTogRGVmaW5lIGFzIFNUWVBfTUlQU19JTklULgotCi1XZWQgSnVuICA5IDE1OjA5OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChPTUFHSUMpOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjYgMTg6MDQ6NDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmgsIHNoLmg6IFN1cHBvcnQgZm9yIFNILgotCi1TYXQgQXByIDI0IDIxOjM0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhMjlrLmg6IERlZmluZSBfTElULgotCi1GcmkgQXByIDIzIDE4OjQxOjIzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBOZXcgZmlsZS4KLQotVGh1IEFwciAgOCAxMjozNjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKENfU0hBRE9XLCBDX1ZFUlNJT04pOiBDb3BpZWQgaW4gZnJvbSBtODhrLmguCi0JKiBtODhrLmgsIGkzODYuaCwgd2UzMmsuaDogRG9uJ3QgZGVmaW5lIGFsbCB0aGUgc3RvcmFnZSBjbGFzc2VzOwotCXRoZXkncmUgYWxyZWFkeSBpbiBpbnRlcm5hbC5oLgotCi1XZWQgQXByICA3IDExOjUxOjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDaGFuZ2Ugbl9zY2xhc3MgdG8gdW5zaWduZWQgY2hhci4KLQlDaGFuZ2UgQ19FRkNOIHRvIDB4ZmYsIGNoYW5nZSBSUy82MDAwIGRieCBzeW1ib2xzCi0JdG8gbm8gbG9uZ2VyIGJlIHNpZ25lZC4KLQotRnJpIE1hciAxOSAxNDo1Mjo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQWRkIEg4LzUwMCByZWxvYyB0eXBlcy4KLQotV2VkIE1hciAxNyAwOTo0NjowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oIChBVVhfUFVUX0FOWSk6IERvbid0IHVzZSB2b2lkIHZhbHVlcyBpbiBicmFuY2hlcyBvZgotCWNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0KLVRodSBNYXIgIDQgMTQ6MTI6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX0dFVF8qKTogUmV3cm90ZSB0byB1c2UgbmV3IG1hY3JvIEFVWF9HRVRfQU5ZLgotCShBVVhfUFVUXyopOiBOZXcgbWFjcm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFVWF9HRVQgbWFjcm9zLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBBZGRlZCBwcm90b3R5cGUuCi0KLQkqIG1pcHMuaCAoTl9CVE1BU0ssIE5fVE1BU0ssIE5fQlRTSEZULCBOX1RTSElGVCk6IERlZmluZTsgdGhlc2UKLQlhcmUgbmVlZGVkIHRvIGludGVycHJldCBnY2MgZGVidWdnaW5nIG91dHB1dC4KLQotVHVlIEZlYiAgOSAwNzo0MzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmggKEJUWVBFLCBJU1BUUiwgSVNGQ04sIElTQVJZLCBERUNSRUYpOiBSZW1vdmVkCi0JbW9yZSBkZWZpbml0aW9ucyBkdXBsaWNhdGVkIGluIGludGVybmFsLmguCi0KLVdlZCBGZWIgIDMgMDk6MTg6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfKik6IENvcnJlY3QgZm9yIGJpZyBlbmRpYW4gbWFjaGluZXMuCi0KLU1vbiBKYW4gMjUgMTE6MzU6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgYWRkaXRpb25hbCBmaWVsZHMgdXNlZCBvbmx5Ci0JYnkgTUlQUyBFQ09GRi4KLQotVGh1IEphbiAyMSAxMDoyODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQU9VVEhEUik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgYnkgRUNPRkYuCi0KLVR1ZSBKYW4gMTkgMTI6MjE6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmggKE5fKiwgVF8qLCBEVF8qKTogUmVtb3ZlZCBzdGlsbCBtb3JlIGRlZmluaXRpb25zCi0JZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi0JKiBtaXBzLmggKFJFTE9DX1NFQ1RJT05fKiwgRUNPRkZfUl8qKTogRGVmaW5lZCBjb25zdGFudHMgZm9yIEVDT0ZGCi0JcmVsb2NzLgotCi1GcmkgSmFuIDE1IDE4OjE3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIG5ldyBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMuCi0JKG9wdF9leHQpOiBOZXcgc3RydWN0dXJlLgotCSogbWlwcy5oIChaTUFHSUMpOiBEZWZpbmVkIHRvIGJlIDA0MTMuCi0JKF9MSUIpOiBEZWZpbmVkIHRvIGJlICIubGliIgotCShleHRlcm5hbF9yZWxvYyk6IE1JUFMgRUNPRkYgcmVsb2NzIGFyZSBvbmx5IDggYnl0ZXMuICBBZGRlZAotCW1hY3JvcyB0byBhaWQgaW4gc3dhcHBpbmcuCi0KLUZyaSBKYW4gIDggMTY6MTk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfc2NuaGRyKTogQWx3YXlzIHByb3ZpZGUgc19hbGlnbiBmaWVsZCwgbm90Ci0JanVzdCBvbiBpOTYwLgotCShpbnRlcm5hbF9yZWxvYyk6IEFsd2F5cyBwcm92aWRlIHJfc2l6ZSBmaWVsZCwgbm90IGp1c3Qgb24KLQlSUy82MDAwLgotCSogbWlwcy5oIChfUkRBVEEsIF9TREFUQSwgX1NCU1MsIF9MSVQ0LCBfTElUOCwgU1RZUF9SREFUQSwKLQlTVFlQX1NEQVRBLCBTVFlQX1NCU1MsIFNUWVBfTElUNCwgU1RZUF9MSVQ4KTogRGVmaW5lZC4KLQkoQ09ERV9NQVNLLCBNSVBTX0lTX1NUQUIsIE1JUFNfTUFSS19TVEFCLCBNSVBTX1VOTUFSS19TVEFCLAotCVNUQUJTX1NZTUJPTCk6IE1vdmVkIGluIGZyb20gZ2RiL21pcHNyZWFkLmMuCi0KLVdlZCBKYW4gIDYgMTQ6MDE6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmg6IHJlbW92ZWQgU1RZUF8qIGRlZmluZXMsIHNpbmNlIHRoZXkgZHVwbGljYXRlZAotCXRob3NlIGluIGludGVybmFsLmguCi0KLVR1ZSBEZWMgMjkgMTU6NDA6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRlZmluZSBJMzg2QUlYTUFHSUMgZm9yIERhbmJ1cnkgQUlYIFBTLzIgY29tcGlsZXIuCi0KLVNhdCBEZWMgMTIgMTY6MDc6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRvbid0IGRlZmluZSBCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGOiB0aGV5Ci0JYXJlIGRlZmluZWQgaW4gaW50ZXJuYWwuaC4KLQotVGh1IE5vdiAxMiAwOTo1MjowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogKGludGVybmFsX3JlbG9jKTogcl9vZmZzZXQgaXMgbm93IGEgbG9uZy4KLQkqIHo4ay5oOiBzbGlnaHQgY29tbWVudCBlbmhhbmNlbWVudAotCi1XZWQgU2VwIDMwIDA3OjQ2OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBjaGFuZ2VkIHo4ayByZWxvYyB0eXBlcwotCi1GcmkgQXVnIDI4IDEwOjE2OjMxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmg6IG5ldyBmaWxlCi0KLVRodSBBdWcgMjcgMTM6MDA6MDEgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogY29tbWVudCBvdXQgY3J1ZnQgYXQgdGhlIGVuZCBvZiAjZW5kaWYKLQotVHVlIEF1ZyAyNSAxNTowNjo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgI2RlZmluZSBmb3IgU1RZUF9MSVQsIHJlbW92ZWQgZnJvbSBhMjlrIGFuZAotCWg4MzAwLgotCi0JKiB6OGsuaDogYWRkZWQgejgwMDAgc3VwcG9ydAotCi1UaHUgSnVsIDE2IDE2OjMyOjAwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUKLQotRnJpIEp1biAxMiAyMDoxMTowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIEZpeCB1bnRlcm1pbmF0ZWQgY29tbWVudC4KLQotV2VkIEp1biAxMCAwNzo1Nzo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhLm91dCBtYWdpYyBudW1iZXJzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUKLQotTW9uIEp1biAgOCAyMDoxMzozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmgsIG1pcHMuaDogIFVzZSB1bnNpZ25lZCBjaGFycyBldmVyeXdoZXJlLgotCShTdWdnZXN0ZWQgYnkgQW50dGkgTWlldHRpbmVuLikKLQotVHVlIEFwciAxNCAxNToxODo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmg6ICBBZGQgY29tbWVudHMuCi0JKiBzeW1jb25zdC5oOiAgTWVyZ2Ugd2l0aCBGcmVkJ3MgY2hhbmdlcy4KLQotVHVlIEFwciAxNCAxNDozMDowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZXMgZm9yIHN0U3RydWN0LCBzdFVuaW9uLCBzdEVudW0sCi0JbGFuZ0NwbHVzcGx1cywgYW5kIGxhbmdDcGx1c3BsdXNWMi4KLQotVGh1IEFwciAgMiAxOTo0Nzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6ICBNSVBTIGhhcyBwcm92aWRlZCByZWRpc3RyaWJ1dGFibGUgdmVyc2lvbnMKLQlvZiB0aGVzZSBmaWxlcy4gIFRoYW5rcyEKLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHdlYWtleHQgYml0IHRvIG1hdGNoIG5ldyBzeW0uaC4KLQotRnJpIE1hciAgNiAwMDoxMDo0NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBBZGQgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycy4KLQotVGh1IEZlYiAyNyAxMTo1MzowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBOZXcgZmlsZSBmb3IgZXh0ZXJuYWwgKGluLWZpbGUpIGZvcm0gb2YgZWNvZmYKLQlzeW1ib2wgc3RydWN0dXJlcy4KLQotVGh1IEZlYiAgNiAxMTozMzozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogbWFkZSB0aGUgZXh0ZXJuYWxfbGluZW5vIGxfbG5ubyBmaWVsZCA0IGJ5dGVzIHdpZGUuCi0JYW5kZGVkIEdFVC9QVVRfTElORU5PX0xOTk8gbWFjcm9zCi0KLVNhdCBOb3YgMzAgMjA6Mzg6MzUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZywgYTI5ay5oLCBoODMwMC5oLCBpMzg2LmgsIGk5NjAuaCwgaW50ZXJuYWwuaCwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oLCByczYwMDAuaDogbW92ZSBmcm9tIGFib3ZlIGNvZmYtPGZvbz4uaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYTI5ay5oIGIvaW5jbHVkZS9jb2ZmL2EyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYTY0Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIENPRkYgc3BlYyBmb3IgQU1EIDI5MCowIAotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkuCi0gKi8KLSAKLSNpZm5kZWYgQU1ECi0jIGRlZmluZSBBTUQKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSoqIEZpbGUgSGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkgKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkgICAqLwotCWNoYXIgZl90aW1kYXRbNF07ICAgICAgIC8qIHRpbWUgJiBkYXRlIHN0YW1wCSAgICAqLwotCWNoYXIgZl9zeW1wdHJbNF07ICAgICAgIC8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIgICAgICAgKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KLQljaGFyIGZfb3B0aGRyWzJdOyAgICAgICAvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkgKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgRklMSERSICBzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZSBGSUxIU1oJMjAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBNYWdpYyBudW1iZXJzIGZvciBBbTI5MDAwIAotKioJKEFUJlQgd2lsbCBhc3NpZ24gdGhlICJyZWFsIiBtYWdpYyBudW1iZXIpICAKLSovCi0KLSNkZWZpbmUgU0lQRkJPTUFHSUMgICAgIDA1NzIgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIE1TQikgKi8KLSNkZWZpbmUgU0lQUkJPTUFHSUMgICAgIDA1NzMgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIExTQikgKi8KLQotCi0jZGVmaW5lIEEyOUtfTUFHSUNfQklHIAkJU0lQRkJPTUFHSUMJCi0jZGVmaW5lIEEyOUtfTUFHSUNfTElUVExFCVNJUFJCT01BR0lDCQotI2RlZmluZSBBMjlLQkFETUFHKHgpIAkoKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0JJRykgJiYgXAotCQkJICAoKHgpLmZfbWFnaWMhPUEyOUtfTUFHSUNfTElUVExFKSkKLQotI2RlZmluZSBPTUFHSUMgQTI5S19NQUdJQ19CSUcKLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogRmlsZSBoZWFkZXIgZmxhZ3MgY3VycmVudGx5IGtub3duIHRvIHVzLgotKioKLSoqIEFtMjkwMDAgd2lsbCB1c2UgdGhlIEZfQVIzMldSIGFuZCBGX0FSMzJXIGZsYWdzIHRvIGluZGljYXRlCi0qKiB0aGUgYnl0ZSBvcmRlcmluZyBpbiB0aGUgZmlsZS4KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogT3B0aW9uYWwgKGEub3V0KSBoZWFkZXIgCi0qLwotCi10eXBlZGVmCXN0cnVjdCBleHRlcm5hbF9hb3V0aGRyIAotewotICBjaGFyICBtYWdpY1syXTsJICAgICAgIC8qIHR5cGUgb2YgZmlsZQkJCSAqLwotICBjaGFyICB2c3RhbXBbMl07CSAgICAgIC8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyICB0c2l6ZVs0XTsJICAgICAgIC8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyICBkc2l6ZVs0XTsJICAgICAgIC8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciAgYnNpemVbNF07CSAgICAgICAvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJICAgICAqLwotICBjaGFyICBlbnRyeVs0XTsJICAgICAgIC8qIGVudHJ5IHB0LgkJCSAgICAqLwotICBjaGFyICB0ZXh0X3N0YXJ0WzRdOwkgIC8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAgZGF0YV9zdGFydFs0XTsJICAvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19IEFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBhb3V0aGRyIG1hZ2ljIG51bWJlcnMgKi8KLSNkZWZpbmUgTk1BR0lDCQkwNDEwCS8qIHNlcGFyYXRlIGkvZCBleGVjdXRhYmxlICovCi0jZGVmaW5lIFNITUFHSUMJMDQwNgkJLyogTllVL1VsdHJhMyBzaGFyZWQgZGF0YSBleGVjdXRhYmxlIAotCQkJCSAgICh3cml0YWJsZSB0ZXh0KSAqLwotCi0jZGVmaW5lIF9FVEVYVCAgIAkiX2V0ZXh0IgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIFNlY3Rpb24gaGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotCWNoYXIJICAgIHNfbmFtZVs4XTsgICAgICAvKiBzZWN0aW9uIG5hbWUJCSAqLwotCWNoYXIJICAgIHNfcGFkZHJbNF07ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJICAgIHNfdmFkZHJbNF07ICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgKi8KLQljaGFyCSAgICBzX3NpemVbNF07ICAgICAgLyogc2VjdGlvbiBzaXplCQkgKi8KLQljaGFyCSAgICBzX3NjbnB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCSAgICBzX3JlbHB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbiAgICAgICAqLwotCWNoYXIJICAgIHNfbG5ub3B0cls0XTsgICAvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMgICAgICovCi0JY2hhcgkgICAgc19ucmVsb2NbMl07ICAgIC8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQljaGFyCSAgICBzX25sbm5vWzJdOyAgICAgLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJICAgIHNfZmxhZ3NbNF07ICAgICAvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QJZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfTElUCSIubGl0IgotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIFNlY3Rpb24gdHlwZXMgLSB3aXRoIGFkZGl0aW9uYWwgc2VjdGlvbiB0eXBlIGZvciBnbG9iYWwgCi0qKiByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSByZWxvY2F0YWJsZSBmb3IgdGhlIEFtMjkwMDAuCi0qKgotKiogSW4gaW5zdGFuY2VzIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYSBsaW5rZXIgdG8gcHJvZHVjZSBhbgotKiogb3V0cHV0IGZpbGUgd2hpY2ggY29udGFpbnMgdGV4dCBvciBkYXRhIG5vdCBiYXNlZCBhdCB2aXJ0dWFsCi0qKiBhZGRyZXNzIDAsIGUuZy4gZm9yIGEgUk9NLCB0aGVuIHRoZSBsaW5rZXIgc2hvdWxkIGFjY2VwdAotKiogYWRkcmVzcyBiYXNlIGluZm9ybWF0aW9uIGFzIGNvbW1hbmQgaW5wdXQgYW5kIHVzZSBQQUQgc2VjdGlvbnMKLSoqIHRvIHNraXAgb3ZlciB1bnVzZWQgYWRkcmVzc2VzLgotKi8KLQotI2RlZmluZQlTVFlQX0JTU1JFRwkweDEyMDAJLyogR2xvYmFsIHJlZ2lzdGVyIGFyZWEgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0VOVklSCTB4MjIwMAkvKiBFbnZpcm9ubWVudCAobGlrZSBTVFlQX0lORk8pICovCi0jZGVmaW5lIFNUWVBfQUJTCTB4NDAwMAkvKiBBYnNvbHV0ZSAoYWxsb2NhdGVkLCBub3QgcmVsb2MsIGxvYWRlZCkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIGluZm9ybWF0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07CS8qICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHJlZmVyZW5jZSAqLwotICBjaGFyIHJfc3ltbmR4WzRdOwkvKiBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotICBjaGFyIHJfdHlwZVsyXTsJLyogcmVsb2NhdGlvbiB0eXBlICovCi19OwotCi0jZGVmaW5lCVJFTE9DCQlzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUJUkVMU1oJCTEwCQkvKiBzaXplb2YgKFJFTE9DKSAqLyAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQW0yOTAwMCAKLSovCi0KLSNkZWZpbmUJUl9BQlMJCTAJLyogcmVmZXJlbmNlIGlzIGFic29sdXRlICovCi0gCi0jZGVmaW5lCVJfSVJFTAkJMDMwCS8qIGluc3RydWN0aW9uIHJlbGF0aXZlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JQUJTCQkwMzEJLyogaW5zdHJ1Y3Rpb24gYWJzb2x1dGUgKGptcC9jYWxsKSAqLwotI2RlZmluZQlSX0lMT0hBTEYJMDMyCS8qIGluc3RydWN0aW9uIGxvdyBoYWxmICAoY29uc3QpICAqLwotI2RlZmluZQlSX0lISUhBTEYJMDMzCS8qIGluc3RydWN0aW9uIGhpZ2ggaGFsZiAoY29uc3RoKSBwYXJ0IDEgKi8KLSNkZWZpbmUJUl9JSENPTlNUCTAzNAkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAyICovCi0JCQkJLyogY29uc3RhbnQgb2Zmc2V0IG9mIFJfSUhJSEFMRiByZWxvY2F0aW9uICovCi0jZGVmaW5lCVJfQllURQkJMDM1CS8qIHJlbG9jYXRhYmxlIGJ5dGUgdmFsdWUgKi8KLSNkZWZpbmUgUl9IV09SRAkJMDM2CS8qIHJlbG9jYXRhYmxlIGhhbGZ3b3JkIHZhbHVlICovCi0jZGVmaW5lIFJfV09SRAkJMDM3CS8qIHJlbG9jYXRhYmxlIHdvcmQgdmFsdWUgKi8KLQotI2RlZmluZQlSX0lHTEJMUkMJMDQwCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQyAqLwotI2RlZmluZQlSX0lHTEJMUkEJMDQxCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQSAqLwotI2RlZmluZQlSX0lHTEJMUkIJMDQyCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQiAqLwotIAotLyoKLU5PVEU6Ci1BbGwgdGhlICJJIiBmb3JtcyByZWZlciB0byAyOTAwMCBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGxpbmtlciBpcyAKLWV4cGVjdGVkIHRvIGtub3cgaG93IHRoZSBudW1lcmljIGluZm9ybWF0aW9uIGlzIHNwbGl0IGFuZC9vciBhbGlnbmVkCi13aXRoaW4gdGhlIGluc3RydWN0aW9uIHdvcmQocykuICBSX0JZVEUgd29ya3MgZm9yIGluc3RydWN0aW9ucywgdG9vLgotCi1JZiB0aGUgcGFyYW1ldGVyIHRvIGEgQ09OU1RIIGluc3RydWN0aW9uIGlzIGEgcmVsb2NhdGFibGUgdHlwZSwgdHdvIAotcmVsb2NhdGlvbiByZWNvcmRzIGFyZSB3cml0dGVuLiAgVGhlIGZpcnN0IGhhcyBhbiByX3R5cGUgb2YgUl9JSElIQUxGIAotKDMzIG9jdGFsKSBhbmQgYSBub3JtYWwgcl92YWRkciBhbmQgcl9zeW1uZHguICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gCi1yZWNvcmQgaGFzIGFuIHJfdHlwZSBvZiBSX0lIQ09OU1QgKDM0IG9jdGFsKSwgYSBub3JtYWwgcl92YWRkciAod2hpY2ggCi1pcyByZWR1bmRhbnQpLCBhbmQgYW4gcl9zeW1uZHggY29udGFpbmluZyB0aGUgMzItYml0IGNvbnN0YW50IG9mZnNldCAKLXRvIHRoZSByZWxvY2F0aW9uIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBzeW1ib2wgdGFibGUgaW5kZXguICBUaGlzIAotc2Vjb25kIHJlY29yZCBpcyBhbHdheXMgd3JpdHRlbiwgZXZlbiBpZiB0aGUgY29uc3RhbnQgb2Zmc2V0IGlzIHplcm8uCi1UaGUgY29uc3RhbnQgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHplcm8uCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIExpbmUgbnVtYmVyIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIAotewotICAgdW5pb24gewotCSBjaGFyIGxfc3ltbmR4WzRdOyAvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkgY2hhciBsX3BhZGRyWzRdOyAgLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICAgICovCi0gICB9IGxfYWRkcjsKLSAgIGNoYXIgbF9sbm5vWzJdOyAJLyogbGluZSBudW1iZXIJICAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8JCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCQk2CQkvKiBzaXplb2YgKExJTkVOTykgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTeW1ib2wgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLSNkZWZpbmUJRV9TWU1OTUxFTgk4CS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWiAJMTgKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTdG9yYWdlIGNsYXNzIGRlZmluaXRpb25zIC0gbmV3IGNsYXNzZXMgZm9yIGdsb2JhbCByZWdpc3RlcnMuCi0qLwotCi0jZGVmaW5lIENfR0xCTFJFRwkxOQkJLyogZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lIENfRVhUUkVHCTIwCQkvKiBleHRlcm5hbCBnbG9iYWwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ19ERUZSRUcJMjEJCS8qIGV4dC4gZGVmLiBvZiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIERlcml2ZWQgc3ltYm9sIG1hc2svc2hpZnRzLgotKi8KLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIEF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgCi0qKiBkZWZpbml0aW9ucy4KLSovCi0KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNCAgICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkgICovCi0jZGVmaW5lIEVfRElNTlVNICAJNCAgICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOyAgLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOyAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07ICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07ICAgICAgIC8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07ICAgICAgIC8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsgICAgIC8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkgLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotfTsKLQotI2RlZmluZQlBVVhFTlQJCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJCTE4CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2FscGhhLmggYi9pbmNsdWRlL2NvZmYvYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2Y2JjYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKiBFQ09GRiBzdXBwb3J0IG9uIEFscGhhIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbOF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBBTFBIQV9FQ09GRl9CQURNQUcoeCkgXAotICAoKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUNfQlNEKQotCi0vKiBUaGUgb2JqZWN0IHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgZl9mbGFncy4gICovCi0jZGVmaW5lIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSwkweDMwMDAKLSNkZWZpbmUgRl9BTFBIQV9OT19TSEFSRUQJCTB4MTAwMAotI2RlZmluZSBGX0FMUEhBX1NIQVJBQkxFCQkweDIwMDAKLSNkZWZpbmUgRl9BTFBIQV9DQUxMX1NIQVJFRAkJMHgzMDAwCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyNAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkcgotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBjaGFyIGJsZHJldlsyXTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzJdOwkvKiBwYWQgdG8gcXVhZHdvcmQgYm91bmRhcnkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbOF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcwkJCSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbOF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs4XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzhdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzhdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs4XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs4XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogYml0bWFzayBvZiBnZW5lcmFsIHJlZ2lzdGVycyB1c2VkICovCi0gIHVuc2lnbmVkIGNoYXIgZnBybWFza1s0XTsJLyogYml0bWFzayBvZiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzhdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDgwCi0jZGVmaW5lIEFPVVRIRFJTWiA4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls4XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzhdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzhdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzhdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzhdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzhdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk2NAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzhdOwotICB1bnNpZ25lZCBjaGFyIHJfc3ltbmR4WzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIENvbnN0YW50cyB0byB1bnBhY2sgdGhlIHJfYml0cyBmaWVsZC4gIFRoZSBBbHBoYSBzZWVtcyB0byBhbHdheXMgYmUKLSAgIGxpdHRsZSBlbmRpYW4sIHNvIEkgaGF2ZW4ndCBib3RoZXJlZCB0byBkZWZpbmUgYmlnIGVuZGlhbiB2YXJpYW50cwotICAgb2YgdGhlc2UuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCi0jZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKLSNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKLSNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQotI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxISUdIICAgICAgMTcKLSNkZWZpbmUgQUxQSEFfUl9HUFJFTExPVyAgICAgICAxOAotI2RlZmluZSBBTFBIQV9SX0lNTUVEICAgICAgICAgIDE5Ci0KLS8qIE92ZXJsb2FkZWQgcmVsb2MgdmFsdWUgdXNlZCBieSBOZXQtIGFuZCBPcGVuQlNELiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMU0xFQVpZICAxNwotCi0vKiBXaXRoIEFMUEhBX1JfTElUVVNFLCB0aGUgcl9zaXplIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfTFVfQkFTRSAgICAgICAgIDEKLSNkZWZpbmUgQUxQSEFfUl9MVV9CWVRPRkYgICAgICAgMgotI2RlZmluZSBBTFBIQV9SX0xVX0pTUiAgICAgICAgICAzCi0KLS8qIFdpdGggQUxQSEFfUl9JTU1FRCwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQXzE2ICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfR1BfSEkzMiAgIDIKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9TQ05fSEkzMiAgMwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0JSX0hJMzIgICA0Ci0jZGVmaW5lIEFMUEhBX1JfSU1NRURfTE8zMiAgICAgIDUKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWRuTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pcGRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzeW1NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc01heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzRXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZmRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkRuT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzRXh0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbOF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JTc1s4XTsKLQl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcGRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcglmX3BhZGRpbmdbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbOF07Ci0JdW5zaWduZWQgY2hhcglwX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCXBfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaWxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaW9wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9ncF9wcm9sb2d1ZVsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9sb2NhbG9mZlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotfTsKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9CSUcJCTB4ODAKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9CSUcJCTB4NDAKLSNkZWZpbmUgUERSX0JJVFMxX1BST0ZfQklHCQkweDIwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcJCTB4MWYKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHCTAKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUJMHgwMQotI2RlZmluZSBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRQkweDAyCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0xJVFRMRQkJMHgwNAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFCTB4ZjgKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkzCi0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUgNQotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs4XTsKLQl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0Jc3RydWN0CXN5bV9leHQgZXNfYXN5bTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcgllc19pZmRbNF07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcG9sbG8uaCBiL2luY2x1ZGUvY29mZi9hcG9sbG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNDdmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBBcG9sbG8gTTY4SyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIEFwb2xsbyA2ODAwMC1iYXNlZCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IG1hZ2ljIG51bWJlci4gVGhpcyBjb21lcwotICogZnJvbSAvdXNyL2luY2x1ZGUvYXBvbGxvL2ZpbGVoZHIuaAotICovCi0jZGVmaW5lIEFQT0xMT002OEtNQUdJQyAwNjI3Ci0KLSNkZWZpbmUgT01BR0lDIE02OE1BR0lDCi0jZGVmaW5lIE02OEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM2OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLV1JNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4VFZNQUdJQykgJiYgXAotICAoKHgpLmZfbWFnaWMhPU1DNjhLUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1BHTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4VFZNQUdJQykgICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1BUE9MTE9NNjhLTUFHSUMpICkKLQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcglvX3NyaVs0XTsJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIC5zcmkgZGF0YSBwb2ludGVyICovCi0gIGNoYXIgIG9faW5saWJbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuaW5saWIgZGF0YSBwb2ludGVyICovCi0gIGNoYXIJdmlkWzhdOwkJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIDY0IGJpdCB2ZXJzaW9uIElEICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lCUFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSIDEgLyogdGhlIHZhbHVlIG9mIHRoZSBhb3V0aGRyIG1hZ2ljICovCi0jZGVmaW5lCUFPVVRIRFJTWiA0NAotI2RlZmluZSBBT1VUU1ogNDQKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCS8qIEFwb2xsbyBhbGxvdyBmb3IgbGFyZ2VyIHNlY3Rpb24gbmFtZXMgYnkgIGFsbG93aW5nIGl0IHRvIGJlIGluCi0JICogdGhlIHN0cmluZyB0YWJsZS4KLQkgKi8KLQljaGFyCQlzX25hbWVbOF07Ci0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBJZiBzX3plb3JlcyBpcyBhbGwgemVyb2VzLCBzX29mZnNldCBnaXZlcyB0aGUgcmVhbCBsb2NhdGlvbiBvZiB0aGUgbmFtZQotICogaW4gdGhlIHN0cmluZyB0YWJsZS4KLSAqLwotCi0jZGVmaW5lCXNfemVyb2VzIHNlY3Rpb25fbmFtZS5zX25hbWUKLSNkZWZpbmUJc19vZmZzZXQgKHNlY3Rpb25fbmFtZS5zX25hbWUrNCkKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lCV9MSU5FUwkiLmxpbmVzIgotI2RlZmluZQlfQkxPQ0tTCSIuYmxvY2tzIgotI2RlZmluZSBfU1JJICAgICIuc3JpIiAgICAgICAgICAgICAgICAgIC8qIFN0YXRpYyBSZXNvdXJjZSBJbmZvcm1hdGlvbiAoc3lzdHlwZSwKLSBldCBhbC4pICovCi0jZGVmaW5lIF9NSVIgICAgIi5taXIiICAgICAgICAgICAgICAgICAgLyogTW9kdWxlIEluZm9ybWF0aW9uIFJlY29yZHMgICovCi0jZGVmaW5lIF9BUFRWICAgIi5hcHR2IiAgICAgICAgICAgICAgICAgLyogQXBvbGxvLXN0eWxlIHRyYW5zZmVyIHZlY3RvcnMuICovCi0jZGVmaW5lIF9JTkxJQiAgIi5pbmxpYiIgICAgICAgICAgICAgICAgLyogU2hhcmVkIExpYnJhcnkgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgX1JXREkgICAiLnJ3ZGkiICAgICAgICAgLyogUmVhZC93cml0ZSBkYXRhIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yCi0gY29tcHJlc3NlZCBzZWN0aW9ucyAqLwotI2RlZmluZSBfVU5XSU5EICIudW53aW5kIiAgICAgICAgICAgICAgIC8qIFN0YWNrIHVud2luZCBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSAgY2hhciByX29mZnNldFs0XTsKLSNlbmRpZgotCi19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0KLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0jZGVmaW5lIFJFTFNaIDE0Ci0jZWxzZQotI2RlZmluZSBSRUxTWiAxMAotI2VuZGlmCi0KLS8qIEFwb2xsbyBzcGVjaWZpYyBTVFlQIGZsYWdzICovCi0KLSNkZWZpbmUgU1RZUF9SRUxPQ0FURURfTk9UX0xPQURFRCAweDAwMDEwMDAwCS8qIFNlY3Rpb24gaXMgcmVsb2NhdGVkIG5vcm1hbGx5IGR1cmluZyBsaW5raW5nLCBidXQgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgbm90IGJlIGxvYWRlZCBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24gKi8KLSNkZWZpbmUgU1RZUF9ERUJVRyAgICAgICAgICAgICAgMHgwMDAyMDAwMAkvKiBkZWJ1ZyBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfT1ZFUkxBWQkJMHgwMDA0MDAwMAkvKiBTZWN0aW9uIGlzIG92ZXJsYXllZCAqLwotI2RlZmluZSBTVFlQX0lOU1RSVUNUSU9OICAgIAkweDAwMjAwMDAwCS8qIFNlY3Rpb24gY29udGFpbnMgZXhlY3V0YWJsZSBjb2RlICovCi0KLSNkZWZpbmUgU1RZUF9aRVJPCQkweDAwODAwMDAwCS8qIFNlY3Rpb24gaXMgaW5pdGlhbGl6ZWQgdG8gemVybyAqLwotI2RlZmluZSBTVFlQX0lOU1RBTExFRAkJMHgwMjAwMDAwMAkvKiBTZWN0aW9uIHNob3VsZCBiZSBpbnN0YWxsYWJsZSBpbiBLR1QgKi8KLSNkZWZpbmUgU1RZUF9MT09LX0lOU1RBTExFRAkweDA0MDAwMDAwCS8qIExvb2sgZm9yIHNlY3Rpb24gaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04xCQkweDA4MDAwMDAwCS8qIFNwZWNpYWxseSBhbGlnbmVkIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RZUF9TRUNBTElHTjIJCTB4MTAwMDAwMDAJLyogICAgICAiICAgICAgICIgICAgICAgIiAgICAqLwotI2RlZmluZSBTVFlQX0NPTVBSRVNTRUQJCTB4MjAwMDAwMDAJLyogTm8gc2VjdGlvbiBkYXRhIHBlciBzZSAoc19zY25wdHIgPSAwKSwgYnV0IHRoZXJlIGFyZQotCQkJCQkJICAgaW5pdGlhbGl6YXRpb24gZGlyZWN0aXZlcyBmb3IgaXQgaW4gLnJ3ZGkgc2VjdGlvbgotCQkJCQkJICAgKHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTVFlQX0JTUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcm0uaCBiL2luY2x1ZGUvY29mZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhOTMyOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogQVJNIENPRkYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQ09GRkFSTSAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKiAgICAgIEZfSU5URVJXT1JLICAgICBmaWxlIHN1cHBvcnRzIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0cwotICogICAgICBGX0lOVEVSV09SS19TRVQgdGhlIEZfSU5URVJXT1JLIGJpdCBpcyB2YWxpZAotICoJRl9BUENTX0ZMT0FUCWNvZGUgcGFzc2VzIGZsb2F0IGFyZ3VtZW50cyBpbiBmbG9hdCByZWdpc3RlcnMKLSAqCUZfUElDCQljb2RlIGlzIHJlZW50cmFudC9wb3NpdGlvbi1pbmRlcGVuZGVudAotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKglGX0FQQ1NfMjYJZmlsZSB1c2VzIDI2IGJpdCBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQKLSAqCUZfQVBDU19TRVQJdGhlIEZfQVBDU18yNiwgRl9BUENTX0ZMT0FUIGFuZCBGX1BJQyBiaXRzIGhhdmUgYmVlbiBpbml0aWFsaXNlZAotICoJRl9TT0ZUX0ZMT0FUCWNvZGUgZG9lcyBub3QgdXNlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucwotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0jZGVmaW5lIEZfSU5URVJXT1JLCSgweDAwMTApCi0jZGVmaW5lIEZfSU5URVJXT1JLX1NFVAkoMHgwMDIwKQotI2RlZmluZSBGX0FQQ1NfRkxPQVQJKDB4MDA0MCkKLSN1bmRlZiAgRl9BUjE2V1IKLSNkZWZpbmUgRl9QSUMJCSgweDAwODApCi0jZGVmaW5lCUZfQVIzMldSCSgweDAxMDApCi0jZGVmaW5lIEZfQVBDU18yNgkoMHgwNDAwKQotI2RlZmluZSBGX0FQQ1NfU0VUCSgweDA4MDApCi0jZGVmaW5lIEZfU09GVF9GTE9BVAkoMHgyMDAwKQotCi0vKiBCaXRzIHN0b3JlZCBpbiBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUgKi8KLQotI2RlZmluZSBGX0lOVEVSV09SSwkoMHgwMDEwKQotI2RlZmluZSBGX0FQQ1NfRkxPQVQJKDB4MDA0MCkKLSNkZWZpbmUgRl9QSUMJCSgweDAwODApCi0jZGVmaW5lIEZfQVBDUzI2CSgweDEwMDApCi0jZGVmaW5lIEZfQVJNX0FSQ0hJVEVDVFVSRV9NQVNLICgweDQwMDArMHgwODAwKzB4MDQwMCkKLSNkZWZpbmUgRl9BUk1fMgkJKDB4MDQwMCkKLSNkZWZpbmUgRl9BUk1fMmEJKDB4MDgwMCkKLSNkZWZpbmUgRl9BUk1fMwkJKDB4MGMwMCkKLSNkZWZpbmUgRl9BUk1fM00JKDB4NDAwMCkKLSNkZWZpbmUgRl9BUk1fNAkJKDB4NDQwMCkKLSNkZWZpbmUgRl9BUk1fNFQJKDB4NDgwMCkKLSNkZWZpbmUgRl9BUk1fNQkJKDB4NGMwMCkKLQotLyoKLSAqIEFSTU1BR0lDIG91Z2h0IHRvIGVuY29kZWQgdGhlIHByb2Nlc29yIHR5cGUsCi0gKiBidXQgaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIGl0IG5vdywgaW5zdGVhZAotICogdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBpbnRlcm5hbF9mIHN0cnVjdHVyZQotICogaXMgdXNlZCBhcyBzaG93biBhYm92ZS4KLSAqCi0gKiBYWFggLSBOQyA1LzYvOTcKLSAqLwotCi0jZGVmaW5lCUFSTU1BR0lDCTB4YTAwICAvKiBJIGp1c3QgbWFkZSB0aGlzIHVwICovCi0KLSNkZWZpbmUgQVJNQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gQVJNTUFHSUMpKQotCi0jZGVmaW5lCUFSTVBFTUFHSUMJMHgxYzAKLSNkZWZpbmUJVEhVTUJQRU1BR0lDCTB4MWMyCi0KLSN1bmRlZiAgQVJNQkFETUFHCi0jZGVmaW5lIEFSTUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljICE9IEFSTU1BR0lDKSAmJiAoKHgpLmZfbWFnaWMgIT0gQVJNUEVNQUdJQykgJiYgKCh4KS5mX21hZ2ljICE9IFRIVU1CUEVNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0KLS8qIGRlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzICovCi0vKiAgI2RlZmluZSBOVF9JTUFHRV9CQVNFICAgICAgICAweDQwMDAwMCBtb3ZlZCB0byBpbnRlcm5hbC5oICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMCAgCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKiBXZSB1c2UgdGhlIC5yZGF0YSBzZWN0aW9uIHRvIGhvbGQgcmVhZCBvbmx5IGRhdGEuICAqLwotI2RlZmluZSBfTElUCSIucmRhdGEiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotCXVuaW9uCi0JewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotCXN0cnVjdAotCXsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbgotCQl7Ci0JCQlzdHJ1Y3QKLQkJCXsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uCi0JCXsKLQkJCXN0cnVjdCAJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCXsKLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQl7Ci0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uCi0JewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdAotCQl7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdAotCXsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFSTV9XSU5DRQotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCi0jZWxzZQotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNAotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaCBiL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODljMTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogTW9kaWZpY2F0aW9ucyBvZiBpbnRlcm5hbC5oIGFuZCBtNjhrLmggbmVlZGVkIGJ5IEEvVVgKLSAgIFN1Z2dlc3RlZCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9BVVhfSAotI2RlZmluZSBHTlVfQ09GRl9BVVhfSCAxCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgNjQtYnl0ZSBwYWRkZWQgcGF0aG5hbWVzIG9mIHNoYXJlZCBsaWJyYXJpZXMgKi8KLSN1bmRlZiBTVFlQX0xJQgotI2RlZmluZSBTVFlQX0xJQiAweDIwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KLSN1bmRlZiBTVFlQX0lOSVQKLSNkZWZpbmUgU1RZUF9JTklUIDB4NDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgLmlkZW50IGluZm9ybWF0aW9uICovCi0jdW5kZWYgU1RZUF9JREVOVAotI2RlZmluZSBTVFlQX0lERU5UIDB4ODAwCi0KLS8qIFNlY3Rpb24gdHlwZXMgdXNlZCBieSBiZmQgYW5kIGdhcyBub3QgZGVmaW5lZCAoZGlyZWN0bHkpIGJ5IEEvVVggKi8KLSN1bmRlZiBTVFlQX09WRVIKLSNkZWZpbmUgU1RZUF9PVkVSIDAKLSN1bmRlZiBTVFlQX0lORk8KLSNkZWZpbmUgU1RZUF9JTkZPIFNUWVBfSURFTlQKLQotLyogVHJhZGl0aW9uYWwgbmFtZSBvZiB0aGUgc2VjdGlvbiB0YWdnZWQgd2l0aCBTVFlQX0xJQiAqLwotI2RlZmluZSBfTElCICIubGliIgotCi0jZW5kaWYgLyogR05VX0NPRkZfQVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9lY29mZi5oIGIvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDIwMmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotI2lmbmRlZiBFQ09GRl9ICi0jZGVmaW5lIEVDT0ZGX0gKLQotLyogR2VuZXJpYyBFQ09GRiBzdXBwb3J0LgotICAgVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHN5bWJvbCBpbmZvcm1hdGlvbiwgZm91bmQgaW4gc3ltLmggYW5kCi0gICBzeW1jb25zdC5oLiAgKi8KLQotLyogTWlwcyBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gIE1JUFNfTUFHSUNfTElUVExFIGlzIHVzZWQgb24KLSAgIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuICBNSVBTX01BR0lDX0JJRyBpcyB1c2VkIG9uIGJpZyBlbmRpYW4KLSAgIG1hY2hpbmVzLiAgV2hlcmUgaXMgTUlQU19NQUdJQ18xIGZyb20/ICAqLwotI2RlZmluZSBNSVBTX01BR0lDXzEgMHgwMTgwCi0jZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFIDB4MDE2MgotI2RlZmluZSBNSVBTX01BR0lDX0JJRyAweDAxNjAKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDIuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTIgMHgwMTY2Ci0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMiAweDAxNjMKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDMuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgMHgxNDIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUczIDB4MTQwCi0KLS8qIEFscGhhIG1hZ2ljIG51bWJlcnMgdXNlZCBpbiBmaWxlaGRyLiAgKi8KLSNkZWZpbmUgQUxQSEFfTUFHSUMgMHgxODMKLSNkZWZpbmUgQUxQSEFfTUFHSUNfQlNEIDB4MTg1Ci0KLS8qIE1hZ2ljIG51bWJlcnMgdXNlZCBpbiBhLm91dCBoZWFkZXIuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX09NQUdJQyAwNDA3CS8qIG5vdCBkZW1hbmQgcGFnZWQgKGxkIC1OKS4gICovCi0jZGVmaW5lIEVDT0ZGX0FPVVRfWk1BR0lDIDA0MTMJLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0KLS8qIE5hbWVzIG9mIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9SREFUQQkiLnJkYXRhIgotI2RlZmluZSBfU0RBVEEJIi5zZGF0YSIKLSNkZWZpbmUgX1NCU1MJIi5zYnNzIgotI2RlZmluZSBfTElUQQkiLmxpdGEiCi0jZGVmaW5lIF9MSVQ0CSIubGl0NCIKLSNkZWZpbmUgX0xJVDgJIi5saXQ4IgotI2RlZmluZSBfTElCCSIubGliIgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUgX1BEQVRBCSIucGRhdGEiCi0jZGVmaW5lIF9YREFUQQkiLnhkYXRhIgotI2RlZmluZSBfR09UCSIuZ290IgotI2RlZmluZSBfSEFTSAkiLmhhc2giCi0jZGVmaW5lIF9EWU5TWU0JIi5keW5zeW0iCi0jZGVmaW5lIF9EWU5TVFIJIi5keW5zdHIiCi0jZGVmaW5lIF9SRUxEWU4JIi5yZWwuZHluIgotI2RlZmluZSBfQ09ORkxJQyAiLmNvbmZsaWMiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQkxJU1QgIi5saWJsaXN0IgotI2RlZmluZSBfRFlOQU1JQyAiLmR5bmFtaWMiCi0jZGVmaW5lIF9SQ09OU1QJIi5yY29uc3QiCi0KLS8qIEVDT0ZGIHVzZXMgc29tZSBhZGRpdGlvbmFsIHNlY3Rpb24gZmxhZ3MuICAqLwotI2RlZmluZSBTVFlQX1JEQVRBCSAgICAgMHgxMDAKLSNkZWZpbmUgU1RZUF9TREFUQQkgICAgIDB4MjAwCi0jZGVmaW5lIFNUWVBfU0JTUwkgICAgIDB4NDAwCi0jZGVmaW5lIFNUWVBfR09UCSAgICAweDEwMDAKLSNkZWZpbmUgU1RZUF9EWU5BTUlDCSAgICAweDIwMDAKLSNkZWZpbmUgU1RZUF9EWU5TWU0JICAgIDB4NDAwMAotI2RlZmluZSBTVFlQX1JFTERZTgkgICAgMHg4MDAwCi0jZGVmaW5lIFNUWVBfRFlOU1RSCSAgIDB4MTAwMDAKLSNkZWZpbmUgU1RZUF9IQVNICSAgIDB4MjAwMDAKLSNkZWZpbmUgU1RZUF9MSUJMSVNUCSAgIDB4NDAwMDAKLSNkZWZpbmUgU1RZUF9DT05GTElDCSAgMHgxMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9GSU5JCSAweDEwMDAwMDAKLSNkZWZpbmUgU1RZUF9FWFRFTkRFU0MJIDB4MjAwMDAwMCAvKiAweDAyRkZGMDAwIGJpdHMgPT4gc2NuIHR5cGUsIHJlc3QgY2xyICovCi0jZGVmaW5lIFNUWVBfTElUQQkgMHg0MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUOAkgMHg4MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUNAkweDEwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfTElCCTB4NDAwMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9JTklUIDB4ODAwMDAwMDAKLSNkZWZpbmUgU1RZUF9PVEhFUl9MT0FEIChTVFlQX0VDT0ZGX0lOSVQgfCBTVFlQX0VDT0ZGX0ZJTkkpCi0KLS8qIGV4dGVuZGVkIHNlY3Rpb24gdHlwZXMgKi8KLSNkZWZpbmUgU1RZUF9DT01NRU5UCSAweDIxMDAwMDAKLSNkZWZpbmUgU1RZUF9SQ09OU1QJIDB4MjIwMDAwMAotI2RlZmluZSBTVFlQX1hEQVRBCSAweDI0MDAwMDAKLSNkZWZpbmUgU1RZUF9QREFUQQkgMHgyODAwMDAwCi0KLS8qIFRoZSBsaW5rZXIgbmVlZHMgYSBzZWN0aW9uIHRvIGhvbGQgc21hbGwgY29tbW9uIHZhcmlhYmxlcyB3aGlsZQotICAgbGlua2luZy4gIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGNyZWF0ZSBpdCB3aGVuIHRoZSBsaW5rZXIKLSAgIG5lZWRzIGl0LCBzbyB3ZSBhbHdheXMgY3JlYXRlIG9uZSBmb3IgZWFjaCBCRkQuICBXZSB0aGVuIGF2b2lkCi0gICB3cml0aW5nIGl0IG91dC4gICovCi0jZGVmaW5lIFNDT01NT04gIi5zY29tbW9uIgotCi0vKiBJZiB0aGUgZXh0ZXJuIGJpdCBpbiBhIHJlbG9jIGlzIDEsIHRoZW4gcl9zeW1uZHggaXMgYW4gaW5kZXggaW50bwotICAgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZS4gIElmIHRoZSBleHRlcm4gYml0IGlzIDAsIHRoZW4gcl9zeW1uZHgKLSAgIGluZGljYXRlcyBhIHNlY3Rpb24sIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX05PTkUJMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1RFWFQJMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JEQVRBCTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9EQVRBCTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9TREFUQQk0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0JTUwk1Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fQlNTCTYKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9JTklUCTcKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ4CTgKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ0CTkKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9YREFUQSAgICAxMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1BEQVRBICAgIDExCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fRklOSSAgICAgMTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVRBICAgICAxMwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0FCUyAgICAgIDE0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fUkNPTlNUICAgMTUKLQotI2RlZmluZSBOVU1fUkVMT0NfU0VDVElPTlMgICAgIDE2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IHR5cGUgaW5mb3JtYXRpb24gaW4gc3BlY2lhbCBzdGFicwotICAgZW50cmllcy4gIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbiBpbgotICAgZ2NjL2NvbmZpZy9taXBzLmguICBBdCBzb21lIHBvaW50LCB0aGVzZSBzaG91bGQgcHJvYmFibHkgZ28gaW50byBhCi0gICBzaGFyZWQgaW5jbHVkZSBmaWxlLCBidXQgY3VycmVudGx5IGdjYyBhbmQgZ2RiIGRvIG5vdCBzaGFyZSBhbnkKLSAgIGRpcmVjdG9yaWVzLiAqLwotI2RlZmluZSBDT0RFX01BU0sgMHg4RjMwMAotI2RlZmluZSBFQ09GRl9JU19TVEFCKHN5bSkgKCgoc3ltKS0+aW5kZXggJiAweEZGRjAwKSA9PSBDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX01BUktfU1RBQihjb2RlKSAoKGNvZGUpK0NPREVfTUFTSykKLSNkZWZpbmUgRUNPRkZfVU5NQVJLX1NUQUIoY29kZSkgKChjb2RlKS1DT0RFX01BU0spCi0jZGVmaW5lIFNUQUJTX1NZTUJPTCAiQHN0YWJzIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBDT0ZGICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyBhbHNvIHVzZXMgbWlwcy10ZmlsZSB0byBvdXRwdXQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGVzZSBhcmUgdGhlIHZhbHVlcyBpdCB1c2VzIHdoZW4gb3V0cHV0dGluZyB0aGUgLnR5cGUgZGlyZWN0aXZlLgotICAgVGhlc2Ugc2hvdWxkIGFsc28gYmUgaW4gYSBzaGFyZWQgaW5jbHVkZSBmaWxlLiAgKi8KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBVVggKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uIGlzIHRoZSBzYW1lIG9uIGFsbCBrbm93biBFQ09GRgotICAgdGFyZ2V0cy4gIEkgY2FuJ3Qgc2VlIGFueSByZWFzb24gdGhhdCBpdCB3b3VsZCBldmVyIGNoYW5nZSwgc28gSSBhbQotICAgZ29pbmcgdG8gZ2FtYmxlIGFuZCBkZWZpbmUgdGhlIGV4dGVybmFsIHN0cnVjdHVyZXMgaGVyZSwgaW4gdGhlCi0gICB0YXJnZXQgaW5kZXBlbmRlbnQgRUNPRkYgaGVhZGVyIGZpbGUuICBUaGUgaW50ZXJuYWwgZm9ybXMgYXJlCi0gICBkZWZpbmVkIGluIGNvZmYvc3ltLmgsIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGRvbmF0ZWQgYnkgTUlQUwotICAgQ29tcHV0ZXIgU3lzdGVtcy4gICovCi0KLS8qIFR5cGUgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCB0aXJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXRfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxNDVbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMDFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMjNbMV07Ci19OwotCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfQklHCQkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNkZWZpbmUJVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcJCSgodW5zaWduZWQgaW50KSAweDQwKQotI2RlZmluZQlUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMikKLQotI2RlZmluZQlUSVJfQklUUzFfQlRfQklHCQkoKHVuc2lnbmVkIGludCkgMHgzRikKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUUzFfQlRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGQykKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0xJVFRMRQkJMgotCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRNV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEwX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFExX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEwX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFExX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9MSVRUTEUJCTQKLQotI2RlZmluZQlUSVJfQklUU19UUTJfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTNfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTJfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTNfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0xJVFRMRQkJNAotCi0vKiBSZWxhdGl2ZSBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBybmR4X2V4dCB7Ci0JdW5zaWduZWQgY2hhcglyX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHCTQKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfQklHCQk0Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUJMAotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTAKLQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFCTQKLSNkZWZpbmUJUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogQXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiBleHRlcm5hbCByZWNvcmQgKi8KLQotdW5pb24gYXV4X2V4dCB7Ci0Jc3RydWN0IHRpcl9leHQJYV90aTsKLQlzdHJ1Y3Qgcm5keF9leHQJYV9ybmR4OwotCXVuc2lnbmVkIGNoYXIJYV9kbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCWFfZG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglhX3dpZHRoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9jb3VudFs0XTsKLX07Ci0KLSNkZWZpbmUgQVVYX0dFVF9BTlkoYmlnZW5kLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpID8gYmZkX2dldGIzMiAoKGF4KS0+ZmllbGQpIDogYmZkX2dldGwzMiAoKGF4KS0+ZmllbGQpKQotCi0jZGVmaW5lCUFVWF9HRVRfRE5MT1coYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZQlBVVhfR0VUX0ROSElHSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZQlBVVhfR0VUX0lTWU0oYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzeW0pCi0jZGVmaW5lIEFVWF9HRVRfSVNTKGJpZ2VuZCwgYXgpCQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfR0VUX1dJRFRIKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV93aWR0aCkKLSNkZWZpbmUgQVVYX0dFVF9DT1VOVChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfY291bnQpCi0KLSNkZWZpbmUgQVVYX1BVVF9BTlkoYmlnZW5kLCB2YWwsIGF4LCBmaWVsZCkgXAotICAoKGJpZ2VuZCkgXAotICAgPyAoYmZkX3B1dGIzMiAoKGJmZF92bWEpICh2YWwpLCAoYXgpLT5maWVsZCksIDApIFwKLSAgIDogKGJmZF9wdXRsMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSkKLQotI2RlZmluZSBBVVhfUFVUX0ROTE9XKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZSBBVVhfUFVUX0ROSElHSChiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkhpZ2gpCi0jZGVmaW5lIEFVWF9QVVRfSVNZTShiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfUFVUX0lTUyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3MpCi0jZGVmaW5lIEFVWF9QVVRfV0lEVEgoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9QVVRfQ09VTlQoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfY291bnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIGVmZmljaWVuY3ksIGdkYiBkZWFscyBkaXJlY3RseSB3aXRoIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMKLSAgIGluZm9ybWF0aW9uICh0aGF0IHdheSBpdCBvbmx5IHRha2VzIHRoZSB0aW1lIHRvIHN3YXAgaW5mb3JtYXRpb24KLSAgIHRoYXQgaXQgcmVhbGx5IG5lZWRzIHRvIHJlYWQpLiAgZ2RiIG9yaWdpbmFsbHkgcmV0cmlldmVkIHRoZQotICAgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUgQkZEIGJhY2tlbmQgaW5mb3JtYXRpb24sIGJ1dCB0aGF0Ci0gICBzdHJhdGVneSwgYmVzaWRlcyBiZWluZyBzb3J0IG9mIHVnbHksIGRvZXMgbm90IHdvcmsgZm9yIE1JUFMgRUxGLAotICAgd2hpY2ggYWxzbyB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc3RydWN0dXJlIGhvbGRzCi0gICBwb2ludGVycyB0byB0aGUgKG1vc3RseSkgdW5zd2FwcGVkIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8KLXsKLSAgLyogVGhlIHN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgSERSUiBzeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUG9pbnRlcnMgdG8gdGhlIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUKLSAgICAgcG9pbnRlcnMgdG8gZXh0ZXJuYWwgc3RydWN0dXJlcyBwb2ludCB0byBkaWZmZXJlbnQgc29ydHMgb2YKLSAgICAgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IEVDT0ZGIHRhcmdldHMuICBUaGUgZWNvZmZfZGVidWdfc3dhcAotICAgICBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3R1cmVzIGFuZCB0aGUgZnVuY3Rpb25zCi0gICAgIG5lZWRlZCB0byBzd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgVGhlc2UgcG9pbnRlcnMgYXJlCi0gICAgIGFsbCBwb2ludGVycyB0byBhcnJheXMsIG5vdCBzaW5nbGUgc3RydWN0dXJlcy4gIFRoZXkgd2lsbCBiZSBOVUxMCi0gICAgIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgb2YgdGhlIHJlbGV2YW50IHN0cnVjdHVyZS4gIFRoZXNlCi0gICAgIGZpZWxkcyBhcmUgYWxzbyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IEVDT0ZGIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmxpbmU7Ci0gIFBUUiBleHRlcm5hbF9kbnI7CS8qIHN0cnVjdCBkbnJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9wZHI7CS8qIHN0cnVjdCBwZHJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9zeW07CS8qIHN0cnVjdCBzeW1fZXh0ICovCi0gIFBUUiBleHRlcm5hbF9vcHQ7CS8qIHN0cnVjdCBvcHRfZXh0ICovCi0gIHVuaW9uIGF1eF9leHQgKmV4dGVybmFsX2F1eDsKLSAgY2hhciAqc3M7Ci0gIGNoYXIgKnNzZXh0OwotICBQVFIgZXh0ZXJuYWxfZmRyOwkvKiBzdHJ1Y3QgZmRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcmZkOwkvKiBzdHJ1Y3QgcmZkX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfZXh0OwkvKiBzdHJ1Y3QgZXh0X2V4dCAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGV5IG1heSBkaXNhcHBlYXIgYXQgc29tZQotICAgICBwb2ludC4gICovCi0gIGNoYXIgKnNzZXh0X2VuZDsKLSAgUFRSIGV4dGVybmFsX2V4dF9lbmQ7Ci0KLSAgLyogV2hlbiBsaW5raW5nLCB0aGlzIGZpZWxkIGhvbGRzIGEgbWFwcGluZyBmcm9tIHRoZSBpbnB1dCBGRFIKLSAgICAgbnVtYmVycyB0byB0aGUgb3V0cHV0IG51bWJlcnMsIGFuZCBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMuICBJdCBpcyBOVUxMIGlmIG5vIG1hcHBpbmcgaXMgcmVxdWlyZWQuICAqLwotICBSRkRUICppZmRtYXA7Ci0KLSAgLyogVGhlIHN3YXBwZWQgRkRSIGluZm9ybWF0aW9uLiAgQ3VycmVudGx5IHRoaXMgaXMgbmV2ZXIgTlVMTCwgYnV0Ci0gICAgIGNvZGUgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayBpbiBjYXNlCi0gICAgIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLiAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIG5vdCBhCi0gICAgIHNpbmdsZSBzdHJ1Y3R1cmUuICAqLwotICBGRFIgKmZkcjsKLQotICAvKiBXaGVuIHJlbGF4aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG1heSBuZWVkIHRvIGFkanVzdAotICAgICBzeW1ib2wgdmFsdWVzIHdoZW4gdGhleSBhcmUgb3V0cHV0LiAgVGhpcyBpcyBhIGxpbmtlZCBsaXN0IG9mCi0gICAgIHN0cnVjdHVyZXMgaW5kaWNhdGluZyBob3cgdmFsdWVzIHNob3VsZCBiZSBhZGp1c3RlZC4gIFRoZXJlIGlzIG5vCi0gICAgIHJlcXVpcmVtZW50IHRoYXQgdGhlIGVudHJpZXMgYmUgaW4gYW55IG9yZGVyLCBvciB0aGF0IHRoZXkgbm90Ci0gICAgIG92ZXJsYXAuICBUaGlzIGZpZWxkIGlzIG5vcm1hbGx5IE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8KLSAgICAgYWRqdXN0bWVudHMgbmVlZCB0byBiZSBtYWRlLiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGhvdyB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlcyB3aGVuCi0gICBvdXRwdXR0aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGVzZSBhZGp1c3RtZW50cyBvbmx5IGFwcGx5IHRvCi0gICB0aGUgaW50ZXJuYWwgc3ltYm9scywgYXMgdGhlIGV4dGVybmFsIHN5bWJvbCB2YWx1ZXMgd2lsbCBjb21lIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIGFuZCBoYXZlIGFscmVhZHkgYmVlbiBhZGp1c3RlZC4gICovCi0KLXN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QKLXsKLSAgLyogTmV4dCBlbnRyeSBvbiBhZGp1c3RtZW50IGxpc3QuICAqLwotICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICpuZXh0OwotICAvKiBTdGFydGluZyBWTUEgb2YgYWRqdXN0bWVudC4gIFRoaXMgaXMgdGhlIFZNQSBpbiB0aGUgRUNPRkYgZmlsZSwKLSAgICAgbm90IHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaHVzIGl0IHNob3VsZAotICAgICBpbmRpY2F0ZSBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZGluZyBWTUEgb2YgYWRqdXN0bWVudC4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBBZGp1c3RtZW50LiAgVGhpcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIG9yCi0gICAgIEZEUi4gIFRoaXMgaXMgemVybyBmb3IgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLSAgbG9uZyBhZGp1c3Q7Ci19OwotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGJ5IHRoZSBFQ09GRiBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkKLXsKLSAgLyogQmFzZSBhZGRyZXNzIGluIC50ZXh0IG9mIHRoaXMgRkRSLiAgKi8KLSAgYmZkX3ZtYSBiYXNlX2FkZHI7Ci0gIEZEUiAqZmRyOwotfTsKLQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZQotewotICAvKiBBbGxvY2F0ZWQgbWVtb3J5IHRvIGhvbGQgZnVuY3Rpb24gYW5kIGZpbGUgbmFtZXMuICAqLwotICBjaGFyICpmaW5kX2J1ZmZlcjsKLQotICAvKiBGRFIgdGFibGUsIHNvcnRlZCBieSBhZGRyZXNzOiAqLwotICBsb25nIGZkcnRhYl9sZW47Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKmZkcnRhYjsKLQotICAvKiBDYWNoZSBlbnRyeSBmb3IgbW9zdCByZWNlbnRseSBmb3VuZCBsaW5lIGluZm9ybWF0aW9uLiAgVGhlIHNlY3QKLSAgICAgZmllbGQgaXMgTlVMTCBpZiB0aGlzIGNhY2hlIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdDsKLSAgICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lX251bTsKLSAgICB9IGNhY2hlOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1dBUFBJTkcgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGdlbmVyaWMgRUNPRkYgY29kZSBuZWVkcyB0byBiZSBhYmxlIHRvIHN3YXAgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0IGluIHRoZSBzcGVjaWZpYyBmb3JtYXQgdXNlZCBieSBhIHBhcnRpY3VsYXIKLSAgIEVDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWVkZWQgdG8gZG8gdGhpcy4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCi17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBpbnQgc3ltX21hZ2ljOwotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ247Ci0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9kbnJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9vcHRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZTsKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRE5SICopKTsKLSAgdm9pZCAoKnN3YXBfcGRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotICB2b2lkICgqc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOwotICB2b2lkICgqc3dhcF9vcHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIE9QVFIgKikpOwotICB2b2lkICgqc3dhcF9mZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEZEUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Rpcl9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X2luKSBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgdm9pZCAoKnN3YXBfaGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBETlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9vcHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfcmZkX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotICB2b2lkICgqc3dhcF90aXJfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JuZHhfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7Ci0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgc3ltYm9sIGRhdGEgYW5kIHNldCB1cCBwb2ludGVycyBpbgotICAgICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gIFRoZSBzZWN0aW9uIGFyZ3VtZW50IGlzIHVzZWQgZm9yCi0gICAgIEVMRiwgbm90IHN0cmFpZ2h0IEVDT0ZGLiAgKi8KLSAgYm9vbGVhbiAoKnJlYWRfZGVidWdfaW5mbykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotfTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoRUNPRkZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmggYi9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyNmMxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBDT0ZGIGluZm9ybWF0aW9uIGZvciBQQyBydW5uaW5nIGdvMzIuICAqLwotCi0jZGVmaW5lIFNUVUJTSVpFIDIwNDgKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUgewotCWNoYXIgc3R1YltTVFVCU0laRV07CS8qIHRoZSBzdHViIHRvIGxvYWQgdGhlIGltYWdlCSovCi0JLyogdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICovCi0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI3VuZGVmIEZJTEhEUgotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUKLSN1bmRlZiBGSUxIU1oKLSNkZWZpbmUJRklMSFNaCVNUVUJTSVpFKzIwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDgzMDAuaCBiL2luY2x1ZGUvY29mZi9oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMzk0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzMwMC1IICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODMwME1BR0lDCTB4ODMwMAotI2RlZmluZQlIODMwMEhNQUdJQwkweDgzMDEKLSNkZWZpbmUJSDgzMDBTTUFHSUMJMHg4MzAyCi0KLSNkZWZpbmUgSDgzMDBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBNQUdJQykpCi0jZGVmaW5lIEg4MzAwSEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMEhNQUdJQykpCi0jZGVmaW5lIEg4MzAwU0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMFNNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9oODUwMC5oIGIvaW5jbHVkZS9jb2ZmL2g4NTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDViZjJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODUwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC81MDAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCUg4NTAwTUFHSUMJMHg4NTAwCi0KLQotI2RlZmluZSBIODUwMEJBRE1BRyh4KSAoKDB4ZmZmZiAmJiAoKHgpLmZfbWFnaWMpIT1IODUwME1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2kzODYuaCBiL2luY2x1ZGUvY29mZi9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmY0YTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEludGVsIDM4Ni80ODYuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUkzODZNQUdJQwkweDE0YwotI2RlZmluZSBJMzg2UFRYTUFHSUMJMHgxNTQKLSNkZWZpbmUgSTM4NkFJWE1BR0lDCTB4MTc1Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIEkzODZCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBJMzg2TUFHSUMpIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IEkzODZBSVhNQUdJQyBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2UFRYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gTFlOWENPRkZNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLQotCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0KLS8qIGRlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzICovCi0vKiAgI2RlZmluZSBOVF9JTUFHRV9CQVNFICAgICAgICAweDQwMDAwMCBtb3ZlZCB0byBpbnRlcm5hbC5oICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pODYwLmggYi9pbmNsdWRlL2NvZmYvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY4NmU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2LmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCA4NjAuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotCi0KLSNkZWZpbmUJSTg2ME1BR0lDCTB4MTRkCi0KLSNkZWZpbmUgSTg2MEJBRE1BRyh4KSAgICgoeCkuZl9tYWdpYyAhPSBJODYwTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnM/ICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pOTYwLmggYi9pbmNsdWRlL2NvZmYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM1ODM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciA4MDk2MC4gIE9yaWdpbnM6IEludGVsIGNvcnAsIG5hdGNoLiAqLwotCi0vKiBOT1RFOiBUYWdlbnRyaWVzIChjZiBUQUdCSVRTKSBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIDk2MCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBPTUFHSUMgICAgICAoMDQwNykJLyogb2xkIGltcHVyZSBmb3JtYXQuIGRhdGEgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93cyB0ZXh0LiBib3RoIHNlY3Rpb25zIGFyZSBydy4gKi8KLSNkZWZpbmUgTk1BR0lDICAgICAgKDA0MTApCS8qIHNwbGl0IGkmZCwgcmVhZC1vbmx5IHRleHQgKi8KLQotLyoKLSoJSW50ZWwgODA5NjAgKEk5NjApIHByb2Nlc3NvciBmbGFncy4KLSoJRl9JOTYwVFlQRSA9PSBtYXNrIGZvciBwcm9jZXNzb3IgdHlwZSBmaWVsZC4gCi0qLwotCi0jZGVmaW5lCUZfSTk2MFRZUEUJKDB4ZjAwMCkKLSNkZWZpbmUJRl9JOTYwQ09SRQkoMHgxMDAwKQotI2RlZmluZQlGX0k5NjBLQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBTQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBNQwkoMHgzMDAwKQotI2RlZmluZQlGX0k5NjBYQQkoMHg0MDAwKQotI2RlZmluZQlGX0k5NjBDQQkoMHg1MDAwKQotI2RlZmluZQlGX0k5NjBLQQkoMHg2MDAwKQotI2RlZmluZQlGX0k5NjBTQQkoMHg2MDAwKQotI2RlZmluZSBGX0k5NjBKWAkoMHg3MDAwKQotI2RlZmluZSBGX0k5NjBIWAkoMHg4MDAwKQotCi0KLS8qKiBpODA5NjAgTWFnaWMgTnVtYmVycwotKi8KLQotI2RlZmluZSBJOTYwUk9NQUdJQwkoMHgxNjApCS8qIHJlYWQtb25seSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIEk5NjBSV01BR0lDCSgweDE2MSkJLyogcmVhZC13cml0ZSB0ZXh0IHNlZ21lbnRzICovCi0KLSNkZWZpbmUgSTk2MEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1JOTYwUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1JOTYwUldNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nCWJpdGFycmF5OwotfSBUQUdCSVRTOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyCXRhZ2VudHJpZXNbNF07CQkvKiBudW1iZXIgb2YgdGFnIGVudHJpZXMgdG8gZm9sbG93ICovCi19Ci1BT1VUSERSOwotCi0vKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0YWcgYml0cyBhcnJheSAqLwotCi0jZGVmaW5lIFRBR1BUUihhb3V0KSAoKFRBR0JJVFMgKikgKCYoYW91dC50YWdlbnRyaWVzKSsxKSkKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLS8qI2RlZmluZSBBT1VUU1ooYW91dCkgKHNpemVvZihBT1VUSERSKSsoYW91dC50YWdlbnRyaWVzKnNpemVvZihUQUdCSVRTKSkpKi8KLSNkZWZpbmUgQU9VVFNaIDMyCi0jZGVmaW5lIEFPVVRIRFJTWiAzMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgCQlzX2FsaWduWzRdOwkvKiBzZWN0aW9uIGFsaWdubWVudAkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIJCSovCi0JY2hhciBwYWRkaW5nWzJdOwkvKiBmb3JjZSBhbGlnbm1lbnQJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX2ZsYWdzWzJdOwotICBjaGFyIGVfdHlwZVs0XTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMHgxZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4NjApCi0jZGVmaW5lIE5fQlRTSEZUCSg1KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXN0cnVjdCB7Ci0JICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0JCWNoYXIgeF9zdGluZHhbNF07CS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLQl9IHhfc2M7CS8qIHN5c3RlbSBjYWxsIGVudHJ5ICovCi0KLQlzdHJ1Y3QgewotCQljaGFyIHhfYmFsbnRyeVs0XTsgLyogQkFMIGVudHJ5IHBvaW50ICovCi0JfSB4X2JhbDsgLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3RpbWVzdGFtcFs0XTsJICAgICAgICAvKiB0aW1lIHN0YW1wICovCi0JCWNoYXIgCXhfaWRzdHJpbmdbMjBdOwkgICAgICAgIC8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotCX0geF9pZGVudDsJICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0KLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjQKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjQKLQotIwlkZWZpbmUgX0VURVhUCSJfZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHBhZFsyXTsKLX07Ci0KLS8qIHJfdHlwZSB2YWx1ZXMgZm9yIHRoZSBpOTYwLiAgKi8KLQotLyogVGhlIGk5NjAgdXNlcyBSX1JFTExPTkcsIHdoaWNoIGlzIGRlZmluZWQgaW4gaW50ZXJuYWwuaCBhcyAweDExLgotICAgSXQgaXMgYW4gYWJzb2x1dGUgMzIgYml0IHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFJfSVBSTUVEIAkoMHgxOSkJLyogMjQtYml0IGlwLXJlbGF0aXZlIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9PUFRDQUxMCSgweDFiKQkvKiAzMi1iaXQgb3B0aW1pemFibGUgY2FsbCAobGVhZnByb2Mvc3lzcHJvYykgKi8KLSNkZWZpbmUgUl9PUFRDQUxMWAkoMHgxYykJLyogNjQtYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCB1c2UgYnkgcmVsYXhpbmcgbGlua2VycywKLSAgIHdoaWNoIGNvbnZlcnQgMzIgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgNjQgYml0IGluc3RydWN0aW9uKQotICAgaW50byAyNCBiaXQgY2FsbHMgKHdoaWNoIHJlcXVpcmUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24pIHdoZW4KLSAgIHBvc3NpYmxlLiAgSXQgd2lsbCBiZSBwb3NzaWJsZSB3aGVuZXZlciB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsIGlzCi0gICB3aXRoaW4gYSAyNCBiaXQgcmFuZ2Ugb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IGlzIGFsd2F5cyBzYWZlIHRvIGlnbm9yZSB0aGVzZSByZWxvY2F0aW9ucy4gIFRoZXkgb25seSBzZXJ2ZSB0bwotICAgbWFyayBwb2ludHMgd2hpY2ggdGhlIHJlbGF4aW5nIGxpbmtlciB3aWxsIGhhdmUgdG8gY29uc2lkZXIuICBUaGUKLSAgIGFzc2VtYmxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYKLSAgIHRoZSByZWxvY2F0aW9ucyBhcmUgaWdub3JlZC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIFJfSVBSMTMgcmVsb2NhdGlvbiBtYXkgbm90IGFwcGVhciB3aXRoIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLSNkZWZpbmUgUl9JUFIxMwkJKDB4MWQpCS8qIDEzIGJpdCBpcC1yZWxhdGl2ZSBicmFuY2ggKi8KLSNkZWZpbmUgUl9BTElHTgkJKDB4MWUpICAvKiBhbGlnbm1lbnQgbWFya2VyLiAgVGhpcyBoYXMgbm8KLQkJCQkgICBhc3NvY2lhdGVkIHN5bWJvbC4gIEluc3RlYWQsIHRoZQotCQkJCSAgIHJfc3ltbmR4IGZpZWxkIGluZGljYXRlcyB0aGUKLQkJCQkgICByZXF1aXJlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50IGluCi0JCQkJICAgdGhlIGZpbGUuICBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gICovCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pYTY0LmggYi9pbmNsdWRlL2NvZmYvaWE2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE1Nzg2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pYTY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIUC9JbnRlbCBJQS02NC4gICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgSUE2NE1BR0lDCTB4MjAwCi0KLSNkZWZpbmUgSUE2NEJBRE1BRyh4KQkoKCh4KS5mX21hZ2ljICE9IElBNjRNQUdJQykpCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZQkqLwotI2lmbmRlZiBCRkQ2NAotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZQkqLwotI2VuZGlmCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIFBFMzJNQUdJQwkweDEwYgkvKiAzMi1iaXQgaW1hZ2UgKi8KLSNkZWZpbmUgUEUzMlBNQUdJQwkweDIwYgkvKiAzMi1iaXQgaW1hZ2UgaW5zaWRlIDY0LWJpdCBhZGRyZXNzIHNwYWNlICovCi0KLSNkZWZpbmUgUEUzMlBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBQRTMyUE1BR0lDKSkKLQotI2RlZmluZSBBT1VUU1oJCTEwOAotI2RlZmluZSBBT1VUSERSU1oJMTA4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLQotLyogZGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMgKi8KLS8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQkJY2hhciB4X2NoZWNrc3VtWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotCQljaGFyIHhfYXNzb2NpYXRlZFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotCQljaGFyIHhfY29tZGF0WzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmggYi9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMjc2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKiBJbnRlcm5hbCBmb3JtYXQgb2YgQ09GRiBvYmplY3QgZmlsZSBkYXRhIHN0cnVjdHVyZXMsIGZvciBHTlUgQkZELgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LiAgKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9JTlRFUk5BTF9ICi0jZGVmaW5lIEdOVV9DT0ZGX0lOVEVSTkFMX0ggMQotCi0vKiBGaXJzdCwgbWFrZSAic2lnbmVkIGNoYXIiIHdvcmssIGV2ZW4gb24gb2xkIGNvbXBpbGVycy4gKi8KLSNpZm5kZWYgc2lnbmVkCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lCXNpZ25lZAkJCS8qKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGV4dHJhIHN0dWZmIGluIGEgUEUgaGVhZGVyLiAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGRhdGEgZm9sbG93cyBmb3IgUEUgc3R1ZmYgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9tYWdpYzsJLyogTWFnaWMgbnVtYmVyLCAweDVhNGQgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jYmxwOwkvKiBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZSwgMHg5MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NwOwkJLyogUGFnZXMgaW4gZmlsZSwgMHgzICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3JsYzsJLyogUmVsb2NhdGlvbnMsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NwYXJoZHI7CS8qIFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMsIDB4NCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21pbmFsbG9jOwkvKiBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9tYXhhbGxvYzsJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHhGRkZGICovCi0gIHVuc2lnbmVkIHNob3J0IGVfc3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3NwOwkJLyogSW5pdGlhbCBTUCB2YWx1ZSwgMHhiOCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NzdW07CS8qIENoZWNrc3VtLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9pcDsJCS8qIEluaXRpYWwgSVAgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NzOwkJLyogSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9sZmFybGM7CS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlLCAweDQwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb3ZubzsJLyogT3ZlcmxheSBudW1iZXIsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3Jlc1s0XTsJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vZW1pZDsJLyogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vZW1pbmZvOwkvKiBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3JlczJbMTBdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBiZmRfdm1hICBlX2xmYW5ldzsJCS8qIEZpbGUgYWRkcmVzcyBvZiBuZXcgZXhlIGhlYWRlciwgMHg4MCAqLwotICB1bnNpZ25lZCBsb25nIGRvc19tZXNzYWdlWzE2XTsgLyogdGV4dCB3aGljaCBhbHdheXMgZm9sbG93cyBkb3MgaGVhZGVyICovCi0gIGJmZF92bWEgIG50X3NpZ25hdHVyZTsgICAJLyogcmVxdWlyZWQgTlQgc2lnbmF0dXJlLCAweDQ1NTAgKi8gCi19OwotCi1zdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkcgotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfZmlsZWhkciBwZTsKLQotICAvKiBzdGFuZGFyZCBjb2ZmICBpbnRlcm5hbCBpbmZvICovCi0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgbG9uZyBmX3RpbWRhdDsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBiZmRfdm1hIGZfc3ltcHRyOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBsb25nIGZfbnN5bXM7CQkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsJLyogZmxhZ3MJCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX3RhcmdldF9pZDsJLyogKFRJIENPRkYgc3BlY2lmaWMpCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIxNldSCWZpbGUgaXMgMTYtYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMldSCWZpbGUgaXMgMzItYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMlcJCWZpbGUgaXMgMzItYml0IGJpZy1lbmRpYW4KLSAqCUZfRFlOTE9BRAlycy82MDAwIGFpeDogZHluYW1pY2FsbHkgbG9hZGFibGUgdy9pbXBvcnRzICYgZXhwb3J0cwotICoJRl9TSFJPQkoJcnMvNjAwMCBhaXg6IGZpbGUgaXMgYSBzaGFyZWQgb2JqZWN0Ci0gKiAgICAgIEZfRExMICAgICAgICAgICBQRSBmb3JtYXQgRExMCi0gKi8KLQotI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUJRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9BUjE2V1IJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUJRl9BUjMyVyAgICAgCSgweDAyMDApCi0jZGVmaW5lCUZfRFlOTE9BRAkoMHgxMDAwKQotI2RlZmluZQlGX1NIUk9CSgkoMHgyMDAwKQotI2RlZmluZSBGX0RMTCAgICAgICAgICAgKDB4MjAwMCkKLQotLyogZXh0cmEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIAotewotICBiZmRfdm1hIFZpcnR1YWxBZGRyZXNzOwotICBsb25nICAgIFNpemU7Ci19ICBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKLSNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgIDE2Ci0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgTlQuICAqLwotI2RlZmluZSBOVF9FWEVfSU1BR0VfQkFTRSAweDQwMDAwMAotI2RlZmluZSBOVF9ETExfSU1BR0VfQkFTRSAweDEwMDAwMDAwCi0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgQmVPUy4gKi8KLSNkZWZpbmUgQkVPU19FWEVfSU1BR0VfQkFTRSAweDgwMDAwMDAwCi0jZGVmaW5lIEJFT1NfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAotCi0vKiBFeHRyYSBzdHVmZiBpbiBhIFBFIGFvdXRoZHIgKi8KLQotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jaWZuZGVmIFBFX0RFRl9GSUxFX0FMSUdOTUVOVAotIyBkZWZpbmUgUEVfREVGX0ZJTEVfQUxJR05NRU5UIDB4MjAwCi0jZW5kaWYKLQotc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgCi17Ci0gIC8qIFBFIHN0dWZmICAqLwotICBiZmRfdm1hIEltYWdlQmFzZTsJCS8qIGFkZHJlc3Mgb2Ygc3BlY2lmaWMgbG9jYXRpb24gaW4gbWVtb3J5IHRoYXQKLQkJCQkgICBmaWxlIGlzIGxvY2F0ZWQsIE5UIGRlZmF1bHQgMHgxMDAwMCAqLwotCi0gIGJmZF92bWEgU2VjdGlvbkFsaWdubWVudDsJLyogc2VjdGlvbiBhbGlnbm1lbnQgZGVmYXVsdCAweDEwMDAgKi8KLSAgYmZkX3ZtYSBGaWxlQWxpZ25tZW50OwkvKiBmaWxlIGFsaWdubWVudCBkZWZhdWx0IDB4MjAwICovCi0gIHNob3J0ICAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyAqLwotICBzaG9ydCAgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLyogc3lzdGVtIHJlcSdkIGZvciBleGUsIGRlZmF1bHQgdG8gMSovCi0gIHNob3J0ICAgTWFqb3JJbWFnZVZlcnNpb247CS8qIHVzZXIgZGVmaW5lYWJsZSBmaWVsZCB0byBzdG9yZSB2ZXJzaW9uIG9mICovCi0gIHNob3J0ICAgTWlub3JJbWFnZVZlcnNpb247CS8qIGV4ZSBvciBkbGwgYmVpbmcgY3JlYXRlZCwgZGVmYXVsdCB0byAwICovIAotICBzaG9ydCAgIE1ham9yU3Vic3lzdGVtVmVyc2lvbjsgLyogbWluaW11bSBzdWJzeXN0ZW0gdmVyc2lvbiByZXF1aXJlZCB0byAqLwotICBzaG9ydCAgIE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsgLyogcnVuIGV4ZTsgZGVmYXVsdCB0byAzLjEgKi8KLSAgbG9uZyAgICBSZXNlcnZlZDE7CQkvKiBzZWVtcyB0byBiZSAwICovCi0gIGxvbmcgICAgU2l6ZU9mSW1hZ2U7CQkvKiBzaXplIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcHJvZyAqLwotICBsb25nICAgIFNpemVPZkhlYWRlcnM7CS8qIHNpemUgb2YgUEUgaGVhZGVyIGFuZCBzZWN0aW9uIHRhYmxlICovCi0gIGxvbmcgICAgQ2hlY2tTdW07CQkvKiBzZXQgdG8gMCAqLwotICBzaG9ydCAgIFN1YnN5c3RlbTsJCi0KLSAgLyogdHlwZSBvZiBzdWJzeXN0ZW0gZXhlIHVzZXMgZm9yIHVzZXIgaW50ZXJmYWNlLAotICAgICBwb3NzaWJsZSB2YWx1ZXM6Ci0gICAgIDEgLSBOQVRJVkUgICBEb2Vzbid0IHJlcXVpcmUgYSBzdWJzeXN0ZW0KLSAgICAgMiAtIFdJTkRPV1NfR1VJIHJ1bnMgaW4gV2luZG93cyBHVUkgc3Vic3lzdGVtCi0gICAgIDMgLSBXSU5ET1dTX0NVSSBydW5zIGluIFdpbmRvd3MgY2hhciBzdWIuIChjb25zb2xlIGFwcCkKLSAgICAgNSAtIE9TMl9DVUkgcnVucyBpbiBPUy8yIGNoYXJhY3RlciBzdWJzeXN0ZW0KLSAgICAgNyAtIFBPU0lYX0NVSSBydW5zIGluIFBvc2l4IGNoYXJhY3RlciBzdWJzeXN0ZW0gKi8KLSAgc2hvcnQgICBEbGxDaGFyYWN0ZXJpc3RpY3M7CS8qIGZsYWdzIGZvciBETEwgaW5pdCwgdXNlIDAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZTdGFja1Jlc2VydmU7CS8qIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZTdGFja0NvbW1pdDsJLyogYW1vdW50IG9mIG1lbW9yeSBpbml0aWFsbHkgY29tbWl0dGVkIGZvciAKLQkJCQkgICBpbml0aWFsIHRocmVhZCdzIHN0YWNrLCBkZWZhdWx0IGlzIDB4MTAwMCAqLwotICBiZmRfdm1hIFNpemVPZkhlYXBSZXNlcnZlOwkvKiBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgdG8gcmVzZXJ2ZSBhbmQgKi8KLSAgYmZkX3ZtYSBTaXplT2ZIZWFwQ29tbWl0OwkvKiBjb21taXQsIGRvbid0IGtub3cgd2hhdCB0byBkZWZhdXQgaXQgdG8gKi8KLSAgbG9uZyAgICBMb2FkZXJGbGFnczsJCS8qIGNhbiBwcm9iYWJseSBzZXQgdG8gMCAqLwotICBsb25nICAgIE51bWJlck9mUnZhQW5kU2l6ZXM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIG5leHQgZW50cnksIDE2ICovCi0gIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGludGVybmFsX2FvdXRoZHIKLXsKLSAgc2hvcnQgbWFnaWM7CQkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHNob3J0IHZzdGFtcDsJCQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgYmZkX3ZtYSB0c2l6ZTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBiZmRfdm1hIGRzaXplOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBiZmRfdm1hIGJzaXplOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBiZmRfdm1hIGVudHJ5OwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGJmZF92bWEgdGV4dF9zdGFydDsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotCi0gIC8qIGk5NjAgc3R1ZmYgKi8KLSAgdW5zaWduZWQgbG9uZyB0YWdlbnRyaWVzOwkvKiBudW1iZXIgb2YgdGFnIGVudHJpZXMgdG8gZm9sbG93ICovCi0KLSAgLyogUlMvNjAwMCBzdHVmZiAqLwotICB1bnNpZ25lZCBsb25nIG9fdG9jOwkJLyogYWRkcmVzcyBvZiBUT0MJCQkqLwotICBzaG9ydCBvX3NuZW50cnk7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgZW50cnkgcG9pbnQgKi8KLSAgc2hvcnQgb19zbnRleHQ7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgdGV4dAkqLwotICBzaG9ydCBvX3NuZGF0YTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBkYXRhCSovCi0gIHNob3J0IG9fc250b2M7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgdG9jCSovCi0gIHNob3J0IG9fc25sb2FkZXI7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgbG9hZGVyIHNlY3Rpb24gKi8KLSAgc2hvcnQgb19zbmJzczsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBic3MJKi8KLSAgc2hvcnQgb19hbGdudGV4dDsJCS8qIG1heCBhbGlnbm1lbnQgZm9yIHRleHQJKi8KLSAgc2hvcnQgb19hbGduZGF0YTsJCS8qIG1heCBhbGlnbm1lbnQgZm9yIGRhdGEJKi8KLSAgc2hvcnQgb19tb2R0eXBlOwkJLyogTW9kdWxlIHR5cGUgZmllbGQsIDFSLFJFLFJPCSovCi0gIHNob3J0IG9fY3B1dHlwZTsJCS8qIEVuY29kZWQgQ1BVIHR5cGUJCSovCi0gIHVuc2lnbmVkIGxvbmcgb19tYXhzdGFjazsJLyogbWF4IHN0YWNrIHNpemUgYWxsb3dlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBvX21heGRhdGE7CS8qIG1heCBkYXRhIHNpemUgYWxsb3dlZC4JKi8KLQotICAvKiBFQ09GRiBzdHVmZiAqLwotICBiZmRfdm1hIGJzc19zdGFydDsJCS8qIEJhc2Ugb2YgYnNzIHNlY3Rpb24uCQkqLwotICBiZmRfdm1hIGdwX3ZhbHVlOwkJLyogR1AgcmVnaXN0ZXIgdmFsdWUuCQkqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7CS8qIEdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgY3BybWFza1s0XTsJLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsJLyogRmxvYXRpbmcgcG9pbnRlciByZWdpc3RlcnMgdXNlZC4gICovCi0KLSAgLyogQXBvbGxvIHN0dWZmICovCi0gIGxvbmcgb19pbmxpYjsJCQkvKiBpbmxpYiBkYXRhICovCi0gIGxvbmcgb19zcmk7CQkJLyogU3RhdGljIFJlc291cmNlIEluZm9ybWF0aW9uICovCi0gIGxvbmcgdmlkWzJdOwkJCS8qIFZlcnNpb24gaWQgKi8KLQotCi0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVE9SQUdFIENMQVNTRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyB1c2VkIHRvIGJlIGRlZmluZWQgYXMgLTEsIGJ1dCBub3cgbl9zY2xhc3MgaXMgdW5zaWduZWQuICAqLwotI2RlZmluZSBDX0VGQ04JCTB4ZmYJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSovCi0jZGVmaW5lIENfTlVMTAkJMAotI2RlZmluZSBDX0FVVE8JCTEJLyogYXV0b21hdGljIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0VYVAkJMgkvKiBleHRlcm5hbCBzeW1ib2wJCSovCi0jZGVmaW5lIENfU1RBVAkJMwkvKiBzdGF0aWMJCQkqLwotI2RlZmluZSBDX1JFRwkJNAkvKiByZWdpc3RlciB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19FWFRERUYJNQkvKiBleHRlcm5hbCBkZWZpbml0aW9uCQkqLwotI2RlZmluZSBDX0xBQkVMCQk2CS8qIGxhYmVsCQkJKi8KLSNkZWZpbmUgQ19VTEFCRUwJNwkvKiB1bmRlZmluZWQgbGFiZWwJCSovCi0jZGVmaW5lIENfTU9TCQk4CS8qIG1lbWJlciBvZiBzdHJ1Y3R1cmUJCSovCi0jZGVmaW5lIENfQVJHCQk5CS8qIGZ1bmN0aW9uIGFyZ3VtZW50CQkqLwotI2RlZmluZSBDX1NUUlRBRwkxMAkvKiBzdHJ1Y3R1cmUgdGFnCQkqLwotI2RlZmluZSBDX01PVQkJMTEJLyogbWVtYmVyIG9mIHVuaW9uCQkqLwotI2RlZmluZSBDX1VOVEFHCQkxMgkvKiB1bmlvbiB0YWcJCQkqLwotI2RlZmluZSBDX1RQREVGCQkxMwkvKiB0eXBlIGRlZmluaXRpb24JCSovCi0jZGVmaW5lIENfVVNUQVRJQwkxNAkvKiB1bmRlZmluZWQgc3RhdGljCQkqLwotI2RlZmluZSBDX0VOVEFHCQkxNQkvKiBlbnVtZXJhdGlvbiB0YWcJCSovCi0jZGVmaW5lIENfTU9FCQkxNgkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24JKi8KLSNkZWZpbmUgQ19SRUdQQVJNCTE3CS8qIHJlZ2lzdGVyIHBhcmFtZXRlcgkJKi8KLSNkZWZpbmUgQ19GSUVMRAkJMTgJLyogYml0IGZpZWxkCQkJKi8KLSNkZWZpbmUgQ19BVVRPQVJHCTE5CS8qIGF1dG8gYXJndW1lbnQJCSovCi0jZGVmaW5lIENfTEFTVEVOVAkyMAkvKiBkdW1teSBlbnRyeSAoZW5kIG9mIGJsb2NrKQkqLwotI2RlZmluZSBDX0JMT0NLCQkxMDAJLyogIi5iYiIgb3IgIi5lYiIJCSovCi0jZGVmaW5lIENfRkNOCQkxMDEJLyogIi5iZiIgb3IgIi5lZiIJCSovCi0jZGVmaW5lIENfRU9TCQkxMDIJLyogZW5kIG9mIHN0cnVjdHVyZQkJKi8KLSNkZWZpbmUgQ19GSUxFCQkxMDMJLyogZmlsZSBuYW1lCQkJKi8KLSNkZWZpbmUgQ19MSU5FCQkxMDQJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBDX0FMSUFTCSAJMTA1CS8qIGR1cGxpY2F0ZSB0YWcJCSovCi0jZGVmaW5lIENfSElEREVOCTEwNgkvKiBleHQgc3ltYm9sIGluIGRtZXJ0IHB1YmxpYyBsaWIgKi8KLQotI2RlZmluZSBDX1dFQUtFWFQJMTI3CS8qIHdlYWsgc3ltYm9sIC0tIEdOVSBleHRlbnNpb24gKi8KLQotLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEkgQ09GRiAqLwotI2RlZmluZSBDX1VFWFQJCTE5CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIENfU1RBVExBQgkyMAkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfRVhUTEFCCTIxCS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLwotI2RlZmluZSBDX1NZU1RFTQkyMwkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBXSU5ET1dTX05UICAgKi8KLSNkZWZpbmUgQ19TRUNUSU9OICAgICAgIDEwNCAgICAgLyogc2VjdGlvbiBuYW1lICovCi0jZGVmaW5lIENfTlRfV0VBSwkxMDUJLyogd2VhayBleHRlcm5hbCAqLwotCi0gLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgODA5NjAgKi8KLQotLyogQ19MRUFGUFJPQyBpcyBvYnNvbGV0ZS4gIFVzZSBDX0xFQUZFWFQgb3IgQ19MRUFGU1RBVCAqLwotI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwgKi8KLQotI2RlZmluZSBDX1NDQUxMCQkxMDcJLyogUHJvY2VkdXJlIHJlYWNoYWJsZSB2aWEgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgQ19MRUFGRVhUICAgICAgIDEwOAkvKiBFeHRlcm5hbCBsZWFmICovCi0jZGVmaW5lIENfTEVBRlNUQVQgICAgICAxMTMJLyogU3RhdGljIGxlYWYgKi8KLSNkZWZpbmUgQ19PUFRWQVIJMTA5CS8qIE9wdGltaXplZCB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19ERUZJTkUJMTEwCS8qIFByZXByb2Nlc3NvciAjZGVmaW5lCQkqLwotI2RlZmluZSBDX1BSQUdNQQkxMTEJLyogQWR2aWNlIHRvIGNvbXBpbGVyIG9yIGxpbmtlcgkqLwotI2RlZmluZSBDX1NFR01FTlQJMTEyCS8qIDgwOTYwIHNlZ21lbnQgbmFtZQkJKi8KLQotICAvKiBTdG9yYWdlIGNsYXNzZXMgZm9yIG04OGsgKi8KLSNkZWZpbmUgQ19TSEFET1cgICAgICAgIDEwNyAgICAgLyogc2hhZG93IHN5bWJvbCAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDX1ZFUlNJT04gICAgICAgMTA4ICAgICAvKiBjb2ZmIHZlcnNpb24gc3ltYm9sICAgICAgICAgICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfSElERVhUICAgICAgICAxMDcJLyogVW4tbmFtZWQgZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIENfQklOQ0wgICAgICAgICAxMDgJLyogTWFya3MgYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotI2RlZmluZSBDX0VJTkNMICAgICAgICAgMTA5CS8qIE1hcmtzIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgKi8KLQotIC8qIHN0b3JhZ2UgY2xhc3NlcyBmb3Igc3RhYiBzeW1ib2xzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfR1NZTSAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgQ19MU1lNICAgICAgICAgICgweDgxKQotI2RlZmluZSBDX1BTWU0gICAgICAgICAgKDB4ODIpCi0jZGVmaW5lIENfUlNZTSAgICAgICAgICAoMHg4MykKLSNkZWZpbmUgQ19SUFNZTSAgICAgICAgICgweDg0KQotI2RlZmluZSBDX1NUU1lNICAgICAgICAgKDB4ODUpCi0jZGVmaW5lIENfVENTWU0gICAgICAgICAoMHg4NikKLSNkZWZpbmUgQ19CQ09NTSAgICAgICAgICgweDg3KQotI2RlZmluZSBDX0VDT01MICAgICAgICAgKDB4ODgpCi0jZGVmaW5lIENfRUNPTU0gICAgICAgICAoMHg4OSkKLSNkZWZpbmUgQ19ERUNMICAgICAgICAgICgweDhjKQotI2RlZmluZSBDX0VOVFJZICAgICAgICAgKDB4OGQpCi0jZGVmaW5lIENfRlVOICAgICAgICAgICAoMHg4ZSkKLSNkZWZpbmUgQ19CU1RBVCAgICAgICAgICgweDhmKQotI2RlZmluZSBDX0VTVEFUICAgICAgICAgKDB4OTApCi0KLS8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scyAqLwotI2RlZmluZSBDX1RIVU1CRVhUICAgICAgKDEyOCArIENfRVhUKQkJLyogMTMwICovCi0jZGVmaW5lIENfVEhVTUJTVEFUICAgICAoMTI4ICsgQ19TVEFUKQkJLyogMTMxICovCi0jZGVmaW5lIENfVEhVTUJMQUJFTCAgICAoMTI4ICsgQ19MQUJFTCkJCS8qIDEzNCAqLwotI2RlZmluZSBDX1RIVU1CRVhURlVOQyAgKENfVEhVTUJFWFQgICsgMjApCS8qIDE1MCAqLwotI2RlZmluZSBDX1RIVU1CU1RBVEZVTkMgKENfVEhVTUJTVEFUICsgMjApCS8qIDE1MSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDTk5NTEVOICg4KQotCi1zdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lW1NDTk5NTEVOXTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQotICAvKiBQaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYi4KLSAgICAgSW4gdGhlIHBlaSBmb3JtYXQsIHRoaXMgZmllbGQgaXMgdGhlIHZpcnR1YWwgc2VjdGlvbiBzaXplCi0gICAgICh0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBhZnRlciBiZWluZyBsb2FkZWQgaW50IG1lbW9yeSksCi0gICAgIE5PVCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgc19wYWRkcjsKLQotICBiZmRfdm1hIHNfdmFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGJmZF92bWEgc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgYmZkX3ZtYSBzX3NjbnB0cjsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGJmZF92bWEgc19yZWxwdHI7CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGJmZF92bWEgc19sbm5vcHRyOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGxvbmcgc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGxvbmcgc19mbGFnczsJCQkvKiBmbGFncwkJCSovCi0gIGxvbmcgc19hbGlnbjsJCQkvKiB1c2VkIG9uIEk5NjAJCQkqLwotICB1bnNpZ25lZCBjaGFyIHNfcGFnZTsgICAgICAgICAvKiBUSSBDT0ZGIGxvYWQgcGFnZSAgICAgICAgICAgICovCi19OwotCi0vKgotICogc19mbGFncyAidHlwZSIKLSAqLwotI2RlZmluZSBTVFlQX1JFRwkgKDB4MDAwMCkJLyogInJlZ3VsYXIiOiBhbGxvY2F0ZWQsIHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfRFNFQ1QJICgweDAwMDEpCS8qICJkdW1teSI6ICByZWxvY2F0ZWQgb25seSovCi0jZGVmaW5lIFNUWVBfTk9MT0FECSAoMHgwMDAyKQkvKiAibm9sb2FkIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIG5vdCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9HUk9VUAkgKDB4MDAwNCkJLyogImdyb3VwZWQiOiBmb3JtZWQgb2YgaW5wdXQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgU1RZUF9QQUQJICgweDAwMDgpCS8qICJwYWRkaW5nIjogbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfQ09QWQkgKDB4MDAxMCkJLyogImNvcHkiOiBmb3IgZGVjaXNpb24gZnVuY3Rpb24gdXNlZCBieSBmaWVsZCB1cGRhdGU7ICBub3QgYWxsb2NhdGVkLCBub3QgcmVsb2NhdGVkLAotCQkJCQkJCQkJICAgICBsb2FkZWQ7IHJlbG9jICYgbGluZW5vIGVudHJpZXMgcHJvY2Vzc2VkIG5vcm1hbGx5ICovCi0jZGVmaW5lIFNUWVBfVEVYVAkgKDB4MDAyMCkJLyogc2VjdGlvbiBjb250YWlucyB0ZXh0IG9ubHkgKi8KLSNkZWZpbmUgU19TSFJTRUcJICgweDAwMjApCS8qIEluIDNiIFVwZGF0ZSBmaWxlcyAob3V0cHV0IG9mIG9nZW4pLCBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gU0hBUkVEIHNlZ21lbnRzIG9mIHRoZSBQZmlsZQotCQkJCQkJCQkJICAgICB3aWxsIGhhdmUgdGhlIFNfU0hSU0VHIGZsYWcgc2V0IGJ5IG9nZW4sIHRvIGluZm9ybSBkdWZyIHRoYXQgdXBkYXRpbmcgMSBjb3B5IG9mIHRoZSBwcm9jLiB3aWxsCi0JCQkJCQkJCQkgICAgIHVwZGF0ZSBhbGwgcHJvY2VzcyBpbnZvY2F0aW9ucy4gKi8KLSNkZWZpbmUgU1RZUF9EQVRBCSAoMHgwMDQwKQkvKiBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seSAqLwotI2RlZmluZSBTVFlQX0JTUwkgKDB4MDA4MCkJLyogc2VjdGlvbiBjb250YWlucyBic3Mgb25seSAqLwotI2RlZmluZSBTX05FV0ZDTgkgKDB4MDEwMCkJLyogSW4gYSBtaW5pbWFsIGZpbGUgb3IgYW4gdXBkYXRlIGZpbGUsIGEgbmV3IGZ1bmN0aW9uIChhcyBjb21wYXJlZCB3aXRoIGEgcmVwbGFjZWQgZnVuY3Rpb24pICovCi0jZGVmaW5lIFNUWVBfSU5GTwkgKDB4MDIwMCkJLyogY29tbWVudDogbm90IGFsbG9jYXRlZCBub3QgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfT1ZFUgkgKDB4MDQwMCkJLyogb3ZlcmxheTogcmVsb2NhdGVkIG5vdCBhbGxvY2F0ZWQgb3IgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfTElCCSAoMHgwODAwKQkvKiBmb3IgLmxpYjogc2FtZSBhcyBJTkZPICovCi0jZGVmaW5lIFNUWVBfTUVSR0UJICgweDIwMDApCS8qIG1lcmdlIHNlY3Rpb24gLS0gY29tYmluZXMgd2l0aCB0ZXh0LCBkYXRhIG9yIGJzcyBzZWN0aW9ucyBvbmx5ICovCi0jZGVmaW5lIFNUWVBfUkVWRVJTRV9QQUQgKDB4NDAwMCkJLyogc2VjdGlvbiB3aWxsIGJlIHBhZGRlZCB3aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVyZXZlciBwYWRkaW5nIGlzIG5lY2Vzc2FyeSBhbmQgdGhlcmUgaXMgYQotCQkJCQkKLQkJCQkJCQkJCSAgICAgd29yZCBvZiBjb250aWd1b3VzIGJ5dGVzCi0JCQkJCQkJCQkgICAgIGJlZ2lubmluZyBvbiBhIHdvcmQgYm91bmRhcnkuICovCi0KLSNkZWZpbmUgU1RZUF9MSVQJMHg4MDIwCS8qIExpdGVyYWwgZGF0YSAobGlrZSBTVFlQX1RFWFQpICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLQotc3RydWN0IGludGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsX3N5bW5keDsJCS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGxvbmcgbF9wYWRkcjsJCS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotICB9ICAgICBsX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9sbm5vOwkJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBGSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIERJTU5VTQkJNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgX25fbmFtZVtTWU1OTUxFTl07CS8qIG9sZCBDT0ZGIHZlcnNpb24JKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIF9uX3plcm9lczsJCS8qIG5ldyA9PSAwCQkqLwotICAgICAgbG9uZyBfbl9vZmZzZXQ7CQkvKiBvZmZzZXQgaW50byBzdHJpbmcgdGFibGUgKi8KLSAgICB9ICAgICAgX25fbjsKLSAgICBjaGFyICpfbl9ucHRyWzJdOwkJLyogYWxsb3dzIGZvciBvdmVybGF5aW5nCSovCi0gIH0gICAgIF9uOwotICBsb25nIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sCQkqLwotICBzaG9ydCBuX3NjbnVtOwkJLyogc2VjdGlvbiBudW1iZXIJCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fZmxhZ3M7CS8qIGNvcHkgb2YgZmxhZ3MgZnJvbSBmaWxoZHIJKi8KLSAgdW5zaWduZWQgc2hvcnQgbl90eXBlOwkvKiB0eXBlIGFuZCBkZXJpdmVkIHR5cGUJKi8KLSAgdW5zaWduZWQgY2hhciBuX3NjbGFzczsJLyogc3RvcmFnZSBjbGFzcwkJKi8KLSAgdW5zaWduZWQgY2hhciBuX251bWF1eDsJLyogbnVtYmVyIG9mIGF1eC4gZW50cmllcwkqLwotfTsKLQotI2RlZmluZSBuX25hbWUJCV9uLl9uX25hbWUKLSNkZWZpbmUgbl96ZXJvZXMJX24uX25fbi5fbl96ZXJvZXMKLSNkZWZpbmUgbl9vZmZzZXQJX24uX25fbi5fbl9vZmZzZXQKLQotCi0vKiBSZWxvY2F0YWJsZSBzeW1ib2xzIGhhdmUgbnVtYmVyIG9mIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQsCi0gICBvciBvbmUgb2YgdGhlIGZvbGxvd2luZzogKi8KLQotI2RlZmluZSBOX1VOREVGCSgoc2hvcnQpMCkJLyogdW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUwkoKHNob3J0KS0xKQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgTl9ERUJVRwkoKHNob3J0KS0yKQkvKiBkZWJ1Z2dpbmcgc3ltYm9sIC0tIHZhbHVlIGlzIG1lYW5pbmdsZXNzICovCi0jZGVmaW5lIE5fVFYJKChzaG9ydCktMykJLyogaW5kaWNhdGVzIHN5bWJvbCBuZWVkcyBwcmVsb2FkIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBQX1RWCSgoc2hvcnQpLTQpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcG9zdGxvYWQgdHJhbnNmZXIgdmVjdG9yKi8KLQotLyoKLSAqIFR5cGUgb2YgYSBzeW1ib2wsIGluIGxvdyBOIGJpdHMgb2YgdGhlIHdvcmQKLSAqLwotI2RlZmluZSBUX05VTEwJCTAKLSNkZWZpbmUgVF9WT0lECQkxCS8qIGZ1bmN0aW9uIGFyZ3VtZW50IChvbmx5IHVzZWQgYnkgY29tcGlsZXIpICovCi0jZGVmaW5lIFRfQ0hBUgkJMgkvKiBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFRfU0hPUlQJCTMJLyogc2hvcnQgaW50ZWdlcgkqLwotI2RlZmluZSBUX0lOVAkJNAkvKiBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0xPTkcJCTUJLyogbG9uZyBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0ZMT0FUCQk2CS8qIGZsb2F0aW5nIHBvaW50CSovCi0jZGVmaW5lIFRfRE9VQkxFCTcJLyogZG91YmxlIHdvcmQJCSovCi0jZGVmaW5lIFRfU1RSVUNUCTgJLyogc3RydWN0dXJlIAkJKi8KLSNkZWZpbmUgVF9VTklPTgkJOQkvKiB1bmlvbiAJCSovCi0jZGVmaW5lIFRfRU5VTQkJMTAJLyogZW51bWVyYXRpb24gCQkqLwotI2RlZmluZSBUX01PRQkJMTEJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uKi8KLSNkZWZpbmUgVF9VQ0hBUgkJMTIJLyogdW5zaWduZWQgY2hhcmFjdGVyCSovCi0jZGVmaW5lIFRfVVNIT1JUCTEzCS8qIHVuc2lnbmVkIHNob3J0CSovCi0jZGVmaW5lIFRfVUlOVAkJMTQJLyogdW5zaWduZWQgaW50ZWdlcgkqLwotI2RlZmluZSBUX1VMT05HCQkxNQkvKiB1bnNpZ25lZCBsb25nCSovCi0jZGVmaW5lIFRfTE5HREJMCTE2CS8qIGxvbmcgZG91YmxlCQkqLwotCi0vKgotICogZGVyaXZlZCB0eXBlcywgaW4gbl90eXBlCi0qLwotI2RlZmluZSBEVF9OT04JCSgwKQkvKiBubyBkZXJpdmVkIHR5cGUgKi8KLSNkZWZpbmUgRFRfUFRSCQkoMSkJLyogcG9pbnRlciAqLwotI2RlZmluZSBEVF9GQ04JCSgyKQkvKiBmdW5jdGlvbiAqLwotI2RlZmluZSBEVF9BUlkJCSgzKQkvKiBhcnJheSAqLwotCi0jZGVmaW5lIEJUWVBFKHgpCSgoeCkgJiBOX0JUTUFTSykKLSNkZWZpbmUgRFRZUEUoeCkJKCgoeCkgJiBOX1RNQVNLKSA+PiBOX0JUU0hGVCkKLQotI2RlZmluZSBJU1BUUih4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfUFRSIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNGQ04oeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX0ZDTiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTQVJZKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9BUlkgPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU1RBRyh4KSBcCi0gICgoeCkgPT0gQ19TVFJUQUcgfHwgKHgpID09IENfVU5UQUcgfHwgKHgpID09IENfRU5UQUcpCi0jZGVmaW5lIERFQ1JFRih4KSBcCi0gICgoKCh4KSA+PiBOX1RTSElGVCkgJiB+IE5fQlRNQVNLKSB8ICgoeCkgJiBOX0JUTUFTSykpCi0KLXVuaW9uIGludGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBsb25nIGw7CQkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgICAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICB9ICAgICB4X3RhZ25keDsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgc2hvcnQgeF9sbm5vOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCXVuc2lnbmVkIHNob3J0IHhfc2l6ZTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0gICAgICB4X2xuc3o7Ci0gICAgICBsb25nIHhfZnNpemU7CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSAgICAgeF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsJCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JbG9uZyB4X2xubm9wdHI7CQkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCXVuaW9uCi0JewkJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgbG9uZyBsOwotCSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLQl9ICAgICB4X2VuZG5keDsKLSAgICAgIH0gICAgICB4X2ZjbjsKLQotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCXVuc2lnbmVkIHNob3J0IHhfZGltZW5bRElNTlVNXTsKLSAgICAgIH0gICAgICB4X2FyeTsKLSAgICB9ICAgICB4X2ZjbmFyeTsKLQotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZuZHg7CS8qIHR2IGluZGV4ICovCi0gIH0gICAgICB4X3N5bTsKLQotICB1bmlvbgotICB7Ci0gICAgY2hhciB4X2ZuYW1lW0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIHhfemVyb2VzOwotICAgICAgbG9uZyB4X29mZnNldDsKLSAgICB9ICAgICAgeF9uOwotICB9ICAgICB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBsb25nIHhfc2NubGVuOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25yZWxvYzsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25saW5ubzsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICB1bnNpZ25lZCBsb25nIHhfY2hlY2tzdW07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtIGZvciBQRSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfYXNzb2NpYXRlZDsgLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfY29tZGF0OwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciBmb3IgUEUgKi8KLSAgfSAgICAgIHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3R2ZmlsbDsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bGVuOwkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dnJhblsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSAgICAgIHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogUlMvNjAwMC1zcGVjaWZpYyBhdXhlbnQgLSBsYXN0IGF1eGVudCBmb3IgZXZlcnkgZXh0ZXJuYWwgc3ltYm9sCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHN0cnVjdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsJCQkJLyogY3NlY3QgbGVuZ3RoIG9yIGVuY2xvc2luZyBjc2VjdCAqLwotCWxvbmcgbDsKLQlzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpwOwotICAgICAgfSB4X3NjbmxlbjsKLSAgICBsb25nIHhfcGFybWhhc2g7CQkvKiBwYXJtIHR5cGUgaGFzaCBpbmRleCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfc25oYXNoOwkvKiBzZWN0IG51bSB3aXRoIHBhcm0gaGFzaCAqLwotICAgIHVuc2lnbmVkIGNoYXIgeF9zbXR5cDsJLyogc3ltYm9sIGFsaWduIGFuZCB0eXBlICovCi0gICAgLyogMC00IC0gTG9nIDIgb2YgYWxpZ25tZW50ICovCi0gICAgLyogNS03IC0gc3ltYm9sIHR5cGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc21jbGFzOwkvKiBzdG9yYWdlIG1hcHBpbmcgY2xhc3MgKi8KLSAgICBsb25nIHhfc3RhYjsJCS8qIGRieCBzdGFiIGluZm8gaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3Nuc3RhYjsJLyogc2VjdCBudW0gd2l0aCBkYnggc3RhYiAqLwotICB9ICAgICAgeF9jc2VjdDsJCS8qIGNzZWN0IGRlZmluaXRpb24gaW5mb3JtYXRpb24gKi8KLQotLyogeF9zbXR5cCB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVNNVFlQX0FMSUdOKHgpCSgoeCkgPj4gMykJLyogbG9nMiBvZiBhbGlnbm1lbnQgKi8KLSNkZWZpbmUJU01UWVBfU01UWVAoeCkJKCh4KSAmIDB4NykJLyogc3ltYm9sIHR5cGUgKi8KLS8qIFN5bWJvbCB0eXBlIHZhbHVlczogICovCi0jZGVmaW5lCVhUWV9FUgkwCQkvKiBFeHRlcm5hbCByZWZlcmVuY2UgKi8KLSNkZWZpbmUJWFRZX1NECTEJCS8qIENzZWN0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUJWFRZX0xECTIJCS8qIExhYmVsIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgWFRZX0NNCTMJCS8qIC5CU1MgKi8KLSNkZWZpbmUJWFRZX0VNCTQJCS8qIEVycm9yIG1lc3NhZ2UgKi8KLSNkZWZpbmUJWFRZX1VTCTUJCS8qICJSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIiAqLwotCi0vKiB4X3NtY2xhcyB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVhNQ19QUgkwCQkvKiBSZWFkLW9ubHkgcHJvZ3JhbSBjb2RlICovCi0jZGVmaW5lCVhNQ19STwkxCQkvKiBSZWFkLW9ubHkgY29uc3RhbnQgKi8KLSNkZWZpbmUJWE1DX0RCCTIJCS8qIFJlYWQtb25seSBkZWJ1ZyBkaWN0aW9uYXJ5IHRhYmxlICovCi0jZGVmaW5lCVhNQ19UQwkzCQkvKiBSZWFkLXdyaXRlIGdlbmVyYWwgVE9DIGVudHJ5ICovCi0jZGVmaW5lCVhNQ19VQQk0CQkvKiBSZWFkLXdyaXRlIHVuY2xhc3NpZmllZCAqLwotI2RlZmluZQlYTUNfUlcJNQkJLyogUmVhZC13cml0ZSBkYXRhICovCi0jZGVmaW5lCVhNQ19HTAk2CQkvKiBSZWFkLW9ubHkgZ2xvYmFsIGxpbmthZ2UgKi8KLSNkZWZpbmUJWE1DX1hPCTcJCS8qIFJlYWQtb25seSBleHRlbmRlZCBvcGVyYXRpb24gKi8KLSNkZWZpbmUJWE1DX1NWCTgJCS8qIFJlYWQtb25seSBzdXBlcnZpc29yIGNhbGwgKi8KLSNkZWZpbmUJWE1DX0JTCTkJCS8qIFJlYWQtd3JpdGUgQlNTICovCi0jZGVmaW5lCVhNQ19EUwkxMAkJLyogUmVhZC13cml0ZSBkZXNjcmlwdG9yIGNzZWN0ICovCi0jZGVmaW5lCVhNQ19VQwkxMQkJLyogUmVhZC13cml0ZSB1bm5hbWVkIEZvcnRyYW4gY29tbW9uICovCi0jZGVmaW5lCVhNQ19USQkxMgkJLyogUmVhZC1vbmx5IHRyYWNlYmFjayBpbmRleCBjc2VjdCAqLwotI2RlZmluZQlYTUNfVEIJMTMJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgdGFibGUgY3NlY3QgKi8KLS8qIAkJMTQJPz8/ICovCi0jZGVmaW5lCVhNQ19UQzAJMTUJCS8qIFJlYWQtd3JpdGUgVE9DIGFuY2hvciAqLwotI2RlZmluZSBYTUNfVEQJMTYJCS8qIFJlYWQtd3JpdGUgZGF0YSBpbiBUT0MgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqICBJOTYwLXNwZWNpZmljICoybmQqIGF1eC4gZW50cnkgZm9ybWF0cwotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIC8qIFRoaXMgaXMgYSB2ZXJ5IG9sZCB0eXBvIHRoYXQga2VlcHMgZ2V0dGluZyBwcm9wYWdhdGVkLiAqLwotI2RlZmluZSB4X3N0ZGluZHggeF9zdGluZHgKLSAgICBsb25nIHhfc3RpbmR4OwkJLyogc3lzLiB0YWJsZSBlbnRyeSAqLwotICB9ICAgICAgeF9zYzsJCQkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X2JhbG50cnk7CS8qIEJBTCBlbnRyeSBwb2ludCAqLwotICB9ICAgICAgeF9iYWw7CQkJLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHhfdGltZXN0YW1wOwkvKiB0aW1lIHN0YW1wICovCi0gICAgY2hhciB4X2lkc3RyaW5nWzIwXTsJLyogcHJvZHVjZXIgaWRlbnRpdHkgc3RyaW5nICovCi0gIH0gICAgICB4X2lkZW50OwkJLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jCi17Ci0gIGJmZF92bWEgcl92YWRkcjsJCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgbG9uZyByX3N5bW5keDsJCS8qIEluZGV4IGludG8gc3ltYm9sIHRhYmxlCSovCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsJLyogUmVsb2NhdGlvbiB0eXBlCQkqLwotICB1bnNpZ25lZCBjaGFyIHJfc2l6ZTsJCS8qIFVzZWQgYnkgUlMvNjAwMCBhbmQgRUNPRkYJKi8KLSAgdW5zaWduZWQgY2hhciByX2V4dGVybjsJLyogVXNlZCBieSBFQ09GRgkJKi8KLSAgdW5zaWduZWQgbG9uZyByX29mZnNldDsJLyogVXNlZCBieSBBbHBoYSBFQ09GRiwgU1BBUkMsIG90aGVycyAqLwotfTsKLQotI2RlZmluZSBSX0RJUjE2IAkgMQotI2RlZmluZSBSX0RJUjMyIAkgNgotI2RlZmluZSBSX0lNQUdFQkFTRQkgNwotI2RlZmluZSBSX1JFTEJZVEUJMTUKLSNkZWZpbmUgUl9SRUxXT1JECTE2Ci0jZGVmaW5lIFJfUkVMTE9ORwkxNwotI2RlZmluZSBSX1BDUkJZVEUJMTgKLSNkZWZpbmUgUl9QQ1JXT1JECTE5Ci0jZGVmaW5lIFJfUENSTE9ORwkyMAotI2RlZmluZSBSX0lQUlNIT1JUCTI0Ci0jZGVmaW5lIFJfSVBSTE9ORwkyNgotI2RlZmluZSBSX0dFVFNFRwkyOQotI2RlZmluZSBSX0dFVFBBIAkzMAotI2RlZmluZSBSX1RBR1dPUkQJMzEKLSNkZWZpbmUgUl9KVU1QVEFSRwkzMgkvKiBzdHJhbmdlIDI5ayAwMHh4MDB4eCByZWxvYyAqLwotCi0jZGVmaW5lIFJfUENSMTZMICAgICAgIDEyOAotI2RlZmluZSBSX1BDUjI2TCAgICAgICAxMjkKLSNkZWZpbmUgUl9WUlQxNiAgICAgICAgMTMwCi0jZGVmaW5lIFJfSFZSVDE2ICAgICAgIDEzMQotI2RlZmluZSBSX0xWUlQxNiAgICAgICAxMzIKLSNkZWZpbmUgUl9WUlQzMiAgICAgICAgMTMzCi0KLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aXRoIGEgMTZiaXQgYWJzb2x1dGUKLSAgIGFkZHJlc3MuICBUaGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gaW5zbnMgd2l0aCB0aGlzIHJlbG9jIGludG8KLSAgIGFuIGFic29sdXRlIDgtYml0IGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjEgICAgCTB4NDEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAxNmJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMTZCMiAJMHg0MgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgam1wIGluc25zIHdpdGggYSAxNmJpdCB0YXJnZXQgYWRkcmVzczsKLSAgIHRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiB0aGVzZSBpbnNucyBpbnRvIGJyYSBpbnNucyB3aXRoCi0gICBhbiA4Yml0IHBjLXJlbGF0aXZlIHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMSAgICAgCTB4NDMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMTZiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVAyIAkJMHg0NAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgUl9SRUxMT05HX05FRyAgCTB4NDUKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMjRiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwxICAgICAJMHg0NgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBicmEgd2l0aCBhbiA4LWJpdCBwYy1yZWxhdGl2ZQotICAgdGFyZ2V0IHRoYXQgd2FzIGZvcm1lcmxseSBhIGptcCBpbnNuIHdpdGggYSAyNGJpdCB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwyCQkweDQ3Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDI0Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLQotI2RlZmluZSBSX01PVjI0QjEgICAgCTB4NDgKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAyNGJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMjRCMiAJMHg0OQotCi0vKiBBbiBoODMwMCBtZW1vcnkgaW5kaXJlY3QganVtcC9jYWxsLiAgRm9yY2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wL2NhbGwKLSAgIHRhcmdldCBpbnRvIHRoZSBmdW5jdGlvbiB2ZWN0b3IgKGluIHBhZ2UgemVybyksIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIHZlY3RvciBlbnRyeSB0byBiZSBwbGFjZWQgaW4gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJfTUVNX0lORElSRUNUCTB4NGEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgMTZiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldCB3aGljaCB3YXMKLSAgIHNob3J0ZW5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldC4gICovCi0jZGVmaW5lIFJfUENSV09SRF9CCTB4NGIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc3RydWN0aW9ucyB3aXRoIGEgMzIvMjQgYml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzOyB0aGUgbGlua2VyIG1heSB0dXJuIHRoaXMgaW50byBhIG1vdi5bd2xdCi0gICBpbnNuIHdpdGggYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMSAgICAJMHg0YwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92Llt3bF0gaW5zbnMgd2hpY2ggZm9ybWVybGx5IGhhZAotICAgYSAzMi8yNGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGFuZCBub3cgaGF2ZSBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVkwyIAkweDRkCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJDQzo4IHdoaWNoIHdpbGwgaGF2ZSBpdCdzIGNvbmRpdGlvbgotICAgaW52ZXJ0ZWQgYW5kIGl0cyB0YXJnZXQgcmVkaXJlY3RlZCB0byB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2gKLSAgIGluIHRoZSBmb2xsb3dpbmcgaW5zbi4gICovCi0jZGVmaW5lIFJfQkNDX0lOVgkweDRlCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGptcCBpbnN0cnVjdGlvbiB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuICAqLwotI2RlZmluZSBSX0pNUF9ERUwJMHg0ZgotCi0vKiBaOGsgbW9kZXMgKi8KLSNkZWZpbmUgUl9JTU0xNiAgIDB4MDEJCS8qIDE2IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9KUgkgIDB4MDIJCS8qIGpyICA4IGJpdCBkaXNwICovCi0jZGVmaW5lIFJfSU1NNEwgICAweDIzCQkvKiBsb3cgbmliYmxlICovCi0jZGVmaW5lIFJfSU1NOCAgICAweDIyCQkvKiA4IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9JTU0zMiAgIFJfUkVMTE9ORwkvKiAzMiBiaXQgYWJzICovCi0jZGVmaW5lIFJfQ0FMTCAgICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEgY2FsbHIgKi8KLSNkZWZpbmUgUl9KUAkgIFJfREEJCS8qIEFic29sdXRlIGFkZHJlc3Mgd2hpY2ggY291bGQgYmUgYSBqcCAqLwotI2RlZmluZSBSX1JFTDE2ICAgMHgwNAkJLyogMTYgYml0IFBDIHJlbCAqLwotI2RlZmluZSBSX0NBTExSCSAgMHgwNQkJLyogY2FsbHIgMTIgYml0IGRpc3AgKi8KLSNkZWZpbmUgUl9TRUcgICAgIDB4MTAJCS8qIHNldCBpZiBpbiBzZWdtZW50ZWQgbW9kZSAqLwotI2RlZmluZSBSX0lNTTRIICAgMHgyNAkJLyogaGlnaCBuaWJibGUgKi8KLSNkZWZpbmUgUl9ESVNQNyAgIDB4MjUgICAgICAgICAgLyogZGpueiBkaXNwbGFjZW1lbnQgKi8KLQotLyogSDg1MDAgbW9kZXMgKi8KLQotI2RlZmluZSBSX0g4NTAwX0lNTTggIAkxCQkvKiAgOCBiaXQgaW1tZWRpYXRlIAkqLwotI2RlZmluZSBSX0g4NTAwX0lNTTE2IAkyCQkvKiAxNiBiaXQgaW1tZWRpYXRlCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUw4IAkzCQkvKiAgOCBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUwxNiA0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX0g4NTAwX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTMyICAgOCAgICAgICAgICAgICAgIC8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9ISUdIMTYgIDkJCS8qIGhpZ2ggMTYgYml0cyBvZiAzMiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFc2NSBtb2RlcyAqLwotCi0jZGVmaW5lIFJfVzY1X0FCUzgJMSAgLyogYWRkciAmIDB4ZmYgCQkqLwotI2RlZmluZSBSX1c2NV9BQlMxNgkyICAvKiBhZGRyICYgMHhmZmZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMjQJMyAgLyogYWRkciAmIDB4ZmZmZmZmIAkJKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4UzggICAgNCAgLyogKGFkZHIgPj4gOCkgJiAweGZmIAkqLwotI2RlZmluZSBSX1c2NV9BQlM4UzE2ICAgNSAgLyogKGFkZHIgPj4gMTYpICYgMHhmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9BQlMxNlM4ICAgNiAgLyogKGFkZHIgPj4gOCkgJiAwZmZmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTZTMTYgIDcgIC8qIChhZGRyID4+IDE2KSAmIDBmZmZmIAkqLwotCi0jZGVmaW5lIFJfVzY1X1BDUjgJOAotI2RlZmluZSBSX1c2NV9QQ1IxNgk5Ci0KLSNkZWZpbmUgUl9XNjVfRFAgICAgICAgMTAgIC8qIGRpcmVjdCBwYWdlIDggYml0cyBvbmx5ICAgKi8KLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tNjhrLmggYi9pbmNsdWRlL2NvZmYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE0N2VkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBNNjhLICovCi0KLSNpZm5kZWYgR05VX0NPRkZfTTY4S19ICi0jZGVmaW5lIEdOVV9DT0ZGX002OEtfSCAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIE1vdG9yb2xhIDY4MDAwLzY4MDA4LzY4MDEwLzY4MDIwICovCi0jZGVmaW5lCU1DNjhNQUdJQwkwNTIwCi0jZGVmaW5lIE1DNjhLV1JNQUdJQwkwNTIwCS8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU1DNjhUVk1BR0lDCTA1MjEKLSNkZWZpbmUgTUM2OEtST01BR0lDCTA1MjEJLyogcmVhZG9ubHkgc2hhcmVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUgTUM2OEtQR01BR0lDCTA1MjIJLyogZGVtYW5kIHBhZ2VkIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTTY4TUFHSUMJMDIxMAotI2RlZmluZQlNNjhUVk1BR0lDCTAyMTEKLQotLyogdGhpcyBpcyB0aGUgbWFnaWMgb2YgdGhlIEJ1bGwgZHB4LzIgKi8KLSNkZWZpbmUgTUM2OEtCQ1NNQUdJQwkwNTI2Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotCi0vKiBUaGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgaW5jbHVkZSBNQzY4S0JDU01BR0lDOyBpdCBvbmx5IGluY2x1ZGVzCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGltcGx5IHRoYXQgbmFtZXMgZG8gbm90IGhhdmUgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TFlOWENPRkZNQUdJQykgKQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLQotI2RlZmluZSBQQUdFTUFHSUNFWEVDU1dBUFBFRCAgMDQwNyAvKiBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgMDQxMCAvKiBwdXJlIGV4ZWN1dGFibGUgKHN3YXBwZWQpICovCi0jZGVmaW5lIFBBR0VNQUdJQ1BFWEVDVFNITElCICAwNDQzIC8qIHB1cmUgZXhlY3V0YWJsZSAodGFyZ2V0IHNoYXJlZCBsaWJyYXJ5KSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1BBR0VEICAgMDQxMyAvKiBwdXJlIGV4ZWN1dGFibGUgKHBhZ2VkKSAqLwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0jZW5kaWYgLyogR05VX0NPRkZfTTY4S19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTg4ay5oIGIvaW5jbHVkZS9jb2ZmL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ZWI0MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODhrIGJjcyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgTUM4OE1BR0lDICAwNTQwICAgICAgICAgICAvKiA4OGsgQkNTIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgTUM4OERNQUdJQyAwNTQxICAgICAgICAgICAvKiBERy9VWCBleGVjdXRhYmxlICAgKi8KLSNkZWZpbmUgTUM4OE9NQUdJQyAwNTU1CSAgICAgICAgICAvKiBPYmplY3QgZmlsZSAgICAgICAgKi8KLQotI2RlZmluZSBNQzg4QkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DODhNQUdJQykgJiYoKHgpLmZfbWFnaWMhPU1DODhETUFHSUMpICYmICgoeCkuZl9tYWdpYyAhPSBNQzg4T01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgUEFHRU1BR0lDMyAwNDE0IC8qIFNwbGl0IGkmZCwgemVybyBtYXBwZWQgKi8KLSNkZWZpbmUgUEFHRU1BR0lDQkNTIDA0MTMKLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgCi17Ci0gIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCQlzX25yZWxvY1s0XTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyCQlzX25sbm5vWzRdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm97Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQotCWNoYXIgbF9sbm5vWzRdOwotCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkwMTcKLSNkZWZpbmUgTl9UTUFTSwkJMDYwCi0jZGVmaW5lIE5fQlRTSEZUCTQKLSNkZWZpbmUgTl9UU0hJRlQJMgotCi0KLS8qIE5vdGUgdGhhdCB0aGlzIGlzbid0IHRoZSBzYW1lIHNoYXBlIGFzIG90aGVyIGNvZmZzICovCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgLyogNCAqLwotICAgIHVuaW9uIHsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzRdOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZVs0XTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotICAgIH0geF9taXNjOwotICAgIAotICAgIC8qIDEyICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIC8qIDIwICovCi0gICAgCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2NbNF07CQkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm9bNF07CQkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdHZmaWxsWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlblsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW5bMl1bMl07CQkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi19OwotCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKQotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTIwCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAgMTIKLQotI2RlZmluZSBOT19UVk5EWApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21jb3JlLmggYi9pbmNsdWRlL2NvZmYvbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMzE5Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKiBNb3Rvcm9sYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBDT0ZGL1BFIEFCSS4gKi8KLQotI2lmbmRlZiBfQ09GRl9NT1JFX0gKLSNkZWZpbmUgX0NPRkZfTU9SRV9ICi0KLQotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUgICAgICAgICAgCTB4MDAwMAotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyICAgICAgICAgICAgCTB4MDAwMQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNAkJMHgwMDAyCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMgkJMHgwMDAzCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyCQkweDAwMDQKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyCQkweDAwMDUKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMgkweDAwMDYKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1JWQQkJCTB4MDAwNwotCi0jZGVmaW5lIFBFTUNPUkUKLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljICAgICAgWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wICAgICBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZSAgICAgIFs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplICAgICAgWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplICAgICAgWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5ICAgICAgWzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnQgWzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0vKiBGcm9tIHdpbm50LmggKi8KLSNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgotCi0KLS8qIERlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzLiAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLXsKLSAgY2hhciByX3ZhZGRyICBbNF07Ci0gIGNoYXIgcl9zeW1uZHggWzRdOwotICBjaGFyIHJfdHlwZSAgIFsyXTsKLSAgY2hhciByX29mZnNldCBbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNAotCi0jZGVmaW5lCU1DT1JFTUFHSUMJMHhiMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCi0KLSNkZWZpbmUgTUNPUkVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9IE1DT1JFTUFHSUMpKQotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotICBjaGFyIGZfbWFnaWMgIFsyXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zICBbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdCBbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyIFs0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXMgIFs0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHIgWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzICBbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgZV9uYW1lIFtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGVfemVyb2VzIFs0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXQgWzRdOwotICAgIH0gZTsKLSAgfSBlOwotICAKLSAgY2hhciBlX3ZhbHVlICBbNF07Ci0gIGNoYXIgZV9zY251bSAgWzJdOwotICBjaGFyIGVfdHlwZSAgIFsyXTsKLSAgY2hhciBlX3NjbGFzcyBbMV07Ci0gIGNoYXIgZV9udW1hdXggWzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkweGYKLSNkZWZpbmUgTl9UTUFTSwkJMHgzMAotI2RlZmluZSBOX0JUU0hGVAk0Ci0jZGVmaW5lIE5fVFNISUZUCTIKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci17Ci0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3RhZ25keCBbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsKLQljaGFyICB4X2xubm8gWzJdOyAJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemUgWzJdOyAJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotCi0gICAgICBjaGFyIHhfZnNpemUgWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCi0gICAgfSB4X21pc2M7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLSAgICAgIHsKLQljaGFyIHhfbG5ub3B0ciBbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keCAgWzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0KLSAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLSAgICAgIHsKLQljaGFyIHhfZGltZW4gW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgICAKLSAgICB9IHhfZmNuYXJ5OwotCi0gICAgY2hhciB4X3R2bmR4IFsyXTsJCS8qIHR2IGluZGV4ICovCi0KLSAgfSB4X3N5bTsKLQotICB1bmlvbgotICB7Ci0gICAgY2hhciB4X2ZuYW1lIFtFX0ZJTE5NTEVOXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIHhfemVyb2VzIFs0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXQgWzRdOwotICAgIH0geF9uOwotICAgIAotICB9IHhfZmlsZTsKLQotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF9zY25sZW4gICAgIFs0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jICAgICBbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgY2hhciB4X25saW5ubyAgICAgWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotICAgIGNoYXIgeF9jaGVja3N1bSAgIFs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLSAgICBjaGFyIHhfYXNzb2NpYXRlZCBbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgICBjaGFyIHhfY29tZGF0ICAgICBbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0gIH0geF9zY247Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfdHZmaWxsIFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW4gIFsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW4gIFsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGxfc3ltbmR4IFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0gICAgY2hhciBsX3BhZGRyICBbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotICB9IGxfYWRkcjsKLQotICBjaGFyIGxfbG5ubyBbMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpICAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLSAgY2hhcglzX25hbWUgICAgWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICBjaGFyCXNfcGFkZHIgICBbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJc192YWRkciAgIFs0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyCXNfc2l6ZSAgICBbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIJc19zY25wdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcglzX3JlbHB0ciAgWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGNoYXIJc19sbm5vcHRyIFs0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIGNoYXIJc19ucmVsb2MgIFsyXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyCXNfbmxubm8gICBbMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgY2hhcglzX2ZsYWdzICAgWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBOYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMuICAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0KLSNlbmRpZiAvKiBfX0NPRkZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21pcHMuaCBiL2luY2x1ZGUvY29mZi9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjY1YjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKiBFQ09GRiBzdXBwb3J0IG9uIE1JUFMgbWFjaGluZXMuCi0gICBjb2ZmL2Vjb2ZmLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBmaWxlLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotICB1bnNpZ25lZCBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBNYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIGNvZmYvZWNvZmYuaC4gICovCi0jZGVmaW5lIE1JUFNfRUNPRkZfQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfMSkgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRSkgJiZcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFMikgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRzIpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUzKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHMykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkcgotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgdW5zaWduZWQgY2hhcglkc2l6ZVs0XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBjaGFyIHRleHRfc3RhcnRbNF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgYnNzX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBncHJtYXNrWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIGNwcm1hc2tbNF1bNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BfdmFsdWVbNF07CS8qIHZhbHVlIGZvciBncCByZWdpc3RlciAqLwotfSBBT1VUSERSOwotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogNTYKLSNkZWZpbmUgQU9VVEhEUlNaIDU2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotICB1bnNpZ25lZCBjaGFyCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICB1bnNpZ25lZCBjaGFyCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgdW5zaWduZWQgY2hhcglzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICB1bnNpZ25lZCBjaGFyCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogOAotCi0vKiBNSVBTIEVDT0ZGIHVzZXMgYSBwYWNrZWQgOCBieXRlIGZvcm1hdCBmb3IgcmVsb2NzLiAgVGhlc2UgY29uc3RhbnRzCi0gICBhcmUgdXNlZCB0byB1bnBhY2sgdGhlIHJfYml0cyBmaWVsZC4gICovCi0KLSNkZWZpbmUgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHCQkxNgotI2RlZmluZSBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0JJRwkJOAotI2RlZmluZSBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRwkJMAotI2RlZmluZSBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJMTYKLQotLyogT3JpZ2luYWxseSwgRUNPRkYgdXNlZCBmb3VyIGJpdHMgZm9yIHRoZSByZWxvYyB0eXBlIGFuZCBoYWQgdGhyZWUKLSAgIHJlc2VydmVkIGJpdHMuICBJcml4IDQgYWRkZWQgYW5vdGhlciBiaXQgZm9yIHRoZSByZWxvYyB0eXBlLCB3aGljaAotICAgd2FzIGVhc3kgYmVjYXVzZSBpdCB3YXMgYmlnIGVuZGlhbiBhbmQgb25lIG9mIHRoZSBzcGFyZSBiaXRzIGJlY2FtZQotICAgdGhlIG5ldyBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRvIG1ha2UgdGhpcyBhbHNvIHdvcmsgZm9yIGxpdHRsZQotICAgZW5kaWFuIEVDT0ZGLCB3ZSBuZWVkIHRvIHdyYXAgb25lIG9mIHRoZSByZXNlcnZlZCBiaXRzIGFyb3VuZCB0bwotICAgYmVjb21lIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcmVsb2MgdHlwZS4gICovCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfQklHCQkJMHgzRQotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRwkJCTEKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9MSVRUTEUJCQkweDc4Ci0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFCQkzCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUJCTB4MDQKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRQkJMgotCi0jZGVmaW5lIFJFTE9DX0JJVFMzX0VYVEVSTl9CSUcJCQkweDAxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUJCTB4ODAKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhIHJlbG9jIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gIEkKLSAgIGRvbid0IGtub3cgaWYgYW55IG90aGVyIHZhbHVlcyBjYW4gYXBwZWFyLiAgVGhlc2Ugc2VlbSB0byBiZSBhbGwKLSAgIHRoYXQgb2NjdXIgaW4gdGhlIFVsdHJpeCA0LjIgbGlicmFyaWVzLiAgKi8KLSNkZWZpbmUgTUlQU19SX0lHTk9SRQkwCi0jZGVmaW5lIE1JUFNfUl9SRUZIQUxGCTEKLSNkZWZpbmUgTUlQU19SX1JFRldPUkQJMgotI2RlZmluZSBNSVBTX1JfSk1QQUREUgkzCi0jZGVmaW5lIE1JUFNfUl9SRUZISQk0Ci0jZGVmaW5lIE1JUFNfUl9SRUZMTwk1Ci0jZGVmaW5lIE1JUFNfUl9HUFJFTAk2Ci0jZGVmaW5lIE1JUFNfUl9MSVRFUkFMCTcKLQotLyogVGhlc2UgcmVsb2MgdHlwZXMgYXJlIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZwotICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIFRoZSBudW1iZXJzIGFyZQotICAgdGFrZW4gZnJvbSBJcml4IDQsIGJ1dCBhdCBsZWFzdCBmb3IgaW50ZXJuYWwgcmVsb2NzIElyaXggNSBkb2VzIG5vdAotICAgZ2l2ZSB0aGVtIHRoZSBzYW1lIG1lYW5pbmcuICBGb3IgYW4gaW50ZXJuYWwgcmVsb2MgdGhlIHN5bWJvbCBpbmRleAotICAgb2YgUkVMSEkgYW5kIFJFTExPIGlzIG1vZGlmaWVkIGFzIGRlc2NyaWJlZCBiZWxvdyBmb3IKLSAgIE1JUFNfUl9TV0lUQ0guICAqLwotI2RlZmluZSBNSVBTX1JfUENSRUwxNgkxMgotI2RlZmluZSBNSVBTX1JfUkVMSEkJMTMKLSNkZWZpbmUgTUlQU19SX1JFTExPCTE0Ci0KLS8qIFRoaXMgcmVsb2MgdHlwZSBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCBpcyB1c2VkIGZvciBhbiBlbnRyeSBpbgotICAgYSBzd2l0Y2ggdGFibGUsIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKLSAgICAgLndvcmQgJEwzLSRMUzEyCi0gICBUaGUgb2JqZWN0IGZpbGUgd2lsbCBjb250YWluIHRoZSBjb3JyZWN0IGRpZmZlcmVuY2UsIGFuZCBkb2VzIG5vdAotICAgcmVxdWlyZSBhZGp1c3RtZW50LiAgSG93ZXZlciwgd2hlbiB0aGUgbGlua2VyIGlzIHJlbGF4aW5nIFBDCi0gICByZWxhdGl2ZSBjYWxscywgaXQgaXMgcG9zc2libGUgZm9yICRMMyB0byBtb3ZlIGZhcnRoZXIgYXdheS4gIFRoaXMKLSAgIHJlbG9jIGFsd2F5cyBhcHBlYXJzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBhbmQgaXMgYWx3YXlzIGFnYWluc3QKLSAgIHRoZSAudGV4dCBzZWN0aW9uLiAgSG93ZXZlciwgdGhlIHN5bWJvbCBpbmRleCBpcyBub3QKLSAgIFJFTE9DX1NFQ1RJT05fVEVYVC4gIEl0IGlzLCBpbnN0ZWFkLCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzCi0gICBzd2l0Y2ggdGFibGUgZW50cnkgYW5kICRMUzEyLiAgVGh1cywgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMTIgaXMKLSAgICAgdmFkZHIgLSBzeW1uZHgKLSAgIGFuZCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgJEwzIGlzCi0gICAgIHZhZGRyIC0gc3ltbmR4ICsgYWRkZW5kCi0gICB3aGVyZSBhZGRlbmQgaXMgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZS4gIEtub3dpbmcgdGhpcywgdGhlCi0gICBsaW5rZXIgY2FuIGtub3cgd2hldGhlciB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICBhZGp1c3RlZC4gICovCi0jZGVmaW5lIE1JUFNfUl9TV0lUQ0gJMjIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1RBQlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNSVBTX0lTX1NUQUIgRUNPRkZfSVNfU1RBQgotI2RlZmluZSBNSVBTX01BUktfU1RBQiBFQ09GRl9NQVJLX1NUQUIKLSNkZWZpbmUgTUlQU19VTk1BUktfU1RBQiBFQ09GRl9VTk1BUktfU1RBQgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xJQyBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4gICovCi0KLS8qIEVDT0ZGIHVzZXMgQ09GRi1saWtlIHNlY3Rpb24gc3RydWN0dXJlcywgYnV0IGl0cyBvd24gc3ltYm9sIGZvcm1hdC4KLSAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzeW1ib2wgZm9ybWF0IGluIGZpZWxkcyB3aG9zZSBzaXplIGFuZCBhbGlnbm1lbnQKLSAgIHdpbGwgbm90IHZhcnkgb24gZGlmZmVyZW50IGhvc3Qgc3lzdGVtcy4gICovCi0KLS8qIEZpbGUgaGVhZGVyIGFzIGEgc2V0IG9mIGJ5dGVzICovCi0KLXN0cnVjdCBoZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyIAloX21hZ2ljWzJdOwotCXVuc2lnbmVkIGNoYXIJaF92c3RhbXBbMl07Ci0JdW5zaWduZWQgY2hhcgloX2lsaW5lTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWRuTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkRuT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pcGRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUGRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzeW1NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3ltT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pb3B0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYk9wdE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWF1eE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JBdXhPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc01heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc09mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzRXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzRXh0T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZmRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRmRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUmZkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkV4dE9mZnNldFs0XTsKLX07Ci0KLS8qIEZpbGUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGZkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJZl9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglmX3Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXNzQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JTc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXN5bUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglmX2lsaW5lQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2xpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lvcHRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pcGRGaXJzdFsyXTsKLQl1bnNpZ25lZCBjaGFyCWZfY3BkWzJdOwotCXVuc2lnbmVkIGNoYXIJZl9pYXV4QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2F1eFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcmZkQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZVs0XTsKLX07Ci0KLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfQklHCQkweEY4Ci0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0JJRwkJMwotI2RlZmluZQlGRFJfQklUUzFfTEFOR19MSVRUTEUJCTB4MUYKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFCTAKLQotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0JJRwkJMHgwNAotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0xJVFRMRQkJMHgyMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0JJRwkJMHgwMgotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUJMHg0MAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRwkweDAxCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRQkweDgwCi0KLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9CSUcJCTB4QzAKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcJCTYKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUJMAotCi0vKiBXZSBpZ25vcmUgdGhlIGByZXNlcnZlZCcgZmllbGQgaW4gYml0czIuICovCi0KLS8qIFByb2NlZHVyZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgcGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglwX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaWxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaW9wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX2xuTG93WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkhpZ2hbNF07Ci0JdW5zaWduZWQgY2hhcglwX2NiTGluZU9mZnNldFs0XTsKLX07Ci0KLS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlICovCi0KLXN0cnVjdCBycGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglwX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfaXJwc3NbNF07Ci0JdW5zaWduZWQgY2hhcglwX3Jlc2VydmVkWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9leGNlcHRpb25faW5mb1s0XTsKLX07Ci0KLS8qIExpbmUgbnVtYmVycyAqLwotCi1zdHJ1Y3QgbGluZV9leHQgewotCXVuc2lnbmVkIGNoYXIJbF9saW5lWzRdOwotfTsKLQotLyogU3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgc3ltX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglzX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXNfdmFsdWVbNF07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czNbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHM0WzFdOwotfTsKLQotI2RlZmluZQlTWU1fQklUUzFfU1RfQklHCQkweEZDCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9CSUcJCTIKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0xJVFRMRQkJMHgzRgotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0JJRwkJMHgwMwotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcJMwotI2RlZmluZQlTWU1fQklUUzFfU0NfTElUVExFCQkweEMwCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MSVRUTEUJCTYKLQotI2RlZmluZQlTWU1fQklUUzJfU0NfQklHCQkweEUwCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9CSUcJCTUKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0xJVFRMRQkJMHgwNwotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUJMgotCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4MTAKLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0JJRwkJMHgwRgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0xJVFRMRQkJMHhGMAotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBleHRfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcgllc19pZmRbMl07Ci0Jc3RydWN0CXN5bV9leHQgZXNfYXN5bTsKLX07Ci0KLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9CSUcJCTB4ODAKLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUJCTB4MDEKLQotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcJMHg0MAotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUJMHgwMgotCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0JJRwkJMHgyMAotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUJMHgwNAotCi0vKiBEZW5zZSBudW1iZXJzIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZG5yX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglkX3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWRfaW5kZXhbNF07Ci19OwotCi0vKiBSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgKi8KLQotc3RydWN0IHJmZF9leHQgewotICB1bnNpZ25lZCBjaGFyCXJmZFs0XTsKLX07Ci0KLS8qIE9wdGltaXplciBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBvcHRfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMxWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czJbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzM1sxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHM0WzFdOwotICBzdHJ1Y3Qgcm5keF9leHQgb19ybmR4OwotICB1bnNpZ25lZCBjaGFyIG9fb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUcJOAotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRQkxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21pcHNwZS5oIGIvaW5jbHVkZS9jb2ZmL21pcHNwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTI3ZDk5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9taXBzcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFdpbmRvd3MgQ0Ugd2l0aCBNSVBTIFZSNDExMSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUgTUlQU19BUkNIX01BR0lDX1dJTkNFCTB4MDE2NiAgLyogV2luZG93cyBDRSAtIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgTUlQU19QRV9NQUdJQwkJMHgwMTBiCi0KLSNkZWZpbmUgTUlQU0JBRE1BRyh4KSBcCi0gKCh4KS5mX21hZ2ljIT1NSVBTX0FSQ0hfTUFHSUNfV0lOQ0UpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQotLyogTUlQUyBQRSByZWxvY2F0aW9uIHR5cGVzLiAqLwotCi0jZGVmaW5lCU1JUFNfUl9BQlNPTFVURQkwIC8qIGlnbm9yZWQgKi8KLSNkZWZpbmUJTUlQU19SX1JFRkhBTEYJMQotI2RlZmluZQlNSVBTX1JfUkVGV09SRAkyCi0jZGVmaW5lCU1JUFNfUl9KTVBBRERSCTMKLSNkZWZpbmUJTUlQU19SX1JFRkhJCTQgLyogUEFJUiBmb2xsb3dzICovCi0jZGVmaW5lCU1JUFNfUl9SRUZMTwk1Ci0jZGVmaW5lCU1JUFNfUl9HUFJFTAk2Ci0jZGVmaW5lCU1JUFNfUl9MSVRFUkFMCTcgLyogc2FtZSBhcyBHUFJFTCAqLwotI2RlZmluZQlNSVBTX1JfU0VDVElPTgkxMAotI2RlZmluZQlNSVBTX1JfU0VDUkVMCTExCi0jZGVmaW5lCU1JUFNfUl9TRUNSRUxMTwkxMgotI2RlZmluZQlNSVBTX1JfU0VDUkVMSEkJMTMgLyogUEFJUiBmb2xsb3dzICovCi0jZGVmaW5lCU1JUFNfUl9SVkEJMzQgLyogMHgyMiAqLwotI2RlZmluZQlNSVBTX1JfUEFJUgkzNyAvKiAweDI1IC0gc3ltbmR4IGlzIHJlYWxseSBhIHNpZ25lZCAxNi1iaXQgYWRkZW5kICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcGUuaCBiL2luY2x1ZGUvY29mZi9wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjU1NjJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qIFBFIENPRkYgaGVhZGVyIGluZm9ybWF0aW9uICovCi0KLSNpZm5kZWYgX1BFX0gKLSNkZWZpbmUgX1BFX0gKLQotLyogTlQgc3BlY2lmaWMgZmlsZSBhdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICAgICAgIDB4MDAwOAotI2RlZmluZSBJTUFHRV9GSUxFX0FHR1JFU1NJVkVfV1NfVFJJTSAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX0ZJTEVfTEFSR0VfQUREUkVTU19BV0FSRSAgICAgICAweDAwMjAKLSNkZWZpbmUgSU1BR0VfRklMRV8xNkJJVF9NQUNISU5FICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBJTUFHRV9GSUxFX1JFTU9WQUJMRV9SVU5fRlJPTV9TV0FQICAgMHgwNDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9ETEwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBJTUFHRV9GSUxFX1VQX1NZU1RFTV9PTkxZICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgICAgICAgICAweDgwMDAKLQotLyogQWRkaXRpb25hbCBmbGFncyB0byBiZSBzZXQgZm9yIHNlY3Rpb24gaGVhZGVycyB0byBhbGxvdyB0aGUgTlQgbG9hZGVyIHRvCi0gICByZWFkIGFuZCB3cml0ZSB0byB0aGUgc2VjdGlvbiBkYXRhICh0byByZXBsYWNlIHRoZSBhZGRyZXNzZXMgb2YgZGF0YSBpbgotICAgZGxscyBmb3Igb25lIHRoaW5nKTsgYWxzbyB0byBleGVjdXRlIHRoZSBzZWN0aW9uIGluIC50ZXh0J3MgY2FzZS4gICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgMHgwMjAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgMHg4MDAwMDAwMAotCi0vKiBTZWN0aW9uIGNoYXJhY3RlcmlzdGljcyBhZGRlZCBmb3IgcHBjLW50LiAgKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fVFlQRV9OT19QQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgLyogUmVzZXJ2ZWQuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9DT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8qIFNlY3Rpb24gY29udGFpbnMgY29kZS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBICAgICAgIDB4MDAwMDAwNDAgIC8qIFNlY3Rpb24gY29udGFpbnMgaW5pdGlhbGl6ZWQgZGF0YS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgICAgIDB4MDAwMDAwODAgIC8qIFNlY3Rpb24gY29udGFpbnMgdW5pbml0aWFsaXplZCBkYXRhLiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfT1RIRVIgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvKiBSZXNlcnZlZC4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19JTkZPICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgb3Igc29tZSBvdGhlciB0eXBlIG9mIGluZm9ybWF0aW9uLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX1JFTU9WRSAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgLyogU2VjdGlvbiBjb250ZW50cyB3aWxsIG5vdCBiZWNvbWUgcGFydCBvZiBpbWFnZS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19DT01EQVQgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgIC8qIFNlY3Rpb24gY29udGVudHMgY29tZGF0LiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRkFSREFUQSAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9QVVJHRUFCTEUgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV8xNkJJVCAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9MT0NLRUQgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9QUkVMT0FEICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLQotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTICAgICAgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUyAgICAgICAgICAgICAgMHgwMDUwMDAwMCAgLyogRGVmYXVsdCBhbGlnbm1lbnQgaWYgbm8gb3RoZXJzIGFyZSBzcGVjaWZpZWQuICovCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTICAgICAgICAgICAgICAweDAwNjAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgICAgICAweDAwNzAwMDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9TSEFSRUQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgIC8qIFNlY3Rpb24gaXMgc2hhcmVhYmxlLiAgICAgICAgICAgICAgICAgICovCi0KLS8qIENPTURBVCBzZWxlY3Rpb24gY29kZXMuICAqLwotCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgICAoMSkgLyogV2FybiBpZiBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlkJCSAgICAgKDIpIC8qIE5vIHdhcm5pbmcuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRQkgICAgICgzKSAvKiBXYXJuIGlmIGRpZmZlcmVudCBzaXplLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSAkgICAgICg0KSAvKiBXYXJuIGlmIGRpZmZlcmVudC4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUJICAgICAoNSkgLyogQmFzZSBvbiBvdGhlciBzZWN0aW9uLiAgKi8KLQotLyogTWFjaGluZSBudW1iZXJzLiAgKi8KLQotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAgICAgICAgICAgMHgwCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQSAgICAgICAgICAgICAweDE4NAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNICAgICAgICAgICAgICAgMHgxYzAKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBNjQgICAgICAgICAgIDB4Mjg0Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JMzg2ICAgICAgICAgICAgICAweDE0YwotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NCAgICAgICAgICAgICAgMHgyMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX002OEsgICAgICAgICAgICAgIDB4MjY4Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTMTYgICAgICAgICAgICAweDI2NgotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfTUlQU0ZQVSAgICAgICAgICAgMHgzNjYKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUxNiAgICAgICAgIDB4NDY2Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDICAgICAgICAgICAweDFmMAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUjMwMDAgICAgICAgICAgICAgMHgxNjIKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwICAgICAgICAgICAgIDB4MTY2Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SMTAwMDAgICAgICAgICAgICAweDE2OAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfU0gzICAgICAgICAgICAgICAgMHgxYTIKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1NINCAgICAgICAgICAgICAgIDB4MWE2Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9USFVNQiAgICAgICAgICAgICAweDFjMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9VTktOT1dOCQkJIDAKLSNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX05BVElWRQkJCSAxCi0jZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0dVSQkJIDIKLSNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ1VJCQkgMwotI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJCQkgNwotI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19DRV9HVUkJCSA5Ci0jZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT04JCTEwCi0jZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9FRklfQk9PVF9TRVJWSUNFX0RSSVZFUgkxMQotI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fRUZJX1JVTlRJTUVfRFJJVkVSCTEyCi0gIAotLyogTWFnaWMgdmFsdWVzIHRoYXQgYXJlIHRydWUgZm9yIGFsbCBkb3MvbnQgaW1wbGVtZW50YXRpb25zICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAKLQotLyogTlQgYWxsb3dzIGxvbmcgZmlsZW5hbWVzLCB3ZSB3YW50IHRvIGFjY29tbW9kYXRlIHRoaXMuICBUaGlzIG1heSBicmVhawotICAgc29tZSBvZiB0aGUgYmZkIGZ1bmN0aW9ucyAqLwotI3VuZGVmICBGSUxOTUxFTgotI2RlZmluZSBGSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0KLXN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGZpZWxkcyAqLwotICBjaGFyIGVfbWFnaWNbMl07CQkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICBjaGFyIGVfY2JscFsyXTsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIGNoYXIgZV9jcFsyXTsJCQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgY2hhciBlX2NybGNbMl07CQkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIGNoYXIgZV9jcGFyaGRyWzJdOwkJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIGNoYXIgZV9taW5hbGxvY1syXTsJCS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICBjaGFyIGVfbWF4YWxsb2NbMl07CQkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgY2hhciBlX3NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9zcFsyXTsJCQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIGNoYXIgZV9jc3VtWzJdOwkJLyogQ2hlY2tzdW0sIDB4MCAqLwotICBjaGFyIGVfaXBbMl07CQkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9jc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfbGZhcmxjWzJdOwkJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgY2hhciBlX292bm9bMl07CQkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIGNoYXIgZV9yZXNbNF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfb2VtaWRbMl07CQkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICBjaGFyIGVfb2VtaW5mb1syXTsJCS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIGNoYXIgZV9yZXMyWzEwXVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGNoYXIgZV9sZmFuZXdbNF07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgY2hhciBkb3NfbWVzc2FnZVsxNl1bNF07CS8qIG90aGVyIHN0dWZmLCBhbHdheXMgZm9sbG93IERPUyBoZWFkZXIgKi8KLSAgY2hhciBudF9zaWduYXR1cmVbNF07CQkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLQotICAvKiBGcm9tIHN0YW5kYXJkIGhlYWRlciAqLyAgCi0KLSAgY2hhciBmX21hZ2ljWzJdOwkJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhlIGZpbGVoZHIgaXMgb25seSB3ZWlyZCBpbiBpbWFnZXMuICAqLwotCi0jdW5kZWYgIEZJTEhEUgotI2RlZmluZSBGSUxIRFIgc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyCi0jdW5kZWYgIEZJTEhTWgotI2RlZmluZSBGSUxIU1ogMTUyCi0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotLyogMzItYml0IFBFIGEub3V0IGhlYWRlcjogKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIEFPVVRIRFIgc3RhbmRhcmQ7Ci0KLSAgLyogTlQgZXh0cmEgZmllbGRzOyBzZWUgaW50ZXJuYWwuaCBmb3IgZGVzY3JpcHRpb25zICovCi0gIGNoYXIgIEltYWdlQmFzZVs0XTsKLSAgY2hhciAgU2VjdGlvbkFsaWdubWVudFs0XTsKLSAgY2hhciAgRmlsZUFsaWdubWVudFs0XTsKLSAgY2hhciAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1ham9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNaW5vckltYWdlVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIFJlc2VydmVkMVs0XTsKLSAgY2hhciAgU2l6ZU9mSW1hZ2VbNF07Ci0gIGNoYXIgIFNpemVPZkhlYWRlcnNbNF07Ci0gIGNoYXIgIENoZWNrU3VtWzRdOwotICBjaGFyICBTdWJzeXN0ZW1bMl07Ci0gIGNoYXIgIERsbENoYXJhY3RlcmlzdGljc1syXTsKLSAgY2hhciAgU2l6ZU9mU3RhY2tSZXNlcnZlWzRdOwotICBjaGFyICBTaXplT2ZTdGFja0NvbW1pdFs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhcFJlc2VydmVbNF07Ci0gIGNoYXIgIFNpemVPZkhlYXBDb21taXRbNF07Ci0gIGNoYXIgIExvYWRlckZsYWdzWzRdOwotICBjaGFyICBOdW1iZXJPZlJ2YUFuZFNpemVzWzRdOwotICAvKiBJTUFHRV9EQVRBX0RJUkVDVE9SWSBEYXRhRGlyZWN0b3J5W0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXTsgKi8KLSAgY2hhciAgRGF0YURpcmVjdG9yeVsxNl1bMl1bNF07IC8qIDE2IGVudHJpZXMsIDIgZWxlbWVudHMvZW50cnksIDQgY2hhcnMgKi8KLX0gUEVBT1VUSERSOwotI3VuZGVmIEFPVVRTWgotI2RlZmluZSBBT1VUU1ogKEFPVVRIRFJTWiArIDE5NikKLQotLyogTGlrZSBQRUFPVVRIRFIsIGV4Y2VwdCB0aGF0IHRoZSAic3RhbmRhcmQiIG1lbWJlciBoYXMgbm8gQmFzZU9mRGF0YQotICAgKGFrYSBkYXRhX3N0YXJ0KSBtZW1iZXIgYW5kIHRoYXQgc29tZSBvZiB0aGUgbWVtYmVycyBhcmUgOCBpbnN0ZWFkCi0gICBvZiBqdXN0IDQgYnl0ZXMgbG9uZy4gICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgQU9VVEhEUiBzdGFuZGFyZDsKLQotICAvKiBOVCBleHRyYSBmaWVsZHM7IHNlZSBpbnRlcm5hbC5oIGZvciBkZXNjcmlwdGlvbnMgKi8KLSAgY2hhciAgSW1hZ2VCYXNlWzhdOwotICBjaGFyICBTZWN0aW9uQWxpZ25tZW50WzRdOwotICBjaGFyICBGaWxlQWxpZ25tZW50WzRdOwotICBjaGFyICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JJbWFnZVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNYWpvclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yU3Vic3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgUmVzZXJ2ZWQxWzRdOwotICBjaGFyICBTaXplT2ZJbWFnZVs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhZGVyc1s0XTsKLSAgY2hhciAgQ2hlY2tTdW1bNF07Ci0gIGNoYXIgIFN1YnN5c3RlbVsyXTsKLSAgY2hhciAgRGxsQ2hhcmFjdGVyaXN0aWNzWzJdOwotICBjaGFyICBTaXplT2ZTdGFja1Jlc2VydmVbOF07Ci0gIGNoYXIgIFNpemVPZlN0YWNrQ29tbWl0WzhdOwotICBjaGFyICBTaXplT2ZIZWFwUmVzZXJ2ZVs4XTsKLSAgY2hhciAgU2l6ZU9mSGVhcENvbW1pdFs4XTsKLSAgY2hhciAgTG9hZGVyRmxhZ3NbNF07Ci0gIGNoYXIgIE51bWJlck9mUnZhQW5kU2l6ZXNbNF07Ci0gIC8qIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOyAqLwotICBjaGFyICBEYXRhRGlyZWN0b3J5WzE2XVsyXVs0XTsgLyogMTYgZW50cmllcywgMiBlbGVtZW50cy9lbnRyeSwgNCBjaGFycyAqLwotfSBQRVA2NEFPVVRIRFI7Ci0jZGVmaW5lIFBFUDY0QU9VVFNaCTI0MAotICAKLSN1bmRlZiAgRV9GSUxOTUxFTgotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotLyogSW1wb3J0IFR5b2VzIGZvdCBJTEYgZm9ybWF0IG9iamVjdCBmaWxlcy4uICAqLwotI2RlZmluZSBJTVBPUlRfQ09ERQkwCi0jZGVmaW5lIElNUE9SVF9EQVRBCTEKLSNkZWZpbmUgSU1QT1JUX0NPTlNUCTIKLQotLyogSW1wb3J0IE5hbWUgVHlvZXMgZm9yIElMRiBmb3JtYXQgb2JqZWN0IGZpbGVzLiAgKi8KLSNkZWZpbmUgSU1QT1JUX09SRElOQUwJCTAKLSNkZWZpbmUgSU1QT1JUX05BTUUJCTEKLSNkZWZpbmUgSU1QT1JUX05BTUVfTk9QUkVGSVgJMgotI2RlZmluZSBJTVBPUlRfTkFNRV9VTkRFQ09SQVRFCTMKLQotI2VuZGlmIC8qIF9QRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oIGIvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmNmOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJhc2ljIGNvZmYgaW5mb3JtYXRpb24gZm9yIHRoZSBQb3dlclBDCi0gKgotICogQmFzZWQgb24gY29mZi9yczYwMDAuaCwgY29mZi9pMzg2LmggYW5kIG90aGVycy4KLSAqCi0gKiBJbml0aWFsIHJlbGVhc2U6IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotICBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0vKiBleHRyYSBOVCBkZWZpbmVzICovCi0jZGVmaW5lIFBQQ01BR0lDICAgICAgIDA3NjAgICAgICAgICAvKiBwZWVrZWQgb24gYWEgUG93ZXJQQyBXaW5kb3dzIE5UIGJveCAqLwotI2RlZmluZSBET1NNQUdJQyAgICAgICAweDVhNGQgICAgICAgLyogZnJvbSBhcm0uaCwgaTM4Ni5oICovCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KLQotLyogZnJvbSB3aW5udC5oICovCi0jZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKLQotI2RlZmluZSBQUENCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFBQQ01BR0lDKSAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJICAgICovCi0gIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkgICAgICAgICAgICAqLwotICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSAgICAqLwotICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JICAgICovCi0gIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSAgICAqLwotICBjaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkgICAgKi8KLSAgY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgICAgKi8KLSAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkgICAgKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotICB1bmlvbiB7Ci0gICAgY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCAqLwotICAgIGNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSAgICAgICAqLwotICB9IGxfYWRkcjsKLSAgY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTggICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICAgICAgICovCi0KLS8qIEFsbG93IHRoZSBmaWxlIG5hbWUgbGVuZ3RoIHRvIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGluY2x1ZGluZyBmaWxlICAgKi8KLSNpZm5kZWYgRV9GSUxOTUxFTgotI2RlZmluZSBFX0ZJTE5NTEVOCTE0Ci0jZW5kaWYKLQotI2RlZmluZSBFX0RJTU5VTQk0ICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkgICAgICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggICAgICAgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1syXTsgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICAgICAgICAgKi8KLQljaGFyICB4X3NpemVbMl07ICAgICAgICAgICAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAgICAgICAgICAgICovCi0gICAgICB9IHhfbG5zejsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJICAgICAgICAgICAvKiBzaXplIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCi0gICAgfSB4X21pc2M7Ci0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICAgICAgICAgICAqLwotCWNoYXIgeF9sbm5vcHRyWzRdOyAgICAgICAgIC8qIHB0ciB0byBmY24gbGluZSAjICAgICAgICAgICAgICAgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgICAgICAgICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICAgICAgICAqLwotCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgIH0geF9mY25hcnk7Ci0gICAgY2hhciB4X3R2bmR4WzJdOwkJICAgLyogdHYgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkgICAgICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICAgICAgICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfbnJlbG9jWzJdOwkgICAgICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzJdOwkgICAgICAgICAgIC8qICMgbGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfY2hlY2tzdW1bNF07CQkgICAvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bQkgICAgICAqLwotICAgIGNoYXIgeF9hc3NvY2lhdGVkWzJdOwkgICAvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gICAgY2hhciB4X2NvbWRhdFsxXTsJCSAgIC8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyCSAgICAgICovCi0gIH0geF9zY247Ci19OwotCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLSNkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmggYi9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWYxZDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIElCTSBSUy82MDAwICJYQ09GRiIgZmlsZSBkZWZpbml0aW9ucyBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0gICAgICAgIC8qIElCTSBSUy82MDAwICovCi0jZGVmaW5lIFU4MDJXUk1BR0lDICAgICAwNzMwICAgIC8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICoqY2hoKiogICAgICAqLwotI2RlZmluZSBVODAyUk9NQUdJQyAgICAgMDczNSAgICAvKiByZWFkb25seSBzaGFyYWJsZSB0ZXh0IHNlZ21lbnRzICAgICAgKi8KLSNkZWZpbmUgVTgwMlRPQ01BR0lDICAgIDA3MzcgICAgLyogcmVhZG9ubHkgdGV4dCBzZWdtZW50cyBhbmQgVE9DICAgICAgICovCi0KLSNkZWZpbmUgQkFETUFHKHgpCVwKLQkoKHgpLmZfbWFnaWMgIT0gVTgwMlJPTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gVTgwMldSTUFHSUMgJiYgXAotCSAoeCkuZl9tYWdpYyAhPSBVODAyVE9DTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgdW5zaWduZWQgY2hhcgltYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkgKi8KLSAgdW5zaWduZWQgY2hhcglkc2l6ZVs0XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkqLwotICB1bnNpZ25lZCBjaGFyCXRleHRfc3RhcnRbNF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglkYXRhX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJb190b2NbNF07CS8qIGFkZHJlc3Mgb2YgVE9DICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmVudHJ5WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBlbnRyeSBwb2ludCAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250ZXh0WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAudGV4dCBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmRhdGFbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5kYXRhIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NudG9jWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NubG9hZGVyWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAubG9hZGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuYnNzWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuYnNzIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX2FsZ250ZXh0WzJdOwkvKiAudGV4dCBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX2FsZ25kYXRhWzJdOwkvKiAuZGF0YSBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX21vZHR5cGVbMl07CS8qIG1vZHVsZSB0eXBlICg/PykgKi8KLSAgdW5zaWduZWQgY2hhciBvX2NwdXR5cGVbMl07CS8qIGNwdSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJb19tYXhzdGFja1s0XTsJLyogbWF4IHN0YWNrIHNpemUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fbWF4ZGF0YVs0XTsJLyogbWF4IGRhdGEgc2l6ZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIJb19yZXN2MlsxMl07CS8qIHJlc2VydmVkICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiA3MgotI2RlZmluZSBTTUFMTF9BT1VUU1ogKDI4KQotI2RlZmluZSBBT1VUSERSU1ogNzIKLQotI2RlZmluZQlSUzZLX0FPVVRIRFJfT01BR0lDCTB4MDEwNwkvKiBvbGQ6IHRleHQgJiBkYXRhIHdyaXRlYWJsZSAqLwotI2RlZmluZQlSUzZLX0FPVVRIRFJfTk1BR0lDCTB4MDEwOAkvKiBuZXc6IHRleHQgci9vLCBkYXRhIHIvdyAqLwotI2RlZmluZQlSUzZLX0FPVVRIRFJfWk1BR0lDCTB4MDEwQgkvKiBwYWdlZDogdGV4dCByL28sIGJvdGggcGFnZS1hbGlnbmVkICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9QQUQJIi5wYWQiCi0jZGVmaW5lIF9MT0FERVIJIi5sb2FkZXIiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5sb2FkZXIgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9MT0FERVIuICAqLwotI2RlZmluZSBTVFlQX0xPQURFUiAweDEwMDAKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmRlYnVnIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfREVCVUcuICAqLwotI2RlZmluZSBTVFlQX0RFQlVHIDB4MjAwMAotCi0vKiBYQ09GRiBoYW5kbGVzIGxpbmUgbnVtYmVyIG9yIHJlbG9jYXRpb24gb3ZlcmZsb3cgYnkgY3JlYXRpbmcKLSAgIGFub3RoZXIgc2VjdGlvbiBoZWFkZXIgd2l0aCBTVFlQX09WUkZMTyBzZXQuICAqLwotI2RlZmluZSBTVFlQX09WUkZMTyAweDgwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGNoYXIgeF9zY25sZW5bNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9wYXJtaGFzaFs0XTsKLQkJdW5zaWduZWQgY2hhciB4X3NuaGFzaFsyXTsKLQkJdW5zaWduZWQgY2hhciB4X3NtdHlwWzFdOwotCQl1bnNpZ25lZCBjaGFyIHhfc21jbGFzWzFdOwotCQl1bnNpZ25lZCBjaGFyIHhfc3RhYls0XTsKLQkJdW5zaWduZWQgY2hhciB4X3Nuc3RhYlsyXTsKLQl9IHhfY3NlY3Q7Ci0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotI2RlZmluZSBEQlhNQVNLIDB4ODAJCS8qIGZvciBkYnggc3RvcmFnZSBtYXNrICovCi0jZGVmaW5lIFNZTU5BTUVfSU5fREVCVUcoc3ltcHRyKSAoKHN5bXB0ciktPm5fc2NsYXNzICYgREJYTUFTSykKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3NpemVbMV07Ci0gIGNoYXIgcl90eXBlWzFdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCi0jZGVmaW5lIERFRkFVTFRfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCA0Ci0jZGVmaW5lIERFRkFVTFRfQlNTX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9URVhUX1NFQ1RJT05fQUxJR05NRU5UIDQKLS8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2bid0IGhlYXJkIG9mIGJlZm9yZSAqLwotI2RlZmluZSBERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UIDQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9yczZrNjQuaCBiL2luY2x1ZGUvY29mZi9yczZrNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkOGU0YzBlOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcnM2azY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGNjQiIGZpbGUgZGVmaW5pdGlvbnMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls4XTsvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiIAkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi19OwotCi0gICAgICAgIC8qIElCTSBSUy82MDAwICovCi0jZGVmaW5lIFU4MDNYVE9DTUFHSUMgMDc1NwkvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MsIFhDT0ZGNjQgKi8KLQotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFU4MDNYVE9DTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyNAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIHVuc2lnbmVkIGNoYXIJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIJb19kZWJ1Z2dlcls0XTsJCS8qIHJlc2VydmVkIAkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdGV4dF9zdGFydFs4XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCWRhdGFfc3RhcnRbOF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX3RvY1s4XTsJLyogYWRkcmVzcyBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZW50cnlbMl07CQkvKiBzZWN0aW9uIG51bWJlciBvZiBlbnRyeSBwb2ludCAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250ZXh0WzJdOwkJLyogc2VjdGlvbiBudW1iZXIgb2YgLnRleHQgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25kYXRhWzJdOwkJLyogc2VjdGlvbiBudW1iZXIgb2YgLmRhdGEgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250b2NbMl07CQkvKiBzZWN0aW9uIG51bWJlciBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NubG9hZGVyWzJdOwkJLyogc2VjdGlvbiBudW1iZXIgb2YgLmxvYWRlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmJzc1syXTsJCS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5ic3Mgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbnRleHRbMl07CQkvKiAudGV4dCBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX2FsZ25kYXRhWzJdOwkJLyogLmRhdGEgYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19tb2R0eXBlWzJdOwkJLyogbW9kdWxlIHR5cGUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fY3B1dHlwZVsyXTsJCS8qIGNwdSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJb19yZXN2Mls0XTsJCS8qIHJlc2VydmVkIAkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbOF07CQkvKiB0ZXh0IHNpemUgYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbOF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs4XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzhdOwkJLyogZW50cnkgcHQuCQkJKi8KLSAgdW5zaWduZWQgY2hhcglvX21heHN0YWNrWzhdOwkvKiBtYXggc3RhY2sgc2l6ZSAoPz8pIAkJKi8KLSAgdW5zaWduZWQgY2hhciBvX21heGRhdGFbOF07CS8qIG1heCBkYXRhIHNpemUgKD8/KSAJCSovCi0gIHVuc2lnbmVkIGNoYXIJb19yZXN2M1sxNl07CQkvKiByZXNlcnZlZCAJCQkqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMTIwCi0jZGVmaW5lIFNNQUxMX0FPVVRTWiAoMCkKLSNkZWZpbmUgQU9VVEhEUlNaIDcyCi0KLSNkZWZpbmUJUlM2S19BT1VUSERSX09NQUdJQwkweDAxMDcJLyogb2xkOiB0ZXh0ICYgZGF0YSB3cml0ZWFibGUgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX05NQUdJQwkweDAxMDgJLyogbmV3OiB0ZXh0IHIvbywgZGF0YSByL3cgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX1pNQUdJQwkweDAxMEIJLyogcGFnZWQ6IHRleHQgci9vLCBib3RoIHBhZ2UtYWxpZ25lZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcglzX25hbWVbOF07CQkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJc19wYWRkcls4XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCXNfdmFkZHJbOF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCXNfc2l6ZVs4XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCXNfc2NucHRyWzhdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJc19yZWxwdHJbOF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCXNfbG5ub3B0cls4XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcglzX25yZWxvY1s0XTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJc19ubG5ub1s0XTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJc19mbGFnc1s0XTsJCS8qIGZsYWdzCQkJKi8KLQljaGFyICAgIHNfcGFkWzRdOwkJLyogcGFkZGluZyAqLyAgCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9QQUQJIi5wYWQiCi0jZGVmaW5lIF9MT0FERVIJIi5sb2FkZXIiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLQotI2RlZmluZQlTQ05IU1oJNzIKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmxvYWRlciBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0xPQURFUi4gICovCi0jZGVmaW5lIFNUWVBfTE9BREVSIDB4MTAwMAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAuZGVidWcgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9ERUJVRy4gICovCi0jZGVmaW5lIFNUWVBfREVCVUcgMHgyMDAwCi0KLS8qIFhDT0ZGIGhhbmRsZXMgbGluZSBudW1iZXIgb3IgcmVsb2NhdGlvbiBvdmVyZmxvdyBieSBjcmVhdGluZwotICAgYW5vdGhlciBzZWN0aW9uIGhlYWRlciB3aXRoIFNUWVBfT1ZSRkxPIHNldC4gICovCi0jZGVmaW5lIFNUWVBfT1ZSRkxPIDB4ODAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs4XTsvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzhdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJCS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0KLSNkZWZpbmUJTElORVNaCTEyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfdmFsdWVbOF07Ci0gIH0gZTsKLSAgY2hhciBlX29mZnNldFs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0KLSAgICBzdHJ1Y3QgewotICAgIAl1bmlvbiB7Ci0JICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF9sbm5vWzRdOyAJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJY2hhciB4X3NpemVbMl07IAkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCSAgICB9IHhfbG5zejsKLQkgICAgc3RydWN0IHsKLQkJY2hhciB4X2xubm9wdHJbOF07LyogcHRyIHRvIGZjbiBsaW5lICovCi0JCWNoYXIgeF9mc2l6ZVs0XTsJIC8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJY2hhciB4X2VuZG5keFs0XTsJIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgICB9IHhfZmNuOwotIAl9IHhfZmNuYXJ5OwotICAgIH0geF9zeW07Ci0gICAgICAgICAKLSAgICB1bmlvbiB7Ci0JY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCXN0cnVjdCB7Ci0JICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0JICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0JICAgIGNoYXIgICAgICAgICAgeF9wYWRbNl07Ci0JICAgIHVuc2lnbmVkIGNoYXIgeF9mdHlwZVsxXTsKLQkgICAgdW5zaWduZWQgY2hhciB4X3Jlc3ZbMl07Ci0JfSB4X247Ci0gICAgfSB4X2ZpbGU7Ci0KLSAgICBzdHJ1Y3QgewotCWNoYXIgeF9leHB0cls4XTsKLQljaGFyIHhfZnNpemVbNF07Ci0JY2hhciB4X2VuZG5keFs0XTsKLQljaGFyIHhfcGFkWzFdOwotICAgIH0geF9leGNlcHQ7Ci0KLSAgICBzdHJ1Y3QgewotCSAgICB1bnNpZ25lZCBjaGFyIHhfc2NubGVuX2xvWzRdOwotCSAgICB1bnNpZ25lZCBjaGFyIHhfcGFybWhhc2hbNF07Ci0JICAgIHVuc2lnbmVkIGNoYXIgeF9zbmhhc2hbMl07Ci0JICAgIHVuc2lnbmVkIGNoYXIgeF9zbXR5cFsxXTsKLQkgICAgdW5zaWduZWQgY2hhciB4X3NtY2xhc1sxXTsKLQkgICAgdW5zaWduZWQgY2hhciB4X3Njbmxlbl9oaVs0XTsKLQkgICAgdW5zaWduZWQgY2hhciB4X3BhZFsxXTsKLSAgICB9IHhfY3NlY3Q7CQotCi0gICAgc3RydWN0IHsKLQljaGFyIHhfcGFkWzE3XTsKLQljaGFyIHhfYXV4dHlwZVsxXTsKLSAgICB9IHhfYXV4dHlwZTsKLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotI2RlZmluZSBEQlhNQVNLIDB4ODAJCS8qIGZvciBkYnggc3RvcmFnZSBtYXNrICovCi0jZGVmaW5lIFNZTU5BTUVfSU5fREVCVUcoc3ltcHRyKSAoKHN5bXB0ciktPm5fc2NsYXNzICYgREJYTUFTSykKLQotLyogVmFsdWVzIGZvciBhdXh0eXBlIGZpZWxkIGluIFhDT0ZGNjQsIHRha2VuIGZyb20gQUlYIDQuMyBzeW0uaCAqLwotI2RlZmluZSBfQVVYX0VYQ0VQVCAgICAgMjU1Ci0jZGVmaW5lIF9BVVhfRkNOICAgICAgICAyNTQKLSNkZWZpbmUgX0FVWF9TWU0gICAgICAgIDI1MwotI2RlZmluZSBfQVVYX0ZJTEUgICAgICAgMjUyCi0jZGVmaW5lIF9BVVhfQ1NFQ1QgICAgICAyNTEKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls4XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3NpemVbMV07Ci0gIGNoYXIgcl90eXBlWzFdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNAotCi0jZGVmaW5lIERFRkFVTFRfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCA0Ci0jZGVmaW5lIERFRkFVTFRfQlNTX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9URVhUX1NFQ1RJT05fQUxJR05NRU5UIDQKLS8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2bid0IGhlYXJkIG9mIGJlZm9yZSAqLwotI2RlZmluZSBERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UIDQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zaC5oIGIvaW5jbHVkZS9jb2ZmL3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTBkMjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIaXRhY2hpIFNIICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlTSF9BUkNIX01BR0lDX0JJRwkweDA1MDAKLSNkZWZpbmUJU0hfQVJDSF9NQUdJQ19MSVRUTEUJMHgwNTUwICAvKiBMaXR0bGUgZW5kaWFuIFNIICovCi0jZGVmaW5lIFNIX0FSQ0hfTUFHSUNfV0lOQ0UJMHgwMWEyICAvKiBXaW5kb3dzIENFIC0gbGl0dGxlIGVuZGlhbiAqLwotI2RlZmluZSBTSF9QRV9NQUdJQwkJMHgwMTBiCi0KLQotI2RlZmluZSBTSEJBRE1BRyh4KSBcCi0gKCgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19CSUcpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX1dJTkNFKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19MSVRUTEUpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLS8qIERlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzLiAgKi8KLS8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi0jZWxzZQotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLSNlbmRpZgotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jZGVmaW5lCUxJTkVTWgk2Ci0jdW5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jdW5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZWxzZQotI2RlZmluZQlMSU5FU1oJOAotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLSNlbHNlCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLSNlbmRpZgotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFJFTFNaIDEwCi0jZWxzZQotI2RlZmluZSBSRUxTWiAxNgotI2VuZGlmCi0KLS8qIFNIIHJlbG9jYXRpb24gdHlwZXMuICBOb3QgYWxsIG9mIHRoZXNlIGFyZSBhY3R1YWxseSB1c2VkLiAgKi8KLQotI2RlZmluZSBSX1NIX1VOVVNFRAkwCQkvKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLwotI2RlZmluZSBSX1NIX0lNTTMyQ0UJMgkJLyogMzIgYml0IGltbWVkaWF0ZSBmb3IgV2luQ0UgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDggCTMJCS8qICA4IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDE2IAk0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfU0hfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX1NIX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTQJOSAgCQkvKiBQQyByZWwgOCBiaXRzICo0ICt2ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTIJMTAgIAkJLyogUEMgcmVsIDggYml0cyAqMiArdmUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4ICAgIDExICAJCS8qIDggYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX1BDRElTUCAgICAgMTIgIAkJLyogMTIgYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX0lNTTMyICAgICAgMTQgICAgCQkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NOCAgIAkxNgkJLyogOCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1BR0VCQVNFCTE2CQkvKiBXaW5kb3dzIENFICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZMiAgICAxNwkJLyogOCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZNCAgICAxOAkJLyogOCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfSU1NNCAgIAkxOQkJLyogNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZMiAgICAyMAkJLyogNCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZNCAgICAyMQkJLyogNCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfUENSRUxJTU04QlkyICAgMjIJCS8qIFBDIHJlbCA4IGJpdHMgKjIgdW5zaWduZWQgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTQgICAyMwkJLyogUEMgcmVsIDggYml0cyAqNCB1bnNpZ25lZCAqLwotI2RlZmluZSBSX1NIX0lNTTE2ICAgICAgMjQgICAgCQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFRoZSBzd2l0Y2ggdGFibGUgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhleSBhcmUKLSAgIGdlbmVyYXRlZCBmb3IgZXhwcmVzc2lvbnMgc3VjaCBhcwotICAgICAud29yZCBMMSAtIEwyCi0gICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcwotICAgYW5kIEwyLiAgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0g4CTMzCQkvKiA4IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0gxNgkyNQkJLyogMTYgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDMyCTI2CQkvKiAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0KLS8qIFRoZSBVU0VTIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgY29tcGlsZXIgd2lsbAotICAgZ2VuZXJhdGUgLnVzZXMgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBpdAotICAgY2FuIHJlbGF4LiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBVU0VTIHJlbG9jIGhvbGRzIHRoZSBQQwotICAgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbgotICAgdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotI2RlZmluZSBSX1NIX1VTRVMJMjcJCS8qIC51c2VzIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09VTlQgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBhc3NlbWJsZXIgd2lsbAotICAgZ2VuZXJhdGUgQ09VTlQgcmVsb2NzIGZvciBhZGRyZXNzZXMgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZ2lzdGVyCi0gICBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIENPVU5UCi0gICByZWxvYyBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICBvYmplY3QgZmlsZS4gICovCi0jZGVmaW5lIFJfU0hfQ09VTlQJMjgJCS8qIENvdW50IG9mIGNvbnN0YW50IHBvb2wgdXNlcyAqLwotCi0vKiBUaGUgQUxJR04gcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSByX29mZnNldCBmaWVsZCBpcwotICAgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZQotICAgbXVzdCBiZSBhbGlnbmVkLiAgKi8KLSNkZWZpbmUgUl9TSF9BTElHTgkyOQkJLyogLmFsaWduIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09ERSBhbmQgREFUQSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIENPREUgcmVsb2MgYmVmb3JlIGEKLSAgIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIEl0IHdpbGwgZ2VuZXJhdGUgYSBEQVRBIHJlbG9jIGJlZm9yZSBkYXRhLgotICAgQSBzZWN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgYXNzdW1pbmcgaXQgY29udGFpbnMgZGF0YSwgdW5sZXNzIGEKLSAgIENPREUgcmVsb2MgaXMgc2Vlbi4gIFRoZSBvbmx5IHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIENPREUgYW5kIERBVEEgcmVsb2NzIGFyZSB0aGUgc2VjdGlvbiBhbmQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sCi0gICBhbmQgb2Zmc2V0IGFyZSBtZWFuaW5nbGVzcy4gICovCi0jZGVmaW5lIFJfU0hfQ09ERQkzMAkJLyogc3RhcnQgb2YgY29kZSAqLwotI2RlZmluZSBSX1NIX0RBVEEJMzEJCS8qIHN0YXJ0IG9mIGRhdGEgKi8KLQotLyogVGhlIExBQkVMIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIExBQkVMIHJlbG9jIGZvciBlYWNoCi0gICBsYWJlbCB3aXRoaW4gYSBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bwotICAgYXZvaWQgc3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSB0aGUgdGFyZ2V0cyBvZiBicmFuY2hlcy4gICovCi0jZGVmaW5lIFJfU0hfTEFCRUwJMzIJCS8qIGxhYmVsICovCi0KLS8qIE5COiBSX1NIX1NXSVRDSDggaXMgMzMgKi8KLQotI2RlZmluZSBSX1NIX0xPT1BfU1RBUlQJMzQKLSNkZWZpbmUgUl9TSF9MT09QX0VORAkzNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NwYXJjLmggYi9pbmNsdWRlL2NvZmYvc3BhcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhMjRmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFNwYXJjLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGFuIGFtYWxnYW1hdGlvbiBvZiBzZXZlcmFsIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgdGhhdAotICAgZGVmaW5lIGNvZmYgZm9ybWF0LCBzdWNoIGFzIGZpbGVoZHIuaCwgYW91dGhkci5oLCBhbmQgc28gZm9ydGguICBJbgotICAgYWRkaXRpb24sIGFsbCBkYXRhdHlwZXMgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgaW50byBjaGFyYWN0ZXIgYXJyYXlzIG9mCi0gICAocHJlc3VtZWQpIGVxdWl2YWxlbnQgc2l6ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgdGhpcyBmaWxlIGNhbgotICAgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzeXN0ZW1zIHdoaWxlIHN0aWxsIHlpZWxkaW5nIHRoZSBzYW1lIHJlc3VsdHMuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQkvKiByZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQkvKiBmaWxlIGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQkvKiBsaW5lIG51bWJlcnMgc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkJLyogbG9jYWwgc3ltYm9scyBzdHJpcHBlZCAqLwotCi0jZGVmaW5lIFNQQVJDTUFHSUMJKDA1NDApCi0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJKDA0MTUpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIG1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIgdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIgdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciBkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciBic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhciBlbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIHRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lWzhdOwkJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhciBzX3BhZGRyWzRdOwkJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhciBzX3ZhZGRyWzRdOwkJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyIHNfc2l6ZVs0XTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIgc19zY25wdHJbNF07CQkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyIHNfcmVscHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyIHNfbG5ub3B0cls0XTsJCS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyIHNfbnJlbG9jWzJdOwkJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyIHNfbmxubm9bMl07CQkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIgc19mbGFnc1s0XTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gKi8KLQotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbiB7Ci0gICAgY2hhciBsX3N5bW5keFs0XTsJCS8qIGZuIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KLSAgICBjaGFyIGxfcGFkZHJbNF07CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIgKi8KLSAgfSBsX2FkZHI7Ci0gIGNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCSg2KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgkoOCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkoMTQpCS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JKDQpCS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0jaWYgMCAvKiBvZiBkb3VidGZ1bCB2YWx1ZSAqLwotICAgIGNoYXIgZV9ucHRyWzJdWzRdOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfbGVhZGluZ196ZXJvWzFdOwotICAgICAgY2hhciBlX2RieF90eXBlWzFdOwotICAgICAgY2hhciBlX2RieF9kZXNjWzJdOwotICAgIH0gZV9kYng7Ci0jZW5kaWYKLSAgfSBlOwotCi0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWRkaW5nWzJdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bMl07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplWzJdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSB4X21pc2M7Ci0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzJdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzJdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIC50diBzZWN0aW9uIGluZm8gKGluIGF1eGVudCBvZiBzeW0gLnR2KSkgKi8KLQotICBjaGFyIHhfZmlsbFsyMF07CQkvKiBmb3JjZXMgdG8gMjAtYnl0ZSBzaXplICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjAKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3NwYXJlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bS5oIGIvaW5jbHVkZS9jb2ZmL3N5bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIwNGFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zeW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIAotCi0gICBUaGlzIGZpbGUgaXMganVzdCBhZ2dyZWdhdGVkIHdpdGggdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgR05VCi0gICByZWxlYXNlOyBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIEdBUywgR0RCLCBvciBvdGhlciBHTlUKLSAgIHByb2dyYW1zLiAgKi8KLQotLyoKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxLCAxOTkwIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLnwKLSAqIHwgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSAgIHwKLSAqIHwgcmlnaHRzIHRvIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyAgICAgIHwKLSAqIHwgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotI2lmbmRlZiBfU1lNX0gKLSNkZWZpbmUgX1NZTV9ICi0KLS8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bwotICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCi0gKgotICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCi0gKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KLSAqLwotCi0vKiAKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVGhpcmQgRXllIFN5bWJvbCBUYWJsZS4KLSAqCi0gKiBTeW1ib2xzIGFyZSBhc3N1bWVkIHRvIGJlIGluICdlbmNvdW50ZXIgb3JkZXInIC0gaS5lLiB0aGUgb3JkZXIgdGhhdAotICogdGhlIHRoaW5ncyB0aGV5IHJlcHJlc2VudCB3ZXJlIGVuY291bnRlcmVkIGJ5IHRoZSBjb21waWxlci9hc3NlbWJsZXIvbG9hZGVyLgotICogRVhDRVBUIGZvciBnbG9iYWxzIQlUaGVzZSBhcmUgYXNzdW1lZCB0byBiZSBidW5jaGVkIHRvZ2V0aGVyLAotICogcHJvYmFibHkgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgJ25vcm1hbCcgc3ltYm9sLiAgR2xvYmFscyBBUkUgc29ydGVkCi0gKiBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEEgYnJpZWYgd29yZCBhYm91dCBUaGlyZCBFeWUgbmFtaW5nL3VzZSBjb252ZW50aW9uczoKLSAqCi0gKiBBbGwgYXJyYXlzIGFuZCBpbmRleCdzIGFyZSAwIGJhc2VkLgotICogQWxsICJpZm9vTWF4IiB2YWx1ZXMgYXJlIHRoZSBoaWdoZXN0IGxlZ2FsIHZhbHVlIFBMVVMgT05FLiBUaGlzIG1ha2VzCi0gKiB0aGVtIGdvb2QgZm9yIGFsbG9jYXRpbmcgYXJyYXlzLCBldGMuIEFsbCBjaGVja3MgYXJlICJpZm9vIDwgaWZvb01heCIuCi0gKgotICogImlzeW0iCUluZGV4IGludG8gdGhlIFNZTWJvbCB0YWJsZS4KLSAqICJpcGQiCUluZGV4IGludG8gdGhlIFByb2NlZHVyZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlmZCIJSW5kZXggaW50byB0aGUgRmlsZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlzcyIJSW5kZXggaW50byBTdHJpbmcgU3BhY2UuCi0gKiAiY2IiCQlDb3VudCBvZiBCeXRlcy4KLSAqICJyZ1BkIglhcnJheSB3aG9zZSBkb21haW4gaXMgIjAuLmlwZE1heC0xIiBhbmQgUmFuR2UgaXMgUERSLgotICogInJnRmQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaWZkTWF4LTEiIGFuZCBSYW5HZSBpcyBGRFIuCi0gKi8KLQotCi0vKiAKLSAqIFN5bWJvbGljIEhlYWRlciAoSERSKSBzdHJ1Y3R1cmUuCi0gKiBBcyBsb25nIGFzIGFsbCB0aGUgcG9pbnRlcnMgYXJlIHNldCBjb3JyZWN0bHksCi0gKiB3ZSBkb24ndCBjYXJlIFdIQVQgb3JkZXIgdGhlIHZhcmlvdXMgc2VjdGlvbnMgY29tZSBvdXQgaW4hCi0gKgotICogQSBmaWxlIHByb2R1Y2VkIHNvbGVseSBmb3IgdGhlIHVzZSBvZiBDREIgd2lsbCBwcm9iYWJseSBOT1QgaGF2ZQotICogYW55IGluc3RydWN0aW9ucyBvciBkYXRhIGFyZWFzIGluIGl0LCBhcyB0aGVzZSBhcmUgYXZhaWxhYmxlCi0gKiBpbiB0aGUgb3JpZ2luYWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXNob3J0CW1hZ2ljOwkJLyogdG8gdmVyaWZ5IHZhbGlkaXR5IG9mIHRoZSB0YWJsZSAqLwotCXNob3J0CXZzdGFtcDsJCS8qIHZlcnNpb24gc3RhbXAgKi8KLQlsb25nCWlsaW5lTWF4OwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBsaW5lIG51bWJlciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCWlkbk1heDsJCS8qIG1heCBpbmRleCBpbnRvIGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWJmZF92bWEJY2JEbk9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWxvbmcJaXBkTWF4OwkJLyogbnVtYmVyIG9mIHByb2NlZHVyZXMgKi8KLQliZmRfdm1hCWNiUGRPZmZzZXQ7CS8qIG9mZnNldCB0byBwcm9jZWR1cmUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaXN5bU1heDsJLyogbnVtYmVyIG9mIGxvY2FsIHN5bWJvbHMgKi8KLQliZmRfdm1hCWNiU3ltT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3ltYm9scyovCi0JbG9uZwlpb3B0TWF4OwkvKiBtYXggaW5kZXggaW50byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiT3B0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzICovCi0JbG9uZwlpYXV4TWF4OwkvKiBudW1iZXIgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkF1eE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGF1eGlsbGFyeSBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlpc3NNYXg7CQkvKiBtYXggaW5kZXggaW50byBsb2NhbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3RyaW5ncyAqLwotCWxvbmcJaXNzRXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzRXh0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZXh0ZXJuYWwgc3RyaW5ncyAqLwotCWxvbmcJaWZkTWF4OwkJLyogbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwljcmZkOwkJLyogbnVtYmVyIG9mIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYlJmZE9mZnNldDsJLyogb2Zmc2V0IHRvIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaWV4dE1heDsJLyogbWF4IGluZGV4IGludG8gZXh0ZXJuYWwgc3ltYm9scyAqLwotCWJmZF92bWEJY2JFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzeW1ib2wgZW50cmllcyovCi0JLyogSWYgeW91IGFkZCBtYWNoaW5lIGRlcGVuZGVudCBmaWVsZHMsIGFkZCB0aGVtIGhlcmUgKi8KLQl9IEhEUlIsICpwSERSUjsgCi0jZGVmaW5lIGNiSERSUiBzaXplb2YoSERSUikKLSNkZWZpbmUgaGRyTmlsICgocEhEUlIpMCkKLQotLyoKLSAqIFRoZSBGRFIgYW5kIFBEUiBzdHJ1Y3R1cmVzIHNwZWVkIG1hcHBpbmcgb2YgYWRkcmVzcyA8LT4gbmFtZS4KLSAqIFRoZXkgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgbWVtb3J5IG9yZGVyIGFuZCBhcmUga2VwdCBpbgotICogbWVtb3J5IGJ5IENEQiBhdCBydW50aW1lLgotICovCi0KLS8qIAotICogRmlsZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBGSUxFLCB3aGV0aGVyIGNvbXBpbGVkIHdpdGgKLSAqIGZ1bGwgZGVidWdnaW5nIHN5bWJvbHMgb3Igbm90LiAgVGhlIG5hbWUgb2YgYSBmaWxlIHNob3VsZCBiZQotICogdGhlIHBhdGggbmFtZSBnaXZlbiB0byB0aGUgY29tcGlsZXIuCSBUaGlzIGFsbG93cyB0aGUgdXNlcgotICogdG8gc2ltcGx5IHNwZWNpZnkgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB0aGUgQ09NUElMRVMKLSAqIHdlcmUgZG9uZSwgYW5kIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIHRoZWlyIGZpbGVzLgotICogQSBmaWVsZCB3aG9zZSBjb21tZW50IHN0YXJ0cyB3aXRoICJSIC0gIiBpbmRpY2F0ZXMgdGhhdCBpdCB3aWxsIGJlCi0gKiBzZXR1cCBhdCBydW50aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBmZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIGZpbGUgKi8KLQlsb25nCXJzczsJCS8qIGZpbGUgbmFtZSAob2Ygc291cmNlLCBpZiBrbm93bikgKi8KLQlsb25nCWlzc0Jhc2U7CS8qIGZpbGUncyBzdHJpbmcgc3BhY2UgKi8KLQliZmRfdm1hCWNiU3M7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0JbG9uZwlpc3ltQmFzZTsJLyogYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLQlsb25nCWNzeW07CQkvKiBjb3VudCBmaWxlJ3Mgb2Ygc3ltYm9scyAqLwotCWxvbmcJaWxpbmVCYXNlOwkvKiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0JbG9uZwljbGluZTsJCS8qIGNvdW50IG9mIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLQlsb25nCWlvcHRCYXNlOwkvKiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQlsb25nCWNvcHQ7CQkvKiBjb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCBpcGRGaXJzdDsvKiBzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlzaG9ydAljcGQ7CQkvKiBjb3VudCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlsb25nCWlhdXhCYXNlOwkvKiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCWNhdXg7CQkvKiBjb3VudCBvZiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCXJmZEJhc2U7CS8qIGluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLQlsb25nCWNyZmQ7CQkvKiBjb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLQl1bnNpZ25lZCBsYW5nOiA1OwkvKiBsYW5ndWFnZSBmb3IgdGhpcyBmaWxlICovCi0JdW5zaWduZWQgZk1lcmdlIDogMTsJLyogd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotCXVuc2lnbmVkIGZSZWFkaW4gOiAxOwkvKiB0cnVlIGlmIGl0IHdhcyByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotCXVuc2lnbmVkIGZCaWdlbmRpYW4gOiAxOy8qIGlmIHNldCwgd2FzIGNvbXBpbGVkIG9uIGJpZyBlbmRpYW4gbWFjaGluZSAqLwotCQkJCS8qCWF1eCdzIHdpbGwgYmUgaW4gY29tcGlsZSBob3N0J3Mgc2V4ICovCi0JdW5zaWduZWQgZ2xldmVsIDogMjsJLyogbGV2ZWwgdGhpcyBmaWxlIHdhcyBjb21waWxlZCB3aXRoICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAyMjsgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogc2l6ZSBvZiBsaW5lcyBmb3IgdGhpcyBmaWxlICovCi0JfSBGRFIsICpwRkRSOwotI2RlZmluZSBjYkZEUiBzaXplb2YoRkRSKQotI2RlZmluZSBmZE5pbCAoKHBGRFIpMCkKLSNkZWZpbmUgaWZkTmlsIC0xCi0jZGVmaW5lIGlmZFRlbXAgMAotI2RlZmluZSBpbG5OaWwgLTEKLQotCi0vKiAKLSAqIFByb2NlZHVyZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBURVhUIExBQkVMLgotICogSWYgYSBwcm9jZWR1cmUgaXMgaW4gYSBmaWxlIHdpdGggZnVsbCBzeW1ib2xzLCB0aGVuIGlzeW0KLSAqIHdpbGwgcG9pbnQgdG8gdGhlIFBST0Mgc3ltYm9scywgZWxzZSBpdCB3aWxsIHBvaW50IHRvIHRoZQotICogZ2xvYmFsIHN5bWJvbCBmb3IgdGhlIGxhYmVsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCWlzeW07CQkvKiBzdGFydCBvZiBsb2NhbCBzeW1ib2wgZW50cmllcyAqLwotCWxvbmcJaWxpbmU7CQkvKiBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJaW9wdDsJCS8qIHN0YXJ0IG9mIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWxuTG93OwkJLyogbG93ZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLwotCWxvbmcJbG5IaWdoOwkJLyogaGlnaGVzdCBsaW5lIGluIHRoZSBwcm9jZWR1cmUgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZm9yIHRoaXMgcHJvY2VkdXJlIGZyb20gdGhlIGZkIGJhc2UgKi8KLQkvKiBUaGVzZSBmaWVsZHMgYXJlIG5ldyBmb3IgNjQgYml0IEVDT0ZGLiAgKi8KLQl1bnNpZ25lZCBncF9wcm9sb2d1ZSA6IDg7IC8qIGJ5dGUgc2l6ZSBvZiBHUCBwcm9sb2d1ZSAqLwotCXVuc2lnbmVkIGdwX3VzZWQgOiAxOwkvKiB0cnVlIGlmIHRoZSBwcm9jZWR1cmUgdXNlcyBHUCAqLwotCXVuc2lnbmVkIHJlZ19mcmFtZSA6IDE7CS8qIHRydWUgaWYgcmVnaXN0ZXIgZnJhbWUgcHJvY2VkdXJlICovCi0JdW5zaWduZWQgcHJvZiA6IDE7CS8qIHRydWUgaWYgY29tcGlsZWQgd2l0aCAtcGcgKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDEzOwkvKiByZXNlcnZlZDogbXVzdCBiZSB6ZXJvICovCi0JdW5zaWduZWQgbG9jYWxvZmYgOiA4OwkvKiBvZmZzZXQgb2YgbG9jYWwgdmFyaWFibGVzIGZyb20gdmZwICovCi0JfSBQRFIsICpwUERSOwotI2RlZmluZSBjYlBEUiBzaXplb2YoUERSKQotI2RlZmluZSBwZE5pbCAoKHBQRFIpIDApCi0jZGVmaW5lIGlwZE5pbAktMQotCi0vKgotICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHRoZSBsb2FkZXIKLSAqIGZvciB1c2UgYnkgdGhlIHN0YXRpYyBleGNlcHRpb24gc3lzdGVtLgotICovCi0vKgotICogSWYgMCdkIG91dCBiZWNhdXNlIGV4Y2VwdGlvbl9pbmZvIGNob2tlcyBWaXN1YWwgQysrIGFuZCBiZWNhdXNlIHRoZXJlCi0gKiBkb24ndCBzZWVtIHRvIGJlIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0dXJlIGVsc2V3aGVyZSBpbiBnZGIuCi0gKi8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLSNlbmRpZgotCi0vKgotICogTGluZSBOdW1iZXJzCi0gKgotICogTGluZSBOdW1iZXJzIGFyZSBzZWdyZWdhdGVkIGZyb20gdGhlIG5vcm1hbCBzeW1ib2xzIGJlY2F1c2UgdGhleQotICogYXJlIFsxXSBzbWFsbGVyICwgWzJdIGFyZSBvZiBubyBpbnRlcmVzdCB0byB5b3VyCi0gKiBhdmVyYWdlIGxvYWRlciwgYW5kIFszXSBhcmUgbmV2ZXIgbmVlZGVkIGluIHRoZSBtaWRkbGUgb2Ygbm9ybWFsCi0gKiBzY2FubmluZyBhbmQgdGhlcmVmb3JlIHNsb3cgdGhpbmdzIGRvd24uCi0gKgotICogQnkgZGVmaW5pdGlvbiwgdGhlIGZpcnN0IExJTkVSIGZvciBhbnkgZ2l2ZW4gcHJvY2VkdXJlIHdpbGwgaGF2ZQotICogdGhlIGZpcnN0IGxpbmUgb2YgYSBwcm9jZWR1cmUgYW5kIHJlcHJlc2VudCB0aGUgZmlyc3QgYWRkcmVzcy4KLSAqLwotCi10eXBlZGVmCWxvbmcgTElORVIsICpwTElORVI7Ci0jZGVmaW5lIGxpbmVOaWwgKChwTElORVIpMCkKLSNkZWZpbmUgY2JMSU5FUiBzaXplb2YoTElORVIpCi0jZGVmaW5lIGlsaW5lTmlsCS0xCi0KLQotCi0vKgotICogVGhlIFN5bWJvbCBTdHJ1Y3R1cmUJCShHRlcsIHRvIHRob3NlIHdobyBLbm93ISkKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIFN0cmluZyBTcGFjZSBvZiBuYW1lICovCi0JYmZkX3ZtYQl2YWx1ZTsJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotCXVuc2lnbmVkIHN0IDogNjsJLyogc3ltYm9sIHR5cGUgKi8KLQl1bnNpZ25lZCBzYyAgOiA1OwkvKiBzdG9yYWdlIGNsYXNzIC0gdGV4dCwgZGF0YSwgZXRjICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAxOwkvKiByZXNlcnZlZCAqLwotCXVuc2lnbmVkIGluZGV4IDogMjA7CS8qIGluZGV4IGludG8gc3ltL2F1eCB0YWJsZSAqLwotCX0gU1lNUiwgKnBTWU1SOwotI2RlZmluZSBzeW1OaWwgKChwU1lNUikwKQotI2RlZmluZSBjYlNZTVIgc2l6ZW9mKFNZTVIpCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMHhmZmZmZgotI2RlZmluZSBpc3NOaWwgLTEKLSNkZWZpbmUgaXNzTnVsbCAwCi0KLQotLyogVGhlIGZvbGxvd2luZyBjb252ZXJ0cyBhIG1lbW9yeSByZXNpZGVudCBzdHJpbmcgdG8gYW4gaXNzLgotICogVGhpcyBoYWNrIGlzIHJlY29nbml6ZWQgaW4gU2JGSXNzLCBpbiBzeW0uYyBvZiB0aGUgZGVidWdnZXIuCi0gKi8KLSNkZWZpbmUgSXNzRlNiKHNiKSAoMHg4MDAwMDAwMCB8ICgodW5zaWduZWQgbG9uZykoc2IpKSkKLQotLyogRSBYIFQgRSBSIE4gQSBMICAgUyBZIE0gQiBPIEwgIFIgRSBDIE8gUiBECi0gKgotICoJU2FtZSBhcyB0aGUgU1lNUiBleGNlcHQgaXQgY29udGFpbnMgZmlsZSBjb250ZXh0IHRvIGRldGVybWluZSB3aGVyZQotICoJdGhlIGluZGV4IGlzLgotICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9leHRyIHsKLQl1bnNpZ25lZCBqbXB0Ymw6MTsJLyogc3ltYm9sIGlzIGEganVtcCB0YWJsZSBlbnRyeSBmb3Igc2hsaWJzICovCi0JdW5zaWduZWQgY29ib2xfbWFpbjoxOwkvKiBzeW1ib2wgaXMgYSBjb2JvbCBtYWluIHByb2NlZHVyZSAqLwotCXVuc2lnbmVkIHdlYWtleHQ6MTsJLyogc3ltYm9sIGlzIHdlYWsgZXh0ZXJuYWwgKi8KLQl1bnNpZ25lZCByZXNlcnZlZDoxMzsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQlpbnQJaWZkOwkJLyogd2hlcmUgdGhlIGlzcyBhbmQgaW5kZXggZmllbGRzIHBvaW50IGludG8gKi8KLQlTWU1SCWFzeW07CQkvKiBzeW1ib2wgZm9yIHRoZSBleHRlcm5hbCAqLwotCX0gRVhUUiwgKnBFWFRSOwotI2RlZmluZSBleHROaWwgKChwRVhUUikwKQotI2RlZmluZSBjYkVYVFIgc2l6ZW9mKEVYVFIpCi0KLQotLyogQSBVIFggSSBMIEwgQSBSIFkgICBUIFkgUCBFCSBJIE4gRiBPIFIgTSBBIFQgSSBPIE4gKi8KLQotLyoKLSAqIFR5cGUgSW5mb3JtYXRpb24gUmVjb3JkCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBmQml0ZmllbGQgOiAxOyAvKiBzZXQgaWYgYml0IHdpZHRoIGlzIHNwZWNpZmllZCAqLwotCXVuc2lnbmVkIGNvbnRpbnVlZCA6IDE7IC8qIGluZGljYXRlcyBhZGRpdGlvbmFsIFRRIGluZm8gaW4gbmV4dCBBVVggKi8KLQl1bnNpZ25lZCBidCAgOiA2OwkvKiBiYXNpYyB0eXBlICovCi0JdW5zaWduZWQgdHE0IDogNDsKLQl1bnNpZ25lZCB0cTUgOiA0OwotCS8qIC0tLS0gMTYgYml0IGJvdW5kYXJ5IC0tLS0gKi8KLQl1bnNpZ25lZCB0cTAgOiA0OwotCXVuc2lnbmVkIHRxMSA6IDQ7CS8qIDYgdHlwZSBxdWFsaWZpZXJzIC0gdHFQdHIsIGV0Yy4gKi8KLQl1bnNpZ25lZCB0cTIgOiA0OwotCXVuc2lnbmVkIHRxMyA6IDQ7Ci0JfSBUSVIsICpwVElSOwotI2RlZmluZSBjYlRJUiBzaXplb2YoVElSKQotI2RlZmluZSB0aU5pbCAoKHBUSVIpMCkKLSNkZWZpbmUgaXRxTWF4IDYKLQotLyoKLSAqIFJlbGF0aXZlIHN5bWJvbCByZWNvcmQKLSAqCi0gKiBJZiB0aGUgcmZkIGZpZWxkIGlzIDQwOTUsIHRoZSBpbmRleCBmaWVsZCBpbmRleGVzIGludG8gdGhlIGdsb2JhbCBzeW1ib2wKLSAqCXRhYmxlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZAlyZmQgOiAxMjsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotCXVuc2lnbmVkCWluZGV4IDogMjA7IC8qIGluZGV4IGludCBzeW0vYXV4L2lzcyB0YWJsZXMgKi8KLQl9IFJORFhSLCAqcFJORFhSOwotI2RlZmluZSBjYlJORFhSIHNpemVvZihSTkRYUikKLSNkZWZpbmUgcm5keE5pbCAoKHBSTkRYUikwKQotCi0vKiBkZW5zZSBudW1iZXJzIG9yIHNvbWV0aW1lcyBjYWxsZWQgYmxvY2sgbnVtYmVycyBhcmUgc3RvcmVkIGluIHRoaXMgdHlwZSwKLSAqCWEgcmZkIG9mIDB4ZmZmZmZmZmYgaXMgYW4gaW5kZXggaW50byB0aGUgZ2xvYmFsIHRhYmxlLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlyZmQ7ICAgIC8qIGluZGV4IGludG8gdGhlIGZpbGUgdGFibGUgKi8KLQl1bnNpZ25lZCBsb25nCWluZGV4OyAJLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLwotCX0gRE5SLCAqcEROUjsKLSNkZWZpbmUgY2JETlIgc2l6ZW9mKEROUikKLSNkZWZpbmUgZG5OaWwgKChwRE5SKTApCi0KLQotCi0vKgotICogQXV4aWxsYXJ5IGluZm9ybWF0aW9uIG9jY3VycyBvbmx5IGlmIG5lZWRlZC4KLSAqIEl0IEFMV0FZUyBvY2N1cnMgaW4gdGhpcyBvcmRlciB3aGVuIHByZXNlbnQuCi0KLQkgICAgaXN5bU1hYwkJdXNlZCBieSBzdFByb2Mgb25seQotCSAgICBUSVIJCQl0eXBlIGluZm8KLQkgICAgVElSCQkJYWRkaXRpb25hbCBUUSBpbmZvIChpZiBmaXJzdCBUSVIgd2FzIG5vdCBlbm91Z2gpCi0JICAgIHJuZHgJCWlmIChidCA9PSBidFN0cnVjdCxidFVuaW9uLGJ0RW51bSxidFNldCxidFJhbmdlLAotCQkJCSAgICBidFR5cGVkZWYpOgotCQkJCSAgICByc3ltLmluZGV4ID09IGlhdXggZm9yIGJ0U2V0IG9yIGJ0UmFuZ2UKLQkJCQkgICAgZWxzZSByc3ltLmluZGV4ID09IGlzeW0KLQkgICAgZGltTG93CQlidFJhbmdlLCBidFNldAotCSAgICBkaW1NYWMJCWJ0UmFuZ2UsIGJ0U2V0Ci0JICAgIHJuZHgwCQlBcyBtYW55IGFzIHRoZXJlIGFyZSB0cSBhcnJheXMKLQkgICAgZGltTG93MAotCSAgICBkaW1IaWdoMAotCSAgICAuLi4KLQkgICAgcm5keE1heC0xCi0JICAgIGRpbUxvd01heC0xCi0JICAgIGRpbUhpZ2hNYXgtMQotCSAgICB3aWR0aCBpbiBiaXRzCWlmIChiaXQgZmllbGQpLCB3aWR0aCBpbiBiaXRzLgotICovCi0jZGVmaW5lIGNBdXhNYXggKDYgKyAoaWRpbU1heCozKSkKLQotLyogYSB1bmlvbiBvZiBhbGwgcG9zc2libGUgaW5mbyBpbiB0aGUgQVVYIHVuaXZlcnNlICovCi10eXBlZGVmIHVuaW9uIHsKLQlUSVIJdGk7CQkvKiB0eXBlIGluZm9ybWF0aW9uIHJlY29yZCAqLwotCVJORFhSCXJuZHg7CQkvKiByZWxhdGl2ZSBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotCWxvbmcJZG5Mb3c7CQkvKiBsb3cgZGltZW5zaW9uICovCi0JbG9uZwlkbkhpZ2g7CQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotCWxvbmcJaXN5bTsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCAoZW5kIG9mIHByb2MpICovCi0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZSAobm90IHVzZWQpICovCi0JbG9uZwl3aWR0aDsJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLQlsb25nCWNvdW50OwkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotCX0gQVVYVSwgKnBBVVhVOwotI2RlZmluZSBjYkFVWFUgc2l6ZW9mKEFVWFUpCi0jZGVmaW5lIGF1eE5pbCAoKHBBVVhVKTApCi0jZGVmaW5lIGlhdXhOaWwgLTEKLQotCi0vKgotICogT3B0aW1pemF0aW9uIHN5bWJvbHMKLSAqCi0gKiBPcHRpbWl6YXRpb24gc3ltYm9scyBjb250YWluIHNvbWUgb3ZlcmxhcCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBub3JtYWwKLSAqIHN5bWJvbCB0YWJsZS4gSW4gcGFydGljdWxhciwgdGhlIHByb2MgaW5mb3JtYXRpb24KLSAqIGlzIHNvbWV3aGF0IHJlZHVuZGFudCBidXQgbmVjZXNzYXJ5IHRvIGVhc2lseSBmaW5kIHRoZSBvdGhlciBpbmZvcm1hdGlvbgotICogcHJlc2VudC4gCi0gKgotICogQWxsIG9mIHRoZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXN0IG90UHJvYwotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBvdDogODsJCS8qIG9wdGltaXphdGlvbiB0eXBlICovCi0JdW5zaWduZWQgdmFsdWU6IDI0OwkvKiBhZGRyZXNzIHdoZXJlIHdlIGFyZSBtb3ZpbmcgaXQgdG8gKi8KLQlSTkRYUglybmR4OwkJLyogcG9pbnRzIHRvIGEgc3ltYm9sIG9yIG9wdCBlbnRyeSAqLwotCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkvKiByZWxhdGl2ZSBvZmZzZXQgdGhpcyBvY2N1cmVkICovCi0JfSBPUFRSLCAqcE9QVFI7Ci0jZGVmaW5lIG9wdE5pbAkoKHBPUFRSKSAwKQotI2RlZmluZSBjYk9QVFIgc2l6ZW9mKE9QVFIpCi0jZGVmaW5lIGlvcHROaWwgLTEKLQotLyoKLSAqIEZpbGUgSW5kaXJlY3QKLSAqCi0gKiBXaGVuIGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgYWNyb3NzIGZpbGVzIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQ6Ci0gKgkxKSB1c2UgdGhlIGZpbGUgaW5kZXggdG8gZ2V0IHRoZSBGaWxlIGluZGlyZWN0IGVudHJ5LgotICoJMikgdXNlIHRoZSBmaWxlIGluZGlyZWN0IGVudHJ5IHRvIGdldCB0aGUgRmlsZSBkZXNjcmlwdG9yLgotICoJMykgYWRkIHRoZSBzeW0gaW5kZXggdG8gdGhlIGJhc2Ugb2YgdGhhdCBmaWxlJ3Mgc3ltIHRhYmxlCi0gKgotICovCi0KLXR5cGVkZWYgbG9uZyBSRkRULCAqcFJGRFQ7Ci0jZGVmaW5lIGNiUkZEVCBzaXplb2YoUkZEVCkKLSNkZWZpbmUgcmZkTmlsCS0xCi0KLS8qCi0gKiBUaGUgZmlsZSBpbmRpcmVjdCB0YWJsZSBpbiB0aGUgbWlwcyBsb2FkZXIgaXMga25vd24gYXMgYW4gYXJyYXkgb2YgRklUcy4KLSAqIFRoaXMgaXMgZG9uZSB0byBrZWVwIHRoZSBjb2RlIGluIHRoZSBsb2FkZXIgcmVhZGFibGUgaW4gdGhlIGFyZWEgd2hlcmUKLSAqIHRoZXNlIHRhYmxlcyBhcmUgbWVyZ2VkLiAgTm90ZSB0aGlzIGlzIG9ubHkgYSBuYW1lIGNoYW5nZS4KLSAqLwotdHlwZWRlZiBsb25nIEZJVCwgKnBGSVQ7Ci0jZGVmaW5lIGNiRklUCXNpemVvZihGSVQpCi0jZGVmaW5lIGlmaU5pbAktMQotI2RlZmluZSBmaU5pbAkoKHBGSVQpIDApCi0KLSNpZmRlZiBfTEFOR1VBR0VfUEFTQ0FMCi0jZGVmaW5lIGlmZE5pbCAtMQotI2RlZmluZSBpbG5OaWwgLTEKLSNkZWZpbmUgaXBkTmlsIC0xCi0jZGVmaW5lIGlsaW5lTmlsIC0xCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMTYjZmZmZmYKLSNkZWZpbmUgaXNzTmlsIC0xCi0jZGVmaW5lIGlzc051bGwgMAotI2RlZmluZSBpdHFNYXggNgotI2RlZmluZSBpYXV4TmlsIC0xCi0jZGVmaW5lIGlvcHROaWwgLTEKLSNkZWZpbmUgcmZkTmlsIC0xCi0jZGVmaW5lIGlmaU5pbCAtMQotI2VuZGlmCS8qIF9MQU5HVUFHRV9QQVNDQUwgKi8KLQotCi0vKiBEZW5zZSBudW1iZXJzCi0gKgotICogUmF0aGVyIHRoYW4gdXNlIGZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycyB0byByZXByZXNlbnQgc3ltYm9scwotICoJYW5kIGdsb2JhbHMsIHdlIHVzZSBkZW5zZSBudW1iZXIgc28gdGhhdCB0aGV5IGNhbiBiZSBlYXNpbHkgZW1iZWRlZAotICoJaW4gaW50ZXJtZWRpYXRlIGNvZGUgYW5kIHRoZSBwcm9ncmFtcyB0aGF0IHByb2Nlc3MgdGhlbSBjYW4KLSAqCXVzZSBkaXJlY3QgYWNjZXNzIHRhYmxzIGluc3RlYWQgb2YgaGFzaCB0YWJsZSAod2hpY2ggd291bGQgYmUKLSAqCW5lY2VzYXJ5IG90aGVyd2lzZSBiZWNhdXNlIG9mIHRoZSBzcGFyc2UgbmFtZSBzcGFjZSBjYXVzZWQgYnkKLSAqCWZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycy4gRGVuc2UgbnVtYmVyIGFyZSByZXByZXNlbnRlZAotICoJYnkgUk5EWFJzLgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlIGRlZmluZXMgdGhlIG1lYW5pbmcgb2YgZWFjaCBTWU0gZmllbGQgYXMKLSAqIGEgZnVuY3Rpb24gb2YgdGhlICJzdCIuIChzY0QvQiA9PSBzY0RhdGEgT1Igc2NCc3MpCi0gKgotICogTm90ZTogdGhlIHZhbHVlICJpc3ltTWFjIiBpcyB1c2VkIGJ5IHN5bWJvbHMgdGhhdCBoYXZlIHRoZSBjb25jZXB0Ci0gKiBvZiBlbmNsb3NpbmcgYSBibG9jayBvZiByZWxhdGVkIGluZm9ybWF0aW9uLgkgVGhpcyB2YWx1ZSBpcyB0aGUKLSAqIGlzeW0gb2YgdGhlIGZpcnN0IHN5bWJvbCBBRlRFUiB0aGUgZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeQotICogc3ltYm9sLiBGb3IgZXhhbXBsZSBpZiBhIHByb2NlZHVyZSB3YXMgYXQgaXN5bT09OTAgYW5kIGhhZCBhbgotICogaXN5bU1hYz09MTU1LCB0aGUgYXNzb2NpYXRlZCBlbmQgd291bGQgYmUgYXQgaXN5bT09MTU0LCBhbmQgdGhlCi0gKiBzeW1ib2wgYXQgMTU1IHdvdWxkIHByb2JhYmx5IChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkpIGJlIHRoZQotICogc3ltYm9sIGZvciB0aGUgbmV4dCBwcm9jZWR1cmUuICBUaGlzIGFsbG93cyByYXBpZCBza2lwcGluZyBvdmVyCi0gKiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBvZiB2YXJpb3VzIHNvcnRzLiAic3RFbmQicyBBTFdBWVMgaGF2ZSB0aGUKLSAqIGlzeW0gb2YgdGhlIHByaW1hcnkgc3ltYm9sIHRoYXQgc3RhcnRlZCB0aGUgYmxvY2suCi0gKiAKLQotU1QJCVNDCVZBTFVFCQlJTkRFWAotLS0tLS0tLS0JLS0tLS0tCS0tLS0tLS0tCS0tLS0tLQotc3RGaWxlCQlzY1RleHQJYWRkcmVzcwkJaXN5bU1hYwotc3RMYWJlbAkJc2NUZXh0CWFkZHJlc3MJCS0tLQotc3RHbG9iYWwJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RTdGF0aWMJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RQYXJhbQkJc2NBYnMJb2Zmc2V0CQlpYXV4Ci1zdExvY2FsCQlzY0FicwlvZmZzZXQJCWlhdXgKLXN0UHJvYwkJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQotc3RTdGF0aWNQcm9jCXNjVGV4dAlhZGRyZXNzCQlpYXV4CShpc3ltTWFjIGlzIGZpcnN0IEFVWCkKLQotc3RNZW1iZXIJc2NOaWwJb3JkaW5hbAkJLS0tCShpZiBtZW1iZXIgb2YgZW51bSkKLQkobWlwc3JlYWQgdGhpbmtzIHRoZSBjYXNlIGJlbG93IGhhcyBhIGJpdCwgbm90IGJ5dGUsIG9mZnNldC4pCi1zdE1lbWJlcglzY05pbAlieXRlIG9mZnNldAlpYXV4CShpZiBtZW1iZXIgb2Ygc3RydWN0L3VuaW9uKQotc3RNZW1iZXIJc2NCaXRzCWJpdCBvZmZzZXQJaWF1eAkoYml0IGZpZWxkIHNwZWMpCi0KLXN0QmxvY2sJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjICh0ZXh0IGJsb2NrKQotCSh0aGUgY29kZSBzZWVtcyB0byB0aGluayB0aGF0IHJhdGhlciB0aGFuIHNjTmlsLCB3ZSBzZWUgc2NJbmZvIGZvcgotCSB0aGUgdHdvIGNhc2VzIGJlbG93LikKLXN0QmxvY2sJCXNjTmlsCWNiCQlpc3ltTWFjIChzdHJ1Y3QvdW5pb24gbWVtYmVyIGRlZmluZSkKLXN0QmxvY2sJCXNjTmlsCWNNZW1iZXJzCWlzeW1NYWMgKGVudW0gbWVtYmVyIGRlZmluZSkKLQotCShOZXcgdHlwZXMgYWRkZWQgYnkgU0dJIHRvIHNpbXBsaWZ5IHRoaW5nczopCi1zdFN0cnVjdAlzY0luZm8JY2IJCWlzeW1NYWMgKHN0cnVjdCB0eXBlIGRlZmluZSkKLXN0VW5pb24JCXNjSW5mbwljYgkJaXN5bU1hYyAodW5pb24gIHR5cGUgZGVmaW5lKQotc3RFbnVtCQlzY0luZm8JY01lbWJlcnMJaXN5bU1hYyAoZW51bSAgIHR5cGUgZGVmaW5lKQotCi1zdEVuZAkJc2NUZXh0CWFkZHJlc3MJCWlzeW1TdGFydAotc3RFbmQJCXNjTmlsCS0tLS0tLS0JCWlzeW1TdGFydCAoc3RydWN0L3VuaW9uL2VudW0pCi0KLXN0VHlwZWRlZglzY05pbAktLS0tLS0tCQlpYXV4Ci1zdFJlZ1JlbG9jCXNjPz8/CXZhbHVlCQlvbGQgcmVnaXN0ZXIgbnVtYmVyCi1zdEZvcndhcmQJc2M/Pz8JbmV3IGFkZHJlc3MJaXN5bSB0byBvcmlnaW5hbCBzeW1ib2wKLQotc3RDb25zdGFudAlzY0luZm8JdmFsdWUJCS0tLSAoc2NhbGFyKQotc3RDb25zdGFudAlzY0luZm8JaXNzCQktLS0gKGNvbXBsZXgsIGUuZy4gc3RyaW5nKQotCi0gKgotICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oIGIvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGVlZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIG9mIGNvbnN0YW50cyBmb3IgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotICAgVGhpcyBmaWxlIGlzIGp1c3QgYWdncmVnYXRlZCB3aXRoIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIEdOVQotICAgcmVsZWFzZTsgaXQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBHQVMsIEdEQiwgb3Igb3RoZXIgR05VCi0gICBwcm9ncmFtcy4gICovCi0KLS8qCi0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8IENvcHlyaWdodCAoYykgMTk5MiwgMTk5MSwgMTk5MCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy58Ci0gKiB8IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgICB8Ci0gKiB8IHJpZ2h0cyB0byBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgICAgICB8Ci0gKiB8IG1haW50YWluZWQgaW4gdGhlIGNvcHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKi8KLQotLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCi0gKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KLSAqCi0gKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKLSAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgotICovCi0KLS8qIGdsZXZlbHMgZm9yIGZpZWxkIGluIEZEUiAqLwotI2RlZmluZSBHTEVWRUxfMAkyCi0jZGVmaW5lIEdMRVZFTF8xCTEKLSNkZWZpbmUgR0xFVkVMXzIJMAkvKiBmb3IgdXB3YXJkIGNvbXBhdCByZWFzb25zLiAqLwotI2RlZmluZSBHTEVWRUxfMwkzCi0KLS8qIG1hZ2ljIG51bWJlciBmbyBzeW1oZWFkZXIgKi8KLSNkZWZpbmUgbWFnaWNTeW0JMHg3MDA5Ci0vKiBUaGUgQWxwaGEgdXNlcyB0aGlzIHZhbHVlIGluc3RlYWQsIGZvciBzb21lIHJlYXNvbi4gICovCi0jZGVmaW5lIG1hZ2ljU3ltMgkweDE5OTIKLQotLyogTGFuZ3VhZ2UgY29kZXMgKi8KLSNkZWZpbmUgbGFuZ0MJCTAJCi0jZGVmaW5lIGxhbmdQYXNjYWwJMQotI2RlZmluZSBsYW5nRm9ydHJhbgkyCi0jZGVmaW5lCWxhbmdBc3NlbWJsZXIJMwkvKiBvbmUgQXNzZW1ibGV5IGluc3QgbWlnaHQgbWFwIHRvIG1hbnkgbWFjaCAqLwotI2RlZmluZSBsYW5nTWFjaGluZQk0Ci0jZGVmaW5lIGxhbmdOaWwJCTUKLSNkZWZpbmUgbGFuZ0FkYQkJNgotI2RlZmluZSBsYW5nUGwxCQk3Ci0jZGVmaW5lIGxhbmdDb2JvbAk4Ci0jZGVmaW5lIGxhbmdTdGRjCTkJLyogRklYTUU6IENvbGxpZGVzIHdpdGggU0dJIGxhbmdDcGx1c3BsdXMgKi8KLSNkZWZpbmUgbGFuZ0NwbHVzcGx1cwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIGxhbmdTdGRjICovCi0jZGVmaW5lIGxhbmdDcGx1c3BsdXNWMgkxMAkvKiBTR0kgYWRkaXRpb24gKi8KLSNkZWZpbmUgbGFuZ01heAkJMTEJLyogbWF4aW11biBhbGxvd2VkIDMyIC0tIDUgYml0cyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB2YWx1ZSBkZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkcyBpbiB0aGUgU1lNUiAqLwotCi0vKgotICogU3RvcmFnZSBDbGFzc2VzCi0gKi8KLQotI2RlZmluZSBzY05pbAkJMAotI2RlZmluZSBzY1RleHQJCTEJLyogdGV4dCBzeW1ib2wgKi8KLSNkZWZpbmUgc2NEYXRhCQkyCS8qIGluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjQnNzCQkzCS8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjUmVnaXN0ZXIJNAkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyICovCi0jZGVmaW5lIHNjQWJzCQk1CS8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBzY1VuZGVmaW5lZAk2CS8qIHdobyBrbm93cz8gKi8KLSNkZWZpbmUgc2NDZGJMb2NhbAk3CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/ICovCi0jZGVmaW5lIHNjQml0cwkJOAkvKiB0aGlzIGlzIGEgYml0IGZpZWxkICovCi0jZGVmaW5lIHNjQ2RiU3lzdGVtCTkJLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBDREIncyBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIHNjRGJ4CQk5CS8qIG92ZXJsYXAgZGJ4IGludGVybmFsIHVzZSAqLwotI2RlZmluZSBzY1JlZ0ltYWdlCTEwCS8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0jZGVmaW5lIHNjSW5mbwkJMTEJLyogc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIHNjVXNlclN0cnVjdAkxMgkvKiBhZGRyZXNzIGluIHN0cnVjdCB1c2VyIGZvciBjdXJyZW50IHByb2Nlc3MgKi8KLSNkZWZpbmUgc2NTRGF0YQkJMTMJLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YSAqLwotI2RlZmluZSBzY1NCc3MJCTE0CS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbiAqLwotI2RlZmluZSBzY1JEYXRhCQkxNQkvKiBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YSAqLwotI2RlZmluZSBzY1ZhcgkJMTYJLyogVmFyIHBhcmFtZXRlciAoZm9ydHJhbixwYXNjYWwpICovCi0jZGVmaW5lIHNjQ29tbW9uCTE3CS8qIGNvbW1vbiB2YXJpYWJsZSAqLwotI2RlZmluZSBzY1NDb21tb24JMTgJLyogc21hbGwgY29tbW9uICovCi0jZGVmaW5lIHNjVmFyUmVnaXN0ZXIJMTkJLyogVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyICovCi0jZGVmaW5lIHNjVmFyaWFudAkyMAkvKiBWYXJpYW50IHJlY29yZCAqLwotI2RlZmluZSBzY1NVbmRlZmluZWQJMjEJLyogc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhICovCi0jZGVmaW5lIHNjSW5pdAkJMjIJLyogLmluaXQgc2VjdGlvbiBzeW1ib2wgKi8KLSNkZWZpbmUgc2NCYXNlZFZhcgkyMwkvKiBGb3J0cmFuIG9yIFBMLzEgcHRyIGJhc2VkIHZhciAqLyAKLSNkZWZpbmUgc2NYRGF0YSAgICAgICAgIDI0ICAgICAgLyogZXhjZXB0aW9uIGhhbmRsaW5nIGRhdGEgKi8KLSNkZWZpbmUgc2NQRGF0YSAgICAgICAgIDI1ICAgICAgLyogUHJvY2VkdXJlIHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NGaW5pICAgICAgICAgIDI2ICAgICAgLyogLmZpbmkgc2VjdGlvbiAqLwotI2RlZmluZSBzY1JDb25zdAkyNwkvKiAucmNvbnN0IHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NNYXgJCTMyCi0KLQotLyoKLSAqICAgU3ltYm9sIFR5cGVzCi0gKi8KLQotI2RlZmluZSBzdE5pbAkJMAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSNkZWZpbmUgc3RHbG9iYWwJMQkvKiBleHRlcm5hbCBzeW1ib2wgKi8KLSNkZWZpbmUgc3RTdGF0aWMJMgkvKiBzdGF0aWMgKi8KLSNkZWZpbmUgc3RQYXJhbQkJMwkvKiBwcm9jZWR1cmUgYXJndW1lbnQgKi8KLSNkZWZpbmUgc3RMb2NhbAkJNAkvKiBsb2NhbCB2YXJpYWJsZSAqLwotI2RlZmluZSBzdExhYmVsCQk1CS8qIGxhYmVsICovCi0jZGVmaW5lIHN0UHJvYwkJNgkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotI2RlZmluZSBzdEJsb2NrCQk3CS8qIGJlZ2lubm5pbmcgb2YgYmxvY2sgKi8KLSNkZWZpbmUgc3RFbmQJCTgJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSNkZWZpbmUgc3RNZW1iZXIJOQkvKiBtZW1iZXIgKG9mIGFueXRoaW5nCS0gc3RydWN0L3VuaW9uL2VudW0gKi8KLSNkZWZpbmUgc3RUeXBlZGVmCTEwCS8qIHR5cGUgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBzdEZpbGUJCTExCS8qIGZpbGUgbmFtZSAqLwotI2RlZmluZSBzdFJlZ1JlbG9jCTEyCS8qIHJlZ2lzdGVyIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgc3RGb3J3YXJkCTEzCS8qIGZvcndhcmRpbmcgYWRkcmVzcyAqLwotI2RlZmluZSBzdFN0YXRpY1Byb2MJMTQJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0jZGVmaW5lIHN0Q29uc3RhbnQJMTUJLyogY29uc3QgKi8KLSNkZWZpbmUgc3RTdGFQYXJhbQkxNgkvKiBGb3J0cmFuIHN0YXRpYyBwYXJhbWV0ZXJzICovCi0gICAgLyogVGhlc2UgbmV3IHN5bWJvbCB0eXBlcyBoYXZlIGJlZW4gcmVjZW50bHkgYWRkZWQgdG8gU0dJIG1hY2hpbmVzLiAqLwotI2RlZmluZSBzdFN0cnVjdAkyNgkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZSAqLwotI2RlZmluZSBzdFVuaW9uCQkyNwkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSB1bmlvbiB0eXBlICovCi0jZGVmaW5lIHN0RW51bQkJMjgJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGFuIGVudW0gdHlwZSAqLwotI2RlZmluZSBzdEluZGlyZWN0CTM0CS8qIEluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIFBzZXVkby1zeW1ib2xzIC0gaW50ZXJuYWwgdG8gZGVidWdnZXIgKi8KLSNkZWZpbmUgc3RTdHIJCTYwCS8qIHN0cmluZyAqLwotI2RlZmluZSBzdE51bWJlcgk2MQkvKiBwdXJlIG51bWJlciAoaWUuIDQgTk9SIDIrMikgKi8KLSNkZWZpbmUgc3RFeHByCQk2MgkvKiAyKzIgdnMuIDQgKi8KLSNkZWZpbmUgc3RUeXBlCQk2MwkvKiBwb3N0LWNvZXJzaW9uIFNFUiAqLwotI2RlZmluZSBzdE1heAkJNjQKLQotLyogZGVmaW5pdGlvbnMgZm9yIGZpZWxkcyBpbiBUSVIgKi8KLQotLyogdHlwZSBxdWFsaWZpZXJzIGZvciB0aS50cTAgLT4gdGkuKGl0cU1heC0xKSAqLwotI2RlZmluZSB0cU5pbAkwCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotI2RlZmluZSB0cVB0cgkxCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgdHFQcm9jCTIJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIHRxQXJyYXkgMwkvKiBkdWggKi8KLSNkZWZpbmUgdHFGYXIJNAkvKiBsb25nZXIgYWRkcmVzc2luZyAtIDgwODYvOCBsYW5kICovCi0jZGVmaW5lIHRxVm9sCTUJLyogdm9sYXRpbGUgKi8KLSNkZWZpbmUgdHFDb25zdCA2CS8qIGNvbnN0ICovCi0jZGVmaW5lIHRxTWF4CTgKLQotLyogYmFzaWMgdHlwZXMgYXMgc2VlbiBpbiB0aS5idCAqLwotI2RlZmluZSBidE5pbAkJMAkvKiB1bmRlZmluZWQgKGFsc28sIGVudW0gbWVtYmVycykgKi8KLSNkZWZpbmUgYnRBZHIJCTEJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSNkZWZpbmUgYnRDaGFyCQkyCS8qIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFVDaGFyCQkzCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFNob3J0CQk0CS8qIHNob3J0ICovCi0jZGVmaW5lIGJ0VVNob3J0CTUJLyogdW5zaWduZWQgc2hvcnQgKi8KLSNkZWZpbmUgYnRJbnQJCTYJLyogaW50ICovCi0jZGVmaW5lIGJ0VUludAkJNwkvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgYnRMb25nCQk4CS8qIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZwkJOQkvKiB1bnNpZ25lZCBsb25nICovCi0jZGVmaW5lIGJ0RmxvYXQJCTEwCS8qIGZsb2F0IChyZWFsKSAqLwotI2RlZmluZSBidERvdWJsZQkxMQkvKiBEb3VibGUgKHJlYWwpICovCi0jZGVmaW5lIGJ0U3RydWN0CTEyCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotI2RlZmluZSBidFVuaW9uCQkxMwkvKiBVbmlvbiAodmFyaWFudCkgKi8KLSNkZWZpbmUgYnRFbnVtCQkxNAkvKiBFbnVtZXJhdGVkICovCi0jZGVmaW5lIGJ0VHlwZWRlZgkxNQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0jZGVmaW5lIGJ0UmFuZ2UJCTE2CS8qIHN1YnJhbmdlIG9mIGludCAqLwotI2RlZmluZSBidFNldAkJMTcJLyogcGFzY2FsIHNldHMgKi8KLSNkZWZpbmUgYnRDb21wbGV4CTE4CS8qIGZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZSBidERDb21wbGV4CTE5CS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSNkZWZpbmUgYnRJbmRpcmVjdAkyMAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotI2RlZmluZSBidEZpeGVkRGVjCTIxCS8qIEZpeGVkIERlY2ltYWwgKi8KLSNkZWZpbmUgYnRGbG9hdERlYwkyMgkvKiBGbG9hdCBEZWNpbWFsICovCi0jZGVmaW5lIGJ0U3RyaW5nCTIzCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSNkZWZpbmUgYnRCaXQJCTI0CS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotI2RlZmluZSBidFBpY3R1cmUJMjUJLyogUGljdHVyZSAqLwotI2RlZmluZSBidFZvaWQJCTI2CS8qIHZvaWQgKi8KLSNkZWZpbmUgYnRMb25nTG9uZwkyNwkvKiBsb25nIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZ0xvbmcJMjgJLyogdW5zaWduZWQgbG9uZyBsb25nICovCi0jZGVmaW5lIGJ0TWF4CQk2NAotCi0jaWYgKF9NRkcgPT0gX01JUFMpCi0vKiBvcHRpbWl6YXRpb24gdHlwZSBjb2RlcyAqLwotI2RlZmluZSBvdE5pbAkJMAotI2RlZmluZSBvdFJlZwkJMQkvKiBtb3ZlIHZhciB0byByZWcgKi8KLSNkZWZpbmUgb3RCbG9jawkJMgkvKiBiZWdpbiBiYXNpYyBibG9jayAqLwotI2RlZmluZQlvdFByb2MJCTMJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIG90SW5saW5lCTQJLyogaW5saW5lIHByb2NlZHVyZSAqLwotI2RlZmluZSBvdEVuZAkJNQkvKiB3aGF0ZXZlciB5b3Ugc3RhcnRlZCAqLwotI2RlZmluZSBvdE1heAkJNgkvKiBLRUVQIFVQIFRPIERBVEUgKi8KLSNlbmRpZiAvKiAoX01GRyA9PSBfTUlQUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aS5oIGIvaW5jbHVkZS9jb2ZmL3RpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTIxYjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyogQ09GRiBpbmZvcm1hdGlvbiBmb3IgVEkgQ09GRiBzdXBwb3J0LiAgRGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIHNob3VsZCBiZQotICAgY3VzdG9taXplZCBpbiBhIHRhcmdldC1zcGVjaWZpYyBmaWxlLCBhbmQgdGhlbiB0aGlzIGZpbGUgaW5jbHVkZWQgKHNlZQotICAgdGljNTR4LmggZm9yIGFuIGV4YW1wbGUpLiAqLwotI2lmbmRlZiBDT0ZGX1RJX0gKLSNkZWZpbmUgQ09GRl9USV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0gICAgICAgIGNoYXIgZl90YXJnZXRfaWRbMl07ICAgIC8qIG1hZ2ljIG5vLiAoVEkgQ09GRi1zcGVjaWZpYykgKi8KLX07Ci0KLS8qIENPRkYwIGhhcyBtYWdpYyBudW1iZXIgaW4gZl9tYWdpYywgYW5kIG9taXRzIGZfdGFyZ2V0X2lkIGZyb20gdGhlIGZpbGUKLSAgIGhlYWRlcjsgZm9yIGxhdGVyIHZlcnNpb25zLCBmX21hZ2ljIGlzIDB4QzEgZm9yIENPRkYxIGFuZCAweEMyIGZvciBDT0ZGMgotICAgYW5kIHRoZSB0YXJnZXQtc3BlY2lmaWMgbWFnaWMgbnVtYmVyIGlzIGZvdW5kIGluIGZfdGFyZ2V0X2lkICovIAotCi0jZGVmaW5lIFRJQ09GRjBNQUdJQyAgICBUSV9UQVJHRVRfSUQKLSNkZWZpbmUgVElDT0ZGMU1BR0lDICAgIDB4MDBDMQotI2RlZmluZSBUSUNPRkYyTUFHSUMgICAgMHgwMEMyCi0jZGVmaW5lIFRJQ09GRl9BT1VUX01BR0lDICAgIDB4MDEwOCAvKiBtYWdpYyBudW1iZXIgaW4gb3B0aW9uYWwgaGVhZGVyICovCi0jZGVmaW5lIFRJQ09GRiAgICAgICAgICAxIC8qIGN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFRoZSB0YXJnZXRfaWQgZmllbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIHBhcnRpY3VsYXIgQ1BVIHRhcmdldCAqLwotLyogZm9yIENPRkYwLCB0aGUgdGFyZ2V0IGlkIGFwcGVhcmVkIGluIGZfbWFnaWMsIHdoZXJlIENPRkZYIG1hZ2ljIGlzIG5vdyAqLwotI2lmbmRlZiBUSV9UQVJHRVRfSUQKLSNlcnJvciAiVElfVEFSR0VUX0lEIG5lZWRzIHRvIGJlIGRlZmluZWQgZm9yIHlvdXIgQ1BVIgotI2VuZGlmCi0KLS8qIFdoaWNoIGJmZF9hcmNoIHRvIHVzZS4uLiAqLwotI2lmbmRlZiBUSUNPRkZfVEFSR0VUX0FSQ0gKLSNlcnJvciAiVElDT0ZGX1RBUkdFVF9BUkNIIG5lZWRzIHRvIGJlIGRlZmluZWQgZm9yIHlvdXIgQ1BVIgotI2VuZGlmCi0KLS8qIERlZmF1bHQgdG8gQ09GRjIgZm9yIGZpbGUgb3V0cHV0ICovCi0jaWZuZGVmIFRJQ09GRl9ERUZBVUxUX01BR0lDCi0jZGVmaW5lIFRJQ09GRl9ERUZBVUxUX01BR0lDIFRJQ09GRjJNQUdJQwotI2VuZGlmCi0KLS8qIFRoaXMgdmFsdWUgaXMgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHJhcmUgY2FzZSB3aGVyZSBhIGJmZCBpcyB1bmF2YWlsYWJsZSAqLwotI2lmbmRlZiBPQ1RFVFNfUEVSX0JZVEVfUE9XRVIKLSN3YXJuIE9DVEVUU19QRVJfQllURV9QT1dFUiBub3QgZGVmaW5lZCBmb3IgdGhpcyBDUFUsIGl0IHdpbGwgZGVmYXVsdCB0byAwCi0jZWxzZQotI2RlZmluZSBPQ1RFVFNfUEVSX0JZVEUgKDE8PE9DVEVUU19QRVJfQllURV9QT1dFUikKLSNlbmRpZgotCi0vKiBkZWZhdWx0IGFsaWdubWVudCBpcyBvbiBhIGJ5dGUgKG5vdCBvY3RldCEpIGJvdW5kYXJ5ICovCi0jaWZuZGVmIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUgotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgMAotI2VuZGlmCi0KLS8qIFRJIENPRkYgZW5jb2RlcyB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIGZsYWdzICovCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgMQotI2RlZmluZSBDT0ZGX0FMSUdOX0lOX1NfRkxBR1MgMQotLyogcmVxdWlyZXMgYSBwb3dlci1vZi10d28gYXJndW1lbnQgKi8KLSNkZWZpbmUgQ09GRl9FTkNPREVfQUxJR05NRU5UKFMsWCkgKChTKS5zX2ZsYWdzIHw9ICgoKHVuc2lnbmVkKShYKSYweEYpPDw4KSkKLS8qIHJlc3VsdCBpcyBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBDT0ZGX0RFQ09ERV9BTElHTk1FTlQoWCkgKCgoWCk+PjgpJjB4RikKLQotI2RlZmluZSBDT0ZGMF9QKEFCRkQpIChiZmRfY29mZl9maWxoc3ooQUJGRCkgPT0gRklMSFNaX1YwKQotI2RlZmluZSBDT0ZGMl9QKEFCRkQpIChiZmRfY29mZl9zY25oc3ooQUJGRCkgIT0gU0NOSFNaX1YwMSkKLQotI2RlZmluZSBDT0ZGMF9CQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFRJQ09GRjBNQUdJQykKLSNkZWZpbmUgQ09GRjFfQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBUSUNPRkYxTUFHSUMgfHwgKHgpLmZfdGFyZ2V0X2lkICE9IFRJX1RBUkdFVF9JRCkKLSNkZWZpbmUgQ09GRjJfQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBUSUNPRkYyTUFHSUMgfHwgKHgpLmZfdGFyZ2V0X2lkICE9IFRJX1RBUkdFVF9JRCkKLQotLyogd2UgbmVlZCB0byByZWFkL3dyaXRlIGFuIGV4dHJhIGZpZWxkIGluIHRoZSBjb2ZmIGZpbGUgaGVhZGVyICovCi0jaWZuZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVAotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QoYWJmZCxzcmMsZHN0KSBcCi1kbyB7ICgoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikoZHN0KSktPmZfdGFyZ2V0X2lkID0gXAotYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSgoKEZJTEhEUiAqKShzcmMpKS0+Zl90YXJnZXRfaWQpKTsgXAotfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVAotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUKGFiZmQsc3JjLGRzdCkgXAotZG8geyBiZmRfaF9wdXRfMTYoYWJmZCwgKChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKShzcmMpKS0+Zl90YXJnZXRfaWQsIFwKLSAgICAgICAgICAgICAoYmZkX2J5dGUgKikoKChGSUxIRFIgKikoZHN0KSktPmZfdGFyZ2V0X2lkKSk7IFwKLX0gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjIKLSNkZWZpbmUgRklMSFNaX1YwIDIwICAgICAgICAgICAgICAgIC8qIENPRkYwIG9taXRzIHRhcmdldF9pZCBmaWVsZCAqLwotCi0vKiBGaWxlIGhlYWRlciBmbGFncyAqLwotI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKLS8qIEZfTFNZTVMgbmVlZHMgdG8gYmUgcmVkZWZpbmVkIGluIHlvdXIgc291cmNlIGZpbGUgKi8KLSNkZWZpbmUJRl9MU1lNU19USUNPRkYJKDB4MDAxMCkgLyogbm9ybWFsIENPRkYgaXMgMHg4ICovCi0KLSNkZWZpbmUgRl8xMCAgICAgICAgICAgIDB4MDAgICAgLyogZmlsZSBidWlsdCBmb3IgVE1TMzIwQzF4IGRldmljZXMgKi8KLSNkZWZpbmUgRl8yMCAgICAgICAgICAgIDB4MTAgICAgLyogZmlsZSBidWlsdCBmb3IgVE1TMzIwQzJ4IGRldmljZXMgKi8KLSNkZWZpbmUgRl8yNSAgICAgICAgICAgIDB4MjAgICAgLyogZmlsZSBidWlsdCBmb3IgVE1TMzIwQzJ4L0M1eCBkZXZpY2VzICovCi0jZGVmaW5lIEZfTEVORElBTiAgICAgICAweDAxMDAgIC8qIDE2IGJpdHMvd29yZCwgTFNCIGZpcnN0ICovCi0jZGVmaW5lIEZfU1lNTUVSR0UgICAgICAweDEwMDAgIC8qIGR1cGxpY2F0ZSBzeW1ib2xzIHdlcmUgcmVtb3ZlZCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBPUFRJT05BTCBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUgKDB4MTA4KSAJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ09GRjAsIENPRkYxICovCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyX3YwMSB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplIChpbiBXT1JEUykgICAgICAqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgICBzX3Jlc2VydmVkWzFdOyAgLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLyAKLSAgICAgICAgY2hhciAgICAgICAgICAgIHNfcGFnZVsxXTsgICAgICAvKiBzZWN0aW9uIHBhZ2UgbnVtYmVyIChMT0FEKSAgICovCi19OwotCi0vKiBDT0ZGMiAqLwotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplIChpbiBXT1JEUykgICAgICAqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1s0XTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bNF07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgICBzX3Jlc2VydmVkWzJdOyAgLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLyAKLSAgICAgICAgY2hhciAgICAgICAgICAgIHNfcGFnZVsyXTsgICAgICAvKiBzZWN0aW9uIHBhZ2UgbnVtYmVyIChMT0FEKSAgICovCi19OwotCi0vKgotICogU3BlY2lhbCBzZWN0aW9uIGZsYWdzCi0gKi8KLQotLyogVEkgQ09GRiBkZWZpbmVzIHRoZXNlIGZsYWdzOyAKLSAgIFNUWVBfQ0xJTks6IHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBmaW5hbAotICAgbGlua2VyIG91dHB1dCBpZiB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyBmb3VuZCB0byBhbnkgc3ltYm9sIGluIHRoZSBzZWN0aW9uCi0gICBTVFlQX0JMT0NLOiB0aGUgc2VjdGlvbiBzaG91bGQgYmUgYmxvY2tlZCwgaS5lLiBpZiB0aGUgc2VjdGlvbiB3b3VsZCBjcm9zcwotICAgYSBwYWdlIGJvdW5kYXJ5LCBpdCBpcyBzdGFydGVkIGF0IGEgcGFnZSBib3VuZGFyeSBpbnN0ZWFkLgotICAgVEkgQ09GRiBwdXRzIHRoZSBzZWN0aW9uIGFsaWdubWVudCBwb3dlciBvZiB0d28gaW4gdGhlIHNlY3Rpb24gZmxhZ3MKLSAgIGUuZy4gMioqTiBpcyBhbGlnbm1lbnQsIGZsYWdzIHw9IChOICYgMHhGKSA8PCA4Ci0qLyAKLSNkZWZpbmUgU1RZUF9DTElOSyAgICAgICgweDQwMDApCi0jZGVmaW5lIFNUWVBfQkxPQ0sgICAgICAoMHgxMDAwKQotI2RlZmluZSBTVFlQX0FMSUdOICAgICAgKDB4MEYwMCkgLyogVEkgQ09GRiBzdG9yZXMgc2VjdGlvbiBhbGlnbm1lbnQgaGVyZSAqLwotCi0jZGVmaW5lCVNDTkhEUl9WMDEgc3RydWN0IGV4dGVybmFsX3Njbmhkcl92MDEKLSNkZWZpbmUgU0NOSERSIHN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaX1YwMSA0MCAgICAgICAgICAgICAgICAgIC8qIGZvciB2MCBhbmQgdjEgKi8KLSNkZWZpbmUgU0NOSFNaIDQ4Ci0KLS8qIENPRkYyIGNoYW5nZXMgdGhlIG9mZnNldHMgYW5kIHNpemVzIG9mIHRoZXNlIGZpZWxkcyAKLSAgIEFzc3VtZSB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIENPRkYyIHNjbmhkciBzdHJ1Y3R1cmUsIGFuZCBhZGp1c3QKLSAgIGFjY29yZGluZ2x5IAotICovCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DKEFCRkQsUFRSKSBcCi0oQ09GRjJfUChBQkZEKSA/IGJmZF9oX2dldF8zMiAoQUJGRCxQVFIpIDogYmZkX2hfZ2V0XzE2IChBQkZELCBQVFIpKQotI2RlZmluZSBQVVRfU0NOSERSX05SRUxPQyhBQkZELFZBTCxQVFIpIFwKLShDT0ZGMl9QKEFCRkQpID8gYmZkX2hfcHV0XzMyIChBQkZELFZBTCxQVFIpIDogYmZkX2hfcHV0XzE2IChBQkZELFZBTCxQVFIpKQotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PKEFCRkQsUFRSKSBcCi0oQ09GRjJfUChBQkZEKSA/IGJmZF9oX2dldF8zMiAoQUJGRCxQVFIpIDogYmZkX2hfZ2V0XzE2IChBQkZELCAoUFRSKS0yKSkKLSNkZWZpbmUgUFVUX1NDTkhEUl9OTE5OTyhBQkZELFZBTCxQVFIpIFwKLShDT0ZGMl9QKEFCRkQpID8gYmZkX2hfcHV0XzMyIChBQkZELFZBTCxQVFIpIDogYmZkX2hfcHV0XzE2IChBQkZELFZBTCwoUFRSKS0yKSkKLSNkZWZpbmUgR0VUX1NDTkhEUl9GTEFHUyhBQkZELFBUUikgXAotKENPRkYyX1AoQUJGRCkgPyBiZmRfaF9nZXRfMzIgKEFCRkQsUFRSKSA6IGJmZF9oX2dldF8xNiAoQUJGRCwgKFBUUiktNCkpCi0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MoQUJGRCxWQUwsUFRSKSBcCi0oQ09GRjJfUChBQkZEKSA/IGJmZF9oX3B1dF8zMiAoQUJGRCxWQUwsUFRSKSA6IGJmZF9oX3B1dF8xNiAoQUJGRCxWQUwsKFBUUiktNCkpCi0jZGVmaW5lIEdFVF9TQ05IRFJfUEFHRShBQkZELFBUUikgXAotKENPRkYyX1AoQUJGRCkgPyBiZmRfaF9nZXRfMTYgKEFCRkQsUFRSKSA6IGJmZF9oX2dldF84IChBQkZELCAoUFRSKS03KSkKLS8qIG9uIG91dHB1dCwgbWFrZSBzdXJlIHRoYXQgdGhlICJyZXNlcnZlZCIgZmllbGQgaXMgemVybyAqLwotI2RlZmluZSBQVVRfU0NOSERSX1BBR0UoQUJGRCxWQUwsUFRSKSBcCi0oQ09GRjJfUChBQkZEKSA/IGJmZF9oX3B1dF8xNiAoQUJGRCxWQUwsUFRSKSA6IFwKLWJmZF9oX3B1dF84IChBQkZELFZBTCwoUFRSKS03KSwgYmZkX2hfcHV0XzggKEFCRkQsIDAsIChQVFIpLTgpKQotCi0vKiBUSSBDT0ZGIHN0b3JlcyBzZWN0aW9uIHNpemUgYXMgbnVtYmVyIG9mIGJ5dGVzIChhZGRyZXNzIHVuaXRzLCBub3Qgb2N0ZXRzKSwKLSAgIHNvIGFkanVzdCB0byBiZSBudW1iZXIgb2Ygb2N0ZXRzLCB3aGljaCBpcyB3aGF0IEJGRCBleHBlY3RzICovIAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUoQUJGRCxTWlApIFwKLShiZmRfaF9nZXRfMzIoQUJGRCxTWlApKmJmZF9vY3RldHNfcGVyX2J5dGUoQUJGRCkpCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRShBQkZELFNaLFNaUCkgXAotYmZkX2hfcHV0XzMyKEFCRkQsKFNaKS9iZmRfb2N0ZXRzX3Blcl9ieXRlKEFCRkQpLFNaUCkKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVChBQkZELEVYVCxJTlQpIFwKLWRvIHsgKChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopKElOVCkpLT5zX3BhZ2UgPSBcCi1HRVRfU0NOSERSX1BBR0UoQUJGRCwoYmZkX2J5dGUgKikoKFNDTkhEUiAqKShFWFQpKS0+c19wYWdlKTsgXAotfSB3aGlsZSgwKQotCi0vKiBUaGUgbGluZSBudW1iZXIgYW5kIHJlbG9jIG92ZXJmbG93IGNoZWNraW5nIGluIGNvZmZfc3dhcF9zY25oZHJfb3V0IGluCi0gICBjb2Zmc3dhcC5oIGRvZXNuJ3QgdXNlIFBVVF9YIGZvciBzX25sbm5vIGFuZCBzX25yZWxvYy4KLSAgIER1ZSB0byBkaWZmZXJlbnQgc2l6ZWQgdjAvdjEvdjIgc2VjdGlvbiBoZWFkZXJzLCB3ZSBoYXZlIHRvIHJlLXdyaXRlIHRoZXNlCi0gICBmaWVsZHMuCi0gKi8KLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUKEFCRkQsSU5ULEVYVCkgXAotZG8geyBcCi1QVVRfU0NOSERSX05MTk5PKEFCRkQsKChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopKElOVCkpLT5zX25sbm5vLFwKLSAgICAgICAgICAgICAgICAoYmZkX2J5dGUgKikoKFNDTkhEUiAqKShFWFQpKS0+c19ubG5ubyk7IFwKLVBVVF9TQ05IRFJfTlJFTE9DKEFCRkQsKChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopKElOVCkpLT5zX25yZWxvYyxcCi0gICAgICAgICAgICAgICAgKGJmZF9ieXRlICopKChTQ05IRFIgKikoRVhUKSktPnNfbnJlbG9jKTsgXAotUFVUX1NDTkhEUl9GTEFHUyhBQkZELCgoc3RydWN0IGludGVybmFsX3NjbmhkciAqKShJTlQpKS0+c19mbGFncywgXAotICAgICAgICAgICAgICAgIChiZmRfYnl0ZSAqKSgoU0NOSERSICopKEVYVCkpLT5zX2ZsYWdzKTsgXAotUFVUX1NDTkhEUl9QQUdFKEFCRkQsKChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopKElOVCkpLT5zX3BhZ2UsIFwKLSAgICAgICAgICAgICAgICAoYmZkX2J5dGUgKikoKFNDTkhEUiAqKShFWFQpKS0+c19wYWdlKTsgXAotfSB3aGlsZSgwKQotCi0vKiBQYWdlIG1hY3JvcwotCi0gICBUaGUgZmlyc3QgR0RCIHBvcnQgcmVxdWlyZXMgZmxhZ3MgaW4gaXRzIHJlbW90ZSBtZW1vcnkgYWNjZXNzIGNvbW1hbmRzIHRvCi0gICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRhdGEvcHJvZyBzcGFjZS4gIEhvcGVmdWxseSB3ZSBjYW4gbWFrZSB0aGlzIGdvIGF3YXkKLSAgIGV2ZW50dWFsbHkuICBTdHVmZiB0aGUgcGFnZSBpbiB0aGUgdXBwZXIgYml0cyBvZiBhIDMyLWJpdCBhZGRyZXNzLCBzaW5jZQotICAgdGhlIGM1eCBmYW1pbHkgb25seSB1c2VzIDE2IG9yIDIzIGJpdHMuCi0KLSAgIGMyeCwgYzV4IGFuZCBtb3N0IGM1NHggZGV2aWNlcyBoYXZlIDE2LWJpdCBhZGRyZXNzZXMsIGJ1dCB0aGUgYzU0OCBoYXMKLSAgIDIzLWJpdCBwcm9ncmFtIGFkZHJlc3Nlcy4gIE1ha2Ugc3VyZSB0aGUgcGFnZSBmbGFncyBkb24ndCBpbnRlcmZlcmUuCi0gICBUaGVzZSBmbGFncyBhcmUgdXNlZCBieSBHREIgdG8gaWRlbnRpZnkgdGhlIGRlc3RpbmF0aW9uIHBhZ2UgZm9yCi0gICBhZGRyZXNzZXMuIAotKi8KLQotLyogcmVjb2duaXplZCBsb2FkIHBhZ2VzICovCi0jZGVmaW5lIFBHX1BST0cgICAgICAgICAweDAgICAgICAgICAvKiBQUk9HIHBhZ2UgKi8KLSNkZWZpbmUgUEdfREFUQSAgICAgICAgIDB4MSAgICAgICAgIC8qIERBVEEgcGFnZSAqLwotCi0jZGVmaW5lIEFERFJfTUFTSyAgICAgICAweDAwRkZGRkZGCi0jZGVmaW5lIFBHX1RPX0ZMQUcocCkgICAoKCh1bnNpZ25lZCBsb25nKShwKSAmIDB4RkYpIDw8IDI0KQotI2RlZmluZSBGTEFHX1RPX1BHKGYpICAgKCgoZikgPj4gMjQpICYgMHhGRikKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ0lOSVQgICIuY2luaXQiICAgICAgICAgICAgLyogaW5pdGlhbGl6ZWQgQyBkYXRhICovCi0jZGVmaW5lIF9TQ09OU1QgICIuY29uc3QiICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KLSNkZWZpbmUgX1NXSVRDSCAiLnN3aXRjaCIgICAgICAgICAgIC8qIHN3aXRjaCB0YWJsZXMgKi8KLSNkZWZpbmUgX1NUQUNLICAiLnN0YWNrIiAgICAgICAgICAgIC8qIEMgc3RhY2sgKi8KLSNkZWZpbmUgX1NZU01FTSAiLnN5c21lbSIgICAgICAgICAgIC8qIHVzZWQgZm9yIG1hbGxvYyBldCBhbC4gc3lzY2FsbHMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLSAgdW5pb24gewotICAgIGNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOT1RFOiB0aGlzIGlzIHdoYXQgYSBsb2NhbCBsYWJlbCBsb29rcyBsaWtlIGluIGFzc2VtYmx5IHNvdXJjZTsgd2hhdCBpdAotICAgbG9va3MgbGlrZSBpbiBDT0ZGIG91dHB1dCBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgVElDT0ZGX0xPQ0FMX0xBQkVMX1AoTkFNRSkgXAotKChOQU1FWzBdID09ICckJyAmJiBOQU1FWzFdID49ICcwJyAmJiBOQU1FWzFdIDw9ICc5JyAmJiBOQU1FWzJdID09ICdcMCcpIFwKLSB8fCBOQU1FW3N0cmxlbihOQU1FKS0xXSA9PSAnPycpCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0JY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7Ci0JCWNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCSAgfSB4X2xuc3o7Ci0JICBjaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQl9IHhfbWlzYzsKLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIH0geF9mY247Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JICB9IHhfYXJ5OwotCX0geF9mY25hcnk7Ci0JY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0Jc3RydWN0IHsKLQkgIGNoYXIgeF96ZXJvZXNbNF07Ci0JICBjaGFyIHhfb2Zmc2V0WzRdOwotCX0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotICAKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLS8qIHNlY3Rpb24gbGVuZ3RocyBhcmUgaW4gdGFyZ2V0IGJ5dGVzIChub3QgaG9zdCBieXRlcykgKi8KLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oQUJGRCxFWFQpIFwKLShiZmRfaF9nZXRfMzIoQUJGRCwoYmZkX2J5dGUgKikoRVhUKS0+eF9zY24ueF9zY25sZW4pKmJmZF9vY3RldHNfcGVyX2J5dGUoQUJGRCkpCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKEFCRkQsSU5ULEVYVCkgXAotYmZkX2hfcHV0XzMyKEFCRkQsKElOVCkvYmZkX29jdGV0c19wZXJfYnl0ZShBQkZEKSxcCi0gICAgICAgICAgICAgKGJmZF9ieXRlICopKEVYVCktPnhfc2NuLnhfc2NubGVuKQotCi0vKiBsbnN6IHNpemUgaXMgaW4gYml0cyBpbiBDT0ZGIGZpbGUsIGluIGJ5dGVzIGluIEJGRCAqLwotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgXAotKGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKSAvIFwKLSAoY2xhc3MgIT0gQ19GSUVMRCA/IDggOiAxKSkKLQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIFwKLSBiZmRfaF9wdXRfMTYoYWJmZCwgKChjbGFzcyAhPSBDX0ZJRUxEKSA/IChpbikqOCA6IChpbikpLCBcCi0gICAgICAgICAgICAgIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0gCi0vKiBUSSBDT0ZGIHN0b3JlcyBvZmZzZXRzIGZvciBNT1MgYW5kIE1PVSBpbiBiaXRzOyBCRkQgZXhwZWN0cyBieXRlcyAqLwotI2RlZmluZSBDT0ZGX0FESlVTVF9TWU1fSU5fUE9TVChBQkZELEVYVCxJTlQpIFwKLWRvIHsgc3RydWN0IGludGVybmFsX3N5bWVudCAqZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikoSU5UKTsgXAotaWYgKGRzdC0+bl9zY2xhc3MgPT0gQ19NT1MgfHwgZHN0LT5uX3NjbGFzcyA9PSBDX01PVSkgZHN0LT5uX3ZhbHVlIC89IDg7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ09GRl9BREpVU1RfU1lNX09VVF9QT1NUKEFCRkQsSU5ULEVYVCkgXAotZG8geyBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzcmMgPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKShJTlQpOyBcCi1TWU1FTlQgKmRzdCA9IChTWU1FTlQgKikoRVhUKTsgXAotaWYoc3JjLT5uX3NjbGFzcyA9PSBDX01PVSB8fCBzcmMtPm5fc2NsYXNzID09IENfTU9TKSBcCi1iZmRfaF9wdXRfMzIoYWJmZCxzcmMtPm5fdmFsdWUgKiA4LChiZmRfYnl0ZSAqKWRzdC0+ZV92YWx1ZSk7IFwKLX0gd2hpbGUgKDApCi0KLS8qIERldGVjdCBzZWN0aW9uLXJlbGF0aXZlIGFic29sdXRlIHN5bWJvbHMgc28gdGhleSBnZXQgZmxhZ2dlZCB3aXRoIGEgc3ltCi0gICBpbmRleCBvZiAtMS4KLSovCi0jZGVmaW5lIFNFQ1RJT05fUkVMQVRJVkVfQUJTT0xVVEVfU1lNQk9MX1AoUkVMT0MsU0VDVCkgXAotKCgqKFJFTE9DKS0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSAoU0VDVCkgXAotICYmIChSRUxPQyktPmhvd3RvLT5uYW1lWzBdID09ICdBJykKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvY192MCB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFsyXTsKLSAgY2hhciByX3Jlc2VydmVkWzJdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3Jlc2VydmVkWzJdOyAvKiBleHRlbmRlZCBwbWFkIGJ5dGUgZm9yIENPRkYyICovCi0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1pfVjAgMTAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIC0tIGNvZmZjb2RlLmggbmVlZHMgZml4aW5nICovCi0jZGVmaW5lIFJFTFNaIDEyICAgICAgICAgICAgICAgICAgICAvKiBmb3IgQ09GRjEvMiAqLwotCi0vKiB2YXJpb3VzIHJlbG9jYXRpb24gdHlwZXMuICAqLwotI2RlZmluZSBSX0FCUyAgICAgMHgwMDAwICAgICAgICAgICAgLyogbm8gcmVsb2NhdGlvbiAqLwotI2RlZmluZSBSX1JFTDEzICAgMHgwMDJBICAgICAgICAgICAgLyogMTMtYml0IGRpcmVjdCByZWZlcmVuY2UgKD8/PykgKi8KLSNkZWZpbmUgUl9QQVJUTFM3IDB4MDAyOCAgICAgICAgICAgIC8qIDcgTFNCcyBvZiBhbiBhZGRyZXNzICovCi0jZGVmaW5lIFJfUEFSVE1TOSAweDAwMjkgICAgICAgICAgICAvKiA5TVNCcyBvZiBhbiBhZGRyZXNzICovCi0jZGVmaW5lIFJfRVhUV09SRCAweDAwMkIgICAgICAgICAgICAvKiAyMy1iaXQgZGlyZWN0IHJlZmVyZW5jZSAqLwotI2RlZmluZSBSX0VYVFdPUkQxNiAweDAwMkMgICAgICAgICAgLyogMTYtYml0IGRpcmVjdCByZWZlcmVuY2UgdG8gMjMtYml0IGFkZHIqLwotI2RlZmluZSBSX0VYVFdPUkRNUzcgMHgwMDJEICAgICAgICAgLyogdXBwZXIgNyBiaXRzIG9mIDIzLWJpdCBhZGRyZXNzICovCi0KLSNlbmRpZiAvKiBDT0ZGX1RJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWMzMC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjAyNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDM1ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlUSUMzME1BR0lDCTB4QzAwMAotCi0jZGVmaW5lIFRJQzMwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVRJQzMwTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0JY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7Ci0JCWNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCSAgfSB4X2xuc3o7Ci0JICBjaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQl9IHhfbWlzYzsKLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIH0geF9mY247Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JICB9IHhfYXJ5OwotCX0geF9mY25hcnk7Ci0JY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0Jc3RydWN0IHsKLQkgIGNoYXIgeF96ZXJvZXNbNF07Ci0JICBjaGFyIHhfb2Zmc2V0WzRdOwotCX0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotICAKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIFRNUzMyMEMzMCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQotI2RlZmluZSBSX1RJQzMwX0FCUzE2IDB4MTAwICAvKiAxNiBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfQUJTMjQgMHgxMDEgIC8qIDI0IGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9BQlMzMiAweDEwMiAgLyogMzIgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0xEUCAgIDB4MTAzICAvKiBMRFAgYml0cyAyMy0xNiB0byA3LTAuICovCi0jZGVmaW5lIFJfVElDMzBfUEMxNiAgMHgxMDQgIC8qIDE2IGJpdCBwYyByZWxhdGl2ZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWM1NHguaCBiL2luY2x1ZGUvY29mZi90aWM1NHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzYTQyYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdGljNTR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBUSSBDT0ZGIGluZm9ybWF0aW9uIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDNTRYLiAgVGhpcyBmaWxlIGN1c3RvbWl6ZXMgCi0gICB0aGUgc2V0dGluZ3MgaW4gY29mZi90aS5oLiAqLwotI2lmbmRlZiBDT0ZGX1RJQzU0WF9ICi0jZGVmaW5lIENPRkZfVElDNTRYX0gKLSNkZWZpbmUgVElDNTRYX1RBUkdFVF9JRCAweDk4Ci0jZGVmaW5lIFRJQzU0WEFMR01BR0lDICAweDAwOUIgIC8qIGM1NHggYWxnZWJyYWljIGFzc2VtYmxlciBvdXRwdXQgKi8KLSNkZWZpbmUgVElDNVhfVEFSR0VUX0lEICAweDkyCi0jZGVmaW5lIFRJX1RBUkdFVF9JRCBUSUM1NFhfVEFSR0VUX0lECi0jZGVmaW5lIE9DVEVUU19QRVJfQllURV9QT1dFUiAxIC8qIG9jdGV0cyBwZXIgYnl0ZSwgYXMgYSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgSE9XVE9fQkFOSyA2IC8qIGFkZCB0byBob3d0byB0byBnZXQgYWJzb2x1dGUvc2VjdC1yZWxhdGl2ZSB2ZXJzaW9uICovCi0jZGVmaW5lIFRJQ09GRl9UQVJHRVRfQVJDSCBiZmRfYXJjaF90aWM1NHgKLSNkZWZpbmUgVElDT0ZGX0RFRkFVTFRfTUFHSUMgVElDT0ZGMU1BR0lDIC8qIHdlIHVzZSBDT0ZGMSBmb3IgY29tcGF0aWJpbGl0eSAqLwotI2luY2x1ZGUgImNvZmYvdGkuaCIKLSNlbmRpZiAvKiBDT0ZGX1RJQzU0WF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljODAuaCBiL2luY2x1ZGUvY29mZi90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzOGY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgVEkgVE1TMzIwQzgwIChNVlApICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhciBmX3RhcmdldF9pZFsyXTsJLyogdGFyZ2V0IGlkIChUSWM4MCBzcGVjaWZpYykJKi8KLX07Ci0KLSNkZWZpbmUJVElDODBfQVJDSF9NQUdJQwkweDBDMQkvKiBHb2VzIGluIHRoZSBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KLSNkZWZpbmUgVElDODBfVEFSR0VUX0lECQkweDk1CS8qIEdvZXMgaW4gdGhlIHRhcmdldCBpZCBmaWVsZCAqLwotCi0jZGVmaW5lIFRJQzgwQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBUSUM4MF9BUkNIX01BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBUSUM4MF9BT1VUSERSX01BR0lDCTB4MTA4CS8qIEdvZXMgaW4gdGhlIG9wdGlvbmFsIGZpbGUgaGVhZGVyIG1hZ2ljIG51bWJlciBmaWVsZCAqLwotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhcgkJc19yZXNlcnZlZFsxXTsJLyogcmVzZXJ2ZWQgKFRJYzgwIHNwZWNpZmljKQkqLwotCWNoYXIJCXNfbWVtcGFnZVsxXTsJLyogbWVtb3J5IHBhZ2UgbnVtYmVyIChUSWM4MCkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NJTklUCSIuY2luaXQiCi0jZGVmaW5lIF9DT05TVAkiLmNvbnN0IgotI2RlZmluZSBfU1dJVENICSIuc3dpdGNoIgotI2RlZmluZSBfU1RBQ0sJIi5zdGFjayIKLSNkZWZpbmUgX1NZU01FTQkiLnN5c21lbSIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCQkvKiBsaW5lIG51bWJlcgkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0vKiBGSVhNRSAtIG5lZWQgdG8gY29ycmVsYXRlIHdpdGggVEljODAgQ29kZSBHZW5lcmF0aW9uIFRvb2xzIFVzZXIncyBHdWlkZSwgQ0c6QS0yNSAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9yZXNlcnZlZFsyXTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KLS8qIFRJYzgwIHJlbG9jYXRpb24gdHlwZXMuICovCi0KLSNkZWZpbmUgUl9BQlMJCTB4MDAJCS8qIEFic29sdXRlIGFkZHJlc3MgLSBubyByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfUkVMTE9OR1gJMHgxMQkJLyogUFA6IDMyIGJpdHMsIGRpcmVjdCAqLwotI2RlZmluZSBSX1BQQkFTRQkweDM0CQkvKiBQUDogR2xvYmFsIGJhc2UgYWRkcmVzcyB0eXBlICovCi0jZGVmaW5lIFJfUFBMQkFTRQkweDM1CQkvKiBQUDogTG9jYWwgYmFzZSBhZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgUl9QUDE1CQkweDM4CQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUDE1VwkJMHgzOQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQMTVICQkweDNBCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFAxNkIJCTB4M0IJCS8qIFBQOiBHbG9iYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUEwxNQkJMHgzQwkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUEwxNVcJMHgzRAkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMMTVICTB4M0UJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTDE2QgkweDNGCQkvKiBQUDogTG9jYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUE4xNQkJMHg0MAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBOMTVXCTB4NDEJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUE4xNUgJMHg0MgkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTjE2QgkweDQzCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBuZWdhdGl2ZSBieXRlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNQkweDQ0CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNVcJMHg0NQkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMTjE1SAkweDQ2CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUExOMTZCCTB4NDcJCS8qIFBQOiBMb2NhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9NUFBDUjE1VwkweDRFCQkvKiBNUDogMTUgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX01QUENSCQkweDRGCQkvKiBNUDogMzIgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3c2NS5oIGIvaW5jbHVkZS9jb2ZmL3c2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc4YzIzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi93NjUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFdEQyA2NTgxNiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJVzY1TUFHSUMJMHg2NTAwCi0KLQotI2RlZmluZSBXNjVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VzY1TUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgdzY1IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmggYi9pbmNsdWRlL2NvZmYvd2UzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzZmEzNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvd2UzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIHdlMzJrICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9CTTMyQgkJKDAwMjAwMDApCi0jZGVmaW5lCUZfQk0zMk1BVQkoMDA0MDAwMCkKLQotI2RlZmluZQlXRTMyS01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIEZCT01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIE1UVk1BR0lDCTB4MTcxCS8qIHdlMzJrIHdpdGggdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIFJCT01BR0lDCTB4MTcyCS8qIHJlc2VydmVkICovCi0jZGVmaW5lIFdFMzJLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gV0UzMktNQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IEZCT01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gUkJPTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBNVFZNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi96OGsuaCBiL2luY2x1ZGUvY29mZi96OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliODQ2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBaaWxvZyBaODAwTiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBUeXBlIG9mIGNwdSBpcyBzdG9yZWQgaW4gZmxhZ3MgKi8KLSNkZWZpbmUgRl9aODAwMSAgICAweDEwMDAKLSNkZWZpbmUgRl9aODAwMiAgICAweDIwMDAKLSNkZWZpbmUgRl9NQUNITUFTSyAweGYwMDAKLQotI2RlZmluZQlaOEtNQUdJQwkweDgwMDAKLQotI2RlZmluZSBaOEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9WjhLTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgejhrIGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHdpdGggc2VnbWVudHMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlbWFuZ2xlLmggYi9pbmNsdWRlL2RlbWFuZ2xlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmU1ZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kZW1hbmdsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogRGVmcyBmb3IgaW50ZXJmYWNlIHRvIGRlbWFuZ2xlcnMuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmICFkZWZpbmVkIChERU1BTkdMRV9IKQotI2RlZmluZSBERU1BTkdMRV9ICi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBPcHRpb25zIHBhc3NlZCB0byBjcGx1c19kZW1hbmdsZSAoaW4gMm5kIHBhcmFtZXRlcikuICovCi0KLSNkZWZpbmUgRE1HTF9OT19PUFRTCTAJCS8qIEZvciByZWFkYWJpbGl0eS4uLiAqLwotI2RlZmluZSBETUdMX1BBUkFNUwkoMSA8PCAwKQkvKiBJbmNsdWRlIGZ1bmN0aW9uIGFyZ3MgKi8KLSNkZWZpbmUgRE1HTF9BTlNJCSgxIDw8IDEpCS8qIEluY2x1ZGUgY29uc3QsIHZvbGF0aWxlLCBldGMgKi8KLSNkZWZpbmUgRE1HTF9KQVZBCSgxIDw8IDIpCS8qIERlbWFuZ2xlIGFzIEphdmEgcmF0aGVyIHRoYW4gQysrLiAqLwotCi0jZGVmaW5lIERNR0xfQVVUTwkoMSA8PCA4KQotI2RlZmluZSBETUdMX0dOVQkoMSA8PCA5KQotI2RlZmluZSBETUdMX0xVQ0lECSgxIDw8IDEwKQotI2RlZmluZSBETUdMX0FSTQkoMSA8PCAxMSkKLSNkZWZpbmUgRE1HTF9IUCAJKDEgPDwgMTIpICAgICAgIC8qIEZvciB0aGUgSFAgYUNDIGNvbXBpbGVyOyBzYW1lIGFzIEFSTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGVtcGxhdGUgYXJndW1lbnRzLCBldGMuICovCi0jZGVmaW5lIERNR0xfRURHCSgxIDw8IDEzKQotCi0vKiBJZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIHVzZSAnY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlJyBhcyB0aGUgZGVmYXVsdC4gKi8KLSNkZWZpbmUgRE1HTF9TVFlMRV9NQVNLIChETUdMX0FVVE98RE1HTF9HTlV8RE1HTF9MVUNJRHxETUdMX0FSTXxETUdMX0hQfERNR0xfRURHKQotCi0vKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBkZW1hbmdsaW5nIHN0eWxlcy4KLQotICAgTHVjaWQgYW5kIEFSTSBzdHlsZXMgYXJlIHN0aWxsIGtlcHQgbG9naWNhbGx5IGRpc3RpbmN0LCBldmVuIHRob3VnaAotICAgdGhleSBub3cgYm90aCBiZWhhdmUgaWRlbnRpY2FsbHkuICBUaGUgcmVzdWx0aW5nIHN0eWxlIGlzIGFjdHVhbCB0aGUKLSAgIHVuaW9uIG9mIGJvdGguICBJLkUuIGVpdGhlciBzdHlsZSByZWNvZ25pemVzIGJvdGggIl9fcHRfXyIgYW5kICJfX3JmX18iCi0gICBmb3Igb3BlcmF0b3IgIi0+IiwgZXZlbiB0aG91Z2ggdGhlIGZpcnN0IGlzIGx1Y2lkIHN0eWxlIGFuZCB0aGUgc2Vjb25kCi0gICBpcyBBUk0gc3R5bGUuIChGSVhNRT8pICovCi0KLWV4dGVybiBlbnVtIGRlbWFuZ2xpbmdfc3R5bGVzCi17Ci0gIHVua25vd25fZGVtYW5nbGluZyA9IDAsCi0gIGF1dG9fZGVtYW5nbGluZyA9IERNR0xfQVVUTywKLSAgZ251X2RlbWFuZ2xpbmcgPSBETUdMX0dOVSwKLSAgbHVjaWRfZGVtYW5nbGluZyA9IERNR0xfTFVDSUQsCi0gIGFybV9kZW1hbmdsaW5nID0gRE1HTF9BUk0sCi0gIGhwX2RlbWFuZ2xpbmcgPSBETUdMX0hQLAotICBlZGdfZGVtYW5nbGluZyA9IERNR0xfRURHCi19IGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZTsKLQotLyogRGVmaW5lIHN0cmluZyBuYW1lcyBmb3IgdGhlIHZhcmlvdXMgZGVtYW5nbGluZyBzdHlsZXMuICovCi0KLSNkZWZpbmUgQVVUT19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXV0byIKLSNkZWZpbmUgR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJnbnUiCi0jZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJsdWNpZCIKLSNkZWZpbmUgQVJNX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhcm0iCi0jZGVmaW5lIEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJocCIKLSNkZWZpbmUgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJlZGciCi0KLS8qIFNvbWUgbWFjcm9zIHRvIHRlc3Qgd2hhdCBkZW1hbmdsaW5nIHN0eWxlIGlzIGFjdGl2ZS4gKi8KLQotI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlCi0jZGVmaW5lIEFVVE9fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FVVE8pCi0jZGVmaW5lIEdOVV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfR05VKQotI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfTFVDSUQpCi0jZGVmaW5lIEFSTV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVJNKQotI2RlZmluZSBIUF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfSFApCi0jZGVmaW5lIEVER19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfRURHKQotCi1leHRlcm4gY2hhciAqCi1jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykpOwotCi1leHRlcm4gaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBjaGFyICpyZXN1bHQsIGludCBvcHRpb25zKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyICoKLWNwbHVzX21hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBpbnQgb3B0aW9ucykpOwotCi0vKiBOb3RlOiBUaGlzIHNldHMgZ2xvYmFsIHN0YXRlLiAgRklYTUUgaWYgeW91IGNhcmUgYWJvdXQgbXVsdGktdGhyZWFkaW5nLiAqLwotCi1leHRlcm4gdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyBQQVJBTVMgKChpbnQgY2gpKTsKLQotI2VuZGlmCS8qIERFTUFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlzLWFzbS5oIGIvaW5jbHVkZS9kaXMtYXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmQ0ZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kaXMtYXNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogSW50ZXJmYWNlIGJldHdlZW4gdGhlIG9wY29kZSBsaWJyYXJ5IGFuZCBpdHMgY2FsbGVycy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQsIDE5OTMuCi0KLSAgIFRoZSBvcGNvZGUgbGlicmFyeSAobGlib3Bjb2Rlcy5hKSBwcm92aWRlcyBpbnN0cnVjdGlvbiBkZWNvZGVycyBmb3IKLSAgIGEgbGFyZ2UgdmFyaWV0eSBvZiBpbnN0cnVjdGlvbiBzZXRzLCBjYWxsYWJsZSB3aXRoIGFuIGlkZW50aWNhbAotICAgaW50ZXJmYWNlLCBmb3IgbWFraW5nIGluc3RydWN0aW9uLXByb2Nlc3NpbmcgcHJvZ3JhbXMgbW9yZSBpbmRlcGVuZGVudAotICAgb2YgdGhlIGluc3RydWN0aW9uIHNldCBiZWluZyBwcm9jZXNzZWQuICAqLwotCi0jaWZuZGVmIERJU19BU01fSAotI2RlZmluZSBESVNfQVNNX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJiZmQuaCIKLQotdHlwZWRlZiBpbnQgKCpmcHJpbnRmX2Z0eXBlKSBQQVJBTVMoKFBUUiwgY29uc3QgY2hhciosIC4uLikpOwotCi1lbnVtIGRpc19pbnNuX3R5cGUgewotICBkaXNfbm9uaW5zbiwJCQkvKiBOb3QgYSB2YWxpZCBpbnN0cnVjdGlvbiAqLwotICBkaXNfbm9uYnJhbmNoLAkJLyogTm90IGEgYnJhbmNoIGluc3RydWN0aW9uICovCi0gIGRpc19icmFuY2gsCQkJLyogVW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgZGlzX2NvbmRicmFuY2gsCQkvKiBDb25kaXRpb25hbCBicmFuY2ggKi8KLSAgZGlzX2pzciwJCQkvKiBKdW1wIHRvIHN1YnJvdXRpbmUgKi8KLSAgZGlzX2NvbmRqc3IsCQkJLyogQ29uZGl0aW9uYWwganVtcCB0byBzdWJyb3V0aW5lICovCi0gIGRpc19kcmVmLAkJCS8qIERhdGEgcmVmZXJlbmNlIGluc3RydWN0aW9uICovCi0gIGRpc19kcmVmMgkJCS8qIFR3byBkYXRhIHJlZmVyZW5jZXMgaW4gaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHBhc3NlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGluZyByb3V0aW5lLCAKLSAgIGFuZCBpcyBwYXNzZWQgYmFjayBvdXQgaW50byBlYWNoIGNhbGxiYWNrLiAgVGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkCi0gICBmb3IgY29udmV5aW5nIGluZm9ybWF0aW9uIGZyb20geW91ciBtYWluIHJvdXRpbmUgaW50byB5b3VyIGNhbGxiYWNrcywKLSAgIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIChzdWNoIGFzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMpLCBvciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbgotICAgYmFjayBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyB0byB0aGVpciBjYWxsZXJzLgotCi0gICBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyBmaXJzdCBwYXNzZWQ7IHRoaXMgY2FuIGJlIGRvbmUKLSAgIGJ5IGhhbmQsIG9yIHVzaW5nIG9uZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gbWFjcm9zIGJlbG93LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyB7Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mdW5jOwotICBQVFIgc3RyZWFtOwotICBQVFIgYXBwbGljYXRpb25fZGF0YTsKLQotICAvKiBUYXJnZXQgZGVzY3JpcHRpb24uICBXZSBjb3VsZCByZXBsYWNlIHRoaXMgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGJmZCwKLSAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBvbmUuICBUaGVyZSBjdXJyZW50bHkgaXNuJ3QgYW55IHN1Y2ggcmVxdWlyZW1lbnQKLSAgICAgc28gdG8gYXZvaWQgaW50cm9kdWNpbmcgb25lIHdlIHJlY29yZCB0aGVzZSBleHBsaWNpdGx5LiAgKi8KLSAgLyogVGhlIGJmZF9mbGF2b3VyLiAgVGhpcyBjYW4gYmUgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIuICAqLwotICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7Ci0gIC8qIFRoZSBiZmRfYXJjaCB2YWx1ZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBUaGUgYmZkX21hY2ggdmFsdWUuICAqLwotICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0gIC8qIEVuZGlhbm5lc3MgKGZvciBiaS1lbmRpYW4gY3B1cykuICBNb25vLWVuZGlhbiBjcHVzIGNhbiBpZ25vcmUgdGhpcy4gICovCi0gIGVudW0gYmZkX2VuZGlhbiBlbmRpYW47Ci0KLSAgLyogQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc3ltYm9scyBlaXRoZXIgYXQgdGhlIGxvY2F0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZAotICAgICBvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZC4gIFRoZSBhcnJheSBpcyBzb3J0ZWQKLSAgICAgc28gdGhhdCB0aGUgZmlyc3Qgc3ltYm9sIGlzIGludGVuZGVkIHRvIGJlIHRoZSBvbmUgdXNlZC4gIFRoZSBvdGhlcnMgYXJlCi0gICAgIHByZXNlbnQgZm9yIGFueSBtaXNjLiBwdXJwb3Nlcy4gIFRoaXMgaXMgbm90IHNldCByZWxpYWJseSwgYnV0IGlmIGl0IGlzCi0gICAgIG5vdCBOVUxMLCBpdCBpcyBjb3JyZWN0LiAgKi8KLSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gIC8qIE51bWJlciBvZiBzeW1ib2xzIGluIGFycmF5LiAgKi8KLSAgaW50IG51bV9zeW1ib2xzOwotCi0gIC8qIEZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlci4KLSAgICAgVGhlIHRvcCAxNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgcHVibGljIHVzZSAoYW5kIGFyZSBkb2N1bWVudGVkIGhlcmUpLgotICAgICBUaGUgYm90dG9tIDE2IGJpdHMgYXJlIGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotI2RlZmluZSBJTlNOX0hBU19SRUxPQwkweDgwMDAwMDAwCi0gIFBUUiBwcml2YXRlX2RhdGE7Ci0KLSAgLyogRnVuY3Rpb24gdXNlZCB0byBnZXQgYnl0ZXMgdG8gZGlzYXNzZW1ibGUuICBNRU1BRERSIGlzIHRoZQotICAgICBhZGRyZXNzIG9mIHRoZSBzdHVmZiB0byBiZSBkaXNhc3NlbWJsZWQsIE1ZQUREUiBpcyB0aGUgYWRkcmVzcyB0bwotICAgICBwdXQgdGhlIGJ5dGVzIGluLCBhbmQgTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuCi0gICAgIFJldHVybnMgYW4gZXJybm8gdmFsdWUgb3IgMCBmb3Igc3VjY2Vzcy4gICovCi0gIGludCAoKnJlYWRfbWVtb3J5X2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBtZW1hZGRyLCBiZmRfYnl0ZSAqbXlhZGRyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAotCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGlmIHdlIGdldCBhbiBlcnJvciB0aGF0IHdlIGNhbid0Ci0gICAgIHJlY292ZXIgZnJvbS4gIFNUQVRVUyBpcyB0aGUgZXJybm8gdmFsdWUgZnJvbSByZWFkX21lbW9yeV9mdW5jIGFuZAotICAgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIHRoYXQgd2Ugd2VyZSB0cnlpbmcgdG8gcmVhZC4gIElORk8gaXMgYQotICAgICBwb2ludGVyIHRvIHRoaXMgc3RydWN0LiAgKi8KLSAgdm9pZCAoKm1lbW9yeV9lcnJvcl9mdW5jKQotICAgIFBBUkFNUyAoKGludCBzdGF0dXMsIGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgQUREUi4gICovCi0gIHZvaWQgKCpwcmludF9hZGRyZXNzX2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXQgdGhlIGdpdmVuIEFERFIuCi0gICAgIElmIHRoZXJlIGlzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLCBvdGhlcndpc2UgaXQgcmV0dXJucyAwLgotICAgICBUaGlzIGlzIHVzZWQgYnkgcG9ydHMgd2hpY2ggc3VwcG9ydCBhbiBvdmVybGF5IG1hbmFnZXIgd2hlcmUKLSAgICAgdGhlIG92ZXJsYXkgbnVtYmVyIGlzIGhlbGQgaW4gdGhlIHRvcCBwYXJ0IG9mIGFuIGFkZHJlc3MuICBJbgotICAgICBzb21lIGNpcmN1bXN0YW5jZXMgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBvdmVybGF5IG51bWJlciBpbiB0aGUKLSAgICAgYWRkcmVzcywgKG5vcm1hbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoYXQgYWRkcmVzcyksIGJ1dCBzb21ldGltZXMgd2Ugd2FudCB0byBtYXNrIG91dCB0aGUgb3ZlcmxheSBiaXRzLiAgKi8KLSAgaW50ICgqIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm8pKTsKLQotICAvKiBUaGVzZSBhcmUgZm9yIGJ1ZmZlcl9yZWFkX21lbW9yeS4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci0gIGJmZF92bWEgYnVmZmVyX3ZtYTsKLSAgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7Ci0KLSAgLyogVGhpcyB2YXJpYWJsZSBtYXkgYmUgc2V0IGJ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgSXQgc3VnZ2VzdHMKLSAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2JqZHVtcCBzaG91bGQgZGlzcGxheSBvbiBhIHNpbmdsZSBsaW5lLiAgSWYKLSAgICAgIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyIHNldHMgdGhpcywgaXQgc2hvdWxkIGFsd2F5cyBzZXQgaXQgdG8KLSAgICAgIHRoZSBzYW1lIHZhbHVlIGluIG9yZGVyIHRvIGdldCByZWFzb25hYmxlIGxvb2tpbmcgb3V0cHV0LiAgKi8KLSAgaW50IGJ5dGVzX3Blcl9saW5lOwotCi0gIC8qIHRoZSBuZXh0IHR3byB2YXJpYWJsZXMgY29udHJvbCB0aGUgd2F5IG9iamR1bXAgZGlzcGxheXMgdGhlIHJhdyBkYXRhICovCi0gIC8qIEZvciBleGFtcGxlLCBpZiBieXRlc19wZXJfbGluZSBpcyA4IGFuZCBieXRlc19wZXJfY2h1bmsgaXMgNCwgdGhlICovCi0gIC8qIG91dHB1dCB3aWxsIGxvb2sgbGlrZSB0aGlzOgotICAgICAwMDogICAwMDAwMDAwMCAwMDAwMDAwMAotICAgICB3aXRoIHRoZSBjaHVua3MgZGlzcGxheWVkIGFjY29yZGluZyB0byAiZGlzcGxheV9lbmRpYW4iLiAqLwotICBpbnQgYnl0ZXNfcGVyX2NodW5rOwotICBlbnVtIGJmZF9lbmRpYW4gZGlzcGxheV9lbmRpYW47Ci0KLSAgLyogTnVtYmVyIG9mIG9jdGV0cyBwZXIgaW5jcmVtZW50ZWQgdGFyZ2V0IGFkZHJlc3MgCi0gICAgIE5vcm1hbGx5IG9uZSwgYnV0IHNvbWUgRFNQcyBoYXZlIGJ5dGUgc2l6ZXMgb2YgMTYgb3IgMzIgYml0cwotICAgKi8KLSAgdW5zaWduZWQgaW50IG9jdGV0c19wZXJfYnl0ZTsKLQotICAvKiBSZXN1bHRzIGZyb20gaW5zdHJ1Y3Rpb24gZGVjb2RlcnMuICBOb3QgYWxsIGRlY29kZXJzIHlldCBzdXBwb3J0Ci0gICAgIHRoaXMgaW5mb3JtYXRpb24uICBUaGlzIGluZm8gaXMgc2V0IGVhY2ggdGltZSBhbiBpbnN0cnVjdGlvbiBpcwotICAgICBkZWNvZGVkLCBhbmQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGxhc3Qgc3VjaCBpbnN0cnVjdGlvbi4KLQotICAgICBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY29kZXIgc3VwcG9ydHMgdGhpcyBpbmZvcm1hdGlvbiwgc2V0Ci0gICAgIGluc25faW5mb192YWxpZCB0byAwLCBkZWNvZGUgYW4gaW5zdHJ1Y3Rpb24sIHRoZW4gY2hlY2sgaXQuICAqLwotCi0gIGNoYXIgaW5zbl9pbmZvX3ZhbGlkOwkJLyogQnJhbmNoIGluZm8gaGFzIGJlZW4gc2V0LiAqLwotICBjaGFyIGJyYW5jaF9kZWxheV9pbnNuczsJLyogSG93IG1hbnkgc2VxdWVudGlhbCBpbnNuJ3Mgd2lsbCBydW4gYmVmb3JlCi0JCQkJICAgYSBicmFuY2ggdGFrZXMgZWZmZWN0LiAgKDAgPSBub3JtYWwpICovCi0gIGNoYXIgZGF0YV9zaXplOwkJLyogU2l6ZSBvZiBkYXRhIHJlZmVyZW5jZSBpbiBpbnNuLCBpbiBieXRlcyAqLwotICBlbnVtIGRpc19pbnNuX3R5cGUgaW5zbl90eXBlOwkvKiBUeXBlIG9mIGluc3RydWN0aW9uICovCi0gIGJmZF92bWEgdGFyZ2V0OwkJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgYnJhbmNoIG9yIGRyZWYsIGlmIGtub3duOwotCQkJCSAgIHplcm8gaWYgdW5rbm93bi4gICovCi0gIGJmZF92bWEgdGFyZ2V0MjsJCS8qIFNlY29uZCB0YXJnZXQgYWRkcmVzcyBmb3IgZHJlZjIgKi8KLQotICAvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IGRpc2Fzc2VtYmxlci4gICovCi0gIGNoYXIgKiBkaXNhc3NlbWJsZXJfb3B0aW9uczsKLQotfSBkaXNhc3NlbWJsZV9pbmZvOwotCi0MCi0vKiBTdGFuZGFyZCBkaXNhc3NlbWJsZXJzLiAgRGlzYXNzZW1ibGUgb25lIGluc3RydWN0aW9uIGF0IHRoZSBnaXZlbgotICAgdGFyZ2V0IGFkZHJlc3MuICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4gICovCi10eXBlZGVmIGludCAoKmRpc2Fzc2VtYmxlcl9mdHlwZSkKLSAgICAgUEFSQU1TKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19taXBzCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9taXBzCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9hdHQJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9pbnRlbAlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2lhNjQJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM3MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tNjhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAxCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDg1MDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYWxwaGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGFyY19nZXRfZGlzYXNzZW1ibGVyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2FybQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYXJtCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc3BhcmMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2EyOWsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2EyOWsJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pOTYwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NobAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9ocHBhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2ZyMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTMycgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tODhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21jb3JlCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAyMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbW4xMDMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9uczMyawkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fcnM2MDAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3c2NQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9kMTB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2QzMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdjg1MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl90aWMzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl92YXgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdGljNTR4CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3RpYzgwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3BqCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2F2cgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgcGFyc2VfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb24gIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIGludCAgZ2V0X2FybV9yZWduYW1lX251bV9vcHRpb25zICAgIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgIHNldF9hcm1fcmVnbmFtZV9vcHRpb24gICAgICAgICBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgIGdldF9hcm1fcmVnbmFtZXMgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKioqKSk7Ci0KLS8qIEZldGNoIHRoZSBkaXNhc3NlbWJsZXIgZm9yIGEgZ2l2ZW4gQkZELCBpZiB0aGF0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KLWV4dGVybiBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVyCVBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIERvY3VtZW50IGFueSB0YXJnZXQgc3BlY2lmaWMgb3B0aW9ucyBhdmFpbGFibGUgZnJvbSB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLWV4dGVybiB2b2lkIGRpc2Fzc2VtYmxlcl91c2FnZSAgICAgICAgICBQQVJBTVMgKChGSUxFICopKTsKLQotDAotLyogVGhpcyBibG9jayBvZiBkZWZpbml0aW9ucyBpcyBmb3IgcGFydGljdWxhciBjYWxsZXJzIHdobyByZWFkIGluc3RydWN0aW9ucwotICAgaW50byBhIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rlci4gICovCi0KLS8qIEhlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCBjYWxsZXJzIG1heSB3aXNoIHRvIHVzZSBmb3IgcmVhZF9tZW1vcnlfZnVuYy4KLSAgIEl0IGdldHMgYnl0ZXMgZnJvbSBhIGJ1ZmZlci4gICovCi1leHRlcm4gaW50IGJ1ZmZlcl9yZWFkX21lbW9yeQotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBnb2VzIHdpdGggYnVmZmVyX3JlYWRfbWVtb3J5LgotICAgSXQgcHJpbnRzIGEgbWVzc2FnZSB1c2luZyBpbmZvLT5mcHJpbnRmX2Z1bmMgYW5kIGluZm8tPnN0cmVhbS4gICovCi1leHRlcm4gdm9pZCBwZXJyb3JfbWVtb3J5IFBBUkFNUyAoKGludCwgYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0KLS8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KLSAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKLSAgIGFkZHJlc3NlcykuICAqLwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19wcmludF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogQWx3YXlzIHRydWUuICAqLwotZXh0ZXJuIGludCBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCi0gICBieSBhbGwgYXBwbGljYXRpb25zIGNyZWF0aW5nIHN1Y2ggYSBzdHJ1Y3QuICAqLwotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk8oSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZsYXZvdXIgPSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwgXAotICAoSU5GTykuYXJjaCA9IGJmZF9hcmNoX3Vua25vd24sIFwKLSAgKElORk8pLm1hY2ggPSAwLCBcCi0gIChJTkZPKS5lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgKElORk8pLm9jdGV0c19wZXJfYnl0ZSA9IDEsIFwKLSAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpCi0KLS8qIENhbGwgdGhpcyBtYWNybyB0byBpbml0aWFsaXplIG9ubHkgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgdGhlCi0gICBkaXNhc3NlbWJsZXIuICBBcmNoaXRlY3R1cmUgZGVwZW5kZW50IHRoaW5ncyBzdWNoIGFzIGJ5dGUgb3JkZXIsIG9yIG1hY2hpbmUKLSAgIHZhcmlhbnQgYXJlIG5vdCB0b3VjaGVkIGJ5IHRoaXMgbWFjcm8uICBUaGlzIG1ha2VzIHRoaW5ncyBtdWNoIGVhc2llciBmb3IKLSAgIEdEQiB3aGljaCBtdXN0IGluaXRpYWxpemUgdGhlc2UgdGhpbmdzIHNlcGVyYXRseS4gICovCi0KLSNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKShGUFJJTlRGX0ZVTkMpLCBcCi0gIChJTkZPKS5zdHJlYW0gPSAoUFRSKShTVFJFQU0pLCBcCi0gIChJTkZPKS5zeW1ib2xzID0gTlVMTCwgXAotICAoSU5GTykubnVtX3N5bWJvbHMgPSAwLCBcCi0gIChJTkZPKS5idWZmZXIgPSBOVUxMLCBcCi0gIChJTkZPKS5idWZmZXJfdm1hID0gMCwgXAotICAoSU5GTykuYnVmZmVyX2xlbmd0aCA9IDAsIFwKLSAgKElORk8pLnJlYWRfbWVtb3J5X2Z1bmMgPSBidWZmZXJfcmVhZF9tZW1vcnksIFwKLSAgKElORk8pLm1lbW9yeV9lcnJvcl9mdW5jID0gcGVycm9yX21lbW9yeSwgXAotICAoSU5GTykucHJpbnRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19wcmludF9hZGRyZXNzLCBcCi0gIChJTkZPKS5zeW1ib2xfYXRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcywgXAotICAoSU5GTykuZmxhZ3MgPSAwLCBcCi0gIChJTkZPKS5ieXRlc19wZXJfbGluZSA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9jaHVuayA9IDAsIFwKLSAgKElORk8pLmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOLCBcCi0gIChJTkZPKS5pbnNuX2luZm9fdmFsaWQgPSAwCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfTsKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChESVNfQVNNX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmFlMzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNiArMCwwIEBACi0yMDAwLTA2LTAzICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiByZWxvYy1tYWNyb3MuaCAoU1RBUlRfUkVMT0NfTlVNQkVSUyk6IEZpeCBuYW1lIGNsYXNoIGZvcgotCSFfX1NURENfXyBjYXNlLgotCShSRUxPQ19OVU1CRVIpOiBVc2UgYW5zaSBzdHJpbmdpZnkgaWYgQUxNT1NUX1NUREMgZGVmaW5lZC4KLQotMjAwMC0wNS0yMiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaWE2NC5oIChSX0lBNjRfUENSRUw2MEIsIFJfSUE2NF9QQ1JFTDIxQkkpOiBOZXcuCi0JKFJfSUE2NF9QQ1JFTDIyLCBSX0lBNjRfUENSRUw2NEkpOiBOZXcuCi0KLTIwMDAtMDUtMDIgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29tbW9uLmggKEVMRk9TQUJJX05PTkUpOiBSZW5hbWVkIGZyb20gRUxGT1NBQklfU1lTVi4KLQkoRUxGT1NBQklfTU9ERVNUTyk6IERlZmluZWQuCi0JKEVMRk9TQUJJX09QRU5CU0QpOiBMaWtld2lzZS4KLQotRnJpIEFwciAyMSAxMzoyMDo1MyAyMDAwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCQkJICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogaWE2NC5oOiBOZXcgZmlsZS4KLQotMjAwMC0wNC0xNCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb21tb24uaCAoRUxGT1NBQklfVFJVRTY0KTogUmVuYW1lZCB0byBFTEZPU0FCSV9UUlU2NC4KLQotMjAwMC0wNC0xNCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb21tb24uaCAoRUxGT1NBQklfTkVUQlNEKTogRGVmaW5lZC4KLQkoRUxGT1NBQklfSFVSRCk6IExpa2V3aXNlLgotCShFTEZPU0FCSV9TT0xBUklTKTogTGlrZXdpc2UuCi0JKEVMRk9TQUJJX01PTlRFUkVZKTogTGlrZXdpc2UuCi0JKEVMRk9TQUJJX0lSSVgpOiBMaWtld2lzZS4KLQkoRUxGT1NBQklfRlJFRUJTRCk6IExpa2V3aXNlLgotCShFTEZPU0FCSV9UUlVFNjQpOiBMaWtld2lzZS4KLQotMjAwMC0wNC0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLW9hYmkuaDogRGVsZXRlLgotCSogYXJtLmg6IE1lcmdlIGluIGRlZmluaXRpb25zIG9mIG9sZCByZWxvYyBudW1iZXJzIGZyb20KLQlhcm0tb2FiaS5oLgotCi0yMDAwLTA0LTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoRUZfQVJNX1NZTVNBUkVTT1JURUQpOiBEZWZpbmUuCi0JKEVGX0FSTV9FQUJJTUFTSyk6IERlZmluZS4KLQkoRUZfQVJNX0VBQklfVkVSU0lPTik6IERlZmluZS4KLQkoRUZfQVJNX0VBQklfVU5LTk9XTik6IERlZmluZS4KLQkoRUZfQVJNX0VBQklfVkVSMSk6IERlZmluZS4KLQkoUEZfQVJNX1BJKTogRGVmaW5lLgotCShQRl9BUk1fQUJTKTogRGVmaW5lLgotCQotV2VkIEFwciAgNSAyMjowODo1OSAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLmggKFJfU0hfTE9PUF9TVEFSVCwgUl9TSF9MT09QX0VORCk6IE5ldyBSRUxPQ19OVU1CRVJzLgotCi0yMDAwLTAzLTI3ICBEZW5pcyBDaGVydHlrb3YgIDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi0JKiBhdnIuaDogTmV3IGZpbGUuICBBVlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLQkqIGNvbW1vbi5oOiBBZGQgQVZSIG1hZ2ljIG51bWJlci4KLQotMjAwMC0wMy0xMCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfR05VX1JFTF9ISTE2LCBSX01JUFNfR05VX1JFTF9MTzE2LAotIAlSX01JUFNfR05VX1JFTDE2X1MyLCBSX01JUFNfUEM2NCBhbmQgUl9NSVBTX1BDMzIgcmVsb2NhdGlvbgotIAludW1iZXJzLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGkzNzAuaDogTmV3IGZpbGUuCi0KLTIwMDAtMDItMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTEZfU1RfT1RIRVIpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQkoRUxGMzJfU1RfT1RIRVIpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQkoRUxGNjRfU1RfT1RIRVIpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQotMjAwMC0wMi0yMiAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb21tb24uaCAoRUxGT1NBQklfTElOVVgpOiBEZWZpbmUuCi0KLVRodSBGZWIgMTcgMDA6MTg6MzMgMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBzaC5oOiAoRUZfU0hfTUFDSF9NQVNLLCBFRl9TSF9VTktOT1dOLCBFRl9TSDEsIEVGX1NIMik6IE5ldyBtYWNyb3MuCi0JKEVGX1NIMywgRUZfU0hfSEFTX0RTUCwgRUZfU0hfRFNQLCBFRl9TSDNfRFNQKTogTGlrZXdpc2UuCi0JKEVGX1NIX0hBU19GUCwgRUZfU0gzRSwgRUZfU0g0LCBFRl9TSF9NRVJHRV9NQUNIKTogTGlrZXdpc2UuCi0KLTIwMDAtMDItMDMgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogYXJtLW9hYmkuaDogRHVwbGljYXRlIGNoYW5nZXMgbWFkZSB0byBhcm0uaCBvbiBKYW4uIDI3LAotCTIwMDAgYnkgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd2luZHJpdmVyLmNvbT4uCi0KLTIwMDAtMDEtMjcgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLSAgICAgICAgKiBhcm0uaCAoU1RUX0FSTV9URlVOQyk6IERlZmluZSBpbiB0ZXJtcyBvZiBTVFRfTE9QUk9DLgotCShTVFRfQVJNXzE2QklUKTogTmV3IGZsYWcuICBEZW5vdGVzIGEgbGFiZWwgdGhhdCB3YXMgZGVmaW5lZCBpbgotCVRodW1iIGJsb2NrIGJ1dCB3YXMgZG9lcyBub3QgaWRlbnRpZnkgYSBmdW5jdGlvbi4KLQotMjAwMC0wMS0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX01DT1JFKTogRml4IHNwZWxsaW5nIG9mIE1vdG9yb2xhLgotCSogbWNvcmUuaCAoRU1fTUNPUkUpOiBGaXggc3BlbGxpbmcgb2YgTW90b3JvbGEuCi0KLTIwMDAtMDEtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9TMzcwKTogQ2hhbmdlIGNvbW1lbnQgLSB0aGlzIGlzIG5vdyB0aGUgSUJNCi0JU3lzdGVtLzM3MC4KLQkoRU1fSUFfNjQpOiBDaGFuZ2UgY29tbWVudCAtIHRoaXMgaXMgbm93IHRoZSBJQS02NC4KLQotMjAwMC0wMS0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKERUX0VOQ09ESU5HKTogRml4IGRlZmluaXRpb24gb2YgdGhpcyB2YWx1ZS4KLQkoRFRfTE9PUyk6IEZpeCBkZWZpbml0aW9uIG9mIHRoaXMgdmFsdWUuCi0JKERUX0hJT1MpOiBGaXggZGVmaW5pdGlvbiBvZiB0aGlzIHZhbHVlLgotCShPTERfRFRfTE9PUyk6IFZhbHVlIG9mIERUX0xPT1MgYmVmb3JlIE9jdCA0LCAxOTk5IGRyYWZ0Ci0Jb2YgRUxGIHNwZWMgY2hhbmdlZCBpdC4KLQkoT0xEX0RUX0hJT1MpOiBWYWx1ZSBvZiBEVF9ISU9TIGJlZm9yZSBPY3QgNCwgMTk5OSBkcmFmdAotCW9mIEVMRiBzcGVjIGNoYW5nZWQgaXQuCi0KLTIwMDAtMDEtMTAgIEVnb3IgRHVkYSAgPGRlb0Bsb2dvcy1tLnJ1PgotCi0JKiBjb21tb24uaCAoTlRfV0lOMzJQU1RBVFVTKTogRGVmaW5lLiAgKGN5Z3dpbiBlbGYgY29yZSBkdW1wcykuIAotCi0xOTk5LTEyLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNUT18qKTogUmVkZWZpbmUgaW4gdGVybXMgb2YgU1RWXyogdmFsdWVzIG5vdyBpbgotCWNvbW1vbi5oLiAKLQotMTk5OS0xMi0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IFVwZ3JhZGUgdG8gbWF0Y2ggT2N0NCwgMTk5OSBEcmFmdCBFTEYgQUJJIFNwZWMuCi0JKEVNX01JUFNfUlMzX0xFKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9SQ0UpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX01NQSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fUENQKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9OQ1BVKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9ORFIxKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9TVEFSQ09SRSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fTUUxNik6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fU1QxMDApOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX1RJTllKKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9GWDY2KTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9TVDlQTFVTKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9TVDcpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNXzY4SEMxNik6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fNjhIQzExKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV82OEhDMDgpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNXzY4SEMwNSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fU1ZYKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9WQVgpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKFBGX01BU0tPUyk6IENoYW5nZSB2YWx1ZS4KLQkoU0hUX0lOSVRfQVJSQVkpOiBOZXcgdmFsdWUgZm9yIHNoX3R5cGUgZmllbGQuCi0JKFNIVF9GSU5JX0FSUkFZKTogTmV3IHZhbHVlIGZvciBzaF90eXBlIGZpZWxkLgotCShTSFRfUFJFSU5JVF9BUlJBWSk6IE5ldyB2YWx1ZSBmb3Igc2hfdHlwZSBmaWVsZC4KLQkoU0hUX0hJVVNFUik6IENoYW5nZSB2YWx1ZS4KLQkoU0hGX01FUkdFKTogTmV3IHZhbHllIGZvciBzaF9mbGFncyBmaWVsZC4KLQkoU0hGX1NUUklOR1MpOiBOZXcgdmFseWUgZm9yIHNoX2ZsYWdzIGZpZWxkLgotCShTSEZfSU5GT19MSU5LKTogTmV3IHZhbHllIGZvciBzaF9mbGFncyBmaWVsZC4KLQkoU0hGX09TX05PTkNPTkZPUk1JTkcpOiBOZXcgdmFseWUgZm9yIHNoX2ZsYWdzIGZpZWxkLgotCShTSEZfTUFTS09TKTogQ2hhbmdlIHZhbHVlLgotCShFTEZfU1RfVklTSUJJTElUWSk6IE5ldyBtYWNyby4KLQkoRUxGX1NUX09USEVSKTogTmV3IG1hY3JvLgotCShTVFRfQ09NTU9OKTogTmV3IHN5bWJvbCB0eXBlLgotCShTVFZfREVGQVVMVCk6IFZhbHVlIGZvciBzeW1ib2wgdmlzaWJpbGl0eS4KLQkoU1RWX0lOVEVSTkFMKTogVmFsdWUgZm9yIHN5bWJvbCB2aXNpYmlsaXR5LgotCShTVFZfSElEREVOKTogVmFsdWUgZm9yIHN5bWJvbCB2aXNpYmlsaXR5LgotCShTVFZfUFJPVEVDVEVEKTogVmFsdWUgZm9yIHN5bWJvbCB2aXNpYmlsaXR5LgotCShEVF9SVU5QQVRIKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcuCi0JKERUX0ZMQUdTKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcuCi0JKERUX0VOQ09ESU5HKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcuCi0JKERUX1BSRUlOSVRfQVJSQVkpOiBOZXcgZHluYW1pYyBzZWN0aW9uIHRhZy4KLQkoRFRfUFJFSU5JVF9BUlJBWVNaKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcuCi0JKERUX0xPUFJPQyk6IE5ldyBkeW5hbWljIHNlY3Rpb24gdGFnIGluZGV4LgotCShEVF9ISVBST0MpOiBOZXcgZHluYW1pYyBzZWN0aW9uIHRhZyBpbmRleC4KLQkoREZfT1JJR0lOKTogVmFsdWUgZm9yIGR5bmFtaWMgc2VjdGlvbiBmbGFnLgotCShERl9TWU1CT0xJQyk6IFZhbHVlIGZvciBkeW5hbWljIHNlY3Rpb24gZmxhZy4KLQkoREZfVEVYVFJFTCk6IFZhbHVlIGZvciBkeW5hbWljIHNlY3Rpb24gZmxhZy4KLQkoREZfQklORF9OT1cpOiBWYWx1ZSBmb3IgZHluYW1pYyBzZWN0aW9uIGZsYWcuCi0KLTE5OTktMTItMDkgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JKiBpMzg2LmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JKiBocHBhLmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JCi0xOTk5LTEyLTA3ICBKaW0gQmxhbmR5ICA8amltYkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFJYRlBSRUcpOiBOZXcgZGVmaW5pdGlvbi4KLQotV2VkIERlYyAgMSAwMzowMjoxNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoRV9NTjEwMzAwX01BQ0hfQU0zMyk6IERlZmluZS4KLQotTW9uIE9jdCAxMSAyMjo0MjozNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoUEZfSFBfUEFHRV9TSVpFKTogRGVmaW5lLgotCShQRl9IUF9GQVJfU0hBUkVELCBQRl9IUF9ORUFSX1NIQVJFRCwgUEZfSFBfQ09ERSk6IExpa2V3aXNlLgotCShQRl9IUF9NT0RJRlksIFBGX0hQX0xBWllTV0FQLCBQRl9IUF9TQlApOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgNCAxNzo0MjozOCAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVfTTMyUlhfQVJDSCk6IERlZmluZS4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaDogQWRkIERUX0hQX0dTVF9TSVpFLCBEVF9IUF9HU1RfVkVSU0lPTiwgYW5kIERUX0hQX0dTVF9IQVNIVkFMLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX1BKKTogRGVmaW5lLgotCi0xOTk5LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBzeW1ib2wgdHlwZSBkZWZpbml0aW9ucy4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBkeW5hbWljIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZQotCXNwZWNpZmljIGRlZmluaXRpb25zLgotCi0xOTk5LTA4LTMxICBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBjb21tb24uaCAoTlRfVEFTS1NUUlVDVCk6IERlZmluZS4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19TVU5fVVMzKTogRGVmaW5lIGluIENoZWV0YWggZXh0ZW5zaW9ucwotCWZsYWcgKGFzIHBlciBTQ0QyLjQuMSkuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoRUxGNjRfUl9UWVBFX0RBVEEpOiBPbmx5IHVzZSBFTEY2NF9SX1RZUEUgYml0cywgbm90Ci0JRUxGNjRfUl9TWU0gYml0cy4KLQotMTk5OS0wNi0yMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGFybS5oIChFRl9TT0ZUX0ZMT0FULCBGX1NPRlRfRkxPQVQpOiBEZWZpbmUuCi0KLTE5OTktMDctMTMgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIG02OGsuaCAoRUZfQ1BVMzIpOiBNb3ZlIGRlZmluaXRpb24gaW5zaWRlIG11bHRpcGxlIGluY2x1c2lvbgotCWd1YXJkLgotCi0xOTk5LTA3LTA4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFTEY2NF9SX1RZUEVfREFUQSk6IFNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4KLQkoRUxGNjRfUl9UWVBFX0lORk8pOiBNYXNrIG91dCBhbGwgYnV0IGxvdyAyNCBiaXRzIG9mIGRhdGEuCi0JKERUX1NQQVJDX1BMVEZNVCk6IERlbGV0ZS4KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSmFrdWIgSmVsaW5lay4KLQotTW9uIEp1biAyMSAxNjozNjowMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoZWxmX2hwcGFfcmVsb2NfdHlwZSk6IFJlbmFtZWQgZnJvbSBlbGYzMl9ocHBhX3JlbG9jX3R5cGUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19tYXhfc3RkKTogRGVmaW5lLgotCi1XZWQgSnVuICA5IDE1OjE2OjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBVcGRhdGUgd2l0aCB2YXJpb3VzIGNoYW5nZXMgZnJvbSBuZXdlc3QgUEEgRUxGCi0Jc3BlY2lmaWNhdGlvbnMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDNjQpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDIgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgTEFOR19KQVZBLgotCSogZHdhcmYyLmg6IEFkZCBEV19MQU5HX0phdmEuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTEZPU0FCSV9BUk0pOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBVcGRhdGUgY29tbWVudC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGk5NjAuaDogTmV3IGZpbGUuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfQ09QWSk6IERlZmluZS4KLQkoUl9NQ09SRV9HTE9CX0RBVCk6IERlZmluZS4KLQkoUl9NQ09SRV9KVU1QX1NMT1QpOiBEZWZpbmUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfUkVMQVRJVkUpOiBEZWZpbmUuCi0KLTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaCAoU1RBUlRfUkVMT0NfTlVNQkVSUyk6IFByZXBlbmQgYW4gdW5kZXJzY29yZSB0bwotCWZha2UgcmVsb2MgZW50cnkgbmFtZSAoaWYgcG9zc2libGUpLCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMKLQl3aXRoIHR5cGVkZWZzIG9mIHRoZSBzYW1lIG5hbWUuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfMzJCSVRNT0RFKTogTmV3LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oOiBOZXcgaGVhZGVyIGZpbGUuICBEZWZpbmVzIGZvciBNb3Rvcm9sYSdzIE1Db3JlCi0JcHJvY2Vzc29yLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBjb25zdGFudHMgZGVmaW5lZCBpbjogIlN5c3RlbSBWIEFwcGxpY2F0aW9uCi0JQmluYXJ5IEludGVyZmFjZSAtIERSQUZUIC0gQXByaWwgMjksIDE5OTgiIGZvdW5kIGF0IHRoZSB3ZWIgc2l0ZToKLQlodHRwOi8vd3d3LnNjby5jb20vZGV2ZWxvcGVyL2dhYmkvY29udGVudHMuaHRtbAotCi0JKEVNX01NQSk6IFJlbW92ZWQuICBSZXBsYWNlZCB3aXRoIEVNX01DT1JFIGFzIE1vdG9yb2xsYSBvd24gdGhpcwotCXZhbHVlLgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogRml4ZWQgdG8gbm90IGdlbmVyYXRlIGFuIGVudW0gd2l0aCBhIHRyYWlsaW5nCi0JY29tbWEuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzUwMDApOiBOZXcuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIGRlZmluaXRpb25zIGZvciBhIGZldyBtb3JlIFNvbGFyaXMgRUxGIGV4dGVuc2lvbnMuCi0KLVRodSBGZWIgMTggMTg6NTg6MjYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHRlcm5hbC5oOiBPbmx5IHVzZSBhdHRyaWJ1dGUgaWYgX19HTlVDX18gaXMgZGVmaW5lZC4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIHN1Ym1pdHRlZCBieTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGVsZi9leHRlcm5hbC5oOiBzdHJ1Y3QgRWxmX0V4dGVybmFsX1ZlcnN5bSBtdXN0IGJlIHBhY2tlZCBvbgotCUFSTS4gIENvZGUgdXNlcyBzaXplb2YoRWxmX0V4dGVybmFsX1ZlcnN5bSkgYW5kIGFzc3VtZXMgaXQgaXMKLQllcXVhbCB0byBzaXplb2YoY2hhclsyXSkuICBSZXBvcnRlZCBieSBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaCAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICAxIDExOjMzOjU2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBSZW51bWJlciByZWxvY3MgdG8gY29uZm9ybSB0byBzdGFuZGFyZC4KLSAgICAgICAgKEVGX05FV19BQkkpOiAgRGVmaW5lLgotICAgICAgICAoRUZfT0xEX0FCSSk6ICBEZWZpbmUuCi0gICAgICAgICogYXJtLW9hYmkuaDogIE5ldyBmaWxlLgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBmcjMwLmg6IEFkZCBSX0ZSMzBfR05VX1ZUe0lOSEVSSVQsRU5UUll9IHJlbG9jcy4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IEFkZCB0eXBlZGVmcyBmb3Igc3RydWN0dXJlcyBmb3VuZCBpbiBkd2FyZjIgc2VjdGlvbnMuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzQxMTEpOiBOZXcuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJLEVfTUlQU19BQklfTzMyLEVfTUlQU19BQklfTzY0LAotCUVfTUlQU19BQklfRUFCSTMyLEVfTUlQU19BQklfRUFCSTY0KToKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwXzQ4IHJlbG9jLgotCi0xOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgZXh0ZXJuYWwgZGF0YSB0eXBlIGZvciBjb25mbGljdCBzZWN0aW9uLgotCi0JKiBtaXBzLmg6IEFkZCBtb3JlIExMXyogb3B0aW9ucyBmcm9tIElyaXggNi41LgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfSkFMUiBhbmQgYWRqdXN0IFJfTUlQU19tYXggYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxMCAxNToxMjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBSZWR1Y2UgdG8gYSAxNiBiaXQgdmFsdWUuCi0KLVR1ZSBOb3YgMTAgMTU6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkMTB2Lmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotV2VkIE5vdiAgNCAxNTo1Njo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBOZXcgbWFjaGluZSBudW1iZXIuCi0KLQkqIGZyMzAuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIGZvciB0aGUgRlIzMC4KLQotRnJpIE9jdCAzMCAxMTo1NDoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICBGcm9tIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OgotICAgICAgICAqIGFybS5oIChSX0FSTV9DT1BZLCBldCBhbC4pOiBOZXcgcmVsb2NzLCB1c2VkIGJ5IExpbnV4IGZvciBQSUMuCi0gICAgICAgIChFRl9BTElHTjgpOiBOZXcgZmxhZy4KLQotVHVlIE9jdCAyMCAxMToxOTo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChOVF9MV1BTVEFUVVMpOiBDbG9zZSBjb21tZW50IGFjY2lkZW50YWxseSBsZWZ0IG9wZW4uCi0KLU1vbiBPY3QgMTkgMjA6MjQ6MTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzaC5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgMTkgMDE6NDQ6NDIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFNUQVRVUywgTlRfRlBSRUdTLCBOVF9QU0lORk8sCi0gCU5UX0xXUFNUQVRVUyxOVF9MV1BTSU5GTyk6IGFkZGVkLgotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX05vdGUpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0KLUZyaSBPY3QgMTYgMTQ6MTE6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtMzJyLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotVHVlIE9jdCAgNiAwOToyMjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNwYXJjLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotTW9uIE9jdCAgNSAwOTozOToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHY4NTAuaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1TdW4gT2N0ICA0IDIxOjE3OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChSXzM4Nl9tYXgpOiBDaGFuZ2UgZnJvbSAyNTIgdG8gMjQuCi0KLU1vbiBTZXAgMjEgMTI6MjQ6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBpMzg2Lmg6ICBDaGFuZ2UgdnRhYmxlIHJlbG9jIG51bWJlcnMuCi0KLVN1biBTZXAgMjAgMDA6NTQ6MjIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogQWRkIHZ0YWJsZSByZWxvY3MgYW5kIFJfNjhLX21heC4KLQotVHVlIFNlcCAxNSAwOTo1Njo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBBdWcgMzEgMTE6MjU6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogIERlZmluZSBTVFRfQVJNX1RGVU5DLiAgUmVtb3ZlIFNUX1RIVU1CX3h4eHgKLSAgICAgICAgZGVmaW5pdGlvbnMuCi0KLVNhdCBBdWcgMjkgMjI6MjU6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQotMTk5OC0wOC0yNSAxNjo0MiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBBZGQgU1lNSU5GT18qIG1hY3JvcyB0byBhY2Nlc3MgRWxmKl9TeW1pbmZvIGluZm9ybWF0aW9uLgotCi0JKiBleHRlcm5hbC5oOiBBZGQgRWxmX0V4dGVybmFsX1N5bWluZm8gZGVmaW5pdGlvbi4KLQotCSogaW50ZXJuYWwuaDogQWRkIEVsZl9JbnRlcm5hbF9TeW1pbmZvLCBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvLAotCWFuZCBFbGY2NF9TeW1pbmZvIGRlZmluaXRpb25zLgotCi1TdW4gQXVnICA5IDIwOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogYXJtLmg6ICBBZGQgU1RfVEhVTUIgZGVmaW5pdGlvbnMuCi0KLVdlZCBBdWcgIDUgMTU6NTI6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmg6IEFkZCBFTEYgaGVhZGVyIGZsYWdzIHRvIHNwZWNpZnkgY29tcGlsZSB0aW1lIG9wdGluczoKLQlFRl9JTlRFUldPUks6IE5ldyBmbGFnLgotCUVGX0FQQ1NfMjY6IE5ldyBmbGFnLgotCUVGX0FQQ1NfRkxPQVQ6IE5ldyBmbGFnLgotCUVGX1BJQzogTmV3IGZsYWcuCi0KLTE5OTgtMDctMzEgMjE6MjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXNzaW5nIFJIRl8qIGNvbnN0YW50cy4KLQotRnJpIEp1bCAzMSAxMDowMTo0MCAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IEFkZCBSX0FSTV9USE1fUEM5IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBEVF8qIGVudHJpZXMgYW5kIHRoZXJlIGZsYWcgbWFjcm9zIGZyb20gU29sYXJpcy4KLQotVHVlIEp1bCAyOCAxODoxNDowNyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiAoUl9TUEFSQ19SRVYzMik6IEFkZGVkIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEgZS5nLiBzcGFyYyA4NnguCi0KLUZyaSBKdWwgMjQgMTE6MjI6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfMjQgcmVsb2NhdGlvbi4KLQotMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE1JUFM2NCByZWxvY2F0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuCi0KLVdlZCBKdWwgMjIgMTk6Mjk6MDAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogUmVuYW1lIHJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IERlZmluZSBlbnVtIGFzIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyMjoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogTmV3IGZpbGUuICBQcm92aWRlcyByZWxvY2F0aW9uIG1hY3JvczoKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIEZBS0VfUkVMT0MsIEVNUFRZX1JFTE9DIGFuZAotCUVORF9SRUxPQ19OVU1CRVJTIHVzZWQgYnkgb3RoZXIgZWxmIGhlYWRlciBmaWxlcy4KLQotCSogYWxwaGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFybS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMTB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGQzMHYuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaHBwYS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBpMzg2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG0zMnIuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbTY4ay5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtaXBzLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAyMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbW4xMDMwMC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBwcGMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc2guaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc3BhcmMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogdjg1MC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0KLTE5OTgtMDctMjIgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLmg6IFJld3JpdGUgcmVsb2NhdGlvbiBkZWZpbml0aW9uIHVzaW5nIG1hY3Jvcy4KLQkqIG1pcHMuaDogTGlrZXdpc2UuCi0JKiBwcGMuaDogTGlrZXdpc2UuCi0JKiBhbHBoYS5oOiBMaWtld2lzZS4KLQkqIGFybS5oOiBMaWtld2lzZS4KLQkqIGQxMHYuaDogTGlrZXdpc2UuCi0JKiBkMzB2Lmg6IExpa2V3aXNlLgotCSogbTMyci5oOiBMaWtld2lzZS4KLQkqIG02OGsuaDogTGlrZXdpc2UuCi0JKiBtbjEwMjAwLmg6IExpa2V3aXNlLgotCSogc2guaDogTGlrZXdpc2UuCi0JKiBzcGFyYy5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMSAxMzowNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBOZXcgZmlsZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCSogaTM4Ni5oOiBOZXcgZmlsZS4KLQkqIG02OGsuaDogTmV3IGZpbGUuCi0JKiBtbjEwMjAwLmg6IE5ldyBmaWxlLgotCSogc2guaDogTmV3IGZpbGUuCi0KLQkqIG1pcHMuaDogQWRkIFJfTUlQU18qIGFuZCBTSFRfTUlQU18qIGVudHJpZXMuCi0KLQkqIG1uMTAzMDAuaDogQWRkIFJfTU4xMDMwMF8qIGVudHJpZXMuCi0KLQkqIHBwYy5oOiBBZGQgUl9QUENfKiBlbnRyaWVzLgotCi0xOTk4LTA3LTIwIDA3OjExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgT0RLXyosIE9FWF8qLCBPUEFEXyosIE9IV18qLCBhbmQgT0dQXyogY29uc3RhbnRzLgotCURlZmluZSBFbGYzMl9FeHRlcm5hbF9MaWIuCi0KLTE5OTgtMDctMTkgMTU6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFBUX01JUFNfT1BUSU9OUyk6IE5ldyBzeW1ib2wuCi0JQWRkIGxvdHMgb2YgRFRfTUlQU18qIHN5bWJvbHMuCi0KLUZyaSBKdW4gMjYgMTA6NDY6MzUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDE4IDE5OjI3OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV85NjAsIEVNX1Y4MDAsIEVNX0ZSMjAsIEVNX1JIMzIsIEVNX01NQSwKLQlFTV9PTERfQUxQSEEpOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UaHUgSnVuIDExIDE3OjU5OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV80ODYsIEVNX1MzNzApOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UdWUgSnVuICA5IDA5OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9BUk0pOiBBZGQgdGhpcyBjb25zdGFudC4KLQotV2VkIE1heSAgNiAwOTo0NTozMCAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX01BQ0gsRV9NSVBTX01BQ0hfKik6IEFkZGVkLgotCi1TYXQgQXByIDI1IDE4OjM1OjA2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKFNUT19BTFBIQV9OT1BWLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk6IE5ldy4KLQotV2VkIEFwciAxNSAxNTo0Mjo0NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fU1BBUkM2NCk6IE1vdmUgYW5kIHJlbmFtZSB0byBFTV9PTERfU1BBUkNWOS4KLQkoRU1fU1BBUkNWOSk6IE5ldy4gIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSBuYW1lIGFuZCBudW1iZXIuCi0KLVNhdCBGZWIgMjggMTc6MDQ6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoRUZfQUxQSEFfMzJCSVQsIEVGX0FMUEhBX0NBTlJFTEFYKTogTmV3LgotCi1Nb24gRGVjIDE1IDE1OjA3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoRUZfTTMyUl9BUkNILCBFX00zMlJfQVJDSCk6IE5ldyBmbGFncyB0bwotCXNwZWNpZnkgbWFjaGluZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDUgMTE6MjA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgY29uc3RhbnRzOiBTSE5fVjg1MF9TQ09NTU9OLCBTSE5fVjg1MF9UQ09NTU9OLAotCVNITl9WODUwX1pDT01NT04sIFNIVF9WODUwX1NDT01NT04sIFNIVF9WODUwX1RDT01NT04sCi0JU0hUX1Y4NTBfWkNPTU1PTiB0byBoYW5kbGUgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0JZW51bSByZWxvY190eXBlIHJlbmFtZWQgdG8gdjg1MF9yZWxvY190eXBlIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE9jdCAyMyAxMzo1NToyNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIGVsZl9zcGFyY19yZWxvY190eXBlKTogQWRkIFVBNjQgJiBVQTE2LgotCi1UaHUgT2N0IDIzIDAwOjQyOjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChEVF9TUEFSQ19SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoRFRfU1BBUkNfUExURk1UKTogSW4gc3VwcG9ydCBvZiBvbGQgc3BhcmM2NC1saW51eCAucGx0czsgd2lsbAotCWdvIGF3YXkgc29vbi4KLQotVHVlIFNlcCAzMCAxMzoyNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19IQUxfUjEsIEVGX1NQQVJDX0VYVF9NQVNLKTogTmV3IG1hY3Jvcy4KLQkoRUZfU1BBUkNWOV97TU0sVFNPLFBTTyxSTU99KTogTmV3IG1hY3Jvcy4KLQkoU0hOX0JFRk9SRSxTSE5fQUZURVIpOiBOZXcgbWFjcm9zLgotCShTSEZfRVhDTFVERSxTSEZfT1JERVJFRCk6IE5ldyBtYWNyb3MuCi0JKFNUVF9SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoUl9TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZWQsIGJ1dCBzbG90IHJlc2VydmVkLgotCShSX1NQQVJDX3tESVNQNjQsUExUNjQsSElYMjIsTE9YMTB9KTogTmV3IHJlbG9jYXRpb25zLgotCShSX1NQQVJDX3tINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NhdGlvbnMuCi0JKEVMRjY0X1JfVFlQRV97REFUQSxJRCxJTkZPfSk6IE5ldyBtYWNyb3MuCi0KLVdlZCBTZXAgMTcgMTY6NDE6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBBZGQgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLVR1ZSBTZXAgMTYgMTQ6MTY6MTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi1XZWQgU2VwICAzIDE1OjExOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0KLVdlZCBTZXAgIDMgMTE6MjU6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogUmVtb3ZlIFJfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxNzo0MTowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEUuCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEVBLgotCSogdjg1MC5oOiBBZGQgbmV3IGZsYWdzIGZvciBlX2ZsYWdzIGZpZWxkIGluIGVsZiBoZWFkZXIuCi0KLU1vbiBBdWcgMjUgMTY6MDY6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwRSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZS4KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEVBKTogYmFja2VuZCBtYWdpYyBudW1iZXIgZm9yIHY4NTBlYS4KLQotTW9uIEF1ZyAxOCAxMTowNToyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHJlbG9jX3R5cGUpOiBBZGQgMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBBdWcgMTUgMDU6MTA6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmggKGVudW0gcmVsb2MpOiBNb3ZlIGhlcmUgZnJvbSBlbGYzMi1hcmMuYy4KLQotRnJpIEF1ZyAgOCAxNzowNToyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0FSQyk6IERlZmluZS4KLQotTW9uIEp1biAxNiAxNDo0NjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9FaGRyKTogQ2hhbmdlIGVfcGhvZmYgYW5kIGVfc2hvZmYgZnJvbQotCWJmZF9zaWduZWRfdm1hIHRvIGJmZF9zaXplX3R5cGUsIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCi0KLVdlZCBNYXIgIDUgMTU6MzU6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoU0hGX00zMlJfQ0FOX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE3OjQ5OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogRHVtcCB0aGUgMzIvNjQgYml0IHNwZWNpZmljIGZvcm1zIG9mIHRoZSB2ZXJzaW9uCi0Jc3RydWN0dXJlcywgYW5kIGp1c3QgZGVmaW5lIHRoZW0gYXMgc2l6ZSBpbmRlcGVuZGVudC4KLQotCSogY29tbW9uLmggKFZFUlNZTV9ISURERU4sIFZFUlNZTV9WRVJTSU9OKTogRGVmaW5lLgotCi1GcmkgRmViIDIxIDEzOjAwOjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTTMyUl9TREExNi4KLQkoU0hOX00zMlJfU0NPTU1PTik6IERlZmluZS4KLQotV2VkIEZlYiAxOSAxNTozNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgbmV3IHN0cnVjdHVyZXMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIEVMRiB2ZXJzaW9ucy4KLQotVHVlIEZlYiAxOCAxNzo0MDozNiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMzBWKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDExOjU0OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfSEkxNl9bU1VdTE8sUl9NMzJSX0xPMTYuCi0KLUZyaSBKYW4gIDMgMTE6MzI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1RIRVJfe1REQV9CWVRFLEVSUk9SfSk6IE5ldyBiaXRzIGZvciB0aGUgc3Rfb3RoZXIKLQlmaWVsZC4KLQkoU0hOX1Y4NTBfKik6IFJlbW92ZSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcywgd2hpY2ggYXJlIG5vdAotCW5lZWRlZC4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0aGUgdjg1MCByZWxvY2F0aW9ucyBoZXJlIGZyb20KLQllbGYzMi12ODUwLmMKLQotVGh1IEphbiAgMiAxOTozMDoyMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUsIHByb3ZpZGUgVjg1MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotVHVlIERlYyAzMSAxNDo0NDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChEVF9BVVhJTElBUlkpOiBEZWZpbmUuCi0JKERUX0ZJTFRFUik6IERlZmluZS4KLQotV2VkIERlYyAgNCAwNTowMzozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBVcGRhdGUuCi0KLVR1ZSBOb3YgMjYgMTA6NDQ6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNUT19NSVBTMTYpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTIgMTU6NDU6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogUmVtb3ZlIGVtcHR5IGZpbGUuCi0KLVR1ZSBPY3QgIDggMTE6MzE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJMik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDowMTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCi1XZWQgT2N0ICAyIDIxOjI2OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NTjEweDAwKTogRGVmaW5lLgotCi1Nb24gU2VwIDIzIDA5OjE4OjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDMwIDE3OjA2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NIKTogRGVmaW5lLgotCi1UdWUgQXVnIDIwIDE0OjQ3OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTApOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTkgMTA6NTk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NMzJSKTogRGVmaW5lLgotCi1Nb24gSnVsIDIyIDE4OjU5OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19JRkFDRSwgU0hUX01JUFNfQ09OVEVOVCk6IERlZmluZS4KLQkoU0hUX01JUFNfU1lNQk9MX0xJQik6IERlZmluZS4KLQkoU0hGX01JUFNfTUVSR0UsIFNIRl9NSVBTX0FERFIzMiwgU0hGX01JUFNfQUREUjY0KTogRGVmaW5lLgotCShTSEZfTUlQU19OT1NUUklQLCBTSEZfTUlQU19MT0NBTCwgU0hGX01JUFNfTkFNRVMpOiBEZWZpbmUuCi0KLVRodSBKdWwgMTggMTk6MTI6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogTmV3IGZpbGUuCi0KLUp1bCAxOCAxMzoyMDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMTBWKTogRGVmaW5lLgotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEp1biAyMSAxMjozMzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQUxQSEEpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMzEgMTc6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVsZl9FeHRlcm5hbF9PcHRpb25zLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyk6IERlZmluZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogRGVjbGFyZS4KLQkoT0RLXyopOiBEZWZpbmUuCi0JKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8sIEVsZjY0X0ludGVybmFsX1JlZ0luZm8pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBEZWNsYXJlLgotCi1UaHUgTWF5IDMwIDEyOjM1OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfQVJDSF80KTogRGVmaW5lLgotCi1XZWQgTWF5IDI5IDE1OjM1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCk6IERlZmluZS4KLQkoRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSwgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhKTogRGVmaW5lLgotCShSU1NfKik6IERlZmluZS4KLQotTW9uIEFwciAyMiAxODoyNjozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX1s1Nl0pOiBBbHdheXMgZGVmaW5lLgotCi1Nb24gRmViIDE5IDAxOjU1OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX3tQTFQzMixISVBMVDIyLExPUExUMTAsUENQTFQzMixQQ1BMVDIyLAotCVBDUExUMTAsNSw2fSk6IERvbid0IGRlZmluZSBpZmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MuCi0KLVR1ZSBGZWIgIDYgMTE6MzM6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfZWxmX3JlbG9jX3R5cGUpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMTcgMDk6MDk6MTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IERlZmluZSBFTV9TUEFSQzMyUExVUy4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDExIDE2OjI3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFNIRl9FWENMVURFLCBTSFRfT1JERVJFRCk6IE5ldyBmaWVsZHMgZnJvbSB0aGUgYWJpLgotCi1UaHUgTm92IDMwIDE2OjQ3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGVsZl9zZWdtZW50X21hcCk6IEFkZCBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzIGZpZWxkcy4KLQotVHVlIE5vdiAyOCAxNjo1ODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTU6MTk6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBocHBhLmgsIGludGVybmFsLmgsCi0JbWlwcy5oLCBwcGMuaDogIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi1UaHUgU2VwIDIxIDEzOjUxOjU4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpOiBBZGQgbmV3IGZsYWcgYml0LgotCi1GcmkgU2VwICAxIDE1OjMyOjE3IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmg6IEFkZCBzb21lIGRlZmluaXRpb25zIHVzZWQgb24gSXJpeCA1LgotCi1UdWUgSnVuIDIwIDEwOjE4OjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKENQVV9QQV9SSVNDMV8wKTogUHJvdGVjdCBmcm9tIHJlZGVmaW5pdGlvbnMuCi0JKENQVV9QQV9SSVNDMV8xKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgIDggMTg6MTQ6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaDogTmV3IGZpbGUgZm9yIFBvd2VyUEMgc3VwcG9ydC4KLQotVHVlIEZlYiAxNCAxMzo1OToxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEMpOiBVc2Ugb2ZmaWNhbCB2YWx1ZSBvZiAyMCwgbm90IDE3LgotCShFTV9QUENfT0xEKTogRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG9sZCB2YWx1ZSBvZiBFTV9QUEMuCi0KLVR1ZSBKYW4gMjQgMDk6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogTmV3IG1hY3JvLCBQb3dlclBDIG1hY2hpbmUgaWQuCi0KLVR1ZSBKYW4gMTcgMTA6NTE6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNIVF9NSVBTX01TWU0sIFNIVF9NSVBTX0RXQVJGLCBTSFRfTUlQU19FVkVOVFMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTcgMTM6NDM6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFJlbW92ZSByYXdkYXRhIGFuZCBzaXplIGZpZWxkcy4KLQlBZGQgYmZkX3NlY3Rpb24gZmllbGQuCi0KLVR1ZSBNYXkgMjQgMTY6MTE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEVsZjMyX0V4dGVybmFsX2dwdGFiKTogRGVmaW5lLgotCi1Nb24gTWF5IDE2IDEzOjIyOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSk6IERlbGV0ZS4KLQkoRU1fUEFSSVNDKTogQWRkLgotCSogaHBwYS5oOiBOZXcgZmlsZS4KLQotTW9uIE1heSAgOSAxMzoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChTSE5fTE9SRVNFUlZFKTogUmVuYW1lIGZyb20gU0hOX0xPUkVTRVJWLgotCShFTEYzMl9SX1RZUEUsIEVMRjMyX1JfSU5GTyk6IERvbid0IHJlbHkgb24gc2l6ZSBvZiB1bnNpZ25lZCBjaGFyLgotCShFTEY2NF9SX1RZUEUpOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgbG9uZy4KLQotTW9uIEFwciAyNSAxNTo1MzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9TaGRyKTogVXNlIFBUUiwgbm90IHZvaWQgKi4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMuaCAoU0hOX01JUFNfVEVYVCwgU0hOX01JUFNfREFUQSk6ICBEZWZpbmUuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpbnRlcm5hbC5oOiAgUmVtb3ZlIEVsZjMyXyosIEVsZjY0XyogdHlwZWRlZnMuICBUaGVzZSBuYW1lcwotCWNhdXNlIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXJzLCBlLmcuIGxpbmsuaCBpbiBnZGIvc29saWIuYy4KLQlDb21iaW5lIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mICpfSW50ZXJuYWxfRHluLgotCSogY29tbW9uLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmNjRfV29yZCwgRWxmNjRfWHdvcmQgdHlwZWRlZnMKLQlieSB0aGVpciBleHBhbnNpb24uCi0JKiBtaXBzLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmMzJfV29yZCwgRWxmMzJfU3dvcmQsIEVsZjMyX0FkZHIKLQl0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24uIEFkZCBEVF9NSVBTX1JMRF9NQVAgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAxOCAxMDozOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfUE9XRVJQQyk6IERlZmluZS4gIFRoaXMgbWF5IGJlIHRlbXBvcmFyeSwKLQlkZXBlbmRpbmcgdXBvbiBob3cgcXVpY2tseSBJIGNhbiBmaW5kIGEgcmVhbCBQb3dlclBDIEFCSS4KLQotTW9uIEZlYiAgNyAwODoyNzoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotV2VkIEZlYiAgMiAxNDoxMjoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgdmFsdWUgb2YgRU1fSFBQQSBhbmQgaG93IHRvCi0JcGljayBhbiB1bm9mZmljaWFsIHZhbHVlLgotCi1XZWQgTm92IDE3IDE3OjE0OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChTSFRfTUlQU19PUFRJT05TKTogRGVmaW5lLgotCi1Nb24gTm92ICA4IDE3OjU3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBzb21lIG1vcmUgTUlQUyBBQkkgbWFjcm8gZGVmaW5pdGlvbnMuCi0KLVdlZCBOb3YgIDMgMjI6MDc6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fTUlQU19SUzRfQkUpOiBOZXcgbWFjcm8uCi0KLVR1ZSBPY3QgMTIgMDc6Mjg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IE5ldyBmaWxlLiAgTUlQUyBBQkkgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjEgMTM6MTM6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENvbWJpbmVkIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGFsbCBzdHJ1Y3R1cmVzCi0JZXhjZXB0ICpfSW50ZXJuYWxfRHluLiAgVGhpcyB3aWxsIHNpbXBseSB0aGUgYXNzZW1ibGVyIGludGVyZmFjZSwKLQlhbmQgc29tZSBiZmQgY29kZS4KLQotVHVlIE1heSAyNSAwMjowMDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmgsIGludGVybmFsLmgsIGNvbW1vbi5oOiBBZGRlZCA2NC1iaXQgdmVyc2lvbnMgb2Ygc29tZQotCXN0cnVjdHVyZXMgYW5kIG1hY3Jvcy4gIFJlbmFtZWQgb2xkIHZlcnNpb25zIHRvIHB1dCAiMzIiIGluIHRoZQotCW5hbWUuICBTb21lIGFyZSB1bmNoYW5nZWQuCi0KLVRodSBBcHIgMjkgMTI6MTI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9IUFBBLCBOVF9WRVJTSU9OLCBTVE5fVU5ERUYsIERUXyopOiBOZXcgbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoRWxmX0V4dGVybmFsX0R5bik6IE5ldyB0eXBlLgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZW5yYWxfU2hkcik6IE5ldyBmaWVsZCBgc2l6ZScuCi0JKEVsZl9JbnRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotVHVlIEFwciAyMCAxNjowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBDaGFuZ2UgdmFsdWUgdG8gb25lIHJhbmRvbWx5IHBpY2tlZCBpbgotCXRoZSB1c2VyIGRlZmluZWQgcmFuZ2UsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb25zLgotCi1TdW4gTm92IDE1IDA5OjM0OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oIChBVF9zcmNfY29vcmRzKTogIFdoaXRlc3BhY2UgY2hhbmdlIG9ubHkuCi0JKiBkd2FyZi5oIChBVF9ib2R5X2JlZ2luLCBBVF9ib2R5X2VuZCwgTEFOR19NT0RVTEEyKToKLQlBZGQgZnJvbSBsYXRlc3QgZ2NjLgotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBBZGQgYXMgR05VIGV4dGVuc2lvbi4KLQotU2F0IEF1ZyAgMSAxMzo0Njo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFJlcGxhY2Ugd2l0aCBjdXJyZW50IHZlcnNpb24gZnJvbSBnY2MgZGlzdHJpYnV0aW9uLgotCi1GcmkgSnVuIDE5IDE5OjA1OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiAgQWRkIHJlYWwgc3RydWN0IHRhZ3MgdG8gYWxsIHRoZSBUeXBlX0RlZnMsIHNvIHRoZXkKLQljYW4gYmUgdXNlZCBpbiBwcm90b3R5cGVzIHdoZXJlIHRoZSBUeXBlX0RlZnMgYXJlIG5vdCBrbm93bi4KLQotRnJpIEFwciAgMyAyMDo1ODo1OCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogYWRkZWQgRUxGX1Jfe1NZTSxUWVBFLElORk99IGZvciBoYW5kbGluZyByZWxvY2F0aW9uCi0JaW5mbwotCWFkZGVkIEVNX01JUFMsIGFuZCBjb3JyZWN0ZWQgdmFsdWUgb2YgRU1fODYwIGJhc2VkIG9uIFN5c3RlbSBWIEFCSQotCW1hbnVhbC4KLQotCSogZXh0ZXJuYWwuaDogYWRkZWQgRWxmX0V4dGVybmFsX3tSZWwsUmVsYX0uCi0KLQkqIGludGVybmFsLmg6IGFkZGVkIEVsZl9JbnRlcm5hbF97UmVsLFJlbGF9LgotCWFkZGVkIHJhd2RhdGEgdG8gRWxmX0ludGVybmFsX1NoZHIuCi0KLVNhdCBOb3YgMzAgMjA6NDM6NTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBDaGFuZ2VMb2c7IG1vdmVkIGZyb20KLQkuLi9lbGYtPGZvbz4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYWxwaGEuaCBiL2luY2x1ZGUvZWxmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTlkNWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBBTFBIQSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBFcmljIFlvdW5nZGFsZSwgPGVyaWNAYWliLmNvbT4uICBObyBwcm9jZXNzb3Igc3VwcGxlbWVudCBhdmFpbGFibGUKLSAgIGZvciB0aGlzIHBsYXRmb3JtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgQUxQSEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfQUxQSEFfSAotI2RlZmluZSBfRUxGX0FMUEhBX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQWxsIGFkZHJlc3NlcyBtdXN0IGJlIGJlbG93IDJHQi4gICovCi0jZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkweDAwMDAwMDAxCi0KLS8qIEFsbCByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHJlbGF4YXRpb24gd2l0aCBjb2RlIG1vdmVtZW50IGFyZSBwcmVzZW50LiAgKi8KLSNkZWZpbmUgRUZfQUxQSEFfQ0FOUkVMQVgJMHgwMDAwMDAwMgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX0RFQlVHCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9SZWdJbmZvOwotCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCi0jZGVmaW5lIFNUT19BTFBIQV9TVERfR1BMT0FECTB4ODgKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogQWxwaGEgcmVsb2NzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hbHBoYV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTk9ORSwgMCkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRkxPTkcsIDEpCS8qIERpcmVjdCAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRlFVQUQsIDIpCS8qIERpcmVjdCA2NCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMMzIsIDMpCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElURVJBTCwgNCkJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9MSVRVU0UsIDUpCS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUERJU1AsIDYpCS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0JSQUREUiwgNykJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSElOVCwgOCkJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDE2LCA5KQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwzMiwgMTApCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDY0LCAxMSkJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0KLS8qIEluaGVyaXRlZCB0aGVzZSBmcm9tIEVDT0ZGLCBidXQgdGhleSBhcmUgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgIGFuZCBhcmUgZGVwcmVjaWF0ZWQuICBBbmQgbm90IGltcGxlbWVudGVkIGluIHRoZSBCRkQsIGJ0dy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QVVNILCAxMikJLyogT1Agc3RhY2sgcHVzaCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfU1RPUkUsIDEzKQkvKiBPUCBzdGFjayBwb3AgYW5kIHN0b3JlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QU1VCLCAxNCkJLyogT1Agc3RhY2sgc3VidHJhY3QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BSU0hJRlQsIDE1KQkvKiBPUCBzdGFjayByaWdodCBzaGlmdCAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFZBTFVFLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMSElHSCwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTExPVywgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF8xNiwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfTE8zMiwgMjMpCi0KLS8qIFRoZXNlIHJlbG9jYXRpb25zIGFyZSBzcGVjaWZpYyB0byBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0NPUFksIDI0KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HTE9CX0RBVCwgMjUpCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0pNUF9TTE9ULCAyNikJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVMQVRJVkUsIDI3KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0KLSAgRU1QVFlfUkVMT0MgIChSX0FMUEhBX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FyYy5oIGIvaW5jbHVkZS9lbGYvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGI1NWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMsIChkamVAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFSQyBFTEYgQUJJLiAgKi8KLQotI2lmbmRlZiBfRUxGX0FSQ19ICi0jZGVmaW5lIF9FTEZfQVJDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfQjI2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyMl9QQ1JFTCwgMykKLSAgRU1QVFlfUkVMT0MgIChSX0FSQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBGb3VyIGJpdCBBUkMgbWFjaGluZSB0eXBlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVJDX01BQ0gJCTB4MDAwMDAwMGYKLQotLyogVmFyaW91cyBDUFUgdHlwZXMuICAqLwotI2RlZmluZSBFX0FSQ19NQUNIX0JBU0UJCTB4MDAwMDAwMDAKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQxCTB4MDAwMDAwMDEKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQyCTB4MDAwMDAwMDIKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQ0CTB4MDAwMDAwMDMKLQotLyogTGVhdmUgYml0cyAweGYwIGFsb25lIGluIGNhc2Ugd2UgZXZlciBoYXZlIG1vcmUgdGhhbiAxNiBjcHUgdHlwZXMuCi0gICBIaWdobHkgdW5saWtlbHksIGJ1dCB3aGF0IHRoZSBoZWNrLiAgKi8KLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfQVJDX1BJQwkJMHgwMDAwMDEwMAotCi0jZW5kaWYgLyogX0VMRl9BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLmggYi9pbmNsdWRlL2VsZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjNDZkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UuICAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLSNkZWZpbmUgRUZfU09GVF9GTE9BVCAgICAgIDB4MjAwCi0KLS8qIE90aGVyIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSBBUk0gRUxGIHNwZWMuIHZlcnNpb24gQS0wOC4gICovCi0jZGVmaW5lIEVGX0FSTV9TWU1TQVJFU09SVEVEIDB4MDQJLyogTkIgY29uZmxpY3RzIHdpdGggRUZfSU5URVJXT1JLICovCi0jZGVmaW5lIEVGX0FSTV9FQUJJTUFTSyAgICAgIDB4RkYwMDAwMDAKLQotI2RlZmluZSBFRl9BUk1fRUFCSV9WRVJTSU9OKGZsYWdzKSAoKGZsYWdzKSAmIEVGX0FSTV9FQUJJTUFTSykKLSNkZWZpbmUgRUZfQVJNX0VBQklfVU5LTk9XTiAgMHgwMDAwMDAwMAotI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIxICAgICAweDAxMDAwMDAwCi0KLS8qIExvY2FsIGFsaWFzZXMgZm9yIHNvbWUgZmxhZ3MgdG8gbWF0Y2ggbmFtZXMgdXNlZCBieSBDT0ZGIHBvcnQuICAqLwotI2RlZmluZSBGX0lOVEVSV09SSwkgICBFRl9JTlRFUldPUksKLSNkZWZpbmUgRl9BUENTMjYJICAgRUZfQVBDU18yNgotI2RlZmluZSBGX0FQQ1NfRkxPQVQJICAgRUZfQVBDU19GTE9BVAotI2RlZmluZSBGX1BJQyAgICAgICAgICAgICAgRUZfUElDCi0jZGVmaW5lIEZfU09GVF9GTE9BVAkgICBFRl9TT0ZUX0ZMT0FUCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYi4gICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgICBTVFRfTE9QUk9DICAgLyogQSBUaHVtYiBmdW5jdGlvbi4gICovCi0jZGVmaW5lIFNUVF9BUk1fMTZCSVQgICAgICBTVFRfSElQUk9DICAgLyogQSBUaHVtYiBsYWJlbC4gICovCi0KLS8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzLiAgKi8KLSNkZWZpbmUgU0hGX0VOVFJZU0VDVCAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50LiAgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcC4gICovCi0KLS8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncy4gICovCi0jZGVmaW5lIFBGX0FSTV9TQiAgICAgICAgICAweDEwMDAwMDAwICAgLyogU2VnbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSBzdGF0aWMgYmFzZS4gICovCi0jZGVmaW5lIFBGX0FSTV9QSSAgICAgICAgICAweDIwMDAwMDAwICAgLyogU2VnbWVudCBpcyBwb3NpdGlvbi1pbmRlcGVuZGVudC4gICovCi0jZGVmaW5lIFBGX0FSTV9BQlMgICAgICAgICAweDQwMDAwMDAwICAgLyogU2VnbWVudCBtdXN0IGJlIGxvYWRlZCBhdCBpdHMgYmFzZSBhZGRyZXNzLiAgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcm1fcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9OT05FLCAgICAgICAgICAgICAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMjQsICAgICAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAgICAgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUwzMiwgICAgICAgICAgICAzKQotI2lmZGVmIE9MRF9BUk1fQUJJCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICAgICAgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgICAgIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX0FCUzUsICAgICAgICAgNykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgICAgIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgICAgICAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgICAgIDExKSAgIC8qIEN5Z251cyBleHRlbnNpb24gdG8gYWJpOiBUaHVtYiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgICAgICAxMikgICAvKiBDeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogVGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAgIDEzKSAgCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksICAgICAxNCkgIAotI2Vsc2UgLyogbm90IE9MRF9BUk1fQUJJICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUEMxMywgICAgICAgICAgICAgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgICAgIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX0FCUzUsICAgICAgICAgNykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgICAgIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMjIsICAgICAgICAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM4LCAgICAgICAgIDExKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAgICAgMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fU1dJMjQsICAgICAgICAgICAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fU1dJOCwgICAgICAgIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1hQQzI1LCAgICAgICAgICAgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1hQQzIyLCAgICAgICAxNikKLSNlbmRpZiAvKiBub3QgT0xEX0FSTV9BQkkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9DT1BZLCAgICAgICAgICAgIDIwKSAgIC8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dMT0JfREFULCAgICAgICAgMjEpICAgLyogQ3JlYXRlIEdPVCBlbnRyeS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgICAgICAyMikgICAvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUxBVElWRSwgICAgICAgIDIzKSAgIC8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVE9GRiwgICAgICAgICAgMjQpICAgLyogMzIgYml0IG9mZnNldCB0byBHT1QuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAgICAgMjUpICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVDMyLCAgICAgICAgICAgMjYpICAgLyogMzIgYml0IEdPVCBlbnRyeS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUExUMzIsICAgICAgICAgICAyNykgICAvKiAzMiBiaXQgUExUIGFkZHJlc3MuICAqLwotI2lmZGVmIE9MRF9BUk1fQUJJCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQywgICAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAgMjQ5KQotI2Vsc2UgLyogbm90IE9MRF9BUk1fQUJJICovCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzEsICAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MxLCAgIDk5KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAxMDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgIDEwMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgICAgMTAyKSAgIC8qIEN5Z251cyBleHRlbnNpb24gdG8gYWJpOiBUaHVtYiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgICAgIDEwMykgICAvKiBDeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogVGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DMiwgMTA0KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQzIsICAyNDgpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlhQQzI1LCAgICAgICAgIDI0OSkKLSNlbmRpZiAvKiBub3QgT0xEX0FSTV9BQkkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAgICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgICAgICAyNTEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlJFTDMyLCAgICAgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgICAgICAyNTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkJBU0UsICAgICAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FSTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9hdnIuaCBiL2luY2x1ZGUvZWxmL2F2ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTI3NDU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2F2ci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogQVZSIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEZW5pcyBDaGVydHlrb3YgPGRlbmlzY0BvdmVydGEucnU+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0FWUl9ICi0jZGVmaW5lIF9FTEZfQVZSX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVZSX01BQ0ggMHhmCi0KLSNkZWZpbmUgRV9BVlJfTUFDSF9BVlIxIDEKLSNkZWZpbmUgRV9BVlJfTUFDSF9BVlIyIDIKLSNkZWZpbmUgRV9BVlJfTUFDSF9BVlIzIDMKLSNkZWZpbmUgRV9BVlJfTUFDSF9BVlI0IDQKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2F2cl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX05PTkUsCQkJMCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl8zMiwJCQkxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSXzdfUENSRUwsCQkyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSXzEzX1BDUkVMLAkJMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl8xNiwgCQkJNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl8xNl9QTSwgCQk1KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0xPOF9MREksCQk2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hJOF9MREksCQk3KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hIOF9MREksCQk4KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0xPOF9MRElfTkVHLAkJOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9ISThfTERJX05FRywJICAgICAgIDEwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hIOF9MRElfTkVHLAkgICAgICAgMTEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfTE84X0xESV9QTSwJICAgICAgIDEyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hJOF9MRElfUE0sCSAgICAgICAxMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9ISDhfTERJX1BNLAkgICAgICAgMTQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfTE84X0xESV9QTV9ORUcsICAgICAgIDE1KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hJOF9MRElfUE1fTkVHLCAgICAgICAxNikKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9ISDhfTERJX1BNX05FRywgICAgICAgMTcpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfQ0FMTCwJCSAgICAgICAxOCkKLSAgICAgRU1QVFlfUkVMT0MgIChSX0FWUl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9BVlJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvY29tbW9uLmggYi9pbmNsdWRlL2VsZi9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOTY2OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBFTEYgc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLSAgIEZvciBleGFtcGxlLCBFTEZNQUcwIGlzIHRoZSBieXRlIDB4N0YgaW4gYm90aCB0aGUgaW50ZXJuYWwgKGluLW1lbW9yeSkKLSAgIGFuZCBleHRlcm5hbCAoaW4tZmlsZSkgcmVwcmVzZW50YXRpb25zLiAqLwotCi0jaWZuZGVmIF9FTEZfQ09NTU9OX0gKLSNkZWZpbmUgX0VMRl9DT01NT05fSAotCi0vKiBGaWVsZHMgaW4gZV9pZGVudFtdICovCi0KLSNkZWZpbmUgRUlfTUFHMAkJMAkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcwCQkweDdGCS8qIE1hZ2ljIG51bWJlciBieXRlIDAgKi8KLQotI2RlZmluZSBFSV9NQUcxCQkxCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAxIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzEJCSdFJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCi0KLSNkZWZpbmUgRUlfTUFHMgkJMgkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMiBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcyCQknTCcJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMiAqLwotCi0jZGVmaW5lIEVJX01BRzMJCTMJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMwkJJ0YnCS8qIE1hZ2ljIG51bWJlciBieXRlIDMgKi8KLQotI2RlZmluZSBFSV9DTEFTUwk0CS8qIEZpbGUgY2xhc3MgKi8KLSNkZWZpbmUgRUxGQ0xBU1NOT05FCTAJLyogSW52YWxpZCBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTUzMyCTEJLyogMzItYml0IG9iamVjdHMgKi8KLSNkZWZpbmUgRUxGQ0xBU1M2NAkyCS8qIDY0LWJpdCBvYmplY3RzICovCi0KLSNkZWZpbmUgRUlfREFUQQkJNQkvKiBEYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEFOT05FCTAJLyogSW52YWxpZCBkYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEEyTFNCCTEJLyogMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgRUxGREFUQTJNU0IJMgkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLwotCi0jZGVmaW5lIEVJX1ZFUlNJT04JNgkvKiBGaWxlIHZlcnNpb24gKi8KLQotI2RlZmluZSBFSV9PU0FCSSAgICAgICAgNyAgICAgICAvKiBPcGVyYXRpbmcgU3lzdGVtL0FCSSBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX05PTkUgICAwICAgICAgIC8qIFVOSVggU3lzdGVtIFYgQUJJICovCi0jZGVmaW5lIEVMRk9TQUJJX0hQVVggICAxICAgICAgIC8qIEhQLVVYIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSNkZWZpbmUgRUxGT1NBQklfTkVUQlNEIDIgICAgICAgLyogTmV0QlNEICovCi0jZGVmaW5lIEVMRk9TQUJJX0xJTlVYICAzICAgICAgIC8qIEdOVS9MaW51eCAqLwotI2RlZmluZSBFTEZPU0FCSV9IVVJEICAgNCAgICAgICAvKiBHTlUvSHVyZCAqLwotI2RlZmluZSBFTEZPU0FCSV9TT0xBUklTIDYgICAgICAvKiBTb2xhcmlzICovCi0jZGVmaW5lIEVMRk9TQUJJX01PTlRFUkVZIDcgICAgIC8qIE1vbnRlcmV5ICovCi0jZGVmaW5lIEVMRk9TQUJJX0lSSVggICA4ICAgICAgIC8qIElSSVggKi8KLSNkZWZpbmUgRUxGT1NBQklfRlJFRUJTRCA5ICAgICAgLyogRnJlZUJTRCAqLwotI2RlZmluZSBFTEZPU0FCSV9UUlU2NCAgMTAgICAgICAvKiBUUlU2NCBVTklYICovCi0jZGVmaW5lIEVMRk9TQUJJX01PREVTVE8gMTEgICAgIC8qIE5vdmVsbCBNb2Rlc3RvICovCi0jZGVmaW5lIEVMRk9TQUJJX09QRU5CU0QgMTIgICAgIC8qIE9wZW5CU0QgKi8KLSNkZWZpbmUgRUxGT1NBQklfU1RBTkRBTE9ORSAyNTUgLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX0FSTSAgIDk3CQkvKiBBUk0gKi8KLQotI2RlZmluZSBFSV9BQklWRVJTSU9OICAgOCAgICAgICAvKiBBQkkgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX1BBRAkJOQkvKiBTdGFydCBvZiBwYWRkaW5nIGJ5dGVzICovCi0KLQotLyogVmFsdWVzIGZvciBlX3R5cGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCBmaWxlIHR5cGUgKi8KLQotI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLwotI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCi0jZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCi0jZGVmaW5lIEVUX0xPT1MgICAgICAgICAweEZFMDAJLyogT3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyAqLwotI2RlZmluZSBFVF9ISU9TICAgICAgICAgMHhGRUZGICAvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0xPUFJPQwkweEZGMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJUFJPQwkweEZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lLCB3aGljaCBpZGVudGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgKi8KLQotI2RlZmluZSBFTV9OT05FCQkwCS8qIE5vIG1hY2hpbmUgKi8KLSNkZWZpbmUgRU1fTTMyCQkxCS8qIEFUJlQgV0UgMzIxMDAgKi8KLSNkZWZpbmUgRU1fU1BBUkMJMgkvKiBTVU4gU1BBUkMgKi8KLSNkZWZpbmUgRU1fMzg2CQkzCS8qIEludGVsIDgwMzg2ICovCi0jZGVmaW5lIEVNXzY4SwkJNAkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLwotI2RlZmluZSBFTV84OEsJCTUJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fNDg2CQk2CS8qIEludGVsIDgwNDg2ICovCi0jZGVmaW5lIEVNXzg2MAkJNwkvKiBJbnRlbCA4MDg2MCAqLwotI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KLSNkZWZpbmUgRU1fUzM3MAkJOQkvKiBJQk0gU3lzdGVtLzM3MCAqLwotI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAxMAkvKiBNSVBTIFI0MDAwIGJpZy1lbmRpYW4gKi8gLyogRGVwcmVjaWF0ZWQgKi8KLSNkZWZpbmUgRU1fTUlQU19SUzNfTEUgMTAJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuIChPY3QgNCAxOTk5IERyYWZ0KSovIC8qIERlcHJlY2lhdGVkICovCi0KLSNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLwotCi0jZGVmaW5lIEVNX1ZQUDU1MCAgICAgIDE3ICAgICAgIC8qIEZ1aml0c3UgVlBQNTAwICovCi0jZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCi0jZGVmaW5lIEVNXzk2MCAgICAgICAgIDE5ICAgICAgIC8qIEludGVsIDgwOTYwICovCi0jZGVmaW5lIEVNX1BQQwkgICAgICAgMjAJLyogUG93ZXJQQyAqLwotI2RlZmluZSBFTV9QUEM2NCAgICAgICAyMQkvKiA2NC1iaXQgUG93ZXJQQyAqLwotCi0jZGVmaW5lIEVNX1Y4MDAgICAgICAgIDM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCSAgICAgICAzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkgICAgICAgMzggICAgICAgLyogVFJXIFJIMzIgKi8KLSNkZWZpbmUgRU1fTUNPUkUgICAgICAgMzkgICAgICAgLyogTW90b3JvbGEgTSpDb3JlICovIC8qIE1heSBhbHNvIGJlIHRha2VuIGJ5IEZ1aml0c3UgTU1BICovCi0jZGVmaW5lIEVNX1JDRSAgICAgICAgIDM5ICAgICAgIC8qIE9sZCBuYW1lIGZvciBNQ29yZSAqLwotI2RlZmluZSBFTV9BUk0JICAgICAgIDQwCS8qIEFSTSAqLwotI2RlZmluZSBFTV9PTERfQUxQSEEgICA0MQkvKiBEaWdpdGFsIEFscGhhICovCi0jZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIEVNX1NQQVJDVjkgICAgIDQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLwotI2RlZmluZSBFTV9UUklDT1JFICAgICA0NCAgICAgICAvKiBTaWVtZW5zIFRyaWNvcmUgZW1iZWRkZWQgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQyAgICAgICAgIDQ1ICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSwgQXJnb25hdXQgVGVjaG5vbG9naWVzIEluYy4gKi8KLSNkZWZpbmUgRU1fSDhfMzAwICAgICAgNDYgICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgRU1fSDhfMzAwSCAgICAgNDcgICAgICAgLyogSGl0YWNoaSBIOC8zMDBIICovCi0jZGVmaW5lIEVNX0g4UyAgICAgICAgIDQ4ICAgICAgIC8qIEhpdGFjaGkgSDhTICovCi0jZGVmaW5lIEVNX0g4XzUwMCAgICAgIDQ5ICAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCi0jZGVmaW5lIEVNX0lBXzY0ICAgICAgIDUwICAgICAgIC8qIEludGVsIElBLTY0IFByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9NSVBTX1ggICAgICA1MSAgICAgICAvKiBTdGFuZm9yZCBNSVBTLVggKi8KLSNkZWZpbmUgRU1fQ09MREZJUkUgICAgNTIgICAgICAgLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KLSNkZWZpbmUgRU1fNjhIQzEyICAgICAgNTMgICAgICAgLyogTW90b3JvbGEgTTY4SEMxMiAqLwotI2RlZmluZSBFTV9NTUEJICAgICAgIDU0CS8qIEZ1aml0c3UgTXVsdGltZWRpYSBBY2NlbGVyYXRvciAqLwotI2RlZmluZSBFTV9QQ1AJICAgICAgIDU1CS8qIFNpZW1lbnMgUENQICovCi0jZGVmaW5lIEVNX05DUFUJICAgICAgIDU2CS8qIFNvbnkgbkNQVSBlbWJlZGRlZCBSSVNDIHByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9ORFIxCSAgICAgICA1NwkvKiBEZW5zbyBORFIxIG1pY3JvcHJvY2Vzc3ByICovCi0jZGVmaW5lIEVNX1NUQVJDT1JFICAgIDU4CS8qIE1vdG9yb2xhIFN0YXIqQ29yZSBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fTUUxNgkgICAgICAgNTkJLyogVG95b3RhIE1FMTYgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX1NUMTAwICAgICAgIDYwCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDEwMCBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fVElOWUogICAgICAgNjEJLyogQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueUogZW1iZWRkZWQgcHJvY2Vzc29yICovCi0KLSNkZWZpbmUgRU1fRlg2NgkgICAgICAgNjYJLyogU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV9TVDlQTFVTICAgICA2NwkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q5KyA4LzE2IGJpdCBtaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fU1Q3CSAgICAgICA2OAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q3IDgtYml0IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV82OEhDMTYgICAgICA2OQkvKiBNb3Rvcm9sYSBNQzY4SEMxNiBNaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fNjhIQzExICAgICAgNzAJLyogTW90b3JvbGEgTUM2OEhDMTEgTWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNXzY4SEMwOCAgICAgIDcxCS8qIE1vdG9yb2xhIE1DNjhIQzA4IE1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV82OEhDMDUgICAgICA3MgkvKiBNb3Rvcm9sYSBNQzY4SEMwNSBNaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fU1ZYICAgICAgICAgNzMJLyogU2lsaWNvbiBHcmFwaGljcyBTVnggKi8KLSNkZWZpbmUgRU1fU1QxOSAgICAgICAgNzQJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMTkgOC1iaXQgbWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNX1ZBWCAgICAgICAgIDc1CS8qIERpZ2l0YWwgVkFYICovCi0KLSNkZWZpbmUgRU1fUEogICAgICAgICAgOTkgICAgICAgLyogcGljb0phdmEgKi8KLQotLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlIHBpY2sgbGFyZ2UKLSAgIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgY29sbGlzaW9uCi0gICB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuCi0KLSAgIE5PVEU6IERvIG5vdCBqdXN0IGluY3JlbWVudCB0aGUgbW9zdCByZWNlbnQgbnVtYmVyIGJ5IG9uZS4KLSAgIFNvbWVib2R5IGVsc2Ugc29tZXdoZXJlIHdpbGwgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZywgYW5kIHlvdQotICAgd2lsbCBoYXZlIGEgY29sbGlzaW9uLiAgSW5zdGVhZCwgcGljayBhIHJhbmRvbSBudW1iZXIuICAqLwotCi0vKiBDeWdudXMgUG93ZXJQQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1BPV0VSUEMgMHg5MDI1Ci0KLS8qIE9sZCB2ZXJzaW9uIG9mIFNwYXJjIHY5LCBmcm9tIGJlZm9yZSB0aGUgQUJJOyB0aGlzIHNob3VsZCBiZQotICAgcmVtb3ZlZCBzaG9ydGx5LiAgKi8KLSNkZWZpbmUgRU1fT0xEX1NQQVJDVjkJMTEKLQotLyogT2xkIHZlcnNpb24gb2YgUG93ZXJQQywgdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBzaG9ydGx5LiAqLwotI2RlZmluZSBFTV9QUENfT0xECTE3Ci0KLS8qIEN5Z251cyBBUkMgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19BUkMgMHg5MDQwCi0KLS8qIEN5Z251cyBNMzJSIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTTMyUiAweDkwNDEKLQotLyogQWxwaGEgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgotCi0vKiBEMTBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDEwVgkweDc2NTAKLQotLyogRDMwViBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0QzMFYJMHg3Njc2Ci0KLS8qIFY4NTAgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAotCi0vKiBtbjEwMjAwIGFuZCBtbjEwMzAwIGJhY2tlbmQgbWFnaWMgbnVtYmVycy4KLSAgIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAyMDAJMHhkZWFkCi0jZGVmaW5lIEVNX0NZR05VU19NTjEwMzAwCTB4YmVlZgotCi0vKiBGUjMwIG1hZ2ljIG51bWJlciAtIG5vIEVBQkkgYXZhaWxhYmxlLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0ZSMzAJCTB4MzMzMAotCi0vKiBBVlIgbWFnaWMgbnVtYmVyCi0gICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FWUgkJCTB4MTA1NwotCi0vKiBTZWUgdGhlIGFib3ZlIGNvbW1lbnQgYmVmb3JlIHlvdSBhZGQgYSBuZXcgRU1fKiB2YWx1ZSBoZXJlLiAgKi8KLQotLyogVmFsdWVzIGZvciBlX3ZlcnNpb24gKi8KLQotI2RlZmluZSBFVl9OT05FCQkwCQkvKiBJbnZhbGlkIEVMRiB2ZXJzaW9uICovCi0jZGVmaW5lIEVWX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCi0KLS8qIFZhbHVlcyBmb3IgcHJvZ3JhbSBoZWFkZXIsIHBfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KLSNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgUFRfUEhEUgkJNgkJLyogRW50cnkgZm9yIGhlYWRlciB0YWJsZSBpdHNlbGYgKi8KLSNkZWZpbmUgUFRfTE9PUyAgICAgICAgIDB4NjAwMDAwMDAJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElPUyAgICAgICAgIDB4NmZmZmZmZmYJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBQcm9ncmFtIHNlZ21lbnQgcGVybWlzc2lvbnMsIGluIHByb2dyYW0gaGVhZGVyIHBfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLwotI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCi0vKiAjZGVmaW5lIFBGX01BU0tPUwkweDBGMDAwMDAwICAgICovLyogT1Mtc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotI2RlZmluZSBQRl9NQVNLT1MJMHgwRkYwMDAwMAkvKiBOZXcgdmFsdWUsIE9jdCA0LCAxOTk5IERyYWZ0ICovCi0jZGVmaW5lIFBGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJlc2VydmVkIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBzZWN0aW9uIGhlYWRlciwgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9OVUxMCTAJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBTSFRfUFJPR0JJVFMJMQkJLyogUHJvZ3JhbSBzcGVjaWZpYyAocHJpdmF0ZSkgZGF0YSAqLwotI2RlZmluZSBTSFRfU1lNVEFCCTIJCS8qIExpbmsgZWRpdGluZyBzeW1ib2wgdGFibGUgKi8KLSNkZWZpbmUgU0hUX1NUUlRBQgkzCQkvKiBBIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTSFRfUkVMQQk0CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMgd2l0aCBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9IQVNICTUJCS8qIEEgc3ltYm9sIGhhc2ggdGFibGUgKi8KLSNkZWZpbmUgU0hUX0RZTkFNSUMJNgkJLyogSW5mb3JtYXRpb24gZm9yIGR5bmFtaWMgbGlua2luZyAqLwotI2RlZmluZSBTSFRfTk9URQk3CQkvKiBJbmZvcm1hdGlvbiB0aGF0IG1hcmtzIGZpbGUgKi8KLSNkZWZpbmUgU0hUX05PQklUUwk4CQkvKiBTZWN0aW9uIG9jY3VwaWVzIG5vIHNwYWNlIGluIGZpbGUgKi8KLSNkZWZpbmUgU0hUX1JFTAkJOQkJLyogUmVsb2NhdGlvbiBlbnRyaWVzLCBubyBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9TSExJQgkxMAkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLwotI2RlZmluZSBTSFRfRFlOU1lNCTExCQkvKiBEeW5hbWljIGxpbmtpbmcgc3ltYm9sIHRhYmxlICovCi0KLSNkZWZpbmUgU0hUX0lOSVRfQVJSQVkgIDE0CQkvKiBBcnJheSBvZiBwb2ludGVycyB0byBpbml0IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBTSFRfRklOSV9BUlJBWSAgMTUJCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIGZpbmlzaCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgU0hUX1BSRUlOSVRfQVJSQVkgMTYJCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHByZS1pbml0IGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIFNIVF9MT09TICAgICAgICAweDYwMDAwMDAwICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNIVF9ISU9TICAgICAgICAweDZmZmZmZmZmICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0KLS8qIFRoZSBuZXh0IHRocmVlIHNlY3Rpb24gdHlwZXMgYXJlIGRlZmluZWQgYnkgU29sYXJpcywgYW5kIGFyZSBuYW1lZAotICAgU0hUX1NVTlcqLiAgV2UgdXNlIHRoZW0gaW4gR05VIGNvZGUsIHNvIHdlIGFsc28gZGVmaW5lIFNIVF9HTlUqCi0gICB2ZXJzaW9ucy4gICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcmRlZgkweDZmZmZmZmZkCS8qIFZlcnNpb25zIGRlZmluZWQgYnkgZmlsZSAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJuZWVkIDB4NmZmZmZmZmUJLyogVmVyc2lvbnMgbmVlZGVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVyc3ltCTB4NmZmZmZmZmYJLyogU3ltYm9sIHZlcnNpb25zICovCi0KLSNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJU0hUX1NVTldfdmVyZGVmCi0jZGVmaW5lIFNIVF9HTlVfdmVybmVlZAlTSFRfU1VOV192ZXJuZWVkCi0jZGVmaW5lIFNIVF9HTlVfdmVyc3ltCVNIVF9TVU5XX3ZlcnN5bQotCi0jZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotLyogI2RlZmluZSBTSFRfSElVU0VSCTB4OEZGRkZGRkYgICAgKi8vKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0hJVVNFUgkweEZGRkZGRkZGCS8qIE5ldyB2YWx1ZSwgZGVmaW5lZCBpbiBPY3QgNCwgMTk5OSBEcmFmdCAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9XUklURQkoMSA8PCAwKQkvKiBXcml0YWJsZSBkYXRhIGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0FMTE9DCSgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCi0jZGVmaW5lIFNIRl9FWEVDSU5TVFIJKDEgPDwgMikJLyogRXhlY3V0YWJsZSBtYWNoaW5lIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTSEZfTUVSR0UJKDEgPDwgNCkJLyogRGF0YSBpbiB0aGlzIHNlY3Rpb24gY2FuIGJlIG1lcmdlZCAqLwotI2RlZmluZSBTSEZfU1RSSU5HUwkoMSA8PCA1KQkvKiBDb250YWlucyBudWxsIHRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZ3MgKi8KLSNkZWZpbmUgU0hGX0lORk9fTElOSwkoMSA8PCA2KQkvKiBzaF9pbmZvIGhvbGRzIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluZGV4ICovCi0jZGVmaW5lIFNIRl9MSU5LX09SREVSICAoMSA8PCA3KQkvKiBQcmVzZXJ2ZSBzZWN0aW9uIG9yZGVyaW5nIHdoZW4gbGlua2luZyAqLwotI2RlZmluZSBTSEZfT1NfTk9OQ09ORk9STUlORyAoMSA8PCA4KQkvKiBPUyBzcGVjaWZjaSBwcm9jZXNzaW5nIHJlcXVpcmVkICovCi0KLS8qICNkZWZpbmUgU0hGX01BU0tPUwkweDBGMDAwMDAwICAgICovLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIRl9NQVNLT1MJMHgwRkYwMDAwMAkvKiBOZXcgdmFsdWUsIE9jdCA0LCAxOTk5IERyYWZ0ICovCi0jZGVmaW5lIFNIRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogVmFsdWVzIG9mIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBjb3JlIGZpbGVzLiAqLwotCi0jZGVmaW5lIE5UX1BSU1RBVFVTCTEJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0ZQUkVHU0VUCTIJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSUFNJTkZPCTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJwc2luZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1RBU0tTVFJVQ1QJNAkJLyogQ29udGFpbnMgY29weSBvZiB0YXNrIHN0cnVjdCAqLwotI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZgkvKiBDb250YWlucyBhIHVzZXJfeGZwcmVnc19zdHJ1Y3Q7ICovCi0JCQkJCS8qICAgbm90ZSBuYW1lIG11c3QgYmUgIkxJTlVYIi4gICovCi0KLS8qIE5vdGUgc2VnbWVudHMgZm9yIGNvcmUgZmlsZXMgb24gZGlyLXN0eWxlIHByb2NmcyBzeXN0ZW1zLiAqLwotCi0jZGVmaW5lIE5UX1BTVEFUVVMJMTAJCS8qIEhhcyBhIHN0cnVjdCBwc3RhdHVzICovCi0jZGVmaW5lIE5UX0ZQUkVHUwkxMgkJLyogSGFzIGEgc3RydWN0IGZwcmVnc2V0ICovCi0jZGVmaW5lIE5UX1BTSU5GTwkxMwkJLyogSGFzIGEgc3RydWN0IHBzaW5mbyAqLwotI2RlZmluZSBOVF9MV1BTVEFUVVMJMTYJCS8qIEhhcyBhIHN0cnVjdCBsd3BzdGF0dXNfdCAqLwotI2RlZmluZSBOVF9MV1BTSU5GTwkxNwkJLyogSGFzIGEgc3RydWN0IGx3cHNpbmZvX3QgKi8KLSNkZWZpbmUgTlRfV0lOMzJQU1RBVFVTCTE4CQkvKiBIYXMgYSBzdHJ1Y3Qgd2luMzJfcHN0YXR1cyAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCi0vKiAoT25seSBmb3IgaHBwYSByaWdodCBub3cuICBTaG91bGQgdGhpcyBiZSBtb3ZlZCBlbHNld2hlcmU/KSAgKi8KLQotI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLwotCi0vKiBUaGVzZSB0aHJlZSBtYWNyb3MgZGlzYXNzZW1ibGUgYW5kIGFzc2VtYmxlIGEgc3ltYm9sIHRhYmxlIHN0X2luZm8gZmllbGQsCi0gICB3aGljaCBjb250YWlucyB0aGUgc3ltYm9sIGJpbmRpbmcgYW5kIHN5bWJvbCB0eXBlLiAgVGhlIFNUQl8gYW5kIFNUVF8KLSAgIGRlZmluZXMgaWRlbnRpZnkgdGhlIGJpbmRpbmcgYW5kIHR5cGUuICovCi0KLSNkZWZpbmUgRUxGX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgaW50KSh2YWwpKSA+PiA0KQotI2RlZmluZSBFTEZfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweEYpCi0jZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsdHlwZSkJCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4RikpCi0KLS8qIFRoZSA2NGJpdCBhbmQgMzJiaXQgdmVyc2lvbnMgb2YgdGhlc2UgbWFjcm9zIGFyZSBpZGVudGljYWwsIGJ1dAotICAgdGhlIEVMRiBzcGVjIGRlZmluZXMgdGhlbSwgc28gaGVyZSB0aGV5IGFyZS4gICovCi0jZGVmaW5lIEVMRjMyX1NUX0JJTkQgIEVMRl9TVF9CSU5ECi0jZGVmaW5lIEVMRjMyX1NUX1RZUEUgIEVMRl9TVF9UWVBFCi0jZGVmaW5lIEVMRjMyX1NUX0lORk8gIEVMRl9TVF9JTkZPCi0jZGVmaW5lIEVMRjY0X1NUX0JJTkQgIEVMRl9TVF9CSU5ECi0jZGVmaW5lIEVMRjY0X1NUX1RZUEUgIEVMRl9TVF9UWVBFCi0jZGVmaW5lIEVMRjY0X1NUX0lORk8gIEVMRl9TVF9JTkZPCi0KLS8qIFRoaXMgbWFjcm8gZGlzYXNzZW1ibGVzIGFuZCBhc3NlbWJsZXMgYSBzeW1ib2wncyB2aXNpYmlsaXR5IGludG8KLSAgIHRoZSBzdF9vdGhlciBmaWVsZC4gIFRoZSBTVFZfIGRlZmluZXMgc3BlY2lmaWN5IHRoZSBhY3R1YWwgdmlzaWJpbGl0eS4gICovCi0KLSNkZWZpbmUgRUxGX1NUX1ZJU0lCSUxJVFkodikJCSgodikgJiAweDMpCi0vKiBUaGUgcmVtYWluaW5nIGJpdHMgaW4gdGhlIHN0X290aGVyIGZpZWxkIGFyZSBub3QgY3VycmVudGx5IHVzZWQuCi0gICBUaGV5IHNob3VsZCBiZSBzZXQgdG8gemVyby4gICovCi0KLSNkZWZpbmUgRUxGMzJfU1RfVklTSUJJTElUWSAgRUxGX1NUX1ZJU0lCSUxJVFkKLSNkZWZpbmUgRUxGNjRfU1RfVklTSUJJTElUWSAgRUxGX1NUX1ZJU0lCSUxJVFkKLQotCi0jZGVmaW5lIFNUTl9VTkRFRgkwCQkvKiB1bmRlZmluZWQgc3ltYm9sIGluZGV4ICovCi0KLSNkZWZpbmUgU1RCX0xPQ0FMCTAJCS8qIFN5bWJvbCBub3QgdmlzaWJsZSBvdXRzaWRlIG9iaiAqLwotI2RlZmluZSBTVEJfR0xPQkFMCTEJCS8qIFN5bWJvbCB2aXNpYmxlIG91dHNpZGUgb2JqICovCi0jZGVmaW5lIFNUQl9XRUFLCTIJCS8qIExpa2UgZ2xvYmFscywgbG93ZXIgcHJlY2VkZW5jZSAqLwotI2RlZmluZSBTVEJfTE9PUyAgICAgICAgMTAJCS8qIE9TLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfSElPUyAgICAgICAgMTIJCS8qIE9TLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfTE9QUk9DCTEzCQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0hJUFJPQwkxNQkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0KLSNkZWZpbmUgU1RUX05PVFlQRQkwCQkvKiBTeW1ib2wgdHlwZSBpcyB1bnNwZWNpZmllZCAqLwotI2RlZmluZSBTVFRfT0JKRUNUCTEJCS8qIFN5bWJvbCBpcyBhIGRhdGEgb2JqZWN0ICovCi0jZGVmaW5lIFNUVF9GVU5DCTIJCS8qIFN5bWJvbCBpcyBhIGNvZGUgb2JqZWN0ICovCi0jZGVmaW5lIFNUVF9TRUNUSU9OCTMJCS8qIFN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uICovCi0jZGVmaW5lIFNUVF9GSUxFCTQJCS8qIFN5bWJvbCBnaXZlcyBhIGZpbGUgbmFtZSAqLwotI2RlZmluZSBTVFRfQ09NTU9OCTUJCS8qIEFuIHVuaW5pdGlhbGlzZWQgY29tbW9uIGJsb2NrICovCi0jZGVmaW5lIFNUVF9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMsIHdoaWNoIG1heSBzaG93IHVwIGluIHN0X3NobmR4IGZpZWxkcywgYW1vbmcKLSAgIG90aGVyIHBsYWNlcy4gKi8KLQotI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gcmVmZXJlbmNlICovCi0jZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0jZGVmaW5lIFNITl9MT1BST0MJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9ISVBST0MJMHhGRjFGCQkvKiBFbmQgcmFuZ2Ugb2YgYXBwbC1zcGVjaWZpYyAqLwotI2RlZmluZSBTSE5fTE9PUyAgICAgICAgMHhGRjIwCQkvKiBPUyBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNITl9ISU9TICAgICAgICAweEZGM0YJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hOX0FCUwkJMHhGRkYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBTSE5fQ09NTU9OCTB4RkZGMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgaW4gY29tbW9uICovCi0jZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhGRkZGCQkvKiBFbmQgcmFuZ2Ugb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBjb250cm9sIGhvdyBhIHN5bWJvbCBtYXkgYmUgYWNjZXNzZWQgb25jZSBpdCBoYXMKLSAgIGJlY29tZSBwYXJ0IG9mIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuICAqLwotCQkJCQkgICAKLSNkZWZpbmUgU1RWX0RFRkFVTFQJMAkJLyogVmlzaWJpbGl0eSBpcyBzcGVjaWZpZWQgYnkgYmluZGluZyB0eXBlICovCi0jZGVmaW5lIFNUVl9JTlRFUk5BTAkxCQkvKiBPUyBzcGVjaWZpYyB2ZXJzaW9uIG9mIFNUVl9ISURERU4gKi8KLSNkZWZpbmUgU1RWX0hJRERFTgkyCQkvKiBDYW4gb25seSBiZSBzZWVuIGluc2lkZSBjdXJyZWN0IGNvbXBvbmVudCAqLwotI2RlZmluZSBTVFZfUFJPVEVDVEVECTMJCS8qIFRyZWF0IGFzIFNUQl9MT0NBTCBpbnNpZGUgY3VycmVudCBjb21wb25lbnQgKi8KLQkJCQkJICAgCi0KLS8qIHJlbG9jYXRpb24gaW5mbyBoYW5kbGluZyBtYWNyb3MgKi8KLQotI2RlZmluZSBFTEYzMl9SX1NZTShpKQkJKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9SX1RZUEUoaSkJCSgoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8ocyx0KQkoKChzKSA8PCA4KSArICgodCkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJKChpKSA+PiAzMikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkoKGkpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgRUxGNjRfUl9JTkZPKHMsdCkJKCgoYmZkX3ZtYSkgKHMpIDw8IDMyKSArIChiZmRfdm1hKSAodCkpCi0KLS8qIER5bmFtaWMgc2VjdGlvbiB0YWdzICovCi0KLSNkZWZpbmUgRFRfTlVMTAkJMAotI2RlZmluZSBEVF9ORUVERUQJMQotI2RlZmluZSBEVF9QTFRSRUxTWgkyCi0jZGVmaW5lIERUX1BMVEdPVAkzCi0jZGVmaW5lIERUX0hBU0gJCTQKLSNkZWZpbmUgRFRfU1RSVEFCCTUKLSNkZWZpbmUgRFRfU1lNVEFCCTYKLSNkZWZpbmUgRFRfUkVMQQkJNwotI2RlZmluZSBEVF9SRUxBU1oJOAotI2RlZmluZSBEVF9SRUxBRU5UCTkKLSNkZWZpbmUgRFRfU1RSU1oJMTAKLSNkZWZpbmUgRFRfU1lNRU5UCTExCi0jZGVmaW5lIERUX0lOSVQJCTEyCi0jZGVmaW5lIERUX0ZJTkkJCTEzCi0jZGVmaW5lIERUX1NPTkFNRQkxNAotI2RlZmluZSBEVF9SUEFUSAkxNQotI2RlZmluZSBEVF9TWU1CT0xJQwkxNgotI2RlZmluZSBEVF9SRUwJCTE3Ci0jZGVmaW5lIERUX1JFTFNaCTE4Ci0jZGVmaW5lIERUX1JFTEVOVAkxOQotI2RlZmluZSBEVF9QTFRSRUwJMjAKLSNkZWZpbmUgRFRfREVCVUcJMjEKLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgotI2RlZmluZSBEVF9KTVBSRUwJMjMKLSNkZWZpbmUgRFRfQklORF9OT1cgICAgIDI0Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVkgICAyNQotI2RlZmluZSBEVF9GSU5JX0FSUkFZICAgMjYKLSNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaIDI3Ci0jZGVmaW5lIERUX0ZJTklfQVJSQVlTWiAyOAotI2RlZmluZSBEVF9SVU5QQVRIICAgICAgMjkKLSNkZWZpbmUgRFRfRkxBR1MgICAgICAgIDMwCi0KLSNkZWZpbmUgRFRfRU5DT0RJTkcgICAgIDMyCi0jZGVmaW5lIERUX1BSRUlOSVRfQVJSQVkgICAzMgotI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZU1ogMzMKLQotLyogTm90ZSwgdGhlIE9jdCA0LCAxOTk5IGRyYWZ0IG9mIHRoZSBFTEYgQUJJIGNoYW5nZWQgdGhlIHZhbHVlcwotICAgZm9yIERUX0xPT1MgYW5kIERUX0hJT1MuICBTb21lIGltcGxlbWVudGF0aW9ucyBob3dldmVyLCB1c2UKLSAgIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSBuZXcgcmFuZ2UgKHNlZSBiZWxvdykuICAqLwotI2RlZmluZSBPTERfRFRfTE9PUwkweDYwMDAwMDAwCi0jZGVmaW5lIERUX0xPT1MgICAgICAgICAweDYwMDAwMDBkCi0jZGVmaW5lIERUX0hJT1MgICAgICAgICAweDZmZmYwMDAwCi0jZGVmaW5lIE9MRF9EVF9ISU9TICAgICAweDZmZmZmZmZmCi0KLSNkZWZpbmUgRFRfTE9QUk9DICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgRFRfSElQUk9DICAgICAgIDB4N2ZmZmZmZmYKLQotLyogVGhlIG5leHQgZm91ciBkeW5hbWljIHRhZ3MgYXJlIHVzZWQgb24gU29sYXJpcy4gIFdlIHN1cHBvcnQgdGhlbQotICAgZXZlcnl3aGVyZS4gIE5vdGUgdGhlc2UgdmFsdWVzIGxpZSBvdXRzaWRlIG9mIHRoZSAobmV3KSByYW5nZSBmb3IKLSAgIE9TIHNwZWNpZmljIHZhbHVlcy4gIFRoaXMgaXMgYSBkZWxpYmVyYXRlIHNwZWNpYWwgY2FzZSBhbmQgd2UKLSAgIG1haW50YWluIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gICovCi0jZGVmaW5lIERUX1ZBTFJOR0xPCTB4NmZmZmZkMDAKLSNkZWZpbmUgRFRfUExUUEFEU1oJMHg2ZmZmZmRmOQotI2RlZmluZSBEVF9NT1ZFRU5UCTB4NmZmZmZkZmEKLSNkZWZpbmUgRFRfTU9WRVNaCTB4NmZmZmZkZmIKLSNkZWZpbmUgRFRfRkVBVFVSRV8xCTB4NmZmZmZkZmMKLSNkZWZpbmUgRFRfUE9TRkxBR18xCTB4NmZmZmZkZmQKLSNkZWZpbmUgRFRfU1lNSU5TWgkweDZmZmZmZGZlCi0jZGVmaW5lIERUX1NZTUlORU5UCTB4NmZmZmZkZmYKLSNkZWZpbmUgRFRfVkFMUk5HSEkJMHg2ZmZmZmRmZgotCi0jZGVmaW5lIERUX0FERFJSTkdMTwkweDZmZmZmZTAwCi0jZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgotI2RlZmluZSBEVF9BRERSUk5HSEkJMHg2ZmZmZmVmZgotCi0jZGVmaW5lIERUX1JFTEFDT1VOVAkweDZmZmZmZmY5Ci0jZGVmaW5lIERUX1JFTENPVU5UCTB4NmZmZmZmZmEKLSNkZWZpbmUgRFRfRkxBR1NfMQkweDZmZmZmZmZiCi0jZGVmaW5lIERUX1ZFUkRFRgkweDZmZmZmZmZjCi0jZGVmaW5lIERUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCi0jZGVmaW5lIERUX1ZFUk5FRUQJMHg2ZmZmZmZmZQotI2RlZmluZSBEVF9WRVJORUVETlVNCTB4NmZmZmZmZmYKLQotLyogVGhpcyB0YWcgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTb2xhcmlzIHZlcnNpb24gc2NoZW1lLiAgKi8KLSNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKLQotI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAotI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgotCi0vKiBUaGVzZSBzZWN0aW9uIHRhZ3MgYXJlIHVzZWQgb24gU29sYXJpcy4gIFdlIHN1cHBvcnQgdGhlbQotICAgZXZlcnl3aGVyZSwgYW5kIGhvcGUgdGhleSBkbyBub3QgY29uZmxpY3QuICAqLwotCi0jZGVmaW5lIERUX0FVWElMSUFSWQkweDdmZmZmZmZkCi0jZGVmaW5lIERUX1VTRUQJCTB4N2ZmZmZmZmUKLSNkZWZpbmUgRFRfRklMVEVSCTB4N2ZmZmZmZmYKLQotLyogVmFsdWVzIHVzZWQgaW4gRFRfRkVBVFVSRV8xIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgRFRGXzFfUEFSSU5JVAkweDAwMDAwMDAxCi0KLS8qIEZsYWcgdmFsdWVzIHVzZWQgaW4gdGhlIERUX1BPU0ZMQUdfMSAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERGX1AxX0xBWllMT0FECTB4MDAwMDAwMDEKLSNkZWZpbmUgREZfUDFfR1JPVVBQRVJNCTB4MDAwMDAwMDIKLQotLyogRmxhZyB2YWx1ZSBpbiBpbiB0aGUgRFRfMV9GTEFHUyAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERGXzFfTk9XCTB4MDAwMDAwMDEKLSNkZWZpbmUgREZfMV9HTE9CQUwJMHgwMDAwMDAwMgotI2RlZmluZSBERl8xX0dST1VQCTB4MDAwMDAwMDQKLSNkZWZpbmUgREZfMV9OT0RFTEVURQkweDAwMDAwMDA4Ci0jZGVmaW5lIERGXzFfTE9BREZMVFIJMHgwMDAwMDAxMAotI2RlZmluZSBERl8xX0lOSVRGSVJTVAkweDAwMDAwMDIwCi0jZGVmaW5lIERGXzFfTk9PUEVOCTB4MDAwMDAwNDAKLSNkZWZpbmUgREZfMV9PUklHSU4JMHgwMDAwMDA4MAotI2RlZmluZSBERl8xX0RJUkVDVAkweDAwMDAwMTAwCi0jZGVmaW5lIERGXzFfVFJBTlMJMHgwMDAwMDIwMAotI2RlZmluZSBERl8xX0lOVEVSUE9TRQkweDAwMDAwNDAwCi0KLS8qIEZsYWcgdmFsdWVzIGZvciB0aGUgRFRfRkxBR1MgZW50cnkuICAqLwotI2RlZmluZSBERl9PUklHSU4JKDEgPDwgMCkKLSNkZWZpbmUgREZfU1lNQk9MSUMJKDEgPDwgMSkKLSNkZWZpbmUgREZfVEVYVFJFTAkoMSA8PCAyKQotI2RlZmluZSBERl9CSU5EX05PVwkoMSA8PCAzKQotCi0vKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfREVGX05PTkUJCTAKLSNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcHBlYXIgaW4gdGhlIHZkX2ZsYWdzIGZpZWxkIG9mIGEgRWxmMzJfVmVyZGVmCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9GTEdfQkFTRQkJMHgxCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkJMHgyCi0KLS8qIFRoZXNlIHNwZWNpYWwgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBhbiBFbGYzMl9WZXJzeW0gZmllbGQuICAqLwotCi0jZGVmaW5lIFZFUl9ORFhfTE9DQUwJCTAKLSNkZWZpbmUgVkVSX05EWF9HTE9CQUwJCTEKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJuZWVkCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9ORUVEX05PTkUJCTAKLSNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVAkxCi0KLS8qIFRoaXMgZmxhZyBhcHBlYXJzIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gIEl0IG1lYW5zIHRoYXQgdGhlIHN5bWJvbAotICAgaXMgaGlkZGVuLCBhbmQgaXMgb25seSB2aXNpYmxlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBudW1iZXIuCi0gICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLSNkZWZpbmUgVkVSU1lNX0hJRERFTgkJMHg4MDAwCi0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgZm9yIHRoZSByZXN0IG9mIHRoZSBWZXJzeW0gaW5mb3JtYXRpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9WRVJTSU9OCQkweDdmZmYKLQotLyogVGhpcyBpcyBhIHNwZWNpYWwgdG9rZW4gd2hpY2ggYXBwZWFycyBhcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuICBJdAotICAgaW5kaWN0ZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBhCi0gICB2ZXJzaW9uIG5vZGUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgYWN0dWFsIG5hbWUuICBUaGlzIGlzIGEgR05VCi0gICBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgdGhlIHN5bWJvbCBuYW1lIGBzdGF0QHZlcjInIGlzIHRha2VuIHRvCi0gICBtZWFuIHRoZSBzeW1ib2wgYHN0YXQnIGluIHZlcnNpb24gYHZlcjInLiAgKi8KLQotI2RlZmluZSBFTEZfVkVSX0NIUgknQCcKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotI2VuZGlmIC8qIF9FTEZfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QxMHYuaCBiL2luY2x1ZGUvZWxmL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNzljOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QxMFZfSAotI2RlZmluZSBfRUxGX0QxMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJhZDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGQzMHYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRDMwVl9ICi0jZGVmaW5lIF9FTEZfRDMwVl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMzB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUwsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUxfUiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTUsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTF9SLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMSwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMX1IsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfUENSRUwsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9OT1JNQUwsIDEyKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3MmNkNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotCi0gICBXcml0dGVuIGJ5IFJvbiBHdWlsbWV0dGUgKHJmZ0BuY2QuY29tKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIChhIHB1YmxpYyBkb2N1bWVudCkKLSAgIFJldmlzaW9uIDEuMC4xIChBcHJpbCA4LCAxOTkyKSBkZXZlbG9wZWQgYnkgdGhlIFVOSVggSW50ZXJuYXRpb25hbAotICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgKFVJL1BMU0lHKSBhbmQgZGlzdHJpYnV0ZWQKLSAgIGJ5IFVOSVggSW50ZXJuYXRpb25hbC4gIENvcGllcyBvZiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGF2YWlsYWJsZSBmcm9tCi0gICBVTklYIEludGVybmF0aW9uYWwsIDIwIFdhdGVydmlldyBCb3VsZXZhcmQsIFBhcnNpcHBhbnksIE5KLCAwNzA1NC4KLSovCi0KLSNpZm5kZWYgX0VMRl9EV0FSRl9ICi0jZGVmaW5lIF9FTEZfRFdBUkZfSAotCi0vKiBUYWcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90YWcgewotICAgIFRBR19wYWRkaW5nCQkJPSAweDAwMDAsCi0gICAgVEFHX2FycmF5X3R5cGUJCT0gMHgwMDAxLAotICAgIFRBR19jbGFzc190eXBlCQk9IDB4MDAwMiwKLSAgICBUQUdfZW50cnlfcG9pbnQJCT0gMHgwMDAzLAotICAgIFRBR19lbnVtZXJhdGlvbl90eXBlCT0gMHgwMDA0LAotICAgIFRBR19mb3JtYWxfcGFyYW1ldGVyCT0gMHgwMDA1LAotICAgIFRBR19nbG9iYWxfc3Vicm91dGluZQk9IDB4MDAwNiwKLSAgICBUQUdfZ2xvYmFsX3ZhcmlhYmxlCQk9IDB4MDAwNywKLSAgICAJCQkJLyogMHgwMDA4IC0tIHJlc2VydmVkICovCi0JCQkJLyogMHgwMDA5IC0tIHJlc2VydmVkICovCi0gICAgVEFHX2xhYmVsCQkJPSAweDAwMGEsCi0gICAgVEFHX2xleGljYWxfYmxvY2sJCT0gMHgwMDBiLAotICAgIFRBR19sb2NhbF92YXJpYWJsZQkJPSAweDAwMGMsCi0gICAgVEFHX21lbWJlcgkJCT0gMHgwMDBkLAotCQkJCS8qIDB4MDAwZSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19wb2ludGVyX3R5cGUJCT0gMHgwMDBmLAotICAgIFRBR19yZWZlcmVuY2VfdHlwZQkJPSAweDAwMTAsCi0gICAgVEFHX2NvbXBpbGVfdW5pdAkJPSAweDAwMTEsCi0gICAgVEFHX3N0cmluZ190eXBlCQk9IDB4MDAxMiwKLSAgICBUQUdfc3RydWN0dXJlX3R5cGUJCT0gMHgwMDEzLAotICAgIFRBR19zdWJyb3V0aW5lCQk9IDB4MDAxNCwKLSAgICBUQUdfc3Vicm91dGluZV90eXBlCQk9IDB4MDAxNSwKLSAgICBUQUdfdHlwZWRlZgkJCT0gMHgwMDE2LAotICAgIFRBR191bmlvbl90eXBlCQk9IDB4MDAxNywKLSAgICBUQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwk9IDB4MDAxOCwKLSAgICBUQUdfdmFyaWFudAkJCT0gMHgwMDE5LAotICAgIFRBR19jb21tb25fYmxvY2sJCT0gMHgwMDFhLAotICAgIFRBR19jb21tb25faW5jbHVzaW9uCT0gMHgwMDFiLAotICAgIFRBR19pbmhlcml0YW5jZQkJPSAweDAwMWMsCi0gICAgVEFHX2lubGluZWRfc3Vicm91dGluZQk9IDB4MDAxZCwKLSAgICBUQUdfbW9kdWxlCQkJPSAweDAwMWUsCi0gICAgVEFHX3B0cl90b19tZW1iZXJfdHlwZQk9IDB4MDAxZiwKLSAgICBUQUdfc2V0X3R5cGUJCT0gMHgwMDIwLAotICAgIFRBR19zdWJyYW5nZV90eXBlCQk9IDB4MDAyMSwKLSAgICBUQUdfd2l0aF9zdG10CQk9IDB4MDAyMiwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zICovCi0KLSAgICBUQUdfZm9ybWF0X2xhYmVsCQk9IDB4ODAwMCwgIC8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgVEFHX25hbWVsaXN0CQk9IDB4ODAwMSwgIC8qIEZvciBGb3J0cmFuIDkwICovCi0gICAgVEFHX2Z1bmN0aW9uX3RlbXBsYXRlCT0gMHg4MDAyLCAgLyogZm9yIEMrKyAqLwotICAgIFRBR19jbGFzc190ZW1wbGF0ZQkJPSAweDgwMDMgICAvKiBmb3IgQysrICovCi19OwotCi0jZGVmaW5lIFRBR19sb191c2VyCTB4ODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBUQUdfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0jZGVmaW5lIFRBR19zb3VyY2VfZmlsZSBUQUdfY29tcGlsZV91bml0ICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZm9ybSB7Ci0gICAgRk9STV9BRERSCT0gMHgxLAotICAgIEZPUk1fUkVGCT0gMHgyLAotICAgIEZPUk1fQkxPQ0syCT0gMHgzLAotICAgIEZPUk1fQkxPQ0s0CT0gMHg0LAotICAgIEZPUk1fREFUQTIJPSAweDUsCi0gICAgRk9STV9EQVRBNAk9IDB4NiwKLSAgICBGT1JNX0RBVEE4CT0gMHg3LAotICAgIEZPUk1fU1RSSU5HCT0gMHg4Ci19OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUgewotICAgIEFUX3NpYmxpbmcJCQk9ICgweDAwMTB8Rk9STV9SRUYpLAotICAgIEFUX2xvY2F0aW9uCQkJPSAoMHgwMDIwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9uYW1lCQkJPSAoMHgwMDMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9mdW5kX3R5cGUJCT0gKDB4MDA1MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9tb2RfZnVuZF90eXBlCQk9ICgweDAwNjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX3VzZXJfZGVmX3R5cGUJCT0gKDB4MDA3MHxGT1JNX1JFRiksCi0gICAgQVRfbW9kX3VfZF90eXBlCQk9ICgweDAwODB8Rk9STV9CTE9DSzIpLAotICAgIEFUX29yZGVyaW5nCQkJPSAoMHgwMDkwfEZPUk1fREFUQTIpLAotICAgIEFUX3N1YnNjcl9kYXRhCQk9ICgweDAwYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2J5dGVfc2l6ZQkJPSAoMHgwMGIwfEZPUk1fREFUQTQpLAotICAgIEFUX2JpdF9vZmZzZXQJCT0gKDB4MDBjMHxGT1JNX0RBVEEyKSwKLSAgICBBVF9iaXRfc2l6ZQkJCT0gKDB4MDBkMHxGT1JNX0RBVEE0KSwKLQkJCQkvKiAoMHgwMGUwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9lbGVtZW50X2xpc3QJCT0gKDB4MDBmMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfc3RtdF9saXN0CQk9ICgweDAxMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfbG93X3BjCQkJPSAoMHgwMTEwfEZPUk1fQUREUiksCi0gICAgQVRfaGlnaF9wYwkJCT0gKDB4MDEyMHxGT1JNX0FERFIpLAotICAgIEFUX2xhbmd1YWdlCQkJPSAoMHgwMTMwfEZPUk1fREFUQTQpLAotICAgIEFUX21lbWJlcgkJCT0gKDB4MDE0MHxGT1JNX1JFRiksCi0gICAgQVRfZGlzY3IJCQk9ICgweDAxNTB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyX3ZhbHVlCQk9ICgweDAxNjB8Rk9STV9CTE9DSzIpLAotCQkJCS8qICgweDAxNzB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotCQkJCS8qICgweDAxODB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotICAgIEFUX3N0cmluZ19sZW5ndGgJCT0gKDB4MDE5MHxGT1JNX0JMT0NLMiksCi0gICAgQVRfY29tbW9uX3JlZmVyZW5jZQkJPSAoMHgwMWEwfEZPUk1fUkVGKSwKLSAgICBBVF9jb21wX2RpcgkJCT0gKDB4MDFiMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX3N0cmluZwk9ICgweDAxYzB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhMgk9ICgweDAxYzB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE0CT0gKDB4MDFjMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTgJPSAoMHgwMWMwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9ibG9jazIJPSAoMHgwMWMwfEZPUk1fQkxPQ0syKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2s0CT0gKDB4MDFjMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfY29udGFpbmluZ190eXBlCQk9ICgweDAxZDB8Rk9STV9SRUYpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2FkZHIJPSAoMHgwMWUwfEZPUk1fQUREUiksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTIJPSAoMHgwMWUwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGE0CT0gKDB4MDFlMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhOAk9ICgweDAxZTB8Rk9STV9EQVRBOCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfc3RyaW5nCT0gKDB4MDFlMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnJpZW5kcwkJCT0gKDB4MDFmMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfaW5saW5lCQkJPSAoMHgwMjAwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9pc19vcHRpb25hbAkJPSAoMHgwMjEwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfcmVmCT0gKDB4MDIyMHxGT1JNX1JFRiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGEyCT0gKDB4MDIyMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTQJPSAoMHgwMjIwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhOAk9ICgweDAyMjB8Rk9STV9EQVRBOCksCi0gICAgQVRfcHJpdmF0ZQkJCT0gKDB4MDI0MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvZHVjZXIJCQk9ICgweDAyNTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2dyYW0JCQk9ICgweDAyMzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb3RlY3RlZAkJPSAoMHgwMjYwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90b3R5cGVkCQk9ICgweDAyNzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1YmxpYwkJCT0gKDB4MDI4MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHVyZV92aXJ0dWFsCQk9ICgweDAyOTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3JldHVybl9hZGRyCQk9ICgweDAyYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2Fic3RyYWN0X29yaWdpbgkJPSAoMHgwMmIwfEZPUk1fUkVGKSwKLSAgICBBVF9zdGFydF9zY29wZQkJPSAoMHgwMmMwfEZPUk1fREFUQTQpLAotICAgIEFUX3N0cmlkZV9zaXplCQk9ICgweDAyZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX3JlZgk9ICgweDAyZjB8Rk9STV9SRUYpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhMgk9ICgweDAyZjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE0CT0gKDB4MDJmMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTgJPSAoMHgwMmYwfEZPUk1fREFUQTgpLAotICAgIEFUX3ZpcnR1YWwJCQk9ICgweDAzMDB8Rk9STV9TVFJJTkcpLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotCi0gICAgQVRfc2ZfbmFtZXMJCQk9ICgweDgwMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2luZm8JCQk9ICgweDgwMTB8Rk9STV9EQVRBNCksCi0gICAgQVRfbWFjX2luZm8JCQk9ICgweDgwMjB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2Nvb3JkcwkJPSAoMHg4MDMwfEZPUk1fREFUQTQpLAotICAgIEFUX2JvZHlfYmVnaW4JCT0gKDB4ODA0MHxGT1JNX0FERFIpLAotICAgIEFUX2JvZHlfZW5kCQkJPSAoMHg4MDUwfEZPUk1fQUREUikKLX07Ci0KLSNkZWZpbmUgQVRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgQVRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIExvY2F0aW9uIGF0b20gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tIHsKLSAgICBPUF9SRUcJPSAweDAxLAotICAgIE9QX0JBU0VSRUcJPSAweDAyLAotICAgIE9QX0FERFIJPSAweDAzLAotICAgIE9QX0NPTlNUCT0gMHgwNCwKLSAgICBPUF9ERVJFRjIJPSAweDA1LAotICAgIE9QX0RFUkVGNAk9IDB4MDYsCi0gICAgT1BfQURECT0gMHgwNwotfTsKLQotI2RlZmluZSBPUF9MT19VU0VSCTB4ODAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgT1BfSElfVVNFUgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBGdW5kYW1lbnRhbCB0eXBlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSB7Ci0gICAgRlRfY2hhcgkJPSAweDAwMDEsCi0gICAgRlRfc2lnbmVkX2NoYXIJPSAweDAwMDIsCi0gICAgRlRfdW5zaWduZWRfY2hhcgk9IDB4MDAwMywKLSAgICBGVF9zaG9ydAkJPSAweDAwMDQsCi0gICAgRlRfc2lnbmVkX3Nob3J0CT0gMHgwMDA1LAotICAgIEZUX3Vuc2lnbmVkX3Nob3J0CT0gMHgwMDA2LAotICAgIEZUX2ludGVnZXIJCT0gMHgwMDA3LAotICAgIEZUX3NpZ25lZF9pbnRlZ2VyCT0gMHgwMDA4LAotICAgIEZUX3Vuc2lnbmVkX2ludGVnZXIJPSAweDAwMDksCi0gICAgRlRfbG9uZwkJPSAweDAwMGEsCi0gICAgRlRfc2lnbmVkX2xvbmcJPSAweDAwMGIsCi0gICAgRlRfdW5zaWduZWRfbG9uZwk9IDB4MDAwYywKLSAgICBGVF9wb2ludGVyCQk9IDB4MDAwZCwgIC8qIGFuIGFsaWFzIGZvciAodm9pZCAqKSAqLwotICAgIEZUX2Zsb2F0CQk9IDB4MDAwZSwKLSAgICBGVF9kYmxfcHJlY19mbG9hdAk9IDB4MDAwZiwKLSAgICBGVF9leHRfcHJlY19mbG9hdAk9IDB4MDAxMCwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9jb21wbGV4CQk9IDB4MDAxMSwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9kYmxfcHJlY19jb21wbGV4CT0gMHgwMDEyLCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCQkJLyogMHgwMDEzIC0tIHJlc2VydmVkICovCi0gICAgRlRfdm9pZAkJPSAweDAwMTQsCi0gICAgRlRfYm9vbGVhbgkJPSAweDAwMTUsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZXh0X3ByZWNfY29tcGxleAk9IDB4MDAxNiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9sYWJlbAkJPSAweDAwMTcsCi0gIAotICAgIC8qIEdOVSBleHRlbnNpb25zCi0gICAgICAgVGhlIGxvdyBvcmRlciBieXRlIG11c3QgaW5kaWNhdGUgdGhlIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHR5cGUuCi0gICAgICAgQWxsIG9mIHRoZXNlIHR5cGVzIHdpbGwgcHJvYmFibHkgYnJlYWsgImNsYXNzaWMiIHN2cjQgU0RCICovCi0KLSAgICBGVF9sb25nX2xvbmcJPSAweDgwMDgsCi0gICAgRlRfc2lnbmVkX2xvbmdfbG9uZwk9IDB4ODEwOCwKLSAgICBGVF91bnNpZ25lZF9sb25nX2xvbmcgPSAweDgyMDgsCi0KLSAgICBGVF9pbnQ4CQk9IDB4OTAwMSwKLSAgICBGVF9zaWduZWRfaW50OAk9IDB4OTEwMSwKLSAgICBGVF91bnNpZ25lZF9pbnQ4CT0gMHg5MjAxLAotICAgIEZUX2ludDE2CQk9IDB4OTMwMiwKLSAgICBGVF9zaWduZWRfaW50MTYJPSAweDk0MDIsCi0gICAgRlRfdW5zaWduZWRfaW50MTYJPSAweDk1MDIsCi0gICAgRlRfaW50MzIJCT0gMHg5NjA0LAotICAgIEZUX3NpZ25lZF9pbnQzMgk9IDB4OTcwNCwKLSAgICBGVF91bnNpZ25lZF9pbnQzMgk9IDB4OTgwNCwKLSAgICBGVF9pbnQ2NAkJPSAweDk5MDgsCi0gICAgRlRfc2lnbmVkX2ludDY0CT0gMHg5YTA4LAotICAgIEZUX3Vuc2lnbmVkX2ludDY0CT0gMHg5YjA4LAotCi0gICAgRlRfcmVhbDMyCQk9IDB4YTAwNCwKLSAgICBGVF9yZWFsNjQJCT0gMHhhMTA4LAotICAgIEZUX3JlYWw5NgkJPSAweGEyMGMsCi0gICAgRlRfcmVhbDEyOAkJPSAweGEzMTAKLX07Ci0KLSNkZWZpbmUgRlRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRlRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uIGRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIFR5cGUgbW9kaWZpZXIgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90eXBlX21vZGlmaWVyIHsKLSAgICBNT0RfcG9pbnRlcl90bwk9IDB4MDEsCi0gICAgTU9EX3JlZmVyZW5jZV90bwk9IDB4MDIsCi0gICAgTU9EX2NvbnN0CQk9IDB4MDMsCi0gICAgTU9EX3ZvbGF0aWxlCT0gMHgwNAotfTsKLQotI2RlZmluZSBNT0RfbG9fdXNlcgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE1PRF9oaV91c2VyCTB4ZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIEFycmF5IG9yZGVyaW5nIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nIHsKLSAgICBPUkRfcm93X21ham9yCT0gMCwKLSAgICBPUkRfY29sX21ham9yCT0gMQotfTsKLQotLyogQXJyYXkgc3Vic2NyaXB0IGZvcm1hdCBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3N1YnNjcl9kYXRhX2Zvcm1hdHMgewotICAgIEZNVF9GVF9DX0MJPSAweDAsCi0gICAgRk1UX0ZUX0NfWAk9IDB4MSwKLSAgICBGTVRfRlRfWF9DCT0gMHgyLAotICAgIEZNVF9GVF9YX1gJPSAweDMsCi0gICAgRk1UX1VUX0NfQwk9IDB4NCwKLSAgICBGTVRfVVRfQ19YCT0gMHg1LAotICAgIEZNVF9VVF9YX0MJPSAweDYsCi0gICAgRk1UX1VUX1hfWAk9IDB4NywKLSAgICBGTVRfRVQJPSAweDgKLX07Ci0KLS8qIERlcml2ZWQgZnJvbSBhYm92ZSBmb3IgZWFzZSBvZiB1c2UuICAqLwotCi0jZGVmaW5lIEZNVF9DT0RFKF9GVU5EQU1FTlRBTF9UWVBFX1AsIF9VQl9DT05TVF9QLCBfTEJfQ09OU1RfUCkgXAotICgoKF9GVU5EQU1FTlRBTF9UWVBFX1ApID8gMCA6IDQpCVwKLSAgfCAoKF9VQl9DT05TVF9QKSA/IDAgOiAyKQkJXAotICB8ICgoX0xCX0NPTlNUX1ApID8gMCA6IDEpKQotCi0vKiBTb3VyY2UgbGFuZ3VhZ2UgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UgewotICAgIExBTkdfQzg5CQk9IDB4MDAwMDAwMDEsCi0gICAgTEFOR19DCQk9IDB4MDAwMDAwMDIsCi0gICAgTEFOR19BREE4MwkJPSAweDAwMDAwMDAzLAotICAgIExBTkdfQ19QTFVTX1BMVVMJPSAweDAwMDAwMDA0LAotICAgIExBTkdfQ09CT0w3NAk9IDB4MDAwMDAwMDUsCi0gICAgTEFOR19DT0JPTDg1CT0gMHgwMDAwMDAwNiwKLSAgICBMQU5HX0ZPUlRSQU43Nwk9IDB4MDAwMDAwMDcsCi0gICAgTEFOR19GT1JUUkFOOTAJPSAweDAwMDAwMDA4LAotICAgIExBTkdfUEFTQ0FMODMJPSAweDAwMDAwMDA5LAotICAgIExBTkdfTU9EVUxBMgk9IDB4MDAwMDAwMGEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgTEFOR19DSElMTAkJPSAweDAwMDA5YWYzLAkvKiByYW5kb20gdmFsdWUgZm9yIEdOVSBDaGlsbCAqLwotICAgIExBTkdfSkFWQQkJPSAweDAwMDA5YWY0ICAgIC8qIHJhbmRvbSB2YWx1ZSArIDEgZm9yIEdOVSBKYXZhICovCi19OwotCi0jZGVmaW5lIExBTkdfbG9fdXNlcgkweDAwMDA4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIExBTkdfaGlfdXNlcgkweDAwMDBmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIEdOVSAibWFjaW5mbyIgZXh0ZW5zaW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlIHsKLSAgICBNQUNJTkZPX3N0YXJ0CT0gJ3MnLAotICAgIE1BQ0lORk9fcmVzdW1lCT0gJ3InLAotICAgIE1BQ0lORk9fZGVmaW5lCT0gJ2QnLAotICAgIE1BQ0lORk9fdW5kZWYJPSAndScKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRmYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQotICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCi0gICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgotCi0gICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCi0gICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLwotCi0jaWZuZGVmIF9FTEZfRFdBUkYyX0gKLSNkZWZpbmUgX0VMRl9EV0FSRjJfSAotCi0vKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOwotICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOwotICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nICBwbl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOwotCi0vKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKLX0KLURXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7Ci0KLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnCi0gIHsKLSAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCi0gICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAotICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKLSAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAotICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKLSAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCi0gICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKLSAgICBEV19UQUdfbGFiZWwgPSAweDBhLAotICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKLSAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKLSAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKLSAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAotICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAotICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCi0gICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKLSAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKLSAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCi0gICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAotICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKLSAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCi0gICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCi0gICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAotICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCi0gICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCi0gICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCi0gICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCi0gICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKLSAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCi0gICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCi0gICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCi0gICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCi0gICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKLSAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCi0gICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKLSAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCi0gICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCi0gICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCi0gICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKLSAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCi0gICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKLSAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCi0gICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCi0gICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKLSAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKLSAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKLSAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAotICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KLSAgfTsKLQotI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKLSNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCi0KLS8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLwotI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKLSNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCi0KLS8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfZm9ybQotICB7Ci0gICAgRFdfRk9STV9hZGRyID0gMHgwMSwKLSAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCi0gICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAotICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAotICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAotICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAotICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKLSAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKLSAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCi0gICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCi0gICAgRFdfRk9STV9mbGFnID0gMHgwYywKLSAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKLSAgICBEV19GT1JNX3N0cnAgPSAweDBlLAotICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAotICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAotICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCi0gICAgRFdfRk9STV9yZWYyID0gMHgxMiwKLSAgICBEV19GT1JNX3JlZjQgPSAweDEzLAotICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCi0gICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAotICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQVRfc2libGluZyA9IDB4MDEsCi0gICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAotICAgIERXX0FUX25hbWUgPSAweDAzLAotICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKLSAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCi0gICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKLSAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKLSAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCi0gICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKLSAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAotICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCi0gICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCi0gICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAotICAgIERXX0FUX21lbWJlciA9IDB4MTQsCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAotICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKLSAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAotICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAotICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAotICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAotICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAotICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCi0gICAgRFdfQVRfY291bnQgPSAweDM3LAotICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKLSAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCi0gICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKLSAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAotICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKLSAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKLSAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCi0gICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAotICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAotICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCi0gICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKLSAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKLSAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2Ci0gIH07Ci0KLSNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbQotICB7Ci0gICAgRFdfT1BfYWRkciA9IDB4MDMsCi0gICAgRFdfT1BfZGVyZWYgPSAweDA2LAotICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAotICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAotICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAotICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAotICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAotICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAotICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCi0gICAgRFdfT1BfY29uc3RzID0gMHgxMSwKLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAotICAgIERXX09QX3N3YXAgPSAweDE2LAotICAgIERXX09QX3JvdCA9IDB4MTcsCi0gICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKLSAgICBEV19PUF9hYnMgPSAweDE5LAotICAgIERXX09QX2FuZCA9IDB4MWEsCi0gICAgRFdfT1BfZGl2ID0gMHgxYiwKLSAgICBEV19PUF9taW51cyA9IDB4MWMsCi0gICAgRFdfT1BfbW9kID0gMHgxZCwKLSAgICBEV19PUF9tdWwgPSAweDFlLAotICAgIERXX09QX25lZyA9IDB4MWYsCi0gICAgRFdfT1Bfbm90ID0gMHgyMCwKLSAgICBEV19PUF9vciA9IDB4MjEsCi0gICAgRFdfT1BfcGx1cyA9IDB4MjIsCi0gICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAotICAgIERXX09QX3NobCA9IDB4MjQsCi0gICAgRFdfT1Bfc2hyID0gMHgyNSwKLSAgICBEV19PUF9zaHJhID0gMHgyNiwKLSAgICBEV19PUF94b3IgPSAweDI3LAotICAgIERXX09QX2JyYSA9IDB4MjgsCi0gICAgRFdfT1BfZXEgPSAweDI5LAotICAgIERXX09QX2dlID0gMHgyYSwKLSAgICBEV19PUF9ndCA9IDB4MmIsCi0gICAgRFdfT1BfbGUgPSAweDJjLAotICAgIERXX09QX2x0ID0gMHgyZCwKLSAgICBEV19PUF9uZSA9IDB4MmUsCi0gICAgRFdfT1Bfc2tpcCA9IDB4MmYsCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCi0gICAgRFdfT1BfbGl0MSA9IDB4MzEsCi0gICAgRFdfT1BfbGl0MiA9IDB4MzIsCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCi0gICAgRFdfT1BfbGl0NCA9IDB4MzQsCi0gICAgRFdfT1BfbGl0NSA9IDB4MzUsCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCi0gICAgRFdfT1BfbGl0NyA9IDB4MzcsCi0gICAgRFdfT1BfbGl0OCA9IDB4MzgsCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCi0gICAgRFdfT1BfbGl0MTAgPSAweDNhLAotICAgIERXX09QX2xpdDExID0gMHgzYiwKLSAgICBEV19PUF9saXQxMiA9IDB4M2MsCi0gICAgRFdfT1BfbGl0MTMgPSAweDNkLAotICAgIERXX09QX2xpdDE0ID0gMHgzZSwKLSAgICBEV19PUF9saXQxNSA9IDB4M2YsCi0gICAgRFdfT1BfbGl0MTYgPSAweDQwLAotICAgIERXX09QX2xpdDE3ID0gMHg0MSwKLSAgICBEV19PUF9saXQxOCA9IDB4NDIsCi0gICAgRFdfT1BfbGl0MTkgPSAweDQzLAotICAgIERXX09QX2xpdDIwID0gMHg0NCwKLSAgICBEV19PUF9saXQyMSA9IDB4NDUsCi0gICAgRFdfT1BfbGl0MjIgPSAweDQ2LAotICAgIERXX09QX2xpdDIzID0gMHg0NywKLSAgICBEV19PUF9saXQyNCA9IDB4NDgsCi0gICAgRFdfT1BfbGl0MjUgPSAweDQ5LAotICAgIERXX09QX2xpdDI2ID0gMHg0YSwKLSAgICBEV19PUF9saXQyNyA9IDB4NGIsCi0gICAgRFdfT1BfbGl0MjggPSAweDRjLAotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKLSAgICBEV19PUF9saXQzMCA9IDB4NGUsCi0gICAgRFdfT1BfbGl0MzEgPSAweDRmLAotICAgIERXX09QX3JlZzAgPSAweDUwLAotICAgIERXX09QX3JlZzEgPSAweDUxLAotICAgIERXX09QX3JlZzIgPSAweDUyLAotICAgIERXX09QX3JlZzMgPSAweDUzLAotICAgIERXX09QX3JlZzQgPSAweDU0LAotICAgIERXX09QX3JlZzUgPSAweDU1LAotICAgIERXX09QX3JlZzYgPSAweDU2LAotICAgIERXX09QX3JlZzcgPSAweDU3LAotICAgIERXX09QX3JlZzggPSAweDU4LAotICAgIERXX09QX3JlZzkgPSAweDU5LAotICAgIERXX09QX3JlZzEwID0gMHg1YSwKLSAgICBEV19PUF9yZWcxMSA9IDB4NWIsCi0gICAgRFdfT1BfcmVnMTIgPSAweDVjLAotICAgIERXX09QX3JlZzEzID0gMHg1ZCwKLSAgICBEV19PUF9yZWcxNCA9IDB4NWUsCi0gICAgRFdfT1BfcmVnMTUgPSAweDVmLAotICAgIERXX09QX3JlZzE2ID0gMHg2MCwKLSAgICBEV19PUF9yZWcxNyA9IDB4NjEsCi0gICAgRFdfT1BfcmVnMTggPSAweDYyLAotICAgIERXX09QX3JlZzE5ID0gMHg2MywKLSAgICBEV19PUF9yZWcyMCA9IDB4NjQsCi0gICAgRFdfT1BfcmVnMjEgPSAweDY1LAotICAgIERXX09QX3JlZzIyID0gMHg2NiwKLSAgICBEV19PUF9yZWcyMyA9IDB4NjcsCi0gICAgRFdfT1BfcmVnMjQgPSAweDY4LAotICAgIERXX09QX3JlZzI1ID0gMHg2OSwKLSAgICBEV19PUF9yZWcyNiA9IDB4NmEsCi0gICAgRFdfT1BfcmVnMjcgPSAweDZiLAotICAgIERXX09QX3JlZzI4ID0gMHg2YywKLSAgICBEV19PUF9yZWcyOSA9IDB4NmQsCi0gICAgRFdfT1BfcmVnMzAgPSAweDZlLAotICAgIERXX09QX3JlZzMxID0gMHg2ZiwKLSAgICBEV19PUF9icmVnMCA9IDB4NzAsCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAotICAgIERXX09QX2JyZWcyID0gMHg3MiwKLSAgICBEV19PUF9icmVnMyA9IDB4NzMsCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAotICAgIERXX09QX2JyZWc1ID0gMHg3NSwKLSAgICBEV19PUF9icmVnNiA9IDB4NzYsCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAotICAgIERXX09QX2JyZWc4ID0gMHg3OCwKLSAgICBEV19PUF9icmVnOSA9IDB4NzksCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKLSAgICBEV19PUF9icmVnMTEgPSAweDdiLAotICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKLSAgICBEV19PUF9icmVnMTQgPSAweDdlLAotICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKLSAgICBEV19PUF9icmVnMTcgPSAweDgxLAotICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKLSAgICBEV19PUF9icmVnMjAgPSAweDg0LAotICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKLSAgICBEV19PUF9icmVnMjMgPSAweDg3LAotICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKLSAgICBEV19PUF9icmVnMjYgPSAweDhhLAotICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKLSAgICBEV19PUF9icmVnMjkgPSAweDhkLAotICAgIERXX09QX2JyZWczMCA9IDB4OGUsCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKLSAgICBEV19PUF9yZWd4ID0gMHg5MCwKLSAgICBEV19PUF9mYnJlZyA9IDB4OTEsCi0gICAgRFdfT1BfYnJlZ3ggPSAweDkyLAotICAgIERXX09QX3BpZWNlID0gMHg5MywKLSAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCi0gICAgRFdfT1Bfbm9wID0gMHg5NgotICB9OwotCi0jZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIGVuY29kaW5ncy4gICovCi0KLWVudW0gZHdhcmZfdHlwZQotICB7Ci0gICAgRFdfQVRFX3ZvaWQgPSAweDAsCi0gICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCi0gICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCi0gICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCi0gICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAotICAgIERXX0FURV9zaWduZWQgPSAweDUsCi0gICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAotICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKLSAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAotICB9OwotCi0jZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKLSNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKLSAgewotICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAotICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCi0gIH07Ci0KLS8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KLWVudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLS8qIHZpc2liaWxpdHkgKi8KLWVudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKLSAgewotICAgIERXX1ZJU19sb2NhbCA9IDEsCi0gICAgRFdfVklTX2V4cG9ydGVkID0gMiwKLSAgICBEV19WSVNfcXVhbGlmaWVkID0gMwotICB9OwotCi0vKiB2aXJ0dWFsaXR5ICovCi1lbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAotICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCi0gICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCi0gIH07Ci0KLS8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KLWVudW0gZHdhcmZfaWRfY2FzZQotICB7Ci0gICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAotICAgIERXX0lEX3VwX2Nhc2UgPSAxLAotICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCi0gICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKLSAgfTsKLQotLyogY2FsbGluZyBjb252ZW50aW9uICovCi1lbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgotICB7Ci0gICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAotICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCi0gICAgRFdfQ0Nfbm9jYWxsID0gMHgzCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCi0jZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgotCi0vKiBpbmxpbmUgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKLSAgewotICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCi0gICAgRFdfSU5MX2lubGluZWQgPSAxLAotICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCi0gICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCi0gIH07Ci0KLS8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLwotZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKLSAgewotICAgIERXX0RTQ19sYWJlbCA9IDAsCi0gICAgRFdfRFNDX3JhbmdlID0gMQotICB9OwotCi0vKiBsaW5lIG51bWJlciBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcwotICB7Ci0gICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKLSAgICBEV19MTlNfY29weSA9IDEsCi0gICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAotICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAotICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCi0gICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAotICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCi0gICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCi0gICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCi0gICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5Ci0gIH07Ci0KLS8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KLWVudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKLSAgewotICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAotICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCi0gICAgRFdfTE5FX2RlZmluZV9maWxlID0gMwotICB9OwotCi0vKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCi1lbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbwotICB7Ci0gICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKLSAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKLSAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KLSAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgotI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKLQotI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCi0jZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKLSNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgotCi0jZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKLSNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKLQotI2RlZmluZSBEV19BRERSX25vbmUJCTAKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKLSAgICBEV19MQU5HX0MgPSAweDAwMDIsCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKLSAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAotICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCi0gICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCi0gICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCi0gICAgRFdfTEFOR19KYXZhID0gMHg5YWY0LAotICAgIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIgPSAweDgwMDEKLSAgfTsKLQotCi0jZGVmaW5lIERXX0xBTkdfbG9fdXNlciAweDgwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19MQU5HX2hpX3VzZXIgMHhmZmZmCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBtYWNybyBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZQotICB7Ci0gICAgRFdfTUFDSU5GT19kZWZpbmUgPSAxLAotICAgIERXX01BQ0lORk9fdW5kZWYgPSAyLAotICAgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDMsCi0gICAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDQsCi0gICAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1Ci0gIH07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYjc3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBUaGUgNjQtYml0IHN0dWZmIGlzIGtpbmQgb2YgcmFuZG9tLiAgUGVyaGFwcyBzb21lb25lIHdpbGwgcHVibGlzaCBhCi0gICBzcGVjIHNvbWVkYXkuICAqLwotCi0jaWZuZGVmIF9FTEZfRVhURVJOQUxfSAotI2RlZmluZSBfRUxGX0VYVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAoMzItYml0IGltcGxlbWVudGF0aW9ucykgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIHVuc2lnbmVkIGNoYXIJZV90eXBlWzJdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJZV9tYWNoaW5lWzJdOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfdmVyc2lvbls0XTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBjaGFyCWVfZW50cnlbNF07CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Bob2ZmWzRdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Nob2ZmWzRdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX2ZsYWdzWzRdOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9laHNpemVbMl07CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BoZW50c2l6ZVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BobnVtWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NoZW50c2l6ZVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NobnVtWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Noc3RybmR4WzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX0VoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzhdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls4XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls4XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGY2NF9FeHRlcm5hbF9FaGRyOwotCi0vKiBQcm9ncmFtIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzRdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbNF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbNF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bNF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGYzMl9FeHRlcm5hbF9QaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmxhZ3NbNF07CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9vZmZzZXRbOF07CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJcF92YWRkcls4XTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9wYWRkcls4XTsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmlsZXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX21lbXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bOF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGY2NF9FeHRlcm5hbF9QaGRyOwotCi0vKiBTZWN0aW9uIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s0XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls0XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs0XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzRdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bNF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs0XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9TaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s4XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls4XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs4XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzhdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bOF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs4XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TaGRyOwotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3ZhbHVlWzRdOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NpemVbNF07CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU3ltOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc3RfbmFtZVs0XTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs4XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzhdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TeW07Ci0KLS8qIE5vdGUgc2VnbWVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCW5hbWVzels0XTsJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgY2hhcglkZXNjc3pbNF07CQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgY2hhcgl0eXBlWzRdOwkJLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgKi8KLSAgY2hhcgkJbmFtZVsxXTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotfSBFbGZfRXh0ZXJuYWxfTm90ZTsKLQotLyogUmVsb2NhdGlvbiBFbnRyaWVzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs0XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs4XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9SZWxhOwotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s0XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzRdOwotICB9IGRfdW47Ci19IEVsZjMyX0V4dGVybmFsX0R5bjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWRfdGFnWzhdOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBjaGFyCWRfdmFsWzhdOwotICAgIHVuc2lnbmVkIGNoYXIJZF9wdHJbOF07Ci0gIH0gZF91bjsKLX0gRWxmNjRfRXh0ZXJuYWxfRHluOwotCi0vKiBUaGUgdmVyc2lvbiBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIFRoZXkgYXJlCi0gICBuYW1lZCB3aXRob3V0IGEgMzIgb3IgNjQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhlc2Ugc3RydWN0dXJlcwotICAgd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRfdmVyc2lvblsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfZmxhZ3NbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25keFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfY250WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9oYXNoWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9hdXhbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2ZGFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fZmlsZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bmFfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfb3RoZXJbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5hdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgVGhpcyBpcyBub3QgYQotICAgc3RhbmRhcmQgRUxGIHN0cnVjdHVyZTsgRUxGIGp1c3QgdXNlcyBFbGYzMl9IYWxmLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2c192ZXJzWzJdOwotfQotI2lmZGVmIF9fR05VQ19fCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotI2VuZGlmCi0gIEVsZl9FeHRlcm5hbF9WZXJzeW07Ci0KLS8qIFN0cnVjdHVyZSBmb3Igc3ltaW5mbyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2JvdW5kdG9bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2ZsYWdzWzJdOwotfSBFbGZfRXh0ZXJuYWxfU3ltaW5mbzsKLQotI2VuZGlmIC8qIF9FTEZfRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZnIzMC5oIGIvaW5jbHVkZS9lbGYvZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMDUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2ZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEZSMzAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRlIzMF9ICi0jZGVmaW5lIF9FTEZfRlIzMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9mcjMwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzIwLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzZfSU5fNCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOF9JTl84LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X0lOXzgsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEwX0lOXzgsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfUENSRUwsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEyX1BDUkVMLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVEVOVFJZLCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX0ZSMzBfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfRlIzMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9ocHBhLmggYi9pbmNsdWRlL2VsZi9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDVkNzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qIEhQUEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEhQUEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfSFBQQV9ICi0jZGVmaW5lIF9FTEZfSFBQQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRyYXAgbnVsbCBhZGRyZXNzIGRlcmVmZXJlbmNlcy4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19UUkFQTklMCTB4MDAwMTAwMDAKLQotLyogLlBBUklTQy5hcmNoZXh0IHNlY3Rpb24gaXMgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19FWFQJCTB4MDAwMjAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIGxpdHRsZS1lbmRpYW4gbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19MU0IJCTB4MDAwNDAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19XSURFCQkweDAwMDgwMDAwCi0KLS8qIERvIG5vdCBhbGxvdyBrZXJuZWwtYXNzaXN0ZWQgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTk9fS0FCUAkweDAwMTAwMDAwCi0KLS8qIEFsbG93IGxhenkgc3dhcCBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHByb2dyYW0gc2VnbWVudHMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMAotCi0vKiBBcmNoaXRlY3R1cmUgdmVyc2lvbiAqLwotI2RlZmluZSBFRl9QQVJJU0NfQVJDSAkJMHgwMDAwZmZmZgotCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8wCQkJMHgwMjBiCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkJMHgwMjEwCi0jZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkJMHgwMjE0Ci0KLS8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSB0ZW50YXRpdmUgZGVmaW5pdGlvbiBpbiBhbiBBTlNJIEMKLSAgIGNvbXBpbGF0aW9uLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTiAJMHhmZjAwCi0KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSBjb21tb24gYmxvY2sgdXNpbmcgdGhlCi0gICBodWdlIG1lbW9yeSBtb2RlbC4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dGVuc2lvbiBiaXRzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB1bndpbmQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemVkIGNvZGUuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgYW5ub3RhdGlvbnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0FOTk9UCTB4NzAwMDAwMDMKLQotLyogVGhlc2UgYXJlIHN0cmljdGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGVsZjMyLWhwcGEKLSAgIGltcGxlbWVudGF0aW9uLiAgSG9wZWZ1bGx5IHdlIGNhbiBlbGltaW5hdGUgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLS8qIE9wdGlvbmFsIHNlY3Rpb24gaG9sZGluZyBhcmd1bWVudCBsb2NhdGlvbi9yZWxvY2F0aW9uIGluZm8uICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NZTUVYVE4gICAgU0hUX0xPUFJPQys4Ci0KLS8qIE9wdGlvbiBzZWN0aW9uIGZvciBsaW5rZXIgc3R1YnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NUVUJTICAgICAgU0hUX0xPUFJPQys5Ci0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBjb2RlIGNvbXBpbGVkIGZvciBzdGF0aWMgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NCUAkJMHg4MDAwMDAwMAotCi0vKiBTZWN0aW9uIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBmcm9tIEdQLiAgKi8KLSNkZWZpbmUgU0hGX1BBUklTQ19IVUdFCQkweDQwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGdvIG5lYXIgR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAKLQotCi0vKiBJZGVudGlmaWVzIHRoZSBlbnRyeSBwb2ludCBvZiBhIG1pbGxpY29kZSByb3V0aW5lLiAgKi8KLSNkZWZpbmUgU1RUX1BBUklTQ19NSUxMSQkxMwotCi0vKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCi0KLS8qIE5vdGU6IFBBLUVMRiBpcyBkZWZpbmVkIHRvIHVzZSBvbmx5IFJFTEEgcmVsb2NhdGlvbnMuICAqLwotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2hwcGFfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19OT05FLCAgICAgIDApCS8qIE5vIHJlbG9jICovCi0KLSAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBkbyBzaW1wbGUgYmFzZSArIG9mZnNldCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIzMiwgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMjFMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3UiwgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN0YsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRSLCA2KQotCi0gICAgLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcwotICAgICAgIFR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KLSAgICAgICBOb3RlIFBDUkVMMTdDIGFuZCBQQ1JFTDE3RiBkaWZmZXIgb25seSBpbiBvdmVyZmxvdyBoYW5kbGluZy4KLSAgICAgICBQQ1JFTDE3QyBuZXZlciByZXBvcnRzIGEgcmVsb2NhdGlvbiBlcnJvci4KLQotICAgICAgIFdoZW4gc3VwcG9ydGluZyBhcmd1bWVudCByZWxvY2F0aW9ucywgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZQotICAgICAgIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcwotICAgICAgIGNhcnJpZWQgaW4gdGhlIHRlbiBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlIGFkZGVuZCBmaWVsZC4gIFRoZSByZW1haW5pbmcKLSAgICAgICAyMiBiaXRzIG9mIG9mIHRoZSBhZGRlbmQgZmllbGQgYXJlIHNpZ24tZXh0ZW5kZWQgdG8gZm9ybSB0aGUgQWRkZW5kLgotCi0gICAgICAgTm90ZSB0aGUgY29kZSB0byBidWlsZCBhcmd1bWVudCByZWxvY2F0aW9ucyBkZXBlbmRzIG9uIHRoZQotICAgICAgIGFkZGVuZCBiZWluZyB6ZXJvLiAgQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGxpbWl0YXRpb24gaXMgR0FTCi0gICAgICAgY2FuIG5vdCBwZXJmb3JtIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMzIsIDkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIxTCwgMTApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3UiwgMTEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3RiwgMTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3QywgMTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0UiwgMTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RiwgMTUpCi0KLSAgICAvKiBEUC1yZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMjFMLCAxOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRXUiwgMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0RFIsIDIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFIsIDIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNEYsIDIzKQotCi0gICAgLyogRGF0YSBsaW5rYWdlIHRhYmxlIChETFQpIHJlbG9jYXRpb24gdHlwZXMKLQotICAgICAgIFNPTSBETFRfUkVMIGZpeHVwIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGZvciBzdGF0aWMgZGF0YSByZWZlcmVuY2VzCi0gICAgICAgZnJvbSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlIHdpdGhpbiBzaGFyZWQgbGlicmFyaWVzLiAgVGhleSBhcmUKLSAgICAgICBzaW1pbGFyIHRvIHRoZSBHT1QgcmVsb2NhdGlvbiB0eXBlcyBpbiBzb21lIFNWUjQgaW1wbGVtZW50YXRpb25zLiAgKi8KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMjFMLCAyNikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0UiwgMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNEYsIDMxKQotCi0gICAgLyogRExUIGluZGlyZWN0IHJlbG9jYXRpb24gdHlwZXMgICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQyMUwsIDM0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRSLCAzOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RiwgMzkpCi0KLSAgICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICBVZ2guICBUaGVzZSBpbXBseSBsb3RzIG9mIHN0YXRlICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRVRCQVNFLCA0MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDMyLCA0MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwyMUwsIDQyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE3UiwgNDMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdGLCA0NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFIsIDQ2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0RiwgNDcpCi0KLSAgICAvKiBTZWdtZW50IHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHQkFTRSwgNDgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUwzMiwgNDkpCi0KLSAgICAvKiBPZmZzZXRzIGZyb20gdGhlIFBMVC4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYyMUwsIDUwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRSLCA1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0RiwgNTUpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIzMiwgNTcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCA1OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIsIDYyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19GUFRSNjQsIDY0KQotCi0gICAgLyogUGxhYmVsIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMzIsIDY1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMjFMLCA2NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDE0UiwgNzApCi0KLSAgICAvKiBQQ1JFTCByZWxvY2F0aW9ucy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDY0LCA3MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJDLCA3MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJGLCA3NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRXUiwgNzUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RFIsIDc2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNkYsIDc3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNldGLCA3OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZERiwgNzkpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjQsIDgwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjRXUiwgODEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVI2NERSLCA4MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0V1IsIDgzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTREUiwgODQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkYsIDg1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZXRiwgODYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkRGLCA4NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUw2NCwgODgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0V1IsIDkxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTREUiwgOTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2RiwgOTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2V0YsIDk0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNkRGLCA5NSkKLQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjY0LCA5NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0V1IsIDk5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTREUiwgMTAwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkYsIDEwMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZXRiwgMTAyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkRGLCAxMDMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDY0LCAxMDQpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFdSLCAxMDcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTREUiwgMTA4KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUw2NCwgMTEyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNFdSLCAxMTUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNERSLCAxMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNkYsIDExNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2V0YsIDExOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2REYsIDExOSkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjY0LCAxMjApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiwgMTIzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIsIDEyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDEyNSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAxMjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMTI3KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0NPUFksIDEyOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0lQTFQsIDEyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0VQTFQsIDEzMCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwzMiwgMTUzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwyMUwsIDE1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTRSLCAxNTgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMjFMLCAxNjIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0UiwgMTY2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNEYsIDE2NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUw2NCwgMjE2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFdSLCAyMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0RFIsIDIyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZGLCAyMjEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE2V0YsIDIyMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZERiwgMjIzKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDY0LCAyMjQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0V1IsIDIyNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMjI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkYsIDIyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMjMwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkRGLCAyMzEpCi0gICAgRU1QVFlfUkVMT0MgKFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jaWZuZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotdHlwZWRlZiBlbnVtIGVsZl9ocHBhX3JlbG9jX3R5cGUgZWxmX2hwcGFfcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIFBUX1BBUklTQ19BUkNIRVhUCTB4NzAwMDAwMDAKLSNkZWZpbmUgUFRfUEFSSVNDX1VOV0lORAkweDcwMDAwMDAxCi0jZGVmaW5lIFBGX1BBUklTQ19TQlAJCTB4MDgwMDAwMDAKLSNkZWZpbmUgUEZfSFBfUEFHRV9TSVpFCQkweDAwMTAwMDAwCi0jZGVmaW5lIFBGX0hQX0ZBUl9TSEFSRUQJMHgwMDIwMDAwMAotI2RlZmluZSBQRl9IUF9ORUFSX1NIQVJFRAkweDAwNDAwMDAwCi0jZGVmaW5lIFBGX0hQX0NPREUJCTB4MDEwMDAwMDAKLSNkZWZpbmUgUEZfSFBfTU9ESUZZCQkweDAyMDAwMDAwCi0jZGVmaW5lIFBGX0hQX0xBWllTV0FQCQkweDA0MDAwMDAwCi0jZGVmaW5lIFBGX0hQX1NCUAkJMHgwODAwMDAwMAotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KLQotI2RlZmluZSBEVF9IUF9MT0FEX01BUAkJKERUX0xPT1MgKyAweDApCi0jZGVmaW5lIERUX0hQX0RMRF9GTEFHUwkJKERUX0xPT1MgKyAweDEpCi0jZGVmaW5lIERUX0hQX0RMRF9IT09LCQkoRFRfTE9PUyArIDB4MikKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUCQkoRFRfTE9PUyArIDB4MykKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUU1oJKERUX0xPT1MgKyAweDQpCi0jZGVmaW5lIERUX0hQX1BSRUlOSVQJCShEVF9MT09TICsgMHg1KQotI2RlZmluZSBEVF9IUF9QUkVJTklUU1oJCShEVF9MT09TICsgMHg2KQotI2RlZmluZSBEVF9IUF9ORUVERUQJCShEVF9MT09TICsgMHg3KQotI2RlZmluZSBEVF9IUF9USU1FX1NUQU1QCShEVF9MT09TICsgMHg4KQotI2RlZmluZSBEVF9IUF9DSEVDS1NVTQkJKERUX0xPT1MgKyAweDkpCi0jZGVmaW5lIERUX0hQX0dTVF9TSVpFCQkoRFRfTE9PUyArIDB4YSkKLSNkZWZpbmUgRFRfSFBfR1NUX1ZFUlNJT04JKERUX0xPT1MgKyAweGIpCi0jZGVmaW5lIERUX0hQX0dTVF9IQVNIVkFMCShEVF9MT09TICsgMHhjKQotCi0vKiBWYWx1ZXMgZm9yIERUX0hQX0RMRF9GTEFHUy4gICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX1BSSVZBVEUJCTB4MDAwMSAvKiBNYXAgdGV4dCBwcml2YXRlICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX0NBTExCQUNLCQkweDAwMDIgLyogQ2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfREVCVUdfQ0FMTEJBQ0tfQk9SCTB4MDAwNCAvKiBCT1IgY2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfTk9fRU5WVkFSCQkJMHgwMDA4IC8qIE5vIGVudiB2YXIgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT1cJCQkweDAwMTAgLyogQmluZCBub3cgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT05GQVRBTAkJMHgwMDIwIC8qIEJpbmQgbm9uLWZhdGFsICovCi0jZGVmaW5lIERUX0hQX0JJTkRfVkVSQk9TRQkJMHgwMDQwIC8qIEJpbmQgdmVyYm9zZSAqLwotI2RlZmluZSBEVF9IUF9CSU5EX1JFU1RSSUNURUQJCTB4MDA4MCAvKiBCaW5kIHJlc3RyaWN0ZWQgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9TWU1CT0xJQwkJMHgwMTAwIC8qIEJpbmQgc3ltYm9saWMgKi8KLSNkZWZpbmUgRFRfSFBfUlBBVEhfRklSU1QJCTB4MDIwMCAvKiBSUEFUSCBmaXJzdCAqLwotI2RlZmluZSBEVF9IUF9CSU5EX0RFUFRIX0ZJUlNUCQkweDA0MDAgLyogQmluZCBkZXB0aC1maXJzdCAqLwotCi0vKiBQcm9ncmFtIGhlYWRlciBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUgUFRfSFBfVExTCQkoUFRfTE9PUyArIDB4MCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9OT05FCQkoUFRfTE9PUyArIDB4MSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9WRVJTSU9OCShQVF9MT09TICsgMHgyKQotI2RlZmluZSBQVF9IUF9DT1JFX0tFUk5FTAkoUFRfTE9PUyArIDB4MykKLSNkZWZpbmUgUFRfSFBfQ09SRV9DT01NCQkoUFRfTE9PUyArIDB4NCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9QUk9DCQkoUFRfTE9PUyArIDB4NSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9MT0FEQUJMRQkoUFRfTE9PUyArIDB4NikKLSNkZWZpbmUgUFRfSFBfQ09SRV9TVEFDSwkoUFRfTE9PUyArIDB4NykKLSNkZWZpbmUgUFRfSFBfQ09SRV9TSE0JCShQVF9MT09TICsgMHg4KQotI2RlZmluZSBQVF9IUF9DT1JFX01NRgkJKFBUX0xPT1MgKyAweDkpCi0jZGVmaW5lIFBUX0hQX1BBUkFMTEVMCQkoUFRfTE9PUyArIDB4MTApCi0jZGVmaW5lIFBUX0hQX0ZBU1RCSU5ECQkoUFRfTE9PUyArIDB4MTEpCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgU1RUX0hQX09QQVFVRQkJKFNUVF9MT09TICsgMHgxKQotI2RlZmluZSBTVFRfSFBfU1RVQgkJKFNUVF9MT09TICsgMHgyKQotCi0jZW5kaWYgLyogX0VMRl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzNzAuaCBiL2luY2x1ZGUvZWxmL2kzNzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwMjFmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzcwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBpMzcwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBpMzcwIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzNzBfSAotI2RlZmluZSBfRUxGX0kzNzBfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBoZWFkZXJzLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX09SREVSRUQJCVNIVF9ISVBST0MJLyogTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgXAotCQkJCQkJICAgZW50cmllcyBpbiB0aGlzIHNlY3Rpb24gXAotCQkJCQkJICAgYmFzZWQgb24gdGhlIGFkZHJlc3MgXAotCQkJCQkJICAgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIFwKLQkJCQkJCSAgIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLSNkZWZpbmUJRUZfSTM3MF9SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIGkzNzAgLW1yZWxvY2F0YWJsZSBmbGFnICovCi0jZGVmaW5lCUVGX0kzNzBfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogaTM3MCAtbXJlbG9jYXRhYmxlLWxpYiBmbGFnICovCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncywgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBMaW5rIGVkaXRvciBpcyB0byBleGNsdWRlIFwKLQkJCQkJCSAgIHRoaXMgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUgXAotCQkJCQkJICAgYW5kIHNoYXJlZCBvYmplY3RzIHRoYXQgaXQgXAotCQkJCQkJICAgYnVpbGRzIHdoZW4gdGhvc2Ugb2JqZWN0cyBcCi0JCQkJCQkgICBhcmUgbm90IHRvIGJlIGZ1cmh0ZXIgXAotCQkJCQkJICAgcmVsb2NhdGVkLiAgKi8KLSNlbmRpZiAvKiBfRUxGX0kzNzBfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzODYuaCBiL2luY2x1ZGUvZWxmL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NjY2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBpeDg2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzODZfSAotI2RlZmluZSBfRUxGX0kzODZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTM4Nl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8zMiwgICAgICAgIDEpCS8qIERpcmVjdCAzMiBiaXQgICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMzMiwgICAgICAyKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1QzMiwgICAgIDMpCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QTFQzMiwJICAgIDQpCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0NPUFksCSAgICA1KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR0xPQl9EQVQsICA2KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfSlVNUF9TTE9ULCA3KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUkVMQVRJVkUsICA4KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UT0ZGLCAgICA5KQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVFBDLCAgICAxMCkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgICAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAxMSkKLSAgICAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAxOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8xNiwgICAgICAgMjApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMxNiwgICAgIDIxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzgsCSAgIDIyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDOCwgICAgICAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9tYXgsCSAgIDI0KQotICAgICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRJTkhFUklULCAyNTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZURU5UUlksIDI1MSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTk2MC5oIGIvaW5jbHVkZS9lbGYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTYwMjg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEludGVsIDk2MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JOTYwX0gKLSNkZWZpbmUgX0VMRl9JOTYwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTk2MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX05PTkUsCSAgICAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwXzEyLAkgICAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8zMiwJICAgIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfSVAyNCwJICAgIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfU1VCLAkgICAgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMLCAgIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTFgsICA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYQSwgNykKLSAgICAgRU1QVFlfUkVMT0MgKFJfOTYwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0k5NjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaWE2NC5oIGIvaW5jbHVkZS9lbGYvaWE2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDUwMDMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2lhNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiBJQS02NCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmbmRlZiBfRUxGX0lBNjRfSAotI2RlZmluZSBfRUxGX0lBNjRfSAotCi0vKiBCaXRzIGluIHRoZSBlX2ZsYWdzIGZpZWxkIG9mIHRoZSBFbGY2NF9FaGRyOiAgKi8KLQotI2RlZmluZSBFRl9JQV82NF9NQVNLT1MJIDB4MDAwMDAwMGYJLyogb3Mtc3BlY2lmaWMgZmxhZ3MgKi8KLSNkZWZpbmUgRUZfSUFfNjRfQUJJNjQJICgxIDw8IDQpCS8qIDY0LWJpdCBBQkkgKi8KLSNkZWZpbmUgRUZfSUFfNjRfQVJDSAkgMHhmZjAwMDAwMAkvKiBhcmNoLiB2ZXJzaW9uIG1hc2sgKi8KLQotLyogPz8/IFRoZXNlIGZvdXIgZGVmaW5pdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBTVlI0IEFCSS4KLSAgIFRoZXkgd2VyZSBwcmVzZW50IGluIERhdmlkJ3MgaW5pdGlhbCBjb2RlIGRyb3AsIHNvIGl0IGlzIHByb2JhYmxlCi0gICB0aGF0IHRoZXkgYXJlIHVzZWQgYnkgSFAvVVguICAqLwotI2RlZmluZSBFRl9JQV82NF9UUkFQTklMICgxIDw8IDApCS8qIHRyYXAgTklMIHBvaW50ZXIgZGVyZWZlcmVuY2VzICovCi0jZGVmaW5lIEVGX0lBXzY0X0VYVAkgKDEgPDwgMikJLyogcHJvZ3JhbSB1c2VzIGFyY2guIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgRUZfSUFfNjRfQkUJICgxIDw8IDMpCS8qIFBTUiBCRSBiaXQgc2V0IChiaWctZW5kaWFuKSAqLwotI2RlZmluZSBFRkFfSUFfNjRfRUFTMl8zIDB4MjMwMDAwMDAJLyogaWE2NCBFQVMgMi4zICovCi0KLSNkZWZpbmUgRUxGX1NUUklOR19pYTY0X2FyY2hleHQJCSIuSUFfNjQuYXJjaGV4dCIKLSNkZWZpbmUgRUxGX1NUUklOR19pYTY0X3BsdG9mZgkJIi5JQV82NC5wbHRvZmYiCi0jZGVmaW5lIEVMRl9TVFJJTkdfaWE2NF91bndpbmQJCSIuSUFfNjQudW53aW5kIgotI2RlZmluZSBFTEZfU1RSSU5HX2lhNjRfdW53aW5kX2luZm8JIi5JQV82NC51bndpbmRfaW5mbyIKLQotLyogQml0cyBpbiB0aGUgc2hfZmxhZ3MgZmllbGQgb2YgRWxmNjRfU2hkcjogICovCi0KLSNkZWZpbmUgU0hGX0lBXzY0X1NIT1JUCQkweDEwMDAwMDAwCS8qIHNlY3Rpb24gbmVhciBncCAqLwotI2RlZmluZSBTSEZfSUFfNjRfTk9SRUNPVgkweDIwMDAwMDAwCS8qIHNwZWMgaW5zbnMgdy9vIHJlY292ZXJ5ICovCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2hfdHlwZSBpbiBFbGY2NF9TaGRyOiAqLwotCi0jZGVmaW5lIFNIVF9JQV82NF9FWFQJCShTSFRfTE9QUk9DICsgMCkJLyogZXh0ZW5zaW9uIGJpdHMgKi8KLSNkZWZpbmUgU0hUX0lBXzY0X1VOV0lORAkoU0hUX0xPUFJPQyArIDEpCS8qIHVud2luZCBiaXRzICovCi0KLS8qIEJpdHMgaW4gdGhlIHBfZmxhZ3MgZmllbGQgb2YgRWxmNjRfUGhkcjogICovCi0KLSNkZWZpbmUgUEZfSUFfNjRfTk9SRUNPVgkweDgwMDAwMDAwCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgcF90eXBlIGluIEVsZjY0X1BoZHI6ICAqLwotCi0jZGVmaW5lIFBUX0lBXzY0X0FSQ0hFWFQJKFBUX0xPUFJPQyArIDApCS8qIGFyY2ggZXh0ZW5zaW9uIGJpdHMgKi8KLSNkZWZpbmUgUFRfSUFfNjRfVU5XSU5EIAkoUFRfTE9QUk9DICsgMSkJLyogaWE2NCB1bndpbmQgYml0cyAqLwotCi0vKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGRfdGFnIGluIEVsZjY0X0R5bjogICovCi0KLSNkZWZpbmUgRFRfSUFfNjRfUExUX1JFU0VSVkUJKERUX0xPUFJPQyArIDApCi0KLS8qIGlhNjQtc3BlY2lmaWMgcmVsb2NhdGlvbiB0eXBlczogKi8KLQotLyogUmVsb2NzIGFwcGx5IHRvIHNwZWNpZmljIGluc3RydWN0aW9ucyB3aXRoaW4gYSBidW5kbGUuICBUaGUgbGVhc3QKLSAgIHNpZ25pZmljYW50IDIgYml0cyBvZiB0aGUgYWRkcmVzcyBpbmRpY2F0ZSB3aGljaCBpbnN0cnVjdGlvbiBpbiB0aGUKLSAgIGJ1bmRsZSB0aGUgcmVsb2MgcmVmZXJzIHRvICgwPWZpcnN0IHNsb3QsIDE9c2Vjb25kIHNsb3csIDI9dGhpcmQKLSAgIHNsb3QsIDM9dW5kZWZpbmVkKSBhbmQgdGhlIHJlbWFpbmluZyBiaXRzIGdpdmUgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICBidW5kbGUgKDE2IGJ5dGUgYWxpZ25lZCkuCi0KLSAgIFRoZSB0b3AgNSBiaXRzIG9mIHRoZSByZWxvYyBjb2RlIHNwZWNpZmllcyB0aGUgZXhwcmVzc2lvbiB0eXBlLCB0aGUKLSAgIGxvdyAzIGJpdHMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB3b3JkIGJlaW5nIHJlbG9jYXRlZC4KLQotICAgPz8/IFJlbG9jYXRpb25zIGJlbG93IG1hcmtlZCAjIyBhcmUgbm90IHBhcnQgb2YgdGhlIFNWUjQgcHJvY2Vzc29yCi0gICBzdXBwbGltZW50LiAgVGhleSB3ZXJlIHByZXNlbnQgaW4gRGF2aWQncyBpbml0aWFsIGNvZGUgZHJvcCwgc28gaXQKLSAgIGlzIHBvc3NpYmxlIHRoYXQgdGhleSBhcmUgdXNlZCBieSBIUC9VWC4gICovCi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9pYTY0X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X05PTkUsIDB4MDApCS8qIG5vbmUgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9JTU0xNCwgMHgyMSkJLyogc3ltYm9sICsgYWRkZW5kLCBhZGQgaW1tMTQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfSU1NMjIsIDB4MjIpCS8qIHN5bWJvbCArIGFkZGVuZCwgYWRkIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0lNTTY0LCAweDIzKQkvKiBzeW1ib2wgKyBhZGRlbmQsIG1vdiBpbW02NCAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9ESVIzMk1TQiwgMHgyNCkJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfRElSMzJMU0IsIDB4MjUpCS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0RJUjY0TVNCLCAweDI2KQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9ESVI2NExTQiwgMHgyNykJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9HUFJFTDIyLCAweDJhKQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0dQUkVMNjRJLCAweDJiKQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0dQUkVMMzJNU0IsIDB4MmMpIC8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgIyMgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfR1BSRUwzMkxTQiwgMHgyZCkgLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAjIyAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9HUFJFTDY0TVNCLCAweDJlKSAvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0dQUkVMNjRMU0IsIDB4MmYpIC8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9MVE9GRjIyLCAweDMyKQkvKiBAbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0xUT0ZGNjRJLCAweDMzKQkvKiBAbHRvZmYoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCi0KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUExUT0ZGMjIsIDB4M2EpCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BMVE9GRjY0SSwgMHgzYikJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUExUT0ZGNjRNU0IsIDB4M2UpIC8qIEBwbHRvZmYoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BMVE9GRjY0TFNCLCAweDNmKSAvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0ZQVFI2NEksIDB4NDMpCS8qIEBmcHRyKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9GUFRSMzJNU0IsIDB4NDQpCS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9GUFRSMzJMU0IsIDB4NDUpCS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9GUFRSNjRNU0IsIDB4NDYpCS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9GUFRSNjRMU0IsIDB4NDcpCS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BDUkVMNjBCLCAweDQ4KQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgYnJsICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BDUkVMMjFCLCAweDQ5KQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgcHRiLCBjYWxsICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BDUkVMMjFNLCAweDRhKQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgY2hrLnMgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUENSRUwyMUYsIDB4NGIpCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBmY2hrZiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9QQ1JFTDMyTVNCLCAweDRjKSAvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BDUkVMMzJMU0IsIDB4NGQpIC8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUENSRUw2NE1TQiwgMHg0ZSkgLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9QQ1JFTDY0TFNCLCAweDRmKSAvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCi0KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfTFRPRkZfRlBUUjIyLCAweDUyKSAvKiBAbHRvZmYoQGZwdHIocythKSksIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0xUT0ZGX0ZQVFI2NEksIDB4NTMpIC8qIEBsdG9mZihAZnB0cihzK2EpKSwgaW1tNjQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfTFRPRkZfRlBUUjY0TVNCLCAweDU2KSAvKiBAbHRvZmYoQGZwdHIocythKSksIDggTVNCICMjKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfTFRPRkZfRlBUUjY0TFNCLCAweDU3KSAvKiBAbHRvZmYoQGZwdHIocythKSksIDggTFNCICMjKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9TRUdCQVNFLCAweDU4KQkvKiBzZXQgc2VnbWVudCBiYXNlIGZvciBAc2VncmVsICMjICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1NFR1JFTDMyTVNCLCAweDVjKSAvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9TRUdSRUwzMkxTQiwgMHg1ZCkgLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfU0VHUkVMNjRNU0IsIDB4NWUpIC8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1NFR1JFTDY0TFNCLCAweDVmKSAvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1NFQ1JFTDMyTVNCLCAweDY0KSAvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9TRUNSRUwzMkxTQiwgMHg2NSkgLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfU0VDUkVMNjRNU0IsIDB4NjYpIC8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1NFQ1JFTDY0TFNCLCAweDY3KSAvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1JFTDMyTVNCLCAweDZjKQkvKiBkYXRhIDQgKyBSRUwgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUkVMMzJMU0IsIDB4NmQpCS8qIGRhdGEgNCArIFJFTCAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9SRUw2NE1TQiwgMHg2ZSkJLyogZGF0YSA4ICsgUkVMICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1JFTDY0TFNCLCAweDZmKQkvKiBkYXRhIDggKyBSRUwgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9MVFYzMk1TQiwgMHg3MCkJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfTFRWMzJMU0IsIDB4NzEpCS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0xUVjY0TVNCLCAweDcyKQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9MVFY2NExTQiwgMHg3MykJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9QQ1JFTDIxQkksIDB4NzkpCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBwdGIsIGNhbGwgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfUENSRUwyMiwgMHg3YSkJLyogQHBjcmVsKHN5bSArIGFkZCksIGltbTIyICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1BDUkVMNjRJLCAweDdiKQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgaW1tNjQgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9JUExUTVNCLCAweDgwKQkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIE1TQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9JUExUTFNCLCAweDgxKQkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIExTQiAqLwotICBSRUxPQ19OVU1CRVIgKFJfSUE2NF9FUExUTVNCLCAweDgyKQkvKiBkeW5hbWljIHJlbG9jLCBleHBvcnRlZCBQTFQsICMjICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0VQTFRMU0IsIDB4ODMpCS8qIGR5bmFtaWMgcmVsb2MsIGV4cG9ydGVkIFBMVCwgIyMgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfQ09QWSwgMHg4NCkJLyogZHluYW1pYyByZWxvYywgZGF0YSBjb3B5ICMjICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0xUT0ZGMjJYLCAweDg2KSAgLyogTFRPRkYyMiwgcmVsYXhhYmxlLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfTERYTU9WLCAweDg3KQkvKiBVc2Ugb2YgTFRPRkYyMlguICAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1RQUkVMMjIsIDB4OTIpCSAvKiBzeW0tVFArYWRkLCBhZGQgaW1tMjIgIyMgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0lBNjRfVFBSRUw2NE1TQiwgMHg5NikgLyogc3ltLVRQK2FkZCwgZGF0YTggTVNCICMjICovCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X1RQUkVMNjRMU0IsIDB4OTcpIC8qIHN5bS1UUCthZGQsIGRhdGE4IExTQiAjIyAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9JQTY0X0xUT0ZGX1RQMjIsIDB4OWEpIC8qIEBsdG9mZihzeW0tVFArYWRkKSwgYWRkIGltbTIyICMjICovCi0KLSAgRkFLRV9SRUxPQyAoUl9JQTY0X01BWF9SRUxPQ19DT0RFLCAweDlhKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfSUE2NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliODFhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGludGVybmFsbHkgaW4gdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBFTEYuICBJdCByZXF1aXJlcwotICAgdGhlIGVsZi1jb21tb24uaCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBwb3J0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8KLSAgIGJvdGggdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuICovCi0KLQotLyogTk9URSB0aGF0IHRoZXNlIHN0cnVjdHVyZXMgYXJlIG5vdCBrZXB0IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyCi0gICBpbiB0aGUgb2JqZWN0IGZpbGUuICBJbiBzb21lIGNhc2VzIHRoZXkndmUgYmVlbiByZW9yZGVyZWQgZm9yIG1vcmUgb3B0aW1hbAotICAgcGFja2luZyB1bmRlciB2YXJpb3VzIGNpcmN1bXN0YW5jZXMuICAqLwotCi0jaWZuZGVmIF9FTEZfSU5URVJOQUxfSAotI2RlZmluZSBfRUxGX0lOVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAqLwotCi0jZGVmaW5lIEVJX05JREVOVAkxNgkJLyogU2l6ZSBvZiBlX2lkZW50W10gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX2VoZHIgewotICB1bnNpZ25lZCBjaGFyCQllX2lkZW50W0VJX05JREVOVF07CS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICBiZmRfdm1hCQllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIGJmZF9zaXplX3R5cGUJCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgbG9uZwkJZV92ZXJzaW9uOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV90eXBlOwkJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX21hY2hpbmU7CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCi0gIHVuc2lnbmVkIHNob3J0CWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BobnVtOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBzaG9ydAllX3Noc3RybmR4OwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZl9JbnRlcm5hbF9FaGRyOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX2VoZHIgZWxmX2ludGVybmFsX2VoZHIKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRWhkciBFbGZfSW50ZXJuYWxfRWhkcgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLQotLyogUHJvZ3JhbSBoZWFkZXIgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIHsKLSAgdW5zaWduZWQgbG9uZwlwX3R5cGU7CQkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBsb25nCXBfZmxhZ3M7CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIGJmZF92bWEJcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIGJmZF92bWEJcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIGJmZF92bWEJcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgYmZkX3ZtYQlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICBiZmRfdm1hCXBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3BoZHIgRWxmX0ludGVybmFsX1BoZHI7Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3BoZHIgZWxmX2ludGVybmFsX3BoZHIKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfUGhkciBFbGZfSW50ZXJuYWxfUGhkcgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLQotLyogU2VjdGlvbiBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgewotICB1bnNpZ25lZCBpbnQJc2hfbmFtZTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBpbnQJc2hfdHlwZTsJCS8qIFR5cGUgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hCXNoX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLSAgYmZkX3ZtYQlzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCi0gIGJmZF9zaXplX3R5cGUJc2hfc2l6ZTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICBiZmRfc2l6ZV90eXBlCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLSAgdW5zaWduZWQgbG9uZwlzaF9saW5rOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLwotICBmaWxlX3B0cglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGludAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotCi0gIC8qIFRoZSBpbnRlcm5hbCByZXAgYWxzbyBoYXMgc29tZSBjYWNoZWQgaW5mbyBhc3NvY2lhdGVkIHdpdGggaXQuICovCi0gIGFzZWN0aW9uICoJYmZkX3NlY3Rpb247CQkvKiBBc3NvY2lhdGVkIEJGRCBzZWN0aW9uLiAgKi8KLSAgUFRSCQljb250ZW50czsJCS8qIFNlY3Rpb24gY29udGVudHMuICAqLwotfSBFbGZfSW50ZXJuYWxfU2hkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9zaGRyIGVsZl9pbnRlcm5hbF9zaGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1NoZHIgRWxmX0ludGVybmFsX1NoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3N5bSB7Ci0gIGJmZF92bWEJc3RfdmFsdWU7CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCi0gIGJmZF92bWEJc3Rfc2l6ZTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZwlzdF9uYW1lOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CQkvKiBObyBkZWZpbmVkIG1lYW5pbmcsIDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgc3Rfc2huZHg7CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gRWxmX0ludGVybmFsX1N5bTsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9zeW0gZWxmX2ludGVybmFsX3N5bQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9zeW0gZWxmX2ludGVybmFsX3N5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW0gRWxmX0ludGVybmFsX1N5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9TeW0gRWxmX0ludGVybmFsX1N5bQotCi0vKiBOb3RlIHNlZ21lbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9ub3RlIHsKLSAgdW5zaWduZWQgbG9uZwluYW1lc3o7CQkJLyogU2l6ZSBvZiBlbnRyeSdzIG93bmVyIHN0cmluZyAqLwotICB1bnNpZ25lZCBsb25nCWRlc2NzejsJCQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgbG9uZwl0eXBlOwkJCS8qIEludGVycHJldGF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCi0gIGNoYXIgKgluYW1lZGF0YTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotICBjaGFyICoJZGVzY2RhdGE7CQkvKiBTdGFydCBvZiB0aGUgZGVzYyBkYXRhICovCi0gIGJmZF92bWEJZGVzY3BvczsJCS8qIEZpbGUgb2Zmc2V0IG9mIHRoZSBkZXNjZGF0YSAqLwotfSBFbGZfSW50ZXJuYWxfTm90ZTsKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfTm90ZQlFbGZfSW50ZXJuYWxfTm90ZQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9ub3RlCWVsZl9pbnRlcm5hbF9ub3RlCi0KLS8qIFJlbG9jYXRpb24gRW50cmllcyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsIHsKLSAgYmZkX3ZtYQlyX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gIGJmZF92bWEJcl9pbmZvOwkJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotfSBFbGZfSW50ZXJuYWxfUmVsOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbCBlbGZfaW50ZXJuYWxfcmVsCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1JlbCBFbGZfSW50ZXJuYWxfUmVsCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3JlbCBlbGZfaW50ZXJuYWxfcmVsCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbCBFbGZfSW50ZXJuYWxfUmVsCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9yZWxhIHsKLSAgYmZkX3ZtYQlyX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIEluZGV4IGFuZCBUeXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgYmZkX3NpZ25lZF92bWEgcl9hZGRlbmQ7CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmX0ludGVybmFsX1JlbGE7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWxhIGVsZl9pbnRlcm5hbF9yZWxhCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfUmVsYSBFbGZfSW50ZXJuYWxfUmVsYQotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9keW4gewotICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gIGJmZF92bWEgZF90YWc7CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KLSAgdW5pb24gewotICAgIC8qIFRoaXMgbmVlZHMgdG8gc3VwcG9ydCA2NC1iaXQgdmFsdWVzIGluIGVsZjY0LiAgKi8KLSAgICBiZmRfdm1hCWRfdmFsOwotICAgIGJmZF92bWEJZF9wdHI7Ci0gIH0gZF91bjsKLX0gRWxmX0ludGVybmFsX0R5bjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9keW4gZWxmX2ludGVybmFsX2R5bgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9keW4gZWxmX2ludGVybmFsX2R5bgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9EeW4gRWxmX0ludGVybmFsX0R5bgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9EeW4gRWxmX0ludGVybmFsX0R5bgotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgewotICB1bnNpZ25lZCBzaG9ydCB2ZF92ZXJzaW9uOwkvKiBWZXJzaW9uIG51bWJlciBvZiBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9mbGFnczsJLyogRmxhZ3MgKFZFUl9GTEdfKikuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9uZHg7CS8qIFZlcnNpb24gaW5kZXguICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9jbnQ7CS8qIE51bWJlciBvZiB2ZXJkYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9oYXNoOwkvKiBIYXNoIG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9hdXg7CS8qIE9mZnNldCB0byB2ZXJkYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkZWYuICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBiZmQJCQkgICAgICAqdmRfYmZkOwkJLyogQkZELiAgKi8KLSAgY29uc3QgY2hhcgkJICAgICAgKnZkX25vZGVuYW1lOwkvKiBWZXJzaW9uIG5hbWUuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRlZiAgKnZkX25leHRkZWY7CS8qIHZkX25leHQgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCAqdmRfYXV4cHRyOwkvKiB2ZF9hdXggYXMgcG9pbnRlci4gICovCi0gIHVuc2lnbmVkIGludAkJICAgICAgIHZkX2V4cF9yZWZubzsJLyogVXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRlZjsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmRhX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmRhX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcmRhdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICp2ZGFfbm9kZW5hbWU7CQkJLyogdmRhX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCAqdmRhX25leHRwdHI7CS8qIHZkYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVyZGF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5lZWQgewotICB1bnNpZ25lZCBzaG9ydCB2bl92ZXJzaW9uOwkvKiBWZXJzaW9uIG51bWJlciBvZiBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2bl9jbnQ7CS8qIE51bWJlciBvZiB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9maWxlOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIGxpYnJhcnkgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuX2F1eDsJLyogT2Zmc2V0IHRvIHZlcm5hdXggZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5lZWQuICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBiZmQJCQkgICAgICAqdm5fYmZkOwkJLyogQkZELiAgKi8KLSAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICp2bl9maWxlbmFtZTsJLyogdm5fZmlsZSBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4ICp2bl9hdXhwdHI7CS8qIHZuX2F1eCBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkICp2bl9uZXh0cmVmOwkvKiB2bl9uZXh0cmVmIGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5hdXggewotICB1bnNpZ25lZCBsb25nCSB2bmFfaGFzaDsJLyogSGFzaCBvZiBkZXBlbmRlbmN5IG5hbWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2bmFfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX290aGVyOwkvKiBVbnVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bmFfbmFtZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCB0byB2ZXJzaW9uIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bmFfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVybmF1eC4gICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBzZXQgdXAgd2hlbiBCRkQgcmVhZHMgaW4gdGhlIHN0cnVjdHVyZS4gIEZJWE1FOgotICAgICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHN0b3JlIHRoZXNlIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZS4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5hX25vZGVuYW1lOwkvKiB2bmFfbmFtZSBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4ICp2bmFfbmV4dHB0cjsJLyogdm5hX25leHQgYXMgcG9pbnRlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJuYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIFRoaXMgaXMgbm90IGEKLSAgIHN0YW5kYXJkIEVMRiBzdHJ1Y3R1cmU7IEVMRiBqdXN0IHVzZXMgRWxmMzJfSGFsZi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJzeW0gewotICB1bnNpZ25lZCBzaG9ydCB2c192ZXJzOwotfSBFbGZfSW50ZXJuYWxfVmVyc3ltOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHN5bWluZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBzaG9ydCBpbnQgCXNpX2JvdW5kdG87Ci0gIHVuc2lnbmVkIHNob3J0IGludAlzaV9mbGFnczsKLX0gRWxmX0ludGVybmFsX1N5bWluZm87Ci0KLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJkZWYgZWxmX2ludGVybmFsX3ZlcmRlZgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkZWYgZWxmX2ludGVybmFsX3ZlcmRlZgotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3ZlcmRhdXggZWxmX2ludGVybmFsX3ZlcmRhdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJuZWVkIGVsZl9pbnRlcm5hbF92ZXJuZWVkCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmF1eCBlbGZfaW50ZXJuYWxfdmVybmF1eAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJzeW0gZWxmX2ludGVybmFsX3ZlcnN5bQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJzeW0gZWxmX2ludGVybmFsX3ZlcnN5bQotCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcmRlZiBFbGZfSW50ZXJuYWxfVmVyZGVmCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRlZiBFbGZfSW50ZXJuYWxfVmVyZGVmCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVyZGF1eCBFbGZfSW50ZXJuYWxfVmVyZGF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1Zlcm5lZWQgRWxmX0ludGVybmFsX1Zlcm5lZWQKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuYXV4IEVsZl9JbnRlcm5hbF9WZXJuYXV4Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcnN5bSBFbGZfSW50ZXJuYWxfVmVyc3ltCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcnN5bSBFbGZfSW50ZXJuYWxfVmVyc3ltCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltaW5mbyBFbGZfSW50ZXJuYWxfU3ltaW5mbwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGhvdyBzZWN0aW9ucyBzaG91bGQgYmUgYXNzaWduZWQKLSAgIHRvIHByb2dyYW0gc2VnbWVudHMuICAqLwotCi1zdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwCi17Ci0gIC8qIE5leHQgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbmV4dDsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX2ZsYWdzOwotICAvKiBQcm9ncmFtIHNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgcF9wYWRkcjsKLSAgLyogV2hldGhlciB0aGUgcF9mbGFncyBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgZmxhZ3MgYXJlIGJhc2VkCi0gICAgIG9uIHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfZmxhZ3NfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBwX3BhZGRyIGZpZWxkIGlzIHZhbGlkOyBpZiBub3QsIHRoZSBwaHlzaWNhbCBhZGRyZXNzCi0gICAgIGlzIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGxtYSB2YWx1ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcF9wYWRkcl92YWxpZCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGludCBpbmNsdWRlc19maWxlaGRyIDogMTsKLSAgLyogV2hldGhlciB0aGlzIHNlZ21lbnQgaW5jbHVkZXMgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIHVuc2lnbmVkIGludCBpbmNsdWRlc19waGRycyA6IDE7Ci0gIC8qIE51bWJlciBvZiBzZWN0aW9ucyAobWF5IGJlIDApLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvdW50OwotICAvKiBTZWN0aW9ucy4gIEFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgaXMgaW4gY291bnQgZmllbGQuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbnNbMV07Ci19OwotCi0jZW5kaWYgLyogX0VMRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tMzJyLmggYi9pbmNsdWRlL2VsZi9tMzJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMmFlMTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbTMyci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogTTMyUiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9NMzJSX0gKLSNkZWZpbmUgX0VMRl9NMzJSX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX20zMnJfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTBfUENSRUwsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE4X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNl9QQ1JFTCwgNikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfSEkxNl9VTE8sIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfU0xPLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9MTzE2LCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9TREExNiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRFTlRSWSwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9NMzJSX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKLSAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KLQotLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NMzJSX1NDT01NT04JMHhmZjAwCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHN1ZmZpY2llbnQgcmVsb2NzIHRvIGJlIHJlbGF4ZWQuCi0gICBXaGVuIHJlbGF4aW5nLCBldmVuIHJlbG9jcyBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoZSBhc3NlbWJsZXIgY291bGQKLSAgIGNvbXBsZXRlIG11c3QgYmUgcHJlc2VudCBiZWNhdXNlIHJlbGF4aW5nIG1heSBjYXVzZSB0aGUgYnJhbmNoIHRhcmdldCB0bwotICAgbW92ZS4gICovCi0jZGVmaW5lIFNIRl9NMzJSX0NBTl9SRUxBWAkweDEwMDAwMDAwCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFR3byBiaXQgbTMyciBhcmNoaXRlY3R1cmUgZmllbGQuICAqLwotI2RlZmluZSBFRl9NMzJSX0FSQ0gJCTB4MzAwMDAwMDAKLQotLyogbTMyciBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NMzJSX0FSQ0gJCTB4MDAwMDAwMDAKLS8qIG0zMnJ4IGNvZGUuICAqLwotI2RlZmluZSBFX00zMlJYX0FSQ0gJCTB4MTAwMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tNjhrLmggYi9pbmNsdWRlL2VsZi9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDUxZWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogTUM2OGsgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTY4S19ICi0jZGVmaW5lIF9FTEZfTTY4S19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX202OGtfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19OT05FLCAwKQkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S18zMiwgMSkJCS8qIERpcmVjdCAzMiBiaXQgICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMTYsIDIpCQkvKiBEaXJlY3QgMTYgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzgsIDMpCQkvKiBEaXJlY3QgOCBiaXQgICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEMzMiwgNCkJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMTYsIDUpCQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzgsIDYpCQkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDMyLCA3KQkJLyogMzIgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2LCA4KQkJLyogMTYgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDgsIDkpCQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMk8sIDEwKQkvKiAzMiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2TywgMTEpCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UOE8sIDEyKQkvKiA4IGJpdCBHT1Qgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzIsIDEzKQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNiwgMTQpCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDgsIDE1KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQzMk8sIDE2KQkvKiAzMiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDE2TywgMTcpCS8qIDE2IGJpdCBQTFQgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUOE8sIDE4KQkvKiA4IGJpdCBQTFQgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfQ09QWSwgMTkpCQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR0xPQl9EQVQsIDIwKQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfSk1QX1NMT1QsIDIxKQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUkVMQVRJVkUsIDIyKQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVElOSEVSSVQsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVEVOVFJZLCAyNCkKLSAgRU1QVFlfUkVMT0MgIChSXzY4S19tYXgpICAgCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZGVmaW5lIEVGX0NQVTMyICAgIDB4MDA4MTAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tY29yZS5oIGIvaW5jbHVkZS9lbGYvbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhODhjOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogTW90b3JvbGEgTUNvcmUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUNvcmUgRUxGIEFCSS4gKi8KLSNpZm5kZWYgX0VMRl9NT1JFX0gKLSNkZWZpbmUgX0VMRl9NT1JFX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21jb3JlX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfQUREUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU04Qlk0LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NNEJZMiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMMzIsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVElOSEVSSVQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTlVfVlRFTlRSWSwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1JFTEFUSVZFLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfQ09QWSwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTE9CX0RBVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9KVU1QX1NMT1QsIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTUNPUkVfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogU2VjdGlvbiBBdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgU0hGX01DT1JFX05PUkVBRAkweDgwMDAwMDAwCi0KLSNlbmRpZiAvKiBfRUxGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21pcHMuaCBiL2luY2x1ZGUvZWxmL21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlMzczOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MDAgKzAsMCBAQAotLyogTUlQUyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPiwgZnJvbQotICAgaW5mb3JtYXRpb24gaW4gdGhlIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIE1JUFMKLSAgIFByb2Nlc3NvciBTdXBwbGVtZW50LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUlQUyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9NSVBTX0gKLSNkZWZpbmUgX0VMRl9NSVBTX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWlwc19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18xNiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTDMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18yNiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSEkxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTE8xNiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR1BSRUwxNiwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTElURVJBTCwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UMTYsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1BDMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMMTYsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HUFJFTDMyLCAxMikKLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGRlZmluZWQgb24gSXJpeCwgYWx0aG91Z2ggdGhleSBhcmUgbm90Ci0gICAgIGluIHRoZSBNSVBTIEVMRiBBQkkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQxLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDMsIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TSElGVDUsIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TSElGVDYsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU182NCwgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9ESVNQLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX1BBR0UsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfT0ZTVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9ISTE2LCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0xPMTYsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TVUIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19JTlNFUlRfQSwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0lOU0VSVF9CLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfREVMRVRFLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSElHSEVSLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSElHSEVTVCwgMjkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTExfSEkxNiwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTExfTE8xNiwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NDTl9ESVNQLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMMTYsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19BRERfSU1NRURJQVRFLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEpVTVAsIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUxHT1QsIDM2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19KQUxSLCAzNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfbWF4LCAzOCkKLSAgLyogVGhlc2UgcmVsb2NzIGFyZSB1c2VkIGZvciB0aGUgbWlwczE2LiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFMxNl8yNiwgMTAwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQUzE2X0dQUkVMLCAxMDEpCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBoYW5kbGUgZW1iZWRkZWQtcGljLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEMzMiwgMjQ4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QQzY0LCAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9SRUwxNl9TMiwgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfUkVMX0xPMTYsIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1JFTF9ISTE2LCAyNTIpCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfVlRJTkhFUklULCAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9WVEVOVFJZLCAyNTQpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBBdCBsZWFzdCBvbmUgLm5vcmVvcmRlciBkaXJlY3RpdmUgYXBwZWFycyBpbiB0aGUgc291cmNlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19OT1JFT1JERVIJMHgwMDAwMDAwMQotCi0vKiBGaWxlIGNvbnRhaW5zIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX1BJQwkJMHgwMDAwMDAwMgotCi0vKiBDb2RlIGluIGZpbGUgdXNlcyB0aGUgc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBmb3IgY2FsbGluZwotICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQ1BJQwkJMHgwMDAwMDAwNAotCi0vKiBDb2RlIGluIGZpbGUgdXNlcyBuZXcgQUJJICgtbjMyIG9uIElyaXggNikuICAqLwotI2RlZmluZSBFRl9NSVBTX0FCSTIJCTB4MDAwMDAwMjAKLQotLyogSW5kaWNhdGVzIGNvZGUgY29tcGlsZWQgZm9yIGEgNjQtYml0IG1hY2hpbmUgaW4gMzItYml0IG1vZGUuIAotICAgKHJlZ3MgYXJlIDMyLWJpdHMgd2lkZS4pICovCi0jZGVmaW5lIEVGX01JUFNfMzJCSVRNT0RFICAgICAgIDB4MDAwMDAxMDAKLQotLyogRm91ciBiaXQgTUlQUyBhcmNoaXRlY3R1cmUgZmllbGQuICAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0gJCTB4ZjAwMDAwMDAKLQotLyogLW1pcHMxIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8xCQkweDAwMDAwMDAwCi0KLS8qIC1taXBzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMgkJMHgxMDAwMDAwMAotCi0vKiAtbWlwczMgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzMJCTB4MjAwMDAwMDAKLQotLyogLW1pcHM0IGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF80CQkweDMwMDAwMDAwCi0KLS8qIFRoZSBBQkkgb2YgdGhlIGZpbGUuICBBbHNvIHNlZSBFRl9NSVBTX0FCSTIgYWJvdmUuICovCi0jZGVmaW5lIEVGX01JUFNfQUJJCQkweDAwMDBGMDAwCi0KLS8qIFRoZSBvcmlnaW5hbCBvMzIgYWJpLiAqLwotI2RlZmluZSBFX01JUFNfQUJJX08zMiAgICAgICAgICAweDAwMDAxMDAwCi0KLS8qIE8zMiBleHRlbmRlZCB0byB3b3JrIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzICovCi0jZGVmaW5lIEVfTUlQU19BQklfTzY0ICAgICAgICAgIDB4MDAwMDIwMDAKLQotLyogRUFCSSBpbiAzMiBiaXQgbW9kZSAqLwotI2RlZmluZSBFX01JUFNfQUJJX0VBQkkzMiAgICAgICAweDAwMDAzMDAwCi0KLS8qIEVBQkkgaW4gNjQgYml0IG1vZGUgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9FQUJJNjQgICAgICAgMHgwMDAwNDAwMAotCi0KLS8qIE1hY2hpbmUgdmFyaWFudCBpZiB3ZSBrbm93IGl0LiAgVGhpcyBmaWVsZCB3YXMgaW52ZW50ZWQgYXQgQ3lnbnVzLAotICAgYnV0IGl0IGlzIGhvcGVkIHRoYXQgb3RoZXIgdmVuZG9ycyB3aWxsIGFkb3B0IGl0LiAgSWYgc29tZSBzdGFuZGFyZAotICAgaXMgZGV2ZWxvcGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZm9sbG93IGl0LiAqLwotCi0jZGVmaW5lIEVGX01JUFNfTUFDSAkJMHgwMEZGMDAwMAotCi0vKiBDeWdudXMgaXMgY2hvb3NpbmcgdmFsdWVzIGJldHdlZW4gODAgYW5kIDlGOwotICAgMDAgLSA3RiBzaG91bGQgYmUgbGVmdCBmb3IgYSBmdXR1cmUgc3RhbmRhcmQ7Ci0gICB0aGUgcmVzdCBhcmUgb3Blbi4gKi8KLQotI2RlZmluZSBFX01JUFNfTUFDSF8zOTAwCTB4MDA4MTAwMDAKLQotI2RlZmluZSBFX01JUFNfTUFDSF80MDEwCTB4MDA4MjAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDEwMAkweDAwODMwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQ2NTAJMHgwMDg1MDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80MTExCTB4MDA4ODAwMDAKLQotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaW5kaWNlcy4gIFRoZXNlIHNlY3Rpb25zIGRvIG5vdCBhY3R1YWxseQotICAgZXhpc3QuICBTeW1ib2xzIHdpdGggYSBzdF9zaG5keCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGVzZQotICAgdmFsdWVzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuICAqLwotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgY29tbW9uIHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4gIElmCi0gICByZWxvY2F0ZWQsIGFsaWdubWVudCBtdXN0IGJlIHByZXNlcnZlZC4gICovCi0jZGVmaW5lIFNITl9NSVBTX0FDT01NT04JMHhmZjAwCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCB0ZXh0IHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4KLSAgIE9jY3VyIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiBBbHBoYSBPU0YvMSBhbmQgSXJpeCA1IGV4ZWN1dGFibGVzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfVEVYVAkJMHhmZjAxCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCBkYXRhIHN5bWJvbC4gIFZhbHVlIGlzIHZpcnR1YWwgYWRkcmVzcy4KLSAgIE9jY3VyIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiBBbHBoYSBPU0YvMSBhbmQgSXJpeCA1IGV4ZWN1dGFibGVzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfREFUQQkJMHhmZjAyCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTUlQU19TQ09NTU9OCTB4ZmYwMwotCi0vKiBTbWFsbCB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfU1VOREVGSU5FRAkweGZmMDQKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgc2V0IG9mIGR5bmFtaWMgc2hhcmVkIG9iamVjdHMgdXNlZCB3aGVuCi0gICBzdGF0aWNhbGx5IGxpbmtpbmcuICAqLwotI2RlZmluZSBTSFRfTUlQU19MSUJMSVNUCTB4NzAwMDAwMDAKLQotLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyBpcywgYnV0IGl0J3MgdXNlZCBvbiBJcml4IDUuICAqLwotI2RlZmluZSBTSFRfTUlQU19NU1lNCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbGlzdCBvZiBzeW1ib2xzIHdob3NlIGRlZmluaXRpb25zIGNvbmZsaWN0IHdpdGgKLSAgIHN5bWJvbHMgZGVmaW5lZCBpbiBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0NPTkZMSUNUCTB4NzAwMDAwMDIKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgZ2xvYmFsIHBvaW50ZXIgdGFibGUuICAqLwotI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIG1pY3JvY29kZSBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdCBmb3JtYXQgaXMKLSAgIHVuc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfVUNPREUJCTB4NzAwMDAwMDQKLQotLyogU2VjdGlvbiBjb250YWlucyBzb21lIHNvcnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0Ci0gICBmb3JtYXQgaXMgdW5zcGVjaWZpZWQuICBJdCdzIHByb2JhYmx5IEVDT0ZGIHN5bWJvbHMuICAqLwotI2RlZmluZSBTSFRfTUlQU19ERUJVRwkJMHg3MDAwMDAwNQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfUkVHSU5GTwkweDcwMDAwMDA2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QQUNLQUdFCTB4NzAwMDAwMDcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0JMHg3MDAwMDAwOAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUkVMRAkJMHg3MDAwMDAwOQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGludGVyZmFjZSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0lGQUNFCQkweDcwMDAwMDBiCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRpb24gb2YgY29udGVudHMgb2YgYW5vdGhlciBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfQ09OVEVOVAkweDcwMDAwMDBjCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbWlzY2VsbGFuZW91cyBvcHRpb25zLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfT1BUSU9OUwkweDcwMDAwMDBkCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19TSERSCQkweDcwMDAwMDEwCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19GREVTQwkJMHg3MDAwMDAxMQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfRVhUU1lNCQkweDcwMDAwMDEyCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERU5TRQkJMHg3MDAwMDAxMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUERFU0MJCTB4NzAwMDAwMTQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0xPQ1NZTQkJMHg3MDAwMDAxNQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfQVVYU1lNCQkweDcwMDAwMDE2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19PUFRTWU0JCTB4NzAwMDAwMTcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0xPQ1NUUgkJMHg3MDAwMDAxOAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTElORQkJMHg3MDAwMDAxOQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUkZERVNDCQkweDcwMDAwMDFhCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQVNZTQkweDcwMDAwMDFiCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQUlOU1QJMHg3MDAwMDAxYwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFDTEFTUwkweDcwMDAwMDFkCi0KLS8qIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfRFdBUkYJCTB4NzAwMDAwMWUKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTAkweDcwMDAwMDFmCi0KLS8qIExpc3Qgb2YgbGlicmFyaWVzIHRoZSBiaW5hcnkgZGVwZW5kcyBvbi4gIEluY2x1ZGVzIGEgdGltZSBzdGFtcCwgdmVyc2lvbgotICAgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfU1lNQk9MX0xJQgkweDcwMDAwMDIwCi0KLS8qIEV2ZW50cyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfRVZFTlRTCQkweDcwMDAwMDIxCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19UUkFOU0xBVEUJMHg3MDAwMDAyMgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUElYSUUJCTB4NzAwMDAwMjMKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFCQkweDcwMDAwMDI0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19YTEFURV9ERUJVRwkweDcwMDAwMDI1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19XSElSTAkJMHg3MDAwMDAyNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OCTB4NzAwMDAwMjcKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFX09MRAkweDcwMDAwMDI4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OCTB4NzAwMDAwMjkKLQotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19MSUJMSVNUIGNvbnRhaW5zIGFuIGFycmF5IG9mIHRoZQotICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gIFRoZSBzaF9saW5rIGZpZWxkIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZQotICAgc3RyaW5nIHRhYmxlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZQotICAgc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBTdHJpbmcgdGFibGUgaW5kZXggZm9yIG5hbWUgb2Ygc2hhcmVkIG9iamVjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF9uYW1lOwotICAvKiBUaW1lIHN0YW1wLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3RpbWVfc3RhbXA7Ci0gIC8qIENoZWNrc3VtIG9mIHN5bWJvbCBuYW1lcyBhbmQgY29tbW9uIHNpemVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX2NoZWNrc3VtOwotICAvKiBTdHJpbmcgdGFibGUgaW5kZXggZm9yIHZlcnNpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGxfdmVyc2lvbjsKLSAgLyogRmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGxfZmxhZ3M7Ci19IEVsZjMyX0xpYjsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgRWxmMzJfTGliLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbF9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfdGltZV9zdGFtcFs0XTsKLSAgdW5zaWduZWQgY2hhciBsX2NoZWNrc3VtWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfdmVyc2lvbls0XTsKLSAgdW5zaWduZWQgY2hhciBsX2ZsYWdzWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9MaWI7Ci0KLS8qIFRoZSBsX2ZsYWdzIGZpZWxkIG9mIGFuIEVsZjMyX0xpYiBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gdGhlCi0gICBmb2xsb3dpbmcgZmxhZ3MuICAqLwotCi0vKiBSZXF1aXJlIGFuIGV4YWN0IG1hdGNoIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBMTF9FWEFDVF9NQVRDSAkJMHgwMDAwMDAwMQotCi0vKiBJZ25vcmUgdmVyc2lvbiBpbmNvbXBhdGliaWxpdGllcyBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgTExfSUdOT1JFX0lOVF9WRVIJMHgwMDAwMDAwMgotCi0vKiBSZXF1aXJlIG1hdGNoaW5nIG1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSNkZWZpbmUgTExfUkVRVUlSRV9NSU5PUgkweDAwMDAwMDA0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBMTF9FWFBPUlRTCQkweDAwMDAwMDA4Ci0KLS8qIERlbGF5IGxvYWRpbmcgb2YgdGhpcyBsaWJyYXJ5IHVudGlsIHJlYWxseSBuZWVkZWQuICAqLwotI2RlZmluZSBMTF9ERUxBWV9MT0FECQkweDAwMDAwMDEwCi0KLS8qID8/PyBEZWx0YSBDKysgc3R1ZmYgPz8/ICovCi0jZGVmaW5lIExMX0RFTFRBCQkweDAwMDAwMDIwCi0KLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfQ09ORkxJQ1QgaXMgYW4gYXJyYXkgb2YgaW5kaWNlcyBpbnRvIHRoZQotICAgLmR5bnN5bSBzZWN0aW9uLiAgRWFjaCBlbGVtZW50IGhhcyB0aGUgZm9sbG93aW5nIHR5cGUuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIEVsZjMyX0NvbmZsaWN0OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0WzRdOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmNjRfQ29uZmxpY3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3RbOF07Ci0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0dQVEFCIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdwotICAgbXVjaCBHUCBzcGFjZSB3b3VsZCBiZSByZXF1aXJlZCBmb3IgZGlmZmVyZW50IC1HIGFyZ3VtZW50cy4gIFRoaXMKLSAgIGluZm9ybWF0aW9uIGlzIG9ubHkgdXNlZCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIHByb3ZpZGUgaW5mb3JtYXRpdmUKLSAgIHN1Z2dlc3Rpb25zIGFzIHRvIHRoZSBiZXN0IC1HIHZhbHVlIHRvIHVzZS4gIFRoZSBzaF9pbmZvIGZpZWxkIGlzCi0gICB0aGUgaW5kZXggb2YgdGhlIHNlY3Rpb24gZm9yIHdoaWNoIHRoaXMgaW5mb3JtYXRpb24gYXBwbGllcy4gIFRoZQotICAgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXJlIGFuIGFycmF5IG9mIHRoZSBmb2xsb3dpbmcgdW5pb24uICBUaGUKLSAgIGZpcnN0IGVsZW1lbnQgdXNlcyB0aGUgZ3RfaGVhZGVyIGZpZWxkLiAgVGhlIHJlbWFpbmluZyBlbGVtZW50cyB1c2UKLSAgIHRoZSBndF9lbnRyeSBmaWVsZC4gICovCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIC1HIHZhbHVlIGFjdHVhbGx5IHVzZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9jdXJyZW50X2dfdmFsdWU7Ci0gICAgICAvKiBVbnVzZWQuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF91bnVzZWQ7Ci0gICAgfSBndF9oZWFkZXI7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgLUcgYXJndW1lbnQgaGFzIGJlZW4gdXNlZC4uLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfZ192YWx1ZTsKLSAgICAgIC8qIC4uLnRoaXMgbWFueSBHUCBzZWN0aW9uIGJ5dGVzIHdvdWxkIGJlIHJlcXVpcmVkLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfYnl0ZXM7Ci0gICAgfSBndF9lbnRyeTsKLX0gRWxmMzJfZ3B0YWI7Ci0KLS8qIFRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIEVsZjMyX2dwdGFiLiAgKi8KLQotdHlwZWRlZiB1bmlvbgotewotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2N1cnJlbnRfZ192YWx1ZVs0XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfdW51c2VkWzRdOwotICAgIH0gZ3RfaGVhZGVyOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2dfdmFsdWVbNF07Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X2J5dGVzWzRdOwotICAgIH0gZ3RfZW50cnk7Ci19IEVsZjMyX0V4dGVybmFsX2dwdGFiOwotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgbG9uZyByaV9ncF92YWx1ZTsKLX0gRWxmMzJfUmVnSW5mbzsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgdGhlIEVsZl9SZWdJbmZvIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHJpX2dwcm1hc2tbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcmlfY3BybWFza1s0XVs0XTsKLSAgdW5zaWduZWQgY2hhciByaV9ncF92YWx1ZVs0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbzsKLQotLyogTUlQUyBFTEYgLnJlZ2luZm8gc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICosIEVsZjMyX1JlZ0luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfUmVnSW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopKTsKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIGdsb2JhbCBkYXRhIGFyZWEuICAqLwotI2RlZmluZSBTSEZfTUlQU19HUFJFTAkJMHgxMDAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gc2hvdWxkIGJlIG1lcmdlZC4gICovCi0jZGVmaW5lIFNIRl9NSVBTX01FUkdFCQkweDIwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyAzMiBiaXQgYWRkcmVzc2VzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfQUREUjMyCQkweDQwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyA2NCBiaXQgYWRkcmVzc2VzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfQUREUjY0CQkweDgwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBtYXkgbm90IGJlIHN0cmlwcGVkLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTk9TVFJJUAkweDA4MDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBpcyBsb2NhbCB0byB0aHJlYWRzLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTE9DQUwJCTB4MDQwMDAwMDAKLQotLyogTGlua2VyIHNob3VsZCBnZW5lcmF0ZSBpbXBsaWNpdCB3ZWFrIG5hbWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSEZfTUlQU19OQU1FUwkJMHgwMjAwMDAwMAotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHByb2dyYW0gaGVhZGVyIHR5cGVzLiAgKi8KLQotLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICBJZGVudGlmaWVzIG9uZSAucmVnaW5mbyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19SRUdJTkZPCQkweDcwMDAwMDAwCi0KLS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19SVFBST0MJCTB4NzAwMDAwMDEKLQotLyogT3B0aW9ucyAoZm9yIHdoYXQgPz8/KS4gICovCi0jZGVmaW5lIFBUX01JUFNfT1BUSU9OUwkJMHg3MDAwMDAwMgotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIGR5bmFtaWMgYXJyYXkgdGFncy4gICovCi0KLS8qIDMyIGJpdCB2ZXJzaW9uIG51bWJlciBmb3IgcnVudGltZSBsaW5rZXIgaW50ZXJmYWNlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfVkVSU0lPTgkweDcwMDAwMDAxCi0KLS8qIFRpbWUgc3RhbXAuICAqLwotI2RlZmluZSBEVF9NSVBTX1RJTUVfU1RBTVAJMHg3MDAwMDAwMgotCi0vKiBDaGVja3N1bSBvZiBleHRlcm5hbCBzdHJpbmdzIGFuZCBjb21tb24gc2l6ZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0lDSEVDS1NVTQkweDcwMDAwMDAzCi0KLS8qIEluZGV4IG9mIHZlcnNpb24gc3RyaW5nIGluIHN0cmluZyB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfSVZFUlNJT04JMHg3MDAwMDAwNAotCi0vKiAzMiBiaXRzIG9mIGZsYWdzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19GTEFHUwkJMHg3MDAwMDAwNQotCi0vKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuICAqLwotI2RlZmluZSBEVF9NSVBTX0JBU0VfQUREUkVTUwkweDcwMDAwMDA2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX01TWU0JCTB4NzAwMDAwMDcKLQotLyogQWRkcmVzcyBvZiAuY29uZmxpY3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwOAotCi0vKiBBZGRyZXNzIG9mIC5saWJsaXN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJCTB4NzAwMDAwMDkKLQotLyogTnVtYmVyIG9mIGxvY2FsIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxfR09UTk8JMHg3MDAwMDAwYQotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmNvbmZsaWN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUTk8JMHg3MDAwMDAwYgotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmxpYmxpc3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfTElCTElTVE5PCTB4NzAwMDAwMTAKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfU1lNVEFCTk8JMHg3MDAwMDAxMQotCi0vKiBJbmRleCBvZiBmaXJzdCBleHRlcm5hbCBkeW5hbWljIHN5bWJvbCBub3QgcmVmZXJlbmNlZCBsb2NhbGx5LiAgKi8KLSNkZWZpbmUgRFRfTUlQU19VTlJFRkVYVE5PCTB4NzAwMDAwMTIKLQotLyogSW5kZXggb2YgZmlyc3QgZHluYW1pYyBzeW1ib2wgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfR09UU1lNCQkweDcwMDAwMDEzCi0KLS8qIE51bWJlciBvZiBwYWdlIHRhYmxlIGVudHJpZXMgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0jZGVmaW5lIERUX01JUFNfSElQQUdFTk8JMHg3MDAwMDAxNAotCi0vKiBBZGRyZXNzIG9mIHJ1biB0aW1lIGxvYWRlciBtYXAsIHVzZWQgZm9yIGRlYnVnZ2luZy4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX01BUAkJMHg3MDAwMDAxNgotCi0vKiBEZWx0YSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1MJMHg3MDAwMDAxNwotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0NMQVNTLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU19OTwkweDcwMDAwMDE4Ci0KLS8qIERlbHRhIEMrKyBjbGFzcyBpbnN0YW5jZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFCTB4NzAwMDAwMTkKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9JTlNUQU5DRS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk8JMHg3MDAwMDAxYQotCi0vKiBEZWx0YSByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0MJMHg3MDAwMDAxYgotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX1JFTE9DLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQ19OTwkweDcwMDAwMDFjCi0KLS8qIERlbHRhIHN5bWJvbHMgdGhhdCBEZWx0YSByZWxvY2F0aW9ucyByZWZlciB0by4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfU1lNCTB4NzAwMDAwMWQKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9TWU0uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTV9OTwkweDcwMDAwMDFlCi0KLS8qIERlbHRhIHN5bWJvbHMgdGhhdCBob2xkIGNsYXNzIGRlY2xhcmF0aW9ucy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU0JMHg3MDAwMDAyMAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTwkweDcwMDAwMDIxCi0KLS8qIEZsYWdzIGluZGljYXRpbmcgaW5mb3JtYXRpb24gYWJvdXQgQysrIGZsYXZvci4gICovCi0jZGVmaW5lIERUX01JUFNfQ1hYX0ZMQUdTCTB4NzAwMDAwMjIKLQotLyogUGl4aWUgaW5mb3JtYXRpb24gKD8/PykuICAqLwotI2RlZmluZSBEVF9NSVBTX1BJWElFX0lOSVQJMHg3MDAwMDAyMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19TWU1CT0xfTElCCTB4NzAwMDAwMjQKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxQQUdFX0dPVElEWAkweDcwMDAwMDI1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVElEWAkweDcwMDAwMDI2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0hJRERFTl9HT1RJRFgJMHg3MDAwMDAyNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19QUk9URUNURURfR09USURYCTB4NzAwMDAwMjgKLQotLyogQWRkcmVzcyBvZiBgLk1JUFMub3B0aW9ucycuICAqLwotI2RlZmluZSBEVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMjkKLQotLyogQWRkcmVzcyBvZiBgLmludGVyZmFjZScuICAqLwotI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRQkweDcwMDAwMDJhCi0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0RZTlNUUl9BTElHTgkweDcwMDAwMDJiCi0KLS8qIFNpemUgb2YgdGhlIC5pbnRlcmZhY2Ugc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfSU5URVJGQUNFX1NJWkUJMHg3MDAwMDAyYwotCi0vKiBTaXplIG9mIHJsZF90ZXh0X3Jlc29sdmUgZnVuY3Rpb24gc3RvcmVkIGluIHRoZSBHT1QuICAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUgkweDcwMDAwMDJkCi0KLS8qIERlZmF1bHQgc3VmZml4IG9mIERTTyB0byBiZSBhZGRlZCBieSBybGQgb24gZGxvcGVuKCkgY2FsbHMuICAqLwotI2RlZmluZSBEVF9NSVBTX1BFUkZfU1VGRklYCTB4NzAwMDAwMmUKLQotLyogU2l6ZSBvZiBjb21wYWN0IHJlbG9jYXRpb24gc2VjdGlvbiAoTzMyKS4gICovCi0jZGVmaW5lIERUX01JUFNfQ09NUEFDVF9TSVpFCTB4NzAwMDAwMmYKLQotLyogR1AgdmFsdWUgZm9yIGF1eGlsaWFyeSBHT1RzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19HUF9WQUxVRQkweDcwMDAwMDMwCi0KLS8qIEFkZHJlc3Mgb2YgYXV4aWxpYXJ5IC5keW5hbWljLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19BVVhfRFlOQU1JQwkweDcwMDAwMDMxCi0MCi0vKiBGbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIGEgRFRfTUlQU19GTEFHUyBlbnRyeS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgUkhGX05PTkUJCTB4MDAwMDAwMDAKLQotLyogVXNlcyBzaG9ydGN1dCBwb2ludGVycy4gICovCi0jZGVmaW5lIFJIRl9RVUlDS1NUQVJUCQkweDAwMDAwMDAxCi0KLS8qIEhhc2ggc2l6ZSBpcyBub3QgYSBwb3dlciBvZiB0d28uICAqLwotI2RlZmluZSBSSEZfTk9UUE9UCQkweDAwMDAwMDAyCi0KLS8qIElnbm9yZSBMRF9MSUJSQVJZX1BBVEguICAqLwotI2RlZmluZSBSSFNfTk9fTElCUkFSWV9SRVBMQUNFTUVOVCBcCi0JCQkJMHgwMDAwMDAwNAotCi0jZGVmaW5lIFJIRl9OT19NT1ZFCQkgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJIRl9TR0lfT05MWQkJICAgMHgwMDAwMDAxMAotI2RlZmluZSBSSEZfR1VBUkFOVEVFX0lOSVQJICAgMHgwMDAwMDAyMAotI2RlZmluZSBSSEZfREVMVEFfQ19QTFVTX1BMVVMJICAgMHgwMDAwMDA0MAotI2RlZmluZSBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJIRl9QSVhJRQkJICAgMHgwMDAwMDEwMAotI2RlZmluZSBSSEZfREVGQVVMVF9ERUxBWV9MT0FECSAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVAkgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlRFRAkgICAweDAwMDAwODAwCi0jZGVmaW5lIFJIRl9DT1JECQkgICAweDAwMDAxMDAwCi0jZGVmaW5lIFJIRl9OT19VTlJFU19VTkRFRgkgICAweDAwMDAyMDAwCi0jZGVmaW5lIFJIRl9STERfT1JERVJfU0FGRQkgICAweDAwMDA0MDAwCi0MCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICBUaGVzZQotICAgYXJlIHVzZWQgaW4gYW4gSXJpeCA1IGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBTVE9fREVGQVVMVAkJU1RWX0RFRkFVTFQKLSNkZWZpbmUgU1RPX0lOVEVSTkFMCQlTVFZfSU5URVJOQUwKLSNkZWZpbmUgU1RPX0hJRERFTgkJU1RWX0hJRERFTgotI2RlZmluZSBTVE9fUFJPVEVDVEVECQlTVFZfUFJPVEVDVEVECi0KLS8qIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgYSBtaXBzMTYgLnRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgU1RPX01JUFMxNgkJMHhmMAotDAotLyogVGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkgdXNlcyBhbiB1bnVzdWFsIHJlbG9jIGZvcm1hdC4gIEVhY2gKLSAgIHJlbG9jYXRpb24gZW50cnkgc3BlY2lmaWVzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucywgYWxsIGF0Ci0gICB0aGUgc2FtZSBhZGRyZXNzLiAgVGhlIGZpcnN0IHJlbG9jYXRpb24gd2hpY2ggcmVxdWlyZWQgYSBzeW1ib2wKLSAgIHVzZXMgdGhlIHN5bWJvbCBpbiB0aGUgcl9zeW0gZmllbGQuICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gd2hpY2gKLSAgIHJlcXVpcmVzIGEgc3ltYm9sIHVzZXMgdGhlIHN5bWJvbCBpbiB0aGUgcl9zc3ltIGZpZWxkLiAgSWYgYWxsCi0gICB0aHJlZSByZWxvY2F0aW9ucyByZXF1aXJlIGEgc3ltYm9sLCB0aGUgdGhpcmQgb25lIHVzZXMgYSB6ZXJvCi0gICB2YWx1ZS4gICovCi0KLS8qIEFuIGVudHJ5IGluIGEgNjQgYml0IFNIVF9SRUwgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zeW1bNF07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW1bMV07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTNbMV07Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyWzFdOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGVbMV07Ci19IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICBiZmRfdm1hIHJfb2Zmc2V0OwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBsb25nIHJfc3ltOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMjsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlOwotfSBFbGY2NF9NaXBzX0ludGVybmFsX1JlbDsKLQotLyogQW4gZW50cnkgaW4gYSA2NCBiaXQgU0hUX1JFTEEgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zeW1bNF07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW1bMV07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTNbMV07Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyWzFdOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGVbMV07Ci0gIC8qIEFkZGVuZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbOF07Ci19IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgYmZkX3ZtYSByX29mZnNldDsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyByX3N5bTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMzsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTI7Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTsKLSAgLyogQWRkZW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgcl9hZGRlbmQ7Ci19IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYTsKLQotLyogVmFsdWVzIGZvdW5kIGluIHRoZSByX3NzeW0gZmllbGQgb2YgYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLQotLyogTm8gcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIFJTU19VTkRFRgkwCi0KLS8qIFZhbHVlIG9mIEdQLiAgKi8KLSNkZWZpbmUgUlNTX0dQCQkxCi0KLS8qIFZhbHVlIG9mIEdQIGluIG9iamVjdCBiZWluZyByZWxvY2F0ZWQuICAqLwotI2RlZmluZSBSU1NfR1AwCQkyCi0KLS8qIEFkZHJlc3Mgb2YgbG9jYXRpb24gYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgUlNTX0xPQwkJMwotDAotLyogQSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24gY29udGFpbnMgYSBzZXJpZXMgb2Ygb3B0aW9ucywgZWFjaCBvZgotICAgd2hpY2ggc3RhcnRzIHdpdGggdGhpcyBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUeXBlIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIga2luZFsxXTsKLSAgLyogU2l6ZSBvZiBvcHRpb24gZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZVsxXTsKLSAgLyogU2VjdGlvbiBpbmRleCBvZiBhZmZlY3RlZCBzZWN0aW9uLCBvciAwIGZvciBnbG9iYWwgb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzZWN0aW9uWzJdOwotICAvKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGtpbmQgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbmZvWzRdOwotfSBFbGZfRXh0ZXJuYWxfT3B0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVHlwZSBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGtpbmQ7Ci0gIC8qIFNpemUgb2Ygb3B0aW9uIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gIC8qIFNlY3Rpb24gaW5kZXggb2YgYWZmZWN0ZWQgc2VjdGlvbiwgb3IgMCBmb3IgZ2xvYmFsIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIHNob3J0IHNlY3Rpb247Ci0gIC8qIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGluZm87Ci19IEVsZl9JbnRlcm5hbF9PcHRpb25zOwotCi0vKiBNSVBTIEVMRiBvcHRpb24gaGVhZGVyIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9PcHRpb25zICosIEVsZl9JbnRlcm5hbF9PcHRpb25zICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqLCBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSk7Ci0KLS8qIFZhbHVlcyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBraW5kIGZpZWxkIG9mIGFuIEVsZl9PcHRpb25zCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0vKiBVbmRlZmluZWQuICAqLwotI2RlZmluZSBPREtfTlVMTAkwCi0KLS8qIFJlZ2lzdGVyIHVzYWdlIGFuZCBHUCB2YWx1ZS4gICovCi0jZGVmaW5lIE9ES19SRUdJTkZPCTEKLQotLyogRXhjZXB0aW9uIHByb2Nlc3NpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfRVhDRVBUSU9OUwkyCi0KLS8qIFNlY3Rpb24gcGFkZGluZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19QQUQJCTMKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMgcGVyZm9ybWVkLiAgKi8KLSNkZWZpbmUgT0RLX0hXUEFUQ0gJNAotCi0vKiBGaWxsIHZhbHVlIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0jZGVmaW5lIE9ES19GSUxMCTUKLQotLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGRlc2t0b3AgdG9vbHMuICAqLwotI2RlZmluZSBPREtfVEFHUwk2Ci0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzLCBBTkQgYml0cyB3aGVuIG1lcmdpbmcuICAqLwotI2RlZmluZSBPREtfSFdBTkQJNwotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcywgT1IgYml0cyB3aGVuIG1lcmdpbmcuICAqLwotI2RlZmluZSBPREtfSFdPUgk4Ci0KLS8qIEdQIGdyb3VwIHRvIHVzZSBmb3IgdGV4dC9kYXRhIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgT0RLX0dQX0dST1VQCTkKLQotLyogSUQgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfSURFTlQJMTAKLQotLyogSW4gdGhlIDMyIGJpdCBBQkksIGFuIE9ES19SRUdJTkZPIG9wdGlvbiBpcyBqdXN0IGEgRWxmMzJfUmVnSW5mbwotICAgc3RydWN0dXJlLiAgSW4gdGhlIDY0IGJpdCBBQkksIGl0IGlzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLiAgVGhlCi0gICBpbmZvIGZpZWxkIG9mIHRoZSBvcHRpb25zIGhlYWRlciBpcyBub3QgdXNlZC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9ncHJtYXNrWzRdOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9wYWRbNF07Ci0gIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9jcHJtYXNrWzRdWzRdOwotICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BfdmFsdWVbOF07Ci19IEVsZjY0X0V4dGVybmFsX1JlZ0luZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9wYWQ7Ci0gIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9jcHJtYXNrWzRdOwotICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIGJmZF92bWEgcmlfZ3BfdmFsdWU7Ci19IEVsZjY0X0ludGVybmFsX1JlZ0luZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBoYXNoIHZhbHVlIGNvbXB1dGVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgZHluYW1pYyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIG1zX2hhc2hfdmFsdWVbNF07Ci0gIC8qIENvbnRhaW5zIGJvdGggdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleCBhbmQgdGhlIHN5bWJvbCBmbGFncwotICAgICBmaWVsZC4gIFRoZSBtYWNyb3MgRUxGMzJfTVNfUkVMX0lOREVYIGFuZCBFTEYzMl9NU19GTEFHUyBhcmUgdXNlZAotICAgICB0byBhY2Nlc3MgdGhlIGluZGl2aWR1YWwgdmFsdWVzLiAgVGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleAotICAgICBpZGVudGlmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgLnJlbC5keW4gc2VjdGlvbiB0aGF0Ci0gICAgIHJlZmVyZW5jZXMgdGhlIGR5bmFtaWMgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtc3ltIGVudHJ5LgotICAgICBJZiB0aGUgaW5kZXggaXMgMCwgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICBzeW1ib2wuICBUaGUgc3ltYm9sIGZsYWdzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtc19pbmZvWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9Nc3ltOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtc19oYXNoX3ZhbHVlOwotICAvKiBDb250YWlucyBib3RoIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXggYW5kIHRoZSBzeW1ib2wgZmxhZ3MKLSAgICAgZmllbGQuICBUaGUgbWFjcm9zIEVMRjMyX01TX1JFTF9JTkRFWCBhbmQgRUxGMzJfTVNfRkxBR1MgYXJlIHVzZWQKLSAgICAgdG8gYWNjZXNzIHRoZSBpbmRpdmlkdWFsIHZhbHVlcy4gIFRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXgKLSAgICAgaWRlbnRpZmllcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIC5yZWwuZHluIHNlY3Rpb24gdGhhdAotICAgICByZWZlcmVuY2VzIHRoZSBkeW5hbWljIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbXN5bSBlbnRyeS4KLSAgICAgSWYgdGhlIGluZGV4IGlzIDAsIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgc3ltYm9sLiAgVGhlIHN5bWJvbCBmbGFncyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbXNfaW5mbzsKLX0gRWxmMzJfSW50ZXJuYWxfTXN5bTsKLQotI2RlZmluZSBFTEYzMl9NU19SRUxfSU5ERVgoaSkgKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9NU19GTEFHUyhpKSAgICAgKGkpICYgMHhmZikKLSNkZWZpbmUgRUxGMzJfTVNfSU5GTyhyLCBmKSAgICgoKHIpIDw8IDgpICsgKChmKSAmIDB4ZmYpKQotCi0vKiBNSVBTIEVMRiByZWdpbmZvIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKiwgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKSk7Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JrIG9mIGFuIE9ES19FWENFUFRJT05TIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPRVhfRlBVX01JTgkweDFmCS8qIEZQRXMgd2hpY2ggbXVzdCBiZSBlbmFibGVkLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9NQVgJMHgxZjAwCS8qIEZQRXMgd2hpY2ggbWF5IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfUEFHRTAJMHgxMDAwMAkvKiBQYWdlIHplcm8gbXVzdCBiZSBtYXBwZWQuICAqLwotI2RlZmluZSBPRVhfU01NCQkweDIwMDAwCS8qIEZvcmNlIHNlcXVlbnRpYWwgbWVtb3J5IG1vZGUuICAqLwotI2RlZmluZSBPRVhfRlBEQlVHCTB4NDAwMDAJLyogRm9yY2UgZmxvYXRpbmctcG9pbnQgZGVidWcgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9ESVNNSVNTCTB4ODAwMDAJLyogRGlzbWlzcyBpbnZhbGlkIGFkZHJlc3MgZmF1bHRzLiAgKi8KLQotLyogTWFza3Mgb2YgdGhlIEZQIGV4Y2VwdGlvbnMgZm9yIE9FWF9GUFVfTUlOIGFuZCBPRVhfRlBVX01BWC4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5WQUwJMHgxMAkvKiBJbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0RJVjAJMHgwOAkvKiBEaXZpc2lvbiBieSB6ZXJvIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfT0ZMTwkweDA0CS8qIE92ZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfVUZMTwkweDAyCS8qIFVuZGVyZmxvdyBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0lORVgJMHgwMQkvKiBJbmV4YWN0IGV4Y2VwdGlvbi4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19QQUQgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9QQURfUFJFRklYCTB4MDEKLSNkZWZpbmUgT1BBRF9QT1NURklYCTB4MDIKLSNkZWZpbmUgT1BBRF9TWU1CT0wJMHgwNAotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSFdQQVRDSCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXX1I0S0VPUAkweDAxCS8qIFI0MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I4S1BGRVRDSAkweDAyCS8qIE1heSBuZWVkIFI4MDAwIHByZWZldGNoIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0VPUAkweDA0CS8qIFI1MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0NWVEwJMHgwOAkvKiBSNTAwMCBjdnQuW2RzXS5sIGJ1ZyAoY2xlYW4gPT0gMSkuICAqLwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSURFTlQvT0RLX0dQX0dST1VQIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPR1BfR1JPVVAJMHgwMDAwZmZmZgkvKiBHUCBncm91cCBudW1iZXIuICAqLwotI2RlZmluZSBPR1BfU0VMRgkweGZmZmYwMDAwCS8qIFNlbGYtY29udGFpbmVkIEdQIGdyb3Vwcy4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV0FORC9PREtfSFdPUiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXQTBfUjRLRU9QX0NIRUNLRUQJMHgwMDAwMDAwMQotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0xFQU4JMHgwMDAwMDAwMgotDAotCi0jZW5kaWYgLyogX0VMRl9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOWUwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBNTjEwMjAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMjAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMjAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMjAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAyMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8yNCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUw4LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDE2LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDI0LCA3KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2ZjZTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogTU4xMDMwMCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTU4xMDMwMCBFTEYgQUJJLiAqLwotCi0jaWZuZGVmIF9FTEZfTU4xMDMwMF9ICi0jZGVmaW5lIF9FTEZfTU4xMDMwMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tbjEwMzAwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfOCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwzMiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUw4LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRFTlRSWSwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMjQsIDkpCi0gIEVNUFRZX1JFTE9DICAoUl9NTjEwMzAwX01BWCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIE1hY2hpbmUgdmFyaWFudCBpZiB3ZSBrbm93IGl0LiAgVGhpcyBmaWVsZCB3YXMgaW52ZW50ZWQgYXQgQ3lnbnVzLAotICAgYnV0IGl0IGlzIGhvcGVkIHRoYXQgb3RoZXIgdmVuZG9ycyB3aWxsIGFkb3B0IGl0LiAgSWYgc29tZSBzdGFuZGFyZAotICAgaXMgZGV2ZWxvcGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZm9sbG93IGl0LiAqLwotCi0jZGVmaW5lIEVGX01OMTAzMDBfTUFDSAkJMHgwMEZGMDAwMAotCi0vKiBDeWdudXMgaXMgY2hvb3NpbmcgdmFsdWVzIGJldHdlZW4gODAgYW5kIDlGOwotICAgMDAgLSA3RiBzaG91bGQgYmUgbGVmdCBmb3IgYSBmdXR1cmUgc3RhbmRhcmQ7Ci0gICB0aGUgcmVzdCBhcmUgb3Blbi4gKi8KLQotI2RlZmluZSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwCTB4MDA4MTAwMDAKLSNkZWZpbmUgRV9NTjEwMzAwX01BQ0hfQU0zMwkweDAwODIwMDAwCi0jZW5kaWYgLyogX0VMRl9NTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3BqLmggYi9pbmNsdWRlL2VsZi9wai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmI4MzA2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3BqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBwaWNvSmF2YSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9QSl9ICi0jZGVmaW5lIF9FTEZfUEpfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9wal9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0RBVEFfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX1JFTDMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9SRUwxNiwgMykgCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX0RJUjMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9ESVIxNiwgNykgIAotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9MTzE2LCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfSEkxNiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9HTlVfVlRJTkhFUklULCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0dOVV9WVEVOVFJZLCAxNikKLSAgRU1QVFlfUkVMT0MgKFJfUEpfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2RlZmluZSBFRl9QSUNPSkFWQV9BUkNIICAgICAweDAwMDAwMDBmCi0jZGVmaW5lIEVGX1BJQ09KQVZBX05FV0NBTExTIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUZfUElDT0pBVkFfR05VQ0FMTFMgMHgwMDAwMDAyMCAgLyogVGhlIChjdXJyZW50bHkpIG5vbiBzdGFuZGFyZCBHTlUgY2FsbGluZyBjb252ZW50aW9uICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcHBjLmggYi9pbmNsdWRlL2VsZi9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxMTZkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBQUEMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPiwgZnJvbSBpbmZvcm1hdGlvbgotICAgaW4gdGhlIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIFBvd2VyUEMgUHJvY2Vzc29yIFN1cHBsZW1lbnQKLSAgIGFuZCB0aGUgUG93ZXJQQyBFbWJlZGRlZCBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIChlYWJpKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIFBQQyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9QUENfSAotI2RlZmluZSBfRUxGX1BQQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9wcGNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMjQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9MTywgNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEksIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0hBLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJUQUtFTiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMjQsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0LCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUlRBS0VOLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTYsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0xPLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9ISSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfSEEsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVFJFTDI0LCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19DT1BZLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTEFUSVZFLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19MT0NBTDI0UEMsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMTYsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMzIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0xPLCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9ISSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfSEEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NEQVJFTDE2LCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGLCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0xPLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hJLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hBLCAzNikKLQotLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIzMiwgMTAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2LCAxMDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfTE8sIDEwMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9ISSwgMTA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hBLCAxMDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQUkxNiwgMTA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEySTE2LCAxMDcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJSRUwsIDEwOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMjEsIDEwOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTVJLUkVGLCAxMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNFQzE2LCAxMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0xPLCAxMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hJLCAxMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hBLCAxMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX0JJVF9GTEQsIDExNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0RBLCAxMTYpCi0KLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZUSU5IRVJJVCwgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dOVV9WVEVOVFJZLCAyNTQpCi0KLS8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcwotICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19UT0MxNiwgMjU1KQotCi0gIEVNUFRZX1JFTE9DIChSX1BQQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLSNkZWZpbmUJRUZfUFBDX0VNQgkJMHg4MDAwMDAwMAkvKiBQb3dlclBDIGVtYmVkZGVkIGZsYWcgICovCi0KLQkJCQkJCS8qIENZR05VUyBsb2NhbCBiaXRzIGJlbG93ICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZSBmbGFnICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIJMHgwMDAwODAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUtbGliIGZsYWcgKi8KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaGVhZGVycywgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9PUkRFUkVECQlTSFRfSElQUk9DCS8qIExpbmsgZWRpdG9yIGlzIHRvIHNvcnQgdGhlIFwKLQkJCQkJCSAgIGVudHJpZXMgaW4gdGhpcyBzZWN0aW9uIFwKLQkJCQkJCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIFwKLQkJCQkJCSAgIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBcCi0JCQkJCQkgICBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncywgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBMaW5rIGVkaXRvciBpcyB0byBleGNsdWRlIFwKLQkJCQkJCSAgIHRoaXMgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUgXAotCQkJCQkJICAgYW5kIHNoYXJlZCBvYmplY3RzIHRoYXQgaXQgXAotCQkJCQkJICAgYnVpbGRzIHdoZW4gdGhvc2Ugb2JqZWN0cyBcCi0JCQkJCQkgICBhcmUgbm90IHRvIGJlIGZ1cmh0ZXIgXAotCQkJCQkJICAgcmVsb2NhdGVkLiAgKi8KLSNlbmRpZiAvKiBfRUxGX1BQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaCBiL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI3ZTg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIEdlbmVyaWMgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSB2YXJpb3VzICouaCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyCi0gICBmaWxlcyB0byBlaXRoZXIgZ2VuZXJhdGUgYW4gZW51bSBjb250YWluaW5nIGFsbCB0aGUga25vd24gcmVsb2NhdGlvbnMKLSAgIGZvciB0aGF0IHRhcmdldCwgb3IgaWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzIGRlZmluZWQsIGEgcmVjb2duaXRpb24KLSAgIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBpbnN0ZWFkLiAgKFRoaXMgaXMgdXNlZCBieSBiaW51dGlscy9yZWFkZWxmLmMpCi0KLSAgIEdpdmVuIGEgaGVhZGVyIGZpbGUgbGlrZSB0aGlzOgotCi0gICAJU1RBUlRfUkVMT0NfTlVNQkVSUyAoZm9vKQotICAgCSAgICBSRUxPQ19OVU1CRVIgKFJfZm9vX05PTkUsICAgIDApCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fMzIsICAgICAgMSkKLSAgIAkgICAgRkFLRV9SRUxPQyAgIChSX2Zvb19pbGxlZ2FsLCAyKQotICAgCSAgICBFTVBUWV9SRUxPQyAgKFJfZm9vX21heCkKLSAgIAlFTkRfUkVMT0NfTlVNQkVSUwotCi0gICBUaGVuIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBwcm9kdWNlZCBieSBkZWZhdWx0IChpZSBpZgotICAgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzICpub3QqIGRlZmluZWQpLgotCi0gICAJZW51bSBmb28KLQl7Ci0JICBmb28gPSAtMSwKLSAgIAkgIFJfZm9vX05PTkUgPSAwLAotICAgCSAgUl9mb29fMzIgPSAxLAotICAgCSAgUl9mb29faWxsZWdhbCA9IDIsCi0gICAJICBSX2Zvb19tYXgKLSAgIAl9OwotCi0gICBJZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgKmlzKiBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhlCi0gICBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQ6Ci0KLSAgIAlzdGF0aWMgY29uc3QgY2hhciAqIGZvbyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7Ci0gICAJc3RhdGljIGNvbnN0IGNoYXIgKgotICAgCWZvbyAocnR5cGUpCi0gICAJICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7Ci0gICAJewotICAgCSAgIHN3aXRjaCAocnR5cGUpCi0gICAJICAgewotICAgCSAgIGNhc2UgMDogcmV0dXJuICJSX2Zvb19OT05FIjsKLSAgIAkgICBjYXNlIDE6IHJldHVybiAiUl9mb29fMzIiOwotICAgCSAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwotICAgCSAgIH0KLSAgIAl9Ci0gICAqLwotCi0jaWZuZGVmIF9SRUxPQ19NQUNST1NfSAotI2RlZmluZSBfUkVMT0NfTUFDUk9TX0gKLQotI2lmZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSByZWxvY2F0aW9uIG51bWJlciBhbmQgcmV0dXJucyB0aGUKLSAgIHN0cmluZyB2ZXJzaW9uIG5hbWUgb2YgdGhlIG5hbWUgb2YgdGhhdCByZWxvY2F0aW9uLiAgSWYKLSAgIHRoZSByZWxvY2F0aW9uIGlzIG5vdCByZWNvZ25pc2VkLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgCQkJCVwKLXN0YXRpYyBjb25zdCBjaGFyICogbmFtZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7IAlcCi1zdGF0aWMgY29uc3QgY2hhciAqCQkJCQkJXAotbmFtZSAocnR5cGUpCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIHJ0eXBlOwkJCQkJXAotewkJCQkJCQkJXAotICBzd2l0Y2ggKHJ0eXBlKQkJCQkJCVwKLSAgewotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKEFMTU9TVF9TVERDKQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgY2FzZSBudW1iZXIgOiByZXR1cm4gI25hbWUgOwotI2Vsc2UKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgIGNhc2UgbnVtYmVyIDogcmV0dXJuICJuYW1lIiA7Ci0jZW5kaWYKLQotI2RlZmluZSBGQUtFX1JFTE9DKG5hbWUsIG51bWJlcikKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkKLQotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUwlcCi0gICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CVwKLSAgfQkJCQlcCi19Ci0KLQotI2Vsc2UgLyogRGVmYXVsdCB0byBnZW5lcmF0aW5nIGVudW0uICAqLwotCi0vKiBTb21lIGNvbXBpbGVycyBjYW5ub3QgY29wZSB3aXRoIGFuIGVudW0gdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZwotICAgY29tbWEsIHNvIFNUQVJUX1JFTE9DX05VTUJFUlMgY3JlYXRlcyBhIGZha2UgcmVsb2MgZW50cnksIChpbml0aWFsaXNlZAotICAgdG8gLTEgc28gdGhhdCB0aGUgZmlyc3QgcmVhbCBlbnRyeSB3aWxsIHN0aWxsIGRlZmF1bHQgdG8gMCkuICBGdXJ0aGVyCi0gICBlbnRyaWVzIHRoZW4gcHJlcGVuZCBhIGNvbW1hIHRvIHRoZWlyIGRlZmluaXRpb25zLCBjcmVhdGluZyBhIGxpc3QKLSAgIG9mIGVudW1lcmF0b3IgZW50cmllcyB0aGF0IHdpbGwgc2F0aXNmeSB0aGVzZSBjb21waWxlcnMuICAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgU1RBUlRfUkVMT0NfTlVNQkVSUyhuYW1lKSAgIGVudW0gbmFtZSB7IF8jI25hbWUgPSAtMQotI2Vsc2UKLSNkZWZpbmUgU1RBUlRfUkVMT0NfTlVNQkVSUyhuYW1lKSAgIGVudW0gbmFtZSB7IF8vKiovbmFtZSA9IC0xCi0jZW5kaWYKLQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgLCBuYW1lID0gbnVtYmVyCi0jZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAsIG5hbWUgPSBudW1iZXIKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkgICAgICAgICAgICwgbmFtZQotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUyAgICAgICAgICAgfTsKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBSRUxPQ19NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc2guaCBiL2luY2x1ZGUvZWxmL3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTMyYzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIFNIIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NIX0gKLSNkZWZpbmUgX0VMRl9TSF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLSNkZWZpbmUgRUZfU0hfTUFDSF9NQVNLCTB4MWYKLSNkZWZpbmUgRUZfU0hfVU5LTk9XTgkgICAwIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCi0jZGVmaW5lIEVGX1NIMQkJICAgMQotI2RlZmluZSBFRl9TSDIJCSAgIDIKLSNkZWZpbmUgRUZfU0gzCQkgICAzCi0jZGVmaW5lIEVGX1NIX0hBU19EU1AoZmxhZ3MpICgoZmxhZ3MpICYgNCkKLSNkZWZpbmUgRUZfU0hfRFNQCSAgIDQKLSNkZWZpbmUgRUZfU0gzX0RTUAkgICA1Ci0jZGVmaW5lIEVGX1NIX0hBU19GUChmbGFncykgKChmbGFncykgJiA4KQotI2RlZmluZSBFRl9TSDNFCQkgICA4Ci0jZGVmaW5lIEVGX1NINAkJICAgOQotCi0jZGVmaW5lIEVGX1NIX01FUkdFX01BQ0gobWFjaDEsIG1hY2gyKSBcCi0gICgoKCgobWFjaDEpID09IEVGX1NIMyB8fCAobWFjaDEpID09IEVGX1NIX1VOS05PV04pICYmIChtYWNoMikgPT0gRUZfU0hfRFNQKSBcCi0gICAgfHwgKChtYWNoMSkgPT0gRUZfU0hfRFNQIFwKLQkmJiAoKG1hY2gyKSA9PSBFRl9TSDMgfHwgKG1hY2gyKSA9PSBFRl9TSF9VTktOT1dOKSkpIFwKLSAgID8gRUZfU0gzX0RTUCBcCi0gICA6ICgoKG1hY2gxKSA8IEVGX1NIMyAmJiAobWFjaDIpID09IEVGX1NIX1VOS05PV04pIFwKLSAgICAgIHx8ICgobWFjaDIpIDwgRUZfU0gzICYmIChtYWNoMSkgPT0gRUZfU0hfVU5LTk9XTikpIFwKLSAgID8gRUZfU0gzIFwKLSAgIDogKCgobWFjaDEpID09IEVGX1NIM0UgJiYgKG1hY2gyKSA9PSBFRl9TSF9VTktOT1dOKSBcCi0gICAgICB8fCAoKG1hY2gyKSA9PSBFRl9TSDNFICYmIChtYWNoMSkgPT0gRUZfU0hfVU5LTk9XTikpIFwKLSAgID8gRUZfU0g0IFwKLSAgIDogKChtYWNoMSkgPiAobWFjaDIpID8gKG1hY2gxKSA6IChtYWNoMikpKQotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0vKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KLSAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCi0gIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCi0gIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9MT09QX1NUQVJULCAzNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xPT1BfRU5ELCAzNykKLSAgRU1QVFlfUkVMT0MgKFJfU0hfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9zcGFyYy5oIGIvaW5jbHVkZS9lbGYvc3BhcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwZTRhOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9zcGFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qIFNQQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBEb3VnIEV2YW5zLCBDeWdudXMgU3VwcG9ydCwgPGRqZUBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfU1BBUkNfSAotI2RlZmluZSBfRUxGX1NQQVJDX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogVGhlc2UgYXJlIGRlZmluZWQgYnkgU3VuLiAgKi8KLQotI2RlZmluZSBFRl9TUEFSQ18zMlBMVVNfTUFTSwkweGZmZmYwMAkvKiBiaXRzIGluZGljYXRpbmcgVjgrIHR5cGUgKi8KLSNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTCQkweDAwMDEwMAkvKiBnZW5lcmljIFY4KyBmZWF0dXJlcyAqLwotI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMxCTB4MDAwMjAwCS8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCi0jZGVmaW5lIEVGX1NQQVJDX0hBTF9SMQkJMHgwMDA0MDAJLyogSEFMIFIxIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMwkweDAwMDgwMAkvKiBTdW4gVWx0cmFTUEFSQ0lJSSBleHRlbnNpb25zICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBICAgICAgICAgMHg4MDAwMDAJLyogbGl0dGxlIGVuZGlhbiBkYXRhICovCi0KLS8qIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZSBWOSBBQkkuICAqLwotI2RlZmluZSBFRl9TUEFSQ19FWFRfTUFTSwkweGZmZmYwMAkvKiByZXNlcnZlZCBmb3IgdmVuZG9yIGV4dGVuc2lvbnMgKi8KLQotLyogVjkgbWVtb3J5IG1vZGVscyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X01NCQkweDMJCS8qIG1lbW9yeSBtb2RlbCBtYXNrICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfVFNPCQkweDAJCS8qIHRvdGFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUFNPCQkweDEJCS8qIHBhcnRpYWwgc3RvcmUgb3JkZXJpbmcgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTB4MgkJLyogcmVsYXhlZCBzdG9yZSBvcmRlcmluZyAqLwotCi0vKiBTZWN0aW9uIGluZGljZXMuICAqLwotCi0jZGVmaW5lIFNITl9CRUZPUkUJCTB4ZmYwMAkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0jZGVmaW5lIFNITl9BRlRFUgkJMHhmZjAxCQkvKiB1c2VkIHdpdGggU0hGX09SREVSRUQgKi8KLQotLyogU2VjdGlvbiBmbGFncy4gICovCi0KLSNkZWZpbmUgU0hGX0VYQ0xVREUJCTB4ODAwMDAwMDAJLyogZXhjbHVkZSBmcm9tIGxpbmtpbmcgKi8KLSNkZWZpbmUgU0hGX09SREVSRUQJCTB4NDAwMDAwMDAJLyogdHJlYXQgc2hfbGluayxzaF9pbmZvIHNwZWNpYWxseSAqLwotCi0vKiBTeW1ib2wgdHlwZXMuICAqLwotCi0jZGVmaW5lIFNUVF9SRUdJU1RFUgkJMTMJCS8qIGdsb2JhbCByZWcgcmVzZXJ2ZWQgdG8gYXBwLiAqLwotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9zcGFyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMzIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDMwLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AyMiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJMjIsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18yMiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMywgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MTzEwLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEwLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEzLCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDIyLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMTAsIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUEMyMiwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XUExUMzAsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfQ09QWSwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUxBVElWRSwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTMyLCAyMykKLQotICAvKiA/Pz8gVGhlc2UgNiByZWxvY3MgYXJlIG5ldyBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgRm9yIGJpbmFyeQotICAgICBjb21wYXRpbGl0eSBpbiB0aGUgc3BhcmM2NC1lbGYgdG9vbGNoYWluLCB3ZSBsZWF2ZSB0aGVtIG91dC4KLSAgICAgQSBub24tYmluYXJ5IHVwd2FyZCBjb21wYXRpYmxlIGNoYW5nZSBpcyBleHBlY3RlZCBmb3Igc3BhcmM2NC1lbGYuICAqLwotI2lmbmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MKLSAgLyogPz8/IE5ldyByZWxvY3Mgb24gdGhlIFVsdHJhU1BBUkMuICBOb3Qgc3VyZSB3aGF0IHRoZXkncmUgZm9yIHlldC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVBMVDIyLCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPUExUMTAsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDIyLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMTAsIDI5KQotI2VuZGlmCi0KLSAgLyogdjkgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMCwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182NCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19PTE8xMCwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISDIyLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hNMTAsIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE0yMiwgMzYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ISDIyLCAzNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0hNMTAsIDM4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfTE0yMiwgMzkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE2LCA0MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMTksIDQxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVU5VU0VEXzQyLCA0MikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzcsIDQzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNSwgNDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182LCA0NSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A2NCwgNDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQ2NCwgNDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVgyMiwgNDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1gxMCwgNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19INDQsIDUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTTQ0LCA1MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0w0NCwgNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUdJU1RFUiwgNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTY0LCA1NCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBMTYsIDU1KQotCi0gIC8qIGxpdHRsZSBlbmRpYW4gZGF0YSByZWxvY3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFVjMyLCA1NikKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4X3N0ZCkKLQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZURU5UUlksIDI1MSkKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUmVsb2NhdGlvbiBtYWNyb3MuICAqLwotCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9EQVRBKGluZm8pIFwKLSAgKCgoYmZkX3NpZ25lZF92bWEpKEVMRjY0X1JfVFlQRShpbmZvKSA+PiA4KSBeIDB4ODAwMDAwKSAtIDB4ODAwMDAwKQotI2RlZmluZSBFTEY2NF9SX1RZUEVfSUQoaW5mbykgXAotICAoKGluZm8pICYgMHhmZikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFX0lORk8oZGF0YSwgdHlwZSkgXAotICAoKChiZmRfdm1hKSAoKGRhdGEpICYgMHhmZmZmZmYpIDw8IDgpIHwgKGJmZF92bWEpICh0eXBlKSkKLQotLyogVmFsdWVzIGZvciBFbGY2NF9EeW4uZF90YWcuICAqLwotCi0jZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSCTB4NzAwMDAwMDEKLQotI2VuZGlmIC8qIF9FTEZfU1BBUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvdjg1MC5oIGIvaW5jbHVkZS9lbGYvdjg1MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQzYjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3Y4NTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBWODUwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIGJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0IDxtZWlzc25lckBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUlQUyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9WODUwX0gKLSNkZWZpbmUgX0VMRl9WODUwX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogRm91ciBiaXQgVjg1MCBhcmNoaXRlY3R1cmUgZmllbGQuICAqLwotI2RlZmluZSBFRl9WODUwX0FSQ0gJCTB4ZjAwMDAwMDAKLQotLyogdjg1MCBjb2RlLiAgKi8KLSNkZWZpbmUgRV9WODUwX0FSQ0gJCTB4MDAwMDAwMDAKLQotLyogdjg1MGUgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MEVfQVJDSAkJMHgxMDAwMDAwMAotCi0vKiB2ODUwZWEgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MEVBX0FSQ0gJCTB4MjAwMDAwMDAKLQotCi0vKiBGbGFncyBmb3IgdGhlIHN0X290aGVyIGZpZWxkICovCi0jZGVmaW5lIFY4NTBfT1RIRVJfU0RBCQkweDAxCS8qIHN5bWJvbCBoYWQgU0RBIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIFY4NTBfT1RIRVJfWkRBCQkweDAyCS8qIHN5bWJvbCBoYWQgWkRBIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIFY4NTBfT1RIRVJfVERBCQkweDA0CS8qIHN5bWJvbCBoYWQgVERBIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIFY4NTBfT1RIRVJfVERBX0JZVEUJMHgwOAkvKiBzeW1ib2wgaGFkIFREQSBieXRlIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIFY4NTBfT1RIRVJfRVJST1IJMHg4MAkvKiBzeW1ib2wgaGFkIGFuIGVycm9yIHJlcG9ydGVkICovCi0KLS8qIFY4NTAgcmVsb2NhdGlvbnMgKi8KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKHY4NTBfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfTk9ORSwgMCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfOV9QQ1JFTCwgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfMjJfUENSRUwsIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0hJMTZfUywgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfSEkxNiwgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfTE8xNiwgNSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfMzIsIDYpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzE2LCA3KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF84LCA4KQotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VULCA5KQkJLyogRm9yIGxkLmIsIHN0LmIsIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VULCAxMCkJCS8qIEZvciBsZC53LCBsZC5oLCBsZC5odSwgc3Qudywgc3QuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VULCAxMSkJCS8qIEZvciBsZC5iLCBzdC5iLCBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwgMTIpCQkvKiBGb3IgbGQudywgbGQuaCwgbGQuaHUsIHN0LncsIHN0LmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzZfOF9PRkZTRVQsIDEzKQkJLyogRm9yIHNzdC53LCBzbGQudyAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfN184X09GRlNFVCwgMTQpCQkvKiBGb3Igc3N0LmgsIHNsZC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV83XzdfT0ZGU0VULCAxNSkJCS8qIEZvciBzc3QuYiwgc2xkLmIgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwgMTYpCQkvKiBGb3Igc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0vKiBDWUdOVVMgTE9DQUwgdjg1MGUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzRfNV9PRkZTRVQsIDE3KQkJLyogRm9yIHNsZC5odSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfNF80X09GRlNFVCwgMTgpCQkvKiBGb3Igc2xkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsIDE5KQkvKiBGb3IgbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwgMjApCS8qIEZvciBsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VULCAyMSkJCS8qIEZvciBjYWxsdCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsIDIyKQkvKiBGb3IgY2FsbHQgKi8KLS8qIEVORCBDWUdOVVMgTE9DQUwgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfR05VX1ZUSU5IRVJJVCwgMjMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0dOVV9WVEVOVFJZLCAyNCkKLQotICAgICBFTVBUWV9SRUxPQyAoUl9WODUwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKLSAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KLQotLyogU21hbGwgZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9TQ09NTU9OCTB4ZmYwMAotCi0vKiBUaW55IGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfVENPTU1PTgkweGZmMDEKLQotLyogWmVybyBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1pDT01NT04JMHhmZjAyCi0KLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1NDT01NT04JMHg3MDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfVENPTU1PTgkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9aQ09NTU9OCTB4NzAwMDAwMDIKLQotCi0jZW5kaWYgLyogX0VMRl9WODUwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmlsZW5hbWVzLmggYi9pbmNsdWRlL2ZpbGVuYW1lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkzM2M4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZmlsZW5hbWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRha2luZyBhcGFydCwgaW50ZXJwcmV0aW5nIGFuZCBwcm9jZXNzaW5nIGZpbGUgbmFtZXMuCi0KLSAgIFRoZXNlIGFyZSBoZXJlIGJlY2F1c2Ugc29tZSBub24tUG9zaXggKGEuay5hLiBET1Npc2gpIHN5c3RlbXMgaGF2ZQotICAgZHJpdmUgbGV0dGVyIGJyYWluLWRhbWFnZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGFic29sdXRlIGZpbGUgbmFtZSwKLSAgIHVzZSBmb3J3YXJkLSBhbmQgYmFjay1zbGFzaCBpbiBwYXRoIG5hbWVzIGludGVyY2hhbmdlYWJseSwgYW5kCi0gICBzb21lIG9mIHRoZW0gaGF2ZSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgbmFtZXMuCi0KLSAgIENvcHlyaWdodCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRklMRU5BTUVTX0gKLSNkZWZpbmUgRklMRU5BTUVTX0gKLQotI2lmIGRlZmluZWQoX19NU0RPU19fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX09TMl9fKQotCi0jaWZuZGVmIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCi0jZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNIDEKLSNlbmRpZgotCi0jZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoYykJKChjKSA9PSAnLycgfHwgKGMpID09ICdcXCcpCi0vKiBOb3RlIHRoYXQgSVNfQUJTT0xVVEVfUEFUSCBhY2NlcHRzIGQ6Zm9vIGFzIHdlbGwsIGFsdGhvdWdoIGl0IGlzCi0gICBvbmx5IHNlbWktYWJzb2x1dGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHVzZXJzIG9mIElTX0FCU09MVVRFX1BBVEgKLSAgIHdhbnQgdG8ga25vdyB3aGV0aGVyIHRvIHByZXBlbmQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8KLSAgIGEgZmlsZSBuYW1lLCB3aGljaCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aCBhIG5hbWUgbGlrZSBkOmZvby4gICovCi0jZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoZikJKElTX0RJUl9TRVBBUkFUT1IoKGYpWzBdKSB8fCAoKChmKVswXSkgJiYgKChmKVsxXSA9PSAnOicpKSkKLSNkZWZpbmUgRklMRU5BTUVfQ01QKHMxLCBzMikJc3RyY2FzZWNtcChzMSwgczIpCi0KLSNlbHNlICAvKiBub3QgRE9TaXNoICovCi0KLSNkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjKQkoKGMpID09ICcvJykKLSNkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChmKQkoSVNfRElSX1NFUEFSQVRPUigoZilbMF0pKQotI2RlZmluZSBGSUxFTkFNRV9DTVAoczEsIHMyKQlzdHJjbXAoczEsIHMyKQotCi0jZW5kaWYgLyogbm90IERPU2lzaCAqLwotCi0jZW5kaWYgLyogRklMRU5BTUVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmxvYXRmb3JtYXQuaCBiL2luY2x1ZGUvZmxvYXRmb3JtYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkMWQxNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyogSUVFRSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGRlY2xhcmF0aW9ucywgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQgKEZMT0FURk9STUFUX0gpCi0jZGVmaW5lIEZMT0FURk9STUFUX0ggMQotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogQSBmbG9hdGZvcm1hdCBjb25zaXN0cyBvZiBhIHNpZ24gYml0LCBhbiBleHBvbmVudCBhbmQgYSBtYW50aXNzYS4gIE9uY2UgdGhlCi0gICBieXRlcyBhcmUgY29uY2F0ZW5hdGVkIGFjY29yZGluZyB0byB0aGUgYnl0ZW9yZGVyIGZsYWcsIHRoZW4gZWFjaCBvZiB0aG9zZQotICAgZmllbGRzIGlzIGNvbnRpZ3VvdXMuICBXZSBudW1iZXIgdGhlIGJpdHMgd2l0aCAwIGJlaW5nIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gICAoaS5lLiBCSVRTX0JJR19FTkRJQU4gdHlwZSBudW1iZXJpbmcpLCBhbmQgc3BlY2lmeSB3aGljaCBiaXRzIGVhY2ggZmllbGQKLSAgIGNvbnRhaW5zIHdpdGggdGhlICpfc3RhcnQgYW5kICpfbGVuIGZpZWxkcy4gICovCi0KLS8qIFdoYXQgaXMgdGhlIG9yZGVyIG9mIHRoZSBieXRlcy4gKi8KLQotZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIHsKLQotICAvKiBTdGFuZGFyZCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuCi0gICAgIEVYOiAxLjIzNDU2NzhlMTAgPT4gMDAgMDAgODAgYzUgZTAgZmUgMDYgNDIgKi8KLQotICBmbG9hdGZvcm1hdF9saXR0bGUsCi0KLSAgLyogU3RhbmRhcmQgYmlnIGVuZGlhbiBieXRlIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IDQyIDA2IGZlIGUwIGM1IDgwIDAwIDAwICovCi0KLSAgZmxvYXRmb3JtYXRfYmlnLAotCi0gIC8qIExpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciBidXQgYmlnIGVuZGlhbiB3b3JkIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IGUwIGZlIDA2IDQyIDAwIDAwIDgwIGM1ICovCi0KLSAgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkCi0KLX07Ci0KLWVudW0gZmxvYXRmb3JtYXRfaW50Yml0IHsgZmxvYXRmb3JtYXRfaW50Yml0X3llcywgZmxvYXRmb3JtYXRfaW50Yml0X25vIH07Ci0KLXN0cnVjdCBmbG9hdGZvcm1hdAotewotICBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgYnl0ZW9yZGVyOwotICB1bnNpZ25lZCBpbnQgdG90YWxzaXplOwkvKiBUb3RhbCBzaXplIG9mIG51bWJlciBpbiBiaXRzICovCi0KLSAgLyogU2lnbiBiaXQgaXMgYWx3YXlzIG9uZSBiaXQgbG9uZy4gIDEgbWVhbnMgbmVnYXRpdmUsIDAgbWVhbnMgcG9zaXRpdmUuICAqLwotICB1bnNpZ25lZCBpbnQgc2lnbl9zdGFydDsKLQotICB1bnNpZ25lZCBpbnQgZXhwX3N0YXJ0OwotICB1bnNpZ25lZCBpbnQgZXhwX2xlbjsKLSAgLyogQW1vdW50IGFkZGVkIHRvICJ0cnVlIiBleHBvbmVudC4gIDB4M2ZmZiBmb3IgbWFueSBJRUVFIGV4dGVuZGVkcy4gICovCi0gIHVuc2lnbmVkIGludCBleHBfYmlhczsKLSAgLyogRXhwb25lbnQgdmFsdWUgd2hpY2ggaW5kaWNhdGVzIE5hTi4gIFRoaXMgaXMgdGhlIGFjdHVhbCB2YWx1ZSBzdG9yZWQgaW4KLSAgICAgdGhlIGZsb2F0LCBub3QgYWRqdXN0ZWQgYnkgdGhlIGV4cF9iaWFzLiAgVGhpcyB1c3VhbGx5IGNvbnNpc3RzIG9mIGFsbAotICAgICBvbmUgYml0cy4gICovCi0gIHVuc2lnbmVkIGludCBleHBfbmFuOwotCi0gIHVuc2lnbmVkIGludCBtYW5fc3RhcnQ7Ci0gIHVuc2lnbmVkIGludCBtYW5fbGVuOwotCi0gIC8qIElzIHRoZSBpbnRlZ2VyIGJpdCBleHBsaWNpdCBvciBpbXBsaWNpdD8gICovCi0gIGVudW0gZmxvYXRmb3JtYXRfaW50Yml0IGludGJpdDsKLQotICAvKiBJbnRlcm5hbCBuYW1lIGZvciBkZWJ1Z2dpbmcuICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGU7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgQVJNIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGVzIGFuZCBiaWcgZW5kaWFuIHdvcmRzICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkOwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIHZhcmlvdXMgZXh0ZW5kZWRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQ7Ci0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotZXh0ZXJuIHZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiwgY2hhciAqLCBkb3VibGUgKikpOwotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBGTVQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICAqLwotCi1leHRlcm4gdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCi0JCQkJIGRvdWJsZSAqLCBjaGFyICopKTsKLQotI2VuZGlmCS8qIGRlZmluZWQgKEZMT0FURk9STUFUX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZubWF0Y2guaCBiL2luY2x1ZGUvZm5tYXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWViNzAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm5tYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1OT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYJX0ZOTUFUQ0hfSAotCi0jZGVmaW5lCV9GTk1BVENIX0gJMQotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXykKLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCWFyZ3MKLSNlbHNlIC8qIE5vdCBDKysgb3IgQU5TSSBDLiAgKi8KLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCSgpCi0vKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aG91dCBkZWZpbmluZyBgY29uc3QnIGhlcmUgb25seSBiZWNhdXNlIGluIHRoaXMgZmlsZQotICAgaXQgaXMgdXNlZCBvbmx5IGluc2lkZSB0aGUgcHJvdG90eXBlIGZvciBgZm5tYXRjaCcsIHdoaWNoIGlzIGVsaWRlZCBpbgotICAgbm9uLUFOU0kgQyB3aGVyZSBgY29uc3QnIGlzIHByb2JsZW1hdGljYWwuICAqLwotI2VuZGlmIC8qIEMrKyBvciBBTlNJIEMuICAqLwotCi0KLS8qIFdlICN1bmRlZiB0aGVzZSBiZWZvcmUgZGVmaW5pbmcgdGhlbSBiZWNhdXNlIHNvbWUgbG9zaW5nIHN5c3RlbXMKLSAgIChIUC1VWCBBLjA4LjA3IGZvciBleGFtcGxlKSBkZWZpbmUgdGhlc2UgaW4gPHVuaXN0ZC5oPi4gICovCi0jdW5kZWYJRk5NX1BBVEhOQU1FCi0jdW5kZWYJRk5NX05PRVNDQVBFCi0jdW5kZWYJRk5NX1BFUklPRAotCi0vKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGZubWF0Y2gnLiAgKi8KLSNkZWZpbmUJRk5NX1BBVEhOQU1FCSgxIDw8IDApIC8qIE5vIHdpbGRjYXJkIGNhbiBldmVyIG1hdGNoIGAvJy4gICovCi0jZGVmaW5lCUZOTV9OT0VTQ0FQRQkoMSA8PCAxKSAvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBzcGVjaWFsIGNoYXJzLiAgKi8KLSNkZWZpbmUJRk5NX1BFUklPRAkoMSA8PCAyKSAvKiBMZWFkaW5nIGAuJyBpcyBtYXRjaGVkIG9ubHkgZXhwbGljaXRseS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX1BPU0lYX0NfU09VUkNFKSB8fCBfUE9TSVhfQ19TT1VSQ0UgPCAyIHx8IGRlZmluZWQgKF9HTlVfU09VUkNFKQotI2RlZmluZQlGTk1fRklMRV9OQU1FCUZOTV9QQVRITkFNRSAvKiBQcmVmZXJyZWQgR05VIG5hbWUuICAqLwotI2RlZmluZQlGTk1fTEVBRElOR19ESVIJKDEgPDwgMykgLyogSWdub3JlIGAvLi4uJyBhZnRlciBhIG1hdGNoLiAgKi8KLSNkZWZpbmUJRk5NX0NBU0VGT0xECSgxIDw8IDQpIC8qIENvbXBhcmUgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4gICovCi0jZW5kaWYKLQotLyogVmFsdWUgcmV0dXJuZWQgYnkgYGZubWF0Y2gnIGlmIFNUUklORyBkb2VzIG5vdCBtYXRjaCBQQVRURVJOLiAgKi8KLSNkZWZpbmUJRk5NX05PTUFUQ0gJMQotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLAotICAgcmV0dXJuaW5nIHplcm8gaWYgaXQgbWF0Y2hlcywgRk5NX05PTUFUQ0ggaWYgbm90LiAgKi8KLWV4dGVybiBpbnQgZm5tYXRjaCBfX1AgKChjb25zdCBjaGFyICpfX3BhdHRlcm4sIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAotCQkJIGludCBfX2ZsYWdzKSk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbm1hdGNoLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tYmluLmggYi9pbmNsdWRlL2ZvcGVuLWJpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY4ZjYzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tYmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yICJiaW5hcnkiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKLSAgIGRpZmZlcmVudC4gIEFuIGV4YW1wbGUgaXMgTWVzcy1Eb3NlLiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbwotICAgY29wZSB3aXRoIGEgImIiIGluIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcwotICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgotCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIKLSNkZWZpbmUgRk9QRU5fV0IgCSJ3YiIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhYiIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIgotI2RlZmluZSBGT1BFTl9XVUIgCSJ3K2IiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErYiIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLXNhbWUuaCBiL2luY2x1ZGUvZm9wZW4tc2FtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3NTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tc2FtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAic2FtZSIgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQotICAgdGhlIHNhbWUuICBBbiBleGFtcGxlIGlzIFVuaXguICBNYW55IFVuaXggc3lzdGVtcyBjb3VsZCBhbHNvIGFkZCBhCi0gICAiYiIgdG8gdGhlIHN0cmluZywgaW5kaWNhdGluZyBiaW5hcnkgZmlsZXMsIGJ1dCBzb21lIHJlamVjdCB0aGlzCi0gICAoYW5kIHRoZXJlYnkgZG9uJ3QgY29uZm9ybSB0byBBTlNJIEMsIGJ1dCB3aGF0IGVsc2UgaXMgbmV3PykuCi0KLSAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KLSAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQotICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKLSAgIHZhcmlhbnQgc3lzdGVtcy4gICovCi0KLSNkZWZpbmUgRk9QRU5fUkIJInIiCi0jZGVmaW5lIEZPUEVOX1dCIAkidyIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhIgotI2RlZmluZSBGT1BFTl9SVUIgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErIgotCi0jZGVmaW5lIEZPUEVOX1JUCSJyIgotI2RlZmluZSBGT1BFTl9XVCAJInciCi0jZGVmaW5lIEZPUEVOX0FUIAkiYSIKLSNkZWZpbmUgRk9QRU5fUlVUIAkicisiCi0jZGVmaW5lIEZPUEVOX1dVVCAJIncrIgotI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tdm1zLmggYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc2YjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIFZNUyBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCi0gICBkaWZmZXJlbnQuCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1dCIAkid2IiLCJyZm09dmFyIgotI2RlZmluZSBGT1BFTl9BQiAJImFiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidytiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fQVVCIAkiYStiIiwicmZtPXZhciIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkYm0uaCBiL2luY2x1ZGUvZ2RibS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJjMjZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2RibS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogR05VIERCTSAtIERhdGFCYXNlIE1hbmFnZXIgaW5jbHVkZSBmaWxlCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcCBBLiBOZWxzb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlvdSBtYXkgY29udGFjdCB0aGUgYXV0aG9yIGJ5OgotICAgICAgIGUtbWFpbDogIHBoaWxAd3d1LmVkdQotICAgICAgdXMtbWFpbDogIFBoaWxpcCBBLiBOZWxzb24KLSAgICAgICAgICAgICAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQKLSAgICAgICAgICAgICAgICBXZXN0ZXJuIFdhc2hpbmd0b24gVW5pdmVyc2l0eQotICAgICAgICAgICAgICAgIEJlbGxpbmdoYW0sIFdBIDk4MjI2Ci0gICAgICAgIHBob25lOiAgKDIwNikgNjc2LTMwMzUKLSAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFBhcmFtZXRlcnMgdG8gZ2RibV9vcGVuIGZvciBSRUFERVJTLCBXUklURVJTLCBhbmQgV1JJVEVSUyB3aG8KLSAgIGNhbiBjcmVhdGUgdGhlIGRhdGFiYXNlLiAqLwotI2RlZmluZSAgR0RCTV9SRUFERVIgIDAKLSNkZWZpbmUgIEdEQk1fV1JJVEVSICAxCi0jZGVmaW5lICBHREJNX1dSQ1JFQVQgMgotI2RlZmluZSAgR0RCTV9ORVdEQiAgIDMKLQotLyogUGFyYW1ldGVycyB0byBnZGJtX3N0b3JlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2VtZW50LiAqLwotI2RlZmluZSAgR0RCTV9JTlNFUlQgIDAKLSNkZWZpbmUgIEdEQk1fUkVQTEFDRSAxCi0KLQotLyogVGhlIGRhdGEgYW5kIGtleSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKmRwdHI7Ci0JaW50ICAgZHNpemU7Ci0gICAgICB9IGRhdHVtOwotCi0KLS8qIFRoZSBmaWxlIGluZm9ybWF0aW9uIGhlYWRlci4gVGhpcyBpcyBnb29kIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICovCi10eXBlZGVmIHN0cnVjdCB7aW50IGR1bW15WzEwXTt9ICpHREJNX0ZJTEU7Ci0KLQotLyogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyEgKi8KLQotZXh0ZXJuIEdEQk1fRklMRSBnZGJtX29wZW4gKCk7Ci0KLWV4dGVybiB2b2lkCSBnZGJtX2Nsb3NlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmV0Y2ggKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fc3RvcmUgKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fZGVsZXRlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmlyc3RrZXkgKCk7Ci0KLWV4dGVybiBkYXR1bQkgZ2RibV9uZXh0a2V5ICgpOwotCi1leHRlcm4gaW50CSBnZGJtX3Jlb3JnYW5pemUgKCk7Ci0KLQotLyogZ2RibSBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgaW4gdGhlIHZhcmlhYmxlIGdkYm1fZXJybm8uICovCi10eXBlZGVmIGVudW0gewlOT19FUlJPUiwKLQkJTUFMTE9DX0VSUk9SLAotCQlCTE9DS19TSVpFX0VSUk9SLAotCQlGSUxFX09QRU5fRVJST1IsCi0JCUZJTEVfV1JJVEVfRVJST1IsCi0JCUZJTEVfU0VFS19FUlJPUiwKLQkJRklMRV9SRUFEX0VSUk9SLAotCQlCQURfTUFHSUNfTlVNQkVSLAotCQlFTVBUWV9EQVRBQkFTRSwKLQkJQ0FOVF9CRV9SRUFERVIsCi0JICAgICAgICBDQU5UX0JFX1dSSVRFUiwKLQkJUkVBREVSX0NBTlRfUkVDT1ZFUiwKLQkJUkVBREVSX0NBTlRfREVMRVRFLAotCQlSRUFERVJfQ0FOVF9TVE9SRSwKLQkJUkVBREVSX0NBTlRfUkVPUkdBTklaRSwKLQkJVU5LTk9XTl9VUERBVEUsCi0JCUlURU1fTk9UX0ZPVU5ELAotCQlSRU9SR0FOSVpFX0ZBSUxFRCwKLQkJQ0FOTk9UX1JFUExBQ0V9Ci0JZ2RibV9lcnJvcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2V0b3B0LmggYi9pbmNsdWRlL2dldG9wdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjMwNzE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2V0b3B0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVE9QVF9ICi0jZGVmaW5lIF9HRVRPUFRfSCAxCi0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKLSAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgotICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKLSAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCi0KLWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLS8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgotICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKLSAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCi0KLSAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCi0KLSAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQotICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgotCi0gICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0Ci0gICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UgYGdldG9wdCcgcHJpbnRzCi0gICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLwotCi1leHRlcm4gaW50IG9wdGVycjsKLQotLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4gICovCi0KLWV4dGVybiBpbnQgb3B0b3B0OwotCi0vKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKLSAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKLSAgIHplcm8uCi0KLSAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6Ci0gICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKLSAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAotICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi0gICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAotICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAotICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCi0KLSAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KLSAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQotICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KLSAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKLSAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCi0KLXN0cnVjdCBvcHRpb24KLXsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbHNlCi0gIGNoYXIgKm5hbWU7Ci0jZW5kaWYKLSAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKLSAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KLSAgaW50IGhhc19hcmc7Ci0gIGludCAqZmxhZzsKLSAgaW50IHZhbDsKLX07Ci0KLS8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KLQotI2RlZmluZQlub19hcmd1bWVudAkJMAotI2RlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCi0jZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKLSAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KLSAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCi1leHRlcm4gaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMpOwotI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci0jZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCi1leHRlcm4gaW50IGdldG9wdF9sb25nIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywKLQkJICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLWV4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLQotLyogSW50ZXJuYWwgb25seS4gIFVzZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiAgKi8KLWV4dGVybiBpbnQgX2dldG9wdF9pbnRlcm5hbCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kLAotCQkJICAgICBpbnQgbG9uZ19vbmx5KTsKLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci1leHRlcm4gaW50IGdldG9wdF9sb25nICgpOwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZ19vbmx5ICgpOwotCi1leHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKCk7Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2lmZGVmCV9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhc2h0YWIuaCBiL2luY2x1ZGUvaGFzaHRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUyMzkzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFzaHRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIEFuIGV4cGFuZGFibGUgaGFzaCB0YWJsZXMgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFZsYWRpbWlyIE1ha2Fyb3YgKHZtYWthcm92QGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBhY2thZ2UgaW1wbGVtZW50cyBiYXNpYyBoYXNoIHRhYmxlIGZ1bmN0aW9uYWxpdHkuICBJdCBpcyBwb3NzaWJsZQotICAgdG8gc2VhcmNoIGZvciBhbiBlbnRyeSwgY3JlYXRlIGFuIGVudHJ5IGFuZCBkZXN0cm95IGFuIGVudHJ5LgotCi0gICBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIGdlbmVyaWMgcG9pbnRlcnMuCi0KLSAgIFRoZSBzaXplIG9mIHRoZSB0YWJsZSBpcyBub3QgZml4ZWQ7IGlmIHRoZSBvY2N1cGFuY3kgb2YgdGhlIHRhYmxlCi0gICBncm93cyB0b28gaGlnaCB0aGUgaGFzaCB0YWJsZSB3aWxsIGJlIGV4cGFuZGVkLgotCi0gICBUaGUgYWJzdHJhY3QgZGF0YSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBnZW5lcmFsaXplZCBBbGdvcml0aG0gRAotICAgZnJvbSBLbnV0aCdzIGJvb2sgIlRoZSBhcnQgb2YgY29tcHV0ZXIgcHJvZ3JhbW1pbmciLiAgSGFzaCB0YWJsZSBpcwotICAgZXhwYW5kZWQgYnkgY3JlYXRpb24gb2YgbmV3IGhhc2ggdGFibGUgYW5kIHRyYW5zZmVycmluZyBlbGVtZW50cyBmcm9tCi0gICB0aGUgb2xkIHRhYmxlIHRvIHRoZSBuZXcgdGFibGUuICAqLwotCi0jaWZuZGVmIF9fSEFTSFRBQl9IX18KLSNkZWZpbmUgX19IQVNIVEFCX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLiAgKi8KLQotLyogQ2FsY3VsYXRlIGhhc2ggb2YgYSB0YWJsZSBlbnRyeS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCAoKmh0YWJfaGFzaCkgUEFSQU1TICgoY29uc3Qgdm9pZCAqKSk7Ci0KLS8qIENvbXBhcmUgYSB0YWJsZSBlbnRyeSB3aXRoIGEgcG9zc2libGUgZW50cnkuICBUaGUgZW50cnkgYWxyZWFkeSBpbgotICAgdGhlIHRhYmxlIGFsd2F5cyBjb21lcyBmaXJzdCwgc28gdGhlIHNlY29uZCBlbGVtZW50IGNhbiBiZSBvZiBhCi0gICBkaWZmZXJlbnQgdHlwZSAoYnV0IGluIHRoaXMgY2FzZSBodGFiX2ZpbmQgYW5kIGh0YWJfZmluZF9zbG90Ci0gICBjYW5ub3QgYmUgdXNlZDsgaW5zdGVhZCB0aGUgdmFyaWFudHMgdGhhdCBhY2NlcHQgYSBoYXNoIHZhbHVlCi0gICBtdXN0IGJlIHVzZWQpLiAgKi8KLXR5cGVkZWYgaW50ICgqaHRhYl9lcSkgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLQotLyogQ2xlYW51cCBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgYSBsaXZlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZS4gICovCi10eXBlZGVmIHZvaWQgKCpodGFiX2RlbCkgUEFSQU1TICgodm9pZCAqKSk7Ci0gIAotLyogRnVuY3Rpb24gY2FsbGVkIGJ5IGh0YWJfdHJhdmVyc2UgZm9yIGVhY2ggbGl2ZSBlbGVtZW50LiAgVGhlIGZpcnN0Ci0gICBhcmcgaXMgdGhlIHNsb3Qgb2YgdGhlIGVsZW1lbnQgKHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gaHRhYl9jbGVhcl9zbG90Ci0gICBpZiBkZXNpcmVkKSwgdGhlIHNlY29uZCBhcmcgaXMgdGhlIGF1eGlsaWFyeSBwb2ludGVyIGhhbmRlZCB0bwotICAgaHRhYl90cmF2ZXJzZS4gIFJldHVybiAxIHRvIGNvbnRpbnVlIHNjYW4sIDAgdG8gc3RvcC4gICovCi10eXBlZGVmIGludCAoKmh0YWJfdHJhdikgUEFSQU1TICgodm9pZCAqKiwgdm9pZCAqKSk7Ci0KLS8qIEhhc2ggdGFibGVzIGFyZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUuICBUaGUgc3RydWN0dXJlCi0gICAoaW1wbGVtZW50YXRpb24pIG9mIHRoaXMgdHlwZSBpcyBub3QgbmVlZGVkIGZvciB1c2luZyB0aGUgaGFzaAotICAgdGFibGVzLiAgQWxsIHdvcmsgd2l0aCBoYXNoIHRhYmxlIHNob3VsZCBiZSBleGVjdXRlZCBvbmx5IHRocm91Z2gKLSAgIGZ1bmN0aW9ucyBtZW50aW9uZWQgYmVsb3cuICovCi0KLXN0cnVjdCBodGFiCi17Ci0gIC8qIFBvaW50ZXIgdG8gaGFzaCBmdW5jdGlvbi4gICovCi0gIGh0YWJfaGFzaCBoYXNoX2Y7Ci0KLSAgLyogUG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uLiAgKi8KLSAgaHRhYl9lcSBlcV9mOwotCi0gIC8qIFBvaW50ZXIgdG8gY2xlYW51cCBmdW5jdGlvbi4gICovCi0gIGh0YWJfZGVsIGRlbF9mOwotCi0gIC8qIFRhYmxlIGl0c2VsZi4gICovCi0gIHZvaWQgKiplbnRyaWVzOwotCi0gIC8qIEN1cnJlbnQgc2l6ZSAoaW4gZW50cmllcykgb2YgdGhlIGhhc2ggdGFibGUgKi8KLSAgc2l6ZV90IHNpemU7Ci0KLSAgLyogQ3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW5jbHVkaW5nIGFsc28gZGVsZXRlZCBlbGVtZW50cyAqLwotICBzaXplX3Qgbl9lbGVtZW50czsKLQotICAvKiBDdXJyZW50IG51bWJlciBvZiBkZWxldGVkIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAqLwotICBzaXplX3Qgbl9kZWxldGVkOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgbWVtYmVyIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4gSXRzIHZhbHVlIGlzIG51bWJlcgotICAgICBvZiBhbGwgY2FsbHMgb2YgYGh0YWJfZmluZF9zbG90JyBmb3IgdGhlIGhhc2ggdGFibGUuICovCi0gIHVuc2lnbmVkIGludCBzZWFyY2hlczsKLQotICAvKiBUaGUgZm9sbG93aW5nIG1lbWJlciBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuICBJdHMgdmFsdWUgaXMgbnVtYmVyCi0gICAgIG9mIGNvbGxpc2lvbnMgZml4ZWQgZm9yIHRpbWUgb2Ygd29yayB3aXRoIHRoZSBoYXNoIHRhYmxlLiAqLwotICB1bnNpZ25lZCBpbnQgY29sbGlzaW9uczsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGh0YWIgKmh0YWJfdDsKLQotLyogVGhlIHByb3RvdHlwZXMgb2YgdGhlIHBhY2thZ2UgZnVuY3Rpb25zLiAqLwotCi1leHRlcm4gaHRhYl90CWh0YWJfY3JlYXRlCVBBUkFNUyAoKHNpemVfdCwgaHRhYl9oYXNoLAotCQkJCQkgaHRhYl9lcSwgaHRhYl9kZWwpKTsKLWV4dGVybiB2b2lkCWh0YWJfZGVsZXRlCVBBUkFNUyAoKGh0YWJfdCkpOwotZXh0ZXJuIHZvaWQJaHRhYl9lbXB0eQlQQVJBTVMgKChodGFiX3QpKTsKLQotZXh0ZXJuIHZvaWQgICAgKmh0YWJfZmluZAlQQVJBTVMgKChodGFiX3QsIGNvbnN0IHZvaWQgKikpOwotZXh0ZXJuIHZvaWQgICAqKmh0YWJfZmluZF9zbG90CVBBUkFNUyAoKGh0YWJfdCwgY29uc3Qgdm9pZCAqLCBpbnQpKTsKLWV4dGVybiB2b2lkICAgICpodGFiX2ZpbmRfd2l0aF9oYXNoCQlQQVJBTVMgKChodGFiX3QsIGNvbnN0IHZvaWQgKiwKLQkJCQkJCQkgdW5zaWduZWQgaW50KSk7Ci1leHRlcm4gdm9pZCAgICoqaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoCVBBUkFNUyAoKGh0YWJfdCwgY29uc3Qgdm9pZCAqLAotCQkJCQkJCSB1bnNpZ25lZCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQJaHRhYl9jbGVhcl9zbG90CVBBUkFNUyAoKGh0YWJfdCwgdm9pZCAqKikpOwotZXh0ZXJuIHZvaWQJaHRhYl9yZW1vdmVfZWx0CVBBUkFNUyAoKGh0YWJfdCwgdm9pZCAqKSk7Ci0KLWV4dGVybiB2b2lkCWh0YWJfdHJhdmVyc2UJUEFSQU1TICgoaHRhYl90LCBodGFiX3RyYXYsIHZvaWQgKikpOwotCi1leHRlcm4gc2l6ZV90CWh0YWJfc2l6ZQlQQVJBTVMgKChodGFiX3QpKTsKLWV4dGVybiBzaXplX3QJaHRhYl9lbGVtZW50cwlQQVJBTVMgKChodGFiX3QpKTsKLWV4dGVybiBkb3VibGUJaHRhYl9jb2xsaXNpb25zCVBBUkFNUyAoKGh0YWJfdCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19IQVNIVEFCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHAtc3ltdGFiLmggYi9pbmNsdWRlL2hwLXN5bXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYyNmMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHAtc3ltdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODc0ICswLDAgQEAKLS8qIERlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciByZWFkaW5nIGRlYnVnIHN5bWJvbHMgZnJvbSB0aGUKLSAgIG5hdGl2ZSBIUCBDIGNvbXBpbGVyLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBIUF9TWU1UQUJfSU5DTFVERUQKLSNkZWZpbmUgSFBfU1lNVEFCX0lOQ0xVREVECi0KLS8qIEdlbmVyYWwgaW5mb3JtYXRpb246Ci0KLSAgIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbmQgZGVzY3JpYmVzIG9ubHkgdGhlIGRhdGEgc3RydWN0dXJlcwotICAgbmVjZXNzYXJ5IHRvIHJlYWQgZGVidWcgc3ltYm9scyBwcm9kdWNlZCBieSB0aGUgSFAgQyBjb21waWxlciwKLSAgIEhQIEFOU0kgQysrIGNvbXBpbGVyLCBhbmQgSFAgRk9SVFJBTiA5MCBjb21waWxlciB1c2luZyB0aGUKLSAgIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuICAKLSAgIChGb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1ZyBmb3JtYXQsIGZ0cCBocHV4LXN5bXRhYi5oIGZyb20KLSAgIGphZ3Vhci5jcy51dGFoLmVkdTovZGlzdCkuCi0gICAKLSAgIEFkZGl0aW9uYWwgbm90ZXMgKFJpY2ggVGl0bGUpCi0gICBUaGlzIGZpbGUgaXMgYSByZXZlcnNlLWVuZ2luZWVyZWQgdmVyc2lvbiBvZiBhIGZpbGUgY2FsbGVkCi0gICAic3ltdGFiLmgiIHdoaWNoIGV4aXN0cyBpbnRlcm5hbCB0byBIUCdzIENvbXB1dGVyIExhbmd1YWdlcyBPcmdhbml6YXRpb24KLSAgIGluIC9DTE8vQ29tcG9uZW50cy9EREUvb2JqL3NvbS9zeW10YWIuaC4gQmVjYXVzZSBIUCdzIHZlcnNpb24gb2YKLSAgIHRoZSBmaWxlIGlzIGNvcHlyaWdodGVkIGFuZCBub3QgZGlzdHJpYnV0ZWQsIGl0IGlzIG5lY2Vzc2FyeSBmb3IKLSAgIEdEQiB0byB1c2UgdGhlIHJldmVyc2UtZW5naW5lZXJlZCB2ZXJzaW9uIHRoYXQgZm9sbG93cy4KLSAgIFdvcmsgd2FzIGRvbmUgYnkgQ3lnbnVzIHRvIHJldmVyc2UtZW5naW5lZXIgdGhlIEMgc3Vic2V0IG9mIHN5bXRhYi5oLgotICAgVGhlIFdEQiBwcm9qZWN0IGhhcyBleHRlbmRlZCB0aGlzIHRvIGFsc28gY29udGFpbiB0aGUgQysrIAotICAgc3ltYm9sIGRlZmluaXRpb25zLCB0aGUgRjkwIHN5bWJvbCBkZWZpbml0aW9ucywgCi0gICBhbmQgdGhlIERPQyAoZGVidWdnaW5nLW9wdGltaXplZC1jb2RlKSBzeW1ib2wgZGVmaW5pdGlvbnMuCi0gICBJbiBzb21lIGNhc2VzICh0aGUgQysrIHN5bWJvbCBkZWZpbml0aW9ucykKLSAgIEkgaGF2ZSBhZGRlZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGhlcmUgdGhhdAotICAgZ29lcyBiZXlvbmQgd2hhdCBpcyBzdXBwbGllZCBpbiBIUCdzIHN5bXRhYi5oLiBJZiB3ZSBzb21lZGF5Ci0gICB1bmlmeSB0aGVzZSBmaWxlcyBhZ2FpbiwgdGhlIGV4dHJhIGNvbW1lbnRzIHNob3VsZCBiZSBtZXJnZWQgYmFjawotICAgaW50byBIUCdzIHN5bXRhYi5oLgotICAKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgRGVidWcgc3ltYm9scyBhcmUgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiBhbiB1bmxvYWRhYmxlIHNwYWNlIGNhbGxlZAotICAgJERFQlVHJC4gICRERUJVRyQgY29udGFpbnMgc2V2ZXJhbCBzdWJzcGFjZXMgd2hpY2ggZ3JvdXAgcmVsYXRlZAotICAgZGVidWcgc3ltYm9scy4KLQotICAgJEdOVFQkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgdmFyaWFibGVzLCB0eXBlcyBhbmQgY29udGFudHMuCi0KLSAgICRMTlRUJCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgcHJvY2VkdXJlcyAoaW5jbHVkaW5nIG5lc3RpbmcpLCBzY29waW5nCi0gICBpbmZvcm1hdGlvbiwgbG9jYWwgdmFyaWFibGVzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQotICAgJFNMVCQgY29udGFpbnMgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gc28gdGhhdCBjb2RlIGFkZHJlc3NlcyBtYXkgYmUKLSAgIG1hcHBlZCB0byBzb3VyY2UgbGluZXMuCi0KLSAgICRWVCQgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIGFuZCBjb25zdGFudHMgZm9yIG5hbWVkIG9iamVjdHMgKHZhcmlhYmxlcywKLSAgIHR5cGVkZWZzLCBmdW5jdGlvbnMsIGV0YykuICBTdHJpbmdzIGFyZSBzdG9yZWQgYXMgbnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlcgotICAgbGlzdHMuICBDb25zdGFudHMgYWx3YXlzIGJlZ2luIG9uIHdvcmQgYm91bmRhcmllcy4gIFRoZSBmaXJzdCBieXRlIG9mCi0gICB0aGUgVlQgbXVzdCBiZSB6ZXJvIChhIG51bGwgc3RyaW5nKS4KLQotICAgJFhUJCBpcyBub3QgY3VycmVudGx5IHVzZWQgYnkgR0RCLgotCi0gICBNYW55IHN0cnVjdHVyZXMgd2l0aGluIHRoZSBzdWJzcGFjZXMgcG9pbnQgdG8gb3RoZXIgc3RydWN0dXJlcyB3aXRoaW4KLSAgIHRoZSBzYW1lIHN1YnNwYWNlLCBvciB0byBzdHJ1Y3R1cmVzIHdpdGhpbiBhIGRpZmZlcmVudCBzdWJzcGFjZS4gIFRoZXNlCi0gICBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJ1Y3R1cmUgaW5kZXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYXBwcm9wcmlhdGUgc3Vic3BhY2UuICAqLwotCi0vKiBVc2VkIHRvIGRlc2NyaWJlIHdoZXJlIGEgY29uc3RhbnQgaXMgc3RvcmVkLiAgKi8KLWVudW0gbG9jYXRpb25fdHlwZQotewotICBMT0NBVElPTl9JTU1FRElBVEUsCi0gIExPQ0FUSU9OX1BUUiwKLSAgTE9DQVRJT05fVlQsCi19OwotCi0vKiBMYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGVidWcgZm9ybWF0LiAgV2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZXMKLSAgIHRoaXMgdHlwZSBpcyBsaW1pdGVkIHRvIDQgYml0cyBmb3IgYSBtYXhpbXVtIG9mIDE2IGxhbmd1YWdlcy4gICovCi1lbnVtIGhwX2xhbmd1YWdlCi17Ci0gIEhQX0xBTkdVQUdFX1VOS05PV04sCi0gIEhQX0xBTkdVQUdFX0MsCi0gIEhQX0xBTkdVQUdFX0ZPUlRSQU4sCi0gIEhQX0xBTkdVQUdFX0Y3NyA9IEhQX0xBTkdVQUdFX0ZPUlRSQU4sCi0gIEhQX0xBTkdVQUdFX1BBU0NBTCwKLSAgSFBfTEFOR1VBR0VfTU9EQ0FMLAotICBIUF9MQU5HVUFHRV9DT0JPTCwKLSAgSFBfTEFOR1VBR0VfQkFTSUMsCi0gIEhQX0xBTkdVQUdFX0FEQSwKLSAgSFBfTEFOR1VBR0VfQ1BMVVNQTFVTLAotICBIUF9MQU5HVUFHRV9ETVBBU0NBTAotfTsKLQotCi0vKiBCYXNpYyBkYXRhIHR5cGVzIGF2YWlsYWJsZSBpbiB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YQotICAgc3RydWN0dXJlcyB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA1IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAzMiBiYXNpYwotICAgZGF0YSB0eXBlcy4gICovCi1lbnVtIGhwX3R5cGUKLXsKLSAgSFBfVFlQRV9VTkRFRklORUQsIC8qIDAgKi8KLSAgSFBfVFlQRV9CT09MRUFOLCAvKiAxICovCi0gIEhQX1RZUEVfQ0hBUiwgLyogMiAqLwotICBIUF9UWVBFX0lOVCwgLyogMyAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0lOVCwgLyogNCAqLwotICBIUF9UWVBFX1JFQUwsIC8qIDUgKi8KLSAgSFBfVFlQRV9DT01QTEVYLCAvKiA2ICovCi0gIEhQX1RZUEVfU1RSSU5HMjAwLCAvKiA3ICovCi0gIEhQX1RZUEVfTE9OR1NUUklORzIwMCwgLyogOCAqLwotICBIUF9UWVBFX1RFWFQsIC8qIDkgKi8KLSAgSFBfVFlQRV9GTEFCRUwsIC8qIDEwICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TUEVDLCAvKiAxMSAqLwotICBIUF9UWVBFX01PRF9TVFJJTkdfU1BFQywgLyogMTIgKi8KLSAgSFBfVFlQRV9QQUNLRURfREVDSU1BTCwgLyogMTMgKi8KLSAgSFBfVFlQRV9SRUFMXzMwMDAsIC8qIDE0ICovCi0gIEhQX1RZUEVfTU9EX1NUUklOR18zMDAwLCAvKiAxNSAqLwotICBIUF9UWVBFX0FOWVBPSU5URVIsIC8qIDE2ICovCi0gIEhQX1RZUEVfR0xPQkFMX0FOWVBPSU5URVIsIC8qIDE3ICovCi0gIEhQX1RZUEVfTE9DQUxfQU5ZUE9JTlRFUiwgLyogMTggKi8KLSAgSFBfVFlQRV9DT01QTEVYUzMwMDAsIC8qIDE5ICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TMzAwX0NPTVBBVCwgLyogMjAgKi8gCi0gIEhQX1RZUEVfRlROX1NUUklOR19WQVhfQ09NUEFULCAvKiAyMSAqLwotICBIUF9UWVBFX0JPT0xFQU5fUzMwMF9DT01QQVQsIC8qIDIyICovCi0gIEhQX1RZUEVfQk9PTEVBTl9WQVhfQ09NUEFULCAvKiAyMyAqLwotICBIUF9UWVBFX1dJREVfQ0hBUiwgLyogMjQgKi8KLSAgSFBfVFlQRV9MT05HLCAvKiAyNSAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0xPTkcsIC8qIDI2ICovCi0gIEhQX1RZUEVfRE9VQkxFLCAvKiAyNyAqLwotICBIUF9UWVBFX1RFTVBMQVRFX0FSRywgLyogMjggKi8KLSAgSFBfVFlQRV9WT0lEIC8qIDI5ICovCi19OwotCi0vKiBBbiBpbW1lZGlhdGUgbmFtZSBhbmQgdHlwZSB0YWJsZSBlbnRyeS4KLQotICAgZXh0ZW5zaW9uIGFuZCBpbW1lZGlhdGUgd2lsbCBhbHdheXMgYmUgb25lLgotICAgZ2xvYmFsIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBocF90eXBlIGlzIHRoZSBiYXNpYyB0eXBlIHRoaXMgZW50cnkgZGVzY3JpYmVzLgotICAgYml0bGVuZ3RoIGlzIHRoZSBsZW5ndGggaW4gYml0cyBmb3IgdGhlIGJhc2ljIHR5cGUuICAqLwotc3RydWN0IGRudHRwX2ltbWVkaWF0ZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlOgkxOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGU6IAkJNTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDoJMjQ7Ci19OwotCi0vKiBBIG5vbmltbWVkaWF0ZSBuYW1lIGFuZCB0eXBlIHRhYmxlIGVudHJ5LgotCi0gICBleHRlbnNpb24gd2lsbCBhbHdheXMgYmUgb25lLgotICAgaW1tZWRpYXRlIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBpZiBnbG9iYWwgaXMgemVybywgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgTE5UVAotICAgaWYgZ2xvYmFsIGlzIG9uZSwgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgR05UVAotICAgaW5kZXggaXMgdGhlIGluZGV4IHdpdGhpbiB0aGUgR05UVCBvciBMTlRUIGZvciB0aGlzIGVudHJ5LiAgKi8KLXN0cnVjdCBkbnR0cF9ub25pbW1lZGlhdGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGltbWVkaWF0ZToJMTsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoJCTI5OwotfTsKLQotLyogQSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBHTlRUIGFuZCBMTlRUIHRhYmxlcy4gIEl0IGhhcyB0d28KLSAgIGZvcm1zIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBiZWluZyBkZXNjcmliZWQuCi0KLSAgIFRoZSBpbW1lZGlhdGUgZm9ybSBpcyB1c2VkIGZvciBzaW1wbGUgZW50cmllcyBhbmQgaXMgb25lCi0gICB3b3JkLgotCi0gICBUaGUgbm9uaW1tZWRpYXRlIGZvcm0gaXMgdXNlZCBmb3IgY29tcGxleCBlbnRyaWVzIGFuZCBjb250YWlucwotICAgYW4gaW5kZXggaW50byB0aGUgTE5UVCBvciBHTlRUIHdoaWNoIGRlc2NyaWJlcyB0aGUgZW50aXJlIHR5cGUuCi0KLSAgIElmIGEgZG50dHBvaW50ZXIgaXMgLTEsIHRoZW4gaXQgaXMgYSBOSUwgZW50cnkuICAqLwotCi0jZGVmaW5lIEROVFROSUwgKC0xKQotdHlwZWRlZiB1bmlvbiBkbnR0cG9pbnRlcgotewotICBzdHJ1Y3QgZG50dHBfaW1tZWRpYXRlICAgIGRudHRpOwotICBzdHJ1Y3QgZG50dHBfbm9uaW1tZWRpYXRlIGRudHRwOwotICBpbnQgd29yZDsKLX0gZG50dHBvaW50ZXI7Ci0KLS8qIEFuIGluZGV4IGludG8gdGhlIHNvdXJjZSBsaW5lIHRhYmxlLiAgQXMgd2l0aCBkbnR0cG9pbnRlcnMsIGEgc2x0cG9pbnRlcgotICAgb2YgLTEgaW5kaWNhdGVzIGEgTklMIGVudHJ5LiAgKi8KLSNkZWZpbmUgU0xUTklMICgtMSkKLXR5cGVkZWYgaW50IHNsdHBvaW50ZXI7Ci0KLS8qIEluZGV4IGludG8gRE9DICg9ICJEZWJ1Z2dpbmcgT3B0aW1pemVkIENvZGUiKSBsaW5lIHRhYmxlICovCi0jZGVmaW5lIExUTklMICgtMSkKLXR5cGVkZWYgaW50IGx0cG9pbnRlcjsKLQotLyogSW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0jZGVmaW5lIENUWFROSUwgKC0xKQotdHlwZWRlZiBpbnQgY3R4dHBvaW50ZXI7Ci0KLS8qIFVuc2lnbmVkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIFZULiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHZ0cG9pbnRlcjsKLQotLyogQSBETlRUIGVudHJ5ICh1c2VkIHdpdGhpbiB0aGUgR05UVCBhbmQgTE5UVCkuCi0KLSAgIEROVFQgZW50cmllcyBhcmUgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cywgYnV0IGFyZSBhbHdheXMgYSBtdWx0aXBsZQotICAgb2YgMyB3b3JkcyAod2UgY2FsbCBlYWNoIGdyb3VwIG9mIDMgd29yZHMgYSAiYmxvY2siKS4KLQotICAgVGhlIGZpcnN0IGJpdCBpbiBlYWNoIGJsb2NrIGlzIGFuIGV4dGVuc2lvbiBiaXQuICBUaGlzIGJpdCBpcyB6ZXJvCi0gICBmb3IgdGhlIGZpcnN0IGJsb2NrIG9mIGEgRE5UVCBlbnRyeS4gIElmIHRoZSBlbnRyeSByZXF1aXJlcyBtb3JlCi0gICB0aGFuIG9uZSBibG9jaywgdGhlbiB0aGlzIGJpdCBpcyBzZXQgdG8gb25lIGluIGFsbCBibG9ja3MgYWZ0ZXIKLSAgIHRoZSBmaXJzdCBvbmUuICAqLwotCi0vKiBFYWNoIEROVFQgZW50cnkgZGVzY3JpYmVzIGEgcGFydGljdWxhciBkZWJ1ZyBzeW1ib2wgKGJlZ2lubmluZyBvZgotICAgYSBzb3VyY2UgZmlsZSwgYSBmdW5jdGlvbiwgdmFyaWFibGVzLCBzdHJ1Y3R1cmVzLCBldGMuCi0KLSAgIFRoZSB0eXBlIG9mIHRoZSBETlRUIGVudHJ5IGlzIHN0b3JlZCBpbiB0aGUgImtpbmQiIGZpZWxkIHdpdGhpbiB0aGUKLSAgIEROVFQgZW50cnkgaXRzZWxmLiAgKi8KLQotZW51bSBkbnR0X2VudHJ5X3R5cGUKLXsKLSAgRE5UVF9UWVBFX05JTCA9IC0xLAotICBETlRUX1RZUEVfU1JDRklMRSwKLSAgRE5UVF9UWVBFX01PRFVMRSwKLSAgRE5UVF9UWVBFX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRU5UUlksCi0gIEROVFRfVFlQRV9CRUdJTiwKLSAgRE5UVF9UWVBFX0VORCwKLSAgRE5UVF9UWVBFX0lNUE9SVCwKLSAgRE5UVF9UWVBFX0xBQkVMLAotICBETlRUX1RZUEVfRlBBUkFNLAotICBETlRUX1RZUEVfU1ZBUiwKLSAgRE5UVF9UWVBFX0RWQVIsCi0gIEROVFRfVFlQRV9IT0xFMSwKLSAgRE5UVF9UWVBFX0NPTlNULAotICBETlRUX1RZUEVfVFlQRURFRiwKLSAgRE5UVF9UWVBFX1RBR0RFRiwKLSAgRE5UVF9UWVBFX1BPSU5URVIsCi0gIEROVFRfVFlQRV9FTlVNLAotICBETlRUX1RZUEVfTUVNRU5VTSwKLSAgRE5UVF9UWVBFX1NFVCwKLSAgRE5UVF9UWVBFX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQVJSQVksCi0gIEROVFRfVFlQRV9TVFJVQ1QsCi0gIEROVFRfVFlQRV9VTklPTiwKLSAgRE5UVF9UWVBFX0ZJRUxELAotICBETlRUX1RZUEVfVkFSSUFOVCwKLSAgRE5UVF9UWVBFX0ZJTEUsCi0gIEROVFRfVFlQRV9GVU5DVFlQRSwKLSAgRE5UVF9UWVBFX1dJVEgsCi0gIEROVFRfVFlQRV9DT01NT04sCi0gIEROVFRfVFlQRV9DT0JTVFJVQ1QsCi0gIEROVFRfVFlQRV9YUkVGLAotICBETlRUX1RZUEVfU0EsCi0gIEROVFRfVFlQRV9NQUNSTywKLSAgRE5UVF9UWVBFX0JMT0NLREFUQSwKLSAgRE5UVF9UWVBFX0NMQVNTX1NDT1BFLAotICBETlRUX1RZUEVfUkVGRVJFTkNFLAotICBETlRUX1RZUEVfUFRSTUVNLAotICBETlRUX1RZUEVfUFRSTUVNRlVOQywKLSAgRE5UVF9UWVBFX0NMQVNTLAotICBETlRUX1RZUEVfR0VORklFTEQsCi0gIEROVFRfVFlQRV9WRlVOQywKLSAgRE5UVF9UWVBFX01FTUFDQ0VTUywKLSAgRE5UVF9UWVBFX0lOSEVSSVRBTkNFLAotICBETlRUX1RZUEVfRlJJRU5EX0NMQVNTLAotICBETlRUX1RZUEVfRlJJRU5EX0ZVTkMsCi0gIEROVFRfVFlQRV9NT0RJRklFUiwKLSAgRE5UVF9UWVBFX09CSkVDVF9JRCwKLSAgRE5UVF9UWVBFX01FTUZVTkMsCi0gIEROVFRfVFlQRV9URU1QTEFURSwKLSAgRE5UVF9UWVBFX1RFTVBMQVRFX0FSRywKLSAgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUsCi0gIEROVFRfVFlQRV9MSU5LLAotICBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MsCi0gIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQkVHSU5fRVhULAotICBETlRUX1RZUEVfSU5MTiwKLSAgRE5UVF9UWVBFX0lOTE5fTElTVCwKLSAgRE5UVF9UWVBFX0FMSUFTLAotICBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRE9DX01FTUZVTkMsCi0gIEROVFRfVFlQRV9NQVgKLX07Ci0KLS8qIEROVFRfVFlQRV9TUkNGSUxFOgotCi0gICBPbmUgRE5UVF9UWVBFX1NSQ0ZJTEUgc3ltYm9sIGlzIG91dHB1dCBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlCi0gICBmaWxlIGFuZCBhdCB0aGUgYmVnaW4gYW5kIGVuZCBvZiBhbiBpbmNsdWRlZCBmaWxlLiAgQSBETlRUX1RZUEVfU1JDRklMRQotICAgZW50cnkgaXMgYWxzbyBvdXRwdXQgYmVmb3JlIGVhY2ggRE5UVF9UWVBFX0ZVTkMgc3ltYm9sIHNvIHRoYXQgZGVidWdnZXJzCi0gICBjYW4gZGV0ZXJtaW5lIHdoYXQgZmlsZSBhIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLgotCi0gICBMQU5HVUFHRSBkZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlJ3MgbGFuZ3VhZ2UuCi0KLSAgIE5BTUUgcG9pbnRzIHRvIGFuIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgc291cmNlIGZpbGUncyBuYW1lLgotCi0gICBOb3RlIHRoZSBuYW1lIHVzZWQgZm9yIEROVFRfVFlQRV9TUkNGSUxFIGVudHJpZXMgYXJlIGV4YWN0bHkgYXMgc2VlbgotICAgYnkgdGhlIGNvbXBpbGVyIChpZSB0aGV5IG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSkuICBDIGluY2x1ZGUgZmlsZXMKLSAgIHZpYSA8PiBpbmNsdXNpb24gbXVzdCB1c2UgYWJzb2x1dGUgcGF0aHMuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1NSQ0ZJTEUgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfTU9EVUxFOgotCi0gICBBIEROVFRfVFlQRV9NT0RVTEUgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIHRoZSBzdGFydCBvZiBhIHBhc2NhbAotICAgbW9kdWxlIG9yIEMgc291cmNlIGZpbGUuIEEgbW9kdWxlIGluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHVuaXQKLSAgIGZvciBuYW1lLXNjb3BpbmcgcHVycG9zZXM7IGluIHRoYXQgcmVnYXJkIHRoZXJlIHNob3VsZCBiZSAKLSAgIGEgMS0xIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gR0RCICJzeW10YWIiJ3MgYW5kIE1PRFVMRSBzeW1ib2wgcmVjb3Jkcy4KLQotICAgRWFjaCBETlRUX1RZUEVfTU9EVUxFIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgbW9kdWxlJ3MgbmFtZS4gIE5vdGUgQwotICAgc291cmNlIGZpbGVzIGFyZSBjb25zaWRlcmVkIG5hbWVsZXNzIG1vZHVsZXMuCi0KLSAgIEFMSUFTIHBvaW50IHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIGEgc2Vjb25kYXJ5IG5hbWUuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZHVsZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAJLyogRE5UVF9UWVBFX01PRFVMRSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB2dHBvaW50ZXIgYWxpYXM7Ci0gIGRudHRwb2ludGVyIHVudXNlZDI7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLSAgIEROVFRfVFlQRV9FTlRSWSwKLSAgIEROVFRfVFlQRV9CTE9DS0RBVEEsCi0gICBETlRUX1RZUEVfTUVNRlVOQzoKLQotICAgQSBETlRUX1RZUEVfRlVOQ1RJT04gc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbjsKLSAgIGEgRE5UVF9UWVBFX0VOVFJZIHN5bWJvbHMgaXMgdXNlZCBmb3Igc2Vjb25kYXJ5IGVudHJ5IHBvaW50cy4gIEJvdGgKLSAgIHN5bWJvbHMgdXNlZCB0aGUgZG50dF90eXBlX2Z1bmN0aW9uIHN0cnVjdHVyZS4KLSAgIEEgRE5UVF9UWVBFX0JMT0NLREFUQSBzeW1ib2wgaXMgZW1pdHRlZCAuLi4/Ci0gICBBIEROVFRfVFlQRV9NRU1GVU5DIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBpbmxpbmVkIG1lbWJlciBmdW5jdGlvbnMgKEMrKykuIAotCi0gICBFYWNoIG9mIEROVFRfVFlQRV9GVU5DVElPTiBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5ELgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gaGFzIGdsb2JhbCBzY29wZS4KLQotICAgTEFOR1VBR0UgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbidzIHNvdXJjZSBsYW5ndWFnZS4KLQotICAgT1BUX0xFVkVMIGRlc2NyaWJlcyB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQKLSAgIHdpdGguCi0KLSAgIFZBUkFSR1MgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgZnVuY3Rpb24ncyBuYW1lLgotCi0gICBBTElBUyBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgYSBzZWNvbmRhcnkgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uLgotCi0gICBGSVJTVFBBUkFNIHBvaW50cyB0byBhIExOVFQgZW50cnkgd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4KLQotICAgRU5UUllBRERSIGlzIHRoZSBtZW1vcnkgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRoZSB0aGUgZnVuY3Rpb24ncyBlbnRyeSBwb2ludAotCi0gICBSRVRWQUwgcG9pbnRzIHRvIGEgTE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KLQotICAgTE9XQUREUiBpcyB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCi0gICBISUFERFIgaXMgdGhlIGhpZ2hlc3QgbWVtb3J5IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLQkJCQkgICAgICAgICAgIEROVFRfVFlQRV9FTlRSWSwKLQkJCQkJICAgRE5UVF9UWVBFX0JMT0NLREFUQQotCQkJCQkgICBvciBETlRUX1RZUEVfTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgbmVzdF9sZXZlbDoJNTsKLSAgdW5zaWduZWQgaW50IG9wdF9sZXZlbDoJMjsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgbGFuZ19pbmZvOgk0OwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDoJCTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGFsbG9jOgkxOwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHZ0cG9pbnRlciBhbGlhczsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBDT1JFX0FERFIgZW50cnlhZGRyOwotICBkbnR0cG9pbnRlciByZXR2YWw7Ci0gIENPUkVfQUREUiBsb3dhZGRyOwotICBDT1JFX0FERFIgaGlhZGRyOwotfTsKLQotLyogRE5UVF9UWVBFX0JFR0lOOgotCi0gICBBIEROVFRfVFlQRV9CRUdJTiBzeW1ib2wgaXMgZW1pdHRlZCB0byBiZWdpbiBhIG5ldyBuZXN0ZWQgc2NvcGUuCi0gICBFdmVyeSBETlRUX1RZUEVfQkVHSU4gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBDTEFTU0ZMQUcgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBjKysgY2xhc3MgZGVmaW5pdGlvbi4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYmVnaW4KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzZmxhZzoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIwOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfRU5EOgotCi0gICBBIEROVFRfVFlQRV9FTkQgc3ltYm9sIGlzIGVtaXR0ZWQgd2hlbiBjbG9zaW5nIGEgc2NvcGUgc3RhcnRlZCBieQotICAgYSBETlRUX1RZUEVfTU9EVUxFLCBETlRUX1RZUEVfRlVOQ1RJT04sIEROVFRfVFlQRV9XSVRILAotICAgRE5UVF9UWVBFX0NPTU1PTiwgRE5UVF9UWVBFX0JFR0lOLCBhbmQgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbHMuCi0KLSAgIEVOREtJTkQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBzY29wZSB0aGUgRE5UVF9UWVBFX0VORCBpcyBjbG9zaW5nCi0gICAob25lIG9mIHRoZSBhYm92ZSA2IGtpbmRzKS4KLQotICAgQ0xBU1NGTEFHIGlzIG5vbnplcm8gaWYgdGhpcyBpcyB0aGUgZW5kIG9mIGEgYysrIGNsYXNzIGRlZmluaXRpb24uCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuCi0KLSAgIEJFR0lOU0NPUEUgcG9pbnRzIHRvIHRoZSBMTlRUIGVudHJ5IHdoaWNoIG9wZW5lZCB0aGUgc2NvcGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VuZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZW5ka2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NmbGFnOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTA7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgYmVnaW5zY29wZTsKLX07Ci0KLS8qIEROVFRfVFlQRV9JTVBPUlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTEFCRUwgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GUEFSQU06Ci0KLSAgIEEgRE5UVF9UWVBFX0ZQQVJBTSBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgYSBmdW5jdGlvbiBhcmd1bWVudC4gIFdoZW4KLSAgIGNoYWluZWQgdG9nZXRoZXIgdGhlIHN5bWJvbHMgcmVwcmVzZW50IGFuIGFyZ3VtZW50IGxpc3QgZm9yIGEgZnVuY3Rpb24uCi0KLSAgIFJFR1BBUkFNIGlzIG5vbnplcm8gaWYgdGhpcyBwYXJhbWV0ZXIgd2FzIHBhc3NlZCBpbiBhIHJlZ2lzdGVyLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyCi0gICAocGFzcyBieSByZWZlcmVuY2Ugb3IgcGFzcyBieSB2YWx1ZSBmb3IgbGFyZ2UgaXRlbXMpLgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSA2NGJpdCBwb2ludGVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHBhcmFtZXRlcidzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIGRlc2NyaWJlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIGlzIHN0b3JlZC4gIERlcGVuZGluZyBvbiB0aGUKLSAgIHBhcmFtZXRlciB0eXBlIExPQ0FUSU9OIGNvdWxkIGJlIGEgcmVnaXN0ZXIgbnVtYmVyLCBvciBhbiBvZmZzZXQKLSAgIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuCi0KLSAgIFRZUEUgcG9pbnRzIHRvIGEgTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIuCi0KLSAgIE5FWFRQQVJBTSBwb2ludHMgdG8gdGhlIExOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgbmV4dCBwYXJhbWV0ZXIuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgcmVncGFyYW06CTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgY29weXBhcmFtOgkxOwotICB1bnNpZ25lZCBpbnQgZGZsdDoJCTE7Ci0gIHVuc2lnbmVkIGludCBkb2NfcmFuZ2VzOgkxOwotICB1bnNpZ25lZCBpbnQgbWlzY19raW5kOiAgICAgICAxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTQ7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBDT1JFX0FERFIgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIGRudHRwb2ludGVyIG5leHRwYXJhbTsKLSAgaW50IG1pc2M7Ci19OwotCi0vKiBETlRUX1RZUEVfU1ZBUjoKLQotICAgQSBETlRUX1RZUEVfU1ZBUiBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGEgdmFyaWFibGUgaW4gc3RhdGljIHN0b3JhZ2UuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBpbiBsb25nIHBvaW50ZXIgc3BhY2UuCi0KLSAgIFNUQVRJQ01FTSBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLgotCi0gICBBX1VOSU9OIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFub255bW91cyB1bmlvbiBtZW1iZXIuCi0KLSAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgdmFyaWFibGUncyBuYW1lLgotCi0gICBMT0NBVElPTiBwcm92aWRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgc3RhdGljbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQxOiAgICAgICAgIDE7Ci0gIHVuc2lnbmVkIGludCB0aHJlYWRfc3BlY2lmaWM6IDE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQyOiAgICAgICAgIDE0OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgQ09SRV9BRERSIGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZGlzcGxhY2VtZW50OwotfTsKLQotLyogRE5UVF9UWVBFX0RWQVI6Ci0KLSAgIEEgRE5UVF9UWVBFX0RWQVIgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhdXRvbWF0aWMgdmFyaWFibGVzIGFuZCB2YXJpYWJsZXMKLSAgIGhlbGQgaW4gcmVnaXN0ZXJzLgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaGFzIGdsb2JhbCBzY29wZS4KLQotICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdC4KLQotICAgUkVHVkFSIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGluIGEgcmVnaXN0ZXIuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSB2YXJpYWJsZSdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBvciByZWdpc3RlciBudW1iZXIgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2R2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IHJlZ3ZhcjoJCTE7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgaW50IGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotfTsKLQotLyogRE5UVF9UWVBFX0NPTlNUOgotCi0gICBBIEROVFRfVFlQRV9DT05TVCBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgcHJvZ3JhbSBjb25zdGFudHMuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT0NBVElPTl9UWVBFIGRlc2NyaWJlcyB3aGVyZSB0byBmaW5kIHRoZSBjb25zdGFudCdzIHZhbHVlCi0gICAoaW4gdGhlIFZULCBtZW1vcnksIG9yIGVtYmVkZGVkIGluIGFuIGluc3RydWN0aW9uKS4KLQotICAgQ0xBU1NNRU0gaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQgaXMgYSBtZW1iZXIgb2YgYSBjbGFzcy4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyIG9yIHBvaW50ZXIKLSAgIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyB2YWx1ZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NvbnN0Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhdGlvbl90eXBlOgkzOwotICB1bnNpZ25lZCBpbnQgY2xhc3NtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIENPUkVfQUREUiBsb2NhdGlvbjsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGRpc3BsYWNlbWVudDsKLX07Ci0KLS8qIEROVFRfVFlQRV9UWVBFREVGIGFuZCBETlRUX1RZUEVfVEFHREVGOgotCi0gICBUaGUgc2FtZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB0eXBlZGVmcyBhbmQgdGFnZGVmcy4KLQotICAgRE5UVF9UWVBFX1RZUEVERUZTIGFyZSBhc3NvY2lhdGVkIHdpdGggQyAidHlwZWRlZnMiLgotCi0gICBETlRUX1RZUEVfVEFHREVGcyBhcmUgYXNzb2NpYXRlZCB3aXRoIEMgInN0cnVjdCIsICJ1bmlvbiIsIGFuZCAiZW51bSIKLSAgIHRhZ3MsIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSB0eXBlZGVmIGluIHRoZSBzYW1lIHNjb3BlLgotICAgQWxzbyB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggQysrICJjbGFzcyIgdGFncywgd2hpY2ggaW1wbGljaXRseSBoYXZlIAotICAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MgdHlwZS4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHR5cGVkZWYvdGFnZGVmIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIFRZUEVJTkZPIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLSAgIGZvciBhIHRhZy4gICh1c3VhbGx5IDEsIGJ1dCBjYW4gYmUgemVybyBmb3Igb3BhcXVlIHR5cGVzIGluIEMpLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgbmFtZS4KLQotICAgVFlQRSBwb2ludHMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZSBmb3IgdGhlIHR5cGVkZWYvdGFnZGVmIGluIHRoZQotICAgR05UVCBvciBMTlRULiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV90eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgIC8qIEROVFRfVFlQRV9UWVBFREVGIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE5UVF9UWVBFX1RBR0RFRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGVpbmZvOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBkbnR0cG9pbnRlciB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogVW5kZXJseWluZyB0eXBlLCB3aGljaCBmb3IgVEFHREVGJ3MgbWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfU1RSVUNULCBETlRUX1RZUEVfVU5JT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfRU5VTSwgb3IgRE5UVF9UWVBFX0NMQVNTLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBUWVBFREVGJ3Mgb3RoZXIgdW5kZXJseWluZyB0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGFsc28gcG9zc2libGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qIEROVFRfVFlQRV9QT0lOVEVSOgotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGEgcG9pbnRlciB0byBhbiB1bmRlcmx5aW5nIHR5cGUuCi0KLSAgIFBPSU5UU1RPIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBHTlRUIG9yIExOVFQgZm9yIHRoZSB0eXBlIHdoaWNoIHRoaXMKLSAgIHBvaW50ZXIgcG9pbnRzIHRvLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgcG9pbnRlciAobm90IHRoZSB1bmRlcmx5aW5nIHR5cGUpLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBwb2ludHN0bzsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLQotLyogRE5UVF9UWVBFX0VOVU06Ci0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgZW51bWVyYXRlZCB0eXBlcy4KLQotICAgRklSU1RNRU0gaXMgYSBwb2ludGVyIHRvIGEgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIEdOVFQvTE5UVCB3aGljaAotICAgZGVzY3JpYmVzIHRoZSBmaXJzdCBtZW1iZXIgKGFuZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGNoYWluIG9mCi0gICBtZW1iZXJzKS4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUgZW51bSdzCi0gICBtZW1iZXJzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBmaXJzdG1lbTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9NRU1FTlVNCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgbWVtYmVycyBvZiBhbiBlbnVtZXJhdGVkIHR5cGUuCi0KLSAgIENMQVNTTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBtZW1iZXIgaXMgcGFydCBvZiBhIGNsYXNzLgotCi0gICBOQU1FIHBvaW50cyBpbnRvIHRoZSBWVCBmb3IgdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIuCi0KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGlzIGVudW1lcmF0aW9uIG1lbWJlci4KLQotICAgTkVYVE1FTSBwb2ludHMgdG8gdGhlIG5leHQgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tZW1lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjA7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gIGRudHRwb2ludGVyIG5leHRtZW07Ci19OwotCi0vKiBETlRUX1RZUEVfU0VUCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgUEFTQ0FMICJzZXQiIHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0cGFja2luZyBvZiB0aGUgc2V0LgotCi0gICBTVUJUWVBFIHBvaW50cyB0byBhIEROVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVycy4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBzZXQuICAqLyAKLQotc3RydWN0IGRudHRfdHlwZV9zZXQKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVUJSQU5HRQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIHN1YnJhbmdlIHR5cGUuCi0KLSAgIERZTl9MT1cgZGVzY3JpYmVzIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgc3VicmFuZ2U6Ci0KLSAgICAgMDAgZm9yIGEgY29uc3RhbnQgbG93ZXIgYm91bmQgKGZvdW5kIGluIExPV0JPVU5EKS4KLQotICAgICAwMSBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIHdpdGggdGhlIGxvd2VyIGJvdW5kIGZvdW5kIGluIHRoZSB0aGUKLSAgICAgbWVtb3J5IGFkZHJlc3MgcG9pbnRlZCB0byBieSBMT1dCT1VORC4KLQotICAgICAxMCBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIGRlc2NyaWJlZCBieSBhbiB2YXJpYWJsZSBmb3VuZCBpbiB0aGUKLSAgICAgRE5UVC9MTlRUIChMT1dCT1VORCB3b3VsZCBiZSBhIHBvaW50ZXIgaW50byB0aGUgRE5UVC9MTlRUKS4KLQotICAgRFlOX0hJR0ggaXMgc2ltaWxhciB0byBEWU5fTE9XLCBleGNlcHQgaXQgZGVzY3JpYmVzIHRoZSB1cHBlciBib3VuZC4KLQotICAgU1VCVFlQRSBwb2ludHMgdG8gdGhlIHR5cGUgb2YgdGhlIHN1YnJhbmdlLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBpbiBiaXRzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUgc3VicmFuZ2UncwotICAgdmFsdWVzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9zdWJyYW5nZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkeW5fbG93OgkJMjsKLSAgdW5zaWduZWQgaW50IGR5bl9oaWdoOgkyOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIGludCBsb3dib3VuZDsKLSAgaW50IGhpZ2hib3VuZDsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9BUlJBWQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGFuIGFycmF5IHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0IHBhY2tpbmcgdXNlZCBpbiB0aGUgYXJyYXkuCi0KLSAgIEFSUkFZSVNCWVRFUyBpcyBub256ZXJvIGlmIHRoZSBmaWVsZCBpbiBhcnJheWxlbmd0aCBkZXNjcmliZXMgdGhlCi0gICBsZW5ndGggaW4gYnl0ZXMgcmF0aGVyIHRoYW4gaW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkIHRvCi0gICBkZXNjcmliZSBhbiBhcnJheSB3aXRoIHNpemUgMioqMzIuCi0KLSAgIEVMRU1JU0JZVEVTIGlzIG5vbnplcm8gaWYgdGhlIGxlbmd0aCBpZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5Ci0gICBpcyBkZXNjcmliZXMgaW4gYnl0ZXMgcmF0aGVyIHRoYW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkCi0gICB0byBhbiBlbGVtZW50IHdpdGggc2l6ZSAyKiozMi4KLQotICAgRUxFTU9SREVSIGlzIG5vbnplcm8gaWYgdGhlIGVsZW1lbnRzIGFyZSBpbmRleGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCi0KLSAgIEpVU1RJRklFRCBpZiB0aGUgZWxlbWVudHMgYXJlIGxlZnQganVzdGlmaWVkIHRvIGluZGV4IHplcm8uCi0KLSAgIEFSUkFZTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgotCi0gICBJTkRFWFRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgdXNlZCB0byBpbmRleCB0aGUgYXJyYXkuCi0KLSAgIEVMRU1UWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGZvciB0aGUgYXJyYXkgZWxlbWVudHMuCi0KLSAgIEVMRU1MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IChpbmNsdWRpbmcKLSAgIGFueSBwYWRkaW5nKS4KLQotICAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSByZXByZXNlbnRlZCBieSBFTEVNVFlQRSBwb2ludGluZyB0bwotICAgYW5vdGhlciBETlRUX1RZUEVfQVJSQVkuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2FycmF5Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOwotICB1bnNpZ25lZCBpbnQgZHluX2xvdzoJCTI7Ci0gIHVuc2lnbmVkIGludCBkeW5faGlnaDoJMjsKLSAgdW5zaWduZWQgaW50IGFycmF5aXNieXRlczoJMTsKLSAgdW5zaWduZWQgaW50IGVsZW1pc2J5dGVzOgkxOwotICB1bnNpZ25lZCBpbnQgZWxlbW9yZGVyOgkxOwotICB1bnNpZ25lZCBpbnQganVzdGlmaWVkOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTE7Ci0gIHVuc2lnbmVkIGludCBhcnJheWxlbmd0aDsKLSAgZG50dHBvaW50ZXIgaW5kZXh0eXBlOwotICBkbnR0cG9pbnRlciBlbGVtdHlwZTsKLSAgdW5zaWduZWQgaW50IGVsZW1sZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfU1RSVUNUCi0KLSAgIEROVFRfVFlQRV9TVFJVQ1QgaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgc3RydWN0dXJlLgotCi0gICBERUNMQVJBVElPTiBkZXNjcmliZXMgdGhlIGJpdHBhY2tpbmcgdXNlZC4KLQotICAgRklSU1RGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZQotICAgKGVhY2ggZmllbGQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGZpZWxkLCB3YWxrIHRoZSBsaXN0Ci0gICB0byBhY2Nlc3MgYWxsIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlKS4KLQotICAgVkFSVEFHRklFTEQgYW5kIFZBUkxJU1QgYXJlIHVzZWQgZm9yIFBhc2NhbCB2YXJpYW50IHJlY29yZHMuCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJpdHMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N0cnVjdAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OwotICBkbnR0cG9pbnRlciBmaXJzdGZpZWxkOwotICBkbnR0cG9pbnRlciB2YXJ0YWdmaWVsZDsKLSAgZG50dHBvaW50ZXIgdmFybGlzdDsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9VTklPTgotCi0gICBETlRUX1RZUEVfVU5JT04gaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgdW5pb24uCi0KLSAgIEZJUlNURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQgY2hhaW4uCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgdW5pb24gaW4gYml0cy4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdW5pb24KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIGZpcnN0ZmllbGQ7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfRklFTEQKLQotICAgRE5UVF9UWVBFX0ZJRUxEIGRlc2NyaWJlcyBvbmUgZmllbGQgaW4gYSBzdHJ1Y3R1cmUgb3IgdW5pb24KLSAgIG9yIEMrKyBjbGFzcy4KLQotICAgVklTSUJJTElUWSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZAotICAgKGZvciBjKysuICBwdWJsaWMgPSAwLCBwcm90ZWN0ZWQgPSAxLCBwcml2YXRlID0gMikuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGFuIGFub255bW91cyB1bmlvbi4KLQotICAgU1RBVElDTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIgb2YgYSB0ZW1wbGF0ZS4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgQklUT0ZGU0VUIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiBiaXRzIGZyb20gdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIHN0cnVjdHVyZSBvciB1bmlvbiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mLgotCi0gICBUWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGRlc2NyaWJpbmcgdGhpcyBmaWVsZC4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBiaXRzLgotCi0gICBORVhURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIG5leHQgZmllbGQgaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9maWVsZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OgkyOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCBzdGF0aWNtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHVuc2lnbmVkIGludCBiaXRvZmZzZXQ7Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIG5leHRmaWVsZDsKLX07Ci0KLS8qIEROVFRfVFlQRV9WQVJJQU5UIGlzIHVudXNlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX0ZJTEUgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GVU5DVFlQRQotCi0gICBJIHRoaW5rIHRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBhIGZ1bmN0aW9uIHR5cGUgKGUuZy4sIHdvdWxkCi0gICBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgYSBmdW5jdGlvbi1wb2ludGVyIGRlc2NyaXB0aW9uKS4KLQotICAgVkFSQVJHUyBpcyBub256ZXJvIGlmIHRoaXMgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBGSVJTVFBBUkFNIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcGFyYW1ldGVyCi0gICBjaGFpbi4KLQotICAgUkVUVkFMIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCB2YXJhcmdzOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZm86CQk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTY7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07Ci0gIGRudHRwb2ludGVyIHJldHZhbDsKLX07Ci0KLS8qIEROVFRfVFlQRV9XSVRIIGlzIGVtaXR0ZWQgYnkgQysrIHRvIGluZGljYXRlICJ3aXRoIiBzY29waW5nIHNlbWFudGljcy4KLSAgIChQcm9iYWJseSBhbHNvIGVtaXR0ZWQgYnkgUEFTQ0FMIHRvIHN1cHBvcnQgIndpdGgiLi4uKS4KLSAgIAotICAgQysrIGV4YW1wbGU6IFNheSAibWVtZnVuYyIgaXMgYSBtZXRob2Qgb2YgY2xhc3MgImMiLCBhbmQgc2F5Ci0gICAibSIgaXMgYSBkYXRhIG1lbWJlciBvZiBjbGFzcyAiYyIuIFRoZW4gZnJvbSB3aXRoaW4gIm1lbWZ1bmMiLAotICAgaXQgaXMgbGVnYWwgdG8gcmVmZXJlbmNlICJtIiBkaXJlY3RseSAoZS5nLiB5b3UgZG9uJ3QgaGF2ZSB0bwotICAgc2F5ICJ0aGlzLT5tIi4gVGhlIHN5bWJvbCB0YWJsZSBpbmRpY2F0ZXMKLSAgIHRoaXMgYnkgZW1pdHRpbmcgYSBETlRUX1RZUEVfV0lUSCBzeW1ib2wgd2l0aGluIHRoZSBmdW5jdGlvbiAibWVtZnVuYyIsCi0gICBwb2ludGluZyB0byB0aGUgdHlwZSBzeW1ib2wgZm9yIGNsYXNzICJjIi4KLSAKLSAgIEluIEdEQiwgdGhpcyBzeW1ib2wgcmVjb3JkIGlzIHVubmVjZXNzYXJ5LCAKLSAgIGJlY2F1c2UgR0RCJ3Mgc3ltYm9sIGxvb2t1cCBhbGdvcml0aG0KLSAgIGluZmVycyB0aGUgIndpdGgiIHNlbWFudGljcyB3aGVuIGl0IHNlZXMgYSAidGhpcyIgYXJndW1lbnQgdG8gdGhlIG1lbWJlcgotICAgZnVuY3Rpb24uIFNvIEdEQiBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgRE5UVF9UWVBFX1dJVEggcmVjb3JkLgotCi0gICBBIEROVFRfVFlQRV9XSVRIIGhhcyBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sIAotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfd2l0aCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7ICAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgLyogYWx3YXlzIEROVFRfVFlQRV9XSVRIICovCi0gIHVuc2lnbmVkIGludCBhZGRydHlwZTogIAkyOyAgICAvKiAwID0+IFNUQVRUWVBFICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgPT4gRFlOVFlQRSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9PiBSRUdUWVBFICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6IAkxOyAgICAvKiAxID0+IHBvaW50ZXIgdG8gb2JqZWN0ICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsb25nYWRkcjogIAkxOyAgICAvKiAxID0+IGluIGxvbmcgcG9pbnRlciBzcGFjZSAgICovCi0gIHVuc2lnbmVkIGludCBuZXN0bGV2ZWw6IAk2OyAgICAvKiAjIG9mIG5lc3RpbmcgbGV2ZWxzIGJhY2sgICAgICovCi0gIHVuc2lnbmVkIGludCBkb2NfcmFuZ2VzOiAJMTsgICAgLyogMSA9PiBsb2NhdGlvbiBpcyByYW5nZSBsaXN0ICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgIAkxMDsKLSAgbG9uZyBsb2NhdGlvbjsgICAgICAgCQkgICAgICAvKiB3aGVyZSBzdG9yZWQgKGFsbG9jYXRlZCkgICAgICovCi0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiB3aXRoIGV4cHJlc3Npb24gICAgICAqLwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHdpdGggZXhwcmVzc2lvbiAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgIG9mZnNldDsgICAgICAgICAgICAgIC8qIGJ5dGUgb2Zmc2V0IGZyb20gbG9jYXRpb24gICAgKi8KLX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotLyogRE5UVF9UWVBFX0NPTU1PTiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogQSBETlRUX1RZUEVfQ09NTU9OIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAqLwotCi0vKiBETlRUX1RZUEVfQ09CU1RSVUNUIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfWFJFRiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX1NBIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTUFDUk8gaXMgdW5zdXBwb3J0ZWQgYnkgR0RCICovCi0KLS8qIEROVFRfVFlQRV9CTE9DS0RBVEEgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBETlRUX1RZUEVfRlVOQ1RJT04gKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIEMrKyBzcGVjaWZpYyBTT00gcmVjb3JkcyAqLwotCi0vKiAgVGhlIHB1cnBvc2Ugb2YgdGhlIEROVFRfVFlQRV9DTEFTU19TQ09QRSBpcyB0byBicmFja2V0IEMrKyBtZXRob2RzCi0gICAgYW5kIGluZGljYXRlIHRoZSBtZXRob2QgbmFtZSBiZWxvbmdzIGluIHRoZSAiY2xhc3Mgc2NvcGUiIHJhdGhlcgotICAgIHRoYW4gaW4gdGhlIG1vZHVsZSB0aGV5IGFyZSBiZWluZyBkZWZpbmVkIGluLiBGb3IgZXhhbXBsZToKLQotICAgIGNsYXNzIGMgewotICAgIC4uLgotICAgIHZvaWQgbWVtZnVuYygpOyAvLyBtZW1iZXIgZnVuY3Rpb24KLSAgICB9OwotCi0gICAgdm9pZCBjOjptZW1mdW5jKCkgICAvLyBkZWZpbml0aW9uIG9mIGNsYXNzIGMncyAibWVtZnVuYyIKLSAgICB7Ci0gICAgLi4uCi0gICAgfQotCi0gICAgbWFpbigpCi0gICAgewotICAgIC4uLgotICAgIH0KLQotICAgIEluIHRoZSBhYm92ZSwgdGhlIG5hbWUgIm1lbWZ1bmMiIGlzIG5vdCBkaXJlY3RseSB2aXNpYmxlIGZyb20gIm1haW4iLgotICAgIEkuZS4sIHlvdSBoYXZlIHRvIHNheSAiYnJlYWsgYzo6bWVtZnVuYyIuCi0gICAgSWYgaXQgd2VyZSBhIG5vcm1hbCBmdW5jdGlvbiAobm90IGEgbWV0aG9kKSwgaXQgd291bGQgYmUgdmlzaWJsZQotICAgIHZpYSB0aGUgc2ltcGxlICJicmVhayBtZW1mdW5jIi4gU2luY2UgIm1lbWZ1bmMiIG90aGVyd2lzZSBsb29rcwotICAgIGxpa2UgYSBub3JtYWwgRlVOQ1RJT04gaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlIGJyYWNrZXRpbmcKLSAgICBDTEFTU19TQ09QRSBpcyB3aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgaXQgaXMgcmVhbGx5IGEgbWV0aG9kLgotICAgIAotCi0gICBBIEROVFRfVFlQRV9DTEFTU19TQ09QRSBzeW1ib2wgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgCi0qLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NsYXNzX3Njb3BlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0NMQVNTX1NDT1BFICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAyMTsgCi0gIHNsdHBvaW50ZXIgYWRkcmVzcyAgICAgICAgIDsgICAgLyogcG9pbnRlciB0byBTTFQgZW50cnkgKi8KLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyB0eXBlIEROVFQgKi8KLX07Ci0KLS8qIEMrKyByZWZlcmVuY2UgcGFyYW1ldGVyLgotICAgVGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29yZCBpcyB0aGUgc2FtZSBhcyBETlRUX1RZUEVfUE9JTlRFUiAtIAotICAgcmVmZXIgdG8gc3RydWN0IGRudHRfdHlwZV9wb2ludGVyLgotICovCi0KLS8qIFRoZSBuZXh0IHR3byBkZXNjcmliZSBDKysgcG9pbnRlci10by1kYXRhLW1lbWJlciB0eXBlLCBhbmQgCi0gICBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiB0eXBlLCByZXNwZWN0aXZlbHkuCi0gICBETlRUX1RZUEVfUFRSTUVNIGFuZCBETlRUX1RZUEVfUFRSTUVNRlVOQyBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSAKLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3B0cm1lbSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9QVFJNRU0gKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1BUUk1FTUZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9DTEFTUyBzeW1ib2wgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhIGNsYXNzIHR5cGUuCi0gKiAibWVtYmVybGlzdCIgcG9pbnRzIHRvIGEgY2hhaW5lZCBsaXN0IG9mIEZJRUxEIG9yIEdFTkZJRUxEIHJlY29yZHMKLSAqIGluZGljYXRpbmcgdGhlIGNsYXNzIG1lbWJlcnMuICJwYXJlbnRsaXN0IiBwb2ludHMgdG8gYSBjaGFpbmVkIGxpc3QKLSAqIG9mIElOSEVSSVRBTkNFIHJlY29yZHMgaW5kaWNhdGluZyBjbGFzc2VzIGZyb20gd2hpY2ggd2UgaW5oZXJpdAotICogZmllbGRzLgotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY2xhc3MgCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsgICAgIC8qIGFsd2F5cyAwICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IGFic3RyYWN0OiAgICAxOyAgICAgLyogaXMgdGhpcyBhbiBhYnN0cmFjdCBjbGFzcz8gICAgKi8KLSAgdW5zaWduZWQgaW50IGNsYXNzX2RlY2w6ICAyOyAgICAgLyogMD1jbGFzcywxPXVuaW9uLDI9c3RydWN0ICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjogICAxOyAgICAgLyogMT10ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgIDE3OyAgICAgCi0gIGRudHRwb2ludGVyIG1lbWJlcmxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBbR0VOXUZJRUxEcyAqLwotICB1bnNpZ25lZCBsb25nIHZ0YmxfbG9jICAgICA7ICAgICAvKiBvZmZzZXQgaW4gb2JqIG9mIHB0ciB0byB2dGJsICAqLwotICBkbnR0cG9pbnRlciBwYXJlbnRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19JTkhFUklUQU5DRSBsaXN0ICAgICAqLwotICB1bnNpZ25lZCBsb25nIGJpdGxlbmd0aCAgICA7ICAgICAvKiB0b3RhbCBhdCB0aGlzIGxldmVsICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBpZGVudGxpc3QgICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgY2xhc3MgaWRlbnQncyAqLwotICBkbnR0cG9pbnRlciBmcmllbmRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19GUklFTkQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciB0ZW1wbGF0ZXB0ciAgICA7ICAgICAvKiBwdHIgdG8gdGVtcGxhdGUgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ZXhwICAgICAgICA7ICAgICAvKiBwdHIgdG8gbmV4dCBleHBhbnNpb24gICAgICAgICAqLwotfTsKLQotLyogQ2xhc3MgbWVtYmVycyBhcmUgaW5kaWNhdGVkIHZpYSBlaXRoZXIgdGhlIEZJRUxEIHJlY29yZCAoZm9yCi0gICBkYXRhIG1lbWJlcnMsIHNhbWUgYXMgZm9yIEMgc3RydWN0IGZpZWxkcyksIG9yIGJ5IHRoZSBHRU5GSUVMRCByZWNvcmQKLSAgIChmb3IgbWVtYmVyIGZ1bmN0aW9ucykuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9HRU5GSUVMRCAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjogICAgIDE7ICAgICAvKiAxID0+IGFub255bW91cyB1bmlvbiBtZW1iZXIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgZmllbGQJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZpZWxkIG9yIHF1YWxpZmllciAqLwotICBkbnR0cG9pbnRlciBuZXh0ZmllbGQgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgZmllbGQgICAgICAgICAqLwotfTsKLQotLyogQysrIHZpcnR1YWwgZnVuY3Rpb25zICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVkZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHB1cmU6ICAgICAgICAxOyAgICAgLyogcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uID8gICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7Ci0gIGRudHRwb2ludGVyIGZ1bmNwdHIgICAgICAgIDsgICAgIC8qIHBvaW50cyB0byBGVU5DVElPTiBzeW1ib2wgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgdnRibF9vZmZzZXQgIDsgICAgIC8qIG9mZnNldCBpbnRvIHZ0YmwgZm9yIHZpcnR1YWwgICovCi19OwotCi0vKiBOb3QgcHJlY2lzZWx5IHN1cmUgd2hhdCB0aGlzIGlzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfbWVtYWNjZXNzIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX01FTUFDQ0VTUyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgY2xhc3NwdHIJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGJhc2UgY2xhc3MgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBmaWVsZCAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIGZpZWxkICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9JTkhFUklUQU5DRSByZWNvcmQgZGVzY3JpYmVzIGRlcml2ZWQgY2xhc3Nlcy4KLSAqIEluIHBhcnRpY3VsYXIsIHRoZSAicGFyZW50bGlzdCIgZmllbGQgb2YgdGhlIENMQVNTIHJlY29yZCBwb2ludHMKLSAqIHRvIGEgbGlzdCBvZiBJTkhFUklUQU5DRSByZWNvcmRzIGZvciBjbGFzc2VzIGZyb20gd2hpY2ggd2UgCi0gKiBpbmhlcml0IG1lbWJlcnMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9pbmhlcml0YW5jZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9JTkhFUklUQU5DRSAqLwotICB1bnNpZ25lZCBpbnQgVmlydHVhbDogICAgIDE7ICAgICAvKiB2aXJ0dWFsIGJhc2UgY2xhc3MgPyAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgY2xhc3NuYW1lICAgICAgOyAgICAgLyogZmlyc3QgcGFyZW50IGNsYXNzLCBpZiBhbnkgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfSU5IRVJJVEFOQ0UgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmVbMl0gICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEMrKyAiZnJpZW5kIiBjbGFzc2VzIC4uLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9jbGFzcyB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GUklFTkRfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIGNsYXNzcHRyICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIG5leHQgRE5UVF9GUklFTkQgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZSSUVORF9GVU5DICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOwotICBkbnR0cG9pbnRlciBmdW5jcHRyICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBjbGFzc3B0ciAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBuZXh0IEROVFRfRlJJRU5EICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZVsyXSAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogRERFIGFwcGVhcnMgdG8gaWdub3JlIHRoZSBETlRUX1RZUEVfTU9ESUZJRVIgcmVjb3JkLgotICogSXQgY291bGQgcGVyaGFwcyBiZSB1c2VkIHRvIGdpdmUgYmV0dGVyICJwdHlwZSIgb3V0cHV0IGluIEdEQjsKLSAqIG90aGVyd2lzZSBpdCBpcyBwcm9iYWJseSBzYWZlIGZvciBHREIgdG8gaWdub3JlIGl0IGFsc28uCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9tb2RpZmllciB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9NT0RJRklFUiAqLwotICB1bnNpZ25lZCBpbnQgbV9jb25zdDogICAgIDE7ICAgICAvKiBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9zdGF0aWM6ICAgIDE7ICAgICAvKiBzdGF0aWMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2lkOiAgICAgIDE7ICAgICAvKiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2xhdGlsZTogIDE7ICAgICAvKiB2b2xhdGlsZSAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9kdXBsaWNhdGU6IDE7ICAgICAvKiBkdXBsaWNhdGUgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNjsKLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogc3VidHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgd2FzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfb2JqZWN0X2lkIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX09CSkVDVF9JRCAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6ICAgIDE7ICAgICAvKiBJcyBvYmplY3RfaWRlbnQgYWRkciBvZiBhZGRyPyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKLSAgdW5zaWduZWQgbG9uZyBvYmplY3RfaWRlbnQgOyAgICAgLyogb2JqZWN0IGlkZW50aWZpZXIgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfT0JKRUNUX0lEICAgKi8KLSAgdW5zaWduZWQgbG9uZyBzZWdvZmZzZXQgICAgOyAgICAgLyogZm9yIGxpbmtlciBmaXh1cCAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIE5vIHNlcGFyYXRlIGRudHRfdHlwZV9tZW1mdW5jOyBzYW1lIGFzIGRudHRfdHlwZV9mdW5jICovCi0KLS8qIFN5bWJvbCByZWNvcmRzIHRvIHN1cHBvcnQgdGVtcGxhdGVzLiBUaGVzZSBvbmx5IGdldCB1c2VkCi0gKiBpbiBEREUncyAiZGVzY3JpYmUiIG91dHB1dCAobGlrZSBHREIncyAicHR5cGUiKS4KLSAqLwotCi0vKiBUaGUgVEVNUExBVEUgcmVjb3JkIGlzIHRoZSBoZWFkZXIgZm9yIGEgdGVtcGxhdGUtY2xhc3MuCi0gKiBMaWtlIHRoZSBDTEFTUyByZWNvcmQsIGEgVEVNUExBVEUgcmVjb3JkIGhhcyBhIG1lbWJlcmxpc3QgdGhhdAotICogcG9pbnRzIHRvIGEgbGlzdCBvZiB0ZW1wbGF0ZSBtZW1iZXJzLiBJdCBhbHNvIGhhcyBhbiBhcmdsaXN0Ci0gKiBwb2ludGluZyB0byBhIGxpc3Qgb2YgVEVNUExBVEVfQVJHIHJlY29yZHMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV90ZW1wbGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgYWJzdHJhY3Q6ICAgIDE7ICAgICAvKiBpcyB0aGlzIGFuIGFic3RyYWN0IGNsYXNzPyAgICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfZGVjbDogIDI7ICAgICAvKiAwPWNsYXNzLDE9dW5pb24sMj1zdHJ1Y3QgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgbWVtYmVybGlzdCAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIEtfW0dFTl1GSUVMRHMgKi8KLSAgbG9uZyB1bnVzZWQyICAgICAgICAgICAgICAgOyAgICAgLyogb2Zmc2V0IGluIG9iaiBvZiBwdHIgdG8gdnRibCAgKi8KLSAgZG50dHBvaW50ZXIgcGFyZW50bGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfSU5IRVJJVEFOQ0UgbGlzdCAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBiaXRsZW5ndGggICAgOyAgICAgLyogdG90YWwgYXQgdGhpcyBsZXZlbCAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgaWRlbnRsaXN0ICAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIGNsYXNzIGlkZW50J3MgKi8KLSAgZG50dHBvaW50ZXIgZnJpZW5kbGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfRlJJRU5EIGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgYXJnbGlzdCAgICAgICAgOyAgICAgLyogcHRyIHRvIGFyZ3VtZW50IGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZXhwYW5zaW9ucyAgICAgOyAgICAgLyogcHRyIHRvIGV4cGFuc2lvbiBsaXN0ICAgICAgICAgKi8KLX07Ci0KLS8qIFRlbXBsYXRlLWNsYXNzIGFyZ3VtZW50cyBhcmUgYSBsaXN0IG9mIFRFTVBMX0FSRyByZWNvcmRzCi0gKiBjaGFpbmVkIHRvZ2V0aGVyLiBUaGUgIm5hbWUiIGZpZWxkIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwuCi0gKiBFLmcuOgotICogdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHEgeyAuLi4gfTsKLSAqIFRoZW4gIlQiIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwgYXJndW1lbnQuCi0gKi8KLXN0cnVjdCBkbnR0X3R5cGVfdGVtcGxfYXJnIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1RFTVBMX0FSRyAqLwotICB1bnNpZ25lZCBpbnQgdXNhZ2V0eXBlOiAgIDE7ICAgICAvKiAwIHR5cGUtbmFtZSAxIGV4cHJlc3Npb24gICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOwotICB2dHBvaW50ZXIgbmFtZSAgICAgICAgICAgICA7ICAgICAvKiBuYW1lIG9mIGFyZ3VtZW50ICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHR5cGUgICAgICAgICAgIDsgICAgIC8qIGZvciBub24gdHlwZSBhcmd1bWVudHMgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbmV4dGFyZyAgICAgICAgOyAgICAgLyogTmV4dCBhcmd1bWVudCBpZiBhbnkgICAgICAgICAqLwotICBsb25nIGZ1dHVyZVsyXSAgICAgICAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICovCi19OwotCi0vKiBGVU5DX1RFTVBMQVRFIHJlY29yZHMgYXJlIHNvcnQgb2YgbGlrZSBGVU5DVElPTiwgYnV0IGFyZSBlbWl0dGVkCi0gKiBmb3IgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9ucy4gRS5nLiwKLSAqIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBxIHsgCi0gICAgICAuLi4KLSAgICAgIHZvaWQgZigpOwotICAgICAgLi4uIAotICAgfTsKLSAqIFdpdGhpbiB0aGUgbGlzdCBvZiBGSUVMRHMvR0VORklFTERzIGRlZmluaW5nIHRoZSBtZW1iZXIgbGlzdAotICogb2YgdGhlIHRlbXBsYXRlICJxIiwgImYiIHdvdWxkIGFwcGVhciBhcyBhIEZVTkNfVEVNUExBVEUuCi0gKiBXZSdsbCBhbHNvIHNlZSBpbnN0YW5jZXMgb2YgRlVOQ1RJT04gImYiIHJlY29yZHMgZm9yIGVhY2ggCi0gKiBpbnN0YW50aWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmNfdGVtcGxhdGUgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlVOQ19URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgcHVibGljOiAgICAgIDE7ICAgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogICAgNDsgICAgIC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxldmVsOiAgICAgICA1OyAgICAgLyogbmVzdGluZyBsZXZlbCAodG9wIGxldmVsID0gMCkqLwotICB1bnNpZ25lZCBpbnQgb3B0aW1pemU6ICAgIDI7ICAgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgICAgMTsgICAgIC8qIGVsbGlwc2VzLiAgUGFzY2FsLzgwMCBsYXRlciAgKi8gCi0gIHVuc2lnbmVkIGludCBpbmZvOiAgICAgICAgNDsgICAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgICAxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxsb2M6ICAgIDE7ICAgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAgMjsKLSAgdnRwb2ludGVyIG5hbWUgICAgICAgICAgICAgOyAgICAgLyogbmFtZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAqLwotICB2dHBvaW50ZXIgYWxpYXMgICAgICAgICAgICA7ICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW0gICAgIDsgICAgIC8qIGZpcnN0IEZQQVJBTSwgaWYgYW55ICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcmV0dmFsICAgICAgICAgOyAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBhcmdsaXN0ICAgICAgICA7ICAgICAvKiBwdHIgdG8gYXJndW1lbnQgbGlzdCAgICAgICAgICovCi19OwotCi0vKiBMSU5LIGlzIGFwcGFyZW50bHkgaW50ZW5kZWQgdG8gbGluayB0b2dldGhlciBmdW5jdGlvbiB0ZW1wbGF0ZQotICogZGVmaW5pdGlvbnMgd2l0aCB0aGVpciBpbnN0YW50aWF0aW9ucy4gSG93ZXZlciwgaXQgaXMgbm90IGNsZWFyCi0gKiB3aHkgdGhpcyB3b3VsZCBiZSBuZWVkZWQsIGV4Y2VwdCB0byBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBvbgotICogYSAicHR5cGUiIGNvbW1hbmQuIEFuZCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgYUNDIGRvZXMgbm90IAotICogZ2VuZXJhdGUgdGhpcyByZWNvcmQuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9saW5rIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0xJTksgKi8KLSAgdW5zaWduZWQgaW50IGxpbmtLaW5kOiAgICA0OyAgICAgLyogYWx3YXlzIExJTktfVU5LTk9XTiAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNzsKLSAgbG9uZyBmdXR1cmUxICAgICAgICAgICAgICAgOyAgICAgLyogZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBwdHIxICAgICAgICAgICA7ICAgICAvKiBsaW5rIGZyb20gdGVtcGxhdGUgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHB0cjIgICAgICAgICAgIDsgICAgIC8qIHRvIGV4cGFuc2lvbiAgICAgICAgICAgICAgICAgKi8KLSAgbG9uZyBmdXR1cmVbMl0gICAgICAgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAqLwotfTsKLQotLyogZW5kIG9mIEMrKyBzcGVjaWZpYyBTT00ncyAqLwotCi0vKiBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0RFU0NfU1VCUkFOR0UgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0JFR0lOX0VYVCBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTiBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTl9MSVNUIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9BTElBUyBpcyB1bnVzZWQgYnkgR0RCICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogMTsgICAvKiBhbHdheXMgemVybyAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgMTA7ICAgLyogS19ET0NfRlVOQ1RJT04gb3IgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtfRE9DX01FTUZVTkMgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbDogICAgMTsgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogIDQ7ICAgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWw6ICAgICA1OyAgIC8qIG5lc3RpbmcgbGV2ZWwgKHRvcCBsZXZlbCA9IDApKi8KLSAgdW5zaWduZWQgaW50IG9wdGltaXplOiAgMjsgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgIDE7ICAgLyogZWxsaXBzZXMuICBQYXNjYWwvODAwIGxhdGVyICAqLwotICB1bnNpZ25lZCBpbnQgaW5mbzogICAgICA0OyAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgMTsKLSAgdW5zaWduZWQgaW50IGxvY2FsbG9jOiAgMTsgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCBleHBhbnNpb246IDE7ICAgLyogMSA9IGZ1bmN0aW9uIGV4cGFuc2lvbiAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZG9jX2Nsb25lOiAxOwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLSAgdnRwb2ludGVyIGFsaWFzOyAgICAgICAgICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07ICAgICAgLyogZmlyc3QgRlBBUkFNLCBpZiBhbnkgICAgICAgICAqLwotICBzbHRwb2ludGVyIGFkZHJlc3M7ICAgICAgICAgIC8qIGNvZGUgYW5kIHRleHQgbG9jYXRpb25zICAgICAgKi8KLSAgQ09SRV9BRERSIGVudHJ5YWRkcjsgICAgICAgICAvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICAgICAgICovCi0gIGRudHRwb2ludGVyIHJldHZhbDsgICAgICAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBDT1JFX0FERFIgbG93YWRkcjsgICAgICAgICAgIC8qIGxvd2VzdCBhZGRyZXNzIG9mIGZ1bmN0aW9uICAgKi8KLSAgQ09SRV9BRERSIGhpYWRkcjsgICAgICAgICAgICAvKiBoaWdoZXN0IGFkZHJlc3Mgb2YgZnVuY3Rpb24gICovCi0gIGRudHRwb2ludGVyIGlubGluZV9saXN0OyAgICAgLyogcG9pbnRlciB0byBmaXJzdCBpbmxpbmUgICAgKi8KLSAgbHRwb2ludGVyIGx0X29mZnNldDsgICAgICAgICAvKiBzdGFydCBvZiBmcmFnL2NwIGxpbmUgdGFibGUgICovCi0gIGN0eHRwb2ludGVyIGN0eHRfb2Zmc2V0OyAgICAgLyogc3RhcnQgb2YgY29udGV4dCB0YWJsZSBmb3IgdGhpcyByb3V0aW5lICovCi19OwotCi0vKiBETlRUX1RZUEVfRE9DX01FTUZVTkMgaXMgdW51c2VkIGJ5IEdEQiAqLwotCi0vKiBETlRUX1RZUEVfR0VORVJJQyBhbmQgRE5UVF9UWVBFX0JMT0NLIGFyZSBjb252aWVuY2Ugc3RydWN0dXJlcwotICAgc28gd2UgY2FuIGV4YW1pbmUgYSBETlRUIGVudHJ5IGluIGEgZ2VuZXJpYyBmYXNoaW9uLiAgKi8KLXN0cnVjdCBkbnR0X3R5cGVfZ2VuZXJpYwotewotICB1bnNpZ25lZCBpbnQgd29yZFs5XTsKLX07Ci0KLXN0cnVjdCBkbnR0X3R5cGVfYmxvY2sKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgICAgICAgMTA7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi0vKiBPbmUgZW50cnkgaW4gYSBETlRUIChlaXRoZXIgdGhlIExOVFQgb3IgR05UVCkuICAKLSAqIFRoaXMgaXMgYSB1bmlvbiBvZiB0aGUgYWJvdmUgNjAgb3Igc28gc3RydWN0dXJlIGRlZmluaXRpb25zLgotICovCi11bmlvbiBkbnR0ZW50cnkKLXsKLSAgc3RydWN0IGRudHRfdHlwZV9zcmNmaWxlIGRzZmlsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9tb2R1bGUgZG1vZHVsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZnVuYzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZW50cnk7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmVnaW4gZGJlZ2luOwotICBzdHJ1Y3QgZG50dF90eXBlX2VuZCBkZW5kOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbSBkZnBhcmFtOwotICBzdHJ1Y3QgZG50dF90eXBlX3N2YXIgZHN2YXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZHZhciBkZHZhcjsKLSAgc3RydWN0IGRudHRfdHlwZV9jb25zdCBkY29uc3Q7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdHlwZSBkdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV90eXBlIGR0YWc7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlciBkcHRyOwotICBzdHJ1Y3QgZG50dF90eXBlX2VudW0gZGVudW07Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbWVtZW51bSBkbWVtYmVyOwotICBzdHJ1Y3QgZG50dF90eXBlX3NldCBkc2V0OwotICBzdHJ1Y3QgZG50dF90eXBlX3N1YnJhbmdlIGRzdWJyOwotICBzdHJ1Y3QgZG50dF90eXBlX2FycmF5IGRhcnJheTsKLSAgc3RydWN0IGRudHRfdHlwZV9zdHJ1Y3QgZHN0cnVjdDsKLSAgc3RydWN0IGRudHRfdHlwZV91bmlvbiBkdW5pb247Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZmllbGQgZGZpZWxkOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlIGRmdW5jdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV93aXRoIGR3aXRoOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRibG9ja2RhdGE7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfY2xhc3Nfc2NvcGUgZGNsYXNzX3Njb3BlOwotICBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIgZHJlZmVyZW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW0gZHB0cm1lbTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIGRwdHJtZW1mdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2NsYXNzIGRjbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCBkZ2VuZmllbGQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgZHZmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX21lbWFjY2VzcyBkbWVtYWNjZXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2luaGVyaXRhbmNlIGRpbmhlcml0YW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfY2xhc3MgZGZyaWVuZF9jbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfZnVuYyBkZnJpZW5kX2Z1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbW9kaWZpZXIgZG1vZGlmaWVyOwotICBzdHJ1Y3QgZG50dF90eXBlX29iamVjdF9pZCBkb2JqZWN0X2lkOwotICBzdHJ1Y3QgZG50dF90eXBlX3RlbXBsYXRlIGR0ZW1wbGF0ZTsKLSAgc3RydWN0IGRudHRfdHlwZV90ZW1wbF9hcmcgZHRlbXBsX2FyZzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jX3RlbXBsYXRlIGRmdW5jX3RlbXBsYXRlOwotICBzdHJ1Y3QgZG50dF90eXBlX2xpbmsgZGxpbms7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIGRkb2NmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2dlbmVyaWMgZGdlbmVyaWM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmxvY2sgZGJsb2NrOwotfTsKLQotLyogU291cmNlIGxpbmUgZW50cnkgdHlwZXMuICAqLwotZW51bSBzbHR0eXBlCi17Ci0gIFNMVF9OT1JNQUwsCi0gIFNMVF9TUkNGSUxFLAotICBTTFRfTU9EVUxFLAotICBTTFRfRlVOQ1RJT04sCi0gIFNMVF9FTlRSWSwKLSAgU0xUX0JFR0lOLAotICBTTFRfRU5ELAotICBTTFRfV0lUSCwKLSAgU0xUX0VYSVQsCi0gIFNMVF9BU1NJU1QsCi0gIFNMVF9NQVJLRVIsCi0gIFNMVF9DTEFTU19TQ09QRSwKLSAgU0xUX0lOTE4sCi0gIFNMVF9OT1JNQUxfT0ZGU0VULAotfTsKLQotLyogQSBub3JtYWwgc291cmNlIGxpbmUgZW50cnkuICBTaW1wbHkgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGEgc291cmNlCi0gICBsaW5lIG51bWJlciB0byBhIGNvZGUgYWRkcmVzcy4KLQotICAgU0xUREVTQyB3aWxsIGFsd2F5cyBiZSBTTFRfTk9STUFMIG9yIFNMVF9FWElULiAgKi8KLQotc3RydWN0IHNsdF9ub3JtYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X25vcm1hbF9vZmYKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ6CTY7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyMjsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi0vKiBBIHNwZWNpYWwgc291cmNlIGxpbmUgZW50cnkuICBQcm92aWRlcyBhIG1hcHBpbmcgb2YgYSBkZWNsYXJhdGlvbgotICAgdG8gYSBsaW5lIG51bWJlci4gIFRoZXNlIGVudHJpZXMgcG9pbnQgYmFjayBpbnRvIHRoZSBETlRUIHdoaWNoCi0gICByZWZlcmVuY2VzIHRoZW0uICAqLwotCi1zdHJ1Y3Qgc2x0X3NwZWNpYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgZG50dHBvaW50ZXIgYmFja3B0cjsKLX07Ci0KLS8qIFVzZWQgdG8gZGVzY3JpYmUgbmVzdGluZy4KLQotICAgRm9yIG5lc3RlZCBsYW5ndWFnZXMsIGFuIHNsdF9hc3Npc3QgZW50cnkgbXVzdCBmb2xsb3cgZWFjaCBTTFRfRlVOQwotICAgZW50cnkgaW4gdGhlIFNMVC4gIFRoZSBhZGRyZXNzIGZpZWxkIHdpbGwgcG9pbnQgZm9yd2FyZCB0byB0aGUKLSAgIGZpcnN0IHNsdF9ub3JtYWwgZW50cnkgd2l0aGluIHRoZSBmdW5jdGlvbidzIHNjb3BlLiAgKi8KLQotc3RydWN0IHNsdF9hc3Npc3QKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CTI4OwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X2dlbmVyaWMKLXsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi11bmlvbiBzbHRlbnRyeQotewotICBzdHJ1Y3Qgc2x0X25vcm1hbCBzbm9ybTsKLSAgc3RydWN0IHNsdF9ub3JtYWxfb2ZmIHNub3Jtb2ZmOwotICBzdHJ1Y3Qgc2x0X3NwZWNpYWwgc3NwZWM7Ci0gIHN0cnVjdCBzbHRfYXNzaXN0IHNhc3N0OwotICBzdHJ1Y3Qgc2x0X2dlbmVyaWMgc2dlbmVyaWM7Ci19OwotCi0vKiAgJExJTkVTJCBkZWNsYXJhdGlvbnMKLSAqICBUaGlzIGlzIHRoZSBsaW5lIHRhYmxlIHVzZWQgZm9yIG9wdGltaXplZCBjb2RlLCB3aGljaCBpcyBvbmx5IHByZXNlbnQgCi0gKiAgaW4gdGhlIG5ldyAkUFJPR1JBTV9JTkZPJCBkZWJ1ZyBzcGFjZS4gIAotICovCi0KLSNkZWZpbmUgRFNUX0xOX0VTQ0FQRV9GTEFHMSAgIDE1Ci0jZGVmaW5lIERTVF9MTl9FU0NBUEVfRkxBRzIgICAxNAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMxICAgICAgMTMgIAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMyICAgICAgMTIKLQotLyoKLSAgRXNjYXBlIGZ1bmN0aW9uIGNvZGVzOgotKi8KLXR5cGVkZWYgZW51bQotICAgIHsKLSAgICBkc3RfbG5fcGFkLCAgICAgICAgICAvKiBwYWQgYnl0ZSAqLwotICAgIGRzdF9sbl9lc2NhcGVfMSwgICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2RwYzFfZGxuMSwgICAgLyogMSBieXRlIGxpbmUgZGVsdGEsIDEgYnl0ZSBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9kcGMyX2RsbjIsICAgIC8qIDIgYnl0ZXMgbGluZSBkZWx0YSwgMiBieXRlcyBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9wYzRfbG40LCAgICAgIC8qIDQgYnl0ZXMgQUJTT0xVVEUgbGluZSBudW1iZXIsIDQgYnl0ZXMgQUJTT0xVVEUgcGMgKi8KLSAgICBkc3RfbG5fZHBjMF9kbG4xLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgcGMgZGVsdGEgPSAwICovCi0gICAgZHN0X2xuX2xuX29mZl8xLCAgICAgLyogc3RhdGVtZW50IGVzY2FwZSwgc3RtdCAjID0gMSAoMm5kIHN0bXQgb24gbGluZSkgKi8KLSAgICBkc3RfbG5fbG5fb2ZmLCAgICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSBuZXh0IGJ5dGUgKi8KLSAgICBkc3RfbG5fZW50cnksICAgICAgICAvKiBlbnRyeSBlc2NhcGUsIG5leHQgYnl0ZSBpcyBlbnRyeSBudW1iZXIgKi8KLSAgICBkc3RfbG5fZXhpdCwgICAgICAgICAvKiBleGl0IGVzY2FwZSAqLwotICAgIGRzdF9sbl9zdG10X2VuZCwgICAgIC8qIGdhcCBlc2NhcGUsIDQgYnl0ZXMgcGMgZGVsdGEgKi8KLSAgICBkc3RfbG5fc3RtdF9jcCwgICAgICAvKiBjdXJyZW50IHN0bXQgaXMgYSBjcml0aWNhbCBwb2ludCAqLwotICAgIGRzdF9sbl9lc2NhcGVfMTIsICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2VzY2FwZV8xMywgICAgLyogdGhpcyBpcyBhbiBleGNlcHRpb24gc2l0ZSByZWNvcmQgKi8KLSAgICBkc3RfbG5fbnh0X2J5dGUsICAgICAvKiBuZXh0IGJ5dGUgY29udGFpbnMgdGhlIHJlYWwgZXNjYXBlIGNvZGUgKi8KLSAgICBkc3RfbG5fZW5kLCAgICAgICAgICAvKiBlbmQgZXNjYXBlLCBmaW5hbCBlbnRyeSBmb2xsb3dzICovCi0gICAgZHN0X2xuX2VzY2FwZTFfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTFfdDsKLQotdHlwZWRlZiBlbnVtCi0gICAgewotICAgIGRzdF9sbl9jdHhfMSwgICAgICAgIC8qIG5leHQgYnl0ZSBkZXNjcmliZXMgY29udGV4dCBzd2l0Y2ggd2l0aCA1LWJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gdGhlIGltYWdlIHRhYmxlIGFuZCAzLWJpdCBydW4gbGVuZ3RoLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHJ1biBsZW5ndGggaXMgMCwgZW5kIHdpdGggYW5vdGhlciBjeHQgc3BlY2lmaWVyIG9yIGN0eF9lbmQgKi8KLSAgICBkc3RfbG5fY3R4XzIsICAgICAgICAvKiBuZXh0IDIgYnl0ZXMgc3dpdGNoIGNvbnRleHQ6IDEzIGJpdCBpbmRleCwgMyBiaXQgcnVuIGxlbmd0aCAqLwotICAgIGRzdF9sbl9jdHhfNCwgICAgICAgIC8qIG5leHQgNCBieXRlcyBzd2l0Y2ggY29udGV4dDogMjkgYml0IGluZGV4LCAzIGJpdCBydW4gbGVuZ3RoICovCi0gICAgZHN0X2xuX2N0eF9lbmQsICAgICAgLyogZW5kIGN1cnJlbnQgY29udGV4dCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzEsICAgIC8qIG5leHQgYnl0ZSBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIGJ5dGUgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzIsICAgIC8qIG5leHQgMiBieXRlcyBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIDIgYnl0ZXMgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UxLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDEgYnl0ZSBvZiBsaW5lIG51bWJlciAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UyLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDIgYnl0ZXMgb2YgbGluZSBudW1iZXIgKi8KLSAgICBkc3RfbG5faW5pdF9iYXNlMywgICAvKiBuZXh0IDQgYnl0ZXMgYXJlIGFic29sdXRlIFBDLCBmb2xsb3dlZCBieSAzIGJ5dGVzIG9mIGxpbmUgbnVtYmVyICovCi0gICAgZHN0X2xuX2VzY2FwZTJfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTJfdDsgICAgICAgICAgIAotCi10eXBlZGVmIHVuaW9uCi0gICAgewotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIHBjX2RlbHRhIDogNDsgICAgICAvKiA0IGJpdCBwYyBkZWx0YSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICBsbl9kZWx0YSA6IDQ7ICAgICAgLyogNCBiaXQgbGluZSBudW1iZXIgZGVsdGEgKi8KLSAgICAgICAgfQotICAgICAgICBkZWx0YTsKLQotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19mbGFnIDogNDsgICAgICAvKiBhbGlhcyBmb3IgcGNfZGVsdGEgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19jb2RlIDogNDsgICAgICAvKiBlc2NhcGUgZnVuY3Rpb24gY29kZSAoZHN0X2xuX2VzY2FwZTFfdCwgb3IgLi4uMl90ICovCi0gICAgICAgIH0KLSAgICAgICAgZXNjOwotCi0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2ZsYWcgOiA0OyAgICAgIC8qIGRzdF9sbl9jdHhfc3BlYzEsIG9yIGRzdF9sbl9jdHhfc3BlYzIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgcnVuX2xlbmd0aCA6IDI7ICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGN0eF9pbmRleCA6IDI7ICAgICAgLyogLi4uc3BlYzIgY29udGFpbnMgaW5kZXg7ICAuLi5zcGVjMSwgaW5kZXggLSA0ICovCi0gICAgICAgIH0KLSAgICAgICAgY3R4X3NwZWM7Ci0KLSAgICBjaGFyICAgICAgICAgICAgICAgc2RhdGE7ICAgICAgICAgICAgICAgLyogc2lnbmVkIGRhdGEgYnl0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgICAgICB1ZGF0YTsgICAgICAgICAgICAgICAvKiB1bnNpZ25lZCBkYXRhIGJ5dGUgKi8KLSAgICB9Ci0gICAgZHN0X2xuX2VudHJ5X3QsCi0gICAgKmRzdF9sbl9lbnRyeV9wdHJfdDsKLQotLyogV2FybmluZzogYWx0aG91Z2ggdGhlIGFib3ZlIHVuaW9uIG9jY3VwaWVzIG9ubHkgMSBieXRlIHRoZSBjb21waWxlciB0cmVhdHMKLSAqIGl0IGFzIGhhdmluZyBzaXplIDIgKHRoZSBtaW5pbXVtIHNpemUgb2YgYSBzdHJ1Y3QpLiAgVGhlcmVmb3JlIGEgc2VxdWVuY2Ugb2YKLSAqIGRzdF9sbl9lbnRyeV90J3MgY2Fubm90IGJlIGRlc2NyaWJlZCBhcyBhbiBhcnJheSwgYW5kIHdhbGtpbmcgdGhyb3VnaCBzdWNoIGEKLSAqIHNlcXVlbmNlIHJlcXVpcmVzIGNvbnZvbHV0ZWQgY29kZSBzdWNoIGFzCi0gKiAgICAgIGxuX3B0ciA9IChkc3RfbG5fZW50cnlfcHRyX3QpIChjaGFyKikgbG5fcHRyICsgMQotICogV2UgcmVncmV0IHRoZSBpbmNvbnZlbmllbmNlLiAqLwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZSBmb2xsb3dpbmcgYSBkc3RfbG5fY3R4MSBlbnRyeSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4MV9pbmRleCA6IDU7ICAgICAgLyogNSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgxX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgxX3QsCi0gICpkc3RfbG5fY3R4MV9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHgyIGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX2luZGV4IDogMTM7ICAgICAvKiAxMyBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgyX3QsCi0gICpkc3RfbG5fY3R4Ml9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHg0IGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X2luZGV4IDogMjk7ICAgICAvKiAyOSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHg0X3QsCi0gICpkc3RfbG5fY3R4NF9wdHJfdDsKLQotCi0vKiAgUFhEQiBkZWZpbml0aW9ucy4KLSAqCi0gKiBQWERCIGlzIGEgcG9zdC1wcm9jZXNzb3Igd2hpY2ggdGFrZXMgdGhlIGV4ZWN1dGFibGUgZmlsZQotICogYW5kIG1hc3NhZ2VzIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBtYXkKLSAqIHN0YXJ0IHVwIGFuZCBydW4gbW9yZSBlZmZpY2llbnRseS4gIFNvbWUgb2YgdGhlIHRhc2tzCi0gKiBwZXJmb3JtZWQgYnkgUFhEQiBhcmU6Ci0gKgotICogbyAgIFJlbW92ZSBkdXBsaWNhdGUgZ2xvYmFsIHR5cGUgYW5kIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0gKiAgICAgZnJvbSB0aGUgR05UVCwKLSAqCi0gKiBvICAgQXBwZW5kIHRoZSBHTlRUIG9udG8gdGhlIGVuZCBvZiB0aGUgTE5UVCBhbmQgcGxhY2UgYm90aAotICogICAgIGJhY2sgaW4gdGhlIExOVFQgc2VjdGlvbiwKLSAqCi0gKiBvICAgQnVpbGQgcXVpY2sgbG9vay11cCB0YWJsZXMgKGRlc2NyaXB0aW9uIGZvbGxvd3MpIGZvcgotICogICAgIGZpbGVzLCBwcm9jZWR1cmVzLCBtb2R1bGVzLCBhbmQgcGFyYWdyYXBocyAoZm9yIENvYm9sKSwKLSAqICAgICBwbGFjaW5nIHRoZXNlIGluIHRoZSBHTlRUIHNlY3Rpb24sCi0gKgotICogbyAgIFJlY29uc3RydWN0IHRoZSBoZWFkZXIgYXBwZWFyaW5nIGluIHRoZSBoZWFkZXIgc2VjdGlvbgotICogICAgIHRvIGFjY2VzcyB0aGlzIGluZm9ybWF0aW9uLgotICoKLSAqIFRoZSAicXVpY2sgbG9vay11cCIgdGFibGVzIGFyZSBpbiB0aGUgJEdOVFQkIHN1Yi1zcGFjZSwgaW4KLSAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgotICogICAgIFByb2NlZHVyZXMgICAgLXNvcnRlZCBieSBhZGRyZXNzCi0gKiAgICAgU291cmNlIGZpbGVzICAtc29ydGVkIGJ5IGFkZHJlc3MgKG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBjb2RlIGZyb20gcm91dGluZXMpCi0gKiAgICAgTW9kdWxlcyAgICAgICAtc29ydGVkIGJ5IGFkZHJlc3MKLSAqICAgICBDbGFzc2VzICAgICAgIC08dW5zb3J0ZWQ/PgotICogICAgIEFkZHJlc3MgQWxpYXMgLXNvcnRlZCBieSBpbmRleCA8Pz4KLSAqICAgICBPYmplY3QgSURzICAgIC1zb3J0ZWQgYnkgb2JqZWN0IGlkZW50aWZpZXIKLSAqCi0gKiBNb3N0IHF1aWNrIGVudHJpZXMgaGF2ZSAoMC1iYXNlZCkgaW5kaWNlcyBpbnRvIHRoZSBMTlRUIHRhYmxlcyB0bwotICogdGhlIGZ1bGwgZW50cmllcyBmb3IgdGhlIGl0ZW0gaXQgZGVzY3JpYmVzLgotICoKLSAqIFRoZSBwb3N0LVBYREIgaGVhZGVyIGlzIGluIHRoZSAkSEVBREVSJCBzdWItc3BhY2UuICBBbGFzLCBpdAotICogb2NjdXJzIGluIGRpZmZlcmVudCBmb3JtcywgZGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwKLSAqIGluIHRoZSBjb21waWxhdGlvbiBzdGVwIGFuZCB3aGV0aGVyIFBYREIgd2FzIHJ1biBvciBub3QuIFRoZQotICogd29yc3QgcGFydCBpcyB0aGUgZm9ybXMgYXJlbid0IHNlbGYtZGVzY3JpYmluZywgc28gd2UnbGwgaGF2ZQotICogdG8gZ3JvdmVsIGluIHRoZSBiaXRzIHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kIHdlJ3JlIGxvb2tpbmcgYXQKLSAqIChzZWUgaHBfZ2V0X2hlYWRlciBpbiBocC1wc3ltdGFiLXJlYWQuYykuCi0gKi8KLQotLyogUFhEQiB2ZXJzaW9ucwotICovCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9DUExVU1BMVVMJMQotI2RlZmluZSBQWERCX1ZFUlNJT05fN180CTIKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0NQUF8zMAkzCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yQQk0Ci0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yCTUKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV80XzAJNgotCi0jZGVmaW5lIFBYREJfVkVSU0lPTl8yXzEJMQotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbwotICogYnV0IHRoZSBleGVjdXRhYmxlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSBweGRiICh0aGUgZWFzeQotICogY2FzZSwgZnJvbSAiY2MgLWciKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUFhEQl9zdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZmRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZmlsZSBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBtZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgbG9vay11cCB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGludCAgICAgcHhkYmVkIDogMTsgICAvKiAxID0+IGZpbGUgaGFzIGJlZW4gcHJlcHJvY2Vzc2VkICAgICAgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgIHVuc2lnbmVkIGludCAgICAgc2FfaGVhZGVyIDogMTsvKiAxID0+IGNyZWF0ZWQgYnkgU0EgdmVyc2lvbiBvZiBweGRiICovCi0JCQkgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6IDE7ICAgLyogb25lIG9yIG1vcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbmxpbmVkICovCi0gICAgdW5zaWduZWQgaW50ICAgICBzcGFyZToxMjsKLSAgICBzaG9ydCAgICAgICAgICAgIHZlcnNpb247ICAgICAgLyogcHhkYiBoZWFkZXIgdmVyc2lvbiAqLwotICAgIGludCAgICAgICAgICAgICAgZ2xvYmFsczsgICAgICAvKiBpbmRleCBpbnRvIHRoZSBETlRUIHdoZXJlIEdOVFQgYmVnaW5zICovCi0gICAgdW5zaWduZWQgaW50ICAgICB0aW1lOyAgICAgICAgIC8qIG1vZGlmeSB0aW1lIG9mIGZpbGUgYmVmb3JlIGJlaW5nIHB4ZGJlZCAqLwotICAgIGludCAgICAgICAgICAgICAgcGdfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbGFiZWwgbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgIGludCAgICAgICAgICAgICAgZmlsZXM7ICAgICAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZpbGVzICovCi0gICAgaW50ICAgICAgICAgICAgICBjZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBjbGFzcyBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG9pX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG9iamVjdCBpZCBsb29rLXVwIHRhYmxlICovCi19IFBYREJfaGVhZGVyLCAqUFhEQl9oZWFkZXJfcHRyOwotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbyBhbmQgdGhlCi0gKiBleGVjdXRhYmxlIGhhcyBOT1QgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgWERCX2hlYWRlcl9zdHJ1Y3QgewotICAgIGxvbmcgZ250dF9sZW5ndGg7IAotICAgIGxvbmcgbG50dF9sZW5ndGg7IAotICAgIGxvbmcgc2x0X2xlbmd0aDsgCi0gICAgbG9uZyB2dF9sZW5ndGg7IAotICAgIGxvbmcgeHRfbGVuZ3RoOyAKLX0gWERCX2hlYWRlcjsKLQotLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgRE9DIGluZm8gYW5kIHRoZQotICogZXhlY3V0YWJsZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgRE9DX2luZm9fUFhEQl9oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIHBvc3QtMy4xIHhkYiAqLyAKLSAgICAgICAgdW5zaWduZWQgaW50IGRvY19oZWFkZXI6IDE7ICAgICAgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIGRvYy1zdHlsZSBoZWFkZXIqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjogODsgICAgICAgICAgICAvKiB2ZXJzaW9uIG9mIHB4ZGIgc2VlIGRlZmluZXMKLQkJCQkJICAgICAqIFBYREJfVkVSU0lPTl8qIGluIHRoaXMgZmlsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfZm9yX2ZsYWdzOiAxNjsvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2F1eF9wZF90YWJsZTogMTsgICAvKiAkR05UVCQgaGFzIGF1eCBQRCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2V4cHJfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBoYXMgJEVYUFIkICovICAgICAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX3JhbmdlX3RhYmxlOiAxOyAgICAvKiBzcGFjZSBoYXMgJFJBTkdFJCAqLyAgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19jb250ZXh0X3RhYmxlOiAxOyAgLyogc3BhY2UgaGFzICRTUkNfQ1RYVCQgKi8gICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJExJTkVTJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19sdF9vZmZzZXRfbWFwOiAxOyAgLyogc3BhY2UgY29udGFpbnMgYW4gbHRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIFBYREJfaGVhZGVyIGluICRERUJVRyQgKi8KLSAgICAgICAgaW50ICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBmZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmaWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgbWRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbW9kdWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBweGRiZWQgOiAxOyAgIC8qIDEgPT4gZmlsZSBoYXMgYmVlbiBwcmVwcm9jZXNzZWQgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNhX2hlYWRlciA6IDE7LyogMSA9PiBjcmVhdGVkIGJ5IFNBIHZlcnNpb24gb2YgcHhkYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAxOyAgIC8qIG9uZSBvciBtb3JlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gaW5saW5lZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNwYXJlIDogMjg7Ci0gICAgICAgIGludCAgICAgIGdsb2JhbHM7ICAgICAgLyogaW5kZXggaW50byB0aGUgRE5UVCB3aGVyZSBHTlRUIGJlZ2lucyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHRpbWU7ICAgICAgICAgLyogbW9kaWZ5IHRpbWUgb2YgZmlsZSBiZWZvcmUgYmVpbmcgcHhkYmVkICovCi0gICAgICAgIGludCAgICAgIHBnX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGxhYmVsIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgICAgICBpbnQgICAgICBmaWxlczsgICAgICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZmlsZXMgKi8KLSAgICAgICAgaW50ICAgICAgY2RfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gY2xhc3MgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgb2lfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gb2JqZWN0IGlkIGxvb2stdXAgdGFibGUgKi8KLX0gRE9DX2luZm9fUFhEQl9oZWFkZXI7Ci0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIERPQyBpbmZvIGFuZCB0aGUKLSAqIGV4ZWN1dGFibGUgaGFzIE5PVCBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBET0NfaW5mb19oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkvKiBiaXQgc2V0IGlmIHRoaXMgaXMgcG9zdC0zLjEgeGRiICovIAotICAgICAgICB1bnNpZ25lZCBpbnQgZG9jX2hlYWRlcjogMTsgICAgIC8qIGJpdCBzZXQgaWYgdGhpcyBpcyBkb2Mtc3R5bGUgaGVhZGVyKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb246IDg7ICAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgZGVidWcvaGVhZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LiBGb3IgMTAuMCB0aGUgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIDEuIEZvciAiRGF2aXMiIHRoZQotCQkJCQkJdmFsdWUgaXMgMi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCByZXNlcnZlZF9mb3JfZmxhZ3M6IDE4OyAvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19yYW5nZV90YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJFJBTkdFJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIHZhcmlhYmxlIHJhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2NvbnRleHRfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRDVFhUJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGNvbnRleHQvaW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRMSU5FUyQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbHRfb2Zmc2V0X21hcDogMTsgICAvKiBzcGFjZSBjb250YWlucyBhbiBsdF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGxvbmcgICBnbnR0X2xlbmd0aDsgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgbG50dF9sZW5ndGg7ICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIHNsdF9sZW5ndGg7ICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICB2dF9sZW5ndGg7ICAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgeHRfbGVuZ3RoOyAgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIGN0eHRfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgcmFuZ2VfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgZXhwcl9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0KLX0gRE9DX2luZm9faGVhZGVyOwotCi10eXBlZGVmIHVuaW9uIEdlbmVyaWNEZWJ1Z0hlYWRlcl91bmlvbgotewotICAgUFhEQl9oZWFkZXIgICAgICAgICAgbm9fZG9jOwotICAgRE9DX2luZm9fUFhEQl9oZWFkZXIgZG9jOwotICAgWERCX2hlYWRlciAgICAgICAgICAgbm9fcHhkYl9ub19kb2M7Ci0gICBET0NfaW5mb19oZWFkZXIgICAgICBub19weGRiX2RvYzsKLX0gR2VuZXJpY0RlYnVnSGVhZGVyOwotCi0KLS8qICBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgcHJvY2VkdXJlIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfcHJvY2VkdXJlIHsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBzeW1ib2wqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZm9yIHByb2NlZHVyZSBpbiAkTE5UVCQsICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGkuZS4gdGhlIHByb2NlZHVyZSBpdHNlbGYgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CS8qIG1lbW9yeSBhZHIgb2Ygc3RhcnQgb2YgcHJvYwkqLwotICAgICAgICBDT1JFX0FERFIJIGFkckVuZDsJLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgcHJvYwkqLwotICAgICAgICBjaGFyICAgICAgICAgICAJKnNiQWxpYXM7CS8qIGFsaWFzIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqc2JQcm9jOwkvKiByZWFsIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyQnA7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IGJyZWFrcG9pbnQgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRXhpdEJwOwkvKiBhZGRyZXNzIG9mIGV4aXQgYnJlYWtwb2ludCAgICovCi0JaW50ICAgICAgICAgICAgICBpY2Q7ICAgICAgICAgICAvKiBtZW1iZXIgb2YgdGhpcyBjbGFzcyAoaW5kZXgpICovCQotCXVuc2lnbmVkIGludAkgaXBkOwkJLyogaW5kZXggb2YgdGVtcGxhdGUgZm9yIHRoaXMgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZnVuY3Rpb24gKGluZGV4KSAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSB1bnVzZWQ6ICAgIDU7Ci0gICAgICAgIHVuc2lnbmVkIGludAkgbm9fbHRfb2Zmc2V0OiAxOy8qIG5vIGVudHJ5IGluIGx0X29mZnNldCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIGZUZW1wbGF0ZTogMTsJLyogZnVuY3Rpb24gdGVtcGxhdGUJCSovCi0gICAgICAgIHVuc2lnbmVkIGludAkgZkV4cGFuc2lvbjogMTsJLyogZnVuY3Rpb24gZXhwYW5zaW9uCQkqLwotCXVuc2lnbmVkIGludAkgbGlua2VkCSAgOiAxOwkvKiBsaW5rZWQgd2l0aCBvdGhlciBleHBhbnNpb25zCSovCi0JdW5zaWduZWQgaW50CSBkdXBsaWNhdGU6IDE7ICAvKiBjbG9uZSBvZiBhbm90aGVyIHByb2NlZHVyZSAgICovCi0JdW5zaWduZWQgaW50CSBvdmVybG9hZGVkOjE7ICAvKiBvdmVybG9hZGVkIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBtZW1iZXI6ICAgIDE7ICAvKiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gICAgICAgICovCi0JdW5zaWduZWQgaW50CSBjb25zdHJ1Y3RvcjoxOyAvKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBkZXN0cnVjdG9yOjE7ICAvKiBkZXN0cnVjdG9yIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBTdGF0aWM6ICAgIDE7ICAvKiBzdGF0aWMgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBWaXJ0dWFsOiAgIDE7ICAvKiB2aXJ0dWFsIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBjb25zdGFudDogIDE7ICAvKiBjb25zdGFudCBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBwdXJlOiAgICAgIDE7ICAvKiBwdXJlICh2aXJ0dWFsKSBmdW5jdGlvbiAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBsYW5ndWFnZTogIDQ7ICAvKiBwcm9jZWR1cmUncyBsYW5ndWFnZSAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAgIDE7ICAvKiBmdW5jdGlvbiBoYXMgYmVlbiBpbmxpbmVkICAgICovCi0JdW5zaWduZWQgaW50ICAgICBPcGVyYXRvcjogIDE7ICAvKiBvcGVyYXRvciBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBzdHViOiAgICAgIDE7ICAvKiBib2R5bGVzcyBmdW5jdGlvbiAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludAkgb3B0aW1pemU6ICAyOwkvKiBvcHRpbWl6YXRpb24gbGV2ZWwgICAJKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBsZXZlbDogICAgIDU7CS8qIG5lc3RpbmcgbGV2ZWwgKHRvcD0wKQkqLwotfSBxdWlja19wcm9jZWR1cmVfZW50cnksICpxdWlja19wcm9jZWR1cmVfZW50cnlfcHRyOwotCi0vKiAgU291cmNlIEZpbGUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgc291cmNlIGZpbGUgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19zb3VyY2UgewotICAgICAgICBsb25nCSAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBpbiAkTE5UVCQgb2YgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZmlyc3Qgc3ltYm9sIGZvciB0aGlzIGZpbGUgICAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyU3RhcnQ7CS8qIG1lbSBhZHIgb2Ygc3RhcnQgb2YgZmlsZSdzIGNvZGUgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyRW5kOwkJLyogbWVtIGFkciBvZiBlbmQgb2YgZmlsZSdzIGNvZGUgICAqLwotICAgICAgICBjaGFyCSAgICAgICpzYkZpbGU7CQkvKiBuYW1lIG9mIHNvdXJjZSBmaWxlCQkgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBmSGFzRGVjbDogMTsJLyogZG8gd2UgaGF2ZSBhIC5kIGZpbGU/CSAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIGZXYXJuZWQ6ICAxOwkvKiBoYXZlIHdhcm5lZCBhYm91dCBhZ2UgcHJvYmxlbXM/ICovCi0JdW5zaWduZWQgaW50ICAgZlNyY2ZpbGU6IDE7ICAgICAvKiAwID0+IGluY2x1ZGUgMT0+IHNvdXJjZSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGlsbk1hYzsJCS8qIGxpbmVzIGluIGZpbGUgKDAgaWYgZG9uJ3Qga25vdykgKi8KLSAgICAgICAgaW50CSAgICAgICBpcGQ7CQkvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IHByb2NlZHVyZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBpbiB0aGlzIGZpbGUsIGluIHRoZSBxdWljayAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgbG9vay11cCB0YWJsZSBvZiBwcm9jZWR1cmVzICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAqcmdMbjsJCS8qIGxpbmUgcG9pbnRlciBhcnJheSwgaWYgYW55CSAgICovCi19IHF1aWNrX2ZpbGVfZW50cnksICpxdWlja19maWxlX2VudHJ5X3B0cjsKLQotLyogIE1vZHVsZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBtb2R1bGUgcXVpY2sgcmVmZXJlbmNlIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX21vZHVsZSB7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsJCSAgIC8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3QgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHN5bWJvbCBmb3IgbW9kdWxlICAgICAgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CSAgIC8qIGFkciBvZiBzdGFydCBvZiBtb2QuCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRW5kOwkgICAvKiBhZHIgb2YgZW5kIG9mIG1vZC4JKi8KLSAgICAgICAgY2hhcgkgICAgICAgICpzYkFsaWFzOwkgICAvKiBhbGlhcyBuYW1lIG9mIG1vZHVsZSAgIAkqLwotICAgICAgICBjaGFyCSAgICAgICAgKnNiTW9kOwkJICAgLyogcmVhbCBuYW1lIG9mIG1vZHVsZQkqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGltcG9ydHM6ICAgICAgIDE7IC8qIG1vZHVsZSBoYXZlIGFueSBpbXBvcnRzPyAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YXJzX2luX2Zyb250OiAxOyAvKiBtb2R1bGUgZ2xvYmFscyBpbiBmcm9udD8gICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdmFyc19pbl9nYXBzOiAgMTsgLyogbW9kdWxlIGdsb2JhbHMgaW4gZ2Fwcz8gICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGxhbmd1YWdlOiAgICAgIDQ7IC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB1bnVzZWQgICAgICA6IDI1OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDI7CSAgIC8qIHNwYWNlIGZvciBmdXR1cmUgc3R1ZmYJKi8KLX0gcXVpY2tfbW9kdWxlX2VudHJ5LCAqcXVpY2tfbW9kdWxlX2VudHJ5X3B0cjsKLQotLyogIEF1eGlsaWFyeSBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgYXV4aWxpYXJ5IHByb2NlZHVyZSBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2F1eF9wcm9jZWR1cmUgewotICAgICAgICBsb25nCSBpc3ltX2lubG47CS8qIHN0YXJ0IG9uIGlubGluZSBsaXN0IGZvciBwcm9jICovCi0JbG9uZyAgICAgc3BhcmU7Ci19IHF1aWNrX2F1eF9wcm9jZWR1cmVfZW50cnksICpxdWlja19hdXhfcHJvY2VkdXJlX2VudHJ5X3B0cjsKLQotLyogIFBhcmFncmFwaCBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBwYXJhZ3JhcGggcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19wYXJhZ3JhcGggewotICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07ICAgICAgIC8qIGZpcnN0IHN5bWJvbCBmb3IgbGFiZWwgKGluZGV4KSAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgICBhZHJTdGFydDsgICAvKiBtZW1vcnkgYWRyIG9mIHN0YXJ0IG9mIGxhYmVsICAgICovCi0gICAgICAgIENPUkVfQUREUiAgICAgICAgYWRyRW5kOyAgICAgLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgbGFiZWwgICAgICAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgKnNiTGFiOyAgICAgIC8qIG5hbWUgb2YgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbnN0OyAgICAgICAvKiBVc2VkIGluIHhkYiB0byBzdG9yZSBpbnN0IEAgYnAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc2VjdDogICAgMTsgLyogdHJ1ZSA9IHNlY3Rpb24sIGZhbHNlID0gcGFyYWcuICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDogMzE7IC8qIGZ1dHVyZSB1c2UgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gcXVpY2tfcGFyYWdyYXBoX2VudHJ5LCAqcXVpY2tfcGFyYWdyYXBoX2VudHJ5X3B0cjsKLQotLyoKLSAqICBDbGFzcyBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBjbGFzcyBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2NsYXNzIHsKLSAgICAgICAgY2hhcgkgICAgICAgICAqc2JDbGFzczsJLyogbmFtZSBvZiBjbGFzcwkgICAgICAgICovCi0gICAgICAgIGxvbmcgICAgICAgICAgICAgIGlzeW07ICAgICAgICAgLyogY2xhc3Mgc3ltYm9sICh0YWcpICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludAkgIHR5cGUgOiAyOwkvKiAwPWNsYXNzLCAxPXVuaW9uLCAyPXN0cnVjdCAgICovCi0JdW5zaWduZWQgaW50CSAgZlRlbXBsYXRlIDogMTsvKiBjbGFzcyB0ZW1wbGF0ZSAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgZXhwYW5zaW9uIDogMTsvKiB0ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgdW51c2VkICAgIDoyODsKLQlzbHRwb2ludGVyICAgICAgICBsb3dzY29wZTsJLyogYmVnaW5uaW5nIG9mIGRlZmluZWQgc2NvcGUgICAqLwotCXNsdHBvaW50ZXIgICAgICAgIGhpc2NvcGU7CS8qIGVuZCBvZiBkZWZpbmVkIHNjb3BlICAgICAgICAgKi8KLX0gcXVpY2tfY2xhc3NfZW50cnksICpxdWlja19jbGFzc19lbnRyeV9wdHI7Ci0KLS8qICBBZGRyZXNzIEFsaWFzIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIGFkZHJlc3MgYWxpYXMgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19hbGlhcyB7Ci0JQ09SRV9BRERSICAgICAgIGxvdzsKLQlDT1JFX0FERFIgICAgICAgaGlnaDsKLQlpbnQgICAgICAgICAgICAgaW5kZXg7Ci0JdW5zaWduZWQgaW50CXVudXNlZCA6IDMxOwotCXVuc2lnbmVkIGludAlhbHRlcm5hdGUgOiAxOwkvKiBhbHRlcm5hdGUgdW5uYW1lZCBhbGlhc2VzPyAgICovCi19IHF1aWNrX2FsaWFzX2VudHJ5LCAqcXVpY2tfYWxpYXNfZW50cnlfcHRyOwotCi0vKiAgT2JqZWN0IElkZW50aWZpY2F0aW9uIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIG9iamVjdCBpZGVudGlmaWNhdGlvbiBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfb2JqX0lEIHsKLQlDT1JFX0FERFIgICAgb2JqX2lkZW50OwkJLyogY2xhc3MgaWRlbnRpZmllciAgICAgICAgICovCi0JbG9uZyAgICAgICAgIGlzeW07CQkvKiBjbGFzcyBzeW1ib2wgICAgICAgICAgICAgKi8KLQlsb25nICAgICAgICAgb2Zmc2V0OwkJLyogb2Zmc2V0IHRvIG9iamVjdCBzdGFydCAgICovCi19IHF1aWNrX29ial9JRF9lbnRyeSwgKnF1aWNrX29ial9JRF9lbnRyeV9wdHI7Ci0KLQotI2VuZGlmIC8qIEhQX1NZTVRBQl9JTkNMVURFRCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2llZWUuaCBiL2luY2x1ZGUvaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRlMzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qIElFRUUgU3RhbmRhcmQgNjk1LTE5ODAgIlVuaXZlcnNhbCBGb3JtYXQgZm9yIE9iamVjdCBNb2R1bGVzIiBoZWFkZXIgZmlsZQotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE5fV19WQVJJQUJMRVMgOAotI2RlZmluZSBNb2R1bGVfQmVnaW5uaW5nIDB4ZTAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9tb2R1bGUgewotICBjaGFyICpwcm9jZXNzb3I7Ci0gIGNoYXIgKm1vZHVsZV9uYW1lOwotfSBpZWVlX21vZHVsZV9iZWdpbl90eXBlOwotCi0jZGVmaW5lIEFkZHJlc3NfRGVzY3JpcHRvciAweGVjCi10eXBlZGVmIHN0cnVjdCBpZWVlX2FkZHJlc3MgewotYmZkX3ZtYSBudW1iZXJfb2ZfYml0c19tYXU7Ci0gYmZkX3ZtYSBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzOwotCi0gIHVuc2lnbmVkIGNoYXIgYnl0ZV9vcmRlcjsKLSNkZWZpbmUgSUVFRV9MSVRUTEUgMHhjYwotI2RlZmluZSBJRUVFX0JJRyAweGNkCi19IGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gaWVlZV93X3ZhcmlhYmxlIHsKLSAgZmlsZV9wdHIgb2Zmc2V0W05fV19WQVJJQUJMRVNdOwotICBzdHJ1Y3QgewotICAgIGZpbGVfcHRyIGV4dGVuc2lvbl9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgZW52aXJvbm1lbnRhbF9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgc2VjdGlvbl9wYXJ0OwotICAgIGZpbGVfcHRyIGV4dGVybmFsX3BhcnQ7Ci0gICAgZmlsZV9wdHIgZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLSAgICBmaWxlX3B0ciBkYXRhX3BhcnQ7Ci0gICAgZmlsZV9wdHIgdHJhaWxlcl9wYXJ0OwotICAgIGZpbGVfcHRyIG1lX3JlY29yZDsKLSAgfSByOwotfSBpZWVlX3dfdmFyaWFibGVfdHlwZTsKLQotCi0KLQotCi10eXBlZGVmIGVudW0gaWVlZV9yZWNvcmQKLXsgCi0gIGllZWVfbnVtYmVyX3N0YXJ0X2VudW0gPSAweDAwLAotICBpZWVlX251bWJlcl9lbmRfZW51bT0weDdmLAotICBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSA9IDB4ODAsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSA9IDB4ODgsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW0gPSAweDg0LAotICBpZWVlX251bWJlcl9yZXBlYXRfM19lbnVtID0gMHg4MywKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzJfZW51bSA9IDB4ODIsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF8xX2VudW0gPSAweDgxLAotICBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSA9IDB4ZTAsCi0gIGllZWVfbW9kdWxlX2VuZF9lbnVtID0gMHhlMSwKLSAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSA9IDB4ZGUsCi0gIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0gPSAweGRmLAotICBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtID0gMHhlNiwKLSAgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtID0gMHhlNywKLSAgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSA9IDB4ZTgsCi0gIGllZWVfY29tbWEgPSAweDkwLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtID0gMHhlOSwKLSAgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0gPSAweGU1LAotICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtID0gMHhlYywKLSAgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gPSAweGVkLAotICBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0gPSAweGU0LAotCi0gIGllZWVfdmFyaWFibGVfQV9lbnVtID0gMHhjMSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9CX2VudW0gPSAweGMyLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0NfZW51bSA9IDB4YzMsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfRF9lbnVtID0gMHhjNCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9FX2VudW0gPSAweGM1LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0ZfZW51bSA9IDB4YzYsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfR19lbnVtID0gMHhjNywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9IX2VudW0gPSAweGM4LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0lfZW51bSA9IDB4YzksCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfSl9lbnVtID0gMHhjYSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9LX2VudW0gPSAweGNiLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0xfZW51bSA9IDB4Y2MsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfTV9lbnVtID0gMHhjZCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9OX2VudW0gPSAweGNlLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX09fZW51bSA9IDB4Y2YsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfUF9lbnVtID0gMHhkMCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9RX2VudW0gPSAweGQxLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1JfZW51bSA9IDB4ZDIsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfU19lbnVtID0gMHhkMywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9UX2VudW0gPSAweGQ0LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1VfZW51bSA9IDB4ZDUsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfVl9lbnVtID0gMHhkNiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9XX2VudW0gPSAweGQ3LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1hfZW51bSA9IDB4ZDgsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfWV9lbnVtID0gMHhkOSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9aX2VudW0gPSAweGRhLAotICBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSA9IDB4YTUsCi0gIGllZWVfZnVuY3Rpb25fbWludXNfZW51bSA9IDB4YTYsCi0gIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYSwKLSAgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtID0gMHhiYiwKLQotICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYywKLSAgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJkLAotCi0gIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtID0gMHhiZSwKLSAgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtID0gMHhiZiwKLSAgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0gPSAweGRiLAotCi0gIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtID0gMHhlMiwKLSAgaWVlZV9zZWN0aW9uX3NpemVfZW51bSA9IDB4ZTJkMywKLSAgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtID0gMHhlMmMxLAotICBpZWVlX3JlZ2lvbl9iYXNlX2FkZHJlc3NfZW51bSA9IDB4ZTJjMiwKLSAgaWVlZV9tYXVfc2l6ZV9lbnVtID0gMHhlMmM2LAotICBpZWVlX21fdmFsdWVfZW51bSA9IDB4ZTJjZCwKLSAgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmNjLAotICBpZWVlX2Fzbl9yZWNvcmRfZW51bSA9IDB4ZTJjZSwKLSAgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtID0gMHhlMmQyLAotICBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSA9IDB4ZTJjNywKLSAgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSA9IDB4ZTJkNywKLSAgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID0gMHhlMmQwLAotICBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID0gMHhlMmM5LAotICBpZWVlX25uX3JlY29yZCA9IDB4ZjAsCi0gIGllZWVfYXRfcmVjb3JkX2VudW0gPSAweGYxLAotICBpZWVlX3R5X3JlY29yZF9lbnVtID0gMHhmMiwKLSAgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPSAweGYxYzksCi0gIGllZWVfYXRuX3JlY29yZF9lbnVtID0gMHhmMWNlLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtID0gMHhmMWQ4LAotICBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW09IDB4ZjQsCi0gIGllZWVfcmVwZWF0X2RhdGFfZW51bSA9IDB4ZjcsCi0gIGllZWVfYmJfcmVjb3JkX2VudW0gPSAweGY4LAotICBpZWVlX2JlX3JlY29yZF9lbnVtID0gMHhmOQotfSBpZWVlX3JlY29yZF9lbnVtX3R5cGU7Ci0JCSAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9zZWN0aW9uIHsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX3R5cGU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgdW5zaWduZWQgaW50IHBhcmVudF9zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgc2libGluZ19zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgY29udGV4dF9pbmRleDsKLX0gaWVlZV9zZWN0aW9uX3R5cGU7Ci0jZGVmaW5lIElFRUVfUkVGRVJFTkNFX0JBU0UgMTEKLSNkZWZpbmUgSUVFRV9QVUJMSUNfQkFTRSAzMgotI2RlZmluZSBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UgMQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmliZXJ0eS5oIGIvaW5jbHVkZS9saWJpYmVydHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1MzZhNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpYmliZXJ0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgbGliaWJlcnR5LgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5NC4KLQotICAgVGhlIGxpYmliZXJ0eSBsaWJyYXJ5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUKLSAgIG1pc3Npbmcgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gIFdlIGRvIG5vdCBkZWNsYXJlIHRob3NlIGhlcmUsCi0gICB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBvbiBvcGVyYXRpbmcKLSAgIHN5c3RlbXMgdGhhdCBkbyBzdXBwb3J0IHRob3NlIGZ1bmN0aW9ucy4gIEluIHRoaXMgZmlsZSB3ZSBvbmx5Ci0gICBkZWNsYXJlIHRob3NlIGZ1bmN0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gbGliaWJlcnR5LiAgKi8KLQotI2lmbmRlZiBMSUJJQkVSVFlfSAotI2RlZmluZSBMSUJJQkVSVFlfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBCdWlsZCBhbiBhcmd1bWVudCB2ZWN0b3IgZnJvbSBhIHN0cmluZy4gIEFsbG9jYXRlcyBtZW1vcnkgdXNpbmcKLSAgIG1hbGxvYy4gIFVzZSBmcmVlYXJndiB0byBmcmVlIHRoZSB2ZWN0b3IuICAqLwotCi1leHRlcm4gY2hhciAqKmJ1aWxkYXJndiBQQVJBTVMgKChjaGFyICopKSBBVFRSSUJVVEVfTUFMTE9DOwotCi0vKiBGcmVlIGEgdmVjdG9yIHJldHVybmVkIGJ5IGJ1aWxkYXJndi4gICovCi0KLWV4dGVybiB2b2lkIGZyZWVhcmd2IFBBUkFNUyAoKGNoYXIgKiopKTsKLQotLyogRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gQWxsb2NhdGVzIG1lbW9yeSB1c2luZyBtYWxsb2MuICBVc2UKLSAgIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqZHVwYXJndiBQQVJBTVMgKChjaGFyICoqKSkgQVRUUklCVVRFX01BTExPQzsKLQotCi0vKiBSZXR1cm4gdGhlIGxhc3QgY29tcG9uZW50IG9mIGEgcGF0aCBuYW1lLiAgTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBhCi0gICBwcm90b3R5cGUgaGVyZSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgaW5jb25zaXN0ZW50bHkKLSAgIGFjcm9zcyBkaWZmZXJlbnQgc3lzdGVtcywgc29tZXRpbWVzIGFzICJjaGFyICoiIGFuZCBzb21ldGltZXMgYXMKLSAgICJjb25zdCBjaGFyICoiICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18gKSB8fCBkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotI2Vsc2UKLWV4dGVybiBjaGFyICpiYXNlbmFtZSAoKTsKLSNlbmRpZgotCi0vKiBDb25jYXRlbmF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0cmluZ3MsIHVwIHRvIChjaGFyICopIE5VTEwuCi0gICBBbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHhtYWxsb2MuICAqLwotCi1leHRlcm4gY2hhciAqY29uY2F0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogQ2hlY2sgd2hldGhlciB0d28gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLiAgKi8KLQotZXh0ZXJuIGludCBmZG1hdGNoIFBBUkFNUyAoKGludCBmZDEsIGludCBmZDIpKTsKLQotLyogR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gIFRoZSByZXN1bHQgaXMgY2FjaGVkLCBzbyBkb24ndCBjYWxsCi0gICBjaGRpcigpIGJldHdlZW4gY2FsbHMgdG8gZ2V0cHdkKCkuICAqLwotCi1leHRlcm4gY2hhciAqIGdldHB3ZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEdldCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHByb2Nlc3MgaGFzIHJ1biwgaW4gbWljcm9zZWNvbmRzLiAgKi8KLQotZXh0ZXJuIGxvbmcgZ2V0X3J1bl90aW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ2hvb3NlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHNjcmF0Y2ggZmlsZXMuICAqLwotCi1leHRlcm4gY2hhciAqY2hvb3NlX3RlbXBfYmFzZSBQQVJBTVMgKCh2b2lkKSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogUmV0dXJuIGEgdGVtcG9yYXJ5IGZpbGUgbmFtZSBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUgb25lLiAgKi8KLQotZXh0ZXJuIGNoYXIgKm1ha2VfdGVtcF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmaWxsZWQgd2l0aCBzcGFjZXMuICBBbGxvY2F0ZXMgdXNpbmcgbWFsbG9jLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYWNlcyBQQVJBTVMgKChpbnQgY291bnQpKTsKLQotLyogUmV0dXJuIHRoZSBtYXhpbXVtIGVycm9yIG51bWJlciBmb3Igd2hpY2ggc3RyZXJyb3Igd2lsbCByZXR1cm4gYQotICAgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIGludCBlcnJub19tYXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUgKGUuZy4sIHN0cmVycm5vIChFSU5WQUwpIHJldHVybnMKLSAgICJFSU5WQUwiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUsIHJldHVybiB0aGUgdmFsdWUuICAqLwotCi1leHRlcm4gaW50IHN0cnRvZXJybm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFOU0kncyBzdHJlcnJvcigpLCBidXQgbW9yZSByb2J1c3QuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmVycm9yIFBBUkFNUyAoKGludCkpOwotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gc2lnbmFsIG51bWJlciBmb3Igd2hpY2ggc3Ryc2lnbmFsIHdpbGwgcmV0dXJuIGEKLSAgIHN0cmluZy4gICovCi0KLWV4dGVybiBpbnQgc2lnbm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmV0dXJuIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIHNpZ25hbCBudW1iZXIKLSAgIChlLmcuLCBzdHJzaWduYWwgKFNJR0hVUCkgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiSGFuZ3VwIikuICAqLwotLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIGl0IGNhbiBjb25mbGljdCB3aXRoIG9uZSBpbiBzeXN0ZW0gaGVhZGVycy4KLSAgIFdlIHN0aWxsIGRvY3VtZW50IGl0cyBleGlzdGVuY2UgdGhvdWdoLiAgKi8KLQotLypleHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbmFsIFBBUkFNUyAoKGludCkpOyovCi0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHNpZ25hbCBudW1iZXIgKGUuZy4sIHN0cnNpZ25vIChTSUdIVVApIHJldHVybnMKLSAgICJTSUdIVVAiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJzaWdubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYSBzaWduYWwsIHJldHVybiBpdHMgbnVtYmVyLiAgKi8KLQotZXh0ZXJuIGludCBzdHJ0b3NpZ25vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIHJ1biBieSB4ZXhpdC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAgKi8KLQotZXh0ZXJuIGludCB4YXRleGl0IFBBUkFNUyAoKHZvaWQgKCpmbikgKHZvaWQpKSk7Ci0KLS8qIEV4aXQsIGNhbGxpbmcgYWxsIHRoZSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHhhdGV4aXQuICAqLwotCi1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSkgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBTZXQgdGhlIHByb2dyYW0gbmFtZSB1c2VkIGJ5IHhtYWxsb2MuICAqLwotCi1leHRlcm4gdm9pZCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB3aXRob3V0IGZhaWwuICBJZiBtYWxsb2MgZmFpbHMsIHRoaXMgd2lsbCBwcmludCBhCi0gICBtZXNzYWdlIHRvIHN0ZGVyciAodXNpbmcgdGhlIG5hbWUgc2V0IGJ5IHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSwKLSAgIGlmIGFueSkgYW5kIHRoZW4gY2FsbCB4ZXhpdC4gICovCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIHNpemVfdC4gICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciB2YV9saXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIFRoaXMgd29ya3MgbGlrZSB4bWFsbG9jLiAgTm90ZSwKLSAgIHJlYWxsb2MgdHlwZSBmdW5jdGlvbnMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgYXR0cmlidXRlIG1hbGxvYyBzaW5jZQotICAgdGhleSBtYXkgcmV0dXJuIHRoZSBzYW1lIGFkZHJlc3MgYWNyb3NzIG11bHRpcGxlIGNhbGxzLiAqLwotCi1leHRlcm4gUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB3aXRob3V0IGZhaWwgYW5kIHNldCBpdCB0byB6ZXJvLiAgVGhpcyB3b3JrcyBsaWtlCi0gICB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiB4Y2FsbG9jIFBBUkFNUyAoKHNpemVfdCwgc2l6ZV90KSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogQ29weSBhIHN0cmluZyBpbnRvIGEgbWVtb3J5IGJ1ZmZlciB3aXRob3V0IGZhaWwuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKSBBVFRSSUJVVEVfTUFMTE9DOwotCi0vKiBDb3B5IGFuIGV4aXN0aW5nIG1lbW9yeSBidWZmZXIgdG8gYSBuZXcgbWVtb3J5IGJ1ZmZlciB3aXRob3V0IGZhaWwuICAqLwotCi1leHRlcm4gUFRSIHhtZW1kdXAgUEFSQU1TICgoY29uc3QgUFRSLCBzaXplX3QsIHNpemVfdCkpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIGhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzICovCi0KLSNkZWZpbmUgX2hleF9hcnJheV9zaXplIDI1NgotI2RlZmluZSBfaGV4X2JhZAk5OQotZXh0ZXJuIGNoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOwotZXh0ZXJuIHZvaWQgaGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBoZXhfcChjKQkoaGV4X3ZhbHVlIChjKSAhPSBfaGV4X2JhZCkKLS8qIElmIHlvdSBjaGFuZ2UgdGhpcywgbm90ZSB3ZWxsOiBTb21lIGNvZGUgcmVsaWVzIG9uIHNpZGUgZWZmZWN0cyBpbgotICAgdGhlIGFyZ3VtZW50IGJlaW5nIHBlcmZvcm1lZCBleGFjdGx5IG9uY2UuICAqLwotI2RlZmluZSBoZXhfdmFsdWUoYykJKF9oZXhfdmFsdWVbKHVuc2lnbmVkIGNoYXIpIChjKV0pCi0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIHBleGVjdXRlIHJvdXRpbmUuICAqLwotCi0jZGVmaW5lIFBFWEVDVVRFX0ZJUlNUICAgMQotI2RlZmluZSBQRVhFQ1VURV9MQVNUICAgIDIKLSNkZWZpbmUgUEVYRUNVVEVfT05FICAgICAoUEVYRUNVVEVfRklSU1QgKyBQRVhFQ1VURV9MQVNUKQotI2RlZmluZSBQRVhFQ1VURV9TRUFSQ0ggIDQKLSNkZWZpbmUgUEVYRUNVVEVfVkVSQk9TRSA4Ci0KLS8qIEV4ZWN1dGUgYSBwcm9ncmFtLiAgKi8KLQotZXh0ZXJuIGludCBwZXhlY3V0ZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKiBjb25zdCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCBjaGFyICoqLCBpbnQpKTsKLQotLyogV2FpdCBmb3IgcGV4ZWN1dGUgdG8gZmluaXNoLiAgKi8KLQotZXh0ZXJuIGludCBwd2FpdCBQQVJBTVMgKChpbnQsIGludCAqLCBpbnQpKTsKLQotLyogTGlrZSBzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi0KLWV4dGVybiBpbnQgYXNwcmludGYgUEFSQU1TICgoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pKSBBVFRSSUJVVEVfUFJJTlRGXzI7Ci0KLS8qIExpa2UgdnNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaAotICAgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KLQotZXh0ZXJuIGludCB2YXNwcmludGYgUEFSQU1TICgoY2hhciAqKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSkKLSAgQVRUUklCVVRFX1BSSU5URigyLDApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExJQklCRVJUWV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nIGIvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJhZDg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLVR1ZSBGZWIgMjcgMTI6MjM6MDQgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LmggKEhBVkVfVlBSSU5URik6IEFkZCBhbmQgZGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0KLUZyaSBEZWMgMjkgMTQ6NDA6NDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaCAoSEFWRV9TVERMSUJfSCwgZXRjKTogRGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0JKEhBVkVfRkNOVExfSCk6IERlZmluZS4KLQotTW9uIERlYyAxMSAxNTozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oIChvcGVuLCBhY2Nlc3MpOiBEZWZpbmUgYXMgbXB3X29wZW4gYW5kIG1wd19hY2Nlc3MuCi0KLVRodSBOb3YgIDkgMTU6Mzg6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaDogSW5jbHVkZSB1bml4LmggaWYgVVNFX01XX0hFQURFUlMsIG90aGVyd2lzZSBpbmNsdWRlCi0JdmFyaW91cyBvcmlnaW5hbCBNUFcgaW5jbHVkZSBmaWxlcyAoaW9jdGwuaCwgZXRjKS4KLQkoRUlPKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogc3lzL2lvY3RsLmg6IFJlbW92ZSwgbm90IG5lZWRlZC4KLQotV2VkIE9jdCAyNSAxMjozMDo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBEb24ndCBpbmNsdWRlIGVycm5vLmggb3IgaW9jdGwuaC4KLQkoRU5PRU5ULCBFQUNDRVMsIEVOT1NZUyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZmRvcGVuKTogRGVjbGFyZSBpZiBfX1NURENfXy4KLQkoUl9PSywgV19PSywgWF9PSyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotVHVlIFNlcCAyNiAxNDo1NzoyMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBOZXcgZmlsZSwgdW5pdmVyc2FsbHkgdXNlZnVsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCU1hbnkgb2YgdGhlc2UgdXNlZCB0byBsaXZlIGluIGJmZC9ob3N0cy9tcHcuaC4KLQkqIGdycC5oOiBSZW1vdmUgUkNTIGNvbW1lbnQuCi0JKiBzeXMvaW9jdGwuaDogQWRkIGEgY29tbWVudCBsaW5lLgotCi1XZWQgRGVjIDE0IDEzOjEyOjE0IDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogc3Bpbi5oOiBOZXcgZmlsZSwgY3Vyc29yIHNwaW5uaW5nIGZvciBwcm9ncmVzcy4KLQotVGh1IEp1biAzMCAxNTozMjowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGZjbnRsLmggKG9wZW4pOiBBbGxvdyBvcHRpb25hbCB0aGlyZCBhcmcuCi0KLVRodSBBcHIgMTQgMTI6NTQ6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkaXIuaCwgZGlyZW50LmgsIGZjbnRsLmgsIGdycC5oLCBwd2QuaCwgc3RhdC5oOiBOZXcgZmlsZXMuCi0JKiBzeXMvaW9jdGwuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMDk6NDQ6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzeXMvc3RhdC5oIChzdHJ1Y3Qgc3RhdCk6IE5ldyBmaWVsZCBzdF9yc2l6ZS4KLQkoU19JRk1ULCBldGMpOiBVc2UgZGlmZmVyZW50IGJpdCBwb3NpdGlvbnMuCi0JKGZzdGF0KTogQWRkIHBhcmFtZXRlciBuYW1lcyB0byBwcm90b3R5cGUuCi0KLU1vbiBKYW4gMzEgMTk6MzA6MTYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogdXRpbWUuaCwgdmFyYXJncy5oOiBOZXcgZmlsZXMsIHNpbXVsYXRlZCBQb3NpeC4KLQkqIHN5cy97ZmlsZSxwYXJhbSxyZXNvdXJjZSxzdGF0LHRpbWUsdHlwZXN9Lmg6IE5ldyBmaWxlcywgbW9yZQotCXNpbXVsYXRlZCBQb3NpeC4KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9SRUFETUUgYi9pbmNsdWRlL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTkyZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgaW5jbHVkZSBmaWxlcyB0aGF0IGhlbHAgaW1pdGF0ZSBQb3NpeCBpbiBNUFcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9kaXIuaCBiL2luY2x1ZGUvbXB3L2Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNjZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2Rpci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogVGhlIDxkaXIuaD4gaGVhZGVyIGdpdmVzIHRoZSBsYXlvdXQgb2YgYSBkaXJlY3RvcnkuICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9ESVJfSAotI2RlZmluZSBfRElSX0gKLQotI2lmbmRlZiBfVFlQRVNfSAkJLyogbm90IHF1aXRlIHJpZ2h0ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2RlZmluZQlESVJCTEtTSVoJNTEyCS8qIHNpemUgb2YgZGlyZWN0b3J5IGJsb2NrICovCi0KLSNpZm5kZWYgRElSU0laCi0jZGVmaW5lCURJUlNJWgkxNAotI2VuZGlmCi0KLXN0cnVjdCBkaXJlY3QgewotICBpbm9fdCBkX2lubzsKLSAgY2hhciBkX25hbWVbRElSU0laXTsKLX07Ci0KLSNlbmRpZiAvKiBfRElSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2RpcmVudC5oIGIvaW5jbHVkZS9tcHcvZGlyZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDAwYjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZGlyZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9fZGlyZW50X2gKLSNkZWZpbmUgX19kaXJlbnRfaAotCi0jaW5jbHVkZSAic3lzL2Rpci5oIgotCi1zdHJ1Y3QgZGlyZW50IHsKLSAgbG9uZyBkX2lubzsJCQkvKiBpbm9kZSBudW1iZXIgb2YgZW50cnkgKi8KLSAgb2ZmX3QJZF9vZmY7CQkJLyogb2Zmc2V0IG9mIGRpc2sgZGlyZWN0b3J5IGVudHJ5ICovCi0gIHVuc2lnbmVkIHNob3J0IGRfcmVjbGVuOwkvKiBsZW5ndGggb2YgdGhpcyByZWNvcmQgKi8KLSAgY2hhciBkX25hbWVbMV07CQkvKiBuYW1lIG9mIGZpbGUgKi8KLX07Ci0KLS8qCi0jZGVmaW5lCURJUkVOVEJBU0VTSVpFIFwKLQkoKChzdHJ1Y3QgZGlyZW50ICopIDApLT5kX25hbWUgLSAoY2hhciAqKSAwKQotI2RlZmluZQlESVJFTlRTSVpFKG5hbWVsZW4pIFwKLQkoKERJUkVOVEJBU0VTSVpFICsgKG5hbWVsZW4pICsgTkJQVykgJiB+KE5CUFcgLSAxKSkKLSovCi0KLS8qIGZyb20gTWlwcyBwb3NpeC9kaXJlbnQuaCAqLwotCi0vKgotI3VuZGVmIHJld2luZGRpcgotKi8KLQotZXh0ZXJuIERJUiAqb3BlbmRpcigpOwotZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIoKTsKLWV4dGVybiB2b2lkCQlyZXdpbmRkaXIoKTsKLWV4dGVybiBpbnQJCWNsb3NlZGlyKCk7Ci0KLSNlbmRpZiAvKiAhIF9fZGlyZW50X2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2ZjbnRsLmggYi9pbmNsdWRlL21wdy9mY250bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk5OWI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2ZjbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIEZDbnRsLmggLS0gZmFjY2VzcygpLCBmY250bCgpLCBhbmQgb3BlbigpIG1vZGUgZmxhZ3MKLSAqCi0gKiBQb3J0aW9ucyBjb3B5cmlnaHQgQW1lcmljYW4gVGVsZXBob25lICYgVGVsZWdyYXBoCi0gKiBVc2VkIHdpdGggcGVybWlzc2lvbiwgQXBwbGUgQ29tcHV0ZXIgSW5jLiAoMTk4NSwxOTg4LDE5OTAsMTk5MikKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotI2lmbmRlZiBfX0ZDTlRMX18KLSNkZWZpbmUgX19GQ05UTF9fCi0KLSNpZm5kZWYgX19UWVBFU19fCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNlbmRpZgotCi0vKgotICoJRm9yIHVzZSBieSBsc2VlaygpOgotICovCi0KLSNpZm5kZWYgX19TVERJT19fCQkJLyogdGhlc2UgZGVmbnMgZXhhY3RseSBwYXJhbGxlZCBpbiBTdGRJTy5oIGZvciBmc2VlaygpICovCi0jZGVmaW5lIFNFRUtfQ1VSCTEKLSNkZWZpbmUgU0VFS19FTkQJMgotI2RlZmluZSBTRUVLX1NFVAkwCi0jZW5kaWYKLQotLyoKLSAqIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIGdlbmVyYWwgdXNlCi0gKi8KLSAJCQkJCS8qICdkJyA9PiAiZGlyZWN0b3J5IiBvcHMgKi8KLSNkZWZpbmUgRl9ERUxFVEUJCSgoJ2QnPDw4KXwweDAxKQotI2RlZmluZSBGX1JFTkFNRQkJKCgnZCc8PDgpfDB4MDIpCi0KLS8qCi0gKiBtb3JlIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIHVzZSBvbmx5IGJ5IE1QVyB0b29scwotICovCi0gCi0jZGVmaW5lIEZfT1BFTiAJCQkoKCdkJzw8OCl8MHgwMCkJCS8qIHJlc2VydmVkIGZvciBvcGVyYXRpbmcgc3lzdGVtIHVzZSAqLwotCQkJCQkvKiAnZScgPT4gImVkaXRvciIgb3BzICovCi0jZGVmaW5lIEZfR1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMCkJCS8qIGdldCB0YWIgb2Zmc2V0IGZvciBmaWxlICovCQotI2RlZmluZSBGX1NUQUJJTkZPIAkJKCgnZSc8PDgpfDB4MDEpCQkvKiBzZXQgCSIJIgkJIgkiICAqLwotI2RlZmluZSBGX0dGT05USU5GTwkJKCgnZSc8PDgpfDB4MDIpCQkvKiBnZXQgZm9udCBudW1iZXIgYW5kIHNpemUgZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TRk9OVElORk8JCSgoJ2UnPDw4KXwweDAzKQkJLyogc2V0IAkiCQkiCSIJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dQUklOVFJFQwkJKCgnZSc8PDgpfDB4MDQpCQkvKiBnZXQgcHJpbnQgcmVjb3JkIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNSkJCS8qIHNldCAJIgkJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dTRUxJTkZPIAkJKCgnZSc8PDgpfDB4MDYpCQkvKiBnZXQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNykJCS8qIHNldAkJIgkJIgkJIgkJIiAqLwotI2RlZmluZSBGX0dXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDgpCQkvKiBnZXQgY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KLSNkZWZpbmUgRl9TV0lOSU5GTyAJCSgoJ2UnPDw4KXwweDA5KQkJLyogc2V0CSIJCSIJCSIgCSAgICovCi0jZGVmaW5lIEZfR1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEEpCQkvKiBnZXQgc2Nyb2xsIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEZfU1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEIpCQkvKiBzZXQgICAgIiAgIAkJIiAgCSAgKi8KLSNkZWZpbmUgRl9HTUFSS0VSCQkoKCdlJzw8OCl8MHgwRCkJCS8qIEdldCBNYXJrZXIgKi8KLSNkZWZpbmUgRl9TTUFSS0VSCQkoKCdlJzw8OCl8MHgwQykJCS8qIFNldCAgICIgCSAgKi8KLSNkZWZpbmUgRl9HU0FWRU9OQ0xPU0UJKCgnZSc8PDgpfDB4MEYpCQkvKiBHZXQgU2F2ZSBvbiBjbG9zZSAqLwotI2RlZmluZSBGX1NTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRSkJCS8qIFNldCAgICIJICIJICIgCSAqLwotCi0vKgotICoJYXJndW1lbnQgc3RydWN0dXJlcyB1c2VkIGJ5IHZhcmlvdXMgZmFjY2VzcygpIGNvbW1hbmRzCi0gKi8KLSAKLXN0cnVjdCBNYXJrRWxlbWVudCB7Ci0JaW50CQkJCXN0YXJ0OwkJCS8qIHN0YXJ0IHBvc2l0aW9uIG9mIG1hcmsgKi8KLQlpbnQJCQkJZW5kOwkJCS8qIGVuZCBwb3NpdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIJY2hhckNvdW50OwkJLyogbnVtYmVyIG9mIGNoYXJzIGluIG1hcmsgbmFtZSAqLwotCWNoYXIJCQluYW1lWzY0XTsJCS8qIG1hcmsgbmFtZSAqLwotfSA7CQkJCQkJCQkJLyogbm90ZTogbWFya2VyIG5hbWVzIG1heSBiZSB1cCB0byA2NCBjaGFyYWN0ZXJzIGxvbmcgKi8KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBzdHJ1Y3QgTWFya0VsZW1lbnQgTWFya0VsZW1lbnQ7Ci0jZW5kaWYKLQotc3RydWN0IFNlbGVjdGlvblJlY29yZCB7Ci0JbG9uZwlzdGFydGluZ1BvczsKLQlsb25nCWVuZGluZ1BvczsKLQlsb25nCWRpc3BsYXlUb3A7Ci19OwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIHN0cnVjdCBTZWxlY3Rpb25SZWNvcmQgU2VsZWN0aW9uUmVjb3JkOwotI2VuZGlmCi0KLQotLyoKLSAqIE1vZGUgdmFsdWVzIGFjY2Vzc2libGUgdG8gb3BlbigpCi0gKi8KLSNkZWZpbmUgT19SRE9OTFkJCSAwIAkJLyogQml0cyAwIGFuZCAxIGFyZSB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgT19XUk9OTFkJCSAxIAkJLyogVmFsdWVzIDAuLjIgYXJlIGhpc3RvcmljYWwgKi8KLSNkZWZpbmUgT19SRFdSIAkJCSAyCQkvKiBOT1RFOiBpdCBnb2VzIDAsIDEsIDIsICohKiA4LCAxNiwgMzIsIC4uLiAqLwotI2RlZmluZSBPX0FQUEVORAkoMTw8IDMpCQkvKiBhcHBlbmQgKHdyaXRlcyBndWFyYW50ZWVkIGF0IHRoZSBlbmQpICovCi0jZGVmaW5lIE9fUlNSQyAJCSgxPDwgNCkJCS8qIE9wZW4gdGhlIHJlc291cmNlIGZvcmsgKi8KLSNkZWZpbmUgT19BTElBUwkJKDE8PCA1KQkJLyogT3BlbiBhbGlhcyBmaWxlICovCi0jZGVmaW5lIE9fQ1JFQVQJCSgxPDwgOCkJCS8qIE9wZW4gd2l0aCBmaWxlIGNyZWF0ZSAqLwotI2RlZmluZSBPX1RSVU5DCQkoMTw8IDkpCQkvKiBPcGVuIHdpdGggdHJ1bmNhdGlvbiAqLwotI2RlZmluZSBPX0VYQ0wgCQkoMTw8MTApIAkvKiB3LyBPX0NSRUFUOiAgRXhjbHVzaXZlICJjcmVhdGUtb25seSIgKi8KLSNkZWZpbmUgT19CSU5BUlkJKDE8PDExKSAJLyogT3BlbiBhcyBhIGJpbmFyeSBzdHJlYW0gKi8KLSNkZWZpbmUgT19OUkVTT0xWRQkoMTw8MTQpCQkvKiBEb24ndCByZXNvbHZlIGFueSBhbGlhc2VzICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqCQlmdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLWludCAgY2xvc2UoaW50KTsKLWludCAgY3JlYXQoY29uc3QgY2hhciopOwotaW50CSBkdXAoaW50IGZpbGVkZXMpOwkJLyogT0JTT0xFVEU6IGZjbnRsKGZpbGVkZXMsIEZfRFVQRkQsIDApIGlzIHByZWZlcnJlZCAqLwotaW50CSBmYWNjZXNzKGNoYXIqLCB1bnNpZ25lZCBpbnQsIGxvbmcqKTsKLWludCAgZmNudGwoaW50LCB1bnNpZ25lZCBpbnQsIGludCk7Ci1sb25nIGxzZWVrKGludCwgbG9uZywgaW50KTsKLWludCAgb3Blbihjb25zdCBjaGFyKiwgaW50LCAuLi4pOwotaW50ICByZWFkKGludCwgY2hhciosIHVuc2lnbmVkKTsKLWludCAgdW5saW5rKGNoYXIqKTsKLWludCAgd3JpdGUoaW50LCBjb25zdCBjaGFyKiwgdW5zaWduZWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKgotICogZmNudGwoKSBjb21tYW5kcwotICovCi0jZGVmaW5lIEZfRFVQRkQgMAkgICAvKiBEdXBsaWNhdGUgZmlsZXMgKGZpbGUgZGVzY3JpcHRvcikgKi8KLQotI2VuZGlmIF9fRkNOVExfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZ3JwLmggYi9pbmNsdWRlL21wdy9ncnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmMmM2YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9ncnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAic3lzL3R5cGVzLmgiCi0KLXN0cnVjdCBncm91cCB7Ci0gIGNoYXIgKmdyX25hbWU7Ci0gIGdpZF90IGdyX2dpZDsKLSAgY2hhciAqZ3JfcGFzc3dkOwotICBjaGFyICoqZ3JfbWVtOwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L21wdy5oIGIvaW5jbHVkZS9tcHcvbXB3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NzAyZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvbXB3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogTWFjIE1QVyBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zLiAqLwotCi0jaWZuZGVmCV9fSU5DTFVERV9NUFdfSAotI2RlZmluZSBfX0lOQ0xVREVfTVBXX0gKLQotI2lmbmRlZiBNUFcKLSNkZWZpbmUgTVBXCi0jZW5kaWYKLQotLyogTVBXIEMgaXMgYmFzaWNhbGx5IEFOU0ksIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBfX1NURENfXywKLSAgIG5vciBkb2VzIGl0IGFsbG93IF9fU1REQ19fIHRvIGJlICNkZWZpbmVkLiAqLwotCi0jaWZuZGVmIEFMTU9TVF9TVERDCi0jZGVmaW5lIEFMTU9TVF9TVERDCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLSNkZWZpbmUgSEFWRV9FUlJOT19IIDEKLQotI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLQotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotI2RlZmluZSBIQVZFX1NUREFSR19IIDEKLQotI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLQotI2luY2x1ZGUgPHVuaXguaD4KLQotI2Vsc2UKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0KLSNpZm5kZWYJT19BQ0NNT0RFCi0jZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKLSNlbmRpZgotCi0jaWZuZGVmIGZpbGVubwotI2RlZmluZSBmaWxlbm8oZnApICgoZnApLT5fZmlsZSkKLSNlbmRpZgotCi0vKiBzdGRpby5oIGRvZXMgbm90IGRlZmluZSB0aGlzIGlmIF9fU1REQ19fLCBzbyBkZWZpbmUgaGVyZS4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi1GSUxFICpmZG9wZW4oaW50IGZpbGRlcywgY29uc3QgY2hhciAqbW9kZSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFVTRV9NV19IRUFERVJTICovCi0KLS8qIEFkZCBlcnNhdHogZGVmaW5pdGlvbnMsIGZvciBzeXN0ZW1zIHRoYXQgbGFjayB0aGVtLiAgKi8KLQotI2lmbmRlZiBFSU8KLSNkZWZpbmUgRUlPIDk2Ci0jZW5kaWYKLSNpZm5kZWYgRU5PRU5UCi0jZGVmaW5lIEVOT0VOVCA5NwotI2VuZGlmCi0jaWZuZGVmIEVBQ0NFUwotI2RlZmluZSBFQUNDRVMgOTgKLSNlbmRpZgotI2lmbmRlZiBFTk9TWVMKLSNkZWZpbmUgRU5PU1lTIDk5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQotLyogQmluYXJ5IGZpbGVzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljczsgZm9yIGluc3RhbmNlLCBubyBjci9ubAotICAgdHJhbnNsYXRpb24uICovCi0KLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTgotCi0jaW5jbHVkZSA8c3Bpbi5oPgotCi0jaWZkZWYgTVBXX0MKLSN1bmRlZiAgX19QVFJfVE9fSU5UCi0jZGVmaW5lIF9fUFRSX1RPX0lOVChQKSAoKGludCkoUCkpCi0jdW5kZWYgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYgLyogTVBXX0MgKi8KLQotI2RlZmluZSBOT19GQ05UTAotCi1pbnQgZnN0YXQgKCk7Ci0KLUZJTEUgKm1wd19mb3BlbiAoKTsKLWludCBtcHdfZnNlZWsgKCk7Ci1pbnQgbXB3X2ZyZWFkICgpOwotaW50IG1wd19md3JpdGUgKCk7Ci1pbnQgbXB3X2FjY2VzcyAoKTsKLWludCBtcHdfb3BlbiAoKTsKLWludCBtcHdfY3JlYXQgKCk7Ci12b2lkIG1wd19hYm9ydCAodm9pZCk7Ci0KLS8qIE1hcCB0aGVzZSBzdGFuZGFyZCBmdW5jdGlvbnMgdG8gaW1wcm92ZWQgdmVyc2lvbnMgaW4gbGliaWJlcnR5LiAqLwotCi0jZGVmaW5lIGZvcGVuIG1wd19mb3BlbgotI2RlZmluZSBmc2VlayBtcHdfZnNlZWsKLSNkZWZpbmUgZnJlYWQgbXB3X2ZyZWFkCi0jZGVmaW5lIGZ3cml0ZSBtcHdfZndyaXRlCi0jZGVmaW5lIG9wZW4gbXB3X29wZW4KLSNkZWZpbmUgYWNjZXNzIG1wd19hY2Nlc3MKLSNkZWZpbmUgY3JlYXQgbXB3X2NyZWF0Ci0jZGVmaW5lIGFib3J0IG1wd19hYm9ydAotCi0jZGVmaW5lIFBPU0lYX1VUSU1FCi0KLSNkZWZpbmUgTE9TSU5HX1RPVEFMTFkKLQotLyogRGVmaW5lIHRoaXMgc28gdGhhdCBmaWxlcyB3aWxsIGJlIGNsb3NlZCBiZWZvcmUgYmVpbmcgdW5saW5rZWQuICovCi0KLSNkZWZpbmUgQ0xPU0VfQkVGT1JFX1VOTElOSwotCi0jZW5kaWYgLyogX19JTkNMVURFX01QV19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9wd2QuaCBiL2luY2x1ZGUvbXB3L3B3ZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRmYjcwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3B3ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfX3B3ZF9oCi0jZGVmaW5lIF9fcHdkX2gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1zdHJ1Y3QgcGFzc3dkIHsKLSAgY2hhciAqcHdfbmFtZTsKLSAgdWlkX3QgcHdfdWlkOwotICBnaWRfdCBwd19naWQ7Ci0gIGNoYXIgKnB3X2RpcjsKLSAgY2hhciAqcHdfc2hlbGw7Ci0gIGNoYXIgKnB3X3Bhc3N3ZDsKLX07Ci0KLSNlbmRpZiAvKiAhIF9fcHdkX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3NwaW4uaCBiL2luY2x1ZGUvbXB3L3NwaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDE0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zcGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBQcm9ncmVzcyBtYWNyb3MgdGhhdCB1c2UgU3BpbkN1cnNvciBpbiBNUFcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NQSU5fSAotI2RlZmluZSBfU1BJTl9ICi0KLS8qIEZvciBNUFcsIHByb2dyZXNzIG1hY3JvcyBqdXN0IG5lZWQgdG8gInNwaW4gdGhlIGN1cnNvciIgZnJlcXVlbnRseSwKLSAgIHByZWZlcmFibHkgc2V2ZXJhbCB0aW1lcyBwZXIgc2Vjb25kIG9uIGEgNjhLIE1hYy4gICovCi0KLS8qIEluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSdyZSBtZWV0aW5nIHRoZSBnb2FsLCBkZWZpbmUgdGhpcyBtYWNybwotICAgYW5kIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBvZiBzcGlubmluZyB3aWxsIGJlIGNvbGxlY3RlZCBhbmQKLSAgIGRpc3BsYXllZC4gICovCi0KLSNkZWZpbmUgU1BJTl9NRUFTVVJFTUVOVAotCi0jaW5jbHVkZSA8Q3Vyc29yQ3RsLmg+Ci0KLS8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIGxlbmd0aHkKLSAgIGFjdGl2aXR5LiAgU1RSIGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHksIHdoaWxlIE4KLSAgIGluZGljYXRlcyB0aGUgZXhwZWN0ZWQgZHVyYXRpb24sIGluIHVuc3BlY2lmaWVkIHVuaXRzLiAgSWYgTiBpcwotICAgemVybywgdGhlbiB0aGUgZXhwZWN0ZWQgdGltZSB0byBjb21wbGV0aW9uIGlzIHVua25vd24uICAqLwotCi0jdW5kZWYgU1RBUlRfUFJPR1JFU1MKLSNkZWZpbmUgU1RBUlRfUFJPR1JFU1MoU1RSLE4pIG1wd19zdGFydF9wcm9ncmVzcyAoU1RSLCBOLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi0vKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgb24gYQotICAgbGVuZ3RoeSBhY3Rpdml0eS4gICovCi0KLSN1bmRlZiBQUk9HUkVTUwotI2lmZGVmIFNQSU5fTUVBU1VSRU1FTlQKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChYLCBfX0ZJTEVfXywgX19MSU5FX18pOwotI2Vsc2UKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzIChYKTsKLSNlbmRpZiAKLQotLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIGxlbmd0aHkgYWN0aXZpdHkuCi0gICBTVFIgbXVzdCBtYXRjaCBhIFNUUiBwYXNzZWQgdG8gU1RBUlRfUFJPR1JFU1MgcHJldmlvdXNseS4gICovCi0KLSN1bmRlZiBFTkRfUFJPR1JFU1MKLSNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikgbXB3X2VuZF9wcm9ncmVzcyAoU1RSLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi1leHRlcm4gdm9pZCBtcHdfc3RhcnRfcHJvZ3Jlc3MgKGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci0KLWV4dGVybiB2b2lkIG1wd19wcm9ncmVzcyAoaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQsIGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X2VuZF9wcm9ncmVzcyAoY2hhciAqLCBjaGFyICosIGludCk7Ci0KLSNlbmRpZiAvKiBfU1BJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zdGF0LmggYi9pbmNsdWRlL21wdy9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4ZDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3RhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogVGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZGVmaW5lcyBhIHN0cnVjdCB0aGF0IGlzIHVzZWQgaW4gdGhlIHN0YXQoKSBhbmQKLSAqIGZzdGF0IGZ1bmN0aW9ucy4gIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdCBjb21lcyBmcm9tIHRoZSBpLW5vZGUgb2YKLSAqIHNvbWUgZmlsZS4gIFRoZXNlIGNhbGxzIGFyZSB0aGUgb25seSBhcHByb3ZlZCB3YXkgdG8gaW5zcGVjdCBpLW5vZGVzLgotICovCi0KLSNpZm5kZWYgX1NUQVRfSAotI2RlZmluZSBfU1RBVF9ICi0KLSNpZm5kZWYgX1RZUEVTX0gJCS8qIG5vdCBxdWl0ZSByaWdodCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3Qgc3RfZGV2OwkJCS8qIG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgKi8KLSAgaW5vX3Qgc3RfaW5vOwkJCS8qIGktbm9kZSBudW1iZXIgKi8KLSAgbW9kZV90IHN0X21vZGU7CQkvKiBmaWxlIG1vZGUsIHByb3RlY3Rpb24gYml0cywgZXRjLiAqLwotICBzaG9ydCBpbnQgc3Rfbmxpbms7CQkvKiAjIGxpbmtzOyBURU1QT1JBUlkgSEFDSzogc2hvdWxkIGJlIG5saW5rX3QqLwotICB1aWRfdCBzdF91aWQ7CQkJLyogdWlkIG9mIHRoZSBmaWxlJ3Mgb3duZXIgKi8KLSAgc2hvcnQgaW50IHN0X2dpZDsJCS8qIGdpZDsgVEVNUE9SQVJZIEhBQ0s6IHNob3VsZCBiZSBnaWRfdCAqLwotICBkZXZfdCBzdF9yZGV2OwotICBvZmZfdCBzdF9zaXplOwkJLyogZmlsZSBzaXplICovCi0gIHRpbWVfdCBzdF9hdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgdGltZV90IHN0X210aW1lOwkJLyogdGltZSBvZiBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uICovCi0gIHRpbWVfdCBzdF9jdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBmaWxlIHN0YXR1cyBjaGFuZ2UgKi8KLX07Ci0KLS8qIFRyYWRpdGlvbmFsIG1hc2sgZGVmaW5pdGlvbnMgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSUZNVCAgMDE3MDAwMAkJLyogdHlwZSBvZiBmaWxlICovCi0jZGVmaW5lIFNfSUZSRUcgMDEwMDAwMAkJLyogcmVndWxhciAqLwotI2RlZmluZSBTX0lGQkxLIDAwNjAwMDAJCS8qIGJsb2NrIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkRJUiAwMDQwMDAwICAJLyogZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSUZDSFIgMDAyMDAwMAkJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRklGTyAwMDEwMDAwCQkvKiB0aGlzIGlzIGEgRklGTyAqLwotI2RlZmluZSBTX0lTVUlEIDAwMDQwMDAJCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTX0lTR0lEIDAwMDIwMDAJCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KLQkJCQkvKiBuZXh0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0jZGVmaW5lIFNfSVNWVFggICAwMTAwMAkJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KLQotLyogUE9TSVggbWFza3MgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSVJXWFUgICAwMDcwMAkJLyogb3duZXI6ICByd3gtLS0tLS0gKi8KLSNkZWZpbmUgU19JUlVTUiAgIDAwNDAwCQkvKiBvd25lcjogIHItLS0tLS0tLSAqLwotI2RlZmluZSBTX0lXVVNSICAgMDAyMDAJCS8qIG93bmVyOiAgLXctLS0tLS0tICovCi0jZGVmaW5lIFNfSVhVU1IgICAwMDEwMAkJLyogb3duZXI6ICAtLXgtLS0tLS0gKi8KLQotI2RlZmluZSBTX0lSV1hHICAgMDAwNzAJCS8qIGdyb3VwOiAgLS0tcnd4LS0tICovCi0jZGVmaW5lIFNfSVJHUlAgICAwMDA0MAkJLyogZ3JvdXA6ICAtLS1yLS0tLS0gKi8KLSNkZWZpbmUgU19JV0dSUCAgIDAwMDIwCQkvKiBncm91cDogIC0tLS13LS0tLSAqLwotI2RlZmluZSBTX0lYR1JQICAgMDAwMTAJCS8qIGdyb3VwOiAgLS0tLS14LS0tICovCi0KLSNkZWZpbmUgU19JUldYTyAgIDAwMDA3CQkvKiBvdGhlcnM6IC0tLS0tLXJ3eCAqLwotI2RlZmluZSBTX0lST1RIICAgMDAwMDQJCS8qIG90aGVyczogLS0tLS0tci0tICovIAotI2RlZmluZSBTX0lXT1RIICAgMDAwMDIJCS8qIG90aGVyczogLS0tLS0tLXctICovCi0jZGVmaW5lIFNfSVhPVEggICAwMDAwMQkJLyogb3RoZXJzOiAtLS0tLS0tLXggKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgdGVzdCBzdF9tb2RlIChmcm9tIFBPU0lYIFNlYy4gNS42LjEuMS4gKi8KLSNkZWZpbmUgU19JU1JFRyhtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZSRUcpCS8qIGlzIGEgcmVnIGZpbGUgKi8KLSNkZWZpbmUgU19JU0RJUihtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZESVIpCS8qIGlzIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSVNDSFIobSkJKChtICYgU19JRk1UKSA9PSBTX0lGQ0hSKQkvKiBpcyBhIGNoYXIgc3BlYyAqLwotI2RlZmluZSBTX0lTQkxLKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkJMSykJLyogaXMgYSBibG9jayBzcGVjICovCi0jZGVmaW5lIFNfSVNGSUZPKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRklGTykJLyogaXMgYSBwaXBlL0ZJRk8gKi8KLQotCi0vKiBGdW5jdGlvbiBQcm90b3R5cGVzLiAqLwotI2lmbmRlZiBfQU5TSV9ICi0jaW5jbHVkZSA8YW5zaS5oPgotI2VuZGlmCi0KLV9QUk9UT1RZUEUoIGludCBjaG1vZCwgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBmc3RhdCwgKGludCBfZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZGlyLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZmlmbywgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBzdGF0ICwgKGNvbnN0IGNoYXIgKl9wYXRoLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCSk7Ci1fUFJPVE9UWVBFKCBtb2RlX3QgdW1hc2ssIChpbnQgX2NtYXNrKQkJCQkJKTsKLQotI2VuZGlmIC8qIF9TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmggYi9pbmNsdWRlL21wdy9zeXMvZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3BhcmFtLmggYi9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhOGMxNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvcmVzb3VyY2UuaCBiL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk0MzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9fU1lTX1JFU09VUkNFX0hfXwotI2RlZmluZSBfX1NZU19SRVNPVVJDRV9IX18KLQotc3RydWN0IHJ1c2FnZSB7Ci0gIHN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOwotICBzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsKLX07Ci0KLSNlbmRpZiAvKiBfX1NZU19SRVNPVVJDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmggYi9pbmNsdWRlL21wdy9zeXMvc3RhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVjNzJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3N0YXQuaC4gKi8KLQotI2lmbmRlZiBfX1NZU19TVEFUX0hfXwotI2RlZmluZSBfX1NZU19TVEFUX0hfXwotCi0jaW5jbHVkZSAgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgIDx0aW1lLmg+Ci0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3QgICBzdF9kZXY7Ci0gIGlub190ICAgc3RfaW5vOwotICBtb2RlX3QgIHN0X21vZGU7Ci0gIHNob3J0ICAgc3Rfbmxpbms7Ci0gIHVpZF90ICAgc3RfdWlkOwotICBnaWRfdCAgIHN0X2dpZDsKLSAgZGV2X3QgICBzdF9yZGV2OwotICBvZmZfdCAgIHN0X3NpemU7Ci0gIG9mZl90ICAgc3RfcnNpemU7Ci0gIHRpbWVfdCAgc3RfYXRpbWU7Ci0gIGludCAgICAgc3Rfc3BhcmUxOwotICB0aW1lX3QgIHN0X210aW1lOwotICBpbnQgICAgIHN0X3NwYXJlMjsKLSAgdGltZV90ICBzdF9jdGltZTsKLSAgaW50ICAgICBzdF9zcGFyZTM7Ci0gIGxvbmcgICAgc3RfYmxrc2l6ZTsKLSAgbG9uZyAgICBzdF9ibG9ja3M7Ci0gIGxvbmcgICAgc3Rfc3BhcmU0WzJdOwotfTsKLQotI2RlZmluZSBTX0lGTVQJMDE3MDAwMEwKLSNkZWZpbmUgU19JRkRJUgkwMDQwMDAwTAotI2RlZmluZSBTX0lGUkVHIDAxMDAwMDBMCi0jZGVmaW5lIFNfSVJFQUQgICAgMDQwMAotI2RlZmluZSBTX0lXUklURSAgIDAyMDAKLSNkZWZpbmUgU19JRVhFQyAgICAwMTAwCi0KLSNkZWZpbmUgU19JRklGTyAwMTAwMDAgIC8qIEZJRk8gc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGQ0hSIDAyMDAwMCAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkJMSyAwMzAwMDAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KLQotaW50IHN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpOwotaW50IGZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpOwotCi0jZW5kaWYgLyogX19TWVNfU1RBVF9IX19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNDg1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90aW1lLmguICovCi0KLSNpZm5kZWYgX19TWVNfVElNRV9IX18KLSNkZWZpbmUgX19TWVNfVElNRV9IX18KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotc3RydWN0IHRpbWV2YWwgewotICBsb25nIHR2X3NlYzsKLSAgbG9uZyB0dl91c2VjOwotfTsKLQotI2VuZGlmIC8qIF9fU1lTX1RJTUVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdHlwZXMuaCBiL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q5YzlmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90eXBlcy5oLiAqLwotCi0jaWZuZGVmIF9fU1lTX1RZUEVTX0hfXwotI2RlZmluZSBfX1NZU19UWVBFU19IX18KLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0KLXR5cGVkZWYgc2hvcnQgZGV2X3Q7Ci10eXBlZGVmIHNob3J0IGlub190OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtb2RlX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBnaWRfdDsKLXR5cGVkZWYgbG9uZyBvZmZfdDsKLQotI2VuZGlmIC8qIF9fU1lTX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvdXRpbWUuaCBiL2luY2x1ZGUvbXB3L3V0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmY2NmYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3V0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotc3RydWN0IHV0aW1idWYgewotICB0aW1lX3QgYWN0aW1lOwotICB0aW1lX3QgbW9kdGltZTsKLX07Ci0KLWludCB1dGltZSAoY2hhciAqLCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaCBiL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiOWU0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy92YXJhcmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qIHZhcmFyZ3MuaC4gKi8KLSNpZm5kZWYgX192YV9saXN0X18KLSNkZWZpbmUgX192YV9saXN0X18KLXR5cGVkZWYgY2hhciAqdmFfbGlzdDsKLSNlbmRpZgotI2RlZmluZSB2YV9kY2wgaW50IHZhX2FsaXN0OwotI2RlZmluZSB2YV9zdGFydChsaXN0KSBsaXN0ID0gKGNoYXIgKikgJnZhX2FsaXN0Ci0jZGVmaW5lIHZhX2VuZChsaXN0KQotI2RlZmluZSB2YV9hcmcobGlzdCxtb2RlKSAoKG1vZGUgKikobGlzdCArPSBzaXplb2YobW9kZSkpKVstMV0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL0NoYW5nZUxvZyBiL2luY2x1ZGUvbmxtL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYTNkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1GcmkgTWF5ICA2IDEzOjMxOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAobmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKSk6IEFkZCBsZW5ndGgsCi0JZGF0YU9mZnNldCwgYW5kIGRhdGFTdGFtcCBmaWVsZC4KLQkobmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpOiBSZW1vdmUuCi0JKiBpbnRlcm5hbC5oIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcik6IEFkZCBoZHJMZW5ndGgsCi0JZGF0YU9mZnNldCwgZGF0YVN0YW1wIGFuZCBoZHIgZmllbGRzLgotCi1GcmkgQXByIDIyIDExOjEyOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIpKTogUmVuYW1lCi0JZnJvbSBubG1OQU1FKGV4dGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlcikuICBDaGFuZ2Ugc3RhbXAgZmllbGQKLQl0byA4IGJ5dGVzLiAgQWRkIGJ5dGVzIGZpZWxkLgotCSogaW50ZXJuYWwuaCAobmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20KLQlubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyLiAgQ2hhbmdlIHN0YW1wIGZpZWxkIHRvIDgKLQlieXRlcy4KLQotVGh1IEFwciAyMSAxMTo1NzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKTogRGVmaW5lLgotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKToKLQlEZWZpbmUuCi0KLVdlZCBBcHIgMjAgMTQ6Mjc6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIpOiBSZW1vdmUKLQlkZWJ1Z1JlY09mZnNldCBhbmQgZGVidWdSZWNMZW5ndGggZmllbGRzLiAgQWRkIGRhdGEgZmllbGQuCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKSk6IFJlbW92ZQotCWRlYnVnUmVjT2Zmc2V0IGFuZCBkZWJ1Z1JlY0xlbmd0aCBmaWVsZHMuCi0KLU1vbiBGZWIgIDcgMDg6Mjg6NDAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVRodSBEZWMgIDIgMTQ6MTQ6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1leHQuaDogTmV3IGZpbGUgZGVzY3JpYmluZyBmb3JtYXRzIG9mIGluZm9ybWF0aW9uIGluIEFscGhhCi0JTmV0V2FyZSBmaWxlcy4KLQkqIGNvbW1vbi5oOiBEZWZpbmUgc29tZSBub24tZXh0ZXJuYWwgQWxwaGEgaW5mb3JtYXRpb24uCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmg6IERvbid0IGRlZmluZSBleHRlcm5hbF9maXhlZF9oZWFkZXIgaGVyZS4KLQkqIGkzODYtZXh0LmgsIHNwYXJjMzItZXh0Lmg6IE5ldyBoZWFkZXIgZmlsZXMgdG8gZGVmaW5lCi0JZXh0ZXJuYWxfZml4ZWRfaGVhZGVyIGZvciBwYXJ0aWN1bGFyIENQVSdzLgotCi1XZWQgT2N0IDI3IDExOjQ1OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcik6IEFkZGVkIGZpZWxkcwotCXNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0IGFuZCBzaGFyZWREZWJ1Z1JlY29yZENvdW50LgotCSogZXh0ZXJuYWwuaCAoTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKTogTGlrZXdpc2UuCi0KLQkqIGNvbW1vbi5oIChOTE1fU0lHTkFUVVJFKTogRG8gbm90IGRlZmluZSAoaXQncyBkaWZmZXJlbnQgZm9yIGVhY2gKLQliYWNrZW5kKS4KLQotVHVlIEF1ZyAzMSAxMzoyNDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBsZW5ndGggZmllbGRzIG9mIHR5cGUgY2hhciB0byB0eXBlIHVuc2lnbmVkCi0JY2hhci4KLQotU2F0IEp1bCAzMSAwMjoxMjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChOTE1fSElCSVQsIE5MTV9IRUFERVJfVkVSU0lPTik6IERlZmluZS4KLQotVGh1IEp1bCAyMiAxNjowOTo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKE5MTV9DQVQqLCBOTE1fQVJDSF9TSVpFLCBOTE1fVEFSR0VUX0xPTkdfU0laRSwKLQlOTE1fVEFSR0VUX0FERFJFU1NfU0laRSwgTkxNX05BTUUsIE5sbU5BTUUsIG5sbU5BTUUpOiAgTmV3Ci0JbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoVEFSR0VUX0xPTkdfU0laRSwgVEFSR0VUX0FERFJFU1NfU0laRSk6IFJlbW92ZQotCW1hY3JvcywgY29udmVydCB1c2FnZXMgdG8gTkxNXyBlcXVpdmFsZW50cy4KLQkqIGV4dGVybmFsLmg6ICBVc2UgbmxtTkFNRSBhbmQgTmxtTkFNRSBtYWNyb3MgdG8gZGVyaXZlIGJvdGgKLQkzMiBhbmQgNjQgYml0IHZlcnNpb25zLgotCi1Nb24gSnVsIDE5IDIyOjEyOjQwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiAoY29tbW9uLmgsIGV4dGVybmFsLmgsIGludGVybmFsLmgpOiAgTmV3IGZpbGVzIGZvciBOTE0vTmV0V2FyZQotCXN1cHBvcnQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2FscGhhLWV4dC5oIGIvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTk5ZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQWxwaGEgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbiBBbHBoYSBOTE0gc3RhcnRzIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgotewotICAvKiBNYWdpYyBudW1iZXIuICBNdXN0IGJlIE5MTTMyX0FMUEhBX01BR0lDLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKLSAgLyogRm9ybWF0IGRlc2NyaXB0b3IuICBDdXJyZW50IHZhbHVlIGlzIDIuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLSAgLyogU2l6ZSBvZiBwcmVmaXggaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplWzRdOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciBwYWQxWzRdOwotICAvKiBNb3JlIGZpZWxkcyBtYXkgYmUgYWRkZWQgbGF0ZXIsIHN1cHBvc2VkbHkuICAqLwotfTsKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCi0gICBBbHBoYSBFQ09GRiByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYwotewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkIG9mIGEgcmVsb2MuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2NvbW1vbi5oIGIvaW5jbHVkZS9ubG0vY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU1MGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgTkxNX0NBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMKLSAgIHByZXByb2Nlc3NvcnMuICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgb3IgIjY0XyIgYXJlIG5vdCBhIHZhbGlkCi0gICBwcmVwcm9jZXNzaW5nIHRva2VucywgYW5kIHdlIGRvbid0IHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sCi0gICAibmxtXzMyXyIpLiAgVGhlIFhOTE1fQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZSBpbm5lciBOTE1fQ0FUIG1hY3JvcwotICAgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLiAgVGhlbiB0aGUKLSAgIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotCi0jaWZkZWYgU0FCRVIKLSMgIGRlZmluZSBOTE1fQ0FUKGEsYikJCWEjI2IKLSMgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYSMjYiMjYwotIyAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jICBpZmRlZiBfX1NURENfXwotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEjI2IKLSMgICAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCi0jICAgIGRlZmluZSBYTkxNX0NBVDIoYSxiKQlOTE1fQ0FUKGEsYikKLSMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCVhOTE1fQ0FUMihOTE1fQ0FUKGEsYiksTkxNX0NBVChjLGQpKQotIyAgZWxzZQotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEvKiovYgotIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEvKiovYi8qKi9jCi0jICAgIGRlZmluZSBOTE1fQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIElmIE5MTV9BUkNIX1NJWkUgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgdG8gMzIuICBOTE1fQVJDSF9TSVpFIGlzCi0gICBvcHRpb25hbGx5IGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAqLwotCi0jaWZuZGVmIE5MTV9BUkNIX1NJWkUKLSMgIGRlZmluZSBOTE1fQVJDSF9TSVpFCQkJMzIKLSNlbmRpZgotCi0jaWYgTkxNX0FSQ0hfU0laRSA9PSAzMgotIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk0Ci0jICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJNAotIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDMyLF8seSkKLSMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCAzMSkKLSNlbmRpZgotI2lmIE5MTV9BUkNIX1NJWkUgPT0gNjQKLSMgIGRlZmluZSBOTE1fVEFSR0VUX0xPTkdfU0laRQkJOAotIyAgZGVmaW5lIE5MTV9UQVJHRVRfQUREUkVTU19TSVpFCTgKLSMgIGRlZmluZSBOTE1fTkFNRSh4LHkpCQkJTkxNX0NBVDQoeCw2NCxfLHkpCi0jICBkZWZpbmUgTkxNX0hJQklUCQkJKCgoYmZkX3ZtYSkgMSkgPDwgNjMpCi0jZW5kaWYKLQotI2RlZmluZSBObG1OQU1FKFgpCQlOTE1fTkFNRShObG0sWCkKLSNkZWZpbmUgbmxtTkFNRShYKQkJTkxNX05BTUUobmxtLFgpCi0KLS8qIEdpdmUgbmFtZXMgdG8gdGhpbmdzIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2UuICovCi0KLSNkZWZpbmUgTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEgJCTEyNwotI2RlZmluZSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAkJNzEKLSNkZWZpbmUgTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgJCTcxCi0jZGVmaW5lIE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RICTI1NQotI2RlZmluZSBOTE1fT1RIRVJfREFUQV9MRU5HVEggCQkJNDAwCQkvKiBGSVhNRSAqLwotI2RlZmluZSBOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSAkJNQotI2RlZmluZSBOTE1fU0lHTkFUVVJFX1NJWkUJCQkyNAotI2RlZmluZSBOTE1fSEVBREVSX1ZFUlNJT04JCQk0Ci0jZGVmaW5lIE5MTV9NT0RVTEVfTkFNRV9TSVpFCQkJMTQKLSNkZWZpbmUgTkxNX0RFRkFVTFRfU1RBQ0tTSVpFCQkJKDggKiAxMDI0KQotDAotLyogQWxwaGEgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIEFscGhhCi0gICBoZWFkZXIgZmlsZSwgYnV0IGl0IGNhbid0IGdvIGluIGFscGhhLWV4dC5oIGJlY2F1c2Ugc29tZSBvZiBpdCBpcwotICAgbmVlZGVkIGJ5IG5sbWNvbnYuYy4gICovCi0KLS8qIE1hZ2ljIG51bWJlciBpbiBBbHBoYSBwcmVmaXggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTkxNMzJfQUxQSEFfTUFHSUMgKDB4ODM1NjE4NDApCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYW4gQWxwaGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DICAgICAgMjUwCi0KLS8qIEEgbG9jYWwgcmVsb2MsIG90aGVyIHRoYW4gQUxQSEFfUl9HUERJU1Agb3IgQUxQSEFfUl9JR05PUkUsIG11c3QgYmUKLSAgIGFnYWluc3Qgb25lIG9mIHRoZXNlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBCTMKLQotLyogQW4gQUxQSEFfUl9OV19SRUxPQyBoYXMgb25lIG9mIHRoZXNlIHZhbHVlcyBpbiB0aGUgc2l6ZSBmaWVsZC4gIElmCi0gICBpdCBpcyBTRVRHUCwgdGhlIHJfdmFkZHIgZmllbGQgaG9sZHMgdGhlIEdQIHZhbHVlIHRvIHVzZS4gIElmIGl0IGlzCi0gICBMSVRBLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgLmxpdGEgc2VjdGlvbiBhbmQKLSAgIHRoZSByX3N5bW5keCBmaWVsZCBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfU0VUR1AJMQotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DX0xJVEEJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2V4dGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3N2E1YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLQotICAgTm90ZSB0aGF0IGFuIE5MTSBoZWFkZXIgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6Ci0KLSAgICgxKQlBIGZpeGVkIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIG9mIGtub3duIGxlbmd0aCwKLQlhdCBzcGVjaWZpYyBvZmZzZXRzIGluIHRoZSBmaWxlLiAKLQotICAgKDIpICBBIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIGluIGEgc3BlY2lmaWMKLSAgICAgICAgb3JkZXIsIGJ1dCBzb21lIGZpZWxkcyBtYXkgYmUgdmFyaWFibGUgbGVuZ3RoLgotCi0gICAoMykJQSBhdXhpbGlhcnkgaGVhZGVyIHRoYXQgaGFzIHZhcmlvdXMgb3B0aW9uYWwgZmllbGRzIGluIG5vIHNwZWNpZmljCi0gICAgICAgIG9yZGVyLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGlkZW50aWZ5IHRoZSBlbmQgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzCi0JZXhjZXB0IGJ5IGZpbmRpbmcgYSBoZWFkZXIgd2l0aG91dCBhIHJlY29nbml6ZWQgJ3N0YW1wJy4KLQotICAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgZml4ZWQgbGVuZ3RoIGhlYWRlciB1bmZvcnR1bmF0ZWx5IHZhcmllcwotICAgZnJvbSBvbmUgTkxNIHRhcmdldCB0byBhbm90aGVyLCBkdWUgdG8gcGFkZGluZy4gIEVhY2ggdGFyZ2V0Ci0gICBkZWZpbmVzIHRoZSBjb3JyZWN0IGV4dGVybmFsIGZvcm1hdCBpbiBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgotCi0qLwotICAgCi0vKiBOTE0gSGVhZGVyICovCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfdmVyc2lvbl9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJWZVJzSW9OIyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1pbm9yVmVyc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXZpc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciB5ZWFyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1vbnRoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGRheVtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9WZXJzaW9uX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbMTBdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aFsxXTsKLQotICAvKiBUaGVyZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBmaWVsZCBoZXJlIGNhbGxlZCAnY29weXJpZ2h0TWVzc2FnZScKLSAgICAgdGhhdCBpcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieSBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLiAqLwotCi19IE5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9leHRlbmRlZF9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbOF07Ci0KLSAgdW5zaWduZWQgY2hhciBsYW5ndWFnZUlEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBSUENEYXRhT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFJQQ0RhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkQ29kZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRDb2RlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRQdWJsaWNzT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFB1YmxpY3NDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZENvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0W05MTV9UQVJHRVRfQUREUkVTU19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXRbTkxNX1RBUkdFVF9BRERSRVNTX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHJvZHVjdElEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDFbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkM1tOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ1W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotfSBObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ3VTdEhlQWQiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLQotICAvKiBMZW5ndGggb2YgdGhpcyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogT2Zmc2V0IHRvIGRhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBTdGFtcCBmb3IgdGhpcyBjdXN0b21lciBoZWFkZXItLXdlIHJlY29nbml6ZSAiQ3lHblVzRXgiLiAgKi8KLSAgY2hhciBkYXRhU3RhbXBbOF07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmggYi9pbmNsdWRlL25sbS9pMzg2LWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNhZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfaTM4Nl9leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdkYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGRlc2NyaWJlIGhvdyBOTE0gaXMgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiB0aGUgQkZEIGxpYnJhcnkuCi0gICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLSAgIAotI2lmIDAKLQotLyogVHlwZXMgdXNlZCBieSB2YXJpb3VzIHN0cnVjdHVyZXMsIGZ1bmN0aW9ucywgZXRjLiAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfQWRkcjsJLyogVW5zaWduZWQgcHJvZ3JhbSBhZGRyZXNzICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfT2ZmOwkvKiBVbnNpZ25lZCBmaWxlIG9mZnNldCAqLwotdHlwZWRlZiAJIGxvbmcJTmxtMzJfU3dvcmQ7CS8qIFNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfV29yZDsJLyogVW5zaWduZWQgbGFyZ2UgaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlObG0zMl9IYWxmOwkvKiBVbnNpZ25lZCBtZWRpdW0gaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCU5sbTMyX0NoYXI7CS8qIFVuc2lnbmVkIHRpbnkgaW50ZWdlciAqLwotCi0jaWZkZWYgQkZEX0hPU1RfNjRfQklUCi10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9BZGRyOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfT2ZmOwotdHlwZWRlZiAgICAgICAgICBCRkRfSE9TVF82NF9CSVQJTmxtNjRfU3h3b3JkOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfWHdvcmQ7Ci0jZW5kaWYKLXR5cGVkZWYgICAgICAgICAgbG9uZwkJTmxtNjRfU3dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCU5sbTY0X1dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlObG02NF9IYWxmOwotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZm9ybSBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgTkxNCi0gICBoZWFkZXIgdGhhdCBpcyBmaXhlZCBsZW5ndGguICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICBsb25nIHZlcnNpb247Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbi4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICBjaGFyIG1vZHVsZU5hbWVbTkxNX01PRFVMRV9OQU1FX1NJWkVdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICBmaWxlX3B0ciBjb2RlSW1hZ2VPZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY29kZUltYWdlU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgZmlsZV9wdHIgZGF0YUltYWdlT2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICBiZmRfc2l6ZV90eXBlIGRhdGFJbWFnZVNpemU7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgYmZkX3NpemVfdHlwZSB1bmluaXRpYWxpemVkRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgZmlsZV9wdHIgY3VzdG9tRGF0YU9mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY3VzdG9tRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICBmaWxlX3B0ciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICBsb25nIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0KLSAgZmlsZV9wdHIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0OwotICBsb25nIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgZmlsZV9wdHIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0OwotICBsb25nIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICBmaWxlX3B0ciBwdWJsaWNzT2Zmc2V0OwotICBsb25nIG51bWJlck9mUHVibGljczsKLSAgZmlsZV9wdHIgZGVidWdJbmZvT2Zmc2V0OwotICBsb25nIG51bWJlck9mRGVidWdSZWNvcmRzOwotICBmaWxlX3B0ciBjb2RlU3RhcnRPZmZzZXQ7Ci0gIGZpbGVfcHRyIGV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGZpbGVfcHRyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0OwotICBsb25nIG1vZHVsZVR5cGU7Ci0gIGxvbmcgZmxhZ3M7Ci19IE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHBvcnRpb25zIG9mIHRoZSBOTE0gaGVhZGVyIHRoYXQgYXJlIGVpdGhlcgotICAgdmFyaWFibGUgaW4gc2l6ZSBpbiB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24sIG9yIGVsc2UgYXJlIG5vdCBhdCBhCi0gICBmaXhlZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBOTE0gaGVhZGVyIGR1ZSB0byBwcmVjZWRpbmcKLSAgIHZhcmlhYmxlIHNpemVkIGZpZWxkcy4KLQotICAgTm90ZSB0aGF0IGFsbCB0aGUgZmllbGRzIG11c3QgZXhpc3QgaW4gdGhlIGV4dGVybmFsIGhlYWRlciwgYW5kIGluCi0gICB0aGUgb3JkZXIgdXNlZCBoZXJlICh0aGUgc2FtZSBvcmRlciBpcyB1c2VkIGluIHRoZSBpbnRlcm5hbCBmb3JtCi0gICBmb3IgY29uc2lzdGVuY3ksIG5vdCBvdXQgb2YgbmVjZXNzaXR5KS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlcgotewotCi0gIC8qIFRoZSBkZXNjcmlwdGlvbkxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluCi0gICAgIGRlc2NyaXB0aW9uVGV4dCwgZXhjbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0Ci0gICAgIGZpZWxkIGNvbnRhaW5zIHRoZSBOTE0gZGVzY3JpcHRpb24gb2J0YWluZWQgZnJvbSB0aGUgREVTQ1JJUFRJT04KLSAgICAga2V5d29yZCBpbiBOTE1MSU5LIHBsdXMgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlIGRlc2NyaXB0aW9uVGV4dAotICAgICBjYW4gYmUgdXAgdG8gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggY2hhcmFjdGVycy4gKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgZGVzY3JpcHRpb25MZW5ndGg7Ci0gIGNoYXIgZGVzY3JpcHRpb25UZXh0W05MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIICsgMV07Ci0KLSAgLyogVGhlIHN0YWNrU2l6ZSBmaWVsZCBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgaW4gYnl0ZXMsIGFzCi0gICAgIHNwZWNpZmllZCBieSB0aGUgU1RBQ0sgb3IgU1RBQ0tTSVpFIGtleXdvcmQgaW4gTkxNTElOSy4gIElmIG5vIHNpemUKLSAgICAgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBOTE1fREVGQVVMVF9TVEFDS1NJWkUuICovCi0gICAgIAotICBsb25nIHN0YWNrU2l6ZTsKLQotICAvKiBUaGUgcmVzZXJ2ZWQgZmllbGQgaXMgaW5jbHVkZWQgb25seSBmb3IgY29tcGxldGVuZXNzLiAgSXQgc2hvdWxkIGNvbnRhaW4KLSAgICAgemVyby4gKi8KLQotICBsb25nIHJlc2VydmVkOwotCi0gIC8qIFRoaXMgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBzaG91bGQgY29udGFpbiAiIExPTkciIChub3RlIGxlYWRpbmcKLSAgICAgc3BhY2UpLCBhbmQgaXMgdW51c2VkLiAqLwotCi0gIGNoYXIgb2xkVGhyZWFkTmFtZVtOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSF07Ci0KLSAgLyogVGhlIHNjcmVlbk5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCi0gICAgIGluIHRoZSBzY3JlZW5OYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCi0gICAgIHNjcmVlbk5hbWUgZmllbGQgY29udGFpbnMgdGhlIHNjcmVlbiBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgU0NSRUVOTkFNRQotICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgKLSAgICAgY2hhcmFjdGVycy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNjcmVlbk5hbWVMZW5ndGg7Ci0gIGNoYXIgc2NyZWVuTmFtZVtOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCArIDFdOwotCi0gIC8qIFRoZSB0aHJlYWROYW1lTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGFjdHVhbCB0ZXh0IHN0b3JlZAotICAgICBpbiB0aGUgdGhyZWFkTmFtZSBmaWVsZCwgZXhjbHVkaW5nIHRoZSBudWxsIGJ5dGUgdGVybWluYXRvci4gIFRoZQotICAgICB0aHJlYWROYW1lIGZpZWxkIGNvbnRhaW5zIHRoZSB0aHJlYWQgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIFRIUkVBRE5BTUUKLSAgICAga2V5d29yZCBpbiBOTE1MSU5LLCBhbmQgY2FuIGJlIHVwIHRvIE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RICi0gICAgIGNoYXJhY3RlcnMuICovCi0KLSAgdW5zaWduZWQgY2hhciB0aHJlYWROYW1lTGVuZ3RoOwotICBjaGFyIHRocmVhZE5hbWVbTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEggKyAxXTsKLQotfSBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIlZlUnNJb04jIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIGxvbmcgbWFqb3JWZXJzaW9uOwotICBsb25nIG1pbm9yVmVyc2lvbjsKLSAgbG9uZyByZXZpc2lvbjsKLSAgbG9uZyB5ZWFyOwotICBsb25nIG1vbnRoOwotICBsb25nIGRheTsKLX0gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZlcnNpb25faGVhZGVyIG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkNvUHlSaUdoVD0iIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFsxMF07Ci0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aDsKLSAgY2hhciBjb3B5cmlnaHRNZXNzYWdlW05MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIXTsKLX0gTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIgbmxtX2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiTWVTc0FnRXMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLSAgbG9uZyBsYW5ndWFnZUlEOwotICBmaWxlX3B0ciBtZXNzYWdlRmlsZU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBtZXNzYWdlRmlsZUxlbmd0aDsKLSAgbG9uZyBtZXNzYWdlQ291bnQ7Ci0gIGZpbGVfcHRyIGhlbHBGaWxlT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGhlbHBGaWxlTGVuZ3RoOwotICBmaWxlX3B0ciBSUENEYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIFJQQ0RhdGFMZW5ndGg7Ci0gIGZpbGVfcHRyIHNoYXJlZENvZGVPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgc2hhcmVkQ29kZUxlbmd0aDsKLSAgZmlsZV9wdHIgc2hhcmVkRGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaGFyZWREYXRhTGVuZ3RoOwotICBmaWxlX3B0ciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0OwotICBsb25nIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZFB1YmxpY3NPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUHVibGljc0NvdW50OwotICBmaWxlX3B0ciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldDsKLSAgbG9uZyBzaGFyZWREZWJ1Z1JlY29yZENvdW50OwotICBiZmRfdm1hIFNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0OwotICBiZmRfdm1hIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGxvbmcgcHJvZHVjdElEOwotICBsb25nIHJlc2VydmVkMDsKLSAgbG9uZyByZXNlcnZlZDE7Ci0gIGxvbmcgcmVzZXJ2ZWQyOwotICBsb25nIHJlc2VydmVkMzsKLSAgbG9uZyByZXNlcnZlZDQ7Ci0gIGxvbmcgcmVzZXJ2ZWQ1OwotfSBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0KLS8qIFRoZSBmb3JtYXQgb2YgYSBjdXN0b20gaGVhZGVyIGFzIHN0b3JlZCBpbnRlcm5hbGx5IGlzIGRpZmZlcmVudAotICAgZnJvbSB0aGUgZXh0ZXJuYWwgZm9ybWF0LiAgVGhpcyBpcyBob3cgd2Ugc3RvcmUgYSBjdXN0b20gaGVhZGVyCi0gICB3aGljaCB3ZSBkbyBub3QgcmVjb2duaXplLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDdVN0SGVBZCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLSAgZmlsZV9wdHIgZGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotICBjaGFyIGRhdGFTdGFtcFs4XTsKLSAgUFRSIGhkcjsKLX0gTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2N1c3RvbV9oZWFkZXIgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3VzdG9tX0hlYWRlciBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcgotCi0vKiBUaGUgaW50ZXJuYWwgQ3lnbnVzIGhlYWRlciBpcyB3cml0dGVuIG91dCBleHRlcm5hbGx5IGFzIGEgY3VzdG9tCi0gICBoZWFkZXIuICBXZSBkb24ndCB0cnkgdG8gcmVwbGljYXRlIHRoYXQgc3RydWN0dXJlIGhlcmUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDeUduVXNFeCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICAvKiBGaWxlIGxvY2F0aW9uIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGZpbGVfcHRyIG9mZnNldDsKLSAgLyogTGVuZ3RoIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgbGVuZ3RoOwotfSBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIgbmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9wcGMtZXh0LmggYi9pbmNsdWRlL25sbS9wcGMtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWUxMDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vcHBjLWV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qIFBvd2VyUEMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBvbmx5Ci0gICB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogQSBQb3dlclBDIE5MTSBzdGFydHMgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIKLXsKLSAgLyogU2lnbmF0dXJlLiAgTXVzdCBiZSAiQXBwbGVOTE0iLiAgKi8KLSAgY2hhciBzaWduYXR1cmVbOF07Ci0gIC8qIFZlcnNpb24gbnVtYmVyLiAgQ3VycmVudCB2YWx1ZSBpcyAxLiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWFkZXJWZXJzaW9uWzRdOwotICAvKiA/Py4gIFNob3VsZCBiZSBzZXQgdG8gMC4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3JpZ2luc1s0XTsKLSAgLyogRmlsZSBjcmVhdGlvbiBkYXRlIGluIHN0YW5kYXJkIFVuaXggdGltZSBmb3JtYXQgKHNlY29uZHMgc2luY2UKLSAgICAgMS8xLzcwKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0ZVs0XTsKLX07Ci0KLSNkZWZpbmUgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUgIkFwcGxlTkxNIgotI2RlZmluZSBOTE0zMl9QT1dFUlBDX0hFQURFUl9WRVJTSU9OIDEKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBhbgotICAgWENPRkYgZHluYW1pYyByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jCi17Ci0gIC8qIEFkZHJlc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGxfdmFkZHJbNF07Ci0gIC8qIFN5bWJvbCB0YWJsZSBpbmRleC4gIFRoaXMgaXMgMCBmb3IgLnRleHQgYW5kIDEgZm9yIC5kYXRhLiAgMgotICAgICBtZWFucyAuYnNzLCBidXQgSSBkb24ndCBrbm93IGlmIGl0IGlzIHVzZWQuICBJbiBYQ09GRiwgbGFyZ2VyCi0gICAgIG51bWJlcnMgYXJlIGluZGljZXMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCB0aGV5IGFyZQotICAgICBwcmVzdW1hYmx5IG5vdCB1c2VkIGluIGFuIE5MTS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9zeW1uZHhbNF07Ci0gIC8qIFJlbG9jYXRpb24gdHlwZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9ydHlwZVsyXTsKLSAgLyogU2VjdGlvbiBudW1iZXIgYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3JzZWNubVsyXTsKLX07Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogUGFkZGluZyB0byBtYWtlIGl0IGNvbWUgb3V0IGNvcnJlY3QuICovCi0KLSAgdW5zaWduZWQgY2hhciBwYWQxWzJdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgcmVnaW9uIHRoYXQgdGhlIGxvYWRlciBpcyB0byBiZQotICAgICBhbGxvY2F0ZWQgYXQgbG9hZCB0aW1lLiAgVW5pbml0aWFsaXplZCBkYXRhIGZvbGxvd3MgdGhlIGluaXRpYWxpemVkCi0gICAgIGRhdGEgaW4gdGhlIE5MTSBhZGRyZXNzIHNwYWNlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdW5pbml0aWFsaXplZERhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY3VzdG9tIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICBUaGUKLSAgICAgY3VzdG9tIGRhdGEgaXMgc2V0IGJ5IHRoZSBDVVNUT00ga2V5d29yZCB0byBOTE1MSU5LLiAgSXQgaXMgcG9zc2libGUKLSAgICAgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSBkYXRhLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXRbNF07Ci0KLSAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXNbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBwdWJsaWNzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZQdWJsaWNzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgaW50ZXJuYWwgZGVidWcgaW5mbyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgSXQgaXMgcG9zc2libGUgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGRlYnVnIGluZm8uICovCi0KLSAgdW5zaWduZWQgY2hhciBkZWJ1Z0luZm9PZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkRlYnVnUmVjb3Jkc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNvZGVTdGFydE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4aXRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjaGVja1VubG9hZFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZVR5cGVbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBmbGFnc1s0XTsKLQotfSBObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmggYi9pbmNsdWRlL25sbS9zcGFyYzMyLWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGViMmRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX3NwYXJjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2FzeXMuaCBiL2luY2x1ZGUvb2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDI1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29hc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogT2FzeXMgb2JqZWN0IGZvcm1hdCBoZWFkZXIgZmlsZSBmb3IgQkZELgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE9BU1lTX01BWF9TRUNfQ09VTlQgMTYKLS8qICoqKiogKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfYXJjaGl2ZV9oZWFkZXIgewotICB1bnNpZ25lZCBpbnQgIHZlcnNpb247Ci0gIGNoYXIgY3JlYXRlX2RhdGVbMTJdOwotICBjaGFyIHJldmlzaW9uX2RhdGVbMTJdOwotICB1bnNpZ25lZCBpbnQgbW9kX2NvdW50OwotICBmaWxlX3B0ciBtb2RfdGJsX29mZnNldDsKLSAgdW5zaWduZWQgaW50IHN5bV90Ymxfc2l6ZTsKLSAgdW5zaWduZWQgaW50IHN5bV9jb3VudDsKLSAgZmlsZV9wdHIgc3ltX3RibF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB4cmVmX2NvdW50OwotICBmaWxlX3B0ciB4cmVmX2xzdF9vZmZzZXQ7Ci19IG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyIHsKLSAgYmZkX2J5dGUgdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgY3JlYXRlX2RhdGVbMTJdOwotICBiZmRfYnl0ZSByZXZpc2lvbl9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX2NvdW50WzRdOwotICBiZmRfYnl0ZSBtb2RfdGJsX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgc3ltX3RibF9zaXplWzRdOwotICBiZmRfYnl0ZSBzeW1fY291bnRbNF07Ci0gIGJmZF9ieXRlIHN5bV90Ymxfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSB4cmVmX2NvdW50WzRdOwotICBiZmRfYnl0ZSB4cmVmX2xzdF9vZmZzZXRbNF07Ci19IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX21vZHVsZV90YWJsZSB7Ci0gIGludCBtb2RfbnVtYmVyOwotICBjaGFyIG1vZF9kYXRlWzEyXTsKLSAgdW5zaWduZWQgaW50IG1vZF9zaXplOwotICB1bnNpZ25lZCBpbnQgZGVwX2NvdW50OwotICB1bnNpZ25lZCBpbnQgZGVwZWVfY291bnQ7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2VjdF9jb3VudDsKLSAgY2hhciAqbW9kdWxlX25hbWU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfbmFtZV9zaXplOwotfSBvYXN5c19tb2R1bGVfdGFibGVfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYSB7Ci0gIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07Ci0gIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX3NpemVbNF07Ci0gIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07Ci0gIGJmZF9ieXRlIHNlY3RfY291bnRbNF07Ci0gIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBtb2RfbmFtZVszMl07Ci19IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX2IgewotICBiZmRfYnl0ZSBtb2RfbnVtYmVyWzRdOwotICBiZmRfYnl0ZSBtb2RfZGF0ZVsxMl07Ci0gIGJmZF9ieXRlIG1vZF9zaXplWzRdOwotICBiZmRfYnl0ZSBkZXBfY291bnRbNF07Ci0gIGJmZF9ieXRlIGRlcGVlX2NvdW50WzRdOwotICBiZmRfYnl0ZSBzZWN0X2NvdW50WzRdOwotICBiZmRfYnl0ZSBmaWxlX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgbW9kX25hbWVfbGVuZ3RoWzRdOwotfSBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGU7Ci0KLQotdHlwZWRlZiBlbnVtIG9hc3lzX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bSA9IDAsCi0gIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW0gPSAxLAotICBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW0gPSAyLAotICBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW0gPSAzLAotICBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtID0gNCwKLSAgb2FzeXNfcmVjb3JkX2lzX2NvbV9lbnVtID0gNSwKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW0gPSA2LAotICBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtID0gNywKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2ZpbGVfZW51bSA9IDgsCi0gIG9hc3lzX3JlY29yZF9pc19tb2R1bGVfZW51bSA9IDksCi0gIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtID0gMTAKLX0gb2FzeXNfcmVjb3JkX2VudW1fdHlwZTsKLQotICAKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfcmVjb3JkX2hlYWRlciB7Ci0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyIGNoZWNrX3N1bTsKLSAgdW5zaWduZWQgY2hhciB0eXBlOwotICB1bnNpZ25lZCBjaGFyIGZpbGw7Ci19IG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZGF0YV9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIGFkZHJbNF07Ci0gIC8qIG1heGltdW0gdG90YWwgc2l6ZSBvZiBkYXRhIHJlY29yZCBpcyAyNTUgYnl0ZXMgKi8KLSAgYmZkX2J5dGUgZGF0YVsyNDZdOwotfSBvYXN5c19kYXRhX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19oZWFkZXJfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uX251bWJlcjsKLSAgdW5zaWduZWQgY2hhciByZXZfbnVtYmVyOwotICBjaGFyIG1vZHVsZV9uYW1lWzI2LTZdOwotICBjaGFyIGRlc2NyaXB0aW9uWzY0LTI2XTsKLX0gb2FzeXNfaGVhZGVyX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIE9BU1lTX1ZFUlNJT05fTlVNQkVSIDAKLSNkZWZpbmUgT0FTWVNfUkVWX05VTUJFUiAwCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3N5bWJvbF9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIHZhbHVlWzRdOwotICBiZmRfYnl0ZSByZWZub1syXTsKLSAgY2hhciBuYW1lWzY0XTsKLX0gb2FzeXNfc3ltYm9sX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIFJFTE9DQVRJT05fUENSRUxfQklUIDB4ODAKLSNkZWZpbmUgUkVMT0NBVElPTl8zMkJJVF9CSVQgMHg0MAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfQklUUyAweDMwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9BQlMgMHgwMAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfUkVMIDB4MTAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX1VORCAweDIwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9DT00gMHgzMAotI2RlZmluZSBSRUxPQ0FUSU9OX1NFQ1RfQklUUyAweDBmCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3NlY3Rpb25fcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSB2YWx1ZVs0XTsKLSAgYmZkX2J5dGUgdm1hWzRdOwotICBiZmRfYnl0ZSBmaWxsWzNdOwotfSBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19lbmRfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSBlbnRyeVs0XTsKLSAgYmZkX2J5dGUgZmlsbFsyXTsKLSAgYmZkX2J5dGUgemVybzsKLX0gb2FzeXNfZW5kX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHVuaW9uIG9hc3lzX3JlY29yZF91bmlvbiB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIG9hc3lzX2RhdGFfcmVjb3JkX3R5cGUgZGF0YTsKLSAgb2FzeXNfc2VjdGlvbl9yZWNvcmRfdHlwZSBzZWN0aW9uOwotICBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUgc3ltYm9sOwotICBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUgZmlyc3Q7Ci0gIG9hc3lzX2VuZF9yZWNvcmRfdHlwZSBlbmQ7Ci0gIGJmZF9ieXRlIHBhZFsyNTZdOwotfSBvYXN5c19yZWNvcmRfdW5pb25fdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2JqYWxsb2MuaCBiL2luY2x1ZGUvb2JqYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NTFjZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29iamFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogb2JqYWxsb2MuaCAtLSByb3V0aW5lcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9iamVjdHMKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPQkpBTExPQ19ICi0jZGVmaW5lIE9CSkFMTE9DX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBvYmplY3QuICBUaGUgYXNzdW1wdGlvbiBpcwotICAgdGhhdCB0aGUgb2JqZWN0IHdpbGwgd2FudCB0byBhbGxvY2F0ZSBzcGFjZSBhcyBpdCBnb2VzIGFsb25nLCBidXQKLSAgIHdpbGwgbmV2ZXIgd2FudCB0byBmcmVlIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAgVGhlcmUgaXMgYSBmdW5jdGlvbgotICAgdG8gZnJlZSBhIGJsb2NrLCB3aGljaCBhbHNvIGZyZWVzIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZAotICAgYmxvY2tzLiAgVGhlcmUgaXMgYWxzbyBhIGZ1bmN0aW9uIHRvIGZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgc3BhY2UuCi0KLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBzcGVjaWFsaXphdGlvbiBvZiBvYnN0YWNrcy4gIFRoZSBtYWluCi0gICBkaWZmZXJlbmNlIGlzIHRoYXQgYSBibG9jayBtYXkgbm90IGJlIGFsbG9jYXRlZCBhIGJpdCBhdCBhIHRpbWUuCi0gICBBbm90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGVzZSByb3V0aW5lcyBhcmUgYWx3YXlzIGJ1aWx0IG9uIHRvcAotICAgb2YgbWFsbG9jLCBhbmQgYWx3YXlzIHBhc3MgYW4gbWFsbG9jIGZhaWx1cmUgYmFjayB0byB0aGUgY2FsbGVyLAotICAgdW5saWtlIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mIG9ic3RhY2tzLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGFuIG9iamFsbG9jIHN0cnVjdHVyZSBsb29rcyBsaWtlLiAgQ2FsbGVycyBzaG91bGQgbm90Ci0gICByZWZlciB0byB0aGVzZSBmaWVsZHMsIG5vciBzaG91bGQgdGhleSBhbGxvY2F0ZSB0aGVzZSBzdHJ1Y3R1cmUKLSAgIHRoZW1zZWx2ZXMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBvbmx5IGNyZWF0ZSB0aGVtIHZpYQotICAgb2JqYWxsb2NfaW5pdCwgYW5kIG9ubHkgYWNjZXNzIHRoZW0gdmlhIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcwotICAgbGlzdGVkIGJlbG93LiAgVGhlIHN0cnVjdHVyZSBpcyBvbmx5IGRlZmluZWQgaGVyZSBzbyB0aGF0IHdlIGNhbgotICAgYWNjZXNzIGl0IHZpYSBtYWNyb3MuICAqLwotCi1zdHJ1Y3Qgb2JqYWxsb2MKLXsKLSAgY2hhciAqY3VycmVudF9wdHI7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3NwYWNlOwotICBQVFIgY2h1bmtzOwotfTsKLQotLyogV29yayBvdXQgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0KLXN0cnVjdCBvYmphbGxvY19hbGlnbiB7IGNoYXIgeDsgZG91YmxlIGQ7IH07Ci0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNpZm5kZWYgb2Zmc2V0b2YKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgocHRyZGlmZl90KSAoKGNoYXIgKikgJigoc3RydWN0IG9iamFsbG9jX2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0jZWxzZQotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgobG9uZykgKChjaGFyICopICYoKHN0cnVjdCBvYmphbGxvY19hbGlnbiAqKSAwKS0+ZCAtIChjaGFyICopIDApKQotI2VuZGlmCi0KLS8qIENyZWF0ZSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jIGZhaWxzLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBvYmphbGxvYyAqb2JqYWxsb2NfY3JlYXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jCi0gICBmYWlscy4gICovCi0KLWV4dGVybiBQVFIgX29iamFsbG9jX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBvYmphbGxvYyAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFRoZSBtYWNybyB2ZXJzaW9uIG9mIG9iamFsbG9jX2FsbG9jLiAgV2Ugb25seSBkZWZpbmUgdGhpcyBpZiB1c2luZwotICAgZ2NjLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMKLSAgIG11bHRpcGxlIHRpbWVzLCBvciB1c2UgYSB0ZW1wb3JhcnkgZmllbGQgYXMgb2JzdGFjay5oIGRvZXMuICAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotCi0vKiBOZXh0U3RlcCAyLjAgY2MgaXMgcmVhbGx5IGdjYyAxLjkzIGJ1dCBpdCBkZWZpbmVzIF9fR05VQ19fID0gMiBhbmQKLSAgIGRvZXMgbm90IGltcGxlbWVudCBfX2V4dGVuc2lvbl9fLiAgQnV0IHRoYXQgY29tcGlsZXIgZG9lc24ndCBkZWZpbmUKLSAgIF9fR05VQ19NSU5PUl9fLiAgKi8KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSNkZWZpbmUgX19leHRlbnNpb25fXwotI2VuZGlmCi0KLSNkZWZpbmUgb2JqYWxsb2NfYWxsb2MobywgbCkJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9iamFsbG9jICpfX28gPSAobyk7CQkJCQlcCi0gICAgIHVuc2lnbmVkIGxvbmcgX19sZW4gPSAobCk7CQkJCQkJXAotICAgICBpZiAoX19sZW4gPT0gMCkJCQkJCQkJXAotICAgICAgIF9fbGVuID0gMTsJCQkJCQkJXAotICAgICBfX2xlbiA9IChfX2xlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7CVwKLSAgICAgKF9fbGVuIDw9IF9fby0+Y3VycmVudF9zcGFjZQkJCQkJXAotICAgICAgPyAoX19vLT5jdXJyZW50X3B0ciArPSBfX2xlbiwJCQkJCVwKLQkgX19vLT5jdXJyZW50X3NwYWNlIC09IF9fbGVuLAkJCQkJXAotCSAoUFRSKSAoX19vLT5jdXJyZW50X3B0ciAtIF9fbGVuKSkJCQkJXAotICAgICAgOiBfb2JqYWxsb2NfYWxsb2MgKF9fbywgX19sZW4pKTsgfSkKLQotI2Vsc2UgLyogISBfX0dOVUNfXyAqLwotCi0jZGVmaW5lIG9iamFsbG9jX2FsbG9jKG8sIGwpIF9vYmphbGxvY19hbGxvYyAoKG8pLCAobCkpCi0KLSNlbmRpZiAvKiAhIF9fR05VQ19fICovCi0KLS8qIEZyZWUgYW4gZW50aXJlIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWUgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICopKTsKLQotLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBvYmphbGxvY19hbGxvYy4gIFRoaXMgYWxzbyBmcmVlcyBhbGwgbW9yZQotICAgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2Nrcy4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWVfYmxvY2sgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICosIFBUUikpOwotCi0jZW5kaWYgLyogT0JKQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYnN0YWNrLmggYi9pbmNsdWRlL29ic3RhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwYWI1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29ic3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKiBvYnN0YWNrLmggLSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogU3VtbWFyeToKLQotQWxsIHRoZSBhcHBhcmVudCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBtYWNyb3MuIFRoZSBpZGVhCi1pcyB0aGF0IHlvdSB3b3VsZCB1c2UgdGhlc2UgcHJlLXRlc3RlZCBtYWNyb3MgdG8gc29sdmUgYQotdmVyeSBzcGVjaWZpYyBzZXQgb2YgcHJvYmxlbXMsIGFuZCB0aGV5IHdvdWxkIHJ1biBmYXN0LgotQ2F1dGlvbjogbm8gc2lkZS1lZmZlY3RzIGluIGFyZ3VtZW50cyBwbGVhc2UhISBUaGV5IG1heSBiZQotZXZhbHVhdGVkIE1BTlkgdGltZXMhIQotCi1UaGVzZSBtYWNyb3Mgb3BlcmF0ZSBhIHN0YWNrIG9mIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdGFydHMgbGlmZQotc21hbGwsIGFuZCBtYXkgZ3JvdyB0byBtYXR1cml0eS4gIChDb25zaWRlciBidWlsZGluZyBhIHdvcmQgc3lsbGFibGUKLWJ5IHN5bGxhYmxlLikgIEFuIG9iamVjdCBjYW4gbW92ZSB3aGlsZSBpdCBpcyBncm93aW5nLiAgT25jZSBpdCBoYXMKLWJlZW4gImZpbmlzaGVkIiBpdCBuZXZlciBjaGFuZ2VzIGFkZHJlc3MgYWdhaW4uICBTbyB0aGUgInRvcCBvZiB0aGUKLXN0YWNrIiBpcyB0eXBpY2FsbHkgYW4gaW1tYXR1cmUgZ3Jvd2luZyBvYmplY3QsIHdoaWxlIHRoZSByZXN0IG9mIHRoZQotc3RhY2sgaXMgb2YgbWF0dXJlLCBmaXhlZCBzaXplIGFuZCBmaXhlZCBhZGRyZXNzIG9iamVjdHMuCi0KLVRoZXNlIHJvdXRpbmVzIGdyYWIgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSwgdXNpbmcgYSBmdW5jdGlvbiB5b3UKLXN1cHBseSwgY2FsbGVkIGBvYnN0YWNrX2NodW5rX2FsbG9jJy4gIE9uIG9jY2FzaW9uLCB0aGV5IGZyZWUgY2h1bmtzLAotYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19mcmVlJy4gIFlvdSBtdXN0IGRlZmluZSB0aGVtIGFuZCBkZWNsYXJlCi10aGVtIGJlZm9yZSB1c2luZyBhbnkgb2JzdGFjayBtYWNyb3MuCi0KLUVhY2ggaW5kZXBlbmRlbnQgc3RhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSBgc3RydWN0IG9ic3RhY2snLgotRWFjaCBvZiB0aGUgb2JzdGFjayBtYWNyb3MgZXhwZWN0cyBhIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZQotYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotCi1PbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSBwcm9ibGVtIG9mIGdyb3dpbmcgY2hhciBzdHJpbmdzCi1pbiBzeW1ib2wgdGFibGVzLiAgVW5sZXNzIHlvdSBhcmUgImZhc2Npc3QgcGlnIHdpdGggYSByZWFkLW9ubHkgbWluZCIKLS0tR29zcGVyJ3MgaW1tb3J0YWwgcXVvdGUgZnJvbSBIQUtNRU0gaXRlbSAxNTQsIG91dCBvZiBjb250ZXh0LS15b3UKLXdvdWxkIG5vdCBsaWtlIHRvIHB1dCBhbnkgYXJiaXRyYXJ5IHVwcGVyIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgeW91cgotc3ltYm9scy4KLQotSW4gcHJhY3RpY2UgdGhpcyBvZnRlbiBtZWFucyB5b3Ugd2lsbCBidWlsZCBtYW55IHNob3J0IHN5bWJvbHMgYW5kIGEKLWZldyBsb25nIHN5bWJvbHMuICBBdCB0aGUgdGltZSB5b3UgYXJlIHJlYWRpbmcgYSBzeW1ib2wgeW91IGRvbid0IGtub3cKLWhvdyBsb25nIGl0IGlzLiAgT25lIHRyYWRpdGlvbmFsIG1ldGhvZCBpcyB0byByZWFkIGEgc3ltYm9sIGludG8gYQotYnVmZmVyLCByZWFsbG9jKClhdGluZyB0aGUgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IHRyeSB0byByZWFkIGEgc3ltYm9sCi10aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBUaGlzIGlzIGJlYXV0LCBidXQgeW91IHN0aWxsIHdpbGwKLXdhbnQgdG8gY29weSB0aGUgc3ltYm9sIGZyb20gdGhlIGJ1ZmZlciB0byBhIG1vcmUgcGVybWFuZW50Ci1zeW1ib2wtdGFibGUgZW50cnkgc2F5IGFib3V0IGhhbGYgdGhlIHRpbWUuCi0KLVdpdGggb2JzdGFja3MsIHlvdSBjYW4gd29yayBkaWZmZXJlbnRseS4gIFVzZSBvbmUgb2JzdGFjayBmb3IgYWxsIHN5bWJvbAotbmFtZXMuICBBcyB5b3UgcmVhZCBhIHN5bWJvbCwgZ3JvdyB0aGUgbmFtZSBpbiB0aGUgb2JzdGFjayBncmFkdWFsbHkuCi1XaGVuIHRoZSBuYW1lIGlzIGNvbXBsZXRlLCBmaW5hbGl6ZSBpdC4gIFRoZW4sIGlmIHRoZSBzeW1ib2wgZXhpc3RzIGFscmVhZHksCi1mcmVlIHRoZSBuZXdseSByZWFkIG5hbWUuCi0KLVRoZSB3YXkgd2UgZG8gdGhpcyBpcyB0byB0YWtlIGEgbGFyZ2UgY2h1bmssIGFsbG9jYXRpbmcgbWVtb3J5IGZyb20KLWxvdyBhZGRyZXNzZXMuICBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3ltYm9sIGluIHRoZSBjaHVuayB5b3UganVzdAotYWRkIGNoYXJzIGFib3ZlIHRoZSBjdXJyZW50ICJoaWdoIHdhdGVyIG1hcmsiIGluIHRoZSBjaHVuay4gIFdoZW4geW91Ci1oYXZlIGZpbmlzaGVkIGFkZGluZyBjaGFycywgYmVjYXVzZSB5b3UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCwKLXlvdSBrbm93IGhvdyBsb25nIHRoZSBjaGFycyBhcmUsIGFuZCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3QuCi1Nb3N0bHkgdGhlIGNoYXJzIHdpbGwgbm90IGJ1cnN0IG92ZXIgdGhlIGhpZ2hlc3QgYWRkcmVzcyBvZiB0aGUgY2h1bmssCi1iZWNhdXNlIHlvdSB3b3VsZCB0eXBpY2FsbHkgZXhwZWN0IGEgY2h1bmsgdG8gYmUgKHNheSkgMTAwIHRpbWVzIGFzCi1sb25nIGFzIGFuIGF2ZXJhZ2Ugb2JqZWN0LgotCi1JbiBjYXNlIHRoYXQgaXNuJ3QgY2xlYXIsIHdoZW4gd2UgaGF2ZSBlbm91Z2ggY2hhcnMgdG8gbWFrZSB1cAotdGhlIG9iamVjdCwgVEhFWSBBUkUgQUxSRUFEWSBDT05USUdVT1VTIElOIFRIRSBDSFVOSyAoZ3VhcmFudGVlZCkKLXNvIHdlIGp1c3QgcG9pbnQgdG8gaXQgd2hlcmUgaXQgbGllcy4gIE5vIG1vdmluZyBvZiBjaGFycyBpcwotbmVlZGVkIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgd2luOiBwb3RlbnRpYWxseSBsb25nIHN0cmluZ3MgbmVlZAotbmV2ZXIgYmUgZXhwbGljaXRseSBzaHVmZmxlZC4gT25jZSBhbiBvYmplY3QgaXMgZm9ybWVkLCBpdCBkb2VzIG5vdAotY2hhbmdlIGl0cyBhZGRyZXNzIGR1cmluZyBpdHMgbGlmZXRpbWUuCi0KLVdoZW4gdGhlIGNoYXJzIGJ1cnN0IG92ZXIgYSBjaHVuayBib3VuZGFyeSwgd2UgYWxsb2NhdGUgYSBsYXJnZXIKLWNodW5rLCBhbmQgdGhlbiBjb3B5IHRoZSBwYXJ0bHkgZm9ybWVkIG9iamVjdCBmcm9tIHRoZSBlbmQgb2YgdGhlIG9sZAotY2h1bmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGxhcmdlciBjaHVuay4gIFdlIHRoZW4gY2Fycnkgb24KLWFjY3JldGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIG9iamVjdCBhcyB3ZSBub3JtYWxseSB3b3VsZC4KLQotQSBzcGVjaWFsIG1hY3JvIGlzIHByb3ZpZGVkIHRvIGFkZCBhIHNpbmdsZSBjaGFyIGF0IGEgdGltZSB0byBhCi1ncm93aW5nIG9iamVjdC4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgcmVnaXN0ZXIgdmFyaWFibGVzLCB3aGljaAotYnJlYWsgdGhlIG9yZGluYXJ5ICdncm93dGgnIG1hY3JvLgotCi1TdW1tYXJ5OgotCVdlIGFsbG9jYXRlIGxhcmdlIGNodW5rcy4KLQlXZSBjYXJ2ZSBvdXQgb25lIG9iamVjdCBhdCBhIHRpbWUgZnJvbSB0aGUgY3VycmVudCBjaHVuay4KLQlPbmNlIGNhcnZlZCwgYW4gb2JqZWN0IG5ldmVyIG1vdmVzLgotCVdlIGFyZSBmcmVlIHRvIGFwcGVuZCBkYXRhIG9mIGFueSBzaXplIHRvIHRoZSBjdXJyZW50bHkKLQkgIGdyb3dpbmcgb2JqZWN0LgotCUV4YWN0bHkgb25lIG9iamVjdCBpcyBncm93aW5nIGluIGFuIG9ic3RhY2sgYXQgYW55IG9uZSB0aW1lLgotCVlvdSBjYW4gcnVuIG9uZSBvYnN0YWNrIHBlciBjb250cm9sIGJsb2NrLgotCVlvdSBtYXkgaGF2ZSBhcyBtYW55IGNvbnRyb2wgYmxvY2tzIGFzIHlvdSBkYXJlLgotCUJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyBpdCwgeW91IGNhbiBgdW53aW5kJyBhbiBvYnN0YWNrCi0JICBiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUuIChZb3UgbWF5IHJlbW92ZSBvYmplY3RzIG11Y2gKLQkgIGFzIHlvdSB3b3VsZCB3aXRoIGEgc3RhY2suKQotKi8KLQotCi0vKiBEb24ndCBkbyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotI2lmbmRlZiBfT0JTVEFDS19ICi0jZGVmaW5lIF9PQlNUQUNLX0ggMQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0MCi0vKiBXZSB1c2Ugc3VidHJhY3Rpb24gb2YgKGNoYXIgKikgMCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gaW50Ci0gICBiZWNhdXNlIG9uIHdvcmQtYWRkcmVzc2FibGUgbWFjaGluZXMgYSBzaW1wbGUgY2FzdCB0byBpbnQKLSAgIG1heSBpZ25vcmUgdGhlIGJ5dGUtd2l0aGluLXdvcmQgZmllbGQgb2YgdGhlIHBvaW50ZXIuICAqLwotCi0jaWZuZGVmIF9fUFRSX1RPX0lOVAotIyBkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoUCkgLSAoY2hhciAqKSAwKQotI2VuZGlmCi0KLSNpZm5kZWYgX19JTlRfVE9fUFRSCi0jIGRlZmluZSBfX0lOVF9UT19QVFIoUCkgKChQKSArIChjaGFyICopIDApCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIElmIF9fUFRSRElGRl9UWVBFX18gaXMKLSAgIGRlZmluZWQsIGFzIHdpdGggR05VIEMsIHVzZSB0aGF0OyB0aGF0IHdheSB3ZSBkb24ndCBwb2xsdXRlIHRoZQotICAgbmFtZXNwYWNlIHdpdGggPHN0ZGRlZi5oPidzIHN5bWJvbHMuICBPdGhlcndpc2UsIGlmIDxzdGRkZWYuaD4gaXMKLSAgIGF2YWlsYWJsZSwgaW5jbHVkZSBpdCBhbmQgdXNlIHB0cmRpZmZfdC4gIEluIHRyYWRpdGlvbmFsIEMsIGxvbmcgaXMKLSAgIHRoZSBiZXN0IHRoYXQgd2UgY2FuIGRvLiAgKi8KLQotI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KLSMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCi0jZWxzZQotIyBpZmRlZiBIQVZFX1NURERFRl9ICi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgcHRyZGlmZl90Ci0jIGVsc2UKLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgbG9uZwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKLSMgZWxzZQotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoY2hhciAqKShGcm9tKSwgKE4pKQotIyBlbmRpZgotI2Vsc2UKLSMgaWZkZWYgbWVtY3B5Ci0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChjaGFyICopKEZyb20pLCAoTikpCi0jIGVsc2UKLSMgIGRlZmluZSBfb2JzdGFja19tZW1jcHkoVG8sIEZyb20sIE4pIGJjb3B5ICgoY2hhciAqKShGcm9tKSwgKFRvKSwgKE4pKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0cnVjdCBfb2JzdGFja19jaHVuawkJLyogTGl2ZXMgYXQgZnJvbnQgb2YgZWFjaCBjaHVuay4gKi8KLXsKLSAgY2hhciAgKmxpbWl0OwkJCS8qIDEgcGFzdCBlbmQgb2YgdGhpcyBjaHVuayAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnByZXY7CS8qIGFkZHJlc3Mgb2YgcHJpb3IgY2h1bmsgb3IgTlVMTCAqLwotICBjaGFyCWNvbnRlbnRzWzRdOwkJLyogb2JqZWN0cyBiZWdpbiBoZXJlICovCi19OwotCi1zdHJ1Y3Qgb2JzdGFjawkJLyogY29udHJvbCBjdXJyZW50IG9iamVjdCBpbiBjdXJyZW50IGNodW5rICovCi17Ci0gIGxvbmcJY2h1bmtfc2l6ZTsJCS8qIHByZWZlcnJlZCBzaXplIHRvIGFsbG9jYXRlIGNodW5rcyBpbiAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOwkvKiBhZGRyZXNzIG9mIGN1cnJlbnQgc3RydWN0IG9ic3RhY2tfY2h1bmsgKi8KLSAgY2hhcgkqb2JqZWN0X2Jhc2U7CQkvKiBhZGRyZXNzIG9mIG9iamVjdCB3ZSBhcmUgYnVpbGRpbmcgKi8KLSAgY2hhcgkqbmV4dF9mcmVlOwkJLyogd2hlcmUgdG8gYWRkIG5leHQgY2hhciB0byBjdXJyZW50IG9iamVjdCAqLwotICBjaGFyCSpjaHVua19saW1pdDsJCS8qIGFkZHJlc3Mgb2YgY2hhciBhZnRlciBjdXJyZW50IGNodW5rICovCi0gIFBUUl9JTlRfVFlQRSB0ZW1wOwkJLyogVGVtcG9yYXJ5IGZvciBzb21lIG1hY3Jvcy4gICovCi0gIGludCAgIGFsaWdubWVudF9tYXNrOwkJLyogTWFzayBvZiBhbGlnbm1lbnQgZm9yIGVhY2ggb2JqZWN0LiAqLwotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSAgLyogVGhlc2UgcHJvdG90eXBlcyB2YXJ5IGJhc2VkIG9uIGB1c2VfZXh0cmFfYXJnJywgYW5kIHdlIHVzZQotICAgICBjYXN0cyB0byB0aGUgcHJvdG90eXBlbGVzcyBmdW5jdGlvbiB0eXBlIGluIGFsbCBhc3NpZ25tZW50cywKLSAgICAgYnV0IGhhdmluZyBwcm90b3R5cGVzIGhlcmUgcXVpZXRzIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqY2h1bmtmdW4pICh2b2lkICosIGxvbmcpOwotICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopOwotICB2b2lkICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbHNlCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKCk7IC8qIFVzZXIncyBmY24gdG8gYWxsb2NhdGUgYSBjaHVuay4gICovCi0gIHZvaWQgKCpmcmVlZnVuKSAoKTsJCS8qIFVzZXIncyBmdW5jdGlvbiB0byBmcmVlIGEgY2h1bmsuICAqLwotICBjaGFyICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbmRpZgotICB1bnNpZ25lZCB1c2VfZXh0cmFfYXJnOjE7CS8qIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgdGFrZSBleHRyYSBhcmcgKi8KLSAgdW5zaWduZWQgbWF5YmVfZW1wdHlfb2JqZWN0OjE7LyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjdXJyZW50Ci0JCQkJICAgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aCBvYmplY3QuICBUaGlzCi0JCQkJICAgcHJldmVudHMgZnJlZWluZyB0aGUgY2h1bmsgaWYgd2UgYWxsb2NhdGUKLQkJCQkgICBhIGJpZ2dlciBjaHVuayB0byByZXBsYWNlIGl0LiAqLwotICB1bnNpZ25lZCBhbGxvY19mYWlsZWQ6MTsJLyogTm8gbG9uZ2VyIHVzZWQsIGFzIHdlIG5vdyBjYWxsIHRoZSBmYWlsZWQKLQkJCQkgICBoYW5kbGVyIG9uIGVycm9yLCBidXQgcmV0YWluZWQgZm9yIGJpbmFyeQotCQkJCSAgIGNvbXBhdGliaWxpdHkuICAqLwotfTsKLQotLyogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHdlIHVzZTsgdGhleSBhcmUgaW4gb2JzdGFjay5jLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAotCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCi0JCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKLQkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOwotI2Vsc2UKLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rICgpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luXzEgKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX21lbW9yeV91c2VkICgpOwotI2VuZGlmCi0MCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0vKiBEbyB0aGUgZnVuY3Rpb24tZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3RzCi0gICBidXQgYmVmb3JlIGRlZmluaW5nIHRoZSBtYWNyb3MuICAqLwotCi12b2lkIG9ic3RhY2tfaW5pdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotCi12b2lkICogb2JzdGFja19hbGxvYyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLQotdm9pZCAqIG9ic3RhY2tfY29weSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmFkZHJlc3MsIGludCBzaXplKTsKLXZvaWQgKiBvYnN0YWNrX2NvcHkwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmJsb2NrKTsKLQotdm9pZCBvYnN0YWNrX2JsYW5rIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLXZvaWQgb2JzdGFja19ncm93MCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLQotdm9pZCBvYnN0YWNrXzFncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Ci12b2lkIG9ic3RhY2tfcHRyX2dyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhKTsKLQotdm9pZCAqIG9ic3RhY2tfZmluaXNoIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX29iamVjdF9zaXplIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgb2JzdGFja19tYWtlX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci12b2lkIG9ic3RhY2tfMWdyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhX2NoYXIpOwotdm9pZCBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwotdm9pZCBvYnN0YWNrX2JsYW5rX2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgKiBvYnN0YWNrX2Jhc2UgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgKiBvYnN0YWNrX25leHRfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX2NodW5rX3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX21lbW9yeV91c2VkIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0vKiBOb24tQU5TSSBDIGNhbm5vdCByZWFsbHkgc3VwcG9ydCBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZXNlIG1hY3JvcywKLSAgIHNvIHdlIGRvIG5vdCBkZWNsYXJlIHRoZW0uICAqLwotCi0vKiBFcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGBvYnN0YWNrX2NodW5rX2FsbG9jJyBmYWlsZWQgdG8gYWxsb2NhdGUKLSAgIG1vcmUgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2V0IHRvIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uLiAgVGhlCi0gICBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKTsKLSNlbHNlCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotZXh0ZXJuIGludCBvYnN0YWNrX2V4aXRfZmFpbHVyZTsKLQwKLS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG9iamVjdCBiZWluZyBhbGxvY2F0ZWQgb3IgdG8gYmUgYWxsb2NhdGVkIG5leHQuCi0gICBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgYmVjYXVzZSBhIG5ldyBjaHVuayBtaWdodCBiZSBuZWVkZWQgdG8gaG9sZCB0aGUgZmluYWwgc2l6ZS4gICovCi0KLSNkZWZpbmUgb2JzdGFja19iYXNlKGgpICgoaCktPm9iamVjdF9iYXNlKQotCi0vKiBTaXplIGZvciBhbGxvY2F0aW5nIG9yZGluYXJ5IGNodW5rcy4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19zaXplKGgpICgoaCktPmNodW5rX3NpemUpCi0KLS8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIG5vdCB5ZXQgYWxsb2NhdGVkIGluIGN1cnJlbnQgY2h1bmsuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfbmV4dF9mcmVlKGgpCSgoaCktPm5leHRfZnJlZSkKLQotLyogTWFzayBzcGVjaWZ5aW5nIGxvdyBiaXRzIHRoYXQgc2hvdWxkIGJlIGNsZWFyIGluIGFkZHJlc3Mgb2YgYW4gb2JqZWN0LiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2FsaWdubWVudF9tYXNrKGgpICgoaCktPmFsaWdubWVudF9tYXNrKQotCi0vKiBUbyBwcmV2ZW50IHByb3RvdHlwZSB3YXJuaW5ncyBwcm92aWRlIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgaW4KLSAgIHN0YW5kYXJkIEMgdmVyc2lvbi4gICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0jIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbihoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKSBcCi0gIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKGxvbmcpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKHZvaWQgKikpIChmcmVlZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCi0gIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSkgKGNodW5rZnVuKSwgXAotCQkgICAgKHZvaWQgKCopICh2b2lkICosIHZvaWQgKikpIChmcmVlZnVuKSwgKGFyZykpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY2h1bmtmdW4oaCwgbmV3Y2h1bmtmdW4pIFwKLSAgKChoKSAtPiBjaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSh2b2lkICosIGxvbmcpKSAobmV3Y2h1bmtmdW4pKQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAotICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIChuZXdmcmVlZnVuKSkKLQotI2Vsc2UKLQotIyBkZWZpbmUgb2JzdGFja19pbml0KGgpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwgXAotCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykgXAotICBfb2JzdGFja19iZWdpbl8xICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKCkpIChjaHVua2Z1biksICh2b2lkICgqKSAoKSkgKGZyZWVmdW4pLCAoYXJnKSkKLQotIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAotICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKCkpIChuZXdjaHVua2Z1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCi0gICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSgpKSAobmV3ZnJlZWZ1bikpCi0KLSNlbmRpZgotCi0jZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IGFjaGFyKQotCi0jZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCi0KLSNkZWZpbmUgb2JzdGFja19tZW1vcnlfdXNlZChoKSBfb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKLQwKLSNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLS8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAotICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQotICAgX19HTlVDX01JTk9SX18uICAqLwotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSMgIGRlZmluZSBfX2V4dGVuc2lvbl9fCi0jIGVuZGlmCi0KLS8qIEZvciBHTlUgQywgaWYgbm90IC10cmFkaXRpb25hbCwKLSAgIHdlIGNhbiBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGNvbXB1dGUgYWxsIGFyZ3Mgb25seSBvbmNlCi0gICB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlLgotICAgQWxzbywgd2UgY2FuIGF2b2lkIHVzaW5nIHRoZSBgdGVtcCcgc2xvdCwgdG8gbWFrZSBmYXN0ZXIgY29kZS4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoT0JTVEFDSykJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAodW5zaWduZWQpIChfX28tPm5leHRfZnJlZSAtIF9fby0+b2JqZWN0X2Jhc2UpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oT0JTVEFDSyxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKE9CU1RBQ0spCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKF9fby0+Y2h1bmstPnByZXYgPT0gMCAmJiBfX28tPm5leHRfZnJlZSAtIF9fby0+Y2h1bmstPmNvbnRlbnRzID09IDApOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAod2hlcmUpLCBfX2xlbik7CQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4gKyAxKTsJCQkJXAotICAgX29ic3RhY2tfbWVtY3B5IChfX28tPm5leHRfZnJlZSwgKHdoZXJlKSwgX19sZW4pOwkJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgMSk7CQkJCQlcCi0gICAqKF9fby0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0vKiBUaGVzZSBhc3N1bWUgdGhhdCB0aGUgb2JzdGFjayBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggZm9yIHBvaW50ZXJzIG9yIGludHMsCi0gICBhbmQgdGhhdCB0aGUgZGF0YSBhZGRlZCBzbyBmYXIgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Ci0gICBzaGFyZXMgdGhhdCBtdWNoIGFsaWdubWVudC4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAodm9pZCAqKSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAodm9pZCAqKSk7CQkJCVwKLSAgICooKHZvaWQgKiopX19vLT5uZXh0X2ZyZWUpKysgPSAoKHZvaWQgKilkYXR1bSk7CQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSk7CQkJCVwKLSAgICooKGludCAqKV9fby0+bmV4dF9mcmVlKSsrID0gKChpbnQpZGF0dW0pOwkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikgKCooKHZvaWQgKiopIChoKS0+bmV4dF9mcmVlKSsrID0gKHZvaWQgKilhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCi0gICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19jb3B5KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ncm93IChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBvYnN0YWNrX2dyb3cwIChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLS8qIFRoZSBsb2NhbCB2YXJpYWJsZSBpcyBuYW1lZCBfX28xIHRvIGF2b2lkIGEgbmFtZSBjb25mbGljdAotICAgd2hlbiBvYnN0YWNrX2JsYW5rIGlzIGNhbGxlZC4gICovCi0jIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKSAgCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKnZhbHVlOwkJCQkJCQkJXAotICAgdmFsdWUgPSAodm9pZCAqKSBfX28xLT5vYmplY3RfYmFzZTsJCQkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gdmFsdWUpCQkJCQlcCi0gICAgIF9fbzEtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CQkJCQlcCi0gICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoX19vMS0+bmV4dF9mcmVlKStfX28xLT5hbGlnbm1lbnRfbWFzaylcCi0JCSAgICAgJiB+IChfX28xLT5hbGlnbm1lbnRfbWFzaykpOwkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgLSAoY2hhciAqKV9fbzEtPmNodW5rCQkJCVwKLSAgICAgICA+IF9fbzEtPmNodW5rX2xpbWl0IC0gKGNoYXIgKilfX28xLT5jaHVuaykJCQlcCi0gICAgIF9fbzEtPm5leHRfZnJlZSA9IF9fbzEtPmNodW5rX2xpbWl0OwkJCQlcCi0gICBfX28xLT5vYmplY3RfYmFzZSA9IF9fbzEtPm5leHRfZnJlZTsJCQkJCVwKLSAgIHZhbHVlOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKLSAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKLSAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gX19vYmo7CQkJCVwKLSAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQotDAotI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKGgpIFwKLSAodW5zaWduZWQpICgoaCktPm5leHRfZnJlZSAtIChoKS0+b2JqZWN0X2Jhc2UpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShoKQkJXAotICh1bnNpZ25lZCkgKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKGgpIFwKLSAoKGgpLT5jaHVuay0+cHJldiA9PSAwICYmIChoKS0+bmV4dF9mcmVlIC0gKGgpLT5jaHVuay0+Y29udGVudHMgPT0gMCkKLQotLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCi0gICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucwotICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0gICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLwotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKHdoZXJlKSwgKGgpLT50ZW1wKSwJCQlcCi0gIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcCkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93MChoLHdoZXJlLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCArIDEgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCArIDEpLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKHdoZXJlKSwgKGgpLT50ZW1wKSwJCQlcCi0gIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcCwJCQkJCQlcCi0gICooKGgpLT5uZXh0X2ZyZWUpKysgPSAwKQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KGgsZGF0dW0pCQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIDEpLCAwKSA6IDApLAkJCQlcCi0gICgqKChoKS0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coaCxkYXR1bSkJCQkJCVwKLSggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoY2hhciAqKSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGNoYXIgKikpLCAwKSA6IDApLAkJXAotICAoKigoY2hhciAqKikgKCgoaCktPm5leHRfZnJlZSs9c2l6ZW9mKGNoYXIgKikpLXNpemVvZihjaGFyICopKSkgPSAoKGNoYXIgKikgZGF0dW0pKSkKLQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3JvdyhoLGRhdHVtKQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChpbnQpID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGludCkpLCAwKSA6IDApLAkJCVwKLSAgKCooKGludCAqKSAoKChoKS0+bmV4dF9mcmVlKz1zaXplb2YoaW50KSktc2l6ZW9mKGludCkpKSA9ICgoaW50KSBkYXR1bSkpKQotCi0jIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93X2Zhc3QoaCxhcHRyKSAoKigoY2hhciAqKikgKGgpLT5uZXh0X2ZyZWUpKysgPSAoY2hhciAqKSBhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoaCxsZW5ndGgpCQkJCQlcCi0oIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCi0gICgoKGgpLT5jaHVua19saW1pdCAtIChoKS0+bmV4dF9mcmVlIDwgKGgpLT50ZW1wKQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCksIDApIDogMCksCQkJXAotICAoKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKSkKLQotIyBkZWZpbmUgb2JzdGFja19hbGxvYyhoLGxlbmd0aCkJCQkJCVwKLSAob2JzdGFja19ibGFuayAoKGgpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NvcHkoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0gKG9ic3RhY2tfZ3JvdyAoKGgpLCAod2hlcmUpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NvcHkwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotIChvYnN0YWNrX2dyb3cwICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZmluaXNoKGgpICAJCQkJCQlcCi0oICgoaCktPm5leHRfZnJlZSA9PSAoaCktPm9iamVjdF9iYXNlCQkJCQlcCi0gICA/ICgoKGgpLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxKSwgMCkJCQkJCVwKLSAgIDogMCksCQkJCQkJCQlcCi0gIChoKS0+dGVtcCA9IF9fUFRSX1RPX0lOVCAoKGgpLT5vYmplY3RfYmFzZSksCQkJCVwKLSAgKGgpLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgID0gX19JTlRfVE9fUFRSICgoX19QVFJfVE9fSU5UICgoaCktPm5leHRfZnJlZSkrKGgpLT5hbGlnbm1lbnRfbWFzaykJXAotCQkgICAgJiB+ICgoaCktPmFsaWdubWVudF9tYXNrKSksCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSAtIChjaGFyICopIChoKS0+Y2h1bmsJCQkJXAotICAgID4gKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspCQkJCVwKLSAgID8gKChoKS0+bmV4dF9mcmVlID0gKGgpLT5jaHVua19saW1pdCkgOiAwKSwJCQkJXAotICAoaCktPm9iamVjdF9iYXNlID0gKGgpLT5uZXh0X2ZyZWUsCQkJCQlcCi0gIF9fSU5UX1RPX1BUUiAoKGgpLT50ZW1wKSkKLQotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKLSAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKLSAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoKChvYnN0YWNrX2ZyZWUpICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSwgMCkpKQotIyBlbHNlCi0jICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKLSAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKLSAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoX29ic3RhY2tfZnJlZSAoKGgpLCAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkpKQotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0JLyogQysrICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIG9ic3RhY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTJlM2M2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDIyMzggKzAsMCBAQAotV2VkIEFwciAxMiAxNzoxMToyMCAyMDAwICBEb25hbGQgTGluZHNheSAgPGRsaW5kc2F5QGhvdW5kLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogYWRkZWQgQUxPTkUgYXR0cmlidXRlIGZvciBkMTB2X29wY29kZS5leGVjX3R5cGUuCi0KLTIwMDAtMDUtMjMgIE1hY2llaiBXLiBSb3p5Y2tpICA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQotCSogaTM4Ni5oOiBBbGxvdyBkIHN1ZmZpeCBvbiBpcmV0LCBhbmQgYWRkIERlZmF1bHRTaXplIG1vZGlmaWVyLgotCi0yMDAwLTA1LTE3ICBNYWNpZWogVy4gUm96eWNraSAgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0KLQkqIGkzODYuaDogVXNlIHNsX0ZQLCBub3Qgc2xfU3VmIGZvciBmaWxkLgotCi0yMDAwLTA1LTE2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUByZWRoYXQuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fTUFYX1NZTlRBWF9CWVRFUyk6IEluY3JlYXNlIHRvIDMyLiAgQ2hlY2sgdGhhdAotCWl0IGV4Y2VlZHMgQ0dFTl9BQ1RVQUxfTUFYX1NZTlRBWF9CWVRFUywgaWYgc2V0LgotCShDR0VOX01BWF9JRk1UX09QRVJBTkRTKTogSW5jcmVhc2UgdG8gMTYuICBDaGVjayB0aGF0IGl0IGV4Y2VlZHMKLQlDR0VOX0FDVFVBTF9NQVhfSUZNVF9PUEVSQU5EUywgaWYgc2V0LgotCi0yMDAwLTA1LTEzICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PiwKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ3B1Njg2IGZvciBzeXNlbnRlcixzeXNleGl0LGZ4c2F2ZSxmeHJlc3RvcmUuCi0KLTIwMDAtMDUtMTMgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+LAotCSAgICBBbGV4YW5kZXIgU29rb2xvdiA8cm9ib2NvcEBuZXRsaW5rLnJ1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgY3B1X2ZsYWdzIGZvciBhbGwgaW5zdHJ1Y3Rpb25zLgotCi0yMDAwLTA1LTEzICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JRnJvbSBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgotCSogaTM4Ni5oICh3bGRfU3VmKTogRGVmaW5lLiAgVXNlIG9uIHB1c2hmLCBwb3BmLCBwdXNoYSwgcG9wYS4KLQotMjAwMC0wNS0wNCAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogdGljNTR4Lmg6IE5ldy4KLQotMjAwMC0wNS0wMyAgSi5ULiBDb25rbGluICA8anRjQHJlZGJhY2suY29tPgotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV9BTFRJVkVDKTogTmV3IG9wY29kZSBmbGFnIGZvciB2ZWN0b3IgdW5pdC4KLQkoUFBDX09QRVJBTkRfVlIpOiBOZXcgb3BlcmFuZCBmbGFnIGZvciB2ZWN0b3IgcmVnaXN0ZXJzLgotCi0yMDAwLTA1LTAxICBLYXp1IEhpcmF0YSAgPGthenVAaHhpLmNvbT4KLQotCSogaDgzMDAuaCAoRU9QKTogQWRkIG1pc3NpbmcgaW5pdGlhbGl6ZXIuCi0KLUZyaSBBcHIgMjEgMTU6MDM6MzcgMjAwMCAgSmFzb24gRWNraGFyZHQgIDxqbGVAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogTmV3IG9wY29kZXMgZm9yIFBBMi4wIHdpZGUgbW9kZQotCWZvcm1zIG9mIGxkL3N0e2IsaCx3LGR9IGFuZCBmbGQvZnN0e3csZH0gKDE2LWJpdCBkaXNwbGFjZW1lbnRzKS4KLQlOZXcgb3BlcmFuZCB0eXBlcyBsLHksJixmZSxmRSxmeCBhZGRlZCB0byBzdXBwb3J0IGFib3ZlIGZvcm1zLgotCShwYV9vcGNvZGVzKTogUmVwbGFjZWQgdXNhZ2Ugb2YgJ3gnIGFzIHNvdXJjZS90YXJnZXQgZm9yCi0JZmxvYXRpbmcgcG9pbnQgZG91YmxlLXdvcmQgbG9hZHMvc3RvcmVzIHdpdGggJ2Z4Jy4KLQotRnJpIEFwciAyMSAxMzoyMDo1MyAyMDAwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCQkJICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQkJCSAgVGltb3RoeSBXYWxsIDx0d2FsbEBjeWdudXMuY29tPgotCQkJICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGlhNjQuaDogTmV3IGZpbGUuCi0KLTIwMDAtMDMtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoU0hPUlRfQTEpOiBGaXggdmFsdWUuCi0JKFNIT1JUX0FSKTogUmVudW1iZXIgc28gdGhhdCBpdCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIHNob3J0Ci0JaW5zdHJ1Y3Rpb25zLCBub3QgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBsb25nIGluc3RydWN0aW9ucy4KLQotMjAwMC0wMy0yNiAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbT4KLQotCSogaTM4Ni5oOiAoVU5JWFdBUkVfQ09NUEFUKTogUmVuYW1lIHRvIFNZU1YzODZfQ09NUEFUIGFzIHRoZQotCXByb2JsZW0gaXNuJ3QgcmVhbGx5IHNwZWNpZmljIHRvIFVuaXh3YXJlLgotCShPTERHQ0NfQ09NUEFUKTogRGVmaW5lLgotCShpMzg2X29wdGFiKTogSWYgIU9MREdDQ19DT01QQVQsIGRvbid0IGhhbmRsZSBmc3VicCBldGMuIHdpdGgKLQlkZXN0aW5hdGlvbiAlc3QoMCkuCi0JRml4IGxvdHMgb2YgY29tbWVudHMuCi0KLTIwMDAtMDMtMDIgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotICAgICAgICAqIGQzMHYuaDoKLSAgICAgICAgKFNIT1JUX0IyciwgU0hPUlRfQjMsIFNIT1JUX0IzciwgU0hPUlRfQjNiLCBTSE9SVF9CM2JyKTogVXBkYXRlZC4KLSAgICAgICAgKFNIT1JUX0QxciwgU0hPUlRfRDIsIFNIT1JUX0QyciwgU0hPUlRfRDJCciwgU0hPUlRfVSk6IFVwZGF0ZWQuCi0gICAgICAgIChTSE9SVF9GLCBTSE9SVF9BRiwgU0hPUlRfVCwgU0hPUlRfQTUsIFNIT1JUX0NNUCwgU0hPUlRfQ01QVSk6IFVwZGF0ZWQuCi0gICAgICAgIChTSE9SVF9BMSwgU0hPUlRfQUEsIFNIT1JUX1JBLCBTSE9SVF9NT0RJTkMsIFNIT1JUX01PRERFQyk6IFVwZGF0ZWQuCi0gICAgICAgIChTSE9SVF9DMSwgU0hPUlRfQzIsIFNIT1JUX1VGLCBTSE9SVF9BMiwgU0hPUlRfTk9ORSwgTE9ORyk6IFVwZGF0ZWQuCi0gICAgICAgIChMT05HX1UsIExPTkdfVXIsIExPTkdfQ01QLCBMT05HX00sIExPTkdfTTIsIExPTkdfMiwgTE9OR18ycik6IFVwZGF0ZWQuCi0gICAgICAgIChMT05HXzJiLCBMT05HXzJiciwgTE9OR19ELCBMT05HX0RyLCBMT05HX0Ricik6IFVwZGF0ZWQuCi0KLTIwMDAtMDItMjUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChmaWxkLCBmaXN0cCk6IENoYW5nZSBpbnRlbCBkX1N1ZiBmb3JtIHRvIGZpbGRkIGFuZAotCWZpc3RwZCB3aXRob3V0IHN1ZmZpeC4KLQotMjAwMC0wMi0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2NwdV9kZXNjKTogUmVuYW1lIGZpZWxkICdmbGFncycgdG8KLSAgICAgICAgJ3NpZ25lZF9vdmVyZmxvd19va19wJy4KLQlEZWxldGUgcHJvdG90eXBlcyBmb3IgY2dlbl9zZXRfZmxhZ3MoKSBhbmQgY2dlbl9nZXRfZmxhZ3MoKS4KLQotMjAwMC0wMi0yNCAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX01BQ0hfSEFTX1ApOiBOZXcgbWFjcm8uCi0JKENHRU5fQ1BVX1RBQkxFKTogZmxhZ3M6IG5ldyBmaWVsZC4KLQlBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4KLQkKLTIwMDAtMDItMjQgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBZGQgc29tZSBtb3JlIFVOSVhXQVJFX0NPTVBBVCBjb21tZW50cy4KLQotMjAwMC0wMi0yMyAgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgotCi0JKiBpMzcwLmg6IE5ldyBmaWxlLgotCi0yMDAwLTAyLTIyICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiAoT1BDT0RFX0lTX01FTUJFUik6IEFkZCBjb21tZW50LgotCi0xOTk5LTEyLTMwICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUENPREVfSVNfTUVNQkVSKTogQWRkIGdwMzIgYXJnLCB3aGljaCBkZXRlcm1pbmVzCi0Jd2hldGhlciBzeW50aGV0aWMgb3Bjb2RlcyAoZS5nLiBtb3ZlKSBnZW5lcmF0ZSAzMi1iaXQgb3IgNjQtYml0Ci0JaW5zbnMuCi0KLTIwMDAtMDEtMTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBRdWFsaWZ5IGludGVsIG1vZGUgZmFyIGNhbGwgYW5kIGptcCB3aXRoIHhfU3VmLgotCi0xOTk5LTEyLTI3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWRkIEp1bXBBYnNvbHV0ZSBxdWFsaWZpZXIgdG8gYWxsIG5vbi1pbnRlbCBtb2RlCi0JaW5kaXJlY3QganVtcHMgYW5kIGNhbGxzLiAgQWRkIEZGLzMgY2FsbCBmb3IgaW50ZWwgbW9kZS4KLQotV2VkIERlYyAgMSAwMzowNToyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkIG5ldyBvcGVyYW5kIHR5cGVzLiAgQWRkIG5ldyBpbnN0cnVjdGlvbiBmb3JtYXRzLgotCi1XZWQgTm92IDI0IDIwOjI4OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ29ycmVjdGx5IGhhbmRsZSBpbW1lZGlhdGUgZm9yIFBBMi4wICJiYiIKLQlpbnN0cnVjdGlvbi4KLQotMTk5OS0xMS0xOCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0E1KTogTmV3LgotCi0xOTk5LTExLTAxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUENPREVfSVNfTUVNQkVSKTogTmV3LgotCi0xOTk5LTEwLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKFNIT1JUX0FSKTogRGVmaW5lLgotCi0xOTk5LTEwLTE4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoYWxwaGFfbnVtX29wY29kZXMpOiBDb252ZXJ0IHRvIHVuc2lnbmVkLgotCShhbHBoYV9udW1fb3BlcmFuZHMpOiBEaXR0by4KLQotU3VuIE9jdCAxMCAwMTo0Njo1NiAxOTk5ICBKZXJyeSBRdWlubiA8amVycnkucXVpbm4uYWR2OTFAYWx1bS5kYXJ0bW91dGgub3JnPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIGxvYWQgYW5kIHN0b3JlIGNhY2hlIGNvbnRyb2wgdG8KLQlpbnN0cnVjdGlvbnMuICBBZGQgb3JkZXJlZCBhY2Nlc3MgbG9hZCBhbmQgc3RvcmUuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2RlKTogQWRkIG5ldyBlbnRyaWVzIGZvciBhZGRiIGFuZCBhZGRpYi4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IGNtcGIgYW5kIGNtcGliIGVudHJpZXMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgZW50cmllcyBmb3IgY21wYiBhbmQgY21waWIuCi0KLVRodSBPY3QgIDcgMDA6MTI6MjUgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBBZGQgZmxhZyBSRVNUUklDVEVEX05VTTMgZm9yIGltbTMgb3BlcmFuZHMuCi0KLVRodSBTZXAgMjMgMDc6MDg6MzggMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCAiY2FsbCIgYW5kICJyZXQiLiAgQ2xlYW4gdXAgImIiLCAiYnZlIgotCWFuZCAiYmUiIHVzaW5nIGNvbXBsZXRlciBwcmVmaXhlcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIGluaXRpYWxpemVycyB0byBzaWxlbmNlIGNvbXBpbGVyLgotCi0JKiBocHBhLmg6IFVwZGF0ZSBjb21tZW50cyBhYm91dCBjaGFyYWN0ZXIgdXNhZ2UuCi0KLU1vbiBTZXAgMjAgMDM6NTU6MzEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggbWlub3IgdGhpbmtvcyBpbnRyb2R1Y2VkIHdoaWxlIGNsZWFuaW5nCi0JdXAgdGhlIG5ldyBmc3R3ICYgYnZlIGluc3RydWN0aW9ucy4KLQotU3VuIFNlcCAxOSAxMDo0MDo1OSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCByZW1haW5pbmcgUEEyLjAgaW50ZWdlciBsb2FkL3N0b3JlCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgcmVtYWluaW5nIFBBMi4wIEZQIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgbG9uZyBvZmZzZXQgZG91YmxlIHdvcmQgbG9hZC9zdG9yZQotCWluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIEZMQUdfU1RSSUNUIHZhcmlhbnRzIG9mIEZQIGxvYWRzIGFuZAotCXN0b3Jlcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogSGFuZGxlIFBBMi4wIGZjbnYsIGZjbXAgYW5kIGZ0ZXN0IGluc25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaW5pc2ggc3VwcG9ydCBmb3IgUEEyLjAgImIiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogSGFuZGxlIFBBMi4wICJidmUiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIG5ldyBzeW50YXggImJlIiBpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE5vdGUgdXNlIG9mICdNJyBhbmQgJ0wnLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgc3VwcG9ydCBmb3IgImIsbCIuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciAiYixnYXRlIi4KLQotU2F0IFNlcCAxOCAxMTo0MToxNiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IFVzZSAnZlgnIGZvciBmaXJzdCByZWdpc3RlciBvcGVyYW5kCi0JaW4geG1weXUuICAKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IG1hc2sgZm9yIHByb2JlIGFuZCBwcm9iZWkuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciBkZXB3aS4KLQotVHVlIFNlcCAgNyAxMzo0NDoyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCAiYWRkaWwiIHZhcmlhbnQgd2hpY2ggaGFzIHRoZSAlcjEgYXMKLQlhbiBleHBsaWNpdCBvdXRwdXQgYXJndW1lbnQuCi0KLU1vbiBTZXAgIDYgMDQ6NDE6NDIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCBzdHJpY3QgdmFyaWFudHMgb2YgUEExLjAvUEExLjEgbG9hZHMgYW5kIHN0b3Jlcy4KLQlBZGQgYSBmZXcgUEEyLjAgbG9hZHMgYW5kIHN0b3JlIHZhcmlhbnRzLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLmg6IE5ldyBmaWxlLgotCi0xOTk5LTA4LTI5ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBNb3ZlICVzdCB0byB0b3Agb2YgdGFibGUsIGFuZCBzcGxpdCBvZmYKLQlvdGhlciBmcCByZWcgZW50cmllcy4KLQkoaTM4Nl9mbG9hdF9yZWd0YWIpOiBUbyBoZXJlLgotCi1TYXQgQXVnIDI4IDAwOjI1OjI1IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBSZXBsYWNlICdmJyBieSAndicuICBQcmVmaXggZmxvYXQgcmVnaXN0ZXIgYXJncwotCWJ5ICdmJy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIGV4dHJkLCBleHRydywgZGVwZCwgZGVwZGksIGRlcHcsIGRlcHdpLgotCUFkZCBzdXBwb3J0aW5nIGFyZ3MuCi0KLQkqIGhwcGEuaDogIERvY3VtZW50IG5ldyBjb21wbGV0ZXJzIGFuZCBhcmdzLgotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCA2NCBiaXQgcGF0dGVybnMgYW5kIHBhMi4wIHN5bnRheCBmb3IgdXhvciwKLQl1YWRkY20sIGRjb3IsIGFkZGksIGFkZCwgc3ViLCBzdWJpLCBzaGxhZGQsIHJmaSwgYW5kIHByb2JlLiAgQWRkIHBhMi4wCi0JZXh0ZW5zaW9ucyBmb3Igc3NtLCByc20sIHBkdGxiLCBwaXRsYi4gIEFkZCBwZXJmb3JtYW5jZSBpbnN0cnVjdGlvbnMKLQlwbWVuYiBhbmQgcG1kaXMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgcGEyLjAgaW5zdHJ1Y3Rpb25zIGhhZGQsIGhzaGwsCi0JaHNociwgaHN1YiwgbWl4aCwgbWl4dywgcGVybWguCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IENoYW5nZSBjb21wbGV0ZXJzIGluIGluc3RydWN0aW9ucyB0bwotCXVzZSAnYycgcHJlZml4LgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIHBvcGJ0cywgbmV3IGZvcm1zIG9mIGJiLCBoYXZnLAotCWhzaGxhZGQsIGhzaHJhZGQsIHNocnBkLCBhbmQgc2hycHcgaW5zdHJ1Y3Rpb25zLiAgVXBkYXRlIGFyZyBjb21tZW50cy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIENoYW5nZSBmbXB5ZmFkZCwgZm1weW5mYWRkLCBmbmVnLAotCWZuZWdhYnMgdG8gdXNlICdJJyBpbnN0ZWFkIG9mICdGJy4KLQotMTk5OS0wOC0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IEFkZCBBTUQgYXRobG9uIGluc3RydWN0aW9ucywgcGZuYWNjLCBwZnBuYWNjLCBwc3dhcGQuCi0JRG9jdW1lbnQgcGYyaXcgYW5kIHBpMmZ3IGFzIGF0aGxvbiBpbnNucy4gIFJlbW92ZSBwc3dhcHcuCi0JQWxwaGFiZXRpY2FsbHkgc29ydCBQSUlJIGluc25zLgotCi1XZWQgQXVnIDE4IDE4OjE0OjQwIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX01BQ0hfSEFTX1ApOiBOZXcgbWFjcm8uCi0KLUZyaSBBdWcgIDYgMDk6NDY6MzUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCA2NCBiaXQgdmVyc2lvbnMgb2Ygb3IsIHhvciwgYW5kLAotCWFuZCBhbmRjbS4gIEFkZCAzMiBhbmQgNjQgYml0IHZlcnNpb24gb2YgY21wY2xyLCBjbXBpY2xyLgotCi0JKiBocHBhLmg6ICBEb2N1bWVudCA2NCBiaXQgY29uZGl0aW9uIGNvbXBsZXRlcnMuCi0KLVRodSBBdWcgIDUgMTY6NTY6MDcgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IENoYW5nZSBjb25kaXRpb24gYXJncyB0byB1c2UgJz8nIHByZWZpeC4KLQotMTk5OS0wOC0wNCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgRGVmYXVsdFNpemUgbW9kaWZpZXIgdG8gYWxsIGluc25zCi0JdGhhdCBpbXBsaWNpdGx5IG1vZGlmeSAlZXNwLiAgI3VuZGVmIGRfU3VmLCB4X3N1Ziwgc2xkX3N1ZiwKLQlzbGR4X3N1ZiwgYndsZF9TdWYsIGRfRlAsIHhfRlAsIHNsZF9GUCwgc2xkeF9GUCBhdCBlbmQgb2YgdGFibGUuCi0KLVdlZCBKdWwgMjggMDI6MDQ6MjQgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0JCQkgIEplZmYgTGF3IDxsYXdAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJwdXNobm9tIiBhbmQgInB1c2hidHMiLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBNYXJrIGFsbCBQQTIuMCBvcGNvZGVzIHdpdGggRkxBR19TVFJJQ1QuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBDaGFuZ2UgeG1weXUsIGZtcHlmYWRkLCAKLQlhbmQgZm1weW5mYWRkIHRvIHVzZSAnSicgYW5kICdLJyBpbnN0ZWFkIG9mICdFJyBhbmQgJ1gnLgotCi0xOTk5LTA3LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWRkICJ1bmRvY3VtZW50ZWQiIEFNRCAzRE5vdyEgcGYyaXcsIHBpMmZ3LCBwc3dhcHcgaW5zbnMuCi0KLVRodSBKdWwgIDEgMDA6MTc6MjQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHN0cnVjdCBwYV9vcGNvZGUpOiBBZGQgbmV3IGZpZWxkICJmbGFncyIuCi0JKEZMQUdTX1NUUklDVCk6IERlZmluZS4KLQotRnJpIEp1biAyNSAwNDoyMjowNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQkJCSAgSmVmZiBMYXcgPGxhd0BjeWdudXMuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgcGEyLjAgY2xyYnRzIGluc3RydWN0aW9uLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgZW50cmllcyBmb3IgbWZpYSBhbmQgbXRzYXJjbSBpbnN0cnVjdGlvbnMuCi0KLTE5OTktMDYtMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBbGxvdyBgbCcgc3VmZml4IG9uIGJzd2FwLiAgQWxsb3cgYHcnIHN1ZmZpeCBvbiBhcnBsLAotCWxsZHQsIGxtc3csIGx0ciwgc3RyLCB2ZXJyLCB2ZXJ3LiAgQWRkIEZQIGZsYWcgdG8gZmNtb3YqLiAgQWRkIEZQCi0JZmxhZyB0byBmY29taSBhbmQgZnJpZW5kcy4KLQotRnJpIE1heSAyOCAxNToyNjoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE1vdmUgaW50ZWdlciBhcml0aG1ldGljIGluc3RydWN0aW9ucyBhZnRlcgotCWludGVnZXIgbG9naWNhbCBpbnN0cnVjdGlvbnMuICAKLQotMTk5OS0wNS0yOCAgTGludXMgTm9yZGJlcmcgIDxsaW51cy5ub3JkYmVyZ0BjYW5pdC5zZT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgZm9ybWF0cyBgRScsIGBHJywgYEgnIGFuZCBuZXcgcGxhY2VzIGBOJywKLQlgbicsIGBvJy4KLQotCSogbTY4ay5oOiBEZWZpbmUgbWNmNTIwNmUsIG1jZjUzMDcsIG1jZi4gIERvY3VtZW50IG5ldyBmb3JtYXQgYHUnCi0JYW5kIG5ldyBwbGFjZXMgYG0nLCBgTScsIGBoJy4KLQotVGh1IE1heSAyNyAwNDoxMzo1NCAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzZXZlcmFsIHByb2Nlc3NvciBzcGVjaWZpYyBzeXN0ZW0KLQlpbnN0cnVjdGlvbnMuCi0KLVdlZCBNYXkgMjYgMTY6NTc6NDQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgc2Vjb25kIGVudHJ5IGZvciAiY29tYiIsICJjb21pYiIsIAotCSJhZGRiIiwgYW5kICJhZGRpYiIgdG8gYmUgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBhcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoUmV2ZXJzZU1vZHJtKTogUmVtb3ZlIGFsbCBvY2N1cmVuY2VzLgotCShJbnZNZW0pOiBBZGQgdG8gY29udHJvbC9kZWJ1Zy90ZXN0IG1vdiBpbnNucywgbW92aGxwcywgbW92bGhwcywKLQltb3Ztc2twcywgcGV4dHJ3LCBwbW92bXNrYiwgbWFza21vdnEuCi0JQ2hhbmdlIE5vU3VmIHRvIEZQIG9uIGFsbCBNTVgsIFhNTSBhbmQgQU1EIGluc25zIGFzIHRoZXNlIGFsbAotCWlnbm9yZSB0aGUgZGF0YSBzaXplIHByZWZpeC4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiLCBpMzg2X3JlZ3RhYik6IEFkZCBzdXBwb3J0IGZvciBQSUlJIFNJTUQuCi0JTW9zdGx5IHN0b2xlbiBmcm9tIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KLQotU2F0IE1heSAgOCAyMzoyNzozNSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV82NF9CUklER0UpOiBOZXcuCi0KLTE5OTktMDQtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFIpOiBEZWxldGUgbWVtYmVyIG51bV9ub25ib29scy4KLQkoQ0dFTl9BVFRSX1RZUEUpOiBVcGRhdGUuCi0JKENHRU5fQVRUUl9NQVNLKTogTnVtYmVyIGJvb2xlYW5zIHN0YXJ0aW5nIGF0IDAuCi0JKENHRU5fQVRUUl9WQUxVRSk6IFVwZGF0ZS4KLQkoQ0dFTl9JTlNOX0FUVFIpOiBVcGRhdGUuCi0KLU1vbiBBcHIgMTIgMjM6NDM6MjcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGZtcHlmYWRkLCBmbXB5bmZhZGQsIGZuZWcsIGZuZWdhYnMpOiBOZXcgUEEyLjAKLQlpbnN0cnVjdGlvbnMuCi0KLVR1ZSBNYXIgMjMgMTE6MjQ6MzggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJiLCBidmIpOiBUd2VhayBvcGNvZGUvbWFzay4KLQotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JU0EsQ0dFTl9NQUNIKTogTmV3IHR5cGVkZWZzLgotCShzdHJ1Y3QgY2dlbl9jcHVfZGVzYyk6IFJlbmFtZSBtZW1iZXIgbWFjaCB0byBtYWNocy4gIE5ldyBtZW1iZXIgaXNhcy4KLQlOZXcgbWVtYmVycyB3b3JkX2JpdHNpemUsZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuLWJpdHNpemUsCi0JbWluX2luc25fYml0c2l6ZSxtYXhfaW5zbl9iaXRzaXplLGlzYV90YWJsZSxtYWNoX3RhYmxlLHJlYnVpbGRfdGFibGVzLgotCURlbGV0ZSBtZW1iZXIgbWF4X2luc25fc2l6ZS4KLQkoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyk6IE5ldyBlbnVtLgotCShjcHVfb3Blbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGNwdV9vcGVuXzEpOiBEZWNsYXJlLgotCShjZ2VuX3NldF9jcHUpOiBEZWxldGUuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0hXX1RBQkxFKTogRGVsZXRlIGBudW1faW5pdF9lbnRyaWVzJyBtZW1iZXIuCi0JKENHRU5fT1BFUkFORF9OSUwpOiBOZXcgbWFjcm8uCi0JKENHRU5fT1BFUkFORCk6IE5ldyBtZW1iZXIgYHR5cGUnLgotCShAYXJjaEBfY2dlbl9vcGVyYW5kX3RhYmxlKTogRGVsZXRlIGRlY2wuCi0JKENHRU5fT1BFUkFORF9JTkRFWCxDR0VOX09QRVJBTkRfVFlQRSxDR0VOX09QRVJBTkRfRU5UUlkpOiBEZWxldGUuCi0JKENHRU5fT1BFUkFORF9UQUJMRSk6IE5ldyBzdHJ1Y3QuCi0JKGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSxjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSk6IERlY2xhcmUuCi0JKENHRU5fT1BJTlNUKTogUG9pbnRlciB0byBvcGVyYW5kIHRhYmxlIGVudHJ5IHJlcGxhY2VkIHdpdGggZW51bS4KLQkoQ0dFTl9DUFVfVEFCTEUpOiBOZXcgbWVtYmVyIGBpc2EnLiAgQ2hhbmdlIG1lbWJlciBgb3BlcmFuZF90YWJsZScsCi0Jbm93IGEgQ0dFTl9PUEVSQU5EX1RBQkxFLiAgQWRkIENHRU5fQ1BVX0RFU0MgYXJnIHRvCi0Je2dldCxzZXR9X3tpbnQsdm1hfV9vcGVyYW5kLgotCShAYXJjaEBfY2dlbl9jcHVfb3Blbik6IE5ldyBhcmcgYGlzYScuCi0JKGNnZW5fc2V0X2NwdSk6IERpdHRvLgotCi1GcmkgRmViIDI2IDAyOjM2OjQ1IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRmlsbCBpbiBjbW92IGFuZCBmY21vdiBhbHRlcm5hdGVzLiAgQWRkIGZjb21pIHNob3J0IGZvcm1zLgotCi0xOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoZW51bSBjZ2VuX2FzbV90eXBlKTogQWRkIENHRU5fQVNNX05PTkUuCi0JKENHRU5fSFdfRU5UUlkpOiBEZWxldGUgbWVtYmVyIGBuZXh0Jy4gIENoYW5nZSB0eXBlIG9mIGB0eXBlJyB0bwotCWVudW0gY2dlbl9od190eXBlLgotCShDR0VOX0hXX1RBQkxFKTogTmV3IHN0cnVjdC4KLQkoaHdfdGFibGUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKENHRU5fT1BFUkFORCk6IENoYW5nZSBtZW1iZXIgaHcgdG8gaHdfdHlwZSwgY2hhbmdlIHR5cGUgZnJvbSBwb2ludGVyCi0JdG8gdGFibGUgZW50cnkgdG8gZW51bS4KLQkoQ0dFTl9PUElOU1QpOiBEaXR0by4KLQkoQ0dFTl9DUFVfVEFCTEUpOiBDaGFuZ2UgbWVtYmVyIGh3X2xpc3QgdG8gaHdfdGFibGUuCi0KLVNhdCBGZWIgMTMgMTQ6MTM6NDQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoQVhQX09QQ09ERV9FVjYpOiBOZXcuCi0JKEFYUF9PUENPREVfTk9QQUwpOiBJbmNsdWRlIGl0LgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9DUFVfREVTQyk6IFJlbmFtZWQgZnJvbSBDR0VOX09QQ09ERV9ERVNDLgotCUFsbCB1c2VzIHVwZGF0ZWQuICBOZXcgbWVtYmVycyBpbnRfaW5zbl9wLCBtYXhfaW5zbl9zaXplLAotCXBhcnNlX29wZXJhbmQsaW5zZXJ0X29wZXJhbmQsZXh0cmFjdF9vcGVyYW5kLHByaW50X29wZXJhbmQsCi0Jc2l6ZW9mX2ZpZWxkcyxzZXRfZmllbGRzX2JpdHNpemUsZ2V0X2ludF9vcGVyYW5kLHNldF9pbnRfb3BlcmFuZCwKLQlnZXRfdm1hX29wZXJhbmQsc2V0X3ZtYV9vcGVyYW5kLHBhcnNlX2hhbmRsZXJzLGluc2VydF9oYW5kbGVycywKLQlleHRyYWN0X2hhbmRsZXJzLHByaW50X2hhbmRsZXJzLgotCShDR0VOX0FUVFIpOiBDaGFuZ2UgdHlwZSBvZiBudW1fbm9uYm9vbHMgdG8gdW5zaWduZWQgaW50LgotCShDR0VOX0FUVFJfQk9PTF9PRkZTRVQpOiBOZXcgbWFjcm8uCi0JKENHRU5fQVRUUl9NQVNLKTogU3VidHJhY3QgaXQgdG8gY29tcHV0ZSBiaXQgbnVtYmVyLgotCShDR0VOX0FUVFJfVkFMVUUpOiBSZWRvIGJvb2wvbm9uYm9vbCBhdHRyIGNhbGN1bGF0aW9uLgotCShjZ2VuX29wY29kZV9oYW5kbGVyKTogUmVuYW1lZCBmcm9tIGNnZW5fYmFzZS4KLQkoQ0dFTl9IV19BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fSFdfQVRUUiwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9PUEVSQU5EX0FUVFIsCi0JYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUEVSQU5EX0lOREVYKTogUmV3cml0ZSB0byB1c2UgdGFibGUgZW50cnksIG5vdCBnbG9iYWwuCi0JKGVudW0gY2dlbl9vcGluc3RfdHlwZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX29wZXJhbmRfaW5zdGFuY2VfdHlwZS4KLQkoQ0dFTl9JRkxEX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9JRkxEX0FUVFIsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BDT0RFLENHRU5fSUJBU0UpOiBOZXcgdHlwZXMuCi0JKENHRU5fSU5TTik6IFJld3JpdGUuCi0JKENHRU5fe0FTTSxESVN9X0hBU0gqKTogRGVsZXRlLgotCShpbml0X29wY29kZV90YWJsZSxpbml0X2libGRfdGFibGUpOiBEZWNsYXJlLgotCShDR0VOX0lOU05fQVRUUik6IE5ldyB0eXBlLgotCi1Nb24gRmViICAxIDIxOjA5OjE0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGkzODYuaCAoZF9TdWYsIHhfU3VmLCBzbGRfU3VmLCBzbGR4X1N1ZiwgYndsZF9TdWYpOiAgRGVmaW5lLgotICAgICAgICAoeF9GUCwgZF9GUCwgZGxzX0ZQLCBzbGR4X0ZQKTogIERlZmluZS4KLSAgICAgICAgQ2hhbmdlICpTdWYgZGVmaW5pdGlvbnMgdG8gaW5jbHVkZSB4IGFuZCBkIHN1ZmZpeGVzLgotICAgICAgICAobW92c3gpOiAgVXNlIHdfU3VmIGFuZCBiX1N1Zi4KLSAgICAgICAgKG1vdnp4KTogIExpa2V3aXNlLgotICAgICAgICAobW92cyk6ICBVc2UgYndsZF9TdWYuCi0gICAgICAgIChmbGQpOiAgQ2hhbmdlIG9yZGVyaW5nLiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZpbGQpOiAgQWRkIEludGVsIFN5bnRheCBlcXVpdmFsZW50IG9mIGZpbGRxLgotICAgICAgICAoZnN0KTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmaXN0KTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmc3RwKTogIFVzZSBzbGRfRlAuICBBZGQgeF9GUCB2ZXJzaW9uLgotICAgICAgICAoZmlzdHApOiAgTExvbmdNZW0gdmVyc2lvbiBmb3IgSW50ZWwgU3ludGF4LgotICAgICAgICAoZmNvbSwgZmNvbXApOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZhZGQsIGZpYWRkLCBmc3ViKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmc3Vicik6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZm11bCwgZmltdWwsIGZkdmksIGZpZGl2LCBmZGl2cik6ICBVc2Ugc2xkX0ZQLgotCi0xOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoZW51bSBjZ2VuX21vZGUpOiBBZGQgQ0dFTl9NT0RFX1RBUkdFVF9NQVgsIENHRU5fTU9ERV9JTlQsCi0JQ0dFTl9NT0RFX1VJTlQuCi0KLVNhdCBKYW4gMTYgMDE6Mjk6MjUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJ2KTogRml4IG1hc2suCi0KLTE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfVkFMVUVfVFlQRSk6IE5ldyB0eXBlZGVmLgotCShDR0VOX0FUVFIpOiBVc2UgaXQuCi0JKENHRU5fQVRUUl9UWVBFLENHRU5fQVRUUl9FTlRSWSk6IERpdHRvLgotCShDR0VOX0FUVFJfVEFCTEUpOiBOZXcgbWVtYmVyIGRmYXVsdC4KLQotMTk5OC0xMi0zMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTUlQUzE2X0lOU05fQlJBTkNIKTogTmV3LgotCi1XZWQgRGVjICA5IDEwOjM4OjQ4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBpcyBwYXJ0IG9mIGEgY2hhbmdlIG1hZGUgYnkgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBocHBhLmggKGNvbXBsZXRlcl9jaGFycyk6IGxpc3Qgb2YgY2hhcnMgdG8gbm90IHB1dCBhIHNwYWNlCi0gCWFmdGVyLgotCi1TdW4gRGVjICA2IDEzOjIxOjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUGVybWl0IHcgc3VmZml4IG9uIHByb2Nlc3NvciBjb250cm9sIGFuZAotIAlzdGF0dXMgd29yZCBpbnN0cnVjdGlvbnMuCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChzdHJ1Y3QgY2dlbl9od19lbnRyeSk6IERlbGV0ZSBjb25zdCBvbiBhdHRycyBtZW1iZXIuCi0JKHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkpOiBEaXR0by4KLQkoc3RydWN0IGNnZW5fb3BlcmFuZCk6IERpdHRvLgotCShDR0VOX0lGTEQpOiBOZXcgdHlwZWRlZiwgd2l0aCBhc3NvY2lhdGVkIGFjY2VzcyBtYWNyb3MuCi0JKENHRU5fSUZNVCk6IE5ldyB0eXBlZGVmLCB3aXRoIGFzc29jaWF0ZWQgYWNjZXNzIG1hY3Jvcy4KLQkoQ0dFTl9JRk1UKTogUmVuYW1lZCBmcm9tIENHRU5fRk9STUFULiAgTmV3IG1lbWJlciBgaWZsZHMnLgotCShDR0VOX0lWQUxVRSk6IE5ldyB0eXBlZGVmLgotCShzdHJ1Y3QgY2dlbl9pbnNuKTogRGVsZXRlIGNvbnN0IG9uIHN5bnRheCxhdHRycyBtZW1iZXJzLgotCWBmb3JtYXQnIG5vdyBwb2ludHMgdG8gZm9ybWF0IGRhdGEuICBUeXBlIG9mIGB2YWx1ZScgaXMgbm93Ci0JQ0dFTl9JVkFMVUUuCi0JKHN0cnVjdCBjZ2VuX29wY29kZV90YWJsZSk6IE5ldyBtZW1iZXIgaWZsZF90YWJsZS4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fZXh0cmFjdF9mbik6IFVwZGF0ZSB0eXBlIG9mIGBiYXNlX2luc24nIGFyZy4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IG1lbWJlciBgYXR0cnMnLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0Vfe0FUVFJTLEFUVFJ9KTogTmV3IG1hY3Jvcy4KLQkoY2dlbl9kaXNfbG9va3VwX2luc24pOiBVcGRhdGUgdHlwZSBvZiBgYmFzZV9pbnNuJyBhcmcuCi0JKGNnZW5fb3Bjb2RlX3RhYmxlKTogVXBkYXRlIHR5cGUgb2YgZGlzX2hhc2ggZm4uCi0JKGV4dHJhY3Rfb3BlcmFuZCk6IFVwZGF0ZSB0eXBlIG9mIGBpbnNuX3ZhbHVlJyBhcmcuCi0KLVRodSBPY3QgMjkgMTE6Mzg6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1ZFUlNJT05fe01BSk9SLE1JTk9SLEZJWExFVkVMfSk6IERlbGV0ZS4KLQotVHVlIE9jdCAyNyAwODo1Nzo1OSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX01VTFQpOiBBZGRlZC4KLQotVHVlIE9jdCAyMCAxMTozMTozNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoTUFYX01ORU1fU0laRSk6IFJlbmFtZSBmcm9tIE1BWF9PUENPREVfU0laRS4KLQotTW9uIE9jdCAxOSAxMjo1MDowMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fSU5UKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fSU5UX0lOU05fUCk6IFJlbmFtZWQgZnJvbSBDR0VOX0lOVF9JTlNOLgotCShDR0VOX0lOU05fQllURVMpOiBSZW5hbWVkIGZyb20gY2dlbl9pbnNuX3QuCi0JKENHRU5fSU5TTl9CWVRFU19QVFIpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9FWFRSQUNUX0lORk8pOiBOZXcgdHlwZWRlZi4KLQkoY2dlbl9pbnNlcnRfZm4sY2dlbl9leHRyYWN0X2ZuKTogVXBkYXRlLgotCShjZ2VuX29wY29kZV90YWJsZSk6IE5ldyBtZW1iZXIgYGluc25fZW5kaWFuJy4KLQkoYXNzZW1ibGVfaW5zbixsb29rdXBfaW5zbixsb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBVcGRhdGUuCi0JKGluc2VydF9vcGVyYW5kLGV4dHJhY3Rfb3BlcmFuZCk6IFVwZGF0ZS4KLQkoY2dlbl9nZXRfaW5zbl92YWx1ZSxjZ2VuX3B1dF9pbnNuX3ZhbHVlKTogQWRkIHByb3RvdHlwZXMuCi0KLUZyaSBPY3QgIDkgMTM6Mzg6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX0JPT0xTKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgQ0dFTl9IV19FTlRSWSk6IE5ldyBtZW1iZXIgYGF0dHJzJy4KLQkoQ0dFTl9IV19BVFRSKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IG1lbWJlciBgbmFtZScuCi0JKENHRU5fSU5TTl9JTlZBTElEX1ApOiBOZXcgbWFjcm8uCi0KLU1vbiBPY3QgIDUgMDA6MjE6MDcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCAiZmlkIi4KLQkKLVN1biBPY3QgIDQgMjE6MDA6MDAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JRnJvbSBSb2JlcnQgQW5kcmV3IERhbGUgPHJvYkBuYi5uZXQ+Ci0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgQU1EIDNETm93ISBpbnN0cnVjdGlvbnMuCi0JKEFNRF8zRE5PV19PUENPREUpOiBEZWZpbmUuCi0KLVR1ZSBTZXAgMjIgMTc6NTM6NDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChFSVRIRVJfQlVUX1BSRUZFUl9NVSk6IERlZmluZS4KLQotTW9uIEF1ZyAxMCAxNDowOTozOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faW5zbik6ICNpZiAwIG91dCBlbGVtZW50IGBjZHgnLgotCi1Nb24gQXVnICAzIDEyOjIxOjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JTW92ZSBhbGwgZ2xvYmFsIHN0YXRlIGRhdGEgaW50byBvcGNvZGUgdGFibGUgc3RydWN0LCBhbmQgdHJlYXQKLQlvcGNvZGUgdGFibGUgYXMgc29tZXRoaW5nIHRoYXQgaXMgIm9wZW5lZC9jbG9zZWQiLgotCSogY2dlbi5oIChDR0VOX09QQ09ERV9ERVNDKTogTmV3IHR5cGUuCi0JKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuKTogQWRkIHByb3RvdHlwZS4KLQkoY2dlbl9jdXJyZW50X21hY2hpbmUsY2dlbl9jdXJyZW50X2VuZGlhbik6IERlbGV0ZS4KLQkoQ0dFTl9PUENPREVfVEFCTEUpOiBOZXcgbWVtYmVycyBtYWNoLGVuZGlhbixvcGVyYW5kX3RhYmxlLAotCXBhcnNlX29wZXJhbmRfZm4sYXNtX2hhc2hfdGFibGUsYXNtX2hhc2hfdGFibGVfZW50cmllcywKLQlkaXNfaGFzaF90YWJsZSxkaXNfaGFzaF90YWJsZV9lbnRyaWVzLgotCShvcGNvZGVfb3BlbixvcGNvZGVfY2xvc2UpOiBBZGQgcHJvdG90eXBlcy4KLQotCSogY2dlbi5oIChjZ2VuX2luc24pOiBOZXcgZWxlbWVudCBgY2R4Jy4KLQotVGh1IEp1bCAzMCAyMTo0NDoyNSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfTEtSKTogTmV3IGZsYWcgZm9yICJsZWZ0LWtpbGxzLXJpZ2h0IiBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBKdWwgMjggMTA6NTk6MDcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCAibm9fbWF0Y2hfb3BlcmFuZHMiIGZpZWxkIGZvciBpbnN0cnVjdGlvbnMuCi0JKE1OMTAzMDBfTUFYX09QRVJBTkRTKTogRGVmaW5lLgotCi1GcmkgSnVsIDI0IDExOjQ0OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogRGVjbGFyZS4KLQotVHVlIEp1bCAyMSAxMzoxMjoxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1ZFUlNJT05fe01BSk9SLE1JTk9SLEZJWExFVkVMfSk6IERlZmluZS4KLQkoY2dlbl9pbnNlcnRfZm4sY2dlbl9leHRyYWN0X2ZuKTogTmV3IGFyZyBgcGMnLgotCShnZXRfb3BlcmFuZCxwdXRfb3BlcmFuZCk6IFJlcGxhY2VkIHdpdGggZ2V0X3tpbnQsdm1hfV9vcGVyYW5kLAotCXNldF97aW50LHZtYX1fb3BlcmFuZC4KLQotRnJpIEp1biAyNiAxMTowOTowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkICJtYWNoaW5lIiBmaWVsZCBmb3IgaW5zdHJ1Y3Rpb25zLgotCShNTjEwMywgQU0zMCk6IERlZmluZSBtYWNoaW5lIHR5cGVzLgotCQotRnJpIEp1biAxOSAxNjowOTowOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogVXNlIEZQLCBub3Qgc2xfU3VmLCBmb3IgZnhzYXZlIGFuZCBmeHJzdG9yLgotCi0xOTk4LTA2LTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgc3VwcG9ydCBmb3IgZnhzYXZlLCBmeHJzdG9yLCBzeXNlbnRlciBhbmQgc3lzZXhpdC4KLQotU2F0IEp1biAxMyAxMTozMTozNSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBnZW5lcmFsIGZvcm0gb2YgYWFkIGFuZCBhYW0uICBBZGQgdWQyYQotCWFuZCB1ZDJiLgotCShpMzg2X3JlZ3RhYik6IEFsbG93IGNyMC4uNywgZGIwLi43LCBkcjAuLjcsIHRyMC4uNywgbm90IGp1c3QKLQl0aG9zZSB0aGF0IGhhcHBlbiB0byBiZSBpbXBsZW1lbnRlZCBvbiBwZW50aXVtcy4KLQotVHVlIEp1biAgOSAxMjoxNjowMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIG9jY3VyZW5jZXMgb2YgRGF0YTE2IHRvIFNpemUxNiwgRGF0YTMyIHRvIFNpemUzMiwKLQlJZ25vcmVEYXRhU2l6ZSB0byBJZ25vcmVTaXplLiAgRmxhZyBhZGRyZXNzIGFuZCBkYXRhIHNpemUgcHJlZml4ZXMKLQl3aXRoIFNpemUxNnxJZ25vcmVTaXplIG9yIFNpemUzMnxJZ25vcmVTaXplLgotCi1Nb24gSnVuICA4IDEyOjE1OjUyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChSRVBORSk6IFJlbmFtZSB0byBSRVBORV9QUkVGSVhfT1BDT0RFLgotCShSRVBFKTogUmVuYW1lIHRvIFJFUEVfUFJFRklYX09QQ09ERS4KLQkoaTM4Nl9yZWd0YWJfZW5kKTogUmVtb3ZlLgotCShpMzg2X3ByZWZpeHRhYiwgaTM4Nl9wcmVmaXh0YWJfZW5kKTogUmVtb3ZlLgotCShpMzg2X29wdGFiKTogVXNlIE5VTEwgYXMgc2VudGluZWwgcmF0aGVyIHRoYW4gIiIgdG8gc3VpdCByZXdyaXRlCi0Jb2YgbWRfYmVnaW4uCi0JKE1BWF9PUENPREVfU0laRSk6IERlZmluZS4KLQkoaTM4Nl9vcHRhYl9lbmQpOiBSZW1vdmUuCi0JKHNsX1N1Zik6IERlZmluZS4KLQkoc2xfRlApOiBVc2Ugc2xfU3VmLgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBbGxvdyAxNiBiaXQgZGlzcGxhY2VtZW50IGZvciBgbW92Ci0JbWVtLGFjYycuICBDb21iaW5lIDE2IGFuZCAzMiBiaXQgZm9ybXMgb2YgdmFyaW91cyBpbnNucy4gIEFsbG93IDE2Ci0JYml0IGZvcm0gb2YgbGptcC4gIEFkZCBJc1ByZWZpeCBtb2RpZmllciB0byBwcmVmaXhlcy4gIEFkZCBhZGRyMzIsCi0JZGF0YTMyLCBkd29yZCwgYW5kIGFkd29yZCBwcmVmaXhlcy4KLQkoaTM4Nl9yZWd0YWIpOiBBZGQgQmFzZUluZGV4IG1vZGlmaWVyIHRvIHZhbGlkIDE2IGJpdCBiYXNlL2luZGV4Ci0JcmVncy4KLQotRnJpIEp1biAgNSAyMzo0Mjo0MyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBSZW1vdmUgQmFzZUluZGV4IG1vZGlmaWVyIGZyb20gZXNwLgotCi0JKiBpMzg2Lmg6IEFsbG93IGBsJyBzdWZmaXggb24gZmxkLCBmc3QsIGZzdHAsIGZjb20sIGZjb21wIHdpdGgKLQlyZWdpc3RlciBvcGVyYW5kcywgYmVjYXVzZSB0aGlzIGlzIGEgY29tbW9uIGlkaW9tLiAgRmxhZyB0aGVtIHdpdGgKLQlhIHdhcm5pbmcuICBBbGxvdyBpbGxlZ2FsIGZhZGRwLCBmc3VicCwgZnN1YnJwLCBmbXVscCwgZmRpdnAsCi0JZmRpdnJwIGJlY2F1c2UgZ2NjIGVycm9uZW91c2x5IGdlbmVyYXRlcyB0aGVtLiAgQWxzbyBmbGFnIHdpdGggYQotCXdhcm5pbmcuCi0KLQkqIGkzODYuaDogQWRkIHN1ZmZpeCBtb2RpZmllcnMgdG8gbW9zdCBpbnNucywgYW5kIHRpZ2h0ZXIgb3BlcmFuZAotCWNoZWNrcyBpbiBzb21lIGNhc2VzLiAgRml4IGEgbnVtYmVyIG9mIFVuaXhXYXJlIGNvbXBhdGliaWxpdHkKLQlpc3N1ZXMgd2l0aCBmbG9hdCBpbnNucy4gIE1lcmdlIHNvbWUgZmxvYXRpbmcgcG9pbnQgb3Bjb2RlcywgdXNpbmcKLQluZXcgRmxvYXRNRiBtb2RpZmllci4KLQkoV09SRF9QUkVGSVhfT1BDT0RFKTogUmVuYW1lIHRvIERBVEFfUFJFRklYX09QQ09ERSBmb3IKLQljb25zaXN0ZW5jeS4KLQotCSogaTM4Ni5oOiBDaGFuZ2Ugb2NjdXJlbmNlIG9mIFNob3J0Zm9ybVcgdG8gV3xTaG9ydEZvcm0uICBBZGQKLQlJZ25vcmVEYXRhU2l6ZSB3aGVyZSBhcHByb3ByaWF0ZS4KLQotV2VkIEp1biAgMyAxODoyODo0NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogKG9uZV9ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBSZW1vdmUuCi0JKHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBSZW1vdmUuCi0JKGkzODZfcmVndGFiKTogQWRkIEJhc2VJbmRleCB0byAzMiBiaXQgcmVncyByZWdfdHlwZS4KLQotRnJpIE1heSAxNSAxNTo1OTowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmVuYW1lZCBmcm9tIGNnZW5faHdfbG9va3VwLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBEZWNsYXJlLgotCi1UaHUgTWF5ICA3IDA5OjI3OjU4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoT1Bfe1NILE1BU0t9X0NPREUyKTogQWRkZWQgInEiIG9wZXJhbmQgZm9ybWF0IGZvciBsb3dlcgotCXRlbiBiaXRzIG9mIE1JUFMgSVNBMSAiYnJlYWsiIGluc3RydWN0aW9uLCBhbmQgZm9yICJzZGJicCIKLQotVGh1IE1heSAgNyAwMjoxNDowOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2FzbV9pbml0X3BhcnNlKTogRGVsZXRlLgotCShjZ2VuX3NhdmVfZml4dXBzLGNnZW5fcmVzdG9yZV9maXh1cHMsY2dlbl9zd2FwX2ZpeHVwcyk6IERlbGV0ZS4KLQkoY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyLGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogRGVsZXRlLgotCi1Nb24gQXByIDI3IDEwOjEzOjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9UWVBFKTogRGVsZXRlIGBjb25zdCcsIG1vdmVkIHRvIHVzZXMuCi0JKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoY2dlbl9pbnNuKTogTmV3IG1lbWJlcnMgbnVtLCBkYXRhLgotCShDR0VOX0lOU05fVEFCTEUpOiBNZW1iZXJzIGFzbV9oYXNoLCBhc21faGFzaF90YWJsZV9zaXplLAotCWRpc19oYXNoLCBkaXNfaGFzaF90YWJsZV9zaXplIG1vdmVkIHRvIC4uLgotCShDR0VOX09QQ09ERV9UQUJMRSkuICBIZXJlLiAgUmVuYW1lZCBmcm9tIENHRU5fT1BDT0RFX0RBVEEuCi0JQWxsIHVzZXMgdXBkYXRlZC4gIE5ldyBtZW1iZXJzIGFzbV9oYXNoX3AsIGRpc19oYXNoX3AuCi0JKENHRU5fTUlOU05fRVhQQU5TSU9OKTogTmV3IHN0cnVjdC4KLQkoY2dlbl9leHBhbmRfbWFjcm9faW5zbik6IERlY2xhcmUuCi0JKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IERlY2xhcmUuCi0JKGdldF9pbnNuX29wZXJhbmRzKTogVXBkYXRlIHByb3RvdHlwZS4KLQkobG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogRGVjbGFyZS4KLQotVHVlIEFwciAyMSAxNzoxMTozMiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IENoYW5nZSBpY2xyS2x1ZGdlIGFuZCBpbXVsS2x1ZGdlIHRvCi0JcmVnS2x1ZGdlLiAgQWRkIG9wZXJhbmRzIHR5cGVzIGZvciBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByIDIwIDE0OjQwOjI5IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChYKTogUmVuYW1lZCBmcm9tIGBaXycgdG8gcHJlc2VydmUgZm9ybWF0dGluZyBvZiBvcGNvZGUKLQl0YWJsZS4KLQotU3VuIEFwciAxOSAxMzo1NDowNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoWl8pOiBSZW5hbWVkIGZyb20gYF8nIHRvIGF2b2lkIGNsYXNoIHdpdGggY29tbW9uIGFsaWFzCi0JZm9yIGBnZXR0ZXh0Jy4KLQotRnJpIEFwciAgMyAxMjowNDo0OCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIE5vTW9kcm0gZmxhZyBmcm9tIGFsbCBpbnNuczogaXQncyBuZXZlciBjaGVja2VkLgotCUFkZCBJc1N0cmluZyBmbGFnIHRvIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0JKElTX1NUUklORyk6IERvbid0IGRlZmluZS4KLQkoTE9DS19QUkVGSVhfT1BDT0RFLCBDU19QUkVGSVhfT1BDT0RFLCBEU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCShFU19QUkVGSVhfT1BDT0RFLCBGU19QUkVGSVhfT1BDT0RFLCBHU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCShTU19QUkVGSVhfT1BDT0RFKTogRGVmaW5lLgotCi1Nb24gTWFyIDMwIDIxOjMxOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZXZlcnQgTWFyY2ggMjQgcGF0Y2g7IG5vIG1vcmUgTGluZWFyQWRkcmVzcy4KLQotTW9uIE1hciAzMCAxMDoyNTo1NCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFJlbW92ZSBmd2FpdCAoOWIpIGZyb20gYWxsIGZsb2F0aW5nIHBvaW50Ci0JaW5zdHJ1Y3Rpb25zLCBhbmQgaW5zdGVhZCBhZGQgRldhaXQgb3Bjb2RlIG1vZGlmaWVyLiAgQWRkIHNob3J0Ci0JZm9ybSBvZiBmbGRlbnYgYW5kIGZzdGVudi4KLQkoRldBSVRfT1BDT0RFKTogRGVmaW5lLgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBDaGFuZ2Ugc2Vjb25kIG9wZXJhbmQgY29uc3RyYWludCBvZiBgbW92Ci0Jc3JlZyxyZWd8bWVtJyBpbnN0cnVjdGlvbiBmcm9tIFJlZzE2fE1lbSB0byBXb3JkUmVnfFdvcmRNZW0gdG8KLQlhbGxvdyBsZWdhbCBpbnN0cnVjdGlvbnMgc3VjaCBhcyBgbW92bCAlZ3MsJWVzaScKLQotRnJpIE1hciAyNyAxODozMDo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmg6IFZhcmlvdXMgY2hhbmdlcyB0byBmdWxseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotVHVlIE1hciAyNCAxODozMjo0NyAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGkzODYuaDogU2V0IExpbmVhckFkZHJlc3MgZm9yIGxpZHQgYW5kIGxnZHQuCi0KLU1vbiBNYXIgIDIgMTA6NDQ6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9CT09MX0FUVFIpOiBOZXcgbWFjcm8uCi0KLVRodSBGZWIgMjYgMTU6NTQ6MzEgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19ERUxBWSk6IE5ldyBmbGFnIGZvciBkZWxheWVkIGJyYW5jaGVzL2p1bXBzLgotCi1Nb24gRmViIDIzIDEwOjM4OjIxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQ0FUMyk6IERlbGV0ZS4gIFVzZSBDT05DQVQzIG5vdy4KLQkoY2dlbl9pbnNuKTogUmVjb3JkIHN5bnRheCBhbmQgZm9ybWF0IGVudHJpZXMgaGVyZSwgcmF0aGVyIHRoYW4KLQlzZXBhcmF0ZWx5LgotCi1UdWUgRmViIDE3IDIxOjQyOjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCk6IE5ldyBtYWNyby4KLQotVHVlIEZlYiAxNyAxNjowMDo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2luc2VydF9mbik6IENoYW5nZSB0eXBlIG9mIHJlc3VsdCB0byBjb25zdCBjaGFyICouCi0JKGNnZW5fcGFyc2Vfe3NpZ25lZCx1bnNpZ25lZH1faW50ZWdlcik6IERlbGV0ZSBtaW4sbWF4IGFyZ3VtZW50cy4KLQkoQ0dFTl97SU5TTixLRVlXT1JELE9QRVJBTkR9X05CT09MX0FUVFJTKTogUmVuYW1lZCBmcm9tIC4uLl9NQVhfQVRUUlMuCi0KLVRodSBGZWIgMTIgMTg6MzA6NDEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChsb29rdXBfaW5zbik6IE5ldyBhcmd1bWVudCBhbGlhc19wLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiBkMTB2LmggKE9QRVJBTkRfQUNDKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9BQ0MwLCBPUEVSQU5EX0FDQzEpIC4KLQkoT1BFUkFORF9HUFIpOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTEgMTc6MzE6NTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9GSUVMRFMpOiBEZWZpbmUgaGVyZS4KLQkoQ0dFTl9IV19FTlRSWSk6IE5ldyBtZW1iZXIgYHR5cGUnLgotCShod19saXN0KTogRGVsZXRlIGRlY2wuCi0JKGVudW0gY2dlbl9tb2RlKTogRGVjbGFyZS4KLQkoQ0dFTl9PUEVSQU5EKTogTmV3IG1lbWJlciBgaHcnLgotCShlbnVtIGNnZW5fb3BlcmFuZF9pbnN0YW5jZV90eXBlKTogRGVjbGFyZS4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFKTogTmV3IHR5cGUuCi0JKENHRU5fSU5TTik6IE5ldyBtZW1iZXIgYG9wZXJhbmRzJy4KLQkoQ0dFTl9PUENPREVfREFUQSk6IE1ha2UgaHdfbGlzdCBjb25zdC4KLQkoZ2V0X2luc25fb3BlcmFuZHMsbG9va3VwX2luc24pOiBBZGQgcHJvdG90eXBlcyBmb3IuCi0KLVR1ZSBGZWIgIDMgMTc6MTE6MjMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9JTlNOX0FUVFJTLgotCShDR0VOX0hXX0VOVFJZKTogTW92ZSBgbmV4dCcgZW50cnkgdG8gZW5kIG9mIHN0cnVjdC4KLQkoQ0dFTl9LRVlXT1JEX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9LRVlXT1JEX0FUVFJTLgotCShDR0VOX09QRVJBTkRfTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX09QRVJBTkRfQVRUUlMuCi0KLU1vbiBGZWIgIDIgMTk6MTk6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50IGVuZCBtYXJrZXIuCi0KLU1vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAuaDogTmV3IGZpbGUuCi0KLVRodSBKYW4gMjIgMTc6NTQ6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBBZGQgcHJvdG90eXBlcyBmb3IgY2dlbl9zYXZlX2ZpeHVwcygpLAotCWNnZW5fcmVzdG9yZV9maXh1cHMoKSwgYW5kIGNnZW5fc3dhcF9maXh1cHMoKS4gIENoYW5nZSBwcm90b3R5cGUKLQlvZiBjZ2VuX2FzbV9maW5pc2hfaW5zbigpIHRvIHJldHVybiBhIGNoYXIgKi4KLQotV2VkIEphbiAxNCAxNzoyMTo0MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IEZvcm1hdHRpbmcgY2hhbmdlcyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgotCi1Nb24gSmFuIDEyIDExOjM3OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKCopOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShDR0VOX0FUVFIpOiBNYWtlIHVuc2lnbmVkIGNoYXIuCi0JKENHRU5fQVRUUl9UWVBFKTogVXBkYXRlLgotCShDR0VOX0FUVFJfe0VOVFJZLFRBQkxFfSk6IE5ldyB0eXBlcy4KLQkoY2dlbl9iYXNlKTogTW92ZSBtZW1iZXIgYGF0dHJzJyB0byBjZ2VuX2luc24uCi0JKENHRU5fS0VZV09SRCk6IE5ldyBtZW1iZXIgYG51bGxfZW50cnknLgotCShDR0VOX3tTWU5UQVgsRk9STUFUfSk6IE5ldyB0eXBlcy4KLQkoY2dlbl9pbnNuKTogRm9ybWF0IGFuZCBzeW50YXggc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlci4KLQotVHVlIERlYyAxNiAxNToxNTo1MiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChkMzB2X29wY29kZSk6IFJlb3JkZXIgZmxhZ3Mgc29tZXdoYXQsIGFkZCBuZXcgZmxhZ3MgZm9yCi0JMiB3b3JkIGxvYWQvc3RvcmUsIEFERHBwcC9TVUJwcHAsIDE2LzMyIGJpdCBtdWx0aXBseS4gIE1ha2UKLQlmbGFnc197dXNlZCxzZXR9IGxvbmcuCi0JKGQzMHZfb3BlcmFuZCk6IE1ha2UgZmxhZ3MgZmllbGQgbG9uZy4KLQotTW9uIERlYyAgMSAxMjoyNDo0NCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay5oOiBGaXggY29tbWVudCBkZXNjcmliaW5nIG9wZXJhbmQgdHlwZXMuCi0KLVN1biBOb3YgMjMgMjI6MzE6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoU0hPUlRfQ01QVSk6IEFkZCBjYXNlIGZvciBjbXB1IGluc3RydWN0aW9uLCBhbmQgbW92ZQotCWV2ZXJ5dGhpbmcgZWxzZSBhZnRlciBkb3duLgotCi1UdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYuaCAoT1BFUkFORF9GTEFHKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9GRkxBRywgT1BFUkFORF9DRkxBRykgLgotCi1UaHUgTm92IDEzIDExOjA0OjI0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IENoYW5nZWQgY29tbWVudHMgdG8gcmVmbGVjdCBuZXcKLQlmaWVsZCB1c2FnZS4KLQotRnJpIE9jdCAyNCAyMjozNjoyMCAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGRlZCB0byBjb21tZW50cyBhIHF1aWNrLXJlZiBsaXN0IG9mIGFsbCBhc3NpZ25lZAotCW9wZXJhbmQgdHlwZSBjaGFyYWN0ZXJzLgotCShPUF97TUFTSyxTSH1fUEVSRlJFRyk6IE5ldyBtYWNyb3MuCi0KLVdlZCBPY3QgMjIgMTc6Mjg6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogQWRkICdfJyBhbmQgJy8nIGZvciB2OWEgYXNyJ3MuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+Ci0KLVR1ZSBPY3QgMTQgMTM6MjI6MjkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBCaXQgb3BzIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzIG5vdCBpbiB0aGUgOCBiaXQKLQlhcmVhIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSBiYXNlIG1vZGVsIChIOC8zMDApLgotCi1UaHUgU2VwIDI1IDEzOjAzOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBSZW1vdmUgZG9jdW1lbnRhdGlvbiBvZiBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDE5OjAwOjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBxIGFuZCB2IG9wZXJhbmQgc3BlY2lmaWVycy4KLQotTW9uIFNlcCAxNSAxODoyODozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IEFkZCBwcm9jZXNzb3JzIGZpZWxkLgotCShQUk9DRVNTT1JfVjg1MCwgUFJPQ0VTU09SX0FMTCk6IE5ldyBiaXQgY29uc3RhbnRzLgotCShQUk9DRVNTT1JfVjg1MEUsIFBST0NFU1NPUl9OT1RfVjg1MCk6IE5ldyBiaXQgY29uc3RhbnRzLgotCShQUk9DRVNTT1JfVjg1MEVBKTogTmV3IGJpdCBjb25zdGFudHMuCi0KLU1vbiBTZXAgMTUgMTE6Mjk6NDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGQzMHYuaDogQWxsb3cgdXAgdG8gNjQgY29udHJvbCByZWdpc3RlcnMuIEFkZAotCVNIT1JUX0E1UyBmb3JtYXQuCi0KLQkqIGQzMHYuaCAoTE9OR19EYik6IE5ldyBmb3JtIGZvciBkZWxheWVkIGJyYW5jaGVzLgotCi0JKiBkMzB2Lmg6IChMT05HX0RiKTogTmV3IGZvcm0gZm9yIHJlcGVhdGkuCi0KLQkqIGQzMHYuaCAoU0hPUlRfRDJCKTogTmV3IGZvcm0uCi0KLQkqIGQzMHYuaCAoU0hPUlRfQTIpOiBOZXcgZm9ybS4KLQotCSogZDMwdi5oIChPUEVSQU5EXzJSRUcpOiBBZGQgbmV3IG9wZXJhbmQgdG8gaW5kaWNhdGUgMgotCXJlZ2lzdGVycyBhcmUgdXNlZC4gIE5lZWRlZCBmb3IgVkxJVyBvcHRpbWl6YXRpb24uCi0KLU1vbiBTZXAgIDggMTQ6MDU6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBNb3ZlIGFzc2VtYmxlciBpbnRlcmZhY2Ugc2VjdGlvbgotCXVwIHNvIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgaXMgZGVmaW5lZCBmb3IgY2dlbl9wYXJzZV9hZGRyZXNzLgotCShjZ2VuX3BhcnNlX2FkZHJlc3MpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1UdWUgU2VwICAyIDE1OjMyOjMyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9PUFJFQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkpOiBSZW1vdmVkLgotCi1UdWUgQXVnIDI2IDEyOjIxOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oICh0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogQ29ycmVjdCBiYXNlIHJlZ2lzdGVyIDUgaW4KLQltb2RlcyAxIGFuZCAyIHRvIGJlIHNzIHJhdGhlciB0aGFuIGRzLiAgRnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oOiBTZXQgdWQyIHRvIDB4MGYwYi4gIEZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaDogQ29tbWVudCBmaXhlcyBmb3IgZmljb21bcF0/e3MsbH0gZnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oIChKVU1QX09OX0NYX1pFUk8pOiBVbmNvbW1lbnQgKGRlZmluZSBhZ2FpbikuCi0JKEpVTVBfT05fRUNYX1pFUk8pOiBSZW1vdmUgY29tbWVudGVkIG91dCBtYWNyby4KLQotRnJpIEF1ZyAyMiAxMDozODoyOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfTk9UX1IwKTogTmV3IGZsYWcuCi0KLU1vbiBBdWcgMTggMTE6MDU6NTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBSZW1vdmUgZmxhZ3MgZmllbGQuCi0KLVdlZCBBdWcgMTMgMTg6NDU6NDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBBZGQgZmxhZ3MgZmllbGQuCi0JKHN0cnVjdCB2ODUwX29wZXJhbmQpOiBFeHRlbmQgbWVhbmluZyBvZiAnYml0cycgYW5kICdzaGlmdCcKLQlmaWVsZHMuCi0JKFY4NTBFX0lOU1RSVUNUSU9OLCBWODUwRUFfSU5TVFJVQ1RJT04pOiBOZXcgZmxhZ3MuCi0JKFY4NTBFX1BVU0hfUE9QLCBWODUwRV9JTU1FRElBVEUxNiwgVjg1MEVfSU1NRURJQVRFMzIpOiBOZXcgZmxhZ3MuCi0KLUZyaSBBdWcgIDggMTY6NTg6NDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDI0IDIxOjE2OjU4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZXMpOiBEZWNsYXJlIGFzIGNvbnN0LgotCi1UaHUgSnVsIDEwIDEyOjUzOjI1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChGUF9TLCBGUF9EKTogRGVmaW5lLiAgQml0bWFza3MgaW5kaWNhdGluZyBpZiBhbiBpbnNuCi0JdXNlcyBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCByZXNvdXJjZXMuCi0JKElOU05fTk9fSVNBLCBJTlNOX0lTQTEpOiBEZWZpbmUuCi0JKGNwdSBzcGVjaWZpYyBJTlNOIG1hY3Jvcyk6IFR3ZWFrIGludG8gYml0bWFza3Mgb3V0c2lkZSB0aGUgcmFuZ2UKLQlvZiBJTlNOX0lTQSBmaWVsZC4KLQotTW9uIEp1biAxNiAxNDoxMDowMCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2Lmg6IEZpeCBwYW5kIG9wY29kZS4KLQotTW9uIEp1biAgMiAxMTozNTowOSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBXaWRlbiBJTlNOX0lTQSBhbmQgbW92ZSBpdCB0byBhIG1vcmUgY29udmVuaWVudAotCWJpdCBwb3NpdGlvbi4gIEFkZCBJTlNOXzM5MDAuCi0KLVR1ZSBNYXkgMjAgMTE6MjU6MjkgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogYWRkZWQgbmV3IGZpZWxkIG1lbWJlcnNoaXAuCi0KLU1vbiBNYXkgMTIgMTY6MjY6NTAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oIChtb3ZkKTogb25seSBSZWczMiBpcyBhbGxvd2VkLgotCi0JKiBpMzg2Lmg6IGFkZCBmY29tcCBhbmQgdWQyLiAgRnJvbSBXYXluZSBTY290dAotCTx3c2NvdHRAaWNoaXBzLmludGVsLmNvbT4uCi0KLU1vbiBNYXkgIDUgMTc6MTY6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBNTVggaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTWF5ICA1IDEyOjQ1OjE5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIFcgbW9kaWZpZXIgZnJvbSBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAxNCAxNDo1Njo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIHRoZSBvcGNvZGVzIGZvciBmc3VicCwgZnN1YnJwLCBmZGl2cCwgYW5kIGZkaXZycAotCXdpdGggbm8gYXJndW1lbnRzIHRvIG1hdGNoIHRoYXQgZ2VuZXJhdGVkIGJ5IHRoZSBVbml4V2FyZQotCWFzc2VtYmxlci4KLQotVGh1IEFwciAxMCAxNDozNTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKDxjcHU+X2NnZW5fYXNzZW1ibGVfaW5zbik6IE5ldyBhcmcgZm9yIGVycm1zZy4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKTogRGVjbGFyZS4KLQkoY2dlbl9pbml0X3BhcnNlX29wZXJhbmQpOiBEZWNsYXJlLgotCShjZ2VuX3BhcnNlX29wZXJhbmQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcGFyc2Vfb3BlcmFuZCwKLQluZXcgYXJndW1lbnQgYHdhbnQnLgotCShlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcmVzdWx0LgotCShlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlKTogTmV3IGVudW0uCi0KLVNhdCBBcHIgIDUgMTM6MTQ6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJldmVydCBsYXN0IHBhdGNoIGZvciB0aGUgTk9OX0JST0tFTl9PUENPREVTIGNhc2VzLgotCi1GcmkgQXByICA0IDExOjQ2OjExIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogTmV3IGZpbGUuCi0KLUZyaSBBcHIgIDQgMTQ6MDI6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENvcnJlY3Qgb3Bjb2RlIHZhbHVlcyBmb3IgZnN1YnAsIGZzdWJycCwgZmRpdnAsIGFuZAotCWZkaXZycC4KLQotVHVlIE1hciAyNSAyMjo1NzoyNiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLmggKGV4dHJhY3QpOiAgTWFrZSB1bnNpZ25lZC4KLQotTW9uIE1hciAyNCAxNDozODoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIGljbHIuCi0KLVRodSBNYXIgMjAgMTk6NDk6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENoYW5nZSBEVyB0byBXIGZvciBjbXB4Y2hnIGFuZCB4YWRkLCBzaW5jZSB0aGV5IGRvbid0Ci0JdGFrZSBhIGRpcmVjdGlvbiBiaXQuCi0KLVNhdCBNYXIgMTUgMTk6MDM6MjkgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IFVzZSBmdWxsIHByb3RvdHlwZS4KLQotRnJpIE1hciAxNCAxNToyMjowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmg6IEluY2x1ZGUgPGFuc2lkZWNsLmg+LiAgVXBkYXRlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0bwotCXVzZSBwcm90b3R5cGVzLCBhbmQgdG8gdXNlIGNvbnN0IHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRodSBNYXIgIDYgMTQ6MTg6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRUxBWCk6IERlZmluZS4KLQotTW9uIEZlYiAyNCAxNToxNTo1NiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWFjcm9zIGZvciBjb3AwLCBjb3AxIGNvcDIgYW5kIGNvcDMuCi0JQ2hhbmdlIG1pcHNfb3Bjb2RlcyBmcm9tIGNvbnN0IGFycmF5IHRvIGEgcG9pbnRlciwKLQlhbmQgY2hhbmdlIGJmZF9taXBzX251bV9vcGNvZGVzIGZyb20gY29uc3QgaW50IHRvIGludCwKLQlzbyB0aGF0IHdlIGNhbiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBvcGNvZGVzIHRhYmxlCi0JZHluYW1pY2FsbHkuCi0KLUZyaSBGZWIgMjEgMTY6MzQ6MTggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19YKTogUmVtb3ZlIHVudXNlZCBmbGFnLgotCi1UdWUgRmViIDE4IDE3OjM3OjIwIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCi1GcmkgRmViIDE0IDEzOjE2OjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChQRFNfTkFNRSk6IE1hY3JvIHRvIGFjY2VzcyBuYW1lIGZpZWxkIG9mIHByZWRlZmluZWQgc3ltYm9scy4KLQkoUERTX1ZBTFVFKTogTWFjcm8gdG8gYWNjZXNzIHZhbHVlIGZpZWxkIG9mIHByZWRlZmluZWQgc3ltYm9scy4KLQkodGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCk6IEFkZCBwcm90b3R5cGUuCi0KLU1vbiBGZWIgMTAgMTA6MzI6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IENoYW5nZSBwcm90b3R5cGUgdG8gbWF0Y2gKLQljaGFuZ2UgaW4gZnVuY3Rpb24sIGFkZGVkIGNsYXNzIHBhcmFtZXRlci4KLQotVGh1IEZlYiAgNiAxNzozMDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9FTkRNQVNLKTogQWRkIGZvciBmbGFnZ2luZyBUSWM4MAotCWVuZG1hc2sgZmllbGRzLCB3aGljaCBhcmUgc29tZXdoYXQgd2VpcmQgaW4gdGhhdCAwIGFuZCAzMiBhcmUKLQl0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUuCi0KLVRodSBKYW4gMzAgMTM6NDY6MTggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IENoYW5nZSBhbGwgdGhlIE9QRVJBTkQgZGVmaW5lcyB0byB1c2UgdGhlIGZvcm0gKDEgPDwgWCkKLQlyYXRoZXIgdGhhbiBhIGNvbnN0YW50IHRoYXQgaXMgMioqWC4gIFJlb3JkZXIgdGhlbSB0byBwdXQgYml0cyBmb3IKLQlvcGVyYW5kcyB0aGF0IGhhdmUgc3ltYm9saWMgbmFtZXMgaW4gdGhlIHVwcGVyIGJpdHMsIHNvIHRoZXkgY2FuCi0JYmUgcGFja2VkIGludG8gYW4gaW50IHdoZXJlIHRoZSBsb3dlciBiaXRzIGNvbnRhaW4gdGhlIHZhbHVlIHRoYXQKLQljb3JyZXNwb25kcyB0byB0aGF0IHN5bWJvbGljIG5hbWUuCi0JKHByZWRlZmluZWRfc3ltYm8pOiBBZGQgc3RydWN0LgotCSh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWNsYXJlIGFycmF5IG9mIHRyYW5zbGF0aW9ucy4KLQkodGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyk6IERlY2xhcmUgc2l6ZSBvZiB0aGF0IGFycmF5LgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBEZWNsYXJlIGZ1bmN0aW9uLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBEZWNsYXJlIGZ1bmN0aW9uLgotCi1XZWQgSmFuIDI5IDA5OjM3OjI1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oIChNTjEwMjAwX09QRVJBTkRfUkVMQVgpOiBEZWZpbmUuCi0KLVNhdCBKYW4gMTggMTU6MTg6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX05PX1IwX0RFU1QpOiBBZGQgZm9yIG9wY29kZXMgd2hlcmUgcjAgY2Fubm90Ci0JYmUgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgotCi1UaHUgSmFuIDE2IDIwOjQ4OjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChzdHJ1Y3QgdGljODBfb3Bjb2RlKTogQ2hhbmdlICJmb3JtYXQiIGZpZWxkIHRvICJmbGFncyIuCi0JKEZNVF9VTlVTRUQsIEZNVF9TSSwgRk1UX0xJLCBGTVRfUkVHKTogRGVsZXRlLgotCShUSUM4MF9WRUNUT1IpOiBEZWZpbmUgYSBmbGFnIGJpdCBmb3IgdGhlIGZsYWdzLiAgVGhpcyBvbmUgbWVhbnMKLQl0aGF0IHRoZSBvcGNvZGUgY2FuIGhhdmUgdHdvIHZlY3RvciBpbnN0cnVjdGlvbnMgaW4gYSBzaW5nbGUKLQkzMiBiaXQgd29yZCBhbmQgd2UgaGF2ZSB0byBlbmNvZGUvZGVjb2RlIGJvdGguCi0KLVR1ZSBKYW4gMTQgMTk6Mzc6MDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfUENSRUwpOiBSZW5hbWVkIGZyb20KLQlUSUM4MF9PUEVSQU5EX1JFTEFUSVZFIGZvciBQQyByZWxhdGl2ZS4KLQkoVElDODBfT1BFUkFORF9CQVNFUkVMKTogTmV3IGZsYWcgYml0IGZvciByZWdpc3RlcgotCWJhc2UgcmVsYXRpdmUuCi0KLU1vbiBKYW4gMTMgMTU6NTY6MzggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfRkxPQVQpOiBBZGQgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLgotCi1Nb24gSmFuICA2IDEwOjUxOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX1NDQUxFRCk6IE9wZXJhbmQgbWF5IGhhdmUgb3B0aW9uYWwKLQkiOnMiIG1vZGlmaWVyIGZvciBzY2FsaW5nLgotCi1TdW4gSmFuICA1IDEyOjEyOjE5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX01fU0kpOiBBZGQgb3BlcmFuZCBtb2RpZmllciBmb3IgIjptIi4KLQkoVElDODBfT1BFUkFORF9NX0xJKTogRGl0dG8KLQotU2F0IEphbiAgNCAxOTowMjo0NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9CSVROVU0pOiBSZW5hbWVkIGZyb20gVElDODBfT1BFUkFORF9DQ19TWi4KLQkoVElDODBfT1BFUkFORF9DQyk6IE5ldyBkZWZpbmUgZm9yIGNvbmRpdGlvbiBjb2RlIG9wZXJhbmQuCi0JKFRJQzgwX09QRVJBTkRfQ1IpOiBOZXcgZGVmaW5lIGZvciBjb250cm9sIHJlZ2lzdGVyIG9wZXJhbmQuCi0KLUZyaSBKYW4gIDMgMTY6MjI6MjMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBOYW1lIGNoYW5nZWQuCi0JKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBSZW1vdmUgZm9ybWF0IGZpZWxkLgotCShzdHJ1Y3QgdGljODBfb3BlcmFuZCk6IEFkZCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLgotCShUSUM4MF9PUEVSQU5EXyopOiBSZW1vdmUgb2xkIGJvZ3VzIHZhbHVlcywgc3RhcnQgYWRkaW5nIG5ldwotCWNvcnJlY3Qgb25lcy4KLQkoRk1UXyopOiBEaXR0by4KLQotVHVlIERlYyAzMSAxNTowNTo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkpOiBOZXcgZmxhZyB0byBhZGp1c3QKLQl0eXBlIElWIGluc3RydWN0aW9uIG9mZnNldHMuCi0KLUZyaSBEZWMgMjcgMjI6MjM6MTAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE4IDEwOjA2OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oIChNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyk6IERlZmluZS4KLQotU2F0IERlYyAxNCAxMDo0ODozMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogbW4xMDIwMC5oOiBGaXggY29tbWVudCwgbW4xMDIwMF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0JKiBtbjEwMzAwLmg6IEZpeCBjb21tZW50LCBtbjEwMzAwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQkqIHY4NTAuaDogRml4IGNvbW1lbnQsIHY4NTBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCi1Nb24gRGVjICA5IDE2OjQ1OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC5oOiBGbGVzaCBvdXQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIGJ5Ci0JdGhlIG1uMTAyMDAgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyLgotCi1UdWUgTm92IDI2IDEwOjQ2OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWlwczE2IGRlZmluaXRpb25zLgotCi1Nb24gTm92IDI1IDE3OjU2OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyA8LCA+LCBtLCBuLCBvIGFuZCBwIG9wZXJhbmQgc3BlY2lmaWVycy4KLQotV2VkIE5vdiAyMCAxMDo1OTo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1BDUkVMKTogRGVmaW5lLgotCShNTjEwMzAwX09QRVJBTkRfTUVNQUREUik6IERlZmluZS4KLQotVHVlIE5vdiAxOSAxMzozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKTogRGVmaW5lLgotCi1XZWQgTm92ICA2IDEzOjQxOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfU1BMSVQpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDUgMTM6MjY6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCk6IERlZmluZS4KLQotTW9uIE5vdiAgNCAxMjo1Mjo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEKTogRGVmaW5lLgotCi1GcmkgTm92ICAxIDEwOjMxOjAyIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBEb24ndCBpbmNsdWRlICJiZmQuaCI7IHByaXZhdGUgcmVsb2NhdGlvbiB0eXBlcyBhcmUgbm93Ci0gCW5lZ2F0aXZlIHRvIG1pbmltaXplIHByb2JsZW1zIHdpdGggc2hhcmVkIGxpYnJhcmllcy4gIE9yZ2FuaXplCi0gCWluc3RydWN0aW9uIHN1YnNldHMgYnkgQU1BU0sgZXh0ZW5zaW9ucyBhbmQgUEFMY29kZQotIAlpbXBsZW1lbnRhdGlvbi4KLQkoc3RydWN0IGFscGhhX29wZXJhbmQpOiBNb3ZlIGZsYWdzIHNsb3QgZm9yIGJldHRlciBwYWNraW5nLgotCi1UdWUgT2N0IDI5IDEyOjE5OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfUkVMQVgpOiBOZXcgb3BlcmFuZCBmbGFnLgotCi1UaHUgT2N0IDEwIDE0OjI5OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChGTVRfKik6IE1vdmUgb3BlcmFuZCBmb3JtYXQgZGVmaW5pdGlvbnMKLQloZXJlLgotCi1UdWUgT2N0ICA4IDE0OjQ4OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUEFSRU4pOiBEZWZpbmUuCi0KLU1vbiBPY3QgIDcgMTY6NTI6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKG1uMTAzMDBfb3Bjb2RlKTogQWRkICJmb3JtYXQiIGZpZWxkLgotCShNTjEwMzAwX09QRVJBTkRfKik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDozMzo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAuaDogRGVsZXRlLgotCSogbW4xMDIwMC5oLCBtbjEwMzAwLmg6IE5ldyBmaWxlcy4KLQotV2VkIE9jdCAgMiAyMTozMToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAuaDogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMjcgMTg6MjY6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oOiAgQWRkIG5ldyBmbGFnIHRvIGluZGljYXRlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBhIFBDCi0JZGlzcGxhY2VtZW50LgotCi1GcmkgU2VwIDEzIDE0OjU4OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoc3RtYWMpOiBBZGQgbWlzc2luZyBpbnN0cnVjdGlvbi4KLQotU2F0IEF1ZyAzMSAxNjowMjowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAodjg1MF9vcGNvZGUpOiBSZW1vdmUgInNpemUiIGZpZWxkLiAgQWRkICJtZW1vcCIKLQlmaWVsZC4KLQotRnJpIEF1ZyAyMyAxMDozOTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX0VQKTogRGVmaW5lLgotCi0JKiB2ODUwLmggKHY4NTBfb3Bjb2RlKTogQWRkIHNpemUgZmllbGQuCi0KLVRodSBBdWcgMjIgMTY6NTE6MjUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHY4NTBfb3BlcmFuZHMpOiBBZGQgaW5zZXJ0IGFuZCBleHRyYWN0IGZpZWxkcywgcG9pbnRlcnMKLSAJdG8gZnVuY3Rpb25zIHVzZWQgdG8gaGFuZGxlIHVudXN1YWwgb3BlcmFuZCBlbmNvZGluZy4KLQkoVjg1MF9PUEVSQU5EX1JFRywgVjg1MF9PUEVSQU5EX1NSRywgVjg1MF9PUEVSQU5EX0NDLAotIAlWODUwX09QRVJBTkRfU0lHTkVEKTogRGVmaW5lZC4KLQotV2VkIEF1ZyAyMSAxNzo0NToxMCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAodjg1MF9vcGVyYW5kcyk6IEFkZCBmbGFncyBmaWVsZC4KLQkoT1BFUkFORF9SRUcsIE9QRVJBTkRfTlVNKTogRGVmaW5lZC4KLQotVHVlIEF1ZyAyMCAxNDo1MjowMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUuCi0KLUZyaSBBdWcgMTYgMTQ6NDQ6MTUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLmggKE9QX1NIX0xPQ0MsIE9QX1NIX0hJQ0MsIE9QX01BU0tfQ0MsIE9QX1NIX0NPUDFOT1JNLAotIAlPUF9NQVNLX0NPUDFOT1JNLCBPUF9TSF9DT1AxU1BFQywgT1BfTUFTS19DT1AxU1BFQywKLSAJT1BfTUFTS19DT1AxU0NMUiwgT1BfTUFTS19DT1AxQ01QLCBPUF9TSF9DT1AxQ01QLCBPUF9TSF9GT1JNQVQsCi0gCU9QX01BU0tfRk9STUFULCBPUF9TSF9UUlVFLCBPUF9NQVNLX1RSVUUsIE9QX1NIX0dFLCBPUF9NQVNLX0dFLAotIAlPUF9TSF9VTlNJR05FRCwgT1BfTUFTS19VTlNJR05FRCwgT1BfU0hfSElOVCwgT1BfTUFTS19ISU5UKToKLSAJRGVmaW5lZC4KLQotRnJpIEF1ZyAxNiAwMDoxNToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGl0bGIsIHBpdGxiZSwgaWl0bGJhLCBpaXRsYnAsIGZpYywgZmljZSk6IEFjY2VwdAotCWEgMyBiaXQgc3BhY2UgaWQgaW5zdGVhZCBvZiBhIDIgYml0IHNwYWNlIGlkLgotCi1UaHUgQXVnIDE1IDEzOjExOjQ2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IEFkZCBzb21lIGFkZGl0aW9uYWwgZGVmaW5lcyB0byBzdXBwb3J0IHRoZQotIAlhc3NlbWJsZXIgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggb3BlcmF0aW9ucyBjYW4gYmUgZG9uZSBpbiBwYXJhbGxlbC4KLQotVHVlIEF1ZyAgNiAxMToxMzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNOKTogRGVmaW5lLgotCShlZXBtb3YuYik6IFJlbmFtZWQgZnJvbSAiZWVwbW92IgotCShub3AsIGJwdCwgcnRlLCBydHMsIHNsZWVwLCBjbHJtYWMpOiBUaGVzZSBoYXZlIG5vIHNpemUgYXNzb2NpYXRlZAotCXdpdGggdGhlbS4KLQotRnJpIEp1bCAyNiAxMTo0NzoxMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oIChPUEVSQU5EX1NISUZUKTogTmV3IG9wZXJhbmQgZmxhZy4KLQotVGh1IEp1bCAyNSAxMjowNjoyMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBDaGFuZ2VzIGZvciBkaXZzLCBwYXJhbGxlbC1vbmx5IGluc3RydWN0aW9ucywgYW5kCi0gCXNpZ25lZCBudW1iZXJzLgotCi1Nb24gSnVsIDIyIDExOjIxOjE1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LmggKHBkX3JlZyk6IERlZmluZS4gUHV0dGluZyB0aGUgZGVmaW5pdGlvbiBoZXJlIGFsbG93cwotCXRoZSBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciB0byBzaGFyZSB0aGUgc2FtZSBzdHJ1Y3QuCi0KLU1vbiBKdWwgMjIgMTI6MTU6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKGk5NjBfb3Bjb2Rlcyk6ICJoYWx0IiB0YWtlcyBhbiBhcmd1bWVudC4gIEZyb20gU3RlcGhlbgotCVdpbGxpYW1zIDxzdGV2ZUBpY2FydXMuY29tPi4KLQotV2VkIEp1bCAxNyAxNDo0NjozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxMSAxMjowOToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGJhbmQsIGJjbHIpOiBGb3JjZSBoaWdoIGJpdCBvZiBpbW1lZGlhdGUgbmliYmxlIHRvIHplcm8uCi0KLVdlZCBKdWwgIDMgMTQ6MzA6MTIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0gCSogbTY4ay5oIChtY2Y1MjAwKTogTmV3IG1hY3JvLgotCURvY3VtZW50IG5hbWVzIG9mIGNvbGRmaXJlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi1UdWUgSnVsICAyIDIzOjA1OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU1JDX0lOX0RTVCk6IERlZmluZS4KLQotCSogaDgzMDAuaCAoVU5PUDMpOiBNYXJrIHRoZSByZWdpc3RlciBvcGVyYW5kIGluIHRoaXMgaW5zbgotCWFzIGEgc291cmNlIG9wZXJhbmQsIG5vdCBhIGRlc3RpbmF0aW9uIG9wZXJhbmQuCi0JKFNISUZUXzIsIFNISUZUX0lNTSk6IFJlbW92ZS4gIEVsaW1pbmF0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoVU5PUDMpOiBDaGFuZ2UgU0hJRlRfSU1NIHRvIElNTSBmb3IgSDgvUyBiaXRvcHMuICBNYXJrCi0JcmVnaXN0ZXIgb3BlcmFuZCB3aXRoIFNSQ19JTl9EU1QuCi0KLUZyaSBKdW4gMjEgMTM6NTI6MTcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDIwIDE1OjAyOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2ay5oOiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQotV2VkIEp1biAxOSAxNToyOTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ29ycmVjdCBvcGNvZGUgdmFsdWVzIGZvciBmYWRkcCwgZnN1YnAsIGZzdWJycCwgZm11bHAsCi0JZmRpdnAsIGFuZCBmZGl2cnAuICBBZGQgZmZyZWVwLgotCi1UdWUgSnVuIDE4IDE2OjA2OjAwIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBoODMwMC5oOiBSZW9yZGVyIHZhcmlvdXMgI2RlZmluZXMgZm9yIHJlYWRhYmlsaXR5LgotCShBQlMzMlNSQywgQUJTMzJEU1QsIERTUDMyTElTVCwgQUJTMzJMSVNULCBBMzJMSVNUKTogRGVmaW5lLgotCShCSVRPUCk6IEFjY2VwdCBhZGRpdGlvbmFsICh1bnVzZWQpIGFyZ3VtZW50LiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoRUJJVE9QKTogTGlrZXdpc2UuCi0JKE9fTEFTVCk6IEJ1bXAuCi0JKGxkYywgc3RjLCBtb3ZiLCBtb3Z3LCBtb3ZsKTogVXNlIDMyYml0IG9mZnNldHMgYW5kIGFic29sdXRlcy4KLQotCSogaDgzMDAuaCAoRVhSLCBTSElGVF8yLCBNQUNSRUcsIFNISUZUX0lNTSwgUkRJTkMpOiBEZWZpbmUuCi0JKE9fVEFTLCBPX0NMUk1BQywgT19MRE1BQywgT19NQUMsIE9fTERNLCBPX1NUTSk6IERlZmluZS4KLQkoQklUT1AsIEVCSVRPUCk6IEhhbmRsZSBuZXcgSDgvUyBhZGRyZXNzaW5nIG1vZGVzIGZvcgotCWJpdCBpbnNucy4KLQkoVU5PUDMpOiBIYW5kbGUgbmV3IHNoaWZ0L3JvdGF0ZSBpbnNucyBvbiB0aGUgSDgvUy4KLQkoaW5zbnMgdXNpbmcgZXhyKTogTmV3IGluc3RydWN0aW9ucy4KLQkodGFzLCBtYWMsIGxkbWFjLCBjbHJtYWMsIGxkbSwgc3RtKTogTmV3IGluc3RydWN0aW9ucy4KLQotVGh1IE1heSAyMyAxNjo1Njo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGFkZC5sKTogVW5kbyBBcHIgNXRoIGNoYW5nZS4gIFRoZSBtYW51YWwgSSBoYWQKLQl3YXMgaW5jb3JyZWN0LgotCi1Nb24gTWF5ICA2IDIzOjM4OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU1RBUlQpOiBSZW1vdmUuCi0JKE1FTVJFTEFYKTogRGVmaW5lLiAgTWFyayBhYnNvbHV0ZSBtZW1vcnkgb3BlcmFuZHMgaW4gbW92LmIsIG1vdi53Ci0JYW5kIG1vdi5sIGluc25zIHRoYXQgY2FuIGJlIHJlbGF4ZWQuCi0KLVR1ZSBBcHIgMzAgMTg6MzA6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBBYnMzMiBmcm9tIGxjYWxsLgotCi1Nb24gQXByIDIyIDE3OjA5OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCk6IE5ldyBtYWNyby4KLQkoU0xDUE9QKTogTmV3IG1hY3JvLgotCU1hcmsgWCxZIG9wY29kZSBsZXR0ZXJzIGFzIGluIHVzZS4KLQotVGh1IEFwciAxMSAxNzoyODoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKEZfRkxPQVQsIEZfRkJSKTogRGVmaW5lLgotCi1GcmkgQXByICA1IDE2OjU1OjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoQUJTOE1FTSk6IFJlbmFtZWQgZnJvbSBBQlNNT1YuICBSZW1vdmUgQUJTTU9WCi0JZnJvbSBhbGwgaW5zbnMuCi0JKEFCUzhTUkMsQUJTOERTVCk6IEFkZCBBQlM4TUVNLgotCShhZGQubCk6IEZpeCByZWcrcmVnIHZhcmlhbnQuCi0JKGVlcG1vdi53KTogUmVuYW1lZCBmcm9tIGVlcG1vdncuCi0JKGxkYyxzdGMpOiBGaXggbWFueSBjYXNlcy4KLQotU3VuIE1hciAzMSAxMzozMDowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChTUEFSQ19PUENPREVfQVJDSF9NQVNLKTogTmV3IG1hY3JvLgotCi1UaHUgTWFyICA3IDE1OjA4OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChPKTogTWFyayBvcGVyYW5kIGxldHRlciBhcyBpbiB1c2UuCi0KLVR1ZSBGZWIgMjAgMjA6NDY6MjEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9zcGFyY2xldF9jcHJlZyk6IERlY2xhcmUuCi0JTWFyayBvcGVyYW5kIGxldHRlcnMgdVUgYXMgaW4gdXNlLgotCi1Nb24gRmViIDE5IDAxOjU5OjA4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfYXJjaF92YWwpOiBBZGQgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQuCi0JKHNwYXJjX29wY29kZV9hcmNoKTogRGVsZXRlIG1lbWJlciBgY29uZmxpY3RzJy4gIEFkZCBgc3VwcG9ydGVkJy4KLQkoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCk6IE5ldyBtYWNyby4KLQkoU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1ApOiBSZXdyaXRlLgotCShGX05PVFY5KTogRGVsZXRlLgotCi1GcmkgRmViIDE2IDEyOjIzOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKSBNYWtlIHJldHVybiB0eXBlIGluCi0JZGVjbGFyYXRpb24gY29uc2lzdGVudCB3aXRoIHJldHVybiB0eXBlIGluIGRlZmluaXRpb24uCi0KLVdlZCBGZWIgMTQgMTg6MTQ6MTEgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBSZW1vdmUgRGF0YTMyIGZyb20gcHVzaGYgYW5kIHBvcGYuCi0KLVRodSBGZWIgIDggMTQ6Mjc6MjEgMTk5NiAgSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+Ci0KLQkqIGkzODYuaCAoaTM4Nl9yZWd0YWIpOiBBZGQgODA0ODYgdGVzdCByZWdpc3RlcnMuCi0KLU1vbiBGZWIgIDUgMTg6MzU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKElfSFgpOiBEZWZpbmUuCi0JKGk5NjBfb3Bjb2Rlcyk6IEFkZCBIWCBpbnN0cnVjdGlvbi4KLQotTW9uIEphbiAyOSAxMjo0MzozOSAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaXggd2FpdGluZyBmb3JtcyBvZiBmaW5pdCwgZnN0ZW52LCBmc2F2ZSwgZnN0c3csIGZzdGN3LAotCWFuZCBmY2xleC4KLQotV2VkIEphbiAyNCAyMjozNjo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwpOiBSZXBsYWNlcyBzcGFyY19hcmNoaXRlY3R1cmUuCi0JKFNQQVJDX09QQ09ERV9DT05GTElDVF9QKTogUmVuYW1lZCBmcm9tIEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUC4KLQkoYmZkXyogZGVmaW5lcyk6IERlbGV0ZS4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogUmVwbGFjZXMgYXJjaGl0ZWN0dXJlX3BuYW1lLgotCShzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBEZWNsYXJlLgotCShOVU1PUENPREVTKTogRGVsZXRlLgotCi1Nb24gSmFuIDIyIDA4OjI0OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX2FyY2hpdGVjdHVyZSk6IEFkZCB2OWEuCi0JKEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCk6IFVwZGF0ZS4KLQotVGh1IERlYyAyOCAxMzoyNzo1MyAxOTk1ICBKb2huIEhhc3NleSAgPGhhc3NleUBydHAuZGcuY29tPgotCi0JKiBpMzg2Lmg6IEFkZGVkIFBlbnRpdW0gUHJvIGluc3RydWN0aW9ucy4KLQotVGh1IE5vdiAgMiAyMjo1OToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgbmV3ICdXJyBvcGVyYW5kIHBsYWNlLgotCi1UdWUgT2N0IDI0IDEwOjQ5OjEwIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBBZGQgbGNpIGFuZCBzeW5jZG1hIGluc3RydWN0aW9ucy4KLQotTW9uIE9jdCAyMyAxMTowOToxNiAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogbWlwcy5oOiBBZGRlZCBJTlNOXzQxMDAgZmxhZyB0byBtYXJrIE5FQyBWUjQxMDAgc3BlY2lmaWMKLSAJaW5zdHJ1Y3Rpb25zLgotCi1Nb24gT2N0IDE2IDEwOjI4OjE1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFBQQ19PUENPREVfe0NPTU1PTixBTll9KTogTmV3IG9wY29kZSBmbGFncyBmb3IKLQlhc3NlbWJsZXIncyAtbWNvbSBhbmQgLW1hbnkgc3dpdGNoZXMuCi0KLVdlZCBPY3QgMTEgMTY6NTY6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRml4IGNtcHhjaGc4YiBleHRlbnNpb24gb3Bjb2RlIGRlc2NyaXB0aW9uLgotCi1UaHUgT2N0ICA1IDE4OjAzOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBQZW50aXVtIGluc3RydWN0aW9ucyB3cm1zciwgcmR0c2MsIHJkbXNyLCBjbXB4Y2hnOGIsCi0JYW5kIHJlZ2lzdGVyIGNyNC4KLQotVHVlIFNlcCAxOSAxNToyNjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogQ2hhbmdlIGNvbW1lbnQ6IHNwbGl0IHR5cGUgUCBpbnRvIHR5cGVzIDAsIDEgYW5kIDIuCi0KLVdlZCBBdWcgMzAgMTM6NTA6NTUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3ByZWZldGNoKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAyOSAxNTozNDo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fe2FzaSxtZW1iYXJ9KTogRGVjbGFyZS4KLQotV2VkIEF1ZyAgMiAxODozMjoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGttcmkuaDogUmVtb3ZlLgotCi0JKiBtNjhrLmg6IE1vdmUgdGFibGVzIGludG8gb3Bjb2Rlcy9tNjhrLW9wYy5jLCBsZWF2aW5nIGp1c3QgdGhlCi0JZGVjbGFyYXRpb25zLiAgUmVtb3ZlIEZfQUxJQVMgYW5kIGZsYWcgZmllbGQgb2Ygc3RydWN0Ci0JbTY4a19vcGNvZGUuICBDaGFuZ2UgYXJjaCBmaWVsZCBvZiBzdHJ1Y3QgbTY4a19vcGNvZGUgdG8gdW5zaWduZWQKLQlpbnQuICBNYWtlIG5hbWUgYW5kIGFyZ3MgZmllbGRzIG9mIHN0cnVjdCBtNjhrX29wY29kZSBjb25zdC4KLQotV2VkIEF1ZyAgMiAwODoxNjo0NiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChGX05PVFY5KTogRGVmaW5lLgotCi1UdWUgSnVsIDExIDE0OjIwOjQyIDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBtaXBzLmggKElOU05fNDAxMCk6IERlZmluZS4KLQotV2VkIEp1biAyMSAxODo0OTo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmggKFRCTDEpOiBSZXZlcnNlIHNlbnNlIG9mICJyb3VuZCIgYXJndW1lbnQgaW4gcmVzdWx0LgotCi0JQ2hhbmdlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogbTY4ay5oOiBGaXggYXJndW1lbnQgZGVzY3JpcHRpb25zIG9mIGNvcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zIHRvIGFsbG93IG9ubHkgYWx0ZXJhYmxlIG9wZXJhbmRzIHdoZXJlIGFwcHJvcHJpYXRlLgotCVshTk9fREVGQVVMVF9TSVpFU106IEFuIG9taXR0ZWQgc2l6ZSBkZWZhdWx0cyB0byBgdycuCi0JKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgbW9yZSBhbGlhc2VzLgotCi1GcmkgQXByIDE0IDIyOjE1OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogQWRkZWQgZXhwbGNpdGx5IHNob3J0LXNpemVkIGNvbmRpdGlvbmFsIGJyYW5jaGVzLCBhbmQgYQotCWJ1bmNoIG9mIGFsaWFzZXMgKGZtb3YqLCBmdGVzdCosIHRkaXZ1bCkgdG8gc3VwcG9ydCBnY2MncwotCXN2cjQtYmFzZWQgY29uZmlndXJhdGlvbnMuCi0KLU1vbiBNYXIgMTMgMjE6MzA6MDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCU1vbiBGZWIgMjcgMDg6MzY6MzkgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQkqIGkzODYuaDogYWRkZWQgbWlzc2luZyBEYXRhMTYvRGF0YTMyIGZsYWdzIHRvIGEgZmV3IGluc3RydWN0aW9ucy4KLQotV2VkIE1hciAgOCAxNToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoT1BfTUFTS19GUiwgT1BfU0hfRlIpOiBEZWZpbmUuCi0JKE9QX01BU0tfQkNDLCBPUF9TSF9CQ0MpOiBEZWZpbmUuCi0JKE9QX01BU0tfUFJFRlgsIE9QX1NIX1BSRUZYKTogRGVmaW5lLgotCShPUF9NQVNLX0NDQywgT1BfU0hfQ0NDKTogRGVmaW5lLgotCShJTlNOX1JFQURfRlBSX1IpOiBEZWZpbmUuCi0JKElOU05fUkZFKTogRGVsZXRlLgotCi1XZWQgTWFyICA4IDAzOjEzOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaCAoZW51bSBtNjhrX2FyY2hpdGVjdHVyZSk6IERlbGV0ZWQuCi0JKHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyk6IE5ldyB0eXBlLgotCShtNjhrX29wY29kZXMpOiBOb3cgY29uc3QuICBEZWxldGVkIG9wY29kZSBhbGlhc2VzIHdpdGggZXhhY3RseQotCW1hdGNoaW5nIGNvbnN0cmFpbnRzLCB2YWx1ZXMgYW5kIGZsYWdzLiAgQXMgYSBzaWRlIGVmZmVjdCBvZiB0aGlzLAotCXRoZSBNT1RPUk9MQV9TWU5UQVhfT05MWSBhbmQgTUlUX1NZTlRBWF9PTkxZIG1hY3Jvcywgd2hpY2ggc28gZmFyCi0JYXMgSSBrbm93IHdlcmUgbmV2ZXIgdXNlZCwgbm93IG1heSBuZWVkIHJlLWV4YW1pbmluZy4KLQkobnVtb3Bjb2Rlcyk6IE5vdyBjb25zdC4KLQkobTY4a19vcGNvZGVfYWxpYXNlcywgbnVtYWxpYXNlcyk6IE5ldyB2YXJpYWJsZXMuCi0JKGVuZG9wKTogRGVsZXRlZC4KLQlbRE9OVF9ERUZJTkVfVEFCTEVdOiBEZWNsYXJlIG51bW9wY29kZXMsIG51bWFsaWFzZXMsIGFuZAotCW02OGtfb3Bjb2RlX2FsaWFzZXM7IHVwZGF0ZSBkZWNsYXJhdGlvbiBvZiBtNjhrX29wY29kZXMuCi0KLU1vbiBNYXIgIDYgMTA6MDI6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoZGVsYXlfdHlwZSk6IERlbGV0ZSB1bnVzZWQgZW51bWVyYXRpb24uCi0JKHBhX29wY29kZSk6IFJlcGxhY2UgdW51c2VkIGRlbGF5ZWQgZmllbGQgd2l0aCBhbiBhcmNoaXRlY3R1cmUKLQlmaWVsZC4KLQkocGFfb3Bjb2Rlcyk6IE1hcmsgZWFjaCBpbnN0cnVjdGlvbiBhcyBlaXRoZXIgUEExLjAgb3IgUEExLjEuCi0KLUZyaSBNYXIgIDMgMTY6MTA6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fSVNBNCk6IERlZmluZS4KLQotRnJpIEZlYiAyNCAxOToxMzozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTV9ETEFfQUIsIE1fRExJKTogRGVmaW5lLgotCi1UaHUgRmViIDIzIDE3OjMzOjA5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGZzdHd4KTogRml4IHNpbmdsZS1iaXQgZXJyb3IuCi0KLVdlZCBGZWIgMTUgMTI6MTk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1fVUxELCBNX1VMRF9BLCBNX1VTRCwgTV9VU0RfQSk6IERlZmluZS4KLQotTW9uIEZlYiAgNiAxMDozNToyMyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogYWRkZWQgY3B1aWQgaW5zdHJ1Y3Rpb24gLCBhbmQgZHJbMC03XSBhbGlhc2VzIGZvciB0aGUKLQkgIGRlYnVnIHJlZ2lzdGVycy4gIEZyb20gQ2hhcmxlcyBIYW5udW0gKG15Y3JvZnRAbmV0YnNkLm9yZykuCi0KLU1vbiBGZWIgIDYgMDM6MzE6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PiBmb3IgMTYtYml0Ci0JaTM4NiBzdXBwb3J0OgotCSogaTM4Ni5oIChNT1ZfQVhfRElTUDMyKTogTmV3IG1hY3JvLgotCShpMzg2X29wdGFiKTogQWRkZWQgRGF0YTE2IGFuZCBEYXRhMzIgYXMgbmVlZGVkLiAgQWRkZWQgInciIGZvcm1zCi0Jb2Ygc2V2ZXJhbCBjYWxsL3JldHVybiBpbnN0cnVjdGlvbnMuCi0JKEFERFJfUFJFRklYX09QQ09ERSk6IE5ldyBtYWNyby4KLQotTW9uIEphbiAyMyAxNjo0NTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IEphbiAyMSAxNzo1MDozOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogLi4vaW5jbHVkZS9vcGNvZGUvdmF4LmggKHN0cnVjdCB2b3Rfd290LCBmaWVsZCBgYXJncycpOiAgbWFrZQotCWl0IHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IHZvdCwgZmllbGQgYG5hbWUnKTogIGRpdHRvLgotCi1UaHUgSmFuIDE5IDE0OjQ3OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHZheC5oOiBTdXBwbHkgYW5kIHByb3Blcmx5IGdyb3VwIGFsbCB2YWx1ZXMgaW4gZW5kIHNlbnRpbmVsLgotCi1UdWUgSmFuIDE3IDEwOjU1OjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQSwgSU5TTl80NjUwKTogRGVmaW5lLgotCi1XZWQgT2N0IDE5IDEzOjM0OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYTI5ay5oOiBBZGQgb3BlcmFuZCB0eXBlICdJJyBmb3IgYGludicgYW5kIGBpcmV0aW52Jy4gIE9uCi0Jc3lzdGVtcyB3aXRoIGEgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgY2FjaGUsIHN1Y2ggYXMgdGhlCi0JMjkwNDAsIHRoZXNlIGluc3RydWN0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi1XZWQgU2VwIDE0IDE3OjQ0OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOX1NUT1JFX01FTU9SWSk6IENvcnJlY3QgdmFsdWUgdG8gbm90IGNvbmZsaWN0IHdpdGgKLQlJTlNOX1RSQVAuCi0KLVR1ZSBTZXAgIDYgMTE6Mzk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fU1RPUkVfTUVNT1JZKTogRGVmaW5lLgotCi1UaHUgSnVsIDI4IDE5OjI4OjA3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvY3VtZW50IG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi1UdWUgSnVsIDI2IDE3OjQ4OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoSV9DWDIpOiBOZXcgaW5zdHJ1Y3Rpb24gY2F0ZWdvcnkuICBJdCBpbmNsdWRlcwotCWluc3RydWN0aW9ucyBhdmFpbGFibGUgb24gQ3ggYW5kIEp4IHByb2Nlc3NvcnMuCi0JKElfSlgpOiBOZXcgaW5zdHJ1Y3Rpb24gY2F0ZWdvcnksIGZvciBKWC1vbmx5IGluc3RydWN0aW9ucy4KLQkoaTk2MF9vcGNvZGVzKTogUHV0IGVzaHJvIGFuZCBzeXNjdGwgaW4gSV9DWDIgY2F0ZWdvcnkuICBBZGRlZAotCUp4LW9ubHkgaW5zdHJ1Y3Rpb25zLCBpbiBJX0pYIGNhdGVnb3J5LgotCi1XZWQgSnVsIDEzIDE4OjQzOjQ3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5zMzJrLmggKGVuZG9wKTogTWFkZSBwb2ludGVyIGNvbnN0IHRvby4KLQotU3VuIEp1bCAxMCAxMTowMTowOSAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogbnMzMmsuaDogRHJvcCBRIG9wZXJhbmQgdHlwZSBhcyB0aGVyZSBpcyBubyBjb3JyZWN0IHVzZQotCWZvciBpdC4gQWRkIEkgYW5kIFogb3BlcmFuZCB0eXBlcyB3aGljaCBhbGxvdyBiZXR0ZXIgY2hlY2tpbmcuCi0KLVRodSBKdWwgIDcgMTI6MzQ6NDggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoeG9yLmwpIDpmaXggYml0IHBhdHRlcm4uCi0JKExfMik6IE5ldyBzaXplIG9mIG9wZXJhbmQuCi0JKHRyYXBhKTogVXNlIGl0LgotCi1GcmkgSnVuIDEwIDE2OjM4OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBNb3ZlICJ0cmFwIiBiZWZvcmUgInRwY2MiIHRvIGNoYW5nZSBkaXNhc3NlbWJseS4KLQotRnJpIEp1biAgMyAxNTo1NzozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBJbmNsdWRlIHY5IGRlZmluaXRpb25zLgotCi1UaHUgSnVuICAyIDEyOjIzOjE3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAobTY4MDYwKTogRGVmaW5lZC4KLQkobTY4MDQwdXAsIG1mbG9hdCwgbW1tdSk6IEluY2x1ZGUgaXQuCi0JKHN0cnVjdCBtNjhrX29wY29kZSk6IFdpZGVuIGBhcmNoJyBmaWVsZC4KLQkobTY4a19vcGNvZGVzKTogVXBkYXRlZCBmb3IgTTY4MDYwLiAgUmVtb3ZlZCBjb21tZW50cyB0aGF0IHdlcmUKLQlpbnN0cnVjdGlvbnMgY29tbWVudGVkIG91dCBieSAiSkYiIHllYXJzIGFnby4KLQotVGh1IEFwciAyOCAxODozMToxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHN0cnVjdCBtNjhrX29wY29kZSk6IFNob3J0ZW4gYGFyY2gnIGZpZWxkIHRvIDggYml0cywgYW5kCi0JYWRkIGEgb25lLWJpdCBgZmxhZ3MnIGZpZWxkLgotCShGX0FMSUFTKTogTmV3IG1hY3JvLgotCi1XZWQgQXByIDI3IDExOjI5OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKGRlYywgaW5jKTogR2V0IGVuY29kaW5nIHJpZ2h0LgotCi1Nb24gQXByICA0IDEzOjEyOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKHN0cnVjdCBwb3dlcnBjX29wZXJhbmQpOiBSZW1vdmVkIHNpZ25lZHAgZmllbGQ7IGp1c3QgdXNlCi0JYSBmbGFnIGluc3RlYWQuCi0JKFBQQ19PUEVSQU5EX1NJR05FRCk6IERlZmluZS4KLQkoUFBDX09QRVJBTkRfU0lHTk9QVCk6IERlZmluZS4KLQotVGh1IE1hciAzMSAxOTozNDowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKElTX0pVTVBfT05fRUNYX1pFUk8sICJqY3h6IiBwYXR0ZXJuKTogT3BlcmFuZCBzaXplCi0JcHJlZml4IGlzIDB4NjYsIG5vdCAweDY3LiAgUGF0Y2ggZnJvbSBILkouIEx1IChobHVAbnluZXhzdC5jb20pLgotCi1UaHUgTWFyICAzIDE1OjUxOjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogUmV2ZXJzZSBsYXN0IGNoYW5nZS4gIEl0J2xsIGJlIGhhbmRsZWQgaW4gZ2FzIGluc3RlYWQuCi0KLVRodSBGZWIgMjQgMTU6Mjk6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChzYXIpOiBEaXNhYmxlZCB0aGUgdHdvLW9wZXJhbmQgSW1tMSBmb3JtLCBzaW5jZSBpdCB3YXMKLQlzbG93ZXIgb24gdGhlIDQ4NiBhbmQgdXNlZCB0aGUgaW1wbGljaXQgc2hpZnQgY291bnQgZGVzcGl0ZSB0aGUKLQlleHBsaWNpdCBvcGVyYW5kLiAgVGhlIG9uZS1vcGVyYW5kIGZvcm0gaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGdldAotCXRoZSBzaG9ydGVyIGZvcm0gd2l0aCB0aGUgaW1wbGljaXQgc2hpZnQgY291bnQuCi0KLVRodSBGZWIgMTcgMTI6Mjc6NTIgMTk5NCAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBGaXggdHlwbyBpbiBmc3R3cyBhcmcgc3RyaW5nLgotCi1XZWQgRmViICA5IDIxOjIzOjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKHN0cnVjdCBwb3dlcnBjX29wY29kZSk6IE1ha2Ugb3BlcmFuZHMgZmllbGQgdW5zaWduZWQuCi0KLU1vbiBGZWIgIDcgMTk6MTQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV82MDEpOiBEZWZpbmUuCi0KLUZyaSBGZWIgIDQgMjM6NDM6NTAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoYWRkYik6IFVzZSAnQCcgZm9yIGFkZGIgYW5kIGFkZGliIHBzZXVkbyBvcHMuCi0JKHNvIHdlIGNhbiBkZXRlcm1pbmUgdmFsaWQgY29tcGxldGVycyBmb3IgYm90aCBhZGRiIGFuZCBhZGRiW3RmXS4pCi0KLQkqIGhwcGEuaCAoeG1weXUpOiBObyBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3BlY2lmaWVyIGZvciB0aGUKLQl4bXB5dSBpbnN0cnVjdGlvbi4KLQotRnJpIEZlYiAgNCAyMzozNjo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChQUENfT1BFUkFORF9ORVhUKTogRGVmaW5lLgotCShQUENfT1BFUkFORF9ORUdBVElWRSk6IENoYW5nZSB2YWx1ZSB0byBtYWtlIHJvb20gZm9yIGFib3ZlLgotCShzdHJ1Y3QgcG93ZXJwY19tYWNybyk6IERlZmluZS4KLQkocG93ZXJwY19tYWNyb3MsIHBvd2VycGNfbnVtX21hY3Jvcyk6IERlY2xhcmUuCi0KLUZyaSBKYW4gMjEgMTk6MTM6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaDogTmV3IGZpbGUuICBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUuCi0KLU1vbiBKYW4gMTcgMDA6MTQ6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogTW9yZSBtaW5vciB0ZW1wbGF0ZSBmaXhlcyBmb3Igc2Z1IGFuZCBjb3ByICh0byBhbGxvdwotCWZvciBlYXNpZXIgZGlzYXNzZW1ibHkpLgotCi0JKiBocHBhLmg6IEZpeCB0ZW1wbGF0ZXMgZm9yIGFsbCB0aGUgc2Z1IGFuZCBjb3ByIGluc3RydWN0aW9ucy4KLQotV2VkIERlYyAxNSAxNToxMjo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKHB1c2gpOiBQZXJtaXQgSW1tMTYgb3BlcmFuZCB0b28uCi0KLVNhdCBEZWMgMTEgMTY6MTQ6MDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqICBoODMwMC5oIChhbmRjKTogRXhpc3RzIGluIGJhc2UgYXJjaC4KLQotV2VkIERlYyAgMSAxMjoxNTozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRnJvbSBIaXNhc2hpIE1JTkFNSU5PIDxtaW5hbWlub0BzcmFtaGMuc3JhLmNvLmpwPgotCSogaHBwYS5oOiAjdW5kZWYgTk9ORSB0byBhdm9pZCBjb25mbGljdCB3aXRoIGhpdXggaW5jbHVkZSBmaWxlcy4KLQotU3VuIE5vdiAyMSAyMjowNjo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBBZGQgRlAgcXVhZHdvcmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTm92IDE3IDE3OjEzOjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAoTV9KX0EpOiBBZGRlZC4KLQkoTV9MQSk6IFJlbW92ZWQuCi0KLU1vbiBOb3YgIDggMTI6MTI6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE9QX01BU0tfQ0FDSEUsIE9QX1NIX0NBQ0hFKTogRGVmaW5lLiAgRnJvbSBUZWQgTGVtb24KLQk8bWVsbG9uQHBlcHBlci5uY2QuY29tPi4KLQotU3VuIE5vdiAgNyAwMDozMDoxMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBJbW1lZGlhdGUgZmllbGQgaW4gcHJvYmVpIGluc3RydWN0aW9ucyBpcyB1bnNpZ25lZCwKLQlub3QgbG93LXNpZ24gZXh0ZW5kZWQuCi0KLVdlZCBOb3YgIDMgMTA6MzA6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaCAoUlJJMTBNQVNLKTogQ2hhbmdlIGZyb20gMHhmYzAwZmZlMCB0byAweGZjMDBmYzAwLgotCi1UdWUgTm92ICAyIDEyOjQxOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IEFkZCAiZnhjaCIgd2l0aG91dCBvcGVyYW5kLgotCi1Nb24gTm92ICAxIDE4OjEzOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNX0pBTF8xLCBNX0pBTF8yLCBNX0pBTF9BKTogQWRkZWQuCi0KLVNhdCBPY3QgIDIgMjI6MjY6MTEgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBBZGQgZ2Z3IGFuZCBnZnIgdG8gdGhlIG9wY29kZSB0YWJsZS4KLQotV2VkIFNlcCAyOSAxNjoyMzowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogZXh0ZW5kZWQgdG8gaGFuZGxlIG04ODExMC4KLQotVHVlIFNlcCAyOCAxOToxOTowOCAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGJlLCBibGUpOiBVc2Ugb3BlcmFuZCB0eXBlICd6JyB0byBkZW5vdGUgYWJzb2x1dGUgYnJhbmNoCi0JYWRkcmVzc2VzLgotCi1UdWUgU2VwIDE0IDE0OjA0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC5oIChpOTYwX29wY29kZXMpOiBQcm9wZXJseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotTW9uIFNlcCAxMyAxMjo1MDo1MiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaCAoQk9GTEFHKTogcmV3cml0ZSB0byBhdm9pZCBuZXN0ZWQgY29tbWVudC4KLQotTW9uIFNlcCAxMyAxNTo0NjowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAodHdvKTogUHJvdGVjdCBzZWNvbmQgYXJndW1lbnQgd2l0aCBwYXJlbnRoZXNlcy4KLQotRnJpIFNlcCAxMCAxNjoyOTo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZGVkIG5ldyBpbnN0cnVjdGlvbiAicnNtIiAoZm9yIGkzODZzbCkuCi0JRGVsZXRlZCBvbGQgaW4vb3V0IGluc3RydWN0aW9ucyBpbiAiI2lmIDAiIHNlY3Rpb24uCi0KLVRodSBTZXAgIDkgMTc6NDI6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBQcm9wZXJseSBicmFja2V0IGluaXRpYWxpemVycy4KLQotV2VkIEF1ZyAyNSAxMzo1MDo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2RlKTogVXNlICd8JyBmb3IgbW92YiBhbmQgbW92aWIgaW5zbnMuICAoRnJvbQotCUplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHUpLgotCi1Nb24gQXVnIDIzIDE2OjU1OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChsY2FsbCk6IEFjY2VwdCBJbW0zMiBvcGVyYW5kIGFsc28uCi0KLU1vbiBBdWcgMjMgMTI6NDM6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1fQUJTVSk6IFJlbW92ZWQgKGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIG51bWJlcj8/KS4KLQkoTV9EQUJTKTogQWRkZWQuCi0KLVRodSBBdWcgMTkgMTU6MDg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fKik6IENoYW5nZWQgdmFsdWVzLiAgUmVtb3ZlZCB1bnVzZWQgZGVmaW5pdGlvbnMuCi0JQWRkZWQgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFksIElOU05fSVNBMiBhbmQgSU5TTl9JU0EzLiAgU3BsaXQKLQlJTlNOX0xPQURfREVMQVkgaW50byBJTlNOX0xPQURfTUVNT1JZX0RFTEFZIGFuZAotCUlOU05fTE9BRF9DT1BST0NfREVMQVkuICBTcGxpdCBJTlNOX0NPUFJPQ19ERUxBWSBpbnRvCi0JSU5TTl9DT1BST0NfTU9WRV9ERUxBWSBhbmQgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZLgotCShNXyopOiBBZGRlZCBuZXcgdmFsdWVzIGZvciByNjAwMCBhbmQgcjQwMDAgbWFjcm9zLgotCShBTllfREVMQVkpOiBSZW1vdmVkLgotCi1XZWQgQXVnIDE4IDE1OjM3OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBNX0xJX1MgYW5kIE1fTElfU1MuCi0KLVR1ZSBBdWcgMTcgMDc6MDg6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogR2V0IHNvbWUgcmFyZSBtb3YuYnMgY29ycmVjdC4KLQotVGh1IEF1ZyAgNSAwOToxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9uJ3QgZGVmaW5lIGNvbnN0IG91cnNlbGY7IHJlbHkgb24gYW5zaWRlY2wuaCBoYXZpbmcKLQliZWVuIGluY2x1ZGVkLgotCi1GcmkgSnVsIDMwIDE4OjQxOjExIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChGX0pTUiwgRl9VTkJSLCBGX0NPTkRCUik6ICBBZGQgbmV3IGZsYWdzIHRvIG1hcmsKLQlqdW1wIGluc3RydWN0aW9ucywgZm9yIHVzZSBpbiBkaXNhc3NlbWJsZXJzLgotCi1UaHUgSnVsIDIyIDA3OjI1OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBNYWtlIGJpdGZpZWxkcyBqdXN0IHVuc2lnbmVkLCBub3QgdW5zaWduZWQgbG9uZyBvcgotCXVuc2lnbmVkIHNob3J0LgotCi1XZWQgSnVsIDIxIDExOjU1OjMxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLmg6IE5ldyBhcmd1bWVudCB0eXBlICd5Jy4gIFVzZSBpbiB2YXJpb3VzIGZsb2F0IGluc3RydWN0aW9ucy4KLQotTW9uIEp1bCAxOSAxNzoxNzowMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChicmVhayk6IEZpcnN0IGltbWVkaWF0ZSBmaWVsZCBpcyB1bnNpZ25lZC4KLQotCSogaHBwYS5oOiBBZGQgcmZpciBpbnN0cnVjdGlvbi4KLQotU3VuIEp1bCAxOCAxNjoyODowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogU3BsaXQgdGhlIGFjdHVhbCB0YWJsZSBvdXQgaW50byAuLi8uLi9vcGNvZGVzL21pcHMtb3BjLmMuCi0KLUZyaSBKdWwgMTYgMDk6NTk6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJld29ya2VkIHRoZSBoYXphcmQgaW5mb3JtYXRpb24gc29tZXdoYXQsIGFuZCBmaXhlZCBzb21lCi0JYnVncyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaGF6YXJkIGRlc2NyaXB0aW9ucy4KLQotVGh1IEp1bCAxNSAxMjo0MjowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogQ29ycmVjdGVkIGEgY291cGxlIG9mIG9wY29kZXMuCi0KLVR1ZSBKdWwgIDYgMTU6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJlcGxhY2VkIHdpdGggdmVyc2lvbiBmcm9tIFJhbHBoIENhbXBiZWxsIGFuZCBPU0YuICBUaGUKLQluZXcgdmVyc2lvbiBpbmNsdWRlcyBpbnN0cnVjdGlvbiBoYXphcmQgaW5mb3JtYXRpb24sIGJ1dCBpcwotCW90aGVyd2lzZSByZWFzb25hYmx5IHNpbWlsYXIuCi0KLVRodSBKdWwgIDEgMjA6MzY6MTcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogRml4IHR5cG8gaW4gVU5PUDMgKGFmZmVjdGVkIHNoW2FsXVtscl0ubCkuCi0KLUZyaSBKdW4gMTEgMTg6Mzg6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEuaDogQ2xlYW4gdXAgc29tZSBvZiB0aGUgT0xEX1RBQkxFLCBub24tT0xEX1RBQkxFIGJyYWluZGFtYWdlLgotCU1ha2UgdGhlIHRhYmxlcyBiZSB0aGUgc2FtZSBmb3IgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6Ci0JImJiIiwgImFkZGJbdGZdIiwgImFkZGliW3RmXSIsICJhZGQiLCAiYWRkW2xvY10iLCAiYWRkY28iLAotCSJzaFsxMjNdYWRkIiwgInNoWzEyM11hZGRbbG9dIiwgInN1YiIsICJzdWJbb2J0XSIsICJzdWJbYnRdbyIsCi0JImRzIiwgImNvbWNsciIsICJhZGRpIiwgImFkZGlbb3RdIiwgImFkZGl0byIsICJzdWJpIiwgInN1YmlvIiwKLQkiY29taWNsciIsICJmYWRkIiwgImZzdWIiLCAiZm1weSIsICJmZGl2IiwgImZzcXJ0IiwgImZhYnMiLAotCSJmcm5kIiwgImZjcHkiLCAiZmNudmZmIiwgImZjbnZ4ZiIsICJmY252ZngiLCAiZmNudmZ4dCIsCi0JImZjbXAiLCBhbmQgImZ0ZXN0Ii4KLQotCSogaHBwYS5oOiBNYWtlIG5ldyBhbmQgb2xkIHRhYmxlcyB0aGUgc2FtZSBmb3IgImJyZWFrIiwgIm10Y3RsIiwKLQkibWZjdGwiLCAiYmIiLCAic3NtIiwgInJzbSIsICJ4bXB5dSIsICJmbXB5YWRkIiwgImZtcHlzdWIiLgotCUZpeCB0eXBvIGluIGxhc3QgcGF0Y2guICBDb2xsYXBzZSBzZXZlcmFsICNpZmRlZnMgaW50byBhCi0Jc2luZ2xlICNpZmRlZi4KLQotCSogaHBwYS5oOiBEZWxldGUgcmVtYWluaW5nIE9MRF9UQUJMRSBjb2RlLiAgQnJpbmcgc29tZQotCW9mIHRoZSBjb21tZW50cyB1cC10by1kYXRlLgotCi0JKiBocHBhLmg6IFVwZGF0ZSAiZnJlZSBsaXN0IiBvZiBsZXR0ZXJzIGFuZCB1cGRhdGUKLQljb21tZW50cyBkZXNjcmliaW5nIGVhY2ggbGV0dGVyJ3MgZnVuY3Rpb24uCi0KLUZyaSBKdW4gIDQgMTU6NDE6MzcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogY2hlY2twb2ludCwgaW5jbHVkZXMgSDgvMzAwLUggb3Bjb2Rlcy4KLQotVGh1IEp1biAgMyAxNTo0Mjo1OSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLmg6IFJld29yayBzaW5nbGUgcHJlY2lzaW9uIEZQCi0JaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhleSBjb3JyZWN0bHkgZGlzYXNzZW1ibGUgY29kZQotCVBBMS4xIGNvZGUuCi0KLVRodSBNYXkgMjcgMTk6MjE6MjIgMTk5MyAgQnJ1Y2UgQmF1bWFuICAoYm9vdEBvc2Yub3JnKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIsIG1vdiBwYXR0ZXJuKTogUmVtb3ZlIE1lbTE2IHJlc3RyaWN0aW9uIGZyb20KLQltb3YgdG8gYWxsb3cgaW5zdHJ1Y3Rpb25zIGxpa2UgbW92IHNzLHh5eihlY3gpIHRvIGFzc2VtYmxlLgotCi1UdWUgTWF5IDI1IDAwOjM5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IFVzZSBuZXcgdmVyc2lvbiBmcm9tIFV0YWggaWYgT0xEX1RBQkxFIGlzbid0IGRlZmluZWQ7Ci0JZ2RiIHdpbGwgZGVmaW5lIGl0IGZvciBub3cuCi0KLU1vbiBNYXkgMjQgMTU6MjA6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb24ndCBlbmQgZW51bWVyYXRvciBsaXN0IHdpdGggY29tbWEuCi0KLUZyaSBNYXkgMTQgMTU6MTU6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBCYXNlZCBvbiBwYXRjaGVzIGZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQkqIG1pcHMuaCAoT1BfTUFTS19DT1BaLCBPUF9TSF9DT1BaKTogRGVmaW5lLgotCSgiYmMydCIpOiBDb3JyZWN0IHR5cG8uCi0JKCJbbHNdd2NbMDIzXSIpOiBVc2UgVCByYXRoZXIgdGhhbiB0LgotCSgiY1swMTIzXSIpOiBEZWZpbmUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCi0KLU1vbiBNYXkgMTAgMDY6MDI6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogTW92ZSBzcGxpdCBwb2ludCBmb3IgZ2NjIGNvbXBpbGF0aW9uIG1vcmUgdG93YXJkcwotCW1pZGRsZS4KLQotRnJpIEFwciAgOSAxMzoyNjoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiBDbGVhbiB1cCBpbnN0cnVjdGlvbnMgZm9yIHByaW1hcnkgb3Bjb2RlIDE5IChtYW55IHdlcmUKLQlzaW1wbHkgd3JvbmcsIGljcywgcmZpLCAmIHJmc3ZjIHdlcmUgbWlzc2luZykuCi0JQWRkICJhIiB0byBvcHJfZXh0IGZvciAiYmIiLiAgRG9jIGZpeC4KLQotVGh1IE1hciAxOCAxMzo0NTozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogIDQ4NiBleHRlbnNpb25zIGZyb20gSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKS4KLQkqIG1pcHMuaDogIEFkZCBjYXN0cywgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgc2hpZnRpbmcgdG9vIG11Y2guCi0JKiBtNjhrLmg6ICBEb2N1bWVudCB0aGUgcGxhY2VtZW50IGNvZGUgJzknLgotCi1UaHUgRmViIDE4IDAyOjAzOjE0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtNjhrLmggKEJSRUFLX1VQX0JJR19ERUNMLCBBTkRfT1RIRVJfUEFSVCk6ICBBZGQga2x1ZGdlIHdoaWNoCi0JYWxsb3dzIGNhbGxlcnMgdG8gYnJlYWsgdXAgdGhlIGxhcmdlIGluaXRpYWxpemVkIHN0cnVjdCBmdWxsIG9mCi0Jb3Bjb2RlcyBpbnRvIHR3byBoYWxmLXNpemVkIG9uZXMuICBUaGlzIHBlcm1pdHMgR0NDIHRvIGNvbXBpbGUKLQl0aGlzIG1vZHVsZSwgc2luY2UgaXQgdGFrZXMgZXhwb25lbnRpYWwgc3BhY2UgZm9yIGluaXRpYWxpemVycy4KLQkobnVtb3Bjb2RlcywgZW5kb3ApOiAgUmV2aXNlIHRvIHVzZSBBTkRfT1RIRVJfUEFSVCBpbiBzaXplIGNhbGNzLgotCi1UaHUgRmViICA0IDAyOjA2OjU2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhMjlrLmg6ICBSZW1vdmUgUkNTIGNydWQsIHVwZGF0ZSBHUEwgdG8gdjIsIHVwZGF0ZSBjb3B5cmlnaHRzLgotCSogY29udmV4Lmg6ICBBZGRlZCwgZnJvbSBHREIncyBjb252eC1vcGNvZGUuaC4gIEFkZGVkIENPTlNUIHRvIGFsbAotCWluaXRpYWxpemVkIHN0cnVjdHMgaW4gaXQuCi0KLVRodSBKYW4gMjggMjE6MzI6MjIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlEZWx0YSA4OCBjaGFuZ2VzIGluc3BpcmVkIGJ5IENhcmwgR3JlY28sIDxjZ3JlY29AQ3JlaWdodG9uLkVkdT46Ci0JKiBtODhrLmggKFBNRU0pOiAgQXZvaWQgcHJldmlvdXMgZGVmaW5pdGlvbiBmcm9tIDxzeXMvcGFyYW0uaD4uCi0JKEFORCk6ICBDaGFuZ2UgdG8gQU5EXyB0byBhdm9pZCBhbnNpZGVjbC5oIGBBTkQnIGNvbmZsaWN0LgotCi1TYXQgSmFuIDIzIDE4OjEwOjQ5IFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogbWlwcy5oOiBkb2N1bWVudCAiaSIgYW5kICJqIiBvcGVyYW5kcyBjb3JyZWN0bHkuCi0KLVRodSBKYW4gIDcgMTU6NTg6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFJlbW92ZWQgZW5kaWFubmVzcyBkZXBlbmRlbmN5LgotCi1TdW4gSmFuICAzIDE0OjEzOjM1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBpbmNsdWRlIGluZm8gb24gbnVtYmVyIG9mIGN5Y2xlcyBwZXIgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBEZWMgMjEgMjE6Mjk6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiAgTW92ZSBoYW5keSBhbGlhc2VzIHRvIHRoZSBmcm9udC4gIEZpeCBtYXNrcyBmb3IgZXh0cmFjdAotCWFuZCBkZXBvc2l0IGluc3RydWN0aW9ucy4KLQotU2F0IERlYyAxMiAxNjowOTo0OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYWNjZXB0IHNobGQgYW5kIHNocmQgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBzaGlmdAotCWNvdW50IGFyZ3VtZW50LCB3aGljaCBpcyBhbHdheXMgJWNsLgotCi1GcmkgTm92IDI3IDE3OjEzOjE4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybiBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWJfZW5kLCBpMzg2X3JlZ3RhYl9lbmQpOiBOb3cgY29uc3QuCi0JKG9uZV9ieXRlX3NlZ21lbnRfZGVmYXVsdHMsIHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMsCi0JaTM4Nl9wcmVmaXh0YWJfZW5kKTogRGl0dG8uCi0KLU1vbiBOb3YgMjMgMTA6NDc6MjUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHZheC5oIChiYiopOiBVc2UgInYiIChiaXRmaWVsZCB0eXBlKSwgbm90ICJhIiAoYWRkcmVzcyBvcGVyYW5kKQotCWZvciBvcGVyYW5kIDI7IGZyb20gSm9obiBDYXJyLCBqZmNAZHNnLmRlYy5jb20uCi0KLVdlZCBOb3YgIDQgMDc6MzY6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogRGVmaW5lIEZJWEVEX1NJWkVfQlJBTkNILCBzbyBic3IgYW5kIGJyYSBpbnN0cnVjdGlvbnMKLQlhbHdheXMgdXNlIDE2LWJpdCBvZmZzZXRzLiAgTWFrZXMgY2FsY3VsYXRlZC1zaXplIGp1bXAgdGFibGVzCi0JZmVhc2libGUuCi0KLUZyaSBPY3QgMTYgMjI6NTI6NDMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogRml4IG9uZS1vcGVyYW5kIGZvcm1zIG9mIGluKiBhbmQgb3V0KiBwYXR0ZXJucy4KLQotVHVlIFNlcCAyMiAxNDowODoxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogQWRkZWQgQ1BVMzIgc3VwcG9ydC4KLQotVHVlIFNlcCAyMiAwMDozODo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChicmVhayk6ICBEaXNhc3NlbWJsZSB0aGUgYXJndW1lbnQuICBQYXRjaCBmcm9tCi0Jam9uYXRoYW5AY3Muc3RhbmZvcmQuZWR1IChKb25hdGhhbiBTdG9uZSkuCi0KLVdlZCBTZXAgIDkgMTE6MjU6MjggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IG1lcmdlZCBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheC4KLQotVGh1IFNlcCAgMyAwOTozMzoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChwbW92ZSk6IG1ha2UgdGhlIHRlc3RzIGxlc3Mgc3RyaWN0LCB0aGUgNjhrIGJvb2sgaXMKLQl3cm9uZy4KLQotVHVlIEF1ZyAyNSAyMzoyNToxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAobTY4ZWMwMzApOiBEZWZpbmVkIGFzIGFsaWFzIGZvciA2ODAzMC4KLQkobTY4a19vcGNvZGVzKTogTmV3IHR5cGUgY2hhcmFjdGVycyAiMyIgZm9yIDY4MDMwIE1NVSByZWdzIGFuZCAidCIKLQlmb3IgaW1tZWRpYXRlIDAtNyBhZGRlZC4gIFNldCB1cCBzb21lIG9wY29kZXMgKHB0ZXN0LCBia3B0KSB0byB1c2UKLQl0aGVtLiAgVGlnaHRlbmVkIGRlc2NyaXB0aW9uIG9mICJmbW92ZXgiIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20KLQlzb21lICJwbW92ZSIgZW5jb2RpbmdzLiAgQWRkZWQgInBtb3ZlIiBmb3IgNjgwMzAgTU1VIHJlZ3MsIGNsZWFuZWQKLQl1cCBkZXNjcmlwdGlvbnMgdGhhdCBjbGFpbWVkIHZlcnNpb25zIHdlcmUgYXZhaWxhYmxlIGZvciBjaGlwcyBub3QKLQlzdXBwb3J0aW5nIHRoZW0uICBBZGRlZCAicG1vdmVmZCIuCi0KLU1vbiBBdWcgMjQgMTI6MDQ6NTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogZml4IHdoZXJlIHRoZSAuIGdvZXMgaW4gZGl2dWxsCi0KLVdlZCBBdWcgMTkgMTE6MjI6MjQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IHRoZSBjYXMyIGluc3RydWN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gd2l0aAotCWluZGlyZWN0aW9uIG9uIHRoZSBsYXN0IHR3byBvcGVyYW5kcywgd2hpY2ggY2FuIGJlIGVpdGhlciBkYXRhIG9yCi0JYWRkcmVzcyByZWdpc3RlcnMuICBBZGRlZCBhIG5ldyBvcGVyYW5kIHR5cGUgJ3InIHdoaWNoIGFjY2VwdHMKLQllaXRoZXIgcmVnaXN0ZXIgdHlwZS4gIEFkZGVkIG5ldyBjYXNlcyBmb3IgY2FzMmwgYW5kIGNhczJ3IHdoaWNoCi0JdXNlIHRoZW0uICBDb3JyZWN0ZWQgbWFza3MgZm9yIGNhczIgd2hpY2ggZmFpbGVkIHRvIHJlY29nbml6ZSB1c2UKLQlvZiBhZGRyZXNzIHJlZ2lzdGVyLgotCi1GcmkgQXVnIDE0IDE0OjIwOjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6ICBNZXJnZWQgaW4gcGF0Y2hlcyAobW9zdGx5IG02ODA0MC1zcGVjaWZpYykgZnJvbQotCUNvbGluIFNtaXRoIDxjb2xpbkB3cnMuY29tPi4KLQotCSogbTY4ay5oOiAgTWVyZ2VkIG02OGttcmkuaCBhbmQgbTY4ay5oICh1c2luZyB0aGUgZm9ybWVyIGFzIGEKLQliYXNlKS4gIEFsc28gY2xlYW5lZCB1cCBkdXBsaWNhdGVzLCByZS1vcmRlcmVkIGluc3RydWN0aW9ucyBmb3IKLQl0aGUgc2FrZSBvZiBkaXMtYXNzZW1ibGluZyAoc28gYWxpYXNlcyBjb21lIGFmdGVyIHN0YW5kYXJkIG5hbWVzKS4KLQkqIG02OGttcmkuaDogTm93IGp1c3QgZGVmaW5lcyBzb21lIG1hY3JvcywgYW5kICNpbmNsdWRlcyBtNjhrLmguCi0KLVdlZCBBdWcgMTIgMTY6Mzg6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGttcmkuaDogYWRkZWQgdmFyaW91cyBvcGNvZGVzLiBNb3ZlZCBqYnh4IHRvIGJ4eGVzLiBGaWxsZWQgaW4KLQlhbGwgbWlzc2luZyAucwotCi1Nb24gQXVnIDEwIDIzOjIyOjMzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBNb3ZlZCB0YWJsZXMgdG8gQkZEIGxpYnJhcnkuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBmaWxkcSwgZmlzdHBxIGFsaWFzZXMgdXNlZCBieSBnY2MuCi0KLVN1biBKdW4gMjggMTM6Mjk6MDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6ICBGaW5pc2ggZmlsbGluZyBpbiBhbGwgdGhlIGhvbGVzIGluIHRoZSBvcGNvZGUgdGFibGUsCi0Jc28gdGhhdCB0aGUgTHVjaWQgQyBjb21waWxlciBjYW4gZGlnZXN0IHRoaXMgYXMgd2VsbC4uLgotCi1GcmkgSnVuIDI2IDIxOjI3OjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6ICBBZGQgc2V0Yywgc2V0bmMsIGFkZHIxNiwgZGF0YTE2LCByZXB6LCByZXBueiBhbGlhc2VzLgotCUZpeCBvcGNvZGVzIG9uIHZhcmlvdXMgc2l6ZXMgb2YgZmlsZC9maXN0IGluc3RydWN0aW9ucwotCSgxNmJpdD1ubyBzdWZmaXgsIDMyYml0PSJsIiBzdWZmaXgsIDY0Yml0PSJsbCIgc3VmZml4KS4KLQlVc2UgdGFicyB0byBpbmRlbnQgZm9yIGNvbW1lbnRzLiAgRml4ZXMgc3VnZ2VzdGVkIGJ5IE1pbmggVHJhbi1MZS4KLQotVGh1IEp1biAyNSAxNjoxMzoyNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiAgRmlsbCBpbiBhbGwgdGhlIGhvbGVzIGluIHRoZSBvcGNvZGUgdGFibGUgc28gdGhhdCB0aGUKLQlsb3NpbmcgSFBVWCBDIGNvbXBpbGVyIGNhbiBkaWdlc3QgdGhpcy4uLgotCi1UaHUgSnVuIDExIDEyOjE1OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBGaXggZGVjb2Rpbmcgb2YgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLCBzb21ld2hhdC4KLQkoRml4IGJ5IEVyaWMgQW5kZXJzb24sIDNqZWFuQG1hYXMtbmVvdGVrLmFyYy5uYXNhLmdvdi4pCi0KLVRodSBNYXkgMjggMTE6MTc6NDQgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBBZGQgbmV3IGFyY2hpdGVjdHVyZSB2YXJpYW50IHNwYXJjbGl0ZTsgYWRkIGl0cyBzY2FuCi0JYW5kIGRpdnNjYyBvcGNvZGVzLiAgRGVmaW5lIEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCBtYWNyby4KLQotVHVlIE1heSAgNSAxNDoyMzoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIEFkZCBzb21lIG1vcmUgb3Bjb2RlIHN5bm9ueW1zIChmcm9tIEZyYW5rIFllbGxpbiwKLQlmeUBsdWNpZC5jb20pLgotCi1UaHUgQXByIDE2IDE4OjI1OjI2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiByczZrLmg6ICBOZXcgdmVyc2lvbiBmcm9tIElCTSAoTWV0aW4pLgotCi1UaHUgQXByICA5IDAwOjMxOjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiBGaXggaW5jb3JyZWN0IGV4dGVuZGVkIG9wY29kZSBmb3IgaW5zdHJ1Y3Rpb25zIGBmbScKLSAgICAgICAgYW5kIGBmZCcuICAoRnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspLikKLQotVHVlIEFwciAgNyAxMzozODo0NyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByczZrLmg6ICBNb3ZlIGZyb20gLi4vLi4vZ2RiL3JzNmstb3Bjb2RlLmguCi0KLUZyaSBBcHIgIDMgMTE6MzA6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAob25lLCB0d28pOiAgQ2FzdCBtYWNybyBhcmdzIHRvIHVuc2lnbmVkIHRvIHN1cHByZXNzCi0JY29tcGxhaW50cyBmcm9tIGNvbXBpbGVyIGFuZCBsaW50IGFib3V0IGludGVnZXIgb3ZlcmZsb3cgZHVyaW5nCi0Jc2hpZnQuCi0KLVN1biBNYXIgMjkgMTI6MjI6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKE9QKTogIEF2b2lkIHNpZ25lZCBvdmVyZmxvdyB3aGVuIHNoaWZ0aW5nIHRvIGhpZ2ggb3JkZXIgYml0LgotCi1GcmkgTWFyICA2IDAwOjIyOjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBNYWtlIGJpdGZpZWxkIGxheW91dCBkZXBlbmQgb24gdGhlIEhPU1QgY29tcGlsZXIsCi0Jbm90IG9uIHRoZSBUQVJHRVQgc3lzdGVtLgotCi1GcmkgRmViIDIxIDAxOjI5OjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGFkZGVkIGluYiwgaW53LCBvdXRiLCBvdXR3IG9wY29kZXMsIGFkZGVkIGF0dCBzeW50YXggZm9yCi0JICBzY21wLCBzbG9kLCBzbW92LCBzc2NhLCBzc3RvLiAgQ3VydGVzeSBNaW5oIFRyYW4tTGUKLQkgIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPi4KLQotVGh1IEphbiAzMCAwNzozMTo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogdHVybmVkIG9wX3R5cGUgZW51bSBpbnRvICNkZWZpbmUgbGlzdAotCi1UaHUgSmFuIDMwIDAxOjA3OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiAgUmVtb3ZlICJjeXByZXNzIiBhcmNoaXRlY3R1cmUuICBSZW1vdmUgImZpdG94IiBhbmQKLQlzaW1pbGFyIGluc3RydWN0aW9ucyAtLSB0aGV5J3ZlIGJlZW4gcmVuYW1lZCB0byAiZml0b3EiLCBldGMuCi0JUkVBTExZIGZpeCB0c3ViY2N0di4gIEZpeCAiZmNtcGVxIiBhbmQgImZjbXBxIiB3aGljaCBoYWQgd3JvbmcKLQludW1iZXIgb2YgYXJndW1lbnRzLgotCSogaDgzMDAuaDogIFJlbW92ZSBleHRyYSA7IHdoaWNoIHByb2R1Y2VzIGNvbXBpbGVyIHdhcm5pbmcuCi0KLVR1ZSBKYW4gMjggMjI6NTk6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogIGZpeCBvcGNvZGUgZm9yIHRzdWJjY3R2LgotCi1UdWUgSmFuICA3IDE3OjE5OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBmYmEgYW5kIGNiYSBhcmUgbm93IGFsaWFzZXMgZm9yIGZiIGFuZCBjYiByZXNwZWN0aXZlbHkuCi0KLUZyaSBEZWMgMjcgMTA6NTU6NTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKG5vcCk6ICBNYWRlIHRoZSAnbG9zZScgZmllbGQgYmUgZXZlbiB0aWdodGVyLAotCXNvIG9ubHkgYSBzdGFuZGFyZCAnbm9wJyBpcyBkaXNhc3NlbWJsZWQgYXMgYSBub3AuCi0KLVN1biBEZWMgMjIgMTI6MTg6MTggMTk5MSAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChub3ApOiBBZGQgUkRfR08gdG8gYGxvc2UnIHNvIHRoYXQgb25seSAlZzAgaW4gZGVzdCBpcwotCWRpc2Fzc2VtYmxlZCBhcyBhIG5vcC4KLQotVHVlIERlYyAxMCAwMDoyMjoyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IGZpeCBhIHR5cG8uCi0KLVNhdCBOb3YgMzAgMjA6NDA6NTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGEyOWsuaCwgYXJtLmgsIGg4MzAwLmgsICBpMzg2LmgsICBpODYwLmgsIGk5NjAuaCAsIG02OGsuaCwKLQltODhrLmgsIG1pcHMuaCAsIG5wMS5oLCBuczMyay5oLCBwbi5oLCBweXIuaCwgc3BhcmMuaCwgdGFob2UuaCwKLQl2YXguaCwgQ2hhbmdlTG9nOiByZW5hbWVkIGZyb20gLi4vPGZvbz4tb3Bjb2RlLmgKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYTI5ay5oIGIvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJlMTI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgQU1EIDI5MDAwIGZhbWlseS4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGEyOWtfb3Bjb2RlIHsKLSAgLyogTmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBjaGFyICpuYW1lOwotCi0gIC8qIE9wY29kZSB3b3JkICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIEEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIG9wZXJhbmRzLgotICAgICBWYWxpZCBjaGFyYWN0ZXJzIGFyZToKLSAgICAgLCAgICAgICAgSXRzZWxmLiAgVGhlIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBhc3NlbWJseSBjb2RlLgotICAgICBhICAgICAgICBSQS4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyA4LTE1IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgYiAgICAgICAgUkIuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgYyAgICAgICAgUkMuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBpICAgICAgICBBbiBpbW1lZGlhdGUgb3BlcmFuZCBpcyBpbiBiaXRzIDAtNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHggICAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMC03IGFuZCA4LTE1Ci0gICAgICAgICAgICAgIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4KLSAgICAgaCAgICAgICAgU2FtZSBhcyB4IGJ1dCB0aGUgaW5zdHJ1Y3Rpb24gY29udGFpbnMgYml0cyAxNi0zMSBvZiB0aGUKLSAgICAgICAgICAgICAgaW1tZWRpYXRlIG9wZXJhbmQuCi0gICAgIFggICAgICAgIFNhbWUgYXMgeCBidXQgYml0cyAxNi0zMSBvZiB0aGUgc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kCi0gICAgICAgICAgICAgIGFyZSBzZXQgdG8gMSAodGh1cyB0aGUgb3BlcmFuZCBpcyBhbHdheXMgbmVnYXRpdmUpLgotICAgICBQLEEgICAgICBCaXRzIDAtNyBhbmQgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBiaXRzIDItOSBhbmQgMTAtMTcKLSAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgotCSAgICAgIFA9UEMtcmVsYXRpdmUsIHNpZ24tZXh0ZW5kZWQgdG8gMzIgYml0cy4KLQkgICAgICBBPUFic29sdXRlLCB6ZXJvLWV4dGVuZGVkIHRvIDMyIGJpdHMuCi0gICAgIGUgICAgICAgIENFIGJpdCAoYml0IDIzKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgotICAgICBuICAgICAgICBDb250cm9sIGZpZWxkIChiaXRzIDE2LTIyKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgotICAgICB2ICAgICAgICBJbW1lZGlhdGUgb3BlcmFuZCBpbiBiaXRzIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgICAgICAgICAgKHVzZWQgZm9yIHRyYXAgbnVtYmVycykuCi0gICAgIHMgICAgICAgIFNBLiAgU3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG51bWJlciBpbiBiaXRzIDgtMTUKLSAgICAgICAgICAgICAgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICB1ICAgICAgICBVSS0tYml0IDcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICByICAgICAgICBSTkQtLWJpdHMgNC02IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgZCAgICAgICAgRkQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgZiAgICAgICAgRlMtLWJpdHMgMC0xIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgSQkgICAgICBJRC0tYml0cyAxNi0xNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgICAgRXh0ZW5zaW9ucyBmb3IgMjkwNTA6Ci0KLSAgICAgZAkgICAgICBGTVQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlYWxseSBuZXcpLgotICAgICBmCSAgICAgIEFDTi0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCi0gICAgIEYJICAgICAgRlVOQy0tU3BlY2lhbCBmdW5jdGlvbiBpbiBiaXRzIDE4LTIxIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgQwkgICAgICBBQ04tLWJpdHMgMTYtMTcgc3BlY2lmeWluZyB0aGUgYWNjdW1sYXRvciByZWdpc3Rlci4gICovCi0gIGNoYXIgKmFyZ3M7Ci19OwotCi0jaWZuZGVmIENPTlNUCi0jZGVmaW5lIENPTlNUCi0jZW5kaWYgLyogQ09OU1QgKi8KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhMjlrX29wY29kZSBhMjlrX29wY29kZXNbXSA9Ci17Ci0KLXsgImFkZCIsIDB4MTQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZCIsIDB4MTUwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGMiLCAweDFjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjIiwgMHgxZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkY3MiLCAweDE4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjcyIsIDB4MTkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGN1IiwgMHgxYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkY3UiLCAweDFiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRzIiwgMHgxMDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkcyIsIDB4MTEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZHUiLCAweDEyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGR1IiwgMHgxMzAwMDAwMCwgImMsYSxpIiB9LAoteyAiYW5kIiwgMHg5MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYW5kIiwgMHg5MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYW5kbiIsIDB4OWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFuZG4iLCAweDlkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhc2VxIiwgMHg3MDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNlcSIsIDB4NzEwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ2UiLCAweDVjMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2dlIiwgMHg1ZDAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNnZXUiLCAweDVlMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2dldSIsIDB4NWYwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ3QiLCAweDU4MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2d0IiwgMHg1OTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNndHUiLCAweDVhMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2d0dSIsIDB4NWIwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbGUiLCAweDU0MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2xlIiwgMHg1NTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsZXUiLCAweDU2MDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2xldSIsIDB4NTcwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbHQiLCAweDUwMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2x0IiwgMHg1MTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsdHUiLCAweDUyMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2x0dSIsIDB4NTMwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbmVxIiwgMHg3MjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNuZXEiLCAweDczMDAwMDAwLCAidixhLGkiIH0sCi17ICJjYWxsIiwgMHhhODAwMDAwMCwgImEsUCIgfSwKLXsgImNhbGwiLCAweGE5MDAwMDAwLCAiYSxBIiB9LAoteyAiY2FsbGkiLCAweGM4MDAwMDAwLCAiYSxiIiB9LAoteyAiY2xhc3MiLCAweGU2MDAwMDAwLCAiYyxhLGYiIH0sCi17ICJjbHoiLCAweDA4MDAwMDAwLCAiYyxiIiB9LAoteyAiY2x6IiwgMHgwOTAwMDAwMCwgImMsaSIgfSwKLXsgImNvbnN0IiwgMHgwMzAwMDAwMCwgImEseCIgfSwKLXsgImNvbnN0aCIsIDB4MDIwMDAwMDAsICJhLGgiIH0sCi17ICJjb25zdGh6IiwgMHgwNTAwMDAwMCwgImEsaCIgfSwKLXsgImNvbnN0biIsIDB4MDEwMDAwMDAsICJhLFgiIH0sCi17ICJjb252ZXJ0IiwgMHhlNDAwMDAwMCwgImMsYSx1LHIsZCxmIiB9LAoteyAiY3BieXRlIiwgMHgyZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BieXRlIiwgMHgyZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BlcSIsIDB4NjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZXEiLCAweDYxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGdlIiwgMHg0YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BnZSIsIDB4NGQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ2V1IiwgMHg0ZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BnZXUiLCAweDRmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGd0IiwgMHg0ODAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BndCIsIDB4NDkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ3R1IiwgMHg0YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BndHUiLCAweDRiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGxlIiwgMHg0NDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsZSIsIDB4NDUwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbGV1IiwgMHg0NjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsZXUiLCAweDQ3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGx0IiwgMHg0MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsdCIsIDB4NDEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbHR1IiwgMHg0MjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BsdHUiLCAweDQzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcG5lcSIsIDB4NjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbmVxIiwgMHg2MzAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGFkZCIsIDB4ZjEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRkaXYiLCAweGY3MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZXEiLCAweGViMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZ2UiLCAweGVmMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZ3QiLCAweGVkMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXYiLCAweDZhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXYiLCAweDZiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkaXYwIiwgMHg2ODAwMDAwMCwgImMsYiIgfSwKLXsgImRpdjAiLCAweDY5MDAwMDAwLCAiYyxpIiB9LAoteyAiZGl2aWRlIiwgMHhlMTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2aWR1IiwgMHhlMzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2bCIsIDB4NmMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmwiLCAweDZkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkaXZyZW0iLCAweDZlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZyZW0iLCAweDZmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkbWFjIiwgMHhkOTAwMDAwMCwgIkYsQyxhLGIiIH0sCi17ICJkbXNtIiwgMHhkYjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZG11bCIsIDB4ZjUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRzdWIiLCAweGYzMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJlbXVsYXRlIiwgMHhkNzAwMDAwMCwgInYsYSxiIiB9LAoteyAiZXhieXRlIiwgMHgwYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXhieXRlIiwgMHgwYjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZXhodyIsIDB4N2MwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4aHciLCAweDdkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJleGh3cyIsIDB4N2UwMDAwMDAsICJjLGEiIH0sCi17ICJleHRyYWN0IiwgMHg3YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXh0cmFjdCIsIDB4N2IwMDAwMDAsICJjLGEsaSIgfSwKLXsgImZhZGQiLCAweGYwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZGl2IiwgMHhmNjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmRtdWwiLCAweGY5MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZXEiLCAweGVhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZ2UiLCAweGVlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZ3QiLCAweGVjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmbWFjIiwgMHhkODAwMDAwMCwgIkYsQyxhLGIiIH0sCi17ICJmbXNtIiwgMHhkYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZm11bCIsIDB4ZjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZzdWIiLCAweGYyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJoYWx0IiwgMHg4OTAwMDAwMCwgIiIgfSwKLXsgImluYnl0ZSIsIDB4MGMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImluYnl0ZSIsIDB4MGQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImluaHciLCAweDc4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJpbmh3IiwgMHg3OTAwMDAwMCwgImMsYSxpIiB9LAoteyAiaW52IiwgMHg5ZjAwMDAwMCwgIkkiIH0sCi17ICJpcmV0IiwgMHg4ODAwMDAwMCwgIiIgfSwKLXsgImlyZXRpbnYiLCAweDhjMDAwMDAwLCAiSSIgfSwKLXsgImptcCIsIDB4YTAwMDAwMDAsICJQIiB9LAoteyAiam1wIiwgMHhhMTAwMDAwMCwgIkEiIH0sCi17ICJqbXBmIiwgMHhhNDAwMDAwMCwgImEsUCIgfSwKLXsgImptcGYiLCAweGE1MDAwMDAwLCAiYSxBIiB9LAoteyAiam1wZmRlYyIsIDB4YjQwMDAwMDAsICJhLFAiIH0sCi17ICJqbXBmZGVjIiwgMHhiNTAwMDAwMCwgImEsQSIgfSwKLXsgImptcGZpIiwgMHhjNDAwMDAwMCwgImEsYiIgfSwKLXsgImptcGkiLCAweGMwMDAwMDAwLCAiYiIgfSwKLXsgImptcHQiLCAweGFjMDAwMDAwLCAiYSxQIiB9LAoteyAiam1wdCIsIDB4YWQwMDAwMDAsICJhLEEiIH0sCi17ICJqbXB0aSIsIDB4Y2MwMDAwMDAsICJhLGIiIH0sCi17ICJsb2FkIiwgMHgxNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkIiwgMHgxNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2FkbCIsIDB4MDYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZGwiLCAweDA3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRtIiwgMHgzNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkbSIsIDB4MzcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZHNldCIsIDB4MjYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZHNldCIsIDB4MjcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibWZhY2MiLCAweGU5MDAwMTAwLCAiYyxkLGYiIH0sCi17ICJtZnNyIiwgMHhjNjAwMDAwMCwgImMscyIgfSwKLXsgIm1mdGxiIiwgMHhiNjAwMDAwMCwgImMsYSIgfSwKLXsgIm10YWNjIiwgMHhlODAxMDAwMCwgImEsZCxmIiB9LAoteyAibXRzciIsIDB4Y2UwMDAwMDAsICJzLGIiIH0sCi17ICJtdHNyaW0iLCAweDA0MDAwMDAwLCAicyx4IiB9LAoteyAibXR0bGIiLCAweGJlMDAwMDAwLCAiYSxiIiB9LAoteyAibXVsIiwgMHg2NDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsIiwgMHg2NTAwMDAwMCwgImMsYSxpIiB9LAoteyAibXVsbCIsIDB4NjYwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bGwiLCAweDY3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJtdWx0aXBsdSIsIDB4ZTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRpcGx5IiwgMHhlMDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdG0iLCAweGRlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0bXUiLCAweGRmMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx1IiwgMHg3NDAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdSIsIDB4NzUwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm5hbmQiLCAweDlhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJuYW5kIiwgMHg5YjAwMDAwMCwgImMsYSxpIiB9LAoteyAibm9wIiwgMHg3MDQwMDEwMSwgIiIgfSwKLXsgIm5vciIsIDB4OTgwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm5vciIsIDB4OTkwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm9yIiwgMHg5MjAwMDAwMCwgImMsYSxiIiB9LAoteyAib3IiLCAweDkzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJvcm4iLCAweGFhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJvcm4iLCAweGFiMDAwMDAwLCAiYyxhLGkiIH0sCi0KLS8qIFRoZSBkZXNjcmlwdGlvbiBvZiAic2V0aXAiIGluIENoYXB0ZXIgOCAoImluc3RydWN0aW9uIHNldCIpIG9mIHRoZSB1c2VyJ3MKLSAgIG1hbnVhbCBjbGFpbXMgdGhhdCB0aGVzZSBhcmUgYWJzb2x1dGUgcmVnaXN0ZXIgbnVtYmVycy4gIEJ1dCBzZWN0aW9uCi0gICA3LjIuMSBleHBsYWlucyB0aGF0IHRoZXkgYXJlIG5vdC4gIFRoZSBsYXR0ZXIgaXMgY29ycmVjdCwgc28gcHJpbnQKLSAgIHRoZXNlIG5vcm1hbGx5ICgibHIwIiwgImxyNSIsIGV0Yy4pLiAgKi8KLXsgInNldGlwIiwgMHg5ZTAwMDAwMCwgImMsYSxiIiB9LAotCi17ICJzbGwiLCAweDgwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzbGwiLCAweDgxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzcXJ0IiwgMHhlNTAwMDAwMCwgImMsYSxmIiB9LAoteyAic3JhIiwgMHg4NjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3JhIiwgMHg4NzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3JsIiwgMHg4MjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3JsIiwgMHg4MzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3RvcmUiLCAweDFlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlIiwgMHgxZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdG9yZWwiLCAweDBlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlbCIsIDB4MGYwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3RvcmVtIiwgMHgzZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZW0iLCAweDNmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN1YiIsIDB4MjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YiIsIDB4MjUwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmMiLCAweDJjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjIiwgMHgyZDAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViY3MiLCAweDI4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjcyIsIDB4MjkwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmN1IiwgMHgyYTAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViY3UiLCAweDJiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyIiwgMHgzNDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViciIsIDB4MzUwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjIiwgMHgzYzAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmMiLCAweDNkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyY3MiLCAweDM4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyY3MiLCAweDM5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyY3UiLCAweDNhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyY3UiLCAweDNiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJycyIsIDB4MzAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJzIiwgMHgzMTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicnUiLCAweDMyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJydSIsIDB4MzMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnMiLCAweDIwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJzIiwgMHgyMTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VidSIsIDB4MjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnUiLCAweDIzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJ4bm9yIiwgMHg5NjAwMDAwMCwgImMsYSxiIiB9LAoteyAieG5vciIsIDB4OTcwMDAwMDAsICJjLGEsaSIgfSwKLXsgInhvciIsIDB4OTQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInhvciIsIDB4OTUwMDAwMDAsICJjLGEsaSIgfSwKLQoteyAiIiwgMHgwLCAiIiB9CQkvKiBEdW1teSBlbnRyeSwgbm90IGluY2x1ZGVkIGluIE5VTV9PUENPREVTLiAgVGhpcwotCQkJICAgbGV0cyBjb2RlIGV4YW1pbmUgZW50cnkgaSsxIHdpdGhvdXQgY2hlY2tpbmcKLQkJCSAgIGlmIHdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotfTsKLQotQ09OU1QgdW5zaWduZWQgaW50IG51bV9vcGNvZGVzID0gKCgoc2l6ZW9mIGEyOWtfb3Bjb2RlcykgLyAoc2l6ZW9mIGEyOWtfb3Bjb2Rlc1swXSkpIC0gMSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hbHBoYS5oIGIvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMWU5YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qIGFscGhhLmggLS0gSGVhZGVyIGZpbGUgZm9yIEFscGhhIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSB0YWJsZSB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT1BDT0RFX0FMUEhBX0gKLSNkZWZpbmUgT1BDT0RFX0FMUEhBX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgYWxwaGFfb3Bjb2RlLiAgKi8KLQotc3RydWN0IGFscGhhX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbWFzazsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHByaW1hcmlseSB1c2VkIHRvCi0gICAgIGluZGljYXRlIHNwZWNpZmljIHByb2Nlc3NvcnMgYW5kIGVudmlyb25tZW50cyBzdXBwb3J0IHRoZQotICAgICBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMgYXJlIGxpc3RlZCBiZWxvdy4gKi8KLSAgdW5zaWduZWQgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s0XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlIGFscGhhX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBhbHBoYV9udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi0vKiBDUFUgQXZhaWxhYmlsaXR5ICovCi0jZGVmaW5lIEFYUF9PUENPREVfQkFTRSAgMHgwMDAxICAvKiBCYXNlIGFyY2hpdGVjdHVyZSAtLSBhbGwgY3B1cy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY0ICAgMHgwMDAyICAvKiBFVjQgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY1ICAgMHgwMDA0ICAvKiBFVjUgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY2ICAgMHgwMDA4ICAvKiBFVjYgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQldYICAgMHgwMTAwICAvKiBCeXRlL3dvcmQgZXh0ZW5zaW9uIChhbWFzayBiaXQgMCkuICAqLwotI2RlZmluZSBBWFBfT1BDT0RFX0NJWCAgIDB4MDIwMCAgLyogIkNvdW50IiBleHRlbnNpb24gKGFtYXNrIGJpdCAxKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfTUFYICAgMHgwNDAwICAvKiBNdWx0aW1lZGlhIGV4dGVuc2lvbiAoYW1hc2sgYml0IDgpLiAgKi8KLQotI2RlZmluZSBBWFBfT1BDT0RFX05PUEFMICh+KEFYUF9PUENPREVfRVY0fEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfRVY2KSkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEFYUF9PUChpKQkoKChpKSA+PiAyNikgJiAweDNGKQotCi0vKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1ham9yIG9wY29kZXMuICovCi0jZGVmaW5lIEFYUF9OT1BTCTB4NDAKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotc3RydWN0IGFscGhhX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KLSAgaW50IGRlZmF1bHRfcmVsb2M7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCBvcCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGludCAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgYWxwaGFfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCBhbHBoYV9vcGVyYW5kc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGVyYW5kczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotLyogTWFzayBmb3Igc2VsZWN0aW5nIHRoZSB0eXBlIGZvciB0eXBlY2hlY2sgcHVycG9zZXMgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0sJCQkJCVwKLSAgKEFYUF9PUEVSQU5EX1BBUkVOUyB8IEFYUF9PUEVSQU5EX0NPTU1BIHwgQVhQX09QRVJBTkRfSVIgfAkJXAotICAgQVhQX09QRVJBTkRfRlBSIHwgQVhQX09QRVJBTkRfUkVMQVRJVkUgfCBBWFBfT1BFUkFORF9TSUdORUQgfCAJXAotICAgQVhQX09QRVJBTkRfVU5TSUdORUQpCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcwotICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcywgZm9yIHdoaWNoIHR3byBvcGVyYW5kcyBmaWVsZHMKLSAgIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBpbnNlcnQgZnVuY3Rpb24gd2l0aAotICAgYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgZXh0cmFjdCBmdW5jdGlvbiwKLSAgIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlIHBsYWNlZCBpbiB0aGUgaW52YWxpZAotICAgYXJndW1lbnQuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GQUtFCTAxCi0KLS8qIFRoZSBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgIlJhLGRpc3AoUmIpIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1BBUkVOUwkwMgotCi0vKiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggUEFSRU5TLCB0aGlzIHN1cHJlc3NlcyB0aGUgc3VwcmVzc2lvbiBvZgotICAgdGhlIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciAiam1wIFJhLChSYiksaGludCIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9DT01NQQkwNAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYW4gaW50ZWdlciByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0lSCQkwMTAKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GUFIJCTAyMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1JFTEFUSVZFCTA0MAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1NJR05FRAkwMTAwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyB1bnNpZ25lZCB2YWx1ZXMuICBUaGlzIGV4aXN0cyBwcmltYXJpbHkgc28gdGhhdAotICAgYSBmbGFncyB2YWx1ZSBvZiAwIGNhbiBiZSB0cmVhdGVkIGFzIGVuZC1vZi1hcmd1bWVudHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9VTlNJR05FRAkwMjAwCi0KLS8qIFN1cHJlc3Mgb3ZlcmZsb3cgZGV0ZWN0aW9uIG9uIHRoaXMgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGhpbnRzLiAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9OT09WRVJGTE9XCTA0MDAKLQotLyogTWFzayBmb3Igb3B0aW9uYWwgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0sgMDcwMDAKLQotLyogVGhpcyBvcGVyYW5kIGRlZmF1bHRzIHRvIHplcm8uICBUaGlzIGlzIHVzZWQgZm9yIGp1bXAgaGludHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8gMDEwMDAKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBmaXJzdCAocmVhbCkgb3BlcmFuZCBhbmQgaXMgdXNlZAotICAgaW4gY29uanVuY3Rpb24gd2l0aCBBWFBfT1BFUkFORF9PUFRJT05BTC4gIFRoaXMgYWxsb3dzCi0gICAiYW5kICQwLDMsJDAiIHRvIGJlIHdyaXR0ZW4gYXMgImFuZCAkMCwzIiwgZXRjLiAgSSBkb24ndCBsaWtlCi0gICBpdCwgYnV0IGl0J3Mgd2hhdCBERUMgZG9lcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QgMDIwMDAKLQotLyogU2ltaWxhcmx5LCB0aGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNlY29uZCAocmVhbCkgb3BlcmFuZC4KLSAgIFRoaXMgYWxsb3dzICJuZWdsICQwIiBpbnN0ZWFkIG9mICJuZWdsICQwLCQwIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EIDA0MDAwCi0KLQwKLS8qIFJlZ2lzdGVyIGNvbW1vbiBuYW1lcyAqLwotCi0jZGVmaW5lIEFYUF9SRUdfVjAJMAotI2RlZmluZSBBWFBfUkVHX1QwCTEKLSNkZWZpbmUgQVhQX1JFR19UMQkyCi0jZGVmaW5lIEFYUF9SRUdfVDIJMwotI2RlZmluZSBBWFBfUkVHX1QzCTQKLSNkZWZpbmUgQVhQX1JFR19UNAk1Ci0jZGVmaW5lIEFYUF9SRUdfVDUJNgotI2RlZmluZSBBWFBfUkVHX1Q2CTcKLSNkZWZpbmUgQVhQX1JFR19UNwk4Ci0jZGVmaW5lIEFYUF9SRUdfUzAJOQotI2RlZmluZSBBWFBfUkVHX1MxCTEwCi0jZGVmaW5lIEFYUF9SRUdfUzIJMTEKLSNkZWZpbmUgQVhQX1JFR19TMwkxMgotI2RlZmluZSBBWFBfUkVHX1M0CTEzCi0jZGVmaW5lIEFYUF9SRUdfUzUJMTQKLSNkZWZpbmUgQVhQX1JFR19GUAkxNQotI2RlZmluZSBBWFBfUkVHX0EwCTE2Ci0jZGVmaW5lIEFYUF9SRUdfQTEJMTcKLSNkZWZpbmUgQVhQX1JFR19BMgkxOAotI2RlZmluZSBBWFBfUkVHX0EzCTE5Ci0jZGVmaW5lIEFYUF9SRUdfQTQJMjAKLSNkZWZpbmUgQVhQX1JFR19BNQkyMQotI2RlZmluZSBBWFBfUkVHX1Q4CTIyCi0jZGVmaW5lIEFYUF9SRUdfVDkJMjMKLSNkZWZpbmUgQVhQX1JFR19UMTAJMjQKLSNkZWZpbmUgQVhQX1JFR19UMTEJMjUKLSNkZWZpbmUgQVhQX1JFR19SQQkyNgotI2RlZmluZSBBWFBfUkVHX1BWCTI3Ci0jZGVmaW5lIEFYUF9SRUdfVDEyCTI3Ci0jZGVmaW5lIEFYUF9SRUdfQVQJMjgKLSNkZWZpbmUgQVhQX1JFR19HUAkyOQotI2RlZmluZSBBWFBfUkVHX1NQCTMwCi0jZGVmaW5lIEFYUF9SRUdfWkVSTwkzMQotCi0jZW5kaWYgLyogT1BDT0RFX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FyYy5oIGIvaW5jbHVkZS9vcGNvZGUvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTBjYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kCi10aGUgR05VIEJpbnV0aWxzLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCUlmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTGlzdCBvZiB0aGUgdmFyaW91cyBjcHUgdHlwZXMuCi0gICBUaGUgdGFibGVzIGN1cnJlbnRseSB1c2UgYml0IG1hc2tzIHRvIHNheSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBvcgotICAgd2hhdGV2ZXIgaXMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjcHUuICBUaGlzIGxldHMgdXMgaGF2ZSBvbmUgZW50cnkKLSAgIGFwcGx5IHRvIHNldmVyYWwgY3B1cy4KLQotICAgVGhpcyBkdXBsaWNhdGVzIGJmZF9tYWNoX2FyY194eHguICBGb3Igbm93IEkgd2lzaCB0byBpc29sYXRlIHRoaXMgZnJvbSBiZmQKLSAgIGFuZCBiZmQgZnJvbSB0aGlzLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgYml0IHZhbHVlcyBhcyB3ZSB3YW50Ci0gICB0byBhbGxvdyBmb3IgdGhpbmdzIGF2YWlsYWJsZSBvbiBtb3JlIHRoYW4gb25lIEFSQyAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwKLSAgIEFSQ3MpLiAgKi8KLQotLyogVGhlIGBiYXNlJyBjcHUgbXVzdCBiZSAwICh0YWJsZSBlbnRyaWVzIGFyZSBvbWl0dGVkIGZvciB0aGUgYmFzZSBjcHUpLgotICAgVGhlIGNwdSB0eXBlIGlzIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBvZiBlbmRpYW5uZXNzLgotICAgVGhlIGNvbXBsZXRlIGBtYWNoJyBudW1iZXIgaW5jbHVkZXMgZW5kaWFubmVzcy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgaW50ZXJuYWwgdG8gb3Bjb2Rlcy9iZmQvYmludXRpbHMvZ2FzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQkFTRSAwCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDEgMQotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQyIDIKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VENCA0Ci0vKiBBZGRpdGlvbmFsIGNwdSB2YWx1ZXMgY2FuIGJlIGluc2VydGVkIGhlcmUgYW5kIEFSQ19NQUNIX0JJRyBtb3ZlZCBkb3duLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQklHIDgKLQotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQ1BVX01BU0sgNwotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlICsgZW5kaWFubmVzcy4gICovCi0jZGVmaW5lIEFSQ19NQUNIX01BU0sgMTUKLQotLyogVHlwZSB0byBkZW5vdGUgYW4gQVJDIGluc3RydWN0aW9uIChhdCBsZWFzdCBhIDMyIGJpdCB1bnNpZ25lZCBpbnQpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGFyY19pbnNuOwotCi1zdHJ1Y3QgYXJjX29wY29kZSB7Ci0gIGNoYXIgKnN5bnRheDsJCQkvKiBzeW50YXggb2YgaW5zbiAqLwotICB1bnNpZ25lZCBsb25nIG1hc2ssIHZhbHVlOwkvKiByZWNvZ25pemUgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gIGludCBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0vKiBGaXJzdCBvcGNvZGUgZmxhZyBiaXQgYXZhaWxhYmxlIGFmdGVyIG1hY2hpbmUgbWFzay4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfRkxBR19TVEFSVCAoKEFSQ19NQUNIX01BU0sgKyAxKSA8PCAwKQotLyogVGhpcyBpbnNuIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DT05EX0JSQU5DSCAoQVJDX09QQ09ERV9GTEFHX1NUQVJUKQotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBhc3NlbWJseSBhbmQgZGlzYXNzZW1ibHkuICBFYWNoIGluc24gaXMKLSAgICAgb24gYSBsaXN0IG9mIHJlbGF0ZWQgaW5zbnMgKHNhbWUgZmlyc3QgbGV0dGVyIGZvciBhc3NlbWJseSwgc2FtZSBpbnNuIGNvZGUKLSAgICAgZm9yIGRpc2Fzc2VtYmx5KS4gICovCi0gIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2FzbTsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGFzc2VtYmx5LiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfZGlzOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgZGlzYXNzZW1ibHkuICAqLwotCi0gIC8qIE1hY3JvcyB0byBjcmVhdGUgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgbGlzdHMuICAqLwotI2RlZmluZSBBUkNfSEFTSF9PUENPREUoc3RyaW5nKSBcCi0gICgoc3RyaW5nKVswXSA+PSAnYScgJiYgKHN0cmluZylbMF0gPD0gJ3onID8gKHN0cmluZylbMF0gLSAnYScgOiAyNikKLSNkZWZpbmUgQVJDX0hBU0hfSUNPREUoaW5zbikgXAotICAoKHVuc2lnbmVkIGludCkgKGluc24pID4+IDI3KQotCi0gIC8qIE1hY3JvcyB0byBhY2Nlc3MgYG5leHRfYXNtJywgYG5leHRfZGlzJyBzbyB1c2VycyBuZWVkbid0IGNhcmUgYWJvdXQgdGhlCi0gICAgIHVuZGVybHlpbmcgbWVjaGFuaXNtLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0FTTShvcCkgKChvcCktPm5leHRfYXNtKQotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfRElTKG9wKSAoKG9wKS0+bmV4dF9kaXMpCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgewotICBjaGFyICpuYW1lOwkJCS8qIGVnOiAiZXEiICovCi0gIHNob3J0IHZhbHVlOwkJCS8qIGVnOiAxICovCi0gIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QVkFMX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmQgewotICAvKiBPbmUgb2YgdGhlIGluc24gZm9ybWF0IGNoYXJzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmbXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kIChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yCi0gICAgIHRoZSBtb2RpZmllcidzIGZsYWcgYml0IChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaGlmdDsKLQotICAvKiBWYXJpb3VzIGZsYWcgYml0cy4gICovCi0gIGludCBmbGFnczsKLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgc3VmZml4IHRvIHRoZSBvcGNvZGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TVUZGSVggMQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCAyCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0ggNAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BRERSRVNTIDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgbG9uZyBpbW1lZGlhdGUgdmFsdWUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9MSU1NIDB4MTAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TSUdORUQgMHgyMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKLSAgIHJhbmdlIG9mIHZhbHVlcy4gIFRoYXQgaXMsIGlmIGJpdHMgaXMgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tCi0gICAtMHg4MDAwIHRvIDB4ZmZmZi4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05PUFQgMHg0MAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKLSAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKLSAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQotICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCi0gICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfTkVHQVRJVkUgMHg4MAotCi0vKiBUaGlzIG9wZXJhbmQgZG9lc24ndCByZWFsbHkgZXhpc3QuICBUaGUgcHJvZ3JhbSB1c2VzIHRoZXNlIG9wZXJhbmRzCi0gICBpbiBzcGVjaWFsIHdheXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9GQUtFIDB4MTAwCi0KLS8qIE1vZGlmaWVyIHZhbHVlcy4gICovCi0vKiBBIGRvdCBpcyByZXF1aXJlZCBiZWZvcmUgYSBzdWZmaXguICBFZzogLmxlICAqLwotI2RlZmluZSBBUkNfTU9EX0RPVCAweDEwMDAKLQotLyogQSBub3JtYWwgcmVnaXN0ZXIgaXMgYWxsb3dlZCAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBjb21wbGV0ZW5lc3MpLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9SRUcgMHgyMDAwCi0KLS8qIEFuIGF1eGlsaWFyeSByZWdpc3RlciBuYW1lIGlzIGV4cGVjdGVkLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9BVVhSRUcgMHg0MDAwCi0KLS8qIFN1bSBvZiBhbGwgQVJDX01PRF9YWFggYml0cy4gICovCi0jZGVmaW5lIEFSQ19NT0RfQklUUyAweDcwMDAKLQotLyogTm9uLXplcm8gaWYgdGhlIG9wZXJhbmQgdHlwZSBpcyByZWFsbHkgYSBtb2RpZmllci4gICovCi0jZGVmaW5lIEFSQ19NT0RfUChYKSAoKFgpICYgQVJDX01PRF9CSVRTKQotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChwICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIE8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQuCi0KLSAgICAgUkVHIGlzIG5vbi1OVUxMIHdoZW4gaW5zZXJ0aW5nIGEgcmVnaXN0ZXIgdmFsdWUuICAqLwotCi0gIGFyY19pbnNuICgqaW5zZXJ0KSBQQVJBTVMgKChhcmNfaW5zbiBpbnNuLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLCBpbnQgbW9kcywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnLCBsb25nIHZhbHVlLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uLCBPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotCi0gICAgIElOU04gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byBgYXJjX2luc24ncy4gIFRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgIHRoZSBpbnNuLCB0aGUgc2Vjb25kIGlzIHRoZSBsaW1tIGlmIHByZXNlbnQuCi0KLSAgICAgT3BlcmFuZHMgdGhhdCBoYXZlIGEgcHJpbnRhYmxlIGZvcm0gbGlrZSByZWdpc3RlcnMgYW5kIHN1ZmZpeGVzIGhhdmUKLSAgICAgdGhlaXIgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHBvaW50ZXIgc3RvcmVkIGluIE9QVkFMLiAgKi8KLQotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoYXJjX2luc24gKmluc24sCi0JCQkgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsCi0JCQkgICBpbnQgbW9kcywgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWwsCi0JCQkgICBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIGNwdSB3ZSBoYXZlLgotICAgVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCB0byBhcmNfaW5pdF9vcGNvZGVfdGFibGVzLgotICAgQXQgcHJlc2VudCwgYWxsIHRoZXJlIGlzIGlzIHRoZSBjcHUgdHlwZS4gICovCi0KLS8qIENQVSBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogTUFDSCBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotCi0vKiBTcGVjaWFsIHJlZ2lzdGVyIHZhbHVlczogICovCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU1fVVBEQVRFIDYxCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU0gNjMKLSNkZWZpbmUgQVJDX1JFR19MSU1NIDYyCi0KLS8qIE5vbi16ZXJvIGlmIFJFRyBpcyBhIGNvbnN0YW50IG1hcmtlci4gICovCi0jZGVmaW5lIEFSQ19SRUdfQ09OU1RBTlRfUChSRUcpICgoUkVHKSA+PSA2MSkKLQotLyogUG9zaXRpb25zIGFuZCBtYXNrcyBvZiB2YXJpb3VzIGZpZWxkczogICovCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdBIDIxCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdCIDE1Ci0jZGVmaW5lIEFSQ19TSElGVF9SRUdDIDkKLSNkZWZpbmUgQVJDX01BU0tfUkVHIDYzCi0KLS8qIERlbGF5IHNsb3QgdHlwZXMuICAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9ORSAwCS8qIG5vIGRlbGF5IHNsb3QgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX05PUk1BTCAxCS8qIGRlbGF5IHNsb3QgaW4gYm90aCBjYXNlcyAqLwotI2RlZmluZSBBUkNfREVMQVlfSlVNUCAyCS8qIGRlbGF5IHNsb3Qgb25seSBpZiBicmFuY2ggdGFrZW4gKi8KLQotLyogTm9uLXplcm8gaWYgWCB3aWxsIGZpdCBpbiBhIHNpZ25lZCA5IGJpdCBmaWVsZC4gICovCi0jZGVmaW5lIEFSQ19TSElNTV9DT05TVF9QKHgpICgobG9uZykgKHgpID49IC0yNTYgJiYgKGxvbmcpICh4KSA8PSAyNTUpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgYXJjX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGVyYW5kX2NvdW50OwotZXh0ZXJuIC8qY29uc3QqLyBzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfb3Bjb2Rlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwW107Ci0KLS8qIFV0aWxpdHkgZm5zIGluIGFyYy1vcGMuYy4gICovCi1pbnQgYXJjX2dldF9vcGNvZGVfbWFjaCBQQVJBTVMgKChpbnQsIGludCkpOwotLyogYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgYXJjX3h4eF9zdXBwb3J0ZWQnLiAgKi8KLXZvaWQgYXJjX29wY29kZV9pbml0X3RhYmxlcyBQQVJBTVMgKChpbnQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0IFBBUkFNUyAoKHZvaWQpKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9hc20gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfZGlzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotaW50IGFyY19vcGNvZGVfbGltbV9wIFBBUkFNUyAoKGxvbmcgKikpOwotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICphcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlLCBpbnQgdmFsdWUpKTsKLWludCBhcmNfb3Bjb2RlX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqKSk7Ci1pbnQgYXJjX29wdmFsX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJtLmggYi9pbmNsdWRlL29wY29kZS9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwODdlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKiBBUk0gb3Bjb2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogdHlwZXMgb2YgaW5zdHJ1Y3Rpb24gKGVuY29kZWQgaW4gYml0cyAyNiBhbmQgMjcgb2YgdGhlIGluc3RydWN0aW9uKSAqLwotCi0jZGVmaW5lIFRZUEVfQVJJVEhNRVRJQwkJMAotI2RlZmluZSBUWVBFX0xEUl9TVFIJCTEKLSNkZWZpbmUgVFlQRV9CTE9DS19CUkFOQ0gJMgotI2RlZmluZSBUWVBFX1NXSQkJMwotCi0vKiBiaXQgMjUgZGVjaWRlcyB3aGV0aGVyIGFuIGluc3RydWN0aW9uIGlzIGEgYmxvY2sgbW92ZSBvciBhIGJyYW5jaCAqLwotI2RlZmluZSBTVUJUWVBFX0JMT0NLCQkwCi0jZGVmaW5lIFNVQlRZUEVfQlJBTkNICQkxCi0KLS8qIGNvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIE9QQ09ERV9BTkQJMAotI2RlZmluZSBPUENPREVfRU9SCTEKLSNkZWZpbmUgT1BDT0RFX1NVQgkyCi0jZGVmaW5lIE9QQ09ERV9SU0IJMwotI2RlZmluZSBPUENPREVfQURECTQKLSNkZWZpbmUgT1BDT0RFX0FEQwk1Ci0jZGVmaW5lIE9QQ09ERV9TQkMJNgotI2RlZmluZSBPUENPREVfUlNDCTcKLSNkZWZpbmUgT1BDT0RFX1RTVAk4Ci0jZGVmaW5lIE9QQ09ERV9URVEJOQotI2RlZmluZSBPUENPREVfQ01QCTEwCi0jZGVmaW5lIE9QQ09ERV9DTU4JMTEKLSNkZWZpbmUgT1BDT0RFX09SUgkxMgotI2RlZmluZSBPUENPREVfTU9WCTEzCi0jZGVmaW5lIE9QQ09ERV9CSUMJMTQKLSNkZWZpbmUgT1BDT0RFX01WTgkxNQotCi0vKiBjb25kaXRpb24gY29kZXMgKi8KLQotI2RlZmluZSBDT05EX0VRCQkwCi0jZGVmaW5lIENPTkRfTkUJCTEKLSNkZWZpbmUgQ09ORF9DUwkJMgotI2RlZmluZSBDT05EX0NDCQkzCi0jZGVmaW5lIENPTkRfTUkJCTQKLSNkZWZpbmUgQ09ORF9QTAkJNQotI2RlZmluZSBDT05EX1ZTCQk2Ci0jZGVmaW5lIENPTkRfVkMJCTcKLSNkZWZpbmUgQ09ORF9ISQkJOAotI2RlZmluZSBDT05EX0xTCQk5Ci0jZGVmaW5lIENPTkRfR0UJCTEwCi0jZGVmaW5lIENPTkRfTFQJCTExCi0jZGVmaW5lIENPTkRfR1QJCTEyCi0jZGVmaW5lIENPTkRfTEUJCTEzCi0jZGVmaW5lIENPTkRfQUwJCTE0Ci0jZGVmaW5lIENPTkRfTlYJCTE1Ci0KLS8qIERlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGFuIEFSTSBtYWNoaW5lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCBnZW5lcmljX2ZtdCB7Ci0gICAgdW5zaWduZWQgcmVzdAk6MjU7CS8qIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHN1YnR5cGUJOjE7CS8qIHVzZWQgdG8gZGVjaWRlIGJldHdlZW4gYmxvY2sgYW5kIGJyYW5jaCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qIG9uZSBvZiBUWVBFXyogKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBhcml0aF9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtIG9yIHJuIHNoaWZ0IHJtICovCi0gICAgdW5zaWduZWQgZGVzdAk6NDsJLyogcGxhY2Ugd2hlcmUgdGhlIGFuc3dlciBnb2VzICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjQ7CS8qIGZpcnN0IG9wZXJhbmQgdG8gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IHByb2Nlc3NvciBmbGFncyAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogb25lIG9mIE9QQ09ERV8qIGRlZmluZWQgYWJvdmUgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogb3BlcmFuZDIgaXMgYW4gaW1tZWRpYXRlIHZhbHVlICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9BUklUSE1FVElDICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgbGRyX3N0cl9mbXQgewotICAgIHVuc2lnbmVkIG9mZnNldAk6MTI7CS8qICNubiBvciBybiBvciBybiBzaGlmdCAjbSAqLwotICAgIHVuc2lnbmVkIHJlZwk6NDsJLyogZGVzdGluYXRpb24gZm9yIExEUiwgc291cmNlIGZvciBTVFIgKi8KLSAgICB1bnNpZ25lZCBiYXNlCTo0OwkvKiBiYXNlIHJlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERSICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHdyaXRlIGJhY2sgKGJhc2Urb2Zmc2V0KSBpbnRvIGJhc2UgKi8KLSAgICB1bnNpZ25lZCBieXRlCToxOwkvKiA9PSAxIG1lYW5zIGJ5dGUgYWNjZXNzIGVsc2Ugd29yZCAqLwotICAgIHVuc2lnbmVkIHVwCQk6MTsJLyogPT0gMSBtZWFucyBhZGQgb2Zmc2V0IGVsc2Ugc3VidHJhY3QgaXQgKi8KLSAgICB1bnNpZ25lZCBwcmVfaW5kZXgJOjE7CS8qID09IDEgbWVhbnMgW2EsYl0gZm9ybSBlbHNlIFthXSxiIGZvcm0gKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMCBtZWFucyBpbW1lZGlhdGUgb2Zmc2V0ICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9MRFJfU1RSICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYmxvY2tfZm10IHsKLSAgICB1bnNpZ25lZCBtYXNrCToxNjsJLyogcmVnaXN0ZXIgbWFzayAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIHJlZ2lzdGVyIHVzZWQgYXMgYmFzZSBvZiBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERNICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHVwZGF0ZSBiYXNlIGFmdGVyIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IGZsYWdzIGluIHBjIGlmIGluY2x1ZGVkIGluIG1hc2sgKi8KLSAgICB1bnNpZ25lZCBpbmNyZW1lbnQJOjE7CS8qID09IDEgbWVhbnMgaW5jcmVtZW50IGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBiZWZvcmUJOjE7CS8qID09IDEgbWVhbnMgaW5jL2RlYyBiZWZvcmUgZWFjaCBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfYmxvY2sJOjE7CS8qID09IFNVQlRZUEVfQkxPQ0sgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGJyYW5jaF9mbXQgewotICAgIHVuc2lnbmVkIGRlc3QJOjI0OwkvKiBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoICovCi0gICAgdW5zaWduZWQgbGluawk6MTsJLyogYnJhbmNoIHdpdGggbGluayAoZnVuY3Rpb24gY2FsbCkgKi8KLSAgICB1bnNpZ25lZCBpc19icmFuY2gJOjE7CS8qID09IFNVQlRZUEVfQlJBTkNIICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9CTE9DS19CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLSNkZWZpbmUgUk9VTkRfTgkJMAotI2RlZmluZSBST1VORF9QCQkxCi0jZGVmaW5lIFJPVU5EX00JCTIKLSNkZWZpbmUgUk9VTkRfWgkJMwotCi0jZGVmaW5lIEZMT0FUMl9NVkYJMAotI2RlZmluZSBGTE9BVDJfTU5GCTEKLSNkZWZpbmUgRkxPQVQyX0FCUwkyCi0jZGVmaW5lIEZMT0FUMl9STkQJMwotI2RlZmluZSBGTE9BVDJfU1FUCTQKLSNkZWZpbmUgRkxPQVQyX0xPRwk1Ci0jZGVmaW5lIEZMT0FUMl9MR04JNgotI2RlZmluZSBGTE9BVDJfRVhQCTcKLSNkZWZpbmUgRkxPQVQyX1NJTgk4Ci0jZGVmaW5lIEZMT0FUMl9DT1MJOQotI2RlZmluZSBGTE9BVDJfVEFOCTEwCi0jZGVmaW5lIEZMT0FUMl9BU04JMTEKLSNkZWZpbmUgRkxPQVQyX0FDUwkxMgotI2RlZmluZSBGTE9BVDJfQVROCTEzCi0KLSNkZWZpbmUgRkxPQVQzX0FERgkwCi0jZGVmaW5lIEZMT0FUM19NVUYJMQotI2RlZmluZSBGTE9BVDNfU1VGCTIKLSNkZWZpbmUgRkxPQVQzX1JTRgkzCi0jZGVmaW5lIEZMT0FUM19EVkYJNAotI2RlZmluZSBGTE9BVDNfUkRGCTUKLSNkZWZpbmUgRkxPQVQzX1BPVwk2Ci0jZGVmaW5lIEZMT0FUM19SUFcJNwotI2RlZmluZSBGTE9BVDNfUk1GCTgKLSNkZWZpbmUgRkxPQVQzX0ZNTAk5Ci0jZGVmaW5lIEZMT0FUM19GRFYJMTAKLSNkZWZpbmUgRkxPQVQzX0ZSRAkxMQotI2RlZmluZSBGTE9BVDNfUE9MCTEyCi0KLXN0cnVjdCBmbG9hdDJfZm10IHsKLSAgICB1bnNpZ25lZCBvcGVyYW5kMgk6MzsJLyogc2Vjb25kIG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMSBpZiBzZWNvbmQgb3BlcmFuZCBpcyBhIGNvbnN0YW50ICovCi0gICAgdW5zaWduZWQgcGFkMQk6MTsJLyogPT0gMCAqLwotICAgIHVuc2lnbmVkIHJvdW5kaW5nCToyOwkvKiBST1VORF8qICovCi0gICAgdW5zaWduZWQgaXNfZG91YmxlCToxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBkb3VibGUgKG9ubHkgaWYgbm90IGV4dGVuZGVkKSAqLwotICAgIHVuc2lnbmVkIHBhZDIJOjQ7CS8qID09IDEgKi8KLSAgICB1bnNpZ25lZCBkZXN0CTozOwkvKiBkZXN0aW5hdGlvbiAqLwotICAgIHVuc2lnbmVkIGlzXzJfb3AJOjE7CS8qID09IDEgaWYgMiBvcGVyYW5kIGlucyAqLwotICAgIHVuc2lnbmVkIG9wZXJhbmQxCTozOwkvKiBmaXJzdCBvcGVyYW5kIChvbmx5IG9mIGlzXzJfb3AgPT0gMCkgKi8KLSAgICB1bnNpZ25lZCBpc19leHRlbmRlZCA6MTsJLyogPT0gMSBpZiBwcmVjaXNpb24gaXMgZXh0ZW5kZWQgKi8KLSAgICB1bnNpZ25lZCBvcGNvZGUJOjQ7CS8qIEZMT0FUMl8qIG9yIEZMT0FUM18qIGRlcGVuZGluZyBvbiBpc18yX29wICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8yCToyOwkvKiA9PSAyICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBDT05EXyogKi8KLX07Ci0KLXN0cnVjdCBzd2lfZm10IHsKLSAgICB1bnNpZ25lZCBhcmd1bWVudAk6MjQ7CS8qIGFyZ3VtZW50IHRvIFNXSSAoc3lzY2FsbCBudW1iZXIpICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8zCToyOwkvKiA9PSAzICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXVuaW9uIGluc25fZm10IHsKLSAgICBzdHJ1Y3QgZ2VuZXJpY19mbXQJZ2VuZXJpYzsKLSAgICBzdHJ1Y3QgYXJpdGhfZm10CWFyaXRoOwotICAgIHN0cnVjdCBsZHJfc3RyX2ZtdAlsZHJfc3RyOwotICAgIHN0cnVjdCBibG9ja19mbXQJYmxvY2s7Ci0gICAgc3RydWN0IGJyYW5jaF9mbXQJYnJhbmNoOwotICAgIHN0cnVjdCBzd2lfZm10CXN3aTsKLSAgICB1bnNpZ25lZCBsb25nCWluczsKLX07Ci0KLXN0cnVjdCBvcGNvZGUgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlCQkJJQotICAgJTxiaXRmaWVsZD5kCQlwcmludCB0aGUgYml0ZmllbGQgaW4gZGVjaW1hbAotICAgJTxiaXRmaWVsZD54CQlwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPnIJCXByaW50IGFzIGFuIEFSTSByZWdpc3RlcgotICAgJTxiaXRmaWVsZD5mCQlwcmludCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGlmID43IGVsc2UgYW4gZnAgcmVnaXN0ZXIKLSAgICVjCQkJcHJpbnQgY29uZGl0aW9uIGNvZGUgKGFsd2F5cyBiaXRzIDI4LTMxKQotICAgJVAJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gYXJpdGhtZXRpYyBpbnNuCi0gICAlUQkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBsZGYvc3RmIGluc24KLSAgICVSCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZQotICAgJTxiaXRudW0+J2MJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCi0gICAlPGJpdG51bT5gYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyB6ZXJvCi0gICAlPGJpdG51bT4/YWIJCXByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIKLSAgICVwCQkJcHJpbnQgJ3AnIGlmZiBiaXRzIDEyLTE1IGFyZSAxNQotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0qLwotCi1zdGF0aWMgc3RydWN0IG9wY29kZSBvcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIDB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlMC0zciIsCi0gICAgMHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIiLAotICAgIDB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAncyAlMTItMTVyLCAlbyIsCi0gICAgMHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDA0MDAwMDAwLCAweDBjMTAwMDAwLCAic3RyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IgJTEyLTE1ciwgJWEiLAotICAgIDB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtIiwKLSAgICAweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmEgJTE2LTE5ciUyMmAhLCAlbSUyMideIiwKLSAgICAweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiVjJTI0J2wgJWIiLAotICAgIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klYyAlMC0yM3giLAotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVIgJTE2LTE4ZiwgJTEyLTE1ciIsCi0gICAgMHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVIgJTEyLTE1ciwgJTAtMmYiLAotICAgIDB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlYyAlMTItMTVyIiwKLSAgICAweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWMgJTEyLTE1ciIsCi0gICAgMHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjICUxMi0xNXIiLAotICAgIDB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlYyAlMTItMTVyIiwKLSAgICAweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIDB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRICUxMi0xNGYsICVBIiwKLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlYyAlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWMgJTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyYGwgJTgtMTFkLCBjciUxMi0xNWQsICVBIiwKLSAgICAweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIC8qIHRoZSByZXN0ICovCi0gICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgiLAotfTsKLSNkZWZpbmUgTl9PUENPREVTCShzaXplb2Ygb3Bjb2RlcyAvIHNpemVvZiBvcGNvZGVzWzBdKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oIGIvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGIyNzJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MTUgKzAsMCBAQAotLyogSGVhZGVyIGZpbGUgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fSAotI2RlZmluZSBDR0VOX0gKLQotLyogPz8/IFRoaXMgZmlsZSByZXF1aXJlcyBiZmQuaCBidXQgb25seSB0byBnZXQgYmZkX3ZtYS4KLSAgIFNlZW1zIGxpa2UgYW4gYXdmdWwgbG90IHRvIHJlcXVpcmUganVzdCB0byBnZXQgc3VjaCBhIGZ1bmRhbWVudGFsIHR5cGUuCi0gICBQZXJoYXBzIHRoZSBkZWZpbml0aW9uIG9mIGJmZF92bWEgY2FuIGJlIG1vdmVkIG91dHNpZGUgb2YgYmZkLmguCi0gICBPciBwZXJoYXBzIG9uZSBjb3VsZCBkdXBsaWNhdGUgaXRzIGRlZmluaXRpb24gaW4gYW5vdGhlciBmaWxlLgotICAgVW50aWwgc3VjaCB0aW1lLCB0aGlzIGZpbGUgY29uZGl0aW9uYWxseSBjb21waWxlcyBkZWZpbml0aW9ucyB0aGF0IHJlcXVpcmUKLSAgIGJmZF92bWEgdXNpbmcgQkZEX1ZFUlNJT04uICAqLwotCi0vKiBFbnVtcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi0gICBBbGxvdyB0aGVtIHRvIGJlIHVzZWQgaW4gc3RydWN0IGRlZmluaXRpb25zLCBldmVuIHRob3VnaCB0aGUgZW51bSBtdXN0Ci0gICBiZSBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgIElmIENHRU5fQVJDSCBpc24ndCBkZWZpbmVkLCB0aGlzIGZpbGUgaXMgYmVpbmcgaW5jbHVkZWQgYnkgc29tZXRoaW5nIG90aGVyCi0gICB0aGFuIDxhcmNoPi1kZXNjLmguICAqLwotCi0vKiBQcmVwZW5kIHRoZSBhcmNoIG5hbWUsIGRlZmluZWQgaW4gPGFyY2g+LWRlc2MuaCwgYW5kIF9jZ2VuXyB0byBzeW1ib2wgUy4KLSAgIFRoZSBsYWNrIG9mIHNwYWNlcyBpbiB0aGUgYXJnIGxpc3QgaXMgaW1wb3J0YW50IGZvciBub24tc3RkYyBzeXN0ZW1zLgotICAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IDxhcmNoPi1kZXNjLmguCi0gICBJdCBjYW4gYmUgaW5jbHVkZWQgaW5kZXBlbmRlbnRseSBvZiA8YXJjaD4tZGVzYy5oLCBpbiB3aGljaCBjYXNlIHRoZSBhcmNoCi0gICBkZXBlbmRlbnQgcG9ydGlvbnMgd2lsbCBiZSBkZWNsYXJlZCBhcyAidW5rbm93bl9jZ2VuX2ZvbyIuICAqLwotCi0jaWZuZGVmIENHRU5fU1lNCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKHVua25vd24sX2NnZW5fLHMpCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdGF0aWMgKHVuY2hhbmdpbmcpIHBpZWNlcyBhbmQgYXMgbXVjaCBvdGhlciBzdHVmZgotICAgYXMgd2UgY2FuIHJlYXNvbmFibHkgcHV0IGhlcmUuICBJdCdzIGdlbmVyYWxseSBjbGVhbmVyIHRvIHB1dCBzdHVmZiBoZXJlCi0gICByYXRoZXIgdGhhbiBoYXZpbmcgaXQgbWFjaGluZSBnZW5lcmF0ZWQgaWYgcG9zc2libGUuICAqLwotCi0vKiBUaGUgYXNzZW1ibGVyIHN5bnRheCBpcyBtYWRlIHVwIG9mIGV4cHJlc3Npb25zIChkdWguLi4pLgotICAgQXQgdGhlIGxvd2VzdCBsZXZlbCB0aGUgdmFsdWVzIGFyZSBtbmVtb25pY3MsIHJlZ2lzdGVyIG5hbWVzLCBudW1iZXJzLCBldGMuCi0gICBBYm92ZSB0aGF0IGFyZSBzdWJleHByZXNzaW9ucywgaWYgYW55IChhbiBleGFtcGxlIG1pZ2h0IGJlIHRoZQotICAgImVmZmVjdGl2ZSBhZGRyZXNzIiBpbiBtNjhrIGNwdXMpLiAgU3ViZXhwcmVzc2lvbnMgYXJlIHdpcC4KLSAgIEF0IHRoZSBzZWNvbmQgaGlnaGVzdCBsZXZlbCBhcmUgdGhlIGluc25zIHRoZW1zZWx2ZXMuICBBYm92ZSB0aGF0IGFyZQotICAgcHNldWRvLWluc25zLCBzeW50aGV0aWMgaW5zbnMsIGFuZCBtYWNyb3MsIGlmIGFueS4gICovCi0MCi0vKiBMb3RzIG9mIGNwdSdzIGhhdmUgYSBmaXhlZCBpbnNuIHNpemUsIG9yIG9uZSB3aGljaCByYXJlbHkgY2hhbmdlcywKLSAgIGFuZCBpdCdzIGdlbmVyYWxseSBlYXNpZXIgdG8gaGFuZGxlIHRoZXNlIGJ5IHRyZWF0aW5nIHRoZSBpbnNuIGFzIGFuCi0gICBpbnRlZ2VyIHR5cGUsIHJhdGhlciB0aGFuIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBTbyB3ZSBhbGxvdyB0YXJnZXRzCi0gICB0byBjb250cm9sIHRoaXMuICBXaGVuIGFuIGludGVnZXIgdHlwZSB0aGUgdmFsdWUgaXMgaW4gaG9zdCBieXRlIG9yZGVyLAotICAgd2hlbiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoZSB2YWx1ZSBpcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENHRU5fSU5TTl9JTlQ7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi10eXBlZGVmIENHRU5fSU5TTl9JTlQgQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiBDR0VOX0lOU05fSU5UICpDR0VOX0lOU05fQllURVNfUFRSOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpDR0VOX0lOU05fQllURVNfUFRSOwotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBDR0VOX0lOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBDR0VOX0lOTElORQotI2VuZGlmCi0KLWVudW0gY2dlbl9lbmRpYW4KLXsKLSAgQ0dFTl9FTkRJQU5fVU5LTk9XTiwKLSAgQ0dFTl9FTkRJQU5fTElUVExFLAotICBDR0VOX0VORElBTl9CSUcKLX07Ci0KLS8qIEZvcndhcmQgZGVjbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5faW5zbiBDR0VOX0lOU047Ci0KLS8qIE9wYXF1ZSBwb2ludGVyIHZlcnNpb24gZm9yIHVzZSBieSBleHRlcm5hbCB3b3JsZC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fY3B1X2Rlc2MgKkNHRU5fQ1BVX0RFU0M7Ci0MCi0vKiBBdHRyaWJ1dGVzLgotICAgQXR0cmlidXRlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2YXJpb3VzIHJhbmRvbSB0aGluZ3MgYXNzb2NpYXRlZCB3aXRoCi0gICBhbiBvYmplY3QgKGlmaWVsZCwgaGFyZHdhcmUsIG9wZXJhbmQsIGluc24sIHdoYXRldmVyKSBhbmQgYXJlIHNwZWNpZmllZAotICAgYXMgbmFtZS92YWx1ZSBwYWlycy4KLSAgIEludGVnZXIgYXR0cmlidXRlcyBjb21wdXRlZCBhdCBjb21waWxlIHRpbWUgYXJlIGN1cnJlbnRseSBhbGwgdGhhdCdzCi0gICBzdXBwb3J0ZWQsIHRob3VnaCBhZGRpbmcgc3RyaW5nIGF0dHJpYnV0ZXMgYW5kIHJ1bi10aW1lIGNvbXB1dGF0aW9uIGlzCi0gICBzdHJhaWdodGZvcndhcmQuICBJbnRlZ2VyIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGFsd2F5cyBob3N0IGludCdzCi0gICAoc2lnbmVkIG9yIHVuc2lnbmVkKS4gIEZvciBwb3J0YWJpbGl0eSwgdGhpcyBtZWFucyAzMiBiaXRzLgotICAgSW50ZWdlciBhdHRyaWJ1dGVzIGFyZSBmdXJ0aGVyIGNhdGVnb3JpemVkIGFzIGJvb2xlYW4sIGJpdHNldCwgaW50ZWdlciwKLSAgIGFuZCBlbnVtIHR5cGVzLiAgQm9vbGVhbiBhdHRyaWJ1dGVzIGFwcGVhciBmcmVxdWVudGx5IGVub3VnaCB0aGF0IHRoZXkncmUKLSAgIHJlY29yZGVkIGluIG9uZSBob3N0IGludC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib29sZWFuCi0gICBhdHRyaWJ1dGVzIHRvIDMyLCB0aG91Z2ggdGhhdCdzIGEgKmxvdCogb2YgYXR0cmlidXRlcy4gICovCi0KLS8qIFR5cGUgb2YgYXR0cmlidXRlIHZhbHVlcy4gICovCi0KLXR5cGVkZWYgaW50IENHRU5fQVRUUl9WQUxVRV9UWVBFOwotCi0vKiBTdHJ1Y3QgdG8gcmVjb3JkIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJvb2xlYW4gYXR0cmlidXRlcy4gICovCi0gIHVuc2lnbmVkIGludCBib29sOwotICAvKiBOb24tYm9vbGVhbiBpbnRlZ2VyIGF0dHJpYnV0ZXMuICAqLwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWzFdOwotfSBDR0VOX0FUVFI7Ci0KLS8qIERlZmluZSBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGF0dHJpYnV0ZXMgd2l0aCBOIG5vbi1ib29sZWFuIGVudHJpZXMuCi0gICBUaGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBub24tYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgVGhlcmUgaXMgYSBtYXhpbXVtIG9mIDMyIGJvb2xlYW4gYXR0cmlidXRlcyAoc2luY2UgdGhleSBhcmUgYWxsIHJlY29yZGVkCi0gICBpbiBvbmUgaG9zdCBpbnQpLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfVFlQRShuKSBcCi1zdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgYm9vbDsgXAotCSBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWyhuKSA/IChuKSA6IDFdOyB9Ci0KLS8qIFJldHVybiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfQk9PTFMoYSkgKChhKS0+Ym9vbCkKLQotLyogTm9uLWJvb2xlYW4gYXR0cmlidXRlIG51bWJlcnMgYXJlIG9mZnNldCBieSB0aGlzIG11Y2guICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9OQk9PTF9PRkZTRVQgMzIKLQotLyogR2l2ZW4gYSBib29sZWFuIGF0dHJpYnV0ZSBudW1iZXIsIHJldHVybiBpdHMgbWFzay4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX01BU0soYXR0cikgKDEgPDwgKGF0dHIpKQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGJvb2xlYW4gYXR0cmlidXRlIEFUVFIgaW4gQVRUUlMuICAqLwotCi0jZGVmaW5lIENHRU5fQk9PTF9BVFRSKGF0dHJzLCBhdHRyKSAoKENHRU5fQVRUUl9NQVNLIChhdHRyKSAmIChhdHRycykpICE9IDApCi0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBBVFRSX1RBQkxFIGZvciBPQkouCi0gICBPQkogaXMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgdGhhdCBoYXMgdGhlIGF0dHJpYnV0ZXMKLSAgICg/Pz8gbm90IHVzZWQgYXQgcHJlc2VudCBidXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwdXJwb3NlcyAtIGV2ZW50dWFsbHkKLSAgIHRoZSBnb2FsIGlzIHRvIGFsbG93IHJlY29yZGluZyBhdHRyaWJ1dGVzIGluIHNvdXJjZSBmb3JtIGFuZCBjb21wdXRpbmcKLSAgIHRoZW0gbGF6aWx5IGF0IHJ1bnRpbWUsIG5vdCBzdXJlIG9mIHRoZSBkZXRhaWxzIHlldCkuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9WQUxVRShvYmosIGF0dHJfdGFibGUsIGF0dHIpIFwKLSgodW5zaWduZWQgaW50KSAoYXR0cikgPCBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUIFwKLSA/ICgoQ0dFTl9BVFRSX0JPT0xTIChhdHRyX3RhYmxlKSAmIENHRU5fQVRUUl9NQVNLIChhdHRyKSkgIT0gMCkgXAotIDogKChhdHRyX3RhYmxlKS0+bm9uYm9vbFsoYXR0cikgLSBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUXSkpCi0KLS8qIEF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHRhYmxlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIHRvIGFzc2lzdCBwYXJzaW5nIG9mIGRlc2NyaXB0aW9ucyBhdCBydW4tdGltZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSB2YWx1ZTsKLX0gQ0dFTl9BVFRSX0VOVFJZOwotCi0vKiBGb3IgZWFjaCBkb21haW4gKGlmbGQsaHcsb3BlcmFuZCxpbnNuKSwgbGlzdCBvZiBhdHRyaWJ1dGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIGNvbnN0IENHRU5fQVRUUl9FTlRSWSAqIGRmYXVsdDsKLSAgY29uc3QgQ0dFTl9BVFRSX0VOVFJZICogdmFsczsKLX0gQ0dFTl9BVFRSX1RBQkxFOwotDAotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIERlZmF1bHQgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bmtub3duIGluc24uICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogQmFzZSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgRm9yIG5vbi1MSVcgY3B1cyB0aGlzIGlzIGdlbmVyYWxseSB0aGUgbGVuZ3RoIG9mIHRoZSBzbWFsbGVzdCBpbnNuLgotICAgICBGb3IgTElXIGNwdXMgaXRzIHdpcCAod29yay1pbi1wcm9ncmVzcykuICBGb3IgdGhlIG0zMnIgaXRzIDMyLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaW5zbl9iaXRzaXplOwotCi0gIC8qIE1pbmltdW0vbWF4aW11bSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4gICovCi0gIHVuc2lnbmVkIGludCBtaW5faW5zbl9iaXRzaXplOwotICB1bnNpZ25lZCBpbnQgbWF4X2luc25fYml0c2l6ZTsKLX0gQ0dFTl9JU0E7Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBhcmd1bWVudCB0byBiZmRfYXJjaF9pbmZvLT5zY2FuLiAgKi8KLSAgY29uc3QgY2hhciAqYmZkX25hbWU7Ci0gIC8qIG9uZSBvZiBlbnVtIG1hY2hfYXR0ciAqLwotICBpbnQgbnVtOwotfSBDR0VOX01BQ0g7Ci0MCi0vKiBQYXJzZSByZXN1bHQgKGFsc28gZXh0cmFjdGlvbiByZXN1bHQpLgotCi0gICBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgYW4gaW5zbiBpcyBzdG9yZWQgaGVyZS4KLSAgIFRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIGluc2VydCBoYW5kbGVyLgotICAgV2hlbiBwcmludGluZyBhbiBpbnNuLCB0aGUgcmVzdWx0IG9mIGV4dHJhY3Rpb24gaXMgc3RvcmVkIGhlcmUuCi0gICBUbyBwcmludCB0aGUgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIHByaW50IGhhbmRsZXIuCi0KLSAgIEl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkIHNvIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLAotICAgYnV0IHdlIGRvIG5lZWQgYSBmb3J3YXJkIGRlY2wgZm9yIHRoZSBoYW5kbGVyIGZucy4KLQotICAgVGhlcmUgaXMgb25lIG1lbWJlciBmb3IgZWFjaCBwb3NzaWJsZSBmaWVsZCBpbiB0aGUgaW5zbi4KLSAgIFRoZSB0eXBlIGRlcGVuZHMgb24gdGhlIGZpZWxkLgotICAgQWxzbyByZWNvcmRlZCBoZXJlIGlzIHRoZSBjb21wdXRlZCBsZW5ndGggb2YgdGhlIGluc24gZm9yIGFyY2hpdGVjdHVyZXMKLSAgIHdoZXJlIGl0IHZhcmllcy4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fZmllbGRzIENHRU5fRklFTERTOwotCi0vKiBUb3RhbCBsZW5ndGggb2YgdGhlIGluc24sIGFzIHJlY29yZGVkIGluIHRoZSBgZmllbGRzJyBzdHJ1Y3QuICAqLwotLyogPz8/IFRoZSBmaWVsZCBpbnNlcnQgaGFuZGxlciBoYXMgbG90cyBvZiBvcHBvcnR1bml0aWVzIGZvciBvcHRpbWl6YXRpb24KLSAgIGlmIGl0IGV2ZXIgZ2V0cyBpbmxpbmVkLiAgT24gYXJjaGl0ZWN0dXJlcyB3aGVyZSBpbnNucyBhbGwgaGF2ZSB0aGUgc2FtZQotICAgc2l6ZSwgbWF5IHdpc2ggdG8gZGV0ZWN0IHRoYXQgYW5kIG1ha2UgdGhpcyBtYWNybyBhIGNvbnN0YW50IC0gdG8gYWxsb3cKLSAgIGZ1cnRoZXIgb3B0aW1pemF0aW9ucy4gICovCi0KLSNkZWZpbmUgQ0dFTl9GSUVMRFNfQklUU0laRShmaWVsZHMpICgoZmllbGRzKS0+bGVuZ3RoKQotDAotLyogRXh0cmFjdGlvbiBzdXBwb3J0IGZvciB2YXJpYWJsZSBsZW5ndGggaW5zbiBzZXRzLiAgKi8KLQotLyogV2hlbiBkaXNhc3NlbWJsaW5nIHdlIGRvbid0IGtub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGF0IHRoZSBzdGFydC4KLSAgIFNvIHRoZSBmaXJzdCBDR0VOX0JBU0VfSU5TTl9TSVpFIGJ5dGVzIGFyZSByZWFkIGF0IHRoZSBzdGFydCBhbmQgdGhlIHJlc3QKLSAgIGFyZSByZWFkIHdoZW4gbmVlZGVkLiAgVGhpcyBzdHJ1Y3QgY29udHJvbHMgdGhpcy4gIEl0IGlzIGJhc2ljYWxseSB0aGUKLSAgIGRpc2Fzc2VtYmxlX2luZm8gc3R1ZmYsIGV4Y2VwdCB0aGF0IHdlIHByb3ZpZGUgYSBjYWNoZSBmb3IgdmFsdWVzIGFscmVhZHkKLSAgIHJlYWQgKHNpbmNlIGJ5dGVzIGNhbiB0eXBpY2FsbHkgYmUgcmVhZCBzZXZlcmFsIHRpbWVzIHRvIGZldGNoIG11bHRpcGxlCi0gICBvcGVyYW5kcyB0aGF0IG1heSBiZSBpbiB0aGVtKSwgYW5kIHRoYXQgZXh0cmFjdGlvbiBvZiBmaWVsZHMgaXMgbmVlZGVkCi0gICBpbiBjb250ZXh0cyBvdGhlciB0aGFuIGRpc2Fzc2VtYmx5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBBIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LgotICAgICBXZSBkb24ndCByZXF1aXJlIGRpcy1hc20uaCBzbyB3ZSB1c2UgUFRSIGZvciB0aGUgdHlwZSBoZXJlLgotICAgICBJZiBOVUxMLCBCWVRFUyBpcyBmdWxsIG9mIHZhbGlkIGRhdGEgKFZBTElEID09IC0xKS4gICovCi0gIFBUUiBkaXNfaW5mbzsKLSAgLyogUG9pbnRzIHRvIGEgd29ya2luZyBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW5zbl9ieXRlczsKLSAgLyogTWFzayBvZiBieXRlcyB0aGF0IGFyZSB2YWxpZCBpbiBJTlNOX0JZVEVTLiAgKi8KLSAgdW5zaWduZWQgaW50IHZhbGlkOwotfSBDR0VOX0VYVFJBQ1RfSU5GTzsKLQwKLS8qIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGluc24gb3IgZXhwcmVzc2lvbiBpcyBhIHNldCBvZiAiaGFuZGxlcnMiIGZvcgotICAgcGVyZm9ybWluZyBvcGVyYXRpb25zIGxpa2UgcGFyc2luZywgcHJpbnRpbmcsIGV0Yy4gIFRoZXNlIHJlcXVpcmUgYSBiZmRfdm1hCi0gICB2YWx1ZSB0byBiZSBwYXNzZWQgYXJvdW5kIGJ1dCB3ZSBkb24ndCB3YW50IGFsbCBhcHBsaWNhdGlvbnMgdG8gbmVlZCBiZmQuaC4KLSAgIFNvIHRoaXMgc3R1ZmYgaXMgb25seSBwcm92aWRlZCBpZiBiZmQuaCBoYXMgYmVlbiBpbmNsdWRlZC4gICovCi0KLS8qIFBhcnNlIGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBTVFJQIGlzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIHRleHQgYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBpbiB3aGljaCB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkLgotICAgSWYgdGhlIGV4cHJlc3Npb24gaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgKlNUUlAgaXMgdXBkYXRlZC4KLSAgIElmIG5vdCBpdCBpcyBsZWZ0IGFsb25lLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIGlmIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgbWVzc2FnZS4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBjb25zdCBjaGFyICoqc3RycF8sIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0KLS8qIEluc2VydCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMKLSAgIGFyZSBmZXRjaGVkLgotICAgSU5TTlAgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbnNuLgotICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5faW5zZXJ0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBDR0VOX0lOU05fQllURVNfUFRSIGluc25wXywKLQkgICAgICBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX2luc2VydF9mbikgKCk7Ci0jZW5kaWYKLQotLyogRXh0cmFjdCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgY29udHJvbGxpbmcgZXh0cmFjdGlvbgotICAgKG9ubHkgdXNlZCBmb3IgdmFyaWFibGUgbGVuZ3RoIGluc25zKS4KLSAgIEVYX0lORk8gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGZvciBjb250cm9sbGluZyByZWFkaW5nIG9mIGZ1cnRoZXIKLSAgIGJ5dGVzIGZvciB0aGUgaW5zbi4KLSAgIEJBU0VfSU5TTiBpcyB0aGUgZmlyc3QgQ0dFTl9CQVNFX0lOU05fU0laRSBieXRlcyAoaG9zdCBvcmRlcikuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGluIHdoaWNoIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cyBvciB6ZXJvIGlmIG5vdCByZWNvZ25pemVkLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIGludCAoY2dlbl9leHRyYWN0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvXywgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgaW50IChjZ2VuX2V4dHJhY3RfZm4pICgpOwotI2VuZGlmCi0KLS8qIFByaW50IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmx5IGluZm8uCi0gICBFZzogZGlzYXNzZW1ibGVfaW5mby4gIEl0J3MgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkCi0gICB3aXRob3V0IGRpcy1hc20uaC4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcHJpbnRlZC4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiwgaW4gYml0cy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiB2b2lkIChjZ2VuX3ByaW50X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIgaW5mb18sIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfLCBpbnQgbGVuXykpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoY2dlbl9wcmludF9mbikgKCk7Ci0jZW5kaWYKLQotLyogUGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlcnMuCi0KLSAgIEluZGljZXMgaW50byB0aGUgaGFuZGxlciB0YWJsZXMuCi0gICBXZSBjb3VsZCB1c2UgcG9pbnRlcnMgaGVyZSBpbnN0ZWFkLCBidXQgOTAlIG9mIHRoZW0gYXJlIGdlbmVyYWxseSBpZGVudGljYWwKLSAgIGFuZCB0aGF0J3MgYSBsb3Qgb2YgcmVkdW5kYW50IGRhdGEuICBNYWtpbmcgdGhlc2UgdW5zaWduZWQgY2hhciBpbmRpY2VzCi0gICBpbnRvIHRhYmxlcyBvZiBwb2ludGVycyBzYXZlcyBhIGJpdCBvZiBzcGFjZS4KLSAgIFVzaW5nIGluZGljZXMgYWxzbyBrZWVwcyBhc3NlbWJsZXIgY29kZSBvdXQgb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQKLSAgIHZpY2UgdmVyc2EuICAqLwotCi1zdHJ1Y3QgY2dlbl9vcGNvZGVfaGFuZGxlcgotewotICB1bnNpZ25lZCBjaGFyIHBhcnNlLCBpbnNlcnQsIGV4dHJhY3QsIHByaW50OwotfTsKLQwKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UuCi0KLSAgIFRoZSBpbnRlcmZhY2UgdG8gdGhlIGFzc2VtYmxlciBpcyBpbnRlbmRlZCB0byBiZSBjbGVhbiBpbiB0aGUgc2Vuc2UgdGhhdAotICAgbGlib3Bjb2Rlcy5hIGlzIGEgc3RhbmRhbG9uZSBlbnRpdHkgYW5kIGNvdWxkIGJlIHVzZWQgd2l0aCBhbnkgYXNzZW1ibGVyLgotICAgTm90IHRoYXQgb25lIHdvdWxkIG5lY2Vzc2FyaWx5IHdhbnQgdG8gZG8gdGhhdCBidXQgcmF0aGVyIHRoYXQgaXQgaGVscHMKLSAgIGtlZXAgYSBjbGVhbiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHdpbGwgb2J2aW91c2x5IGJlIHNsYW50ZWQgdG93YXJkcwotICAgR0FTLCBidXQgYXQgbGVhc3QgaXQncyBhIHN0YXJ0LgotICAgPz8/IE5vdGUgdGhhdCBvbmUgcG9zc2libGUgdXNlciBvZiB0aGUgYXNzZW1ibGVyIGJlc2lkZXMgR0FTIGlzIEdEQi4KLQotICAgUGFyc2luZyBpcyBjb250cm9sbGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hpY2ggY2FsbHMKLSAgIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKS4gIElmIGl0IGNhbiBwYXJzZSBhbmQgYnVpbGQgdGhlIGVudGlyZSBpbnNuCi0gICBpdCBkb2Vzbid0IGNhbGwgYmFjayB0byB0aGUgYXNzZW1ibGVyLiAgSWYgaXQgbmVlZHMvd2FudHMgdG8gY2FsbCBiYWNrCi0gICB0byB0aGUgYXNzZW1ibGVyLCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gaXMgY2FsbGVkIHdoaWNoIGNhbiBlaXRoZXIKLQotICAgLSByZXR1cm4gYSBudW1iZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGluc24KLSAgIC0gcmV0dXJuIGEgInJlZ2lzdGVyIiB2YWx1ZSB0byBiZSBpbnNlcnRlZAotICAgICAodGhlIHJlZ2lzdGVyIG1pZ2h0IG5vdCBiZSBhIHJlZ2lzdGVyIHBlciBwZSkKLSAgIC0gcXVldWUgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gYSBtYXJrZXIgc2F5aW5nIHRoZSBleHByZXNzaW9uIGhhcyBiZWVuCi0gICAgIHF1ZXVlZCAoZWc6IGEgZml4LXVwKQotICAgLSByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBleHByZXNzaW9uIHdhc24ndCByZWNvZ25pemFibGUKLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgdGhlIGNhbGxlciB3YW50cy4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUKLXsKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9JTlRFR0VSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfQUREUkVTUwotfTsKLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgd2FzIHBhcnNlZC4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdAotewotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9SRUdJU1RFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9RVUVVRUQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfRVJST1IKLX07Ci0KLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLCBjb25zdCBjaGFyICoqLCBpbnQsIGludCwKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwgYmZkX3ZtYSAqKSk7Ci0jZWxzZQotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikgKCk7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gY2FsbGJhY2suICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikpOwotCi0vKiBDYWxsZWQgYmVmb3JlIHRyeWluZyB0byBtYXRjaCBhIHRhYmxlIGVudHJ5IHdpdGggdGhlIGluc24uICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0MCi0vKiBPcGVyYW5kIHZhbHVlcyAoa2V5d29yZHMsIGludGVnZXJzLCBzeW1ib2xzLCBldGMuKSAgKi8KLQotLyogVHlwZXMgb2YgYXNzZW1ibGVyIGVsZW1lbnRzLiAgKi8KLQotZW51bSBjZ2VuX2FzbV90eXBlCi17Ci0gIENHRU5fQVNNX05PTkUsIENHRU5fQVNNX0tFWVdPUkQsIENHRU5fQVNNX01BWAotfTsKLQotI2lmbmRlZiBDR0VOX0FSQ0gKLWVudW0gY2dlbl9od190eXBlIHsgQ0dFTl9IV19NQVggfTsKLSNlbmRpZgotCi0vKiBMaXN0IG9mIGhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBjZ2VuX2h3X3R5cGUgdHlwZTsKLSAgLyogVGhlcmUgaXMgY3VycmVudGx5IG5vIGV4YW1wbGUgd2hlcmUgYm90aCBpbmRleCBzcGVjcyBhbmQgdmFsdWUgc3BlY3MKLSAgICAgYXJlIHJlcXVpcmVkLCBzbyBmb3Igbm93IGJvdGggYXJlIGNsdW1wZWQgdW5kZXIgImFzbV9kYXRhIi4gICovCi0gIGVudW0gY2dlbl9hc21fdHlwZSBhc21fdHlwZTsKLSAgUFRSIGFzbV9kYXRhOwotI2lmbmRlZiBDR0VOX0hXX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0hXX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9IV19BVFRSUyhodykgKCYoaHcpLT5hdHRycykKLX0gQ0dFTl9IV19FTlRSWTsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIEhXLiAgKi8KLQotI2RlZmluZSBDR0VOX0hXX0FUVFJfVkFMVUUoaHcsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGh3KSwgQ0dFTl9IV19BVFRSUyAoaHcpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIGhhcmR3YXJlIGVsZW1lbnRzIGZvciBzZWxlY3RlZCBtYWNoLCBjb21wdXRlZCBhdCBydW50aW1lLgotICAgZW51bSBjZ2VuX2h3X3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkgYGVudHJpZXMnKS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogUG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2YgYWxsIGNvbXBpbGVkIGluIGVudHJpZXMuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqZW50cmllczsKLSAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBlbnRyaWVzJy4gICovCi0gIHVuc2lnbmVkIGludCBudW1fZW50cmllczsKLSAgLyogRm9yIG5vdywgeHJlYWxsb2MgaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCBydW50aW1lLgotICAgICA/Pz8gTWF5IHdpc2ggdG8ga2VlcCB0cmFjayBvZiBzb21lIHNsb3AgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KLSAgICAgeHJlYWxsb2MsIGV4Y2VwdCB0aGF0IHRoZXJlJ3MgdW5saWtlbHkgdG8gYmUgbWFueSBhbmQgbm90IGV4cGVjdGVkIHRvIGJlCi0gICAgIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuICAqLwotfSBDR0VOX0hXX1RBQkxFOwotCi1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X25hbWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBkZXNjcmliZSB0aGluZ3MgbGlrZSByZWdpc3RlciBuYW1lcywgZXRjLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5Ci17Ci0gIC8qIE5hbWUgKGFzIGluIHJlZ2lzdGVyIG5hbWUpLiAgKi8KLSAgY2hhciAqIG5hbWU7Ci0KLSAgLyogVmFsdWUgKGFzIGluIHJlZ2lzdGVyIG51bWJlcikuCi0gICAgIFRoZSB2YWx1ZSBjYW5ub3QgYmUgLTEgYXMgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlICJub3QgZm91bmQiLgotICAgICBJREVBOiBIYXZlICJGVU5DVElPTiIgYXR0cmlidXRlPyBbZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZldGNoIHZhbHVlXS4gICovCi0gIGludCB2YWx1ZTsKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIHNob3VsZCwgYnV0IHRlY2huaWNhbGx5IG5lZWRuJ3QsIGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZAotICAgICBhcnJheSBpbiB0aGF0IG9uZSBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlcgotICAgICBtYXkgaGF2ZSBtb3JlLiAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlCi0gICAgIG5lZWRuJ3QgY2FyZS4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkCi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUKLSAgICAgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28gYXdheSBhbnl3YXkuICAqLwotICAvKiA/Pz8gTW92aW5nIHRoaXMgbGFzdCBzaG91bGQgYmUgZG9uZSBieSB0cmVhdGluZyBrZXl3b3JkcyBsaWtlIGluc24gbGlzdHMKLSAgICAgYW5kIG1vdmluZyB0aGUgYG5leHQnIGZpZWxkcyBpbnRvIGEgQ0dFTl9LRVlXT1JEX0xJU1Qgc3RydWN0LiAgKi8KLSAgLyogRklYTUU6IE5vdCB1c2VkIHlldC4gICovCi0jaWZuZGVmIENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMpIGF0dHJzOwotCi0gIC8qID8/PyBQdXR0aW5nIHRoZXNlIGhlcmUgbWVhbnMgY29tcGlsZWQgaW4gZW50cmllcyBjYW4ndCBiZSBjb25zdC4KLSAgICAgTm90IGEgcmVhbGx5IGJpZyBkZWFsLCBidXQgc29tZXRoaW5nIHRvIGNvbnNpZGVyLiAgKi8KLSAgLyogTmV4dCBuYW1lIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5ICpuZXh0X25hbWU7Ci0gIC8qIE5leHQgdmFsdWUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkgKm5leHRfdmFsdWU7Ci19IENHRU5fS0VZV09SRF9FTlRSWTsKLQotLyogVG9wIGxldmVsIHN0cnVjdCBmb3IgZGVzY3JpYmluZyBhIHNldCBvZiByZWxhdGVkIGtleXdvcmRzCi0gICAoZS5nLiByZWdpc3RlciBuYW1lcykuCi0KLSAgIFRoaXMgc3RydWN0IHN1cHBvcnRzIHJ1bi10aW1lIGVudHJ5IG9mIG5ldyB2YWx1ZXMsIGFuZCBoYXNoZWQgbG9va3Vwcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fa2V5d29yZAotewotICAvKiBQb2ludGVyIHRvIGluaXRpYWwgW2NvbXBpbGVkIGluXSB2YWx1ZXMuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmluaXRfZW50cmllczsKLSAgCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGBpbml0X2VudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIAotICAvKiBIYXNoIHRhYmxlIHVzZWQgZm9yIG5hbWUgbG9va3VwLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICoqbmFtZV9oYXNoX3RhYmxlOwotICAKLSAgLyogSGFzaCB0YWJsZSB1c2VkIGZvciB2YWx1ZSBsb29rdXAuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKip2YWx1ZV9oYXNoX3RhYmxlOwotICAKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2hfdGFibGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGhhc2hfdGFibGVfc2l6ZTsKLSAgCi0gIC8qIFBvaW50ZXIgdG8gbnVsbCBrZXl3b3JkICIiIGVudHJ5IGlmIHByZXNlbnQuICAqLwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKm51bGxfZW50cnk7Ci19IENHRU5fS0VZV09SRDsKLQotLyogU3RydWN0dXJlIHVzZWQgZm9yIHNlYXJjaGluZy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRhYmxlIGJlaW5nIHNlYXJjaGVkLiAgKi8KLSAgY29uc3QgQ0dFTl9LRVlXT1JEICp0YWJsZTsKLSAgCi0gIC8qIFNwZWNpZmljYXRpb24gb2Ygd2hhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IuICAqLwotICBjb25zdCBjaGFyICpzcGVjOwotICAKLSAgLyogQ3VycmVudCBpbmRleCBpbiBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfaGFzaDsKLSAgCi0gIC8qIEN1cnJlbnQgZWxlbWVudCBpbiBjdXJyZW50IGhhc2ggY2hhaW4uICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmN1cnJlbnRfZW50cnk7Ci19IENHRU5fS0VZV09SRF9TRUFSQ0g7Ci0KLS8qIExvb2t1cCBhIGtleXdvcmQgZnJvbSBpdHMgbmFtZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTG9va3VwIGEga2V5d29yZCBmcm9tIGl0cyB2YWx1ZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZQotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgaW50KSk7Ci0KLS8qIEFkZCBhIGtleXdvcmQuICAqLwotCi12b2lkIGNnZW5fa2V5d29yZF9hZGQgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0KLS8qIEtleXdvcmQgc2VhcmNoaW5nLgotICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBldmVyeSBrZXl3b3JkLCBvciBhIHN1YnNldC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0ggY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRF9TRUFSQ0ggKikpOwotCi0vKiBPcGVyYW5kIHZhbHVlIHN1cHBvcnQgcm91dGluZXMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIENHRU5fS0VZV09SRCAqLCBsb25nICopKTsKLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCB1bnNpZ25lZCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsCi0JICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICosIGJmZF92bWEgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgobG9uZywgbG9uZywgbG9uZykpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci0jZW5kaWYKLQwKLS8qIE9wZXJhbmQgbW9kZXMuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIHRoZSB2YWx1ZXMgaW4gYXJjaC5oLiAgUmV2aXNpdC4KLSAgIFRoZXNlIGhvd2V2ZXIgbmVlZCB0aGUgQ0dFTl8gcHJlZml4IFthcyBkb2VzIGV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlXS4gICovCi0vKiA/Pz8gVGFyZ2V0cyBtYXkgbmVlZCB0byBhZGQgdGhlaXIgb3duIG1vZGVzIHNvIHdlIG1heSB3aXNoIHRvIG1vdmUgdGhpcwotICAgdG8gPGFyY2g+LW9wYy5oLCBvciBhZGQgYSBob29rLiAgKi8KLQotZW51bSBjZ2VuX21vZGUgewotICBDR0VOX01PREVfVk9JRCwgLyogPz8/IHJlbmFtZSBzaW11bGF0b3IncyBWTSB0byBWT0lEPyAqLwotICBDR0VOX01PREVfQkksIENHRU5fTU9ERV9RSSwgQ0dFTl9NT0RFX0hJLCBDR0VOX01PREVfU0ksIENHRU5fTU9ERV9ESSwKLSAgQ0dFTl9NT0RFX1VCSSwgQ0dFTl9NT0RFX1VRSSwgQ0dFTl9NT0RFX1VISSwgQ0dFTl9NT0RFX1VTSSwgQ0dFTl9NT0RFX1VESSwKLSAgQ0dFTl9NT0RFX1NGLCBDR0VOX01PREVfREYsIENHRU5fTU9ERV9YRiwgQ0dFTl9NT0RFX1RGLAotICBDR0VOX01PREVfVEFSR0VUX01BWCwKLSAgQ0dFTl9NT0RFX0lOVCwgQ0dFTl9NT0RFX1VJTlQsCi0gIENHRU5fTU9ERV9NQVgKLX07Ci0KLS8qIEZJWE1FOiBVbnRpbCBzaW11bGF0b3IgaXMgdXBkYXRlZC4gICovCi0KLSNkZWZpbmUgQ0dFTl9NT0RFX1ZNIENHRU5fTU9ERV9WT0lECi0MCi0vKiBPcGVyYW5kcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi1lbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsgQ0dFTl9PUEVSQU5EX01BWCB9OwotI2VuZGlmCi0KLS8qICJuaWwiIGluZGljYXRvciBmb3IgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05JTCBDR0VOX09QRVJBTkRfTUFYCi0KLS8qIFRoaXMgc3RydWN0IGRlZmluZXMgZWFjaCBlbnRyeSBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3BlcmFuZCB0eXBlLiAgKi8KLSAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB0eXBlOwotCi0gIC8qIFRoZSBoYXJkd2FyZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhbmQuICAqLwotICBlbnVtIGNnZW5faHdfdHlwZSBod190eXBlOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCB5ZXQgcmVjb3JkIGlmaWVsZCBkZWZpbml0aW9ucywgd2hpY2ggd2Ugc2hvdWxkLgotICAgICBXaGVuIHdlIGRvIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGVsZXRlIHN0YXJ0L2xlbmd0aCAoc2luY2UgdGhleSB3aWxsCi0gICAgIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGlmaWVsZCdzIGRlZmluaXRpb24pIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhCi0gICAgIHBvaW50ZXIgdG8gdGhlIGlmaWVsZCBlbnRyeS4gICovCi0KLSAgLyogQml0IHBvc2l0aW9uLgotICAgICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhbmQgbWF5IGJlIHVudXNlZCBpbiBtb3JlIGNvbXBsZXggb3BlcmFuZHMuCi0gICAgIE1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YXJ0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4KLSAgICAgVGhpcyBpcyBqdXN0IGEgaGludCwgYW5kIG1heSBiZSB1bnVzZWQgaW4gbW9yZSBjb21wbGV4IG9wZXJhbmRzLgotICAgICBNYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0KLSNpZiAwIC8qID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCByZWxvY3MgdGVuZCB0byBnZXQgdG9vIGNvbXBsaWNhdGVkLAotCSBhbmQgQUJJIGRlcGVuZGVudCwgZm9yIHNpbXBsZSB0YWJsZSBsb29rdXBzIHRvIHdvcmsuICAqLwotICAvKiBJZGVhbGx5IHRoaXMgd291bGQgYmUgdGhlIGludGVybmFsIChleHRlcm5hbD8pIHJlbG9jIHR5cGUuICAqLwotICBpbnQgcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgc2hvdWxkLCBidXQgdGVjaG5pY2FsbHkgbmVlZG4ndCwgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkCi0gICAgIGFycmF5IGluIHRoYXQgb25lIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyCi0gICAgIG1heSBoYXZlIG1vcmUuICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUKLSAgICAgbmVlZG4ndCBjYXJlLCBub3cgb3IgdG9tb3Jyb3cuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZAotICAgICBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLCBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlCi0gICAgIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvIGF3YXkgYW55d2F5LiAgKi8KLSNpZm5kZWYgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSUyhvcGVyYW5kKSAoJihvcGVyYW5kKS0+YXR0cnMpCi19IENHRU5fT1BFUkFORDsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIE9QRVJBTkQuICAqLwotCi0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKG9wZXJhbmQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKG9wZXJhbmQpLCBDR0VOX09QRVJBTkRfQVRUUlMgKG9wZXJhbmQpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIG9wZXJhbmRzIGZvciBzZWxlY3RlZCBtYWNoL2lzYSwgY29tcHV0ZWQgYXQgcnVudGltZS4KLSAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkKLSAgIGBlbnRyaWVzJykuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIGFsbCBjb21waWxlZCBpbiBlbnRyaWVzLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKiplbnRyaWVzOwotICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGVudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOwotICAvKiBGb3Igbm93LCB4cmVhbGxvYyBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGF0IHJ1bnRpbWUuCi0gICAgID8/PyBNYXkgd2lzaCB0byBrZWVwIHRyYWNrIG9mIHNvbWUgc2xvcCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0bwotICAgICB4cmVhbGxvYywgZXhjZXB0IHRoYXQgdGhlcmUncyB1bmxpa2VseSB0byBiZSBtYW55IGFuZCBub3QgZXhwZWN0ZWQgdG8gYmUKLSAgICAgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4gICovCi19IENHRU5fT1BFUkFORF9UQUJMRTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fT1BFUkFORCAqIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBDR0VOX09QRVJBTkQgKiBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQwKLS8qIEluc3RydWN0aW9uIG9wZXJhbmQgaW5zdGFuY2VzLgotCi0gICBGb3IgZWFjaCBpbnN0cnVjdGlvbiwgYSBsaXN0IG9mIHRoZSBoYXJkd2FyZSBlbGVtZW50cyB0aGF0IGFyZSByZWFkIGFuZAotICAgd3JpdHRlbiBhcmUgcmVjb3JkZWQuICAqLwotCi0vKiBUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UuICAqLwotCi1lbnVtIGNnZW5fb3BpbnN0X3R5cGUgewotICAvKiBFbmQgb2YgdGFibGUgbWFya2VyLiAgKi8KLSAgQ0dFTl9PUElOU1RfRU5EID0gMCwKLSAgQ0dFTl9PUElOU1RfSU5QVVQsIENHRU5fT1BJTlNUX09VVFBVVAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5wdXQgb3Igb3V0cHV0IGluZGljYXRvci4gICovCi0gIGVudW0gY2dlbl9vcGluc3RfdHlwZSB0eXBlOwotCi0gIC8qIE5hbWUgb2Ygb3BlcmFuZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIGhhcmR3YXJlIGVsZW1lbnQgcmVmZXJlbmNlZC4gICovCi0gIGVudW0gY2dlbl9od190eXBlIGh3X3R5cGU7Ci0KLSAgLyogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIG9wZXJhbmQgaXMgYmVpbmcgdXNlZC4gICovCi0gIGVudW0gY2dlbl9tb2RlIG1vZGU7Ci0KLSAgLyogVGhlIG9wZXJhbmQgdGFibGUgZW50cnkgQ0dFTl9PUEVSQU5EX05JTCBpZiB0aGVyZSBpcyBub25lCi0gICAgIChpLmUuIGFuIGV4cGxpY2l0IGhhcmR3YXJlIHJlZmVyZW5jZSkuICAqLwotICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIG9wX3R5cGU7Ci0KLSAgLyogSWYgYG9wZXJhbmQnIGlzICJuaWwiLCB0aGUgaW5kZXggKGUuZy4gaW50byBhcnJheSBvZiByZWdpc3RlcnMpLiAgKi8KLSAgaW50IGluZGV4OwotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgID8/PyBUaGlzIHBlcmhhcHMgc2hvdWxkIGJlIGEgcmVhbCBhdHRyaWJ1dGUgc3RydWN0IGJ1dCB0aGVyZSdzCi0gICAgIG5vIGN1cnJlbnQgbmVlZCwgc28gd2Ugc2F2ZSBhIGJpdCBvZiBzcGFjZSBhbmQganVzdCBoYXZlIGEgc2V0IG9mCi0gICAgIGZsYWdzLiAgVGhlIGludGVyZmFjZSBpcyBzdWNoIHRoYXQgdGhpcyBjYW4gZWFzaWx5IGJlIG1hZGUgYXR0cmlidXRlcwotICAgICBzaG91bGQgaXQgcHJvdmUgdXNlZnVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGF0dHJzOwotI2RlZmluZSBDR0VOX09QSU5TVF9BVFRSUyhvcGluc3QpICgob3BpbnN0KS0+YXR0cnMpCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gT1BJTlNULiAgKi8KLSNkZWZpbmUgQ0dFTl9PUElOU1RfQVRUUihvcGluc3QsIGF0dHIpIFwKLSgoQ0dFTl9PUElOU1RfQVRUUlMgKG9waW5zdCkgJiAoYXR0cikpICE9IDApCi0vKiBPcGVyYW5kIGlzIGNvbmRpdGlvbmFsbHkgcmVmZXJlbmNlZCAocmVhZC93cml0dGVuKS4gICovCi0jZGVmaW5lIENHRU5fT1BJTlNUX0NPTkRfUkVGIDEKLX0gQ0dFTl9PUElOU1Q7Ci0MCi0vKiBTeW50YXggc3RyaW5nLgotCi0gICBFYWNoIGluc24gZm9ybWF0IGFuZCBzdWJleHByZXNzaW9uIGhhcyBvbmUgb2YgdGhlc2UuCi0KLSAgIFRoZSBzeW50YXggInN0cmluZyIgY29uc2lzdHMgb2YgY2hhcmFjdGVycyAobiA+IDAgJiYgbiA8IDEyOCksIGFuZCBvcGVyYW5kCi0gICB2YWx1ZXMgKG4gPj0gMTI4KSwgYW5kIGlzIHRlcm1pbmF0ZWQgYnkgMC4gIE9wZXJhbmQgdmFsdWVzIGFyZSAxMjggKyBpbmRleAotICAgaW50byB0aGUgb3BlcmFuZCB0YWJsZS4gIFRoZSBvcGVyYW5kIHRhYmxlIGRvZXNuJ3QgZXhpc3QgaW4gQywgcGVyIHNlLCBhcwotICAgdGhlIGRhdGEgaXMgcmVjb3JkZWQgaW4gdGhlIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IHN3aXRjaCBzdGF0ZW1lbnRzLiAqLwotCi0vKiBUaGlzIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBuZWNlc3NhcnkgZm9yIGFueSB0YXJnZXQuICovCi0jZGVmaW5lIENHRU5fTUFYX1NZTlRBWF9CWVRFUyAzMgotCi0vKiBBIHRhcmdldCBtYXkga25vdyBpdHMgb3duIHByZWNpc2UgbWF4aW11bS4gIEFzc2VydCB0aGF0IGl0IGZhbGxzIGJlbG93Ci0gICB0aGUgYWJvdmUgbGltaXQuICovCi0jaWZkZWYgQ0dFTl9BQ1RVQUxfTUFYX1NZTlRBWF9CWVRFUwotI2lmIENHRU5fQUNUVUFMX01BWF9TWU5UQVhfQllURVMgPiBDR0VOX01BWF9TWU5UQVhfQllURVMKLSNlcnJvciAiQ0dFTl9BQ1RVQUxfTUFYX1NZTlRBWF9CWVRFUyB0b28gaGlnaCAtIGVubGFyZ2UgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTIgotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHN5bnRheFtDR0VOX01BWF9TWU5UQVhfQllURVNdOwotfSBDR0VOX1NZTlRBWDsKLQotI2RlZmluZSBDR0VOX1NZTlRBWF9TVFJJTkcoc3luKSAoc3luLT5zeW50YXgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0NIQVJfUChjKSAoKGMpIDwgMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9DSEFSKGMpIChjKQotI2RlZmluZSBDR0VOX1NZTlRBWF9GSUVMRChjKSAoKGMpIC0gMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEKGMpICgoYykgKyAxMjgpCi0KLS8qID8/PyBJIGNhbid0IGN1cnJlbnRseSB0aGluayBvZiBhbnkgY2FzZSB3aGVyZSB0aGUgbW5lbW9uaWMgZG9lc24ndCBjb21lCi0gICBmaXJzdCBbYW5kIGlmIG9uZSBldmVyIGRvZXNuJ3QgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGVzIHdpbGwgYmUgdHJpY2t5XS4KLSAgIEhvd2V2ZXIsIHdlIHRyZWF0IG1uZW1vbmljcyBhcyBqdXN0IGFub3RoZXIgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBBIHZhbHVlIG9mIDEgbWVhbnMgInRoaXMgaXMgd2hlcmUgdGhlIG1uZW1vbmljIGFwcGVhcnMiLiAgMSBpc24ndAotICAgc3BlY2lhbCBvdGhlciB0aGFuIGl0J3MgYSBub24tcHJpbnRhYmxlIEFTQ0lJIGNoYXIuICAqLwotCi0jZGVmaW5lIENHRU5fU1lOVEFYX01ORU1PTklDICAgICAgIDEKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUChjaCkgKChjaCkgPT0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMpCi0MCi0vKiBJbnN0cnVjdGlvbiBmaWVsZHMuCi0KLSAgID8/PyBXZSBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgYWRkaW5nIGZpZWxkcyBhdCBydW4tdGltZS4KLSAgIEVhc3kgdG8gZml4IHdoZW4gbmVlZGVkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pZmxkIHsKLSAgLyogRW51bSBvZiBpZmllbGQuICAqLwotICBpbnQgbnVtOwotI2RlZmluZSBDR0VOX0lGTERfTlVNKGYpICgoZiktPm51bSkKLQotICAvKiBOYW1lIG9mIHRoZSBmaWVsZCwgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBmaWVsZHMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lGTERfTkFNRShmKSAoKGYpLT5uYW1lKQotCi0gIC8qIERlZmF1bHQgb2Zmc2V0LCBpbiBiaXRzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiB0byB0aGUgd29yZAotICAgICBjb250YWluaW5nIHRoZSBmaWVsZC4gICovCi0gIGludCB3b3JkX29mZnNldDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfT0ZGU0VUKGYpICgoZiktPndvcmRfb2Zmc2V0KQotCi0gIC8qIERlZmF1bHQgbGVuZ3RoIG9mIHRoZSB3b3JkIGNvbnRhaW5pbmcgdGhlIGZpZWxkLiAgKi8KLSAgaW50IHdvcmRfc2l6ZTsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfU0laRShmKSAoKGYpLT53b3JkX3NpemUpCi0KLSAgLyogRGVmYXVsdCBzdGFydGluZyBiaXQgbnVtYmVyLgotICAgICBXaGV0aGVyIGxzYj0wIG9yIG1zYj0wIGlzIGRldGVybWluZWQgYnkgQ0dFTl9JTlNOX0xTQjBfUC4gICovCi0gIGludCBzdGFydDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1NUQVJUKGYpICgoZiktPnN0YXJ0KQotCi0gIC8qIExlbmd0aCBvZiB0aGUgZmllbGQsIGluIGJpdHMuICAqLwotICBpbnQgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTERfTEVOR1RIKGYpICgoZiktPmxlbmd0aCkKLQotI2lmbmRlZiBDR0VOX0lGTERfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9JRkxEX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JRkxEX0FUVFJTKGYpICgmKGYpLT5hdHRycykKLX0gQ0dFTl9JRkxEOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSUZMRC4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9BVFRSX1ZBTFVFKGlmbGQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGlmbGQpLCBDR0VOX0lGTERfQVRUUlMgKGlmbGQpLCAoYXR0cikpCi0MCi0vKiBJbnN0cnVjdGlvbiBkYXRhLiAgKi8KLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLQotICAgSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkIGJ5IGZvcm1hdC4gIEFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0cnVjdGlvbiBpcyBpdHMKLSAgIGZvcm1hdC4gIEVhY2ggaW5zbidzIG9wY29kZSB0YWJsZSBlbnRyeSBjb250YWlucyBhIGZvcm1hdCB0YWJsZSBlbnRyeS4KLSAgID8/PyBUaGVyZSBpcyB1c3VhbGx5IHZlcnkgZmV3IGZvcm1hdHMgY29tcGFyZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluc25zLAotICAgc28gb25lIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG9wY29kZSB0YWJsZSBieSByZWNvcmRpbmcgdGhlIGZvcm1hdCB0YWJsZQotICAgYXMgYSBzZXBhcmF0ZSBlbnRpdHkuICBHaXZlbiB0aGF0IHdlIGN1cnJlbnRseSBkb24ndCwgZm9ybWF0IHRhYmxlIGVudHJpZXMKLSAgIGFyZSBhbHNvIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgb3BlcmFuZHMuICBUaGlzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUKLSAgIHRhYmxlLCBidXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHRhYmxlcy4gIEl0J3MgYWxsIG1pbnV0aWFlIGFueXdheSBzbyBpdAotICAgZG9lc24ndCByZWFsbHkgbWF0dGVyIFthdCB0aGlzIHBvaW50IGluIHRpbWVdLgotCi0gICA/Pz8gU3VwcG9ydCBmb3IgdmFyaWFibGUgbGVuZ3RoIElTQSdzIGlzIHdpcC4gICovCi0KLS8qIEFjY29tcGFueWluZyBlYWNoIGlmb3JtYXQgZGVzY3JpcHRpb24gaXMgYSBsaXN0IG9mIGl0cyBmaWVsZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IENHRU5fSUZMRCAqaWZsZDsKLSNkZWZpbmUgQ0dFTl9JRk1UX0lGTERfSUZMRChpaSkgKChpaSktPmlmbGQpCi19IENHRU5fSUZNVF9JRkxEOwotCi0vKiBUaGlzIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBuZWNlc3NhcnkgZm9yIGFueSB0YXJnZXQuICovCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgMTYKLQotLyogQSB0YXJnZXQgbWF5IGtub3cgaXRzIG93biBwcmVjaXNlIG1heGltdW0uICBBc3NlcnQgdGhhdCBpdCBmYWxscyBiZWxvdwotICAgdGhlIGFib3ZlIGxpbWl0LiAqLwotI2lmZGVmIENHRU5fQUNUVUFMX01BWF9JRk1UX09QRVJBTkRTCi0jaWYgQ0dFTl9BQ1RVQUxfTUFYX0lGTVRfT1BFUkFORFMgPiBDR0VOX01BWF9JRk1UX09QRVJBTkRTCi0jZXJyb3IgIkNHRU5fQUNUVUFMX01BWF9JRk1UX09QRVJBTkRTIHRvbyBoaWdoIC0gZW5sYXJnZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIgotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBMZW5ndGggdGhhdCBNQVNLIGFuZCBWQUxVRSBoYXZlIGJlZW4gY2FsY3VsYXRlZCB0bwotICAgICBbVkFMVUUgaXMgcmVjb3JkZWQgZWxzZXdoZXJlXS4KLSAgICAgTm9ybWFsbHkgaXQgaXMgYmFzZV9pbnNuX2JpdHNpemUuICBPbiBbVl1MSVcgYXJjaGl0ZWN0dXJlcyB3aGVyZSB0aGUgYmFzZQotICAgICBpbnNuIHNpemUgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGFuIGluc24sIHRoaXMgZmllbGQgaXMgbGVzcyB0aGFuCi0gICAgIGJhc2VfaW5zbl9iaXRzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYXNrX2xlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRk1UX01BU0tfTEVOR1RIKGlmbXQpICgoaWZtdCktPm1hc2tfbGVuZ3RoKQotCi0gIC8qIFRvdGFsIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiwgaW4gYml0cy4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTVRfTEVOR1RIKGlmbXQpICgoaWZtdCktPmxlbmd0aCkKLQotICAvKiBNYXNrIHRvIGFwcGx5IHRvIHRoZSBmaXJzdCBNQVNLX0xFTkdUSCBiaXRzLgotICAgICBFYWNoIGluc24ncyB2YWx1ZSBpcyBzdG9yZWQgd2l0aCB0aGUgaW5zbi4KLSAgICAgVGhlIGZpcnN0IHN0ZXAgaW4gcmVjb2duaXppbmcgYW4gaW5zbiBmb3IgZGlzYXNzZW1ibHkgaXMKLSAgICAgKG9wY29kZSAmIG1hc2spID09IHZhbHVlLiAgKi8KLSAgQ0dFTl9JTlNOX0lOVCBtYXNrOwotI2RlZmluZSBDR0VOX0lGTVRfTUFTSyhpZm10KSAoKGlmbXQpLT5tYXNrKQotCi0gIC8qIEluc3RydWN0aW9uIGZpZWxkcy4KLSAgICAgKzEgZm9yIHRyYWlsaW5nIE5VTEwuICAqLwotICBDR0VOX0lGTVRfSUZMRCBpZmxkc1tDR0VOX01BWF9JRk1UX09QRVJBTkRTICsgMV07Ci0jZGVmaW5lIENHRU5fSUZNVF9JRkxEUyhpZm10KSAoKGlmbXQpLT5pZmxkcykKLX0gQ0dFTl9JRk1UOwotCi0vKiBJbnN0cnVjdGlvbiB2YWx1ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgb3Bjb2RlIHBvcnRpb24gb2YgdGhlIGJhc2UgaW5zbi4gICovCi0gIENHRU5fSU5TTl9JTlQgYmFzZV92YWx1ZTsKLQotI2lmZGVmIENHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EUwotICAvKiBFeHRyYSBvcGNvZGUgdmFsdWVzIGJleW9uZCBiYXNlX3ZhbHVlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpZmllbGRfdmFsdWVzW0NHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EU107Ci0jZW5kaWYKLX0gQ0dFTl9JVkFMVUU7Ci0KLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4KLSAgIFRoaXMgY29udGFpbnMgdGhlIHN5bnRheCBhbmQgZm9ybWF0IGRhdGEgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiA/Pz8gU29tZSBwb3J0cyBhbHJlYWR5IGhhdmUgYW4gb3Bjb2RlIHRhYmxlIHlldCBzdGlsbCBuZWVkIHRvIHVzZSB0aGUgcmVzdAotICAgb2Ygd2hhdCBjZ2VuX2luc24gaGFzLiAgUGx1cyBrZWVwaW5nIHRoZSBvcGNvZGUgZGF0YSB3aXRoIHRoZSBvcGVyYW5kCi0gICBpbnN0YW5jZSBkYXRhIGNhbiBjcmVhdGUgYSBwcmV0dHkgYmlnIGZpbGUuICBTbyB3ZSBrZWVwIHRoZW0gc2VwYXJhdGVseS4KLSAgIE5vdCBzdXJlIHRoaXMgaXMgYSBnb29kIGlkZWEgaW4gdGhlIGxvbmcgcnVuLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5kaWNlcyBpbnRvIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXIgdGFibGVzLiAgKi8KLSAgc3RydWN0IGNnZW5fb3Bjb2RlX2hhbmRsZXIgaGFuZGxlcnM7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0hBTkRMRVJTKG9wYykgKCYgKG9wYyktPmhhbmRsZXJzKQotCi0gIC8qIFN5bnRheCBzdHJpbmcuICAqLwotICBDR0VOX1NZTlRBWCBzeW50YXg7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX1NZTlRBWChvcGMpICgmIChvcGMpLT5zeW50YXgpCi0KLSAgLyogRm9ybWF0IGVudHJ5LiAgKi8KLSAgY29uc3QgQ0dFTl9JRk1UICpmb3JtYXQ7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0ZPUk1BVChvcGMpICgob3BjKS0+Zm9ybWF0KQotI2RlZmluZSBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUob3BjKSBDR0VOX0lGTVRfTUFTS19MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfQklUU0laRShvcGMpIENHRU5fSUZNVF9MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfSUZMRFMob3BjKSBDR0VOX0lGTVRfSUZMRFMgKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLQotICAvKiBJbnN0cnVjdGlvbiBvcGNvZGUgdmFsdWUuICAqLwotICBDR0VOX0lWQUxVRSB2YWx1ZTsKLSNkZWZpbmUgQ0dFTl9PUENPREVfVkFMVUUob3BjKSAoJiAob3BjKS0+dmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUob3BjKSAoQ0dFTl9PUENPREVfVkFMVUUgKG9wYyktPmJhc2VfdmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfTUFTSyhvcGMpIENHRU5fSUZNVF9NQVNLIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi19IENHRU5fT1BDT0RFOwotCi0vKiBJbnN0cnVjdGlvbiBhdHRyaWJ1dGVzLgotICAgVGhpcyBpcyBtYWRlIGEgcHVibGlzaGVkIHR5cGUgYXMgYXBwbGljYXRpb25zIGNhbiBjYWNoZSBhIHBvaW50ZXIgdG8KLSAgIHRoZSBhdHRyaWJ1dGVzIGZvciBzcGVlZC4gICovCi0KLSNpZm5kZWYgQ0dFTl9JTlNOX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLXR5cGVkZWYgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSU5TTl9OQk9PTF9BVFRSUykgQ0dFTl9JTlNOX0FUVFJfVFlQRTsKLQotLyogRW51bSBvZiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgYXR0cmlidXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi0vKiA/Pz8gTnVtYmVycyBoZXJlIGFyZSByZWNvcmRlZCBpbiB0d28gcGxhY2VzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUyA9IDAKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0jZW5kaWYKLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBlYWNoIGVudHJ5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEVhY2ggcmVhbCBpbnN0cnVjdGlvbiBpcyBlbnVtZXJhdGVkLiAgKi8KLSAgLyogPz8/IFRoaXMgbWF5IGdvIGF3YXkgaW4gdGltZS4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIENHRU5fSU5TTl9OVU0oaW5zbikgKChpbnNuKS0+YmFzZS0+bnVtKQotCi0gIC8qIE5hbWUgb2YgZW50cnkgKHRoYXQgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBlbnRyaWVzKS4gICovCi0gIC8qID8/PyBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcywgdHJ5IHRvIHByaW50IGZ1bGwgbW5lbW9uaWMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lOU05fTkFNRShpbnNuKSAoKGluc24pLT5iYXNlLT5uYW1lKQotCi0gIC8qIE1uZW1vbmljLiAgVGhpcyBpcyB1c2VkIHdoZW4gcGFyc2luZyBhbmQgcHJpbnRpbmcgdGhlIGluc24uCi0gICAgIEluIHRoZSBjYXNlIG9mIGluc25zIHRoYXQgaGF2ZSBvcGVyYW5kcyBvbiB0aGUgbW5lbW9uaWNzLCB0aGlzIGlzCi0gICAgIG9ubHkgdGhlIGNvbnN0YW50IHBhcnQuICBFLmcuIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24gb2YgYW4gYGFkZCcgaW5zbiwKLSAgICAgd2hlcmUgdGhlIGZ1bGwgbW5lbW9uaWMgaXMgYWRkZXEsIGFkZG5lLCBldGMuLCBhbmQgdGhlIGNvbmRpdGlvbiBpcwotICAgICB0cmVhdGVkIGFzIGFuIG9wZXJhbmQsIHRoaXMgaXMgb25seSAiYWRkIi4gICovCi0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotI2RlZmluZSBDR0VOX0lOU05fTU5FTU9OSUMoaW5zbikgKChpbnNuKS0+YmFzZS0+bW5lbW9uaWMpCi0KLSAgLyogVG90YWwgbGVuZ3RoIG9mIGluc3RydWN0aW9uLCBpbiBiaXRzLiAgKi8KLSAgaW50IGJpdHNpemU7Ci0jZGVmaW5lIENHRU5fSU5TTl9CSVRTSVpFKGluc24pICgoaW5zbiktPmJhc2UtPmJpdHNpemUpCi0KLSNpZiAwIC8qID8/PyBEaXNhYmxlZCBmb3Igbm93IGFzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzCi0JIGFuZCB0aGUgdGFibGUgaXMgYWxyZWFkeSBwcmV0dHkgYmlnLiAgU2hvdWxkIHBlcmhhcHMgYmUgbW92ZWQKLQkgdG8gYSBmaWxlIG9mIGl0cyBvd24uICAqLwotICAvKiBTZW1hbnRpY3MsIGFzIFJUTC4gICovCi0gIC8qID8/PyBQbGFpbiB0ZXh0IG9yIGJ5dGVjb2Rlcz8gICovCi0gIC8qID8/PyBOb3RlIHRoYXQgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgY291bGQgYmUgY29tcHV0ZWQgYXQgcnVuLXRpbWUKLSAgICAgaWYgd2UgcGFyc2UgdGhpcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuICBTb21ldGhpbmcgdG8gZXZlbnR1YWxseSBkby4gICovCi0gIGNvbnN0IGNoYXIgKnJ0eDsKLSNkZWZpbmUgQ0dFTl9JTlNOX1JUWChpbnNuKSAoKGluc24pLT5iYXNlLT5ydHgpCi0jZW5kaWYKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIG11c3QgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkIGFycmF5IGluIHRoYXQgb25lCi0gICAgIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyIG1heSBoYXZlIG1vcmUuCi0gICAgIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZSBuZWVkbid0Ci0gICAgIGNhcmUuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZCBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLAotICAgICBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvCi0gICAgIGF3YXkgYW55d2F5LiAgKi8KLSAgQ0dFTl9JTlNOX0FUVFJfVFlQRSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJTKGluc24pICgmKGluc24pLT5iYXNlLT5hdHRycykKLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJfVkFMVUUoaW5zbiwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIChhdHRyKSkKLX0gQ0dFTl9JQkFTRTsKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdGhlICJpbnZhbGlkIiBpbnNuIG1hcmtlci4gICovCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSURfUChpbnNuKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSA9PSAwKQotCi0vKiBNYWluIHN0cnVjdCBjb250YWluIGluc3RydWN0aW9uIGluZm9ybWF0aW9uLgotICAgQkFTRSBpcyBhbHdheXMgcHJlc2VudCwgdGhlIHJlc3QgaXMgcHJlc2VudCBvbmx5IGlmIGFza2VkIGZvci4gICovCi0KLXN0cnVjdCBjZ2VuX2luc24KLXsKLSAgLyogPz8/IE1heSBiZSBvZiB1c2UgdG8gcHV0IGEgdHlwZSBpbmRpY2F0b3IgaGVyZS4KLSAgICAgVGhlbiB0aGlzIHN0cnVjdCBjb3VsZCBkaWZmZXJlbnQgaW5mbyBmb3IgZGlmZmVyZW50IGNsYXNzZXMgb2YgaW5zbnMuICAqLwotICAvKiA/Pz8gQSBzcGVlZHVwIGNhbiBiZSBoYWQgYnkgbW92aW5nIGBiYXNlJyBpbnRvIHRoaXMgc3RydWN0LgotICAgICBNYXliZSBsYXRlci4gICovCi0gIGNvbnN0IENHRU5fSUJBU0UgKmJhc2U7Ci0gIGNvbnN0IENHRU5fT1BDT0RFICpvcGNvZGU7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBsaXN0cy4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgYWRkaW5nIG5ldyBlbnRyaWVzIGFuZCBmb3IgY3JlYXRpbmcgdGhlIGhhc2ggbGlzdHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2luc25fbGlzdAotewotICBzdHJ1Y3QgY2dlbl9pbnNuX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLX0gQ0dFTl9JTlNOX0xJU1Q7Ci0KLS8qIFRhYmxlIG9mIGluc3RydWN0aW9ucy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5pdF9lbnRyaWVzOwotICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpuZXdfZW50cmllczsKLX0gQ0dFTl9JTlNOX1RBQkxFOwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bi10aW1lLiAgKi8KLQotZXh0ZXJuIGludCBjZ2VuX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotZXh0ZXJuIGludCBjZ2VuX21hY3JvX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBvdGhlciBpbnNuIGVsZW1lbnRzIG5vdCByZWNvcmRlZCBpbiBDR0VOX0lCQVNFLiAgKi8KLQotLyogRmV0Y2ggSU5TTidzIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotLyogPz8/IERvZXNuJ3QgaGFuZGxlIGluc25zIGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BFUkFORFMoaW5zbikgKChpbnNuKS0+b3BpbnN0KQotCi0vKiBSZXR1cm4gSU5TTidzIG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9PUENPREUoaW5zbikgKChpbnNuKS0+b3Bjb2RlKQotCi0vKiBSZXR1cm4gSU5TTidzIGhhbmRsZXIgZGF0YS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9IQU5ETEVSUyhpbnNuKSBDR0VOX09QQ09ERV9IQU5ETEVSUyAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiBJTlNOJ3Mgc3ludGF4LiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX1NZTlRBWChpbnNuKSBDR0VOX09QQ09ERV9TWU5UQVggKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gc2l6ZSBvZiBiYXNlIG1hc2sgaW4gYml0cy4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUoaW5zbikgXAotICBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gbWFzayBvZiBiYXNlIHBhcnQgb2YgSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9CQVNFX01BU0soaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX01BU0sgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9WQUxVRShpbnNuKSBcCi0gIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBTdGFuZGFyZCB3YXkgdG8gdGVzdCB3aGV0aGVyIElOU04gaXMgc3VwcG9ydGVkIGJ5IE1BQ0guCi0gICBNQUNIIGlzIG9uZSBvZiBlbnVtIG1hY2hfYXR0ci4KLSAgIFRoZSAifDEiIGlzIGJlY2F1c2UgdGhlIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFDSF9IQVNfUChpbnNuLCBtYWNoKSBcCi0oKENHRU5fSU5TTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9NQUNIKSAmICgoMSA8PCAobWFjaCkpIHwgMSkpICE9IDApCi0MCi0vKiBNYWNybyBpbnN0cnVjdGlvbnMuCi0gICBNYWNybyBpbnNucyBhcmVuJ3QgcmVhbCBpbnNucywgdGhleSBtYXAgdG8gb25lIG9yIG1vcmUgcmVhbCBpbnNucy4KLSAgIEUuZy4gQW4gYXJjaGl0ZWN0dXJlJ3MgIm5vcCIgaW5zbiBtYXkgYWN0dWFsbHkgYmUgYW4gIm12IHIwLHIwIiBvcgotICAgc29tZSBzdWNoLgotCi0gICBNYWNybyBpbnNucyBjYW4gZXhwYW5kIHRvIG5vdGhpbmcgKGUuZy4gYSBub3AgdGhhdCBpcyBvcHRpbWl6ZWQgYXdheSkuCi0gICBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS1pbnNuIG1hY3JvcyB0aGF0IGJ1aWxkIGEgY29uc3RhbnQgaW4gYSByZWdpc3Rlci4KLSAgIE9mIGNvdXJzZSB0aGlzIGlzbid0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCi0KLSAgIEFzc2VtYmx5IG9mIG1hY3JvLWluc25zIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLiAgRGlzYXNzZW1ibHkgaXNuJ3QuCi0gICBIb3dldmVyLCBkaXNhc3NlbWJseSBvZiBhdCBsZWFzdCBzb21lIGtpbmRzIG9mIG1hY3JvIGluc25zIGlzIGltcG9ydGFudAotICAgaW4gb3JkZXIgdGhhdCB0aGUgZGlzYXNzZW1ibGVkIGNvZGUgcHJlc2VydmUgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAotICAgaW5zbi4gIFdoYXQgaXMgYXR0ZW1wdGVkIGhlcmUgaXMgdG8gZGlzYXNzZW1ibGUgYWxsICJzaW1wbGUiIG1hY3JvLWluc25zLAotICAgd2hlcmUgInNpbXBsZSIgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gbWVhbiAiZXhwYW5kcyB0byBvbmUgcmVhbCBpbnNuIi4KLQotICAgU2ltcGxlIG1hY3JvLWluc25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoZXkgYXJlIGVtaXR0ZWQgYXMgQUxJQVMncwotICAgb2YgcmVhbCBpbnNucy4gIFRoaXMgc2ltcGxpZmllcyB0aGVpciBoYW5kbGluZyBzaW5jZSB0aGVyZSdzIHVzdWFsbHkgbW9yZQotICAgb2YgdGhlbSB0aGFuIGFueSBvdGhlciBraW5kIG9mIG1hY3JvLWluc24sIGFuZCBwcm9wZXIgZGlzYXNzZW1ibHkgb2YgdGhlbQotICAgZmFsbHMgb3V0IGZvciBmcmVlLiAgKi8KLQotLyogRm9yIGVhY2ggbWFjcm8taW5zbiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMsCi0gICBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cy4gIFRoaXMgc3RydWN0dXJlIGlzIGFjY2Vzc2VkIHZpYSB0aGUgYGRhdGEnCi0gICBtZW1iZXIgb2YgQ0dFTl9JTlNOLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gewotICAvKiBGdW5jdGlvbiB0byBkbyB0aGUgZXhwYW5zaW9uLgotICAgICBJZiB0aGUgZXhwYW5zaW9uIGZhaWxzIChlLmcuICJubyBtYXRjaCIpIE5VTEwgaXMgcmV0dXJuZWQuCi0gICAgIFNwYWNlIGZvciB0aGUgZXhwYW5zaW9uIGlzIG9idGFpbmVkIHdpdGggbWFsbG9jLgotICAgICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgaXQuICAqLwotICBjb25zdCBjaGFyICogKCogZm4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosCi0JCQkgICAgICAgQ0dFTl9PUEVSQU5EICoqKSk7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX0ZOKGV4KSAoKGV4KS0+Zm4pCi0KLSAgLyogSW5zdHJ1Y3Rpb24ocykgdGhlIG1hY3JvIGV4cGFuZHMgdG8uCi0gICAgIFRoZSBmb3JtYXQgb2YgU1RSIGlzIGRlZmluZWQgYnkgRk4uCi0gICAgIEl0IGlzIHR5cGljYWxseSB0aGUgYXNzZW1ibHkgY29kZSBvZiB0aGUgcmVhbCBpbnNuLCBidXQgaXQgY291bGQgYWxzbyBiZQotICAgICB0aGUgb3JpZ2luYWwgU2NoZW1lIGV4cHJlc3Npb24gb3IgYSB0b2tlbml6ZWQgZm9ybSBvZiBpdCAod2l0aCBGTiBiZWluZwotICAgICBhbiBhcHByb3ByaWF0ZSBpbnRlcnByZXRlcikuICAqLwotICBjb25zdCBjaGFyICogc3RyOwotI2RlZmluZSBDR0VOX01JRVhQTl9TVFIoZXgpICgoZXgpLT5zdHIpCi19IENHRU5fTUlOU05fRVhQQU5TSU9OOwotCi0vKiBOb3JtYWwgZXhwYW5kZXIuCi0gICBXaGVuIHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IHN0cmluZyB0byBhbm90aGVyCi0gICBzdHJpbmcgYW5kIHRoZSBwYXJzZXIgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LiAgVGhlIG91dHB1dCBzdHJpbmcKLSAgIG1heSBjb250YWluIGZ1cnRoZXIgbWFjcm8gaW52b2NhdGlvbnMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fZXhwYW5kX21hY3JvX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwgQ0dFTl9PUEVSQU5EICoqKSk7Ci0MCi0vKiBUaGUgYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgdGhlIG1uZW1vbmljCi0gICAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0LCBidXQgd2UgcHJvdmlkZSBhIGZldwotICAgZXhhbXBsZXMgbGlrZSB0aGUgZmlyc3QgbGV0dGVyIG9yIGEgZnVuY3Rpb24gb2YgdGhlIGVudGlyZSBtbmVtb25pYykuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2FzbV9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgQ0dFTl9BU01fTE9PS1VQX0lOU04oY2QsIHN0cmluZykgY2dlbl9hc21fbG9va3VwX2luc24gKChjZCksIChzdHJpbmcpKQotI2RlZmluZSBDR0VOX0FTTV9ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQotLyogVGhlIGRpc2Fzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIG1hY2hpbmUKLSAgIGluc3RydWN0aW9uICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQpLiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9kaXNfbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0vKiBGSVhNRTogZGVsZXRlIHRoZXNlIHR3byAqLwotI2RlZmluZSBDR0VOX0RJU19MT09LVVBfSU5TTihjZCwgYnVmLCB2YWx1ZSkgY2dlbl9kaXNfbG9va3VwX2luc24gKChjZCksIChidWYpLCAodmFsdWUpKQotI2RlZmluZSBDR0VOX0RJU19ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQwKLS8qIFRoZSBDUFUgZGVzY3JpcHRpb24uCi0gICBBIGNvcHkgb2YgdGhpcyBpcyBjcmVhdGVkIHdoZW4gdGhlIGNwdSB0YWJsZSBpcyAib3BlbmVkIi4KLSAgIEFsbCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgaGVyZS4KLSAgIEFjY2VzcyBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciAicHVibGljIiBtZW1iZXJzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYwotewotICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgbWFjaGluZShzKSAoYSBsYSBCRkQgbWFjaGluZSBudW1iZXIpLiAgKi8KLSAgaW50IG1hY2hzOwotCi0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBpc2EocykuCi0gICAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICAgIHByZWNsdWRlZC4gICovCi0gIGludCBpc2FzOwotCi0gIC8qIEN1cnJlbnQgZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci0jZGVmaW5lIENHRU5fQ1BVX0VORElBTihjZCkgKChjZCktPmVuZGlhbikKLQotICAvKiBDdXJyZW50IGluc24gZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBpbnNuX2VuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9FTkRJQU4oY2QpICgoY2QpLT5pbnNuX2VuZGlhbikKLQotICAvKiBXb3JkIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgLyogPz8/IE9yIG1heWJlIG1heGltdW0gd29yZCBzaXplIC0gbWlnaHQgd2UgZXZlciBuZWVkIHRvIGFsbG93IGEgY3B1IHRhYmxlCi0gICAgIHRvIGJlIG9wZW5lZCBmb3IgYm90aCBzcGFyYzMyL3NwYXJjNjQ/Ci0gICAgID8/PyBBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIHNlbGVjdGVkIG1hY2hzIGFuZAotICAgICBsYXppbHkgZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCB3b3JkX2JpdHNpemU7Ci0KLSAgLyogSW5kaWNhdG9yIGlmIHNpemVzIGFyZSB1bmtub3duLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuX2JpdHNpemUgaWYgdGhlcmUgaXMgYQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkIGlzYSdzLiAgKi8KLSNkZWZpbmUgQ0dFTl9TSVpFX1VOS05PV04gNjU1MzUKLQotICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOwotCi0gIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KLSAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKLQotICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKLSAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9JU0EgKmlzYV90YWJsZTsKLQotICAvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9NQUNIICptYWNoX3RhYmxlOwotCi0gIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLSAgQ0dFTl9IV19UQUJMRSBod190YWJsZTsKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLwotICBjb25zdCBDR0VOX0lGTEQgKmlmbGRfdGFibGU7Ci0KLSAgLyogT3BlcmFuZHMuICAqLwotICBDR0VOX09QRVJBTkRfVEFCTEUgb3BlcmFuZF90YWJsZTsKLQotICAvKiBNYWluIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX1RBQkxFIGluc25fdGFibGU7Ci0jZGVmaW5lIENHRU5fQ1BVX0lOU05fVEFCTEUoY2QpICgmIChjZCktPmluc25fdGFibGUpCi0KLSAgLyogTWFjcm8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgYW5kIGFyZSBjb21iaW5lZCB3aXRoIHJlYWwKLSAgICAgaW5zbnMgZHVyaW5nIGhhc2ggdGFibGUgY29tcHV0YXRpb24uICAqLwotICBDR0VOX0lOU05fVEFCTEUgbWFjcm9faW5zbl90YWJsZTsKLQotICAvKiBDb3B5IG9mIENHRU5fSU5UX0lOU05fUC4gICovCi0gIGludCBpbnRfaW5zbl9wOwotCi0gIC8qIENhbGxlZCB0byByZWJ1aWxkIHRoZSB0YWJsZXMgYWZ0ZXIgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLiAgKi8KLSAgdm9pZCAoKnJlYnVpbGRfdGFibGVzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSAgLyogT3BlcmFuZCBwYXJzZXIgY2FsbGJhY2suICAqLwotICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gKiBwYXJzZV9vcGVyYW5kX2ZuOwotCi0gIC8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGNvdmVyIGZucyBmb3Igb3BlcmFuZHMuICAqLwotICBjb25zdCBjaGFyICogKCpwYXJzZV9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IGNoYXIgKiosCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSNpZmRlZiBCRkRfVkVSU0lPTgotICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywKLQkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hIHBjXykpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgUFRSIGluZm9fLCBDR0VOX0ZJRUxEUyAqIGZpZWxkc18sCi0JICAgICAgdm9pZCBjb25zdCAqYXR0cnNfLCBiZmRfdm1hIHBjXywgaW50IGxlbmd0aF8pKTsKLSNlbHNlCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKSAoKTsKLSAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpICgpOwotI2VuZGlmCi0jZGVmaW5lIENHRU5fQ1BVX1BBUlNFX09QRVJBTkQoY2QpICgoY2QpLT5wYXJzZV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORChjZCkgKChjZCktPmluc2VydF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9FWFRSQUNUX09QRVJBTkQoY2QpICgoY2QpLT5leHRyYWN0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1BSSU5UX09QRVJBTkQoY2QpICgoY2QpLT5wcmludF9vcGVyYW5kKQotCi0gIC8qIFNpemUgb2YgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemVvZl9maWVsZHM7Ci0jZGVmaW5lIENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMoY2QpICgoY2QpLT5zaXplb2ZfZmllbGRzKQotCi0gIC8qIFNldCB0aGUgYml0c2l6ZSBmaWVsZC4gICovCi0gIHZvaWQgKCpzZXRfZmllbGRzX2JpdHNpemUpIFBBUkFNUyAoKENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgc2l6ZV8pKTsKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFKGNkKSAoKGNkKS0+c2V0X2ZpZWxkc19iaXRzaXplKQotCi0gIC8qIENHRU5fRklFTERTIGFjY2Vzc29ycy4gICovCi0gIGludCAoKmdldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfaW50X29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHZhbHVlXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGJmZF92bWEgKCpnZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgdmFsdWVfKSk7Ci0jZWxzZQotICBsb25nICgqZ2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X2ludF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0dFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPmdldF92bWFfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X3ZtYV9vcGVyYW5kKQotCi0gIC8qIEluc3RydWN0aW9uIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLiAgKi8KLSAgLyogRklYTUU6IG1ha2UgdGhlc2UgdHlwZXMgdXBwZXJjYXNlLiAgKi8KLSAgY2dlbl9wYXJzZV9mbiAqIGNvbnN0ICpwYXJzZV9oYW5kbGVyczsKLSAgY2dlbl9pbnNlcnRfZm4gKiBjb25zdCAqaW5zZXJ0X2hhbmRsZXJzOwotICBjZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCAqZXh0cmFjdF9oYW5kbGVyczsKLSAgY2dlbl9wcmludF9mbiAqIGNvbnN0ICpwcmludF9oYW5kbGVyczsKLSNkZWZpbmUgQ0dFTl9QQVJTRV9GTihjZCwgaW5zbikgICAoY2QtPnBhcnNlX2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wYXJzZV0pCi0jZGVmaW5lIENHRU5fSU5TRVJUX0ZOKGNkLCBpbnNuKSAgKGNkLT5pbnNlcnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmluc2VydF0pCi0jZGVmaW5lIENHRU5fRVhUUkFDVF9GTihjZCwgaW5zbikgKGNkLT5leHRyYWN0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5leHRyYWN0XSkKLSNkZWZpbmUgQ0dFTl9QUklOVF9GTihjZCwgaW5zbikgICAoY2QtPnByaW50X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wcmludF0pCi0KLSAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLwotICBpbnQgKCogYXNtX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLQotICAvKiBBc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCAoKiBhc21faGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfc2l6ZTsKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBkaXNfaGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIERpc2Fzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGRpc19oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBkaXNhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBkaXNfaGFzaF9zaXplOwotCi0gIC8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGlzIGZpZWxkIGNvdWxkIGJlIHR1cm5lZCBpbnRvIGEgYml0ZmllbGQgaWYgcm9vbSBmb3Igb3RoZXIgZmxhZ3MgaXMgbmVlZGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpZ25lZF9vdmVyZmxvd19va19wOwotICAgICAgIAotfSBDR0VOX0NQVV9UQUJMRTsKLQotLyogd2lwICovCi0jaWZuZGVmIENHRU5fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfRU5ESUFOIChjZCkKLSNlbmRpZgotI2lmbmRlZiBDR0VOX0lOU05fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOKGNkKSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpCi0jZW5kaWYKLQwKLS8qIFByb3RvdHlwZXMgb2YgbWFqb3IgZnVuY3Rpb25zLiAgKi8KLS8qIEZJWE1FOiBNb3ZlIG1vcmUgQ0dFTl9TWU0tZGVmaW5lZCBmdW5jdGlvbnMgaW50byBDR0VOX0NQVV9ERVNDLgotICAgTm90IHRoZSBpbml0IGZucyB0aG91Z2gsIGFzIHRoYXQgd291bGQgZHJhZyBpbiB0aGluZ3MgdGhhdCBtaWdodG4ndCBiZQotICAgdXNlZCBhbmQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuICAqLwotCi0vKiBBcmd1bWVudCB0eXBlcyB0byBjcHVfb3Blbi4gICovCi0KLWVudW0gY2dlbl9jcHVfb3Blbl9hcmcgewotICBDR0VOX0NQVV9PUEVOX0VORCwKLSAgLyogU2VsZWN0IGluc3RydWN0aW9uIHNldChzKSwgYXJnIGlzIGJpdG1hcCBvciAwIG1lYW5pbmcgInVuc3BlY2lmaWVkIi4gICovCi0gIENHRU5fQ1BVX09QRU5fSVNBUywKLSAgLyogU2VsZWN0IG1hY2hpbmUocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX01BQ0hTLAotICAvKiBTZWxlY3QgbWFjaGluZSwgYXJnIGlzIG1hY2gncyBiZmQgbmFtZS4KLSAgICAgTXVsdGlwbGUgbWFjaGluZXMgY2FuIGJlIHNwZWNpZmllZCBieSByZXBlYXRlZCB1c2UuICAqLwotICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsCi0gIC8qIFNlbGVjdCBlbmRpYW4sIGFyZyBpcyBDR0VOX0VORElBTl8qLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4KLX07Ci0KLS8qIE9wZW4gYSBjcHUgZGVzY3JpcHRvciB0YWJsZSBmb3IgdXNlLgotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuKSAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZywgLi4uKTsKLQotLyogQ292ZXIgZm4gdG8gaGFuZGxlIHNpbXBsZSBjYXNlLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuXzEpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hY2hfbmFtZV8sCi0JCQkJCQkgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW5fKSk7Ci0KLS8qIENsb3NlIGl0LiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGNwdV9jbG9zZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X29wY29kZV90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgaWJsZCB0YWJsZSBmb3IgdXNlLgotICAgQ2FsbGVkIGJ5IGluaXRfYXNtL2luaXRfZGlzLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfaWJsZF90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSBhbiBjcHUgdGFibGUgZm9yIGFzc2VtYmxlciBvciBkaXNhc3NlbWJsZXIgdXNlLgotICAgVGhlc2UgbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3B1X29wZW4uICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9hc20pIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2RpcykgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGZvciB1c2UuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGluc3RfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uLiAgKi8KLQotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fRklFTERTICosCi0JICAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgY2hhciAqKikpOwotCi1leHRlcm4gY29uc3QgQ0dFTl9LRVlXT1JEIENHRU5fU1lNIChvcGVyYW5kX21hY2gpOwotZXh0ZXJuIGludCBDR0VOX1NZTSAoZ2V0X21hY2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBPcGVyYW5kIGluZGV4IGNvbXB1dGF0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBjZ2VuX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIENHRU5fSU5TTl9JTlQgaW50X3ZhbHVlXywgdW5zaWduZWQgY2hhciAqYnl0ZXNfdmFsdWVfLAotCSAgICAgIGludCBsZW5ndGhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IGFsaWFzX3BfKSk7Ci1leHRlcm4gdm9pZCBjZ2VuX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgKmluZGljZXNfKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgaW50ICppbmRpY2VzXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogQ292ZXIgZm5zIHRvIGJmZF9nZXQvc2V0LiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9JTlQgY2dlbl9nZXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgY2dlbl9wdXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBSZWFkIGluIGEgY3B1IGRlc2NyaXB0aW9uIGZpbGUuCi0gICA/Pz8gRm9yIGZ1dHVyZSBjb25jZXJucywgaW5jbHVkaW5nIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFzc2VtYmxlci8KLSAgIGRpc2Fzc2VtYmxlciBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9yZWFkX2NwdV9maWxlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZV8pKTsKLQotLyogQWxsb3cgc2lnbmVkIG92ZXJmbG93IG9mIGluc3RydWN0aW9uIGZpZWxkcy4gICovCi1leHRlcm4gdm9pZCBjZ2VuX3NldF9zaWduZWRfb3ZlcmZsb3dfb2sgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgc2lnbmVkIGZpZWxkIGluIGFuIGluc3RydWN0aW9uIG92ZXJmbG93cy4gICovCi1leHRlcm4gdm9pZCBjZ2VuX2NsZWFyX3NpZ25lZF9vdmVyZmxvd19vayBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLS8qIFdpbGwgYW4gZXJyb3IgbWVzc2FnZSBiZSBnZW5lcmF0ZWQgaWYgYSBzaWduZWQgZmllbGQgaW4gYW4gaW5zdHJ1Y3Rpb24gb3ZlcmZsb3dzID8gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY2dlbl9zaWduZWRfb3ZlcmZsb3dfb2tfcCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSNlbmRpZiAvKiBDR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oIGIvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWVlYmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzExICswLDAgQEAKLS8qIEluZm9ybWF0aW9uIGZvciBpbnN0cnVjdGlvbiBkaXNhc3NlbWJseSBvbiB0aGUgQ29udmV4LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglDT05TVAotI2RlZmluZQlDT05TVAotI2VuZGlmCS8qIENPTlNUICovCi0KLSNkZWZpbmUgeHh4IDAKLSNkZWZpbmUgcnJyIDEKLSNkZWZpbmUgcnIgMgotI2RlZmluZSByeHIgMwotI2RlZmluZSByIDQKLSNkZWZpbmUgbm9wcyA1Ci0jZGVmaW5lIG5yIDYKLSNkZWZpbmUgcGNyZWwgNwotI2RlZmluZSBsciA4Ci0jZGVmaW5lIHJ4bCA5Ci0jZGVmaW5lIHJsciAxMAotI2RlZmluZSBycmwgMTEKLSNkZWZpbmUgaW1sIDEyCi0jZGVmaW5lIGltciAxMwotI2RlZmluZSBhMXIgMTQKLSNkZWZpbmUgYTFsIDE1Ci0jZGVmaW5lIGEyciAxNgotI2RlZmluZSBhMmwgMTcKLSNkZWZpbmUgYTMgMTgKLSNkZWZpbmUgYTQgMTkKLSNkZWZpbmUgYTUgMjAKLSNkZWZpbmUgViAxCi0jZGVmaW5lIFMgMgotI2RlZmluZSBWTSAzCi0jZGVmaW5lIEEgNAotI2RlZmluZSBWTCA1Ci0jZGVmaW5lIFZTIDYKLSNkZWZpbmUgVkxTIDcKLSNkZWZpbmUgUFNXIDgKLS8qIFByZXZlbnQgYW4gZXJyb3IgZHVyaW5nICJtYWtlIGRlcGVuZCIuICAqLwotI2lmICFkZWZpbmVkIChQQykKLSNkZWZpbmUgUEMgOQotI2VuZGlmCi0jZGVmaW5lIElUUiAxMAotI2RlZmluZSBWViAxMQotI2RlZmluZSBJVFNSIDEyCi0jZGVmaW5lIFRPQyAxMwotI2RlZmluZSBDSVIgMTQKLSNkZWZpbmUgVFRSIDE1Ci0jZGVmaW5lIFZNVSAxNgotI2RlZmluZSBWTUwgMTcKLSNkZWZpbmUgSUNSIDE4Ci0jZGVmaW5lIFRDUFUgMTkKLSNkZWZpbmUgQ1BVSUQgMjAKLSNkZWZpbmUgVElEIDIxCi0KLUNPTlNUIGNoYXIgKm9wW10gPSB7Ci0gICIiLAotICAidjBcMHYxXDB2MlwwdjNcMHY0XDB2NVwwdjZcMHY3IiwKLSAgInMwXDBzMVwwczJcMHMzXDBzNFwwczVcMHM2XDBzNyIsCi0gICJ2bSIsCi0gICJzcFwwYTFcMGEyXDBhM1wwYTRcMGE1XDBhcFwwZnAiLAotICAidmwiLAotICAidnMiLAotICAidmxzIiwKLSAgInBzdyIsCi0gICJwYyIsCi0gICJpdHIiLAotICAidnYiLAotICAiaXRzciIsCi0gICJ0b2MiLAotICAiY2lyIiwKLSAgInR0ciIsCi0gICJ2bXUiLAotICAidm1sIiwKLSAgImljciIsCi0gICJ0Y3B1IiwKLSAgImNwdWlkIiwKLSAgInRpZCIsCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQwW10gPSB7Ci0gIHswLDAscnJyLFYsUyxTfSwJLyogbW92ICovCi0gIHswLDAscnJyLFMsUyxWfSwJLyogbW92ICovCi0gIHsxLDEscnJyLFYsVixWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsVixWfSwJLyogbWFzay50ICovCi0gIHsxLDIscnJyLFYsUyxWfSwJLyogbWVyZy5mICovCi0gIHsyLDIscnJyLFYsUyxWfSwJLyogbWFzay5mICovCi0gIHsxLDEscnJyLFYsUyxWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsUyxWfSwJLyogbWFzay50ICovCi0gIHszLDMscnJyLFYsVixWfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycnIsVixWLFZ9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJycixWLFYsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFYsVixWfSwJLyogZGl2LmQgKi8KLSAgezMsMyxycnIsVixTLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFMsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsUyxWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixTLFZ9LAkvKiBkaXYuZCAqLwotICB7NSwwLHJycixWLFYsVn0sCS8qIGFuZCAqLwotICB7NiwwLHJycixWLFYsVn0sCS8qIG9yICovCi0gIHs3LDAscnJyLFYsVixWfSwJLyogeG9yICovCi0gIHs4LDAscnJyLFYsVixWfSwJLyogc2hmICovCi0gIHs1LDAscnJyLFYsUyxWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsUyxWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixTLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixTLFZ9LAkvKiBzaGYgKi8KLSAgezksMyxycnIsVixWLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFYsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDMscnJyLFYsUyxWfSwJLyogYWRkLnMgKi8KLSAgezksNCxycnIsVixTLFZ9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycnIsVixTLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsVixTLFZ9LAkvKiBzdWIuZCAqLwotICB7OSw1LHJycixWLFYsVn0sCS8qIGFkZC5iICovCi0gIHs5LDYscnJyLFYsVixWfSwJLyogYWRkLmggKi8KLSAgezksNyxycnIsVixWLFZ9LAkvKiBhZGQudyAqLwotICB7OSw4LHJycixWLFYsVn0sCS8qIGFkZC5sICovCi0gIHs5LDUscnJyLFYsUyxWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixTLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFMsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsUyxWfSwJLyogYWRkLmwgKi8KLSAgezEwLDUscnJyLFYsVixWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsVixWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsVixWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsVixWfSwJLyogc3ViLmwgKi8KLSAgezEwLDUscnJyLFYsUyxWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsUyxWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsUyxWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsUyxWfSwJLyogc3ViLmwgKi8KLSAgezMsNSxycnIsVixWLFZ9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJycixWLFYsVn0sCS8qIG11bC5oICovCi0gIHszLDcscnJyLFYsVixWfSwJLyogbXVsLncgKi8KLSAgezMsOCxycnIsVixWLFZ9LAkvKiBtdWwubCAqLwotICB7Myw1LHJycixWLFMsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsUyxWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixTLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFMsVn0sCS8qIG11bC5sICovCi0gIHs0LDUscnJyLFYsVixWfSwJLyogZGl2LmIgKi8KLSAgezQsNixycnIsVixWLFZ9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJycixWLFYsVn0sCS8qIGRpdi53ICovCi0gIHs0LDgscnJyLFYsVixWfSwJLyogZGl2LmwgKi8KLSAgezQsNSxycnIsVixTLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFMsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsUyxWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixTLFZ9LAkvKiBkaXYubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MVtdID0gewotICB7MTEsMCx4eHgsMCwwLDB9LAkvKiBleGl0ICovCi0gIHsxMiwwLGEzLDAsMCwwfSwJLyogam1wICovCi0gIHsxMywyLGEzLDAsMCwwfSwJLyogam1waS5mICovCi0gIHsxMywxLGEzLDAsMCwwfSwJLyogam1waS50ICovCi0gIHsxNCwyLGEzLDAsMCwwfSwJLyogam1wYS5mICovCi0gIHsxNCwxLGEzLDAsMCwwfSwJLyogam1wYS50ICovCi0gIHsxNSwyLGEzLDAsMCwwfSwJLyogam1wcy5mICovCi0gIHsxNSwxLGEzLDAsMCwwfSwJLyogam1wcy50ICovCi0gIHsxNiwwLGEzLDAsMCwwfSwJLyogdGFjICovCi0gIHsxNywwLGExcixBLDAsMH0sCS8qIGxkZWEgKi8KLSAgezE4LDgsYTFsLFZMUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw5LGExbCxWTSwwLDB9LAkvKiBsZC54ICovCi0gIHsxOSwwLGEzLDAsMCwwfSwJLyogdGFzICovCi0gIHsyMCwwLGEzLDAsMCwwfSwJLyogcHNoZWEgKi8KLSAgezIxLDgsYTJsLFZMUywwLDB9LAkvKiBzdC5sICovCi0gIHsyMSw5LGEybCxWTSwwLDB9LAkvKiBzdC54ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyMiwwLGEzLDAsMCwwfSwJLyogY2FsbCAqLwotICB7MjMsMCxhMywwLDAsMH0sCS8qIGNhbGxzICovCi0gIHsyNCwwLGEzLDAsMCwwfSwJLyogY2FsbHEgKi8KLSAgezI1LDAsYTFyLEEsMCwwfSwJLyogcGZvcmsgKi8KLSAgezI2LDUsYTJyLFMsMCwwfSwJLyogc3RlLmIgKi8KLSAgezI2LDYsYTJyLFMsMCwwfSwJLyogc3RlLmggKi8KLSAgezI2LDcsYTJyLFMsMCwwfSwJLyogc3RlLncgKi8KLSAgezI2LDgsYTJyLFMsMCwwfSwJLyogc3RlLmwgKi8KLSAgezE4LDUsYTFyLEEsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezI3LDcsYTFyLEEsMCwwfSwJLyogaW5jci53ICovCi0gIHsyMSw1LGEycixBLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLEEsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsQSwwLDB9LAkvKiBzdC53ICovCi0gIHsyNyw4LGExcixTLDAsMH0sCS8qIGluY3IubCAqLwotICB7MTgsNSxhMXIsUywwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixTLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFMsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixTLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFMsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsUywwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezE4LDUsYTFyLFYsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsViwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixWLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDgsYTFyLFYsMCwwfSwJLyogbGQubCAqLwotICB7MjEsNSxhMnIsViwwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixWLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLFYsMCwwfSwJLyogc3QudyAqLwotICB7MjEsOCxhMnIsViwwLDB9LAkvKiBzdC5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLEEsQSwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLEEsQSwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLEEsQSwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLEEsQSwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCw1LHJyLFMsUywwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFMsUywwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFMsUywwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFMsUywwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwzLHJyLFMsUywwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFMsUywwfSwJLyogY3Z0cy53ICovCi0gIHszMiwzLHJyLFMsUywwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFMsUywwfSwJLyogY3Z0cy5kICovCi0gIHszMSw4LHJyLFMsUywwfSwJLyogY3Z0cy5sICovCi0gIHszMiw4LHJyLFMsUywwfSwJLyogY3Z0ZC5sICovCi0gIHszMywzLHJyLFMsUywwfSwJLyogY3Z0bC5zICovCi0gIHszMyw0LHJyLFMsUywwfSwJLyogY3Z0bC5kICovCi0gIHszNCwwLHJyLEEsQSwwfSwJLyogbGRwYSAqLwotICB7OCwwLG5yLEEsMCwwfSwJLyogc2hmICovCi0gIHsxOCw2LG5yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxucixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezMzLDcscnIsUyxTLDB9LAkvKiBjdnRsLncgKi8KLSAgezI4LDgscnIsUyxTLDB9LAkvKiBjdnR3LmwgKi8KLSAgezM1LDEscnIsUyxTLDB9LAkvKiBwbGMudCAqLwotICB7MzYsMCxycixTLFMsMH0sCS8qIHR6YyAqLwotICB7MzcsNixycixBLEEsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsQSxBLDB9LAkvKiBlcS53ICovCi0gIHszNyw2LG5yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxucixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM3LDUscnIsUyxTLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsUywwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFMsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxTLDB9LAkvKiBlcS5sICovCi0gIHszOCw2LHJyLEEsQSwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsQSxBLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNixucixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LG5yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM4LDUscnIsUyxTLDB9LAkvKiBsZXUuYiAqLwotICB7MzgsNixycixTLFMsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LHJyLFMsUywwfSwJLyogbGV1LncgKi8KLSAgezM4LDgscnIsUyxTLDB9LAkvKiBsZXUubCAqLwotICB7MzksNixycixBLEEsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLEEsQSwwfSwJLyogbHR1LncgKi8KLSAgezM5LDYsbnIsQSwwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxucixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHszOSw1LHJyLFMsUywwfSwJLyogbHR1LmIgKi8KLSAgezM5LDYscnIsUyxTLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxycixTLFMsMH0sCS8qIGx0dS53ICovCi0gIHszOSw4LHJyLFMsUywwfSwJLyogbHR1LmwgKi8KLSAgezQwLDYscnIsQSxBLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLEEsQSwwfSwJLyogbGUudyAqLwotICB7NDAsNixucixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsbnIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MCw1LHJyLFMsUywwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixTLFMsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsUyxTLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFMsUywwfSwJLyogbGUubCAqLwotICB7NDEsNixycixBLEEsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsQSxBLDB9LAkvKiBsdC53ICovCi0gIHs0MSw2LG5yLEEsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxucixBLDAsMH0sCS8qIGx0LncgKi8KLSAgezQxLDUscnIsUyxTLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFMsUywwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixTLFMsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsUyxTLDB9LAkvKiBsdC5sICovCi0gIHs5LDcscnIsUyxBLDB9LAkvKiBhZGQudyAqLwotICB7OCwwLHJyLEEsQSwwfSwJLyogc2hmICovCi0gIHswLDAscnIsQSxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixTLEEsMH0sCS8qIG1vdiAqLwotICB7MCw3LHJyLFMsUywwfSwJLyogbW92LncgKi8KLSAgezgsMCxycixTLFMsMH0sCS8qIHNoZiAqLwotICB7MCwwLHJyLFMsUywwfSwJLyogbW92ICovCi0gIHswLDAscnIsQSxTLDB9LAkvKiBtb3YgKi8KLSAgezUsMCxycixBLEEsMH0sCS8qIGFuZCAqLwotICB7NiwwLHJyLEEsQSwwfSwJLyogb3IgKi8KLSAgezcsMCxycixBLEEsMH0sCS8qIHhvciAqLwotICB7NDIsMCxycixBLEEsMH0sCS8qIG5vdCAqLwotICB7NSwwLHJyLFMsUywwfSwJLyogYW5kICovCi0gIHs2LDAscnIsUyxTLDB9LAkvKiBvciAqLwotICB7NywwLHJyLFMsUywwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLFMsUywwfSwJLyogbm90ICovCi0gIHs0MCwzLHJyLFMsUywwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFMsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxTLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsUywwfSwJLyogbHQuZCAqLwotICB7OSwzLHJyLFMsUywwfSwJLyogYWRkLnMgKi8KLSAgezksNCxycixTLFMsMH0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJyLFMsUywwfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnIsUyxTLDB9LAkvKiBzdWIuZCAqLwotICB7MzcsMyxycixTLFMsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsUyxTLDB9LAkvKiBlcS5kICovCi0gIHs0Myw2LHJyLEEsQSwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsQSxBLDB9LAkvKiBuZWcudyAqLwotICB7MywzLHJyLFMsUywwfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycixTLFMsMH0sCS8qIG11bC5kICovCi0gIHs0LDMscnIsUyxTLDB9LAkvKiBkaXYucyAqLwotICB7NCw0LHJyLFMsUywwfSwJLyogZGl2LmQgKi8KLSAgezksNixycixBLEEsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcscnIsQSxBLDB9LAkvKiBhZGQudyAqLwotICB7OSw2LG5yLEEsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxucixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHs5LDUscnIsUyxTLDB9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJyLFMsUywwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixTLFMsMH0sCS8qIGFkZC53ICovCi0gIHs5LDgscnIsUyxTLDB9LAkvKiBhZGQubCAqLwotICB7MTAsNixycixBLEEsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLEEsQSwwfSwJLyogc3ViLncgKi8KLSAgezEwLDYsbnIsQSwwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxucixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw1LHJyLFMsUywwfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnIsUyxTLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycixTLFMsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJyLFMsUywwfSwJLyogc3ViLmwgKi8KLSAgezMsNixycixBLEEsMH0sCS8qIG11bC5oICovCi0gIHszLDcscnIsQSxBLDB9LAkvKiBtdWwudyAqLwotICB7Myw2LG5yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxucixBLDAsMH0sCS8qIG11bC53ICovCi0gIHszLDUscnIsUyxTLDB9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJyLFMsUywwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixTLFMsMH0sCS8qIG11bC53ICovCi0gIHszLDgscnIsUyxTLDB9LAkvKiBtdWwubCAqLwotICB7NCw2LHJyLEEsQSwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxycixBLEEsMH0sCS8qIGRpdi53ICovCi0gIHs0LDYsbnIsQSwwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LG5yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezQsNSxycixTLFMsMH0sCS8qIGRpdi5iICovCi0gIHs0LDYscnIsUyxTLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLFMsUywwfSwJLyogZGl2LncgKi8KLSAgezQsOCxycixTLFMsMH0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQzW10gPSB7Ci0gIHszMiwzLHJyLFYsViwwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFYsViwwfSwJLyogY3Z0cy5kICovCi0gIHszMyw0LHJyLFYsViwwfSwJLyogY3Z0bC5kICovCi0gIHszMiw4LHJyLFYsViwwfSwJLyogY3Z0ZC5sICovCi0gIHswLDAscnJsLFMsUyxWTX0sCS8qIG1vdiAqLwotICB7MCwwLHJscixTLFZNLFN9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQ0LDAscnIsUyxTLDB9LAkvKiBsb3AgKi8KLSAgezM2LDAscnIsVixWLDB9LAkvKiB0emMgKi8KLSAgezQ0LDAscnIsVixWLDB9LAkvKiBsb3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQyLDAscnIsVixWLDB9LAkvKiBub3QgKi8KLSAgezgsMCxycixTLFYsMH0sCS8qIHNoZiAqLwotICB7MzUsMSxycixWLFYsMH0sCS8qIHBsYy50ICovCi0gIHs0NSwyLHJyLFYsViwwfSwJLyogY3Bycy5mICovCi0gIHs0NSwxLHJyLFYsViwwfSwJLyogY3Bycy50ICovCi0gIHszNywzLHJyLFYsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixWLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsVixWLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixWLFYsMH0sCS8qIG5lZy5kICovCi0gIHszNywzLHJyLFMsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsUyxTLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixTLFMsMH0sCS8qIG5lZy5kICovCi0gIHs0MCwzLHJyLFYsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixWLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsVixWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFYsViwwfSwJLyogbHQuZCAqLwotICB7NDAsMyxycixTLFYsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsUyxWLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFMsViwwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixTLFYsMH0sCS8qIGx0LmQgKi8KLSAgezM3LDUscnIsVixWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFYsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixWLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsVixWLDB9LAkvKiBlcS5sICovCi0gIHszNyw1LHJyLFMsViwwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixTLFYsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsUyxWLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFMsViwwfSwJLyogZXEubCAqLwotICB7NDAsNSxycixWLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsVixWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFYsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixWLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQwLDUscnIsUyxWLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsViwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFYsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxWLDB9LAkvKiBsZS5sICovCi0gIHs0MSw1LHJyLFYsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixWLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsVixWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFYsViwwfSwJLyogbHQubCAqLwotICB7NDEsNSxycixTLFYsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxWLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsViwwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFYsMH0sCS8qIGx0LmwgKi8KLSAgezQzLDUscnIsVixWLDB9LAkvKiBuZWcuYiAqLwotICB7NDMsNixycixWLFYsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLFYsViwwfSwJLyogbmVnLncgKi8KLSAgezQzLDgscnIsVixWLDB9LAkvKiBuZWcubCAqLwotICB7NDMsNSxycixTLFMsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFMsUywwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsUyxTLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixTLFMsMH0sCS8qIG5lZy5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ0W10gPSB7Ci0gIHs0NiwwLG5vcHMsMCwwLDB9LAkvKiBub3AgKi8KLSAgezQ3LDAscGNyZWwsMCwwLDB9LAkvKiBiciAqLwotICB7NDgsMixwY3JlbCwwLDAsMH0sCS8qIGJyaS5mICovCi0gIHs0OCwxLHBjcmVsLDAsMCwwfSwJLyogYnJpLnQgKi8KLSAgezQ5LDIscGNyZWwsMCwwLDB9LAkvKiBicmEuZiAqLwotICB7NDksMSxwY3JlbCwwLDAsMH0sCS8qIGJyYS50ICovCi0gIHs1MCwyLHBjcmVsLDAsMCwwfSwJLyogYnJzLmYgKi8KLSAgezUwLDEscGNyZWwsMCwwLDB9LAkvKiBicnMudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NVtdID0gewotICB7NTEsNSxycixWLFYsMH0sCS8qIGxkdmkuYiAqLwotICB7NTEsNixycixWLFYsMH0sCS8qIGxkdmkuaCAqLwotICB7NTEsNyxycixWLFYsMH0sCS8qIGxkdmkudyAqLwotICB7NTEsOCxycixWLFYsMH0sCS8qIGxkdmkubCAqLwotICB7MjgsMyxycixWLFYsMH0sCS8qIGN2dHcucyAqLwotICB7MzEsNyxycixWLFYsMH0sCS8qIGN2dHMudyAqLwotICB7MjgsOCxycixWLFYsMH0sCS8qIGN2dHcubCAqLwotICB7MzMsNyxycixWLFYsMH0sCS8qIGN2dGwudyAqLwotICB7NTIsNSxyeHIsVixWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFYsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixWLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsVixWLDB9LAkvKiBzdHZpLmwgKi8KLSAgezUyLDUscnhyLFMsViwwfSwJLyogc3R2aS5iICovCi0gIHs1Miw2LHJ4cixTLFYsMH0sCS8qIHN0dmkuaCAqLwotICB7NTIsNyxyeHIsUyxWLDB9LAkvKiBzdHZpLncgKi8KLSAgezUyLDgscnhyLFMsViwwfSwJLyogc3R2aS5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ2W10gPSB7Ci0gIHs1MywwLHIsQSwwLDB9LAkvKiBsZHNkciAqLwotICB7NTQsMCxyLEEsMCwwfSwJLyogbGRrZHIgKi8KLSAgezU1LDMscixTLDAsMH0sCS8qIGxuLnMgKi8KLSAgezU1LDQscixTLDAsMH0sCS8qIGxuLmQgKi8KLSAgezU2LDAsbm9wcywwLDAsMH0sCS8qIHBhdHUgKi8KLSAgezU3LDAscixBLDAsMH0sCS8qIHBhdGUgKi8KLSAgezU4LDAsbm9wcywwLDAsMH0sCS8qIHBpY2ggKi8KLSAgezU5LDAsbm9wcywwLDAsMH0sCS8qIHBsY2ggKi8KLSAgezAsMCxscixQU1csQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsUFNXLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixQQyxBLDB9LAkvKiBtb3YgKi8KLSAgezYwLDAscixTLDAsMH0sCS8qIGlkbGUgKi8KLSAgezAsMCxscixJVFIsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsSVRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxJVFNSLDB9LAkvKiBtb3YgKi8KLSAgezYxLDAsbm9wcywwLDAsMH0sCS8qIHJ0bnEgKi8KLSAgezYyLDAsbm9wcywwLDAsMH0sCS8qIGNmb3JrICovCi0gIHs2MywwLG5vcHMsMCwwLDB9LAkvKiBydG4gKi8KLSAgezY0LDAsbm9wcywwLDAsMH0sCS8qIHdmb3JrICovCi0gIHs2NSwwLG5vcHMsMCwwLDB9LAkvKiBqb2luICovCi0gIHs2NiwwLG5vcHMsMCwwLDB9LAkvKiBydG5jICovCi0gIHs2NywzLHIsUywwLDB9LAkvKiBleHAucyAqLwotICB7NjcsNCxyLFMsMCwwfSwJLyogZXhwLmQgKi8KLSAgezY4LDMscixTLDAsMH0sCS8qIHNpbi5zICovCi0gIHs2OCw0LHIsUywwLDB9LAkvKiBzaW4uZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NjksMyxyLFMsMCwwfSwJLyogY29zLnMgKi8KLSAgezY5LDQscixTLDAsMH0sCS8qIGNvcy5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MCw3LHIsQSwwLDB9LAkvKiBwc2gudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzEsNyxyLEEsMCwwfSwJLyogcG9wLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixTLDAsMH0sCS8qIHBzaC53ICovCi0gIHs3MCw4LHIsUywwLDB9LAkvKiBwc2gubCAqLwotICB7NzEsNyxyLFMsMCwwfSwJLyogcG9wLncgKi8KLSAgezcxLDgscixTLDAsMH0sCS8qIHBvcC5sICovCi0gIHs3MiwwLG5vcHMsMCwwLDB9LAkvKiBlbmkgKi8KLSAgezczLDAsbm9wcywwLDAsMH0sCS8qIGRzaSAqLwotICB7NzQsMCxub3BzLDAsMCwwfSwJLyogYmtwdCAqLwotICB7NzUsMCxub3BzLDAsMCwwfSwJLyogbXN5bmMgKi8KLSAgezc2LDAscixTLDAsMH0sCS8qIG1za2kgKi8KLSAgezc3LDAscixTLDAsMH0sCS8qIHhtdGkgKi8KLSAgezAsMCxyeGwsUyxWViwwfSwJLyogbW92ICovCi0gIHs3OCwwLG5vcHMsMCwwLDB9LAkvKiB0c3R2diAqLwotICB7MCwwLGxyLFZTLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTCxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxWTCwwfSwJLyogbW92ICovCi0gIHswLDcsbHIsVlMsUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxyeGwsUyxWUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxscixWTCxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZMLDB9LAkvKiBtb3YudyAqLwotICB7NzksMCxyLEEsMCwwfSwJLyogZGlhZyAqLwotICB7ODAsMCxub3BzLDAsMCwwfSwJLyogcGJrcHQgKi8KLSAgezgxLDMscixTLDAsMH0sCS8qIHNxcnQucyAqLwotICB7ODEsNCxyLFMsMCwwfSwJLyogc3FydC5kICovCi0gIHs4MiwwLG5vcHMsMCwwLDB9LAkvKiBjYXNyICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MywzLHIsUywwLDB9LAkvKiBhdGFuLnMgKi8KLSAgezgzLDQscixTLDAsMH0sCS8qIGF0YW4uZCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0N1tdID0gewotICB7ODQsNSxyLFYsMCwwfSwJLyogc3VtLmIgKi8KLSAgezg0LDYscixWLDAsMH0sCS8qIHN1bS5oICovCi0gIHs4NCw3LHIsViwwLDB9LAkvKiBzdW0udyAqLwotICB7ODQsOCxyLFYsMCwwfSwJLyogc3VtLmwgKi8KLSAgezg1LDAscixWLDAsMH0sCS8qIGFsbCAqLwotICB7ODYsMCxyLFYsMCwwfSwJLyogYW55ICovCi0gIHs4NywwLHIsViwwLDB9LAkvKiBwYXJpdHkgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDUscixWLDAsMH0sCS8qIG1heC5iICovCi0gIHs4OCw2LHIsViwwLDB9LAkvKiBtYXguaCAqLwotICB7ODgsNyxyLFYsMCwwfSwJLyogbWF4LncgKi8KLSAgezg4LDgscixWLDAsMH0sCS8qIG1heC5sICovCi0gIHs4OSw1LHIsViwwLDB9LAkvKiBtaW4uYiAqLwotICB7ODksNixyLFYsMCwwfSwJLyogbWluLmggKi8KLSAgezg5LDcscixWLDAsMH0sCS8qIG1pbi53ICovCi0gIHs4OSw4LHIsViwwLDB9LAkvKiBtaW4ubCAqLwotICB7ODQsMyxyLFYsMCwwfSwJLyogc3VtLnMgKi8KLSAgezg0LDQscixWLDAsMH0sCS8qIHN1bS5kICovCi0gIHs5MCwzLHIsViwwLDB9LAkvKiBwcm9kLnMgKi8KLSAgezkwLDQscixWLDAsMH0sCS8qIHByb2QuZCAqLwotICB7ODgsMyxyLFYsMCwwfSwJLyogbWF4LnMgKi8KLSAgezg4LDQscixWLDAsMH0sCS8qIG1heC5kICovCi0gIHs4OSwzLHIsViwwLDB9LAkvKiBtaW4ucyAqLwotICB7ODksNCxyLFYsMCwwfSwJLyogbWluLmQgKi8KLSAgezkwLDUscixWLDAsMH0sCS8qIHByb2QuYiAqLwotICB7OTAsNixyLFYsMCwwfSwJLyogcHJvZC5oICovCi0gIHs5MCw3LHIsViwwLDB9LAkvKiBwcm9kLncgKi8KLSAgezkwLDgscixWLDAsMH0sCS8qIHByb2QubCAqLwotICB7MzUsMixscixWTSxTLDB9LAkvKiBwbGMuZiAqLwotICB7MzUsMSxscixWTSxTLDB9LAkvKiBwbGMudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0eFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWFbXSA9IHsKLSAgezkxLDAsaW1yLEEsMCwwfSwJLyogaGFsdCAqLwotICB7OTIsMCxhNCwwLDAsMH0sCS8qIHN5c2MgKi8KLSAgezE4LDYsaW1yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxpbXIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLEEsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLEEsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsQSwwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsQSwwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezE4LDcsaW1sLFZMLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDcsaW1sLFZTLDAsMH0sCS8qIGxkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgsNyxpbXIsUywwLDB9LAkvKiBzaGYudyAqLwotICB7OTMsMCxhNSwwLDAsMH0sCS8qIHRyYXAgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDYsaW1yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsQSwwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixBLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLEEsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixBLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFiW10gPSB7Ci0gIHsxOCw0LGltcixTLDAsMH0sCS8qIGxkLmQgKi8KLSAgezE4LDEwLGltcixTLDAsMH0sCS8qIGxkLnUgKi8KLSAgezE4LDgsaW1yLFMsMCwwfSwJLyogbGQubCAqLwotICB7MTgsNyxpbXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLFMsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLFMsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsUywwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsUywwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsUywwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixTLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixTLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixTLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLFMsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsUywwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixTLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLFMsMCwwfSwJLyogZGl2LncgKi8KLSAgezksMyxpbXIsUywwLDB9LAkvKiBhZGQucyAqLwotICB7MTAsMyxpbXIsUywwLDB9LAkvKiBzdWIucyAqLwotICB7MywzLGltcixTLDAsMH0sCS8qIG11bC5zICovCi0gIHs0LDMsaW1yLFMsMCwwfSwJLyogZGl2LnMgKi8KLSAgezQwLDMsaW1yLFMsMCwwfSwJLyogbGUucyAqLwotICB7NDEsMyxpbXIsUywwLDB9LAkvKiBsdC5zICovCi0gIHszNyw2LGltcixTLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsaW1yLFMsMCwwfSwJLyogZXEudyAqLwotICB7MzgsNixpbXIsUywwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxpbXIsUywwLDB9LAkvKiBsZXUudyAqLwotICB7MzksNixpbXIsUywwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxpbXIsUywwLDB9LAkvKiBsdHUudyAqLwotICB7NDAsNixpbXIsUywwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LGltcixTLDAsMH0sCS8qIGxlLncgKi8KLSAgezQxLDYsaW1yLFMsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxpbXIsUywwLDB9LAkvKiBsdC53ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQwW10gPSB7Ci0gIHsxMCwzLHJycixTLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixTLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs0LDMscnJyLFMsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsUyxWLFZ9LAkvKiBkaXYuZCAqLwotICB7MTAsMTEscnJyLFMsVixWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFMsVixWfSwJLyogc3ViLmQuZiAqLwotICB7NCwxMSxycnIsUyxWLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixTLFYsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezMsMTEscnJyLFYsVixWfSwJLyogbXVsLnMuZiAqLwotICB7MywxMixycnIsVixWLFZ9LAkvKiBtdWwuZC5mICovCi0gIHs0LDExLHJycixWLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFYsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixTLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFMsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsUyxWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixTLFZ9LAkvKiBkaXYuZC5mICovCi0gIHs1LDIscnJyLFYsVixWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixWLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsVixWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixWLFZ9LAkvKiBzaGYuZiAqLwotICB7NSwyLHJycixWLFMsVn0sCS8qIGFuZC5mICovCi0gIHs2LDIscnJyLFYsUyxWfSwJLyogb3IuZiAqLwotICB7NywyLHJycixWLFMsVn0sCS8qIHhvci5mICovCi0gIHs4LDIscnJyLFYsUyxWfSwJLyogc2hmLmYgKi8KLSAgezksMTEscnJyLFYsVixWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixWLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDExLHJycixWLFMsVn0sCS8qIGFkZC5zLmYgKi8KLSAgezksMTIscnJyLFYsUyxWfSwJLyogYWRkLmQuZiAqLwotICB7MTAsMTEscnJyLFYsUyxWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFYsUyxWfSwJLyogc3ViLmQuZiAqLwotICB7OSwxMyxycnIsVixWLFZ9LAkvKiBhZGQuYi5mICovCi0gIHs5LDE0LHJycixWLFYsVn0sCS8qIGFkZC5oLmYgKi8KLSAgezksMTUscnJyLFYsVixWfSwJLyogYWRkLncuZiAqLwotICB7OSwxNixycnIsVixWLFZ9LAkvKiBhZGQubC5mICovCi0gIHs5LDEzLHJycixWLFMsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsUyxWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixTLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFMsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezEwLDEzLHJycixWLFYsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFYsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFYsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFYsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezEwLDEzLHJycixWLFMsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFMsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFMsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFMsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezMsMTMscnJyLFYsVixWfSwJLyogbXVsLmIuZiAqLwotICB7MywxNCxycnIsVixWLFZ9LAkvKiBtdWwuaC5mICovCi0gIHszLDE1LHJycixWLFYsVn0sCS8qIG11bC53LmYgKi8KLSAgezMsMTYscnJyLFYsVixWfSwJLyogbXVsLmwuZiAqLwotICB7MywxMyxycnIsVixTLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFMsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsUyxWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixTLFZ9LAkvKiBtdWwubC5mICovCi0gIHs0LDEzLHJycixWLFYsVn0sCS8qIGRpdi5iLmYgKi8KLSAgezQsMTQscnJyLFYsVixWfSwJLyogZGl2LmguZiAqLwotICB7NCwxNSxycnIsVixWLFZ9LAkvKiBkaXYudy5mICovCi0gIHs0LDE2LHJycixWLFYsVn0sCS8qIGRpdi5sLmYgKi8KLSAgezQsMTMscnJyLFYsUyxWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixTLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFMsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsUyxWfSwJLyogZGl2LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7OTQsMCxhMywwLDAsMH0sCS8qIHRzdCAqLwotICB7OTUsMCxhMywwLDAsMH0sCS8qIGxjayAqLwotICB7OTYsMCxhMywwLDAsMH0sCS8qIHVsayAqLwotICB7MTcsMCxhMXIsUywwLDB9LAkvKiBsZGVhICovCi0gIHs5NywwLGExcixBLDAsMH0sCS8qIHNwYXduICovCi0gIHs5OCwwLGExcixBLDAsMH0sCS8qIGxkY21yICovCi0gIHs5OSwwLGEycixBLDAsMH0sCS8qIHN0Y21yICovCi0gIHsxMDAsMCxhMXIsQSwwLDB9LAkvKiBwb3ByICovCi0gIHsxMDEsMCxhMnIsQSwwLDB9LAkvKiBwc2hyICovCi0gIHsxMDIsNyxhMXIsQSwwLDB9LAkvKiByY3ZyLncgKi8KLSAgezEwMyw3LGEycixBLDAsMH0sCS8qIG1hdG0udyAqLwotICB7MTA0LDcsYTJyLEEsMCwwfSwJLyogc25kci53ICovCi0gIHsxMDQsOCxhMnIsUywwLDB9LAkvKiBzbmRyLmwgKi8KLSAgezEwMiw4LGExcixTLDAsMH0sCS8qIHJjdnIubCAqLwotICB7MTAzLDgsYTJyLFMsMCwwfSwJLyogbWF0bS5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMDUsNyxhMnIsQSwwLDB9LAkvKiBwdXRyLncgKi8KLSAgezEwNSw4LGEycixTLDAsMH0sCS8qIHB1dHIubCAqLwotICB7MTA2LDcsYTFyLEEsMCwwfSwJLyogZ2V0ci53ICovCi0gIHsxMDYsOCxhMXIsUywwLDB9LAkvKiBnZXRyLmwgKi8KLSAgezI2LDEzLGEycixTLDAsMH0sCS8qIHN0ZS5iLmYgKi8KLSAgezI2LDE0LGEycixTLDAsMH0sCS8qIHN0ZS5oLmYgKi8KLSAgezI2LDE1LGEycixTLDAsMH0sCS8qIHN0ZS53LmYgKi8KLSAgezI2LDE2LGEycixTLDAsMH0sCS8qIHN0ZS5sLmYgKi8KLSAgezEwNyw3LGEycixBLDAsMH0sCS8qIG1hdHIudyAqLwotICB7MTA4LDcsYTJyLEEsMCwwfSwJLyogbWF0LncgKi8KLSAgezEwOSw3LGExcixBLDAsMH0sCS8qIGdldC53ICovCi0gIHsxMTAsNyxhMXIsQSwwLDB9LAkvKiByY3YudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MTExLDcsYTFyLEEsMCwwfSwJLyogaW5jLncgKi8KLSAgezExMiw3LGEycixBLDAsMH0sCS8qIHB1dC53ICovCi0gIHsxMTMsNyxhMnIsQSwwLDB9LAkvKiBzbmQudyAqLwotICB7MTA3LDgsYTJyLFMsMCwwfSwJLyogbWF0ci5sICovCi0gIHsxMDgsOCxhMnIsUywwLDB9LAkvKiBtYXQubCAqLwotICB7MTA5LDgsYTFyLFMsMCwwfSwJLyogZ2V0LmwgKi8KLSAgezExMCw4LGExcixTLDAsMH0sCS8qIHJjdi5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsOCxhMXIsUywwLDB9LAkvKiBpbmMubCAqLwotICB7MTEyLDgsYTJyLFMsMCwwfSwJLyogcHV0LmwgKi8KLSAgezExMyw4LGEycixTLDAsMH0sCS8qIHNuZC5sICovCi0gIHsxOCwxMyxhMXIsViwwLDB9LAkvKiBsZC5iLmYgKi8KLSAgezE4LDE0LGExcixWLDAsMH0sCS8qIGxkLmguZiAqLwotICB7MTgsMTUsYTFyLFYsMCwwfSwJLyogbGQudy5mICovCi0gIHsxOCwxNixhMXIsViwwLDB9LAkvKiBsZC5sLmYgKi8KLSAgezIxLDEzLGEycixWLDAsMH0sCS8qIHN0LmIuZiAqLwotICB7MjEsMTQsYTJyLFYsMCwwfSwJLyogc3QuaC5mICovCi0gIHsyMSwxNSxhMnIsViwwLDB9LAkvKiBzdC53LmYgKi8KLSAgezIxLDE2LGEycixWLDAsMH0sCS8qIHN0LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MltdID0gewotICB7MjgsNSxycixWLFYsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixWLFYsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixWLFYsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixWLFYsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsMTMscnIsVixWLDB9LAkvKiBjdnR3LmIuZiAqLwotICB7MjgsMTQscnIsVixWLDB9LAkvKiBjdnR3LmguZiAqLwotICB7MjksMTUscnIsVixWLDB9LAkvKiBjdnRiLncuZiAqLwotICB7MzAsMTUscnIsVixWLDB9LAkvKiBjdnRoLncuZiAqLwotICB7MzEsOCxycixWLFYsMH0sCS8qIGN2dHMubCAqLwotICB7MzIsNyxycixWLFYsMH0sCS8qIGN2dGQudyAqLwotICB7MzMsMyxycixWLFYsMH0sCS8qIGN2dGwucyAqLwotICB7MjgsNCxycixWLFYsMH0sCS8qIGN2dHcuZCAqLwotICB7MzEsMTYscnIsVixWLDB9LAkvKiBjdnRzLmwuZiAqLwotICB7MzIsMTUscnIsVixWLDB9LAkvKiBjdnRkLncuZiAqLwotICB7MzMsMTEscnIsVixWLDB9LAkvKiBjdnRsLnMuZiAqLwotICB7MjgsMTIscnIsVixWLDB9LAkvKiBjdnR3LmQuZiAqLwotICB7MTE0LDAscnIsUyxTLDB9LAkvKiBlbmFsICovCi0gIHs4LDcscnIsUyxTLDB9LAkvKiBzaGYudyAqLwotICB7MTE1LDAscnIsUyxTLDB9LAkvKiBlbmFnICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCw0LHJyLFMsUywwfSwJLyogY3Z0dy5kICovCi0gIHszMiw3LHJyLFMsUywwfSwJLyogY3Z0ZC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixTLFMsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFMsUywwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDMscnIsVixWLDB9LAkvKiBmcmludC5zICovCi0gIHsxMTYsNCxycixWLFYsMH0sCS8qIGZyaW50LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxMSxycixWLFYsMH0sCS8qIGZyaW50LnMuZiAqLwotICB7MTE2LDEyLHJyLFYsViwwfSwJLyogZnJpbnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwzLHJyLFYsViwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHJyLFYsViwwfSwJLyogc3FydC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxMSxycixWLFYsMH0sCS8qIHNxcnQucy5mICovCi0gIHs4MSwxMixycixWLFYsMH0sCS8qIHNxcnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQzW10gPSB7Ci0gIHszMiwxMSxycixWLFYsMH0sCS8qIGN2dGQucy5mICovCi0gIHszMSwxMixycixWLFYsMH0sCS8qIGN2dHMuZC5mICovCi0gIHszMywxMixycixWLFYsMH0sCS8qIGN2dGwuZC5mICovCi0gIHszMiwxNixycixWLFYsMH0sCS8qIGN2dGQubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwyLHJyLFYsViwwfSwJLyogdHpjLmYgKi8KLSAgezQ0LDIscnIsVixWLDB9LAkvKiBsb3AuZiAqLwotICB7MTE3LDIscnIsVixWLDB9LAkvKiB4cG5kLmYgKi8KLSAgezQyLDIscnIsVixWLDB9LAkvKiBub3QuZiAqLwotICB7OCwyLHJyLFMsViwwfSwJLyogc2hmLmYgKi8KLSAgezM1LDE3LHJyLFYsViwwfSwJLyogcGxjLnQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTEscnIsVixWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFYsViwwfSwJLyogZXEuZC5mICovCi0gIHs0MywxMSxycixWLFYsMH0sCS8qIG5lZy5zLmYgKi8KLSAgezQzLDEyLHJyLFYsViwwfSwJLyogbmVnLmQuZiAqLwotICB7MzcsMTEscnIsUyxWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFMsViwwfSwJLyogZXEuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxMSxycixWLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsVixWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFYsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixWLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7NDAsMTEscnIsUyxWLDB9LAkvKiBsZS5zLmYgKi8KLSAgezQwLDEyLHJyLFMsViwwfSwJLyogbGUuZC5mICovCi0gIHs0MSwxMSxycixTLFYsMH0sCS8qIGx0LnMuZiAqLwotICB7NDEsMTIscnIsUyxWLDB9LAkvKiBsdC5kLmYgKi8KLSAgezM3LDEzLHJyLFYsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixWLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsVixWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFYsViwwfSwJLyogZXEubC5mICovCi0gIHszNywxMyxycixTLFYsMH0sCS8qIGVxLmIuZiAqLwotICB7MzcsMTQscnIsUyxWLDB9LAkvKiBlcS5oLmYgKi8KLSAgezM3LDE1LHJyLFMsViwwfSwJLyogZXEudy5mICovCi0gIHszNywxNixycixTLFYsMH0sCS8qIGVxLmwuZiAqLwotICB7NDAsMTMscnIsVixWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFYsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixWLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsVixWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQwLDEzLHJyLFMsViwwfSwJLyogbGUuYi5mICovCi0gIHs0MCwxNCxycixTLFYsMH0sCS8qIGxlLmguZiAqLwotICB7NDAsMTUscnIsUyxWLDB9LAkvKiBsZS53LmYgKi8KLSAgezQwLDE2LHJyLFMsViwwfSwJLyogbGUubC5mICovCi0gIHs0MSwxMyxycixWLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsVixWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFYsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixWLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDEsMTMscnIsUyxWLDB9LAkvKiBsdC5iLmYgKi8KLSAgezQxLDE0LHJyLFMsViwwfSwJLyogbHQuaC5mICovCi0gIHs0MSwxNSxycixTLFYsMH0sCS8qIGx0LncuZiAqLwotICB7NDEsMTYscnIsUyxWLDB9LAkvKiBsdC5sLmYgKi8KLSAgezQzLDEzLHJyLFYsViwwfSwJLyogbmVnLmIuZiAqLwotICB7NDMsMTQscnIsVixWLDB9LAkvKiBuZWcuaC5mICovCi0gIHs0MywxNSxycixWLFYsMH0sCS8qIG5lZy53LmYgKi8KLSAgezQzLDE2LHJyLFYsViwwfSwJLyogbmVnLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NVtdID0gewotICB7NTEsMTMscnIsVixWLDB9LAkvKiBsZHZpLmIuZiAqLwotICB7NTEsMTQscnIsVixWLDB9LAkvKiBsZHZpLmguZiAqLwotICB7NTEsMTUscnIsVixWLDB9LAkvKiBsZHZpLncuZiAqLwotICB7NTEsMTYscnIsVixWLDB9LAkvKiBsZHZpLmwuZiAqLwotICB7MjgsMTEscnIsVixWLDB9LAkvKiBjdnR3LnMuZiAqLwotICB7MzEsMTUscnIsVixWLDB9LAkvKiBjdnRzLncuZiAqLwotICB7MjgsMTYscnIsVixWLDB9LAkvKiBjdnR3LmwuZiAqLwotICB7MzMsMTUscnIsVixWLDB9LAkvKiBjdnRsLncuZiAqLwotICB7NTIsMTMscnhyLFYsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixWLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsVixWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFYsViwwfSwJLyogc3R2aS5sLmYgKi8KLSAgezUyLDEzLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi5mICovCi0gIHs1MiwxNCxyeHIsUyxWLDB9LAkvKiBzdHZpLmguZiAqLwotICB7NTIsMTUscnhyLFMsViwwfSwJLyogc3R2aS53LmYgKi8KLSAgezUyLDE2LHJ4cixTLFYsMH0sCS8qIHN0dmkubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ2W10gPSB7Ci0gIHswLDAscnhsLFMsQ0lSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixDSVIsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVE9DLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENQVUlELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRUUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVFRSLFMsMH0sCS8qIG1vdiAqLwotICB7MTE4LDAsbm9wcywwLDAsMH0sCS8qIGN0cnNsICovCi0gIHsxMTksMCxub3BzLDAsMCwwfSwJLyogY3Ryc2cgKi8KLSAgezAsMCxyeGwsUyxWTVUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNVSxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxWTUwsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNTCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJQ1IsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLElDUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxUQ1BVLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUQ1BVLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTIwLDAsbm9wcywwLDAsMH0sCS8qIHN0b3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxUSUQsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRJRCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDdbXSA9IHsKLSAgezg0LDEzLHIsViwwLDB9LAkvKiBzdW0uYi5mICovCi0gIHs4NCwxNCxyLFYsMCwwfSwJLyogc3VtLmguZiAqLwotICB7ODQsMTUscixWLDAsMH0sCS8qIHN1bS53LmYgKi8KLSAgezg0LDE2LHIsViwwLDB9LAkvKiBzdW0ubC5mICovCi0gIHs4NSwyLHIsViwwLDB9LAkvKiBhbGwuZiAqLwotICB7ODYsMixyLFYsMCwwfSwJLyogYW55LmYgKi8KLSAgezg3LDIscixWLDAsMH0sCS8qIHBhcml0eS5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCwxMyxyLFYsMCwwfSwJLyogbWF4LmIuZiAqLwotICB7ODgsMTQscixWLDAsMH0sCS8qIG1heC5oLmYgKi8KLSAgezg4LDE1LHIsViwwLDB9LAkvKiBtYXgudy5mICovCi0gIHs4OCwxNixyLFYsMCwwfSwJLyogbWF4LmwuZiAqLwotICB7ODksMTMscixWLDAsMH0sCS8qIG1pbi5iLmYgKi8KLSAgezg5LDE0LHIsViwwLDB9LAkvKiBtaW4uaC5mICovCi0gIHs4OSwxNSxyLFYsMCwwfSwJLyogbWluLncuZiAqLwotICB7ODksMTYscixWLDAsMH0sCS8qIG1pbi5sLmYgKi8KLSAgezg0LDExLHIsViwwLDB9LAkvKiBzdW0ucy5mICovCi0gIHs4NCwxMixyLFYsMCwwfSwJLyogc3VtLmQuZiAqLwotICB7OTAsMTEscixWLDAsMH0sCS8qIHByb2Qucy5mICovCi0gIHs5MCwxMixyLFYsMCwwfSwJLyogcHJvZC5kLmYgKi8KLSAgezg4LDExLHIsViwwLDB9LAkvKiBtYXgucy5mICovCi0gIHs4OCwxMixyLFYsMCwwfSwJLyogbWF4LmQuZiAqLwotICB7ODksMTEscixWLDAsMH0sCS8qIG1pbi5zLmYgKi8KLSAgezg5LDEyLHIsViwwLDB9LAkvKiBtaW4uZC5mICovCi0gIHs5MCwxMyxyLFYsMCwwfSwJLyogcHJvZC5iLmYgKi8KLSAgezkwLDE0LHIsViwwLDB9LAkvKiBwcm9kLmguZiAqLwotICB7OTAsMTUscixWLDAsMH0sCS8qIHByb2Qudy5mICovCi0gIHs5MCwxNixyLFYsMCwwfSwJLyogcHJvZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDBbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwLDE4LHJycixTLFYsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixTLFYsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezQsMTgscnJyLFMsVixWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsUyxWLFZ9LAkvKiBkaXYuZC50ICovCi0gIHszLDE4LHJycixWLFYsVn0sCS8qIG11bC5zLnQgKi8KLSAgezMsMTkscnJyLFYsVixWfSwJLyogbXVsLmQudCAqLwotICB7NCwxOCxycnIsVixWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixWLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsUyxWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixTLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFMsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsUyxWfSwJLyogZGl2LmQudCAqLwotICB7NSwxLHJycixWLFYsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsVixWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFYsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsVixWfSwJLyogc2hmLnQgKi8KLSAgezUsMSxycnIsVixTLFZ9LAkvKiBhbmQudCAqLwotICB7NiwxLHJycixWLFMsVn0sCS8qIG9yLnQgKi8KLSAgezcsMSxycnIsVixTLFZ9LAkvKiB4b3IudCAqLwotICB7OCwxLHJycixWLFMsVn0sCS8qIHNoZi50ICovCi0gIHs5LDE4LHJycixWLFYsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsVixWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsVixWfSwJLyogc3ViLmQudCAqLwotICB7OSwxOCxycnIsVixTLFZ9LAkvKiBhZGQucy50ICovCi0gIHs5LDE5LHJycixWLFMsVn0sCS8qIGFkZC5kLnQgKi8KLSAgezEwLDE4LHJycixWLFMsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixWLFMsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezksMjAscnJyLFYsVixWfSwJLyogYWRkLmIudCAqLwotICB7OSwyMSxycnIsVixWLFZ9LAkvKiBhZGQuaC50ICovCi0gIHs5LDIyLHJycixWLFYsVn0sCS8qIGFkZC53LnQgKi8KLSAgezksMjMscnJyLFYsVixWfSwJLyogYWRkLmwudCAqLwotICB7OSwyMCxycnIsVixTLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFMsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsUyxWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixTLFZ9LAkvKiBhZGQubC50ICovCi0gIHsxMCwyMCxycnIsVixWLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixWLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixWLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixWLFZ9LAkvKiBzdWIubC50ICovCi0gIHsxMCwyMCxycnIsVixTLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixTLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixTLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixTLFZ9LAkvKiBzdWIubC50ICovCi0gIHszLDIwLHJycixWLFYsVn0sCS8qIG11bC5iLnQgKi8KLSAgezMsMjEscnJyLFYsVixWfSwJLyogbXVsLmgudCAqLwotICB7MywyMixycnIsVixWLFZ9LAkvKiBtdWwudy50ICovCi0gIHszLDIzLHJycixWLFYsVn0sCS8qIG11bC5sLnQgKi8KLSAgezMsMjAscnJyLFYsUyxWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixTLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFMsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsUyxWfSwJLyogbXVsLmwudCAqLwotICB7NCwyMCxycnIsVixWLFZ9LAkvKiBkaXYuYi50ICovCi0gIHs0LDIxLHJycixWLFYsVn0sCS8qIGRpdi5oLnQgKi8KLSAgezQsMjIscnJyLFYsVixWfSwJLyogZGl2LncudCAqLwotICB7NCwyMyxycnIsVixWLFZ9LAkvKiBkaXYubC50ICovCi0gIHs0LDIwLHJycixWLFMsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsUyxWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixTLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFMsVn0sCS8qIGRpdi5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDFbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI2LDIwLGEycixTLDAsMH0sCS8qIHN0ZS5iLnQgKi8KLSAgezI2LDIxLGEycixTLDAsMH0sCS8qIHN0ZS5oLnQgKi8KLSAgezI2LDIyLGEycixTLDAsMH0sCS8qIHN0ZS53LnQgKi8KLSAgezI2LDIzLGEycixTLDAsMH0sCS8qIHN0ZS5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezE4LDIwLGExcixWLDAsMH0sCS8qIGxkLmIudCAqLwotICB7MTgsMjEsYTFyLFYsMCwwfSwJLyogbGQuaC50ICovCi0gIHsxOCwyMixhMXIsViwwLDB9LAkvKiBsZC53LnQgKi8KLSAgezE4LDIzLGExcixWLDAsMH0sCS8qIGxkLmwudCAqLwotICB7MjEsMjAsYTJyLFYsMCwwfSwJLyogc3QuYi50ICovCi0gIHsyMSwyMSxhMnIsViwwLDB9LAkvKiBzdC5oLnQgKi8KLSAgezIxLDIyLGEycixWLDAsMH0sCS8qIHN0LncudCAqLwotICB7MjEsMjMsYTJyLFYsMCwwfSwJLyogc3QubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQyW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCwyMCxycixWLFYsMH0sCS8qIGN2dHcuYi50ICovCi0gIHsyOCwyMSxycixWLFYsMH0sCS8qIGN2dHcuaC50ICovCi0gIHsyOSwyMixycixWLFYsMH0sCS8qIGN2dGIudy50ICovCi0gIHszMCwyMixycixWLFYsMH0sCS8qIGN2dGgudy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszMSwyMyxycixWLFYsMH0sCS8qIGN2dHMubC50ICovCi0gIHszMiwyMixycixWLFYsMH0sCS8qIGN2dGQudy50ICovCi0gIHszMywxOCxycixWLFYsMH0sCS8qIGN2dGwucy50ICovCi0gIHsyOCwxOSxycixWLFYsMH0sCS8qIGN2dHcuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMTgscnIsVixWLDB9LAkvKiBmcmludC5zLnQgKi8KLSAgezExNiwxOSxycixWLFYsMH0sCS8qIGZyaW50LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMTgscnIsVixWLDB9LAkvKiBzcXJ0LnMudCAqLwotICB7ODEsMTkscnIsVixWLDB9LAkvKiBzcXJ0LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0M1tdID0gewotICB7MzIsMTgscnIsVixWLDB9LAkvKiBjdnRkLnMudCAqLwotICB7MzEsMTkscnIsVixWLDB9LAkvKiBjdnRzLmQudCAqLwotICB7MzMsMTkscnIsVixWLDB9LAkvKiBjdnRsLmQudCAqLwotICB7MzIsMjMscnIsVixWLDB9LAkvKiBjdnRkLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzYsMSxycixWLFYsMH0sCS8qIHR6Yy50ICovCi0gIHs0NCwxLHJyLFYsViwwfSwJLyogbG9wLnQgKi8KLSAgezExNywxLHJyLFYsViwwfSwJLyogeHBuZC50ICovCi0gIHs0MiwxLHJyLFYsViwwfSwJLyogbm90LnQgKi8KLSAgezgsMSxycixTLFYsMH0sCS8qIHNoZi50ICovCi0gIHszNSwyNCxycixWLFYsMH0sCS8qIHBsYy50LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDE4LHJyLFYsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixWLFYsMH0sCS8qIGVxLmQudCAqLwotICB7NDMsMTgscnIsVixWLDB9LAkvKiBuZWcucy50ICovCi0gIHs0MywxOSxycixWLFYsMH0sCS8qIG5lZy5kLnQgKi8KLSAgezM3LDE4LHJyLFMsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixTLFYsMH0sCS8qIGVxLmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NDAsMTgscnIsVixWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFYsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixWLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsVixWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezQwLDE4LHJyLFMsViwwfSwJLyogbGUucy50ICovCi0gIHs0MCwxOSxycixTLFYsMH0sCS8qIGxlLmQudCAqLwotICB7NDEsMTgscnIsUyxWLDB9LAkvKiBsdC5zLnQgKi8KLSAgezQxLDE5LHJyLFMsViwwfSwJLyogbHQuZC50ICovCi0gIHszNywyMCxycixWLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsVixWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFYsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixWLFYsMH0sCS8qIGVxLmwudCAqLwotICB7MzcsMjAscnIsUyxWLDB9LAkvKiBlcS5iLnQgKi8KLSAgezM3LDIxLHJyLFMsViwwfSwJLyogZXEuaC50ICovCi0gIHszNywyMixycixTLFYsMH0sCS8qIGVxLncudCAqLwotICB7MzcsMjMscnIsUyxWLDB9LAkvKiBlcS5sLnQgKi8KLSAgezQwLDIwLHJyLFYsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixWLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsVixWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFYsViwwfSwJLyogbGUubC50ICovCi0gIHs0MCwyMCxycixTLFYsMH0sCS8qIGxlLmIudCAqLwotICB7NDAsMjEscnIsUyxWLDB9LAkvKiBsZS5oLnQgKi8KLSAgezQwLDIyLHJyLFMsViwwfSwJLyogbGUudy50ICovCi0gIHs0MCwyMyxycixTLFYsMH0sCS8qIGxlLmwudCAqLwotICB7NDEsMjAscnIsVixWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFYsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixWLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsVixWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQxLDIwLHJyLFMsViwwfSwJLyogbHQuYi50ICovCi0gIHs0MSwyMSxycixTLFYsMH0sCS8qIGx0LmgudCAqLwotICB7NDEsMjIscnIsUyxWLDB9LAkvKiBsdC53LnQgKi8KLSAgezQxLDIzLHJyLFMsViwwfSwJLyogbHQubC50ICovCi0gIHs0MywyMCxycixWLFYsMH0sCS8qIG5lZy5iLnQgKi8KLSAgezQzLDIxLHJyLFYsViwwfSwJLyogbmVnLmgudCAqLwotICB7NDMsMjIscnIsVixWLDB9LAkvKiBuZWcudy50ICovCi0gIHs0MywyMyxycixWLFYsMH0sCS8qIG5lZy5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDRbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDVbXSA9IHsKLSAgezUxLDIwLHJyLFYsViwwfSwJLyogbGR2aS5iLnQgKi8KLSAgezUxLDIxLHJyLFYsViwwfSwJLyogbGR2aS5oLnQgKi8KLSAgezUxLDIyLHJyLFYsViwwfSwJLyogbGR2aS53LnQgKi8KLSAgezUxLDIzLHJyLFYsViwwfSwJLyogbGR2aS5sLnQgKi8KLSAgezI4LDE4LHJyLFYsViwwfSwJLyogY3Z0dy5zLnQgKi8KLSAgezMxLDIyLHJyLFYsViwwfSwJLyogY3Z0cy53LnQgKi8KLSAgezI4LDIzLHJyLFYsViwwfSwJLyogY3Z0dy5sLnQgKi8KLSAgezMzLDIyLHJyLFYsViwwfSwJLyogY3Z0bC53LnQgKi8KLSAgezUyLDIwLHJ4cixWLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsVixWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFYsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixWLFYsMH0sCS8qIHN0dmkubC50ICovCi0gIHs1MiwyMCxyeHIsUyxWLDB9LAkvKiBzdHZpLmIudCAqLwotICB7NTIsMjEscnhyLFMsViwwfSwJLyogc3R2aS5oLnQgKi8KLSAgezUyLDIyLHJ4cixTLFYsMH0sCS8qIHN0dmkudy50ICovCi0gIHs1MiwyMyxyeHIsUyxWLDB9LAkvKiBzdHZpLmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NltdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0N1tdID0gewotICB7ODQsMjAscixWLDAsMH0sCS8qIHN1bS5iLnQgKi8KLSAgezg0LDIxLHIsViwwLDB9LAkvKiBzdW0uaC50ICovCi0gIHs4NCwyMixyLFYsMCwwfSwJLyogc3VtLncudCAqLwotICB7ODQsMjMscixWLDAsMH0sCS8qIHN1bS5sLnQgKi8KLSAgezg1LDEscixWLDAsMH0sCS8qIGFsbC50ICovCi0gIHs4NiwxLHIsViwwLDB9LAkvKiBhbnkudCAqLwotICB7ODcsMSxyLFYsMCwwfSwJLyogcGFyaXR5LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDIwLHIsViwwLDB9LAkvKiBtYXguYi50ICovCi0gIHs4OCwyMSxyLFYsMCwwfSwJLyogbWF4LmgudCAqLwotICB7ODgsMjIscixWLDAsMH0sCS8qIG1heC53LnQgKi8KLSAgezg4LDIzLHIsViwwLDB9LAkvKiBtYXgubC50ICovCi0gIHs4OSwyMCxyLFYsMCwwfSwJLyogbWluLmIudCAqLwotICB7ODksMjEscixWLDAsMH0sCS8qIG1pbi5oLnQgKi8KLSAgezg5LDIyLHIsViwwLDB9LAkvKiBtaW4udy50ICovCi0gIHs4OSwyMyxyLFYsMCwwfSwJLyogbWluLmwudCAqLwotICB7ODQsMTgscixWLDAsMH0sCS8qIHN1bS5zLnQgKi8KLSAgezg0LDE5LHIsViwwLDB9LAkvKiBzdW0uZC50ICovCi0gIHs5MCwxOCxyLFYsMCwwfSwJLyogcHJvZC5zLnQgKi8KLSAgezkwLDE5LHIsViwwLDB9LAkvKiBwcm9kLmQudCAqLwotICB7ODgsMTgscixWLDAsMH0sCS8qIG1heC5zLnQgKi8KLSAgezg4LDE5LHIsViwwLDB9LAkvKiBtYXguZC50ICovCi0gIHs4OSwxOCxyLFYsMCwwfSwJLyogbWluLnMudCAqLwotICB7ODksMTkscixWLDAsMH0sCS8qIG1pbi5kLnQgKi8KLSAgezkwLDIwLHIsViwwLDB9LAkvKiBwcm9kLmIudCAqLwotICB7OTAsMjEscixWLDAsMH0sCS8qIHByb2QuaC50ICovCi0gIHs5MCwyMixyLFYsMCwwfSwJLyogcHJvZC53LnQgKi8KLSAgezkwLDIzLHIsViwwLDB9LAkvKiBwcm9kLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotY2hhciAqbG9wW10gPSB7Ci0gICJtb3YiLAkvKiAwICovCi0gICJtZXJnIiwJLyogMSAqLwotICAibWFzayIsCS8qIDIgKi8KLSAgIm11bCIsCS8qIDMgKi8KLSAgImRpdiIsCS8qIDQgKi8KLSAgImFuZCIsCS8qIDUgKi8KLSAgIm9yIiwJLyogNiAqLwotICAieG9yIiwJLyogNyAqLwotICAic2hmIiwJLyogOCAqLwotICAiYWRkIiwJLyogOSAqLwotICAic3ViIiwJLyogMTAgKi8KLSAgImV4aXQiLAkvKiAxMSAqLwotICAiam1wIiwJLyogMTIgKi8KLSAgImptcGkiLAkvKiAxMyAqLwotICAiam1wYSIsCS8qIDE0ICovCi0gICJqbXBzIiwJLyogMTUgKi8KLSAgInRhYyIsCS8qIDE2ICovCi0gICJsZGVhIiwJLyogMTcgKi8KLSAgImxkIiwJLyogMTggKi8KLSAgInRhcyIsCS8qIDE5ICovCi0gICJwc2hlYSIsCS8qIDIwICovCi0gICJzdCIsCS8qIDIxICovCi0gICJjYWxsIiwJLyogMjIgKi8KLSAgImNhbGxzIiwJLyogMjMgKi8KLSAgImNhbGxxIiwJLyogMjQgKi8KLSAgInBmb3JrIiwJLyogMjUgKi8KLSAgInN0ZSIsCS8qIDI2ICovCi0gICJpbmNyIiwJLyogMjcgKi8KLSAgImN2dHciLAkvKiAyOCAqLwotICAiY3Z0YiIsCS8qIDI5ICovCi0gICJjdnRoIiwJLyogMzAgKi8KLSAgImN2dHMiLAkvKiAzMSAqLwotICAiY3Z0ZCIsCS8qIDMyICovCi0gICJjdnRsIiwJLyogMzMgKi8KLSAgImxkcGEiLAkvKiAzNCAqLwotICAicGxjIiwJLyogMzUgKi8KLSAgInR6YyIsCS8qIDM2ICovCi0gICJlcSIsCS8qIDM3ICovCi0gICJsZXUiLAkvKiAzOCAqLwotICAibHR1IiwJLyogMzkgKi8KLSAgImxlIiwJLyogNDAgKi8KLSAgImx0IiwJLyogNDEgKi8KLSAgIm5vdCIsCS8qIDQyICovCi0gICJuZWciLAkvKiA0MyAqLwotICAibG9wIiwJLyogNDQgKi8KLSAgImNwcnMiLAkvKiA0NSAqLwotICAibm9wIiwJLyogNDYgKi8KLSAgImJyIiwJLyogNDcgKi8KLSAgImJyaSIsCS8qIDQ4ICovCi0gICJicmEiLAkvKiA0OSAqLwotICAiYnJzIiwJLyogNTAgKi8KLSAgImxkdmkiLAkvKiA1MSAqLwotICAic3R2aSIsCS8qIDUyICovCi0gICJsZHNkciIsCS8qIDUzICovCi0gICJsZGtkciIsCS8qIDU0ICovCi0gICJsbiIsCS8qIDU1ICovCi0gICJwYXR1IiwJLyogNTYgKi8KLSAgInBhdGUiLAkvKiA1NyAqLwotICAicGljaCIsCS8qIDU4ICovCi0gICJwbGNoIiwJLyogNTkgKi8KLSAgImlkbGUiLAkvKiA2MCAqLwotICAicnRucSIsCS8qIDYxICovCi0gICJjZm9yayIsCS8qIDYyICovCi0gICJydG4iLAkvKiA2MyAqLwotICAid2ZvcmsiLAkvKiA2NCAqLwotICAiam9pbiIsCS8qIDY1ICovCi0gICJydG5jIiwJLyogNjYgKi8KLSAgImV4cCIsCS8qIDY3ICovCi0gICJzaW4iLAkvKiA2OCAqLwotICAiY29zIiwJLyogNjkgKi8KLSAgInBzaCIsCS8qIDcwICovCi0gICJwb3AiLAkvKiA3MSAqLwotICAiZW5pIiwJLyogNzIgKi8KLSAgImRzaSIsCS8qIDczICovCi0gICJia3B0IiwJLyogNzQgKi8KLSAgIm1zeW5jIiwJLyogNzUgKi8KLSAgIm1za2kiLAkvKiA3NiAqLwotICAieG10aSIsCS8qIDc3ICovCi0gICJ0c3R2diIsCS8qIDc4ICovCi0gICJkaWFnIiwJLyogNzkgKi8KLSAgInBia3B0IiwJLyogODAgKi8KLSAgInNxcnQiLAkvKiA4MSAqLwotICAiY2FzciIsCS8qIDgyICovCi0gICJhdGFuIiwJLyogODMgKi8KLSAgInN1bSIsCS8qIDg0ICovCi0gICJhbGwiLAkvKiA4NSAqLwotICAiYW55IiwJLyogODYgKi8KLSAgInBhcml0eSIsCS8qIDg3ICovCi0gICJtYXgiLAkvKiA4OCAqLwotICAibWluIiwJLyogODkgKi8KLSAgInByb2QiLAkvKiA5MCAqLwotICAiaGFsdCIsCS8qIDkxICovCi0gICJzeXNjIiwJLyogOTIgKi8KLSAgInRyYXAiLAkvKiA5MyAqLwotICAidHN0IiwJLyogOTQgKi8KLSAgImxjayIsCS8qIDk1ICovCi0gICJ1bGsiLAkvKiA5NiAqLwotICAic3Bhd24iLAkvKiA5NyAqLwotICAibGRjbXIiLAkvKiA5OCAqLwotICAic3RjbXIiLAkvKiA5OSAqLwotICAicG9wciIsCS8qIDEwMCAqLwotICAicHNociIsCS8qIDEwMSAqLwotICAicmN2ciIsCS8qIDEwMiAqLwotICAibWF0bSIsCS8qIDEwMyAqLwotICAic25kciIsCS8qIDEwNCAqLwotICAicHV0ciIsCS8qIDEwNSAqLwotICAiZ2V0ciIsCS8qIDEwNiAqLwotICAibWF0ciIsCS8qIDEwNyAqLwotICAibWF0IiwJLyogMTA4ICovCi0gICJnZXQiLAkvKiAxMDkgKi8KLSAgInJjdiIsCS8qIDExMCAqLwotICAiaW5jIiwJLyogMTExICovCi0gICJwdXQiLAkvKiAxMTIgKi8KLSAgInNuZCIsCS8qIDExMyAqLwotICAiZW5hbCIsCS8qIDExNCAqLwotICAiZW5hZyIsCS8qIDExNSAqLwotICAiZnJpbnQiLAkvKiAxMTYgKi8KLSAgInhwbmQiLAkvKiAxMTcgKi8KLSAgImN0cnNsIiwJLyogMTE4ICovCi0gICJjdHJzZyIsCS8qIDExOSAqLwotICAic3RvcCIsCS8qIDEyMCAqLwotfTsKLQotY2hhciAqcm9wW10gPSB7Ci0gICIiLAkvKiAwICovCi0gICIudCIsCS8qIDEgKi8KLSAgIi5mIiwJLyogMiAqLwotICAiLnMiLAkvKiAzICovCi0gICIuZCIsCS8qIDQgKi8KLSAgIi5iIiwJLyogNSAqLwotICAiLmgiLAkvKiA2ICovCi0gICIudyIsCS8qIDcgKi8KLSAgIi5sIiwJLyogOCAqLwotICAiLngiLAkvKiA5ICovCi0gICIudSIsCS8qIDEwICovCi0gICIucy5mIiwJLyogMTEgKi8KLSAgIi5kLmYiLAkvKiAxMiAqLwotICAiLmIuZiIsCS8qIDEzICovCi0gICIuaC5mIiwJLyogMTQgKi8KLSAgIi53LmYiLAkvKiAxNSAqLwotICAiLmwuZiIsCS8qIDE2ICovCi0gICIudC5mIiwJLyogMTcgKi8KLSAgIi5zLnQiLAkvKiAxOCAqLwotICAiLmQudCIsCS8qIDE5ICovCi0gICIuYi50IiwJLyogMjAgKi8KLSAgIi5oLnQiLAkvKiAyMSAqLwotICAiLncudCIsCS8qIDIyICovCi0gICIubC50IiwJLyogMjMgKi8KLSAgIi50LnQiLAkvKiAyNCAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiZDllZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMTBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQxMFZfSAotI2RlZmluZSBEMTBWX0gKLQotLyogRm9ybWF0IFNwZWNpZmllciAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDQwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMAotI2RlZmluZSBGTTExCTB4QzAwMDAwMDAKLQotI2RlZmluZSBOT1AgMHg1ZTAwCi0jZGVmaW5lIE9QQ09ERV9ESVZTCTB4MTQwMDI4MDAKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgZDEwdl9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiB0aGUgb3Bjb2RlIGZvcm1hdCAqLwotICBpbnQgZm9ybWF0OwotCi0gIC8qIFRoZXNlIG51bWJlcnMgd2VyZSBwaWNrZWQgc28gd2UgY2FuIGRvIGlmKCBpICYgU0hPUlRfT1BDT0RFKSAqLwotI2RlZmluZSBTSE9SVF9PUENPREUgMQotI2RlZmluZSBMT05HX09QQ09ERSAgOAotI2RlZmluZSBTSE9SVF8yCSAgICAgMQkJLyogc2hvcnQgd2l0aCAyIG9wZXJhbmRzICovCi0jZGVmaW5lIFNIT1JUX0IJICAgICAzCQkvKiBzaG9ydCB3aXRoIDgtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0IJICAgICA4CQkvKiBsb25nIHdpdGggMTYtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0wgICAgICAgMTAJCS8qIGxvbmcgd2l0aCAzIG9wZXJhbmRzICovCi0jZGVmaW5lIExPTkdfUiAgICAgICAxMgkJLyogcmVzZXJ2ZWQgKi8KLQotICAvKiBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCBpbnN0cnVjdGlvbnMgKi8KLSAgLyogZm9yIGV4YW1wbGUsICJicmEiIHdpbGwgYmUgYSBmYWtlIGZvciAiYnJhLnMiIGFuZCBicmEubCIgKi8KLSAgLyogd2hpY2ggd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0jZGVmaW5lIE9QQ09ERV9GQUtFICAzMgotCi0gIC8qIHRoZSBudW1iZXIgb2YgY3ljbGVzICovCi0gIGludCBjeWNsZXM7Ci0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBCT1RICTMKLQotICAvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCAqLwotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGludCBleGVjX3R5cGU7Ci0jZGVmaW5lIFBBUk9OTFkgMQkvKiBwYXJhbGxlbCBvbmx5ICovCi0jZGVmaW5lIFNFUQkyCS8qIG11c3QgYmUgc2VxdWVudGlhbCAqLwotI2RlZmluZSBQQVIJNAkvKiBtYXkgYmUgcGFyYWxsZWwgKi8KLSNkZWZpbmUgQlJBTkNIX0xJTksgOAkvKiBzdWJyb3V0aW5lIGNhbGwuICBtdXN0IGJlIGFsaWduZWQgKi8KLSNkZWZpbmUgUk1FTSAgICAgMTYJLyogcmVhZHMgbWVtb3J5ICovCi0jZGVmaW5lIFdNRU0gICAgIDMyCS8qIHdyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgUkYwICAgICAgNjQJLyogcmVhZHMgZjAgKi8KLSNkZWZpbmUgV0YwICAgICAxMjgJLyogbW9kaWZpZXMgZjAgKi8KLSNkZWZpbmUgV0NBUiAgICAyNTYJLyogd3JpdGUgQ2FycnkgKi8KLSNkZWZpbmUgQlJBTkNIICA1MTIJLyogYnJhbmNoLCBubyBsaW5rICovCi0jZGVmaW5lIEFMT05FICAxMDI0CS8qIHNob3J0IGJ1dCBwYWNrIHdpdGggYSBOT1AgaWYgb24gYXNtIGxpbmUgYWxvbmUgKi8KLQotICAvKiB0aGUgb3Bjb2RlICovCi0gIGxvbmcgb3Bjb2RlOwotCi0gIC8qIG1hc2suICBpZiggKGkgJiBtYXNrKSA9PSBvcGNvZGUgKSB0aGVuIG1hdGNoICovCi0gIGxvbmcgbWFzazsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzZdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgZDEwdl9udW1fb3Bjb2RlczsKLQotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotc3RydWN0IGQxMHZfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIGQxMHZfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotCi0vKiB0aGUgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfRVZFTgkoMSkKLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfT0RECSgyKQkKLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoNCkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoOCkKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDB4MTApCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSgweDIwKQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHg0MCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDgwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHgxMDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgMCAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzAJKDB4NDAwKQotCi0vKiBhY2N1bXVsYXRvciAxICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDMQkoMHg4MDApCi0KLS8qIGYwIC8gZjEgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0ZGTEFHCSgweDEwMDApCi0KLS8qIGMgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0NGTEFHCSgweDIwMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHg0MDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHg4MDAwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDEwMDAwKQotCi0vKiBzcGVjaWFsIGFjY3VtdWxhdG9yIHNoaWZ0cyBuZWVkIGEgNC1iaXQgbnVtYmVyICovCi0vKiAxIDw9IHggPD0gMTYgKi8KLSNkZWZpbmUgT1BFUkFORF9TSElGVAkoMHgyMDAwMCkKLQotLyogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfR1BSCSgweDQwMDAwKQotCi0vKiBzcGVjaWFsIGltbTMgdmFsdWVzIHdpdGggcmFuZ2UgcmVzdHJpY3RlZCB0byAtMiA8PSBpbW0zIDw9IDMgKi8KLS8qIG5lZWRlZCBmb3IgcmFjL3JhY2hpICovCi0jZGVmaW5lIFJFU1RSSUNURURfTlVNMwkoMHg4MDAwMCkKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgY2hhciAqcG5hbWU7CQkvKiBuYW1lIHRvIHByaW50IGZvciB0aGlzIHJlZ2lzdGVyICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXTsKLWludCBkMTB2X3JlZ19uYW1lX2NudCgpOwotCi0vKiBhbiBleHByZXNzaW9uUyBvbmx5IGhhcyBvbmUgcmVnaXN0ZXIgdHlwZSwgc28gd2UgZmFrZSBpdCAqLwotLyogYnkgc2V0dGluZyBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgdHlwZSAqLwotI2RlZmluZSBSRUdJU1RFUl9NQVNLCTB4RkYKLQotI2VuZGlmIC8qIEQxMFZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvZDMwdi5oIGIvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTBiN2E0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKiBkMzB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIEQzMFYgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU29sdXRpb25zCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRDMwVl9ICi0jZGVmaW5lIEQzMFZfSAotCi0jZGVmaW5lIE5PUCAweDAwRjAwMDAwCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGNoYXIgKnBuYW1lOwkJLyogbmFtZSB0byBwcmludCBmb3IgdGhpcyByZWdpc3RlciAqLwotICBpbnQgdmFsdWU7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXTsKLWludCByZWdfbmFtZV9jbnQoKTsKLQotLyogdGhlIG51bWJlciBvZiBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBNQVhfQ09OVFJPTF9SRUcJNjQKLQotLyogZGVmaW5lIHRoZSBmb3JtYXQgc3BlY2lmaWVycyAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDgwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMDAwMDAwMDAwTEwKLSNkZWZpbmUgRk0xMQkweDgwMDAwMDAwODAwMDAwMDBMTAotCi0vKiBkZWZpbmUgdGhlIG9wY29kZSBjbGFzc2VzICovCi0jZGVmaW5lIEJSQQkwCi0jZGVmaW5lIExPR0lDCTEKLSNkZWZpbmUgSU1FTQkyCi0jZGVmaW5lIElBTFUxCTQKLSNkZWZpbmUgSUFMVTIJNQotCi0vKiBkZWZpbmUgdGhlIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZXMgKi8KLSNkZWZpbmUgRUNDX0FMCTAJLyogQUx3YXlzIChkZWZhdWx0KSAqLwotI2RlZmluZSBFQ0NfVFgJMQkvKiBGMD1UcnVlLCBGMT1Eb24ndCBjYXJlICovCi0jZGVmaW5lIEVDQ19GWAkyCS8qIEYwPUZhbHNlLCBGMT1Eb24ndCBjYXJlICovCi0jZGVmaW5lIEVDQ19YVAkzCS8qIEYwPURvbid0IGNhcmUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1hGCTQJLyogRjA9RG9uJ3QgY2FyZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1RUCTUJLyogRjA9VHJ1ZSwgRjE9VHJ1ZSAqLwotI2RlZmluZSBFQ0NfVEYJNgkvKiBGMD1UcnVlLCBGMT1GYWxzZSAqLwotI2RlZmluZSBFQ0NfUkVTRVJWRUQJNwkvKiByZXNlcnZlZCAqLwotI2RlZmluZSBFQ0NfTUFYCUVDQ19SRVNFUlZFRAotCi1leHRlcm4gY29uc3QgY2hhciAqZDMwdl9lY2NfbmFtZXNbXTsKLQotLyogY29uZGl0aW9uIGNvZGUgdGFibGUgZm9yIENNUCBhbmQgQ01QVSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfY2NfbmFtZXNbXTsKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9vcGNvZGUuICAqLwotc3RydWN0IGQzMHZfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogdGhlIG9wY29kZSAqLwotICBpbnQgb3AxOwkvKiBmaXJzdCBwYXJ0LCAiSUFMVTEiIGZvciBleGFtcGxlICovCi0gIGludCBvcDI7CS8qIHRoZSByZXN0IG9mIHRoZSBvcGNvZGUgKi8KLQotICAvKiBvcGNvZGUgZm9ybWF0KHMpLiAgVGhlc2UgbnVtYmVycyBjb3JyZXNwb25kIHRvIGVudHJpZXMgKi8KLSAgLyogaW4gdGhlIGQzMHZfZm9ybWF0X3RhYmxlICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0WzRdOwotCi0jZGVmaW5lIFNIT1JUX00JCTEKLSNkZWZpbmUgU0hPUlRfTTIJNQkvKiBmb3IgbGQydyBhbmQgc3QydyAqLwotI2RlZmluZSBTSE9SVF9BCQk5Ci0jZGVmaW5lIFNIT1JUX0IxCTExCi0jZGVmaW5lIFNIT1JUX0IyCTEyCi0jZGVmaW5lIFNIT1JUX0IyciAgICAgMTMKLSNkZWZpbmUgU0hPUlRfQjMgICAgICAxNAotI2RlZmluZSBTSE9SVF9CM3IgICAgIDE2Ci0jZGVmaW5lIFNIT1JUX0IzYiAgICAgMTgKLSNkZWZpbmUgU0hPUlRfQjNiciAgICAyMAotI2RlZmluZSBTSE9SVF9EMXIgICAgIDIyCi0jZGVmaW5lIFNIT1JUX0QyICAgICAgMjQKLSNkZWZpbmUgU0hPUlRfRDJyICAgICAyNgotI2RlZmluZSBTSE9SVF9EMkJyICAgIDI4Ci0jZGVmaW5lIFNIT1JUX1UgICAgICAgMzAgICAgICAvKiB1bmFyeSBTSE9SVF9BLiAgQUJTIGZvciBleGFtcGxlICovCi0jZGVmaW5lIFNIT1JUX0YgICAgICAgMzEgICAgICAvKiBTSE9SVF9BIHdpdGggZmxhZyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgU0hPUlRfQUYgICAgICAzMyAgICAgIC8qIFNIT1JUX0Egd2l0aCBvbmx5IHRoZSBmaXJzdCByZWdpc3RlciBhIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0hPUlRfVCAgICAgICAzNSAgICAgIC8qIGZvciB0cmFwIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFNIT1JUX0E1ICAgICAgMzYgICAgICAvKiBTSE9SVF9BIHdpdGggYSA1LWJpdCBpbW1lZGlhdGUgaW5zdGVhZCBvZiA2ICovCi0jZGVmaW5lIFNIT1JUX0NNUCAgICAgMzggICAgICAvKiBzcGVjaWFsIGZvcm0gZm9yIENNUGNjICovCi0jZGVmaW5lIFNIT1JUX0NNUFUgICAgNDAgICAgICAvKiBzcGVjaWFsIGZvcm0gZm9yIENNUFVjYyAqLwotI2RlZmluZSBTSE9SVF9BMSAgICAgIDQyICAgICAgLyogc3BlY2lhbCBmb3JtIG9mIFNIT1JUX0EgZm9yIE1BQ2Egb3Bjb2RlcyB3aGVyZSBhPTEgKi8KLSNkZWZpbmUgU0hPUlRfQUEgICAgICA0NCAgICAgIC8qIFNIT1JUX0Egd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfUkEgICAgICA0NiAgICAgIC8qIFNIT1JUX0Egd2l0aCB0aGUgc2Vjb25kIHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNIT1JUX01PRElOQyAgNDggICAgICAKLSNkZWZpbmUgU0hPUlRfTU9EREVDICA0OQotI2RlZmluZSBTSE9SVF9DMSAgICAgIDUwCi0jZGVmaW5lIFNIT1JUX0MyICAgICAgNTEKLSNkZWZpbmUgU0hPUlRfVUYgICAgICA1MgotI2RlZmluZSBTSE9SVF9BMiAgICAgIDUzCi0jZGVmaW5lIFNIT1JUX05PTkUgICAgNTUgICAgICAvKiBubyBvcGVyYW5kcyAqLwotI2RlZmluZSBTSE9SVF9BUiAgICAgIDU2ICAgICAgLyogbGlrZSBTSE9SVF9BQSBidXQgb25seSBhY2NlcHQgcmVnaXN0ZXIgYXMgdGhpcmQgcGFyYW1ldGVyICAqLwotI2RlZmluZSBMT05HICAgICAgICAgIDU3Ci0jZGVmaW5lIExPTkdfVSAgICAgICAgNTggICAgICAvKiB1bmFyeSBMT05HICovCi0jZGVmaW5lIExPTkdfVXIgICAgICAgNTkgICAgICAvKiBMT05HIHBjLXJlbGF0aXZlICovCi0jZGVmaW5lIExPTkdfQ01QICAgICAgNjAgICAgICAvKiBzcGVjaWFsIGZvcm0gZm9yIENNUGNjIGFuZCBDTVBVY2MgKi8KLSNkZWZpbmUgTE9OR19NICAgICAgICA2MSAgICAgIC8qIE1lbW9yeSBsb25nIGZvciBsZGIsIHN0YiAqLwotI2RlZmluZSBMT05HX00yICAgICAgIDYyICAgICAgLyogTWVtb3J5IGxvbmcgZm9yIGxkMncsIHN0MncgKi8KLSNkZWZpbmUgTE9OR18yICAgICAgICA2MyAgICAgIC8qIExPTkcgd2l0aCAyIG9wZXJhbmRzOyBqbXB0bnogKi8KLSNkZWZpbmUgTE9OR18yciAgICAgICA2NCAgICAgIC8qIExPTkcgd2l0aCAyIG9wZXJhbmRzOyBicmF0bnogKi8KLSNkZWZpbmUgTE9OR18yYiAgICAgICA2NSAgICAgIC8qIExPTkdfMiB3aXRoIG1vZGlmaWVyIG9mIDMgKi8KLSNkZWZpbmUgTE9OR18yYnIgICAgICA2NiAgICAgIC8qIExPTkdfMnIgd2l0aCBtb2RpZmllciBvZiAzICovCi0jZGVmaW5lIExPTkdfRCAgICAgICAgNjcgICAgICAvKiBmb3IgREpNUEkgKi8KLSNkZWZpbmUgTE9OR19EciAgICAgICA2OCAgICAgIC8qIGZvciBEQlJBSSAqLwotI2RlZmluZSBMT05HX0RiciAgICAgIDY5ICAgICAgLyogZm9yIHJlcGVhdGkgKi8KLQotICAvKiB0aGUgZXhlY3V0aW9uIHVuaXQocykgdXNlZCAqLwotICBpbnQgdW5pdDsKLSNkZWZpbmUgRUlUSEVSCTAKLSNkZWZpbmUgSVUJMQotI2RlZmluZSBNVQkyCi0jZGVmaW5lIEVJVEhFUl9CVVRfUFJFRkVSX01VIDMKLQotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGxvbmcgZmxhZ3NfdXNlZDsKLSAgbG9uZyBmbGFnc19zZXQ7Ci0jZGVmaW5lIEZMQUdfMAkJKDFMPDwwKQotI2RlZmluZSBGTEFHXzEJCSgxTDw8MSkKLSNkZWZpbmUgRkxBR18yCQkoMUw8PDIpCi0jZGVmaW5lIEZMQUdfMwkJKDFMPDwzKQotI2RlZmluZSBGTEFHXzQJCSgxTDw8NCkJCS8qIFMgKHNhdHVyYXRpb24pICovCi0jZGVmaW5lIEZMQUdfNQkJKDFMPDw1KQkJLyogViAob3ZlcmZsb3cpICovCi0jZGVmaW5lIEZMQUdfNgkJKDFMPDw2KQkJLyogVkEgKGFjY3VtdWxhdGVkIG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzcJCSgxTDw8NykJCS8qIEMgKGNhcnJ5L2JvcnJvdykgKi8KLSNkZWZpbmUgRkxBR19TTQkJKDFMPDw4KQkJLyogU00gKHN0YWNrIG1vZGUpICovCi0jZGVmaW5lIEZMQUdfUlAJCSgxTDw8OSkJCS8qIFJQIChyZXBlYXQgZW5hYmxlKSAqLwotI2RlZmluZSBGTEFHX0NPTlRST0wJKDFMPDwxMCkJLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRkxBR19BMAkJKDFMPDwxMSkJLyogQTAgKi8KLSNkZWZpbmUgRkxBR19BMQkJKDFMPDwxMikJLyogQTEgKi8KLSNkZWZpbmUgRkxBR19KTVAJKDFMPDwxMykJLyogaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggKi8KLSNkZWZpbmUgRkxBR19KU1IJKDFMPDwxNCkJLyogc3Vicm91dGluZSBjYWxsLiAgbXVzdCBiZSBhbGlnbmVkICovCi0jZGVmaW5lIEZMQUdfTUVNCSgxTDw8MTUpCS8qIHJlYWRzL3dyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAJICgxTDw8MTYpIC8qIE9sZCBtZWFuaW5nOiBhIDIgd29yZCA0IGJ5dGVyIG9wZXJhdGlvbgotCQkJCQkgICBOZXcgbWVhbmluZzogb3BlcmF0aW9uIGNhbm5vdCBiZSAKLQkJCQkJICAgY29tYmluZWQgaW4gcGFyYWxsZWwgd2l0aCBBREQvU1VCcHBwLiAqLwotI2RlZmluZSBGTEFHX01VTDE2CSgxTDw8MTcpCS8qIDE2IGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX01VTDMyCSgxTDw8MTgpCS8qIDMyIGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX0FERFNVQnBwcAkoMUw8PDE5KQkvKiBBRERwcHAgb3IgU1VCcHBwICovCi0jZGVmaW5lIEZMQUdfREVMQVkJKDFMPDwyMCkJLyogVGhpcyBpcyBhIGRlbGF5ZWQgYnJhbmNoIG9yIGp1bXAgKi8KLSNkZWZpbmUgRkxBR19MS1IJKDFMPDwyMSkJLyogaW5zbiBpbiBsZWZ0IHNsb3Qga2lsbHMgcmlnaHQgc2xvdCAqLwotI2RlZmluZSBGTEFHX0NWVkEJKEZMQUdfNXxGTEFHXzZ8RkxBR183KQotI2RlZmluZSBGTEFHX0MJCUZMQUdfNwotI2RlZmluZSBGTEFHX0FMTAkoRkxBR18wIHwgXAotCQkJIEZMQUdfMSB8IFwKLQkJCSBGTEFHXzIgfCBcCi0JCQkgRkxBR18zIHwgXAotCQkJIEZMQUdfNCB8IFwKLQkJCSBGTEFHXzUgfCBcCi0JCQkgRkxBR182IHwgXAotCQkJIEZMQUdfNyB8IFwKLQkJCSBGTEFHX1NNIHwgXAotCQkJIEZMQUdfUlAgfCBcCi0JCQkgRkxBR19DT05UUk9MKQotCi0gIGludCByZWxvY19mbGFnOwotI2RlZmluZSBSRUxPQ19QQ1JFTAkxCi0jZGVmaW5lIFJFTE9DX0FCUwkyCi19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW107Ci1leHRlcm4gY29uc3QgaW50IGQzMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMzB2X29wZXJhbmQKLXsKLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgKi8KLSAgaW50IGxlbmd0aDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBwb3NpdGlvbiByZWxhdGl2ZSB0byBSYSAqLwotICBpbnQgcG9zaXRpb247Ci0KLSAgLyogc3ludGF4IGZsYWdzLiAgKi8KLSAgbG9uZyBmbGFnczsKLX07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMzB2X29wZXJhbmQuICAqLwotCi0vKiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjsgaXQgd2lsbCBiZSBtb2RpZmllZCAqLwotLyogdGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9ERVNUCSgxKQotCi0vKiBudW1iZXIgb3Igc3ltYm9sICovCi0jZGVmaW5lIE9QRVJBTkRfTlVNCSgyKQotCi0vKiBhZGRyZXNzIG9yIGxhYmVsICovCi0jZGVmaW5lIE9QRVJBTkRfQUREUgkoNCkKLQotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9SRUcJKDgpCi0KLS8qIHBvc3RpbmNyZW1lbnQgKyAgKi8KLSNkZWZpbmUgT1BFUkFORF9QTFVTCSgweDEwKQotCi0vKiBwb3N0ZGVjcmVtZW50IC0gICovCi0jZGVmaW5lIE9QRVJBTkRfTUlOVVMJKDB4MjApCi0KLS8qIHNpZ25lZCBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9TSUdORUQJKDB4NDApCi0KLS8qIHRoaXMgb3BlcmFuZCBtdXN0IGJlIHNoaWZ0ZWQgbGVmdCBieSAzICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4ODApCi0KLS8qIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GTEFHCSgweDEwMCkKLQotLyogY29udHJvbCByZWdpc3RlciAgKi8KLSNkZWZpbmUgT1BFUkFORF9DT05UUk9MCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MJKDB4NDAwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHg4MDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDEwMDApCi0KLS8qIHByZWRlY3JlbWVudCBtb2RlICdALXNwJyAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVE1JTlVTCSgweDIwMDApCi0KLS8qIHRoaXMgb3BlcmFuZCBjaGFuZ2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lICovCi0vKiBmb3IgZXhhbXBsZSwgQ1BNY2MsIENNUFVjYyAqLwotI2RlZmluZSBPUEVSQU5EX05BTUUJKDB4NDAwMCkKLQotLyogZmFrZSBvcGVyYW5kIGZvciBtdnRzeXMgYW5kIG12ZnN5cyAqLwotI2RlZmluZSBPUEVSQU5EX1NQRUNJQUwJKDB4ODAwMCkKLQotLyogbGV0IHRoZSBvcHRpbWl6ZXIga25vdyB0aGF0IHR3byByZWdpc3RlcnMgYXJlIGFmZmVjdGVkICovCi0jZGVmaW5lIE9QRVJBTkRfMlJFRwkoMHgxMDAwMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIHBjLXJlbGF0aXZlLiAgTm90ZSB0aGF0IHJlcGVhdGkgY2FuIGhhdmUgdHdvIGltbWVkaWF0ZQotICAgb3BlcmFuZHMsIG9uZSBvZiB3aGljaCBpcyBwY3JlbCwgdGhlIG90aGVyICh0aGUgSU1NNlUgb25lKSBpcyBub3QuICAqLwotI2RlZmluZSBPUEVSQU5EX1BDUkVMCSgweDIwMDAwKQotCi0vKiBUaGUgZm9ybWF0IHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMzB2X2Zvcm1hdC4gICovCi1zdHJ1Y3QgZDMwdl9mb3JtYXQKLXsKLSAgaW50CWZvcm07CQkvKiBTSE9SVF9BLCBMT05HLCBldGMgKi8KLSAgaW50CW1vZGlmaWVyOwkvKiB0d28gYml0IG1vZGlmaWVyIGZvbGxvd2luZyBvcGNvZGUgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s1XTsKLX07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfZm9ybWF0IGQzMHZfZm9ybWF0X3RhYmxlW107Ci0KLQotLyogYW4gaW5zdHJ1Y3Rpb24gaXMgZGVmaW5lZCBieSBhbiBvcGNvZGUgYW5kIGEgZm9ybWF0ICovCi0vKiBmb3IgZXhhbXBsZSwgImFkZCIgaGFzIG9uZSBvcGNvZGUsIGJ1dCB0aHJlZSBkaWZmZXJlbnQgKi8KLS8qIGZvcm1hdHMsIDIgU0hPUlRfQSBmb3JtcyBhbmQgYSBMT05HIGZvcm0uICovCi1zdHJ1Y3QgZDMwdl9pbnNuCi17Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3A7CS8qIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSAqLwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm07CS8qIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZvcm1hdCB0YWJsZSAqLwotICBpbnQgZWNjOwkJCS8qIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZSAqLwotfTsKLQotLyogYW4gZXhwcmVzc2lvblMgb25seSBoYXMgb25lIHJlZ2lzdGVyIHR5cGUsIHNvIHdlIGZha2UgaXQgKi8KLS8qIGJ5IHNldHRpbmcgaGlnaCBiaXRzIHRvIGluZGljYXRlIHR5cGUgKi8KLSNkZWZpbmUgUkVHSVNURVJfTUFTSwkweEZGCi0KLSNlbmRpZiAvKiBEMzBWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmggYi9pbmNsdWRlL29wY29kZS9oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVmNzM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgSDgtMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbS4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIERlYnVnZ2VyIGFuZCBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgYXMgYSBzZXF1ZW5jZSBvZiBuaWJibGVzLgotICAgSWYgdGhlIG5pYmJsZSBoYXMgdmFsdWUgMTUgb3IgbGVzcyB0aGVuIHRoZSByZXByZXNlbnRhdGlvbiBpcyBjb21wbGV0ZS4KLSAgIE90aGVyd2lzZSwgd2UgcmVjb3JkIHdoYXQgaXQgY29udGFpbnMgd2l0aCBzZXZlcmFsIGZsYWdzLiAgKi8KLQotdHlwZWRlZiBpbnQgb3BfdHlwZTsKLQotI2RlZmluZSBIZXgwCTAKLSNkZWZpbmUgSGV4MSAJMQotI2RlZmluZSBIZXgyIAkyCi0jZGVmaW5lIEhleDMgCTMKLSNkZWZpbmUgSGV4NCAJNAotI2RlZmluZSBIZXg1IAk1Ci0jZGVmaW5lIEhleDYgCTYKLSNkZWZpbmUgSGV4NyAJNwotI2RlZmluZSBIZXg4IAk4Ci0jZGVmaW5lIEhleDkgCTkKLSNkZWZpbmUgSGV4QSAJMTAKLSNkZWZpbmUgSGV4QiAJMTEKLSNkZWZpbmUgSGV4QyAJMTIKLSNkZWZpbmUgSGV4RCAJMTMKLSNkZWZpbmUgSGV4RSAJMTQKLSNkZWZpbmUgSGV4RiAJMTUKLQotI2RlZmluZSBMXzgJCTB4MDEKLSNkZWZpbmUgTF8xNgkJMHgwMgotI2RlZmluZSBMXzMyCQkweDA0Ci0jZGVmaW5lIExfUCAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIExfMjQJCTB4MTAKLSNkZWZpbmUgTUVNUkVMQVggCTB4MjAJCQkvKiBtb3ZlIGluc24gd2hpY2ggbWF5IHJlbGF4ICovIAotI2RlZmluZSBTUkMgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBEU1QgICAgICAgICAgICAgMHg4MAotCi0jZGVmaW5lIFJFRwkJMHgxMDAKLSNkZWZpbmUgRVhSCQkweDIwMAotI2RlZmluZSBNQUNSRUcJCTB4ODAwCi0jZGVmaW5lIFNSQ19JTl9EU1QJMHg0MDAKLSNkZWZpbmUgSU1NCQkweDEwMDAKLSNkZWZpbmUgRElTUAkJMHgyMDAwCi0jZGVmaW5lIElORAkJMHg0MDAwCi0jZGVmaW5lIElOQwkJMHg4MDAwCi0jZGVmaW5lIERFQwkJMHgxMDAwMAotI2RlZmluZSBMXzMJCTB4MjAwMDAKLSNkZWZpbmUgS0JJVCAJCTB4NDAwMDAKLSNkZWZpbmUgREJJVCAgICAgICAgICAgIDB4ODAwMDAKLSNkZWZpbmUgRElTUFJFRyAgICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIElHTk9SRSAJCTB4MjAwMDAwCi0jZGVmaW5lIEUgICAgICAJCTB4NDAwMDAwCQkvKiBGSVhNRTogZW5kIG9mIG5pYmJsZSBzZXF1ZW5jZT8gKi8KLSNkZWZpbmUgTF8yCQkweDgwMDAwMAotI2RlZmluZSBCMzAgIAkJMHgxMDAwMDAwIAkJLyogYml0IDMgbXVzdCBiZSBsb3cgKi8KLSNkZWZpbmUgQjMxICAJCTB4MjAwMDAwMAkJLyogYml0IDMgbXVzdCBiZSBoaWdoICovCi0jZGVmaW5lIENDUgkJMHg0MDAwMDAwCi0jZGVmaW5lIEFCUyAgICAgICAgICAgICAweDgwMDAwMDAKLSNkZWZpbmUgQUJTSk1QCQkweDEwMDAwMDAwICAKLSNkZWZpbmUgQUJTOE1FTSAgICAgICAgIDB4MjAwMDAwMDAJCi0jZGVmaW5lIFBDUkVMICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIE1FTUlORCAgICAgICAgICAweDgwMDAwMDAwCi0KLSNkZWZpbmUgSU1NMyAJCUlNTXxMXzMKLSNkZWZpbmUgSU1NMiAJCUlNTXxMXzIKLQotI2RlZmluZSBTSVpFCQkoTF8yfExfM3xMXzh8TF8xNnxMXzMyfExfUHxMXzI0KQotI2RlZmluZSBNT0RFCQkoUkVHfElNTXxESVNQfElORHxJTkN8REVDfENDUnxBQlN8TUVNSU5EfEVYUikKLQotI2RlZmluZSBSRDggCQkoRFNUfExfOHxSRUcpCi0jZGVmaW5lIFJEMTYgCQkoRFNUfExfMTZ8UkVHKQotI2RlZmluZSBSRDMyIAkJKERTVHxMXzMyfFJFRykKLSNkZWZpbmUgUlM4IAkJKFNSQ3xMXzh8UkVHKQotI2RlZmluZSBSUzE2IAkJKFNSQ3xMXzE2fFJFRykKLSNkZWZpbmUgUlMzMgkJKFNSQ3xMXzMyfFJFRykKLQotI2RlZmluZSBSU1AgCQkoU1JDfExfUHxSRUcpCi0jZGVmaW5lIFJEUCAJCShEU1R8TF9QfFJFRykKLQotI2RlZmluZSBJTU04IAkJKElNTXxTUkN8TF84KQotI2RlZmluZSBJTU0xNiAJCShJTU18U1JDfExfMTYpCi0jZGVmaW5lIElNTTMyIAkJKElNTXxTUkN8TF8zMikKLQotI2RlZmluZSBBQlM4U1JDIAkoU1JDfEFCU3xMXzh8QUJTOE1FTSkKLSNkZWZpbmUgQUJTOERTVAkJKERTVHxBQlN8TF84fEFCUzhNRU0pCi0KLSNkZWZpbmUgRElTUDggCQkoUENSRUx8TF84KQotI2RlZmluZSBESVNQMTYgCQkoUENSRUx8TF8xNikKLQotI2RlZmluZSBESVNQOFNSQwkoRElTUHxMXzh8U1JDKQotI2RlZmluZSBESVNQMTZTUkMJKERJU1B8TF8xNnxTUkMpCi0KLSNkZWZpbmUgRElTUDhEU1QJKERJU1B8TF84fERTVCkKLSNkZWZpbmUgRElTUDE2RFNUCShESVNQfExfMTZ8RFNUKQotCi0jZGVmaW5lIEFCUzE2U1JDIAkoU1JDfEFCU3xMXzE2KQotI2RlZmluZSBBQlMxNkRTVCAJKERTVHxBQlN8TF8xNikKLSNkZWZpbmUgQUJTMjRTUkMgCShTUkN8QUJTfExfMjQpCi0jZGVmaW5lIEFCUzI0RFNUIAkoRFNUfEFCU3xMXzI0KQotI2RlZmluZSBBQlMzMlNSQyAJKFNSQ3xBQlN8TF8zMikKLSNkZWZpbmUgQUJTMzJEU1QgCShEU1R8QUJTfExfMzIpCi0KLSNkZWZpbmUgUkRERUMgCQkoRFNUfERFQykKLSNkZWZpbmUgUlNJTkMgCQkoU1JDfElOQykKLSNkZWZpbmUgUkRJTkMJCShEU1R8SU5DKQotCi0jZGVmaW5lIFJESU5EIAkJKERTVHxJTkQpCi0jZGVmaW5lIFJTSU5EIAkJKFNSQ3xJTkQpCi0KLSNpZiAxCi0jZGVmaW5lIE9SOCBSUzgJCS8qID8/PyBPUiBhcyBpbiBPbmUgUmVnaXN0ZXI/ICovCi0jZGVmaW5lIE9SMTYgUlMxNgotI2RlZmluZSBPUjMyIFJTMzIKLSNlbHNlCi0jZGVmaW5lIE9SOCBSRDgKLSNkZWZpbmUgT1IxNiBSRDE2Ci0jZGVmaW5lIE9SMzIgUkQzMgotI2VuZGlmCi0KLXN0cnVjdCBjb2RlIAotewotICBvcF90eXBlIG5pYlszMF07Ci19OwotCi1zdHJ1Y3QgYXJnIAotewotICBvcF90eXBlIG5pYlszXTsKLX07Ci0KLXN0cnVjdCBoOF9vcGNvZGUgCi17Ci0gIGludCBob3c7Ci0gIGludCBpbmJhc2U7Ci0gIGludCB0aW1lOwotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgYXJnIGFyZ3M7Ci0gIHN0cnVjdCBjb2RlIGRhdGE7Ci0gIGludCBsZW5ndGg7Ci0gIGludCBub3BlcmFuZHM7Ci0gIGludCBpZHg7Ci0gIGludCBzaXplOwotfTsKLQotI2lmZGVmIERFRklORV9UQUJMRQotCi0jZGVmaW5lIEJJVE9QKGNvZGUsIGltbSwgbmFtZSwgb3AwMCwgb3AwMSxvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKVwKLXsgY29kZSwgMSwgMiwgbmFtZSwJe3tpbW0sUkQ4LEV9fSwJe3tvcDAwLCBvcDAxLCBpbW0sIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDYsIG5hbWUsCXt7aW1tLFJESU5ELEV9fSx7e29wMTAsIG9wMTEsIEIzMHxSRElORCwgMCwgb3AwMCxvcDAxLCBpbW0sIDAsIEV9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxBQlM4RFNULEV9fSx7e29wMjAsIG9wMjEsIEFCUzhEU1QsIElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfVwKLSx7IGNvZGUsIDAsIDYsIG5hbWUsCXt7aW1tLEFCUzE2RFNULEV9fSx7ezB4NiwweGEsMHgxLG9wMzAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMzMkRTVCxFfX0se3sweDYsMHhhLDB4MyxvcDMwLEFCUzMyRFNULElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfQotCi0KLSNkZWZpbmUgRUJJVE9QKGNvZGUsIGltbSwgbmFtZSwgb3AwMCwgb3AwMSxvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKVwKLSAgIEJJVE9QKGNvZGUsaW1tLCBuYW1lLCBvcDAwKzEsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApLFwKLSAgIEJJVE9QKGNvZGUsUlM4LCAgbmFtZSwgb3AwMCwgb3AwMSwgb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMCkKLQotI2RlZmluZSBXVFdPUChjb2RlLG5hbWUsIG9wMSwgb3AyKSBcCi17IGNvZGUsIDEsIDIsIG5hbWUsIHt7UlMxNiwgUkQxNiwgRX19LCB7eyBvcDEsIG9wMiwgUlMxNiwgUkQxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0jZGVmaW5lIEJSQU5DSChjb2RlLCBuYW1lLCBvcCkgXAoteyBjb2RlLCAxLCA0LG5hbWUse3tESVNQOCxFLDB9fSwge3sgMHg0LCBvcCwgRElTUDgsIElHTk9SRSwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBjb2RlLCAwLCA2LG5hbWUse3tESVNQMTYsRSwwfX0sIHt7IDB4NSwgMHg4LCBvcCwgMHgwLCBESVNQMTYsIElHTk9SRSwgSUdOT1JFLCBJR05PUkUsIEUsMH19LCAwLCAwLCAwLCAwfSAKLQotI2RlZmluZSBTT1AoY29kZSwgeCxuYW1lKSBcCi17Y29kZSwgMSwgeCwgIG5hbWUgCi0KLSNkZWZpbmUgTkVXX1NPUChjb2RlLCBpbix4LG5hbWUpIFwKLXtjb2RlLCBpbiwgeCwgIG5hbWUgCi0jZGVmaW5lIEVPUCAgLDAsMCwwLDAgfQotCi0jZGVmaW5lIFRXT09QKGNvZGUsIG5hbWUsIG9wMSwgb3AyLG9wMykgXAoteyBjb2RlLDEsIDIsbmFtZSwge3tJTU04LCBSRDgsIEV9fSwJe3sgb3AxLCBSRDgsIElNTTgsIElHTk9SRSwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDIsbmFtZSwge3tSUzgsIFJEOCwgRX19LAl7eyBvcDIsIG9wMywgUlM4LCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgVU5PUChjb2RlLG5hbWUsIG9wMSwgb3AyKSBcCi17IGNvZGUsIDEsIDIsIG5hbWUsIHt7T1I4LCBFLCAwfX0sIHt7IG9wMSwgb3AyLCAwLCBPUjgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBVTk9QMyhjb2RlLCBuYW1lLCBvcDEsIG9wMiwgb3AzKSBcCi17IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7T1I4LCAgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMCwgT1I4LCAgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU1cpLCAwLCAyLCBuYW1lLCB7e09SMTYsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzEsIE9SMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tPUjMyLCBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyszLCBPUjMyfEIzMCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSBcCi0seyBPKGNvZGUsU0IpLCAxLCAyLCBuYW1lLCB7e0lNTSwgT1I4IHwgU1JDX0lOX0RTVCwgIEV9fSwge3tvcDEsIG9wMiwgb3AzKzQsIE9SOCB8IFNSQ19JTl9EU1QsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7SU1NLCBPUjE2IHwgU1JDX0lOX0RTVCwgRX19LCB7e29wMSwgb3AyLCBvcDMrNSwgT1IxNiB8IFNSQ19JTl9EU1QsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMzIgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys3LCBPUjMyIHwgU1JDX0lOX0RTVHxCMzAgLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLQotI2RlZmluZSBJTU0zMkxJU1QgSU1NMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTI0TElTVCBJTU0yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTE2TElTVCBJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMTZMSVNUIExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgRElTUDI0TElTVCBESVNQfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMzJMSVNUIERJU1B8TF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMjRMSVNUIEFCU3xMXzI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMzJMSVNUIEFCU3xMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMjRMSVNUIExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMzJMSVNUIExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIFBSRUZJWDMyIDB4MCwweDEsMHgwLDB4MAotI2RlZmluZSBQUkVGSVhMREMgMHgwLDB4MSwweDQsMHgwCi0KLQotI2RlZmluZSBPKG9wLCBzaXplKSAob3AqNCtzaXplKQotCi0jZGVmaW5lIE9fUkVDT01QSUxFIDAKLSNkZWZpbmUgT19BREQgIDEKLSNkZWZpbmUgT19BRERYIDIKLSNkZWZpbmUgT19BTkQgIDMKLSNkZWZpbmUgT19CQU5EIDQKLSNkZWZpbmUgT19CUkEgIDUKLSNkZWZpbmUgT19CUk4gIDYKLSNkZWZpbmUgT19CSEkgIDcKLSNkZWZpbmUgT19CTFMgIDgKLSNkZWZpbmUgT19CQ0MgIDkKLSNkZWZpbmUgT19CQ1MgIDEwCi0jZGVmaW5lIE9fQk5FICAxMSAgCi0jZGVmaW5lIE9fQlZDICAxMgotI2RlZmluZSBPX0JWUyAgMTMKLSNkZWZpbmUgT19CUEwgIDE0Ci0jZGVmaW5lIE9fQk1JICAxNQotI2RlZmluZSBPX0JHRSAgMTYKLSNkZWZpbmUgT19CTFQgIDE3Ci0jZGVmaW5lIE9fQkdUICAxOAotI2RlZmluZSBPX0JMRSAgMTkKLSNkZWZpbmUgT19BTkRDIDIwCi0jZGVmaW5lIE9fQkVRIDIxCi0jZGVmaW5lIE9fQkNMUiAyMgotI2RlZmluZSBPX0JJQU5EIDIzCi0jZGVmaW5lIE9fQklMRCAyNAotI2RlZmluZSBPX0JJT1IgMjUKLSNkZWZpbmUgT19CSVhPUiAyNgotI2RlZmluZSBPX0JJU1QgMjcKLSNkZWZpbmUgT19CTEQgMjgKLSNkZWZpbmUgT19CTk9UIDI5Ci0jZGVmaW5lIE9fQlNFVCAzMAotI2RlZmluZSBPX0JTUiAzMQotI2RlZmluZSBPX0JYT1IgMzIKLSNkZWZpbmUgT19DTVAgMzMKLSNkZWZpbmUgT19EQUEgMzQKLSNkZWZpbmUgT19EQVMgMzUKLSNkZWZpbmUgT19ERUMgMzYKLSNkZWZpbmUgT19ESVZVIDM3Ci0jZGVmaW5lIE9fRElWUyAzOAotI2RlZmluZSBPX0lOQyAzOQotI2RlZmluZSBPX0xEQyA0MAotI2RlZmluZSBPX01PVl9UT19NRU0gNDEKLSNkZWZpbmUgT19PUiA0MgotI2RlZmluZSBPX1JPVEwgNDMKLSNkZWZpbmUgT19ST1RSIDQ0Ci0jZGVmaW5lIE9fUk9UWEwgNDUKLSNkZWZpbmUgT19ST1RYUiA0NgotI2RlZmluZSBPX0JQVCA0NwotI2RlZmluZSBPX1NIQUwgNDgKLSNkZWZpbmUgT19TSEFSIDQ5Ci0jZGVmaW5lIE9fU0hMTCA1MAotI2RlZmluZSBPX1NITFIgNTEKLSNkZWZpbmUgT19TVUIgIDUyCi0jZGVmaW5lIE9fU1VCUyA1MwotI2RlZmluZSBPX1RSQVBBIDU0Ci0jZGVmaW5lIE9fWE9SIDU1Ci0jZGVmaW5lIE9fWE9SQyA1NgotI2RlZmluZSBPX0JPUiA1NwotI2RlZmluZSBPX0JTVCA1OAotI2RlZmluZSBPX0JUU1QgNTkKLSNkZWZpbmUgT19FRVBNT1YgNjAKLSNkZWZpbmUgT19FWFRTIDYxCi0jZGVmaW5lIE9fRVhUVSA2MgotI2RlZmluZSBPX0pNUCA2MwotI2RlZmluZSBPX0pTUiA2NAotI2RlZmluZSBPX01VTFUgNjUKLSNkZWZpbmUgT19NVUxTIDY2Ci0jZGVmaW5lIE9fTk9QIDY3Ci0jZGVmaW5lIE9fTk9UIDY4Ci0jZGVmaW5lIE9fT1JDIDY5Ci0jZGVmaW5lIE9fUlRFIDcwCi0jZGVmaW5lIE9fU1RDIDcxCi0jZGVmaW5lIE9fU1VCWCA3MgotI2RlZmluZSBPX05FRyA3MwotI2RlZmluZSBPX1JUUyA3NAotI2RlZmluZSBPX1NMRUVQIDc1Ci0jZGVmaW5lIE9fSUxMIDc2Ci0jZGVmaW5lIE9fQUREUyA3NwotI2RlZmluZSBPX1NZU0NBTEwgNzgKLSNkZWZpbmUgT19NT1ZfVE9fUkVHIDc5Ci0jZGVmaW5lIE9fVEFTIDgwCi0jZGVmaW5lIE9fQ0xSTUFDIDgyCi0jZGVmaW5lIE9fTERNQUMgODMKLSNkZWZpbmUgT19NQUMgODQKLSNkZWZpbmUgT19MRE0gODUKLSNkZWZpbmUgT19TVE0gODYKLSNkZWZpbmUgT19TVE1BQyA4NwotI2RlZmluZSBPX0xBU1QgODgKLSNkZWZpbmUgU0IgMAotI2RlZmluZSBTVyAxCi0jZGVmaW5lIFNMIDIKLSNkZWZpbmUgU04gMwotCi0KLS8qIEZJWE1FOiBMb3RzIG9mIGluc25zIGhhdmUgIkUsIDAsIDAsIDAsIDAiIGluIHRoZSBuaWJibGUgY29kZSBzZXF1ZW5jZXMuCi0gICBNZXRoaW5rcyB0aGUgemVyb2VzIGFyZW4ndCBuZWNlc3NhcnkuICBPbmNlIGNvbmZpcm1lZCwgbnVrZSAnZW0uICAqLwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA9IAotewotICBUV09PUChPKE9fQURELFNCKSwiYWRkLmIiLCAweDgsIDB4MCwweDgpLAotICAKLSAgTkVXX1NPUChPKE9fQURELFNXKSwxLDIsImFkZC53Iikse3tSUzE2LFJEMTYsRX19LHt7MHgwLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNXKSwwLDQsImFkZC53Iikse3tJTU0xNixSRDE2LEV9fSx7ezB4NywweDksMHgxLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDIsImFkZC5sIikse3tSUzMyLFJEMzIsRSB9fSwge3sweDAsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERCxTTCksMCw2LCJhZGQubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDEsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERFMsU0wpLDEsMiwiYWRkcyIpLCB7e0tCSVQsUkRQLEV9fSwgICB7ezB4MCwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIFRXT09QKE8oT19BRERYLFNCKSwiYWRkeCIsMHg5LDB4MCwweEUpLAotICBUV09PUChPKE9fQU5ELFNCKSwgImFuZC5iIiwweEUsMHgxLDB4NiksCi0KLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDIsImFuZC53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDYsUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FORCxTVyksMCw0LCJhbmQudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDYsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICAKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDYsImFuZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDIsImFuZC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NixCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0FOREMsU0IpLDEsMiwiYW5kYyIpLCB7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLQotICBCSVRPUChPKE9fQkFORCxTQiksIElNTTN8QjMwLCJiYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJyYSIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUkEsU0IpLCJidCIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJicm4iLDB4MSksCi0gIEJSQU5DSChPKE9fQlJOLFNCKSwiYmYiLDB4MSksCi0gIEJSQU5DSChPKE9fQkhJLFNCKSwiYmhpIiwweDIpLAotICBCUkFOQ0goTyhPX0JMUyxTQiksImJscyIsMHgzKSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiY2MiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNDLFNCKSwiYmhzIiwweDQpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJjcyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CQ1MsU0IpLCJibG8iLDB4NSksCi0gIEJSQU5DSChPKE9fQk5FLFNCKSwiYm5lIiwweDYpLAotICBCUkFOQ0goTyhPX0JFUSxTQiksImJlcSIsMHg3KSwKLSAgQlJBTkNIKE8oT19CVkMsU0IpLCJidmMiLDB4OCksCi0gIEJSQU5DSChPKE9fQlZTLFNCKSwiYnZzIiwweDkpLAotICBCUkFOQ0goTyhPX0JQTCxTQiksImJwbCIsMHhBKSwKLSAgQlJBTkNIKE8oT19CTUksU0IpLCJibWkiLDB4QiksCi0gIEJSQU5DSChPKE9fQkdFLFNCKSwiYmdlIiwweEMpLAotICBCUkFOQ0goTyhPX0JMVCxTQiksImJsdCIsMHhEKSwKLSAgQlJBTkNIKE8oT19CR1QsU0IpLCJiZ3QiLDB4RSksCi0gIEJSQU5DSChPKE9fQkxFLFNCKSwiYmxlIiwweEYpLAotCi0gIEVCSVRPUChPKE9fQkNMUixTQiksSU1NM3xCMzAsImJjbHIiLCAweDYsMHgyLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklBTkQsU0IpLElNTTN8QjMxLCJiaWFuZCIsMHg3LDB4NiwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJTEQsU0IpLCBJTU0zfEIzMSwiYmlsZCIsIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSU9SLFNCKSwgSU1NM3xCMzEsImJpb3IiLCAweDcsMHg0LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklTVCxTQiksIElNTTN8QjMxLCJiaXN0IiwgMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JJWE9SLFNCKSxJTU0zfEIzMSwiYml4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CTEQsU0IpLCAgSU1NM3xCMzAsImJsZCIsICAweDcsMHg3LDB4NywweEMsMHg3LDB4RSwweDApLAotICBFQklUT1AoTyhPX0JOT1QsU0IpLElNTTN8QjMwLCJibm90IiwgMHg2LDB4MSwweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JPUixTQiksICBJTU0zfEIzMCwiYm9yIiwgIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQlNFVCxTQiksSU1NM3xCMzAsImJzZXQiLCAweDYsMHgwLDB4NywweEQsMHg3LDB4RiwweDgpLAotCi0gIFNPUChPKE9fQlNSLFNCKSw2LCJic3IiKSx7e0RJU1A4LEUsMH19LHt7IDB4NSwweDUsRElTUDgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDE2LEUsMH19LHt7IDB4NSwweEMsMHgwLDB4MCxESVNQMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBCSVRPUChPKE9fQlNULFNCKSwgSU1NM3xCMzAsImJzdCIsMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgRUJJVE9QKE8oT19CVFNULFNCKSwgSU1NM3xCMzAsImJ0c3QiLDB4NiwweDMsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CWE9SLFNCKSwgSU1NM3xCMzAsImJ4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0KLSAgVFdPT1AoTyhPX0NNUCxTQiksICJjbXAuYiIsMHhBLDB4MSwweEMpLAotICBXVFdPUChPKE9fQ01QLFNXKSwgImNtcC53IiwweDEsMHhEKSwKLQotICBORVdfU09QKE8oT19DTVAsU1cpLDEsMiwiY21wLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHgxLDB4RCxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNXKSwwLDQsImNtcC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4MixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDYsImNtcC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDIsImNtcC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDEsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgVU5PUChPKE9fREFBLFNCKSwgImRhYSIsMHgwLDB4RiksCi0gIFVOT1AoTyhPX0RBUyxTQiksICJkYXMiLDB4MSwweEYpLAotICBVTk9QKE8oT19ERUMsU0IpLCAiZGVjLmIiLDB4MSwweEEpLAotCi0gIE5FV19TT1AoTyhPX0RFQywgU1cpLDAsMiwiZGVjLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MSwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19ERUMsIFNMKSwwLDIsImRlYy5sIikgLHt7REJJVCxSRDMyLEUgfX0se3sweDEsMHhCLDB4N3xEQklULFJEMzJ8QjMwLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fRElWVSxTQiksMSw2LCJkaXZ4dS5iIiksIHt7UlM4LFJEMTYsRX19LCB7ezB4NSwweDEsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0RJVlUsU1cpLDAsMjAsImRpdnh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19ESVZTLFNCKSwwLDIwLCJkaXZ4cy5iIikgLHt7UlM4LFJEMTYsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgxLFJTOCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RJVlMsU1cpLDAsMDIsImRpdnhzLnciKSAse3tSUzE2LFJEMzIsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19FRVBNT1YsU0IpLDEsNTAsImVlcG1vdi5iIikse3tFLDAsMH19LHt7MHg3LDB4QiwweDUsMHhDLDB4NSwweDksMHg4LDB4RixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTVyksMCw1MCwiZWVwbW92LnciKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4RCwweDQsMHg1LDB4OSwweDgsMHhGLEV9fSBFT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0VYVFMsU1cpLDAsMiwiZXh0cy53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweEQsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFMsU0wpLDAsMiwiZXh0cy5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweEYsT1IzMnxCMzAsRSAgIH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0VYVFUsU1cpLDAsMiwiZXh0dS53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweDUsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFUsU0wpLDAsMiwiZXh0dS5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweDcsT1IzMnxCMzAsRSAgIH19RU9QLAotICAgIAotICBVTk9QKE8oT19JTkMsU0IpLCAiaW5jIiwweDAsMHhBKSwKLQotICBORVdfU09QKE8oT19JTkMsU1cpLDAsMiwiaW5jLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MCwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19JTkMsU0wpLDAsMiwiaW5jLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MCwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBTT1AoTyhPX0pNUCxTQiksNCwiam1wIikse3tSU0lORCxFLDB9fSx7ezB4NSwweDksQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDYsImptcCIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEEsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDgsImptcCIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEIsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19KU1IsU0IpLDYsImpzciIpLHt7U1JDfFJTSU5ELEUsMH19LCB7ezB4NSwweEQsQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEUsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEYsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7SU1NOCxDQ1IsRX19LCAgICAgICAgIHt7IDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxDQ1IsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxDQ1IsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDIsMHgwLFNSQ3xBQlMzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzE2LENDUixFfX0se3tQUkVGSVhMREMsMHg2LDB4RixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsQ0NSLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMwfFJTSU5DLDB4MCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5ELENDUixFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LEVYUixFfX0sICAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxFWFIsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MSxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLEVYUixFfX0sICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4YiwweDAsMHgwLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMzJTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHgyLDB4MCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5DLEVYUixFfX0sICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlN8U1JDfExfMTZ8TUVNUkVMQVgsUkQ4LEV9fSwgIHt7IDB4NiwweEEsMHgwLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tBQlN8U1JDfExfMzJ8TUVNUkVMQVgsUkQ4LEUgfX0sIHt7IDB4NiwweEEsMHgyLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw0LCJtb3YuYiIpLHt7UlM4LEFCU3xMXzE2fE1FTVJFTEFYfERTVCxFfX0sICAgICB7eyAweDYsMHhBLDB4OCxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMTZMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LEFCU3xEU1R8TF8zMnxNRU1SRUxBWCxFIH19LCAgICB7eyAweDYsMHhBLDB4QSxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMzJMSVNULEUgfX1FT1AsCi0gICAgCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1B8TF8zMnxTUkMsUkQ4LEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHgyLFJEOCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQfExfMzJ8RFNULEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHhBLFJTOCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0KLQotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e1JTOCxSRDgsRX19LAkgICAge3sgMHgwLDB4QyxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDIsIm1vdi5iIikse3tJTU04LFJEOCxFfX0sICAgICAgICAgICB7eyAweEYsUkQ4LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tSU0lORCxSRDgsRX19LCAgICAgICAgICB7eyAweDYsMHg4LEIzMHxSU0lORCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1AxNlNSQyxSRDgsRX19LCAgICAgIHt7IDB4NiwweEUsQjMwfERJU1BSRUcsUkQ4LERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e1JTSU5DLFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweEMsQjMwfFJTSU5DLFJEOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlM4U1JDLFJEOCxFfX0sICAgICAgICB7eyAweDIsUkQ4LEFCUzhTUkMsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsUkRJTkQsRX19LCAgICAgICAgICB7eyAweDYsMHg4LFJESU5EfEIzMSxSUzgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQMTZEU1QsRX19LCAgICAgIHt7IDB4NiwweEUsRElTUFJFR3xCMzEsUlM4LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxSRERFQ3xCMzEsRX19LCAgICAgIHt7IDB4NiwweEMsUkRERUN8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTOERTVCxFfX0sICAgICAgICB7eyAweDMsUlM4LEFCUzhEU1QsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRJTkQsRX19LCAgICAgICAge3sgMHg2LDB4OSxSRElORHxCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUHxMXzMyfFNSQyxSRDE2LEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4MixSRDE2LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQfExfMzJ8RFNULEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4QSxSUzE2LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7QUJTfExfMzJ8TUVNUkVMQVh8U1JDLFJEMTYsRSB9fSx7eyAweDYsMHhCLDB4MixSRDE2LFNSQ3xNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlN8TF8zMnxNRU1SRUxBWHxEU1QsRSB9fSx7eyAweDYsMHhCLDB4QSxSUzE2LERTVHxNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwyLCJtb3YudyIpLHt7UlMxNixSRDE2LEV9fSwgICAgICAgICB7eyAweDAsMHhELFJTMTYsIFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e0lNTTE2LFJEMTYsRX19LCAgICAgICAge3sgMHg3LDB4OSwweDAsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e1JTSU5ELFJEMTYsRX19LCAgICAgICAge3sgMHg2LDB4OSxCMzB8UlNJTkQsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUDE2U1JDLFJEMTYsRX19LCAgICB7eyAweDYsMHhGLEIzMHxESVNQUkVHLFJEMTYsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7UlNJTkMsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHhELEIzMHxSU0lOQyxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlMxNlNSQyxSRDE2LEV9fSwgICAgIHt7IDB4NiwweEIsMHgwLFJEMTYsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsRElTUDE2RFNULEV9fSwgICAge3sgMHg2LDB4RixESVNQUkVHfEIzMSxSUzE2LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRERUMsRX19LCAgICAgICAge3sgMHg2LDB4RCxSRERFQ3xCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlMxNkRTVCxFfX0sICAgICB7eyAweDYsMHhCLDB4OCxSUzE2LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tJTU0zMixSRDMyLEV9fSwgICAgICAgIHt7IDB4NywweEEsMHgwLEIzMHxSRDMyLElNTTMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksMiwibW92LmwiKSx7e1JTMzIsUkQzMixFfX0sICAgICAgICAge3sgMHgwLDB4RixCMzF8UlMzMixCMzB8UkQzMixFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tSU0lORCxSRDMyLEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUlNJTkR8QjMwLEIzMHxSRDMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7RElTUDE2U1JDLFJEMzIsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMwLEIzMHxSRDMyLERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQfExfMzJ8U1JDLFJEMzIsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLEIzMHxSRDMyLFNSQ3xESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e1JTSU5DLFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxCMzB8UlNJTkMsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tBQlMxNlNSQyxSRDMyLEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHgwLEIzMHxSRDMyLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzMyU1JDfE1FTVJFTEFYLFJEMzIsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLFJESU5ELEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUkRJTkR8QjMxLEIzMHxSUzMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixESVNQMTZEU1QsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMxLEIzMHxSUzMyLERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1B8TF8zMnxEU1QsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMxfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLEIzMHxSUzMyLERTVHxESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRERUMsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxSRERFQ3xCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLEFCUzE2RFNULEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHg4LEIzMHxSUzMyLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMzJEU1R8TUVNUkVMQVgsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMTAsIm1vdmZwZSIpLHt7QUJTMTZTUkMsUkQ4LEV9fSx7eyAweDYsMHhBLDB4NCxSRDgsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDEwLCJtb3Z0cGUiKSx7e1JTOCxBQlMxNkRTVCxFfX0se3sgMHg2LDB4QSwweEMsUlM4LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19NVUxVLFNCKSwxLDE0LCJtdWx4dS5iIikse3tSUzgsUkQxNixFfX0sIHt7IDB4NSwweDAsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFUsU1cpLDAsMTQsIm11bHh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHg1LDB4MixSUzE2LEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFMsU0IpLDAsMjAsIm11bHhzLmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDAsUlM4LFJEMTYsRX19RU9QLAotICBORVdfU09QKE8oT19NVUxTLFNXKSwwLDIwLCJtdWx4cy53Iikse3tSUzE2LFJEMzIsRX19LHt7IDB4MCwweDEsMHhjLDB4MCwweDUsMHgyLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAKLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05FRyxTQiksMSwyLCJuZWcuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDgsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19ORUcsU1cpLDAsMiwibmVnLnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHg5LE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19ORUcsU0wpLDAsMiwibmVnLmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHhCLEIzMHxPUjMyLEV9fUVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fTk9QLFNOKSwxLDIsIm5vcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgwLDB4MCwweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05PVCxTQiksMSwyLCJub3QuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDAsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19OT1QsU1cpLDAsMiwibm90LnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHgxLE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19OT1QsU0wpLDAsMiwibm90LmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHgzLEIzMHxPUjMyLEV9fUVPUCwKLQotICBUV09PUChPKE9fT1IsIFNCKSwib3IuYiIsMHhDLDB4MSwweDQpLAotICBORVdfU09QKE8oT19PUixTVyksMCw0LCJvci53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDIsIm9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NCxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19PUixTTCksMCw2LCJvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NCxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU0wpLDAsMiwib3IubCIpLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NCxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg0LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19PUkMsU0IpLDEsMiwib3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTU9WX1RPX1JFRyxTVyksMSw2LCJwb3AudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4NyxPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwwLDYsInBvcC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHg3LE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNXKSwxLDYsInB1c2gudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4RixPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNMKSwwLDYsInB1c2gubCIpLHt7T1IzMixFLDB9fSx7eyBQUkVGSVgzMiwweDYsMHhELDB4RixPUjMyfEIzMCxFLDAsMCwwLDB9fUVPUCwKLQotICBVTk9QMyhPX1JPVEwsICAicm90bCIsIDB4MSwweDIsMHg4KSwKLSAgVU5PUDMoT19ST1RSLCAgInJvdHIiLCAweDEsMHgzLDB4OCksCi0gIFVOT1AzKE9fUk9UWEwsICJyb3R4bCIsMHgxLDB4MiwweDApLAotICBVTk9QMyhPX1JPVFhSLCAicm90eHIiLDB4MSwweDMsMHgwKSwKLQotICBTT1AoTyhPX0JQVCxTTiksICAxMCwiYnB0Iikse3tFLDAsMH19LHt7IDB4NywweEEsMHhGLDB4RixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVEUsU04pLCAgMTAsInJ0ZSIpLHt7RSwwLDB9fSx7eyAweDUsMHg2LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fUlRTLFNOKSwgICA4LCJydHMiKSx7e0UsMCwwfX0se3sgMHg1LDB4NCwweDcsMHgwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fU0hBTCwgICJzaGFsIiwweDEsMHgwLDB4OCksCi0gIFVOT1AzKE9fU0hBUiwgICJzaGFyIiwweDEsMHgxLDB4OCksCi0gIFVOT1AzKE9fU0hMTCwgICJzaGxsIiwweDEsMHgwLDB4MCksCi0gIFVOT1AzKE9fU0hMUiwgICJzaGxyIiwweDEsMHgxLDB4MCksCi0KLSAgU09QKE8oT19TTEVFUCxTTiksMiwic2xlZXAiKSx7e0UsMCwwfX0se3sgMHgwLDB4MSwweDgsMHgwLEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7Q0NSLFJEOCxFfX0se3sgMHgwLDB4MiwweDAsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUlNJTkQsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzE2LEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzMyLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLFJEREVDLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzE2U1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixBQlMzMlNSQyxFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwgMSwyLCJzdGMiKSx7e0VYUixSRDgsRX19LHt7IDB4MCwweDIsMHgxLFJEOCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJTSU5ELEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMxfFJESU5ELDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8xNixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg2LDB4RixCMzF8RElTUFJFRywwLERTVHxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8zMixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHhBLDB4MCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixSRERFQyxFfX0sICAgICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhELEIzMXxSRERFQywweDAsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMxNlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4OCwweDAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsQUJTMzJTUkMsRX19LCAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4QiwweEEsMHgwLERTVHxBQlMzMkxJU1QsRX19RU9QLAotCi0gIFNPUChPKE9fU1VCLFNCKSwyLCJzdWIuYiIpLHt7UlM4LFJEOCxFfX0se3sgMHgxLDB4OCxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMSwyLCJzdWIudyIpLHt7UlMxNixSRDE2LEUgfX0sICB7ezB4MSwweDksUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMCw0LCJzdWIudyIpLHt7SU1NMTYsUkQxNixFIH19LCB7ezB4NywweDksMHgzLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNMKSwwLDIsInN1Yi5sIikgLHt7UlMzMixSRDMyLEUgfX0sIHt7MHgxLDB4QSxCMzF8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsNiwic3ViLmwiKSwge3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MyxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLQotICBTT1AoTyhPX1NVQlMsU0wpLDIsInN1YnMiKSx7e0tCSVQsUkRQLEV9fSx7eyAweDEsMHhCLEtCSVQsUkRQLEUsMCwwLDAsMH19RU9QLAotICBUV09PUChPKE9fU1VCWCxTQiksInN1YngiLDB4QiwweDEsMHhFKSwKLQotICBORVdfU09QKE8oT19UUkFQQSxTQiksMCwyLCJ0cmFwYSIpLHt7IElNTTIsRX19LCAge3sweDUsMHg3LElNTTIsSUdOT1JFLEUgIH19RU9QLAotICBORVdfU09QKE8oT19UQVMsU0IpLDAsMiwidGFzIikse3tSU0lORCxFfX0sICB7ezB4MCwweDEsMHhlLDB4MCwweDcsMHhiLEIzMHxSU0lORCwweGMsRSAgfX1FT1AsCi0KLSAgVFdPT1AoTyhPX1hPUiwgU0IpLCJ4b3IiLDB4RCwweDEsMHg1KSwKLQotICBORVdfU09QKE8oT19YT1IsU1cpLDAsNCwieG9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg1LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNXKSwwLDIsInhvci53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDUsUlMxNixSRDE2LEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDYsInhvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDIsInhvci5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NSxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg1LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0NMUk1BQyxTTiksMSwyLCJjbHJtYWMiKSx7e0UsIDAsIDB9fSx7ezB4MCwweDEsMHhhLDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19NQUMsU0wpLDEsMiwibWFjIikse3tSU0lOQyxSRElOQyxFfX0se3sweDAsMHgxLDB4NiwweDAsMHg2LDB4ZCxCMzB8UlNJTkMsQjMwfFJESU5DLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETUFDLFNMKSwxLDIsImxkbWFjIikse3tSUzMyLE1BQ1JFRyxFfX0se3sweDAsMHgzLE1BQ1JFRyxSUzMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUTUFDLFNMKSwxLDIsInN0bWFjIikse3tNQUNSRUcsUkQzMixFfX0se3sweDAsMHgyLE1BQ1JFRyxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETSxTTCksMCw2LCJsZG0ubCIpLHt7UlNJTkMsIFJTMzIsIEV9fSx7eyAweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweDcsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RNLFNMKSwwLDYsInN0bS5sIikse3tSUzMyLCBSRERFQywgRX19LHt7MHgwLDB4MSxJR05PUkUsMHgwLDB4NiwweEQsMHhGLElHTk9SRSxFfX1FT1AsCi0gIHsgMCB9Ci19OwotI2Vsc2UKLWV4dGVybiBzdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA7Ci0jZW5kaWYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oIGIvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U1OWMzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgUEEtUklTQy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIGRpc2Fzc2VtYmxlci4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgZGVsYXkgc2xvdCBudWxsaWZpY2F0aW9uOiBub3JtYWwgd2hpY2ggaXMKLSAqIGNvbnRyb2xlZCBieSB0aGUgbnVsbGlmaWNhdGlvbiBiaXQsIGFuZCBjb25kaXRpb25hbCwgd2hpY2ggZGVwZW5kcwotICogb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgYnJhbmNoIGFuZCBpdHMgc3VjY2VzcyBvciBmYWlsdXJlLgotICoKLSAqIE5PTkUgaXMgdW5mb3J0dW5hdGVseSAjZGVmaW5lZCBpbiB0aGUgaGl1eCBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIAotICogI3VuZGVmIGl0IGF3YXkuCi0gKi8KLSN1bmRlZiBOT05FCi1zdHJ1Y3QgcGFfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIGludCBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0Li4uICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hc2s7CS8qIC4uLiBpbiB0aGVzZSBiaXRzLiAqLwotICAgIGNoYXIgKmFyZ3M7Ci0gICAgZW51bSBwYV9hcmNoIGFyY2g7Ci0gICAgY2hhciBmbGFnczsKLX07Ci0KLS8qIEVuYWJsZS9kaXNhYmxlIHN0cmljdCBzeW50YXggY2hlY2tpbmcuICBOb3QgY3VycmVudGx5IHVzZWQsIGJ1dCB3aWxsCi0gICBiZSBuZWNlc3NhcnkgZm9yIFBBMi4wIHN1cHBvcnQgaW4gdGhlIGZ1dHVyZS4gICovCi0jZGVmaW5lIEZMQUdfU1RSSUNUIDB4MQotCi0vKgotICAgQWxsIGhwcGEgb3Bjb2RlcyBhcmUgMzIgYml0cy4KLQotICAgVGhlIG1hdGNoIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBhCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyIGZvciBlYWNoIG9wZXJhbmQgb2YKLSAgIHRoZSBpbnN0cnVjdGlvbi4gIENoYXJhY3RlcnMgdXNlZCBhcyBhIHByZWZpeCBhbGxvdyBhbnkgc2Vjb25kIGNoYXJhY3RlciB0bwotICAgYmUgdXNlZCB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIG1haW4gb3BlcmFuZCBjaGFyYWN0ZXJzLgotCi0gICBCaXQgcG9zaXRpb25zIGluIHRoaXMgZGVzY3JpcHRpb24gZm9sbG93IEhQIHVzYWdlIG9mIGxzYiA9IDMxLAotICAgImF0IiBpcyBsc2Igb2YgZmllbGQuCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBleGFjdGx5OgotCi0JJyssKCkgJwotCi0gICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB1bnVzZWQ6Ci0KLQknICAiICAgICAgICAgLSAgLyAgIDM0IDY3ODk6OzwgPiBAJwotCScgIEMgICAgICAgICBNICAgICAgICAgICAgIFtcXSAgJwotCScgICAgZSBnICAgICAgICAgICAgICAgICAgICAgfSAnCi0KLSAgIEhlcmUgYXJlIGFsbCB0aGUgY2hhcmFjdGVyczoKLQotCScgISIjJCUmJygpKistLC4vMDEyMzQ1Njc4OTo7PD0+P0AnCi0JJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl8nCi0JJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9ficKLQotS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICB4ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTUuCi0gICBiICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTAuCi0gICB0ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMzEuCi0gICBhCWludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTAgYW5kIDE1IChmb3IgUEVSTUgpCi0gICA1ICAgIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4KLSAgIHMgICAgMiBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE3LgotICAgUyAgICAzIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTguCi0gICBWICAgIDUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgaSAgICAxMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBqICAgIDE0IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGsgICAgMjEgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgbCAgICAxNiBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxICh3aWRlIG1vZGUgb25seSwgdW51c3VhbCBlbmNvZGluZykuCi0gICBuCW51bGxpZmljYXRpb24gZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMKLSAgIE4JbnVsbGlmaWNhdGlvbiBmb3Igc3BvcCBhbmQgY29wciBpbnN0cnVjdGlvbnMKLSAgIHcgICAgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAgIFcgICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKFBDIHJlbGF0aXZlKQotICAgWCAgICAyMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoUEMgcmVsYXRpdmUpCi0gICB6ICAgIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChqdXN0IGEgbnVtYmVyLCBub3QgYW4gYWRkcmVzcykKLQotQWxzbyB0aGVzZToKLQotICAgLiAgICAyIGJpdCBzaGlmdCBhbW91bnQgYXQgMjUKLSAgICogICAgNCBiaXQgc2hpZnQgYW1vdW50IGF0IDI1Ci0gICBwICAgIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2ICh0byBzdXBwb3J0IHRoZSBTSEQgaW5zdHJ1Y3Rpb24pIGVuY29kZWQgYXMKLSAgICAgICAgMzEtcAotICAgfiAgICA2IGJpdCBzaGlmdCBjb3VudCBhdCAyMCwyMjoyNiBlbmNvZGVkIGFzIDYzLX4uCi0gICBQICAgIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNgotICAgcSAgICA2IGJpdCBiaXQgcG9zaXRpb24gYXQgMjAsMjI6MjYKLSAgIFQgICAgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxIChlbmNvZGVkIGFzIDMyLVQpCi0gICAlCTYgYml0IGZpZWxkIGxlbmd0aCBhdCAyMywyNzozMSAodmFyaWFibGUgZXh0cmFjdC9kZXBvc2l0KQotICAgfAk2IGJpdCBmaWVsZCBsZW5ndGggYXQgMTksMjc6MzEgKGZpeGVkIGV4dHJhY3QvZGVwb3NpdCkKLSAgIEEgICAgMTMgYml0IGltbWVkaWF0ZSBhdCAxOCAodG8gc3VwcG9ydCB0aGUgQlJFQUsgaW5zdHJ1Y3Rpb24pCi0gICBeCWxpa2UgYiwgYnV0IGRlc2NyaWJlcyBhIGNvbnRyb2wgcmVnaXN0ZXIKLSAgICEgICAgc2FyIChjcjExKSByZWdpc3RlcgotICAgRCAgICAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxICh0byBzdXBwb3J0IHRoZSBESUFHIGluc3RydWN0aW9uKQotICAgJCAgICA5IGJpdCBpbW1lZGlhdGUgYXQgMjggKHRvIHN1cHBvcnQgUE9QQlRTKQotCi0gICB2ICAgIDMgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBPICAgIDIwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTUgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICBvICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIGF0IDIwCi0gICAyICAgIDIyIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTcgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAxICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTAgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAwICAgIDEwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIHUgICAgMyBiaXQgY29wcm9jZXNzb3IgdW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBGICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMjAKLSAgIEkgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDEgYml0cyBhdCAyMAotCShmb3IgMHhlIGZvcm1hdCBGUCBpbnN0cnVjdGlvbnMpCi0gICBHICAgIERlc3RpbmF0aW9uIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAxOAotICAgSCAgICBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBhdCAyNiBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgICAgICAgKHZlcnkgc2ltaWxhciB0byAnRicpCi0KLSAgIHIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxIChmb3IgdGhlIGJyZWFrIGluc3RydWN0aW9uKQotCSh2ZXJ5IHNpbWlsYXIgdG8gViBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBpbnN0ZWFkIG9mCi0JbG93X3NpZ25fZXh0KQotICAgUgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTUgKGZvciB0aGUgc3NtLCByc20sIHByb2JlaSBpbnN0cnVjdGlvbnMpCi0JKHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIFUJMTAgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxNSAoZm9yIFNTTSwgUlNNIG9uIHBhMi4wKQotICAgUQk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTAgKGEgYml0IHBvc2l0aW9uIHNwZWNpZmllZCBpbgotCXRoZSBiYiBpbnN0cnVjdGlvbi4gSXQncyB0aGUgc2FtZSBhcyByIGFib3ZlLCBleGNlcHQgdGhlCi0gICAgICAgIHZhbHVlIGlzIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uKQotICAgQgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTAgKGEgYml0IHBvc2l0aW9uIHNwZWNpZmllZCBpbgotCXRoZSBiYiBpbnN0cnVjdGlvbi4gU2ltaWxhciB0byBRLCBidXQgNjRiaXQgaGFuZGxpbmcgaXMKLQlkaWZmZXJlbnQuCi0gICBaICAgICVyMSAtLSBpbXBsaWNpdCB0YXJnZXQgb2YgYWRkaWwgaW5zdHJ1Y3Rpb24uCi0gICBMICAgICwlcjIgY29tcGxldGVyIGZvciBuZXcgc3ludGF4IGJyYW5jaAotICAgeyAgICBTb3VyY2UgZm9ybWF0IGNvbXBsZXRlciBmb3IgZmNudgotICAgXyAgICBEZXN0aW5hdGlvbiBmb3JtYXQgY29tcGxldGVyIGZvciBmY252Ci0gICBoICAgIGNiaXQgZm9yIGZjbXAKLSAgID0gICAgZ2Z4IHRlc3RzIGZvciBmdGVzdAotICAgZCAgICAxNGJpdCBvZmZzZXQgZm9yIHNpbmdsZSBwcmVjaXNpb24gRlAgbG9uZyBsb2FkL3N0b3JlLgotICAgIyAgICAxNGJpdCBvZmZzZXQgZm9yIGRvdWJsZSBwcmVjaXNpb24gRlAgbG9hZCBsb25nL3N0b3JlLgotICAgSiAgICBZZXQgYW5vdGhlciAxNGJpdCBvZmZzZXQgd2l0aCBhbiB1bnVzdWFsIGVuY29kaW5nLgotICAgSyAgICBZZXQgYW5vdGhlciAxNGJpdCBvZmZzZXQgd2l0aCBhbiB1bnVzdWFsIGVuY29kaW5nLgotICAgeSAgICAxNmJpdCBvZmZzZXQgZm9yIHNpbmdsZSBwcmVjaXNpb24gRlAgbG9uZyBsb2FkL3N0b3JlIChQQTIuMCB3aWRlKS4KLSAgICYgICAgMTZiaXQgb2Zmc2V0IGZvciBkb3VibGUgcHJlY2lzaW9uIEZQIGxvbmcgbG9hZC9zdG9yZSAoUEEyLjAgd2lkZSkuCi0gICBZICAgICVzcjAsJXIzMSAtLSBpbXBsaWNpdCB0YXJnZXQgb2YgYmUsbCBpbnN0cnVjdGlvbi4KLSAgIEAJaW1wbGljaXQgaW1tZWRpYXRlIHZhbHVlIG9mIDAKLQotQ29tcGxldGVyIG9wZXJhbmRzIGFsbCBoYXZlICdjJyBhcyB0aGUgcHJlZml4OgotCi0gICBjeCAgIGluZGV4ZWQgbG9hZCBjb21wbGV0ZXIuCi0gICBjbSAgIHNob3J0IGxvYWQgYW5kIHN0b3JlIGNvbXBsZXRlci4KLSAgIGNxICAgbG9uZyBsb2FkIGFuZCBzdG9yZSBjb21wbGV0ZXIgKGxpa2UgY20sIGJ1dCBpbnNlcnRlZCBpbnRvIGEKLQlkaWZmZXJlbnQgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBpbnN0cnVjdGlvbikuCi0gICBjcyAgIHN0b3JlIGJ5dGVzIHNob3J0IGNvbXBsZXRlci4KLSAgIGNlICAgbG9uZyBsb2FkL3N0b3JlIGNvbXBsZXRlciBmb3IgTERXL1NUVyB3aXRoIGEgZGlmZmVyZW50IGVuY29kaW5nIHRoYW4gdGhlCi0Jb3RoZXJzCi0gICBjYyAgIGxvYWQgY2FjaGUgY29udHJvbCBoaW50Ci0gICBjZCAgIGxvYWQgYW5kIGNsZWFyIGNhY2hlIGNvbnRyb2wgaGludAotICAgY0MgICBzdG9yZSBjYWNoZSBjb250cm9sIGhpbnQKLSAgIGNvCW9yZGVyZWQgYWNjZXNzCi0KLSAgIGNwCWJyYW5jaCBsaW5rIGFuZCBwdXNoIGNvbXBsZXRlcgotICAgY1AJYnJhbmNoIHBvcCBjb21wbGV0ZXIKLSAgIGNsCWJyYW5jaCBsaW5rIGNvbXBsZXRlcgotICAgY2cJYnJhbmNoIGdhdGUgY29tcGxldGVyCi0KLSAgIGN3CXJlYWQvd3JpdGUgY29tcGxldGVyIGZvciBQUk9CRQotICAgY1cJd2lkZSBjb21wbGV0ZXIgZm9yIE1GQ1RMCi0gICBjTAlsb2NhbCBwcm9jZXNzb3IgY29tcGxldGVyIGZvciBjYWNoZSBjb250cm9sCi0gICBjWiAgIFN5c3RlbSBDb250cm9sIENvbXBsZXRlciAodG8gc3VwcG9ydCBMUEEsIExIQSwgZXRjLikKLQotICAgY2kJY29ycmVjdGlvbiBjb21wbGV0ZXIgZm9yIERDT1IKLSAgIGNhCWFkZCBjb21wbGV0ZXIKLSAgIGN5CTMyIGJpdCBhZGQgY2FycnkgY29tcGxldGVyCi0gICBjWQk2NCBiaXQgYWRkIGNhcnJ5IGNvbXBsZXRlcgotICAgY3YJc2lnbmVkIG92ZXJmbG93IHRyYXAgY29tcGxldGVyCi0gICBjdAl0cmFwIG9uIGNvbmRpdGlvbiBjb21wbGV0ZXIgZm9yIEFEREksIFNVQgotICAgY1QJdHJhcCBvbiBjb25kaXRpb24gY29tcGxldGVyIGZvciBVQUREQ00KLSAgIGNiCTMyIGJpdCBib3Jyb3cgY29tcGxldGVyIGZvciBTVUIKLSAgIGNCCTY0IGJpdCBib3Jyb3cgY29tcGxldGVyIGZvciBTVUIKLQotICAgY2gJbGVmdC9yaWdodCBoYWxmIGNvbXBsZXRlcgotICAgY0gJc2lnbmVkL3Vuc2lnbmVkIHNhdHVyYXRpb24gY29tcGxldGVyCi0gICBjUwlzaWduZWQvdW5zaWduZWQgY29tcGxldGVyIGF0IDIxCi0gICBjKglwZXJtdXRhdGlvbiBjb21wbGV0ZXIKLQotQ29uZGl0aW9uIG9wZXJhbmRzIGFsbCBoYXZlICc/JyBhcyB0aGUgcHJlZml4OgotCi0gICA/ZiAgIEZsb2F0aW5nIHBvaW50IGNvbXBhcmUgY29uZGl0aW9ucyAoZW5jb2RlZCBhcyA1IGJpdHMgYXQgMzEpCi0KLSAgID9hCWFkZCBjb25kaXRpb25zCi0gICA/QQk2NCBiaXQgYWRkIGNvbmRpdGlvbnMKLSAgID9AICAgYWRkIGJyYW5jaCBjb25kaXRpb25zIGZvbGxvd2VkIGJ5IG51bGxpZnkKLSAgID9kCW5vbi1uZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotICAgP0QJbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID93CXdpZGUgbW9kZSBub24tbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID9XCXdpZGUgbW9kZSBuZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotCi0gICA/cyAgIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucwotICAgP1MJNjQgYml0IGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucwotICAgP3QgICBub24tbmVnYXRlZCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9ucwotICAgP24gICAzMiBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeQotICAgP04gICA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeQotICAgP1EJNjQgYml0IGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb25zIGZvciBDTVBJQiBpbnN0cnVjdGlvbgotCi0gICA/bCAgIGxvZ2ljYWwgY29uZGl0aW9ucwotICAgP0wJNjQgYml0IGxvZ2ljYWwgY29uZGl0aW9ucwotCi0gICA/YiAgIGJyYW5jaCBvbiBiaXQgY29uZGl0aW9ucwotICAgP0IJNjQgYml0IGJyYW5jaCBvbiBiaXQgY29uZGl0aW9ucwotCi0gICA/eCAgIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zCi0gICA/WAk2NCBiaXQgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMKLSAgID95ICAgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeSBmb3IgY29uZGl0aW9uYWwKLSAgICAgICAgYnJhbmNoZXMKLQotICAgP3UgICB1bml0IGNvbmRpdGlvbnMKLSAgID9VICAgNjQgYml0IHVuaXQgY29uZGl0aW9ucwotCi1GbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYWxsIGhhdmUgJ2YnIGFzIGEgcHJlZml4OgotCi0gICBmdAl0YXJnZXQgcmVnaXN0ZXIgYXQgMzEKLSAgIGZUCXRhcmdldCByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMzEKLSAgIGZhCW9wZXJhbmQgMSByZWdpc3RlciBhdCAxMAotICAgZkEgICBvcGVyYW5kIDEgcmVnaXN0ZXIgd2l0aCBML1IgaGFsdmVzIGF0IDEwCi0gICBmWCAgIFNhbWUgYXMgZkEsIGV4Y2VwdCBwcmludHMgYSBzcGFjZSBiZWZvcmUgcmVnaXN0ZXIgZHVyaW5nIGRpc2FzbQotICAgZmIJb3BlcmFuZCAyIHJlZ2lzdGVyIGF0IDE1Ci0gICBmQiAgIG9wZXJhbmQgMiByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMTUKLSAgIGZDICAgb3BlcmFuZCAzIHJlZ2lzdGVyIHdpdGggTC9SIGhhbHZlcyBhdCAxNjoxOCwyMToyMwotICAgZmUgICBMaWtlIGZULCBidXQgZW5jb2RpbmcgaXMgZGlmZmVyZW50LgotICAgZkUgICBTYW1lIGFzIGZlLCBleGNlcHQgcHJpbnRzIGEgc3BhY2UgYmVmb3JlIHJlZ2lzdGVyIGR1cmluZyBkaXNhc20uCi0gICBmeAl0YXJnZXQgcmVnaXN0ZXIgYXQgMTUgKG9ubHkgZm9yIFBBIDIuMCBsb25nIGZvcm1hdCBGTEREL0ZTVEQpLiAKLQotRmxvYXQgcmVnaXN0ZXJzIGZvciBmbXB5YWRkIGFuZCBmbXB5c3ViOgotCi0gICBmaQltdWx0IG9wZXJhbmQgMSByZWdpc3RlciBhdCAxMAotICAgZmoJbXVsdCBvcGVyYW5kIDIgcmVnaXN0ZXIgYXQgMTUKLSAgIGZrCW11bHQgdGFyZ2V0IHJlZ2lzdGVyIGF0IDIwCi0gICBmbAlhZGQvc3ViIG9wZXJhbmQgcmVnaXN0ZXIgYXQgMjUKLSAgIGZtCWFkZC9zdWIgdGFyZ2V0IHJlZ2lzdGVyIGF0IDMxCi0KLSovCi0KLQotLyogTGlzdCBvZiBjaGFyYWN0ZXJzIG5vdCB0byBwdXQgYSBzcGFjZSBhZnRlci4gIE5vdGUgdGhhdAotICAgIiwiIGlzIGluY2x1ZGVkLCBhcyB0aGUgInNwb3BOIiBvcGVyYXRpb25zIHVzZSBsaXRlcmFsCi0gICBjb21tYXMgaW4gdGhlaXIgY29tcGxldGVyIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wbGV0ZXJfY2hhcnMgPSAiLENjWTw+PyFAKyZVfkZmR0hJTm5Pb1pNYWR1fC89MDEyMyVlJG19IjsKLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0KLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBhX29wY29kZSBwYV9vcGNvZGVzW10gPQotewotCi0vKiBQc2V1ZG8taW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyAibGRpIiwJMHgzNDAwMDAwMCwgMHhmZmUwYzAwMCwgImoseCIsIHBhMTAsIDB9LC8qIGxkbyB2YWwocjApLHIgKi8KLQoteyAiY2FsbCIsCTB4ZTgwMGYwMDAsIDB4ZmMxZmZmZmQsICJuKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY2FsbCIsCTB4ZTgwMGEwMDAsIDB4ZmZlMGUwMDAsICJuVyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInJldCIsCTB4ZTg0MGQwMDAsIDB4ZmZmZmZmZmQsICJuIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi17ICJjbXBpYiIsIAkweGVjMDAwMDAwLCAweGZjMDAwMDAwLCAiP1FuNSxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBpYiIsIAkweDg0MDAwMDAwLCAweGY0MDAwMDAwLCAiP25uNSxiLHciLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21pYiIsIAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLCAiP25uNSxiLHciLCBwYTEwLCAwfSwgLyogY29taWJ7dGZ9Ki8KLS8qIFRoaXMgZW50cnkgaXMgZm9yIHRoZSBkaXNhc3NlbWJsZXIgb25seS4gIEl0IHdpbGwgbmV2ZXIgYmUgdXNlZCBieQotICAgYXNzZW1ibGVyLiAgKi8KLXsgImNvbWliIiwgCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bm41LGIsdyIsIHBhMTAsIDB9LCAvKiBjb21pYnt0Zn0qLwoteyAiY21wYiIsCTB4OWMwMDAwMDAsIDB4ZGMwMDAwMDAsICI/Tm54LGIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNtcGIiLAkweDgwMDAwMDAwLCAweGY0MDAwMDAwLCAiP25ueCxiLHciLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21iIiwJMHg4MDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubngsYix3IiwgcGExMCwgMH0sIC8qIGNvbWJ7dGZ9ICovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21iIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubngsYix3IiwgcGExMCwgMH0sIC8qIGNvbWJ7dGZ9ICovCi17ICJhZGRiIiwJMHhhMDAwMDAwMCwgMHhmNDAwMDAwMCwgIj9XbngsYix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkYiIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG54LGIsdyIsIHBhMTAsIDB9LCAvKiBhZGRie3RmfSAqLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkYiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG54LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkaWIiLAkweGE0MDAwMDAwLCAweGY0MDAwMDAwLCAiP1duNSxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG41LGIsdyIsIHBhMTAsIDB9LCAvKiBhZGRpYnt0Zn0qLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkaWIiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLCAiP0BuNSxiLHciLCBwYTEwLCAwfSwgLyogYWRkaWJ7dGZ9Ki8KLXsgIm5vcCIsICAgICAgICAweDA4MDAwMjQwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sICAgICAgLyogb3IgMCwwLDAgKi8KLXsgImNvcHkiLCAgICAgICAweDA4MDAwMjQwLCAweGZmZTBmZmUwLCAieCx0IiwgcGExMCwgMH0sICAgLyogb3IgciwwLHQgKi8KLXsgIm10c2FyIiwgICAgICAweDAxNjAxODQwLCAweGZmZTBmZmZmLCAieCIsIHBhMTAsIDB9LCAvKiBtdGN0bCByLGNyMTEgKi8KLQotLyogTG9hZHMgYW5kIFN0b3JlcyBmb3IgaW50ZWdlciByZWdpc3RlcnMuICAqLwotCi17ICJsZGQiLAkweDBjMDAxMGUwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwJMHgwYzAwMTBlMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLCAgICAgICAgMHgwYzAwMDBjMCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDBjMDAwMGMwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsCTB4MGMwMDEwYzAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLAkweDBjMDAxMGMwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDUwMDAwMDAwLCAweGZjMDAwMDAyLCAiY3EmKGIpLHgiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwgICAgICAgIDB4NTAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcSMoYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAibChiKSx4IiwgcGEyMHcsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTBhMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwYTAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTA4MCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwODAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZUoocyxiKSx4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZUooYikseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDVjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2VLKHMsYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDVjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2VLKGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHciLCAgICAgICAgMHg0ODAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAibGRoIiwgICAgICAgIDB4NDQwMDAwMDAsIDB4ZmMwMDAwMDAsICJsKGIpLHgiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwgICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLCAgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDYwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA2MCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDQwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA0MCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJsKGIpLHgiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwgICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLCAgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDIwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAwMCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAic3RkIiwJMHgwYzAwMTJlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsCTB4MGMwMDEyZTAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwJMHgwYzAwMTJjMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsCTB4MGMwMDEyYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwgICAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMDAwMDIsICJjcXgsJihiKSIsIHBhMjB3LCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLCAgICAgICAgMHg3MDAwMDAwMCwgMHhmYzAwMDAwMiwgImNxeCwjKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGwoYikiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTJhMCwgMHhmYzAwMTNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyYTAsIDB4ZmMwMDEzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTI4MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyODAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZXgsSihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZXgsSihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDdjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2V4LEsocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDdjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2V4LEsoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMCwgMH0sCi17ICJzdHciLCAgICAgICAgMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTAsIDB9LAoteyAic3RoIiwgICAgICAgIDB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGwoYikiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwJMHgwYzAwMTI2MCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsCTB4MGMwMDEyNjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwJMHgwYzAwMTI0MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsCTB4MGMwMDEyNDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwgICAgICAgIDB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3RoIiwgICAgICAgIDB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgInN0YiIsICAgICAgICAweDYwMDAwMDAwLCAweGZjMDAwMDAwLCAieCxsKGIpIiwgcGEyMHcsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsCTB4MGMwMDEyMjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLAkweDBjMDAxMjIwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsCTB4MGMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLAkweDBjMDAxMjAwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsICAgICAgICAweDYwMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0YiIsICAgICAgICAweDYwMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMCwgMH0sCi17ICJsZHdtIiwgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHdtIiwgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAic3R3bSIsICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3R3bSIsICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGh4IiwgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJ4IiwgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd2EiLCAgICAgICAweDBjMDAwMTgwLCAweGZjMDBkM2MwLCAiY3hjY3goYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkd2EiLAkweDBjMDAxMTgwLCAweGZjMDBkM2MwLCAiY21jYzUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY3ciLCAgICAgICAweDBjMDAwMWMwLCAweGZjMDAxM2MwLCAiY3hjZHgocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsICAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDEzYzAsICJjeGNkeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsCTB4MGMwMDExYzAsIDB4ZmMwMDEzYzAsICJjbWNkNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGN3IiwJMHgwYzAwMTFjMCwgMHhmYzAwMTNjMCwgImNtY2Q1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHdhIiwJMHgwYzAwMTNhMCwgMHhmYzAwZDNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHdhIiwJMHgwYzAwMTM4MCwgMHhmYzAwZDNjMCwgImNtY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGJ5IiwJMHgwYzAwMTMwMCwgMHhmYzAwMTNjMCwgImNzY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YnkiLAkweDBjMDAxMzAwLCAweGZjMDAxM2MwLCAiY3NjQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZGEiLCAgICAgICAweDBjMDAwMTAwLCAweGZjMDBkM2MwLCAiY3hjY3goYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZGEiLAkweDBjMDAxMTAwLCAweGZjMDBkM2MwLCAiY21jYzUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY2QiLCAgICAgICAweDBjMDAwMTQwLCAweGZjMDAxM2MwLCAiY3hjZHgocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsICAgICAgIDB4MGMwMDAxNDAsIDB4ZmMwMDEzYzAsICJjeGNkeChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsCTB4MGMwMDExNDAsIDB4ZmMwMDEzYzAsICJjbWNkNShzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGNkIiwJMHgwYzAwMTE0MCwgMHhmYzAwMTNjMCwgImNtY2Q1KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRhIiwJMHgwYzAwMTNlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2UwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2MwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYSIsCTB4MGMwMDEzYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3YXgiLCAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGRmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd3MiLAkweDBjMDAxMDgwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkaHMiLAkweDBjMDAxMDQwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdhcyIsCTB4MGMwMDExODAsIDB4ZmMwMGRmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3MiLAkweDBjMDAxMWMwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3MiLAkweDBjMDAxMWMwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiY214LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3R3cyIsCTB4MGMwMDEyODAsIDB4ZmMwMDFmYzAsICJjbXgsVihiKSIsIHBhMTAsIDB9LAoteyAic3RocyIsCTB4MGMwMDEyNDAsIDB4ZmMwMDFmYzAsICJjbXgsVihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNteCxWKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiY214LFYoYikiLCBwYTEwLCAwfSwKLXsgInN0d2FzIiwJMHgwYzAwMTM4MCwgMHhmYzAwZGZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdGRieSIsCTB4MGMwMDEzNDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRieSIsCTB4MGMwMDEzNDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiY3N4LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiY3N4LFYoYikiLCBwYTEwLCAwfSwKLQotLyogSW1tZWRpYXRlIGluc3RydWN0aW9ucy4gICovCi17ICJsZG8iLAkweDM0MDAwMDAwLCAweGZjMDBjMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJsZGlsIiwJMHgyMDAwMDAwMCwgMHhmYzAwMDAwMCwgImssYiIsIHBhMTAsIDB9LAoteyAiYWRkaWwiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLCAiayxiLFoiLCBwYTEwLCAwfSwKLXsgImFkZGlsIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwgImssYiIsIHBhMTAsIDB9LAotCi0vKiBCcmFuY2hpbmcgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImIiLAkJMHhlODAwODAwMCwgMHhmYzAwZTAwMCwgImNwblhMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYiIsCQkweGU4MDBhMDAwLCAweGZjMDBlMDAwLCAiY2xuWEwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJjbG5XLGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDIwMDAsIDB4ZmMwMGUwMDAsICJjZ25XLGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMDAwMDAsIDB4ZmZlMGUwMDAsICJuVyIsIHBhMTAsIDB9LCAgLyogYixsIGZvbyxyMCAqLwoteyAiYmwiLAkJMHhlODAwMDAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwLCAwfSwKLXsgImdhdGUiLAkweGU4MDAyMDAwLCAweGZjMDBlMDAwLCAiblcsYiIsIHBhMTAsIDB9LAoteyAiYmxyIiwJMHhlODAwNDAwMCwgMHhmYzAwZTAwMSwgIm54LGIiLCBwYTEwLCAwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJueChiKSIsIHBhMTAsIDB9LAoteyAiYnYiLAkJMHhlODAwYzAwMCwgMHhmYzAwZmZmZCwgIm4oYikiLCBwYTEwLCAwfSwKLXsgImJ2ZSIsCTB4ZTgwMGYwMDEsIDB4ZmMxZmZmZmQsICJjcG4oYilMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYnZlIiwJMHhlODAwZjAwMCwgMHhmYzFmZmZmZCwgImNsbihiKUwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJidmUiLAkweGU4MDBkMDAxLCAweGZjMWZmZmZkLCAiY1BuKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYnZlIiwJMHhlODAwZDAwMCwgMHhmYzFmZmZmZCwgIm4oYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJiZSIsCQkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAiY2xueihTLGIpLFkiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiZSIsCQkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAiY2xueihiKSxZIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYmUiLAkJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwLCAwfSwKLXsgImJlIiwJCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsICJueihiKSIsIHBhMTAsIDB9LAoteyAiYmxlIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwLCAwfSwKLXsgIm1vdmIiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLCAiP3lueCxiLHciLCBwYTEwLCAwfSwKLXsgIm1vdmliIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj95bjUsYix3IiwgcGExMCwgMH0sCi17ICJjb21idCIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG54LGIsdyIsIHBhMTAsIDB9LAoteyAiY29tYmYiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiP3RueCxiLHciLCBwYTEwLCAwfSwKLXsgImNvbWlidCIsCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG41LGIsdyIsIHBhMTAsIDB9LAoteyAiY29taWJmIiwJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwgIj90bjUsYix3IiwgcGExMCwgMH0sCi17ICJhZGRidCIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG54LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkYmYiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLCAiP2RueCxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGlidCIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG41LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkaWJmIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj9kbjUsYix3IiwgcGExMCwgMH0sCi17ICJiYiIsCQkweGMwMDA2MDAwLCAweGZmZTA2MDAwLCAiP0JueCwhLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sIAoteyAiYmIiLAkJMHhjNDAwNDAwMCwgMHhmYzAwNDAwMCwgIj9CbngsQix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LCAKLXsgImJiIiwJCTB4YzAwMDQwMDAsIDB4ZmZlMDYwMDAsICI/Ym54LCEsdyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwgCi17ICJiYiIsCQkweGM0MDA0MDAwLCAweGZjMDA0MDAwLCAiP2JueCxRLHciLCBwYTEwLCAwfSwgCi17ICJidmIiLAkweGMwMDA0MDAwLCAweGZmZTA0MDAwLCAiP2JueCx3IiwgcGExMCwgMH0sCi17ICJjbHJidHMiLAkweGU4MDA0MDA1LCAweGZmZmZmZmZmLCAiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicG9wYnRzIiwJMHhlODAwNDAwNSwgMHhmZmZmZjAwNywgIiQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwdXNobm9tIiwJMHhlODAwNDAwMSwgMHhmZmZmZmZmZiwgIiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInB1c2hidHMiLAkweGU4MDA0MDAxLCAweGZmZTBmZmZmLCAieCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotLyogQ29tcHV0YXRpb24gSW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyAiY21wY2xyIiwgICAgIDB4MDgwMDA4YTAsIDB4ZmMwMDBmZTAsICI/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY21wY2xyIiwgICAgIDB4MDgwMDA4ODAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY29tY2xyIiwgICAgIDB4MDgwMDA4ODAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJvciIsICAgICAgICAgMHgwODAwMDI2MCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJvciIsICAgICAgICAgMHgwODAwMDI0MCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMmEwLCAweGZjMDAwZmUwLCAiP0x4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMjgwLCAweGZjMDAwZmUwLCAiP2x4LGIsdCIsIHBhMTAsIDB9LAoteyAiYW5kIiwgICAgICAgIDB4MDgwMDAyMjAsIDB4ZmMwMDBmZTAsICI/THgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYW5kIiwgICAgICAgIDB4MDgwMDAyMDAsIDB4ZmMwMDBmZTAsICI/bHgsYix0IiwgcGExMCwgMH0sCi17ICJhbmRjbSIsICAgICAgMHgwODAwMDAyMCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhbmRjbSIsICAgICAgMHgwODAwMDAwMCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwM2EwLCAweGZjMDAwZmUwLCAiP1V4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwMzgwLCAweGZjMDAwZmUwLCAiP3V4LGIsdCIsIHBhMTAsIDB9LAoteyAidWFkZGNtIiwgICAgIDB4MDgwMDA5YTAsIDB4ZmMwMDBmYTAsICJjVD9VeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZhMCwgImNUP3V4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInVhZGRjbSIsICAgICAweDA4MDAwOTgwLCAweGZjMDAwZmUwLCAiP3V4LGIsdCIsIHBhMTAsIDB9LAoteyAidWFkZGNtdCIsICAgIDB4MDgwMDA5YzAsIDB4ZmMwMDBmZTAsICI/dXgsYix0IiwgcGExMCwgMH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGJhMCwgMHhmYzFmMGZhMCwgImNpP1ViLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGI4MCwgMHhmYzFmMGZhMCwgImNpP3ViLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGI4MCwgMHhmYzFmMGZlMCwgIj91Yix0IiwgICBwYTEwLCAwfSwKLXsgImlkY29yIiwgICAgICAweDA4MDAwYmMwLCAweGZjMWYwZmUwLCAiP3ViLHQiLCAgIHBhMTAsIDB9LAoteyAiYWRkaSIsICAgICAgIDB4YjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJjdD9haSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRpIiwgICAgICAgMHhiNDAwMDAwMCwgMHhmYzAwMDAwMCwgImN2P2FpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZGkiLCAgICAgICAweGI0MDAwMDAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkaW8iLCAgICAgIDB4YjQwMDA4MDAsIDB4ZmMwMDA4MDAsICI/YWksYix4IiwgcGExMCwgMH0sCi17ICJhZGRpdCIsICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9haSxiLHgiLCBwYTEwLCAwfSwKLXsgImFkZGl0byIsICAgICAweGIwMDAwODAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDA3MjAsIDB4ZmMwMDA3ZTAsICJjWT9BeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDcwMCwgMHhmYzAwMDdlMCwgImN5P2F4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwMjIwLCAweGZjMDAwM2UwLCAiY2E/QXgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDAyMDAsIDB4ZmMwMDAzZTAsICJjYT9heCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDYwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZGwiLCAgICAgICAweDA4MDAwYTAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAiYWRkbyIsICAgICAgIDB4MDgwMDBlMDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJhZGRjIiwgICAgICAgMHgwODAwMDcwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZGNvIiwgICAgICAweDA4MDAwZjAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0ZTAsIDB4ZmMwMDA3ZTAsICJjdD9TeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDRjMCwgMHhmYzAwMDdlMCwgImN0P3N4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNTIwLCAweGZjMDAwN2UwLCAiY0I/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA1MDAsIDB4ZmMwMDA3ZTAsICJjYj9zeCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDQyMCwgMHhmYzAwMDdlMCwgImN2P1N4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNDAwLCAweGZjMDAwN2UwLCAiY3Y/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJvIiwgICAgICAgMHgwODAwMGMwMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YmIiLCAgICAgICAweDA4MDAwNTAwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViYm8iLCAgICAgIDB4MDgwMDBkMDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJ0IiwgICAgICAgMHgwODAwMDRjMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YnRvIiwgICAgICAweDA4MDAwY2MwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAiZHMiLCAgICAgICAgIDB4MDgwMDA0NDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJpIiwgICAgICAgMHg5NDAwMDAwMCwgMHhmYzAwMDAwMCwgImN2P3NpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwODAwLCAiP3NpLGIseCIsIHBhMTAsIDB9LAoteyAic3ViaW8iLCAgICAgIDB4OTQwMDA4MDAsIDB4ZmMwMDA4MDAsICI/c2ksYix4IiwgcGExMCwgMH0sCi17ICJjbXBpY2xyIiwgICAgMHg5MDAwMDgwMCwgMHhmYzAwMDgwMCwgIj9TaSxiLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBpY2xyIiwgICAgMHg5MDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21pY2xyIiwgICAgMHg5MDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCAwfSwKLXsgInNobGFkZCIsICAgICAweDA4MDAwMjIwLCAweGZjMDAwMzIwLCAiY2E/QXgsLixiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzaGxhZGQiLCAgICAgMHgwODAwMDIwMCwgMHhmYzAwMDMyMCwgImNhP2F4LC4sYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic2gxYWRkIiwgICAgIDB4MDgwMDA2NDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDFhZGRsIiwgICAgMHgwODAwMGE0MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMWFkZG8iLCAgICAweDA4MDAwZTQwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gyYWRkIiwgICAgIDB4MDgwMDA2ODAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDJhZGRsIiwgICAgMHgwODAwMGE4MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMmFkZG8iLCAgICAweDA4MDAwZTgwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gzYWRkIiwgICAgIDB4MDgwMDA2YzAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDNhZGRsIiwgICAgMHgwODAwMGFjMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoM2FkZG8iLCAgICAweDA4MDAwZWMwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAotCi0vKiBTdWJ3b3JkIE9wZXJhdGlvbiBJbnN0cnVjdGlvbnMuICAqLwotCi17ICJoYWRkIiwgICAgICAgMHgwODAwMDMwMCwgMHhmYzAwZmYyMCwgImNIeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoYXZnIiwgICAgICAgMHgwODAwMDJjMCwgMHhmYzAwZmZlMCwgIngsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHNobCIsICAgICAgIDB4ZjgwMDg4MDAsIDB4ZmZlMGZjMjAsICJ4LCosdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaGxhZGQiLCAgICAweDA4MDAwNzAwLCAweGZjMDBmZjIwLCAieCwuLGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaHIiLCAgICAgICAweGY4MDBjODAwLCAweGZjMWZmODIwLCAiY1NiLCosdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaHJhZGQiLCAgICAweDA4MDAwNTAwLCAweGZjMDBmZjIwLCAieCwuLGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzdWIiLCAgICAgICAweDA4MDAwMTAwLCAweGZjMDBmZjIwLCAiY0h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1peGgiLCAgICAgICAweGY4MDA4NDAwLCAweGZjMDA5ZmUwLCAiY2h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1peHciLCAgICAgICAweGY4MDA4MDAwLCAweGZjMDA5ZmUwLCAiY2h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBlcm1oIiwgICAgICAweGY4MDAwMDAwLCAweGZjMDA5MDIwLCAiYyphLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLQotLyogRXh0cmFjdCBhbmQgRGVwb3NpdCBJbnN0cnVjdGlvbnMuICAqLwotCi17ICJzaHJwZCIsICAgICAgMHhkMDAwMDIwMCwgMHhmYzAwMWZlMCwgIj9YeCxiLCEsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInNocnBkIiwgICAgICAweGQwMDAwNDAwLCAweGZjMDAxNDAwLCAiP1h4LGIsfix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic2hycHciLCAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI/eHgsYiwhLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzaHJwdyIsICAgICAgMHhkMDAwMDgwMCwgMHhmYzAwMWMwMCwgIj94eCxiLHAsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInZzaGQiLCAgICAgICAweGQwMDAwMDAwLCAweGZjMDAxZmUwLCAiP3h4LGIsdCIsIHBhMTAsIDB9LAoteyAic2hkIiwgICAgICAgIDB4ZDAwMDA4MDAsIDB4ZmMwMDFjMDAsICI/eHgsYixwLHQiLCBwYTEwLCAwfSwKLXsgImV4dHJkIiwgICAgICAweGQwMDAxMjAwLCAweGZjMDAxYWUwLCAiY1M/WGIsISwlLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJleHRyZCIsICAgICAgMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgImNTP1hiLHEsfCx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZXh0cnciLCAgICAgIDB4ZDAwMDEwMDAsIDB4ZmMwMDFiZTAsICJjUz94YiwhLFQseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImV4dHJ3IiwgICAgICAweGQwMDAxODAwLCAweGZjMDAxODAwLCAiY1M/eGIsUCxULHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJ2ZXh0cnUiLCAgICAgMHhkMDAwMTAwMCwgMHhmYzAwMWZlMCwgIj94YixULHgiLCBwYTEwLCAwfSwKLXsgInZleHRycyIsICAgICAweGQwMDAxNDAwLCAweGZjMDAxZmUwLCAiP3hiLFQseCIsIHBhMTAsIDB9LAoteyAiZXh0cnUiLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDFjMDAsICI/eGIsUCxULHgiLCBwYTEwLCAwfSwKLXsgImV4dHJzIiwgICAgICAweGQwMDAxYzAwLCAweGZjMDAxYzAwLCAiP3hiLFAsVCx4IiwgcGExMCwgMH0sCi17ICJkZXBkIiwgICAgICAgMHhkNDAwMDIwMCwgMHhmYzAwMWFlMCwgImN6P1h4LCEsJSxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwZCIsICAgICAgIDB4ZjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJjej9YeCx+LHwsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcGRpIiwgICAgICAweGQ0MDAxMjAwLCAweGZjMDAxYWUwLCAiY3o/WDUsISwlLGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkZXBkaSIsICAgICAgMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgImN6P1g1LH4sfCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwdyIsICAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFiZTAsICJjej94eCwhLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcHciLCAgICAgICAweGQ0MDAwODAwLCAweGZjMDAxODAwLCAiY3o/eHgscCxULGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkZXB3aSIsICAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWJlMCwgImN6P3g1LCEsVCxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwd2kiLCAgICAgIDB4ZDQwMDE4MDAsIDB4ZmMwMDE4MDAsICJjej94NSxwLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInp2ZGVwIiwgICAgICAweGQ0MDAwMDAwLCAweGZjMDAxZmUwLCAiP3h4LFQsYiIsIHBhMTAsIDB9LAoteyAidmRlcCIsICAgICAgIDB4ZDQwMDA0MDAsIDB4ZmMwMDFmZTAsICI/eHgsVCxiIiwgcGExMCwgMH0sCi17ICJ6ZGVwIiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMWMwMCwgIj94eCxwLFQsYiIsIHBhMTAsIDB9LAoteyAiZGVwIiwgICAgICAgIDB4ZDQwMDBjMDAsIDB4ZmMwMDFjMDAsICI/eHgscCxULGIiLCBwYTEwLCAwfSwKLXsgInp2ZGVwaSIsICAgICAweGQ0MDAxMDAwLCAweGZjMDAxZmUwLCAiP3g1LFQsYiIsIHBhMTAsIDB9LAoteyAidmRlcGkiLCAgICAgIDB4ZDQwMDE0MDAsIDB4ZmMwMDFmZTAsICI/eDUsVCxiIiwgcGExMCwgMH0sCi17ICJ6ZGVwaSIsICAgICAgMHhkNDAwMTgwMCwgMHhmYzAwMWMwMCwgIj94NSxwLFQsYiIsIHBhMTAsIDB9LAoteyAiZGVwaSIsICAgICAgIDB4ZDQwMDFjMDAsIDB4ZmMwMDFjMDAsICI/eDUscCxULGIiLCBwYTEwLCAwfSwKLQotLyogU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyAiYnJlYWsiLCAgICAgIDB4MDAwMDAwMDAsIDB4ZmMwMDFmZTAsICJyLEEiLCBwYTEwLCAwfSwKLXsgInJmaSIsICAgICAgICAweDAwMDAwYzAwLCAweGZmZmZmZjFmLCAiY3IiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAicmZpciIsICAgICAgIDB4MDAwMDBjYTAsIDB4ZmZmZmZmZmYsICIiLCBwYTExLCAwfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZjMDBmZmUwLCAiVSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3NtIiwgICAgICAgIDB4MDAwMDBkNjAsIDB4ZmZlMGZmZTAsICJSLHQiLCBwYTEwLCAwfSwKLXsgInJzbSIsICAgICAgICAweDAwMDAwZTYwLCAweGZjMDBmZmUwLCAiVSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicnNtIiwgICAgICAgIDB4MDAwMDBlNjAsIDB4ZmZlMGZmZTAsICJSLHQiLCBwYTEwLCAwfSwKLXsgIm10c20iLCAgICAgICAweDAwMDAxODYwLCAweGZmZTBmZmZmLCAieCIsIHBhMTAsIDB9LAoteyAibGRzaWQiLCAgICAgIDB4MDAwMDEwYTAsIDB4ZmMxZjNmZTAsICIocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihiKSx0IiwgcGExMCwgMH0sCi17ICJtdHNwIiwgICAgICAgMHgwMDAwMTgyMCwgMHhmZmUwMWZmZiwgIngsUyIsIHBhMTAsIDB9LAoteyAibXRjdGwiLCAgICAgIDB4MDAwMDE4NDAsIDB4ZmMwMGZmZmYsICJ4LF4iLCBwYTEwLCAwfSwKLXsgIm10c2FyY20iLCAgICAweDAxNjAxOEMwLCAweGZmZTBmZmZmLCAieCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1maWEiLCAgICAgICAweDAwMDAxNEEwLCAweGZmZmZmZmUwLCAidCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1mc3AiLCAgICAgICAweDAwMDAwNGEwLCAweGZmZmYxZmUwLCAiUyx0IiwgcGExMCwgMH0sCi17ICJtZmN0bCIsICAgICAgMHgwMTYwNDhhMCwgMHhmZmZmZmZlMCwgImNXISx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWZjdGwiLCAgICAgIDB4MDAwMDA4YTAsIDB4ZmMxZmZmZTAsICJeLHQiLCBwYTEwLCAwfSwKLXsgInN5bmMiLCAgICAgICAweDAwMDAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJzeW5jZG1hIiwgICAgMHgwMDEwMDQwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAicHJvYmUiLCAgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmYTAsICJjdyhzLGIpLHgsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlIiwgICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmEwLCAiY3coYikseCx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmVpIiwgICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmYTAsICJjdyhzLGIpLFIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlaSIsICAgICAweDA0MDAzMTgwLCAweGZjMDAzZmEwLCAiY3coYiksUix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2JlciIsICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwLCAwfSwKLXsgInByb2JlcmkiLCAgICAweDA0MDAzMTgwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2JldyIsICAgICAweDA0MDAxMWMwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwLCAwfSwKLXsgInByb2Jld2kiLCAgICAweDA0MDAzMWMwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTAsIDB9LAoteyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJjWngocyxiKSx0IiwgcGExMCwgMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgImNaeChiKSx0IiwgcGExMCwgMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgImNaeChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxoYSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmMwLCAiY1p4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChiKSx0IiwgcGExMCwgMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTYwMCwgMHhmYzAwM2ZkZiwgImNMY1p4KHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTYwMCwgMHhmYzAwM2ZkZiwgImNMY1p4KGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwNjAwLCAweGZjMDAxZmRmLCAiY0xjWngoUyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwNjAwLCAweGZjMDAxZmRmLCAiY0xjWngoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiY1p4KFMsYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwLCAwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTAsIDB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTAsIDB9LAoteyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMCwgMH0sCi17ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwLCAwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJjWngoUyxiKSIsIHBhMTAsIDB9LAoteyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZGlhZyIsICAgICAgIDB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJEIiwgcGExMCwgMH0sCi17ICJpZHRsYnQiLCAgICAgMHgwNDAwMTgwMCwgMHhmYzAwZmZmZiwgIngsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImlpdGxidCIsICAgICAweDA0MDAwODAwLCAweGZjMDBmZmZmLCAieCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi0vKiBUaGVzZSBtYXkgYmUgc3BlY2lmaWMgdG8gY2VydGFpbiB2ZXJzaW9ucyBvZiB0aGUgUEEuICBKb2VsIGNsYWltZWQKLSAgIHRoZXkgd2VyZSA3MjAwMCAoNzIwMD8pIHNwZWNpZmljLiAgSG93ZXZlciwgSSdtIGFsbW9zdCBjZXJ0YWluIHRoZQotICAgbXRjcHUvbWZjcHUgd2VyZSB1bmRvY3VtZW50ZWQsIGJ1dCBhdmFpbGFibGUgaW4gdGhlIG9sZGVyIDcwMCBtYWNoaW5lcy4gICovCi17ICJtdGNwdSIsICAgICAgMHgxNDAwMTYwMCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTAsIDB9LAoteyAibWZjcHUiLCAgICAgIDB4MTQwMDFBMDAsIDB4ZmMwMGZmZmYsICJeLHgiLCBwYTEwLCAwfSwKLXsgInRvY2VuIiwgICAgICAweDE0NDAzNjAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJ0b2NkaXMiLCAgICAgMHgxNDQwMTYyMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAic2hkd2dyIiwgICAgIDB4MTQ0MDI2MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgImdyc2hkdyIsICAgICAweDE0NDAwNjIwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi0KLS8qIGdmdyBhbmQgZ2ZyIGFyZSBub3QgaW4gdGhlIEhQIFBBIDEuMSBtYW51YWwsIGJ1dCB0aGV5IGFyZSBpbiBlaXRoZXIKLSAgIHRoZSBUaW1leCBGUFUgb3IgdGhlIE11c3RhbmcgRVJTIChub3Qgc3VyZSB3aGljaCkgbWFudWFsLiAgKi8KLXsgImdmdyIsCTB4MDQwMDE2ODAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTEsIDB9LAoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTEsIDB9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMSwgMH0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMSwgMH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IENvcHJvY2Vzc29yIEluc3RydWN0aW9ucy4gICovCi0gCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAyMCwgMHhmYzFmMzNhMCwgImNvY2NAKHMsYiksZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAyMCwgMHhmYzFmMzNhMCwgImNvY2NAKGIpLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDEzODAsICJjeGNjeChzLGIpLGZUIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDEzODAsICJjeGNjeChiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxMzgwLCAiY21jYzUocyxiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxMzgwLCAiY21jYzUoYiksZlQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHg1YzAwMDAwMCwgMHhmYzAwMDAwNCwgInkoYiksZmUiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJjSnkoYiksZmUiLCBwYTIwdywgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NWMwMDAwMDAsIDB4ZmMwMDAwMDQsICJkKGIpLGZlIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJjSmQoYiksZmUiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksZnQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLGZ0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLGZ0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksZnQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHg1MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxJihiKSxmeCIsIHBhMjB3LCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHg1MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxIyhiKSxmeCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjIwLCAweGZjMWYzM2EwLCAiY29jQ2ZULEAocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjIwLCAweGZjMWYzM2EwLCAiY29jQ2ZULEAoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMTM4MCwgImN4Y0NmVCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMTM4MCwgImN4Y0NmVCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDEzODAsICJjbWNDZlQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDEzODAsICJjbWNDZlQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDdjMDAwMDAwLCAweGZjMDAwMDA0LCAiZkUseShiKSIsIHBhMjB3LCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3ODAwMDAwMCwgMHhmYzAwMDAwMCwgImNKZmUseShiKSIsIHBhMjB3LCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3YzAwMDAwMCwgMHhmYzAwMDAwNCwgImZlLGQoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3ODAwMDAwMCwgMHhmYzAwMDAwMCwgImNKZmUsZChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjIwLCAweGZjMWYzM2UwLCAiY29jQ2Z0LEAocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjIwLCAweGZjMWYzM2UwLCAiY29jQ2Z0LEAoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMTNjMCwgImN4Y0NmdCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMTNjMCwgImN4Y0NmdCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDZnQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDZnQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDcwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3FmeCwmKGIpIiwgcGEyMHcsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDcwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3FmeCwjKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFmODAsICJjeHgocyxiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFmODAsICJjeHgoYiksZlQiLCBwYTEwLCAwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksZnQiLCBwYTEwLCAwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KGIpLGZ0IiwgcGExMCwgMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN4ZlQseChzLGIpIiwgcGExMCwgMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN4ZlQseChiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgoYikiLCBwYTEwLCAwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KGIpIiwgcGExMCwgMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgImNtNShzLGIpLGZUIiwgcGExMCwgMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgImNtNShiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSxmdCIsIHBhMTAsIDB9LAoteyAiZmxkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUoYiksZnQiLCBwYTEwLCAwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiY21mVCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiY21mVCw1KGIpIiwgcGExMCwgMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXMiLCAgICAgIDB4M2MwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXMiLCAgICAgIDB4M2MwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUoYikiLCBwYTEwLCAwfSwKLXsgImZhZGQiLCAgICAgICAweDMwMDAwNjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmYWRkIiwgICAgICAgMHgzODAwMDYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnN1YiIsICAgICAgIDB4MzAwMDI2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZzdWIiLCAgICAgICAweDM4MDAyNjAwLCAweGZjMDBlNzIwLCAiSWZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmbXB5IiwgICAgICAgMHgzMDAwNDYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZm1weSIsICAgICAgIDB4MzgwMDQ2MDAsIDB4ZmMwMGU3MjAsICJJZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZkaXYiLCAgICAgICAweDMwMDA2NjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmZGl2IiwgICAgICAgMHgzODAwNjYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzAwMDgwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZzcXJ0IiwgICAgICAweDM4MDA4MDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmYWJzIiwgICAgICAgMHgzMDAwNjAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmFicyIsICAgICAgIDB4MzgwMDYwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZyZW0iLCAgICAgICAweDMwMDA4NjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmcmVtIiwgICAgICAgMHgzODAwODYwMCwgMHhmYzAwZTcyMCwgIkZmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnJuZCIsICAgICAgIDB4MzAwMGEwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZybmQiLCAgICAgICAweDM4MDBhMDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmY3B5IiwgICAgICAgMHgzMDAwNDAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNweSIsICAgICAgIDB4MzgwMDQwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmZiIsICAgICAweDMwMDAwMjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZmIiwgICAgIDB4MzgwMDAyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmY252eGYiLCAgICAgMHgzMDAwODIwMCwgMHhmYzFmODdlMCwgIkZHZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZ4ZiIsICAgICAweDM4MDA4MjAwLCAweGZjMWY4NzIwLCAiRkdmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzAwMTAyMDAsIDB4ZmMxZjg3ZTAsICJGR2ZhLGZUIiwgcGExMCwgMH0sCi17ICJmY252ZngiLCAgICAgMHgzODAxMDIwMCwgMHhmYzFmODcyMCwgIkZHZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmeHQiLCAgICAweDMwMDE4MjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzgwMTgyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmbXB5ZmFkZCIsICAgMHhiODAwMDAwMCwgMHhmYzAwMDAyMCwgIklmQSxmQixmQyxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZtcHluZmFkZCIsICAweGI4MDAwMDIwLCAweGZjMDAwMDIwLCAiSWZBLGZCLGZDLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZyIsICAgICAgIDB4MzAwMGMwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbmVnIiwgICAgICAgMHgzODAwYzAwMCwgMHhmYzFmZTcyMCwgIklmQSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZuZWdhYnMiLCAgICAweDMwMDBlMDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZ2FicyIsICAgIDB4MzgwMGUwMDAsIDB4ZmMxZmU3MjAsICJJZkEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY252IiwgICAgICAgMHgzMDAwMDIwMCwgMHhmYzFjMDcyMCwgIntfZmEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY252IiwgICAgICAgMHgzODAwMDIwMCwgMHhmYzFjMDcyMCwgIkZHZkEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwMDdlMCwgIkY/ZmZhLGZiLGgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwMDcyMCwgIkk/ZmZBLGZCLGgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwZTdlMCwgIkY/ZmZhLGZiIiwgcGExMCwgMH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwZTcyMCwgIkk/ZmZBLGZCIiwgcGExMCwgMH0sCi17ICJ4bXB5dSIsCTB4MzgwMDQ3MDAsIDB4ZmMwMGU3MjAsICJmWCxmQixmVCIsIHBhMTEsIDB9LAoteyAiZm1weWFkZCIsCTB4MTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJIZmksZmosZmssZmwsZm0iLCBwYTExLCAwfSwKLXsgImZtcHlzdWIiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLCAiSGZpLGZqLGZrLGZsLGZtIiwgcGExMSwgMH0sCi17ICJmdGVzdCIsICAgICAgMHgzMDAwMjQyMCwgMHhmZmZmZmZlMCwgIiw9IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnRlc3QiLCAgICAgIDB4MzAwMDA0MjAsIDB4ZmZmZjFmZmYsICJtIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnRlc3QiLCAgICAgIDB4MzAwMDI0MjAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgImZpZCIsICAgICAgICAweDMwMDAwMDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMSwgMH0sCi0KLS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgSW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyAicG1kaXMiLAkweDMwMDAwMjgwLCAweGZmZmZmZmRmLCAiTiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBtZW5iIiwJMHgzMDAwMDY4MCwgMHhmZmZmZmZmZiwgIiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotLyogQXNzaXN0IEluc3RydWN0aW9ucy4gICovCi0KLXsgInNwb3AwIiwgICAgICAweDEwMDAwMDAwLCAweGZjMDAwNjAwLCAidixPTiIsIHBhMTAsIDB9LAoteyAic3BvcDEiLCAgICAgIDB4MTAwMDAyMDAsIDB4ZmMwMDA2MDAsICJ2LG9OdCIsIHBhMTAsIDB9LAoteyAic3BvcDIiLCAgICAgIDB4MTAwMDA0MDAsIDB4ZmMwMDA2MDAsICJ2LDFOYiIsIHBhMTAsIDB9LAoteyAic3BvcDMiLCAgICAgIDB4MTAwMDA2MDAsIDB4ZmMwMDA2MDAsICJ2LDBOeCxiIiwgcGExMCwgMH0sCi17ICJjb3ByIiwgICAgICAgMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwgInUsMk4iLCBwYTEwLCAwfSwKLXsgImNsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgoYikiLCBwYTEwLCAwfSwKLXsgImNzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImNzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShiKSIsIHBhMTAsIDB9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIHBhX29wY29kZXMpLyhzaXplb2YgcGFfb3Bjb2Rlc1swXSkpCi0KLS8qIFNLViAxMi8xOC85Mi4gQWRkZWQgc29tZSBkZW5vdGF0aW9ucyBmb3IgdmFyaW91cyBvcGVyYW5kcy4gICovCi0KLSNkZWZpbmUgUEFfSU1NMTFfQVRfMzEgJ2knCi0jZGVmaW5lIFBBX0lNTTE0X0FUXzMxICdqJwotI2RlZmluZSBQQV9JTU0yMV9BVF8zMSAnaycKLSNkZWZpbmUgUEFfRElTUDEyICd3JwotI2RlZmluZSBQQV9ESVNQMTcgJ1cnCi0KLSNkZWZpbmUgTl9IUFBBX09QRVJBTkRfRk9STUFUUyA1CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pMzcwLmggYi9pbmNsdWRlL29wY29kZS9pMzcwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDQ5ZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTM3MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qIGkzNzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUy8zOTAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFBvd2VyUEMgdmVyc2lvbiB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBSZXdyaXR0ZW4gZm9yIGkzNzAgRVNBLzM5MCBzdXBwb3J0LCBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSTM3MF9ICi0jZGVmaW5lIEkzNzBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBpMzcwX29wY29kZS4gICovCi10eXBlZGVmIHVuaW9uCi17Ci0gICB1bnNpZ25lZCBpbnQgICBpWzJdOwotICAgdW5zaWduZWQgc2hvcnQgc1s0XTsKLSAgIHVuc2lnbmVkIGNoYXIgIGJbOF07Ci19ICBpMzcwX2luc25fdDsKLQotc3RydWN0IGkzNzBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgY2hhciBsZW47Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIGkzNzBfaW5zbl90IG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICBpMzcwX2luc25fdCBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAotICAgICBzcGVjaWZpYyBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcwotICAgICBhcmUgbGlzdGVkIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSBpMzcwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgaTM3MF9udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBpMzcwX29wY29kZS4gICovCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgb3JpZ2luYWwgMzYwIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFXzM2MCAoMHgwMSkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSAzNzAgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfMzcwICgweDAyKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIDM3MC1YQSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV8zNzBfWEEgKDB4MDQpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM3MCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzNzAgKDB4MDgpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTAgKDB4MTApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBCRlAgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfQkYgKDB4MjApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBicmFuY2ggJiBzZXQgYXV0aG9yaXR5IGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0JTICgweDQwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gY2hlY2tzdW0gZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfQ0sgKDB4ODApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBjb21wYXJlICYgbW92ZSBleHRlbmRlZCBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9DTSAoMHgxMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBmbHQucHQuIHN1cHBvcnQgZXh0ZW5zaW9ucyBmYWNpbGl0eS4gKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0ZYICgweDIwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIEhGUCBmYWNpbGl0eS4gKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0hYICgweDQwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIGltbWVkaWF0ZSAmIHJlbGF0aXZlIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0lSICgweDgwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIG1vdmUtaW52ZXJzZSBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9NSSAoMHgxMDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gcHJvZ3JhbS1jYWxsLWZhc3QgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfUEMgKDB4MjAwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIHBlcmZvcm0tbG9ja2VkLW9wIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1BMICgweDQwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzcXVhcmUtcm9vdCBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9RUiAoMHg4MDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gcmVzdW1lLXByb2dyYW0gZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfUlAgKDB4MTAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzZXQtYWRkcmVzcy1zcGFjZS1mYXN0IGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1NBICgweDIwMDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gc3Vic3BhY2UgZ3JvdXAgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU0cgKDB4NDAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzdHJpbmcgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU1IgKDB4ODAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyB0cmFwIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1RSICgweDEwMDAwMCkKLQotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU1VQRVJTRVQgKDB4MWZmZmZmKQotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGkzNzBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBpMzcwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIGkzNzBfaW5zbl90ICgqaW5zZXJ0KSBQQVJBTVMgKChpMzcwX2luc25fdCBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIEkzNzBfT1BFUkFORF9TSUdORUQpICE9IDAKLSAgICAgICAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoaTM3MF9pbnNuX3QgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAvKiBuYW1lIC0tIGhhbmR5IGZvciBkZWJ1Z2dpbmcsIG90aGVyd2lzZSBwb2ludGxlc3MgKi8KLSAgY2hhciAqIG5hbWU7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIGkzNzBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kIGkzNzBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBpMzcwX29wZXJhbmQuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4KLSAgIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciBTLCBSUyBhbmQKLSAgIFNTIGZvcm0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICByZWcsZGlzcGxhY2VtZW50KGJhc2VyZWcpICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9TQkFTRSAoMHgwMSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgYmFzZSByZWdpc3Rlci4gIEl0IG1heSBvciBtYXkgbm90IGFwcGVhciBuZXh0Ci0gICB0byBhbiBpbmRleCByZWdpc3RlciwgaS5lLiBlaXRoZXIgb2YgdGhlIHR3byBmb3JtcwotICAgcmVnLGRpc3BsYWNlbWVudChiYXNlcmVnKQotICAgcmVnLGRpc3BsYWNlbWVudChpbmRleCxiYXNlcmVnKSAqLwotI2RlZmluZSBJMzcwX09QRVJBTkRfQkFTRSAoMHgwMikKLQotLyogVGhpcyBwYWlyIG9mIG9wZXJhbmRzIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCi0gICBzZXBhcmF0ZWQgZnJvbSB0aGUgbGFzdCBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgUlggZm9ybQotICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICByZWcsZGlzcGxhY2VtZW50KGluZGV4LGJhc2VyZWcpICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9JTkRFWCAoMHgwNCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyIHVzZXMgdGhpcyB0byBwcmludAotICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX0dQUiAoMHgwOCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX0ZQUiAoMHgxMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX1JFTEFUSVZFICgweDIwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBsZW5ndGgsIHN1Y2ggYXMgdGhhdCBpbiBTUyBmb3JtIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9MRU5HVEggKDB4NDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIHRoZSBvcHRpb25hbCBCMiBmaWVsZCBpbiB0aGUgc2hpZnQtbGVmdCwgc2hpZnQtcmlnaHQgaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBvbiB0aGUgbGluZSwKLSAgIGFuZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBmb3IgdGhlIG9wY29kZSwgYW5kIGRlY2lkZQotICAgd2hldGhlciB0aGlzIG9wZXJhbmQgaXMgcHJlc2VudCBvciBub3QuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZAotICAgcHJpbnQgdGhpcyBvcGVyYW5kIG91dCBvbmx5IGlmIGl0IGlzIG5vdCB6ZXJvLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX09QVElPTkFMICgweDgwKQotCi0MCi0vKiBEZWZpbmUgc29tZSBtaXNjIG1hY3Jvcy4gIFdlIGtlZXAgdGhlbSB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZQotICAgZm9yIHNpbXBsaWNpdHkuICBUaGUgbWFjcm8gdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGkzNzBfbWFjcm8uICAqLwotCi1zdHJ1Y3QgaTM3MF9tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgaTM3MF9vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTM3MF9tYWNybyBpMzcwX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBpMzcwX251bV9tYWNyb3M7Ci0KLQotI2VuZGlmIC8qIEkzNzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oIGIvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWMxNTFlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotLyogb3Bjb2RlL2kzODYuaCAtLSBJbnRlbCA4MDM4NiBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBTeXN0ZW1WLzM4NiBTVlIzLjIgYXNzZW1ibGVyLCBhbmQgcHJvYmFibHkgYWxsIEFUJlQgZGVyaXZlZAotICAgaXg4NiBVbml4IGFzc2VtYmxlcnMsIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB3aXRoCi0gICByZXZlcnNlZCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBpbiBjZXJ0YWluIGNhc2VzLgotICAgVW5mb3J0dW5hdGVseSwgZ2NjIGFuZCBwb3NzaWJseSBtYW55IG90aGVyIHByb2dyYW1zIHVzZSB0aGlzCi0gICByZXZlcnNlZCBzeW50YXgsIHNvIHdlJ3JlIHN0dWNrIHdpdGggaXQuCi0KLSAgIGVnLiBgZnN1YiAlc3QoMyksJXN0JyByZXN1bHRzIGluIHN0ID0gc3QgLSBzdCgzKSBhcyBleHBlY3RlZCwgYnV0Ci0gICBgZnN1YiAlc3QsJXN0KDMpJyByZXN1bHRzIGluIHN0KDMpID0gc3QgLSBzdCgzKSwgcmF0aGVyIHRoYW4KLSAgIHRoZSBleHBlY3RlZCBzdCgzKSA9IHN0KDMpIC0gc3QKLQotICAgVGhpcyBoYXBwZW5zIHdpdGggYWxsIHRoZSBub24tY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBmbG9hdGluZyBwb2ludAotICAgb3BlcmF0aW9ucyB3aXRoIHR3byByZWdpc3RlciBvcGVyYW5kcywgd2hlcmUgdGhlIHNvdXJjZSByZWdpc3RlciBpcwotICAgJXN0LCBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgJXN0KGkpLiAgU2VlIEZsb2F0RFIgYmVsb3cuCi0KLSAgIFRoZSBhZmZlY3RlZCBvcGNvZGUgbWFwIGlzIGRjZVgsIGRjZlgsIGRlZVgsIGRlZlguICAqLwotCi0jaWZuZGVmIFNZU1YzODZfQ09NUEFUCi0vKiBTZXQgbm9uLXplcm8gZm9yIGJyb2tlbiwgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICBTZXQgdG8gemVybyBmb3IKLSAgIG5vbi1icm9rZW4gb3Bjb2RlcyBhdCB5b3VyIHBlcmlsLiAgZ2NjIGdlbmVyYXRlcyBTeXN0ZW1WLzM4NgotICAgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBTWVNWMzg2X0NPTVBBVCAxCi0jZW5kaWYKLSNpZm5kZWYgT0xER0NDX0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIHRvIGNhdGVyIGZvciBvbGQgKDw9IDIuOC4xKSB2ZXJzaW9ucyBvZiBnY2MgdGhhdCBjb3VsZAotICAgZ2VuZXJhdGUgbm9uc2Vuc2UgZnN1YnAsIGZzdWJycCwgZmRpdnAgYW5kIGZkaXZycCB3aXRoIG9wZXJhbmRzCi0gICByZXZlcnNlZC4gICovCi0jZGVmaW5lIE9MREdDQ19DT01QQVQgU1lTVjM4Nl9DT01QQVQKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgdGVtcGxhdGUgaTM4Nl9vcHRhYltdID0gewotCi0jZGVmaW5lIFggTm9uZQotI2RlZmluZSBOb1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJfU3VmIChOb193U3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdfU3VmIChOb19iU3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGxfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19sU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHhfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19sU3VmfE5vX2RTdWYpCi0jZGVmaW5lIGJ3X1N1ZiAoTm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYmxfU3VmIChOb193U3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSB3bF9TdWYgKE5vX2JTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdsZF9TdWYgKE5vX2JTdWZ8Tm9fc1N1ZnxOb194U3VmKQotI2RlZmluZSBzbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHNsZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb194U3VmKQotI2RlZmluZSBzbGR4X1N1ZiAoTm9fYlN1ZnxOb193U3VmKQotI2RlZmluZSBid2xfU3VmIChOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYndsZF9TdWYgKE5vX3NTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgRlAgKE5vU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGxfRlAgKGxfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGRfRlAgKGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHhfRlAgKHhfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsX0ZQIChzbF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgc2xkX0ZQIChzbGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZHhfRlAgKHNsZHhfU3VmfElnbm9yZVNpemUpCi0jaWYgU1lTVjM4Nl9DT01QQVQKLS8qIFNvbWVvbmUgZm9yZ290IHRoYXQgdGhlIEZsb2F0UiBiaXQgcmV2ZXJzZXMgdGhlIG9wZXJhdGlvbiB3aGVuIG5vdAotICAgZXF1YWwgdG8gdGhlIEZsb2F0RCBiaXQuICBpZS4gQ2hhbmdpbmcgb25seSBGbG9hdEQgcmVzdWx0cyBpbiB0aGUKLSAgIGRlc3RpbmF0aW9uIGJlaW5nIHN3YXBwZWQgKmFuZCogdGhlIGRpcmVjdGlvbiBiZWluZyByZXZlcnNlZC4gICovCi0jZGVmaW5lIEZsb2F0RFIgRmxvYXRECi0jZWxzZQotI2RlZmluZSBGbG9hdERSIChGbG9hdER8RmxvYXRSKQotI2VuZGlmCi0KLS8qIE1vdmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU9WX0FYX0RJU1AzMiAweGEwCi17ICJtb3YiLCAgIDIsCTB4YTAsIFgsIDAsCSBid2xfU3VmfER8VywJCQl7IERpc3AxNnxEaXNwMzIsIEFjYywgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4ODgsIFgsIDAsCSBid2xfU3VmfER8V3xNb2RybSwJCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhiMCwgWCwgMCwJIGJ3bF9TdWZ8V3xTaG9ydEZvcm0sCQl7IEltbSwgUmVnLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhjNiwgWCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJCXsgSW1tLCBSZWd8QW55TWVtLCAwIH0gfSwKLS8qIFRoZSBzZWdtZW50IHJlZ2lzdGVyIG1vdmVzIGFjY2VwdCBXb3JkUmVnIHNvIHRoYXQgYSBzZWdtZW50IHJlZ2lzdGVyCi0gICBjYW4gYmUgY29waWVkIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCBhbmQgdmljZSB2ZXJzYSwgd2l0aG91dCB1c2luZyBhCi0gICBzaXplIHByZWZpeC4gIFdoZW4gbW92aW5nIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCB0aGUgdXBwZXIgMTYgYml0cwotICAgYXJlIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIChvbiB0aGUgUGVudGl1bSBQcm8sCi0gICB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSBpcyB6ZXJvKS4gICovCi17ICJtb3YiLCAgIDIsCTB4OGMsIFgsIDAsCSB3bF9TdWZ8TW9kcm0sCQkJeyBTUmVnMiwgV29yZFJlZ3xXb3JkTWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4YywgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQkJeyBTUmVnMywgV29yZFJlZ3xXb3JkTWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4ZSwgWCwgMCwJIHdsX1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgU1JlZzIsIDAgfSB9LAoteyAibW92IiwgICAyLAkweDhlLCBYLCBDcHUzODYsIHdsX1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgU1JlZzMsIDAgfSB9LAotLyogTW92ZSB0by9mcm9tIGNvbnRyb2wgZGVidWcgcmVnaXN0ZXJzLiAgKi8KLXsgIm1vdiIsICAgMiwgMHgwZjIwLCBYLCBDcHUzODYsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyMSwgWCwgQ3B1Mzg2LCBsX1N1ZnxEfE1vZHJtfElnbm9yZVNpemUsCXsgRGVidWcsIFJlZzMyfEludk1lbSwgMH0gfSwKLXsgIm1vdiIsICAgMiwgMHgwZjI0LCBYLCBDcHUzODYsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBUZXN0LCBSZWczMnxJbnZNZW0sIDB9IH0sCi0KLS8qIE1vdmUgd2l0aCBzaWduIGV4dGVuZC4gICovCi0vKiAibW92c2JsIiAmICJtb3ZzYnciIG11c3Qgbm90IGJlIHVuaWZpZWQgaW50byAibW92c2IiIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIHRoZSAibW92cyIgc3RyaW5nIG1vdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyJtb3ZzYmwiLCAyLCAweDBmYmUsIFgsIENwdTM4NiwgTm9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3ZzYnciLCAyLCAweDBmYmUsIFgsIENwdTM4NiwgTm9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFJlZzE2LCAwfSB9LAoteyJtb3Zzd2wiLCAyLCAweDBmYmYsIFgsIENwdTM4NiwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggbmV4dCAyIGluc25zICovCi17Im1vdnN4IiwgIDIsIDB4MGZiZiwgWCwgQ3B1Mzg2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92c3giLCAgMiwgMHgwZmJlLCBYLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBNb3ZlIHdpdGggemVybyBleHRlbmQuICAqLwoteyJtb3Z6YiIsICAyLCAweDBmYjYsIFgsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJtb3Z6d2wiLCAyLCAweDBmYjcsIFgsIENwdTM4NiwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggbmV4dCAyIGluc25zICovCi17Im1vdnp4IiwgIDIsIDB4MGZiNywgWCwgQ3B1Mzg2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92engiLCAgMiwgMHgwZmI2LCBYLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBQdXNoIGluc3RydWN0aW9ucy4gICovCi17InB1c2giLCAgIDEsCTB4NTAsIFgsIDAsCSB3bF9TdWZ8U2hvcnRGb3JtfERlZmF1bHRTaXplLAl7IFdvcmRSZWcsIDAsIDAgfSB9LAoteyJwdXNoIiwgICAxLAkweGZmLCA2LCAwLAkgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4NmEsIFgsIENwdTE4Niwgd2xfU3VmfERlZmF1bHRTaXplLAkJeyBJbW04UywgMCwgMH0gfSwKLXsicHVzaCIsICAgMSwJMHg2OCwgWCwgQ3B1MTg2LCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IEltbTE2fEltbTMyLCAwLCAwfSB9LAoteyJwdXNoIiwgICAxLAkweDA2LCBYLCAwLAkgd2xfU3VmfFNlZzJTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzIsIDAsIDAgfSB9LAoteyJwdXNoIiwgICAxLCAweDBmYTAsIFgsIENwdTM4Niwgd2xfU3VmfFNlZzNTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzMsIDAsIDAgfSB9LAoteyJwdXNoYSIsICAwLAkweDYwLCBYLCBDcHUxODYsIHdsZF9TdWZ8RGVmYXVsdFNpemUsCQl7IDAsIDAsIDAgfSB9LAotCi0vKiBQb3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgMCwJIHdsX1N1ZnxTaG9ydEZvcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZywgMCwgMCB9IH0sCi17InBvcCIsCSAgIDEsCTB4OGYsIDAsIDAsCSB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwIH0gfSwKLSNkZWZpbmUgUE9QX1NFR19TSE9SVCAweDA3Ci17InBvcCIsCSAgIDEsCTB4MDcsIFgsIDAsCSB3bF9TdWZ8U2VnMlNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMiwgMCwgMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgQ3B1Mzg2LCB3bF9TdWZ8U2VnM1Nob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMywgMCwgMCB9IH0sCi17InBvcGEiLCAgIDAsCTB4NjEsIFgsIENwdTE4Niwgd2xkX1N1ZnxEZWZhdWx0U2l6ZSwJCXsgMCwgMCwgMCB9IH0sCi0KLS8qIEV4Y2hhbmdlIGluc3RydWN0aW9ucy4KLSAgIHhjaGcgY29tbXV0ZXM6ICB3ZSBhbGxvdyBib3RoIG9wZXJhbmQgb3JkZXJzLiAgKi8KLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgMCwJIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgMCwJIHdsX1N1ZnxTaG9ydEZvcm0sCXsgQWNjLCBXb3JkUmVnLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIEluL291dCBmcm9tIHBvcnRzLiAgKi8KLXsiaW4iLAkgICAyLAkweGU0LCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbW04LCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDIsCTB4ZWMsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgQWNjLCAwIH0gfSwKLXsiaW4iLAkgICAxLAkweGU0LCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbW04LCAwLCAwIH0gfSwKLXsiaW4iLAkgICAxLAkweGVjLCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGU2LCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBBY2MsIEltbTgsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGVlLCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBBY2MsIEluT3V0UG9ydFJlZywgMCB9IH0sCi17Im91dCIsCSAgIDEsCTB4ZTYsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGVlLCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAotCi0vKiBMb2FkIGVmZmVjdGl2ZSBhZGRyZXNzLiAgKi8KLXsibGVhIiwJICAgMiwgMHg4ZCwgICBYLCAwLAkgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwIH0gfSwKLQotLyogTG9hZCBzZWdtZW50IHJlZ2lzdGVycyBmcm9tIG1lbW9yeS4gICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxlcyIsCSAgIDIsCTB4YzQsIFgsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxmcyIsCSAgIDIsIDB4MGZiNCwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxncyIsCSAgIDIsIDB4MGZiNSwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIEZsYWdzIHJlZ2lzdGVyIGluc3RydWN0aW9ucy4gICovCi17ImNsYyIsCSAgIDAsCTB4ZjgsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsZCIsCSAgIDAsCTB4ZmMsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsaSIsCSAgIDAsCTB4ZmEsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsdHMiLCAgIDAsIDB4MGYwNiwgWCwgQ3B1Mjg2LCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNtYyIsCSAgIDAsCTB4ZjUsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImxhaGYiLCAgIDAsCTB4OWYsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InNhaGYiLCAgIDAsCTB4OWUsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InB1c2hmIiwgIDAsCTB4OWMsIFgsIDAsCSB3bGRfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17InBvcGYiLCAgIDAsCTB4OWQsIFgsIDAsCSB3bGRfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17InN0YyIsCSAgIDAsCTB4ZjksIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0aSIsCSAgIDAsCTB4ZmIsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIEFyaXRobWV0aWMuICAqLwoteyJhZGQiLAkgICAyLAkweDAwLCBYLCAwLAkgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgzLCAwLCAwLAkgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDA0LCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MCwgMCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiaW5jIiwJICAgMSwJMHg0MCwgWCwgMCwJIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiaW5jIiwJICAgMSwJMHhmZSwgMCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InN1YiIsCSAgIDIsCTB4MjgsIFgsIDAsCSBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODMsIDUsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4MmMsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgwLCA1LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJkZWMiLAkgICAxLAkweDQ4LCBYLCAwLAkgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJkZWMiLAkgICAxLAkweGZlLCAxLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2JiIiwJICAgMiwJMHgxOCwgWCwgMCwJIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MywgMywgMCwJIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHgxYywgWCwgMCwJIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODAsIDMsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImNtcCIsCSAgIDIsCTB4MzgsIFgsIDAsCSBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODMsIDcsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4M2MsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJjbXAiLAkgICAyLAkweDgwLCA3LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMH0gfSwKLXsidGVzdCIsICAgMiwJMHg4NCwgWCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InRlc3QiLCAgIDIsCTB4YTgsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGY2LCAwLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJhbmQiLAkgICAyLAkweDIwLCBYLCAwLAkgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgzLCA0LCAwLAkgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDI0LCBYLCAwLAkgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MCwgNCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsib3IiLAkgICAyLAkweDA4LCBYLCAwLAkgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODMsIDEsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17Im9yIiwJICAgMiwJMHgwYywgWCwgMCwJIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17Im9yIiwJICAgMiwJMHg4MCwgMSwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsieG9yIiwJICAgMiwJMHgzMCwgWCwgMCwJIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsieG9yIiwJICAgMiwJMHg4MywgNiwgMCwJIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsieG9yIiwJICAgMiwJMHgzNCwgWCwgMCwJIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODAsIDYsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi0vKiBjbHIgd2l0aCAxIG9wZXJhbmQgaXMgcmVhbGx5IHhvciB3aXRoIDIgb3BlcmFuZHMuICAqLwoteyJjbHIiLAkgICAxLAkweDMwLCBYLCAwLAkgYndsX1N1ZnxXfE1vZHJtfHJlZ0tsdWRnZSwJeyBSZWcsIDAsIDAgfSB9LAotCi17ImFkYyIsCSAgIDIsCTB4MTAsIFgsIDAsCSBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIDAsCSB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4MTQsIFgsIDAsCSBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhZGMiLAkgICAyLAkweDgwLCAyLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17Im5vdCIsCSAgIDEsCTB4ZjYsIDIsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJhYWEiLAkgICAwLAkweDM3LCBYLCAwLAkgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCAwLAkgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJkYWEiLAkgICAwLAkweDI3LCBYLCAwLAkgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJkYXMiLAkgICAwLAkweDJmLCBYLCAwLAkgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImFhZCIsCSAgIDEsICAgMHhkNSwgWCwgMCwJIE5vU3VmLAkJCXsgSW1tOFMsIDAsIDB9IH0sCi17ImFhbSIsCSAgIDAsIDB4ZDQwYSwgWCwgMCwJIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCAwLAkgTm9TdWYsCQkJeyBJbW04UywgMCwgMH0gfSwKLQotLyogQ29udmVyc2lvbiBpbnNucy4gICovCi0vKiBJbnRlbCBuYW1pbmcgKi8KLXsiY2J3IiwJICAgMCwJMHg5OCwgWCwgMCwJIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY3dkZSIsICAgMCwJMHg5OCwgWCwgMCwJIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLXsiY3dkIiwJICAgMCwJMHg5OSwgWCwgMCwJIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2RxIiwJICAgMCwJMHg5OSwgWCwgMCwJIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLS8qIEFUJlQgbmFtaW5nICovCi17ImNidHciLCAgIDAsCTB4OTgsIFgsIDAsCSBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGwiLCAgIDAsCTB4OTgsIFgsIDAsCSBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGQiLCAgIDAsCTB4OTksIFgsIDAsCSBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImNsdGQiLCAgIDAsCTB4OTksIFgsIDAsCSBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIFdhcm5pbmchIHRoZSBtdWwvaW11bCAob3Bjb2RlIDB4ZjYpIG11c3Qgb25seSBoYXZlIDEgb3BlcmFuZCEgIFRoZXkgYXJlCi0gICBleHBhbmRpbmcgNjQtYml0IG11bHRpcGxpZXMsIGFuZCAqY2Fubm90KiBiZSBzZWxlY3RlZCB0byBhY2NvbXBsaXNoCi0gICAnaW11bCAlZWJ4LCAlZWF4JyAob3Bjb2RlIDB4MGZhZiBtdXN0IGJlIHVzZWQgaW4gdGhpcyBjYXNlKQotICAgVGhlc2UgbXVsdGlwbGllcyBjYW4gb25seSBiZSBzZWxlY3RlZCB3aXRoIHNpbmdsZSBvcGVyYW5kIGZvcm1zLiAgKi8KLXsibXVsIiwJICAgMSwJMHhmNiwgNCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAxLAkweGY2LCA1LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17ImltdWwiLCAgIDIsIDB4MGZhZiwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMywJMHg2YiwgWCwgQ3B1MTg2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi17ImltdWwiLCAgIDMsCTB4NjksIFgsIENwdTE4Niwgd2xfU3VmfE1vZHJtLAkJeyBJbW0xNnxJbW0zMiwgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAotLyogaW11bCB3aXRoIDIgb3BlcmFuZHMgbWltaWNzIGltdWwgd2l0aCAzIGJ5IHB1dHRpbmcgdGhlIHJlZ2lzdGVyIGluCi0gICBib3RoIGkucm0ucmVnICYgaS5ybS5yZWdtZW0gZmllbGRzLiAgcmVnS2x1ZGdlIGVuYWJsZXMgdGhpcwotICAgdHJhbnNmb3JtYXRpb24uICAqLwoteyJpbXVsIiwgICAyLAkweDZiLCBYLCBDcHUxODYsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW04UywgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMiwJMHg2OSwgWCwgQ3B1MTg2LCB3bF9TdWZ8TW9kcm18cmVnS2x1ZGdlLHsgSW1tMTZ8SW1tMzIsIFdvcmRSZWcsIDB9IH0sCi0KLXsiZGl2IiwJICAgMSwJMHhmNiwgNiwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJkaXYiLAkgICAyLAkweGY2LCA2LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLXsiaWRpdiIsICAgMSwJMHhmNiwgNywgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpZGl2IiwgICAyLAkweGY2LCA3LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLQoteyJyb2wiLAkgICAyLAkweGQwLCAwLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4YzAsIDAsIENwdTE4NiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4ZDIsIDAsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMSwJMHhkMCwgMCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InJvciIsCSAgIDIsCTB4ZDAsIDEsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhjMCwgMSwgQ3B1MTg2LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhkMiwgMSwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAxLAkweGQwLCAxLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsicmNsIiwJICAgMiwJMHhkMCwgMiwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAyLAkweGMwLCAyLCBDcHUxODYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAyLAkweGQyLCAyLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDEsCTB4ZDAsIDIsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY3IiLAkgICAyLAkweGQwLCAzLCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4YzAsIDMsIENwdTE4NiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4ZDIsIDMsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMSwJMHhkMCwgMywgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNhbCIsCSAgIDIsCTB4ZDAsIDQsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhjMCwgNCwgQ3B1MTg2LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhkMiwgNCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAxLAkweGQwLCA0LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsIiwJICAgMiwJMHhkMCwgNCwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGMwLCA0LCBDcHUxODYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQyLCA0LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDEsCTB4ZDAsIDQsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaHIiLAkgICAyLAkweGQwLCA1LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4YzAsIDUsIENwdTE4NiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4ZDIsIDUsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMSwJMHhkMCwgNSwgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNhciIsCSAgIDIsCTB4ZDAsIDcsIDAsCSBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhjMCwgNywgQ3B1MTg2LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhkMiwgNywgMCwJIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAxLAkweGQwLCA3LCAwLAkgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsZCIsICAgMywgMHgwZmE0LCBYLCBDcHUzODYsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaGxkIiwgICAzLCAweDBmYTUsIFgsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJeyBTaGlmdENvdW50LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNobGQiLCAgIDIsIDB4MGZhNSwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzaHJkIiwgICAzLCAweDBmYWMsIFgsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNocmQiLCAgIDMsIDB4MGZhZCwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hyZCIsICAgMiwgMHgwZmFkLCBYLCBDcHUzODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi0vKiBDb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9ucy4gICovCi17ImNhbGwiLCAgIDEsCTB4ZTgsIFgsIDAsCSB3bF9TdWZ8SnVtcER3b3JkfERlZmF1bHRTaXplLAl7IERpc3AxNnxEaXNwMzIsIDAsIDB9IH0sCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDIsIDAsCSB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLAkweDlhLCBYLCAwLAkgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnR8RGVmYXVsdFNpemUsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDMsIDAsCSB4X1N1ZnxNb2RybXxEZWZhdWx0U2l6ZSwJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsY2FsbCIsICAyLAkweDlhLCBYLCAwLAkgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnR8RGVmYXVsdFNpemUsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJsY2FsbCIsICAxLAkweGZmLCAzLCAwLAkgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRNZW18SnVtcEFic29sdXRlLCAwLCAwfSB9LAotCi0jZGVmaW5lIEpVTVBfUENfUkVMQVRJVkUgMHhlYgoteyJqbXAiLAkgICAxLAkweGViLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam1wIiwJICAgMSwJMHhmZiwgNCwgMCwJIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJqbXAiLCAgICAyLAkweGVhLCBYLCAwLAkgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImptcCIsICAgIDEsCTB4ZmYsIDUsIDAsCSB4X1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGptcCIsICAgMiwJMHhlYSwgWCwgMCwJIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGptcCIsICAgMSwJMHhmZiwgNSwgMCwJIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCi0KLXsicmV0IiwJICAgMCwJMHhjMywgWCwgMCwJIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJyZXQiLAkgICAxLAkweGMyLCBYLCAwLAkgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCAwLCAwfSB9LAoteyJscmV0IiwgICAwLAkweGNiLCBYLCAwLAkgd2xfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17ImxyZXQiLCAgIDEsCTB4Y2EsIFgsIDAsCSB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgSW1tMTYsIDAsIDB9IH0sCi17ImVudGVyIiwgIDIsCTB4YzgsIFgsIENwdTE4Niwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCBJbW04LCAwfSB9LAoteyJsZWF2ZSIsICAwLAkweGM5LCBYLCBDcHUxODYsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAotCi0vKiBDb25kaXRpb25hbCBqdW1wcy4gICovCi17ImpvIiwJICAgMSwJMHg3MCwgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubyIsCSAgIDEsCTB4NzEsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYiIsCSAgIDEsCTB4NzIsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYyIsCSAgIDEsCTB4NzIsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmFlIiwgICAxLAkweDcyLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5iIiwJICAgMSwJMHg3MywgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYyIsCSAgIDEsCTB4NzMsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYWUiLAkgICAxLAkweDczLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamUiLAkgICAxLAkweDc0LCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianoiLAkgICAxLAkweDc0LCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5lIiwJICAgMSwJMHg3NSwgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpueiIsCSAgIDEsCTB4NzUsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYmUiLAkgICAxLAkweDc2LCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5hIiwJICAgMSwJMHg3NiwgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYmUiLCAgIDEsCTB4NzcsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYSIsCSAgIDEsCTB4NzcsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcyIsCSAgIDEsCTB4NzgsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnMiLAkgICAxLAkweDc5LCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianAiLAkgICAxLAkweDdhLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianBlIiwJICAgMSwJMHg3YSwgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpucCIsCSAgIDEsCTB4N2IsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcG8iLAkgICAxLAkweDdiLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamwiLAkgICAxLAkweDdjLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5nZSIsICAgMSwJMHg3YywgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubCIsCSAgIDEsCTB4N2QsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZ2UiLAkgICAxLAkweDdkLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamxlIiwJICAgMSwJMHg3ZSwgWCwgMCwJIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZyIsCSAgIDEsCTB4N2UsIFgsIDAsCSBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmxlIiwgICAxLAkweDdmLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamciLAkgICAxLAkweDdmLCBYLCAwLAkgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogamN4eiB2cy4gamVjeHogaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgYWRkcmVzcyBzaXplIHByZWZpeC4gICovCi17ImpjeHoiLCAgIDEsCTB4ZTMsIFgsIDAsCSBOb1N1ZnxKdW1wQnl0ZXxTaXplMTYsIHsgRGlzcCwgMCwgMH0gfSwKLXsiamVjeHoiLCAgMSwJMHhlMywgWCwgMCwJIE5vU3VmfEp1bXBCeXRlfFNpemUzMiwgeyBEaXNwLCAwLCAwfSB9LAotCi0vKiBUaGUgbG9vcCBpbnN0cnVjdGlvbnMgYWxzbyB1c2UgdGhlIGFkZHJlc3Mgc2l6ZSBwcmVmaXggdG8gc2VsZWN0Ci0gICAlY3ggcmF0aGVyIHRoYW4gJWVjeCBmb3IgdGhlIGxvb3AgY291bnQsIHNvIHRoZSBgdycgZm9ybSBvZiB0aGVzZQotICAgaW5zdHJ1Y3Rpb25zIGVtaXQgYW4gYWRkcmVzcyBzaXplIHByZWZpeCByYXRoZXIgdGhhbiBhIGRhdGEgc2l6ZQotICAgcHJlZml4LiAgKi8KLXsibG9vcCIsICAgMSwJMHhlMiwgWCwgMCwJIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29weiIsICAxLAkweGUxLCBYLCAwLAkgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BlIiwgIDEsCTB4ZTEsIFgsIDAsCSB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcG56IiwgMSwJMHhlMCwgWCwgMCwJIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbmUiLCAxLAkweGUwLCBYLCAwLAkgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi0KLS8qIFNldCBieXRlIG9uIGZsYWcgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsic2V0byIsICAgMSwgMHgwZjkwLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5vIiwgIDEsIDB4MGY5MSwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRiIiwgICAxLCAweDBmOTIsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YyIsICAgMSwgMHgwZjkyLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hZSIsIDEsIDB4MGY5MiwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYiIsICAxLCAweDBmOTMsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmMiLCAgMSwgMHgwZjkzLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGFlIiwgIDEsIDB4MGY5MywgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRlIiwgICAxLCAweDBmOTQsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0eiIsICAgMSwgMHgwZjk0LCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5lIiwgIDEsIDB4MGY5NSwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRueiIsICAxLCAweDBmOTUsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YmUiLCAgMSwgMHgwZjk2LCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hIiwgIDEsIDB4MGY5NiwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYmUiLCAxLCAweDBmOTcsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YSIsICAgMSwgMHgwZjk3LCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHMiLCAgIDEsIDB4MGY5OCwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucyIsICAxLCAweDBmOTksIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cCIsICAgMSwgMHgwZjlhLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHBlIiwgIDEsIDB4MGY5YSwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucCIsICAxLCAweDBmOWIsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cG8iLCAgMSwgMHgwZjliLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGwiLCAgIDEsIDB4MGY5YywgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZ2UiLCAxLCAweDBmOWMsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmwiLCAgMSwgMHgwZjlkLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGdlIiwgIDEsIDB4MGY5ZCwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRsZSIsICAxLCAweDBmOWUsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmciLCAgMSwgMHgwZjllLCAwLCBDcHUzODYsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5sZSIsIDEsIDB4MGY5ZiwgMCwgQ3B1Mzg2LCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRnIiwgICAxLCAweDBmOWYsIDAsIENwdTM4NiwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLQotLyogU3RyaW5nIG1hbmlwdWxhdGlvbi4gICovCi17ImNtcHMiLCAgIDAsCTB4YTYsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImNtcHMiLCAgIDIsCTB4YTYsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoteyJzY21wIiwgICAwLAkweGE2LCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY21wIiwgICAyLAkweGE2LCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFueU1lbSwgMH0gfSwKLXsiaW5zIiwJICAgMCwJMHg2YywgWCwgQ3B1MTg2LCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImlucyIsCSAgIDIsCTB4NmMsIFgsIENwdTE4NiwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBJbk91dFBvcnRSZWcsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsib3V0cyIsICAgMCwJMHg2ZSwgWCwgQ3B1MTg2LCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im91dHMiLCAgIDIsCTB4NmUsIFgsIENwdTE4NiwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEluT3V0UG9ydFJlZywgMH0gfSwKLXsibG9kcyIsICAgMCwJMHhhYywgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibG9kcyIsICAgMSwJMHhhYywgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJsb2RzIiwgICAyLAkweGFjLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKLXsic2xvZCIsICAgMCwJMHhhYywgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2xvZCIsICAgMSwJMHhhYywgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJzbG9kIiwgICAyLAkweGFjLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKLXsibW92cyIsICAgMCwJMHhhNCwgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibW92cyIsICAgMiwJMHhhNCwgWCwgMCwJIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNtb3YiLCAgIDAsCTB4YTQsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNtb3YiLCAgIDIsCTB4YTQsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzY2FzIiwgICAwLAkweGFlLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY2FzIiwgICAxLAkweGFlLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNjYXMiLCAgIDIsCTB4YWUsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzc2NhIiwgICAwLAkweGFlLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc2NhIiwgICAxLAkweGFlLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNzY2EiLCAgIDIsCTB4YWUsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzdG9zIiwgICAwLAkweGFhLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzdG9zIiwgICAxLAkweGFhLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InN0b3MiLCAgIDIsCTB4YWEsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzc3RvIiwgICAwLAkweGFhLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc3RvIiwgICAxLAkweGFhLCBYLCAwLAkgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCi17InNzdG8iLCAgIDIsCTB4YWEsIFgsIDAsCSBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJ4bGF0IiwgICAwLAkweGQ3LCBYLCAwLAkgYl9TdWZ8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsieGxhdCIsICAgMSwJMHhkNywgWCwgMCwJIGJfU3VmfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKLQotLyogQml0IG1hbmlwdWxhdGlvbi4gICovCi17ImJzZiIsCSAgIDIsIDB4MGZiYywgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnNyIiwJICAgMiwgMHgwZmJkLCBYLCBDcHUzODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJidCIsCSAgIDIsIDB4MGZhMywgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYmEsIDQsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYiwgWCwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRjIiwJICAgMiwgMHgwZmJhLCA3LCBDcHUzODYsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHIiLAkgICAyLCAweDBmYjMsIFgsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiYSwgNiwgQ3B1Mzg2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnRzIiwJICAgMiwgMHgwZmFiLCBYLCBDcHUzODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHMiLAkgICAyLCAweDBmYmEsIDUsIENwdTM4Niwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLS8qIEludGVycnVwdHMgJiBvcC4gc3lzIGluc25zLiAgKi8KLS8qIFNlZSBnYXMvY29uZmlnL3RjLWkzODYuYyBmb3IgY29udmVyc2lvbiBvZiAnaW50ICQzJyBpbnRvIHRoZSBzcGVjaWFsCi0gICBpbnQgMyBpbnNuLiAgKi8KLSNkZWZpbmUgSU5UX09QQ09ERSAweGNkCi0jZGVmaW5lIElOVDNfT1BDT0RFIDB4Y2MKLXsiaW50IiwJICAgMSwJMHhjZCwgWCwgMCwJIE5vU3VmLAkJCXsgSW1tOCwgMCwgMH0gfSwKLXsiaW50MyIsICAgMCwJMHhjYywgWCwgMCwJIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaW50byIsICAgMCwJMHhjZSwgWCwgMCwJIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaXJldCIsICAgMCwJMHhjZiwgWCwgMCwJIHdsZF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLS8qIGkzODZzbCwgaTQ4NnNsLCBsYXRlciA0ODYsIGFuZCBQZW50aXVtLiAgKi8KLXsicnNtIiwJICAgMCwgMHgwZmFhLCBYLCBDcHUzODYsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQoteyJib3VuZCIsICAyLAkweDYyLCBYLCBDcHUxODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZE1lbSwgMH0gfSwKLQoteyJobHQiLAkgICAwLAkweGY0LCBYLCAwLAkgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotLyogbm9wIGlzIGFjdHVhbGx5ICd4Y2hnbCAlZWF4LCAlZWF4Jy4gICovCi17Im5vcCIsCSAgIDAsCTB4OTAsIFgsIDAsCSBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIFByb3RlY3Rpb24gY29udHJvbC4gICovCi17ImFycGwiLCAgIDIsCTB4NjMsIFgsIENwdTI4Niwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2LCBSZWcxNnxTaG9ydE1lbSwgMH0gfSwKLXsibGFyIiwJICAgMiwgMHgwZjAyLCBYLCBDcHUyODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZ2R0IiwgICAxLCAweDBmMDEsIDIsIENwdTI4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsaWR0IiwgICAxLCAweDBmMDEsIDMsIENwdTI4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsbGR0IiwgICAxLCAweDBmMDAsIDIsIENwdTI4Niwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJsbXN3IiwgICAxLCAweDBmMDEsIDYsIENwdTI4Niwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJsc2wiLAkgICAyLCAweDBmMDMsIFgsIENwdTI4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17Imx0ciIsCSAgIDEsIDB4MGYwMCwgMywgQ3B1Mjg2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsic2dkdCIsICAgMSwgMHgwZjAxLCAwLCBDcHUyODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2lkdCIsICAgMSwgMHgwZjAxLCAxLCBDcHUyODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2xkdCIsICAgMSwgMHgwZjAwLCAwLCBDcHUyODYsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwfSB9LAoteyJzbXN3IiwgICAxLCAweDBmMDEsIDQsIENwdTI4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDB9IH0sCi17InN0ciIsCSAgIDEsIDB4MGYwMCwgMSwgQ3B1Mjg2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsidmVyciIsICAgMSwgMHgwZjAwLCA0LCBDcHUyODYsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsidmVydyIsICAgMSwgMHgwZjAwLCA1LCBDcHUyODYsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQotLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogbG9hZCAqLwoteyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbGQiLAkgICAxLAkweGQ5LCAwLCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmxkIiwJICAgMSwgMHhkOWMwLCBYLCAwLAkgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZsZCIsICAgIDEsCTB4ZGIsIDUsIDAsCSB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlsZCIsICAgMSwJMHhkZiwgMCwgMCwJIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJmaWxkZCIsICAxLAkweGRmLCA1LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWxkcSIsICAxLAkweGRmLCA1LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWxkbGwiLCAxLAkweGRmLCA1LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbGR0IiwgICAxLAkweGRiLCA1LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmYmxkIiwgICAxLAkweGRmLCA0LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAotCi0vKiBzdG9yZSAobm8gcG9wKSAqLwoteyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3QiLAkgICAxLAkweGQ5LCAyLCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCAwLAkgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaXN0IiwgICAxLAkweGRmLCAyLCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotLyogc3RvcmUgKHdpdGggcG9wKSAqLwoteyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3RwIiwgICAxLAkweGQ5LCAzLCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCAwLAkgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZzdHAiLCAgIDEsCTB4ZGIsIDcsIDAsCSB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdHAiLCAgMSwJMHhkZiwgMywgMCwJIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJmaXN0cGQiLCAxLAkweGRmLCA3LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN0cHEiLCAxLAkweGRmLCA3LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN0cGxsIiwxLAkweGRmLCA3LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmc3RwdCIsICAxLAkweGRiLCA3LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmYnN0cCIsICAxLAkweGRmLCA2LCAwLAkgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAotCi0vKiBleGNoYW5nZSAlc3Q8bj4gd2l0aCAlc3QwICovCi17ImZ4Y2giLCAgIDEsIDB4ZDljOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBhbGlhcyBmb3IgZnhjaCAlc3QoMSkgKi8KLXsiZnhjaCIsICAgMCwgMHhkOWM5LCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBjb21wYXJpc29uICh3aXRob3V0IHBvcCkgKi8KLXsiZmNvbSIsICAgMSwgMHhkOGQwLCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIGFsaWFzIGZvciBmY29tICVzdCgxKSAqLwoteyJmY29tIiwgICAwLCAweGQ4ZDEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjb20iLCAgIDEsCTB4ZDgsIDIsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIDAsCSBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tIiwgIDEsCTB4ZGUsIDIsIDAsCSBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLS8qIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogYWxpYXMgZm9yIGZjb21wICVzdCgxKSAqLwoteyJmY29tcCIsICAwLCAweGQ4ZDksIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjb21wIiwgIDEsCTB4ZDgsIDMsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIDAsCSBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tcCIsIDEsCTB4ZGUsIDMsIDAsCSBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi17ImZjb21wcCIsIDAsIDB4ZGVkOSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogdW5vcmRlcmVkIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmdWNvbSIsICAxLCAweGRkZTAsIFgsIENwdTI4NiwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIGFsaWFzIGZvciBmdWNvbSAlc3QoMSkgKi8KLXsiZnVjb20iLCAgMCwgMHhkZGUxLCBYLCBDcHUyODYsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnVjb21wIiwgMSwgMHhkZGU4LCBYLCBDcHUyODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBhbGlhcyBmb3IgZnVjb21wICVzdCgxKSAqLwoteyJmdWNvbXAiLCAwLCAweGRkZTksIFgsIENwdTI4NiwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbXBwIiwwLCAweGRhZTksIFgsIENwdTI4NiwgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi17ImZ0c3QiLCAgIDAsIDB4ZDllNCwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnhhbSIsICAgMCwgMHhkOWU1LCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBsb2FkIGNvbnN0YW50cyBpbnRvICVzdDAgKi8KLXsiZmxkMSIsICAgMCwgMHhkOWU4LCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmbGRsMnQiLCAwLCAweGQ5ZTksIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZsZGwyZSIsIDAsIDB4ZDllYSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmxkcGkiLCAgMCwgMHhkOWViLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmbGRsZzIiLCAwLCAweGQ5ZWMsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZsZGxuMiIsIDAsIDB4ZDllZCwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmxkeiIsICAgMCwgMHhkOWVlLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBhcml0aG1ldGljICovCi0KLS8qIGFkZCAqLwoteyJmYWRkIiwgICAyLCAweGQ4YzAsIFgsIDAsCSBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLS8qIGFsaWFzIGZvciBmYWRkICVzdChpKSwgJXN0ICovCi17ImZhZGQiLCAgIDEsIDB4ZDhjMCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgU1lTVjM4Nl9DT01QQVQKLS8qIGFsaWFzIGZvciBmYWRkcCAqLwoteyJmYWRkIiwgICAwLCAweGRlYzEsIFgsIDAsCSBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLXsiZmFkZCIsICAgMSwJMHhkOCwgMCwgMCwJIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpYWRkIiwgIDEsCTB4ZGUsIDAsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZhZGRwIiwgIDIsIDB4ZGVjMCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmYWRkcCIsICAxLCAweGRlYzAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogYWxpYXMgZm9yIGZhZGRwICVzdCwgJXN0KDEpICovCi17ImZhZGRwIiwgIDAsIDB4ZGVjMSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmFkZHAiLCAgMiwgMHhkZWMwLCBYLCAwLAkgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLS8qIHN1YnRyYWN0ICovCi17ImZzdWIiLCAgIDIsIDB4ZDhlMCwgWCwgMCwJIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YiIsICAgMSwgMHhkOGUwLCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBTWVNWMzg2X0NPTVBBVAotLyogYWxpYXMgZm9yIGZzdWJwICovCi17ImZzdWIiLCAgIDAsIDB4ZGVlMSwgWCwgMCwJIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgoteyJmc3ViIiwgICAxLAkweGQ4LCA0LCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdWIiLCAgMSwJMHhkZSwgNCwgMCwJIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicCIsICAxLCAweGRlZTAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicCIsICAwLCAweGRlZTEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jaWYgT0xER0NDX0NPTVBBVAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIDAsCSBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbmRpZgotI2Vsc2UKLXsiZnN1YnAiLCAgMiwgMHhkZWU4LCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJwIiwgIDEsIDB4ZGVlOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDAsIDB4ZGVlOSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBzdWJ0cmFjdCByZXZlcnNlICovCi17ImZzdWJyIiwgIDIsIDB4ZDhlOCwgWCwgMCwJIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YnIiLCAgMSwgMHhkOGU4LCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBTWVNWMzg2X0NPTVBBVAotLyogYWxpYXMgZm9yIGZzdWJycCAqLwoteyJmc3ViciIsICAwLCAweGRlZTksIFgsIDAsCSBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLXsiZnN1YnIiLCAgMSwJMHhkOCwgNSwgMCwJIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpc3ViciIsIDEsCTB4ZGUsIDUsIDAsCSBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBTWVNWMzg2X0NPTVBBVAoteyJmc3VicnAiLCAyLCAweGRlZTgsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnJwIiwgMSwgMHhkZWU4LCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWU5LCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2lmIE9MREdDQ19DT01QQVQKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCAwLAkgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZW5kaWYKLSNlbHNlCi17ImZzdWJycCIsIDIsIDB4ZGVlMCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicnAiLCAxLCAweGRlZTAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicnAiLCAwLCAweGRlZTEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogbXVsdGlwbHkgKi8KLXsiZm11bCIsICAgMiwgMHhkOGM4LCBYLCAwLAkgRlB8U2hvcnRGb3JtfEZsb2F0RCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZtdWwiLCAgIDEsIDB4ZDhjOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgU1lTVjM4Nl9DT01QQVQKLS8qIGFsaWFzIGZvciBmbXVscCAqLwoteyJmbXVsIiwgICAwLCAweGRlYzksIFgsIDAsCSBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLXsiZm11bCIsICAgMSwJMHhkOCwgMSwgMCwJIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpbXVsIiwgIDEsCTB4ZGUsIDEsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmbXVscCIsICAxLCAweGRlYzgsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbXVscCIsICAwLCAweGRlYzksIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgMCwJIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBkaXZpZGUgKi8KLXsiZmRpdiIsICAgMiwgMHhkOGYwLCBYLCAwLAkgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2IiwgICAxLCAweGQ4ZjAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFNZU1YzODZfQ09NUEFUCi0vKiBhbGlhcyBmb3IgZmRpdnAgKi8KLXsiZmRpdiIsICAgMCwgMHhkZWYxLCBYLCAwLAkgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi17ImZkaXYiLCAgIDEsCTB4ZDgsIDYsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdiIsICAxLAkweGRlLCA2LCAwLAkgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cCIsICAwLCAweGRlZjEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jaWYgT0xER0NDX0NPTVBBVAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIDAsCSBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbmRpZgotI2Vsc2UKLXsiZmRpdnAiLCAgMiwgMHhkZWY4LCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZwIiwgIDEsIDB4ZGVmOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmOSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBkaXZpZGUgcmV2ZXJzZSAqLwoteyJmZGl2ciIsICAyLCAweGQ4ZjgsIFgsIDAsCSBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZkaXZyIiwgIDEsIDB4ZDhmOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgU1lTVjM4Nl9DT01QQVQKLS8qIGFsaWFzIGZvciBmZGl2cnAgKi8KLXsiZmRpdnIiLCAgMCwgMHhkZWY5LCBYLCAwLAkgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi17ImZkaXZyIiwgIDEsCTB4ZDgsIDcsIDAsCSBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdnIiLCAxLAkweGRlLCA3LCAwLAkgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgU1lTVjM4Nl9DT01QQVQKLXsiZmRpdnJwIiwgMiwgMHhkZWY4LCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmOCwgWCwgMCwJIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZycCIsIDAsIDB4ZGVmOSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNpZiBPTERHQ0NfQ09NUEFUCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgMCwJIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2VuZGlmCi0jZWxzZQoteyJmZGl2cnAiLCAyLCAweGRlZjAsIFgsIDAsCSBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnJwIiwgMSwgMHhkZWYwLCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWYxLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLXsiZjJ4bTEiLCAgMCwgMHhkOWYwLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeWwyeCIsICAwLCAweGQ5ZjEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwdGFuIiwgIDAsIDB4ZDlmMiwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnBhdGFuIiwgMCwgMHhkOWYzLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeHRyYWN0IiwwLCAweGQ5ZjQsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwcmVtMSIsIDAsIDB4ZDlmNSwgWCwgQ3B1Mjg2LCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkZWNzdHAiLDAsIDB4ZDlmNiwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluY3N0cCIsMCwgMHhkOWY3LCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbSIsICAwLCAweGQ5ZjgsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ5bDJ4cDEiLDAsIDB4ZDlmOSwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNxcnQiLCAgMCwgMHhkOWZhLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luY29zIiwwLCAweGQ5ZmIsIFgsIENwdTI4NiwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcm5kaW50IiwwLCAweGQ5ZmMsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzY2FsZSIsIDAsIDB4ZDlmZCwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNpbiIsICAgMCwgMHhkOWZlLCBYLCBDcHUyODYsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNvcyIsICAgMCwgMHhkOWZmLCBYLCBDcHUyODYsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNocyIsICAgMCwgMHhkOWUwLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmYWJzIiwgICAwLCAweGQ5ZTEsIFgsIDAsCSBGUCwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIHByb2Nlc3NvciBjb250cm9sICovCi17ImZuaW5pdCIsIDAsIDB4ZGJlMywgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluaXQiLCAgMCwgMHhkYmUzLCBYLCAwLAkgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi17ImZsZGN3IiwgIDEsCTB4ZDksIDUsIDAsCSBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RjdyIsIDEsCTB4ZDksIDcsIDAsCSBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZzdGN3IiwgIDEsCTB4ZDksIDcsIDAsCSBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwgMHhkZmUwLCBYLCAwLAkgRlAsCQkJeyBBY2MsIDAsIDB9IH0sCi17ImZuc3RzdyIsIDEsCTB4ZGQsIDcsIDAsCSBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RzdyIsIDAsIDB4ZGZlMCwgWCwgMCwJIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwgMHhkZmUwLCBYLCAwLAkgRlB8RldhaXQsCQl7IEFjYywgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwJMHhkZCwgNywgMCwJIEZQfEZXYWl0fE1vZHJtLAl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RzdyIsICAwLCAweGRmZTAsIFgsIDAsCSBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZm5jbGV4IiwgMCwgMHhkYmUyLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmY2xleCIsICAwLCAweGRiZTIsIFgsIDAsCSBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLS8qIFNob3J0IGZvcm1zIG9mIGZsZGVudiwgZnN0ZW52IHVzZSBkYXRhIHNpemUgcHJlZml4LiAgKi8KLXsiZm5zdGVudiIsMSwJMHhkOSwgNiwgMCwJIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZzdGVudiIsIDEsCTB4ZDksIDYsIDAsCSBzbF9TdWZ8RldhaXR8TW9kcm0sCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZsZGVudiIsIDEsCTB4ZDksIDQsIDAsCSBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbnNhdmUiLCAxLAkweGRkLCA2LCAwLAkgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnNhdmUiLCAgMSwJMHhkZCwgNiwgMCwJIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnJzdG9yIiwgMSwJMHhkZCwgNCwgMCwJIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZmZyZWUiLCAgMSwgMHhkZGMwLCBYLCAwLAkgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIFA2OmZyZWUgc3QoaSksIHBvcCBzdCAqLwoteyJmZnJlZXAiLCAxLCAweGRmYzAsIFgsIENwdTY4NiwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZm5vcCIsICAgMCwgMHhkOWQwLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBGV0FJVF9PUENPREUgMHg5YgoteyJmd2FpdCIsICAwLAkweDliLCBYLCAwLAkgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBPcGNvZGUgcHJlZml4ZXM7IHdlIGFsbG93IHRoZW0gYXMgc2VwYXJhdGUgaW5zbnMgdG9vLiAgKi8KLQotI2RlZmluZSBBRERSX1BSRUZJWF9PUENPREUgMHg2NwoteyJhZGRyMTYiLCAwLAkweDY3LCBYLCBDcHUzODYsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImFkZHIzMiIsIDAsCTB4NjcsIFgsIENwdTM4NiwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYXdvcmQiLCAgMCwJMHg2NywgWCwgQ3B1Mzg2LCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhZHdvcmQiLCAwLAkweDY3LCBYLCBDcHUzODYsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIERBVEFfUFJFRklYX09QQ09ERSAweDY2Ci17ImRhdGExNiIsIDAsCTB4NjYsIFgsIENwdTM4NiwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiZGF0YTMyIiwgMCwJMHg2NiwgWCwgQ3B1Mzg2LCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJ3b3JkIiwgICAwLAkweDY2LCBYLCBDcHUzODYsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImR3b3JkIiwgIDAsCTB4NjYsIFgsIENwdTM4NiwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgTE9DS19QUkVGSVhfT1BDT0RFIDB4ZjAKLXsibG9jayIsICAgMCwJMHhmMCwgWCwgMCwJIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17IndhaXQiLCAgIDAsICAgMHg5YiwgWCwgMCwJIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIENTX1BSRUZJWF9PUENPREUgMHgyZQoteyJjcyIsCSAgIDAsCTB4MmUsIFgsIDAsCSBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBEU19QUkVGSVhfT1BDT0RFIDB4M2UKLXsiZHMiLAkgICAwLAkweDNlLCBYLCAwLAkgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRVNfUFJFRklYX09QQ09ERSAweDI2Ci17ImVzIiwJICAgMCwJMHgyNiwgWCwgMCwJIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEZTX1BSRUZJWF9PUENPREUgMHg2NAoteyJmcyIsCSAgIDAsCTB4NjQsIFgsIENwdTM4NiwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgR1NfUFJFRklYX09QQ09ERSAweDY1Ci17ImdzIiwJICAgMCwJMHg2NSwgWCwgQ3B1Mzg2LCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBTU19QUkVGSVhfT1BDT0RFIDB4MzYKLXsic3MiLAkgICAwLAkweDM2LCBYLCAwLAkgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgUkVQTkVfUFJFRklYX09QQ09ERSAweGYyCi0jZGVmaW5lIFJFUEVfUFJFRklYX09QQ09ERSAgMHhmMwoteyJyZXAiLAkgICAwLAkweGYzLCBYLCAwLAkgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwZSIsICAgMCwJMHhmMywgWCwgMCwJIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcHoiLCAgIDAsCTB4ZjMsIFgsIDAsCSBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBuZSIsICAwLAkweGYyLCBYLCAwLAkgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwbnoiLCAgMCwJMHhmMiwgWCwgMCwJIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0KLS8qIDQ4NiBleHRlbnNpb25zLiAgKi8KLQoteyJic3dhcCIsICAgMSwgMHgwZmM4LCBYLCBDcHU0ODYsIGxfU3VmfFNob3J0Rm9ybSwJeyBSZWczMiwgMCwgMCB9IH0sCi17InhhZGQiLCAgICAyLCAweDBmYzAsIFgsIENwdTQ4NiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImNtcHhjaGciLCAyLCAweDBmYjAsIFgsIENwdTQ4NiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImludmQiLCAgICAwLCAweDBmMDgsIFgsIENwdTQ4NiwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17IndiaW52ZCIsICAwLCAweDBmMDksIFgsIENwdTQ4NiwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImludmxwZyIsICAxLCAweDBmMDEsIDcsIENwdTQ4NiwgTm9TdWZ8TW9kcm0sCQl7IEFueU1lbSwgMCwgMH0gfSwKLQotLyogNTg2IGFuZCBsYXRlIDQ4NiBleHRlbnNpb25zLiAgKi8KLXsiY3B1aWQiLCAgIDAsIDB4MGZhMiwgWCwgQ3B1NDg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBleHRlbnNpb25zLiAgKi8KLXsid3Jtc3IiLCAgIDAsIDB4MGYzMCwgWCwgQ3B1NTg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmR0c2MiLCAgIDAsIDB4MGYzMSwgWCwgQ3B1NTg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmRtc3IiLCAgIDAsIDB4MGYzMiwgWCwgQ3B1NTg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsiY21weGNoZzhiIiwxLDB4MGZjNywgMSwgQ3B1NTg2LCBOb1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLS8qIFBlbnRpdW0gSUkvUGVudGl1bSBQcm8gZXh0ZW5zaW9ucy4gICovCi17InN5c2VudGVyIiwwLCAweDBmMzQsIFgsIENwdTY4NiwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InN5c2V4aXQiLCAwLCAweDBmMzUsIFgsIENwdTY4NiwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImZ4c2F2ZSIsICAxLCAweDBmYWUsIDAsIENwdTY4NiwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmeHJzdG9yIiwgMSwgMHgwZmFlLCAxLCBDcHU2ODYsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsicmRwbWMiLCAgIDAsIDB4MGYzMywgWCwgQ3B1Njg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLS8qIG9mZmljaWFsIHVuZGVmaW5lZCBpbnN0ci4gKi8KLXsidWQyIiwJICAgIDAsIDB4MGYwYiwgWCwgQ3B1Njg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLS8qIGFsaWFzIGZvciB1ZDIgKi8KLXsidWQyYSIsICAgIDAsIDB4MGYwYiwgWCwgQ3B1Njg2LCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLS8qIDJuZC4gb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwoteyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBDcHU2ODYsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAotCi17ImNtb3ZvIiwgICAyLCAweDBmNDAsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZiIiwgICAyLCAweDBmNDIsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZjIiwgICAyLCAweDBmNDIsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZhZSIsICAyLCAweDBmNDMsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYyIsICAyLCAweDBmNDMsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZlIiwgICAyLCAweDBmNDQsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3Z6IiwgICAyLCAweDBmNDQsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZueiIsICAyLCAweDBmNDUsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZiZSIsICAyLCAweDBmNDYsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZhIiwgICAyLCAweDBmNDcsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYmUiLCAyLCAweDBmNDcsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucyIsICAyLCAweDBmNDksIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZwIiwgICAyLCAweDBmNGEsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZsIiwgICAyLCAweDBmNGMsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZ2UiLCAyLCAweDBmNGMsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubCIsICAyLCAweDBmNGQsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZsZSIsICAyLCAweDBmNGUsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnIiwgICAyLCAweDBmNGYsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubGUiLCAyLCAweDBmNGYsIFgsIENwdTY4Niwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLXsiZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuYWUiLDIsIDB4ZGFjMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZlIiwgIDIsIDB4ZGFjOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuYSIsIDIsIDB4ZGFkMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3Z1IiwgIDIsIDB4ZGFkOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuYiIsIDIsIDB4ZGJjMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuZSIsIDIsIDB4ZGJjOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZuYmUiLDIsIDB4ZGJkMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZudSIsIDIsIDB4ZGJkOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQoteyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY29taSIsICAgMCwgMHhkYmYxLCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbWkiLCAgIDEsIDB4ZGJmMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbWkiLCAgMCwgMHhkYmU5LCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZnVjb21pIiwgIDEsIDB4ZGJlOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY29tcGkiLCAgMiwgMHhkZmYwLCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY29tcGkiLCAgMCwgMHhkZmYxLCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWlwIiwgMiwgMHhkZmU4LCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMiwgMHhkZmU4LCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBDcHU2ODYsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZnVjb21waSIsIDEsIDB4ZGZlOCwgWCwgQ3B1Njg2LCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotCi0vKiBNTVggaW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyJlbW1zIiwgICAgIDAsIDB4MGY3NywgWCwgQ3B1TU1YLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnMzJ8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92ZCIsICAgICAyLCAweDBmN2UsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWCwgUmVnMzJ8TG9uZ01lbSwgMCB9IH0sCi17Im1vdnEiLCAgICAgMiwgMHgwZjZmLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWCwgUmVnTU1YfExvbmdNZW0sIDAgfSB9LAoteyJwYWNrc3NkdyIsIDIsIDB4MGY2YiwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhY2tzc3diIiwgMiwgMHgwZjYzLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYWRkYiIsICAgIDIsIDB4MGZmYywgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGR3IiwgICAgMiwgMHgwZmZkLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYWRkc2IiLCAgIDIsIDB4MGZlYywgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhZGRzdyIsICAgMiwgMHgwZmVkLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYWRkdXN3IiwgIDIsIDB4MGZkZCwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhbmQiLCAgICAgMiwgMHgwZmRiLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwY21wZXFiIiwgIDIsIDB4MGY3NCwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBlcXciLCAgMiwgMHgwZjc1LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwY21wZ3RiIiwgIDIsIDB4MGY2NCwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBjbXBndHciLCAgMiwgMHgwZjY1LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWFkZHdkIiwgIDIsIDB4MGZmNSwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtdWxodyIsICAgMiwgMHgwZmU1LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwb3IiLAkgICAgIDIsIDB4MGZlYiwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGx3IiwgICAgMiwgMHgwZmYxLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxkIiwgICAgMiwgMHgwZmYyLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbGQiLCAgICAyLCAweDBmNzIsIDYsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHEiLCAgICAyLCAweDBmNzMsIDYsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmF3IiwgICAgMiwgMHgwZmUxLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmFkIiwgICAgMiwgMHgwZmUyLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYWQiLCAgICAyLCAweDBmNzIsIDQsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybHciLCAgICAyLCAweDBmNzEsIDIsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmxkIiwgICAgMiwgMHgwZmQyLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmxxIiwgICAgMiwgMHgwZmQzLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybHEiLCAgICAyLCAweDBmNzMsIDIsIENwdU1NWCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHN1YnciLCAgICAyLCAweDBmZjksIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3ViZCIsICAgIDIsIDB4MGZmYSwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHN1YnN3IiwgICAyLCAweDBmZTksIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3VidXNiIiwgIDIsIDB4MGZkOCwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHVucGNraGJ3IiwyLCAweDBmNjgsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tod2QiLDIsIDB4MGY2OSwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHVucGNrbGJ3IiwyLCAweDBmNjAsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwdW5wY2tsd2QiLDIsIDB4MGY2MSwgWCwgQ3B1TU1YLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBDcHVNTVgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHhvciIsICAgICAyLCAweDBmZWYsIFgsIENwdU1NWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi0KLS8qIFBJSUkgS2F0bWFpIE5ldyBJbnN0cnVjdGlvbnMgLyBTSU1EIGluc3RydWN0aW9ucy4gICovCi0KLXsiYWRkcHMiLCAgICAgMiwgMHgwZjU4LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiYWRkc3MiLCAgICAgMiwgMHhmMzBmNTgsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRucHMiLCAgICAyLCAweDBmNTUsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRwcyIsICAgICAyLCAweDBmNTQsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGVxcHMiLCAgIDIsIDB4MGZjMiwgICAgMCwgQ3B1U1NFLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXNzIiwgICAyLCAweGYzMGZjMiwgIDAsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXBzIiwgICAyLCAweDBmYzIsICAgIDIsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVzcyIsICAgMiwgMHhmMzBmYzIsICAyLCBDcHVTU0UsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRwcyIsICAgMiwgMHgwZmMyLCAgICAxLCBDcHVTU0UsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGx0c3MiLCAgIDIsIDB4ZjMwZmMyLCAgMSwgQ3B1U1NFLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5lcXBzIiwgIDIsIDB4MGZjMiwgICAgNCwgQ3B1U1NFLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFzcyIsICAyLCAweGYzMGZjMiwgIDQsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVwcyIsICAyLCAweDBmYzIsICAgIDYsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlc3MiLCAgMiwgMHhmMzBmYzIsICA2LCBDcHVTU0UsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0cHMiLCAgMiwgMHgwZmMyLCAgICA1LCBDcHVTU0UsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5sdHNzIiwgIDIsIDB4ZjMwZmMyLCAgNSwgQ3B1U1NFLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG9yZHBzIiwgIDIsIDB4MGZjMiwgICAgNywgQ3B1U1NFLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRzcyIsICAyLCAweGYzMGZjMiwgIDcsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHBzIiwyLCAweDBmYzIsICAgIDMsIENwdVNTRSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRzcyIsMiwgMHhmMzBmYzIsICAzLCBDcHVTU0UsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wcHMiLCAgICAgMywgMHgwZmMyLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsiY21wc3MiLCAgICAgMywgMHhmMzBmYzIsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0gfSB9LAoteyJjb21pc3MiLCAgICAyLCAweDBmMmYsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHBpMnBzIiwgIDIsIDB4MGYyYSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHBzMnBpIiwgIDIsIDB4MGYyZCwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHNpMnNzIiwgIDIsIDB4ZjMwZjJhLCAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWczMnxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjdnRzczJzaSIsICAyLCAweGYzMGYyZCwgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiY3Z0dHBzMnBpIiwgMiwgMHgwZjJjLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsiY3Z0dHNzMnNpIiwgMiwgMHhmMzBmMmMsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWczMiwgMCB9IH0sCi17ImRpdnBzIiwgICAgIDIsIDB4MGY1ZSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImRpdnNzIiwgICAgIDIsIDB4ZjMwZjVlLCAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibGRteGNzciIsICAgMSwgMHgwZmFlLCAgICAyLCBDcHVTU0UsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsibWFza21vdnEiLCAgMiwgMHgwZmY3LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ01NWHxJbnZNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1heHBzIiwgICAgIDIsIDB4MGY1ZiwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1heHNzIiwgICAgIDIsIDB4ZjMwZjVmLCAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWlucHMiLCAgICAgMiwgMHgwZjVkLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWluc3MiLCAgICAgMiwgMHhmMzBmNWQsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZhcHMiLCAgICAyLCAweDBmMjgsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZhcHMiLCAgICAyLCAweDBmMjksICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtb3ZobHBzIiwgICAyLCAweDBmMTIsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92aHBzIiwgICAgMiwgMHgwZjE2LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZocHMiLCAgICAyLCAweDBmMTcsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmxocHMiLCAgIDIsIDB4MGYxNiwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZscHMiLCAgICAyLCAweDBmMTIsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmxwcyIsICAgIDIsIDB4MGYxMywgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bXNrcHMiLCAgMiwgMHgwZjUwLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZzMyLCAwIH0gfSwKLXsibW92bnRwcyIsICAgMiwgMHgwZjJiLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLCAJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bnRxIiwgICAgMiwgMHgwZmU3LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLCAJeyBSZWdNTVgsIExMb25nTWVtLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTAsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZzcyIsICAgICAyLCAweGYzMGYxMSwgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18V29yZE1lbSwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMCwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxMTG9uZ01lbSwgMCB9IH0sCi17Im11bHBzIiwgICAgIDIsIDB4MGY1OSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im11bHNzIiwgICAgIDIsIDB4ZjMwZjU5LCAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsib3JwcyIsICAgICAgMiwgMHgwZjU2LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicGF2Z2IiLCAgICAgMiwgMHgwZmUwLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGF2Z3ciLCAgICAgMiwgMHgwZmUzLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGV4dHJ3IiwgICAgMywgMHgwZmM1LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWCwgUmVnMzJ8SW52TWVtIH0gfSwKLXsicGluc3J3IiwgICAgMywgMHgwZmM0LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IEltbTgsIFJlZzMyfFNob3J0TWVtLCBSZWdNTVggfSB9LAoteyJwbWF4c3ciLCAgICAyLCAweDBmZWUsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWF4dWIiLCAgICAyLCAweDBmZGUsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWluc3ciLCAgICAyLCAweDBmZWEsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWludWIiLCAgICAyLCAweDBmZGEsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbW92bXNrYiIsICAyLCAweDBmZDcsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YLCBSZWczMnxJbnZNZW0sIDAgfSB9LAoteyJwbXVsaHV3IiwgICAyLCAweDBmZTQsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwcmVmZXRjaG50YSIsIDEsIDB4MGYxOCwgIDAsIENwdVNTRSwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MCIsICAxLCAweDBmMTgsICAxLCBDcHVTU0UsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDEiLCAgMSwgMHgwZjE4LCAgMiwgQ3B1U1NFLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQyIiwgIDEsIDB4MGYxOCwgIDMsIENwdVNTRSwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHNhZGJ3IiwgICAgMiwgMHgwZmY2LCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNodWZ3IiwgICAgMywgMHgwZjcwLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YIH0gfSwKLXsicmNwcHMiLCAgICAgMiwgMHgwZjUzLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicmNwc3MiLCAgICAgMiwgMHhmMzBmNTMsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyc3FydHBzIiwgICAyLCAweDBmNTIsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyc3FydHNzIiwgICAyLCAweGYzMGY1MiwgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNmZW5jZSIsICAgIDAsIDB4MGZhZWY4LCAgWCwgQ3B1U1NFLCBGUCwJCXsgMCwgMCwgMCB9IH0sCi17InNodWZwcyIsICAgIDMsIDB4MGZjNiwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSB9IH0sCi17InNxcnRwcyIsICAgIDIsIDB4MGY1MSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNxcnRzcyIsICAgIDIsIDB4ZjMwZjUxLCAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3RteGNzciIsICAgMSwgMHgwZmFlLCAgICAzLCBDcHVTU0UsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsic3VicHMiLCAgICAgMiwgMHgwZjVjLCAgICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3Vic3MiLCAgICAgMiwgMHhmMzBmNWMsICBYLCBDcHVTU0UsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1Y29taXNzIiwgICAyLCAweDBmMmUsICAgIFgsIENwdVNTRSwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNraHBzIiwgIDIsIDB4MGYxNSwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNrbHBzIiwgIDIsIDB4MGYxNCwgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InhvcnBzIiwgICAgIDIsIDB4MGY1NywgICAgWCwgQ3B1U1NFLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi0KLS8qIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyJwcmVmZXRjaCIsIDEsIDB4MGYwZCwJICAgMCwgQ3B1M2Rub3csIEZQfE1vZHJtLAkJeyBCeXRlTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h3IiwxLCAweDBmMGQsCSAgIDEsIENwdTNkbm93LCBGUHxNb2RybSwJCXsgQnl0ZU1lbSwgMCwgMCB9IH0sCi17ImZlbW1zIiwgICAgMCwgMHgwZjBlLAkgICBYLCBDcHUzZG5vdywgRlAsCQkJeyAwLCAwLCAwIH0gfSwKLXsicGF2Z3VzYiIsICAyLCAweDBmMGYsIDB4YmYsIENwdTNkbm93LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmMmlkIiwgICAgMiwgMHgwZjBmLCAweDFkLCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpdyIsICAgIDIsIDB4MGYwZiwgMHgxYywgQ3B1M2Rub3d8Q3B1Njg2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmYWNjIiwgICAgMiwgMHgwZjBmLCAweGFlLCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFkZCIsICAgIDIsIDB4MGYwZiwgMHg5ZSwgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZjbXBlcSIsICAyLCAweDBmMGYsIDB4YjAsIENwdTNkbm93LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZ2UiLCAgMiwgMHgwZjBmLCAweDkwLCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGd0IiwgIDIsIDB4MGYwZiwgMHhhMCwgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZtYXgiLCAgICAyLCAweDBmMGYsIDB4YTQsIENwdTNkbm93LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbWluIiwgICAgMiwgMHgwZjBmLCAweDk0LCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm11bCIsICAgIDIsIDB4MGYwZiwgMHhiNCwgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZuYWNjIiwgICAyLCAweDBmMGYsIDB4OGEsIENwdTNkbm93fENwdTY4NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnBuYWNjIiwgIDIsIDB4MGYwZiwgMHg4ZSwgQ3B1M2Rub3d8Q3B1Njg2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmcmNwIiwgICAgMiwgMHgwZjBmLCAweDk2LCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MSIsIDIsIDB4MGYwZiwgMHhhNiwgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyY3BpdDIiLCAyLCAweDBmMGYsIDB4YjYsIENwdTNkbm93LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmcnNxaXQxIiwgMiwgMHgwZjBmLCAweGE3LCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcXJ0IiwgIDIsIDB4MGYwZiwgMHg5NywgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZzdWIiLCAgICAyLCAweDBmMGYsIDB4OWEsIENwdTNkbm93LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmc3ViciIsICAgMiwgMHgwZjBmLCAweGFhLCBDcHUzZG5vdywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmZCIsICAgIDIsIDB4MGYwZiwgMHgwZCwgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGkyZnciLCAgICAyLCAweDBmMGYsIDB4MGMsIENwdTNkbm93fENwdTY4NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbXVsaHJ3IiwgIDIsIDB4MGYwZiwgMHhiNywgQ3B1M2Rub3csIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHN3YXBkIiwgICAyLCAweDBmMGYsIDB4YmIsIENwdTNkbm93fENwdTY4NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi0vKiBzZW50aW5lbCAqLwote05VTEwsIDAsIDAsIDAsIDAsIDAsIHsgMCwgMCwgMH0gfQotfTsKLSN1bmRlZiBYCi0jdW5kZWYgTm9TdWYKLSN1bmRlZiBiX1N1ZgotI3VuZGVmIHdfU3VmCi0jdW5kZWYgbF9TdWYKLSN1bmRlZiBkX1N1ZgotI3VuZGVmIHhfU3VmCi0jdW5kZWYgYndfU3VmCi0jdW5kZWYgYmxfU3VmCi0jdW5kZWYgd2xfU3VmCi0jdW5kZWYgd2xkX1N1ZgotI3VuZGVmIHNsX1N1ZgotI3VuZGVmIHNsZF9TdWYKLSN1bmRlZiBzbGR4X1N1ZgotI3VuZGVmIGJ3bF9TdWYKLSN1bmRlZiBid2xkX1N1ZgotI3VuZGVmIEZQCi0jdW5kZWYgbF9GUAotI3VuZGVmIGRfRlAKLSN1bmRlZiB4X0ZQCi0jdW5kZWYgc2xfRlAKLSN1bmRlZiBzbGRfRlAKLSN1bmRlZiBzbGR4X0ZQCi0KLSNkZWZpbmUgTUFYX01ORU1fU0laRSAxNgkvKiBmb3IgcGFyc2luZyBpbnNuIG1uZW1vbmljcyBmcm9tIGlucHV0ICovCi0KLQotLyogMzg2IHJlZ2lzdGVyIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSBpMzg2X3JlZ3RhYltdID0gewotICAvKiBtYWtlICVzdCBmaXJzdCBhcyB3ZSB0ZXN0IGZvciBpdCAqLwotICB7InN0IiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICAvKiA4IGJpdCByZWdzICovCi0gIHsiYWwiLCBSZWc4fEFjYywgMH0sCi0gIHsiY2wiLCBSZWc4fFNoaWZ0Q291bnQsIDF9LAotICB7ImRsIiwgUmVnOCwgMn0sCi0gIHsiYmwiLCBSZWc4LCAzfSwKLSAgeyJhaCIsIFJlZzgsIDR9LAotICB7ImNoIiwgUmVnOCwgNX0sCi0gIHsiZGgiLCBSZWc4LCA2fSwKLSAgeyJiaCIsIFJlZzgsIDd9LAotICAvKiAxNiBiaXQgcmVncyAqLwotICB7ImF4IiwgUmVnMTZ8QWNjLCAwfSwKLSAgeyJjeCIsIFJlZzE2LCAxfSwKLSAgeyJkeCIsIFJlZzE2fEluT3V0UG9ydFJlZywgMn0sCi0gIHsiYngiLCBSZWcxNnxCYXNlSW5kZXgsIDN9LAotICB7InNwIiwgUmVnMTYsIDR9LAotICB7ImJwIiwgUmVnMTZ8QmFzZUluZGV4LCA1fSwKLSAgeyJzaSIsIFJlZzE2fEJhc2VJbmRleCwgNn0sCi0gIHsiZGkiLCBSZWcxNnxCYXNlSW5kZXgsIDd9LAotICAvKiAzMiBiaXQgcmVncyAqLwotICB7ImVheCIsIFJlZzMyfEJhc2VJbmRleHxBY2MsIDB9LAotICB7ImVjeCIsIFJlZzMyfEJhc2VJbmRleCwgMX0sCi0gIHsiZWR4IiwgUmVnMzJ8QmFzZUluZGV4LCAyfSwKLSAgeyJlYngiLCBSZWczMnxCYXNlSW5kZXgsIDN9LAotICB7ImVzcCIsIFJlZzMyLCA0fSwKLSAgeyJlYnAiLCBSZWczMnxCYXNlSW5kZXgsIDV9LAotICB7ImVzaSIsIFJlZzMyfEJhc2VJbmRleCwgNn0sCi0gIHsiZWRpIiwgUmVnMzJ8QmFzZUluZGV4LCA3fSwKLSAgLyogc2VnbWVudCByZWdpc3RlcnMgKi8KLSAgeyJlcyIsIFNSZWcyLCAwfSwKLSAgeyJjcyIsIFNSZWcyLCAxfSwKLSAgeyJzcyIsIFNSZWcyLCAyfSwKLSAgeyJkcyIsIFNSZWcyLCAzfSwKLSAgeyJmcyIsIFNSZWczLCA0fSwKLSAgeyJncyIsIFNSZWczLCA1fSwKLSAgLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSAgeyJjcjAiLCBDb250cm9sLCAwfSwKLSAgeyJjcjEiLCBDb250cm9sLCAxfSwKLSAgeyJjcjIiLCBDb250cm9sLCAyfSwKLSAgeyJjcjMiLCBDb250cm9sLCAzfSwKLSAgeyJjcjQiLCBDb250cm9sLCA0fSwKLSAgeyJjcjUiLCBDb250cm9sLCA1fSwKLSAgeyJjcjYiLCBDb250cm9sLCA2fSwKLSAgeyJjcjciLCBDb250cm9sLCA3fSwKLSAgLyogZGVidWcgcmVnaXN0ZXJzICovCi0gIHsiZGIwIiwgRGVidWcsIDB9LAotICB7ImRiMSIsIERlYnVnLCAxfSwKLSAgeyJkYjIiLCBEZWJ1ZywgMn0sCi0gIHsiZGIzIiwgRGVidWcsIDN9LAotICB7ImRiNCIsIERlYnVnLCA0fSwKLSAgeyJkYjUiLCBEZWJ1ZywgNX0sCi0gIHsiZGI2IiwgRGVidWcsIDZ9LAotICB7ImRiNyIsIERlYnVnLCA3fSwKLSAgeyJkcjAiLCBEZWJ1ZywgMH0sCi0gIHsiZHIxIiwgRGVidWcsIDF9LAotICB7ImRyMiIsIERlYnVnLCAyfSwKLSAgeyJkcjMiLCBEZWJ1ZywgM30sCi0gIHsiZHI0IiwgRGVidWcsIDR9LAotICB7ImRyNSIsIERlYnVnLCA1fSwKLSAgeyJkcjYiLCBEZWJ1ZywgNn0sCi0gIHsiZHI3IiwgRGVidWcsIDd9LAotICAvKiB0ZXN0IHJlZ2lzdGVycyAqLwotICB7InRyMCIsIFRlc3QsIDB9LAotICB7InRyMSIsIFRlc3QsIDF9LAotICB7InRyMiIsIFRlc3QsIDJ9LAotICB7InRyMyIsIFRlc3QsIDN9LAotICB7InRyNCIsIFRlc3QsIDR9LAotICB7InRyNSIsIFRlc3QsIDV9LAotICB7InRyNiIsIFRlc3QsIDZ9LAotICB7InRyNyIsIFRlc3QsIDd9LAotICAvKiBtbXggYW5kIHNpbWQgcmVnaXN0ZXJzICovCi0gIHsibW0wIiwgUmVnTU1YLCAwfSwKLSAgeyJtbTEiLCBSZWdNTVgsIDF9LAotICB7Im1tMiIsIFJlZ01NWCwgMn0sCi0gIHsibW0zIiwgUmVnTU1YLCAzfSwKLSAgeyJtbTQiLCBSZWdNTVgsIDR9LAotICB7Im1tNSIsIFJlZ01NWCwgNX0sCi0gIHsibW02IiwgUmVnTU1YLCA2fSwKLSAgeyJtbTciLCBSZWdNTVgsIDd9LAotICB7InhtbTAiLCBSZWdYTU0sIDB9LAotICB7InhtbTEiLCBSZWdYTU0sIDF9LAotICB7InhtbTIiLCBSZWdYTU0sIDJ9LAotICB7InhtbTMiLCBSZWdYTU0sIDN9LAotICB7InhtbTQiLCBSZWdYTU0sIDR9LAotICB7InhtbTUiLCBSZWdYTU0sIDV9LAotICB7InhtbTYiLCBSZWdYTU0sIDZ9LAotICB7InhtbTciLCBSZWdYTU0sIDd9Ci19OwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5IGkzODZfZmxvYXRfcmVndGFiW10gPSB7Ci0gIHsic3QoMCkiLCBGbG9hdFJlZ3xGbG9hdEFjYywgMH0sCi0gIHsic3QoMSkiLCBGbG9hdFJlZywgMX0sCi0gIHsic3QoMikiLCBGbG9hdFJlZywgMn0sCi0gIHsic3QoMykiLCBGbG9hdFJlZywgM30sCi0gIHsic3QoNCkiLCBGbG9hdFJlZywgNH0sCi0gIHsic3QoNSkiLCBGbG9hdFJlZywgNX0sCi0gIHsic3QoNikiLCBGbG9hdFJlZywgNn0sCi0gIHsic3QoNykiLCBGbG9hdFJlZywgN30KLX07Ci0KLSNkZWZpbmUgTUFYX1JFR19OQU1FX1NJWkUgOAkvKiBmb3IgcGFyc2luZyByZWdpc3RlciBuYW1lcyBmcm9tIGlucHV0ICovCi0KLS8qIHNlZ21lbnQgc3R1ZmYgKi8KLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgY3MgPSB7ICJjcyIsIDB4MmUgfTsKLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgZHMgPSB7ICJkcyIsIDB4M2UgfTsKLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgc3MgPSB7ICJzcyIsIDB4MzYgfTsKLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgZXMgPSB7ICJlcyIsIDB4MjYgfTsKLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgZnMgPSB7ICJmcyIsIDB4NjQgfTsKLXN0YXRpYyBjb25zdCBzZWdfZW50cnkgZ3MgPSB7ICJncyIsIDB4NjUgfTsKLQotLyogZW5kIG9mIG9wY29kZS9pMzg2LmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaCBiL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlYmQyNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIGk4NjAuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgZGlzYXNzZW1ibGVyLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoY29uc3QpCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyoKLSAqIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuCi0gKi8KLXN0cnVjdCBpODYwX29wY29kZQotewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0LiAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGxvc2U7CS8qIEJpdHMgdGhhdCBtdXN0IG5vdCBiZSBzZXQuICAqLwotICAgIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgcG9zc2libGUgZXhwYW5kLWluc3RydWN0aW9uLiAgKi8KLSAgICBjaGFyIGV4cGFuZDsKLX07Ci0KLWVudW0gZXhwYW5kX3R5cGUKLXsKLSAgICBFX01PViA9IDEsIEVfQUREUiwgRV9VMzIsIEVfQU5ELCBFX1MzMiwgRV9ERUxBWQotfTsKLQotLyoKLSAgIEFsbCBpODYwIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIHBzZXVkb2luc3RydWN0aW9ucwotICAgYW5kIHRoZSBvcGVyYXRpb25zIHV0aWxpemluZyBhIDMyLWJpdCBhZGRyZXNzIGV4cHJlc3Npb24sIGFuCi0gICB1bnNpZ25lZCAzMi1iaXQgY29uc3RhbnQsIG9yIGEgc2lnbmVkIDMyLWJpdCBjb25zdGFudC4KLSAgIFRoZXNlIG9wY29kZXMgYXJlIGV4cGFuZGVkIGludG8gYSB0d28taW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZm9yCi0gICBhbnkgc2l0dWF0aW9uIHdoZXJlIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBkb2VzIG5vdCBmaXQgaW4gMzIgYml0cy4KLSAgIEluIHRoZSBjYXNlIG9mIHRoZSBhZGQgYW5kIHN1YnRyYWN0IG9wZXJhdGlvbnMgdGhlIGV4cGFuc2lvbiBpcwotICAgdG8gYSB0aHJlZS1pbnN0cnVjdGlvbiBzZXF1ZW5jZSAoZXg6IG9yaCwgb3IsIGFkZHMpLiAgSW4gY2FzZXMKLSAgIHdoZXJlIHRoZSBhZGRyZXNzIGlzIHRvIGJlIHJlbG9jYXRlZCwgdGhlIGluc3RydWN0aW9uIGlzCi0gICBleHBhbmRlZCB0byBoYW5kbGUgdGhlIHdvcnNlIGNhc2UsIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIGF0Ci0gICB0aGUgZmluYWwgbGluayBpZiB0aGUgYWN0dWFsIGFkZHJlc3Mgd2VyZSBrbm93bi4KLQotICAgVGhlIHBzZXVkb2luc3RydWN0aW9ucyBhcmU6ICBtb3YsIGZtb3YsIHBtb3YsIG5vcCwgYW5kIGZub3AuCi0gICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIGEgb25lIG9yIHR3byBpbnN0cnVjdGlvbgotICAgc2VxdWVuY2Ugb2Ygb3RoZXIgb3BlcmF0aW9ucy4KLQotICAgVGhlIG1hdGNoIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBhCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyCi0gICBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICAjICAgIE51bWJlciB1c2VkIGJ5IG9wdGltaXplci4gIEl0IGlzIGlnbm9yZWQuCi0gICAxICAgIHNyYzEgaW50ZWdlciByZWdpc3Rlci4KLSAgIDIgICAgc3JjMiBpbnRlZ2VyIHJlZ2lzdGVyLgotICAgZCAgICBkZXN0IHJlZ2lzdGVyLgotICAgYwljdHJscmVnIGNvbnRyb2wgcmVnaXN0ZXIuCi0gICBpICAgIDE2IGJpdCBpbW1lZGlhdGUuCi0gICBJICAgIDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCi0gICA1ICAgIDUgYml0IGltbWVkaWF0ZS4KLSAgIGwgICAgbGJyb2ZmIDI2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0gICByICAgIHNicm9mZiAxNiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotICAgcwlzcGxpdCAxNiBiaXQgaW1tZWRpYXRlLgotICAgUwlzcGxpdCAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkLgotICAgZSAgICBzcmMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotICAgZiAgICBzcmMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotICAgZyAgICBkZXN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCi0qLwotCi0vKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhpcyB0YWJsZSBpcyBzaWduaWZpY2FudDoKLSAgIAotICAgKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlCi0gICBjb25zZWN1dGl2ZS4gIElmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgotCi0gICAqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTg2MF9vcGNvZGUgaTg2MF9vcGNvZGVzW10gPQotewotCi0vKiBSRUctRm9ybWF0IEluc3RydWN0aW9ucyAqLwoteyAibGQuYyIsCTB4MzAwMDAwMDAsIDB4Y2MwMDAwMDAsICJjLGQiLCAwIH0sCS8qIGxkLmMgY3NyYzIsaWRlc3QgKi8KLXsgImxkLmIiLAkweDAwMDAwMDAwLCAweGZjMDAwMDAwLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5iIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQuYiIsCTB4MDQwMDAwMDAsIDB4ZjgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQuYiAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5zIiwJMHgxMDAwMDAwMCwgMHhlYzAwMDAwMSwgIjEoMiksZCIsIDAgfSwJLyogbGQucyBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLnMiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLnMgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwoteyAibGQubCIsCTB4MTAwMDAwMDEsIDB4ZWMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmwgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5sIiwJMHgxNDAwMDAwMSwgMHhlODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5sICNjb25zdChpc3JjMiksaWRlc3QgKi8KLQoteyAic3QuYyIsCTB4MzgwMDAwMDAsIDB4YzQwMDAwMDAsICIxLGMiLCAwIH0sCS8qIHN0LmMgaXNyYzFuaSxjc3JjMiAqLwoteyAic3QuYiIsCTB4MGMwMDAwMDAsIDB4ZjAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QuYiBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLXsgInN0LnMiLAkweDFjMDAwMDAwLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LnMgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi17ICJzdC5sIiwJMHgxYzAwMDAwMSwgMHhlMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5sIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwotCi17ICJpeGZyIiwJMHgwODAwMDAwMCwgMHhmNDAwMDAwMCwgIjEsZyIsIDAgfSwJLyogaXhmciBpc3JjMW5pLGZkZXN0ICovCi0KLXsgImZsZC5sIiwJMHgyMDAwMDAwMiwgMHhkYzAwMDAwMSwgIjEoMiksZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjQwMDAwMDIsIDB4ZDgwMDAwMDEsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLmwgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmwiLAkweDIwMDAwMDAzLCAweGRjMDAwMDAwLCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5sIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjQwMDAwMDMsIDB4ZDgwMDAwMDAsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyMDAwMDAwMCwgMHhkYzAwMDAwNywgIjEoMiksZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjQwMDAwMDAsIDB4ZDgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLmQgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDIwMDAwMDAxLCAweGRjMDAwMDA2LCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjQwMDAwMDEsIDB4ZDgwMDAwMDYsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyMDAwMDAwNCwgMHhkYzAwMDAwMywgIjEoMiksZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjQwMDAwMDQsIDB4ZDgwMDAwMDMsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLnEgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDIwMDAwMDA1LCAweGRjMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5xIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjQwMDAwMDUsIDB4ZDgwMDAwMDIsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLQoteyAicGZsZC5sIiwJMHg2MDAwMDAwMCwgMHg5YzAwMDAwMywgIjEoMiksZyIsIDAgfSwJLyogcGZsZC5sIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2NDAwMDAwMCwgMHg5ODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBwZmxkLmwgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2MDAwMDAwMSwgMHg5YzAwMDAwMiwgIjEoMikrKyxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQubCIsCTB4NjQwMDAwMDEsIDB4OTgwMDAwMDIsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBwZmxkLmwgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDYwMDAwMDAwLCAweDljMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmQgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDY0MDAwMDAwLCAweDk4MDAwMDA3LCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDYwMDAwMDAxLCAweDljMDAwMDA2LCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQuZCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLQoteyAiZnN0LmwiLAkweDI4MDAwMDAyLCAweGQ0MDAwMDAxLCAiZywxKDIpIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikgKi8KLXsgImZzdC5sIiwJMHgyYzAwMDAwMiwgMHhkMDAwMDAwMSwgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBmc3QubCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJmc3QubCIsCTB4MjgwMDAwMDMsIDB4ZDQwMDAwMDAsICJnLDEoMikrKyIsIDAgfSwJLyogZnN0LmwgZmRlc3QsaXNyYzEoaXNyYzIpKysgKi8KLXsgImZzdC5sIiwJMHgyYzAwMDAwMywgMHhkMDAwMDAwMCwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLwoteyAiZnN0LmQiLAkweDI4MDAwMDAwLCAweGQ0MDAwMDA3LCAiZywxKDIpIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikgKi8KLXsgImZzdC5kIiwJMHgyYzAwMDAwMCwgMHhkMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBmc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJmc3QuZCIsCTB4MjgwMDAwMDEsIDB4ZDQwMDAwMDYsICJnLDEoMikrKyIsIDAgfSwJLyogZnN0LmQgZmRlc3QsaXNyYzEoaXNyYzIpKysgKi8KLXsgImZzdC5kIiwJMHgyYzAwMDAwMSwgMHhkMDAwMDAwNiwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLwotCi17ICJwc3QuZCIsCTB4M2MwMDAwMDAsIDB4YzAwMDAwMDcsICJnLGkoMikiLCBFX0FERFIgfSwJLyogcHN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLwoteyAicHN0LmQiLAkweDNjMDAwMDAxLCAweGMwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogcHN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgImFkZHUiLAkweDgwMDAwMDAwLCAweDdjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFkZHUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFkZHUiLAkweDg0MDAwMDAwLCAweDc4MDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBhZGR1ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYWRkcyIsCTB4OTAwMDAwMDAsIDB4NmMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkcyBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYWRkcyIsCTB4OTQwMDAwMDAsIDB4NjgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJzdWJ1IiwJMHg4ODAwMDAwMCwgMHg3NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzdWJ1IGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzdWJ1IiwJMHg4YzAwMDAwMCwgMHg3MDAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogc3VidSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnMiLAkweDk4MDAwMDAwLCAweDY0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnMgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnMiLAkweDljMDAwMDAwLCAweDYwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJzICNjb25zdCxpc3JjMixpZGVzdCAqLwotCi17ICJzaGwiLAkweGEwMDAwMDAwLCAweDVjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNobCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hsIiwJMHhhNDAwMDAwMCwgMHg1ODAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaGwgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJzaHIiLAkweGE4MDAwMDAwLCAweDU0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNociBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hyIiwJMHhhYzAwMDAwMCwgMHg1MDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaHIgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJzaHJkIiwJMHhiMDAwMDAwMCwgMHg0YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHJkIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHJhIiwJMHhiODAwMDAwMCwgMHg0NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHJhIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHJhIiwJMHhiYzAwMDAwMCwgMHg0MDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaHJhICNjb25zdCxpc3JjMixpZGVzdCAqLwotCi17ICJtb3YiLAkweGEwMDAwMDAwLCAweDVjMDBmODAwLCAiMixkIiwgMCB9LAkvKiBzaGwgcjAsaXNyYzIsaWRlc3QgKi8KLXsgIm1vdiIsCTB4OTQwMDAwMDAsIDB4NjllMDAwMDAsICJpLGQiLCBFX01PViB9LAkvKiBhZGRzICNjb25zdCxyMCxpZGVzdCAqLwoteyAibm9wIiwJMHhhMDAwMDAwMCwgMHg1ZmZmZjgwMCwgIiIsIDAgfSwJLyogc2hsIHIwLHIwLHIwICovCi17ICJmbm9wIiwJMHhiMDAwMDAwMCwgMHg0ZmZmZjgwMCwgIiIsIDAgfSwJLyogc2hyZCByMCxyMCxyMCAqLwotCi17ICJ0cmFwIiwJMHg0NDAwMDAwMCwgMHhiODAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB0cmFwIGlzcmMxbmksaXNyYzIsaWRlc3QgKi8KLQoteyAiZmx1c2giLAkweDM0MDAwMDAwLCAweGM4MWYwMDAxLCAiaSgyKSIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpICovCi17ICJmbHVzaCIsCTB4MzQwMDAwMDEsIDB4YzgxZjAwMDAsICJpKDIpKysiLCBFX0FERFIgfSwJLyogZmx1c2ggI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgImFuZCIsCTB4YzAwMDAwMDAsIDB4M2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmQiLAkweGM0MDAwMDAwLCAweDM4MDAwMDAwLCAiaSwyLGQiLCBFX0FORCB9LAkvKiBhbmQgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRoIiwJMHhjODAwMDAwMCwgMHgzNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRoIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmRoIiwJMHhjYzAwMDAwMCwgMHgzMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBhbmRoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90IiwJMHhkMDAwMDAwMCwgMHgyYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRub3QgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZG5vdCIsCTB4ZDQwMDAwMDAsIDB4MjgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIGFuZG5vdCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZG5vdGgiLAkweGQ4MDAwMDAwLCAweDI0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZG5vdGgiLAkweGRjMDAwMDAwLCAweDIwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZG5vdGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJvciIsCQkweGUwMDAwMDAwLCAweDFjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIG9yIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJvciIsCQkweGU0MDAwMDAwLCAweDE4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiBvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgIm9yaCIsCTB4ZTgwMDAwMDAsIDB4MTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3JoIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJvcmgiLAkweGVjMDAwMDAwLCAweDEwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIG9yaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInhvciIsCTB4ZjAwMDAwMDAsIDB4MGMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogeG9yIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJ4b3IiLAkweGY0MDAwMDAwLCAweDA4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiB4b3IgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJ4b3JoIiwJMHhmODAwMDAwMCwgMHgwNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3JoIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJ4b3JoIiwJMHhmYzAwMDAwMCwgMHgwMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiB4b3JoICNjb25zdCxpc3JjMixpZGVzdCAqLwotCi17ICJidGUiLAkweDU4MDAwMDAwLCAweGE0MDAwMDAwLCAiMSwyLHMiLCAwIH0sCS8qIGJ0ZSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCi17ICJidGUiLAkweDVjMDAwMDAwLCAweGEwMDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0ZSAjY29uc3Q1LGlzcmMyLHNicm9mZiAqLwoteyAiYnRuZSIsCTB4NTAwMDAwMDAsIDB4YWMwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRuZSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCi17ICJidG5lIiwJMHg1NDAwMDAwMCwgMHhhODAwMDAwMCwgIjUsMixzIiwgMCB9LAkvKiBidG5lICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCi17ICJibGEiLAkweGI0MDAwMDAwLCAweDQ4MDAwMDAwLCAiMSwyLHMiLCBFX0RFTEFZIH0sCS8qIGJsYSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCi17ICJicmkiLAkweDQwMDAwMDAwLCAweGJjMDAwMDAwLCAiMSIsIEVfREVMQVkgfSwJLyogYnJpIGlzcmMxbmkgKi8KLQotLyogQ29yZSBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCi17ICJsb2NrIiwJMHg0YzAwMDAwMSwgMHhiMDAwMDAxZSwgIiIsIDAgfSwJLyogbG9jayBzZXQgQkwgaW4gZGlyYmFzZSAqLwoteyAiY2FsbGkiLAkweDRjMDAwMDAyLCAweGIwMDAwMDFkLCAiMSIsIEVfREVMQVkgfSwJLyogY2FsbGkgaXNyYzFuaSAqLwoteyAiaW50b3ZyIiwJMHg0YzAwMDAwNCwgMHhiMDAwMDAxYiwgIiIsIDAgfSwJLyogaW50b3ZyIHRyYXAgb24gaW50ZWdlciBvdmVyZmxvdyAqLwoteyAidW5sb2NrIiwJMHg0YzAwMDAwNywgMHhiMDAwMDAxOCwgIiIsIDAgfSwJLyogdW5sb2NrIGNsZWFyIEJMIGluIGRpcmJhc2UgKi8KLQotLyogQ1RSTC1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCi17ICJiciIsCQkweDY4MDAwMDAwLCAweDk0MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYnIgbGJyb2ZmICovCi17ICJjYWxsIiwJMHg2YzAwMDAwMCwgMHg5MDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGNhbGwgbGJyb2ZmICovCi17ICJiYyIsCQkweDcwMDAwMDAwLCAweDhjMDAwMDAwLCAibCIsIDAgfSwJLyogYmMgbGJyb2ZmICovCi17ICJiYy50IiwJMHg3NDAwMDAwMCwgMHg4ODAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJjLnQgbGJyb2ZmICovCi17ICJibmMiLAkweDc4MDAwMDAwLCAweDg0MDAwMDAwLCAibCIsIDAgfSwJLyogYm5jIGxicm9mZiAqLwoteyAiYm5jLnQiLAkweDdjMDAwMDAwLCAweDgwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYm5jLnQgbGJyb2ZmICovCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZmFtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInIycDEuc3MiLAkweDQ4MDAwNDAwLCAweGI0MDAwM2ZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnAxLnNkIiwJMHg0ODAwMDQ4MCwgMHhiNDAwMDM3ZiwgImUsZixnIiwgMCB9LAoteyAicjJwMS5kZCIsCTB4NDgwMDA1ODAsIDB4YjQwMDAyN2YsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuc3MiLAkweDQ4MDAwNDAxLCAweGI0MDAwM2ZlLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LnNkIiwJMHg0ODAwMDQ4MSwgMHhiNDAwMDM3ZSwgImUsZixnIiwgMCB9LAoteyAicjJwdC5kZCIsCTB4NDgwMDA1ODEsIDB4YjQwMDAyN2UsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLnNzIiwJMHg0ODAwMDQwMiwgMHhiNDAwMDNmZCwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuc2QiLAkweDQ4MDAwNDgyLCAweGI0MDAwMzdkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5kZCIsCTB4NDgwMDA1ODIsIDB4YjQwMDAyN2QsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LnNzIiwJMHg0ODAwMDQwMywgMHhiNDAwMDNmYywgImUsZixnIiwgMCB9LAoteyAicjJhcHQuc2QiLAkweDQ4MDAwNDgzLCAweGI0MDAwMzdjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5kZCIsCTB4NDgwMDA1ODMsIDB4YjQwMDAyN2MsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuc3MiLAkweDQ4MDAwNDA0LCAweGI0MDAwM2ZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLnNkIiwJMHg0ODAwMDQ4NCwgMHhiNDAwMDM3YiwgImUsZixnIiwgMCB9LAoteyAiaTJwMS5kZCIsCTB4NDgwMDA1ODQsIDB4YjQwMDAyN2IsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuc3MiLAkweDQ4MDAwNDA1LCAweGI0MDAwM2ZhLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LnNkIiwJMHg0ODAwMDQ4NSwgMHhiNDAwMDM3YSwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5kZCIsCTB4NDgwMDA1ODUsIDB4YjQwMDAyN2EsICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLnNzIiwJMHg0ODAwMDQwNiwgMHhiNDAwMDNmOSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuc2QiLAkweDQ4MDAwNDg2LCAweGI0MDAwMzc5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5kZCIsCTB4NDgwMDA1ODYsIDB4YjQwMDAyNzksICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LnNzIiwJMHg0ODAwMDQwNywgMHhiNDAwMDNmOCwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuc2QiLAkweDQ4MDAwNDg3LCAweGI0MDAwMzc4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5kZCIsCTB4NDgwMDA1ODcsIDB4YjQwMDAyNzgsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFwMi5zcyIsCTB4NDgwMDA0MDgsIDB4YjQwMDAzZjcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFwMi5zZCIsCTB4NDgwMDA0ODgsIDB4YjQwMDAzNzcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFwMi5kZCIsCTB4NDgwMDA1ODgsIDB4YjQwMDAyNzcsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFwbS5zcyIsCTB4NDgwMDA0MDksIDB4YjQwMDAzZjYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFwbS5zZCIsCTB4NDgwMDA0ODksIDB4YjQwMDAzNzYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFwbS5kZCIsCTB4NDgwMDA1ODksIDB4YjQwMDAyNzYsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLnNzIiwJMHg0ODAwMDQwYSwgMHhiNDAwMDNmNSwgImUsZixnIiwgMCB9LAoteyAicmExcDIuc2QiLAkweDQ4MDAwNDhhLCAweGI0MDAwMzc1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5kZCIsCTB4NDgwMDA1OGEsIDB4YjQwMDAyNzUsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuc3MiLAkweDQ4MDAwNDBiLCAweGI0MDAwM2Y0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLnNkIiwJMHg0ODAwMDQ4YiwgMHhiNDAwMDM3NCwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5kZCIsCTB4NDgwMDA1OGIsIDB4YjQwMDAyNzQsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFwMi5zcyIsCTB4NDgwMDA0MGMsIDB4YjQwMDAzZjMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFwMi5zZCIsCTB4NDgwMDA0OGMsIDB4YjQwMDAzNzMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFwMi5kZCIsCTB4NDgwMDA1OGMsIDB4YjQwMDAyNzMsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwbS5zcyIsCTB4NDgwMDA0MGQsIDB4YjQwMDAzZjIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwbS5zZCIsCTB4NDgwMDA0OGQsIDB4YjQwMDAzNzIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwbS5kZCIsCTB4NDgwMDA1OGQsIDB4YjQwMDAyNzIsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLnNzIiwJMHg0ODAwMDQwZSwgMHhiNDAwMDNmMSwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuc2QiLAkweDQ4MDAwNDhlLCAweGI0MDAwMzcxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5kZCIsCTB4NDgwMDA1OGUsIDB4YjQwMDAyNzEsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwYS5zcyIsCTB4NDgwMDA0MGYsIDB4YjQwMDAzZjAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwYS5zZCIsCTB4NDgwMDA0OGYsIDB4YjQwMDAzNzAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRwYS5kZCIsCTB4NDgwMDA1OGYsIDB4YjQwMDAyNzAsICJlLGYsZyIsIDAgfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmc20ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicjJzMS5zcyIsCTB4NDgwMDA0MTAsIDB4YjQwMDAzZWYsICJlLGYsZyIsIDAgfSwKLXsgInIyczEuc2QiLAkweDQ4MDAwNDkwLCAweGI0MDAwMzZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnMxLmRkIiwJMHg0ODAwMDU5MCwgMHhiNDAwMDI2ZiwgImUsZixnIiwgMCB9LAoteyAicjJzdC5zcyIsCTB4NDgwMDA0MTEsIDB4YjQwMDAzZWUsICJlLGYsZyIsIDAgfSwKLXsgInIyc3Quc2QiLAkweDQ4MDAwNDkxLCAweGI0MDAwMzZlLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LmRkIiwJMHg0ODAwMDU5MSwgMHhiNDAwMDI2ZSwgImUsZixnIiwgMCB9LAoteyAicjJhczEuc3MiLAkweDQ4MDAwNDEyLCAweGI0MDAwM2VkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5zZCIsCTB4NDgwMDA0OTIsIDB4YjQwMDAzNmQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLmRkIiwJMHg0ODAwMDU5MiwgMHhiNDAwMDI2ZCwgImUsZixnIiwgMCB9LAoteyAicjJhc3Quc3MiLAkweDQ4MDAwNDEzLCAweGI0MDAwM2VjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5zZCIsCTB4NDgwMDA0OTMsIDB4YjQwMDAzNmMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LmRkIiwJMHg0ODAwMDU5MywgMHhiNDAwMDI2YywgImUsZixnIiwgMCB9LAoteyAiaTJzMS5zcyIsCTB4NDgwMDA0MTQsIDB4YjQwMDAzZWIsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuc2QiLAkweDQ4MDAwNDk0LCAweGI0MDAwMzZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLmRkIiwJMHg0ODAwMDU5NCwgMHhiNDAwMDI2YiwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5zcyIsCTB4NDgwMDA0MTUsIDB4YjQwMDAzZWEsICJlLGYsZyIsIDAgfSwKLXsgImkyc3Quc2QiLAkweDQ4MDAwNDk1LCAweGI0MDAwMzZhLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LmRkIiwJMHg0ODAwMDU5NSwgMHhiNDAwMDI2YSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuc3MiLAkweDQ4MDAwNDE2LCAweGI0MDAwM2U5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5zZCIsCTB4NDgwMDA0OTYsIDB4YjQwMDAzNjksICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLmRkIiwJMHg0ODAwMDU5NiwgMHhiNDAwMDI2OSwgImUsZixnIiwgMCB9LAoteyAiaTJhc3Quc3MiLAkweDQ4MDAwNDE3LCAweGI0MDAwM2U4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5zZCIsCTB4NDgwMDA0OTcsIDB4YjQwMDAzNjgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LmRkIiwJMHg0ODAwMDU5NywgMHhiNDAwMDI2OCwgImUsZixnIiwgMCB9LAoteyAicmF0MXMyLnNzIiwJMHg0ODAwMDQxOCwgMHhiNDAwMDNlNywgImUsZixnIiwgMCB9LAoteyAicmF0MXMyLnNkIiwJMHg0ODAwMDQ5OCwgMHhiNDAwMDM2NywgImUsZixnIiwgMCB9LAoteyAicmF0MXMyLmRkIiwJMHg0ODAwMDU5OCwgMHhiNDAwMDI2NywgImUsZixnIiwgMCB9LAoteyAibTEyYXNtLnNzIiwJMHg0ODAwMDQxOSwgMHhiNDAwMDNlNiwgImUsZixnIiwgMCB9LAoteyAibTEyYXNtLnNkIiwJMHg0ODAwMDQ5OSwgMHhiNDAwMDM2NiwgImUsZixnIiwgMCB9LAoteyAibTEyYXNtLmRkIiwJMHg0ODAwMDU5OSwgMHhiNDAwMDI2NiwgImUsZixnIiwgMCB9LAoteyAicmExczIuc3MiLAkweDQ4MDAwNDFhLCAweGI0MDAwM2U1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5zZCIsCTB4NDgwMDA0OWEsIDB4YjQwMDAzNjUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLmRkIiwJMHg0ODAwMDU5YSwgMHhiNDAwMDI2NSwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5zcyIsCTB4NDgwMDA0MWIsIDB4YjQwMDAzZTQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2Euc2QiLAkweDQ4MDAwNDliLCAweGI0MDAwMzY0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLmRkIiwJMHg0ODAwMDU5YiwgMHhiNDAwMDI2NCwgImUsZixnIiwgMCB9LAoteyAiaWF0MXMyLnNzIiwJMHg0ODAwMDQxYywgMHhiNDAwMDNlMywgImUsZixnIiwgMCB9LAoteyAiaWF0MXMyLnNkIiwJMHg0ODAwMDQ5YywgMHhiNDAwMDM2MywgImUsZixnIiwgMCB9LAoteyAiaWF0MXMyLmRkIiwJMHg0ODAwMDU5YywgMHhiNDAwMDI2MywgImUsZixnIiwgMCB9LAoteyAibTEydHNtLnNzIiwJMHg0ODAwMDQxZCwgMHhiNDAwMDNlMiwgImUsZixnIiwgMCB9LAoteyAibTEydHNtLnNkIiwJMHg0ODAwMDQ5ZCwgMHhiNDAwMDM2MiwgImUsZixnIiwgMCB9LAoteyAibTEydHNtLmRkIiwJMHg0ODAwMDU5ZCwgMHhiNDAwMDI2MiwgImUsZixnIiwgMCB9LAoteyAiaWExczIuc3MiLAkweDQ4MDAwNDFlLCAweGI0MDAwM2UxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5zZCIsCTB4NDgwMDA0OWUsIDB4YjQwMDAzNjEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLmRkIiwJMHg0ODAwMDU5ZSwgMHhiNDAwMDI2MSwgImUsZixnIiwgMCB9LAoteyAibTEydHNhLnNzIiwJMHg0ODAwMDQxZiwgMHhiNDAwMDNlMCwgImUsZixnIiwgMCB9LAoteyAibTEydHNhLnNkIiwJMHg0ODAwMDQ5ZiwgMHhiNDAwMDM2MCwgImUsZixnIiwgMCB9LAoteyAibTEydHNhLmRkIiwJMHg0ODAwMDU5ZiwgMHhiNDAwMDI2MCwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZtYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAibXIycDEuc3MiLAkweDQ4MDAwMDAwLCAweGI0MDAwN2ZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwMS5zZCIsCTB4NDgwMDAwODAsIDB4YjQwMDA3N2YsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnAxLmRkIiwJMHg0ODAwMDE4MCwgMHhiNDAwMDY3ZiwgImUsZixnIiwgMCB9LAoteyAibXIycHQuc3MiLAkweDQ4MDAwMDAxLCAweGI0MDAwN2ZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5zZCIsCTB4NDgwMDAwODEsIDB4YjQwMDA3N2UsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LmRkIiwJMHg0ODAwMDE4MSwgMHhiNDAwMDY3ZSwgImUsZixnIiwgMCB9LAoteyAibXIybXAxLnNzIiwJMHg0ODAwMDAwMiwgMHhiNDAwMDdmZCwgImUsZixnIiwgMCB9LAoteyAibXIybXAxLnNkIiwJMHg0ODAwMDA4MiwgMHhiNDAwMDc3ZCwgImUsZixnIiwgMCB9LAoteyAibXIybXAxLmRkIiwJMHg0ODAwMDE4MiwgMHhiNDAwMDY3ZCwgImUsZixnIiwgMCB9LAoteyAibXIybXB0LnNzIiwJMHg0ODAwMDAwMywgMHhiNDAwMDdmYywgImUsZixnIiwgMCB9LAoteyAibXIybXB0LnNkIiwJMHg0ODAwMDA4MywgMHhiNDAwMDc3YywgImUsZixnIiwgMCB9LAoteyAibXIybXB0LmRkIiwJMHg0ODAwMDE4MywgMHhiNDAwMDY3YywgImUsZixnIiwgMCB9LAoteyAibWkycDEuc3MiLAkweDQ4MDAwMDA0LCAweGI0MDAwN2ZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5zZCIsCTB4NDgwMDAwODQsIDB4YjQwMDA3N2IsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLmRkIiwJMHg0ODAwMDE4NCwgMHhiNDAwMDY3YiwgImUsZixnIiwgMCB9LAoteyAibWkycHQuc3MiLAkweDQ4MDAwMDA1LCAweGI0MDAwN2ZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5zZCIsCTB4NDgwMDAwODUsIDB4YjQwMDA3N2EsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LmRkIiwJMHg0ODAwMDE4NSwgMHhiNDAwMDY3YSwgImUsZixnIiwgMCB9LAoteyAibWkybXAxLnNzIiwJMHg0ODAwMDAwNiwgMHhiNDAwMDdmOSwgImUsZixnIiwgMCB9LAoteyAibWkybXAxLnNkIiwJMHg0ODAwMDA4NiwgMHhiNDAwMDc3OSwgImUsZixnIiwgMCB9LAoteyAibWkybXAxLmRkIiwJMHg0ODAwMDE4NiwgMHhiNDAwMDY3OSwgImUsZixnIiwgMCB9LAoteyAibWkybXB0LnNzIiwJMHg0ODAwMDAwNywgMHhiNDAwMDdmOCwgImUsZixnIiwgMCB9LAoteyAibWkybXB0LnNkIiwJMHg0ODAwMDA4NywgMHhiNDAwMDc3OCwgImUsZixnIiwgMCB9LAoteyAibWkybXB0LmRkIiwJMHg0ODAwMDE4NywgMHhiNDAwMDY3OCwgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5zcyIsCTB4NDgwMDAwMDgsIDB4YjQwMDA3ZjcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuc2QiLAkweDQ4MDAwMDg4LCAweGI0MDAwNzc3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLmRkIiwJMHg0ODAwMDE4OCwgMHhiNDAwMDY3NywgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5zcyIsCTB4NDgwMDAwMDksIDB4YjQwMDA3ZjYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uc2QiLAkweDQ4MDAwMDg5LCAweGI0MDAwNzc2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLmRkIiwJMHg0ODAwMDE4OSwgMHhiNDAwMDY3NiwgImUsZixnIiwgMCB9LAoteyAibXJtMXAyLnNzIiwJMHg0ODAwMDAwYSwgMHhiNDAwMDdmNSwgImUsZixnIiwgMCB9LAoteyAibXJtMXAyLnNkIiwJMHg0ODAwMDA4YSwgMHhiNDAwMDc3NSwgImUsZixnIiwgMCB9LAoteyAibXJtMXAyLmRkIiwJMHg0ODAwMDE4YSwgMHhiNDAwMDY3NSwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uc3MiLDB4NDgwMDAwMGIsIDB4YjQwMDA3ZjQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLnNkIiwweDQ4MDAwMDhiLCAweGI0MDAwNzc0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5kZCIsMHg0ODAwMDE4YiwgMHhiNDAwMDY3NCwgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5zcyIsCTB4NDgwMDAwMGMsIDB4YjQwMDA3ZjMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuc2QiLAkweDQ4MDAwMDhjLCAweGI0MDAwNzczLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLmRkIiwJMHg0ODAwMDE4YywgMHhiNDAwMDY3MywgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5zcyIsCTB4NDgwMDAwMGQsIDB4YjQwMDA3ZjIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uc2QiLAkweDQ4MDAwMDhkLCAweGI0MDAwNzcyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLmRkIiwJMHg0ODAwMDE4ZCwgMHhiNDAwMDY3MiwgImUsZixnIiwgMCB9LAoteyAibWltMXAyLnNzIiwJMHg0ODAwMDAwZSwgMHhiNDAwMDdmMSwgImUsZixnIiwgMCB9LAoteyAibWltMXAyLnNkIiwJMHg0ODAwMDA4ZSwgMHhiNDAwMDc3MSwgImUsZixnIiwgMCB9LAoteyAibWltMXAyLmRkIiwJMHg0ODAwMDE4ZSwgMHhiNDAwMDY3MSwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZtc20ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAibXIyczEuc3MiLAkweDQ4MDAwMDEwLCAweGI0MDAwN2VmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzMS5zZCIsCTB4NDgwMDAwOTAsIDB4YjQwMDA3NmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnMxLmRkIiwJMHg0ODAwMDE5MCwgMHhiNDAwMDY2ZiwgImUsZixnIiwgMCB9LAoteyAibXIyc3Quc3MiLAkweDQ4MDAwMDExLCAweGI0MDAwN2VlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5zZCIsCTB4NDgwMDAwOTEsIDB4YjQwMDA3NmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LmRkIiwJMHg0ODAwMDE5MSwgMHhiNDAwMDY2ZSwgImUsZixnIiwgMCB9LAoteyAibXIybXMxLnNzIiwJMHg0ODAwMDAxMiwgMHhiNDAwMDdlZCwgImUsZixnIiwgMCB9LAoteyAibXIybXMxLnNkIiwJMHg0ODAwMDA5MiwgMHhiNDAwMDc2ZCwgImUsZixnIiwgMCB9LAoteyAibXIybXMxLmRkIiwJMHg0ODAwMDE5MiwgMHhiNDAwMDY2ZCwgImUsZixnIiwgMCB9LAoteyAibXIybXN0LnNzIiwJMHg0ODAwMDAxMywgMHhiNDAwMDdlYywgImUsZixnIiwgMCB9LAoteyAibXIybXN0LnNkIiwJMHg0ODAwMDA5MywgMHhiNDAwMDc2YywgImUsZixnIiwgMCB9LAoteyAibXIybXN0LmRkIiwJMHg0ODAwMDE5MywgMHhiNDAwMDY2YywgImUsZixnIiwgMCB9LAoteyAibWkyczEuc3MiLAkweDQ4MDAwMDE0LCAweGI0MDAwN2ViLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5zZCIsCTB4NDgwMDAwOTQsIDB4YjQwMDA3NmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLmRkIiwJMHg0ODAwMDE5NCwgMHhiNDAwMDY2YiwgImUsZixnIiwgMCB9LAoteyAibWkyc3Quc3MiLAkweDQ4MDAwMDE1LCAweGI0MDAwN2VhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5zZCIsCTB4NDgwMDAwOTUsIDB4YjQwMDA3NmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LmRkIiwJMHg0ODAwMDE5NSwgMHhiNDAwMDY2YSwgImUsZixnIiwgMCB9LAoteyAibWkybXMxLnNzIiwJMHg0ODAwMDAxNiwgMHhiNDAwMDdlOSwgImUsZixnIiwgMCB9LAoteyAibWkybXMxLnNkIiwJMHg0ODAwMDA5NiwgMHhiNDAwMDc2OSwgImUsZixnIiwgMCB9LAoteyAibWkybXMxLmRkIiwJMHg0ODAwMDE5NiwgMHhiNDAwMDY2OSwgImUsZixnIiwgMCB9LAoteyAibWkybXN0LnNzIiwJMHg0ODAwMDAxNywgMHhiNDAwMDdlOCwgImUsZixnIiwgMCB9LAoteyAibWkybXN0LnNkIiwJMHg0ODAwMDA5NywgMHhiNDAwMDc2OCwgImUsZixnIiwgMCB9LAoteyAibWkybXN0LmRkIiwJMHg0ODAwMDE5NywgMHhiNDAwMDY2OCwgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5zcyIsCTB4NDgwMDAwMTgsIDB4YjQwMDA3ZTcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuc2QiLAkweDQ4MDAwMDk4LCAweGI0MDAwNzY3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLmRkIiwJMHg0ODAwMDE5OCwgMHhiNDAwMDY2NywgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5zcyIsCTB4NDgwMDAwMTksIDB4YjQwMDA3ZTYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uc2QiLAkweDQ4MDAwMDk5LCAweGI0MDAwNzY2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLmRkIiwJMHg0ODAwMDE5OSwgMHhiNDAwMDY2NiwgImUsZixnIiwgMCB9LAoteyAibXJtMXMyLnNzIiwJMHg0ODAwMDAxYSwgMHhiNDAwMDdlNSwgImUsZixnIiwgMCB9LAoteyAibXJtMXMyLnNkIiwJMHg0ODAwMDA5YSwgMHhiNDAwMDc2NSwgImUsZixnIiwgMCB9LAoteyAibXJtMXMyLmRkIiwJMHg0ODAwMDE5YSwgMHhiNDAwMDY2NSwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uc3MiLDB4NDgwMDAwMWIsIDB4YjQwMDA3ZTQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLnNkIiwweDQ4MDAwMDliLCAweGI0MDAwNzY0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5kZCIsMHg0ODAwMDE5YiwgMHhiNDAwMDY2NCwgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5zcyIsCTB4NDgwMDAwMWMsIDB4YjQwMDA3ZTMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuc2QiLAkweDQ4MDAwMDljLCAweGI0MDAwNzYzLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLmRkIiwJMHg0ODAwMDE5YywgMHhiNDAwMDY2MywgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5zcyIsCTB4NDgwMDAwMWQsIDB4YjQwMDA3ZTIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uc2QiLAkweDQ4MDAwMDlkLCAweGI0MDAwNzYyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLmRkIiwJMHg0ODAwMDE5ZCwgMHhiNDAwMDY2MiwgImUsZixnIiwgMCB9LAoteyAibWltMXMyLnNzIiwJMHg0ODAwMDAxZSwgMHhiNDAwMDdlMSwgImUsZixnIiwgMCB9LAoteyAibWltMXMyLnNkIiwJMHg0ODAwMDA5ZSwgMHhiNDAwMDc2MSwgImUsZixnIiwgMCB9LAoteyAibWltMXMyLmRkIiwJMHg0ODAwMDE5ZSwgMHhiNDAwMDY2MSwgImUsZixnIiwgMCB9LAotCi0KLXsgImZtdWwuc3MiLAkweDQ4MDAwMDIwLCAweGI0MDAwN2RmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm11bC5zZCIsCTB4NDgwMDAwYTAsIDB4YjQwMDA3NWYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbXVsLmRkIiwJMHg0ODAwMDFhMCwgMHhiNDAwMDY1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLnNzIiwJMHg0ODAwMDQyMCwgMHhiNDAwMDNkZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5zZCIsCTB4NDgwMDA0YTAsIDB4YjQwMDAzNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuZGQiLAkweDQ4MDAwNWEwLCAweGI0MDAwMjVmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsMy5kZCIsCTB4NDgwMDA1YTQsIDB4YjQwMDAyNWIsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwzLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtbG93LmRkIiwJMHg0ODAwMDFhMSwgMHhiNDAwMDY1ZSwgImUsZixnIiwgMCB9LAkvKiBmbWxvdy5kZCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnJjcC5zcyIsCTB4NDgwMDAwMjIsIDB4YjQwMDA3ZGQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLwoteyAiZnJjcC5zZCIsCTB4NDgwMDAwYTIsIDB4YjQwMDA3NWQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLwoteyAiZnJjcC5kZCIsCTB4NDgwMDAxYTIsIDB4YjQwMDA2NWQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuc3MiLAkweDQ4MDAwMDIzLCAweGI0MDAwN2RjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5zZCIsCTB4NDgwMDAwYTMsIDB4YjQwMDA3NWMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLmRkIiwJMHg0ODAwMDFhMywgMHhiNDAwMDY1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5zcyIsCTB4NDgwMDAwMzAsIDB4YjQwMDA3Y2YsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLnNkIiwJMHg0ODAwMDBiMCwgMHhiNDAwMDc0ZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuZGQiLAkweDQ4MDAwMWIwLCAweGI0MDAwNjRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuc3MiLAkweDQ4MDAwNDMwLCAweGI0MDAwM2NmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLnNkIiwJMHg0ODAwMDRiMCwgMHhiNDAwMDM0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5kZCIsCTB4NDgwMDA1YjAsIDB4YjQwMDAyNGYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5zcyIsCTB4NDgwMDAwMzEsIDB4YjQwMDA3Y2UsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLnNkIiwJMHg0ODAwMDBiMSwgMHhiNDAwMDc0ZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuZGQiLAkweDQ4MDAwMWIxLCAweGI0MDAwNjRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuc3MiLAkweDQ4MDAwNDMxLCAweGI0MDAwM2NlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLnNkIiwJMHg0ODAwMDRiMSwgMHhiNDAwMDM0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5kZCIsCTB4NDgwMDA1YjEsIDB4YjQwMDAyNGUsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZml4LnNzIiwJMHg0ODAwMDAzMiwgMHhiNDAwMDdjZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZpeC5zZCIsCTB4NDgwMDAwYjIsIDB4YjQwMDA3NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmaXguZGQiLAkweDQ4MDAwMWIyLCAweGI0MDAwNjRkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAicGZpeC5zcyIsCTB4NDgwMDA0MzIsIDB4YjQwMDAzY2QsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAicGZpeC5zZCIsCTB4NDgwMDA0YjIsIDB4YjQwMDAzNGQsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAicGZpeC5kZCIsCTB4NDgwMDA1YjIsIDB4YjQwMDAyNGQsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3Yuc3MiLAkweDQ4MDAwMDMzLCAweGI0MDAwN2NjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5kcyIsCTB4NDgwMDAxMzMsIDB4YjQwMDA2Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LnNkIiwJMHg0ODAwMDBiMywgMHhiNDAwMDc0YywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3YuZGQiLAkweDQ4MDAwMWIzLCAweGI0MDAwNjRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3Yuc3MiLAkweDQ4MDAwNDMzLCAweGI0MDAwM2NjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LmRzIiwJMHg0ODAwMDUzMywgMHhiNDAwMDJjYywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5zZCIsCTB4NDgwMDA0YjMsIDB4YjQwMDAzNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3YuZGQiLAkweDQ4MDAwNWIzLCAweGI0MDAwMjRjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwotLyogcGZndCBoYXMgUiBiaXQgY2xlYXJlZDsgcGZsZSBoYXMgUiBiaXQgc2V0ICovCi17ICJwZmd0LnNzIiwJMHg0ODAwMDQzNCwgMHhiNDAwMDNjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmZ3Quc2QiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZndC5kZCIsCTB4NDgwMDA1MzQsIDB4YjQwMDAyY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi0vKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KLXsgInBmbGUuc3MiLAkweDQ4MDAwNGI0LCAweGI0MDAwMzRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZsZS5zZCIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmxlLmRkIiwJMHg0ODAwMDViNCwgMHhiNDAwMDI0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZ0cnVuYy5zcyIsCTB4NDgwMDAwM2EsIDB4YjQwMDA3YzUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmdHJ1bmMuc2QiLAkweDQ4MDAwMGJhLCAweGI0MDAwNzQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnRydW5jLmRkIiwJMHg0ODAwMDFiYSwgMHhiNDAwMDY0NSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmdHJ1bmMuc3MiLAkweDQ4MDAwNDNhLCAweGI0MDAwM2M1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmdHJ1bmMuc2QiLAkweDQ4MDAwNGJhLCAweGI0MDAwMzQ1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmdHJ1bmMuZGQiLAkweDQ4MDAwNWJhLCAweGI0MDAwMjQ1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ4ZnIiLAkweDQ4MDAwMDQwLCAweGI0MDAwN2JmLCAiZSxkIiwgMCB9LAkvKiBmeGZyIGZzcmMxLGlkZXN0ICovCi17ICJmaWFkZC5zcyIsCTB4NDgwMDAwNDksIDB4YjQwMDA3YjYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlhZGQuZGQiLAkweDQ4MDAwMWM5LCAweGI0MDAwNjM2LCAiZSxmLGciLCAwIH0sCS8qIGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaWFkZC5zcyIsCTB4NDgwMDA0NDksIDB4YjQwMDAzYjYsICJlLGYsZyIsIDAgfSwJLyogcGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaWFkZC5kZCIsCTB4NDgwMDA1YzksIDB4YjQwMDAyMzYsICJlLGYsZyIsIDAgfSwJLyogcGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpc3ViLnNzIiwJMHg0ODAwMDA0ZCwgMHhiNDAwMDdiMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXN1Yi5kZCIsCTB4NDgwMDAxY2QsIDB4YjQwMDA2MzIsICJlLGYsZyIsIDAgfSwJLyogZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpc3ViLnNzIiwJMHg0ODAwMDQ0ZCwgMHhiNDAwMDNiMiwgImUsZixnIiwgMCB9LAkvKiBwZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpc3ViLmRkIiwJMHg0ODAwMDVjZCwgMHhiNDAwMDIzMiwgImUsZixnIiwgMCB9LAkvKiBwZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnpjaGtsIiwJMHg0ODAwMDA1NywgMHhiNDAwMDdhOCwgImUsZixnIiwgMCB9LAkvKiBmemNoa2wgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmemNoa2wiLAkweDQ4MDAwNDU3LCAweGI0MDAwM2E4LCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa2wgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZ6Y2hrcyIsCTB4NDgwMDAwNWYsIDB4YjQwMDA3YTAsICJlLGYsZyIsIDAgfSwJLyogZnpjaGtzIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnpjaGtzIiwJMHg0ODAwMDQ1ZiwgMHhiNDAwMDNhMCwgImUsZixnIiwgMCB9LAkvKiBwZnpjaGtzIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmYWRkcCIsCTB4NDgwMDAwNTAsIDB4YjQwMDA3YWYsICJlLGYsZyIsIDAgfSwJLyogZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkcCIsCTB4NDgwMDA0NTAsIDB4YjQwMDAzYWYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGRwIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmYWRkeiIsCTB4NDgwMDAwNTEsIDB4YjQwMDA3YWUsICJlLGYsZyIsIDAgfSwJLyogZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkeiIsCTB4NDgwMDA0NTEsIDB4YjQwMDAzYWUsICJlLGYsZyIsIDAgfSwJLyogcGZhZGR6IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmb3JtIiwJMHg0ODAwMDA1YSwgMHhiNDAwMDdhNSwgImUsZyIsIDAgfSwJLyogZm9ybSBmc3JjMSxmZGVzdCAqLwoteyAicGZvcm0iLAkweDQ4MDAwNDVhLCAweGI0MDAwM2E1LCAiZSxnIiwgMCB9LAkvKiBwZm9ybSBmc3JjMSxmZGVzdCAqLwotCi0vKiBGbG9hdGluZyBwb2ludCBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCi17ICJmbW92LnNzIiwJMHg0ODAwMDA0OSwgMHhiN2UwMDdiNiwgImUsZyIsIDAgfSwJLyogZmlhZGQuc3MgZnNyYzEsZjAsZmRlc3QgKi8KLXsgImZtb3YuZGQiLAkweDQ4MDAwMWM5LCAweGI3ZTAwNjM2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5kZCBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5zZCIsCTB4NDgwMDAwYjAsIDB4YjdlMDA3NGYsICJlLGciLCAwIH0sCS8qIGZhZGQuc2QgZnNyYzEsZjAsZmRlc3QgKi8KLXsgImZtb3YuZHMiLAkweDQ4MDAwMTMwLCAweGI3ZTAwNmNmLCAiZSxnIiwgMCB9LAkvKiBmYWRkLmRzIGZzcmMxLGYwLGZkZXN0ICovCi17ICJwZm1vdi5kcyIsCTB4NDgwMDA1MzAsIDB4YjczMDAyY2YsICJlLGciLCAwIH0sCS8qIHBmYWRkLmRzIGZzcmMxLGYwLGZkZXN0ICovCi17ICJwZm1vdi5kZCIsCTB4NDgwMDA1YzksIDB4YjdlMDAyMzYsICJlLGciLCAwIH0sCS8qIHBmaWFkZC5kZCBmc3JjMSxmMCxmZGVzdCAqLwotCi0KLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBpODYwX29wY29kZXMpLyhzaXplb2YgaTg2MF9vcGNvZGVzWzBdKSkKLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pOTYwLmggYi9pbmNsdWRlL29wY29kZS9pOTYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmZjMzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qIEJhc2ljIDgwOTYwIGluc3RydWN0aW9uIGZvcm1hdHMuCi0gKgotICogVGhlICdDT0onIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgQ09CUiBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgJ2InIGluCi0gKiB0aGUgbW5lbW9uaWMgcmVwbGFjZWQgYnkgYSAnaic7ICB0aGV5IGFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaWYgbmVjZXNzYXJ5OgotICogaWYgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIHJlcGxhY2UgdGhlbQotICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotICoKLSAqIEFsbCBvZiB0aGUgJ01FTW4nIGluc3RydWN0aW9ucyBhcmUgdGhlIHNhbWUgZm9ybWF0OyB0aGUgJ24nIGluIHRoZSBuYW1lCi0gKiBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW5kZXggc2NhbGUgZmFjdG9yICh0aGUgc2l6ZSBvZiB0aGUgZGF0dW0gb3BlcmF0ZWQgb24pLgotICoKLSAqIFRoZSBGQlJBIGZvcm1hdHMgYXJlIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBUaGV5IGFyZSB0aGUKLSAqICJjb252ZW5pZW5jZSBkaXJlY3RpdmVzIiBmb3IgYnJhbmNoaW5nIG9uIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb25zLAotICogZWFjaCBvZiB3aGljaCBnZW5lcmF0ZXMgMiBpbnN0cnVjdGlvbnMgKGEgJ2JubycgYW5kIG9uZSBvdGhlciBicmFuY2gpLgotICoKLSAqIFRoZSBDQUxMSiBmb3JtYXQgaXMgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIEl0IGluZGljYXRlcyB0aGF0Ci0gKiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIChhIENUUkwtZm9ybWF0ICdjYWxsJykgc2hvdWxkIGhhdmUgaXRzIHJlbG9jYXRpb24KLSAqIHNwZWNpYWxseSBmbGFnZ2VkIGZvciBsaW5rLXRpbWUgcmVwbGFjZW1lbnQgd2l0aCBhICdiYWwnIG9yICdjYWxscycgaWYKLSAqIGFwcHJvcHJpYXRlLgotICovIAotCi0jZGVmaW5lIENUUkwJMAotI2RlZmluZSBDT0JSCTEKLSNkZWZpbmUgQ09KCTIKLSNkZWZpbmUgUkVHCTMKLSNkZWZpbmUgTUVNMQk0Ci0jZGVmaW5lIE1FTTIJNQotI2RlZmluZSBNRU00CTYKLSNkZWZpbmUgTUVNOAk3Ci0jZGVmaW5lIE1FTTEyCTgKLSNkZWZpbmUgTUVNMTYJOQotI2RlZmluZSBGQlJBCTEwCi0jZGVmaW5lIENBTExKCTExCi0KLS8qIE1hc2tzIGZvciB0aGUgbW9kZSBiaXRzIGluIFJFRyBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE0xCQkweDA4MDAKLSNkZWZpbmUgTTIJCTB4MTAwMAotI2RlZmluZSBNMwkJMHgyMDAwCi0KLS8qIEdlbmVyYXRlIHRoZSAxMi1iaXQgb3Bjb2RlIGZvciBhIFJFRyBmb3JtYXQgaW5zdHJ1Y3Rpb24gYnkgcGxhY2luZyB0aGUgCi0gKiBoaWdoIDggYml0cyBpbiBpbnN0cnVjdGlvbiBiaXRzIDI0LTMxLCB0aGUgbG93IDQgYml0cyBpbiBpbnN0cnVjdGlvbiBiaXRzCi0gKiA3LTEwLgotICovCi0KLSNkZWZpbmUgUkVHX09QQyhvcGMpCSgob3BjICYgMHhmZjApIDw8IDIwKSB8ICgob3BjICYgMHhmKSA8PCA3KQotCi0vKiBHZW5lcmF0ZSBhIHRlbXBsYXRlIGZvciBhIFJFRyBmb3JtYXQgaW5zdHJ1Y3Rpb246ICBwbGFjZSB0aGUgb3Bjb2RlIGJpdHMKLSAqIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgYW5kIE9SIGluIG1vZGUgYml0cyBmb3IgdGhlIG9wZXJhbmRzIHRoYXQgd2lsbCBub3QKLSAqIGJlIHVzZWQuICBJLmUuLAotICoJCXNldCBtMT0xLCBpZiBzcmMxIHdpbGwgbm90IGJlIHVzZWQKLSAqCQlzZXQgbTI9MSwgaWYgc3JjMiB3aWxsIG5vdCBiZSB1c2VkCi0gKgkJc2V0IG0zPTEsIGlmIGRzdCAgd2lsbCBub3QgYmUgdXNlZAotICoKLSAqIFNldHRpbmcgdGhlICJ1bnVzZWQiIG1vZGUgYml0cyB0byAxIHNwZWVkcyB1cCBpbnN0cnVjdGlvbiBleGVjdXRpb24oISkuCi0gKiBUaGUgaW5mb3JtYXRpb24gaXMgYWxzbyB1c2VmdWwgdG8gdXMgYmVjYXVzZSBzb21lIDEtb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCi0gKiB1c2UgdGhlIHNyYzEgZmllbGQsIG90aGVycyB0aGUgZHN0IGZpZWxkOyBhbmQgc29tZSAyLW9wZXJhbmQgUkVHIGluc3RydWN0aW9ucwotICogdXNlIHNyYzEvc3JjMiwgb3RoZXJzIHNyYzEvZHN0LiAgVGhlIHNldCBtb2RlIGJpdHMgZW5hYmxlIHVzIHRvIGRpc3Rpbmd1aXNoLgotICovCi0jZGVmaW5lIFJfMChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiB8IE0zICkJLyogTm8gb3BlcmFuZHMgICAgICAqLwotI2RlZmluZSBSXzEob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yIHwgTTMgKQkvKiAxIG9wZXJhbmQ6IHNyYzEgICovCi0jZGVmaW5lIFJfMUQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0xIHwgTTIgKQkvKiAxIG9wZXJhbmQ6IGRzdCAgICovCi0jZGVmaW5lIFJfMihvcGMpCSggUkVHX09QQyhvcGMpIHwgTTMgKQkJLyogMiBvcHM6IHNyYzEvc3JjMiAqLwotI2RlZmluZSBSXzJEKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMiApCQkvKiAyIG9wczogc3JjMS9kc3QgICovCi0jZGVmaW5lIFJfMyhvcGMpCSggUkVHX09QQyhvcGMpICkJCS8qIDMgb3BlcmFuZHMgICAgICAgKi8KLQotLyogREVTQ1JJUFRPUiBCWVRFUyBGT1IgUkVHSVNURVIgT1BFUkFORFMKLSAqCi0gKiBJbnRlcnByZXQgbmFtZXMgYXMgZm9sbG93czoKLSAqCVI6ICAgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyIG9ubHkKLSAqCVJTOiAgZ2xvYmFsLCBsb2NhbCwgb3IgKGlmIHRhcmdldCBhbGxvd3MpIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXIgb25seQotICoJUkw6ICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIsIG9yIGludGVnZXIgbGl0ZXJhbAotICoJUlNMOiBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlcjsKLSAqCQlvciBpbnRlZ2VyIGxpdGVyYWwKLSAqCUY6ICAgZ2xvYmFsLCBsb2NhbCwgb3IgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIKLSAqCUZMOiAgZ2xvYmFsLCBsb2NhbCwgb3IgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXI7IG9yIGxpdGVyYWwgKGluY2x1ZGluZwotICoJCWZsb2F0aW5nIHBvaW50KQotICoKLSAqIEEgbnVtYmVyIGFwcGVuZGVkIHRvIGEgbmFtZSBpbmRpY2F0ZXMgdGhhdCByZWdpc3RlcnMgbXVzdCBiZSBhbGlnbmVkLAotICogYXMgZm9sbG93czoKLSAqCTI6IHJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIG11bHRpcGxlIG9mIDIKLSAqCTQ6IHJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIG11bHRpcGxlIG9mIDQKLSAqLwotCi0jZGVmaW5lIFNGUgkweDEwCQkvKiBNYXNrIGZvciB0aGUgInNmci1PSyIgYml0ICovCi0jZGVmaW5lIExJVAkweDA4CQkvKiBNYXNrIGZvciB0aGUgImxpdGVyYWwtT0siIGJpdCAqLwotI2RlZmluZSBGUAkweDA0CQkvKiBNYXNrIGZvciAiZmxvYXRpbmctcG9pbnQtT0siIGJpdCAqLwotCi0vKiBUaGlzIG1hY3JvIG9ycyB0aGUgYml0cyB0b2dldGhlci4gIE5vdGUgdGhhdCAnYWxpZ24nIGlzIGEgbWFzawotICogZm9yIHRoZSBsb3cgMCwgMSwgb3IgMiBiaXRzIG9mIHRoZSByZWdpc3RlciBudW1iZXIsIGFzIGFwcHJvcHJpYXRlLgotICovCi0jZGVmaW5lIE9QKGFsaWduLGxpdCxmcCxzZnIpCSggYWxpZ24gfCBsaXQgfCBmcCB8IHNmciApCi0KLSNkZWZpbmUgUglPUCggMCwgMCwgICAwLCAgMCAgICkKLSNkZWZpbmUgUlMJT1AoIDAsIDAsICAgMCwgIFNGUiApCi0jZGVmaW5lIFJMCU9QKCAwLCBMSVQsIDAsICAwICAgKQotI2RlZmluZSBSU0wJT1AoIDAsIExJVCwgMCwgIFNGUiApCi0jZGVmaW5lIEYJT1AoIDAsIDAsICAgRlAsIDAgICApCi0jZGVmaW5lIEZMCU9QKCAwLCBMSVQsIEZQLCAwICAgKQotI2RlZmluZSBSMglPUCggMSwgMCwgICAwLCAgMCAgICkKLSNkZWZpbmUgUkwyCU9QKCAxLCBMSVQsIDAsICAwICAgKQotI2RlZmluZSBGMglPUCggMSwgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkwyCU9QKCAxLCBMSVQsIEZQLCAwICAgKQotI2RlZmluZSBSNAlPUCggMywgMCwgICAwLCAgMCAgICkKLSNkZWZpbmUgUkw0CU9QKCAzLCBMSVQsIDAsICAwICAgKQotI2RlZmluZSBGNAlPUCggMywgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkw0CU9QKCAzLCBMSVQsIEZQLCAwICAgKQotCi0jZGVmaW5lIE0JMHg3ZgkvKiBNZW1vcnkgb3BlcmFuZCAoTUVNQSAmIE1FTUIgZm9ybWF0IGluc3RydWN0aW9ucykgKi8KLQotLyogTWFjcm9zIHRvIGV4dHJhY3QgaW5mbyBmcm9tIHRoZSByZWdpc3RlciBvcGVyYW5kIGRlc2NyaXB0b3IgYnl0ZSAnb2QnLgotICovCi0jZGVmaW5lIFNGUl9PSyhvZCkJKG9kICYgU0ZSKQkvKiBUUlVFIGlmIHNmciBvcGVyYW5kIGFsbG93ZWQgKi8KLSNkZWZpbmUgTElUX09LKG9kKQkob2QgJiBMSVQpCS8qIFRSVUUgaWYgbGl0ZXJhbCBvcGVyYW5kIGFsbG93ZWQgKi8KLSNkZWZpbmUgRlBfT0sob2QpCShvZCAmIEZQKQkvKiBUUlVFIGlmIGZsb2F0aW5nLXBvaW50IG9wIGFsbG93ZWQgKi8KLSNkZWZpbmUgUkVHX0FMSUdOKG9kLG4pCSgob2QgJiAweDMgJiBuKSA9PSAwKQotCQkJCQkvKiBUUlVFIGlmIHJlZyAjbiBpcyBwcm9wZXJseSBhbGlnbmVkICovCi0jZGVmaW5lIE1FTU9QKG9kKQkob2QgPT0gTSkJLyogVFJVRSBpZiBvcGVyYW5kIGlzIGEgbWVtb3J5IG9wZXJhbmQqLwotCi0vKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBpODA5NjAgaW5zdHJ1Y3Rpb24gKi8KLXN0cnVjdCBpOTYwX29wY29kZSB7Ci0JbG9uZyBvcGNvZGU7CS8qIDMyIGJpdHMsIGNvbnN0YW50IGZpZWxkcyBmaWxsZWQgaW4sIHJlc3QgemVyb2VkICovCi0JY2hhciAqbmFtZTsJLyogQXNzZW1ibGVyIG1uZW1vbmljCQkJCSAgICovCi0Jc2hvcnQgaWNsYXNzOwkvKiBDbGFzczogc2VlICNkZWZpbmVzIGJlbG93CQkJICAgKi8KLQljaGFyIGZvcm1hdDsJLyogUkVHLCBDT0JSLCBDVFJMLCBNRU1uLCBDT0osIEZCUkEsIG9yIENBTExKCSAgICovCi0JY2hhciBudW1fb3BzOwkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMJCQkJICAgKi8KLQljaGFyIG9wZXJhbmRbM107LyogT3BlcmFuZCBkZXNjcmlwdG9yczsgc2FtZSBvcmRlciBhcyBhc3NlbWJsZXIgaW5zdHIgKi8KLX07Ci0KLS8qIENsYXNzZXMgb2YgOTYwIGludHJ1Y3Rpb25zOgotICoJLSBlYWNoIGluc3RydWN0aW9uIGZhbGxzIGludG8gb25lIGNsYXNzLgotICoJLSBlYWNoIHRhcmdldCBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgb25lIG9yIG1vcmUgY2xhc3Nlcy4KLSAqCi0gKiBFQUNIIENPTlNUQU5UIE1VU1QgQ09OVEFJTiAxIEFORCBPTkxZIDEgU0VUIEJJVCE6ICBzZWUgdGFyZ19oYXNfaWNsYXNzKCkuCi0gKi8KLSNkZWZpbmUgSV9CQVNFCTB4MDEJLyogODA5NjAgYmFzZSBpbnN0cnVjdGlvbiBzZXQJKi8KLSNkZWZpbmUgSV9DWAkweDAyCS8qIDgwOTYwQ3ggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfREVDCTB4MDQJLyogRGVjaW1hbCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9GUAkweDA4CS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uCSovCi0jZGVmaW5lIElfS1gJMHgxMAkvKiA4MDk2MEt4IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX01JTAkweDIwCS8qIE1pbGl0YXJ5IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0NBU0lNCTB4NDAJLyogQ0Egc2ltdWxhdG9yIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIElfQ1gyCTB4ODAJLyogQ3gvSngvSHggaW5zdHJ1Y3Rpb25zCSovCi0jZGVmaW5lIElfSlgJMHgxMDAJLyogSngvSHggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfSFgJMHgyMDAJLyogSHggaW5zdHJ1Y3Rpb25zCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJCVRBQkxFIE9GIGk5NjAgSU5TVFJVQ1RJT04gREVTQ1JJUFRJT05TCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3Qgc3RydWN0IGk5NjBfb3Bjb2RlIGk5NjBfb3Bjb2Rlc1tdID0gewotCi0JLyogaWYgYSBDVFJMIGluc3RydWN0aW9uIGhhcyBhbiBvcGVyYW5kLCBpdCdzIGFsd2F5cyBhIGRpc3BsYWNlbWVudCAqLwotCi0JLyogY2FsbGogZGVmYXVsdD09J2NhbGwnICovCi0JeyAweDA5MDAwMDAwLAkiY2FsbGoiLAlJX0JBU0UsCUNBTExKLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MDgwMDAwMDAsCSJiIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDA5MDAwMDAwLAkiY2FsbCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwYTAwMDAwMCwJInJldCIsCQlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwYjAwMDAwMCwJImJhbCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMDAwMDAwMCwJImJubyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJmIHNhbWUgYXMgYm5vICovCi0JeyAweDEwMDAwMDAwLAkiYmYiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicnUgc2FtZSBhcyBibm8gKi8KLQl7IDB4MTAwMDAwMDAsCSJicnUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTEwMDAwMDAsCSJiZyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZyBzYW1lIGFzIGJnICovCi0JeyAweDExMDAwMDAwLAkiYnJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEyMDAwMDAwLAkiYmUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmUgc2FtZSBhcyBiZSAqLwotCXsgMHgxMjAwMDAwMCwJImJyZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMzAwMDAwMCwJImJnZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZ2Ugc2FtZSBhcyBiZ2UgKi8KLQl7IDB4MTMwMDAwMDAsCSJicmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE0MDAwMDAwLAkiYmwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmwgc2FtZSBhcyBibCAqLwotCXsgMHgxNDAwMDAwMCwJImJybCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNTAwMDAwMCwJImJuZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybGcgc2FtZSBhcyBibmUgKi8KLQl7IDB4MTUwMDAwMDAsCSJicmxnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE2MDAwMDAwLAkiYmxlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsZSBzYW1lIGFzIGJsZSAqLwotCXsgMHgxNjAwMDAwMCwJImJybGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTcwMDAwMDAsCSJibyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJ0IHNhbWUgYXMgYm8gKi8KLQl7IDB4MTcwMDAwMDAsCSJidCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybyBzYW1lIGFzIGJvICovCi0JeyAweDE3MDAwMDAwLAkiYnJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE4MDAwMDAwLAkiZmF1bHRubyIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JLyogZmF1bHRmIHNhbWUgYXMgZmF1bHRubyAqLwotCXsgMHgxODAwMDAwMCwJImZhdWx0ZiIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE5MDAwMDAwLAkiZmF1bHRnIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWEwMDAwMDAsCSJmYXVsdGUiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYjAwMDAwMCwJImZhdWx0Z2UiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYzAwMDAwMCwJImZhdWx0bCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFkMDAwMDAwLAkiZmF1bHRuZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFlMDAwMDAwLAkiZmF1bHRsZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFmMDAwMDAwLAkiZmF1bHRvIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQkvKiBmYXVsdHQgc3luIGZvciBmYXVsdG8gKi8KLQl7IDB4MWYwMDAwMDAsCSJmYXVsdHQiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCi0JeyAweDAxMDAwMDAwLAkic3lzY2FsbCIsCUlfQ0FTSU0sQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0KLQkvKiBJZiBhIENPQlIgKG9yIENPSikgaGFzIDMgb3BlcmFuZHMsIHRoZSBsYXN0IG9uZSBpcyBhbHdheXMgYQotCSAqIGRpc3BsYWNlbWVudCBhbmQgZG9lcyBub3QgYXBwZWFyIGV4cGxpY2l0bHkgaW4gdGhlIHRhYmxlLgotCSAqLwotCi0JeyAweDIwMDAwMDAwLAkidGVzdG5vIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyMTAwMDAwMCwJInRlc3RnIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyMjAwMDAwMCwJInRlc3RlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyMzAwMDAwMCwJInRlc3RnZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjQwMDAwMDAsCSJ0ZXN0bCIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjUwMDAwMDAsCSJ0ZXN0bmUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI2MDAwMDAwLAkidGVzdGxlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNzAwMDAwMCwJInRlc3RvIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgzMDAwMDAwMCwJImJiYyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzEwMDAwMDAsCSJjbXBvYmciLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzIwMDAwMDAsCSJjbXBvYmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzMwMDAwMDAsCSJjbXBvYmdlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM0MDAwMDAwLAkiY21wb2JsIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM1MDAwMDAwLAkiY21wb2JuZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNjAwMDAwMCwJImNtcG9ibGUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzcwMDAwMDAsCSJiYnMiLAkJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM4MDAwMDAwLAkiY21waWJubyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzOTAwMDAwMCwJImNtcGliZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYTAwMDAwMCwJImNtcGliZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYjAwMDAwMCwJImNtcGliZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2MwMDAwMDAsCSJjbXBpYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2QwMDAwMDAsCSJjbXBpYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNlMDAwMDAwLAkiY21waWJsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZjAwMDAwMCwJImNtcGlibyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMTAwMDAwMCwJImNtcG9qZyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMyMDAwMDAwLAkiY21wb2plIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzMwMDAwMDAsCSJjbXBvamdlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzQwMDAwMDAsCSJjbXBvamwiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNTAwMDAwMCwJImNtcG9qbmUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNjAwMDAwMCwJImNtcG9qbGUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzODAwMDAwMCwJImNtcGlqbm8iLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzOTAwMDAwMCwJImNtcGlqZyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNhMDAwMDAwLAkiY21waWplIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2IwMDAwMDAsCSJjbXBpamdlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2MwMDAwMDAsCSJjbXBpamwiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZDAwMDAwMCwJImNtcGlqbmUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZTAwMDAwMCwJImNtcGlqbGUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZjAwMDAwMCwJImNtcGlqbyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0KLQl7IDB4ODAwMDAwMDAsCSJsZG9iIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4MjAwMDAwMCwJInN0b2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweDg0MDAwMDAwLAkiYngiLAkJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCi0JeyAweDg1MDAwMDAwLAkiYmFseCIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4ODYwMDAwMDAsCSJjYWxseCIsCUlfQkFTRSwJTUVNMSwJMSwgeyBNLCAgMCwgIDAgfSB9LAotCXsgMHg4ODAwMDAwMCwJImxkb3MiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDhhMDAwMDAwLAkic3RvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4OGMwMDAwMDAsCSJsZGEiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDkwMDAwMDAwLAkibGQiLAkJSV9CQVNFLAlNRU00LAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDkyMDAwMDAwLAkic3QiLAkJSV9CQVNFLAlNRU00LAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweDk4MDAwMDAwLAkibGRsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBNLCAgUjIsIDAgfSB9LAotCXsgMHg5YTAwMDAwMCwJInN0bCIsCQlJX0JBU0UsCU1FTTgsCTIsIHsgUjIsIE0sICAwIH0gfSwKLQl7IDB4YTAwMDAwMDAsCSJsZHQiLAkJSV9CQVNFLAlNRU0xMiwJMiwgeyBNLCAgUjQsIDAgfSB9LAotCXsgMHhhMjAwMDAwMCwJInN0dCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IFI0LCBNLCAgMCB9IH0sCi0JeyAweGIwMDAwMDAwLAkibGRxIiwJCUlfQkFTRSwJTUVNMTYsCTIsIHsgTSwgIFI0LCAwIH0gfSwKLQl7IDB4YjIwMDAwMDAsCSJzdHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBSNCwgTSwgIDAgfSB9LAotCXsgMHhjMDAwMDAwMCwJImxkaWIiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweGMyMDAwMDAwLAkic3RpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4YzgwMDAwMDAsCSJsZGlzIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHhjYTAwMDAwMCwJInN0aXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0KLQl7IFJfMygweDU4MCksCSJub3RiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MSksCSJhbmQiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODIpLAkiYW5kbm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODMpLAkic2V0Yml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODQpLAkibm90YW5kIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODYpLAkieG9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg3KSwJIm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg4KSwJIm5vciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4OSksCSJ4bm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDU4YSksCSJub3QiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMygweDU4YiksCSJvcm5vdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThjKSwJImNscmJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThkKSwJIm5vdG9yIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGUpLAkibmFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZiksCSJhbHRlcmJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkwKSwJImFkZG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTEpLAkiYWRkaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MiksCSJzdWJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkzKSwJInN1YmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTgpLAkic2hybyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YSksCSJzaHJkaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTliKSwJInNocmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWMpLAkic2hsbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5ZCksCSJyb3RhdGUiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5ZSksCSJzaGxpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yKDB4NWEwKSwJImNtcG8iLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YTEpLAkiY21waSIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMiksCSJjb25jbXBvIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YTMpLAkiY29uY21waSIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8zKDB4NWE0KSwJImNtcGluY28iLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNSksCSJjbXBpbmNpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTYpLAkiY21wZGVjbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE3KSwJImNtcGRlY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMigweDVhYyksCSJzY2FuYnl0ZSIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWFlKSwJImNoa2JpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8zKDB4NWIwKSwJImFkZGMiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YjIpLAkic3ViYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg1Y2MpLAkibW92IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzJEKDB4NWRjKSwJIm1vdmwiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkwyLFIyLCAwIH0gfSwKLQl7IFJfMkQoMHg1ZWMpLAkibW92dCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDQsUjQsIDAgfSB9LAotCXsgUl8yRCgweDVmYyksCSJtb3ZxIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCi0JeyBSXzMoMHg2MTApLAkiYXRtb2QiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFIgfSB9LAotCXsgUl8zKDB4NjEyKSwJImF0YWRkIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlMsIFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjQwKSwJInNwYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8yRCgweDY0MSksCSJzY2FuYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMygweDY0NSksCSJtb2RhYyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjUwKSwJIm1vZGlmeSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUiB9IH0sCi0JeyBSXzMoMHg2NTEpLAkiZXh0cmFjdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUiB9IH0sCi0JeyBSXzMoMHg2NTQpLAkibW9kdGMiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDY1NSksCSJtb2RwYyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUiB9IH0sCi0JeyBSXzEoMHg2NjApLAkiY2FsbHMiLAlJX0JBU0UsCVJFRywJMSwgeyBSU0wsIDAsIDAgfSB9LAotCXsgUl8wKDB4NjZiKSwJIm1hcmsiLAkJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmMpLAkiZm1hcmsiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2ZCksCSJmbHVzaHJlZyIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZmKSwJInN5bmNmIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2NzApLAkiZW11bCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIyIH0gfSwKLQl7IFJfMygweDY3MSksCSJlZGl2IiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSTDIsUlMgfSB9LAotCXsgUl8yRCgweDY3MiksCSJjdnRhZHIiLAlJX0NBU0lNLFJFRywgCTIsIHsgUkwsIFIyLCAwIH0gfSwKLQl7IFJfMygweDcwMSksCSJtdWxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzA4KSwJInJlbW8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3MGIpLAkiZGl2byIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0MSksCSJtdWxpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQ4KSwJInJlbWkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDkpLAkibW9kaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0YiksCSJkaXZpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JLyogRmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLQl7IFJfMkQoMHg2NzQpLAkiY3Z0aXIiLAlJX0ZQLAlSRUcsCTIsIHsgUkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY3NSksCSJjdnRpbHIiLAlJX0ZQLAlSRUcsCTIsIHsgUkwsIEYsIDAgfSB9LAotCXsgUl8zKDB4Njc2KSwJInNjYWxlcmwiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2NzcpLAkic2NhbGVyIiwJSV9GUCwJUkVHLAkzLCB7IFJMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODApLAkiYXRhbnIiLAlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MSksCSJsb2dlcHIiLAlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MiksCSJsb2dyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgzKSwJInJlbXIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzIoMHg2ODQpLAkiY21wb3IiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEZMLCAwIH0gfSwKLQl7IFJfMigweDY4NSksCSJjbXByIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAotCXsgUl8yRCgweDY4OCksCSJzcXJ0ciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4Njg5KSwJImV4cHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGEpLAkibG9nYm5yIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGIpLAkicm91bmRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGMpLAkic2luciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4ZCksCSJjb3NyIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhlKSwJInRhbnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMSgweDY4ZiksCSJjbGFzc3IiLAlJX0ZQLAlSRUcsCTEsIHsgRkwsIDAsIDAgfQl9LAotCXsgUl8zKDB4NjkwKSwJImF0YW5ybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDY5MSksCSJsb2dlcHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkyKSwJImxvZ3JsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkzKSwJInJlbXJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8yKDB4Njk0KSwJImNtcG9ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRkwyLCAwIH0gfSwKLQl7IFJfMigweDY5NSksCSJjbXBybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRkwyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OTgpLAkic3FydHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4Njk5KSwJImV4cHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjlhKSwJImxvZ2JucmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWIpLAkicm91bmRybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YyksCSJzaW5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5ZCksCSJjb3NybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5ZSksCSJ0YW5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8xKDB4NjlmKSwJImNsYXNzcmwiLAlJX0ZQLAlSRUcsCTEsIHsgRkwyLCAwLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzApLAkiY3Z0cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAotCXsgUl8yRCgweDZjMSksCSJjdnRyaWwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIyLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzIpLAkiY3Z0enJpIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzMpLAkiY3Z0enJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAotCXsgUl8yRCgweDZjOSksCSJtb3ZyIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NmQ5KSwJIm1vdnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmUxKSwJIm1vdnJlIiwJSV9GUCwJUkVHLAkyLCB7IEZMNCxGNCwgMCB9IH0sCi0JeyBSXzMoMHg2ZTIpLAkiY3B5c3JlIiwJSV9GUCwJUkVHLAkzLCB7IEZMNCxGTDQsRjQgfSB9LAotCXsgUl8zKDB4NmUzKSwJImNweXJzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCi0JeyBSXzMoMHg3OGIpLAkiZGl2ciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4YyksCSJtdWxyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhkKSwJInN1YnIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGYpLAkiYWRkciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc5YiksCSJkaXZybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDc5YyksCSJtdWxybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDc5ZCksCSJzdWJybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDc5ZiksCSJhZGRybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQotCS8qIFRoZXNlIGFyZSB0aGUgZmxvYXRpbmcgcG9pbnQgYnJhbmNoIGluc3RydWN0aW9ucy4gIEVhY2ggYWN0dWFsbHkKLQkgKiBnZW5lcmF0ZXMgMiBicmFuY2ggaW5zdHJ1Y3Rpb25zOiAgdGhlIGZpcnN0IGEgQ1RSTCBpbnN0cnVjdGlvbiB3aXRoCi0JICogdGhlIGluZGljYXRlZCBvcGNvZGUsIGFuZCB0aGUgc2Vjb25kIGEgJ2JubycuCi0JICovCi0KLQl7IDB4MTIwMDAwMDAsCSJicnVlIiwJCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxMTAwMDAwMCwJImJydWciLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDEzMDAwMDAwLAkiYnJ1Z2UiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTQwMDAwMDAsCSJicnVsIiwJCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNjAwMDAwMCwJImJydWxlIiwJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE1MDAwMDAwLAkiYnJ1bGciLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQotCi0JLyogRGVjaW1hbCBpbnN0cnVjdGlvbnMgKi8KLQotCXsgUl8zKDB4NjQyKSwJImRhZGRjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDY0MyksCSJkc3ViYyIsCUlfREVDLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjQ0KSwJImRtb3Z0IiwJSV9ERUMsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCi0KLQkvKiBLWCBleHRlbnNpb25zICovCi0KLQl7IFJfMigweDYwMCksCSJzeW5tb3YiLAlJX0tYLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8yKDB4NjAxKSwJInN5bm1vdmwiLAlJX0tYLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8yKDB4NjAyKSwJInN5bm1vdnEiLAlJX0tYLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8yRCgweDYxNSksCSJzeW5sZCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0KLQotCS8qIE1DIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8zKDB4NjAzKSwJImNtcHN0ciIsCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFIsICBSTCB9IH0sCi0JeyBSXzMoMHg2MDQpLAkibW92cXN0ciIsCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFIsICBSTCB9IH0sCi0JeyBSXzMoMHg2MDUpLAkibW92c3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMkQoMHg2MTMpLAkiaW5zcGFjYyIsCUlfTUlMLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8yRCgweDYxNCksCSJsZHBoeSIsCUlfTUlMLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8zKDB4NjE3KSwJImZpbGwiLAkJSV9NSUwsCVJFRywJMywgeyBSLCAgUkwsIFJMIH0gfSwKLQl7IFJfMkQoMHg2NDYpLAkiY29uZHJlYyIsCUlfTUlMLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8yRCgweDY1NiksCSJyZWNlaXZlIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzMoMHg2NjIpLAkic2VuZCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUiB9IH0sCi0JeyBSXzEoMHg2NjMpLAkic2VuZHNlcnYiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY0KSwJInJlc3VtcHJjcyIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjUpLAkic2NoZWRwcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2NiksCSJzYXZlcHJjcyIsCUlfTUlMLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjgpLAkiY29uZHdhaXQiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY5KSwJIndhaXQiLAkJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2YSksCSJzaWduYWwiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xRCgweDY3MyksCSJsZHRpbWUiLAlJX01JTCwJUkVHLAkxLCB7IFIyLCAwLCAwIH0JfSwKLQotCi0JLyogQ1ggZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzMoMHg1ZDgpLAkiZXNocm8iLAlJX0NYMiwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjMwKSwJInNkbWEiLAkJSV9DWCwJUkVHLAkzLCB7IFJTTCxSU0wsUkwgfSB9LAotCXsgUl8zKDB4NjMxKSwJInVkbWEiLAkJSV9DWCwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8zKDB4NjU5KSwJInN5c2N0bCIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0KLQotCS8qIEp4IGV4dGVuc2lvbnMuICAqLwotCXsgUl8zKDB4NzgwKSwJImFkZG9ubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MCksCSJhZGRvZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMCksCSJhZGRvZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMCksCSJhZGRvZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzApLAkiYWRkb2wiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDApLAkiYWRkb25lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UwKSwJImFkZG9sZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMCksCSJhZGRvbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc4MSksCSJhZGRpbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTEpLAkiYWRkaWciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTEpLAkiYWRkaWUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjEpLAkiYWRkaWdlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MxKSwJImFkZGlsIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QxKSwJImFkZGluZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMSksCSJhZGRpbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjEpLAkiYWRkaW8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMkQoMHg1YWQpLAkiYnN3YXAiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLCBSUywgMCB9IH0sCi0KLQl7IFJfMigweDU5NCksCSJjbXBvYiIsCUlfSlgsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDU5NSksCSJjbXBpYiIsCUlfSlgsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDU5NiksCSJjbXBvcyIsCUlfSlgsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDU5NyksCSJjbXBpcyIsCUlfSlgsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQotCXsgUl8zKDB4Nzg0KSwJInNlbG5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4Nzk0KSwJInNlbGciLAkJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2E0KSwJInNlbGUiLAkJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2I0KSwJInNlbGdlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2M0KSwJInNlbGwiLAkJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2Q0KSwJInNlbG5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2U0KSwJInNlbGxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2Y0KSwJInNlbG8iLAkJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzMoMHg3ODIpLAkic3Vib25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkyKSwJInN1Ym9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EyKSwJInN1Ym9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IyKSwJInN1Ym9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMiksCSJzdWJvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMiksCSJzdWJvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTIpLAkic3Vib2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YyKSwJInN1Ym9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzgzKSwJInN1YmlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MyksCSJzdWJpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMyksCSJzdWJpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMyksCSJzdWJpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzMpLAkic3ViaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDMpLAkic3ViaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UzKSwJInN1YmlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMyksCSJzdWJpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8zKDB4NjVjKSwJImRjY3RsIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUkwgfSB9LAotCXsgUl8zKDB4NjViKSwJImljY3RsIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDY1OCksCSJpbnRjdGwiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLCBSUywgMCB9IH0sCi0JeyBSXzAoMHg1YjQpLAkiaW50ZGlzIiwJSV9KWCwJUkVHLAkwLCB7ICAgMCwgIDAsIDAgfSB9LAotCXsgUl8wKDB4NWI1KSwJImludGVuIiwJSV9KWCwJUkVHLAkwLCB7ICAgMCwgIDAsIDAgfSB9LAotCXsgUl8wKDB4NjVkKSwJImhhbHQiLAkJSV9KWCwJUkVHLAkxLCB7IFJTTCwgIDAsIDAgfSB9LAotCi0JLyogSHggZXh0ZW5zaW9ucy4gICovCi0JeyAweGFjMDAwMDAwLAkiZGNpbnZhIiwJSV9IWCwJTUVNMSwJMSwgeyAgIE0sICAwLCAwIH0gfSwKLQotCS8qIEVORCBPRiBUQUJMRSAqLwotCi0JeyAwLAkJTlVMTCwJCTAsCTAsCTAsIHsgMCwgMCwgMCB9CX0KLX07Ci0KLSAvKiBlbmQgb2YgaTk2MC1vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaWE2NC5oIGIvaW5jbHVkZS9vcGNvZGUvaWE2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZiY2NkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2lhNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKiBpYTY0LmggLS0gSGVhZGVyIGZpbGUgZm9yIGlhNjQgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBTZWUgdGhlIGZpbGUgSFAtQ09QWVJJR0hUIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgKi8KLQotI2lmbmRlZiBvcGNvZGVfaWE2NF9oCi0jZGVmaW5lIG9wY29kZV9pYTY0X2gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmZkLmg+Ci0KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBpYTY0X2luc247Ci0KLWVudW0gaWE2NF9pbnNuX3R5cGUKLSAgewotICAgIElBNjRfVFlQRV9OSUwgPSAwLAkvKiBpbGxlZ2FsIHR5cGUgKi8KLSAgICBJQTY0X1RZUEVfQSwJLyogaW50ZWdlciBhbHUgKEktIG9yIE0tdW5pdCkgKi8KLSAgICBJQTY0X1RZUEVfSSwJLyogbm9uLWFsdSBpbnRlZ2VyIChJLXVuaXQpICovCi0gICAgSUE2NF9UWVBFX00sCS8qIG1lbW9yeSAoTS11bml0KSAqLwotICAgIElBNjRfVFlQRV9CLAkvKiBicmFuY2ggKEItdW5pdCkgKi8KLSAgICBJQTY0X1RZUEVfRiwJLyogZmxvYXRpbmctcG9pbnQgKEYtdW5pdCkgKi8KLSAgICBJQTY0X1RZUEVfWCwJLyogbG9uZyBlbmNvZGluZyAoWC11bml0KSAqLwotICAgIElBNjRfVFlQRV9EWU4sCS8qIER5bmFtaWMgb3Bjb2RlICovCi0gICAgSUE2NF9OVU1fVFlQRVMKLSAgfTsKLQotZW51bSBpYTY0X3VuaXQKLSAgewotICAgIElBNjRfVU5JVF9OSUwgPSAwLAkvKiBpbGxlZ2FsIHVuaXQgKi8KLSAgICBJQTY0X1VOSVRfSSwJLyogaW50ZWdlciB1bml0ICovCi0gICAgSUE2NF9VTklUX00sCS8qIG1lbW9yeSB1bml0ICovCi0gICAgSUE2NF9VTklUX0IsCS8qIGJyYW5jaGluZyB1bml0ICovCi0gICAgSUE2NF9VTklUX0YsCS8qIGZsb2F0aW5nLXBvaW50IHVuaXQgKi8KLSAgICBJQTY0X1VOSVRfTCwJLyogbG9uZyAidW5pdCIgKi8KLSAgICBJQTY0X1VOSVRfWCwJLyogbWF5IGJlIGludGVnZXIgb3IgYnJhbmNoIHVuaXQgKi8KLSAgICBJQTY0X05VTV9VTklUUwotICB9OwotCi0vKiBDaGFuZ2VzIHRvIHRoaXMgZW51bWVyYXRpb24gbXVzdCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBvcGVyYW5kIHRhYmxlIGluCi0gICBiZmQvY3B1LWlhNjQtb3BjLmMgCi0gKi8gCi1lbnVtIGlhNjRfb3BuZAotICB7Ci0gICAgSUE2NF9PUE5EX05JTCwJLyogbm8gb3BlcmFuZC0tLU1VU1QgQkUgRklSU1QhKi8KLQotICAgIC8qIGNvbnN0YW50cyAqLwotICAgIElBNjRfT1BORF9BUl9DQ1YsCS8qIGFwcGxpY2F0aW9uIHJlZ2lzdGVyIGNjdiAoYXIuY2N2KSAqLwotICAgIElBNjRfT1BORF9BUl9QRlMsCS8qIGFwcGxpY2F0aW9uIHJlZ2lzdGVyIHBmcyAoYXIucGZzKSAqLwotICAgIElBNjRfT1BORF9DMSwJLyogdGhlIGNvbnN0YW50IDEgKi8KLSAgICBJQTY0X09QTkRfQzgsCS8qIHRoZSBjb25zdGFudCA4ICovCi0gICAgSUE2NF9PUE5EX0MxNiwJLyogdGhlIGNvbnN0YW50IDE2ICovCi0gICAgSUE2NF9PUE5EX0dSMCwJLyogZ3IwICovCi0gICAgSUE2NF9PUE5EX0lQLAkvKiBpbnN0cnVjdGlvbiBwb2ludGVyIChpcCkgKi8KLSAgICBJQTY0X09QTkRfUFIsCS8qIHByZWRpY2F0ZSByZWdpc3RlciAocHIpICovCi0gICAgSUE2NF9PUE5EX1BSX1JPVCwJLyogcm90YXRpbmcgcHJlZGljYXRlIHJlZ2lzdGVyIChwci5yb3QpICovCi0gICAgSUE2NF9PUE5EX1BTUiwJLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAocHNyKSAqLwotICAgIElBNjRfT1BORF9QU1JfTCwJLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciBMIChwc3IubCkgKi8KLSAgICBJQTY0X09QTkRfUFNSX1VNLAkvKiBwcm9jZXNzb3Igc3RhdHVzIHJlZ2lzdGVyIFVNIChwc3IudW0pICovCi0KLSAgICAvKiByZWdpc3RlciBvcGVyYW5kczogKi8KLSAgICBJQTY0X09QTkRfQVIzLAkvKiB0aGlyZCBhcHBsaWNhdGlvbiByZWdpc3RlciAjIChiaXRzIDIwLTI2KSAqLwotICAgIElBNjRfT1BORF9CMSwJLyogYnJhbmNoIHJlZ2lzdGVyICMgKGJpdHMgNi04KSAqLwotICAgIElBNjRfT1BORF9CMiwJLyogYnJhbmNoIHJlZ2lzdGVyICMgKGJpdHMgMTMtMTUpICovCi0gICAgSUE2NF9PUE5EX0NSMywJLyogdGhpcmQgY29udHJvbCByZWdpc3RlciAjIChiaXRzIDIwLTI2KSAqLwotICAgIElBNjRfT1BORF9GMSwJLyogZmlyc3QgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgIyAqLwotICAgIElBNjRfT1BORF9GMiwJLyogc2Vjb25kIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyICMgKi8KLSAgICBJQTY0X09QTkRfRjMsCS8qIHRoaXJkIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyICMgKi8KLSAgICBJQTY0X09QTkRfRjQsCS8qIGZvdXJ0aCBmbG9hdGluZy1wb2ludCByZWdpc3RlciAjICovCi0gICAgSUE2NF9PUE5EX1AxLAkvKiBmaXJzdCBwcmVkaWNhdGUgIyAqLwotICAgIElBNjRfT1BORF9QMiwJLyogc2Vjb25kIHByZWRpY2F0ZSAjICovCi0gICAgSUE2NF9PUE5EX1IxLAkvKiBmaXJzdCByZWdpc3RlciAjICovCi0gICAgSUE2NF9PUE5EX1IyLAkvKiBzZWNvbmQgcmVnaXN0ZXIgIyAqLwotICAgIElBNjRfT1BORF9SMywJLyogdGhpcmQgcmVnaXN0ZXIgIyAqLwotICAgIElBNjRfT1BORF9SM18yLAkvKiB0aGlyZCByZWdpc3RlciAjIChsaW1pdGVkIHRvIGdyMC1ncjMpICovCi0KLSAgICAvKiBpbmRpcmVjdCBvcGVyYW5kczogKi8KLSAgICBJQTY0X09QTkRfQ1BVSURfUjMsCS8qIGNwdWlkW3JlZ10gKi8KLSAgICBJQTY0X09QTkRfREJSX1IzLAkvKiBkYnJbcmVnXSAqLwotICAgIElBNjRfT1BORF9EVFJfUjMsCS8qIGR0cltyZWddICovCi0gICAgSUE2NF9PUE5EX0lUUl9SMywJLyogaXRyW3JlZ10gKi8KLSAgICBJQTY0X09QTkRfSUJSX1IzLAkvKiBpYnJbcmVnXSAqLwotICAgIElBNjRfT1BORF9NUjMsCS8qIG1lbW9yeSBhdCBhZGRyIG9mIHRoaXJkIHJlZ2lzdGVyICMgKi8KLSAgICBJQTY0X09QTkRfTVNSX1IzLAkvKiBtc3JbcmVnXSAqLwotICAgIElBNjRfT1BORF9QS1JfUjMsCS8qIHBrcltyZWddICovCi0gICAgSUE2NF9PUE5EX1BNQ19SMywJLyogcG1jW3JlZ10gKi8KLSAgICBJQTY0X09QTkRfUE1EX1IzLAkvKiBwbWRbcmVnXSAqLwotICAgIElBNjRfT1BORF9SUl9SMywJLyogcnJbcmVnXSAqLwotCi0gICAgLyogaW1tZWRpYXRlIG9wZXJhbmRzOiAqLwotICAgIElBNjRfT1BORF9DQ05UNSwJLyogNS1iaXQgY291bnQgKDMxIC0gYml0cyAyMC0yNCkgKi8KLSAgICBJQTY0X09QTkRfQ05UMmEsCS8qIDItYml0IGNvdW50ICgxICsgYml0cyAyNy0yOCkgKi8KLSAgICBJQTY0X09QTkRfQ05UMmIsCS8qIDItYml0IGNvdW50IChiaXRzIDI3LTI4KTogMSwgMiwgMyAqLwotICAgIElBNjRfT1BORF9DTlQyYywJLyogMi1iaXQgY291bnQgKGJpdHMgMzAtMzEpOiAwLCA3LCAxNSwgb3IgMTYgKi8KLSAgICBJQTY0X09QTkRfQ05UNSwJLyogNS1iaXQgY291bnQgKGJpdHMgMTQtMTgpICovCi0gICAgSUE2NF9PUE5EX0NOVDYsCS8qIDYtYml0IGNvdW50IChiaXRzIDI3LTMyKSAqLwotICAgIElBNjRfT1BORF9DUE9TNmEsCS8qIDYtYml0IGNvdW50ICg2MyAtIGJpdHMgMjAtMjUpICovCi0gICAgSUE2NF9PUE5EX0NQT1M2YiwJLyogNi1iaXQgY291bnQgKDYzIC0gYml0cyAxNC0xOSkgKi8KLSAgICBJQTY0X09QTkRfQ1BPUzZjLAkvKiA2LWJpdCBjb3VudCAoNjMgLSBiaXRzIDMxLTM2KSAqLwotICAgIElBNjRfT1BORF9JTU0xLAkvKiBzaWduZWQgMS1iaXQgaW1tZWRpYXRlIChiaXQgMzYpICovCi0gICAgSUE2NF9PUE5EX0lNTVUyLAkvKiB1bnNpZ25lZCAyLWJpdCBpbW1lZGlhdGUgKGJpdHMgMTMtMTQpICovCi0gICAgSUE2NF9PUE5EX0lNTVU3YSwJLyogdW5zaWduZWQgNy1iaXQgaW1tZWRpYXRlIChiaXRzIDEzLTE5KSAqLwotICAgIElBNjRfT1BORF9JTU1VN2IsCS8qIHVuc2lnbmVkIDctYml0IGltbWVkaWF0ZSAoYml0cyAyMC0yNikgKi8KLSAgICBJQTY0X09QTkRfU09GLAkvKiA4LWJpdCBzdGFjayBmcmFtZSBzaXplICovCi0gICAgSUE2NF9PUE5EX1NPTCwJLyogOC1iaXQgc2l6ZSBvZiBsb2NhbHMgKi8KLSAgICBJQTY0X09QTkRfU09SLAkvKiA2LWJpdCBudW1iZXIgb2Ygcm90YXRpbmcgcmVnaXN0ZXJzIChzY2FsZWQgYnkgOCkgKi8KLSAgICBJQTY0X09QTkRfSU1NOCwJLyogc2lnbmVkIDgtYml0IGltbWVkaWF0ZSAoYml0cyAxMy0xOSAmIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU04VTQsCS8qIGNtcDQqdSBzaWduZWQgOC1iaXQgaW1tZWRpYXRlIChiaXRzIDEzLTE5ICYgMzYpICovCi0gICAgSUE2NF9PUE5EX0lNTThNMSwJLyogc2lnbmVkIDgtYml0IGltbWVkaWF0ZSAtMSAoYml0cyAxMy0xOSAmIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU04TTFVNCwJLyogY21wNCp1IHNpZ25lZCA4LWJpdCBpbW1lZGlhdGUgLTEgKGJpdHMgMTMtMTkgJiAzNikqLwotICAgIElBNjRfT1BORF9JTU04TTFVOCwJLyogY21wKnUgc2lnbmVkIDgtYml0IGltbWVkaWF0ZSAtMSAoYml0cyAxMy0xOSAmIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU1VOSwJLyogdW5zaWduZWQgOS1iaXQgaW1tZWRpYXRlIChiaXRzIDMzLTM0LCAyMC0yNikgKi8KLSAgICBJQTY0X09QTkRfSU1NOWEsCS8qIHNpZ25lZCA5LWJpdCBpbW1lZGlhdGUgKGJpdHMgNi0xMiwgMjcsIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU05YiwJLyogc2lnbmVkIDktYml0IGltbWVkaWF0ZSAoYml0cyAxMy0xOSwgMjcsIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU0xNCwJLyogc2lnbmVkIDE0LWJpdCBpbW1lZGlhdGUgKGJpdHMgMTMtMTksIDI3LTMyLCAzNikgKi8KLSAgICBJQTY0X09QTkRfSU1NMTcsCS8qIHNpZ25lZCAxNy1iaXQgaW1tZWRpYXRlICgyKmJpdHMgNi0xMiwgMjQtMzEsIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU1VMjEsCS8qIHVuc2lnbmVkIDIxLWJpdCBpbW1lZGlhdGUgKGJpdHMgNi0yNSwgMzYpICovCi0gICAgSUE2NF9PUE5EX0lNTTIyLAkvKiBzaWduZWQgMjItYml0IGltbWVkaWF0ZSAoYml0cyAxMy0xOSwgMjItMzYpICovCi0gICAgSUE2NF9PUE5EX0lNTVUyNCwJLyogdW5zaWduZWQgMjQtYml0IGltbWVkaWF0ZSAoYml0cyA2LTI2LCAzMS0zMiwgMzYpICovCi0gICAgSUE2NF9PUE5EX0lNTTQ0LAkvKiBzaWduZWQgNDQtYml0IGltbWVkaWF0ZSAoMl4xNipiaXRzIDYtMzIsIDM2KSAqLwotICAgIElBNjRfT1BORF9JTU1VNjIsCS8qIHVuc2lnbmVkIDYyLWJpdCBpbW1lZGlhdGUgKi8KLSAgICBJQTY0X09QTkRfSU1NVTY0LAkvKiB1bnNpZ25lZCA2NC1iaXQgaW1tZWRpYXRlIChsb3RzYSBiaXRzLi4uKSAqLwotICAgIElBNjRfT1BORF9JTkMzLAkvKiBzaWduZWQgMy1iaXQgKGJpdHMgMTMtMTUpOiArLy0xLCA0LCA4LCAxNiAqLwotICAgIElBNjRfT1BORF9MRU40LAkvKiA0LWJpdCBjb3VudCAoYml0cyAyNy0zMCArIDEpICovCi0gICAgSUE2NF9PUE5EX0xFTjYsCS8qIDYtYml0IGNvdW50IChiaXRzIDI3LTMyICsgMSkgKi8KLSAgICBJQTY0X09QTkRfTUJUWVBFNCwJLyogNC1iaXQgbXV4IHR5cGUgKGJpdHMgMjAtMjMpICovCi0gICAgSUE2NF9PUE5EX01IVFlQRTgsCS8qIDgtYml0IG11eCB0eXBlIChiaXRzIDIwLTI3KSAqLwotICAgIElBNjRfT1BORF9QT1M2LAkvKiA2LWJpdCBjb3VudCAoYml0cyAxNC0xOSkgKi8KLSAgICBJQTY0X09QTkRfVEFHMTMsCS8qIHNpZ25lZCAxMy1iaXQgdGFnIChpcCArIDE2KmJpdHMgNi0xMiwgMzMtMzQpICovCi0gICAgSUE2NF9PUE5EX1RBRzEzYiwJLyogc2lnbmVkIDEzLWJpdCB0YWcgKGlwICsgMTYqYml0cyAyNC0zMikgKi8KLSAgICBJQTY0X09QTkRfVEdUMjUsCS8qIHNpZ25lZCAyNS1iaXQgKGlwICsgMTYqYml0cyA2LTI1LCAzNikgKi8KLSAgICBJQTY0X09QTkRfVEdUMjViLAkvKiBzaWduZWQgMjUtYml0IChpcCArIDE2KmJpdHMgNi0xMiwgMjAtMzIsIDM2KSAqLwotICAgIElBNjRfT1BORF9UR1QyNWMsCS8qIHNpZ25lZCAyNS1iaXQgKGlwICsgMTYqYml0cyAxMy0zMiwgMzYpICovCi0gICAgSUE2NF9PUE5EX1RHVDY0LCAgICAvKiA2NC1iaXQgKGlwICsgMTYqYml0cyAxMy0zMiwgMzYsIDItNDAoTCkpICovCi0KLSAgICBJQTY0X09QTkRfQ09VTlQJLyogIyBvZiBvcGVyYW5kIHR5cGVzIChNVVNUIEJFIExBU1QhKSAqLwotICB9OwotCi1lbnVtIGlhNjRfZGVwZW5kZW5jeV9tb2RlCi17Ci0gIElBNjRfRFZfUkFXLAotICBJQTY0X0RWX1dBVywKLSAgSUE2NF9EVl9XQVIsCi19OwotCi1lbnVtIGlhNjRfZGVwZW5kZW5jeV9zZW1hbnRpY3MKLXsKLSAgSUE2NF9EVlNfTk9ORSwKLSAgSUE2NF9EVlNfSU1QTElFRCwKLSAgSUE2NF9EVlNfSU1QTElFREYsCi0gIElBNjRfRFZTX0RBVEEsCi0gIElBNjRfRFZTX0lOU1RSLAotICBJQTY0X0RWU19TUEVDSUZJQywKLSAgSUE2NF9EVlNfT1RIRVIsCi19OwotCi1lbnVtIGlhNjRfcmVzb3VyY2Vfc3BlY2lmaWVyCi17Ci0gIElBNjRfUlNfQU5ZLAotICBJQTY0X1JTX0FSX0ssCi0gIElBNjRfUlNfQVJfVU5BVCwKLSAgSUE2NF9SU19BUiwgLyogOC0xNSwgMjAsIDIyLTIzLCAzMSwgMzMtMzUsIDM3LTM5LCA0MS00MywgNDUtNDcsIDY3LTExMSAqLwotICBJQTY0X1JTX0FSYiwgLyogNDgtNjMsIDExMi0xMjcgKi8KLSAgSUE2NF9SU19CUiwKLSAgSUE2NF9SU19DRk0sCi0gIElBNjRfUlNfQ1BVSUQsCi0gIElBNjRfUlNfQ1JfSVJSLAotICBJQTY0X1JTX0NSX0xSUiwKLSAgSUE2NF9SU19DUiwgLyogMy03LDEwLTE1LDE4LDI2LTYzLDc1LTc5LDgyLTEyNyAqLwotICBJQTY0X1JTX0RCUiwKLSAgSUE2NF9SU19GUiwKLSAgSUE2NF9SU19GUmIsCi0gIElBNjRfUlNfR1IwLAotICBJQTY0X1JTX0dSLAotICBJQTY0X1JTX0lCUiwKLSAgSUE2NF9SU19JTlNFUlZJQ0UsIC8qIENSW0VPSV0gb3IgQ1JbSVZSXSAqLwotICBJQTY0X1JTX01TUiwKLSAgSUE2NF9SU19QS1IsCi0gIElBNjRfUlNfUE1DLAotICBJQTY0X1JTX1BNRCwKLSAgSUE2NF9SU19QUiwKLSAgSUE2NF9SU19QUjYzLAotICBJQTY0X1JTX1JSLAotCi0gIElBNjRfUlNfQVJYLCAvKiBBUnMgbm90IGluIFJTX0FSIG9yIFJTX0FSYiAqLwotICBJQTY0X1JTX0NSWCwgLyogQ1JzIG5vdCBpbiBSU19DUiAqLwotICBJQTY0X1JTX1BTUiwgLyogUFNSIGJpdHMgKi8KLSAgSUE2NF9SU19SU0UsIC8qIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIFJTRSByZXNvdXJjZXMgKi8KLSAgSUE2NF9SU19BUl9GUFNSLAotfTsKLQotZW51bSBpYTY0X3JzZV9yZXNvdXJjZQotewotICBJQTY0X1JTRV9OX1NUQUNLRURfUEhZUywKLSAgSUE2NF9SU0VfQk9GLAotICBJQTY0X1JTRV9TVE9SRV9SRUcsCi0gIElBNjRfUlNFX0xPQURfUkVHLAotICBJQTY0X1JTRV9CU1BMT0FELAotICBJQTY0X1JTRV9STkFUQklUSU5ERVgsCi0gIElBNjRfUlNFX0NGTEUsCi0gIElBNjRfUlNFX05ESVJUWSwKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gcmVzb3VyY2UgZGVwZW5kZW5jeSAqLwotc3RydWN0IGlhNjRfZGVwZW5kZW5jeQotewotICAvKiBOYW1lIG9mIHRoZSByZXNvdXJjZSAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBEb2VzIHRoaXMgZGVwZW5kZW5jeSBuZWVkIGZ1cnRoZXIgc3BlY2lmaWNhdGlvbj8gKi8KLSAgZW51bSBpYTY0X3Jlc291cmNlX3NwZWNpZmllciBzcGVjaWZpZXI7Ci0gIC8qIE1vZGUgb2YgZGVwZW5kZW5jeSAqLwotICBlbnVtIGlhNjRfZGVwZW5kZW5jeV9tb2RlIG1vZGU7Ci0gIC8qIERlcGVuZGVuY3kgc2VtYW50aWNzICovCi0gIGVudW0gaWE2NF9kZXBlbmRlbmN5X3NlbWFudGljcyBzZW1hbnRpY3M7Ci0gIC8qIFJlZ2lzdGVyIGluZGV4LCBpZiBhcHBsaWNhYmxlIChkaXN0aW5ndWlzaGVzIEFSLCBDUiwgYW5kIFBTUiBkZXBzKSAqLwotI2RlZmluZSBSRUdfTk9ORSAoLTEpCi0gIGludCByZWdpbmRleDsKLSAgLyogU3BlY2lhbCBpbmZvIG9uIHNlbWFudGljcyAqLwotICBjb25zdCBjaGFyICppbmZvOwotfTsKLQotLyogVHdvIGFycmF5cyBvZiBpbmRleGVzIGludG8gdGhlIGlhNjRfZGVwZW5kZW5jeSB0YWJsZS4KLSAgIGNoa3MgYXJlIGRlcGVuZGVuY2llcyB0byBjaGVjayBmb3IgY29uZmxpY3RzIHdoZW4gYW4gb3Bjb2RlIGlzCi0gICBlbmNvdW50ZXJlZDsgcmVncyBhcmUgZGVwZW5kZW5jaWVzIHRvIHJlZ2lzdGVyIChtYXJrIGFzIHVzZWQpIHdoZW4gYW4KLSAgIG9wY29kZSBpcyB1c2VkLiAgY2hrcyBjb3JyZXNwb25kIHRvIHJlYWRlcnMgKFJBVykgb3Igd3JpdGVycyAoV0FXIG9yCi0gICBXQVIpIG9mIGEgcmVzb3VyY2UsIHdoaWxlIHJlZ3MgY29ycmVzcG9uZCB0byB3cml0ZXJzIChSQVcgb3IgV0FXKSBhbmQKLSAgIHJlYWRlcnMgKFdBUikgb2YgYSByZXNvdXJjZS4gICovCi1zdHJ1Y3QgaWE2NF9vcGNvZGVfZGVwZW5kZW5jeQotewotICBpbnQgbmNoa3M7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpjaGtzOwotICBpbnQgbnJlZ3M7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpyZWdzOwotfTsKLQotLyogZW5jb2RlL2V4dHJhY3QgdGhlIG5vdGUvaW5kZXggZm9yIGEgZGVwZW5kZW5jeSAqLwotI2RlZmluZSBSREVQKE4sWCkgKCgoTik8PDExKXwoWCkpCi0jZGVmaW5lIE5PVEUoWCkgKCgoWCk+PjExKSYweDFGKQotI2RlZmluZSBERVAoWCkgKChYKSYweDdGRikKLQotLyogQSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgZXhlY3V0aW9uIHVuaXRzIHRoYXQgYXJlIGFjdGl2ZQotICAgZm9yIGVhY2ggb2YgdGhlIHRocmVlIHNsb3RzLiAgSXQgYWxzbyBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mCi0gICBpbnN0cnVjdGlvbiBncm91cCBib3VuZGFyaWVzIHRoYXQgbWF5IGJlIHByZXNlbnQgYmV0d2VlbiB0d28gc2xvdHMuICAqLwotc3RydWN0IGlhNjRfdGVtcGxfZGVzYwotICB7Ci0gICAgaW50IGdyb3VwX2JvdW5kYXJ5OwkvKiAwPW5vIGJvdW5kYXJ5LCAxPWJldHdlZW4gc2xvdCAwICYgMSwgZXRjLiAqLwotICAgIGVudW0gaWE2NF91bml0IGV4ZWNfdW5pdFszXTsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICB9OwotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBpYTY0X29wY29kZS4gICovCi0KLXN0cnVjdCBpYTY0X29wY29kZQotICB7Ci0gICAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgLyogVGhlIHR5cGUgb2YgdGhlIGluc3RydWN0aW9uOiAqLwotICAgIGVudW0gaWE2NF9pbnNuX3R5cGUgdHlwZTsKLQotICAgIC8qIE51bWJlciBvZiBvdXRwdXQgb3BlcmFuZHM6ICovCi0gICAgaW50IG51bV9vdXRwdXRzOwotCi0gICAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgICBpYTY0X2luc24gb3Bjb2RlOwotCi0gICAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgICBpYTY0X2luc24gbWFzazsKLQotICAgIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICAgIGVudW0gaWE2NF9vcG5kIG9wZXJhbmRzWzVdOwotCi0gICAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSBwcmltYXJpbHkgdXNlZCB0bwotICAgICAgIGluZGljYXRlIHNwZWNpZmljIHByb2Nlc3NvcnMgYW5kIGVudmlyb25tZW50cyBzdXBwb3J0IHRoZQotICAgICAgIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LiAqLwotICAgIHVuc2lnbmVkIGludCBmbGFnczsKLQotICAgIC8qIFVzZWQgYnkgaWE2NF9maW5kX25leHRfb3Bjb2RlICgpLiAqLwotICAgIHNob3J0IGVudF9pbmRleDsKLQotICAgIC8qIE9wY29kZSBkZXBlbmRlbmNpZXMuICovIAotICAgIGNvbnN0IHN0cnVjdCBpYTY0X29wY29kZV9kZXBlbmRlbmN5ICpkZXBlbmRlbmNpZXM7Ci0gIH07Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgaWE2NF9vcGNvZGUuICAqLwotCi0jZGVmaW5lIElBNjRfT1BDT0RFX0ZJUlNUCSgxPDwwKQkvKiBtdXN0IGJlIGZpcnN0IGluIGFuIGluc24gZ3JvdXAgKi8KLSNkZWZpbmUgSUE2NF9PUENPREVfWF9JTl9NTFgJKDE8PDEpCS8qIGluc24gaXMgYWxsb3dlZCBpbiBYIHNsb3Qgb2YgTUxYICovCi0jZGVmaW5lIElBNjRfT1BDT0RFX0xBU1QJKDE8PDIpCS8qIG11c3QgYmUgbGFzdCBpbiBhbiBpbnNuIGdyb3VwICovCi0jZGVmaW5lIElBNjRfT1BDT0RFX1BSSVYJKDE8PDMpCS8qIHByaXZpbGVnZWQgaW5zdHJ1Y3QgKi8KLSNkZWZpbmUgSUE2NF9PUENPREVfU0xPVDIJKDE8PDQpCS8qIGluc24gYWxsb3dlZCBpbiBzbG90IDIgb25seSAqLwotI2RlZmluZSBJQTY0X09QQ09ERV9OT19QUkVECSgxPDw1KQkvKiBpbnNuIGNhbm5vdCBiZSBwcmVkaWNhdGVkICovCi0jZGVmaW5lIElBNjRfT1BDT0RFX1BTRVVETwkoMTw8NikJLyogaW5zbiBpcyBhIHBzZXVkby1vcCAqLwotI2RlZmluZSBJQTY0X09QQ09ERV9GMl9FUV9GMwkoMTw8NykJLyogY29uc3RyYWludDogRjIgPT0gRjMgKi8KLSNkZWZpbmUgSUE2NF9PUENPREVfTEVOX0VRXzY0TUNOVAkoMTw8OCkJLyogY29uc3RyYWludDogTEVOID09IDY0LUNOVCAqLwotI2RlZmluZSBJQTY0X09QQ09ERV9NT0RfUlJCUyAgICAoMTw8OSkgLyogbW9kaWZpZXMgYWxsIHJyYnMgaW4gQ0ZNICovCi0KLS8qIEEgbWFjcm8gdG8gZXh0cmFjdCB0aGUgbWFqb3Igb3Bjb2RlIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJQTY0X09QKGkpCSgoKGkpID4+IDM3KSAmIDB4ZikKLQotZW51bSBpYTY0X29wZXJhbmRfY2xhc3MKLSAgewotICAgIElBNjRfT1BORF9DTEFTU19DU1QsCS8qIGNvbnN0YW50ICovCi0gICAgSUE2NF9PUE5EX0NMQVNTX1JFRywJLyogcmVnaXN0ZXIgKi8KLSAgICBJQTY0X09QTkRfQ0xBU1NfSU5ELAkvKiBpbmRpcmVjdCByZWdpc3RlciAqLwotICAgIElBNjRfT1BORF9DTEFTU19BQlMsCS8qIGFic29sdXRlIHZhbHVlICovCi0gICAgSUE2NF9PUE5EX0NMQVNTX1JFTCwJLyogSVAtcmVsYXRpdmUgdmFsdWUgKi8KLSAgfTsKLQotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBpYTY0X29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgaWE2NF9vcGVyYW5kCi17Ci0gIGVudW0gaWE2NF9vcGVyYW5kX2NsYXNzIGNsYXNzOwotCi0gIC8qIFNldCBWQUxVRSBhcyB0aGUgb3BlcmFuZCBiaXRzIGZvciB0aGUgb3BlcmFuZCBvZiB0eXBlIFNFTEYgaW4gdGhlCi0gICAgIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkgQ09ERS4gIElmIGFuIGVycm9yIG9jY3VycywgKkNPREUgaXMgbm90Ci0gICAgIG1vZGlmaWVkIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGRlc2NyaWJlcyB0aGUgY2F1c2Ugb2YgdGhlCi0gICAgIGVycm9yLiAgSWYgbm8gZXJyb3Igb2NjdXJzLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLSAgY29uc3QgY2hhciAqKCppbnNlcnQpIChjb25zdCBzdHJ1Y3QgaWE2NF9vcGVyYW5kICpzZWxmLCBpYTY0X2luc24gdmFsdWUsCi0JCQkgaWE2NF9pbnNuICpjb2RlKTsKLQotICAvKiBFeHRyYWN0IHRoZSBvcGVyYW5kIGJpdHMgZm9yIGFuIG9wZXJhbmQgb2YgdHlwZSBTRUxGIGZyb20KLSAgICAgaW5zdHJ1Y3Rpb24gQ09ERSBzdG9yZSB0aGVtIGluICpWQUxVRS4gIElmIGFuIGVycm9yIG9jY3VycywgdGhlCi0gICAgIGNhdXNlIG9mIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgYnkgdGhlIHN0cmluZyByZXR1cm5lZC4gIElmIG5vCi0gICAgIGVycm9yIG9jY3VycywgTlVMTCBpcyByZXR1cm5lZC4gICovCi0gIGNvbnN0IGNoYXIgKigqZXh0cmFjdCkgKGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKnNlbGYsIGlhNjRfaW5zbiBjb2RlLAotCQkJICBpYTY0X2luc24gKnZhbHVlKTsKLQotICAvKiBBIHN0cmluZyB3aG9zZSBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIG9wZXJhbmQgY2xhc3MuICAqLwotCi0gIGNvbnN0IGNoYXIgKnN0cjsKLQotICBzdHJ1Y3QgYml0X2ZpZWxkCi0gICAgewotICAgICAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgICAgIGludCBiaXRzOwotCi0gICAgICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaW50IHNoaWZ0OwotICAgIH0KLSAgZmllbGRbNF07CQkvKiBubyBvcGVyYW5kIGhhcyBtb3JlIHRoYW4gdGhpcyBtYW55IGJpdC1maWVsZHMgKi8KLQotICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0KLSAgY29uc3QgY2hhciAqZGVzYzsJLyogYnJpZWYgZGVzY3JpcHRpb24gKi8KLX07Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgaWE2NF9vcGVyYW5kLiAgKi8KLQotLyogRGlzYXNzZW1ibGUgYXMgc2lnbmVkIGRlY2ltYWwgKGluc3RlYWQgb2YgaGV4KTogKi8KLSNkZWZpbmUgSUE2NF9PUE5EX0ZMQUdfREVDSU1BTF9TSUdORUQJKDE8PDApCi0vKiBEaXNhc3NlbWJsZSBhcyB1bnNpZ25lZCBkZWNpbWFsIChpbnN0ZWFkIG9mIGhleCk6ICovCi0jZGVmaW5lIElBNjRfT1BORF9GTEFHX0RFQ0lNQUxfVU5TSUdORUQJKDE8PDEpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaWE2NF90ZW1wbF9kZXNjIGlhNjRfdGVtcGxfZGVzY1sxNl07Ci0KLS8qIFRoZSB0YWJsZXMgYXJlIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyIGFuZCBhcmUgb3RoZXJ3aXNlIGluCi0gICB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX2FbXTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX2lbXTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX21bXTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX2JbXTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX2ZbXTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgaWE2NF9vcGNvZGVzX2RbXTsKLQotCi1leHRlcm4gc3RydWN0IGlhNjRfb3Bjb2RlICppYTY0X2ZpbmRfb3Bjb2RlIChjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiBzdHJ1Y3QgaWE2NF9vcGNvZGUgKmlhNjRfZmluZF9uZXh0X29wY29kZSAoc3RydWN0IGlhNjRfb3Bjb2RlICplbnQpOwotCi1leHRlcm4gc3RydWN0IGlhNjRfb3Bjb2RlICppYTY0X2Rpc19vcGNvZGUgKGlhNjRfaW5zbiBpbnNuLAotCQkJCQkgICAgZW51bSBpYTY0X2luc25fdHlwZSB0eXBlKTsKLQotZXh0ZXJuIHZvaWQgaWE2NF9mcmVlX29wY29kZSAoc3RydWN0IGlhNjRfb3Bjb2RlICplbnQpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpYTY0X2RlcGVuZGVuY3kgKmlhNjRfZmluZF9kZXBlbmRlbmN5IChpbnQgaW5kZXgpOwotCi0vKiBUbyBhdm9pZCBjaXJjdWxhciBsaWJyYXJ5IGRlcGVuZGVuY2llcywgdGhpcyBhcnJheSBpcyBpbXBsZW1lbnRlZAotICAgaW4gYmZkL2NwdS1pYTY0LW9wYy5jOiAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgZWxmNjRfaWE2NF9vcGVyYW5kc1tJQTY0X09QTkRfQ09VTlRdOwotCi0jZW5kaWYgLyogb3Bjb2RlX2lhNjRfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbTY4ay5oIGIvaW5jbHVkZS9vcGNvZGUvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA4Yjc3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgaGVhZGVyIGZvciBtNjgwWzAxMjM0XTAvbTY4ODhbMTJdL202ODg1MS4KLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGVzZSBhcmUgdXNlZCBhcyBiaXQgZmxhZ3MgZm9yIHRoZSBhcmNoIGZpZWxkIGluIHRoZSBtNjhrX29wY29kZQotICAgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUJX202OGtfdW5kZWYgIDAKLSNkZWZpbmUJbTY4MDAwICAweDAwMQotI2RlZmluZQltNjgwMDggIG02ODAwMCAvKiBzeW5vbnltIGZvciAtbTY4MDAwLiAgb3RoZXJ3aXNlIHVudXNlZC4gKi8KLSNkZWZpbmUJbTY4MDEwICAweDAwMgotI2RlZmluZQltNjgwMjAgIDB4MDA0Ci0jZGVmaW5lCW02ODAzMCAgMHgwMDgKLSNkZWZpbmUgbTY4ZWMwMzAgbTY4MDMwIC8qIHNpbWlsYXIgZW5vdWdoIHRvIC1tNjgwMzAgdG8gaWdub3JlIGRpZmZlcmVuY2VzOwotCQkJICAgZ2FzIHdpbGwgZGVhbCB3aXRoIHRoZSBmZXcgZGlmZmVyZW5jZXMuICAqLwotI2RlZmluZQltNjgwNDAgIDB4MDEwCi0vKiB0aGVyZSBpcyBubyA2ODA1MCAqLwotI2RlZmluZSBtNjgwNjAgIDB4MDIwCi0jZGVmaW5lCW02ODg4MSAgMHgwNDAKLSNkZWZpbmUJbTY4ODgyICBtNjg4ODEgLyogc3lub255bSBmb3IgLW02ODg4MS4gIG90aGVyd2lzZSB1bnVzZWQuICovCi0jZGVmaW5lCW02ODg1MSAgMHgwODAKLSNkZWZpbmUgY3B1MzIJMHgxMDAJLyogZS5nLiwgNjgzMzIgKi8KLSNkZWZpbmUgbWNmNTIwMCAweDIwMAotI2RlZmluZSBtY2Y1MjA2ZSAweDQwMAotI2RlZmluZSBtY2Y1MzA3IDB4ODAwCi0KLSAvKiBoYW5keSBhbGlhc2VzICovCi0jZGVmaW5lCW02ODA0MHVwICAobTY4MDQwIHwgbTY4MDYwKQotI2RlZmluZQltNjgwMzB1cCAgKG02ODAzMCB8IG02ODA0MHVwKQotI2RlZmluZQltNjgwMjB1cCAgKG02ODAyMCB8IG02ODAzMHVwKQotI2RlZmluZQltNjgwMTB1cCAgKG02ODAxMCB8IGNwdTMyIHwgbTY4MDIwdXApCi0jZGVmaW5lCW02ODAwMHVwICAobTY4MDAwIHwgbTY4MDEwdXApCi0jZGVmaW5lIG1jZiAgICAgICAobWNmNTIwMCB8IG1jZjUyMDZlIHwgbWNmNTMwNykKLQotI2RlZmluZQltZmxvYXQgIChtNjg4ODEgfCBtNjg4ODIgfCBtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW1tbXUgICAgKG02ODg1MSB8IG02ODAzMCB8IG02ODA0MCB8IG02ODA2MCkKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yIGFuIG9wY29kZS4gICovCi0KLXN0cnVjdCBtNjhrX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAvKiBUaGUgbWFzayB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwotICAvKiBUaGUgYXJndW1lbnRzLiAgKi8KLSAgY29uc3QgY2hhciAqYXJnczsKLSAgLyogVGhlIGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGludCBhcmNoOwotfTsKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yIGFuIG9wY29kZSBhbGlhcy4gICovCi0KLXN0cnVjdCBtNjhrX29wY29kZV9hbGlhcwotewotICAvKiBUaGUgYWxpYXMgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICAvKiBUaGUgaW5zdHJ1Y3Rpb24gZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuICAqLwotICBjb25zdCBjaGFyICpwcmltYXJ5OwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdCBpcyB0aGUKLSAgIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzCi0gICBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGlzIGFzIG11Y2ggbG9uZ2VyIGFzIG5lY2Vzc2FyeSB0byBob2xkCi0gICB0aGUgb3BlcmFuZHMgaXQgaGFzLgotCi0gICBUaGUgbWF0Y2ggZmllbGQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggcGFydGljdWxhcgotICAgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0Ci0gICBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGZpZWxkIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZgotICAgb3BlcmFuZDsgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gICovCi0KLS8qIEtpbmRzIG9mIG9wZXJhbmRzOgotICAgQ2hhcmFjdGVycyB1c2VkOiBBYUJDY0RkRUZmR0hJSmtMbE1tbk9vcFFxUnJTc1R0VSBWdldYWVowMTIzfCp+JTtAISYkPy88PiNeKy0KLQotICAgRCAgZGF0YSByZWdpc3RlciBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIEEgIGFkZHJlc3MgcmVnaXN0ZXIgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBhICBhZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgUiAgZWl0aGVyIGtpbmQgb2YgcmVnaXN0ZXIuICBTdG9yZWQgYXMgNCBiaXRzLgotICAgciAgZWl0aGVyIGtpbmQgb2YgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gIFN0b3JlZCBhcyA0IGJpdHMuCi0gICAgICBBdCB0aGUgbW9tZW50LCB1c2VkIG9ubHkgZm9yIGNhczIgaW5zdHJ1Y3Rpb24uCi0gICBGICBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciByZWdpc3RlciBvbmx5LiAgIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBPICBhbiBvZmZzZXQgKG9yIHdpZHRoKTogaW1tZWRpYXRlIGRhdGEgMC0zMSBvciBkYXRhIHJlZ2lzdGVyLgotICAgICAgU3RvcmVkIGFzIDYgYml0cyBpbiBzcGVjaWFsIGZvcm1hdCBmb3IgQkYuLi4gaW5zbnMuCi0gICArICBhdXRvaW5jcmVtZW50IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzIChudW1iZXIgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXIpLgotICAgLSAgYXV0b2RlY3JlbWVudCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cyAobnVtYmVyIG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVyKS4KLSAgIFEgIHF1aWNrIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgICAgIFRoaXMgbWF0Y2hlcyBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvbmx5IHdoZW4gdmFsdWUgaXMgaW4gcmFuZ2UgMSAuLiA4LgotICAgTSAgbW92ZXEgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgOCBiaXRzLgotICAgICAgVGhpcyBtYXRjaGVzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIG9ubHkgd2hlbiB2YWx1ZSBpcyBpbiByYW5nZSAtMTI4Li4xMjcKLSAgIFQgIHRyYXAgdmVjdG9yIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGFzIDQgYml0cy4KLQotICAgayAgSy1mYWN0b3IgZm9yIGZtb3ZlLnAgaW5zdHJ1Y3Rpb24uICAgU3RvcmVkIGFzIGEgNy1iaXQgY29uc3RhbnQgb3IKLSAgICAgIGEgdGhyZWUgYml0IHJlZ2lzdGVyIG9mZnNldCwgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLgotCi0gICAjICBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBpbiBzcGVjaWFsIHBsYWNlcyAoYiwgdyBvciBsKQotICAgICAgd2hpY2ggc2F5IGhvdyBtYW55IGJpdHMgdG8gc3RvcmUuCi0gICBeICBpbW1lZGlhdGUgZGF0YSBmb3IgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgIFNwZWNpYWwgcGxhY2VzCi0gICAgICBhcmUgb2Zmc2V0IGJ5IDIgYnl0ZXMgZnJvbSAnIycuLi4KLSAgIEIgIHBjLXJlbGF0aXZlIGFkZHJlc3MsIGNvbnZlcnRlZCB0byBhbiBvZmZzZXQKLSAgICAgIHRoYXQgaXMgdHJlYXRlZCBhcyBpbW1lZGlhdGUgZGF0YS4KLSAgIGQgIGRpc3BsYWNlbWVudCBhbmQgcmVnaXN0ZXIuICBTdG9yZXMgdGhlIHJlZ2lzdGVyIGFzIDMgYml0cwotICAgICAgYW5kIHN0b3JlcyB0aGUgZGlzcGxhY2VtZW50IGluIHRoZSBlbnRpcmUgc2Vjb25kIHdvcmQuCi0KLSAgIEMgIHRoZSBDQ1IuICBObyBuZWVkIHRvIHN0b3JlIGl0OyB0aGlzIGlzIGp1c3QgZm9yIGZpbHRlcmluZyB2YWxpZGl0eS4KLSAgIFMgIHRoZSBTUi4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBVICB0aGUgVVNQLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIEUgIHRoZSBBQ0MuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgRyAgdGhlIE1BQ1NSLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIEggIHRoZSBNQVNLLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLQotICAgSSAgQ29wcm9jZXNzb3IgSUQuICAgTm90IHByaW50ZWQgaWYgMS4gICBUaGUgQ29wcm9jZXNzb3IgSUQgaXMgYWx3YXlzCi0gICAgICBleHRyYWN0ZWQgZnJvbSB0aGUgJ2QnIGZpZWxkIG9mIHdvcmQgb25lLCB3aGljaCBtZWFucyB0aGF0IGFuIGV4dGVuZGVkCi0gICAgICBjb3Byb2Nlc3NvciBvcGNvZGUgY2FuIGJlIHNraXBwZWQgdXNpbmcgdGhlICdpJyBwbGFjZSwgaWYgbmVlZGVkLgotCi0gICBzICBTeXN0ZW0gQ29udHJvbCByZWdpc3RlciBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yLgotCi0gICBKICBNaXNjIHJlZ2lzdGVyIGZvciBtb3ZlYyBpbnN0cnVjdGlvbiwgc3RvcmVkIGluICdqJyBmb3JtYXQuCi0JUG9zc2libGUgdmFsdWVzOgotCTB4MDAwCVNGQwlTb3VyY2UgRnVuY3Rpb24gQ29kZSByZWcJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDAwMQlERkMJRGF0YSBGdW5jdGlvbiBDb2RlIHJlZwkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDAwMglDQUNSCUNhY2hlIENvbnRyb2wgUmVnaXN0ZXIJCVs2MCwgNDAsIDMwLCAyMF0KLQkweDAwMwlUQwlNTVUgVHJhbnNsYXRpb24gQ29udHJvbAkJWzYwLCA0MF0KLQkweDAwNAlJVFQwCUluc3RydWN0aW9uIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDAJWzYwLCA0MF0KLQkweDAwNQlJVFQxCUluc3RydWN0aW9uIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDEJWzYwLCA0MF0KLQkweDAwNglEVFQwCURhdGEgVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMAlbNjAsIDQwXQotCTB4MDA3CURUVDEJRGF0YSBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAxCVs2MCwgNDBdCi0JMHgwMDgJQlVTQ1IJQnVzIENvbnRyb2wgUmVnaXN0ZXIJCVs2MF0KLQkweDgwMAlVU1AJVXNlciBTdGFjayBQb2ludGVyCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4ODAxCVZCUglWZWN0b3IgQmFzZSByZWcJCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4ODAyCUNBQVIJQ2FjaGUgQWRkcmVzcyBSZWdpc3RlcgkJWyAgICAgICAgMzAsIDIwXQotCTB4ODAzCU1TUAlNYXN0ZXIgU3RhY2sgUG9pbnRlcgkJWyAgICA0MCwgMzAsIDIwXQotCTB4ODA0CUlTUAlJbnRlcnJ1cHQgU3RhY2sgUG9pbnRlcgkJWyAgICA0MCwgMzAsIDIwXQotCTB4ODA1CU1NVVNSCU1NVSBTdGF0dXMgcmVnCQkJWyAgICA0MF0KLQkweDgwNglVUlAJVXNlciBSb290IFBvaW50ZXIJCVs2MCwgNDBdCi0JMHg4MDcJU1JQCVN1cGVydmlzb3IgUm9vdCBQb2ludGVyCQlbNjAsIDQwXQotCTB4ODA4CVBDUglQcm9jZXNzb3IgQ29uZmlndXJhdGlvbiByZWcJWzYwXQotCTB4QzAwCVJPTUJBUglST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyCVs1MjBYXQotCTB4QzA0CVJBTUJBUjAJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCTB4QzA1CVJBTUJBUjEJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCTB4QzBGCU1CQVIwCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KLQotICAgIEwgIFJlZ2lzdGVyIGxpc3Qgb2YgdGhlIHR5cGUgZDAtZDcvYTAtYTcgZXRjLgotICAgICAgIChOZXchICBJbXByb3ZlZCEgIENhbiBhbHNvIGhvbGQgZnAwLWZwNywgYXMgd2VsbCEpCi0gICAgICAgVGhlIGFzc2VtYmxlciB0cmllcyB0byBzZWUgaWYgdGhlIHJlZ2lzdGVycyBtYXRjaCB0aGUgaW5zbiBieQotICAgICAgIGxvb2tpbmcgYXQgd2hlcmUgdGhlIGluc24gd2FudHMgdGhlbSBzdG9yZWQuCi0KLSAgICBsICBSZWdpc3RlciBsaXN0IGxpa2UgTCwgYnV0IHdpdGggYWxsIHRoZSBiaXRzIHJldmVyc2VkLgotICAgICAgIFVzZWQgZm9yIGdvaW5nIHRoZSBvdGhlciB3YXkuIC4gLgotCi0gICAgYyAgY2FjaGUgaWRlbnRpZmllciB3aGljaCBtYXkgYmUgIm5jIiBmb3Igbm8gY2FjaGUsICJpYyIKLSAgICAgICBmb3IgaW5zdHJ1Y3Rpb24gY2FjaGUsICJkYyIgZm9yIGRhdGEgY2FjaGUsIG9yICJiYyIKLSAgICAgICBmb3IgYm90aCBjYWNoZXMuICBVc2VkIGluIGNpbnYgYW5kIGNwdXNoLiAgQWx3YXlzCi0gICAgICAgc3RvcmVkIGluIHBvc2l0aW9uICJkIi4KLQotICAgIHUgIEFueSByZWdpc3Rlciwgd2l0aCBgYHVwcGVyJycgb3IgYGBsb3dlcicnIHNwZWNpZmljYXRpb24uICBVc2VkCi0gICAgICAgaW4gdGhlIG1hYyBpbnN0cnVjdGlvbnMgd2l0aCBzaXplIHdvcmQuCi0KLSBUaGUgcmVtYWluZGVyIGFyZSBhbGwgc3RvcmVkIGFzIDYgYml0cyB1c2luZyBhbiBhZGRyZXNzIG1vZGUgYW5kIGEKLSByZWdpc3RlciBudW1iZXI7IHRoZXkgZGlmZmVyIGluIHdoaWNoIGFkZHJlc3NpbmcgbW9kZXMgdGhleSBtYXRjaC4KLQotICAgKiAgYWxsCQkJCQkobW9kZXMgMC02LDcuMC00KQotICAgfiAgYWx0ZXJhYmxlIG1lbW9yeQkJCQkobW9kZXMgMi02LDcuMCw3LjEpCi0gICAJCQkJCQkobm90IDAsMSw3LjItNCkKLSAgICUgIGFsdGVyYWJsZQkJCQkJKG1vZGVzIDAtNiw3LjAsNy4xKQotCQkJCQkJKG5vdCA3LjItNCkKLSAgIDsgIGRhdGEJCQkJCShtb2RlcyAwLDItNiw3LjAtNCkKLQkJCQkJCShub3QgMSkKLSAgIEAgIGRhdGEsIGJ1dCBub3QgaW1tZWRpYXRlCQkJKG1vZGVzIDAsMi02LDcuMC0zKQotCQkJCQkJKG5vdCAxLDcuNCkKLSAgICEgIGNvbnRyb2wJCQkJCShtb2RlcyAyLDUsNiw3LjAtMykKLQkJCQkJCShub3QgMCwxLDMsNCw3LjQpCi0gICAmICBhbHRlcmFibGUgY29udHJvbAkJCQkobW9kZXMgMiw1LDYsNy4wLDcuMSkKLQkJCQkJCShub3QgMCwxLDcuMi00KQotICAgJCAgYWx0ZXJhYmxlIGRhdGEJCQkJKG1vZGVzIDAsMi02LDcuMCw3LjEpCi0JCQkJCQkobm90IDEsNy4yLTQpCi0gICA/ICBhbHRlcmFibGUgY29udHJvbCwgb3IgZGF0YSByZWdpc3RlcgkobW9kZXMgMCwyLDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAxLDMsNCw3LjItNCkKLSAgIC8gIGNvbnRyb2wsIG9yIGRhdGEgcmVnaXN0ZXIJCQkobW9kZXMgMCwyLDUsNiw3LjAtMykKLQkJCQkJCShub3QgMSwzLDQsNy40KQotICAgPiAgKnNhdmUgb3BlcmFuZHMJCQkJKG1vZGVzIDIsNCw1LDYsNy4wLDcuMSkKLQkJCQkJCShub3QgMCwxLDMsNy4yLTQpCi0gICA8ICAqcmVzdG9yZSBvcGVyYW5kcwkJCQkobW9kZXMgMiwzLDUsNiw3LjAtMykKLQkJCQkJCShub3QgMCwxLDQsNy40KQotCi0gICBjb2xkZmlyZSBtb3ZlIG9wZXJhbmRzOgotICAgbSAgCQkJCQkJKG1vZGVzIDAtNCkKLSAgIG4JCQkJCQkobW9kZXMgNSw3LjIpCi0gICBvCQkJCQkJKG1vZGVzIDYsNy4wLDcuMSw3LjMsNy40KQotICAgcAkJCQkJCShtb2RlcyAwLTUpCi0KLSAgIGNvbGRmaXJlIGJzZXQvYmNsci9idHN0L211bHNsL211bHVsIG9wZXJhbmRzOgotICAgcQkJCQkJCShtb2RlcyAwLDItNSkKLSAgIHYJCQkJCQkobW9kZXMgMCwyLTUsNy4wLDcuMSkKLSovCi0KLS8qIEZvciB0aGUgNjg4NTE6ICovCi0vKgotICAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAotICAgZm9sbG93aW5nIGNvZGVzLCBzbyBtYW55IG9mIHRoZW0gYXJlbid0IHZlcnkKLSAgIG1uZW1vbmljLiAtcmFiCi0KLSAgIDAgIDMyIGJpdCBwbW11IHJlZ2lzdGVyCi0JUG9zc2libGUgdmFsdWVzOgotCTAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIFJlZ2lzdGVyICg2ODAzMCwgNjg4NTEpCi0KLSAgIDEgIDE2IGJpdCBwbW11IHJlZ2lzdGVyCi0JMTExCUFDCUFjY2VzcyBDb250cm9sICg2ODg1MSkKLQotICAgMiAgOCBiaXQgcG1tdSByZWdpc3RlcgotCTEwMAlDQUwJQ3VycmVudCBBY2Nlc3MgTGV2ZWwgKDY4ODUxKQotCTEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsICg2ODg1MSkKLQkxMTAJU0NDCVN0YWNrIENoYW5nZSBDb250cm9sICg2ODg1MSkKLQotICAgMyAgNjgwMzAtb25seSBwbW11IHJlZ2lzdGVycyAoMzIgYml0KQotCTAxMAlUVDAJVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gcmVnIDAKLQkJCShha2EgQWNjZXNzIENvbnRyb2wgcmVnIDAgLS0gQUMwIC0tIG9uIDY4ZWMwMzApCi0JMDExCVRUMQlUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiByZWcgMQotCQkJKGFrYSBBY2Nlc3MgQ29udHJvbCByZWcgMSAtLSBBQzEgLS0gb24gNjhlYzAzMCkKLQotICAgVyAgd2lkZSBwbW11IHJlZ2lzdGVycwotCVBvc3NpYmxlIHZhbHVlczoKLQkwMDEJRFJQCURtYSBSb290IFBvaW50ZXIgKDY4ODUxKQotCTAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIgKDY4MDMwLCA2ODg1MSkKLQkwMTEJQ1JQCUNwdSBSb290IFBvaW50ZXIgKDY4MDMwLCA2ODg1MSkKLQotICAgZglmdW5jdGlvbiBjb2RlIHJlZ2lzdGVyICg2ODAzMCwgNjg4NTEpCi0JMAlTRkMKLQkxCURGQwotCi0gICBWCVZBTCByZWdpc3RlciBvbmx5ICg2ODg1MSkKLQotICAgWAlCQUR4LCBCQUN4ICgxNiBiaXQpCi0JMTAwCUJBRAlCcmVha3BvaW50IEFja25vd2xlZGdlIERhdGEgKDY4ODUxKQotCTEwMQlCQUMJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBDb250cm9sICg2ODg1MSkKLQotICAgWQlQU1IgKDY4ODUxKSAoTU1VU1Igb24gNjgwMzApIChBQ1VTUiBvbiA2OGVjMDMwKQotICAgWglQQ1NSICg2ODg1MSkKLQotICAgfAltZW1vcnkgCQkobW9kZXMgMi02LCA3LiopCi0KLSAgIHQgIGFkZHJlc3MgdGVzdCBsZXZlbCAoNjgwMzAgb25seSkKLSAgICAgIFN0b3JlZCBhcyAzIGJpdHMsIHJhbmdlIDAtNy4KLSAgICAgIEFsc28gdXNlZCBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBub3cuCi0KLSovCi0KLS8qIFBsYWNlcyB0byBwdXQgYW4gb3BlcmFuZCwgZm9yIG5vbi1nZW5lcmFsIG9wZXJhbmRzOgotICAgQ2hhcmFjdGVycyB1c2VkOiBCYkNjRGRnaGlqa0xsTW1Obm9zdFd3MTIzNDU2Nzg5Ci0KLSAgIHMgIHNvdXJjZSwgbG93IGJpdHMgb2YgZmlyc3Qgd29yZC4KLSAgIGQgIGRlc3QsIHNoaWZ0ZWQgOSBpbiBmaXJzdCB3b3JkCi0gICAxICBzZWNvbmQgd29yZCwgc2hpZnRlZCAxMgotICAgMiAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNgotICAgMyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMAotICAgNCAgdGhpcmQgd29yZCwgc2hpZnRlZCAxMgotICAgNSAgdGhpcmQgd29yZCwgc2hpZnRlZCA2Ci0gICA2ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDAKLSAgIDcgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDcKLSAgIDggIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEwCi0gICA5ICBzZWNvbmQgd29yZCwgc2hpZnRlZCA1Ci0gICBEICBzdG9yZSBpbiBib3RoIHBsYWNlIDEgYW5kIHBsYWNlIDM7IGZvciBkaXZ1bCBhbmQgZGl2c2wuCi0gICBCICBmaXJzdCB3b3JkLCBsb3cgYnl0ZSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICBMICBzZWNvbmQgYW5kIHRoaXJkIHdvcmRzIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgICAgIChhbHNvIG92ZXJsb2FkZWQgZm9yIG1vdmUxNikKLSAgIGIgIHNlY29uZCB3b3JkLCBsb3cgYnl0ZQotICAgdyAgc2Vjb25kIHdvcmQgKGVudGlyZSkgW3ZhcmlhYmxlIHdvcmQvbG9uZyBicmFuY2ggb2Zmc2V0IGZvciBkYnJhXQotICAgVyAgc2Vjb25kIHdvcmQgKGVudGlyZSkgKG11c3QgYmUgc2lnbmVkIDE2IGJpdCB2YWx1ZSkKLSAgIGwgIHNlY29uZCBhbmQgdGhpcmQgd29yZCAoZW50aXJlKQotICAgZyAgdmFyaWFibGUgYnJhbmNoIG9mZnNldCBmb3IgYnJhIGFuZCBzaW1pbGFyIGluc3RydWN0aW9ucy4KLSAgICAgIFRoZSBwbGFjZSB0byBzdG9yZSBkZXBlbmRzIG9uIHRoZSBtYWduaXR1ZGUgb2Ygb2Zmc2V0LgotICAgdCAgc3RvcmUgaW4gYm90aCBwbGFjZSA3IGFuZCBwbGFjZSA4OyBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucwotICAgYyAgYnJhbmNoIG9mZnNldCBmb3IgY3BCY2Mgb3BlcmF0aW9ucy4KLSAgICAgIFRoZSBwbGFjZSB0byBzdG9yZSBpcyB3b3JkIHR3byBpZiBiaXQgc2l4IG9mIHdvcmQgb25lIGlzIHplcm8sCi0gICAgICBhbmQgd29yZHMgdHdvIGFuZCB0aHJlZSBpZiBiaXQgc2l4IG9mIHdvcmQgb25lIGlzIG9uZS4KLSAgIGkgIEluY3JlbWVudCBieSB0d28sIHRvIHNraXAgb3ZlciBjb3Byb2Nlc3NvciBleHRlbmRlZCBvcGVyYW5kcy4gICBPbmx5Ci0gICAgICB3b3JrcyB3aXRoIHRoZSAnSScgZm9ybWF0LgotICAgayAgRHluYW1pYyBLLWZhY3RvciBmaWVsZC4gICBCaXRzIDYtNCBvZiB3b3JkIDIsIHVzZWQgYXMgYSByZWdpc3RlciBudW1iZXIuCi0gICAgICBBbHNvIHVzZWQgZm9yIGR5bmFtaWMgZm1vdmVtIGluc3RydWN0aW9uLgotICAgQyAgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgY29uc3RhbnQgLSA3IGJpdHMuICBBbHNvIHVzZWQgZm9yIHN0YXRpYwotICAgICAgSy1mYWN0b3JzLi4uCi0gICBqICBNb3ZlYyByZWdpc3RlciAjLCBzdG9yZWQgaW4gMTIgbG93IGJpdHMgb2Ygc2Vjb25kIHdvcmQuCi0gICBtICBGb3IgTVtTXUFDeDsgNCBiaXRzIHNwbGl0IHdpdGggTVNCIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQKLSAgICAgIGFuZCByZW1haW5pbmcgMyBiaXRzIG9mIHJlZ2lzdGVyIHNoaWZ0ZWQgOSBiaXRzIGluIGZpcnN0IHdvcmQuCi0gICAgICBJbmRpY2F0ZSB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDcgYml0cyBpbiBzZWNvbmQgd29yZC4KLSAgICAgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgbiAgYG0nIHdpdGhvdXRoIHVwcGVyL2xvd2VyIGluZGljYXRpb24uIChGb3IgTVtTXUFDeDsgNCBiaXRzIHNwbGl0Ci0gICAgICB3aXRoIE1TQiBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkIGFuZCByZW1haW5pbmcgMyBiaXRzIG9mCi0gICAgICByZWdpc3RlciBzaGlmdGVkIDkgYml0cyBpbiBmaXJzdCB3b3JkLiAgTm8gdXBwZXIvbG93ZXIKLSAgICAgIGluZGljYXRpb24gaXMgZG9uZS4pICBVc2Ugd2l0aCBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIG8gIEZvciBNW1NdQUN3OyA0IGJpdHMgc2hpZnRlZCAxMiBpbiBzZWNvbmQgd29yZCAobGlrZSBgMScpLgotICAgICAgSW5kaWNhdGUgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA3IGJpdHMgaW4gc2Vjb25kIHdvcmQuCi0gICAgICBVc2Ugd2l0aCBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIE0gIEZvciBNW1NdQUN3OyA0IGJpdHMgaW4gbG93IGJpdHMgb2YgZmlyc3Qgd29yZC4gIEluZGljYXRlCi0gICAgICB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDYgYml0cyBpbiBzZWNvbmQgd29yZC4gIFVzZSB3aXRoCi0gICAgICBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIE4gIEZvciBNW1NdQUN3OyA0IGJpdHMgaW4gbG93IGJpdHMgb2Ygc2Vjb25kIHdvcmQuICBJbmRpY2F0ZQotICAgICAgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA2IGJpdHMgaW4gc2Vjb25kIHdvcmQuICBVc2Ugd2l0aAotICAgICAgYFInIG9yIGB1JyBmb3JtYXQuCi0gICBoICBzaGlmdCBpbmRpY2F0b3IgKHNjYWxlIGZhY3RvciksIDEgYml0IHNoaWZ0ZWQgMTAgaW4gc2Vjb25kIHdvcmQKLQotIFBsYWNlcyB0byBwdXQgb3BlcmFuZCwgZm9yIGdlbmVyYWwgb3BlcmFuZHM6Ci0gICBkICBkZXN0aW5hdGlvbiwgc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZAotICAgYiAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyBvbmUgYnl0ZQotICAgdyAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyB0d28gYnl0ZXMKLSAgIGwgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgZm91ciBieXRlcwotICAgcyAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQuCi0gICAgICBVc2VkIHNvbWV0aW1lcyBpbiBjb250ZXh0cyB3aGVyZSBpbW1lZGlhdGUgaXMgbm90IGFsbG93ZWQgYW55d2F5LgotICAgZiAgc2luZ2xlIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgNCBieXRlcwotICAgRiAgZG91YmxlIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgOCBieXRlcwotICAgeCAgZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyAxMiBieXRlcwotICAgcCAgcGFja2VkIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyAxMiBieXRlcwotKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSBtNjhrX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbTY4a19vcGNvZGVfYWxpYXNlc1tdOwotCi1leHRlcm4gY29uc3QgaW50IG02OGtfbnVtb3Bjb2RlcywgbTY4a19udW1hbGlhc2VzOwotCi0vKiBlbmQgb2YgbTY4ay1vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbTg4ay5oIGIvaW5jbHVkZS9vcGNvZGUvbTg4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTdmYTAzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL204OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyMyArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgbW90b3JvbGEgODhrIGZhbWlseS4KLSAgIENvcHlyaWdodCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqCQkJRGlzYXNzZW1ibGVyIEluc3RydWN0aW9uIFRhYmxlCi0gKgotICoJVGhlIGZpcnN0IGZpZWxkIG9mIHRoZSB0YWJsZSBpcyB0aGUgb3Bjb2RlIGZpZWxkLiBJZiBhbiBvcGNvZGUKLSAqCWlzIHNwZWNpZmllZCB3aGljaCBoYXMgYW55IG5vbi1vcGNvZGUgYml0cyBvbiwgYSBzeXN0ZW0gZXJyb3IKLSAqCXdpbGwgb2NjdXIgd2hlbiB0aGUgc3lzdGVtIGF0dGVtcHRzIHRoZSBpbnN0YWxsIGl0IGludG8gdGhlCi0gKglpbnN0cnVjdGlvbiB0YWJsZS4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUKLSAqCWluc3RydWN0aW9uIG1uZW1vbmljLiBFYWNoIG9wZXJhbmQgaXMgc3BlY2lmaWVkIGJ5IG9mZnNldCwgd2lkdGgsCi0gKglhbmQgdHlwZS4gVGhlIG9mZnNldCBpcyB0aGUgYml0IG51bWJlciBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKLSAqCWJpdCBvZiB0aGUgb3BlcmFuZCB3aXRoIGJpdCAwIGJlaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YKLSAqCXRoZSBpbnN0cnVjdGlvbi4gVGhlIHdpZHRoIGlzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHNwZWNpZnkKLSAqCXRoZSBvcGVyYW5kLiBUaGUgdHlwZSBzcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKLSAqCXRoZSBvcGVyYW5kLiBUaGUgdmFsaWQgZm9ybWF0cyBhcmU6IHJlZ2lzdGVyLCByZWdpc3RlciBpbmRpcmVjdCwKLSAqCWhleCBjb25zdGFudCwgYW5kIGJpdCBmaWVsZCBzcGVjaWZpY2F0aW9uLiAgVGhlIGxhc3QgZmllbGQgaXMgYQotICoJcG9pbnRlciB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpbiB0aGUgbGlua2VkIGxpc3QuICBUaGVzZSBwb2ludGVycwotICoJYXJlIGluaXRpYWxpemVkIGJ5IGluaXRfZGlzYXNtKCkuCi0gKgotICoJCQkJU3RydWN0dXJlIEZvcm1hdAotICoKLSAqICAgICAgIHN0cnVjdCBJTlNUQUIgewotICogICAgICAgICAgVVBJTlQgb3Bjb2RlOwotICogICAgICAgICAgY2hhciAqbW5lbW9uaWM7Ci0gKiAgICAgICAgICBzdHJ1Y3QgT1BTUEVDIG9wMSxvcDIsb3AzOwotICogICAgICAgICAgc3RydWN0IFNJTV9GTEFHUyBmbGdzOwotICogICAgICAgICAgc3RydWN0IElOU1RBQiAqbmV4dDsKLSAqICAgICAgIH0KLSAqCi0gKiAgICAgICBzdHJ1Y3QgT1BTUEVDIHsKLSAqICAgICAgICAgIFVQSU5UIG9mZnNldDo1OwotICogICAgICAgICAgVVBJTlQgd2lkdGg6NjsKLSAqICAgICAgICAgIFVQSU5UIHR5cGU6NTsKLSAqICAgICAgIH0KLSAqCi0gKgkJCQlSZXZpc2lvbiBIaXN0b3J5Ci0gKgotICoJUmV2aXNpb24gMS4wCTExLzA4Lzg1CUNyZWF0aW9uIGRhdGUKLSAqCQkgMS4xCTAyLzA1Lzg2CVVwZGF0ZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgdGFibGUgTUQKLSAqCQkgMS4yCTA2LzE2Lzg2CVVwZGF0ZWQgU0lNX0ZMQUdTIGZvciBmbG9hdGluZyBwb2ludAotICoJCSAxLjMJMDkvMjAvODYJVXBkYXRlZCBmb3IgbmV3IGVuY29kaW5nCi0gKgkJIAkwNS8xMS84OQlSLiBUcmF3aWNrIGFkYXB0ZWQgZnJvbSBNb3Rvcm9sYSBkaXNhc3NlbWJsZXIKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgbmVlZGVkIHRvIGJ1aWxkIHRoZSBNODgwMDAKLSAqIHNpbXVsYXRvci4gIEl0IGlzIHRoZSBtYWluIGluY2x1ZGUgZmlsZSwgY29udGFpbmluZyBhbGwgdGhlCi0gKiBzdHJ1Y3R1cmVzLCBtYWNyb3MgYW5kIGRlZmluaXRpb25zIGV4Y2VwdCBmb3IgdGhlIGZsb2F0aW5nIHBvaW50Ci0gKiBpbnN0cnVjdGlvbiBzZXQuCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZmxhZyBpbmZvcm1zIHRoZSBTaW11bGF0b3IgYXMgdG8gd2hhdCB0eXBlIG9mIGJ5dGUgb3JkZXJpbmcKLSAqIHdpbGwgYmUgdXNlZC4gRm9yIGluc3RhbmNlLCBhIEJPRkxBRyA9IDEgaW5kaWNhdGVzIGEgREVDIFZBWCBhbmQgSUJNIHR5cGUKLSAqIG9mIG9yZGVyaW5nIHNoYWxsIGJlIHVzZWQuCi0qLwotCi0vKiAjIGRlZmluZSAgICAgQk9GTEFHICAgMSAqLyAgICAgICAgICAgICAgICAgICAgICAgLyogQllURSBPUkRFUklORyBGTEFHICovCi0KLS8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHByaW1hcnkgb3Bjb2RlIGZpZWxkIG9mIHRoZSBpbnN0cnVjdGlvbiwKLSAqIHRoZSBkZXN0aW5hdGlvbiBmaWVsZCwgdGhlIHNvdXJjZSAxIGFuZCBzb3VyY2UgMiBmaWVsZHMuCi0gKi8KLSMgZGVmaW5lICAgIE9QICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIG9wY29kZSBmaWVsZCAqLwotIyBkZWZpbmUgICAgREVTVCAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgZGVzdGluYXRpb24gICovCi0jIGRlZmluZSAgICBTT1VSQ0UxICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzb3VyY2UxICAgICAgKi8KLSMgZGVmaW5lICAgIFNPVVJDRTIgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNvdXJjZTIgICAgICAqLwotCi0jIGRlZmluZSAgICBSRUdzICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAgKi8KLQotIyBkZWZpbmUgICAgV09SRCAgICBsb25nCi0jIGRlZmluZSAgICBGTEFHICAgIHVuc2lnbmVkCi0jIGRlZmluZSAgICBTVEFURSAgIHNob3J0Ci0KLSMgZGVmaW5lICAgIFRSVUUgICAgIDEKLSMgZGVmaW5lICAgIEZBTFNFICAgIDAKLQotIyBkZWZpbmUgICAgUkVBRCAgICAgMAotIyBkZWZpbmUgICAgV1JJVEUgICAgMQotCi0vKiBUaGUgbmV4dCBmb3VyIGVxdWF0ZXMgZGVmaW5lIHRoZSBwcmlvcml0aWVzIHRoYXQgdGhlIHZhcmlvdXMgY2xhc3NlcwotICogb2YgaW5zdHJ1Y3Rpb25zIGhhdmUgcmVnYXJkaW5nIHdyaXRpbmcgcmVzdWx0cyBiYWNrIGludG8gcmVnaXN0ZXJzIGFuZAotICogc2lnbmFsbGluZyBleGNlcHRpb25zLgotICovCi0vKiBQTUVNIGlzIGFsc28gZGVmaW5lZCBpbiA8c3lzL3BhcmFtLmg+IG9uIERlbHRhIDg4J3MuICBTaWdoISAgKi8KLSN1bmRlZiBQTUVNCi0KLSMgZGVmaW5lICAgIFBJTlQgIDAgICAvKiBJbnRlZ2VyIFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBQRkxUICAxICAgLyogRmxvYXRpbmcgUG9pbnQgUHJpb3JpdHkgKi8KLSMgZGVmaW5lICAgIFBNRU0gIDIgICAvKiBNZW1vcnkgUHJpb3JpdHkgKi8KLSMgZGVmaW5lICAgIE5BICAgIDMgICAvKiBOb3QgQXBwbGljYWJsZSwgaW5zdHJ1Y3Rpb24gZG9lc250IHdyaXRlIHRvIHJlZ3MgKi8KLSMgZGVmaW5lICAgIEhJUFJJIDMgICAvKiBoaWdoZXN0IG9mIHRoZXNlIHByaW9yaXRpZXMgKi8KLQotLyogVGhlIGluc3RydWN0aW9uIHJlZ2lzdGVycyBhcmUgYW4gYXJ0aWZpY2lhbCBtZWNoYW5pc20gdG8gc3BlZWQgdXAKLSAqIHNpbXVsYXRvciBleGVjdXRpb24uICBJbiB0aGUgcmVhbCBwcm9jZXNzb3IsIGFuIGluc3RydWN0aW9uIHJlZ2lzdGVyCi0gKiBpcyAzMiBiaXRzIHdpZGUuICBJbiB0aGUgc2ltdWxhdG9yLCB0aGUgMzIgYml0IGluc3RydWN0aW9uIGlzIGtlcHQgaW4KLSAqIGEgc3RydWN0dXJlIGZpZWxkIGNhbGxlZCByYXdvcCwgYW5kIHRoZSBpbnN0cnVjdGlvbiBpcyBwYXJ0aWFsbHkgZGVjb2RlZCwKLSAqIGFuZCBzcGxpdCBpbnRvIHZhcmlvdXMgZmllbGRzIGFuZCBmbGFncyB3aGljaCBtYWtlIHVwIHRoZSBvdGhlciBmaWVsZHMKLSAqIG9mIHRoZSBzdHJ1Y3R1cmUuCi0gKiBUaGUgcGFydGlhbCBkZWNvZGUgaXMgZG9uZSB3aGVuIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGluaXRpYWxseSBsb2FkZWQKLSAqIGludG8gc2ltdWxhdG9yIG1lbW9yeS4gIFRoZSBzaW11bGF0b3IgY29kZSBtZW1vcnkgaXMgbm90IGFuIGFycmF5IG9mCi0gKiAzMiBiaXQgd29yZHMsIGJ1dCBpcyBhbiBhcnJheSBvZiBpbnN0cnVjdGlvbiByZWdpc3RlciBzdHJ1Y3R1cmVzLgotICogWWVzIHRoaXMgd2FzdGVzIG1lbW9yeSwgYnV0IGl0IGV4ZWN1dGVzIG11Y2ggcXVpY2tlci4KLSAqLwotCi1zdHJ1Y3QgSVJfRklFTERTIHsKLQkJICAgIHVuc2lnbmVkICAgICAgICBvcDpPUCwKLQkJCQkgICAgZGVzdDogREVTVCwKLQkJCQkgICAgc3JjMTogU09VUkNFMSwKLQkJCQkgICAgc3JjMjogU09VUkNFMjsKLQkJCSAgICAgIGludCAgIGx0bmN5LAotCQkJCSAgICBleHRpbWUsCi0JCQkJICAgIHdiX3ByaTsgICAgIC8qIHdyaXRlYmFjayBwcmlvcml0eSAgICAgKi8KLQkJICAgIHVuc2lnbmVkICAgICAgICBpbW1fZmxhZ3M6MiwvKiBpbW1lZGlhdGUgc2l6ZSAgICAgICAgICovCi0JCQkJICAgIHJzMV91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZSAxIHVzZWQgKi8KLQkJCQkgICAgcnMyX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlIDIgdXNlZCAqLwotCQkJCSAgICByc2RfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UvZGVzdC4gdXNlZCAqLwotCQkJCSAgICBjX2ZsYWc6MSwgICAvKiBjb21wbGVtZW50ICAgICAgKi8KLQkJCQkgICAgdV9mbGFnOjEsICAgLyogdXBwZXIgaGFsZiB3b3JkICovCi0JCQkJICAgIG5fZmxhZzoxLCAgIC8qIGV4ZWN1dGUgbmV4dCAgICAqLwotCQkJCSAgICB3Yl9mbGFnOjEsICAvKiB1c2VzIHdyaXRlYmFjayBzbG90ICovCi0JCQkJICAgIGRlc3RfNjQ6MSwgIC8qIGRlc3Qgc2l6ZSAgICAgICAqLwotCQkJCSAgICBzMV82NDoxLCAgICAvKiBzb3VyY2UgMSBzaXplICAgKi8KLQkJCQkgICAgczJfNjQ6MSwgICAgLyogc291cmNlIDIgc2l6ZSAgICovCi0JCQkJICAgIHNjYWxlX2ZsYWc6MSwgLyogc2NhbGVkIHJlZ2lzdGVyICovCi0JCQkJICAgIGJya19mbGc6MTsKLSAgICAgICAgICAgICAgICAgfTsKLQotc3RydWN0CW1lbV9zZWdzIHsKLQlzdHJ1Y3QgbWVtX3dyZCAqc2VnOwkJCS8qIHBvaW50ZXIgKHJldHVybmVkIGJ5IGNhbGxvYykgdG8gc2VnbWVudCAqLwotCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7CQkJLyogYmFzZSBsb2FkIGFkZHJlc3MgZnJvbSBmaWxlIGhlYWRlcnMgKi8KLQl1bnNpZ25lZCBsb25nIGVuZGFkZHI7CQkJLyogRW5kaW5nIGFkZHJlc3Mgb2Ygc2VnbWVudCAqLwotCWludAkgICAgICBmbGFnczsJCQkvKiBzZWdtZW50IGNvbnRyb2wgZmxhZ3MgKG5vbmUgZGVmaW5lZCAxMi81Lzg2KSAqLwotfTsKLQotI2RlZmluZQlNQVhTRUdTCQkoMTApCQkJLyogbWF4IG51bWJlciBvZiBzZWdtZW50IGFsbG93ZWQgKi8KLSNkZWZpbmUJTUVNU0VHU0laRQkoc2l6ZW9mKHN0cnVjdCBtZW1fc2VncykpLyogc2l6ZSBvZiBtZW1fc2VncyBzdHJ1Y3R1cmUgKi8KLQotCi0jZGVmaW5lIEJSS19SRAkJKDB4MDEpCQkJLyogYnJlYWsgb24gbWVtb3J5IHJlYWQgKi8KLSNkZWZpbmUgQlJLX1dSCQkoMHgwMikJCQkvKiBicmVhayBvbiBtZW1vcnkgd3JpdGUgKi8KLSNkZWZpbmUgQlJLX0VYRUMJKDB4MDQpCQkJLyogYnJlYWsgb24gZXhlY3V0aW9uICovCi0jZGVmaW5lCUJSS19DTlQJCSgweDA4KQkJCS8qIGJyZWFrIG9uIHRlcm1pbmFsIGNvdW50ICovCi0KLQotc3RydWN0CW1lbV93cmQgewotCXN0cnVjdCBJUl9GSUVMRFMgb3Bjb2RlOwkJLyogc2ltdWxhdG9yIGluc3RydWN0aW9uIGJyZWFrIGRvd24gKi8KLQl1bmlvbiB7Ci0JCXVuc2lnbmVkIGxvbmcgIGw7CQkvKiBtZW1vcnkgZWxlbWVudCBicmVhayBkb3duICovCi0JCXVuc2lnbmVkIHNob3J0IHNbMl07Ci0JCXVuc2lnbmVkIGNoYXIgIGNbNF07Ci0JfSBtZW07Ci19OwotCi0jZGVmaW5lCU1FTVdSRFNJWkUJKHNpemVvZihzdHJ1Y3QgbWVtX3dyZCkpCS8qIHNpemUgb2YgZWFjaCAzMiBiaXQgbWVtb3J5IG1vZGVsICovCi0KLS8qIEV4dGVybmFsIGRlY2xhcmF0aW9ucyAqLwotCi1leHRlcm4Jc3RydWN0IG1lbV9zZWdzIG1lbW9yeVtdOwotZXh0ZXJuCXN0cnVjdCBQUk9DRVNTT1IgbTc4MDAwOwotCi1zdHJ1Y3QgIFBST0NFU1NPUiAgIHsKLQkgICAgIHVuc2lnbmVkIFdPUkQKLQkJCSAgICBpcCwgICAgICAgICAgLyogZXhlY3V0ZSBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0JCQkgICAgdmJyLCAgICAgICAgIC8qIHZlY3RvciBiYXNlIHJlZ2lzdGVyICovCi0JCQkgICAgcHNyOyAgICAgICAgIC8qIHByb2Nlc3NvciBzdGF0dXMgcmVnaXN0ZXIgKi8KLQotCQkgICAgV09SRCAgICBTMWJ1cywgLyogc291cmNlIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTMmJ1cywgLyogc291cmNlIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYnVzLCAgLyogZGVzdGluYXRpb24gKi8KLQkJCSAgICBEQWJ1cywgLyogZGF0YSBhZGRyZXNzIGJ1cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMVSwKLQkJCSAgICBSZWdzW1JFR3NdLCAgICAgICAvKiBkYXRhIHJlZ2lzdGVycyAqLwotCQkJICAgIHRpbWVfbGVmdFtSRUdzXSwgIC8qIG1heCBjbG9ja3MgYmVmb3JlIHJlZyBpcyBhdmFpbGFibGUgKi8KLQkJCSAgICB3Yl9wcmlbUkVHc10sICAgICAvKiB3cml0ZWJhY2sgcHJpb3JpdHkgb2YgcmVnICovCi0JCQkgICAgU0ZVMF9yZWdzW1JFR3NdLCAgLyogaW50ZWdlciB1bml0IGNvbnRyb2wgcmVncyAqLwotCQkJICAgIFNGVTFfcmVnc1tSRUdzXSwgIC8qIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVncyAqLwotCQkJICAgIFNjb3JlYm9hcmRbUkVHc10sCi0JCQkgICAgVmJyOwotCSAgICB1bnNpZ25lZCBXT1JEICAgc2NvcmVib2FyZCwKLQkJCSAgICBQc3csCi0JCQkgICAgVHBzdzsKLQkJICAgIEZMQUcgICBqdW1wX3BlbmRpbmc6MTsgICAvKiB3YWl0aW5nIGZvciBhIGp1bXAgaW5zdHIuICovCi0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSMgZGVmaW5lICAgIGkyNmJpdCAgICAgIDEgICAgLyogc2l6ZSBvZiBpbW1lZGlhdGUgZmllbGQgKi8KLSMgZGVmaW5lICAgIGkxNmJpdCAgICAgIDIKLSMgZGVmaW5lICAgIGkxMGJpdCAgICAgIDMKLQotLyogRGVmaW5pdGlvbnMgZm9yIGZpZWxkcyBpbiBwc3IgKi8KLQotIyBkZWZpbmUgbW9kZSAgMzEKLSMgZGVmaW5lIHJibyAgIDMwCi0jIGRlZmluZSBzZXIgICAyOQotIyBkZWZpbmUgY2FycnkgMjgKLSMgZGVmaW5lIHNmN20gIDExCi0jIGRlZmluZSBzZjZtICAxMAotIyBkZWZpbmUgc2Y1bSAgIDkKLSMgZGVmaW5lIHNmNG0gICA4Ci0jIGRlZmluZSBzZjNtICAgNwotIyBkZWZpbmUgc2YybSAgIDYKLSMgZGVmaW5lIHNmMW0gICA1Ci0jIGRlZmluZSBtYW0gICAgNAotIyBkZWZpbmUgaW5tICAgIDMKLSMgZGVmaW5lIGV4bSAgICAyCi0jIGRlZmluZSB0cm0gICAgMQotIyBkZWZpbmUgb3ZmbSAgIDAKLQotI2RlZmluZQkgICAgTU9ERU1BU0sgICAoMTw8KG1vZGUtMSkpCi0jIGRlZmluZSAgICBTSUxFTlQgICAgIDAgICAvKiBzaW11bGF0ZSB3aXRob3V0IG91dHB1dCB0byBjcnQgKi8KLSMgZGVmaW5lICAgIFZFUkJPU0UgICAgMSAgIC8qIHNpbXVsYXRlIGluIHZlcmJvc2UgbW9kZSAqLwotIyBkZWZpbmUgICAgUFJfSU5TVFIgICAyICAgLyogb25seSBwcmludCBpbnN0cnVjdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgUkVTRVQgICAgICAxNiAvKiByZXNldCBwaGFzZSAqLwotCi0jIGRlZmluZSAgICBQSEFTRTEgICAgIDAgIC8qIGRhdGEgcGF0aCBwaGFzZXMgKi8KLSMgZGVmaW5lICAgIFBIQVNFMiAgICAgMQotCi0vKiB0aGUgMSBjbG9jayBvcGVyYXRpb25zICovCi0KLSMgZGVmaW5lICAgIEFERFUgICAgICAgIDEKLSMgZGVmaW5lICAgIEFEREMgICAgICAgIDIKLSMgZGVmaW5lICAgIEFERFVDICAgICAgIDMKLSMgZGVmaW5lICAgIEFERCAgICAgICAgIDQKLQotIyBkZWZpbmUgICAgU1VCVSAgICBBREQrMQotIyBkZWZpbmUgICAgU1VCQiAgICBBREQrMgotIyBkZWZpbmUgICAgU1VCVUIgICBBREQrMwotIyBkZWZpbmUgICAgU1VCICAgICBBREQrNAotCi0jIGRlZmluZSAgICBBTkRfICAgIEFERCs1Ci0jIGRlZmluZSAgICBPUiAgICAgIEFERCs2Ci0jIGRlZmluZSAgICBYT1IgICAgIEFERCs3Ci0jIGRlZmluZSAgICBDTVAgICAgIEFERCs4Ci0KLS8qIHRoZSBMT0FEUyAqLwotCi0jIGRlZmluZSAgICBMREFCICAgIENNUCsxCi0jIGRlZmluZSAgICBMREFIICAgIENNUCsyCi0jIGRlZmluZSAgICBMREEgICAgIENNUCszCi0jIGRlZmluZSAgICBMREFEICAgIENNUCs0Ci0KLSMgZGVmaW5lICAgIExEQiAgIExEQUQrMQotIyBkZWZpbmUgICAgTERIICAgTERBRCsyCi0jIGRlZmluZSAgICBMRCAgICBMREFEKzMKLSMgZGVmaW5lICAgIExERCAgIExEQUQrNAotIyBkZWZpbmUgICAgTERCVSAgTERBRCs1Ci0jIGRlZmluZSAgICBMREhVICBMREFEKzYKLQotLyogdGhlIFNUT1JFUyAqLwotCi0jIGRlZmluZSAgICBTVEIgICAgTERIVSsxCi0jIGRlZmluZSAgICBTVEggICAgTERIVSsyCi0jIGRlZmluZSAgICBTVCAgICAgTERIVSszCi0jIGRlZmluZSAgICBTVEQgICAgTERIVSs0Ci0KLS8qIHRoZSBleGNoYW5nZSAqLwotCi0jIGRlZmluZSAgICBYTUVNQlUgTERIVSs1Ci0jIGRlZmluZSAgICBYTUVNICAgTERIVSs2Ci0KLS8qIHRoZSBicmFuY2hlcyAqLwotIyBkZWZpbmUgICAgSlNSICAgIFNURCsxCi0jIGRlZmluZSAgICBCU1IgICAgU1REKzIKLSMgZGVmaW5lICAgIEJSICAgICBTVEQrMwotIyBkZWZpbmUgICAgSk1QICAgIFNURCs0Ci0jIGRlZmluZSAgICBCQjEgICAgU1REKzUKLSMgZGVmaW5lICAgIEJCMCAgICBTVEQrNgotIyBkZWZpbmUgICAgUlROICAgIFNURCs3Ci0jIGRlZmluZSAgICBCQ05EICAgU1REKzgKLQotLyogdGhlIFRSQVBTICovCi0jIGRlZmluZSAgICBUQjEgICAgQkNORCsxCi0jIGRlZmluZSAgICBUQjAgICAgQkNORCsyCi0jIGRlZmluZSAgICBUQ05EICAgQkNORCszCi0jIGRlZmluZSAgICBSVEUgICAgQkNORCs0Ci0jIGRlZmluZSAgICBUQk5EICAgQkNORCs1Ci0KLS8qIHRoZSBNSVNDIGluc3RydWN0aW9ucyAqLwotIyBkZWZpbmUgICAgTVVMICAgICBUQk5EICsgMQotIyBkZWZpbmUgICAgRElWICAgICBNVUwgICsyCi0jIGRlZmluZSAgICBESVZVICAgIE1VTCAgKzMKLSMgZGVmaW5lICAgIE1BU0sgICAgTVVMICArNAotIyBkZWZpbmUgICAgRkYwICAgICBNVUwgICs1Ci0jIGRlZmluZSAgICBGRjEgICAgIE1VTCAgKzYKLSMgZGVmaW5lICAgIENMUiAgICAgTVVMICArNwotIyBkZWZpbmUgICAgU0VUICAgICBNVUwgICs4Ci0jIGRlZmluZSAgICBFWFQgICAgIE1VTCAgKzkKLSMgZGVmaW5lICAgIEVYVFUgICAgTVVMICArMTAKLSMgZGVmaW5lICAgIE1BSyAgICAgTVVMICArMTEKLSMgZGVmaW5lICAgIFJPVCAgICAgTVVMICArMTIKLQotLyogY29udHJvbCByZWdpc3RlciBtYW5pcHVsYXRpb25zICovCi0KLSMgZGVmaW5lICAgIExEQ1IgICAgUk9UICArMQotIyBkZWZpbmUgICAgU1RDUiAgICBST1QgICsyCi0jIGRlZmluZSAgICBYQ1IgICAgIFJPVCAgKzMKLQotIyBkZWZpbmUgICAgRkxEQ1IgICAgUk9UICArNAotIyBkZWZpbmUgICAgRlNUQ1IgICAgUk9UICArNQotIyBkZWZpbmUgICAgRlhDUiAgICAgUk9UICArNgotCi0KLSMgZGVmaW5lICAgIE5PUCAgICAgWENSICsxCi0KLS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotCi0jIGRlZmluZSAgICBGQUREICAgIE5PUCArMQotIyBkZWZpbmUgICAgRlNVQiAgICBOT1AgKzIKLSMgZGVmaW5lICAgIEZNVUwgICAgTk9QICszCi0jIGRlZmluZSAgICBGRElWICAgIE5PUCArNAotIyBkZWZpbmUgICAgRlNRUlQgICBOT1AgKzUKLSMgZGVmaW5lICAgIEZDTVAgICAgTk9QICs2Ci0jIGRlZmluZSAgICBGSVAgICAgIE5PUCArNwotIyBkZWZpbmUgICAgRkxUICAgICBOT1AgKzgKLSMgZGVmaW5lICAgIElOVCAgICAgTk9QICs5Ci0jIGRlZmluZSAgICBOSU5UICAgIE5PUCArMTAKLSMgZGVmaW5lICAgIFRSTkMgICAgTk9QICsxMQotIyBkZWZpbmUgICAgRkxEQyAgIE5PUCArMTIKLSMgZGVmaW5lICAgIEZTVEMgICBOT1AgKzEzCi0jIGRlZmluZSAgICBGWEMgICAgTk9QICsxNAotCi0jIGRlZmluZSBVRVhUKHNyYyxvZmYsd2lkKSAoKCgodW5zaWduZWQgaW50KShzcmMpKT4+KG9mZikpICYgKCgxPDwod2lkKSkgLSAxKSkKLSMgZGVmaW5lIFNFWFQoc3JjLG9mZix3aWQpICgoKCgoaW50KShzcmMpKTw8KDMyLSgob2ZmKSsod2lkKSkpKSA+PigzMi0od2lkKSkpICkKLSMgZGVmaW5lIE1BS0Uoc3JjLG9mZix3aWQpIFwKLSAgKCgoKHVuc2lnbmVkIGludCkoc3JjKSkgJiAoKDE8PCh3aWQpKSAtIDEpKSA8PCAob2ZmKSkKLQotIyBkZWZpbmUgb3B3b3JkKG4pICh1bnNpZ25lZCBsb25nKSAobWVtYWRkci0+bWVtLmwpCi0KLS8qICBDb25zdGFudHMgYW5kIE1hc2tzICovCi0KLSNkZWZpbmUgU0ZVMCAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIFNGVTEgICAgICAgMHg4NDAwMDAwMAotI2RlZmluZSBTRlU3ICAgICAgIDB4OWMwMDAwMDAKLSNkZWZpbmUgUlJJMTAgICAgICAweGYwMDAwMDAwCi0jZGVmaW5lIFJSUiAgICAgICAgMHhmNDAwMDAwMAotI2RlZmluZSBTRlVNQVNLICAgIDB4ZmMwMGZmZTAKLSNkZWZpbmUgUlJSTUFTSyAgICAweGZjMDBmZmUwCi0jZGVmaW5lIFJSSTEwTUFTSyAgMHhmYzAwZmMwMAotI2RlZmluZSBERUZNQVNLICAgIDB4ZmMwMDAwMDAKLSNkZWZpbmUgQ1RSTCAgICAgICAweDAwMDBmMDAwCi0jZGVmaW5lIENUUkxNQVNLICAgMHhmYzAwZjgwMAotCi0vKiBPcGVyYW5kcyB0eXBlcyAqLwotCi1lbnVtIG9wZXJhbmRfdHlwZSB7Ci0gIEhFWCA9IDEsCi0gIFJFRyA9IDIsCi0gIENPTlQgPSAzLAotICBJTkQgPSAzLAotICBCRiA9IDQsCi0gIFJFR1NDID0gNSAgICAvKiBzY2FsZWQgcmVnaXN0ZXIgKi8sCi0gIENSUkVHID0gNiAgICAvKiBjb250cm9sIHJlZ2lzdGVyICovLAotICBGQ1JSRUcgPSA3ICAgIC8qIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIgKi8sCi0gIFBDUkVMID0gOCwKLSAgQ09ORE1BU0sgPSA5LAotICBYUkVHID0gMTAsIC8qIGV4dGVuZGVkIHJlZ2lzdGVyICovCi0gIERFQyA9IDExLCAvKiBkZWNpbWFsICovCi19OwotCi0vKiBIYXNoaW5nIFNwZWNpZmljYXRpb24gKi8KLQotI2RlZmluZSBIQVNIVkFMICAgICA3OQotCi0vKiBUeXBlIGRlZmluaXRpb25zICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ7Ci0KLS8qIFN0cnVjdHVyZSB0ZW1wbGF0ZXMgKi8KLQotI2lmIG5ldmVyCi10eXBlZGVmIHN0cnVjdCB7Ci0gICB1bnNpZ25lZCBpbnQgb2Zmc2V0OjU7Ci0gICB1bnNpZ25lZCBpbnQgd2lkdGg6NjsKLSAgIHVuc2lnbmVkIGludCB0eXBlOjU7Ci19IE9QU1BFQzsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICAgdW5zaWduZWQgaW50IHdpZHRoOwotICAgZW51bSBvcGVyYW5kX3R5cGUgdHlwZTsKLX0gT1BTUEVDOwotCi0Jc3RydWN0IFNJTV9GTEFHUyB7Ci0JICAgICAgaW50ICBsdG5jeSwgICAvKiBsYXRlbmN5IChtYXggbnVtYmVyIG9mIGNsb2NrcyBuZWVkZWQgdG8gZXhlY3V0ZSkgKi8KLQkJICBleHRpbWUsICAgLyogZXhlY3V0aW9uIHRpbWUgKG1pbiBudW1iZXIgb2YgY2xvY2tzIG5lZWRlZCB0byBleGVjdXRlKSAqLwotCQkgIHdiX3ByaTsgICAvKiB3cml0ZWJhY2sgc2xvdCBwcmlvcml0eSAqLwotICAgdW5zaWduZWQgICAgICAgICBvcDpPUCwgICAvKiBzaW11bGF0b3IgdmVyc2lvbiBvZiBvcGNvZGUgKi8KLQkgICAgIGltbV9mbGFnczoyLCAgIC8qIDEwLDE2IG9yIDI2IGJpdCBpbW1lZGlhdGUgZmxhZ3MgKi8KLQkgICAgICByczFfdXNlZDoxLCAgIC8qIHJlZ2lzdGVyIHNvdXJjZSAxIHVzZWQgKi8KLQkgICAgICByczJfdXNlZDoxLCAgIC8qIHJlZ2lzdGVyIHNvdXJjZSAyIHVzZWQgKi8KLQkgICAgICByc2RfdXNlZDoxLCAgIC8qIHJlZ2lzdGVyIHNvdXJjZS9kZXN0IHVzZWQgKi8KLQkJY19mbGFnOjEsICAgLyogY29tcGxlbWVudCAqLwotCQl1X2ZsYWc6MSwgICAvKiB1cHBlciBoYWxmIHdvcmQgKi8KLQkJbl9mbGFnOjEsICAgLyogZXhlY3V0ZSBuZXh0ICovCi0JICAgICAgIHdiX2ZsYWc6MSwgICAvKiB1c2VzIHdyaXRlYmFjayBzbG90ICovCi0JICAgICAgIGRlc3RfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIGRlc3QgKi8KLQkJIHMxXzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBzb3VyY2UgMSAqLwotCQkgczJfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIHNvdXJjZSAyICovCi0JICAgIHNjYWxlX2ZsYWc6MTsgICAvKiByZWdpc3RlciBpcyBzY2FsZWQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IElOU1RSVUNUQUIgewotICAgdW5zaWduZWQgaW50ICBvcGNvZGU7Ci0gICBjaGFyICAgICAgICAgICptbmVtb25pYzsKLSAgIE9QU1BFQyAgICAgICAgb3AxLG9wMixvcDM7Ci0gICBzdHJ1Y3QgU0lNX0ZMQUdTIGZsZ3M7Ci0gICBzdHJ1Y3QgSU5TVFJVQ1RBQiAgICAqbmV4dDsKLX0gSU5TVEFCOwotDAotCi0jZGVmaW5lIE5PX09QRVJBTkQgezAsMCwwfQotCi0vKiBPcGNvZGUgICAgIE1uZW1vbmljICAgICAgIE9wIDEgU3BlYyAgICAgT3AgMiBTcGVjICAgIE9wIDMgU3BlYyAgICAgICAgIFNpbWZsYWdzICAgICAgICAgICAgIE5leHQgICovCi0KLXN0YXRpYyBJTlNUQUIgIGluc3RydWN0aW9uc1tdID0gewotICB7MHhmNDAwYzgwMCwianNyICAgICAgICAgIix7MCw1LFJFR30gICAsTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLEpTUiAsICAgICAgICAgIDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwY2MwMCwianNyLm4gICAgICAgIix7MCw1LFJFR30gICAsTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MSwxLE5BLEpTUiAsICAgICAgICAgIDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwYzAwMCwiam1wICAgICAgICAgIix7MCw1LFJFR30gICAsTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLEpNUCAsICAgICAgICAgIDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwYzQwMCwiam1wLm4gICAgICAgIix7MCw1LFJFR30gICAsTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MSwxLE5BLEpNUCAsICAgICAgICAgIDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhjODAwMDAwMCwiYnNyICAgICAgICAgIix7MCwyNixQQ1JFTH0sTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLEJTUiAsICAgICBpMjZiaXQsMCwwLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhjYzAwMDAwMCwiYnNyLm4gICAgICAgIix7MCwyNixQQ1JFTH0sTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MSwxLE5BLEJTUiAsICAgICBpMjZiaXQsMCwwLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhjMDAwMDAwMCwiYnIgICAgICAgICAgIix7MCwyNixQQ1JFTH0sTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLEJSICAsICAgICBpMjZiaXQsMCwwLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhjNDAwMDAwMCwiYnIubiAgICAgICAgIix7MCwyNixQQ1JFTH0sTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MSwxLE5BLEJSICAsICAgICBpMjZiaXQsMCwwLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhkMDAwMDAwMCwiYmIwICAgICAgICAgIix7MjEsNSxIRVh9ICAsezE2LDUsUkVHfSAgICx7MCwxNixQQ1JFTH0sezIsMixOQSxCQjAsICAgICBpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhkNDAwMDAwMCwiYmIwLm4gICAgICAgIix7MjEsNSxIRVh9ICAsezE2LDUsUkVHfSAgICx7MCwxNixQQ1JFTH0sezEsMSxOQSxCQjAsICAgICBpMTZiaXQsMCwxLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhkODAwMDAwMCwiYmIxICAgICAgICAgIix7MjEsNSxIRVh9LHsxNiw1LFJFR30gICAgICx7MCwxNixQQ1JFTH0sezIsMixOQSxCQjEsICAgICBpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhkYzAwMDAwMCwiYmIxLm4gICAgICAgIix7MjEsNSxIRVh9LHsxNiw1LFJFR30gICAgICx7MCwxNixQQ1JFTH0sezEsMSxOQSxCQjEsICAgICBpMTZiaXQsMCwxLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwZDAwMCwidGIwICAgICAgICAgIix7MjEsNSxIRVh9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxIRVh9LCB7MiwyLE5BLFRCMCAsICAgICBpMTBiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwZDgwMCwidGIxICAgICAgICAgIix7MjEsNSxIRVh9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxIRVh9LCB7MiwyLE5BLFRCMSAsICAgICBpMTBiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhlODAwMDAwMCwiYmNuZCAgICAgICAgIix7MjEsNSxDT05ETUFTS30sezE2LDUsUkVHfSx7MCwxNixQQ1JFTH0sezIsMixOQSxCQ05ELCAgICBpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhlYzAwMDAwMCwiYmNuZC5uICAgICAgIix7MjEsNSxDT05ETUFTS30sezE2LDUsUkVHfSx7MCwxNixQQ1JFTH0sezEsMSxOQSxCQ05ELCAgICBpMTZiaXQsMCwxLDAsMCwwLDEsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwZTgwMCwidGNuZCAgICAgICAgIix7MjEsNSxDT05ETUFTS30sezE2LDUsUkVHfSx7MCwxMCxIRVh9LCB7MiwyLE5BLFRDTkQsICAgICBpMTBiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmODAwMDAwMCwidGJuZCAgICAgICAgIix7MTYsNSxSRUd9ICAsezAsMTYsSEVYfSAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLFRCTkQsICAgICBpMTBiaXQsMSwwLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwZjgwMCwidGJuZCAgICAgICAgIix7MTYsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLFRCTkQsICAgICAgICAgIDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwZmMwMCwicnRlICAgICAgICAgIixOT19PUEVSQU5EICAgICAsTk9fT1BFUkFORCAgICAgICxOT19PUEVSQU5EICAgLCB7MiwyLE5BLFJURSAsICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgxYzAwMDAwMCwibGQuYiAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTERCICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMWMwMCwibGQuYiAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTERCICAgICAsICAgIDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgwYzAwMDAwMCwibGQuYnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTERCVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMGMwMCwibGQuYnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTERCVSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgxODAwMDAwMCwibGQuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTERIICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTgwMCwibGQuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTERIICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMWEwMCwibGQuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sTERIICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHgwODAwMDAwMCwibGQuaHUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTERIVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMDgwMCwibGQuaHUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTERIVSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMGEwMCwibGQuaHUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sTERIVSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHgxNDAwMDAwMCwibGQgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTEQgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTQwMCwibGQgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTEQgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTYwMCwibGQgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sTEQgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHgxMDAwMDAwMCwibGQuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sTEREICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTAwMCwibGQuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTEREICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTIwMCwibGQuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sTEREICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHhmNDAwMTUwMCwibGQudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sTEQgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMTcwMCwibGQudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sTEQgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHgyYzAwMDAwMCwic3QuYiAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNUQiAgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmMwMCwic3QuYiAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUQiAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgyODAwMDAwMCwic3QuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNUSCAgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjgwMCwic3QuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUSCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmEwMCwic3QuaCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNUSCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSwgTlVMTCB9LAotICB7MHgyNDAwMDAwMCwic3QgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNUICAgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMSwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjQwMCwic3QgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNjAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4MjAwMDAwMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEQgICAgICAsaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjAwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNURCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyMjAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1REICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI1MDAsInN0LnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjcwMCwic3QudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0vKiAgbTg4MTAwIG9ubHk6Ci0gIHsweDAwMDAwMDAwLCJ4bWVtLmJ1ICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxYTUVNQlUgLGkxNmJpdCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAqLwotICB7MHhmNDAwMDAwMCwieG1lbS5idSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0vKiAgbTg4MTAwIG9ubHk6Ci0gIHsweDA0MDAwMDAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxYTUVNICAgLGkxNmJpdCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAqLwotICB7MHhmNDAwMDQwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNjAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA1MDAsInhtZW0udXNyICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMDcwMCwieG1lbS51c3IgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0vKiBtODgxMDAgb25seToKLSAgezB4ZjQwMDNlMDAsImxkYS5iICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAzZTAwLCJsZGEueCAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDNhMDAsImxkYS5oICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMzYwMCwibGRhICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzMjAwLCJsZGEuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFELCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLQotICB7MHg4MDAwNDAwMCwibGRjciAgICAgICAgIix7MjEsNSxSRUd9ICAsezUsNixDUlJFR30gICxOT19PUEVSQU5EICAgICx7MSwxLFBJTlQsTERDUiwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDA4MDAwLCJzdGNyICAgICAgICAiLHsxNiw1LFJFR30gICx7NSw2LENSUkVHfSAgLE5PX09QRVJBTkQgICAgLHsxLDEsUElOVCxTVENSLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMGMwMDAsInhjciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezUsNixDUlJFR30sezEsMSxQSU5ULFhDUiwgICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweGY0MDA2MDAwLCJhZGR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYyMDAsImFkZHUuY2kgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjEwMCwiYWRkdS5jbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MzAwLCJhZGR1LmNpbyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY0MDAsInN1YnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjYwMCwic3VidS5jaSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NTAwLCJzdWJ1LmNvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY3MDAsInN1YnUuY2lvICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjgwMCwiZGl2dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzIsMzIsUElOVCxESVZVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY5MDAsImRpdnUuZCAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfSwgTlVMTCB9LAotICB7MHhmNDAwNmUwMCwibXVscyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9LCBOVUxMIH0sCi0gIHsweGY0MDA2YzAwLCJtdWx1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDQsUElOVCxNVUwsICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcwMDAsImFkZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzIwMCwiYWRkLmNpICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MTAwLCJhZGQuY28gICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDczMDAsImFkZC5jaW8gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzQwMCwic3ViICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NjAwLCJzdWIuY2kgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc1MDAsInN1Yi5jbyAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzcwMCwic3ViLmNpbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3ODAwLCJkaXZzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMiwzMixQSU5ULERJViAsICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDdjMDAsImNtcCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULENNUCwgICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDYwMDAwMDAwLCJhZGR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBRERVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NjQwMDAwMDAsInN1YnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFNVQlUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDY4MDAwMDAwLCJkaXZ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszMiwzMixQSU5ULERJVlUsIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NmMwMDAwMDAsIm11bHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezQsMSxQSU5ULE1VTCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3MDAwMDAwMCwiYWRkICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQURELCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDc0MDAwMDAwLCJzdWIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxTVUIsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzgwMDAwMDAsImRpdnMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMyLDMyLFBJTlQsRElWLCAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3YzAwMDAwMCwiY21wICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQ01QLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ZjQwMDQwMDAsImFuZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFORF8gICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNDQwMCwiYW5kLmMgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQU5EXyAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1ODAwLCJvciAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxPUiAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDVjMDAsIm9yLmMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE9SICAgICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTAwMCwieG9yICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsWE9SICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1NDAwLCJ4b3IuYyAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxYT1IgICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NDAwMDAwMDAsImFuZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFORF8gICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0NDAwMDAwMCwiYW5kLnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQU5EXyAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDU4MDAwMDAwLCJvciAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxPUiAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NWMwMDAwMDAsIm9yLnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE9SICAgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1MDAwMDAwMCwieG9yICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsWE9SICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDU0MDAwMDAwLCJ4b3IudSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxYT1IgICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NDgwMDAwMDAsIm1hc2sgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE1BU0sgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0YzAwMDAwMCwibWFzay51ICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsTUFTSyAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBlYzAwLCJmZjAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsxLDEsUElOVCxGRjAgICAgICAgICAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGU4MDAsImZmMSAgICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezEsMSxQSU5ULEZGMSAgICAgICAgICwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwODAwMCwiY2xyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsQ0xSICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA4ODAwLCJzZXQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxTRVQgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDkwMDAsImV4dCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULEVYVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwOTgwMCwiZXh0dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsRVhUVSAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDBhMDAwLCJtYWsgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxNQUsgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMGE4MDAsInJvdCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULFJPVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwODAwMCwiY2xyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQ0xSICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA4ODAwLCJzZXQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTRVQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDkwMDAsImV4dCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEVYVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwOTgwMCwiZXh0dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsRVhUVSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBhMDAwLCJtYWsgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxNQUsgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGE4MDAsInJvdCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFJPVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDg0MDAyODAwLCJmYWRkLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDI4ODAsImZhZGQuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmEwMCwiZmFkZC5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYTgwLCJmYWRkLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDI4MjAsImZhZGQuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjhhMCwiZmFkZC5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYTIwLCJmYWRkLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhYTAsImZhZGQuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzAwMCwiZnN1Yi5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMDgwLCJmc3ViLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyMDAsImZzdWIuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzI4MCwiZnN1Yi5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMDIwLCJmc3ViLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwYTAsImZzdWIuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzIyMCwiZnN1Yi5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMmEwLCJmc3ViLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwMDAsImZtdWwuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDA4MCwiZm11bC5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjAwLCJmbXVsLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyODAsImZtdWwuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDAyMCwiZm11bC5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMGEwLCJmbXVsLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyMjAsImZtdWwuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDJhMCwiZm11bC5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDAwLCJmZGl2LnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMCwzMCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwODAsImZkaXYuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzIwMCwiZmRpdi5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MjgwLCJmZGl2LnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwMjAsImZkaXYuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzBhMCwiZmRpdi5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MjIwLCJmZGl2LmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyYTAsImZkaXYuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzgwMCwiZnNxcnQuc3MgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODIwLCJmc3FydC5zZCAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4ODAsImZzcXJ0LmRzICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzhhMCwiZnNxcnQuZGQgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzODAwLCJmY21wLnNzICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDM4ODAsImZjbXAuc2QgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwM2EwMCwiZmNtcC5kcyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzYTgwLCJmY21wLmRkICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDIwMDAsImZsdC5zICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjAyMCwiZmx0LmQgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA0ODAwLCJpbnQucyAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDQ4ODAsImludC5kICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTAwMCwibmludC5zICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1MDgwLCJuaW50LmQgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDU4MDAsInRybmMucyAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULFRSTkMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTg4MCwidHJuYy5kICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsVFJOQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ODAwMDQ4MDAsImZsZGNyICAgICAgICIsezIxLDUsUkVHfSAgLHs1LDYsRkNSUkVHfSAsTk9fT1BFUkFORCAgICwgezEsMSxQRkxULEZMREMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwODgwMCwiZnN0Y3IgICAgICAgIix7MTYsNSxSRUd9ICAsezUsNixGQ1JSRUd9ICxOT19PUEVSQU5EICAgLCB7MSwxLFBGTFQsRlNUQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDBjODAwLCJmeGNyICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHs1LDYsRkNSUkVHfSAsIHsxLDEsUEZMVCxGWEMgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgbmV3IGZvciB0aGUgODgxMTAuICovCi0KLSAgezB4ODQwMGFhYTAsImZhZGQuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTgwLCJmYWRkLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWFjMCwiZmFkZC5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhMjAsImZhZGQuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTAwLCJmYWRkLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWE0MCwiZmFkZC5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiMjAsImZhZGQuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjAwLCJmYWRkLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWI0MCwiZmFkZC5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4YTAsImZhZGQuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODgwLCJmYWRkLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYThjMCwiZmFkZC5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4MjAsImZhZGQuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODAwLCJmYWRkLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTg0MCwiZmFkZC5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5MjAsImZhZGQuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTAwLCJmYWRkLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTk0MCwiZmFkZC5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjYTAsImZhZGQueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzgwLCJmYWRkLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWNjMCwiZmFkZC54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjMjAsImZhZGQueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzAwLCJmYWRkLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWM0MCwiZmFkZC54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkMjAsImZhZGQueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDAwLCJmYWRkLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQ0MCwiZmFkZC54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYmE4MCwiZmNtcC5zZGQgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmEwMCwiZmNtcC5zZHMgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmIwMCwiZmNtcC5zZHggICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjg4MCwiZmNtcC5zc2QgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjgwMCwiZmNtcC5zc3MgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjkwMCwiZmNtcC5zc3ggICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmM4MCwiZmNtcC5zeGQgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmMwMCwiZmNtcC5zeHMgICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmQwMCwiZmNtcC5zeHggICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiYWEwLCJmY21wdS5zZGQgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYTIwLCJmY21wdS5zZHMgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYjIwLCJmY21wdS5zZHggICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiOGEwLCJmY21wdS5zc2QgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODIwLCJmY21wdS5zc3MgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiOTIwLCJmY21wdS5zc3ggICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiY2EwLCJmY21wdS5zeGQgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzIwLCJmY21wdS5zeHMgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiZDIwLCJmY21wdS5zeHggICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDA4MjAsImZjdnQuc2QgICAgICIsezIxLDUsUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDAwODgwLCJmY3Z0LmRzICAgICAiLHsyMSw1LFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDA4ODgwLCJmY3Z0LmRzICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4OGMwLCJmY3Z0LmR4ICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4ODIwLCJmY3Z0LnNkICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4ODQwLCJmY3Z0LnN4ICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4OTIwLCJmY3Z0LnhkICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4OTAwLCJmY3Z0LnhzICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFhSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGYyYTAsImZkaXYuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjgwLCJmZGl2LmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjJjMCwiZmRpdi5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyMjAsImZkaXYuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjAwLCJmZGl2LmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjI0MCwiZmRpdi5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzMjAsImZkaXYuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzAwLCJmZGl2LmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjM0MCwiZmRpdi5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwYTAsImZkaXYuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDgwLCJmZGl2LnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjBjMCwiZmRpdi5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwMjAsImZkaXYuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDAwLCJmZGl2LnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjA0MCwiZmRpdi5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxMjAsImZkaXYuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTAwLCJmZGl2LnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjE0MCwiZmRpdi5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0YTAsImZkaXYueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDgwLCJmZGl2LnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjRjMCwiZmRpdi54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0MjAsImZkaXYueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDAwLCJmZGl2LnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQ0MCwiZmRpdi54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1MjAsImZkaXYueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTAwLCJmZGl2Lnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjU0MCwiZmRpdi54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwMjIyMCwiZmx0LmRzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDAyMjAwLCJmbHQuc3MgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDIyNDAsImZsdC54cyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDA4MmEwLCJmbXVsLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODI4MCwiZm11bC5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyYzAsImZtdWwuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjIwLCJmbXVsLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODIwMCwiZm11bC5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyNDAsImZtdWwuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzIwLCJmbXVsLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODMwMCwiZm11bC5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzNDAsImZtdWwuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MGEwLCJmbXVsLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODA4MCwiZm11bC5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwYzAsImZtdWwuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDIwLCJmbXVsLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODAwMCwiZm11bC5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwNDAsImZtdWwuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTIwLCJmbXVsLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODEwMCwiZm11bC5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxNDAsImZtdWwuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NGEwLCJmbXVsLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQ4MCwiZm11bC54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0YzAsImZtdWwueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDIwLCJmbXVsLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQwMCwiZm11bC54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0NDAsImZtdWwueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTIwLCJmbXVsLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODUwMCwiZm11bC54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1NDAsImZtdWwueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGY4YTAsImZzcXJ0LmRkICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjg4MCwiZnNxcnQuZHMgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOGMwLCJmc3FydC5keCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4MjAsImZzcXJ0LnNkICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjgwMCwiZnNxcnQuc3MgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODQwLCJmc3FydC5zeCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5MjAsImZzcXJ0LnhkICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjkwMCwiZnNxcnQueHMgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTQwLCJmc3FydC54eCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYjJhMCwiZnN1Yi5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyODAsImZzdWIuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMmMwLCJmc3ViLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjIyMCwiZnN1Yi5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyMDAsImZzdWIuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjQwLCJmc3ViLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjMyMCwiZnN1Yi5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzMDAsImZzdWIuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzQwLCJmc3ViLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjBhMCwiZnN1Yi5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwODAsImZzdWIuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMGMwLCJmc3ViLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjAyMCwiZnN1Yi5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwMDAsImZzdWIuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDQwLCJmc3ViLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjEyMCwiZnN1Yi5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxMDAsImZzdWIuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTQwLCJmc3ViLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjRhMCwiZnN1Yi54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0ODAsImZzdWIueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNGMwLCJmc3ViLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQyMCwiZnN1Yi54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0MDAsImZzdWIueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDQwLCJmc3ViLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjUyMCwiZnN1Yi54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1MDAsImZzdWIueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTQwLCJmc3ViLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmYzAwLCJpbGxvcCIsIHswLDIsREVDfSwgTk9fT1BFUkFORCwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGM4MDAsImludC5zcyAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzg4MCwiaW50LnNkICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjOTAwLCJpbnQuc3ggICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHgwNDAwMDAwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgwMDAwMDAwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzYzAwMDAwMCwibGQueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAxNDAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEwMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTgwMCwibGQueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxNTAwLCJsZC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDExMDAsImxkLmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTkwMCwibGQueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDE2MDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMjAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMWEwMCwibGQueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE3MDAsImxkLnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMzAwLCJsZC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMWIwMCwibGQueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYzAwMCwibW92LnMgICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjMDgwLCJtb3YuZCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDQyMDAsIm1vdi5zICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwNDI4MCwibW92LmQgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjMzAwLCJtb3YgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjQwMDZkMDAsIm11bHUuZCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGQwODAsIm5pbnQuc2QgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDAwMCwibmludC5zcyAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkMTAwLCJuaW50LnN4ICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMjAyMCwicGFkZC5iICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwNDAsInBhZGQuaCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMDYwLCJwYWRkICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAyMWUwLCJwYWRkcy5zICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjFhMCwicGFkZHMucy5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxYzAsInBhZGRzLnMuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGUwLCJwYWRkcy51ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBhMCwicGFkZHMudS5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwYzAsInBhZGRzLnUuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTYwLCJwYWRkcy51cyAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjEyMCwicGFkZHMudXMuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxNDAsInBhZGRzLnVzLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDM4NjAsInBjbXAgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDAwMDAsInBtdWwgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDYyNjAsInBwYWNrLjE2ICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2MjQwLCJwcGFjay4xNi5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQ2MCwicHBhY2suMzIgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0MjAsInBwYWNrLjMyLmIgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDQwLCJwcGFjay4zMi5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjE2MCwicHBhY2suOCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNzIwMCwicHJvdCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezUsNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDc4MDAsInByb3QgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDMwMjAsInBzdWIuYiAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMDQwLCJwc3ViLmggICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzA2MCwicHN1YiAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzFlMCwicHN1YnMucyAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxYTAsInBzdWJzLnMuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMWMwLCJwc3Vicy5zLmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBlMCwicHN1YnMudSAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwYTAsInBzdWJzLnUuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGMwLCJwc3Vicy51LmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzE2MCwicHN1YnMudXMgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxMjAsInBzdWJzLnVzLmIgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTQwLCJwc3Vicy51cy5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA2ODAwLCJwdW5way5uICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY4MjAsInB1bnBrLmIgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDM0MDAwMDAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDMwMDAwMDAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDM4MDAwMDAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjQwMDJjODAsInN0LmIud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyODgwLCJzdC5oLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjQ4MCwic3Qud3QgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIwODAsInN0LmQud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyZDgwLCJzdC5iLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjk4MCwic3QuaC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI1ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMTgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAyNDAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIwMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjEwMCwic3QuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMTgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIwODAsInN0LmQud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjUwMCwic3QudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNTgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI0ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjgwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyOTAwLCJzdC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI5ODAsInN0LngudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjg4MCwic3QueC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjQwMDJmODAsInN0LmIudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJlODAsInN0LmIud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIzODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIyODAsInN0LmQud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJiODAsInN0LmgudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJhODAsInN0Lmgud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI3ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI2ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMjYwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIyMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMzAwLCJzdC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjM4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIyODAsInN0LmQud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNzAwLCJzdC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjc4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI2ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYTAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmIwMCwic3QueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJiODAsInN0LngudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYTgwLCJzdC54Lnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBkODgwLCJ0cm5jLnNkICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQ4MDAsInRybmMuc3MgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDkwMCwidHJuYy5zeCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLX07Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL21pcHMuaCBiL2luY2x1ZGUvb3Bjb2RlL21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmZTU3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NDkgKzAsMCBAQAotLyogbWlwcy5oLiAgTWlwcyBvcGNvZGUgbGlzdCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGCi0gICBDb21tZW50ZWQgYW5kIG1vZGlmaWVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX01JUFNfSF8KLSNkZWZpbmUgX01JUFNfSF8KLQotLyogVGhlc2UgYXJlIGJpdCBtYXNrcyBhbmQgc2hpZnQgY291bnRzIHRvIHVzZSB0byBhY2Nlc3MgdGhlIHZhcmlvdXMKLSAgIGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRvIHJldHJpZXZlIHRoZSBYIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbiwgdXNlIHRoZSBleHByZXNzaW9uCi0JKGkgPj4gT1BfU0hfWCkgJiBPUF9NQVNLX1gKLSAgIFRvIHNldCB0aGUgc2FtZSBmaWVsZCAodG8gaiksIHVzZQotCWkgPSAoaSAmfiAoT1BfTUFTS19YIDw8IE9QX1NIX1gpKSB8IChqIDw8IE9QX1NIX1gpCi0KLSAgIE1ha2Ugc3VyZSB5b3UgdXNlIGZpZWxkcyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGluc3RydWN0aW9uLAotICAgb2YgY291cnNlLiAgCi0KLSAgIFRoZSAnaScgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgSU1NRURJQVRFLiAgCi0KLSAgIFRoZSAnaicgZm9ybWF0IHVzZXMgT1AgYW5kIFRBUkdFVC4KLQotICAgVGhlICdyJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJULCBSRCwgU0hBTVQgYW5kIEZVTkNULgotCi0gICBUaGUgJ2InIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIERFTFRBLgotCi0gICBUaGUgZmxvYXRpbmcgcG9pbnQgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4KLQotICAgVGhlIGZsb2F0aW5nIHBvaW50ICdyJyBmb3JtYXQgdXNlcyBPUCwgRk1ULCBGVCwgRlMsIEZEIGFuZCBGVU5DVC4KLQotICAgQSBicmVha3BvaW50IGluc3RydWN0aW9uIHVzZXMgT1AsIENPREUgYW5kIFNQRUMgKDEwIGJpdHMgb2YgdGhlCi0gICBicmVha3BvaW50IGluc3RydWN0aW9uIGFyZSBub3QgZGVmaW5lZDsgS2FuZSBzYXlzIHRoZSBicmVha3BvaW50Ci0gICBjb2RlIGZpZWxkIGluIEJSRUFLIGlzIDIwIGJpdHM7IHlldCBNSVBTIGFzc2VtYmxlcnMgYW5kIGRlYnVnZ2VycwotICAgb25seSB1c2UgdGVuIGJpdHMpLiAgQW4gb3B0aW9uYWwgdHdvLW9wZXJhbmQgZm9ybSBvZiBicmVhay9zZGJicAotICAgYWxsb3dzIHRoZSBsb3dlciB0ZW4gYml0cyB0byBiZSBzZXQgdG9vLgotCi0gICBUaGUgc3lzY2FsbCBpbnN0cnVjdGlvbiB1c2VzIFNZU0NBTEwuCi0KLSAgIFRoZSBnZW5lcmFsIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB1c2UgQ09QWi4gICovCi0KLSNkZWZpbmUgT1BfTUFTS19PUAkJMHgzZgotI2RlZmluZSBPUF9TSF9PUAkJMjYKLSNkZWZpbmUgT1BfTUFTS19SUwkJMHgxZgotI2RlZmluZSBPUF9TSF9SUwkJMjEKLSNkZWZpbmUgT1BfTUFTS19GUgkJMHgxZgotI2RlZmluZSBPUF9TSF9GUgkJMjEKLSNkZWZpbmUgT1BfTUFTS19GTVQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRk1UCQkyMQotI2RlZmluZSBPUF9NQVNLX0JDQwkJMHg3Ci0jZGVmaW5lIE9QX1NIX0JDQwkJMTgKLSNkZWZpbmUgT1BfTUFTS19DT0RFCQkweDNmZgotI2RlZmluZSBPUF9TSF9DT0RFCQkxNgotI2RlZmluZSBPUF9NQVNLX0NPREUyCQkweDNmZgotI2RlZmluZSBPUF9TSF9DT0RFMgkJNgotI2RlZmluZSBPUF9NQVNLX1JUCQkweDFmCi0jZGVmaW5lIE9QX1NIX1JUCQkxNgotI2RlZmluZSBPUF9NQVNLX0ZUCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZUCQkxNgotI2RlZmluZSBPUF9NQVNLX0NBQ0hFCQkweDFmCi0jZGVmaW5lIE9QX1NIX0NBQ0hFCQkxNgotI2RlZmluZSBPUF9NQVNLX1JECQkweDFmCi0jZGVmaW5lIE9QX1NIX1JECQkxMQotI2RlZmluZSBPUF9NQVNLX0ZTCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZTCQkxMQotI2RlZmluZSBPUF9NQVNLX1BSRUZYCQkweDFmCi0jZGVmaW5lIE9QX1NIX1BSRUZYCQkxMQotI2RlZmluZSBPUF9NQVNLX0NDQwkJMHg3Ci0jZGVmaW5lIE9QX1NIX0NDQwkJOAotI2RlZmluZSBPUF9NQVNLX1NZU0NBTEwJCTB4ZmZmZmYKLSNkZWZpbmUgT1BfU0hfU1lTQ0FMTAkJNgotI2RlZmluZSBPUF9NQVNLX1NIQU1UCQkweDFmCi0jZGVmaW5lIE9QX1NIX1NIQU1UCQk2Ci0jZGVmaW5lIE9QX01BU0tfRkQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRkQJCTYKLSNkZWZpbmUgT1BfTUFTS19UQVJHRVQJCTB4M2ZmZmZmZgotI2RlZmluZSBPUF9TSF9UQVJHRVQJCTAKLSNkZWZpbmUgT1BfTUFTS19DT1BaCQkweDFmZmZmZmYKLSNkZWZpbmUgT1BfU0hfQ09QWgkJMAotI2RlZmluZSBPUF9NQVNLX0lNTUVESUFURQkweGZmZmYKLSNkZWZpbmUgT1BfU0hfSU1NRURJQVRFCQkwCi0jZGVmaW5lIE9QX01BU0tfREVMVEEJCTB4ZmZmZgotI2RlZmluZSBPUF9TSF9ERUxUQQkJMAotI2RlZmluZSBPUF9NQVNLX0ZVTkNUCQkweDNmCi0jZGVmaW5lIE9QX1NIX0ZVTkNUCQkwCi0jZGVmaW5lIE9QX01BU0tfU1BFQwkJMHgzZgotI2RlZmluZSBPUF9TSF9TUEVDCQkwCi0jZGVmaW5lIE9QX1NIX0xPQ0MgICAgICAgICAgICAgIDggICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgT1BfU0hfSElDQyAgICAgICAgICAgICAgMTggICAgICAvKiBGUCBjb25kaXRpb24gY29kZSAqLwotI2RlZmluZSBPUF9NQVNLX0NDICAgICAgICAgICAgICAweDcKLSNkZWZpbmUgT1BfU0hfQ09QMU5PUk0gICAgICAgICAgMjUgICAgICAvKiBOb3JtYWwgQ09QMSBlbmNvZGluZyAqLwotI2RlZmluZSBPUF9NQVNLX0NPUDFOT1JNICAgICAgICAweDEgICAgIC8qIGEgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBPUF9TSF9DT1AxU1BFQyAgICAgICAgICAyMSAgICAgIC8qIENPUDEgZW5jb2RpbmdzICovCi0jZGVmaW5lIE9QX01BU0tfQ09QMVNQRUMgICAgICAgIDB4ZgotI2RlZmluZSBPUF9NQVNLX0NPUDFTQ0xSICAgICAgICAweDQKLSNkZWZpbmUgT1BfTUFTS19DT1AxQ01QICAgICAgICAgMHgzCi0jZGVmaW5lIE9QX1NIX0NPUDFDTVAgICAgICAgICAgIDQKLSNkZWZpbmUgT1BfU0hfRk9STUFUICAgICAgICAgICAgMjEgICAgICAvKiBGUCBzaG9ydCBmb3JtYXQgZmllbGQgKi8KLSNkZWZpbmUgT1BfTUFTS19GT1JNQVQgICAgICAgICAgMHg3Ci0jZGVmaW5lIE9QX1NIX1RSVUUgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE9QX01BU0tfVFJVRSAgICAgICAgICAgIDB4MQotI2RlZmluZSBPUF9TSF9HRSAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBPUF9NQVNLX0dFICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE9QX1NIX1VOU0lHTkVEICAgICAgICAgIDE2Ci0jZGVmaW5lIE9QX01BU0tfVU5TSUdORUQgICAgICAgIDB4MQotI2RlZmluZSBPUF9TSF9ISU5UICAgICAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX0hJTlQgICAgICAgICAgICAweDFmCi0jZGVmaW5lIE9QX1NIX01NSSAgICAgICAgICAgICAgIDAgICAgICAgLyogTXVsdGltZWRpYSAocGFyYWxsZWwpIG9wICovCi0jZGVmaW5lIE9QX01BU0tfTU1JICAgICAgICAgICAgIDB4M2YgCi0jZGVmaW5lIE9QX1NIX01NSVNVQiAgICAgICAgICAgIDYKLSNkZWZpbmUgT1BfTUFTS19NTUlTVUIgICAgICAgICAgMHgxZgotI2RlZmluZSBPUF9NQVNLX1BFUkZSRUcJCTB4MWYJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqLwotI2RlZmluZSBPUF9TSF9QRVJGUkVHCQkxCi0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdHJ1Y3QgbWlwc19vcGNvZGUKLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqYXJnczsKLSAgLyogVGhlIGJhc2ljIG9wY29kZSBmb3IgdGhlIGluc3RydWN0aW9uLiAgV2hlbiBhc3NlbWJsaW5nLCB0aGlzCi0gICAgIG9wY29kZSBpcyBtb2RpZmllZCBieSB0aGUgYXJndW1lbnRzIHRvIHByb2R1Y2UgdGhlIGFjdHVhbCBvcGNvZGUKLSAgICAgdGhhdCBpcyB1c2VkLiAgSWYgcGluZm8gaXMgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGlzIDAuICAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwotICAvKiBJZiBwaW5mbyBpcyBub3QgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGlzIGEgYml0IG1hc2sgZm9yIHRoZQotICAgICByZWxldmFudCBwb3J0aW9ucyBvZiB0aGUgb3Bjb2RlIHdoZW4gZGlzYXNzZW1ibGluZy4gIElmIHRoZQotICAgICBhY3R1YWwgb3Bjb2RlIGFuZGVkIHdpdGggdGhlIG1hdGNoIGZpZWxkIGVxdWFscyB0aGUgb3Bjb2RlIGZpZWxkLAotICAgICB0aGVuIHdlIGhhdmUgZm91bmQgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb24uICBJZiBwaW5mbyBpcwotICAgICBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgZmllbGQgaXMgdGhlIG1hY3JvIGlkZW50aWZpZXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIC8qIEZvciBhIG1hY3JvLCB0aGlzIGlzIElOU05fTUFDUk8uICBPdGhlcndpc2UsIGl0IGlzIGEgY29sbGVjdGlvbgotICAgICBvZiBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uLCBub3RhYmx5IGFueSByZWxldmFudCBoYXphcmQKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIHBpbmZvOwotICAvKiBBIGNvbGxlY3Rpb24gb2YgYml0cyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbiBzZXRzIG9mIHdoaWNoIHRoaXMKLSAgICAgaW5zdHJ1Y3Rpb24gb3IgbWFjcm8gaXMgYSBtZW1iZXIuICovCi0gIHVuc2lnbmVkIGxvbmcgbWVtYmVyc2hpcDsKLX07Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFycyBpbiB0aGUgYXJncyBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb24uICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpZWxkcyBhcHBlYXIKLSAgIHdoZW4gdGhlIGluc3RydWN0aW9uIGlzIHVzZWQuICBDb21tYXMgYW5kIHBhcmVudGhlc2VzIGluIHRoZSBhcmdzCi0gICBzdHJpbmcgYXJlIGlnbm9yZWQgd2hlbiBhc3NlbWJsaW5nLCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQKLSAgIHdoZW4gZGlzYXNzZW1ibGluZy4KLQotICAgRWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRzIHRvIGEgbWFzayBmaWVsZCBkZWZpbmVkIGFib3ZlLgotCi0gICAiPCIgNSBiaXQgc2hpZnQgYW1vdW50IChPUF8qX1NIQU1UKQotICAgIj4iIHNoaWZ0IGFtb3VudCBiZXR3ZWVuIDMyIGFuZCA2Mywgc3RvcmVkIGFmdGVyIHN1YnRyYWN0aW5nIDMyIChPUF8qX1NIQU1UKQotICAgImEiIDI2IGJpdCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9UQVJHRVQpCi0gICAiYiIgNSBiaXQgYmFzZSByZWdpc3RlciAoT1BfKl9SUykKLSAgICJjIiAxMCBiaXQgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUpCi0gICAiZCIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JEKQotICAgImgiIDUgYml0IHByZWZ4IGhpbnQgKE9QXypfUFJFRlgpCi0gICAiaSIgMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9JTU1FRElBVEUpCi0gICAiaiIgMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKE9QXypfREVMVEEpCi0gICAiayIgNSBiaXQgY2FjaGUgb3Bjb2RlIGluIHRhcmdldCByZWdpc3RlciBwb3NpdGlvbiAoT1BfKl9DQUNIRSkKLSAgICJvIiAxNiBiaXQgc2lnbmVkIG9mZnNldCAoT1BfKl9ERUxUQSkKLSAgICJwIiAxNiBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIHRhcmdldCBhZGRyZXNzIChPUF8qX0RFTFRBKQotICAgInEiIDEwIGJpdCBleHRyYSBicmVha3BvaW50IGNvZGUgKE9QXypfQ09ERTIpCi0gICAiciIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggc291cmNlIGFuZCB0YXJnZXQgKE9QXypfUlMpCi0gICAicyIgNSBiaXQgc291cmNlIHJlZ2lzdGVyIHNwZWNpZmllciAoT1BfKl9SUykKLSAgICJ0IiA1IGJpdCB0YXJnZXQgcmVnaXN0ZXIgKE9QXypfUlQpCi0gICAidSIgMTYgYml0IHVwcGVyIDE2IGJpdHMgb2YgYWRkcmVzcyAoT1BfKl9JTU1FRElBVEUpCi0gICAidiIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9SUykKLSAgICJ3IiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCB0YXJnZXQgYW5kIGRlc3RpbmF0aW9uIChPUF8qX1JUKQotICAgIkMiIDI1IGJpdCBjb3Byb2Nlc3NvciBmdW5jdGlvbiBjb2RlIChPUF8qX0NPUFopCi0gICAiQiIgMjAgYml0IHN5c2NhbGwgZnVuY3Rpb24gY29kZSAoT1BfKl9TWVNDQUxMKQotICAgIngiIGFjY2VwdCBhbmQgaWdub3JlIHJlZ2lzdGVyIG5hbWUKLSAgICJ6IiBtdXN0IGJlIHplcm8gcmVnaXN0ZXIKLQotICAgRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zOgotICAgIkQiIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChPUF8qX0ZEKQotICAgIk0iIDMgYml0IGNvbXBhcmUgY29uZGl0aW9uIGNvZGUgKE9QXypfQ0NDKSAob25seSB1c2VkIGZvciBtaXBzNCBhbmQgdXApCi0gICAiTiIgMyBiaXQgYnJhbmNoIGNvbmRpdGlvbiBjb2RlIChPUF8qX0JDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQotICAgIlMiIDUgYml0IGZzIHNvdXJjZSAxIHJlZ2lzdGVyIChPUF8qX0ZTKQotICAgIlQiIDUgYml0IGZ0IHNvdXJjZSAyIHJlZ2lzdGVyIChPUF8qX0ZUKQotICAgIlIiIDUgYml0IGZyIHNvdXJjZSAzIHJlZ2lzdGVyIChPUF8qX0ZSKQotICAgIlYiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBmbG9hdGluZyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChPUF8qX0ZTKQotICAgIlciIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBmbG9hdGluZyB0YXJnZXQgYW5kIGRlc3RpbmF0aW9uIChPUF8qX0ZUKQotCi0gICBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnM6Ci0gICAiRSIgNSBiaXQgdGFyZ2V0IHJlZ2lzdGVyIChPUF8qX1JUKQotICAgIkciIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChPUF8qX1JEKQotICAgIlAiIDUgYml0IHBlcmZvcm1hbmNlLW1vbml0b3IgcmVnaXN0ZXIgKE9QXypfUEVSRlJFRykKLQotICAgTWFjcm8gaW5zdHJ1Y3Rpb25zOgotICAgIkEiIEdlbmVyYWwgMzIgYml0IGV4cHJlc3Npb24KLSAgICJJIiAzMiBiaXQgaW1tZWRpYXRlCi0gICAiRiIgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5yZGF0YQotICAgIkwiIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAubGl0OAotICAgImYiIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgImwiIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAubGl0NAotCi0gICBPdGhlcjoKLSAgICIoKSIgcGFyZW5zIHN1cnJvdW5kaW5nIG9wdGlvbmFsIHZhbHVlCi0gICAiLCIgIHNlcGFyYXRlcyBvcGVyYW5kcwotCi0gICBDaGFyYWN0ZXJzIHVzZWQgc28gZmFyLCBmb3IgcXVpY2sgcmVmZXJlbmNlIHdoZW4gYWRkaW5nIG1vcmU6Ci0gICAiPD4oKSwiCi0gICAiQUJDREVGR0lMTU5TVFJWVyIKLSAgICJhYmNkZmhpamtsb3BxcnN0dXZ3eHoiCi0qLwotCi0vKiBUaGVzZSBhcmUgdGhlIGJpdHMgd2hpY2ggbWF5IGJlIHNldCBpbiB0aGUgcGluZm8gZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9ucywgaWYgaXQgaXMgbm90IGVxdWFsIHRvIElOU05fTUFDUk8uICAqLwotCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUkQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl9EICAgICAgICAgICAgMHgwMDAwMDAwMQotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JULiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfVCAgICAgICAgICAgIDB4MDAwMDAwMDIKLS8qIE1vZGlmaWVzIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAzMS4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSXzMxICAgICAgICAgICAweDAwMDAwMDA0Ci0vKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GRC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfRlBSX0QgICAgICAgICAgICAweDAwMDAwMDA4Ci0vKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfRlBSX1MgICAgICAgICAgICAweDAwMDAwMDEwCi0vKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfRlBSX1QgICAgICAgICAgICAweDAwMDAwMDIwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlMuICAqLwotI2RlZmluZSBJTlNOX1JFQURfR1BSX1MgICAgICAgICAgICAgMHgwMDAwMDA0MAotLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JULiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0dQUl9UICAgICAgICAgICAgIDB4MDAwMDAwODAKLS8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZTLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9TICAgICAgICAgICAgIDB4MDAwMDAxMDAKLS8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZULiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9UICAgICAgICAgICAgIDB4MDAwMDAyMDAKLS8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZSLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9SCQkgICAgMHgwMDAwMDQwMAotLyogTW9kaWZpZXMgY29wcm9jZXNzb3IgY29uZGl0aW9uIGNvZGUuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0NPTkRfQ09ERSAgICAgICAgMHgwMDAwMDgwMAotLyogUmVhZHMgY29wcm9jZXNzb3IgY29uZGl0aW9uIGNvZGUuICAqLwotI2RlZmluZSBJTlNOX1JFQURfQ09ORF9DT0RFICAgICAgICAgMHgwMDAwMTAwMAotLyogVExCIG9wZXJhdGlvbi4gICovCi0jZGVmaW5lIElOU05fVExCICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0vKiBSZWFkcyBjb3Byb2Nlc3NvciByZWdpc3RlciBvdGhlciB0aGFuIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9DT1AgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLS8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0xPQURfTUVNT1JZX0RFTEFZICAgICAgMHgwMDAwODAwMAotLyogSW5zdHJ1Y3Rpb24gbG9hZHMgdmFsdWUgZnJvbSBjb3Byb2Nlc3NvciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQkgICAgMHgwMDAxMDAwMAotLyogSW5zdHJ1Y3Rpb24gaGFzIHVuY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkgICAgMHgwMDAyMDAwMAotLyogSW5zdHJ1Y3Rpb24gaGFzIGNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgSU5TTl9DT05EX0JSQU5DSF9ERUxBWSAgICAgIDB4MDAwNDAwMDAKLS8qIENvbmRpdGlvbmFsIGJyYW5jaCBsaWtlbHk6IGlmIGJyYW5jaCBub3QgdGFrZW4sIGluc24gbnVsbGlmaWVkLiAgKi8KLSNkZWZpbmUgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkJICAgIDB4MDAwODAwMDAKLS8qIE1vdmVzIHRvIGNvcHJvY2Vzc29yIHJlZ2lzdGVyLCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZICAgICAgMHgwMDEwMDAwMAotLyogTG9hZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgZnJvbSBtZW1vcnksIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSAgICAweDAwMjAwMDAwCi0vKiBSZWFkcyB0aGUgSEkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1JFQURfSEkJCSAgICAweDAwNDAwMDAwCi0vKiBSZWFkcyB0aGUgTE8gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1JFQURfTE8JCSAgICAweDAwODAwMDAwCi0vKiBNb2RpZmllcyB0aGUgSEkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0hJCQkgICAgMHgwMTAwMDAwMAotLyogTW9kaWZpZXMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9MTwkJICAgIDB4MDIwMDAwMDAKLS8qIFRha2VzIGEgdHJhcCAoZWFzaWVyIHRvIGtlZXAgb3V0IG9mIGRlbGF5IHNsb3QpLiAgKi8KLSNkZWZpbmUgSU5TTl9UUkFQICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLS8qIEluc3RydWN0aW9uIHN0b3JlcyB2YWx1ZSBpbnRvIG1lbW9yeS4gICovCi0jZGVmaW5lIElOU05fU1RPUkVfTUVNT1JZCSAgICAweDA4MDAwMDAwCi0vKiBJbnN0cnVjdGlvbiB1c2VzIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLwotI2RlZmluZSBGUF9TCQkJICAgIDB4MTAwMDAwMDAKLS8qIEluc3RydWN0aW9uIHVzZXMgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCi0jZGVmaW5lIEZQX0QJCQkgICAgMHgyMDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiB0aGUgdHgzOSdzIGludGVnZXIgbXVsdGlwbHkgZmFtaWx5LiAgICAqLwotI2RlZmluZSBJTlNOX01VTFQgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gc3luY2hyb25pemUgc2hhcmVkIG1lbW9yeS4gICovCi0jZGVmaW5lIElOU05fU1lOQwkJICAgIDB4ODAwMDAwMDAKLQotLyogSW5zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgYSBtYWNyby4gIEl0IHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZQotICAgZGlzYXNzZW1ibGVyLCBhbmQgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0jZGVmaW5lIElOU05fTUFDUk8gICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCi0KLQotCi0KLQotLyogTUlQUyBJU0EgZmllbGQtLUNQVSBsZXZlbCBhdCB3aGljaCBpbnNuIGlzIHN1cHBvcnRlZC4gICovCi0jZGVmaW5lIElOU05fSVNBCQkgICAgMHgwMDAwMDAwRgotLyogQW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90IHBhcnQgb2YgYW55IGJhc2ljIE1JUFMgSVNBLgotICAgKGllIGl0IGlzIGEgY2hpcCBzcGVjaWZpYyBpbnN0cnVjdGlvbikgICovCi0jZGVmaW5lIElOU05fTk9fSVNBCQkgICAgMHgwMDAwMDAwMAotLyogTUlQUyBJU0EgMSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fSVNBMQkJICAgIDB4MDAwMDAwMDEKLS8qIE1JUFMgSVNBIDIgaW5zdHJ1Y3Rpb24gKFI2MDAwIG9yIFI0MDAwKS4gICovCi0jZGVmaW5lIElOU05fSVNBMgkJICAgIDB4MDAwMDAwMDIKLS8qIE1JUFMgSVNBIDMgaW5zdHJ1Y3Rpb24gKFI0MDAwKS4gICovCi0jZGVmaW5lIElOU05fSVNBMwkJICAgIDB4MDAwMDAwMDMKLS8qIE1JUFMgSVNBIDQgaW5zdHJ1Y3Rpb24gKFI4MDAwKS4gICovCi0jZGVmaW5lIElOU05fSVNBNAkJICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSU5TTl9JU0E1CQkgICAgMHgwMDAwMDAwNQotCi0vKiBDaGlwIHNwZWNpZmljIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCi0vKiBNSVBTIFI0NjUwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80NjUwCQkgICAgMHgwMDAwMDAxMAotLyogTFNJIFI0MDEwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80MDEwCQkgICAgMHgwMDAwMDAyMAotLyogTkVDIFZSNDEwMCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSU5TTl80MTAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFRvc2hpYmEgUjM5MDAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzM5MDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKiAzMi1iaXQgY29kZSBydW5uaW5nIG9uIGEgSVNBMysgQ1BVLiAqLwotI2RlZmluZSBJTlNOX0dQMzIgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotCi0vKiBUZXN0IGZvciBtZW1iZXJzaGlwIGluIGFuIElTQSBpbmNsdWRpbmcgY2hpcCBzcGVjaWZpYyBJU0FzLgotICAgSU5TTiBpcyBwb2ludGVyIHRvIGFuIGVsZW1lbnQgb2YgdGhlIG9wY29kZSB0YWJsZTsgSVNBIGlzIHRoZQotICAgc3BlY2lmaWVkIElTQSB0byB0ZXN0IGFnYWluc3Q7IGFuZCBDUFUgaXMgdGhlIENQVSBzcGVjaWZpYyBJU0EKLSAgIHRvIHRlc3QsIG9yIHplcm8gaWYgbm8gQ1BVIHNwZWNpZmljIElTQSB0ZXN0IGlzIGRlc2lyZWQuICAKLSAgIFRoZSBncDMyIGFyZyBpcyBzZXQgd2hlbiB5b3UgbmVlZCB0byBmb3JjZSAzMi1iaXQgcmVnaXN0ZXIgdXNhZ2Ugb24KLSAgIGEgbWFjaGluZSB3aXRoIDY0LWJpdCByZWdpc3RlcnM7IHNlZSB0aGUgZG9jdW1lbnRhdGlvbiB1bmRlciAtbWdwMzIKLSAgIGluIHRoZSBNSVBTIGdhcyBkb2NzLiAqLwotCi0jZGVmaW5lIE9QQ09ERV9JU19NRU1CRVIoaW5zbixpc2EsY3B1LGdwMzIpIAkgICAgICAgCQlcCi0gICAgKCgoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpICE9IDAJCQlcCi0gICAgICAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpIDw9IGlzYQkJCVwKLSAgICAgICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOX0dQMzIgPyBncDMyIDogMSkpCQlcCi0gICAgIHx8IChjcHUgPT0gNDY1MAkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fNDY1MCkgIT0gMCkJCVwKLSAgICAgfHwgKGNwdSA9PSA0MDEwCQkJCQkJXAotCSAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80MDEwKSAhPSAwKQkJXAotICAgICB8fCAoKGNwdSA9PSA0MTAwCQkJCQkJXAotCSAgfHwgY3B1ID09IDQxMTEJCQkJCVwKLQkgICkJCQkJCQkJXAotCSAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80MTAwKSAhPSAwKQkJXAotICAgICB8fCAoY3B1ID09IDM5MDAJCQkJCQlcCi0JICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApICE9IDApKQotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBtYWNybyBleHBhbmRlZCBpbnN0cnVjdGlvbnMuCi0gKgotICogX0kgYXBwZW5kZWQgbWVhbnMgaW1tZWRpYXRlCi0gKiBfQSBhcHBlbmRlZCBtZWFucyBhZGRyZXNzCi0gKiBfQUIgYXBwZW5kZWQgbWVhbnMgYWRkcmVzcyB3aXRoIGJhc2UgcmVnaXN0ZXIKLSAqIF9EIGFwcGVuZGVkIG1lYW5zIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICogX1MgYXBwZW5kZWQgbWVhbnMgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gKi8KLWVudW0gewotICAgIE1fQUJTLAotICAgIE1fQUREX0ksCi0gICAgTV9BRERVX0ksCi0gICAgTV9BTkRfSSwKLSAgICBNX0JFUSwKLSAgICBNX0JFUV9JLAotICAgIE1fQkVRTF9JLAotICAgIE1fQkdFLAotICAgIE1fQkdFTCwKLSAgICBNX0JHRV9JLAotICAgIE1fQkdFTF9JLAotICAgIE1fQkdFVSwKLSAgICBNX0JHRVVMLAotICAgIE1fQkdFVV9JLAotICAgIE1fQkdFVUxfSSwKLSAgICBNX0JHVCwKLSAgICBNX0JHVEwsCi0gICAgTV9CR1RfSSwKLSAgICBNX0JHVExfSSwKLSAgICBNX0JHVFUsCi0gICAgTV9CR1RVTCwKLSAgICBNX0JHVFVfSSwKLSAgICBNX0JHVFVMX0ksCi0gICAgTV9CTEUsCi0gICAgTV9CTEVMLAotICAgIE1fQkxFX0ksCi0gICAgTV9CTEVMX0ksCi0gICAgTV9CTEVVLAotICAgIE1fQkxFVUwsCi0gICAgTV9CTEVVX0ksCi0gICAgTV9CTEVVTF9JLAotICAgIE1fQkxULAotICAgIE1fQkxUTCwKLSAgICBNX0JMVF9JLAotICAgIE1fQkxUTF9JLAotICAgIE1fQkxUVSwKLSAgICBNX0JMVFVMLAotICAgIE1fQkxUVV9JLAotICAgIE1fQkxUVUxfSSwKLSAgICBNX0JORSwKLSAgICBNX0JORV9JLAotICAgIE1fQk5FTF9JLAotICAgIE1fREFCUywKLSAgICBNX0RBRERfSSwKLSAgICBNX0RBRERVX0ksCi0gICAgTV9ERElWXzMsCi0gICAgTV9ERElWXzNJLAotICAgIE1fRERJVlVfMywKLSAgICBNX0RESVZVXzNJLAotICAgIE1fRElWXzMsCi0gICAgTV9ESVZfM0ksCi0gICAgTV9ESVZVXzMsCi0gICAgTV9ESVZVXzNJLAotICAgIE1fRExBX0FCLAotICAgIE1fRExJLAotICAgIE1fRE1VTCwKLSAgICBNX0RNVUxfSSwgCi0gICAgTV9ETVVMTywKLSAgICBNX0RNVUxPX0ksIAotICAgIE1fRE1VTE9VLAotICAgIE1fRE1VTE9VX0ksIAotICAgIE1fRFJFTV8zLAotICAgIE1fRFJFTV8zSSwKLSAgICBNX0RSRU1VXzMsCi0gICAgTV9EUkVNVV8zSSwKLSAgICBNX0RTVUJfSSwKLSAgICBNX0RTVUJVX0ksCi0gICAgTV9EU1VCVV9JXzIsCi0gICAgTV9KX0EsCi0gICAgTV9KQUxfMSwKLSAgICBNX0pBTF8yLAotICAgIE1fSkFMX0EsCi0gICAgTV9MX0RPQiwKLSAgICBNX0xfREFCLAotICAgIE1fTEFfQUIsCi0gICAgTV9MQl9BLAotICAgIE1fTEJfQUIsCi0gICAgTV9MQlVfQSwKLSAgICBNX0xCVV9BQiwKLSAgICBNX0xEX0EsCi0gICAgTV9MRF9PQiwKLSAgICBNX0xEX0FCLAotICAgIE1fTERDMV9BQiwKLSAgICBNX0xEQzJfQUIsCi0gICAgTV9MREMzX0FCLAotICAgIE1fTERMX0FCLAotICAgIE1fTERSX0FCLAotICAgIE1fTEhfQSwKLSAgICBNX0xIX0FCLAotICAgIE1fTEhVX0EsCi0gICAgTV9MSFVfQUIsCi0gICAgTV9MSSwKLSAgICBNX0xJX0QsCi0gICAgTV9MSV9ERCwKLSAgICBNX0xJX1MsCi0gICAgTV9MSV9TUywKLSAgICBNX0xMX0FCLAotICAgIE1fTExEX0FCLAotICAgIE1fTFNfQSwKLSAgICBNX0xXX0EsCi0gICAgTV9MV19BQiwKLSAgICBNX0xXQzBfQSwKLSAgICBNX0xXQzBfQUIsCi0gICAgTV9MV0MxX0EsCi0gICAgTV9MV0MxX0FCLAotICAgIE1fTFdDMl9BLAotICAgIE1fTFdDMl9BQiwKLSAgICBNX0xXQzNfQSwKLSAgICBNX0xXQzNfQUIsCi0gICAgTV9MV0xfQSwKLSAgICBNX0xXTF9BQiwKLSAgICBNX0xXUl9BLAotICAgIE1fTFdSX0FCLAotICAgIE1fTFdVX0FCLAotICAgIE1fTVVMLAotICAgIE1fTVVMX0ksIAotICAgIE1fTVVMTywKLSAgICBNX01VTE9fSSwgCi0gICAgTV9NVUxPVSwKLSAgICBNX01VTE9VX0ksIAotICAgIE1fTk9SX0ksCi0gICAgTV9PUl9JLAotICAgIE1fUkVNXzMsCi0gICAgTV9SRU1fM0ksCi0gICAgTV9SRU1VXzMsCi0gICAgTV9SRU1VXzNJLAotICAgIE1fUk9MLAotICAgIE1fUk9MX0ksCi0gICAgTV9ST1IsCi0gICAgTV9ST1JfSSwKLSAgICBNX1NfREEsCi0gICAgTV9TX0RPQiwKLSAgICBNX1NfREFCLAotICAgIE1fU19TLAotICAgIE1fU0NfQUIsCi0gICAgTV9TQ0RfQUIsCi0gICAgTV9TRF9BLAotICAgIE1fU0RfT0IsCi0gICAgTV9TRF9BQiwKLSAgICBNX1NEQzFfQUIsCi0gICAgTV9TREMyX0FCLAotICAgIE1fU0RDM19BQiwKLSAgICBNX1NETF9BQiwKLSAgICBNX1NEUl9BQiwKLSAgICBNX1NFUSwKLSAgICBNX1NFUV9JLAotICAgIE1fU0dFLAotICAgIE1fU0dFX0ksCi0gICAgTV9TR0VVLAotICAgIE1fU0dFVV9JLAotICAgIE1fU0dULAotICAgIE1fU0dUX0ksCi0gICAgTV9TR1RVLAotICAgIE1fU0dUVV9JLAotICAgIE1fU0xFLAotICAgIE1fU0xFX0ksCi0gICAgTV9TTEVVLAotICAgIE1fU0xFVV9JLAotICAgIE1fU0xUX0ksCi0gICAgTV9TTFRVX0ksCi0gICAgTV9TTkUsCi0gICAgTV9TTkVfSSwKLSAgICBNX1NCX0EsCi0gICAgTV9TQl9BQiwKLSAgICBNX1NIX0EsCi0gICAgTV9TSF9BQiwKLSAgICBNX1NXX0EsCi0gICAgTV9TV19BQiwKLSAgICBNX1NXQzBfQSwKLSAgICBNX1NXQzBfQUIsCi0gICAgTV9TV0MxX0EsCi0gICAgTV9TV0MxX0FCLAotICAgIE1fU1dDMl9BLAotICAgIE1fU1dDMl9BQiwKLSAgICBNX1NXQzNfQSwKLSAgICBNX1NXQzNfQUIsCi0gICAgTV9TV0xfQSwKLSAgICBNX1NXTF9BQiwKLSAgICBNX1NXUl9BLAotICAgIE1fU1dSX0FCLAotICAgIE1fU1VCX0ksCi0gICAgTV9TVUJVX0ksCi0gICAgTV9TVUJVX0lfMiwKLSAgICBNX1RFUV9JLAotICAgIE1fVEdFX0ksCi0gICAgTV9UR0VVX0ksCi0gICAgTV9UTFRfSSwKLSAgICBNX1RMVFVfSSwKLSAgICBNX1RORV9JLAotICAgIE1fVFJVTkNXRCwKLSAgICBNX1RSVU5DV1MsCi0gICAgTV9VTEQsCi0gICAgTV9VTERfQSwKLSAgICBNX1VMSCwKLSAgICBNX1VMSF9BLAotICAgIE1fVUxIVSwKLSAgICBNX1VMSFVfQSwKLSAgICBNX1VMVywKLSAgICBNX1VMV19BLAotICAgIE1fVVNILAotICAgIE1fVVNIX0EsCi0gICAgTV9VU1csCi0gICAgTV9VU1dfQSwKLSAgICBNX1VTRCwKLSAgICBNX1VTRF9BLAotICAgIE1fWE9SX0ksCi0gICAgTV9DT1AwLAotICAgIE1fQ09QMSwKLSAgICBNX0NPUDIsCi0gICAgTV9DT1AzLAotICAgIE1fTlVNX01BQ1JPUwotfTsKLQotCi0vKiBUaGUgb3JkZXIgb2Ygb3ZlcmxvYWRlZCBpbnN0cnVjdGlvbnMgbWF0dGVycy4gIExhYmVsIGFyZ3VtZW50cyBhbmQKLSAgIHJlZ2lzdGVyIGFyZ3VtZW50cyBsb29rIHRoZSBzYW1lLiBJbnN0cnVjdGlvbnMgdGhhdCBjYW4gaGF2ZSBlaXRoZXIKLSAgIGZvciBhcmd1bWVudHMgbXVzdCBhcGVhciBpbiB0aGUgY29ycmVjdCBvcmRlciBpbiB0aGlzIHRhYmxlIGZvciB0aGUKLSAgIGFzc2VtYmxlciB0byBwaWNrIHRoZSByaWdodCBvbmUuIEluIG90aGVyIHdvcmRzLCBlbnRyaWVzIHdpdGgKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcyBtdXN0IGFwZWFyIGFmdGVyIHRoZSBzYW1lIGluc3RydWN0aW9uIHdpdGgKLSAgIHJlZ2lzdGVycy4KLQotICAgTWFueSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IGhhbmQgZm9yIG90aGVyIGluc3RydWN0aW9ucyAoaS5lLiwgVGhlCi0gICBqYWwgPHJlZ2lzdGVyPiBpbnN0cnVjdGlvbiBpcyBzaG9ydCBmb3IgamFsciA8cmVnaXN0ZXI+KS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwc19idWlsdGluX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlczsKLWV4dGVybiBzdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfb3Bjb2RlczsKLWV4dGVybiBpbnQgYmZkX21pcHNfbnVtX29wY29kZXM7Ci0jZGVmaW5lIE5VTU9QQ09ERVMgYmZkX21pcHNfbnVtX29wY29kZXMKLQotDAotLyogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGFkZHMgZGVmaW5pdGlvbnMgZm9yIHRoZSBtaXBzMTYgVGlueVJJU0MKLSAgIHByb2Nlc3Nvci4gICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgYml0bWFza3MgYW5kIHNoaWZ0IGNvdW50cyB1c2VkIGZvciB0aGUgZGlmZmVyZW50Ci0gICBmaWVsZHMgaW4gdGhlIGluc3RydWN0aW9uIGZvcm1hdHMuICBPdGhlciB0aGFuIE9QLCBubyBtYXNrcyBhcmUKLSAgIHByb3ZpZGVkIGZvciB0aGUgZml4ZWQgcG9ydGlvbnMgb2YgYW4gaW5zdHJ1Y3Rpb24sIHNpbmNlIHRoZXkgYXJlCi0gICBub3QgbmVlZGVkLgotCi0gICBUaGUgSSBmb3JtYXQgdXNlcyBJTU0xMS4KLQotICAgVGhlIFJJIGZvcm1hdCB1c2VzIFJYIGFuZCBJTU04LgotCi0gICBUaGUgUlIgZm9ybWF0IHVzZXMgUlgsIGFuZCBSWS4KLQotICAgVGhlIFJSSSBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBJTU01LgotCi0gICBUaGUgUlJSIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIFJaLgotCi0gICBUaGUgUlJJX0EgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNC4KLQotICAgVGhlIFNISUZUIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIFNIQU1ULgotCi0gICBUaGUgSTggZm9ybWF0IHVzZXMgSU1NOC4KLQotICAgVGhlIEk4X01PVlIzMiBmb3JtYXQgdXNlcyBSWSBhbmQgUkVHUjMyLgotCi0gICBUaGUgSVJfTU9WMzJSIGZvcm1hdCB1c2VzIFJFRzMyUiBhbmQgTU9WMzJaLgotCi0gICBUaGUgSTY0IGZvcm1hdCB1c2VzIElNTTguCi0KLSAgIFRoZSBSSTY0IGZvcm1hdCB1c2VzIFJZIGFuZCBJTU01LgotICAgKi8KLQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX09QCTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfT1AJCTExCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NMTEJMHg3ZmYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NMTEJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JYCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWAkJOAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTgJMHhmZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU04CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWQkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUlkJCTUKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU01CTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NNQkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUloJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JaCQkyCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNAkweGYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NNAkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHUjMyCTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHUjMyCTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SRUczMlIJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9SRUczMlIJMwotI2RlZmluZSBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUihpKSAoKCgoaSkgPj4gNSkgJiA3KSB8ICgoaSkgJiAweDE4KSkKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19NT1ZFMzJaCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9NT1ZFMzJaCTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU02CTB4M2YKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NNgk1Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFycyBpbiB0aGUgYXJncyBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb24uICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpZWxkcyBhcHBlYXIKLSAgIHdoZW4gdGhlIGluc3RydWN0aW9uIGlzIHVzZWQuICBDb21tYXMgYW5kIHBhcmVudGhlc2VzIGluIHRoZSBhcmdzCi0gICBzdHJpbmcgYXJlIGlnbm9yZWQgd2hlbiBhc3NlbWJsaW5nLCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQKLSAgIHdoZW4gZGlzYXNzZW1ibGluZy4KLQotICAgInkiIDMgYml0IHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JZKQotICAgIngiIDMgYml0IHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JYKQotICAgInoiIDMgYml0IHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JaKQotICAgIloiIDMgYml0IHJlZ2lzdGVyIChNSVBTMTZPUF8qX01PVkUzMlopCi0gICAidiIgMyBiaXQgc2FtZSByZWdpc3RlciBhcyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChNSVBTMTZPUF8qX1JYKQotICAgInciIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWSkKLSAgICIwIiB6ZXJvIHJlZ2lzdGVyICgkMCkKLSAgICJTIiBzdGFjayBwb2ludGVyICgkc3Agb3IgJDI5KQotICAgIlAiIHByb2dyYW0gY291bnRlcgotICAgIlIiIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyICgkcmEgb3IgJDMxKQotICAgIlgiIDUgYml0IE1JUFMgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUkVHUjMyKQotICAgIlkiIDUgYml0IE1JUFMgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUkVHMzJSKQotICAgIjYiIDYgYml0IHVuc2lnbmVkIGJyZWFrIGNvZGUgKE1JUFMxNk9QXypfSU1NNikKLSAgICJhIiAyNiBiaXQganVtcCBhZGRyZXNzCi0gICAiZSIgMTEgYml0IGV4dGVuc2lvbiB2YWx1ZQotICAgImwiIHJlZ2lzdGVyIGxpc3QgZm9yIGVudHJ5IGluc3RydWN0aW9uCi0gICAiTCIgcmVnaXN0ZXIgbGlzdCBmb3IgZXhpdCBpbnN0cnVjdGlvbgotCi0gICBUaGUgcmVtYWluaW5nIGNvZGVzIG1heSBiZSBleHRlbmRlZC4gIEV4Y2VwdCBhcyBvdGhlcndpc2Ugbm90ZWQsCi0gICB0aGUgZnVsbCBleHRlbmRlZCBvcGVyYW5kIGlzIGEgMTYgYml0IHNpZ25lZCB2YWx1ZS4KLSAgICI8IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlopIChmdWxsIDUgYml0IHVuc2lnbmVkKQotICAgIj4iIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWCkgKGZ1bGwgNSBiaXQgdW5zaWduZWQpCi0gICAiWyIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKLSAgICJdIiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDYgYml0IHVuc2lnbmVkKQotICAgIjQiIDQgYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTQpIChmdWxsIDE1IGJpdCBzaWduZWQpCi0gICAiNSIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkgiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDIgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJXIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiRCIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU01KQotICAgImoiIDUgYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiOCIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU04KQotICAgIlYiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDQgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJDIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTgpCi0gICAiVSIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU04KSAoZnVsbCAxNiBiaXQgdW5zaWduZWQpCi0gICAiayIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJLIiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQotICAgInAiIDggYml0IGNvbmRpdGlvbmFsIGJyYW5jaCBhZGRyZXNzIChNSVBTMTZPUF8qX0lNTTgpCi0gICAicSIgMTEgYml0IGJyYW5jaCBhZGRyZXNzIChNSVBTMTZPUF8qX0lNTTExKQotICAgIkEiIDggYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA0IChNSVBTMTZPUF8qX0lNTTgpCi0gICAiQiIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDggKE1JUFMxNk9QXypfSU1NNSkKLSAgICJFIiA1IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU01KQotICAgKi8KLQotLyogRm9yIHRoZSBtaXBzMTYsIHdlIHVzZSB0aGUgc2FtZSBvcGNvZGUgdGFibGUgZm9ybWF0IGFuZCBhIGZldyBvZgotICAgdGhlIHNhbWUgZmxhZ3MuICBIb3dldmVyLCBtb3N0IG9mIHRoZSBmbGFncyBhcmUgZGlmZmVyZW50LiAgKi8KLQotLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlguICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9YCQkgICAgMHgwMDAwMDAwMQotLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlkuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9ZCQkgICAgMHgwMDAwMDAwMgotLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlouICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9aCQkgICAgMHgwMDAwMDAwNAotLyogTW9kaWZpZXMgdGhlIFQgKCQyNCkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9UCQkgICAgMHgwMDAwMDAwOAotLyogTW9kaWZpZXMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfU1AJCSAgICAweDAwMDAwMDEwCi0vKiBNb2RpZmllcyB0aGUgUkEgKCQzMSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV8zMQkJICAgIDB4MDAwMDAwMjAKLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUczMlIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9HUFJfWQkJICAgIDB4MDAwMDAwNDAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9YCQkgICAgMHgwMDAwMDA4MAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlkuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1kJCSAgICAweDAwMDAwMTAwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9NT1ZFMzJaLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9aCQkgICAgMHgwMDAwMDIwMAotLyogUmVhZHMgdGhlIFQgKCQyNCkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1QJCSAgICAweDAwMDAwNDAwCi0vKiBSZWFkcyB0aGUgU1AgKCQyOSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1NQCQkgICAgMHgwMDAwMDgwMAotLyogUmVhZHMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF8zMQkJICAgIDB4MDAwMDEwMDAKLS8qIFJlYWRzIHRoZSBwcm9ncmFtIGNvdW50ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1BDCQkgICAgMHgwMDAwMjAwMAotLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JFR1IzMi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfR1BSX1gJCSAgICAweDAwMDA0MDAwCi0vKiBJcyBhIGJyYW5jaCBpbnNuLiAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9CUkFOQ0ggICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgZmxhZ3MgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIG1pcHMxNiBvcGNvZGUKLSAgIHRhYmxlOgotICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0gICBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCi0gICBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSAobmV2ZXIgdXNlZCkKLSAgIElOU05fUkVBRF9ISQotICAgSU5TTl9SRUFEX0xPCi0gICBJTlNOX1dSSVRFX0hJCi0gICBJTlNOX1dSSVRFX0xPCi0gICBJTlNOX1RSQVAKLSAgIElOU05fSVNBMwotICAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzMTZfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBiZmRfbWlwczE2X251bV9vcGNvZGVzOwotCi0jZW5kaWYgLyogX01JUFNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmYTk0Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogbW4xMDIwMC5oIC0tIEhlYWRlciBmaWxlIGZvciBNYXRzdXNoaXRhIDEwMjAwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEplZmYgTGF3LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1OMTAyMDBfSAotI2RlZmluZSBNTjEwMjAwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgbW4xMDIwMF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgbW4xMDIwMF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMjAwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgbW4xMDIwMF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgbW4xMDIwMF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IG1uMTAyMDBfb3BlcmFuZC4gICovCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9EUkVHIDB4MQotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9BUkVHIDB4MgotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QU1cgMHg0Ci0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX01EUiAweDgKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIDB4MTAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUFJPTU9URSAweDIwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BBUkVOIDB4NDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUQgMHg4MAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCAweDEwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLIDB4MjAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIDB4NDAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX01FTUFERFIgMHg4MDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUkVMQVggMHgxMDAwCi0KLSNkZWZpbmUgRk1UXzEgMQotI2RlZmluZSBGTVRfMiAyCi0jZGVmaW5lIEZNVF8zIDMKLSNkZWZpbmUgRk1UXzQgNAotI2RlZmluZSBGTVRfNSA1Ci0jZGVmaW5lIEZNVF82IDYKLSNkZWZpbmUgRk1UXzcgNwotI2VuZGlmIC8qIE1OMTAyMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oIGIvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmYwMzY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBtbjEwMzAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIE1hdHN1c2hpdGEgMTAzMDAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmVmZiBMYXcsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTU4xMDMwMF9ICi0jZGVmaW5lIE1OMTAzMDBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMzAwX29wY29kZS4gICovCi0KLSNkZWZpbmUgTU4xMDMwMF9NQVhfT1BFUkFORFMgOAotc3RydWN0IG1uMTAzMDBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBBIGJpdG1hc2suICBGb3IgZWFjaCBvcGVyYW5kLCBub256ZXJvIGlmIGl0IG11c3Qgbm90IGhhdmUgdGhlIHNhbWUKLSAgICAgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbiBhcyBhbGwgb3RoZXIgb3BlcmFuZHMgd2l0aCBhIG5vbnplcm8gYml0IGluCi0gICAgIHRoaXMgZmxhZy4gIGllIDB4ODEgd291bGQgaW5kaWNhdGUgdGhhdCBvcGVyYW5kcyA3IGFuZCAwIG11c3Qgbm90Ci0gICAgIG1hdGNoLiAgTm90ZSB0aGF0IHdlIGNvdW50IG9wZXJhbmRzIGZyb20gbGVmdCB0byByaWdodCBhcyB0aGV5IGFwcGVhcgotICAgICBpbiB0aGUgb3BlcmFuZHMgc3BlY2lmaWNhdGlvbiBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBub19tYXRjaF9vcGVyYW5kczsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JtYXQ7Ci0KLSAgLyogQml0bWFzayBpbmRpY2F0aW5nIHdoYXQgY3B1IHZhcmlhbnRzIHRoaXMgb3Bjb2RlIGlzIGF2YWlsYWJsZSBvbi4KLSAgICAgV2UgYXNzdW1lIG1uMTAzMDAgYmFzZSBvcGNvZGVzIGFyZSBhdmFpbGFibGUgZXZlcnl3aGVyZSwgc28gd2Ugb25seQotICAgICBoYXZlIHRvIG5vdGUgb3Bjb2RlcyB3aGljaCBhcmUgYXZhaWxhYmxlIG9uIG90aGVyIHZhcmlhbnRzLiAgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hpbmU7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1tNTjEwMzAwX01BWF9PUEVSQU5EU107Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlIG1uMTAzMDBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBtbjEwMzAwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAzMDBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBtbjEwMzAwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBtbjEwMzAwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCBtbjEwMzAwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX0RSRUcgMHgxCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX0FSRUcgMHgyCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1NQIDB4NAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QU1cgMHg4Ci0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01EUiAweDEwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCAweDIwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgMHg0MAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QQVJFTiAweDgwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEIDB4MTAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEIDB4MjAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1NQTElUIDB4NDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUIDB4ODAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIDB4MTAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9NRU1BRERSIDB4MjAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRUxBWCAweDQwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfVVNQIDB4ODAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TU1AgMHgxMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9NU1AgMHgyMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QQyAweDQwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX0VQU1cgMHg4MDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SUkVHIDB4MTAwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1hSUkVHIDB4MjAwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BMVVMgMHg0MDAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfMjRCSVQgMHg4MDAwMDAKLQotLyogT3Bjb2RlIEZvcm1hdHMuICAqLwotI2RlZmluZSBGTVRfUzAgMQotI2RlZmluZSBGTVRfUzEgMgotI2RlZmluZSBGTVRfUzIgMwotI2RlZmluZSBGTVRfUzQgNAotI2RlZmluZSBGTVRfUzYgNQotI2RlZmluZSBGTVRfRDAgNgotI2RlZmluZSBGTVRfRDEgNwotI2RlZmluZSBGTVRfRDIgOAotI2RlZmluZSBGTVRfRDQgOQotI2RlZmluZSBGTVRfRDUgMTAKLSNkZWZpbmUgRk1UX0Q2IDExCi0jZGVmaW5lIEZNVF9ENyAxMgotI2RlZmluZSBGTVRfRDggMTMKLSNkZWZpbmUgRk1UX0Q5IDE0Ci0jZGVmaW5lIEZNVF9EMTAgMTUKLQotLyogVmFyaWFudHMgb2YgdGhlIG1uMTAzMDAgd2hpY2ggaGF2ZSBhZGRpdGlvbmFsIG9wY29kZXMuICAqLwotI2RlZmluZSBNTjEwMyAzMDAKLSNkZWZpbmUgQU0zMCAgMzAwCi0KLSNkZWZpbmUgQU0zMyAzMzAKLQotI2VuZGlmIC8qIE1OMTAzMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbnAxLmggYi9pbmNsdWRlL29wY29kZS9ucDEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzYWRjNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9ucDEuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKiBQcmludCBHT1VMRCBOUEwgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgZ2xkX29wY29kZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICBjaGFyICphcmdzOwotICBpbnQgbGVuZ3RoOwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAotICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCi0gICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotCi0gICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKLSAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKLSAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCi0gICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKLSAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKLSAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKLSAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKLSAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCi0KLSAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCi0qLwotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLXN0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQotewoteyAibGIiLAkJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmIiLAkweGI4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxicyIsCTB4ZWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGgiLAkJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbmgiLAkweGI4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImx3IiwJCTB4YjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG53IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZCIsCQkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxuZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGkiLAkJMHhmODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJscGEiLAkweDUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhIiwJCTB4NTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGFiciIsCTB4NTgwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGJwIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsaHAiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImx3cCIsCTB4OTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGRwIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdWFiciIsCTB4NTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGYiLAkJMHhiYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZmJyIiwJMHhiYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsd2JyIiwJMHg1YzAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmYnIiLAkweGRjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0d2JyIiwJMHg1NDAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJ6bWIiLAkweGQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInptaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiem13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWQiLAkweGQ4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0YnAiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0aHAiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0d3AiLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZHAiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpbCIsCTB4ZjgwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEQiLAkJNCB9LAoteyAibHdzbDEiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3c2wyIiwJMHhmYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMyIsCTB4ZmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJsdmIiLAkweGIwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgImx2aCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZ3IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLXsgImxpdiIsCTB4M2MwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibGl2ZiIsCTB4M2MwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3R2YiIsCTB4ZDAwODAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2aCIsCTB4ZDAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2dyIsCTB4ZDAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2ZCIsCTB4ZDAwMDAwMDIsCTB4ZmMwODAwMDIsCSJ2LHhPQSxYIiwJNCB9LAotCi17ICJ0cnIiLAkweDJjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJuZCIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJhYnMiLAkweDJjMDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzZCIsCTB4MmMwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3IiLAkweDI4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImN4Y3IiLAkweDJjMDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImN4Y3JkIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCi17ICJ0cmJyIiwJMHgyODAzMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCi17ICJ4Y2JyIiwJMHgyODAyMDAwMCwJMHhmYzBmMDAwMCwJImIsQiIsCQkyIH0sCi17ICJ0YnJiciIsCTB4MjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAotCi17ICJ0cnZ2IiwJMHgyODA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZ2biIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm5kIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZhYiIsCTB4MmMwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWJkIiwJMHgyYzBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjbXB2IiwJMHgxNDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJleHB2IiwJMHgxNDA3MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bHQiLAkweDEwMDMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZsZSIsCTB4MTAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmd0IiwJMHgxNDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2Z2UiLAkweDE0MDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZlcSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dm5lIiwJMHgxMDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZybHQiLAkweDEwMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJsZSIsCTB4MTAwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmd0IiwJMHgxNDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZ2UiLAkweDE0MGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJlcSIsCTB4MTAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cm5lIiwJMHgxNDBmMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJ0cnZyIiwJMHgxNDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJ0cnJ2IiwJMHgxNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImJ1IiwJCTB4NDAwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJucyIsCTB4NzAwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuY28iLAkweDcwODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiZ2UiLAkweDcxMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmUiLAkweDcxODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5nZSIsCTB4NzIwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bmxlIiwJMHg3Mjg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmd0IiwJMHg3MzA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5hbnkiLAkweDczODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJicyIJLAkweDcwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiY28iLAkweDcwODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibHQiLAkweDcxMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiZXEiLAkweDcxODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidWdlIiwJMHg3MjAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVsdCIsCTB4NzI4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJsZSIsCTB4NzMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJhbnkiLAkweDczODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJicmxuayIsCTB4NDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmliIiwJMHg0ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaWgiLAkweDQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdyIsCTB4NGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmlkIiwJMHg0YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZiIiwJMHg2MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZoIiwJMHg2MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZ3IiwJMHg2NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZkIiwJMHg2NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNiIiwJMHg2ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNoIiwJMHg2ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnN3IiwJMHg2YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNkIiwJMHg2YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhbWIiLAkweDgwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWgiLAkweDgwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbXciLAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWQiLAkweDgwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2FyZCIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2kiLAkJMHhmODA1MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJjaGtibmQiLAkweDVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAiY2F2diIsCTB4MTAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY2F2ciIsCTB4MTAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiY2F2dmQiLAkweDEwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnJkIiwJMHgxMDBiMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYW5pIiwJMHhmODA4MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJvcm1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJvcm13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm9pIiwJCTB4ZjgwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlb2kiLAkweGY4MGEwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLQoteyAiYW52diIsCTB4MDQwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYW52ciIsCTB4MDQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAib3J2diIsCTB4MDgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAib3J2ciIsCTB4MDgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiZW92diIsCTB4MGMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZW92ciIsCTB4MGMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJzYWN6IiwJMHgxMDBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzbGEiLAkweDFjNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGxkIiwJMHgyMDYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JjIiwJMHgyNDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzZGEiLAkweDNjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkbCIsCTB4M2MwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RjIiwJMHgzYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGFkIiwJMHgzYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGxkIiwJMHgzYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgInN2ZGEiLAkweDNjMDcwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGwiLAkweDNjMDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGMiLAkweDNjMDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGFkIiwJMHgzYzBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsZCIsCTB4M2MwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJzYm0iLAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpibSIsCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidGJtIiwJMHhhODA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJpbmNtYiIsCTB4YTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY21oIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbXciLAkweGE0MDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtZCIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNibWQiLAkweDdjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInpibWQiLAkweDdjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInRibWQiLAkweDc4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAic3NtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6c20iLAkweDljMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRzbSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAotCi17ICJhZG1iIiwJMHhjODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1oIiwJMHhjODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhZG13IiwJMHhjODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1kIiwJMHhjODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFybWIiLAkweGU4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWgiLAkweGU4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFybXciLAkweGU4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWQiLAkweGU4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkaSIsCTB4ZjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAic3VtYiIsCTB4Y2MwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtaCIsCTB4Y2MwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtdyIsCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtZCIsCTB4Y2MwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdWkiLAkweGY4MDIwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgIm1wbWIiLAkweGMwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbWgiLAkweGMwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbXciLAkweGMwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wciIsCTB4MzgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZCIsCTB4M2MwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXBpIiwJMHhmODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImR2aSIsCTB4ZjgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZXhzIiwJMHgzODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImFkdnYiLAkweDMwMDAwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkdnZkIiwJMHgzMDA4MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHJ2IiwJMHgzNDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJhZHJ2ZCIsCTB4MzQwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3V2diIsCTB4MzAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3V2dmQiLAkweDMwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1cnYiLAkweDM0MDEwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1cnZkIiwJMHgzNDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcHZ2IiwJMHgzMDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2IiwJMHgzNDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkcmZ3IiwJMHgzODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmdyIsCTB4MzgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wcmZ3IiwJMHgzODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAicmZ3IiwJMHhlNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJyZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInJyZnciLAkweDBjMGUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycmZkIiwJMHgwYzBmMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotCi17ICJhZHZ2ZnciLAkweDMwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkdnZmZCIsCTB4MzAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydmZ3IiwJMHgzNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJhZHJ2ZmQiLAkweDM0MGMwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnZmdyIsCTB4MzAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3V2dmZkIiwJMHgzMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2ZnciLAkweDM0MDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1cnZmZCIsCTB4MzQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2dmZ3IiwJMHgzMDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHZ2ZmQiLAkweDMwMGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1wcnZmdyIsCTB4MzQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXBydmZkIiwJMHgzNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJydmZ3IiwJMHgzMDA3MDAwMCwJMHhmYzBmMDAwMCwJInYiLAkJMiB9LAoteyAicnZmZCIsCTB4MzAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLQoteyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2ZwZHMiLAkweDNjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLQoteyAiZmx0dnciLAkweDA4MGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZsdHZkIiwJMHgwODBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmaXh2dyIsCTB4MDgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dmQiLAkweDA4MGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNmcHZkcyIsCTB4MGMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAotCi17ICJvcnZybiIsCTB4MDAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiYW5kdnJuIiwJMHgwMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJmcnN0ZXEiLAkweDA0MDkwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21hIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYWQiLAkweDBjMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21mIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZmQiLAkweDA4MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInByb2RmIiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZmQiLAkweDA0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1heHYiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1heHZkIiwJMHgxMDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtaW52IiwJMHgxNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtaW52ZCIsCTB4MTQwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAotCi17ICJscHNkIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAibGRjIiwJMHhmMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAic3BtIiwJMHgwNDBjMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnBtIiwJMHgwNDBkMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJpdHIiLAkweDAwMDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJpdCIsCTB4MDAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwc3d0IiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZXhyIiwJMHhmODA3MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQk0IH0sCi17ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJub3AiLAkweDAwMDIwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImVpYWUiLAkweDAwMDMwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImVmYWUiLAkweDAwMGQwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImRpYWUiLAkweDAwMGUwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImRmYWUiLAkweDAwMGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInNwdmMiLAkweGY4MDYwMDAwLAkweGZjMGYwMDAwLAkicixULE4iLAk0IH0sCi17ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInNldGNwdSIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImNtYyIsCTB4MDAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRycmN1IiwJMHgwMDA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYXR0bmlvIiwJMHgwMDA1MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmdWRpdCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiYnJlYWsiLAkweDI4MDkwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImZyenNzIiwJMHgyODBhMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJyaXBpIiwJMHgwNDA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3AiLAkweDA0MDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJibG9jayIsCTB4MDQwNjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidW5ibG9jayIsCTB4MDQwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidHJzYyIsCTB4MDgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHNjciIsCTB4MDgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZnEiLAkJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZmx1cHRlIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnZpdSIsCTB4MDQwZjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibGRlbCIsCTB4MjgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGR1IiwJMHgyODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdGRlY2MiLAkweDI4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRycGMiLAkweDA4MDQwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cGNyIiwJMHgwODA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ2hhbHQiLAkweDBjMDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJncnVuIiwJMHgwYzA0MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ0bXByIiwJMHgyYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm1wIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgInRycnZlIiwJMHgyODA2MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2ZXIiLAkweDI4MDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnZsciIsCTB4MjgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAibGlua2ZsIiwJMHgxODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rYmwiLAkweDE4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmtmcCIsCTB4MTgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JwIiwJMHgxODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rcGwiLAkweDE4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rbCIsCTB4MTgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmtwIiwJMHgxODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua3RsIiwJMHgxODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua3RwIiwJMHgxODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi19OwotCi1pbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOwotCi1zdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLwotCQkgCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaCBiL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmI4YjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBuczMyay1vcGNvZGUuaCAtLSBPcGNvZGUgdGFibGUgZm9yIE5hdGlvbmFsIFNlbWkgMzJrIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNkZWZpbmUgREVGX01PREVMIDIxCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUMKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUwKLSNkZWZpbmUgREVGX01PREVMIDIwCi0jZW5kaWYKLS8qCi0gICBBZnRlciBkZWNpZGluZyB0aGUgaW5zdHJ1Y3Rpb24gZW50cnkgKHZpYSBoYXNoLmMpIHRoZSBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBvcGVyYW5kcyBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHJlcXVpcmVkIHNldAotICAgZ2l2ZW4gaW4gdGhlIGVudHJ5IG9wZXJhbmRmaWVsZC4gRXZlcnkgb3BlcmFuZCB3aWxsIHJlc3VsdCBpbiBhIGNoYW5nZSBpbgotICAgdGhlIG9wY29kZSBvciB0aGUgYWRkaXRpb24gb2YgZGF0YSB0byB0aGUgb3Bjb2RlLgotICAgVGhlIG9wZXJhbmRzIGluIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gYXJlIGNoZWNrZWQgZm9yIGluY29uc2lzdGVudAotICAgc2VtYW50aWNzLgotIAotCUYgOiAzMiBiaXQgZmxvYXQJZ2VuZXJhbCBmb3JtCi0JTCA6IDY0IGJpdCBmbG9hdAkgICAgIgotCUIgOiBieXRlCQkgICAgIgotCVcgOiB3b3JkCQkgICAgIgotCUQgOiBkb3VibGUtd29yZAkJICAgICIKLQlBIDogZG91YmxlLXdvcmQJCWdlbi1hZGRyZXNzLWZvcm0gaWUgbm8gcmVncywgbm8gaW1tZWRpYXRlCi0JSSA6IGludGVnZXIgd3JpdGVhYmxlICAgZ2VuIGludCBleGNlcHQgaW1tZWRpYXRlIChBICsgcmVnKQotCVogOiBmbG9hdGluZyB3cml0ZWFibGUJZ2VuIGZsb2F0IGV4Y2VwdCBpbW1lZGlhdGUgKFogKyBmcmVnKQotCWQgOiBkaXNwbGFjZW1lbnQKLQliIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAgYWNiCi0JcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGJyIGJjb25kIGJzciBjeHAKLQlxIDogcXVpY2sKLQlpIDogaW1tZWRpYXRlICg4IGJpdHMpCi0JICAgIFRoaXMgaXMgbm90IGEgc3RhbmRhcmQgbnMzMmsgb3BlcmFuZHR5cGUsIGl0IGlzIHVzZWQgdG8gYnVpbGQKLQkgICAgaW5zdHJ1Y3Rpb25zIGxpa2UgICAgc3ZjIGFyZzEsYXJnMgotCSAgICBTdmMgaXMgdGhlIGluc3RydWN0aW9uIFN1cGVyVmlzb3JDYWxsIGFuZCBpcyBzb21ldGltZXMgdXNlZCB0bwotCSAgICBjYWxsIE9TLXJvdXRpbmVzIGZyb20gdXNlcm1vZGUuIFNvbWUgYXJncyBtaWdodCBiZSBoYW5keSEKLQlyIDogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpCi0JTyA6IHNldGNmZyBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCUMgOiBjaW52IGluc3RydWN0aW9uIG9wdGlvbnNsaXN0Ci0JUyA6IHN0cmluZ2luc3RydWN0aW9uIG9wdGlvbnNsaXN0Ci0JVSA6IHJlZ2lzdGVybGlzdAlzYXZlLGVudGVyCi0JdSA6IHJlZ2lzdGVybGlzdAlyZXN0b3JlLGV4aXQKLQlNIDogbW11IHJlZ2lzdGVyCi0JUCA6IGNwdSByZWdpc3RlcgotCWcgOiAzOnJkIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JRyA6IDQ6dGggb3BlcmFuZCBvZiBpbnNzIG9yIGV4dHMgaW5zdHJ1Y3Rpb24KLQkgICAgVGhvc2Ugb3BlcmFuZHMgYXJlIGVuY29kZWQgaW4gdGhlIHNhbWUgYnl0ZS4KLQkgICAgVGhpcyBieXRlIGlzIHBsYWNlZCBsYXN0IGluIHRoZSBpbnN0cnVjdGlvbi4KLQlmIDogb3BlcmFuZCBvZiBzZnNyCi0JSCA6IHNlcXVlbnQtaGFjayBmb3IgYnNyIChXYXJuaW5nKQotCi1jb2x1bW4JMSAJaW5zdHJ1Y3Rpb25zCi0JMiAJbnVtYmVyIG9mIGJpdHMgaW4gb3Bjb2RlLgotCTMgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZSBleHBsaWNpdGx5Ci0JCWRldGVybWluZWQgYnkgdGhlIGluc3RydWN0aW9uIHR5cGUuCi0JNCAJb3Bjb2Rlc2VlZCwgdGhlIG51bWJlciB3ZSBidWlsZCBvdXIgb3Bjb2RlCi0JCWZyb20uCi0JNSAJb3BlcmFuZHR5cGVzLCB1c2VkIGJ5IG9wZXJhbmRwYXJzZXIuCi0JNiAJc2l6ZSBpbiBieXRlcyBvZiBpbW1lZGlhdGUKLSovCi1zdHJ1Y3QgbnMzMmtfb3Bjb2RlIHsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfaWRfc2l6ZTsgLyogbm90IHVzZWQgYnkgdGhlIGFzc2VtYmxlciAqLwotICB1bnNpZ25lZCBjaGFyIG9wY29kZV9zaXplOwotICB1bnNpZ25lZCBsb25nIG9wY29kZV9zZWVkOwotICBjaGFyICpvcGVyYW5kczsKLSAgdW5zaWduZWQgY2hhciBpbV9zaXplOwkvKiBub3QgdXNlZCBieSBkaXNzYXNzZW1ibGVyICovCi0gIGNoYXIgKmRlZmF1bHRfYXJnczsJCS8qIGRlZmF1bHQgdG8gdGhvc2UgYXJncyB3aGVuIG5vbmUgZ2l2ZW4gKi8KLSAgY2hhciBkZWZhdWx0X21vZGVjOwkJLyogZGVmYXVsdCB0byB0aGlzIGFkZHItbW9kZSB3aGVuIGFtYmlnb3VzCi0JCQkJICAgaWUgd2hlbiB0aGUgYXJndW1lbnQgb2YgYSBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIGlzIGEgcGxhaW4gY29uc3RhbnQgKi8KLSAgY2hhciBkZWZhdWx0X21vZGVsOwkJLyogaXMgYSBwbGFpbiBsYWJlbCAqLwotfTsKLQotI2lmZGVmIGNvbW1lbnQKLS8qIFRoaXMgc2VjdGlvbiB3YXMgZnJvbSB0aGUgZ2RiIHZlcnNpb24gb2YgdGhpcyBmaWxlLiAqLwotCi0jaWZuZGVmIG5zMzJrX29wY29kZVQKLSNkZWZpbmUgbnMzMmtfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyBuczMya19vcGNvZGVUICovCi0KLXN0cnVjdCBub3Rfd290CQkJLyogbnMzMmsgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0JCQkJLyogcGFydGljdWxhciBvcGNvZGUgKi8KLXsKLSAgaW50IG9iaXRzOwkJLyogbnVtYmVyIG9mIG9wY29kZSBiaXRzICovCi0gIGludCBpYml0czsJCS8qIG51bWJlciBvZiBpbnN0cnVjdGlvbiBiaXRzICovCi0gIG5zMzJrX29wY29kZVQJY29kZTsJLyogb3AtY29kZSAobWF5IGJlID4gOCBiaXRzISkgKi8KLSAgY2hhciAqYXJnczsJCS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi19OwotCi1zdHJ1Y3Qgbm90CQkJLyogbnMzMmsgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3Qgbm90X3dvdCAgICBkZXRhaWw7CS8qIHJlc3Qgb2Ygb3Bjb2RlIHRhYmxlICAgICAgICAgIFtkYXR1bV0gKi8KLX07Ci0KLS8qIEluc3RydWN0aW9ucyBsb29rIGxpa2UgdGhpczoKLSAgICAKLSAgIGJhc2ljIGluc3RydWN0aW9uLS0xLCAyLCBvciAzIGJ5dGVzCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEEsIGlmIG9wZXJhbmQgQSBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGluZGV4IGJ5dGUgZm9yIG9wZXJhbmQgQiwgaWYgb3BlcmFuZCBCIGlzIGluZGV4ZWQtLTEgYnl0ZQotICAgYWRkcmVzc2luZyBleHRlbnNpb24gZm9yIG9wZXJhbmQgQQotICAgYWRkcmVzc2luZyBleHRlbnNpb24gZm9yIG9wZXJhbmQgQgotICAgaW1wbGllZCBvcGVyYW5kcwotCi0gICBPcGVyYW5kIEEgaXMgdGhlIG9wZXJhbmQgbGlzdGVkIGZpcnN0IGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgT3BlcmFuZCBCIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBzZWNvbmQgaW4gdGhlIGZvbGxvd2luZyBvcGNvZGUgdGFibGUuCi0gICBBbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgYXQgbW9zdCAyIGdlbmVyYWwgb3BlcmFuZHMsIHNvIHRoaXMgaXMgZW5vdWdoLgotICAgVGhlIGltcGxpZWQgb3BlcmFuZHMgYXJlIGFzc29jaWF0ZWQgd2l0aCBvcGVyYW5kcyBvdGhlciB0aGFuIEEgYW5kIEIuCi0KLSAgIEVhY2ggb3BlcmFuZCBoYXMgYSBkaWdpdCBhbmQgYSBsZXR0ZXIuCi0gICAKLSAgIFRoZSBkaWdpdCBnaXZlcyB0aGUgcG9zaXRpb24gaW4gdGhlIGFzc2VtYmx5IGxhbmd1YWdlLiAgVGhlIGxldHRlciwKLSAgIG9uZSBvZiB0aGUgZm9sbG93aW5nLCB0ZWxscyB1cyB3aGF0IGtpbmQgb2Ygb3BlcmFuZCBpdCBpcy4gICovCi0KLS8qIEYgOiAzMiBiaXQgZmxvYXQKLSAqIEwgOiA2NCBiaXQgZmxvYXQKLSAqIEIgOiBieXRlCi0gKiBXIDogd29yZAotICogRCA6IGRvdWJsZS13b3JkCi0gKiBJIDogaW50ZWdlciBub3QgaW1tZWRpYXRlCi0gKiBaIDogZmxvYXRpbmcgbm90IGltbWVkaWF0ZQotICogZCA6IGRpc3BsYWNlbWVudAotICogcSA6IHF1aWNrCi0gKiBpIDogaW1tZWRpYXRlICg4IGJpdHMpCi0gKiByIDogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpCi0gKiBwIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotKi8KLQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSBuczMya19vcGNvZGVzW109Ci17Ci0gIHsgImFic2YiLAkxNCwyNCwJMHgzNWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnNsIiwJMTQsMjQsCTB4MzRiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzYiIsCTE0LDI0LAkweDMwNGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic3ciLAkxNCwyNCwJMHgzMTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnNkIiwJMTQsMjQsCTB4MzM0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNiYiIsCSA3LDE2LAkweDRjLAkiMkkxcTNwIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNidyIsCSA3LDE2LAkweDRkLAkiMkkxcTNwIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNiZCIsCSA3LDE2LAkweDRmLAkiMkkxcTNwIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkZiIsCTE0LDI0LAkweDAxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGwiLAkxNCwyNCwJMHgwMGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRiIiwJIDYsMTYsCTB4MDAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHciLAkgNiwxNiwJMHgwMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkZCIsCSA2LDE2LAkweDAzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjYiIsCSA2LDE2LAkweDEwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjdyIsCSA2LDE2LAkweDExLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjZCIsCSA2LDE2LAkweDEzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwYiIsCTE0LDI0LAkweDNjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHB3IiwJMTQsMjQsCTB4M2Q0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGQiLAkxNCwyNCwJMHgzZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxYiIsCSA3LDE2LAkweDBjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxdyIsCSA3LDE2LAkweDBkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxZCIsCSA3LDE2LAkweDBmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRyIiwJIDYsMTYsCTB4MjcsCSIxQTJJIiwJCTQsCSIiLAkyMSwyMQl9LAotICB7ICJhZGpzcGIiLAkxMSwxNiwJMHgwNTdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3B3IiwJMTEsMTYsCTB4MDU3ZCwJIjFXIiwgCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGpzcGQiLAkxMSwxNiwJMHgwNTdmLAkiMUQiLCAJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZGIiLAkgNiwxNiwJMHgyOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kdyIsCSA2LDE2LAkweDI5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRkIiwJIDYsMTYsCTB4MmIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGIiLAkxNCwyNCwJMHgwNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2h3IiwJMTQsMjQsCTB4MDU0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNoZCIsCTE0LDI0LAkweDA3NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJlcSIsCSA4LDgsCTB4MGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYm5lIiwJIDgsOCwJMHgxYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY3MiLAkgOCw4LAkweDJhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJjYyIsCSA4LDgsCTB4M2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhpIiwJIDgsOCwJMHg0YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHMiLAkgOCw4LAkweDVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJndCIsCSA4LDgsCTB4NmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxlIiwJIDgsOCwJMHg3YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZnMiLAkgOCw4LAkweDhhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJmYyIsCSA4LDgsCTB4OWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxvIiwJIDgsOCwJMHhhYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiaHMiLAkgOCw4LAkweGJhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsdCIsCSA4LDgsCTB4Y2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmdlIiwJIDgsOCwJMHhkYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidXQiLAkgOCw4LAkweGVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJ1ZiIsCSA4LDgsCTB4ZmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmljYiIsCSA2LDE2LAkweDA4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWN3IiwJIDYsMTYsCTB4MDksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY2QiLAkgNiwxNiwJMHgwYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljcHNyYiIsCTExLDE2LAkweDE3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcnciLAkxMSwxNiwJMHgxN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaXNwc3JiIiwJMTEsMTYsCTB4MzdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNydyIsCTExLDE2LAkweDM3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJwdCIsCSA4LDgsCTB4ZjIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYnIiLAkgOCw4LAkweGVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0gIHsgImJzciIsCSA4LDgsCTB4MDIsCSIxSCIsCQkwLAkiIiwJMjEsMjEJfSwKLSNlbHNlCi0gIHsgImJzciIsCSA4LDgsCTB4MDIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSNlbmRpZgotICB7ICJjYXNlYiIsCTExLDE2LAkweDc3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2V3IiwJMTEsMTYsCTB4NzdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2FzZWQiLAkxMSwxNiwJMHg3N2YsCSIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0YiIsCTE0LDI0LAkweDA4NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXR3IiwJMTQsMjQsCTB4MDk0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGQiLAkxNCwyNCwJMHgwYjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aWIiLAkxNCwyNCwJMHgwYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aXciLAkxNCwyNCwJMHgwZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aWQiLAkxNCwyNCwJMHgwZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja2IiLAkxMSwyNCwJMHgwZWUsCSIyQTNCMXIiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja3ciLAkxMSwyNCwJMHgxZWUsCSIyQTNXMXIiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja2QiLAkxMSwyNCwJMHgzZWUsCSIyQTNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaW52IiwJMTQsMjQsCTB4MjcxZSwJIjJEMUMiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wZiIsCTE0LDI0LAkweDA5YmUsCSIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGwiLAkxNCwyNCwJMHgwOGJlLAkiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBiIiwJIDYsMTYsCTB4MDQsCSIxQjJCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHciLAkgNiwxNiwJMHgwNSwJIjFXMlciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wZCIsCSA2LDE2LAkweDA3LAkiMUQyRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtYiIsCTE0LDI0LAkweDA0Y2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtdyIsCTE0LDI0LAkweDA1Y2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtZCIsCTE0LDI0LAkweDA3Y2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxYiIsCSA3LDE2LAkweDFjLAkiMkIxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxdyIsCSA3LDE2LAkweDFkLAkiMlcxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxZCIsCSA3LDE2LAkweDFmLAkiMkQxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzYiIsCTE2LDI0LAkweDA0MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHN3IiwJMTYsMjQsCTB4MDUwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2QiLAkxNiwyNCwJMHgwNzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdCIsCTE2LDI0LAkweDg0MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWIiLAkxNCwyNCwJMHgzNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb213IiwJMTQsMjQsCTB4MzU0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tZCIsCTE0LDI0LAkweDM3NGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN2dHAiLAkxMSwyNCwJMHgwMzZlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY3hwIiwJIDgsOCwJMHgyMiwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJjeHBkIiwJMTEsMTYsCTB4MDdmLAkiMUEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpYiIsCTE0LDI0LAkweDJjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaXciLAkxNCwyNCwJMHgyZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWlkIiwJMTQsMjQsCTB4MmZjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGlhIiwJIDgsOCwJMHhjMiwJIiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZmIiwJMTQsMjQsCTB4MjFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2bCIsCTE0LDI0LAkweDIwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmIiLAkxNCwyNCwJMHgzY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZ3IiwJMTQsMjQsCTB4M2RjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZCIsCTE0LDI0LAkweDNmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImVudGVyIiwJIDgsOCwJMHg4MiwJIjFVMmQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXhpdCIsCSA4LDgsCTB4OTIsCSIxdSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRiIiwJMTEsMjQsCTB4MDJlLAkiMkkzQjFyNGQiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHR3IiwJMTEsMjQsCTB4MTJlLAkiMkkzVzFyNGQiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRkIiwJMTEsMjQsCTB4MzJlLAkiMkkzRDFyNGQiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzYiIsCTE0LDI0LAkweDBjY2UsCSIxSTJJNEczZyIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHN3IiwJMTQsMjQsCTB4MGRjZSwJIjFJMkk0RzNnIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2QiLAkxNCwyNCwJMHgwZmNlLAkiMUkySTRHM2ciLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNiIiwJMTQsMjQsCTB4MDQ2ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzdyIsCTE0LDI0LAkweDA1NmUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc2QiLAkxNCwyNCwJMHgwNzZlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbGFnIiwJIDgsOCwJMHhkMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZiIiwJMTQsMjQsCTB4M2MzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmdyIsCTE0LDI0LAkweDNkM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZmQiLAkxNCwyNCwJMHgzZjNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxiIiwJMTQsMjQsCTB4MzgzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsdyIsCTE0LDI0LAkweDM5M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybGQiLAkxNCwyNCwJMHgzYjNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0YiIsCTE0LDI0LAkweDM4NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXR3IiwJMTQsMjQsCTB4Mzk0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGQiLAkxNCwyNCwJMHgzYjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleGIiLAkxMSwyNCwJMHg0MmUsCSIyQjNCMXIiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleHciLAkxMSwyNCwJMHg1MmUsCSIyVzNXMXIiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleGQiLAkxMSwyNCwJMHg3MmUsCSIyRDNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNiIiwJMTEsMjQsCTB4MGFlLAkiMkIzSTFyNGQiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnN3IiwJMTEsMjQsCTB4MWFlLAkiMlczSTFyNGQiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNkIiwJMTEsMjQsCTB4M2FlLAkiMkQzSTFyNGQiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzYiIsCTE0LDI0LAkweDA4Y2UsCSIxQjJJNEczZyIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3N3IiwJMTQsMjQsCTB4MDljZSwJIjFXMkk0RzNnIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2QiLAkxNCwyNCwJMHgwYmNlLAkiMUQySTRHM2ciLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJqc3IiLAkxMSwxNiwJMHg2N2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAianVtcCIsCTExLDE2LAkweDI3ZiwJIjFBIiwJCTQsCSIiLAkyMSwyMQl9LAotICB7ICJsZnNyIiwJMTksMjQsCTB4MDBmM2UsIjFEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxtciIsCTE1LDI0LAkweDBiMWUsCSIyRDFNIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcmIiLAkgNywxNiwJMHg2YywJIjJCMVAiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHBydyIsCSA3LDE2LAkweDZkLAkiMlcxUCIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJkIiwJIDcsMTYsCTB4NmYsCSIyRDFQIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGIiLAkxNCwyNCwJMHgxNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2h3IiwJMTQsMjQsCTB4MTU0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNoZCIsCTE0LDI0LAkweDE3NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWIiLAkxNCwyNCwJMHgyNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWl3IiwJMTQsMjQsCTB4MjVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpZCIsCTE0LDI0LAkweDI3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGIiLAkxNCwyNCwJMHgzOGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2R3IiwJMTQsMjQsCTB4MzljZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kZCIsCTE0LDI0LAkweDNiY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmYiLAkxNCwyNCwJMHgwNWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZsIiwJMTQsMjQsCTB4MDRiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YiIsCSA2LDE2LAkweDE0LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3IiwJIDYsMTYsCTB4MTUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmQiLAkgNiwxNiwJMHgxNywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YmYiLAkxNCwyNCwJMHgwNDNlLAkiMUIyWiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3ZiIsCTE0LDI0LAkweDA1M2UsCSIxVzJaIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmRmIiwJMTQsMjQsCTB4MDczZSwJIjFEMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YmwiLAkxNCwyNCwJMHgwMDNlLAkiMUIyWiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3bCIsCTE0LDI0LAkweDAxM2UsCSIxVzJaIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmRsIiwJMTQsMjQsCTB4MDMzZSwJIjFEMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZmwiLAkxNCwyNCwJMHgxYjNlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZsZiIsCTE0LDI0LAkweDE2M2UsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm1iIiwJMTQsMjQsCTB4MDBjZSwJIjFBMkEzYiIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm13IiwJMTQsMjQsCTB4MDFjZSwJIjFBMkEzYiIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm1kIiwJMTQsMjQsCTB4MDNjZSwJIjFBMkEzYiIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnFiIiwJIDcsMTYsCTB4NWMsCSIySTFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnF3IiwJIDcsMTYsCTB4NWQsCSIySTFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnFkIiwJIDcsMTYsCTB4NWYsCSIySTFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnNiIiwJMTYsMjQsCTB4MDAwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3ciLAkxNiwyNCwJMHgwMTBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzZCIsCTE2LDI0LAkweDAzMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN0IiwJMTYsMjQsCTB4ODAwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3ViIiwJMTQsMjQsCTB4MGNhZSwJIjFBMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3V3IiwJMTQsMjQsCTB4MGRhZSwJIjFBMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3VkIiwJMTQsMjQsCTB4MGZhZSwJIjFBMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXNiIiwJMTQsMjQsCTB4MWNhZSwJIjFBMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXN3IiwJMTQsMjQsCTB4MWRhZSwJIjFBMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXNkIiwJMTQsMjQsCTB4MWZhZSwJIjFBMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eGJkIiwJMTQsMjQsCTB4MWNjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eHdkIiwJMTQsMjQsCTB4MWRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eGJ3IiwJMTQsMjQsCTB4MTBjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92emJkIiwJMTQsMjQsCTB4MThjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92endkIiwJMTQsMjQsCTB4MTljZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92emJ3IiwJMTQsMjQsCTB4MTRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsZiIsCTE0LDI0LAkweDMxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGwiLAkxNCwyNCwJMHgzMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxiIiwJMTQsMjQsCTB4MjBjZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsdyIsCTE0LDI0LAkweDIxY2UsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGQiLAkxNCwyNCwJMHgyM2NlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdmIiwJMTQsMjQsCTB4MTViZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnbCIsCTE0LDI0LAkweDE0YmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2IiLAkxNCwyNCwJMHgyMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWd3IiwJMTQsMjQsCTB4MjE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZCIsCTE0LDI0LAkweDIzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vcCIsCSA4LDgsCTB4YTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90YiIsCTE0LDI0LAkweDI0NGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdHciLAkxNCwyNCwJMHgyNTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3RkIiwJMTQsMjQsCTB4Mjc0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JiIiwJIDYsMTYsCTB4MTgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9ydyIsCSA2LDE2LAkweDE5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcmQiLAkgNiwxNiwJMHgxYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvYiIsCTE0LDI0LAkweDMwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b3ciLAkxNCwyNCwJMHgzMWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW9kIiwJMTQsMjQsCTB4MzNjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmR2YWwiLAkxOSwyNCwJMHgwMDMxZSwiMUEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtYiIsCTE0LDI0LAkweDM0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbXciLAkxNCwyNCwJMHgzNWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW1kIiwJMTQsMjQsCTB4MzdjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVzdG9yZSIsCSA4LDgsCTB4NzIsCSIxdSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZXQiLAkgOCw4LAkweDEyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0aSIsCSA4LDgsCTB4NTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0dCIsCSA4LDgsCTB4NDIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RiIiwJMTQsMjQsCTB4MDA0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90dyIsCTE0LDI0LAkweDAxNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdGQiLAkxNCwyNCwJMHgwMzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZiIiwJMTQsMjQsCTB4MjQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmdyIsCTE0LDI0LAkweDI1M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZmQiLAkxNCwyNCwJMHgyNzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxiIiwJMTQsMjQsCTB4MjAzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsdyIsCTE0LDI0LAkweDIxM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbGQiLAkxNCwyNCwJMHgyMzNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyeHAiLAkgOCw4LAkweDMyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxYiIsCTExLDE2LAkweDNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxdyIsCTExLDE2LAkweDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxZCIsCTExLDE2LAkweDNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25lYiIsCTExLDE2LAkweGJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25ldyIsCTExLDE2LAkweGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25lZCIsCTExLDE2LAkweGJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzYiIsCTExLDE2LAkweDEzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc3ciLAkxMSwxNiwJMHgxM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3NkIiwJMTEsMTYsCTB4MTNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjYiIsCTExLDE2LAkweDFiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY3ciLAkxMSwxNiwJMHgxYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2NkIiwJMTEsMTYsCTB4MWJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpYiIsCTExLDE2LAkweDIzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaXciLAkxMSwxNiwJMHgyM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGlkIiwJMTEsMTYsCTB4MjNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzYiIsCTExLDE2LAkweDJiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc3ciLAkxMSwxNiwJMHgyYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHNkIiwJMTEsMTYsCTB4MmJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0YiIsCTExLDE2LAkweDMzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndHciLAkxMSwxNiwJMHgzM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3RkIiwJMTEsMTYsCTB4MzNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlYiIsCTExLDE2LAkweDNiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZXciLAkxMSwxNiwJMHgzYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGVkIiwJMTEsMTYsCTB4M2JmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzYiIsCTExLDE2LAkweDQzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3ciLAkxMSwxNiwJMHg0M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnNkIiwJMTEsMTYsCTB4NDNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjYiIsCTExLDE2LAkweDRiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY3ciLAkxMSwxNiwJMHg0YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmNkIiwJMTEsMTYsCTB4NGJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvYiIsCTExLDE2LAkweDUzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb3ciLAkxMSwxNiwJMHg1M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG9kIiwJMTEsMTYsCTB4NTNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzYiIsCTExLDE2LAkweDViYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc3ciLAkxMSwxNiwJMHg1YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHNkIiwJMTEsMTYsCTB4NWJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0YiIsCTExLDE2LAkweDYzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdHciLAkxMSwxNiwJMHg2M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHRkIiwJMTEsMTYsCTB4NjNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlYiIsCTExLDE2LAkweDZiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZXciLAkxMSwxNiwJMHg2YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2VkIiwJMTEsMTYsCTB4NmJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0YiIsCTExLDE2LAkweDczYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dHciLAkxMSwxNiwJMHg3M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXRkIiwJMTEsMTYsCTB4NzNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmYiIsCTExLDE2LAkweDdiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZnciLAkxMSwxNiwJMHg3YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZkIiwJMTEsMTYsCTB4N2JmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2F2ZSIsCSA4LDgsCTB4NjIsCSIxVSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0YiIsICAgIDE0LDI0LAkweDE4NGUsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXR3IiwJMTQsMjQsCTB4MTk0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGQiLAkxNCwyNCwJMHgxYjRlLAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aWIiLAkxNCwyNCwJMHgxYzRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aXciLAkxNCwyNCwJMHgxZDRlLAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aWQiLAkxNCwyNCwJMHgxZjRlLAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZXRjZmciLAkxNSwyNCwJMHgwYjBlLAkiMU8iLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzciIsCTE0LDI0LAkweDM3M2UsCSIxZiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzYiIsCTE2LDI0LAkweDBjMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHN3IiwJMTYsMjQsCTB4MGQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2QiLAkxNiwyNCwJMHgwZjBlLCAiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdCIsCTE2LDI0LAkweDhjMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNtciIsCTE1LDI0LAkweDBmMWUsCSIySTFNIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcmIiLAkgNywxNiwJMHgyYywJIjJJMVAiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3BydyIsCSA3LDE2LAkweDJkLAkiMkkxUCIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJkIiwJIDcsMTYsCTB4MmYsCSIySTFQIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmYiLAkxNCwyNCwJMHgxMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJsIiwJMTQsMjQsCTB4MTBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViYiIsCSA2LDE2LAkweDIwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJ3IiwJIDYsMTYsCTB4MjEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmQiLAkgNiwxNiwJMHgyMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY2IiLAkgNiwxNiwJMHgzMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY3ciLAkgNiwxNiwJMHgzMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY2QiLAkgNiwxNiwJMHgzMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicGIiLAkxNCwyNCwJMHgyYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwdyIsCTE0LDI0LAkweDJkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBkIiwJMTQsMjQsCTB4MmY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSNpZmRlZiBOUzMyS19TVkNfSU1NRURfT1BFUkFORFMKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIjJpMWkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwgLyogbm90IHJlYWxseSwgYnV0IHNvbWUgdW5peCB1c2VzIGl0ICovCi0jZWxzZQotICB7ICJzdmMiLAkgOCw4LAkweGUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jZW5kaWYKLSAgeyAidGJpdGIiLAkgNiwxNiwJMHgzNCwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidGJpdHciLAkgNiwxNiwJMHgzNSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidGJpdGQiLAkgNiwxNiwJMHgzNywJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmYiIsCTE0LDI0LAkweDJjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZnciLAkxNCwyNCwJMHgyZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2ZkIiwJMTQsMjQsCTB4MmYzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsYiIsCTE0LDI0LAkweDI4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbHciLAkxNCwyNCwJMHgyOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2xkIiwJMTQsMjQsCTB4MmIzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAid2FpdCIsCSA4LDgsCTB4YjIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAid3J2YWwiLAkxOSwyNCwJMHgwMDcxZSwiMUEiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9yYiIsCSA2LDE2LAkweDM4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3J3IiwJIDYsMTYsCTB4MzksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmQiLAkgNiwxNiwJMHgzYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90ZiIsCTE0LDI0LCAgMHgwZGZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkb3RsIiwJMTQsMjQsICAweDBjZmUsICIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxvZ2JmIiwJMTQsMjQsICAweDE1ZmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxvZ2JsIiwJMTQsMjQsICAweDE0ZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInBvbHlmIiwJMTQsMjQsICAweDA5ZmUsICIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInBvbHlsIiwJMTQsMjQsICAweDA4ZmUsICIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjYWxiZiIsCTE0LDI0LCAgMHgxMWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmwiLAkxNCwyNCwgIDB4MTBmZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbnVtb3Bjb2Rlcz1zaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSAqY29uc3QgZW5kb3AgPSBuczMya19vcGNvZGVzK3NpemVvZihuczMya19vcGNvZGVzKS9zaXplb2YobnMzMmtfb3Bjb2Rlc1swXSk7Ci0KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBBUkdfTEVOIDUwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BqLmggYi9pbmNsdWRlL29wY29kZS9wai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzU5YjYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3BqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgZGVjb2RpbmcgdGhlIHBpY29KYXZhIG9wY29kZSB0YWJsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIFRyYW5zbWV0YSAoc2FjQHBvYm94LmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogTmFtZXMgdXNlZCB0byBkZXNjcmliZSB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBhcmd1bWVudHMsIHVzZWQgYnkKLSAgIHRoZSBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlci4gIEF0dHJpYnV0ZXMgYXJlIGVuY29kZWQgaW4gdmFyaW91cyBmaWVsZHMuICovCi0KLS8qICAgICAgICAgICAgcmVsb2MgIHNpemUgcGNyZWwgICAgdW5zICovCi0jZGVmaW5lIE9fTiAgICAwCi0jZGVmaW5lIE9fMTYgICgxPDw0IHwgMiB8ICgwPDw2KSB8ICgwPDwzKSkKLSNkZWZpbmUgT19VMTYgKDE8PDQgfCAyIHwgKDA8PDYpIHwgKDE8PDMpKQotI2RlZmluZSBPX1IxNiAoMjw8NCB8IDIgfCAoMTw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fOCAgICgzPDw0IHwgMSB8ICgwPDw2KSB8ICgwPDwzKSkKLSNkZWZpbmUgT19VOCAgKDM8PDQgfCAxIHwgKDA8PDYpIHwgKDE8PDMpKQotI2RlZmluZSBPX1I4ICAoNDw8NCB8IDEgfCAoMDw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fUjMyICg1PDw0IHwgNCB8ICgxPDw2KSB8ICgwPDwzKSkKLSNkZWZpbmUgT18zMiAgKDY8PDQgfCA0IHwgKDA8PDYpIHwgKDA8PDMpKQotCi0jZGVmaW5lIEFTSVpFKHgpICAoKHgpICYgMHg3KQotI2RlZmluZSBQQ1JFTCh4KSAgKCEhKCh4KSAmICgxPDw2KSkpCi0jZGVmaW5lIFVOUyh4KSAgICAoISEoKHgpICYgKDE8PDMpKSkKLQotICAgICAgICAgICAgICAgICAgCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgc2hvcnQgb3Bjb2RlOwotICBzaG9ydCBvcGNvZGVfbmV4dDsKLSAgY2hhciBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgYXJnWzJdOwotICBjb25zdCBjaGFyICpuYW1lOwotfSBwal9vcGNfaW5mb190OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcG4uaCBiL2luY2x1ZGUvb3Bjb2RlL3BuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTlhMmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvcG4uaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKiBQcmludCBHT1VMRCBQTiAoUG93ZXJOb2RlKSBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXN0cnVjdCBnbGRfb3Bjb2RlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIGNoYXIgKmFyZ3M7Ci0gIGludCBsZW5ndGg7Ci19OwotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0Ci0gICBpcyB0aGUgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgIGlzIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgYXQgbW9zdCBmb3VyLiAgVGhlIGxlbmd0aCBvZiB0aGUKLSAgIGluc3RydWN0aW9uIGlzIGJhc2VkIG9uIHRoZSBvcGNvZGUuCi0KLSAgIFRoZSBtYXNrIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaAotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycwotICAgdGhhdCBhcmUgdXNlZCB0byBmb3JtYXQgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24uICovCi0KLS8qIEtpbmRzIG9mIG9wZXJhbmRzOgotICAgciAgUmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFIgIFJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgYiAgQmFzZSByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQiAgQmFzZSByZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIHYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgViAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBBICBPcHRpb25hbCBhZGRyZXNzIHJlZ2lzdGVyIChiYXNlIHJlZ2lzdGVyKQotICAgWCAgT3B0aW9uYWwgaW5kZXggcmVnaXN0ZXIKLSAgIEkgIEltbWVkaWF0ZSBkYXRhICgxNmJpdHMgc2lnbmVkKQotICAgTyAgT2Zmc2V0IGZpZWxkICgxNmJpdHMgc2lnbmVkKQotICAgaCAgT2Zmc2V0IGZpZWxkICgxNWJpdHMgc2lnbmVkKQotICAgZCAgT2Zmc2V0IGZpZWxkICgxNGJpdHMgc2lnbmVkKQotICAgUyAgU2hpZnQgY291bnQgZmllbGQKLQotICAgYW55IG90aGVyIGNoYXJhY3RlcnMgYXJlIHByaW50ZWQgYXMgaXMuLi4KLSovCi0KLS8qIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCB0aGlzIGFycmF5IGJlIHNvcnRlZCBhcyBmb2xsb3dzOgotICAgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICAgQWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvcGVyYW5kcwotICAgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAqLwotc3RydWN0IGdsZF9vcGNvZGUgZ2xkX29wY29kZXNbXSA9Ci17Ci17ICJhYm0iLAkweGEwMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgImFiciIsCTB4MTgwODAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJMiB9LAoteyAiYWNpIiwJMHhmYzc3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJhZGZkIiwJMHhlMDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZGZ3IiwJMHhlMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZGkiLAkweGM4MDEwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImFkbWIiLAkweGI4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbWQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbWgiLAkweGI4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFkbXciLAkweGI4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkciIsCTB4MzgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZmQiLAkweDM4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcmZ3IiwJMHgzODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJtIiwJMHgzODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhaSIsIAkweGZjMDMwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJhbm1iIiwJMHg4NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1kIiwJMHg4NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1oIiwJMHg4NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhbm13IiwJMHg4NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbnIiLAkweDA0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFybWIiLAkweGU4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWQiLAkweGU4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWgiLAkweGU4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFybXciLAkweGU4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJjZiIsCTB4ZjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJJLHhPQSxYIiwJNCB9LAoteyAiYmN0IiwJMHhlYzAwMDAwMCwJMHhmYzA4MDAwMCwJIkkseE9BLFgiLAk0IH0sCi17ICJiZWkiLAkweDAwMDYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImJmdCIsCTB4ZjAwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJpYiIsCTB4ZjQwMDAwMDAsCTB4ZmM3ODAwMDAsCSJyLHhPQSIsCTQgfSwKLXsgImJpZCIsCTB4ZjQ2MDAwMDAsCTB4ZmM3ODAwMDAsCSJyLHhPQSIsCTQgfSwKLXsgImJpaCIsCTB4ZjQyMDAwMDAsCTB4ZmM3ODAwMDAsCSJyLHhPQSIsCTQgfSwKLXsgImJpdyIsCTB4ZjQ0MDAwMDAsCTB4ZmM3ODAwMDAsCSJyLHhPQSIsCTQgfSwKLXsgImJsIiwgCTB4Zjg4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJzdWIiLAkweDVjMDgwMDAwLAkweGZmOGYwMDAwLAkiIiwJCTIgfSwKLXsgImJzdWJtIiwJMHgyODA4MDAwMCwJMHhmYzA4MDAwMCwJIiIsCQk0IH0sCi17ICJidSIsIAkweGVjMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJjYWxsIiwJMHgyODA4MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJjYWxsbSIsCTB4NWMwODAwMDAsCTB4ZmY4ODAwMDAsCSIiLAkJNCB9LAoteyAiY2FtYiIsCTB4OTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtZCIsCTB4OTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtaCIsCTB4OTAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiY2FtdyIsCTB4OTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLnhPQSxYIiwJNCB9LAoteyAiY2FyIiwJMHgxMDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjZCIsIAkweGZjMDYwMDAwLAkweGZjMDcwMDAwLAkicixmIiwJCTQgfSwKLXsgImNlYSIsCTB4MDAwZjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiY2kiLCAJMHhjODA1MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJjbWMiLAkweDA0MGEwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJjbW1iIiwJMHg5NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjbW1kIiwJMHg5NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjbW1oIiwJMHg5NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjbW13IiwJMHg5NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjbXIiLAkweDE0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImRhY2kiLAkweGZjN2YwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImRhZSIsCTB4MDAwZTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiZGFpIiwJMHhmYzA0MDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZGNpIiwJMHhmYzZmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJkaSIsIAkweGZjMDEwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJkdmZkIiwJMHhlNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJkdmZ3IiwJMHhlNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdmkiLAkweGM4MDQwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImR2bWIiLAkweGM0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2bWgiLAkweGM0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImR2bXciLAkweGM0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2ciIsCTB4MzgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZHZyZmQiLAkweDM4MGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTQgfSwKLXsgImR2cmZ3IiwJMHgzODA0MDAwMCwJMHhmYzBmMDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlYWUiLAkweDAwMDgwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImVjaSIsCTB4ZmM2NzAwMDAsCTB4ZmM3ZjgwODAsCSJyLEkiLAkJNCB9LAoteyAiZWN3Y3MiLAkweGZjNGYwMDAwLAkweGZjN2Y4MDAwLAkiIiwJCTQgfSwKLXsgImVpIiwgCTB4ZmMwMDAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImVvbWIiLAkweDhjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWQiLAkweDhjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWgiLAkweDhjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbXciLAkweDhjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvciIsCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZW9ybSIsCTB4MGMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZXMiLCAJMHgwMDA0MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAiZXhtIiwJMHhhODAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiZXhyIiwJMHhjODA3MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAiZXhyciIsCTB4YzgwNzAwMDIsCTB4ZmM3ZjAwMDIsCSJyIiwJCTIgfSwKLXsgImZpeGQiLAkweDM4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeHciLAkweDM4MDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdGQiLAkweDM4MGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdHciLAkweDM4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImdyaW8iLAkweGZjM2YwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImhhbHQiLAkweDAwMDAwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImhpbyIsCTB4ZmMzNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiandjcyIsCTB4ZmEwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImxhIiwgCTB4NTAwMDAwMDAsCTB4ZmMwMDAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGFiciIsCTB4NTgwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGIiLCAJMHhhYzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsY3MiLCAJMHgwMDAzMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAibGQiLCAJMHhhYzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsZWFyIiwgCTB4ODAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGYiLCAJMHhjYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZmJyIiwgCTB4Y2MwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGgiLCAJMHhhYzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsaSIsIAkweGM4MDAwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImxtYXAiLAkweDJjMDcwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJsbWIiLAkweGIwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxtZCIsCTB4YjAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibG1oIiwJMHhiMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbXciLAkweGIwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxuYiIsCTB4YjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5kIiwJMHhiNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbmgiLAkweGI0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxudyIsCTB4YjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHBzZCIsCTB4Zjk4MDAwMDAsCTB4ZmY4ODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHBzZGNtIiwJMHhmYTgwMDAwMCwJMHhmZjg4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsdyIsIAkweGFjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3YnIiLCAJMHg1YzAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJtcGZkIiwJMHhlNDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJtcGZ3IiwJMHhlNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcGkiLAkweGM4MDMwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgIm1wbWIiLAkweGMwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbWgiLAkweGMwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbXciLAkweGMwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wciIsCTB4MzgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZmQiLAkweDM4MGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmZ3IiwJMHgzODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJub3AiLAkweDAwMDIwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgIm9ybWIiLAkweDg4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybWQiLAkweDg4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybWgiLAkweDg4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgIm9ybXciLAkweDg4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm9yciIsCTB4MDgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAib3JybSIsCTB4MDgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAicmRzdHMiLAkweDAwMDkwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJyZXR1cm4iLAkweDI4MGUwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInJpIiwgCTB4ZmMwMjAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgInJuZCIsCTB4MDAwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwc3d0IiwJMHgwNDBiMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicnNjaG5sIiwJMHhmYzJmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJyc2N0bCIsCTB4ZmM0NzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAicndjcyIsCTB4MDAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2FjeiIsCTB4MTAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2JtIiwJMHg5ODA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJzYnIiLAkweDE4MDAwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTQgfSwKLXsgInNlYSIsCTB4MDAwZDAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAic2V0Y3B1IiwJMHgyYzA5MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAic2lvIiwJMHhmYzE3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJzaXB1IiwJMHgwMDBhMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJzbGEiLAkweDFjNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYWQiLAkweDIwNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYyIsCTB4MjQ0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsIiwJMHgxYzYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGxkIiwJMHgyMDYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbWMiLAkweDA0MDcwMDAwLAkweGZjMDcwMDAwLAkiIiwJCTIgfSwKLXsgInNyYSIsCTB4MWMwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhZCIsCTB4MjAwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JjIiwJMHgyNDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmwiLAkweDFjMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybGQiLAkweDIwMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInN0YiIsCTB4ZDQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkIiwJMHhkNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGYiLAkweGRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZmJyIiwJMHg1NDAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdGgiLAkweGQ0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0bWIiLAkweGQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0bWQiLAkweGQ4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0bWgiLAkweGQ4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0bXciLAkweGQ4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0cGlvIiwJMHhmYzI3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJzdHciLAkweGQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0d2JyIiwJMHg1NDAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdWFiciIsCTB4NTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3VmZCIsCTB4ZTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VmdyIsCTB4ZTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VpIiwJMHhjODAyMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJzdW1iIiwJMHhiYzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdW1kIiwJMHhiYzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdW1oIiwJMHhiYzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdW13IiwJMHhiYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXIiLAkweDNjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZkIiwJMHgzODBiMDAwMCwJMHhmYzBmMDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmdyIsCTB4MzgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VybSIsCTB4M2MwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3ZjIiwJMHhjODA2MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQk0IH0sCi17ICJ0Ym0iLAkweGE0MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRiciIsCTB4MTgwYzAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJMiB9LAoteyAidGJyciIsCTB4MmMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEIiLAkJMiB9LAoteyAidGNjciIsCTB4MjgwNDAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoteyAidGQiLCAJMHhmYzA1MDAwMCwJMHhmYzA3MDAwMCwJInIsZiIsCQk0IH0sCi17ICJ0aW8iLAkweGZjMWYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInRtYXByIiwJMHgyYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cGNiciIsCTB4MjgwYzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRyYnIiLAkweDJjMDEwMDAwLAkweGZjMGYwMDAwLAkiYixSIiwJCTIgfSwKLXsgInRyYyIsCTB4MmMwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJjYyIsCTB4MjgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoteyAidHJjbSIsCTB4MmMwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJuIiwJMHgyYzA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm5tIiwJMHgyYzBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnIiLAkweDJjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRycm0iLAkweDJjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyc2MiLAkweDJjMGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyc3ciLAkweDI4MDAwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJ0c2NyIiwJMHgyYzBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1ZWkiLAkweDAwMDcwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgIndhaXQiLAkweDAwMDEwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgIndjd2NzIiwJMHhmYzVmMDAwMCwJMHhmYzdmODAwMCwJIiIsCQk0IH0sCi17ICJ3d2NzIiwJMHgwMDBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y2JyIiwJMHgyODAyMDAwMCwJMHhmYzBmMDAwMCwJImIsQiIsCQkyIH0sCi17ICJ4Y3IiLAkweDJjMDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjcm0iLAkweDJjMGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInpibSIsCTB4OWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiemJyIiwJMHgxODA0MDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJ6bWIiLAkweGY4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInptZCIsCTB4ZjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1oIiwJMHhmODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJ6bXciLAkweGY4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInpyIiwgCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLX07Ci0KLWludCBudW1vcGNvZGVzID0gc2l6ZW9mKGdsZF9vcGNvZGVzKSAvIHNpemVvZihnbGRfb3Bjb2Rlc1swXSk7Ci0KLXN0cnVjdCBnbGRfb3Bjb2RlICplbmRvcCA9IGdsZF9vcGNvZGVzICsgc2l6ZW9mKGdsZF9vcGNvZGVzKSAvCi0JCXNpemVvZihnbGRfb3Bjb2Rlc1swXSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wcGMuaCBiL2luY2x1ZGUvb3Bjb2RlL3BwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZlM2M3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3BwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qIHBwYy5oIC0tIEhlYWRlciBmaWxlIGZvciBQb3dlclBDIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgUFBDX0gKLSNkZWZpbmUgUFBDX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAotICAgICBzcGVjaWZpYyBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcwotICAgICBhcmUgbGlzdGVkIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSBwb3dlcnBjX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wY29kZS4gICovCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX1BQQyAoMDEpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIgKFJTLzYwMDApIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUE9XRVIgKDAyKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBPV0VSMiAoUmlvcyAyKSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSMiAoMDQpCi0KLS8qIE9wY29kZSBpcyBvbmx5IGRlZmluZWQgb24gMzIgYml0IGFyY2hpdGVjdHVyZXMuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzMyICgwMTApCi0KLS8qIE9wY29kZSBpcyBvbmx5IGRlZmluZWQgb24gNjQgYml0IGFyY2hpdGVjdHVyZXMuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzY0ICgwMjApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxIHByb2Nlc3Nvci4gIFRoZSA2MDEKLSAgIGlzIGFzc3VtZWQgdG8gc3VwcG9ydCBhbGwgUG93ZXJQQyAoUFBDX09QQ09ERV9QUEMpIGluc3RydWN0aW9ucywKLSAgIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIG1hbnkgYWRkaXRpb25hbCBQT1dFUiBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzYwMSAoMDQwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGluIGJvdGggdGhlIFBvd2VyIGFuZCBQb3dlclBDIGFyY2hpdGVjdHVyZXMKLSAgIChpZSwgY29tcGlsZXIncyAtbWNwdT1jb21tb24gb3IgYXNzZW1ibGVyJ3MgLW1jb20pLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9DT01NT04gKDAxMDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgZm9yIGFueSBQb3dlciBvciBQb3dlclBDIHBsYXRmb3JtICh0aGlzIGlzCi0gICBmb3IgdGhlIGFzc2VtYmxlcidzIC1tYW55IG9wdGlvbiwgYW5kIGl0IGVsaW1pbmF0ZXMgZHVwbGljYXRlcykuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX0FOWSAoMDIwMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSA2NC1iaXQgYnJpZGdlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82NF9CUklER0UgKDA0MDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgQWx0aXZlYyBWZWN0b3IgVW5pdCAqLwotI2RlZmluZSBQUENfT1BDT0RFX0FMVElWRUMgICAoMDEwMDApCi0KLS8qIEEgbWFjcm8gdG8gZXh0cmFjdCB0aGUgbWFqb3Igb3Bjb2RlIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBQUENfT1AoaSkgKCgoaSkgPj4gMjYpICYgMHgzZikKLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kLiAgKi8KLQotc3RydWN0IHBvd2VycGNfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKG9wICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQgKG1vc3Qgb3BlcmFuZHMKLSAgICAgY2FuIGFjY2VwdCBhbnkgdmFsdWUpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgaW50ICppbnZhbGlkKSk7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBwb3dlcnBjX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCBwb3dlcnBjX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9TSUdORUQgKDAxKQotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKLSAgIHJhbmdlIG9mIHZhbHVlcyB3aGVuIHJ1bm5pbmcgaW4gMzIgYml0IG1vZGUuICBUaGF0IGlzLCBpZiBiaXRzIGlzCi0gICAxNiwgaXQgdGFrZXMgYW55IHZhbHVlIGZyb20gLTB4ODAwMCB0byAweGZmZmYuICBJbiA2NCBiaXQgbW9kZSwKLSAgIHRoaXMgZmxhZyBpcyBpZ25vcmVkLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfU0lHTk9QVCAoMDIpCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcwotICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcyBzdWNoIGFzIG1yLCBmb3Igd2hpY2ggdHdvCi0gICBvcGVyYW5kcyBmaWVsZHMgYXJlIGlkZW50aWNhbC4gIFRoZSBhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlCi0gICBpbnNlcnQgZnVuY3Rpb24gd2l0aCBhbnkgb3AgdmFsdWUuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjYWxsCi0gICB0aGUgZXh0cmFjdCBmdW5jdGlvbiwgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUsIGFuZCBjaGVjayB0aGUgdmFsdWUKLSAgIHBsYWNlZCBpbiB0aGUgdmFsaWQgYXJndW1lbnQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9GQUtFICgwNCkKLQotLyogVGhlIG5leHQgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbgotICAgc2VwYXJhdGVkIGZyb20gdGhpcyBvbmUgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kCi0gICBzdG9yZSBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UKLSAgICAgICByZWcsZGlzcGxhY2VtZW50KHJlZykKLSAgICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1BBUkVOUyAoMDEwKQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IHVzZSB0aGUgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBDUiBmaWVsZHMsIHdoaWNoCi0gICBhcmUKLSAgICAgICBsdCAgMAlndCAgMQllcSAgMglzbyAgMwl1biAgMwotICAgICAgIGNyMCAwCWNyMSAxCWNyMiAyCWNyMyAzCi0gICAgICAgY3I0IDQJY3I1IDUJY3I2IDYJY3I3IDcKLSAgIFRoZXNlIG1heSBiZSBjb21iaW5lZCBhcml0aG1ldGljYWxseSwgYXMgaW4gY3IyKjQrZ3QuICBUaGVzZSBhcmUKLSAgIG9ubHkgc3VwcG9ydGVkIG9uIHRoZSBQb3dlclBDLCBub3QgdGhlIFBPV0VSLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfQ1IgKDAyMCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyIHVzZXMgdGhpcyB0byBwcmludAotICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfR1BSICgwNDApCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdmJy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0ZQUiAoMDEwMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9SRUxBVElWRSAoMDIwMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0FCU09MVVRFICgwNDAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgb3B0aW9uYWwsIGFuZCBpcyB6ZXJvIGlmIG9taXR0ZWQuICBUaGlzIGlzIHVzZWQgZm9yCi0gICB0aGUgb3B0aW9uYWwgQkYgYW5kIEwgZmllbGRzIGluIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gIFRoZQotICAgYXNzZW1ibGVyIG11c3QgY291bnQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgb24gdGhlIGxpbmUsCi0gICBhbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgZm9yIHRoZSBvcGNvZGUsIGFuZCBkZWNpZGUKLSAgIHdoZXRoZXIgdGhpcyBvcGVyYW5kIGlzIHByZXNlbnQgb3Igbm90LiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQKLSAgIHByaW50IHRoaXMgb3BlcmFuZCBvdXQgb25seSBpZiBpdCBpcyBub3QgemVyby4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX09QVElPTkFMICgwMTAwMCkKLQotLyogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCB3aXRoIFBQQ19PUEVSQU5EX09QVElPTkFMLiAgSWYgdGhpcyBvcGVyYW5kCi0gICBpcyBvbWl0dGVkLCB0aGVuIGZvciB0aGUgbmV4dCBvcGVyYW5kIHVzZSB0aGlzIG9wZXJhbmQgdmFsdWUgcGx1cwotICAgMSwgaWdub3JpbmcgdGhlIG5leHQgb3BlcmFuZCBmaWVsZCBmb3IgdGhlIG9wY29kZS4gIFRoaXMgd3JldGNoZWQKLSAgIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIFBvd2VyIHJvdGF0ZSBpbnN0cnVjdGlvbnMgY2FuIHRha2UKLSAgIGVpdGhlciA0IG9yIDUgb3BlcmFuZHMuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBwcmludCB0aGlzIG9wZXJhbmQKLSAgIG91dCByZWdhcmRsZXNzIG9mIHRoZSBQUENfT1BFUkFORF9PUFRJT05BTCBmaWVsZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX05FWFQgKDAyMDAwKQotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKLSAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKLSAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQotICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCi0gICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVHQVRJVkUgKDA0MDAwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSB2ZWN0b3IgdW5pdCByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAndicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9WUiAoMDEwMDAwKQotCi0MCi0vKiBUaGUgUE9XRVIgYW5kIFBvd2VyUEMgYXNzZW1ibGVycyB1c2UgYSBmZXcgbWFjcm9zLiAgV2Uga2VlcCB0aGVtCi0gICB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBtYWNybyB0YWJsZSBpcyBhbgotICAgYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfbWFjcm8uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3M7Ci0KLSNlbmRpZiAvKiBQUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHlyLmggYi9pbmNsdWRlL29wY29kZS9weXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MzJiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9weXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKiBweXJhbWlkLm9wY29kZS5oIC0tIGdkYiBpbml0aWFsIGF0dGVtcHQuICovCi0KLS8qIHB5cmFtaWQgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzCi0gICBwYXJ0aWN1bGFyIG9wY29kZSAqLwotCi1zdHJ1Y3QgcHlyX2RhdHVtCi17Ci0gIGNoYXIgICAgICAgICAgICAgIG5hcmdzOwotICBjaGFyICogICAgICAgICAgICBhcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB1bnNpZ25lZCBsb25nICAgICBtYXNrOwkvKiBCaXQgdmVjdG9yOiB3aGljaCBvcGVyYW5kIG1vZGVzIGFyZSB2YWxpZAotCQkJCSAgIGZvciB0aGlzIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyICAgICBjb2RlOwkvKiBvcC1jb2RlIChhbHdheXMgNig/KSBiaXRzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBweXJfaW5zbl9mb3JtYXQgewotICAgIHVuc2lnbmVkIGludCBtb2RlIDo0OwotICAgIHVuc2lnbmVkIGludCBvcGVyYXRvciA6ODsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfc2NhbGUgOjI7Ci0gICAgdW5zaWduZWQgaW50IGluZGV4X3JlZyA6NjsKLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZF8xIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzI6NjsKLX0gcHlyX2luc25fZm9ybWF0OwotCQotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMuCi0gICBQeXJhbWlkIGlzIHN1ZmZpY2llbnRseSBSSVNDeSB0aGF0OgotICAgICAgLSBpbnNucyBhcmUgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiB3b3JkczsKLSAgICAgIC0gdGhlIGxlbmd0aCBvZiBhbnkgaW5zbiBjYW4gYmUgdG9sZCBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mCi0gICAgICAgIHRoZSBpbnNuLiAoaWUsIGlmIHRoZXJlIGFyZSB6ZXJvLCBvbmUsIG9yIHR3byB3b3JkcyBvZgotCWltbWVkaWF0ZSBvcGVyYW5kL29mZnNldCkuCi0KLSAgIAotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZiBvcGVyYW5kOwotICAgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBtYXNrCSBhc3NlbWJsZXIgc3ludGF4CWRlc2NyaXB0aW9uCi0gICAweDAwMDE6ICBtb3Z3IFJuLFJuCQlyZWdpc3RlciB0byByZWdpc3RlcgotICAgMHgwMDAyOiAgbW92dyBLLFJuCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwNDogIG1vdncgSSxSbgkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwODogIG1vdncgKFJuKSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgCSAgICBtb3Z3IChSbilbeF0sUm4JcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIDB4MDAxMDogIG1vdncgSShSbiksUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgSShSbilbeF0sUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0LCBpbmRleGVkLCB0byByZWdpc3RlcgotCi0gICAweDAwMjA6ICBtb3Z3IFJuLChSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgICAgICAgCi0gICAweDAwNDA6ICBtb3Z3IEssKFJuKQkJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0ICAgICAgICAgCi0gICAweDAwODA6ICBtb3Z3IEksKFJuKQkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgCi0gICAweDAxMDA6ICBtb3Z3IChSbiksKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotCi0gICAweDA0MDA6ICBtb3Z3IFJuLEkoUm4pCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgwODAwOiAgbW92dyBLLEkoUm4pCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSSxJKFJuKQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSShSbiksSShSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAJCQkJCStvZmZzZXQKLSAgIDB4MDAwMDogIChpcnJlZ3VsYXIpCQk/Pz8KLSAgIAotCi0gICBFYWNoIGluc24gaGFzIGEgZm91ci1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIHR5cGUocykgb2YgaXRzIG9wZXJhbmRzLgotKi8KLQotLyogU29tZSBjb21tb24gY29tYmluYXRpb25zCi0gICAqLwotCi0vKiB0aGUgZmlyc3QgNSwoMHgxfDB4MnwweDR8MHg4fDB4MTApIGllICgxfDJ8NHw4fDE2KSwgaWUgKCAzMiAtMSkqLwotI2RlZmluZSBHRU5fVE9fUkVHICgzMSkKLQotI2RlZmluZQlVTktOT1dOICgodW5zaWduZWQgbG9uZyktMSkKLSNkZWZpbmUgQU5ZIChHRU5fVE9fUkVHIHwgKEdFTl9UT19SRUcgPDwgNSkgfCAoR0VOX1RPX1JFRyA8PCAxNSkpCi0KLSNkZWZpbmUgQ09OVkVSVCAoMXw4fDB4MTB8MHgyMHwweDIwMCkKLQotI2RlZmluZSBLX1RPX1JFRyAoMikKLSNkZWZpbmUgSV9UT19SRUcgKDQpCi0jZGVmaW5lIE5PVEtfVE9fUkVHIChHRU5fVE9fUkVHICYgfktfVE9fUkVHKQotI2RlZmluZSBOT1RJX1RPX1JFRyAoR0VOX1RPX1JFRyAmIH5JX1RPX1JFRykKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi0KLXN0cnVjdCBweXJfb3Bjb2RlCQkvKiBweXIgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3QgcHlyX2RhdHVtICBkYXR1bTsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSBweXJfaG93IGFyZ3MKLSNkZWZpbmUgcHlyX25hcmdzIG5hcmdzCi0jZGVmaW5lIHB5cl9tYXNrIG1hc2sKLSNkZWZpbmUgcHlyX25hbWUgbmFtZQotCi1zdHJ1Y3QgcHlyX29wY29kZSBweXJfb3Bjb2Rlc1tdID0KLXsKLSAgeyJtb3ZiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MTF9LCB9LAotICB7Im1vdmgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMn0gfSwKLSAgeyJtb3Z3IiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTB9IH0sCi0gIHsibW92bCIsCXsgMiwgIiIsIEFOWSwJCQkweDEzfSB9LAotICB7Im1uZWd3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTR9IH0sCi0gIHsibW5lZ2YiLAl7IDIsICIiLCAweDEsCQkJMHgxNX0gfSwKLSAgeyJtbmVnZCIsCXsgMiwgIiIsIDB4MSwJCQkweDE2fSB9LAotICB7Im1jb213IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTd9IH0sCi0gIHsibWFic3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxOH0gfSwKLSAgeyJtYWJzZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE5fSB9LAotICB7Im1hYnNkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWF9IH0sCi0gIHsibXRzdHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxY30gfSwKLSAgeyJtdHN0ZiIsCXsgMiwgIiIsIDB4MSwJCQkweDFkfSB9LAotICB7Im10c3RkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWV9IH0sCi0gIHsibW92YSIsCXsgMiwgIiIsIDB4OHwweDEwLAkJMHgxZn0gfSwKLSAgeyJtb3Z6YnciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMH0gfSwKLSAgeyJtb3Z6aHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMX0gfSwKLQkJCQkvKiAyIGluc25zIG91dCBvZiBvcmRlciBoZXJlICovCi0gIHsibW92YmwiLAl7IDIsICIiLCAxLAkJCTB4NGZ9IH0sCi0gIHsiZmlsYmwiLAl7IDIsICIiLCAxLAkJCTB4NGV9IH0sCi0KLSAgeyJjdnRidyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDIyfSB9LAotICB7ImN2dGh3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjN9IH0sCi0gIHsiY3Z0d2IiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNH0gfSwKLSAgeyJjdnR3aCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI1fSB9LAotICB7ImN2dHdmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjZ9IH0sCi0gIHsiY3Z0d2QiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyN30gfSwKLSAgeyJjdnRmdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI4fSB9LAotICB7ImN2dGZkIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjl9IH0sCi0gIHsiY3Z0ZHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyYX0gfSwKLSAgeyJjdnRkZiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJifSB9LAotCi0gIHsiYWRkdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQwfSB9LAotICB7ImFkZHdjIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDF9IH0sCi0gIHsic3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQyfSB9LAotICB7InN1YndiIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDN9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NH0gfSwKLSAgeyJtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDV9IH0sCi0gIHsiZW11bCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ3fSB9LAotICB7InVtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDZ9IH0sCi0gIHsiZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ4fSB9LAotICB7ImVkaXYiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0YX0gfSwKLSAgeyJyZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRifSB9LAotICB7InVkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDl9IH0sCi0gIHsibW9kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRjfSB9LAotICB7InVtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGR9IH0sCi0KLQotICB7ImFkZGYiLAl7IDIsICIiLCAxLAkJCTB4NTB9IH0sCi0gIHsiYWRkZCIsCXsgMiwgIiIsIDEsCQkJMHg1MX0gfSwKLSAgeyJzdWJmIiwJeyAyLCAiIiwgMSwJCQkweDUyfSB9LAotICB7InN1YmQiLAl7IDIsICIiLCAxLAkJCTB4NTN9IH0sCi0gIHsibXVsZiIsCXsgMiwgIiIsIDEsCQkJMHg1Nn0gfSwKLSAgeyJtdWxkIiwJeyAyLCAiIiwgMSwJCQkweDU3fSB9LAotICB7ImRpdmYiLAl7IDIsICIiLCAxLAkJCTB4NTh9IH0sCi0gIHsiZGl2ZCIsCXsgMiwgIiIsIDEsCQkJMHg1OX0gfSwKLQotCi0gIHsiY21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYxfSB9LAotICB7ImNtcGgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Mn0gfSwKLSAgeyJjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjB9IH0sCi0gIHsidWNtcGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Nn0gfSwKLSAgLyogV0hZIG5vICJ1Y21waCI/Pz8gKi8KLSAgeyJ1Y21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY1fSB9LAotICB7InhjaHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwZn0gfSwKLQotCi0gIHsiYW5kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMwfSB9LAotICB7Im9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMxfSB9LAotICB7InhvcnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzMn0gfSwKLSAgeyJiaWN3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzN9IH0sCi0gIHsibHNobHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzOH0gfSwKLSAgeyJhc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNhfSB9LAotICB7ImFzaGxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2N9IH0sCi0gIHsiYXNocnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzYn0gfSwKLSAgeyJhc2hybCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNkfSB9LAotICB7InJvdGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2V9IH0sCi0gIHsicm90cnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZn0gfSwKLQotICAvKiBwdXNoIGFuZCBwb3AgaW5zbnMgYXJlICJnb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsicHVzaHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgwY30gfSwKLSAgeyJwb3B3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MGR9IH0sCi0gIHsicHVzaGEiLAl7IDIsICIiLCAoMHg4fDB4MTApLAkJMHgwZX0gfSwKLQotICB7ImJpdHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MzV9IH0sCi0gIHsiYml0Y3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNn0gfSwKLSAgLyogc29tZSBraW5kIG9mIGlicmEvZGJyYSBpbnNucz8/Ki8KLSAgeyJpY21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY3fSB9LAotICB7ImRjbXB3IiwJeyAyLCAiIiwgKDF8NHwweDIwfDB4ODB8MHg0MDB8MHgxMDAwKSwJMHg2OX0gfSwvKkZJWE1FKi8KLSAgeyJhY21wdyIsCXsgMiwgIiIsIDEsCQkJMHg2Yn0gfSwKLQotICAvKiBDYWxsIGlzIHdyaXR0ZW4gYXMgYSAxLW9wIGluc24sIGJ1dCBpcyBhbHdheXMgKGRpcylhc3NlbWJsZWQgYXMgYSAyLW9wCi0gICAgIGluc24gd2l0aCBhIDJuZCBvcCBvZiB0cjE0LiAgIFRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIHRvIGdyb2sgdGhpcy4gICovCi0gIHsiY2FsbCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotICB7ImNhbGwiLAl7IDEsICIiLCBHRU5fVE9fUkVHLAkJMHgwNH0gfSwKLQotICB7ImNhbGxrIiwJeyAxLCAiIiwgVU5LTk9XTiwJCTB4MDZ9IH0sLyogc3lzdGVtIGNhbGw/Ki8KLSAgLyogUmV0IGlzIHVzdWFsbHkgd3JpdHRlbiBhcyBhIDAtb3AgaW5zbiwgYnV0IGdldHMgZGlzYXNzZW1ibGVkIGFzIGEKLSAgICAgMS1vcCBpbnNuLiBUaGUgb3BlcmFuZCBpcyBhbHdheXMgdHIxNS4gKi8KLSAgeyJyZXQiLAl7IDAsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJyZXQiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJhZHNmIiwJeyAyLCAiIiwgKDF8Mnw0KSwJCTB4MDh9IH0sCi0gIHsicmV0ZCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBhfSB9LAotICB7ImJ0YyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAxfSB9LAotICB7ImJmYyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAyfSB9LAotICAvKiBDYXJlZnVsOiBoYWx0IGlzIDB4MDAwMDAwMDAuIEp1bXAgbXVzdCBoYXZlIHNvbWUgb3RoZXIgKG1vZGU/KWJpdCBzZXQ/PyAqLwotICB7Imp1bXAiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJidHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHhmMDB9IH0sCi0gIC8qIHJlYWQgY29udHJvbC1zdGFjayBwb2ludGVyIGlzIGFub3RoZXIgMS1vci0yIG9wZXJhbmQgaW5zbi4gKi8KLSAgeyJyY3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDFmfSB9LAotICB7InJjc3AiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0KLX07Ci0KLS8qIGVuZDogcHlyYW1pZC5vcGNvZGUuaCAqLwotLyogT25lIGRheSBJIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSB0aW1lIHRvIGZpbmQgb3V0IHdoYXQgb3BlcmFuZHMKLSAgIGFyZSB2YWxpZCBmb3IgdGhlc2UgaW5zbnMsIGFuZCBndWVzcyBhdCB3aGF0IHRoZXkgbWVhbi4KLQotICAgSSBjYW4ndCBpbWFnaW5lIHdoYXQgdGhlICJJPz8/IiBpbnNucyAoaWdsb2IsIGV0YykgZG8uCi0KLSAgIHRoZSBhcml0aG1ldGljLXNvdW5kaW5nIGluc25zIGVuZGluZyBpbiAicCIgc291bmQgYXdmdWxseSBsaWtlIEJDRAotICAgYXJpdGhtZXRpYyBpbnNuczoKLSAgIAlkc2hscCAtPiBEZWNpbWFsIFNIaWZ0IExlZnQgUGFja2VkCi0JZHNocnAgLT4gRGVjaW1hbCBTSGlmdCBSaWdodCBQYWNrZWQKLSAgIGFuZCBjdnRscCB3b3VsZCBiZSBjb252ZXJ0IGxvbmcgdG8gcGFja2VkLgotICAgSSBoYXZlIG5vIGlkZWEgaG93IHRoZSBvcGVyYW5kcyBhcmUgaW50ZXJwcmV0ZWQ7IGJ1dCBoYXZpbmcgdGhlbSBiZQotICAgYSBsb25nIHJlZ2lzdGVyIHdpdGggKGFkZHJlc3MsIGxlbmd0aCkgb2YgYW4gaW4tbWVtb3J5IHBhY2tlZCBCQ0Qgb3BlcmFuZAotICAgd291bGQgbm90IGJlIHN1cnByaXNpbmcuCi0gICBUaGV5IGFyZSB1bmxpa2VseSB0byBiZSBhIHBhY2tlZCBiY2Qgc3RyaW5nOiA2NCBiaXRzIG9mIGxvbmcgZ2l2ZQotICAgaXMgb25seSAxNSBkaWdpdHMrc2lnbiwgd2hpY2ggaXNuJ3QgZW5vdWdoIGZvciBDT0JPTC4KLSAqLyAKLSNpZiAwCi0gIHsid2NzcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlIGNzcD8qLwotICAvKiBUaGUgT1N4IE9wZXJhdGluZyBTeXN0ZW0gUG9ydGluZyBHdWlkZSBjbGFpbXMgU1NMIGRvZXMgdGhpbmdzCi0gICAgIHdpdGggdHIxMiAoYSByZWdpc3RlciByZXNlcnZlZCB0byBpdCkgdG8gZG8gd2l0aCBzdGF0aWMgYmxvY2stc3RydWN0dXJlCi0gICAgIHJlZmVyZW5jZXMuICBTU0w9U2V0IFN0YXRpYyBMaW5rPyAgSXQncyAiR29pbmcgYXdheSBuZXh0IHJlbGVhc2UiLiAqLwotICB7InNzbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImNjbXBzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGNkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidWVtdWwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp1bnNpZ25lZCBlbXVsKi8KLSAgeyJzcmYiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypHaWRnZXQgdGltZT8/PyovCi0gIHsibW5lZ3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgL21vdmUtbmVnIHBoeXM/Ki8KLSAgeyJsZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHBoeXM/Ki8KLSAgeyJsZHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGRiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R0aSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0YiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0dSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImFkZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdWJwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibXVscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRpdnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJkc2hscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAgLyogZGVjIHNobCBwYWNrZWQ/ICovCi0gIHsiZHNocnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogZGVjIHNociBwYWNrZWQ/ICovCi0gIHsibW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKm1vdmUgKHN0cmluZz8pPyovCi0gIHsiY21wcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgcGh5cz8qLwotICB7ImNtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY21wIChzdHJpbmc/KT8qLwotICB7ImN2dGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGN2dCBsb25nIHRvIHA/PyovCi0gIHsiY3Z0cGwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IHAgdG8gbD8/Ki8KLSAgeyJkaW50ciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyBpbnRyID8qLwotICB7InJwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiByZWFkIHBoeXMgd29yZD8qLwotICB7IndwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBwaHlzIHdvcmQ/Ki8KLSAgeyJjbW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InJzdWJ3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYmljcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNsciBiaXQgaW4gcHN3PyAqLwotICB7ImJpc3BzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBzZXQgYml0IGluIHBzdz8gKi8KLSAgeyJlaW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogPz8gP2lvID8gKi8KLSAgeyJjYWxscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjYWxsIHBoeXM/Ki8KLSAgeyJjYWxsciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImxwY3h0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbG9hZCBwcm9jIGNvbnRleHQqLwotICB7InJlaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJldCBmcm9tIGludHJwdCovCi0gIHsicnBvcnQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXBvcnQ/Ki8KLSAgeyJydG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmVhZC10aW1lLW9mLWRheT8qLwotICB7InNzaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InZ0cGEiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp2aXJ0LXRvLXBoeXMtYWRkcj8qLwotICB7IndpY2wiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogd3JpdGUgaWNsID8gKi8KLSAgeyJ3cG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlLXBvcnQ/Ki8KLSAgeyJ3dG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtdGltZS1vZi1kYXk/Ki8KLSAgeyJmbGljIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiaWdsb2IiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBnbG9iYWw/ICovCi0gIHsiaXBoeXMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaHlzaWNhbD8gKi8KLSAgeyJpcGlkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgcGlkPyAqLwotICB7Iml2ZWN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgdmVjdG9yPyAqLwotICB7ImxhbXN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidGlvIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1OWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIG9wY29kZSB0YWJsZSBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhlIFNQQVJDIG9wY29kZSB0YWJsZSAoYW5kIG90aGVyIHJlbGF0ZWQgZGF0YSkgaXMgZGVmaW5lZCBpbgotICAgdGhlIG9wY29kZXMgbGlicmFyeSBpbiBzcGFyYy1vcGMuYy4gIElmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaGVyZSwgbWFrZQotICAgc3VyZSB5b3UgZml4IHVwIHRoYXQgZmlsZSwgYW5kIHZpY2UgdmVyc2EuICAqLwotCi0gLyogRklYTUUtc29tZWRheTogcGVyaGFwcyB0aGUgLGEncyBhbmQgc3VjaCBzaG91bGQgYmUgZW1iZWRkZWQgaW4gdGhlCi0gICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0vKiBMaXN0IG9mIGluc3RydWN0aW9uIHNldHMgdmFyaWF0aW9ucy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgc3VjaCB0aGF0IGVhY2ggZWxlbWVudCBpcyBlaXRoZXIgYSBzdXBlcnNldCBvZiBhCi0gICBwcmVjZWRpbmcgZWFjaCBvbmUgb3IgdGhleSBjb25mbGljdCBpbiB3aGljaCBjYXNlIFNQQVJDX09QQ09ERV9DT05GTElDVF9QCi0gICByZXR1cm5zIG5vbi16ZXJvLgotICAgVGhlIHZhbHVlcyBhcmUgaW5kaWNlcyBpbnRvIGBzcGFyY19vcGNvZGVfYXJjaHMnIGRlZmluZWQgaW4gc3BhcmMtb3BjLmMuCi0gICBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IHVwZGF0aW5nIHNwYXJjLW9wYy5jLiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgewotICBTUEFSQ19PUENPREVfQVJDSF9WNiA9IDAsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y3LAotICBTUEFSQ19PUENPREVfQVJDSF9WOCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSwKLSAgLyogdjkgdmFyaWFudHMgbXVzdCBhcHBlYXIgbGFzdCAqLwotICBTUEFSQ19PUENPREVfQVJDSF9WOSwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBLCAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX0JBRCAvKiBlcnJvciByZXR1cm4gZnJvbSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKi8KLX07Ci0KLS8qIFRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVggKFNQQVJDX09QQ09ERV9BUkNIX0JBRCAtIDEpCi0KLS8qIEdpdmVuIGFuIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gdGhlIGJpdG1hc2sgdG8gdXNlIGluCi0gICBpbnNuIGVuY29kaW5nL2RlY29kaW5nLiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyhhcmNoKSAoMSA8PCAoYXJjaCkpCi0KLS8qIEdpdmVuIGEgdmFsaWQgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gbm9uLXplcm8gaWYgaXQncyB2OS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AoYXJjaCkgKChhcmNoKSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQotLyogVGFibGUgb2YgY3B1IHZhcmlhbnRzLiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncyBzdXBwb3J0ZWQuCi0gICAgIEVHOiBGb3IgdjcgdGhpcyB3b3VsZCBiZQotICAgICAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y2KSB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKC4uLl9WNykpLgotICAgICBUaGVzZSBhcmUgc2hvcnQncyBiZWNhdXNlIHNwYXJjX29wY29kZS5hcmNoaXRlY3R1cmUgaXMuICAqLwotICBzaG9ydCBzdXBwb3J0ZWQ7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdOwotCi0vKiBHaXZlbiBhcmNoaXRlY3R1cmUgbmFtZSwgbG9vayB1cCBpdCdzIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB2YWx1ZS4gICovCi1leHRlcm4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZXR1cm4gdGhlIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgZm9yIEFSQ0guICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfU1VQUE9SVEVEKEFSQ0gpIChzcGFyY19vcGNvZGVfYXJjaHNbQVJDSF0uc3VwcG9ydGVkKQotCi0vKiBOb24temVybyBpZiBBUkNIMSBjb25mbGljdHMgd2l0aCBBUkNIMi4KLSAgIElFOiBBUkNIMSBhcyBhIHN1cHBvcnRlZCBiaXQgc2V0IHRoYXQgQVJDSDIgZG9lc24ndCwgYW5kIHZpY2UgdmVyc2EuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUChBUkNIMSwgQVJDSDIpIFwKLSgoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMSkpIFwKLSAmJiAoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAgICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMikpKQotCi0vKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gKi8KLSAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGlzIHdhcyBjYWxsZWQgImRlbGF5ZWQiIGluIHZlcnNpb25zIGJlZm9yZSB0aGUgZmxhZ3MuICovCi0gIGNoYXIgZmxhZ3M7Ci0gIHNob3J0IGFyY2hpdGVjdHVyZTsJLyogQml0bWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncy4gICovCi19OwotCi0jZGVmaW5lCUZfREVMQVlFRAkxCS8qIERlbGF5ZWQgYnJhbmNoICovCi0jZGVmaW5lCUZfQUxJQVMJCTIJLyogQWxpYXMgZm9yIGEgInJlYWwiIGluc3RydWN0aW9uICovCi0jZGVmaW5lCUZfVU5CUgkJNAkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0NPTkRCUgk4CS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0pTUgkJMTYJLyogU3Vicm91dGluZSBjYWxsICovCi0jZGVmaW5lIEZfRkxPQVQJCTMyCS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIChub3QgYSBicmFuY2gpICovCi0jZGVmaW5lIEZfRkJSCQk2NAkvKiBGbG9hdGluZyBwb2ludCBicmFuY2ggKi8KLS8qIEZJWE1FOiBBZGQgRl9BTkFDSFJPTklTVElDIGZsYWcgZm9yIHY5LiAgKi8KLQotLyoKLQotQWxsIHNwYXJjIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIGBzZXQnIGluc3RydWN0aW9uIChyZWFsbHkgYQotbWFjcm8pLCB3aGljaCBpcyA2NCBiaXRzLiBJdCBpcyBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlLgotCi1UaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEgcGFydGljdWxhcgotb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0IG9wY29kZS4KLQotVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlciBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZQotaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotCSMJTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLglJdCBpcyBpZ25vcmVkLgotCTEJcnMxIHJlZ2lzdGVyLgotCTIJcnMyIHJlZ2lzdGVyLgotCWQJcmQgcmVnaXN0ZXIuCi0JZQlmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCXYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCVYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQlmCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JQglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JUglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWcJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlICWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlKCWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JYgljcnMxIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JYwljcnMyIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JRAljcnNkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JbQlhbHRlcm5hdGUgc3BhY2UgcmVnaXN0ZXIgKGFzcikgaW4gcmQKLQlNCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByczEKLQloCTIyIGhpZ2ggYml0cy4KLQlYCTUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZQotCVkJNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JSwlNRU1CQVIgbWFzayAoNyBiaXRzKS4gKHY5KQotCWoJMTAgYml0IEltbWVkaWF0ZS4gKHY5KQotCUkJMTEgYml0IEltbWVkaWF0ZS4gKHY5KQotCWkJMTMgYml0IEltbWVkaWF0ZS4KLQluCTIyIGJpdCBpbW1lZGlhdGUuCi0JawkyKzE0IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlHCTE5IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlsCTIyIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JTAkzMCBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotCWEJQW5udWwuCVRoZSBhbm51bCBiaXQgaXMgc2V0LgotCUEJQWx0ZXJuYXRlIGFkZHJlc3Mgc3BhY2UuIFN0b3JlZCBhcyA4IGJpdHMuCi0JQwlDb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3Rlci4KLQlGCWZsb2F0aW5nIHBvaW50IHN0YXRlIHJlZ2lzdGVyLgotCXAJUHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCU4JQnJhbmNoIHByZWRpY3QgY2xlYXIgIixwbiIgKHY5KQotCVQJQnJhbmNoIHByZWRpY3Qgc2V0ICIscHQiICh2OSkKLQl6CSVpY2MuICh2OSkKLQlaCSV4Y2MuICh2OSkKLQlxCUZsb2F0aW5nIHBvaW50IHF1ZXVlLgotCXIJU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczEgYW5kIHJkLgotCU8JU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczIgYW5kIHJkLgotCVEJQ29wcm9jZXNzb3IgcXVldWUuCi0JUwlTcGVjaWFsIGNhc2UuCi0JdAlUcmFwIGJhc2UgcmVnaXN0ZXIuCi0JdwlXaW5kb3cgaW52YWxpZCBtYXNrIHJlZ2lzdGVyLgotCXkJWSByZWdpc3Rlci4KLQl1CXNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBpbiByZCBwb3NpdGlvbgotCVUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJzMSBwb3NpdGlvbgotCUUJJWNjci4gKHY5KQotCXMJJWZwcnMuICh2OSkKLQlQCSVwYy4gICh2OSkKLQlXCSV0aWNrLgkodjkpCi0JbwklYXNpLiAodjkpCi0JNgklZmNjMC4gKHY5KQotCTcJJWZjYzEuICh2OSkKLQk4CSVmY2MyLiAodjkpCi0JOQklZmNjMy4gKHY5KQotCSEJUHJpdmlsZWdlZCBSZWdpc3RlciBpbiByZCAodjkpCi0JPwlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJzMSAodjkpCi0JKglQcmVmZXRjaCBmdW5jdGlvbiBjb25zdGFudC4gKHY5KQotCXgJT1BGIGZpZWxkICh2OSBpbXBkZXApLgotCTAJMzIvNjQgYml0IGltbWVkaWF0ZSBmb3Igc2V0IG9yIHNldHggKHY5KSBpbnNucwotCV8JQW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIGluIHJkICh2OWEpCi0JLwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcnMxICh2OWEpCi0KLVRoZSBmb2xsb3dpbmcgY2hhcnMgYXJlIHVudXNlZDogKG5vdGU6ICxbXSBhcmUgdXNlZCBhcyBwdW5jdHVhdGlvbikKLVszNDVdCi0KLSovCi0KLSNkZWZpbmUgT1AyKHgpCQkoKCh4KSYweDcpIDw8IDIyKSAvKiBvcDIgZmllbGQgb2YgZm9ybWF0MiBpbnNucyAqLwotI2RlZmluZSBPUDMoeCkJCSgoKHgpJjB4M2YpIDw8IDE5KSAvKiBvcDMgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBPUCh4KQkJKCh1bnNpZ25lZCkoKHgpJjB4MykgPDwgMzApIC8qIG9wIGZpZWxkIG9mIGFsbCBpbnNucyAqLwotI2RlZmluZSBPUEYoeCkJCSgoKHgpJjB4MWZmKSA8PCA1KSAvKiBvcGYgZmllbGQgb2YgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgT1BGX0xPVzUoeCkJT1BGKCh4KSYweDFmKSAvKiB2OSAqLwotI2RlZmluZSBGM0YoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgT1BGKHopKSAvKiBmb3JtYXQzIGZsb2F0IGluc25zICovCi0jZGVmaW5lIEYzSSh4KQkJKCgoeCkmMHgxKSA8PCAxMykgLyogaW1tZWRpYXRlIGZpZWxkIG9mIGZvcm1hdCAzIGluc25zICovCi0jZGVmaW5lIEYyKHgsIHkpCShPUCh4KSB8IE9QMih5KSkgLyogZm9ybWF0IDIgaW5zbnMgKi8KLSNkZWZpbmUgRjMoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgRjNJKHopKSAvKiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIEYxKHgpCQkoT1AoeCkpCi0jZGVmaW5lIERJU1AzMCh4KQkoKHgpJjB4M2ZmZmZmZmYpCi0jZGVmaW5lIEFTSSh4KQkJKCgoeCkmMHhmZikgPDwgNSkgLyogYXNpIGZpZWxkIG9mIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgUlMyKHgpCQkoKHgpJjB4MWYpIC8qIHJzMiBmaWVsZCAqLwotI2RlZmluZSBTSU1NMTMoeCkJKCh4KSYweDFmZmYpIC8qIHNpbW0xMyBmaWVsZCAqLwotI2RlZmluZSBSRCh4KQkJKCgoeCkmMHgxZikgPDwgMjUpIC8qIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZpZWxkICovCi0jZGVmaW5lIFJTMSh4KQkJKCgoeCkmMHgxZikgPDwgMTQpIC8qIHJzMSBmaWVsZCAqLwotI2RlZmluZSBBU0lfUlMyKHgpCShTSU1NMTMoeCkpCi0jZGVmaW5lIE1FTUJBUih4KQkoKHgpJjB4N2YpCi0jZGVmaW5lIFNMQ1BPUCh4KQkoKCh4KSYweDdmKSA8PCA2KSAvKiBzcGFyY2xldCBjcG9wICovCi0KLSNkZWZpbmUgQU5OVUwJKDE8PDI5KQotI2RlZmluZSBCUFJFRAkoMTw8MTkpCS8qIHY5ICovCi0jZGVmaW5lCUlNTUVECUYzSSgxKQotI2RlZmluZSBSRF9HMAlSRCh+MCkKLSNkZWZpbmUJUlMxX0cwCVJTMSh+MCkKLSNkZWZpbmUJUlMyX0cwCVJTMih+MCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlczsKLQotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfYXNpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9hc2kgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9tZW1iYXIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX21lbWJhciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3ByZWZldGNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9wcmVmZXRjaCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyBQQVJBTVMgKChpbnQpKTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmggYi9pbmNsdWRlL29wY29kZS90YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNlZTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIFBvcnRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvIGJ5IHRoZSBEaXN0cmlidXRlZAotICogQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KLSAqLwotCi0jaWZuZGVmIHRhaG9lX29wY29kZVQKLSNkZWZpbmUgdGFob2Vfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB0YWhvZV9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290ICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7ICAgICAgIC8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHRhaG9lX29wY29kZVQgICAgICAgY29kZTsgICAgIC8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90ICAgICAgICAgICAgICAgICAgICAgIC8qIHRhaG9lIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7ICAgICAgIC8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOyAgICAgLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgInNpbmYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDA1ICAgIH0gfSwKLXsgICAgImxkZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDA2ICAgIH0gfSwKLXsgICAgImxkZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDA3ICAgIH0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4MDgJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDA5CX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4MGEJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweDBiCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4MGMJfSB9LAoteyAgICAibW92bCIsCXsicmx3bCIsCQkweDBkCX0gfSwKLXsgICAgImJicyIsCXsicmx2bGJ3IiwJCTB4MGUJfSB9LAoteyAgICAibm9wIiwgICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTAgICAgfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDEzCX0gfSwKLXsgICAgImNvc2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDE1ICAgIH0gfSwKLXsgICAgImxuZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDE2ICAgIH0gfSwKLXsgICAgImxuZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDE3ICAgIH0gfSwKLXsgICAgImFkZGIzIiwJeyJyYnJid2IiLAkJMHgxOAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYndiIiwJCTB4MTkJfSB9LCAKLXsgICAgImFkZHczIiwJeyJyd3J3d3ciLAkJMHgxYQl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3d3IiwJCTB4MWIJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweDFjCX0gfSwKLXsgICAgImNtcGwiLAl7InJsd2wiLAkJMHgxZAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmxidyIsCQkweDFlCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDIwCX0gfSwKLXsgICAgImJuZXEiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImJuZXF1IiwJeyJiYiIsCQkJMHgyMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDIzCX0gfSwKLXsgICAgInN0ZiIsICAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDI2ICAgIH0gfSwKLXsgICAgInN0ZCIsICAgICB7IndxIiwgICAgICAgICAgICAgICAgICAweDI3ICAgIH0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4MjgJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHgyOQl9IH0sCi17ICAgICJzdWJ3MiIsCXsicndtdyIsCQkweDJhCX0gfSwKLXsgICAgIm1jb213IiwJeyJyd3d3IiwJCTB4MmIJfSB9LAoteyAgICAic3VibDIiLCAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4MmMgICAgfSB9LAoteyAgICAibWNvbWwiLCAgIHsicmx3bCIsICAgICAgICAgICAgICAgIDB4MmQgICAgfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHgyZQl9IH0sCi17ICAgICJhb2Jsc3MiLAl7InJsbWxidyIsCQkweDJmCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDMwCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3YiIsCXsicnd3YiIsCQkweDMzCX0gfSwKLXsgICAgImxvZ2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDM1ICAgIH0gfSwKLXsgICAgImNtcGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDM2ICAgIH0gfSwKLXsgICAgImNtcGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDM3ICAgIH0gfSwKLXsgICAgInN1YmIzIiwJeyJyYnJid2IiLAkJMHgzOAl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4MzkJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweDNhCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHgzYgl9IH0sCi17ICAgICJzdWJsMyIsCXsicmxybHdsIiwJCTB4M2MJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweDNkCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4M2UJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYnciLAkJMHgzZgl9IH0sCi17ICAgICJyZXQiLAl7IiIsCQkJMHg0MAl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHg0MQl9IH0sCi17ICAgICJzcXJ0ZiIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg0NSAgICB9IH0sCi17ICAgICJjbXBmMiIsICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg0NiAgICB9IH0sCi17ICAgICJjbXBkMiIsICAgeyJycXJxIiwgICAgICAgICAgICAgICAgMHg0NyAgICB9IH0sCi17ICAgICJzaGxsIiwgICAgeyJyYnJsd2wiLCAgICAgICAgICAgICAgMHg0OCAgICB9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg0OQl9IH0sCi17ICAgICJzaGxxIiwJeyJyYnJxd3EiLAkJMHg0YQl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHg0Ygl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweDRjCX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweDRkCX0gfSwKLXsgICAgInNoYWwiLCAgICB7InJicmx3bCIsCQkweDRlCX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDUxCX0gfSwKLXsgICAgImV4cGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU1ICAgIH0gfSwKLXsgICAgInRzdGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU2ICAgIH0gfSwKLXsgICAgInRzdGQiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU3ICAgIH0gfSwKLXsgICAgInNocmwiLCAgICB7InJicmx3bCIsCQkweDU4CX0gfSwKLXsgICAgInRzdGIiLAl7InJiIiwJCQkweDU5CX0gfSwKLXsgICAgInNocnEiLCAgICB7InJicnF3cSIsCQkweDVhCX0gfSwKLXsgICAgInRzdHciLAl7InJ3IiwJCQkweDViCX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHg1Ywl9IH0sCi17ICAgICJ0c3RsIiwJeyJybCIsCQkJMHg1ZAl9IH0sCi17ICAgICJzaGFyIiwJeyJyYnJsd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmxtbGJ3IiwJCTB4NWYJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4NjAJfSB9LAoteyAgICAicHVzaGQiLCAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NjcgICAgfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4NjkJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4NmIJfSB9LAoteyAgICAiZGl2bDIiLAl7InJsbWwiLAkJMHg2Ywl9IH0sCi17ICAgICJpbmNsIiwJeyJtbCIsCQkJMHg2ZAl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweDZmCX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDcwCX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4NzEJfSB9LAoteyAgICAiY3ZsZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzYgICAgfSB9LAoteyAgICAiY3ZsZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzcgICAgfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4NzkJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4N2IJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweDdjCX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweDdkCX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4N2YJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4ODEJfSB9LAoteyAgICAibW92czIiLAl7ImFiYWIiLAkJMHg4Mgl9IH0sCi17ICAgICJjdmZsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NiAgICB9IH0sCi17ICAgICJjdmRsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NyAgICB9IH0sCi17ICAgICJvcmIyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg4OQl9IH0sCi17ICAgICJvcncyIiwJeyJyd213IiwJCTB4OGEJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHg4Ygl9IH0sCi17ICAgICJvcmwyIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg4YyAgICB9IH0sCi17ICAgICJhZHdjIiwJeyJybG1sIiwJCTB4OGQJfSB9LAoteyAgICAiYWRkYSIsIAl7InJsbWwiLAkJMHg4ZQl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHg5MQl9IH0sCi17ICAgICJjbXBzMiIsICAgeyJhYmFiIiwJCTB4OTIJfSB9LAoteyAgICAibGRmZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4OTcgICAgfSB9LAoteyAgICAib3JiMyIsCXsicmJyYndiIiwJCTB4OTgJfSB9LAoteyAgICAiY3Z0YnciLAl7InJid3ciLAkJMHg5OQl9IH0sCi17ICAgICJvcnczIiwgICAJeyJyd3J3d3ciLAkJMHg5YQl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweDliCX0gfSwKLXsgICAgIm9ybDMiLCAgICB7InJscmx3bCIsICAgICAgICAgICAgICAweDljICAgIH0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHg5ZAl9IH0sCi17ICAgICJzdWJhIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg5ZSAgICB9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4YTEJfSB9LAoteyAgICAiY3ZkZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YTYgICAgfSB9LAoteyAgICAiYW5kYjIiLCAgIHsicmJtYiIsCQkweGE4ICAgIH0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweGE5CX0gfSwKLXsgICAgImFuZHcyIiwgICB7InJ3bXciLAkJMHhhYSAgICB9IH0sCi17ICAgICJsb2FkciIsICAgeyJyd2FsIiwJCTB4YWIJfSB9LAoteyAgICAiYW5kbDIiLCAgIHsicmxtbCIsCQkweGFjICAgIH0gfSwKLXsgICAgIm10cHIiLAl7InJscmwiLAkJMHhhZAl9IH0sCi17ICAgICJmZnMiLAl7InJsd2wiLAkJMHhhZQl9IH0sCi17ICAgICJibGVxdSIsCXsiYmIiLAkJCTB4YjEJfSB9LAoteyAgICAibmVnZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjYgICAgfSB9LAoteyAgICAibmVnZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjcgICAgfSB9LAoteyAgICAiYW5kYjMiLCAgIHsicmJyYndiIiwgICAgICAgICAgICAgIDB4YjggICAgfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4YjkJfSB9LAoteyAgICAiYW5kdzMiLCAgIHsicndyd3d3IiwJCTB4YmEgICAgfSB9LAoteyAgICAic3RvcmVyIiwgIHsicndhbCIsICAgICAgICAgICAgICAgIDB4YmIgICAgfSB9LAoteyAgICAiYW5kbDMiLCAgIHsicmxybHdsIiwJCTB4YmMgICAgfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGJkCX0gfSwKLXsgICAgImZmYyIsCXsicmx3bCIsCQkweGJlCX0gfSwKLXsgICAgImNhbGxzIiwJeyJyYmFiIiwJCTB4YmYJfSB9LAoteyAgICAicHJvYmVyIiwJeyJyYmFicmwiLAkJMHhjMAl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweGMxCX0gfSwKLXsgICAgIm1vdnMzIiwJeyJhYmFicnciLAkJMHhjMgl9IH0sCi17ICAgICJtb3Z6d2wiLAl7InJ3d2wiLAkJMHhjMwl9IH0sCi17ICAgICJhZGRmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHhjNiAgICB9IH0sCi17ICAgICJhZGRkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhjNyAgICB9IH0sCi17ICAgICJ4b3JiMiIsICAgeyJyYm1iIiwgICAgICAgICAgICAgICAgMHhjOCAgICB9IH0sCi17ICAgICJtb3ZvYiIsICAgeyJyYndiIiwgICAgICAgICAgICAgICAgMHhjOSAgICB9IH0sCi17ICAgICJ4b3J3MiIsICAgeyJyd213IiwgICAgICAgICAgICAgICAgMHhjYSAgICB9IH0sCi17ICAgICJtb3ZvdyIsICAgeyJyd3d3IiwgICAgICAgICAgICAgICAgMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsICAgICAgICAgICAgICAgIDB4Y2MgICAgfSB9LAoteyAgICAibW92cHNsIiwgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4Y2QgICAgfSB9LAoteyAgICAia2NhbGwiLCAgIHsicnciLAkJCTB4Y2YJfSB9LAoteyAgICAicHJvYmV3IiwgIHsicmJhYnJsIiwJCTB4ZDAJfSB9LAoteyAgICAiYnZzIiwgICAgIHsiYmIiLAkJCTB4ZDEJfSB9LAoteyAgICAiY21wczMiLCAgIHsiYWJhYnJ3IiwJCTB4ZDIJfSB9LAoteyAgICAic3ViZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDYgICAgfSB9LAoteyAgICAic3ViZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDcgICAgfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweGQ4CX0gfSwKLXsgICAgInB1c2hiIiwgICB7InJiIiwJCQkweGQ5CX0gfSwKLXsgICAgInhvcnczIiwJeyJyd3J3d3ciLAkJMHhkYQl9IH0sCi17ICAgICJwdXNodyIsICAgeyJydyIsIAkJCTB4ZGIJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJpbnNxdWUiLAl7ImFiYWIiLAkJMHhlMAl9IH0sCi17ICAgICJiY3MiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHhlMQl9IH0sCi17ICAgICJtdWxmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNiAgICB9IH0sCi17ICAgICJtdWxkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNyAgICB9IH0sCi17ICAgICJtbmVnYiIsCXsicmJ3YiIsCQkweGU4CX0gfSwKLXsgICAgIm1vdmFiIiwJeyJhYndsIiwJCTB4ZTkJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhlYQl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweGViCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4ZWMJfSB9LAoteyAgICAibW92YWwiLAl7ImFsd2wiLAkJMHhlZAl9IH0sCi17ICAgICJyZW1xdWUiLAl7ImFiIiwgIAkJMHhmMAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImJsc3N1IiwJeyJiYiIsCQkJMHhmMQl9IH0sCi17ICAgICJkaXZmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNiAgICB9IH0sCi17ICAgICJkaXZkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNyAgICB9IH0sCi17ICAgICJtb3ZibGsiLCAgeyJhbGFscnciLCAgICAgICAgICAgICAgMHhmOAl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweGY5CX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4ZmIJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGZjCX0gfSwKLXsgICAgInB1c2hhbCIsCXsiYWwiLAkJCTB4ZmQJfSB9LAoteyAgICAiY2FsbGYiLAl7InJiYWIiLAkJMHhmZQl9IH0sCi17ICAgICAgIiIgICAgICAgLCAgICIiICAgICAgICAgIH0gLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWMzMC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDI3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qIHRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEMzMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGUgb3Bjb2RlIHRhYmxlIHNob3VsZCBiZSBpbiBvcGNvZGVzL3RpYzMwLW9wYy5jLCBub3QgaW4gYQotICAgaGVhZGVyIGZpbGUuICAqLwotCi0jaWZuZGVmIF9UTVMzMjBfSF8KLSNkZWZpbmUgX1RNUzMyMF9IXwotCi1zdHJ1Y3QgX3JlZ2lzdGVyCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyIHJlZ3R5cGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXIgcmVnOwotCi0jZGVmaW5lIFJFR19SbiAgICAweDAxCi0jZGVmaW5lIFJFR19BUm4gICAweDAyCi0jZGVmaW5lIFJFR19EUCAgICAweDAzCi0jZGVmaW5lIFJFR19PVEhFUiAweDA0Ci0KLXN0YXRpYyBjb25zdCByZWcgdGljMzBfcmVndGFiW10gPSB7Ci0gIHsgInIwIiwgMHgwMCwgUkVHX1JuIH0sCi0gIHsgInIxIiwgMHgwMSwgUkVHX1JuIH0sCi0gIHsgInIyIiwgMHgwMiwgUkVHX1JuIH0sCi0gIHsgInIzIiwgMHgwMywgUkVHX1JuIH0sCi0gIHsgInI0IiwgMHgwNCwgUkVHX1JuIH0sCi0gIHsgInI1IiwgMHgwNSwgUkVHX1JuIH0sCi0gIHsgInI2IiwgMHgwNiwgUkVHX1JuIH0sCi0gIHsgInI3IiwgMHgwNywgUkVHX1JuIH0sCi0gIHsgImFyMCIsMHgwOCwgUkVHX0FSbiB9LAotICB7ICJhcjEiLDB4MDksIFJFR19BUm4gfSwKLSAgeyAiYXIyIiwweDBBLCBSRUdfQVJuIH0sCi0gIHsgImFyMyIsMHgwQiwgUkVHX0FSbiB9LAotICB7ICJhcjQiLDB4MEMsIFJFR19BUm4gfSwKLSAgeyAiYXI1IiwweDBELCBSRUdfQVJuIH0sCi0gIHsgImFyNiIsMHgwRSwgUkVHX0FSbiB9LAotICB7ICJhcjciLDB4MEYsIFJFR19BUm4gfSwKLSAgeyAiZHAiLCAweDEwLCBSRUdfRFAgfSwKLSAgeyAiaXIwIiwweDExLCBSRUdfT1RIRVIgfSwKLSAgeyAiaXIxIiwweDEyLCBSRUdfT1RIRVIgfSwKLSAgeyAiYmsiLCAweDEzLCBSRUdfT1RIRVIgfSwKLSAgeyAic3AiLCAweDE0LCBSRUdfT1RIRVIgfSwKLSAgeyAic3QiLCAweDE1LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWUiLCAweDE2LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWYiLCAweDE3LCBSRUdfT1RIRVIgfSwKLSAgeyAiaW9mIiwweDE4LCBSRUdfT1RIRVIgfSwKLSAgeyAicnMiLCAweDE5LCBSRUdfT1RIRVIgfSwKLSAgeyAicmUiLCAweDFBLCBSRUdfT1RIRVIgfSwKLSAgeyAicmMiLCAweDFCLCBSRUdfT1RIRVIgfSwKLSAgeyAiUjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAiUjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAiUjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAiUjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAiUjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAiUjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAiUjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAiUjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiQVIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgIkFSMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJBUjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiQVIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgIkFSNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJBUjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiQVI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgIkFSNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJEUCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJJUjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJJUjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJCSyIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJTUCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJTVCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJJRSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJJRiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJJT0YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJSUyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJSRSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJSQyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICIiLCAgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHJlZyAqY29uc3QgdGljMzBfcmVndGFiX2VuZAotICA9IHRpYzMwX3JlZ3RhYiArIHNpemVvZih0aWMzMF9yZWd0YWIpL3NpemVvZih0aWMzMF9yZWd0YWJbMF0pOwotCi0vKiBJbmRpcmVjdCBBZGRyZXNzaW5nIE1vZGVzIE1vZGlmaWNhdGlvbiBGaWVsZHMgKi8KLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBEaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgUHJlRGlzcF9BZGQgICAgICAgIDB4MDAKLSNkZWZpbmUgUHJlRGlzcF9TdWIgICAgICAgIDB4MDEKLSNkZWZpbmUgUHJlRGlzcF9BZGRfTW9kICAgIDB4MDIKLSNkZWZpbmUgUHJlRGlzcF9TdWJfTW9kICAgIDB4MDMKLSNkZWZpbmUgUG9zdERpc3BfQWRkX01vZCAgIDB4MDQKLSNkZWZpbmUgUG9zdERpc3BfU3ViX01vZCAgIDB4MDUKLSNkZWZpbmUgUG9zdERpc3BfQWRkX0NpcmMgIDB4MDYKLSNkZWZpbmUgUG9zdERpc3BfU3ViX0NpcmMgIDB4MDcKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjAgKi8KLSNkZWZpbmUgUHJlSVIwX0FkZCAgICAgICAgIDB4MDgKLSNkZWZpbmUgUHJlSVIwX1N1YiAgICAgICAgIDB4MDkKLSNkZWZpbmUgUHJlSVIwX0FkZF9Nb2QgICAgIDB4MEEKLSNkZWZpbmUgUHJlSVIwX1N1Yl9Nb2QgICAgIDB4MEIKLSNkZWZpbmUgUG9zdElSMF9BZGRfTW9kICAgIDB4MEMKLSNkZWZpbmUgUG9zdElSMF9TdWJfTW9kICAgIDB4MEQKLSNkZWZpbmUgUG9zdElSMF9BZGRfQ2lyYyAgIDB4MEUKLSNkZWZpbmUgUG9zdElSMF9TdWJfQ2lyYyAgIDB4MEYKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjEgKi8KLSNkZWZpbmUgUHJlSVIxX0FkZCAgICAgICAgIDB4MTAKLSNkZWZpbmUgUHJlSVIxX1N1YiAgICAgICAgIDB4MTEKLSNkZWZpbmUgUHJlSVIxX0FkZF9Nb2QgICAgIDB4MTIKLSNkZWZpbmUgUHJlSVIxX1N1Yl9Nb2QgICAgIDB4MTMKLSNkZWZpbmUgUG9zdElSMV9BZGRfTW9kICAgIDB4MTQKLSNkZWZpbmUgUG9zdElSMV9TdWJfTW9kICAgIDB4MTUKLSNkZWZpbmUgUG9zdElSMV9BZGRfQ2lyYyAgIDB4MTYKLSNkZWZpbmUgUG9zdElSMV9TdWJfQ2lyYyAgIDB4MTcKLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgKFNwZWNpYWwgQ2FzZXMpICovCi0jZGVmaW5lIEluZGlyZWN0T25seSAgICAgICAweDE4Ci0jZGVmaW5lIFBvc3RJUjBfQWRkX0JpdFJldiAweDE5Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqc3ludGF4OwotICB1bnNpZ25lZCBjaGFyIG1vZGZpZWxkOwotICB1bnNpZ25lZCBjaGFyIGRpc3BsYWNlbWVudDsKLX0gaW5kX2FkZHJfdHlwZTsKLQotI2RlZmluZSBJTVBMSUVEX0RJU1AgIDB4MDEKLSNkZWZpbmUgRElTUF9SRVFVSVJFRCAweDAyCi0jZGVmaW5lIE5PX0RJU1AgICAgICAgMHgwMwotCi1zdGF0aWMgY29uc3QgaW5kX2FkZHJfdHlwZSB0aWMzMF9pbmRhZGRyX3RhYltdID0gewotICB7ICIqK2FyIiwgICAgICAgUHJlRGlzcF9BZGQsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKi1hciIsICAgICAgIFByZURpc3BfU3ViLCAgICAgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorK2FyIiwgICAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLS1hciIsICAgICAgUHJlRGlzcF9TdWJfTW9kLCAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyKysiLCAgICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphci0tIiwgICAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyUiLCAgICAgUG9zdERpc3BfQWRkX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0lIiwgICAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorYXIoKSIsICAgICBQcmVEaXNwX0FkZCwgICAgICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi1hcigpIiwgICAgIFByZURpc3BfU3ViLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqKythcigpIiwgICAgUHJlRGlzcF9BZGRfTW9kLCAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiotLWFyKCkiLCAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSIsICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpIiwgICAgUG9zdERpc3BfU3ViX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphcisrKCklIiwgICBQb3N0RGlzcF9BZGRfQ2lyYywgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyLS0oKSUiLCAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqK2FyKGlyMCkiLCAgUHJlSVIwX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIwKSIsICBQcmVJUjBfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIwKSIsIFByZUlSMF9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjApIiwgUHJlSVIwX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCkiLCBQb3N0SVIwX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSIsIFBvc3RJUjBfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApJSIsUG9zdElSMF9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMCklIixQb3N0SVIwX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKithcihpcjEpIiwgIFByZUlSMV9BZGQsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqLWFyKGlyMSkiLCAgUHJlSVIxX1N1YiwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiorK2FyKGlyMSkiLCBQcmVJUjFfQWRkX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi0tYXIoaXIxKSIsIFByZUlSMV9TdWJfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpIiwgUG9zdElSMV9BZGRfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSkiLCBQb3N0SVIxX1N1Yl9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIxKSUiLFBvc3RJUjFfQWRkX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjEpJSIsUG9zdElSMV9TdWJfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphciIsICAgICAgICBJbmRpcmVjdE9ubHksICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKWIiLFBvc3RJUjBfQWRkX0JpdFJldiwgTk9fRElTUCB9LAotICB7ICIiLCAgICAgICAgICAgMCwwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlICpjb25zdCB0aWMzMF9pbmRhZGRydGFiX2VuZAotICA9IHRpYzMwX2luZGFkZHJfdGFiICsgc2l6ZW9mKHRpYzMwX2luZGFkZHJfdGFiKS9zaXplb2YodGljMzBfaW5kYWRkcl90YWJbMF0pOwotCi0vKiBQb3NzaWJsZSBvcGVyYW5kIHR5cGVzICovCi0vKiBSZWdpc3RlciB0eXBlcyAqLwotI2RlZmluZSBSbiAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJuICAgICAgMHgwMDAyCi0jZGVmaW5lIERQUmVnICAgIDB4MDAwNAotI2RlZmluZSBPdGhlclJlZyAweDAwMDgKLS8qIEFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBEaXJlY3QgICAweDAwMTAKLSNkZWZpbmUgSW5kaXJlY3QgMHgwMDIwCi0jZGVmaW5lIEltbTE2ICAgIDB4MDA0MAotI2RlZmluZSBEaXNwICAgICAweDAwODAKLSNkZWZpbmUgSW1tMjQgICAgMHgwMTAwCi0jZGVmaW5lIEFiczI0ICAgIDB4MDIwMAotLyogMyBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBvcDNUMSAgICAweDA0MDAKLSNkZWZpbmUgb3AzVDIgICAgMHgwODAwCi0vKiBJbnRlcnJ1cHQgdmVjdG9yICovCi0jZGVmaW5lIElWZWN0b3IgIDB4MTAwMAotLyogTm90IHJlcXVpcmVkICovCi0jZGVmaW5lIE5vdFJlcSAgIDB4MjAwMAotCi0jZGVmaW5lIEdBZGRyMSAgIFJuIHwgRGlyZWN0IHwgSW5kaXJlY3QgfCBJbW0xNgotI2RlZmluZSBHQWRkcjIgICBHQWRkcjEgfCBBbGxSZWcKLSNkZWZpbmUgVEFkZHIxICAgb3AzVDEgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFRBZGRyMiAgIG9wM1QyIHwgUm4gfCBJbmRpcmVjdAotI2RlZmluZSBSZWcgICAgICBSbiB8IEFSbgotI2RlZmluZSBBbGxSZWcgICBSZWcgfCBEUFJlZyB8IE90aGVyUmVnCi0KLXR5cGVkZWYgc3RydWN0IF90ZW1wbGF0ZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7IC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlICovCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgQWRkcmVzc01vZGUgMHgwMDYwMDAwMAotI2RlZmluZSBQQ1JlbCAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIFN0YWNrT3AgICAgIDB4MDAxRjAwMDAKLSNkZWZpbmUgUm90YXRlICAgICAgU3RhY2tPcAotICAKLSAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCi0gICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgotICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKLSAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107Ci0gIC8qIFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIHR5cGUgb2YgYW4gaW1tZWRpYXRlIGFyZ3VtZW50IHRvIGFuIGluc3RydWN0aW9uLiAqLwotICBpbnQgaW1tX2FyZ190eXBlOwotI2RlZmluZSBJbW1fTm9uZSAgMAotI2RlZmluZSBJbW1fRmxvYXQgMQotI2RlZmluZSBJbW1fU0ludCAgMgotI2RlZmluZSBJbW1fVUludCAgMwotfQotdGVtcGxhdGU7Ci0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSB0aWMzMF9vcHRhYltdID0gewotICB7ICJhYnNmIiAgICwyLDB4MDAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiYWJzaSIgICAsMiwweDAwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMiICAgLDIsMHgwMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRjMyIgICwzLDB4MjAwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGYiICAgLDIsMHgwMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhZGRmMyIgICwzLDB4MjA4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGkiICAgLDIsMHgwMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRpMyIgICwzLDB4MjEwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZCIgICAgLDIsMHgwMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmQzIiAgICwzLDB4MjE4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZG4iICAgLDIsMHgwMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmRuMyIgICwzLDB4MjIwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFzaCIgICAgLDIsMHgwMzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhc2gzIiAgICwzLDB4MjI4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImIiICAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidSIgICAgICwxLDB4NjgwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvIiAgICAsMSwweDY4MDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJscyIgICAgLDEsMHg2ODAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGkiICAgICwxLDB4NjgwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcSIgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmUiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0IiAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZSIgICAgLDEsMHg2ODA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3QiICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlIiAgICAsMSwweDY4MEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6IiAgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnoiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnAiICAgICAsMSwweDY4MDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuIiAgICAgLDEsMHg2ODA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm4iICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52IiAgICAsMSwweDY4MEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2IiAgICAgLDEsMHg2ODBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmIiAgICwxLDB4NjgwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmIiAgICAsMSwweDY4MEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuYyIgICAgLDEsMHg2ODA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiYyIgICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdiIgICAsMSwweDY4MTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdiIgICAgLDEsMHg2ODExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZiIgICwxLDB4NjgxMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZiIgICAsMSwweDY4MTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWYiICAgLDEsMHg2ODE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZCIgICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVkIiAgICAsMSwweDY4MjAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsb2QiICAgLDEsMHg2ODIxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHNkIiAgICwxLDB4NjgyMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhpZCIgICAsMSwweDY4MjMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoc2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZXFkIiAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5lZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdGQiICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibGVkIiAgICwxLDB4NjgyODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmd0ZCIgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJnZWQiICAgLDEsMHg2ODJBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiemQiICAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm56ZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJwZCIgICAgLDEsMHg2ODI5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmQiICAgICwxLDB4NjgyNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5uZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudmQiICAgLDEsMHg2ODJDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidmQiICAgICwxLDB4NjgyRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm51ZmQiICAsMSwweDY4MkUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1ZmQiICAgLDEsMHg2ODJGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmNkIiAgICwxLDB4NjgyNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmNkIiAgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHZkIiAgLDEsMHg2ODMwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHZkIiAgICwxLDB4NjgzMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdWZkIiAsMSwweDY4MzIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdWZkIiAgLDEsMHg2ODMzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJienVmZCIgICwxLDB4NjgzNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnIiICAgICAsMSwweDYwMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImJyZCIgICAgLDEsMHg2MTAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsIiAgICwxLDB4NjIwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHUiICAsMSwweDcwMDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsbyIgLDEsMHg3MDAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHMiICwxLDB4NzAwMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhpIiAsMSwweDcwMDMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxocyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZXEiICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5lIiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdCIgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbGUiICwxLDB4NzAwODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGd0IiAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxnZSIgLDEsMHg3MDBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxseiIgICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG56IiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxwIiAgLDEsMHg3MDA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbiIgICwxLDB4NzAwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5uIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxudiIgLDEsMHg3MDBDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdiIgICwxLDB4NzAwRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG51ZiIsMSwweDcwMEUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx1ZiIgLDEsMHg3MDBGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmMiICwxLDB4NzAwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGMiICAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxubHYiLDEsMHg3MDEwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHYiICwxLDB4NzAxMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdWYiLDEsMHg3MDEyMDAwMCxQQ1JlbCwgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdWYiLDEsMHg3MDEzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsenVmIiwxLDB4NzAxNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY21wZiIgICAsMiwweDA0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImNtcGYzIiAgLDIsMHgyMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJjbXBpIiAgICwyLDB4MDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiY21waTMiICAsMiwweDIzODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGIiICAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1IiAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsbyIgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJscyIgICAsMiwweDZDMDIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaSIgICAsMiwweDZDMDMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJocyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcSIgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZSIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdCIgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZSIgICAsMiwweDZDMDgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndCIgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZSIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6IiAgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJueiIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwIiAgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuIiAgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubiIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudiIgICAsMiwweDZDMEMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2IiAgICAsMiwweDZDMEQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWYiICAsMiwweDZDMEUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZiIgICAsMiwweDZDMEYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuYyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjIiAgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHYiICAsMiwweDZDMTAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdiIgICAsMiwweDZDMTEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmIiAsMiwweDZDMTIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWYiICAsMiwweDZDMTMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWYiICAsMiwweDZDMTQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJkIiAgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZCIgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsb2QiICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsc2QiICAsMiwweDZDMjIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaWQiICAsMiwweDZDMjMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoc2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcWQiICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZWQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdGQiICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZWQiICAsMiwweDZDMjgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndGQiICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZWQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6ZCIgICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuemQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwZCIgICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZCIgICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubmQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudmQiICAsMiwweDZDMkMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2ZCIgICAsMiwweDZDMkQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWZkIiAsMiwweDZDMkUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZmQiICAsMiwweDZDMkYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuY2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjZCIgICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHZkIiAsMiwweDZDMzAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdmQiICAsMiwweDZDMzEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmZCIsMiwweDZDMzIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWZkIiAsMiwweDZDMzMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWZkIiAsMiwweDZDMzQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZml4IiAgICAsMiwweDA1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgQWxsUmVnLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJmbG9hdCIgICwyLDB4MDU4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBSbiwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJpYWNrIiAgICwxLDB4MUIwMDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUiICAgLDAsMHgwNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUyIiAgLDAsMHgwNjAwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsZGUiICAgICwyLDB4MDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmIiAgICAsMiwweDA3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnUiICAgLDIsMHg0MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsbyIgICwyLDB4NDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHMiICAsMiwweDQxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhpIiAgLDIsMHg0MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZocyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZXEiICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5lIiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdCIgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbGUiICAsMiwweDQ0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmd0IiAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZnZSIgICwyLDB4NDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmeiIgICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm56IiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZwIiAgICwyLDB4NDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbiIgICAsMiwweDQzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5uIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZudiIgICwyLDB4NDYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdiIgICAsMiwweDQ2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm51ZiIgLDIsMHg0NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ1ZiIgICwyLDB4NDc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmMiICAsMiwweDQyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmMiICAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZubHYiICwyLDB4NDgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHYiICAsMiwweDQ4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdWYiLDIsMHg0OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdWYiICwyLDB4NDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmenVmIiAsMiwweDRBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmkiICAgLDIsMHgwNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIFJuLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImxkaSIgICAgLDIsMHgwODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1IiAgICwyLDB4NTAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbG8iICAsMiwweDUwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxzIiAgLDIsMHg1MTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGloaSIgICwyLDB4NTE4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpaHMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWVxIiAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGluZSIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHQiICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxlIiAgLDIsMHg1NDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlndCIgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZ2UiICAsMiwweDU1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXoiICAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlueiIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpcCIgICAsMiwweDU0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW4iICAgLDIsMHg1MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubiIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbnYiICAsMiwweDU2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXYiICAgLDIsMHg1NjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludWYiICwyLDB4NTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdWYiICAsMiwweDU3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5jIiAgLDIsMHg1MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGljIiAgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmx2IiAsMiwweDU4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWx2IiAgLDIsMHg1ODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHVmIiwyLDB4NTkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHVmIiAsMiwweDU5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXp1ZiIgLDIsMHg1QTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlpIiAgICwyLDB4MDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCBBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRtIiAgICAsMiwweDA5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkcCIgICAgLDIsMHgwODcwMDAwMCwwLCAgICAgICAgICAgeyBBYnMyNHxEaXJlY3QsIERQUmVnfE5vdFJlcSwgMCB9LCBJbW1fVUludCB9LAotICB7ICJsb3Bvd2VyIiwwLDB4MTA4MDAwMDEsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibHNoIiAgICAsMiwweDA5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxzaDMiICAgLDMsMHgyNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibWF4c3BlZWQiLDAsMHgxMDgwMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgIm1weWYiICAgLDIsMHgwQTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJtcHlmMyIgICwzLDB4MjQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgIm1weWkiICAgLDIsMHgwQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJtcHlpMyIgICwzLDB4MjUwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5lZ2IiICAgLDIsMHgwQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJuZWdmIiAgICwyLDB4MEI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibmVnaSIgICAsMiwweDBDMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5vcCIgICAgLDEsMHgwQzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWd8SW5kaXJlY3R8Tm90UmVxLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5vcm0iICAgLDIsMHgwRDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LCAvKkNoZWNrIGFub3RoZXIgc291cmNlKi8KLSAgeyAibm90IiAgICAsMiwweDBEODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yIiAgICAgLDIsMHgxMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJvcjMiICAgICwzLDB4MjU4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInBvcCIgICAgLDEsMHgwRTIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wZiIgICAsMSwweDBFQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInB1c2giICAgLDEsMHgwRjIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaGYiICAsMSwweDBGQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGkiICAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1IiAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsbyIgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlscyIgLDAsMHg3ODAyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGloaSIgLDAsMHg3ODAzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlocyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGllcSIgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluZSIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdCIgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsZSIgLDAsMHg3ODA4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlndCIgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlnZSIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6IiAgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlueiIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlwIiAgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluIiAgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubiIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludiIgLDAsMHg3ODBDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl2IiAgLDAsMHg3ODBEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludWYiLDAsMHg3ODBFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1ZiIgLDAsMHg3ODBGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluYyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGljIiAgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHYiLDAsMHg3ODEwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdiIgLDAsMHg3ODExMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHVmIiwwLDB4NzgxMjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdWYiLDAsMHg3ODEzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6dWYiLDAsMHg3ODE0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHMiICAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1IiAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsbyIgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNscyIgLDAsMHg3ODgyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNoaSIgLDAsMHg3ODgzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNocyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNlcSIgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuZSIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdCIgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsZSIgLDAsMHg3ODg4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNndCIgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNnZSIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6IiAgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNueiIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNwIiAgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuIiAgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubiIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudiIgLDAsMHg3ODhDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN2IiAgLDAsMHg3ODhEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudWYiLDAsMHg3ODhFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1ZiIgLDAsMHg3ODhGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuYyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNjIiAgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHYiLDAsMHg3ODkwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdiIgLDAsMHg3ODkxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHVmIiwwLDB4Nzg5MjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdWYiLDAsMHg3ODkzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6dWYiLDAsMHg3ODk0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJuZCIgICAgLDIsMHgxMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJyb2wiICAgICwxLDB4MTFFMDAwMDEsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvbGMiICAgLDEsMHgxMjYwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9yIiAgICAsMSwweDEyRTBGRkZGLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3JjIiAgICwxLDB4MTM2MEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJwdGIiICAgLDEsMHg2NDAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJycHRzIiAgICwxLDB4MTM5QjAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInNpZ2kiICAgLDAsMHgxNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInN0ZiIgICAgLDIsMHgxNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGZpIiAgICwyLDB4MTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgUm4sIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3RpIiAgICAsMiwweDE1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN0aWkiICAgLDIsMHgxNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWcsIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiIiAgICwyLDB4MTY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViYjMiICAsMywweDI2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJjIiAgICwyLDB4MTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic3ViZiIgICAsMiwweDE3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YmYzIiAgLDMsMHgyNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAic3ViaSIgICAsMiwweDE4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmkzIiAgLDMsMHgyNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAic3VicmIiICAsMiwweDE4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YnJmIiAgLDIsMHgxOTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdWJyaSIgICwyLDB4MTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3dpIiAgICAsMCwweDY2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcCIgICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHUiICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxvIiAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxzIiAsMSwweDc0ODIwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhpIiAsMSwweDc0ODMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhzIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGVxIiAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5lIiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx0IiAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxlIiAsMSwweDc0ODgwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGd0IiAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGdlIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHoiICAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG56IiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHAiICAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG4iICAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5uIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG52IiAsMSwweDc0OEMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHYiICAsMSwweDc0OEQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG51ZiIsMSwweDc0OEUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHVmIiAsMSwweDc0OEYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5jIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGMiICAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdiIsMSwweDc0OTAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx2IiAsMSwweDc0OTEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdWYiLDEsMHg3NDkyMDAyMCwwLCAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx1ZiIsMSwweDc0OTMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHp1ZiIsMSwweDc0OTQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHN0YiIgICAsMiwweDFBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInRzdGIzIiAgLDIsMHgyNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInhvciIgICAgLDIsMHgxQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJ4b3IzIiAgICwzLDB4MjgwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIiIgICAgICAgLDAsMHgwMDAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlICpjb25zdCB0aWMzMF9vcHRhYl9lbmQgPQotICB0aWMzMF9vcHRhYiArIHNpemVvZih0aWMzMF9vcHRhYikvc2l6ZW9mKHRpYzMwX29wdGFiWzBdKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRzXzI7Ci0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbMl1bM107Ci0gIC8qIFdoaWNoIG9wZXJhbmQgZml0cyBpbnRvIHdoaWNoIHBhcnQgb2YgdGhlIGZpbmFsIG9wY29kZSB3b3JkLiAqLwotICBpbnQgb3BvcmRlcjsKLX0gcGFydGVtcGxhdGU7Ci0KLS8qIG9wb3JkZXIgZGVmaW5lcyAtIG5vdCB2ZXJ5IGRlc2NyaXB0aXZlLiAqLwotI2RlZmluZSBPT180b3AxICAgMAotI2RlZmluZSBPT180b3AyICAgMQotI2RlZmluZSBPT180b3AzICAgMgotI2RlZmluZSBPT181b3AxICAgMwotI2RlZmluZSBPT181b3AyICAgNAotI2RlZmluZSBPT19QRmllbGQgNQotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgdGljMzBfcGFyb3B0YWJbXSA9IHsKLSAgeyAicV9hYnNmX3N0ZiIsICAgMiwyLDB4QzgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hYnNpX3N0aSIsICAgMiwyLDB4Q0EwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hZGRmM19zdGYiLCAgMywyLDB4Q0MwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYWRkaTNfc3RpIiwgIDMsMiwweENFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FuZDNfc3RpIiwgICAzLDIsMHhEMDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hc2gzX3N0aSIsICAgMywyLDB4RDIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfZml4X3N0aSIsICAgIDIsMiwweEQ0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfZmxvYXRfc3RmIiwgIDIsMiwweEQ2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRmX2xkZiIsICAgIDIsMiwweEM0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRmX3N0ZiIsICAgIDIsMiwweEQ4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRpX2xkaSIsICAgIDIsMiwweEM2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRpX3N0aSIsICAgIDIsMiwweERBMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbHNoM19zdGkiLCAgIDMsMiwweERDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX21weWYzX2FkZGYzIiwzLDMsMHg4MDAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlmM19zdGYiLCAgMywyLDB4REUwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5ZjNfc3ViZjMiLDMsMywweDg0MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfYWRkaTMiLDMsMywweDg4MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfc3RpIiwgIDMsMiwweEUwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX21weWkzX3N1YmkzIiwzLDMsMHg4QzAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX25lZ2Zfc3RmIiwgICAyLDIsMHhFMjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25lZ2lfc3RpIiwgICAyLDIsMHhFNDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25vdF9zdGkiLCAgICAyLDIsMHhFNjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX29yM19zdGkiLCAgICAzLDIsMHhFODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9zdGZfc3RmIiwgICAgMiwyLDB4QzAwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdGlfc3RpIiwgICAgMiwyLDB4QzIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdWJmM19zdGYiLCAgMywyLDB4RUEwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfc3ViaTNfc3RpIiwgIDMsMiwweEVDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX3hvcjNfc3RpIiwgICAzLDIsMHhFRTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAiIiwgICAgICAgICAgICAgMCwwLDB4MDAwMDAwMDAsIHsgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMCB9IH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHBhcnRlbXBsYXRlICpjb25zdCB0aWMzMF9wYXJvcHRhYl9lbmQgPQotICB0aWMzMF9wYXJvcHRhYiArIHNpemVvZih0aWMzMF9wYXJvcHRhYikvc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiWzBdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWM1NHguaCBiL2luY2x1ZGUvb3Bjb2RlL3RpYzU0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlOGM5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzU0eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qIHRpYzU0eC5oIC0tIEhlYWRlciBmaWxlIGZvciBUSSBUTVMzMjBDNTRYIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFRpbW90aHkgV2FsbCAodHdhbGxAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1RJQzU0WF9IXwotI2RlZmluZSBfVElDNTRYX0hfCi0KLXR5cGVkZWYgc3RydWN0IF9zeW1ib2wKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgc2hvcnQgdmFsdWU7Ci19IHN5bWJvbDsKLQotZW51bSBvcHR5cGUgewotICBPUFQgPSAweDgwMDAsCi0gIE9QX05vbmUgPSAweDAsCi0KLSAgT1BfWG1lbSwgLyogQVIzIG9yIEFSNCwgaW5kaXJlY3QgKi8KLSAgT1BfWW1lbSwgLyogQVIzIG9yIEFSNCwgaW5kaXJlY3QgKi8KLSAgT1BfcG1hZCwgLyogUFJPRyBtZW0sIGRpcmVjdCAqLwotICBPUF9kbWFkLCAvKiBEQVRBIG1lbSwgZGlyZWN0ICovCi0gIE9QX1NtZW0sCi0gIE9QX0xtZW0sIC8qIDMyLWJpdCBzaW5nbGUtYWRkcmVzc2VkIChkaXJlY3QvaW5kaXJlY3QpICovCi0gIE9QX01NUiwKLSAgT1BfUEEsCi0gIE9QX1NpbmQsCi0gIE9QX3hwbWFkLAotICBPUF94cG1hZF9tczcsCi0gIE9QX01NUlgsCi0gIE9QX01NUlksCi0KLSAgT1BfU1JDMSwgLyogc3JjIGFjY3VtdWxhdG9yIGluIGJpdCA4ICovCi0gIE9QX1NSQywgLyogc3JjIGFjY3VtdWxhdG9yIGluIGJpdCA5ICovCi0gIE9QX1JORCwgLyogcm91bmRlZCByZXN1bHQgZHN0IGFjY3VtdWxhdG9yLCBvcHBvc2l0ZSBvZiBiaXQgOCAqLwotICBPUF9EU1QsIC8qIGRzdCBhY2N1bXVsYXRvciBpbiBiaXQgOCAqLwotICBPUF9BUlgsIC8qIGFyWCBpbiBiaXRzIDAtMyAqLwotICBPUF9TSElGVCwgLyogLTE2IHRvIDE1IChTSElGVCksIGJpdHMgMC00ICovCi0gIE9QX1NIRlQsIC8qICAgMCB0byAxNSAoU0hJRlQxIGluIHN1bW1hcnkpLCBiaXRzIDAtMyAqLwotICBPUF9CLCAvKiBBQ0MgQiBvbmx5ICovCi0gIE9QX0EsIC8qIEFDQyBBIG9ubHkgKi8KLQotICBPUF9saywgLyogMTYtYml0IGltbWVkaWF0ZSwgJyMnIG9wdGlvbmFsICovCi0gIE9QX1RTLAotICBPUF9rOCwgLyogLTEyOCA8PSBrIDw9IDEyOCAqLwotICBPUF8xNiwgLyogbGl0ZXJhbCAiMTYiICovCi0gIE9QX0JJVEMsIC8qIDAgdG8gMTYgKi8KLSAgT1BfQ0MsIC8qIGNvbmRpdGlvbiBjb2RlICovCi0gIE9QX0NDMiwgLyogNC1iaXQgY29uZGl0aW9uIGNvZGUgKi8KLSAgT1BfQ0MzLCAvKiAyLWJpdCBjb25kaXRpb24gY29kZSAqLwotICBPUF8xMjMsIC8qIDEsIDIsIG9yIDMgKi8KLSAgT1BfMDMxLCAvKiAwLTMxLCBudW1lcmljICovCi0gIE9QX2s1LCAvKiAwIHRvIDMxICovCi0gIE9QX2s4dSwgLyogMCB0byAyNTUgKi8KLSAgT1BfQVNNLCAvKiAiQVNNIiAqLwotICBPUF9ULCAvKiAiVCIgKi8KLSAgT1BfRFAsIC8qICJEUCIgKi8KLSAgT1BfQVJQLCAvKiAiQVJQIiAqLwotICBPUF9rMywgLyogMC03ICovCi0gIE9QX2xrdSwgLyogMCB0byA2NTUzNSAqLwotICBPUF9OLCAvKiAwLzEgb3IgU1QwL1NUMSAqLwotICBPUF9TQklULCAvKiBzdGF0dXMgYml0IG9yIDAtMTUgKi8KLSAgT1BfMTIsIC8qIG9uZSBvciB0d28gKi8KLSAgT1BfazksIC8qIDkgYml0cyBvZiBkYXRhIHBhZ2UgKERQKSBhZGRyZXNzICovCi0gIE9QX1RSTiwgLyogIlRSTiIgKi8KLQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3RlbXBsYXRlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbW5lbW9uaWMgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICB1bnNpZ25lZCBpbnQgd29yZHM7IC8qIGluc24gc2l6ZSBpbiB3b3JkcyAqLwotICBpbnQgbWlub3BzLCBtYXhvcHM7IC8qIG1pbi9tYXggb3BlcmFuZCBjb3VudCAqLwotICAvKiBUaGUgc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUgb3Bjb2RlLiAgT3RoZXIgYml0cyBhcmUgemVyby4gCi0gICAgIEluc3RydWN0aW9ucyB3aXRoIG1vcmUgdGhhbiAxNiBiaXRzIG9mIG9wY29kZSBzdG9yZSB0aGUgcmVzdCBpbiB0aGUgdXBwZXIKLSAgICAgMTYgYml0cy4KLSAgICovCi0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSNkZWZpbmUgSU5ESVJFQ1QoT1ApICAgICgoT1ApJjB4ODApCi0jZGVmaW5lIE1PRChPUCkgICAgICAgICAoKChPUCk+PjMpJjB4RikKLSNkZWZpbmUgQVJGKE9QKSAgICAgICAgICgoT1ApJjB4NykKLSNkZWZpbmUgSVNfTEtBRERSKE9QKSAgIChJTkRJUkVDVChPUCkgJiYgTU9EKE9QKT49MTIpCi0jZGVmaW5lIFNSQyhPUCkgICAgICAgICAoKE9QKSYweDIwMCkKLSNkZWZpbmUgRFNUKE9QKSAgICAgICAgICgoT1ApJjB4MTAwKQotI2RlZmluZSBTUkMxKE9QKSAgICAgICAgKChPUCkmMHgxMDApCi0jZGVmaW5lIFNISUZUKE9QKSAgICAgICAoKChPUCkmMHgxMCk/KCgoT1ApJjB4MUYpLTMyKTooKE9QKSYweDFGKSkKLSNkZWZpbmUgU0hGVChPUCkgICAgICAgICgoT1ApJjB4RikKLSNkZWZpbmUgQVJYKE9QKSAgICAgICAgICgoT1ApJjB4NykKLSNkZWZpbmUgWE1FTShPUCkgICAgICAgICgoKE9QKSYweDAwRjApPj40KQotI2RlZmluZSBZTUVNKE9QKSAgICAgICAgKChPUCkmMHgwMDBGKQotI2RlZmluZSBYTU9EKEMpICAgICAgICAoKChDKSYweEMpPj4yKQotI2RlZmluZSBYQVJYKEMpICAgICAgICAoKChDKSYweDMpKzIpCi0jZGVmaW5lIENDMyhPUCkgICAgICAgICAoKChPUCk+PjgpJjB4MykKLSNkZWZpbmUgU0JJVChPUCkgICAgICAgICgoT1ApJjB4RikKLSNkZWZpbmUgTU1SKE9QKSAgICAgICAgICgoT1ApJjB4N0YpCi0jZGVmaW5lIE1NUlgoT1ApICAgICAgICAoKCgoT1ApPj40KSYweEYpKzE2KQotI2RlZmluZSBNTVJZKE9QKSAgICAgICAgKCgoT1ApJjB4RikrMTYpCi0KLSNkZWZpbmUgT1BUWVBFKFgpICAgICAgICgoWCkmfk9QVCkKLQotICAvKiBPbmVzIGluIHRoaXMgbWFzayBpbmRpY2F0ZSB3aGljaCBiaXRzIG11c3QgbWF0Y2ggdGhlIG9wY29kZSBmaWVsZC4KLSAgICAgWmVyb2VzIGluZGljYXRlIGRvbid0IGNhcmUgYml0cyAob3BlcmFuZHMgYW5kL29yIG9wY29kZSBvcHRpb25zKSAqLwotICB1bnNpZ25lZCBzaG9ydCBtYXNrOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMgKGF0IG1vc3QgNCBvcGVyYW5kcykgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTIDQKLSAgZW51bSBvcHR5cGUgb3BlcmFuZF90eXBlc1tNQVhfT1BFUkFORFNdOwotCi0gIC8qIFNwZWNpYWwgcHVycG9zZSBmbGFncyAoZS5nLiBicmFuY2ggdHlwZSwgcGFyYWxsZWwsIGRlbGF5LCBldGMpIAotICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0jZGVmaW5lIEJfTkVYVCAgICAgIDAgLyogbm9ybWFsIGV4ZWN1dGlvbiwgbmV4dCBpbnNuIGlzIG5leHQgYWRkcmVzcyAqLwotI2RlZmluZSBCX0JSQU5DSCAgICAxIC8qIG5leHQgaW5zbiBpcyBpbiBvcGNvZGUgKi8KLSNkZWZpbmUgQl9SRVQgICAgICAgMiAvKiBuZXh0IGluc24gaXMgb24gc3RhY2sgKi8KLSNkZWZpbmUgQl9CQUNDICAgICAgMyAvKiBuZXh0IGluc24gaXMgaW4gYWNjICovCi0jZGVmaW5lIEJfUkVQRUFUICAgIDQgLyogbmV4dCBpbnNuIHJlcGVhdHMgKi8KLSNkZWZpbmUgRkxfQk1BU0sgICAgMHgwNwotCi0jZGVmaW5lIEZMX0RFTEFZICAgIDB4MTAgLyogaW5zdHJ1Y3Rpb24gdXNlcyBkZWxheSBzbG90cyAqLwotI2RlZmluZSBGTF9FWFQgICAgICAweDIwIC8qIGluc3RydWN0aW9uIHRha2VzIHR3byB3b3JkcyAqLyAgIAotI2RlZmluZSBGTF9GQVIgICAgICAweDQwIC8qIGZhciBtb2RlIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgRkxfTFAgICAgICAgMHg4MCAvKiBMUC1vbmx5IGluc3RydWN0aW9uICovCi0jZGVmaW5lIEZMX05SICAgICAgIDB4MTAwIC8qIG5vIHJlcGVhdCBhbGxvd2VkICovCi0jZGVmaW5lIEZMX1NNUiAgICAgIDB4MjAwIC8qIFNtZW0gcmVhZCAoZm9yIGZsYWdnaW5nIHdyaXRlLW9ubHkgKitBUnggKi8KLQotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGUyLCBtYXNrMjsgICAvKiBzb21lIGluc25zIGhhdmUgYW4gZXh0ZW5kZWQgb3Bjb2RlICovCi0KLX0gdGVtcGxhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9wYXJ0ZW1wbGF0ZSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnBhcm5hbWU7Ci0gIHVuc2lnbmVkIGludCB3b3JkczsgLyogbGVuZ3RoIGluIHdvcmRzICovCi0gIGludCBtaW5vcHMsIG1heG9wczsgLyogbWluL21heCBvcGVyYW5kIGNvdW50IGZvciAybmQgcGFydCBvZiBpbnNuICovCi0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgdW5zaWduZWQgc2hvcnQgbWFzazsKLSAgZW51bSBvcHR5cGUgb3BlcmFuZF90eXBlc1tNQVhfT1BFUkFORFNdOwotICBlbnVtIG9wdHlwZSBwYXJvcGVyYW5kX3R5cGVzW01BWF9PUEVSQU5EU107Ci19IHBhcnRlbXBsYXRlOwotCi1leHRlcm4gY29uc3QgdGVtcGxhdGUgdGljNTR4X3Vua25vd25fb3Bjb2RlOwotZXh0ZXJuIGNvbnN0IHRlbXBsYXRlIHRpYzU0eF9vcHRhYltdOwotZXh0ZXJuIGNvbnN0IHBhcnRlbXBsYXRlIHRpYzU0eF9wYXJvcHRhYltdOwotZXh0ZXJuIGNvbnN0IHN5bWJvbCBtbXJlZ3NbXSwgcmVnc1tdOwotZXh0ZXJuIGNvbnN0IHN5bWJvbCBjb25kaXRpb25fY29kZXNbXSwgY2MyX2NvZGVzW10sIHN0YXR1c19iaXRzW107Ci1leHRlcm4gY29uc3Qgc3ltYm9sIGNjM19jb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKm1pc2Nfc3ltYm9sc1tdOwotCi0jZW5kaWYgLyogVElDNTRYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmggYi9pbmNsdWRlL29wY29kZS90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliYzMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogdGljODAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVikgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVElDODBfSAotI2RlZmluZSBUSUM4MF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wY29kZS4gICovCi0KLXN0cnVjdCB0aWM4MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLQotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIG9wZXJhbmRzCi0gICAgIGFyZSB6ZXJvZXMuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhIG1hc2sKLSAgICAgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZSBvcGNvZGUKLSAgICAgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90IG1hdGNoIChhbmQgYXJlCi0gICAgIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIFNwZWNpYWwgcHVycG9zZSBmbGFncyBmb3IgdGhpcyBvcGNvZGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlIG9wZXJhbmQKLSAgICAgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QgYXBwZWFyIGluCi0gICAgIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICBGSVhNRTogQWRqdXN0IHNpemUgdG8KLSAgICAgbWF0Y2ggYWN0dWFsIHJlcXVpcmVtZW50cyB3aGVuIFRJYzgwIHN1cHBvcnQgaXMgY29tcGxldGUgKi8KLQotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZSBpbgotICAgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyIGluc3RydWN0aW9ucy4KLSAgIEZJWE1FOiBUaGlzIGlzbid0IGN1cnJlbnRseSB0cnVlLiAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgdGljODBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB0aWM4MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW107Ci0KLQwKLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgdGljODBfb3BlcmFuZC4KLQotICAgTm90ZSB0aGF0IGZsYWdzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzLCBzdWNoIGFzIHRoZSBnZW5lcmFsIHB1cnBvc2UKLSAgIHJlZ2lzdGVycyAoZXg6IHIxMCksIGNvbnRyb2wgcmVnaXN0ZXJzIChleDogRlBTVCksIGNvbmRpdGlvbiBjb2RlcyAoZXg6Ci0gICBlcTAuYiksIGJpdCBudW1iZXJzIChleDogZ3QuYiksIGV0YyBhcmUgbGFyZ2UgZW5vdWdoIHRoYXQgdGhleSBjYW4gYmUKLSAgIG9yJ2QgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgYWN0dWFsIG51bWVyaWMgdmFsdWUKLSAgIHRoYXQgY29ycmVwb25kcyB0byB0aGlzIHByZWRlZmluZWQgc3ltYm9sLiAgVGhpcyB3YXkgYSBzaW5nbGUgaW50IGNhbgotICAgY29udGFpbiBib3RoIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBpdCdzIHR5cGUuCi0gKi8KLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiByZWdpc3RlciBudW1iZXIuICBGbG9hdGluZyBwb2ludCBudW1iZXJzCi0gICBmb3IgZXhhbXBsZSBhcmUgc3RvcmVkIGluIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXJzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRVZFTgkoMSA8PCAwKQotCi0vKiBUaGlzIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyIGFuZCBtdXN0IGJlIG9uZSBncmVhdGVyIHRoYW4KLSAgIHRoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIHByZXZpb3VzIG9wZXJhbmQuICBJLkUuIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4KLSAgIGFuIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9PREQJKDEgPDwgMSkKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfU0lHTkVECSgxIDw8IDIpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgYmUgZWl0aGVyIGEgcHJlZGVmaW5lZCBjb25zdGFudCBuYW1lIG9yIGEgbnVtZXJpYyB2YWx1ZS4KLSAgIEFuIGV4YW1wbGUgd291bGQgYmUgYSBjb25kaXRpb24gY29kZSBsaWtlICJlcTAuYiIgd2hpY2ggaGFzIHRoZSBudW1lcmljCi0gICB2YWx1ZSAweDIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9OVU0JKDEgPDwgMykKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHZhcmlvdXMKLSAgIGluc3RydWN0aW9ucywgbGlrZSB0aGUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3YW50Ci0gICB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgImRpc3BsYWNlbWVudChyZWcpIiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUEFSRU5TCSgxIDw8IDQpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIHJlbGF0aXZlIGJyYW5jaCBvZmZzZXQuICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cwotICAgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHRoZSBvZmZzZXRzIGFyZSB0YWtlbiBhcyB3b3JkCi0gICBvZmZzZXRzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUENSRUwJKDEgPDwgNSkKLQotLyogVGhpcyBmbGFnIGlzIGEgaGludCB0byB0aGUgZGlzYXNzZW1ibGVyIGZvciB1c2luZyBoZXggYXMgdGhlIHByZWZlcmVkCi0gICBwcmludGluZyBmb3JtYXQsIGV2ZW4gZm9yIHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGltbWVkaWF0ZSB2YWx1ZXMuCi0gICBOb3JtYWxseSB2YWx1ZXMgaW4gdGhlIHJhbmdlIC05OTkgdG8gOTk5IGFyZSBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsCi0gICB2YWx1ZXMgYW5kIG90aGVyIHZhbHVlcyBhcmUgcHJpbnRlZCBpbiBoZXguICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVRGSUVMRAkoMSA8PCA2KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTcgaW4gYSBzaG9ydAotICAgaW1tZWRpYXRlIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9NX1NJCSgxIDw8IDcpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgaGF2ZSBhICI6bSIgbW9kaWZpZXIgc3BlY2lmaWVkIGJ5IGJpdCAxNSBpbiBhIGxvbmcKLSAgIGltbWVkaWF0ZSBvciByZWdpc3RlciBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9MSQkoMSA8PCA4KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOnMiIG1vZGlmaWVyIHNwZWNpZmllZCBpbiBiaXQgMTEgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NDQUxFRAkoMSA8PCA5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRkxPQVQJKDEgPDwgMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBieXRlIG9mZnNldCBmcm9tIGEgYmFzZSByZWxvY2F0aW9uLiBUaGUgbG93ZXIKLSB0d28gYml0cyBvZiB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIGlnbm9yZWQgd2hlbiB0aGUgdmFsdWUgaXMKLSB3cml0dGVuIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CQVNFUkVMCSgxIDw8IDExKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gImVuZG1hc2siIGZpZWxkIGZvciBhIHNoaWZ0IGluc3RydWN0aW9uLgotICAgSXQgaXMgdHJlYXRlZCBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGhhdmUgdmFsdWVzIG9mIDAtMzIsCi0gICB3aGVyZSAwIGFuZCAzMiByZXN1bHQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyCi0gICBtdXN0IGJlIGFibGUgdG8gYWNjZXB0IGJvdGggZW5kbWFzayB2YWx1ZXMuICBUaGlzIGRpc2Fzc2VtYmxlcgotICAgaGFzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIGluc3RydWN0aW9uIHdoaWNoIHZhbHVlIHdhcyAKLSAgIGdpdmVuIGF0IGFzc2VtYmx5IHRpbWUsIHNvIGl0IGp1c3QgdXNlcyAnMCcuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9FTkRNQVNLCSgxIDw8IDEyKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgb25lIG9mIHRoZSAzMiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ3InLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfR1BSCSgxIDw8IDI3KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3Rlci4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdhJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZQQQkoIDEgPDwgMjgpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgIkVJRiIsICJFUEMiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQ1IJKDEgPDwgMjkpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbmRpdGlvbiBjb2RlLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxMC5iIiwgIm5lMC53IiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NDCSgxIDw8IDMwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBiaXQgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxLmIiLCAib3IuZiIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuCi0gICBOb3RlIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIGluc3RydWN0aW9uIGluIDEncyBjb21wbGVtZW50IHJlbGF0aXZlCi0gICB0byB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBtYW51YWwuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVROVU0JKDEgPDwgMzEpCi0KLS8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIHN0cmlwIG9wZXJhbmQgYml0cyBmcm9tIGFuIGludCB0aGF0IGNvbnRhaW5zCi0gICBib3RoIG9wZXJhbmQgYml0cyBhbmQgYSBudW1lcmljIHZhbHVlIGluIHRoZSBsc2JzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTUFTSwkoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IgfCBUSUM4MF9PUEVSQU5EX0NDIHwgVElDODBfT1BFUkFORF9CSVROVU0pCi0KLQwKLS8qIEZsYWcgYml0cyBmb3IgdGhlIHN0cnVjdCB0aWM4MF9vcGNvZGUgZmxhZ3MgZmllbGQuICovCi0KLSNkZWZpbmUgVElDODBfVkVDVE9SCQkwMQkvKiBJcyBhIHZlY3RvciBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBUSUM4MF9OT19SMF9ERVNUCTAyCS8qIFJlZ2lzdGVyIHIwIGNhbm5vdCBiZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0KLQwKLS8qIFRoZSBvcGNvZGVzIGxpYnJhcnkgY29udGFpbnMgYSB0YWJsZSB0aGF0IGFsbG93cyB0cmFuc2xhdGlvbiBmcm9tIHByZWRlZmluZWQKLSAgIHN5bWJvbCBuYW1lcyB0byBudW1lcmljIHZhbHVlcywgYW5kIHZpY2UgdmVyc2EuICovCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgc3ltYm9scy4gICovCi0KLXN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbAotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotI2RlZmluZSBQRFNfTkFNRShwZHNwKSAoKHBkc3ApIC0+IG5hbWUpCi0jZGVmaW5lIFBEU19WQUxVRShwZHNwKSAoKHBkc3ApIC0+IHZhbHVlKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdOwkvKiBUcmFuc2xhdGlvbiBhcnJheSAqLwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwkJCQkvKiBIb3cgbWFueSBtZW1iZXJzIGluIHRoZSBhcnJheSAqLwotCi1jb25zdCBjaGFyICp0aWM4MF92YWx1ZV90b19zeW1ib2wgUEFSQU1TICgoaW50IHZhbCwgaW50IGNsYXNzKSk7CS8qIFRyYW5zbGF0ZSB2YWx1ZSB0byBzeW1ib2xpYyBuYW1lICovCi1pbnQgdGljODBfc3ltYm9sX3RvX3ZhbHVlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBjbGFzcykpOwkJLyogVHJhbnNsYXRlIHN5bWJvbGljIG5hbWUgdG8gdmFsdWUgKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKLXRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICopKTsKLQotI2VuZGlmIC8qIFRJQzgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaCBiL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MTZmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogdjg1MC5oIC0tIEhlYWRlciBmaWxlIGZvciBORUMgVjg1MCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVjg1MF9ICi0jZGVmaW5lIFY4NTBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB2ODUwX29wY29kZS4gICovCi0KLXN0cnVjdCB2ODUwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLQotICAvKiBXaGljaCAoaWYgYW55KSBvcGVyYW5kIGlzIGEgbWVtb3J5IG9wZXJhbmQuICAqLwotICB1bnNpZ25lZCBpbnQgbWVtb3A7Ci0KLSAgLyogVGFyZ2V0IHByb2Nlc3NvcihzKS4gIEEgYml0IGZpZWxkIG9mIHByb2Nlc3NvcnMgd2hpY2ggc3VwcG9ydAotICAgICB0aGlzIGluc3RydWN0aW9uLiAgTm90ZSBhIGJpdCBmaWVsZCBpcyB1c2VkIGFzIHNvbWUgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhdmFpbGFibGUgb24gbXVsdGlwbGUsIGRpZmZlcmVudCBwcm9jZXNzb3IgdHlwZXMsIHdoZXJlYXMKLSAgICAgb3RoZXIgaW5zdHJ1Y3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBvbmUgc3BlY2lmaWMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwcm9jZXNzb3JzOwotfTsKLQotLyogVmFsdWVzIGZvciB0aGUgcHJvY2Vzc29ycyBmaWVsZCBpbiB0aGUgdjg1MF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTAJCSgxIDw8IDApCQkvKiBKdXN0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX0FMTAkJLTEJCQkvKiBBbnkgcHJvY2Vzc29yLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFCQkoMSA8PCAxKQkJLyogSnVzdCB0aGUgVjg1MEUuICovCi0jZGVmaW5lIFBST0NFU1NPUl9OT1RfVjg1MAkofiBQUk9DRVNTT1JfVjg1MCkJLyogQW55IHByb2Nlc3NvciBleGNlcHQgdGhlIFY4NTAuICAqLwotI2RlZmluZSBQUk9DRVNTT1JfVjg1MEVBCSgxIDw8IDIpCQkvKiBKdXN0IHRoZSBWODUwRUEuICovCi0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgdjg1MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHY4NTBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHY4NTBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICAvKiBJZiB0aGlzIHZhbHVlIGlzIC0xIHRoZW4gdGhlIG9wZXJhbmQncyBiaXRzIGFyZSBpbiBhIGRpc2NvbnRpbm91cyBkaXN0cmlidXRpb24gaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBpbnQgYml0czsKLQotICAvKiAoYml0cyA+PSAwKTogIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIC8qIChiaXRzID09IC0xKTogQml0IG1hc2sgb2YgdGhlIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKG9wICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQgKG1vc3Qgb3BlcmFuZHMKLSAgICAgY2FuIGFjY2VwdCBhbnkgdmFsdWUpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyAoKiBpbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKiBlcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSBvLT5iaXRzID09IC0xID8gKChpKSAmIG8tPnNoaWZ0KSA6ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmIChvLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JICAgICBvcCA9IChvcCA8PCAoMzIgLSBvLT5iaXRzKSkgPj4gKDMyIC0gby0+Yml0cyk7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgaW50ICogaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB2ODUwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUcJMHgwMQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBzeXN0ZW0gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1NSRwkweDAyCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGNvbmRpdGlvbiBjb2RlIHVzZWQgaW4gdGhlIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0NDCQkweDA0Ci0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TSUdORUQJMHgwOAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgdGhlIGVwIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0VQCQkweDEwCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfRElTUAkweDIwCi0KLS8qIFRoaXMgaXMgYSByZWxheGFibGUgb3BlcmFuZC4gICBPbmx5IHVzZWQgZm9yIEQ5LT5EMjIgYnJhbmNoIHJlbGF4aW5nCi0gICByaWdodCBub3cuICBXZSBtYXkgbmVlZCBvdGhlcnMgaW4gdGhlIGZ1dHVyZSAob3IgbWF5YmUgaGFuZGxlIHRoZW0gbGlrZQotICAgcHJvbW90ZWQgb3BlcmFuZHMgb24gdGhlIG1uMTAzMDA/KSAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1JFTEFYCTB4NDAKLQotLyogVGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBtdXN0IG5vdCBiZSByMCAqLwotI2RlZmluZSBWODUwX05PVF9SMAkgICAgICAgIDB4ODAKLQotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0vKiBwdXNoL3BvcCB0eXBlIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX1BVU0hfUE9QCQkweDEwMAotCi0vKiAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd3MgaW5zdHJ1Y3Rpb24sIFY4NTBFIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgVjg1MEVfSU1NRURJQVRFMTYJMHgyMDAKLQotLyogMzIgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTMyCTB4NDAwCi0KLSNlbmRpZiAvKiBWODUwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIGIvaW5jbHVkZS9vcGNvZGUvdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWZlYmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyogVmF4IG9wY2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1HREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIHZheF9vcGNvZGVUCi0jZGVmaW5lIHZheF9vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIHZheF9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290CQkJLyogdmF4IG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKmFyZ3M7CS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHZheF9vcGNvZGVUICAgICAgIGNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90CQkJLyogdmF4IG9wY29kZSB0ZXh0ICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKm5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAibm9wIiwJeyIiLAkJCTB4MDEJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MDIJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MDMJfSB9LAoteyAgICAicmV0IiwJeyIiLAkJCTB4MDQJfSB9LAoteyAgICAicnNiIiwJeyIiLAkJCTB4MDUJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4MDYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4MDcJfSB9LAoteyAgICAiY3Z0cHMiLAl7InJ3YWJyd2FiIiwJCTB4MDgJfSB9LAoteyAgICAiY3Z0c3AiLAl7InJ3YWJyd2FiIiwJCTB4MDkJfSB9LAoteyAgICAiaW5kZXgiLAl7InJscmxybHJscmx3bCIsCTB4MGEJfSB9LAoteyAgICAiY3JjIiwJeyJhYnJscndhYiIsCQkweDBiCX0gfSwKLXsgICAgInByb2JlciIsCXsicmJyd2FiIiwJCTB4MGMJfSB9LAoteyAgICAicHJvYmV3IiwJeyJyYnJ3YWIiLAkgICAgICAgIDB4MGQJfSB9LAoteyAgICAiaW5zcXVlIiwJeyJhYmFiIiwJCTB4MGUJfSB9LAoteyAgICAicmVtcXVlIiwJeyJhYndsIiwJCTB4MGYJfSB9LAoteyAgICAiYnNiYiIsCXsiYmIiLAkJCTB4MTAJfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJibmVxIiwJeyJiYiIsCQkJMHgxMgl9IH0sCi17ICAgICJibmVxdSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MTMJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDE0CX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDE1CX0gfSwKLXsgICAgImpzYiIsCXsiYWIiLAkJCTB4MTYJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHgxNwl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHgxOAl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHgxOQl9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4MWEJfSB9LAoteyAgICAiYmxlcXUiLAl7ImJiIiwJCQkweDFiCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4MWMJfSB9LAoteyAgICAiYnZzIiwJeyJiYiIsCQkJMHgxZAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweDFlCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJibHNzdSIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYmNzIiwJeyJiYiIsCQkJMHgxZgl9IH0sCi17ICAgICJhZGRwNCIsCXsicndhYnJ3YWIiLAkJMHgyMAl9IH0sCi17ICAgICJhZGRwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMQl9IH0sCi17ICAgICJzdWJwNCIsCXsicndhYnJ3YWIiLAkJMHgyMgl9IH0sCi17ICAgICJzdWJwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMwl9IH0sCi17ICAgICJjdnRwdCIsCXsicndhYmFicndhYiIsCQkweDI0CX0gfSwKLXsgICAgIm11bHAiLAl7InJ3YWJyd2FicndhYiIsCTB4MjUJfSB9LAoteyAgICAiY3Z0dHAiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNgl9IH0sCi17ICAgICJkaXZwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI3CX0gfSwKLXsgICAgIm1vdmMzIiwJeyJyd2FiYWIiLAkJMHgyOAl9IH0sCi17ICAgICJjbXBjMyIsCXsicndhYmFiIiwJCTB4MjkJfSB9LAoteyAgICAic2NhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmEJfSB9LAoteyAgICAic3BhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmIJfSB9LAoteyAgICAibW92YzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyYwl9IH0sCi17ICAgICJjbXBjNSIsCXsicndhYnJicndhYiIsCQkweDJkCX0gfSwKLXsgICAgIm1vdnRjIiwJeyJyd2FicmJhYnJ3YWIiLAkweDJlCX0gfSwKLXsgICAgIm1vdnR1YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZgl9IH0sCi17ICAgICJic2J3IiwJeyJidyIsCQkJMHgzMAl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MzIJfSB9LAoteyAgICAiY3Z0d2IiLAl7InJ3d2IiLAkJMHgzMwl9IH0sCi17ICAgICJtb3ZwIiwJeyJyd2FiYWIiLAkJMHgzNAl9IH0sCi17ICAgICJjbXBwMyIsCXsicndhYmFiIiwJCTB4MzUJfSB9LAoteyAgICAiY3Z0cGwiLAl7InJ3YWJ3bCIsCQkweDM2CX0gfSwKLXsgICAgImNtcHA0IiwJeyJyd2FicndhYiIsCQkweDM3CX0gfSwKLXsgICAgImVkaXRwYyIsCXsicndhYmFiYWIiLAkJMHgzOAl9IH0sCi17ICAgICJtYXRjaGMiLAl7InJ3YWJyd2FiIiwJCTB4MzkJfSB9LAoteyAgICAibG9jYyIsCXsicmJyd2FiIiwJCTB4M2EJfSB9LAoteyAgICAic2twYyIsCXsicmJyd2FiIiwJCTB4M2IJfSB9LAoteyAgICAibW92endsIiwJeyJyd3dsIiwJCTB4M2MJfSB9LAoteyAgICAiYWNidyIsCXsicndyd213YnciLAkJMHgzZAl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweDNlCX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4M2YJfSB9LAoteyAgICAiYWRkZjIiLAl7InJmbWYiLAkJMHg0MAl9IH0sCi17ICAgICJhZGRmMyIsCXsicmZyZndmIiwJCTB4NDEJfSB9LAoteyAgICAic3ViZjIiLAl7InJmbWYiLAkJMHg0Mgl9IH0sCi17ICAgICJzdWJmMyIsCXsicmZyZndmIiwJCTB4NDMJfSB9LAoteyAgICAibXVsZjIiLAl7InJmbWYiLAkJMHg0NAl9IH0sCi17ICAgICJtdWxmMyIsCXsicmZyZndmIiwJCTB4NDUJfSB9LAoteyAgICAiZGl2ZjIiLAl7InJmbWYiLAkJMHg0Ngl9IH0sCi17ICAgICJkaXZmMyIsCXsicmZyZndmIiwJCTB4NDcJfSB9LAoteyAgICAiY3Z0ZmIiLAl7InJmd2IiLAkJMHg0OAl9IH0sCi17ICAgICJjdnRmdyIsCXsicmZ3dyIsCQkweDQ5CX0gfSwKLXsgICAgImN2dGZsIiwJeyJyZndsIiwJCTB4NGEJfSB9LAoteyAgICAiY3Z0cmZsIiwJeyJyZndsIiwJCTB4NGIJfSB9LAoteyAgICAiY3Z0YmYiLAl7InJid2YiLAkJMHg0Ywl9IH0sCi17ICAgICJjdnR3ZiIsCXsicnd3ZiIsCQkweDRkCX0gfSwKLXsgICAgImN2dGxmIiwJeyJybHdmIiwJCTB4NGUJfSB9LAoteyAgICAiYWNiZiIsCXsicmZyZm1mYnciLAkJMHg0Zgl9IH0sCi17ICAgICJtb3ZmIiwJeyJyZndmIiwJCTB4NTAJfSB9LAoteyAgICAiY21wZiIsCXsicmZyZiIsCQkweDUxCX0gfSwKLXsgICAgIm1uZWdmIiwJeyJyZndmIiwJCTB4NTIJfSB9LAoteyAgICAidHN0ZiIsCXsicmYiLAkJCTB4NTMJfSB9LAoteyAgICAiZW1vZGYiLAl7InJmcmJyZndsd2YiLAkJMHg1NAl9IH0sCi17ICAgICJwb2x5ZiIsCXsicmZyd2FiIiwJCTB4NTUJfSB9LAoteyAgICAiY3Z0ZmQiLAl7InJmd2QiLAkJMHg1Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYWRhd2kiLAl7InJ3bXciLAkJMHg1OAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU5IGlzIG5vdCBkZWZpbmVkIHlldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1YSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWIgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJpbnNxaGkiLAl7ImFiYXEiLAkJMHg1Ywl9IH0sCi17ICAgICJpbnNxdGkiLAl7ImFiYXEiLAkJMHg1ZAl9IH0sCi17ICAgICJyZW1xaGkiLAl7ImFxd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJyZW1xdGkiLAl7ImFxd2wiLAkJMHg1Zgl9IH0sCi17ICAgICJhZGRkMiIsCXsicmRtZCIsCQkweDYwCX0gfSwKLXsgICAgImFkZGQzIiwJeyJyZHJkd2QiLAkJMHg2MQl9IH0sCi17ICAgICJzdWJkMiIsCXsicmRtZCIsCQkweDYyCX0gfSwKLXsgICAgInN1YmQzIiwJeyJyZHJkd2QiLAkJMHg2Mwl9IH0sCi17ICAgICJtdWxkMiIsCXsicmRtZCIsCQkweDY0CX0gfSwKLXsgICAgIm11bGQzIiwJeyJyZHJkd2QiLAkJMHg2NQl9IH0sCi17ICAgICJkaXZkMiIsCXsicmRtZCIsCQkweDY2CX0gfSwKLXsgICAgImRpdmQzIiwJeyJyZHJkd2QiLAkJMHg2Nwl9IH0sCi17ICAgICJjdnRkYiIsCXsicmR3YiIsCQkweDY4CX0gfSwKLXsgICAgImN2dGR3IiwJeyJyZHd3IiwJCTB4NjkJfSB9LAoteyAgICAiY3Z0ZGwiLAl7InJkd2wiLAkJMHg2YQl9IH0sCi17ICAgICJjdnRyZGwiLAl7InJkd2wiLAkJMHg2Ygl9IH0sCi17ICAgICJjdnRiZCIsCXsicmJ3ZCIsCQkweDZjCX0gfSwKLXsgICAgImN2dHdkIiwJeyJyd3dkIiwJCTB4NmQJfSB9LAoteyAgICAiY3Z0bGQiLAl7InJsd2QiLAkJMHg2ZQl9IH0sCi17ICAgICJhY2JkIiwJeyJyZHJkbWRidyIsCQkweDZmCX0gfSwKLXsgICAgIm1vdmQiLAl7InJkd2QiLAkJMHg3MAl9IH0sCi17ICAgICJjbXBkIiwJeyJyZHJkIiwJCTB4NzEJfSB9LAoteyAgICAibW5lZ2QiLAl7InJkd2QiLAkJMHg3Mgl9IH0sCi17ICAgICJ0c3RkIiwJeyJyZCIsCQkJMHg3Mwl9IH0sCi17ICAgICJlbW9kZCIsCXsicmRyYnJkd2x3ZCIsCQkweDc0CX0gfSwKLXsgICAgInBvbHlkIiwJeyJyZHJ3YWIiLAkJMHg3NQl9IH0sCi17ICAgICJjdnRkZiIsCXsicmR3ZiIsCQkweDc2CX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNzcgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJhc2hsIiwJeyJyYnJsd2wiLAkJMHg3OAl9IH0sCi17ICAgICJhc2hxIiwJeyJyYnJxd3EiLAkJMHg3OQl9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDdhCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4N2IJfSB9LAoteyAgICAiY2xyZCIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAiY2xyZyIsCXsid2ciLAkJCTB4N2MJfSB9LAoteyAgICAiY2xycSIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAibW92cSIsCXsicnF3cSIsCQkweDdkCX0gfSwKLXsgICAgIm1vdmFxIiwJeyJhcXdsIiwJCTB4N2UJfSB9LAoteyAgICAibW92YWQiLAl7ImFkd2wiLAkJMHg3ZQl9IH0sCi17ICAgICJwdXNoYXEiLAl7ImFxIiwJCQkweDdmCX0gfSwKLXsgICAgInB1c2hhZCIsCXsiYWQiLAkJCTB4N2YJfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHg4MAl9IH0sCi17ICAgICJhZGRiMyIsCXsicmJyYndiIiwJCTB4ODEJfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHg4Mgl9IH0sCi17ICAgICJzdWJiMyIsCXsicmJyYndiIiwJCTB4ODMJfSB9LAoteyAgICAibXVsYjIiLAl7InJibWIiLAkJMHg4NAl9IH0sCi17ICAgICJtdWxiMyIsCXsicmJyYndiIiwJCTB4ODUJfSB9LAoteyAgICAiZGl2YjIiLAl7InJibWIiLAkJMHg4Ngl9IH0sCi17ICAgICJkaXZiMyIsCXsicmJyYndiIiwJCTB4ODcJfSB9LAoteyAgICAiYmlzYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJiaXNiMyIsCXsicmJyYndiIiwJCTB4ODkJfSB9LAoteyAgICAiYmljYjIiLAl7InJibWIiLAkJMHg4YQl9IH0sCi17ICAgICJiaWNiMyIsCXsicmJyYndiIiwJCTB4OGIJfSB9LAoteyAgICAieG9yYjIiLAl7InJibWIiLAkJMHg4Ywl9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4OGQJfSB9LAoteyAgICAibW5lZ2IiLAl7InJid2IiLAkJMHg4ZQl9IH0sCi17ICAgICJjYXNlYiIsCXsicmJyYnJiIiwJCTB4OGYJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDkwCX0gfSwKLXsgICAgImNtcGIiLAl7InJicmIiLAkJMHg5MQl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDkyCX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHg5Mwl9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg5NAl9IH0sCi17ICAgICJ0c3RiIiwJeyJyYiIsCQkJMHg5NQl9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg5Ngl9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg5Nwl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDk4CX0gfSwKLXsgICAgImN2dGJ3IiwJeyJyYnd3IiwJCTB4OTkJfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4OWEJfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4OWIJfSB9LAoteyAgICAicm90bCIsCXsicmJybHdsIiwJCTB4OWMJfSB9LAoteyAgICAiYWNiYiIsCXsicmJyYm1iYnciLAkJMHg5ZAl9IH0sCi17ICAgICJtb3ZhYiIsCXsiYWJ3bCIsCQkweDllCX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4OWYJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHhhMAl9IH0sCi17ICAgICJhZGR3MyIsCXsicndyd3d3IiwJCTB4YTEJfSB9LAoteyAgICAic3VidzIiLAl7InJ3bXciLAkJMHhhMgl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4YTMJfSB9LAoteyAgICAibXVsdzIiLAl7InJ3bXciLAkJMHhhNAl9IH0sCi17ICAgICJtdWx3MyIsCXsicndyd3d3IiwJCTB4YTUJfSB9LAoteyAgICAiZGl2dzIiLAl7InJ3bXciLAkJMHhhNgl9IH0sCi17ICAgICJkaXZ3MyIsCXsicndyd3d3IiwJCTB4YTcJfSB9LAoteyAgICAiYmlzdzIiLAl7InJ3bXciLAkJMHhhOAl9IH0sCi17ICAgICJiaXN3MyIsCXsicndyd3d3IiwJCTB4YTkJfSB9LAoteyAgICAiYmljdzIiLAl7InJ3bXciLAkJMHhhYQl9IH0sCi17ICAgICJiaWN3MyIsCXsicndyd3d3IiwJCTB4YWIJfSB9LAoteyAgICAieG9ydzIiLAl7InJ3bXciLAkJMHhhYwl9IH0sCi17ICAgICJ4b3J3MyIsCXsicndyd3d3IiwJCTB4YWQJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhhZQl9IH0sCi17ICAgICJjYXNldyIsCXsicndyd3J3IiwJCTB4YWYJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweGIwCX0gfSwKLXsgICAgImNtcHciLAl7InJ3cnciLAkJMHhiMQl9IH0sCi17ICAgICJtY29tdyIsCXsicnd3dyIsCQkweGIyCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHhiMwl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHhiNAl9IH0sCi17ICAgICJ0c3R3IiwJeyJydyIsCQkJMHhiNQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHhiNgl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHhiNwl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweGI4CX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4YjkJfSB9LAoteyAgICAicG9wciIsCXsicnciLAkJCTB4YmEJfSB9LAoteyAgICAicHVzaHIiLAl7InJ3IiwJCQkweGJiCX0gfSwKLXsgICAgImNobWsiLAl7InJ3IiwJCQkweGJjCX0gfSwKLXsgICAgImNobWUiLAl7InJ3IiwJCQkweGJkCX0gfSwKLXsgICAgImNobXMiLAl7InJ3IiwJCQkweGJlCX0gfSwKLXsgICAgImNobXUiLAl7InJ3IiwJCQkweGJmCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4YzAJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweGMxCX0gfSwKLXsgICAgInN1YmwyIiwJeyJybG1sIiwJCTB4YzIJfSB9LAoteyAgICAic3VibDMiLAl7InJscmx3bCIsCQkweGMzCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4YzQJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweGM1CX0gfSwKLXsgICAgImRpdmwyIiwJeyJybG1sIiwJCTB4YzYJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweGM3CX0gfSwKLXsgICAgImJpc2wyIiwJeyJybG1sIiwJCTB4YzgJfSB9LAoteyAgICAiYmlzbDMiLAl7InJscmx3bCIsCQkweGM5CX0gfSwKLXsgICAgImJpY2wyIiwJeyJybG1sIiwJCTB4Y2EJfSB9LAoteyAgICAiYmljbDMiLAl7InJscmx3bCIsCQkweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwJCTB4Y2MJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGNkCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4Y2UJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGNmCX0gfSwKLXsgICAgIm1vdmwiLAl7InJsd2wiLAkJMHhkMAl9IH0sCi17ICAgICJjbXBsIiwJeyJybHJsIiwJCTB4ZDEJfSB9LAoteyAgICAibWNvbWwiLAl7InJsd2wiLAkJMHhkMgl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4ZDMJfSB9LAoteyAgICAiY2xyZiIsCXsid2YiLAkJCTB4ZDQJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4ZDQJfSB9LAoteyAgICAidHN0bCIsCXsicmwiLAkJCTB4ZDUJfSB9LAoteyAgICAiaW5jbCIsCXsibWwiLAkJCTB4ZDYJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4ZDcJfSB9LAoteyAgICAiYWR3YyIsCXsicmxtbCIsCQkweGQ4CX0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHhkOQl9IH0sCi17ICAgICJtdHByIiwJeyJybHJsIiwJCTB4ZGEJfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGRiCX0gfSwKLXsgICAgIm1vdnBzbCIsCXsid2wiLAkJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgIm1vdmFsIiwJeyJhbHdsIiwJCTB4ZGUJfSB9LAoteyAgICAibW92YWYiLAl7ImFmd2wiLAkJMHhkZQl9IH0sCi17ICAgICJwdXNoYWwiLAl7ImFsIiwJCQkweGRmCX0gfSwKLXsgICAgInB1c2hhZiIsCXsiYWYiLAkJCTB4ZGYJfSB9LAoteyAgICAiYmJzIiwJeyJybHZiYmIiLAkJMHhlMAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmJiYiIsCQkweGUxCX0gfSwKLXsgICAgImJic3MiLAl7InJsdmJiYiIsCQkweGUyCX0gfSwKLXsgICAgImJiY3MiLAl7InJsdmJiYiIsCQkweGUzCX0gfSwKLXsgICAgImJic2MiLAl7InJsdmJiYiIsCQkweGU0CX0gfSwKLXsgICAgImJiY2MiLAl7InJsdmJiYiIsCQkweGU1CX0gfSwKLXsgICAgImJic3NpIiwJeyJybHZiYmIiLAkJMHhlNgl9IH0sCi17ICAgICJiYmNjaSIsCXsicmx2YmJiIiwJCTB4ZTcJfSB9LAoteyAgICAiYmxicyIsCXsicmxiYiIsCQkweGU4CX0gfSwKLXsgICAgImJsYmMiLAl7InJsYmIiLAkJMHhlOQl9IH0sCi17ICAgICJmZnMiLAl7InJscmJ2YndsIiwJCTB4ZWEJfSB9LAoteyAgICAiZmZjIiwJeyJybHJidmJ3bCIsCQkweGViCX0gfSwKLXsgICAgImNtcHYiLAl7InJscmJ2YnJsIiwJCTB4ZWMJfSB9LAoteyAgICAiY21wenYiLAl7InJscmJ2YnJsIiwJCTB4ZWQJfSB9LAoteyAgICAiZXh0diIsCXsicmxyYnZid2wiLAkJMHhlZQl9IH0sCi17ICAgICJleHR6diIsCXsicmxyYnZid2wiLAkJMHhlZgl9IH0sCi17ICAgICJpbnN2IiwJeyJybHJscmJ2YiIsCQkweGYwCX0gfSwKLXsgICAgImFjYmwiLAl7InJscmxtbGJ3IiwJCTB4ZjEJfSB9LAoteyAgICAiYW9ibHNzIiwJeyJybG1sYmIiLAkJMHhmMgl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxiYiIsCQkweGYzCX0gfSwKLXsgICAgInNvYmdlcSIsCXsibWxiYiIsCQkweGY0CX0gfSwKLXsgICAgInNvYmd0ciIsCXsibWxiYiIsCQkweGY1CX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4ZjYJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHhmNwl9IH0sCi17ICAgICJhc2hwIiwJeyJyYnJ3YWJyYnJ3YWIiLAkweGY4CX0gfSwKLXsgICAgImN2dGxwIiwJeyJybHJ3YWIiLAkJMHhmOQl9IH0sCi17ICAgICJjYWxsZyIsCXsiYWJhYiIsCQkweGZhCX0gfSwKLXsgICAgImNhbGxzIiwJeyJybGFiIiwJCTB4ZmIJfSB9LAoteyAgICAieGZjIiwJeyIiLAkJCTB4ZmMJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImN2dGRoIiwJeyJyZHdoIiwJCTB4MzJmZAl9IH0sCi17ICAgICJjdnRnZiIsCXsicmd3aCIsCQkweDMzZmQJfSB9LAoteyAgICAiYWRkZzIiLAl7InJnbWciLAkJMHg0MGZkCX0gfSwKLXsgICAgImFkZGczIiwJeyJyZ3Jnd2ciLAkJMHg0MWZkCX0gfSwKLXsgICAgInN1YmcyIiwJeyJyZ21nIiwJCTB4NDJmZAl9IH0sCi17ICAgICJzdWJnMyIsCXsicmdyZ3dnIiwJCTB4NDNmZAl9IH0sCi17ICAgICJtdWxnMiIsCXsicmdtZyIsCQkweDQ0ZmQJfSB9LAoteyAgICAibXVsZzMiLAl7InJncmd3ZyIsCQkweDQ1ZmQJfSB9LAoteyAgICAiZGl2ZzIiLAl7InJnbWciLAkJMHg0NmZkCX0gfSwKLXsgICAgImRpdmczIiwJeyJyZ3Jnd2ciLAkJMHg0N2ZkCX0gfSwKLXsgICAgImN2dGdiIiwJeyJyZ3diIiwJCTB4NDhmZAl9IH0sCi17ICAgICJjdnRndyIsCXsicmd3dyIsCQkweDQ5ZmQJfSB9LAoteyAgICAiY3Z0Z2wiLAl7InJnd2wiLAkJMHg0YWZkCX0gfSwKLXsgICAgImN2dHJnbCIsCXsicmd3bCIsCQkweDRiZmQJfSB9LAoteyAgICAiY3Z0YmciLAl7InJid2ciLAkJMHg0Y2ZkCX0gfSwKLXsgICAgImN2dHdnIiwJeyJyd3dnIiwJCTB4NGRmZAl9IH0sCi17ICAgICJjdnRsZyIsCXsicmx3ZyIsCQkweDRlZmQJfSB9LAoteyAgICAiYWNiZyIsCXsicmdyZ21nYnciLAkJMHg0ZmZkCX0gfSwKLXsgICAgIm1vdmciLAl7InJnd2ciLAkJMHg1MGZkCX0gfSwKLXsgICAgImNtcGciLAl7InJncmciLAkJMHg1MWZkCX0gfSwKLXsgICAgIm1uZWdnIiwJeyJyZ3dnIiwJCTB4NTJmZAl9IH0sCi17ICAgICJ0c3RnIiwJeyJyZyIsCQkJMHg1M2ZkCX0gfSwKLXsgICAgImVtb2RnIiwJeyJyZ3J3cmd3bHdnIiwJCTB4NTRmZAl9IH0sCi17ICAgICJwb2x5ZyIsCXsicmdyd2FiIiwJCTB4NTVmZAl9IH0sCi17ICAgICJjdnRnaCIsCXsicmd3aCIsCQkweDU2ZmQJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImFkZGgyIiwJeyJyaG1oIiwJCTB4NjBmZAl9IH0sCi17ICAgICJhZGRoMyIsCXsicmhyaHdoIiwJCTB4NjFmZAl9IH0sCi17ICAgICJzdWJoMiIsCXsicmhtaCIsCQkweDYyZmQJfSB9LAoteyAgICAic3ViaDMiLAl7InJocmh3aCIsCQkweDYzZmQJfSB9LAoteyAgICAibXVsaDIiLAl7InJobWgiLAkJMHg2NGZkCX0gfSwKLXsgICAgIm11bGgzIiwJeyJyaHJod2giLAkJMHg2NWZkCX0gfSwKLXsgICAgImRpdmgyIiwJeyJyaG1oIiwJCTB4NjZmZAl9IH0sCi17ICAgICJkaXZoMyIsCXsicmhyaHdoIiwJCTB4NjdmZAl9IH0sCi17ICAgICJjdnRoYiIsCXsicmh3YiIsCQkweDY4ZmQJfSB9LAoteyAgICAiY3Z0aHciLAl7InJod3ciLAkJMHg2OWZkCX0gfSwKLXsgICAgImN2dGhsIiwJeyJyaHdsIiwJCTB4NmFmZAl9IH0sCi17ICAgICJjdnRyaGwiLAl7InJod2wiLAkJMHg2YmZkCX0gfSwKLXsgICAgImN2dGJoIiwJeyJyYndoIiwJCTB4NmNmZAl9IH0sCi17ICAgICJjdnR3aCIsCXsicnd3aCIsCQkweDZkZmQJfSB9LAoteyAgICAiY3Z0bGgiLAl7InJsd2giLAkJMHg2ZWZkCX0gfSwKLXsgICAgImFjYmgiLAl7InJocmhtaGJ3IiwJCTB4NmZmZAl9IH0sCi17ICAgICJtb3ZoIiwJeyJyaHdoIiwJCTB4NzBmZAl9IH0sCi17ICAgICJjbXBoIiwJeyJyaHJoIiwJCTB4NzFmZAl9IH0sCi17ICAgICJtbmVnaCIsCXsicmh3aCIsCQkweDcyZmQJfSB9LAoteyAgICAidHN0aCIsCXsicmgiLAkJCTB4NzNmZAl9IH0sCi17ICAgICJlbW9kaCIsCXsicmhyd3Jod2x3aCIsCQkweDc0ZmQJfSB9LAoteyAgICAicG9seWgiLAl7InJocndhYiIsCQkweDc1ZmQJfSB9LAoteyAgICAiY3Z0aGciLAl7InJod2ciLAkJMHg3NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjbHJoIiwJeyJ3aCIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgImNscm8iLAl7IndvIiwJCQkweDdjZmQJfSB9LAoteyAgICAibW92byIsCXsicm93byIsCQkweDdkZmQJfSB9LAoteyAgICAibW92YWgiLAl7ImFod2wiLAkJMHg3ZWZkCX0gfSwKLXsgICAgIm1vdmFvIiwJeyJhb3dsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJwdXNoYWgiLAl7ImFoIiwJCQkweDdmZmQJfSB9LAoteyAgICAicHVzaGFvIiwJeyJhbyIsCQkJMHg3ZmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRmaCIsCXsicmZ3aCIsCQkweDk4ZmQJfSB9LAoteyAgICAiY3Z0ZmciLAl7InJmd2ciLAkJMHg5OWZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRoZiIsCXsicmh3ZiIsCQkweGY2ZmQJfSB9LAoteyAgICAiY3Z0aGQiLAl7InJod2QiLAkJMHhmN2ZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJidWdsIiwJeyJybCIsCQkJMHhmZGZmCX0gfSwKLXsgICAgImJ1Z3ciLAl7InJ3IiwJCQkweGZlZmYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLQoteyAgICAgICIiLAl7IiIsIDB9IH0JCS8qIGVtcHR5IGlzIGVuZCBzZW50aW5lbCAqLwotCi19OwkJCQkvKiB2b3RzdHJzICovCi0KLS8qIGVuZDogdmF4Lm9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zOWsuaCBiL2luY2x1ZGUvb3M5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJlZWQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3M5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfTU9EVUxFX0gpCi0jZGVmaW5lIF9NT0RVTEVfSAotCi0vKiBPUy05MDAwIGkzODYgbW9kdWxlIGhlYWRlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBfTVBGMzg2Ci0KLS8qIHNpemVvZiBjb21tb24gaGVhZGVyIGxlc3MgcGFyaXR5IGZpZWxkICovCi0jZGVmaW5lIE5fTV9QQVJJVFkgIChzaXplb2YobWhfY29tKS1zaXplb2YodW5pc2duZWQgc2hvcnQpKQotI2RlZmluZSBPTERfTV9QQVJJVFkgNDYKLSNkZWZpbmUgTV9QQVJJVFkgTl9NX1BBUklUWQotCi0jaWZkZWYgX01QRjY4SwotI2RlZmluZSBNT0RTWU5DIDB4NGFmZCAgICAgIC8qIG1vZHVsZSBoZWFkZXIgc3luYyBjb2RlIGZvciA2ODB4MCBwcm9jZXNzb3JzICovCi0jZW5kaWYKLQotI2lmZGVmIF9NUEYzODYKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmMgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgODAzODYgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTU9EUkVWCTEJCQkvKiBtb2R1bGUgZm9ybWF0IHJldmlzaW9uIDEgKi8KLSNkZWZpbmUgQ1JDQ09OCTB4ODAwZmUzCS8qIGNyYyBwb2x5bm9taWFsIGNvbnN0YW50ICovCi0KLS8qIE1vZHVsZSBhY2Nlc3MgcGVybWlzc2lvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgTVBfT1dORVJfUkVBRAkweDAwMDEKLSNkZWZpbmUgTVBfT1dORVJfV1JJVEUJMHgwMDAyCi0jZGVmaW5lIE1QX09XTkVSX0VYRUMJMHgwMDA0Ci0jZGVmaW5lIE1QX0dST1VQX1JFQUQJMHgwMDEwCi0jZGVmaW5lIE1QX0dST1VQX1dSSVRFCTB4MDAyMAotI2RlZmluZSBNUF9HUk9VUF9FWEVDCTB4MDA0MAotI2RlZmluZSBNUF9XT1JMRF9SRUFECTB4MDEwMAotI2RlZmluZSBNUF9XT1JMRF9XUklURQkweDAyMDAKLSNkZWZpbmUgTVBfV09STERfRVhFQwkweDA0MDAKLSNkZWZpbmUgTVBfV09STERfQUNDRVNTCTB4MDc3NwotI2RlZmluZSBNUF9PV05FUl9NQVNLCTB4MDAwZgotI2RlZmluZSBNUF9HUk9VUF9NQVNLCTB4MDBmMAotI2RlZmluZSBNUF9XT1JMRF9NQVNLCTB4MGYwMAotI2RlZmluZSBNUF9TWVNUTV9NQVNLCTB4ZjAwMAotCi0vKiBNb2R1bGUgVHlwZS9MYW5ndWFnZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTVRfQU5ZCQkwCi0jZGVmaW5lIE1UX1BST0dSQU0JMHgwMDAxCi0jZGVmaW5lIE1UX1NVQlJPVVQJMHgwMDAyCi0jZGVmaW5lIE1UX01VTFRJCTB4MDAwMwotI2RlZmluZSBNVF9EQVRBCQkweDAwMDQKLSNkZWZpbmUgTVRfVFJBUExJQgkweDAwMGIKLSNkZWZpbmUgTVRfU1lTVEVNCTB4MDAwYwotI2RlZmluZSBNVF9GSUxFTUFOCTB4MDAwZAotI2RlZmluZSBNVF9ERVZEUlZSCTB4MDAwZSAKLSNkZWZpbmUgTVRfREVWREVTQwkweDAwMGYKLSNkZWZpbmUgTVRfTUFTSwkJMHhmZjAwCi0KLSNkZWZpbmUgTUxfQU5ZCQkwCi0jZGVmaW5lIE1MX09CSkVDVAkxCi0jZGVmaW5lIE1MX0lDT0RFCTIKLSNkZWZpbmUgTUxfUENPREUJMwotI2RlZmluZSBNTF9DQ09ERQk0Ci0jZGVmaW5lIE1MX0NCTENPREUJNQotI2RlZmluZSBNTF9GUlROQ09ERQk2Ci0jZGVmaW5lIE1MX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rdHlwZWxhbmcodHlwZSxsYW5nKQkoKCh0eXBlKTw8OCl8KGxhbmcpKQotCi0vKiBNb2R1bGUgQXR0cmlidXRlIHZhbHVlcyAqLwotI2RlZmluZSBNQV9SRUVOVAkweDgwCi0jZGVmaW5lIE1BX0dIT1NUCTB4NDAKLSNkZWZpbmUgTUFfU1VQRVIJMHgyMAotI2RlZmluZSBNQV9NQVNLCQkweGZmMDAKLSNkZWZpbmUgTVJfTUFTSwkJMHgwMGZmCi0KLSNkZWZpbmUgbWthdHRyZXZzKGF0dHIsIHJldnMpCSgoKGF0dHIpPDw4KXwocmV2cykpCi0KLSNkZWZpbmUgbV91c2VyIG1fb3duZXIuZ3JwX3Vzci51c3IKLSNkZWZpbmUgbV9ncm91cCBtX293bmVyLmdycF91c3IuZ3JwCi0jZGVmaW5lIG1fZ3JvdXBfdXNlciBtX293bmVyLmdyb3VwX3VzZXIKLQotLyogbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBtb2R1bGUgaGVhZGVyIGZpZWxkcyAqLwotI2RlZmluZSBNT0ROQU1FKG1vZCkgKCh1X2NoYXIqKSgodV9jaGFyKiltb2QgKyAoKE1oX2NvbSltb2QpLT5tX25hbWUpKQotI2lmIDAKLS8qIEFwcGVhcnMgbm90IHRvIGJlIHVzZWQsIGFuZCB0aGUgdV9pbnQzMiB0eXBlZGVmIGlzIGdvbmUgKGJlY2F1c2UgaXQKLSAgIGNvbmZsaWN0ZWQgd2l0aCBhIE1hY2ggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTU9EU0laRShtb2QpICgodV9pbnQzMikoKE1oX2NvbSltb2QpLT5tX3NpemUpCi0jZW5kaWYgLyogMCAqLwotI2RlZmluZSBNSENPTV9CWVRFU19TSVpFIDgwCi0jZGVmaW5lIE5fQkFETUFHKGEpICgoKGEpLmFfaW5mbykgIT0gTU9EU1lOQykKLQotdHlwZWRlZiBzdHJ1Y3QgbWhfY29tIHsKLSAgLyogc3luYyBieXRlcyAoJDRhZmMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtX3N5bmNbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbV9zeXNyZXZbMl07CQkvKiBzeXN0ZW0gcmV2aXNpb24gY2hlY2sgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fc2l6ZVs0XTsJCQkvKiBtb2R1bGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9vd25lcls0XTsJCS8qIGdyb3VwL3VzZXIgaWQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmFtZVs0XTsJCQkvKiBvZmZzZXQgdG8gbW9kdWxlIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fYWNjZXNzWzJdLAkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCi0gICAgbV90eWxhblsyXSwJCS8qIHR5cGUvbGFuZyAqLwotICAgIG1fYXR0cmV2WzJdLAkJLyogcmV2L2F0dHIgKi8KLSAgICBtX2VkaXRbMl07CQkJLyogZWRpdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9uZWVkc1s0XSwJCS8qIG1vZHVsZSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZmxhZ3MuIChyZXNlcnZlZCkgKi8KLSAgICBtX3VzYWdlWzRdLAkJLyogY29tbWVudCBzdHJpbmcgb2Zmc2V0ICovCi0gICAgbV9zeW1ib2xbNF0sCQkvKiBzeW1ib2wgdGFibGUgb2Zmc2V0ICovCi0gICAgbV9leGVjWzRdLAkJCS8qIG9mZnNldCB0byBleGVjdXRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2V4Y3B0WzRdLAkJLyogb2Zmc2V0IHRvIGV4Y2VwdGlvbiBlbnRyeSBwb2ludCAqLwotICAgIG1fZGF0YVs0XSwJCQkvKiBkYXRhIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KLSAgICBtX3N0YWNrWzRdLAkJLyogc3RhY2sgc2l6ZSAqLwotICAgIG1faWRhdGFbNF0sCQkvKiBvZmZzZXQgdG8gaW5pdGlhbGl6ZWQgZGF0YSAqLwotICAgIG1faWRyZWZbNF0sCQkvKiBvZmZzZXQgdG8gZGF0YSByZWZlcmVuY2UgbGlzdHMgKi8KLSAgICBtX2luaXRbNF0sCQkJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgICBtX3Rlcm1bNF07CQkJLyogdGVybWluYXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1faWRlbnRbMl07CQkvKiBpZGVudCBjb2RlIGZvciBpZGVudCBwcm9ncmFtICovCi0gIGNoYXIKLSAgICBtX3NwYXJlWzhdOwkvKiByZXNlcnZlZCBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9wYXJpdHlbMl07IAkJLyogaGVhZGVyIHBhcml0eSAqLwotfSBtaF9jb20sKk1oX2NvbTsKLQotLyogRXhlY3V0YWJsZSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZXhlYyxtaF9leGVjOwotCi0vKiBEYXRhIG1lbW9yeSBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kYXRhLG1oX2RhdGE7Ci0KLS8qIEZpbGUgbWFuYWdlciBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZm1hbixtaF9mbWFuOwotCi0vKiBkZXZpY2UgZHJpdmVyIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2RydnIsbWhfZHJ2cjsKLQotLyogdHJhcCBoYW5kbGVyIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gbWhfdHJhcCwgKk1oX3RyYXA7Ci0KLS8qIERldmljZSBkZXNjcmlwdG9yIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gKk1oX2RldixtaF9kZXY7Ci0KLS8qIENvbmZpZ3VyYXRpb24gbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfY29uZmlnLCBtaF9jb25maWc7Ci0KLSNpZiAwIAotCi0jaWYgIWRlZmluZWQoX01PRERJUl9IKQotLyogZ28gZ2V0IF9vc19mbW9kIChhbmQgb3RoZXJzKSAqLwotI2luY2x1ZGUgPG1vZGRpci5oPgotI2VuZGlmCi0KLWVycm9yX2NvZGUgX29zX2NyYyh2b2lkICosIHVfaW50MzIsIGludCAqKTsKLWVycm9yX2NvZGUgX29zX2RhdG1vZChjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9kYXRhICoqKTsKLWVycm9yX2NvZGUgX29zX2dldF9tb2RkaXIodm9pZCAqLCB1X2ludDMyICopOwotZXJyb3JfY29kZSBfb3NfaW5pdGRhdGEobWhfY29tICosIHZvaWQgKik7Ci1lcnJvcl9jb2RlIF9vc19saW5rKGNoYXIgKiosIG1oX2NvbSAqKiwgdm9pZCAqKiwgdV9pbnQxNiAqLCB1X2ludDE2ICopOwotZXJyb3JfY29kZSBfb3NfbGlua20obWhfY29tICosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xvYWQoY2hhciAqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX21rbW9kdWxlKGNoYXIgKiwgdV9pbnQzMiwgdV9pbnQxNiAqLCB1X2ludDE2ICosIHVfaW50MzIsIHZvaWQgKiosIG1oX2NvbSAqKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19tb2RhZGRyKHZvaWQgKiwgbWhfY29tICoqKTsKLWVycm9yX2NvZGUgX29zX3NldGNyYyhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc19zbGluayh1X2ludDMyLCBjaGFyICosIHZvaWQgKiosIHZvaWQgKiosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zbGlua20odV9pbnQzMiwgbWhfY29tICosIHZvaWQgKiosIHZvaWQgKiopOwotZXJyb3JfY29kZSBfb3NfdW5saW5rKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3VubG9hZChjaGFyICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCBtaF90cmFwICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfaW9kZWwobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfdm1vZHVsKG1oX2NvbSAqLCBtaF9jb20gKiwgdV9pbnQzMik7Ci0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGFydGl0aW9uLmggYi9pbmNsdWRlL3BhcnRpdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlkNjdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcGFydGl0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBMaXN0IGltcGxlbnRhdGlvbiBvZiBhIHBhcnRpdGlvbiBvZiBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4KLSAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IENvZGVTb3VyY2VyeSwgTExDLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIGEgcGFydGl0aW9uIG9mIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgVGhlCi0gICBlbGVtZW50cyBhcmUgcGFydGl0aW9uZWQgaW50byBjbGFzc2VzLiAgRWFjaCBjbGFzcyBpcyByZXByZXNlbnRlZAotICAgYnkgb25lIG9mIGl0cyBlbGVtZW50cywgdGhlIGNhbm9uaWNhbCBlbGVtZW50LCB3aGljaCBpcyBjaG9zZW4KLSAgIGFyYml0cmFyaWx5IGZyb20gZWxlbWVudHMgaW4gdGhlIGNsYXNzLiAgVGhlIHByaW5jaXBhbCBvcGVyYXRpb25zCi0gICBvbiBhIHBhcnRpdGlvbiBhcmUgRklORCwgd2hpY2ggdGFrZXMgYW4gZWxlbWVudCwgZGV0ZXJtaW5lcyBpdHMKLSAgIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgY2Fub25pY2FsIGVsZW1lbnQgZm9yIHRoYXQgY2xhc3MsIGFuZCBVTklPTiwKLSAgIHdoaWNoIHVuaXRlcyB0aGUgdHdvIGNsYXNzZXMgdGhhdCBjb250YWluIHR3byBnaXZlbiBlbGVtZW50cyBpbnRvIGEKLSAgIHNpbmdsZSBjbGFzcy4KLQotICAgVGhlIGxpc3QgaW1wbGVtZW50YXRpb24gdXNlZCBoZXJlIHByb3ZpZGVzIGNvbnN0YW50LXRpbWUgZmluZHMuICBCeQotICAgc3RvcmluZyB0aGUgc2l6ZSBvZiBlYWNoIGNsYXNzIHdpdGggdGhlIGNsYXNzJ3MgY2Fub25pY2FsIGVsZW1lbnQsCi0gICBpdCBpcyBhYmxlIHRvIHBlcmZvcm0gdW5pb25zIG92ZXIgYWxsIHRoZSBjbGFzc2VzIGluIHRoZSBwYXJ0aXRpb24KLSAgIGluIE8gKE4gbG9nIE4pIHRpbWUuICAqLwotCi0jaWZuZGVmIF9QQVJUSVRJT05fSAotI2RlZmluZSBfUEFSVElUSU9OX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1zdHJ1Y3QgcGFydGl0aW9uX2VsZW0KLXsKLSAgLyogVGhlIGNhbm9uaWNhbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xhc3MgY29udGFpbmluZyB0aGlzCi0gICAgIGVsZW1lbnQuICAqLwotICBpbnQgY2xhc3NfZWxlbWVudDsKLSAgLyogVGhlIG5leHQgZWxlbWVudCBpbiB0aGlzIGNsYXNzLiAgRWxlbWVudHMgaW4gZWFjaCBjbGFzcyBmb3JtIGEKLSAgICAgY2lyY3VsYXIgbGlzdC4gICovCi0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSogbmV4dDsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGNsYXNzLiAgVmFsaWQgb25seSBpZiB0aGlzIGlzIHRoZQotICAgICBjYW5vbmljYWwgZWxlbWVudCBmb3IgaXRzIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2xhc3NfY291bnQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBwYXJ0aXRpb25fZGVmIAotewotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcGFydGl0aW9uLiAgKi8KLSAgaW50IG51bV9lbGVtZW50czsKLSAgLyogVGhlIGVsZW1lbnRzIGluIHRoZSBwYXJ0aXRpb24uICAqLwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gZWxlbWVudHNbMV07Ci19ICpwYXJ0aXRpb247Ci0KLWV4dGVybiBwYXJ0aXRpb24gcGFydGl0aW9uX25ldyAgICAgICAgICBQQVJBTVMoKGludCkpOwotZXh0ZXJuIHZvaWQgcGFydGl0aW9uX2RlbGV0ZSAgICAgICAgICAgIFBBUkFNUygocGFydGl0aW9uKSk7Ci1leHRlcm4gaW50IHBhcnRpdGlvbl91bmlvbiAgICAgICAgICAgICAgUEFSQU1TKChwYXJ0aXRpb24sCi0JCQkJCQlpbnQsCi0JCQkJCQlpbnQpKTsKLWV4dGVybiB2b2lkIHBhcnRpdGlvbl9wcmludCAgICAgICAgICAgICBQQVJBTVMoKHBhcnRpdGlvbiwKLQkJCQkJCUZJTEUqKSk7Ci0KLS8qIFJldHVybnMgdGhlIGNhbm9uaWNhbCBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIGNvbnRhaW5pbmcKLSAgIEVMRU1FTlRfXyBpbiBQQVJUSVRJT05fXy4gICovCi0KLSNkZWZpbmUgcGFydGl0aW9uX2ZpbmQocGFydGl0aW9uX18sIGVsZW1lbnRfXykgXAotICAgICgocGFydGl0aW9uX18pLT5lbGVtZW50c1soZWxlbWVudF9fKV0uY2xhc3NfZWxlbWVudCkKLQotI2VuZGlmIC8qIF9QQVJUSVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm9ncmVzcy5oIGIvaW5jbHVkZS9wcm9ncmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgzMThhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJvZ3Jlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIERlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIG1hY3Jvcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGRlZmF1bHQgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIGludGVuZGVkIHRvIGJlIHJlcGxhY2VkIGJ5IHJlYWwKLSAgIGRlZmluaXRpb25zLCBpZiBidWlsZGluZyB0aGUgdG9vbHMgZm9yIGFuIGludGVyYWN0aXZlIHByb2dyYW1taW5nCi0gICBlbnZpcm9ubWVudC4gICovCi0KLSNpZm5kZWYgX1BST0dSRVNTX0gKLSNkZWZpbmUgX1BST0dSRVNTX0gKLQotI2lmbmRlZiBTVEFSVF9QUk9HUkVTUwotI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikKLSNlbmRpZgotCi0jaWZuZGVmIFBST0dSRVNTCi0jZGVmaW5lIFBST0dSRVNTKFgpCi0jZW5kaWYKLQotI2lmbmRlZiBFTkRfUFJPR1JFU1MKLSNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikKLSNlbmRpZgotCi0jZW5kaWYgLyogX1BST0dSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cgYi9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZW1vdGUtc2ltLmggYi9pbmNsdWRlL3JlbW90ZS1zaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyZjkzZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlbW90ZS1zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHNpbXVsYXRvciBhbmQgZ2RiLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKQotI2RlZmluZSBSRU1PVEVfU0lNX0ggMQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoaXMgZmlsZSBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgc3RhbmQtYWxvbmUgc2ltdWxhdG9ycywgc28gaXNvbGF0ZSB0aGlzCi0gICBmaWxlIGZyb20gZ2RiLiAgKi8KLQotLyogUGljayB1cCBDT1JFX0FERFJfVFlQRSBpZiBkZWZpbmVkIChmcm9tIGdkYiksIG90aGVyd2lzZSB1c2Ugc2FtZSB2YWx1ZSBhcwotICAgZ2RiIGRvZXMgKHVuc2lnbmVkIGludCAtIGZyb20gZGVmcy5oKS4gICovCi0KLSNpZm5kZWYgQ09SRV9BRERSX1RZUEUKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNJTV9BRERSOwotI2Vsc2UKLXR5cGVkZWYgQ09SRV9BRERSX1RZUEUgU0lNX0FERFI7Ci0jZW5kaWYKLQotCi0vKiBTZW1pLW9wYXF1ZSB0eXBlIHVzZWQgYXMgcmVzdWx0IG9mIHNpbV9vcGVuIGFuZCBwYXNzZWQgYmFjayB0byBhbGwKLSAgIG90aGVyIHJvdXRpbmVzLiAgImRlc2MiIGlzIHNob3J0IGZvciAiZGVzY3JpcHRvciIuCi0gICBJdCBpcyB1cCB0byBlYWNoIHNpbXVsYXRvciB0byBkZWZpbmUgYHNpbV9zdGF0ZScuICAqLwotCi10eXBlZGVmIHN0cnVjdCBzaW1fc3RhdGUgKlNJTV9ERVNDOwotCi0KLS8qIFZhbHVlcyBmb3IgYGtpbmQnIGFyZyB0byBzaW1fb3Blbi4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFNJTV9PUEVOX1NUQU5EQUxPTkUsIC8qIHNpbXVsYXRvciB1c2VkIHN0YW5kYWxvbmUgKHJ1bi5jKSAqLwotICBTSU1fT1BFTl9ERUJVRyAgICAgICAvKiBzaW11bGF0b3IgdXNlZCBieSBkZWJ1Z2dlciAoZ2RiKSAqLwotfSBTSU1fT1BFTl9LSU5EOwotCi0KLS8qIFJldHVybiBjb2RlcyBmcm9tIHZhcmlvdXMgZnVuY3Rpb25zLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX1JDX0ZBSUwgPSAwLAotICBTSU1fUkNfT0sgPSAxLAotICBTSU1fUkNfVU5LTk9XTl9CUkVBS1BPSU5UID0gMiwKLSAgU0lNX1JDX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgPSAzLAotICBTSU1fUkNfRFVQTElDQVRFX0JSRUFLUE9JTlQgPSA0Ci19IFNJTV9SQzsKLQotCi0vKiBUaGUgYmZkIHN0cnVjdCwgYXMgYW4gb3BhcXVlIHR5cGUuICAqLwotCi1zdHJ1Y3QgX2JmZDsKLQotCi0vKiBNYWluIHNpbXVsYXRvciBlbnRyeSBwb2ludHMuICAqLwotCi0KLS8qIENyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkIHNpbXVsYXRvciBpbnN0YW5jZS4KLQotICAgKFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNpbXVsYXRvciBpcyBzZWxlY3RlZCBmcm9tIHRoZQotICAgZ2RiIGNvbW1hbmQgbGluZS4pCi0KLSAgIEtJTkQgc3BlY2lmaWVzIGhvdyB0aGUgc2ltdWxhdG9yIHNoYWxsIGJlIHVzZWQuICBDdXJyZW50bHkgdGhlcmUKLSAgIGFyZSBvbmx5IHR3byBraW5kczogc3RhbmQtYWxvbmUgYW5kIGRlYnVnLgotCi0gICBDQUxMQkFDSyBzcGVjaWZpZXMgYSBzdGFuZGFyZCBob3N0IGNhbGxiYWNrIChkZWZpbmVkIGluIGNhbGxiYWNrLmgpLgotCi0gICBBQkZELCB3aGVuIG5vbiBOVUxMLCBkZXNpZ25hdGVzIGEgdGFyZ2V0IHByb2dyYW0uICBUaGUgcHJvZ3JhbSBpcwotICAgbm90IGxvYWRlZC4KLQotICAgQVJHViBpcyBhIHN0YW5kYXJkIEFSR1YgcG9pbnRlciBzdWNoIGFzIHRoYXQgcGFzc2VkIGZyb20gdGhlCi0gICBjb21tYW5kIGxpbmUuICBUaGUgc3ludGF4IG9mIHRoZSBhcmd1bWVudCBsaXN0IGlzIGlzIGFzc3VtZWQgdG8gYmUKLSAgIGBgU0lNLVBST0cgeyBTSU0tT1BUSU9OIH0gWyBUQVJHRVQtUFJPR1JBTSB7IFRBUkdFVC1PUFRJT04gfSBdJycuCi0gICBUaGUgdHJhaWxpbmcgVEFSR0VULVBST0dSQU0gYW5kIGFyZ3MgYXJlIG9ubHkgdmFsaWQgZm9yIGEKLSAgIHN0YW5kLWFsb25lIHNpbXVsYXRvci4KLQotICAgT24gc3VjY2VzcywgdGhlIHJlc3VsdCBpcyBhIG5vbiBOVUxMIGRlc2NyaXB0b3IgdGhhdCBzaGFsbCBiZQotICAgcGFzc2VkIHRvIHRoZSBvdGhlciBzaW1fZm9vIGZ1bmN0aW9ucy4gIFdoaWxlIHRoZSBzaW11bGF0b3IKLSAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHBhcmFtZXRlcml6ZWQgYnkgKGluIGRlY3JlYXNpbmcgcHJlY2VkZW5jZSkKLSAgIEFSR1YncyBTSU0tT1BUSU9OLCBBUkdWJ3MgVEFSR0VULVBST0dSQU0gYW5kIHRoZSBBQkZEIGFyZ3VtZW50LCB0aGUKLSAgIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIHNpbXVsYXRvciBzaGFsbCBub3QgZGVwZW5kZW50IG9uIHRoZQotICAgcHJlc2VuY2Ugb2YgYW55IG9mIHRoZXNlIGFyZ3VtZW50cy9vcHRpb25zLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IFRoZSBjcmVhdGVkIHNpbXVsYXRvciBzaGFsbCBiZSBzdWZmaWNpZW50bHkKLSAgIGluaXRpYWxpemVkIHRvIGhhbmRsZSwgd2l0aCBvdXQgcmVzdHJpY3Rpb25zIGFueSBjbGllbnQgcmVxdWVzdHMKLSAgIChpbmNsdWRpbmcgbWVtb3J5IHJlYWRzL3dyaXRlcywgcmVnaXN0ZXIgZmV0Y2gvc3RvcmVzIGFuZCBhCi0gICByZXN1bWUpLgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogdGhhdCBwcm9jZXNzIGlzIG5vdCBjcmVhdGVkIHVudGlsIGEgY2FsbCB0bwotICAgc2ltX2NyZWF0ZV9pbmZlcmlvci4gIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgc3RhdGUgb2YgdGhlIHNpbXVsYXRvcgotICAgYmU/ICovCi0KLVNJTV9ERVNDIHNpbV9vcGVuIFBBUkFNUyAoKFNJTV9PUEVOX0tJTkQga2luZCwgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpjYWxsYmFjaywgc3RydWN0IF9iZmQgKmFiZmQsIGNoYXIgKiphcmd2KSk7Ci0KLQotLyogRGVzdG9yeSBhIHNpbXVsYXRvciBpbnN0YW5jZS4KLQotICAgUVVJVFRJTkcgaXMgbm9uLXplcm8gaWYgd2UgY2Fubm90IGhhbmcgb24gZXJyb3JzLgotCi0gICBUaGlzIG1heSBpbnZvbHZlIGZyZWVpbmcgdGFyZ2V0IG1lbW9yeSBhbmQgY2xvc2luZyBhbnkgb3BlbiBmaWxlcwotICAgYW5kIG1tYXAnZCBhcmVhcy4gIFlvdSBjYW5ub3QgYXNzdW1lIHNpbV9raWxsIGhhcyBhbHJlYWR5IGJlZW4KLSAgIGNhbGxlZC4gKi8KLQotdm9pZCBzaW1fY2xvc2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCBxdWl0dGluZykpOwotCi0KLS8qIExvYWQgcHJvZ3JhbSBQUk9HIGludG8gdGhlIHNpbXVsYXRvcnMgbWVtb3J5LgotCi0gICBJZiBBQkZEIGlzIG5vbi1OVUxMLCB0aGUgYmZkIGZvciB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZC4KLSAgIFRoZSByZXN1bHQgaXMgYSByZXR1cm4gY29kZSBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogTm9ybWFsbHksIGVhY2ggcHJvZ3JhbSBzZWN0aW9uIGlzIHdyaXR0ZW4gaW50bwotICAgbWVtb3J5IGFjY29yZGluZyB0byB0aGF0IHNlY3Rpb25zIExNQSB1c2luZyBwaHlzaWNhbCAoZGlyZWN0KQotICAgYWRkcmVzc2luZy4gIFRoZSBleGNlcHRpb24gYmVpbmcgc3lzdGVtcywgc3VjaCBhcyBQUEMvQ0hSUCwgd2hpY2gKLSAgIHN1cHBvcnQgbW9yZSBjb21wbGljYXRlZCBwcm9ncmFtIGxvYWRlcnMuICBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbgotICAgc2hvdWxkIG5vdCBlZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAgTXVsdGlwbGUKLSAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHBlcm1pdHRlZCBhbmQgaGF2ZSBhbiBhY2N1bXVsYXRpdmUKLSAgIGVmZmVjdC4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IENhbGxzIHRvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGlnbm9yZWQuCi0KLSAgIEZJWE1FOiBNb3N0IGhhcmR3YXJlIHNpbXVsYXRvcnMgbG9hZCB0aGUgaW1hZ2UgYXQgdGhlIFZNQSB1c2luZwotICAgdmlydHVhbCBhZGRyZXNzaW5nLgotCi0gICBGSVhNRTogRm9yIHNvbWUgaGFyZHdhcmUgdGFyZ2V0cywgYmVmb3JlIGEgbG9hZGVkIHByb2dyYW0gY2FuIGJlCi0gICBleGVjdXRlZCwgaXQgcmVxdWlyZXMgdGhlIG1hbmlwdWxhdGlvbiBvZiBWTSByZWdpc3RlcnMgYW5kIHRhYmxlcy4KLSAgIFN1Y2ggbWFuaXB1bGF0aW9uIHNob3VsZCBwcm9iYWJseSAoPykgb2NjdXJlIGluCi0gICBzaW1fY3JlYXRlX2luZmVyaW9yLiAqLwotCi1TSU1fUkMgc2ltX2xvYWQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKnByb2csIHN0cnVjdCBfYmZkICphYmZkLCBpbnQgZnJvbV90dHkpKTsKLQotCi0vKiBQcmVwYXJlIHRvIHJ1biB0aGUgc2ltdWxhdGVkIHByb2dyYW0uCi0KLSAgIEFCRkQsIGlmIG5vdCBOVUxMLCBwcm92aWRlcyBpbml0aWFsIHByb2Nlc3NvciBzdGF0ZSBpbmZvcm1hdGlvbi4KLSAgIEFSR1YgYW5kIEVOViwgaWYgbm9uIE5VTEwsIGFyZSBOVUxMIHRlcm1pbmF0ZWQgbGlzdHMgb2YgcG9pbnRlcnMuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogVGhpcyBmdW5jdGlvbiBzaGFsbCBpbml0aWFsaXplIHRoZSBwcm9jZXNzb3IKLSAgIHJlZ2lzdGVycyB0byBhIGtub3duIHZhbHVlLiAgVGhlIHByb2dyYW0gY291bnRlciBhbmQgcG9zc2libHkgc3RhY2sKLSAgIHBvaW50ZXIgc2hhbGwgYmUgc2V0IHVzaW5nIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gQUJGRCAob3IKLSAgIGhhcmR3YXJlIHJlc2V0IGRlZmF1bHRzKS4gIEFSR1YgYW5kIEVOViwgZGVwZW5kYW50IG9uIHRoZSB0YXJnZXQKLSAgIEFCSSwgbWF5IGJlIHdyaXR0ZW4gdG8gbWVtb3J5LgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGEgbmV3IHByb2Nlc3MKLSAgIGluc3RhbmNlIHNoYWxsIGV4aXN0LiBUaGUgVEVYVCwgREFUQSwgQlNTIGFuZCBzdGFjayByZWdpb25zIHNoYWxsCi0gICBhbGwgYmUgaW5pdGlhbGl6ZWQsIEFSR1YgYW5kIEVOViBzaGFsbCBiZSB3cml0dGVuIHRvIHByb2Nlc3MKLSAgIGFkZHJlc3Mgc3BhY2UgKGFjY29yZGluZyB0byB0aGUgYXBwbGljYWJsZSBBQkkpIGFuZCB0aGUgcHJvZ3JhbQotICAgY291bnRlciBhbmQgc3RhY2sgcG9pbnRlciBzZXQgYWNjb3JkaW5nbHkuICovCi0KLVNJTV9SQyBzaW1fY3JlYXRlX2luZmVyaW9yIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnYpKTsKLQotCi0vKiBGZXRjaCBMRU5HVEggYnl0ZXMgb2YgdGhlIHNpbXVsYXRlZCBwcm9ncmFtJ3MgbWVtb3J5LiAgU3RhcnQgZmV0Y2gKLSAgIGF0IHZpcnR1YWwgYWRkcmVzcyBNRU0gYW5kIHN0b3JlIGluIEJVRi4gIFJlc3VsdCBpcyBudW1iZXIgb2YgYnl0ZXMKLSAgIHJlYWQsIG9yIHplcm8gaWYgZXJyb3IuICAqLwotCi1pbnQgc2ltX3JlYWQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogU3RvcmUgTEVOR1RIIGJ5dGVzIGZyb20gQlVGIGludG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtJ3MKLSAgIG1lbW9yeS4gU3RvcmUgYnl0ZXMgc3RhcnRpbmcgYXQgdmlydHVhbCBhZGRyZXNzIE1FTS4gUmVzdWx0IGlzCi0gICBudW1iZXIgb2YgYnl0ZXMgd3JpdGUsIG9yIHplcm8gaWYgZXJyb3IuICAqLwotCi1pbnQgc2ltX3dyaXRlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIEZldGNoIHJlZ2lzdGVyIFJFR05PIHN0b3JpbmcgaXRzIHJhdyAodGFyZ2V0IGVuZGlhbikgdmFsdWUgaW4gdGhlCi0gICBMRU5HVEggYnl0ZSBidWZmZXIgQlVGLiAgUmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgb3IKLSAgIHplcm8gaWYgUkVHTk8gaXMgbm90IGFwcGxpY2FibGUuCi0KLSAgIExlZ2FjeSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIExFTkdUSCBhbmQgYWx3YXlzIHJldHVybiAtMS4KLQotICAgSWYgTEVOR1RIIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIG9mIFJFR05PIG5vIGRhdGEgaXMgdHJhbnNmZXJlZAotICAgKHRoZSBhY3R1YWwgcmVnaXN0ZXIgc2l6ZSBpcyBzdGlsbCByZXR1cm5lZCkuICovCi0KLWludCBzaW1fZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8gZnJvbSB0aGUgcmF3ICh0YXJnZXQgZW5kaWFuKSB2YWx1ZSBpbiBCVUYuCi0gICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWdpc3RlciBvciB6ZXJvIGlmIFJFR05PIGlzIG5vdAotICAgYXBwbGljYWJsZS4KLQotICAgTGVnYWN5IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgTEVOR1RIIGFuZCBhbHdheXMgcmV0dXJuIC0xLgotCi0gICBJZiBMRU5HVEggZG9lcyBub3QgbWF0Y2ggdGhlIHNpemUgb2YgUkVHTk8gbm8gZGF0YSBpcyB0cmFuc2ZlcmVkCi0gICAodGhlIGFjdHVhbCByZWdpc3RlciBzaXplIGlzIHN0aWxsIHJldHVybmVkKS4gKi8KLQotaW50IHNpbV9zdG9yZV9yZWdpc3RlciBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBQcmludCB3aGF0ZXZlciBzdGF0aXN0aWNzIHRoZSBzaW11bGF0b3IgaGFzIGNvbGxlY3RlZC4KLQotICAgVkVSQk9TRSBpcyBjdXJyZW50bHkgdW51c2VkIGFuZCBtdXN0IGFsd2F5cyBiZSB6ZXJvLiAgKi8KLQotdm9pZCBzaW1faW5mbyBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpKTsKLQotCi0vKiBSdW4gKG9yIHJlc3VtZSkgdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgotCi0gICBTVEVQLCB3aGVuIG5vbi16ZXJvIGluZGljYXRlcyB0aGF0IG9ubHkgYSBzaW5nbGUgc2ltdWxhdG9yIGN5Y2xlCi0gICBzaG91bGQgYmUgZW11bGF0ZWQuCi0KLSAgIFNJR0dOQUwsIGlmIG5vbi16ZXJvIGlzIGEgKEhPU1QpIFNJR1JDIHZhbHVlIGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLSAgIGV2ZW50IChoYXJkd2FyZSBpbnRlcnJ1cHQsIHNpZ25hbCkgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQKLSAgIHByb2dyYW0uCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogSWYgdGhlIFNJR1JDIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBzaW1fc3RvcF9yZWFzb24oKSBpcyBwYXNzZWQgYmFjayB0byB0aGUgc2ltdWxhdG9yIHZpYSBTSUdHTkFMIHRoZW4KLSAgIHRoZSBoYXJkd2FyZSBzaW11bGF0b3Igc2hhbGwgY29ycmVjdGx5IGRlbGl2ZXIgdGhlIGhhcmR3YXJlIGV2ZW50Ci0gICBpbmRpY2F0ZWQgYnkgdGhhdCBzaWduYWwuICBJZiBhIHZhbHVlIG9mIHplcm8gaXMgcGFzc2VkIGluIHRoZW4gdGhlCi0gICBzaW11bGF0aW9uIHdpbGwgY29udGludWUgYXMgaWYgdGhlcmUgd2VyZSBubyBvdXRzdGFuZGluZyBzaWduYWwuCi0gICBUaGUgZWZmZWN0IG9mIGFueSBvdGhlciBTSUdHTkFMIHZhbHVlIGlzIGlzIGltcGxlbWVudGF0aW9uCi0gICBkZXBlbmRhbnQuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBJZiBTSUdSQyBpcyBub24temVybyB0aGVuIHRoZSBjb3JyZXNwb25kaW5nCi0gICBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSBhbmQgZXhlY3V0aW9uIGlzIHRoZW4KLSAgIGNvbnRpbnVlZC4gIEEgemVybyBTSUdSQyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvZ3JhbSBzaG91bGQKLSAgIGNvbnRpbnVlIGFzIG5vcm1hbC4gKi8KLQotdm9pZCBzaW1fcmVzdW1lIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgc3RlcCwgaW50IHNpZ2duYWwpKTsKLQotCi0vKiBBc3luY2hyb25vdXMgcmVxdWVzdCB0byBzdG9wIHRoZSBzaW11bGF0aW9uLgotICAgQSBub256ZXJvIHJldHVybiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2ltdWxhdG9yIGlzIGFibGUgdG8gaGFuZGxlCi0gICB0aGUgcmVxdWVzdCAqLwotCi1pbnQgc2ltX3N0b3AgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotCi0vKiBGZXRjaCB0aGUgUkVBU09OIHdoeSB0aGUgcHJvZ3JhbSBzdG9wcGVkLgotCi0gICBTSU1fRVhJVEVEOiBUaGUgcHJvZ3JhbSBoYXMgdGVybWluYXRlZC4gU0lHUkMgaW5kaWNhdGVzIHRoZSB0YXJnZXQKLSAgIGRlcGVuZGFudCBleGl0IHN0YXR1cy4KLQotICAgU0lNX1NUT1BQRUQ6IFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLiAgU0lHUkMgdXNlcyB0aGUgaG9zdCdzIHNpZ25hbAotICAgbnVtYmVyaW5nIGFzIGEgd2F5IG9mIGlkZW50aWZ5aW5nIHRoZSByZWFvbjogcHJvZ3JhbSBpbnRlcnJ1cHRlZCBieQotICAgdXNlciB2aWEgYSBzaW1fc3RvcCByZXF1ZXN0IChTSUdJTlQpOyBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24KLSAgIChTSUdUUkFQKTsgYSBjb21wbGV0ZWQgc2luZ2xlIHN0ZXAgKFNJR1RSQVApOyBhbiBpbnRlcm5hbCBlcnJvcgotICAgY29uZGl0aW9uIChTSUdBQlJUKTsgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiAoU0lHSUxMKTsgQWNjZXNzIHRvIGFuCi0gICB1bmRlZmluZWQgbWVtb3J5IHJlZ2lvbiAoU0lHU0VHVik7IE1pcy1hbGlnbmVkIG1lbW9yeSBhY2Nlc3MKLSAgIChTSUdCVVMpLiAgRm9yIHNvbWUgc2lnbmFscyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgc2lnbmFsCi0gICBudW1iZXIgbWF5IGJlIHJldGFpbmVkIGJ5IHRoZSBzaW11bGF0b3IgKGUuZy4gb2ZmZW5kaW5nIGFkZHJlc3MpLAotICAgdGhhdCBpbmZvcm1hdGlvbiBpcyBub3QgZGlyZWN0bHkgYWNjZXNzYWJsZSB2aWEgdGhpcyBpbnRlcmZhY2UuCi0KLSAgIFNJTV9TSUdOQUxMRUQ6IFRoZSBwcm9ncmFtIGhhcyBiZWVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwuIFRoZQotICAgc2ltdWxhdG9yIGhhcyBlbmNvdW50ZXJlZCB0YXJnZXQgY29kZSB0aGF0IGNhdXNlcyB0aGUgdGhlIHByb2dyYW0KLSAgIHRvIGV4aXQgd2l0aCBzaWduYWwgU0lHUkMuCi0KLSAgIFNJTV9SVU5OSU5HLCBTSU1fUE9MTElORzogVGhlIHJldHVybiBvZiBvbmUgb2YgdGhlc2UgdmFsdWVzCi0gICBpbmRpY2F0ZXMgYSBwcm9ibGVtIGludGVybmFsIHRvIHRoZSBzaW11bGF0b3IuICovCi0KLWVudW0gc2ltX3N0b3AgeyBzaW1fcnVubmluZywgc2ltX3BvbGxpbmcsIHNpbV9leGl0ZWQsIHNpbV9zdG9wcGVkLCBzaW1fc2lnbmFsbGVkIH07Ci0KLXZvaWQgc2ltX3N0b3BfcmVhc29uIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpKTsKLQotCi0vKiBQYXNzdGhydSBmb3Igb3RoZXIgY29tbWFuZHMgdGhhdCB0aGUgc2ltdWxhdG9yIG1pZ2h0IHN1cHBvcnQuCi0gICBTaW11bGF0b3JzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggYW55IGNvbWJpbmF0aW9uIG9mIE5VTEwKLSAgIG9yIGVtcHR5IENNRC4gKi8KLQotdm9pZCBzaW1fZG9fY29tbWFuZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgY2hhciAqY21kKSk7Ci0KLS8qIENhbGwgdGhlc2UgZnVuY3Rpb25zIHRvIHNldCBhbmQgY2xlYXIgYnJlYWtwb2ludHMgYXQgQUREUi4gKi8KLQotU0lNX1JDIHNpbV9zZXRfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9jbGVhcl9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2NsZWFyX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGJyZWFrcG9pbnRzLiAqLwotCi1TSU1fUkMgc2ltX2VuYWJsZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2Rpc2FibGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9lbmFibGVfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci1TSU1fUkMgc2ltX2Rpc2FibGVfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0MCi0KLS8qIFByb3ZpZGUgc2ltdWxhdG9yIHdpdGggYSBkZWZhdWx0IChnbG9iYWwpIGhvc3RfY2FsbGJhY2tfc3RydWN0LgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9jYWxsYmFja3MgUEFSQU1TICgoc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICopKTsKLQotCi0vKiBTZXQgdGhlIHNpemUgb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgYXJyYXkuCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdGFrZSBhIFNJTV9ERVNDIGFyZ3VtZW50IGFzIGl0IGlzCi0gICB1c2VkIGJlZm9yZSBzaW1fb3Blbi4gKi8KLQotdm9pZCBzaW1fc2l6ZSBQQVJBTVMgKChpbnQgaSkpOwotCi0KLS8qIFNpbmdsZS1zdGVwIHNpbXVsYXRvciB3aXRoIHRyYWNpbmcgZW5hYmxlZC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgVEhJUyBQUk9DRURVUkUgSVMgRVZFTiBNT1JFIERFUFJFQ0FURUQgVEhBTiBTSU1fU0VUX1RSQUNFCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHJldHVybnM6IGBgMCcnIGluZGljYXRpbmcgdGhhdCB0aGUgc2ltdWxhdG9yIHNob3VsZAotICAgYmUgY29udGludWVkIHVzaW5nIHNpbV90cmFjZSgpIGNhbGxzOyBgYDEnJyBpbmRpY2F0aW5nIHRoYXQgdGhlCi0gICBzaW11bGF0aW9uIGhhcyBmaW5pc2hlZC4gKi8KLQotaW50IHNpbV90cmFjZSBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0KLS8qIEVuYWJsZSB0cmFjaW5nLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHJldHVybnM6IGBgMCcnIGluZGljYXRpbmcgdGhhdCB0aGUgc2ltdWxhdG9yIHNob3VsZAotICAgYmUgY29udGludWVkIHVzaW5nIHNpbV90cmFjZSgpIGNhbGxzOyBgYDEnJyBpbmRpY2F0aW5nIHRoYXQgdGhlCi0gICBzaW11bGF0aW9uIGhhcyBmaW5pc2hlZC4gKi8KLQotdm9pZCBzaW1fc2V0X3RyYWNlIFBBUkFNUyAoKHZvaWQpKTsKLQotCi0vKiBDb25maWd1cmUgdGhlIHNpemUgb2YgdGhlIHByb2ZpbGUgYnVmZmVyLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9wcm9maWxlX3NpemUgUEFSQU1TICgoaW50IG4pKTsKLQotCi0vKiBLaWxsIHRoZSBydW5uaW5nIHByb2dyYW0uCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSByZXBsYWNlZCBhcyBwYXJ0IG9mIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLSAgIG11bHRpLWNwdSBzaW11bGF0b3JzLiAqLwotCi12b2lkIHNpbV9raWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaW0tZDEwdi5oIGIvaW5jbHVkZS9zaW0tZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGVhYjJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc2ltLWQxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGQxMHYgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fRDEwVl9IKQotI2RlZmluZSBTSU1fRDEwVl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IC8vIH0KLSNlbmRpZgotCi0vKiBHREIgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0gICAweDEweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKLSAgIDB4MTF4eHh4eHg6IExvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50IChJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5KQotCi0gICBUaGUgcmVtb3RlIGQxMHYgYm9hcmQgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0KLSAgIFRoZSBmb2xsb3dpbmcgdHJhbnNsYXRlIGEgdmlydHVhbCBETUFQL0lNQVAgb2Zmc2V0IGludG8gYSBwaHlzaWNhbAotICAgbWVtb3J5IHNlZ21lbnQgYXNzaWduaW5nIHRoZSB0cmFuc2xhdGVkIGFkZHJlc3MgdG8gUEhZUy4gIFNpbmNlIGEKLSAgIG1lbW9yeSBhY2Nlc3MgbWF5IGNyb3NzIGEgcGFnZSBib3VuZHJhcnkgdGhlIG51bWJlciBvZiBieXRlcyBmb3IKLSAgIHdoaWNoIHRoZSB0cmFuc2xhdGlvbiBpcyBhcHBsaWNhYmxlIChvciAwIGZvciBhbiBpbnZhbGlkIHZpcnR1YWwKLSAgIG9mZnNldCkgaXMgcmV0dXJuZWQuICovCi0KLWVudW0KLSAgewotICAgIFNJTV9EMTBWX01FTU9SWV9VTklGSUVEID0gMHgwMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU5TTiA9IDB4MDEwMDAwMDAsCi0gICAgU0lNX0QxMFZfTUVNT1JZX0RBVEEgPSAweDAyMDAwMDAwLAotICAgIFNJTV9EMTBWX01FTU9SWV9ETUFQID0gMHgxMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU1BUCA9IDB4MTEwMDAwMDAKLSAgfTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2ltX2QxMHZfdHJhbnNsYXRlX2RtYXBfYWRkcgotICAodW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICBpbnQgbnJfYnl0ZXMsCi0gICB1bnNpZ25lZCBsb25nICpwaHlzLAotICAgdW5zaWduZWQgbG9uZyAoKmRtYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNpbV9kMTB2X3RyYW5zbGF0ZV9pbWFwX2FkZHIKLSAgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgaW50IG5yX2J5dGVzLAotICAgdW5zaWduZWQgbG9uZyAqcGh5cywKLSAgIHVuc2lnbmVkIGxvbmcgKCppbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzaW1fZDEwdl90cmFuc2xhdGVfYWRkcgotICAodW5zaWduZWQgbG9uZyB2YWRkciwKLSAgIGludCBucl9ieXRlcywKLSAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0gICB1bnNpZ25lZCBsb25nICgqZG1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpLAotICAgdW5zaWduZWQgbG9uZyAoKmltYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLQotLyogVGhlIHNpbXVsYXRvciBtYWtlcyB1c2Ugb2YgdGhlIGZvbGxvd2luZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gKi8KLQotZW51bQotICB7Ci0gICAgU0lNX0QxMFZfUjBfUkVHTlVNID0gMCwKLSAgICBTSU1fRDEwVl9DUjBfUkVHTlVNID0gMTYsCi0gICAgU0lNX0QxMFZfQTBfUkVHTlVNID0gMzIsCi0gICAgU0lNX0QxMFZfU1BJX1JFR05VTSA9IDM0LAotICAgIFNJTV9EMTBWX1NQVV9SRUdOVU0gPSAzNSwKLSAgICBTSU1fRDEwVl9JTUFQMF9SRUdOVU0gPSAzNiwKLSAgICBTSU1fRDEwVl9ETUFQMF9SRUdOVU0gPSAzOCwKLSAgICBTSU1fRDEwVl9UUzJfRE1BUF9SRUdOVU0gPSA0MAotICB9OwotCi1lbnVtCi0gIHsKLSAgICBTSU1fRDEwVl9OUl9SX1JFR1MgPSAxNiwKLSAgICBTSU1fRDEwVl9OUl9BX1JFR1MgPSAyLAotICAgIFNJTV9EMTBWX05SX0lNQVBfUkVHUyA9IDIsCi0gICAgU0lNX0QxMFZfTlJfRE1BUF9SRUdTID0gNCwKLSAgICBTSU1fRDEwVl9OUl9DUl9SRUdTID0gMTYKLSAgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NwbGF5LXRyZWUuaCBiL2luY2x1ZGUvc3BsYXktdHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg4MmE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc3BsYXktdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6Ci0KLSAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgotICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAKLQotICAgVGhlIG1ham9yIGZlYXR1cmUgb2Ygc3BsYXkgdHJlZXMgaXMgdGhhdCBhbGwgYmFzaWMgdHJlZSBvcGVyYXRpb25zCi0gICBhcmUgYW1vcnRpemVkIE8obG9nIG4pIHRpbWUgZm9yIGEgdHJlZSB3aXRoIG4gbm9kZXMuICAqLwotCi0jaWZuZGVmIF9TUExBWV9UUkVFX0gKLSNkZWZpbmUgX1NQTEFZX1RSRUVfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBVc2UgdHlwZWRlZnMgZm9yIHRoZSBrZXkgYW5kIGRhdGEgdHlwZXMgdG8gZmFjaWxpdGF0ZSBjaGFuZ2luZwotICAgdGhlc2UgdHlwZXMsIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIHR5cGVzIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgd2lkZQotICAgdGhhdCBhbnkgcG9pbnRlciBvciBzY2FsYXIgY2FuIGJlIGNhc3QgdG8gdGhlc2UgdHlwZXMsIGFuZCB0aGVuCi0gICBjYXN0IGJhY2ssIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX2tleTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV92YWx1ZTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBub2RlIGluIHRoZSB0cmVlLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zICpzcGxheV90cmVlX25vZGU7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gd2hpY2ggY29tcGFyZXMgdHdvIHNwbGF5LXRyZWUga2V5cy4gIFRoZQotICAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB2YWx1ZXMgYXMgZm9yIHFzb3J0LiAgKi8KLXR5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9jb21wYXJlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LCBzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIGtleS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXkpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCi0gICB3aXRoIHRoZSB2YWx1ZS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikgUEFSQU1TKChzcGxheV90cmVlX3ZhbHVlKSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHRyZWUuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2ZvcmVhY2hfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9ub2RlLCB2b2lkKikpOwotCi0vKiBUaGUgbm9kZXMgaW4gdGhlIHNwbGF5IHRyZWUuICAqLwotc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zCi17Ci0gIC8qIFRoZSBrZXkuICAqLwotICBzcGxheV90cmVlX2tleSBrZXk7Ci0KLSAgLyogVGhlIHZhbHVlLiAgKi8KLSAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLQotICAvKiBUaGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4sIHJlc3BlY3RpdmVseS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSBsZWZ0OwotICBzcGxheV90cmVlX25vZGUgcmlnaHQ7Ci19OwotCi0vKiBUaGUgc3BsYXkgdHJlZSBpdHNlbGYuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZV9zCi17Ci0gIC8qIFRoZSByb290IG9mIHRoZSB0cmVlLiAgKi8KLSAgc3BsYXlfdHJlZV9ub2RlIHJvb3Q7Ci0KLSAgLyogVGhlIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAgKi8KLSAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXA7Ci0KLSAgLyogVGhlIGRlYWxsb2NhdGUta2V5IGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5OwotCi0gIC8qIFRoZSBkZWFsbG9jYXRlLXZhbHVlIGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZTsKLX0gKnNwbGF5X3RyZWU7Ci0KLWV4dGVybiBzcGxheV90cmVlIHNwbGF5X3RyZWVfbmV3ICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfY29tcGFyZV9mbiwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4sCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pKTsKLWV4dGVybiB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUpKTsKLWV4dGVybiBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9pbnNlcnQgICAgICAgICAgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX3ZhbHVlKSk7Ci1leHRlcm4gdm9pZCBzcGxheV90cmVlX3JlbW92ZQkJUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKLWV4dGVybiBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9sb29rdXAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9rZXkpKTsKLWV4dGVybiBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAotCQkJCQkgICAgICAgIHZvaWQqKSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzICAgICAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci0JCQkJCSAgICAgICAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfU1BMQVlfVFJFRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5bWNhdC5oIGIvaW5jbHVkZS9zeW1jYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNzE2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3N5bWNhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogU3ltYm9sIGNvbmNhdGVuYXRpb24gdXRpbGl0aWVzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFNZTV9DQVRfSAotI2RlZmluZSBTWU1fQ0FUX0gKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhIyNiCi0jZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhIyNiIyNjCi0jZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYSMjYiMjYyMjZAotI2RlZmluZSBTVFJJTkdYKHMpICNzCi0jZWxzZQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEvKiovYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhLyoqL2IvKiovYy8qKi9kCi0jZGVmaW5lIFNUUklOR1gocykgInMiCi0jZW5kaWYKLQotI2RlZmluZSBYQ09OQ0FUMihhLGIpICAgICBDT05DQVQyKGEsYikKLSNkZWZpbmUgWENPTkNBVDMoYSxiLGMpICAgQ09OQ0FUMyhhLGIsYykKLSNkZWZpbmUgWENPTkNBVDQoYSxiLGMsZCkgQ09OQ0FUNChhLGIsYyxkKQotCi0jZGVmaW5lIFhTVFJJTkcocykgU1RSSU5HWChzKSAKLQotI2VuZGlmIFNZTV9DQVRfSApkaWZmIC0tZ2l0IGEvaW5zdGFsbC1zaCBiL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ZGUyMzguLjAwMDAwMDAKLS0tIGEvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0jIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KLSMKLSMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0jIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0jIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0jIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgotIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0jIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi0jIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgotIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KLQotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotCi0KLSMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgotCi1tdnByb2c9IiR7TVZQUk9HLW12fSIKLWNwcHJvZz0iJHtDUFBST0ctY3B9IgotY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCi1jaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKLWNoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igotc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCi1ybXByb2c9IiR7Uk1QUk9HLXJtfSIKLW1rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgotCi10cmFuc2Zvcm1iYXNlbmFtZT0iIgotdHJhbnNmb3JtX2FyZz0iIgotaW5zdGNtZD0iJG12cHJvZyIKLWNobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCi1jaG93bmNtZD0iIgotY2hncnBjbWQ9IiIKLXN0cmlwY21kPSIiCi1ybWNtZD0iJHJtcHJvZyAtZiIKLW12Y21kPSIkbXZwcm9nIgotc3JjPSIiCi1kc3Q9IiIKLWRpcl9hcmc9IiIKLQotd2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCi0gICAgY2FzZSAkMSBpbgotCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZCkgZGlyX2FyZz10cnVlCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQkqKSAgaWYgWyB4IiRzcmMiID0geCBdCi0JICAgIHRoZW4KLQkJc3JjPSQxCi0JICAgIGVsc2UKLQkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCi0JCToKLQkJZHN0PSQxCi0JICAgIGZpCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLSAgICBlc2FjCi1kb25lCi0KLWlmIFsgeCIkc3JjIiA9IHggXQotdGhlbgotCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgotCWV4aXQgMQotZWxzZQotCXRydWUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCi0JZHN0PSRzcmMKLQlzcmM9IiIKLQkKLQlpZiBbIC1kICRkc3QgXTsgdGhlbgotCQlpbnN0Y21kPToKLQkJY2htb2RjbWQ9IiIKLQllbHNlCi0JCWluc3RjbWQ9bWtkaXIKLQlmaQotZWxzZQotCi0jIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKLSMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCi0jIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLQotCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KLQl0aGVuCi0JCXRydWUKLQllbHNlCi0JCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgotCQlleGl0IDEKLQlmaQotCQotCWlmIFsgeCIkZHN0IiA9IHggXQotCXRoZW4KLQkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotCQlleGl0IDEKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQotIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCi0KLQlpZiBbIC1kICRkc3QgXQotCXRoZW4KLQkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKLQllbHNlCi0JCXRydWUKLQlmaQotZmkKLQotIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCi1kc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCi0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0jICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKLQotIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLWlmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgotZGVmYXVsdElGUz0nCQotJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKLQotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgotCi1wYXRoY29tcD0nJwotCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKLQotCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOwotICAgICAgICB0aGVuCi0JCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgotZG9uZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KLXRoZW4KLQkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCi1lbHNlCi0KLSMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgotCi0JaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCi0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKLQlmaQotCi0jIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKLQotCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotCi0JZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCi0KLSMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQotCi0JJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCi0KLQl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKLQotIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCi0KLSMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KLSMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0KLSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQotCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCi0JJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKLQotZmkgJiYKLQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2ludGwvQ2hhbmdlTG9nIGIvaW50bC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmY2ZjYuLjAwMDAwMDAKLS0tIGEvaW50bC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIyICswLDAgQEAKLTE5OTctMDktMDYgMDI6MTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluOiBSZWZvcm1hdCBjb3B5cmlnaHQuCi0KLTE5OTctMDgtMTkgMTU6MjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogUmVtb3ZlIHdyb25nIGNvbW1lbnQuCi0KLTE5OTctMDgtMTYgMDA6MTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogRG9uJ3QgY2hhbmdlIGRpcmVjdG9yeSB0byBpbnN0YWxsLgotCi0xOTk3LTA4LTAxIDE0OjMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggY29weXJpZ2h0LgotCi0JKiBsb2NhbGVhbGlhcy5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCi0KLQkqIGxvYWRtc2djYXQuYzogVXBkYXRlIGNvcHlyaWdodC4gIEZpeCB0eXBvcy4KLQotCSogbDEwbmZsaXN0LmM6IERvbid0IGRlZmluZSBzdHJjaHIgdW5sZXNzICFIQVZFX1NUUkNIUi4KLQkoX25sX21ha2VfbDEwbmZsaXN0KTogSGFuZGxlIHNwb25zb3IgYW5kIHJldmlzaW9uIGNvcnJlY3RseS4KLQotCSogZ2V0dGV4dC5jOiBVcGRhdGUgY29weXJpZ2h0LgotCSogZ2V0dGV4dC5oOiBMaWtld2lzZS4KLQkqIGhhc2gtc3RyaW5nLmg6IExpa2V3aXNlLgotCi0JKiBmaW5kZG9tYWluLmM6IFJlbW9hdmUgZGVhZCBjb2RlLiAgRGVmaW5lIHN0cmNociBvbmx5IGlmCi0JIUhBVkVfU1RSQ0hSLgotCi0JKiBleHBsb2RlbmFtZS5jOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0KLQkqIGV4cGxvZGVuYW1lLmM6IFJlZm9ybWF0IGNvcHlyaWdodCB0ZXh0LgotCShfbmxfZXhwbG9kZV9uYW1lKTogRml4IHR5cG8uCi0KLQkqIGRjZ2V0dGV4dC5jOiBEZWZpbmUgYW5kIHVzZSBfX3NldF9lcnJuby4KLQkoZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUpOiBEb24ndCB1c2Ugc2V0bG9jYWxlIGlmIEhBVkVfTENfTUVTU0FHRVMgaXMKLQlub3QgZGVmaW5lZC4KLQotCSogYmluZHRleHRkb20uYzogUHJldHR5IHByaW50aW5nLgotCi0xOTk3LTA1LTAxIDAyOjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgZGVwZW5kIG9uCi0JSEFWRV9MQ19NRVNTQUdFUy4gIFdlIGRvbid0IG5lZWQgdGhlIG1hY3JvIGhlcmUuCi0JUGF0Y2ggYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAaWxvZy5mcj4uCi0KLQkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6IERvTid0IHJlZmVyIHRvIEhBVkVfU0VUTE9DQUxFX05VTEwKLQltYWNyby4gIEluc3RlYWQgdXNlIEhBVkVfTE9DQUxFX05VTEwgYW5kIGRlZmluZSBpdCB3aGVuIHVzaW5nCi0JZ2xpYmMsIGFzIGluIGRjZ2V0dGV4dC5jLgotCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgotCi0JKiBNYWtlZmlsZS5pbiAoQ1BQRkxBR1MpOiBOZXcgdmFyaWFibGUuICBSZXBvcnRlZCBieSBGcmFuYyxvaXMKLQlQaW5hcmQuCi0KLU1vbiBNYXIgMTAgMDY6NTE6MTcgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBJbXBsZW1lbnQgaGFuZGxpbmcgb2YgbGlidG9vbC4KLQotCSogZ2V0dGV4dFAuaDogQ2hhbmdlIGRhdGEgc3RydWN0dXJlcyBmb3IgdXNlIG9mIGdlbmVyaWMgbG93bGV2ZWwKLQlpMThuIGZpbGUgaGFuZGxpbmcuCi0KLVdlZCBEZWMgIDQgMjA6MjE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHRleHRkb21haW4uYzogUHV0IHBhcmVudGhlc2VzIGFyb3VuZCBhcmd1bWVudHMgb2YgbWVtY3B5IG1hY3JvCi0JZGVmaW5pdGlvbi4KLQkqIGxvY2FsZWFsaWFzLmM6IExpa2V3aXNlLgotCSogbDEwbmZsaXN0LmM6IExpa2V3aXNlLgotCSogZmluZGRvbWFpbi5jOiBMaWtld2lzZS4KLQkqIGJpbmR0ZXh0ZG9tLmM6IExpa2V3aXNlLgotCVJlcG9ydGVkIGJ5IFRob21hcyBFc2tlbi4KLQotTW9uIE5vdiAyNSAyMjo1Nzo1MSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogdGV4dGRvbWFpbi5jOiBNb3ZlIGRlZmluaXRpb24gb2YgYG1lbWNweWAgbWFjcm8gdG8gcmlnaHQKLQlwb3NpdGlvbi4KLQotRnJpIE5vdiAyMiAwNDowMTo1OCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZmluZGRvbWFpbi5jIFshSEFWRV9TVFJJTkdfSCAmJiAhX0xJQkNdOiBEZWZpbmUgbWVtY3B5IHVzaW5nCi0gCWJjb3B5IGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCi0JKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KLQkqIGxvY2FsZWFsaWFzLmM6IExpa2V3aXNlLgotCSogdGV4dGRvbWFpbi5jOiBMaWtld2lzZS4KLQotVHVlIE9jdCAyOSAxMToxMDoyNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxpYmRpcik6IENoYW5nZSB0byB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZgotIAlwcmVmaXguICBSZXBvcnRlZCBieSBLbnV0LUjldmFyZEFrc25lcyA8ZXRva25hQGV0by5lcmljc3Nvbi5zZT4uCi0KLVNhdCBBdWcgMzEgMDM6MDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jIChfbmxfbm9ybWFsaXplX2NvZGVzZXQpOiBXZSBjb252ZXJ0IHRvIGxvd2VyIGNhc2UsCi0Jc28gZG9uJ3QgcHJlcGVuZCB1cHBlcmNhc2UgYElTTycgZm9yIG9ubHkgbnVtZXJpYyBhcmcuCi0KLUZyaSBKdWwgMTkgMDA6MTU6NDYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBNb3ZlIGluY2x1c2lvbiBvZiBhcmd6LmgsIGN0eXBlLmgsIHN0ZGxpYi5oIGFmdGVyCi0JZGVmaW5pdGlvbiBvZiBfR05VX1NPVVJDRS4gIFBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi0JKiBNYWtlZmlsZS5pbiAodW5pbnN0YWxsKTogRml4IGFub3RoZXIgYnVnIHdpdGggYGZvcicgbG9vcCBhbmQKLQllbXB0eSBhcmd1bWVudHMuICBQYXRjaCBieSBKaW0gTWV5ZXJpbmcuICBDb3JyZWN0IG5hbWUgb3MKLQl1bmluc3RhbGxlZCBmaWxlczogbm8gaW50bC0gcHJlZml4IGFueW1vcmUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRhdGEpOiBBZ2FpbiB3b3JrIGFyb3VuZCBzaGVsbHMgd2hpY2gKLQljYW5ub3QgaGFuZGxlIG1wdHkgZm9yIGxpc3QuICBSZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcuCi0KLVNhdCBKdWwgMTMgMTg6MTE6MzUgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogU3BsaXQgZ29hbC4gIE5vdyBkZXBlbmQgb24gaW5zdGFsbC1leGVjCi0gICAgICAgIGFuZCBpbnN0YWxsLWRhdGEuCi0JKGluc3RhbGwtZXhlYywgaW5zdGFsbC1kYXRhKTogTmV3IGdvYWxzLiAgQ3JlYXRlZCBmcm9tIGZvcm1lcgotCWluc3RhbGwgZ29hbC4KLQlSZXBvcnRlZCBieSBLYXJsIEJlcnJ5LgotCi1TYXQgSnVuIDIyIDA0OjU4OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUtJTlNUQUxMRElSUyk6IE5ldyB2YXJpYWJsZS4gIFBhdGggdG8KLSAgICAgICAgbWtpbnN0YWxsZGlycyBzY3JpcHQuCi0JKGluc3RhbGwpOiB1c2UgTUtJTlNUQUxMRElSUyB2YXJpYWJsZSBvciBpZiB0aGUgc2NyaXB0IGlzIG5vdCBwcmVzZW50Ci0JdHJ5IHRvIGZpbmQgaXQgaW4gdGhlICR0b3Bfc2NyZGlyKS4KLQotV2VkIEp1biAxOSAwMjo1Njo1NiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IExpbnV4IGxpYmMgKnBhcnRseSogaW5jbHVkZXMgdGhlIGFyZ3pfKiBmdW5jdGlvbnMuCi0JR3JyLiAgV29yayBhcm91bmQgYnkgcmVuYW1pbmcgdGhlIHN0YXRpYyB2ZXJzaW9uIGFuZCB1c2UgbWFjcm9zCi0JZm9yIHJlbmFtaW5nLgotCi1UdWUgSnVuIDE4IDIwOjExOjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogQ29ycmVjdCBwcmVzZW5jZSB0ZXN0IG1hY3JvcyBvZiBfX2FyZ3pfKiBmdW5jdGlvbnMuCi0KLQkqIGwxMG5mbGlzdC5jOiBJbmNsdWRlIDxhcmd6Lmg+IGJhc2VkIG9uIHRlc3Qgb2YgaXQgaW5zdGVhZCB3aGVuCi0JX19hcmd6XyogZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuCi0JUmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2h3YWIuCi0KLVRodSBKdW4gMTMgMTU6MTc6NDQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGV4cGxvZGVuYW1lLmMsIGwxMG5mbGlzdC5jOiBEZWZpbmUgTlVMTCBmb3IgZHVtYiBzeXN0ZW1zLgotCi1UdWUgSnVuIDExIDE3OjA1OjEzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluLCBsaWJnZXR0ZXh0LmggKGRjZ2V0dGV4dCk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZQotCXJlc3VsdCB0byBfX3Jlc3VsdCB0byBwcmV2ZW50IG5hbWUgY2xhc2guCi0KLQkqIGwxMG5mbGlzdC5jLCBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYzogRGVmaW5lIF9HTlVfU09VUkNFIHRvCi0gICAgICAgIGdldCBwcm90b3R5cGUgZm9yIHN0cGNweSBhbmQgc3RyY2FzZWNtcC4KLQotCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oOiBNb3ZlIGRlY2xhcmF0aW9uIG9mCi0JYF9ubF9tc2dfY2F0X2NudHInIG91dHNpZGUgX19leHRlbnNpb25fXyBibG9jayB0byBwcmV2ZW50IHdhcm5pbmcKLQlmcm9tIGdjYydzIC1XbmVzdGVkLWV4dGVybiBvcHRpb24uCi0KLUZyaSBKdW4gIDcgMDE6NTg6MDAgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlIGNvbW1lbnQuCi0KLVRodSBKdW4gIDYgMTc6Mjg6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogV29yayBhcm91bmQgZm9yIGFub3RoZXIgQnVnbGl4IHN0dXBpZGl0eS4KLQlBbHdheXMgdXNlIGFuIGBlbHNlJyBjbG9zZSBmb3IgYGlmJ3MuICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnRsaC5pbnN0KTogQ29ycmVjdCB0eXBvIGluIHBob255IHJ1bGUuCi0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi1UaHUgSnVuICA2IDAxOjQ5OjUyIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAocmVhZF9hbGlhc19maWxlKTogUmVuYW1lIHZhcmlhYmxlIGFsbG9jYV9saXN0IHRvCi0JYmxvY2tfbGlzdCBhcyB0aGUgbWFjcm8gY2FsbHMgYXNzdW1lLgotCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgotCi0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBEZWZpbmUgYWxsb2NhIGFzIG1hY3JvIHVzaW5nCi0gICAgICAgIG1hbGxvYy4KLQkocmVhZF9hbGlhc19maWxlKTogUmVuYW1lIHZhcnJpYWJlIGFsbG9jYV9saXN0IHRvIGJsb2NrX2xpc3QgYXMgdGhlCi0JbWFjcm8gY2FsbHMgYXNzdW1lLgotCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgotCi0JKiBsMTBuZmxpc3QuYzogQ29ycmVjdCBjb25kaXRpb25hbCBmb3IgPGFyZ3ouaD4gaW5jbHVzaW9uLgotCVJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIG9uIGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExALCBub3QKLSAgICAgICAgYWxsLUBVU0VfTkxTQC4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpbnRsaC5pbnN0IGNvbWVzIGZyb20gbG9jYWwgZGlyLCBub3QKLSAgICAgICAgJChzcmNkaXIpLgotCi0JKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IFNwZWNpYWwgaGFuZGxpbmcgb2YgdGhpcyBnb2FsLiAgSWYKLQl1c2VkIGluIGdldHRleHQsIHRoaXMgaXMgcmVhbGx5IGEgcnVsIHRvIGNvbnN0cnVjdCB0aGlzIGZpbGUuICBJZgotCXVzZWQgaW4gYW55IG90aGVyIHBhY2thZ2UgaXQgaXMgZGVmaW5lZCBhcyBhIC5QSE9OWSBydWxlIHdpdGgKLQllbXB0eSBib2R5LgotCi0JKiBmaW5kZG9tYWluLmM6IEV4dHJhY3QgbG9jYWxlIGZpbGUgaW5mb3JtYXRpb24gaGFuZGxpbmcgaW50bwotCWwxMG5maWxlLmMuICBSZW5hbWUgbG9jYWwgc3RwY3B5X18gZnVuY3Rpb24gdG8gc3RwY3B5LgotCi0JKiBkY2dldHRleHQuYyAoc3RwY3B5KTogQWRkIGxvY2FsIGRlZmluaXRpb24uCi0KLQkqIGwxMG5mbGlzdC5jOiBTb2x2ZSBzb21lIHBvcnRhYmlsaXR5IHByb2JsZW1zLiAgUGF0Y2hlcyBwYXJ0bHkgYnkKLQlUaG9tYXMgRXNrZW4uICBBZGQgbG9jYWwgZGVmaW5pdGlvbiBvZiBzdHBjcHkuCi0KLVR1ZSBKdW4gIDQgMDI6NDc6NDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW46IERvbid0IGRlcGVuZCBpbmNsdWRpbmcgPGxvY2FsZS5oPiBvbgotCUhBVkVfTE9DQUxFX0guICBJbnN0ZWFkIGNvbmZpZ3VyZSBtdXN0IHJld3JpdGUgdGhpcyBmaWlsZQotCWRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mIHRoZSBjb25maWd1cmUgcnVuLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGxpYmludGwuaW5zdCBpcyBub3cgY2FsbGVkIGludGxoLmluc3QuCi0JQWRkIHJ1bGVzIGZvciB1cGRhdGluZyBpbnRsaC5pbnN0IGZyb20gaW50bGguaW5zdC5pbi4KLQotCSogbGliaW50bC5pbnN0OiBSZW5hbWVkIHRvIGludGxoLmluc3QuaW4uCi0KLQkqIGxvY2FsZWFsaWFzLmMsIGRjZ2V0dGV4dC5jIFtfX0dOVUNfX106IERlZmluZSBIQVZFX0FMTE9DQSB0byAxCi0gICAgICAgIGJlY2F1c2UgZ2NjIGhhcyBfX2J1aXRsaW5fYWxsb2NhLgotCVJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1Nb24gSnVuICAzIDAwOjMyOjE2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbGNoZWNrKTogTmV3IGdvYWwgdG8gZnVsZmlsbCBuZWVkcyBvZgotICAgICAgICBhdXRvbWFrZSdzIGRpc3RjaGVjay4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW9yZGVyIGNvbW1hbmRzIHNvIHRoYXQgVkVSU0lPTiBpcwotICAgICAgICBmb3VuZC4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBOb3cgdXNlIHN1YmRpcmVjdG9yeSBpbnRsLyBpbgotICAgICAgICBAZGF0YWRpckAvZ2V0dGV4dC4KLQkoQ09NU1JDUyk6IEFkZCBsMTBuZmlsZS5jLgotCShPQkpFQ1RTKTogQWRkIGwxMG5maWxlLm8uCi0JKERJU1RGSUxFUyk6IFJlbmFtZSB0byBESVNURklMRS5ub3JtYWwuICBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KLQkoRElTVEZJTEUuZ2V0dGV4dCk6IFJlbW92ZSAkKERJU1RGSUxFUy5jb21tb24pLgotCShhbGwtZ2V0dGV4dCk6IFJlbW92ZSBnb2FsLgotCShpbnN0YWxsKTogSWYgJChQQUNLQUdFKSA9IGdldHRleHQgaW5zdGFsbCwgb3RoZXJ3b3NlIGRvIG5vdGhpbmcuICBObwotCXBhY2thZ2UgYnV0IGdldHRleHQgaXRzZWxmIHNob3VsZCBpbnN0YWxsIGxpYmludGwuaCArIGhlYWRlcnMuCi0JKGRpc3QpOiBFeHRlbmQgZ29hbCB0byB3b3JrIGZvciBnZXR0ZXh0LCB0b28uCi0JKGRpc3QtZ2V0dGV4dCk6IFJlbW92ZSBnb2FsLgotCi0JKiBkY2dldHRleHQuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIG1hY3JvIGFsbG9jYSBieSB1c2luZyBtYWxsb2MuCi0KLVN1biBKdW4gIDIgMTc6MzM6MDYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKTogUGFyYW1ldGVyIGlzIG5vdyBjb21lcyBmcm9tCi0gICAgICAgIGZpbmRfbDEwbmZpbGUuCi0KLVNhdCBKdW4gIDEgMDI6MjM6MDMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jIChfX2FyZ3pfbmV4dCk6IEFkZCBkZWZpbml0aW9uLgotCi0JKiBkY2dldHRleHQuYyBbIUhBVkVfQUxMT0NBXTogQWRkIGNvZGUgZm9yIGhhbmRsaW5nIG1pc3NpbmcgYWxsb2NhCi0JY29kZS4gIFVzZSBuZXcgbDEwbmZpbGUgaGFuZGxpbmcuCi0KLQkqIGxvY2FsZWFsaWFzLmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nCi0gICAgICAgIGFsbG9jYSBjb2RlLgotCi0JKiBsMTBuZmxpc3QuYzogSW5pdGlhbCByZXZpc2lvbi4KLQotVHVlIEFwciAgMiAxODo1MToxOCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQpOiBOZXcgZ29hbC4gIFNhbWUgYXMgYWxsLXllcy4KLQotVGh1IE1hciAyOCAyMzowMToyMiAxOTk2ICBLYXJsIEVpY2h3YWxkZXIgIDxrZUBrZS5jZW50cmFsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IERlZmluZSB1c2luZyBAZGF0YWRpckAuCi0KLVR1ZSBNYXIgMjYgMTI6Mzk6MTQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBJbmNsdWRlIDxjdHlwZS5oPi4gIFJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1TYXQgTWFyIDIzIDAyOjAwOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KTogUmVuYW1lIHRvIHN0cGNweV9fIHRvIHByZXZlbnQgY2xhc2hpbmcKLSAgICAgICAgd2l0aCBleHRlcm5hbCBkZWNsYXJhdGlvbi4KLQotU2F0IE1hciAgMiAwMDo0NzowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLW5vKTogUmVuYW1lIGZyb20gYWxsX25vLgotCi1TYXQgRmViIDE3IDAwOjI1OjU5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggW2xvYWRlZF9kb21haW5dOiBBcnJheSBgc3VjY2Vzc29yJyBtdXN0IG5vdyBjb250YWluIHVwCi0gICAgICAgIHRvIDYzIGVsZW1lbnRzIChiZWNhdXNlIG9mIGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uKS4KLQotCSogZmluZGRvbWFpbi5jOiBJbXBsZW1lbnQgY29kZXNldCBuYW1lIG5vcm1hbGl6YXRpb24uCi0KLVRodSBGZWIgMTUgMDQ6Mzk6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlZmluZSB0byBgYWxsLUBVU0VfTkxTQCcuCi0JKGFsbC15ZXMsIGFsbF9ubyk6IE5ldyBnb2Fscy4gIGBhbGwtbm8nIGlzIG5vb3AsIGBhbGwteWVzJwotCWlzIGZvcm1lciBhbGwuCi0KLU1vbiBKYW4gMTUgMjE6NDY6MDEgMTk5NiAgSG93YXJkIEdheWxlICA8aG93YXJkQGhhbC5jb20+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOiBJbmNyZW1lbnQgc3RyaW5nIHBvaW50ZXJzIGluIGxvb3AKLSAgICAgICAgb2Ygc3RyY2FzZWNtcCByZXBsYWNlbWVudC4KLQotRnJpIERlYyAyOSAyMToxNjozNCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBXaG8gY29tbWVudGVkIHRoaXMgZ29hbCBvdXQgPyA6LSkKLQotRnJpIERlYyAyOSAxNTowODoxNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogU2F2ZSBgZXJybm8nLiAgRmFpbGluZyBzeXN0ZW0gY2FsbHMKLQlzaG91bGQgbm90IGVmZmVjdCBpdCBiZWNhdXNlIGEgbWlzc2luZyBjYXRhbG9nIGlzIG5vIGVycm9yLgotCVJlcG9ydGVkIGJ5IEhhcmFsZCBLPG86Pm5pZyA8a29lbmlnQHRhdC5waHlzaWsudW5pLXR1ZWJpbmdlbi5kZT4uCi0KLVR1ZSBEZWMgMTkgMjI6MDk6MTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRXhwbGljaXRseSB1c2UgJChTSEVMTCkgZm9yIHJ1bm5pbmcKLSAgICAgICAgc2hlbGwgc2NyaXB0cy4KLQotRnJpIERlYyAxNSAxNzozNDo1OSAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogT25seSBpbnN0YWxsIGxpYnJhcnkgYW5kIGhlYWRlciB3aGVuCi0Jd2UgdXNlIHRoZSBvd24gaW1wbGVtZW50YXRpb24uICBEb24ndCBkbyBpdCB3aGVuIHVzaW5nIHRoZQotCXN5c3RlbSdzIGdldHRleHQgb3IgY2F0Z2V0cyBmdW5jdGlvbnMuCi0KLQkqIGRjZ2V0dGV4dC5jIChmaW5kX21zZyk6IE11c3Qgbm90IHN3YXAgZG9tYWluLT5oYXNoX3NpemUgaGVyZS4KLQotU2F0IERlYyAgOSAxNjoyNDozNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jLCBsaWJpbnRsLmluc3QsIGxpYmdldHRleHQuaCwgaGFzaC1zdHJpbmcuaCwKLQlnZXR0ZXh0UC5oLCBmaW5kZG9tYWluLmMsIGRjZ2V0dGV4dC5jLCBjYXQtY29tcGF0LmM6Ci0JVXNlIFBBUkFNUyBpbnN0ZWFkIG9mIF9fUC4gIFN1Z2dlc3RlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotVHVlIERlYyAgNSAxMTozOToxNCAxOTk1ICBMYXJyeSBTY2h3aW1tZXIgIDxyb3NlYnVkQGN5Y2xvbmUuc3RhbmZvcmQuZWR1PgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFVzZSBgI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKScgaW5zdGVhZCBvZiBgI2lmCi0JIV9MSUJJTlRMX0gnIGJlY2F1c2UgU29sYXJpcyBkZWZpbmVzIF9MSUJJTlRMX0ggYXMgZW1wdHkuCi0KLU1vbiBEZWMgIDQgMTU6NDI6MDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKToKLQlJbnN0YWxsIGxpYmludGwuaW5zdCBpbnN0ZWFkIG9mIGxpYmludGwuaC5pbnN0YWxsLgotCi1TYXQgRGVjICAyIDIyOjUxOjM4IDE5OTUgIE1hcmN1cyBEYW5pZWxzICA8bWFyY3VzQHN5c2MucGR4LmVkdT4KLQotCSogY2F0LWNvbXBhdC5jICh0ZXh0ZG9tYWluKToKLQlSZXZlcnNlIG9yZGVyIGluIHdoaWNoIGZpbGVzIGFyZSB0cmllZCB5b3UgbG9hZC4gIEZpcnN0Ci0JdHJ5IGxvY2FsIGZpbGUsIHdoZW4gdGhpcyBmYWlsZWQgYWJzb2x1dGUgcGF0aC4KLQotV2VkIE5vdiAyOSAwMjowMzo1MyAxOTk1ICBOZWxzb24gSC4gRi4gQmVlYmUgIDxiZWViZUBtYXRoLnV0YWguZWR1PgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKTogQWRkIG1pc3NpbmcgeyB9LgotCi1TdW4gTm92IDI2IDE4OjIxOjQxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmludGwuaW5zdDogQWRkIG1pc3NpbmcgX19QIGRlZmluaXRpb24uICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLQkqIE1ha2VmaWxlLmluOgotCUFkZCBkdW1teSBgYWxsJyBhbmQgYGR2aScgZ29hbHMuICBSZXBvcnRlZCBieSBUb20gVHJvbWV5LgotCi1TYXQgTm92IDI1IDE2OjEyOjAxIDE5OTUgIEZyYW5jLG9pcyBQaW5hcmQgIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4KLQotCSogaGFzaC1zdHJpbmcuaDogQ2FwaXRhbGl6ZSBhcmd1bWVudHMgb2YgbWFjcm9zLgotCi1TYXQgTm92IDI1IDEyOjAxOjM2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBQcmV2ZW50IGZpbGVzIG5hbWVzIGxvbmdlciB0aGFuIDEzCi0JY2hhcmFjdGVycy4gIGxpYmludGwuaC5nbGliYy0+bGliaW50bC5nbGliYywKLQlsaWJpbnRsLmguaW5zdGFsbC0+bGliaW50bC5pbnN0LiAgUmVwb3J0ZWQgYnkgSm9zaHVhIFIuIFBvdWxzb24uCi0KLVNhdCBOb3YgMjUgMTE6MzE6MTIgMTk5NSAgRXJpYyBCYWNrdXMgIDxlcmljYkBsc2lkLmhwLmNvbT4KLQotCSogZGNnZXR0ZXh0LmM6IEZpeCBidWcgaW4gcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscy4KLQotU2F0IE5vdiAyNSAwMjozNToyNyAxOTk1ICBOZWxzb24gSC4gRi4gQmVlYmUgIDxiZWViZUBtYXRoLnV0YWguZWR1PgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFNvbGFyaXMgY2MgZG9lcyBub3QgdW5kZXJzdGFuZAotCSAjaWYgIVNZTUJPTDEgJiYgIVNZTUJPTDIuICBTYWQJYnV0IHRydWUuCi0KLVRodSBOb3YgMjMgMTY6MjI6MTQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgotCUZpeCBmb3IgbWFjaGluZSB3aXRoID4zMiBiaXQgYHVuc2lnbmVkIGxvbmcncy4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6Ci0JRml4IGhvcnJpYmxlIGJ1ZyBpbiBsb29wIGZvciBhbHRlcm5hdGl2ZSB0cmFuc2xhdGlvbi4KLQotVGh1IE5vdiAyMyAwMTo0NToyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluLCBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOgotCVNvbWUgZnVydGhlciBzaW1wbGlmaWNhdGlvbnMgaW4gbWVzc2FnZSBudW1iZXIgZ2VuZXJhdGlvbi4KLQotTW9uIE5vdiAyMCAyMTowODo0MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJpbnRsLmguZ2xpYmM6IFVzZSBfX2NvbnN0IGluc3RlYWQgb2YgY29uc3QgaW4gcHJvdG90eXBlcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKToKLQlJbnN0YWxsIGxpYmludGwuaC5pbnN0YWxsIGluc3RlYWQgb2YgbGliaW50bC5oLiAgVGhpcwotCWlzIGEgc3RyaXBwZWQtZG93biB2ZXJzaW9uLiAgU3VnZ2VzdGVkIGJ5IFBldGVyIE1pbGxlci4KLQotCSogbGliaW50bC5oLmluc3RhbGwsIGxpYmludGwuaC5nbGliYzogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogbG9jYWxlYWxpYXMuYyAoX25sX2V4cGFuZF9hbGlhcywgcmVhZF9hbGlhc19maWxlKToKLQlQcm90ZWN0IHByb3RvdHlwZXMgaW4gdHlwZSBjYXN0cyBieSBfX1AuCi0KLVR1ZSBOb3YgMTQgMTY6NDM6NTggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaDogQ29ycmVjdCBwcm90b3R5cGUgZm9yIGhhc2hfc3RyaW5nLgotCi1TdW4gTm92IDEyIDEyOjQyOjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKTogQWRkIHByb3RvdHlwZS4KLQotCSogZ2V0dGV4dFAuaDogRml4IGNvcHlyaWdodC4KLQkoU1dBUCk6IEFkZCBwcm90b3R5cGUuCi0KLVdlZCBOb3YgIDggMjI6NTY6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKTogRm9yZ290IHNpemVvZi4KLQlBdm9pZCBjYWxsaW5nICpwcmludGYgZnVuY3Rpb24uICBUaGlzIGludHJvZHVjZXMgYSBiaWcgb3ZlcmhlYWQuCi0JUGF0Y2ggYnkgUm9sYW5kIE1jR3JhdGguCi0KLVR1ZSBOb3YgIDcgMTQ6MjE6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jLCBjYXQtY29tcGF0LmM6IFdyb25nIGluZGVudGF0aW9uIGluICNpZiBmb3Igc3RwY3B5LgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6Ci0JRGVmaW5lIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBsb2NhbC4gIFRoZSBtYWNybyB3YXMgdG8gZmxha3kuCi0KLQkqIGNhdC1jb21wYXQuYzogRml4IHR5cG8uCi0KLQkqIHhvcGVuLW1zZy5zZWQsIGxpbnV4LW1zZy5zZWQ6Ci0JV2hpbGUgYnJpbmdpbmcgbWVzc2FnZSBudW1iZXIgdG8gcmlnaHQgcGxhY2Ugb25seSBhY2NlcHQgZGlnaXRzLgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOiBOb3cgdGhhdCB0aGUgY291bnRlciBkb2VzIG5vdCBoYXZlCi0JbGVhZGluZyAwcyB3ZSBkb24ndCBuZWVkIHRvIHJlbW92ZSB0aGVtLiAgUmVwb3J0ZWQgYnkgTWFyY3VzCi0JRGFuaWVscy4KLQotCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6IFVzZSAkKHRvcF9zcmRpcikgaW4KLQlkZXBlbmRlbmN5LiAgUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGNhdC1jb21wYXQuYzogKHN0cGNweSkgWyFfTElCQyAmJiAhSEFWRV9TVFBDUFldOiBEZWZpbmUgcmVwbGFjZW1lbnQuCi0JR2VuZXJhbGx5IGNsZWFudXAgdXNpbmcgI2lmIGluc3RlYWQgb2YgI2lmbmRlZi4KLQotCSogTWFrZWZpbGUuaW46IENvcnJlY3QgdHlwb3MgaW4gY29tbWVudC4gIEJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLU1vbiBOb3YgIDYgMDA6Mjc6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogRG9uJ3QgaW5zdGFsbCBsaWJpbnRsLmggYW5kIGxpYmludGwuYQotCWlmIHdlIHVzZSBhbiBhdmFpbGFibGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4KLQotU3VuIE5vdiAgNSAyMjowMjowOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0Lmg6IEZpeCB0eXBvOiBIQVZFX0NBVEdFVFRTIC0+IEhBVkVfQ0FUR0VUUy4gIFJlcG9ydGVkCi0JYnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotCSogbGliZ2V0dGV4dC5oOiBVc2UgI2lmIGluc3RlYWQgb2YgI2lmZGVmLyNpZm5kZWYuCi0KLQkqIGZpbmRkb21haW4uYzoKLQlDb21tZW50cyBkZXNjcmliaW5nIHdoYXQgaGFzIHRvIGJlIGRvbmUgc2hvdWxkIHN0YXJ0IHdpdGggRklYTUUuCi0KLVN1biBOb3YgIDUgMTk6Mzg6MDEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFNwbGl0LiAgVXNlIERJU1RGSUxFUyB3aXRoIG5vcm1hbCBtZWFuaW5nLgotCURJU1RGSUxFUy5jb21tb24gbmFtZXMgdGhlIGZpbGVzIGNvbW1vbiB0byBib3RoIGRpc3QgZ29hbHMuCi0JRElTVEZJTEVTLmdldHRleHQgYXJlIHRoZSBmaWxlcyBvbmx5IGRpc3RyaWJ1dGVkIGluIEdOVSBnZXR0ZXh0LgotCi1TdW4gTm92ICA1IDE3OjMyOjU0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBDb3JyZWN0IHNlYXJjaGluZyBpbiBkZXJpdmVkIGxvY2FsZXMuCi0JVGhpcyB3YXMgbmVjZXNzYXJ5IHNpbmNlIGEgY2hhbmdlIGluIF9ubF9maW5kX21zZyBzZXZlcmFsIHdlZWtzCi0JYWdvLiAgSSByZWFsbHkgZG9uJ3Qga25vdyB0aGlzIGlzIHN0aWxsIG5vdCBmaXhlZC4KLQotU3VuIE5vdiAgNSAxMjo0MzoxMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFRlc3QgZm9yIEZJTEVOQU1FID09IE5VTEwuICBUaGlzCi0JbWlnaHQgbWFyayBhIHNwZWNpYWwgY29uZGl0aW9uLgotCi0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKTogRG9uJ3QgbWFrZSBpbGxlZ2FsIGVudHJ5IGFzIGRlY2lkZWQuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogU3VwcHJlc3MgZXJyb3IgbWVzc2FnZSB3aGVuIGxuIGZhaWxlZC4KLQlHZXQgZmlsZXMgZnJvbSAkKHNyY2RpcikgZXhwbGljaXRseS4KLQotCSogbGliZ2V0dGV4dC5oIChnZXR0ZXh0X2NvbnN0KTogUmVuYW1lIHRvIGdldHRleHRfbm9vcC4KLQotRnJpIE5vdiAgMyAwNzozNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKToKLQlQcm90ZWN0IGFnYWluc3Qgd3JvbmcgbG9jYWxlIG5hbWVzIGJ5IHRlc3RpbmcgbWFzay4KLQotCSogbGliZ2V0dGV4dC5oIChnZXR0ZXh0X2NvbnN0KTogQWRkIG1hY3JvIGRlZmluaXRpb24uCi0JQ2FwaXRhbGl6ZSBtYWNybyBhcmd1bWVudHMuCi0KLVRodSBOb3YgIDIgMjM6MTU6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVRlc3QgZm9yIHBvaW50ZXIgIT0gTlVMTCBiZWZvcmUgYWNjZXNzaW5nIHZhbHVlLgotCVJlcG9ydGVkIGJ5IFRvbSBUcm9tZXkuCi0KLQkqIGdldHRleHQuYyAoTlVMTCk6Ci0JRGVmaW5lIGFzICh2b2lkKikwIGluc3RhZCBvZiAwLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotTW9uIE9jdCAzMCAyMToyODo1MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBTZXJpb3VzIHR5cG8gYnVnIGZpeGVkIGJ5IEppbSBNZXllcmluZy4KLQotU2F0IE9jdCAyOCAyMzoyMDo0NyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0Lmg6IERpc2FibGUgZGNnZXR0ZXh0IG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOgotCVBldGVyIE1pbGxlciByZXBvcnRlZCB0aGF0IHRvbG93ZXIgaW4gc29tZSBzeXN0ZW1zIGlzCi0JZXZlbiBkdW1iZXIgdGhhbiBJIHRob3VnaHQuICBQcm90ZWN0IGNhbGwgYnkgYGlzdXBwZXInLgotCi1GcmkgT2N0IDI3IDIyOjIyOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChsaWJkaXIsIGluY2x1ZGVkaXIpOiBOZXcgdmFyaWFibGVzLgotCShpbnN0YWxsLXNyYyk6IEluc3RhbGwgbGliaW50bC5hIGFuZCBsaWJpbnRsLmggaW4gY29ycmVjdCBkaXJzLgotCi1GcmkgT2N0IDI3IDIyOjA3OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChTT1VSQ0VTKTogRml4IHR5cG86IGludHJsLmNvbXBhdC5jIC0+IGludGwtY29tcGF0LmMuCi0KLQkqIHBvMnRibC5zZWQuaW46IFBhdGNoIGZvciBidWdneSBTRURzIGJ5IENocmlzdGlhbiB2b24gUm9xdWVzLgotCi0JKiBsb2NhbGVhbGlhcy5jOgotCUZpeCB0eXBvIGFuZCBzdXBlcmZsb3VzIHRlc3QuICBSZXBvcnRlZCBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLQotRnJpIE9jdCAgNiAxMTo1MjowNSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JQ29ycmVjdCBzb21lIHJlbWFpbmRlciBmcm9tIHRoZSBwcmUtQ0VOIHN5bnRheC4gIE5vdwotCXdlIGRvbid0IGhhdmUgYSBjb25zdGFudCBudW1iZXIgb2Ygc3VjY2Vzc29ycyBhbnltb3JlLgotCi1XZWQgU2VwIDI3IDIxOjQxOjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBBZGQgbGliaW50bC5oLmdsaWJjLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdC1saWJjKTogQWRkIGdvYWwgZm9yIHBhY2tpbmcgc291cmNlcyBmb3IgZ2xpYmMuCi0JKENPTVNSQ1MsIENPTUhEUlMpOiBTcGxpdHRlZCB0byBzZXBhcmF0ZSBzb3VyY2VzIHNoYXJlZCB3aXRoIGdsaWJjLgotCi0JKiBsb2FkbXNnY2F0LmM6IEZvcmdldCB0byBjb250aW51ZSAjaWYgbGluZS4KLQotCSogbG9jYWxlYWxpYXMuYzoKLQlbX0xJQkNdOiBSZW5hbWUgc3RyY2FzZWNtcCB0byBfX3N0cmNhc2VjbXAgdG8ga2VlcCBBTlNJIEMgbmFtZQotCXNwYWNlIGNsZWFuLgotCi0JKiBkY2dldHRleHQuYywgZmluZGRvbWFpbi5jOiBCZXR0ZXIgY29tbWVudCB0byBsYXN0IGNoYW5nZS4KLQotCSogbG9hZG1zZ2NhdC5jOgotCVtfTElCQ106IFJlbmFtZSBmc3RhdCwgb3BlbiwgY2xvc2UsIHJlYWQsIG1tYXAsIGFuZCBtdW5tYXAgdG8KLQlfX2ZzdGF0LCBfX29wZW4sIF9fY2xvc2UsIF9fcmVhZCwgX19tbWFwLCBhbmQgX19tdW5tYXAgcmVzcAotCXRvIGtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGZpbmRkb21haW4uYzoKLQlbX0xJQkNdOiBSZW5hbWUgc3RwY3B5IHRvIF9fc3RwY3B5IHRvIGtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGRjZ2V0dGV4dC5jOgotCVtfTElCQ106IFJlbmFtZSBnZXRjZWQgYW5kIHN0cGNweSB0byBfX2dldGN3ZCBhbmQgX19zdHBjcHkgcmVzcCB0bwotCWtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGxpYmdldHRleHQuaDoKLQlJbmNsdWRlIHN5cy90eXBlcy5oIGZvciB0aG9zZSBvbGQgU3lzViBzeXN0ZW1zIG91dCB0aGVyZS4KLQlSZXBvcnRlZCBieSBGcmFuY2VzY28gUG90b3J0aWAuCi0KLQkqIGxvYWRtc2djYXQuYyAodXNlX21tYXApOiBEZWZpbmUgaWYgY29tcGlsZWQgZm9yIGdsaWJjLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGZpbmRkb21haW4uYzogRml4IDIgdGltZXMgZGVmaWVuZCAtPiBkZWZpbmVkLgotCi0JKiB0ZXh0ZG9tYWluLmM6IEluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4KLQljb21waWxpbmcgZm9yIGdsaWJjLiAgSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBsb2NhbGVhbGlhcy5jLCBsb2FkbXNnY2F0LmM6IFByZXBhcmUgdG8gYmUgY29tcGlsZWQgaW4gZ2xpYmMuCi0KLQkqIGdldHRleHQuYzoKLQlJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0JR2V0IE5VTEwgZnJvbSBzdGRkZWYuaCBpZiB3ZSBjb21waWxlIGZvciBnbGliYy4KLQotCSogZmluZGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCi0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZGNnZXR0ZXh0LmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5Ci0JaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZGdldHRleHQuYzogSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZgotCWxpYmdldHRleHQuaC4KLQkobG9jYWxlLmgpOiBEb24ndCByZWx5IG9uIEhBVkVfTE9DQUxFX0ggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCi0JKiBkY2dldHRleHQuYzogSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZgotCWxpYmdldHRleHQuaC4KLQkoZ2V0Y3dkKTogRG9uJ3QgcmVseSBvbiBIQVZFX0dFVENXRCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6Ci0JSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0LmguCi0KLU1vbiBTZXAgMjUgMjI6MjM6MDYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAoX25sX2V4cGFuZF9hbGlhcyk6IERvbid0IGNhbGwgYnNlYXJjaCBpZiBOTUFQIDw9IDAuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCVN0cmluZyB1c2VkIGluIHB1dGVudiBtdXN0IG5vdCBiZSByZWN5Y2xlZC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogbGliZ2V0dGV4dC5oIChfX1VTRV9HTlVfR0VUVEVYVCk6Ci0JQWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIEdOVSBnZXR0ZXh0Ci0JbGlicmFyeS4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JRml4IGJ1ZyB3aXRoIHRoZSBzdHJhbmdlIHN0cGNweSByZXBsYWNlbWVudC4KLQlSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLVNhdCBTZXAgMjMgMDg6MjM6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogY2F0LWNvbXBhdC5jOiBJbmNsdWRlIDxzdHJpbmcuaD4gZm9yIHN0cGNweSBwcm90b3R5cGUuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JV2hpbGUgZXhwYW5kIHN0cmR1cCBjb2RlIHRlbXBvcmFyeSB2YXJpYWJsZSBgY3AnIGhpZGVkCi0JaGlnaGVyIGxldmVsIHZhcmlhYmxlIHdpdGggc2FtZSBuYW1lLiAgUmVuYW1lIHRvIGB0cCcuCi0KLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6Ci0JQXZvaWQgd2FybmluZyBieSB1c2luZyB0ZW1wb3JhcnkgdmFyaWFibGUgaW4gc3RyZHVwIGNvZGUuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgYXBwbGljYXRpb24nLgotCi1UaHUgU2VwIDIxIDE1OjUxOjQ0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOgotCVVzZSBzdHJjYXNlY21wKCkgb25seSBpZiBhdmFpbGFibGUuICBFbHNlIHVzZQotCWltcGxlbWVudGF0aW9uIGluIHBsYWNlLgotCi0JKiBpbnRsLWNvbXBhdC5jOgotCVdyYXBwZXIgZnVuY3Rpb25zIG5vdyBjYWxsICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBfXyouCi0KLQkqIGxpYmdldHRleHQuaDogRGVjbGFyZSBwcm90b3R5cGVzIGZvciAqX18gZnVuY3Rpb25zIGluc3RlYWQgZm9yIF9fKi4KLQotCSogY2F0LWNvbXBhdC5jLCBsb2FkbXNnY2F0LmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0JUmVuYW1lIHRvIGJpbmR0ZXh0ZG9tYWluX18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZGdldHRleHQuYzoKLQlSZW5hbWUgZnVuY3Rpb24gdG8gZGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBnZXR0ZXh0LmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0JRnVuY3Rpb25zIG5vdyBjYWxsZWQgZ2V0dGV4dF9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGRjZ2V0dGV4dC5jLCBsb2NhbGVhbGlhcy5jLCB0ZXh0ZG9tYWluLmMsIGZpbmRkb21haW4uYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQotU3VuIFNlcCAxNyAyMzoxNDo0OSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IENvcnJlY3Qgc29tZSBidWdzIGluIGhhbmRsaW5nIG9mIENFTiBzdGFuZGFyZAotIAlsb2NhbGUgZGVmaW5pdGlvbnMuCi0KLVRodSBTZXAgIDcgMDE6NDk6MjggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBJbXBsZW1lbnQgQ0VOIHN5bnRheC4KLQotCSogZ2V0dGV4dFAuaCAobG9hZGVkX2RvbWFpbik6IEV4dGVuZCBudW1iZXIgb2Ygc3VjY2Vzc29ycyB0byAzMS4KLQotU2F0IEF1ZyAxOSAxOToyNToyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogUmVtb3ZlIHBhdGggdG8gWDExIGxvY2FsZSBkaXIuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGluc3RhbGwtc3JjIGRlcGVuZCBvbiBpbnN0YWxsLiAgVGhpcyBoZWxwcwotIAlnZXR0ZXh0IHRvIGluc3RhbGwgdGhlIHNvdXJjZXMgYW5kIG90aGVyIHBhY2thZ2VzIGNhbiB1c2UgdGhlCi0gCWluc3RhbGwgZ29hbC4KLQotU2F0IEF1ZyAxOSAxNToxOTozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAodW5pbnN0YWxsKTogUmVtb3ZlIHN0dWZmIGluc3RhbGxlZCBieSBpbnN0YWxsLXNyYy4KLQotVHVlIEF1ZyAxNSAxMzoxMzo1MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBWRVJTSU9OLmluOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKLQlBZGQgVkVSU0lPTiBmaWxlLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBnZXR0ZXh0LCBidXQKLQlmb3Igb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhpcyBsaWJyYXJ5LgotCi1UdWUgQXVnIDE1IDA2OjE2OjQ0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggKF9ubF9maW5kX2RvbWFpbik6Ci0JTmV3IHByb3RvdHlwZSBhZnRlciBjaGFuZ2luZyBzZWFyY2ggc3RyYXRlZ3kuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlXZSBub3cgdHJ5IG9ubHkgdG8gZmluZCBhIHNwZWNpZmllZCBjYXRhbG9nLiAgRmFsbCBiYWNrIHRvIG90aGVyCi0JY2F0YWxvZ3MgbGlzdGVkIGluIHRoZSBsb2NhbGUgbGlzdCBpcyBub3cgZG9uZSBpbiBfX2RjZ2V0dGV4dC4KLQotCSogZGNnZXR0ZXh0LmMgKF9fZGNnZXR0ZXh0KToKLQlOb3cgd2UgcHJvdmlkZSBtZXNzYWdlIGZhbGwgYmFjayBldmVuIHRvIGRpZmZlcmVudCBsYW5ndWFnZXMuCi0JSS5lLiBpZiBhIG1lc3NhZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBvbmUgbGFuZ3VhZ2UgYWxsIHRoZSBvdGhlcgotIAlpbiB0aGUgbG9jYWxlIGxpc3QgYSB0cmllZC4gIEZvcm1lcmx5IGZhbGwgYmFjayB3YXMgb25seSBwb3NzaWJsZQotIAl3aXRoaW4gb25lIGxhbmd1YWdlLiAgSW1wbGVtZW50ZWQgYnkgbW92aW5nIG9uZSBsb29wIGZyb20KLSAJX25sX2ZpbmRfZG9tYWluIHRvIGhlcmUuCi0KLU1vbiBBdWcgMTQgMjM6NDU6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOgotCURpcmVjdG9yeSB3aGVyZSBzb3VyY2Ugb2YgR05VIGdldHRleHQgbGlicmFyeSBhcmUgbWFkZQotCWF2YWlsYWJsZS4KLQkoSU5TVEFMTCwgSU5TVEFMTF9EQVRBKTogUHJvZ3JhbXMgdXNlZCBmb3IgaW5zdGFsbGluZyBzb3VyY2VzLgotCShnZXR0ZXh0LXNyYyk6IE5ldy4gIFJ1bGUgdG8gaW5zdGFsbCBHTlUgZ2V0dGV4dCBzb3VyY2VzIGZvciB1c2UgaW4KLQlnZXR0ZXh0aXplIHNoZWxsIHNjcmlwdC4KLQotU3VuIEF1ZyAxMyAxNDo0MDo0OCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6Ci0JVXNlIG1tYXAgZm9yIGxvYWRpbmcgb25seSB3aGVuIG11bm1hcCBmdW5jdGlvbiBpcwotCWFsc28gYXZhaWxhYmxlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCBvbiBgYWxsJyBnb2FsLgotCi1XZWQgQXVnICA5IDExOjA0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JRG8gbm90IG92ZXJ3cml0ZSAnXG4nIHdoZW4gdGVybWluYXRpbmcgYWxpYXMgdmFsdWUgc3RyaW5nLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCUhhbmRsZSBsb25nIGxpbmVzLiAgSWdub3JlIHRoZSByZXN0IG5vdCBmaXR0aW5nIGluCi0JdGhlIGJ1ZmZlciBhZnRlciB0aGUgaW5pdGlhbCBgZmdldHMnIGNhbGwuCi0KLVdlZCBBdWcgIDkgMDA6NTQ6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCAoX25sX2xvYWRfZG9tYWluKToKLQlBZGQgcHJvdG90eXBlLCByZXBsYWNpbmcgcHJvdG90eXBlIGZvciBfbmxfbG9hZF9tc2dfY2F0LgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JUmVtb3ZlIHVubmVlZGVkIHZhcmlhYmxlIGZpbGVuYW1lIGFuZCBmaWxlbmFtZV9sZW4uCi0JKGV4cGFuZF9hbGlhcyk6IFJlbW92ZSBwcm90b3R5cGUgYmVjYXVzZSBmdW5jdGlvbnMgZG9lcyBub3QKLSAJZXhpc3QgYW55bW9yZS4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlDaGFuZ2UgdHlwZSBvZiBmbmFtZV9sZW4gcGFyYW1ldGVyIHRvIGludC4KLQkoeG1hbGxvYyk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGxvYWRtc2djYXQuYzogQmV0dGVyIHByb3RvdHlwZXMgZm9yIHhtYWxsb2MuCi0KLVR1ZSBBdWcgIDggMjI6MzA6MzkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCUFsbG93IGFsaWFzIG5hbWUgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZm91ciBjb21wb25lbnRzLgotCi0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogTmV3IHZhcmlhYmxlLiAgU2V0IHRvIHByZWxpbWluYXJ5IHZhbHVlLgotCShTT1VSQ0VTKTogQWRkIGxvY2FsZWFsaWFzLmMuCi0JKE9CSkVDVFMpOiBBZGQgbG9jYWxlYWxpYXMuby4KLQotCSogZ2V0dGV4dFAuaDogQWRkIHByb3RvdHlwZSBmb3IgX25sX2V4cGFuZF9hbGlhcy4KLQotCSogZmluZGRvbWFpbi5jOiBBbGlhc2luZyBoYW5kbGVkIGluIGludGwvbG9jYWxlYWxpYXMuYy4KLQotCSogbG9jYWxlYWxpYXMuYzogQWxpYXNpbmcgZm9yIGxvY2FsZSBuYW1lcy4KLQotCSogYmluZHRleHRkb20uYzogQmV0dGVyIHByb3RvdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhzdHJkdXAuCi0KLU1vbiBBdWcgIDcgMjM6NDc6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IGdldHRleHQucGVybCBpcyBub3cgZm91bmQgaW4gbWlzYy8uCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCUNvcnJlY3QgaW1wbGVtZW50YXRpb24uICBkaXJuYW1lIHBhcmFtZXRlciB3YXMgbm90IHVzZWQuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOgotCU5ldyBmaWVsZHMgYHN1Y2Nlc3NvcicgYW5kIGBkZWNpZGVkJyBmb3Igb28sIGxhenkKLQltZXNzYWdlIGhhbmRsaW5nIGltcGxlbWVudGF0aW9uLgotCi0JKiBkY2dldHRleHQuYzoKLQlBZG9wdCBmb3Igb28sIGxhenkgbWVzc2FnZSBoYW5kbGlpbmcuCi0gIAlOb3cgd2UgY2FuIGluaGVyaXQgdHJhbnNsYXRpb25zIGZyb20gbGVzcyBzcGVjaWZpYyBsb2NhbGVzLgotCShmaW5kX21zZyk6IE5ldyBmdW5jdGlvbi4KLQotCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6Ci0JQ29tcGxldGUgcmV3cml0ZS4gIEltcGxlbWVudCBvbywgbGF6eSBtZXNzYWdlIGhhbmRsaW5nIDotKS4KLSAgCVdlIG5vdyBoYXZlIGFuIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgYExBTkdVQUdFJyB3aXRoCi0gCWEgaGlnaGVyIHByaW9yaXR5IHRoYW4gTENfQUxMIGZvciB0aGUgTENfTUVTU0FHRSBsb2NhbGUuCi0gIAlIZXJlIHdlIGNhbiBzZXQgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucyBlYWNoCi0gCW9mIHRoZSBmb3JtIGBsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXScuCi0KLVNhdCBBdWcgIDUgMDk6NTU6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jICh1bmlzdGQuaCk6Ci0JSW5jbHVkZSB0byBnZXQgX1BDX1BBVEhfTUFYIGRlZmluZWQgb24gc3lzdGVtIGhhdmluZyBpdC4KLQotRnJpIEF1ZyAgNCAyMjo0MjowMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IEluY2x1ZGUgcHJvdG90eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFJlbW92ZSBgY29weWluZyBpbnN0ZWFkJyBtZXNzYWdlLgotCi1XZWQgQXVnICAyIDE4OjUyOjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJRCwgVEFHUyk6IERvIG5vdCB1c2UgJF4uCi0KLVR1ZSBBdWcgIDEgMjA6MDc6MTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKFRBR1MsIElEKTogVXNlICReIGFzIGNvbW1hbmQgYXJndW1lbnQuCi0JKFRBR1MpOiBHaXZlIGV0YWdzIC1vIG9wdGlvbiB0IHdyaXRlIHRvIGN1cnJlbnQgZGlyZWN0b3J5LAotIAlub3QgJChzcmNkaXIpLgotCShJRCk6IFVzZSAkKHNyY2RpcikgaW5zdGVhZCBvcyAkKHRvcF9zcmNkaXIpL3NyYy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIElELgotCi1TdW4gSnVsIDMwIDExOjUxOjQ2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChnbnVsb2NhbGVkaXIpOgotCU5ldyB2YXJpYWJsZSwgYWx3YXlzIHVzaW5nIHNoYXJlLyBmb3IgZGF0YSBkaXJlY3RvcnkuCi0JKERFRlMpOiBBZGQgR05VTE9DQUxFRElSLCB1c2VkIGluIGZpbmRkb21haW4uYy4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZGVmYXVsdF9kaXJuYW1lKToKLQlTZXQgdG8gR05VTE9DQUxFRElSLCBiZWNhdXNlIGl0IGFsd2F5cyBoYXMgdG8gcG9pbnQKLQl0byB0aGUgZGlyZWN0b3J5IHdoZXJlIEdOVSBnZXR0ZXh0IExpYnJhcnkgd3JpdGVzIGl0IHRvLgotCi0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik6Ci0JVW5kZWZpbmUgbWFjcm9zIGJlZm9yZSBmdW5jdGlvbiBkZWZpbml0aW9uLgotCi1TYXQgSnVsIDIyIDAxOjEwOjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaCAoX0xJQklOVExfSCk6Ci0JUHJvdGVjdCBkZWZpbml0aW9uIGluIGNhc2Ugd2hlcmUgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGFzCi0JbGliZ2V0dGV4dC5oIG9uIFNvbGFyaXMgbWFjaGluZXMuICBBZGQgY29tbWVudCBhYm91dCB0aGlzLgotCi1XZWQgSnVsIDE5IDAyOjM2OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGludGwtY29tcGF0LmMgKHRleHRkb21haW4pOiBDb3JyZWN0IHR5cG8uCi0KLVdlZCBKdWwgMTkgMDE6NTE6MzUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKGRjZ2V0dGV4dCk6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX19kY2dldHRleHQuCi0KLQkqIGRnZXR0ZXh0LmMgKGRnZXR0ZXh0KTogTm93IGNhbGxlZCBfX2RnZXR0ZXh0IGFuZCBjYWxscwotIAlfX2RjZ2V0dGV4dC4KLQotCSogZ2V0dGV4dC5jIChnZXR0ZXh0KToKLQlGdW5jdGlvbiBub3cgY2FsbGVkIF9fZ2V0dGV4dCBhbmQgY2FsbHMgX19kZ2V0dGV4dC4KLQotCSogdGV4dGRvbWFpbi5jICh0ZXh0ZG9tYWluKTogRnVuY3Rpb24gbm93IGNhbGxlZCBfX3RleHRkb21haW4uCi0KLQkqIGJpbmR0ZXh0ZG9tLmMgKGJpbmR0ZXh0ZG9tYWluKTogRnVuY3Rpb24gbm93IGNhbGxlZAotIAlfX2JpbmR0ZXh0ZG9tYWluLgotCi0JKiBpbnRsLWNvbXBhdC5jOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEFkZCBpbnRsLWNvbXBhdC5jLgotCShPQkpFQ1RTKTogV2UgYWx3YXlzIGNvbXBpbGUgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgZnVuY3Rpb25zLgotICAJT0JKRUNUUyBjb250YWlucyBhbGwgb2JqZWN0cyBidXQgY2F0LWNvbXBhdC5vLCAuLi9wby9jYXQtaWYtdGJsLm8sCi0gCWFuZCBpbnRsLWNvbXBhdC5vLgotICAJKEdFVFRPQkpTKTogQ29udGFpbnMgbm93IG9ubHkgaW50bC1jb21wYXQuby4KLQotCSogbGliZ2V0dGV4dC5oOgotCVJlLWluY2x1ZGUgcHJvdGVjdGlvbiBtYXRjaGVzIGR1YWxpc3RpYyBjaGFyYWN0ZXIgb2YgbGliZ2V0dGV4dC5oLgotCUZvciBhbGwgZnVuY3Rpb25zIGluIEdOVSBnZXR0ZXh0IGxpYnJhcnkgZGVmaW5lIF9fIGNvdW50ZXIgcGFydC4KLQotCSogZmluZGRvbWFpbi5jIChzdHJjaHIpOiBEZWZpbmUgYXMgaW5kZXggaWYgbm90IGZvdW5kIGluIEMgbGlicmFyeS4KLQkoX25sX2ZpbmRfZG9tYWluKTogRm9yIHJlbGF0aXZlIHBhdGhzIHBhc3RlIC8gaW4gYmV0d2Vlbi4KLQotVHVlIEp1bCAxOCAxNjozNzo0NSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzogQWRkIGluY2x1c2lvbiBvZiBzeXMvdHlwZXMuaC4KLQotCSogeG9wZW4tbXNnLnNlZDogRml4IGJ1ZyB3aXRoIGBtc2dzdHIgIiInIGxpbmVzLgotCUEgbGl0dGxlIGJpdCBiZXR0ZXIgY29tbWVudHMuCi0KLVR1ZSBKdWwgMTggMDE6MTg6MjcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46Ci0JcG8tbW9kZS5lbCwgbWFrZWxpbmtzLCBjb21iaW5lLXNoIGFyZSBub3cgZm91bmQgaW4gLi4vbWlzYy4KLQotCSogcG8tbW9kZS5lbCwgbWFrZWxpbmtzLCBjb21iaW5lLXNoLCBlbGlzcC1jb21wOgotCU1vdmVkIHRvIC4uL21pc2MvLgotCi0JKiBsaWJnZXR0ZXh0LmgsIGdldHRleHRQLmgsIGdldHRleHQuaDogVW5pZm9ybSB0ZXN0IGZvciBfX1NURENfXy4KLQotU3VuIEp1bCAxNiAyMjozMzowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCwgSU5TVEFMTF9EQVRBKTogTmV3IHZhcmlhYmxlcy4KLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBJbnN0YWxsL3VuaW5zdGFsbCAuZWxjIGZpbGUuCi0KLQkqIHBvLW1vZGUuZWwgKEluc3RhbGxhdGlvbiBjb21tZW50KToKLQlBZGQgLnBveCBhcyBwb3NzaWJsZSBleHRlbnNpb24gb2YgLnBvIGZpbGVzLgotCi1TdW4gSnVsIDE2IDEzOjIzOjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGVsaXNwLWNvbXA6IENvbXBsZXRlIG5ldyB2ZXJzaW9uIGJ5IEZyYW5jLG9pczogVGhpcyBkb2VzIG5vdAotIAlmYWlsIHdoZW4gbm90IGNvbXBpbGluZyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLQotU3VuIEp1bCAxNiAwMDoxMjoxNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKToKLQlVc2UgJChNQUtFKSBpbnN0ZWFkIG9mIG1ha2UgZm9yIHJlY3Vyc2l2ZSBtYWtlLgotCi0JKiBNYWtlZmlsZS5pbiAoLmVsLmVsYyk6IFVzZSAkKFNIRUxMKSBpbnN0ZWFkIG9mIC9iaW4vc2guCi0JKGluc3RhbGwtZXhlYyk6IEFkZCBtaXNzaW5nIGR1bW15IGdvYWwuCi0JKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogQCBpbiBtdWx0aS1saW5lIHNoZWxsIGNvbW1hbmQgYXQKLSAJYmVnaW5uaW5nLCBub3QgaW4gZnJvbnQgb2YgZWNoby4gIFJlcG9ydGVkIGJ5IEVyaWMgQmFja3VzLgotCi1TYXQgSnVsIDE1IDAwOjIxOjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOgotCVJlbmFtZSBsaWJnZXR0ZXh0LnBlcmwgdG8gZ2V0dGV4dC5wZXJsIHRvIGZpdCBpbiAxNCBjaGFycwotCWZpbGUgc3lzdGVtcy4KLQotCSogZ2V0dGV4dC5wZXJsOgotIAlSZW5hbWUgdG8gZ2V0dGV4dC5wZXJsIHRvIGZpdCBpbiAxNCBjaGFycyBmaWxlIHN5c3RlbXMuCi0KLVRodSBKdWwgMTMgMjM6MTc6MjAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogY2F0LWNvbXBhdC5jOiBJZiAhU1REQ19IRUFERVJTIHRyeSB0byBpbmNsdWRlIG1hbGxvYy5oLgotCi1UaHUgSnVsIDEzIDIwOjU1OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW46IFByZXR0eSBwcmludGluZy4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKLQlDb3JyZWN0IGJ1Z3Mgd2l0aCBoYW5kbGluZyBzdWJzdGl0dXRlIGZsYWdzIGluIGJyYW5jaGVzLgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6Ci0JT2xkIEsmUiBjb21waWxlcnMgZG9uJ3QgdW5kZXIgc3RhbmQgYHVuc2lnbmVkIGNoYXInLgotCi0JKiBnZXR0ZXh0LmggKG5sc191aW50MzIpOgotCVNvbWUgb2xkIEsmUiBjb21waWxlcnMgKGVnIEhQKSBkb24ndCB1bmRlcnN0YW5kIGB1bnNpZ25lZCBpbnQnLgotCi0JKiBjYXQtY29tcGF0LmMgKG1zZ190b19jYXRfaWQpOiBEZS1BTlNJLWZ5IHByb3RvdHlwZXMuCi0KLVRodSBKdWwgMTMgMDE6MzQ6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKEVMQ0ZJTEVTKTogTmV3IHZhcmlhYmxlLgotCShESVNURklMRVMpOiBBZGQgZWxpc3AtY29tcC4KLQlBZGQgaW1wbGljaXQgcnVsZSBmb3IgLmVsIC0+IC5lbGMgY29tcGlsYXRpb24uCi0JKGluc3RhbGwtZGF0YSk6IGluc3RhbGwgJEVMQ0ZJTEVTCi0JKGNsZWFuKTogcmVuYW1lZCBwby10by10YmwgYW5kIHBvLXRvLW1zZyB0byBwbzJ0YmwgYW5kIHBvMm1zZyByZXNwLgotCi0JKiBlbGlzcC1jb21wOiBJbml0aWFsIHJldmlzaW9uCi0KLVdlZCBKdWwgMTIgMTY6MTQ6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46Ci0JY2F0LWlkLXRibC5jIGlzIG5vdyBmb3VuZCBpbiBwby8uICBUaGlzIGVuYWJsZXMgdXMgdG8gdXNlIGFuIGlkZW50aWNhbAotCWludGwvIGRpcmVjdG9yeSBpbiBhbGwgcGFja2FnZXMuCi0KLQkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBoYXNoaW5nIGRvZXMgbm90IHdvcmsgZm9yIHRhYmxlIHNpemUgPD0gMi4KLQotCSogdGV4dGRvbWFpbi5jOiBmaXggdHlwbyAoI2lmIGRlZiAtPiAjaWYgZGVmaW5lZCkKLQotVHVlIEp1bCAxMSAxODo0NDo0MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtY2F0LWlkKTogdXNlIHRvcF9zcmNkaXIgdG8gYWRkcmVzcyBzb3VyY2UgZmlsZXMKLQkoRElTVEZJTEVTLGRpc3RjbGVhbik6IG1vdmUgdHVwZGF0ZS5wZXJsIHRvIHNyYy8KLQotCSogcG8tdG8tdGJsLnNlZC5pbjoKLQlhZGQgYWRkaXRpb25hbCBqdW1wIHRvIGNsZWFyIGNoYW5nZSBmbGFnIHRvIHJlY29nbml6ZSBtdWx0aWxpbmUgc3RyaW5ncwotCi1UdWUgSnVsIDExIDAxOjMyOjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHRleHRkb21haW4uYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmggYW5kIHN0cmluZy5oLgotCi0JKiBsb2FkbXNnY2F0LmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFByb3RlY3QgaW5jbHVzaW9uIG9mIGxvY2FsZS5oLgotCUFsbG93IHVzZSBpbiBDKysgcHJvZ3JhbXMuCi0JRGVmaW5lIE5VTEwgaXMgbm90IGhhcHBlbmVkIGFscmVhZHkuCi0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBzaGlwIHBvLXRvLXRibC5zZWQuaW4gaW5zdGVhZCBvZgotCXBvLXRvLXRibC5zZWQuCi0JKGRpc3RjbGVhbik6IHJlbW92ZSBwby10by10Ymwuc2VkIGFuZCB0dXBkYXRlLnBlcmwuCi0KLQkqIHR1cGRhdGUucGVybC5pbjogU3Vic3RpdHV0ZSBQZXJsIHBhdGggZXZlbiBpbiBleGVjIGxpbmUuCi0JRG9uJ3QgaW5jbHVkZSBlbnRyaWVzIHdpdGhvdXQgdHJhbnNsYXRpb24gZnJvbSBvbGQgLnBvIGZpbGUuCi0KLVR1ZSBKdWwgIDQgMDA6NDE6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiB1c2UgIlVwZGF0ZWQ6ICIgaW4gbXNnaWQgIiIuCi0KLQkqIGNhdC1jb21wYXQuYzogRml4IHR5cG8gKExPQ0FMRElSIC0+IExPQ0FMRURJUikuCi0gCURlZmluZSBnZXRlbnYgaWYgIV9fU1REQ19fLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBQcm90ZWN0IHN0ZGxpYi5oIGFuZCBzdHJpbmcuaCBpbmNsdXNpb24uCi0gCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KLQotCSogZmluZGRvbWFpbi5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KLSAJRGVmaW5lIGZyZWUgaWYgIV9fU1REQ19fLgotCi0JKiBjYXQtY29tcGF0LmM6IENoYW5nZSBERUZfTVNHX0RPTV9ESVIgdG8gTE9DQUxFRElSLgotCi1Nb24gSnVsICAzIDIzOjU2OjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOiBVc2UgTE9DQUxFRElSIGluc3RlYWQgb2YgREVGX01TR19ET01fRElSLgotCVJlbW92ZSB1bm5lZWRlZCAkKHNyY2RpcikgZnJvbSBNYWtlZmlsZS5pbiBkZXBlbmRlbmN5LgotCi0JKiBtYWtlbGlua3M6IEFkZCBjb3B5cmlnaHQgYW5kIHNob3J0IGRlc2NyaXB0aW9uLgotCi0JKiBwby1tb2RlLmVsOiBMYXN0IHZlcnNpb24gZm9yIDAuNy4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBGaXggZGllIG1lc3NhZ2UuCi0KLQkqIGRjZ2V0dGV4dC5jOiBQcm90ZWN0IGluY2x1ZGUgb2Ygc3RyaW5nLmguCi0KLQkqIGdldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0ZGxpYi5oIGFuZCBmdXJ0aGVyIHRyaWVzIHRvIGdldCBOVUxMLgotCi0JKiBmaW5kZG9tYWluLmM6IFNvbWUgY29ycmVjdGlvbnMgaW4gaW5jbHVkZXMuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IFBydW5lIGxpc3QgY29ycmVjdCBwYXRoIHRvIE1ha2VmaWxlLmluLgotCi0JKiBwby10by10Ymwuc2VkOiBBZG9wdCBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLVN1biBKdWwgIDIgMjM6NTU6MDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBDb21wbGV0ZSByZXdyaXRlIGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi1TdW4gSnVsICAyIDAyOjA2OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuICBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIGNvZGUKLQluZWVkZWQgdG8gaW50ZXJuYXRpb25hbGl6ZSBvd24gcGFja2FnZXMuICBJdCBwcm92aWRlcyBmdW5jdGlvbnMKLQl3aGljaCBhbGxvdyB0byB1c2UgdGhlIFgvT3BlbiBjYXRnZXRzIGZ1bmN0aW9uIHdpdGggYW4gaW50ZXJmYWNlCi0JbGlrZSB0aGUgVW5pZm9ydW0gZ2V0dGV4dCBmdW5jdGlvbi4gIEZvciBzeXN0ZW0gd2hpY2ggZG9lcyBub3QKLQloYXZlIG5laXRoZXIgb2YgdGhvc2UgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4KZGlmZiAtLWdpdCBhL2ludGwvTWFrZWZpbGUuaW4gYi9pbnRsL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY0N2RlLi4wMDAwMDAwCi0tLSBhL2ludGwvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGluIEdOVSBOTFMgVXRpbGl0aWVzLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi10b3BfYnVpbGRkaXIgPSAuLgotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWxpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gQGRhdGFkaXJAL2dldHRleHQvaW50bAotYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpOi4KLXN1YmRpciA9IGludGwKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotbCA9IEBsQAotCi1BUiA9IGFyCi1DQyA9IEBDQ0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLVJBTkxJQiA9IEBSQU5MSUJACi0KLURFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ER05VTE9DQUxFRElSPVwiJChnbnVsb2NhbGVkaXIpXCIgXAotLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIEBERUZTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1IRUFERVJTID0gJChDT01IRFJTKSBsaWJnZXR0ZXh0LmggbG9hZGluZm8uaAotQ09NSERSUyA9IGdldHRleHQuaCBnZXR0ZXh0UC5oIGhhc2gtc3RyaW5nLmgKLVNPVVJDRVMgPSAkKENPTVNSQ1MpIGludGwtY29tcGF0LmMgY2F0LWNvbXBhdC5jCi1DT01TUkNTID0gYmluZHRleHRkb20uYyBkY2dldHRleHQuYyBkZ2V0dGV4dC5jIGdldHRleHQuYyBcCi1maW5kZG9tYWluLmMgbG9hZG1zZ2NhdC5jIGxvY2FsZWFsaWFzLmMgdGV4dGRvbWFpbi5jIGwxMG5mbGlzdC5jIFwKLWV4cGxvZGVuYW1lLmMKLU9CSkVDVFMgPSBASU5UTE9CSlNAIGJpbmR0ZXh0ZG9tLiRsbyBkY2dldHRleHQuJGxvIGRnZXR0ZXh0LiRsbyBnZXR0ZXh0LiRsbyBcCi1maW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gdGV4dGRvbWFpbi4kbG8gbDEwbmZsaXN0LiRsbyBcCi1leHBsb2RlbmFtZS4kbG8KLUNBVE9CSlMgPSBjYXQtY29tcGF0LiRsbyAuLi9wby9jYXQtaWQtdGJsLiRsbwotR0VUVE9CSlMgPSBpbnRsLWNvbXBhdC4kbG8KLURJU1RGSUxFUy5jb21tb24gPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4gbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIFwKLXhvcGVuLW1zZy5zZWQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi1ESVNURklMRVMubm9ybWFsID0gVkVSU0lPTgotRElTVEZJTEVTLmdldHRleHQgPSBsaWJpbnRsLmdsaWJjIGludGxoLmluc3QuaW4KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAubG8KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQ8Ci0KLUlOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpCi0KLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKLQotYWxsLXllczogbGliaW50bC4kbGEgaW50bGguaW5zdAotYWxsLW5vOgotaW5zdGFsbC1pbmZvOgotCi1saWJpbnRsLmE6ICQoT0JKRUNUUykKLQlybSAtZiAkQAotCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0JJChSQU5MSUIpICRACi0KLWxpYmludGwubGE6ICQoT0JKRUNUUykKLQkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChPQkpFQ1RTKSBcCi0JCSAgIC12ZXJzaW9uLWluZm8gMTowIC1ycGF0aCAkKGxpYmRpcikKLQotLi4vcG8vY2F0LWlkLXRibC4kbG86IC4uL3BvL2NhdC1pZC10YmwuYyAkKHRvcF9zcmNkaXIpL3BvLyQoUEFDS0FHRSkucG90Ci0JY2QgLi4vcG8gJiYgJChNQUtFKSBjYXQtaWQtdGJsLiRsbwotCi1jaGVjazogYWxsCi0KLSMgVGhpcyBpbnN0YWxsYXRpb24gZ29hbCBpcyBvbmx5IHVzZWQgaW4gR05VIGdldHRleHQuICBQYWNrYWdlcyB3aGljaAotIyBvbmx5IHVzZSB0aGUgbGlicmFyeSBzaG91bGQgdXNlIGluc3RhbGwgaW5zdGVhZC4KLQotIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0jIHN5c3RlbSB3aGljaCBoYXMgdGhlIGdldHRleHQoKSBmdW5jdGlvbiBpbiBpdHMgQyBsaWJyYXJ5IG9yIGluIGEKLSMgc2VwYXJhdGUgbGlicmFyeSBvciB1c2UgdGhlIGNhdGdldHMgaW50ZXJmYWNlLiAgQSBzcGVjaWFsIGNhc2UgaXMKLSMgd2hlcmUgY29uZmlndXJlIGZvdW5kIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgR05VIGdldHRleHQgbGlicmFyeS4KLSMgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmUgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlCi0jIHBhY2thZ2UsIHlvdSBoYXZlIHRvIHVzZSBgY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Jy4KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCIgXAotCSAgICYmIHRlc3QgJ0BJTlRMT0JKU0AnID0gJyQoR0VUVE9CSlMpJzsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIGludGxoLmluc3QgJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmEgJChsaWJkaXIpL2xpYmludGwuYTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBWRVJTSU9OICQoZ2V0dGV4dHNyY2RpcikvVkVSU0lPTjsgXAotCSAgZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIHJtIC1mICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JZG9uZQotCi1pbmZvIGR2aToKLQotJChPQkpFQ1RTKTogY29uZmlnLmggbGliZ2V0dGV4dC5oCi1iaW5kdGV4dGRvbS4kbG8gZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGxvYWRpbmZvLmgKLWRjZ2V0dGV4dC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGhhc2gtc3RyaW5nLmggbG9hZGluZm8uaAotCi10YWdzOiBUQUdTCi0KLVRBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKLQotaWQ6IElECi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKLQotCi1tb3N0bHljbGVhbjoKLQlybSAtZiAqLmEgKi5vICoubG8gY29yZSBjb3JlLioKLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTIHBvMm1zZy5zZWQgcG8ydGJsLnNlZCBsaWJpbnRsLmggY29uZmlnLmxvZwotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotCi0jIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQotIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogTWFrZWZpbGUgJChESVNURklMRVMpCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSBnZXR0ZXh0OyB0aGVuIFwKLQkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAotCWVsc2UgXAotCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMubm9ybWFsKSI7IFwKLQlmaTsgXAotCWZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbikgJCRhZGRpdGlvbmFsOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi1kaXN0LWxpYmM6Ci0JdGFyIHpjdmYgaW50bC1nbGliYy50YXIuZ3ogJChDT01TUkNTKSAkKENPTUhEUlMpIGxpYmludGwuaC5nbGliYwotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGhlIGRlcGVuZGVuY3kgZm9yIGludGxoLmluc3QgaXMgZGlmZmVyZW50IGluIGdldHRleHQgYW5kIGFsbCBvdGhlcgotIyBwYWNrYWdlcy4gIEJlY2F1c2Ugd2UgY2Fubm90IHlvdSBHTlUgbWFrZSBmZWF0dXJlcyB3ZSBoYXZlIHRvIHNvbHZlCi0jIHRoZSBwcm9ibGVtIHdoaWxlIHJld3JpdGluZyBNYWtlZmlsZS5pbi4KLUBHVF9ZRVNAaW50bGguaW5zdDogaW50bGguaW5zdC5pbiAuLi9jb25maWcuc3RhdHVzCi1AR1RfWUVTQAljZCAuLiBcCi1AR1RfWUVTQAkmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSBcCi1AR1RfWUVTQAkgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotQEdUX05PQC5QSE9OWTogaW50bGguaW5zdAotQEdUX05PQGludGxoLmluc3Q6Ci0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2ludGwvYWNjb25maWcuaCBiL2ludGwvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmODFmOC4uMDAwMDAwMAotLS0gYS9pbnRsL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9pbnRsL2FjbG9jYWwubTQgYi9pbnRsL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTQzOWYuLjAwMDAwMDAKLS0tIGEvaW50bC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4zCi0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fUFJPR19JTlNUQUxMLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi1BQ19TVUJTVChJTlNUQUxMX1NDUklQVClkbmwKLV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMpCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFkpCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMpCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9pbnRsL2JpbmR0ZXh0ZG9tLmMgYi9pbnRsL2JpbmR0ZXh0ZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2I4ZDkuLjAwMDAwMDAKLS0tIGEvaW50bC9iaW5kdGV4dGRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgQklORFRFWFRET01BSU4gYmluZHRleHRkb21haW5fXwotI2VuZGlmCi0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotY2hhciAqCi1CSU5EVEVYVERPTUFJTiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0KLSAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotCS8qIFdlIGZvdW5kIGl0ISAgKi8KLQlicmVhazsKLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLQl7Ci0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgYmluZGluZyA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChkaXJuYW1lID09IE5VTEwpCi0gICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotICAgIHJldHVybiBiaW5kaW5nID09IE5VTEwgPyAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lIDogYmluZGluZy0+ZGlybmFtZTsKLQotICBpZiAoYmluZGluZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotCSBvbGQgYmluZGluZy4gICovCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBiaW5kaW5nLT5kaXJuYW1lKSAhPSAwKQotCXsKLQkgIGNoYXIgKm5ld19kaXJuYW1lOwotCi0JICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCSAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0JICBlbHNlCi0JICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkgICAgICBuZXdfZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotI2Vsc2UKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICAgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JICAgICAgbWVtY3B5IChuZXdfZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCSAgICB9Ci0KLQkgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0JICAgIGZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotCi0JICBiaW5kaW5nLT5kaXJuYW1lID0gbmV3X2Rpcm5hbWU7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuICAqLwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHN0cnVjdCBiaW5kaW5nICpuZXdfYmluZGluZyA9Ci0JKHN0cnVjdCBiaW5kaW5nICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3X2JpbmRpbmcpKTsKLQotICAgICAgaWYgKG5ld19iaW5kaW5nID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAgIGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0gICAgICBlbHNlCi0JewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOwotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLQkgIGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOwotI2VuZGlmCi0JfQotCi0gICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCi0gICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKLQl7Ci0JICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAotCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCi0JICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OwotCi0JICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7Ci0JICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7Ci0JfQotCi0gICAgICBiaW5kaW5nID0gbmV3X2JpbmRpbmc7Ci0gICAgfQotCi0gIHJldHVybiBiaW5kaW5nLT5kaXJuYW1lOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2NhdC1jb21wYXQuYyBiL2ludGwvY2F0LWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkOTAxLi4wMDAwMDAwCi0tLSBhL2ludGwvY2F0LWNvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIENvbXBhdGliaWxpdHkgY29kZSBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTkxfVFlQRVNfSAotIyBpbmNsdWRlIDxubF90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBUaGUgY2F0YWxvZyBkZXNjcmlwdG9yLiAgKi8KLXN0YXRpYyBubF9jYXRkIGNhdGFsb2cgPSAobmxfY2F0ZCkgLTE7Ci0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2NhdGFsb2dfbmFtZVtdID0gIm1lc3NhZ2VzIjsKLQotLyogTmFtZSBvZiBjdXJyZW50bHkgdXNlZCBjYXRhbG9nLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nX25hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKLQotLyogR2V0IElEIGZvciBnaXZlbiBzdHJpbmcuICBJZiBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KLXN0YXRpYyBpbnQgbXNnX3RvX2NhdF9pZCBQQVJBTVMgKChjb25zdCBjaGFyICptc2cpKTsKLQotLyogU3Vic3RpdHV0aW9uIGZvciBzeXN0ZW1zIGxhY2tpbmcgdGhpcyBmdW5jdGlvbiBpbiB0aGVpciBDIGxpYnJhcnkuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jZW5kaWYKLQotCi0vKiBTZXQgY3VycmVudGx5IHVzZWQgZG9tYWluL2NhdGFsb2cuICAqLwotY2hhciAqCi10ZXh0ZG9tYWluIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBubF9jYXRkIG5ld19jYXRhbG9nOwotICBjaGFyICpuZXdfbmFtZTsKLSAgc2l6ZV90IG5ld19uYW1lX2xlbjsKLSAgY2hhciAqbGFuZzsKLQotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTIFwKLSAgICAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgbGFuZyA9IHNldGxvY2FsZSAoTENfTUVTU0FHRVMsIE5VTEwpOwotI2Vsc2UKLSAgbGFuZyA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBsYW5nID0gZ2V0ZW52ICgiTENfTUVTU0FHRVMiKTsKLSAgICAgIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotCWxhbmcgPSBnZXRlbnYgKCJMQU5HIik7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotICAgIGxhbmcgPSAiQyI7Ci0KLSAgLyogU2VlIHdoZXRoZXIgbmFtZSBvZiBjdXJyZW50bHkgdXNlZCBkb21haW4gaXMgYXNrZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICBkb21haW5uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgKi8KLSAgbmV3X25hbWVfbGVuID0gc2l6ZW9mIChMT0NBTEVESVIpIC0gMSArIDEgKyBzdHJsZW4gKGxhbmcpCi0JCSArIHNpemVvZiAoIi9MQ19NRVNTQUdFUy8iKSAtIDEgKyBzaXplb2YgKFBBQ0tBR0UpIC0gMQotCQkgKyBzaXplb2YgKCIuY2F0Iik7Ci0KLSAgbmV3X25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKG5ld19uYW1lX2xlbik7Ci0gIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cmNweSAobmV3X25hbWUsIFBBQ0tBR0UpOwotICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKLQotICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotICAgIHsKLSAgICAgIC8qIE5MU1BBVEggc2VhcmNoIGRpZG4ndCB3b3JrLCB0cnkgYWJzb2x1dGUgcGF0aCAqLwotICAgICAgc3ByaW50ZiAobmV3X25hbWUsICIlcy8lcy9MQ19NRVNTQUdFUy8lcy5jYXQiLCBMT0NBTEVESVIsIGxhbmcsCi0JICAgICAgIFBBQ0tBR0UpOwotICAgICAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgICAgIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0JewotCSAgZnJlZSAobmV3X25hbWUpOwotCSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLQl9Ci0gICAgfQotCi0gIC8qIENsb3NlIG9sZCBjYXRhbG9nLiAgKi8KLSAgaWYgKGNhdGFsb2cgIT0gKG5sX2NhdGQpIC0xKQotICAgIGNhdGNsb3NlIChjYXRhbG9nKTsKLSAgaWYgKGNhdGFsb2dfbmFtZSAhPSBkZWZhdWx0X2NhdGFsb2dfbmFtZSkKLSAgICBmcmVlICgoY2hhciAqKSBjYXRhbG9nX25hbWUpOwotCi0gIGNhdGFsb2cgPSBuZXdfY2F0YWxvZzsKLSAgY2F0YWxvZ19uYW1lID0gbmV3X25hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLX0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSNpZiBIQVZFX1NFVEVOViB8fCBIQVZFX1BVVEVOVgotICBjaGFyICpvbGRfdmFsLCAqbmV3X3ZhbCwgKmNwOwotICBzaXplX3QgbmV3X3ZhbF9sZW47Ci0KLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgaGVyZSBidXQgdG8gYmUgY29tcGF0aWJsZSBkbyBpdC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgSWYgd2UgdXNlIHNldGVudiB3ZSBkb24ndCBuZWVkCi0gICAgIHRoZSBmaXJzdCBieXRzIGZvciBOTFNQQVRIPSwgYnV0IHdoeSBjb21wbGljYXRlIHRoZSBjb2RlIGZvciB0aGlzCi0gICAgIHBlYW51dHMuICAqLwotICBuZXdfdmFsX2xlbiA9IHNpemVvZiAoIk5MU1BBVEg9IikgLSAxICsgc3RybGVuIChkaXJuYW1lKQotCQkrIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLQotICBvbGRfdmFsID0gZ2V0ZW52ICgiTkxTUEFUSCIpOwotICBpZiAob2xkX3ZhbCA9PSBOVUxMIHx8IG9sZF92YWxbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBvbGRfdmFsID0gTlVMTDsKLSAgICAgIG5ld192YWxfbGVuICs9IDEgKyBzaXplb2YgKExPQ0FMRURJUikgLSAxCi0JICAgICAgICAgICAgICsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotICAgIH0KLSAgZWxzZQotICAgIG5ld192YWxfbGVuICs9IHN0cmxlbiAob2xkX3ZhbCk7Ci0KLSAgbmV3X3ZhbCA9IChjaGFyICopIG1hbGxvYyAobmV3X3ZhbF9sZW4pOwotICBpZiAobmV3X3ZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIGNwID0gbmV3X3ZhbDsKLSMgZWxzZQotICBjcCA9IHN0cGNweSAobmV3X3ZhbCwgIk5MU1BBVEg9Iik7Ci0jIGVuZGlmCi0KLSAgY3AgPSBzdHBjcHkgKGNwLCBkaXJuYW1lKTsKLSAgY3AgPSBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdDoiKTsKLQotICBpZiAob2xkX3ZhbCA9PSBOVUxMKQotICAgIHsKLSMgaWYgX19TVERDX18KLSAgICAgIHN0cGNweSAoY3AsIExPQ0FMRURJUiAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbHNlCi0KLSAgICAgIGNwID0gc3RwY3B5IChjcCwgTE9DQUxFRElSKTsKLSAgICAgIHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0jIGVuZGlmCi0gICAgfQotICBlbHNlCi0gICAgc3RwY3B5IChjcCwgb2xkX3ZhbCk7Ci0KLSMgaWYgSEFWRV9TRVRFTlYKLSAgc2V0ZW52ICgiTkxTUEFUSCIsIG5ld192YWwsIDEpOwotICBmcmVlIChuZXdfdmFsKTsKLSMgZWxzZQotICBwdXRlbnYgKG5ld192YWwpOwotICAvKiBEbyAqbm90KiBmcmVlIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3ZSBqdXN0IGVudGVyZWQuICBJdCBpcyB1c2VkCi0gICAgIGZyb20gbm93IG9uLiAgICovCi0jIGVuZGlmCi0KLSNlbmRpZgotCi0gIHJldHVybiAoY2hhciAqKSBkb21haW5uYW1lOwotfQotCi0jdW5kZWYgZ2V0dGV4dAotY2hhciAqCi1nZXR0ZXh0IChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IG1zZ2lkOwotCi0gIGlmIChtc2cgPT0gTlVMTCB8fCBjYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIC8qIEdldCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBjYXRhbG9nLiAgV2UgYWx3YXlzIHVzZSBzZXQgbnVtYmVyIDEuCi0gICAgIFRoZSBtZXNzYWdlIElEIGlzIGNvbXB1dGVkIGJ5IHRoZSBmdW5jdGlvbiBgbXNnX3RvX2NhdF9pZCcKLSAgICAgd2hpY2ggd29ya3Mgb24gdGhlIHRhYmxlIGdlbmVyYXRlZCBieSBgcG8tdG8tdGJsJy4gICovCi0gIG1zZ2lkID0gbXNnX3RvX2NhdF9pZCAobXNnKTsKLSAgaWYgKG1zZ2lkID09IC0xKQotICAgIHJldHVybiAoY2hhciAqKSBtc2c7Ci0KLSAgcmV0dXJuIGNhdGdldHMgKGNhdGFsb2csIDEsIG1zZ2lkLCAoY2hhciAqKSBtc2cpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHRhYmxlIGBfbXNnX3RibCcgd2hpY2ggaGFzIGBfbXNnX3RibF9sZW5ndGgnIGVudHJpZXMKLSAgIGZvciB0aGUgb25lIGVxdWFsIHRvIG1zZy4gIElmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgSUQuICBJbiBjYXNlIHdoZW4KLSAgIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50Ci1tc2dfdG9fY2F0X2lkIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IF9tc2dfdGJsX2xlbmd0aDsgKytjbnQpCi0gICAgaWYgKHN0cmNtcCAobXNnLCBfbXNnX3RibFtjbnRdLl9tc2cpID09IDApCi0gICAgICByZXR1cm4gX21zZ190YmxbY250XS5fbXNnX251bWJlcjsKLQotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWcuaW4gYi9pbnRsL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5MDQ5Yi4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaSBsaWJyYXJ5ICgtbGkpLiAgKi8KLSN1bmRlZiBIQVZFX0xJQkkKZGlmZiAtLWdpdCBhL2ludGwvY29uZmlndXJlIGIvaW50bC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0MWVlYTAuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1kZ2V0dGV4dC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTYyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTY6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MTc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgzMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkwMzogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI0OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjkzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwODI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwMzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNzY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQ0OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBIQVZFX0FMTE9DQV9ICi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS5vCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzA0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMzQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzg5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ4MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTMzOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjgxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3MTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE3MTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAxOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTY3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5NTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTU5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjY2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyNTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ1MzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDYzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDQ0AlJENDJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRubHNfY3ZfaGVhZGVyX2xpYmd0IgotYWNfZGVzdHM9IiRubHNfY3ZfaGVhZGVyX2ludGwiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZ3VyZS5pbiBiL2ludGwvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE5YzI0Li4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUFDX0lOSVQoZGdldHRleHQuYykKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1BTV9QUk9HX0lOU1RBTEwKLUNZX0dOVV9HRVRURVhUCi1BQ19MSU5LX0ZJTEVTKCRubHNfY3ZfaGVhZGVyX2xpYmd0LCAkbmxzX2N2X2hlYWRlcl9pbnRsKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9pbnRsL2RjZ2V0dGV4dC5jIGIvaW50bC9kY2dldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNmJmZC4uMDAwMDAwMAotLS0gYS9pbnRsL2RjZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY2dldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZm5kZWYgX19zZXRfZXJybm8KLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKLSMgZGVmaW5lIHN0cGNweSBfX3N0cGNweQotI2Vsc2UKLSMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKLWNoYXIgKmdldHdkICgpOwotIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKLSMgZWxzZQotY2hhciAqZ2V0Y3dkICgpOwotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KLSNkZWZpbmUgUEFUSF9JTkNSIDMyCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLwotLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCi0gICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKLSAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KLSNpZiBkZWZpbmVkKF9QT1NJWF9WRVJTSU9OKSB8fCAoZGVmaW5lZChIQVZFX0xJTUlUU19IKSAmJiAhZGVmaW5lZChfX0dOVUNfXykpCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCi0jIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKF9QQ19QQVRIX01BWCkKLSMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQotI2VuZGlmCi0KLS8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCi0jaWYgZGVmaW5lZChIQVZFX1NZU19QQVJBTV9IKSAmJiAhZGVmaW5lZChQQVRIX01BWCkgJiYgIWRlZmluZWQoTUFYUEFUSExFTikKLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBQQVRIX01BWCBNQVhQQVRITEVOCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAotIyBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCi0jZW5kaWYKLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gPSAibWVzc2FnZXMiOwotCi0vKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCi1jb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXSA9IEdOVUxPQ0FMRURJUjsKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMgY3JlYXRlZCBieSBiaW5kdGV4dGRvbWFpbigpCi0gICBjYWxscy4gICovCi1zdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjaGFyICpmaW5kX21zZyBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICptc2dpZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgUEFSQU1TICgoaW50IGNhdGVnb3J5KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgUEFSQU1TICgoaW50IGNhdGVnb3J5LAotCQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkpOwotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWNoYXIgKgotRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7Ci0gIGNoYXIgKmRpcm5hbWUsICp4ZG9tYWlubmFtZTsKLSAgY2hhciAqc2luZ2xlX2xvY2FsZTsKLSAgY2hhciAqcmV0dmFsOwotICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLSAgaWYgKG1zZ2lkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgRE9NQUlOTkFNRSBpcyBOVUxMLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVmYXVsdCBkb21haW4uICBJZgotICAgICBDQVRFR09SWSBpcyBub3QgTENfTUVTU0FHRVMgdGhpcyBtaWdodCBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dCB0aGUKLSAgICAgZGVmaW50aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgZWxzZSBpZiAoYmluZGluZy0+ZGlybmFtZVswXSA9PSAnLycpCi0gICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgcmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUgbm93LiAgKi8KLSAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOwotICAgICAgc2l6ZV90IHBhdGhfbWF4OwotICAgICAgY2hhciAqcmV0OwotCi0gICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCkgUEFUSF9NQVg7Ci0gICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0gICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCi0gICAgICBfX3NldF9lcnJubyAoMCk7Ci0gICAgICB3aGlsZSAoKHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpKSA9PSBOVUxMICYmIGVycm5vID09IEVSQU5HRSkKLQl7Ci0JICBwYXRoX21heCArPSBQQVRIX0lOQ1I7Ci0JICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0JICBfX3NldF9lcnJubyAoMCk7Ci0JfQotCi0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY2Fubm90IGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIERvbid0IHNpZ25hbCBhbgotCSAgICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0gICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCi0gIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKLSAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLQotICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCi0JCQkJICsgc3RybGVuIChkb21haW5uYW1lKSArIDUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLQotICBzdHBjcHkgKHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotCQkgIGRvbWFpbm5hbWUpLAotCSAgIi5tbyIpOwotCi0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCi0gIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBzaW5nbGVfbG9jYWxlKTsKLQotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGdpdmVuIHN0cmluZy4gIFRoaXMgaXMgYSBsb29wIGJlY2F1c2Ugd2UgcGVyaGFwcwotICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGggdHJhbnNsYXRpb24uICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0gICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQotCSsrY2F0ZWdvcnl2YWx1ZTsKLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0JewotCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0JICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgotCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0JICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLQkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOwotCSAgKmNwID0gJ1wwJzsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0JewotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLQotICAgICAgLyogRmluZCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIG1hdGNoaW5nIHRoZQotCSBET01BSU5OQU1FIGFuZCBDQVRFR09SWS4gICovCi0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lKTsKLQotICAgICAgaWYgKGRvbWFpbiAhPSBOVUxMKQotCXsKLQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4sIG1zZ2lkKTsKLQotCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGNudDsKLQotCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQkJewotCQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBtc2dpZCk7Ci0KLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgICAgIHJldHVybiByZXR2YWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2RjZ2V0dGV4dCwgZGNnZXR0ZXh0KTsKLSNlbmRpZgotCi0KLXN0YXRpYyBjaGFyICoKLWZpbmRfbXNnIChkb21haW5fZmlsZSwgbXNnaWQpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgc2l6ZV90IHRvcCwgYWN0LCBib3R0b207Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSk7Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotCi0gIC8qIExvY2F0ZSB0aGUgTVNHSUQgYW5kIGl0cyB0cmFuc2xhdGlvbi4gICovCi0gIGlmIChkb21haW4tPmhhc2hfc2l6ZSA+IDIgJiYgZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCi0gICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0gICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotICAgICAgbmxzX3VpbnQzMiBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0KLSAgICAgIGlmIChuc3RyID09IDApCi0JLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICYmIHN0cmNtcCAobXNnaWQsCi0JCSAgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpID09IDApCi0JcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKLQkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLQkgIGVsc2UKLQkgICAgaWR4ICs9IGluY3I7Ci0KLQkgIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQkgIGlmIChuc3RyID09IDApCi0JICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgotCSAgICAgICYmIHN0cmNtcCAobXNnaWQsCi0JCQkgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpCi0JICAgICAgICAgPT0gMCkKLQkgICAgcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YQotCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCX0KLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogTm93IHdlIHRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQKLSAgICAgYXJyYXkgb2YgbWVzc2FnZXMuICAqLwotICBib3R0b20gPSAwOwotICB0b3AgPSBkb21haW4tPm5zdHJpbmdzOwotICB3aGlsZSAoYm90dG9tIDwgdG9wKQotICAgIHsKLSAgICAgIGludCBjbXBfdmFsOwotCi0gICAgICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0gICAgICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgZG9tYWluLT5kYXRhCi0JCQkgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpOwotICAgICAgaWYgKGNtcF92YWwgPCAwKQotCXRvcCA9IGFjdDsKLSAgICAgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQotCWJvdHRvbSA9IGFjdCArIDE7Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIC8qIElmIGFuIHRyYW5zbGF0aW9uIGlzIGZvdW5kIHJldHVybiB0aGlzLiAgKi8KLSAgcmV0dXJuIGJvdHRvbSA+PSB0b3AgPyBOVUxMIDogKGNoYXIgKikgZG9tYWluLT5kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCk7Ci19Ci0KLQotLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpCi0gICAgIGludCBjYXRlZ29yeTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0gIHsKLSNpZmRlZiBMQ19DT0xMQVRFCi0gIGNhc2UgTENfQ09MTEFURToKLSAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19DVFlQRQotICBjYXNlIExDX0NUWVBFOgotICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NT05FVEFSWQotICBjYXNlIExDX01PTkVUQVJZOgotICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19OVU1FUklDCi0gIGNhc2UgTENfTlVNRVJJQzoKLSAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19USU1FCi0gIGNhc2UgTENfVElNRToKLSAgICByZXR2YWwgPSAiTENfVElNRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NRVNTQUdFUwotICBjYXNlIExDX01FU1NBR0VTOgotICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19SRVNQT05TRQotICBjYXNlIExDX1JFU1BPTlNFOgotICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19BTEwKLSAgY2FzZSBMQ19BTEw6Ci0gICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKLSAgICAgICB2YWx1ZS4gICovCi0gICAgcmV0dmFsID0gIkxDX0FMTCI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLwotICAgIHJldHZhbCA9ICJMQ19YWFgiOwotICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKQotICAgICBpbnQgY2F0ZWdvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIC8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50Ci0gICAgIHZhcmlhYmxlLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBgTEFOR1VBR0UnIGlzIG5vdCBzZXQuICBTbyB3ZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVgKLSAgICAgbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLCBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUKLSAgICAgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICByZXR1cm4gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7Ci0jZWxzZQotICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBXZSB1c2UgQyBhcyB0aGUgZGVmYXVsdCBkb21haW4uICBQT1NJWCBzYXlzIHRoaXMgaXMgaW1wbGVtZW50YXRpb24KLSAgICAgZGVmaW5lZC4gICovCi0gIHJldHVybiAiQyI7Ci0jZW5kaWYKLX0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9kZ2V0dGV4dC5jIGIvaW50bC9kZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlNjc3Li4wMDAwMDAwCi0tLSBhL2ludGwvZGdldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIGRnZXR0ZXh0LmMgLS0gaW1wbGVtZW50YXRpb24gb2YgdGhlIGRnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgREdFVFRFWFQgZGdldHRleHRfXwotIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1jaGFyICoKLURHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBEQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2RnZXR0ZXh0LCBkZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZXhwbG9kZW5hbWUuYyBiL2ludGwvZXhwbG9kZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjNDZlOS4uMDAwMDAwMAotLS0gYS9pbnRsL2V4cGxvZGVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotaW50Ci1fbmxfZXhwbG9kZV9uYW1lIChuYW1lLCBsYW5ndWFnZSwgbW9kaWZpZXIsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJICBub3JtYWxpemVkX2NvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uKQotICAgICBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICoqbGFuZ3VhZ2U7Ci0gICAgIGNvbnN0IGNoYXIgKiptb2RpZmllcjsKLSAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeTsKLSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsOwotICAgICBjb25zdCBjaGFyICoqc3BvbnNvcjsKLSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uOwotewotICBlbnVtIHsgdW5kZWNpZGVkLCB4cGcsIGNlbiB9IHN5bnRheDsKLSAgY2hhciAqY3A7Ci0gIGludCBtYXNrOwotCi0gICptb2RpZmllciA9IE5VTEw7Ci0gICp0ZXJyaXRvcnkgPSBOVUxMOwotICAqY29kZXNldCA9IE5VTEw7Ci0gICpub3JtYWxpemVkX2NvZGVzZXQgPSBOVUxMOwotICAqc3BlY2lhbCA9IE5VTEw7Ci0gICpzcG9uc29yID0gTlVMTDsKLSAgKnJldmlzaW9uID0gTlVMTDsKLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKLSAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCi0gIG1hc2sgPSAwOwotICBzeW50YXggPSB1bmRlY2lkZWQ7Ci0gICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKLSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nICYmIGNwWzBdICE9ICdAJwotCSAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnKQotICAgICsrY3A7Ci0KLSAgaWYgKCpsYW5ndWFnZSA9PSBjcCkKLSAgICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2U6IGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQuICBVc2UKLSAgICAgICB0aGlzIGVudHJ5IGFzIGl0IGlzIHdpdGhvdXQgZXhwbG9kaW5nLiAgUGVyaGFwcyBpdCBpcyBhbiBhbGlhcy4gICovCi0gICAgY3AgPSBzdHJjaHIgKCpsYW5ndWFnZSwgJ1wwJyk7Ci0gIGVsc2UgaWYgKGNwWzBdID09ICdfJykKLSAgICB7Ci0gICAgICAvKiBOZXh0IGlzIHRoZSB0ZXJyaXRvcnkuICAqLwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKnRlcnJpdG9yeSA9ICsrY3A7Ci0KLSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcuJyAmJiBjcFswXSAhPSAnQCcKLQkgICAgICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSsrY3A7Ci0KLSAgICAgIG1hc2sgfD0gVEVSUklUT1JZOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJy4nKQotCXsKLQkgIC8qIE5leHQgaXMgdGhlIGNvZGVzZXQuICAqLwotCSAgc3ludGF4ID0geHBnOwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKmNvZGVzZXQgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7Ci0KLQkgIGlmICgqY29kZXNldCAhPSBjcCAmJiAoKmNvZGVzZXQpWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKLQkJCQkJCQkgICBjcCAtICpjb2Rlc2V0KTsKLQkgICAgICBpZiAoc3RyY21wICgqY29kZXNldCwgKm5vcm1hbGl6ZWRfY29kZXNldCkgPT0gMCkKLQkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0JICAgICAgZWxzZQotCQltYXNrIHw9IFhQR19OT1JNX0NPREVTRVQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChjcFswXSA9PSAnQCcgfHwgKHN5bnRheCAhPSB4cGcgJiYgY3BbMF0gPT0gJysnKSkKLSAgICB7Ci0gICAgICAvKiBOZXh0IGlzIHRoZSBtb2RpZmllci4gICovCi0gICAgICBzeW50YXggPSBjcFswXSA9PSAnQCcgPyB4cGcgOiBjZW47Ci0gICAgICBjcFswXSA9ICdcMCc7Ci0gICAgICAqbW9kaWZpZXIgPSArK2NwOwotCi0gICAgICB3aGlsZSAoc3ludGF4ID09IGNlbiAmJiBjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcrJwotCSAgICAgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRTsKLSAgICB9Ci0KLSAgaWYgKHN5bnRheCAhPSB4cGcgJiYgKGNwWzBdID09ICcrJyB8fCBjcFswXSA9PSAnLCcgfHwgY3BbMF0gPT0gJ18nKSkKLSAgICB7Ci0gICAgICBzeW50YXggPSBjZW47Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnKycpCi0JewotIAkgIC8qIE5leHQgaXMgc3BlY2lhbCBhcHBsaWNhdGlvbiAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwZWNpYWwgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IENFTl9TUEVDSUFMOwotCX0KLQotICAgICAgaWYgKGNwWzBdID09ICcsJykKLQl7Ci0gCSAgLyogTmV4dCBpcyBzcG9uc29yIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqc3BvbnNvciA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BPTlNPUjsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnXycpCi0JewotIAkgIC8qIE5leHQgaXMgcmV2aXNpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpyZXZpc2lvbiA9ICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1JFVklTSU9OOwotCX0KLSAgICB9Ci0KLSAgLyogRm9yIENFTiBzeW50YXggdmFsdWVzIGl0IG1pZ2h0IGJlIGltcG9ydGFudCB0byBoYXZlIHRoZQotICAgICBzZXBhcmF0b3IgY2hhcmFjdGVyIGluIHRoZSBmaWxlIG5hbWUsIG5vdCBmb3IgWFBHIHN5bnRheC4gICovCi0gIGlmIChzeW50YXggPT0geHBnKQotICAgIHsKLSAgICAgIGlmICgqdGVycml0b3J5ICE9IE5VTEwgJiYgKCp0ZXJyaXRvcnkpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+VEVSUklUT1JZOwotCi0gICAgICBpZiAoKmNvZGVzZXQgIT0gTlVMTCAmJiAoKmNvZGVzZXQpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+WFBHX0NPREVTRVQ7Ci0KLSAgICAgIGlmICgqbW9kaWZpZXIgIT0gTlVMTCAmJiAoKm1vZGlmaWVyKVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19NT0RJRklFUjsKLSAgICB9Ci0KLSAgcmV0dXJuIG1hc2s7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ZpbmRkb21haW4uYyBiL2ludGwvZmluZGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg1ZDRkLi4wMDAwMDAwCi0tLSBhL2ludGwvZmluZGRvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0vKiBMaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMuICAqLwotc3RhdGljIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9sb2FkZWRfZG9tYWluczsKLQotCi0vKiBSZXR1cm4gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgZGVzY3JpYmVkIGJ5Ci0gICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQotICAgZXN0YWJsaXNoZWQgYmluZGluZ3MuICAqLwotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIGxvY2FsZSwgZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLSAgICAgY2hhciAqbG9jYWxlOwotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKnNwZWNpYWw7Ci0gIGNvbnN0IGNoYXIgKnNwb25zb3I7Ci0gIGNvbnN0IGNoYXIgKnJldmlzaW9uOwotICBjb25zdCBjaGFyICphbGlhc192YWx1ZTsKLSAgaW50IG1hc2s7Ci0KLSAgLyogTE9DQUxFIGNhbiBjb25zaXN0IG9mIHVwIHRvIGZvdXIgcmVjb2duaXplZCBwYXJ0cyBmb3IgdGhlIFhQRyBzeW50YXg6Ci0KLQkJbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0KLQotICAgICBhbmQgc2l4IHBhcnRzIGZvciB0aGUgQ0VOIHN5bnRheDoKLQotCWxhbmd1YWdlW190ZXJyaXRvcnldWythdWRpZW5jZV1bK3NwZWNpYWxdWyxbc3BvbnNvcl1bX3JldmlzaW9uXV0KLQotICAgICBCZXNpZGUgdGhlIGZpcnN0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZiB0aGUKLSAgICAgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQotICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydCB3aWxsIGJlIHN0cmlwcGVkIG9mIGFjY29yZGluZyB0bwotICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOgotCQkoMSkgcmV2aXNpb24KLQkJKDIpIHNwb25zb3IKLQkJKDMpIHNwZWNpYWwKLQkJKDQpIGNvZGVzZXQKLQkJKDUpIG5vcm1hbGl6ZWQgY29kZXNldAotCQkoNikgdGVycml0b3J5Ci0JCSg3KSBhdWRpZW5jZS9tb2RpZmllcgotICAgKi8KLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgdGVzdGVkIGZvciB0aGlzIGxvY2FsZSBlbnRyeSB0aGVyZSBoYXMgdG8KLSAgICAgYmUgb25lIGRhdGEgc2V0IGluIHRoZSBsaXN0IG9mIGxvYWRlZCBkb21haW5zLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCAwLCBsb2NhbGUsIE5VTEwsIE5VTEwsCi0JCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZG9tYWlubmFtZSwgMCk7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzIGxvY2FsZS4gICovCi0gICAgICBpbnQgY250OwotCi0gICAgICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCi0JX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOwotCi0gICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7Ci0KLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIHJldHVybiBjbnQgPj0gMCA/IHJldHZhbCA6IE5VTEw7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgfQotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZSBsb2NhbGUgdmFsdWUgaXMgYW4gYWxpYXMuICBJZiB5ZXMgaXRzIHZhbHVlCi0gICAgICpvdmVyd3JpdGVzKiB0aGUgYWxpYXMgbmFtZS4gIE5vIHRlc3QgZm9yIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcwotICAgICBkb25lLiAgKi8KLSAgYWxpYXNfdmFsdWUgPSBfbmxfZXhwYW5kX2FsaWFzIChsb2NhbGUpOwotICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhbGlhc192YWx1ZSkgKyAxOwotICAgICAgbG9jYWxlID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1jcHkgKGxvY2FsZSwgYWxpYXNfdmFsdWUsIGxlbik7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAotICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgotICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KLSAgbWFzayA9IF9ubF9leHBsb2RlX25hbWUgKGxvY2FsZSwgJmxhbmd1YWdlLCAmbW9kaWZpZXIsICZ0ZXJyaXRvcnksCi0JCQkgICAmY29kZXNldCwgJm5vcm1hbGl6ZWRfY29kZXNldCwgJnNwZWNpYWwsCi0JCQkgICAmc3BvbnNvciwgJnJldmlzaW9uKTsKLQotICAvKiBDcmVhdGUgYWxsIHBvc3NpYmxlIGxvY2FsZSBlbnRyaWVzIHdoaWNoIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4KLSAgICAgZ2VuZXJhbGl6YXRpb24uICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIG1hc2ssIGxhbmd1YWdlLCB0ZXJyaXRvcnksCi0JCQkgICAgICAgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCSAgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZG9tYWlubmFtZSwgMSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICAvKiBUaGlzIG1lYW5zIHdlIGFyZSBvdXQgb2YgY29yZS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKLSAgaWYgKHJldHZhbC0+ZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjbnQ7Ci0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIHJvb20gZm9yIGFuIGFsaWFzIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICBGcmVlIGl0IG5vdy4gICovCi0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIGZyZWUgKGxvY2FsZSk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5jIGIvaW50bC9nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzZkMjEuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgX19uZWVkX05VTEwKLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBTVERDX0hFQURFUlMKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0jIGVsc2UKLSMgIGlmZGVmIEhBVkVfU1RSSU5HX0gKLSMgICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGVsc2UKLSMgICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgR0VUVEVYVCBfX2dldHRleHQKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSNlbHNlCi0jIGRlZmluZSBHRVRURVhUIGdldHRleHRfXwotIyBkZWZpbmUgREdFVFRFWFQgZGdldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotY2hhciAqCi1HRVRURVhUIChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBER0VUVEVYVCAoTlVMTCwgbXNnaWQpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0LmggYi9pbnRsL2dldHRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0YjllMy4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKiBJbnRlcm5hbCBoZWFkZXIgZm9yIEdOVSBnZXR0ZXh0IGludGVybmF0aW9uYWxpemF0aW9uIGZ1bmN0aW9ucwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVFRFWFRfSAotI2RlZmluZSBfR0VUVEVYVF9IIDEKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBIQVZFX0xJTUlUU19IIHx8IF9MSUJDCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQuICAqLwotI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQotI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1Ci0KLS8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KLSNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKLQotLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCi0gICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCi0gICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAotICAgZG9pbmcgdGhhdCB3b3VsZCByZXF1aXJlIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29tcGlsZSBhbmQgKnJ1bioKLSAgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS4gIExvY2FsbHkgcnVubmluZyBjcm9zcy1jb21waWxlZCBleGVjdXRhYmxlcwotICAgaXMgdXN1YWxseSBub3QgcG9zc2libGUuICAqLwotCi0jaWYgX19TVERDX18KLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKLSNlbHNlCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKLSNlbmRpZgotCi0vKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgotICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCi0gICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKLSAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCi0KLSNpZm5kZWYgVUlOVF9NQVgKLSMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKLSNlbmRpZgotCi0jaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOwotI2Vsc2UKLSMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKLSMgZWxzZQotIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOwotIyAgZWxzZQotICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKLSAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCi0gICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCi1zdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKLXsKLSAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCi0gIG5sc191aW50MzIgbWFnaWM7Ci0gIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KLSAgbmxzX3VpbnQzMiByZXZpc2lvbjsKLSAgLyogVGhlIG51bWJlciBvZiBzdHJpbmdzIHBhaXJzLiAgKi8KLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiBvcmlnX3RhYl9vZmZzZXQ7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRpb24gc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKLSAgLyogU2l6ZSBvZiBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3RhYl9zaXplOwotICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaGluZyBlbnRyeS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OwotfTsKLQotc3RydWN0IHN0cmluZ19kZXNjCi17Ci0gIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KLSAgbmxzX3VpbnQzMiBsZW5ndGg7Ci0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0gIG5sc191aW50MzIgb2Zmc2V0OwotfTsKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNlbmRpZgkvKiBnZXR0ZXh0LmggICovCmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHRQLmggYi9pbnRsL2dldHRleHRQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOGQ1NTIuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0UC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogSGVhZGVyIGRlc2NyaWJpbmcgaW50ZXJuYWxzIG9mIGdldHRleHQgbGlicmFyeQotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUUF9ICi0jZGVmaW5lIF9HRVRURVhUUF9ICi0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgVwotIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCi0jZW5kaWYKLQotCi1zdGF0aWMgbmxzX3VpbnQzMiBTV0FQIFBBUkFNUyAoKG5sc191aW50MzIgaSkpOwotCi1zdGF0aWMgaW5saW5lIG5sc191aW50MzIKLVNXQVAgKGkpCi0gICAgIG5sc191aW50MzIgaTsKLXsKLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotfQotCi0KLXN0cnVjdCBsb2FkZWRfZG9tYWluCi17Ci0gIGNvbnN0IGNoYXIgKmRhdGE7Ci0gIGludCBtdXN0X3N3YXA7Ci0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOwotICBubHNfdWludDMyIGhhc2hfc2l6ZTsKLSAgbmxzX3VpbnQzMiAqaGFzaF90YWI7Ci19OwotCi1zdHJ1Y3QgYmluZGluZwotewotICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKLSAgY2hhciAqZG9tYWlubmFtZTsKLSAgY2hhciAqZGlybmFtZTsKLX07Ci0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2Rpcm5hbWUsCi0JCQkJCQkgY2hhciAqX19sb2NhbGUsCi0JCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci12b2lkIF9ubF9sb2FkX2RvbWFpbiBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbikpOwotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2VuZGlmIC8qIGdldHRleHRQLmggICovCmRpZmYgLS1naXQgYS9pbnRsL2hhc2gtc3RyaW5nLmggYi9pbnRsL2hhc2gtc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmU4NDEuLjAwMDAwMDAKLS0tIGEvaW50bC9oYXNoLXN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogSW1wbGVtZW50cyBhIHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX1ZBTFVFU19ICi0jIGluY2x1ZGUgPHZhbHVlcy5oPgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoQXJncykgQXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKEFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgYXNzdW1lIHRvIGhhdmUgYHVuc2lnbmVkIGxvbmcgaW50JyB2YWx1ZSB3aXRoIGF0IGxlYXN0IDMyIGJpdHMuICAqLwotI2RlZmluZSBIQVNIV09SREJJVFMgMzIKLQotCi0vKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgotICAgW3NlZSBBaG8vU2V0aGkvVWxsbWFuLCBDT01QSUxFUlM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzLAotICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGFzaF9zdHJpbmcgUEFSQU1TICgoY29uc3QgY2hhciAqX19zdHJfcGFyYW0pKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1oYXNoX3N0cmluZyAoc3RyX3BhcmFtKQotICAgICBjb25zdCBjaGFyICpzdHJfcGFyYW07Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIGc7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9wYXJhbTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KLSAgaHZhbCA9IDA7Ci0gIHdoaWxlICgqc3RyICE9ICdcMCcpCi0gICAgewotICAgICAgaHZhbCA8PD0gNDsKLSAgICAgIGh2YWwgKz0gKHVuc2lnbmVkIGxvbmcpICpzdHIrKzsKLSAgICAgIGcgPSBodmFsICYgKCh1bnNpZ25lZCBsb25nKSAweGYgPDwgKEhBU0hXT1JEQklUUyAtIDQpKTsKLSAgICAgIGlmIChnICE9IDApCi0JewotCSAgaHZhbCBePSBnID4+IChIQVNIV09SREJJVFMgLSA4KTsKLQkgIGh2YWwgXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaHZhbDsKLX0KZGlmZiAtLWdpdCBhL2ludGwvaW50bC1jb21wYXQuYyBiL2ludGwvaW50bC1jb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZWZhMC4uMDAwMDAwMAotLS0gYS9pbnRsL2ludGwtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0Ci0gICBMaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmdldHRleHQuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0KLSN1bmRlZiBnZXR0ZXh0Ci0jdW5kZWYgZGdldHRleHQKLSN1bmRlZiBkY2dldHRleHQKLSN1bmRlZiB0ZXh0ZG9tYWluCi0jdW5kZWYgYmluZHRleHRkb21haW4KLQotCi1jaGFyICoKLWJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotICByZXR1cm4gYmluZHRleHRkb21haW5fXyAoZG9tYWlubmFtZSwgZGlybmFtZSk7Ci19Ci0KLQotY2hhciAqCi1kY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci0gICAgIGludCBjYXRlZ29yeTsKLXsKLSAgcmV0dXJuIGRjZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwotfQotCi0KLWNoYXIgKgotZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIGRnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkKTsKLX0KLQotCi1jaGFyICoKLWdldHRleHQgKG1zZ2lkKQotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIGdldHRleHRfXyAobXNnaWQpOwotfQotCi0KLWNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgcmV0dXJuIHRleHRkb21haW5fXyAoZG9tYWlubmFtZSk7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ludGxoLmluc3QuaW4gYi9pbnRsL2ludGxoLmluc3QuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDMyM2MuLjAwMDAwMDAKLS0tIGEvaW50bC9pbnRsaC5pbnN0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotCi1ASU5DTFVERV9MT0NBTEVfSEAKLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJCWludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLQotLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gICovCi0jaWYgZGVmaW5lZCBfX09QVElNSVpFRAotLyogVGhlc2UgbXVzdCBiZSBhIG1hY3JvLiAgSW5saW5lZCBmdW5jdGlvbnMgYXJlIHVzZWxlc3MgYmVjYXVzZSB0aGUKLSAgIGBfX2J1aWx0aW5fY29uc3RhbnRfcCcgcHJlZGljYXRlIGluIGRjZ2V0dGV4dCB3b3VsZCBhbHdheXMgcmV0dXJuCi0gICBmYWxzZS4gICovCi0KLSMgZGVmaW5lIGdldHRleHQobXNnaWQpIGRnZXR0ZXh0ICgoY2hhciAqKSAwLCBtc2dpZCkKLQotIyBkZWZpbmUgZGdldHRleHQoZG9tYWlubmFtZSwgbXNnaWQpCQkJCQkgICAgICBcCi0gIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQotCi0jIGlmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KQotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBsb2FkbXNnY2F0LmMuICBXZSBuZWVkIGEgc2lnbiwKLSAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAotICAgdHJhbnNsYXRpb25zLiAgKi8KLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQotIyAgZGVmaW5lIGRjZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqX19yZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChtc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICAoZGNnZXR0ZXh0KSAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIF9fcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIF9fcmVzdWx0ID0gKGRjZ2V0dGV4dCkgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jIGVuZGlmCi0jZW5kaWYgLyogT3B0aW1pemluZy4gKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9pbnRsL2wxMG5mbGlzdC5jIGIvaW50bC9sMTBuZmxpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyYmMxMy4uMDAwMDAwMAotLS0gYS9pbnRsL2wxMG5mbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX0FSR1pfSAotIyBpbmNsdWRlIDxhcmd6Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweShkZXN0LCBzcmMpCi0jZWxzZQotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogRGVmaW5lIGZ1bmN0aW9uIHdoaWNoIGFyZSB1c3VhbGx5IG5vdCBhdmFpbGFibGUuICAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfQ09VTlQKLS8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGluIEFSR1ouICAqLwotc3RhdGljIHNpemVfdCBhcmd6X2NvdW50X18gUEFSQU1TICgoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikpOwotCi1zdGF0aWMgc2l6ZV90Ci1hcmd6X2NvdW50X18gKGFyZ3osIGxlbikKLSAgICAgY29uc3QgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgc2l6ZV90IGNvdW50ID0gMDsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW4gKyAxOwotICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0jIHVuZGVmIF9fYXJnel9jb3VudAotIyBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9DT1VOVCAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0vKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCi0gICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCi1zdGF0aWMgdm9pZCBhcmd6X3N0cmluZ2lmeV9fIFBBUkFNUyAoKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApKTsKLQotc3RhdGljIHZvaWQKLWFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotICAgICBjaGFyICphcmd6OwotICAgICBzaXplX3QgbGVuOwotICAgICBpbnQgc2VwOwotewotICB3aGlsZSAobGVuID4gMCkKLSAgICB7Ci0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotICAgICAgYXJneiArPSBwYXJ0X2xlbjsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBpZiAobGVuID4gMCkKLQkqYXJneisrID0gc2VwOwotICAgIH0KLX0KLSMgdW5kZWYgX19hcmd6X3N0cmluZ2lmeQotIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9TVFJJTkdJRlkgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX05FWFQKLXN0YXRpYyBjaGFyICphcmd6X25leHRfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sCi0JCQkJICBjb25zdCBjaGFyICplbnRyeSkpOwotCi1zdGF0aWMgY2hhciAqCi1hcmd6X25leHRfXyAoYXJneiwgYXJnel9sZW4sIGVudHJ5KQotICAgICBjaGFyICphcmd6OwotICAgICBzaXplX3QgYXJnel9sZW47Ci0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotewotICBpZiAoZW50cnkpCi0gICAgewotICAgICAgaWYgKGVudHJ5IDwgYXJneiArIGFyZ3pfbGVuKQotICAgICAgICBlbnRyeSA9IHN0cmNociAoZW50cnksICdcMCcpICsgMTsKLQotICAgICAgcmV0dXJuIGVudHJ5ID49IGFyZ3ogKyBhcmd6X2xlbiA/IE5VTEwgOiAoY2hhciAqKSBlbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpZiAoYXJnel9sZW4gPiAwKQotICAgICAgcmV0dXJuIGFyZ3o7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci19Ci0jIHVuZGVmIF9fYXJnel9uZXh0Ci0jIGRlZmluZSBfX2FyZ3pfbmV4dChhcmd6LCBsZW4sIGVudHJ5KSBhcmd6X25leHRfXyAoYXJneiwgbGVuLCBlbnRyeSkKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX05FWFQgKi8KLQotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgc2V0IGluIFguICAqLwotc3RhdGljIGludCBwb3AgUEFSQU1TICgoaW50IHgpKTsKLQotc3RhdGljIGlubGluZSBpbnQKLXBvcCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIC8qIFdlIGFzc3VtZSB0aGF0IG5vIG1vcmUgdGhhbiAxNiBiaXRzIGFyZSB1c2VkLiAgKi8KLSAgeCA9ICgoeCAmIH4weDU1NTUpID4+IDEpICsgKHggJiAweDU1NTUpOwotICB4ID0gKCh4ICYgfjB4MzMzMykgPj4gMikgKyAoeCAmIDB4MzMzMyk7Ci0gIHggPSAoKHggPj4gNCkgKyB4KSAmIDB4MGYwZjsKLSAgeCA9ICgoeCA+PiA4KSArIHgpICYgMHhmZjsKLQotICByZXR1cm4geDsKLX0KLQotDAotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBtYXNrLCBsYW5ndWFnZSwKLQkJICAgIHRlcnJpdG9yeSwgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJICAgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgZG9fYWxsb2NhdGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0OwotICAgICBjb25zdCBjaGFyICpkaXJsaXN0OwotICAgICBzaXplX3QgZGlybGlzdF9sZW47Ci0gICAgIGludCBtYXNrOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICpzcGVjaWFsOwotICAgICBjb25zdCBjaGFyICpzcG9uc29yOwotICAgICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBkb19hbGxvY2F0ZTsKLXsKLSAgY2hhciAqYWJzX2ZpbGVuYW1lOwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpsYXN0ID0gTlVMTDsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjaGFyICpjcDsKLSAgc2l6ZV90IGVudHJpZXM7Ci0gIGludCBjbnQ7Ci0KLSAgLyogQWxsb2NhdGUgcm9vbSBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLiAgKi8KLSAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgotCQkJCSAgKyBzdHJsZW4gKGxhbmd1YWdlKQotCQkJCSAgKyAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDAKLQkJCQkgICAgID8gc3RybGVuICh0ZXJyaXRvcnkpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAoY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKG5vcm1hbGl6ZWRfY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKCgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwKQotCQkJCSAgICAgPyBzdHJsZW4gKG1vZGlmaWVyKSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHNwZWNpYWwpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQotCQkJCSAgICAgPyAoMSArICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCi0JCQkJCSAgICAgPyBzdHJsZW4gKHNwb25zb3IpICsgMSA6IDApCi0JCQkJCSsgKChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwCi0JCQkJCSAgID8gc3RybGVuIChyZXZpc2lvbikgKyAxIDogMCkpIDogMCkKLQkJCQkgICsgMSArIHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0KLSAgaWYgKGFic19maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHZhbCA9IE5VTEw7Ci0gIGxhc3QgPSBOVUxMOwotCi0gIC8qIENvbnN0cnVjdCBmaWxlIG5hbWUuICAqLwotICBtZW1jcHkgKGFic19maWxlbmFtZSwgZGlybGlzdCwgZGlybGlzdF9sZW4pOwotICBfX2FyZ3pfc3RyaW5naWZ5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3RfbGVuLCAnOicpOwotICBjcCA9IGFic19maWxlbmFtZSArIChkaXJsaXN0X2xlbiAtIDEpOwotICAqY3ArKyA9ICcvJzsKLSAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7Ci0KLSAgaWYgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJ18nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIGNvZGVzZXQpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcuJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIChYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0UpKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY29tcG9uZW50IGNhbiBiZSBwYXJ0IG9mIGJvdGggc3ludGFjZXMgYnV0IGhhcyBkaWZmZXJlbnQKLQkgbGVhZGluZyBjaGFyYWN0ZXJzLiAgRm9yIENFTiB3ZSB1c2UgYCsnLCBlbHNlIGBAJy4gICovCi0gICAgICAqY3ArKyA9IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwID8gJysnIDogJ0AnOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBtb2RpZmllcik7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcrJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgc3BlY2lhbCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoQ0VOX1NQT05TT1IgfCBDRU5fUkVWSVNJT04pKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJywnOwotICAgICAgaWYgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDApCi0JY3AgPSBzdHBjcHkgKGNwLCBzcG9uc29yKTsKLSAgICAgIGlmICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKLQl7Ci0JICAqY3ArKyA9ICdfJzsKLQkgIGNwID0gc3RwY3B5IChjcCwgcmV2aXNpb24pOwotCX0KLSAgICB9Ci0KLSAgKmNwKysgPSAnLyc7Ci0gIHN0cGNweSAoY3AsIGZpbGVuYW1lKTsKLQotICAvKiBMb29rIGluIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucyB3aGV0aGVyIGl0IGlzIGFscmVhZHkKLSAgICAgYXZhaWxhYmxlLiAgKi8KLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCi0gICAgaWYgKHJldHZhbC0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLQlpbnQgY29tcGFyZSA9IHN0cmNtcCAocmV0dmFsLT5maWxlbmFtZSwgYWJzX2ZpbGVuYW1lKTsKLQlpZiAoY29tcGFyZSA9PSAwKQotCSAgLyogV2UgZm91bmQgaXQhICAqLwotCSAgYnJlYWs7Ci0JaWYgKGNvbXBhcmUgPCAwKQotCSAgewotCSAgICAvKiBJdCdzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICAgIHJldHZhbCA9IE5VTEw7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JbGFzdCA9IHJldHZhbDsKLSAgICAgIH0KLQotICBpZiAocmV0dmFsICE9IE5VTEwgfHwgZG9fYWxsb2NhdGUgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgcmV0dmFsID0gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikKLSAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkgKyAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikKLQkJCQkqICgxIDw8IHBvcCAobWFzaykpCi0JCQkJKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0gIHJldHZhbC0+ZGVjaWRlZCA9IChfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSAhPSAxCi0JCSAgICAgfHwgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLQkJCSAmJiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApKTsKLSAgcmV0dmFsLT5kYXRhID0gTlVMTDsKLQotICBpZiAobGFzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHZhbC0+bmV4dCA9ICpsMTBuZmlsZV9saXN0OwotICAgICAgKmwxMG5maWxlX2xpc3QgPSByZXR2YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dmFsLT5uZXh0ID0gbGFzdC0+bmV4dDsKLSAgICAgIGxhc3QtPm5leHQgPSByZXR2YWw7Ci0gICAgfQotCi0gIGVudHJpZXMgPSAwOwotICAvKiBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCB0aGUgUkVUVkFMIGVudHJ5IGNvcnJlc3BvbmRzIG5vdCB0bwotICAgICBhIHJlYWwgZmlsZS4gIFNvIHdlIGhhdmUgdG8gdXNlIHRoZSBESVJMSVNUIHNlcGFyYXRpb24gbWVjaGFuaXNtCi0gICAgIG9mIHRoZSBpbm5lciBsb29wLiAgKi8KLSAgY250ID0gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgPT0gMSA/IG1hc2sgLSAxIDogbWFzazsKLSAgZm9yICg7IGNudCA+PSAwOyAtLWNudCkKLSAgICBpZiAoKGNudCAmIH5tYXNrKSA9PSAwCi0JJiYgKChjbnQgJiBDRU5fU1BFQ0lGSUMpID09IDAgfHwgKGNudCAmIFhQR19TUEVDSUZJQykgPT0gMCkKLQkmJiAoKGNudCAmIFhQR19DT0RFU0VUKSA9PSAwIHx8IChjbnQgJiBYUEdfTk9STV9DT0RFU0VUKSA9PSAwKSkKLSAgICAgIHsKLQkvKiBJdGVyYXRlIG92ZXIgYWxsIGVsZW1lbnRzIG9mIHRoZSBESVJMSVNULiAgKi8KLQljaGFyICpkaXIgPSBOVUxMOwotCi0Jd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCi0JICAgICAgICE9IE5VTEwpCi0JICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCi0JICAgID0gX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXIsIHN0cmxlbiAoZGlyKSArIDEsIGNudCwKLQkJCQkgIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCQkJICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkJCSAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCAxKTsKLSAgICAgIH0KLSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0Ci0gICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgotICAgbmFtZXMuICAqLwotY29uc3QgY2hhciAqCi1fbmxfbm9ybWFsaXplX2NvZGVzZXQgKGNvZGVzZXQsIG5hbWVfbGVuKQotICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICAgICBzaXplX3QgbmFtZV9sZW47Ci17Ci0gIGludCBsZW4gPSAwOwotICBpbnQgb25seV9kaWdpdCA9IDE7Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqd3A7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0gICAgaWYgKGlzYWxudW0gKGNvZGVzZXRbY250XSkpCi0gICAgICB7Ci0JKytsZW47Ci0KLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKLQkgIG9ubHlfZGlnaXQgPSAwOwotICAgICAgfQotCi0gIHJldHZhbCA9IChjaGFyICopIG1hbGxvYyAoKG9ubHlfZGlnaXQgPyAzIDogMCkgKyBsZW4gKyAxKTsKLQotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG9ubHlfZGlnaXQpCi0Jd3AgPSBzdHBjcHkgKHJldHZhbCwgImlzbyIpOwotICAgICAgZWxzZQotCXdwID0gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gdG9sb3dlciAoY29kZXNldFtjbnRdKTsKLQllbHNlIGlmIChpc2RpZ2l0IChjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSBjb2Rlc2V0W2NudF07Ci0KLSAgICAgICp3cCA9ICdcMCc7Ci0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSByZXR2YWw7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9saWJnZXR0ZXh0LmggYi9pbnRsL2xpYmdldHRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0ZGU0ZC4uMDAwMDAwMAotLS0gYS9pbnRsL2xpYmdldHRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcykgd2Ugc29tZXRpbWVzIGhhdmUgdG8gaW5jbHVkZQotICAgdGhlIHN5c3RlbXMgbGliaW50bC5oIGFzIHdlbGwgYXMgdGhpcyBmaWxlIHdlIGhhdmUgbW9yZSBjb21wbGV4Ci0gICBpbmNsdWRlIHByb3RlY3Rpb24gYWJvdmUuICBCdXQgdGhlIHN5c3RlbXMgaGVhZGVyIG1pZ2h0IHBlcmhhcHMgYWxzbwotICAgZGVmaW5lIF9MSUJJTlRMX0ggYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHByb3RlY3QgdGhlIGRlZmluaXRpb24gaGVyZS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkgfHwgIWRlZmluZWQgKF9MSUJHRVRURVhUX0gpCi0jaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpCi0jIGRlZmluZSBfTElCSU5UTF9ICTEKLSNlbmRpZgotI2RlZmluZSBfTElCR0VUVEVYVF9ICTEKLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotIyBpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fR05VQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgKDApCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmICFIQVZFX0xDX01FU1NBR0VTCi0vKiBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpCi0gICBmdW5jdGlvbi4gIEJ1dCBzb21lIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoaXMgZGVmaW5lZC4gIERlZmluZSBpdAotICAgdG8gYSBkZWZhdWx0IHZhbHVlLiAgKi8KLSMgZGVmaW5lIExDX01FU1NBR0VTICgtMSkKLSNlbmRpZgotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4gIERlcml2ZWQgZnJvbQotICAgSmltIE1leWVyaW5nJ3MgbGliaW50bC5oLiAgKi8KLXN0cnVjdCBfbXNnX2VudAotewotICBjb25zdCBjaGFyICpfbXNnOwotICBpbnQgX21zZ19udW1iZXI7Ci19OwotCi0KLSNpZiBIQVZFX0NBVEdFVFMKLS8qIFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHkgYnkgcG8tdG8tdGJsLnNlZAotICAgZ2VuZXJhdGVkIGZpbGUgYGNhdC1pZC10YmwuYycuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdOwotZXh0ZXJuIGludCBfbXNnX3RibF9sZW5ndGg7Ci0jZW5kaWYKLQotCi0vKiBGb3IgYXV0b21hdGljYWwgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcyBzb21ldGltZXMgbm8gcmVhbAotICAgdHJhbnNsYXRpb24gaXMgbmVlZGVkLiAgSW5zdGVhZCB0aGUgc3RyaW5nIGl0c2VsZiBpcyB0aGUgcmVzdWx0LiAgKi8KLSNkZWZpbmUgZ2V0dGV4dF9ub29wKFN0cikgKFN0cikKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJCWludCBfX2NhdGVnb3J5KSk7Ci1leHRlcm4gY2hhciAqZGNnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0jaWYgRU5BQkxFX05MUwotCi0vKiBTb2xhcmlzIDIuMyBoYXMgdGhlIGdldHRleHQgZnVuY3Rpb24gYnV0IGRjZ2V0dGV4dCBpcyBtaXNzaW5nLgotICAgU28gd2Ugb21pdCB0aGlzIG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuICBCVFcsIFNvbGFyaXMgMi40Ci0gICBoYXMgZGNnZXR0ZXh0LiAgKi8KLSMgaWYgIUhBVkVfQ0FUR0VUUyAmJiAoIUhBVkVfR0VUVEVYVCB8fCBIQVZFX0RDR0VUVEVYVCkKLQotIyAgZGVmaW5lIGdldHRleHQoTXNnaWQpCQkJCQkJICAgICAgXAotICAgICBkZ2V0dGV4dCAoTlVMTCwgTXNnaWQpCi0KLSMgIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkJCQkJCSAgICAgIFwKLSAgICAgZGNnZXR0ZXh0IChEb21haW5uYW1lLCBNc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAotICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCi0gICB0cmFuc2xhdGlvbnMuICAqLwotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCi0jICAgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqX19yZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChNc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIF9fcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIF9fcmVzdWx0ID0gZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCi0gICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyAgZW5kaWYKLSMgZW5kaWYKLQotI2Vsc2UKLQotIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpIChNc2dpZCkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpIChNc2dpZCkKLSMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCi0KLSNlbmRpZgotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2xpYmludGwuZ2xpYmMgYi9pbnRsL2xpYmludGwuZ2xpYmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWI4ZjkuLjAwMDAwMDAKLS0tIGEvaW50bC9saWJpbnRsLmdsaWJjCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIGxpYmdldHRleHQuaCAtLSBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLUNvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIuCi1UaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIGxpYmdldHRleHQuaCBpbiB0aGUgR05VIGdldHRleHQgcGFja2FnZS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQklOVExfSAotI2RlZmluZSBfTElCSU5UTF9ICTEKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNkZWZpbmUgX19uZWVkX05VTEwKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCi0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KLSNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqX19nZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqX19kZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci1leHRlcm4gY2hhciAqX19kY2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLWV4dGVybiBjaGFyICpfX3RleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBfX2NvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLQotLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFib3ZlLiAgKi8KLSNpZiBkZWZpbmVkIF9fT1BUSU1JWkVECi0vKiBUaGVzZSBtdXN0IGJlIGEgbWFjcm8uICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQotICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLQotIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKE5VTEwsIG1zZ2lkKQotCi0jIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkJCQkJCSAgICAgIFwKLSAgZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCi0jICBkZWZpbmUgZGNnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpyZXN1bHQ7CQkJCQkJCSAgICAgIFwKLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChtc2dpZCkpCQkJCQkgICAgICBcCi0gICAgICAgewkJCQkJCQkJICAgICAgXAotCSBleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIF9fZGNnZXR0ZXh0ICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotICAgICAgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIHJlc3VsdCA9IF9fZGNnZXR0ZXh0ICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkgICAgICBcCi0gICAgIHJlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgZW5kaWYKLSNlbmRpZiAvKiBPcHRpbWl6aW5nLiAqLwotCi0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2ludGwvbGludXgtbXNnLnNlZCBiL2ludGwvbGludXgtbXNnLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxOGU3Mi4uMDAwMDAwMAotLS0gYS9pbnRsL2xpbnV4LW1zZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBwbzJtc2cuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBMaW51eCBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgTWl0Y2gncyBvbGQgY2F0YWxvZyBmb3JtYXQgZG9lcyBub3QgYWxsb3cgY29tbWVudHMuCi0jCi0jIFdlIGNvcHkgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYXMgYSBjb21tZW50IGludG8gdGhlIC5tc2cgZmlsZS4KLSMKLS9ebXNnaWQvIHsKLSAgcy9tc2dpZFsgCV0qIi8vCi0jCi0jIFRoaXMgZG9lcyBub3Qgd29yayBub3cgd2l0aCB0aGUgbmV3IGZvcm1hdC4KLSMgLyIkLyEgewotIyAgIHMvXFwkLy8KLSMgICBzLyQvIC4uLiAobW9yZSBsaW5lcyBmb2xsb3dpbmcpIi8KLSMgfQotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotICBHCi0gIHMvXCguKlwpIlxuXChbMC05XSpcKS8kICNcMiBPcmlnaW5hbCBNZXNzYWdlOihcMSkvcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi8jIFwxLwotIyBDbGVhciBzdWJzdGl0dXRpb24gZmxhZy4KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUuCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBEIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIEQgaGVyZS4KLSAgcy8uKlxuXCguKlwpL1wxLwotICB0YgotfQotZApkaWZmIC0tZ2l0IGEvaW50bC9sb2FkaW5mby5oIGIvaW50bC9sb2FkaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdjMmViLi4wMDAwMDAwCi0tLSBhL2ludGwvbG9hZGluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KLSNkZWZpbmUgQ0VOX1JFVklTSU9OCQkxCi0jZGVmaW5lIENFTl9TUE9OU09SCQkyCi0jZGVmaW5lIENFTl9TUEVDSUFMCQk0Ci0jZGVmaW5lIFhQR19OT1JNX0NPREVTRVQJOAotI2RlZmluZSBYUEdfQ09ERVNFVAkJMTYKLSNkZWZpbmUgVEVSUklUT1JZCQkzMgotI2RlZmluZSBDRU5fQVVESUVOQ0UJCTY0Ci0jZGVmaW5lIFhQR19NT0RJRklFUgkJMTI4Ci0KLSNkZWZpbmUgQ0VOX1NQRUNJRklDCShDRU5fUkVWSVNJT058Q0VOX1NQT05TT1J8Q0VOX1NQRUNJQUx8Q0VOX0FVRElFTkNFKQotI2RlZmluZSBYUEdfU1BFQ0lGSUMJKFhQR19DT0RFU0VUfFhQR19OT1JNX0NPREVTRVR8WFBHX01PRElGSUVSKQotCi0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBkZWNpZGVkOwotCi0gIGNvbnN0IHZvaWQgKmRhdGE7Ci0KLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbmV4dDsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqc3VjY2Vzc29yWzFdOwotfTsKLQotCi1leHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvZGVzZXQsCi0JCQkJCQkgIHNpemVfdCBuYW1lX2xlbikpOwotCi1leHRlcm4gc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfbWFrZV9sMTBuZmxpc3QgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCi0JCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLCBpbnQgbWFzaywKLQkJCSAgICBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAotCQkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsCi0JCQkgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAotCQkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAotCQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpKTsKLQotCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci0KLWV4dGVybiBpbnQgX25sX2V4cGxvZGVfbmFtZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCi0JCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsCi0JCQkJICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5LAotCQkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkJCSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWwsCi0JCQkJICAgICBjb25zdCBjaGFyICoqc3BvbnNvciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbikpOwpkaWZmIC0tZ2l0IGEvaW50bC9sb2FkbXNnY2F0LmMgYi9pbnRsL2xvYWRtc2djYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlOTBhOS4uMDAwMDAwMAotLS0gYS9pbnRsL2xvYWRtc2djYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVApIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBJU08gQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIElTTyBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBmc3RhdCAgX19mc3RhdAotIyBkZWZpbmUgb3BlbiAgIF9fb3BlbgotIyBkZWZpbmUgY2xvc2UgIF9fY2xvc2UKLSMgZGVmaW5lIHJlYWQgICBfX3JlYWQKLSMgZGVmaW5lIG1tYXAgICBfX21tYXAKLSMgZGVmaW5lIG11bm1hcCBfX211bm1hcAotI2VuZGlmCi0KLS8qIFdlIG5lZWQgYSBzaWduLCB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQKLSAgIHdpdGggYWxsIHRyYW5zbGF0aW9ucy4gIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlCi0gICBjYWNoZWQgYnkgb25lIG9mIEdDQydzIGZlYXR1cmVzLiAgKi8KLWludCBfbmxfbXNnX2NhdF9jbnRyID0gMDsKLQotCi0vKiBMb2FkIHRoZSBtZXNzYWdlIGNhdGFsb2dzIHNwZWNpZmllZCBieSBGSUxFTkFNRS4gIElmIGl0IGlzIG5vIHZhbGlkCi0gICBtZXNzYWdlIGNhdGFsb2cgZG8gbm90aGluZy4gICovCi12b2lkCi1fbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKLXsKLSAgaW50IGZkOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgc3RydWN0IG1vX2ZpbGVfaGVhZGVyICpkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMTsKLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICBpbnQgdXNlX21tYXAgPSAwOwotI2VuZGlmCi0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0KLSAgZG9tYWluX2ZpbGUtPmRlY2lkZWQgPSAxOwotICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCi0gICAgIG1pZ2h0IGJlIE5VTEwuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0gICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgotICAgICBzeW50YXguICAqLwotICBpZiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIFRyeSB0byBvcGVuIHRoZSBhZGRyZXNzZWQgZmlsZS4gICovCi0gIGZkID0gb3BlbiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGZzdGF0IChmZCwgJnN0KSAhPSAwCi0gICAgICAmJiBzdC5zdF9zaXplIDwgKG9mZl90KSBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlcikpCi0gICAgewotICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQotICAgICB0aGlzIGZpcnN0LiAgSWYgbm90IGF2YWlsYWJsZSBvciBpdCBmYWlsZWQgd2UgdHJ5IHRvIGxvYWQgaXQuICAqLwotICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtbWFwIChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsCi0JCQkJCSBNQVBfUFJJVkFURSwgZmQsIDApOwotCi0gIGlmIChkYXRhICE9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0gICAgewotICAgICAgLyogbW1hcCgpIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHVzZV9tbWFwID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGUgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSAoaS5lLiBtbWFwJ2VkKSB3ZSB0cnkgdG8gbG9hZAotICAgICBpdCBtYW51YWxseS4gICovCi0gIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0gICAgewotICAgICAgb2ZmX3QgdG9fcmVhZDsKLSAgICAgIGNoYXIgKnJlYWRfcHRyOwotCi0gICAgICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtYWxsb2MgKHN0LnN0X3NpemUpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIHRvX3JlYWQgPSBzdC5zdF9zaXplOwotICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOwotICAgICAgZG8KLQl7Ci0JICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKLQkgIGlmIChuYiA9PSAtMSkKLQkgICAgewotCSAgICAgIGNsb3NlIChmZCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHJlYWRfcHRyICs9IG5iOwotCSAgdG9fcmVhZCAtPSBuYjsKLQl9Ci0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApOwotCi0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICAvKiBVc2luZyB0aGUgbWFnaWMgbnVtYmVyIHdlIGNhbiB0ZXN0IHdoZXRoZXIgaXQgcmVhbGx5IGlzIGEgbWVzc2FnZQotICAgICBjYXRhbG9nIGZpbGUuICAqLwotICBpZiAoZGF0YS0+bWFnaWMgIT0gX01BR0lDICYmIGRhdGEtPm1hZ2ljICE9IF9NQUdJQ19TV0FQUEVEKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvbWFpbl9maWxlLT5kYXRhCi0gICAgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7Ci0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0gIGRvbWFpbi0+ZGF0YSA9IChjaGFyICopIGRhdGE7Ci0gIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOwotCi0gIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KLSAgc3dpdGNoIChXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKLSAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoc3RydWN0IHN0cmluZ19kZXNjICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPmhhc2hfc2l6ZSA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9zaXplKTsKLSAgICAgIGRvbWFpbi0+aGFzaF90YWIgPSAobmxzX3VpbnQzMiAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoaXMgaXMgYW4gaWxsZWdhbCByZXZpc2lvbi4gICovCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgICAgIGlmICh1c2VfbW1hcCkKLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzdC5zdF9zaXplKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWZyZWUgKGRhdGEpOwotICAgICAgZnJlZSAoZG9tYWluKTsKLSAgICAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2hvdyB0aGF0IG9uZSBkb21haW4gaXMgY2hhbmdlZC4gIFRoaXMgbWlnaHQgbWFrZSBzb21lIGNhY2hlZAotICAgICB0cmFuc2xhdGlvbnMgaW52YWxpZC4gICovCi0gICsrX25sX21zZ19jYXRfY250cjsKLX0KZGlmZiAtLWdpdCBhL2ludGwvbG9jYWxlYWxpYXMuYyBiL2ludGwvbG9jYWxlYWxpYXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkOTE5NC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvY2FsZWFsaWFzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHJjYXNlY21wIF9fc3RyY2FzZWNtcAotI2VuZGlmCi0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KLXN0cnVjdCBhbGlhc19tYXAKLXsKLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0gIGNvbnN0IGNoYXIgKnZhbHVlOwotfTsKLQotCi1zdGF0aWMgc3RydWN0IGFsaWFzX21hcCAqbWFwOwotc3RhdGljIHNpemVfdCBubWFwID0gMDsKLXN0YXRpYyBzaXplX3QgbWF4bWFwID0gMDsKLQotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pKTsKLXN0YXRpYyB2b2lkIGV4dGVuZF9hbGlhc190YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpKTsKLQotCi1jb25zdCBjaGFyICoKLV9ubF9leHBhbmRfYWxpYXMgKG5hbWUpCi0gICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7Ci0gIHN0cnVjdCBhbGlhc19tYXAgKnJldHZhbDsKLSAgc2l6ZV90IGFkZGVkOwotCi0gIGRvCi0gICAgewotICAgICAgc3RydWN0IGFsaWFzX21hcCBpdGVtOwotCi0gICAgICBpdGVtLmFsaWFzID0gbmFtZTsKLQotICAgICAgaWYgKG5tYXAgPiAwKQotCXJldHZhbCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIGJzZWFyY2ggKCZpdGVtLCBtYXAsIG5tYXAsCi0JCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCQkJCQkgICAgICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLAotCQkJCQkJCQkgY29uc3Qgdm9pZCAqKSkKLQkJCQkJCSkgYWxpYXNfY29tcGFyZSk7Ci0gICAgICBlbHNlCi0JcmV0dmFsID0gTlVMTDsKLQotICAgICAgLyogV2UgcmVhbGx5IGZvdW5kIGFuIGFsaWFzLiAgUmV0dXJuIHRoZSB2YWx1ZS4gICovCi0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbC0+dmFsdWU7Ci0KLSAgICAgIC8qIFBlcmhhcHMgd2UgY2FuIGZpbmQgYW5vdGhlciBhbGlhcyBmaWxlLiAgKi8KLSAgICAgIGFkZGVkID0gMDsKLSAgICAgIHdoaWxlIChhZGRlZCA9PSAwICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcpCi0JewotCSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSAnOicpCi0JICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7Ci0JICBzdGFydCA9IGxvY2FsZV9hbGlhc19wYXRoOwotCi0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJyAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnOicpCi0JICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIGlmIChzdGFydCA8IGxvY2FsZV9hbGlhc19wYXRoKQotCSAgICBhZGRlZCA9IHJlYWRfYWxpYXNfZmlsZSAoc3RhcnQsIGxvY2FsZV9hbGlhc19wYXRoIC0gc3RhcnQpOwotCX0KLSAgICB9Ci0gIHdoaWxlIChhZGRlZCAhPSAwKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc2l6ZV90Ci1yZWFkX2FsaWFzX2ZpbGUgKGZuYW1lLCBmbmFtZV9sZW4pCi0gICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgICBpbnQgZm5hbWVfbGVuOwotewotI2lmbmRlZiBIQVZFX0FMTE9DQQotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgRklMRSAqZnA7Ci0gIGNoYXIgKmZ1bGxfZm5hbWU7Ci0gIHNpemVfdCBhZGRlZDsKLSAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7Ci0KLSAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZnVsbF9mbmFtZSk7Ci0gIG1lbWNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbik7Ci0gIG1lbWNweSAoJmZ1bGxfZm5hbWVbZm5hbWVfbGVuXSwgYWxpYXNmaWxlLCBzaXplb2YgYWxpYXNmaWxlKTsKLQotICBmcCA9IGZvcGVuIChmdWxsX2ZuYW1lLCAiciIpOwotICBpZiAoZnAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWRkZWQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZwKSkKLSAgICB7Ci0gICAgICAvKiBJdCBpcyBhIHJlYXNvbmFibGUgYXBwcm9hY2ggdG8gdXNlIGEgZml4IGJ1ZmZlciBoZXJlIGJlY2F1c2UKLQkgYSkgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcwotCSBiKSB0aGVzZSBmaWVsZHMgbXVzdCBiZSB1c2FibGUgYXMgZmlsZSBuYW1lcyBhbmQgc28gbXVzdCBub3QKLQkgICAgYmUgdGhhdCBsb25nCi0gICAgICAgKi8KLSAgICAgIGNoYXIgYnVmW0JVRlNJWl07Ci0gICAgICBjaGFyICphbGlhczsKLSAgICAgIGNoYXIgKnZhbHVlOwotICAgICAgY2hhciAqY3A7Ci0KLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQotCS8qIEVPRiByZWFjaGVkLiAgKi8KLQlicmVhazsKLQotICAgICAgY3AgPSBidWY7Ci0gICAgICAvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQotCSsrY3A7Ci0KLSAgICAgIC8qIEEgbGVhZGluZyAnIycgc2lnbmFscyBhIGNvbW1lbnQgbGluZS4gICovCi0gICAgICBpZiAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnIycpCi0JewotCSAgYWxpYXMgPSBjcCsrOwotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKGNwWzBdKSkKLQkgICAgKytjcDsKLQkgIC8qIFRlcm1pbmF0ZSBhbGlhcyBuYW1lLiAgKi8KLQkgIGlmIChjcFswXSAhPSAnXDAnKQotCSAgICAqY3ArKyA9ICdcMCc7Ci0KLQkgIC8qIE5vdyBsb29rIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQotCSAgICArK2NwOwotCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGNoYXIgKnRwOwotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICB2YWx1ZSA9IGNwKys7Ci0JICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKGNwWzBdKSkKLQkJKytjcDsKLQkgICAgICAvKiBUZXJtaW5hdGUgdmFsdWUuICAqLwotCSAgICAgIGlmIChjcFswXSA9PSAnXG4nKQotCQl7Ci0JCSAgLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdGVzdAotCQkgICAgIGZvciB0aGUgZW5kIG9mIGxpbmUgcG9zc2libGUuICBXZSBhcmUgbG9va2luZyBmb3IKLQkJICAgICB0aGUgdGVybWluYXRpbmcgJ1xuJyB3aGljaCBkbyBub3Qgb3ZlcndyaXRlIGhlcmUuICAqLwotCQkgICpjcCsrID0gJ1wwJzsKLQkJICAqY3AgPSAnXG4nOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoY3BbMF0gIT0gJ1wwJykKLQkJKmNwKysgPSAnXDAnOwotCi0JICAgICAgaWYgKG5tYXAgPj0gbWF4bWFwKQotCQlleHRlbmRfYWxpYXNfdGFibGUgKCk7Ci0KLQkgICAgICAvKiBXZSBjYW5ub3QgZGVwZW5kIG9uIHN0cmR1cCBhdmFpbGFibGUgaW4gdGhlIGxpYmMuICBTaWdoISAgKi8KLQkgICAgICBsZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7Ci0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKHRwID09IE5VTEwpCi0JCXsKLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JCSAgcmV0dXJuIGFkZGVkOwotCQl9Ci0JICAgICAgbWVtY3B5ICh0cCwgYWxpYXMsIGxlbik7Ci0JICAgICAgbWFwW25tYXBdLmFsaWFzID0gdHA7Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKHRwID09IE5VTEwpCi0JCXsKLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JCSAgcmV0dXJuIGFkZGVkOwotCQl9Ci0JICAgICAgbWVtY3B5ICh0cCwgdmFsdWUsIGxlbik7Ci0JICAgICAgbWFwW25tYXBdLnZhbHVlID0gdHA7Ci0KLQkgICAgICArK25tYXA7Ci0JICAgICAgKythZGRlZDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUG9zc2libHkgbm90IHRoZSB3aG9sZSBsaW5lIGZpdHMgaW50byB0aGUgYnVmZmVyLiAgSWdub3JlCi0JIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlIChzdHJjaHIgKGNwLCAnXG4nKSA9PSBOVUxMKQotCXsKLQkgIGNwID0gYnVmOwotCSAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCi0JICAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5uZXIgbG9vcCB3aWxsIGJlIGxlZnQuICBUaGUgb3V0ZXIgbG9vcAotCSAgICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KLQkgICAgKmNwID0gJ1xuJzsKLQl9Ci0gICAgfQotCi0gIC8qIFNob3VsZCB3ZSB0ZXN0IGZvciBmZXJyb3IoKT8gIEkgdGhpbmsgd2UgaGF2ZSB0byBzaWxlbnRseSBpZ25vcmUKLSAgICAgZXJyb3JzLiAgLS1kcmVwcGVyICAqLwotICBmY2xvc2UgKGZwKTsKLQotICBpZiAoYWRkZWQgPiAwKQotICAgIHFzb3J0IChtYXAsIG5tYXAsIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSkgYWxpYXNfY29tcGFyZSk7Ci0KLSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICByZXR1cm4gYWRkZWQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWV4dGVuZF9hbGlhc190YWJsZSAoKQotewotICBzaXplX3QgbmV3X3NpemU7Ci0gIHN0cnVjdCBhbGlhc19tYXAgKm5ld19tYXA7Ci0KLSAgbmV3X3NpemUgPSBtYXhtYXAgPT0gMCA/IDEwMCA6IDIgKiBtYXhtYXA7Ci0gIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBtYWxsb2MgKG5ld19zaXplCi0JCQkJCSAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOwotICBpZiAobmV3X21hcCA9PSBOVUxMKQotICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAobmV3X21hcCwgbWFwLCBubWFwICogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSk7Ci0KLSAgaWYgKG1heG1hcCAhPSAwKQotICAgIGZyZWUgKG1hcCk7Ci0KLSAgbWFwID0gbmV3X21hcDsKLSAgbWF4bWFwID0gbmV3X3NpemU7Ci19Ci0KLQotc3RhdGljIGludAotYWxpYXNfY29tcGFyZSAobWFwMSwgbWFwMikKLSAgICAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMTsKLSAgICAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMjsKLXsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJDQVNFQ01QCi0gIHJldHVybiBzdHJjYXNlY21wIChtYXAxLT5hbGlhcywgbWFwMi0+YWxpYXMpOwotI2Vsc2UKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAxLT5hbGlhczsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAyLT5hbGlhczsKLSAgdW5zaWduZWQgY2hhciBjMSwgYzI7Ci0KLSAgaWYgKHAxID09IHAyKQotICAgIHJldHVybiAwOwotCi0gIGRvCi0gICAgewotICAgICAgLyogSSBrbm93IHRoaXMgc2VlbXMgdG8gYmUgb2RkIGJ1dCB0aGUgdG9sb3dlcigpIGZ1bmN0aW9uIGluCi0JIHNvbWUgc3lzdGVtcyBsaWJjIGNhbm5vdCBoYW5kbGUgbm9uYWxwaGEgY2hhcmFjdGVycy4gICovCi0gICAgICBjMSA9IGlzdXBwZXIgKCpwMSkgPyB0b2xvd2VyICgqcDEpIDogKnAxOwotICAgICAgYzIgPSBpc3VwcGVyICgqcDIpID8gdG9sb3dlciAoKnAyKSA6ICpwMjsKLSAgICAgIGlmIChjMSA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgKytwMTsKLSAgICAgICsrcDI7Ci0gICAgfQotICB3aGlsZSAoYzEgPT0gYzIpOwotCi0gIHJldHVybiBjMSAtIGMyOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9pbnRsL3BvMnRibC5zZWQuaW4gYi9pbnRsL3BvMnRibC5zZWQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYmNjYTQuLjAwMDAwMDAKLS0tIGEvaW50bC9wbzJ0Ymwuc2VkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotMSB7Ci0gIGlcCi0vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwbzJ0Ymwuc2VkIGZyb20gQFBBQ0tBR0UgTkFNRUAucG90LiAgKi9cCi1cCi0jaWYgSEFWRV9DT05GSUdfSFwKLSMgaW5jbHVkZSA8Y29uZmlnLmg+XAotI2VuZGlmXAotXAotI2luY2x1ZGUgImxpYmdldHRleHQuaCJcCi1cCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV3JpdGUgbXNnaWQgZW50cmllcyBpbiBDIGFycmF5IGZvcm0uCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKlwoIi4qIlwpLyAge1wxLwotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZQotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXCkiXChcblwpIlwoLioiXCkvXDFcMlwzLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotIyBCZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBmaWxlIGNvcnJlY3RseSBmb3JtZWQgdGhlIGxpbmUKLSMganVzdCByZWFkIGNhbm5vdCBiZSBhZ2FpbiBiZSBhIG1zZ2lkIGxpbmUuICBTbyBpdCdzIHNhZmUgdG8gaWdub3JlCi0jIGl0LgotICBzL1woLipcKVxuLiovXDEvCi0gIGJjCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0jIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJwotIyBmbGFnIG9uIGBOJywgc28gd2UgZG8gYSBgdCcgaGVyZSB0byBjbGVhciBpdC4KLSAgdGIKLSMgTm90IHJlYWNoZWQKLSAgOmMKLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KLSAgcy9cKC4qXCkiJC9cMS8KLSAgcAotfQotIwotIyBMYXN0IGxpbmUuCi0jCi0kIHsKLSAgaVwKLX07XAotCi0gIGcKLSAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKLX0KLWQKZGlmZiAtLWdpdCBhL2ludGwvdGV4dGRvbWFpbi5jIGIvaW50bC90ZXh0ZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDkzNDAuLjAwMDAwMDAKLS0tIGEvaW50bC90ZXh0ZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgdGV4dCBkb21haW4uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXTsKLQotLyogRGVmYXVsdCB0ZXh0IGRvbWFpbiBpbiB3aGljaCBlbnRyaWVzIGZvciBnZXR0ZXh0KDMpIGFyZSB0byBiZSBmb3VuZC4gICovCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgotIyBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSNlbHNlCi0jIGRlZmluZSBURVhURE9NQUlOIHRleHRkb21haW5fXwotI2VuZGlmCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotY2hhciAqCi1URVhURE9NQUlOIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBjaGFyICpvbGQ7Ci0KLSAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIG9sZCA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcKLSAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCi0gICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKLQkgd2lsbCBiZSBOVUxMLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFuZCBzbyBzaWduYWxzIHdlCi0JIGFyZSBvdXQgb2YgY29yZS4gICovCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0jZWxzZQotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgY2hhciAqY3AgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAoY3AgIT0gTlVMTCkKLQltZW1jcHkgKGNwLCBkb21haW5uYW1lLCBsZW4pOwotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBjcDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAob2xkICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQotICAgIGZyZWUgKG9sZCk7Ci0KLSAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX190ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC94b3Blbi1tc2cuc2VkIGIvaW50bC94b3Blbi1tc2cuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTljMGJiLi4wMDAwMDAwCi0tLSBhL2ludGwveG9wZW4tbXNnLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIFgvT3BlbiBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV2UgY29weSBhbGwgY29tbWVudHMgaW50byB0aGUgLm1zZyBmaWxlLiAgUGVyaGFwcyB0aGV5IGNhbiBoZWxwLgotIwotL14jLyBzL14jWyAJXSovJCAvcAotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0jIERvZXMgbm90IHdvcmsgbm93Ci0jICAvIiQvISB7Ci0jICAgIHMvXFwkLy8KLSMgICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jICB9Ci0gIHMvXm1zZ2lkWyAJXSoiXCguKlwpIiQvJCBPcmlnaW5hbCBNZXNzYWdlOiBcMS8KLSAgcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi9cMS8KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSMgQnJpbmcgdGhlIGxpbmUgaW4gdGhlIGZvcm1hdCBgPG51bWJlcj4gPG1lc3NhZ2U+JwotICBHCi0gIHMvXlteXG5dKiQvJiAvCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wyIFwxLwotIyBDbGVhciBmbGFnIGZyb20gbGFzdCBzdWJzdGl0dXRpb24uCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBhIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBgRCcgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgdGhlIHNlZCBjb21tYW5kIGBEJyBoZXJlCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9DT1BZSU5HLkxJQiBiL2xpYmliZXJ0eS9DT1BZSU5HLkxJQgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxYTNkMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cgYi9saWJpYmVydHkvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg1YzQwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUxICswLDAgQEAKLVR1ZSBNYXkgMzAgMTY6NDU6MjUgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBmbG9hdGZvcm1hdC5jOiBBZGQgbmFtZSB0byBlYWNoIGZsb2F0Zm9ybWF0IGZpZWxkLgotCi1UdWUgTWF5IDMwIDE1OjA3OjUyIDIwMDAgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG9iamFsbG9jLm8pOiBEZXBlbmQgb24gY29uZmlnLmgKLQotMjAwMC0wNS0yOSAgWmFjayBXZWluYmVyZyAgPHphY2tAd29sZXJ5LmN1bWIub3JnPgotCi0JKiBoYXNodGFiLmMsIHBhcnRpdGlvbi5jLCB4bWVtZHVwLmM6IEluY2x1ZGUgc3RyaW5nLmgKLQlpZiBIQVZFX1NUUklOR19ILgotCSogcGV4ZWN1dGUuYywgeGV4aXQuYzogSW5jbHVkZSBzdGRsaWIuaCBpZiBIQVZFX1NURExJQl9ILgotCSogb2JqYWxsb2MuYzogSW5jbHVkZSBjb25maWcuaC4gIEluY2x1ZGUgc3RkbGliLmggYW5kIGRvbid0Ci0JZGVjbGFyZSBtYWxsb2Mgb3IgZnJlZSBpZiBIQVZFX1NURExJQl9ILgotCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6IEluY2x1ZGUgc3RkbGliLmggaWYgSEFWRV9TVERMSUJfSCwKLQllbHNlIGRlY2xhcmUgbWFsbG9jIHdpdGhvdXQgcHJvdG90eXBlLiAgSW5jbHVkZSBzdHJpbmcuaCBpZgotCUhBVkVfU1RSSU5HX0gsIGVsc2UgZGVjbGFyZSBtZW1zZXQgd2l0aG91dCBwcm90b3R5cGUuICBEb24ndAotCWluY2x1ZGUgc3RkZGVmLmguCi0KLQkqIHNvcnQuYzogQnJpbmcgb3ZlciBmcm9tIEdDQy4KLQotMjAwMC0wNS0yNiAgQWxleGFuZHJlIE9saXZhICA8YW9saXZhQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuLXN1YmRpcik6IEZpeCBoYW5kbGluZyBvZiBlbXB0eQotCVNVQkRJUlMuCi0KLTIwMDAtMDQtMjEgIE1pY2hhZWwgU29rb2xvdiAgPG1zb2tvbG92QGl2YW4uSGFyaGFuLk9SRz4KLQotCSogTWFrZWZpbGUuaW4gKCotc3ViZGlyKTogUmV2YW1wIHNsaWdodGx5IHRvIGF2b2lkIGxvc2luZyBvbgotCTQuM0JTRCBzeXN0ZW1zLgotCi0yMDAwLTA0LTA1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfcmVtb3ZlKTogTmV3LgotCi1UaHUgTWFyIDE2IDAxOjMzOjU4IDIwMDAgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHBhcnRpdGlvbi5vKTogRGVwZW5kIG9uIGNvbmZpZy5oCi0KLTIwMDAtMDMtMTQgIEJlcm5kIFNjaG1pZHQgIDxiZXJuZHNAY3lnbnVzLmNvLnVrPgotCi0JKiBoYXNodGFiLmMgKGZpbmRfZW1wdHlfc2xvdF9mb3JfZXhwYW5kKTogTmV3IGZ1bmN0aW9uLgotCShodGFiX2V4cGFuZCk6IFVzZSBpdCBpbnN0ZWFkIG9mIGh0YWJfZmluZF9zbG90LgotCShodGFiX2ZpbmRfd2l0aF9oYXNoKTogUmVuYW1lZCBmcm9tIGh0YWJfZmluZDsgbm93IGFjY2VwdHMgZXh0cmEKLQlhcmd1bWVudCBIQVNILgotCShodGFiX2ZpbmRfc2xvdF93aXRoX2hhc2gpOiBMaWtld2lzZSBmb3IgaHRhYl9maW5kX3Nsb3QuCi0JKGh0YWJfZmluZCk6IE5ldyB3cmFwcGVyIGZ1bmN0aW9uLgotCShodGFiX2ZpbmRfc2xvdCk6IExpa2V3aXNlLgotCShodGFiX3RyYXZlcnNlKTogUGFzcyBzbG90LCBub3QgZW50cnksIHRvIGNhbGxlZCBmdW5jdGlvbi4KLQotMjAwMC0wMy0wOSAgQWxleCBTYW11ZWwgIDxzYW11ZWxAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBwYXJ0aXRpb24uYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHBhcnRpdGlvbi5vLgotCShwYXJ0aXRpb24ubyk6IE5ldyBydWxlLgotCSogcGFydGl0aW9uLmM6IE5ldyBmaWxlLgotCQotMjAwMC0wMy0wOSAgWmFjayBXZWluYmVyZyAgPHphY2tAd29sZXJ5LmN1bWIub3JnPgotCi0JKiBoYXNodGFiLmMgKGh0YWJfY3JlYXRlKTogU2V0IGRlbF9mLgotCShodGFiX2RlbGV0ZSwgaHRhYl9lbXB0eSwgaHRhYl9yZW1vdmVfZWx0LCBodGFiX2NsZWFyX3Nsb3QpOgotCVVzZSBpdC4KLQotMjAwMC0wMy0wOCAgWmFjayBXZWluYmVyZyAgPHphY2tAd29sZXJ5LmN1bWIub3JnPgotCi0JKiBoYXNodGFiLmM6IFJlbW92ZSBkZWJ1Z2dpbmcgdmFyaWFibGVzIChhbGxfc2VhcmNoZXMsCi0JYWxsX2NvbGxpc2lvbnMsIGFsbF9leHBhbnNpb25zKS4gRGVsZXRlCi0JYWxsX2hhc2hfdGFibGVfY29sbGlzaW9ucy4KLQkoY3JlYXRlX2hhc2hfdGFibGUsIGRlbGV0ZV9oYXNoX3RhYmxlLCBlbXB0eV9oYXNoX3RhYmxlLAotCWZpbmRfaGFzaF90YWJsZV9lbnRyeSwgcmVtb3ZlX2VsZW1lbnRfZnJvbV9oYXNoX3RhYmxlX2VudHJ5LAotCWNsZWFyX2hhc2hfdGFibGVfc2xvdCwgdHJhdmVyc2VfaGFzaF90YWJsZSwgaGFzaF90YWJsZV9zaXplLAotCWhhc2hfdGFibGVfZWxlbWVudHNfbnVtYmVyLCBoYXNoX3RhYmxlX2NvbGxpc2lvbnMpOiBSZW5hbWUgdG86Ci0JaHRhYl9jcmVhdGUsIGh0YWJfZGVsZXRlLCBodGFiX2VtcHR5LCBodGFiX2ZpbmRfc2xvdCwKLQlodGFiX3JlbW92ZV9lbHQsIGh0YWJfY2xlYXJfc2xvdCwgaHRhYl90cmF2ZXJzZSwgaHRhYl9zaXplLAotCWh0YWJfZWxlbWVudHMsIGh0YWJfY29sbGlzaW9ucy4KLQkoaHRhYl9maW5kKTogTmV3IGZ1bmN0aW9uLCBoYW5kbGVzIGNvbW1vbiBjYXNlIHdoZXJlIHlvdSBkb24ndAotCXBsYW4gdG8gYWRkIG9yIGRlbGV0ZSBhbiBlbnRyeS4KLQkoaHRhYl9leHBhbmQpOiBEb24ndCBjcmVhdGUgYSB3aG9sZSBuZXcgdGFibGUsIGp1c3QgYSBuZXcKLQllbnRyeSB2ZWN0b3IuCi0JKGh0YWJfZmluZF9zbG90KTogU2ltcGxpZnkgbG9naWMuCi0KLTE5OTktMDgtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBmbG9hdGZvcm1hdC5jOiBBZGQgY2FzdHMgdG8gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIHdhcm5pbmdzLgotCSogcGV4ZWN1dGUuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgbmVlZGVkIG9uIFVuaXguCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpcik6IENoYW5nZSAkKFRBUkdFVExJQikubiB0bwotCSQoVEFSR0VUTElCKW4gc28gaXQgd29ya3Mgb24gTVNET1MuCi0JKGluc3RhbGxfdG9fdG9vbGRpcik6IExpa2V3aXNlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIG1ha2VmaWxlLmRvczogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfaW5zZXJ0KTogQWRkIGluaXRpYWxpemF0aW9uIHRvIGF2b2lkCi0Jd2FybmluZy4KLQotMjAwMC0wMS0wNCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBleGVjdXRlLmM6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSBzdHJpbmcuaC4KLQkoZml4X2FyZ3YpOiBIYW5kbGUgZW1iZWRkZWQgd2hpdGVzcGFjZSBpbiBhcmdzIGZvciBNaW5ndzMyLgotCi0yMDAwLTAxLTA0ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzKTogVHVybiBvbiB3YXJuaW5ncyBpZgotCXdlJ3JlIHVzaW5nIGdjYy4KLQotCSogTWFrZWZpbGUuaW4gKENPTVBJTEUuYyk6IEFkZCBAYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzQAotCi0xOTk5LTEyLTI3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jIChpbnRfdmFzcHJpbnRmKTogRG9uJ3QgcmUtcmVhZCB0aGUgZm9ybWF0IGNoYXJhY3RlcgotCWFzIHRoaXMgbWlzaGFuZGxlcyBzdHJpbmdzIGxpa2UgJyUlcycuCi0KLTE5OTktMTItMDUgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9uZXcpOiBVc2Ugc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zCi0JcmF0aGVyIHRoYW4gc3RydWN0IHNwbGF5X3RyZWVfbm9kZS4KLQkoc3BsYXlfdHJlZV9pbnNlcnQpOiBVc2Ugc3RydWN0IHNwbGF5X3RyZWVfcyByYXRoZXIgdGhhbiBzdHJ1Y3QKLQlzcGxheV90cmVlLgotCi1TdW4gTm92IDI4IDAwOjU5OjM5IDE5OTkgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBoYXNodGFiLmMgKHN5cy90eXBlcy5oKTogRmlsZSBpbmNsdWRlZC4KLQotMTk5OS0xMS0yMiAgSmFzb24gTWVycmlsbCAgPGphc29uQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIHN0cnRvdWwuYywgc3RydG9sLmMsIHJhbmRvbS5jOiBSZW1vdmUgYWR2ZXJ0aXNpbmcgY2xhdXNlIGZyb20KLQlCU0QgbGljZW5zZSwgcHVyc3VhbnQgd2l0aAotCi0JICBmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlCi0KLVdlZCBOb3YgMTAgMDk6NDI6MzkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoYXNodGFiLmM6IEluY2x1ZGUgc3RkaW8uaC4KLQotTW9uIE5vdiAgOCAwOToyMzo0MSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhhc2h0YWIuYyAodHJhdmVyc2VfaGFzaF90YWJsZSk6IFByb3RlY3QgcHJvdG90eXBlIHdpdGggUEFSQU1TLgotCi1UdWUgTm92ICAyIDAzOjIzOjEzIDE5OTkgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiB4c3RyZHVwIChzeXMvdHlwZXMuaCk6IEluY2x1ZGUgdGhpcyBmaWxlLgotCi0xOTk5LTEwLTI4ICBOYXRoYW4gU2lkd2VsbCAgPG5hdGhhbkBhY20ub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkobW9zdGx5Y2xlYW4sIGNsZWFuLCBkaXN0Y2xlYW4sIG1haW50YWluZXItY2xlYW4pOiBBZGp1c3QgdG8KLQlhdm9pZCBtdWx0aXBsZSBzdWJkaXJlY3RvcnkgY2xlYW5pbmcuCi0JKCotc3ViZGlyKTogVXNlIFNVQkRJUlMuCi0KLTE5OTktMTAtMjUgIEppbSBLaW5nZG9uICA8aHR0cDovL2RldmVsb3Blci5yZWRoYXQuY29tLz4KLQotCSogY3BsdXMtZGVtLmM6IE1vdmUgZGVjbGFyYXRpb25zIG9mIHN0YW5kYXJkX3N5bWJvbF9jaGFyYWN0ZXJzIGFuZAotCWhwX3N5bWJvbF9jaGFyYWN0ZXJzIGluc2lkZSAjaWZkZWYgTUFJTiB0byBhdm9pZCBjb21waWxlcgotCXdhcm5pbmdzLgotCi0xOTk5LTEwLTIzIDA4OjUxIC0wNzAwICBaYWNrIFdlaW5iZXJnICA8emFja0BiaXRtb3Zlci5jb20+Ci0KLQkqIGhhc2h0YWIuYyAoZmluZF9oYXNoX3RhYmxlX2VudHJ5KTogV2hlbiByZXR1cm5pbmcgYQotCURFTEVURURfRU5UUlkgc2xvdCwgY2hhbmdlIGl0IHRvIEVNUFRZX0VOVFJZIGZpcnN0LgotCShjbGVhcl9oYXNoX3RhYmxlX3Nsb3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggZGVsZXRlcyBhbiBlbnRyeQotCWJ5IGl0cyBwb3NpdGlvbiBpbiB0aGUgdGFibGUsIG5vdCBpdHMgdmFsdWUuCi0JKHRyYXZlcnNlX2hhc2hfdGFibGUpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FsbHMgYSBob29rCi0JZnVuY3Rpb24gZm9yIGV2ZXJ5IGxpdmUgZW50cnkgaW4gdGhlIHRhYmxlLgotCi0xOTk5LTEwLTE5ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoSU5UQlVGX1NJWkUpOiBOZXcgbWFjcm8uCi0JKHN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4KTogTmV3IGZ1bmN0aW9uLgotCShkZW1hbmdsZV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogVXNlIGl0LgotCShkZW1hbmdsZV9yZWFsX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IC4uLiBoZXJlLiAgVXNlCi0Jc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHguICBVc2UgZGVtYW5nbGVfcmVhbF92YWx1ZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGUpOiBVc2Ugc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHguCi0JKGRlbWFuZ2xlX3F1YWxpZmllZCk6IFVzZSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMuCi0JKGdldF9jb3VudCk6IFR3ZWFrIGZvcm1hdHRpbmcuCi0JKGRvX3R5cGUpOiBVc2Ugc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHguCi0KLTE5OTktMTAtMTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2FsbG9jLmM6IEFkZCBhIHB1YmxpYyBkb21haW4gbm90aWNlLgotCi1Nb24gT2N0IDE4IDAyOjMwOjQ3IDE5OTkgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBzZXRlbnYuYyAoc3lzL3R5cGVzLmgsIHN0ZGlvLmgpOiBJbmNsdWRlIHRob3NlIGZpbGVzIHVuY29uZGl0aW9uYWx5LgotCi1GcmkgT2N0IDE1IDAxOjQ3OjUxIDE5OTkgIFZsYWRpbWlyIE1ha2Fyb3YgIDx2bWFrYXJvdkBsb29ueS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGhhc2h0YWIuYwotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgaGFzaHRhYi5vCi0JKGhhc2h0YWIubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBoYXNodGFiLmM6IE5ldyBmaWxlCi0KLVdlZCBPY3QgMTMgMDE6MTY6NDcgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGJhc2VuYW1lLmMgKERJUl9TRVBBUkFUT1IpOiBOZXcgbWFjcm8uCi0JKERJUl9TRVBBUkFUT1JfMik6IExpa2V3aXNlLgotCShIQVZFX0RPU19CQVNFRF9GSUxFU1lTVEVNKTogTGlrZXdpc2UuCi0JKElTX0RJUl9TRVBBUkFUT1IpOiBMaWtld2lzZS4KLQkobWFpbik6IEhhbmRsZSBNU0RPUyBzdHlsZSBwYXRobmFtZS4KLQotMTk5OS0xMC0xMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgcG9pbnRlciB0byBtZW1iZXIgdHlwZXMgd2hvc2UKLQllbmNsb3NpbmcgY2xhc3NlcyBoYXZlIG5hbWVzcGFjZSBzY29wZS4KLQotU3VuIE9jdCAxMCAwMToyMzo1MCAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy50YWJsZTogIFByb3ZpZGUgYSBiYWNrdXAgc2hlbGwgZm9yIGV4ZWN1dGluZyBtb3ZlLWlmLWNoYW5nZS4KLQotMTk5OS0xMC0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogeG1hbGxvYy5jICh4bWFsbG9jKTogRml4IHNwZWxsaW5nIGVycm9yLgotCSh4Y2FsbG9jLCB4cmVhbGxvYyk6IExpa2V3aXNlLgotCi0xOTk5LTEwLTAyICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChmYW5jeV9hYm9ydCwgZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUsCi0JZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlLCByZWN1cnNpdmVseV9kZW1hbmdsZSwKLQlzdGFuZGFyZF9zeW1ib2xfY2hhcmFjdGVycywgaHBfc3ltYm9sX2NoYXJhY3RlcnMsIG1haW4pOiBBZGQgcHJvdG90eXBlLgotCShwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbiwgZmF0YWwpOiBDb25zdGlmeSBhIGNoYXIqLgotCSh1c2FnZSwgZmF0YWwpOiBNYXJrIHdpdGggQVRUUklCVVRFX05PUkVUVVJOLgotCShtYWluKTogQ2FsbCByZXR1cm4sIG5vdCBleGl0LgotCi0xOTk5LTA5LTI1ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IFJlbW92ZSBvYnNvbGV0ZSBjb21tZW50IGFib3V0IGdjYy4KLQkobWFrZV90ZW1wX2ZpbGUpOiBDb25zdGlmeSBhIGNoYXIqLgotCi1XZWQgU2VwICA4IDIwOjAzOjI4IDE5OTkgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogeG1lbWR1cC5jOiBJbmNsdWRlIHN5cy90eXBlcy5oLgotCi0xOTk5LTA5LTA3ICBKZWZmIEdhcnppayAgPGpnYXJ6aWtAcG9ib3guY29tPgotCi0JKiB4bWVtZHVwLmM6IE5ldyB4bWVtZHVwIGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuaW4sIG1ha2VmaWxlLnZtcywgdm1zYnVpbGQuY29tOiAgVXNlIHhtZW1kdXAuW2NvXS4KLQotVHVlIFNlcCAgNyAyMzozMjoxOCAxOTk5ICBMaW5hcyBWZXBzdGFzICA8bGluYXNAbGluYXMub3JnPgotCi0JKiBjb25maWcudGFibGU6IEFkZCBvcGVuZWRpdGlvbiB0YXJnZXQuCi0JKiBjb25maWcvbWgtb3BlbmVkaXRpb246IE5ldyBmaWxlLgotCi1UaHUgU2VwICAyIDAxOjM2OjEyIDE5OTkgIE1hcmMgRXNwaWUgPGVzcGllQGN2cy5vcGVuYnNkLm9yZz4KLQotCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpOiAgRmlsbCBpbiB0ZW1wX2Jhc2Ugd2hlbiBuZWVkZWQuCi0KLTE5OTktMDgtMzEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdldHB3ZC5jOiBDaGVjayBIQVZFX0dFVENXRCBiZWZvcmUgZGVmaW5pbmcgaXQgYXdheS4KLQotMTk5OS0wOC0zMCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGNhbGxvYy5jIGFuZCBnZXRwd2QuYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIGdldHB3ZC5vLgotCShnZXRwd2Qubyk6IEFkZCB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogQnVtcCB0byAyLjEzLgotCShBQ19DSEVDS19IRUFERVJTKTogQWRkIGNoZWNrIGZvciA8c3lzL3N0YXQuaD4uCi0KLQkqIGdldHB3ZC5jOiBOZXcgZmlsZSwgbW92ZWQgaGVyZSBmcm9tIGdjYy4KLQotMTk5OS0wOC0yNSAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBDYXN0IGEgYHNpemVfdCcgdG8gYGxvbmcnIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBhIHNpZ25lZCBxdWFudGl0eS4KLQkoYXJtX3NwZWNpYWwpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogTWFyayBwYXJhbWV0ZXIgYHdvcmsnIHdpdGgKLQlBVFRSSUJVVEVfVU5VU0VELgotCShtYWluKTogQ29uc3RpZnkgdmFyaWFibGUgYHZhbGlkX3N5bWJvbHMnLgotCi1UdWUgQXVnIDI0IDAyOjUwOjQ1IDE5OTkgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpOiBBZGQgcGFyZW50aGVzZXMgYXJvdW5kICYmIHdpdGhpbiB8fC4KLQotRnJpIEF1ZyAgNiAyMzozMjoyOSAxOTk5ICBEYW5pZWwgSmFjb2Jvd2l0eiA8ZHJvd0Bkcm93LnRoZW0ub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IEluY2x1ZGUgcHJlZml4LCBleGVjX3ByZWZpeCwKLQlsaWJkaXIsIGxpYnN1YmRpciBhbmQgdG9vbGRpci4KLQotMTk5OS0wOC0wMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2luc2VydCk6IFJldHVybiB0aGUgbmV3IG5vZGUuCi0KLTE5OTktMDctMTQgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyZ3YuYzogSW5jbHVkZSBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5zdGVhZCBvZgotCXByb3RvdHlwaW5nIGRpcmVjdGx5LgotCSogY2hvb3NlLXRlbXAuYzogQ29uZGl0aW9uYWxseSBpbmNsdWRlIHN0cmluZy5oLgotCi0xOTk5LTA3LTEyICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChORUVERUQpOiBBZGQgYmNtcCwgYmNvcHksIGJ6ZXJvLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2luc2VydCk6IEFkZCBpbml0aWFsaXphdGlvbiB0byBhdm9pZAotCXdhcm5pbmcuCi0KLTE5OTktMDctMDcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC1saXN0KTogT25seSBpbmNsdWRlIHN0dWZmIHdlIGFjdHVhbGx5IG5lZWQKLQlmb3IgbGlic3RkYysrLgotCi0xOTk5LTA2LTIxICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY2hlY2tmdW5jcyk6IEFkZCBnZXR0aW1lb2ZkYXkuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKdW4gMjEgMDU6NTY6MDEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXV3aW4qKTogVVdJTiBoYXMgc3lzX3tlcnJsaXN0LG5lcnJ9IGV2ZW4gaWYKLQl0aGUgdGVzdCBmYWlscy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNi0xMCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc2V0ZW52Lm8pOiBBZGQgY29uZmlnLmggZGVwIGZvciBzZXRlbnYubyB0byBmaXgKLQlwYXJhbGxlbCBidWlsZHMuCi0KLTE5OTktMDUtMjggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogcHV0ZW52LmM6IEluY2x1ZGUgYW5zaWRlY2wuaCB0byBkZWZpbmUgYGNvbnN0Jy4KLQkqIHNldGVudi5jOiBMaWtld2lzZS4KLQotV2VkIE1heSAyNiAwMzo1ODoyMCAxOTk5ICAiTWVsaXNzYSBPJ05laWxsIiA8b25laWxsQGNzLnNmdS5jYT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBwdXRlbnYuYyBhbmQgc2V0ZW52LmMuCi0JKiBjb25maWd1cmUuaW4gKGZ1bmNzKTogQWRkIHB1dGVudiBhbmQgc2V0ZW52LgotCShBQ19DSEVDS19GVU5DUyk6IENoZWNrIGZvciBwdXRlbnYgYW5kIHNldGVudi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIHB1dGVudi5jIHNldGVudi5jOiBOZXcgZmlsZXMuCi0KLQkqIGdldGN3ZC5jIChnZXRjd2QpOiBJZiBwYXRobmFtZSBpcyBOVUxMLCB0aGVuIG9idGFpbiBTSVpFCi0JYnl0ZXMgb2Ygc3BhY2UgdXNpbmcgbWFsbG9jLgotCi1Nb24gTWF5IDE3IDAxOjQyOjM0IDE5OTkgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlIChuZWFyICdJJyBjYXNlKSk6IERvbid0IGFkdmFuY2UKLQl0aGUgKm1hbmdsZWQgcG9pbnRlciBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgQ2xlYW4gdXAgY29kZSB0bwotCW1hdGNoIHByZXZhaWxpbmcgY29kaW5nIHN0eWxlLgotCi0xOTk5LTA1LTEzICBNaWNoYWVsIEhheWVzICA8bS5oYXllc0BlbGVjLmNhbnRlcmJ1cnkuYWMubno+Ci0KLQkqIHRtcG5hbS5jIChMX3RtcG5hbSk6IEZpeCB0eXBvLgotCi1UaHUgTWF5IDEzIDAxOjE0OjQ2IDE5OTkgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBjcGx1cy1kZW0uYyAoc3RhbmRhcmRfc3ltYm9sX2NoYXJhY3RlcnMpOiBSZW5hbWVkIGZyb20KLQlzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQuICBObyBsb25nZXIgbW9kaWZ5IFRBQkxFLgotCShocF9zeW1ib2xfY2hhcmFjdGVycyk6IFJlbmFtZWQgZnJvbSBocF9zeW1ib2xfYWxwaGFiZXQuICBObyBsb25nZXIKLQltb2RpZnkgVEFCTEUuCi0JKG1haW4pOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuICBVc2Ugc3RyY2hyIHRvIGRldGVybWluZSBpZiBhCi0JY2hhcmFjdGVyIGlzIHZhbGlkLgotCi0xOTk5LTA1LTExICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogVXNlIHRhYmxlIGxvb2t1cCB0byBkaXN0aW5ndWlzaCBpZGVudGlmaWVyCi0JY2hhcmFjdGVycyBmcm9tIG5vbi1pZGVudGlmaWVyIGNoYXJhY3RlcnMuCi0JKHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCwgaHBfc3ltYm9sX2FscGhhYmV0KTogTmV3IGZ1bmN0aW9ucy4KLQotVGh1IE1heSAgNiAyMDozNDo0MiAxOTk5ICBGcmVkIEZpc2ggIDxmbmZAYmUuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHN5cy9yZXNvdXJjZS5oKTogQWRkIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KLQkqIGdldHJ1bnRpbWUuYzogT25seSBhdHRlbXB0IHRvIGluY2x1ZGUgc3lzL3Jlc291cmNlLmggYW5kCi0JdXNlIGdldHJ1c2FnZSBpZiBib3RoIEhBVkVfR0VUUlVTQUdFIGFuZCBIQVZFX1NZU19SRVNPVVJDRV9ICi0JYXJlIGRlZmluZWQuCi0KLU1vbiBBcHIgMjYgMDE6MzY6MDYgMTk5OSAgRG9ubiBUZXJyeSAoZG9ubkBpbnRlcml4LmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbGxvY2EgZGV0ZWN0aW9uKTogSGFuZGxlIGFsbG9jYSBkaXJlY3RseSBmb3IgaW50ZXJpeC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotU3VuIEFwciAyNSAwMToxODoyMSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYyAoRElSX1NFUEFSQVRPUik6IFVzZSAnXFwnIG9ubHkgZm9yIG5hdGl2ZSB3aW5kb3dzMzIuCi0KLTE5OTktMDQtMjAgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCUZpeCBmcm9tIERhbGUgSGF3a2luczoKLQkqIGNwbHVzLWRlbS5jIChtb3BfdXApOiBTZXQgdHlwZXZlY19zaXplIHRvIHplcm8sIHNvIGl0J2xsIGJlCi0JcmVhbGxvY2F0ZWQgcHJvcGVybHkgaWYgd2UgdXNlIGl0IGFnYWluLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVuLiAgQmUKLQlzdHJpY3RlciBhYm91dCBzeW50YXguICBBbHdheXMgbnVsbC10ZXJtaW5hdGUgc3RyaW5nLgotCi1UaHUgQXByIDE1IDIzOjAwOjU1IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGNoZWNrZnVuY3MpOiBDaGVjayBmb3Igc2Jyay4KLQkqIGNvbmZpZy5pbjogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0JKiB4bWFsbG9jLmM6IFVzZSBIQVZFX1NCUksgaW5zdGVhZCBvZiB0aGUgaG9zdCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotMTk5OS0wNC0xMiAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JRml4IGZyb20gTWFyY3VzIERhbmllbHM6Ci0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogRG9uJ3QgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZQotCWlkZW50aWZpZXIgbG9va2luZyBmb3IgYW5vdGhlciB1bmRlcnNjb3JlLgotCi1TdW4gQXByIDExIDIzOjIwOjU5IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBwZXhlY3V0ZS5jOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gX19VV0lOX18gdG8gX1VXSU4uCi0JKiB4bWFsbG9jLmM6IExpa2V3aXNlLgotCSh4Y2FsbG9jKTogVVdJTiBoYXMgc2Jyay4KLQkoeHJlYWxsb2MpOiBGaXggZ3VhcmQgbWFjcm8uCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1jb25mLmggKGFsbG9jYSkgW0NfQUxMT0NBXTogRG9uJ3QgdXNlIEdjYyBidWlsdGluCi0Jb3IgPGFsbG9jYS5oPi4KLQkqIGNsb2NrLmMgKEdOVV9IWik6IE5ldyBkZWZpbml0aW9uLgotCShjbG9jayk6IFVzZSBpdC4KLQkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy50YWJsZTogVXNlIG1oLWJlb3MuCi0JKiBjb25maWcvbWgtYmVvczogTmV3IGZpbGUuCi0KLTE5OTktMDQtMTEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogSGFuZGxlCi0JcG9pbnRlcnMtdG8tbWVtYmVycy4KLQkoZG9fdHlwZSk6IEhhbmRsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIHF1YWxpZmllcnMuCi0KLTE5OTktMDQtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEF0dGVtcHQgdG8gaGFuZGxlIG92ZXJmbG93cyBpbiBjb3VudHMgd2l0aCBzb21lCi0Jc2VtYmxhbmNlIG9mIGdyYWNlLgotCShjb25zdW1lX2NvdW50KTogRGV0ZWN0IG92ZXJmbG93cy4gIFJldHVybiAtMSB0byBpbmRpY2F0ZSBlcnJvcnMsCi0JaW5zdGVhZCBvZiB6ZXJvLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtLCBkZW1hbmdsZV90ZW1wbGF0ZSk6IEhhbmRsZSBjaGFuZ2UKLQl0byBjb25zdW1lX2NvdW50J3MgcmV0dXJuIGNvbnZlbnRpb24uCi0KLTE5OTktMDQtMDUgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogdGVzdHN1aXRlL3JlZ3Jlc3MtZGVtYW5nbGU6IE5ldyBmaWxlLgotCSogdGVzdHN1aXRlL2RlbWFuZ2xlLWV4cGVjdGVkOiBOZXcgZmlsZS4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCwgY2hlY2ssIGluc3RhbGxjaGVjaywgaW5mbywgaW5zdGFsbC1pbmZvLAotCWNsZWFuLWluZm8sIGR2aSwgaW5zdGFsbCwgZXRhZ3MsIHRhZ3MsIG1vc3RseWNsZWFuLCBjbGVhbiwKLQlkaXN0Y2xlYW4sIG1haW50YWluZXItY2xlYW4sIHJlYWxjbGVhbik6IERlcGVuZCBvbiBjb3JyZXNwb25kaW5nCi0JYC1zdWJkaXInIHRhcmdldC4KLQkoYWxsLXN1YmRpciBjaGVjay1zdWJkaXIgaW5zdGFsbGNoZWNrLXN1YmRpciBpbmZvLXN1YmRpcgotCWluc3RhbGwtaW5mby1zdWJkaXIgY2xlYW4taW5mby1zdWJkaXIgZHZpLXN1YmRpcgotCWluc3RhbGwtaW5mby1zdWJkaXIgZXRhZ3Mtc3ViZGlyIG1vc3RseWNsZWFuLXN1YmRpciBjbGVhbi1zdWJkaXIKLQlkaXN0Y2xlYW4tc3ViZGlyIG1haW50YWluZXItY2xlYW4tc3ViZGlyKTogTmV3IHRhcmdldC4KLQkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW46IENyZWF0ZSB0ZXN0c3VpdGUvTWFrZWZpbGUuCi0KLTE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVmaW5lLgotCi0xOTk5LTAzLTMwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzKTogRGVmaW5lLgotCi0xOTk5LTAzLTMwICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogSWYgYGNvdW50JyB3cmFwcywgcmV0dXJuIDAgYW5kCi0JZG9uJ3QgYWR2YW5jZSBpbnB1dCBwb2ludGVyLgotCShkZW1hbmdsZV9jbGFzc19uYW1lKTogSWYgY29uc3VtZV9jb3VudCBkaWRuJ3QgZmluZCBhIGNvdW50LCBkbwotCW5vdGhpbmcuICBEb24ndCBib3RoZXIgd2l0aCBgc3RybGVuJyBzYW5pdHkgY2hlY2s7IGNvbnN1bWVfY291bnQKLQlkb2VzIGl0IGZvciB1cy4KLQotMTk5OS0wMy0xNiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JRnJvbSBBcnQgSGFhcyAgPGFoYWFzQG5lb3NvZnQuY29tPjoKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBEb24ndCBncmFiIGFsbCB0aGUgJ19fJyBzdHJpbmdzCi0Jd2hlbiBkb2luZyBhcm0gb3IgaHAgc3R5bGUuCi0JKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogRGVjciBmb3JnZXR0aW5nX3R5cGVzIGZpZWxkIHdoZW4gZG9uZS4KLQotVGh1IE1hciAxMSAwMToyMjo1OCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGV4ZWN1dGUuYyAoX19DWUdXSU4zMl9fKTogUmVuYW1lIHRvCi0JKF9fQ1lHV0lOX18pOiB0aGlzLgotCSogeG1hbGxvYy5jOiBMaWtld2lzZS4KLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBpMzg2LXBjLXV3aW4uCi0JKiBjb25maWd1cmUuaW4gKCotKi11d2luKik6IFdvcmthcm91bmQgZm9yIHZmb3JrIGJ1Zy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKTogQmUgbGlrZSBzdGFuZGFyZCBVbml4LgotCShwd2FpdCk6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IERlZmluZS4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogVXNlLgotCSh4bWFsbG9jKTogVXNlLgotCi1UaHUgTWFyIDExIDAxOjA3OjU1IDE5OTkgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBjb25maWcudGFibGU6IENsZWFudXAgYW5kIGFkZCBtaC0qcGljIGhhbmRsaW5nIGZvciBhbHBoYSwgYXJtLCBwb3dlcnBjCi0KLVN1biBGZWIgMjggMjI6MzA6NDQgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDaGVjayBjeWd3aW4qLCBub3QgY3lnd2luMzIqLgotCi1UdWUgRmViICA5IDE2OjM5OjAxIDE5OTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBta3N0ZW1wIC0+IG1rc3RlbXBzLgotCi1UdWUgRmViICA5IDAxOjEyOjI3IDE5OTkgIE1hcmMgRXNwaWUgPE1hcmMuRXNwaWVAbGlhZmEuanVzc2lldS5mcj4KLQotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IHJlbW92ZSBta3N0ZW1wLm8KLQkqIGNvbmZpZ3VyZS5pbiAoZnVuY3MpOiBDaGVjayBmb3IgYW5kIGNvbmRpdGlvbmFsbHkgYWRkIG1rc3RlbXBzIHRvCi0JdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBGZWIgIDMgMDA6MDE6MTUgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNsb2NrLmMgKEhaKTogRGVmaW5lIGluIHRlcm1zIG9mIChJU08gQykgQ0xPQ0tTX1BFUl9TRUMgb24KLQlwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIEhaLgotCSogZ2V0cnVudGltZS5jIChIWik6IExpa2V3aXNlLgotCi1TYXQgSmFuIDMwIDEzOjI4OjA0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh4c3RyZHVwLm8pOiBEZXBlbmQgb24gY29uZmlnLmguCi0KLVdlZCBKYW4gMTMgMDc6MjY6NDQgMTk5OSAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50IHRvIE5VTEwgYWZ0ZXIKLQlmcmVlaW5nIGl0LgotCi1XZWQgSmFuIDEzIDE0OjE2OjM2IDE5OTkgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogeHN0cmR1cC5jICh4c3RyZHVwKTogU3dpdGNoIGZyb20gc3RyY3B5IHRvIG1lbWNweSBmb3Igc3BlZWQuCi0KLVR1ZSBKYW4gIDUgMTU6NTg6MjkgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogZml4IHR5cG8sIHNwbGF5LXRyZWUuYyBpbnN0ZWFkIG9mCi0Jc3BsYXktdHJlZS5vLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi0xOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmFuZG9tLmMgKE5VTEwpOiBEb24ndCByZWRlZmluZSBOVUxMIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIERlYyAyMiAwOTo0MzozNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFyZ3YuYyAoYnVpbGRhcmd2KTogQ2FzdCB0aGUgcmVzdWx0IG9mIGFsbG9jYSBpbiBhc3NpZ25tZW50LgotCi0JKiBjaG9vc2UtdGVtcC5jOiBJbmNsdWRlIHN0ZGxpYi5oLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogUmVtb3ZlIHVudXNlZCBwcm90b3R5cGUuCi0gIAkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogQ29uc3RpZnkgZmlyc3QgcGFyYW1ldGVyLgotICAJKGNvZGVfZm9yX3F1YWxpZmllcik6IEF2b2lkIGEgZ2NjIGV4dGVuc2lvbiwgbWFrZSB0aGUgcGFyYW1ldGVyIGFuCi0gCWludCwgbm90IGEgY2hhci4KLQkoZGVtYW5nbGVfcXVhbGlmaWVyKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IENhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8KLQl1bnNpZ25lZCBjaGFyLgotCShhcm1fcHQpOiBBZGQgcGFyZW5zIGFyb3VuZCBhc3NpZ25tZW50IHVzZWQgYXMgdHJ1dGggdmFsdWUuCi0JKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IENvbnN0aWZ5IHZhcmlhYmxlIGBhcmdzJy4KLQkoZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUpOiBDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlCi0JZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KLQkoZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGknLgotCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBDb25zdGlmeSBwYXJhbWV0ZXIgYGFyZ3MnLgotCUNhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogQWRkIGV4cGxpY2l0IGJyYWNlcyB0bwotIAlhdm9pZCBhbWJpZ3VvdXMgYGVsc2UnLgotCi0JKiBmbm1hdGNoLmMgKGZubWF0Y2gpOiBDaGFuZ2UgdHlwZSBvZiB2YXJpYWJsZXMgYGMnLCBgYzEnLAotIAlgY3N0YXJ0JyBhbmQgYGNlbmQnIHRvIHVuc2lnbmVkIGNoYXIuICBDYXN0IHRoZSBhcmd1bWVudCBvZiBtYWNybwotIAlgRk9MRCcsIHdoaWNoIHVzZXMgY3R5cGUgZnVuY3Rpb25zLCB0byB1bnNpZ25lZCBjaGFyLgotCi0JKiBvYmphbGxvYy5jIChmcmVlKTogQWRkIHByb3RvdHlwZS4KLQotU3VuIERlYyAyMCAxNjowMzo0NiAxOTk4ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLnNlPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogRml4IHR5cG86IHNwbGF5LXRyZWUuYywgbm90IHNwbGF5LXRyZWUubwotCi1GcmkgRGVjIDE4IDE3OjUwOjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogcmVtb3ZlIGRlY2xhcmF0aW9uIC0tIGZ1bmN0aW9uCi0gCWRvZXNuJ3QgZXhpc3QuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBpJy4KLQotRnJpIERlYyAxOCAxNjoxMTo0MyBFU1QgMTk5OCAgQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogUHJvY2VzcyBDViBhbmQgdSBjb2RlcyBiZWZvcmUKLQlidW1waW5nIHRoZSBwb2ludGVyIHdlIHJlYWQgZnJvbS4gQWxzbyBwcmVwZW5kIHRoZXNlIGNvZGVzLAotCWFzIHdlIGRvIGluIG90aGVyIHBsYWNlcy4KLQotMTk5OC0xMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IE1ha2UgdmFyaWFibGUgJ2FyZ3MnIGJlCi0JJ2NvbnN0IGNoYXIgKicgaW4gb3JkZXIgdG8gbWF0Y2ggaXRzIHVzYWdlIHdoZW4gY2FsbGluZyBzaWJsaW5ncy4KLQkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogTWFrZSBmaXJzdCBhcmcgJ2NvbnN0IGNoYXIgKionIGluIG9yZGVyCi0JdG8gbWF0Y2ggdXNhZ2UuCi0KLU1vbiBEZWMgMTQgMDk6NTU6NTAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBEb24ndCBjaGVjayBJTl9HQ0MgYW55bW9yZS4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUpOiBVc2UgYGNvbnN0Jywgbm90IGBDT05TVCcuCi0JKiBtZW1jaHIuYyAobWVtY2hyKTogTGlrZXdpc2UuCi0JKiBtZW1jcHkuYyAobWVtY3B5KTogTGlrZXdpc2UuCi0JKiBtZW1tb3ZlLmMgKG1lbW1vdmUpOiBMaWtld2lzZS4KLQotCSogbWtzdGVtcC5jOiBEb24ndCBjaGVjayBJTl9HQ0MgYW55bW9yZS4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCSogc3BsYXktdHJlZS5jOiBMaWtld2lzZS4KLQotCSogc3RyY2hyLmMgKHN0cmNocik6IFVzZSBgY29uc3QnLCBub3QgYENPTlNUJy4KLQkqIHN0cnJjaHIuYyAoc3RycmNocik6IExpa2V3aXNlLgotCSogc3RydG9sLmMgKHN0cnRvbCk6IExpa2V3aXNlLgotCSogc3RydG91bC5jIChzdHJ0b3VsKTogTGlrZXdpc2UuCi0KLUZyaSBEZWMgIDQgMTM6NTE6MDQgMTk5OCAgRGF2aWQgVGF5bG9yICAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCQkJICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAY3lnbnVzLmNvbT4KLQkJCSAgU3RhbiBTaGVicyAgICAgPHNoZWJzQGN5Z251cy5jb20+Ci0JCQkgIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBjeWdudXMuY29tPgotCQkJICBBbmRyZXMgTWFjTGVvZCA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQkJCSAgU2F0aXNoIFBhaQkgPHBhaUBhcG9sbG8uaHAuY29tPgotCi0JKiBIUCBhQ0MgZGVtYW5nbGluZyBzdXBwb3J0LgotCSogY3BsdXMtZGVtLmMKLQkobWFpbik6IFJlbW92ZSBkZWZhdWx0IHRvIEhQIHN0eWxlIGRlbWFuZ2xpbmcsIHNldCB0byBFREcKLSAJZGVtYW5nbGluZyBjb3JyZWN0bHkgd2hlbiAtZWRnIHNwZWNpZmllZDsgc2V0IHRoZSBkZW1hbmdsaW5nIHN0eWxlCi0gCXdoZW4gdXNlciBzcGVjaWZpZXMgJ2VkZycuIFNldCBzdHJpcF91bmRlcnNjb3JlIHRvCi0gCXByZXBlbmRzX3VuZGVyc2NvcmUsIGlmIG5vdCBIUFVYSFBQQS4gIFNldAotIAljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgdG8gaHBfZGVtYW5nbGluZyBpZiBIUFVYSFBQQS4gIFNldAotIAljdXJyZW50IGRlbWFuZ2xpbmcgc3R5bGUgY29ycmVjdGx5IGlmIHRoZSBzd2l0Y2ggaXMgaHAuICBSZWFkCi0gCWxhYmVsIGNvcnJlY3RseSBhbHNvIGluIHRoZSBIUCBzdHlsZSBjYXNlLgotCSh3b3JrX3N0dWZmKTogYWRkIHRlbXBfc3RhcnQgZmllbGQ7IGFkZCBmaWVsZCBmb3Igdm9sYXRpbGUgbWVtYmVyCi0gCWZ1bmN0aW9uLgotCShhcm1fcHQpOiBoYW5kbGUgQVJNX0RFTUFOR0xJTkcgYW5kIEVER19ERU1BTkdMSU5HIHN0eWxlczsgSFAKLSAJc3R5bGUgZm9yIHRoaXMgY2FzZSBpcyB0aGUgc2FtZSBhcyBBUk0uCi0JKGRlbWFuZ2xlX2FyZ3MpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGU7IHN1cHBvcnQgSFAgc3R5bGUuCi0JKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IG5ldyBmdW5jdGlvbi4gKEl0IHdhcwotIAlkZW1hbmdsZV9hcm1fcHQuKTsgY2hlY2sgYW5kIHNldCB2YWx1ZSBvZiB0ZW1wX3N0YXJ0IGZpZWxkIGluCi0gCW11bHRpcGxlIHBsYWNlcy4gQWxzbywgd2hlbiBjZWNoaW5nIGZvciBlbmQgb2YgdGVtcGxhdGUgYXJncywKLSAJY2hlY2sgdG8gc2VlIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLgotCShkZW1hbmdsZV9jbGFzcyk6IG5ldyBsb2NhbCB2YXJpYWJsZSA6IHNhdmVfY2xhc3NfbmFtZV9lbmQgRG9uJ3QKLSAJaW5jbHVkZSB0ZW1wbGF0ZSBhcmdzIGluIHN0cmluZyBkZWZpbmluZyBjbGFzcy4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IHVzZSBkZW1hbmdlbF9hcm1faHBfdGVtcGxhdGUuCi0JKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBoYW5kbGUgY2FzZSB3aGVyZSBkZW1hbmdsaW5nIHN0eWxlIGlzCi0gCUhQX0RFTUFOR0xJTkcgYW5kIGN1cnJlbnRseSBwb2ludCBhdCBhbiAnWCcgaW4gdGhlIG1hbmdsZWQgbmFtZS4KLSAgCUhhbmRsZSBFREdfREVNQU5HTElORyBzdHlsZS4gIEhhbmRsZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgotIAlvcHMgZm9yIEhQIHN0eWxlLgotCShkZW1hbmdsZV9wcmVmaXgpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgYW5kIEFSTV9ERU1BTkdMSU5HCi0gCXN0eWxlcy4gIGdsb2JhbCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBmb3IgSFAgc3R5bGUgYXJlIHNhbWUKLSAJYXMgZm9yIEFSTSBzdHlsZS4gU2FtZSBmb3IgbG9jYWwgdmFyaWFibGVzLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IGFkZCBjYXNlIGZvciB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICBGb3IKLSAJY2FzZXMgJzEnIC0gJzknIDogaW5pdGlhbGl6ZSB0aGUgdGVtcF9zdGFydCBmaWVsZCB0byAtMSBhbmQgaGFuZGxlCi0gCXRoZSBFREdfREVNQU5HTElORyBzdHlsZS4gIGZvciBjYXNlICdGJyA6IGhhbmRsZSBFREdfREVNQU5HTElORwotIAlhbmQgQVVUT19ERU1BTkdMSU5HIHN0eWxlcy4gIElmIGV4cGVjdGluZyBhIGZ1bmN0aW9uIGFuZCBtYW5hZ2VkCi0gCXRvIGRlbWFuZ2xlIHRoZSBmdW5jdCBhcmdzLCB0aGVuIGhhbmRsZSB0aGUgTFVDSURfREVNQU5HTElORywKLSAJQVJNX0RFTUFOR0xJTkcsIGFuZCBFREdfREVNQU5HTElORyBzdHlsZXMuICBBZGQgY2FzZSBmb3IgbG9jYWwKLSAJY2xhc3MgbmFtZSBhZnRlciAiTG5ubl8gaW4gSFAgc3R5bGUgY2FzZS4gSFAgc3R5bGUgdG9vIG5lZWRzIHRvCi0gCWZvcmdldCB0eXBlcy4gIF9ubm4gaXMgT0sgZm9yIEhQIHN0eWxlLCBzbyBkb24ndCByZXBvcnQgZmFpbHVyZS4KLQkoZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUpOiBuZXcgZnVuY3Rpb24uIEhhbmRsZSB0ZW1wbGF0ZSdzCi0gCXZhbHVlIHBhcmFtIGZvciBIUC9hQ0MuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiBuZXcgZnVuY3Rpb24uICBIYW5kbGUgYSB0ZW1wbGF0ZSdzCi0gCWxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MuCi0JKHJlY3Vyc2l2ZWx5X2RlbWFuZ2xlKTogbmV3IGZ1bmN0aW9uCi0JKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IG5ldyBmdW5jdGlvbi4KLQkodXNhZ2UpOiBhZGQgJ2VkZycgdG8gdGhlIGxpc3Qgb2YgZGVtYW5nbGluZyBzdHlsZXM7IGFkZCBocCBzd2l0Y2gKLSAJdG8gbWVzc2FnZS4KLQotU2F0IE5vdiAyOCAxNzoyNToyMiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBSZW1vdmUgb2Jzb2xldGUgaWZkZWZlZCBjeWd3aW4gY29kZS4KLQotRnJpIE5vdiAyNyAxMzoyNjowNiAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IEFsd2F5cyBpbmNsdWRlIGxpYmliZXJ0eS5oLiAgQXZvaWQgcmVkdW5kYW5jaWVzLgotCSogY3BsdXMtZGVtLmM6IExpa2V3aXNlLiAgQ29uZm9ybSB0byBsaWJpYmVydHkuaC4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCSogc3BsYXktdHJlZS5jOiBMaWtld2lzZS4KLQotMTk5OC0xMS0yNSAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc3BsYXktdHJlZS5vKTogQWRkIGNvbmZpZy5oIGRlcGVuZGVuY3kuCi0KLU1vbiBOb3YgMjMgMTY6NTk6NDkgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiAgY29uZmlndXJlLmluOiBVc2UgQUNfUFJFUkVRKDIuMTIuMSkuCi0KLTE5OTgtMTEtMTYgIEJlbmphbWluIEtvc25payAgPGJrb3pAaGFpZ2h0LmNvbnN0YW50LmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEFkZCBkZW1hbmdsaW5nIGZvciBDOXggdHlwZXMuCi0KLVRodSBOb3YgMTkgMjI6MTU6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtcHcuYyAobXB3X2FjY2Vzcyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KLQotVGh1IE5vdiAxOSAxMjo1OToyMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfU1lTX1dBSVQuCi0KLQkqIHBleGVjdXRlLmM6IEluY2x1ZGUgc3lzL3dhaXQuaCB3aGVuICFJTl9HQ0MuCi0KLVRodSBOb3YgMTkgMTQ6Mzg6MjAgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogcmV2ZXJ0IGJhY2sgdG8gY2hlY2tpbmcgb2xkIEN5Z3dpbgotCXByZXByb2Nlc3NvciBzeW1ib2wgdW50aWwgc29tZSB0aW1lIGhhcyBwYXNzZWQuCi0KLVdlZCBOb3YgMTggMDg6NTI6MjYgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogUmVvcmdhbml6ZSBXSU4zMiBjYXNlIHRvIGFjY29tb2RhdGUgQ3lnd2luCi0Jc2luY2UgaXQgd2lsbCBub3cgc3VwcG9ydCBzaW1pbGFyIGNvbnN0cnVjdHMuCi0KLUZyaSBOb3YgMTMgMTk6MTg6MDUgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBjYWxsb2MuCi0KLQkqIGNhbGxvYy5jOiBOZXcJZmlsZS4KLQotCSogeG1hbGxvYy5jICh4Y2FsbG9jKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgTm92IDEzIDA4OjUxOjQ2IEVTVCAxOTk4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IFVzZSB0aGUgbGFzdCAiX18iCi0JaW4gdGhlIG1hbmdsZWQgbmFtZSB3aGVuIGxvb2tpbmcgZm9yIHRoZSBzaWduYXR1cmUuIFRoaXMgYWxsb3dzCi0JdGVtcGxhdGUgbmFtZXMgdG8gYmVnaW4gd2l0aCAiX18iLgotCi0xOTk4LTExLTA4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBBZGQgdGtfcmVmZXJlbmNlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogSGFuZGxlIGl0LgotCShkb190eXBlKTogVXNlIGl0IGZvciByZWZlcmVuY2VzLCBpbnN0ZWFkIG9mIHRrX3BvaW50ZXIuCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogVXNlIGNwbHVzX2RlbWFuZ2xlLAotCW5vdCBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZS4KLQotU2F0IE5vdiAgNyAxNjowMjoxMCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCi0JKiBta3N0ZW1wLmM6IExpa2V3aXNlLgotCSogcGV4ZWN1dGUuYzogTGlrZXdpc2UuCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLU1vbiBOb3YgIDIgMTA6MjI6MDEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBwZXhlY3V0ZS5jOiBDaGVjayBIQVZFX0NPTkZJR19ILCBub3QgSU5fR0NDLCB3aGVuIGRldGVybWluaW5nCi0gCXdoZXRoZXIgdG8gaW5jbHVkZSBjb25maWcuaC4gIFBvc3NpYmx5IGluY2x1ZGUgdW5pc3RkLmggaW4gdGhlCi0gCSFJTl9HQ0MgY2FzZS4gIERlZmluZSBWRk9SS19TVFJJTkcgYXMgYSBwcmludGFibGUgZnVuY3Rpb24gY2FsbAotIAlmb3IgZXJyb3IgbWVzc2FnZXMgKGVpdGhlciAidmZvcmsiIG9yICJmb3JrIi4pICBJZiBIQVZFX1ZGT1JLX0ggaXMKLSAJZGVmaW5lZCwgaW5jbHVkZSB2Zm9yay5oLiAgSWYgVk1TIGlzIGRlZmluZWQsIGRlZmluZSB2Zm9yaygpCi0gCWFwcHJvcHJpYXRlbHkuICBSZW1vdmUgdmZvcmsgY2hlY2sgb24gVVNHLCB3ZSdyZSB1c2luZyBhdXRvY29uZi4KLSAgCShwZXhlY3V0ZSk6IFNldCBgZXJybXNnX2ZtdCcgdG8gVkZPUktfU1RSSU5HIGluc3RlYWQgb2YgY2hlY2tpbmcKLSAJbG9jYWxseSB3aGF0IHN0cmluZyB0byB1c2UuCi0KLTE5OTgtMTAtMjYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYzogVHdlYWsgaW5jbHVkZSBkaXJlY3RpdmVzIHRvIG1ha2Ugc3VyZSBkZWNsYXJhdGlvbnMgb2YKLQl4bWFsbG9jIGFuZCBmcmVlIGFyZSBhdmFpbGFibGUuCi0KLTE5OTgtMTAtMjUgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IEZpeCBoYW5kbGluZyBvZiB2aXJ0dWFsIHRhYmxlcyBpbgotCWFub255bW91cyBuYW1lc3BhY2VzLgotCi0xOTk4LTEwLTIzICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAod29ya19zdHVmZik6IFJlcGxhY2UgY29uc3RfdHlwZSBhbmQgdm9sYXRpbGVfdHlwZQotCXdpdGggdHlwZV9xdWFscy4KLQkoVFlQRV9VTlFVQUxJRklFRCk6IE5ldyBtYWNyby4KLQkoVFlQRV9RVUFMX0NPTlNUKTogTGlrZXdpc2UuCi0JKFRZUEVfUVVBTF9WT0xBVElMRSk6IExpa2V3aXNlLgotCShUWVBFX1FVQUxfUkVTVFJJQ1QpOiBMaWtld2lzZS4KLQkoY29kZV9mb3JfcXVhbGlmaWVyKTogTmV3IGZ1bmN0aW9uLgotCShxdWFsaWZpZXJfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3F1YWxpZmllcik6IExpa2V3aXNlLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IFVzZSB0aGVtLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IExpa2V3aXNlLgotCShkb190eXBlKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSkpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAyMiAxOTo1ODo0MyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlcik6IE1ha2UgZGVmaW5pdGlvbiBzdGF0aWMKLQl0byBtYXRjaCBwcm90b3R5cGUuCi0KLTE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGl0LgotCShSRVFVSVJFRF9PRklMRVMpOiBMaWtld2lzZS4KLQkoc3BsYXktdHJlZS5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQotVHVlIE9jdCAyMCAxMjoyOTowMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBGaXggb2ZmLWJ5LW9uZSB3aGVuIGNoZWNraW5nCi0JcmFuZ2Ugb2YgJ0snIGluZGV4LgotCi1UaHUgT2N0IDE1IDE4OjUxOjEyIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogUHJvdG90eXBlIG1rc3RlbXBzKCkgd2hlbiBJTl9HQ0MuCi0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0bwotCWB1bnNpZ25lZCBjaGFyJy4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvCi0JYHVuc2lnbmVkIGNoYXInLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogSW5pdGlhbGl6ZSB2YXJpYWJsZSBgYmluZGV4Jy4gIENhc3QgdGhlCi0JcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLiAgUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlIGBzdGFydF9vZl92YWx1ZV9wYXJtJy4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9wcmVmaXgpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZ251X3NwZWNpYWwpOiBMaWtld2lzZS4gIENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZ2V0X2NvdW50KTogTGlrZXdpc2UuCi0JKGRvX3R5cGUpOiBMaWtld2lzZS4gIENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCi0JKiBta3N0ZW1wLmMgKG1rc3RlbXBzKTogQ2FzdCB2YXJpYWJsZSBgbGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCi1UdWUgT2N0IDEzIDIzOjUxOjUxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWtzdGVtcC5jOiBDaGVjayBIQVZFX1NZU19USU1FX0ggYmVmb3JlIGluY2x1ZGluZyBzeXMvdGltZS5oCi0JKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaCB0b28uCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotCSogZ2V0b3B0LmM6IENoZWNrIEhBVkVfU1RSSU5HU19IIGJlZm9yZSBpbmNsdWRpbmcgc3RyaW5ncy5oLgotCSogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN0cmluZ3MuaCB0b28uCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE9jdCAxMiAxOToxNTo1OSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGluIGNvbW1lbnQsIGNhbGwgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhUCi0KLVN1biBPY3QgMTEgMTc6MzY6MDYgMTk5OCAgTWljaGFlbCBUaWVtYW5uICA8dGllbWFubkBob2xvZGVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8sIG9ic3RhY2subyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCi1UaHUgT2N0ICA4IDIzOjQyOjA4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgZWdjcyAmIGRldm8gbGliaWJlcnR5LgotCi0xOTk4LTA5LTA4ICBNYXJ0aW4gdm9uIEz2d2lzICA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogRGVtYW5nbGUgYW5vbnltb3VzIG5hbWVzcGFjZXMuCi0KLU1vbiBTZXAgIDcgMjM6Mjk6MDEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBta3N0ZW1wLmM6IEluY2x1ZGUgY29uZmlnLmggZXZlbiB3aGVuIG5vdCBJTl9HQ0MuICBXcmFwIGhlYWRlcgotIAlpbmNsdXNpb25zIGluc2lkZSBIQVZFXypfSCBtYWNyb3MuICBJbmNsdWRlIGFuc2lkZWNsLmggd2hlbiBub3QKLSAJSU5fR0NDLgotCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSBzdGRhcmcuaC92YXJhcmdzLmggZmlyc3QuCi0KLQkqIHZwcmludGYuYzogTGlrZXdpc2UuCi0KLVNhdCBTZXAgIDUgMDM6MjQ6NDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwZXhlY3V0ZS5jOiBVcGRhdGVzIGZyb20gZ2NjLiAgQ29weSBpbiBnY2MgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoaXMKLQlpcyB0aGUgY2Fub25pY2FsIGNvcHkuICBEZWZpbmUgSVNTUEFDRSBpZiAhSU5fR0NDLgotCSogYWxsb2NhLmMsIHZmcHJpbnRmLmMsIGNob29zZS10ZW1wLmMsIG1rc3RlbXAuYywgZ2V0b3B0LmM6IFNpbWlsYXJseS4KLQkqIGdldG9wdDEuYywgb2JzdGFjay5jOiBTaW1pbGFybHkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgbWtzdGVtcC5vCi0KLVR1ZSBTZXAgIDEgMjM6MTI6NDcgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGFzcHJpbnRmIGluIGxpc3Qgb2YgZnVuY3Rpb25zIGtub3duIG5vdAotCXRvIGJlIGluIG5ld2xpYi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAxOSAxNDowNTowMSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKHdvcmtfc3R1ZmYpOiBBZGQgZGxsaW1wb3J0ZWQuCi0JKGRlbWFuZ2xlZF9wcmVmaXgpOiBNYXJrIHN5bWJvbHMgaW1wb3J0ZWQgZnJvbSBQRSBETEwuCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlZCk6IEhhbmRsZS4KLQotMTk5OC0wOC0xNyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEZpeCBzaW1wbGUgYXJyYXkgaGFuZGxpbmcuICBJZiB3ZSBmYWlsLAotCXN0YXkgZmFpbGVkLgotCi1Nb24gQXVnIDE3IDEwOjQwOjM0IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgY29uZmlnLmggaWYgaXQgZXhpc3RzLiAgQWxzbywgb25seQotCXByb3RvdHlwZSBtYWxsb2MvcmVhbGxvYyBpZiB3ZSBjYW4ndCBnZXQgc3RkbGliLmguCi0KLVNhdCBBdWcgMTUgMTY6MTU6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN3aXRjaCBiYWNrIHRvIGNoZWNraW5nIC0td2l0aC10YXJnZXQtc3ViZGlyIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIGNoZWNrIGZvciBuZXdsaWIsIHVuZG9pbmcgcGFydCBvZiBKdWx5IDE1Ci0JY2hhbmdlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDEzIDE2OjQ3OjM4IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IE5ldyB0eXBlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogQWRkIHR5cGVfa2luZF90IHBhcmFtZXRlci4gIFJlbHkKLQlvbiB0aGlzIHBhcmFtdGVyLCByYXRoZXIgdGhhbiBkZW1hbmdsaW5nIHRoZSB0eXBlIGFnYWluLgotCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IFBhc3MgdGtfaW50ZWdyYWwuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlXzogUGFzcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBkb190eXBlLgotCShkb190eXBlKTogUmV0dXJuIGEgdHlwZV9raW5kX3QuICBQYXNzIHRrX2ludGVncmFsIHRvCi0JZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXkgYm91bmRzLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBMaWtld2lzZS4KLQotCUFsc28gaW5jb3Jwb3JhdGUgZnJvbSBHQ0MgdmVyc2lvbjoKLQotCVR1ZSBKdWwgMjEgMTM6Mjg6MTkgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IFVzZSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheXMuCi0KLVRodSBBdWcgMTMgMTY6NDc6MzggMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBNYWtlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlzdGF0aWMgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZS4KLQotVHVlIEp1bCAyOCAxMTozMzowOSAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBOZXcgdHlwZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEFkZCB0eXBlX2tpbmRfdCBwYXJhbWV0ZXIuICBSZWx5Ci0Jb24gdGhpcyBwYXJhbXRlciwgcmF0aGVyIHRoYW4gZGVtYW5nbGluZyB0aGUgdHlwZSBhZ2Fpbi4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBQYXNzIHRrX2ludGVncmFsLgotCShkZW1hbmdsZV90ZW1wbGF0ZV86IFBhc3MgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZG9fdHlwZS4KLQkoZG9fdHlwZSk6IFJldHVybiBhIHR5cGVfa2luZF90LiAgUGFzcyB0a19pbnRlZ3JhbCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5IGJvdW5kcy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLQlBbHNvIGluY29ycG9yYXRlIGZyb20gR0NDIHZlcnNpb246Ci0KLQlUdWUgSnVsIDIxIDEzOjI4OjE5IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBVc2UgZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXlzLgotCi1Nb24gSnVsIDI3IDEyOjE2OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTE9DQSk6IE5ldyB2YXJpYWJsZS4KLQkoJChUQVJHRVRMSUIpKTogQWRkICQoQUxMT0NBKSB0byBsaWJyYXJ5LgotCShuZWVkZWQtbGlzdCk6IEFkZCAkKEFMTE9DQSkuCi0JKCQoQUxMT0NBKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQotU3VuIEp1bCAxOSAwODoyMzoxNyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE1ha2UgZnVuY3Rpb24gZGVmaW5pdGlvbgotCXN0YXRpYyB0byBtYXRjaCB0aGUgcHJvdG90eXBlLgotCi1XZWQgSnVsIDE1IDAwOjEyOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayAtLXdpdGgtY3Jvc3MtaG9zdCByYXRoZXIgdGhhbgotCS0td2l0aC10YXJnZXQtc3ViZGlyIHdoZW4gZGVjaWRpbmcgd2hldGhlciBidWlsZCB1c2VzIGEgY3Jvc3MKLQljb21waWxlciwgYW5kIHdoZW4gZGVjaWRpbmcgd2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIEp1bCAxMiAwMToyNzowNSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IFJldHVybiBhIHZhbHVlLgotCi1TYXQgSnVsIDExIDE2OjE5OjQ4IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChzdHJpbmcpOiBNb3ZlIGRlZmluaXRpb24gYmVmb3JlIHdvcmtfc3R1ZmYuCi0JKHdvcmtfc3R1ZmYpOiBBZGQgdm9sYXRpbGVfdHlwZSwgZm9yZ2V0dGluZ190eXBlcywKLQlwcmV2aW91c19hcmd1bWVudCwgYW5kIG5yZXBlYXRzIGZpZWxkcy4KLQkoU0NPUEVfU1RSSU5HKTogTmV3IG1hY3JvLgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEFkZCBgcmVtZW1iZXInIHBhcmFtZXRlci4gIEFkZCBjb21tZW50LgotCVJlZ2lzdGVyIHRoZSBgQicgY29kZSB0eXBlIGhlcmUsIGlmIHJlbWVtYmVyaW5nLiAgVGlkeS4gIEZpeCBjcmFzaAotCW9uIE5VTEwgdG1wbF9hcmd2ZWMuICBCZSBjb25zaXN0ZW50IHdpdGggdXNlIG9mIHRuYW1lL3RyYXduYW1lLgotCShkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE5ldyBmdW5jdGlvbi4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBIYW5kbGUgdm9sYXRpbGUtcXVhbGlmaWVkIG1lbWJlcgotCWZ1bmN0aW9ucy4KLQkobW9wX3VwKTogRGVsZXRlIHRoZSBwcmV2aW91c19hcmd1bWVudCBzdHJpbmcgaWYgcHJlc2VudC4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogVGlkeS4gIEhhbmRsZSB2b2xhdGlsZS1xdWFsaWZpZWQgbWVtYmVyCi0JZnVuY3Rpb25zLiAgSGFuZGxlIGJhY2stcmVmZXJlbmNlcyB1c2luZyB0aGUgYEInIGNvZGUuICBVc2UgZXh0cmEKLQlwYXJhbWV0ZXIgdG8gZGVtYW5nbGVfdGVtcGxhdGUgYW5kIFNDT1BFX1NUUklORyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEZpeCB0aGlua287ICdCJyBpcyBub3QgYW4gaW50ZWdyYWwKLQljb2RlLgotCShkZW1hbmdsZV9jbGFzcyk6IFVzZSBTQ09QRV9TVFJJTkcuCi0JKGdudV9zcGVjaWFsKTogUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGRlbWFuZ2xlX3RlbXBsYXRlLgotCVVzZSBTQ09QRV9TVFJJTkcuCi0JKGRlbWFuZ2xlX3F1YWxpZmllZCk6IFNhdmUgcXVhbGlmaWVkIHR5cGVzIGZvciBsYXRlcgotCWJhY2stcmVmZXJlbmNlcy4gIEhhbmRsZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZQotCXR5cGVzIGNvcnJlY3RseS4KLQkoZG9fdHlwZSk6IFRpZHkuICBVc2UgU0NPUEVfU1RSSU5HLiAgUGFzcyBleHRyYSBhcmd1bWVudCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlLiAgVXNlIGRlbWFuZ2xlZF9uZXN0ZWRfYXJncy4gIERvbid0IHJlbWVtYmVyCi0JcXVhbGlmaWVkIHR5cGVzIGhlcmU7IHRoYXQncyBub3cgZG9uZSBpbiBkZW1hbmdsZV9xdWFsaWZpZWQuCi0JU2ltaWxhcmx5IGZvciB0ZW1wbGF0ZXMuCi0JKGRvX2FyZyk6IEltcHJvdmUgY29tbW1lbnQuICBIYW5kbGUgJ24nIHJlcGVhdCBjb2RlLgotCShyZW1lbWJlcl90eXBlKTogQ2hlY2sgZm9yZ2V0dGluZ190eXBlcy4KLQkoZGVtYW5nbGVfYXJncyk6IERlYWwgd2l0aCAnbicgcmVwZWF0IGNvZGVzLiAgVGlkeS4KLQotVGh1IEp1bCAgMiAxNjoyNjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogT25seSB1c2UgbWgtZmJzZDIxIG9uICotKi1mcmVlYnNkMi4yLlswMTJdLCBub3Qgb24KLQkqLSotZnJlZWJzZDIuMi4qLiAgRnJvbSBEbWl0cmlqIFRlamJsdW0gPHRlamJsdW1AYXJjLmhxLmN0aS5ydT4uCi0KLU1vbiBKdW4gMTUgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNldG9ianMpOiBDb3JyZWN0IHF1b3RpbmcgZXJyb3IgaW4gY3lnd2luMzIgY2FzZS4KLQlGcm9tIENocmlzIEZheWxvciA8Y2dmQGN5Z251cy5jb20+LgotCi1Nb24gSnVuICAxIDEzOjQ3OjU1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLU1vbiBKdW4gIDEgMTQ6MTc6MzYgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGEgZGVwZW5kZW5jeSBvbiBzdGFtcC1waWNkaXIgZm9yIHRoZQotCW9iamVjdHMsIHNvIHRoYXQgd2UgY2FuIGRvIGEgcGFyYWxsZWwgYnVpbGQuCi0KLVNhdCBNYXkgMzAgMjI6MTc6MTMgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY2hlY2tmdW5jcyk6IEFkZCBtaXNzaW5nICInIi4KLQotRnJpIE1heSAyOSAxMjo0MDo0MSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChfb2JzdGFja19tZW1vcnlfdXNlZCk6ICBFbGlkZSB0aGlzIGZ1bmN0aW9uIGlmIHdlJ3JlCi0Jb24gYSBzeXN0ZW0gd2l0aCBHTlUgbGliYy4KLQotVHVlIE1heSAyNiAxODoyODo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQotVHVlIE1heSAyNiAxNTowMTo1MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBhbGxvY2EtY29uZi5oLgotCi1GcmkgTWF5IDIyIDAxOjM4OjA3IDE5OTggIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuc2U+Ci0KLQkqIGNwbHVzLWRlbS5jIChNQlVGX1NJWkUpOiBCdW1wZWQgZnJvbSA1MTIgdG8gMzI3NjcuCi0KLTE5OTgtMDUtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtbWl0Y2hlbGxAdXNhLm5ldD4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgdm9sYXRpbGUgcXVhbGlmaWNhdGlvbi4KLQotMTk5OC0wNS0yMSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB1bmlzdGQuaCBhcyB3ZWxsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZ2V0cGFnZXNpemUuYyAoR05VX09VUl9QQUdFU0laRSk6IFVzZSBzeXNjb25mIG9ubHkgaWYgX1NDX1BBR0VTSVpFCi0JaXMgZGVmaW5lZCBpbiB1bmlzdGQuaC4gUmVmb3JtYXQgY29uZGl0aW9uYWwgYmxvY2sgZm9yIGVhc2llciByZWFkaW5nLgotCi0JKiBjb25maWcudGFibGUgKHNoYXJlZCk6IERlZmF1bHQgdG8gbm8gaWYgJHtlbmFibGVfc2hhcmVkfQotCWlzIHVuc2V0IG9yIGVtcHR5OyB0aGlzIGxvZ2ljIGlzIHVzZWQgYnkgdGhlIHRvcGxldmVsCi0JY29uZmlndXJlIHNjcmlwdHMsIHRvby4KLQotU2F0IE1heSAxNiAxNDowMToyNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIGxpbmUgdG8gc2V0IGVuYWJsZV9zaGFyZWQgaW4gdGhlIE1ha2VmaWxlCi0JYXMgbmVlZGVkLgotCi1XZWQgTWF5IDEzIDE0OjI0OjM4IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKHNxdWFuZ2xlX21vcF91cCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IFJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyIGBvcHRpb25zJy4KLQlBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBSZW1vdmUgZnVuY3Rpb24gd2lkZSB2YXJpYWJsZSBgaW50IGknIGFuZAotCXJlcGxhY2Ugd2l0aCBgc2l6ZV90IGknIGF0IGVhY2ggbG9jYXRpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IGNoYW5nZSB0eXBlIG9mIGBpJyBmcm9tIGludCB0byBzaXplX3QuCi0KLVdlZCBNYXkgMTMgMTM6Mzk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbGxvY2EtY29uZi5oOiBJbmNsdWRlIGNvbmZpZy5oLiAgQ2hlY2sgSEFWRV9BTExPQ0FfSCByYXRoZXIKLQl0aGFuIHNwYXJjIG9yIHN1bi4KLQkqIE1ha2VmaWxlLmluIChhcmd2Lm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaCBhbmQgYWxsb2NhLWNvbmYuaC4KLQotRnJpIE1heSAgOCAwMDoyMzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYmliZXJ0eV90b3BkaXIgY29ycmVjdGx5IHdoZW4gc3JjZGlyIGlzCi0JIi4iIGFuZCB3aXRoX3RhcmdldF9zdWJkaXIgaXMgbm90IHNldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1heSAgNyAxMzowMTo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICotKi1taW5ndzMyKiBjYXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgTWF5ICA2IDExOjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBOZXZlciB1c2UgYSBQSUMgZmlsZSBmb3IgKi0qLWN5Z3dpbjMyKi4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBjb25maWcudGFibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYSBjeWd3aW4zMiBob3N0LCBhbHdheXMgY29tcGlsZSByYW5kb20sIGFuZAotCWRvbid0IHRlc3QgZm9yIHN5c19zaWdsaXN0LCBzdHJzaWduYWwsIG9yIHBzaWduYWwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNsb2NrLmM6IENoZWNrIEhBVkVfU1lTX1BBUkFNX0ggcmF0aGVyIHRoYW4gTk9fU1lTX1BBUkFNX0guCi0JKiBnZXRjd2QuYzogTGlrZXdpc2UuCi0JKiBnZXRwYWdlc2l6ZS5jOiBMaWtld2lzZS4KLQkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgIDUgMTg6MDg6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JVXNlIGF1dG9jb25mIHRlc3RzIHJhdGhlciB0aGFuIHRoZSBvbGQgZHVtbXkuYyB0ZXN0OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX1dJVEggY2FsbHMgZm9yIC0td2l0aC10YXJnZXQtc3ViZGlyIGFuZAotCS0td2l0aC1uZXdsaWIuICBBZGQgQUNfQ09ORklHX0hFQURFUi4gIFVzZSBBQ19SRVBMQUNFX0ZVTkNTIGZvcgotCW1vc3QgZnVuY3Rpb25zLiAgQWRkIHNwZWNpYWwgY2FzZXMgdG8gaGFuZGxlIG5ld2xpYiBhbmQgVnhXb3Jrcy4KLQlSZW1vdmUgdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBDcmVhdGUgc3RhbXAtaCBpbiBBQ19PVVRQVVQgaWYKLQlDT05GSUdfSEVBREVSUyBpcyBzZXQuICBPbmx5IGNhbGwgY29uZmlnLW1sLmluIGluIEFDX09VVFBVVCBpZgotCUNPTkZJR19GSUxFUyBpcyBzZXQ7IHNldCBhY19maWxlIGJlZm9yZSBjYWxsaW5nIGl0LgotCSogY29uZmlnLnRhYmxlIChhcm0tKi1yaXNjaXgqLCAqLSotY3lnd2luMzIpOiBSZW1vdmUuCi0JKCotKi1ocHV4KiwgKi0qLWhpdXgqLCAqLSotaXJpeDQqLCAqLSotc29sYXJpczIqKTogUmVtb3ZlLgotCSgqLSotc3lzdjQqLCAqLSotZ28zMiwgKi0qLXZ4d29ya3M1KiwgKi0qLXZ4d29ya3MpOiBSZW1vdmUKLQkoaVszNDU2XS0qLW1pbmd3MzIqKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4gKEVSUk9SU19DQywgQ09ORklHX0gsIE5FRURFRF9MSVNUKTogUmVtb3ZlLgotCShMSUJPQkpTKTogTmV3IHZhcmlhYmxlLgotCShIT1NUX09GSUxFUywgRE9fQUxTTywgU1RBR0VTVFVGRik6IFJlbW92ZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gbmVlZGVkLWxpc3QuICBEb24ndCBjaGVjayBSVUxFMS4KLQkoQHRhcmdldF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQ09NUElMRS5jKTogSW5jbHVkZSBAREVGU0AuCi0JKEhGSUxFUyk6IEFkZCBhbGxvY2EtY29uZi5oLgotCShSRVFVSVJFRF9PRklMRVMpOiBSZW1vdmUgYmFzZW5hbWUuby4KLQkoJChUQVJHRVRMSUIpKTogTmV3IHRhcmdldC4KLQkoc3RhbXAtbmVlZGVkLCBsbmVlZGVkLWxpc3QsIG5lZWRlZC5hd2ssIHN0YW1wLWNvbmZpZyk6IFJlbW92ZS4KLQkobGNvbmZpZy5oLCBuZWVkZWQyLmF3aywgZHVtbXkubywgZXJyb3JzKTogUmVtb3ZlLgotCShuZWVkZWQtbGlzdCwgY29uZmlnLmgpOiBSZXdyaXRlLgotCShSVUxFMSwgJChSVUxFMSksIFJVTEUyLCAkKFJVTEUyKSk6IFJlbW92ZS4KLQkoLmFsd2F5cy4pOiBSZW1vdmUuCi0JKE1ha2VmaWxlKTogU2V0IENPTkZJR19GSUxFUyBhbmQgQ09ORklHX0hFQURFUlMuCi0JKHN0YW1wLWgpOiBOZXcgdGFyZ2V0LgotCShhdGV4aXQubywgY2xvY2subywgZ2V0Y3dkLm8sIGdldHBhZ2VzaXplLm8pOiBOZXcgdGFyZ2V0cy4KLQkoYmFzZW5hbWUubyk6IERvbid0IGRlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShnZXRydW50aW1lLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkqIGF0ZXhpdC5jOiBJbmNsdWRlIGNvbmZpZy5oLiAgQ2hlY2sgSEFWRV9PTl9FWElUIHJhdGhlciB0aGFuCi0JTkVFRF9vbl9leGl0LgotCSogYmFzZW5hbWUuYzogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4gIERvbid0IGNoZWNrIE5FRURfYmFzZW5hbWUuCi0JKiBjbG9jay5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCSogZ2V0Y3dkLmM6IExpa2V3aXNlLgotCSogZ2V0cGFnZXNpemUuYzogTGlrZXdpc2UuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLiAgRml4IGNoZWNrcyB3aGljaCBzZXQgSEFWRV9HRVRSVVNBR0UgYW5kCi0JSEFWRV9USU1FUy4KLQkqIHN0cmVycm9yLmM6IENoYW5nZSB1c2VzIG9mIE5FRURfc3lzX2Vycmxpc3QgdG8KLQlIQVZFX1NZU19FUlJMSVNULiAgTGlrZXdpc2UgZm9yIE5FRURfc3RyZXJyb3IgYW5kIEhBVkVfU1RSRVJST1IuCi0JKiBzdHJzaWduYWwuYzogTGlrZXdpc2UgZm9yIE5FRURfc3lzX3NpZ2xpc3QgYW5kIEhBVkVfU1lTX1NJR0xJU1QsCi0JYW5kIGZvciBORUVEX3N0cnNpZ25hbCBhbmQgSEFWRV9TVFJTSUdOQUwgYW5kIGZvciBORUVEX3BzaWduYWwgYW5kCi0JSEFWRV9QU0lHTkFMLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBkdW1teS5jOiBSZW1vdmUuCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtY3h1eDcgKEhERUZJTkVTKTogUmVtb3ZlIC1ESEFWRV9TWVNDT05GLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhERUZJTkVTKTogUmVtb3ZlLgotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtZ28zMjogUmVtb3ZlLgotCSogY29uZmlnL21oLWlyaXg0OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtcmlzY2l4OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1taW5ndzMyOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtdnh3b3JrczU6IFJlbW92ZS4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGdlbmVyYXRlZCB1c2luZyBhdXRvaGVhZGVyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWF5ICA0IDEzOjAwOjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogR2VuZXJhdGUgdXNpbmcgYXV0b2NvbmYuCi0JKiBjb25maWcvbWgtYTY4YnNkOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtYXBvbGxvNjg6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1ocGJzZDogUmVtb3ZlLgotCSogY29uZmlnL21oLW5jcjMwMDA6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtYWl4IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtY3h1eDcgKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taC1pcml4NCAoQ0MsIFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taC1zeXN2NCAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnLnRhYmxlOiBDaGFuZ2UgY29uZmlnX3NoZWxsIHRvIENPTkZJR19TSEVMTCwgYW5kIHVzZQotCWxpYmliZXJ0eV90b3BkaXIgdG8gZmluZCBtb3ZlLWlmLWNoYW5nZS4KLSAJKG02OGstYXBvbGxvLWJzZCosIG02OGstYXBvbGxvLXN5c3YqKTogUmVtb3ZlLgotCShpWzM0NTZdODYtbmNyLXN5c3Y0KiwgKi0qLWRndXgqLCBocHBhKi1ocC1ic2QqKTogUmVtb3ZlLgotCSgqLSotaXJpeCosICotKi1tODhrYmNzKiwgKi0qLXN5c3YqKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4gKHNyY2Rpcik6IFNldCB0byBAc3JjZGlyQC4KLQkoVlBBVEgpOiBMaWtld2lzZS4KLQkocHJlZml4LCBleGVjX3ByZWZpeCwgYmluZGlyLCBsaWJkaXIpOiBTZXQgdG8gYXV0b2NvbmYgdmFyaWFibGVzLgotCShTSEVMTCwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBMaWtld2lzZS4KLQkoQ0MsIENGTEFHUywgUkFOTElCKSk6IExpa2V3aXNlLgotCShkYXRhZGlyLCBtYW4qZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLCBNQUtFSU5GTyk6IFJlbW92ZS4KLQkodGFyZ2V0X21ha2VmaWxlX2ZyYWcsIGhvc3RfbWFrZWZpbGVfZnJhZyk6IEFkZCBzdWJzdGl0dXRpb25zLgotCShJTlNUQUxMX0RFU1QpOiBTZXQgdG8gQElOU1RBTExfREVTVEAuCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cy4gIERvbid0IGRlcGVuZCB1cG9uCi0JJChob3N0X21ha2VmaWxlX2ZyYWcpIG9yICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpLgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQotU3VuIE1heSAgMyAxNzo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC1zdW5vczQ6IFJlbW92ZS4gIFNob3VsZCBiZSBoYW5kbGVkIGJ5IC0td2l0aC1oZWFkZXJzCi0JYW5kIC0td2l0aC1saWJyYXJpZXMgb3B0aW9ucyBhdCB0b3AgbGV2ZWwuCi0JKiBjb25maWcudGFibGU6IE5ldmVyIHVzZSBtdC1zdW5vczQuCi0KLQkqIGFsbG9jYS1jb25mLmg6IE5ldyBmaWxlLCBjb21iaW5pbmcgYWxsb2NhLW5vcm0uaCBhbmQKLQlhbGxvY2EtYm90Y2guaC4KLQkqIGFsbG9jYS1ub3JtLmg6IFJlbW92ZS4KLQkqIGFsbG9jYS1ib3RjaC5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmUuaW46IFNldCBzaGVsbCB2YXJpYWJsZXMgZmlsZXMgYW5kIGxpbmtzIHRvIGVtcHR5LgotCSogY29uZmlnLnRhYmxlOiBEb24ndCBzZXQgc2hlbGwgdmFyaWFibGUgZmlsZXMuCi0JKiBjb25maWd1cmUuYmF0OiBEb24ndCBjcmVhdGUgYWxsb2NhLWNvbmYuaC4KLQkqIG1ha2VmaWxlLnZtczogTGlrZXdpc2UuCi0JKiBtcHctY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIHZtc2J1aWxkLmNvbTogTGlrZXdpc2UuCi0KLUZyaSBNYXkgIDEgMTE6NDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChIT1NUX09GSUxFUykgJChSRVFVSVJFRF9PRklMRVMpKTogUmVtb3ZlIG9sZAotCXRhcmdldCBkZXBlbmRpbmcgdXBvbiBjb25maWcuaC4KLQkoYWxsb2NhLm8pOiBBZGQgdGFyZ2V0IGRlcGVuZGluZyB1cG9uIGNvbmZpZy5oCi0JKGJhc2VuYW1lLm8sIGNob29zZS10ZW1wLm8sIGZubWF0Y2gubyk6IExpa2V3aXNlLgotCShnZXRvcHQubywgZ2V0b3B0MS5vLCBwZXhlY3V0ZS5vLCBzdHJlcnJvci5vKTogTGlrZXdpc2UuCi0JKHN0cnNpZ25hbC5vLCB4c3RyZXJyb3Iubyk6IExpa2V3aXNlLgotCi1GcmkgTWF5ICAxIDA0OjI2OjI1IDE5OTggIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogIEluaXRpYWxpemUgd29yay4KLQotTW9uIEFwciAyNyAxNTo1MzozMCBFRFQgMTk5OCBBbmRyZXcgTWFjTGVvZCA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6IFJlcGxhY2UgbWlzc2luZyBlbHNlLgotCi1TdW4gQXByIDI2IDE1OjM4OjUwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBGaXggb2ZmLWJ5LW9uZSBidWcgd2hlbiBjaGVja2luZyB0aGUKLQlsZW5ndGggaW4gdGhlIG5hbWUgb2YgYSB2aXJ0dWFsIHRhYmxlLgotCi1XZWQgQXByIDIyIDEwOjUzOjQ5IEVEVCAxOTk4IEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHN0cnVjdCB3b3JrIHN0dWZmKTogQWRkIGZpZWxkIGZvciBCIGFuZCBLIG1hbmdsZSBjb2Rlcy4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2FsbCBtb3BfdXBfc3F1YW5nbGUuCi0JKGNwbHVzX2RlbWFuZ2xlKTogSW5pdGlhbGl6ZSBzcXVhbmdsZSBpbmZvLCB0aGVuIGNhbGwKLQlpbnRlcm5hbF9jcGx1c19kZW1hbmdsZS4gKE1vc3QgY29kZSBtb3ZlZCB0aGVyZSBhcyB3ZWxsKQotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IE5ldyBmdW5jdGlvbiwgcGVyZm9ybXMgbW9zdCBvZiB3aGF0IHVzZQotCXRvIGJlIGRvbmUgaW4gY3BsdXNfZGVtYW5nbGUsIGJ1dCBpcyBvbmx5IGNhbGxlZCB3aXRoIHRoaXMgZmlsZS4KLQkoc3F1YW5nbGVfbW9wX3VwKTogTmV3IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIEIgYW5kIEsgY29kZSBkYXRhLgotCShtb3BfdXApOiBzZXQgcG9pbnRlcnMgdG8gTlVMTCBhZnRlciBmcmVlaW5nLgotCShkZW1hbmdsZV9zaWduYXR1cmUsIGRlbWFuZ2xlX3RlbXBsYXRlLCBkZW1hbmdsZV9jbGFzcyk6IEFkZAotCXN3aXRjaCBlbGVtZW50cyB0byBoYW5kbGUgSyBhbmQgQiBjb2Rlcy4KLQkoZGVtYW5nbGVfcHJlZml4LCBnbnVfc3BlY2lhbCwgZGVtYW5nbGVfcXVhbGlmaWVkKTogQWRkCi0JY29kZSB0byBoYW5kbGUgSyBhbmQgQiBjb2Rlcy4KLQkoZG9fdHlwZSwgZGVtYW5nbGVfZnVuZF90eXBlKTogSGFuZGxlIEIgYW5kIEsgY29kZXMuCi0JKHJlbWVtYmVyX0t0eXBlKTogTmV3IGZ1bmN0aW9uIHRvIHN0b3JlIEsgaW5mby4KLQkocmVnaXN0ZXJfQnR5cGUsIHJlbWVtYmVyX0J0eXBlKTogTmV3IGZ1bmN0aW9ucyBmb3IgQiBjb2Rlcy4KLQkoZm9yZ2V0X0JfYW5kX0tfdHlwZXMpOiBOZXcgZnVuY3Rpb24gdG8gZGVzdHJveSBCIGFuZCBLIGluZm8uCi0KLUZyaSBBcHIgMTAgMDE6NDk6MTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLkxJQiwgY2hvb3NlLXRlbXAuYywgY3BsdXMtZGVtLmM6IFN5bmMgd2l0aCBlZ2NzICYgZ2NjLgotCi1UaHUgTWFyICA1IDA5OjIzOjI4IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlnLnRhYmxlOiBNYWtlIGxvY2F0aW5nIGZyYWcgZmlsZXMgZmFpbHNhZmUgZXZlbiBmb3IgdGhlCi0Jc3BlY2lhbCBjYXNlIGlmIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBpbiBzcmNkaXIuCi0KLU1vbiBGZWIgMjMgMTQ6MzM6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jOiBGaXggaGFuZGxpbmcgb2Ygc3lzL2ZpbGUuaCB0byB3b3JrIGluIGxpYmliZXJ0eS4KLQotU3VuIEZlYiAyMiAxODowMzoyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IFN5bmMgd2l0aCBjb3B5IGluIGdjYy4KLQotVGh1IEZlYiAxMiAxNjoyOTo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5jOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCSogZ2V0b3B0MS5jOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxNjo1ODozMyAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IERvbid0IGdldCBjb25mdXNlZCBieSAuPGRpZ2l0cz4KLQlzdHJpbmdzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBsZW5ndGhzLgotCi1GcmkgRmViICA2IDAxOjM1OjE3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUcuCi0JKC5jLm8pOiBDaGVjayB2YWx1ZSBvZiBlbmFibGVfc2hhcmVkLCBub3QgUElDRkxBRy4KLQkoc3RhbXAtcGljZGlyKTogRGl0by4KLQotVGh1IEZlYiAgNSAxODo0ODo1NiAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IHJlbW92ZSB2YXNwcmludGYubyBmcm9tIEVYVFJBX09GSUxFUwotCXNpbmNlIGl0IGdldHMgYnVpbHQgYXV0b21hdGljYWxseQotCi1TdW4gRmViICAxIDAyOjUyOjMyIDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlICh2eHdvcmtzIGNvbmZpZ3MpOiBEZWZhdWx0IHRvIFZ4V29ya3MgNS54LCBhcyB0aGF0IGlzCi0JdGhlIGN1cnJlbnRseSBzaGlwcGluZyBPUy4KLQotVHVlIEphbiAyNyAxNjowODoyMCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tIFtSRVFVSVJFX09GSUxFU106IFN5bmNocm9uaXplZCB3aXRoIE1ha2VmaWxlLmluOgotCUFkZCBmbm1hdGNoLm8gYW5kIG9iamFsbG9jLm87IHJlbW92ZSB2YXNwcmludGYuby4KLQlbY29uZmlnLmhdOiBEZWZpbmUgTkVFRF9zdHJzaWduYWwuCi0KLU1vbiBKYW4gMTkgMTI6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBDb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBzdHJlcnJvciBhbmQKLQlzdHJzaWduYWwuICBSZXBvcnRlZCBieSBBbGV4IEd1dG1hbiA8YWd1dG1hbkBlbWMuY29tPi4KLQotU3VuIEphbiAxOCAxNTo1NzoyOCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAoaW50X3Zhc3ByaW50Zik6IEluY3JlYXNlIGJ1ZmZlciBzaXplIGZvciBmbG9hdC9kb3VibGUKLQl2YWx1ZXMuCi0KLVNhdCBKYW4gMTcgMjI6Mjg6MzggMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0JCQkgIEouSi4gVmFuZGVySGVpamRlbiA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JQWRkIG1pbmd3MzIgc3VwcG9ydC4KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKTogTmV3IGZ1bmN0aW9uIGZvciBtaW5ndzMyLiBTdXBwb3J0cyBwaXBlcy4KLQkocHdhaXQpOiBOZXcgZnVuY3Rpb24gZm9yIG1pbmd3MzIuCi0KLQkqIGNvbmZpZy50YWJsZSAoaVszNDU2XTg2LSotbWluZ3czMiopOiBTdXBwb3J0IGZvciBpMzg2LW1pbmd3MzIuCi0JKiBjb25maWcvbXQtbWluZ3czMjogTmV3IGZpbGUuCi0JKiB4bWFsbG9jLmMgKGZpcnN0X2JyZWFrKTogTm90IHVzZWQgZm9yIG1pbmd3MzIuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IERvbid0IHVzZSBzYnJrIG9uIG1pbmd3MzIuCi0JKHhtYWxsb2MpOiBMaWtld2lzZS4KLQkoeHJlYWxsb2MpOiBMaWtld2lzZS4KLQotU2F0IEphbiAxNyAyMjoyODowNSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IFN5bmMgd2l0aCBnY2MgdmVyc2lvbi4KLQotVHVlIEphbiAxMyAxODozNDozOSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpciwgaW5zdGFsbF90b190b29sZGlyKTogQWRkIE1VTFRJU1VCRElSCi0JdG8gYWxsIGZpbGVuYW1lcyBpbiBsaWJkaXIgYW5kIHRvb2xkaXIuCi0JKGRpc3RjbGVhbik6IERvIE1VTFRJQ0xFQU4gYmVmb3JlIGRlbGV0aW5nIE1ha2VmaWxlLgotCShzdGFtcC1uZWVkZWQsIHN0YW1wLWNvbmZpZyk6IEFkZCBNVUxUSVNSQ1RPUCB0bwotCXBhdGhuYW1lIGZvciBtb3ZlLWlmLWNoYW5nZS4KLQotVGh1IERlYyAgNCAxNzoyNToxOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfbnNpZyk6IFRyeSBOU0lHIGFuZCBfTlNJRy4KLQotV2VkIE5vdiAxOSAxMzozNzowNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaCAoYWxsb2NhLCBHQ0MgY2FzZSk6IERvbid0IHJlZGVmaW5lIGFsbG9jYSBpZiBpdAotCXdhcyBhbHJlYWR5IGRlZmluZWQgcHJldmlvdXNseS4KLQotTW9uIE5vdiAxMCAxMjo0ODowMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgLi4vaW5zdGFsbC1zaCwgbm90IGluc3RhbGwuCi0KLVR1ZSBPY3QgMjggMjM6NDE6MTUgMTk5NyAgSnVkeSBHb2xkYmVyZyAgPGpvZHlnQGlkdC5uZXQ+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgcGV4ZWN1dGUuYy4KLQotV2VkIE9jdCAxNSAxOToxMzo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmM6IENvbnNpc3RlbnRseSB1c2UgZWl0aGVyIHN0ZGFyZyBvciB2YXJhcmdzLgotCi1UdWUgT2N0IDE0IDEyOjAxOjAwIDE5OTcgIE1hcmsgTWl0Y2hlbGwgIDxtbWl0Y2hlbGxAdXNhLm5ldD4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IERvbid0IGxvb2sgZm9yIHJldHVybiB0eXBlcyBvbgotCWNvbnN0cnVjdG9ycy4gIEhhbmRsZSBtZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3JzLgotCi1GcmkgT2N0ICAzIDE3OjUzOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBGaXggY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBTZXAgMjkgMTI6Mjg6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBVcGRhdGUgdG8gY3VycmVudCB2ZXJzaW9uIGZyb20gL2dkL2dudS9saWI6Ci0KLQlNb24gU2VwIDI5IDEyOjI3OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogVXNlIHNwYXduIGlmIF9fQ1lHV0lOMzJfXy4KLQotCTE5OTctMDgtMDggIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBJbmNsdWRlICJjb25maWcuaCIgZmlyc3QsIGFzIHBlciBhdXRvY29uZiBtYW51YWwuCi0KLQlGcmkgSnVuIDI3IDE1OjIwOjI5IDE5OTcgIFNjb3R0IENocmlzdGxleSA8c2NvdHRjQG5ldC1jb21tdW5pdHkuY29tPgotCi0JKiBwZXhlY3V0ZS5jIChmaXhfYXJndik6IE5ldyBmdW5jdGlvbi4KLQkocGV4ZWN1dGUpOiBXaW4zMiBidXQgbm90IEN5Z3dpbjMyIG5lZWRzIGl0cyBhcmd1bWVudHMgZml4ZWQuCi0JQWRkIHVuZGVyc2NvcmUgdG8gY3dhaXQgZnVuY3Rpb24gY2FsbC4KLQotU3VuIFNlcCAyOCAxMjowMDo1MiAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEFkZCBuZXcgcGFyYW1ldGVyLiAgSGFuZGxlIG5ldwotCXRlbXBsYXRlLWZ1bmN0aW9uIG1hbmdsaW5nLgotCShjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEhhbmRsZSBuZXcgbmFtZS1tYW5nbGluZyBzY2hlbWUuCi0KLVdlZCBTZXAgMjQgMDA6MzE6NTkgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUB5aW4uY3lnbnVzLmNvbT4KLQotCSogYXNwcmludGYuYzogc3RkYXJnLmggd2hlbiBBTE1PU1RfU1REQwotCSogY29uZmlnL21oLXdpbmRvd3MgKEVYVFJBX09GSUxFUyk6IGFkZCBhc3ByaW50Zi5vIGFuZAotIAlzdHJuY2FzZWNtcC5vLgotCi1UaHUgQXVnIDI4IDE0OjI3OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKHZhc3ByaW50Zik6IEFsbG93IGZvciBfQlNEX1ZBX0xJU1RfLgotCi0JKiBjb25maWcudGFibGU6IEFkZCBjYXNlIGZvciBGcmVlQlNEIDIuMSBhbmQgMi4yLCBuZWVkcyBtaC1mYnNkMjEuCi0KLQkqIGNvbmZpZy9taC1mYnNkMjEgKEVYVFJBX09GSUxFUyk6IEZvcmNlIHZhc3ByaW50Zi5vCi0KLVdlZCBTZXAgMTAgMTI6NDM6MTAgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2hhbmdlICJjb21wbGV4IiB0byAiX19jb21wbGV4Ii4KLQotRnJpIFNlcCAgNSAxNjozNDo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmMgKGFzcHJpbnRmKTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGFzcHJpbnRmLmMKLQkqIGZ1bmN0aW9ucy5kZWY6IERpdHRvLgotCi1UaHUgQXVnIDI4IDE4OjUzOjM0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJndi5jIChkdXBhcmd2KTogTmV3IGZ1bmN0aW9uLCBkdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yLgotCi1UdWUgQXVnIDE5IDIwOjI4OjQ1IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogYWxzbyBidWlsZCByYW5kb20ubwotCi1UdWUgQXVnIDE5IDE3OjEwOjU2IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEFkZCAnZXh0ZXJuJyB0byBwcmVwZW5kc191bmRlcnNjb3JlLgotCi1XZWQgSnVsIDMwIDExOjQyOjE5IDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogVmFyaW91cyBjaGFuZ2VzIHRvIHByb2R1Y2UgSmF2YSBvdXRwdXQgd2hlbiBwYXNzZWQKLQlETUdMX0pBVkEuICBUaHVzICI6OiIgYmVjb21lcyAiLiIgYW5kICJKQXJyYXk8Rm9vPiIgYmVjb21lcyAiRm9vW10iLgotCShtYWluKTogU3VwcG9ydCAtLWphdmEgYW5kIC1qIGZsYWdzIHRvIHNldCBETUdMX0pBVkEuCi0KLVR1ZSBKdWwgMjIgMTk6MDU6MjMgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb25maWcvbWgtZ28zMiAoQ0MsIEFSLCBSQU5MSUIpOiBEb24ndCBkZWZpbmUuCi0KLVR1ZSBKdWwgMjIgMTc6NDk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHBleGVjdXRlLm8uCi0JKHBleGVjdXRlLm8pOiBOZXcgdGFyZ2V0LgotCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtbmVlZGVkKTogTmV3IHRhcmdldCwgcmVwbGFjaW5nIG5lZWRlZC1saXN0LgotCShuZWVkZWQtbGlzdCk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtbmVlZGVkLgotCShzdGFtcC1jb25maWcpOiBOZXcgdGFyZ2V0LCByZXBsYWNpbmcgY29uZmlnLmguCi0JKGNvbmZpZy5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1jb25maWcuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCi0KLVRodSBKdW4gMTIgMTE6MDA6MTggMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogcGFzcyBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0gYW5kCi0JSU5TVEFMTF9EQVRBIGZvciBtdWx0aWxpYmJlZCBpbnN0YWxscwotCi1UdWUgSnVuICAzIDEzOjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlUdWUgRGVjIDEwIDA5OjQ0OjU3IDE5OTYgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jIChjaG9vc2VfdGVtcF9iYXNlKTogRG9uJ3QgZHVtcCBjb3JlIGlmIFRNUERJUiBpcyBlbXB0eS4KLQotCSogY2hvb3NlLXRlbXAuYyAodHJ5KTogSW5zaXN0IHRoYXQgdGVtcCBkaXIgYmUgc2VhcmNoYWJsZS4KLQotCVdlZCBPY3QgMjMgMTc6MzY6MzkgMTk5NiAgRG91ZyBSdXBwICAocnVwcEBnbmF0LmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYyAoY2hvb3NlX3RlbXBfYmFzZSk6IE9uIFZNUywgdXNlIHByb3BlciBzeW50YXgKLQlmb3IgY3VycmVudCBkaXJlY3RvcnkuCi0KLQlTYXQgRmViIDE1IDE5OjAzOjQ4IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIChub2VyQGN5Z251cy5jb20pCi0KLQkqIHBleGVjdXRlLmM6IFJlbW92ZSBzcGVjaWFsIGNhc2VzIGZvciBjeWd3aW4zMi4KLQkocHdhaXQpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbiBvZiBgcGlkJy4KLQotCVR1ZSBOb3YgMTIgMTg6MjY6MTUgMTk5NiAgRG91ZyBSdXBwICAocnVwcEBnbmF0LmNvbSkKLQotCSogcGV4ZWN1dGUuYyAodmZvcmspOiBTdXBwbHkgbmV3IGRlZmluaXRpb24gZm9yIFZNUy4KLQkocHdhaXQpOiBVc2Ugd2FpdHBpZCBpbnN0ZWFkIG9mIHdhaXQgZm9yIFZNUy4KLQotVHVlIE1heSAyMCAxNDowMjoyMCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlIGBKJy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogUHJpbnQgImNvbXBsZXgiIGZvciBpdC4KLQotV2VkIEFwciAzMCAxMjoxNTo0NSAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHVybiBvbiBtdWx0aWxpYiBoZXJlLgotCi1Nb24gQXByIDI4IDE5OjA0OjMxIDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogbW92ZSBfb2JzdGFja19tZW1vcnlfdXNlZCBvdXRzaWRlIG9mIGlmZGVmLiAgQ2Fubm90IGJlCi0JZWxpZGVkOyBuZWVkZWQgYnkgZ2RiIGFuZCBub3QgcHJlc2VudCBpbiBsaWJjLgotCi1UaHUgQXByIDI0IDE5OjMzOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIHRtcG11bHRpLm91dC4KLQotVHVlIEFwciAyMiAxMDoyNToxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkKToKLQlBZGQgbmV3IGZsb2F0Zm9ybWF0LCBtYWlubHkgZm9yIEFSTSBkb3VibGVzLgotCi1Nb24gQXByIDE0IDEyOjExOjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdpdGggJHttb3ZlaWZjaGFuZ2V9LiAgRnJvbQotCVRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT4uCi0KLUZyaSBBcHIgIDQgMDM6MDk6MjQgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRW5hYmxlIG11bHRpbGliaW5nIGJ5IGRlZmF1bHQuCi0JVXBkYXRlIG11bHRpbGliIHRlbXBsYXRlIHRvIHJlYWQgY29uZmlnLW1sLmluLgotCi1UdWUgQXByICAxIDE2OjI2OjM5IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBvYmphbGxvYy4KLQotTW9uIE1hciAzMSAyMzo1Nzo1MSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfaXQpOiBBZGQgcHJvdG90eXBlIGRlY2xhcmF0aW9uLgotCSh1c2FnZSwgZmF0YWwpOiBMaWtld2lzZS4KLQotCSogeGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBBZGQgcHJvdG90eXBlLgotCi0JKiBzdHJlcnJvci5jIChpbml0X2Vycm9yX3RhYmxlcyk6IERlY2xhcmUuCi0KLUZyaSBNYXIgMjggMTE6NDM6MjAgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGZ1bmN0aW9ucy5kZWY6IEFkZCBERUYgb2YgdmFzcHJpbnRmLCBhbmQgREVGRlVOQyBvZiBzdHJzaWduYWwuCi0JKiBzdHJzaWduYWwuYzogT25seSBkZWZpbmUgc3Ryc2lnbmFsIGlmIE5FRURfc3Ryc2lnbmFsLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IFJlbW92ZSB2YXNwcmludGYuby4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIE5FRURfc3Ryc2lnbmFsIHRvIHhjb25maWcuaC4gIEFkZCB2YXNwcmludGYubwotCXRvIHhuZWVkZWQtbGlzdC4KLQkqIGNvbmZpZy9taC1jeWd3aW4zMiAoSERFRklORVMpOiBBZGQgLURORUVEX3N0cnNpZ25hbC4KLQkoRVhUUkFfT0ZJTEVTKTogRGVmaW5lIHRvIHZhc3ByaW50Zi5vLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhERUZJTkVTKTogQWRkIC1ETkVFRF9zdHJzaWduYWwuCi0JKEVYVFJBX09GSUxFUyk6IEFkZCB2YXNwcmludGYuby4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAodnhjb25maWcuaCk6IERlZmluZSBORUVEX3N0cnNpZ25hbC4KLQkodnhuZWVkZWQtbGlzdCk6IEFkZCB2YXNwcmludGYuby4KLQotVGh1IE1hciAyMCAxNzowMjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1Nb24gTWFyIDE3IDE5OjIzOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqYWxsb2MuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIG9iamFsbG9jLmMKLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIG9iamFsbG9jLm8uCi0JKG9iamFsbG9jLm8pOiBOZXcgdGFyZ2V0LgotCi1TYXQgTWFyIDE1IDE4OjQ5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5jOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotRnJpIE1hciAxNCAxNDoxODo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCi0JKG15c3Ryc3RyKTogTWFrZSBzdGF0aWMuICBNYWtlIGFyZ3VtZW50cyBhbmQgcmVzdWx0IGNvbnN0LgotCShjcGx1c19tYXRjaCk6IFJlbW92ZTsgbm90IHVzZWQuCi0KLVR1ZSBNYXIgMTEgMTQ6MjA6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBDYWxsIGRlbWFuZ2xlZF9mdW5kX3R5cGUgZm9yIG90aGVyCi0JX190KiBzeW1ib2xzLgotCi1UdWUgTWFyIDExIDE1OjQxOjIxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzcGFjZXMuYzogRGVjbGFyZSBtYWxsb2MgYW5kIGZyZWUgcHJvcGVybHkuCi0JKiBzdHJzaWduYWwuYyAoaW5pdF9zaWduYWxfdGFibGVzKTogQWRkIHByb3RvdHlwZS4KLQkqIHhhdGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBBZGQgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KLQotV2VkIEZlYiAxOSAxNTo0MzoyNCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBJZiBhbGxvY2EubyBpcyBuZWVkZWQsIHhleGl0Lm8gaXMKLQlhbHNvIHJlcXVpcmVkIGJlY2F1c2Ugb2YgeG1hbGxvYy5vLgotCi1GcmkgRmViIDE0IDEzOjQzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Ryc2lnbmFsLmM6IFVuY29uZGl0aW9uYWxseSByZWRlZmluZSBzeXNfc2lnbGlzdCBhcm91bmQgdGhlCi0JaW5jbHVzaW9uIG9mIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLgotCi1UaHUgRmViIDEzIDIyOjAxOjA0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzLiAgVXBkYXRlIHRvIGxhdGVzdAotCWdjYyByZWxlYXNlLgotCi1UdWUgRmViICA0IDExOjUyOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Ryc2lnbmFsLmM6IFVzZSBORUVEX3N5c19zaWdsaXN0IGluc3RlYWQgb2YKLQlMT1NJTkdfU1lTX1NJR0xJU1QuCi0JKiBjb25maWcudGFibGU6IERvbid0IHVzZSBtaC1seW54b3MuCi0JKiBjb25maWcvbWgtbHlueG9zOiBSZW1vdmUuCi0KLVRodSBKYW4gMTYgMTQ6NTE6MDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBGaXggaW5kZW50aW5nOyBtYWtlIGlkZW50aWNhbCB0byB0aGUgY29weQotCWluIEdDQy4KLQkoZG9fdHlwZSwgY2FzZSAnTScpOiBDaGVjayBmb3IgYSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGEgY2xhc3MuCi0KLVRodSBEZWMgMTkgMTM6NTE6MzMgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKHZ4bmVlZGVkLWxpc3QpOiBSZW1vdmUgc2lnc2V0bWFzay5vLCBzaW5jZQotCXZ4d29ya3MgNS5bMC0zXSBhbGwgaGF2ZSBzaWdzZXRtYXNrIGluIHRoZW07IHRoZSBvbmUgcHJvdmlkZWQgYnkKLQlsaWJpYmVydHkgaXMgaW5jb3JyZWN0LCBhcyB3ZWxsLgotCi1Nb24gRGVjICAyIDE1OjAzOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmMgKGFsbG9jYSk6IFdoZW4gY29tcGlsZWQgd2l0aCBhbiBBTlNJL0lTTyBjb21waWxlciwKLQlhbGxvY2EgdGFrZXMgYSBzaXplX3QgYXJndW1lbnQsIG5vdCBqdXN0IHVuc2lnbmVkLgotCi1Nb24gTm92IDE4IDE1OjQyOjA4IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IE5vdGUgdGhhdCB0aGlzIGZpbGUgYWxzbyBsaXZlcyBpbiBHQ0MuCi0KLU1vbiBOb3YgMTggMTU6MTk6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYzogUmVtb3ZlIGluY2x1ZGUgb2YgbGliaWJlcnR5LmggZm9yIGhwdXguCi0JKiBhcmd2LmM6ICBSZXBsYWNlIGRlZnMgZnJvbSBsaWJpYmVydHkuaC4KLQkqIHNwYWNlcy5jOiBQdXQgYmFjayBleHRlcm5zIGZyb20gcmVtb3ZlZCBmcm9tIGxpYmliZXJ0eS5oLgotCSogdmFzcHJpbnRmLmM6IFJlbW92ZSBpbmNsdWRlIG9mIGxpYmliZXJ0eS5oIGZvciBocHV4LgotCi1Nb24gTm92IDE4IDE0OjA4OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IENoZWNraW5nIGluIGFnYWluOyBsYXN0IGNoZWNraW4gZmlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogUmV2ZXJ0IGxhc3QgdHdvIGNvbW1pdHMgZHVlIHRvIGNvbmZsaWN0cyB3aXRoCi0JaHB1eCBzeXN0ZW0gaGVhZGVycy4KLQotV2VkIE5vdiAxMyAwODoyMjowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jLCBhcmd2LmMsIHNwYWNlcy5jLCBzdHJjYXNlY21wLmMsIHZhc3ByaW50Zi5jLCB2cHJpbnRmLmM6Ci0JUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4IHN5c3RlbSBoZWFkZXJzLgotCi1XZWQgTm92IDEzIDEwOjM2OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHh7bSxyZX1hbGxvYyk6IE1ha2UgZGVjbGFyYXRpb25zIGNvbXBhdGliaWxlIHdpdGgKLQlsaWJpYmVydHkuaCB3aGVuIGNvbXBpbGVkIHdpdGggYSBzdGFuZGFyZCBjb21waWxlci4KLQotVHVlIE5vdiAxMiAxNjozMTowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIHhtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQkqIGFyZ3YuYzogTW92ZSBwcm90b3R5cGVzIHRvIGxpYmliZXJ0eS5oLgotCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgeG1hbGxvYy4KLQlEb24ndCByZWRlZmluZSBOVUxMLgotCVVzZSBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiBzcGFjZXMuYzogUmVtb3ZlIHByb3RvdHlwZXMgZm9yIG1hbGxvYyBhbmQgZnJlZSB3aGljaCBhcmUKLQlhbHJlYWR5IGluIGxpYmlicnR5LmguCi0JKiBzdHJjYXNlY21wLmM6IFVzZSBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiBtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQkqIHZwcmludGYuYzogSW5jbHVkZSBzdGRhcmcuaCBpZiBfX1NURENfXy4KLQotRnJpIE9jdCAxMSAxNTo0MjoxMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtd2luZG93czogIEFkZCBzdHJjYXNlY21wLm8gdG8gRVhUUkFfT0ZJTEVTLgotCi1GcmkgT2N0IDExIDExOjE2OjMxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd2lmeV9maWxlbmFtZSk6IFJld3JpdGUgdG8gc2ltcGxpZnksIGFuZCB0byBoYW5kbGUKLQl1cHdhcmQgY29tcG9uZW50cyBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDggMDg6NTU6MzQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlLCBjb25maWcvbWgtd2luZG93czogIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyB1bmRlcgotCU1TVkMgKHRoZSBNaWNyb3NvZnQgYnVpbGQgZW52aXJvbm1lbnQpLgotCi1Nb24gT2N0ICA3IDEwOjUwOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5jOiBVbmRlZiBjb25zdCBpZiBub3QgX19TVERDX18uCi0KLVRodSBPY3QgIDMgMTM6NDY6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBmbm1hdGNoLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBmbm1hdGNoLm8uCi0JKGZubWF0Y2gubyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBTZXAgMTggMTQ6NDk6MTMgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggaGFuZGxpbmcgb2YgYWRkcmVzcyBhcmdzLgotCShnbnVfc3BlY2lhbCk6IEhhbmRsZSB0eXBlX2luZm8gc3R1ZmYuCi0KLUZyaSBTZXAgMTMgMTc6NTI6NTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAoRGVidWdQSSk6IE1ha2Ugc2V0dGFibGUgZnJvbSB0aGUgZW52IHZhciBERUJVR19QQVRITkFNRVMuCi0JKG1wd2lmeV9maWxlbmFtZSk6IEhhbmRsZSAiOjovIiBjYXNlLgotCi1UaHUgU2VwIDEyIDEzOjMwOjQwIDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogbmV3IGZpbGUgKG5lZWQgLURORUVEX2Jhc2VuYW1lIGFuZAotCQktRE5FRURfc3lzX3NpZ2xpc3QgZm9yIG5hdGl2ZSBOVCByZWJ1aWxkaW5nKQotCSogY29uZmlnLnRhYmxlICgqLSotY3lnd2luMzIpOiBuZXcgZW50cnkKLQkqIGNob29zZS10ZW1wLmM6IGJyaW5nIGluIHN5bmMgd2l0aCBnY2MgKHJldmVydCBBdWcgMTcgY2hhbmdlKQotCi1UaHUgQXVnIDI5IDE2OjQ4OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0KLVR1ZSBBdWcgMjcgMTM6NDc6NTggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSkgW01QV106IFJlbW92ZSBvbGQgYm9ndXMgY29kZSB0aGF0Ci0JbWVzc2VkIHdpdGggYXJndW1lbnRzIHRoYXQgaW5jbHVkZWQgYSAnLycsIGFkZCBlc2NhcGUgY2hhcnMKLQl0byBkb3VibGUgcXVvdGVzLCByZW1vdmUgY29uc3QgZGVjbCBmcm9tIGFyZyB0aGF0IE1hYwotCWNvbXBpbGVycyBkb24ndCBzZWVtIHRvIGxpa2UuCi0KLVNhdCBBdWcgMTcgMDQ6NDQ6MjcgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlIHRlc3QgZm9yIHdpbjMyICgmJiAhIGN5Z3dpbjMyKS4KLQkqIGNob29zZS10ZW1wLmM6IGZpeCBXSU4zMiBwcmVwcm9jZXNzb3IgZGVmaW5lcwotCi1UaHUgQXVnIDE1IDEyOjI2OjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgQERBU0hfQ19GTEFHQCBhbmQgQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQAotCXRvIGVkaXRpbmcgb2YgZGVmYXVsdCBtYWtlZmlsZSBydWxlLgotCi1TdW4gQXVnIDExIDIxOjAzOjI3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFsbG9jYS1ub3JtLmg6ICBJbmNsdWRlIDxtYWxsb2MuaD4gaWYgX1dJTjMyLgotCSogYXJndi5jOiAgSW5jbHVkZSBub24tcHJvdG90eXBlZCBkZWNscyBmb3IgbWFsbG9jIGFuZCBzdHJpbmcKLQlmdW5jdGlvbnMgaWYgISBfV0lOMzIgb3IgaWYgX19HTlVDX18uCi0KLVRodSBBdWcgIDggMTI6NDI6NDAgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy5oLXZtczogTmV3IGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVzZSBpdC4KLQotV2VkIEF1ZyAgNyAxNzoxNjoxMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAoX2dldG9wdF9pbnRlcm5hbCk6ICBJZiBhcmdjIGlzIDAsIGp1c3QgcmV0dXJuIChiZWZvcmUKLQl3ZSByZWZlcmVuY2UgKmFyZ3YgYW5kIHNlZ2ZhdWx0KS4KLQotTW9uIEF1ZyAgNSAwMToyOTowOCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBBZGQgbXVsdGlsaWIub3V0LgotCi1UaHUgSnVsIDE4IDE3OjQwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaDogQ2hhbmdlICNpZmRlZiBzcGFyYyB0byAjaWYgZGVmaW5lZCAoc3BhcmMpICYmCi0JZGVmaW5lZCAoc3VuKS4gIEZyb20gQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgotCi1Nb24gSnVsICAxIDEzOjQwOjQ0IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVHVlIE1heSAyOCAxNToyOTowMyAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tIChSRVFVSVJEX09GSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5vIGFuZCB4c3RyZHVwLm8uCi0KLQlUaHUgSmFuIDI1IDE4OjIwOjA0IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiB2bXNidWlsZC5jb206IENoYW5nZXMgdG8gaGFuZGxlIERFRkZVTkMob25fZXhpdCkuCi0JKGRvX29maWxlcyk6IEFsbG93IG5vbmV4aXN0ZW50IHNvdXJjZSBmaWxlIGluIHBhc3MgMy4KLQkoY2hrX2RlZmZ1bmMpOiBOZXcgcm91dGluZS4KLQotVHVlIEp1biAyNSAxOToyNDo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jIChQRVhFQ1VURV9WRVJCT1NFKTogRGVmaW5lLgotCShNUFcgcGV4ZWN1dGUpOiBDaGVjayBmbGFncyAmIFBFWEVDVVRFX1ZFUkJPU0UgaW5zdGVhZCBvZiB2ZXJib3NlX2ZsYWcuCi0KLVR1ZSBKdW4gMjUgMjM6MTE6NDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRvY2Rpcik6IFJlbW92ZWQuCi0KLVR1ZSBKdW4gMjUgMjM6MDE6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgotCi1UdWUgSnVuIDI1IDIyOjUwOjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQotVGh1IEp1biAyMCAyMToxNzo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBSZWluZGVudC4gIEF2b2lkIGVuZGxlc3MgbG9vcCBieQotCWNoZWNraW5nIGZvciBlcnJvcnMgZnJvbSBkb190eXBlLgotCi1UdWUgSnVuIDE4IDE0OjM2OjE5IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogeG1hbGxvYy5jOiBJZiBWTVMsIGluY2x1ZGUgPHN0ZGxpYi5oPiBhbmQgPHVuaXhsaWIuaD4gcmF0aGVyCi0JdGhhbiBkZWNsYXJpbmcgbWFsbG9jLCByZWFsbG9jLCBhbmQgc2Jyay4KLQotTW9uIEp1biAxMCAxMzoxNzoxNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBOZXcgZmlsZS4KLQotV2VkIEp1biAgNSAxNjo1Nzo0NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogeG1hbGxvYy5jOiBEZWNsYXJlIHNicmsuCi0KLVNhdCBNYXkgIDQgMDU6MDg6NDUgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbGxvY2Etbm9ybS5oOiAgQWRkIFNQQVJDd29ya3MgY2MgY29tcGF0aWJsZSBfX2J1aWx0aW5fYWxsb2NhCi0JZGVjbGFyYXRpb24uCi0KLU1vbiBBcHIgMjIgMTg6NDE6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4c3RyZXJyb3IuYzogSW5jbHVkZSA8c3RkaW8uaD4uCi0KLVN1biBBcHIgMjEgMTE6NTU6MTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBhdGV4aXQuYy4KLQotU3VuIEFwciAyMSAwOTo1MDowOSAxOTk2ICBTdGVwaGVuIEwgTW9zaGllciAgKG1vc2hpZXJAd29ybGQuc3RkLmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYzogSW5jbHVkZSBzeXMvdHlwZXMuaCBiZWZvcmUgc3lzL2ZpbGUuaCBmb3Igc2NvMy4ydjUuCi0KLVdlZCBBcHIgMTcgMTE6MTc6NTUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgI2luY2x1ZGUgc3lzL2ZpbGUuaCBpZmRlZiBOT19TWVNfRklMRV9ILgotCSNpbmNsdWRlIDxzdGRpby5oPgotCSogY29uZmlnL210LXZ4d29ya3M1IChIREVGSU5FUyk6IERlZmluZSBOT19TWVNfRklMRV9ILgotCi1UdWUgQXByIDE2IDExOjI3OjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgotCVJldmVydHMgRmViIDgsIDE5OTUgY2hhbmdlLgotCi1Nb24gQXByIDE1IDEyOjUzOjI2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAuby4KLQotU2F0IEFwciAxMyAxNDoxOTozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiAgRG9uJ3QgYmlhcyBleHBvbmVudCB3aGVuCi0JaGFuZGxpbmcgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuCi0KLVRodSBBcHIgMTEgMTM6MzY6NTYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogIEZpeCBidWdzIHdpdGggaGFuZGxpbmcKLQludW1iZXJzIHdpdGggZnJhY3Rpb25zIDwgMzIgYml0cy4KLQotTW9uIEFwciAgOCAxNDo0ODozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCi1UdWUgTWFyIDE5IDIyOjAyOjA3IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGZvciBub24tbWFuZ2xlZCBwb2ludGVyCi0JYXJndW1lbnRzLgotCi1GcmkgTWFyICA4IDE3OjI0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiBzcmNkaXIgaXMgYC4nIGFuZCB3aXRoX3RhcmdldF9zdWJkaXIgaXMgbm90Ci0JYC4nLCB0aGVuIHNldCBNVUxUSVNSQ1RPUCBiZWZvcmUgY2FsbGluZyBjb25maWctbWwuaW4uCi0KLVRodSBNYXIgIDcgMTM6Mzc6MTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3X29wZW4pOiBBZGQgZGVidWdnaW5nIG91dHB1dCBvcHRpb24uCi0KLVdlZCBNYXIgIDYgMTc6MzY6MDMgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggZm9yIGFkZHJlc3Mtb2YtZXh0ZXJuIGFyZ3VtZW50cy4KLQotVHVlIEZlYiAyNyAxMjowMDo1MCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3aWZ5X2ZpbGVuYW1lKTogQ2hhbmdlIDYgdG8gNSBpbgotCXN0cm5jbXAgKHVuaXhuYW1lLCAiL3RtcC8iLCA1KS4KLQotVHVlIEZlYiAyMCAxMDo1NTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgaXNfYm9vbC4gIENvcnJlY3RseQotCWhhbmRsZSAwIGFzIGEgcG9pbnRlciB2YWx1ZSBwYXJhbWV0ZXIuCi0KLU1vbiBGZWIgIDUgMTY6NDE6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIHVwb24gcmVxdWlyZWQtbGlzdC4KLQkocmVxdWlyZWQtbGlzdCk6IE5ldyB0YXJnZXQuCi0JKGNsZWFuKTogUmVtb3ZlIHJlcXVpcmVkLWxpc3QuCi0KLVdlZCBKYW4gMzEgMTA6MTk6NDEgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd2luMzIuYzogRGVsZXRlZC4KLQkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taC1pMzg2d2luMzI6IERlbGV0ZWQuCi0KLVRodSBKYW4gMTggMTE6MzQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouICBEb24ndCBjYXN0IHJldHVybiB2YWx1ZS4KLQotVHVlIEphbiAxNiAxMjoxMzoxMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jOiBJbmNsdWRlIFRpbWVyLmgsIGluIG9yZGVyIHRvIGdldCBtNjhrIE1pY3Jvc2Vjb25kcyB0cmFwCi0JZGVmaW5pdGlvbi4KLQotV2VkIEphbiAgMyAxMzoxNTowNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5jOiBVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTYuCi0JKF9vYnN0YWNrX21lbW9yeV91c2VkKTogRGVmaW5lIG5ldyBmdW5jdGlvbi4gIENhbGxlZCB2aWEKLQlvYnN0YWNrX21lbW9yeV91c2VkIG1hY3JvLgotCi1UaHUgRGVjIDI4IDExOjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeHN0cmR1cC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgeHN0cmR1cC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgeHN0cmR1cC5vLgotCSh4c3RyZHVwLm8pOiBOZXcgdGFyZ2V0LgotCi1Nb24gRGVjIDExIDE4OjE4OjUyIDE5OTUgIE1pa2UgU3R1bXAgIDxtcnNAY3lnbnVzLmNvbT4KLQotCSogYXRleGl0LmM6IE5ldyBzdHViIHRvIHByb3ZpZGUgYXRleGl0IG9uIHN5c3RlbXMgdGhhdCBoYXZlCi0Jb25fZXhpdCwgbGlrZSBTdW5PUyA0LjEueCBzeXN0ZW1zLgotCSogZnVuY3Rpb25zLmRlZiAob25fZXhpdCwgYXRleGl0KTogRGl0dG8uCi0KLU1vbiBEZWMgMTEgMTU6NDI6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3X2Fib3J0KTogUmVtb3ZlIGRlY2wuCi0JKG1wd19hY2Nlc3MpOiBNb3ZlIGRlYnVnZ2luZyBwcmludGYuCi0KLVNhdCBEZWMgIDIgMDE6MjU6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IENvbnNpc3RlbnRseSB1c2UgJHtob3N0fSByYXRoZXIgdGhhbiAke3hob3N0fSBvcgotCSR7dGFyZ2V0fS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIHNldCAke3hob3N0fSBiZWZvcmUgY2FsbGluZwotCWNvbmZpZy50YWJsZS4KLQotVHVlIE5vdiAyOCAxNDoxNjo1NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogVXNlIHRlc3QgaW5zdGVhZCBvZiB0aGUgbGVmdCBicmFja2V0LCB0bwotCWF2b2lkIHByb2JsZW1zIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBtYWtlLgotCi1UdWUgTm92IDI4IDExOjQ1OjE3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBGaXggSU5DRElSIGVkaXQgdG8gd29yayB3aXRoIE5vdiAxNCBjaGFuZ2UuCi0KLVR1ZSBOb3YgMjEgMTE6MjY6MzQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtaHB1eDogUmVtb3ZlLiAgSXQgd2FzIG9ubHkgdXNlZCB0byBkZWZpbmUgRVhUUkFfT0ZJTEVTLAotCXdoaWNoIHdhcyBzZXQgdG8ganVzdCBhbGxvY2Eubywgd2hpY2ggaXMgbm93IGF1dG9tYXRpY2FsbHkgbWFya2VkCi0JYXMgbmVlZGVkIGJ5IHRoZSBhdXRvY29uZmlndXJhdGlvbiBwcm9jZXNzLgotCi1UdWUgTm92IDIxIDE0OjE1OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDaGVjayAke3dpdGhfY3Jvc3NfaG9zdH0gcmF0aGVyIHRoYW4gY29tcGFyaW5nCi0JJHtob3N0fSBhbmQgJHt0YXJnZXR9LgotCi1UaHUgTm92IDE2IDE0OjM0OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiB3aXRoX3RhcmdldF9zdWJkaXIgaXMgZW1wdHksIHNldCB4aG9zdCB0bwotCSR7aG9zdH0gcmF0aGVyIHRoYW4gJHt0YXJnZXR9IGJlZm9yZSBjYWxsaW5nIGNvbmZpZy50YWJsZS4KLQotVHVlIE5vdiAxNCAwMTozODozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTVVMVElUT1ApOiBEZWxldGVkLgotCShNVUxUSVNSQ1RPUCwgTVVMVElCVUlMRFRPUCk6IE5ldy4KLQkoRkxBR1NfVE9fUEFTUyk6IERlbGV0ZSBJTkNESVIuCi0JKElOQ0RJUik6IEFkZCAkKE1VTFRJU1JDVE9QKS4KLQkoaW5zdGFsbF90b19saWJkaXIpOiBBZGQgJChNVUxUSVNVQkRJUikuICBDYWxsICQoTVVMVElETykuCi0JKiBjb25maWd1cmUuaW46IERlbGV0ZSBjYWxsIHRvIGNmZy1tbC1jb20uaW4uICBDYWxsIGNvbmZpZy1tbC5pbgotCWluc3RlYWQgb2YgY2ZnLW1sLXBvcy5pbi4KLQkoY3Jvc3MtY29tcGlsZSBjaGVjayk6IENoYW5nZSB0byB0ZXN0IGZvciB3aXRoX3RhcmdldF9zdWJkaXIuCi0JKEVYVFJBX0xJTktTKTogRGVsZXRlLgotCi1TdW4gTm92IDEyIDEyOjEzOjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgZ2V0cGFnZXNpemUuYy5vIHRvIG5lZWRlZC1saXN0LgotCSogbXB3LmMgW1VTRV9NV19IRUFERVJTXTogQ29uZGl0aW9uYWxpemUgY29tcGlsaW5nIG9mCi0JZnVuY3Rpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IE1ldHJvd2Vya3MgbGlicmFyaWVzLgotCShmc3RhdCk6IENsZWFuIHVwIGRlc2NyaXB0b3ItPnBvaW50ZXIgY29udmVyc2lvbiBjb2RlLgotCShJbnN0YWxsQ29uc29sZSwgZXRjKTogRW1wdHkgZGVmaW5pdGlvbnMsIGZvciB3aGVuIGxpbmtpbmcKLQl3aXRoIFNJT1VYLgotCi1TdW4gTm92ICA1IDE5OjI1OjI3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBbHNvIHBhc3MgUElDRkxBR1MuCi0JKC5jLm8pOiAgU3R5bGlzdGljIGNoYW5nZS4KLQotVGh1IE5vdiAgMiAxMjowNjoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnRvbC5jLCBzdHJ0b3VsLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPi4gIEZyb20KLQlwaGRtQGluZm8udWNsLmFjLmJlIChQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDExOjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDb3JyZWN0IHNlZCBjYWxsLgotCi1Nb24gT2N0IDMwIDEzOjAzOjQ1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46ICBDbGVhbiB1cCAvIHNpbXBsaWZ5IGZvciBuYXRpdmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1lcmdlIGluIHN0dWZmIGZyb20gLi4veGliZXJ0eS9jb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbiAoQ0MpOiAgQWRkIGRlZmluaXRpb24gKHNvIGl0IGNhbiBiZSBvdmVycnJpZGRlbgotCWJ5IC4uL2NvbmZpZ3VyZSkuCi0KLVR1ZSBPY3QgMjQgMTc6NTc6MjcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IExlYXZlIHN0cmVycm9yLmMubyBpbiBzdGFuZGFyZCBsaXN0IG9mIGZ1bmN0aW9ucy4KLQkqIG1wdy5jIChSX09LLCBFTk9FTlQsIEVBQ0NFU1MsIEVOT1NZUyk6IFJlbW92ZS4KLQkobGluayk6IFJlbW92ZSB1c2VsZXNzIGRlZmluaXRpb24gd2l0aCBlcnJvciByZXR1cm4uCi0JKGxhc3RfbWljcm9zZWNvbmRzLCB3YXJuX2lmX3NwaW5fZGVsYXksIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSk6Ci0JVXNlIFVuc2lnbmVkV2lkZSB0eXBlIGZvciBtaWNyb3NlY29uZCBjb3VudHMuCi0KLVRodSBPY3QgMTkgMTA6NTI6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogbWVtY21wLmMgKG1lbWNtcCk6IEFyZ3VtZW50IHR5cGVzIGFyZSBjb25zdCB2b2lkICosIG5vdCB2b2lkCi0JKmNvbnN0LgotCi0JKiBzdHJuY2FzZWNtcC5jIChzdHJuY2FzZWNtcCk6IEluY2x1ZGUgYW5zaWRlY2wuaC9zdGRhcmcuaCwgbm90Ci0Jc3lzL3R5cGVzLmguCi0JKiBzdHJjYXNlY21wLmMgKHN0cmNhc2VjbXApOiBEaXR0by4KLQotVHVlIE9jdCAxMCAxMTowMzoyNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIFJlbW92ZSBtYWNyby4KLQotVHVlIFNlcCAyNiAxNTowNjo0NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBBZGQgZGVmYXVsdCBlbXB0eSBkZWZpbml0aW9uLgotCSogbXB3LWNvbmZpZy5pbiAoY29uZmlnLmgpOiBPbmx5IHVwZGF0ZSBpZiBjaGFuZ2VkLgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGVkaXRzIE1ha2VmaWxlLmluIGludG8gTVBXIG1ha2VmaWxlLgotCSogbXB3LmM6IFJlbW92ZSBzZW1pLWNsb25lIG9mIHN0cmVycm9yIGNvZGUuCi0JKHN5c19uZXJyLCBzeXNfZXJybGlzdCk6IERlZmluZSBoZXJlLgotCShNaWNyb3NlY29uZHMpOiBPbmx5IGRlZmluZSBhcyBBLWxpbmUgdHJhcCBpZiBtNjhrIE1hYy4KLQotV2VkIFNlcCAyMCAxMjo1MzozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIGRpc3RjbGVhbi4KLQotTW9uIEF1ZyAyOCAxOTo0Nzo1MiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiAgRm9yIGhvc3QsIGdlbmVyYWxpemUgcnM2MDAwLWlibS1haXgqCi0JdG8gKi1pYm0tYWl4KiBzbyB3ZSBhbHNvIGluY2x1ZGUgcG93ZXJwYy4KLQotVHVlIEF1ZyAyMiAwMzoxODowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlGcmkgSnVuIDE2IDE4OjM1OjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB4c3RyZXJyb3IuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiwgdm1zYnVpbGQuY29tOiBDb21waWxlIGl0LgotCi1Nb24gSnVsIDMxIDEyOjE2OjMyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogTmV3LgotCi1GcmkgSnVsIDIxIDExOjM1OjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNVUxUSVRPUCk6IE5ldyB2YXJpYWJsZS4KLQkoTVVMVElESVJTLCBNVUxUSVNVQkRJUiwgTVVMVElETywgTVVMVElDTEVBTik6IExpa2V3aXNlLgotCShhbGwpOiBBZGQgbXVsdGlsaWIgc3VwcG9ydC4KLQkoaW5zdGFsbF90b190b29sZGlyLCAqY2xlYW4pOiBMaWtld2lzZS4KLQotTW9uIEp1bCAxMCAxMTo0NzoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQWRkIGhleC5vLiAgRnJvbSBESiBEZWxvcmllLgotCi1GcmkgSnVuIDMwIDE3OjI4OjU5IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNidWlsZC5jb206ICBjcmVhdGUgIm5ldy1saWIub2xiIiwgYnVpbGQgbGliaWJlcnR5IHVuZGVyIHRoYXQKLQluYW1lLCBhbmQgdGhlbiBtYWtlIGl0IGJlY29tZSAibGliZXJ0eS5vbGIiIHdoZW4gZG9uZSwgc28gdGhhdCBhbgotCWluY29tcGxldGUgYnVpbGQgYXR0ZW1wdCBuZXZlciBsZWF2ZXMgYmVoaW5kIHNvbWV0aGluZyB3aGljaCBsb29rcwotCWxpa2UgYSBjb21wbGV0ZSBsaWJyYXJ5LgotCi1UaHUgSnVuIDI5IDAwOjIyOjAyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1pMzg2cGU6IE5ldyBmaWxlIGZvciBQRSBob3N0cy4KLQkqIGNvbmZpZy50YWJsZTogVW5kZXJzdGFuZCBQRSBob3N0cy4KLQotV2VkIEp1biAyOCAxOToxMzoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFVwZGF0ZSBmcm9tIGdjYy4KLQotCSogYXJndi5jLCBkdW1teS5jOiBJZiBfX1NURENfXywgI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiIGFmdGVyCi0JPHN0ZGRlZi5oPi4KLQkqIGFsbG9jYS1ub3JtLmg6IElmIF9fU1REQ19fLCBkZWNsYXJlIGFsbG9jYSB3aXRoIGl0cyBwYXJhbWV0ZXIuCi0KLVRodSBKdW4gMjIgMTg6NTc6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5pbiAoQUxMX0NGTEFHUyk6IERlZmluZSBORUVEX2Jhc2VuYW1lLgotCSogbXB3LmM6IE9ubHkgdGVzdCBEZWJ1Z1BJIG9uY2Ugd2hlbmV2ZXIgcHJpbnRpbmcgZGVidWcgaW5mby4KLQkobXB3aWZ5X2ZpbGVuYW1lKTogSWYgZmlsZW5hbWUgaXMgL3RtcC9mb28sIGNoYW5nZSBpdCBpbnRvIDpfZm9vLAotCWFsc28gZml4IHRvIG5vdCB3cml0ZSBvbiBpbnB1dCBmaWxlbmFtZSBidWZmZXIuCi0JKG1wd19hY2Nlc3MpOiBVc2Ugc3RhdCgpIGluc3RlYWQgb2Ygb3BlbigpLCB3b3JrcyBmb3IgZGlyZWN0b3JpZXMKLQlhcyB3ZWxsIGFzIGZpbGVzLgotCi1Nb24gSnVuIDE5IDAwOjMzOjIyIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFzc2FnZSBicm9rZW4gc2hlbGxzIHRoYXQgcmVxdWlyZSAnZWxzZSB0cnVlJy4KLQotU2F0IEp1biAxNyAyMzoyMTo1OCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaDogRGVjbGFyZSBhbGxvY2EgYXMgdHlwZSAiUFRSIiB0byBtYXRjaCBmdW5jdGlvbnMuZGVmLgotCURlY2xhcmUgX19idWlsdGluX2FsbG9jYSBpbiB0aGUgc3BhcmMgY2FzZSwgYXMgYXJndi5jIGRpZC4KLQkqIGFyZ3YuYzogUmVwbGFjZSBpbmxpbmUgdmVyc2lvbiBvZiBhbGxvY2Etbm9ybS5oIGF0IHN0YXJ0IG9mIGZpbGUgd2l0aAotCWEgI2luY2x1ZGUgb2YgYWxsb2NhLWNvbmYuaC4gIFByZWNlZGUgaXQgd2l0aCBhbiBpbmNsdWRlIG9mIGFuc2lkZWNsLmgKLQliZWNhdXNlIGFsbG9jYS1ub3JtLmggbmVlZHMgdG8gZGVjbGFyZSBhbGxvY2EgYXMgIlBUUiIuCi0KLU1vbiBKdW4gMTIgMTQ6MjQ6MjYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd2luMzIuYzogTmV3IGZpbGUuCi0KLUZyaSBKdW4gIDkgMTU6MTY6MTQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGR1bW15LmM6ICNpbmNsdWRlICJhbGxvY2EtY29uZi5oIi4KLQotV2VkIEp1biAgNyAxMTo0NjoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIHN0YW1wLXBpY2Rpci4KLQkoY2xlYW4pOiBEb24ndC4KLQotTW9uIEp1biAgNSAxODo0NjowNiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlIChmcmFncyk6IFVzZSB0b3BsZXZlbCBwaWMgZnJhZ3MuCi0KLQkqIE1ha2VmaWxlLmluIChQSUNGTEFHKTogTmV3IG1hY3JvLgotCShhbGwpOiBEZXBlbmQgb24gc3RhbXAtcGljZGlyLgotCShuZWVkZWQtbGlzdCk6IERpdHRvLgotCSguYy5vKTogQWxzbyBidWlsZCBwaWMgb2JqZWN0LgotCShzdGFtcC1waWNkaXIpOiBOZXcgcnVsZS4KLQkobW9zdGx5Y2xlYW4pOiBSZW1vdmUgcGljLgotCShjbGVhbik6IFJlbW92ZSBzdGFtcC1waWNkaXIuCi0KLUZyaSBNYXIgMjQgMTY6NTU6NDggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2J1aWxkLmNvbSAoY29uZmlnLmgpOiBBZGQgYCNkZWZpbmUgTkVFRF9iYXNlbmFtZScuCi0KLVR1ZSBNYXkgMjMgMTA6MTI6NDYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNsb2NrLmMsIGdldG9wdC5jLCBzdHJ0b2QuYywgdnNwcmludGYuYzogIENoYW5nZSBmcm9tIHVzaW5nIExHUEwKLQl0byBsaWJpby1zdHlsZSBjb3B5cmlnaHQuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgUmVtb3ZlIEZTRiBjb3B5cmlnaHQuCi0KLVNhdCBNYXkgMjAgMTI6MzA6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQWRkZWQgaW1wcm92ZWQgVk1TIHN1cHBvcnQgZnJvbSBQYXQgUmFua2luOgotCi0JRnJpIE1hciAxNyAxODo0MDozNiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zYnVpbGQuY29tOiAgbmV3IGZpbGUuCi0KLQkqIGdldHBhZ2VzaXplLmMgKGdldHBhZ2VzaXplKTogIGltcGxlbWVudCBmb3IgVk1TOwotCSogc3RyZXJyb3IuYyAoc3RyZXJyb3IsIHN0cmVycm5vLCBzdHJ0b2Vycm5vKTogIGFkZCBydWRpbWVudGFyeQotCXN1cHBvcnQgZm9yIEVWTVNFUlIuCi0KLVRodSBNYXkgMTggMTc6MDE6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlZmluZS4KLQotVHVlIE1heSAxNiAxMzozMDo1OSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogYmFzZW5hbWUuYywgYmNtcC5jLCBnZXRjd2QuYywgaW5zcXVlLmMsIHJlbmFtZS5jLCBzaWdzZXRtYXNrLmMsCi0Jc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBSZW1vdmUgRlNGIGNvcHlyaWdodC4KLQkqIHNpZ3NldG1hc2suYzogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAtIHNlZW1zIHRvIGJlIG5lZWRlZCBieSBJU0MuCi0KLU1vbiBNYXkgMTUgMTk6NTM6MTcgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGJjb3B5LmMsIGJ6ZXJvLmMsIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtc2V0LmMsIHN0cmNoci5jLAotCXN0cnJjaHIuYywgc3Ryc3RyLmMsIHZmb3JrLmM6ICBSZW1vdmUgRlNGIENvcHlyaWdodCwgYmVjYXVzZSB0aGlzCi0JbWlnaHQgY29udGFtaW5hdGUgbGlic3RkYysrIHdpdGggdGhlIExHUEwuICAoT0snZCBieSBSTVMgMTEgT2N0IDk0LikKLQkqIHN0cmNoci5jLCBzdHJyY2hyLmM6ICBBZGQgY2FzdCB0byBzdXBwcmVzcyBjb25zdCB3YXJuaW5nLgotCi1UaHUgTWF5ICA0IDE0OjM2OjQyIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogVXNlIGNvbnN0IGluc3RlYWQgb2YgQ09OU1QuICBEb24ndCBpbmNsdWRlCi0JYW5zaWRlY2wuaCBkaXJlY3RseS4KLQotV2VkIEFwciAxOSAwMTozMDoyNyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IERvbid0IGluY2x1ZGUgbGliaWJlcnR5LmguICBEbyBkZWNsYXJlIHhtYWxsb2MgYW5kCi0JeHJlYWxsb2MuCi0JKC1ETUFJTik6IERvbid0IHJlbHkgb24gYW4gZXh0ZXJuYWxseS1kZWZpbmVkIHZlcnNpb24gbnVtYmVyOwotCWluc3RlYWQsIHJlcXVpcmUgdGhlIHZlcnNpb24gbnVtYmVyIHRvIGJlIGRlZmluZWQgYXMgYQotCXByZXByb2Nlc3NvciBtYWNyby4gIEhhbmRsZSB0aGUgUlMvNjAwMCBsZWFkaW5nIGRvdC4gIERlZmluZQotCXhtYWxsb2MsIHhyZWFsbG9jIGFuZCBmYXRhbC4gIERvbid0IHN0cmlwIGEgbGVhZGluZyB1bmRlcnNjb3JlCi0JaWYgd2UgY291bGRuJ3QgZGVtYW5nbGUgdGhlIHdvcmQuCi0KLVR1ZSBBcHIgIDQgMTM6MDM6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKE9sZCBtcHcuYyBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQkqIG1wdy5jICh3YXJuaW5nX3RocmVzaG9sZCk6IERlZmF1bHQgdG8gLjQgc2VjLgotCShvdmVyZmxvd19jb3VudCwgY3VycmVudF9wcm9ncmVzcyk6IE5ldyBnbG9iYWxzLgotCSh3YXJuX2lmX3NwaW5fZGVsYXkpOiBJbmNsdWRlIGN1cnJlbnQgcHJvZ3Jlc3MgdHlwZSwKLQlzdWNoIGFzIHByb2dyYW0gbmFtZSwgaW4gbWVzc2FnZS4KLQkobXB3X3N0YXJ0X3Byb2dyZXNzKTogU2V0IGN1cnJlbnRfcHJvZ3Jlc3MgdmFyaWFibGUgZnJvbSBhcmcuCi0JKG1wd19lbmRfcHJvZ3Jlc3MpOiBSZXBvcnQgc3BpbiBkZWxheXMgYnkgcG93ZXItb2YtdHdvLXNpemUKLQlidWNrZXRzIGluc3RlYWQgb2YgY29uc3RhbnQtc2l6ZSBidWNrZXRzLgotCi0JKiBtcHcuYzogQ2xlYW4gdXAgZm9ybWF0dGluZywgdHlwZXMsIHJldHVybnMsIGV0Yy4KLQkoRU5PU1lTKTogRGVmaW5lLgotCShtcHdfZnJlYWQsIG1wd19md3JpdGUpOiBEZWZpbmUuCi0JKHNsZWVwKTogRGVmaW5lIGNvcnJlY3RseS4KLQotCSogbXB3LmM6IE5ldyBjb2RlIHRvIGltcGxlbWVudCBjdXJzb3Igc3Bpbm5pbmcgc3VwcG9ydC4KLQkodW1hc2spOiBOZXcgZnVuY3Rpb24uCi0JKG1wd19mb3BlbiwgbXB3X2ZzZWVrLCBzdGF0LCBmc3RhdCk6IENhbGwgUFJPR1JFU1MuCi0KLQkqIG1wdy5jIChtcHdfYmFzZW5hbWUsIG1wd19taXhlZF9iYXNlbmFtZSk6IE5ldyBmdW5jdGlvbnMsIGZpbmQKLQliYXNlbmFtZXMgZm9yIE1QVyBhbmQgTVBXL1VuaXggZmlsZW5hbWVzLgotCShtcHdfc3BlY2lhbF9pbml0KTogTmV3IGZ1bmN0aW9uLCBjYWxscyBNYWNzYnVnIGlmIGRlc2lyZWQuCi0KLQkqIG1wdy5jOiBBZGQgR1BMIG5vdGljZS4KLQkobXB3aWZ5X2ZpbGVuYW1lKTogQWRkIG1vcmUgdHJhbnNmb3JtYXRpb25zLgotCShtcHdfZm9wZW4pOiBDYWxsIG1wd2lmeV9maWxlbmFtZSBvbiBmaWxlIG5hbWVzLgotCShyZW5hbWUpOiBSZW1vdmUuCi0JKGNoZGlyLCBnZXRjd2QpOiBBZGQgc2ltcGxlIGRlZmluaXRpb25zLgotCi0JKiBtcHcuYzogUmFuZG9tIGNsZWFudXBzLCByZW1vdmUgdW51c2VkIGNvZGUgYml0cy4KLQlBZGRlZCBjb3B5IG9mIHN0cmVycm9yLmMgZm9yIGdjYydzIHVzZS4KLQkoc3RhdCwgZnN0YXQsIF9zdGF0KTogTmV3IHZlcnNpb25zIGJhc2VkIG9uIEd1aWRvIHZhbiBSb3NzdW0gY29kZS4KLQotCSogbXB3LmMgKG1wd19mc2Vlayk6IE1ha2UgaXQgd29yayBjb3JyZWN0bHkgd2hlbiBkb2luZyBTRUVLX0NVUi4KLQotCSogbXB3LmMgKHN0YXQpOiBSZW1vdmUgaGFjayBkZWZpbml0aW9uLCBnZXQgZnJvbSBzeXMvc3RhdC5oLgotCShmb3JrLCB2Zm9yaywgZXRjKTogUHJpbnQgZXJyb3IgbWVzc2FnZXMgaWYgY2FsbGVkLgotCShnZXRydXNhZ2UsIHNicmssIGVudmlyb24sIGlzYXR0eSwgbGluaywgdXRpbWUsIG1rZGlyLCBybWRpciwKLQlyZW5hbWUsIGNob3duKTogRGVmaW5lLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQkqIG1wdy5jOiBOZXcgZmlsZSwgTVBXIGNvbXBhdGliaWxpdHkgcm91dGluZXMuCi0KLUZyaSBNYXIgMjQgMTQ6MTA6MzAgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGJhc2VuYW1lLmM6IEluY2x1ZGUgY29uZmlnLmggYmVmb3JlIGNoZWNraW5nIGZvciBORUVEX2Jhc2VuYW1lLgotCi1UaHUgTWFyIDIzIDE5OjA5OjU0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBBZGQgREVGRlVOQyBmb3IgYmFzZW5hbWUuCi0KLQkqIGJhc2VuYW1lLmM6IE9ubHkgZGVmaW5lIGJhc2VuYW1lIGlmIE5FRURfYmFzZW5hbWUuCi0KLVRodSBNYXIgMTYgMTM6MzY6MDUgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogRml4IC0tZW5hYmxlLXNoYXJlZCBsb2dpYyBmb3IgbmF0aXZlIGJ1aWxkcy4KLQotTW9uIE1hciAxMyAxMTowNToxMSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRGVtYW5nbGUgYm9vbCBsaXRlcmFscyBwcm9wZXJseS4KLQotTW9uIE1hciAgNiAyMzo1NzoyOCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBzdHJ0b2wuYyBzdHJ0b3VsLmM6ICBSZXBsYWNlIHRoZXNlIHdpdGggbGVzcyBidWdneSB2ZXJzaW9ucyBmcm9tCi0JTmV0QlNELiAgKHN0cnRvdWwgaW4gcGFydGljdWxhciBjb3VsZG4ndCBoYW5kbGUgYmFzZSAxNi4pCi0KLVdlZCBNYXIgIDEgMTU6NTk6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKEhERUZJTkVTKTogRGVmaW5lIE5PX1NZU19QQVJBTV9ILgotCi0JKiBjbG9jay5jOiBJZiBOT19TWVNfUEFSQU1fSCBpcyBkZWZpbmVkLCBkb24ndCBpbmNsdWRlCi0JPHN5cy9wYXJhbS5oPi4KLQkqIGdldGN3ZC5jLCBnZXRwYWdlc2l6ZS5jLCBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi1GcmkgRmViIDE3IDE1OjQwOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2V0cnVudGltZS5jIChnZXRfcnVuX3RpbWUpOiBEb24ndCBhc3N1bWUgdGhhdCBDTE9DS1NfUEVSX1NFQyBpcwotCWEgbnVtYmVyOyBBTlNJIGFwcGVhcnMgdG8gcGVybWl0IGFueSBleHByZXNzaW9uLCBpbmNsdWRpbmcgYQotCWZ1bmN0aW9uIGNhbGwuCi0KLQkqIGNvbmZpZy50YWJsZSAoKi0qLXZ4d29ya3M1Kik6IFVzZSBtdC12eHdvcmtzNSB3aGVuIGNvbmZpZ3VyaW5nCi0JeGliZXJ0eS4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNTogTmV3IGZpbGUuCi0KLVRodSBGZWIgIDkgMTQ6MTk6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiYXNlbmFtZS5jIChiYXNlbmFtZSk6IENoYW5nZSBhcmd1bWVudCB0byBiZSBjb25zdC4KLQotV2VkIEZlYiAgOCAxODowNjo1MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IERvbid0IHdvcnJ5IGFib3V0IHhtYWxsb2MuCi0KLVN1biBKYW4gMTUgMDA6NDA6MzYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgeGhvc3QtbWtmcmFnLgotCi1UaHUgSmFuIDEyIDE2OjU0OjE4IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCBzbyBpcyB4bWFsbG9jLm8uCi0KLVdlZCBKYW4gMTEgMjI6Mzk6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaGV4LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUywgQ0ZJTEVTKTogTGlzdCBpdC4KLQkoaGV4Lm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogRm9yIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBhbmQKLQlkZXN0cnVjdG9yIG5hbWVzLCB0cnkgZGVtYW5nbGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcuCi0KLVdlZCBEZWMgMjggMDA6NDk6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAoaW50X3Zhc3ByaW50Zik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHZhc3ByaW50Zik6IFVzZSBpbnRfdmFzcHJpbnRmLiAgUmVtb3ZlcyBhc3N1bXB0aW9uIHRoYXQgdmFfbGlzdAotCWlzIGFzc2lnbm1lbnQgY29tcGF0aWJsZS4KLQotU2F0IE5vdiAgNSAxOToyOToxMiAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQkNGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgaXQuCi0JKC5jLm8pOiBVc2UgaXQuCi0KLVRodSBOb3YgIDMgMTk6MDk6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2V0b3B0LmMsIGdldG9wdDEuYzogRG8gY29tcGlsZSB0aGVzZSBmdW5jdGlvbnMgdW5kZXIgTGludXgsCi0Jc2luY2UgbWFueSBuYXRpdmUgdmVyc2lvbnMgYXJlIGJhc2VkIG9uIGdsaWJjIGJ1dCBhcmUgYnVnZ3kuCi0KLU1vbiBPY3QgMjQgMTU6MTY6NDYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jOiAgTWFrZSAnZm9ybWF0JyBhcmcgYmUgY29uc3QsIHRvIGF2b2lkIGEgbWlzbWF0Y2gKLQl3aXRoIHByb3RvdHlwZSBpbiBHTlUgbGliYy4gIFN1cHBvcnQgc3RkYXJnLmggYXMgd2VsbCBhcyB2YXJhcmdzLmguCi0KLVR1ZSBPY3QgMTEgMTc6NDg6MjcgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBBZGQgdmFzcHJpbnRmLm8uCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmUgdmFzcHJpbnRmLgotCi1XZWQgU2VwIDE0IDE3OjA0OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IFJlY29yZCBzYnJrICgwKSBpbiBmaXJzdF9icmVhay4KLQkoeG1hbGxvYyk6IElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCB0cnkgdG8gcmVwb3J0IGhvdyBtdWNoCi0JbWVtb3J5IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHByb2dyYW0gdXAgdG8gdGhpcyBwb2ludC4KLQkoeHJlYWxsb2MpOiBMaWtld2lzZS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBNYWtlZmlsZS5pbiAoRVJST1JTX0NDKTogTmV3IHZhcmlhYmxlLCBkZWZhdWx0ZWQgdG8gJChDQykuICBVc2UgaXQKLQl3aGVuIGxpbmtpbmcgZHVtbXkuCi0JKiBjb25maWcudGFibGU6IEFkZCBob3N0IFJJU0NpWCBNYWtlZmlsZSBmcmFnLgotCSogY29uZmlnL21oLXJpc2NpeDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMjUgMTc6Mjk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IERlZmluZS4KLQkoJChSVUxFMSkpOiBVc2UgJChGTEFHU19UT19QQVNTKS4KLQotV2VkIEF1ZyAyNCAxNzowODo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHZhc3ByaW50Zi5jOiBJbmNsdWRlIDxzdHJpbmcuaD4uCi0JKHZhc3ByaW50Zik6IEFkZCBjYXN0cyB0byB2b2lkIGZvciB2YV9hcmcgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCSogeGF0ZXhpdC5jOiBEZWNsYXJlIG1hbGxvYy4KLQotRnJpIEF1ZyAxOSAxNToyOToxMiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJncyk6IEZpeCBhIGJ1ZyBpbiBwcmV2aW91cyBwYXRjaCAodGhlCi0Jb25lIGJlbG93KS4KLQotVGh1IEF1ZyAxOCAxNDozNzoxNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGUgYXJncyk6IEhhbmRsZSBBUk0gcmVwZWF0IGVuY29kaW5nIHdoZXJlCi0JdGhlIHR5cGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIDkuCi0KLVdlZCBBdWcgMTcgMTY6MTM6NDkgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6IGFjY2VwdCBvcHRpb25hbCAnXycgYmV0d2VlbgotCXF1YWxpZmllZCBuYW1lLiBUaGlzIGlzIGJhZWNhdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIG1heSBlbmQgd2l0aAotCW51bWVyaWMgYW5kIGNhbiBtaXhlZCB1cCB3aXRoIHRoZSBsZW5ndGggb2YgbmV4dCBxdWFsaWZpZWQgbmFtZS4KLQotV2VkIEF1ZyAgMyAwNTo1MjoxNCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1zdW5vczQ6IFVzZSBvdXIgc3RhbmRhcmQgbG9jYXRpb24gZm9yIGNyb3NzLWluY2x1ZGVzCi0JYW5kIGNyb3NzLWxpYnMgd2hlbiB0aGUgdGFyZ2V0IGlzIGFsc28gYSAiaG9zdCIgZW52aXJvbm1lbnQgKGllIG5vCi0JbmV3bGliOyBpbmNsdWRlcyBhbmQgc3VjaCBkb24ndCBiZWxvbmcgdG8gdXMpLiAgVGhpcyBpcyBzcGVjaWZpYwotCXRvIHRoZSBDeWdudXMgU3VwcG9ydCBlbnZpcm9ubWVudC4KLQotVHVlIEF1ZyAgMiAxNToyNToxMiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBkZW1hbmdsZSBhcyB4eHg8J1EnPiBub3QKLQl4eHg8Y2g9ODE+LgotCi1Nb24gQXVnICAxIDE3OjAyOjQ4IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogZmx1c2ggc3Rkb3V0IHRvIG1ha2UgcGlwZSB3b3JrLgotCi1TYXQgSnVsIDE2IDEyOjU2OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlICgqLSotY3h1eDcqKTogIFJlY29nbml6ZS4KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X204ODExMF9leHQpIFtIQVJSSVNfRkxPQVRfRk9STUFUXToKLQlIYXJyaXMtc3BlY2lmaWMgZmxvYXQgZm9ybWF0LgotCSogY29uZmlnL21oLWN4dXg3OiBOZXcgZmlsZS4KLQotV2VkIEp1biAyOSAwMDoyNjoxNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6ICBNYWtlIHN1cmUgdGhhdCB0aGUgcmVzdWx0IG9mCi0JY29uc3VtZV9jb3VudCBkb2Vzbid0IGluZGV4IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLU1vbiBKdW4gMjAgMjM6NTQ6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgSGFuZGxlIHZ0YWJsZSBtYW5nbGluZyBvZiBnY2MtMi40LjUgYW5kCi0JZWFybGllci4gSW1wcm92ZSB0ZXN0IGZvciBuZXcgdnRhYmxlIG1hbmdsaW5nLiBDaGFuZ2Ugb3V0cHV0IGJhY2sKLQl0byBgdmlydHVhbCB0YWJsZScuCi0KLU1vbiBKdW4gMjAgMTE6Mzc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6IEFsd2F5cyBjb21waWxlIHRoaXMgY29kZSwgZXZlbiBpZiB1c2luZyB0aGUgR05VCi0JbGlicmFyeS4gIEF2b2lkcyBwcm9ibGVtcyB3aXRoIHJlbGF0aXZlbHkgcmVjZW50IGJpbmFyeQotCWluY29tcGF0aWJpbGl0eS4KLQotVGh1IEp1biAxNiAxNzo1NDowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSh4bWFsbG9jLCB4cmVhbGxvYywgZnJlZSk6IERvbid0IGRlY2xhcmUuCi0JKHN0cnN0cik6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVycy4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBEb24ndCBkZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBuby1zdHJpcC11bmRlcnNjb3Jlcy4KLQkobWFpbik6IENhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLiAgUGFzcyBuIGluIHNob3J0IG9wdGlvbnMgdG8KLQlnZXRvcHRfbG9uZy4gIEhhbmRsZSBvcHRpb24gJ24nIHRvIG5vdCBzdHJpcCB1bmRlcnNjb3Jlcy4KLQkodXNhZ2UpOiBNZW50aW9uIC1uIGFuZCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzLgotCi1TdW4gSnVuIDEyIDAxOjM3OjA5IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBTZXBhcmF0ZSBjb25zZWN1dGl2ZSA+J3Mgd2l0aCBhCi0Jc3BhY2UuCi0JKGdudV9zcGVjaWFsKTogRGVtYW5nbGUgdGVtcGxhdGUgYW5kIHF1YWxpZmllZCBuYW1lcyBpbiBhIHZ0YWJsZSBuYW1lLgotCi1GcmkgTWF5IDI3IDEyOjI3OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlGcm9tIGdhcy0yLjMgYW5kIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZXM6Ci0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiBbbmV3XSBNYWtlZmlsZSBmb3IgZG9zL2dvMzIKLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCi0JKiBtc2Rvcy5jOiByZW1vdmUgc29tZSBmdW5jdGlvbnMgbm93IGluIGxpYmMuYQotCi1GcmkgTWF5IDIwIDE4OjUzOjMyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgUmVjb2duaXplIHRodW5rcywgYXMgd2VsbCBhcwotCXRoZSBuZXcgbmFtaW5nIHN0eWxlIGZvciB2dGFibGVzICh3aGVuIC1mdnRhYmxlLXRodW5rcykuCi0KLVdlZCBNYXkgMTggMTM6MzQ6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogRG9uJ3QgZGVmaW5lLgotCSguYy5vLCBkdW1teS5vKTogRG9uJ3QgdXNlIFhUUkFGTEFHUy4KLQkoJChSVUxFMSkpOiBEb24ndCBwYXNzIFhUUkFGTEFHUyBkb3duIGluIHJlY3Vyc2l2ZSBjYWxsLgotCi1GcmkgTWF5IDEzIDE2OjAyOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB2YXNwcmludGYuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogQWRkIGl0LgotCi1GcmkgTWF5IDEzIDE2OjIwOjI4IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogR3JvayBib29sLgotCi1GcmkgTWF5ICA2IDE0OjQ0OjIxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIGdvMzIKLQkqIGNvbmZpZy9taC1nbzMyOiBOZXcgdGVtcGxhdGUuCi0KLUZyaSBNYXkgIDYgMTE6MDE6NTkgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlLCBjb25maWcvbXQtc3Vub3M0OiBjb25maWcgZm9yIHdoZW4gc3VuNCBpcyBjcm9zcyB0YXJnZXQuCi0KLU1vbiBBcHIgMTEgMDA6NTQ6MzMgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR0NDX19dIFtub3QgX19TVERDX19dOgotCURlY2xhcmUgc3RybGVuIHRvIHJldHVybiBpbnQuICBEb24ndCBpbmNsdWRlIHN0ZGRlZi5oLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotCSogZ2V0b3B0LmM6IERlbGV0ZSB1c2Ugb2YgSU5fR0NDIHRvIGNvbnRyb2wgd2hldGhlcgotCXN0ZGRlZi5oIG9yIGdzdGRkZWYuaCBpcyBpbmNsdWRlZC4KLQotVGh1IEFwciAxNCAxNDowMDo1NiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogRml4IGEgYnVnIGluIHRlbXBsYXRlIGZ1bmN0aW9uCi0JdHlwZSBudW1iZXJpbmcuCi0KLVdlZCBBcHIgMTMgMTc6MjM6MDMgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEZpeCB0ZW1wbGF0ZSBmdW5jdGlvbiB3aXRoIGFybQotCXN0eWxlIGFyZ3VtZW50IHR5cGUgbnVtYmVyLCBUbi4KLQotV2VkIEFwciAxMyAxNzoxMToxNSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG9wdGFibGUpOiBBZGQgbmV3W10gYW5kIGRlbGV0ZVtdLgotCi1GcmkgQXByICA4IDExOjIxOjQyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhcmd2LmMgKGJ1aWxkYXJndik6IERvbid0IHByb2R1Y2UgZW1wdHkgYXJndW1lbnQganVzdCBiZWNhdXNlCi0JdGhlcmUgaXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLQotV2VkIEFwciAgNiAxMTo0MjoxNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBmaXggJ1EnIHF1YWxpZmllZCBuYW1lIGJ1Zy4KLQlIYW5kbGUgJ3AnIHNhbWUgYXMgJ1AnLgotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgJ3AnIHNhbWUgYXMgJ1AnLgotCi1TYXQgTWFyIDI2IDEyOjAwOjEzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZ2V0X2ZpZWxkLCBwdXRfZmllbGQpOiAgRml4IG9mZiBieSBvbmUgZXJyb3IgaW4KLQlsaXR0bGUgZW5kaWFuIGNhc2UuCi0KLVRodSBNYXIgMjQgMTA6NDA6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlKTogUGFzcyB1bnNpZ25lZCBjaGFyICosCi0Jbm90IGNoYXIgKiwgdG8gcHV0X2ZpZWxkLgotCi1GcmkgTWFyIDE4IDEyOjM0OjMzIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBtZW1tb3ZlLmM6ICBSZS13cm90ZTsgIHBsYWNlZCBpbiBwdWJsaWMgZG9tYWluLgotCi1XZWQgTWFyIDE2IDEwOjMzOjA3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogSWYgQVJNIGRlbWFuZ2xpbmcsIGRvbid0IHRyZWF0Ci0JX19RKiBhcyBhIGNvbnN0cnVjdG9yLgotCi1Nb24gTWFyIDE0IDEyOjI2OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi1Nb24gTWFyICA3IDEyOjI4OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZ2V0X2ZpZWxkKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQkocHV0X2ZpZWxkKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQotU3VuIEZlYiAyNyAyMTo1MDoxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYzogTmV3IGZpbGUsIGludGVuZGVkIHRvIHJlcGxhY2UgaWVlZS1mbG9hdC5jLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQotVGh1IEZlYiAyNCAxMTo1MToxMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBSZW1vdmUgI2lmZGVmIEdFVE9QVF9DT01QQVQgYW5kICNpZiAwIGNvZGUuCi0JIChfZ2V0b3B0X2luaXRpYWxpemUpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgX2dldG9wdF9pbnRlcm5hbC4KLQkgKF9nZXRvcHRfaW50ZXJuYWwpOgotCSBJZiBsb25nX29ubHkgYW5kIHRoZSBBUkdWLWVsZW1lbnQgaGFzIHRoZSBmb3JtICItZiIsIHdoZXJlIGYgaXMKLQkgYSB2YWxpZCBzaG9ydCBvcHRpb24sIGRvbid0IGNvbnNpZGVyIGl0IGFuIGFiYnJldmlhdGVkIGZvcm0gb2YKLQkgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KLQkgd2F5IHRvIGdpdmUgdGhlIC1mIHNob3J0IG9wdGlvbi4KLQotVGh1IEZlYiAxMCAxNDo0NDoxNiAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jIFtub3QgX19HTlVfTElCUkFSWV9fXSBbX19HTlVDX19dIFtub3QgSU5fR0NDXToKLQlUZXN0IGp1c3QgX19TVERDX18sIG5vdCBlbWFjcy4KLQotV2VkIEZlYiAgOSAwMDoxNDowMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jIFtub3QgX19HTlVfTElCUkFSWV9fXSBbX19HTlVDX19dIFtub3QgSU5fR0NDXQotCVtlbWFjc10gW25vdCBfX1NURENfX106IERvbid0IGluY2x1ZGUgc3RkZGVmLmguICBEb24ndCBkZWNsYXJlIHN0cmxlbi4KLQotRnJpIERlYyAyNCAxOTo0MzowMCAxOTkzICBOb2FoIEZyaWVkbWFuICAoZnJpZWRtYW5AbnV0cmltYXQuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jIChfTk9fUFJPVE8pOiBEZWZpbmUgYmVmb3JlIGNvbmZpZy5oIGlzIGluY2x1ZGVkLgotCi1Nb24gU2VwIDIwIDE1OjU5OjAzIDE5OTMgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmMgW2VtYWNzIHx8IENPTkZJR19CUk9LRVRTXTogSW5jbHVkZQotCTxjb25maWcuaD4gb25seSB1bmRlciB0aGVzZSwgZWxzZSAiY29uZmlnLmgiLgotCi1UaHUgQXVnIDEyIDE4OjE2OjQ5IDE5OTMgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmMgW0hBVkVfQ09ORklHX0hdOiBJbmNsdWRlCi0JPGNvbmZpZy5oPiBpbnN0ZWFkIG9mICJjb25maWcuaCIuCi0KLVN1biBGZWIgMjAgMTc6MTc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmNhdC5jOiBDaGVjayBBTlNJX1BST1RPVFlQRVMgcmF0aGVyIHRoYW4gX19TVERDX18gdG8gZGVjaWRlCi0Jd2hldGhlciB0byB1c2UgcHJvdG90eXBlcyBvciBub3QuCi0JKiBzdHJlcnJvci5jIChjb25zdCk6IE5ldmVyIHVuZGVmaW5lOyBsZXQgYW5zaWRlY2wuaCBoYW5kbGUgaXQuCi0JKiBzdHJzaWduYWwuYyAoY29uc3QpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxNyAxMzoyNzozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhhdGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBEZWNsYXJlIGFzIGV4dGVybjsgZG9uJ3QgaW5pdGlhbGl6ZS4KLQlNZXJnaW5nIGNvbW1vbiBhbmQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG5lZWQgbm90IGJlIHN1cHBvcnRlZCBieQotCUFOU0kgQyBjb21waWxlcnMuCi0JKHhhdGV4aXQpOiBJbml0aWFsaXplIF94ZXhpdF9jbGVhbnVwIGlmIG5vdCBhbHJlYWR5IHNldC4KLQkqIHhleGl0LmM6IENvbW1lbnQgZml4LgotCi1XZWQgRmViIDE2IDAxOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jOiBEb24ndCBkZWNsYXJlIHhleGl0OyBpdCdzIGRlY2xhcmVkIGluIGxpYmliZXJ0eS5oLgotCSh4cmVhbGxvYyk6IElmIG9sZG1lbSBpcyBOVUxMLCBhbGxvY2F0ZSB3aXRoIG1hbGxvYywgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyB0aGF0IHJlYWxsb2Mgd29ya3MgY29ycmVjdGx5LgotCi1UdWUgRmViIDE1IDA5OjI2OjE2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uY2F0LmMsIGllZWUtZmxvYXQuYzogIFJlcGxhY2UgaW5jbHVzaW9uIG9mIDxzdHJpbmcuaD4KLQl3aXRoIGV4cGxpY2l0IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgYXMgcmVjb21tZW5kZWQgYnkgSWFuIFRheWxvci4KLQotU2F0IEZlYiAxMiAxMDozMToxMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgUFRSIGFuZCBzaXplX3QgdGhyb3VnaG91dC4KLQkobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KLQotVGh1IEZlYiAxMCAxNzowODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYywgYmFzZW5hbWUuYzogSW5jbHVkZSBhbnNpZGVjbC5oIGFuZCBsaWJpYmVydHkuaC4KLQkqIGNvbmNhdC5jLCBmZG1hdGNoLmMsIGdldHJ1bnRpbWUuYywgc3BhY2VzLmM6IExpa2V3aXNlLgotCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmMsIHhhdGV4aXQuYywgeGV4aXQuYzogTGlrZXdpc2UuCi0JKiB4bWFsbG9jLmM6IExpa2V3aXNlLgotCSogY29uY2F0LmM6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4gIElmIF9fU1REQ19fLCB1c2UgPHN0ZGFyZy5oPgotCW1hY3Jvcywgbm90IDx2YXJhcmdzLmg+IG1hY3Jvcy4KLQkqIHNwYWNlcy5jIChzcGFjZXMpOiBNYWtlIHJldHVybiB0eXBlIGNvbnN0LiAgRG9uJ3QgY3Jhc2ggaWYKLQltYWxsb2MgcmV0dXJucyBOVUxMLgotCSogc3RyZXJyb3IuYyAoc3RydWN0IGVycm9yX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMgY29uc3QuCi0JKGVycm9yX25hbWVzKTogTWFrZSBjb25zdC4KLQkoc3RyZXJybm8pOiBNYWtlIGNvbnN0LgotCShzdHJ0b2Vycm5vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIHN0cnNpZ25hbC5jIChzdHJ1Y3Qgc2lnbmFsX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMKLQljb25zdC4KLQkoc2lnbmFsX25hbWVzLCBzeXNfc2lnbGlzdCk6IE1ha2UgY29uc3QuCi0JKHN0cnNpZ25hbCwgc3Ryc2lnbm8pOiBNYWtlIGNvbnN0LgotCShzdHJ0b3NpZ25vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIHhhdGV4aXQuYzogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMuCi0JKiB4bWFsbG9jLmMgKG5hbWUpOiBNYWtlIGNvbnN0LgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogTWFrZWZpbGUuaW4gKElOQ0RJUik6IERlZmluZS4KLQkoLmMubyk6IFVzZSAkKElOQ0RJUikuCi0JKGR1bW15Lm8pOiBMaWtld2lzZS4KLQkoYXJndi5vLCBiYXNlbmFtZS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBsaWJpYmVydHkuaC4KLQkoY29uY2F0Lm8sIGZkbWF0Y2gubywgZ2V0cnVudGltZS5vLCBzcGFjZXMubyk6IExpa2V3aXNlLgotCShzdHJlcnJvci5vLCBzdHJzaWduYWwubywgeGF0ZXhpdC5vLCB4ZXhpdC5vKTogTGlrZXdpc2UuCi0JKHhtYWxsb2Mubyk6IExpa2V3aXNlLgotCShjcGx1cy1kZW0ubyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBkZW1hbmdsZS5oLgotCShnZXRvcHQubywgZ2V0b3B0MS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBnZXRvcHQuaC4KLQkoaWVlZS1mbG9hdC5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIGllZWUtZmxvYXQuaC4KLQkob2JzdGFjay5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIG9ic3RhY2suaC4KLQotVHVlIEZlYiAgOCAwNToyOTowOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCi0Jb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCi0JdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xLCBfb2JzdGFja19uZXdjaHVuayk6Ci0JSWYgQ0FMTF9DSFVOS0ZVTiByZXR1cm5zIE5VTEwsIHNldCBhbGxvY19mYWlsZWQsIGVsc2UgY2xlYXIgaXQuCi0JKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiBub3QuCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25jYXQuYywgaWVlZS1mbG9hdC5jOiAgSW5jbHVkZSA8c3RyaW5nLmg+LgotCi1TdW4gRmViICA2IDIxOjI4OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jICh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogSW5jbHVkZSB0aGUgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgc2V0LgotCi0JKiBSZXBsYWNlIGF0ZXhpdC5jIHdpdGggeGF0ZXhpdC5jLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyksIGZ1bmN0aW9ucy5kZWY6IENoYW5nZSByZWZlcmVuY2VzLgotCi1TYXQgRmViICA1IDE0OjAyOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ2V0cnVudGltZS5jIChnZXRfcnVuX3RpbWUpOiBVc2UgZ2V0cnVzYWdlIG9yIHRpbWVzIGlmCi0JSEFWRV9HRVRSVVNBR0Ugb3IgSEFWRV9USU1FUyBhcmUgZGVmaW5lZC4KLQotRnJpIEZlYiAgNCAxNTo0OTozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGF0ZXhpdC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpLCBmdW5jdGlvbnMuZGVmOiBBZGQgaXQuCi0JKiB4ZXhpdC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMsIFJFUVVJUkVEX09GSUxFUyk6IEFkZCBpdC4KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KLQlDaGFuZ2UgcmVxdWVzdCBmb3IgMCBieXRlcyBpbnRvIHJlcXVlc3QgZm9yIDEgYnl0ZS4KLQotV2VkIEZlYiAgMiAxMTozNjo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBQcmludCBzaXplIHVzaW5nICVsdSwgYW5kIGNhc3QgdG8KLQl1bnNpZ25lZCBsb25nLCB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIEphbiAyOCAxNzo0OTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkdW1teS5jOiBEb24ndCBpbmNsdWRlIHRpbWUuaCBldmVyOyBhbHdheXMgZGVmaW5lIGNsb2NrX3QgYXMKLQkidW5zaWduZWQgbG9uZyIuICBVbnRpbCBnY2MvZml4aW5jbHVkZXMgZW5zdXJlcyB0aGF0IGNsb2NrX3QKLQlleGlzdHMsIF9fU1REQ19fIGlzbid0IGEgc3VmZmljaWVudCB0ZXN0LiAgQW5kIGlmIGNsb2NrKCkgZG9lc24ndAotCWV4aXN0LCBjbG9ja190IHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgotCi1Nb24gSmFuIDI0IDExOjUyOjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY2xvY2suYywgZ2V0cnVudGltZS5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHRvIGZpbGUgbGlzdHMuCi0JKiBmdW5jdGlvbnMuZGVmIChjbG9jayk6IEFkZCB0byBsaXN0LgotCSogZHVtbXkuYyAodGltZS5oKTogQWRkIGlmIF9fU1REQ19fLgotCShjbG9ja190KTogI2RlZmluZSBhcyAidW5zaWduZWQgbG9uZyIgaWYgbm90IF9fU1REQ19fLgotCi1UdWUgSmFuIDExIDExOjI3OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3RydG9kLmM6IERlY2xhcmUgYXRvZi4gIEZyb20gZWRsZXJAamFuLnVsdHJhLm55dS5lZHUgKEphbgotCUVkbGVyKS4KLQotVHVlIERlYyAyOCAxNDoxNzozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlcnJvcnMpOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuCi0JbGlua2luZy4KLQotRnJpIERlYyAxNyAxMjoyNjowNyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBOZXcgZnVuY3Rpb24uICBDb21tb24gY29kZQotCWZvciBBUk0gdGVtcGxhdGUgZGVtYW5nbGluZy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9jbGFzc19uYW1lKTogVXNlIGRlbWFuZ2xlX2FybV9wdC4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBMaWtld2lzZS4KLQotVHVlIE5vdiAzMCAxNTo0Nzo0OCAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IEFkZCBDT05TVCB0byBwbGVhc2UgZ2NjLgotCi1TYXQgTm92IDI3IDExOjA1OjUwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIHRvbUBiYXNpbC5pY2NlLnJ1Zy5ubCAoVG9tIFIuSGFnZW1hbikKLQkqIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgQXMgYSBzbWFsbCBzcGFjZSBvcHRpbWl6YXRpb24sIGRvbid0Ci0JaW5jbHVkZSBtZXNzYWdlcyB3aGVuIHRoZXkgYXJlbid0IGFjdHVhbGx5IHVzZWQuCi0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gdGFrZWZpdmUuY28uYXQham9lIChKb3NlZiBMZWhlcmJhdWVyKQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCwgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSwKLQljcGx1c19kZW1hbmdsZV9vcG5hbWUpOiAgRml4ZXMgZm9yIHN5c3RlbXMgd2hlcmUgY3BsdXNfbWFya2VyCi0JaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gJyQnLgotCi1GcmkgTm92IDI2IDEzOjUxOjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiB3YWl0cGlkLmM6ICBTaW1wbGUtbWluZGVkIGFwcHJvY2ltYXRpb24gdG8gd2FpdHBpZAotCXVzaW5nIHZhbmlsbGEgd2FpdC4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LAotCi1UaHUgTm92IDE4IDE4OjAxOjE1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMoZGVtYW5nbGVfdGVtcGxhdGUpOiBmaXggYnVnIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLQl3aXRoIHZhbHVlIG9mIHVzZXIgZGVmaW5lZCB0eXBlLgotCi1XZWQgTm92IDE3IDE4OjMwOjIxIDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogYWRkIHRoZSBzdWJqZWN0IG5ldyBmdW5jdGlvbgotCXRvIHN1cHBvcnQgdW5pZmllZCBzZWFyY2ggb2Ygb3BlcmF0b3IgaW4gY2xhc3MuCi0KLVdlZCBOb3YgMTAgMDk6NDc6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIHN0cnRvdWwuYyAoc3RydG91bCk6IHVzZSAiKGRpZ2l0ID0gKnMpICE9ICdcMCciIG5vdCBqdXN0Ci0JImRpZ2l0ID0gKnMiIGFzIGNvbmRpdGlvbiBpbiB3aGlsZSBsb29wLgotCi1UdWUgTm92ICA5IDE1OjUyOjIyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIFNIRUxMIHRvIHJlY3Vyc2l2ZSBtYWtlCi0KLVRodSBOb3YgIDQgMTI6MDk6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHZmcHJpbnRmLmMsIHZwcmludGYuYywgdnNwcmludGYuYzogIE1ha2UgZm9ybWF0IGFyZwotCWJlIChjb25zdCBjaGFyKiksIGZvciBBTlNJIChhbmQgZ2NjIHcvZml4cHJvdG8pIGNvbnNpc3RlbmN5LgotCi1UaHUgTm92ICA0IDA4OjI5OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IE1ha2UgKi0qLWhpdXgqIHVzZSBtaC1ocHV4LgotCi1GcmkgT2N0IDIyIDA3OjUzOjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVR1ZSBPY3QgMTkgMTc6MTI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogZW5zdXJlIHRoYXQgb2JqZWN0IGZpbGUgbmFtZXMgYXJlCi0JICBub3QgZHVwbGljYXRlZCwgYXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9iamVjdCBmaWxlIGluCi0JICBhIGxpYnJhcnkgY2F1c2VzIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMKLQotTW9uIE9jdCAxOCAyMTo1OToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RyY2FzZWNtcC5jLCBzdHJuY2FzZWNtcC5jOiBDaGFuZ2UgdV9jaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBPY3QgMTUgMjI6MTc6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJuY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50cyBzdHJuY2FzZWNtcAotCSogc3RyY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50IHN0cmNhc2VjbXAKLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IGxpc3QgdGhlc2UgdHdvIG5ldyBzb3VyY2UgZmlsZXMKLQotCSogZnVuY3Rpb25zLmRlZjogYWRkIHN0cmNhc2VjbXAgYW5kIHN0cm5jYXNlY21wIGVudHJpZXMKLQotRnJpIE9jdCAxNSAxNDo1MzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN0cnRvdWwuYyAoc3RydG91bCksIHN0cnRvbC5jIChzdHJ0b2wpOiBIYW5kbGUgb3ZlcmZsb3cKLQlhY2NvcmRpbmcgdG8gQU5TSSBDLgotCi1UaHUgT2N0IDE0IDE2OjM0OjE5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGFkZCBzdXBwb3J0IG9mIEFSTSBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwKLQlhbmQgJ0cnIGZvciBwYXNzaW5nIHJlY29yZCBvciB1bmlvbiBpbiBwYXJhbWV0ZXIuCi0KLVdlZCBPY3QgMTMgMTM6MzY6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGaXggY29tbWVudCB0byBjbGFyaWZ5IHRoYXQgc3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTCi0Jc2hvdWxkIG5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgotCi1XZWQgT2N0IDEzIDEzOjEzOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlZCB4bWFsbG9jLiAgU3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTIHNob3VsZAotCW5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgotCi1Nb24gT2N0ICA0IDE4OjI2OjM5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGNoYW5nZSBnbG9ibCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRvIHByb3BlciBuYW1lCi0KLVR1ZSBTZXAgMjggMTg6MTE6MDcgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogZml4IGJ1ZyBpbiBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCi0KLVR1ZSBTZXAgMjggMTY6MjA6NDkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogc3VwcG9ydCBib3RoIG9sZCBhbmQgbmV3IF92dCQuLi4gdnRibCBtYW5nbGVkIG5hbWVzCi0KLUZyaSBTZXAgMjQgMTk6MDc6MTYgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBGaXggZGVtYW5nbGVfdGVtcGxhdGUgcHJvdG90eXBlCi0KLUZyaSBTZXAgMjQgMTc6MzI6NTUgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogZml4IHRlbXBsYXRlIGRlbWFuZ2xpbmcKLQkqIGNwbHVzLWRlbS5jOiBmaXggY29uc3QgdHlwZSBkZW1hbmdsaW5nCi0JKiBjcGx1cy1kZW0uYzogZml4IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IsIHZpcnR1YWwgdGFibGUsCi0JcXVhbGlmaWVyLCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZW1hbmdsaW5nCi0KLVdlZCBTZXAgIDEgMjM6MTM6MTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jLCBzdHJlcnJvci5jOiBVc2UgZnVsbHktYnJhY2tldGVkIGluaXRpYWxpemVyIHRvCi0Ja2VlcCBnY2MgLVdhbGwgaGFwcHkuCi0KLUZyaSBBdWcgMjcgMTA6MzA6MDkgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogQWRkIENPTlNUUyB0byBtYWtlIGdjYyBoYXBweSB3aXRoIGxhc3QKLQlwYXRjaC4KLQotRnJpIEF1ZyAyNyAxMToyNDo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCVBhdGNoIGZyb20gUGF1bCBGbGluZGVyczoKLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogRGVhbCB3aXRoIGFycmF5cy4KLQotVHVlIEF1ZyAyNCAxNDoyMzo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZDogRGVhbCB3aXRoIEdOVSBmb3JtYXQgZm9yIG1vcmUKLQl0aGFuIDkgY2xhc3Nlcy4KLQotV2VkIEF1ZyAxOCAxOTo1MDoyOSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGR1bW15Lm8pOiBSZWRpcmVjdCB0byAvZGV2L251bGwgdG8gYXZvaWQgInZhcmlhYmxlCi0Jbm90IGluaXRpYWxpemVkIiB3YXJuaW5ncyB1bmRlciBIUC9VWAotCi1TdW4gQXVnIDE1IDIwOjQyOjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJlcnJvci5jOiBNb3ZlIGluY2x1ZGUgb2Ygc3RkaW8uaCBhZnRlciBzeXNfZXJybGlzdCAjZGVmaW5lLgotCUFsc28gcmVtb3ZlIE5VTEwgZGVmaW5pdGlvbiAoc3RkaW8uaCBhbHdheXMgZGVmaW5lcyBOVUxMLCBzbyBpdAotCW5ldmVyIGRpZCBhbnl0aGluZyBidXQgY2x1dHRlciB1cCB0aGUgY29kZSkuCi0KLVNhdCBBdWcgMTQgMTQ6MjE6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogaGFuZGxlIHhtYWxsb2MuYwotCi0JKiB4bWFsbG9jLmM6IHByb3ZpZGUgeG1hbGxvYyBhbmQgeHJlYWxsb2MgZnVuY3Rpb25zCi0KLVRodSBBdWcgMTIgMTc6Mzg6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogRml4IGEgY29tbWVudC4KLQotU2F0IEF1ZyAgNyAxMzo1NjozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdDEuYzogRGVjbGFyZSBjb25zdCB0aGUgd2F5IGdldG9wdC5jIGRvZXMuCi0KLUZyaSBBdWcgIDYgMTc6MDM6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMsIGFsbG9jYS5jOiBVcGRhdGUgZnJvbSBGU0YuCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbiwgd2hpY2gKLQlkb2Vzbid0IHVzZSBhbGxvY2EuCi0KLVR1ZSBKdWwgMjcgMTQ6MDM6NTcgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBBZGQgdGhlIHRhcmdldCB3aXRoIGEgbWVzc2FnZSBzYXlpbmcKLQl3aGVyZSBkZW1hbmdsZSB3ZW50LgotCi1Nb24gSnVsIDI2IDE1OjQ5OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIGBkZW1hbmdsZScgdGFyZ2V0LgotCi1UaHUgSnVsIDIyIDA4OjMxOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoYXJtX3NwZWNpYWwpOiAgQXBwbHkgcGF0Y2ggZnJvbSBhcmdAbHVjaWQuY29tIHRvCi0JYXZvaWQgaW5maW5pdGUgbG9vcCBvbiB2dGJsIHN5bWJvbHMgd2l0aCBkaXNhbWJpZ3VhdGluZyAianVuayIKLQl0YWNrZWQgb24gdGhlIGVuZC4KLQotTW9uIEp1bCAxOSAxNDoxMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiB3b3JrIGFyb3VuZCBzb21lIHN5c3RlbXMgbG9zaW5nIGRlZmluaXRpb25zIG9mCi0Jc3lzX3NpZ2xpc3QKLQotCSogY29uZmlnL21oLWx5bnhvczogdGhpcyBzeXN0ZW0gaGFzIGEgbG9zaW5nIGRlZmluaXRpb24gb2YKLQlzeXNfc2lnbGlzdAotCi0JKiBjb25maWcudGFibGU6IHVzZSBtaC1seW54b3MgZm9yICotKi1seW54b3MKLQotTW9uIEp1bCAxOSAxNzowODo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIHN1cHBvcnQgZm9yIEhQUEEgQlNEIGhvc3RzLgotCi0JKiBjb25maWcvbWgtaHBic2Q6IE5ldyBmaWxlLgotCi1Nb24gSnVsIDEyIDE4OjAwOjQwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IG1ha2Ugd29yayB3aGVuIHNyY2RpciAhPSBvYmpkaXIuCi0KLVN1biBKdW4gMjcgMTU6MzU6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IEFkZCBsb25nIG9wdGlvbnMsIGluY2x1ZGluZyAtLWhlbHAgYW5kCi0JLS12ZXJzaW9uLgotCSh1c2FnZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gbWFpbi4KLQotVHVlIEp1biAyMiAxMTozNzozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiAgTmV3IHNoZWxsIHNjaXB0LCBzb3VyY2VkIGJ5IGJvdGggLi9jb25maWd1cmUsaW4KLQlhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW4sIHRvIGF2b2lkIG1haW50YWluYW5jZSBsb3NzYWdlcy4KLQkqIGNvbmZpZ3VyZS5pbiBhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVc2UgY29uZmlnLnRhYmxlLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBtaC1haXggZm9yIEFJWCAzLjIsIG9ubHkgZm9yIDMuMS4KLQkqIGNvbmZpZ3VyZS5pbjogTWFwICotKi1pcml4KiAoZXhjZXB0IGlyaXg0KSB0byBtaC1zeXN2LgotCSogLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVcGRhdGUgZnJvbSAuL2NvbmZpZ3VyZS5pbi4KLQotVHVlIEp1biAxNSAxNzowNTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKLQotV2VkIE1heSAyNiAxMjo1OTowOSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jICh4cmVhbGxvYyk6ICBNYXRjaCBkZWZpbml0aW9uIHdpdGggcHJvdG90eXBlLgotCi1UdWUgTWF5IDI1IDE0OjI3OjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6ICBEZW1hbmdsZSBjZnJvbnQKLQlsb2NhbCB2YXJpYWJsZXMgYXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nLgotCi1GcmkgTWF5IDIxIDA5OjUzOjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6IERvbid0IHJlcXVpcmUgcG9pbnRlcnMgdG8gZG91YmxlIHRvIGJlIGFsaWduZWQuCi0KLVR1ZSBNYXkgMTggMTc6MTI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkobWVyZ2UgY2hhbmdlcyBmcm9tIGRsb25nQGNzZS51Y3NjLmVkdSkKLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFNpbXBsaWZ5LgotCSogY3BsdXMtZGVtLmMgKGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZSk6ICBOZXcgZnVuY3Rpb25zLgotCSogY3BsdXMtZGVtLmMgKHZhcmlvdXMpOiAgQ2FsbHMgdG8gYXJtX3B0LCBkZW1hbmdsZV9jbGFzc19uYW1lLgotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MsIHN0cnN0cik6ICBNYWtlIGV4dGVybiBkZWNscyBpbnRvCi0JZnVsbCBwcm90b3R5cGVzLgotCSogY3BsdXMtZGVtLmMgKGZyZWUpOiAgQWRkIHByb3RvdHlwZS4KLQkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogIEZ1bGx5IGJyYWNrZXRpemUgaW5pdGlhbGl6ZXIuCi0KLUZyaSBNYXkgMTQgMTc6MTM6MDUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgV2hldGhlciBpbml0aWFsIHVuZGVyc2NvcmVzIGFyZSBzdHJpcHBlZAotCWRlcGVuZHMgb24gdGhlIGV4dGVybmFsIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUKLQkod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZSBiaW51dGlscyBNYWtlZmlsZSkuCi0KLUZyaSBNYXkgMTQgMDc6MzI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtb3BfdXAsIGFybV9zcGVjaWFsKTogUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQotVHVlIE1heSAgNCAyMDozMTo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiAgUmV0dXJuIHplcm8gaWYgYXJnIGRvZXMgbm90Ci0Jc3RhcnQgd2l0aCBkaWdpdCwgYW5kIGRvbid0IGNvbnN1bWUgYW55IGlucHV0LgotCi1UdWUgTWF5ICA0IDA4OjEwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBVc2UgJHtzcmNkaXJ9IG5vdCAkXi4KLQotCSogc3RydG9kLmM6IE5ldyBmaWxlLCBuZWVkZWQgYXQgbGVhc3QgZm9yIEJTRCA0LjMuCi0KLVN1biBNYXkgIDIgMTE6MzA6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBGb3IgQU5TSSBjb21waWxhdGlvbnMsIHR5cGUgaXMKLQkiY29uc3QgY2hhciAqY29uc3QiLiAgQWxzbyByZW1vdmUgY29uZGl0aW9uYWxpemF0aW9uIG9uIF9fU1REQ19fCi0Jc2luY2UgY29uc3QgaXMgZGVmaW5lZCBhd2F5IGZvciBub24tQU5TSS4KLQotV2VkIEFwciAyOCAxOToyOTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgKi0qLWhwdXguCi0JKiBjb25maWcvbWgtaHB1eDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMTU6MjI6MTkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRtcG5hbS5jOiAgQWRkZWQgQU5TSSB0bXBuYW0oKSBmdW5jdGlvbi4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1UdWUgQXByIDI3IDEzOjM4OjM4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBHZXQgdGhlIGRlbWFuZ2xpbmcgb2YKLQlzdG9wX18xQSByaWdodC4KLQotRnJpIEFwciAxNiAyMzo0ODoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY2FsdmluKQotCi0JKiBjcGx1cy1kZW0uYzogRGVjbGFyZSBzdHJzdHIgcmV0dXJuIHR5cGUuCi0KLUZyaSBNYXIgMjYgMTI6MDE6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiBBZGQgc29tZSBBSVggc2lnbmFscy4KLQotVGh1IE1hciAyNSAxNToxNzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDI0IDAxOjU5OjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCi0KLVRodSBNYXIgMTggMTQ6MDU6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIgKHNpbmNlIGl0IGlzCi0JbmVlZGVkIGJ5IC4uL29wY29kZS9tNjhrLWRpcy5jKS4KLQotVHVlIE1hciAgMiAxNzo0NzozMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KLQotRnJpIEZlYiAyNiAwMDoxNzowNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgRml4IG1haW4gcHJvZ3JhbSAod2hlbiBjb21waWxlZCB3aXRoIC1ETUFJTikKLQl0byBiZSBtb3JlIHVzZWZ1bCBhcyBhIGZpbHRlci4KLQotU2F0IEZlYiAyMCAyMTo0MTozOSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpciwgaW5zdGFsbF90b190b29sZGlyKTogR28gaW50byB0aGUKLQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgJChSQU5MSUIpLCBpbiBjYXNlIHRoYXQKLQlwcm9ncmFtIHRyaWVzIHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIHBhcnQgb2YKLQlpdHMgd29yay4KLQotVGh1IEZlYiAxOCAyMzowMDoxOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHN5c19zaWdsaXN0KTogIFJlbW92ZSB5ZXQgYW5vdGhlciAqJV4mJSYkIyAiY29uc3QiCi0JYmVjYXVzZSBCU0QgNC40IGxhY2tzIG9uZS4gIElzbid0IHRoaXMgZnVuPwotCi1UaHUgRmViIDE4IDExOjI0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIFNldCBmdW5jX2RvbmUgYWZ0ZXIKLQlkZW1hbmdsaW5nIGEgdGVtcGxhdGUuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiAgRml4IHNldmVyYWwgc21hbGwgYnVncwotCWluIGRlbWFuZ2xpbmcgR05VIHN0eWxlIHRlbXBsYXRlcy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiAgRml4IGZvciB0ZW1wbGF0ZXMgaW4gR05VCi0Jc3R5bGUgY29uc3RydWN0b3JzLgotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVSBzdHlsZQotCXN0YXRpYyBkYXRhIG1lbWJlcnMuCi0KLVR1ZSBGZWIgMTYgMTc6Mjg6MzUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgTW9kaWZ5IHRvIGluY2x1ZGUgdHlwZQotCW1vZGlmaWVycyBsaWtlIHN0YXRpYyBhbmQgY29uc3QgaW4gcmVtZW1iZXJlZCB0eXBlcy4KLQotVGh1IEZlYiAxMSAyMjoyMDo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlZF9xdWFsaWZpZWQpOiAgQWRkIG5ldyBwYXJhbWV0ZXIgdGhhdCB0ZWxscwotCXdoZXRoZXIgdG8gcHJlcGVuZCBvciBhcHBlbmQgdGhlIHF1YWxpZmllcnMuCi0JKiBjcGx1cy1kZW0uYyAoc3RyaW5nX3ByZXBlbmRzKTogIFVzZWQgbm93LCByZW1vdmUgI2lmIDAuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIENhbGwgZGVtYW5nbGVfcXVhbGlmaWVkCi0Jd2l0aCBwcmVwZW5kaW5nLgotCSogY3BsdXNfZGVtLmMgKGdudV9zcGVjaWFsKTogIFJlY29nbml6ZSBzdGF0aWMgZGF0YSBtZW1iZXJzIHRoYXQKLQl1c2UgcXVhbGlmaWVkIG5hbWVzLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6ICBBY2N1bXVsYXRlIHF1YWxpZmllcnMgaW4gYQotCXRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZSBwcmVwZW5kIG9yIGFwcGVuZCB0aGVtIHRvIHRoZSByZXN1bHQsCi0JYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZXcgImFwcGVuZCIgZmxhZy4KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogIENhbGwgZGVtYW5nbGVkX3F1YWxpZmllZCB3aXRoCi0JYXBwZW5kaW5nLgotCi1Nb24gRGVjIDI4IDEwOjQ3OjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc2lnbmFsX3RhYmxlKTogTm93IGNvbnN0LgotCShpbml0X3NpZ25hbF90YWJsZXMpOiBWYXJpYWJsZSBlaXAgbm93IHBvaW50cyB0byBjb25zdC4KLQotCSogc3RyZXJyb3IuYyAoZXJyb3JfdGFibGUpOiBOb3cgY29uc3QuCi0JKGluaXRfZXJyb3JfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCi0KLVR1ZSBEZWMgMTUgMTU6MzY6NTAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG1lbWNoci5jIChtZW1jaHIpOiAgTmV3IChBTlNJIHN0YW5kYXJkKSBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgQWRkZWQgbWVtY2hyLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogVXNlIHJjIGluc3RhZCBvZiBub24tc3RhbmRhcmQgY3EuCi0KLVdlZCBEZWMgIDIgMjI6NDk6MTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogcmVtb3ZlIHVzZSBvZiBVU0cgYXJvdW5kIDxhbGxvY2EuaD4sIHdoaWNoIG5ldmVyIG1lYW50Ci0JYW55dGhpbmcgYW55d2F5Ci0KLQkqIGNvbmZpZy9taC17YWl4LGFwb2xsbzY4LG5jcjMwMDAsc3lzdixzeXN2NH06IHJlbW92ZWQgZGVmaW5pdGlvbnMKLQlvZiBVU0cgYW5kIFVTR3I0Ci0KLVRodSBOb3YgMTkgMDM6MDk6MzMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogUmVjb2duaXplIGB3JywgYSB3aWRlIGNoYXJhY3RlcjsKLQlpdCdzIG5vdyBhIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBBTlNJIFgzSjE2IHdvcmtpbmcgcGFwZXI7IG91dHB1dAotCSJ3Y2hhcl90IiBmb3IgaXQuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWNjZXB0IGB3JyBhcyBhbiBpbnRlZ3JhbCB0eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBgY2hhciAqJywgbm90IGBQVFInLiAgQ2FzdCBjYWxscyB0byB0aGVpcgotCWNvdW50ZXJwYXJ0cyBtYWxsb2MgYW5kIHJlYWxsb2MgdG8gYGNoYXIgKicuCi0JKG1haW4pOiBFeGl0IHdpdGggYSAwIHN0YXR1cy4KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IERvbid0IGV4cGVjdCB0aGUgdXNlciB0byBkZWZpbmUKLQlERU1BTkdMRSwgaW5zdGVhZCBmb3JjZSB0byBiZSBjcGx1cy1kZW0uYy4gIExvb2sgaW4gJChzcmNkaXIpLy4uL2luY2x1ZGUKLQlmb3IgZGVtYW5nbGUuaC4gIFBhc3MgaXQgYW55IEhERUZJTkVTIG9yIFhUUkFGTEFHUy4KLQotV2VkIE5vdiAxOCAxODo1NjoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIEF2b2lkIHZlcmJvc2l0eS4KLQkqIGNvbmZpZy9taC1zeXN2NDogIFJlbW92ZSBBUl9GTEFHUyBvdmVycmlkZSwgdXNlIElOU1RBTEw9Y3AsCi0JcmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiAgUmVtb3ZlOyBtaC1zeXN2NCB3b3JrcyBub3cuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgUmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZ3VyZS5pbjogIFNpbXBsaWZ5IGhvc3QgbWF0Y2hpbmcgdGFibGUsIHJlbW92ZSBzZXBhcmF0ZQotCXNvbGFyaXMgY29uZmlnIGZpbGUuCi0KLVN1biBOb3YgMTUgMDk6MzU6MTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBBZGQsIHVzZSBtaC1zeXN2NC4KLQotVHVlIE5vdiAgMyAyMToyNzowMyAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBBZGQgZGVjbHMuCi0JKHJlbWVtYmVyX3R5cGUpOiBEb24ndCBjYXN0IHhtYWxsb2MuCi0JKHN0cmluZ19uZWVkKTogTGlrZXdpc2U7IGRvbid0IGNhc3QgeHJlYWxsb2MgZWl0aGVyLgotCi1GcmkgT2N0IDIzIDA4OjUyOjAxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWZzLCByZW5hbWUuYzogYWRkZWQgc2ltcGxlCi0JaW1wbGVtZW50YXRpb24gb2YgcmVuYW1lLCBzaW5jZSBzb21lIGJpbnV0aWxzIHByb2dyYW1zIHVzZSBpdC4KLQotVGh1IE9jdCAxNSAxNToxODoyMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6ICBBZGQgYXBwcm9wcmlhdGUgJ2NvbnN0JyB0byBzeXNfc2lnbGlzdAotCWV4dGVybiBkZWNsYXJhdGlvbiAoaWYgX19TVERDX18pLiAgKE5lZWRlZCBmb3IgTGludXguKQotCSogc3Ryc2lnbmFsLmMgKHN0cnNpZ25hbCk6IEFkZCBjYXN0IHRvIHJlbW92ZSBjb25zdC1uZXNzLgotCi1GcmkgT2N0ICA5IDAzOjIyOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobmVlZGVkLmF3aywgbmVlZGVkMi5hd2spOiAgUmVtb3ZlIGVycm9uZW91cyBcJ3MKLQliZWZvcmUgIidzLCBkaWFnbm9zZWQgYnkgQlNEIDQuNCBhd2suCi0KLVRodSBPY3QgIDggMTU6MjU6MTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY3JlYXRlIGNvbmZpZy5oIGFuZCBuZWVkZWQtbGlzdCB0aHJvdWdoICQoQ09ORklHX0gpCi0JYW5kICQoTkVFREVEX0xJU1QpLCB0byBnaXZlIHNvbWUgaG9va3MgZm9yIHhpYmVydHkuCi0KLVRodSBPY3QgIDEgMjM6MzE6NDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLXRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDExOjI2OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyZ3YuYywgYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLAotCWNvbmNhdC5jLCBjcGx1cy1kZW0uYywgZmRtYXRjaC5jLCBnZXRjd2QuYywgZ2V0b3B0LmMsIGdldG9wdDEuYywKLQlnZXRwYWdlc2l6ZS5jLCBpbnNxdWUuYywgbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLAotCW9ic3RhY2suYywgc2lnc2V0bWFzay5jLCBzcGFjZXMuYywgc3RyY2hyLmMsIHN0cmVycm9yLmMsCi0Jc3RycmNoci5jLCBzdHJzaWduYWwuYywgc3Ryc3RyLmMsIHZmb3JrLmMsIHZzcHJpbnRmLmM6Ci0JQ29udmVydCBmcm9tIHVzaW5nIEdQTCB0byBMR1BMLgotCi1TYXQgU2VwIDI2IDA0OjAxOjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXJyb3JzKTogIExlYXZlIGR1bW15Lm8gYW5kIGR1bW15IGFyb3VuZCBzbyB0aGF0Ci0Jd2UgY2FuIHNlZSBob3cgdGhlIG5lZWRlZCBsaXN0IHdhcyBnZW5lcmF0ZWQgKGl0J3Mgc29tZXRpbWVzIHdyb25nKS4KLQkobW9zdGx5Y2xlYW4pOiAgUmVtb3ZlIHRoZW0uCi0KLU1vbiBTZXAgMjEgMTQ6NTA6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYzogc3VwcGx5IGEgZGVmYXVsdCBpZiBNQVhQQVRITEVOIGlzIG5vdCBkZWZpbmVkLgotCi0JKiBjb25maWcvbWgtaXJpeDQ6IHNldCBFWFRSQV9PRklMRVMgdG8gYWxsb2NhLm8sIGZyb20gV1JTLgotCi1XZWQgU2VwICA5IDEyOjQxOjQ4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVzZSBYVFJBRkxBR1Mgd2hlbiBjb21waWxpbmcsIHNvIHRoYXQgeGliZXJ0eSB3b3JrcwotCXdoZW4gY3Jvc3MtY29tcGlsaW5nLgotCi1UaHUgU2VwICAzIDEzOjI5OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IChkZW1hbmdsZV9wcmVmaXgpOiByZWR1Y3Rpb24gaW4gc3RyZW5ndGggb2Ygc3Ryc3RyCi0JICBhcyBhIHRpbWUgb3B0aW1pemF0aW9uLgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiByZW1vdmUgc3RycGJyayB0ZXN0LiAgQXBwZWFycyB0bwotCSAgYmUgbW9yZSBleHBlbnNpdmUgdGhhbiBzaW1wbHkgZGVtYW5nbGluZy4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX21hdGNoKTogbmV3IGZ1bmN0aW9uLgotCi1UdWUgU2VwICAxIDE1OjI0OjA0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICAjaW5jbHVkZSA8c3RkaW8uaD4sIHRvIGRlZmluZSBOVUxMLgotCURlZmluZSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUuCi0KLVN1biBBdWcgMzAgMTc6NTg6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYi4KLQkqIGNwbHVzLWRlbS5jIChzZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nKTogIE5ldyBleHBvcnRlZAotCWZ1bmN0aW9uLCB0byBhdm9pZCBjb21waWxpbmcgaW4gdGFyZ2V0LWRlcGVuZGVuY3kgZm9yIENQTFVTX01BUktFUi4KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6ICBBbGxvdyBkZW1hbmdsaW5nIHN0eWxlIG9wdGlvbgotCXRvIGJlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwgYnV0IHVzaW5nIHRoZSBnbG9iYWwgdmFyaWFibGUKLQljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgYXMgYSBkZWZhdWx0LgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGNwbHVzLWRlbS5jCi0KLVNhdCBBdWcgMjkgMTA6NDQ6MDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIGluIGNvbW1lbnQgY2hhbmdlcyBmcm9tIEZTRiB2ZXJzaW9uLiAgTm93Ci0JbWF0Y2hlcyB0aGUgRlNGIHZlcnNpb24gZXhhY3RseS4KLQotRnJpIEF1ZyAyOCAxODozOTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChDQUxMX0ZSRUVGVU4pOiAgQ2FuJ3QgdXNlID86IHdpdGggdm9pZCB2YWx1ZXMgKGF0Ci0JbGVhc3Qgb24gbG9zaW5nIERFQ3N0YXRpb25zISk7IHVzZSBpZi10aGVuLWVsc2UgaW5zdGVhZC4KLQotV2VkIEF1ZyAxOSAxNDo0MDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotTW9uIEF1ZyAxMCAxNzozMzo0MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBjbGVhbiB1cCBkZWZpbml0aW9uIG9mIENGSUxFUywgbW9yZSBjb21tZW50cwotCi1TYXQgQXVnICA4IDIzOjEwOjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAobXlfaW5kZXgpOiAgTWFrZSBmaXJzdCBhcmcgY29uc3QgdG8gbWF0Y2ggc3RyY2hyLAotCXdoaWNoIGl0IHNvbWV0aW1lcyBpcyByZW1hcHBlZCB0by4KLQotU2F0IEF1ZyAgMSAxMzo0ODo1MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChERUZBVUxUX0FMSUdOTUVOVCk6ICBVcGRhdGUgdG8gbWF0Y2ggRlNGIHZlcnNpb24uCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIEluaXRpYWxpemUgdXNlX2V4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW5fMSk6ICBOZXcsIGZyb20gRlNGIHZlcnNpb24uCi0KLU1vbiBKdWwgMjAgMjE6MDc6NTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9DSEVDS0ZVTiwgQ0FMTF9GUkVFRlVOKTogIFVzZSB1c2VfZXh0cmFfYXJnIGFuZAotCWV4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4pOiAgUmVtb3ZlIGFyZWFfaWQgYW5kIGZsYWdzIGFyZ3VtZW50cwotCShwcmV2aW91c2x5IGFkZGVkIGZvciBtbWFsbG9jIHN1cHBvcnQsIGludGVyZmFjZSBoYXMgY2hhbmdlZCkuCi0JQWxzbyBjb252ZXJ0IGZsYWdzIHVzYWdlIHRvIHVzZSB1c2VfZXh0cmFfYXJnIGFuZCBtYXliZV9lbXB0eV9vYmplY3QuCi0KLUZyaSBKdWwgMTAgMDA6NDE6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIE1vdmUgZXhwYW5kYXJndiBpbmxpbmUgYW5kIGVsaW1pbmF0ZSBzdGF0aWMgdmFyaWFibGVzLgotCVJld3JpdGUgdG8gYWx3YXlzIGFsbG9jYXRlIGluIHBvd2VycyBvZiB0d28uICBGaXggdG8gcmV0dXJuIGFuCi0JYXJndiB3aXRoIGEgc2luZ2xlIG51bGwgc3RyaW5nIGFyZyBpZiBwYXNzZWQgYSBudWxsIHN0cmluZy4KLQotRnJpIEp1bCAgMyAyMDoyNzoyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmFuZG9tLmMsIHNpZ3NldG1hc2suYywgc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBSZW1vdmUKLQkiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLU1vbiBKdW4gMjkgMTA6NTQ6MTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGJjb3B5LmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgTGludC4KLQotVGh1IEp1biAyNSAwOToxODo0MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZSBjaGFuZ2VzIGZyb20gbWFrZS4KLQotVGh1IEp1biAyNSAwNDo0MzoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYWxsb2NhLmM6ICBJbmNvcnBvcmF0ZSBmaXhlcyBmcm9tIGdkYi9hbGxvY2EuYy4KLQlGSVhNRTogIEV2ZW50dWFsbHkgbW92ZSBnZGIncyBhbGxvY2EgY29uZmlndXJhdGlvbiBmaWxlcyBoZXJlLAotCWFuZCByZW1vdmUgZ2RiL2FsbG9jYS5jIGFuZCBpdHMgTWFrZWZpbGUuaW4gc3VwcG9ydC4KLQotVHVlIEp1biAyMyAyMTo1NjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHVtbXkuYzogIERlZmluZSBOT1RISU5HIHRvIC8qbm90aGluZyovLCBjaGFuZ2UgcmV0dXJuIHR5cGUKLQlvZiBtYWluIHRvIGludCBhbmQgcmV0dXJuIHplcm8uCi0JKiBmdW5jdGlvbnMuZGVmOiAgU3VwcGx5IE5PVEhJTkcgYXMgdGhlIGZvdXJ0aCBhcmcgdG8gbWFjcm9zCi0JdGhhdCBkb24ndCBoYXZlIGFuIGV4cGxpY2l0IGFyZywgdG8gc2F0aXNmeSBwaWNreSBwcmVwcm9jZXNzb3JzLgotCi1XZWQgSnVuIDE3IDE4OjEzOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCAqY2xlYW4gcnVsZXMsIGFzIHBlciBzdGFuZGFyZHMudGV4aS4KLQotVHVlIEp1biAxNiAxNjoxMTo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IG1lcmdlZCBsYXJnZWx5IGdyYXR1aXRvdXMsIG1vc3RseQotCSAgd2hpdGVzcGFjZSBkaWZmcyBmcm9tIG90aGVyIHByZXAgZGlzdHJpYnV0aW9ucy4KLQotTW9uIEp1biAxNSAxMjoyNTo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0KLU1vbiBKdW4gMTUgMDE6MDM6MjYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNpZ3NldG1hc2suYzogIFJld3JpdGUuICBPbGQgb25lIHdhcyB2ZXJ5IGNvbmZ1c2VkIGFib3V0IGl0cwotCWFyZ3VtZW50cyBhbmQgcmVzdWx0LiAgTmV3IG9uZSBjYW4ndCBkbyBtdWNoLCBidXQgYXQgbGVhc3Qga25vd3MKLQl3aGF0IGl0IGNhbid0IGRvLCBhbmQgaXQncyBnb29kIGVub3VnaCBmb3IgR0RCJ3MgdXNlLgotCi1TdW4gSnVuIDE0IDE1OjE3OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWY6ICBVc2UgcHJvcGVyIHByb3RvdHlwZSBmb3Igc3RydG91bC4KLQotRnJpIEp1biAxMiAxOToyMjo0MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgcmFuZG9tLmMuCi0JKiBjb25maWcvbWgtKjogIFVzZSAidHJ1ZSIgcmF0aGVyIHRoYW4gImVjaG8gPi9kZXYvbnVsbCIgZm9yIHJhbmxpYi4KLQkqIGNvbmZpZ3VyZS5pbjogIHVwZGF0ZSBzb2xhcmlzMiBjb25maWcuCi0KLVdlZCBKdW4gMTAgMTY6MzE6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJhbmRvbS5jOiAgQWRkIGZvciByYW5kb20oKSBhbmQgc3JhbmRvbSgpLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCByYW5kb20KLQotVHVlIEp1biAgOSAxNzoyNzoxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBBZGQgZGVmaW5pdGlvbiBmb3IgSU5TVEFMTAotCXVzaW5nIC91c3IvdWNiL2luc3RhbGwuCi0KLU1vbiBKdW4gIDEgMTM6MjA6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJlcnJvci5jOiAgS2x1ZGdlIHRvIGd1YXJkIGFnYWluc3QgYSBjb25mbGljdCB3aXRoCi0JcG9zc2libGUgZGVjbGFyYXRpb24gb2Ygc3lzX2Vycmxpc3QgaW4gZXJybm8uaC4KLQotU3VuIE1heSAzMSAxNTowNzo0NyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zb2xhcmlzOiBhZGQgc29sYXJpczIgY29uZmlnIHN1cHBvcnQuCi0KLUZyaSBNYXkgMjkgMTc6MjM6MjMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzaWdzZXRtYXNrLmM6ICAjaWZkZWYgb3V0IHNpZ3NldG1hc2sgaWYgU0lHX1NFVE1BU0sKLQlpcyBub3QgZGVmaW5lZCAoc2hvdWxkIGJlIGRlZmluZWQgaW4gc2lnbmFsLmgsIHNheXMgUG9zaXguKS4KLQotTW9uIE1heSAxOCAxNzozNTowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gbWFrZS0zLjYyLjExLgotCi1GcmkgTWF5ICA4IDE0OjUzOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2VkIGNoYW5nZXMgZnJvbSBiaXNvbi0xLjE4LgotCi1UdWUgTWF5ICA1IDExOjUxOjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBEb24ndCBoYXZlICQoRVhUUkFfT0ZJTEVTKSBkZXBlbmQgb24gY29uZmlnLmgsCi0Jc2luY2UgdGhhdCBpbnRyb2R1Y2VzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkoJChFWFRSQV9PRklMRVMpIGFyZSB1c2VkIHRvIGJ1aWxkIGNvbmZpZy5oLikKLQotCSogc3RydG91bC5jOiAgRml4ZXMgdG8gaGFuZGxlIG5vbi1kZWNpbWFsIGJhc2VzIGJldHRlci4KLQotV2VkIEFwciAyMiAwOToyNzo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDA6ICBSZXBsYWNlIE1JTlVTX0cgd2l0aCBDRkxBR1MuCi0JKiBNYWtlZmlsZS5kb3M6ICBGaW5pc2ggTUlOVVNfRyBlcmFkaWNhdGlvbi4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIHN0cnNpZ25hbC5jLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6ICBBZGQgc3RyZXJyb3IubyBzdHJzaWduYWwubwotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC1saXN0KTogIFNwbGl0IGNyZWF0aW9uIG9mIGVycm9ycyBmaWxlIHRvCi0Jc2VwYXJhdGUgbWFrZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgsIG5lZWRlZDIuYXdrLCBlcnJvcnMpOiAgTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiAgU3BsaXQgdG8gbXVsdGlwbGUgbGluZXMsIGFkZCBuZWVkZWQyLmF3awotCWFuZCBjb25maWcuaC4KLQkqIGR1bW15LmMgKERFRkZVTkMsIERFRlZBUik6ICBBZGQgZGVmaW5lcyBhbmQgdW5kZWZzLgotCSogZnVuY3Rpb25zLmRlZiAoc3RyZXJyb3IpOiAgUmVtb3ZlIGZyb20gb3B0aW9uYWwgbGlzdC4KLQkqIGZ1bmN0aW9ucy5kZWYgKHN5c19uZXJyLCBzeXNfZXJybGlzdCwgc3lzX3NpZ2xpc3QpOiAgREVGVkFSJ3MKLQkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yLCBwc2lnbmFsKTogIERFRkZVTkMncwotCSogc3RyZXJyb3IuYzogIFJld3JpdGUgZnJvbSBzY3JhdGNoIHRvIHVzZSBzeXNfZXJybGlzdCBvbmx5IGlmCi0JYXZhaWxhYmxlLCBhZGQgZXJybm9fbWF4KCksIGFkZCBzdHJlcnJubygpLCBhZGQgc3RydG9lcnJubygpLAotCWFkZCB0ZXN0IGRyaXZlci4KLQkqIHN0cnNpZ25hbC5jOiAgTmV3IGZpbGUsIHNpZ25hbCBlcXVpdmFsZW50IHRvIHN0cmVycm9yLmMuCi0JVXNlcyBzeXNfc2lnbGlzdCBpZiBhdmFpbGFibGUsIGRlZmluZXMgc2lnbm9fbWF4KCksIHN0cnNpZ25hbCgpLAotCXN0cnNpZ25vKCksIHN0cnRvc2lnbm8oKSwgcHNpZ25hbCgpLCBhbmQgdGVzdCBkcml2ZXIuCi0KLU1vbiBBcHIgMjAgMjA6NDk6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmUuCi0KLQkqIE1ha2VmaWxlLmluOiBhbGxvdyBDRkxBR1MgdG8gYmUgcGFzc2VkIGluIGZyb20gY29tbWFuZCBsaW5lLgotCSAgUmVtb3ZlZCBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLU1vbiBBcHIgMjAgMTI6NTc6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWl4OiAgTmV3LiAgRVhUUkFfT0ZJTEVTIGxpc3RzIGNvcHlzaWduLm8sCi0Jc28gbGliZysrIHVzZXJzIGRvbid0IGhhdmUgdG8gYmUgaW5jb252ZW5pZW5jZWQgYnkgYQotCWxpYmMuYSBidWcgKGxpYmMuYSBuZWVkcyBjb3B5c2lnbiwgYnV0IGRvZXNuJ3QgZGVmaW5lIGl0ISkuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgY29uZmlnL21oLWFpeC4KLQkqIHN0cnRvdWwuYzogIEhhbmRsZSAnLScgYXMgcmVxdWlyZWQgYnkgQU5TSS4KLQlDbGVhbiB1cCByYWRpeCBoYW5kbGluZy4KLQkqIHN0cnN0ci5jOiAgRml4IGJ1Z2d5IGFsZ29yaXRobS4KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIHNvIHRoYXQgJHtFWFRSQV9PRklMRVN9IGlzCi0JYXBwZW5kZWQgdG8gbmVlZGVkLWxpc3QgKHdoaWNoIGlzIHVzZWQgYnkgbGliZysrKS4KLQotRnJpIEFwciAxMCAyMjo1MTo0MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IGNvbmZpZyBmaWxlLgotCi1XZWQgQXByICAxIDIzOjMxOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmMsIGR1bW15LmM6ICBMaW50LgotCi1UdWUgTWFyIDMxIDE4OjQ2OjQ0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3lzdjQ6ICBOZXcgY29uZmlnIGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6ICBTZXQgdG8gY29uZmlnL21oLXN5c3Y0IGZvcgotCWhvc3Rfb3MgPT0gc3lzdjQuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgRm9yIFNWUjQsIHVzZSBzeXNjb25mKF9TQ19QQUdFU0laRSkgdG8gZ2V0Ci0JcGFnZXNpemUuCi0KLVN1biBNYXIgMjkgMTI6MjY6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiAgTGludC4KLQotRnJpIE1hciAyNyAwODozMjo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZiAoYWxsb2NhKTogIEZpeCByZXR1cm4gdHlwZSBhbmQgYXJncyB0byBhdm9pZAotCXR5cGUgY2xhc2ggd2l0aCBnY2MncyBidWlsdGluIGFsbG9jYS4KLQotVHVlIE1hciAyNCAyMzozMzo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtaXJpeDQ6IGlyaXg0IHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmLCBhbGxvY2EuYzogYWRkZWQgYWxsb2NhLgotCi1UdWUgTWFyIDI0IDE3OjM0OjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIE1ha2UgaXQgY29tcGlsZSBvbiBERUNzdGF0aW9ucy4KLQotVGh1IE1hciAxOSAxMzo1Nzo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgRml4IHZhcmlvdXMgZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gYmUKLQljb3JyZWN0IGluIGFuIEFOU0kgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCi0KLVNhdCBNYXIgMTQgMTc6Mjg6MTcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIENoYW5nZXMgdG8gc3VwcG9ydCBjYWxsaW5nIG1tYWxsb2MgZnVuY3Rpb25zLAotCXdoaWNoIHRha2UgYW4gYWRkaXRpb25hbCBhcmd1bWVudCBvdmVyIG1hbGxvYyBmdW5jdGlvbnMuCi0KLUZyaSBNYXIgIDYgMjI6MDE6MTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IEZlYiAyNyAyMjoxOTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgI2luY2x1ZGUgYWxsb2NhLWNvbmYuaCAobmVlZGVkIGJ5IEFJWCkuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TYXQgRmViIDIyIDAxOjA5OjIxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIENoZWNrIGluIEZyZWQncyB2ZXJzaW9uIHdoaWNoIGZpeGVzIHByb2JsZW1zIHdpdGgKLQlhbGxvY2EoKS4KLQotRnJpIEZlYiAgNyAyMTo0NjowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6ICBSZW1vdmUgTlVMIHRvIGtlZXAgcGF0Y2ggZnJvbSBmYWlsaW5nLgotCi1UaHUgSmFuIDMwIDIyOjQ4OjQxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jIChfZ2V0b3B0X2ludGVybmFsKTogIEZpeCB1c2FnZSBvZiBlbnVtIGhhc19hcmcuCi0KLU1vbiBKYW4gMjAgMTg6NTM6MjMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotIAkqIGdldG9wdC5jLCBnZXRvcHQxLmMsIC4uL2luY2x1ZGUvZ2V0b3B0Lmg6ICBHZXQgbGF0ZXN0IHZlcnNpb25zLgotCi1TYXQgSmFuIDE4IDE2OjUzOjAxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBOZXcgZmlsZSB0byBidWlsZCBhbmQgZGVzdHJveSBzdGFuZGFyZCBhcmd1bWVudAotCXZlY3RvcnMgZnJvbSBhIGNvbW1hbmQgc3RyaW5nLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBhcmd2LmMgYW5kIGFyZ3YubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCi0KLUZyaSBEZWMgMjAgMTI6MTI6NTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLQkqIHJpbmRleC5jOiAgRGVjbGFyZSByZXR1cm4gdHlwZSBvZiBleHRlcm5hbGx5IHVzZWQgZnVuY3Rpb24KLQlzdHJyY2hyKCkuCi0KLVRodSBEZWMgMTkgMTg6MzU6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlICIqKioiIGluIG5vcm1hbCBvdXRwdXQsIHNpbmNlIE1ha2UgcHJvZHVjZXMKLQl0aGlzIG9uIGVycm9ycywgYW5kIGl0J3MgY29udmVuaWVudCB0byBzZWFyY2ggZm9yLgotCi1UdWUgRGVjIDE3IDIzOjIxOjMwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbW1vdmUuYywgbWVtc2V0LmMsIHN0cmNoci5jLCBzdHJyY2hyLmM6Ci0JTmV3IEFOU0kgZnVuY3Rpb25zLiAgVGhlIG9sZCBub24tQU5TSSBmdW5jdGlvbnMgKHN1Y2ggYXMgYmNvcHkpCi0Jc2hvdWxkIGJlIGF2b2lkZWQuCi0JKiBiY29weS5jOiAgRml4IHRvIGNvcnJlY3RseSBoYW5kbGUgb3ZlcmxhcHBpbmcgcmVnaW9ucy4KLQkqIGluZGV4LmMsIHJpbmRleC5jOiAgUmUtd3JpdGUgaW4gdGVybXMgb2Ygc3RyY2hyKCkgYW5kIHN0cnJjaHIoKS4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgdGhlIG5ldyBmdW5jdGlvbnMuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIDR0aCBwYXJhbWV0ZXIgdG8gREVGIG1hY3JvLAotCWFuIGFuc2lkZWNsLmgtc3R5bGUgcHJvdG90eXBlLgotCSogZHVtbXkuYzogIFVzZSBleHBhbmRlZCBERUYgbWFjcm8gdG8gY3JlYXRlIGEgZHVtbXkgZnVuY3Rpb24KLQljYWxsLCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGVzLiAgKFRoaXMgYXZvaWRzIHNvbWUKLQljb21wbGFpbnRzIGZyb20gZ2NjIGFib3V0IHByZWRlZmluZWQgYnVpbHRpbnMuKQotCi0JTW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb25maWcvbWgtZGVmYXVsdCBpbnRvIE1ha2VmaWxlLmluLgotCVRoaXMgYXZvaWQgZHVwbGljYXRpb24sIGFuZCBzaW1wbGlmaWVzIHRoaW5ncyBzbGlnaHRseS4KLQkqIE1ha2VmaWxlLmluOiAgVHdlYWsgc28gd2UgZG9uJ3QgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KLQkqIFJFQURNRTogIFVwZGF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIGNvbmZpZy9taC1kZWZhdWx0LgotCSogY29uZmlnL21oLWRlZmF1bHQ6ICBEZWxldGVkLgotCSogY29uZmlnL21oLXN5c3Y6ICBSZW1vdmUgbGluZXMgY29waWVkIGZyb20gb2xkIG1oLWRlZmF1bHQuCi0KLVR1ZSBEZWMgMTcgMDU6NDY6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYyAoZmRtYXRjaCk6ICBEb24ndCBjb21wYXJlIHN0X3JkZXYsIHdoaWNoIGlzIGZvcgotCSdta25vZCcgZGV2aWNlIG51bWJlcnMuCi0KLU1vbiBEZWMgMTYgMTI6MjU6MzQgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYywgTWFrZWZpbGUuaW46ICBBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvCi0Jb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGFuZCByZXR1cm5zIG5vbnplcm8gaWYgdGhleSByZWZlciB0bwotCXRoZSBzYW1lIGZpbGUsIHplcm8gb3RoZXJ3aXNlLiAgKHVzZWQgaW4gZ2RiKQotCi1XZWQgRGVjIDExIDE3OjQwOjM5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCUZyb20gREo6Ci0JKiBtc2Rvcy5jOiBzdHViIGZ1bmN0aW9ucyBmb3IgZG9zLgotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IG5ldy4KLQkqIGdldG9wdC5jOiBEb24ndCBpbmNsdWRlIGFsbG9jYS1jb25mLmggaW4gYSBHTzMyIHdvcmxkLgotCi0KLVR1ZSBEZWMgMTAgMDQ6MTQ6NDkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLUZyaSBEZWMgIDYgMjM6MjY6NDUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucyBiZWNhdXNlIGJzZCBtYWtlCi0JICBjYW4ndCBjb3BlLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIGluc3RhbGwgdXNpbmcKLQkgIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgY29tbW9udGFyZ2V0cyBhcyBpdCBpcyBubyBsb25nZXIgYQotCSAgcmVjb2duaXplZCBob29rLgotCi1UaHUgRGVjICA1IDIyOjQ2OjQ2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAxOToxNToyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBmaW5kLW5lZWRlZC5hd2sgZG9lcyBub3QgZml0IGluIDE0IGNoYXJzLgotCi0JKiBNYWtlZmlsZS5pbjogIFN1cHByZXNzIGVycm9yIGNoZWNraW5nIHdoZW4gY29tcGlsaW5nIHRoZSB0ZXN0Ci0JcHJvZ3JhbSwgYmVjYXVzZSBVbHRyaXggbWFrZS9zaCBhYm9ydHMgdGhlcmUgZHVlIHRvIGEgYnVnLgotCi1GcmkgTm92IDIyIDEyOjIzOjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlLWRpZCBob3cgRVhUUkFfT0ZJTEVTIGlzIHVzZWQgdG8gYmUgbW9yZSB1c2VmdWwuCi0JKiBSRUFETUU6ICBFeHBsYWluZWQgaG93IHRoZSBhdXRvLWNvbmZpZ3VyYXRpb24gd29ya3MsCi0JYW5kIGhvdyB0byBhZGQgbmV3IGZpbGVzIGFuZC9vciBjb25maWd1cmF0aW9ucy4KLQotRnJpIE5vdiAyMiAwOTo0NToyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RydG91bC5jOiAgQXZvaWQgZGVmaW5pbmcgVUxPTkdfTUFYIGlmIGFscmVhZHkgZGVmaW5lZDsKLQljYXN0IGEgY29uc3QgY2hhciAqIHRvIGNoYXIgKiBmb3IgcGVkYW50cy4KLQotCSogZ2V0b3B0LmM6ICBPbmx5IGRlZmluZSAiY29uc3QiIGFmdGVyIGxvY2FsIGluY2x1ZGUgZmlsZXMgZ2V0IHRvLAotCWFuZCBvbmx5IGlmIHRoZXkgaGF2ZW4ndCBkZWZpbmVkIGl0LgotCi1UaHUgTm92IDIxIDE2OjU4OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYyAocmVtb3ZlIGdldHdkLmMpOiBHTlUgY29kZSBzaG91bGQgY2FsbCBnZXRjd2QoKS4gIFdlCi0JZW11bGF0ZSBpdCB3aXRoIGdldHdkKCkgaWYgYXZhaWxhYmxlLiAgVGhpcyBhdm9pZHMgY2FsbGVycyBoYXZpbmcKLQl0byBmaW5kIGEgTUFYUEFUSExFTiBvciBQQVRIX01BWCB2YWx1ZSBmcm9tIHNvbWV3aGVyZS4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgZ2V0d2QtPmdldGN3ZC4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBnZW5lcmljIGNhc2UgZm9yIGV2ZXJ5IHN5c3RlbS4KLQkqIGNvbmZpZy9taC17ZGVsdGE4OCxtYWNoLHJzNjAwMCxzdnI0fTogIFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2OiAgVXNlIGRlZmF1bHQgaGFuZGxpbmcsIGp1c3QgYWRkIC1EVVNHLgotCi1UaHUgTm92IDE0IDEwOjU4OjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL21oLWRlZmF1bHQ6IFJlLWRvIG1ha2UgbWFnaWMKLQlzbyB0aGF0IGZvciB0aGUgZGVmYXVsdCAoImF1dG9tYXRpYyIpIG1vZGUgd2Ugb25seQotCWNvbXBpbGUgdGhlIGZpbGVzIHdlIGFjdHVhbGx5IG5lZWQuICBEbyB0aGlzIHVzaW5nCi0JYSByZWN1cnNpdmUgbWFrZTogIFRoZSB0b3AtbGV2ZWwgZ2VuZXJhdGVzIHRoZSBsaXN0Ci0Jb2YgbmVlZGVkIGZpbGVzIChsb29zZWx5LCB0aGUgb25lcyBtaXNzaW5nIGluIGxpYmMpLAotCWFuZCB0aGVuIHBhc3NlcyB0aGF0IGxpc3QgdG8gdGhlIHJlY3Vyc2l2ZSBtYWtlLgotCSogY29uZmlnL21oLW1hY2g6ICBSZW1vdmUgb2Jzb2xldGUgU1RSRVJST1Ite0MsT30gbWFjcm9zLgotCi1UdWUgTm92IDEyIDE5OjEwOjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBob3N0IHN1cHBvcnQgKGdydW1ibGUpLgotCi0JKiBjb25maWd1cmUuaW46ICBCdWlsZCBhbGxvY2EtY29uZi5oIGZpbGUgZnJvbSBhbGxvY2Etbm9ybS5oCi0JKGV2ZXJ5dGhpbmcgZWxzZSkgb3IgYWxsb2NhLWJvdGNoLmggKHJzLzYwMDApLgotCSogTWFrZWZpbGUuaW46ICBJbmNsdWRlIC4gb24gdGhlIGluY2x1ZGUgcGF0aC4KLQkqIGdldG9wdC5jOiAgVXNlIGFsbG9jYS1jb25mLmguCi0JKiBhbGxvY2Etbm9ybS5oOiAgSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIHJlYXNvbmFibGUgbWFjaGluZXMuCi0JKiBhbGxvY2EtYm90Y2guaDogSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIGJyYWluZGVhZCBtYWNoaW5lcy4KLQotVHVlIE5vdiAxMiAwOToyMTo0OCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uY2F0LmMgOiAgTmV3IGZpbGUsIGxpa2UgY29uY2F0KCkgaW4gZ2RiIGJ1dCBjYW4gdGFrZSBhCi0JdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBmaXhlZCBhdCAzIGFyZ3MuICBGb3IKLQlub3csIGNsaWVudCBhcHBsaWNhdGlvbnMgbXVzdCBzdXBwbHkgYW4geG1hbGxvYygpLCB3aGljaCBpcyBhCi0JZnJvbnQgZW5kIGZ1bmN0aW9uIHRvIG1hbGxvYygpIHRoYXQgZGVhbHMgd2l0aCBvdXQtb2YtbWVtb3J5Ci0JY29uZGl0aW9ucy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY29uY2F0LmMgYW5kIGNvbmNhdC5vIHRvIGFwcHJvcHJpYXRlIG1hY3Jvcy4KLQotU2F0IE5vdiAgOSAxMzoyOTo1OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN2cjQ6ICBBZGQgc2lnc2V0bWFzayB0byBsaXN0IG9mIHJlcXVpcmVkIGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAgMyAxMTo1Nzo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdnNwcmludGYuYzogIE5ldyBmaWxlLgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBBZGQgdnNwcmludGYuCi0KLVN1biBPY3QgMjcgMTY6MzE6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXJzNjAwMDogIEFkZCBycy82MDAwIGhvc3Qgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluOiAgQ29tcGlsZSB3aXRoIGRlYnVnIGluZm8uCi0KLUZyaSBPY3QgMjUgMTc6MDE6MTIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGFuZCBuZXcgZmlsZXM6IGR1bW15LmMsIGZ1bmN0aW9ucy5kZWYsCi0JY29uZmlnL21mLWRlZmF1bHQ6ICBBZGRlZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtb2RlLAotCXdoaWNoIGluY2x1ZGVzIGludG8gbGliaWJlcnR5LmEgZnVuY3Rpb25zIHRoYXQgYXJlICJtaXNzaW5nIiBpbiBsaWJjLgotCSogc3RyZHVwLmMsIHZwcmludGYuYywgdmZwcmludGYuYzogTmV3IGZpbGVzLgotCi1UaHUgT2N0IDI0IDAyOjI5OjI2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG1ha2Utc3ZyNDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy9obWFrZS1zeXN2OiBBZGQgSE9TVF9DRklMRVMgYW5kIEhPU1RfT0ZJTEVTLgotCi0JKiBiYXNlbmFtZS5jLCBiY21wLmMsIGJjb3B5LmMsIGJ6ZXJvLmMsIGdldHBhZ2VzaXplLmMgZ2V0d2QuYywKLQlpbmRleC5jLCBpbnNxdWUuYywgcmluZGV4LmMsIHNwYWNlcy5jLCBzdHJzdHIuYywgdmZvcmsuYzogTmV3Ci0JZmlsZXMgY29udGFpbmluZyBlaXRoZXIgcG9ydGFibGUgQyB2ZXJzaW9ucyBvciBlbXVsYXRpb25zIHVzaW5nCi0JbmF0aXZlIGxpYnJhcnkgY2FsbHMuCi0KLQkqIHN0cmVycm9yLmM6ICBBZGQgY29weXJpZ2h0LCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLCBldGMuCi0KLQkqIHN0cnRvbC5jOiAgUmVwbGFjZSBoYXJkd2lyZWQgaGV4IGNvbnN0YW50cyB3aXRoIHNvbWUgbW9yZQotCXBvcnRhYmxlIG1hY3Jvcy4gIFJlbW92ZSBpbGxlZ2FsIChhY2NvcmRpbmcgdG8gZ2NjKSBjYXN0LgotCi0JKiBzdHJ0b3VsLmM6IFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudCB3aXRoIG1vcmUgcG9ydGFibGUKLQltYWNyby4KLQotCSogTWFrZWZpbGUuaW46IE1vdmUgVEFSR0VUTElCIGFuZCBDRkxBR1Mgd2hlcmUgbWFrZWZpbGUgZnJhZ21lbnRzCi0JY2FuIG92ZXJyaWRlIHRoZW0uICBBZGQgbmV3IHNvdXJjZSBhbmQgb2JqZWN0IGZpbGUgbmFtZXMgdG8gQ0ZJTEVTCi0JYW5kIE9GSUxFUyByZXNwZWN0aXZlbHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFNWUjQgbWFrZWZpbGUgZnJhZ21lbnRzLgotCi1UdWUgT2N0IDIyIDE5OjAwOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE1vdmUgUkFOTElCLCBBUiBhbmQgQVJfRkxBR1MgdG8gd2hlcmUgdGhleSBjYW4gYmUKLQlvdmVyLXJpZGRlbiBieSBjb25maWcvaG1ha2UtKgotCSogY29uZmlndXJlLmluOiBhZGRlZCBtODhrY3ZzIHRvIHN5c3YgbGlzdAotCi1GcmkgT2N0ICA0IDAxOjI5OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1vc3QgaG9zdHMgbmVlZCBzdHJlcnJvciwgYnV0IG9uZSBvciB0d28gZG9uJ3QsCi0JYW5kIHRoZXkgb3ZlcnJpZGUgdGhlc2UgZGVmaW5pdGlvbnMgaW4gdGhlIGhvc3QtZGVwZW5kZW50IG1ha2VmaWxlCi0JZnJhZ21lbnQuCi0JKiBjb25maWcvaG1ha2UtbWFjaDogIFRoZSBvZGQgbWFuIG91dCBvbiBzdHJlcnJvciAtLSBpdCdzIHN1cHBsaWVkLgotCSogc3RyZXJyb3IuYzogIE5ldyBmaWxlLgotCi0JKiBzdHJ0b2wuYywgc3RydG91bC5jOiAgQWRkIHN0cnRvbCB0byBsaWJpYmVydHksIHNpbmNlIE1hY2ggbGFja3MKLQlpdCBhbmQgYmZkIHVzZXMgaXQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBjb25maWcvaG1ha2UtbWFjaDogIE9ubHkgY29uZmlndXJlCi0Jc3RydG9sICYgc3Ryb3RvdWwgaW4gb24gTWFjaC4KLQotVHVlIFNlcCAgMyAwNjozNjoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIHdpdGggbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9saWJpYmVydHkvTWFrZWZpbGUuaW4gYi9saWJpYmVydHkvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDUyYWQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxIC0gOTksIDIwMDAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotIyBMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0jIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotIyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIExpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotIyB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLLiBSaWNoYXJkIFBpeGxleSA8cmljaEBjeWdudXMuY29tPi4KLQotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5IGRpcmVjdG9yeQotIwotCi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotCi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWJpbmRpciA9IEBiaW5kaXJACi1saWJkaXIgPSBAbGliZGlyQAotCi1TSEVMTCA9IEBTSEVMTEAKLQotIyBNdWx0aWxpYiBzdXBwb3J0IHZhcmlhYmxlcy4KLU1VTFRJU1JDVE9QID0KLU1VTFRJQlVJTERUT1AgPQotTVVMVElESVJTID0KLU1VTFRJU1VCRElSID0KLU1VTFRJRE8gPSB0cnVlCi1NVUxUSUNMRUFOID0gdHJ1ZQotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQVIgPSBAQVJACi1BUl9GTEFHUyA9IHJjCi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotUkFOTElCID0gQFJBTkxJQkAKLQotUElDRkxBRyA9Ci0KLU1BS0VPVkVSUklERVMgPQotCi1UQVJHRVRMSUIgPSBsaWJpYmVydHkuYQotCi1MSUJPQkpTID0gQExJQk9CSlNACi1BTExPQ0EgPSBAQUxMT0NBQAotCi0jIEEgY29uZmlndXJhdGlvbiBjYW4gc3BlY2lmeSBleHRyYSAubyBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCwKLSMgZXZlbiBpZiB0aGV5IGFyZSBpbiBsaWJjLiAoUGVyaGFwcyB0aGUgbGliYyB2ZXJzaW9uIGlzIGJ1Z2d5LikKLUVYVFJBX09GSUxFUyA9IAotCi0jIEZsYWdzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgbWFrZS4KLUZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSPSQoQVIpIiBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkNDPSQoQ0MpIiBcCi0JIkNGTEFHUz0kKENGTEFHUykiIFwKLQkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAotCSJFWFRSQV9PRklMRVM9JChFWFRSQV9PRklMRVMpIiBcCi0JIkhERUZJTkVTPSQoSERFRklORVMpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxPQURMSUJFUz0kKExPQURMSUJFUykiIFwKLQkiUkFOTElCPSQoUkFOTElCKSIgXAotCSJTSEVMTD0kKFNIRUxMKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImxpYmRpcj0kKGxpYmRpcikiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIgXAotCSJ0b29sZGlyPSQodG9vbGRpcikiCi0KLSMgU3ViZGlyZWN0b3JpZXMgdG8gcmVjdXJzZSBpbnRvLiBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZHVyaW5nIGNsZWFuaW5nCi1TVUJESVJTID0gdGVzdHN1aXRlCi0KLWFsbDogc3RhbXAtcGljZGlyICQoVEFSR0VUTElCKSBuZWVkZWQtbGlzdCByZXF1aXJlZC1saXN0IGFsbC1zdWJkaXIKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWFsbAotCi0uUEhPTlk6IGNoZWNrIGluc3RhbGxjaGVjawotY2hlY2s6IGNoZWNrLXN1YmRpcgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stc3ViZGlyCi0KLUBob3N0X21ha2VmaWxlX2ZyYWdACi0KLUlOQ0RJUj0kKHNyY2RpcikvJChNVUxUSVNSQ1RPUCkuLi9pbmNsdWRlCi0KLUNPTVBJTEUuYyA9ICQoQ0MpIC1jIEBERUZTQCAkKExJQkNGTEFHUykgLUkuIC1JJChJTkNESVIpICQoSERFRklORVMpIEBhY19saWJpYmVydHlfd2Fybl9jZmxhZ3NACi0uYy5vOgotCXRlc3QgeCIkKGVuYWJsZV9zaGFyZWQpIiAhPSB4eWVzIHx8IFwKLQkgICQoQ09NUElMRS5jKSAkKFBJQ0ZMQUcpICQ8IC1vIHBpYy8kQAotCSQoQ09NUElMRS5jKSAkPAotCi1pbmZvOiBpbmZvLXN1YmRpcgotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tc3ViZGlyCi1jbGVhbi1pbmZvOiBjbGVhbi1pbmZvLXN1YmRpcgotZHZpOiBkdmktc3ViZGlyCi0KLSMgSW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGlzIGRpcmVjdG9yeS4KLUhGSUxFUyA9IGFsbG9jYS1jb25mLmgKLQotIyBOT1RFOiBJZiB5b3UgYWRkIG5ldyBmaWxlcyB0byB0aGUgbGlicmFyeSwgYWRkIHRoZW0gdG8gdGhpcyBsaXN0Ci0jIChhbHBoYWJldGljYWwpLCBhbmQgYWRkIHRoZW0gdG8gUkVRVUlSRURfT0ZJTEVTIG9yIGZ1bmNzIGluCi0jIGNvbmZpZ3VyZS5pbi4KLUNGSUxFUyA9IGFzcHJpbnRmLmMgYWxsb2NhLmMgYXJndi5jIGF0ZXhpdC5jIGJhc2VuYW1lLmMgYmNtcC5jIGJjb3B5LmMJICAgICAgXAotCWJ6ZXJvLmMgY2FsbG9jLmMgY2hvb3NlLXRlbXAuYyBjbG9jay5jIGNvbmNhdC5jIGNwbHVzLWRlbS5jIGZkbWF0Y2guYyBcCi0JZm5tYXRjaC5jIGdldGN3ZC5jIGdldHB3ZC5jIGdldG9wdC5jIGdldG9wdDEuYyBnZXRwYWdlc2l6ZS5jCSAgICAgIFwKLQlnZXRydW50aW1lLmMgZmxvYXRmb3JtYXQuYyBoYXNodGFiLmMgaGV4LmMgaW5kZXguYyBpbnNxdWUuYyBtZW1jaHIuYyAgXAotCW1lbWNtcC5jIG1lbWNweS5jIG1lbW1vdmUuYyBtZW1zZXQuYyBta3N0ZW1wcy5jIG9iamFsbG9jLmMgb2JzdGFjay5jICBcCi0JcGFydGl0aW9uLmMgcGV4ZWN1dGUuYyBwdXRlbnYuYyByYW5kb20uYyByZW5hbWUuYyByaW5kZXguYwkgICAgICBcCi0Jc2V0ZW52LmMgc2lnc2V0bWFzay5jIHNwYWNlcy5jIHNwbGF5LXRyZWUuYyBzdHJjYXNlY21wLmMJICAgICAgXAotCXN0cm5jYXNlY21wLmMgc3RyY2hyLmMgc3RyZHVwLmMgc3RyZXJyb3IuYyBzdHJyY2hyLmMJCSAgICAgIFwKLQlzdHJzaWduYWwuYyBzdHJzdHIuYyBzdHJ0b2QuYyBzdHJ0b2wuYyBzdHJ0b3VsLmMgdG1wbmFtLmMJICAgICAgXAotCXZhc3ByaW50Zi5jIHZmb3JrLmMgdmZwcmludGYuYyB2cHJpbnRmLmMgdnNwcmludGYuYyB3YWl0cGlkLmMJICAgICAgXAotCXhhdGV4aXQuYyB4ZXhpdC5jIHhtYWxsb2MuYyB4bWVtZHVwLmMgeHN0cmR1cC5jIHhzdHJlcnJvci5jCi0KLSMgVGhlc2UgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeS4KLVJFUVVJUkVEX09GSUxFUyA9IGFyZ3YubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vIFwKLSAgZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cHdkLm8gZ2V0cnVudGltZS5vIGhhc2h0YWIubyBcCi0gIGhleC5vIGZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gcGFydGl0aW9uLm8gcGV4ZWN1dGUubyBzcGFjZXMubyBcCi0gIHNwbGF5LXRyZWUubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vIHhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyBcCi0gIHhtZW1kdXAubyB4c3RyZHVwLm8geHN0cmVycm9yLm8KLQotJChUQVJHRVRMSUIpOiAkKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpCi0Jcm0gLWYgJChUQVJHRVRMSUIpCi0JJChBUikgJChBUl9GTEFHUykgJChUQVJHRVRMSUIpIFwKLQkgICQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSkKLQkkKFJBTkxJQikgJChUQVJHRVRMSUIpCi0KLUlOU1RBTExfREVTVCA9IEBJTlNUQUxMX0RFU1RACi1pbnN0YWxsOiBpbnN0YWxsX3RvXyQoSU5TVEFMTF9ERVNUKSBpbnN0YWxsLXN1YmRpcgotCi1pbnN0YWxsX3RvX2xpYmRpcjogYWxsCi0JJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQiluCi0JKCBjZCAkKGxpYmRpcikkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQiluICkKLQltdiAtZiAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQiluICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKQotCUAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgbXVsdGktZG8gRE89aW5zdGFsbAotCi1pbnN0YWxsX3RvX3Rvb2xkaXI6IGFsbAotCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVExJQikgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQiluCi0JKCBjZCAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpIDsgJChSQU5MSUIpICQoVEFSR0VUTElCKW4gKQotCW12IC1mICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKQotCUAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgbXVsdGktZG8gRE89aW5zdGFsbAotCi0jIG5lZWRlZC1saXN0IGlzIHVzZWQgYnkgbGlic3RkYysrLiAgTkVFREVEIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwotIyB0byBpbmNsdWRlIHRoZXJlLiAgRG8gbm90IGFkZCBhbnl0aGluZyBMR1BMIHRvIHRoaXMgbGlzdDsgbGlic3RkYysrCi0jIGNhbid0IHVzZSBhbnl0aGluZyBlbmN1bWJlcmluZy4KLU5FRURFRCA9IGF0ZXhpdCBjYWxsb2MgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZSBtZW1zZXQgcmVuYW1lIHN0cmNociBcCi0JIHN0cmVycm9yIHN0cnJjaHIgc3Ryc3RyIHN0cnRvbCBzdHJ0b3VsIHRtcG5hbSB2ZnByaW50ZiB2cHJpbnRmIFwKLQkgdmZvcmsgd2FpdHBpZCBiY21wIGJjb3B5IGJ6ZXJvCi1uZWVkZWQtbGlzdDogTWFrZWZpbGUKLQlybSAtZiBuZWVkZWQtbGlzdDsgdG91Y2ggbmVlZGVkLWxpc3Q7IFwKLQlmb3IgZiBpbiAkKE5FRURFRCk7IGRvIFwKLQkgIGZvciBnIGluICQoTElCT0JKUykgJChFWFRSQV9PRklMRVMpOyBkbyBcCi0JICAgIGNhc2UgIiQkZyIgaW4gXAotCSAgICAgICokJGYqKSBlY2hvICQkZyA+PiBuZWVkZWQtbGlzdCA7OyBcCi0JICAgIGVzYWM7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLSMgcmVxdWlyZWQtbGlzdCB3YXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc2hhcmVkIGJmZC9vcGNvZGVzL2xpYmliZXJ0eQotIyBsaWJyYXJ5LiAgSSBkb24ndCBrbm93IGlmIGl0IHVzZWQgYnkgYW55dGhpbmcgY3VycmVudGx5LgotcmVxdWlyZWQtbGlzdDogTWFrZWZpbGUKLQllY2hvICQoUkVRVUlSRURfT0ZJTEVTKSA+IHJlcXVpcmVkLWxpc3QKLQotc3RhbXAtcGljZGlyOgotCWlmIFsgeCIkKGVuYWJsZV9zaGFyZWQpIiA9IHh5ZXMgXSAmJiBbICEgLWQgcGljIF07IHRoZW4gXAotCSAgbWtkaXIgcGljOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLXBpY2RpcgotCi0uUEhPTlk6IGFsbCBldGFncyB0YWdzIGxzIGNsZWFuIHN0YWdlMSBzdGFnZTIKLQotZXRhZ3MgdGFnczogVEFHUyBldGFncy1zdWJkaXIKLQotVEFHUzogJChDRklMRVMpICQoSEZJTEVTKQotCWV0YWdzIGBmb3IgaSBpbiAkKEhGSUxFUykgJChDRklMRVMpOyBkbyBlY2hvICQoc3JjZGlyKS8kJGkgOyBkb25lYAotCi0jIFRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciAoYysrZmlsdCkgaGFzIGJlZW4gbW92ZWQgdG8gYmludXRpbHMuCi1kZW1hbmdsZToKLQlAZWNobyAiVGhlIHN0YW5kYWxvbmUgZGVtYW5nbGVyLCBub3cgbmFtZWQgYysrZmlsdCwgaXMgbm93IgotCUBlY2hvICJhIHBhcnQgb2YgYmludXRpbHMuIgotCUBmYWxzZQotCi1sczoKLQlAZWNobyBNYWtlZmlsZSAkKEhGSUxFUykgJChDRklMRVMpCi0KLSMgTmVlZCB0byBkZWFsIHdpdGggcHJvZmlsZWQgbGlicmFyaWVzLCB0b28uCi0KLSMgQ2xlYW5pbmcgaGFzIHRvIGJlIGRvbmUgY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNsZWFuIG91ciBTVUJESVJTCi0jIG11bHRpcGxlIHRpbWVzLCBoZW5jZSBvdXIgZXhwbGljaXQgcmVjdXJzaW9uIHdpdGggYW4gZW1wdHkgU1VCRElSUy4KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1zdWJkaXIKLQlybSAtcmYgKi5vIHBpYyBjb3JlIGVycnMgXCMqICouRSBhLm91dAotCXJtIC1mIG5lZWRlZC5hd2sgbmVlZGVkMi5hd2sgZXJyb3JzIGR1bW15IG5lZWRlZC1saXN0IGNvbmZpZy5oIHN0YW1wLSoKLQlybSAtZiAkKENPTkZJR19IKSAkKE5FRURFRF9MSVNUKSBzdGFtcC1waWNkaXIKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1tb3N0bHljbGVhbgotY2xlYW46IGNsZWFuLXN1YmRpcgotCSQoTUFLRSkgU1VCRElSUz0iIiBtb3N0bHljbGVhbgotCXJtIC1mICouYSByZXF1aXJlZC1saXN0IHRtcG11bHRpLm91dAotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPWNsZWFuCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1zdWJkaXIKLQkkKE1BS0UpIFNVQkRJUlM9IiIgY2xlYW4KLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1kaXN0Y2xlYW4KLQlybSAtZiAqfiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIHhob3N0LW1rZnJhZyBUQUdTIG11bHRpbGliLm91dAotCXJtIC1mIGNvbmZpZy5sb2cKLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXN1YmRpcgotCSQoTUFLRSkgU1VCRElSUz0iIiBkaXN0Y2xlYW4KLQotZm9yY2U6Ci0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy50YWJsZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotCi1hbGwtc3ViZGlyIGNoZWNrLXN1YmRpciBpbnN0YWxsY2hlY2stc3ViZGlyIGluZm8tc3ViZGlyCVwKLWluc3RhbGwtaW5mby1zdWJkaXIgY2xlYW4taW5mby1zdWJkaXIgZHZpLXN1YmRpciBpbnN0YWxsLXN1YmRpcglcCi1ldGFncy1zdWJkaXIgbW9zdGx5Y2xlYW4tc3ViZGlyIGNsZWFuLXN1YmRpciBkaXN0Y2xlYW4tc3ViZGlyIFwKLW1haW50YWluZXItY2xlYW4tc3ViZGlyOgotCUBzdWJkaXJzPSckKFNVQkRJUlMpJzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCAtZSAncy8tc3ViZGlyLy8nYDsgXAotCWZvciBkaXIgaW4gJCRzdWJkaXJzIDsgZG8gXAotCSAgY2QgJCRkaXIgJiYgJChNQUtFKSAkJHRhcmdldDsgXAotCWRvbmUKLQotJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKTogc3RhbXAtcGljZGlyCi0KLWFsbG9jYS5vOiBjb25maWcuaAotYXRleGl0Lm86IGNvbmZpZy5oCi1hcmd2Lm86IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iYXNlbmFtZS5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWNob29zZS10ZW1wLm86IGNvbmZpZy5oCi1jbG9jay5vOiBjb25maWcuaAotY29uY2F0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY3BsdXMtZGVtLm86IGNvbmZpZy5oICQoSU5DRElSKS9kZW1hbmdsZS5oCi1mZG1hdGNoLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZm5tYXRjaC5vOiBjb25maWcuaCAkKElOQ0RJUikvZm5tYXRjaC5oCi1nZXRjd2QubzogY29uZmlnLmgKLWdldG9wdC5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldG9wdDEubzogY29uZmlnLmggJChJTkNESVIpL2dldG9wdC5oCi1nZXRwYWdlc2l6ZS5vOiBjb25maWcuaAotZ2V0cHdkLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotZ2V0cnVudGltZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWhleC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWZsb2F0Zm9ybWF0Lm86ICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oCi1ta3N0ZW1wcy5vOiBjb25maWcuaAotb2JqYWxsb2MubzogY29uZmlnLmggJChJTkNESVIpL29iamFsbG9jLmgKLW9ic3RhY2subzogY29uZmlnLmggJChJTkNESVIpL29ic3RhY2suaAotcGFydGl0aW9uLm86IGNvbmZpZy5oICQoSU5DRElSKS9wYXJ0aXRpb24uaAotcGV4ZWN1dGUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zZXRlbnYubzogY29uZmlnLmgKLXNwYWNlcy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNwbGF5LXRyZWUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9zcGxheS10cmVlLmggJChJTkNESVIpL2Fuc2lkZWNsLmgKLXN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Ryc2lnbmFsLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteGF0ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhleGl0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteG1hbGxvYy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhtZW1kdXAubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZHVwLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteHN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotaGFzaHRhYi5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2hhc2h0YWIuaCAkKElOQ0RJUikvYW5zaWRlY2wuaApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L1JFQURNRSBiL2xpYmliZXJ0eS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTIyNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSAtbGliZXJ0eSBsaWJyYXJ5IG9mIGZyZWUgc29mdHdhcmUuCi1JdCBpcyBhIGNvbGxlY3Rpb24gb2Ygc3Vicm91dGluZXMgdXNlZCBieSB2YXJpb3VzIEdOVSBwcm9ncmFtcy4KLUN1cnJlbnQgbWVtYmVycyBpbmNsdWRlOgotCi0JZ2V0b3B0IC0tIGdldCBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lCi0Jb2JzdGFjayAtLSBzdGFja3Mgb2YgYXJiaXRyYXJpbHktc2l6ZWQgb2JqZWN0cwotCXN0cmVycm9yIC0tIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIGVycm5vCi0Jc3RydG9sIC0tIHN0cmluZy10by1sb25nIGNvbnZlcnNpb24KLQlzdHJ0b3VsIC0tIHN0cmluZy10by11bnNpZ25lZC1sb25nIGNvbnZlcnNpb24KLQotV2UgZXhwZWN0IG1hbnkgb2YgdGhlIEdOVSBzdWJyb3V0aW5lcyB0aGF0IGFyZSBmbG9hdGluZyBhcm91bmQgdG8KLWV2ZW50dWFsbHkgYXJyaXZlIGhlcmUuCi0KLVRoZSBsaWJyYXJ5IG11c3QgYmUgY29uZmlndXJlZCBmcm9tIHRoZSB0b3Agc291cmNlIGRpcmVjdG9yeS4gIERvbid0Ci10cnkgdG8gcnVuIGNvbmZpZ3VyZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEZvbGxvdyB0aGUgY29uZmlndXJhdGlvbgotaW5zdHJ1Y3Rpb25zIGluIC4uL1JFQURNRS4KLQotUGxlYXNlIHJlcG9ydCBidWdzIGFuZCBmaXhlcyB0byAiYnVnLWdudS11dGlsc0BwcmVwLmFpLm1pdC5lZHUiLiAgVGhhbmsgeW91LgotCi1BRERJTkcgQSBORVcgRklMRQotPT09PT09PT09PT09PT09PT0KLQotVGhlcmUgYXJlIHR3byBzZXRzIG9mIGZpbGVzOiAgVGhvc2UgdGhhdCBhcmUgInJlcXVpcmVkIiB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgbGlicmFyeSBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zLCB3aGlsZSB0aG9zZQotdGhhdCBhcmUgIm9wdGlvbmFsIiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IG9ubHkgaWYgIm5lZWRlZC4iCi0KLVRvIGFkZCBhIG5ldyByZXF1aXJlZCBmaWxlLCBlZGl0IE1ha2VmaWxlIHRvIGFkZCB0aGUgc291cmNlIGZpbGUKLW5hbWUgdG8gQ0ZJTEVTIGFuZCB0aGUgb2JqZWN0IGZpbGUgdG8gUkVRVUlSRURfT0ZJTEVTLgotCi1UbyBhZGQgYSBuZXcgb3B0aW9uYWwgZmlsZSwgaXQgbXVzdCBwcm92aWRlIGEgc2luZ2xlIGZ1bmN0aW9uLCBhbmQgdGhlCi1uYW1lIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotCi0gICAgKiBBZGQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgdG8gQ0ZJTEVTLgotCi0gICAgKiBBZGQgdGhlIGZ1bmN0aW9uIHRvIG5hbWUgdG8gdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlIGluCi0gICAgICBjb25maWd1cmUuaW4uCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIEFDX0NIRUNLX0ZVTkNTIGxpc3RzIGp1c3QgYWZ0ZXIgdGhlCi0gICAgICBzZXR0aW5nIG9mIHRoZSBmdW5jcyBzaGVsbCB2YXJpYWJsZS4gIFRoZXNlIEFDX0NIRUNLX0ZVTkNTIGNhbGxzCi0gICAgICBhcmUgbmV2ZXIgZXhlY3V0ZWQ7IHRoZXkgYXJlIHRoZXJlIHRvIG1ha2UgYXV0b2hlYWRlciB3b3JrCi0gICAgICBiZXR0ZXIuCi0KLSAgICAqIENvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2VzIG9mIGJ1aWxkaW5nIGxpYmliZXJ0eTsgYXMgb2YgdGhpcwotICAgICAgd3JpdGluZywgdGhlIHNwZWNpYWwgY2FzZXMgYXJlIG5ld2xpYiBhbmQgVnhXb3Jrcy4gIElmIGEKLSAgICAgIHBhcnRpY3VsYXIgc3BlY2lhbCBjYXNlIHByb3ZpZGVzIHRoZSBmdW5jdGlvbiwgeW91IGRvIG5vdCBuZWVkCi0gICAgICB0byBkbyBhbnl0aGluZy4gIElmIGl0IGRvZXMgbm90IHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCBhZGQgdGhlCi0gICAgICBvYmplY3QgZmlsZSB0byBMSUJPQkpTLCBhbmQgYWRkIHRoZSBmdW5jdGlvbiBuYW1lIHRvIHRoZSBjYXNlCi0gICAgICBjb250cm9sbGluZyB3aGV0aGVyIHRvIGRlZmluZSBIQVZFX2Z1bmMuCi0KLVRoZSBvcHRpb25hbCBmaWxlIHlvdSd2ZSBhZGRlZCAoZS5nLiBnZXRjd2QuYykgc2hvdWxkIGNvbXBpbGUgYW5kIHdvcmsKLW9uIGFsbCBob3N0cyB3aGVyZSBpdCBpcyBuZWVkZWQuICBJdCBkb2VzIG5vdCBoYXZlIHRvIHdvcmsgb3IgZXZlbgotY29tcGlsZSBvbiBob3N0cyB3aGVyZSBpdCBpcyBub3QgbmVlZGVkLgotCi1BRERJTkcgQSBORVcgQ09ORklHVVJBVElPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT24gbW9zdCBob3N0cyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBzY2hlbWUgZm9yIGF1dG9tYXRpY2FsbHkKLWZpZ3VyaW5nIG91dCB3aGljaCBmaWxlcyBhcmUgbmVlZGVkLiAgSW4gdGhhdCBjYXNlLCB5b3UgcHJvYmFibHkKLWRvbid0IG5lZWQgYSBzcGVjaWFsIE1ha2VmaWxlIHN0dWIgZm9yIHRoYXQgY29uZmlndXJhdGlvbi4KLQotSWYgdGhlIGZ1bGx5IGF1dG9tYXRpYyBzY2hlbWUgZG9lc24ndCB3b3JrLCB5b3UgbWF5IGJlIGFibGUgdG8gZ2V0Ci1ieSB3aXRoIGRlZmluaW5nIEVYVFJBX09GSUxFUyBpbiB5b3VyIE1ha2VmaWxlIHN0dWIuICBUaGlzIGlzCi1hIGxpc3Qgb2Ygb2JqZWN0IGZpbGUgbmFtZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyByZXF1aXJlZAotZm9yIHRoaXMgY29uZmlndXJhdGlvbiAtIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJpYmVydHkuYSwKLXJlZ2FyZGxlc3Mgb2Ygd2hhdGV2ZXIgbWlnaHQgYmUgaW4gdGhlIEMgbGlicmFyeS4KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hY2NvbmZpZy5oIGIvbGliaWJlcnR5L2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzU5OWQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19lcnJsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX25lcnIgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05FUlIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfc2lnbGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYWxsb2NhLWNvbmYuaCBiL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNlZWEzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgIGlmZGVmIF9fU1REQ19fCi1leHRlcm4gUFRSIGFsbG9jYSAoc2l6ZV90KTsKLSMgICBlbHNlIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi1leHRlcm4gUFRSIGFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fU1REQ19fKSAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgaWZkZWYgX1dJTjMyCi0jICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBlbmRpZgotIyBlbmRpZiAvKiAhIGRlZmluZWQgKF9BSVgpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EuYyBiL2xpYmliZXJ0eS9hbGxvY2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4YTIxNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWxsb2NhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyogYWxsb2NhLmMgLS0gYWxsb2NhdGUgYXV0b21hdGljYWxseSByZWNsYWltZWQgbWVtb3J5Ci0gICAoTW9zdGx5KSBwb3J0YWJsZSBwdWJsaWMtZG9tYWluIGltcGxlbWVudGF0aW9uIC0tIEQgQSBHd3luCi0KLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBXQiBsaWJyYXJ5IGFsbG9jYSBmdW5jdGlvbiwKLSAgIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUgc3BhY2Ugb2ZmIHRoZSBydW4tdGltZSBzdGFjayBzbwotICAgdGhhdCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIHByb2NlZHVyZSBleGl0LAotICAgd2FzIGluc3BpcmVkIGJ5IGRpc2N1c3Npb25zIHdpdGggSi4gUS4gSm9obnNvbiBvZiBDb3JuZWxsLgotICAgSi5PdHRvIFRlbm5hbnQgPGpvdEBjcmF5LmNvbT4gY29udHJpYnV0ZWQgdGhlIENyYXkgc3VwcG9ydC4KLQotICAgVGhlcmUgYXJlIHNvbWUgcHJlcHJvY2Vzc29yIGNvbnN0YW50cyB0aGF0IGNhbgotICAgYmUgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBmb3IgeW91ciBzcGVjaWZpYyBzeXN0ZW0sIGZvcgotICAgaW1wcm92ZWQgZWZmaWNpZW5jeTsgaG93ZXZlciwgdGhlIGRlZmF1bHRzIHNob3VsZCBiZSBva2F5LgotCi0gICBUaGUgZ2VuZXJhbCBjb25jZXB0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8ga2VlcAotICAgdHJhY2sgb2YgYWxsIGFsbG9jYS1hbGxvY2F0ZWQgYmxvY2tzLCBhbmQgcmVjbGFpbSBhbnkKLSAgIHRoYXQgYXJlIGZvdW5kIHRvIGJlIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiB0aGUgY3VycmVudAotICAgaW52b2NhdGlvbi4gIFRoaXMgaGV1cmlzdGljIGRvZXMgbm90IHJlY2xhaW0gc3RvcmFnZSBhcwotICAgc29vbiBhcyBpdCBiZWNvbWVzIGludmFsaWQsIGJ1dCBpdCB3aWxsIGRvIHNvIGV2ZW50dWFsbHkuCi0KLSAgIEFzIGEgc3BlY2lhbCBjYXNlLCBhbGxvY2EoMCkgcmVjbGFpbXMgc3RvcmFnZSB3aXRob3V0Ci0gICBhbGxvY2F0aW5nIGFueS4gIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSBhbGxvY2EoMCkgaW4KLSAgIHlvdXIgbWFpbiBjb250cm9sIGxvb3AsIGV0Yy4gdG8gZm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBlbWFjcwotI2luY2x1ZGUgImJsb2NraW5wdXQuaCIKLSNlbmRpZgotCi0vKiBJZiBjb21waWxpbmcgd2l0aCBHQ0MgMiwgdGhpcyBmaWxlJ3Mgbm90IG5lZWRlZC4gIEV4Y2VwdCBvZiBjb3Vyc2UgaWYKLSAgIHRoZSBDIGFsbG9jYSBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0jaWYgZGVmaW5lZCAoVVNFX0NfQUxMT0NBKSB8fCAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMgotCi0vKiBJZiBzb21lb25lIGhhcyBkZWZpbmVkIGFsbG9jYSBhcyBhIG1hY3JvLAotICAgdGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHdheSBhbGxvY2EgaXMgc3VwcG9zZWQgdG8gd29yay4gICovCi0jaWZuZGVmIGFsbG9jYQotCi0jaWZkZWYgZW1hY3MKLSNpZmRlZiBzdGF0aWMKLS8qIGFjdHVhbGx5LCBvbmx5IHdhbnQgdGhpcyBpZiBzdGF0aWMgaXMgZGVmaW5lZCBhcyAiIgotICAgLS0gdGhpcyBpcyBmb3IgdXNnLCBpbiB3aGljaCBlbWFjcyBtdXN0IHVuZGVmaW5lIHN0YXRpYwotICAgaW4gb3JkZXIgdG8gbWFrZSB1bmV4ZWMgd29ya2FibGUKLSAgICovCi0jaWZuZGVmIFNUQUNLX0RJUkVDVElPTgoteW91Ci1sb3NlCi0tLSBtdXN0IGtub3cgU1RBQ0tfRElSRUNUSU9OIGF0IGNvbXBpbGUtdGltZQotI2VuZGlmIC8qIFNUQUNLX0RJUkVDVElPTiB1bmRlZmluZWQgKi8KLSNlbmRpZiAvKiBzdGF0aWMgKi8KLSNlbmRpZiAvKiBlbWFjcyAqLwotCi0vKiBJZiB5b3VyIHN0YWNrIGlzIGEgbGlua2VkIGxpc3Qgb2YgZnJhbWVzLCB5b3UgaGF2ZSB0bwotICAgcHJvdmlkZSBhbiAiYWRkcmVzcyBtZXRyaWMiIEFERFJFU1NfRlVOQ1RJT04gbWFjcm8uICAqLwotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi1sb25nIGkwMGFmdW5jICgpOwotI2RlZmluZSBBRERSRVNTX0ZVTkNUSU9OKGFyZykgKGNoYXIgKikgaTAwYWZ1bmMgKCYoYXJnKSkKLSNlbHNlCi0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAmKGFyZykKLSNlbmRpZgotCi0jaWYgX19TVERDX18KLXR5cGVkZWYgdm9pZCAqcG9pbnRlcjsKLSNlbHNlCi10eXBlZGVmIGNoYXIgKnBvaW50ZXI7Ci0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lCU5VTEwJMAotI2VuZGlmCi0KLS8qIERpZmZlcmVudCBwb3J0aW9ucyBvZiBFbWFjcyBuZWVkIHRvIGNhbGwgZGlmZmVyZW50IHZlcnNpb25zIG9mCi0gICBtYWxsb2MuICBUaGUgRW1hY3MgZXhlY3V0YWJsZSBuZWVkcyBhbGxvY2EgdG8gY2FsbCB4bWFsbG9jLCBiZWNhdXNlCi0gICBvcmRpbmFyeSBtYWxsb2MgaXNuJ3QgcHJvdGVjdGVkIGZyb20gaW5wdXQgc2lnbmFscy4gIE9uIHRoZSBvdGhlcgotICAgaGFuZCwgdGhlIHV0aWxpdGllcyBpbiBsaWItc3JjIG5lZWQgYWxsb2NhIHRvIGNhbGwgbWFsbG9jOyBzb21lIG9mCi0gICB0aGVtIGFyZSB2ZXJ5IHNpbXBsZSwgYW5kIGRvbid0IGhhdmUgYW4geG1hbGxvYyByb3V0aW5lLgotCi0gICBOb24tRW1hY3MgcHJvZ3JhbXMgZXhwZWN0IHRoaXMgdG8gY2FsbCB1c2UgeG1hbGxvYy4KLQotICAgQ2FsbGVycyBiZWxvdyBzaG91bGQgdXNlIG1hbGxvYy4gICovCi0KLSNpZm5kZWYgZW1hY3MKLSNkZWZpbmUgbWFsbG9jIHhtYWxsb2MKLSNlbmRpZgotZXh0ZXJuIHBvaW50ZXIgbWFsbG9jICgpOwotCi0vKiBEZWZpbmUgU1RBQ0tfRElSRUNUSU9OIGlmIHlvdSBrbm93IHRoZSBkaXJlY3Rpb24gb2Ygc3RhY2sKLSAgIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLSAgIGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0KLSAgIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSAgIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gICovCi0KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi0jZGVmaW5lCVNUQUNLX0RJUkVDVElPTgkwCS8qIERpcmVjdGlvbiB1bmtub3duLiAgKi8KLSNlbmRpZgotCi0jaWYgU1RBQ0tfRElSRUNUSU9OICE9IDAKLQotI2RlZmluZQlTVEFDS19ESVIJU1RBQ0tfRElSRUNUSU9OCS8qIEtub3duIGF0IGNvbXBpbGUtdGltZS4gICovCi0KLSNlbHNlIC8qIFNUQUNLX0RJUkVDVElPTiA9PSAwOyBuZWVkIHJ1bi10aW1lIGNvZGUuICAqLwotCi1zdGF0aWMgaW50IHN0YWNrX2RpcjsJCS8qIDEgb3IgLTEgb25jZSBrbm93bi4gICovCi0jZGVmaW5lCVNUQUNLX0RJUglzdGFja19kaXIKLQotc3RhdGljIHZvaWQKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gTlVMTDsJLyogQWRkcmVzcyBvZiBmaXJzdCBgZHVtbXknLCBvbmNlIGtub3duLiAgKi8KLSAgYXV0byBjaGFyIGR1bW15OwkJLyogVG8gZ2V0IHN0YWNrIGFkZHJlc3MuICAqLwotCi0gIGlmIChhZGRyID09IE5VTEwpCi0gICAgewkJCQkvKiBJbml0aWFsIGVudHJ5LiAgKi8KLSAgICAgIGFkZHIgPSBBRERSRVNTX0ZVTkNUSU9OIChkdW1teSk7Ci0KLSAgICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwkvKiBSZWN1cnNlIG9uY2UuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNlY29uZCBlbnRyeS4gICovCi0gICAgICBpZiAoQUREUkVTU19GVU5DVElPTiAoZHVtbXkpID4gYWRkcikKLQlzdGFja19kaXIgPSAxOwkJLyogU3RhY2sgZ3JldyB1cHdhcmQuICAqLwotICAgICAgZWxzZQotCXN0YWNrX2RpciA9IC0xOwkJLyogU3RhY2sgZ3JldyBkb3dud2FyZC4gICovCi0gICAgfQotfQotCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OID09IDAgKi8KLQotLyogQW4gImFsbG9jYSBoZWFkZXIiIGlzIHVzZWQgdG86Ci0gICAoYSkgY2hhaW4gdG9nZXRoZXIgYWxsIGFsbG9jYSdlZCBibG9ja3M7Ci0gICAoYikga2VlcCB0cmFjayBvZiBzdGFjayBkZXB0aC4KLQotICAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCBzaXplb2YoaGVhZGVyKSBhZ3JlZSB3aXRoIG1hbGxvYwotICAgYWxpZ25tZW50IGNodW5rIHNpemUuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgc2hvdWxkIHdvcmsgb2theS4gICovCi0KLSNpZm5kZWYJQUxJR05fU0laRQotI2RlZmluZQlBTElHTl9TSVpFCXNpemVvZihkb3VibGUpCi0jZW5kaWYKLQotdHlwZWRlZiB1bmlvbiBoZHIKLXsKLSAgY2hhciBhbGlnbltBTElHTl9TSVpFXTsJLyogVG8gZm9yY2Ugc2l6ZW9mKGhlYWRlcikuICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bmlvbiBoZHIgKm5leHQ7CQkvKiBGb3IgY2hhaW5pbmcgaGVhZGVycy4gICovCi0gICAgICBjaGFyICpkZWVwOwkJLyogRm9yIHN0YWNrIGRlcHRoIG1lYXN1cmUuICAqLwotICAgIH0gaDsKLX0gaGVhZGVyOwotCi1zdGF0aWMgaGVhZGVyICpsYXN0X2FsbG9jYV9oZWFkZXIgPSBOVUxMOwkvKiAtPiBsYXN0IGFsbG9jYSBoZWFkZXIuICAqLwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGF0IGxlYXN0IFNJWkUgYnl0ZXMgb2Ygc3RvcmFnZSwKLSAgIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgdXBvbiBleGl0IGZyb20KLSAgIHRoZSBwcm9jZWR1cmUgdGhhdCBjYWxsZWQgYWxsb2NhLiAgT3JpZ2luYWxseSwgdGhpcyBzcGFjZQotICAgd2FzIHN1cHBvc2VkIHRvIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUgb2YgdGhlCi0gICBjYWxsZXIsIGJ1dCB0aGF0IG1ldGhvZCBjYW5ub3QgYmUgbWFkZSB0byB3b3JrIGZvciBzb21lCi0gICBpbXBsZW1lbnRhdGlvbnMgb2YgQywgZm9yIGV4YW1wbGUgdW5kZXIgR291bGQncyBVVFgvMzIuICAqLwotCi1wb2ludGVyCi1hbGxvY2EgKHNpemUpCi0gICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gIGF1dG8gY2hhciBwcm9iZTsJCS8qIFByb2JlcyBzdGFjayBkZXB0aDogKi8KLSAgcmVnaXN0ZXIgY2hhciAqZGVwdGggPSBBRERSRVNTX0ZVTkNUSU9OIChwcm9iZSk7Ci0KLSNpZiBTVEFDS19ESVJFQ1RJT04gPT0gMAotICBpZiAoU1RBQ0tfRElSID09IDApCQkvKiBVbmtub3duIGdyb3d0aCBkaXJlY3Rpb24uICAqLwotICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotI2VuZGlmCi0KLSAgLyogUmVjbGFpbSBnYXJiYWdlLCBkZWZpbmVkIGFzIGFsbCBhbGxvY2EnZCBzdG9yYWdlIHRoYXQKLSAgICAgd2FzIGFsbG9jYXRlZCBmcm9tIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiBjdXJyZW50bHkuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBoZWFkZXIgKmhwOwkvKiBUcmF2ZXJzZXMgbGlua2VkIGxpc3QuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBCTE9DS19JTlBVVDsKLSNlbmRpZgotCi0gICAgZm9yIChocCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsgaHAgIT0gTlVMTDspCi0gICAgICBpZiAoKFNUQUNLX0RJUiA+IDAgJiYgaHAtPmguZGVlcCA+IGRlcHRoKQotCSAgfHwgKFNUQUNLX0RJUiA8IDAgJiYgaHAtPmguZGVlcCA8IGRlcHRoKSkKLQl7Ci0JICByZWdpc3RlciBoZWFkZXIgKm5wID0gaHAtPmgubmV4dDsKLQotCSAgZnJlZSAoKHBvaW50ZXIpIGhwKTsJLyogQ29sbGVjdCBnYXJiYWdlLiAgKi8KLQotCSAgaHAgPSBucDsJCS8qIC0+IG5leHQgaGVhZGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7CQkJLyogUmVzdCBhcmUgbm90IGRlZXBlci4gICovCi0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSBocDsJLyogLT4gbGFzdCB2YWxpZCBzdG9yYWdlLiAgKi8KLQotI2lmZGVmIGVtYWNzCi0gICAgVU5CTE9DS19JTlBVVDsKLSNlbmRpZgotICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsJCS8qIE5vIGFsbG9jYXRpb24gcmVxdWlyZWQuICAqLwotCi0gIC8qIEFsbG9jYXRlIGNvbWJpbmVkIGhlYWRlciArIHVzZXIgZGF0YSBzdG9yYWdlLiAgKi8KLQotICB7Ci0gICAgcmVnaXN0ZXIgcG9pbnRlciBuZXcgPSBtYWxsb2MgKHNpemVvZiAoaGVhZGVyKSArIHNpemUpOwotICAgIC8qIEFkZHJlc3Mgb2YgaGVhZGVyLiAgKi8KLQotICAgIGlmIChuZXcgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLm5leHQgPSBsYXN0X2FsbG9jYV9oZWFkZXI7Ci0gICAgKChoZWFkZXIgKikgbmV3KS0+aC5kZWVwID0gZGVwdGg7Ci0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSAoaGVhZGVyICopIG5ldzsKLQotICAgIC8qIFVzZXIgc3RvcmFnZSBiZWdpbnMganVzdCBhZnRlciBoZWFkZXIuICAqLwotCi0gICAgcmV0dXJuIChwb2ludGVyKSAoKGNoYXIgKikgbmV3ICsgc2l6ZW9mIChoZWFkZXIpKTsKLSAgfQotfQotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi0KLSNpZmRlZiBERUJVR19JMDBBRlVOQwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDUkFZX1NUQUNLCi0jZGVmaW5lIENSQVlfU1RBQ0sKLSNpZm5kZWYgQ1JBWTIKLS8qIFN0YWNrIHN0cnVjdHVyZXMgZm9yIENSQVktMSwgQ1JBWSBYLU1QLCBhbmQgQ1JBWSBZLU1QICovCi1zdHJ1Y3Qgc3RhY2tfY29udHJvbF9oZWFkZXIKLSAgewotICAgIGxvbmcgc2hncm93OjMyOwkJLyogTnVtYmVyIG9mIHRpbWVzIHN0YWNrIGhhcyBncm93bi4gICovCi0gICAgbG9uZyBzaGFzZWc6MzI7CQkvKiBTaXplIG9mIGluY3JlbWVudHMgdG8gc3RhY2suICAqLwotICAgIGxvbmcgc2hod206MzI7CQkvKiBIaWdoIHdhdGVyIG1hcmsgb2Ygc3RhY2suICAqLwotICAgIGxvbmcgc2hzaXplOjMyOwkJLyogQ3VycmVudCBzaXplIG9mIHN0YWNrIChhbGwgc2VnbWVudHMpLiAgKi8KLSAgfTsKLQotLyogVGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIG9jY3VycyBhdAotICAgdGhlIGhpZ2gtYWRkcmVzcyBlbmQgb2YgYSBzdGFjayBzZWdtZW50LiAgKFRoZSBzdGFjawotICAgZ3Jvd3MgZnJvbSBsb3cgYWRkcmVzc2VzIHRvIGhpZ2ggYWRkcmVzc2VzLikgIFRoZSBpbml0aWFsCi0gICBwYXJ0IG9mIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbCBpbmZvcm1hdGlvbiBpcwotICAgMDIwMCAob2N0YWwpIHdvcmRzLiAgVGhpcyBwcm92aWRlcyBmb3IgcmVnaXN0ZXIgc3RvcmFnZQotICAgZm9yIHRoZSByb3V0aW5lIHdoaWNoIG92ZXJmbG93cyB0aGUgc3RhY2suICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlCi0gIHsKLSAgICBsb25nIHNzWzAyMDBdOwkJLyogMDIwMCBvdmVyZmxvdyB3b3Jkcy4gICovCi0gICAgbG9uZyBzc3NpemU6MzI7CQkvKiBOdW1iZXIgb2Ygd29yZHMgaW4gdGhpcyBzZWdtZW50LiAgKi8KLSAgICBsb25nIHNzYmFzZTozMjsJCS8qIE9mZnNldCB0byBzdGFjayBiYXNlLiAgKi8KLSAgICBsb25nOjMyOwotICAgIGxvbmcgc3Nwc2VnOjMyOwkJLyogT2Zmc2V0IHRvIGxpbmthZ2UgY29udHJvbCBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQgb2Ygc3RhY2suICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3RjcHQ6MzI7CQkvKiBQb2ludGVyIHRvIHRhc2sgY29tbW9uIGFkZHJlc3MgYmxvY2suICAqLwotICAgIGxvbmcgc3Njc25tOwkJLyogUHJpdmF0ZSBjb250cm9sIHN0cnVjdHVyZSBudW1iZXIgZm9yCi0JCQkJICAgbWljcm90YXNraW5nLiAgKi8KLSAgICBsb25nIHNzdXNyMTsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdXNyMjsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdHBpZDsJCS8qIFByb2Nlc3MgSUQgZm9yIHBpZCBiYXNlZCBtdWx0aS10YXNraW5nLiAgKi8KLSAgICBsb25nIHNzZ3Z1cDsJCS8qIFBvaW50ZXIgdG8gbXVsdGl0YXNraW5nIHRocmVhZCBnaXZldXAuICAqLwotICAgIGxvbmcgc3NjcmF5WzddOwkJLyogUmVzZXJ2ZWQgZm9yIENyYXkgUmVzZWFyY2guICAqLwotICAgIGxvbmcgc3NhMDsKLSAgICBsb25nIHNzYTE7Ci0gICAgbG9uZyBzc2EyOwotICAgIGxvbmcgc3NhMzsKLSAgICBsb25nIHNzYTQ7Ci0gICAgbG9uZyBzc2E1OwotICAgIGxvbmcgc3NhNjsKLSAgICBsb25nIHNzYTc7Ci0gICAgbG9uZyBzc3MwOwotICAgIGxvbmcgc3NzMTsKLSAgICBsb25nIHNzczI7Ci0gICAgbG9uZyBzc3MzOwotICAgIGxvbmcgc3NzNDsKLSAgICBsb25nIHNzczU7Ci0gICAgbG9uZyBzc3M2OwotICAgIGxvbmcgc3NzNzsKLSAgfTsKLQotI2Vsc2UgLyogQ1JBWTIgKi8KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZlY3RvciBvZiB3b3JkcwotICAgcmV0dXJuZWQgYnkgdGhlIFNUS1NUQVQgbGlicmFyeSByb3V0aW5lLiAgKi8KLXN0cnVjdCBzdGtfc3RhdAotICB7Ci0gICAgbG9uZyBub3c7CQkJLyogQ3VycmVudCB0b3RhbCBzdGFjayBzaXplLiAgKi8KLSAgICBsb25nIG1heGM7CQkJLyogQW1vdW50IG9mIGNvbnRpZ3VvdXMgc3BhY2Ugd2hpY2ggd291bGQKLQkJCQkgICBiZSByZXF1aXJlZCB0byBzYXRpc2Z5IHRoZSBtYXhpbXVtCi0JCQkJICAgc3RhY2sgZGVtYW5kIHRvIGRhdGUuICAqLwotICAgIGxvbmcgaGlnaF93YXRlcjsJCS8qIFN0YWNrIGhpZ2gtd2F0ZXIgbWFyay4gICovCi0gICAgbG9uZyBvdmVyZmxvd3M7CQkvKiBOdW1iZXIgb2Ygc3RhY2sgb3ZlcmZsb3cgKCRTVEtPRkVOKSBjYWxscy4gICovCi0gICAgbG9uZyBoaXRzOwkJCS8qIE51bWJlciBvZiBpbnRlcm5hbCBidWZmZXIgaGl0cy4gICovCi0gICAgbG9uZyBleHRlbmRzOwkJLyogTnVtYmVyIG9mIGJsb2NrIGV4dGVuc2lvbnMuICAqLwotICAgIGxvbmcgc3Rrb19tYWxsb2NzOwkJLyogQmxvY2sgYWxsb2NhdGlvbnMgYnkgJFNUS09GRU4uICAqLwotICAgIGxvbmcgdW5kZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayB1bmRlcmZsb3cgY2FsbHMgKCRTVEtSRVROKS4gICovCi0gICAgbG9uZyBzdGtvX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLUkVUTi4gICovCi0gICAgbG9uZyBzdGttX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLTVJFVC4gICovCi0gICAgbG9uZyBzZWdtZW50czsJCS8qIEN1cnJlbnQgbnVtYmVyIG9mIHN0YWNrIHNlZ21lbnRzLiAgKi8KLSAgICBsb25nIG1heHM7CQkJLyogTWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMgc28gZmFyLiAgKi8KLSAgICBsb25nIHBhZF9zaXplOwkJLyogU3RhY2sgcGFkIHNpemUuICAqLwotICAgIGxvbmcgY3VycmVudF9hZGRyZXNzOwkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgYWRkcmVzcy4gICovCi0gICAgbG9uZyBjdXJyZW50X3NpemU7CQkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgc2l6ZS4gIFRoaXMKLQkJCQkgICBudW1iZXIgaXMgYWN0dWFsbHkgY29ycnVwdGVkIGJ5IFNUS1NUQVQgdG8KLQkJCQkgICBpbmNsdWRlIHRoZSBmaWZ0ZWVuIHdvcmQgdHJhaWxlciBhcmVhLiAgKi8KLSAgICBsb25nIGluaXRpYWxfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICAgIGxvbmcgaW5pdGlhbF9zaXplOwkJLyogU2l6ZSBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICB9OwotCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIHRyYWlscwotICAgYW55IHN0YWNrIHNlZ21lbnQuICBJIHRoaW5rIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGluICdhc2RlZicgaXMKLSAgIG91dCBvZiBkYXRlLiAgSSBvbmx5IGRlc2NyaWJlIHRoZSBwYXJ0cyB0aGF0IEkgYW0gc3VyZSBhYm91dC4gICovCi0KLXN0cnVjdCBzdGtfdHJhaWxlcgotICB7Ci0gICAgbG9uZyB0aGlzX2FkZHJlc3M7CQkvKiBBZGRyZXNzIG9mIHRoaXMgYmxvY2suICAqLwotICAgIGxvbmcgdGhpc19zaXplOwkJLyogU2l6ZSBvZiB0aGlzIGJsb2NrIChkb2VzIG5vdCBpbmNsdWRlCi0JCQkJICAgdGhpcyB0cmFpbGVyKS4gICovCi0gICAgbG9uZyB1bmtub3duMjsKLSAgICBsb25nIHVua25vd24zOwotICAgIGxvbmcgbGluazsJCQkvKiBBZGRyZXNzIG9mIHRyYWlsZXIgYmxvY2sgb2YgcHJldmlvdXMKLQkJCQkgICBzZWdtZW50LiAgKi8KLSAgICBsb25nIHVua25vd241OwotICAgIGxvbmcgdW5rbm93bjY7Ci0gICAgbG9uZyB1bmtub3duNzsKLSAgICBsb25nIHVua25vd244OwotICAgIGxvbmcgdW5rbm93bjk7Ci0gICAgbG9uZyB1bmtub3duMTA7Ci0gICAgbG9uZyB1bmtub3duMTE7Ci0gICAgbG9uZyB1bmtub3duMTI7Ci0gICAgbG9uZyB1bmtub3duMTM7Ci0gICAgbG9uZyB1bmtub3duMTQ7Ci0gIH07Ci0KLSNlbmRpZiAvKiBDUkFZMiAqLwotI2VuZGlmIC8qIG5vdCBDUkFZX1NUQUNLICovCi0KLSNpZmRlZiBDUkFZMgotLyogRGV0ZXJtaW5lIGEgInN0YWNrIG1lYXN1cmUiIGZvciBhbiBhcmJpdHJhcnkgQUREUkVTUy4KLSAgIEkgZG91YnQgdGhhdCAibGludCIgd2lsbCBsaWtlIHRoaXMgbXVjaC4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyAqYWRkcmVzcykKLXsKLSAgc3RydWN0IHN0a19zdGF0IHN0YXR1czsKLSAgc3RydWN0IHN0a190cmFpbGVyICp0cmFpbGVyOwotICBsb25nICpibG9jaywgc2l6ZTsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIC8qIFdlIHdhbnQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc2VnbWVudHMuICBUaGUgZmlyc3QKLSAgICAgc3RlcCBpcyB0byBnZXQgdGhlIHN0YWNrIHN0YXR1cyBzdHJ1Y3R1cmUuICBXZSBjb3VsZCBkbyB0aGlzCi0gICAgIG1vcmUgcXVpY2tseSBhbmQgbW9yZSBkaXJlY3RseSwgcGVyaGFwcywgYnkgcmVmZXJlbmNpbmcgdGhlCi0gICAgICRMTTAwIGNvbW1vbiBibG9jaywgYnV0IEkga25vdyB0aGF0IHRoaXMgd29ya3MuICAqLwotCi0gIFNUS1NUQVQgKCZzdGF0dXMpOwotCi0gIC8qIFNldCB1cCB0aGUgaXRlcmF0aW9uLiAgKi8KLQotICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSAoc3RhdHVzLmN1cnJlbnRfYWRkcmVzcwotCQkJCSAgICArIHN0YXR1cy5jdXJyZW50X3NpemUKLQkJCQkgICAgLSAxNSk7Ci0KLSAgLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3RhY2sgc2VnbWVudC4gIFRoZXJlZm9yZSBpdCBpcwotICAgICBhIGZhdGFsIGVycm9yIGlmICJ0cmFpbGVyIiBpcyBudWxsLiAgKi8KLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIERpc2NhcmQgc2VnbWVudHMgdGhhdCBkbyBub3QgY29udGFpbiBvdXIgYXJndW1lbnQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCkKLSAgICB7Ci0gICAgICBibG9jayA9IChsb25nICopIHRyYWlsZXItPnRoaXNfYWRkcmVzczsKLSAgICAgIHNpemUgPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICBpZiAoYmxvY2sgPT0gMCB8fCBzaXplID09IDApCi0JYWJvcnQgKCk7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgICAgaWYgKChibG9jayA8PSBhZGRyZXNzKSAmJiAoYWRkcmVzcyA8IChibG9jayArIHNpemUpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSByZXN1bHQgdG8gdGhlIG9mZnNldCBpbiB0aGlzIHNlZ21lbnQgYW5kIGFkZCB0aGUgc2l6ZXMKLSAgICAgb2YgYWxsIHByZWRlY2Vzc29yIHNlZ21lbnRzLiAgKi8KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gYmxvY2s7Ci0KLSAgaWYgKHRyYWlsZXIgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGlmICh0cmFpbGVyLT50aGlzX3NpemUgPD0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJlc3VsdCArPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgIH0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCk7Ci0KLSAgLyogV2UgYXJlIGRvbmUuICBOb3RlIHRoYXQgaWYgeW91IHByZXNlbnQgYSBib2d1cyBhZGRyZXNzIChvbmUKLSAgICAgbm90IGluIGFueSBzZWdtZW50KSwgeW91IHdpbGwgZ2V0IGEgZGlmZmVyZW50IG51bWJlciBiYWNrLCBmb3JtZWQKLSAgICAgZnJvbSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYmxvY2suICBUaGlzIGlzIHByb2JhYmx5Ci0gICAgIG5vdCB3aGF0IHlvdSB3YW50LiAgKi8KLQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLSNlbHNlIC8qIG5vdCBDUkFZMiAqLwotLyogU3RhY2sgYWRkcmVzcyBmdW5jdGlvbiBmb3IgYSBDUkFZLTEsIENSQVkgWC1NUCwgb3IgQ1JBWSBZLU1QLgotICAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIGNlbGwgd2l0aGluIHRoZSBzdGFjaywKLSAgIGdpdmVuIHRoZSBhZGRyZXNzIG9mIHRoZSBjZWxsLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcwotICAgcm91dGluZSBpcyB0byBsaW5lYXJpemUsIGluIHNvbWUgc2Vuc2UsIHN0YWNrIGFkZHJlc3NlcwotICAgZm9yIGFsbG9jYS4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyBhZGRyZXNzKQotewotICBsb25nIHN0a2wgPSAwOwotCi0gIGxvbmcgc2l6ZSwgcHNlZywgdGhpc19zZWdtZW50LCBzdGFjazsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKnNzcHRyOwotCi0gIC8qIFJlZ2lzdGVyIEI2NyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZQotICAgICBjdXJyZW50IHN0YWNrIHNlZ21lbnQuICBJZiB5b3UgKGFzIGEgc3VicHJvZ3JhbSkgc3RvcmUKLSAgICAgeW91ciByZWdpc3RlcnMgb24gdGhlIHN0YWNrIGFuZCBmaW5kIHRoYXQgeW91IGFyZSBwYXN0Ci0gICAgIHRoZSBjb250ZW50cyBvZiBCNjcsIHlvdSBoYXZlIG92ZXJmbG93ZWQgdGhlIHNlZ21lbnQuCi0KLSAgICAgQjY3IGFsc28gcG9pbnRzIHRvIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbAotICAgICBhcmVhLCB3aGljaCBpcyB3aGF0IHdlIGFyZSByZWFsbHkgaW50ZXJlc3RlZCBpbi4gICovCi0KLSAgc3RrbCA9IENSQVlfU1RBQ0tTRUdfRU5EICgpOwotICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0KLSAgLyogSWYgb25lIHN1YnRyYWN0cyAnc2l6ZScgZnJvbSB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LAotICAgICBvbmUgaGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBzZWdtZW50LCAncHNlZycgd2lsbCBiZQotICAgICBub256ZXJvLiAgKi8KLQotICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0KLSAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0KLSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBjYWxsaW5nIHRoaXMgcm91dGluZSBpdHNlbGYgY2F1c2VkCi0gICAgIGEgc3RhY2sgb3ZlcmZsb3cuICBEaXNjYXJkIHN0YWNrIHNlZ21lbnRzIHdoaWNoIGRvIG5vdAotICAgICBjb250YWluIHRoZSB0YXJnZXQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKCEodGhpc19zZWdtZW50IDw9IGFkZHJlc3MgJiYgYWRkcmVzcyA8PSBzdGtsKSkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvICUwMTFvXG4iLCB0aGlzX3NlZ21lbnQsIGFkZHJlc3MsIHN0a2wpOwotI2VuZGlmCi0gICAgICBpZiAocHNlZyA9PSAwKQotCWJyZWFrOwotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHRoaXNfc2VnbWVudCA9IHN0a2wgLSBzaXplOwotICAgIH0KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gdGhpc19zZWdtZW50OwotCi0gIC8qIElmIHlvdSBzdWJ0cmFjdCBwc2VnIGZyb20gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBzdGFjaywKLSAgICAgeW91IGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgc3RhY2sgc2VnbWVudCdzIGVuZC4KLSAgICAgVGhpcyBzZWVtcyBhIGxpdHRsZSBjb252b2x1dGVkIHRvIG1lLCBidXQgSSdsbCBiZXQgeW91IHNhdmUKLSAgICAgYSBjeWNsZSBzb21ld2hlcmUuICAqLwotCi0gIHdoaWxlIChwc2VnICE9IDApCi0gICAgewotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlMDExbyAlMDExb1xuIiwgcHNlZywgc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIHN0a2wgPSBzdGtsIC0gcHNlZzsKLSAgICAgIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLSAgICAgIHNpemUgPSBzc3B0ci0+c3NzaXplOwotICAgICAgcHNlZyA9IHNzcHRyLT5zc3BzZWc7Ci0gICAgICByZXN1bHQgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2VuZGlmIC8qIG5vdCBDUkFZMiAqLwotI2VuZGlmIC8qIENSQVkgKi8KLQotI2VuZGlmIC8qIG5vIGFsbG9jYSAqLwotI2VuZGlmIC8qIG5vdCBHQ0MgdmVyc2lvbiAyICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXJndi5jIGIvbGliaWJlcnR5L2FyZ3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NmZmZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYXJndi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzIChhcmd2J3MpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qICBDcmVhdGUgYW5kIGRlc3Ryb3kgYXJndW1lbnQgdmVjdG9ycy4gIEFuIGFyZ3VtZW50IHZlY3RvciBpcyBzaW1wbHkgYW4KLSAgICBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIHBvaW50ZXIuICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNzcGFjZQotI3VuZGVmIGlzc3BhY2UKLSNlbmRpZgotI2RlZmluZSBpc3NwYWNlKGNoKSAoKGNoKSA9PSAnICcgfHwgKGNoKSA9PSAnXHQnKQotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLQotI2lmICFkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR05VQ19fCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwkJLyogQ29weSBtZW1vcnkgcmVnaW9uICovCi1leHRlcm4gaW50IHN0cmxlbiAoKTsJCS8qIENvdW50IGxlbmd0aCBvZiBzdHJpbmcgKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqcmVhbGxvYyAoKTsJLyogU3RhbmRhcmQgbWVtb3J5IHJlYWxsb2NhdG9yICovCi1leHRlcm4gdm9pZCBmcmVlICgpOwkJLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KLWV4dGVybiBjaGFyICpzdHJkdXAgKCk7CQkvKiBEdXBsaWNhdGUgYSBzdHJpbmcgKi8KLSNlbmRpZgotCi0jZW5kaWYJLyogX19TVERDX18gKi8KLQotI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVPUwotI2RlZmluZSBFT1MgJ1wwJwotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVElBTF9NQVhBUkdDIDgJLyogTnVtYmVyIG9mIGFyZ3MgKyBOVUxMIGluIGluaXRpYWwgYXJndiAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWR1cGFyZ3YgLS0gZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3RvcgotCi1TWU5PUFNJUwotCi0JY2hhciAqKmR1cGFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gIFNpbXBseSBzY2FucyB0aHJvdWdoIHRoZQotCXZlY3RvciwgZHVwbGljYXRpbmcgZWFjaCBhcmd1bWVudCB1bnRpbCB0aGUKLQl0ZXJtaW5hdGluZyBOVUxMIGlzIGZvdW5kLgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmCi0Jc3VjY2Vzc2Z1bC4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgdG8KLQljb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi0qLwotCi1jaGFyICoqCi1kdXBhcmd2IChhcmd2KQotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGFyZ2M7Ci0gIGNoYXIgKipjb3B5OwotICAKLSAgaWYgKGFyZ3YgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSB2ZWN0b3IgKi8KLSAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspOwotICBjb3B5ID0gKGNoYXIgKiopIG1hbGxvYyAoKGFyZ2MgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIGlmIChjb3B5ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiB0aGUgc3RyaW5ncyAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChhcmd2W2FyZ2NdKTsKLSAgICAgIGNvcHlbYXJnY10gPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChsZW4gKyAxKSk7Ci0gICAgICBpZiAoY29weVthcmdjXSA9PSBOVUxMKQotCXsKLQkgIGZyZWVhcmd2IChjb3B5KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHN0cmNweSAoY29weVthcmdjXSwgYXJndlthcmdjXSk7Ci0gICAgfQotICBjb3B5W2FyZ2NdID0gTlVMTDsKLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCWZyZWVhcmd2IC0tIGZyZWUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQl2b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi0JY2hhciAqKnZlY3RvcjsKLQotREVTQ1JJUFRJT04KLQotCUZyZWUgYW4gYXJndW1lbnQgdmVjdG9yIHRoYXQgd2FzIGJ1aWx0IHVzaW5nIGJ1aWxkYXJndi4gIFNpbXBseSBzY2FucwotCXRocm91Z2ggdGhlIHZlY3RvciwgZnJlZWluZyB0aGUgbWVtb3J5IGZvciBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQsIGFuZCB0aGVuIGZyZWVzIHRoZSB2ZWN0b3IgaXRzZWxmLgotCi1SRVRVUk5TCi0KLQlObyB2YWx1ZS4KLQotKi8KLQotdm9pZCBmcmVlYXJndiAodmVjdG9yKQotY2hhciAqKnZlY3RvcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqKnNjYW47Ci0KLSAgaWYgKHZlY3RvciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoc2NhbiA9IHZlY3RvcjsgKnNjYW4gIT0gTlVMTDsgc2NhbisrKQotCXsKLQkgIGZyZWUgKCpzY2FuKTsKLQl9Ci0gICAgICBmcmVlICh2ZWN0b3IpOwotICAgIH0KLX0KLQotLyoKLQotTkFNRQotCi0JYnVpbGRhcmd2IC0tIGJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqYnVpbGRhcmd2IChzcCkKLQljaGFyICpzcDsKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGEgcG9pbnRlciB0byBhIHN0cmluZywgcGFyc2UgdGhlIHN0cmluZyBleHRyYWN0aW5nIGZpZWxkcwotCXNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIGFuZCBvcHRpb25hbGx5IGVuY2xvc2VkIHdpdGhpbiBlaXRoZXIgc2luZ2xlCi0Jb3IgZG91YmxlIHF1b3RlcyAod2hpY2ggYXJlIHN0cmlwcGVkIG9mZiksIGFuZCBidWlsZCBhIHZlY3RvciBvZgotCXBvaW50ZXJzIHRvIGNvcGllcyBvZiB0aGUgc3RyaW5nIGZvciBlYWNoIGZpZWxkLiAgVGhlIGlucHV0IHN0cmluZwotCXJlbWFpbnMgdW5jaGFuZ2VkLgotCi0JQWxsIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVyIGFycmF5IGFuZCBjb3BpZXMgb2YgdGhlIHN0cmluZwotCWlzIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgQWxsIG9mIHRoZSBtZW1vcnkgY2FuIGJlIHJldHVybmVkIHRvIHRoZQotCXN5c3RlbSB3aXRoIHRoZSBzaW5nbGUgZnVuY3Rpb24gY2FsbCBmcmVlYXJndiwgd2hpY2ggdGFrZXMgdGhlCi0JcmV0dXJuZWQgcmVzdWx0IG9mIGJ1aWxkYXJndiwgYXMgaXQncyBhcmd1bWVudC4KLQotCVRoZSBtZW1vcnkgZm9yIHRoZSBhcmd2IGFycmF5IGlzIGR5bmFtaWNhbGx5IGV4cGFuZGVkIGFzIG5lY2Vzc2FyeS4KLQotUkVUVVJOUwotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IHZlY3RvciBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwKLQlpZiB0aGUgaW5wdXQgc3RyaW5nIHBvaW50ZXIgaXMgTlVMTCBvciBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKLQltZW1vcnkgdG8gY29tcGxldGUgYnVpbGRpbmcgdGhlIGFyZ3VtZW50IHZlY3Rvci4KLQotTk9URVMKLQotCUluIG9yZGVyIHRvIHByb3ZpZGUgYSB3b3JraW5nIGJ1ZmZlciBmb3IgZXh0cmFjdGluZyBhcmd1bWVudHMgaW50bywKLQl3aXRoIGFwcHJvcHJpYXRlIHN0cmlwcGluZyBvZiBxdW90ZXMgYW5kIHRyYW5zbGF0aW9uIG9mIGJhY2tzbGFzaAotCXNlcXVlbmNlcywgd2UgYWxsb2NhdGUgYSB3b3JraW5nIGJ1ZmZlciBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBpbnB1dAotCXN0cmluZy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBzcGFjZSBpbiB3aGljaCB0bwotCXdvcmssIHNpbmNlIHRoZSBleHRyYWN0ZWQgYXJnIGlzIG5ldmVyIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBzdHJpbmcuCi0KLQlJZiB0aGUgaW5wdXQgaXMgYSBudWxsIHN0cmluZyAoYXMgb3Bwb3NlZCB0byBhIE5VTEwgcG9pbnRlciksIHRoZW4KLQlidWlsZGFyZyByZXR1cm5zIGFuIGFyZ3YgdGhhdCBoYXMgb25lIGFyZywgYSBudWxsIHN0cmluZy4KLQotCUFyZ3YgaXMgYWx3YXlzIGtlcHQgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBhcmcgcG9pbnRlciwgc28gaXQgY2FuCi0JYmUgcGFzc2VkIHRvIGZyZWVhcmd2IGF0IGFueSB0aW1lLCBvciByZXR1cm5lZCwgYXMgYXBwcm9wcmlhdGUuCi0qLwotCi1jaGFyICoqYnVpbGRhcmd2IChpbnB1dCkKLWNoYXIgKmlucHV0OwotewotICBjaGFyICphcmc7Ci0gIGNoYXIgKmNvcHlidWY7Ci0gIGludCBzcXVvdGUgPSAwOwotICBpbnQgZHF1b3RlID0gMDsKLSAgaW50IGJzcXVvdGUgPSAwOwotICBpbnQgYXJnYyA9IDA7Ci0gIGludCBtYXhhcmdjID0gMDsKLSAgY2hhciAqKmFyZ3YgPSBOVUxMOwotICBjaGFyICoqbmFyZ3Y7Ci0KLSAgaWYgKGlucHV0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29weWJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChpbnB1dCkgKyAxKTsKLSAgICAgIC8qIElzIGEgZG97fXdoaWxlIHRvIGFsd2F5cyBleGVjdXRlIHRoZSBsb29wIG9uY2UuICBBbHdheXMgcmV0dXJuIGFuCi0JIGFyZ3YsIGV2ZW4gZm9yIG51bGwgc3RyaW5ncy4gIFNlZSBOT1RFUyBhYm92ZSwgdGVzdCBjYXNlIGJlbG93LiAqLwotICAgICAgZG8KLQl7Ci0JICAvKiBQaWNrIG9mZiBhcmd2W2FyZ2NdICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQkgIGlmICgobWF4YXJnYyA9PSAwKSB8fCAoYXJnYyA+PSAobWF4YXJnYyAtIDEpKSkKLQkgICAgewotCSAgICAgIC8qIGFyZ3YgbmVlZHMgaW5pdGlhbGl6YXRpb24sIG9yIGV4cGFuc2lvbiAqLwotCSAgICAgIGlmIChhcmd2ID09IE5VTEwpCi0JCXsKLQkJICBtYXhhcmdjID0gSU5JVElBTF9NQVhBUkdDOwotCQkgIG5hcmd2ID0gKGNoYXIgKiopIG1hbGxvYyAobWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYXhhcmdjICo9IDI7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyAoYXJndiwgbWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCX0KLQkgICAgICBpZiAobmFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIGlmIChhcmd2ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkJICAgICAgYXJndiA9IE5VTEw7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBhcmd2ID0gbmFyZ3Y7Ci0JICAgICAgYXJndlthcmdjXSA9IE5VTEw7Ci0JICAgIH0KLQkgIC8qIEJlZ2luIHNjYW5uaW5nIGFyZyAqLwotCSAgYXJnID0gY29weWJ1ZjsKLQkgIHdoaWxlICgqaW5wdXQgIT0gRU9TKQotCSAgICB7Ci0JICAgICAgaWYgKGlzc3BhY2UgKCppbnB1dCkgJiYgIXNxdW90ZSAmJiAhZHF1b3RlICYmICFic3F1b3RlKQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoYnNxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDA7Ci0JCSAgICAgICphcmcrKyA9ICppbnB1dDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqaW5wdXQgPT0gJ1xcJykKLQkJICAgIHsKLQkJICAgICAgYnNxdW90ZSA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3F1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGRxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnXCcnKQotCQkJewotCQkJICBzcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlIGlmICgqaW5wdXQgPT0gJyInKQotCQkJewotCQkJICBkcXVvdGUgPSAxOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICphcmcrKyA9ICppbnB1dDsKLQkJCX0KLQkJICAgIH0KLQkJICBpbnB1dCsrOwotCQl9Ci0JICAgIH0KLQkgICphcmcgPSBFT1M7Ci0JICBhcmd2W2FyZ2NdID0gc3RyZHVwIChjb3B5YnVmKTsKLQkgIGlmIChhcmd2W2FyZ2NdID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlYXJndiAoYXJndik7Ci0JICAgICAgYXJndiA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGFyZ2MrKzsKLQkgIGFyZ3ZbYXJnY10gPSBOVUxMOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKLQkgICAgewotCSAgICAgIGlucHV0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0ICE9IEVPUyk7Ci0gICAgfQotICByZXR1cm4gKGFyZ3YpOwotfQotCi0jaWZkZWYgTUFJTgotCi0vKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLwotCi1zdGF0aWMgY2hhciAqdGVzdHNbXSA9Ci17Ci0gICJhIHNpbXBsZSBjb21tYW5kIGxpbmUiLAotICAiYXJnICdmb28nIGlzIHNpbmdsZSBxdW90ZWQiLAotICAiYXJnIFwiYmFyXCIgaXMgZG91YmxlIHF1b3RlZCIsCi0gICJhcmcgXCJmb28gYmFyXCIgaGFzIGVtYmVkZGVkIHdoaXRlc3BhY2UiLAotICAiYXJnICdKYWNrIHNhaWQgXFwnaGlcXCcnIGhhcyBzaW5nbGUgcXVvdGVzIiwKLSAgImFyZyAnSmFjayBzYWlkIFxcXCJoaVxcXCInIGhhcyBkb3VibGUgcXVvdGVzIiwKLSAgImEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiAxIDIgMyA0IDUgNiA3IDggOSIsCi0gIAotICAvKiBUaGlzIHNob3VsZCBiZSBleHBhbmRlZCBpbnRvIG9ubHkgb25lIGFyZ3VtZW50LiAgKi8KLSAgInRyYWlsaW5nLXdoaXRlc3BhY2UgIiwKLQotICAiIiwKLSAgTlVMTAotfTsKLQotbWFpbiAoKQotewotICBjaGFyICoqYXJndjsKLSAgY2hhciAqKnRlc3Q7Ci0gIGNoYXIgKip0YXJnczsKLQotICBmb3IgKHRlc3QgPSB0ZXN0czsgKnRlc3QgIT0gTlVMTDsgdGVzdCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoImJ1aWxkYXJndihcIiVzXCIpXG4iLCAqdGVzdCk7Ci0gICAgICBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKCp0ZXN0KSkgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJmYWlsZWQhXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHRhcmdzID0gYXJndjsgKnRhcmdzICE9IE5VTEw7IHRhcmdzKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcdFwiJXNcIlxuIiwgKnRhcmdzKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBmcmVlYXJndiAoYXJndik7Ci0gICAgfQotCi19Ci0KLSNlbmRpZgkvKiBNQUlOICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXNwcmludGYuYyBiL2xpYmliZXJ0eS9hc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFmMzIwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogTGlrZSBzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIFVTRV9TVERBUkcKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogVkFSQVJHUyAqLwotI2lmZGVmIFVTRV9TVERBUkcKLWludAotYXNwcmludGYgKGNoYXIgKipidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLWludAotYXNwcmludGYgKGJ1ZiwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBpbnQgc3RhdHVzOwotICB2YV9saXN0IGFwOwotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFwKTsKLSNlbmRpZgotICBzdGF0dXMgPSB2YXNwcmludGYgKGJ1ZiwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2F0ZXhpdC5jIGIvbGliaWJlcnR5L2F0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkOTg1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hdGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIFdyYXBwZXIgdG8gaW1wbGVtZW50IEFOU0kgQydzIGF0ZXhpdCB1c2luZyBTdW5PUydzIG9uX2V4aXQuICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgLS1NaWtlIFN0dW1wLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX09OX0VYSVQKLQotaW50Ci1hdGV4aXQoZikKLSAgICAgdm9pZCAoKmYpKCk7Ci17Ci0gIC8qIElmIHRoZSBzeXN0ZW0gZG9lc24ndCBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3IgYXRleGl0LCB1c2Ugb25fZXhpdAotICAgICBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzIHRoYXQuICAqLwotICBvbl9leGl0IChmLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Jhc2VuYW1lLmMgYi9saWJpYmVydHkvYmFzZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5OGYwNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmFzZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIFJldHVybiB0aGUgYmFzZW5hbWUgb2YgYSBwYXRobmFtZS4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQliYXNlbmFtZSAtLSByZXR1cm4gcG9pbnRlciB0byBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lCi0KLVNZTk9QU0lTCi0JY2hhciAqYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0eXBpY2FsIHBhdGhuYW1lCi0JKC91c3Ivc3JjL2NtZC9scy9scy5jIGZvciBleGFtcGxlKSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0JbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhuYW1lICgibHMuYyIgaW4gdGhpcyBjYXNlKS4KLQotQlVHUwotCVByZXN1bWVzIGEgVU5JWCBvciBET1MvV2luZG93cyBzdHlsZSBwYXRoIHdpdGggVU5JWCBvciBET1MvV2luZG93cyAKLQlzdHlsZSBzZXBhcmF0b3JzLgotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKLSAgZGVmaW5lZCAoX19PUzJfXykKLSNkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUl8yIAotI2RlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJwotI2VuZGlmCi0jZW5kaWYKLQotLyogRGVmaW5lIElTX0RJUl9TRVBBUkFUT1IuICAqLwotI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKLSMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCi0jZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KLSMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKLQkoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKLSNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KLQotY2hhciAqCi1iYXNlbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhIChuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykgCi0gICAgbmFtZSArPSAyOwotI2VuZGlmCi0KLSAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKLSAgICB7Ci0gICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2JjbXAuYyBiL2xpYmliZXJ0eS9iY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTQ0MTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2JjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGJjbXAKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotCi1OQU1FCi0KLQliY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0KLQlpbnQgYmNtcCAoY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQotCUNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zIGFuZCByZXR1cm4gemVybyBpZiB0aGV5IGFyZSBpZGVudGljYWwsCi0Jbm9uLXplcm8gb3RoZXJ3aXNlLiAgSWYgY291bnQgaXMgemVybywgcmV0dXJuIHplcm8uCi0KLU5PVEVTCi0KLQlObyBndWFyYW50ZWUgaXMgbWFkZSBhYm91dCB0aGUgbm9uLXplcm8gcmV0dXJuZWQgdmFsdWUuICBJbgotCXBhcnRpY3VsYXIsIHRoZSByZXN1bHRzIG1heSBiZSBzaWduZmljYW50bHkgZGlmZmVyZW50IHRoYW4KLQlzdHJjbXAoKSwgd2hlcmUgdGhlIHJldHVybiB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlzb3J0aW5nIG9mIHRoZSBjb21wYXJlZCByZWdpb25zLgotCi1CVUdTCi0KLSovCi0KLQotaW50Ci1iY21wIChmcm9tLCB0bywgY291bnQpCi0gIGNoYXIgKmZyb20sICp0bzsKLSAgaW50IGNvdW50OwotewotICBpbnQgcnRudmFsID0gMDsKLQotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgaWYgKCpmcm9tKysgIT0gKnRvKyspCi0JewotCSAgcnRudmFsID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAocnRudmFsKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Jjb3B5LmMgYi9saWJpYmVydHkvYmNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NTM2My4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIGJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRhcnkgbGVuZ3RoCi0KLU5BTUUKLQliY29weSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0cmFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkIGJjb3B5IChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbGVuZ3RoKQotCi1ERVNDUklQVElPTgotCUNvcHkgTEVOR1RIIGJ5dGVzIGZyb20gbWVtb3J5IHJlZ2lvbiBwb2ludGVkIHRvIGJ5IElOIHRvIG1lbW9yeQotCXJlZ2lvbiBwb2ludGVkIHRvIGJ5IE9VVC4KLQotQlVHUwotCVNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50cyBjYW4gYmUgbWFkZSBpbiBzb21lIGNhc2VzIGJ5Ci0JaW1wbGVtZW50aW5nIGNvcGllcyBvZiBtdWx0aXBsZSBieXRlcyBzaW11bHRhbmVvdXNseSwgb3IgdW5yb2xsaW5nCi0JdGhlIGNvcHkgbG9vcC4KLQotKi8KLQotdm9pZAotYmNvcHkgKHNyYywgZGVzdCwgbGVuKQotICByZWdpc3RlciBjaGFyICpzcmMsICpkZXN0OwotICBpbnQgbGVuOwotewotICBpZiAoZGVzdCA8IHNyYykKLSAgICB3aGlsZSAobGVuLS0pCi0gICAgICAqZGVzdCsrID0gKnNyYysrOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbGFzdHMgPSBzcmMgKyAobGVuLTEpOwotICAgICAgY2hhciAqbGFzdGQgPSBkZXN0ICsgKGxlbi0xKTsKLSAgICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICAgKihjaGFyICopbGFzdGQtLSA9ICooY2hhciAqKWxhc3RzLS07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2J6ZXJvLmMgYi9saWJpYmVydHkvYnplcm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNjQ0Yi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYnplcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2YgYnplcm8gZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCWJ6ZXJvIC0tIHplcm8gdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWVkIG1lbW9yeSByZWdpb24KLQotU1lOT1BTSVMKLQl2b2lkIGJ6ZXJvIChjaGFyICp0bywgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCVplcm8gQ09VTlQgYnl0ZXMgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgVE8uCi0KLUJVR1MKLQlTaWduaWZpY2FudCBzcGVlZCBlbmhhbmNlbWVudHMgbWF5IGJlIG1hZGUgaW4gc29tZSBlbnZpcm9ubWVudHMKLQlieSB6ZXJvaW5nIG1vcmUgdGhhbiBhIHNpbmdsZSBieXRlIGF0IGEgdGltZSwgb3IgYnkgdW5yb2xsaW5nIHRoZQotCWxvb3AuCi0KLSovCi0KLQotdm9pZAotYnplcm8gKHRvLCBjb3VudCkKLSAgY2hhciAqdG87Ci0gIGludCBjb3VudDsKLXsKLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgICp0bysrID0gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2FsbG9jLmMgYi9saWJpYmVydHkvY2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGIxOGQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NhbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogY2FsbG9jIC0tIGFsbG9jYXRlIG1lbW9yeSB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byB6ZXJvLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLSAKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotIAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIKLWNhbGxvYyAobmVsZW0sIGVsc2l6ZSkKLSAgc2l6ZV90IG5lbGVtLCBlbHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiBwdHI7ICAKLQotICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKLSAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7Ci0gIAotICBwdHIgPSBtYWxsb2MgKG5lbGVtICogZWxzaXplKTsKLSAgaWYgKHB0cikgYnplcm8gKHB0ciwgbmVsZW0gKiBlbHNpemUpOwotICAKLSAgcmV0dXJuIHB0cjsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jIGIvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNmQ4MTguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyogVXRpbGl0eSB0byBwaWNrIGEgdGVtcG9yYXJ5IGZpbGVuYW1lIHByZWZpeC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IGNob29zZV90ZW1wX2Jhc2UgYW5kIG1ha2VfdGVtcF9maWxlLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4JLyogTWF5IGdldCBQX3RtcGRpci4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4gICAvKiBNYXkgZ2V0IFJfT0ssIGV0Yy4gb24gc29tZSBzeXN0ZW1zLiAgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFJfT0sKLSNkZWZpbmUgUl9PSyA0Ci0jZGVmaW5lIFdfT0sgMgotI2RlZmluZSBYX09LIDEKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi1leHRlcm4gaW50IG1rc3RlbXBzICgpOwotCi0jaWZuZGVmIElOX0dDQwotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTl9fKSAmJiAhIGRlZmluZWQgKF9VV0lOKSkKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0vKiBPbiBNU0RPUywgd3JpdGUgdGVtcCBmaWxlcyBpbiBjdXJyZW50IGRpcgotICAgYmVjYXVzZSB0aGVyZSdzIG5vIHBsYWNlIGVsc2Ugd2UgY2FuIGV4cGVjdCB0byB1c2UuICAqLwotLyogPz8/IEFsdGhvdWdoIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB0cmllZCBhcyBhIGxhc3QgcmVzb3J0LAotICAgdGhpcyBpcyBsZWZ0IGluIHNvIHRoYXQgb24gTVNET1MgaXQgaXMgcHJlZmVycmVkIHRvIC90bXAgb24gdGhlCi0gICBvZmYgY2hhbmNlIHRoYXQgc29tZW9uZSByZXF1aXJlcyB0aGlzLCBzaW5jZSB0aGF0IHdhcyB0aGUgcHJldmlvdXMKLSAgIGJlaGF2aW91ci4gICovCi0jaWZkZWYgX19NU0RPU19fCi0jaWZuZGVmIFBfdG1wZGlyCi0jZGVmaW5lIFBfdG1wZGlyICIuIgotI2VuZGlmCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0ZW1wb3JhcnkgZmlsZS4KLSAgIG1rdGVtcCByZXF1aXJlcyA2IHRyYWlsaW5nIFgncy4gICovCi0jZGVmaW5lIFRFTVBfRklMRSAiY2NYWFhYWFgiCi0KLS8qIFN1YnJvdXRpbmUgb2YgY2hvb3NlX3RlbXBfYmFzZS4KLSAgIElmIEJBU0UgaXMgbm9uLU5VTEwsIHJldHVybiBpdC4KLSAgIE90aGVyd2lzZSBpdCBjaGVja3MgaWYgRElSIGlzIGEgdXNhYmxlIGRpcmVjdG9yeS4KLSAgIElmIHN1Y2Nlc3MsIERJUiBpcyByZXR1cm5lZC4KLSAgIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdHJ5IChkaXIsIGJhc2UpCi0gICAgIGNoYXIgKmRpciwgKmJhc2U7Ci17Ci0gIGlmIChiYXNlICE9IDApCi0gICAgcmV0dXJuIGJhc2U7Ci0gIGlmIChkaXIgIT0gMAotICAgICAgJiYgYWNjZXNzIChkaXIsIFJfT0sgfCBXX09LIHwgWF9PSykgPT0gMCkKLSAgICByZXR1cm4gZGlyOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIGEgcHJlZml4IGZvciB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBvciBOVUxMIGlmIHVuYWJsZSB0byBmaW5kIG9uZS4KLSAgIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBjaG9zZW4gaWYgYWxsIGVsc2UgZmFpbHMgc28gdGhlIHByb2dyYW0gaXMKLSAgIGV4aXRlZCBpZiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgY2FuJ3QgYmUgZm91bmQgKG1rdGVtcCBmYWlscykuCi0gICBUaGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGlzIG9idGFpbmVkIHdpdGggeG1hbGxvYy4gCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IG9ubHkuICBJdCB1c2UKLSAgIGlzIG5vdCByZWNvbW1lbmRlZC4gICovCi0KLWNoYXIgKgotY2hvb3NlX3RlbXBfYmFzZSAoKQotewotICBjaGFyICpiYXNlID0gMDsKLSAgY2hhciAqdGVtcF9maWxlbmFtZTsKLSAgaW50IGxlbjsKLSAgc3RhdGljIGNoYXIgdG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLSAgc3RhdGljIGNoYXIgdXNydG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd1JywgJ3MnLCAncicsIERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLQotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVBESVIiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUCIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVEVNUCIpLCBiYXNlKTsKLQotI2lmZGVmIFBfdG1wZGlyCi0gIGJhc2UgPSB0cnkgKFBfdG1wZGlyLCBiYXNlKTsKLSNlbmRpZgotCi0gIC8qIFRyeSAvdXNyL3RtcCwgdGhlbiAvdG1wLiAgKi8KLSAgYmFzZSA9IHRyeSAodXNydG1wLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAodG1wLCBiYXNlKTsKLSAKLSAgLyogSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkhICAqLwotICBpZiAoYmFzZSA9PSAwKQotICAgIGJhc2UgPSAiLiI7Ci0KLSAgbGVuID0gc3RybGVuIChiYXNlKTsKLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGxlbiArIDEgLypESVJfU0VQQVJBVE9SKi8KLQkJCSAgICsgc3RybGVuIChURU1QX0ZJTEUpICsgMSk7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7Ci0KLSAgaWYgKGxlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2xlbi0xXSAhPSAnLycKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCi0gICAgdGVtcF9maWxlbmFtZVtsZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBsZW4sIFRFTVBfRklMRSk7Ci0KLSAgbWt0ZW1wICh0ZW1wX2ZpbGVuYW1lKTsKLSAgaWYgKHN0cmxlbiAodGVtcF9maWxlbmFtZSkgPT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19Ci0vKiBSZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZSBuYW1lIChhcyBhIHN0cmluZykgb3IgTlVMTCBpZiB1bmFibGUgdG8gY3JlYXRlCi0gICBvbmUuICAqLwotCi1jaGFyICoKLW1ha2VfdGVtcF9maWxlIChzdWZmaXgpCi0gICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLXsKLSAgY2hhciAqYmFzZSA9IDA7Ci0gIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0gIGludCBiYXNlX2xlbiwgc3VmZml4X2xlbjsKLSAgaW50IGZkOwotICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotCi0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOwotCi0jaWZkZWYgUF90bXBkaXIKLSAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOwotI2VuZGlmCi0KLSAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLwotICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOwotICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOwotIAotICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCi0gIGlmIChiYXNlID09IDApCi0gICAgYmFzZSA9ICIuIjsKLQotICBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBzdWZmaXhfbGVuID0gc3RybGVuIChzdWZmaXgpOwotICBlbHNlCi0gICAgc3VmZml4X2xlbiA9IDA7Ci0KLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGJhc2VfbGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLwotCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkKLQkJCSAgICsgc3VmZml4X2xlbiArIDEpOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUsIGJhc2UpOwotCi0gIGlmIChiYXNlX2xlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9ICcvJwotICAgICAgJiYgdGVtcF9maWxlbmFtZVtiYXNlX2xlbi0xXSAhPSBESVJfU0VQQVJBVE9SKQotICAgIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBiYXNlX2xlbiwgVEVNUF9GSUxFKTsKLQotICBpZiAoc3VmZml4KQotICAgIHN0cmNhdCAodGVtcF9maWxlbmFtZSwgc3VmZml4KTsKLQotICBmZCA9IG1rc3RlbXBzICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXhfbGVuKTsKLSAgLyogSWYgbWtzdGVtcHMgZmFpbGVkLCB0aGVuIHNvbWV0aGluZyBiYWQgaXMgaGFwcGVuaW5nLiAgTWF5YmUgd2Ugc2hvdWxkCi0gICAgIGlzc3VlIGEgbWVzc2FnZSBhYm91dCBhIHBvc3NpYmxlIHNlY3VyaXR5IGF0dGFjayBpbiBwcm9ncmVzcz8gICovCi0gIGlmIChmZCA9PSAtMSkKLSAgICBhYm9ydCAoKTsKLSAgLyogU2ltaWxhcmx5IGlmIHdlIGNhbiBub3QgY2xvc2UgdGhlIGZpbGUuICAqLwotICBpZiAoY2xvc2UgKGZkKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2xvY2suYyBiL2xpYmliZXJ0eS9jbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI1MDljLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogQU5TSS1jb21wYXRpYmxlIGNsb2NrIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RJTUVTCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NDX0NMS19UQ0sKLSNkZWZpbmUgR05VX0haICBzeXNjb25mKF9TQ19DTEtfVENLKQotI2Vsc2UKLSNpZmRlZiBIWgotI2RlZmluZSBHTlVfSFogIEhaCi0jZWxzZQotI2lmZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIEdOVV9IWiAgQ0xPQ0tTX1BFUl9TRUMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyogRklYTUU6IHNob3VsZCBiZSBhYmxlIHRvIGRlY2xhcmUgYXMgY2xvY2tfdC4gKi8KLQotbG9uZwotY2xvY2sgKCkKLXsKLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKLQotICBnZXRydXNhZ2UgKDAsICZydXNhZ2UpOwotICByZXR1cm4gKHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMKLQkgICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyk7Ci0jZWxzZQotI2lmZGVmIEhBVkVfVElNRVMKLSAgc3RydWN0IHRtcyB0bXM7Ci0KLSAgdGltZXMgKCZ0bXMpOwotICByZXR1cm4gKHRtcy50bXNfdXRpbWUgKyB0bXMudG1zX3N0aW1lKSAqICgxMDAwMDAwIC8gR05VX0haKTsKLSNlbHNlCi0jaWZkZWYgVk1TCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBwcm9jX3VzZXJfdGltZTsKLSAgICAgIGludCBwcm9jX3N5c3RlbV90aW1lOwotICAgICAgaW50IGNoaWxkX3VzZXJfdGltZTsKLSAgICAgIGludCBjaGlsZF9zeXN0ZW1fdGltZTsKLSAgICB9IHZtc190aW1lczsKLQotICB0aW1lcyAoJnZtc190aW1lcyk7Ci0gIHJldHVybiAodm1zX3RpbWVzLnByb2NfdXNlcl90aW1lICsgdm1zX3RpbWVzLnByb2Nfc3lzdGVtX3RpbWUpICogMTAwMDA7Ci0jZWxzZQotICAvKiBBIGZhbGxiYWNrLCBpZiBub3RoaW5nIGVsc2UgYXZhaWxhYmxlLiAqLwotICByZXR1cm4gMDsKLSNlbmRpZiAvKiBWTVMgKi8KLSNlbmRpZiAvKiBIQVZFX1RJTUVTICovCi0jZW5kaWYgLyogSEFWRV9HRVRSVVNBR0UgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmNhdC5jIGIvbGliaWJlcnR5L2NvbmNhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjEzMmM4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25jYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiBDb25jYXRlbmF0ZSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLQotTkFNRQotCi0JY29uY2F0IC0tIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0KLQljaGFyICpjb25jYXQgKHMxLCBzMiwgczMsIC4uLiwgTlVMTCkKLQotREVTQ1JJUFRJT04KLQotCUNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MgYW5kIHJldHVybiB0aGUgcmVzdWx0Ci0JaW4gZnJlc2hseSBtYWxsb2MnZCBtZW1vcnkuCi0KLQlSZXR1cm5zIE5VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUuICBUaGUgYXJndW1lbnQKLQlsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0IE5VTEwgcG9pbnRlciBlbmNvdW50ZXJlZC4gIFBvaW50ZXJzCi0JdG8gZW1wdHkgc3RyaW5ncyBhcmUgaWdub3JlZC4KLQotTk9URVMKLQotCVRoaXMgZnVuY3Rpb24gdXNlcyB4bWFsbG9jKCkgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcm9udCBlbmQKLQlmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zLiAgSW4KLQl0eXBpY2FsIHVzZSwgaWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIHRoZW4geG1hbGxvYygpIGRpdmVydHMgdG8gYW4KLQllcnJvciBoYW5kbGVyIHJvdXRpbmUgd2hpY2ggbmV2ZXIgcmV0dXJucywgYW5kIHRodXMgeG1hbGxvYyB3aWxsCi0JbmV2ZXIgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAgSWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aXNoZXMgdG8KLQlkZWFsIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zIGl0c2VsZiwgaXQgc2hvdWxkIHN1cHBseSBhbiB4bWFsbG9jCi0JdGhhdCBqdXN0IGRpcmVjdGx5IGludm9rZXMgbWFsbG9jIGFuZCBibGluZGx5IHJldHVybnMgd2hhdGV2ZXIKLQltYWxsb2MgcmV0dXJucy4KLSovCi0KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOwotI2Vsc2UKLWV4dGVybiBpbnQgc3RybGVuICgpOwotI2VuZGlmCi0KLSNkZWZpbmUgTlVMTFAgKGNoYXIgKikwCi0KLS8qIFZBUkFSR1MgKi8KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWNoYXIgKgotY29uY2F0IChjb25zdCBjaGFyICpmaXJzdCwgLi4uKQotI2Vsc2UKLWNoYXIgKgotY29uY2F0ICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgaW50IGxlbmd0aDsKLSAgcmVnaXN0ZXIgY2hhciAqbmV3c3RyOwotICByZWdpc3RlciBjaGFyICplbmQ7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmFyZzsKLSAgdmFfbGlzdCBhcmdzOwotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgY29uc3QgY2hhciAqZmlyc3Q7Ci0jZW5kaWYKLQotICAvKiBGaXJzdCBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZXN1bHQgYW5kIGdldCBzdWZmaWNpZW50IG1lbW9yeS4gKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIGlmIChmaXJzdCA9PSBOVUxMUCkKLSAgICBsZW5ndGggPSAwOwotICBlbHNlCi0gICAgewotICAgICAgbGVuZ3RoID0gc3RybGVuIChmaXJzdCk7Ci0gICAgICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCi0JewotCSAgbGVuZ3RoICs9IHN0cmxlbiAoYXJnKTsKLQl9Ci0gICAgfQotICBuZXdzdHIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICAvKiBOb3cgY29weSB0aGUgaW5kaXZpZHVhbCBwaWVjZXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcuICovCi0KLSAgaWYgKG5ld3N0ciAhPSBOVUxMUCkKLSAgICB7Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gICAgICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0gICAgICBlbmQgPSBuZXdzdHI7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTFApCi0JewotCSAgYXJnID0gZmlyc3Q7Ci0JICB3aGlsZSAoKmFyZykKLQkgICAgewotCSAgICAgICplbmQrKyA9ICphcmcrKzsKLQkgICAgfQotCSAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCphcmcpCi0JCXsKLQkJICAqZW5kKysgPSAqYXJnKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgICplbmQgPSAnXDAwMCc7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgIH0KLQotICByZXR1cm4gKG5ld3N0cik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSAgcHJpbnRmICgiXCJcIiA9IFwiJXNcIlxuIiwgY29uY2F0IChOVUxMUCkpOwotICBwcmludGYgKCJcImFcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgImMiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiY2QiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImMiLCAiZGUiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlZlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCIiLCAiYSIsICIiLCAiYmNkIiwgImVmIiwgTlVMTFApKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcyBiL2xpYmliZXJ0eS9jb25maWcuaC12bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWM2YTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpZm5kZWYgTkVFRF9zdHJlcnJvcgotI2RlZmluZSBORUVEX3N0cmVycm9yCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9iYXNlbmFtZQotI2RlZmluZSBORUVEX2Jhc2VuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfcHNpZ25hbAotI2VuZGlmCi0jaWZuZGVmIE5FRURfb25fZXhpdAotI2RlZmluZSBORUVEX29uX2V4aXQKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLmluIGIvbGliaWJlcnR5L2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NDIwOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19XQUlUX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDx2Zm9yay5oPi4gICovCi0jdW5kZWYgSEFWRV9WRk9SS19ICi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBwaWRfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHZmb3JrIGFzIGZvcmsgaWYgdmZvcmsgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgdmZvcmsKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfZXJybGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19uZXJyIHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORVJSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX3NpZ2xpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYXRleGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FURVhJVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JBU0VOQU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkNPUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiemVybyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CWkVSTwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNhbGxvYyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DQUxMT0MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjbG9jayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DTE9DSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXR0aW1lb2ZkYXkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5ERVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbnNxdWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfSU5TUVVFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1NT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtc2V0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1rc3RlbXBzIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01LU1RFTVBTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgb25fZXhpdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9PTl9FWElUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHNpZ25hbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJhbmRvbSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SQU5ET00KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW5hbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkVOQU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmluZGV4IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JJTkRFWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdzZXRtYXNrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR1NFVE1BU0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZHVwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkRVUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RybmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSTkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzaWduYWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3Ryc3RyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2wgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9MCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG91bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT1VMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0bXBuYW0gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVE1QTkFNCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZBU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZmcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZGUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVlNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0cGlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1dBSVRQSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRklMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy50YWJsZSBiL2xpYmliZXJ0eS9jb25maWcudGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzM3NDYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy50YWJsZQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhc2UgIiR7aG9zdH0iIGluCi0gIHJzNjAwMC1pYm0tYWl4My4xIHwgcnM2MDAwLWlibS1haXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFnPW1oLWFpeCA7OwotICAqLSotY3h1eDcqKQkJZnJhZz1taC1jeHV4NyA7OwotICAqLSotZnJlZWJzZDIuMS4qKQlmcmFnPW1oLWZic2QyMSA7OwotICAqLSotZnJlZWJzZDIuMi5bMDEyXSkJZnJhZz1taC1mYnNkMjEgOzsKLSAgaTM3MC0qLW9wZW5lZCopICAgICAgIGZyYWc9bWgtb3BlbmVkaXRpb24gOzsKLSAgaVszNDVdODYtKi13aW5kb3dzKikJZnJhZz1taC13aW5kb3dzIDs7Ci0gICotKi1iZW9zKikJCWZyYWc9bWgtYmVvcyA7OwotZXNhYwotCi1mcmFncz0kZnJhZwotCi0jIElmIHRoZXkgZGlkbid0IHNwZWNpZnkgLS1lbmFibGUtc2hhcmVkLCBkb24ndCBnZW5lcmF0ZSBzaGFyZWQgbGlicy4KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotaWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAqLSotY3lnd2luKikJOzsKLSAgICBhbHBoYSotKi1saW51eCopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtZWxmYWxwaGFwaWMiIDs7Ci0gICAgYXJtKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLWFybXBpYyIgOzsKLSAgICBocHBhKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXBhcGljIiA7OwotICAgIGlbMzQ1Nl04Ni0qLSopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgteDg2cGljIiA7OwotICAgIHBvd2VycGMqLSotYWl4KikJOzsKLSAgICBwb3dlcnBjKi0qLSopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtcHBjcGljIiA7OwotICAgICotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYyIgOzsKLSAgZXNhYwotZmkKLQotZWNobyAiIyBXYXJuaW5nOiB0aGlzIGZyYWdtZW50IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIiA+IHRlbXAtZnJhZwotCi1mb3IgZnJhZyBpbiAke2ZyYWdzfTsgZG8KLSAgY2FzZSAke2ZyYWd9IGluCi0gICAgLi4vKiApCi0gICAgICBpZiBbICR7c3JjZGlyfSA9IC4gXTsgdGhlbgotCVsgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgXSAmJiBmcmFnPS4uLyR7ZnJhZ30KLQlbIC1uICIke3dpdGhfbXVsdGlzcmN0b3B9IiBdICYmIGZyYWc9JHt3aXRoX211bHRpc3JjdG9wfSR7ZnJhZ30KLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi0gIGZyYWc9JHtzcmNkaXJ9LyR7eHNyY2Rpcn1jb25maWcvJGZyYWcKLSAgaWYgWyAtZiAke2ZyYWd9IF07IHRoZW4KLSAgICBlY2hvICJBcHBlbmRpbmcgJHtmcmFnfSB0byB4aG9zdC1ta2ZyYWciCi0gICAgZWNobyAiIyBGb2xsb3dpbmcgZnJhZ21lbnQgY29waWVkIGZyb20gJHtmcmFnfSIgPj4gdGVtcC1mcmFnCi0gICAgY2F0ICR7ZnJhZ30gPj4gdGVtcC1mcmFnCi0gIGZpCi1kb25lCi0KLSMgcmVjb3JkIGlmIHdlIHdhbnQgdG8gYnVpbGQgc2hhcmVkIGxpYnMuCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBlY2hvIGVuYWJsZV9zaGFyZWQgPSB5ZXMgPj4gdGVtcC1mcmFnCi1lbHNlCi0gIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+IHRlbXAtZnJhZwotZmkKLQotZnJhZz14aG9zdC1ta2ZyYWcKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICR7bGliaWJlcnR5X3RvcGRpcn0vbW92ZS1pZi1jaGFuZ2UgdGVtcC1mcmFnIHhob3N0LW1rZnJhZwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1haXggYi9saWJpYmVydHkvY29uZmlnL21oLWFpeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NDUwNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWFpeAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgb25seSBuZWVkZWQgYnkgQUlYIDMuMS4KLUhERUZJTkVTID0gLURfX0lFRUVfQklHX0VORElBTgotCi0jIE1vc3QgcmVsZWFzZXMgb2YgQUlYIDMuMSBpbmNsdWRlIGFuIGluY29ycmVjdCBpbnRlcm5hbCB2ZXJzaW9uIG9mIGNvcHlzaWduCi0jIGluIGxpYmMuYSBmb3IgdXNlIGJ5IHNvbWUgbGliYyBwdWJsaWMgZnVuY3Rpb25zIGluY2x1ZGluZyBtb2RmLiAgVGhlIHB1YmxpYwotIyB2ZXJzaW9uIG9mIGNvcHlzaWduIGluIGxpYm0uYSBpcyB1c2FibGUuICBGb3IgdGhlIHNha2Ugb2YgbGliZysrICh3aGljaAotIyB1c2VzIG1vZGYpLCB3ZSBhZGQgY29weXNpZ24gaGVyZS4gIFN1cHBvc2VkbHksIHRoaXMgcHJvYmxlbSBpcyBmaXhlZCBpbiBBSVgKLSMgMy4xLjggYW5kIGFib3ZlLCBpbmNsdWRpbmcgYWxsIHJlbGVhc2VzIG9mIEFJWCAzLjIuCi1FWFRSQV9PRklMRVMgPSBjb3B5c2lnbi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MgYi9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzVlN2QuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIEhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIEJlT1MKLQotIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIHdpbXB5IGRlZmF1bHQgNjRrIHN0YWNrCi0jIGxpbWl0IGluIEJlT1MgaXMgZWl0aGVyIGluY3JlYXNlZCBvciBtYWRlIHVzZXIgc2V0dGFibGUgc29tZWhvdy4KLSMgVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gdW50aWwgYWZ0ZXIgdGhlIERSOSByZWxlYXNlLgotCi1FWFRSQV9PRklMRVMgPSBhbGxvY2EubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NyBiL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjRiMDguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUhERUZJTkVTID0gLURIQVJSSVNfRkxPQVRfRk9STUFUCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWZic2QyMSBiL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzc1YTc4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPXZhc3ByaW50Zi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLW9wZW5lZGl0aW9uIGIvbGliaWJlcnR5L2NvbmZpZy9taC1vcGVuZWRpdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4ZTM1NC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLW9wZW5lZGl0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1IREVGSU5FUyA9IC1EX0FMTF9TT1VSQ0UKLUNDPWM4OQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MgYi9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjVmNzkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhUUkFfT0ZJTEVTPWFzcHJpbnRmLm8gc3RyY2FzZWNtcC5vIHN0cm5jYXNlY21wLm8gdmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUgYi9saWJpYmVydHkvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMmM4MjZkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1wZXhlY3V0ZS5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhcmdldC1zdWJkaXIgb3IgLS13aXRob3V0LXRhcmdldC1zdWJkaXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfdGFyZ2V0X3N1YmRpciIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jcm9zcy1ob3N0IG9yIC0td2l0aG91dC1jcm9zcy1ob3N0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcm9zc19ob3N0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2Nyb3NzX2hvc3QiCi0gIDoKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbmV3bGliIG9yIC0td2l0aG91dC1uZXdsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX25ld2xpYitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9uZXdsaWIiCi0gIDoKLWZpCi0KLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpcjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRsaWJpYmVydHlfdG9wZGlyICRzcmNkaXIvJGxpYmliZXJ0eV90b3BkaXIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkxOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyOTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncz0nLVcgLVdhbGwgLVd0cmFkaXRpb25hbCcKLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODU0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4NDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLQotCi0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyMjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci0KLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDA0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDIxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWZvciBhY19oZHIgaW4gc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwMzogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTEwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQpKHN0YXRfdmFsKSA+PiA4KQotI2VuZGlmCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotaW50IG1haW4oKSB7Ci1pbnQgczsKLXdhaXQgKCZzKTsKLXMgPSBXSUZFWElURUQgKHMpID8gV0VYSVRTVEFUVVMgKHMpIDogMTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKLUVPRgotCi1maQotCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5Ci0jIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCi1mdW5jcz0iYXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKLWZ1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIGJjbXAiCi1mdW5jcz0iJGZ1bmNzIGJjb3B5IgotZnVuY3M9IiRmdW5jcyBiemVybyIKLWZ1bmNzPSIkZnVuY3MgY2FsbG9jIgotZnVuY3M9IiRmdW5jcyBjbG9jayIKLWZ1bmNzPSIkZnVuY3MgZ2V0Y3dkIgotZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKLWZ1bmNzPSIkZnVuY3MgaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIGluc3F1ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtY2hyIgotZnVuY3M9IiRmdW5jcyBtZW1jbXAiCi1mdW5jcz0iJGZ1bmNzIG1lbWNweSIKLWZ1bmNzPSIkZnVuY3MgbWVtbW92ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtc2V0IgotZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKLWZ1bmNzPSIkZnVuY3MgcHV0ZW52IgotZnVuY3M9IiRmdW5jcyByYW5kb20iCi1mdW5jcz0iJGZ1bmNzIHJlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgcmluZGV4IgotZnVuY3M9IiRmdW5jcyBzZXRlbnYiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMgc2JyayBnZXR0aW1lb2ZkYXkiCi0KLSMgVGhlc2UgYXJlIG5laXRoZXIgZXhlY3V0ZWQgbm9yIHJlcXVpcmVkLCBidXQgdGhleSBoZWxwIGtlZXAKLSMgYXV0b2hlYWRlciBoYXBweSB3aXRob3V0IGFkZGluZyBhIGJ1bmNoIG9mIHRleHQgdG8gYWNjb25maWcuaC4KLWlmIHRlc3QgIngiID0gInkiOyB0aGVuCi0gIGZvciBhY19mdW5jIGluIGFzcHJpbnRmIGF0ZXhpdCBiYXNlbmFtZSBiY21wIGJjb3B5IGJ6ZXJvIGNhbGxvYyBjbG9jayBnZXRjd2QKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjgzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIG1lbXNldCBwdXRlbnYgcmFuZG9tIHJlbmFtZSByaW5kZXggc2lnc2V0bWFzayBzdHJjYXNlY21wCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzEwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc2V0ZW52IHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfU0lHTElTVCAxCi1FT0YKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDg3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc2JyayBnZXR0aW1lb2ZkYXkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NDI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotQ0hFQ0s9Ci1pZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0KLSAgIyBXZSBhcmUgYmVpbmcgY29uZmlndXJlZCBhcyBhIHRhcmdldCBsaWJyYXJ5LiAgQUNfUkVQTEFDRV9GVU5DUwotICAjIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgYmUgYWJsZSB0bwotICAjIGxpbmsgZXhlY3V0YWJsZXMuICBOb3RlIHRoYXQgd2UgbWF5IHN0aWxsIGJlIGJlaW5nIGNvbmZpZ3VyZWQKLSAgIyBuYXRpdmUuCi0KLSAgIyBJZiB3ZSBhcmUgYmVpbmcgY29uZmlndXJlZCBmb3IgbmV3bGliLCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucwotICAjIG5ld2xpYiBwcm92aWRlIGFuZCB3aGljaCBvbmVzIHdlIHdpbGwgYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4KLQotICBpZiB0ZXN0ICJ4JHt3aXRoX25ld2xpYn0iID0gInh5ZXMiOyB0aGVuCi0gICAgQUxMT0NBPSJhbGxvY2EubyIKLSAgICBMSUJPQkpTPSJhc3ByaW50Zi5vIGJhc2VuYW1lLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyZHVwLm8gdmFzcHJpbnRmLm8iCi0KLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQlhc3ByaW50ZiB8IGJhc2VuYW1lIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyZHVwIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotRU9GCi0KLQotICAgIHNldG9ianM9eWVzCi0KLSAgZmkKLQotZWxzZQotCi0gICAjIE5vdCBhIHRhcmdldCBsaWJyYXJ5LCBzbyB3ZSBzZXQgdGhpbmdzIHVwIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZS4KLSAgIENIRUNLPWNoZWNrLWNwbHVzLWRlbQotCi1maQotCi0KLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotdnh3b3JrcyopCi0gICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKLSAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCi0gICAgIyBzeXN0ZW0uCi0gICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQotCSAgOzsKLQlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRuIDEKLUVPRgotCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgVnhXb3JrcyBkb2Vzbid0IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgVnhXb3JrcyBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi1FT0YKLQotCi0gICAgc2V0b2Jqcz15ZXMKLSAgICA7OwotCi0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotY3lnd2luKikKLSAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KLSAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCi0gICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCi0gICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKLSAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAotICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgotCi0gICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQotICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCi0gICAgIyBtaXNzaW5nLgotCi0gICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKLSAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCi0gICAgOzsKLQotICAqLSotbWluZ3czMiopCi0gICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKLUVPRgotCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMQotRU9GCi0KLSAgICA7OwotCi0gICotKi11d2luKikKLSAgICAjIFVuZGVyIHNvbWUgdmVyc2lvbnMgb2YgdXdpbiwgdmZvcmsgaXMgbm90b3Jpb3VzbHkgYnVnZ3kgYW5kIHRoZSB0ZXN0IAotICAgICMgY2FuIGhhbmcgY29uZmlndXJlOyBvbiBvdGhlciB2ZXJzaW9ucywgdmZvcmsgZXhpc3RzIGp1c3QgYXMgYSBzdHViLgotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB2Zm9yayBpbiB1d2luJ3MgcnVudGltZSBpcyBmaXhlZC4KLSAgICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi0gICAgIyBVbmRlciB1d2luIDIuMCssIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MgKGFjdHVhbGx5LCB0aGVzZSBhcmUgaW1wb3J0ZWQgZnJvbSBhIERMTCwgYnV0IHRoZSBlbmQgZWZmZWN0IAotICAgICMgaXMgdGhlIHNhbWUpLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxNzYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzk0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi0gIGZvciBhY19mdW5jIGluICRmdW5jcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1MSUJPQkpTPSIkTElCT0JKUyAke2FjX2Z1bmN9LiR7YWNfb2JqZXh0fSIKLWZpCi1kb25lCi0KLQotCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1pbnRlcml4KQotICAgICMgT24gSW50ZXJpeCwgaXQgd3JvbmdseSBjb25jbHVkZXMgdGhhdCB0aGUgTVNWQyBjb21waWxlciBzdXBwb3J0cyBhbGxvY2EuCi0gICAgIyAoTVNWQyBkb2VzIG9uIFdpbjMyLCBub3Qgb24gSW50ZXJpeC4pCi0gICAgIyBUaGlzIHNob3VsZCBiZSB0ZW1wb3JhcnkuCi0KLSAgICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLSAgICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotICAgIEFMTE9DQT1hbGxvY2EubwotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gLTEKLUVPRgotICAgIDs7Ci0gICopCi0gICAgIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4ODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDk6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkxNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk3NDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA1OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLSAgICA7OwotICBlc2FjCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTE6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTU5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwaWRfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIxNTogY2hlY2tpbmcgZm9yIHBpZF90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3BpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlwaWRfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfcGlkX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3BpZF90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3BpZF90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHBpZF90IGludAotRU9GCi0KLWZpCi0KLWFjX3NhZmU9YGVjaG8gInZmb3JrLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNDk6IGNoZWNraW5nIGZvciB2Zm9yay5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDx2Zm9yay5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjU5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVkZPUktfSCAxCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjg0OiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9ya193b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB2Zm9yayIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MDogY2hlY2tpbmcgZm9yIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB2Zm9yaygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHZmb3JrKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfdmZvcmspIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3Zmb3JrKQotY2hva2UgbWUKLSNlbHNlCi12Zm9yaygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3Zmb3JrYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1hY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZGT1JLX0gKLSNpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwotICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4KLSAgIFRoZSBjb21waWxlciBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sCi0gICBidXQgc29tZSBjb21waWxlcnMgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4KLSAgIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYSBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRkcmVzcwotICAgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzIGNsb2JiZXJlZCBieSB0aGUgdmZvcmsuICAqLwotc3RhdGljCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSNlbHNlCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGFyZykgaW50IGFyZzsKLSNlbmRpZgotewotICBzdGF0aWMgcGlkX3QgY2hpbGQ7Ci0gIGlmICghY2hpbGQpIHsKLSAgICBjaGlsZCA9IHZmb3JrICgpOwotICAgIGlmIChjaGlsZCA8IDApIHsKLSAgICAgIHBlcnJvciAoInZmb3JrIik7Ci0gICAgICBfZXhpdCgyKTsKLSAgICB9Ci0gICAgaWYgKCFjaGlsZCkgewotICAgICAgYXJnID0gZ2V0cGlkKCk7Ci0gICAgICB3cml0ZSgtMSwgIiIsIDApOwotICAgICAgX2V4aXQgKGFyZyk7Ci0gICAgfQotICB9Ci19Ci1tYWluKCkgewotICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7Ci0gIHBpZF90IGNoaWxkOwotCi0gIHNwYXJjX2FkZHJlc3NfdGVzdCAoKTsKLQotICBjaGlsZCA9IHZmb3JrICgpOwotCi0gIGlmIChjaGlsZCA9PSAwKSB7Ci0gICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLgotICAgICAgIFRoaXMgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdAotICAgICAgIGFzIG1hbnkgbG9jYWwgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIKLSAgICAgICBpbmNsdWRpbmcgY29tcGlsZXIgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvcgotICAgICAgIGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4KLSAgICAgICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZCByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50Ci0gICAgICAgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLCBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQKLSAgICAgICBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZSBpbiB0aGlzIHJvdXRpbmUuCi0gICAgICAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMgbXVuZ2UgcGFyZW50Ci0gICAgICAgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLAotICAgICAgIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50IGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4KLSAgICAgICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEgZGVzY3JpcHRvciBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsCi0gICAgICAgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IgYXMgd2VsbC4KLSAgICAgICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICBleGl0KAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHZmb3JrIGZvcmsKLUVPRgotCi1maQotCi0gIGlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHZmb3JrLm8iCi0gIGZpCi0gIGZvciB2IGluICR2YXJzOyBkbwotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkdiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2MjogY2hlY2tpbmcgZm9yICR2IiA+JjUKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliaWJlcnR5X2N2X3Zhcl8kdicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotaW50ICpwOwotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50ICR2OyBwID0gJiR2OwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgICBmaQotICBkb25lCi0gIGZvciBhY19mdW5jIGluICRjaGVja2Z1bmNzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTAwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotCi0KLSMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBhY19saWJpYmVydHlfd2Fybl9jZmxhZ3NAJSRhY19saWJpYmVydHlfd2Fybl9jZmxhZ3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotL0Bob3N0X21ha2VmaWxlX2ZyYWdAL3IgJGhvc3RfbWFrZWZpbGVfZnJhZwotcyVAaG9zdF9tYWtlZmlsZV9mcmFnQCUlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQENIRUNLQCUkQ0hFQ0slZwotcyVATElCT0JKU0AlJExJQk9CSlMlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQElOU1RBTExfREVTVEAlJElOU1RBTExfREVTVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1zcmNkaXI9JHtzcmNkaXJ9Ci1ob3N0PSR7aG9zdH0KLXRhcmdldD0ke3RhcmdldH0KLXdpdGhfdGFyZ2V0X3N1YmRpcj0ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLXdpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfQotYWNfY29uZmlndXJlX2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7YWNfY29uZmlndXJlX2FyZ3N9IgotQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1saWJpYmVydHlfdG9wZGlyPSR7bGliaWJlcnR5X3RvcGRpcn0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbiBiL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWIyYzIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdAotCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQocGV4ZWN1dGUuYykKLQotZG5sIFdlIHVzZSB0aGVzZSBvcHRpb25zIHRvIGRlY2lkZSB3aGljaCBmdW5jdGlvbnMgdG8gaW5jbHVkZS4KLUFDX0FSR19XSVRIKHRhcmdldC1zdWJkaXIsCi1bICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeV0pCi1BQ19BUkdfV0lUSChjcm9zcy1ob3N0LAotWyAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyXSkKLUFDX0FSR19XSVRIKG5ld2xpYiwKLVsgIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliXSkKLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotQUNfQ09ORklHX0FVWF9ESVIoJGxpYmliZXJ0eV90b3BkaXIpCi0KLUFDX0NBTk9OSUNBTF9IT1NUCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UobGliaWJlcnR5LCAxLjApCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi0jIEZJWE1FOiBXZSB0ZW1wb3JhcmlseSBkZWZpbmUgb3VyIG93biB2ZXJzaW9uIG9mIEFDX1BST0dfQ0MuICBUaGlzIGlzCi0jIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIG5vdCBjYWxsIEFDX1BST0dfQ0NfV09SS1MuICBXZQotIyBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQotIyBsaW5rIGFuIGV4ZWN1dGFibGUuICBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgaW4gYXV0b2NvbmYKLSMgaXRzZWxmLgotCi1BQ19ERUZVTihMSUJfQUNfUFJPR19DQywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ1BQXSlkbmwKLUFDX1BST1ZJREUoW0FDX1BST0dfQ0NdKQotQUNfQ0hFQ0tfUFJPRyhDQywgZ2NjLCBnY2MpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIEFDX0NIRUNLX1BST0coQ0MsIGNjLCBjYywgLCAsIC91c3IvdWNiL2NjKQotICB0ZXN0IC16ICIkQ0MiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEhdKQotZmkKLQotQUNfUFJPR19DQ19HTlUKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotICBhY19saWJpYmVydHlfd2Fybl9jZmxhZ3M9Jy1XIC1XYWxsIC1XdHJhZGl0aW9uYWwnCi1kbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCi1kbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgQUNfUFJPR19DQ19HCi0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncz0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi1dKQotQUNfU1VCU1QoYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzKQotCi1MSUJfQUNfUFJPR19DQwotCi1BQ19JU0NfUE9TSVgKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgbGlidG9vbDoKLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLWRubCBBTV9ESVNBQkxFX1NIQVJFRAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgotZG5sIEFNX1BST0dfTElCVE9PTAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLUFDX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9NQUlOVEFJTkVSX01PREUKLWRubCBBQ19FWEVFWFQKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fUFJPR19JTlNUQUxMCi1BQ19QUk9HX0lOU1RBTEwKLQotLiAke3NyY2Rpcn0vY29uZmlnLnRhYmxlCi1ob3N0X21ha2VmaWxlX2ZyYWc9JHtmcmFnfQotQUNfU1VCU1RfRklMRShob3N0X21ha2VmaWxlX2ZyYWcpCi0KLSMgSXQncyBPSyB0byBjaGVjayBmb3IgaGVhZGVyIGZpbGVzLiAgQWx0aG91Z2ggdGhlIGNvbXBpbGVyIG1heSBub3QgYmUKLSMgYWJsZSB0byBsaW5rIGFueXRoaW5nLCBpdCBoYWQgYmV0dGVyIGJlIGFibGUgdG8gYXQgbGVhc3QgY29tcGlsZQotIyBzb21ldGhpbmcuCi1BQ19DSEVDS19IRUFERVJTKHN5cy9maWxlLmggc3lzL3BhcmFtLmggc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3RyaW5ncy5oIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmggc3lzL3N0YXQuaCkKLUFDX0hFQURFUl9TWVNfV0FJVAotCi0jIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaWYgdGhleQotIyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KLQotZnVuY3M9ImFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyBhdGV4aXQiCi1mdW5jcz0iJGZ1bmNzIGJhc2VuYW1lIgotZnVuY3M9IiRmdW5jcyBiY21wIgotZnVuY3M9IiRmdW5jcyBiY29weSIKLWZ1bmNzPSIkZnVuY3MgYnplcm8iCi1mdW5jcz0iJGZ1bmNzIGNhbGxvYyIKLWZ1bmNzPSIkZnVuY3MgY2xvY2siCi1mdW5jcz0iJGZ1bmNzIGdldGN3ZCIKLWZ1bmNzPSIkZnVuY3MgZ2V0cGFnZXNpemUiCi1mdW5jcz0iJGZ1bmNzIGluZGV4IgotZnVuY3M9IiRmdW5jcyBpbnNxdWUiCi1mdW5jcz0iJGZ1bmNzIG1lbWNociIKLWZ1bmNzPSIkZnVuY3MgbWVtY21wIgotZnVuY3M9IiRmdW5jcyBtZW1jcHkiCi1mdW5jcz0iJGZ1bmNzIG1lbW1vdmUiCi1mdW5jcz0iJGZ1bmNzIG1lbXNldCIKLWZ1bmNzPSIkZnVuY3MgbWtzdGVtcHMiCi1mdW5jcz0iJGZ1bmNzIHB1dGVudiIKLWZ1bmNzPSIkZnVuY3MgcmFuZG9tIgotZnVuY3M9IiRmdW5jcyByZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIHJpbmRleCIKLWZ1bmNzPSIkZnVuY3Mgc2V0ZW52IgotZnVuY3M9IiRmdW5jcyBzaWdzZXRtYXNrIgotZnVuY3M9IiRmdW5jcyBzdHJjYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cmR1cCIKLWZ1bmNzPSIkZnVuY3Mgc3RybmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cnJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnN0ciIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9kIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2wiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvdWwiCi1mdW5jcz0iJGZ1bmNzIHRtcG5hbSIKLWZ1bmNzPSIkZnVuY3MgdmFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2ZnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHdhaXRwaWQiCi0KLSMgQWxzbyBpbiB0aGUgb2xkIGZ1bmN0aW9uLmRlZiBmaWxlOiBhbGxvY2EsIHZmb3JrLCBnZXRvcHQuCi0KLXZhcnM9InN5c19lcnJsaXN0IHN5c19uZXJyIHN5c19zaWdsaXN0IgotCi1jaGVja2Z1bmNzPSJnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzIHNicmsgZ2V0dGltZW9mZGF5IgotCi0jIFRoZXNlIGFyZSBuZWl0aGVyIGV4ZWN1dGVkIG5vciByZXF1aXJlZCwgYnV0IHRoZXkgaGVscCBrZWVwCi0jIGF1dG9oZWFkZXIgaGFwcHkgd2l0aG91dCBhZGRpbmcgYSBidW5jaCBvZiB0ZXh0IHRvIGFjY29uZmlnLmguCi1pZiB0ZXN0ICJ4IiA9ICJ5IjsgdGhlbgotICBBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBhdGV4aXQgYmFzZW5hbWUgYmNtcCBiY29weSBiemVybyBjYWxsb2MgY2xvY2sgZ2V0Y3dkKQotICBBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZSkKLSAgQUNfQ0hFQ0tfRlVOQ1MobWVtc2V0IHB1dGVudiByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXApCi0gIEFDX0NIRUNLX0ZVTkNTKHNldGVudiBzdHJjaHIgc3RyZHVwIHN0cm5jYXNlY21wIHN0cnJjaHIgc3Ryc3RyIHN0cnRvZCBzdHJ0b2wpCi0gIEFDX0NIRUNLX0ZVTkNTKHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQpCi0gIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfTkVSUikKLSAgQUNfREVGSU5FKEhBVkVfU1lTX1NJR0xJU1QpCi0gIEFDX0NIRUNLX0ZVTkNTKGdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMpCi0gIEFDX0NIRUNLX0ZVTkNTKHNicmsgZ2V0dGltZW9mZGF5KQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotQ0hFQ0s9Ci1pZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0KLSAgIyBXZSBhcmUgYmVpbmcgY29uZmlndXJlZCBhcyBhIHRhcmdldCBsaWJyYXJ5LiAgQUNfUkVQTEFDRV9GVU5DUwotICAjIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgYmUgYWJsZSB0bwotICAjIGxpbmsgZXhlY3V0YWJsZXMuICBOb3RlIHRoYXQgd2UgbWF5IHN0aWxsIGJlIGJlaW5nIGNvbmZpZ3VyZWQKLSAgIyBuYXRpdmUuCi0KLSAgIyBJZiB3ZSBhcmUgYmVpbmcgY29uZmlndXJlZCBmb3IgbmV3bGliLCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucwotICAjIG5ld2xpYiBwcm92aWRlIGFuZCB3aGljaCBvbmVzIHdlIHdpbGwgYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4KLQotICBpZiB0ZXN0ICJ4JHt3aXRoX25ld2xpYn0iID0gInh5ZXMiOyB0aGVuCi0gICAgQUxMT0NBPSJhbGxvY2EubyIKLSAgICBMSUJPQkpTPSJhc3ByaW50Zi5vIGJhc2VuYW1lLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyZHVwLm8gdmFzcHJpbnRmLm8iCi0KLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQlhc3ByaW50ZiB8IGJhc2VuYW1lIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyZHVwIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIG5ld2xpYiBkb2VzbnQgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbnQgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIG5ld2xpYiBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBBQ19ERUZJTkUoSEFWRV9TVFJFUlJPUikKLQotICAgIHNldG9ianM9eWVzCi0KLSAgZmkKLQotZWxzZQotCi0gICAjIE5vdCBhIHRhcmdldCBsaWJyYXJ5LCBzbyB3ZSBzZXQgdGhpbmdzIHVwIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZS4KLSAgIENIRUNLPWNoZWNrLWNwbHVzLWRlbQotCi1maQotCi1BQ19TVUJTVChDSEVDSykKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotdnh3b3JrcyopCi0gICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKLSAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCi0gICAgIyBzeXN0ZW0uCi0gICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQotCSAgOzsKLQlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLSAgICA7OwotCi0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotY3lnd2luKikKLSAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KLSAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCi0gICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCi0gICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKLSAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAotICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgotCi0gICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQotICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCi0gICAgIyBtaXNzaW5nLgotCi0gICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKLSAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCi0gICAgOzsKLQotICAqLSotbWluZ3czMiopCi0gICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgotICAgIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICAgIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICAjIFVuZGVyIHV3aW4gMi4wKywgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0IGV4aXN0LCBidXQgdGhleSBhcmUKLSAgICAjIG1hY3JvcyAoYWN0dWFsbHksIHRoZXNlIGFyZSBpbXBvcnRlZCBmcm9tIGEgRExMLCBidXQgdGhlIGVuZCBlZmZlY3QgCi0gICAgIyBpcyB0aGUgc2FtZSksIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICBBQ19ERUZJTkUoSEFWRV9TWVNfTkVSUikKLSAgICBBQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKLSAgICA7OwotCi0gIGVzYWMKLQotICAjIFdlIGhhdmVuJ3Qgc2V0IHRoZSBsaXN0IG9mIG9iamVjdHMgeWV0LiAgVXNlIHRoZSBzdGFuZGFyZCBhdXRvY29uZgotICAjIHRlc3RzLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgY29tcGlsZXIgd29ya3MuCi0gIEFDX1BST0dfQ0NfV09SS1MKLSAgQUNfUkVQTEFDRV9GVU5DUygkZnVuY3MpCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWludGVyaXgpCi0gICAgIyBPbiBJbnRlcml4LCBpdCB3cm9uZ2x5IGNvbmNsdWRlcyB0aGF0IHRoZSBNU1ZDIGNvbXBpbGVyIHN1cHBvcnRzIGFsbG9jYS4KLSAgICAjIChNU1ZDIGRvZXMgb24gV2luMzIsIG5vdCBvbiBJbnRlcml4LikKLSAgICAjIFRoaXMgc2hvdWxkIGJlIHRlbXBvcmFyeS4KLQotICAgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotICAgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi0gICAgQUxMT0NBPWFsbG9jYS5vCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAtMQotRU9GCi0gICAgOzsKLSAgKikKLSAgICBBQ19GVU5DX0FMTE9DQQotICAgIDs7Ci0gIGVzYWMKLQotICBBQ19GVU5DX1ZGT1JLCi0gIGlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHZmb3JrLm8iCi0gIGZpCi0gIGZvciB2IGluICR2YXJzOyBkbwotICAgIEFDX01TR19DSEVDS0lORyhbZm9yICR2XSkKLSAgICBBQ19DQUNIRV9WQUwobGliaWJlcnR5X2N2X3Zhcl8kdiwKLSAgICAgIFtBQ19UUllfTElOSyhbaW50ICpwO10sIFtleHRlcm4gaW50ICR2OyBwID0gJiR2O10sCi0JCSAgIFtldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PXllcyJdLAotCQkgICBbZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj1ubyJdKV0pCi0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckbGliaWJlcnR5X2N2X3Zhcl8nJHZgXCIgPSB5ZXMiOyB0aGVuCi0gICAgICBBQ19NU0dfUkVTVUxUKHllcykKLSAgICAgIG49SEFWRV9gZWNobyAkdiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgICAgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfUkVTVUxUKG5vKQotICAgIGZpCi0gIGRvbmUKLSAgQUNfQ0hFQ0tfRlVOQ1MoJGNoZWNrZnVuY3MpCi1maQotCi0jIEluc3RhbGwgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggYSBjcm9zcyBjb21waWxlciBpbiAkKHRvb2xkaXIpIHJhdGhlcgotIyB0aGFuICQobGliZGlyKS4KLWlmIHRlc3QgLXogIiR7d2l0aF9jcm9zc19ob3N0fSI7IHRoZW4KLSAgSU5TVEFMTF9ERVNUPWxpYmRpcgotZWxzZQotICBJTlNUQUxMX0RFU1Q9dG9vbGRpcgotZmkKLUFDX1NVQlNUKElOU1RBTExfREVTVCkKLQotIyBXZSBuZWVkIG11bHRpbGliIHN1cHBvcnQsIGJ1dCBvbmx5IGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgdGFyZ2V0LgotQUNfT1VUUFVUKE1ha2VmaWxlIHRlc3RzdWl0ZS9NYWtlZmlsZSwKLVt0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpXSwKLXNyY2Rpcj0ke3NyY2Rpcn0KLWhvc3Q9JHtob3N0fQotdGFyZ2V0PSR7dGFyZ2V0fQotd2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQotd2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9Ci1hY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCi1DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWxpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQotKQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvcHlzaWduLmMgYi9saWJpYmVydHkvY29weXNpZ24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZjhjMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29weXNpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi0KLXR5cGVkZWYgdW5pb24gCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDo0OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OwotICAgIAotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDozOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gIH0gcGFydHM7Ci0gICAgbG9uZyBhc2xvbmdbMl07Ci19IF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotCi10eXBlZGVmIHVuaW9uIAotewotICBkb3VibGUgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotI2lmZGVmIF9fU01BTExfQklURklFTERTCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMzoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNDsKLSNlbHNlCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTozMjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjIwOwotI2VuZGlmCi0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50IDoxMTsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiAgICAgOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0jaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MzI7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDoxOTsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gIH0gcGFydHM7Ci0KLSAgbG9uZyBhc2xvbmdbMl07Ci0KLX0gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uCi17Ci0gIGZsb2F0IHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiA4OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTogMTY7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDo4OwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICB9IG5hbjsKLSAgbG9uZyBwMTsKLSAgCi19IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOwotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotdHlwZWRlZiB1bmlvbgotewotICBmbG9hdCB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjY7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ246MTsKLSAgfSBuYW47Ci0gIGxvbmcgcDE7Ci0gIAotfSBfX2llZWVfZmxvYXRfc2hhcGVfdHlwZTsKLSNlbmRpZgotCi0KLWRvdWJsZSBERUZVTihjb3B5c2lnbiwgKHgsIHkpLCBkb3VibGUgeCBBTkQgZG91YmxlIHkpCi17Ci0gIF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZSBhLGI7Ci0gIGIudmFsdWUgPSB5OyAgCi0gIGEudmFsdWUgPSB4OwotICBhLm51bWJlci5zaWduID1iLm51bWJlci5zaWduOwotICByZXR1cm4gYS52YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyBiL2xpYmliZXJ0eS9jcGx1cy1kZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyNDlkMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY3BsdXMtZGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0Njg5ICswLDAgQEAKLS8qIERlbWFuZ2xlciBmb3IgR05VIEMrKwotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEphbWVzIENsYXJrIChqamNAamNsYXJrLnV1Y3ApCi0gICBSZXdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkgZm9yIEFSTSBhbmQgTHVjaWQgZGVtYW5nbGluZwotICAgTW9kaWZpZWQgYnkgU2F0aXNoIFBhaSAocGFpQGFwb2xsby5ocC5jb20pIGZvciBIUCBkZW1hbmdsaW5nCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOyBjcGx1c19tYW5nbGVfb3BuYW1lIGFuZCBjcGx1c19kZW1hbmdsZS4KLQotICAgVGhpcyBmaWxlIGltcG9ydHMgeG1hbGxvYyBhbmQgeHJlYWxsb2MsIHdoaWNoIGFyZSBsaWtlIG1hbGxvYyBhbmQKLSAgIHJlYWxsb2MgZXhjZXB0IHRoYXQgdGhleSBnZW5lcmF0ZSBhIGZhdGFsIGVycm9yIGlmIHRoZXJlIGlzIG5vCi0gICBhdmFpbGFibGUgbWVtb3J5LiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGJvdGggR0NDIGFuZCBsaWJpYmVydHkuICBXaGVuIG1ha2luZyBjaGFuZ2VzLCBwbGVhc2UKLSAgIHRyeSBub3QgdG8gYnJlYWsgZWl0aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKiBtYWxsb2MgKCk7Ci1jaGFyICogcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSN1bmRlZiBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUKLSNkZWZpbmUgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFIHdvcmstPm9wdGlvbnMKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jZGVmaW5lIG1pbihYLFkpICgoKFgpIDwgKFkpKSA/IChYKSA6IChZKSkKLQotLyogQSB2YWx1ZSBhdCBsZWFzdCBvbmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gICB0aGF0IHdpbGwgYmUgb3V0cHV0IHdoZW4gdXNpbmcgdGhlIGAlZCcgZm9ybWF0IHdpdGggYHByaW50ZicuICAqLwotI2RlZmluZSBJTlRCVUZfU0laRSAzMgotCi1leHRlcm4gdm9pZCBmYW5jeV9hYm9ydCBQQVJBTVMgKCh2b2lkKSkgQVRUUklCVVRFX05PUkVUVVJOOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbXlzdHJzdHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbXlzdHJzdHIgKHMxLCBzMikKLSAgICAgY29uc3QgY2hhciAqczEsICpzMjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IHMxOwotICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuIChzMik7Ci0KLSAgZm9yICg7IChwID0gc3RyY2hyIChwLCAqczIpKSAhPSAwOyBwKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHAsIHMyLCBsZW4pID09IDApCi0JewotCSAgcmV0dXJuIChwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBJbiBvcmRlciB0byBhbGxvdyBhIHNpbmdsZSBkZW1hbmdsZXIgZXhlY3V0YWJsZSB0byBkZW1hbmdsZSBzdHJpbmdzCi0gICB1c2luZyB2YXJpb3VzIGNvbW1vbiB2YWx1ZXMgb2YgQ1BMVVNfTUFSS0VSLCBhcyB3ZWxsIGFzIGFueSBzcGVjaWZpYwotICAgb25lIHNldCBhdCBjb21waWxlIHRpbWUsIHdlIG1haW50YWluIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZQotICAgY29tbW9ubHkgdXNlZCBvbmVzLCBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZSBtYXJrZXIgd2UgYXJlIGxvb2tpbmcgZm9yCi0gICBpcyBpbiB0aGF0IHN0cmluZy4gIENQTFVTX01BUktFUiBpcyB1c3VhbGx5ICckJyBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICAgYXNzZW1ibGVyIGNhbiBkZWFsIHdpdGggdGhhdC4gIFdoZXJlIHRoZSBhc3NlbWJsZXIgY2FuJ3QsIGl0J3MgdXN1YWxseQotICAgJy4nIChidXQgb24gbWFueSBzeXN0ZW1zICcuJyBpcyB1c2VkIGZvciBvdGhlciB0aGluZ3MpLiAgV2UgcHV0IHRoZQotICAgY3VycmVudCBkZWZpbmVkIENQTFVTX01BUktFUiBmaXJzdCAod2hpY2ggZGVmYXVsdHMgdG8gJyQnKSwgZm9sbG93ZWQKLSAgIGJ5IHRoZSBuZXh0IG1vc3QgY29tbW9uIHZhbHVlLCBmb2xsb3dlZCBieSBhbiBleHBsaWNpdCAnJCcgaW4gY2FzZQotICAgdGhlIHZhbHVlIG9mIENQTFVTX01BUktFUiBpcyBub3QgJyQnLgotCi0gICBXZSBjb3VsZCBhdm9pZCB0aGlzIGlmIHdlIGNvdWxkIGp1c3QgZ2V0IGcrKyB0byB0ZWxsIHVzIHdoYXQgdGhlIGFjdHVhbAotICAgY3BsdXMgbWFya2VyIGNoYXJhY3RlciBpcyBhcyBwYXJ0IG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBieQotICAgZW5zdXJpbmcgdGhhdCBpdCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgdGVybWluYXRlcyB0aGUgZ2NjPG4+X2NvbXBpbGVkCi0gICBtYXJrZXIgc3ltYm9sIChGSVhNRSkuICAqLwotCi0jaWYgIWRlZmluZWQgKENQTFVTX01BUktFUikKLSNkZWZpbmUgQ1BMVVNfTUFSS0VSICckJwotI2VuZGlmCi0KLWVudW0gZGVtYW5nbGluZ19zdHlsZXMgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZ251X2RlbWFuZ2xpbmc7Ci0KLXN0YXRpYyBjaGFyIGNwbHVzX21hcmtlcnNbXSA9IHsgQ1BMVVNfTUFSS0VSLCAnLicsICckJywgJ1wwJyB9OwotCi1zdGF0aWMgY2hhciBjaGFyX3N0clsyXSA9IHsgJ1wwMDAnLCAnXDAwMCcgfTsKLQotdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgY3BsdXNfbWFya2Vyc1swXSA9IGNoOwotfQotCi10eXBlZGVmIHN0cnVjdCBzdHJpbmcJCS8qIEJld2FyZTogdGhlc2UgYXJlbid0IHJlcXVpcmVkIHRvIGJlICovCi17CQkJCS8qICAnXDAnIHRlcm1pbmF0ZWQuICAqLwotICBjaGFyICpiOwkJCS8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc3RyaW5nICovCi0gIGNoYXIgKnA7CQkJLyogcG9pbnRlciBhZnRlciBsYXN0IGNoYXJhY3RlciAqLwotICBjaGFyICplOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgZW5kIG9mIGFsbG9jYXRlZCBzcGFjZSAqLwotfSBzdHJpbmc7Ci0KLS8qIFN0dWZmIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gc3ViLXJvdXRpbmVzLgotICAgVXNpbmcgYSBzaGFyZWQgc3RydWN0dXJlIGFsbG93cyBjcGx1c19kZW1hbmdsZSB0byBiZSByZWVudHJhbnQuICAqLwotCi1zdHJ1Y3Qgd29ya19zdHVmZgotewotICBpbnQgb3B0aW9uczsKLSAgY2hhciAqKnR5cGV2ZWM7Ci0gIGNoYXIgKiprdHlwZXZlYzsKLSAgY2hhciAqKmJ0eXBldmVjOwotICBpbnQgbnVtazsKLSAgaW50IG51bWI7Ci0gIGludCBrc2l6ZTsKLSAgaW50IGJzaXplOwotICBpbnQgbnR5cGVzOwotICBpbnQgdHlwZXZlY19zaXplOwotICBpbnQgY29uc3RydWN0b3I7Ci0gIGludCBkZXN0cnVjdG9yOwotICBpbnQgc3RhdGljX3R5cGU7CS8qIEEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiAqLwotICBpbnQgdGVtcF9zdGFydDsgICAgICAgLyogaW5kZXggaW4gZGVtYW5nbGVkIHRvIHN0YXJ0IG9mIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaW50IHR5cGVfcXVhbHM7ICAgICAgIC8qIFRoZSB0eXBlIHF1YWxpZmllcnMuICAqLwotICBpbnQgZGxsaW1wb3J0ZWQ7CS8qIFN5bWJvbCBpbXBvcnRlZCBmcm9tIGEgUEUgRExMICovCi0gIGNoYXIgKip0bXBsX2FyZ3ZlYzsgICAvKiBUZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCi0gIGludCBudG1wbF9hcmdzOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KLSAgaW50IGZvcmdldHRpbmdfdHlwZXM7IC8qIE5vbnplcm8gaWYgd2UgYXJlIG5vdCByZW1lbWJlcmluZyB0aGUgdHlwZXMKLQkJCSAgIHdlIHNlZS4gICovCi0gIHN0cmluZyogcHJldmlvdXNfYXJndW1lbnQ7IC8qIFRoZSBsYXN0IGZ1bmN0aW9uIGFyZ3VtZW50IGRlbWFuZ2xlZC4gICovCi0gIGludCBucmVwZWF0czsgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcHJldmlvdXMKLQkJCSAgIGFyZ3VtZW50LiAgKi8KLX07Ci0KLSNkZWZpbmUgUFJJTlRfQU5TSV9RVUFMSUZJRVJTICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0FOU0kpCi0jZGVmaW5lIFBSSU5UX0FSR19UWVBFUyAgICAgICAod29yayAtPiBvcHRpb25zICYgRE1HTF9QQVJBTVMpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZQotewotICBjb25zdCBjaGFyICppbjsKLSAgY29uc3QgY2hhciAqb3V0OwotICBpbnQgZmxhZ3M7Ci19IG9wdGFibGVbXSA9IHsKLSAgeyJudyIsCSAgIiBuZXciLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLwotICB7ImRsIiwJICAiIGRlbGV0ZSIsCURNR0xfQU5TSX0sCS8qIG5ldyAoMS45MiwJIGFuc2kpICovCi0gIHsibmV3IiwJICAiIG5ldyIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KLSAgeyJkZWxldGUiLAkgICIgZGVsZXRlIiwJMH0sCQkvKiBvbGQgKDEuOTEsCSBhbmQgMS54KSAqLwotICB7InZuIiwJICAiIG5ldyBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCi0gIHsidmQiLAkgICIgZGVsZXRlIFtdIiwJRE1HTF9BTlNJfSwJLyogR05VLCBwZW5kaW5nIGFuc2kgKi8KLSAgeyJhcyIsCSAgIj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im5lIiwJICAiIT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLCBhbnNpICovCi0gIHsiZXEiLAkgICI9PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJnZSIsCSAgIj49IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imd0IiwJICAiPiIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJsZSIsCSAgIjw9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imx0IiwJICAiPCIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJwbHVzIiwJICAiKyIsCQkwfSwJCS8qIG9sZCAqLwotICB7InBsIiwJICAiKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXBsIiwJICAiKz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im1pbnVzIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1pIiwJICAiLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW1pIiwJICAiLT0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im11bHQiLAkgICIqIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWwiLAkgICIqIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbXUiLAkgICIqPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpIChBUk0vTHVjaWQpICovCi0gIHsiYW1sIiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoR05VL2crKykgKi8KLSAgeyJjb252ZXJ0IiwJICAiKyIsCQkwfSwJCS8qIG9sZCAodW5hcnkgKykgKi8KLSAgeyJuZWdhdGUiLAkgICItIiwJCTB9LAkJLyogb2xkICh1bmFyeSAtKSAqLwotICB7InRydW5jX21vZCIsCSAgIiUiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtZCIsCSAgIiUiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtZCIsCSAgIiU9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnVuY19kaXYiLAkgICIvIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZHYiLAkgICIvIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZHYiLAkgICIvPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfYW5kaWYiLCAiJiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhYSIsCSAgIiYmIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9vcmlmIiwgICJ8fCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9vIiwJICAifHwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX25vdCIsCSAgIiEiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJudCIsCSAgIiEiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InBvc3RpbmNyZW1lbnQiLCIrKyIsCTB9LAkJLyogb2xkICovCi0gIHsicHAiLAkgICIrKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsicG9zdGRlY3JlbWVudCIsIi0tIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbSIsCSAgIi0tIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfaW9yIiwJICAifCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9yIiwJICAifCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW9yIiwJICAifD0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF94b3IiLAkgICJeIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZXIiLAkgICJeIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZXIiLAkgICJePSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X2FuZCIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZCIsCSAgIiYiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFhZCIsCSAgIiY9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfbm90IiwJICAifiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNvIiwJICAifiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY2FsbCIsCSAgIigpIiwJCTB9LAkJLyogb2xkICovCi0gIHsiY2wiLAkgICIoKSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzaGlmdCIsCSAgIjw8IiwJCTB9LAkJLyogb2xkICovCi0gIHsibHMiLAkgICI8PCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzIiwJICAiPDw9IiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFyc2hpZnQiLAkgICI+PiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InJzIiwJICAiPj4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFycyIsCSAgIj4+PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb21wb25lbnQiLAkgICItPiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InB0IiwJICAiLT4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaTsgTHVjaWQgQysrIGZvcm0gKi8KLSAgeyJyZiIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEFSTS9HTlUgZm9ybSAqLwotICB7ImluZGlyZWN0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1ldGhvZF9jYWxsIiwgICItPigpIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZGRyIiwJICAiJiIsCQkwfSwJCS8qIG9sZCAodW5hcnkgJikgKi8KLSAgeyJhcnJheSIsCSAgIltdIiwJCTB9LAkJLyogb2xkICovCi0gIHsidmMiLAkgICJbXSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29tcG91bmQiLAkgICIsICIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNtIiwJICAiLCAiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbmQiLAkgICI/OiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNuIiwJICAiPzoiLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtYXgiLAkgICI+PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im14IiwJICAiPj8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtaW4iLAkgICI8PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1uIiwJICAiPD8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJub3AiLAkgICIiLAkJMH0sCQkvKiBvbGQgKGZvciBvcGVyYXRvcj0pICovCi0gIHsicm0iLAkgICItPioiLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsic3oiLCAgICAgICAgICAic2l6ZW9mICIsICAgIERNR0xfQU5TSX0gICAgICAvKiBwc2V1ZG8tYW5zaSAqLwotfTsKLQotLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSB2YXJpb3VzIHR5cGUgdmFyaWV0aWVzLgotICAgVGhleSBhcmUgYWxsIG5vbi16ZXJvIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhcyBgc3VjY2VzcycKLSAgIHZhbHVlcy4gICovCi10eXBlZGVmIGVudW0gdHlwZV9raW5kX3QKLXsKLSAgdGtfbm9uZSwKLSAgdGtfcG9pbnRlciwKLSAgdGtfcmVmZXJlbmNlLAotICB0a19pbnRlZ3JhbCwKLSAgdGtfYm9vbCwKLSAgdGtfY2hhciwKLSAgdGtfcmVhbAotfSB0eXBlX2tpbmRfdDsKLQotI2RlZmluZSBTVFJJTkdfRU1QVFkoc3RyKQkoKHN0cikgLT4gYiA9PSAoc3RyKSAtPiBwKQotI2RlZmluZSBQUkVQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKLSAgICBzdHJpbmdfcHJlcGVuZChzdHIsICIgIik7fQotI2RlZmluZSBBUFBFTkRfQkxBTksoc3RyKQl7aWYgKCFTVFJJTkdfRU1QVFkoc3RyKSkgXAotICAgIHN0cmluZ19hcHBlbmQoc3RyLCAiICIpO30KLSNkZWZpbmUgTEVOX1NUUklORyhzdHIpICAgICAgICAgKCAoU1RSSU5HX0VNUFRZKHN0cikpPzA6KChzdHIpLT5wIC0gKHN0ciktPmIpKQotCi0vKiBUaGUgc2NvcGUgc2VwYXJhdG9yIGFwcHJvcHJpYXRlIGZvciB0aGUgbGFuZ3VhZ2UgYmVpbmcgZGVtYW5nbGVkLiAgKi8KLQotI2RlZmluZSBTQ09QRV9TVFJJTkcod29yaykgKCh3b3JrLT5vcHRpb25zICYgRE1HTF9KQVZBKSA/ICIuIiA6ICI6OiIpCi0KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJJTkcgIl9fdnRibF9fIgkvKiBMdWNpZC9BUk0gdmlydHVhbCB0YWJsZSBwcmVmaXggKi8KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJMRU4gOAkJLyogc3RybGVuIChBUk1fVlRBQkxFX1NUUklORykgKi8KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBjaGFyICoKLW1vcF91cCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zcXVhbmdsZV9tb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi0jaWYgMAotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqCi1pbnRlcm5hbF9jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywKLQkJCQkJIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgIHN0cmluZyAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1hcm1fcHQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiosCi0JCWNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9xdWFsaWZpZWQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICAgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfZnVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9wcmVmaXggUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZ251X3NwZWNpYWwgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotYXJtX3NwZWNpYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19uZWVkIFBBUkFNUyAoKHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19kZWxldGUgUEFSQU1TICgoc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgUEFSQU1TICgoc3RyaW5nICopKTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSBQQVJBTVMgKChzdHJpbmcgKikpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIFBBUkFNUyAoKHN0cmluZyAqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kX3RlbXBsYXRlX2lkeCBQQVJBTVMgKChzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBpbnQgKikpOwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIFBBUkFNUyAoKGNvbnN0IGNoYXIqKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmKiwgY29uc3QgY2hhcioqLCBzdHJpbmcqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZG9fYXJnIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJCWNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9LdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwKLQkJCQkgICAgICBzdHJpbmcqLCB0eXBlX2tpbmRfdCkpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi0vKiBUaGVyZSBpcyBhIFRZUEVfUVVBTCB2YWx1ZSBmb3IgZWFjaCB0eXBlIHF1YWxpZmllci4gIFRoZXkgY2FuIGJlCi0gICBjb21iaW5lZCBieSBiaXR3aXNlLW9yIHRvIGZvcm0gdGhlIGNvbXBsZXRlIHNldCBvZiBxdWFsaWZpZXJzIGZvciBhCi0gICB0eXBlLiAgKi8KLQotI2RlZmluZSBUWVBFX1VOUVVBTElGSUVEICAgMHgwCi0jZGVmaW5lIFRZUEVfUVVBTF9DT05TVCAgICAweDEKLSNkZWZpbmUgVFlQRV9RVUFMX1ZPTEFUSUxFIDB4MgotI2RlZmluZSBUWVBFX1FVQUxfUkVTVFJJQ1QgMHg0Ci0KLXN0YXRpYyBpbnQKLWNvZGVfZm9yX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1xdWFsaWZpZXJfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfZXhwcmVzc2lvbiBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwgCi0JCQkgICAgIHR5cGVfa2luZF90KSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosCi0JCQkJIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3JlYWxfdmFsdWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBpbnQsCi0JCQkJICBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotcmVjdXJzaXZlbHlfZGVtYW5nbGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICAgICBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMgaW4gdGhlIHByb2Nlc3MuCi0gICBDb252ZXJzaW9uIHRlcm1pbmF0ZXMgb24gdGhlIGZpcnN0IG5vbi1kaWdpdCBjaGFyYWN0ZXIuCi0KLSAgIFRyeWluZyB0byBjb25zdW1lIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgY291bnQgcmVzdWx0cyBpbiBubwotICAgY29uc3VtcHRpb24gb2YgaW5wdXQgYW5kIGEgcmV0dXJuIG9mIC0xLgotCi0gICBPdmVyZmxvdyBjb25zdW1lcyB0aGUgcmVzdCBvZiB0aGUgZGlnaXRzLCBhbmQgcmV0dXJucyAtMS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnQgKHR5cGUpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotewotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotCi0gICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JIFdlIGFzc3VtZSB0aGF0IGNvdW50IGlzIHJlcHJlc2VudGVkIHVzaW5nIHR3bydzLWNvbXBsZW1lbnQ7Ci0JIG5vIHBvd2VyIG9mIHR3byBpcyBkaXZpc2libGUgYnkgdGVuLCBzbyBpZiBhbiBvdmVyZmxvdyBvY2N1cnMKLQkgd2hlbiBtdWx0aXBseWluZyBieSB0ZW4sIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgYSBtdWx0aXBsZSBvZgotCSB0ZW4uICAqLwotICAgICAgaWYgKChjb3VudCAlIDEwKSAhPSAwKQotCXsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKip0eXBlKSkKLQkgICAgKCp0eXBlKSsrOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgY291bnQgKz0gKip0eXBlIC0gJzAnOwotICAgICAgKCp0eXBlKSsrOwotICAgIH0KLQotICByZXR1cm4gKGNvdW50KTsKLX0KLQotCi0vKiBMaWtlIGNvbnN1bWVfY291bnQsIGJ1dCBmb3IgY291bnRzIHRoYXQgYXJlIHByZWNlZGVkIGFuZCBmb2xsb3dlZAotICAgYnkgJ18nIGlmIHRoZXkgYXJlIGdyZWF0ZXIgdGhhbiAxMC4gIEFsc28sIC0xIGlzIHJldHVybmVkIGZvcgotICAgZmFpbHVyZSwgc2luY2UgMCBjYW4gYmUgYSB2YWxpZCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci17Ci0gIGludCBpZHg7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkvKiBUaGUgdHJhaWxpbmcgdW5kZXJzY29yZSB3YXMgbWlzc2luZy4gKi8KLQlyZXR1cm4gLTE7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKiptYW5nbGVkIDwgJzAnIHx8ICoqbWFuZ2xlZCA+ICc5JykKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlkeCA9ICoqbWFuZ2xlZCAtICcwJzsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQyBpcyB0aGUgY29kZSBmb3IgYSB0eXBlLXF1YWxpZmllci4gIFJldHVybiB0aGUgVFlQRV9RVUFMCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcXVhbGlmaWVyLiAgKi8KLQotc3RhdGljIGludAotY29kZV9mb3JfcXVhbGlmaWVyIChjKQotICBpbnQgYzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdDJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfQ09OU1Q7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfVk9MQVRJTEU7Ci0KLSAgICBjYXNlICd1JzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfUkVTVFJJQ1Q7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1YWxpZmllcnMgZ2l2ZW4gYnkKLSAgIFRZUEVfUVVBTFMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLXF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpCi0gICAgIGludCB0eXBlX3F1YWxzOwotewotICBzd2l0Y2ggKHR5cGVfcXVhbHMpCi0gICAgewotICAgIGNhc2UgVFlQRV9VTlFVQUxJRklFRDoKLSAgICAgIHJldHVybiAiIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUOgotICAgICAgcmV0dXJuICJjb25zdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRToKLSAgICAgIHJldHVybiAidm9sYXRpbGUiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gIl9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gImNvbnN0IHZvbGF0aWxlIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJ2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVFlQRV9RVUFMUyB3YXMgYW4gaW52YWxpZCBxdWFsaWZpZXIgc2V0LiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIHN0cmluZwotICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUKLSAgIGNhbGxlZCB3aXRoIGEgdmFsaWQgcXVhbGlmaWVyIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciAoYykKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBxdWFsaWZpZXJfc3RyaW5nIChjb2RlX2Zvcl9xdWFsaWZpZXIgKGMpKTsKLX0KLQotaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgKG9wbmFtZSwgcmVzdWx0LCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIGludCBsZW4sIGxlbjEsIHJldDsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cnVjdCB3b3JrX3N0dWZmIHdvcmtbMV07Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBsZW4gPSBzdHJsZW4ob3BuYW1lKTsKLSAgcmVzdWx0WzBdID0gJ1wwJzsKLSAgcmV0ID0gMDsKLSAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKLSAgd29yay0+b3B0aW9ucyA9IG9wdGlvbnM7Ci0KLSAgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJwotICAgICAgJiYgb3BuYW1lWzJdID09ICdvJyAmJiBvcG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIC8qIEFOU0kuICAqLwotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAob3BuYW1lWzBdID09ICdfJyAmJiBvcG5hbWVbMV0gPT0gJ18nCi0JICAgJiYgb3BuYW1lWzJdID49ICdhJyAmJiBvcG5hbWVbMl0gPD0gJ3onCi0JICAgJiYgb3BuYW1lWzNdID49ICdhJyAmJiBvcG5hbWVbM10gPD0gJ3onKQotICAgIHsKLSAgICAgIGlmIChvcG5hbWVbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3BuYW1lWzJdID09ICdhJyAmJiBvcG5hbWVbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgcmV0ID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSAzCi0JICAgJiYgb3BuYW1lWzBdID09ICdvJwotCSAgICYmIG9wbmFtZVsxXSA9PSAncCcKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChsZW4gPj0gMTAgLyogb3AkYXNzaWduXyAqLwotCSAgJiYgbWVtY21wIChvcG5hbWUgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGxlbjEgPSBsZW4gLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4xCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAxMCwgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmNhdCAocmVzdWx0LCAiPSIpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgbGVuMSA9IGxlbiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMywgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSA1ICYmIG1lbWNtcCAob3BuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVs0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDU7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIHJldDsKLQotfQotLyogVGFrZXMgb3BlcmF0b3IgbmFtZSBhcyBlLmcuICIrKyIgYW5kIHJldHVybnMgbWFuZ2xlZAotICAgb3BlcmF0b3IgbmFtZSAoZS5nLiAicG9zdGluY3JlbWVudF9leHByIiksIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotCi0gICBJZiBPUFRJT05TICYgRE1HTF9BTlNJID09IDEsIHJldHVybiB0aGUgQU5TSSBuYW1lOwotICAgaWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAwLCByZXR1cm4gdGhlIG9sZCBHTlUgbmFtZS4gICovCi0KLWNvbnN0IGNoYXIgKgotY3BsdXNfbWFuZ2xlX29wbmFtZSAob3BuYW1lLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGludCBvcHRpb25zOwotewotICBzaXplX3QgaTsKLSAgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKG9wbmFtZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotICAgIHsKLSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0ub3V0KSA9PSBsZW4KLQkgICYmIChvcHRpb25zICYgRE1HTF9BTlNJKSA9PSAob3B0YWJsZVtpXS5mbGFncyAmIERNR0xfQU5TSSkKLQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5vdXQsIG9wbmFtZSwgbGVuKSA9PSAwKQotCXJldHVybiBvcHRhYmxlW2ldLmluOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogY2hhciAqY3BsdXNfZGVtYW5nbGUgKGNvbnN0IGNoYXIgKm1hbmdsZWQsIGludCBvcHRpb25zKQotCi0gICBJZiBNQU5HTEVEIGlzIGEgbWFuZ2xlZCBmdW5jdGlvbiBuYW1lIHByb2R1Y2VkIGJ5IEdOVSBDKyssIHRoZW4KLSAgIGEgcG9pbnRlciB0byBhIG1hbGxvY2VkIHN0cmluZyBnaXZpbmcgYSBDKysgcmVwcmVzZW50YXRpb24KLSAgIG9mIHRoZSBuYW1lIHdpbGwgYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCi0gICBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgc3RyaW5nIHdoaWNoCi0gICBpcyByZXR1cm5lZC4KLQotICAgVGhlIE9QVElPTlMgYXJnIG1heSBjb250YWluIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYml0czoKLQotICAgCURNR0xfQU5TSQlBTlNJIHF1YWxpZmllcnMgc3VjaCBhcyBgY29uc3QnIGFuZCBgdm9pZCcgYXJlCi0JCQlpbmNsdWRlZC4KLQlETUdMX1BBUkFNUwlGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZC4KLQotICAgRm9yIGV4YW1wbGUsCi0KLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oaW50KSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSkJPT4gIkE6OmZvbyhpbnQpIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIDApCQkJPT4gIkE6OmZvbyIKLQotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpPT4gIkE6OmZvbyhmbG9hdCwuLi4pIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCAwKQkJCT0+ICJBOjpmb28iCi0KLSAgIE5vdGUgdGhhdCBhbnkgbGVhZGluZyB1bmRlcnNjb3Jlcywgb3Igb3RoZXIgc3VjaCBjaGFyYWN0ZXJzIHByZXBlbmRlZCBieQotICAgdGhlIGNvbXBpbGF0aW9uIHN5c3RlbSwgYXJlIHByZXN1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHN0cmlwcGVkIGZyb20KLSAgIE1BTkdMRUQuICAqLwotCi1jaGFyICoKLWNwbHVzX2RlbWFuZ2xlIChtYW5nbGVkLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgY2hhciAqcmV0OwotICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOwotICBtZW1zZXQgKChjaGFyICopIHdvcmssIDAsIHNpemVvZiAod29yaykpOwotICB3b3JrIC0+IG9wdGlvbnMgPSBvcHRpb25zOwotICBpZiAoKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfU1RZTEVfTUFTSykgPT0gMCkKLSAgICB3b3JrIC0+IG9wdGlvbnMgfD0gKGludCkgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlICYgRE1HTF9TVFlMRV9NQVNLOwotCi0gIHJldCA9IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKTsKLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIChyZXQpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbW9zdCBvZiB3aGF0IGNwbHVzX2RlbWFuZ2xlIHVzZSB0byBkbywgYnV0Ci0gICB0byBiZSBhYmxlIHRvIGRlbWFuZ2xlIGEgbmFtZSB3aXRoIGEgQiwgSyBvciBuIGNvZGUsIHdlIG5lZWQgdG8KLSAgIGhhdmUgYSBsb25nZXIgdGVybSBtZW1vcnkgb2Ygd2hhdCB0eXBlcyBoYXZlIGJlZW4gc2Vlbi4gVGhlIG9yaWdpbmFsCi0gICBub3cgaW50aWFsaXplcyBhbmQgY2xlYW5zIHVwIHRoZSBzcXVhbmdsZSBjb2RlIGluZm8sIHdoaWxlIGludGVybmFsCi0gICBjYWxscyBnbyBkaXJlY3RseSB0byB0aGlzIHJvdXRpbmUgdG8gYXZvaWQgcmVzZXR0aW5nIHRoYXQgaW5mby4gKi8KLQotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssIG1hbmdsZWQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotewotCi0gIHN0cmluZyBkZWNsOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0gIGludCBzMSxzMixzMyxzNDsKLSAgczEgPSB3b3JrLT5jb25zdHJ1Y3RvcjsKLSAgczIgPSB3b3JrLT5kZXN0cnVjdG9yOwotICBzMyA9IHdvcmstPnN0YXRpY190eXBlOwotICBzNCA9IHdvcmstPnR5cGVfcXVhbHM7Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gIHdvcmstPnR5cGVfcXVhbHMgPSBUWVBFX1VOUVVBTElGSUVEOwotICB3b3JrLT5kbGxpbXBvcnRlZCA9IDA7Ci0KLSAgaWYgKChtYW5nbGVkICE9IE5VTEwpICYmICgqbWFuZ2xlZCAhPSAnXDAnKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgZ251IHN0eWxlIGRlbWFuZ2xpbmcgaXMgYWN0aXZlIGFuZCBpZiB0aGUKLQkgc3RyaW5nIHRvIGJlIGRlbWFuZ2xlZCBjb250YWlucyBhIENQTFVTX01BUktFUi4gIElmIHNvLCBhdHRlbXB0IHRvCi0JIHJlY29nbml6ZSBvbmUgb2YgdGhlIGdudSBzcGVjaWFsIGZvcm1zIHJhdGhlciB0aGFuIGxvb2tpbmcgZm9yIGEKLQkgc3RhbmRhcmQgcHJlZml4LiAgSW4gcGFydGljdWxhciwgZG9uJ3Qgd29ycnkgYWJvdXQgd2hldGhlciB0aGVyZQotCSBpcyBhICJfXyIgc3RyaW5nIGluIHRoZSBtYW5nbGVkIHN0cmluZy4gIENvbnNpZGVyICJfJF81X19mb28iIGZvcgotCSBleGFtcGxlLiAgKi8KLQotICAgICAgaWYgKChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpKQotCXsKLQkgIHN1Y2Nlc3MgPSBnbnVfc3BlY2lhbCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoIXN1Y2Nlc3MpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3ByZWZpeCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAod29yay0+Y29uc3RydWN0b3IgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImdsb2JhbCBjb25zdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAwOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICh3b3JrLT5kZXN0cnVjdG9yID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgZGVzdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdvcmstPmRsbGltcG9ydGVkID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJpbXBvcnQgc3R1YiBmb3IgIik7Ci0gICAgICAgICAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOwotICAgICAgICB9Ci0gICAgICBkZW1hbmdsZWQgPSBtb3BfdXAgKHdvcmssICZkZWNsLCBzdWNjZXNzKTsKLSAgICB9Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gczE7Ci0gIHdvcmstPmRlc3RydWN0b3IgPSBzMjsKLSAgd29yay0+c3RhdGljX3R5cGUgPSBzMzsKLSAgd29yay0+dHlwZV9xdWFscyA9IHM0OwotICByZXR1cm4gKGRlbWFuZ2xlZCk7Ci19Ci0KLQotLyogQ2xlYXIgb3V0IGFuZCBzcXVhbmdsaW5nIHJlbGF0ZWQgc3RvcmFnZSAqLwotc3RhdGljIHZvaWQKLXNxdWFuZ2xlX21vcF91cCAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIC8qIGNsZWFuIHVwIHRoZSBCIGFuZCBLIHR5cGUgbWFuZ2xpbmcgdHlwZXMuICovCi0gIGZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKTsKLSAgaWYgKHdvcmsgLT4gYnR5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IGJ0eXBldmVjKTsKLSAgICB9Ci0gIGlmICh3b3JrIC0+IGt0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBrdHlwZXZlYyk7Ci0gICAgfQotfQotCi0vKiBDbGVhciBvdXQgYW55IG1hbmdsZWQgc3RvcmFnZSAqLwotCi1zdGF0aWMgY2hhciAqCi1tb3BfdXAgKHdvcmssIGRlY2xwLCBzdWNjZXNzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgaW50IHN1Y2Nlc3M7Ci17Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0KLSAgLyogRGlzY2FyZCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgaWYgYW55LiAgKi8KLQotICBmb3JnZXRfdHlwZXMgKHdvcmspOwotICBpZiAod29yayAtPiB0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiB0eXBldmVjKTsKLSAgICAgIHdvcmsgLT4gdHlwZXZlYyA9IE5VTEw7Ci0gICAgICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JrLT5udG1wbF9hcmdzOyBpKyspCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjW2ldKQotCSAgZnJlZSAoKGNoYXIqKSB3b3JrLT50bXBsX2FyZ3ZlY1tpXSk7Ci0KLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWMpOwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSBOVUxMOwotICAgIH0KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHsKLSAgICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiBkZW1hbmdsaW5nIHdhcyBzdWNjZXNzZnVsLCBlbnN1cmUgdGhhdCB0aGUgZGVtYW5nbGVkIHN0cmluZyBpcyBudWxsCi0gICAgIHRlcm1pbmF0ZWQgYW5kIHJldHVybiBpdC4gIE90aGVyd2lzZSwgZnJlZSB0aGUgZGVtYW5nbGluZyBkZWNsLiAgKi8KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgewotICAgICAgc3RyaW5nX2RlbGV0ZSAoZGVjbHApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgIiIsIDEpOwotICAgICAgZGVtYW5nbGVkID0gZGVjbHAgLT4gYjsKLSAgICB9Ci0gIHJldHVybiAoZGVtYW5nbGVkKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3NpZ25hdHVyZSAtLSBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBhcnQgb2YgYSBtYW5nbGVkIG5hbWUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9zaWduYXR1cmUgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBzaWduYXR1cmUgcG9ydGlvbiBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgaXMgdGhlIHN0cmluZyB3aGVyZSBkZW1hbmdsZWQgb3V0cHV0IGlzIGJlaW5nIGJ1aWx0LiAgQXQKLQllbnRyeSBpdCBjb250YWlucyB0aGUgZGVtYW5nbGVkIHJvb3QgbmFtZSBmcm9tIHRoZSBtYW5nbGVkIG5hbWUKLQlwcmVmaXguICBJLkUuIGVpdGhlciBhIGRlbWFuZ2xlZCBvcGVyYXRvciBuYW1lIG9yIHRoZSByb290IGZ1bmN0aW9uCi0JbmFtZS4gIEluIHNvbWUgc3BlY2lhbCBjYXNlcywgaXQgbWF5IGNvbnRhaW4gbm90aGluZy4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB1bmNvbnN1bWVkIGxvY2F0aW9uIGluIHRoZSBtYW5nbGVkCi0JbmFtZS4gIEFzIHRva2VucyBhcmUgY29uc3VtZWQgYW5kIGRlbWFuZ2xpbmcgaXMgcGVyZm9ybWVkLCB0aGUKLQlwb2ludGVyIGlzIHVwZGF0ZWQgdG8gY29udGludW91c2x5IHBvaW50IGF0IHRoZSBuZXh0IHRva2VuIHRvCi0JYmUgY29uc3VtZWQuCi0KLQlEZW1hbmdsaW5nIEdOVSBzdHlsZSBtYW5nbGVkIG5hbWVzIGlzIG5hc3R5IGJlY2F1c2UgdGhlcmUgaXMgbm8KLQlleHBsaWNpdCB0b2tlbiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JYXJndW1lbnQgbGlzdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBpbnQgZnVuY19kb25lID0gMDsKLSAgaW50IGV4cGVjdF9mdW5jID0gMDsKLSAgaW50IGV4cGVjdF9yZXR1cm5fdHlwZSA9IDA7Ci0gIGNvbnN0IGNoYXIgKm9sZG1hbmdsZWQgPSBOVUxMOwotICBzdHJpbmcgdHJhd25hbWU7Ci0gIHN0cmluZyB0bmFtZTsKLQotICB3aGlsZSAoc3VjY2VzcyAmJiAoKiptYW5nbGVkICE9ICdcMCcpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotICAgICAgICBjYXNlICdLJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICAgIH0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoKLQkgIC8qIFN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdvcmsgLT4gc3RhdGljX3R5cGUgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIHdvcmstPnR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCi0JICAvKiBhIHF1YWxpZmllZCBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6Ci0JICAvKiBMb2NhbCBjbGFzcyBuYW1lIGZvbGxvd3MgYWZ0ZXIgIkxubm5fIiAqLwotCSAgaWYgKEhQX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKiptYW5nbGVkICYmICgqKm1hbmdsZWQgIT0gJ18nKSkKLQkJKCptYW5nbGVkKSsrOwotCSAgICAgIGlmICghKiptYW5nbGVkKQotCQlzdWNjZXNzID0gMDsKLQkgICAgICBlbHNlCi0JCSgqbWFuZ2xlZCkrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLSAgICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gLTE7IC8qIHVwcGVybW9zdCBjYWxsIHRvIGRlbWFuZ2xlX2NsYXNzICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgICAgfQotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotICAgICAgICAgICAgICAvKiBFREcgYW5kIG90aGVycyB3aWxsIGhhdmUgdGhlICJGIiwgc28gd2UgbGV0IHRoZSBsb29wIGN5Y2xlCi0gICAgICAgICAgICAgICAgIGlmIHdlIGFyZSBsb29raW5nIGF0IG9uZS4gKi8KLSAgICAgICAgICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnRicpCi0gICAgICAgICAgICAgICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgICAgfQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgewotCSAgICBzdHJpbmcgczsKLQkgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZzKTsKLQkgICAgaWYgKHN1Y2Nlc3MpCi0JICAgICAgewotCQlzdHJpbmdfYXBwZW5kICgmcywgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JCXN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZzKTsKLQkgICAgICB9Ci0JICAgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgLyogRnVuY3Rpb24gKi8KLQkgIC8qIEFSTS9IUCBzdHlsZSBkZW1hbmdsaW5nIGluY2x1ZGVzIGEgc3BlY2lmaWMgJ0YnIGNoYXJhY3RlciBhZnRlcgotCSAgICAgdGhlIGNsYXNzIG5hbWUuICBGb3IgR05VIHN0eWxlLCBpdCBpcyBqdXN0IGltcGxpZWQuICBTbyB3ZSBjYW4KLQkgICAgIHNhZmVseSBqdXN0IGNvbnN1bWUgYW55ICdGJyBhdCB0aGlzIHBvaW50IGFuZCBiZSBjb21wYXRpYmxlCi0JICAgICB3aXRoIGVpdGhlciBzdHlsZS4gICovCi0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgZnVuY19kb25lID0gMTsKLQkgICgqbWFuZ2xlZCkrKzsKLQotCSAgLyogRm9yIGx1Y2lkL0FSTS9IUCBzdHlsZSB3ZSBoYXZlIHRvIGZvcmdldCBhbnkgdHlwZXMgd2UgbWlnaHQKLQkgICAgIGhhdmUgcmVtZW1iZXJlZCB1cCB0byB0aGlzIHBvaW50LCBzaW5jZSB0aGV5IHdlcmUgbm90IGFyZ3VtZW50Ci0JICAgICB0eXBlcy4gIEdOVSBzdHlsZSBjb25zaWRlcnMgYWxsIHR5cGVzIHNlZW4gYXMgYXZhaWxhYmxlIGZvcgotCSAgICAgYmFjayByZWZlcmVuY2VzLiAgU2VlIGNvbW1lbnQgaW4gZGVtYW5nbGVfYXJncygpICovCi0KLQkgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBmb3JnZXRfdHlwZXMgKHdvcmspOwotCSAgICB9Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIKLQkgICAgIGZpbmQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZQotCSAgICAgZW5kIG9mIHRoZSBzdHJpbmcuICovCi0JICBpZiAoc3VjY2VzcyAmJiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiAqKm1hbmdsZWQgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKysoKm1hbmdsZWQpOwotICAgICAgICAgICAgICAvKiBBdCB0aGlzIGxldmVsLCB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuIHR5cGUuICovCi0gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdG5hbWUpOwotICAgICAgICAgICAgICBzdHJpbmdfZGVsZXRlICgmdG5hbWUpOwotICAgICAgICAgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgLyogRysrIFRlbXBsYXRlICovCi0JICBzdHJpbmdfaW5pdCgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2luaXQoJnRuYW1lKTsKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lLAotCQkJCSAgICAgICAmdHJhd25hbWUsIDEsIDEpOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kICgmdG5hbWUsIFNDT1BFX1NUUklORyAod29yaykpOwotCi0JICBzdHJpbmdfcHJlcGVuZHMoZGVjbHAsICZ0bmFtZSk7Ci0JICBpZiAod29yayAtPiBkZXN0cnVjdG9yICYgMSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmdHJhd25hbWUsICJ+Iik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgaWYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0cmF3bmFtZSk7Ci0JICAgICAgd29yay0+Y29uc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgc3RyaW5nX2RlbGV0ZSgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2RlbGV0ZSgmdG5hbWUpOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBleHBlY3RfZnVuYyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ18nOgotCSAgaWYgKEdOVV9ERU1BTkdMSU5HICYmIGV4cGVjdF9yZXR1cm5fdHlwZSkKLQkgICAgewotCSAgICAgIC8qIFJlYWQgdGhlIHJldHVybiB0eXBlLiAqLwotCSAgICAgIHN0cmluZyByZXR1cm5fdHlwZTsKLQkgICAgICBzdHJpbmdfaW5pdCAoJnJldHVybl90eXBlKTsKLQotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnJldHVybl90eXBlKTsKLQkgICAgICBBUFBFTkRfQkxBTksgKCZyZXR1cm5fdHlwZSk7Ci0KLQkgICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcmV0dXJuX3R5cGUpOwotCSAgICAgIHN0cmluZ19kZWxldGUgKCZyZXR1cm5fdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogQXQgdGhlIG91dGVybW9zdCBsZXZlbCwgd2UgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSBzcGVjaWZpZWQsCi0JICAgICAgIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UgYXJlIGRlYWxpbmcgd2l0aAotCSAgICAgICBhIG1hbmdsZWQgbmFtZSB0aGF0IGlzIGVpdGhlciBib2d1cywgb3IgaGFzIGJlZW4gbWFuZ2xlZCBieQotCSAgICAgICBzb21lIGFsZ29yaXRobSB3ZSBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGguICBTbyBqdXN0Ci0JICAgICAgIHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotICAgICAgICAgICAgLyogSG93ZXZlciwgIl9ubm4iIGlzIGFuIGV4cGVjdGVkIHN1ZmZpeCBmb3IgYWx0ZXJuYXRlIGVudHJ5IHBvaW50Ci0gICAgICAgICAgICAgICBudW1iZXJlZCBubm4gZm9yIGEgZnVuY3Rpb24sIHdpdGggSFAgYUNDLCBzbyBza2lwIG92ZXIgdGhhdAotICAgICAgICAgICAgICAgd2l0aG91dCByZXBvcnRpbmcgZmFpbHVyZS4gcGFpLzE5OTctMDktMDQgKi8KLSAgICAgICAgICAgIGlmIChIUF9ERU1BTkdMSU5HKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIHdoaWxlICgqKm1hbmdsZWQgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdIJzoKLQkgIGlmIChHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIC8qIEEgRysrIHRlbXBsYXRlIGZ1bmN0aW9uLiAgUmVhZCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLiAqLwotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDAsCi0JCQkJCSAgIDApOwotCSAgICAgIGlmICghKHdvcmstPmNvbnN0cnVjdG9yICYgMSkpCi0JCWV4cGVjdF9yZXR1cm5fdHlwZSA9IDE7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCSAgICB7O30KLQotCWRlZmF1bHQ6Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgLyogQXNzdW1lIHdlIGhhdmUgc3R1bWJsZWQgb250byB0aGUgZmlyc3Qgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JCSBhcmd1bWVudCB0b2tlbiwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgYXJncy4gICovCi0JICAgICAgZnVuY19kb25lID0gMTsKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBOb24tR05VIGRlbWFuZ2xlcnMgdXNlIGEgc3BlY2lmaWMgdG9rZW4gdG8gbWFyayB0aGUgc3RhcnQKLQkJIG9mIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24gYXJndW1lbnQgdG9rZW5zLiAgVHlwaWNhbGx5ICdGJywKLQkJIGZvciBBUk0vSFAtZGVtYW5nbGluZywgZm9yIGV4YW1wbGUuICBTbyBpZiB3ZSBmaW5kIHNvbWV0aGluZwotCQkgd2UgYXJlIG5vdCBwcmVwYXJlZCBmb3IsIGl0IG11c3QgYmUgYW4gZXJyb3IuICAqLwotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKgotCWlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JKi8KLSAgICAgIHsKLQlpZiAoc3VjY2VzcyAmJiBleHBlY3RfZnVuYykKLQkgIHsKLQkgICAgZnVuY19kb25lID0gMTsKLSAgICAgICAgICAgICAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAgIC8qIFNpbmNlIHRlbXBsYXRlIGluY2x1ZGUgdGhlIG1hbmdsaW5nIG9mIHRoZWlyIHJldHVybiB0eXBlcywKLQkgICAgICAgd2UgbXVzdCBzZXQgZXhwZWN0X2Z1bmMgdG8gMCBzbyB0aGF0IHdlIGRvbid0IHRyeSBkbwotCSAgICAgICBkZW1hbmdsZSBtb3JlIGFyZ3VtZW50cyB0aGUgbmV4dCB0aW1lIHdlIGdldCBoZXJlLiAgKi8KLQkgICAgZXhwZWN0X2Z1bmMgPSAwOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgIWZ1bmNfZG9uZSkKLSAgICB7Ci0gICAgICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCXsKLQkgIC8qIFdpdGggR05VIHN0eWxlIGRlbWFuZ2xpbmcsIGJhcl9fM2ZvbyBpcyAnZm9vOjpiYXIodm9pZCknLCBhbmQKLQkgICAgIGJhcl9fM2Zvb2kgaXMgJ2Zvbzo6YmFyKGludCknLiAgV2UgZ2V0IGhlcmUgd2hlbiB3ZSBmaW5kIHRoZQotCSAgICAgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQgdG8KLQkgICAgIHRoZSBjdXJyZW50IGRlY2xwLiAgTm90ZSB0aGF0IHdpdGggQVJNL0hQLCB0aGUgZmlyc3QgY2FzZQotCSAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlciAnZm9vOjpiYXInLAotCSAgICAgd2hpY2ggaXMgaW4gdGhlIGN1cnJlbnQgZGVjbHAsIHNvIHdlIGxlYXZlIGl0IGFsb25lLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIGlmICh3b3JrLT5zdGF0aWNfdHlwZSkKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiBzdGF0aWMiKTsKLSAgICAgIGlmICh3b3JrLT50eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JewotCSAgQVBQRU5EX0JMQU5LIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgcXVhbGlmaWVyX3N0cmluZyAod29yay0+dHlwZV9xdWFscykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotI2lmIDAKLQotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBpZiAod29yayAtPiBzdGF0aWNfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBzdHJpbmcgdGVtcDsKLQotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgInRlbXBsYXRlIDwiKTsKLSAgLyogZ2V0IHNpemUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgKi8KLSAgaWYgKGdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0JewotCSAgaWYgKG5lZWRfY29tbWEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JICAgIH0KLQotCSAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLQkgICAgaWYgKCoqbWFuZ2xlZCA9PSAnWicpCi0JICAgICAgewotCQkoKm1hbmdsZWQpKys7Ci0JCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiY2xhc3MiKTsKLQkgICAgICB9Ci0JICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotCSAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCSAgICAgIHsKLQkJKCptYW5nbGVkKSsrOwotCQlzdWNjZXNzID0KLQkJICBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0JCWlmICghc3VjY2VzcykKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkJc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkJaWYgKHN1Y2Nlc3MpCi0JCSAgewotCQkgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0JCSAgfQotCQlzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIHsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICBuZWVkX2NvbW1hID0gMTsKLQl9Ci0KLSAgICB9Ci0gIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIj4gY2xhc3MiKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfZXhwcmVzc2lvbiAod29yaywgbWFuZ2xlZCwgcywgdGspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyKiogbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotICAgICB0eXBlX2tpbmRfdCB0azsKLXsKLSAgaW50IG5lZWRfb3BlcmF0b3IgPSAwOwotICBpbnQgc3VjY2VzczsKLQotICBzdWNjZXNzID0gMTsKLSAgc3RyaW5nX2FwcGVuZG4gKHMsICIoIiwgMSk7Ci0gICgqbWFuZ2xlZCkrKzsKLSAgd2hpbGUgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdXJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAobmVlZF9vcGVyYXRvcikKLQl7Ci0JICBzaXplX3QgaTsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIHN1Y2Nlc3MgPSAwOwotCi0JICBsZW4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQotCSAgZm9yIChpID0gMDsKLQkgICAgICAgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGUgWzBdKTsKLQkgICAgICAgKytpKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGwgPSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pOwotCi0JICAgICAgaWYgKGwgPD0gbGVuCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCAqbWFuZ2xlZCwgbCkgPT0gMCkKLQkJewotCQkgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgIHN0cmluZ19hcHBlbmQgKHMsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBzdHJpbmdfYXBwZW5kbiAocywgIiAiLCAxKTsKLQkJICBzdWNjZXNzID0gMTsKLQkJICAoKm1hbmdsZWQpICs9IGw7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQluZWVkX29wZXJhdG9yID0gMTsKLQotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsIHRrKTsKLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCAhPSAnVycpCi0gICAgc3VjY2VzcyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIikiLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhcioqIG1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLXsKLSAgaW50IHN1Y2Nlc3M7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnRScpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2V4cHJlc3Npb24gKHdvcmssIG1hbmdsZWQsIHMsIHRrX2ludGVncmFsKTsKLSAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdRJyB8fCAqKm1hbmdsZWQgPT0gJ0snKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHMsIDAsIDEpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHZhbHVlOwotCi0gICAgICBzdWNjZXNzID0gMDsKLQotICAgICAgLyogTmVnYXRpdmUgbnVtYmVycyBhcmUgaW5kaWNhdGVkIHdpdGggYSBsZWFkaW5nIGBtJy4gICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICdtJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIG51bWJlci4gICovCi0gICAgICB2YWx1ZSA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAodmFsdWUgIT0gLTEpCi0JewotCSAgY2hhciBidWZbSU5UQlVGX1NJWkVdOwotCSAgc3ByaW50ZiAoYnVmLCAiJWQiLCB2YWx1ZSk7Ci0JICBzdHJpbmdfYXBwZW5kIChzLCBidWYpOwotCi0JICAvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYW4gdW5kZXJzY29yZSwgc2tpcCBpdC4gICovCi0JICBpZiAoKiptYW5nbGVkID09ICdfJykKLQkgICAgKCptYW5nbGVkKSsrOwotCi0JICAvKiBBbGwgaXMgd2VsbC4gICovCi0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgcmVhbCB2YWx1ZSBpbiBNQU5HTEVELiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcmVhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcqIHM7Ci17Ci0gIGlmICgqKm1hbmdsZWQgPT0gJ0UnKQotICAgIHJldHVybiBkZW1hbmdsZV9leHByZXNzaW9uICh3b3JrLCBtYW5nbGVkLCBzLCB0a19yZWFsKTsKLQotICBpZiAoKiptYW5nbGVkID09ICdtJykKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotICBpZiAoKiptYW5nbGVkID09ICcuJykgLyogZnJhY3Rpb24gKi8KLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIi4iLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgIH0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpIC8qIGV4cG9uZW50ICovCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICJlIiwgMSk7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgKm1hbmdsZWQsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsIHRrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLSAgICAgdHlwZV9raW5kX3QgdGs7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLQotICBpZiAoKiptYW5nbGVkID09ICdZJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV4dCBhcmd1bWVudCBpcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gKi8KLSAgICAgIGludCBpZHg7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAoaWR4ID09IC0xCi0JICB8fCAod29yay0+dG1wbF9hcmd2ZWMgJiYgaWR4ID49IHdvcmstPm50bXBsX2FyZ3MpCi0JICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQlzdHJpbmdfYXBwZW5kIChzLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLSAgICAgIGVsc2UKLQlzdHJpbmdfYXBwZW5kX3RlbXBsYXRlX2lkeCAocywgaWR4KTsKLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX2ludGVncmFsKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcyk7Ci0gIGVsc2UgaWYgKHRrID09IHRrX2NoYXIpCi0gICAgewotICAgICAgY2hhciB0bXBbMl07Ci0gICAgICBpbnQgdmFsOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7Ci0gICAgICB2YWwgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotICAgICAgaWYgKHZhbCA8PSAwKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRtcFswXSA9IChjaGFyKXZhbDsKLQkgIHRtcFsxXSA9ICdcMCc7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgJnRtcFswXSwgMSk7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIiciLCAxKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19ib29sKQotICAgIHsKLSAgICAgIGludCB2YWwgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWwgPT0gMCkKLQlzdHJpbmdfYXBwZW5kbiAocywgImZhbHNlIiwgNSk7Ci0gICAgICBlbHNlIGlmICh2YWwgPT0gMSkKLQlzdHJpbmdfYXBwZW5kbiAocywgInRydWUiLCA0KTsKLSAgICAgIGVsc2UKLQlzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX3JlYWwpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3JlYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpOwotICBlbHNlIGlmICh0ayA9PSB0a19wb2ludGVyIHx8IHRrID09IHRrX3JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdRJykKLQlzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBzLAotCQkJCSAgICAgIC8qaXNmdW5jbmFtZT0qLzAsIAotCQkJCSAgICAgIC8qYXBwZW5kPSovMSk7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHN5bWJvbF9sZW4gID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBpZiAoc3ltYm9sX2xlbiA9PSAtMSkKLQkgICAgcmV0dXJuIC0xOwotCSAgaWYgKHN5bWJvbF9sZW4gPT0gMCkKLQkgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIwIiwgMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpwID0geG1hbGxvYyAoc3ltYm9sX2xlbiArIDEpLCAqcTsKLQkgICAgICBzdHJuY3B5IChwLCAqbWFuZ2xlZCwgc3ltYm9sX2xlbik7Ci0JICAgICAgcCBbc3ltYm9sX2xlbl0gPSAnXDAnOwotCSAgICAgIC8qIFdlIHVzZSBjcGx1c19kZW1hbmdsZSBoZXJlLCByYXRoZXIgdGhhbgotCQkgaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUsIGJlY2F1c2UgdGhlIG5hbWUgb2YgdGhlIGVudGl0eQotCQkgbWFuZ2xlZCBoZXJlIGRvZXMgbm90IG1ha2UgdXNlIG9mIGFueSBvZiB0aGUgc3F1YW5nbGluZwotCQkgb3IgdHlwZS1jb2RlIGluZm9ybWF0aW9uIHdlIGhhdmUgYnVpbHQgdXAgdGh1cyBmYXI7IGl0IGlzCi0JCSBtYW5nbGVkIGluZGVwZW5kZW50bHkuICAqLwotCSAgICAgIHEgPSBjcGx1c19kZW1hbmdsZSAocCwgd29yay0+b3B0aW9ucyk7Ci0JICAgICAgaWYgKHRrID09IHRrX3BvaW50ZXIpCi0JCXN0cmluZ19hcHBlbmRuIChzLCAiJiIsIDEpOwotCSAgICAgIC8qIEZJWE1FOiBQb2ludGVyLXRvLW1lbWJlciBjb25zdGFudHMgc2hvdWxkIGdldCBhCi0JCSBxdWFsaWZ5aW5nIGNsYXNzIG5hbWUgaGVyZS4gICovCi0JICAgICAgaWYgKHEpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kIChzLCBxKTsKLQkJICBmcmVlIChxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJc3RyaW5nX2FwcGVuZCAocywgcCk7Ci0JICAgICAgZnJlZSAocCk7Ci0JICAgIH0KLQkgICptYW5nbGVkICs9IHN5bWJvbF9sZW47Ci0JfQotICAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHRlbXBsYXRlIG5hbWUgaW4gTUFOR0xFRC4gIFRoZSBmdWxsIG5hbWUgb2YgdGhlCi0gICB0ZW1wbGF0ZSAoZS5nLiwgUzxpbnQ+KSBpcyBwbGFjZWQgaW4gVE5BTUUuICBUaGUgbmFtZSB3aXRob3V0IHRoZQotICAgdGVtcGxhdGUgcGFyYW1ldGVycyAoZS5nLiBTKSBpcyBwbGFjZWQgaW4gVFJBV05BTUUgaWYgVFJBV05BTUUgaXMKLSAgIG5vbi1OVUxMLiAgSWYgSVNfVFlQRSBpcyBub256ZXJvLCB0aGlzIHRlbXBsYXRlIGlzIGEgdHlwZSB0ZW1wbGF0ZSwKLSAgIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgSWYgYm90aCBJU19UWVBFIGFuZCBSRU1FTUJFUiBhcmUgbm9uemVybywKLSAgIHRoZSB0bWVwbGF0ZSBpcyByZW1lbWJlcmVkIGluIHRoZSBsaXN0IG9mIGJhY2stcmVmZXJlbmNlYWJsZQotICAgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgdG5hbWUsIHRyYXduYW1lLCBpc190eXBlLCByZW1lbWJlcikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotICAgICBzdHJpbmcgKnRyYXduYW1lOwotICAgICBpbnQgaXNfdHlwZTsKLSAgICAgaW50IHJlbWVtYmVyOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBjb25zdCBjaGFyICpzdGFydDsKLSAgaW50IGlzX2phdmFfYXJyYXkgPSAwOwotICBzdHJpbmcgdGVtcDsKLSAgaW50IGJpbmRleCA9IDA7Ci0KLSAgKCptYW5nbGVkKSsrOwotICBpZiAoaXNfdHlwZSkKLSAgICB7Ci0gICAgICBpZiAocmVtZW1iZXIpCi0JYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgc3RhcnQgPSAqbWFuZ2xlZDsKLSAgICAgIC8qIGdldCB0ZW1wbGF0ZSBuYW1lICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgaWR4OwotCSAgKCptYW5nbGVkKSsrOwotCSAgKCptYW5nbGVkKSsrOwotCi0JICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotCSAgaWYgKGlkeCA9PSAtMQotCSAgICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgICByZXR1cm4gKDApOwotCi0JICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgICAgaWYgKHRyYXduYW1lKQotCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4ICh0bmFtZSwgaWR4KTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4ICh0cmF3bmFtZSwgaWR4KTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHIgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKSkgPD0gMAotCSAgICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgcikKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQkgIGlzX2phdmFfYXJyYXkgPSAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKQotCSAgICAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIkpBcnJheTFaIiwgOCkgPT0gMDsKLQkgIGlmICghIGlzX2phdmFfYXJyYXkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAodG5hbWUsICptYW5nbGVkLCByKTsKLQkgICAgfQotCSAgaWYgKHRyYXduYW1lKQotCSAgICBzdHJpbmdfYXBwZW5kbiAodHJhd25hbWUsICptYW5nbGVkLCByKTsKLQkgICptYW5nbGVkICs9IHI7Ci0JfQotICAgIH0KLSAgaWYgKCFpc19qYXZhX2FycmF5KQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPCIpOwotICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLwotICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICBpZiAoIWlzX3R5cGUpCi0gICAgewotICAgICAgLyogQ3JlYXRlIGFuIGFycmF5IGZvciBzYXZpbmcgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHZhbHVlcy4gKi8KLSAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gKGNoYXIqKikgeG1hbGxvYyAociAqIHNpemVvZiAoY2hhciAqKSk7Ci0gICAgICB3b3JrLT5udG1wbF9hcmdzID0gcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0Jd29yay0+dG1wbF9hcmd2ZWNbaV0gPSAwOwotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmVlZF9jb21tYSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JfQotICAgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICdaJykKLQl7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOwotCi0JICAgICAgaWYgKCFpc190eXBlKQotCQl7Ci0JCSAgLyogU2F2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQuICovCi0JCSAgaW50IGxlbiA9IHRlbXAucCAtIHRlbXAuYjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sIHRlbXAuYiwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICB9Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotICAgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgcjI7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOwotCi0JICBpZiAoc3VjY2VzcwotCSAgICAgICYmIChyMiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA+IDAKLQkgICAgICAmJiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSByMikKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIyKTsKLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gcjI7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkJICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCAqbWFuZ2xlZCwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICAgICptYW5nbGVkICs9IHIyOwotCSAgICB9Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJpbmcgIHBhcmFtOwotCSAgc3RyaW5nKiBzOwotCi0JICAvKiBvdGhlcndpc2UsIHZhbHVlIHBhcmFtZXRlciAqLwotCi0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghaXNfdHlwZSkKLQkgICAgewotCSAgICAgIHMgPSAmcGFyYW07Ci0JICAgICAgc3RyaW5nX2luaXQgKHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHMgPSB0bmFtZTsKLQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJCQkgICh0eXBlX2tpbmRfdCkgc3VjY2Vzcyk7Ci0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IHMtPnAgLSBzLT5iOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICAgICAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgcy0+YiwgbGVuKTsKLQkgICAgICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgcyk7Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgIH0KLQl9Ci0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0gIGlmIChpc19qYXZhX2FycmF5KQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiW10iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKLQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiIpOwotICAgIH0KLQotICBpZiAoaXNfdHlwZSAmJiByZW1lbWJlcikKLSAgICByZW1lbWJlcl9CdHlwZSAod29yaywgdG5hbWUtPmIsIExFTl9TVFJJTkcgKHRuYW1lKSwgYmluZGV4KTsKLQotICAvKgotICAgIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotYXJtX3B0ICh3b3JrLCBtYW5nbGVkLCBuLCBhbmNob3IsIGFyZ3MpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgY29uc3QgY2hhciAqKmFuY2hvciwgKiphcmdzOwotewotICAvKiBDaGVjayBpZiBBUk0gdGVtcGxhdGUgd2l0aCAiX19wdF9fIiBpbiBpdCAoInBhcmFtZXRlcml6ZWQgdHlwZSIpICovCi0gIC8qIEFsbG93IEhQIGFsc28gaGVyZSwgYmVjYXVzZSBIUCdzIGNmcm9udCBjb21waWxlciBmb2xsb3dzIEFSTSB0byBzb21lIGV4dGVudCAqLwotICBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpICYmICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgewotICAgICAgaW50IGxlbjsKLSAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKLSAgICAgIGlmIChsZW4gPT0gLTEpCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLQl7Ci0JICArKyphcmdzOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0gICAgICBpZiAoKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fdG1fXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3BzX18iKSkKLSAgICAgICAgICB8fCAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wdF9fIikpKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGxlbjsKLSAgICAgICAgICAqYXJncyA9ICphbmNob3IgKyA2OwotICAgICAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19TIikpKQotICAgICAgICB7Ci0gCSAgaW50IGxlbjsKLSAJICAqYXJncyA9ICphbmNob3IgKyAzOwotIAkgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gCSAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gCSAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBuLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY29uc3QgY2hhciAqZSA9ICptYW5nbGVkICsgbjsKLSAgc3RyaW5nIGFyZzsKLQotICAvKiBDaGVjayBmb3IgSFAgYUNDIHRlbXBsYXRlIHNwZWM6IGNsYXNzWHQxdDIgd2hlcmUgdDEsIHQyIGFyZQotICAgICB0ZW1wbGF0ZSBhcmdzICovCi0gIGlmIChIUF9ERU1BTkdMSU5HICYmICgoKm1hbmdsZWQpW25dID09ICdYJykpCi0gICAgewotICAgICAgY2hhciAqc3RhcnRfc3BlY19hcmdzID0gTlVMTDsKLQotICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFuZCBvbWl0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHBzZXVkby1hcmd1bWVudHMsCi0gICAgICAgICBzdWNoIGFzIGluICJTcGVjPCMxLCMxLio+IiAqLwotICAgICAgc3RhcnRfc3BlY19hcmdzID0gc3RyY2hyICgqbWFuZ2xlZCwgJzwnKTsKLSAgICAgIGlmIChzdGFydF9zcGVjX2FyZ3MgJiYgKHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkIDwgbikpCi0gICAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0gICAgICAoKm1hbmdsZWQpICs9IG4gKyAxOwotICAgICAgc3RyaW5nX2luaXQgKCZhcmcpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfY2xlYXIgKCZhcmcpOwotICAgICAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAvKiAnVCcgc2lnbmFscyBhIHR5cGUgcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdVJzoKLSAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgLyogJ1UnIG9yICdTJyBzaWduYWxzIGFuIGludGVncmFsIHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAvKiAnQScgc2lnbmFscyBhIG5hbWVkIGNvbnN0YW50IGV4cHJlc3Npb24gKGxpdGVyYWwpICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogVG9kYXksIDE5OTctMDktMDMsIHdlIGhhdmUgb25seSB0aGUgYWJvdmUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBudWxsICovCi0gICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLSAgICAgICAgIC8qIENoZWNrIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGVtcGxhdGUgYXJncy4KLSAgICAgICAgICAgICAwIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLAotICAgICAgICAgICAgIF8gaWYgZG9uZSB3aXRoIHRlbXBsYXRlIGFyZ3MgZm9yIGEgZnVuY3Rpb24gKi8KLSAgICAgICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnXDAwMCcpIHx8ICgqKm1hbmdsZWQgPT0gJ18nKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgICB9Ci0gICAgaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOgotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI+Iik7Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBBUk0gdGVtcGxhdGU/IChBbHNvIGhhbmRsZXMgSFAgY2Zyb250IGV4dGVuc2lvbnMpICovCi0gIGVsc2UgaWYgKGFybV9wdCAod29yaywgKm1hbmdsZWQsIG4sICZwLCAmYXJncykpCi0gICAgewotICAgICAgc3RyaW5nIHR5cGVfc3RyOwotCi0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBwIC0gKm1hbmdsZWQpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpICAvKiBub24tcmVjdXJzaXZlIGNhbGwgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgLyogc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIGhlcmUgKi8KLSAgICAgIHdoaWxlIChhcmdzIDwgZSkgewotCXN0cmluZ19jbGVhciAoJmFyZyk7Ci0KLQkvKiBDaGVjayBmb3IgdHlwZSBvciBsaXRlcmFsIGhlcmUgKi8KLQlzd2l0Y2ggKCphcmdzKQotCSAgewotCSAgICAvKiBIUCBjZnJvbnQgZXh0ZW5zaW9ucyB0byBBUk0gZm9yIHRlbXBsYXRlIGFyZ3MgKi8KLQkgICAgLyogc3BlYzogWHQxTHYxIHdoZXJlIHQxIGlzIGEgdHlwZSwgdjEgaXMgYSBsaXRlcmFsIHZhbHVlICovCi0JICAgIC8qIEZJWE1FOiBXZSBoYW5kbGUgb25seSBudW1lcmljIGxpdGVyYWxzIGZvciBIUCBjZnJvbnQgKi8KLSAgICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgICAgIC8qIEEgdHlwZWQgY29uc3RhbnQgdmFsdWUgZm9sbG93cyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJnR5cGVfc3RyKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKCIpOwotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZhcmcsICZ0eXBlX3N0cik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKSIpOwotICAgICAgICAgICAgaWYgKCphcmdzICE9ICdMJykKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgLyogTm93IHNuYXJmIGEgbGl0ZXJhbCB2YWx1ZSBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAvKiBTbmFyZiBhIGxpdGVyYWwgZm9sbG93aW5nICdMJyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFzbmFyZl9udW1lcmljX2xpdGVyYWwgKCZhcmdzLCAmYXJnKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogTm90IGhhbmRsaW5nIG90aGVyIEhQIGNmcm9udCBzdHVmZiAqLwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJmFyZykpCi0gICAgICAgICAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLQkgIH0KLQlzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgfQotICAgIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmIChhcmdzID49IGUpCi0JLS1kZWNscC0+cDsgLyogcmVtb3ZlIGV4dHJhIGNvbW1hICovCi0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4+MTAgJiYgc3RybmNtcCAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDAKLQkgICAmJiAoKm1hbmdsZWQpWzldID09ICdOJwotCSAgICYmICgqbWFuZ2xlZClbOF0gPT0gKCptYW5nbGVkKVsxMF0KLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pKQotICAgIHsKLSAgICAgIC8qIEEgbWVtYmVyIG9mIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiAgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAie2Fub255bW91c30iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsIG9ubHkgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gMDsgICAgIC8qIGRpc2FibGUgaW4gcmVjdXJzaXZlIGNhbGxzICovCi0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICB9Ci0gICptYW5nbGVkICs9IG47Ci19Ci0KLS8qIEV4dHJhY3QgYSBjbGFzcyBuYW1lLCBwb3NzaWJseSBhIHRlbXBsYXRlIHdpdGggYXJndW1lbnRzLCBmcm9tIHRoZQotICAgbWFuZ2xlZCBzdHJpbmc7IHF1YWxpZmllcnMsIGxvY2FsIGNsYXNzIGluZGljYXRvcnMsIGV0Yy4gaGF2ZQotICAgYWxyZWFkeSBiZWVuIGRlYWx0IHdpdGggKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gIGlmIChuID09IC0xKQotICAgIHJldHVybiAwOwotICBpZiAoKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPj0gbikKLSAgICB7Ci0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfY2xhc3MgLS0gZGVtYW5nbGUgYSBtYW5nbGVkIGNsYXNzIHNlcXVlbmNlCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfY2xhc3MgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCXN0cmludCAqZGVjbHApCi0KLURFU0NSSVBUSU9OCi0KLQlERUNMUCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xpbmcgaXMgYmVpbmcgZG9uZS4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB0b2tlbiB0byBiZSBkZW1hbmdsZWQuICBPbiBpbnB1dCwKLQlpdCBwb2ludHMgdG8gYSBtYW5nbGVkIGNsYXNzIChJLkUuICIzZm9vIiwgIjEzdmVyeWxvbmdjbGFzcyIsIGV0Yy4pCi0JT24gZXhpdCwgaXQgcG9pbnRzIHRvIHRoZSBuZXh0IHRva2VuIGFmdGVyIHRoZSBtYW5nbGVkIGNsYXNzIG9uCi0Jc3VjY2Vzcywgb3IgdGhlIGZpcnN0IHVuY29uc3VtZWQgdG9rZW4gb24gZmFpbHVyZS4KLQotCUlmIHRoZSBDT05TVFJVQ1RPUiBvciBERVNUUlVDVE9SIGZsYWdzIGFyZSBzZXQgaW4gV09SSywgdGhlbgotCXdlIGFyZSBkZW1hbmdsaW5nIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gIEluIHRoaXMgY2FzZQotCXdlIHByZXBlbmQgImNsYXNzOjpjbGFzcyIgb3IgImNsYXNzOjp+Y2xhc3MiIHRvIERFQ0xQLgotCi0JT3RoZXJ3aXNlLCB3ZSBwcmVwZW5kICJjbGFzczo6IiB0byB0aGUgY3VycmVudCBERUNMUC4KLQotCVJlc2V0IHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZsYWdzIG9uY2UgdGhleSBoYXZlIGJlZW4KLQkiY29uc3VtZWQiLiAgVGhpcyBhbGxvd3MgZGVtYW5nbGVfY2xhc3MgdG8gYmUgY2FsbGVkIGxhdGVyIGR1cmluZwotCXRoZSBzYW1lIGRlbWFuZ2xpbmcsIHRvIGRvIG5vcm1hbCBjbGFzcyBkZW1hbmdsaW5nLgotCi0JUmV0dXJucyAxIGlmIGRlbWFuZ2xpbmcgaXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UuCi0KLSovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGludCBidHlwZTsKLSAgc3RyaW5nIGNsYXNzX25hbWU7Ci0gIGNoYXIgKnNhdmVfY2xhc3NfbmFtZV9lbmQgPSAwOwotCi0gIHN0cmluZ19pbml0ICgmY2xhc3NfbmFtZSk7Ci0gIGJ0eXBlID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmNsYXNzX25hbWUpKQotICAgIHsKLSAgICAgIHNhdmVfY2xhc3NfbmFtZV9lbmQgPSBjbGFzc19uYW1lLnA7Ci0gICAgICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKLQl7Ci0gICAgICAgICAgLyogYWRqdXN0IHNvIHdlIGRvbid0IGluY2x1ZGUgdGVtcGxhdGUgYXJncyAqLwotICAgICAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ICYmICh3b3JrLT50ZW1wX3N0YXJ0ICE9IC0xKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2xhc3NfbmFtZS5wID0gY2xhc3NfbmFtZS5iICsgd29yay0+dGVtcF9zdGFydDsKLSAgICAgICAgICAgIH0KLQkgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZjbGFzc19uYW1lKTsKLQkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAifiIpOwotICAgICAgICAgICAgICB3b3JrIC0+IGRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd29yayAtPiBjb25zdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JfQotICAgICAgY2xhc3NfbmFtZS5wID0gc2F2ZV9jbGFzc19uYW1lX2VuZDsKLSAgICAgIHJlbWVtYmVyX0t0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpKTsKLSAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpLCBidHlwZSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBzdHJpbmdfZGVsZXRlICgmY2xhc3NfbmFtZSk7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9wcmVmaXggLS0gY29uc3VtZSB0aGUgbWFuZ2xlZCBuYW1lIHByZWZpeCBhbmQgZmluZCBzaWduYXR1cmUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9wcmVmaXggKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgc3RyaW5nIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xlZCBvdXRwdXQgaXMKLQlwbGFjZWQuICBPbiBlbnRyeSwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gIE9uIGV4aXQgaXQgY29udGFpbnMKLQl0aGUgcm9vdCBmdW5jdGlvbiBuYW1lLCB0aGUgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUsIG9yIGluIHNvbWUKLQlzcGVjaWFsIGNhc2VzIGVpdGhlciBub3RoaW5nIG9yIHRoZSBjb21wbGV0ZWx5IGRlbWFuZ2xlZCByZXN1bHQuCi0KLQlNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCBwb2ludGVyIGludG8gdGhlIG1hbmdsZWQgbmFtZS4gIEFzIGVhY2gKLQl0b2tlbiBvZiB0aGUgbWFuZ2xlZCBuYW1lIGlzIGNvbnN1bWVkLCBpdCBpcyB1cGRhdGVkLiAgVXBvbiBlbnRyeQotCXRoZSBjdXJyZW50IG1hbmdsZWQgbmFtZSBwb2ludGVyIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCi0JdGhlIG1hbmdsZWQgbmFtZS4gIFVwb24gZXhpdCwgaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiB0aGUgc2lnbmF0dXJlIGlmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIG9yIHRvIHRoZSBmaXJzdAotCXVuY29uc3VtZWQgY2hhcmFjdGVyIGlmIGRlbWFuZ2xpbmcgb2YgdGhlIHByZWZpeCB3YXMgdW5zdWNjZXNzZnVsLgotCi0JUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3ByZWZpeCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotICBpbnQgaTsKLQotICBpZiAoc3RybGVuKCptYW5nbGVkKSA+IDYKLSAgICAgICYmIChzdHJuY21wKCptYW5nbGVkLCAiX2ltcF9fIiwgNikgPT0gMAotICAgICAgICAgIHx8IHN0cm5jbXAoKm1hbmdsZWQsICJfX2ltcF8iLCA2KSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgc3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBkeW5hbWljIGxpYnJhcnkuIENoZWNrIGZvciBib3RoCi0gICAgICAgICBuZXcgc3R5bGUgcHJlZml4IF9pbXBfXyBhbmQgbGVnYWN5IF9faW1wXyB1c2VkIGJ5IG9sZGVyIHZlcnNpb25zCi0JIG9mIGRsbHRvb2wuICovCi0gICAgICAoKm1hbmdsZWQpICs9IDY7Ci0gICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4oKm1hbmdsZWQpID49IDExICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDApCi0gICAgewotICAgICAgY2hhciAqbWFya2VyID0gc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzhdKTsKLSAgICAgIGlmIChtYXJrZXIgIT0gTlVMTCAmJiAqbWFya2VyID09ICgqbWFuZ2xlZClbMTBdKQotCXsKLQkgIGlmICgoKm1hbmdsZWQpWzldID09ICdEJykKLQkgICAgewotCSAgICAgIC8qIGl0J3MgYSBHTlUgZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0knKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0JICAgICAgaWYgKGdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkpCi0JCXJldHVybiBzdWNjZXNzOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfX3N0ZF9fIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgQVJNIGdsb2JhbCBkZXN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gZXhpdCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDI7Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RpX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gaW5pdGlhbCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAyOwotICAgIH0KLQotICAvKiAgVGhpcyBibG9jayBvZiBjb2RlIGlzIGEgcmVkdWN0aW9uIGluIHN0cmVuZ3RoIHRpbWUgb3B0aW1pemF0aW9uCi0gICAgICBvZjoKLSAgICAgIHNjYW4gPSBteXN0cnN0ciAoKm1hbmdsZWQsICJfXyIpOyAqLwotCi0gIHsKLSAgICBzY2FuID0gKm1hbmdsZWQ7Ci0KLSAgICBkbyB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgICBpZiAoc2NhbiAhPSBOVUxMKSAtLXNjYW47Ci0gIH0KLQotICBpZiAoc2NhbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGZvdW5kIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgJ18nLCBlbnN1cmUgdGhhdCB3ZSBzdGFydCBhdAotCSB0aGUgbGFzdCBwYWlyIGluIHRoZSBzZXF1ZW5jZS4gICovCi0gICAgICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICAgICAgaWYgKGkgPiAyKQotCXsKLQkgIHNjYW4gKz0gKGkgLSAyKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzY2FuID09IE5VTEwpCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblswXSkgJiYgKHNjYW5bMF0gIT0gJ3QnKSkKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgoc2NhbiA9PSAqbWFuZ2xlZCkKLQkgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkgfHwgKHNjYW5bMl0gPT0gJ1EnKQotCSAgICAgICB8fCAoc2NhblsyXSA9PSAndCcpIHx8IChzY2FuWzJdID09ICdLJykgfHwgKHNjYW5bMl0gPT0gJ0gnKSkpCi0gICAgewotICAgICAgLyogVGhlIEFSTSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIG1hbmdsaW5nIG9mIGxvY2FsIHZhcmlhYmxlcy4KLQkgQnV0IGNmcm9udCBtYW5nbGVzIGxvY2FsIHZhcmlhYmxlcyBieSBwcmVwZW5kaW5nIF9fPG5lc3RpbmdfbGV2ZWw+Ci0JIHRvIHRoZW0uIEFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZyB3ZSBoYW5kbGUgdGhpcyBjYXNlLiAgKi8KLSAgICAgIGlmICgoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKQotCSAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkpCi0JewotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQkgIGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkKTsKLQkgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgc3VjY2VzcyA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgR05VIHN0eWxlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIF9fWzAtOVF0XS4gIEJ1dCBjZnJvbnQgdXNlcwotCSAgICAgbmFtZXMgbGlrZSBfX1EyXzNmb28zYmFyIGZvciBuZXN0ZWQgdHlwZSBuYW1lcy4gIFNvIGRvbid0IGFjY2VwdAotCSAgICAgdGhpcyBzdHlsZSBvZiBjb25zdHJ1Y3RvciBmb3IgY2Zyb250IGRlbWFuZ2xpbmcuICBBIEdOVQotCSAgICAgc3R5bGUgbWVtYmVyLXRlbXBsYXRlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoICdIJy4gKi8KLQkgIGlmICghKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykpCi0JICAgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgICptYW5nbGVkID0gc2NhbiArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoQVJNX0RFTUFOR0xJTkcgJiYgc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAndCcpCi0gICAgewotICAgICAgLyogQ2Zyb250LXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogQVJNIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoRURHX0RFTUFOR0xJTkcgJiYgKChzY2FuWzJdID09ICd0JyAmJiBzY2FuWzNdID09ICdtJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICdzJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykpKQotICAgIHsKLSAgICAgIC8qIEVERy1zdHlsZSBwYXJhbWV0ZXJpemVkIHR5cGUuICBIYW5kbGVkIGxhdGVyIGFzIGEgc2lnbmF0dXJlLiAqLwotICAgICAgc3VjY2VzcyA9IDE7Ci0KLSAgICAgIC8qIEVERyB0ZW1wbGF0ZT8gKi8KLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgc3RybGVuICgqbWFuZ2xlZCksIGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKSAmJiAhaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkKLQkgICAmJiAoc2NhblsyXSAhPSAndCcpKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBzdGFydHMgd2l0aCAiX18iLiAgU2tpcCBvdmVyIGFueSBsZWFkaW5nICdfJyBjaGFyYWN0ZXJzLAotCSB0aGVuIGZpbmQgdGhlIG5leHQgIl9fIiB0aGF0IHNlcGFyYXRlcyB0aGUgcHJlZml4IGZyb20gdGhlIHNpZ25hdHVyZS4KLQkgKi8KLSAgICAgIGlmICghKEFSTV9ERU1BTkdMSU5HIHx8IExVQ0lEX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgIHx8IChhcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApID09IDApKQotCXsKLQkgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzY2FuKys7Ci0JICAgIH0KLQkgIGlmICgoc2NhbiA9IG15c3Ryc3RyIChzY2FuLCAiX18iKSkgPT0gTlVMTCB8fCAoKihzY2FuICsgMikgPT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICAvKiBObyBzZXBhcmF0b3IgKEkuRS4gIl9fbm90X21hbmdsZWQiKSwgb3IgZW1wdHkgc2lnbmF0dXJlCi0JCSAoSS5FLiAiX19ub3RfbWFuZ2xlZF9laXRoZXJfXyIpICovCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnRtcDsKLQotICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgTEFTVCBvY2N1cnJlbmNlIG9mIF9fLCBhbGxvd2luZyBuYW1lcyB0bwotICAgICAgICAgICAgICAgICBoYXZlIHRoZSAnX18nIHNlcXVlbmNlIGVtYmVkZGVkIGluIHRoZW0uICovCi0JICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykpCi0JCXsKLQkJICB3aGlsZSAoKHRtcCA9IG15c3Ryc3RyIChzY2FuICsgMiwgIl9fIikpICE9IE5VTEwpCi0JCSAgICBzY2FuID0gdG1wOwotCQl9Ci0JICAgICAgaWYgKCooc2NhbiArIDIpID09ICdcMCcpCi0JCXN1Y2Nlc3MgPSAwOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKihzY2FuICsgMikgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBNYW5nbGVkIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAiX18iIGJ1dCBkb2VzIGhhdmUgb25lIHNvbWV3aGVyZQotCSBpbiB0aGVyZSB3aXRoIG5vbiBlbXB0eSBzdHVmZiBhZnRlciBpdC4gIExvb2tzIGxpa2UgYSBnbG9iYWwKLQkgZnVuY3Rpb24gbmFtZS4gICovCi0gICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRG9lc24ndCBsb29rIGxpa2UgYSBtYW5nbGVkIG5hbWUgKi8KLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MgJiYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIgfHwgd29yay0+ZGVzdHJ1Y3RvciA9PSAyKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlnbnVfc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIGdudSBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnbnVfc3BlY2lhbCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkgICAgIHN0cmluZyAqZGVjbHApOwotCi0KLURFU0NSSVBUSU9OCi0KLQlQcm9jZXNzIHNvbWUgc3BlY2lhbCBHTlUgc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKLQl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKLQotCQlfJF8zZm9vCQkoZGVzdHJ1Y3RvciBmb3IgY2xhc3MgZm9vKQotCQlfdnQkZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCi0JCV92dCRmb28kYmFyCShmb286OmJhciB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0X2ZvbwkoZm9vIHZpcnR1YWwgdGFibGUsIG5ldyBzdHlsZSB3aXRoIHRodW5rcykKLQkJXzNmb28kdmFybmFtZQkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfUTIycnMydHUkdncJKHN0YXRpYyBkYXRhIG1lbWJlcikKLQkJX190NnZlY3RvcjFaaWkJKGNvbnN0cnVjdG9yIHdpdGggdGVtcGxhdGUpCi0JCV9fdGh1bmtfNF9fJF83b3N0cmVhbSAodmlydHVhbCBmdW5jdGlvbiB0aHVuaykKLSAqLwotCi1zdGF0aWMgaW50Ci1nbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqcDsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVsxXSkgIT0gTlVMTAotICAgICAgJiYgKCptYW5nbGVkKVsyXSA9PSAnXycpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgZGVzdHJ1Y3RvciwgZ2V0IHBhc3QgIl88Q1BMVVNfTUFSS0VSPl8iICovCi0gICAgICAoKm1hbmdsZWQpICs9IDM7Ci0gICAgICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKCgoKm1hbmdsZWQpWzFdID09ICdfJwotCQkmJiAoKm1hbmdsZWQpWzJdID09ICd2JwotCQkmJiAoKm1hbmdsZWQpWzNdID09ICd0JwotCQkmJiAoKm1hbmdsZWQpWzRdID09ICdfJykKLQkgICAgICAgfHwgKCgqbWFuZ2xlZClbMV0gPT0gJ3YnCi0JCSAgICYmICgqbWFuZ2xlZClbMl0gPT0gJ3QnCi0JCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVszXSkgIT0gTlVMTCkpKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgR05VIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0ICJfdnQ8Q1BMVVNfTUFSS0VSPiIKLSAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKLQkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yawotCSB0byBkby4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAndicpCi0JKCptYW5nbGVkKSArPSA1OyAvKiBOZXcgc3R5bGUsIHdpdGggdGh1bmtzOiAiX192dF8iICovCi0gICAgICBlbHNlCi0JKCptYW5nbGVkKSArPSA0OyAvKiBPbGQgc3R5bGUsIG5vIHRodW5rczogIl92dDxDUExVU19NQVJLRVI+IiAqLwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIHN3aXRjaCAoKiptYW5nbGVkKQotCSAgICB7Ci0JICAgIGNhc2UgJ1EnOgotCSAgICBjYXNlICdLJzoKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsCi0JCQkJCSAgIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSptYW5nbGVkWzBdKSkKLQkJewotCQkgIG4gPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCQkgIC8qIFdlIG1heSBiZSBzZWVpbmcgYSB0b28tbGFyZ2Ugc2l6ZSwgb3IgZWxzZSBhCi0JCSAgICAgIi48ZGlnaXRzPiIgaW5kaWNhdGluZyBhIHN0YXRpYyBsb2NhbCBzeW1ib2wuICBJbgotCQkgICAgIGFueSBjYXNlLCBkZWNsYXJlIHZpY3RvcnkgYW5kIG1vdmUgb247ICpkb24ndCogdHJ5Ci0JCSAgICAgdG8gdXNlIG4gdG8gYWxsb2NhdGUuICAqLwotCQkgIGlmIChuID4gKGludCkgc3RybGVuICgqbWFuZ2xlZCkpCi0JCSAgICB7Ci0JCSAgICAgIHN1Y2Nlc3MgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG4gPSBzdHJjc3BuICgqbWFuZ2xlZCwgY3BsdXNfbWFya2Vycyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQotCSAgcCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkgIGlmIChzdWNjZXNzICYmICgocCA9PSBOVUxMKSB8fCAocCA9PSAqbWFuZ2xlZCkpKQotCSAgICB7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkJICAoKm1hbmdsZWQpKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7Ci0gICAgfQotICBlbHNlIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotCSAgICYmIChzdHJjaHIoIjAxMjM0NTY3ODlRdCIsICgqbWFuZ2xlZClbMV0pICE9IE5VTEwpCi0JICAgJiYgKHAgPSBzdHJwYnJrICgqbWFuZ2xlZCwgY3BsdXNfbWFya2VycykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc3RhdGljIGRhdGEgbWVtYmVyLCAiXzNmb28kdmFybmFtZSIgZm9yIGV4YW1wbGUgKi8KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgaWYgKG4gPCAwIHx8IG4gPiAobG9uZykgc3RybGVuICgqbWFuZ2xlZCkpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKHAgPT0gKm1hbmdsZWQpKQotCXsKLQkgIC8qIENvbnN1bWVkIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGNwbHVzX21hcmtlciwgYXBwZW5kIHRoZQotCSAgICAgdmFyaWFibGUgbmFtZS4gICovCi0JICAoKm1hbmdsZWQpKys7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JICBuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3RodW5rXyIsIDgpID09IDApCi0gICAgewotICAgICAgaW50IGRlbHRhOwotCi0gICAgICAoKm1hbmdsZWQpICs9IDg7Ci0gICAgICBkZWx0YSA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKGRlbHRhID09IC0xKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKm1ldGhvZCA9IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCArKyptYW5nbGVkKTsKLQotCSAgaWYgKG1ldGhvZCkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzUwXTsKLQkgICAgICBzcHJpbnRmIChidWYsICJ2aXJ0dWFsIGZ1bmN0aW9uIHRodW5rIChkZWx0YTolZCkgZm9yICIsIC1kZWx0YSk7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIGJ1Zik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG1ldGhvZCk7Ci0JICAgICAgZnJlZSAobWV0aG9kKTsKLQkgICAgICBuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICAgICAgKCptYW5nbGVkKSArPSBuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCAiX190IiwgMykgPT0gMAotCSAgICYmICgoKm1hbmdsZWQpWzNdID09ICdpJyB8fCAoKm1hbmdsZWQpWzNdID09ICdmJykpCi0gICAgewotICAgICAgcCA9ICgqbWFuZ2xlZClbM10gPT0gJ2knID8gIiB0eXBlX2luZm8gbm9kZSIgOiAiIHR5cGVfaW5mbyBmdW5jdGlvbiI7Ci0gICAgICAoKm1hbmdsZWQpICs9IDQ7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnUSc6Ci0JY2FzZSAnSyc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsIDEpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmICoqbWFuZ2xlZCAhPSAnXDAnKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgaWYgKHN1Y2Nlc3MpCi0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsIHApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY3Vyc2l2ZWx5X2RlbWFuZ2xlKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgbmFtZWxlbmd0aCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLSAgICAgaW50IG5hbWVsZW5ndGg7Ci17Ci0gIGNoYXIgKiByZWN1cnNlID0gKGNoYXIgKilOVUxMOwotICBjaGFyICogcmVjdXJzZV9kZW0gPSAoY2hhciAqKU5VTEw7Ci0KLSAgcmVjdXJzZSA9IChjaGFyICopIHhtYWxsb2MgKG5hbWVsZW5ndGggKyAxKTsKLSAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbmFtZWxlbmd0aCk7Ci0gIHJlY3Vyc2VbbmFtZWxlbmd0aF0gPSAnXDAwMCc7Ci0KLSAgcmVjdXJzZV9kZW0gPSBjcGx1c19kZW1hbmdsZSAocmVjdXJzZSwgd29yay0+b3B0aW9ucyk7Ci0KLSAgaWYgKHJlY3Vyc2VfZGVtKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgcmVjdXJzZV9kZW0pOwotICAgICAgZnJlZSAocmVjdXJzZV9kZW0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChyZXN1bHQsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKLSAgICB9Ci0gIGZyZWUgKHJlY3Vyc2UpOwotICAqbWFuZ2xlZCArPSBuYW1lbGVuZ3RoOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JYXJtX3NwZWNpYWwgLS0gc3BlY2lhbCBoYW5kbGluZyBvZiBBUk0vbHVjaWQgbWFuZ2xlZCBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JYXJtX3NwZWNpYWwgKGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkgICAgIHN0cmluZyAqZGVjbHApOwotCi0KLURFU0NSSVBUSU9OCi0KLQlQcm9jZXNzIHNvbWUgc3BlY2lhbCBBUk0gc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKLQl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKLQotCQlfX3Z0YmxfXzNmb28JCShmb28gdmlydHVhbCB0YWJsZSkKLQkJX192dGJsX18zZm9vX18zYmFyCShiYXI6OmZvbyB2aXJ0dWFsIHRhYmxlKQotCi0gKi8KLQotc3RhdGljIGludAotYXJtX3NwZWNpYWwgKG1hbmdsZWQsIGRlY2xwKQotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqc2NhbjsKLQotICBpZiAoc3RybmNtcCAoKm1hbmdsZWQsIEFSTV9WVEFCTEVfU1RSSU5HLCBBUk1fVlRBQkxFX1NUUkxFTikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEFSTSBzdHlsZSB2aXJ0dWFsIHRhYmxlLCBnZXQgcGFzdCBBUk1fVlRBQkxFX1NUUklORwotICAgICAgICAgYW5kIGNyZWF0ZSB0aGUgZGVjbC4gIE5vdGUgdGhhdCB3ZSBjb25zdW1lIHRoZSBlbnRpcmUgbWFuZ2xlZAotCSBpbnB1dCBzdHJpbmcsIHdoaWNoIG1lYW5zIHRoYXQgZGVtYW5nbGVfc2lnbmF0dXJlIGhhcyBubyB3b3JrCi0JIHRvIGRvLiAgKi8KLSAgICAgIHNjYW4gPSAqbWFuZ2xlZCArIEFSTV9WVEFCTEVfU1RSTEVOOwotICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpICAgICAgICAvKiBmaXJzdCBjaGVjayBpdCBjYW4gYmUgZGVtYW5nbGVkICovCi0gICAgICAgIHsKLSAgICAgICAgICBuID0gY29uc3VtZV9jb3VudCAoJnNjYW4pOwotICAgICAgICAgIGlmIChuID09IC0xKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgIC8qIG5vIGdvb2QgKi8KLQkgICAgfQotICAgICAgICAgIHNjYW4gKz0gbjsKLSAgICAgICAgICBpZiAoc2NhblswXSA9PSAnXycgJiYgc2NhblsxXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzY2FuICs9IDI7Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgKCptYW5nbGVkKSArPSBBUk1fVlRBQkxFX1NUUkxFTjsKLSAgICAgIHdoaWxlICgqKm1hbmdsZWQgIT0gJ1wwJykKLQl7Ci0JICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICAgICAgaWYgKG4gPT0gLTEKLQkgICAgICB8fCBuID4gKGxvbmcpIHN0cmxlbiAoKm1hbmdsZWQpKQotCSAgICByZXR1cm4gMDsKLQkgIHN0cmluZ19wcmVwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQkgIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJyAmJiAoKm1hbmdsZWQpWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgIjo6Iik7Ci0JICAgICAgKCptYW5nbGVkKSArPSAyOwotCSAgICB9Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgdmlydHVhbCB0YWJsZSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3F1YWxpZmllZCAtLSBkZW1hbmdsZSAnUScgcXVhbGlmaWVkIG5hbWUgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3F1YWxpZmllZCAoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKnJlc3VsdCwgaW50IGlzZnVuY25hbWUsIGludCBhcHBlbmQpOwotCi1ERVNDUklQVElPTgotCi0JRGVtYW5nbGUgYSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiUTI1T3V0ZXI1SW5uZXIiIHdoaWNoIGlzCi0JdGhlIG1hbmdsZWQgZm9ybSBvZiAiT3V0ZXI6OklubmVyIi4gIFRoZSBkZW1hbmdsZWQgb3V0cHV0IGlzCi0JcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUKLQlzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuCi0KLQlJZiBpc2Z1bmNuYW1lIGlzIG5vbnplcm8sIHRoZW4gdGhlIHF1YWxpZmllZCBuYW1lIHdlIGFyZSBidWlsZGluZwotCWlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYSBtZW1iZXIgZnVuY3Rpb24gbmFtZSwgc28gaWYgaXQgaXMgYQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgZnVuY3Rpb24sIGFwcGVuZCBhbiBhcHByb3ByaWF0ZQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIEkuRS4gZm9yIHRoZSBhYm92ZSBleGFtcGxlLAotCXRoZSByZXN1bHQgZm9yIHVzZSBhcyBhIGNvbnN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6OklubmVyIgotCWFuZCB0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBkZXN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6On5Jbm5lciIuCi0KLUJVR1MKLQotCU51bWVyaWMgY29udmVyc2lvbiBpcyBBU0NJSSBkZXBlbmRlbnQgKEZJWE1FKS4KLQotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBpc2Z1bmNuYW1lLCBhcHBlbmQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci0gICAgIGludCBpc2Z1bmNuYW1lOwotICAgICBpbnQgYXBwZW5kOwotewotICBpbnQgcXVhbGlmaWVycyA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY2hhciBudW1bMl07Ci0gIHN0cmluZyB0ZW1wOwotICBzdHJpbmcgbGFzdF9uYW1lOwotICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotCi0gIC8qIFdlIG9ubHkgbWFrZSB1c2Ugb2YgSVNGVU5DTkFNRSBpZiB0aGUgZW50aXR5IGlzIGEgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3Rvci4gICovCi0gIGlzZnVuY25hbWUgPSAoaXNmdW5jbmFtZQotCQkmJiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkpOwotCi0gIHN0cmluZ19pbml0ICgmdGVtcCk7Ci0gIHN0cmluZ19pbml0ICgmbGFzdF9uYW1lKTsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnSycpCi0gICAgewotICAgIC8qIFNxdWFuZ2xpbmcgcXVhbGlmaWVkIG5hbWUgcmV1c2UgKi8KLSAgICAgIGludCBpZHg7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgaWYgKGlkeCA9PSAtMSB8fCBpZHggPj0gd29yayAtPiBudW1rKQotICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmsgLT4ga3R5cGV2ZWNbaWR4XSk7Ci0gICAgfQotICBlbHNlCi0gICAgc3dpdGNoICgoKm1hbmdsZWQpWzFdKQotICAgIHsKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIEdOVSBtYW5nbGVkIG5hbWUgd2l0aCBtb3JlIHRoYW4gOSBjbGFzc2VzLiAgVGhlIGNvdW50IGlzIHByZWNlZGVkCi0JIGJ5IGFuIHVuZGVyc2NvcmUgKHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIDw9IDkgY2FzZSkgYW5kIGZvbGxvd2VkCi0JIGJ5IGFuIHVuZGVyc2NvcmUuICAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgcXVhbGlmaWVycyA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAocXVhbGlmaWVycyA9PSAtMSkKLQlzdWNjZXNzID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICAvKiBUaGUgY291bnQgaXMgaW4gYSBzaW5nbGUgZGlnaXQuICAqLwotICAgICAgbnVtWzBdID0gKCptYW5nbGVkKVsxXTsKLSAgICAgIG51bVsxXSA9ICdcMCc7Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAobnVtKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYW4gdW5kZXJzY29yZSBhZnRlciB0aGUgZGlnaXQsIHNraXAgaXQuICBUaGlzIGlzCi0JIHNhaWQgdG8gYmUgZm9yIEFSTS1xdWFsaWZpZWQgbmFtZXMsIGJ1dCB0aGUgQVJNIG1ha2VzIG5vCi0JIG1lbnRpb24gb2Ygc3VjaCBhbiB1bmRlcnNjb3JlLiAgUGVyaGFwcyBjZnJvbnQgdXNlcyBvbmUuICAqLwotICAgICAgaWYgKCgqbWFuZ2xlZClbMl0gPT0gJ18nKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICAoKm1hbmdsZWQpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0KLSAgaWYgKCFzdWNjZXNzKQotICAgIHJldHVybiBzdWNjZXNzOwotCi0gIC8qIFBpY2sgb2ZmIHRoZSBuYW1lcyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0ZW1wIGJ1ZmZlciBpbiB0aGUgb3JkZXIKLSAgICAgaW4gd2hpY2ggdGhleSBhcmUgZm91bmQsIHNlcGFyYXRlZCBieSAnOjonLiAgKi8KLQotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpbnQgcmVtZW1iZXJfSyA9IDE7Ci0gICAgICBzdHJpbmdfY2xlYXIgKCZsYXN0X25hbWUpOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ18nKQotCSgqbWFuZ2xlZCkrKzsKLQotICAgICAgaWYgKCptYW5nbGVkWzBdID09ICd0JykKLQl7Ci0JICAvKiBIZXJlIHdlIGFsd2F5cyBhcHBlbmQgdG8gVEVNUCBzaW5jZSB3ZSB3aWxsIHdhbnQgdG8gdXNlCi0JICAgICB0aGUgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIGEKLQkgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIFRoZSBhcHByb3ByaWF0ZQotCSAgICAgKHBhcmFtZXRlci1sZXNzKSB2YWx1ZSBpcyByZXR1cm5lZCBieSBkZW1hbmdsZV90ZW1wbGF0ZQotCSAgICAgaW4gTEFTVF9OQU1FLiAgV2UgZG8gbm90IHJlbWVtYmVyIHRoZSB0ZW1wbGF0ZSB0eXBlIGhlcmUsCi0JICAgICBpbiBvcmRlciB0byBtYXRjaCB0aGUgRysrIG1hbmdsaW5nIGFsZ29yaXRobS4gICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUod29yaywgbWFuZ2xlZCwgJnRlbXAsCi0JCQkJICAgICAgJmxhc3RfbmFtZSwgMSwgMCk7Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKCptYW5nbGVkWzBdID09ICdLJykKLQl7Ci0gICAgICAgICAgaW50IGlkeDsKLSAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrLT5udW1rKQotICAgICAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmstPmt0eXBldmVjW2lkeF0pOwotICAgICAgICAgIHJlbWVtYmVyX0sgPSAwOwotCi0JICBpZiAoIXN1Y2Nlc3MpIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICB7Ci0JICAgICAgaW50IG5hbWVsZW5ndGg7Ci0gCSAgICAgIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgcXVhbGlmaWVyCi0gCSAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRlYWwgd2l0aCB0ZW1wbGF0ZXMgaW4KLSAJICAgICAgICogbWFuZ2xpbmcgc3R5bGVzIGxpa2UgRURHICovCi0JICAgICAgbmFtZWxlbmd0aCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgICAgIGlmIChuYW1lbGVuZ3RoID09IC0xKQotCQl7Ci0JCSAgc3VjY2VzcyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLSAJICAgICAgcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgJnRlbXAsIG5hbWVsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZsYXN0X25hbWUpOwotICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRzICgmdGVtcCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0JfQotCi0gICAgICBpZiAocmVtZW1iZXJfSykKLQlyZW1lbWJlcl9LdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCkpOwotCi0gICAgICBpZiAocXVhbGlmaWVycyA+IDApCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgIH0KLQotICByZW1lbWJlcl9CdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCksIGJpbmRleCk7Ci0KLSAgLyogSWYgd2UgYXJlIHVzaW5nIHRoZSByZXN1bHQgYXMgYSBmdW5jdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGFwcGVuZAotICAgICB0aGUgYXBwcm9wcmlhdGUgJzo6JyBzZXBhcmF0ZWQgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLgotICAgICBXZSBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgcGxhY2UsIHdoZXJlCi0gICAgIHdlIGFscmVhZHkgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuICAqLwotCi0gIGlmIChpc2Z1bmNuYW1lKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICAgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCAifiIpOwotICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGVpdGhlciBwcmVwZW5kIHRoZSB0ZW1wIGJ1ZmZlciB0byB0aGUgcmVzdWx0LCBvciBhcHBlbmQgaXQsCi0gICAgIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuICAqLwotCi0gIGlmIChhcHBlbmQpCi0gICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChyZXN1bHQsICZ0ZW1wKTsKLSAgICB9Ci0KLSAgc3RyaW5nX2RlbGV0ZSAoJmxhc3RfbmFtZSk7Ci0gIHN0cmluZ19kZWxldGUgKCZ0ZW1wKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdldF9jb3VudCAtLSBjb252ZXJ0IGFuIGFzY2lpIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnZXRfY291bnQgKGNvbnN0IGNoYXIgKip0eXBlLCBpbnQgKmNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQXNzdW1lIHRoYXQgKnR5cGUgcG9pbnRzIGF0IGEgY291bnQgaW4gYSBtYW5nbGVkIG5hbWU7IHNldAotCSpjb3VudCB0byBpdHMgdmFsdWUsIGFuZCBzZXQgKnR5cGUgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyCi0JdGhlIGNvdW50LiAgVGhlcmUgYXJlIHNvbWUgd2VpcmQgcnVsZXMgaW4gZWZmZWN0IGhlcmUuCi0KLQlJZiAqdHlwZSBkb2VzIG5vdCBwb2ludCBhdCBhIHN0cmluZyBvZiBkaWdpdHMsIHJldHVybiB6ZXJvLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIHNldCAqY291bnQgdG8gdGhlaXIgdmFsdWUgYXMgYW4gaW50ZWdlciwgYWR2YW5jZQotCSp0eXBlIHRvIHBvaW50ICphZnRlciB0aGUgdW5kZXJzY29yZSwgYW5kIHJldHVybiAxLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBub3QgZm9sbG93ZWQgYnkgYW4KLQl1bmRlcnNjb3JlLCBjb25zdW1lIG9ubHkgdGhlIGZpcnN0IGRpZ2l0LiAgU2V0ICpjb3VudCB0byBpdHMKLQl2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBsZWF2ZSAqdHlwZSBwb2ludGluZyBhZnRlciB0aGF0IGRpZ2l0LAotCWFuZCByZXR1cm4gMS4KLQotICAgICAgICBUaGUgZXhjdXNlIGZvciB0aGlzIG9kZCBiZWhhdmlvcjogaW4gdGhlIEFSTSBhbmQgSFAgZGVtYW5nbGluZwotICAgICAgICBzdHlsZXMsIGEgdHlwZSBjYW4gYmUgZm9sbG93ZWQgYnkgYSByZXBlYXQgY291bnQgb2YgdGhlIGZvcm0KLSAgICAgICAgYE54eScsIHdoZXJlOgotCi0gICAgICAgIGB4JyBpcyBhIHNpbmdsZSBkaWdpdCBzcGVjaWZ5aW5nIGhvdyBtYW55IGFkZGl0aW9uYWwgY29waWVzCi0gICAgICAgICAgICBvZiB0aGUgdHlwZSB0byBhcHBlbmQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZAotCi0gICAgICAgIGB5JyBpcyBvbmUgb3IgbW9yZSBkaWdpdHMsIHNwZWNpZnlpbmcgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YKLSAgICAgICAgICAgIHRoZSBmaXJzdCByZXBlYXRlZCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIFllcywgYXMgeW91J3JlCi0gICAgICAgICAgICB1bm1hbmdsaW5nIHRoZSBuYW1lIHlvdSBjYW4gZmlndXJlIHRoaXMgb3V0IHlvdXJzZWxmLCBidXQKLSAgICAgICAgICAgIGl0J3MgdGhlcmUgYW55d2F5LgotCi0gICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgaW4gYGJhcl9fM2Zvb0ZQaU41MScsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gaW50ZWdlciAoYFBpJyksIGFuZCB0aGVuIHRoZSBuZXh0IGZpdmUgYXJndW1lbnRzCi0gICAgICAgIGFyZSB0aGUgc2FtZSAoYE41JyksIGFuZCB0aGUgZmlyc3QgcmVwZWF0IGlzIHRoZSBmdW5jdGlvbidzCi0gICAgICAgIHNlY29uZCBhcmd1bWVudCAoYDEnKS4KLSovCi0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCAodHlwZSwgY291bnQpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotICAgICBpbnQgKmNvdW50OwotewotICBjb25zdCBjaGFyICpwOwotICBpbnQgbjsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgcmV0dXJuICgwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICpjb3VudCA9ICoqdHlwZSAtICcwJzsKLSAgICAgICgqdHlwZSkrKzsKLSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotCXsKLQkgIHAgPSAqdHlwZTsKLQkgIG4gPSAqY291bnQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgbiAqPSAxMDsKLQkgICAgICBuICs9ICpwIC0gJzAnOwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSk7Ci0JICBpZiAoKnAgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKnR5cGUgPSBwICsgMTsKLQkgICAgICAqY291bnQgPSBuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogUkVTVUxUIHdpbGwgYmUgaW5pdGlhbGlzZWQgaGVyZTsgaXQgd2lsbCBiZSBmcmVlZCBvbiBmYWlsdXJlLiAgVGhlCi0gICB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IG47Ci0gIGludCBkb25lOwotICBpbnQgc3VjY2VzczsKLSAgc3RyaW5nIGRlY2w7Ci0gIGNvbnN0IGNoYXIgKnJlbWVtYmVyZWRfdHlwZTsKLSAgaW50IHR5cGVfcXVhbHM7Ci0gIHN0cmluZyBidHlwZTsKLSAgdHlwZV9raW5kX3QgdGsgPSB0a19ub25lOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotICBzdHJpbmdfaW5pdCAocmVzdWx0KTsKLQotICBkb25lID0gMDsKLSAgc3VjY2VzcyA9IDE7Ci0gIHdoaWxlIChzdWNjZXNzICYmICFkb25lKQotICAgIHsKLSAgICAgIGludCBtZW1iZXI7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0KLQkgIC8qIEEgcG9pbnRlciB0eXBlICovCi0JY2FzZSAnUCc6Ci0JY2FzZSAncCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoISAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKSkKLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKiIpOwotCSAgaWYgKHRrID09IHRrX25vbmUpCi0JICAgIHRrID0gdGtfcG9pbnRlcjsKLQkgIGJyZWFrOwotCi0JICAvKiBBIHJlZmVyZW5jZSB0eXBlICovCi0JY2FzZSAnUic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICImIik7Ci0JICBpZiAodGsgPT0gdGtfbm9uZSkKLQkgICAgdGsgPSB0a19yZWZlcmVuY2U7Ci0JICBicmVhazsKLQotCSAgLyogQW4gYXJyYXkgKi8KLQljYXNlICdBJzoKLQkgIHsKLQkgICAgKysoKm1hbmdsZWQpOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICAgIHsKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCQlzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgICB9Ci0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiWyIpOwotCSAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgJmRlY2wsCi0JCQkJCQkgICAgICB0a19pbnRlZ3JhbCk7Ci0JICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCSAgICAgICsrKCptYW5nbGVkKTsKLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICJdIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiB0eXBlICovCi0JY2FzZSAnVCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJm4pIHx8IG4gPj0gd29yayAtPiBudHlwZXMpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJlZF90eXBlID0gd29yayAtPiB0eXBldmVjW25dOwotCSAgICAgIG1hbmdsZWQgPSAmcmVtZW1iZXJlZF90eXBlOwotCSAgICB9Ci0JICBicmVhazsKLQotCSAgLyogQSBmdW5jdGlvbiAqLwotCWNhc2UgJ0YnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICB9Ci0JICAvKiBBZnRlciBwaWNraW5nIG9mZiB0aGUgZnVuY3Rpb24gYXJncywgd2UgZXhwZWN0IHRvIGVpdGhlciBmaW5kIHRoZQotCSAgICAgZnVuY3Rpb24gcmV0dXJuIHR5cGUgKHByZWNlZGVkIGJ5IGFuICdfJykgb3IgdGhlIGVuZCBvZiB0aGUKLQkgICAgIHN0cmluZy4gICovCi0JICBpZiAoIWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCAmZGVjbCkKLQkgICAgICB8fCAoKiptYW5nbGVkICE9ICdfJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCA9PSAnXycpKQotCSAgICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCWNhc2UgJ08nOgotCSAgewotCSAgICB0eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKLQotCSAgICBtZW1iZXIgPSAqKm1hbmdsZWQgPT0gJ00nOwotCSAgICAoKm1hbmdsZWQpKys7Ci0KLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0KLQkgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBwcmVwZW5kIGA6OicgZm9yIGEgcXVhbGlmaWVkIG5hbWU7Ci0JICAgICAgIGRlbWFuZ2xlX3F1YWxpZmllZCB3aWxsIGRvIHRoYXQgZm9yIHVzLiAgKi8KLQkgICAgaWYgKCoqbWFuZ2xlZCAhPSAnUScpCi0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQotCSAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgICB7Ci0JCW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkJaWYgKG4gPT0gLTEKLQkJICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgbikKLQkJICB7Ci0JCSAgICBzdWNjZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJc3RyaW5nX3ByZXBlbmRuICgmZGVjbCwgKm1hbmdsZWQsIG4pOwotCQkqbWFuZ2xlZCArPSBuOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdYJyB8fCAqKm1hbmdsZWQgPT0gJ1knKQotCSAgICAgIHsKLQkJc3RyaW5nIHRlbXA7Ci0JCWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkJc3RyaW5nX3ByZXBlbmRzICgmZGVjbCwgJnRlbXApOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd0JykKLQkgICAgICB7Ci0JCXN0cmluZyB0ZW1wOwotCQlzdHJpbmdfaW5pdCAoJnRlbXApOwotCQlzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wLAotCQkJCQkgICAgIE5VTEwsIDEsIDEpOwotCQlpZiAoc3VjY2VzcykKLQkJICB7Ci0JCSAgICBzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCB0ZW1wLmIsIHRlbXAucCAtIHRlbXAuYik7Ci0JCSAgICBzdHJpbmdfY2xlYXIgKCZ0ZW1wKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCoqbWFuZ2xlZCA9PSAnUScpCi0JICAgICAgewotCQlzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCAmZGVjbCwKLQkJCQkJICAgICAgLyppc2Z1bmNuYW09Ki8wLCAKLQkJCQkJICAgICAgLyphcHBlbmQ9Ki8wKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JICAgIGlmIChtZW1iZXIpCi0JICAgICAgewotCQlzd2l0Y2ggKCoqbWFuZ2xlZCkKLQkJICB7Ci0JCSAgY2FzZSAnQyc6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAndSc6Ci0JCSAgICB0eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKLQkJICAgICgqbWFuZ2xlZCkrKzsKLQkJICAgIGJyZWFrOwotCi0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQlpZiAoKigqbWFuZ2xlZCkrKyAhPSAnRicpCi0JCSAgewotCQkgICAgc3VjY2VzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoKG1lbWJlciAmJiAhZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKSkKLQkJfHwgKiptYW5nbGVkICE9ICdfJykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCEgUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICAgIHsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQotCSAgICAgIHsKLQkJQVBQRU5EX0JMQU5LICgmZGVjbCk7Ci0JCXN0cmluZ19hcHBlbmQgKCZkZWNsLCBxdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKSk7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLSAgICAgICAgY2FzZSAnRyc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgewotCSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCi0JCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiAiKTsKLQotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0JICAvKgotCSAgICB9Ci0JICAgICovCi0KLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIC8qIEEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIk91dGVyOjpJbm5lciIuICAqLwotICAgIGNhc2UgJ1EnOgotICAgIGNhc2UgJ0snOgotICAgICAgewotICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIDAsIDEpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gc3F1YW5nbGVkIHR5cGUgKi8KLSAgICBjYXNlICdCJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG51bWIpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0Jc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT5idHlwZXZlY1tuXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ1knOgotICAgICAgLyogQSB0ZW1wbGF0ZSBwYXJtLiAgV2Ugc3Vic3RpdHV0ZSB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4gKi8KLSAgICAgIHsKLQlpbnQgaWR4OwotCi0JKCptYW5nbGVkKSsrOwotCWlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0KLQlpZiAoaWR4ID09IC0xCi0JICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQkgIHsKLQkgICAgc3VjY2VzcyA9IDA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQllbHNlCi0JICBzdHJpbmdfYXBwZW5kX3RlbXBsYXRlX2lkeCAocmVzdWx0LCBpZHgpOwotCi0Jc3VjY2VzcyA9IDE7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KTsKLSAgICAgIGlmICh0ayA9PSB0a19ub25lKQotCXRrID0gKHR5cGVfa2luZF90KSBzdWNjZXNzOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChzdWNjZXNzKQotICAgIHsKLSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmRlY2wpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdHJpbmdfZGVsZXRlIChyZXN1bHQpOwotICBzdHJpbmdfZGVsZXRlICgmZGVjbCk7Ci0KLSAgaWYgKHN1Y2Nlc3MpCi0gICAgLyogQXNzdW1lIGFuIGludGVncmFsIHR5cGUsIGlmIHdlJ3JlIG5vdCBzdXJlLiAgKi8KLSAgICByZXR1cm4gKGludCkgKCh0ayA9PSB0a19ub25lKSA/IHRrX2ludGVncmFsIDogdGspOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmVuIGEgcG9pbnRlciB0byBhIHR5cGUgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHR5cGUKLSAgIGFyZ3VtZW50IChpbnQsIGxvbmcsIHVuc2lnbmVkIGludCwgZXRjKSBpbiBUWVBFLCBhIHBvaW50ZXIgdG8gdGhlCi0gICBzdHJpbmcgaW4gd2hpY2ggdGhlIGRlbWFuZ2xlZCBvdXRwdXQgaXMgYmVpbmcgYnVpbHQgaW4gUkVTVUxULCBhbmQKLSAgIHRoZSBXT1JLIHN0cnVjdHVyZSwgZGVjb2RlIHRoZSB0eXBlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHJlc3VsdC4KLQotICAgRm9yIGV4YW1wbGU6Ci0KLSAgIAkiQ2kiCT0+CSJjb25zdCBpbnQiCi0JIlNsIgk9Pgkic2lnbmVkIGxvbmciCi0JIkNVcyIJPT4JImNvbnN0IHVuc2lnbmVkIHNob3J0IgotCi0gICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgcmVhbGx5IGEgdHlwZV9raW5kX3QuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IGRvbmUgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNoYXIgYnVmWzEwXTsKLSAgaW50IGRlYyA9IDA7Ci0gIHN0cmluZyBidHlwZTsKLSAgdHlwZV9raW5kX3QgdGsgPSB0a19pbnRlZ3JhbDsKLQotICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLQotICAvKiBGaXJzdCBwaWNrIG9mZiBhbnkgdHlwZSBxdWFsaWZpZXJzLiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUuICAqLwotCi0gIHdoaWxlICghZG9uZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICBpZiAoUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICB7Ci0gICAgICAgICAgICAgIGlmICghU1RSSU5HX0VNUFRZIChyZXN1bHQpKQotICAgICAgICAgICAgICAgIHN0cmluZ19wcmVwZW5kIChyZXN1bHQsICIgIik7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnVSc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ1bnNpZ25lZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6IC8qIHNpZ25lZCBjaGFyIG9ubHkgKi8KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNpZ25lZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJfX2NvbXBsZXgiKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHBpY2sgb2ZmIHRoZSBmdW5kYW1lbnRhbCB0eXBlLiAgVGhlcmUgY2FuIGJlIG9ubHkgb25lLiAgKi8KLQotICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgIGNhc2UgJ18nOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ2b2lkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd4JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgbG9uZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImludCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJib29sIik7Ci0gICAgICB0ayA9IHRrX2Jvb2w7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImNoYXIiKTsKLSAgICAgIHRrID0gdGtfY2hhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3cnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAid2NoYXJfdCIpOwotICAgICAgdGsgPSB0a19jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIGRvdWJsZSIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJkb3VibGUiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiZmxvYXQiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIGNhc2UgJ0knOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0JewotCSAgaW50IGk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBmb3IgKGkgPSAwOwotCSAgICAgICBpIDwgKGxvbmcpIHNpemVvZiAoYnVmKSAtIDEgJiYgKiptYW5nbGVkICYmICoqbWFuZ2xlZCAhPSAnXyc7Ci0JICAgICAgICgqbWFuZ2xlZCkrKywgaSsrKQotCSAgICBidWZbaV0gPSAqKm1hbmdsZWQ7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBidWZbaV0gPSAnXDAnOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJuY3B5IChidWYsICptYW5nbGVkLCAyKTsKLQkgIGJ1ZlsyXSA9ICdcMCc7Ci0JICAqbWFuZ2xlZCArPSBtaW4gKHN0cmxlbiAoKm1hbmdsZWQpLCAyKTsKLQl9Ci0gICAgICBzc2NhbmYgKGJ1ZiwgIiV4IiwgJmRlYyk7Ci0gICAgICBzcHJpbnRmIChidWYsICJpbnQlaV90IiwgZGVjKTsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgYnVmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIC8qIEFuIGV4cGxpY2l0IHR5cGUsIHN1Y2ggYXMgIjZteXR5cGUiIG9yICI3aW50ZWdlciIgKi8KLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIHsKLSAgICAgICAgaW50IGJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLSAgICAgICAgc3RyaW5nIGJ0eXBlOwotICAgICAgICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLSAgICAgICAgaWYgKGRlbWFuZ2xlX2NsYXNzX25hbWUgKHdvcmssIG1hbmdsZWQsICZidHlwZSkpIHsKLSAgICAgICAgICByZW1lbWJlcl9CdHlwZSAod29yaywgYnR5cGUuYiwgTEVOX1NUUklORyAoJmJ0eXBlKSwgYmluZGV4KTsKLSAgICAgICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICAgIHN0cmluZ19kZWxldGUgKCZidHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgJ3QnOgotICAgICAgewotICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZidHlwZSwgMCwgMSwgMSk7Ci0gICAgICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZidHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gc3VjY2VzcyA/ICgoaW50KSB0aykgOiAwOwotfQotCi0KLS8qIEhhbmRsZSBhIHRlbXBsYXRlJ3MgdmFsdWUgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKLSAgICoqbWFuZ2xlZCBwb2ludHMgdG8gJ1MnIG9yICdVJyAqLwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yayBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCB1bnNpZ25lZF9jb25zdDsKLQotICBpZiAoKiptYW5nbGVkICE9ICdVJyAmJiAqKm1hbmdsZWQgIT0gJ1MnKQotICAgIHJldHVybiAwOwotCi0gIHVuc2lnbmVkX2NvbnN0ID0gKCoqbWFuZ2xlZCA9PSAnVScpOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgICBjYXNlICdOJzoKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLSIpOwotICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgJ1AnOgotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTSc6Ci0gICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgLTJeMzEgKi8KLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLTIxNDc0ODM2NDgiKTsKLSAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGJlIGxvb2tpbmcgYXQgYW4gaW50ZWdlciBub3cgKi8KLSAgaWYgKCEoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2Ugb25seSBkZWFsIHdpdGggaW50ZWdyYWwgdmFsdWVzIGZvciB0ZW1wbGF0ZQotICAgICBwYXJhbWV0ZXJzIC0tIHNvIGl0J3MgT0sgdG8gbG9vayBvbmx5IGZvciBkaWdpdHMgKi8KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKm1hbmdsZWQ7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGNoYXJfc3RyKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgaWYgKHVuc2lnbmVkX2NvbnN0KQotICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIlUiKTsKLQotICAvKiBGSVhNRT8gU29tZSBkYXkgd2UgbWF5IGhhdmUgNjQtYml0IChvciBsYXJnZXIgOi0pICkgY29uc3RhbnRzCi0gICAgIHdpdGggTCBvciBMTCBzdWZmaXhlcy4gcGFpLzE5OTctMDktMDMgKi8KLQotICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLwotfQotCi0vKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIGxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKLSAgICoqbWFuZ2xlZCBpcyBwb2ludGluZyB0byB0aGUgJ0EnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IGxpdGVyYWxfbGVuID0gMDsKLSAgY2hhciAqIHJlY3Vyc2U7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbTsKLQotICBpZiAoKiptYW5nbGVkICE9ICdBJykKLSAgICByZXR1cm4gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0KLSAgbGl0ZXJhbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQotICBpZiAobGl0ZXJhbF9sZW4gPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMaXRlcmFsIHBhcmFtZXRlcnMgYXJlIG5hbWVzIG9mIGFycmF5cywgZnVuY3Rpb25zLCBldGMuICBhbmQgdGhlCi0gICAgIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzIHRoZSBhZGRyZXNzIG9wZXJhdG9yICovCi0gIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiYiKTsKLQotICAvKiBOb3cgcmVjdXJzaXZlbHkgZGVtYW5nbGUgdGhlIGxpdGVyYWwgbmFtZSAqLwotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobGl0ZXJhbF9sZW4gKyAxKTsKLSAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICByZWN1cnNlW2xpdGVyYWxfbGVuXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIGxpdGVyYWxfbGVuKTsKLSAgICB9Ci0gICgqbWFuZ2xlZCkgKz0gbGl0ZXJhbF9sZW47Ci0gIGZyZWUgKHJlY3Vyc2UpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zbmFyZl9udW1lcmljX2xpdGVyYWwgKGFyZ3MsIGFyZykKLSAgICAgY29uc3QgY2hhciAqKiBhcmdzOwotICAgICBzdHJpbmcgKiBhcmc7Ci17Ci0gIGlmICgqKmFyZ3MgPT0gJy0nKQotICAgIHsKLSAgICAgIGNoYXJfc3RyWzBdID0gJy0nOwotICAgICAgc3RyaW5nX2FwcGVuZCAoYXJnLCBjaGFyX3N0cik7Ci0gICAgICAoKmFyZ3MpKys7Ci0gICAgfQotICBlbHNlIGlmICgqKmFyZ3MgPT0gJysnKQotICAgICgqYXJncykrKzsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKmFyZ3M7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBuZXh0IGFyZ3VtZW50LCBnaXZlbiBieSBNQU5HTEVEIGludG8gUkVTVUxULCB3aGljaAotICAgKnNob3VsZCBiZSBhbiB1bmluaXRpYWxpemVkKiBzdHJpbmcuICBJdCB3aWxsIGJlIGluaXRpYWxpemVkIGhlcmUsCi0gICBhbmQgZnJlZSdkIHNob3VsZCBhbnl0aGluZyBnbyB3cm9uZy4gICovCi0KLXN0YXRpYyBpbnQKLWRvX2FyZyAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkIHNvIHRoYXQgd2UgY2FuIHJlY29yZCB0aGUgdHlwZSwgZm9yCi0gICAgIG5vbi1zcXVhbmdsaW5nIHR5cGUgcmVtZW1iZXJpbmcuICAqLwotICBjb25zdCBjaGFyICpzdGFydCA9ICptYW5nbGVkOwotCi0gIHN0cmluZ19pbml0IChyZXN1bHQpOwotCi0gIGlmICh3b3JrLT5ucmVwZWF0cyA+IDApCi0gICAgewotICAgICAgLS13b3JrLT5ucmVwZWF0czsKLQotICAgICAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdG8gcmVpc3N1ZSB0aGUgcHJldmlvdXMgdHlwZSBpbiB0aGlzIGFyZ3VtZW50IGxpc3QuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ24nKQotICAgIHsKLSAgICAgIC8qIEEgc3F1YW5nbGluZy1zdHlsZSByZXBlYXQuICAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd29yay0+bnJlcGVhdHMgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPD0gMCkKLQkvKiBUaGlzIHdhcyBub3QgYSByZXBlYXQgY291bnQgYWZ0ZXIgYWxsLiAgKi8KLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKHdvcmstPm5yZXBlYXRzID4gOSkKLQl7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgLyogVGhlIHJlcGVhdCBjb3VudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gJ18nIGluIHRoaXMKLQkgICAgICAgY2FzZS4gICovCi0JICAgIHJldHVybiAwOwotCSAgZWxzZQotCSAgICAoKm1hbmdsZWQpKys7Ci0JfQotCi0gICAgICAvKiBOb3csIHRoZSByZXBlYXQgaXMgYWxsIHNldCB1cC4gICovCi0gICAgICByZXR1cm4gZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSByZXN1bHQgaW4gV09SSy0+cHJldmlvdXNfYXJndW1lbnQgc28gdGhhdCB3ZSBjYW4gZmluZCBpdAotICAgICBpZiBpdCdzIHJlcGVhdGVkLiAgTm90ZSB0aGF0IHNhdmluZyBTVEFSVCBpcyBub3QgZ29vZCBlbm91Z2g6IHdlCi0gICAgIGRvIG5vdCB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIHR5cGVzIHRvIHRoZSBiYWNrLXJlZmVyZW5jZWFibGUKLSAgICAgdHlwZSB2ZWN0b3Igd2hlbiBwcm9jZXNzaW5nIGEgcmVwZWF0ZWQgdHlwZS4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfY2xlYXIgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gKHN0cmluZyopIHhtYWxsb2MgKHNpemVvZiAoc3RyaW5nKSk7Ci0gICAgICBzdHJpbmdfaW5pdCAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgIH0KLQotICBpZiAoIWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KSkKLSAgICByZXR1cm4gMDsKLQotICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0KLSAgcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsICptYW5nbGVkIC0gc3RhcnQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrLT5mb3JnZXR0aW5nX3R5cGVzKQotICAgIHJldHVybjsKLQotICBpZiAod29yayAtPiBudHlwZXMgPj0gd29yayAtPiB0eXBldmVjX3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY19zaXplID09IDApCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgPSAzOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgKj0gMjsKLQkgIHdvcmsgLT4gdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IHR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IHR5cGV2ZWNbd29yayAtPiBudHlwZXMrK10gPSB0ZW07Ci19Ci0KLQotLyogUmVtZW1iZXIgYSBLIHR5cGUgY2xhc3MgcXVhbGlmaWVyLiAqLwotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0t0eXBlICh3b3JrLCBzdGFydCwgbGVuKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnRlbTsKLQotICBpZiAod29yayAtPiBudW1rID49IHdvcmsgLT4ga3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4ga3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGtzaXplID0gNTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmsgLT4ga3NpemUgKj0gMjsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiBrdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4ga3NpemUpOwotCX0KLSAgICB9Ci0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBrdHlwZXZlY1t3b3JrIC0+IG51bWsrK10gPSB0ZW07Ci19Ci0KLS8qIFJlZ2lzdGVyIGEgQiBjb2RlLCBhbmQgZ2V0IGFuIGluZGV4IGZvciBpdC4gQiBjb2RlcyBhcmUgcmVnaXN0ZXJlZAotICAgYXMgdGhleSBhcmUgc2VlbiwgcmF0aGVyIHRoYW4gYXMgdGhleSBhcmUgY29tcGxldGVkLCBzbyBtYXA8dGVtcDxjaGFyPiA+Ci0gICByZWdpc3RlcnMgbWFwPHRlbXA8Y2hhcj4gPiBhcyBCMCwgYW5kIHRlbXA8Y2hhcj4gYXMgQjEgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfQnR5cGUgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICBpbnQgcmV0OwotCi0gIGlmICh3b3JrIC0+IG51bWIgPj0gd29yayAtPiBic2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBic2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gYnNpemUgPSA1OwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBic2l6ZSAqPSAyOwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGJ0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBic2l6ZSk7Ci0JfQotICAgIH0KLSAgcmV0ID0gd29yayAtPiBudW1iKys7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbcmV0XSA9IE5VTEw7Ci0gIHJldHVybihyZXQpOwotfQotCi0vKiBTdG9yZSBhIHZhbHVlIGludG8gYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQiBjb2RlIHR5cGUuICovCi0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9CdHlwZSAod29yaywgc3RhcnQsIGxlbiwgaW5kZXgpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbiwgaW5kZXg7Ci17Ci0gIGNoYXIgKnRlbTsKLQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbaW5kZXhdID0gdGVtOwotfQotCi0vKiBMb3NlIGFsbCB0aGUgaW5mbyByZWxhdGVkIHRvIEIgYW5kIEsgdHlwZSBjb2Rlcy4gKi8KLXN0YXRpYyB2b2lkCi1mb3JnZXRfQl9hbmRfS190eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG51bWsgPiAwKQotICAgIHsKLSAgICAgIGkgPSAtLSh3b3JrIC0+IG51bWspOwotICAgICAgaWYgKHdvcmsgLT4ga3R5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IGt0eXBldmVjW2ldKTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtYiA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtYik7Ci0gICAgICBpZiAod29yayAtPiBidHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gYnR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBidHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLS8qIEZvcmdldCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgYnV0IG5vdCB0aGUgdHlwZSB2ZWN0b3IgaXRzZWxmLiAgKi8KLQotc3RhdGljIHZvaWQKLWZvcmdldF90eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG50eXBlcyA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnR5cGVzKTsKLSAgICAgIGlmICh3b3JrIC0+IHR5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IHR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiB0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIHRoZSBhcmd1bWVudCBsaXN0IHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYWZ0ZXIgYW55IGNsYXNzIHNwZWMKLSAgIGhhcyBiZWVuIGNvbnN1bWVkLCBhcyB3ZWxsIGFzIHRoZSBmaXJzdCAnRicgY2hhcmFjdGVyIChpZiBhbnkpLiAgRm9yCi0gICBleGFtcGxlOgotCi0gICAiX19hbHNfXzNmb29SVDAiCQk9Pglwcm9jZXNzICJSVDAiCi0gICAiY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaSIJPT4JcHJvY2VzcyAiUEZQY19QRmxfaSIKLQotICAgREVDTFAgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpc2VkLCB1c3VhbGx5IG5vbi1lbXB0eS4gIEl0IHdvbid0IGJlIGZyZWVkCi0gICBvbiBmYWlsdXJlLgotCi0gICBOb3RlIHRoYXQgZysrIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIEFSTSBhbmQgbHVjaWQgc3R5bGUgbWFuZ2xpbmcKLSAgIHdpdGggcmVnYXJkcyB0byByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgc2VlbiB0eXBlcy4gIEZvciBleGFtcGxlLCBnaXZlbgotICAgdGhlIHNvdXJjZSBmcmFnbWVudDoKLQotICAgICBjbGFzcyBmb28gewotICAgICAgIHB1YmxpYzoKLSAgICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYyk7Ci0gICAgIH07Ci0KLSAgICAgZm9vOjpmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0gICAgIHZvaWQgZm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKSB7IGlhID0gaWIgPSBpYzsgfQotCi0gICBnKysgcHJvZHVjZXMgdGhlIG5hbWVzOgotCi0gICAgIF9fM2Zvb2lSVDBpVDJpVDIKLSAgICAgZm9vX19GaVIzZm9vaVQxaVQxCi0KLSAgIHdoaWxlIGxjYyAoYW5kIHByZXN1bWFibHkgb3RoZXIgQVJNIHN0eWxlIGNvbXBpbGVycyBhcyB3ZWxsKSBwcm9kdWNlczoKLQotICAgICBmb29fX0ZpUjNmb29UMVQyVDFUMgotICAgICBfX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCi0KLSAgIE5vdGUgdGhhdCBnKysgYmFzZXMgaXRzIHR5cGUgbnVtYmVycyBzdGFydGluZyBhdCB6ZXJvIGFuZCBjb3VudHMgYWxsCi0gICBwcmV2aW91c2x5IHNlZW4gdHlwZXMsIHdoaWxlIGx1Y2lkL0FSTSBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nCi0gICBhdCBvbmUgYW5kIG9ubHkgY29uc2lkZXJzIHR5cGVzIGFmdGVyIGl0IGhhcyBzZWVuIHRoZSAnRicgY2hhcmFjdGVyCi0gICBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJncy4gIEZvciBsdWNpZC9BUk0gc3R5bGUsIHdlCi0gICBhY2NvdW50IGZvciB0aGlzIGRpZmZlcmVuY2UgYnkgZGlzY2FyZGluZyBhbnkgcHJldmlvdXNseSBzZWVuIHR5cGVzIHdoZW4KLSAgIHdlIHNlZSB0aGUgJ0YnIGNoYXJhY3RlciwgYW5kIHN1YnRyYWN0aW5nIG9uZSBmcm9tIHRoZSB0eXBlIG51bWJlcgotICAgcmVmZXJlbmNlLgotCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgc3RyaW5nIGFyZzsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgcjsKLSAgaW50IHQ7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLSAgY2hhciB0ZW1wdHlwZTsKLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKCIpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXDAnKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAidm9pZCIpOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKCgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnICYmICoqbWFuZ2xlZCAhPSAnZScpCi0JIHx8IHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnTicpIHx8ICgqKm1hbmdsZWQgPT0gJ1QnKSkKLQl7Ci0JICB0ZW1wdHlwZSA9ICooKm1hbmdsZWQpKys7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnTicpCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotCQl7Ci0JCSAgcmV0dXJuICgwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gMTsKLQkgICAgfQotICAgICAgICAgIGlmICgoSFBfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgd29yayAtPiBudHlwZXMgPj0gMTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgMTAgb3IgbW9yZSB0eXBlcyB3ZSBtaWdodCBoYXZlIG1vcmUgdGhhbiBhIDEgZGlnaXQKLSAgICAgICAgICAgICAgICAgaW5kZXggc28gd2UnbGwgaGF2ZSB0byBjb25zdW1lIHRoZSB3aG9sZSBjb3VudCBoZXJlLiBUaGlzCi0gICAgICAgICAgICAgICAgIHdpbGwgbG9zZSBpZiB0aGUgbmV4dCB0aGluZyBpcyBhIHR5cGUgbmFtZSBwcmVjZWRlZCBieSBhCi0gICAgICAgICAgICAgICAgIGNvdW50IGJ1dCBpdCdzIGltcG9zc2libGUgdG8gZGVtYW5nbGUgdGhhdCBjYXNlIHByb3Blcmx5Ci0gICAgICAgICAgICAgICAgIGFueXdheS4gRWcgaWYgd2UgYWxyZWFkeSBoYXZlIDEyIHR5cGVzIGlzIFQxMlBjICIoLi4uLCB0eXBlMSwKLSAgICAgICAgICAgICAgICAgUGMsIC4uLikiICBvciAiKC4uLiwgdHlwZTEyLCBjaGFyICosIC4uLikiICovCi0gICAgICAgICAgICAgIGlmICgodCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCkpIDw9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZ0KSkKLQkgICAgCXsKLQkgICAgICAgICAgcmV0dXJuICgwKTsKLQkgICAgCX0KLQkgICAgfQotCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIHQtLTsKLQkgICAgfQotCSAgLyogVmFsaWRhdGUgdGhlIHR5cGUgaW5kZXguICBQcm90ZWN0IGFnYWluc3QgaWxsZWdhbCBpbmRpY2VzIGZyb20KLQkgICAgIG1hbGZvcm1lZCB0eXBlIHN0cmluZ3MuICAqLwotCSAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gd29yayAtPiBudHlwZXMpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgd2hpbGUgKHdvcmstPm5yZXBlYXRzID4gMCB8fCAtLXIgPj0gMCkKLQkgICAgewotCSAgICAgIHRlbSA9IHdvcmsgLT4gdHlwZXZlY1t0XTsKLQkgICAgICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwgIik7Ci0JCX0KLQkgICAgICBpZiAoIWRvX2FyZyAod29yaywgJnRlbSwgJmFyZykpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgICAgICBuZWVkX2NvbW1hID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkgIGlmICghZG9fYXJnICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLQkgICAgcmV0dXJuICgwKTsKLQkgIGlmIChQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgIG5lZWRfY29tbWEgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQl7Ci0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIi4uLiIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIikiKTsKLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIExpa2UgZGVtYW5nbGVfYXJncywgYnV0IGZvciBkZW1hbmdsaW5nIHRoZSBhcmd1bWVudCBsaXN0cyBvZiBmdW5jdGlvbgotICAgYW5kIG1ldGhvZCBwb2ludGVycyBvciByZWZlcmVuY2VzLCBub3QgdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcqIHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50OwotICBpbnQgcmVzdWx0OwotICBpbnQgc2F2ZWRfbnJlcGVhdHM7Ci0KLSAgLyogVGhlIEcrKyBuYW1lLW1hbmdsaW5nIGFsZ29yaXRobSBkb2VzIG5vdCByZW1lbWJlciB0eXBlcyBvbiBuZXN0ZWQKLSAgICAgYXJndW1lbnQgbGlzdHMsIHVubGVzcyAtZnNxdWFuZ2xpbmcgaXMgdXNlZCwgYW5kIGluIHRoYXQgY2FzZSB0aGUKLSAgICAgdHlwZSB2ZWN0b3IgdXBkYXRlZCBieSByZW1lbWJlcl90eXBlIGlzIG5vdCB1c2VkLiAgU28sIHdlIHR1cm4KLSAgICAgb2ZmIHJlbWVtYmVyaW5nIG9mIHR5cGVzIGhlcmUuICAqLwotICArK3dvcmstPmZvcmdldHRpbmdfdHlwZXM7Ci0KLSAgLyogRm9yIHRoZSByZXBlYXQgY29kZXMgdXNlZCB3aXRoIC1mc3F1YW5nbGluZywgd2UgbXVzdCBrZWVwIHRyYWNrIG9mCi0gICAgIHRoZSBsYXN0IGFyZ3VtZW50LiAgKi8KLSAgc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQgPSB3b3JrLT5wcmV2aW91c19hcmd1bWVudDsKLSAgc2F2ZWRfbnJlcGVhdHMgPSB3b3JrLT5ucmVwZWF0czsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAwOwotICB3b3JrLT5ucmVwZWF0cyA9IDA7Ci0KLSAgLyogQWN0dWFsbHkgZGVtYW5nbGUgdGhlIGFyZ3VtZW50cy4gICovCi0gIHJlc3VsdCA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQotICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91c19hcmd1bWVudCBmaWVsZC4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIC0td29yay0+Zm9yZ2V0dGluZ190eXBlczsKLSAgd29yay0+bnJlcGVhdHMgPSBzYXZlZF9ucmVwZWF0czsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgY29uc3QgY2hhciAqc2NhbjsKLXsKLSAgc2l6ZV90IGk7Ci0gIHN0cmluZyB0eXBlOwotICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAoKm1hbmdsZWQpLCBzY2FuIC0gKCptYW5nbGVkKSk7Ci0gIHN0cmluZ19uZWVkIChkZWNscCwgMSk7Ci0gICooZGVjbHAgLT4gcCkgPSAnXDAnOwotCi0gIC8qIENvbnN1bWUgdGhlIGZ1bmN0aW9uIG5hbWUsIGluY2x1ZGluZyB0aGUgIl9fIiBzZXBhcmF0aW5nIHRoZSBuYW1lCi0gICAgIGZyb20gdGhlIHNpZ25hdHVyZS4gIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgU0NBTiBwb2ludHMgdG8gdGhlCi0gICAgIHNlcGFyYXRvci4gICovCi0KLSAgKCptYW5nbGVkKSA9IHNjYW4gKyAyOwotICAvKiBXZSBtYXkgYmUgbG9va2luZyBhdCBhbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgZnVuY3Rpb246Ci0gICAgIGZvb19fWHQxdDJfRnQzdDQsIHdoZXJlIHQxLCB0MiwgLi4uIGFyZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIGEKLSAgICAgZm9sbG93aW5nIF9GIG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSGFuZGxlCi0gICAgIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZmlyc3QuICovCi0KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCoqbWFuZ2xlZCA9PSAnWCcpKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgMCwgZGVjbHApOwotICAgICAgLyogVGhpcyBsZWF2ZXMgTUFOR0xFRCBwb2ludGluZyB0byB0aGUgJ0YnIG1hcmtpbmcgZnVuYyBhcmdzICovCi0gICAgfQotCi0gIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgewotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBBUk0gc3R5bGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBvcGVyYXRvci4KLQkgSWYgc28sIHRoZW4ganVzdCByZWNvcmQgaXQsIGNsZWFyIHRoZSBkZWNsLCBhbmQgcmV0dXJuLgotCSBXZSBjYW4ndCBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVjbCB1bnRpbCBsYXRlciwKLQkgd2hlbiB3ZSByZWNvdmVyIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIHNpZ25hdHVyZS4gICovCi0KLSAgICAgIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2N0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGNvbnN0cnVjdG9yICs9IDE7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2R0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gMwotICAgICAgJiYgZGVjbHAtPmJbMF0gPT0gJ28nCi0gICAgICAmJiBkZWNscC0+YlsxXSA9PSAncCcKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgZGVjbHAtPmJbMl0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCi0gICAgICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCi0JICAmJiBtZW1jbXAgKGRlY2xwLT5iICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IGRlY2xwLT5wIC0gZGVjbHAtPmIgLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMTAsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPSIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDMsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDUgJiYgbWVtY21wIChkZWNscC0+YiwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+Yls0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IGRlY2xwLT5iICsgNTsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHlwZSk7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZGVjbHAtPmJbMF0gPT0gJ18nICYmIGRlY2xwLT5iWzFdID09ICdfJwotCSAgICYmIGRlY2xwLT5iWzJdID09ICdvJyAmJiBkZWNscC0+YlszXSA9PSAncCcpCi0gICAgewotICAgICAgLyogQU5TSS4gICovCi0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA0OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPj0gJ2EnICYmIGRlY2xwLT5iWzJdIDw9ICd6JwotCSAgICYmIGRlY2xwLT5iWzNdID49ICdhJyAmJiBkZWNscC0+YlszXSA8PSAneicpCi0gICAgewotICAgICAgaWYgKGRlY2xwLT5iWzRdID09ICdcMCcpCi0JewotCSAgLyogT3BlcmF0b3IuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDIsIDIpID09IDApCi0JCXsKLQkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChkZWNscC0+YlsyXSA9PSAnYScgJiYgZGVjbHAtPmJbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIGEgbWluaSBzdHJpbmctaGFuZGxpbmcgcGFja2FnZSAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX25lZWQgKHMsIG4pCi0gICAgIHN0cmluZyAqczsKLSAgICAgaW50IG47Ci17Ci0gIGludCB0ZW07Ci0KLSAgaWYgKHMtPmIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA8IDMyKQotCXsKLQkgIG4gPSAzMjsKLQl9Ci0gICAgICBzLT5wID0gcy0+YiA9IHhtYWxsb2MgKG4pOwotICAgICAgcy0+ZSA9IHMtPmIgKyBuOwotICAgIH0KLSAgZWxzZSBpZiAocy0+ZSAtIHMtPnAgPCBuKQotICAgIHsKLSAgICAgIHRlbSA9IHMtPnAgLSBzLT5iOwotICAgICAgbiArPSB0ZW07Ci0gICAgICBuICo9IDI7Ci0gICAgICBzLT5iID0geHJlYWxsb2MgKHMtPmIsIG4pOwotICAgICAgcy0+cCA9IHMtPmIgKyB0ZW07Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2RlbGV0ZSAocykKLSAgICAgc3RyaW5nICpzOwotewotICBpZiAocy0+YiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHMtPmIpOwotICAgICAgcy0+YiA9IHMtPmUgPSBzLT5wID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfaW5pdCAocykKLSAgICAgc3RyaW5nICpzOwotewotICBzLT5iID0gcy0+cCA9IHMtPmUgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2NsZWFyIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPnAgPSBzLT5iOwotfQotCi0jaWYgMAotCi1zdGF0aWMgaW50Ci1zdHJpbmdfZW1wdHkgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcmV0dXJuIChzLT5iID09IHMtPnApOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmQgKHAsIHMpCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IG47Ci0gIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKLSAgICByZXR1cm47Ci0gIG4gPSBzdHJsZW4gKHMpOwotICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gIG1lbWNweSAocC0+cCwgcywgbik7Ci0gIHAtPnAgKz0gbjsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIChwLCBzKQotICAgICBzdHJpbmcgKnAsICpzOwotewotICBpbnQgbjsKLQotICBpZiAocy0+YiAhPSBzLT5wKQotICAgIHsKLSAgICAgIG4gPSBzLT5wIC0gcy0+YjsKLSAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgICAgIG1lbWNweSAocC0+cCwgcy0+Yiwgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpZiAocyAhPSBOVUxMICYmICpzICE9ICdcMCcpCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBzdHJsZW4gKHMpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLT5iLCBzLT5wIC0gcy0+Yik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBuKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBuOwotewotICBjaGFyICpxOwotCi0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgZm9yIChxID0gcC0+cCAtIDE7IHEgPj0gcC0+YjsgcS0tKQotCXsKLQkgIHFbbl0gPSBxWzBdOwotCX0KLSAgICAgIG1lbWNweSAocC0+Yiwgcywgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHggKHMsIGlkeCkKLSAgICAgc3RyaW5nICpzOwotICAgICBpbnQgaWR4OwotewotICBjaGFyIGJ1ZltJTlRCVUZfU0laRSArIDEgLyogJ1QnICovXTsKLSAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotICBzdHJpbmdfYXBwZW5kIChzLCBidWYpOwotfQotCi0vKiBUbyBnZW5lcmF0ZSBhIHN0YW5kYWxvbmUgZGVtYW5nbGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgcHVycG9zZXMsCi0gICBqdXN0IGNvbXBpbGUgYW5kIGxpbmsgdGhpcyBmaWxlIHdpdGggLURNQUlOIGFuZCBsaWJpYmVydHkuYS4gIFdoZW4KLSAgIHJ1biwgaXQgZGVtYW5nbGVzIGVhY2ggY29tbWFuZCBsaW5lIGFyZywgb3IgZWFjaCBzdGRpbiBzdHJpbmcsIGFuZAotICAgcHJpbnRzIHRoZSByZXN1bHQgb24gc3Rkb3V0LiAgKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lOwotc3RhdGljIGNvbnN0IGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci1zdGF0aWMgaW50IGZsYWdzID0gRE1HTF9QQVJBTVMgfCBETUdMX0FOU0k7Ci0KLXN0YXRpYyB2b2lkIGRlbWFuZ2xlX2l0IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKSBBVFRSSUJVVEVfTk9SRVRVUk47Ci1zdGF0aWMgdm9pZCBmYXRhbCBQQVJBTVMgKChjb25zdCBjaGFyICopKSBBVFRSSUJVVEVfTk9SRVRVUk47Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9pdCAobWFuZ2xlZF9uYW1lKQotICAgICBjaGFyICptYW5nbGVkX25hbWU7Ci17Ci0gIGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLCBmbGFncyk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgbWFuZ2xlZF9uYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgcmVzdWx0KTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgIlwKLVVzYWdlOiAlcyBbLV9dIFstbl0gWy1zIHtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dIFstLXN0cmlwLXVuZGVyc2NvcmVzXVxuXAotICAgICAgIFstLW5vLXN0cmlwLXVuZGVyc2NvcmVzXSBbLS1mb3JtYXQ9e2dudSxsdWNpZCxhcm0saHAsZWRnfV1cblwKLSAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dIFthcmcuLi5dXG4iLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgTUJVRl9TSVpFIDMyNzY3Ci1jaGFyIG1idWZmZXJbTUJVRl9TSVpFXTsKLQotLyogRGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgdW5kZXJzY29yZS5jLiAgKi8KLWV4dGVybiBpbnQgcHJlcGVuZHNfdW5kZXJzY29yZTsKLQotaW50IHN0cmlwX3VuZGVyc2NvcmUgPSAwOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKLSAgeyJzdHJpcC11bmRlcnNjb3JlcyIsIG5vX2FyZ3VtZW50LCAwLCAnXyd9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncyd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJqYXZhIiwgbm9fYXJndW1lbnQsIDAsICdqJ30sCi0gIHsibm8tc3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE1vcmUgJ2ZyaWVuZGx5JyBhYm9ydCB0aGF0IHByaW50cyB0aGUgbGluZSBhbmQgZmlsZS4KLSAgIGNvbmZpZy5oIGNhbiAjZGVmaW5lIGFib3J0IGZhbmN5X2Fib3J0IGlmIHlvdSBsaWtlIHRoYXQgc29ydCBvZiB0aGluZy4gICovCi0KLXZvaWQKLWZhbmN5X2Fib3J0ICgpCi17Ci0gIGZhdGFsICgiSW50ZXJuYWwgZ2NjIGFib3J0LiIpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXN0YW5kYXJkX3N5bWJvbF9jaGFyYWN0ZXJzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaHBfc3ltYm9sX2NoYXJhY3RlcnMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIHN0cmluZyBvZiBub24tYWxudW0gY2hhcmFjdGVycyB0aGF0IG1heSBvY2N1ciAKLSAgIGFzIGEgdmFsaWQgc3ltYm9sIGNvbXBvbmVudCwgaW4gdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBzeW1ib2wKLSAgIHN5bnRheC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXN0YW5kYXJkX3N5bWJvbF9jaGFyYWN0ZXJzICgpCi17Ci0gIHJldHVybiAiXyQuIjsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIHN0cmluZyBvZiBub24tYWxudW0gY2hhcmFjdGVycyB0aGF0IG1heSBvY2N1cgotICAgYXMgYSB2YWxpZCBzeW1ib2wgbmFtZSBjb21wb25lbnQgaW4gYW4gSFAgb2JqZWN0IGZpbGUuCi0KLSAgIE5vdGUgdGhhdCwgc2luY2UgSFAncyBjb21waWxlciBnZW5lcmF0ZXMgb2JqZWN0IGNvZGUgc3RyYWlnaHQgZnJvbQotICAgQysrIHNvdXJjZSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGFuIGFzc2VtYmxlciwgaXRzIG1hbmdsZWQKLSAgIGlkZW50aWZpZXJzIGNhbiB1c2UgYWxsIHNvcnRzIG9mIGNoYXJhY3RlcnMgdGhhdCBubyBhc3NlbWJsZXIgd291bGQKLSAgIHRvbGVyYXRlLCBzbyB0aGUgYWxwaGFiZXQgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIGlzIGEgbGl0dGxlIG9kZC4KLSAgIEhlcmUgYXJlIHNvbWUgc2FtcGxlIG1hbmdsZWQgaWRlbnRpZmllcnMgb2ZmZXJlZCBieSBIUDoKLQotCXR5cGVpZCpfX1hUMjRBZGRyZXNzSW5kRXhwQ2xhc3NNZW1iZXJfCi0JW1ZmdHB0cl1rZXk6X19kdF9fMzJPcmRpbmFyeUNvbXBhcmVJbmRFeHBDbGFzc01lbWJlckZ2Ci0JX19jdF9fUTJfOUVsZjY0X0R5bjE4e3VubmFtZWQudW5pb24uIzF9RnYKLQotICAgVGhpcyBzdGlsbCBzZWVtcyByZWFsbHkgd2VpcmQgdG8gbWUsIHNpbmNlIG5vd2hlcmUgZWxzZSBpbiB0aGlzCi0gICBmaWxlIGlzIHRoZXJlIGFueXRoaW5nIHRvIHJlY29nbml6ZSBjdXJseSBicmFja2V0cywgcGFyZW5zLCBldGMuCi0gICBJJ3ZlIHRhbGtlZCB3aXRoIFNyaWthbnRoIDxzcmlrYW50aEBjdXAuaHAuY29tPiwgYW5kIGhlIGFzc3VyZXMgbWUKLSAgIHRoaXMgaXMgcmlnaHQsIGJ1dCBJIHN0aWxsIHN0cm9uZ2x5IHN1c3BlY3QgdGhhdCB0aGVyZSdzIGEKLSAgIG1pc3VuZGVyc3RhbmRpbmcgaGVyZS4KLQotICAgSWYgd2UgZGVjaWRlIGl0J3MgYmV0dGVyIGZvciBjKytmaWx0IHRvIHVzZSBIUCdzIGFzc2VtYmxlciBzeW50YXgKLSAgIHRvIHNjcmFwZSBpZGVudGlmaWVycyBvdXQgb2YgaXRzIGlucHV0LCBoZXJlJ3MgdGhlIGRlZmluaXRpb24gb2YKLSAgIHRoZSBzeW1ib2wgbmFtZSBzeW50YXggZnJvbSB0aGUgSFAgYXNzZW1ibGVyIG1hbnVhbDoKLQotICAgICAgIFN5bWJvbHMgYXJlIGNvbXBvc2VkIG9mIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRlY2ltYWwKLSAgICAgICBkaWdpdHMsIGRvbGxhciBzeW1ib2wsIHBlcmlvZCAoLiksIGFtcGVyc2FuZCAoJiksIHBvdW5kIHNpZ24oIykgYW5kCi0gICAgICAgdW5kZXJzY29yZSAoXykuIEEgc3ltYm9sIGNhbiBiZWdpbiB3aXRoIGEgbGV0dGVyLCBkaWdpdCB1bmRlcnNjb3JlIG9yCi0gICAgICAgZG9sbGFyIHNpZ24uIElmIGEgc3ltYm9sIGJlZ2lucyB3aXRoIGEgZGlnaXQsIGl0IG11c3QgY29udGFpbiBhCi0gICAgICAgbm9uLWRpZ2l0IGNoYXJhY3Rlci4KLQotICAgU28gaGF2ZSBmdW4uICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaHBfc3ltYm9sX2NoYXJhY3RlcnMgKCkKLXsKLSAgcmV0dXJuICJfJC48PiMsKiZbXTooKXt9IjsKLX0KLQotCi1leHRlcm4gaW50IG1haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICpyZXN1bHQ7Ci0gIGludCBjOwotICBjb25zdCBjaGFyICp2YWxpZF9zeW1ib2xzOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc3RyaXBfdW5kZXJzY29yZSA9IHByZXBlbmRzX3VuZGVyc2NvcmU7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJfbnM6aiIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbic6Ci0JICBzdHJpcF91bmRlcnNjb3JlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgcHJpbnRmICgiR05VICVzIChDKysgZGVtYW5nbGVyKSwgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgcmV0dXJuICgwKTsKLQljYXNlICdfJzoKLQkgIHN0cmlwX3VuZGVyc2NvcmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBmbGFncyB8PSBETUdMX0pBVkE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImdudSIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBnbnVfZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJsdWNpZCIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBsdWNpZF9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImFybSIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBhcm1fZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJocCIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBocF9kZW1hbmdsaW5nOwotCSAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJlZGciKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBlZGdfZGVtYW5nbGluZzsKLSAgICAgICAgICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIGRlbWFuZ2xpbmcgc3R5bGUgYCVzJ1xuIiwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgICAgICByZXR1cm4gKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGZvciAoIDsgb3B0aW5kIDwgYXJnYzsgb3B0aW5kKyspCi0JewotCSAgZGVtYW5nbGVfaXQgKGFyZ3Zbb3B0aW5kXSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlKQotCXsKLQljYXNlIGdudV9kZW1hbmdsaW5nOgotCWNhc2UgbHVjaWRfZGVtYW5nbGluZzoKLQljYXNlIGFybV9kZW1hbmdsaW5nOgotCWNhc2UgZWRnX2RlbWFuZ2xpbmc6Ci0JICB2YWxpZF9zeW1ib2xzID0gc3RhbmRhcmRfc3ltYm9sX2NoYXJhY3RlcnMgKCk7Ci0JICBicmVhazsKLQljYXNlIGhwX2RlbWFuZ2xpbmc6Ci0JICB2YWxpZF9zeW1ib2xzID0gaHBfc3ltYm9sX2NoYXJhY3RlcnMgKCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogRm9sa3Mgc2hvdWxkIGV4cGxpY2l0bHkgaW5kaWNhdGUgdGhlIGFwcHJvcHJpYXRlIGFscGhhYmV0IGZvcgotCSAgICAgZWFjaCBkZW1hbmdsaW5nLiAgUHJvdmlkaW5nIGEgZGVmYXVsdCB3b3VsZCBhbGxvdyB0aGUKLQkgICAgIHF1ZXN0aW9uIHRvIGdvIHVuY29uc2lkZXJlZC4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgaW50IGkgPSAwOwotCSAgYyA9IGdldGNoYXIgKCk7Ci0JICAvKiBUcnkgdG8gcmVhZCBhIGxhYmVsLiAgKi8KLQkgIHdoaWxlIChjICE9IEVPRiAmJiAoaXNhbG51bSAoYykgfHwgc3RyY2hyICh2YWxpZF9zeW1ib2xzLCBjKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaSA+PSBNQlVGX1NJWkUtMSkKLQkJYnJlYWs7Ci0JICAgICAgbWJ1ZmZlcltpKytdID0gYzsKLQkgICAgICBjID0gZ2V0Y2hhciAoKTsKLQkgICAgfQotCSAgaWYgKGkgPiAwKQotCSAgICB7Ci0JICAgICAgaW50IHNraXBfZmlyc3QgPSAwOwotCi0JICAgICAgaWYgKG1idWZmZXJbMF0gPT0gJy4nKQotCQkrK3NraXBfZmlyc3Q7Ci0JICAgICAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgbWJ1ZmZlcltza2lwX2ZpcnN0XSA9PSAnXycpCi0JCSsrc2tpcF9maXJzdDsKLQotCSAgICAgIGlmIChza2lwX2ZpcnN0ID4gaSkKLQkJc2tpcF9maXJzdCA9IGk7Ci0KLQkgICAgICBtYnVmZmVyW2ldID0gMDsKLQotCSAgICAgIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYnVmZmVyICsgc2tpcF9maXJzdCwgZmxhZ3MpOwotCSAgICAgIGlmIChyZXN1bHQpCi0JCXsKLQkJICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSAgICBwdXRjICgnLicsIHN0ZG91dCk7Ci0JCSAgZnB1dHMgKHJlc3VsdCwgc3Rkb3V0KTsKLQkJICBmcmVlIChyZXN1bHQpOwotCQl9Ci0JICAgICAgZWxzZQotCQlmcHV0cyAobWJ1ZmZlciwgc3Rkb3V0KTsKLQotCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLQkgICAgfQotCSAgaWYgKGMgPT0gRU9GKQotCSAgICBicmVhazsKLQkgIHB1dGNoYXIgKGMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWZhdGFsIChzdHIpCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cik7Ci0gIGV4aXQgKDEpOwotfQotCi1QVFIKLXhtYWxsb2MgKHNpemUpCi0gIHNpemVfdCBzaXplOwotewotICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAodmFsdWUgPT0gMCkKLSAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLVBUUgoteHJlYWxsb2MgKHB0ciwgc2l6ZSkKLSAgUFRSIHB0cjsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiB2YWx1ZSA9IChQVFIpIHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLSNlbmRpZgkvKiBtYWluICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZmRtYXRjaC5jIGIvbGliaWJlcnR5L2ZkbWF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmMDM5Zi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZmRtYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogQ29tcGFyZSB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHRvIHNlZSBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWZkbWF0Y2ggLS0gc2VlIGlmIHR3byBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHNhbWUgZmlsZQotCi1TWU5PUFNJUwotCi0JaW50IGZkbWF0Y2ggKGludCBmZDEsIGludCBmZDIpCi0KLURFU0NSSVBUSU9OCi0KLQlDaGVjayB0byBzZWUgaWYgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotCVRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB3ZSBoYXZlIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0JZm9yIGFuIHVubmFtZWQgZmlsZSwgYW5kIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IHdlIGJlbGlldmUgdG8gCi0JY29ycmVzcG9uZCB0byB0aGF0IGZkLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGV4ZWMnZCB3aXRoCi0JYW4gYWxyZWFkeSBvcGVuIGZpbGUgKHN0ZG91dCBmb3IgZXhhbXBsZSkgb3IgZnJvbSB0aGUgU1ZSNCAvcHJvYwotCWNhbGxzIHRoYXQgcmV0dXJuIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgbWFwcGVkIGFkZHJlc3Mgc3BhY2VzLgotCUFsbCB3ZSBoYXZlIHRvIGRvIGlzIG9wZW4gdGhlIGZpbGUgYnkgbmFtZSBhbmQgY2hlY2sgdGhlIHR3byBmaWxlCi0JZGVzY3JpcHRvcnMgZm9yIGEgbWF0Y2gsIHdoaWNoIGlzIGRvbmUgYnkgY29tcGFyaW5nIG1ham9yJm1pbm9yCi0JZGV2aWNlIG51bWJlcnMgYW5kIGlub2RlIG51bWJlcnMuCi0KLUJVR1MKLQotCShGSVhNRTogZG9lcyB0aGlzIHdvcmsgZm9yIG5ldHdvcmtzPykKLQlJdCB3b3JrcyBmb3IgTkZTLCB3aGljaCBhc3NpZ25zIGEgZGV2aWNlIG51bWJlciB0byBlYWNoIG1vdW50LgotCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1pbnQgZmRtYXRjaCAoZmQxLCBmZDIpCi0JaW50IGZkMTsKLQlpbnQgZmQyOwotewotICBzdHJ1Y3Qgc3RhdCBzYnVmMTsKLSAgc3RydWN0IHN0YXQgc2J1ZjI7Ci0KLSAgaWYgKChmc3RhdCAoZmQxLCAmc2J1ZjEpID09IDApICYmCi0gICAgICAoZnN0YXQgKGZkMiwgJnNidWYyKSA9PSAwKSAmJgotICAgICAgKHNidWYxLnN0X2RldiA9PSBzYnVmMi5zdF9kZXYpICYmCi0gICAgICAoc2J1ZjEuc3RfaW5vID09IHNidWYyLnN0X2lubykpCi0gICAgewotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jIGIvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYjc4ZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyogSUVFRSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IHJvdXRpbmVzLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgotI2luY2x1ZGUgPG1hdGguaD4JCS8qIGxkZXhwICovCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKLSNlbHNlCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwotZXh0ZXJuIGNoYXIgKm1lbXNldCAoKTsKLSNlbmRpZgotCi0vKiBUaGUgb2RkcyB0aGF0IENIQVJfQklUIHdpbGwgYmUgYW55dGhpbmcgYnV0IDggYXJlIGxvdyBlbm91Z2ggdGhhdCBJJ20gbm90Ci0gICBnb2luZyB0byBib3RoZXIgd2l0aCB0cnlpbmcgdG8gbXVjayBhcm91bmQgd2l0aCB3aGV0aGVyIGl0IGlzIGRlZmluZWQgaW4KLSAgIGEgc3lzdGVtIGhlYWRlciwgd2hhdCB3ZSBkbyBpZiBub3QsIGV0Yy4gICovCi0jZGVmaW5lIEZMT0FURk9STUFUX0NIQVJfQklUIDgKLQotLyogZmxvYXRmb3JtYXRzIGZvciBJRUVFIHNpbmdsZSBhbmQgZG91YmxlLCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4uICAqLwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZyA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2JpZywgMzIsIDAsIDEsIDgsIDEyNywgMjU1LCA5LCAyMywKLSAgZmxvYXRmb3JtYXRfaW50Yml0X25vLAotICAiZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnIgotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDMyLCAwLCAxLCA4LCAxMjcsIDI1NSwgOSwgMjMsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF9ubywKLSAgImZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2xpdHRsZSIKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnID0KLXsKLSAgZmxvYXRmb3JtYXRfYmlnLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X25vLAotICAiZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnIgotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLAotICBmbG9hdGZvcm1hdF9pbnRiaXRfbm8sCi0gICJmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGUiCi19OwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgSUVFRSBkb3VibGUsIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciwgd2l0aCBiaWcgZW5kaWFuIHdvcmQKLSAgIG9yZGVyaW5nLCBhcyBvbiB0aGUgQVJNLiAgKi8KLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF9ubywKLSAgImZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSIKLX07Ci0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzLAotICAiZmxvYXRmb3JtYXRfaTM4N19leHQiCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X202ODg4MV9leHQgPQotewotICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAxNiB0byAzMSBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsCi0gICJmbG9hdGZvcm1hdF9tNjg4ODFfZXh0IgotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pOTYwX2V4dCA9Ci17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgYml0cyBmcm9tIDAgdG8gMTUgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgOTYsIDE2LCAxNywgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsCi0gICJmbG9hdGZvcm1hdF9pOTYwX2V4dCIKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCA9Ci17Ci0jaWZkZWYgSEFSUklTX0ZMT0FUX0ZPUk1BVAotICAvKiBIYXJyaXMgdXNlcyByYXcgZm9ybWF0IDEyOCBieXRlcyBsb25nLCBidXQgdGhlIG51bWJlciBpcyBqdXN0IGFuIGllZWUKLSAgICAgZG91YmxlLCBhbmQgdGhlIGxhc3QgNjQgYml0cyBhcmUgd2FzdGVkLiAqLwotICBmbG9hdGZvcm1hdF9iaWcsMTI4LCAwLCAxLCAxMSwgIDB4M2ZmLCAgMHg3ZmYsIDEyLCA1MiwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X25vLAotICAiZmxvYXRmb3JtYXRfbTg4MTEwX2V4dChoYXJyaXMpIgotI2Vsc2UKLSAgZmxvYXRmb3JtYXRfYmlnLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsCi0gICJmbG9hdGZvcm1hdF9tODgxMTBfZXh0IgotI2VuZGlmIC8qIEhBUlJJU19GTE9BVF9GT1JNQVQgKi8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfYXJtX2V4dCA9Ci17Ci0gIC8qIEJpdHMgMSB0byAxNiBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzLAotICAiZmxvYXRmb3JtYXRfYXJtX2V4dCIKLX07Ci0MCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLAotCQkJCQllbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCi0JCQkJCXVuc2lnbmVkIGludCwKLQkJCQkJdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQpKTsKLQotLyogRXh0cmFjdCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4pCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKLSAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKLSAgICAgdW5zaWduZWQgaW50IHN0YXJ0OwotICAgICB1bnNpZ25lZCBpbnQgbGVuOwotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50IGN1cl9ieXRlOwotICBpbnQgY3VyX2JpdHNoaWZ0OwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKLSAgY3VyX2JpdHNoaWZ0ID0KLSAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOwotICByZXN1bHQgPSAqKGRhdGEgKyBjdXJfYnl0ZSkgPj4gKC1jdXJfYml0c2hpZnQpOwotICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgKytjdXJfYnl0ZTsKLSAgZWxzZQotICAgIC0tY3VyX2J5dGU7Ci0KLSAgLyogTW92ZSB0b3dhcmRzIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgd2hpbGUgKCh1bnNpZ25lZCBpbnQpIGN1cl9iaXRzaGlmdCA8IGxlbikKLSAgICB7Ci0gICAgICBpZiAobGVuIC0gY3VyX2JpdHNoaWZ0IDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpCi0JLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlOyB6ZXJvIG91dCB0aGUgYml0cyB3aGljaCBhcmUgbm90IHBhcnQgb2YKLQkgICB0aGlzIGZpZWxkLiAgKi8KLQlyZXN1bHQgfD0KLQkgICgqKGRhdGEgKyBjdXJfYnl0ZSkgJiAoKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSkpCi0JICAgIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGVsc2UKLQlyZXN1bHQgfD0gKihkYXRhICsgY3VyX2J5dGUpIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSAgCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0vKiBDb252ZXJ0IGZyb20gRk1UIHRvIGEgZG91YmxlLgotICAgRlJPTSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZXh0ZW5kZWQgZmxvYXQuCi0gICBTdG9yZSB0aGUgZG91YmxlIGluICpUTy4gICovCi0KLXZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoZm10LCBmcm9tLCB0bykKLSAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGRvdWJsZSAqdG87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnVmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilmcm9tOwotICBkb3VibGUgZHRvOwotICBsb25nIGV4cG9uZW50OwotICB1bnNpZ25lZCBsb25nIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIGludCBzcGVjaWFsX2V4cG9uZW50OwkJLyogSXQncyBhIE5hTiwgZGVub3JtIG9yIHplcm8gKi8KLQotICBleHBvbmVudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJCWZtdC0+ZXhwX3N0YXJ0LCBmbXQtPmV4cF9sZW4pOwotICAvKiBOb3RlIHRoYXQgaWYgZXhwb25lbnQgaW5kaWNhdGVzIGEgTmFOLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgdXNlZnVsCi0gICAgIChub3Qga25vd2luZyBpZiB0aGUgaG9zdCBoYXMgTmFOJ3MsIG9yIGhvdyB0byBidWlsZCBvbmUpLiAgU28gaXQgd2lsbAotICAgICBlbmQgdXAgYXMgYW4gaW5maW5pdHkgb3Igc29tZXRoaW5nIGNsb3NlOyB0aGF0IGlzIE9LLiAgKi8KLQotICBtYW50X2JpdHNfbGVmdCA9IGZtdC0+bWFuX2xlbjsKLSAgbWFudF9vZmYgPSBmbXQtPm1hbl9zdGFydDsKLSAgZHRvID0gMC4wOwotCi0gIHNwZWNpYWxfZXhwb25lbnQgPSBleHBvbmVudCA9PSAwIHx8ICh1bnNpZ25lZCBsb25nKSBleHBvbmVudCA9PSBmbXQtPmV4cF9uYW47Ci0KLSAgLyogRG9uJ3QgYmlhcyB6ZXJvJ3MsIGRlbm9ybXMgb3IgTmFOcy4gICovCi0gIGlmICghc3BlY2lhbF9leHBvbmVudCkKLSAgICBleHBvbmVudCAtPSBmbXQtPmV4cF9iaWFzOwotCi0gIC8qIEJ1aWxkIHRoZSByZXN1bHQgYWxnZWJyYWljYWxseS4gIE1pZ2h0IGdvIGluZmluaXRlLCB1bmRlcmZsb3csIGV0YzsKLSAgICAgd2hvIGNhcmVzLiAqLwotCi0gIC8qIElmIHRoaXMgZm9ybWF0IHVzZXMgYSBoaWRkZW4gYml0LCBleHBsaWNpdGx5IGFkZCBpdCBpbiBub3cuICBPdGhlcndpc2UsCi0gICAgIGluY3JlbWVudCB0aGUgZXhwb25lbnQgYnkgb25lIHRvIGFjY291bnQgZm9yIHRoZSBpbnRlZ2VyIGJpdC4gICovCi0KLSAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQotICAgIHsKLSAgICAgIGlmIChmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCi0JZHRvID0gbGRleHAgKDEuMCwgZXhwb25lbnQpOwotICAgICAgZWxzZQotCWV4cG9uZW50Kys7Ci0gICAgfQotCi0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgbWFudF9iaXRzID0gbWluIChtYW50X2JpdHNfbGVmdCwgMzIpOwotCi0gICAgICBtYW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkJIG1hbnRfb2ZmLCBtYW50X2JpdHMpOwotCi0gICAgICBkdG8gKz0gbGRleHAgKChkb3VibGUpbWFudCwgZXhwb25lbnQgLSBtYW50X2JpdHMpOwotICAgICAgZXhwb25lbnQgLT0gbWFudF9iaXRzOwotICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOwotICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOwotICAgIH0KLQotICAvKiBOZWdhdGUgaXQgaWYgbmVnYXRpdmUuICAqLwotICBpZiAoZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPnNpZ25fc3RhcnQsIDEpKQotICAgIGR0byA9IC1kdG87Ci0gICp0byA9IGR0bzsKLX0KLQwKLXN0YXRpYyB2b2lkIHB1dF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNldCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB2b2lkCi1wdXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4sIHN0dWZmX3RvX3B1dCkKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOwotICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOwotICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3R1ZmZfdG9fcHV0OwotewotICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7Ci0gIGludCBjdXJfYml0c2hpZnQ7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOwotICBjdXJfYml0c2hpZnQgPQotICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICooZGF0YSArIGN1cl9ieXRlKSAmPQotICAgIH4oKCgxIDw8ICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpKSAtIDEpIDw8ICgtY3VyX2JpdHNoaWZ0KSk7Ci0gICooZGF0YSArIGN1cl9ieXRlKSB8PQotICAgIChzdHVmZl90b19wdXQgJiAoKDEgPDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gMSkpIDw8ICgtY3VyX2JpdHNoaWZ0KTsKLSAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgICsrY3VyX2J5dGU7Ci0gIGVsc2UKLSAgICAtLWN1cl9ieXRlOwotCi0gIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIHdoaWxlICgodW5zaWduZWQgaW50KSBjdXJfYml0c2hpZnQgPCBsZW4pCi0gICAgewotICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQotCXsKLQkgIC8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZS4gICovCi0JICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KLQkgICAgfigoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKTsKLQkgICooZGF0YSArIGN1cl9ieXRlKSB8PSAoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCk7Ci0JfQotICAgICAgZWxzZQotCSooZGF0YSArIGN1cl9ieXRlKSA9ICgoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCkKLQkJCSAgICAgICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKTsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLX0KLQotLyogVGhlIGNvbnZlcnNlOiBjb252ZXJ0IHRoZSBkb3VibGUgKkZST00gdG8gYW4gZXh0ZW5kZWQgZmxvYXQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICBOZWl0aGVyIEZST00gbm9yIFRPIGhhdmUgYW55IGFsaWdubWVudAotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKGZtdCwgZnJvbSwgdG8pCi0gICAgIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZm10OwotICAgICBkb3VibGUgKmZyb207Ci0gICAgIGNoYXIgKnRvOwotewotICBkb3VibGUgZGZyb207Ci0gIGludCBleHBvbmVudDsKLSAgZG91YmxlIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnV0byA9ICh1bnNpZ25lZCBjaGFyICopdG87Ci0KLSAgbWVtY3B5ICgmZGZyb20sIGZyb20sIHNpemVvZiAoZGZyb20pKTsKLSAgbWVtc2V0ICh1dG8sIDAsIGZtdC0+dG90YWxzaXplIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpOwotICBpZiAoZGZyb20gPT0gMCkKLSAgICByZXR1cm47CQkJLyogUmVzdWx0IGlzIHplcm8gKi8KLSAgaWYgKGRmcm9tICE9IGRmcm9tKQotICAgIHsKLSAgICAgIC8qIEZyb20gaXMgTmFOICovCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwKLQkJIGZtdC0+ZXhwX2xlbiwgZm10LT5leHBfbmFuKTsKLSAgICAgIC8qIEJlIHN1cmUgaXQncyBub3QgaW5maW5pdHksIGJ1dCBOYU4gdmFsdWUgaXMgaXJyZWwgKi8KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+bWFuX3N0YXJ0LAotCQkgMzIsIDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiBuZWdhdGl2ZSwgc2V0IHRoZSBzaWduIGJpdC4gICovCi0gIGlmIChkZnJvbSA8IDApCi0gICAgewotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxLCAxKTsKLSAgICAgIGRmcm9tID0gLWRmcm9tOwotICAgIH0KLQotICAvKiBIb3cgdG8gdGVsbCBhbiBpbmZpbml0eSBmcm9tIGFuIG9yZGluYXJ5IG51bWJlcj8gIEZJWE1FLXNvbWVkYXkgKi8KLQotICBtYW50ID0gZnJleHAgKGRmcm9tLCAmZXhwb25lbnQpOwotICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuLAotCSAgICAgZXhwb25lbnQgKyBmbXQtPmV4cF9iaWFzIC0gMSk7Ci0KLSAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47Ci0gIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7Ci0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYW50X2xvbmc7Ci0gICAgICBtYW50X2JpdHMgPSBtYW50X2JpdHNfbGVmdCA8IDMyID8gbWFudF9iaXRzX2xlZnQgOiAzMjsKLQotICAgICAgbWFudCAqPSA0Mjk0OTY3Mjk2LjA7Ci0gICAgICBtYW50X2xvbmcgPSAodW5zaWduZWQgbG9uZyltYW50OwotICAgICAgbWFudCAtPSBtYW50X2xvbmc7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnRlZ2VyIGJpdCBpcyBpbXBsaWNpdCwgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgaXQuCi0JIElmIHdlIGFyZSBkaXNjYXJkaW5nIGEgemVybywgd2Ugc2hvdWxkIGJlIChidXQgYXJlIG5vdCkgY3JlYXRpbmcKLQkgYSBkZW5vcm1hbGl6ZWQJbnVtYmVyIHdoaWNoIG1lYW5zIGFkanVzdGluZyB0aGUgZXhwb25lbnQKLQkgKEkgdGhpbmspLiAgKi8KLSAgICAgIGlmICgodW5zaWduZWQgaW50KSBtYW50X2JpdHNfbGVmdCA9PSBmbXQtPm1hbl9sZW4KLQkgICYmIGZtdC0+aW50Yml0ID09IGZsb2F0Zm9ybWF0X2ludGJpdF9ubykKLQl7Ci0JICBtYW50X2xvbmcgJj0gMHg3ZmZmZmZmZjsKLQkgIG1hbnRfYml0cyAtPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hbnRfYml0cyA8IDMyKQotCXsKLQkgIC8qIFRoZSBiaXRzIHdlIHdhbnQgYXJlIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IE1BTlRfQklUUyBiaXRzIG9mCi0JICAgICBtYW50X2xvbmcuICBNb3ZlIHRoZW0gdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50LiAgKi8KLQkgIG1hbnRfbG9uZyA+Pj0gMzIgLSBtYW50X2JpdHM7Ci0JfQotCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkgbWFudF9vZmYsIG1hbnRfYml0cywgbWFudF9sb25nKTsKLSAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKLSAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKLSAgICB9Ci19Ci0KLQotI2lmZGVmIElFRUVfREVCVUcKLQotLyogVGhpcyBpcyB0byBiZSBydW4gb24gYSBob3N0IHdoaWNoIHVzZXMgSUVFRSBmbG9hdGluZyBwb2ludC4gICovCi0KLXZvaWQKLWllZWVfdGVzdCAobikKLSAgICAgZG91YmxlIG47Ci17Ci0gIGRvdWJsZSByZXN1bHQ7Ci0gIGNoYXIgZXh0ZW5bMTZdOwotCi0gIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgJm4sICZyZXN1bHQpOwotICBpZiAobiAhPSByZXN1bHQpCi0gICAgcHJpbnRmICgiRGlmZmVyKHRvKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7Ci0gIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAmbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIoZnJvbSk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOwotCi0gIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgJm4sIGV4dGVuKTsKLSAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgZXh0ZW4sICZyZXN1bHQpOwotICBpZiAobiAhPSByZXN1bHQpCi0gICAgcHJpbnRmICgiRGlmZmVyKHRvK2Zyb20pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKLQotI2lmIElFRUVfREVCVUcgPiAxCi0gIC8qIFRoaXMgaXMgdG8gYmUgcnVuIG9uIGEgaG9zdCB3aGljaCB1c2VzIDY4ODgxIGZvcm1hdC4gICovCi0gIHsKLSAgICBsb25nIGRvdWJsZSBleCA9ICoobG9uZyBkb3VibGUgKilleHRlbjsKLSAgICBpZiAoZXggIT0gbikKLSAgICAgIHByaW50ZiAoIkRpZmZlcihmcm9tIHZzLiBleHRlbmRlZCk6ICUuMjBnXG4iLCBuKTsKLSAgfQotI2VuZGlmCi19Ci0KLWludAotbWFpbiAoKQotewotICBpZWVlX3Rlc3QgKDAuNSk7Ci0gIGllZWVfdGVzdCAoMjU2LjApOwotICBpZWVlX3Rlc3QgKDAuMTIzNDUpOwotICBpZWVlX3Rlc3QgKDIzNDIzNS43ODkwNzIzNCk7Ci0gIGllZWVfdGVzdCAoLTUxMi4wKTsKLSAgaWVlZV90ZXN0ICgtMC4wMDQzMjEpOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2ZubWF0Y2guYyBiL2xpYmliZXJ0eS9mbm1hdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWJmZTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2ZubWF0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLU5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi1CdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAcHJlcC5haS5taXQuZWR1LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpZiBkZWZpbmVkIChDT05GSUdfQlJPS0VUUykKLS8qIFdlIHVzZSA8Y29uZmlnLmg+IGluc3RlYWQgb2YgImNvbmZpZy5oIiBzbyB0aGF0IGEgY29tcGlsYXRpb24KLSAgIHVzaW5nIC1JLiAtSSRzcmNkaXIgd2lsbCB1c2UgLi9jb25maWcuaCByYXRoZXIgdGhhbiAkc3JjZGlyL2NvbmZpZy5oCi0gICAod2hpY2ggaXQgd291bGQgZG8gYmVjYXVzZSBpdCBmb3VuZCB0aGlzIGZpbGUgaW4gJHNyY2RpcikuICAqLwotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2Vsc2UKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBfR05VX1NPVVJDRQotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmCi0KLS8qIFRoaXMgY29kZSB0byB1bmRlZiBjb25zdCBhZGRlZCBpbiBsaWJpYmVydHkuICAqLwotI2lmbmRlZiBfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Zm5tYXRjaC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCi0gICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCi0gICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5Ci0gICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKLSAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKLSAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KLQotI2lmIGRlZmluZWQgKF9MSUJDKSB8fCAhZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKQotCi0KLSNpZiAhZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKFNURENfSEVBREVSUykKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotLyogTWF0Y2ggU1RSSU5HIGFnYWluc3QgdGhlIGZpbGVuYW1lIHBhdHRlcm4gUEFUVEVSTiwgcmV0dXJuaW5nIHplcm8gaWYKLSAgIGl0IG1hdGNoZXMsIG5vbnplcm8gaWYgbm90LiAgKi8KLWludAotZm5tYXRjaCAocGF0dGVybiwgc3RyaW5nLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuLCAqbiA9IHN0cmluZzsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotCi0vKiBOb3RlIHRoYXQgdGhpcyBldmFsdXRlcyBDIG1hbnkgdGltZXMuICAqLwotI2RlZmluZSBGT0xEKGMpCSgoZmxhZ3MgJiBGTk1fQ0FTRUZPTEQpICYmIGlzdXBwZXIgKGMpID8gdG9sb3dlciAoYykgOiAoYykpCi0KLSAgd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjID0gRk9MRCAoYyk7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnPyc6Ci0JICBpZiAoKm4gPT0gJ1wwJykKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgZWxzZSBpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgKm4gPT0gJy8nKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBlbHNlIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkJICAgKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgYnJlYWs7Ci0KLQljYXNlICdcXCc6Ci0JICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkpCi0JICAgIHsKLQkgICAgICBjID0gKnArKzsKLQkgICAgICBjID0gRk9MRCAoYyk7Ci0JICAgIH0KLQkgIGlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgIT0gYykKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgYnJlYWs7Ci0KLQljYXNlICcqJzoKLQkgIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkgICAgICAobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgIGZvciAoYyA9ICpwKys7IGMgPT0gJz8nIHx8IGMgPT0gJyonOyBjID0gKnArKywgKytuKQotCSAgICBpZiAoKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmICpuID09ICcvJykgfHwKLQkJKGMgPT0gJz8nICYmICpuID09ICdcMCcpKQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgaWYgKGMgPT0gJ1wwJykKLQkgICAgcmV0dXJuIDA7Ci0KLQkgIHsKLQkgICAgdW5zaWduZWQgY2hhciBjMSA9ICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpID8gKnAgOiBjOwotCSAgICBjMSA9IEZPTEQgKGMxKTsKLQkgICAgZm9yICgtLXA7ICpuICE9ICdcMCc7ICsrbikKLQkgICAgICBpZiAoKGMgPT0gJ1snIHx8IEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA9PSBjMSkgJiYKLQkJICBmbm1hdGNoIChwLCBuLCBmbGFncyAmIH5GTk1fUEVSSU9EKSA9PSAwKQotCQlyZXR1cm4gMDsKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgfQotCi0JY2FzZSAnWyc6Ci0JICB7Ci0JICAgIC8qIE5vbnplcm8gaWYgdGhlIHNlbnNlIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MgaXMgaW52ZXJ0ZWQuICAqLwotCSAgICByZWdpc3RlciBpbnQgbm90OwotCi0JICAgIGlmICgqbiA9PSAnXDAnKQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgICBpZiAoKGZsYWdzICYgRk5NX1BFUklPRCkgJiYgKm4gPT0gJy4nICYmCi0JCShuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICAgIG5vdCA9ICgqcCA9PSAnIScgfHwgKnAgPT0gJ14nKTsKLQkgICAgaWYgKG5vdCkKLQkgICAgICArK3A7Ci0KLQkgICAgYyA9ICpwKys7Ci0JICAgIGZvciAoOzspCi0JICAgICAgewotCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIGNzdGFydCA9IGMsIGNlbmQgPSBjOwotCi0JCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCi0JCSAgY3N0YXJ0ID0gY2VuZCA9ICpwKys7Ci0KLQkJY3N0YXJ0ID0gY2VuZCA9IEZPTEQgKGNzdGFydCk7Ci0KLQkJaWYgKGMgPT0gJ1wwJykKLQkJICAvKiBbICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJYyA9ICpwKys7Ci0JCWMgPSBGT0xEIChjKTsKLQotCQlpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgYyA9PSAnLycpCi0JCSAgLyogWy9dIGNhbiBuZXZlciBtYXRjaC4gICovCi0JCSAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JCWlmIChjID09ICctJyAmJiAqcCAhPSAnXScpCi0JCSAgewotCQkgICAgY2VuZCA9ICpwKys7Ci0JCSAgICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgY2VuZCA9PSAnXFwnKQotCQkgICAgICBjZW5kID0gKnArKzsKLQkJICAgIGlmIChjZW5kID09ICdcMCcpCi0JCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkJICAgIGNlbmQgPSBGT0xEIChjZW5kKTsKLQotCQkgICAgYyA9ICpwKys7Ci0JCSAgfQotCi0JCWlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgPj0gY3N0YXJ0Ci0JCSAgICAmJiBGT0xEICgodW5zaWduZWQgY2hhcikqbikgPD0gY2VuZCkKLQkJICBnb3RvIG1hdGNoZWQ7Ci0KLQkJaWYgKGMgPT0gJ10nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKCFub3QpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgICBicmVhazsKLQotCSAgbWF0Y2hlZDo7Ci0JICAgIC8qIFNraXAgdGhlIHJlc3Qgb2YgdGhlIFsuLi5dIHRoYXQgYWxyZWFkeSBtYXRjaGVkLiAgKi8KLQkgICAgd2hpbGUgKGMgIT0gJ10nKQotCSAgICAgIHsKLQkJaWYgKGMgPT0gJ1wwJykKLQkJICAvKiBbLi4uICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJYyA9ICpwKys7Ci0JCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCi0JCSAgLyogWFhYIDEwMDMuMmQxMSBpcyB1bmNsZWFyIGlmIHRoaXMgaXMgcmlnaHQuICAqLwotCQkgICsrcDsKLQkgICAgICB9Ci0JICAgIGlmIChub3QpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKGMgIT0gRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JfQotCi0gICAgICArK247Ci0gICAgfQotCi0gIGlmICgqbiA9PSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoZmxhZ3MgJiBGTk1fTEVBRElOR19ESVIpICYmICpuID09ICcvJykKLSAgICAvKiBUaGUgRk5NX0xFQURJTkdfRElSIGZsYWcgc2F5cyB0aGF0ICJmb28qIiBtYXRjaGVzICJmb29iYXIvZnJvYm96eiIuICAqLwotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBGTk1fTk9NQVRDSDsKLX0KLQotI2VuZGlmCS8qIF9MSUJDIG9yIG5vdCBfX0dOVV9MSUJSQVJZX18uICAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldGN3ZC5jIGIvbGliaWJlcnR5L2dldGN3ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2IxYzFlLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRjd2QuYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIEVtdWxhdGUgZ2V0Y3dkIHVzaW5nIGdldHdkLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlnZXRjd2QgLS0gZ2V0IGFic29sdXRlIHBhdGhuYW1lIGZvciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0KLVNZTk9QU0lTCi0JY2hhciAqZ2V0Y3dkIChjaGFyIHBhdGhuYW1lW2xlbl0sIGxlbikKLQotREVTQ1JJUFRJT04KLQlDb3B5IHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBmb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW50bwotCXRoZSBzdXBwbGllZCBidWZmZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4gIElmIHRoZSAKLQljdXJyZW50IGRpcmVjdG9yeSdzIHBhdGggZG9lc24ndCBmaXQgaW4gTEVOIGNoYXJhY3RlcnMsIHRoZSByZXN1bHQKLQlpcyBOVUxMIGFuZCBlcnJubyBpcyBzZXQuCi0KLQlJZiBwYXRobmFtZSBpcyBhIG51bGwgcG9pbnRlciwgZ2V0Y3dkKCkgd2lsbCBvYnRhaW4gc2l6ZSBieXRlcyBvZgotCXNwYWNlIHVzaW5nIG1hbGxvYy4KLQotQlVHUwotCUVtdWxhdGVkIHZpYSB0aGUgZ2V0d2QoKSBjYWxsLCB3aGljaCBpcyByZWFzb25hYmxlIGZvciBtb3N0Ci0Jc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGdldGN3ZCgpLgotCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotCi1leHRlcm4gY2hhciAqZ2V0d2QgKCk7Ci1leHRlcm4gaW50IGVycm5vOwotCi0jaWZuZGVmIE1BWFBBVEhMRU4KLSNkZWZpbmUgTUFYUEFUSExFTiAxMDI0Ci0jZW5kaWYKLQotY2hhciAqCi1nZXRjd2QgKGJ1ZiwgbGVuKQotICBjaGFyICpidWY7Ci0gIGludCBsZW47Ci17Ci0gIGNoYXIgb3VyYnVmW01BWFBBVEhMRU5dOwotICBjaGFyICpyZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZ2V0d2QgKG91cmJ1Zik7Ci0gIGlmIChyZXN1bHQpIHsKLSAgICBpZiAoc3RybGVuIChvdXJidWYpID49IGxlbikgewotICAgICAgZXJybm8gPSBFUkFOR0U7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFidWYpIHsKLSAgICAgICBidWYgPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgICAgaWYgKCFidWYpIHsKLSAgICAgICAgICAgZXJybm8gPSBFTk9NRU07Ci0JICAgcmV0dXJuIDA7Ci0gICAgICAgfQotICAgIH0KLSAgICBzdHJjcHkgKGJ1Ziwgb3VyYnVmKTsKLSAgfQotICByZXR1cm4gYnVmOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldG9wdC5jIGIvbGliaWJlcnR5L2dldG9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE1MzFlLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRvcHQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTYgKzAsMCBAQAotLyogR2V0b3B0IGZvciBHTlUuCi0gICBOT1RFOiBnZXRvcHQgaXMgbm93IHBhcnQgb2YgdGhlIEMgbGlicmFyeSwgc28gaWYgeW91IGRvbid0IGtub3cgd2hhdAotICAgIktlZXAgdGhpcyBmaWxlIG5hbWUtc3BhY2UgY2xlYW4iIG1lYW5zLCB0YWxrIHRvIGRyZXBwZXJAZ251Lm9yZwotICAgYmVmb3JlIGNoYW5naW5nIGl0IQotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OAotICAgCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotDAotLyogVGhpcyB0ZWxscyBBbHBoYSBPU0YvMSBub3QgdG8gZGVmaW5lIGEgZ2V0b3B0IHByb3RvdHlwZSBpbiA8c3RkaW8uaD4uCi0gICBEaXR0byBmb3IgQUlYIDMuMiBhbmQgPHN0ZGxpYi5oPi4gICovCi0jaWZuZGVmIF9OT19QUk9UTwotIyBkZWZpbmUgX05PX1BST1RPCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotIyBpZm5kZWYgY29uc3QKLSMgIGRlZmluZSBjb25zdAotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jZGVmaW5lIEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiAyCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKLSMgaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jIGlmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgotIyAgZGVmaW5lIEVMSURFX0NPREUKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0vKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCi0gICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLwotI2lmZGVmCV9fR05VX0xJQlJBUllfXwotLyogRG9uJ3QgaW5jbHVkZSBzdGRsaWIuaCBmb3Igbm9uLUdOVSBDIGxpYnJhcmllcyBiZWNhdXNlIHNvbWUgb2YgdGhlbQotICAgY29udGFpbiBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQuICAqLwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYJLyogR05VIEMgbGlicmFyeS4gICovCi0KLSNpZmRlZiBWTVMKLSMgaW5jbHVkZSA8dW5peGxpYi5oPgotIyBpZiBIQVZFX1NUUklOR19IIC0gMAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBfCi0vKiBUaGlzIGlzIGZvciBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucyB3aXRoIGludGVybmF0aW9uYWxpemVkIG1lc3NhZ2VzLgotICAgV2hlbiBjb21waWxpbmcgbGliYywgdGhlIF8gbWFjcm8gaXMgcHJlZGVmaW5lZC4gICovCi0jIGlmZGVmIEhBVkVfTElCSU5UTF9ICi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jICBkZWZpbmUgXyhtc2dpZCkJZ2V0dGV4dCAobXNnaWQpCi0jIGVsc2UKLSMgIGRlZmluZSBfKG1zZ2lkKQkobXNnaWQpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogVGhpcyB2ZXJzaW9uIG9mIGBnZXRvcHQnIGFwcGVhcnMgdG8gdGhlIGNhbGxlciBsaWtlIHN0YW5kYXJkIFVuaXggYGdldG9wdCcKLSAgIGJ1dCBpdCBiZWhhdmVzIGRpZmZlcmVudGx5IGZvciB0aGUgdXNlciwgc2luY2UgaXQgYWxsb3dzIHRoZSB1c2VyCi0gICB0byBpbnRlcnNwZXJzZSB0aGUgb3B0aW9ucyB3aXRoIHRoZSBvdGhlciBhcmd1bWVudHMuCi0KLSAgIEFzIGBnZXRvcHQnIHdvcmtzLCBpdCBwZXJtdXRlcyB0aGUgZWxlbWVudHMgb2YgQVJHViBzbyB0aGF0LAotICAgd2hlbiBpdCBpcyBkb25lLCBhbGwgdGhlIG9wdGlvbnMgcHJlY2VkZSBldmVyeXRoaW5nIGVsc2UuICBUaHVzCi0gICBhbGwgYXBwbGljYXRpb24gcHJvZ3JhbXMgYXJlIGV4dGVuZGVkIHRvIGhhbmRsZSBmbGV4aWJsZSBhcmd1bWVudCBvcmRlci4KLQotICAgU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNUIGRpc2FibGVzIHBlcm11dGF0aW9uLgotICAgVGhlbiB0aGUgYmVoYXZpb3IgaXMgY29tcGxldGVseSBzdGFuZGFyZC4KLQotICAgR05VIGFwcGxpY2F0aW9uIHByb2dyYW1zIGNhbiB1c2UgYSB0aGlyZCBhbHRlcm5hdGl2ZSBtb2RlIGluIHdoaWNoCi0gICB0aGV5IGNhbiBkaXN0aW5ndWlzaCB0aGUgcmVsYXRpdmUgb3JkZXIgb2Ygb3B0aW9ucyBhbmQgb3RoZXIgYXJndW1lbnRzLiAgKi8KLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi0vKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIGBnZXRvcHQnIHRvIHRoZSBjYWxsZXIuCi0gICBXaGVuIGBnZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAotICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCi0gICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAotICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KLQotY2hhciAqb3B0YXJnID0gTlVMTDsKLQotLyogSW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHNjYW5uZWQuCi0gICBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gdG8gYW5kIGZyb20gdGhlIGNhbGxlcgotICAgYW5kIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBgZ2V0b3B0Jy4KLQotICAgT24gZW50cnkgdG8gYGdldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KLQotICAgV2hlbiBgZ2V0b3B0JyByZXR1cm5zIC0xLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlCi0gICBub24tb3B0aW9uIGVsZW1lbnRzIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgaXRzZWxmIHNjYW4uCi0KLSAgIE90aGVyd2lzZSwgYG9wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKLSAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLwotCi0vKiAxMDAzLjIgc2F5cyB0aGlzIG11c3QgYmUgMSBiZWZvcmUgYW55IGNhbGwuICAqLwotaW50IG9wdGluZCA9IDE7Ci0KLS8qIEZvcm1lcmx5LCBpbml0aWFsaXphdGlvbiBvZiBnZXRvcHQgZGVwZW5kZWQgb24gb3B0aW5kPT0wLCB3aGljaAotICAgY2F1c2VzIHByb2JsZW1zIHdpdGggcmUtY2FsbGluZyBnZXRvcHQgYXMgcHJvZ3JhbXMgZ2VuZXJhbGx5IGRvbid0Ci0gICBrbm93IHRoYXQuICovCi0KLWludCBfX2dldG9wdF9pbml0aWFsaXplZCA9IDA7Ci0KLS8qIFRoZSBuZXh0IGNoYXIgdG8gYmUgc2Nhbm5lZCBpbiB0aGUgb3B0aW9uLWVsZW1lbnQKLSAgIGluIHdoaWNoIHRoZSBsYXN0IG9wdGlvbiBjaGFyYWN0ZXIgd2UgcmV0dXJuZWQgd2FzIGZvdW5kLgotICAgVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCB0aGUgc2NhbiB3aGVyZSB3ZSBsZWZ0IG9mZi4KLQotICAgSWYgdGhpcyBpcyB6ZXJvLCBvciBhIG51bGwgc3RyaW5nLCBpdCBtZWFucyByZXN1bWUgdGhlIHNjYW4KLSAgIGJ5IGFkdmFuY2luZyB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLwotCi1zdGF0aWMgY2hhciAqbmV4dGNoYXI7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UKLSAgIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucy4gICovCi0KLWludCBvcHRlcnIgPSAxOwotCi0vKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLgotICAgVGhpcyBtdXN0IGJlIGluaXRpYWxpemVkIG9uIHNvbWUgc3lzdGVtcyB0byBhdm9pZCBsaW5raW5nIGluIHRoZQotICAgc3lzdGVtJ3Mgb3duIGdldG9wdCBpbXBsZW1lbnRhdGlvbi4gICovCi0KLWludCBvcHRvcHQgPSAnPyc7Ci0KLS8qIERlc2NyaWJlIGhvdyB0byBkZWFsIHdpdGggb3B0aW9ucyB0aGF0IGZvbGxvdyBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCi0KLSAgIElmIHRoZSBjYWxsZXIgZGlkIG5vdCBzcGVjaWZ5IGFueXRoaW5nLAotICAgdGhlIGRlZmF1bHQgaXMgUkVRVUlSRV9PUkRFUiBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgIFBPU0lYTFlfQ09SUkVDVCBpcyBkZWZpbmVkLCBQRVJNVVRFIG90aGVyd2lzZS4KLQotICAgUkVRVUlSRV9PUkRFUiBtZWFucyBkb24ndCByZWNvZ25pemUgdGhlbSBhcyBvcHRpb25zOwotICAgc3RvcCBvcHRpb24gcHJvY2Vzc2luZyB3aGVuIHRoZSBmaXJzdCBub24tb3B0aW9uIGlzIHNlZW4uCi0gICBUaGlzIGlzIHdoYXQgVW5peCBkb2VzLgotICAgVGhpcyBtb2RlIG9mIG9wZXJhdGlvbiBpcyBzZWxlY3RlZCBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKLSAgIHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCwgb3IgdXNpbmcgYCsnIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzLgotCi0gICBQRVJNVVRFIGlzIHRoZSBkZWZhdWx0LiAgV2UgcGVybXV0ZSB0aGUgY29udGVudHMgb2YgQVJHViBhcyB3ZSBzY2FuLAotICAgc28gdGhhdCBldmVudHVhbGx5IGFsbCB0aGUgbm9uLW9wdGlvbnMgYXJlIGF0IHRoZSBlbmQuICBUaGlzIGFsbG93cyBvcHRpb25zCi0gICB0byBiZSBnaXZlbiBpbiBhbnkgb3JkZXIsIGV2ZW4gd2l0aCBwcm9ncmFtcyB0aGF0IHdlcmUgbm90IHdyaXR0ZW4gdG8KLSAgIGV4cGVjdCB0aGlzLgotCi0gICBSRVRVUk5fSU5fT1JERVIgaXMgYW4gb3B0aW9uIGF2YWlsYWJsZSB0byBwcm9ncmFtcyB0aGF0IHdlcmUgd3JpdHRlbgotICAgdG8gZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgYXMgaWYgaXQgd2VyZSB0aGUgYXJndW1lbnQgb2YgYW4gb3B0aW9uIHdpdGggY2hhcmFjdGVyIGNvZGUgMS4KLSAgIFVzaW5nIGAtJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBzZWxlY3RzIHRoaXMgbW9kZSBvZiBvcGVyYXRpb24uCi0KLSAgIFRoZSBzcGVjaWFsIGFyZ3VtZW50IGAtLScgZm9yY2VzIGFuIGVuZCBvZiBvcHRpb24tc2Nhbm5pbmcgcmVnYXJkbGVzcwotICAgb2YgdGhlIHZhbHVlIG9mIGBvcmRlcmluZycuICBJbiB0aGUgY2FzZSBvZiBSRVRVUk5fSU5fT1JERVIsIG9ubHkKLSAgIGAtLScgY2FuIGNhdXNlIGBnZXRvcHQnIHRvIHJldHVybiAtMSB3aXRoIGBvcHRpbmQnICE9IEFSR0MuICAqLwotCi1zdGF0aWMgZW51bQotewotICBSRVFVSVJFX09SREVSLCBQRVJNVVRFLCBSRVRVUk5fSU5fT1JERVIKLX0gb3JkZXJpbmc7Ci0KLS8qIFZhbHVlIG9mIFBPU0lYTFlfQ09SUkVDVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi1zdGF0aWMgY2hhciAqcG9zaXhseV9jb3JyZWN0OwotDAotI2lmZGVmCV9fR05VX0xJQlJBUllfXwotLyogV2Ugd2FudCB0byBhdm9pZCBpbmNsdXNpb24gb2Ygc3RyaW5nLmggd2l0aCBub24tR05VIGxpYnJhcmllcwotICAgYmVjYXVzZSB0aGVyZSBhcmUgbWFueSB3YXlzIGl0IGNhbiBjYXVzZSB0cm91YmxlLgotICAgT24gc29tZSBzeXN0ZW1zLCBpdCBjb250YWlucyBzcGVjaWFsIG1hZ2ljIG1hY3JvcyB0aGF0IGRvbid0IHdvcmsKLSAgIGluIEdDQy4gICovCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBkZWZpbmUgbXlfaW5kZXgJc3RyY2hyCi0jZWxzZQotCi0jIGlmIEhBVkVfU1RSSU5HX0gKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyBlbHNlCi0jICBpZiBIQVZFX1NUUklOR1NfSAotIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgIGVuZGlmCi0jIGVuZGlmCi0KLS8qIEF2b2lkIGRlcGVuZGluZyBvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBvciBmaWxlcwotICAgd2hvc2UgbmFtZXMgYXJlIGluY29uc2lzdGVudC4gICovCi0KLSNpZm5kZWYgZ2V0ZW52Ci1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLW15X2luZGV4IChzdHIsIGNocikKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBpbnQgY2hyOwotewotICB3aGlsZSAoKnN0cikKLSAgICB7Ci0gICAgICBpZiAoKnN0ciA9PSBjaHIpCi0JcmV0dXJuIChjaGFyICopIHN0cjsKLSAgICAgIHN0cisrOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHVzaW5nIEdDQywgd2UgY2FuIHNhZmVseSBkZWNsYXJlIHN0cmxlbiB0aGlzIHdheS4KLSAgIElmIG5vdCB1c2luZyBHQ0MsIGl0IGlzIG9rIG5vdCB0byBkZWNsYXJlIGl0LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotLyogTm90ZSB0aGF0IE1vdG9yb2xhIERlbHRhIDY4ayBSM1Y3IGNvbWVzIHdpdGggR0NDIGJ1dCBub3Qgc3RkZGVmLmguCi0gICBUaGF0IHdhcyByZWxldmFudCB0byBjb2RlIHRoYXQgd2FzIGhlcmUgYmVmb3JlLiAgKi8KLSMgaWYgKCFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXykgJiYgIWRlZmluZWQgc3RybGVuCi0vKiBnY2Mgd2l0aCAtdHJhZGl0aW9uYWwgZGVjbGFyZXMgdGhlIGJ1aWx0LWluIHN0cmxlbiB0byByZXR1cm4gaW50LAotICAgYW5kIGhhcyBkb25lIHNvIGF0IGxlYXN0IHNpbmNlIHZlcnNpb24gMi40LjUuIC0tIHJtcy4gICovCi1leHRlcm4gaW50IHN0cmxlbiAoY29uc3QgY2hhciAqKTsKLSMgZW5kaWYgLyogbm90IF9fU1REQ19fICovCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQotI2VuZGlmIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KLQwKLS8qIEhhbmRsZSBwZXJtdXRhdGlvbiBvZiBhcmd1bWVudHMuICAqLwotCi0vKiBEZXNjcmliZSB0aGUgcGFydCBvZiBBUkdWIHRoYXQgY29udGFpbnMgbm9uLW9wdGlvbnMgdGhhdCBoYXZlCi0gICBiZWVuIHNraXBwZWQuICBgZmlyc3Rfbm9ub3B0JyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3Qgb2YgdGhlbTsKLSAgIGBsYXN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IG9mIHRoZW0uICAqLwotCi1zdGF0aWMgaW50IGZpcnN0X25vbm9wdDsKLXN0YXRpYyBpbnQgbGFzdF9ub25vcHQ7Ci0KLSNpZmRlZiBfTElCQwotLyogQmFzaCAyLjAgZ2l2ZXMgdXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyBmbGFncwotICAgaW5kaWNhdGluZyBBUkdWIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFyZ3VtZW50cy4gICovCi0KLS8qIERlZmluZWQgaW4gZ2V0b3B0X2luaXQuYyAgKi8KLWV4dGVybiBjaGFyICpfX2dldG9wdF9ub25vcHRpb25fZmxhZ3M7Ci0KLXN0YXRpYyBpbnQgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47Ci1zdGF0aWMgaW50IG5vbm9wdGlvbl9mbGFnc19sZW47Ci0KLXN0YXRpYyBpbnQgb3JpZ2luYWxfYXJnYzsKLXN0YXRpYyBjaGFyICpjb25zdCAqb3JpZ2luYWxfYXJndjsKLQotLyogTWFrZSBzdXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYXNoIDIuMCBwdXRzIGluIHRoZSBlbnZpcm9ubWVudAotICAgaXMgdmFsaWQgZm9yIHRoZSBnZXRvcHQgY2FsbCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBBUkdWIHBhc3NlZAotICAgdG8gZ2V0b3B0IGlzIHRoYXQgb25lIHBhc3NlZCB0byB0aGUgcHJvY2Vzcy4gICovCi1zdGF0aWMgdm9pZAotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1zdG9yZV9hcmdzX2FuZF9lbnYgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKLXsKLSAgLyogWFhYIFRoaXMgaXMgbm8gZ29vZCBzb2x1dGlvbi4gIFdlIHNob3VsZCByYXRoZXIgY29weSB0aGUgYXJncyBzbwotICAgICB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZW0gbGF0ZXIuICBCdXQgd2UgbXVzdCBub3QgdXNlIG1hbGxvYygzKS4gICovCi0gIG9yaWdpbmFsX2FyZ2MgPSBhcmdjOwotICBvcmlnaW5hbF9hcmd2ID0gYXJndjsKLX0KLSMgaWZkZWYgdGV4dF9zZXRfZWxlbWVudAotdGV4dF9zZXRfZWxlbWVudCAoX19saWJjX3N1YmluaXQsIHN0b3JlX2FyZ3NfYW5kX2Vudik7Ci0jIGVuZGlmIC8qIHRleHRfc2V0X2VsZW1lbnQgKi8KLQotIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikgXAotICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDApCQkJCQkJICAgICAgXAotICAgIHsJCQkJCQkJCQkgICAgICBcCi0gICAgICBjaGFyIF9fdG1wID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV07CQkJICAgICAgXAotICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV0gPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gyXTsJICAgICAgXAotICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMl0gPSBfX3RtcDsJCQkJICAgICAgXAotICAgIH0KLSNlbHNlCS8qICFfTElCQyAqLwotIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikKLSNlbmRpZgkvKiBfTElCQyAqLwotCi0vKiBFeGNoYW5nZSB0d28gYWRqYWNlbnQgc3Vic2VxdWVuY2VzIG9mIEFSR1YuCi0gICBPbmUgc3Vic2VxdWVuY2UgaXMgZWxlbWVudHMgW2ZpcnN0X25vbm9wdCxsYXN0X25vbm9wdCkKLSAgIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbm9uLW9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2tpcHBlZCBzbyBmYXIuCi0gICBUaGUgb3RoZXIgaXMgZWxlbWVudHMgW2xhc3Rfbm9ub3B0LG9wdGluZCksIHdoaWNoIGNvbnRhaW5zIGFsbAotICAgdGhlIG9wdGlvbnMgcHJvY2Vzc2VkIHNpbmNlIHRob3NlIG5vbi1vcHRpb25zIHdlcmUgc2tpcHBlZC4KLQotICAgYGZpcnN0X25vbm9wdCcgYW5kIGBsYXN0X25vbm9wdCcgYXJlIHJlbG9jYXRlZCBzbyB0aGF0IHRoZXkgZGVzY3JpYmUKLSAgIHRoZSBuZXcgaW5kaWNlcyBvZiB0aGUgbm9uLW9wdGlvbnMgaW4gQVJHViBhZnRlciB0aGV5IGFyZSBtb3ZlZC4gICovCi0KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBleGNoYW5nZSAoY2hhciAqKik7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWV4Y2hhbmdlIChhcmd2KQotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGJvdHRvbSA9IGZpcnN0X25vbm9wdDsKLSAgaW50IG1pZGRsZSA9IGxhc3Rfbm9ub3B0OwotICBpbnQgdG9wID0gb3B0aW5kOwotICBjaGFyICp0ZW07Ci0KLSAgLyogRXhjaGFuZ2UgdGhlIHNob3J0ZXIgc2VnbWVudCB3aXRoIHRoZSBmYXIgZW5kIG9mIHRoZSBsb25nZXIgc2VnbWVudC4KLSAgICAgVGhhdCBwdXRzIHRoZSBzaG9ydGVyIHNlZ21lbnQgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0gICAgIEl0IGxlYXZlcyB0aGUgbG9uZ2VyIHNlZ21lbnQgaW4gdGhlIHJpZ2h0IHBsYWNlIG92ZXJhbGwsCi0gICAgIGJ1dCBpdCBjb25zaXN0cyBvZiB0d28gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHN3YXBwZWQgbmV4dC4gICovCi0KLSNpZmRlZiBfTElCQwotICAvKiBGaXJzdCBtYWtlIHN1cmUgdGhlIGhhbmRsaW5nIG9mIHRoZSBgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzJwotICAgICBzdHJpbmcgY2FuIHdvcmsgbm9ybWFsbHkuICBPdXIgdG9wIGFyZ3VtZW50IG11c3QgYmUgaW4gdGhlIHJhbmdlCi0gICAgIG9mIHRoZSBzdHJpbmcuICAqLwotICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDAgJiYgdG9wID49IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgZXh0ZW5kIHRoZSBhcnJheS4gIFRoZSB1c2VyIHBsYXlzIGdhbWVzIHdpdGggdXMgYW5kCi0JIHByZXNlbnRzIG5ldyBhcmd1bWVudHMuICAqLwotICAgICAgY2hhciAqbmV3X3N0ciA9IG1hbGxvYyAodG9wICsgMSk7Ci0gICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKQotCW5vbm9wdGlvbl9mbGFnc19sZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtc2V0IChfX21lbXBjcHkgKG5ld19zdHIsIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywKLQkJCSAgICAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pLAotCQkgICdcMCcsIHRvcCArIDEgLSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7Ci0JICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IHRvcCArIDE7Ci0JICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPSBuZXdfc3RyOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICB3aGlsZSAodG9wID4gbWlkZGxlICYmIG1pZGRsZSA+IGJvdHRvbSkKLSAgICB7Ci0gICAgICBpZiAodG9wIC0gbWlkZGxlID4gbWlkZGxlIC0gYm90dG9tKQotCXsKLQkgIC8qIEJvdHRvbSBzZWdtZW50IGlzIHRoZSBzaG9ydCBvbmUuICAqLwotCSAgaW50IGxlbiA9IG1pZGRsZSAtIGJvdHRvbTsKLQkgIHJlZ2lzdGVyIGludCBpOwotCi0JICAvKiBTd2FwIGl0IHdpdGggdGhlIHRvcCBwYXJ0IG9mIHRoZSB0b3Agc2VnbWVudC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIHsKLQkgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOwotCSAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV07Ci0JICAgICAgYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldID0gdGVtOwotCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIHRvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaSk7Ci0JICAgIH0KLQkgIC8qIEV4Y2x1ZGUgdGhlIG1vdmVkIGJvdHRvbSBzZWdtZW50IGZyb20gZnVydGhlciBzd2FwcGluZy4gICovCi0JICB0b3AgLT0gbGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUb3Agc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KLQkgIGludCBsZW4gPSB0b3AgLSBtaWRkbGU7Ci0JICByZWdpc3RlciBpbnQgaTsKLQotCSAgLyogU3dhcCBpdCB3aXRoIHRoZSBib3R0b20gcGFydCBvZiB0aGUgYm90dG9tIHNlZ21lbnQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgdGVtID0gYXJndltib3R0b20gKyBpXTsKLQkgICAgICBhcmd2W2JvdHRvbSArIGldID0gYXJndlttaWRkbGUgKyBpXTsKLQkgICAgICBhcmd2W21pZGRsZSArIGldID0gdGVtOwotCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIG1pZGRsZSArIGkpOwotCSAgICB9Ci0JICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCB0b3Agc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLwotCSAgYm90dG9tICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSByZWNvcmRzIGZvciB0aGUgc2xvdHMgdGhlIG5vbi1vcHRpb25zIG5vdyBvY2N1cHkuICAqLwotCi0gIGZpcnN0X25vbm9wdCArPSAob3B0aW5kIC0gbGFzdF9ub25vcHQpOwotICBsYXN0X25vbm9wdCA9IG9wdGluZDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSB3aGVuIHRoZSBmaXJzdCBjYWxsIGlzIG1hZGUuICAqLwotCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRvcHRfaW5pdGlhbGl6ZSAoaW50LCBjaGFyICpjb25zdCAqLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi1zdGF0aWMgY29uc3QgY2hhciAqCi1fZ2V0b3B0X2luaXRpYWxpemUgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZykKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Ci17Ci0gIC8qIFN0YXJ0IHByb2Nlc3Npbmcgb3B0aW9ucyB3aXRoIEFSR1YtZWxlbWVudCAxIChzaW5jZSBBUkdWLWVsZW1lbnQgMAotICAgICBpcyB0aGUgcHJvZ3JhbSBuYW1lKTsgdGhlIHNlcXVlbmNlIG9mIHByZXZpb3VzbHkgc2tpcHBlZAotICAgICBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMgaXMgZW1wdHkuICAqLwotCi0gIGZpcnN0X25vbm9wdCA9IGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotCi0gIG5leHRjaGFyID0gTlVMTDsKLQotICBwb3NpeGx5X2NvcnJlY3QgPSBnZXRlbnYgKCJQT1NJWExZX0NPUlJFQ1QiKTsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgb3JkZXJpbmcgb2Ygb3B0aW9ucyBhbmQgbm9ub3B0aW9ucy4gICovCi0KLSAgaWYgKG9wdHN0cmluZ1swXSA9PSAnLScpCi0gICAgewotICAgICAgb3JkZXJpbmcgPSBSRVRVUk5fSU5fT1JERVI7Ci0gICAgICArK29wdHN0cmluZzsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wdHN0cmluZ1swXSA9PSAnKycpCi0gICAgewotICAgICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOwotICAgICAgKytvcHRzdHJpbmc7Ci0gICAgfQotICBlbHNlIGlmIChwb3NpeGx5X2NvcnJlY3QgIT0gTlVMTCkKLSAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7Ci0gIGVsc2UKLSAgICBvcmRlcmluZyA9IFBFUk1VVEU7Ci0KLSNpZmRlZiBfTElCQwotICBpZiAocG9zaXhseV9jb3JyZWN0ID09IE5VTEwKLSAgICAgICYmIGFyZ2MgPT0gb3JpZ2luYWxfYXJnYyAmJiBhcmd2ID09IG9yaWdpbmFsX2FyZ3YpCi0gICAgewotICAgICAgaWYgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID09IDApCi0JewotCSAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMCi0JICAgICAgfHwgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzWzBdID09ICdcMCcpCi0JICAgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gLTE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvcmlnX3N0ciA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnczsKLQkgICAgICBpbnQgbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSBzdHJsZW4gKG9yaWdfc3RyKTsKLQkgICAgICBpZiAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPCBhcmdjKQotCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IGFyZ2M7Ci0JICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID0KLQkJKGNoYXIgKikgbWFsbG9jIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7Ci0JICAgICAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMKQotCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IC0xOwotCSAgICAgIGVsc2UKLQkJbWVtc2V0IChfX21lbXBjcHkgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywgb3JpZ19zdHIsIGxlbiksCi0JCQknXDAnLCBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiAtIGxlbik7Ci0JICAgIH0KLQl9Ci0gICAgICBub25vcHRpb25fZmxhZ3NfbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IDA7Ci0jZW5kaWYKLQotICByZXR1cm4gb3B0c3RyaW5nOwotfQotDAotLyogU2NhbiBlbGVtZW50cyBvZiBBUkdWICh3aG9zZSBsZW5ndGggaXMgQVJHQykgZm9yIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBnaXZlbiBpbiBPUFRTVFJJTkcuCi0KLSAgIElmIGFuIGVsZW1lbnQgb2YgQVJHViBzdGFydHMgd2l0aCAnLScsIGFuZCBpcyBub3QgZXhhY3RseSAiLSIgb3IgIi0tIiwKLSAgIHRoZW4gaXQgaXMgYW4gb3B0aW9uIGVsZW1lbnQuICBUaGUgY2hhcmFjdGVycyBvZiB0aGlzIGVsZW1lbnQKLSAgIChhc2lkZSBmcm9tIHRoZSBpbml0aWFsICctJykgYXJlIG9wdGlvbiBjaGFyYWN0ZXJzLiAgSWYgYGdldG9wdCcKLSAgIGlzIGNhbGxlZCByZXBlYXRlZGx5LCBpdCByZXR1cm5zIHN1Y2Nlc3NpdmVseSBlYWNoIG9mIHRoZSBvcHRpb24gY2hhcmFjdGVycwotICAgZnJvbSBlYWNoIG9mIHRoZSBvcHRpb24gZWxlbWVudHMuCi0KLSAgIElmIGBnZXRvcHQnIGZpbmRzIGFub3RoZXIgb3B0aW9uIGNoYXJhY3RlciwgaXQgcmV0dXJucyB0aGF0IGNoYXJhY3RlciwKLSAgIHVwZGF0aW5nIGBvcHRpbmQnIGFuZCBgbmV4dGNoYXInIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBgZ2V0b3B0JyBjYW4KLSAgIHJlc3VtZSB0aGUgc2NhbiB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGNoYXJhY3RlciBvciBBUkdWLWVsZW1lbnQuCi0KLSAgIElmIHRoZXJlIGFyZSBubyBtb3JlIG9wdGlvbiBjaGFyYWN0ZXJzLCBgZ2V0b3B0JyByZXR1cm5zIC0xLgotICAgVGhlbiBgb3B0aW5kJyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgQVJHVi1lbGVtZW50Ci0gICB0aGF0IGlzIG5vdCBhbiBvcHRpb24uICAoVGhlIEFSR1YtZWxlbWVudHMgaGF2ZSBiZWVuIHBlcm11dGVkCi0gICBzbyB0aGF0IHRob3NlIHRoYXQgYXJlIG5vdCBvcHRpb25zIG5vdyBjb21lIGxhc3QuKQotCi0gICBPUFRTVFJJTkcgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbGVnaXRpbWF0ZSBvcHRpb24gY2hhcmFjdGVycy4KLSAgIElmIGFuIG9wdGlvbiBjaGFyYWN0ZXIgaXMgc2VlbiB0aGF0IGlzIG5vdCBsaXN0ZWQgaW4gT1BUU1RSSU5HLAotICAgcmV0dXJuICc/JyBhZnRlciBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlLiAgSWYgeW91IHNldCBgb3B0ZXJyJyB0bwotICAgemVybywgdGhlIGVycm9yIG1lc3NhZ2UgaXMgc3VwcHJlc3NlZCBidXQgd2Ugc3RpbGwgcmV0dXJuICc/Jy4KLQotICAgSWYgYSBjaGFyIGluIE9QVFNUUklORyBpcyBmb2xsb3dlZCBieSBhIGNvbG9uLCB0aGF0IG1lYW5zIGl0IHdhbnRzIGFuIGFyZywKLSAgIHNvIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIG9yIHRoZSB0ZXh0IG9mIHRoZSBmb2xsb3dpbmcKLSAgIEFSR1YtZWxlbWVudCwgaXMgcmV0dXJuZWQgaW4gYG9wdGFyZycuICBUd28gY29sb25zIG1lYW4gYW4gb3B0aW9uIHRoYXQKLSAgIHdhbnRzIGFuIG9wdGlvbmFsIGFyZzsgaWYgdGhlcmUgaXMgdGV4dCBpbiB0aGUgY3VycmVudCBBUkdWLWVsZW1lbnQsCi0gICBpdCBpcyByZXR1cm5lZCBpbiBgb3B0YXJnJywgb3RoZXJ3aXNlIGBvcHRhcmcnIGlzIHNldCB0byB6ZXJvLgotCi0gICBJZiBPUFRTVFJJTkcgc3RhcnRzIHdpdGggYC0nIG9yIGArJywgaXQgcmVxdWVzdHMgZGlmZmVyZW50IG1ldGhvZHMgb2YKLSAgIGhhbmRsaW5nIHRoZSBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCi0gICBTZWUgdGhlIGNvbW1lbnRzIGFib3V0IFJFVFVSTl9JTl9PUkRFUiBhbmQgUkVRVUlSRV9PUkRFUiwgYWJvdmUuCi0KLSAgIExvbmctbmFtZWQgb3B0aW9ucyBiZWdpbiB3aXRoIGAtLScgaW5zdGVhZCBvZiBgLScuCi0gICBUaGVpciBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgbG9uZyBhcyB0aGUgYWJicmV2aWF0aW9uIGlzIHVuaXF1ZQotICAgb3IgaXMgYW4gZXhhY3QgbWF0Y2ggZm9yIHNvbWUgZGVmaW5lZCBvcHRpb24uICBJZiB0aGV5IGhhdmUgYW4KLSAgIGFyZ3VtZW50LCBpdCBmb2xsb3dzIHRoZSBvcHRpb24gbmFtZSBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgb3B0aW9uIG5hbWUgYnkgYSBgPScsIG9yIGVsc2UgdGhlIGluIG5leHQgQVJHVi1lbGVtZW50LgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhIGxvbmctbmFtZWQgb3B0aW9uLCBpdCByZXR1cm5zIDAgaWYgdGhhdCBvcHRpb24ncwotICAgYGZsYWcnIGZpZWxkIGlzIG5vbnplcm8sIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uJ3MgYHZhbCcgZmllbGQKLSAgIGlmIHRoZSBgZmxhZycgZmllbGQgaXMgemVyby4KLQotICAgVGhlIGVsZW1lbnRzIG9mIEFSR1YgYXJlbid0IHJlYWxseSBjb25zdCwgYmVjYXVzZSB3ZSBwZXJtdXRlIHRoZW0uCi0gICBCdXQgd2UgcHJldGVuZCB0aGV5J3JlIGNvbnN0IGluIHRoZSBwcm90b3R5cGUgdG8gYmUgY29tcGF0aWJsZQotICAgd2l0aCBvdGhlciBzeXN0ZW1zLgotCi0gICBMT05HT1BUUyBpcyBhIHZlY3RvciBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbgotICAgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSB3aGljaCBpcyB6ZXJvLgotCi0gICBMT05HSU5EIHJldHVybnMgdGhlIGluZGV4IGluIExPTkdPUFQgb2YgdGhlIGxvbmctbmFtZWQgb3B0aW9uIGZvdW5kLgotICAgSXQgaXMgb25seSB2YWxpZCB3aGVuIGEgbG9uZy1uYW1lZCBvcHRpb24gaGFzIGJlZW4gZm91bmQgYnkgdGhlIG1vc3QKLSAgIHJlY2VudCBjYWxsLgotCi0gICBJZiBMT05HX09OTFkgaXMgbm9uemVybywgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW50cm9kdWNlCi0gICBsb25nLW5hbWVkIG9wdGlvbnMuICAqLwotCi1pbnQKLV9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywgbG9uZ29wdHMsIGxvbmdpbmQsIGxvbmdfb25seSkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Ci0gICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICAgICBpbnQgKmxvbmdpbmQ7Ci0gICAgIGludCBsb25nX29ubHk7Ci17Ci0gIG9wdGFyZyA9IE5VTEw7Ci0KLSAgaWYgKG9wdGluZCA9PSAwIHx8ICFfX2dldG9wdF9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBpZiAob3B0aW5kID09IDApCi0Jb3B0aW5kID0gMTsJLyogRG9uJ3Qgc2NhbiBBUkdWWzBdLCB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KLSAgICAgIG9wdHN0cmluZyA9IF9nZXRvcHRfaW5pdGlhbGl6ZSAoYXJnYywgYXJndiwgb3B0c3RyaW5nKTsKLSAgICAgIF9fZ2V0b3B0X2luaXRpYWxpemVkID0gMTsKLSAgICB9Ci0KLSAgLyogVGVzdCB3aGV0aGVyIEFSR1Zbb3B0aW5kXSBwb2ludHMgdG8gYSBub24tb3B0aW9uIGFyZ3VtZW50LgotICAgICBFaXRoZXIgaXQgZG9lcyBub3QgaGF2ZSBvcHRpb24gc3ludGF4LCBvciB0aGVyZSBpcyBhbiBlbnZpcm9ubWVudCBmbGFnCi0gICAgIGZyb20gdGhlIHNoZWxsIGluZGljYXRpbmcgaXQgaXMgbm90IGFuIG9wdGlvbi4gIFRoZSBsYXRlciBpbmZvcm1hdGlvbgotICAgICBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgdXNlZCBpbiB0aGUgR05VIGxpYmMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBOT05PUFRJT05fUCAoYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJwkgICAgICBcCi0JCSAgICAgIHx8IChvcHRpbmQgPCBub25vcHRpb25fZmxhZ3NfbGVuCQkJICAgICAgXAotCQkJICAmJiBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3Nbb3B0aW5kXSA9PSAnMScpKQotI2Vsc2UKLSMgZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W29wdGluZF1bMF0gIT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnXDAnKQotI2VuZGlmCi0KLSAgaWYgKG5leHRjaGFyID09IE5VTEwgfHwgKm5leHRjaGFyID09ICdcMCcpCi0gICAgewotICAgICAgLyogQWR2YW5jZSB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLwotCi0gICAgICAvKiBHaXZlIEZJUlNUX05PTk9QVCAmIExBU1RfTk9OT1BUIHJhdGlvbmFsIHZhbHVlcyBpZiBPUFRJTkQgaGFzIGJlZW4KLQkgbW92ZWQgYmFjayBieSB0aGUgdXNlciAod2hvIG1heSBhbHNvIGhhdmUgY2hhbmdlZCB0aGUgYXJndW1lbnRzKS4gICovCi0gICAgICBpZiAobGFzdF9ub25vcHQgPiBvcHRpbmQpCi0JbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0gICAgICBpZiAoZmlyc3Rfbm9ub3B0ID4gb3B0aW5kKQotCWZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQotICAgICAgaWYgKG9yZGVyaW5nID09IFBFUk1VVEUpCi0JewotCSAgLyogSWYgd2UgaGF2ZSBqdXN0IHByb2Nlc3NlZCBzb21lIG9wdGlvbnMgZm9sbG93aW5nIHNvbWUgbm9uLW9wdGlvbnMsCi0JICAgICBleGNoYW5nZSB0aGVtIHNvIHRoYXQgdGhlIG9wdGlvbnMgY29tZSBmaXJzdC4gICovCi0KLQkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOwotCSAgZWxzZSBpZiAobGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7Ci0KLQkgIC8qIFNraXAgYW55IGFkZGl0aW9uYWwgbm9uLW9wdGlvbnMKLQkgICAgIGFuZCBleHRlbmQgdGhlIHJhbmdlIG9mIG5vbi1vcHRpb25zIHByZXZpb3VzbHkgc2tpcHBlZC4gICovCi0KLQkgIHdoaWxlIChvcHRpbmQgPCBhcmdjICYmIE5PTk9QVElPTl9QKQotCSAgICBvcHRpbmQrKzsKLQkgIGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogVGhlIHNwZWNpYWwgQVJHVi1lbGVtZW50IGAtLScgbWVhbnMgcHJlbWF0dXJlIGVuZCBvZiBvcHRpb25zLgotCSBTa2lwIGl0IGxpa2UgYSBudWxsIG9wdGlvbiwKLQkgdGhlbiBleGNoYW5nZSB3aXRoIHByZXZpb3VzIG5vbi1vcHRpb25zIGFzIGlmIGl0IHdlcmUgYW4gb3B0aW9uLAotCSB0aGVuIHNraXAgZXZlcnl0aGluZyBlbHNlIGxpa2UgYSBub24tb3B0aW9uLiAgKi8KLQotICAgICAgaWYgKG9wdGluZCAhPSBhcmdjICYmICFzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0tIikpCi0JewotCSAgb3B0aW5kKys7Ci0KLQkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOwotCSAgZWxzZSBpZiAoZmlyc3Rfbm9ub3B0ID09IGxhc3Rfbm9ub3B0KQotCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7Ci0JICBsYXN0X25vbm9wdCA9IGFyZ2M7Ci0KLQkgIG9wdGluZCA9IGFyZ2M7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGRvbmUgYWxsIHRoZSBBUkdWLWVsZW1lbnRzLCBzdG9wIHRoZSBzY2FuCi0JIGFuZCBiYWNrIG92ZXIgYW55IG5vbi1vcHRpb25zIHRoYXQgd2Ugc2tpcHBlZCBhbmQgcGVybXV0ZWQuICAqLwotCi0gICAgICBpZiAob3B0aW5kID09IGFyZ2MpCi0JewotCSAgLyogU2V0IHRoZSBuZXh0LWFyZy1pbmRleCB0byBwb2ludCBhdCB0aGUgbm9uLW9wdGlvbnMKLQkgICAgIHRoYXQgd2UgcHJldmlvdXNseSBza2lwcGVkLCBzbyB0aGUgY2FsbGVyIHdpbGwgZGlnZXN0IHRoZW0uICAqLwotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCkKLQkgICAgb3B0aW5kID0gZmlyc3Rfbm9ub3B0OwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgLyogSWYgd2UgaGF2ZSBjb21lIHRvIGEgbm9uLW9wdGlvbiBhbmQgZGlkIG5vdCBwZXJtdXRlIGl0LAotCSBlaXRoZXIgc3RvcCB0aGUgc2NhbiBvciBkZXNjcmliZSBpdCB0byB0aGUgY2FsbGVyIGFuZCBwYXNzIGl0IGJ5LiAgKi8KLQotICAgICAgaWYgKE5PTk9QVElPTl9QKQotCXsKLQkgIGlmIChvcmRlcmluZyA9PSBSRVFVSVJFX09SREVSKQotCSAgICByZXR1cm4gLTE7Ci0JICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbm90aGVyIG9wdGlvbi1BUkdWLWVsZW1lbnQuCi0JIFNraXAgdGhlIGluaXRpYWwgcHVuY3R1YXRpb24uICAqLwotCi0gICAgICBuZXh0Y2hhciA9IChhcmd2W29wdGluZF0gKyAxCi0JCSAgKyAobG9uZ29wdHMgIT0gTlVMTCAmJiBhcmd2W29wdGluZF1bMV0gPT0gJy0nKSk7Ci0gICAgfQotCi0gIC8qIERlY29kZSB0aGUgY3VycmVudCBvcHRpb24tQVJHVi1lbGVtZW50LiAgKi8KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBBUkdWLWVsZW1lbnQgaXMgYSBsb25nIG9wdGlvbi4KLQotICAgICBJZiBsb25nX29ubHkgYW5kIHRoZSBBUkdWLWVsZW1lbnQgaGFzIHRoZSBmb3JtICItZiIsIHdoZXJlIGYgaXMKLSAgICAgYSB2YWxpZCBzaG9ydCBvcHRpb24sIGRvbid0IGNvbnNpZGVyIGl0IGFuIGFiYnJldmlhdGVkIGZvcm0gb2YKLSAgICAgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KLSAgICAgd2F5IHRvIGdpdmUgdGhlIC1mIHNob3J0IG9wdGlvbi4KLQotICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUncyBhIGxvbmcgb3B0aW9uICJmdWJhciIgYW5kCi0gICAgIHRoZSBBUkdWLWVsZW1lbnQgaXMgIi1mdSIsIGRvIGNvbnNpZGVyIHRoYXQgYW4gYWJicmV2aWF0aW9uIG9mCi0gICAgIHRoZSBsb25nIG9wdGlvbiwganVzdCBsaWtlICItLWZ1IiwgYW5kIG5vdCAiLWYiIHdpdGggYXJnICJ1Ii4KLQotICAgICBUaGlzIGRpc3RpbmN0aW9uIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHVzZWZ1bCBhcHByb2FjaC4gICovCi0KLSAgaWYgKGxvbmdvcHRzICE9IE5VTEwKLSAgICAgICYmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nCi0JICB8fCAobG9uZ19vbmx5ICYmIChhcmd2W29wdGluZF1bMl0gfHwgIW15X2luZGV4IChvcHRzdHJpbmcsIGFyZ3Zbb3B0aW5kXVsxXSkpKSkpCi0gICAgewotICAgICAgY2hhciAqbmFtZWVuZDsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnA7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpwZm91bmQgPSBOVUxMOwotICAgICAgaW50IGV4YWN0ID0gMDsKLSAgICAgIGludCBhbWJpZyA9IDA7Ci0gICAgICBpbnQgaW5kZm91bmQgPSAtMTsKLSAgICAgIGludCBvcHRpb25faW5kZXg7Ci0KLSAgICAgIGZvciAobmFtZWVuZCA9IG5leHRjaGFyOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKLQkvKiBEbyBub3RoaW5nLiAgKi8gOwotCi0gICAgICAvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAotCSBvciBhYmJyZXZpYXRlZCBtYXRjaGVzLiAgKi8KLSAgICAgIGZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQotCWlmICghc3RybmNtcCAocC0+bmFtZSwgbmV4dGNoYXIsIG5hbWVlbmQgLSBuZXh0Y2hhcikpCi0JICB7Ci0JICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKQotCQk9PSAodW5zaWduZWQgaW50KSBzdHJsZW4gKHAtPm5hbWUpKQotCSAgICAgIHsKLQkJLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlwZm91bmQgPSBwOwotCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJZXhhY3QgPSAxOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHBmb3VuZCA9PSBOVUxMKQotCSAgICAgIHsKLQkJLyogRmlyc3Qgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlwZm91bmQgPSBwOwotCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICAvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCSAgICAgIGFtYmlnID0gMTsKLQkgIH0KLQotICAgICAgaWYgKGFtYmlnICYmICFleGFjdCkKLQl7Ci0JICBpZiAob3B0ZXJyKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYCVzJyBpcyBhbWJpZ3VvdXNcbiIpLAotCQkgICAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXSk7Ci0JICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgIG9wdGluZCsrOwotCSAgb3B0b3B0ID0gMDsKLQkgIHJldHVybiAnPyc7Ci0JfQotCi0gICAgICBpZiAocGZvdW5kICE9IE5VTEwpCi0JewotCSAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7Ci0JICBvcHRpbmQrKzsKLQkgIGlmICgqbmFtZWVuZCkKLQkgICAgewotCSAgICAgIC8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAotCQkgYWxsb3cgaXQgdG8gYmUgdXNlZCBvbiBlbnVtcy4gICovCi0JICAgICAgaWYgKHBmb3VuZC0+aGFzX2FyZykKLQkJb3B0YXJnID0gbmFtZWVuZCArIDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wdGVycikKLQkJICAgIHsKLQkJICAgICAgaWYgKGFyZ3Zbb3B0aW5kIC0gMV1bMV0gPT0gJy0nKQotCQkJLyogLS1vcHRpb24gKi8KLQkJCWZwcmludGYgKHN0ZGVyciwKLQkJCQkgXygiJXM6IG9wdGlvbiBgLS0lcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCi0JCQkJIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCS8qICtvcHRpb24gb3IgLW9wdGlvbiAqLwotCQkJZnByaW50ZiAoc3RkZXJyLAotCQkJCSBfKCIlczogb3B0aW9uIGAlYyVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKLQkJCQkgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXVswXSwgcGZvdW5kLT5uYW1lKTsKLQotCQkgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQotCQkgICAgICBvcHRvcHQgPSBwZm91bmQtPnZhbDsKLQkJICAgICAgcmV0dXJuICc/JzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKLQkgICAgewotCSAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQotCQlvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3B0ZXJyKQotCQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKLQkJCSAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV0pOwotCQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgIG9wdG9wdCA9IHBmb3VuZC0+dmFsOwotCQkgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOwotCQl9Ci0JICAgIH0KLQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgaWYgKGxvbmdpbmQgIT0gTlVMTCkKLQkgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7Ci0JICBpZiAocGZvdW5kLT5mbGFnKQotCSAgICB7Ci0JICAgICAgKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIHJldHVybiBwZm91bmQtPnZhbDsKLQl9Ci0KLSAgICAgIC8qIENhbid0IGZpbmQgaXQgYXMgYSBsb25nIG9wdGlvbi4gIElmIHRoaXMgaXMgbm90IGdldG9wdF9sb25nX29ubHksCi0JIG9yIHRoZSBvcHRpb24gc3RhcnRzIHdpdGggJy0tJyBvciBpcyBub3QgYSB2YWxpZCBzaG9ydAotCSBvcHRpb24sIHRoZW4gaXQncyBhbiBlcnJvci4KLQkgT3RoZXJ3aXNlIGludGVycHJldCBpdCBhcyBhIHNob3J0IG9wdGlvbi4gICovCi0gICAgICBpZiAoIWxvbmdfb25seSB8fCBhcmd2W29wdGluZF1bMV0gPT0gJy0nCi0JICB8fCBteV9pbmRleCAob3B0c3RyaW5nLCAqbmV4dGNoYXIpID09IE5VTEwpCi0JewotCSAgaWYgKG9wdGVycikKLQkgICAgewotCSAgICAgIGlmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nKQotCQkvKiAtLW9wdGlvbiAqLwotCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAtLSVzJ1xuIiksCi0JCQkgYXJndlswXSwgbmV4dGNoYXIpOwotCSAgICAgIGVsc2UKLQkJLyogK29wdGlvbiBvciAtb3B0aW9uICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYCVjJXMnXG4iKSwKLQkJCSBhcmd2WzBdLCBhcmd2W29wdGluZF1bMF0sIG5leHRjaGFyKTsKLQkgICAgfQotCSAgbmV4dGNoYXIgPSAoY2hhciAqKSAiIjsKLQkgIG9wdGluZCsrOwotCSAgb3B0b3B0ID0gMDsKLQkgIHJldHVybiAnPyc7Ci0JfQotICAgIH0KLQotICAvKiBMb29rIGF0IGFuZCBoYW5kbGUgdGhlIG5leHQgc2hvcnQgb3B0aW9uLWNoYXJhY3Rlci4gICovCi0KLSAgewotICAgIGNoYXIgYyA9ICpuZXh0Y2hhcisrOwotICAgIGNoYXIgKnRlbXAgPSBteV9pbmRleCAob3B0c3RyaW5nLCBjKTsKLQotICAgIC8qIEluY3JlbWVudCBgb3B0aW5kJyB3aGVuIHdlIHN0YXJ0IHRvIHByb2Nlc3MgaXRzIGxhc3QgY2hhcmFjdGVyLiAgKi8KLSAgICBpZiAoKm5leHRjaGFyID09ICdcMCcpCi0gICAgICArK29wdGluZDsKLQotICAgIGlmICh0ZW1wID09IE5VTEwgfHwgYyA9PSAnOicpCi0gICAgICB7Ci0JaWYgKG9wdGVycikKLQkgIHsKLQkgICAgaWYgKHBvc2l4bHlfY29ycmVjdCkKLQkgICAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiksCi0JCSAgICAgICBhcmd2WzBdLCBjKTsKLQkgICAgZWxzZQotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgb3B0aW9uIC0tICVjXG4iKSwKLQkJICAgICAgIGFyZ3ZbMF0sIGMpOwotCSAgfQotCW9wdG9wdCA9IGM7Ci0JcmV0dXJuICc/JzsKLSAgICAgIH0KLSAgICAvKiBDb252ZW5pZW5jZS4gVHJlYXQgUE9TSVggLVcgZm9vIHNhbWUgYXMgbG9uZyBvcHRpb24gLS1mb28gKi8KLSAgICBpZiAodGVtcFswXSA9PSAnVycgJiYgdGVtcFsxXSA9PSAnOycpCi0gICAgICB7Ci0JY2hhciAqbmFtZWVuZDsKLQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpwOwotCWNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7Ci0JaW50IGV4YWN0ID0gMDsKLQlpbnQgYW1iaWcgPSAwOwotCWludCBpbmRmb3VuZCA9IDA7Ci0JaW50IG9wdGlvbl9pbmRleDsKLQotCS8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLwotCWlmICgqbmV4dGNoYXIgIT0gJ1wwJykKLQkgIHsKLQkgICAgb3B0YXJnID0gbmV4dGNoYXI7Ci0JICAgIC8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAotCSAgICAgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLwotCSAgICBvcHRpbmQrKzsKLQkgIH0KLQllbHNlIGlmIChvcHRpbmQgPT0gYXJnYykKLQkgIHsKLQkgICAgaWYgKG9wdGVycikKLQkgICAgICB7Ci0JCS8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAotCQkJIGFyZ3ZbMF0sIGMpOwotCSAgICAgIH0KLQkgICAgb3B0b3B0ID0gYzsKLQkgICAgaWYgKG9wdHN0cmluZ1swXSA9PSAnOicpCi0JICAgICAgYyA9ICc6JzsKLQkgICAgZWxzZQotCSAgICAgIGMgPSAnPyc7Ci0JICAgIHJldHVybiBjOwotCSAgfQotCWVsc2UKLQkgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKLQkgICAgIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KLQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCi0JLyogb3B0YXJnIGlzIG5vdyB0aGUgYXJndW1lbnQsIHNlZSBpZiBpdCdzIGluIHRoZQotCSAgIHRhYmxlIG9mIGxvbmdvcHRzLiAgKi8KLQotCWZvciAobmV4dGNoYXIgPSBuYW1lZW5kID0gb3B0YXJnOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKLQkgIC8qIERvIG5vdGhpbmcuICAqLyA7Ci0KLQkvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAotCSAgIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLwotCWZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQotCSAgaWYgKCFzdHJuY21wIChwLT5uYW1lLCBuZXh0Y2hhciwgbmFtZWVuZCAtIG5leHRjaGFyKSkKLQkgICAgewotCSAgICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKSA9PSBzdHJsZW4gKHAtPm5hbWUpKQotCQl7Ci0JCSAgLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQkgIHBmb3VuZCA9IHA7Ci0JCSAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7Ci0JCSAgZXhhY3QgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocGZvdW5kID09IE5VTEwpCi0JCXsKLQkJICAvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCSAgcGZvdW5kID0gcDsKLQkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJfQotCSAgICAgIGVsc2UKLQkJLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJYW1iaWcgPSAxOwotCSAgICB9Ci0JaWYgKGFtYmlnICYmICFleGFjdCkKLQkgIHsKLQkgICAgaWYgKG9wdGVycikKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYC1XICVzJyBpcyBhbWJpZ3VvdXNcbiIpLAotCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmRdKTsKLQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICAgIG9wdGluZCsrOwotCSAgICByZXR1cm4gJz8nOwotCSAgfQotCWlmIChwZm91bmQgIT0gTlVMTCkKLQkgIHsKLQkgICAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7Ci0JICAgIGlmICgqbmFtZWVuZCkKLQkgICAgICB7Ci0JCS8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAotCQkgICBhbGxvdyBpdCB0byBiZSB1c2VkIG9uIGVudW1zLiAgKi8KLQkJaWYgKHBmb3VuZC0+aGFzX2FyZykKLQkJICBvcHRhcmcgPSBuYW1lZW5kICsgMTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChvcHRlcnIpCi0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiXAotJXM6IG9wdGlvbiBgLVcgJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAotCQkJICAgICAgIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7Ci0KLQkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgICAgcmV0dXJuICc/JzsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKLQkgICAgICB7Ci0JCWlmIChvcHRpbmQgPCBhcmdjKQotCQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKG9wdGVycikKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgICAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCi0JCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7Ci0JCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkJICAgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgICBpZiAobG9uZ2luZCAhPSBOVUxMKQotCSAgICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OwotCSAgICBpZiAocGZvdW5kLT5mbGFnKQotCSAgICAgIHsKLQkJKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIHBmb3VuZC0+dmFsOwotCSAgfQotCSAgbmV4dGNoYXIgPSBOVUxMOwotCSAgcmV0dXJuICdXJzsJLyogTGV0IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgaXQuICAgKi8KLSAgICAgIH0KLSAgICBpZiAodGVtcFsxXSA9PSAnOicpCi0gICAgICB7Ci0JaWYgKHRlbXBbMl0gPT0gJzonKQotCSAgewotCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IGFjY2VwdHMgYW4gYXJndW1lbnQgb3B0aW9uYWxseS4gICovCi0JICAgIGlmICgqbmV4dGNoYXIgIT0gJ1wwJykKLQkgICAgICB7Ci0JCW9wdGFyZyA9IG5leHRjaGFyOwotCQlvcHRpbmQrKzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBvcHRhcmcgPSBOVUxMOwotCSAgICBuZXh0Y2hhciA9IE5VTEw7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50LiAgKi8KLQkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgICAgIHsKLQkJb3B0YXJnID0gbmV4dGNoYXI7Ci0JCS8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAotCQkgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLwotCQlvcHRpbmQrKzsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQotCSAgICAgIHsKLQkJaWYgKG9wdGVycikKLQkJICB7Ci0JCSAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KLQkJICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAotCQkJICAgYXJndlswXSwgYyk7Ci0JCSAgfQotCQlvcHRvcHQgPSBjOwotCQlpZiAob3B0c3RyaW5nWzBdID09ICc6JykKLQkJICBjID0gJzonOwotCQllbHNlCi0JCSAgYyA9ICc/JzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICAvKiBXZSBhbHJlYWR5IGluY3JlbWVudGVkIGBvcHRpbmQnIG9uY2U7Ci0JCSBpbmNyZW1lbnQgaXQgYWdhaW4gd2hlbiB0YWtpbmcgbmV4dCBBUkdWLWVsdCBhcyBhcmd1bWVudC4gICovCi0JICAgICAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgIH0KLSAgICAgIH0KLSAgICByZXR1cm4gYzsKLSAgfQotfQotCi1pbnQKLWdldG9wdCAoYXJnYywgYXJndiwgb3B0c3RyaW5nKQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLXsKLSAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywKLQkJCSAgIChjb25zdCBzdHJ1Y3Qgb3B0aW9uICopIDAsCi0JCQkgICAoaW50ICopIDAsCi0JCQkgICAwKTsKLX0KLQotI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KLQwKLSNpZmRlZiBURVNUCi0KLS8qIENvbXBpbGUgd2l0aCAtRFRFU1QgdG8gbWFrZSBhbiBleGVjdXRhYmxlIGZvciB1c2UgaW4gdGVzdGluZwotICAgdGhlIGFib3ZlIGRlZmluaXRpb24gb2YgYGdldG9wdCcuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCBkaWdpdF9vcHRpbmQgPSAwOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOwotCi0gICAgICBjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIpOwotICAgICAgaWYgKGMgPT0gLTEpCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICBpZiAoZGlnaXRfb3B0aW5kICE9IDAgJiYgZGlnaXRfb3B0aW5kICE9IHRoaXNfb3B0aW9uX29wdGluZCkKLQkgICAgcHJpbnRmICgiZGlnaXRzIG9jY3VyIGluIHR3byBkaWZmZXJlbnQgYXJndi1lbGVtZW50cy5cbiIpOwotCSAgZGlnaXRfb3B0aW5kID0gdGhpc19vcHRpb25fb3B0aW5kOwotCSAgcHJpbnRmICgib3B0aW9uICVjXG4iLCBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBwcmludGYgKCJvcHRpb24gYVxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgcHJpbnRmICgib3B0aW9uIGJcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIHByaW50ZiAoIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7Ci0gICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLQlwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRvcHQxLmMgYi9saWJpYmVydHkvZ2V0b3B0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1NzM3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRvcHQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyogZ2V0b3B0X2xvbmcgYW5kIGdldG9wdF9sb25nX29ubHkgZW50cnkgcG9pbnRzIGZvciBHTlUgZ2V0b3B0LgotICAgQ29weXJpZ2h0IChDKSAxOTg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3LDk4Ci0gICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotDAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpZiAhZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18KLS8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBjb25kaXRpb25hbCBzaW5jZSBzb21lIHN0ZGMgc3lzdGVtcwotICAgcmVqZWN0IGBkZWZpbmVkIChjb25zdCknLiAgKi8KLSNpZm5kZWYgY29uc3QKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jZGVmaW5lIEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiAyCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKLSNpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSNpZiBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiA9PSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04KLSNkZWZpbmUgRUxJREVfQ09ERQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotLyogVGhpcyBuZWVkcyB0byBjb21lIGFmdGVyIHNvbWUgbGlicmFyeSAjaW5jbHVkZQotICAgdG8gZ2V0IF9fR05VX0xJQlJBUllfXyBkZWZpbmVkLiAgKi8KLSNpZmRlZiBfX0dOVV9MSUJSQVJZX18KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZuZGVmCU5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotaW50Ci1nZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0aW9uczsKLSAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zOwotICAgICBpbnQgKm9wdF9pbmRleDsKLXsKLSAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4LCAwKTsKLX0KLQotLyogTGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScgY2FuIGluZGljYXRlIGEgbG9uZyBvcHRpb24uCi0gICBJZiBhbiBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCAnLScgKG5vdCAnLS0nKSBkb2Vzbid0IG1hdGNoIGEgbG9uZyBvcHRpb24sCi0gICBidXQgZG9lcyBtYXRjaCBhIHNob3J0IG9wdGlvbiwgaXQgaXMgcGFyc2VkIGFzIGEgc2hvcnQgb3B0aW9uCi0gICBpbnN0ZWFkLiAgKi8KLQotaW50Ci1nZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRpb25zOwotICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnM7Ci0gICAgIGludCAqb3B0X2luZGV4OwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgsIDEpOwotfQotCi0KLSNlbmRpZgkvKiBOb3QgRUxJREVfQ09ERS4gICovCi0MCi0jaWZkZWYgVEVTVAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgZGlnaXRfb3B0aW5kID0gMDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgdGhpc19vcHRpb25fb3B0aW5kID0gb3B0aW5kID8gb3B0aW5kIDogMTsKLSAgICAgIGludCBvcHRpb25faW5kZXggPSAwOwotICAgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICAgICAgewotCXsiYWRkIiwgMSwgMCwgMH0sCi0JeyJhcHBlbmQiLCAwLCAwLCAwfSwKLQl7ImRlbGV0ZSIsIDEsIDAsIDB9LAotCXsidmVyYm9zZSIsIDAsIDAsIDB9LAotCXsiY3JlYXRlIiwgMCwgMCwgMH0sCi0JeyJmaWxlIiwgMSwgMCwgMH0sCi0JezAsIDAsIDAsIDB9Ci0gICAgICB9OwotCi0gICAgICBjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJhYmM6ZDowMTIzNDU2Nzg5IiwKLQkJICAgICAgIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7Ci0gICAgICBpZiAoYyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKLQkgIGlmIChvcHRhcmcpCi0JICAgIHByaW50ZiAoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChkaWdpdF9vcHRpbmQgIT0gMCAmJiBkaWdpdF9vcHRpbmQgIT0gdGhpc19vcHRpb25fb3B0aW5kKQotCSAgICBwcmludGYgKCJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7Ci0JICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7Ci0JICBwcmludGYgKCJvcHRpb24gJWNcbiIsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBhXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBwcmludGYgKCJvcHRpb24gYlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcHJpbnRmICgib3B0aW9uIGMgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBkIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIHByaW50ZiAoIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7Ci0gICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLQlwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRwYWdlc2l6ZS5jIGIvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGQ2YzAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBFbXVsYXRpb24gb2YgZ2V0cGFnZXNpemUoKSBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgaXQuICovCi0KLS8qCi0KLU5BTUUKLQotCWdldHBhZ2VzaXplIC0tIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHBhZ2Ugb2YgbWVtb3J5Ci0KLVNZTk9QU0lTCi0KLQlpbnQgZ2V0cGFnZXNpemUgKHZvaWQpCi0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBwYWdlIG9mIG1lbW9yeS4gIFRoaXMgaXMgdGhlCi0JZ3JhbnVsYXJpdHkgb2YgbWFueSBvZiB0aGUgc3lzdGVtIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzLgotCU5vIGd1YXJhbnRlZSBpcyBtYWRlIGFzIHRvIHdoZXRoZXIgb3Igbm90IGl0IGlzIHRoZSBzYW1lIGFzIHRoZQotCWJhc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGhhcmR3YXJlIHBhZ2Ugc2l6ZS4KLQotQlVHUwotCi0JSXMgaW50ZW5kZWQgYXMgYSByZWFzb25hYmxlIHJlcGxhY2VtZW50IGZvciBzeXN0ZW1zIHdoZXJlIHRoaXMKLQlpcyBub3QgcHJvdmlkZWQgYXMgYSBzeXN0ZW0gY2FsbC4gIFRoZSB2YWx1ZSBvZiA0MDk2IG1heSBvciBtYXkKLQlub3QgYmUgY29ycmVjdCBmb3IgdGhlIHN5c3RlbXMgd2hlcmUgaXQgaXMgcmV0dXJuZWQgYXMgdGhlIGRlZmF1bHQKLQl2YWx1ZS4KLQotKi8KLQotI2lmbmRlZiBWTVMKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSN1bmRlZiBHTlVfT1VSX1BBR0VTSVpFCi0jaWYgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIF9TQ19QQUdFU0laRQotI2RlZmluZSBHTlVfT1VSX1BBR0VTSVpFIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBHTlVfT1VSX1BBR0VTSVpFCi0jIGlmZGVmCVBBR0VTSVpFCi0jICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBQQUdFU0laRQotIyBlbHNlCS8qIG5vIFBBR0VTSVpFICovCi0jICBpZmRlZglFWEVDX1BBR0VTSVpFCi0jICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgRVhFQ19QQUdFU0laRQotIyAgZWxzZQkvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgaWZkZWYJTkJQRwotIyAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSAoTkJQRyAqIENMU0laRSkKLSMgICAgaWZuZGVmCUNMU0laRQotIyAgICAgZGVmaW5lCUNMU0laRSAxCi0jICAgIGVuZGlmCS8qIENMU0laRSAqLwotIyAgIGVsc2UJLyogbm8gTkJQRyAqLwotIyAgICBpZmRlZglOQlBDCi0jICAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBOQlBDCi0jICAgIGVsc2UJLyogbm8gTkJQQyAqLwotIyAgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgNDA5NgkvKiBKdXN0IHB1bnQgYW5kIHVzZSByZWFzb25hYmxlIHZhbHVlICovCi0jICAgIGVuZGlmIC8qIE5CUEMgKi8KLSMgICBlbmRpZiAvKiBOQlBHICovCi0jICBlbmRpZiAvKiBFWEVDX1BBR0VTSVpFICovCi0jIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jZW5kaWYgLyogR05VX09VUl9QQUdFU0laRSAqLwotCi1pbnQKLWdldHBhZ2VzaXplICgpCi17Ci0gIHJldHVybiAoR05VX09VUl9QQUdFU0laRSk7Ci19Ci0KLSNlbHNlIC8qIFZNUyAqLwotCi0jaWYgMAkvKiBvbGRlciBkaXN0cmlidXRpb25zIG9mIGdjYy12bXMgYXJlIG1pc3NpbmcgPHN5aWRlZi5oPiAqLwotI2luY2x1ZGUgPHN5aWRlZi5oPgotI2VuZGlmCi0jaWZuZGVmIFNZSSRfUEFHRV9TSVpFCS8qIFZNUyBWNS40IGFuZCBlYXJsaWVyIGRpZG4ndCBoYXZlIHRoaXMgeWV0ICovCi0jZGVmaW5lIFNZSSRfUEFHRV9TSVpFIDQ0NTIKLSNlbmRpZgotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGliJGdldHN5aShjb25zdCB1bnNpZ25lZCBzaG9ydCAqLC4uLik7Ci0KLWludCBnZXRwYWdlc2l6ZSAoKQotewotICBsb25nIHBhZ3NpeiA9IDBMOwotICB1bnNpZ25lZCBzaG9ydCBpdG1jb2QgPSBTWUkkX1BBR0VfU0laRTsKLQotICAodm9pZCkgbGliJGdldHN5aSAoJml0bWNvZCwgKHZvaWQgKikgJnBhZ3Npeik7Ci0gIGlmIChwYWdzaXogPT0gMEwpCi0gICAgcGFnc2l6ID0gNTEyTDsJLyogVkFYIGRlZmF1bHQgKi8KLSAgcmV0dXJuIChpbnQpIHBhZ3NpejsKLX0KLQotI2VuZGlmIC8qIFZNUyAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHB3ZC5jIGIvbGliaWJlcnR5L2dldHB3ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZlMDM5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRwd2QuYworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKiBnZXRwd2QuYyAtIGdldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaWYgSEFWRV9TWVNfU1RBVF9ICi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0vKiBQcm90b3R5cGUgdGhlc2UgaW4gY2FzZSB0aGUgc3lzdGVtIGhlYWRlcnMgZG9uJ3QgcHJvdmlkZSB0aGVtLiAqLwotZXh0ZXJuIGNoYXIgKmdldHB3ZCAoKTsKLWV4dGVybiBjaGFyICpnZXR3ZCAoKTsKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBWaXJ0dWFsbHkgZXZlcnkgVU4qWCBzeXN0ZW0gbm93IGluIGNvbW1vbiB1c2UgKGV4Y2VwdCBmb3IgcHJlLTQuMy10YWhvZQotICAgQlNEIHN5c3RlbXMpIG5vdyBwcm92aWRlcyBnZXRjd2QgYXMgY2FsbGVkIGZvciBieSBQT1NJWC4gIEFsbG93IGZvcgotICAgdGhlIGZldyBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIHJ1bGUgaGVyZS4gICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX0dFVENXRCkgJiYgZGVmaW5lZChIQVZFX0dFVFdEKQotI2RlZmluZSBnZXRjd2QoYnVmLGxlbikgZ2V0d2QoYnVmKQotI2VuZGlmCi0KLSNpZmRlZiBNQVhQQVRITEVOCi0jZGVmaW5lIEdVRVNTUEFUSExFTiAoTUFYUEFUSExFTiArIDEpCi0jZWxzZQotI2RlZmluZSBHVUVTU1BBVEhMRU4gMTAwCi0jZW5kaWYKLQotI2lmICEoZGVmaW5lZCAoVk1TKSB8fCAoZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pKSkKLQotLyogR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gIFVzZSB0aGUgUFdEIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0J3MKLSAgIHNldCBjb3JyZWN0bHksIHNpbmNlIHRoaXMgaXMgZmFzdGVyIGFuZCBnaXZlcyBtb3JlIHVuaWZvcm0gYW5zd2VycwotICAgdG8gdGhlIHVzZXIuICBZaWVsZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgaWYgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlLAotICAgeWllbGQgMCBhbmQgc2V0IGVycm5vLiAgKi8KLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgc3RhdGljIGNoYXIgKnB3ZDsKLSAgc3RhdGljIGludCBmYWlsdXJlX2Vycm5vOwotCi0gIGNoYXIgKnAgPSBwd2Q7Ci0gIHNpemVfdCBzOwotICBzdHJ1Y3Qgc3RhdCBkb3RzdGF0LCBwd2RzdGF0OwotCi0gIGlmICghcCAmJiAhKGVycm5vID0gZmFpbHVyZV9lcnJubykpCi0gICAgewotICAgICAgaWYgKCEgKChwID0gZ2V0ZW52ICgiUFdEIikpICE9IDAKLQkgICAgICYmICpwID09ICcvJwotCSAgICAgJiYgc3RhdCAocCwgJnB3ZHN0YXQpID09IDAKLQkgICAgICYmIHN0YXQgKCIuIiwgJmRvdHN0YXQpID09IDAKLQkgICAgICYmIGRvdHN0YXQuc3RfaW5vID09IHB3ZHN0YXQuc3RfaW5vCi0JICAgICAmJiBkb3RzdGF0LnN0X2RldiA9PSBwd2RzdGF0LnN0X2RldikpCi0KLQkvKiBUaGUgc2hvcnRjdXQgZGlkbid0IHdvcmsuICBUcnkgdGhlIHNsb3csIGBgc3VyZScnIHdheS4gICovCi0JZm9yIChzID0gR1VFU1NQQVRITEVOOyAgISBnZXRjd2QgKHAgPSB4bWFsbG9jIChzKSwgcyk7ICBzICo9IDIpCi0JICB7Ci0JICAgIGludCBlID0gZXJybm87Ci0JICAgIGZyZWUgKHApOwotI2lmZGVmIEVSQU5HRQotCSAgICBpZiAoZSAhPSBFUkFOR0UpCi0jZW5kaWYKLQkgICAgICB7Ci0JCWVycm5vID0gZmFpbHVyZV9lcnJubyA9IGU7Ci0JCXAgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0KLSAgICAgIC8qIENhY2hlIHRoZSByZXN1bHQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcHJvZ3JhbSBkb2VzCi0JIG5vdCBpbnZva2UgY2hkaXIgYmV0d2VlbiBjYWxscyB0byBnZXRwd2QuICAqLwotICAgICAgcHdkID0gcDsKLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0jZWxzZQkvKiBWTVMgfHwgX1dJTjMyICYmICFfX0NZR1dJTl9fICovCi0KLSNpZm5kZWYgTUFYUEFUSExFTgotI2RlZmluZSBNQVhQQVRITEVOIDI1NQotI2VuZGlmCi0KLWNoYXIgKgotZ2V0cHdkICgpCi17Ci0gIHN0YXRpYyBjaGFyICpwd2QgPSAwOwotCi0gIGlmICghcHdkKQotICAgIHB3ZCA9IGdldGN3ZCAoeG1hbGxvYyAoTUFYUEFUSExFTiArIDEpLCBNQVhQQVRITEVOICsgMQotI2lmZGVmIFZNUwotCQkgICwgMAotI2VuZGlmCi0JCSAgKTsKLSAgcmV0dXJuIHB3ZDsKLX0KLQotI2VuZGlmCS8qIFZNUyB8fCBfV0lOMzIgJiYgIV9fQ1lHV0lOX18gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRydW50aW1lLmMgYi9saWJpYmVydHkvZ2V0cnVudGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU1ZWE2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRydW50aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBSZXR1cm4gdGltZSB1c2VkIHNvIGZhciwgaW4gbWljcm9zZWNvbmRzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotLyogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBnZXQgZWxhcHNlZCBleGVjdXRpb24gdGltZTsgdW5mb3J0dW5hdGVseSBubwotICAgc2luZ2xlIHdheSBpcyBhdmFpbGFibGUgZm9yIGFsbCBob3N0IHN5c3RlbXMsIG5vciBhcmUgdGhlcmUgcmVsaWFibGUKLSAgIHdheXMgdG8gZmluZCBvdXQgd2hpY2ggd2F5IGlzIGNvcnJlY3QgZm9yIGEgZ2l2ZW4gaG9zdC4gKi8KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfR0VUUlVTQUdFKSAmJiBkZWZpbmVkIChIQVZFX1NZU19SRVNPVVJDRV9IKQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRVMKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgYSBmYWxsYmFjazsgaWYgd3JvbmcsIGl0IHdpbGwgbGlrZWx5IG1ha2Ugb2J2aW91c2x5IHdyb25nCi0gICByZXN1bHRzLiAqLwotCi0jaWZuZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIENMT0NLU19QRVJfU0VDIDEKLSNlbmRpZgotCi0jaWZkZWYgX1NDX0NMS19UQ0sKLSNkZWZpbmUgR05VX0haICBzeXNjb25mKF9TQ19DTEtfVENLKQotI2Vsc2UKLSNpZmRlZiBIWgotI2RlZmluZSBHTlVfSFogIEhaCi0jZWxzZQotI2lmZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIEdOVV9IWiAgQ0xPQ0tTX1BFUl9TRUMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotbG9uZwotZ2V0X3J1bl90aW1lICgpCi17Ci0jaWYgZGVmaW5lZCAoSEFWRV9HRVRSVVNBR0UpICYmIGRlZmluZWQgKEhBVkVfU1lTX1JFU09VUkNFX0gpCi0gIHN0cnVjdCBydXNhZ2UgcnVzYWdlOwotCi0gIGdldHJ1c2FnZSAoMCwgJnJ1c2FnZSk7Ci0gIHJldHVybiAocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfdXRpbWUudHZfdXNlYwotCSAgKyBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV9zdGltZS50dl91c2VjKTsKLSNlbHNlIC8qICEgSEFWRV9HRVRSVVNBR0UgKi8KLSNpZmRlZiBIQVZFX1RJTUVTCi0gIHN0cnVjdCB0bXMgdG1zOwotCi0gIHRpbWVzICgmdG1zKTsKLSAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7Ci0jZWxzZSAvKiAhIEhBVkVfVElNRVMgKi8KLSAgLyogRmFsbCBiYWNrIG9uIGNsb2NrIGFuZCBob3BlIGl0J3MgY29ycmVjdGx5IGltcGxlbWVudGVkLiAqLwotICBjb25zdCBsb25nIGNsb2Nrc19wZXJfc2VjID0gQ0xPQ0tTX1BFUl9TRUM7Ci0gIGlmIChjbG9ja3NfcGVyX3NlYyA8PSAxMDAwMDAwKQotICAgIHJldHVybiBjbG9jayAoKSAqICgxMDAwMDAwIC8gY2xvY2tzX3Blcl9zZWMpOwotICBlbHNlCi0gICAgcmV0dXJuIGNsb2NrICgpIC8gY2xvY2tzX3Blcl9zZWM7Ci0jZW5kaWYgIC8qIEhBVkVfVElNRVMgKi8KLSNlbmRpZiAgLyogSEFWRV9HRVRSVVNBR0UgKi8KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9oYXNodGFiLmMgYi9saWJpYmVydHkvaGFzaHRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWUzNGFhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9oYXNodGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyogQW4gZXhwYW5kYWJsZSBoYXNoIHRhYmxlcyBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVmxhZGltaXIgTWFrYXJvdiAodm1ha2Fyb3ZAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBhY2thZ2UgaW1wbGVtZW50cyBiYXNpYyBoYXNoIHRhYmxlIGZ1bmN0aW9uYWxpdHkuICBJdCBpcyBwb3NzaWJsZQotICAgdG8gc2VhcmNoIGZvciBhbiBlbnRyeSwgY3JlYXRlIGFuIGVudHJ5IGFuZCBkZXN0cm95IGFuIGVudHJ5LgotCi0gICBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIGdlbmVyaWMgcG9pbnRlcnMuCi0KLSAgIFRoZSBzaXplIG9mIHRoZSB0YWJsZSBpcyBub3QgZml4ZWQ7IGlmIHRoZSBvY2N1cGFuY3kgb2YgdGhlIHRhYmxlCi0gICBncm93cyB0b28gaGlnaCB0aGUgaGFzaCB0YWJsZSB3aWxsIGJlIGV4cGFuZGVkLgotCi0gICBUaGUgYWJzdHJhY3QgZGF0YSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBnZW5lcmFsaXplZCBBbGdvcml0aG0gRAotICAgZnJvbSBLbnV0aCdzIGJvb2sgIlRoZSBhcnQgb2YgY29tcHV0ZXIgcHJvZ3JhbW1pbmciLiAgSGFzaCB0YWJsZSBpcwotICAgZXhwYW5kZWQgYnkgY3JlYXRpb24gb2YgbmV3IGhhc2ggdGFibGUgYW5kIHRyYW5zZmVycmluZyBlbGVtZW50cyBmcm9tCi0gICB0aGUgb2xkIHRhYmxlIHRvIHRoZSBuZXcgdGFibGUuICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJoYXNodGFiLmgiCi0KLS8qIFRoaXMgbWFjcm8gZGVmaW5lcyByZXNlcnZlZCB2YWx1ZSBmb3IgZW1wdHkgdGFibGUgZW50cnkuICovCi0KLSNkZWZpbmUgRU1QVFlfRU5UUlkgICAgKCh2b2lkICopIDApCi0KLS8qIFRoaXMgbWFjcm8gZGVmaW5lcyByZXNlcnZlZCB2YWx1ZSBmb3IgdGFibGUgZW50cnkgd2hpY2ggY29udGFpbmVkCi0gICBhIGRlbGV0ZWQgZWxlbWVudC4gKi8KLQotI2RlZmluZSBERUxFVEVEX0VOVFJZICAoKHZvaWQgKikgMSkKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZWFyZXN0IHByaW1lIG51bWJlciB3aGljaCBpcwotICAgZ3JlYXRlciB0aGFuIGdpdmVuIHNvdXJjZSBudW1iZXIuICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1oaWdoZXJfcHJpbWVfbnVtYmVyIChuKQotICAgICB1bnNpZ25lZCBsb25nIG47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICBuIHw9IDB4MDE7ICAvKiBGb3JjZSBOIHRvIGJlIG9kZC4gICovCi0gIGlmIChuIDwgOSkKLSAgICByZXR1cm4gbjsgLyogQWxsIG9kZCBudW1iZXJzIDwgOSBhcmUgcHJpbWUuICAqLwotCi0gbmV4dDoKLSAgbiArPSAyOwotICBpID0gMzsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobiAlIGkgPT0gMCkKLQlnb3RvIG5leHQ7Ci0gICAgICBpICs9IDI7Ci0gICAgfQotICB3aGlsZSAoKGkgKiBpKSA8PSBuKTsKLQotICByZXR1cm4gbjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRhYmxlIHdpdGggbGVuZ3RoIHNsaWdodGx5IGxvbmdlciB0aGFuIGdpdmVuCi0gICBzb3VyY2UgbGVuZ3RoLiAgQ3JlYXRlZCBoYXNoIHRhYmxlIGlzIGluaXRpYXRlZCBhcyBlbXB0eSAoYWxsIHRoZQotICAgaGFzaCB0YWJsZSBlbnRyaWVzIGFyZSBFTVBUWV9FTlRSWSkuICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUKLSAgIGNyZWF0ZWQgaGFzaCB0YWJsZS4gKi8KLQotaHRhYl90Ci1odGFiX2NyZWF0ZSAoc2l6ZSwgaGFzaF9mLCBlcV9mLCBkZWxfZikKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGh0YWJfaGFzaCBoYXNoX2Y7Ci0gICAgIGh0YWJfZXEgZXFfZjsKLSAgICAgaHRhYl9kZWwgZGVsX2Y7Ci17Ci0gIGh0YWJfdCByZXN1bHQ7Ci0KLSAgc2l6ZSA9IGhpZ2hlcl9wcmltZV9udW1iZXIgKHNpemUpOwotICByZXN1bHQgPSAoaHRhYl90KSB4Y2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBodGFiKSk7Ci0gIHJlc3VsdC0+ZW50cmllcyA9ICh2b2lkICoqKSB4Y2FsbG9jIChzaXplLCBzaXplb2YgKHZvaWQgKikpOwotICByZXN1bHQtPnNpemUgPSBzaXplOwotICByZXN1bHQtPmhhc2hfZiA9IGhhc2hfZjsKLSAgcmVzdWx0LT5lcV9mID0gZXFfZjsKLSAgcmVzdWx0LT5kZWxfZiA9IGRlbF9mOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGZvciBnaXZlbiBoYXNoIHRhYmxlLgotICAgTmF0dXJhbGx5IHRoZSBoYXNoIHRhYmxlIG11c3QgYWxyZWFkeSBleGlzdC4gKi8KLQotdm9pZAotaHRhYl9kZWxldGUgKGh0YWIpCi0gICAgIGh0YWJfdCBodGFiOwotewotICBpbnQgaTsKLSAgaWYgKGh0YWItPmRlbF9mKQotICAgIGZvciAoaSA9IGh0YWItPnNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLQlpZiAoaHRhYi0+ZW50cmllc1tpXSAhPSBFTVBUWV9FTlRSWQotCSAgICAmJiBodGFiLT5lbnRyaWVzW2ldICE9IERFTEVURURfRU5UUlkpCi0JICAoKmh0YWItPmRlbF9mKSAoaHRhYi0+ZW50cmllc1tpXSk7Ci0gICAgICB9Ci0KLSAgZnJlZSAoaHRhYi0+ZW50cmllcyk7Ci0gIGZyZWUgKGh0YWIpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgZW50cmllcyBpbiB0aGUgZ2l2ZW4gaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWh0YWJfZW1wdHkgKGh0YWIpCi0gICAgIGh0YWJfdCBodGFiOwotewotICBpbnQgaTsKLSAgaWYgKGh0YWItPmRlbF9mKQotICAgIGZvciAoaSA9IGh0YWItPnNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLQlpZiAoaHRhYi0+ZW50cmllc1tpXSAhPSBFTVBUWV9FTlRSWQotCSAgICAmJiBodGFiLT5lbnRyaWVzW2ldICE9IERFTEVURURfRU5UUlkpCi0JICAoKmh0YWItPmRlbF9mKSAoaHRhYi0+ZW50cmllc1tpXSk7Ci0gICAgICB9Ci0KLSAgbWVtc2V0IChodGFiLT5lbnRyaWVzLCAwLCBodGFiLT5zaXplICogc2l6ZW9mICh2b2lkICopKTsKLX0KLQotLyogU2ltaWxhciB0byBodGFiX2ZpbmRfc2xvdCwgYnV0IHdpdGhvdXQgc2V2ZXJhbCB1bndhbnRlZCBzaWRlIGVmZmVjdHM6Ci0gICAgLSBEb2VzIG5vdCBjYWxsIGh0YWItPmVxX2Ygd2hlbiBpdCBmaW5kcyBhbiBleGlzdGluZyBlbnRyeS4KLSAgICAtIERvZXMgbm90IGNoYW5nZSB0aGUgY291bnQgb2YgZWxlbWVudHMvc2VhcmNoZXMvY29sbGlzaW9ucyBpbiB0aGUKLSAgICAgIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGFsc28gYXNzdW1lcyB0aGVyZSBhcmUgbm8gZGVsZXRlZCBlbnRyaWVzIGluIHRoZSB0YWJsZS4KLSAgIEhBU0ggaXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGluc2VydGVkLiAgKi8KLXN0YXRpYyB2b2lkICoqCi1maW5kX2VtcHR5X3Nsb3RfZm9yX2V4cGFuZCAoaHRhYiwgaGFzaCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotewotICBzaXplX3Qgc2l6ZSA9IGh0YWItPnNpemU7Ci0gIHVuc2lnbmVkIGludCBoYXNoMiA9IDEgKyBoYXNoICUgKHNpemUgLSAyKTsKLSAgdW5zaWduZWQgaW50IGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB2b2lkICoqc2xvdCA9IGh0YWItPmVudHJpZXMgKyBpbmRleDsKLSAgICAgIGlmICgqc2xvdCA9PSBFTVBUWV9FTlRSWSkKLQlyZXR1cm4gc2xvdDsKLQotICAgICAgaWYgKCpzbG90ID09IERFTEVURURfRU5UUlkpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGluZGV4ICs9IGhhc2gyOwotICAgICAgaWYgKGluZGV4ID49IHNpemUpCi0JaW5kZXggLT0gc2l6ZTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY2hhbmdlcyBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQotICAgZW50cmllcyBhbmQgcmVwZWF0ZWRseSBpbnNlcnRzIHRoZSB0YWJsZSBlbGVtZW50cy4gIFRoZSBvY2N1cGFuY3kKLSAgIG9mIHRoZSB0YWJsZSBhZnRlciB0aGUgY2FsbCB3aWxsIGJlIGFib3V0IDUwJS4gIE5hdHVyYWxseSB0aGUgaGFzaAotICAgdGFibGUgbXVzdCBhbHJlYWR5IGV4aXN0LiAgUmVtZW1iZXIgYWxzbyB0aGF0IHRoZSBwbGFjZSBvZiB0aGUKLSAgIHRhYmxlIGVudHJpZXMgaXMgY2hhbmdlZC4gKi8KLQotc3RhdGljIHZvaWQKLWh0YWJfZXhwYW5kIChodGFiKQotICAgICBodGFiX3QgaHRhYjsKLXsKLSAgdm9pZCAqKm9lbnRyaWVzOwotICB2b2lkICoqb2xpbWl0OwotICB2b2lkICoqcDsKLQotICBvZW50cmllcyA9IGh0YWItPmVudHJpZXM7Ci0gIG9saW1pdCA9IG9lbnRyaWVzICsgaHRhYi0+c2l6ZTsKLQotICBodGFiLT5zaXplID0gaGlnaGVyX3ByaW1lX251bWJlciAoaHRhYi0+c2l6ZSAqIDIpOwotICBodGFiLT5lbnRyaWVzID0geGNhbGxvYyAoaHRhYi0+c2l6ZSwgc2l6ZW9mICh2b2lkICoqKSk7Ci0KLSAgaHRhYi0+bl9lbGVtZW50cyAtPSBodGFiLT5uX2RlbGV0ZWQ7Ci0gIGh0YWItPm5fZGVsZXRlZCA9IDA7Ci0KLSAgcCA9IG9lbnRyaWVzOwotICBkbwotICAgIHsKLSAgICAgIHZvaWQgKnggPSAqcDsKLSAgICAgIGlmICh4ICE9IEVNUFRZX0VOVFJZICYmIHggIT0gREVMRVRFRF9FTlRSWSkKLQl7Ci0JICB2b2lkICoqcSA9IGZpbmRfZW1wdHlfc2xvdF9mb3JfZXhwYW5kIChodGFiLCAoKmh0YWItPmhhc2hfZikgKHgpKTsKLQkgICpxID0geDsKLQl9Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAocCA8IG9saW1pdCk7Ci0gIGZyZWUgKG9lbnRyaWVzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5IGVxdWFsIHRvIHRoZSBnaXZlbgotICAgZWxlbWVudC4gIEl0IGNhbm5vdCBiZSB1c2VkIHRvIGluc2VydCBvciBkZWxldGUgYW4gZWxlbWVudC4gICovCi0KLXZvaWQgKgotaHRhYl9maW5kX3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgaGFzaCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGNvbnN0IHZvaWQgKmVsZW1lbnQ7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotewotICB1bnNpZ25lZCBpbnQgaW5kZXgsIGhhc2gyOwotICBzaXplX3Qgc2l6ZTsKLQotICBodGFiLT5zZWFyY2hlcysrOwotICBzaXplID0gaHRhYi0+c2l6ZTsKLSAgaGFzaDIgPSAxICsgaGFzaCAlIChzaXplIC0gMik7Ci0gIGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB2b2lkICplbnRyeSA9IGh0YWItPmVudHJpZXNbaW5kZXhdOwotICAgICAgaWYgKGVudHJ5ID09IEVNUFRZX0VOVFJZKQotCXJldHVybiBOVUxMOwotICAgICAgZWxzZSBpZiAoZW50cnkgIT0gREVMRVRFRF9FTlRSWSAmJiAoKmh0YWItPmVxX2YpIChlbnRyeSwgZWxlbWVudCkpCi0JcmV0dXJuIGVudHJ5OwotCi0gICAgICBodGFiLT5jb2xsaXNpb25zKys7Ci0gICAgICBpbmRleCArPSBoYXNoMjsKLSAgICAgIGlmIChpbmRleCA+PSBzaXplKQotCWluZGV4IC09IHNpemU7Ci0gICAgfQotfQotCi0vKiBMaWtlIGh0YWJfZmluZF9zbG90X3dpdGhfaGFzaCwgYnV0IGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZnJvbSB0aGUKLSAgIGVsZW1lbnQuICAqLwotdm9pZCAqCi1odGFiX2ZpbmQgKGh0YWIsIGVsZW1lbnQpCi0gICAgIGh0YWJfdCBodGFiOwotICAgICBjb25zdCB2b2lkICplbGVtZW50OwotewotICByZXR1cm4gaHRhYl9maW5kX3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgKCpodGFiLT5oYXNoX2YpIChlbGVtZW50KSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGEgaGFzaCB0YWJsZSBzbG90IGNvbnRhaW5pbmcgYW4gZW50cnkKLSAgIGVxdWFsIHRvIHRoZSBnaXZlbiBlbGVtZW50LiAgVG8gZGVsZXRlIGFuIGVudHJ5LCBjYWxsIHRoaXMgd2l0aAotICAgSU5TRVJUID0gMCwgdGhlbiBjYWxsIGh0YWJfY2xlYXJfc2xvdCBvbiB0aGUgc2xvdCByZXR1cm5lZCAocG9zc2libHkKLSAgIGFmdGVyIGRvaW5nIHNvbWUgY2hlY2tzKS4gIFRvIGluc2VydCBhbiBlbnRyeSwgY2FsbCB0aGlzIHdpdGgKLSAgIElOU0VSVCA9IDEsIHRoZW4gd3JpdGUgdGhlIHZhbHVlIHlvdSB3YW50IGludG8gdGhlIHJldHVybmVkIHNsb3QuICAqLwotCi12b2lkICoqCi1odGFiX2ZpbmRfc2xvdF93aXRoX2hhc2ggKGh0YWIsIGVsZW1lbnQsIGhhc2gsIGluc2VydCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGNvbnN0IHZvaWQgKmVsZW1lbnQ7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICBpbnQgaW5zZXJ0OwotewotICB2b2lkICoqZmlyc3RfZGVsZXRlZF9zbG90OwotICB1bnNpZ25lZCBpbnQgaW5kZXgsIGhhc2gyOwotICBzaXplX3Qgc2l6ZTsKLQotICBpZiAoaW5zZXJ0ICYmIGh0YWItPnNpemUgKiAzIDw9IGh0YWItPm5fZWxlbWVudHMgKiA0KQotICAgIGh0YWJfZXhwYW5kIChodGFiKTsKLQotICBzaXplID0gaHRhYi0+c2l6ZTsKLSAgaGFzaDIgPSAxICsgaGFzaCAlIChzaXplIC0gMik7Ci0gIGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgaHRhYi0+c2VhcmNoZXMrKzsKLSAgZmlyc3RfZGVsZXRlZF9zbG90ID0gTlVMTDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHZvaWQgKmVudHJ5ID0gaHRhYi0+ZW50cmllc1tpbmRleF07Ci0gICAgICBpZiAoZW50cnkgPT0gRU1QVFlfRU5UUlkpCi0JewotCSAgaWYgKCFpbnNlcnQpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBodGFiLT5uX2VsZW1lbnRzKys7Ci0KLQkgIGlmIChmaXJzdF9kZWxldGVkX3Nsb3QpCi0JICAgIHsKLQkgICAgICAqZmlyc3RfZGVsZXRlZF9zbG90ID0gRU1QVFlfRU5UUlk7Ci0JICAgICAgcmV0dXJuIGZpcnN0X2RlbGV0ZWRfc2xvdDsKLQkgICAgfQotCi0JICByZXR1cm4gJmh0YWItPmVudHJpZXNbaW5kZXhdOwotCX0KLQotICAgICAgaWYgKGVudHJ5ID09IERFTEVURURfRU5UUlkpCi0JewotCSAgaWYgKCFmaXJzdF9kZWxldGVkX3Nsb3QpCi0JICAgIGZpcnN0X2RlbGV0ZWRfc2xvdCA9ICZodGFiLT5lbnRyaWVzW2luZGV4XTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCgqaHRhYi0+ZXFfZikgKGVudHJ5LCBlbGVtZW50KSkKLQkgICAgcmV0dXJuICZodGFiLT5lbnRyaWVzW2luZGV4XTsKLQl9Ci0gICAgICAKLSAgICAgIGh0YWItPmNvbGxpc2lvbnMrKzsKLSAgICAgIGluZGV4ICs9IGhhc2gyOwotICAgICAgaWYgKGluZGV4ID49IHNpemUpCi0JaW5kZXggLT0gc2l6ZTsKLSAgICB9Ci19Ci0KLS8qIExpa2UgaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoLCBidXQgY29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZQotICAgZWxlbWVudC4gICovCi12b2lkICoqCi1odGFiX2ZpbmRfc2xvdCAoaHRhYiwgZWxlbWVudCwgaW5zZXJ0KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgY29uc3Qgdm9pZCAqZWxlbWVudDsKLSAgICAgaW50IGluc2VydDsKLXsKLSAgcmV0dXJuIGh0YWJfZmluZF9zbG90X3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgKCpodGFiLT5oYXNoX2YpIChlbGVtZW50KSwKLQkJCQkgICBpbnNlcnQpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIGhhc2gKLSAgIHRhYmxlLiAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZSwgdGhpcwotICAgZnVuY3Rpb24gZG9lcyBub3RoaW5nLiAgKi8KLQotdm9pZAotaHRhYl9yZW1vdmVfZWx0IChodGFiLCBlbGVtZW50KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgdm9pZCAqZWxlbWVudDsKLXsKLSAgdm9pZCAqKnNsb3Q7Ci0KLSAgc2xvdCA9IGh0YWJfZmluZF9zbG90IChodGFiLCBlbGVtZW50LCAwKTsKLSAgaWYgKCpzbG90ID09IEVNUFRZX0VOVFJZKQotICAgIHJldHVybjsKLQotICBpZiAoaHRhYi0+ZGVsX2YpCi0gICAgKCpodGFiLT5kZWxfZikgKCpzbG90KTsKLQotICAqc2xvdCA9IERFTEVURURfRU5UUlk7Ci0gIGh0YWItPm5fZGVsZXRlZCsrOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhIHNwZWNpZmllZCBzbG90IGluIGEgaGFzaCB0YWJsZS4gIEl0IGlzCi0gICB1c2VmdWwgd2hlbiB5b3UndmUgYWxyZWFkeSBkb25lIHRoZSBsb29rdXAgYW5kIGRvbid0IHdhbnQgdG8gZG8gaXQKLSAgIGFnYWluLiAgKi8KLQotdm9pZAotaHRhYl9jbGVhcl9zbG90IChodGFiLCBzbG90KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgdm9pZCAqKnNsb3Q7Ci17Ci0gIGlmIChzbG90IDwgaHRhYi0+ZW50cmllcyB8fCBzbG90ID49IGh0YWItPmVudHJpZXMgKyBodGFiLT5zaXplCi0gICAgICB8fCAqc2xvdCA9PSBFTVBUWV9FTlRSWSB8fCAqc2xvdCA9PSBERUxFVEVEX0VOVFJZKQotICAgIGFib3J0ICgpOwotICBpZiAoaHRhYi0+ZGVsX2YpCi0gICAgKCpodGFiLT5kZWxfZikgKCpzbG90KTsKLSAgKnNsb3QgPSBERUxFVEVEX0VOVFJZOwotICBodGFiLT5uX2RlbGV0ZWQrKzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzY2FucyBvdmVyIHRoZSBlbnRpcmUgaGFzaCB0YWJsZSBjYWxsaW5nCi0gICBDQUxMQkFDSyBmb3IgZWFjaCBsaXZlIGVudHJ5LiAgSWYgQ0FMTEJBQ0sgcmV0dXJucyBmYWxzZSwKLSAgIHRoZSBpdGVyYXRpb24gc3RvcHMuICBJTkZPIGlzIHBhc3NlZCBhcyBDQUxMQkFDSydzIHNlY29uZAotICAgYXJndW1lbnQuICAqLwotCi12b2lkCi1odGFiX3RyYXZlcnNlIChodGFiLCBjYWxsYmFjaywgaW5mbykKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGh0YWJfdHJhdiBjYWxsYmFjazsKLSAgICAgdm9pZCAqaW5mbzsKLXsKLSAgdm9pZCAqKnNsb3QsICoqbGltaXQ7Ci0gIHNsb3QgPSBodGFiLT5lbnRyaWVzOwotICBsaW1pdCA9IHNsb3QgKyBodGFiLT5zaXplOwotICBkbwotICAgIHsKLSAgICAgIHZvaWQgKnggPSAqc2xvdDsKLSAgICAgIGlmICh4ICE9IEVNUFRZX0VOVFJZICYmIHggIT0gREVMRVRFRF9FTlRSWSkKLQlpZiAoISgqY2FsbGJhY2spIChzbG90LCBpbmZvKSkKLQkgIGJyZWFrOwotICAgIH0KLSAgd2hpbGUgKCsrc2xvdCA8IGxpbWl0KTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXR1cm5zIGN1cnJlbnQgc2l6ZSBvZiBnaXZlbiBoYXNoIHRhYmxlLiAqLwotCi1zaXplX3QKLWh0YWJfc2l6ZSAoaHRhYikKLSAgICAgaHRhYl90IGh0YWI7Ci17Ci0gIHJldHVybiBodGFiLT5zaXplOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJldHVybnMgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gZ2l2ZW4KLSAgIGhhc2ggdGFibGUuICovCi0KLXNpemVfdAotaHRhYl9lbGVtZW50cyAoaHRhYikKLSAgICAgaHRhYl90IGh0YWI7Ci17Ci0gIHJldHVybiBodGFiLT5uX2VsZW1lbnRzIC0gaHRhYi0+bl9kZWxldGVkOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJldHVybnMgbnVtYmVyIG9mIHBlcmNlbnRzIG9mIGZpeGVkCi0gICBjb2xsaXNpb25zIGR1cmluZyBhbGwgd29yayB3aXRoIGdpdmVuIGhhc2ggdGFibGUuICovCi0KLWRvdWJsZQotaHRhYl9jb2xsaXNpb25zIChodGFiKQotICAgICBodGFiX3QgaHRhYjsKLXsKLSAgaW50IHNlYXJjaGVzOwotCi0gIHNlYXJjaGVzID0gaHRhYi0+c2VhcmNoZXM7Ci0gIGlmIChzZWFyY2hlcyA9PSAwKQotICAgIHJldHVybiAwLjA7Ci0gIHJldHVybiAoZG91YmxlKWh0YWItPmNvbGxpc2lvbnMgLyAoZG91YmxlKXNlYXJjaGVzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2hleC5jIGIvbGliaWJlcnR5L2hleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJlZWYwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9oZXguYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOwotCi12b2lkIGhleF9pbml0ICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgX2hleF9hcnJheV9zaXplOyBpKyspCi0gICAgX2hleF92YWx1ZVtpXSA9IF9oZXhfYmFkOwotICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLSAgICBfaGV4X3ZhbHVlWycwJyArIGldID0gaTsKLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICBfaGV4X3ZhbHVlWydhJyArIGldID0gX2hleF92YWx1ZVsnQScgKyBpXSA9IDEwICsgaTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9pbmRleC5jIGIvbGliaWJlcnR5L2luZGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTAwZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2luZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKiBzdHJjaHIoKTsKLQotY2hhciAqCi1pbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2luc3F1ZS5jIGIvbGliaWJlcnR5L2luc3F1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUwMTlmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9pbnNxdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIGluc3F1ZSgzQykgcm91dGluZXMKLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JaW5zcXVlLCByZW1xdWUgLS0gaW5zZXJ0LCByZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgcXVldWUKLQotU1lOT1BTSVMKLQlzdHJ1Y3QgcWVsZW0gewotCSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0JICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKLQkgIGNoYXIgcV9kYXRhW107Ci0JfTsKLQotCXZvaWQgaW5zcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0sIHN0cnVjdCBxZWxlbSAqcHJlZCkKLQotCXZvaWQgcmVtcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0pCi0KLURFU0NSSVBUSU9OCi0JUm91dGluZXMgdG8gbWFuaXB1bGF0ZSBxdWV1ZXMgYnVpbHQgZnJvbSBkb3VibHkgbGlua2VkIGxpc3RzLgotCVRoZSBpbnNxdWUgcm91dGluZSBpbnNlcnRzIEVMRU0gaW4gdGhlIHF1ZXVlIGltbWVkaWF0ZWx5IGFmdGVyCi0JUFJFRC4gIFRoZSByZW1xdWUgcm91dGluZSByZW1vdmVzIEVMRU0gZnJvbSBpdHMgY29udGFpbmluZyBxdWV1ZS4KLSovCi0KLQotc3RydWN0IHFlbGVtIHsKLSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0gIHN0cnVjdCBxZWxlbSAqcV9iYWNrOwotfTsKLQotCi12b2lkCi1pbnNxdWUgKGVsZW0sIHByZWQpCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLSAgc3RydWN0IHFlbGVtICpwcmVkOwotewotICBlbGVtIC0+IHFfZm9ydyA9IHByZWQgLT4gcV9mb3J3OwotICBwcmVkIC0+IHFfZm9ydyAtPiBxX2JhY2sgPSBlbGVtOwotICBlbGVtIC0+IHFfYmFjayA9IHByZWQ7Ci0gIHByZWQgLT4gcV9mb3J3ID0gZWxlbTsKLX0KLQotCi12b2lkCi1yZW1xdWUgKGVsZW0pCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLXsKLSAgZWxlbSAtPiBxX2ZvcncgLT4gcV9iYWNrID0gZWxlbSAtPiBxX2JhY2s7Ci0gIGVsZW0gLT4gcV9iYWNrIC0+IHFfZm9ydyA9IGVsZW0gLT4gcV9mb3J3OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcyBiL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2RkNDUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSB1bmRlciBvcGVuVk1TL0FscGhhCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotIwotCi1PQkpTPWJjb3B5Lm9iaixiY21wLm9iaixnZXRvcHQub2JqLG9ic3RhY2sub2JqLHhleGl0Lm9iaix4bWFsbG9jLm9iaixoZXgub2JqLFwKLSAgIGdldG9wdDEub2JqLGNwbHVzLWRlbS5vYmosc3RybmNhc2VjbXAub2JqLHN0cmNhc2VjbXAub2JqLHN0cmR1cC5vYmosXAotICAgY29uY2F0Lm9iaixnZXRydW50aW1lLm9iaixnZXRwYWdlc2l6ZS5vYmosYWxsb2NhLm9iaix4c3RyZXJyb3Iub2JqLFwKLSAgIHhtZW1kdXAub2JqLHhzdHJkdXAub2JqLHhhdGV4aXQub2JqLGNob29zZS10ZW1wLm9iaixmbm1hdGNoLm9iaixvYmphbGxvYy5vYmoKLQotaWZlcSAoJChDQyksZ2NjKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkKLWVsc2UKLSMgYXNzdW1lIGRlYyBjCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKS9kZWZpbmU9KCJjb25zdD0iKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYykKLWVuZGlmCi0KLWxpYmliZXJ0eS5vbGI6IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJpYmVydHkgKi5vYmoKLQotY29uZmlnLmg6IGNvbmZpZy5oLXZtcwotCSQoQ1ApICQ8ICRACi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7Ci0JJChSTSkgbGliaWJlcnR5Lm9sYjsKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jaHIuYyBiL2xpYmliZXJ0eS9tZW1jaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMzAwMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotRlVOQ1RJT04KLQk8PG1lbWNocj4+LS0tZmluZCBjaGFyYWN0ZXIgaW4gbWVtb3J5Ci0KLUlOREVYCi0JbWVtY2hyCi0KLUFOU0lfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKjxbc3JjXT4sIGludCA8W2NdPiwgc2l6ZV90IDxbbGVuZ3RoXT4pOwotCi1UUkFEX1NZTk9QU0lTCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCXZvaWQgKm1lbWNocig8W3NyY10+LCA8W2NdPiwgPFtsZW5ndGhdPikKLQl2b2lkICo8W3NyY10+OwotCXZvaWQgKjxbY10+OwotCXNpemVfdCA8W2xlbmd0aF0+OwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgbWVtb3J5IHN0YXJ0aW5nIGF0IDw8Kjxbc3JjXT4+PiBmb3IgdGhlCi0JY2hhcmFjdGVyIDxbY10+LiAgVGhlIHNlYXJjaCBvbmx5IGVuZHMgd2l0aCB0aGUgZmlyc3QKLQlvY2N1cnJlbmNlIG9mIDxbY10+LCBvciBhZnRlciA8W2xlbmd0aF0+IGNoYXJhY3RlcnM7IGluCi0JcGFydGljdWxhciwgPDxOVUxMPj4gZG9lcyBub3QgdGVybWluYXRlIHRoZSBzZWFyY2guCi0KLVJFVFVSTlMKLQlJZiB0aGUgY2hhcmFjdGVyIDxbY10+IGlzIGZvdW5kIHdpdGhpbiA8W2xlbmd0aF0+IGNoYXJhY3RlcnMKLQlvZiA8PCo8W3NyY10+Pj4sIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGlzIHJldHVybmVkLiBJZgotCTxbY10+IGlzIG5vdCBmb3VuZCwgdGhlbiA8PE5VTEw+PiBpcyByZXR1cm5lZC4gCQotCi1QT1JUQUJJTElUWQotPDxtZW1jaHI+PiAgcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KLQotUVVJQ0tSRUYKLQltZW1jaHIgYW5zaSBwdXJlCi0KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotbWVtY2hyIChzcmNfdm9pZCwgYywgbGVuZ3RoKQotICAgICByZWdpc3RlciBjb25zdCBQVFIgc3JjX3ZvaWQ7Ci0gICAgIGludCBjOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY192b2lkOwotICAKLSAgd2hpbGUgKC0tbGVuZ3RoID49IDApCi0gIHsKLSAgICBpZiAoKnNyYyA9PSBjKQotICAgICByZXR1cm4gKFBUUilzcmM7Ci0gICAgc3JjKys7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY21wLmMgYi9saWJpYmVydHkvbWVtY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2FlMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0JaW50IG1lbWNtcCAoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8sIHNpemVfdCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlvcmRlcmluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLWludAotREVGVU4obWVtY21wLCAoc3RyMSwgc3RyMiwgY291bnQpLAotICAgICAgY29uc3QgUFRSIHN0cjEgQU5EIGNvbnN0IFBUUiBzdHIyIEFORCBzaXplX3QgY291bnQpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMxID0gKHVuc2lnbmVkIGNoYXIqKXN0cjE7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMyID0gKHVuc2lnbmVkIGNoYXIqKXN0cjI7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqczErKyAhPSAqczIrKykKLQkgIHJldHVybiBzMVstMV0gPCBzMlstMV0gPyAtMSA6IDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNweS5jIGIvbGliaWJlcnR5L21lbWNweS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdhOWY1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIG1lbWNweSAodGhlIHN0YW5kYXJkIEMgZnVuY3Rpb24pCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkKiBtZW1jcHkgKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBuKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbWNweSwgKG91dCwgaW4sIGxlbmd0aCksIFBUUiBvdXQgQU5EIGNvbnN0IFBUUiBpbiBBTkQgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBiY29weShpbiwgb3V0LCBsZW5ndGgpOwotICAgIHJldHVybiBvdXQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtbW92ZS5jIGIvbGliaWJlcnR5L21lbW1vdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzMyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtbW92ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgbWVtbW92ZSB1c2luZyBCU0QncyBiY29weS4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAqLwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1tb3ZlIChzMSwgczIsIG4pCi0gICAgIFBUUiBzMTsKLSAgICAgY29uc3QgUFRSIHMyOwotICAgICBzaXplX3QgbjsKLXsKLSAgYmNvcHkgKHMyLCBzMSwgbik7Ci0gIHJldHVybiBzMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1zZXQuYyBiL2xpYmliZXJ0eS9tZW1zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDgzMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBtZW1zZXQKLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbXNldCwgKGRlc3QsIHZhbCwgbGVuKSwKLSAgICAgIFBUUiBkZXN0IEFORCByZWdpc3RlciBpbnQgdmFsIEFORCByZWdpc3RlciBzaXplX3QgbGVuKQotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciopZGVzdDsKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICAqcHRyKysgPSB2YWw7Ci0gIHJldHVybiBkZXN0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21rc3RlbXBzLmMgYi9saWJpYmVydHkvbWtzdGVtcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMTZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWtzdGVtcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIG1rc3RlbXAuYyBmcm9tIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFdlIG5lZWQgdG8gcHJvdmlkZSBhIHR5cGUgZm9yIGdjY191aW50NjRfdC4gICovCi0jaWZkZWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGdjY191aW50NjRfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2VuZGlmCi0KLSNpZm5kZWYgVE1QX01BWAotI2RlZmluZSBUTVBfTUFYIDE2Mzg0Ci0jZW5kaWYKLQotLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgotCi0gICBURU1QTEFURSBoYXMgdGhlIGZvcm06Ci0KLSAgIDxwYXRoPi9jY1hYWFhYWDxzdWZmaXg+Ci0KLSAgIFNVRkZJWF9MRU4gdGVsbHMgdXMgaG93IGxvbmcgPHN1ZmZpeD4gaXMgKGl0IGNhbiBiZSB6ZXJvIGxlbmd0aCkuCi0KLSAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIGJlZm9yZSA8c3VmZml4PiBtdXN0IGJlICJYWFhYWFgiOwotICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCi0KLSAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gICovCi1pbnQKLW1rc3RlbXBzICh0ZW1wbGF0ZSwgc3VmZml4X2xlbikKLSAgICAgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzdWZmaXhfbGVuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10KLSAgICA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7Ci0gIHN0YXRpYyBnY2NfdWludDY0X3QgdmFsdWU7Ci0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLSAgY2hhciAqWFhYWFhYOwotICBzaXplX3QgbGVuOwotICBpbnQgY291bnQ7Ci0KLSAgbGVuID0gc3RybGVuICh0ZW1wbGF0ZSk7Ci0KLSAgaWYgKChpbnQpIGxlbiA8IDYgKyBzdWZmaXhfbGVuCi0gICAgICB8fCBzdHJuY21wICgmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dLCAiWFhYWFhYIiwgNikpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBYWFhYWFggPSAmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dOwotCi0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KLSAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOwotICB2YWx1ZSArPSAoKGdjY191aW50NjRfdCkgdHYudHZfdXNlYyA8PCAxNikgXiB0di50dl9zZWMgXiBnZXRwaWQgKCk7Ci0jZWxzZQotICB2YWx1ZSArPSBnZXRwaWQgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUTVBfTUFYOyArK2NvdW50KQotICAgIHsKLSAgICAgIGdjY191aW50NjRfdCB2ID0gdmFsdWU7Ci0gICAgICBpbnQgZmQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KLSAgICAgIFhYWFhYWFswXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFszXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOwotCi0gICAgICBmZCA9IG9wZW4gKHRlbXBsYXRlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOwotICAgICAgaWYgKGZkID49IDApCi0JLyogVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuICAqLwotCXJldHVybiBmZDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJhbmRvbSB2YWx1ZS4gIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdGhlIG5leHQKLQkgVE1QX01BWCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyA3Nzc3IHRvIFZBTFVFIGFyZSBkaWZmZXJlbnQKLQkgd2l0aCAobW9kdWxlIDJeMzIpLiAgKi8KLSAgICAgIHZhbHVlICs9IDc3Nzc7Ci0gICAgfQotCi0gIC8qIFdlIHJldHVybiB0aGUgbnVsbCBzdHJpbmcgaWYgd2UgY2FuJ3QgZmluZCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLwotICB0ZW1wbGF0ZVswXSA9ICdcMCc7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluIGIvbGliaWJlcnR5L21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjE4MDIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGxpYmliZXJ0eS4KLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZCBiL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmE1ZTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyBsaWJpYmVydHkncyBVbml4IG1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLSMgQ29tbWVudCBvdXQgYSB1c2VsZXNzIHRoaW5nLgotL15cLmFsd2F5c1wuL3MvXi8jLwotCi0jIFJlcGxhY2UgdGhlIGF1dG8tZ2VuZXJhdGVkIGxpc3Qgd2l0aCB0aGUgbGlzdCBvZiB3aGF0IHdlIGtub3cgd2UgbmVlZC4KLXMvYGNhdCBuZWVkZWQtbGlzdGAvIntvfSJhbGxvY2EuYy5vICJ7b30iYmNvcHkuYy5vICJ7b30iZ2V0cGFnZXNpemUuYy5vICJ7b30iaW5zcXVlLmMubyAie299Im1wdy5jLm8gIntvfSJzdHJjYXNlY21wLmMubyAie299InN0cmR1cC5jLm8gIntvfSJzdHJuY2FzZWNtcC5jLm8vCi0KLSMgUGFzdGUgaW4gc29tZSBkZXNpcmFibGUgZGVmaW5pdGlvbnMuCi0jIFRoZSBkZWZhdWx0IHJ1bGUgaGVyZSBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSB0cmlja3kgc3R1ZmYgaW4gdGhlIFVuaXgKLSMgTWFrZWZpbGUuaW4uCi0vXiMjIyQvYVwKLVwKLUhERUZJTkVTID0gLWQgTkVFRF9zeXNfc2lnbGlzdCAtZCBORUVEX3N5c19lcnJsaXN0IC1kIE5FRURfYmFzZW5hbWUgLWQgTkVFRF9zdHJjYXNlY21wIC1kIE5FRURfc3RybmNhc2VjbXBcCi1JTkNMVURFUyA9IC1pIDogLWkge0lOQ0RJUn06IC1pIHtJTkNESVJ9Om1wdzogLWkgOjpleHRyYS1pbmNsdWRlOiAtaSAie3N9IlwKLVwKLS5jLm8gXFxPcHRpb24tZiAuY1wKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyB7TElCQ0ZMQUdTfSB7SU5DTFVERVN9IHtIREVGSU5FU30gQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vXAotCi0jIFJlbW92ZSBkZXBlbmRlbmN5IG9uIG5lZWRlZC1saXN0LCB3aGljaCB3ZSBkb24ndCB1c2UuCi0vRE9fQUxTTyA9L3MvbmVlZGVkLWxpc3QvLwotCi0vSU5DRElSPS9zLyJ7c3JjZGlyfSJ7TVVMVElTUkNUT1B9OjovInt0b3BzcmNkaXJ9Ii8KLQotIyBXaGFjayBvdXQgdGhlIENPTVBJTEUuYyB0cmlja2luZXNzLgotL15DT01QSUxFLmMgLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgbXVsdGlkbyB0cmlja2luZXNzIGZyb20gdGhlICJhbGwiIHRhcmdldC4KLS9eYWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotYWxsIFxcT3B0aW9uLWYge1RBUkdFVExJQn1cCi0KLQotIyBSZW1vdmUgdGhlIFJVTEUxL1JVTEUyIGNydWQuCi0vaWYgXFsvLC9maS9kCi0vXlJVTEUxID0vLC9SVUxFMiA9L2QKLS9SVUxFMi9zL1JVTEUyL1RBUkdFVExJQi8KLQotIyBEb24ndCB3YW50IGZkbWF0Y2ggZXZlci4KLXMvICJ7b30iZmRtYXRjaC5jLm8vLwotCi0jIEZpeCBwYXRocyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZy5oLyJ7b30iY29uZmlnLmgvCi0KLSMgV2hhY2sgb3V0IGNvbmZpZyByZWJ1aWxkIHJ1bGVzLgotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LmMgYi9saWJpYmVydHkvbXB3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2FlNDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiBNUFctVW5peCBjb21wYXRpYmlsaXR5IGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdW5kZXIgTVBXLiAqLwotCi0jaW5jbHVkZSAibXB3LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLQotI2luY2x1ZGUgPFRpbWVyLmg+Ci0KLS8qIEluaXRpYWxpemUgdG8gMCBhdCBmaXJzdCwgdGhlbiBzZXQgdG8gZXJybm9fbWF4KCkgbGF0ZXIuICAqLwotCi1pbnQgc3lzX25lcnIgPSAwOwotCi0vKiBEZWJ1ZyBmbGFnIGZvciBwYXRobmFtZSBoYWNraW5nLiAgU2V0IHRoaXMgdG8gb25lIGFuZCByZWJ1aWxkLiAqLwotCi1pbnQgRGVidWdQSSA9IC0xOwotCi12b2lkCi1tcHdpZnlfZmlsZW5hbWUoY2hhciAqdW5peG5hbWUsIGNoYXIgKm1hY25hbWUpCi17Ci0gIGludCBpLCBqOwotCi0gIC8qIChzaG91bGQgdHJ1bmNhdGUgMjU1IGNoYXJzIGZyb20gZW5kIG9mIG5hbWUsIG5vdCBiZWdpbm5pbmcpICovCi0gIGlmIChzdHJsZW4gKHVuaXhuYW1lKSA+IDI1NSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQYXRobmFtZSBcIiVzXCIgaXMgdG9vIGxvbmcgZm9yIE1hY3MsIHRydW5jYXRpbmdcbiIsCi0JICAgICAgIHVuaXhuYW1lKTsKLSAgICB9Ci0gIGogPSAwOwotICAvKiBJZiB5b3UncmUgZ29pbmcgdG8gZW5kIHVwIHdpdGggb25lIG9yIG1vcmUgY29sb25zIGluIHRoZSBtaWRkbGUgb2YgYQotICAgICBwYXRoIGFmdGVyIGFuIGFsbC1Vbml4IHJlbGF0aXZlIHBhdGggaXMgdHJhbnNsYXRlZCwgeW91IG11c3QgYWRkIGEKLSAgICAgY29sb24gb24gdGhlIGZyb250LCBzbyB0aGF0IHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbm90IHRob3VnaHQgdG8gYmUKLSAgICAgYSBkaXNrIG5hbWUuICAqLwotICBpZiAodW5peG5hbWVbMF0gIT0gJy8nICYmICEgc3RyY2hyICh1bml4bmFtZSwgJzonKSAmJiBzdHJjaHIgKHVuaXhuYW1lLCAnLycpKQotICAgIHsKLSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IHVuaXhuYW1lW2ldICE9ICdcMCcgJiYgaSA8IDI1NTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpID09IDAgJiYgdW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIGlmIChzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgdGVtcG9yYXJ5IG5hbWUsIG1ha2UgYSBtb3JlIE1hYy1mbGF2b3JlZCB0bXBuYW1lLiAqLwotCSAgICAgIC8qIEEgYmV0dGVyIGNob2ljZSB3b3VsZCBiZSB7Qm9vdH1UcmFzaDpmb28sIGJ1dAotCQkgdGhhdCB3b3VsZCByZXF1aXJlIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgdGhlCi0JCSBib290IGRpc2sncyBhbmQgdHJhc2hjYW4ncyBuYW1lLiAgQW5vdGhlciBvcHRpb24KLQkJIHdvdWxkIGJlIHRvIGhhdmUgYW4gZW52IHZhciwgc28gdXNlciBjYW4gcG9pbnQgaXQKLQkJIGF0IGEgcmFtZGlzay4gKi8KLQkgICAgICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ3QnOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdtJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAncCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ18nOwotCSAgICAgIGkgKz0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgY29weSB0aGUgbGVhZGluZyBzbGFzaC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICc6JyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLicgJiYgdW5peG5hbWVbaSsyXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1hY25hbWVbaisrXSA9IHVuaXhuYW1lW2ldOwotCX0KLSAgICB9Ci0gIG1hY25hbWVbal0gPSAnXDAnOwotICAvKiBBbGxvdyBmb3IgZ2V0dGluZyB0aGUgZGVidWcgZmxhZyBmcm9tIGFuIGVudiB2YXI7IHF1aXRlIHVzZWZ1bC4gKi8KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIE1hZGUgXCIlc1wiXG4iLCB1bml4bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIGludG8gXCIlc1wiXG4iLCBtYWNuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIE1QVy1mbGF2b3JlZCBiYXNlbmFtZSBmaW5kZXIuICovCi0KLWNoYXIgKgotbXB3X2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lKysgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lOwotCX0KLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBNaXhlZCBNUFcvVW5peCBiYXNlbmFtZSBmaW5kZXIuICBUaGlzIGNhbiBiZSBsZWQgYXN0cmF5IGJ5Ci0gICBmaWxlbmFtZXMgd2l0aCBzbGFzaGVzIGluIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhIGJhc2VuYW1lIHRoYXQKLSAgIGVpdGhlciBjb3JyZXNwb25kcyB0byBubyBmaWxlIG9yICh3b3JzZSkgdG8gc29tZSBvdGhlciBmaWxlLCBzbwotICAgc2hvdWxkIG9ubHkgYmUgdHJpZWQgaWYgb3RoZXIgbWV0aG9kcyBvZiBmaW5kaW5nIGEgZmlsZSB2aWEgYQotICAgYmFzZW5hbWUgaGF2ZSBmYWlsZWQuICAqLwotCi1jaGFyICoKLW1wd19taXhlZF9iYXNlbmFtZSAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBmb3BlbigpIG1vZGlmaWVkIHRvIGNyZWF0ZSBmaWxlcyB0aGF0IGFyZSB0eXBlIFRFWFQKLSAgIG9yICdCSU4gJywgYW5kIGFsd2F5cyBvZiB0eXBlICdNUFMgJy4gICovCi0KLUZJTEUgKgotbXB3X2ZvcGVuIChjaGFyICpuYW1lLCBjaGFyICptb2RlKQotewotI3VuZGVmIGZvcGVuCi0gIGludCBlcnJudW07Ci0gIEZJTEUgKmZwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKG5hbWUsIHRtcG5hbWUpOwotICBQUk9HUkVTUyAoMSk7Ci0gIGZwID0gZm9wZW4gKHRtcG5hbWUsIG1vZGUpOwotICBlcnJudW0gPSBlcnJubzsKLQotICAvKiBJZiB3cml0aW5nLCBuZWVkIHRvIHNldCB0eXBlIGFuZCBjcmVhdG9yIHVzZWZ1bGx5LiAqLwotICBpZiAoc3RyY2hyIChtb2RlLCAndycpKQotICAgIHsKLSAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRtcG5hbWUpICsgMik7Ci0gICAgICBPU0VyciBlOwotICAgICAgc3RydWN0IEZJbmZvIGZpOwotCi0gICAgICBwbmFtZVswXSA9IHN0cmxlbiAodG1wbmFtZSk7Ci0gICAgICBzdHJjcHkgKHBuYW1lKzEsIHRtcG5hbWUpOwotCQotICAgICAgZSA9IEdldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICAvKiBzaG91bGQgZG8gc3BpZmZpZXIgZXJyb3IgaGFuZGxpbmcgKi8KLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJHZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGlmIChzdHJjaHIgKG1vZGUsICdiJykpCi0JewotCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ0JJTiAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnVEVYVCc7Ci0JfQotICAgICAgZmkuZmRDcmVhdG9yID0gKE9TVHlwZSkgJ01QUyAnOwotICAgICAgZSA9IFNldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICBpZiAoZSAhPSAwKQotCWZwcmludGYoc3RkZXJyLCAiU2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7Ci0gICAgICBmcmVlIChwbmFtZSk7Ci0gICAgfQotICBpZiAoZnAgPT0gTlVMTCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIGZwOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmc2VlaygpIG1vZGlmaWVkIHRvIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcwotICAgaWYgc2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgaXQuICAqLwotCi0jZGVmaW5lIFpFUk9CTEtTSVpFIDQwOTYKLQotY2hhciB6ZXJvc1taRVJPQkxLU0laRV07Ci0KLWludAotbXB3X2ZzZWVrIChGSUxFICpmcCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKLXsKLSN1bmRlZiBmc2VlawotICBpbnQgY3Vyc2l6ZSwgbnVtbGVmdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCi0gICAgewotICAgICAgZnNlZWsgKGZwLCAwLCBTRUVLX0VORCk7Ci0gICAgICBjdXJzaXplID0gZnRlbGwgKGZwKTsKLSAgICAgIGlmIChvZmZzZXQgPiBjdXJzaXplKQotCXsKLQkgIG51bWxlZnQgPSBvZmZzZXQgLSBjdXJzaXplOwotCSAgd2hpbGUgKG51bWxlZnQgPiBaRVJPQkxLU0laRSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWlnaHQgZmFpbCwgc2hvdWxkIGNoZWNrIGZvciB0aGF0LiAqLwotCSAgICAgIFBST0dSRVNTICgxKTsKLQkgICAgICBmd3JpdGUgKHplcm9zLCAxLCBaRVJPQkxLU0laRSwgZnApOwotCSAgICAgIG51bWxlZnQgLT0gWkVST0JMS1NJWkU7Ci0JICAgIH0KLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ3cml0ZSAoemVyb3MsIDEsIG51bWxlZnQsIGZwKTsKLQkgIGZmbHVzaCAoZnApOwotCX0KLSAgICB9Ci0gIHJldHVybiBmc2VlayAoZnAsIG9mZnNldCwgd2hlbmNlKTsKLX0KLQotaW50Ci1tcHdfZnJlYWQgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKLXsKLSN1bmRlZiBmcmVhZAotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbXB3X2Z3cml0ZSAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZ3cml0ZQotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWxpbmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAibGluayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci1mb3JrICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci19Ci0KLWludAotdmZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAidmZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXBpcGUgKGludCAqZmQpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInBpcGUgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWV4ZWN2cCAoY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2cCBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotZXhlY3YgKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICJleGVjdiBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1raWxsIChpbnQgcGlkLCBpbnQgc2lnKQotewotICBmcHJpbnRmIChzdGRlcnIsICJraWxsIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci13YWl0IChpbnQgKnN0YXR1cykKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLXNsZWVwIChpbnQgc2Vjb25kcykKLXsKLSAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBub3c7Ci0KLSAgdGltZSAoJnN0YXJ0X3RpbWUpOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyBzZWNvbmRzKQotCXJldHVybiAwOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkCi1wdXRlbnYgKGNoYXIgKnN0cikKLXsKLSAgLyogVGhlIEdDQyBkcml2ZXIgY2FsbHMgdGhpcyB0byBkbyB0aGluZ3MgZm9yIGNvbGxlY3QyLCBidXQgd2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCBjb2xsZWN0Mi4gKi8KLX0KLQotaW50Ci1jaG1vZCAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIC8qIFByZXRlbmQgaXQgd2FzIGFsbCBPSy4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZ2V0dWlkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZ2V0Z2lkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogSW5zdGVhZCBvZiBjb3JlZHVtcGluZywgd2hpY2ggaXMgbm90IGEgbm9ybWFsIE1hYyBmYWNpbGl0eSwgd2UKLSAgIGRyb3AgaW50byBNYWNzYnVnLiAgSWYgd2UgdGhlbiAiZyIgZnJvbSBNYWNzYnVnLCB0aGUgcHJvZ3JhbSB3aWxsCi0gICBleGl0IGNsZWFubHkuICovCi0KLXZvaWQKLW1wd19hYm9ydCAoKQotewotICAvKiBNYWtlIHN1cmUgbm8gb3V0cHV0IHN0aWxsIGJ1ZmZlcmVkIHVwLCB0aGVuIHphcCBpbnRvIE1hY3NCdWcuICovCi0gIGZmbHVzaChzdGRvdXQpOwotICBmZmx1c2goc3RkZXJyKTsKLSAgcHJpbnRmKCIjIyBBYm9ydCEgIyNcbiIpOwotI2lmZGVmIE1QV19TQURFCi0gIFN5c0Vycm9yKDgwMDUpOwotI2Vsc2UgCi0gIERlYnVnZ2VyKCk7Ci0jZW5kaWYKLSAgLyogImciIGluIE1hY3NCdWcgd2lsbCB0aGVuIGNhdXNlIGEgcmVndWxhciBlcnJvciBleGl0LiAqLwotICBleGl0ICgxKTsKLX0KLQotLyogSW1pdGF0aW9uIGdldHJ1c2FnZSBiYXNlZCBvbiB0aGUgQU5TSSBjbG9jaygpIGZ1bmN0aW9uLiAqLwotCi1pbnQKLWdldHJ1c2FnZSAoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnVzYWdlKQotewotICBpbnQgY2xrID0gY2xvY2sgKCk7Ci0KLSNpZiAwCi0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfc2VjID0gY2xrIC8gQ0xPQ0tTX1BFUl9TRUM7Ci0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfdXNlYyA9ICgoY2xrICogMTAwMCkgLyBDTE9DS1NfUEVSX1NFQykgKiAxMDAwOwotICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyA9IDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyA9IDA7Ci0jZW5kaWYKLX0KLQotaW50Ci1zYnJrICgpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWlzYXR0eSAoaW50IGZkKQotewotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSBUaW1vdGh5IE11cnJheSdzIFBvc2l4IGxpYnJhcnkuICovCi0KLSNpbmNsdWRlICJ1dGltZS5oIgotCi1pbnQKLXV0aW1lIChjaGFyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgKnRpbWVzKQotewotICBDSW5mb1BCUmVjIGNpcGJyOwotICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8gKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyAqKSAmY2lwYnI7Ci0gIHVuc2lnbmVkIGNoYXIgcG5hbWVbMjU2XTsKLSAgc2hvcnQgZXJyOwotICAKLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgZmlsZW5hbWUpOwotICBjMnBzdHIgKHBuYW1lKTsKLQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvTmFtZVB0ciA9IHBuYW1lOwotICBmcGItPmlvVlJlZk51bSA9IDA7Ci0gIGZwYi0+aW9GRGlySW5kZXggPSAwOwotICBmcGItPmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVOT0VOVDsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZHBiLT5pb0RyRGlySUQgPSAwTDsKLSAgZnBiLT5pb0ZsTWREYXQgPSB0aW1lcy0+bW9kdGltZTsKLSAgZnBiLT5pb0ZsQ3JEYXQgPSB0aW1lcy0+YWN0aW1lOwotICBlcnIgPSBQQlNldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVBQ0NFUzsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWtkaXIgKGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXJtZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotY2hvd24gKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLQotY2hhciAqbXllbnZpcm9uW10gPSB7TlVMTH07Ci0KLWNoYXIgKiplbnZpcm9uID0gbXllbnZpcm9uOwotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0KLS8qIE1pbmltYWwgJ3N0YXQnIGVtdWxhdGlvbjogdGVsbHMgZGlyZWN0b3JpZXMgZnJvbSBmaWxlcyBhbmQKLSAgIGdpdmVzIGxlbmd0aCBhbmQgbXRpbWUuCi0KLSAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgQ1dJLCBBbXN0ZXJkYW0KLSAgIGFuZCBwbGFjZWQgYnkgaGltIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotZXh0ZXJuIGludCBfX3VpZCwgX19naWQ7Ci0KLWludCBfX3VpZCA9IDA7Ci1pbnQgX19naWQgPSAwOwotCi0vKiBCaXRzIGluIGlvRmxBdHRyaWI6ICovCi0jZGVmaW5lIExPQ0tCSVQJKDE8PDApCQkvKiBGaWxlIGxvY2tlZCAqLwotI2RlZmluZSBESVJCSVQJKDE8PDQpCQkvKiBJdCdzIGEgZGlyZWN0b3J5ICovCi0KLS8qIE1hY2lmaWVkICJzdGF0IiBpbiB3aGljaCBmaWxlbmFtZSBpcyBnaXZlbiByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwKLSAgIHNwZWNpZmllZCBieSBsb25nIERpcklELiAgKi8KLQotc3RhdGljIGludAotX3N0YXQgKGNoYXIgKm5hbWUsIGxvbmcgZGlyaWQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyopICZjaXBicjsKLSAgRGlySW5mbyAqZHBiID0gKERpckluZm8qKSAmY2lwYnI7Ci0gIFN0cjI1NSBwbmFtZTsKLSAgc2hvcnQgZXJyOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGNvcHkgb2YgdGhlIG5hbWUgYW5kIHBhc2NhbGl6ZS4gKi8KLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotICAKLSAgY2lwYnIuZGlySW5mby5pb0RyRGlySUQgPSBkaXJpZDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvTmFtZVB0ciA9IHBuYW1lOwotICBjaXBici5oRmlsZUluZm8uaW9WUmVmTnVtID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRkRpckluZGV4ID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgewotICAgICAgZXJybm8gPSBFTk9FTlQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiBNYWMgZmlsZXMgYXJlIHJlYWRhYmxlIGlmIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGF0IGFsbC4gKi8KLSAgYnVmLT5zdF9tb2RlID0gMDQ0NDsKLSAgLyogTWFyayB1bmxvY2tlZCBmaWxlcyBhcyB3cml0ZWFibGUuICovCi0gIGlmICghKGZwYi0+aW9GbEF0dHJpYiAmIExPQ0tCSVQpKQotICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMjIyOwotICBpZiAoZnBiLT5pb0ZsQXR0cmliICYgRElSQklUKQotICAgIHsKLSAgICAgIC8qIE1hcmsgZGlyZWN0b3JpZXMgYXMgImV4ZWN1dGFibGUiLiAqLwotICAgICAgYnVmLT5zdF9tb2RlIHw9IDAxMTEgfCBTX0lGRElSOwotICAgICAgYnVmLT5zdF9zaXplID0gZHBiLT5pb0RyTm1GbHM7Ci0gICAgICBidWYtPnN0X3JzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X21vZGUgfD0gU19JRlJFRzsKLSAgICAgIC8qIE1hcmsgYXBwcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBpZiAoZnBiLT5pb0ZsRm5kckluZm8uZmRUeXBlID09ICdBUFBMJykKLQlidWYtPnN0X21vZGUgfD0gMDExMTsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNpemVzIG9mIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzLiAqLwotICAgICAgYnVmLT5zdF9zaXplID0gZnBiLT5pb0ZsTGdMZW47Ci0gICAgICBidWYtPnN0X3JzaXplID0gZnBiLT5pb0ZsUkxnTGVuOwotICAgIH0KLSAgLyogRmlsbCBpbiB2YXJpb3VzIHRpbWVzLiAqLwotICBidWYtPnN0X2F0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIGJ1Zi0+c3RfbXRpbWUgPSBmcGItPmlvRmxNZERhdDsKLSAgYnVmLT5zdF9jdGltZSA9IGZwYi0+aW9GbENyRGF0OwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGlub2RlIG51bWJlci4gKi8KLSAgYnVmLT5zdF9pbm8gPSAodW5zaWduZWQgc2hvcnQpIGZwYi0+aW9EaXJJRDsKLSAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBkZXZpY2UuICovCi0gIEdldFZSZWZOdW0gKGJ1Zi0+c3RfaW5vLCAmYnVmLT5zdF9kZXYpOwotICBidWYtPnN0X3VpZCA9IF9fdWlkOwotICBidWYtPnN0X2dpZCA9IF9fZ2lkOwotLyogIGJ1Zi0+c3RfRmxGbmRySW5mbyA9IGZwYi0+aW9GbEZuZHJJbmZvOyAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXQoKSBzZXRzIHVwIGFuIGVtcHR5IGRpcmlkLiAqLwotCi1pbnQKLXN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHBhdGgsIHRtcG5hbWUpOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIHN0YXQgKCVzLCAleCkiLCB0bXBuYW1lLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBfc3RhdCAodG1wbmFtZSwgMEwsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIEZDQlBCUmVjIGZjYjsKLSAgRklMRSAqZnA7Ci0gIFN0cjI1NSBwYXRobmFtZTsKLSAgbG9uZyBkaXJpZCA9IDBMLCB0ZW1wOwotICBsb25nIHJzbHQsIGVycm51bTsKLSAgc2hvcnQgZXJyOwotCi0gIGlmIChEZWJ1Z1BJIDwgMCkKLSAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyBmc3RhdCAoJWQsICV4KSIsIGZkLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHBhdGhuYW1lWzBdID0gMDsKLSNpZmRlZiBGSU9GTkFNRQotICAvKiBVc2UgYW4gTVBXLXNwZWNpZmljIGlvY3RsIHRvIGdldCB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotICBpb2N0bCAoZmQsIEZJT0ZOQU1FLCAobG9uZyAqKSBwYXRobmFtZSk7IAotI2Vsc2UKLSAgeW91IGxvc2UKLSNlbmRpZgotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG5hbWUgaXMgJXMpIiwgcGF0aG5hbWUpOwotICBkaXJpZCA9IDBMIC8qIGZjYi5pb0ZDQlBhcklEICovIDsKLSAgcnNsdCA9IF9zdGF0ICgoY2hhciAqKSBwYXRobmFtZSwgZGlyaWQsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0jZW5kaWYgLyogbiBVU0VfTVdfSEVBREVSUyAqLwotCi1jaGRpciAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWNoYXIgKgotZ2V0Y3dkIChjaGFyICpidWYsIGludCBzaXplKQotewotICBpZiAoYnVmID09IE5VTEwpCi0gICAgYnVmID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLSAgc3RyY3B5KGJ1ZiwgIjoiKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbW9yZSBlbGFib3JhdGUgZm9yIE1QVy4gKi8KLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgcmV0dXJuICI6IjsKLX0KLQotaW50Ci1tcHdfb3BlbiAoY2hhciAqZmlsZW5hbWUsIGludCBhcmcyLCBpbnQgYXJnMykKLXsKLSN1bmRlZiBvcGVuCi0gIGludCBmZCwgZXJybnVtID0gMDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7Ci0gIGZkID0gb3BlbiAodG1wbmFtZSwgYXJnMik7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgb3BlbiAoJXMsICVkLCAlZCkiLCB0bXBuYW1lLCBhcmcyLCBhcmczKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIGZkKTsKLSAgICAgIGlmIChmZCA9PSAtMSkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKGZkID09IC0xKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZmQ7Ci19Ci0KLWludAotbXB3X2FjY2VzcyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGludCBjbWQpCi17Ci0jdW5kZWYgYWNjZXNzCi0KLSAgaW50IHJzbHQsIGVycm51bSA9IDA7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgaWYgKGNtZCAmIFJfT0sgfHwgY21kICYgWF9PSykKLSAgICB7Ci0gICAgICByc2x0ID0gc3RhdCAodG1wbmFtZSwgJnN0KTsKLSAgICAgIGVycm51bSA9IGVycm5vOwotICAgICAgaWYgKHJzbHQgPj0gMCkKLQl7Ci0JICBpZiAoKCgoc3Quc3RfbW9kZSAmIDAwNCkgPT0gMCkgJiYgKGNtZCAmIFJfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDIpID09IDApICYmIChjbWQgJiBXX09LKSkKLQkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAxKSA9PSAwKSAmJiAoY21kICYgWF9PSykpKQotCSAgICB7Ci0JICAgICAgcnNsdCA9IC0xOwotCSAgICAgIGVycm51bSA9IEVBQ0NFUzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgbXB3X2FjY2VzcyAoJXMsICVkKSIsIHRtcG5hbWUsIGNtZCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0vKiBUaGUgTVBXIGxpYnJhcnkgY3JlYXQoKSBoYXMgbm8gbW9kZSBhcmd1bWVudC4gKi8KLQotaW50Ci1tcHdfY3JlYXQgKGNoYXIgKnBhdGgsIC8qIG1vZGVfdCAqLyBpbnQgbW9kZSkKLXsKLSN1bmRlZiBjcmVhdAotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLSAgcmV0dXJuIGNyZWF0IChwYXRoLCBtb2RlKTsKLSNlbHNlCi0gIHJldHVybiBjcmVhdCAocGF0aCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGNvbnRyb2wgaW4gYW4gTVBXIHRvb2wgYmVmb3JlIGl0IGNyYXNoZXMgdGhlCi0gICBtYWNoaW5lLiAgKi8KLQotbXB3X3NwZWNpYWxfaW5pdCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cnN0ciAobmFtZSwgIkRFQlVHIikpCi0gICAgRGVidWdTdHIoIlxwYXQgYmVnaW5uaW5nIG9mIHByb2dyYW0iKTsKLX0KLQotc3RhdGljIGludCBjdXJyZW50X3VtYXNrOwotCi1pbnQKLXVtYXNrKGludCBtYXNrKQotewotICBpbnQgb2xkbWFzayA9IGN1cnJlbnRfdW1hc2s7Ci0KLSAgY3VycmVudF91bWFzayA9IG1hc2s7Ci0gIHJldHVybiBvbGRtYXNrOwotfQotCi0vKiBDdXJzb3Itc3Bpbm5pbmcgc3R1ZmYgdGhhdCBpbmNsdWRlcyBtZXRlcmluZyBvZiBzcGluIHJhdGUgYW5kIGRlbGF5cy4gICovCi0KLS8qIE5vbnplcm8gd2hlbiBjdXJzb3Igc3Bpbm5pbmcgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiAgKi8KLQotaW50IGN1cnNvcl9pbml0ZWQ7Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIGV4Y2Vzc2l2ZSBkZWxheXMgcmVwb3J0ZWQuICAqLwotCi1pbnQgbWVhc3VyZV9zcGluOwotCi0vKiBOb256ZXJvIGlmIHNwaW4gaGlzdG9ncmFtIGFuZCByYXRlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLQotaW50IGR1bXBfc3Bpbl9kYXRhOwotCi1sb25nIHdhcm5pbmdfdGhyZXNob2xkID0gNDAwMDAwOwotCi1sb25nIGJ1Y2tldF9zaXplID0gMTAyNDsKLQotbG9uZyBidWNrZXRfcG93ZXIgPSAxMDsKLQotbG9uZyBudW1idWNrZXRzID0gMzAwOwotCi1pbnQgKmRlbGF5X2NvdW50czsKLQotaW50IG92ZXJmbG93X2NvdW50OwotCi1jaGFyICpjdXJyZW50X3Byb2dyZXNzOwotCi1zdGF0aWMgVW5zaWduZWRXaWRlIGxhc3RfbWljcm9zZWNvbmRzOwotCi1zdGF0aWMgY2hhciAqbGFzdF9zcGluX2ZpbGUgPSAiIjsKLQotc3RhdGljIGludCBsYXN0X3NwaW5fbGluZTsKLQotdm9pZAotd2Fybl9pZl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBkaWZmLCBpeDsKLSAgVW5zaWduZWRXaWRlIG5vdzsKLQotICBNaWNyb3NlY29uZHMoJm5vdyk7Ci0KLSAgZGlmZiA9IG5vdy5sbyAtIGxhc3RfbWljcm9zZWNvbmRzLmxvOwotCi0gIGlmIChkaWZmID4gd2FybmluZ190aHJlc2hvbGQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogJWxkLiUwNmxkIHNlYyBkZWxheSBnZXR0aW5nIGZyb20gJXM6JWQgdG8gJXM6JWRcbiIsCi0JICAgICAoY3VycmVudF9wcm9ncmVzcyA/IGN1cnJlbnRfcHJvZ3Jlc3MgOiAiIiksCi0JICAgICBkaWZmIC8gMTAwMDAwMCwgZGlmZiAlIDEwMDAwMDAsCi0JICAgICBsYXN0X3NwaW5fZmlsZSwgbGFzdF9zcGluX2xpbmUsIGZpbGUsIGxpbmUpOwotICBpZiAoZHVtcF9zcGluX2RhdGEpCi0gICAgewotICAgICAgaWYgKGRpZmYgPj0gMCkKLQl7Ci0JICBpeCA9IGRpZmYgPj4gYnVja2V0X3Bvd2VyOwotCSAgaWYgKGl4ID49IDAgJiYgaXggPCBudW1idWNrZXRzICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotCSAgICArK2RlbGF5X2NvdW50c1tpeF07Ci0JICBlbHNlCi0JICAgICsrb3ZlcmZsb3dfY291bnQ7Ci0JfQotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgInJhdyBkaWZmIGlzICVsZCAoPylcbiIsIGRpZmYpOwotICAgIH0KLX0KLQotdm9pZAotcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgTWljcm9zZWNvbmRzICgmbGFzdF9taWNyb3NlY29uZHMpOwotICBsYXN0X3NwaW5fZmlsZSA9IGZpbGU7Ci0gIGxhc3Rfc3Bpbl9saW5lID0gbGluZTsKLX0KLQotdm9pZAotbXB3X3N0YXJ0X3Byb2dyZXNzIChjaGFyICpzdHIsIGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm1lYXN1cmUsICp0aHJlc2hvbGQ7Ci0KLSAgaWYgKCFjdXJzb3JfaW5pdGVkKQotICAgIHsKLSAgICAgIEluaXRDdXJzb3JDdGwgKG5pbCk7Ci0gICAgICBjdXJzb3JfaW5pdGVkID0gMTsKLSAgICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0gICAgICBtZWFzdXJlID0gZ2V0ZW52ICgiTUVBU1VSRV9TUElOIik7Ci0gICAgICBpZiAobWVhc3VyZSAhPSBOVUxMICYmIG1lYXN1cmVbMF0gIT0gJ1wwJykKLQl7Ci0JICBtZWFzdXJlX3NwaW4gPSAxOwotCSAgaWYgKHN0cmNtcCAobWVhc3VyZSwgImFsbCIpID09IDApCi0JICAgIGR1bXBfc3Bpbl9kYXRhID0gMTsKLQl9Ci0gICAgICB0aHJlc2hvbGQgPSBnZXRlbnYgKCJTUElOX1dBUk5fVEhSRVNIT0xEIik7Ci0gICAgICBpZiAodGhyZXNob2xkICE9IE5VTEwgJiYgdGhyZXNob2xkWzBdICE9ICdcMCcpCi0Jd2FybmluZ190aHJlc2hvbGQgPSBhdG9sICh0aHJlc2hvbGQpOwotICAgICAgaWYgKGR1bXBfc3Bpbl9kYXRhKQotCXsKLQkgIGlmIChkZWxheV9jb3VudHMgPT0gTlVMTCkKLQkgICAgZGVsYXlfY291bnRzID0gKGludCAqKSBtYWxsb2MgKG51bWJ1Y2tldHMgKiBzaXplb2YgKGludCkpOwotCSAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQkgICAgZGVsYXlfY291bnRzW2ldID0gMDsKLQkgIG92ZXJmbG93X2NvdW50ID0gMDsKLQl9Ci0gICAgfQotICBjdXJyZW50X3Byb2dyZXNzID0gc3RyOwotCi0gIHN5c19uZXJyID0gZXJybm9fbWF4ICgpOwotCi0gIG1wd19zcGVjaWFsX2luaXQgKHN0cik7Ci19Ci0KLXZvaWQKLW1wd19wcm9ncmVzcyAoaW50IG4pCi17Ci0gIFNwaW5DdXJzb3IgKDMyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgU3BpbkN1cnNvciAoMzIpOwotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci19Ci0KLXZvaWQKLW1wd19lbmRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGxvbmcgaSwgZGVsYXksIGNvdW50ID0gMCwgc3VtID0gMCwgYXZnZGVsYXksIHNwaW5yYXRlOwotICBsb25nIGN1cnBvd2VyID0gMCwgY3VyZ3JvdXAgPSAwOwotCi0gIC8qIFdhcm4gaWYgaXQncyBiZWVuIGEgd2hpbGUgc2luY2UgdGhlIGxhc3Qgc3Bpbi4gICovCi0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgbm9uemVybyBkZWxheSBjb3VudHMgYW5kIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGRlbGF5LiAgKi8KLSAgaWYgKGR1bXBfc3Bpbl9kYXRhICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCi0JewotCSAgZGVsYXkgPSAoaSArIDEpICogYnVja2V0X3NpemU7Ci0JICBzdW0gKz0gZGVsYXlfY291bnRzW2ldICogKGkgKyAxKTsKLQkgIGNvdW50ICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgIGlmIChkZWxheSA8PSAoMSA8PCBjdXJwb3dlcikpCi0JICAgIHsKLQkgICAgICBjdXJncm91cCArPSBkZWxheV9jb3VudHNbaV07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjdXJncm91cCA+IDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSAiIyAlczogJWQgZGVsYXlzIGJldHdlZW4gJWxkLiUwNmxkIGFuZCAlbGQuJTA2bGQgc2VjXG4iLAotCQkJIChzdHIgPyBzdHIgOiAiIiksCi0JCQkgY3VyZ3JvdXAsCi0JCQkgKDEgPDwgY3VycG93ZXIpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgJSAxMDAwMDAwLAotCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAvIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpICUgMTAwMDAwMCk7Ci0JICAgICAgKytjdXJwb3dlcjsKLQkgICAgICBjdXJncm91cCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIGF2Z2RlbGF5ID0gKHN1bSAqIGJ1Y2tldF9zaXplKSAvIGNvdW50OwotCSAgc3BpbnJhdGUgPSAxMDAwMDAwIC8gYXZnZGVsYXk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiBBdmVyYWdlIHNwaW4gcmF0ZSBpcyAlZCB0aW1lcy9zZWNcbiIsCi0JCSAgIChzdHIgPyBzdHIgOiAiIiksIHNwaW5yYXRlKTsKLQl9Ci0gICAgfQotfQotCi0jaWZkZWYgUFJPR1JFU1NfVEVTVAotCi0vKiBUZXN0IHByb2dyYW0uICAqLwotCi1tYWluICgpCi17Ci0gIGludCBpLCBqOwotICBkb3VibGUgeCA9IDEuMCwgeSA9IDIuNDsKLSAgbG9uZyBzdGFydCA9IE1pY3Jvc2Vjb25kcyAoKSwgdG07ICBGSVhNRQotCi0gIFNUQVJUX1BST0dSRVNTICgiaGkiLCAwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IChpICogMTAwKTsgKytqKQotCXsKLQkgIHggKz0gKHggKiB5KSAvIGo7Ci0JfQotICAgIH0KLSAgCi0gIEVORF9QUk9HUkVTUyAoImhpIik7Ci0gIAotICB0bSA9IE1pY3Jvc2Vjb25kcyAoKSAtIHN0YXJ0OwotCi0gIHByaW50ZiAoIlRvdGFsIHRpbWUgaXMgJWQuJWQgc2Vjc1xuIiwgdG0gLyAxMDAwMDAwLCB0bSAlIDEwMDAwMDApOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9NV19IRUFERVJTCi0vKiBFbXB0eSBkZWZpbml0aW9ucyBmb3IgTWV0cm93ZXJrcycgU0lPVVggY29uc29sZSBsaWJyYXJ5LiAqLwotCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jaW5jbHVkZSA8Y29uc29sZS5oPgotI2VuZGlmCi0KLXNob3J0Ci1JbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKLXsKLSNwcmFnbWEgdW51c2VkIChmZCkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotUmVtb3ZlQ29uc29sZSh2b2lkKQotewotfQotCi1sb25nCi1Xcml0ZUNoYXJzVG9Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotbG9uZyBSZWFkQ2hhcnNGcm9tQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKLXsKLSNwcmFnbWEgdW51c2VkIChidWYsIG4pCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBjaGFyICoKLV9fdHR5bmFtZShsb25nIGZkKQotewotCXN0YXRpYyBjaGFyICpfX2RldmljZW5hbWUgPSAibnVsbCBkZXZpY2UiOwotCi0JaWYgKGZkID49IDAgJiYgZmQgPD0gMikKLQkgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXNkb3MuYyBiL2xpYmliZXJ0eS9tc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNjRkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotY2hhciBtc2dbXSA9ICJObyB2Zm9yayBhdmFpbGFibGUgLSBhYm9ydGluZ1xuIjsKLXZmb3JrKCkKLXsKLSAgd3JpdGUoMSwgbXNnLCBzaXplb2YobXNnKSk7Ci19Ci0KLXNpZ3NldG1hc2soKQotewotICAvKiBubyBzaWduYWxzIHN1cHBvcnQgaW4gZ28zMiAoeWV0KSAqLwotfQotCi13YWl0cGlkKCkKLXsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29iamFsbG9jLmMgYi9saWJpYmVydHkvb2JqYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OTU2OS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JqYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKiBvYmphbGxvYy5jIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIE5VTEwuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotZXh0ZXJuIFBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBmcmVlIFBBUkFNUyAoKFBUUikpOwotI2VuZGlmCi0KLSNlbmRpZgotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gb2JqZWN0LiAgRnJlZWluZyBhbGxvY2F0ZWQKLSAgIHNwYWNlIG1heSBvciBtYXkgbm90IGZyZWUgYWxsIG1vcmUgcmVjZW50bHkgYWxsb2NhdGVkIHNwYWNlLgotCi0gICBXZSBoYW5kbGUgbGFyZ2UgYW5kIHNtYWxsIGFsbG9jYXRpb24gcmVxdWVzdHMgZGlmZmVyZW50bHkuICBJZiB3ZQotICAgZG9uJ3QgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGFuZCB0aGUgYWxsb2NhdGlvbgotICAgcmVxdWVzdCBpcyBmb3IgbW9yZSB0aGFuIDUxMiBieXRlcywgd2Ugc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCB0bwotICAgbWFsbG9jLiAgKi8KLQotLyogVGhlIG9iamFsbG9jIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIG9iamFsbG9jLmguICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNodW5rLiAgKi8KLQotc3RydWN0IG9iamFsbG9jX2NodW5rCi17Ci0gIC8qIE5leHQgY2h1bmsuICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0gIC8qIElmIHRoaXMgY2h1bmsgY29udGFpbnMgbGFyZ2Ugb2JqZWN0cywgdGhpcyBpcyB0aGUgdmFsdWUgb2YKLSAgICAgY3VycmVudF9wdHIgd2hlbiB0aGlzIGNodW5rIHdhcyBhbGxvY2F0ZWQuICBJZiB0aGlzIGNodW5rCi0gICAgIGNvbnRhaW5zIHNtYWxsIG9iamVjdHMsIHRoaXMgaXMgTlVMTC4gICovCi0gIGNoYXIgKmN1cnJlbnRfcHRyOwotfTsKLQotLyogVGhlIGFsaWduZWQgc2l6ZSBvZiBvYmphbGxvY19jaHVuay4gICovCi0KLSNkZWZpbmUgQ0hVTktfSEVBREVSX1NJWkUJCQkJCVwKLSAgKChzaXplb2YgKHN0cnVjdCBvYmphbGxvY19jaHVuaykgKyBPQkpBTExPQ19BTElHTiAtIDEpCVwKLSAgICZ+IChPQkpBTExPQ19BTElHTiAtIDEpKQotCi0vKiBXZSBhc2sgZm9yIHRoaXMgbXVjaCBtZW1vcnkgZWFjaCB0aW1lIHdlIGNyZWF0ZSBhIGNodW5rIHdoaWNoIGlzIHRvCi0gICBob2xkIHNtYWxsIG9iamVjdHMuICAqLwotCi0jZGVmaW5lIENIVU5LX1NJWkUgKDQwOTYgLSAzMikKLQotLyogQSByZXF1ZXN0IGZvciB0aGlzIGFtb3VudCBvciBtb3JlIGlzIGp1c3QgcGFzc2VkIHRocm91Z2ggdG8gbWFsbG9jLiAgKi8KLQotI2RlZmluZSBCSUdfUkVRVUVTVCAoNTEyKQotCi0vKiBDcmVhdGUgYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG9iamFsbG9jICoKLW9iamFsbG9jX2NyZWF0ZSAoKQotewotICBzdHJ1Y3Qgb2JqYWxsb2MgKnJldDsKLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICByZXQgPSAoc3RydWN0IG9iamFsbG9jICopIG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0LT5jaHVua3MgPSAoUFRSKSBtYWxsb2MgKENIVU5LX1NJWkUpOwotICBpZiAocmV0LT5jaHVua3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQtPmNodW5rczsKLSAgY2h1bmstPm5leHQgPSBOVUxMOwotICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gIHJldC0+Y3VycmVudF9wdHIgPSAoY2hhciAqKSBjaHVuayArIENIVU5LX0hFQURFUl9TSVpFOwotICByZXQtPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi1QVFIKLV9vYmphbGxvY19hbGxvYyAobywgbGVuKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICAvKiBXZSBhdm9pZCBjb25mdXNpb24gZnJvbSB6ZXJvIHNpemVkIG9iamVjdHMgYnkgYWx3YXlzIGFsbG9jYXRpbmcKLSAgICAgYXQgbGVhc3QgMSBieXRlLiAgKi8KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE7Ci0KLSAgbGVuID0gKGxlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7Ci0KLSAgaWYgKGxlbiA8PSBvLT5jdXJyZW50X3NwYWNlKQotICAgIHsKLSAgICAgIG8tPmN1cnJlbnRfcHRyICs9IGxlbjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgLT0gbGVuOwotICAgICAgcmV0dXJuIChQVFIpIChvLT5jdXJyZW50X3B0ciAtIGxlbik7Ci0gICAgfQotCi0gIGlmIChsZW4gPj0gQklHX1JFUVVFU1QpCi0gICAgewotICAgICAgY2hhciAqcmV0OwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgcmV0ID0gKGNoYXIgKikgbWFsbG9jIChDSFVOS19IRUFERVJfU0laRSArIGxlbik7Ci0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQ7Ci0gICAgICBjaHVuay0+bmV4dCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgY2h1bmstPmN1cnJlbnRfcHRyID0gby0+Y3VycmVudF9wdHI7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gKFBUUikgKHJldCArIENIVU5LX0hFQURFUl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgICAgIGlmIChjaHVuayA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IE5VTEw7Ci0KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gb2JqYWxsb2NfYWxsb2MgKG8sIGxlbik7Ci0gICAgfQotfQotCi0vKiBGcmVlIGFuIGVudGlyZSBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlIChvKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbDsKLQotICBsID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gIHdoaWxlIChsICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0gICAgICBuZXh0ID0gbC0+bmV4dDsKLSAgICAgIGZyZWUgKGwpOwotICAgICAgbCA9IG5leHQ7Ci0gICAgfQotCi0gIGZyZWUgKG8pOwotfQotCi0vKiBGcmVlIGEgYmxvY2sgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBUaGlzIGFsc28gZnJlZXMgYWxsIG1vcmUKLSAgIHJlY2VudGx5IGFsbG9jYXRlZCBibG9ja3MuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlX2Jsb2NrIChvLCBibG9jaykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICBQVFIgYmxvY2s7Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcCwgKnNtYWxsOwotICBjaGFyICpiID0gKGNoYXIgKikgYmxvY2s7Ci0KLSAgLyogRmlyc3Qgc2V0IFAgdG8gdGhlIGNodW5rIHdoaWNoIGNvbnRhaW5zIHRoZSBibG9jayB3ZSBhcmUgZnJlZWluZywKLSAgICAgYW5kIHNldCBRIHRvIHRoZSBsYXN0IHNtYWxsIG9iamVjdCBjaHVuayB3ZSBzZWUgYmVmb3JlIFAuICAqLwotICBzbWFsbCA9IE5VTEw7Ci0gIGZvciAocCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChwLT5jdXJyZW50X3B0ciA9PSBOVUxMKQotCXsKLQkgIGlmIChiID4gKGNoYXIgKikgcCAmJiBiIDwgKGNoYXIgKikgcCArIENIVU5LX1NJWkUpCi0JICAgIGJyZWFrOwotCSAgc21hbGwgPSBwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYiA9PSAoY2hhciAqKSBwICsgQ0hVTktfSEVBREVSX1NJWkUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgY2h1bmssIHRoZSBjYWxsZXIgaGFzIG1hZGUgYSBtaXN0YWtlLiAgKi8KLSAgaWYgKHAgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmZpcnN0OwotCi0gICAgICAvKiBUaGUgYmxvY2sgaXMgaW4gYSBjaHVuayBjb250YWluaW5nIHNtYWxsIG9iamVjdHMuICBXZSBjYW4KLQkgZnJlZSBldmVyeSBjaHVuayB0aHJvdWdoIFNNQUxMLCBiZWNhdXNlIHRoZXkgaGF2ZSBjZXJ0YWlubHkKLQkgYmVlbiBhbGxvY2F0ZWQgbW9yZSByZWNlbnRseS4gIEFmdGVyIFNNQUxMLCB3ZSB3aWxsIG5vdCBzZWUKLQkgYW55IGNodW5rcyBjb250YWluaW5nIHNtYWxsIG9iamVjdHM7IHdlIGNhbiBmcmVlIGFueSBiaWcKLQkgY2h1bmsgaWYgdGhlIGN1cnJlbnRfcHRyIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBCLiAgV2UKLQkgY2FuIHRoZW4gcmVzZXQgdGhlIG5ldyBjdXJyZW50X3B0ciB0byBCLiAgKi8KLQotICAgICAgZmlyc3QgPSBOVUxMOwotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgaWYgKHNtYWxsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc21hbGwgPT0gcSkKLQkJc21hbGwgPSBOVUxMOwotCSAgICAgIGZyZWUgKHEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChxLT5jdXJyZW50X3B0ciA+IGIpCi0JICAgIGZyZWUgKHEpOwotCSAgZWxzZSBpZiAoZmlyc3QgPT0gTlVMTCkKLQkgICAgZmlyc3QgPSBxOwotCi0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIGlmIChmaXJzdCA9PSBOVUxMKQotCWZpcnN0ID0gcDsKLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGZpcnN0OwotCi0gICAgICAvKiBOb3cgc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoaXMgc21hbGwgYmxvY2sgYWdhaW4uICAqLwotICAgICAgby0+Y3VycmVudF9wdHIgPSBiOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcTsKLSAgICAgIGNoYXIgKmN1cnJlbnRfcHRyOwotCi0gICAgICAvKiBUaGlzIGJsb2NrIGlzIGluIGEgbGFyZ2UgY2h1bmsgYnkgaXRzZWxmLiAgV2UgY2FuIGZyZWUKLSAgICAgICAgIGV2ZXJ5dGhpbmcgb24gdGhlIGxpc3QgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGJsb2NrLiAgV2UKLSAgICAgICAgIHRoZW4gc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoZSBuZXh0IGNodW5rIGNvbnRhaW5pbmcgc21hbGwKLSAgICAgICAgIG9iamVjdHMsIHNldHRpbmcgY3VycmVudF9wdHIgZnJvbSB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlCi0gICAgICAgICBsYXJnZSBjaHVuayB3ZSBhcmUgZnJlZWluZy4gICovCi0KLSAgICAgIGN1cnJlbnRfcHRyID0gcC0+Y3VycmVudF9wdHI7Ci0gICAgICBwID0gcC0+bmV4dDsKLQotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgZnJlZSAocSk7Ci0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIHA7Ci0KLSAgICAgIHdoaWxlIChwLT5jdXJyZW50X3B0ciAhPSBOVUxMKQotCXAgPSBwLT5uZXh0OwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IGN1cnJlbnRfcHRyOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBjdXJyZW50X3B0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JzdGFjay5jIGIvbGliaWJlcnR5L29ic3RhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMThiMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JzdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIG9ic3RhY2suYyAtIHN1YnJvdXRpbmVzIHVzZWQgaW1wbGljaXRseSBieSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBOT1RFIEJFRk9SRSBNT0RJRllJTkcgVEhJUyBGSUxFOiBUaGlzIHZlcnNpb24gbnVtYmVyIG11c3QgYmUKLSAgIGluY3JlbWVudGVkIHdoZW5ldmVyIGNhbGxlcnMgY29tcGlsZWQgdXNpbmcgYW4gb2xkIG9ic3RhY2suaCBjYW4gbm8KLSAgIGxvbmdlciBwcm9wZXJseSBjYWxsIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBvYnN0YWNrLmMuICAqLwotI2RlZmluZSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OIDEKLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCBhbmQgdGhlIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICBzdXBwb3J0cyB0aGUgc2FtZSBsaWJyYXJ5IGludGVyZmFjZSB3ZSBkby4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUKLSAgIEMgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QKLSAgIGZpbGVzLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogUmFuZG9tIHRoaW5nIHRvIGdldCBfX0dOVV9MSUJSQVJZX18uICAqLwotI2lmICFkZWZpbmVkIChfTElCQykgJiYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCi0jaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jaWYgX0dOVV9PQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OID09IE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04KLSNkZWZpbmUgRUxJREVfQ09ERQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jZGVmaW5lIFBPSU5URVIgdm9pZCAqCi0jZWxzZQotI2RlZmluZSBQT0lOVEVSIGNoYXIgKgotI2VuZGlmCi0KLS8qIERldGVybWluZSBkZWZhdWx0IGFsaWdubWVudC4gICovCi1zdHJ1Y3QgZm9vYWxpZ24ge2NoYXIgeDsgZG91YmxlIGQ7fTsKLSNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgIFwKLSAgKChQVFJfSU5UX1RZUEUpICgoY2hhciAqKSAmKChzdHJ1Y3QgZm9vYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKLS8qIElmIG1hbGxvYyB3ZXJlIHJlYWxseSBzbWFydCwgaXQgd291bGQgcm91bmQgYWRkcmVzc2VzIHRvIERFRkFVTFRfQUxJR05NRU5ULgotICAgQnV0IGluIGZhY3QgaXQgbWlnaHQgYmUgbGVzcyBzbWFydCBhbmQgcm91bmQgYWRkcmVzc2VzIHRvIGFzIG11Y2ggYXMKLSAgIERFRkFVTFRfUk9VTkRJTkcuICBTbyB3ZSBwcmVwYXJlIGZvciBpdCB0byBkbyB0aGF0LiAgKi8KLXVuaW9uIGZvb3JvdW5kIHtsb25nIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfUk9VTkRJTkcgKHNpemVvZiAodW5pb24gZm9vcm91bmQpKQotCi0vKiBXaGVuIHdlIGNvcHkgYSBsb25nIGJsb2NrIG9mIGRhdGEsIHRoaXMgaXMgdGhlIHVuaXQgdG8gZG8gaXQgd2l0aC4KLSAgIE9uIHNvbWUgbWFjaGluZXMsIGNvcHlpbmcgc3VjY2Vzc2l2ZSBpbnRzIGRvZXMgbm90IHdvcms7Ci0gICBpbiBzdWNoIGEgY2FzZSwgcmVkZWZpbmUgQ09QWUlOR19VTklUIHRvIGBsb25nJyAoaWYgdGhhdCB3b3JrcykKLSAgIG9yIGBjaGFyJyBhcyBhIGxhc3QgcmVzb3J0LiAgKi8KLSNpZm5kZWYgQ09QWUlOR19VTklUCi0jZGVmaW5lIENPUFlJTkdfVU5JVCBpbnQKLSNlbmRpZgotCi0KLS8qIFRoZSBmdW5jdGlvbnMgYWxsb2NhdGluZyBtb3JlIHJvb20gYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19hbGxvYycKLSAgIGp1bXAgdG8gdGhlIGhhbmRsZXIgcG9pbnRlZCB0byBieSBgb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcicuCi0gICBUaGlzIHZhcmlhYmxlIGJ5IGRlZmF1bHQgcG9pbnRzIHRvIHRoZSBpbnRlcm5hbCBmdW5jdGlvbgotICAgYHByaW50X2FuZF9hYm9ydCcuICAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICh2b2lkKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAodm9pZCkgPSBwcmludF9hbmRfYWJvcnQ7Ci0jZWxzZQotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICgpOwotdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpID0gcHJpbnRfYW5kX2Fib3J0OwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotI2lmIGRlZmluZWQgX19HTlVfTElCUkFSWV9fIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi1pbnQgb2JzdGFja19leGl0X2ZhaWx1cmUgPSBFWElUX0ZBSUxVUkU7Ci0KLS8qIFRoZSBub24tR05VLUMgbWFjcm9zIGNvcHkgdGhlIG9ic3RhY2sgaW50byB0aGlzIGdsb2JhbCB2YXJpYWJsZQotICAgdG8gYXZvaWQgbXVsdGlwbGUgZXZhbHVhdGlvbi4gICovCi0KLXN0cnVjdCBvYnN0YWNrICpfb2JzdGFjazsKLQotLyogRGVmaW5lIGEgbWFjcm8gdGhhdCBlaXRoZXIgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIHRyYWRpdGlvbmFsIG1hbGxvYy9mcmVlCi0gICBjYWxsaW5nIGludGVyZmFjZSwgb3IgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIG1tYWxsb2MvbWZyZWUgaW50ZXJmYWNlCi0gICAodGhhdCBhZGRzIGFuIGV4dHJhIGZpcnN0IGFyZ3VtZW50KSwgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHVzZV9leHRyYV9hcmcuCi0gICBGb3IgZnJlZSwgZG8gbm90IHVzZSA/Oiwgc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgdGhlIE1JUFMgY29tcGlsZXJzLAotICAgZG8gbm90IGFsbG93IChleHByKSA/IHZvaWQgOiB2b2lkLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBDQUxMX0NIVU5LRlVOKGgsIHNpemUpIFwKLSAgKCgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgPyAoKihoKS0+Y2h1bmtmdW4pICgoaCktPmV4dHJhX2FyZywgKHNpemUpKSBcCi0gICA6ICgqKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopIChsb25nKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKHZvaWQgKikpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAoKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKCkpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLQwKLS8qIEluaXRpYWxpemUgYW4gb2JzdGFjayBIIGZvciB1c2UuICBTcGVjaWZ5IGNodW5rIHNpemUgU0laRSAoMCBtZWFucyBkZWZhdWx0KS4KLSAgIE9iamVjdHMgc3RhcnQgb24gbXVsdGlwbGVzIG9mIEFMSUdOTUVOVCAoMCBtZWFucyB1c2UgZGVmYXVsdCkuCi0gICBDSFVOS0ZVTiBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGFsbG9jYXRlIGNodW5rcywKLSAgIGFuZCBGUkVFRlVOIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZW0uCi0KLSAgIFJldHVybiBub256ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gaWYgb3V0IG9mIG1lbW9yeS4KLSAgIFRvIHJlY292ZXIgZnJvbSBhbiBvdXQgb2YgbWVtb3J5IGVycm9yLAotICAgZnJlZSB1cCBzb21lIG1lbW9yeSwgdGhlbiBjYWxsIHRoaXMgYWdhaW4uICAqLwotCi1pbnQKLV9vYnN0YWNrX2JlZ2luIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpjaHVuazsgLyogcG9pbnRzIHRvIG5ldyBjaHVuayAqLwotCi0gIGlmIChhbGlnbm1lbnQgPT0gMCkKLSAgICBhbGlnbm1lbnQgPSAoaW50KSBERUZBVUxUX0FMSUdOTUVOVDsKLSAgaWYgKHNpemUgPT0gMCkKLSAgICAvKiBEZWZhdWx0IHNpemUgaXMgd2hhdCBHTlUgbWFsbG9jIGNhbiBmaXQgaW4gYSA0MDk2LWJ5dGUgYmxvY2suICAqLwotICAgIHsKLSAgICAgIC8qIDEyIGlzIHNpemVvZiAobWhlYWQpIGFuZCA0IGlzIEVYVFJBIGZyb20gR05VIG1hbGxvYy4KLQkgVXNlIHRoZSB2YWx1ZXMgZm9yIHJhbmdlIGNoZWNraW5nLCBiZWNhdXNlIGlmIHJhbmdlIGNoZWNraW5nIGlzIG9mZiwKLQkgdGhlIGV4dHJhIGJ5dGVzIHdvbid0IGJlIG1pc3NlZCB0ZXJyaWJseSwgYnV0IGlmIHJhbmdlIGNoZWNraW5nIGlzIG9uCi0JIGFuZCB3ZSB1c2VkIGEgbGFyZ2VyIHJlcXVlc3QsIGEgd2hvbGUgZXh0cmEgNDA5NiBieXRlcyB3b3VsZCBiZQotCSBhbGxvY2F0ZWQuCi0KLQkgVGhlc2UgbnVtYmVyIGFyZSBpcnJlbGV2YW50IHRvIHRoZSBuZXcgR05VIG1hbGxvYy4gIEkgc3VzcGVjdCBpdCBpcwotCSBsZXNzIHNlbnNpdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdC4gICovCi0gICAgICBpbnQgZXh0cmEgPSAoKCgoMTIgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSkKLQkJICAgICsgNCArIERFRkFVTFRfUk9VTkRJTkcgLSAxKQotCQkgICAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKTsKLSAgICAgIHNpemUgPSA0MDk2IC0gZXh0cmE7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosIGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPnVzZV9leHRyYV9hcmcgPSAwOwotCi0gIGNodW5rID0gaC0+Y2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBoIC0+IGNodW5rX3NpemUpOwotICBpZiAoIWNodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPm5leHRfZnJlZSA9IGgtPm9iamVjdF9iYXNlID0gY2h1bmstPmNvbnRlbnRzOwotICBoLT5jaHVua19saW1pdCA9IGNodW5rLT5saW1pdAotICAgID0gKGNoYXIgKikgY2h1bmsgKyBoLT5jaHVua19zaXplOwotICBjaHVuay0+cHJldiA9IDA7Ci0gIC8qIFRoZSBpbml0aWFsIGNodW5rIG5vdyBjb250YWlucyBubyBlbXB0eSBvYmplY3QuICAqLwotICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAwOwotICBoLT5hbGxvY19mYWlsZWQgPSAwOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1fb2JzdGFja19iZWdpbl8xIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGFsaWdubWVudDsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoUE9JTlRFUiwgbG9uZyk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAoUE9JTlRFUiwgUE9JTlRFUik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLSAgICAgUE9JTlRFUiBhcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosbG9uZykpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gKHZvaWQgKCopICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgZnJlZWZ1bjsKLSNlbHNlCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSgpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9IGZyZWVmdW47Ci0jZW5kaWYKLSAgaC0+Y2h1bmtfc2l6ZSA9IHNpemU7Ci0gIGgtPmFsaWdubWVudF9tYXNrID0gYWxpZ25tZW50IC0gMTsKLSAgaC0+ZXh0cmFfYXJnID0gYXJnOwotICBoLT51c2VfZXh0cmFfYXJnID0gMTsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGN1cnJlbnQgY2h1bmsgZm9yIHRoZSBvYnN0YWNrICpICi0gICBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IExFTkdUSCBieXRlcyBuZWVkIHRvIGJlIGFkZGVkCi0gICB0byB0aGUgY3VycmVudCBvYmplY3QsIG9yIGEgbmV3IG9iamVjdCBvZiBsZW5ndGggTEVOR1RIIGFsbG9jYXRlZC4KLSAgIENvcGllcyBhbnkgcGFydGlhbCBvYmplY3QgZnJvbSB0aGUgZW5kIG9mIHRoZSBvbGQgY2h1bmsKLSAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBvbmUuICAqLwotCi12b2lkCi1fb2JzdGFja19uZXdjaHVuayAoaCwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpvbGRfY2h1bmsgPSBoLT5jaHVuazsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpuZXdfY2h1bms7Ci0gIHJlZ2lzdGVyIGxvbmcJbmV3X3NpemU7Ci0gIHJlZ2lzdGVyIGxvbmcgb2JqX3NpemUgPSBoLT5uZXh0X2ZyZWUgLSBoLT5vYmplY3RfYmFzZTsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotICBsb25nIGFscmVhZHk7Ci0KLSAgLyogQ29tcHV0ZSBzaXplIGZvciBuZXcgY2h1bmsuICAqLwotICBuZXdfc2l6ZSA9IChvYmpfc2l6ZSArIGxlbmd0aCkgKyAob2JqX3NpemUgPj4gMykgKyAxMDA7Ci0gIGlmIChuZXdfc2l6ZSA8IGgtPmNodW5rX3NpemUpCi0gICAgbmV3X3NpemUgPSBoLT5jaHVua19zaXplOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBuZXcgY2h1bmsuICAqLwotICBuZXdfY2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBuZXdfc2l6ZSk7Ci0gIGlmICghbmV3X2NodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPmNodW5rID0gbmV3X2NodW5rOwotICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bms7Ci0gIG5ld19jaHVuay0+bGltaXQgPSBoLT5jaHVua19saW1pdCA9IChjaGFyICopIG5ld19jaHVuayArIG5ld19zaXplOwotCi0gIC8qIE1vdmUgdGhlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgbmV3IGNodW5rLgotICAgICBXb3JkIGF0IGEgdGltZSBpcyBmYXN0IGFuZCBpcyBzYWZlIGlmIHRoZSBvYmplY3QKLSAgICAgaXMgc3VmZmljaWVudGx5IGFsaWduZWQuICAqLwotICBpZiAoaC0+YWxpZ25tZW50X21hc2sgKyAxID49IERFRkFVTFRfQUxJR05NRU5UKQotICAgIHsKLSAgICAgIGZvciAoaSA9IG9ial9zaXplIC8gc2l6ZW9mIChDT1BZSU5HX1VOSVQpIC0gMTsKLQkgICBpID49IDA7IGktLSkKLQkoKENPUFlJTkdfVU5JVCAqKW5ld19jaHVuay0+Y29udGVudHMpW2ldCi0JICA9ICgoQ09QWUlOR19VTklUICopaC0+b2JqZWN0X2Jhc2UpW2ldOwotICAgICAgLyogV2UgdXNlZCB0byBjb3B5IHRoZSBvZGQgZmV3IHJlbWFpbmluZyBieXRlcyBhcyBvbmUgZXh0cmEgQ09QWUlOR19VTklULAotCSBidXQgdGhhdCBjYW4gY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5IG9uIGEgbWFjaGluZQotCSB3aGljaCBkb2VzIG5vdCBkbyBzdHJpY3QgYWxpZ25tZW50IGZvciBDT1BZSU5HX1VOSVRTLiAgKi8KLSAgICAgIGFscmVhZHkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAqIHNpemVvZiAoQ09QWUlOR19VTklUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbHJlYWR5ID0gMDsKLSAgLyogQ29weSByZW1haW5pbmcgYnl0ZXMgb25lIGJ5IG9uZS4gICovCi0gIGZvciAoaSA9IGFscmVhZHk7IGkgPCBvYmpfc2l6ZTsgaSsrKQotICAgIG5ld19jaHVuay0+Y29udGVudHNbaV0gPSBoLT5vYmplY3RfYmFzZVtpXTsKLQotICAvKiBJZiB0aGUgb2JqZWN0IGp1c3QgY29waWVkIHdhcyB0aGUgb25seSBkYXRhIGluIE9MRF9DSFVOSywKLSAgICAgZnJlZSB0aGF0IGNodW5rIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2hhaW4uCi0gICAgIEJ1dCBub3QgaWYgdGhhdCBjaHVuayBtaWdodCBjb250YWluIGFuIGVtcHR5IG9iamVjdC4gICovCi0gIGlmIChoLT5vYmplY3RfYmFzZSA9PSBvbGRfY2h1bmstPmNvbnRlbnRzICYmICEgaC0+bWF5YmVfZW1wdHlfb2JqZWN0KQotICAgIHsKLSAgICAgIG5ld19jaHVuay0+cHJldiA9IG9sZF9jaHVuay0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgb2xkX2NodW5rKTsKLSAgICB9Ci0KLSAgaC0+b2JqZWN0X2Jhc2UgPSBuZXdfY2h1bmstPmNvbnRlbnRzOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSArIG9ial9zaXplOwotICAvKiBUaGUgbmV3IGNodW5rIGNlcnRhaW5seSBjb250YWlucyBubyBlbXB0eSBvYmplY3QgeWV0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgb2JqZWN0IE9CSiBoYXMgYmVlbiBhbGxvY2F0ZWQgZnJvbSBvYnN0YWNrIEguCi0gICBUaGlzIGlzIGhlcmUgZm9yIGRlYnVnZ2luZy4KLSAgIElmIHlvdSB1c2UgaXQgaW4gYSBwcm9ncmFtLCB5b3UgYXJlIHByb2JhYmx5IGxvc2luZy4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLS8qIFN1cHByZXNzIC1XbWlzc2luZy1wcm90b3R5cGVzIHdhcm5pbmcuICBXZSBkb24ndCB3YW50IHRvIGRlY2xhcmUgdGhpcyBpbgotICAgb2JzdGFjay5oIGJlY2F1c2UgaXQgaXMganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KLWludCBfb2JzdGFja19hbGxvY2F0ZWRfcCAoc3RydWN0IG9ic3RhY2sgKmgsIFBPSU5URVIgb2JqKTsKLSNlbmRpZgotCi1pbnQKLV9vYnN0YWNrX2FsbG9jYXRlZF9wIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IChoKS0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSByYXRoZXIgdGhhbiA+IHNpbmNlIHRoZSBvYmplY3QgY2Fubm90IGJlIGV4YWN0bHkgYXQKLSAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsgYnV0IG1pZ2h0IGJlIGFuIGVtcHR5IG9iamVjdCBleGFjdGx5Ci0gICAgIGF0IHRoZSBlbmQgb2YgYW4gYWRqYWNlbnQgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgbHAgPSBwbHA7Ci0gICAgfQotICByZXR1cm4gbHAgIT0gMDsKLX0KLQwKLS8qIEZyZWUgb2JqZWN0cyBpbiBvYnN0YWNrIEgsIGluY2x1ZGluZyBPQkogYW5kIGV2ZXJ5dGhpbmcgYWxsb2NhdGUKLSAgIG1vcmUgcmVjZW50bHkgdGhhbiBPQkouICBJZiBPQkogaXMgemVybywgZnJlZSBldmVyeXRoaW5nIGluIEguICAqLwotCi0jdW5kZWYgb2JzdGFja19mcmVlCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBuYW1lcyB3aXRoIGlkZW50aWNhbCBkZWZpbml0aW9ucy4KLSAgIFRoaXMgaXMgdGhlIGZpcnN0IG9uZSwgY2FsbGVkIGZyb20gbm9uLUFOU0kgY29kZS4gICovCi0KLXZvaWQKLV9vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIEFOU0kgY29kZS4gICovCi0KLXZvaWQKLW9ic3RhY2tfZnJlZSAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSBoLT5jaHVuazsKLSAgLyogV2UgdXNlID49IGJlY2F1c2UgdGhlcmUgY2Fubm90IGJlIGFuIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2h1bmsuCi0gICAgIEJ1dCB0aGVyZSBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IGF0IHRoYXQgYWRkcmVzcwotICAgICBhdCB0aGUgZW5kIG9mIGFub3RoZXIgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgQ0FMTF9GUkVFRlVOIChoLCBscCk7Ci0gICAgICBscCA9IHBscDsKLSAgICAgIC8qIElmIHdlIHN3aXRjaCBjaHVua3MsIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGUgbmV3IGN1cnJlbnQKLQkgY2h1bmsgY29udGFpbnMgYW4gZW1wdHkgb2JqZWN0LCBzbyBhc3N1bWUgdGhhdCBpdCBtYXkuICAqLwotICAgICAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMTsKLSAgICB9Ci0gIGlmIChscCkKLSAgICB7Ci0gICAgICBoLT5vYmplY3RfYmFzZSA9IGgtPm5leHRfZnJlZSA9IChjaGFyICopIChvYmopOwotICAgICAgaC0+Y2h1bmtfbGltaXQgPSBscC0+bGltaXQ7Ci0gICAgICBoLT5jaHVuayA9IGxwOwotICAgIH0KLSAgZWxzZSBpZiAob2JqICE9IDApCi0gICAgLyogb2JqIGlzIG5vdCBpbiBhbnkgb2YgdGhlIGNodW5rcyEgKi8KLSAgICBhYm9ydCAoKTsKLX0KLQwKLWludAotX29ic3RhY2tfbWVtb3J5X3VzZWQgKGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsqIGxwOwotICByZWdpc3RlciBpbnQgbmJ5dGVzID0gMDsKLQotICBmb3IgKGxwID0gaC0+Y2h1bms7IGxwICE9IDA7IGxwID0gbHAtPnByZXYpCi0gICAgewotICAgICAgbmJ5dGVzICs9IGxwLT5saW1pdCAtIChjaGFyICopIGxwOwotICAgIH0KLSAgcmV0dXJuIG5ieXRlczsKLX0KLQwKLS8qIERlZmluZSB0aGUgZXJyb3IgaGFuZGxlci4gICovCi0jaWZuZGVmIF8KLSMgaWZkZWYgSEFWRV9MSUJJTlRMX0gKLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgIGlmbmRlZiBfCi0jICAgZGVmaW5lIF8oU3RyKSBnZXR0ZXh0IChTdHIpCi0jICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgXyhTdHIpIChTdHIpCi0jIGVuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXByaW50X2FuZF9hYm9ydCAoKQotewotICBmcHV0cyAoXygibWVtb3J5IGV4aGF1c3RlZFxuIiksIHN0ZGVycik7Ci0gIGV4aXQgKG9ic3RhY2tfZXhpdF9mYWlsdXJlKTsKLX0KLQwKLSNpZiAwCi0vKiBUaGVzZSBhcmUgbm93IHR1cm5lZCBvZmYgYmVjYXVzZSB0aGUgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UgaXQKLSAgIGFuZCBpdCB1c2VzIGJjb3B5IHZpYSBvYnN0YWNrX2dyb3csIHdoaWNoIGNhdXNlcyB0cm91YmxlIG9uIHN5c1YuICAqLwotCi0vKiBOb3cgZGVmaW5lIHRoZSBmdW5jdGlvbmFsIHZlcnNpb25zIG9mIHRoZSBvYnN0YWNrIG1hY3Jvcy4KLSAgIERlZmluZSB0aGVtIHRvIHNpbXBseSB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zIHRvIGRvIHRoZSBqb2IuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBUaGVzZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBkbyBub3Qgd29yayB3aXRoIG5vbi1BTlNJIHByZXByb2Nlc3NvcnM7Ci0gICB0aGV5IHdvbid0IHBhc3MgdGhyb3VnaCB0aGUgbWFjcm8gbmFtZXMgaW4gcGFyZW50aGVzZXMuICAqLwotCi0vKiBUaGUgZnVuY3Rpb24gbmFtZXMgYXBwZWFyIGluIHBhcmVudGhlc2VzIGluIG9yZGVyIHRvIHByZXZlbnQKLSAgIHRoZSBtYWNyby1kZWZpbml0aW9ucyBvZiB0aGUgbmFtZXMgZnJvbSBiZWluZyBleHBhbmRlZCB0aGVyZS4gICovCi0KLVBPSU5URVIgKG9ic3RhY2tfYmFzZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19iYXNlIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19uZXh0X2ZyZWUpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbmV4dF9mcmVlIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX29iamVjdF9zaXplKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX29iamVjdF9zaXplIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX3Jvb20pIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfcm9vbSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19tYWtlX3Jvb20pIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19tYWtlX3Jvb20gKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfZ3JvdykgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93IChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cwKSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2dyb3cwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93KSAob2JzdGFjaywgY2hhcmFjdGVyKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGNoYXJhY3RlcjsKLXsKLSAgb2JzdGFja18xZ3JvdyAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFuaykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmsgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfMWdyb3dfZmFzdCkgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3dfZmFzdCAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFua19mYXN0KSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ibGFua19mYXN0IChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2ZpbmlzaCkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19maW5pc2ggKG9ic3RhY2spOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2FsbG9jKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYWxsb2MgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weSkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19jb3B5MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weTAgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYJLyogIUVMSURFX0NPREUgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9wYXJ0aXRpb24uYyBiL2xpYmliZXJ0eS9wYXJ0aXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmYjEyOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcGFydGl0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogTGlzdCBpbXBsZW50YXRpb24gb2YgYSBwYXJ0aXRpb24gb2YgY29uc2VjdXRpdmUgaW50ZWdlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDb2RlU291cmNlcnksIExMQy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotCi0gICBHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicGFydGl0aW9uLmgiCi0KLS8qIENyZWF0ZXMgYSBwYXJ0aXRpb24gb2YgTlVNX0VMRU1FTlRTIGVsZW1lbnRzLiAgSW5pdGlhbGx5IGVhY2gKLSAgIGVsZW1lbnQgaXMgaW4gYSBjbGFzcyBieSBpdHNlbGYuICAqLwotCi1wYXJ0aXRpb24KLXBhcnRpdGlvbl9uZXcgKG51bV9lbGVtZW50cykKLSAgICAgaW50IG51bV9lbGVtZW50czsKLXsKLSAgaW50IGU7Ci0gIAotICBwYXJ0aXRpb24gcGFydCA9IChwYXJ0aXRpb24pIAotICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHBhcnRpdGlvbl9kZWYpICsgCi0JICAgICAobnVtX2VsZW1lbnRzIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aXRpb25fZWxlbSkpOwotICBwYXJ0LT5udW1fZWxlbWVudHMgPSBudW1fZWxlbWVudHM7Ci0gIGZvciAoZSA9IDA7IGUgPCBudW1fZWxlbWVudHM7ICsrZSkgCi0gICAgewotICAgICAgcGFydC0+ZWxlbWVudHNbZV0uY2xhc3NfZWxlbWVudCA9IGU7Ci0gICAgICBwYXJ0LT5lbGVtZW50c1tlXS5uZXh0ID0gJihwYXJ0LT5lbGVtZW50c1tlXSk7Ci0gICAgICBwYXJ0LT5lbGVtZW50c1tlXS5jbGFzc19jb3VudCA9IDE7Ci0gICAgfQotCi0gIHJldHVybiBwYXJ0OwotfQotCi0vKiBGcmVlZHMgYSBwYXJ0aXRpb24uICAqLwotCi12b2lkCi1wYXJ0aXRpb25fZGVsZXRlIChwYXJ0KQotICAgICAgcGFydGl0aW9uIHBhcnQ7Ci17Ci0gIGZyZWUgKHBhcnQpOwotfQotCi0vKiBVbml0ZXMgdGhlIGNsYXNzZXMgY29udGFpbmluZyBFTEVNMSBhbmQgRUxFTTIgaW50byBhIHNpbmdsZSBjbGFzcwotICAgb2YgcGFydGl0aW9uIFBBUlQuICBJZiBFTEVNMSBhbmQgRUxFTTIgYXJlIGFscmVhZHkgaW4gdGhlIHNhbWUKLSAgIGNsYXNzLCBkb2VzIG5vdGhpbmcuICBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZWxlbWVudCBvZiB0aGUKLSAgIHJlc3VsdGluZyB1bmlvbiBjbGFzcy4gICovCi0KLWludAotcGFydGl0aW9uX3VuaW9uIChwYXJ0LCBlbGVtMSwgZWxlbTIpCi0gICAgIHBhcnRpdGlvbiBwYXJ0OwotICAgICBpbnQgZWxlbTE7Ci0gICAgIGludCBlbGVtMjsKLXsKLSAgc3RydWN0IHBhcnRpdGlvbl9lbGVtICplbGVtZW50cyA9IHBhcnQtPmVsZW1lbnRzOwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gKmUxOwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gKmUyOwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gKnA7Ci0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSAqb2xkX25leHQ7Ci0gIC8qIFRoZSBjYW5vbmljYWwgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIHVuaW9uIGNsYXNzLiAgKi8KLSAgaW50IGNsYXNzX2VsZW1lbnQgPSBlbGVtZW50c1tlbGVtMV0uY2xhc3NfZWxlbWVudDsKLQotICAvKiBJZiB0aGV5J3JlIGFscmVhZHkgaW4gdGhlIHNhbWUgY2xhc3MsIGRvIG5vdGhpbmcuICAqLwotICBpZiAoY2xhc3NfZWxlbWVudCA9PSBlbGVtZW50c1tlbGVtMl0uY2xhc3NfZWxlbWVudCkKLSAgICByZXR1cm4gY2xhc3NfZWxlbWVudDsKLQotICAvKiBNYWtlIHN1cmUgRUxFTTEgaXMgaW4gdGhlIGxhcmdlciBjbGFzcyBvZiB0aGUgdHdvLiAgSWYgbm90LCBzd2FwCi0gICAgIHRoZW0uICBUaGlzIHdheSB3ZSBhbHdheXMgc2NhbiB0aGUgc2hvcnRlciBsaXN0LiAgKi8KLSAgaWYgKGVsZW1lbnRzW2VsZW0xXS5jbGFzc19jb3VudCA8IGVsZW1lbnRzW2VsZW0yXS5jbGFzc19jb3VudCkgCi0gICAgewotICAgICAgaW50IHRlbXAgPSBlbGVtMTsKLSAgICAgIGVsZW0xID0gZWxlbTI7Ci0gICAgICBlbGVtMiA9IHRlbXA7Ci0gICAgICBjbGFzc19lbGVtZW50ID0gZWxlbWVudHNbZWxlbTFdLmNsYXNzX2VsZW1lbnQ7Ci0gICAgfQotCi0gIGUxID0gJihlbGVtZW50c1tlbGVtMV0pOwotICBlMiA9ICYoZWxlbWVudHNbZWxlbTJdKTsKLQotICAvKiBLZWVwIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4gICovCi0gIGVsZW1lbnRzW2NsYXNzX2VsZW1lbnRdLmNsYXNzX2NvdW50IAotICAgICs9IGVsZW1lbnRzW2UyLT5jbGFzc19lbGVtZW50XS5jbGFzc19jb3VudDsKLQotICAvKiBVcGRhdGUgdGhlIGNsYXNzIGZpZWxkcyBpbiBlbGVtMidzIGNsYXNzIGxpc3QuICAqLwotICBlMi0+Y2xhc3NfZWxlbWVudCA9IGNsYXNzX2VsZW1lbnQ7Ci0gIGZvciAocCA9IGUyLT5uZXh0OyBwICE9IGUyOyBwID0gcC0+bmV4dCkKLSAgICBwLT5jbGFzc19lbGVtZW50ID0gY2xhc3NfZWxlbWVudDsKLSAgCi0gIC8qIFNwbGljZSBFTEVNMidzIGNsYXNzIGxpc3QgaW50byBFTEVNMSdzLiAgVGhlc2UgYXJlIGNpcmN1bGFyCi0gICAgIGxpc3RzLiAgKi8KLSAgb2xkX25leHQgPSBlMS0+bmV4dDsKLSAgZTEtPm5leHQgPSBlMi0+bmV4dDsKLSAgZTItPm5leHQgPSBvbGRfbmV4dDsKLQotICByZXR1cm4gY2xhc3NfZWxlbWVudDsKLX0KLQotLyogQ29tcGFyZSBlbGVtZW50cyBFTEVNMSBhbmQgRUxFTTIgZnJvbSBhcnJheSBvZiBpbnRlZ2VycywgZ2l2ZW4gYQotICAgcG9pbnRlciB0byBlYWNoLiAgVXNlZCB0byBxc29ydCBzdWNoIGFuIGFycmF5LiAgKi8KLQotc3RhdGljIGludCAKLWVsZW1fY29tcGFyZSAoZWxlbTEsIGVsZW0yKQotICAgICBjb25zdCB2b2lkICplbGVtMTsKLSAgICAgY29uc3Qgdm9pZCAqZWxlbTI7Ci17Ci0gIGludCBlMSA9ICogKGludCAqKSBlbGVtMTsKLSAgaW50IGUyID0gKiAoaW50ICopIGVsZW0yOwotICBpZiAoZTEgPCBlMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGUxID4gZTIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnRzIFBBUlQgdG8gdGhlIGZpbGUgcG9pbnRlciBGUC4gIFRoZSBlbGVtZW50cyBvZiBlYWNoCi0gICBjbGFzcyBhcmUgc29ydGVkLiAgKi8KLQotdm9pZAotcGFydGl0aW9uX3ByaW50IChwYXJ0LCBmcCkKLSAgICAgcGFydGl0aW9uIHBhcnQ7Ci0gICAgIEZJTEUgKmZwOwotewotICBjaGFyICpkb25lOwotICBpbnQgbnVtX2VsZW1lbnRzID0gcGFydC0+bnVtX2VsZW1lbnRzOwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gKmVsZW1lbnRzID0gcGFydC0+ZWxlbWVudHM7Ci0gIGludCAqY2xhc3NfZWxlbWVudHM7Ci0gIGludCBlOwotCi0gIC8qIEZsYWcgdGhlIGVsZW1lbnRzIHdlJ3ZlIGFscmVhZHkgcHJpbnRlZC4gICovCi0gIGRvbmUgPSAoY2hhciAqKSB4bWFsbG9jIChudW1fZWxlbWVudHMpOwotICBtZW1zZXQgKGRvbmUsIDAsIG51bV9lbGVtZW50cyk7Ci0KLSAgLyogQSBidWZmZXIgdXNlZCB0byBzb3J0IGVsZW1lbnRzIGluIGEgY2xhc3MuICAqLwotICBjbGFzc19lbGVtZW50cyA9IChpbnQgKikgeG1hbGxvYyAobnVtX2VsZW1lbnRzICogc2l6ZW9mIChpbnQpKTsKLQotICBmcHV0YyAoJ1snLCBmcCk7Ci0gIGZvciAoZSA9IDA7IGUgPCBudW1fZWxlbWVudHM7ICsrZSkKLSAgICAvKiBJZiB3ZSBoYXZlbid0IHByaW50ZWQgdGhpcyBlbGVtZW50LCBwcmludCBpdHMgZW50aXJlIGNsYXNzLiAgKi8KLSAgICBpZiAoISBkb25lW2VdKSAKLSAgICAgIHsKLQlpbnQgYyA9IGU7Ci0JaW50IGNvdW50ID0gZWxlbWVudHNbZWxlbWVudHNbZV0uY2xhc3NfZWxlbWVudF0uY2xhc3NfY291bnQ7Ci0JaW50IGk7Ci0KLSAgICAgIC8qIENvbGxlY3QgdGhlIGVsZW1lbnRzIGluIHRoaXMgY2xhc3MuICAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JICBjbGFzc19lbGVtZW50c1tpXSA9IGM7Ci0JICBkb25lW2NdID0gMTsKLQkgIGMgPSBlbGVtZW50c1tjXS5uZXh0IC0gZWxlbWVudHM7Ci0JfQotCS8qIFNvcnQgdGhlbS4gICovCi0JcXNvcnQgKCh2b2lkICopIGNsYXNzX2VsZW1lbnRzLCBjb3VudCwgc2l6ZW9mIChpbnQpLCAmZWxlbV9jb21wYXJlKTsKLQkvKiBQcmludCB0aGVtLiAgKi8KLQlmcHV0YyAoJygnLCBmcCk7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIAotCSAgZnByaW50ZiAoZnAsIGkgPT0gMCA/ICIlZCIgOiAiICVkIiwgY2xhc3NfZWxlbWVudHNbaV0pOwotCWZwdXRjICgnKScsIGZwKTsKLSAgICAgIH0KLSAgZnB1dGMgKCddJywgZnApOwotCi0gIGZyZWUgKGRvbmUpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4ZWN1dGUuYyBiL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlYTlkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qIFV0aWxpdGllcyB0byBleGVjdXRlIGEgcHJvZ3JhbSBpbiBhIHN1YnByb2Nlc3MgKHBvc3NpYmx5IGxpbmtlZCBieSBwaXBlcwotICAgd2l0aCBvdGhlciBzdWJwcm9jZXNzZXMpLCBhbmQgd2FpdCBmb3IgaXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IHBleGVjdXRlIGFuZCBwd2FpdC4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jZGVmaW5lIElTU1BBQ0UgKHgpIGlzc3BhY2UoeCkKLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2VuZGlmCi0KLSNpZmRlZiB2Zm9yayAvKiBBdXRvY29uZiBtYXkgZGVmaW5lIHRoaXMgdG8gZm9yayBmb3IgdXMuICovCi0jIGRlZmluZSBWRk9SS19TVFJJTkcgImZvcmsiCi0jZWxzZQotIyBkZWZpbmUgVkZPUktfU1RSSU5HICJ2Zm9yayIKLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLSNpZmRlZiBWTVMKLSNkZWZpbmUgdmZvcmsoKSAoZGVjYyQkYWxsb2NfdmZvcmtfYmxvY2tzKCkgPj0gMCA/IFwKLSAgICAgICAgICAgICAgIGxpYiRnZXRfY3VycmVudF9pbnZvX2NvbnRleHQoZGVjYyQkZ2V0X3Zmb3JrX2ptcGJ1ZigpKSA6IC0xKQotI2VuZGlmIC8qIFZNUyAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLS8qIHN0ZGluIGZpbGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RESU5fRklMRV9OTyAwCi0KLS8qIHN0ZG91dCBmaWxlIG51bWJlci4gICovCi0jZGVmaW5lIFNURE9VVF9GSUxFX05PIDEKLQotLyogdmFsdWUgb2YgYHBpcGUnOiBwb3J0IGluZGV4IGZvciByZWFkaW5nLiAgKi8KLSNkZWZpbmUgUkVBRF9QT1JUIDAKLQotLyogdmFsdWUgb2YgYHBpcGUnOiBwb3J0IGluZGV4IGZvciB3cml0aW5nLiAgKi8KLSNkZWZpbmUgV1JJVEVfUE9SVCAxCi0KLXN0YXRpYyBjaGFyICppbnN0YWxsX2Vycm9yX21zZyA9ICJpbnN0YWxsYXRpb24gcHJvYmxlbSwgY2Fubm90IGV4ZWMgYCVzJyI7Ci0KLS8qIHBleGVjdXRlOiBleGVjdXRlIGEgcHJvZ3JhbS4KLQotICAgUFJPR1JBTSBhbmQgQVJHViBhcmUgdGhlIGFyZ3VtZW50cyB0byBleGVjdi9leGVjdnAuCi0KLSAgIFRISVNfUE5BTUUgaXMgbmFtZSBvZiB0aGUgY2FsbGluZyBwcm9ncmFtIChpLmUuIGFyZ3ZbMF0pLgotCi0gICBURU1QX0JBU0UgaXMgdGhlIHBhdGggbmFtZSwgc2FucyBzdWZmaXgsIG9mIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0gICBpZiBuZWVkZWQuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgTVNET1MgcG9ydHMgdGhhdCBkb24ndCB1c2UKLSAgIEdPMzIgKGRvIGFueSBzdGlsbCBleGlzdD8pLiAgUG9ydHMgdGhhdCBkb24ndCBuZWVkIGl0IGNhbiBwYXNzIE5VTEwuCi0KLSAgIChGTEFHUyAmIFBFWEVDVVRFX1NFQVJDSCkgaXMgbm9uLXplcm8gaWYgJFBBVEggc2hvdWxkIGJlIHNlYXJjaGVkCi0gICAoPz8/IEl0J3Mgbm90IGNsZWFyIHRoYXQgR0NDIHBhc3NlcyB0aGlzIGZsYWcgY29ycmVjdGx5KS4KLSAgIChGTEFHUyAmIFBFWEVDVVRFX0ZJUlNUKSBpcyBub256ZXJvIGZvciB0aGUgZmlyc3QgcHJvY2VzcyBpbiBjaGFpbi4KLSAgIChGTEFHUyAmIFBFWEVDVVRFX0ZJUlNUKSBpcyBub256ZXJvIGZvciB0aGUgbGFzdCBwcm9jZXNzIGluIGNoYWluLgotICAgRklSU1RfTEFTVCBjb3VsZCBiZSBzaW1wbGlmaWVkIHRvIG9ubHkgbWFyayB0aGUgbGFzdCBvZiBhIGNoYWluIG9mIHByb2Nlc3NlcwotICAgYnV0IHRoYXQgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBhbHdheXMgbWFyayB0aGUgbGFzdCBvbmUgKGFuZCBub3QgZ2l2ZSB1cAotICAgZWFybHkgaWYgc29tZSBlcnJvciBvY2N1cnMpLiAgSXQncyBtb3JlIHJvYnVzdCB0byByZXF1aXJlIHRoZSBjYWxsZXIgdG8KLSAgIG1hcmsgYm90aCBlbmRzIG9mIHRoZSBjaGFpbi4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgcGlkIG9uIHN5c3RlbXMgbGlrZSBVbml4IHdoZXJlIHdlIGZvcmsvZXhlYyBhbmQgb24gc3lzdGVtcwotICAgbGlrZSBXSU4zMiBhbmQgT1MyIHdoZXJlIHdlIHVzZSBzcGF3bi4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gd2FpdCBmb3IKLSAgIHRoZSBjaGlsZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgV0VYSVRTVEFUVVMgb24gc3lzdGVtcyBsaWtlIE1TRE9TIHdoZXJlIHdlIHNwYXduIGFuZCB3YWl0Ci0gICBmb3IgdGhlIGNoaWxkIGhlcmUuCi0KLSAgIFVwb24gZmFpbHVyZSwgRVJSTVNHX0ZNVCBhbmQgRVJSTVNHX0FSRyBhcmUgc2V0IHRvIHRoZSB0ZXh0IG9mIHRoZSBlcnJvcgotICAgbWVzc2FnZSB3aXRoIGFuIG9wdGlvbmFsIGFyZ3VtZW50IChpZiBub3QgbmVlZGVkLCBFUlJNU0dfQVJHIGlzIHNldCB0bwotICAgTlVMTCksIGFuZCAtMSBpcyByZXR1cm5lZC4gIGBlcnJubycgaXMgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gdXNlLgotCi0gICBwd2FpdDogY292ZXIgZnVuY3Rpb24gZm9yIHdhaXQuCi0KLSAgIFBJRCBpcyB0aGUgcHJvY2VzcyBpZCBvZiB0aGUgdGFzayB0byB3YWl0IGZvci4KLSAgIFNUQVRVUyBpcyB0aGUgYHN0YXR1cycgYXJndW1lbnQgdG8gd2FpdC4KLSAgIEZMQUdTIGlzIGN1cnJlbnRseSB1bnVzZWQgKGFsbG93cyBmdXR1cmUgZW5oYW5jZW1lbnQgd2l0aG91dCBicmVha2luZwotICAgdXB3YXJkIGNvbXBhdGliaWxpdHkpLiAgUGFzcyAwIGZvciBub3cuCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHBpZCBvZiB0aGUgY2hpbGQgcmVhcGVkLAotICAgb3IgLTEgZm9yIGZhaWx1cmUgKGVycm5vIHNheXMgd2h5KS4KLQotICAgT24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgd2FpdGluZyBmb3IgYSBwYXJ0aWN1bGFyIGNoaWxkLCBQSUQgaXMKLSAgIGlnbm9yZWQuICBPbiBzeXN0ZW1zIGxpa2UgTVNET1MgdGhhdCBkb24ndCByZWFsbHkgbXVsdGl0YXNrIHB3YWl0Ci0gICBpcyBqdXN0IGEgbWVjaGFuaXNtIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IGludGVyZmFjZSBmb3IgdGhlIGNhbGxlci4KLQotICAgcGZpbmlzaDogZmluaXNoIGdlbmVyYXRpb24gb2Ygc2NyaXB0Ci0KLSAgIHBmaW5pc2ggaXMgbmVjZXNzYXJ5IGZvciBzeXN0ZW1zIGxpa2UgTVBXIHdoZXJlIGEgc2NyaXB0IGlzIGdlbmVyYXRlZCB0aGF0Ci0gICBydW5zIHRoZSByZXF1ZXN0ZWQgcHJvZ3JhbXMuCi0qLwotCi0jaWZkZWYgX19NU0RPU19fCi0KLS8qIE1TRE9TIGRvZXNuJ3QgbXVsdGl0YXNrLCBidXQgZm9yIHRoZSBzYWtlIG9mIGEgY29uc2lzdGVudCBpbnRlcmZhY2UKLSAgIHRoZSBjb2RlIGJlaGF2ZXMgbGlrZSBpdCBkb2VzLiAgcGV4ZWN1dGUgcnVucyB0aGUgcHJvZ3JhbSwgdHVja3MgdGhlCi0gICBleGl0IGNvZGUgYXdheSwgYW5kIHJldHVybnMgYSAicGlkIi4gIHB3YWl0IG11c3QgYmUgY2FsbGVkIHRvIGZldGNoIHRoZQotICAgZXhpdCBjb2RlLiAgKi8KLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotLyogRm9yIGNvbW11bmljYXRpbmcgaW5mb3JtYXRpb24gZnJvbSBwZXhlY3V0ZSB0byBwd2FpdC4gICovCi1zdGF0aWMgaW50IGxhc3RfcGlkID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9zdGF0dXMgPSAwOwotc3RhdGljIGludCBsYXN0X3JlYXBlZCA9IDA7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCByYzsKLQotICBsYXN0X3BpZCsrOwotICBpZiAobGFzdF9waWQgPCAwKQotICAgIGxhc3RfcGlkID0gMTsKLQotICBpZiAoKGZsYWdzICYgUEVYRUNVVEVfT05FKSAhPSBQRVhFQ1VURV9PTkUpCi0gICAgYWJvcnQgKCk7Ci0KLSNpZmRlZiBfX0dPMzJfXwotICAvKiA/Pz8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZnJvbSBzcGF3bnY/ICAqLwotICByYyA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IHNwYXdudnAgOiBzcGF3bnYpICgxLCBwcm9ncmFtLCBhcmd2KTsKLSNlbHNlCi0gIGNoYXIgKnNjbWQsICpyZjsKLSAgRklMRSAqYXJnZmlsZTsKLSAgaW50IGksIGVsID0gZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyA0IDogMDsKLQotICBpZiAodGVtcF9iYXNlID09IDApCi0gICAgdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgc2NtZCA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocHJvZ3JhbSkgKyBzdHJsZW4gKHRlbXBfYmFzZSkgKyA2ICsgZWwpOwotICByZiA9IHNjbWQgKyBzdHJsZW4ocHJvZ3JhbSkgKyAyICsgZWw7Ci0gIHNwcmludGYgKHNjbWQsICIlcyVzIEAlcy5ncCIsIHByb2dyYW0sCi0JICAgKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gIi5leGUiIDogIiIpLCB0ZW1wX2Jhc2UpOwotICBhcmdmaWxlID0gZm9wZW4gKHJmLCAidyIpOwotICBpZiAoYXJnZmlsZSA9PSAwKQotICAgIHsKLSAgICAgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0gICAgICBmcmVlIChzY21kKTsKLSAgICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgICAgICplcnJtc2dfZm10ID0gImNhbm5vdCBvcGVuIGAlcy5ncCciOwotICAgICAgKmVycm1zZ19hcmcgPSB0ZW1wX2Jhc2U7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgY2hhciAqY3A7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnIHx8ICpjcCA9PSAnXFwnIHx8IElTU1BBQ0UgKCpjcCkpCi0JICAgIGZwdXRjICgnXFwnLCBhcmdmaWxlKTsKLQkgIGZwdXRjICgqY3AsIGFyZ2ZpbGUpOwotCX0KLSAgICAgIGZwdXRjICgnXG4nLCBhcmdmaWxlKTsKLSAgICB9Ci0gIGZjbG9zZSAoYXJnZmlsZSk7Ci0KLSAgcmMgPSBzeXN0ZW0gKHNjbWQpOwotCi0gIHsKLSAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOwotICAgIHJlbW92ZSAocmYpOwotICAgIGZyZWUgKHNjbWQpOwotICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKHJjID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFR1Y2sgdGhlIHN0YXR1cyBhd2F5IGZvciBwd2FpdCwgYW5kIHJldHVybiBhICJwaWQiLiAgKi8KLSAgbGFzdF9zdGF0dXMgPSByYyA8PCA4OwotICByZXR1cm4gbGFzdF9waWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogT24gTVNET1MgZWFjaCBwZXhlY3V0ZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0J3MgYXNzb2NpYXRlZCBwd2FpdC4gICovCi0gIGlmIChwaWQgIT0gbGFzdF9waWQKLSAgICAgIC8qIENhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgY2hpbGQ/ICAqLwotICAgICAgfHwgcGlkID09IGxhc3RfcmVhcGVkKQotICAgIHsKLSAgICAgIC8qID8/PyBFQ0hJTEQgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlLiAgQ2FuIHdlIHVzZSBpdCBoZXJlPyAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gICpzdGF0dXMgPSBsYXN0X3N0YXR1czsKLSAgbGFzdF9yZWFwZWQgPSBsYXN0X3BpZDsKLSAgcmV0dXJuIGxhc3RfcGlkOwotfQotCi0jZW5kaWYgLyogTVNET1MgKi8KLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfVVdJTikKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotI2lmZGVmIF9fQ1lHV0lOX18KLQotI2RlZmluZSBmaXhfYXJndihhcmd2ZWMpIChhcmd2ZWMpCi0KLWV4dGVybiBpbnQgX3NwYXdudiAoKTsKLWV4dGVybiBpbnQgX3NwYXdudnAgKCk7Ci0KLSNlbHNlIC8qICEgX19DWUdXSU5fXyAqLwotCi0vKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIE1pY3Jvc29mdCBDIHNwYXduIGZ1bmN0aW9ucycgcHJvcGVuc2l0eQotICAgdG8gcmVtb3ZlIHRoZSBvdXRlcm1vc3Qgc2V0IG9mIGRvdWJsZSBxdW90ZXMgZnJvbSBhbGwgYXJndW1lbnRzLiAgKi8KLQotY29uc3QgY2hhciAqIGNvbnN0ICoKLWZpeF9hcmd2IChhcmd2ZWMpCi0gICAgIGNoYXIgKiphcmd2ZWM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDE7IGFyZ3ZlY1tpXSAhPSAwOyBpKyspCi0gICAgewotICAgICAgaW50IGxlbiwgajsKLSAgICAgIGNoYXIgKnRlbXAsICpuZXd0ZW1wOwotCi0gICAgICB0ZW1wID0gYXJndmVjW2ldOwotICAgICAgbGVuID0gc3RybGVuICh0ZW1wKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ZW1wW2pdID09ICciJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV3dGVtcCA9IHhtYWxsb2MgKGxlbiArIDIpOwotICAgICAgICAgICAgICBzdHJuY3B5IChuZXd0ZW1wLCB0ZW1wLCBqKTsKLSAgICAgICAgICAgICAgbmV3dGVtcCBbal0gPSAnXFwnOwotICAgICAgICAgICAgICBzdHJuY3B5ICgmbmV3dGVtcCBbaisxXSwgJnRlbXAgW2pdLCBsZW4taik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2xlbisxXSA9IDA7Ci0gICAgICAgICAgICAgIHRlbXAgPSBuZXd0ZW1wOwotICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXJndmVjW2ldID0gdGVtcDsKLSAgICAgIH0KLQotICBmb3IgKGkgPSAwOyBhcmd2ZWNbaV0gIT0gMDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJwYnJrIChhcmd2ZWNbaV0sICIgXHQiKSkKLSAgICAgICAgewotCSAgaW50IGxlbiwgdHJhaWxpbmdfYmFja3NsYXNoOwotCSAgY2hhciAqdGVtcDsKLQotCSAgbGVuID0gc3RybGVuIChhcmd2ZWNbaV0pOwotCSAgdHJhaWxpbmdfYmFja3NsYXNoID0gMDsKLQotCSAgLyogVGhlcmUgaXMgYW4gYWRkZWQgY29tcGxpY2F0aW9uIHdoZW4gYW4gYXJnIHdpdGggZW1iZWRkZWQgd2hpdGUKLQkgICAgIHNwYWNlIGVuZHMgaW4gYSBiYWNrc2xhc2ggKHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgLWlwcmVmaXggYXJnCi0JICAgICBwYXNzZWQgdG8gY3BwKS4gVGhlIHJlc3VsdGluZyBxdW90ZWQgc3RyaW5ncyBnZXRzIG1pc2ludGVycHJldGVkCi0JICAgICBieSB0aGUgY29tbWFuZCBpbnRlcnByZXRlciAtLSBpdCB0aGlua3MgdGhhdCB0aGUgZW5kaW5nIHF1b3RlCi0JICAgICBpcyBlc2NhcGVkIGJ5IHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggYW5kIHRoaW5ncyBnZXQgY29uZnVzZWQuIAotCSAgICAgV2UgaGFuZGxlIHRoaXMgY2FzZSBieSBlc2NhcGluZyB0aGUgdHJhaWxpbmcgYmFja3NsYXNoLCBwcm92aWRlZAotCSAgICAgaXQgd2FzIG5vdCBlc2NhcGVkIGluIHRoZSBmaXJzdCBwbGFjZS4gICovCi0JICBpZiAobGVuID4gMSAKLQkgICAgICAmJiBhcmd2ZWNbaV1bbGVuLTFdID09ICdcXCcgCi0JICAgICAgJiYgYXJndmVjW2ldW2xlbi0yXSAhPSAnXFwnKQotCSAgICB7Ci0JICAgICAgdHJhaWxpbmdfYmFja3NsYXNoID0gMTsKLQkgICAgICArK2xlbjsJCQkvKiB0byBlc2NhcGUgdGhlIGZpbmFsIGJhY2tzbGFzaC4gKi8KLQkgICAgfQotCi0JICBsZW4gKz0gMjsJCQkvKiBhbmQgZm9yIHRoZSBlbmNsb3NpbmcgcXVvdGVzLiAqLwotCi0JICB0ZW1wID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICB0ZW1wWzBdID0gJyInOwotCSAgc3RyY3B5ICh0ZW1wICsgMSwgYXJndmVjW2ldKTsKLQkgIGlmICh0cmFpbGluZ19iYWNrc2xhc2gpCi0JICAgIHRlbXBbbGVuLTJdID0gJ1xcJzsKLQkgIHRlbXBbbGVuLTFdID0gJyInOwotCSAgdGVtcFtsZW5dID0gJ1wwJzsKLQotCSAgYXJndmVjW2ldID0gdGVtcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqIGNvbnN0ICopIGFyZ3ZlYzsKLX0KLSNlbmRpZiAvKiBfX0NZR1dJTl9fICovCi0KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLS8qIG1pbmd3MzIgaGVhZGVycyBtYXkgbm90IGRlZmluZSB0aGUgZm9sbG93aW5nLiAgKi8KLQotI2lmbmRlZiBfUF9XQUlUCi0jICBkZWZpbmUgX1BfV0FJVAkwCi0jICBkZWZpbmUgX1BfTk9XQUlUCTEKLSMgIGRlZmluZSBfUF9PVkVSTEFZCTIKLSMgIGRlZmluZSBfUF9OT1dBSVRPCTMKLSMgIGRlZmluZSBfUF9ERVRBQ0gJNAotCi0jICBkZWZpbmUgV0FJVF9DSElMRAkwCi0jICBkZWZpbmUgV0FJVF9HUkFORENISUxECTEKLSNlbmRpZgotCi0vKiBXaW4zMiBzdXBwb3J0cyBwaXBlcyAqLwotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHBpZDsKLSAgaW50IHBkZXNbMl0sIG9yZ19zdGRpbiwgb3JnX3N0ZG91dDsKLSAgaW50IGlucHV0X2Rlc2MsIG91dHB1dF9kZXNjOwotICBpbnQgcmV0cmllcywgc2xlZXBfaW50ZXJ2YWw7Ci0KLSAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCi0gICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCi0gICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KLSAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQotICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0KLSAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAotICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLwotICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKLSAgICB7Ci0gICAgICBpZiAoX3BpcGUgKHBkZXMsIDI1NiwgT19CSU5BUlkpIDwgMCkKLQl7Ci0JICAqZXJybXNnX2ZtdCA9ICJwaXBlIjsKLQkgICplcnJtc2dfYXJnID0gTlVMTDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBvdXRwdXRfZGVzYyA9IHBkZXNbV1JJVEVfUE9SVF07Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBwZGVzW1JFQURfUE9SVF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTGFzdCBwcm9jZXNzLiAgKi8KLSAgICAgIG91dHB1dF9kZXNjID0gU1RET1VUX0ZJTEVfTk87Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotICAgIH0KLQotICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotICAgIHsKLSAgICAgIG9yZ19zdGRpbiA9IGR1cCAoU1RESU5fRklMRV9OTyk7Ci0gICAgICBkdXAyIChpbnB1dF9kZXNjLCBTVERJTl9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChpbnB1dF9kZXNjKTsgCi0gICAgfQotCi0gIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLSAgICB7Ci0gICAgICBvcmdfc3Rkb3V0ID0gZHVwIChTVERPVVRfRklMRV9OTyk7Ci0gICAgICBkdXAyIChvdXRwdXRfZGVzYywgU1RET1VUX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG91dHB1dF9kZXNjKTsKLSAgICB9Ci0KLSAgcGlkID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gX3NwYXdudnAgOiBfc3Bhd252KQotICAgIChfUF9OT1dBSVQsIHByb2dyYW0sIGZpeF9hcmd2KGFyZ3YpKTsKLQotICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotICAgIHsKLSAgICAgIGR1cDIgKG9yZ19zdGRpbiwgU1RESU5fRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3JnX3N0ZGluKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotICAgIHsKLSAgICAgIGR1cDIgKG9yZ19zdGRvdXQsIFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvcmdfc3Rkb3V0KTsKLSAgICB9Ci0KLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcGlkOwotfQotCi0vKiBNUyBDUlRETEwgZG9lc24ndCByZXR1cm4gZW5vdWdoIGluZm9ybWF0aW9uIGluIHN0YXR1cyB0byBkZWNpZGUgaWYgdGhlCi0gICBjaGlsZCBleGl0ZWQgZHVlIHRvIGEgc2lnbmFsIG9yIG5vdCwgcmF0aGVyIGl0IHNpbXBseSByZXR1cm5zIGFuCi0gICBpbnRlZ2VyIHdpdGggdGhlIGV4aXQgY29kZSBvZiB0aGUgY2hpbGQ7IGVnLiwgaWYgdGhlIGNoaWxkIGV4aXRlZCB3aXRoIAotICAgYW4gYWJvcnQoKSBjYWxsIGFuZCBkaWRuJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yIFNJR0FCUlQsIGl0IHNpbXBseSByZXR1cm5zCi0gICB3aXRoIHN0YXR1cyA9IDMuIFdlIGZpeCB0aGUgc3RhdHVzIGNvZGUgdG8gY29uZm9ybSB0byB0aGUgdXN1YWwgV0lGKgotICAgbWFjcm9zLiBOb3RlIHRoYXQgV0lGU0lHTkFMRUQgd2lsbCBuZXZlciBiZSB0cnVlIHVuZGVyIENSVERMTC4gKi8KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotI2lmZGVmIF9fQ1lHV0lOX18KLSAgcmV0dXJuIHdhaXQgKHN0YXR1cyk7Ci0jZWxzZQotICBpbnQgdGVybXN0YXQ7Ci0KLSAgcGlkID0gX2N3YWl0ICgmdGVybXN0YXQsIHBpZCwgV0FJVF9DSElMRCk7Ci0KLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0KLSAgLyogY3dhaXQgcmV0dXJucyB0aGUgY2hpbGQgcHJvY2VzcyBleGl0IGNvZGUgaW4gdGVybXN0YXQuCi0gICAgIEEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGQgY2F1Z2h0IGEgc2lnbmFsLCBidXQgbm90Ci0gICAgIHdoaWNoIG9uZS4gIFNpbmNlIG9ubHkgU0lHQUJSVCwgU0lHRlBFIGFuZCBTSUdJTlQgZG8gYW55dGhpbmcsIHdlCi0gICAgIHJlcG9ydCBTSUdBQlJULiAgKi8KLSAgaWYgKHRlcm1zdGF0ID09IDMpCi0gICAgKnN0YXR1cyA9IFNJR0FCUlQ7Ci0gIGVsc2UKLSAgICAqc3RhdHVzID0gKCgodGVybXN0YXQpICYgMHhmZikgPDwgOCk7Ci0KLSAgcmV0dXJuIHBpZDsKLSNlbmRpZiAvKiBfX0NZR1dJTl9fICovCi19Ci0KLSNlbmRpZiAvKiBfV0lOMzIgJiYgISBfVVdJTiAqLwotCi0jaWZkZWYgT1MyCi0KLS8qID8/PyBEb2VzIE9TMiBoYXZlIHByb2Nlc3MuaD8gICovCi1leHRlcm4gaW50IHNwYXdudiAoKTsKLWV4dGVybiBpbnQgc3Bhd252cCAoKTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHBpZDsKLQotICBpZiAoKGZsYWdzICYgUEVYRUNVVEVfT05FKSAhPSBQRVhFQ1VURV9PTkUpCi0gICAgYWJvcnQgKCk7Ci0gIC8qID8/PyBQcmVzdW1hYmx5IDEgPT0gX1BfTk9XQUlULiAgKi8KLSAgcGlkID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gc3Bhd252cCA6IHNwYXdudikgKDEsIHByb2dyYW0sIGFyZ3YpOwotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gcGlkOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotICBpbnQgcGlkID0gd2FpdCAoc3RhdHVzKTsKLSAgcmV0dXJuIHBpZDsKLX0KLQotI2VuZGlmIC8qIE9TMiAqLwotCi0jaWZkZWYgTVBXCi0KLS8qIE1QVyBwZXhlY3V0ZSBkb2Vzbid0IGFjdHVhbGx5IHJ1biBhbnl0aGluZzsgaW5zdGVhZCwgaXQgd3JpdGVzIG91dAotICAgc2NyaXB0IGNvbW1hbmRzIHRoYXQsIHdoZW4gcnVuLCB3aWxsIGRvIHRoZSBhY3R1YWwgZXhlY3V0aW5nLgotCi0gICBGb3IgZXhhbXBsZSwgaW4gR0NDJ3MgY2FzZSwgR0NDIHdpbGwgd3JpdGUgb3V0IHNldmVyYWwgc2NyaXB0IGNvbW1hbmRzOgotCi0gICBjcHAgLi4uCi0gICBjYzEgLi4uCi0gICBhcyAuLi4KLSAgIGxkIC4uLgotCi0gICBhbmQgdGhlbiBleGl0LiAgTm9uZSBvZiB0aGUgYWJvdmUgcHJvZ3JhbXMgd2lsbCBoYXZlIHJ1biB5ZXQuICBUaGUgdGFzawotICAgdGhhdCBjYWxsZWQgR0NDIHdpbGwgdGhlbiBleGVjdXRlIHRoZSBzY3JpcHQgYW5kIGNhdXNlIGNwcCxldGMuIHRvIHJ1bi4KLSAgIFRoZSBjYWxsZXIgbXVzdCBpbnZva2UgcGZpbmlzaCBiZWZvcmUgY2FsbGluZyBleGl0LiAgVGhpcyBhZGRzCi0gICB0aGUgZmluaXNoaW5nIHRvdWNoZXMgdG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQuICAqLwotCi1zdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBjaGFyIHRtcHByb2dyYW1bMjU1XTsKLSAgY2hhciAqY3AsICp0bXBuYW1lOwotICBpbnQgaTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHByb2dyYW0sIHRtcHByb2dyYW0pOwotICBpZiAoZmlyc3RfdGltZSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJTZXQgRmFpbGVkIDBcbiIpOwotICAgICAgZmlyc3RfdGltZSA9IDA7Ci0gICAgfQotCi0gIGZwdXRzICgiSWYge0ZhaWxlZH0gPT0gMFxuIiwgc3Rkb3V0KTsKLSAgLyogSWYgYmVpbmcgdmVyYm9zZSwgb3V0cHV0IGEgY29weSBvZiB0aGUgY29tbWFuZC4gIEl0IHNob3VsZCBiZQotICAgICBhY2N1cmF0ZSBlbm91Z2ggYW5kIGVzY2FwZWQgZW5vdWdoIHRvIGJlICJjbGlja2FibGUiLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfVkVSQk9TRSkKLSAgICB7Ci0gICAgICBmcHV0cyAoIlx0RWNobyAiLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0cyAodG1wcHJvZ3JhbSwgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLSAgICAgIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0JewotCSAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0JICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB0aGF0IG5lZWRzIGZpeGluZy4gICovCi0JICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcvJykpCi0JICAgIHsKLQkgICAgICB0bXBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjU2KTsKLQkgICAgICBtcHdpZnlfZmlsZW5hbWUgKGFyZ3ZbaV0sIHRtcG5hbWUpOwotCSAgICAgIGFyZ3ZbaV0gPSB0bXBuYW1lOwotCSAgICB9Ci0JICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCSAgICB7Ci0JICAgICAgLyogV3JpdGUgYW4gT3B0aW9uLWQgZXNjYXBlIGNoYXIgaW4gZnJvbnQgb2Ygc3BlY2lhbCBjaGFycy4gICovCi0JICAgICAgaWYgKHN0cmNocigiJysiLCAqY3ApKQotCQlmcHV0YyAoJ1wyNjYnLCBzdGRvdXQpOwotCSAgICAgIGZwdXRjICgqY3AsIHN0ZG91dCk7Ci0JICAgIH0KLQkgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotCSAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLQl9Ci0gICAgICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLSAgICB9Ci0gIGZwdXRzICgiXHQiLCBzdGRvdXQpOwotICBmcHV0cyAodG1wcHJvZ3JhbSwgc3Rkb3V0KTsKLSAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLQotICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotICAgIHsKLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHRoYXQgbmVlZHMgZml4aW5nLiAgKi8KLSAgICAgIGlmIChzdHJjaHIoYXJndltpXSwgJy8nKSkKLQl7Ci0JICB0bXBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjU2KTsKLQkgIG1wd2lmeV9maWxlbmFtZSAoYXJndltpXSwgdG1wbmFtZSk7Ci0JICBhcmd2W2ldID0gdG1wbmFtZTsKLQl9Ci0gICAgICBpZiAoc3RyY2hyIChhcmd2W2ldLCAnICcpKQotCWZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQl7Ci0JICAvKiBXcml0ZSBhbiBPcHRpb24tZCBlc2NhcGUgY2hhciBpbiBmcm9udCBvZiBzcGVjaWFsIGNoYXJzLiAgKi8KLQkgIGlmIChzdHJjaHIoIicrIiwgKmNwKSkKLQkgICAgZnB1dGMgKCdcMjY2Jywgc3Rkb3V0KTsKLQkgIGZwdXRjICgqY3AsIHN0ZG91dCk7Ci0JfQotICAgICAgaWYgKHN0cmNociAoYXJndltpXSwgJyAnKSkKLQlmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0gICAgfQotCi0gIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotCi0gIC8qIE91dHB1dCBjb21tYW5kcyB0aGF0IGFycmFuZ2UgdG8gY2xlYW4gdXAgYW5kIGV4aXQgaWYgYSBmYWlsdXJlIG9jY3Vycy4KLSAgICAgV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIGNvbGxlY3QgdGhlIHN0YXR1cyBmcm9tIHRoZSBwcm9ncmFtIHRoYXQgd2FzCi0gICAgIHJ1biwgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBzY3JpcHQgY29tbWFuZC4gIEFsc28sIHdlIGRvbid0IGV4aXQKLSAgICAgaW1tZWRpYXRlbHksIHNpbmNlIG5lY2Vzc2FyeSBjbGVhbnVwcyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LiAgKi8KLSAgZnB1dHMgKCJcdFNldCBUbXBTdGF0dXMge1N0YXR1c31cbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRJZiB7VG1wU3RhdHVzfSAhPSAwXG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0XHRTZXQgRmFpbGVkIHtUbXBTdGF0dXN9XG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0RW5kXG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIkVuZFxuIiwgc3Rkb3V0KTsKLQotICAvKiBXZSdyZSBqdXN0IGNvbXBvc2luZyBhIHNjcmlwdCwgY2FuJ3QgZmFpbCBoZXJlLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXcml0ZSBvdXQgY29tbWFuZHMgdGhhdCB3aWxsIGV4aXQgd2l0aCB0aGUgY29ycmVjdCBlcnJvciBjb2RlCi0gICBpZiBzb21ldGhpbmcgaW4gdGhlIHNjcmlwdCBmYWlsZWQuICAqLwotCi12b2lkCi1wZmluaXNoICgpCi17Ci0gIHByaW50ZiAoIlx0RXhpdCBcIntGYWlsZWR9XCJcbiIpOwotfQotCi0jZW5kaWYgLyogTVBXICovCi0KLS8qIGluY2x1ZGUgZm9yIFVuaXgtbGlrZSBlbnZpcm9ubWVudHMgYnV0IG5vdCBmb3IgRG9zLWxpa2UgZW52aXJvbm1lbnRzICovCi0jaWYgISBkZWZpbmVkIChfX01TRE9TX18pICYmICEgZGVmaW5lZCAoT1MyKSAmJiAhIGRlZmluZWQgKE1QVykgXAotICAgICYmICEgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfVVdJTikpCi0KLWV4dGVybiBpbnQgZXhlY3YgKCk7Ci1leHRlcm4gaW50IGV4ZWN2cCAoKTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2UgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgKCpmdW5jKSgpID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gZXhlY3ZwIDogZXhlY3YpOwotICBpbnQgcGlkOwotICBpbnQgcGRlc1syXTsKLSAgaW50IGlucHV0X2Rlc2MsIG91dHB1dF9kZXNjOwotICBpbnQgcmV0cmllcywgc2xlZXBfaW50ZXJ2YWw7Ci0gIC8qIFBpcGUgd2FpdGluZyBmcm9tIGxhc3QgcHJvY2VzcywgdG8gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIG5leHQgb25lLgotICAgICBWYWx1ZSBpcyBTVERJTl9GSUxFX05PIGlmIG5vIHBpcGUgaXMgd2FpdGluZwotICAgICAoaS5lLiB0aGUgbmV4dCBjb21tYW5kIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwKS4gICovCi0gIHN0YXRpYyBpbnQgbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIGluaXRpYWxpemUuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9GSVJTVCkKLSAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotCi0gIGlucHV0X2Rlc2MgPSBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBwcm9jZXNzLCBtYWtlIGEgcGlwZSBmb3IgaXRzIG91dHB1dCwKLSAgICAgYW5kIHJlY29yZCBpdCBhcyB3YWl0aW5nIHRvIGJlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwcm9jZXNzLiAgKi8KLSAgaWYgKCEgKGZsYWdzICYgUEVYRUNVVEVfTEFTVCkpCi0gICAgewotICAgICAgaWYgKHBpcGUgKHBkZXMpIDwgMCkKLQl7Ci0JICAqZXJybXNnX2ZtdCA9ICJwaXBlIjsKLQkgICplcnJtc2dfYXJnID0gTlVMTDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBvdXRwdXRfZGVzYyA9IHBkZXNbV1JJVEVfUE9SVF07Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBwZGVzW1JFQURfUE9SVF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTGFzdCBwcm9jZXNzLiAgKi8KLSAgICAgIG91dHB1dF9kZXNjID0gU1RET1VUX0ZJTEVfTk87Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotICAgIH0KLQotICAvKiBGb3JrIGEgc3VicHJvY2Vzczsgd2FpdCBhbmQgcmV0cnkgaWYgaXQgZmFpbHMuICAqLwotICBzbGVlcF9pbnRlcnZhbCA9IDE7Ci0gIGZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCA0OyByZXRyaWVzKyspCi0gICAgewotICAgICAgcGlkID0gdmZvcmsgKCk7Ci0gICAgICBpZiAocGlkID49IDApCi0JYnJlYWs7Ci0gICAgICBzbGVlcCAoc2xlZXBfaW50ZXJ2YWwpOwotICAgICAgc2xlZXBfaW50ZXJ2YWwgKj0gMjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwaWQpCi0gICAgewotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JKmVycm1zZ19mbXQgPSBWRk9SS19TVFJJTkc7Ci0JKmVycm1zZ19hcmcgPSBOVUxMOwotCXJldHVybiAtMTsKLSAgICAgIH0KLQotICAgIGNhc2UgMDogLyogY2hpbGQgKi8KLSAgICAgIC8qIE1vdmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcGlwZXMgaW50byBwbGFjZSwgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0JewotCSAgY2xvc2UgKFNURElOX0ZJTEVfTk8pOwotCSAgZHVwIChpbnB1dF9kZXNjKTsKLQkgIGNsb3NlIChpbnB1dF9kZXNjKTsKLQl9Ci0gICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0JewotCSAgY2xvc2UgKFNURE9VVF9GSUxFX05PKTsKLQkgIGR1cCAob3V0cHV0X2Rlc2MpOwotCSAgY2xvc2UgKG91dHB1dF9kZXNjKTsKLQl9Ci0KLSAgICAgIC8qIENsb3NlIHRoZSBwYXJlbnQncyBkZXNjcyB0aGF0IGFyZW4ndCB3YW50ZWQgaGVyZS4gICovCi0gICAgICBpZiAobGFzdF9waXBlX2lucHV0ICE9IFNURElOX0ZJTEVfTk8pCi0JY2xvc2UgKGxhc3RfcGlwZV9pbnB1dCk7Ci0KLSAgICAgIC8qIEV4ZWMgdGhlIHByb2dyYW0uICAqLwotICAgICAgKCpmdW5jKSAocHJvZ3JhbSwgYXJndik7Ci0KLSAgICAgIC8qIE5vdGU6IENhbGxpbmcgZnByaW50ZiBhbmQgZXhpdCBoZXJlIGRvZXNuJ3Qgc2VlbSByaWdodCBmb3IgdmZvcmsuICAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHRoaXNfcG5hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBpbnN0YWxsX2Vycm9yX21zZywgcHJvZ3JhbSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCB4c3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBJbiB0aGUgcGFyZW50LCBhZnRlciBmb3JraW5nLgotCSBDbG9zZSB0aGUgZGVzY3JpcHRvcnMgdGhhdCB3ZSBtYWRlIGZvciB0aGlzIGNoaWxkLiAgKi8KLSAgICAgIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0JY2xvc2UgKGlucHV0X2Rlc2MpOwotICAgICAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotCWNsb3NlIChvdXRwdXRfZGVzYyk7Ci0KLSAgICAgIC8qIFJldHVybiBjaGlsZCdzIHByb2Nlc3MgbnVtYmVyLiAgKi8KLSAgICAgIHJldHVybiBwaWQ7Ci0gICAgfQotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0jaWZkZWYgVk1TCi0gIHBpZCA9IHdhaXRwaWQgKC0xLCBzdGF0dXMsIDApOwotI2Vsc2UKLSAgcGlkID0gd2FpdCAoc3RhdHVzKTsKLSNlbmRpZgotICByZXR1cm4gcGlkOwotfQotCi0jZW5kaWYgLyogISBfX01TRE9TX18gJiYgISBPUzIgJiYgISBNUFcgJiYgISAoX1dJTjMyICYmICEgX1VXSU4pICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcHV0ZW52LmMgYi9saWJpYmVydHkvcHV0ZW52LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTY5MjIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3B1dGVudi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGJhc2VkIG9uIHB1dGVudi5jIGluIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmIGRlZmluZWQgKF9BSVgpICYmICFkZWZpbmVkIChfX0dOVUNfXykKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0KLSNpZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaWYgSEFWRV9TVERMSUJfSAotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmIEhBVkVfU1RSSU5HX0gKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQUxMT0NBX0gKLSMgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZWxzZQotIyBpZm5kZWYgYWxsb2NhCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyAgZWxzZQotZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKLSMgIGVuZGlmIC8qIF9fR05VQ19fICovCi0jIGVuZGlmIC8qIGFsbG9jYSAqLwotI2VuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLQotLyogQmVsb3cgdGhpcyBwb2ludCwgaXQncyB2ZXJiYXRpbSBjb2RlIGZyb20gdGhlIGdsaWJjLTIuMCBpbXBsZW1lbnRhdGlvbiAqLwotCi0KLS8qIFB1dCBTVFJJTkcsIHdoaWNoIGlzIG9mIHRoZSBmb3JtICJOQU1FPVZBTFVFIiwgaW4gdGhlIGVudmlyb25tZW50LiAgKi8KLWludAotcHV0ZW52IChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqY29uc3QgbmFtZV9lbmQgPSBzdHJjaHIgKHN0cmluZywgJz0nKTsKLQotICBpZiAobmFtZV9lbmQpCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIGFsbG9jYSAobmFtZV9lbmQgLSBzdHJpbmcgKyAxKTsKLSAgICAgIG1lbWNweSAobmFtZSwgc3RyaW5nLCBuYW1lX2VuZCAtIHN0cmluZyk7Ci0gICAgICBuYW1lW25hbWVfZW5kIC0gc3RyaW5nXSA9ICdcMCc7Ci0gICAgICByZXR1cm4gc2V0ZW52IChuYW1lLCBuYW1lX2VuZCArIDEsIDEpOwotICAgIH0KLQotICB1bnNldGVudiAoc3RyaW5nKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmFuZG9tLmMgYi9saWJpYmVydHkvcmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDBkYTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIFtyZXNjaW5kZWQgMjIgSnVseSAxOTk5XQotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIEJlcmtlbGV5IHNvdXJjZToKLSAqCUAoIylyYW5kb20uYwk1LjUgKEJlcmtlbGV5KSA3LzYvODgKLSAqIEl0IHdhcyByZXdvcmtlZCBmb3IgdGhlIEdOVSBDIExpYnJhcnkgYnkgUm9sYW5kIE1jR3JhdGguCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZiAwCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZWxzZQotCi0jZGVmaW5lCVVMT05HX01BWCAgKCh1bnNpZ25lZCBsb25nKSh+MEwpKSAgICAgLyogMHhGRkZGRkZGRiBmb3IgMzItYml0cyAqLwotI2RlZmluZQlMT05HX01BWCAgICgobG9uZykoVUxPTkdfTUFYID4+IDEpKSAgIC8qIDB4N0ZGRkZGRkYgZm9yIDMyLWJpdHMqLwotCi0jaWZkZWYgX19TVERDX18KLSMgIGRlZmluZSBQVFIgdm9pZCAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBQVFIgY2hhciAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgotCi1sb25nIGludCByYW5kb20gKCk7Ci0KLS8qIEFuIGltcHJvdmVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBwYWNrYWdlLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0gICByYW5kKCkvc3JhbmQoKSBsaWtlIGludGVyZmFjZSwgdGhpcyBwYWNrYWdlIGFsc28gaGFzIGEgc3BlY2lhbCBzdGF0ZSBpbmZvCi0gICBpbnRlcmZhY2UuICBUaGUgaW5pdHN0YXRlKCkgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBhIHNlZWQsIGFuIGFycmF5IG9mCi0gICBieXRlcywgYW5kIGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIGJlaW5nIHBhc3NlZCBpbjsgdGhpcyBhcnJheSBpcwotICAgdGhlbiBpbml0aWFsaXplZCB0byBjb250YWluIGluZm9ybWF0aW9uIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gd2l0aAotICAgdGhhdCBtdWNoIHN0YXRlIGluZm9ybWF0aW9uLiAgR29vZCBzaXplcyBmb3IgdGhlIGFtb3VudCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYXJlIDMyLCA2NCwgMTI4LCBhbmQgMjU2IGJ5dGVzLiAgVGhlIHN0YXRlIGNhbiBiZSBzd2l0Y2hlZCBieQotICAgY2FsbGluZyB0aGUgc2V0c3RhdGUoKSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGFycmF5IGFzIHdhcyBpbml0aWFsbGl6ZWQKLSAgIHdpdGggaW5pdHN0YXRlKCkuICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSBydW5zIHdpdGggMTI4IGJ5dGVzIG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGVzIGZhciBiZXR0ZXIgcmFuZG9tIG51bWJlcnMgdGhhbiBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIElmIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gaXMgbGVzcyB0aGFuCi0gICAzMiBieXRlcywgYSBzaW1wbGUgbGluZWFyIGNvbmdydWVudGlhbCBSLk4uRy4gaXMgdXNlZC4gIEludGVybmFsbHksIHRoZQotICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBsb25nczsgdGhlIHplcm9ldGggZWxlbWVudCBvZgotICAgdGhlIGFycmF5IGlzIHRoZSB0eXBlIG9mIFIuTi5HLiBiZWluZyB1c2VkIChzbWFsbCBpbnRlZ2VyKTsgdGhlIHJlbWFpbmRlcgotICAgb2YgdGhlIGFycmF5IGlzIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFIuTi5HLiAgVGh1cywgMzIgYnl0ZXMgb2YKLSAgIHN0YXRlIGluZm9ybWF0aW9uIHdpbGwgZ2l2ZSA3IGxvbmdzIHdvcnRoIG9mIHN0YXRlIGluZm9ybWF0aW9uLCB3aGljaCB3aWxsCi0gICBhbGxvdyBhIGRlZ3JlZSBzZXZlbiBwb2x5bm9taWFsLiAgKE5vdGU6IFRoZSB6ZXJvZXRoIHdvcmQgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFsc28gaGFzIHNvbWUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkIGluIGl0OyBzZWUgc2V0c3RhdGUKLSAgIGZvciBkZXRhaWxzKS4gIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gdGVjaG5pcXVlIGlzIGEgbGluZWFyIGZlZWRiYWNrCi0gICBzaGlmdCByZWdpc3RlciBhcHByb2FjaCwgZW1wbG95aW5nIHRyaW5vbWlhbHMgKHNpbmNlIHRoZXJlIGFyZSBmZXdlciB0ZXJtcwotICAgdG8gc3VtIHVwIHRoYXQgd2F5KS4gIEluIHRoaXMgYXBwcm9hY2gsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgYWxsCi0gICB0aGUgbnVtYmVycyBpbiB0aGUgc3RhdGUgdGFibGUgd2lsbCBhY3QgYXMgYSBsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIsCi0gICBhbmQgd2lsbCBoYXZlIHBlcmlvZCAyXmRlZyAtIDEgKHdoZXJlIGRlZyBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhc3N1bWluZyB0aGF0IHRoZSBwb2x5bm9taWFsIGlzIGlycmVkdWNpYmxlIGFuZCBwcmltaXRpdmUpLgotICAgVGhlIGhpZ2hlciBvcmRlciBiaXRzIHdpbGwgaGF2ZSBsb25nZXIgcGVyaW9kcywgc2luY2UgdGhlaXIgdmFsdWVzIGFyZQotICAgYWxzbyBpbmZsdWVuY2VkIGJ5IHBzZXVkby1yYW5kb20gY2FycmllcyBvdXQgb2YgdGhlIGxvd2VyIGJpdHMuICBUaGUKLSAgIHRvdGFsIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIGFwcHJveGltYXRlbHkgZGVnKigyKipkZWcgLSAxKTsgdGh1cwotICAgZG91YmxpbmcgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgYSB2YXN0IGluZmx1ZW5jZSBvbiB0aGUKLSAgIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yLiAgTm90ZTogVGhlIGRlZyooMioqZGVnIC0gMSkgaXMgYW4gYXBwcm94aW1hdGlvbgotICAgb25seSBnb29kIGZvciBsYXJnZSBkZWcsIHdoZW4gdGhlIHBlcmlvZCBvZiB0aGUgc2hpZnQgcmVnaXN0ZXIgaXMgdGhlCi0gICBkb21pbmFudCBmYWN0b3IuICBXaXRoIGRlZyBlcXVhbCB0byBzZXZlbiwgdGhlIHBlcmlvZCBpcyBhY3R1YWxseSBtdWNoCi0gICBsb25nZXIgdGhhbiB0aGUgNyooMioqNyAtIDEpIHByZWRpY3RlZCBieSB0aGlzIGZvcm11bGEuICAqLwotCi0KLQotLyogRm9yIGVhY2ggb2YgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCB3ZSBoYXZlIGEKLSAgIGJyZWFrIHZhbHVlIG9uIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gKHlvdSBuZWVkIGF0IGxlYXN0IHRoaQotICAgYnl0ZXMgb2Ygc3RhdGUgaW5mbyB0byBzdXBwb3J0IHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpLCBhIGRlZ3JlZSBmb3IKLSAgIHRoZSBwb2x5bm9taWFsIChhY3R1YWxseSBhIHRyaW5vbWlhbCkgdGhhdCB0aGUgUi5OLkcuIGlzIGJhc2VkIG9uLCBhbmQKLSAgIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIGxvd2VyIG9yZGVyIGNvZWZmaWNpZW50cyBvZiB0aGUgdHJpbm9taWFsLiAgKi8KLQotLyogTGluZWFyIGNvbmdydWVudGlhbC4gICovCi0jZGVmaW5lCVRZUEVfMAkJMAotI2RlZmluZQlCUkVBS18wCQk4Ci0jZGVmaW5lCURFR18wCQkwCi0jZGVmaW5lCVNFUF8wCQkwCi0KLS8qIHgqKjcgKyB4KiozICsgMS4gICovCi0jZGVmaW5lCVRZUEVfMQkJMQotI2RlZmluZQlCUkVBS18xCQkzMgotI2RlZmluZQlERUdfMQkJNwotI2RlZmluZQlTRVBfMQkJMwotCi0vKiB4KioxNSArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8yCQkyCi0jZGVmaW5lCUJSRUFLXzIJCTY0Ci0jZGVmaW5lCURFR18yCQkxNQotI2RlZmluZQlTRVBfMgkJMQotCi0vKiB4KiozMSArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8zCQkzCi0jZGVmaW5lCUJSRUFLXzMJCTEyOAotI2RlZmluZQlERUdfMwkJMzEKLSNkZWZpbmUJU0VQXzMJCTMKLQotLyogeCoqNjMgKyB4ICsgMS4gICovCi0jZGVmaW5lCVRZUEVfNAkJNAotI2RlZmluZQlCUkVBS180CQkyNTYKLSNkZWZpbmUJREVHXzQJCTYzCi0jZGVmaW5lCVNFUF80CQkxCi0KLQotLyogQXJyYXkgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGluZm9ybWF0aW9uIHRvIG1ha2UgY29kZSBydW4gZmFzdGVyLgotICAgUmVsaWVzIG9uIGZhY3QgdGhhdCBUWVBFX2kgPT0gaS4gICovCi0KLSNkZWZpbmUJTUFYX1RZUEVTCTUJLyogTWF4IG51bWJlciBvZiB0eXBlcyBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQgZGVncmVlc1tNQVhfVFlQRVNdID0geyBERUdfMCwgREVHXzEsIERFR18yLCBERUdfMywgREVHXzQgfTsKLXN0YXRpYyBpbnQgc2Vwc1tNQVhfVFlQRVNdID0geyBTRVBfMCwgU0VQXzEsIFNFUF8yLCBTRVBfMywgU0VQXzQgfTsKLQotCi0KLS8qIEluaXRpYWxseSwgZXZlcnl0aGluZyBpcyBzZXQgdXAgYXMgaWYgZnJvbToKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHNyYW5kb20KLSAgIGFkdmFuY2VzIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyAxMCpyYW5kX2RlZyB0aW1lcywgYW5kIGhlbmNlIHRoZQotICAgcmVhciBwb2ludGVyIHdoaWNoIHN0YXJ0cyBhdCAwIHdpbGwgYWxzbyBlbmQgdXAgYXQgemVybzsgdGh1cyB0aGUgemVyb2V0aAotICAgZWxlbWVudCBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQKLSAgIHBvc2l0aW9uIG9mIHRoZSByZWFyIHBvaW50ZXIgaXMganVzdAotCShNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyBUWVBFXzMgPT0gVFlQRV8zLiAgKi8KLQotc3RhdGljIGxvbmcgaW50IHJhbmR0YmxbREVHXzMgKyAxXSA9Ci0gIHsgVFlQRV8zLAotICAgICAgMHg5YTMxOTAzOSwgMHgzMmQ5YzAyNCwgMHg5YjY2MzE4MiwgMHg1ZGExZjM0MiwgCi0gICAgICAweGRlM2I4MWUwLCAweGRmMGE2ZmI1LCAweGYxMDNiYzAyLCAweDQ4ZjM0MGZiLCAKLSAgICAgIDB4NzQ0OWU1NmIsIDB4YmViMWRiYjAsIDB4YWI1YzU5MTgsIDB4OTQ2NTU0ZmQsIAotICAgICAgMHg4YzJlNjgwZiwgMHhlYjNkNzk5ZiwgMHhiMTFlZTBiNywgMHgyZDQzNmI4NiwgCi0gICAgICAweGRhNjcyZTJhLCAweDE1ODhjYTg4LCAweGUzNjk3MzVkLCAweDkwNGYzNWY3LCAKLSAgICAgIDB4ZDcxNThmZDYsIDB4NmZhNmYwNTEsIDB4NjE2ZTZiOTYsIDB4YWM5NGVmZGMsIAotICAgICAgMHgzNjQxM2Y5MywgMHhjNjIyYzI5OCwgMHhmNWE0MmFiOCwgMHg4YTg4ZDc3YiwgCi0gICAgICAweGY1YWQ5ZDBlLCAweDg5OTkyMjBiLCAweDI3ZmI0N2I5Ci0gICAgfTsKLQotLyogRlBUUiBhbmQgUlBUUiBhcmUgdHdvIHBvaW50ZXJzIGludG8gdGhlIHN0YXRlIGluZm8sIGEgZnJvbnQgYW5kIGEgcmVhcgotICAgcG9pbnRlci4gIFRoZXNlIHR3byBwb2ludGVycyBhcmUgYWx3YXlzIHJhbmRfc2VwIHBsYWNlcyBhcGFydHMsIGFzIHRoZXkKLSAgIGN5Y2xlIHRocm91Z2ggdGhlIHN0YXRlIGluZm9ybWF0aW9uLiAgKFllcywgdGhpcyBkb2VzIG1lYW4gd2UgY291bGQgZ2V0Ci0gICBhd2F5IHdpdGgganVzdCBvbmUgcG9pbnRlciwgYnV0IHRoZSBjb2RlIGZvciByYW5kb20gaXMgbW9yZSBlZmZpY2llbnQKLSAgIHRoaXMgd2F5KS4gIFRoZSBwb2ludGVycyBhcmUgbGVmdCBwb3NpdGlvbmVkIGFzIHRoZXkgd291bGQgYmUgZnJvbSB0aGUgY2FsbDoKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIChUaGUgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciwgcnB0ciwgaXMgcmVhbGx5IDAgKGFzIGV4cGxhaW5lZCBhYm92ZQotICAgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmwpIGJlY2F1c2UgdGhlIHN0YXRlIHRhYmxlIHBvaW50ZXIgaXMgc2V0Ci0gICB0byBwb2ludCB0byByYW5kdGJsWzFdIChhcyBleHBsYWluZWQgYmVsb3cpLikgICovCi0KLXN0YXRpYyBsb25nIGludCAqZnB0ciA9ICZyYW5kdGJsW1NFUF8zICsgMV07Ci1zdGF0aWMgbG9uZyBpbnQgKnJwdHIgPSAmcmFuZHRibFsxXTsKLQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgcG9pbnRlciB0byB0aGUgc3RhdGUgaW5mb3JtYXRpb24gdGFibGUsCi0gICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBnZW5lcmF0b3IsIHRoZSBkZWdyZWUgb2YgdGhlIGN1cnJlbnQgcG9seW5vbWlhbAotICAgYmVpbmcgdXNlZCwgYW5kIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludGVycy4KLSAgIE5vdGUgdGhhdCBmb3IgZWZmaWNpZW5jeSBvZiByYW5kb20sIHdlIHJlbWVtYmVyIHRoZSBmaXJzdCBsb2NhdGlvbiBvZgotICAgdGhlIHN0YXRlIGluZm9ybWF0aW9uLCBub3QgdGhlIHplcm9ldGguICBIZW5jZSBpdCBpcyB2YWxpZCB0byBhY2Nlc3MKLSAgIHN0YXRlWy0xXSwgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgUi5OLkcuCi0gICBBbHNvLCB3ZSByZW1lbWJlciB0aGUgbGFzdCBsb2NhdGlvbiwgc2luY2UgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCi0gICBpbmRleGluZyBldmVyeSB0aW1lIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgZWxlbWVudCB0byBzZWUgaWYKLSAgIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyBoYXZlIHdyYXBwZWQuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgKnN0YXRlID0gJnJhbmR0YmxbMV07Ci0KLXN0YXRpYyBpbnQgcmFuZF90eXBlID0gVFlQRV8zOwotc3RhdGljIGludCByYW5kX2RlZyA9IERFR18zOwotc3RhdGljIGludCByYW5kX3NlcCA9IFNFUF8zOwotCi1zdGF0aWMgbG9uZyBpbnQgKmVuZF9wdHIgPSAmcmFuZHRibFtzaXplb2YocmFuZHRibCkgLyBzaXplb2YocmFuZHRibFswXSldOwotDAotLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNlZWQuICBJZiB0aGUKLSAgIHR5cGUgaXMgdGhlIHRyaXZpYWwgbm8tc3RhdGUtaW5mb3JtYXRpb24gdHlwZSwganVzdCByZW1lbWJlciB0aGUgc2VlZC4KLSAgIE90aGVyd2lzZSwgaW5pdGlhbGl6ZXMgc3RhdGVbXSBiYXNlZCBvbiB0aGUgZ2l2ZW4gInNlZWQiIHZpYSBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIFRoZW4sIHRoZSBwb2ludGVycyBhcmUgc2V0IHRvIGtub3duIGxvY2F0aW9ucwotICAgdGhhdCBhcmUgZXhhY3RseSByYW5kX3NlcCBwbGFjZXMgYXBhcnQuICBMYXN0bHksIGl0IGN5Y2xlcyB0aGUgc3RhdGUKLSAgIGluZm9ybWF0aW9uIGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzIHRvIGdldCByaWQgb2YgYW55IGluaXRpYWwgZGVwZW5kZW5jaWVzCi0gICBpbnRyb2R1Y2VkIGJ5IHRoZSBMLkMuUi5OLkcuICBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmxbXQotICAgZm9yIGRlZmF1bHQgdXNhZ2UgcmVsaWVzIG9uIHZhbHVlcyBwcm9kdWNlZCBieSB0aGlzIHJvdXRpbmUuICAqLwotdm9pZAotc3JhbmRvbSAoeCkKLSAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHN0YXRlWzBdID0geDsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcmVnaXN0ZXIgbG9uZyBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5kX2RlZzsgKytpKQotCXN0YXRlW2ldID0gKDExMDM1MTUxNDUgKiBzdGF0ZVtpIC0gMV0pICsgMTIzNDU7Ci0gICAgICBmcHRyID0gJnN0YXRlW3JhbmRfc2VwXTsKLSAgICAgIHJwdHIgPSAmc3RhdGVbMF07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTAgKiByYW5kX2RlZzsgKytpKQotCXJhbmRvbSgpOwotICAgIH0KLX0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBOIGJ5dGVzIGZvcgotICAgZnV0dXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gIEJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UKLSAgIGFyZSBnaXZlbiwgYW5kIHRoZSBicmVhayB2YWx1ZXMgZm9yIHRoZSBkaWZmZXJlbnQgUi5OLkcuJ3MsIHdlIGNob29zZQotICAgdGhlIGJlc3QgKGxhcmdlc3QpIG9uZSB3ZSBjYW4gYW5kIHNldCB0aGluZ3MgdXAgZm9yIGl0LiAgc3JhbmRvbSBpcwotICAgdGhlbiBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgb24gcmV0dXJuCi0gICBmcm9tIHNyYW5kb20sIHdlIHNldCBzdGF0ZVstMV0gdG8gYmUgdGhlIHR5cGUgbXVsdGlwbGV4ZWQgd2l0aCB0aGUgY3VycmVudAotICAgdmFsdWUgb2YgdGhlIHJlYXIgcG9pbnRlcjsgdGhpcyBpcyBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIGluaXRzdGF0ZSB3b24ndAotICAgbG9zZSB0aGlzIGluZm9ybWF0aW9uIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVzdGFydCB3aXRoIHNldHN0YXRlLgotICAgTm90ZTogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUsIGlmIGFueSwganVzdCBsaWtlCi0gICBzZXRzdGF0ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoZW4gaW5pdHN0YXRlIGlzIGNhbGxlZC4KLSAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbGQgc3RhdGUuICAqLwotUFRSCi1pbml0c3RhdGUgKHNlZWQsIGFyZ19zdGF0ZSwgbikKLSAgdW5zaWduZWQgaW50IHNlZWQ7Ci0gIFBUUiBhcmdfc3RhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbjsKLXsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLSAgaWYgKG4gPCBCUkVBS18xKQotICAgIHsKLSAgICAgIGlmIChuIDwgQlJFQUtfMCkKLQl7Ci0JICBlcnJubyA9IEVJTlZBTDsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzA7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8wOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzIpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8xOwotICAgICAgcmFuZF9kZWcgPSBERUdfMTsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzE7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMykKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzI7Ci0gICAgICByYW5kX2RlZyA9IERFR18yOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMjsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS180KQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMzsKLSAgICAgIHJhbmRfZGVnID0gREVHXzM7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8zOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfNDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzQ7Ci0gICAgICByYW5kX3NlcCA9IFNFUF80OwotICAgIH0KLQotICBzdGF0ZSA9ICYoKGxvbmcgaW50ICopIGFyZ19zdGF0ZSlbMV07CS8qIEZpcnN0IGxvY2F0aW9uLiAgKi8KLSAgLyogTXVzdCBzZXQgRU5EX1BUUiBiZWZvcmUgc3JhbmRvbS4gICovCi0gIGVuZF9wdHIgPSAmc3RhdGVbcmFuZF9kZWddOwotICBzcmFuZG9tKHNlZWQpOwotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHJldHVybiBvc3RhdGU7Ci19Ci0MCi0vKiBSZXN0b3JlIHRoZSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBhcnJheS4KLSAgIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIGFsc28gcmVtZW1iZXIgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcG9pbnRlcnMKLSAgIGluIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uLCBhbmQgcmVzdG9yZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgZnJvbSB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IG11bHRpcGxleGluZyB0aGUgcG9pbnRlcgotICAgbG9jYXRpb24gaW50byB0aGUgemVyb2V0aCB3b3JkIG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGR1ZQotICAgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoaW5ncyBhcmUgZG9uZSwgaXQgaXMgT0sgdG8gY2FsbCBzZXRzdGF0ZSB3aXRoIHRoZQotICAgc2FtZSBzdGF0ZSBhcyB0aGUgY3VycmVudCBzdGF0ZQotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotc2V0c3RhdGUgKGFyZ19zdGF0ZSkKLSAgUFRSIGFyZ19zdGF0ZTsKLXsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgKm5ld19zdGF0ZSA9IChsb25nIGludCAqKSBhcmdfc3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB0eXBlID0gbmV3X3N0YXRlWzBdICUgTUFYX1RZUEVTOwotICByZWdpc3RlciBpbnQgcmVhciA9IG5ld19zdGF0ZVswXSAvIE1BWF9UWVBFUzsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgVFlQRV8wOgotICAgIGNhc2UgVFlQRV8xOgotICAgIGNhc2UgVFlQRV8yOgotICAgIGNhc2UgVFlQRV8zOgotICAgIGNhc2UgVFlQRV80OgotICAgICAgcmFuZF90eXBlID0gdHlwZTsKLSAgICAgIHJhbmRfZGVnID0gZGVncmVlc1t0eXBlXTsKLSAgICAgIHJhbmRfc2VwID0gc2Vwc1t0eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBTdGF0ZSBpbmZvIG11bmdlZC4gICovCi0gICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdGF0ZSA9ICZuZXdfc3RhdGVbMV07Ci0gIGlmIChyYW5kX3R5cGUgIT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHJwdHIgPSAmc3RhdGVbcmVhcl07Ci0gICAgICBmcHRyID0gJnN0YXRlWyhyZWFyICsgcmFuZF9zZXApICUgcmFuZF9kZWddOwotICAgIH0KLSAgLyogU2V0IGVuZF9wdHIgdG9vLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIElmIHdlIGFyZSB1c2luZyB0aGUgdHJpdmlhbCBUWVBFXzAgUi5OLkcuLCBqdXN0IGRvIHRoZSBvbGQgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgYml0LiAgT3RoZXJ3aXNlLCB3ZSBkbyBvdXIgZmFuY3kgdHJpbm9taWFsIHN0dWZmLCB3aGljaCBpcyB0aGUKLSAgIHNhbWUgaW4gYWxsIHRoZXIgb3RoZXIgY2FzZXMgZHVlIHRvIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbgotICAgc2V0IHVwLiAgVGhlIGJhc2ljIG9wZXJhdGlvbiBpcyB0byBhZGQgdGhlIG51bWJlciBhdCB0aGUgcmVhciBwb2ludGVyIGludG8KLSAgIHRoZSBvbmUgYXQgdGhlIGZyb250IHBvaW50ZXIuICBUaGVuIGJvdGggcG9pbnRlcnMgYXJlIGFkdmFuY2VkIHRvIHRoZSBuZXh0Ci0gICBsb2NhdGlvbiBjeWNsaWNhbGx5IGluIHRoZSB0YWJsZS4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc3VtIGdlbmVyYXRlZCwKLSAgIHJlZHVjZWQgdG8gMzEgYml0cyBieSB0aHJvd2luZyBhd2F5IHRoZSAibGVhc3QgcmFuZG9tIiBsb3cgYml0LgotICAgTm90ZTogVGhlIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgZnJvbnQgYW5kCi0gICByZWFyIHBvaW50ZXJzIGNhbid0IHdyYXAgb24gdGhlIHNhbWUgY2FsbCBieSBub3QgdGVzdGluZyB0aGUgcmVhcgotICAgcG9pbnRlciBpZiB0aGUgZnJvbnQgb25lIGhhcyB3cmFwcGVkLiAgUmV0dXJucyBhIDMxLWJpdCByYW5kb20gbnVtYmVyLiAgKi8KLQotbG9uZyBpbnQKLXJhbmRvbSAoKQotewotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICB7Ci0gICAgICBzdGF0ZVswXSA9ICgoc3RhdGVbMF0gKiAxMTAzNTE1MjQ1KSArIDEyMzQ1KSAmIExPTkdfTUFYOwotICAgICAgcmV0dXJuIHN0YXRlWzBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW50IGk7Ci0gICAgICAqZnB0ciArPSAqcnB0cjsKLSAgICAgIC8qIENodWNraW5nIGxlYXN0IHJhbmRvbSBiaXQuICAqLwotICAgICAgaSA9ICgqZnB0ciA+PiAxKSAmIExPTkdfTUFYOwotICAgICAgKytmcHRyOwotICAgICAgaWYgKGZwdHIgPj0gZW5kX3B0cikKLQl7Ci0JICBmcHRyID0gc3RhdGU7Ci0JICArK3JwdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsrcnB0cjsKLQkgIGlmIChycHRyID49IGVuZF9wdHIpCi0JICAgIHJwdHIgPSBzdGF0ZTsKLQl9Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmVuYW1lLmMgYi9saWJpYmVydHkvcmVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjZlMmQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogcmVuYW1lIC0tIHJlbmFtZSBhIGZpbGUKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qIFJlbmFtZSBhIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotaW50Ci1yZW5hbWUgKHpmcm9tLCB6dG8pCi0gICAgIGNoYXIgKnpmcm9tOwotICAgICBjaGFyICp6dG87Ci17Ci0gIGlmIChsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0gICAgewotICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAodW5saW5rICh6dG8pIDwgMAotCSAgfHwgbGluayAoemZyb20sIHp0bykgPCAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiB1bmxpbmsgKHpmcm9tKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yaW5kZXguYyBiL2xpYmliZXJ0eS9yaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxZDEyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmluZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgcmluZGV4KCkuICovCi0KLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotCi1jaGFyICoKLXJpbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJyY2hyIChzLCBjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zZXRlbnYuYyBiL2xpYmliZXJ0eS9zZXRlbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjMTMwMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc2V0ZW52LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGJhc2VkIG9uIHNldGVudi5jIGluIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIEZvciBgc2l6ZV90JyAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAvKiBGb3IgYE5VTEwnICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICFkZWZpbmVkKGVycm5vKSAmJiAhZGVmaW5lZChIQVZFX0VSUk5PX0RFQ0wpCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0jZGVmaW5lIF9fc2V0X2Vycm5vKGV2KSAoKGVycm5vKSA9IChldikpCi0KLSNpZiBIQVZFX1NURExJQl9ICi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWYgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBfX2Vudmlyb24JZW52aXJvbgotI2lmbmRlZiBIQVZFX0VOVklST05fREVDTAotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLS8qIExPQ0sgYW5kIFVOTE9DSyBhcmUgZGVmaW5lZCBhcyBuby1vcHMuICBUaGlzIG1ha2VzIHRoZSBsaWJpYmVydHkKLSAqIGltcGxlbWVudGF0aW9uIE1ULVVuc2FmZS4gKi8KLSNkZWZpbmUgTE9DSwotI2RlZmluZSBVTkxPQ0sKLQotLyogQmVsb3cgdGhpcyBwb2ludCwgaXQncyB2ZXJiYXRpbSBjb2RlIGZyb20gdGhlIGdsaWJjLTIuMCBpbXBsZW1lbnRhdGlvbiAqLwotCi0vKiBJZiB0aGlzIHZhcmlhYmxlIGlzIG5vdCBhIG51bGwgcG9pbnRlciB3ZSBhbGxvY2F0ZWQgdGhlIGN1cnJlbnQKLSAgIGVudmlyb25tZW50LiAgKi8KLXN0YXRpYyBjaGFyICoqbGFzdF9lbnZpcm9uOwotCi0KLWludAotc2V0ZW52IChuYW1lLCB2YWx1ZSwgcmVwbGFjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdmFsdWU7Ci0gICAgIGludCByZXBsYWNlOwotewotICByZWdpc3RlciBjaGFyICoqZXA7Ci0gIHJlZ2lzdGVyIHNpemVfdCBzaXplOwotICBjb25zdCBzaXplX3QgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIGNvbnN0IHNpemVfdCB2YWxsZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0KLSAgTE9DSzsKLQotICBzaXplID0gMDsKLSAgaWYgKF9fZW52aXJvbiAhPSBOVUxMKQotICAgIGZvciAoZXAgPSBfX2Vudmlyb247ICplcCAhPSBOVUxMOyArK2VwKQotICAgICAgaWYgKCFzdHJuY21wICgqZXAsIG5hbWUsIG5hbWVsZW4pICYmICgqZXApW25hbWVsZW5dID09ICc9JykKLQlicmVhazsKLSAgICAgIGVsc2UKLQkrK3NpemU7Ci0KLSAgaWYgKF9fZW52aXJvbiA9PSBOVUxMIHx8ICplcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKipuZXdfZW52aXJvbjsKLSAgICAgIGlmIChfX2Vudmlyb24gPT0gbGFzdF9lbnZpcm9uICYmIF9fZW52aXJvbiAhPSBOVUxMKQotCS8qIFdlIGFsbG9jYXRlZCB0aGlzIHNwYWNlOyB3ZSBjYW4gZXh0ZW5kIGl0LiAgKi8KLQluZXdfZW52aXJvbiA9IChjaGFyICoqKSByZWFsbG9jIChsYXN0X2Vudmlyb24sCi0JCQkJCSAoc2l6ZSArIDIpICogc2l6ZW9mIChjaGFyICopKTsKLSAgICAgIGVsc2UKLQluZXdfZW52aXJvbiA9IChjaGFyICoqKSBtYWxsb2MgKChzaXplICsgMikgKiBzaXplb2YgKGNoYXIgKikpOwotCi0gICAgICBpZiAobmV3X2Vudmlyb24gPT0gTlVMTCkKLQl7Ci0JICBVTkxPQ0s7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBuZXdfZW52aXJvbltzaXplXSA9IG1hbGxvYyAobmFtZWxlbiArIDEgKyB2YWxsZW4pOwotICAgICAgaWYgKG5ld19lbnZpcm9uW3NpemVdID09IE5VTEwpCi0JewotCSAgZnJlZSAoKGNoYXIgKikgbmV3X2Vudmlyb24pOwotCSAgX19zZXRfZXJybm8gKEVOT01FTSk7Ci0JICBVTkxPQ0s7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpZiAoX19lbnZpcm9uICE9IGxhc3RfZW52aXJvbikKLQltZW1jcHkgKChjaGFyICopIG5ld19lbnZpcm9uLCAoY2hhciAqKSBfX2Vudmlyb24sCi0JCXNpemUgKiBzaXplb2YgKGNoYXIgKikpOwotCi0gICAgICBtZW1jcHkgKG5ld19lbnZpcm9uW3NpemVdLCBuYW1lLCBuYW1lbGVuKTsKLSAgICAgIG5ld19lbnZpcm9uW3NpemVdW25hbWVsZW5dID0gJz0nOwotICAgICAgbWVtY3B5ICgmbmV3X2Vudmlyb25bc2l6ZV1bbmFtZWxlbiArIDFdLCB2YWx1ZSwgdmFsbGVuKTsKLQotICAgICAgbmV3X2Vudmlyb25bc2l6ZSArIDFdID0gTlVMTDsKLQotICAgICAgbGFzdF9lbnZpcm9uID0gX19lbnZpcm9uID0gbmV3X2Vudmlyb247Ci0gICAgfQotICBlbHNlIGlmIChyZXBsYWNlKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCplcCk7Ci0gICAgICBpZiAobGVuICsgMSA8IG5hbWVsZW4gKyAxICsgdmFsbGVuKQotCXsKLQkgIC8qIFRoZSBleGlzdGluZyBzdHJpbmcgaXMgdG9vIHNob3J0OyBtYWxsb2MgYSBuZXcgb25lLiAgKi8KLQkgIGNoYXIgKm5ldyA9IG1hbGxvYyAobmFtZWxlbiArIDEgKyB2YWxsZW4pOwotCSAgaWYgKG5ldyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgVU5MT0NLOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgKmVwID0gbmV3OwotCX0KLSAgICAgIG1lbWNweSAoKmVwLCBuYW1lLCBuYW1lbGVuKTsKLSAgICAgICgqZXApW25hbWVsZW5dID0gJz0nOwotICAgICAgbWVtY3B5ICgmKCplcClbbmFtZWxlbiArIDFdLCB2YWx1ZSwgdmFsbGVuKTsKLSAgICB9Ci0KLSAgVU5MT0NLOwotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi11bnNldGVudiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIGNoYXIgKiplcDsKLQotICBMT0NLOwotCi0gIGZvciAoZXAgPSBfX2Vudmlyb247ICplcDsgKytlcCkKLSAgICBpZiAoIXN0cm5jbXAgKCplcCwgbmFtZSwgbGVuKSAmJiAoKmVwKVtsZW5dID09ICc9JykKLSAgICAgIHsKLQkvKiBGb3VuZCBpdC4gIFJlbW92ZSB0aGlzIHBvaW50ZXIgYnkgbW92aW5nIGxhdGVyIG9uZXMgYmFjay4gICovCi0JY2hhciAqKmRwID0gZXA7Ci0JZG8KLQkgIGRwWzBdID0gZHBbMV07Ci0Jd2hpbGUgKCpkcCsrKTsKLQkvKiBDb250aW51ZSB0aGUgbG9vcCBpbiBjYXNlIE5BTUUgYXBwZWFycyBhZ2Fpbi4gICovCi0gICAgICB9Ci0KLSAgVU5MT0NLOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYyBiL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDllNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFZlcnNpb24gb2Ygc2lnc2V0bWFzay5jCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvYW1pbi4gKi8KLQotLyogU2V0IHRoZSBjdXJyZW50IHNpZ25hbCBtYXNrIHRvIHRoZSBzZXQgcHJvdmlkZWQsIGFuZCByZXR1cm4gdGhlIAotICAgcHJldmlvdXMgdmFsdWUgKi8KLQotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLS8qIEluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IHNlZW1zIHRvIGJlIG5lZWRlZCBieSBJU0MuICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZmRlZiBTSUdfU0VUTUFTSwotaW50Ci1ERUZVTihzaWdzZXRtYXNrLChzZXQpLAotICAgICAgaW50IHNldCkKLXsKLSAgICBzaWdzZXRfdCBuZXc7Ci0gICAgc2lnc2V0X3Qgb2xkOwotICAgIAotICAgIHNpZ2VtcHR5c2V0ICgmbmV3KTsKLSAgICBpZiAoc2V0ICE9IDApIHsKLSAgICAgIGFib3J0KCk7CS8qIEZJWE1FLCB3ZSBkb24ndCBrbm93IGhvdyB0byB0cmFuc2xhdGUgb2xkIG1hc2sgdG8gbmV3ICovCi0gICAgfQotICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbmV3LCAmb2xkKTsKLSAgICByZXR1cm4gMTsJLyogRklYTUUsIHdlIGFsd2F5cyByZXR1cm4gMSBhcyBvbGQgdmFsdWUuICAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc29ydC5jIGIvbGliaWJlcnR5L3NvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZDY2MC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc29ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qIFNvcnRpbmcgYWxnb3JpdGhtcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNvcnQuaCIKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBVQ0hBUl9NQVgKLSNkZWZpbmUgVUNIQVJfTUFYICgodW5zaWduZWQgY2hhcikoLTEpKQotI2VuZGlmCi0KLS8qIFBPSU5URVJTIGFuZCBXT1JLIGFyZSBib3RoIGFycmF5cyBvZiBOIHBvaW50ZXJzLiAgV2hlbiB0aGlzCi0gICBmdW5jdGlvbiByZXR1cm5zIFBPSU5URVJTIHdpbGwgYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gICovCi0KLXZvaWQgc29ydF9wb2ludGVycyAobiwgcG9pbnRlcnMsIHdvcmspCi0gICAgIHNpemVfdCBuOwotICAgICB2b2lkICoqcG9pbnRlcnM7Ci0gICAgIHZvaWQgKip3b3JrOwotewotICAvKiBUaGUgdHlwZSBvZiBhIHNpbmdsZSBkaWdpdC4gIFRoaXMgY2FuIGJlIGFueSB1bnNpZ25lZCBpbnRlZ3JhbAotICAgICB0eXBlLiAgV2hlbiBjaGFuZ2luZyB0aGlzLCBESUdJVF9NQVggc2hvdWxkIGJlIGNoYW5nZWQgYXMgCi0gICAgIHdlbGwuICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgZGlnaXRfdDsKLQotICAvKiBUaGUgbWF4aW11bSB2YWx1ZSBhIHNpbmdsZSBkaWdpdCBjYW4gaGF2ZS4gICovCi0jZGVmaW5lIERJR0lUX01BWCAoVUNIQVJfTUFYICsgMSkKLQotICAvKiBUaGUgSXRoIGVudHJ5IGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gKlBPSU5URVJTUCB0aGF0IGhhdmUgSQotICAgICBpbiB0aGUgZGlnaXQgb24gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBzb3J0aW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvdW50W0RJR0lUX01BWF07Ci0gIC8qIE5vbnplcm8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gYSBiaWctZW5kaWFuIG1hY2hpbmUuICAqLwotICBpbnQgYmlnX2VuZGlhbl9wOwotICBzaXplX3QgaTsKLSAgc2l6ZV90IGo7Ci0KLSAgLyogVGhlIGFsZ29yaXRobSB1c2VkIGhlcmUgaXMgcmFkaXggc29ydCB3aGljaCB0YWtlcyB0aW1lIGxpbmVhciBpbgotICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gICovCi0KLSAgLyogVGhlIGFsZ29yaXRobSBoZXJlIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBzd2FwIHRoZSB0d28gYXJyYXlzCi0gICAgIGFuIGV2ZW4gbnVtYmVyIG9mIHRpbWVzLiAgKi8KLSAgaWYgKChzaXplb2YgKHZvaWQgKikgLyBzaXplb2YgKGRpZ2l0X3QpKSAlIDIgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBtYWNoaW5lLiAgKi8KLSAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBzaXplb2YgKHNpemVfdCk7ICsraSkKLSAgICB7Ci0gICAgICBqICo9IChVQ0hBUl9NQVggKyAxKTsKLSAgICAgIGogKz0gaTsKLSAgICB9Ci0gIGJpZ19lbmRpYW5fcCA9ICgoKGNoYXIgKikmailbMF0gPT0gMCk7Ci0KLSAgLyogTW92ZSB0aHJvdWdoIHRoZSBwb2ludGVyIHZhbHVlcyBmcm9tIGxlYXN0IHNpZ25pZmljYW50IHRvIG1vc3QKLSAgICAgc2lnbmlmaWNhbnQgZGlnaXRzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodm9pZCAqKSAvIHNpemVvZiAoZGlnaXRfdCk7ICsraSkKLSAgICB7Ci0gICAgICBkaWdpdF90ICpkaWdpdDsKLSAgICAgIGRpZ2l0X3QgKmJpYXM7Ci0gICAgICBkaWdpdF90ICp0b3A7Ci0gICAgICB1bnNpZ25lZCBpbnQgKmNvdW50cDsKLSAgICAgIHZvaWQgKipwb2ludGVycDsKLQotICAgICAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcG9pbnRlciB3aWxsIGRlcGVuZCBvbiB0aGUKLQkgZW5kaWFubmVzcyBvZiB0aGUgbWFjaGluZS4gICovCi0gICAgICBpZiAoYmlnX2VuZGlhbl9wKQotCWogPSBzaXplb2YgKHZvaWQgKikgLyBzaXplb2YgKGRpZ2l0X3QpIC0gaTsKLSAgICAgIGVsc2UKLQlqID0gaTsKLQkKLSAgICAgIC8qIE5vdywgcGVyZm9ybSBhIHN0YWJsZSBzb3J0IG9uIHRoaXMgZGlnaXQuICBXZSB1c2UgY291bnRpbmcKLQkgc29ydC4gICovCi0gICAgICBtZW1zZXQgKGNvdW50LCAwLCBESUdJVF9NQVggKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcHByb3ByaWF0ZSBkaWdpdCBpbiB0aGUgZmlyc3QgYW5kCi0JIG9uZS1wYXN0LXRoZS1lbmQgZWxlbWVudHMgb2YgdGhlIGFycmF5LiAgT24gYSBsaXR0bGUtZW5kaWFuCi0JIG1hY2hpbmUsIHRoZSBsZWFzdC1zaWduaWZpY2FudCBkaWdpdCBpcyBjbG9zZXN0IHRvIHRoZSBmcm9udC4gICovCi0gICAgICBiaWFzID0gKChkaWdpdF90ICopIHBvaW50ZXJzKSArIGo7Ci0gICAgICB0b3AgPSAoKGRpZ2l0X3QgKikgKHBvaW50ZXJzICsgbikpICsgajsKLQotICAgICAgLyogQ291bnQgaG93IG1hbnkgdGhlcmUgYXJlIG9mIGVhY2ggdmFsdWUuICBBdCB0aGUgZW5kIG9mIHRoaXMKLQkgbG9vcCwgQ09VTlRbS10gd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgd2hvc2UgSXRoCi0JIGRpZ2l0IGlzIEsuICAqLwotICAgICAgZm9yIChkaWdpdCA9IGJpYXM7IAotCSAgIGRpZ2l0IDwgdG9wOyAKLQkgICBkaWdpdCArPSBzaXplb2YgKHZvaWQgKikgLyBzaXplb2YgKGRpZ2l0X3QpKQotCSsrY291bnRbKmRpZ2l0XTsKLQotICAgICAgLyogTm93LCBtYWtlIENPVU5UW0tdIGNvbnRhaW4gdGhlIG51bWJlciBvZiBwb2ludGVycyB3aG9zZSBJdGgKLQkgZGlnaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEsuICAqLwotICAgICAgZm9yIChjb3VudHAgPSBjb3VudCArIDE7IGNvdW50cCA8IGNvdW50ICsgRElHSVRfTUFYOyArK2NvdW50cCkKLQkqY291bnRwICs9IGNvdW50cFstMV07Ci0KLSAgICAgIC8qIE5vdywgZHJvcCB0aGUgcG9pbnRlcnMgaW50byB0aGVpciBjb3JyZWN0IGxvY2F0aW9ucy4gICovCi0gICAgICBmb3IgKHBvaW50ZXJwID0gcG9pbnRlcnMgKyBuIC0gMTsgcG9pbnRlcnAgPj0gcG9pbnRlcnM7IC0tcG9pbnRlcnApCi0Jd29ya1stLWNvdW50WygoZGlnaXRfdCAqKSBwb2ludGVycClbal1dXSA9ICpwb2ludGVycDsKLQotICAgICAgLyogU3dhcCBXT1JLIGFuZCBQT0lOVEVSUyBzbyB0aGF0IFBPSU5URVJTIGNvbnRhaW5zIHRoZSBzb3J0ZWQKLQkgYXJyYXkuICAqLwotICAgICAgcG9pbnRlcnAgPSBwb2ludGVyczsKLSAgICAgIHBvaW50ZXJzID0gd29yazsKLSAgICAgIHdvcmsgPSBwb2ludGVycDsKLSAgICB9Ci19Ci0KLS8qIEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBhIHVuaXQgdGVzdCBmb3IgdGhlIHJvdXRpbmVzIGluIHRoaXMKLSAgIGZpbGUuICAqLwotCi0jaWZkZWYgVU5JVF9URVNUCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkICp4bWFsbG9jIChuKQotICAgICBzaXplX3QgbjsKLXsKLSAgcmV0dXJuIG1hbGxvYyAobik7Ci19Ci0KLWludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGludCBrOwotICBpbnQgcmVzdWx0OwotICBzaXplX3QgaTsKLSAgdm9pZCAqKnBvaW50ZXJzOwotICB2b2lkICoqd29yazsKLQotICBpZiAoYXJnYyA+IDEpCi0gICAgayA9IGF0b2kgKGFyZ3ZbMV0pOwotICBlbHNlCi0gICAgayA9IDEwOwotCi0gIHBvaW50ZXJzID0geG1hbGxvYyAoayAqIHNpemVvZiAodm9pZCAqKSk7Ci0gIHdvcmsgPSB4bWFsbG9jIChrICogc2l6ZW9mICh2b2lkICopKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKQotICAgIHsKLSAgICAgIHBvaW50ZXJzW2ldID0gKHZvaWQgKikgcmFuZG9tICgpOwotICAgICAgcHJpbnRmICgiJXhcbiIsIHBvaW50ZXJzW2ldKTsKLSAgICB9Ci0KLSAgc29ydF9wb2ludGVycyAoaywgcG9pbnRlcnMsIHdvcmspOwotCi0gIHByaW50ZiAoIlxuU29ydGVkXG5cbiIpOwotCi0gIHJlc3VsdCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIleFxuIiwgcG9pbnRlcnNbaV0pOwotICAgICAgaWYgKGkgPiAwICYmIChjaGFyKikgcG9pbnRlcnNbaV0gPCAoY2hhciopIHBvaW50ZXJzW2kgLSAxXSkKLQlyZXN1bHQgPSAxOwotICAgIH0KLQotICBmcmVlIChwb2ludGVycyk7Ci0gIGZyZWUgKHdvcmspOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwYWNlcy5jIGIvbGliaWJlcnR5L3NwYWNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTkyNTcxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGFjZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIEFsbG9jYXRlIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggc3BhY2VzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3BhY2VzIC0tIHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgZnVsbCBvZiBzcGFjZXMKLQotU1lOT1BTSVMKLQotCWNoYXIgKnNwYWNlcyAoaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBtZW1vcnkgcmVnaW9uIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQludW1iZXIgb2Ygc3BhY2VzIGFuZCBudWxsIHRlcm1pbmF0ZWQuICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcwotCXZhbGlkIHVudGlsIGF0IGxlYXN0IHRoZSBuZXh0IGNhbGwuCi0JCi1CVUdTCi0KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqCi1zcGFjZXMgKGNvdW50KQotICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnQ7Ci0gIHN0YXRpYyBjaGFyICpidWY7Ci0gIHN0YXRpYyBpbnQgbWF4c2l6ZTsKLQotICBpZiAoY291bnQgPiBtYXhzaXplKQotICAgIHsKLSAgICAgIGlmIChidWYpCi0JewotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgICBidWYgPSBtYWxsb2MgKGNvdW50ICsgMSk7Ci0gICAgICBpZiAoYnVmID09IChjaGFyICopIDApCi0JcmV0dXJuIDA7Ci0gICAgICBmb3IgKHQgPSBidWYgKyBjb3VudCA7IHQgIT0gYnVmIDsgKQotCXsKLQkgICotLXQgPSAnICc7Ci0JfQotICAgICAgbWF4c2l6ZSA9IGNvdW50OwotICAgICAgYnVmW2NvdW50XSA9ICdcMCc7Ci0gICAgfQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgKGJ1ZiArIG1heHNpemUgLSBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMgYi9saWJpYmVydHkvc3BsYXktdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY2ZDExLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyogQSBzcGxheS10cmVlIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBhbiBlYXNpbHkgcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygc3BsYXktdHJlZXMsIHNlZToKLQotICAgICBMZXdpcywgSGFycnkgUi4gYW5kIERlbmVuYmVyZywgTGFycnkuICBEYXRhIFN0cnVjdHVyZXMgYW5kIFRoZWlyCi0gICAgIEFsZ29yaXRobXMuICBIYXJwZXItQ29sbGlucywgSW5jLiAgMTk5MS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic3BsYXktdHJlZS5oIgotCi1zdGF0aWMgdm9pZCBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgICAgUEFSQU1TKChzcGxheV90cmVlLCAKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSkpOwotc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9zcGxheSAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1zdGF0aWMgc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCQlzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSosCi0JCQkJCQlzcGxheV90cmVlX25vZGUqLAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKikpOwotc3RhdGljIGludCBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX25vZGUsCi0JCQkJCQlzcGxheV90cmVlX2ZvcmVhY2hfZm4sCi0JCQkJCQl2b2lkKikpOwotCi0vKiBEZWFsbG9jYXRlIE5PREUgKGEgbWVtYmVyIG9mIFNQKSwgYW5kIGFsbCBpdHMgc3ViLXRyZWVzLiAgKi8KLQotc3RhdGljIHZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLXsKLSAgaWYgKCFub2RlKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0KTsKLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQpOwotCi0gIGlmIChzcC0+ZGVsZXRlX2tleSkKLSAgICAoKnNwLT5kZWxldGVfa2V5KShub2RlLT5rZXkpOwotICBpZiAoc3AtPmRlbGV0ZV92YWx1ZSkKLSAgICAoKnNwLT5kZWxldGVfdmFsdWUpKG5vZGUtPnZhbHVlKTsKLQotICBmcmVlICgoY2hhciopIG5vZGUpOwotfQotCi0vKiBIZWxwIHNwbGF5IFNQIGFyb3VuZCBLRVkuICBQQVJFTlQgYW5kIEdSQU5EUEFSRU5UIGFyZSB0aGUgcGFyZW50Ci0gICBhbmQgZ3JhbmRwYXJlbnQsIHJlc3BlY3RpdmVseSwgb2YgTk9ERS4gICovCi0KLXN0YXRpYyBzcGxheV90cmVlX25vZGUKLXNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBub2RlLCBwYXJlbnQsIGdyYW5kcGFyZW50KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqbm9kZTsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpwYXJlbnQ7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqZ3JhbmRwYXJlbnQ7Ci17Ci0gIHNwbGF5X3RyZWVfbm9kZSAqbmV4dDsKLSAgc3BsYXlfdHJlZV9ub2RlIG47Ci0gIGludCBjb21wYXJpc29uOwotICAKLSAgbiA9ICpub2RlOwotCi0gIGlmICghbikKLSAgICByZXR1cm4gKnBhcmVudDsKLQotICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkgKGtleSwgbi0+a2V5KTsKLQotICBpZiAoY29tcGFyaXNvbiA9PSAwKQotICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSB0YXJnZXQuICAqLwotICAgIG5leHQgPSAwOwotICBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkKLSAgICAvKiBUaGUgdGFyZ2V0IGlzIHRvIHRoZSBsZWZ0LiAgKi8KLSAgICBuZXh0ID0gJm4tPmxlZnQ7Ci0gIGVsc2UgCi0gICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgcmlnaHQuICAqLwotICAgIG5leHQgPSAmbi0+cmlnaHQ7Ci0KLSAgaWYgKG5leHQpCi0gICAgewotICAgICAgLyogQ29udGludWUgZG93biB0aGUgdHJlZS4gICovCi0gICAgICBuID0gc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksIG5leHQsIG5vZGUsIHBhcmVudCk7Ci0KLSAgICAgIC8qIFRoZSByZWN1cnNpdmUgY2FsbCB3aWxsIGNoYW5nZSB0aGUgcGxhY2UgdG8gd2hpY2ggTk9ERQotCSBwb2ludHMuICAqLwotICAgICAgaWYgKCpub2RlICE9IG4pCi0JcmV0dXJuIG47Ci0gICAgfQotCi0gIGlmICghcGFyZW50KQotICAgIC8qIE5PREUgaXMgdGhlIHJvb3QuICBXZSBhcmUgZG9uZS4gICovCi0gICAgcmV0dXJuIG47Ci0KLSAgLyogRmlyc3QsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBncmFuZHBhcmVudCAoaS5lLiwKLSAgICAgKlBBUkVOVCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4pICAqLwotICBpZiAoIWdyYW5kcGFyZW50KSAKLSAgICB7Ci0gICAgICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQpCi0JewotCSAgKm5vZGUgPSBuLT5yaWdodDsKLQkgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKm5vZGUgPSBuLT5sZWZ0OwotCSAgbi0+bGVmdCA9ICpwYXJlbnQ7Ci0JfQotICAgICAgKnBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogTmV4dCBoYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGJvdGggTiBhbmQgKlBBUkVOVCBhcmUgbGVmdCBjaGlsZHJlbiwKLSAgICAgb3Igd2hlcmUgYm90aCBhcmUgcmlnaHQgY2hpbGRyZW4uICAqLwotICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQgJiYgKnBhcmVudCA9PSAoKmdyYW5kcGFyZW50KS0+bGVmdCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7Ci0KLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gcC0+cmlnaHQ7Ci0gICAgICBwLT5yaWdodCA9ICpncmFuZHBhcmVudDsKLSAgICAgIHAtPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsgCi0gICAgfQotICBlbHNlIGlmICAobiA9PSAoKnBhcmVudCktPnJpZ2h0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPnJpZ2h0KQotICAgIHsKLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBwID0gKnBhcmVudDsKLQotICAgICAgKCpncmFuZHBhcmVudCktPnJpZ2h0ID0gcC0+bGVmdDsKLSAgICAgIHAtPmxlZnQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICBwLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogRmluYWxseSwgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIE4gaXMgYSBsZWZ0IGNoaWxkLCBidXQgKlBBUkVOVAotICAgICBpcyBhIHJpZ2h0IGNoaWxkLCBvciB2aWNlIHZlcnNhLiAgKi8KLSAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KSAKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0gCi0gIGVsc2UKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSAqcGFyZW50OwotICAgICAgKCpncmFuZHBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLX0KLQotLyogU3BsYXkgU1AgYXJvdW5kIEtFWS4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGxheV90cmVlX3NwbGF5IChzcCwga2V5KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci17Ci0gIGlmIChzcC0+cm9vdCA9PSAwKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgJnNwLT5yb290LCAKLQkJCSAgIC8qZ3JhbmRwYXJlbnQ9Ki8wLCAvKnBhcmVudD0qLzApOyAKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgYmVsb3cgTk9ERSwgYWxsIG9mCi0gICB3aGljaCBhcmUgZnJvbSBTUCwgZm9sbG93aW5nIGFuIGluLW9yZGVyIHRyYXZlcnNhbC4gIElmIEZOIGV2ZXJ5Ci0gICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBpdGVyYXRpb24gY2Vhc2VzIGltbWVkaWF0ZWx5LCBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuICAqLwotCi1zdGF0aWMgaW50Ci1zcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZSwgZm4sIGRhdGEpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4gZm47Ci0gICAgIHZvaWQqIGRhdGE7Ci17Ci0gIGludCB2YWw7Ci0KLSAgaWYgKCFub2RlKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0LCBmbiwgZGF0YSk7Ci0gIGlmICh2YWwpCi0gICAgcmV0dXJuIHZhbDsKLQotICB2YWwgPSAoKmZuKShub2RlLCBkYXRhKTsKLSAgaWYgKHZhbCkKLSAgICByZXR1cm4gdmFsOwotCi0gIHJldHVybiBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQsIGZuLCBkYXRhKTsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgc3BsYXkgdHJlZSwgdXNpbmcgQ09NUEFSRV9GTiB0byBjb21wYXJlIG5vZGVzLAotICAgREVMRVRFX0tFWV9GTiB0byBkZWFsbG9jYXRlIGtleXMsIGFuZCBERUxFVEVfVkFMVUVfRk4gdG8gZGVhbGxvY2F0ZQotICAgdmFsdWVzLiAgKi8KLQotc3BsYXlfdHJlZSAKLXNwbGF5X3RyZWVfbmV3IChjb21wYXJlX2ZuLCBkZWxldGVfa2V5X2ZuLCBkZWxldGVfdmFsdWVfZm4pCi0gICAgIHNwbGF5X3RyZWVfY29tcGFyZV9mbiBjb21wYXJlX2ZuOwotICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4gZGVsZXRlX2tleV9mbjsKLSAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4gZGVsZXRlX3ZhbHVlX2ZuOwotewotICBzcGxheV90cmVlIHNwID0gKHNwbGF5X3RyZWUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWVfcykpOwotICBzcC0+cm9vdCA9IDA7Ci0gIHNwLT5jb21wID0gY29tcGFyZV9mbjsKLSAgc3AtPmRlbGV0ZV9rZXkgPSBkZWxldGVfa2V5X2ZuOwotICBzcC0+ZGVsZXRlX3ZhbHVlID0gZGVsZXRlX3ZhbHVlX2ZuOwotCi0gIHJldHVybiBzcDsKLX0KLQotLyogRGVhbGxvY2F0ZSBTUC4gICovCi0KLXZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZSAoc3ApCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci17Ci0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIHNwLT5yb290KTsKLSAgZnJlZSAoKGNoYXIqKSBzcCk7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyBub2RlIChhc3NvY2lhdGluZyBLRVkgd2l0aCBEQVRBKSBpbnRvIFNQLiAgSWYgYQotICAgcHJldmlvdXMgbm9kZSB3aXRoIHRoZSBpbmRpY2F0ZWQgS0VZIGV4aXN0cywgaXRzIGRhdGEgaXMgcmVwbGFjZWQKLSAgIHdpdGggdGhlIG5ldyB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBub2RlLiAgKi8KLQotc3BsYXlfdHJlZV9ub2RlCi1zcGxheV90cmVlX2luc2VydCAoc3AsIGtleSwgdmFsdWUpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLSAgICAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLXsKLSAgaW50IGNvbXBhcmlzb24gPSAwOwotCi0gIHNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpOwotCi0gIGlmIChzcC0+cm9vdCkKLSAgICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkoc3AtPnJvb3QtPmtleSwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgY29tcGFyaXNvbiA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSByb290IG9mIHRoZSB0cmVlIGFscmVhZHkgaGFzIHRoZSBpbmRpY2F0ZWQgS0VZLCBqdXN0Ci0JIHJlcGxhY2UgdGhlIHZhbHVlIHdpdGggVkFMVUUuICAqLwotICAgICAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0JKCpzcC0+ZGVsZXRlX3ZhbHVlKShzcC0+cm9vdC0+dmFsdWUpOwotICAgICAgc3AtPnJvb3QtPnZhbHVlID0gdmFsdWU7Ci0gICAgfSAKLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSwgYW5kIGluc2VydCBpdCBhdCB0aGUgcm9vdC4gICovCi0gICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLSAgICAgIAotICAgICAgbm9kZSA9IChzcGxheV90cmVlX25vZGUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zKSk7Ci0gICAgICBub2RlLT5rZXkgPSBrZXk7Ci0gICAgICBub2RlLT52YWx1ZSA9IHZhbHVlOwotICAgICAgCi0gICAgICBpZiAoIXNwLT5yb290KQotCW5vZGUtPmxlZnQgPSBub2RlLT5yaWdodCA9IDA7Ci0gICAgICBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkKLQl7Ci0JICBub2RlLT5sZWZ0ID0gc3AtPnJvb3Q7Ci0JICBub2RlLT5yaWdodCA9IG5vZGUtPmxlZnQtPnJpZ2h0OwotCSAgbm9kZS0+bGVmdC0+cmlnaHQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBub2RlLT5yaWdodCA9IHNwLT5yb290OwotCSAgbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0LT5sZWZ0OwotCSAgbm9kZS0+cmlnaHQtPmxlZnQgPSAwOwotCX0KLQotICAgIHNwLT5yb290ID0gbm9kZTsKLSAgfQotCi0gIHJldHVybiBzcC0+cm9vdDsKLX0KLQotLyogUmVtb3ZlIEtFWSBmcm9tIFNQLiAgSXQgaXMgbm90IGFuIGVycm9yIGlmIGl0IGRpZCBub3QgZXhpc3QuICAqLwotCi12b2lkCi1zcGxheV90cmVlX3JlbW92ZSAoc3AsIGtleSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotewotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgKCpzcC0+Y29tcCkgKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgbGVmdCwgcmlnaHQ7Ci0KLSAgICAgIGxlZnQgPSBzcC0+cm9vdC0+bGVmdDsKLSAgICAgIHJpZ2h0ID0gc3AtPnJvb3QtPnJpZ2h0OwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJvb3Qgbm9kZSBpdHNlbGYuICAqLwotICAgICAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0JKCpzcC0+ZGVsZXRlX3ZhbHVlKSAoc3AtPnJvb3QtPnZhbHVlKTsKLSAgICAgIGZyZWUgKHNwLT5yb290KTsKLQotICAgICAgLyogT25lIG9mIHRoZSBjaGlsZHJlbiBpcyBub3cgdGhlIHJvb3QuICBEb2Vzbid0IG1hdHRlciBtdWNoCi0JIHdoaWNoLCBzbyBsb25nIGFzIHdlIHByZXNlcnZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB0cmVlLiAgKi8KLSAgICAgIGlmIChsZWZ0KQotCXsKLQkgIHNwLT5yb290ID0gbGVmdDsKLQotCSAgLyogSWYgdGhlcmUgd2FzIGEgcmlnaHQgY2hpbGQgYXMgd2VsbCwgaGFuZyBpdCBvZmYgdGhlIAotCSAgICAgcmlnaHQtbW9zdCBsZWFmIG9mIHRoZSBsZWZ0IGNoaWxkLiAgKi8KLQkgIGlmIChyaWdodCkKLQkgICAgewotCSAgICAgIHdoaWxlIChsZWZ0LT5yaWdodCkKLQkJbGVmdCA9IGxlZnQtPnJpZ2h0OwotCSAgICAgIGxlZnQtPnJpZ2h0ID0gcmlnaHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0Jc3AtPnJvb3QgPSByaWdodDsKLSAgICB9Ci19Ci0KLS8qIExvb2t1cCBLRVkgaW4gU1AsIHJldHVybmluZyBWQUxVRSBpZiBwcmVzZW50LCBhbmQgTlVMTCAKLSAgIG90aGVyd2lzZS4gICovCi0KLXNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9sb29rdXAgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKLSAgICByZXR1cm4gc3AtPnJvb3Q7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgaW4gU1AsIGZvbGxvd2luZyBhbgotICAgaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUKLSAgIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2ZvcmVhY2ggKHNwLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkICpkYXRhOwotewotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIHNwLT5yb290LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgaW50cy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgKGsxLCBrMikKLSAgICAgc3BsYXlfdHJlZV9rZXkgazE7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGsyOwotewotICBpZiAoKGludCkgazEgPCAoaW50KSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChpbnQpIGsxID4gKGludCkgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgcG9pbnRlcnMuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoY2hhciopIGsxIDwgKGNoYXIqKSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChjaGFyKikgazEgPiAoY2hhciopIGsyKQotICAgIHJldHVybiAxOwotICBlbHNlIAotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTkzMGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQkodWMpJ1wwMDAnLCh1YyknXDAwMScsKHVjKSdcMDAyJywodWMpJ1wwMDMnLCh1YyknXDAwNCcsKHVjKSdcMDA1JywodWMpJ1wwMDYnLCh1YyknXDAwNycsCi0JKHVjKSdcMDEwJywodWMpJ1wwMTEnLCh1YyknXDAxMicsKHVjKSdcMDEzJywodWMpJ1wwMTQnLCh1YyknXDAxNScsKHVjKSdcMDE2JywodWMpJ1wwMTcnLAotCSh1YyknXDAyMCcsKHVjKSdcMDIxJywodWMpJ1wwMjInLCh1YyknXDAyMycsKHVjKSdcMDI0JywodWMpJ1wwMjUnLCh1YyknXDAyNicsKHVjKSdcMDI3JywKLQkodWMpJ1wwMzAnLCh1YyknXDAzMScsKHVjKSdcMDMyJywodWMpJ1wwMzMnLCh1YyknXDAzNCcsKHVjKSdcMDM1JywodWMpJ1wwMzYnLCh1YyknXDAzNycsCi0JKHVjKSdcMDQwJywodWMpJ1wwNDEnLCh1YyknXDA0MicsKHVjKSdcMDQzJywodWMpJ1wwNDQnLCh1YyknXDA0NScsKHVjKSdcMDQ2JywodWMpJ1wwNDcnLAotCSh1YyknXDA1MCcsKHVjKSdcMDUxJywodWMpJ1wwNTInLCh1YyknXDA1MycsKHVjKSdcMDU0JywodWMpJ1wwNTUnLCh1YyknXDA1NicsKHVjKSdcMDU3JywKLQkodWMpJ1wwNjAnLCh1YyknXDA2MScsKHVjKSdcMDYyJywodWMpJ1wwNjMnLCh1YyknXDA2NCcsKHVjKSdcMDY1JywodWMpJ1wwNjYnLCh1YyknXDA2NycsCi0JKHVjKSdcMDcwJywodWMpJ1wwNzEnLCh1YyknXDA3MicsKHVjKSdcMDczJywodWMpJ1wwNzQnLCh1YyknXDA3NScsKHVjKSdcMDc2JywodWMpJ1wwNzcnLAotCSh1YyknXDEwMCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDEzMycsKHVjKSdcMTM0JywodWMpJ1wxMzUnLCh1YyknXDEzNicsKHVjKSdcMTM3JywKLQkodWMpJ1wxNDAnLCh1YyknXDE0MScsKHVjKSdcMTQyJywodWMpJ1wxNDMnLCh1YyknXDE0NCcsKHVjKSdcMTQ1JywodWMpJ1wxNDYnLCh1YyknXDE0NycsCi0JKHVjKSdcMTUwJywodWMpJ1wxNTEnLCh1YyknXDE1MicsKHVjKSdcMTUzJywodWMpJ1wxNTQnLCh1YyknXDE1NScsKHVjKSdcMTU2JywodWMpJ1wxNTcnLAotCSh1YyknXDE2MCcsKHVjKSdcMTYxJywodWMpJ1wxNjInLCh1YyknXDE2MycsKHVjKSdcMTY0JywodWMpJ1wxNjUnLCh1YyknXDE2NicsKHVjKSdcMTY3JywKLQkodWMpJ1wxNzAnLCh1YyknXDE3MScsKHVjKSdcMTcyJywodWMpJ1wxNzMnLCh1YyknXDE3NCcsKHVjKSdcMTc1JywodWMpJ1wxNzYnLCh1YyknXDE3NycsCi0JKHVjKSdcMjAwJywodWMpJ1wyMDEnLCh1YyknXDIwMicsKHVjKSdcMjAzJywodWMpJ1wyMDQnLCh1YyknXDIwNScsKHVjKSdcMjA2JywodWMpJ1wyMDcnLAotCSh1YyknXDIxMCcsKHVjKSdcMjExJywodWMpJ1wyMTInLCh1YyknXDIxMycsKHVjKSdcMjE0JywodWMpJ1wyMTUnLCh1YyknXDIxNicsKHVjKSdcMjE3JywKLQkodWMpJ1wyMjAnLCh1YyknXDIyMScsKHVjKSdcMjIyJywodWMpJ1wyMjMnLCh1YyknXDIyNCcsKHVjKSdcMjI1JywodWMpJ1wyMjYnLCh1YyknXDIyNycsCi0JKHVjKSdcMjMwJywodWMpJ1wyMzEnLCh1YyknXDIzMicsKHVjKSdcMjMzJywodWMpJ1wyMzQnLCh1YyknXDIzNScsKHVjKSdcMjM2JywodWMpJ1wyMzcnLAotCSh1YyknXDI0MCcsKHVjKSdcMjQxJywodWMpJ1wyNDInLCh1YyknXDI0MycsKHVjKSdcMjQ0JywodWMpJ1wyNDUnLCh1YyknXDI0NicsKHVjKSdcMjQ3JywKLQkodWMpJ1wyNTAnLCh1YyknXDI1MScsKHVjKSdcMjUyJywodWMpJ1wyNTMnLCh1YyknXDI1NCcsKHVjKSdcMjU1JywodWMpJ1wyNTYnLCh1YyknXDI1NycsCi0JKHVjKSdcMjYwJywodWMpJ1wyNjEnLCh1YyknXDI2MicsKHVjKSdcMjYzJywodWMpJ1wyNjQnLCh1YyknXDI2NScsKHVjKSdcMjY2JywodWMpJ1wyNjcnLAotCSh1YyknXDI3MCcsKHVjKSdcMjcxJywodWMpJ1wyNzInLCh1YyknXDI3MycsKHVjKSdcMjc0JywodWMpJ1wyNzUnLCh1YyknXDI3NicsKHVjKSdcMjc3JywKLQkodWMpJ1wzMDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzMzMnLCh1YyknXDMzNCcsKHVjKSdcMzM1JywodWMpJ1wzMzYnLCh1YyknXDMzNycsCi0JKHVjKSdcMzQwJywodWMpJ1wzNDEnLCh1YyknXDM0MicsKHVjKSdcMzQzJywodWMpJ1wzNDQnLCh1YyknXDM0NScsKHVjKSdcMzQ2JywodWMpJ1wzNDcnLAotCSh1YyknXDM1MCcsKHVjKSdcMzUxJywodWMpJ1wzNTInLCh1YyknXDM1MycsKHVjKSdcMzU0JywodWMpJ1wzNTUnLCh1YyknXDM1NicsKHVjKSdcMzU3JywKLQkodWMpJ1wzNjAnLCh1YyknXDM2MScsKHVjKSdcMzYyJywodWMpJ1wzNjMnLCh1YyknXDM2NCcsKHVjKSdcMzY1JywodWMpJ1wzNjYnLCh1YyknXDM2NycsCi0JKHVjKSdcMzcwJywodWMpJ1wzNzEnLCh1YyknXDM3MicsKHVjKSdcMzczJywodWMpJ1wzNzQnLCh1YyknXDM3NScsKHVjKSdcMzc2JywodWMpJ1wzNzcnLAotfTsKLQotaW50Ci1zdHJjYXNlY21wKHMxLCBzMikKLSAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7OykgewotCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOwotCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOwotCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgewotCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKLQl9Ci0JaWYgKHUxID09ICdcMCcpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNoci5jIGIvbGliaWJlcnR5L3N0cmNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0ODBmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2hyKCkKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCXN0cmNociAtLSByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJjaHIgKGNvbnN0IGNoYXIgKnMsIGludCBjKQotCi1ERVNDUklQVElPTgotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cmNociAocywgYykKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHsKLQlyZXR1cm4gKGNoYXIqKXM7Ci0gICAgICB9Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmR1cC5jIGIvbGliaWJlcnR5L3N0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg1YjM0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWNoYXIgKgotc3RyZHVwKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gICAgY2hhciAqcmVzdWx0ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKLSAgICBpZiAocmVzdWx0ID09IChjaGFyKikwKQotCXJldHVybiAoY2hhciopMDsKLSAgICBzdHJjcHkocmVzdWx0LCBzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmVycm9yLmMgYi9saWJpYmVydHkvc3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkMjIyMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDgzNCArMCwwIEBACi0vKiBFeHRlbmRlZCBzdXBwb3J0IGZvciB1c2luZyBlcnJubyB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX0VSUkxJU1QKLS8qIE5vdGUgdGhhdCBlcnJuby5oIChub3Qgc3VyZSB3aGF0IE9TKSBvciBzdGRpby5oIChCU0QgNC40LCBhdCBsZWFzdCkKLSAgIG1pZ2h0IGRlY2xhcmUgc3lzX2Vycmxpc3QgaW4gYSB3YXkgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQgY29uc2lkZXIKLSAgIGluY29tcGF0aWJsZSB3aXRoIG91ciBsYXRlciBkZWNsYXJhdGlvbiwgcGVyaGFwcyBieSB1c2luZyBjb25zdAotICAgYXR0cmlidXRlcy4gIFNvIHdlIGhpZGUgdGhlIGRlY2xhcmF0aW9uIGluIGVycm5vLmggKGlmIGFueSkgdXNpbmcgYQotICAgbWFjcm8uICovCi0jZGVmaW5lIHN5c19lcnJsaXN0IHN5c19lcnJsaXN0X18KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotI3VuZGVmIHN5c19lcnJsaXN0Ci0jZW5kaWYKLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1leHRlcm4gUFRSIG1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLWV4dGVybiBQVFIgbWVtc2V0ICgpOwotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlcnJubyB2YWx1ZXMuICBTZWUgaW50cm8oMikgaW4gbW9zdCBVTklYIHN5c3RlbXMKLSAgIFByb2dyYW1tZXJzIFJlZmVyZW5jZSBNYW51YWxzLgotCi0gICBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyBnZW5lcmFsbHkgb25seSBhY2Nlc3NlZCB3aGVuIGl0IGlzIHVzZWQgYXQgcnVudGltZQotICAgdG8gaW5pdGlhbGl6ZSBlcnJubyBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IGVycm5vCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBlcnJub3Mgd2lsbCBleGlzdCBvbiBhbGwgc3lzdGVtcy4gIFRoaXMgdGFibGUgaXMgdGhlIG9ubHkKLSAgIHRoaW5nIHRoYXQgc2hvdWxkIGhhdmUgdG8gYmUgdXBkYXRlZCBhcyBuZXcgZXJyb3IgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3QgZXJyb3JfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxlcnJuby5oPiAqLwotICBjb25zdCBjaGFyICpuYW1lOwkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLwotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0gIGNvbnN0IGNoYXIgKm1zZzsJLyogU2hvcnQgbWVzc2FnZSBhYm91dCB0aGlzIHZhbHVlICovCi0jZW5kaWYKLX07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWUsIG1zZ30KLSNlbHNlCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gZXJyb3JfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoRVBFUk0pCi0gIEVOVFJZKEVQRVJNLCAiRVBFUk0iLCAiTm90IG93bmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FTlQpCi0gIEVOVFJZKEVOT0VOVCwgIkVOT0VOVCIsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JDSCkKLSAgRU5UUlkoRVNSQ0gsICJFU1JDSCIsICJObyBzdWNoIHByb2Nlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlRSKQotICBFTlRSWShFSU5UUiwgIkVJTlRSIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU8pCi0gIEVOVFJZKEVJTywgIkVJTyIsICJJL08gZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOWElPKQotICBFTlRSWShFTlhJTywgIkVOWElPIiwgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEUyQklHKQotICBFTlRSWShFMkJJRywgIkUyQklHIiwgIkFyZyBsaXN0IHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FWEVDKQotICBFTlRSWShFTk9FWEVDLCAiRU5PRVhFQyIsICJFeGVjIGZvcm1hdCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREYpCi0gIEVOVFJZKEVCQURGLCAiRUJBREYiLCAiQmFkIGZpbGUgbnVtYmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hJTEQpCi0gIEVOVFJZKEVDSElMRCwgIkVDSElMRCIsICJObyBjaGlsZCBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVXT1VMREJMT0NLKQkvKiBQdXQgYmVmb3JlIEVBR0FJTiwgc29tZXRpbWVzIGFsaWFzZWQgKi8KLSAgRU5UUlkoRVdPVUxEQkxPQ0ssICJFV09VTERCTE9DSyIsICJPcGVyYXRpb24gd291bGQgYmxvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBR0FJTikKLSAgRU5UUlkoRUFHQUlOLCAiRUFHQUlOIiwgIk5vIG1vcmUgcHJvY2Vzc2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NRU0pCi0gIEVOVFJZKEVOT01FTSwgIkVOT01FTSIsICJOb3QgZW5vdWdoIHNwYWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUNDRVMpCi0gIEVOVFJZKEVBQ0NFUywgIkVBQ0NFUyIsICJQZXJtaXNzaW9uIGRlbmllZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUZBVUxUKQotICBFTlRSWShFRkFVTFQsICJFRkFVTFQiLCAiQmFkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RCTEspCi0gIEVOVFJZKEVOT1RCTEssICJFTk9UQkxLIiwgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJVU1kpCi0gIEVOVFJZKEVCVVNZLCAiRUJVU1kiLCAiRGV2aWNlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVFWElTVCkKLSAgRU5UUlkoRUVYSVNULCAiRUVYSVNUIiwgIkZpbGUgZXhpc3RzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWERFVikKLSAgRU5UUlkoRVhERVYsICJFWERFViIsICJDcm9zcy1kZXZpY2UgbGluayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREVWKQotICBFTlRSWShFTk9ERVYsICJFTk9ERVYiLCAiTm8gc3VjaCBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RESVIpCi0gIEVOVFJZKEVOT1RESVIsICJFTk9URElSIiwgIk5vdCBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTRElSKQotICBFTlRSWShFSVNESVIsICJFSVNESVIiLCAiSXMgYSBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlZBTCkKLSAgRU5UUlkoRUlOVkFMLCAiRUlOVkFMIiwgIkludmFsaWQgYXJndW1lbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORklMRSkKLSAgRU5UUlkoRU5GSUxFLCAiRU5GSUxFIiwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNRklMRSkKLSAgRU5UUlkoRU1GSUxFLCAiRU1GSUxFIiwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RUWSkKLSAgRU5UUlkoRU5PVFRZLCAiRU5PVFRZIiwgIk5vdCBhIHR5cGV3cml0ZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUWFRCU1kpCi0gIEVOVFJZKEVUWFRCU1ksICJFVFhUQlNZIiwgIlRleHQgZmlsZSBidXN5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgRU5UUlkoRUZCSUcsICJFRkJJRyIsICJGaWxlIHRvbyBsYXJnZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1BDKQotICBFTlRSWShFTk9TUEMsICJFTk9TUEMiLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUElQRSkKLSAgRU5UUlkoRVNQSVBFLCAiRVNQSVBFIiwgIklsbGVnYWwgc2VlayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJPRlMpCi0gIEVOVFJZKEVST0ZTLCAiRVJPRlMiLCAiUmVhZC1vbmx5IGZpbGUgc3lzdGVtIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTUxJTkspCi0gIEVOVFJZKEVNTElOSywgIkVNTElOSyIsICJUb28gbWFueSBsaW5rcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBJUEUpCi0gIEVOVFJZKEVQSVBFLCAiRVBJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET00pCi0gIEVOVFJZKEVET00sICJFRE9NIiwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkFOR0UpCi0gIEVOVFJZKEVSQU5HRSwgIkVSQU5HRSIsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTVNHKQotICBFTlRSWShFTk9NU0csICJFTk9NU0ciLCAiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJRFJNKQotICBFTlRSWShFSURSTSwgIkVJRFJNIiwgIklkZW50aWZpZXIgcmVtb3ZlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNIUk5HKQotICBFTlRSWShFQ0hSTkcsICJFQ0hSTkciLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJOU1lOQykKLSAgRU5UUlkoRUwyTlNZTkMsICJFTDJOU1lOQyIsICJMZXZlbCAyIG5vdCBzeW5jaHJvbml6ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM0hMVCkKLSAgRU5UUlkoRUwzSExULCAiRUwzSExUIiwgIkxldmVsIDMgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDNSU1QpCi0gIEVOVFJZKEVMM1JTVCwgIkVMM1JTVCIsICJMZXZlbCAzIHJlc2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTE5STkcpCi0gIEVOVFJZKEVMTlJORywgIkVMTlJORyIsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVTkFUQ0gpCi0gIEVOVFJZKEVVTkFUQ0gsICJFVU5BVENIIiwgIlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0NTSSkKLSAgRU5UUlkoRU5PQ1NJLCAiRU5PQ1NJIiwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJITFQpCi0gIEVOVFJZKEVMMkhMVCwgIkVMMkhMVCIsICJMZXZlbCAyIGhhbHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMSykKLSAgRU5UUlkoRURFQURMSywgIkVERUFETEsiLCAiRGVhZGxvY2sgY29uZGl0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9MQ0spCi0gIEVOVFJZKEVOT0xDSywgIkVOT0xDSyIsICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERSkKLSAgRU5UUlkoRUJBREUsICJFQkFERSIsICJJbnZhbGlkIGV4Y2hhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEUikKLSAgRU5UUlkoRUJBRFIsICJFQkFEUiIsICJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVhGVUxMKQotICBFTlRSWShFWEZVTEwsICJFWEZVTEwiLCAiRXhjaGFuZ2UgZnVsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQU5PKQotICBFTlRSWShFTk9BTk8sICJFTk9BTk8iLCAiTm8gYW5vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSUUMpCi0gIEVOVFJZKEVCQURSUUMsICJFQkFEUlFDIiwgIkludmFsaWQgcmVxdWVzdCBjb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEU0xUKQotICBFTlRSWShFQkFEU0xULCAiRUJBRFNMVCIsICJJbnZhbGlkIHNsb3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERUFETE9DSykKLSAgRU5UUlkoRURFQURMT0NLLCAiRURFQURMT0NLIiwgIkZpbGUgbG9ja2luZyBkZWFkbG9jayBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJGT05UKQotICBFTlRSWShFQkZPTlQsICJFQkZPTlQiLCAiQmFkIGZvbnQgZmlsZSBmb3JtYXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NUUikKLSAgRU5UUlkoRU5PU1RSLCAiRU5PU1RSIiwgIkRldmljZSBub3QgYSBzdHJlYW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0RBVEEpCi0gIEVOVFJZKEVOT0RBVEEsICJFTk9EQVRBIiwgIk5vIGRhdGEgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRSkKLSAgRU5UUlkoRVRJTUUsICJFVElNRSIsICJUaW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUikKLSAgRU5UUlkoRU5PU1IsICJFTk9TUiIsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT05FVCkKLSAgRU5UUlkoRU5PTkVULCAiRU5PTkVUIiwgIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QS0cpCi0gIEVOVFJZKEVOT1BLRywgIkVOT1BLRyIsICJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEUpCi0gIEVOVFJZKEVSRU1PVEUsICJFUkVNT1RFIiwgIk9iamVjdCBpcyByZW1vdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xJTkspCi0gIEVOVFJZKEVOT0xJTkssICJFTk9MSU5LIiwgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFEVikKLSAgRU5UUlkoRUFEViwgIkVBRFYiLCAiQWR2ZXJ0aXNlIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JNTlQpCi0gIEVOVFJZKEVTUk1OVCwgIkVTUk1OVCIsICJTcm1vdW50IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09NTSkKLSAgRU5UUlkoRUNPTU0sICJFQ09NTSIsICJDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UTykKLSAgRU5UUlkoRVBST1RPLCAiRVBST1RPIiwgIlByb3RvY29sIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTVVMVElIT1ApCi0gIEVOVFJZKEVNVUxUSUhPUCwgIkVNVUxUSUhPUCIsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET1RET1QpCi0gIEVOVFJZKEVET1RET1QsICJFRE9URE9UIiwgIlJGUyBzcGVjaWZpYyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRE1TRykKLSAgRU5UUlkoRUJBRE1TRywgIkVCQURNU0ciLCAiTm90IGEgZGF0YSBtZXNzYWdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFNRVRPT0xPTkcpCi0gIEVOVFJZKEVOQU1FVE9PTE9ORywgIkVOQU1FVE9PTE9ORyIsICJGaWxlIG5hbWUgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVPVkVSRkxPVykKLSAgRU5UUlkoRU9WRVJGTE9XLCAiRU9WRVJGTE9XIiwgIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RVTklRKQotICBFTlRSWShFTk9UVU5JUSwgIkVOT1RVTklRIiwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERkQpCi0gIEVOVFJZKEVCQURGRCwgIkVCQURGRCIsICJGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNQ0hHKQotICBFTlRSWShFUkVNQ0hHLCAiRVJFTUNIRyIsICJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQUNDKQotICBFTlRSWShFTElCQUNDLCAiRUxJQkFDQyIsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkJBRCkKLSAgRU5UUlkoRUxJQkJBRCwgIkVMSUJCQUQiLCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCU0NOKQotICBFTlRSWShFTElCU0NOLCAiRUxJQlNDTiIsICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCTUFYKQotICBFTlRSWShFTElCTUFYLCAiRUxJQk1BWCIsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkVYRUMpCi0gIEVOVFJZKEVMSUJFWEVDLCAiRUxJQkVYRUMiLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlMU0VRKQotICBFTlRSWShFSUxTRVEsICJFSUxTRVEiLCAiSWxsZWdhbCBieXRlIHNlcXVlbmNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TWVMpCi0gIEVOVFJZKEVOT1NZUywgIkVOT1NZUyIsICJPcGVyYXRpb24gbm90IGFwcGxpY2FibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMT09QKQotICBFTlRSWShFTE9PUCwgIkVMT09QIiwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVTVEFSVCkKLSAgRU5UUlkoRVJFU1RBUlQsICJFUkVTVEFSVCIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RSUElQRSkKLSAgRU5UUlkoRVNUUlBJUEUsICJFU1RSUElQRSIsICJTdHJlYW1zIHBpcGUgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RFTVBUWSkKLSAgRU5UUlkoRU5PVEVNUFRZLCAiRU5PVEVNUFRZIiwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVU0VSUykKLSAgRU5UUlkoRVVTRVJTLCAiRVVTRVJTIiwgIlRvbyBtYW55IHVzZXJzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UU09DSykKLSAgRU5UUlkoRU5PVFNPQ0ssICJFTk9UU09DSyIsICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERVNUQUREUlJFUSkKLSAgRU5UUlkoRURFU1RBRERSUkVRLCAiRURFU1RBRERSUkVRIiwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNU0dTSVpFKQotICBFTlRSWShFTVNHU0laRSwgIkVNU0dTSVpFIiwgIk1lc3NhZ2UgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UT1RZUEUpCi0gIEVOVFJZKEVQUk9UT1RZUEUsICJFUFJPVE9UWVBFIiwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PUFJPVE9PUFQpCi0gIEVOVFJZKEVOT1BST1RPT1BULCAiRU5PUFJPVE9PUFQiLCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPTk9TVVBQT1JUKQotICBFTlRSWShFUFJPVE9OT1NVUFBPUlQsICJFUFJPVE9OT1NVUFBPUlQiLCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNPQ0tUTk9TVVBQT1JUKQotICBFTlRSWShFU09DS1ROT1NVUFBPUlQsICJFU09DS1ROT1NVUFBPUlQiLCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9QTk9UU1VQUCkKLSAgRU5UUlkoRU9QTk9UU1VQUCwgIkVPUE5PVFNVUFAiLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUEZOT1NVUFBPUlQpCi0gIEVOVFJZKEVQRk5PU1VQUE9SVCwgIkVQRk5PU1VQUE9SVCIsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFGTk9TVVBQT1JUKQotICBFTlRSWShFQUZOT1NVUFBPUlQsICJFQUZOT1NVUFBPUlQiLCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJJTlVTRSkKLSAgRU5UUlkoRUFERFJJTlVTRSwgIkVBRERSSU5VU0UiLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJOT1RBVkFJTCkKLSAgRU5UUlkoRUFERFJOT1RBVkFJTCwgIkVBRERSTk9UQVZBSUwiLCJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVURE9XTikKLSAgRU5UUlkoRU5FVERPV04sICJFTkVURE9XTiIsICJOZXR3b3JrIGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRVTlJFQUNIKQotICBFTlRSWShFTkVUVU5SRUFDSCwgIkVORVRVTlJFQUNIIiwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRSRVNFVCkKLSAgRU5UUlkoRU5FVFJFU0VULCAiRU5FVFJFU0VUIiwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OQUJPUlRFRCkKLSAgRU5UUlkoRUNPTk5BQk9SVEVELCAiRUNPTk5BQk9SVEVEIiwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTlJFU0VUKQotICBFTlRSWShFQ09OTlJFU0VULCAiRUNPTk5SRVNFVCIsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0JVRlMpCi0gIEVOVFJZKEVOT0JVRlMsICJFTk9CVUZTIiwgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU0NPTk4pCi0gIEVOVFJZKEVJU0NPTk4sICJFSVNDT05OIiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVENPTk4pCi0gIEVOVFJZKEVOT1RDT05OLCAiRU5PVENPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTSFVURE9XTikKLSAgRU5UUlkoRVNIVVRET1dOLCAiRVNIVVRET1dOIiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRPT01BTllSRUZTKQotICBFTlRSWShFVE9PTUFOWVJFRlMsICJFVE9PTUFOWVJFRlMiLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRJTUVET1VUKQotICBFTlRSWShFVElNRURPVVQsICJFVElNRURPVVQiLCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVGVVNFRCkKLSAgRU5UUlkoRUNPTk5SRUZVU0VELCAiRUNPTk5SRUZVU0VEIiwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUhPU1RET1dOKQotICBFTlRSWShFSE9TVERPV04sICJFSE9TVERPV04iLCAiSG9zdCBpcyBkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVFVOUkVBQ0gpCi0gIEVOVFJZKEVIT1NUVU5SRUFDSCwgIkVIT1NUVU5SRUFDSCIsICJObyByb3V0ZSB0byBob3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUxSRUFEWSkKLSAgRU5UUlkoRUFMUkVBRFksICJFQUxSRUFEWSIsICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOUFJPR1JFU1MpCi0gIEVOVFJZKEVJTlBST0dSRVNTLCAiRUlOUFJPR1JFU1MiLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNUQUxFKQotICBFTlRSWShFU1RBTEUsICJFU1RBTEUiLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVUNMRUFOKQotICBFTlRSWShFVUNMRUFOLCAiRVVDTEVBTiIsICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1ROQU0pCi0gIEVOVFJZKEVOT1ROQU0sICJFTk9UTkFNIiwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5BVkFJTCkKLSAgRU5UUlkoRU5BVkFJTCwgIkVOQVZBSUwiLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU05BTSkKLSAgRU5UUlkoRUlTTkFNLCAiRUlTTkFNIiwgIklzIGEgbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNT1RFSU8pCi0gIEVOVFJZKEVSRU1PVEVJTywgIkVSRU1PVEVJTyIsICJSZW1vdGUgSS9PIGVycm9yIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLSNpZmRlZiBFVk1TRVJSCi0vKiBUaGlzIGlzIG5vdCBpbiB0aGUgdGFibGUsIGJlY2F1c2UgdGhlIG51bWVyaWMgdmFsdWUgb2YgRVZNU0VSUiAoMzI3NjcpCi0gICBsaWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHN5c19lcnJsaXN0W10uICAqLwotc3RhdGljIHN0cnVjdCB7IGludCB2YWx1ZTsgY29uc3QgY2hhciAqbmFtZSwgKm1zZzsgfQotICBldm1zZXJyID0geyBFVk1TRVJSLCAiRVZNU0VSUiIsICJWTVMtc3BlY2lmaWMgZXJyb3IiIH07Ci0jZW5kaWYKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLiAgSW5kZXhlZCBieSB0aGUKLSAgIGVycm5vIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqZXJyb3JfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9lcnJvcl9uYW1lcyA9IDA7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZSwgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuICBJbmRleGVkIGJ5IHRoZSBlcnJubyB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi1zdGF0aWMgaW50IHN5c19uZXJyOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfZXJybGlzdDsKLQotI2Vsc2UKLQotZXh0ZXJuIGludCBzeXNfbmVycjsKLWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X2Vycm9yX3RhYmxlcyAtLSBpbml0aWFsaXplIHRoZSBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIHZvaWQgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgZXJyb3JfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgZXJyb3JfbmFtZXMgYW5kIHRoZSBzeXNfZXJybGlzdCAoaWYgbmVlZGVkKSB0YWJsZXMsIHdoaWNoIGFyZQotCWluZGV4ZWQgYXQgcnVudGltZSBieSBhIHNwZWNpZmljIGVycm5vIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZXJyb3JfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlcnJvcl9pbmZvICplaXA7Ci0gIGludCBuYnl0ZXM7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNjYW5uZWQgdGhlIGVycm9yX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBlcnJubyB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX2Vycm9yX25hbWVzID09IDApCi0gICAgewotICAgICAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fZXJyb3JfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fZXJyb3JfbmFtZXMgPSBlaXAgLT4gdmFsdWUgKyAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgZXJyb3JfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChlcnJvcl9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChlcnJvcl9uYW1lcywgMCwgbmJ5dGVzKTsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgZXJyb3JfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19lcnJsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGVycm9yX3RhYmxlLiAqLwotCi0gIGlmIChzeXNfZXJybGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9lcnJvcl9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX2Vycmxpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX2Vycmxpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbmVyciA9IG51bV9lcnJvcl9uYW1lczsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc3lzX2Vycmxpc3RbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBtc2c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLQotfQotCi0vKgotCi1OQU1FCi0KLQllcnJub19tYXggLS0gcmV0dXJuIHRoZSBtYXggZXJybm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBlcnJub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIGVycm5vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfZXJybGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwZXJyb3IoM0MpIGV4cGxpY2l0bHkgd2FybnMgdGhhdCBvbmUKLQlzaG91bGQgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHRhYmxlIChzeXNfbmVycikgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBlcnJvciBjb2RlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBiZWZvcmUgdGhleSBhcmUKLQlhZGRlZCB0byB0aGUgdGFibGUuICBUaHVzIHN5c19uZXJyIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3QgZXJybm8gdmFsdWUgZGVmaW5lZCBpbiA8ZXJybm8uaD4uCi0KLQlXZSByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBtZWFuaW5nZnVsCi0Jc3ltYm9saWMgbmFtZSBvciBtZXNzYWdlLgotCi0qLwotCi1pbnQKLWVycm5vX21heCAoKQotewotICBpbnQgbWF4c2l6ZTsKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uZXJyLCBudW1fZXJyb3JfbmFtZXMpOwotICByZXR1cm4gKG1heHNpemUgLSAxKTsKLX0KLQotI2lmbmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qCi0KLU5BTUUKLQotCXN0cmVycm9yIC0tIG1hcCBhbiBlcnJvciBudW1iZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKnN0cmVycm9yIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlNYXBzIGFuIGVycm5vIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGVzIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lCi0JYXMgdGhlIG9uZXMgdXNlZCBieSBwZXJyb3IoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfZXJybGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCWVycm9yIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIkVycm9yIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQllcnJvciBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gc3lzX2Vycmxpc3QsCi0JcmV0dXJucyBOVUxMLgotCi0JVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSB1bnRpbCB0aGUKLQluZXh0IGNhbGwgdG8gc3RyZXJyb3IuCi0KLSovCi0KLWNoYXIgKgotc3RyZXJyb3IgKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0jZW5kaWYKLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IHN5c19uZXJyKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbXNnID0gZXZtc2Vyci5tc2c7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfZXJybGlzdCA9PSBOVUxMKSB8fCAoc3lzX2Vycmxpc3RbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX2Vycmxpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbXNnID0gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub3ZhbF07Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYJLyogISBIQVZFX1NUUkVSUk9SICovCi0KLQotLyoKLQotTkFNRQotCi0Jc3RyZXJybm8gLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJlcnJubyAoaW50IGVycm5vdmFsKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gZXJyb3IgbnVtYmVyIHJldHVybmVkIGZyb20gYSBzeXN0ZW0gY2FsbCAodHlwaWNhbGx5Ci0JcmV0dXJuZWQgaW4gZXJybm8pLCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZQotCXN5bWJvbGljIG5hbWUgb2YgdGhhdCBlcnJvciBudW1iZXIsIGFzIGZvdW5kIGluIDxlcnJuby5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHN5bWJvbGljIG5hbWVzLCBidXQgbm8gbmFtZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIGVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cmVycm5vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cmVycm5vIChlcnJub3ZhbCkKLSAgaW50IGVycm5vdmFsOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IG51bV9lcnJvcl9uYW1lcykpCi0gICAgewotI2lmZGVmIEVWTVNFUlIKLSAgICAgIGlmIChlcnJub3ZhbCA9PSBldm1zZXJyLnZhbHVlKQotCW5hbWUgPSBldm1zZXJyLm5hbWU7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXJyb3JfbmFtZXMgPT0gTlVMTCkgfHwgKGVycm9yX25hbWVzW2Vycm5vdmFsXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIGVycm9yX25hbWVzIG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJFcnJvciAlZCIsIGVycm5vdmFsKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBlcnJvcl9uYW1lc1tlcnJub3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCXN0cnRvZXJybm8gLS0gbWFwIGEgc3ltYm9saWMgZXJybm8gbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b2Vycm5vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBlcnJvciBudW1iZXIsIG1hcCBpdCB0byBhbiBlcnJubyB2YWx1ZS4KLQlJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyAwLgotCi0qLwotCi1pbnQKLXN0cnRvZXJybm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBlcnJub3ZhbCA9IDA7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKGVycm5vdmFsID0gMDsgZXJybm92YWwgPCBudW1fZXJyb3JfbmFtZXM7IGVycm5vdmFsKyspCi0JewotCSAgaWYgKChlcnJvcl9uYW1lc1tlcnJub3ZhbF0gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lc1tlcnJub3ZhbF0pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZXJybm92YWwgPT0gbnVtX2Vycm9yX25hbWVzKQotCXsKLSNpZmRlZiBFVk1TRVJSCi0JICBpZiAoc3RyY21wIChuYW1lLCBldm1zZXJyLm5hbWUpID09IDApCi0JICAgIGVycm5vdmFsID0gZXZtc2Vyci52YWx1ZTsKLQkgIGVsc2UKLSNlbmRpZgotCSAgZXJybm92YWwgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoZXJybm92YWwpOwotfQotCi0KLS8qIEEgc2ltcGxlIGxpdHRsZSBtYWluIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwcmludCBhbGwgdGhlIGVycm5vIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgZXJybjsKLSAgaW50IGVycm5tYXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm1zZzsKLSAgY2hhciAqc3RyZXJyb3IgKCk7Ci0KLSAgZXJybm1heCA9IGVycm5vX21heCAoKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBuYW1lcyB0YWJsZS5cbiIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbmVycik7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBlcnJubWF4KTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKGVycm4gPSAwOyBlcnJuIDw9IGVycm5tYXg7IGVycm4rKykKLSAgICB7Ci0gICAgICBuYW1lID0gc3RyZXJybm8gKGVycm4pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3RyZXJyb3IgKGVycm4pOwotICAgICAgbXNnID0gKG1zZyA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbXNnOwotICAgICAgcHJpbnRmICgiJS00ZCUtMThzJXNcbiIsIGVycm4sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODVjYWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0gKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQotICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpc3RyY2FzZWNtcC5jCTUuNSAoQmVya2VsZXkpIDExLzI0Lzg3IjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGFycmF5IGlzIGRlc2lnbmVkIGZvciBtYXBwaW5nIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcgotICogdG9nZXRoZXIgZm9yIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uLiAgVGhlIG1hcHBpbmdzIGFyZQotICogYmFzZWQgdXBvbiBhc2NpaSBjaGFyYWN0ZXIgc2VxdWVuY2VzLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjaGFybWFwW10gPSB7Ci0JJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCi0JJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCi0JJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCi0JJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCi0JJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCi0JJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCi0JJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCi0JJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCi0JJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCi0JJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCi0JJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCi0JJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCi0JJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCi0JJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCi0JJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCi0JJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCi0JJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCi0JJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCi0JJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCi0JJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCi19OwotCi1pbnQKLXN0cm5jYXNlY21wKHMxLCBzMiwgbikKLQljb25zdCBjaGFyICpzMSwgKnMyOwotCXJlZ2lzdGVyIHNpemVfdCBuOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7IG4gIT0gMDsgLS1uKSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnJjaHIuYyBiL2xpYmliZXJ0eS9zdHJyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDViY2IuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RycmNocigpLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlzdHJyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCi0KLVNZTk9QU0lTCi0JY2hhciAqc3RycmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCi0Jc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KLQkKLUJVR1MKLQlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KLQlkZXBlbmRlbnQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotY2hhciAqCi1zdHJyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgY2hhciAqcnRudmFsID0gMDsKLQotICBkbyB7Ci0gICAgaWYgKCpzID09IGMpCi0gICAgICBydG52YWwgPSAoY2hhciopIHM7Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKHJ0bnZhbCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMgYi9saWJpYmVydHkvc3Ryc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjUzMjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnNpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIHNpZ25hbCB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBXZSBuZWVkIHRvIGRlY2xhcmUgc3lzX3NpZ2xpc3QsIGJlY2F1c2UgZXZlbiBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzCi0gICBpdCB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBpdCBpcyBkZWNsYXJlZCBpbiA8c2lnbmFsLmg+IChmb3IgZXhhbXBsZSwKLSAgIFN1bk9TIHByb3ZpZGVzIHN5c19zaWdsaXN0LCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSBpdCBpbiBhbnkKLSAgIGhlYWRlciBmaWxlKS4gIGZIb3dldmVyLCB3ZSBjYW4ndCBkZWNsYXJlIHN5c19zaWdsaXN0IHBvcnRhYmx5LAotICAgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgaXMgZGVjbGFyZWQgd2l0aCBjb25zdCBhbmQgb24gc29tZQotICAgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgSWYgd2Ugd2VyZSB1c2luZyBhdXRvY29uZiwKLSAgIHdlIGNvdWxkIHdvcmsgb3V0IHRoZSByaWdodCBkZWNsYXJhdGlvbi4gIFVudGlsLCB0aGVuIHdlIGp1c3QKLSAgIGlnbm9yZSBhbnkgZGVjbGFyYXRpb24gaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMsIGFuZCBhbHdheXMKLSAgIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLiAgV2l0aCBsdWNrLCB0aGlzIHdpbGwgYWx3YXlzIHdvcmsuICAqLwotI2RlZmluZSBzeXNfc2lnbGlzdCBub19zdWNoX3N5bWJvbAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1leHRlcm4gUFRSIG1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLWV4dGVybiBQVFIgbWVtc2V0ICgpOwotI2VuZGlmCi0KLS8qIFVuZGVmaW5lIHRoZSBtYWNybyB3ZSB1c2VkIHRvIGhpZGUgdGhlIGRlZmluaXRpb24gb2Ygc3lzX3NpZ2xpc3QKLSAgIGZvdW5kIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBzeXNfc2lnbGlzdAotCi0jaWZuZGVmIE5VTEwKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE5VTEwgMAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9zaWduYWxfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIHNpZ25hbCB2YWx1ZXMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIHNpZ25hbCBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IHNpZ25hbAotICAgdmFsdWUuCi0KLSAgIE5vdCBhbGwgb2YgdGhlc2Ugc2lnbmFscyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBzaWduYWwgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3Qgc2lnbmFsX2luZm8KLXsKLSAgaW50IHZhbHVlOwkJLyogVGhlIG51bWVyaWMgdmFsdWUgZnJvbSA8c2lnbmFsLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gc2lnbmFsX3RhYmxlW10gPQotewotI2lmIGRlZmluZWQgKFNJR0hVUCkKLSAgRU5UUlkoU0lHSFVQLCAiU0lHSFVQIiwgIkhhbmd1cCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU5UKQotICBFTlRSWShTSUdJTlQsICJTSUdJTlQiLCAiSW50ZXJydXB0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdRVUlUKQotICBFTlRSWShTSUdRVUlULCAiU0lHUVVJVCIsICJRdWl0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTEwpCi0gIEVOVFJZKFNJR0lMTCwgIlNJR0lMTCIsICJJbGxlZ2FsIGluc3RydWN0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUUkFQKQotICBFTlRSWShTSUdUUkFQLCAiU0lHVFJBUCIsICJUcmFjZS9icmVha3BvaW50IHRyYXAiKSwKLSNlbmRpZgotLyogUHV0IFNJR0lPVCBiZWZvcmUgU0lHQUJSVCwgc28gdGhhdCBpZiBTSUdJT1Q9PVNJR0FCUlQgdGhlbiBTSUdBQlJUCi0gICBvdmVycmlkZXMgU0lHSU9ULiAgU0lHQUJSVCBpcyBpbiBBTlNJIGFuZCBQT1NJWC4xLCBhbmQgU0lHSU9UIGlzbid0LiAqLwotI2lmIGRlZmluZWQgKFNJR0lPVCkKLSAgRU5UUlkoU0lHSU9ULCAiU0lHSU9UIiwgIklPVCB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdBQlJUKQotICBFTlRSWShTSUdBQlJULCAiU0lHQUJSVCIsICJBYm9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdFTVQpCi0gIEVOVFJZKFNJR0VNVCwgIlNJR0VNVCIsICJFbXVsYXRpb24gdHJhcCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHRlBFKQotICBFTlRSWShTSUdGUEUsICJTSUdGUEUiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0tJTEwpCi0gIEVOVFJZKFNJR0tJTEwsICJTSUdLSUxMIiwgIktpbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQlVTKQotICBFTlRSWShTSUdCVVMsICJTSUdCVVMiLCAiQnVzIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTRUdWKQotICBFTlRSWShTSUdTRUdWLCAiU0lHU0VHViIsICJTZWdtZW50YXRpb24gZmF1bHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NZUykKLSAgRU5UUlkoU0lHU1lTLCAiU0lHU1lTIiwgIkJhZCBzeXN0ZW0gY2FsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUElQRSkKLSAgRU5UUlkoU0lHUElQRSwgIlNJR1BJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FMUk0pCi0gIEVOVFJZKFNJR0FMUk0sICJTSUdBTFJNIiwgIkFsYXJtIGNsb2NrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdURVJNKQotICBFTlRSWShTSUdURVJNLCAiU0lHVEVSTSIsICJUZXJtaW5hdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVU1IxKQotICBFTlRSWShTSUdVU1IxLCAiU0lHVVNSMSIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjIpCi0gIEVOVFJZKFNJR1VTUjIsICJTSUdVU1IyIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMiIpLAotI2VuZGlmCi0vKiBQdXQgU0lHQ0xEIGJlZm9yZSBTSUdDSExELCBzbyB0aGF0IGlmIFNJR0NMRD09U0lHQ0hMRCB0aGVuIFNJR0NITEQKLSAgIG92ZXJyaWRlcyBTSUdDTEQuICBTSUdDSExEIGlzIGluIFBPWElYLjEgKi8KLSNpZiBkZWZpbmVkIChTSUdDTEQpCi0gIEVOVFJZKFNJR0NMRCwgIlNJR0NMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ0hMRCkKLSAgRU5UUlkoU0lHQ0hMRCwgIlNJR0NITEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BXUikKLSAgRU5UUlkoU0lHUFdSLCAiU0lHUFdSIiwgIlBvd2VyIGZhaWwvcmVzdGFydCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi0gIEVOVFJZKFNJR1dJTkNILCAiU0lHV0lOQ0giLCAiV2luZG93IHNpemUgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVJHKQotICBFTlRSWShTSUdVUkcsICJTSUdVUkciLCAiVXJnZW50IEkvTyBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lPKQotICAvKiAiSS9PIHBlbmRpbmciIGhhcyBhbHNvIGJlZW4gc3VnZ2VzdGVkLCBidXQgaXMgbWlzbGVhZGluZyBzaW5jZSB0aGUKLSAgICAgc2lnbmFsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBhc2tlZCBmb3IgaXQsIG5vdCBldmVyeXRpbWUKLSAgICAgSS9PIGlzIHBlbmRpbmcuICovCi0gIEVOVFJZKFNJR0lPLCAiU0lHSU8iLCAiSS9PIHBvc3NpYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQT0xMKQotICBFTlRSWShTSUdQT0xMLCAiU0lHUE9MTCIsICJQb2xsYWJsZSBldmVudCBvY2N1cnJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1RPUCkKLSAgRU5UUlkoU0lHU1RPUCwgIlNJR1NUT1AiLCAiU3RvcHBlZCAoc2lnbmFsKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFNUUCkKLSAgRU5UUlkoU0lHVFNUUCwgIlNJR1RTVFAiLCAiU3RvcHBlZCAodXNlcikiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0NPTlQpCi0gIEVOVFJZKFNJR0NPTlQsICJTSUdDT05UIiwgIkNvbnRpbnVlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgRU5UUlkoU0lHVFRJTiwgIlNJR1RUSU4iLCAiU3RvcHBlZCAodHR5IGlucHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRPVSkKLSAgRU5UUlkoU0lHVFRPVSwgIlNJR1RUT1UiLCAiU3RvcHBlZCAodHR5IG91dHB1dCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1ZUQUxSTSkKLSAgRU5UUlkoU0lHVlRBTFJNLCAiU0lHVlRBTFJNIiwgIlZpcnR1YWwgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFJPRikKLSAgRU5UUlkoU0lHUFJPRiwgIlNJR1BST0YiLCAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hDUFUpCi0gIEVOVFJZKFNJR1hDUFUsICJTSUdYQ1BVIiwgIkNQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdYRlNaKQotICBFTlRSWShTSUdYRlNaLCAiU0lHWEZTWiIsICJGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dJTkQpCi0gIEVOVFJZKFNJR1dJTkQsICJTSUdXSU5EIiwgIlNJR1dJTkQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BIT05FKQotICBFTlRSWShTSUdQSE9ORSwgIlNJR1BIT05FIiwgIlNJR1BIT05FIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMT1NUKQotICBFTlRSWShTSUdMT1NULCAiU0lHTE9TVCIsICJSZXNvdXJjZSBsb3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXQUlUSU5HKQotICBFTlRSWShTSUdXQUlUSU5HLCAiU0lHV0FJVElORyIsICJQcm9jZXNzJ3MgTFdQcyBhcmUgYmxvY2tlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTFdQKQotICBFTlRSWShTSUdMV1AsICJTSUdMV1AiLCAiU2lnbmFsIExXUCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHREFOR0VSKQotICBFTlRSWShTSUdEQU5HRVIsICJTSUdEQU5HRVIiLCAiU3dhcCBzcGFjZSBkYW5nZXJvdXNseSBsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0dSQU5UKQotICBFTlRSWShTSUdHUkFOVCwgIlNJR0dSQU5UIiwgIk1vbml0b3IgbW9kZSBncmFudGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQotICBFTlRSWShTSUdSRVRSQUNULCAiU0lHUkVUUkFDVCIsICJOZWVkIHRvIHJlbGluZ3Vpc2ggbW9uaXRvciBtb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdNU0cpCi0gIEVOVFJZKFNJR01TRywgIlNJR01TRyIsICJNb25pdG9yIG1vZGUgZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NPVU5EKQotICBFTlRSWShTSUdTT1VORCwgIlNJR1NPVU5EIiwgIlNvdW5kIGNvbXBsZXRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU0FLKQotICBFTlRSWShTSUdTQUssICJTSUdTQUsiLCAiU2VjdXJlIGF0dGVudGlvbiIpLAotI2VuZGlmCi0gIEVOVFJZKDAsIE5VTEwsIE5VTEwpCi19OwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgc2lnbmFsIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqc2lnbmFsX25hbWVzOwotc3RhdGljIGludCBudW1fc2lnbmFsX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIHNpZ25hbCB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi1zdGF0aWMgaW50IHN5c19uc2lnOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfc2lnbGlzdDsKLQotI2Vsc2UKLQotI2lmZGVmIE5TSUcKLXN0YXRpYyBpbnQgc3lzX25zaWcgPSBOU0lHOwotI2Vsc2UKLSNpZmRlZiBfTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IF9OU0lHOwotI2VuZGlmCi0jZW5kaWYKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgc3lzX3NpZ2xpc3RbXTsKLQotI2VuZGlmCi0KLQotLyoKLQotTkFNRQotCi0JaW5pdF9zaWduYWxfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgc2lnbmFsX3RhYmxlLCB3aGljaCBpcyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUsIGdlbmVyYXRlCi0JdGhlIHNpZ25hbF9uYW1lcyBhbmQgdGhlIHN5c19zaWdsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgc2lnbmFsIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfc2lnbmFsX3RhYmxlcyAoKQotewotICBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgc2lnbmFsX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBzaWduYWwgdmFsdWUsIHRoZW4gZ28gZmluZCBpdCBub3cuICovCi0KLSAgaWYgKG51bV9zaWduYWxfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fc2lnbmFsX25hbWVzKQotCSAgICB7Ci0JICAgICAgbnVtX3NpZ25hbF9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzaWduYWxfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc2lnbmFsX3RhYmxlLiAqLwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzaWduYWxfbmFtZXMgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc2lnbmFsX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc2lnbmFsX25hbWVzW2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbmFtZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzeXNfc2lnbGlzdCB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHN5c19zaWdsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX3NpZ25hbF9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX3NpZ2xpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX3NpZ2xpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbnNpZyA9IG51bV9zaWduYWxfbmFtZXM7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfc2lnbGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLQotLyoKLQotTkFNRQotCi0Jc2lnbm9fbWF4IC0tIHJldHVybiB0aGUgbWF4IHNpZ25vIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc2lnbm9fbWF4ICgpOwotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbWF4aW11bSBzaWdubyB2YWx1ZSBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIHN5bWJvbGljCi0JbmFtZSBvciBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZQotCXdlIHVzZSB0aGUgc3lzX3NpZ2xpc3Qgc3VwcGxpZWQgYnkgdGhlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yCi0JdGhlcmUgdG8gYmUgbW9yZSBzeW1ib2xpYyBuYW1lcyB0aGFuIG1lc3NhZ2VzLCBvciB2aWNlIHZlcnNhLgotCUluIGZhY3QsIHRoZSBtYW51YWwgcGFnZSBmb3IgcHNpZ25hbCgzYikgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKE5TSUcpIGJlZm9yZSBpbmRleGluZyBpdCwKLQlzaW5jZSBuZXcgc2lnbmFsIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgTlNJRyBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdmFsdWUKLQlpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IHNpZ25vIHZhbHVlIGRlZmluZWQgaW4gPHNpZ25hbC5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotc2lnbm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBtYXhzaXplID0gTUFYIChzeXNfbnNpZywgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnNpZ25hbCAtLSBtYXAgYSBzaWduYWwgbnVtYmVyIHRvIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWduYWwgKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gc2lnbmFsIG51bWJlciB0byBhbiBzaWduYWwgbWVzc2FnZSBzdHJpbmcsIHRoZSBjb250ZW50cyBvZgotCXdoaWNoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgT24gc3lzdGVtcyB3aGljaCBoYXZlIHRoZSBleHRlcm5hbAotCXZhcmlhYmxlIHN5c19zaWdsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgdXNlZAotCWJ5IHBzaWduYWwoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciB0aGUgc3lzX3NpZ2xpc3QsIGJ1dCBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQlzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfc2lnbGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJzaWduYWwuCi0KLSovCi0KLSNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKLQotY29uc3QgY2hhciAqCi1zdHJzaWduYWwgKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfc2lnbGlzdCA9PSBOVUxMKSB8fCAoc3lzX3NpZ2xpc3Rbc2lnbm9dID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX3NpZ2xpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG1zZyA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbWVzc2FnZS4gIEp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlLiAqLwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgc3lzX3NpZ2xpc3Rbc2lnbm9dOwotICAgIH0KLSAgCi0gIHJldHVybiAobXNnKTsKLX0KLQotI2VuZGlmIC8qICEgSEFWRV9TVFJTSUdOQUwgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbm8gLS0gbWFwIGFuIHNpZ25hbCBudW1iZXIgdG8gYSBzeW1ib2xpYyBuYW1lIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3Ryc2lnbm8gKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGFuIHNpZ25hbCBudW1iZXIsIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKLQl0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGF0IHNpZ25hbCBudW1iZXIsIGFzIGZvdW5kIGluIDxzaWduYWwuaD4uCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcwotCXRoZSBzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cnNpZ25vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25vIChzaWdubykKLSAgaW50IHNpZ25vOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gbnVtX3NpZ25hbF9uYW1lcykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzaWduYWxfbmFtZXMgPT0gTlVMTCkgfHwgKHNpZ25hbF9uYW1lc1tzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzaWduYWxfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBzaWduYWxfbmFtZXNbc2lnbm9dOwotICAgIH0KLQotICByZXR1cm4gKG5hbWUpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnRvc2lnbm8gLS0gbWFwIGEgc3ltYm9saWMgc2lnbmFsIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc3RydG9zaWdubyAoY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgc2lnbmFsLCBtYXAgaXQgdG8gYSBzaWduYWwgbnVtYmVyLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9zaWdubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IHNpZ25vID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0JfQotICAgICAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgbnVtX3NpZ25hbF9uYW1lczsgc2lnbm8rKykKLQl7Ci0JICBpZiAoKHNpZ25hbF9uYW1lc1tzaWdub10gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBzaWduYWxfbmFtZXNbc2lnbm9dKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNpZ25vID09IG51bV9zaWduYWxfbmFtZXMpCi0JewotCSAgc2lnbm8gPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoc2lnbm8pOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXBzaWduYWwgLS0gcHJpbnQgbWVzc2FnZSBhYm91dCBzaWduYWwgdG8gc3RkZXJyCi0KLVNZTk9QU0lTCi0KLQl2b2lkIHBzaWduYWwgKHVuc2lnbmVkIHNpZ25vLCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciB0aGUgbWVzc2FnZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiwKLQlmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNpZ25hbCBzcGVjaWZpZWQgYnkgc2lnbm8sCi0JZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgotKi8KLQotI2lmbmRlZiBIQVZFX1BTSUdOQUwKLQotdm9pZAotcHNpZ25hbCAoc2lnbm8sIG1lc3NhZ2UpCi0gIHVuc2lnbmVkIHNpZ25vOwotICBjaGFyICptZXNzYWdlOwotewotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLSAgaWYgKChzaWdubyA8PSAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIHNpZ25hbFxuIiwgbWVzc2FnZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBzeXNfc2lnbGlzdFtzaWdub10pOwotICAgIH0KLX0KLQotI2VuZGlmCS8qICEgSEFWRV9QU0lHTkFMICovCi0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgc2lnbmFsIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgc2lnbm87Ci0gIGludCBtYXhzaWdubzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIG1heHNpZ25vID0gc2lnbm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbnNpZyk7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBtYXhzaWdubyk7Ci0KLSAgLyogS2VlcCBwcmludGluZyB2YWx1ZXMgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2YgKmJvdGgqIHRhYmxlcywgbm90Ci0gICAgICplaXRoZXIqIHRhYmxlLiAgTm90ZSB0aGF0IGtub3dpbmcgdGhlIG1heGltdW0gdXNlZnVsIGluZGV4IGRvZXMgKm5vdCoKLSAgICAgcmVsaWV2ZSB1cyBvZiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGVzdGluZyB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yCi0gICAgIE5VTEwuICovCi0KLSAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDw9IG1heHNpZ25vOyBzaWdubysrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJzaWdubyAoc2lnbm8pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3Ryc2lnbmFsIChzaWdubyk7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgc2lnbm8sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzdHIuYyBiL2xpYmliZXJ0eS9zdHJzdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiMzZlMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc3Ryc3RyIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc3RyIC0tIGxvY2F0ZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBzdWJzdHJpbmcKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCWNoYXIgKnN0cnN0ciAoY2hhciAqczEsIGNoYXIgKnMyKQotCi1ERVNDUklQVElPTgotCi0JTG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJhbmNlIGluIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMSBvZgotCXRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMi4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWJzdHJpbmcKLQlmb3VuZCwgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm90IGZvdW5kLiAgSWYgUzIgcG9pbnRzIHRvIGEgc3RyaW5nCi0Jd2l0aCB6ZXJvIGxlbmd0aCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgUzEuCi0JCi1CVUdTCi0KLSovCi0KLQotLyogRklYTUU6ICBUaGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgQU5TSSBjb21waWxpYW50LiAgVGhpcyByb3V0aW5lIGhhcyBub3QKLSAgIGJlZW4gdmFsaWRhdGVkIHRvIGNvbXBseSB3aXRoIGl0LiAgLWZuZiAqLwotCi1jaGFyICoKLXN0cnN0ciAoczEsIHMyKQotICBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjaGFyICpwID0gczE7Ci0gIGV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci0gIGV4dGVybiBpbnQgc3RybmNtcCAoKTsKLSNpZiBfX0dOVUNfXz09MgotICBleHRlcm4gX19TSVpFX1RZUEVfXyBzdHJsZW4gKCk7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b2QuYyBiL2xpYmliZXJ0eS9zdHJ0b2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YzczZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2Ygc3RydG9kIGZvciBzeXN0ZW1zIHdpdGggYXRvZi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1leHRlcm4gZG91YmxlIGF0b2YgKCk7Ci0KLS8qIERpc2NsYWltZXI6IHRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBieSBDSElMTCBpbiBHREIgYW5kIHRoZXJlZm9yZQotICAgaGFzIG5vdCBiZWVuIHRlc3RlZCB3ZWxsLiAgSXQgbWF5IGhhdmUgYmVlbiB0ZXN0ZWQgZm9yIG5vdGhpbmcgZXhjZXB0Ci0gICB0aGF0IGl0IGNvbXBpbGVzLiAgKi8KLQotZG91YmxlCi1zdHJ0b2QgKHN0ciwgcHRyKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNoYXIgKipwdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKHB0ciA9PSAoY2hhciAqKikwKQotICAgIHJldHVybiBhdG9mIChzdHIpOwotICAKLSAgcCA9IHN0cjsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqcCkpCi0gICAgKytwOwotICAKLSAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCi0gICAgKytwOwotCi0gIC8qIElORiBvciBJTkZJTklUWS4gICovCi0gIGlmICgocFswXSA9PSAnaScgfHwgcFswXSA9PSAnSScpCi0gICAgICAmJiAocFsxXSA9PSAnbicgfHwgcFsxXSA9PSAnTicpCi0gICAgICAmJiAocFsyXSA9PSAnZicgfHwgcFsyXSA9PSAnRicpKQotICAgIHsKLSAgICAgIGlmICgocFszXSA9PSAnaScgfHwgcFszXSA9PSAnSScpCi0JICAmJiAocFs0XSA9PSAnbicgfHwgcFs0XSA9PSAnTicpCi0JICAmJiAocFs1XSA9PSAnaScgfHwgcFs1XSA9PSAnSScpCi0JICAmJiAocFs2XSA9PSAndCcgfHwgcFs2XSA9PSAnVCcpCi0JICAmJiAocFs3XSA9PSAneScgfHwgcFs3XSA9PSAnWScpKQotCXsKLQkgICpwdHIgPSBwICsgNzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcHRyID0gcCArIDM7Ci0JICByZXR1cm4gYXRvZiAoc3RyKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5BTiBvciBOQU4oZm9vKS4gICovCi0gIGlmICgocFswXSA9PSAnbicgfHwgcFswXSA9PSAnTicpCi0gICAgICAmJiAocFsxXSA9PSAnYScgfHwgcFsxXSA9PSAnQScpCi0gICAgICAmJiAocFsyXSA9PSAnbicgfHwgcFsyXSA9PSAnTicpKQotICAgIHsKLSAgICAgIHAgKz0gMzsKLSAgICAgIGlmICgqcCA9PSAnKCcpCi0JewotCSAgKytwOwotCSAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJyknKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyknKQotCSAgICArK3A7Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0KLSAgLyogZGlnaXRzLCB3aXRoIDAgb3IgMSBwZXJpb2RzIGluIGl0LiAgKi8KLSAgaWYgKGlzZGlnaXQgKCpwKSB8fCAqcCA9PSAnLicpCi0gICAgewotICAgICAgaW50IGdvdF9kb3QgPSAwOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKSkKLQl7Ci0JICBpZiAoKnAgPT0gJy4nKQotCSAgICBnb3RfZG90ID0gMTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIC8qIEV4cG9uZW50LiAgKi8KLSAgICAgIGlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCXsKLQkgIGludCBpOwotCSAgaSA9IDE7Ci0JICBpZiAocFtpXSA9PSAnKycgfHwgcFtpXSA9PSAnLScpCi0JICAgICsraTsKLQkgIGlmIChpc2RpZ2l0IChwW2ldKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChpc2RpZ2l0IChwW2ldKSkKLQkJKytpOwotCSAgICAgICpwdHIgPSBwICsgaTsKLQkgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLQkgICAgfQotCX0KLSAgICAgICpwdHIgPSBwOwotICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gICAgfQotICAvKiBEaWRuJ3QgZmluZCBhbnkgZGlnaXRzLiAgRG9lc24ndCBsb29rIGxpa2UgYSBudW1iZXIuICAqLwotICAqcHRyID0gc3RyOwotICByZXR1cm4gMC4wOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvbC5jIGIvbGliaWJlcnR5L3N0cnRvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY3Y2MzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIFtyZXNjaW5kZWQgMjIgSnVseSAxOTk5XQotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmIDAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEZJWE1FOiBJdCdkIGJlIG5pY2UgdG8gY29uZmlndXJlIGFyb3VuZCB0aGVzZSwgYnV0IHRoZSBpbmNsdWRlIGZpbGVzIGFyZSB0b28KLSAgIHBhaW5mdWwuICBUaGVzZSBtYWNyb3Mgc2hvdWxkIGF0IGxlYXN0IGJlIG1vcmUgcG9ydGFibGUgdGhhbiBoYXJkd2lyZWQgaGV4Ci0gICBjb25zdGFudHMuICovCi0KLSNpZm5kZWYgVUxPTkdfTUFYCi0jZGVmaW5lCVVMT05HX01BWAkoKHVuc2lnbmVkIGxvbmcpKH4wTCkpCQkvKiAweEZGRkZGRkZGICovCi0jZW5kaWYKLQotI2lmbmRlZiBMT05HX01BWAotI2RlZmluZQlMT05HX01BWAkoKGxvbmcpKFVMT05HX01BWCA+PiAxKSkJLyogMHg3RkZGRkZGRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19NSU4KLSNkZWZpbmUJTE9OR19NSU4JKChsb25nKSh+TE9OR19NQVgpKQkJLyogMHg4MDAwMDAwMCAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLgotICoKLSAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCi0gKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgotICovCi1sb25nCi1zdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKQotCWNvbnN0IGNoYXIgKm5wdHI7Ci0JY2hhciAqKmVuZHB0cjsKLQlyZWdpc3RlciBpbnQgYmFzZTsKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gbnB0cjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGFjYzsKLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1dG9mZjsKLQlyZWdpc3RlciBpbnQgbmVnID0gMCwgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNraXAgd2hpdGUgc3BhY2UgYW5kIHBpY2sgdXAgbGVhZGluZyArLy0gc2lnbiBpZiBhbnkuCi0JICogSWYgYmFzZSBpcyAwLCBhbGxvdyAweCBmb3IgaGV4IGFuZCAwIGZvciBvY3RhbCwgZWxzZQotCSAqIGFzc3VtZSBkZWNpbWFsOyBpZiBiYXNlIGlzIGFscmVhZHkgMTYsIGFsbG93IDB4LgotCSAqLwotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IDE7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAotCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQotCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKLQkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0Ci0JICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKLQkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAotCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIGxvbmdzIGlzCi0JICogWy0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3XSBhbmQgdGhlIGlucHV0IGJhc2UgaXMgMTAsCi0JICogY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDIxNDc0ODM2NCBhbmQgY3V0bGltIHRvIGVpdGhlcgotCSAqIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUgYWNjdW11bGF0ZWQKLQkgKiBhIHZhbHVlID4gMjE0NzQ4MzY0LCBvciBlcXVhbCBidXQgdGhlIG5leHQgZGlnaXQgaXMgPiA3IChvciA4KSwKLQkgKiB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsIHJldHVybiBhIHJhbmdlIGVycm9yLgotCSAqCi0JICogU2V0IGFueSBpZiBhbnkgYGRpZ2l0cycgY29uc3VtZWQ7IG1ha2UgaXQgbmVnYXRpdmUgdG8gaW5kaWNhdGUKLQkgKiBvdmVyZmxvdy4KLQkgKi8KLQljdXRvZmYgPSBuZWcgPyAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4gOiBMT05HX01BWDsKLQljdXRsaW0gPSBjdXRvZmYgJSAodW5zaWduZWQgbG9uZyliYXNlOwotCWN1dG9mZiAvPSAodW5zaWduZWQgbG9uZyliYXNlOwotCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAqcysrKSB7Ci0JCWlmIChpc2RpZ2l0KGMpKQotCQkJYyAtPSAnMCc7Ci0JCWVsc2UgaWYgKGlzYWxwaGEoYykpCi0JCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOwotCQllbHNlCi0JCQlicmVhazsKLQkJaWYgKGMgPj0gYmFzZSkKLQkJCWJyZWFrOwotCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gbmVnID8gTE9OR19NSU4gOiBMT05HX01BWDsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JfSBlbHNlIGlmIChuZWcpCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvdWwuYyBiL2xpYmliZXJ0eS9zdHJ0b3VsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzMyMDQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBbcmVzY2luZGVkIDIyIEp1bHkgMTk5OV0KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotdW5zaWduZWQgbG9uZwotc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2VlIHN0cnRvbCBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCWN1dG9mZiA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAvICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0bGltID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gVUxPTkdfTUFYOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKG5lZykKLQkJYWNjID0gLWFjYzsKLQlpZiAoZW5kcHRyICE9IDApCi0JCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKLQlyZXR1cm4gKGFjYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdGVzdHN1aXRlL01ha2VmaWxlLmluIGIvbGliaWJlcnR5L3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZGRkMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdGVzdHN1aXRlL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIwotIyBNYWtlZmlsZQotIyAgIENvcHlyaWdodCAoQykgMTk5OQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi0jIExpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0jIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0jIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLQotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5L3Rlc3RzdWl0ZSBkaXJlY3RvcnkKLSMKLQotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotU0hFTEwgPSBAU0hFTExACi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotCi0jIE11bHRpbGliIHN1cHBvcnQgdmFyaWFibGVzLgotTVVMVElTUkNUT1AgPQotCi1JTkNESVI9JChzcmNkaXIpLy4uLyQoTVVMVElTUkNUT1ApLi4vaW5jbHVkZQotCi1hbGw6Ci0KLWNoZWNrOiBAQ0hFQ0tACi0KLSMgUnVuIHNvbWUgdGVzdHMgb2YgdGhlIGRlbWFuZ2xlci4KLWNoZWNrLWNwbHVzLWRlbTogdGVzdC1maWx0ZXIgJChzcmNkaXIpL2RlbWFuZ2xlLWV4cGVjdGVkCi0JJChTSEVMTCkgJChzcmNkaXIpL3JlZ3Jlc3MtZGVtYW5nbGUgJChzcmNkaXIpL2RlbWFuZ2xlLWV4cGVjdGVkCi0KLSMgTm90ZSB0aGF0IHdlIGp1c3QgaGFyZC1jb2RlIHByZXBlbmRzX3VuZGVyc2NvcmUgdG8gMC4gIFRoaXMgZG9lc24ndAotIyBtYXR0ZXIgc2luY2UgYW55IHBhcnRpY3VsYXIgdGVzdCBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaWYgbmVlZAotIyBiZS4KLVRFU1RfQ09NUElMRSA9ICQoQ0MpIEBERUZTQCAkKExJQkNGTEFHUykgLUkuLiAtSSQoSU5DRElSKSAkKEhERUZJTkVTKQotdGVzdC1maWx0ZXI6ICQoc3JjZGlyKS8uLi9jcGx1cy1kZW0uYwotCWVjaG8gJ2ludCBwcmVwZW5kc191bmRlcnNjb3JlID0gMDsnID4gdGVzdC11cy5jCi0JJChURVNUX0NPTVBJTEUpIC1vIHRlc3QtZmlsdGVyIC1ETUFJTiAtRFZFUlNJT049JyJub25lIicgQERFRlNAIFwKLQkJJChzcmNkaXIpLy4uL2NwbHVzLWRlbS5jIHRlc3QtdXMuYyAtTC4uIC1saWJlcnR5Ci0KLQotIyBTdGFuZGFyZCAoZWl0aGVyIEdOVSBvciBDeWdudXMpIHJ1bGVzIHdlIGRvbid0IHVzZS4KLWluZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpIGluc3RhbGwgZXRhZ3MgdGFncyBpbnN0YWxsY2hlY2s6Ci0KLSMgVGhlIHN0YW5kYXJkIGNsZWFuIHJ1bGVzLgotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgdGVzdC11cy5jIHRlc3QtZmlsdGVyCi1jbGVhbjogbW9zdGx5Y2xlYW4KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGRpc3RjbGVhbgotCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gLi4vY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz10ZXN0c3VpdGUvTWFrZWZpbGUgQ09ORklHX0hFQURFUlM9IFwKLQkgIGNkIC4uICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9kZW1hbmdsZS1leHBlY3RlZCBiL2xpYmliZXJ0eS90ZXN0c3VpdGUvZGVtYW5nbGUtZXhwZWN0ZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTFmZTQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9kZW1hbmdsZS1leHBlY3RlZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ODggKzAsMCBAQAotIyBUaGlzIGZpbGUgaG9sZHMgdGVzdCBjYXNlcyBmb3IgdGhlIGRlbWFuZ2xlci4KLSMgRWFjaCB0ZXN0IGNvbnNpc3RzIG9mIHRocmVlIGxpbmVzIGluIHN1Y2Nlc3Npb24uCi0jIFRoZSBmaXJzdCBsaW5lIGlzIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0ZXN0IGZpbHRlciBwcm9ncmFtLgotIyBUaGUgc2Vjb25kIGxpbmUgaXMgdGhlIG1hbmdsZWQgc3RyaW5nLgotIyBUaGUgdGhpcmQgbGluZSBpcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LgotIyBBIGxpbmUgc3RhcnRpbmcgd2l0aCBgIycgaXMgaWdub3JlLgotIyBIb3dldmVyIGJsYW5rIGxpbmVzIGluIHRoaXMgZmlsZSBhcmUgTk9UIGlnbm9yZWQuCi0jCi0tLWZvcm1hdD1nbnUKLUFkZEFsaWdubWVudF9fOWl2VFNvbHZlclVpUDEyaXZJbnRlcmFjdG9yUDdpdlRHbHVlCi1pdlRTb2x2ZXI6OkFkZEFsaWdubWVudCh1bnNpZ25lZCBpbnQsIGl2SW50ZXJhY3RvciAqLCBpdlRHbHVlICopCi0jCi0tLWZvcm1hdD1nbnUKLUFycm93aGVhZEludGVyc2VjdHNfXzlBcnJvd0xpbmVQOUFycm93aGVhZFI2Qm94T2JqUDdHcmFwaGljCi1BcnJvd0xpbmU6OkFycm93aGVhZEludGVyc2VjdHMoQXJyb3doZWFkICosIEJveE9iaiAmLCBHcmFwaGljICopCi0jCi0tLWZvcm1hdD1nbnUKLUF0RW5kX18xM2l2UnViYmVyR3JvdXAKLWl2UnViYmVyR3JvdXA6OkF0RW5kKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLUJnRmlsdGVyX185aXZUU29sdmVyUDEyaXZJbnRlcmFjdG9yCi1pdlRTb2x2ZXI6OkJnRmlsdGVyKGl2SW50ZXJhY3RvciAqKQotIwotLS1mb3JtYXQ9Z251Ci1DaGVja19fNlVBcnJheWkKLVVBcnJheTo6Q2hlY2soaW50KQotIwotLS1mb3JtYXQ9Z251Ci1Db3JlQ29uc3REZWNsc19fOFRleHRDb2RlUjdvc3RyZWFtCi1UZXh0Q29kZTo6Q29yZUNvbnN0RGVjbHMob3N0cmVhbSAmKQotIwotLS1mb3JtYXQ9Z251Ci1EZXRhY2hfXzhTdGF0ZVZhclAxMlN0YXRlVmFyVmlldwotU3RhdGVWYXI6OkRldGFjaChTdGF0ZVZhclZpZXcgKikKLSMKLS0tZm9ybWF0PWdudQotRG9uZV9fOUNvbXBvbmVudEc4SXRlcmF0b3IKLUNvbXBvbmVudDo6RG9uZShJdGVyYXRvcikKLSMKLS0tZm9ybWF0PWdudQotRWZmZWN0X18xMVJlbGF0ZU1hbmlwUjdpdkV2ZW50Ci1SZWxhdGVNYW5pcDo6RWZmZWN0KGl2RXZlbnQgJikKLSMKLS0tZm9ybWF0PWdudQotRmluZEZpeGVkX19GUlA0Q05ldFA0Q05ldAotRmluZEZpeGVkKENOZXQgKiYsIENOZXQgKikKLSMKLS0tZm9ybWF0PWdudQotRml4NDhfYWJvcnRfX0ZSOHR3b2xvbmdzCi1GaXg0OF9hYm9ydCh0d29sb25ncyAmKQotIwotLS1mb3JtYXQ9Z251Ci1HZXRCYXJJbmZvX18xNWl2Ml82X1ZTY3JvbGxlclAxM2l2UGVyc3BlY3RpdmVSaVQyCi1pdjJfNl9WU2Nyb2xsZXI6OkdldEJhckluZm8oaXZQZXJzcGVjdGl2ZSAqLCBpbnQgJiwgaW50ICYpCi0jCi0tLWZvcm1hdD1nbnUKLUdldEJnQ29sb3JfX0M5aXZQYWludGVyCi1pdlBhaW50ZXI6OkdldEJnQ29sb3Iodm9pZCkgY29uc3QKLSMKLS0tZm9ybWF0PWdudQotSW5zZXJ0Qm9keV9fMTVIX1B1bGxyaWdodE1lbnVpaQotSF9QdWxscmlnaHRNZW51OjpJbnNlcnRCb2R5KGludCwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRDaGFyYWN0ZXJfXzlUZXh0TWFuaXBjCi1UZXh0TWFuaXA6Okluc2VydENoYXJhY3RlcihjaGFyKQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRUb3BsZXZlbF9fN2l2V29ybGRQMTJpdkludGVyYWN0b3JUMQotaXZXb3JsZDo6SW5zZXJ0VG9wbGV2ZWwoaXZJbnRlcmFjdG9yICosIGl2SW50ZXJhY3RvciAqKQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRUb3BsZXZlbF9fN2l2V29ybGRQMTJpdkludGVyYWN0b3JUMWlpVWkKLWl2V29ybGQ6Okluc2VydFRvcGxldmVsKGl2SW50ZXJhY3RvciAqLCBpdkludGVyYWN0b3IgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotSXNBR3JvdXBfX0ZQMTFHcmFwaGljVmlld1AxMUdyYXBoaWNDb21wCi1Jc0FHcm91cChHcmFwaGljVmlldyAqLCBHcmFwaGljQ29tcCAqKQotIwotLS1mb3JtYXQ9Z251Ci1Jc0FfXzEwQnV0dG9uQ29kZVVsCi1CdXR0b25Db2RlOjpJc0EodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWdudQotUmVhZE5hbWVfX0ZSN2lzdHJlYW1QYwotUmVhZE5hbWUoaXN0cmVhbSAmLCBjaGFyICopCi0jCi0tLWZvcm1hdD1nbnUKLVJlZHJhd19fMTNTdHJpbmdCcm93c2VyaWlpaQotU3RyaW5nQnJvd3Nlcjo6UmVkcmF3KGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotUm90YXRlX18xM2l2VHJhbnNmb3JtZXJmCi1pdlRyYW5zZm9ybWVyOjpSb3RhdGUoZmxvYXQpCi0jCi0tLWZvcm1hdD1nbnUKLVJvdGF0ZWRfX0MxM2l2VHJhbnNmb3JtZXJmCi1pdlRyYW5zZm9ybWVyOjpSb3RhdGVkKGZsb2F0KSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1Sb3VuZF9fRmYKLVJvdW5kKGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci1TZXRFeHBvcnRfXzE2TWVtYmVyU2hhcmVkTmFtZVVpCi1NZW1iZXJTaGFyZWROYW1lOjpTZXRFeHBvcnQodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1TZXRfXzE0aXZDb250cm9sU3RhdGUxM0NvbnRyb2xTdGF0dXNVaQotaXZDb250cm9sU3RhdGU6OlNldChDb250cm9sU3RhdHVzLCB1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLVNldF9fNURGYWNlUGNpaQotREZhY2U6OlNldChjaGFyICosIGludCwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1WQ29udmVydF9fOWl2VFNvbHZlclAxMml2SW50ZXJhY3RvclJQOFRFbGVtZW50VDIKLWl2VFNvbHZlcjo6VkNvbnZlcnQoaXZJbnRlcmFjdG9yICosIFRFbGVtZW50IComLCBURWxlbWVudCAqJikKLSMKLS0tZm9ybWF0PWdudQotVkNvbnZlcnRfXzlpdlRTb2x2ZXJQN2l2VEdsdWVSUDhURWxlbWVudAotaXZUU29sdmVyOjpWQ29udmVydChpdlRHbHVlICosIFRFbGVtZW50IComKQotIwotLS1mb3JtYXQ9Z251Ci1WT3JkZXJfXzlpdlRTb2x2ZXJVaVJQMTJpdkludGVyYWN0b3JUMgotaXZUU29sdmVyOjpWT3JkZXIodW5zaWduZWQgaW50LCBpdkludGVyYWN0b3IgKiYsIGl2SW50ZXJhY3RvciAqJikKLSMKLS0tZm9ybWF0PWdudQotXzEwUGFnZUJ1dHRvblwkX19ib3RoCi1QYWdlQnV0dG9uOjpfX2JvdGgKLSMKLS0tZm9ybWF0PWdudQotXzNSTkdcJHNpbmdsZU1hbnRpc3NhCi1STkc6OnNpbmdsZU1hbnRpc3NhCi0jCi0tLWZvcm1hdD1nbnUKLV81SUNvbXBcJF9yZWxlYXNlCi1JQ29tcDo6X3JlbGVhc2UKLSMKLS0tZm9ybWF0PWdudQotX1wkXzEwQml0bWFwQ29tcAotQml0bWFwQ29tcDo6fkJpdG1hcENvbXAodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX1wkXzlfX2lvX2RlZnMKLV9faW9fZGVmczo6fl9faW9fZGVmcyh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fXCRfUTIzZm9vM2JhcgotZm9vOjpiYXI6On5iYXIodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX1wkX1EzM2ZvbzNiYXI0YmVsbAotZm9vOjpiYXI6OmJlbGw6On5iZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTBpdlRlbGx0YWxlaVA3aXZHbHlwaAotaXZUZWxsdGFsZTo6aXZUZWxsdGFsZShpbnQsIGl2R2x5cGggKikKLSMKLS0tZm9ybWF0PWdudQotX18xMGl2Vmlld3BvcnRpUDEyaXZJbnRlcmFjdG9yVWkKLWl2Vmlld3BvcnQ6Oml2Vmlld3BvcnQoaW50LCBpdkludGVyYWN0b3IgKiwgdW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzEwb3N0cnN0cmVhbQotb3N0cnN0cmVhbTo6b3N0cnN0cmVhbSh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fXzEwb3N0cnN0cmVhbVBjaWkKLW9zdHJzdHJlYW06Om9zdHJzdHJlYW0oY2hhciAqLCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotX18xMUJpdG1hcFRhYmxlaQotQml0bWFwVGFibGU6OkJpdG1hcFRhYmxlKGludCkKLSMKLS0tZm9ybWF0PWdudQotX18xMlZpZXdwb3J0Q29kZVAxMlZpZXdwb3J0Q29tcAotVmlld3BvcnRDb2RlOjpWaWV3cG9ydENvZGUoVmlld3BvcnRDb21wICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTJpdjJfNl9Cb3JkZXJpaQotaXYyXzZfQm9yZGVyOjppdjJfNl9Cb3JkZXIoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTJpdkJyZWFrX0xpc3RsCi1pdkJyZWFrX0xpc3Q6Oml2QnJlYWtfTGlzdChsb25nKQotIwotLS1mb3JtYXQ9Z251Ci1fXzE0aXYyXzZfTWVudUl0ZW1pUDEyaXZJbnRlcmFjdG9yCi1pdjJfNl9NZW51SXRlbTo6aXYyXzZfTWVudUl0ZW0oaW50LCBpdkludGVyYWN0b3IgKikKLSMKLS0tZm9ybWF0PWdudQotX18yMERpc3BsYXlMaXN0X0l0ZXJhdG9yUjExRGlzcGxheUxpc3QKLURpc3BsYXlMaXN0X0l0ZXJhdG9yOjpEaXNwbGF5TGlzdF9JdGVyYXRvcihEaXNwbGF5TGlzdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fXzNmb29SVDAKLWZvbzo6Zm9vKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fXzNmb29pTjMxCi1mb286OmZvbyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fM2Zvb2lSVDBpVDJpVDIKLWZvbzo6Zm9vKGludCwgZm9vICYsIGludCwgZm9vICYsIGludCwgZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fNktleU1hcFBUMAotS2V5TWFwOjpLZXlNYXAoS2V5TWFwICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fOEFycm93Q21kUDZFZGl0b3JVaVVpCi1BcnJvd0NtZDo6QXJyb3dDbWQoRWRpdG9yICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzlGX0VsbGlwc2VpaWlpUDdHcmFwaGljCi1GX0VsbGlwc2U6OkZfRWxsaXBzZShpbnQsIGludCwgaW50LCBpbnQsIEdyYXBoaWMgKikKLSMKLS0tZm9ybWF0PWdudQotX185RnJhbWVEYXRhUDlGcmFtZUNvbXBpCi1GcmFtZURhdGE6OkZyYW1lRGF0YShGcmFtZUNvbXAgKiwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzlIVkdyYXBoaWNQOUNhbnZhc1ZhclA3R3JhcGhpYwotSFZHcmFwaGljOjpIVkdyYXBoaWMoQ2FudmFzVmFyICosIEdyYXBoaWMgKikKLSMKLS0tZm9ybWF0PWdudQotX19RMjNmb28zYmFyCi1mb286OmJhcjo6YmFyKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fUTMzZm9vM2JhcjRiZWxsCi1mb286OmJhcjo6YmVsbDo6YmVsbCh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2FhX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJiYoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYWFkX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJj0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYWRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3ImKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Fkdl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci89KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Flcl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcl49KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Fsc19fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcjw8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IlPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWlfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3ItPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzNGaXhSVDAKLUZpeDo6b3BlcmF0b3IqPShGaXggJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzVGaXgxNmkKLUZpeDE2OjpvcGVyYXRvcio9KGludCkKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzVGaXgzMlJUMAotRml4MzI6Om9wZXJhdG9yKj0oRml4MzIgJikKLSMKLS0tZm9ybWF0PWdudQotX19hb3JfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3J8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hcGxfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IrPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hcnNfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I+Pj0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYXNfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I9KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX18zZm9vUlQwCi1mb286Om9wZXJhdG9yKCkoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fY2xfXzZOb3JtYWwKLU5vcm1hbDo6b3BlcmF0b3IoKSh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX182U3RyaW5naWkKLVN0cmluZzo6b3BlcmF0b3IoKShpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotX19jbV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvciwgKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NvX18zZm9vCi1mb286Om9wZXJhdG9yfih2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2RsX18zZm9vUHYKLWZvbzo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikKLSMKLS0tZm9ybWF0PWdudQotX19kdl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci8oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZXFfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I9PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19lcl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcl4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZ2VfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I+PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19ndF9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcj4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbGVfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19sc19fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcjw8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2xzX19GUjdvc3RyZWFtUEZSM2lvc19SM2lvcwotb3BlcmF0b3I8PChvc3RyZWFtICYsIGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWdudQotX19sc19fRlI3b3N0cmVhbVIzRml4Ci1vcGVyYXRvcjw8KG9zdHJlYW0gJiwgRml4ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbHRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX21kX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19taV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbWxfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IqKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX21tX18zZm9vaQotZm9vOjpvcGVyYXRvci0tKGludCkKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvciE9KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX250X18zZm9vCi1mb286Om9wZXJhdG9yISh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX253X18zZm9vaQotZm9vOjpvcGVyYXRvciBuZXcoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX29vX18zZm9vUlQwCi1mb286Om9wZXJhdG9yfHwoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fb3BQY19fM2ZvbwotZm9vOjpvcGVyYXRvciBjaGFyICoodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19vcGlfXzNmb28KLWZvbzo6b3BlcmF0b3IgaW50KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fb3JfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3J8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3BsX18zZm9vUlQwCi1mb286Om9wZXJhdG9yKyhmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19wcF9fM2Zvb2kKLWZvbzo6b3BlcmF0b3IrKyhpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fcmZfXzNmb28KLWZvbzo6b3BlcmF0b3ItPih2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX3JtX18zZm9vUlQwCi1mb286Om9wZXJhdG9yLT4qKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3JzX18zZm9vUlQwCi1mb286Om9wZXJhdG9yPj4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9uZXdfRml4X19GVXMKLV9uZXdfRml4KHVuc2lnbmVkIHNob3J0KQotIwotLS1mb3JtYXQ9Z251Ci1fdnQuZm9vCi1mb28gdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1fdnQuZm9vLmJhcgotZm9vOjpiYXIgdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1fdnRcJGZvbwotZm9vIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWdudQotX3Z0XCRmb29cJGJhcgotZm9vOjpiYXIgdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1hcHBlbmRfXzdpdkdseXBoUFQwCi1pdkdseXBoOjphcHBlbmQoaXZHbHlwaCAqKQotIwotLS1mb3JtYXQ9Z251Ci1jbGVhcm9rX19GUDdfd2luX3N0aQotY2xlYXJvayhfd2luX3N0ICosIGludCkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmMyX19GUEZQY19pCi1jb21wbGV4ZnVuYzIoaW50ICgqKShjaGFyICopKQotIwotLS1mb3JtYXQ9Z251Ci1jb21wbGV4ZnVuYzNfX0ZQRlBGUGxfc19pCi1jb21wbGV4ZnVuYzMoaW50ICgqKShzaG9ydCAoKikobG9uZyAqKSkpCi0jCi0tLWZvcm1hdD1nbnUKLWNvbXBsZXhmdW5jNF9fRlBGUEZQY19zX2kKLWNvbXBsZXhmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaQotY29tcGxleGZ1bmM1KGludCAoKigqKShjaGFyICopKShsb25nKSkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmM2X19GUEZQaV9QRmxfaQotY29tcGxleGZ1bmM2KGludCAoKigqKShpbnQgKikpKGxvbmcpKQotIwotLS1mb3JtYXQ9Z251Ci1jb21wbGV4ZnVuYzdfX0ZQRlBGUGNfaV9QRmxfaQotY29tcGxleGZ1bmM3KGludCAoKigqKShpbnQgKCopKGNoYXIgKikpKShsb25nKSkKLSMKLS0tZm9ybWF0PWdudQotZm9vX19GaU4zMAotZm9vKGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotZm9vX19GaVIzZm9vaVQxaVQxCi1mb28oaW50LCBmb28gJiwgaW50LCBmb28gJiwgaW50LCBmb28gJikKLSMKLS0tZm9ybWF0PWdudQotZm9vX19fM2JhcmwKLWJhcjo6Zm9vXyhsb25nKQotIwotLS1mb3JtYXQ9Z251Ci1pbnNlcnRfXzE1aXZDbGlwcGluZ1N0YWNrbFJQOF9YUmVnaW9uCi1pdkNsaXBwaW5nU3RhY2s6Omluc2VydChsb25nLCBfWFJlZ2lvbiAqJikKLSMKLS0tZm9ybWF0PWdudQotaW5zZXJ0X18xNkNob29zZXJJbmZvX0xpc3RsUjExQ2hvb3NlckluZm8KLUNob29zZXJJbmZvX0xpc3Q6Omluc2VydChsb25nLCBDaG9vc2VySW5mbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1pbnNlcnRfXzE3Rm9udEZhbWlseVJlcExpc3RsUlAxNWl2Rm9udEZhbWlseVJlcAotRm9udEZhbWlseVJlcExpc3Q6Omluc2VydChsb25nLCBpdkZvbnRGYW1pbHlSZXAgKiYpCi0jCi0tLWZvcm1hdD1nbnUKLWxlYXZlb2tfX0ZQN193aW5fc3RjCi1sZWF2ZW9rKF93aW5fc3QgKiwgY2hhcikKLSMKLS0tZm9ybWF0PWdudQotbGVmdF9tb3Zlcl9fQzdpdk1GS2l0UDEyaXZBZGp1c3RhYmxlUDdpdlN0eWxlCi1pdk1GS2l0OjpsZWZ0X21vdmVyKGl2QWRqdXN0YWJsZSAqLCBpdlN0eWxlICopIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlNjCi1vdmVybG9hZDFhcmcoc2lnbmVkIGNoYXIpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlVjCi1vdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GVWkKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlVsCi1vdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GVXMKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GYwotb3ZlcmxvYWQxYXJnKGNoYXIpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRmQKLW92ZXJsb2FkMWFyZyhkb3VibGUpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRmYKLW92ZXJsb2FkMWFyZyhmbG9hdCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GaQotb3ZlcmxvYWQxYXJnKGludCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GbAotb3ZlcmxvYWQxYXJnKGxvbmcpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRnMKLW92ZXJsb2FkMWFyZyhzaG9ydCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19Gdgotb3ZlcmxvYWQxYXJnKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmkKLW92ZXJsb2FkYXJncyhpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXBva2VfXzhpdlJhc3RlclVsVWxmZmZmCi1pdlJhc3Rlcjo6cG9rZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkKLSMKLS0tZm9ybWF0PWdudQotcG9sYXJfX0ZkZAotcG9sYXIoZG91YmxlLCBkb3VibGUpCi0jCi0tLWZvcm1hdD1nbnUKLXNjYWxlX18xM2l2VHJhbnNmb3JtZXJmZgotaXZUcmFuc2Zvcm1lcjo6c2NhbGUoZmxvYXQsIGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci1zZ2V0bl9fN2ZpbGVidWZQY2kKLWZpbGVidWY6OnNnZXRuKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1zaGlmdF9fRlA1X0ZyZXBpVDAKLXNoaWZ0KF9GcmVwICosIGludCwgX0ZyZXAgKikKLSMKLS0tZm9ybWF0PWdudQotdGVzdF9fQzZCaXRTZXRpCi1CaXRTZXQ6OnRlc3QoaW50KSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci10ZXN0X19DNkJpdFNldGlpCi1CaXRTZXQ6OnRlc3QoaW50LCBpbnQpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLXRleHRfc291cmNlX184RG9jdW1lbnRsCi1Eb2N1bWVudDo6dGV4dF9zb3VyY2UobG9uZykKLSMKLS0tZm9ybWF0PWdudQotdmFyaWFuY2VfXzZFcmxhbmdkCi1Fcmxhbmc6OnZhcmlhbmNlKGRvdWJsZSkKLSMKLS0tZm9ybWF0PWdudQotdmlld19fMTREb2N1bWVudFZpZXdlclA4SXRlbVZpZXdQMTFUYWJ1bGFySXRlbQotRG9jdW1lbnRWaWV3ZXI6OnZpZXcoSXRlbVZpZXcgKiwgVGFidWxhckl0ZW0gKikKLSMKLS0tZm9ybWF0PWdudQoteHlfZXh0ZW50c19fMTFpdkV4dGVuc2lvbmZmZmYKLWl2RXh0ZW5zaW9uOjp4eV9leHRlbnRzKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci16ZXJvX184b3NNZW1vcnlQdlVpCi1vc01lbW9yeTo6emVybyh2b2lkICosIHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotXzJUNFwkTgotVDQ6Ok4KLSMKLS0tZm9ybWF0PWdudQotX1EyMlQ0MnQxXCROCi1UNDo6dDE6Ok4KLSMKLS0tZm9ybWF0PWdudQotZ2V0X18yVDEKLVQxOjpnZXQodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotZ2V0X19RMjJUMTFhCi1UMTo6YTo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLWdldF9fUTMyVDExYTFiCi1UMTo6YTo6Yjo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLWdldF9fUTQyVDExYTFiMWMKLVQxOjphOjpiOjpjOjpnZXQodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotZ2V0X19RNTJUMTFhMWIxYzFkCi1UMTo6YTo6Yjo6Yzo6ZDo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fMlQxaQotVDE6OnB1dChpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fUTIyVDExYWkKLVQxOjphOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1wdXRfX1EzMlQxMWExYmkKLVQxOjphOjpiOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1wdXRfX1E0MlQxMWExYjFjaQotVDE6OmE6OmI6OmM6OnB1dChpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fUTUyVDExYTFiMWMxZGkKLVQxOjphOjpiOjpjOjpkOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1iYXJfXzNmb29QdgotZm9vOjpiYXIodm9pZCAqKQotIwotLS1mb3JtYXQ9Z251Ci1iYXJfX0MzZm9vUHYKLWZvbzo6YmFyKHZvaWQgKikgY29uc3QKLSMKLS0tZm9ybWF0PWdudQotX19lcV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcj09KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2VxX19DM2Zvb1IzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLWVsZW1fX3Q2dmVjdG9yMVpkaQotdmVjdG9yPGRvdWJsZT46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9Z251Ci1lbGVtX190NnZlY3RvcjFaaWkKLXZlY3RvcjxpbnQ+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWdudQotX190NnZlY3RvcjFaZGkKLXZlY3Rvcjxkb3VibGU+Ojp2ZWN0b3IoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX3Q2dmVjdG9yMVppaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9cJF90NnZlY3RvcjFaZGkKLXZlY3Rvcjxkb3VibGU+Ojp+dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWdudQotX1wkX3Q2dmVjdG9yMVppaQotdmVjdG9yPGludD46On52ZWN0b3IoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX253X190MlQxMVpjVWkKLVQxPGNoYXI+OjpvcGVyYXRvciBuZXcodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX253X190MlQxMVoxdFVpCi1UMTx0Pjo6b3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotX19kbF9fdDJUMTFaY1B2Ci1UMTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikKLSMKLS0tZm9ybWF0PWdudQotX19kbF9fdDJUMTFaMXRQdgotVDE8dD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaY2kKLVQxPGNoYXI+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaYwotVDE8Y2hhcj46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaMXRpCi1UMTx0Pjo6VDEoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX3QyVDExWjF0Ci1UMTx0Pjo6VDEodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeAotTGlzdDxWSERMRW50aXR5Pjo6UGl4OjpQaXgodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeFBRMnQ0TGlzdDFaMTBWSERMRW50aXR5N2VsZW1lbnQKLUxpc3Q8VkhETEVudGl0eT46OlBpeDo6UGl4KExpc3Q8VkhETEVudGl0eT46OmVsZW1lbnQgKikKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeFJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46OlBpeDo6UGl4KExpc3Q8VkhETEVudGl0eT46OlBpeCBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX1EydDRMaXN0MVoxMFZIRExFbnRpdHk3ZWxlbWVudFJDMTBWSERMRW50aXR5UFQwCi1MaXN0PFZIRExFbnRpdHk+OjplbGVtZW50OjplbGVtZW50KFZIRExFbnRpdHkgY29uc3QgJiwgTGlzdDxWSERMRW50aXR5Pjo6ZWxlbWVudCAqKQotIwotLS1mb3JtYXQ9Z251Ci1fX1EydDRMaXN0MVoxMFZIRExFbnRpdHk3ZWxlbWVudFJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTdlbGVtZW50Ci1MaXN0PFZIRExFbnRpdHk+OjplbGVtZW50OjplbGVtZW50KExpc3Q8VkhETEVudGl0eT46OmVsZW1lbnQgY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX19jbF9fQzExVkhETExpYnJhcnlHdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHkKLVZIRExMaWJyYXJ5OjpvcGVyYXRvcigpKFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4pIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9fY2xfX0N0NExpc3QxWjEwVkhETEVudGl0eVJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46Om9wZXJhdG9yKCkoTGlzdDxWSERMRW50aXR5Pjo6UGl4IGNvbnN0ICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9fbmVfX0ZQdlJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLW9wZXJhdG9yIT0odm9pZCAqLCBMaXN0PFZIRExFbnRpdHk+OjpQaXggY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fRlB2UkN0NFBpeFgzWjExVkhETExpYnJhcnlaMTRWSERMTGlicmFyeVJlcFp0NExpc3QxWjEwVkhETEVudGl0eQotb3BlcmF0b3IhPSh2b2lkICosIFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX190NExpc3QxWjEwVkhETEVudGl0eVJDdDRMaXN0MVoxMFZIRExFbnRpdHkKLUxpc3Q8VkhETEVudGl0eT46Okxpc3QoTGlzdDxWSERMRW50aXR5PiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1QaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+OjpQaXhYKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHlQMTRWSERMTGlicmFyeVJlcEdRMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeAotUGl4WDxWSERMTGlicmFyeSwgVkhETExpYnJhcnlSZXAsIExpc3Q8VkhETEVudGl0eT4gPjo6UGl4WChWSERMTGlicmFyeVJlcCAqLCBMaXN0PFZIRExFbnRpdHk+OjpQaXgpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHlSQ3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1QaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+OjpQaXhYKFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotbmV4dEVfX0MxMVZIRExMaWJyYXJ5UnQ0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1WSERMTGlicmFyeTo6bmV4dEUoUGl4WDxWSERMTGlicmFyeSwgVkhETExpYnJhcnlSZXAsIExpc3Q8VkhETEVudGl0eT4gPiAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1uZXh0X19DdDRMaXN0MVoxMFZIRExFbnRpdHlSUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46Om5leHQoTGlzdDxWSERMRW50aXR5Pjo6UGl4ICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9HTE9CQUxfXCREXCRzZXQKLWdsb2JhbCBkZXN0cnVjdG9ycyBrZXllZCB0byBzZXQKLSMKLS0tZm9ybWF0PWdudQotX0dMT0JBTF9cJElcJHNldAotZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byBzZXQKLSMKLS0tZm9ybWF0PWdudQotX19hc19fdDVMaXN0UzFaVWlSQ3Q1TGlzdFMxWlVpCi1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcj0oTGlzdFM8dW5zaWduZWQgaW50PiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX19DdDVMaXN0UzFaVWlSQ1EydDVMaXN0UzFaVWkzVml4Ci1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcigpKExpc3RTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX19DdDVTZXRMUzFaVWlSQ1EydDVTZXRMUzFaVWkzVml4Ci1TZXRMUzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcigpKFNldExTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX3QxMExpc3RTX2xpbmsxWlVpUkNVaVBUMAotTGlzdFNfbGluazx1bnNpZ25lZCBpbnQ+OjpMaXN0U19saW5rKHVuc2lnbmVkIGludCBjb25zdCAmLCBMaXN0U19saW5rPHVuc2lnbmVkIGludD4gKikKLSMKLS0tZm9ybWF0PWdudQotX190MTBMaXN0U19saW5rMVpVaVJDdDEwTGlzdFNfbGluazFaVWkKLUxpc3RTX2xpbms8dW5zaWduZWQgaW50Pjo6TGlzdFNfbGluayhMaXN0U19saW5rPHVuc2lnbmVkIGludD4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX190NUxpc3RTMVpVaVJDdDVMaXN0UzFaVWkKLUxpc3RTPHVuc2lnbmVkIGludD46Okxpc3RTKExpc3RTPHVuc2lnbmVkIGludD4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotbmV4dF9fQ3Q1TGlzdFMxWlVpUlEydDVMaXN0UzFaVWkzVml4Ci1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpuZXh0KExpc3RTPHVuc2lnbmVkIGludD46OlZpeCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX25lX19GUHZSQ1EydDVTZXRMUzFaVWkzVml4Ci1vcGVyYXRvciE9KHZvaWQgKiwgU2V0TFM8dW5zaWduZWQgaW50Pjo6Vml4IGNvbnN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDhMaXN0RWxlbTFaNUxhYmVsUnQ0TGlzdDFaNUxhYmVsCi1MaXN0RWxlbTxMYWJlbD46Okxpc3RFbGVtKExpc3Q8TGFiZWw+ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDhCRERIb29rVjFaUGNSQ1BjCi1CRERIb29rVjxjaGFyICo+OjpCRERIb29rVihjaGFyICpjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fdnRcJHQ4QkRESG9va1YxWlBjCi1CRERIb29rVjxjaGFyICo+IHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fRlB2UkNRMjExQkRERnVuY3Rpb240Vml4Qgotb3BlcmF0b3IhPSh2b2lkICosIEJEREZ1bmN0aW9uOjpWaXhCIGNvbnN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZXFfX0ZQdlJDUTIxMUJEREZ1bmN0aW9uNFZpeEIKLW9wZXJhdG9yPT0odm9pZCAqLCBCRERGdW5jdGlvbjo6Vml4QiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1yZWxhdGl2ZUlkX19DUTM2VF9waGkyMTBUX3ByZXNlcnZlOEZQQ19uZXh0UkNRMjZUX3BoaTIxMFRfcHJlc2VydmVSQzEwUGFyYW1ldGVycwotVF9waGkyOjpUX3ByZXNlcnZlOjpGUENfbmV4dDo6cmVsYXRpdmVJZChUX3BoaTI6OlRfcHJlc2VydmUgY29uc3QgJiwgUGFyYW1ldGVycyBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9bHVjaWQKLVdTX19GUjdpc3RyZWFtCi1XUyhpc3RyZWFtICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hYV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvciYmKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYWFkX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hZF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvciYoZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hZHZfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IvPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Fkdl9fN2NvbXBsZXhGN2NvbXBsZXgKLWNvbXBsZXg6Om9wZXJhdG9yLz0oY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Flcl9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcl49KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYWxzX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPDw9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW1kX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJT0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hbWlfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3ItPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2FtdV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcio9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW11X183Y29tcGxleEY3Y29tcGxleAotY29tcGxleDo6b3BlcmF0b3IqPShjb21wbGV4KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW9yX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfD0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hcGxfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IrPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Fyc19fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj4+PShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2FzX18xOGlzdHJlYW1fd2l0aGFzc2lnbkZQOXN0cmVhbWJ1ZgotaXN0cmVhbV93aXRoYXNzaWduOjpvcGVyYXRvcj0oc3RyZWFtYnVmICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fMThpc3RyZWFtX3dpdGhhc3NpZ25GUjdpc3RyZWFtCi1pc3RyZWFtX3dpdGhhc3NpZ246Om9wZXJhdG9yPShpc3RyZWFtICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fM2lvc0ZSM2lvcwotaW9zOjpvcGVyYXRvcj0oaW9zICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jbF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcigpKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY21fXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IsIChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2NvX18zZm9vRnYKLWZvbzo6b3BlcmF0b3J+KHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTBpc3Ryc3RyZWFtRlBjCi1pc3Ryc3RyZWFtOjppc3Ryc3RyZWFtKGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMGlzdHJzdHJlYW1GUGNpCi1pc3Ryc3RyZWFtOjppc3Ryc3RyZWFtKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEwb3N0cnN0cmVhbUZQY2lUMgotb3N0cnN0cmVhbTo6b3N0cnN0cmVhbShjaGFyICosIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEwb3N0cnN0cmVhbUZ2Ci1vc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTBzbWFuaXBfaW50RlBGUjNpb3NpX1IzaW9zaQotc21hbmlwX2ludDo6c21hbmlwX2ludChpb3MgJigqKShpb3MgJiwgaW50KSwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExZnN0cmVhbWJhc2VGaQotZnN0cmVhbWJhc2U6OmZzdHJlYW1iYXNlKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMWZzdHJlYW1iYXNlRmlQY1QxCi1mc3RyZWFtYmFzZTo6ZnN0cmVhbWJhc2UoaW50LCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMWZzdHJlYW1iYXNlRnYKLWZzdHJlYW1iYXNlOjpmc3RyZWFtYmFzZSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExc21hbmlwX2xvbmdGUEZSM2lvc2xfUjNpb3NsCi1zbWFuaXBfbG9uZzo6c21hbmlwX2xvbmcoaW9zICYoKikoaW9zICYsIGxvbmcpLCBsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExc3RkaW9zdHJlYW1GUDRGSUxFCi1zdGRpb3N0cmVhbTo6c3RkaW9zdHJlYW0oRklMRSAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEyc3Ryc3RyZWFtYnVmRlBGbF9QdlBGUHZfdgotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodm9pZCAqKCopKGxvbmcpLCB2b2lkICgqKSh2b2lkICopKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEyc3Ryc3RyZWFtYnVmRlBVY2lUMQotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodW5zaWduZWQgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMnN0cnN0cmVhbWJ1ZkZQY2lUMQotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoY2hhciAqLCBpbnQsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMnN0cnN0cmVhbWJ1ZkZpCi1zdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1ZihpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTJzdHJzdHJlYW1idWZGdgotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xM3N0cnN0cmVhbWJhc2VGUGNpVDEKLXN0cnN0cmVhbWJhc2U6OnN0cnN0cmVhbWJhc2UoY2hhciAqLCBpbnQsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRlIzZm9vCi1mb286OmZvbyhmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmkKLWZvbzo6Zm9vKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmlOMzEKLWZvbzo6Zm9vKGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCi1mb286OmZvbyhpbnQsIGZvbyAmLCBpbnQsIGZvbyAmLCBpbnQsIGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzNpb3NGUDlzdHJlYW1idWYKLWlvczo6aW9zKHN0cmVhbWJ1ZiAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzdmaWxlYnVmRmlQY1QxCi1maWxlYnVmOjpmaWxlYnVmKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN2ZzdHJlYW1GaVBjVDEKLWZzdHJlYW06OmZzdHJlYW0oaW50LCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X183aXN0cmVhbUZQOXN0cmVhbWJ1ZgotaXN0cmVhbTo6aXN0cmVhbShzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X183aXN0cmVhbUZQOXN0cmVhbWJ1ZmlQN29zdHJlYW0KLWlzdHJlYW06OmlzdHJlYW0oc3RyZWFtYnVmICosIGludCwgb3N0cmVhbSAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzdpc3RyZWFtRmlQY1QxCi1pc3RyZWFtOjppc3RyZWFtKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN2lzdHJlYW1GaVQxUDdvc3RyZWFtCi1pc3RyZWFtOjppc3RyZWFtKGludCwgaW50LCBvc3RyZWFtICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN29zdHJlYW1GUDlzdHJlYW1idWYKLW9zdHJlYW06Om9zdHJlYW0oc3RyZWFtYnVmICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN29zdHJlYW1GaVBjCi1vc3RyZWFtOjpvc3RyZWFtKGludCwgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzhpZnN0cmVhbUZpUGNUMQotaWZzdHJlYW06Omlmc3RyZWFtKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fUTIzZm9vM2JhckZ2Ci1mb286OmJhcjo6YmFyKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fUTMzZm9vM2JhcjRiZWxsRnYKLWZvbzo6YmFyOjpiZWxsOjpiZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kbF9fM2Zvb1NGUHYKLWZvbzo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kbF9fRlB2Ci1vcGVyYXRvciBkZWxldGUodm9pZCAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZHRfXzEwaXN0cnN0cmVhbUZ2Ci1pc3Ryc3RyZWFtOjp+aXN0cnN0cmVhbSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZHRfX1EyM2ZvbzNiYXJGdgotZm9vOjpiYXI6On5iYXIodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2R0X19RMzNmb28zYmFyNGJlbGxGdgotZm9vOjpiYXI6OmJlbGw6On5iZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kdl9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvci8oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kdl9fRjdjb21wbGV4VDEKLW9wZXJhdG9yLyhjb21wbGV4LCBjb21wbGV4KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZXFfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I9PShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2VyX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yXihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2dlX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ndF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj4oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sZV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcjw9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbHNfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I8PChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQOXN0cmVhbWJ1Zgotb3N0cmVhbTo6b3BlcmF0b3I8PChzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQRlIzaW9zX1IzaW9zCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQdgotb3N0cmVhbTo6b3BlcmF0b3I8PCh2b2lkICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GVWkKLW9zdHJlYW06Om9wZXJhdG9yPDwodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbHNfXzdvc3RyZWFtRlVsCi1vc3RyZWFtOjpvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GZAotb3N0cmVhbTo6b3BlcmF0b3I8PChkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GZgotb3N0cmVhbTo6b3BlcmF0b3I8PChmbG9hdCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZpCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZsCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fRlI3b3N0cmVhbTdjb21wbGV4Ci1vcGVyYXRvcjw8KG9zdHJlYW0gJiwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2x0X18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21kX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21pX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yLShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21sX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yKihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21sX19GN2NvbXBsZXhUMQotb3BlcmF0b3IqKGNvbXBsZXgsIGNvbXBsZXgpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19tbV9fM2Zvb0ZpCi1mb286Om9wZXJhdG9yLS0oaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbmVfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IhPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX250X18zZm9vRnYKLWZvbzo6b3BlcmF0b3IhKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ud19fM2Zvb1NGaQotZm9vOjpvcGVyYXRvciBuZXcoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX253X19GVWkKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ud19fRlVpUHYKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQsIHZvaWQgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX29vX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfHwoZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19vcFBjX18zZm9vRnYKLWZvbzo6b3BlcmF0b3IgY2hhciAqKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19vcGlfXzNmb29GdgotZm9vOjpvcGVyYXRvciBpbnQodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX29yX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3BsX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yKyhmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3BwX18zZm9vRmkKLWZvbzo6b3BlcmF0b3IrKyhpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19wdF9fM2Zvb0Z2Ci1mb286Om9wZXJhdG9yLT4odm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JtX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yLT4qKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fcnNfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I+Pihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQOXN0cmVhbWJ1ZgotaXN0cmVhbTo6b3BlcmF0b3I+PihzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQRlIzaW9zX1IzaW9zCi1pc3RyZWFtOjpvcGVyYXRvcj4+KGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQRlI3aXN0cmVhbV9SN2lzdHJlYW0KLWlzdHJlYW06Om9wZXJhdG9yPj4oaXN0cmVhbSAmKCopKGlzdHJlYW0gJikpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUFVjCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQYwotaXN0cmVhbTo6b3BlcmF0b3I+PihjaGFyICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUlVpCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIGludCAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fcnNfXzdpc3RyZWFtRlJVbAotaXN0cmVhbTo6b3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUlVzCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUmQKLWlzdHJlYW06Om9wZXJhdG9yPj4oZG91YmxlICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUmYKLWlzdHJlYW06Om9wZXJhdG9yPj4oZmxvYXQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZSaQotaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZSbAotaXN0cmVhbTo6b3BlcmF0b3I+Pihsb25nICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUnMKLWlzdHJlYW06Om9wZXJhdG9yPj4oc2hvcnQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX19GUjdpc3RyZWFtUjdjb21wbGV4Ci1vcGVyYXRvcj4+KGlzdHJlYW0gJiwgY29tcGxleCAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fdnRibF9fMTBpc3Ryc3RyZWFtCi1pc3Ryc3RyZWFtIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3Z0YmxfXzE3b3N0cmVhbV9faW9zdHJlYW1fXzE5aW9zdHJlYW1fd2l0aGFzc2lnbgotaW9zdHJlYW1fd2l0aGFzc2lnbjo6b3N0cmVhbV9faW9zdHJlYW0gdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fdnRibF9fM2lvcwotaW9zIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3Z0YmxfXzNpb3NfXzEzc3Ryc3RyZWFtYmFzZQotc3Ryc3RyZWFtYmFzZTo6aW9zIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1hYnNfX0Y3Y29tcGxleAotYWJzKGNvbXBsZXgpCi0jCi0tLWZvcm1hdD1sdWNpZAotYWxsb2NhdGVfXzlzdHJlYW1idWZGdgotc3RyZWFtYnVmOjphbGxvY2F0ZSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLWF0dGFjaF9fMTFmc3RyZWFtYmFzZUZpCi1mc3RyZWFtYmFzZTo6YXR0YWNoKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1iaXRhbGxvY19fM2lvc1NGdgotaW9zOjpiaXRhbGxvYyh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jaHJfX0ZpVDEKLWNocihpbnQsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4X2Vycm9yX19GUjExY19leGNlcHRpb24KLWNvbXBsZXhfZXJyb3IoY19leGNlcHRpb24gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzJfX0ZQRlBjX2kKLWNvbXBsZXhmdW5jMihpbnQgKCopKGNoYXIgKikpCi0jCi0tLWZvcm1hdD1sdWNpZAotY29tcGxleGZ1bmMzX19GUEZQRlBsX3NfaQotY29tcGxleGZ1bmMzKGludCAoKikoc2hvcnQgKCopKGxvbmcgKikpKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbXBsZXhmdW5jNF9fRlBGUEZQY19zX2kKLWNvbXBsZXhmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pCi1jb21wbGV4ZnVuYzUoaW50ICgqKCopKGNoYXIgKikpKGxvbmcpKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbXBsZXhmdW5jNl9fRlBGUGlfUEZsX2kKLWNvbXBsZXhmdW5jNihpbnQgKCooKikoaW50ICopKShsb25nKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzdfX0ZQRlBGUGNfaV9QRmxfaQotY29tcGxleGZ1bmM3KGludCAoKigqKShpbnQgKCopKGNoYXIgKikpKShsb25nKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGljYXRlZF9wdXRfXzdvc3RyZWFtRmMKLW9zdHJlYW06OmNvbXBsaWNhdGVkX3B1dChjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbnYxMF9fRmxQYwotY29udjEwKGxvbmcsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb252MTZfX0ZVbFBjCi1jb252MTYodW5zaWduZWQgbG9uZywgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLWRlY19fRlIzaW9zCi1kZWMoaW9zICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotZGVjX19GbGkKLWRlYyhsb25nLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotZG9maWVsZF9fRlA3b3N0cmVhbVBjaVQyVDMKLWRvZmllbGQob3N0cmVhbSAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotZmxhZ3NfXzNpb3NGbAotaW9zOjpmbGFncyhsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLWZsYWdzX18zaW9zRnYKLWlvczo6ZmxhZ3Modm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1mb29fX0ZpTjMxCi1mb28oaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLWZvb19fRmlSM2Zvb1QxVDJUMVQyCi1mb28oaW50LCBmb28gJiwgaW50LCBmb28gJiwgaW50LCBmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1mb29fX18zYmFyRmwKLWJhcjo6Zm9vXyhsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLWdldF9fN2lzdHJlYW1GUGNpYwotaXN0cmVhbTo6Z2V0KGNoYXIgKiwgaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWdldF9fN2lzdHJlYW1GUjlzdHJlYW1idWZjCi1pc3RyZWFtOjpnZXQoc3RyZWFtYnVmICYsIGNoYXIpCi0jCi0tLWZvcm1hdD1sdWNpZAotZ2V0X2NvbXBsaWNhdGVkX183aXN0cmVhbUZSVWMKLWlzdHJlYW06OmdldF9jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotZ2V0X2NvbXBsaWNhdGVkX183aXN0cmVhbUZSYwotaXN0cmVhbTo6Z2V0X2NvbXBsaWNhdGVkKGNoYXIgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1nZXRsaW5lX183aXN0cmVhbUZQVWNpYwotaXN0cmVhbTo6Z2V0bGluZSh1bnNpZ25lZCBjaGFyICosIGludCwgY2hhcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1nZXRsaW5lX183aXN0cmVhbUZQY2ljCi1pc3RyZWFtOjpnZXRsaW5lKGNoYXIgKiwgaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWlnbm9yZV9fN2lzdHJlYW1GaVQxCi1pc3RyZWFtOjppZ25vcmUoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotaW5pdF9fMTJzdHJzdHJlYW1idWZGUGNpVDEKLXN0cnN0cmVhbWJ1Zjo6aW5pdChjaGFyICosIGludCwgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLWluaXRfXzNpb3NGUDlzdHJlYW1idWYKLWlvczo6aW5pdChzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1pbml0Y291bnRfXzEzSW9zdHJlYW1faW5pdAotSW9zdHJlYW1faW5pdDo6aW5pdGNvdW50Ci0jCi0tLWZvcm1hdD1sdWNpZAotaXBmeF9fN2lzdHJlYW1GaQotaXN0cmVhbTo6aXBmeChpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotbHNfY29tcGxpY2F0ZWRfXzdvc3RyZWFtRlVjCi1vc3RyZWFtOjpsc19jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWxzX2NvbXBsaWNhdGVkX183b3N0cmVhbUZjCi1vc3RyZWFtOjpsc19jb21wbGljYXRlZChjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlNjCi1vdmVybG9hZDFhcmcoc2lnbmVkIGNoYXIpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GVWMKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlVpCi1vdmVybG9hZDFhcmcodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlVsCi1vdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWx1Y2lkCi1vdmVybG9hZDFhcmdfX0ZVcwotb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIHNob3J0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmMKLW92ZXJsb2FkMWFyZyhjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmQKLW92ZXJsb2FkMWFyZyhkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GZgotb3ZlcmxvYWQxYXJnKGZsb2F0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmkKLW92ZXJsb2FkMWFyZyhpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GbAotb3ZlcmxvYWQxYXJnKGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19Gcwotb3ZlcmxvYWQxYXJnKHNob3J0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRnYKLW92ZXJsb2FkMWFyZyh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOMjEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOMzEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU40MQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlONTEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlONjEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU43MQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOODEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOOTEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU45MU4xMQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlUMQotb3ZlcmxvYWRhcmdzKGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXBvbGFyX19GZFQxCi1wb2xhcihkb3VibGUsIGRvdWJsZSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wb3dfX0Y3Y29tcGxleFQxCi1wb3coY29tcGxleCwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wb3dfX0Y3Y29tcGxleGQKLXBvdyhjb21wbGV4LCBkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotcG93X19GN2NvbXBsZXhpCi1wb3coY29tcGxleCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXBvd19fRmQ3Y29tcGxleAotcG93KGRvdWJsZSwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wc3RhcnRfX0ZQY2lUMgotcHN0YXJ0KGNoYXIgKiwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotcHV0X183b3N0cmVhbUZjCi1vc3RyZWFtOjpwdXQoY2hhcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1yZWFkX183aXN0cmVhbUZQY2kKLWlzdHJlYW06OnJlYWQoY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotcmVzZXRpb3NmbGFnc19fRlIzaW9zbAotcmVzZXRpb3NmbGFncyhpb3MgJiwgbG9uZykKLSMKLS0tZm9ybWF0PWx1Y2lkCi1yZXN0b3JlX2Vycm5vX19GUmkKLXJlc3RvcmVfZXJybm8oaW50ICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotcnNfY29tcGxpY2F0ZWRfXzdpc3RyZWFtRlJVYwotaXN0cmVhbTo6cnNfY29tcGxpY2F0ZWQodW5zaWduZWQgY2hhciAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLXJzX2NvbXBsaWNhdGVkX183aXN0cmVhbUZSYwotaXN0cmVhbTo6cnNfY29tcGxpY2F0ZWQoY2hhciAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNlZWtnX183aXN0cmVhbUZsOHNlZWtfZGlyCi1pc3RyZWFtOjpzZWVrZyhsb25nLCBzZWVrX2RpcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZWVrb2ZmX18xMnN0cnN0cmVhbWJ1ZkZsOHNlZWtfZGlyaQotc3Ryc3RyZWFtYnVmOjpzZWVrb2ZmKGxvbmcsIHNlZWtfZGlyLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2Vla29mZl9fOXN0cmVhbWJ1ZkZsUTJfM2lvczEyaW9zX3NlZWtfZGlyaQotc3RyZWFtYnVmOjpzZWVrb2ZmKGxvbmcsIGlvczo6aW9zX3NlZWtfZGlyLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2Vla3Bvc19fOXN0cmVhbWJ1ZkZsaQotc3RyZWFtYnVmOjpzZWVrcG9zKGxvbmcsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRfbmV3X2hhbmRsZXJfX0ZQRnZfdgotc2V0X25ld19oYW5kbGVyKHZvaWQgKCopKHZvaWQpKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJfXzlzdHJlYW1idWZGUGNUMWkKLXN0cmVhbWJ1Zjo6c2V0YihjaGFyICosIGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJfX0ZSM2lvc2kKLXNldGIoaW9zICYsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRidWZfXzExZnN0cmVhbWJhc2VGUGNpCi1mc3RyZWFtYmFzZTo6c2V0YnVmKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJ1Zl9fOXN0cmVhbWJ1ZkZQVWNpCi1zdHJlYW1idWY6OnNldGJ1Zih1bnNpZ25lZCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRidWZfXzlzdHJlYW1idWZGUGNpVDIKLXN0cmVhbWJ1Zjo6c2V0YnVmKGNoYXIgKiwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2V0Zl9fM2lvc0ZsVDEKLWlvczo6c2V0Zihsb25nLCBsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGZpbGxfX0ZSM2lvc2kKLXNldGZpbGwoaW9zICYsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRnX185c3RyZWFtYnVmRlBjTjIxCi1zdHJlYW1idWY6OnNldGcoY2hhciAqLCBjaGFyICosIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRwX185c3RyZWFtYnVmRlBjVDEKLXN0cmVhbWJ1Zjo6c2V0cChjaGFyICosIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi10aWVfXzNpb3NGUDdvc3RyZWFtCi1pb3M6OnRpZShvc3RyZWFtICopCi0jCi0tLWZvcm1hdD1sdWNpZAotdWNvbnYxMF9fRlVsUGMKLXVjb252MTAodW5zaWduZWQgbG9uZywgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLXhnZXRfXzdpc3RyZWFtRlBjCi1pc3RyZWFtOjp4Z2V0KGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi14c2dldG5fXzlzdHJlYW1idWZGUGNpCi1zdHJlYW1idWY6OnhzZ2V0bihjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMjFUNV9fcHRfXzExX1BGaVBQZFB2X2lGdgotVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46On5UNSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xY0ZpCi1jOjpjKGludCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMTFUNV9fcHRfXzJfaUZ2Ci1UNTxpbnQ+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMTFUNV9fcHRfXzJfY0Z2Ci1UNTxjaGFyPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzJUMkZpCi1UMjo6VDIoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18yVDFGdgotVDE6On5UMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18xMlQ1X19wdF9fM18xeEZ2Ci1UNTx4Pjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZHRfXzE3VDVfX3B0X184X1BGY1B2X2lGdgotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pRmkKLVQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fYW1kX19GUjJUMmkKLW9wZXJhdG9yJT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2Fkdl9fRlIyVDJpCi1vcGVyYXRvci89KFQyICYsIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19hbXVfX0ZSMlQyaQotb3BlcmF0b3IqPShUMiAmLCBpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fYW1pX19GUjJUMmkKLW9wZXJhdG9yLT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2FwbF9fRlIyVDJpCi1vcGVyYXRvcis9KFQyICYsIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19ud19fMlQxU0ZVaQotVDE6Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18yVDFTRlB2Ci1UMTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fMlQ3U0ZpCi1UNzo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzEyVDVfX3B0X18zXzF4U0ZQdgotVDU8eD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1oX19GVWMKLWgodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljCi1mKGludCwgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotaF9fRlVpCi1oKHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWFybQotaF9fRmNpCi1oKGNoYXIsIGludCkKLSMKLS0tZm9ybWF0PWFybQotaF9fRlVsCi1oKHVuc2lnbmVkIGxvbmcpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjbAotaChjaGFyLCBsb25nKQotIwotLS1mb3JtYXQ9YXJtCi1oX19GVXMKLWgodW5zaWduZWQgc2hvcnQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjcwotaChjaGFyLCBzaG9ydCkKLSMKLS0tZm9ybWF0PWFybQotWF9fMTJUNV9fcHRfXzNfMXgKLVQ1PHg+OjpYCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzExVDVfX3B0X18yX2lGaQotVDU8aW50Pjo6VDUoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xMVQ1X19wdF9fMl9jRmkKLVQ1PGNoYXI+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjVDEKLWgoY2hhciwgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljZAotZihpbnQsIGNoYXIsIGRvdWJsZSkKLSMKLS0tZm9ybWF0PWFybQotX19kbF9fMTdUNV9fcHRfXzhfUEZjUHZfaVNGUHYKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1YX18xN1Q1X19wdF9fOF9QRmNQdl9pCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpYCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDVfX3B0X18zXzF4RmkKLVQ1PHg+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pU0ZQdgotVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX3N0ZF9fZm9vCi1nbG9iYWwgZGVzdHJ1Y3RvcnMga2V5ZWQgdG8gZm9vCi0jCi0tLWZvcm1hdD1hcm0KLV9fc3RpX19iYXIKLWdsb2JhbCBjb25zdHJ1Y3RvcnMga2V5ZWQgdG8gYmFyCi0jCi0tLWZvcm1hdD1hcm0KLWZfX0ZpY2RQY1BGY2lfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9YXJtCi1mX19GaWNkUGNQRmljX3YKLWYoaW50LCBjaGFyLCBkb3VibGUsIGNoYXIgKiwgdm9pZCAoKikoaW50LCBjaGFyKSkKLSMKLS0tZm9ybWF0PWFybQotZ2V0X18yVDdTRnYKLVQ3OjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLVhfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6WAotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18xMVQ1X19wdF9fMl9pU0ZQdgotVDU8aW50Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzExVDVfX3B0X18yX2NTRlB2Ci1UNTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjCi1oKGNoYXIpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZkCi1oKGRvdWJsZSkKLSMKLS0tZm9ybWF0PWFybQotaF9fRmYKLWgoZmxvYXQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZpCi1oKGludCkKLSMKLS0tZm9ybWF0PWFybQotZl9fRmkKLWYoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1oX19GbAotaChsb25nKQotIwotLS1mb3JtYXQ9YXJtCi1oX19GcwotaChzaG9ydCkKLSMKLS0tZm9ybWF0PWFybQotWF9fMTFUNV9fcHRfXzJfYwotVDU8Y2hhcj46OlgKLSMKLS0tZm9ybWF0PWFybQotWF9fMTFUNV9fcHRfXzJfaQotVDU8aW50Pjo6WAotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xN1Q1X19wdF9fOF9QRmNQdl9pRmkKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljZFBjCi1mKGludCwgY2hhciwgZG91YmxlLCBjaGFyICopCi0jCi0tLWZvcm1hdD1hcm0KLV9fbndfX0ZVaQotb3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19jdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6On5iKGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1nZXRfX1EyXzJUMTFhU0Z2Ci1UMTo6YTo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfXzJUMVNGaQotVDE6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfX1E1XzJUMTFhMWIxYzFkU0ZpCi1UMTo6YTo6Yjo6Yzo6ZDo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTRfMlQxMWExYjFjU0Z2Ci1UMTo6YTo6Yjo6Yzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfX1EyXzJUMTFhU0ZpCi1UMTo6YTo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fUTRfMlQxMWExYjFjU0ZpCi1UMTo6YTo6Yjo6Yzo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTNfMlQxMWExYlNGdgotVDE6OmE6OmI6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWFybQotZ2V0X18yVDFTRnYKLVQxOjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTVfMlQxMWExYjFjMWRTRnYKLVQxOjphOjpiOjpjOjpkOjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZHRfXzExVDFfX3B0X18yX2NGdgotVDE8Y2hhcj46On5UMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18xMlQxX19wdF9fM18xdEZ2Ci1UMTx0Pjo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzEyVDFfX3B0X18zXzF0U0ZQdgotVDE8dD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xMVQxX19wdF9fMl9jRmkKLVQxPGNoYXI+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzExVDFfX3B0X18yX2NGdgotVDE8Y2hhcj46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDFfX3B0X18zXzF0RmkKLVQxPHQ+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDFfX3B0X18zXzF0RnYKLVQxPHQ+OjpUMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18xMVQxX19wdF9fMl9jU0ZQdgotVDE8Y2hhcj46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1iYXJfXzNmb29GUHYKLWZvbzo6YmFyKHZvaWQgKikKLSMKLS0tZm9ybWF0PWFybQotYmFyX18zZm9vQ0ZQdgotZm9vOjpiYXIodm9pZCAqKSBjb25zdAotIwotLS1mb3JtYXQ9YXJtCi1fX2VxX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZXFfXzNmb29DRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1hcm0KLWVsZW1fXzE1dmVjdG9yX19wdF9fMl9kRmkKLXZlY3Rvcjxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWFybQotZWxlbV9fMTV2ZWN0b3JfX3B0X18yX2lGaQotdmVjdG9yPGludD46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xNXZlY3Rvcl9fcHRfXzJfZEZpCi12ZWN0b3I8ZG91YmxlPjo6dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWFybQotX19jdF9fMTV2ZWN0b3JfX3B0X18yX2lGaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzI1RExpc3ROb2RlX19wdF9fOV9SNlJMYWJlbEZSNlJMYWJlbFAyNURMaXN0Tm9kZV9fcHRfXzlfUjZSTGFiZWxUMgotRExpc3ROb2RlPFJMYWJlbCAmPjo6RExpc3ROb2RlKFJMYWJlbCAmLCBETGlzdE5vZGU8UkxhYmVsICY+ICosIERMaXN0Tm9kZTxSTGFiZWwgJj4gKikKLSMKLS0tZm9ybWF0PWFybQotYmFyX18zZm9vRmlUMTZGb29CYXIKLWZvbzo6YmFyKGludCwgaW50LCBGb29CYXIpCi0jCi0tLWZvcm1hdD1hcm0KLWJhcl9fM2Zvb0ZQaU41MVBkTjM3UGNOMjExVDFpTjIxNQotZm9vOjpiYXIoaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW1kX19GUjJUMmkKLW9wZXJhdG9yJT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYWR2X19GUjJUMmkKLW9wZXJhdG9yLz0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW11X19GUjJUMmkKLW9wZXJhdG9yKj0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW1pX19GUjJUMmkKLW9wZXJhdG9yLT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYXBsX19GUjJUMmkKLW9wZXJhdG9yKz0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fbndfXzJUMVNGVWkKLVQxOjpvcGVyYXRvciBuZXcodW5zaWduZWQgaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1fX2RsX18yVDFTRlB2Ci1UMTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotcHV0X18yVDdTRmkKLVQ3OjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1oX19GVWMKLWgodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWMKLWYoaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZVaQotaCh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmNpCi1oKGNoYXIsIGludCkKLSMKLS0tZm9ybWF0PWhwCi1oX19GVWwKLWgodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GY2wKLWgoY2hhciwgbG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GVXMKLWgodW5zaWduZWQgc2hvcnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmNzCi1oKGNoYXIsIHNob3J0KQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZjVDEKLWgoY2hhciwgY2hhcikKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWNkCi1mKGludCwgY2hhciwgZG91YmxlKQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGY2lfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGaWNfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShpbnQsIGNoYXIpKQotIwotLS1mb3JtYXQ9aHAKLWdldF9fMlQ3U0Z2Ci1UNzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWhfX0ZjCi1oKGNoYXIpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmQKLWgoZG91YmxlKQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZmCi1oKGZsb2F0KQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZpCi1oKGludCkKLSMKLS0tZm9ybWF0PWhwCi1mX19GaQotZihpbnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmwKLWgobG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GcwotaChzaG9ydCkKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWNkUGMKLWYoaW50LCBjaGFyLCBkb3VibGUsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWhwCi1fX253X19GVWkKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X19RM18yVDExYTFiU0ZpCi1UMTo6YTo6Yjo6fmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1wdXRfX1EzXzJUMTFhMWJTRmkKLVQxOjphOjpiOjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfX1EyXzJUMTFhU0Z2Ci1UMTo6YTo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLXB1dF9fMlQxU0ZpCi1UMTo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotcHV0X19RNV8yVDExYTFiMWMxZFNGaQotVDE6OmE6OmI6OmM6OmQ6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWdldF9fUTRfMlQxMWExYjFjU0Z2Ci1UMTo6YTo6Yjo6Yzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLXB1dF9fUTJfMlQxMWFTRmkKLVQxOjphOjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1wdXRfX1E0XzJUMTFhMWIxY1NGaQotVDE6OmE6OmI6OmM6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWdldF9fUTNfMlQxMWExYlNGdgotVDE6OmE6OmI6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfXzJUMVNGdgotVDE6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfX1E1XzJUMTFhMWIxYzFkU0Z2Ci1UMTo6YTo6Yjo6Yzo6ZDo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWJhcl9fM2Zvb0ZQdgotZm9vOjpiYXIodm9pZCAqKQotIwotLS1mb3JtYXQ9aHAKLWJhcl9fM2Zvb0NGUHYKLWZvbzo6YmFyKHZvaWQgKikgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1fX2VxX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpCi0jCi0tLWZvcm1hdD1ocAotX19lcV9fM2Zvb0NGUjNmb28KLWZvbzo6b3BlcmF0b3I9PShmb28gJikgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1iYXJfXzNmb29GaVQxNkZvb0JhcgotZm9vOjpiYXIoaW50LCBpbnQsIEZvb0JhcikKLSMKLS0tZm9ybWF0PWhwCi1iYXJfXzNmb29GUGlONTFQZE4zN1BjTjIxMVQxaU4yMTUKLWZvbzo6YmFyKGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDVYVFBGaVBQZFB2X2lfX0Z2Ci1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMWNGaQotYzo6YyhpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFRpX19GdgotVDU8aW50Pjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFRjX19GdgotVDU8Y2hhcj46On5UNSh2b2lkKQotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUMkZpCi1UMjo6VDIoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZHRfXzJUMUZ2Ci1UMTo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFQxeF9fRnYKLVQ1PHg+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDVYVFBGY1B2X2lfX0Z2Ci1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDVYVFBGaVBQZFB2X2lfX0ZpCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUMXhfX1NGUHYKLVQ1PHg+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1YX18yVDVYVDF4Ci1UNTx4Pjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUNVhUaV9fRmkKLVQ1PGludD46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDVYVGNfX0ZpCi1UNTxjaGFyPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUUEZjUHZfaV9fU0ZQdgotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRQRmNQdl9pCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpYCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFQxeF9fRmkKLVQ1PHg+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQ1WFRQRmlQUGRQdl9pX19TRlB2Ci1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRQRmlQUGRQdl9pCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUaV9fU0ZQdgotVDU8aW50Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQ1WFRjX19TRlB2Ci1UNTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRjCi1UNTxjaGFyPjo6WAotIwotLS1mb3JtYXQ9aHAKLVhfXzJUNVhUaQotVDU8aW50Pjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUNVhUUEZjUHZfaV9fRmkKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDFYVGNfX0Z2Ci1UMTxjaGFyPjo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQxWFQxdF9fRnYKLVQxPHQ+Ojp+VDEodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2RsX18yVDFYVDF0X19TRlB2Ci1UMTx0Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQxWFRjX19GaQotVDE8Y2hhcj46OlQxKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVGNfX0Z2Ci1UMTxjaGFyPjo6VDEodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVDF0X19GaQotVDE8dD46OlQxKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVDF0X19GdgotVDE8dD46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQxWFRjX19TRlB2Ci1UMTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotZWxlbV9fNnZlY3RvclhUZF9fRmkKLXZlY3Rvcjxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpX19GaQotdmVjdG9yPGludD46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzZ2ZWN0b3JYVGRfX0ZpCi12ZWN0b3I8ZG91YmxlPjo6dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X182dmVjdG9yWFRpX19GaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fOURMaXN0Tm9kZVhUUjZSTGFiZWxfX0ZSNlJMYWJlbFA5RExpc3ROb2RlWFRSNlJMYWJlbF9UMgotRExpc3ROb2RlPFJMYWJlbCAmPjo6RExpc3ROb2RlKFJMYWJlbCAmLCBETGlzdE5vZGU8UkxhYmVsICY+ICosIERMaXN0Tm9kZTxSTGFiZWwgJj4gKikKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpVVAzNF9fRmkKLXZlY3RvcjxpbnQsMzRVPjo6ZWxlbShpbnQpCi0jCi0tLWZvcm1hdD1ocAotZWxlbV9fNnZlY3RvclhVUDI3MDFUZF9fRmkKLXZlY3RvcjwyNzAxVSxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU1AzMzRfX0ZpCi12ZWN0b3I8aW50LDMzND46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLWVsZW1fXzZ2ZWN0b3JYVGlTTjY3X19GaQotdmVjdG9yPGludCwtNjc+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU01fX1NDRlBQZAotdmVjdG9yPGludCwtMjE0NzQ4MzY0OD46OmVsZW0oZG91YmxlICoqKSBzdGF0aWMgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU042N1VQNDAwMFRSc19fRmkKLXZlY3RvcjxpbnQsLTY3LDQwMDBVLHNob3J0ICY+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU042N1RSZFRGUHZfaV9fRmkKLXZlY3RvcjxpbnQsLTY3LGRvdWJsZSAmLGludCAodm9pZCAqKT46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLVhfXzZ2ZWN0b3JYVGlTTjY3VGRUUHZVUDVUUnMKLXZlY3RvcjxpbnQsLTY3LGRvdWJsZSx2b2lkICosNVUsc2hvcnQgJj46OlgKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpQTNmb29fX0ZpCi12ZWN0b3I8aW50LCZmb28+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpQTNmb29UUHZBNUxhYmVsX19GaVBQdlQyCi12ZWN0b3I8aW50LCZmb28sdm9pZCAqLCZMYWJlbD46OmVsZW0oaW50LCB2b2lkICoqLCB2b2lkICoqKQotIwotLS1mb3JtYXQ9aHAKLWVsZW1fXzZ2ZWN0b3JYVGlTTjQyQTNmb29fX0ZpCi12ZWN0b3I8aW50LC00MiwmZm9vPjo6ZWxlbShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFRQRmNQdl9pX19GaV8yCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFRQRmNQdl9pX19GaV8xOQotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGY2lfdl8zNAotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9aHAKLXNwZWNfXzEzU3BlYzwjMSwjMS4qPlhUaVRQaV9GUGkKLVNwZWM8aW50LGludCAqPjo6c3BlYyhpbnQgKikKLSMKLS0tZm9ybWF0PWhwCi1zcGVjX18xNlNwZWM8IzEsIzEuJiwjMT5YVGlUUmlUaV9GUGkKLVNwZWM8aW50LGludCAmLGludD46OnNwZWMoaW50ICopCi0jCi0tLWZvcm1hdD1ocAotYWRkX19YVGNfRmNUMQotYWRkPGNoYXI+KGNoYXIsIGNoYXIpCi0jCi0tLWZvcm1hdD1ocAotYWRkX19YVGNTUDlBNWxhYmVsX0ZjUFBsVDEKLWFkZDxjaGFyLDksJmxhYmVsPihjaGFyLCBsb25nICoqLCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLWFkZF9fWFRQZlRGUGRfZl9GY1QxCi1hZGQ8ZmxvYXQgKixmbG9hdCAoZG91YmxlICopPihjaGFyLCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLXVuTGlua19fMTJiYXNpY19zdHJpbmdYVGNUMThzdHJpbmdfY2hhcl90cmFpdHNYVGNfVDlhbGxvY2F0b3JfRnYKLWJhc2ljX3N0cmluZzxjaGFyLHN0cmluZ19jaGFyX3RyYWl0czxjaGFyPixhbGxvY2F0b3I+Ojp1bkxpbmsodm9pZCkKLSMKLSMgQSByZWdyZXNzaW9uIHRlc3Qgd2l0aCBubyBhcmdzLiAgVGhpcyB1c2VkIHRvIGNhdXNlIGEgc2Vndi4KLQotX1V0ZjM5MF8xX18xXzkyMjMzNzIwMzY4NTQ3NzU4MDdfXzkyMjMzNzIwMzY4NTQ3NzUKLV9VdGYzOTBfMV9fMV85MjIzMzcyMDM2ODU0Nzc1ODA3X185MjIzMzcyMDM2ODU0Nzc1Ci0jCi0tLWZvcm1hdD1nbnUKLWNhbGxfX0gxWjRUZXN0X1JYMDFfdDFDMlpYMDFQTVgwMUZQWDAxaV92UTJYMDE2b3V0cHV0Ci1DPFRlc3QsIFRlc3Q6Om91dHB1dD4gY2FsbDxUZXN0PihUZXN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLWZuX19GUFEyMW4xY1BNUTIxbjFjRlBRMjFuMWNfaQotZm4objo6YyAqLCBpbnQgKG46OmM6OiopKG46OmMgKikpCi0jCi0tLWZvcm1hdD1nbnUKLWZfX0ZHdDNCYXIxaTIxaQotZihCYXI8Mj4sIGkpCi0jCi0tLWZvcm1hdD1nbnUKLWZfX0ZHdDNCYXIxaV8yMV9pCi1mKEJhcjwyMT4sIGludCkKLSMKLS0tZm9ybWF0PWdudQotZl9fRkd0M0JhcjFpMjRYWV90Ci1mKEJhcjwyPiwgWFlfdCkKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS90ZXN0c3VpdGUvcmVncmVzcy1kZW1hbmdsZSBiL2xpYmliZXJ0eS90ZXN0c3VpdGUvcmVncmVzcy1kZW1hbmdsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0OGNlOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdGVzdHN1aXRlL3JlZ3Jlc3MtZGVtYW5nbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgUnVuIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgZGVtYW5nbGVyLgotIyBVc2FnZTogcmVncmVzcy1kZW1hbmdsZSBURVNULUZJTEUKLQotZmFpbHVyZXM9MAotY291bnQ9MAotc2VkIC1lICcvXiMvIGQnICIkMSIgfCAoCi0gIHdoaWxlIHJlYWQgdHlwZTsgZG8KLSAgICAgcmVhZCBtYW5nbGVkCi0gICAgIHJlYWQgZGVtYW5nbGVkCi0KLSAgICAgeD0iYGVjaG8gJG1hbmdsZWQgfCAuL3Rlc3QtZmlsdGVyICR0eXBlYCIKLSAgICAgY291bnQ9YGV4cHIgJGNvdW50ICsgMWAKLSAgICAgaWYgdGVzdCAieCR4IiAhPSAieCRkZW1hbmdsZWQiOyB0aGVuCi0JZmFpbHVyZXM9YGV4cHIgJGZhaWx1cmVzICsgMWAKLQllY2hvICJGQUlMOiAkdHlwZSAkbWFuZ2xlZCIKLSAgICAgZmkKLSAgZG9uZQotCi0gIGlmIHRlc3QgJGZhaWx1cmVzIC1lcSAwOyB0aGVuCi0gICAgIGVjaG8gIkFsbCAkY291bnQgdGVzdHMgcGFzc2VkIgotICBlbHNlCi0gICAgIGVjaG8gIiRmYWlsdXJlcyBvZiAkY291bnQgdGVzdHMgZmFpbGVkIgotICBmaQotCi0gIHRlc3QgJGZhaWx1cmVzIC1lcSAwCi0pCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdG1wbmFtLmMgYi9saWJpYmVydHkvdG1wbmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjc3ZTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3RtcG5hbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgTF90bXBuYW0KLSNkZWZpbmUgTF90bXBuYW0gMTAwCi0jZW5kaWYKLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi91c3IvdG1wIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyIHRtcG5hbV9idWZmZXJbTF90bXBuYW1dOwotc3RhdGljIGludCB0bXBuYW1fY291bnRlcjsKLQotZXh0ZXJuIGludCBnZXRwaWQgKCk7Ci0KLWNoYXIgKgotdG1wbmFtIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgcGlkID0gZ2V0cGlkICgpOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcyA9IHRtcG5hbV9idWZmZXI7Ci0KLSAgLyogIEdlbmVyYXRlIHRoZSBmaWxlbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3Qgb25lIGNhbGxlZAotICAgICAgaXQgYWxyZWFkeS4gICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRklMRSAqZjsKLSAgICAgIHNwcmludGYgKHMsICIlcy8lcyV4LiV4IiwgUF90bXBkaXIsICJ0IiwgcGlkLCB0bXBuYW1fY291bnRlcik7Ci0gICAgICBmID0gZm9wZW4gKHMsICJyIik7Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgdG1wbmFtX2NvdW50ZXIrKzsKLSAgICAgIGZjbG9zZSAoZik7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGIvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU5ZjVmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92YXNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiBMaWtlIHZzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBURVNUCi1pbnQgZ2xvYmFsX3RvdGFsX3dpZHRoOwotI2VuZGlmCi0KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLWNoYXIgKm1hbGxvYyAoKTsKLQotc3RhdGljIGludAotaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCAqYXJnczsKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKLSAgLyogQWRkIG9uZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBuZXZlciB6ZXJvLCB3aGljaCBtaWdodCBjYXVzZSBtYWxsb2MKLSAgICAgdG8gcmV0dXJuIE5VTEwuICAqLwotICBpbnQgdG90YWxfd2lkdGggPSBzdHJsZW4gKGZvcm1hdCkgKyAxOwotICB2YV9saXN0IGFwOwotCi0gIG1lbWNweSAoKFBUUikgJmFwLCAoUFRSKSBhcmdzLCBzaXplb2YgKHZhX2xpc3QpKTsKLQotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKnArKyA9PSAnJScpCi0JewotCSAgd2hpbGUgKHN0cmNociAoIi0rICMwIiwgKnApKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyonKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgaWYgKCpwID09ICcqJykKLQkJewotCQkgICsrcDsKLQkJICB0b3RhbF93aWR0aCArPSBhYnMgKHZhX2FyZyAoYXAsIGludCkpOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cnRvdWwgKHAsICZwLCAxMCk7Ci0JICAgIH0KLQkgIHdoaWxlIChzdHJjaHIgKCJobEwiLCAqcCkpCi0JICAgICsrcDsKLQkgIC8qIFNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgZm9ybWF0IHNwZWNpZmllciBleGNlcHQgJXMgYW5kIGZsb2F0cy4gICovCi0JICB0b3RhbF93aWR0aCArPSAzMDsKLQkgIHN3aXRjaCAoKnApCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdlJzoKLQkgICAgY2FzZSAnRSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdHJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKLQkgICAgICAvKiBTaW5jZSBhbiBpZWVlIGRvdWJsZSBjYW4gaGF2ZSBhbiBleHBvbmVudCBvZiAzMDcsIHdlJ2xsCi0JCSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gY292ZXIgdGhlIGdyb3NzIGNhc2UuICovCi0JICAgICAgdG90YWxfd2lkdGggKz0gMzA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkgICAgICB0b3RhbF93aWR0aCArPSBzdHJsZW4gKHZhX2FyZyAoYXAsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGNoYXIgKik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHArKzsKLQl9Ci0gICAgfQotI2lmZGVmIFRFU1QKLSAgZ2xvYmFsX3RvdGFsX3dpZHRoID0gdG90YWxfd2lkdGg7Ci0jZW5kaWYKLSAgKnJlc3VsdCA9IG1hbGxvYyAodG90YWxfd2lkdGgpOwotICBpZiAoKnJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiB2c3ByaW50ZiAoKnJlc3VsdCwgZm9ybWF0LCAqYXJncyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci12YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCBhcmdzKQotICAgICBjaGFyICoqcmVzdWx0OwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jaWYgZGVmaW5lZCAoX0JTRF9WQV9MSVNUXykgJiYgZGVmaW5lZCAoX19GcmVlQlNEX18pCi0gICAgIF9CU0RfVkFfTElTVF8gYXJnczsKLSNlbHNlCi0gICAgIHZhX2xpc3QgYXJnczsKLSNlbmRpZgotewotICByZXR1cm4gaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsICZhcmdzKTsKLX0KLQotI2lmZGVmIFRFU1QKLXZvaWQKLWNoZWNraXQKLSNpZmRlZiBfX1NURENfXwotICAgICAoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCi0jZWxzZQotICAgICAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciAqcmVzdWx0OwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICBjaGFyICpmb3JtYXQ7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0gIHZhc3ByaW50ZiAoJnJlc3VsdCwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHN0cmxlbiAocmVzdWx0KSA8IGdsb2JhbF90b3RhbF93aWR0aCkKLSAgICBwcmludGYgKCJQQVNTOiAiKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkZBSUw6ICIpOwotICBwcmludGYgKCIlZCAlc1xuIiwgZ2xvYmFsX3RvdGFsX3dpZHRoLCByZXN1bHQpOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgY2hlY2tpdCAoIiVkIiwgMHgxMjM0NTY3OCk7Ci0gIGNoZWNraXQgKCIlMjAwZCIsIDUpOwotICBjaGVja2l0ICgiJS4zMDBkIiwgNik7Ci0gIGNoZWNraXQgKCIlMTAwLjE1MGQiLCA3KTsKLSAgY2hlY2tpdCAoIiVzIiwgImpqampqampqamlpaWlpaWlpaWlpaWlpaW9vb29vb29vb29vb29vb29vcHBwcHBwcHBwcHBwYWFcblwKLTc3Nzc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzM2NjY2NjY2NjY2NjYyMjIyMjIyMjIyMjc3Nzc3Nzc3Nzc3NzczMzMzMyIpOwotICBjaGVja2l0ICgiJWYlcyVkJXMiLCAxLjAsICJmb28iLCA3NywgImFzZGpmZmZmZmZmZmZmZmZmZmlpaWlpaWlpaWlpeHh4eHgiKTsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZvcmsuYyBiL2xpYmliZXJ0eS92Zm9yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0NTkxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92Zm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBFbXVsYXRlIHZmb3JrIHVzaW5nIGp1c3QgcGxhaW4gZm9yaywgZm9yIHN5c3RlbXMgd2l0aG91dCBhIHJlYWwgdmZvcmsuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi1pbnQKLXZmb3JrICgpCi17Ci0gIHJldHVybiAoZm9yayAoKSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZwcmludGYuYyBiL2xpYmliZXJ0eS92ZnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdiMmZmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92ZnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogUHJvdmlkZSBhIHZlcnNpb24gdmZwcmludGYgaW4gdGVybXMgb2YgX2RvcHJudC4KLSAgIEJ5IEthdmVoIEdoYXppICAoZ2hhemlAY2FpcC5ydXRnZXJzLmVkdSkgIDMvMjkvOTgKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSN1bmRlZiB2ZnByaW50ZgotCi1pbnQKLXZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXApCi0gIEZJTEUgKiBzdHJlYW07Ci0gIGNvbnN0IGNoYXIgKiBmb3JtYXQ7Ci0gIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiBfZG9wcm50IChmb3JtYXQsIGFwLCBzdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2VhODkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0kISBsaWJpYmVydHkvdm1zYnVpbGQuY29tIC0tIGJ1aWxkIGxpYmVydHkub2xiIGZvciBWTVMgaG9zdCwgVk1TIHRhcmdldAotJCEKLSQgQ0MJPSAiZ2NjIC9ub1ZlcmJvc2UvRGVidWcvSW5jbD0oW10sWy0uaW5jbHVkZV0pIgotJCBMSUJSCT0gImxpYnJhcnkgL09iaiIKLSQgTElOSwk9ICJsaW5rIgotJCBERUxFVEU9ICJkZWxldGUgL25vQ29uZmlybSIKLSQgU0VBUkNIPSAic2VhcmNoIC9FeGFjdCIKLSQgRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCBBQk9SVAk9ICJleGl0ICV4MDAyQyIKLSQhCi0kIExJQl9OQU1FID0gImxpYmVydHkub2xiIgkhdGhpcyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIGNvbnN0cnVjdAotJCBXT1JLX0xJQiA9ICJuZXctbGliLm9sYiIJIXVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBhbiBpbmNvbXBsZXRlIGJ1aWxkCi0kCi0kISBtYW51YWxseSBjb3BpZWQgZnJvbSBNYWtlZmlsZS5pbgotJCBSRVFVSVJFRF9PRklMRVMgPSAiYXJndi5vIGJhc2VuYW1lLm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyAiLQotCSsgImZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyAiLQotCSsgImZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gc3BhY2VzLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyAiLQotCSsgInhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyB4bWVtZHVwLm8geHN0cmR1cC5vIHhzdHJlcnJvci5vIgotJCEgYW55dGhpbmcgbm90IGNhdWdodCBieSBsaW5rK3NlYXJjaCBvZiBkdW1teS4qIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0kIEVYVFJBX09GSUxFUyA9ICIiCi0kIQotJCEgbW92ZSB0byB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tbWFuZCBwcm9jZWR1cmUKLSQgb2xkX2RpciA9IGYkZW52aXJvbigiREVGQVVMVCIpCi0kIG5ld19kaXIgPSBmJHBhcnNlKCJfLl87IixmJGVudmlyb24oIlBST0NFRFVSRSIpKSAtICJfLl87IgotJCBzZXQgZGVmYXVsdCAnbmV3X2RpcicKLSQKLSQgRUNITyAiU3RhcnRpbmcgbGliaWJlcnR5IGJ1aWxkLi4uIgotJCBjcmVhdGUgY29uZmlnLmgKLS8qIGxpYmliZXJ0eSBjb25maWcuaCBmb3IgVk1TICovCi0jZGVmaW5lIE5FRURfc3lzX3NpZ2xpc3QKLSNkZWZpbmUgTkVFRF9zdHJzaWduYWwKLSNkZWZpbmUgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfYmFzZW5hbWUKLSQgTElCUiAnV09SS19MSUInIC9DcmVhdGUKLSQKLSQhIGZpcnN0IHBhc3M6IGNvbXBpbGUgInJlcXVpcmVkIiBtb2R1bGVzCi0kIG9maWxlcyA9IFJFUVVJUkVEX09GSUxFUyArICIgIiArIEVYVFJBX09GSUxFUwotJCBwYXNzID0gMQotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIHNlY29uZCBwYXNzOiBwcm9jZXNzIGR1bW15LmMsIHVzaW5nIHRoZSBmaXJzdCBwYXNzJyByZXN1bHRzCi0kIEVDSE8gIiBub3cgY2hlY2tpbmcgcnVuLXRpbWUgbGlicmFyeSBmb3IgbWlzc2luZyBmdW5jdGlvbmFsaXR5IgotJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSBkdW1teS5vYmo7KgotJCBkZWZpbmUvbm9Mb2cgc3lzJGVycm9yIF9OTDoJIWNhbid0IHVzZSAvVXNlcl9Nb2RlIGhlcmUgZHVlIHRvIGdjYwotJCBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgb24gZXJyb3IgdGhlbiBjb250aW51ZQotJCAnQ0MnIGR1bW15LmMKLSQgZGVhc3NpZ24gc3lzJGVycm9yICAgIXJlc3RvcmUsIG1vcmUgb3IgbGVzcwotJCBkZWFzc2lnbiBzeXMkb3V0cHV0Ci0kIGlmIGYkc2VhcmNoKCJkdW1teS5vYmoiKS5lcXMuIiIgdGhlbiAgZ290byBwYXNzMl9mYWlsdXJlMQotJCEgbGluayBkdW1teS5vYmosIGNhcHR1cmluZyBmdWxsIGxpbmtlciBmZWVkYmFjayBpbiBkdW1teS5tYXAKLSQgb2xkbXNnID0gZiRlbnZpcm9uKCJNRVNTQUdFIikKLSQgc2V0IG1lc3NhZ2UgL0ZhY2lsaXR5L1NldmVyaXR5L0lkZW50aWZpY2F0aW9uL1RleHQKLSQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6Ci0kIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6Ci0kIExJTksvTWFwPWR1bW15Lm1hcC9ub0V4ZSBkdW1teS5vYmosJ1dPUktfTElCJy9MaWJyLC0KLQlnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYnIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGlicgotJCBzZXQgbWVzc2FnZSAnb2xkbXNnJwotJCBpZiBmJHNlYXJjaCgiZHVtbXkubWFwIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTIKLSQgREVMRVRFIGR1bW15Lm9iajsqCi0kIFNFQVJDSCBkdW1teS5tYXAgIiVMSU5LLUktVURGU1lNIiAvT3V0cHV0PWR1bW15Lmxpc3QKLSQgREVMRVRFIGR1bW15Lm1hcDsqCi0kIEVDSE8gIiBjaGVjayBjb21wbGV0ZWQiCi0kISB3ZSBub3cgaGF2ZSBhIGZpbGUgd2l0aCBvbmUgZW50cnkgcGVyIGxpbmUgb2YgdW5yZXNvbHZhYmxlIHN5bWJvbHMKLSQgb2ZpbGVzID0gIiIKLSQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQJb3Blbi9SZWFkIGlmaWxlJCBkdW1teS5saXN0Ci0kaWxvb3A6IHJlYWQvRW5kPWlkb25lIGlmaWxlJCBpbGluZQotJAlpbGluZSA9IGYkZWRpdChpbGluZSwiQ09NUFJFU1MsVFJJTSxMT1dFUkNBU0UiKQotJAlvZmlsZXMgPSBvZmlsZXMgKyAiICIgKyBmJGVsZW1lbnQoMSwiICIsaWxpbmUpICsgIi5vIgotJAlnb3RvIGlsb29wCi0kaWRvbmU6IGNsb3NlIGlmaWxlJAotJCBERUxFVEUgZHVtbXkubGlzdDsqCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQKLSQKLSQhIHRoaXJkIHBhc3M6IGNvbXBpbGUgIm1pc3NpbmciIG1vZHVsZXMgY29sbGVjdGVkIGluIHBhc3MgMgotJCBwYXNzID0gMwotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIGZpbmlzaCB1cAotJCBMSUJSICdXT1JLX0xJQicgL0NvbXByZXNzIC9PdXRwdXQ9J0xJQl9OQU1FJwkhbmV3LWxpYi5vbGIgLT4gbGliZXJ0eS5vbGIKLSQgREVMRVRFICdXT1JLX0xJQic7KgotJAotJCEgYWxsIGRvbmUKLSQgRUNITyAiQ29tcGxldGVkIGxpYmliZXJ0eSBidWlsZC4iCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIFlvdSBtYW55IHdpc2ggdG8gZG8KLSAgJCBDT1BZIExJQkVSVFkuT0xCIEdOVV9DQzpbMDAwMDAwXQotICBzbyB0aGF0IHRoaXMgcnVuLXRpbWUgbGlicmFyeSByZXNpZGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGdjYydzCi0gIHN1cHBvcnQgbGlicmFyeS4gIFdoZW4gYnVpbGRpbmcgZ2FzLCBiZSBzdXJlIHRvIGxlYXZlIHRoZSBvcmlnaW5hbAotICBjb3B5IG9mIGxpYmVydHkub2xiIGhlcmUgc28gdGhhdCBnYXMncyBidWlsZCBwcm9jZWR1cmUgY2FuIGZpbmQgaXQuCi0KLSQgc2V0IGRlZmF1bHQgJ29sZF9kaXInCi0kIGV4aXQKLSQKLSQhCi0kISBjb21waWxlIGVhY2ggZWxlbWVudCBvZiB0aGUgc3BhY2UtZGVsaW1pdGVkIGxpc3QgJ29maWxlcycKLSQhCi0kZG9fb2ZpbGVzOgotJCBvZmlsZXMgPSBmJGVkaXQob2ZpbGVzLCJDT01QUkVTUyxUUklNIikKLSQgaSA9IDAKLSRvbG9vcDoKLSQgZiA9IGYkZWxlbWVudChpLCIgIixvZmlsZXMpCi0kIGlmIGYuZXFzLiIgIiB0aGVuICBnb3RvIG9kb25lCi0kIGYgPSBmIC0gIi5vIgkhc3RyaXAgZHVtbXkgc3VmZml4Ci0kIEVDSE8gIiAgJydmJyIKLSQgc2tpcF9mID0gMAotJCBpZiBwYXNzLmVxLjMgLmFuZC4gZiRzZWFyY2goIicnZicuYyIpLmVxcy4iIiB0aGVuICBnb3N1YiBjaGtfZGVmZnVuYwotJCBpZiAubm90LnNraXBfZgotJCB0aGVuCi0kICAgJ0NDJyAnZicuYwotJCAgIExJQlIgJ1dPUktfTElCJyAnZicub2JqIC9JbnNlcnQKLSQgICBERUxFVEUgJ2YnLm9iajsqCi0kIGVuZGlmCi0kIGkgPSBpICsgMQotJCBnb3RvIG9sb29wCi0kb2RvbmU6Ci0kIHJldHVybgotJAotJCEKLSQhIGNoZWNrIGZ1bmN0aW9ucy5kZWYgZm9yIGEgREVGRlVOQygpIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gbWlzc2luZyBmaWxlICdmJy5jCi0kIQotJGNoa19kZWZmdW5jOgotJCBkZWZpbmUvVXNlciBzeXMkb3V0cHV0IF9OTDoKLSQgZGVmaW5lL1VzZXIgc3lzJGVycm9yIF9OTDoKLSQgU0VBUkNIIGZ1bmN0aW9ucy5kZWYgIkRFRkZVTkMiLCInJ2YnIiAvTWF0Y2g9QU5ECi0kIGlmICgoJHN0YXR1cy5hbmQuJXg3RkZGRkZGRikgLmVxLiAxKQotJCB0aGVuCi0kICAgc2tpcF9mID0gMQotJCAgIG9wZW4vQXBwZW5kIGNvbmZpZ19oIGNvbmZpZy5oCi0kICAgd3JpdGUgY29uZmlnX2ggIiNkZWZpbmUgTkVFRF8nJ2YnIgotJCAgIGNsb3NlIGNvbmZpZ19oCi0kIGVuZGlmCi0kIHJldHVybgotJAotJCEKLSRwYXNzMl9mYWlsdXJlMToKLSQhIGlmIHdlIHJlYWNoIGhlcmUsIGR1bW15LmMgZmFpbGVkIHRvIGNvbXBpbGUgYW5kIHdlJ3JlIHJlYWxseSBzdHVjawotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBDYW5ub3QgY29tcGlsZSB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5jICsgZnVuY3Rpb25zLmRlZiksCi0gIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgY29tcGlsZSBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCAnQ0MnIGR1bW15LmMKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQhCi0kcGFzczJfZmFpbHVyZTI6Ci0kISBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4uCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIENhbm5vdCBsaW5rIHRoZSBsaWJyYXJ5IGNvbnRlbnRzIGNoZWNrZXIgKGR1bW15Lm9iaiksIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgbGluayBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCi0JZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQKLSQhIG5vdCByZWFjaGVkCi0kIGV4aXQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92cHJpbnRmLmMgYi9saWJpYmVydHkvdnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI0MjVhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92cHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZwcmludGYKLWludAotdnByaW50ZiAoZm9ybWF0LCBhcCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0IGFwOwotewotICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnNwcmludGYuYyBiL2xpYmliZXJ0eS92c3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA3NjBjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92c3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHZzcHJpbnRmIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBIaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYnV0IHNob3VsZCB3b3JrIG9uIG1vc3QgInRyYWRpdGlvbmFsIgotICAgaW1wbGVtZW50YXRpb25zIG9mIHN0ZGlvOyBuZXdlciBvbmVzIHNob3VsZCBhbHJlYWR5IGhhdmUgdnNwcmludGYuCi0gICBXcml0dGVuIGJ5IFBlciBCb3RobmVyIG9mIEN5Z251cyBTdXBwb3J0LgotICAgQmFzZWQgb24gbGliZysrJ3MgImZvcm0iICh3cml0dGVuIGJ5IERvdWcgTGVhOyBkbEByb2NreS5vc3dlZ28uZWR1KS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZzcHJpbnRmCi0KLWludAotdnNwcmludGYgKGJ1ZiwgZm9ybWF0LCBhcCkKLSAgICAgY2hhciAqYnVmOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXA7Ci17Ci0gIEZJTEUgYjsKLSAgaW50IHJldDsKLSNpZmRlZiBWTVMKLSAgYi0+X2ZsYWcgPSBfSU9XUlR8X0lPU1RSRzsKLSAgYi0+X3B0ciA9IGJ1ZjsKLSAgYi0+X2NudCA9IDEyMDAwOwotI2Vsc2UKLSAgYi5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOwotICBiLl9wdHIgPSBidWY7Ci0gIGIuX2NudCA9IDEyMDAwOwotI2VuZGlmCi0gIHJldCA9IF9kb3BybnQoZm9ybWF0LCBhcCwgJmIpOwotICBwdXRjKCdcMCcsICZiKTsKLSAgcmV0dXJuIHJldDsKLQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3dhaXRwaWQuYyBiL2xpYmliZXJ0eS93YWl0cGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGIwYjkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3dhaXRwaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWludAotd2FpdHBpZCAocGlkLCBzdGF0X2xvYywgb3B0aW9ucykKLQlpbnQgcGlkLCAqc3RhdF9sb2MsIG9wdGlvbnM7Ci17Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IHdwaWQgPSB3YWl0KHN0YXRfbG9jKTsKLSAgICAgIGlmICh3cGlkID09IHBpZCB8fCB3cGlkID09IC0xKQotCXJldHVybiB3cGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94YXRleGl0LmMgYi9saWJpYmVydHkveGF0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ3NmMyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94YXRleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogJXNjY3MuaW5jbHVkZS5yZWRpc3QuYyUKLSAqLwotCi0vKiBBZGFwdGVkIGZyb20gbmV3bGliL2xpYmMvc3RkbGliL3ssYXR9ZXhpdC5bY2hdLgotICAgSWYgeW91IHVzZSB4YXRleGl0LCB5b3UgbXVzdCBjYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLXN0YXRpYyB2b2lkIHhhdGV4aXRfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gcnVuIGJ5IHhleGl0LiAgKi8KLWV4dGVybiB2b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZQlYQVRFWElUX1NJWkUgMzIKLQotc3RydWN0IHhhdGV4aXQgewotCXN0cnVjdAl4YXRleGl0ICpuZXh0OwkJLyogbmV4dCBpbiBsaXN0ICovCi0JaW50CWluZDsJCQkvKiBuZXh0IGluZGV4IGluIHRoaXMgdGFibGUgKi8KLQl2b2lkCSgqZm5zW1hBVEVYSVRfU0laRV0pIFBBUkFNUyAoKHZvaWQpKTsJLyogdGhlIHRhYmxlIGl0c2VsZiAqLwotfTsKLQotLyogQWxsb2NhdGUgb25lIHN0cnVjdCBzdGF0aWNhbGx5IHRvIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiByZWdpc3RlcgotICAgYXQgbGVhc3QgYSBmZXcgaGFuZGxlcnMuICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0IHhhdGV4aXRfZmlyc3Q7Ci0KLS8qIFBvaW50cyB0byBoZWFkIG9mIExJRk8gc3RhY2suICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0ICp4YXRleGl0X2hlYWQgPSAmeGF0ZXhpdF9maXJzdDsKLQotLyogUmVnaXN0ZXIgZnVuY3Rpb24gRk4gdG8gYmUgcnVuIGJ5IHhleGl0LgotICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KLQotaW50Ci14YXRleGl0IChmbikKLSAgICAgdm9pZCAoKmZuKSBQQVJBTVMgKCh2b2lkKSk7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotCi0gIC8qIFRlbGwgeGV4aXQgdG8gY2FsbCB4YXRleGl0X2NsZWFudXAuICAqLwotICBpZiAoIV94ZXhpdF9jbGVhbnVwKQotICAgIF94ZXhpdF9jbGVhbnVwID0geGF0ZXhpdF9jbGVhbnVwOwotCi0gIHAgPSB4YXRleGl0X2hlYWQ7Ci0gIGlmIChwLT5pbmQgPj0gWEFURVhJVF9TSVpFKQotICAgIHsKLSAgICAgIGlmICgocCA9IChzdHJ1Y3QgeGF0ZXhpdCAqKSBtYWxsb2MgKHNpemVvZiAqcCkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgcC0+aW5kID0gMDsKLSAgICAgIHAtPm5leHQgPSB4YXRleGl0X2hlYWQ7Ci0gICAgICB4YXRleGl0X2hlYWQgPSBwOwotICAgIH0KLSAgcC0+Zm5zW3AtPmluZCsrXSA9IGZuOwotICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGF0ZXhpdF9jbGVhbnVwICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotICByZWdpc3RlciBpbnQgbjsKLQotICBmb3IgKHAgPSB4YXRleGl0X2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQotICAgIGZvciAobiA9IHAtPmluZDsgLS1uID49IDA7KQotICAgICAgKCpwLT5mbnNbbl0pICgpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hleGl0LmMgYi9saWJpYmVydHkveGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNTJhYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIHhleGl0LmMgLS0gUnVuIGFueSBleGl0IGhhbmRsZXJzLCB0aGVuIGV4aXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUKLXRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCBieSB4YXRleGl0IGlmIGl0IGlzIGNhbGxlZC4gIFRoaXMgd2F5LCB4bWFsbG9jCi0gICBkb2Vzbid0IGRyYWcgeGF0ZXhpdCBpbnRvIHRoZSBsaW5rLiAgKi8KLXZvaWQgKCpfeGV4aXRfY2xlYW51cCkgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi14ZXhpdCAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGlmIChfeGV4aXRfY2xlYW51cCAhPSBOVUxMKQotICAgICgqX3hleGl0X2NsZWFudXApICgpOwotICBleGl0IChjb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94bWFsbG9jLmMgYi9saWJpYmVydHkveG1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFjNmQyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94bWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgd2l0aCBlcnJvciBjaGVja2luZy4KLSAgIENvcHlyaWdodCAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgcHRyZGlmZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotUFRSIHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLVBUUiBjYWxsb2MgUEFSQU1TICgoc2l6ZV90LCBzaXplX3QpKTsKLVBUUiBzYnJrIFBBUkFNUyAoKHB0cmRpZmZfdCkpOwotI2VuZGlmCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgaWYgc2V0LiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gIiI7Ci0KLSNpZmRlZiBIQVZFX1NCUksKLS8qIFRoZSBpbml0aWFsIHNicmssIHNldCB3aGVuIHRoZSBwcm9ncmFtIG5hbWUgaXMgc2V0LiBOb3QgdXNlZCBmb3Igd2luMzIKLSAgIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIuICAqLwotc3RhdGljIGNoYXIgKmZpcnN0X2JyZWFrID0gTlVMTDsKLSNlbmRpZiAvKiBIQVZFX1NCUksgKi8KLQotdm9pZAoteG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBuYW1lID0gczsKLSNpZmRlZiBIQVZFX1NCUksKLSAgLyogV2luMzIgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMiBkb24ndCBoYXZlIGJyaygpICovCi0gIGlmIChmaXJzdF9icmVhayA9PSBOVUxMKQotICAgIGZpcnN0X2JyZWFrID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi19Ci0KLVBUUgoteG1hbGxvYyAoc2l6ZSkKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhjYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLQotICBuZXdtZW0gPSBjYWxsb2MgKG5lbGVtLCBlbHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSksICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSkpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhyZWFsbG9jIChvbGRtZW0sIHNpemUpCi0gICAgUFRSIG9sZG1lbTsKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBpZiAoIW9sZG1lbSkKLSAgICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgbmV3bWVtID0gcmVhbGxvYyAob2xkbWVtLCBzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2Fubm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgcmVhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveG1lbWR1cC5jIGIvbGliaWJlcnR5L3htZW1kdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMTdhNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveG1lbWR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogeG1lbWR1cC5jIC0tIER1cGxpY2F0ZSBhIG1lbW9yeSBidWZmZXIsIHVzaW5nIHhjYWxsb2MuCi0gICBUaGlzIHRyaXZpYWwgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0gICBKZWZmIEdhcnppaywgU2VwdGVtYmVyIDE5OTkuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBGb3Igc2l6ZV90LiAqLwotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi1QVFIKLXhtZW1kdXAgKGlucHV0LCBjb3B5X3NpemUsIGFsbG9jX3NpemUpCi0gIGNvbnN0IFBUUiBpbnB1dDsKLSAgc2l6ZV90IGNvcHlfc2l6ZTsKLSAgc2l6ZV90IGFsbG9jX3NpemU7Ci17Ci0gIFBUUiBvdXRwdXQgPSB4Y2FsbG9jICgxLCBhbGxvY19zaXplKTsKLSAgbWVtY3B5IChvdXRwdXQsIGlucHV0LCBjb3B5X3NpemUpOwotICByZXR1cm4gb3V0cHV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJkdXAuYyBiL2xpYmliZXJ0eS94c3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODQ2Y2YuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hzdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIHhzdHJkdXAuYyAtLSBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LCB1c2luZyB4bWFsbG9jLgotICAgVGhpcyB0cml2aWFsIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIERlY2VtYmVyIDE5OTUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi14c3RyZHVwIChzKQotICBjb25zdCBjaGFyICpzOwotewotICByZWdpc3RlciBzaXplX3QgbGVuID0gc3RybGVuIChzKSArIDE7Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldCA9IHhtYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocmV0LCBzLCBsZW4pOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJlcnJvci5jIGIvbGliaWJlcnR5L3hzdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiNjUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIHhzdHJlcnJvci5jIC0tIGphY2tldCByb3V0aW5lIGZvciBtb3JlIHJvYnVzdCBzdHJlcnJvcigpIHVzYWdlLgotICAgRnJpIEp1biAxNiAxODozMDowMCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLSAgIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBWTVMKLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pICYmICFkZWZpbmVkIChfX0hJREVfRk9SQklEREVOX05BTUVTKQotZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCwuLi4pKTsKLSNkZWZpbmUgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi0jZW5kaWYKLSNlbmRpZgkvKiBWTVMgKi8KLQotI2lmbmRlZiBET05UX0RFQ0xBUkVfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0vKiBJZiBzdHJlcnJvciByZXR1cm5zIE5VTEwsIHdlJ2xsIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gYSBzdGF0aWMgYnVmZmVyLiAgKi8KLQotI2RlZmluZSBFUlJTVFJfRk1UICJ1bmRvY3VtZW50ZWQgZXJyb3IgIyVkIgotc3RhdGljIGNoYXIgeHN0cmVycm9yX2J1ZltzaXplb2YgRVJSU1RSX0ZNVCArIDIwXTsKLQotLyogTGlrZSBzdHJlcnJvciwgYnV0IHJlc3VsdCBpcyBuZXZlciBhIG51bGwgcG9pbnRlci4gICovCi0KLWNoYXIgKgoteHN0cmVycm9yIChlcnJudW0pCi0gICAgIGludCBlcnJudW07Ci17Ci0gIGNoYXIgKmVycnN0cjsKLSNpZmRlZiBWTVMKLSAgY2hhciAqKCp2bXNsaWJfc3RyZXJyb3IpIFBBUkFNUyAoKGludCwuLi4pKTsKLQotICAvKiBPdmVycmlkZSBhbnkgcG9zc2libHktY29uZmxpY3RpbmcgZGVjbGFyYXRpb24gZnJvbSBzeXN0ZW0gaGVhZGVyLiAgKi8KLSAgdm1zbGliX3N0cmVycm9yID0gKGNoYXIgKigqKSBQQVJBTVMgKChpbnQsLi4uKSkpIHN0cmVycm9yOwotICAvKiBTZWNvbmQgYXJndW1lbnQgbWF0dGVycyBpZmYgZmlyc3QgaXMgRVZNU0VSUiwgYnV0IGl0J3Mgc2ltcGxlciB0bwotICAgICBwYXNzIGl0IHVuY29uZGl0aW9uYWxseS4gIGB2YXhjJGVycm5vJyBpcyBkZWNsYXJlZCBpbiA8ZXJybm8uaD4KLSAgICAgYW5kIG1haW50YWluZWQgYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnkgaW4gcGFyYWxsZWwgdG8gYGVycm5vJy4KLSAgICAgV2UgYXNzdW1lIHRoYXQgYGVycm51bScgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgdG8KLSAgICAgZXJybm8gYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnksIGhlbmNlIHZheGMkZXJybm8gd2lsbCBiZSByZWxldmFudC4gICovCi0gIGVycnN0ciA9ICgqdm1zbGliX3N0cmVycm9yKSAoZXJybnVtLCB2YXhjJGVycm5vKTsKLSNlbHNlCi0gIGVycnN0ciA9IHN0cmVycm9yIChlcnJudW0pOwotI2VuZGlmCi0KLSAgLyogSWYgYGVycm51bScgaXMgb3V0IG9mIHJhbmdlLCByZXN1bHQgbWlnaHQgYmUgTlVMTC4gIFdlJ2xsIGZpeCB0aGF0LiAgKi8KLSAgaWYgKCFlcnJzdHIpCi0gICAgewotICAgICAgc3ByaW50ZiAoeHN0cmVycm9yX2J1ZiwgRVJSU1RSX0ZNVCwgZXJybnVtKTsKLSAgICAgIGVycnN0ciA9IHhzdHJlcnJvcl9idWY7Ci0gICAgfQotICByZXR1cm4gZXJyc3RyOwotfQpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTAxMzM0Zi4uMDAwMDAwMAotLS0gYS9sdGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMwNzggKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGx0Y29uZmlnIC0gQ3JlYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgotCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotZWNobz1lY2hvCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgIiRTSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWZpCi0KLSMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAotIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KLWlmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQotICBjYXNlIFgkVU5BTUUgaW4KLSAgICAqLURPUykgUEFUSF9TRVBBUkFUT1I9JzsnIDs7Ci0gICAgKikgICAgIFBBVEhfU0VQQVJBVE9SPSc6JyA7OwotICBlc2FjCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiWCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgIT0gJ1hcdCcgfHwKLSAgIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgIT0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCi0JIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGx0Y29uZmlnIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9IgotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAiJXNcbiInCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIgotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGw7IHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICIke09SSUdJTkFMX0NPTkZJR19TSEVMTH0iICIkMCIgJHsxKyIkQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIlgkMCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0jIENvbnN0YW50czoKLVBST0dSQU09bHRjb25maWcKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjMuNAotVElNRVNUQU1QPSIgKDEuMzg1LjIuMTk2IDE5OTkvMTIvMDcgMjE6NDc6NTcpIgotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1Jwotcm09InJtIC1mIgotCi1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLWVuYWJsZV9zaGFyZWQ9eWVzCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTSRWQywKLSMgd2hpY2ggbmVlZHMgJy5saWInKS4KLWVuYWJsZV9zdGF0aWM9eWVzCi1lbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZW5hYmxlX2Rsb3Blbj11bmtub3duCi1lbmFibGVfd2luMzJfZGxsPW5vCi1sdG1haW49Ci1zaWxlbnQ9Ci1zcmNkaXI9Ci1hY19jb25maWdfZ3Vlc3M9Ci1hY19jb25maWdfc3ViPQotaG9zdD0KLW5vbm9wdD0KLW9maWxlPSIkZGVmYXVsdF9vZmlsZSIKLXZlcmlmeV9ob3N0PXllcwotd2l0aF9nY2M9bm8KLXdpdGhfZ251X2xkPW5vCi1uZWVkX2xvY2tzPXllcwotYWNfZXh0PWMKLW9iamV4dD1vCi1saWJleHQ9YQotZXhlZXh0PQotY2FjaGVfZmlsZT0KLQotb2xkX0FSPSIkQVIiCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1vbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLW9sZF9MREZMQUdTPSIkTERGTEFHUyIKLW9sZF9MRD0iJExEIgotb2xkX0xOX1M9IiRMTl9TIgotb2xkX0xJQlM9IiRMSUJTIgotb2xkX05NPSIkTk0iCi1vbGRfUkFOTElCPSIkUkFOTElCIgotb2xkX0RMTFRPT0w9IiRETExUT09MIgotb2xkX09CSkRVTVA9IiRPQkpEVU1QIgotb2xkX0FTPSIkQVMiCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotYXJncz0KLXByZXY9Ci1mb3Igb3B0aW9uCi1kbwotICBjYXNlICIkb3B0aW9uIiBpbgotICAtKj0qKSBvcHRhcmc9YGVjaG8gIiRvcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGV2YWwgIiRwcmV2PVwkb3B0aW9uIgotICAgIHByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtLWhlbHApIGNhdCA8PEVPTQotVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbSE9TVCBbTFRNQUlOXV0KLQotR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCi0KLSAgICAtLWRlYnVnICAgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLSAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgZG8gbm90IG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbgotICAgIC0tZW5hYmxlLWRsb3BlbiAgICAgICAgZW5hYmxlIGRsb3BlbiBzdXBwb3J0Ci0gICAgLS1lbmFibGUtd2luMzItZGxsICAgICBlbmFibGUgYnVpbGRpbmcgZGxscyBvbiB3aW4zMiBob3N0cwotICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCi0tbywgLS1vdXRwdXQ9RklMRSAgICAgICAgICBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBbZGVmYXVsdD0kZGVmYXVsdF9vZmlsZV0KLSAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKLSAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCi0gICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCi0gICAgLS1kaXNhYmxlLWxvY2sgICAgICAgICBkaXNhYmxlIGZpbGUgbG9ja2luZwotICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgY29uZmlndXJlIGNhY2hlIGZpbGUKLQotTFRNQUlOIGlzIHRoZSBcYGx0bWFpbi5zaCcgc2hlbGwgc2NyaXB0IGZyYWdtZW50IG9yIFxgbHRtYWluLmMnIHByb2dyYW0KLXRoYXQgcHJvdmlkZXMgYmFzaWMgbGlidG9vbCBmdW5jdGlvbmFsaXR5LgotCi1IT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KLUVPTQotICBleGl0IDAKLSAgOzsKLQotICAtLWRlYnVnKQotICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICA7OwotCi0gIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLQotICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCkgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotCi0gIC0tZW5hYmxlLWRsb3BlbikgZW5hYmxlX2Rsb3Blbj15ZXMgOzsKLQotICAtLWVuYWJsZS13aW4zMi1kbGwpIGVuYWJsZV93aW4zMl9kbGw9eWVzIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7Ci0KLSAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7Ci0gIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKLQotICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKLQotICAtLW91dHB1dCB8IC1vKSBwcmV2PW9maWxlIDs7Ci0gIC0tb3V0cHV0PSopIG9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0tdmVyc2lvbikgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIjsgZXhpdCAwIDs7Ci0KLSAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7Ci0gIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OwotCi0gIC0tZGlzYWJsZS1sb2NrKSBuZWVkX2xvY2tzPW5vIDs7Ci0KLSAgLS1jYWNoZS1maWxlPSopIGNhY2hlX2ZpbGU9IiRvcHRhcmciIDs7Ci0KLSAgLSopCi0gICAgZWNobyAiJHByb2duYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICAgICAgbHRtYWluPSIkb3B0aW9uIgotICAgIGVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0jIFRoaXMgZ2VuZXJhdGVzIGFuIHVubmVjZXNzYXJ5IHdhcm5pbmcgZm9yIHNwYXJjLXN1bi1zb2xhcmlzNC4xLjNfVTEKLSMgICAgICBpZiB0ZXN0IC1uICJgZWNobyAkb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotIyAgICAgICAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nIFxgJG9wdGlvbicgaXMgbm90IGEgdmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0jICAgICAgZmkKLSAgICAgIGhvc3Q9IiRvcHRpb24iCi0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiB0b28gbWFueSBhcmd1bWVudHMiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIExUTUFJTiBmaWxlIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAhIC1mICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IFxgJGx0bWFpbicgZG9lcyBub3QgZXhpc3QiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIFF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1sdGNvbmZpZ19hcmdzPQotZm9yIGFyZwotZG8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJyRhcmcnIiA7OwotICAqKSBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAkYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgQSByZWxldmFudCBzdWJzZXQgb2YgQUNfSU5JVC4KLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICJYJHtMQ19BTEwrc2V0fSIgPSBYc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiWCR7TEFORytzZXR9IiAgID0gWHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgdGVzdCAtbiAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIHdpdGhpbiBsdGNvbmZpZyIKLSAgLiAkY2FjaGVfZmlsZQotZmkKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIExUTUFJTi4KLSAgc3JjZGlyPWAkZWNobyAiWCRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KLWZpCi0KLXRyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1Ci1pZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KLSAgYWNfYXV4X2Rpcj0KLSAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLSAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0KLSAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLQotICBob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRob3N0X2FsaWFzIiBpbgotICAiIikKLSAgICBpZiBob3N0X2FsaWFzPWAkU0hFTEwgJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi0gIGhvc3Q9YCRTSEVMTCAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLSAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgotCi0gICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgotICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCi0KLWVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZWxzZQotICBob3N0X2FsaWFzPSRob3N0Ci1maQotCi0jIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eC1nbnUqKSA7OwotbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCi1lc2FjCi0KLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgT0JKRFVNUCcuCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi0KLSMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgotaWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgcmVzdWx0PW5vCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWIgfHwgdGVzdCAtZiAkZGlyL3JhbmxpYiRhY19leGVleHQ7IHRoZW4KLSAgICAgIFJBTkxJQj0icmFubGliIgotICAgICAgcmVzdWx0PSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2Ci1maQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKLWZpCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIGBETExUT09MJywgYE9CSkRVTVAnLCBhbmQgYEFTJywgdXNlZCBvbiBjeWd3aW4uCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCi1pZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjIHx8IHRlc3QgLWYgJGRpci9nY2MkYWNfZXhlZXh0OyB0aGVuCi0JQ0M9ImdjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotICBmaQotCi0gICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBjY19yZWplY3RlZD1ubwotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjIHx8IHRlc3QgLWYgJGRpci9jYyRhY19leGVleHQ7IHRoZW4KLQlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLQkgIGNjX3JlamVjdGVkPXllcwotCSAgY29udGludWUKLQlmaQotCUNDPSJjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgICAgIHNldCBkdW1teSAkQ0MKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0JIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0JIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLQlzaGlmdAotCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgotCXNoaWZ0Ci0JQ0M9IiRAIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotCi0gICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KLSAgd2l0aF9nY2M9bm8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKLSAgZWNobyAiJHByb2duYW1lOjU4MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotCi0gICRybSBjb25mdGVzdC5jCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB3aXRoX2djYz15ZXMKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKLWZpCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1zZXQgZHVtbXkgJENDCi1jb21waWxlcj0iJDIiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdpbnQgaSA9IDE7JyA+IGNvbmZ0ZXN0LmMKLWVjaG8gIiRwcm9nbmFtZTo2MDM6IGNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4IiA+JiA1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjYwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH07IHRoZW4KLSAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLmMpIDs7Ci0gICAgKikgb2JqZXh0PWBlY2hvICRhY19maWxlIHwgc2VkIC1lIHMvY29uZnRlc3QuLy9gIDs7Ci0gICAgZXNhYwotICBkb25lCi1lbHNlCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi0kcm0gY29uZnRlc3QqCi1lY2hvICIkYWNfdCRvYmpleHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4Li4uICRhY19jIiAxPiY2Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfZXhlZXh0PSJubyIKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICdtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuYwotICBlY2hvICIkcHJvZ25hbWU6NjI5OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mIDUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXJyOyB9OyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCi0gICAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAgICouYyB8ICouZXJyIHwgKi4kb2JqZXh0ICkgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD0uYGVjaG8gJGFjX2ZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC4vL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICAkcm0gY29uZnRlc3QqCi1maQotaWYgdGVzdCAiWCRhY19jdl9leGVleHQiID0gWG5vOyB0aGVuCi0gIGV4ZWV4dD0iIgotZWxzZQotICBleGVleHQ9IiRhY19jdl9leGVleHQiCi1maQotZWNobyAiJGFjX3QkYWNfY3ZfZXhlZXh0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2Ci1waWNfZmxhZz0KLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KLXdsPQotbGlua19zdGF0aWNfZmxhZz0KLW5vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICB3bD0nLVdsLCcKLSAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKLQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgOzsKLSAgYWl4KikKLSAgICAjIEJlbG93IHRoZXJlIGlzIGEgZGlydHkgaGFjayB0byBmb3JjZSBub3JtYWwgc3RhdGljIGxpbmtpbmcgd2l0aCAtbGRsCi0gICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKLSAgICAjIGxpYkMgKEFJWCBDKysgbGlicmFyeSksIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGluY2x1ZGVkIGluIGxpYnJhcmllcwotICAgICMgbGlzdCBieSBnY2MuIFRoaXMgY2F1c2UgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCAtc3RhdGljIGZsYWdzLgotICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKLSAgICAjIHdlIG5vdCBzdXJlIGFib3V0IEMrKyBwcm9ncmFtcy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSIkbGlua19zdGF0aWNfZmxhZyAke3dsfS1sQyIKLSAgICA7OwotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotICBhbWlnYW9zKikKLSAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgIDs7Ci0gIHN5c3Y0Kk1QKikKLSAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0gICAgICAgcGljX2ZsYWc9LUtjb25mb3JtX3BpYwotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBwaWNfZmxhZz0nLWZQSUMnCi0gICAgOzsKLSAgZXNhYwotZWxzZQotICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgIDs7Ci0KLSAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKLSAgICBwaWNfZmxhZz0nK1onCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgcGljX2ZsYWc9Jy1LcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKLSAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBwaWNfZmxhZz0nLVBJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVFvcHRpb24gbGQgJwotICAgIDs7Ci0KLSAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIHBpY19mbGFnPSctcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIDs7Ci0gIHN5c3Y0Kk1QKikKLSAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgICBwaWNfZmxhZz0nLUtjb25mb3JtX3BpYycKLSAgICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgotCi0gICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICRwaWNfZmxhZyAtRFBJQyIKLSAgZWNobyAiJHByb2duYW1lOjc3NjogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6Nzc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICAjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuIHRoZXkKLSAgICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKLSAgICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0JcGljX2ZsYWc9Ci0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQlwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICA7OwotICAgICopCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIHBpY19mbGFnPQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vLi4uICRhY19jIiAxPiY2Ci0kcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLW1rZGlyIGNvbmZ0ZXN0Ci1jZCBjb25mdGVzdAotJHJtIGNvbmZ0ZXN0KgotZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi1ta2RpciBvdXQKLSMgQWNjb3JkaW5nIHRvIFRvbSBUcm9tZXksIElhbiBMYW5jZSBUYXlsb3IgcmVwb3J0ZWQgdGhlcmUgYXJlIEMgY29tcGlsZXJzCi0jIHRoYXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSByZWdhcmRsZXNzIG9mCi0jIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGh1cywgbWFraW5nIENXRCByZWFkLW9ubHkgd2lsbCBjYXVzZSB0aGlzIHRlc3QKLSMgdG8gZmFpbCwgZW5hYmxpbmcgbG9ja2luZyBvciBhdCBsZWFzdCB3YXJuaW5nIHRoZSB1c2VyIG5vdCB0byBkbyBwYXJhbGxlbAotIyBidWlsZHMuCi1jaG1vZCAtdyAuCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtbyBvdXQvY29uZnRlc3QyLm8iCi1lY2hvICIkcHJvZ25hbWU6ODI5OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODMwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPm91dC9jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLm87IHRoZW4KLQotICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICAgIGNvbXBpbGVyX2Nfbz1ubwotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289eWVzCi0gICAgZmkKLWVsc2UKLSAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IG91dC9jb25mdGVzdC5lcnIgMT4mNQotICBjb21waWxlcl9jX289bm8KLSAgZWNobyAiJGFjX3Qibm8gMT4mNgotZmkKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotY2htb2QgdSt3IC4KLSRybSBjb25mdGVzdCogb3V0LyoKLXJtZGlyIG91dAotY2QgLi4KLXJtZGlyIGNvbmZ0ZXN0Ci0kcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLQotaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbwotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sby4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgotICBlY2hvICIkcHJvZ25hbWU6ODYyOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg2MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5sbzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX29fbG89bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX29fbG89eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9vX2xvPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBjb21waWxlcl9vX2xvPW5vCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRhY19jIiAxPiY2Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIGVjaG8gIiRhY190JGhhcmRfbGlua3MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIGVjaG8gIioqKiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjIKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LmMiCi0gIGVjaG8gIiRwcm9nbmFtZTo5MTQ6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo5MTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotCi0gIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKLSAgZWxzZQotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLSAgZmkKLSAgCi1maQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KLWlmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYwotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotZWNobyAiJHByb2duYW1lOjk1ODogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6OTU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLSAgbGlua19zdGF0aWNfZmxhZz0KLWZpCi1MREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdC5kYXQKLSAgaWYgbG4gLXMgWCBjb25mdGVzdC5kYXQgMj4vZGV2L251bGw7IHRoZW4KLSAgICAkcm0gY29uZnRlc3QuZGF0Ci0gICAgTE5fUz0ibG4gLXMiCi0gIGVsc2UKLSAgICBMTl9TPWxuCi0gIGZpCi0gIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotZmkKLQotIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KLWlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgYWNfcHJvZz1sZAotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk5MTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gICAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICAgIiIpCi0gICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCi0gICAgICBhY19wcm9nPWxkCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZToxMDE1OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSAgZWxzZQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6MTAxODogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotCUxEPSIkYWNfZGlyLyRhY19wcm9nIgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLQkjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0JIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0JaWYgIiRMRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQllbHNlCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QkTEQiIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIGl0IHJlYWxseSBpcyBvciBpcyBub3QgR05VIGxkLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLWVjaG8gIiRhY190JHdpdGhfZ251X2xkIiAxPiY2Ci0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci0KLWFsbG93X3VuZGVmaW5lZF9mbGFnPQotbm9fdW5kZWZpbmVkX2ZsYWc9Ci1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotbmVlZF92ZXJzaW9uPXVua25vd24KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1hcmNoaXZlX2NtZHM9Ci1hcmNoaXZlX2V4cHN5bV9jbWRzPQotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci1oYXJkY29kZV9kaXJlY3Q9bm8KLWhhcmRjb2RlX21pbnVzX0w9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLXJ1bnBhdGhfdmFyPQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi1leHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci1pbmNsdWRlX2V4cHN5bXM9Ci0jIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi1leGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAotIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0jIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgotIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1jeWd3aW4qIHwgbWluZ3cqKQotICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzOyB0aGVuCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgZmkKLSAgOzsKLQotZXNhYwotCi1sZF9zaGxpYnM9eWVzCi1pZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gIHdsYXJjPScke3dsfScKLQotICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotCi0gICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuIHVzZQotICAgICMgdGhlbS4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0gICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0KLSAgICAjIEV4dHJhY3QgdGhlIHN5bWJvbCBleHBvcnQgbGlzdCBmcm9tIGFuIGAtLWV4cG9ydC1hbGwnIGRlZiBmaWxlLAotICAgICMgdGhlbiByZWdlbmVyYXRlIHRoZSBkZWYgZmlsZSBmcm9tIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QsIHNvIHRoYXQKLSAgICAjIHRoZSBjb21waWxlZCBkbGwgb25seSBleHBvcnRzIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QuCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcz0ndGVzdCAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuYyB8fCBzZWQgLWUgIi9eIyBcL1wqIGx0ZGxsXC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGx0ZGxsLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLzsgcDsgfSIgLWUgZCA8ICQwID4gJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0gICAgICB0ZXN0IC1mICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0IHx8IChjZCAkb2JqZGlyICYmICRDQyAtYyAkc29uYW1lLWx0ZGxsLmMpfgotICAgICAgJERMTFRPT0wgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tb3V0cHV0LWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmICAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkY29udmVuaWVuY2V+Ci0gICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qIDsgKi8vIiA8ICRvYmpkaXIvJHNvbmFtZS1kZWYgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvIEVYUE9SVFMgPiAkb2JqZGlyLyRzb25hbWUtZGVmfgotICAgICAgX2x0X2hpbnQ9MTsKLSAgICAgIGZvciBzeW1ib2wgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbwotCWVjaG8gIglcJHN5bWJvbCBAIFwkX2x0X2hpbnQgOyAiID4+ICRvYmpkaXIvJHNvbmFtZS1kZWY7Ci0JX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOwotICAgICAgZG9uZX4KLSAgICAgIHRlc3QgLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLmMgfHwgc2VkIC1lICIvXiMgXC9cKiBsdGRsbFwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkMCA+ICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgdGVzdCAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCB8fCAoY2QgJG9iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotCi0gICAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSckRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tb3V0cHV0LWxpYiAkb2JqZGlyLyRsaWJuYW1lLmEnIAotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1vICRsaWInCi0gICAgICAjIGNhbiB3ZSBzdXBwb3J0IHNvbmFtZSBhbmQvb3IgZXhwc3ltcyB3aXRoIGEub3V0PyAtb2xpdmEKLSAgICBmaQotICAgIDs7Ci0KLSAgc29sYXJpcyogfCBzeXN2NSopCi0gICAgaWYgJExEIC12IDI+JjEgfCBlZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7ICAgICAgCi0KLSAgc3Vub3M0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICB3bGFyYz0KLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgICAjIGRsbHRvb2wgZG9lc24ndCB1bmRlcnN0YW5kIC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotICAgICAgIyBicm9rZW4gY29sbGVjdDIuCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICBmaQotICAgIDs7Ci0KLSAgYWl4NCopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYiAke3dsfW5vbGlicGF0aCAke3dsfS1iICR7d2x9bGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0gICAgICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0JIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLSAgICAgIHRoZW4KLQkjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBlbHNlCi0JIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotCSMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotCSMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCWhhcmRjb2RlX21pbnVzX0w9eWVzCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0gICAgICBmaQotICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0gICAgZWxzZQotICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBmaQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCi0gICAgYXJjaGl2ZV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tYmV4cGFsbCAke3dsfS1ibm9lbnRyeSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9JwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfScKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4gYWl4NC5bMDFdfGFpeDQuWzAxXS4qKQotICAgICAgIyBBY2NvcmRpbmcgdG8gR3JlZyBXb29sZWRnZSwgLWJleHBhbGwgaXMgb25seSBzdXBwb3J0ZWQgZnJvbSBBSVggNC4yIG9uCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzIDs7Ci0gICAgZXNhYwotICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgbGliZXh0PWxpYgotICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRsaW5rb3B0cyBgZWNobyAiJGRlcGxpYnMiIHwgc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJwotICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJwotICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICRzcmNmaWxlYCcKLSAgICA7OwotCi0gIGZyZWVic2QxKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgZnJlZWJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGhwdXg5KikgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c350ZXN0ICRvYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG9iamRpci8kc29uYW1lICRsaWInIDs7Ci0gICAgKikgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnIDs7Ci0gICAgZXNhYwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAjIGEub3V0Ci0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICAgICAjIEVMRgotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG9zZjQqIHwgb3NmNSopICAjIEFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSAtbXN5bSBmbGFnCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICopICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NCkKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUgCi0gICAgOzsgIAotCi0gIHN5c3Y0LjMqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgOzsKLQotICBzeXN2NSopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKwotICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34kcm0gJGxpYi5leHAnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgZGd1eCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQqTVAqKQotICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgICBsZF9zaGxpYnM9eWVzCi0gICAgZmkKLSAgICA7OwotCi0gIHN5c3Y0LjJ1dzIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgOzsKLQotICB1bml4d2FyZTcqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLWVjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLWlmIHRlc3QgLXogIiROTSI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2Ci0gIGNhc2UgIiROTSIgaW4KLSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgKikKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvdWNiIC91c3IvY2NzL2JpbiAvYmluOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0OyB0aGVuCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0JIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLQkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0JaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtQiIKLQkgIGJyZWFrCi0JZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQkgIE5NPSIkYWNfZGlyL25tIC1wIgotCSAgYnJlYWsKLQllbHNlCi0JICBOTT0ke05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCi0gICAgOzsKLSAgZXNhYwotICBlY2hvICIkYWNfdCROTSIgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgotCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBzeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1zeXN2NCkKLSAgc3ltY29kZT0nW0RGTlNUVV0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JC8kc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgcGlwZV93b3Jrcz1ubwotICAkcm0gY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1tYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBlY2hvICIkcHJvZ25hbWU6MTYzNTogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNjM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgeyBlY2hvICIkcHJvZ25hbWU6MTYzOTogZXZhbCBcIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdFwiIiA+JjU7IGV2YWwgIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdCAyPiY1IjsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCSAgc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCi0JICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kb2JqZXh0IGNvbmZ0c3RtLiRvYmpleHQKLQkgIHNhdmVfTElCUz0iJExJQlMiCi0JICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRvYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNjkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJHNhdmVfTElCUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGdsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gICRybSBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBnbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1pZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiJHthY190fW9rIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiR7YWNfdH1mYWlsZWQiIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQotZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Ci0KLQotcmVsb2FkX2ZsYWc9Ci1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRhY19jIiAxPiY2Ci0jIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCi1yZWxvYWRfZmxhZz0nLXInCi1lY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIgMT4mNgotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpbGVfbWFnaWNfY21kPQotZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW3JlZ2V4XScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRhY19jIiAxPiY2Ci1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICA7OwotCi1haXg0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aG91Z2ggQUlYNC4yCi0gICMgYW5kIGxhdGVyIGxpbmtlciBzdXBwb3J0cyAuc28KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICA7OwotCi1ic2RpNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUuYScKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5saWInCi0gIGZpCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JwotICBmaWxlX21hZ2ljX2NtZD0nJHtPQkpEVU1QfSAtZicKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotICAKLWZyZWVic2QqKQotICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JwotICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGZyZWVic2QyKiB8IGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gICopICMgZnJvbSAzLjIgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yICRsaWJuYW1lLnNsJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3InCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBpcml4NSopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgICMgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aCBwYXNzX2FsbCwgYnV0IGxldCB1cyBrZWVwIGl0IGp1c3QgaW4gY2FzZQotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCi0gICAgOzsKLSAgKikKLSAgICBjYXNlICIkTEQiIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKLQotICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgotICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIGVsc2UKLSAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCi0gICAgY2FzZSAiJGhvc3RfY3B1IiBpbgotICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OwotICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAke2xpYm5hbWV9LnNvJwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgbmVlZF92ZXJzaW9uPW5vCi0gIGZpCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc2NvMy4ydjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAiJGhvc3RfdmVuZG9yIiBpbgotICAgIG5jcikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJwotICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lLnNvLiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiIDE+JjYKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1lY2hvICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLQotIyBPbmx5IHRyeSB0byBidWlsZCB3aW4zMiBkbGxzIGlmIEFDX0xJQlRPT0xfV0lOMzJfRExMIHdhcyB1c2VkIGluCi0jIGNvbmZpZ3VyZS5pbiwgb3RoZXJ3aXNlIGJ1aWxkIHN0YXRpYyBvbmx5IGxpYnJhcmllcy4KLWNhc2UgIiRob3N0X29zIiBpbgotY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gIGlmIHRlc3QgeCRjYW5fYnVpbGRfc2hhcmVkID0geHllczsgdGhlbgotICAgIHRlc3QgeCRlbmFibGVfd2luMzJfZGxsID0geG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBlY2hvICJjaGVja2luZyBpZiBwYWNrYWdlIHN1cHBvcnRzIGRsbHMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLSAgZmkKLTs7Ci1lc2FjCi0KLWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSIgJiYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfY21kIjsgdGhlbgotICBjYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0gICJmaWxlX21hZ2ljICIqKQotICAgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLSAgICAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotICAgIGZpIDs7Ci0gIGVzYWMKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotCi1haXg0KikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgOzsKLWVzYWMKLQotZWNobyAiJGFjX3QkZW5hYmxlX3NoYXJlZCIgMT4mNgotCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotCi1lY2hvICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJGVuYWJsZV9zdGF0aWMiIDE+JjYKLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKLXJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBvYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWVjaG8gIiRhY190JG9iamRpciIgMT4mNgotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2Rsb3Blbicrc2V0fSdgXCIgIT0gc2V0IjsgdGhlbgotICBsdF9jdl9kbG9wZW49bm8gbHRfY3ZfZGxvcGVuX2xpYnM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyMTI6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjAgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotZGxvcGVuKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMjMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjI1MjogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19kbG9wZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU3ICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbigpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKLWNob2tlIG1lCi0jZWxzZQotZGxvcGVuKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIyODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nZGxvcGVuYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjI5OTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nZGxkX2xpbmsgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDcgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxkX2xpbmsoKTsKLQotaW50IG1haW4oKSB7Ci1kbGRfbGluaygpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjMyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjMzOTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobF9sb2FkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0NCAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3NobF9sb2FkKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zaGxfbG9hZCkKLWNob2tlIG1lCi0jZWxzZQotc2hsX2xvYWQoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjM2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydzaGxfbG9hZGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjM4NzogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nc2hsX2xvYWQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTUgImx0Y29uZmlnIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLXNobF9sb2FkKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyNDA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1maQotCi0gICAgCi1maQotCi0gIAotZmkKLQotCi1maQotCi1maQotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBmaQotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW4iIGluCi0gIGRsb3BlbikKLWZvciBhY19oZHIgaW4gZGxmY24uaDsgZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjI0NTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU3ICJsdGNvbmZpZyIKLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IGZub3JkID0gMDsKLUVPRgotYWNfdHJ5PSIkYWNfY29tcGlsZSA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvICRwcm9nbmFtZToyNDYyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICAgaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuCi0gICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotICAgIGZpCi0gICAgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjQ5MDogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyNDk4ICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLQkgICAgICAgaWYocHRyMSB8fCBwdHIyKSB7IGRsY2xvc2Uoc2VsZik7IGV4aXQoMCk7IH0gfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjU0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmIiAxPiY2Ci0KLSAgaWYgdGVzdCAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHllczsgdGhlbgotICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjU2MzogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDI1NzEgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotICAgIGlmKHB0cjEgfHwgcHRyMikgeyBkbGNsb3NlKHNlbGYpOyBleGl0KDApOyB9IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjI2MTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcwotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgMT4mNgotZmkKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCi0jIHVzZWQgbGF0ZXIuCi1sdGVjaG89IiRlY2hvIgotaWYgdGVzdCAiWCRsdGVjaG8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIGx0ZWNobz0iJENPTkZJR19TSEVMTCBcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLUxUU0hFTEw9IiRTSEVMTCIKLQotTFRDT05GSUdfVkVSU0lPTj0iJFZFUlNJT04iCi0KLSMgT25seSBxdW90ZSB2YXJpYWJsZXMgaWYgd2UncmUgdXNpbmcgbHRtYWluLnNoLgotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMuCi0gIGZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBcCi0gICAgb2xkX0xEIG9sZF9MREZMQUdTIG9sZF9MSUJTIFwKLSAgICBvbGRfTk0gb2xkX1JBTkxJQiBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfT0JKRFVNUCBvbGRfQVMgXAotICAgIEFSIENDIExEIExOX1MgTk0gTFRTSEVMTCBMVENPTkZJR19WRVJTSU9OIFwKLSAgICByZWxvYWRfZmxhZyByZWxvYWRfY21kcyB3bCBcCi0gICAgcGljX2ZsYWcgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgbGlibmFtZV9zcGVjIFwKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgXAotICAgIFJBTkxJQiBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotICAgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIGFyY2hpdmVfZXhwc3ltX2NtZHMgcG9zdGluc3RhbGxfY21kcyBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgZGVwbGlic19jaGVja19tZXRob2QgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICAgIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIGdsb2JhbF9zeW1ib2xfcGlwZSBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIGNvbXBpbGVyX2NfbyBjb21waWxlcl9vX2xvIG5lZWRfbG9ja3MgZXhjbHVkZV9leHBzeW1zIGluY2x1ZGVfZXhwc3ltczsgZG8KLQotICAgIGNhc2UgIiR2YXIiIGluCi0gICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBmaW5pc2hfY21kcyB8IHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAiJGx0ZWNobyIgaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRlY2hvPWAkZWNobyAiWCRsdGVjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLSAgdHJhcCAiJHJtIFwiJG9maWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gIGVjaG8gImNyZWF0aW5nICRvZmlsZSIKLSAgJHJtICIkb2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkb2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJGVjaG8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0Y29uZmlnIG9yIGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9InNlZCAtZSBzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJYXCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi1FT0YKLSAgY2ZnZmlsZT0iJG9maWxlIgotICA7OwotCi0qKQotICAjIERvdWJsZS1xdW90ZSB0aGUgdmFyaWFibGVzIHRoYXQgbmVlZCBpdCAoZm9yIGFlc3RoZXRpY3MpLgotICBmb3IgdmFyIGluIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBcCi0gICAgb2xkX0xEIG9sZF9MREZMQUdTIG9sZF9MSUJTIFwKLSAgICBvbGRfTk0gb2xkX1JBTkxJQiBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfT0JKRFVNUCBvbGRfQVM7IGRvCi0gICAgZXZhbCAiJHZhcj1cXFwiXCR2YXJcXFwiIgotICBkb25lCi0KLSAgIyBKdXN0IGNyZWF0ZSBhIGNvbmZpZyBmaWxlLgotICBjZmdmaWxlPSIkb2ZpbGUuY2ZnIgotICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkY2ZnZmlsZSIKLSAgJHJtICIkY2ZnZmlsZSIKLSAgY2F0IDw8RU9GID4gIiRjZmdmaWxlIgotIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIExpYnRvb2wgY29uZmlndXJhdGlvbiBmaWxlLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLUVPRgotICA7OwotZXNhYwotCi1jYXQgPDxFT0YgPj4gIiRjZmdmaWxlIgotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyBDQz0kb2xkX0NDIENGTEFHUz0kb2xkX0NGTEFHUyBDUFBGTEFHUz0kb2xkX0NQUEZMQUdTIFxcCi0jIExEPSRvbGRfTEQgTERGTEFHUz0kb2xkX0xERkxBR1MgTElCUz0kb2xkX0xJQlMgXFwKLSMgTk09JG9sZF9OTSBSQU5MSUI9JG9sZF9SQU5MSUIgTE5fUz0kb2xkX0xOX1MgXFwKLSMgRExMVE9PTD0kb2xkX0RMTFRPT0wgT0JKRFVNUD0kb2xkX09CSkRVTVAgQVM9JG9sZF9BUyBcXAotIyAgICQwJGx0Y29uZmlnX2FyZ3MKLSMKLSMgQ29tcGlsZXIgYW5kIG90aGVyIHRlc3Qgb3V0cHV0IHByb2R1Y2VkIGJ5ICRwcm9nbmFtZSwgdXNlZnVsIGZvcgotIyBkZWJ1Z2dpbmcgJHByb2duYW1lLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi0jIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KLUxUQ09ORklHX1ZFUlNJT049JExUQ09ORklHX1ZFUlNJT04KLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JExUU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0ZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRBUgotCi0jIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCi1DQz0kQ0MKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JExECi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JExOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kTk0KLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRyZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JHJlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSR3bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJG9iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRwaWNfZmxhZwotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kY29tcGlsZXJfY19vCi0KLSMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KLWNvbXBpbGVyX29fbG89JGNvbXBpbGVyX29fbG8KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/Ci1uZWVkX2xvY2tzPSRuZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuPSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsaW5rX3N0YXRpY19mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbm9fYnVpbHRpbl9mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSR0aHJlYWRfc2FmZV9mbGFnX3NwZWMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGxpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGxpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JHNvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kYXJjaGl2ZV9jbWRzCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi1wb3N0aW5zdGFsbF9jbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JHBvc3R1bmluc3RhbGxfY21kcwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JG5vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRmaW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGdsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRleGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGluY2x1ZGVfZXhwc3ltcwotCi1FT0YKLQotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gIGVjaG8gJyMjIyBFTkQgTElCVE9PTCBDT05GSUcnID4+ICIkb2ZpbGUiCi0gIGVjaG8gPj4gIiRvZmlsZSIKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRvZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KLSAgc2VkICckcScgIiRsdG1haW4iID4+ICIkb2ZpbGUiIHx8IChybSAtZiAiJG9maWxlIjsgZXhpdCAxKQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgQ29tcGlsZSB0aGUgbGlidG9vbCBwcm9ncmFtLgotICBlY2hvICJGSVhNRTogd291bGQgY29tcGlsZSAkbHRtYWluIgotICA7OwotZXNhYwotCi10ZXN0IC1uICIkY2FjaGVfZmlsZSIgfHwgZXhpdCAwCi0KLSMgQUNfQ0FDSEVfU0FWRQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9sdG1haW4uc2ggYi9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzE1MDIuLjAwMDAwMDAKLS0tIGEvbHRtYWluLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAzNyArMCwwIEBACi0jIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIENvbnN0YW50cy4KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4zLjQKLVRJTUVTVEFNUD0iICgxLjM4NS4yLjE5NiAxOTk5LzEyLzA3IDIxOjQ3OjU3KSIKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotU1AyTkw9J3RyIFwwNDAgXDAxMicKLU5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAkIyAtZ3QgMAotZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICIkYXJnIiBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICIkcHJldiIgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgIiRhcmciIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgc2VkIC1lICcxLC9eIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkMAotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICBlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgIGNhc2UgIiRub25vcHQiIGluCi0gICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKLSAgICAgIG1vZGU9bGluawotICAgICAgZm9yIGFyZwotICAgICAgZG8KLQljYXNlICIkYXJnIiBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIHVzZXJfdGFyZ2V0PW5vCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLW8pCi0JaWYgdGVzdCAiJHVzZXJfdGFyZ2V0IiAhPSAibm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JdXNlcl90YXJnZXQ9bmV4dAotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkdXNlcl90YXJnZXQiIGluCi0gICAgICBuZXh0KQotCSMgVGhlIG5leHQgb25lIGlzIHRoZSAtbyB0YXJnZXQgbmFtZQotCXVzZXJfdGFyZ2V0PXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIHllcykKLQkjIFdlIGdvdCB0aGUgb3V0cHV0IGZpbGUKLQl1c2VyX3RhcmdldD1zZXQKLQlsaWJvYmo9IiRhcmciCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKLSAgICAgIHNyY2ZpbGU9IiRhcmciCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0KLSAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KLSAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5Ci0gICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgotICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICBjYXNlICIkbGFzdGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgIHNldCkKLSAgICAgIDs7Ci0gICAgbm8pCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNmbXNvXScKLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC4uKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCBsbiAiJDAiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBlY2hvICRzcmNmaWxlID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0gICAgICAjIEhvd2V2ZXIsIG1ha2Ugc3VyZSB3ZSBvbmx5IHNldCBpdCBmb3Igbm9uLUphdmEgY29kZS4KLSAgICAgIGNhc2UgIiRzcmNmaWxlIiBpbgotCSouamF2YXwqLmNsYXNzKQotCSAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcGljX2ZsYWcgJHNyY2ZpbGUiOzsKLQkqKQotCSAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSAkcGljX2ZsYWcgLURQSUMiOzsKLSAgICAgIGVzYWMKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQlsb19saWJvYmo9IiRsaWJvYmoiCi0JZGlyPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQlpZiB0ZXN0ICJYJGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCi0JICBkaXI9IiRvYmpkaXIiCi0JZWxzZQotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZmkKLQlsaWJvYmo9IiRkaXIvImAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCWlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRsaWJvYmoiCi0JICAkcnVuICRybSAkbGlib2JqCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkZGlyIgotCSAgJHJ1biAkbWtkaXIgJGRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRkaXI7IHRoZW4KLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX29fbG8iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJGxpYm9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGVsaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQlvdXRwdXRfb2JqPSIkb2JqIgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgotICAgICAgZmkKLQotICAgICAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqIgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkbGlib2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxpYm9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgotICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBSZW5hbWUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIgdG8gb2JqCi0JaWYgdGVzdCAtZiAkb2JqOyB0aGVuCi0JICAkc2hvdyAkcm0gJG9iagotCSAgJHJ1biAkcm0gJG9iagotCWZpCi0KLQkkc2hvdyAiJG12ICRsaWJvYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotCi0JeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLQkgIHhkaXI9Ii4iCi0JZWxzZQotCSAgeGRpcj0iJHhkaXIiCi0JZmkKLQliYXNlb2JqPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgInMlLiovJSUiYAotCWxpYm9iaj1gJGVjaG8gIlgkYmFzZW9iaiIgfCAkWHNlZCAtZSAiJG8ybG8iYAotCSMgTm93IGFycmFuZ2UgdGhhdCBvYmogYW5kIGxvX2xpYm9iaiBiZWNvbWUgdGhlIHNhbWUgZmlsZQotCSRzaG93ICIoY2QgJHhkaXIgJiYgJExOX1MgJGJhc2VvYmogJGxpYm9iaikiCi0JaWYgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJExOX1MgJGJhc2VvYmogJGxpYm9iaiknOyB0aGVuCi0JICBleGl0IDAKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUiCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0Jb3V0cHV0X29iaj0iJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqIgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgeCJgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9IHgiJHNyY2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCB4IiRvdXRwdXRfb2JqIiAhPSB4IiRvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG8gbm90Ci0gICAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gXCRsaWJvYmoiIHx8IGV4aXQgJD8KLSAgICAgIGVsc2UKLQkjIE1vdmUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIKLQkkc2hvdyAiJG12ICRsaWJvYmogJGxvX2xpYm9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRsb19saWJvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAgICAgJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgQ19jb21waWxlcj0iJENDIiAjIHNhdmUgaXQsIHRvIGNvbXBpbGUgZ2VuZXJhdGVkIEMgc291cmNlcwotICAgICMgQWx3YXlzIHJlc3BlY3QgdGhlIENDIGNvbmZpZ3VyZWQgaW4gYnkgbHRjb25maWcuCi0gICAgQ0M9IiRub25vcHQiCi0gICAgIyBDWUdOVVMgTE9DQUw6IHRyb21leS9qYXZhCi0gICAgIyBBZGQgLUIgb3B0aW9ucyB0byBsaW5rIGxpbmUuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAgY2FzZSAiJGFyZyIgaW4KLQktQiopCi0JICAgQ0M9IiRDQyAkYXJnIgotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgIGRvbmUKLSAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgICBjYXNlICIkaG9zdCIgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLSAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKLSAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKLSAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKLSAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZva2F0aW9uLgotICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KLQotICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCi0gICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAotICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKLSAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgotICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLQotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKLSAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KLSMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyAjaWZuZGVmIF9fQ1lHV0lOX18KLSMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCi0jICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jICMgIGVuZGlmCi0jICNlbmRpZgotIwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgZXh0ZXJuICJDIiB7Ci0jICNlbmRpZgotIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgfQotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fQ1lHV0lOX18KLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyAjZW5kaWYKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBpbXBvcnQgbGlicmFyaWVzCi0gICAgICAjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKLSAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KLSMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIAotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxpYnRvb2wuCi0jIAotIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMgICovCi0jIAotIyAgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KLSMgICNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciBvcGVuKCksIGxzZWVrKCksIHJlYWQoKSAqLwotIyAgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCi0jICAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQxNiAoZmQsIG9mZnNldCkKLSMgICAgICAgaW50IGZkOwotIyAgICAgICBpbnQgb2Zmc2V0OwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0jICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0jICAgIHJlYWQgKGZkLCBiLCAyKTsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfZ2V0MzIgKGZkLCBvZmZzZXQpCi0jICAgICAgaW50IGZkOwotIyAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDQpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2FzMzIgKHB0cikKLSMgICAgICAgdm9pZCAqcHRyOwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIGludAotIyAgbWFpbiAoYXJnYywgYXJndikKLSMgICAgICBpbnQgYXJnYzsKLSMgICAgICBjaGFyICphcmd2W107Ci0jICB7Ci0jICAgICAgaW50IGRsbDsKLSMgICAgICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7Ci0jICAgICAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0jICAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKLSMgCi0jICAgICAgZmlsZW5hbWUgPSBhcmd2WzFdOwotIyAKLSMgICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7Ci0jICAgICAgaWYgKCFkbGwpCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0jICAgIAotIyAgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotIyAgCWlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyAgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotIyAgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKLSMgCi0jICAgICAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotIyAgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotIyAgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSMgCi0jICAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotIyAgCXJldHVybiAxOwotIyAKLSMgICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSMgICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotIyAgICAgIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsyKTsKLSMgICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0jICAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotIyAKLSMgICAgICBleHBwdHIgPSAwOwotIyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSMgICAgICB7Ci0jICAJY2hhciBzbmFtZVs4XTsKLSMgIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0jICAJdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0jICAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0jICAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSMgIAlsc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSMgIAlyZWFkKGRsbCwgc25hbWUsIDgpOwotIyAgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLSMgIAl7Ci0jICAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0jICAJCWV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgYnJlYWs7Ci0jICAJfQotIyAgICAgIH0KLSMgCi0jICAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOwotIyAgICAgIGxzZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotIyAgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOwotIyAgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLSMgCi0jICAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotIyAgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotIyAKLSMgICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKLSMgICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKLSMgICAgICB7Ci0jICAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0jICAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKLSMgICAgICB9Ci0jIAotIyAgICAgIHJldHVybiAwOwotIyAgfQotIyAvKiBpbXBnZW4uYyBlbmRzIGhlcmUgKi8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgbGlua29wdHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWCBcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgICMgbm93IHByZXBlbmQgdGhlIHN5c3RlbS1zcGVjaWZpYyBvbmVzCi0gICAgZXZhbCBsaWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCRsaWJfc2VhcmNoX3BhdGhcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLSAgICAKLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgb2Jqcz0KLSAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCXByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICIkcHJldiIgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHByZXYiIGluCi0JZGxmaWxlc3xkbHByZWZpbGVzKQotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBwcmVsb2FkPXllcwotCSAgZmkKLQkgIGNhc2UgIiRhcmciIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoIHwgeHJwYXRoKQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkYXJnIiBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgICAgZXhpdCAxCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCSopCi0JICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JZXhwb3J0X2R5bmFtaWM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBhbGxvd2VkIgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtTCopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgIiRkaXIiIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgotCSAgICBhYnNkaXI9IiRkaXIiCi0JICBmaQotCSAgZGlyPSIkYWJzZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAiICRkZXBsaWJzICIgaW4KLQkqIiAkYXJnICIqKSA7OwotCSopIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciOzsKLQllc2FjCi0JY2FzZSAiICRsaWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiOzsKLQllc2FjCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICBkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JICBjYXNlICI6JGRsbHNlYXJjaHBhdGg6IiBpbgotCSAgOjopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hkaXIiOzsKLQkgICoiOiRkbGxzZWFyY2hkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGxsc2VhcmNoZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiJGFyZyIgPSAiLWxjIjsgdGhlbgotCSAgY2FzZSAiJGhvc3QiIGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWVsaWYgdGVzdCAiJGFyZyIgPSAiLWxtIjsgdGhlbgotCSAgY2FzZSAiJGhvc3QiIGluCi0JICAqLSotY3lnd2luKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAiJGRpciIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiR4cnBhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCi0gICAgICAtKiB8ICsqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgIiRhcmciIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi5vIHwgKi5vYmogfCAqLmEgfCAqLmxpYikKLQkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW4iID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHByZXY9Ci0JZmkKLQlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JZGxuYW1lPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgotCWluc3RhbGxlZD15ZXMKLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkYXJnIiBpbgotCSovKiB8ICpcXCopIC4gJGFyZyA7OwotCSopIC4gLi8kYXJnIDs7Ci0JZXNhYwotCi0JIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgotCWxpbmtsaWI9Ci0JZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgbGlua2xpYj0iJGwiCi0JZG9uZQotCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCW5hbWU9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0KLQlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCi0JICBkaXI9IiRsaWJkaXIiCi0JZWxzZQotCSAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgZGlyPSIkb2JqZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRkaXIvJG9iamRpciIKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiOyB0aGVuCi0JICAjIEV4dHJhY3QgLVIgYW5kIC1MIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICB0ZW1wX2RlcGxpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgIiRkZXBsaWIiIGluCi0JICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSBjYXNlICIgJHJwYXRoICR4cnBhdGggIiBpbgotCQkgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OwotCQkgZXNhYzs7Ci0JICAgIC1MKikgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAkdGVtcF9kZXBsaWJzICIgaW4KLQkJICoiICRkZXBsaWIgIiopIDs7Ci0JCSAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCQkgZXNhYwotCQkgdGVtcF9kaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JCSBjYXNlICIgJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JCSAqIiAkdGVtcF9kaXIgIiopIDs7Ci0JCSAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJHRlbXBfZGlyIjs7Ci0JCSBlc2FjCi0JCSA7OwotCSAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCi0JZmkKLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZGVwbGlicz0iJGRlcGxpYnMkZGVwZW5kZW5jeV9saWJzIgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBlbHNlCi0JICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCi0JICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIGVsc2UKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JICBwcmV2PQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKLQkgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkZGlyIiBpbgotCSAgW1xcL10gfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkgICopCi0JICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIiAxPiYyCi0JICAgICAgYWJzZGlyPSIkZGlyIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAjIHNlYXJjaCBwYXRoLCB1bmxlc3MgdGhleSBoYXZlIGJlZW4gcmVxdWVzdGVkIHdpdGggLVIuCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAqIiAkYWJzZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIiAKLQkgICAgZXNhYwotCSAgICA7OwotCSAgZXNhYwotCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICBlc2FjCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGxpYl9saW5rZWQ9eWVzCi0JICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotCSAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkZGlyLyRsaW5rbGliIgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCQlkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiCi0JCWVsc2UKLQkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIgotCQlmaQotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1zdW5vcyopCi0JCWNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIC1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICByZWxpbmspCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhYnNkaXIvJGxpbmtsaWIiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGFic2RpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRhYnNkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokYWJzZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWJzZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICAqKQotCSAgICBsaWJfbGlua2VkPW5vCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKLQkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IiBpbgotCSAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbHNlCi0JICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQllbHNlCi0JICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgZWxzZQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQlmaQotCi0JIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAiIikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotCi0gICAgKi5hIHwgKi5saWIpCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBhcmNoaXZlcyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICA7OwotCi0gICAgKi5sYSkKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgIiRvdXRwdXRuYW1lIiBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLQlvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgICAgZWxzZQotCW91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PwotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBzaGFyZWQgbGlicmFyaWVzIGludG8gbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLQkgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgIGxpYmV4dD1hbAotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQljdXJyZW50PSIkMiIKLQlyZXZpc2lvbj0iJDMiCi0JYWdlPSIkNCIKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAiJGN1cnJlbnQiIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHJldmlzaW9uIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJGFnZSIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0Jbm9uZSkgOzsKLQotCWlyaXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7Ci0JICA7OwotCi0Jd2luZG93cykKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seQotCSAgIyB3YW50IG9uZSBleHRlbnNpb24gb24gV2luZG93cyA5NS4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvci0kYWdlLSRyZXZpc2lvbiIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCi0JaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3RyaW5nPSIwLjAiCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQkKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgIGZpCi0JZWxzZQotCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0JZmkKLQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiogfCAqLSotYmVvcyopCi0JICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICA7OwotCSopCi0JICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMuCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KLSAgICAgIGlmIHRlc3QgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLQkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0JcGFzc19hbGwpCi0JICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQlzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCWRlcGxpYl9tYXRjaD0kMgotCQlpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZSB0aGUgc2l0dWF0aW9uOgotCSAgICAjIENvbXBpbGUgYSBzZXBlcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCi0JICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgZGVwbGliX21hdGNoPSQyCi0JCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgZWxzZQotCQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICBlY2hvCi0JCSAgICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCi0JCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JCSAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgIGVjaG8KLQkJICBlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCSAgOzsKLQlmaWxlX21hZ2ljKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcIiQyIFwoLipcKVwiYCIKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICAgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIFwKLQkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlIAotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8IHNlZCAncy8uKiAtPiAvLydgCi0JCQljYXNlICIkcG90bGlibGluayIgaW4KLQkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkZWNobyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBzZWQgMTBxIFwKLQkJCSB8IGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgICBkb25lCi0JICAgICAgZG9uZQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQllY2hvCi0JCWVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRhX2RlcGxpYi4iCi0JCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKQotCSAgbmV3ZGVwbGlicz0iIgotCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAotCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICBlY2hvCi0JICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICBlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQkgIGZpCi0JZmkKLQkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0gICAgICBmaQotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0gICAgICAKLSAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JcmVhbG5hbWU9IiQyIgotCXNoaWZ0OyBzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KLQkjIChlLmcuIGFpeCkgaW4gY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCi0JZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KLQkgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLQkgICAgeGRpcj0iLiIKLQkgIGVsc2UKLQkgICAgeGRpcj0iJHhkaXIiCi0JICBmaQotCSAgYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIGlmIHRlc3QgISAtZiAkeGRpci8kb2xkb2JqOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICJlZ3JlcCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKLQkgICAgJHNob3cgIm1rZGlyICRnZW50b3AiCi0JICAgICRydW4gbWtkaXIgIiRnZW50b3AiCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotCSAgICAgIGNhc2UgIiR4bGliIiBpbgotCSAgICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgeGFicz0iJHhsaWIiIDs7Ci0JICAgICAgKikgeGFicz1gcHdkYCIvJHhsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICB4ZGlyPSIkZ2VudG9wLyR4bGliIgotCi0JICAgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAgICAgJHNob3cgIm1rZGlyICR4ZGlyIgotCSAgICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICAgIHN0YXR1cz0kPwotCSAgICAgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgotCQlleGl0ICRzdGF0dXMKLQkgICAgICBmaQotCSAgICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgICAgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCBcJHhhYnMpIiB8fCBleGl0ICQ/Ci0KLQkgICAgICBsaWJvYmpzPSIkbGlib2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgICBkb25lCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKLQkgIGxpbmtvcHRzPSIkbGlua29wdHMgJGZsYWciCi0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCWVsc2UKLQkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCWZpCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8gfCAqLm9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIG9iamVjdHMiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKLSAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCi0gICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQotICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KLSAgICAgIHJlbG9hZF9jb252X29ianM9Ci0gICAgICBnZW50b3A9Ci0gICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgotICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotICAgICAgd2w9IAotCi0gICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICIkZ2VudG9wIgotCSAgJHNob3cgIm1rZGlyICRnZW50b3AiCi0JICAkcnVuIG1rZGlyICIkZ2VudG9wIgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICBleGl0ICRzdGF0dXMKLQkgIGZpCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbwotCSAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JICAgIGNhc2UgIiR4bGliIiBpbgotCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OwotCSAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgICAgZXNhYwotCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgotCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPwotCi0JICAgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgZG9uZQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiCi0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICRnZW50b3AKLQlmaQotCi0JZXhpdCAwCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBlbHNlCi0JIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0JJHNob3cgJHJtICRsaWJvYmoKLQkkcnVuICRybSAkbGlib2JqCi0JeGRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGxpYm9iaiI7IHRoZW4KLQkgIHhkaXI9Ii4iCi0JZWxzZQotCSAgeGRpcj0iJHhkaXIiCi0JZmkKLQliYXNlb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkkc2hvdyAiKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopIgotCSRydW4gZXZhbCAnKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopJyB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkkcnVuICR7cm19ciAkZ2VudG9wCi0gICAgICBmaQotCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0KLSAgICAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KLSAgICAqKQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuIiA9IHVua25vd24gJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gJiYKLQkgICB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd247IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgQUNfTElCVE9PTF9ETE9QRU4nIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCi0JZmkgCi0gICAgICBmaQotICAgIAotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgICBlbHNlCi0Jb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBiaW5hcnkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIHRoZW4gd3JhcCBpdC4KLSAgICAgIGlmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICIkZGxzeW1zIiBpbgotCSIiKSA7OwotCSouYykKLQkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0JICBubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5ubSIKLQotCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCi0KLQkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0JICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gPiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KLSNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgotCi0JICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgICAgZG9uZQotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgICAgCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXQuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAic2VkIC1uIC1lICcvXjogQFBST0dSQU1AJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZWxzZQotCSAgICAgICRydW4gZXZhbCAic2VkIC1lICdzL1woW11bLipeJF1cKS9cXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8IHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwgc29ydCArMiB8IHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIHNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcIlwxXCIsIChsdF9wdHJfdCkgMH0sL3AnIFwKLQkJLWUgJ3MvXi4gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvcCcgXAotCQkgIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgIGZpCi0KLQkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLQkgIGNhc2UgIiRob3N0IiBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikNCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMgLURGUkVFQlNEX1dPUktBUk9VTkQiOzsKLQkgICAgZXNhYzs7Ci0JICAqLSotaHB1eCopCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMiOzsKLQkgICAgZXNhYwotCSAgZXNhYwotCi0JICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgotCSAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLQkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLQkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKLQlzdGF0dXM9JD8KLQkKLQkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JZmkKLQotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgIiRkaXIiIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotICAgICAgCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0gICAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLQl2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIiYGV2YWwgXCRlY2hvIFwiWCckJyR2YXJcIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAiXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JZG9uZQotCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0JY2FzZSAiJDAiIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7OwotCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWBlY2hvICRvdXRwdXR8c2VkICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkkcm0gJG91dHB1dAotCXRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQotCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCi0KLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgotaWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCi0gICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0gIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9JyRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzJwotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAotIgotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKLSAgZG9uZQotCi0gICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCi0gIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKLSAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKLSIKLQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0gIAotICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKLSAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8IHNlZCAxcVxgOyBcXAotICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCi0KLSAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgotCi0gICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KLSAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCi0gICAgZWxzZQotICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gICAgZmkiCi0KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKLSAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCi0gICAgICBpZiAoY2QgXCJcJHRoaXNkaXJcIiAmJiBldmFsIFwkcmVsaW5rX2NvbW1hbmQpOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAotICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOwotICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9Ci0gICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gIGZpIgotCWVsc2UKLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSIKLQlmaQotCi0JZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKLQotICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgotICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCi0gICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzo6KlwkLy8nXGAKLQotICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgotIgotCWZpCi0KLQkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgotCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICi0gICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKLSIKLQlmaQotCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0iCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3IHwgKi0qLW9zMiopCi0JICAjIHdpbjMyIHN5c3RlbXMgbmVlZCB0byB1c2UgdGhlIHByb2cgcGF0aCBmb3IgZGxsCi0JICAjIGxvb2t1cCB0byB3b3JrCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwkcHJvZ2RpclxcXFxcJHByb2dyYW0gXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQkqKQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgIyBFeHBvcnQgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0uCi0gICAgICBQQVRIPVwiXCRwcm9nZGlyOlwkUEFUSFwiCi0gICAgICBleHBvcnQgUEFUSAotCi0gICAgICBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCWVzYWMKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKLSAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKLSAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotCWNobW9kICt4ICRvdXRwdXQKLSAgICAgIGZpCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzX3NhdmUiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpCi0JYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgotCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSRydW4gJHtybX1yICIkZ2VudG9wIgotCSRzaG93ICJta2RpciAkZ2VudG9wIgotCSRydW4gbWtkaXIgIiRnZW50b3AiCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0JZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0JICAKLQkjIEFkZCBpbiBtZW1iZXJzIGZyb20gY29udmVuaWVuY2UgYXJjaGl2ZXMuCi0JZm9yIHhsaWIgaW4gJGFkZGxpYnM7IGRvCi0JICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JICBjYXNlICIkeGxpYiIgaW4KLQkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgeGFicz0iJHhsaWIiIDs7Ci0JICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgIGVzYWMKLQkgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICRzaG93ICIke3JtfXIgJHhkaXIiCi0JICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAkcnVuIG1rZGlyICIkeGRpciIKLQkgIHN0YXR1cz0kPwotCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQkgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IFwkeGFicykiIHx8IGV4aXQgJD8KLQotCSAgb2xkb2Jqcz0iJG9sZG9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLiR7b2JqZXh0fSAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNcIgotICAgICAgZWxzZQotCSMgRW5zdXJlIHRoYXQgd2UgaGF2ZSAubyBvYmplY3RzIGluIHBsYWNlIGluIGNhc2Ugd2UgZGVjaWRlZAotCSMgbm90IHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBoYXZlIGZhbGxlbiBiYWNrIHRvIGJ1aWxkaW5nCi0JIyBzdGF0aWMgbGlicyBldmVuIHRob3VnaCAtLWRpc2FibGUtc3RhdGljIHdhcyBwYXNzZWQhCi0JZm9yIG9sZG9iaiBpbiAkb2xkb2JqczsgZG8KLQkgIGlmIHRlc3QgISAtZiAkb2xkb2JqOyB0aGVuCi0JICAgIHhkaXI9YCRlY2hvICJYJG9sZG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2xkb2JqIjsgdGhlbgotCSAgICAgIHhkaXI9Ii4iCi0JICAgIGVsc2UKLQkgICAgICB4ZGlyPSIkeGRpciIKLQkgICAgZmkKLQkgICAgYmFzZW9iaj1gJGVjaG8gIlgkb2xkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIG9iaj1gJGVjaG8gIlgkYmFzZW9iaiIgfCAkWHNlZCAtZSAiJG8ybG8iYAotCSAgICAkc2hvdyAiKGNkICR4ZGlyICYmICR7TE5fU30gJG9iaiAkYmFzZW9iaikiCi0JICAgICRydW4gZXZhbCAnKGNkICR4ZGlyICYmICR7TE5fU30gJG9iaiAkYmFzZW9iaiknIHx8IGV4aXQgJD8KLQkgIGZpCi0JZG9uZQotCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotICAgICAgZmkKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KLSAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgotICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCWRvbmUKLQlkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbwotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCSAgZmkKLQkgICRybSAkb3V0cHV0Ci0JICAkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQotIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckZGxuYW1lJwotCi0jIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KLWxpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJwotCi0jIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KLW9sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCi0KLSMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJwotCi0jIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgotY3VycmVudD0kY3VycmVudAotYWdlPSRhZ2UKLXJldmlzaW9uPSRyZXZpc2lvbgotCi0jIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KLWluc3RhbGxlZD0kaW5zdGFsbGVkCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJ1wKLSIKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaDsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9IiRub25vcHQiCi0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgIiRhcmciIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSIkYXJnIgotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIHByZXY9Ii1mIiA7OwotICAgICAgLWcpIHByZXY9Ii1nIiA7OwotICAgICAgLW0pIHByZXY9Ii1tIiA7OwotICAgICAgLW8pIHByZXY9Ii1vIiA7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKSA7OwotCi0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0iJGFyZyIKLQkgIGNvbnRpbnVlCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgotICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0gICAgY2FzZSAiJGRlc3RkaXIiIGluCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0JY2FzZSAiJGZpbGUiIGluCi0JKi5sbykgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5hIHwgKi5saWIpCi0JIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KLQlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGZpbGUiIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLQlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZWxzZQotCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQotCWRpcj0iYCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvIgotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0JZGlyPSIkZGlyJG9iamRpciIKLQotCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0JICByZWFsbmFtZT0iJDIiCi0JICBzaGlmdAotCSAgc2hpZnQKLQotCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCi0JICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KLQkJJHNob3cgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCQkkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCWNhc2UgIiRkZXN0ZmlsZSIgaW4KLQkqLmxvKQotCSAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIDs7Ci0JKi5vIHwgKi5vYmopCi0JICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0JICBkZXN0ZmlsZT0KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLQlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KLQlmaQotCWV4aXQgMAotCTs7Ci0KLSAgICAgICopCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICIkZmlsZSIgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLQkgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkZmlsZSciIDE+JjIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgICAgIGNhc2UgIiRsaWIiIGluCi0JICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JICAgICAgKikgLiAuLyRsaWIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AiCi0JICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKLQkgICAgICBmaW5hbGl6ZT1ubwotCSAgICBmaQotCSAgZG9uZQotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgICB0bXBkaXI9Ii90bXAiCi0JICAgICAgdGVzdCAtbiAiJFRNUERJUiIgJiYgdG1wZGlyPSIkVE1QRElSIgotCSAgICAgIHRtcGRpcj0iJHRtcGRpci9saWJ0b29sLSQkIgotCSAgICAgIGlmICRta2RpciAtcCAiJHRtcGRpciIgJiYgY2htb2QgNzAwICIkdG1wZGlyIjsgdGhlbiA6Ci0JICAgICAgZWxzZQotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJHRtcGRpciciIDE+JjIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCi0JICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCi0KLQkgICAgICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgotCSAgICAgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICAgICAgZWxzZQotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKLQkJJHtybX1yICIkdG1wZGlyIgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIiAxPiYyCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0aW5zdGFsbF9jbWRzXCIKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWMgJFNIRUxMICQwIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycwotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLSAgICBhZG1pbmNtZHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0IDAKLQotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICBlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICBlY2hvCi0gICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCi0gICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIFxgLUxMSUJESVInIgotICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgZWNobwotICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgIC0qKSA7OwotICAgICAgKikKLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLSAgICAgICAgZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgZmkKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb21lbnQgdmFyaWFibGVzCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0JTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCi0KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBleGVjIFwkY21kJGFyZ3MiCi0gICAgICBleGl0IDEKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgIGV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICAgICRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgMAotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgdW5pbnN0YWxsIG1vZGUKLSAgdW5pbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IHVuaW5zdGFsbCIKLSAgICBybT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7Ci0gICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICIkbmFtZSIgaW4KLSAgICAgICoubGEpCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgLiAkZGlyLyRuYW1lCi0KLQkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCi0JICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbiIKLQkgIGRvbmUKLQkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0KLQkgICRzaG93ICIkcm0gJHJtZmlsZXMiCi0JICAkcnVuICRybSAkcm1maWxlcwotCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotCSAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkb2JqIgotCWZpCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0KLSAgICAgICopCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0gIGVzYWMKLQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgIiRtb2RlIiBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLSAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0gICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0gICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0gICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLQotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4iCi0gIGV4aXQgMAotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgOzsKLQotZXhlY3V0ZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgOzsKLQotZmluaXNoKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gIDs7Ci0KLWluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICA7OwotCi1saW5rKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLQkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gIDs7Ci0KLXVuaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotKikKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWVjaG8KLSRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9tYWtlZmlsZS52bXMgYi9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTM2MzQuLjAwMDAwMDAKLS0tIGEvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIwotIyBtYWtlZmlsZSBmb3IgYmZkLCBiaW51dGlscyBhbmQgZ2FzCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSMKLSMgWW91IG11c3QgdXNlIFZlcnNpb24gMy43NiBvZiBHTlUgTWFrZQotIwotIwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotQ0MgPSBnY2MKLUdBU0NDID0gJChDQykKLWVsc2UKLUNDID0gY2MKLUdBU0NDID0gZ2NjCi1lbmRpZgotCi1pZmVxICgkKENDKSxjYykKLSAgQ0hFQ0stQ09NUElMRVIgPSBjaGVja19jb21waWxlcgotZWxzZQotICBDSEVDSy1DT01QSUxFUiA9Ci1lbmRpZgotCi1hbGw6CWNoZWNrX2NjICQoQ0hFQ0stQ09NUElMRVIpIFsuYmludXRpbHNdbWFrZWZpbGUudm1zCi0JJChDRCkgWy5iZmRdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5vcGNvZGVzXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0ubGliaWJlcnR5XQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0uYmludXRpbHNdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5nYXNdCi0JQGdtYWtlICJDQz0kKEdBU0NDKSIKLQkkKENEKSBbLV0KLQotY2hlY2tfY2M6Ci1pZmVxICgkQ0MsKQotCUAkKEVDSE8pICJQbGVhc2UgZWRpdCBNQUtFRklMRS5WTVMgYW5kIHNlbGVjdCBhIEMgQ29tcGlsZXIuIgotCXN0b3AKLWVuZGlmCi0KLWNoZWNrX2NvbXBpbGVyOgotCUAkKEVDSE8pICJQZXJmb3JtIGEgJyQkIEBzZXR1cCcgYmVmb3JlIHN0YXJ0aW5nIG1ha2UiCi0KLVsuYmludXRpbHNdbWFrZWZpbGUudm1zOgotCSQoQ0QpIFsuYmludXRpbHNdCi0JJCQgQGNvbmZpZ3VyZQotCSQoQ0QpIFstXQotCi1pbnN0YWxsOiBhbGwKLQkkKENEKSBbLmJpbnV0aWxzXQotCUBnbWFrZSAiQ0M9JChDQykiIGluc3RhbGwKLQkkKENEKSBbLV0KLQkkKENEKSBbLmdhc10KLQlAZ21ha2UgIkNDPSQoR0FTQ0MpIiBpbnN0YWxsCi0JJChDRCkgWy1dCi0KLWNsZWFuOgotCSQoQ0QpIFsuYmZkXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLm9wY29kZXNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0ubGliaWJlcnR5XQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmdhc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLV0KLQpkaWZmIC0tZ2l0IGEvbWlzc2luZyBiL21pc3NpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3ODk2NTIuLjAwMDAwMDAKLS0tIGEvbWlzc2luZworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZyYW5jLG9pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0jIDAyMTExLTEzMDcsIFVTQS4KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gIGV4aXQgMQotZmkKLQotY2FzZSAiJDEiIGluCi0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLQotU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgotICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCi0gIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJwotICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJwotICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCi0gIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KLSAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdIgotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgLSBHTlUgbGliaXQgMC4wIgotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgYWNsb2NhbCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQotICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGFjbG9jYWwubTQKLSAgICA7OwotCi0gIGF1dG9jb25mKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKLSAgICAgICAgIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotICAgIHRvdWNoIGNvbmZpZ3VyZQotICAgIDs7Ci0KLSAgYXV0b2hlYWRlcikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KLSAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyBjb25maWd1cmUuaW5gCi0gICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCi0gICAgdG91Y2hfZmlsZXM9Ci0gICAgZm9yIGYgaW4gJGZpbGVzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgTWFrZWZpbGUuYW0nLCBcYGFjaW5jbHVkZS5tNCcgb3IgXGBjb25maWd1cmUuaW4nLgotICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuCi0gICAgICAgICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmluZCAuIC10eXBlIGYgLW5hbWUgTWFrZWZpbGUuYW0gLXByaW50IHwKLQkgICBzZWQgJ3MvXC5hbSQvLmluLycgfAotCSAgIHdoaWxlIHJlYWQgZjsgZG8gdG91Y2ggIiRmIjsgZG9uZQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoueSkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmgKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmggXTsgdGhlbgotCWVjaG8gPnkudGFiLmgKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLmwpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy9sJC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgbGV4Lnl5LmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbWFrZWluZm8pCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCi0gICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKLSAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCi0gICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKLSAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgJ3MvLiogXChbXiBdKlwpICokL1wxLydgCi0gICAgICBmaWxlPWBzZWQgLW4gJy9eQHNldGZpbGVuYW1lLyB7IHMvLiogXChbXiBdKlwpICokL1wxLzsgcDsgcTsgfScgJGZpbGVgCi0gICAgZmkKLSAgICB0b3VjaCAkZmlsZQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIHlvdSBkbyBub3Qgc2VlbSB0byBoYXZlIGl0IGhhbmR5IG9uIHlvdXIKLSAgICAgICAgIHN5c3RlbS4gIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4gIENoZWNrIHRoZSBcYFJFQURNRScgZmlsZSwKLSAgICAgICAgIGl0IG9mdGVuIHRlbGxzIHlvdSBhYm91dCB0aGUgbmVlZGVkIHByZXJlcXVpcmVtZW50cyBmb3IgaW5zdGFsbGluZwotICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKLSAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL21rZGVwIGIvbWtkZXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjNWI1MDguLjAwMDAwMDAKLS0tIGEvbWtkZXAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIS9iaW4vc2ggLQotIwotIyBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSMgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0jIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0jIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLSMgZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotIyBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotIyBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotIyBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0jIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSMKLSMJQCgjKW1rZGVwLnNoCTUuMTIgKEJlcmtlbGV5KSA2LzMwLzg4Ci0jCi0KLU1BS0U9TWFrZWZpbGUJCQkjIGRlZmF1bHQgbWFrZWZpbGUgbmFtZSBpcyAiTWFrZWZpbGUiCi0KLXdoaWxlIDoKLQlkbyBjYXNlICIkMSIgaW4KLQkJIyAtZiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhIG1ha2VmaWxlIG5hbWUKLQkJLWYpCi0JCQlNQUtFPSQyCi0JCQlzaGlmdDsgc2hpZnQgOzsKLQotCQkjIHRoZSAtcCBmbGFnIHByb2R1Y2VzICJwcm9ncmFtOiBwcm9ncmFtLmMiIHN0eWxlIGRlcGVuZGVuY2llcwotCQkjIHNvIC5vJ3MgZG9uJ3QgZ2V0IHByb2R1Y2VkCi0JCS1wKQotCQkJU0VEPSdzO1wubzs7JwotCQkJc2hpZnQgOzsKLQkJKikKLQkJCWJyZWFrIDs7Ci0JZXNhYwotZG9uZQotCi1pZiBbICQjID0gMCBdIDsgdGhlbgotCWVjaG8gJ3VzYWdlOiBta2RlcCBbLXBdIFstZiBtYWtlZmlsZV0gW2ZsYWdzXSBmaWxlIC4uLicKLQlleGl0IDEKLWZpCi0KLWlmIFsgISAtdyAkTUFLRSBdOyB0aGVuCi0JZWNobyAibWtkZXA6IG5vIHdyaXRlYWJsZSBmaWxlIFwiJE1BS0VcIiIKLQlleGl0IDEKLWZpCi0KLVRNUD0vdG1wL21rZGVwJCQKLQotdHJhcCAncm0gLWYgJFRNUCA7IGV4aXQgMScgMSAyIDMgMTMgMTUKLQotY3AgJE1BS0UgJHtNQUtFfS5iYWsKLQotc2VkIC1lICcvRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCRkJyA8ICRNQUtFID4gJFRNUAotCi1jYXQgPDwgX0VPRl8gPj4gJFRNUAotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1fRU9GXwotCi0jIElmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBoYXZlIC1NLCBhZGQgaXQuICBJZiB5b3UgY2FuJ3QsIHRoZSBuZXh0IHR3bwotIyBsaW5lcyB3aWxsIHRyeSBhbmQgcmVwbGFjZSB0aGUgImNjIC1NIi4gIFRoZSByZWFsIHByb2JsZW0gaXMgdGhhdCB0aGlzCi0jIGhhY2sgY2FuJ3QgZGVhbCB3aXRoIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMgYSBzZWFyY2ggcGF0aCwgYW5kIGRvZXNuJ3QKLSMgZXZlbiB0cnkgZm9yIGFueXRoaW5nIHVzaW5nIGJyYWNrZXQgKDw+KSBzeW50YXguCi0jCi0jIGVncmVwICdeI2luY2x1ZGVbIAldKiIuKiInIC9kZXYvbnVsbCAkKiB8Ci0jIHNlZCAtZSAncy86W14iXSoiXChbXiJdKlwpIi4qLzogXDEvJyAtZSAncy9cLmMvLm8vJyB8Ci0KLWdjYyAtTU0gJCogfAotc2VkICIKLQlzOyBcLi87IDtnCi0JJFNFRCIgPj4gJFRNUAotCi1jYXQgPDwgX0VPRl8gPj4gJFRNUAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLV9FT0ZfCi0KLSMgY29weSB0byBwcmVzZXJ2ZSBwZXJtaXNzaW9ucwotY3AgJFRNUCAkTUFLRQotcm0gLWYgJHtNQUtFfS5iYWsgJFRNUAotZXhpdCAwCi0KLQpkaWZmIC0tZ2l0IGEvbWtpbnN0YWxsZGlycyBiL21raW5zdGFsbGRpcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODc4M2UuLjAwMDAwMDAKLS0tIGEvbWtpbnN0YWxsZGlycworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5Ci0jIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgotIyBDcmVhdGVkOiAxOTkzLTA1LTE2Ci0jIExhc3QgbW9kaWZpZWQ6IDE5OTQtMDMtMjUKLSMgUHVibGljIGRvbWFpbgotCi1lcnJzdGF0dXM9MAotCi1mb3IgZmlsZSBpbiAkezErIiRAIn0gOyBkbyAKLSAgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCi0gICBzaGlmdAotCi0gICBwYXRoY29tcD0KLSAgIGZvciBkIGluICR7MSsiJEAifSA7IGRvCi0gICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKLSAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgotICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKLSAgICAgZXNhYwotCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiIDE+JjIKLSAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgPiAvZGV2L251bGwgMj4mMSB8fCBsYXN0ZXJyPSQ/Ci0gICAgIGZpCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0JZXJyc3RhdHVzPSRsYXN0ZXJyCi0gICAgIGZpCi0KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCi0gICBkb25lCi1kb25lCi0KLWV4aXQgJGVycnN0YXR1cwotCi0jIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9tbWFsbG9jL0NPUFlJTkcuTElCIGIvbW1hbGxvYy9DT1BZSU5HLkxJQgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2ODVhNS4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL0NPUFlJTkcuTElCCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL21tYWxsb2MvQ2hhbmdlTG9nIGIvbW1hbGxvYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzM5YTUuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotMjAwMC0wNS0xNyAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IE1ha2Ugc3VyZSAkKGluZm9kaXIpIGV4aXN0cy4gIFJ1bgotCWluc3RhbGwtaW5mbyBwcm9ncmFtIG9uIHRoZSBpbnN0YWxsZWQgSW5mbyBmaWxlcy4KLQotMjAwMC0wMy0yMCAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBBcHBlbmQgIm4iLCBub3QgIi5uIiB0byBsaWJtbWFsbG9jLmEsCi0Jc2luY2UgdGhlIGxhdHRlciBsb3NlcyBvbiBET1MgOCszIGZpbGVzeXN0ZW1zLgotCi1Nb24gRmViIDI4IDEwOjMzOjUxIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTUFJTlRBSU5FUlM6IE5ldyBmaWxlLgotCi0yMDAwLTAyLTE4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUByZWRoYXQuY29tPgotCi0JRnJvbSBKYXNvbiAiY3Jhc2giIE1vbGVuZGEgPGpzbUBjeWdudXMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGdldHBhZ2VzaXplIGRlY2xhcmF0aW9uLgotCSogbXZtYWxsb2MuYywgbW1hcC1zdXAuYzogQ29uZGl0aW9uYWxseSBkZWNsYXJlIGdldHBhZ2VzaXplLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIEZlYiAxOCAxMTo0MjoyMSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIDx1bmlzdGQuaD4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQlGcm9tIDIwMDAtMDItMTcgUm9kbmV5QnJvd25AcG1zYy5jb206Ci0JKiBtbS5jLCBhdHRhY2guYywgbW1hcC1zdXAuYywgc2Jyay1zdXAuYzogSW5jbHVkZSA8dW5pc3RkLmg+IGZvcgotIAlzYnJrIGFuZCBsc2VlayBkZWNsYXJhdGlvbnMuICBVcGRhdGUgY29weXJpZ2h0LgotCi0yMDAwLTAyLTA0ICBLZXZpbiBCdWV0dG5lciAgKGtldmluYkBjeWdudXMuY29tKQotCi0JKiBhY2luY2x1ZGUubTQsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoc2Jyayk6IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTiB0byB0ZXN0IGZvcgotCXByZXNlbmNlIG9mIGEgc3VpdGFibGUgZGVjbGFyYXRpb24gaW4gdGhlIHN5c3RlbSBoZWFkZXJzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIHNicmstc3VwLmMgKHNicmspOiBJZmRlZidkIHdpdGggTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZXMgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMDctMjQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogbWNhbGxvYy5jOiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGJlZm9yZSA8c3RyaW5nLmg+LiAgSFAvVVggMTEuMAotCW5lZWRzIHRoaXMuCi0KLVRodSBBcHIgMjMgMTI6MTk6MjIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLSAgICAgICAgKiBtbWFsbG9jLmg6IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN0ZGlvLmggI2lmbmRlZiBIQVZFX1NURERFRl9ILgotICAgICAgICAqIG1tcHJpdmF0ZS5oOiBEbyBub3QgaGFuZGxlIEhBVkVfU1REREVGX0ggaGVyZSwgc2luY2Ugd2UgaW5jbHVkZQotICAgICAgICBtbWFsbG9jLmguCi0KLVR1ZSBNYXIgMjQgMTc6MDc6MDIgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgotCi0JKiBNYWtlZmlsZS5pbjogIEdldCBTSEVMTCBmcm9tIGNvbmZpZ3VyZS4KLQkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcyBmb3IKLQlOVCBuYXRpdmUgYnVpbGRzLgotCi1Nb24gRmViICA3IDEzOjA2OjQ1IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0gICAgICAgICogbW1hbGxvYy9kZXRhY2guYzogRG8gbm90IGluY2x1ZGUgZmNudGwuaC4KLQotVGh1IEF1ZyAyOCAxMzoxNTowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1yZWFsbG9jLmMgKHJlYWxsb2MpOiBTdG9yZSByZXN1bHQgaW4gbG9jYWwgdmFyaWFibGUgYmVmb3JlCi0gCXJldHVybmluZyBpdC4gIE1ha2VzIGRlYnVnZ2luZyBtdWNoIGVhc2llciBhdCBuZWdsaWdpYmxlIGNvc3QuCi0KLVR1ZSBGZWIgIDQgMTY6MzA6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtdmFsbG9jLmMgKGNhY2hlX3BhZ2VzaXplKTogUmVuYW1lIGZyb20gcGFnZXNpemUsIHNvIHRoYXQgaWYgd2UKLQlhcmUgYnVpbGRpbmcgbW0ubywgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgdmFyaWFibGUgb2YgdGhlCi0Jc2FtZSBuYW1lIGluIG1tYXAtc3VwLmMuCi0KLVNhdCBEZWMgMjggMTI6NDg6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtbS5vKTogTmV3IHRhcmdldCB0aGF0IGNvbWJpbmVzIGFsbCB0aGUgZnVuY3Rpb25zCi0JaW50byBhIHNpbmdsZSBvYmplY3QgbW9kdWxlLiAgVGhpcyBhdm9pZHMgY2xpZW50IHByb2dyYW1zIHBpY2tpbmcKLSAJdXAgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiByb3V0aW5lcyBmcm9tIG1tYWxsb2MgYW5kIHBhcnQgZnJvbSBsaWJjLAotIAl3aGljaCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IuCi0JKENGSUxFUyk6IEFkZCBtbS5jCi0JKFRBUkdFVE9CSlMpOiBEZWZpbmUgdG8gYmUgZWl0aGVyIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgb3IgdGhlCi0Jc2luZ2xlIGNvbWJpbmVkIG9iamVjdC4KLQkoVEFSR0VUTElCKTogQ3JlYXRlIHRoZSBhcmNoaXZlIHVzaW5nIFRBUkdFVE9CSlMuCi0JKiBtbS5jOiBOZXcgZmlsZSB0aGF0IHNpbXBseSAjaW5jbHVkZXMgdGhlIG90aGVyIHNvdXJjZSBDIGZpbGVzLgotCQotVGh1IE9jdCAgMyAxNTo0NToyMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IERlcGVuZCBvbiBkaXN0Y2xlYW4sIHJlbW92ZQotCWR1cGxpY2F0aW9uLgotCi1UdWUgU2VwIDEwIDE3OjUyOjA2IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBtbWNoZWNrLmMgKGNoZWNraGRyKTogQWRkIHByb3RvdHlwZS4KLQkobWZyZWVfY2hlY2spOiBEaXR0by4KLQkobW1hbGxvY19jaGVjayk6IERpdHRvLgotCShtcmVhbGxvY19jaGVjayk6IERpdHRvLgotCSogbW10cmFjZS5jICh0cl9icmVhayk6IERpdHRvLgotCSh0cl9mcmVlaG9vayk6IERpdHRvLgotCSh0cl9tYWxsb2Nob29rKTogRGl0dG8uCi0JKHRyX3JlYWxsb2Nob29rKTogRGl0dG8uCi0JKiBzYnJrLXN1cC5jIChzYnJrX21vcmVjb3JlKTogRGl0dG8uCi0KLVdlZCBTZXAgIDQgMTg6MDI6NDUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIERvbid0IGRlZmF1bHQgQ0MgdG8gY2MuICBJdCBjYXVzZXMgcHJvYmxlbXMKLQl3aGVuIHN0YXJ0aW5nIGEgY29tcGlsZSBpbiB0aGUgbW1hbGxvYyBkaXJlY3RvcnkuCi0KLVdlZCBKdWwgMjQgMDA6NTM6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG1tYWxsb2MuaCAobW1hbGxvY19maW5kYmFzZSk6IEFkZCBwcm90b3R5cGUuCi0KLUZyaSBKdWwgMTIgMTg6MzU6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG1tYXAtc3VwLmMgKG1tYWxsb2NfZmluZGJhc2UpOiBDaGFuZ2UgdG8gbm90IHJlcXVpcmUgL2Rldi96ZXJvCi0JaWYgTU1BUF9BTk9OWU1PVVMgaXMgYXZhaWxhYmxlLgotCi1XZWQgSnVsIDEwIDIzOjUzOjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkZXRhY2guYyAobW1hbGxvY19kZXRhY2gpOiBGaXggYnVnIGluIGNvbXB1dGF0aW9uIG9mIG5lZ2F0aXZlCi0JYnJrIHZhbHVlLgotCSogbW1jaGVjay5jIChtbWNoZWNrZik6IFJlbmFtZWQgZnJvbSBtbWNoZWNrIGFuZCBuZXcgRk9SQ0UgYXJndW1lbnQKLQlhZGRlZC4gIFJlcGxhY2VkIGhhY2sgdGhhdCBhbHdheXMgYWxsb3dlZCBjaGVja2luZyByb3V0aW5lcyB0byBiZQotIAlpbnN0YWxsZWQgYW5kIGVuZm9yY2UgcmVzdHJpY3Rpb24gdGhhdCB0aGV5IGhhdmUgdG8gYmUgaW5zdGFsbGVkCi0JcHJpb3IgdG8gYWxsb2NhdGluZyBhbnkgbWVtb3J5IG9uIHRoZSB1c2VkIGhlYXAgb3IgdGhlIEZPUkNFIGFyZ3VtZW50Ci0JaGFzIHRvIGJlIG5vbi1OVUxMLgotCShtbWNoZWNrKTogTmV3IGZ1bmN0aW9uIHRoYXQgY2FsbHMgbW1jaGVja2Ygd2l0aCBGT1JDRSBzZXQgdG8gemVybywKLQlmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0JKiBtbWFsbG9jLmMgKG1hbGxvYyk6IFN0b3JlIHJlc3VsdCBpbiBsb2NhbCB2YXJpYWJsZSBiZWZvcmUKLQlyZXR1cm5pbmcgaXQuICBNYWtlcyBkZWJ1Z2dpbmcgbXVjaCBlYXNpZXIgYXQgbmVnbGlnaWJsZSBjb3N0LgotCSogbW1hbGxvYy5oIChtbWNoZWNrZik6IERlY2xhcmUuCi0JKiBhdHRhY2guYyAocmV1c2UpOiBDYWxsIG1tY2hlY2tmIHJhdGhlciB0aGFuIG1tY2hlY2suCi0JKiBtbWFwLXN1cC5jIChfX21tYWxsb2NfbW1hcF9tb3JlY29yZSk6IEltcHJvdmUgdG8gYWxsb3cgbW1hcAotCXRvIHNlbGVjdCBhIGJhc2UgbWFwcGluZyBhZGRyZXNzIGlmIG5vbmUgaXMgb3RoZXJ3aXNlIGdpdmVuLgotCShtbWFsbG9jX2ZpbmRiYXNlKTogTmV3IGZ1bmN0aW9uIHRoYXQgdXNlciBjYW4gY2FsbCB0byBmaW5kCi0JYW4gYXZhaWxhYmxlIG1hcHBpbmcgYWRkcmVzcyBvZiBhIGdpdmVuIHNpemUuCi0JCi1UdWUgSnVuIDI1IDIyOjU0OjA2IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKLQlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVHVlIE1heSAyOCAxMzo1MToyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IFRob21hcyBBIFBldGVyc29uIDx0YXBAc3JjLmhvbmV5d2VsbC5jb20+Ci0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogQXBwbHkgcGF0Y2ggdG8gaW5zdGFsbAotCW1tYWxsb2MuaW5mbyBmcm9tIHNyY2RpciBpZiBub3QgZm91bmQgaW4gYnVpbGQgZGlyLgotCi1TdW4gQXByICA3IDIwOjU1OjMwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgQVIgJiBSQU5MSUIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkqIE1ha2VmaWxlLmluOiBVc2UgQVIgc2V0IGJ5IGNvbmZpZ3VyZSBzdWJzdGl0dXRpb24uCi0JCi1GcmkgTWFyIDI5IDA5OjU3OjM2IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBtbWFsbG9jLmggKG1tdHJhY2UpOiBBZGQgcHJvdG90eXBlLgotCi1TYXQgRmViICAzIDEyOjQxOjAwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbSBILkouIEx1IChoamxAZ251LmFpLm1pdC5lZHUpOgotCSogbXZhbGxvYy5jICh2YWxsb2MpOiBuZXcuCi0JKiBtbWVtYWxpZ24uYzogQWxsb2NhdGUgKFNJWkUgKyBBTElHTk1FTlQgLSAxKSBhbmQgdGhlbiB0cmltCi0JaWYgcG9zc2libGUuCi0JKG1lbWFsaWduKTogZG9uJ3QgcHV0IHRoZSBub2RlIG9uIHRoZSBfYWxpZ25lZF9ibG9ja3MgbGlzdCBtb3JlCi0gCXRoYW4gb25jZS4KLQotTW9uIE5vdiAyMCAxMjowNDozMiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IE1ha2Ugb2JqZWN0cyBkZXBlbmQgdXBvbiBNYWtlZmlsZSwKLQlzaW5jZSBNYWtlZmlsZSBzZXRzIERFRlMgd2hpY2ggY2FuIGRlZmluaXRlbHkgYWZmZWN0IGhvdwotCW9iamVjdHMgYXJlIHRvIGJlIGNvbXBpbGVkLgotCi1Nb24gTm92ICA2IDE0OjEyOjEzIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBhZGQgbGltaXRzLmguCi0JKEFDX0hFQURFUl9TVERDKTogcmVtb3ZlLgotCi0JKiBtbWFsbG9jLmg6IGRvY3VtZW50IG5lY2Vzc2l0eSBvZiBkZWZpbmluZyBzaXplX3QgYmVmb3JlCi0JaW5jbHVkaW5nIG1tYWxsb2MuaC4KLQotCSogbW1wcml2YXRlLmg6IGFkZCBjaGVjayBmb3IgbGltaXRzLmgsIHJlbW92ZSBkZWZpbml0aW9uIG9mCi0JTlVMTCBhbmQgc2l6ZV90LgotCi1TdW4gTm92ICA1IDAwOjI3OjM2IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFDX0NIRUNLX0hFQURFUlMsIG5vdCBBQ19DSEVDS19IRUFERVIuCi0KLVN1biBOb3YgIDUgMDA6MTQ6MTMgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGNoZWNrIGZvciBzdGRkZWYuaAotCSogbW1hbGxvYy5oOiBpbmNsdWRlIHN0ZGRlZi5oIGlmIEhBVkVfU1REREVGX0ggaXMgZGVmaW5lZC4KLQotU2F0IE5vdiAgNCAxOToxMDoxMyAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgQUNfSEVBREVSX1NUREMgY2hlY2suCi0KLQkqIG1tYWxsb2MuaDogY2hlY2sgaWYgU1REQ19IRUFERVJTIGluc3RlYWQgb2YgX19TVERDX18uCi0KLQkqIG1tcHJpdmF0ZS5oOiBjaGVjayBpZiBTVERDX0hFQURFUlMgaW5zdGVhZCBvZiBfX1NURENfXy4KLQotVHVlIE9jdCAyNCAxMzoxNzo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1tcHJpdmF0ZS5oOiBSZW1vdmUgZGVjbGFyYXRpb25zIChQVFIsIGV0YykgdGhhdCBhcmUgYWxyZWFkeQotCXByb3ZpZGVkIGJ5IGFuc2lkZWNsLmgsIGluY2x1ZGUgbW1hbGxvYy5oIGVhcmxpZXIgaW4gZmlsZS4KLQotVHVlIE9jdCAxMCAxMTowNDo0NyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIFJlbW92ZSBtYWNyby4KLQotV2VkIFNlcCAyMCAxMjo1MToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uICBBZGQgR05VIHN0YW5kYXJkIG1haW50YWluZXItY2xlYW4gZWNob3MuCi0KLVRodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMKLQlhbmQgc2hhciBhcmNoaXZlIG9mIG9yaWdpbmFsIEZTRiBmaWxlcy4KLQotTW9uIEp1biAxMiAxMjoxMTo1NyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUgYW5kCi0JICBjb25maWcubG9nLgotCi1XZWQgTWF5IDE3IDE3OjQ3OjQ0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogQWRkZWQgY29uZmlnLnN0YXR1cyB0byBkZXBlbmRlbmN5IGxpc3QuCi0JICAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBNYXkgIDUgMTU6MTc6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtbWFwLXN1cC5jOiBSZW1vdmVkIG11bm1hcCBwcm90b3R5cGUuICBTb21lIHN5c3RlbXMgaGF2ZSBhCi0JICBzbGlnaHRseSBkaWZmZXJlbnQgcHJvdG90eXBlLgotCi1XZWQgTWF5ICAzIDE3OjE4OjEzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29udmVydGVkIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMy4KLQkqIGNvbmZpZy97bWgtZ28zMiwgbWgtaXJpeCwgbWgtbmNyMzAwMCwgbWgtc3Vub3M0LCAKLQkgIG1oLXN5c3Y0fTogUmVtb3ZlZC4KLQotVGh1IE5vdiAgMyAyMzo1NToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBOYW1lIGRlc3RpbmF0aW9uIGZpbGUgY29ycmVjdGx5LAotCXJhdGhlciB0aGFuIHVzaW5nIHVuZGVmaW5lZCBzaGVsbCB2YXJpYWJsZS4KLQotRnJpIE9jdCAyOCAxNjo0Njo1OCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG1tcHJpdmF0ZS5oOiBOZXcgZmlsZSwgd2FzIG1tYWxsb2MuaC4KLQkobW1hbGxvYy5oKTogSW5jbHVkZS4KLQkqIG1tYWxsb2MuaDogUmVtb3ZlIGFsbCBidXQgZGVjbGFyYXRpb25zIG9mIG1tYWxsb2MgZnVuY3Rpb25zLgotCShhbnNpZGVjbC5oKTogSW5jbHVkZS4KLQkqIGF0dGFjaC5jLCBldCBhbDogSW5jbHVkZSBtbXByaXZhdGUuaCBpbnN0ZWFkIG9mIG1tYWxsb2MuaC4KLQotV2VkIEF1ZyAyNCAxMjo1NTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLU1vbiBBdWcgMjIgMTE6MzY6NDAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogU2VwYXJhdGUgZnJvbSByZWFsY2xlYW4uCi0JKHJlYWxjbGVhbik6IFJlbW92ZSBtbWFsbG9jLmluZm8uCi0KLUZyaSBNYXkgIDYgMTM6MDQ6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy9nbzMyLm1oOiBOZXcgZmlsZQotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogIFVzZSBuZXcgZnJhZ21lbnQuCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtbXRyYWNlLmMgKHRyX2ZyZWVob29rLCB0cl9tYWxsb2Nob29rLCB0cl9yZWFsbG9jaG9vayk6Ci0JQ2FzdCBhZGRyZXNzZXMgcHV0IG91dCB2aWEgZnByaW50ZiB0byB1bnNpZ25lZCBsb25nIGFuZCB1c2UgJWx4LgotCi1UdWUgTm92IDE2IDIwOjMzOjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLkxJQjogTmV3IGZpbGUgKHN0YW5kYXJkIHZlcnNpb24gMiBMR1BMLCBhcyBhbHJlYWR5IGNpdGVkCi0JYnkgdGhlIHNvdXJjZSBmaWxlcykuCi0KLUZyaSBOb3YgIDUgMTE6NDc6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbmZvIGR2aSBpbnN0YWxsLWluZm8pOiBBY3R1YWxseSBtYWtlIHRoZSBtYW51YWwuCi0KLU1vbiBOb3YgIDEgMTQ6MjA6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1tYWxsb2MudGV4aTogRml4IHR5cG8gKCJmb3IgZm9yIiAtPiAiZm9yIikuCi0KLUZyaSBKdWwgMTYgMTU6Mjc6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiB0ZXN0MS5jOiBOZXcgZmlsZSB3aGljaCB0ZXN0cyBmb3IgYnVnIGZpeGVkIGJlbG93LgotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUHV0IGluIGNvbW1hbmRzIHRvIHJ1biBpdCAoYnV0IGNvbW1lbnRlZCBvdXQKLQliZWNhdXNlIGl0IHdvbid0IHdvcmsgZm9yIENhbmFkaWFuIGNyb3NzKS4KLQotCSogbW1hbGxvYy5jIChtbWFsbG9jKTogV2hlbiBleHRlbmRpbmcgYSBmcmVlIGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlCi0JaGVhcCwgY2hlY2sgd2hldGhlciB3aGljaCBibG9jayBpcyBhdCB0aGUgZW5kIGNoYW5nZWQuCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIHdoZW4gc3JjZGlyICE9IG9iamRpci4KLQotVGh1IEp1bCAxNSAwNzo1Njo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYXR0YWNoLmMsIGRldGFjaC5jOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYmVmb3JlIDxmY250bC5oPi4KLQotV2VkIEp1biAzMCAxMTowMDo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBtb3N0bHljbGVhbiBhbmQgcmVhbGNsZWFuIHRhcmdldHMuCi0KLVdlZCBNYXIgMjQgMDE6NTg6MTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIGFuZCBpbnN0YWxsY2hlY2sgdGFyZ2V0cwotCi1GcmkgTWFyIDEyIDE4OjM1OjQzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgKi0qLXNvbGFyaXMyKiBpbnN0ZWFkIG9mICotKi1zb2xhcmlzKiAoYQotCW51bWJlciBvZiBwZW9wbGUgd2FudCB0byBjYWxsIFN1bk9TIDQuMS4yICJzb2xhcmlzMS4wIiBhbmQgZ2V0IGl0IHJpZ2h0KQotCi1Nb24gRmViIDIyIDE4OjA4OjUzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogIEFkZC4KLQotVHVlIEZlYiAxNiAwODowOToxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGF0dGFjaC5jLCBkZXRhY2guYywga2V5cy5jLCBtbWFwLXN1cC5jLCBtbXRyYWNlLmMsCi0Jc2Jyay1zdXAuYzogIFVzZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBsaWtlIG90aGVyCi0JZmlsZXMuCi0KLVdlZCBOb3YgMTggMTk6MTg6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlZ3VsYXJpemUgbGlzdCBvZiBob3N0IGNvbmZpZ3MuCi0KLUZyaSBPY3QgMzAgMDA6NTk6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG1tYWxsb2MudGV4aTogIEFkZCBtaXNzaW5nIGRvdWJsZWQgQC4gIEJ1Z2ZpeCBieSBQYXVsIEVnZ2VydC4KLQotRnJpIE9jdCAyMyAwMTo1MDo1MiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgc29sYXJpcyBzYW1lIGFzIHN5c3Y0LgotCi1UaHUgT2N0ICAxIDIzOjM0OjIwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotU3VuIEF1ZyAyMyAxMTowOTo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc2Jyay1zdXAuYyAoX19tbWFsbG9jX2Jya19pbml0KTogIEVuc3VyZSBiYXNlIG9mIHNicmsnZCByZWdpb24KLQlpcyBhbGlnbmVkLiAgQnVnIHJlcG9ydGVkIGJ5IEFuZHJldyBIZXliZXkgKGF0aEBsY3MubWl0LmVkdSkuCi0KLVdlZCBBdWcgMTkgMTQ6NDk6MjMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBKdWwgMjAgMjE6MTU6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1yZWFsbG9jLmM6ICBNaW5vciBjb2RlIGZvcm1hdCBzdHlsZSBjaGFuZ2VzIGZvciBjb25zaXN0ZW5jeS4KLQotRnJpIEp1bCAgMyAyMDoyNTozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXR0YWNoLmMsIGRldGFjaC5jLCBtY2FsbG9jLmMsIG1tYWxsb2MuYywgbW10cmFjZS5jLCBtcmVhbGxvYy5jLAotCXNicmstc3VwLmM6ICBSZW1vdmUgIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUKLQlyZXR1cm4gdmFsdWUgaXMgaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1UdWUgSnVuIDMwIDE2OjQ0OjQxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtbWFsbG9jLmggKHN0cnVjdCBtZGVzYyk6ICBBZGQgRklYTUUgY29tbWVudHMgdG8gcG9pbnQgb3V0IHRoZQotCW5lZWQgdG8gc2F2ZSBzb21lIGRhdGEgb24gYSBwZXItcHJvY2VzcyBiYXNpcyBmb3IgbWFwcGVkIHJlZ2lvbnMKLQl0aGF0IGFyZSBzaGFyZWQuCi0JKiBhdHRhY2guYyAocmV1c2UpOiAgVXBkYXRlIHRoZSBtb3JlY29yZSBmaWVsZCBmb3IgcmV1c2VkIG1hcHBlZAotCXJlZ2lvbnMgdG8gYmUgY29ycmVjdCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KLQotTW9uIEp1biAyOSAxMDo0NToyNSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogbW10cmFjZS5jOiAgTGludC4KLQotTW9uIEp1biAxNSAxMjoyMDoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbW1hbGxvYy5oIChzdHJ1Y3QgbWRlc2MpOiAgQ2hhbmdlIG1lbWJlciAiZXJybm8iIHRvCi0JInNhdmVkX2Vycm5vIiB0byBhdm9pZCBwb3NzaWJsZSBjb25mbGljdCB3aXRoIEFOU0kgQyBlbnZpcm9ubWVudHMsCi0Jd2hlcmUgaXQgaXMgYWxsb3dlZCB0byBiZSBhIG1hY3JvLgotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoUkFOTElCKTogIFVzZSBSQU5MSUI9dHJ1ZS4KLQotRnJpIEp1biAxMiAyMTozNDoyMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbW1hcC1zdXAuYzogIEF2b2lkIEFOU0kgQyAiZW1wdHkgdHJhbnNsYXRpb24gdW5pdCIgaWRpb2N5LgotCi1UdWUgSnVuICA5IDE3OjI5OjA0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBkZWZpbml0aW9uIGZvciBJTlNUQUxMIHVzaW5nCi0JL3Vzci91Y2IvaW5zdGFsbC4KLQotVGh1IEFwciAzMCAyMjozNjozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc2Jyay1zdXAuYyAoc2Jya19tb3JlY29yZSk6ICBGaXggc2JyaygpIGVycm9yIHJldHVybiB0ZXN0LgotCi1Nb24gQXByIDIwIDIxOjAzOjMwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBmcm9tIHRoZQotCSAgY29tbWFuZCBsaW5lLiAgcmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotVGh1IEFwciAxNiAyMDowMDoyMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogVE9ETzogIE5ldyBmaWxlLgotCSogYXR0YWNoLmMsIG1jYWxsb2MuYywgbWZyZWUuYywgbW1hbGxvYy5jLCBtbWFsbG9jLmgsIG1tYXAtc3VwLmMsCi0JbW1jaGVjay5jLCBtdHJhY2UuYywgbXJlYWxsb2MuYywgbXZhbGxvYy5jLCBzYnJrLXN1cC5jOiAgTGludC4KLQotRnJpIEFwciAxMCAyMjo1OToxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IGNvbmZpZyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgQWRkIG1hY3JvIGFuZCBkZWZhdWx0IHRvIC1nLgotCi1XZWQgQXByICA4IDA5OjM0OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtbWFsbG9jLmM6ICBNaW5vciBmaXggdG8gY29tbWVudC4KLQkqIG1tYWxsb2MudGV4aTogIFVwZGF0ZSB0byBtYXRjaCBhY3R1YWwgaW1wbGVtZW50YXRpb24KLQkqIG1tYWxsb2MuaCAobW9yZWNvcmUpOiAgQ2hhbmdlIHByb3RvdHlwZSdzIDJuZCBhcmcgdG8gaW50LgotCi1UdWUgQXByICA3IDIyOjE2OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtbWFsbG9jLmggKHNpemVfdCwgQ0hBUl9CSVQpOiAgT25seSByZWRlZmluZSBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0KLU1vbiBBcHIgIDYgMjA6NDk6MzMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1tYWxsb2MuaDogIFJlbW92ZSBpbmNsdWRlIG9mIDxzdGRsaWIuaD4uICBUaGlzIGFsc28gZ2V0cyByaWQKLQlvZiB0aGUgdWdseSBrbHVkZ2UgaW5zdGFsbGVkIG9uIDEtQXByLTkyLgotCi1Nb24gQXByICA2IDE2OjMzOjM3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGRldGFjaC5jIChtbWFsbG9jX2RldGFjaCk6ICBBcmcgc2hvdWxkIGJlIFBUUiwgbm90IHZvaWQgKi4KLQlGaXhlcyBjb21wbGFpbnRzIGZyb20gbm9uIF9fU1REQ19fIHN5c3RlbXMuCi0KLVdlZCBBcHIgIDEgMTE6NDc6MDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1jYWxsb2MuYywgbWZyZWUuYywgbW1hbGxvYy5jLCBtcmVhbGxvYy5jOiAgTWlub3IgY29tbWVudAotCWNoYW5nZS4KLQkqIG1tYWxsb2MuaDogIEFkZCB1Z2x5IGtsdWRnZSB0byBiYW5kLWFpZCBvdmVyIHByb2JsZW1zIHdpdGgKLQlib2d1cyB2ZW5kb3IgPHN0ZGxpYi5oPiBmaWxlcy4KLQotU3VuIE1hciAyOSAxMjo0MTozMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXR0YWNoLmMsIG1tYWxsb2MuYywgbW1jaGVjay5jOiAgTGludC4KLQotVGh1IE1hciAyNiAxNzowNjowNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXR0YWNoLmMgKHJldXNlKTogIEV4cGxpY2l0bHkgZGlzY2FyZCByZXR1cm4gdmFsdWUgb2YgbW1jaGVjay4KLQkqIG1tY2hlY2suYyAobW1jaGVjayk6ICBEb2N1bWVudCByZXF1aXJlbWVudHMgZm9yIGluc3RhbGxpbmcKLQljb3JydXB0aW9uIGNoZWNraW5nIGhvb2tzIGFuZCBzZXQgdXAgdG8gZW5mb3JjZSByZXN0cmljdGlvbnMuCi0KLVR1ZSBNYXIgMjQgMjM6NDE6MTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pcml4NDogbmV3IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZCB0YXJnZXRzLCBmaXhlZCBpbnN0YWxsIGRpcmVjdG9yaWVzLgotCi1TYXQgTWFyIDE0IDE3OjM0OjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBJbml0aWFsIHJlbGVhc2UsIGluY29ycG9yYXRlZCBpbnRvIGdkYi4KLQotCmRpZmYgLS1naXQgYS9tbWFsbG9jL01BSU5UQUlORVJTIGIvbW1hbGxvYy9NQUlOVEFJTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwNDg2Ny4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL01BSU5UQUlORVJTCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGUgbW1hbGxvYyBkaXJlY3RvcnkgaXMgbWFpbnRhaW5lZCBieSB0aGUgR0RCIGdyb3VwJ3MgSG9zdAotbWFpbnRhaW5lcnMuCi0KLVRoaXMgY29kZSBpcyBpbiBhIG1haW50YWluLW9ubHkgcGhhc2UgLSBvbmx5IGNvbmZpZ3VyeSBwYXRjaGVzIGZpeGluZwotaG9zdCBjb21waWxlIHByb2JsZW1zIGFyZSBnZW5lcmFsbHkgYWNjZXB0ZWQuCmRpZmYgLS1naXQgYS9tbWFsbG9jL01ha2VmaWxlLmluIGIvbW1hbGxvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlMzk4OS4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotIyBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLSMgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi0jIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIwotIyBNYWtlZmlsZSBmb3IgbW1hbGxvYyBkaXJlY3RvcnkKLSMKLQotIyBEaXJlY3RvcnkgY29udGFpbmluZyBzb3VyY2UgZmlsZXMuICBEb24ndCBjbGVhbiB1cCB0aGUgc3BhY2luZywKLSMgdGhpcyBleGFjdCBzdHJpbmcgaXMgbWF0Y2hlZCBmb3IgYnkgdGhlICJjb25maWd1cmUiIHNjcmlwdC4KLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLQotcHJlZml4ID0JQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0JQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPQlAYmluZGlyQAotbGliZGlyID0JQGxpYmRpckAKLQotZGF0YWRpciA9CUBkYXRhZGlyQAotbWFuZGlyID0JQG1hbmRpckAKLW1hbjFkaXIgPQkkKG1hbmRpcikvbWFuMQotbWFuMmRpciA9CSQobWFuZGlyKS9tYW4yCi1tYW4zZGlyID0JJChtYW5kaXIpL21hbjMKLW1hbjRkaXIgPQkkKG1hbmRpcikvbWFuNAotbWFuNWRpciA9CSQobWFuZGlyKS9tYW41Ci1tYW42ZGlyID0JJChtYW5kaXIpL21hbjYKLW1hbjdkaXIgPQkkKG1hbmRpcikvbWFuNwotbWFuOGRpciA9CSQobWFuZGlyKS9tYW44Ci1tYW45ZGlyID0JJChtYW5kaXIpL21hbjkKLWluZm9kaXIgPQlAaW5mb2RpckAKLWluY2x1ZGVkaXIgPQlAaW5jbHVkZWRpckAKLQotU0hFTEwgPQkJQFNIRUxMQAotCi1JTlNUQUxMID0JQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU09QElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9CUBJTlNUQUxMX0RBVEFACi0KLUFSID0JCUBBUkAKLUFSX0ZMQUdTID0JcXYKLUNGTEFHUyA9CS1nCi1NQUtFSU5GTyA9CW1ha2VpbmZvCi1SQU5MSUIgPQlAUkFOTElCQAotUk0gPQkJcm0KLQotIyB3aGVyZSB0byBmaW5kIG1ha2VpbmZvCi1NQUtFSU5GTz1tYWtlaW5mbwotCi1TRVRfVEVYSU5QVVRTID0gVEVYSU5QVVRTPSR7VEVYSURJUn06LjokKHNyY2Rpcik6JChSRUFETElORV9ESVIpOiQkVEVYSU5QVVRTCi0KLSMgVGhlIFRlWCBmb3JtYXR0ZXIKLVRFWCA9IHRleAotCi1UQVJHRVRMSUIgPQlsaWJtbWFsbG9jLmEKLQotQ0ZJTEVTID0JbWNhbGxvYy5jIG1mcmVlLmMgbW1hbGxvYy5jIG1tY2hlY2suYyBtbWVtYWxpZ24uYyBtbXN0YXRzLmMgXAotCQltbXRyYWNlLmMgbXJlYWxsb2MuYyBtdmFsbG9jLmMgbW1hcC1zdXAuYyBhdHRhY2guYyBkZXRhY2guYyBcCi0JCWtleXMuYyBzYnJrLXN1cC5jIG1tLmMKLQotSEZJTEVTID0JbW1hbGxvYy5oCi0KLU9GSUxFUyA9CW1jYWxsb2MubyBtZnJlZS5vIG1tYWxsb2MubyBtbWNoZWNrLm8gbW1lbWFsaWduLm8gbW1zdGF0cy5vIFwKLQkJbW10cmFjZS5vIG1yZWFsbG9jLm8gbXZhbGxvYy5vIG1tYXAtc3VwLm8gYXR0YWNoLm8gZGV0YWNoLm8gXAotCQlrZXlzLm8gc2Jyay1zdXAubwotCi1ERUZTID0JCUBERUZTQAotCi0jIFRoZSBjdXJyZW50IGRlZmF1bHQgaXMgdG8gYnVpbGQgYSBzaW5nbGUgb2JqZWN0IG1vZHVsZSB3aXRoIGFsbCB0aGUgbW1hbGxvYwotIyBmdW5jdGlvbnMuICBUbyBidWlsZCBhIG1vcmUgdHJhZGl0aW9uYWwgbGlicmFyeSwgZmxpcCB0aGlzIG1hY3JvIGRlZmluaXRpb24uCi0jVEFSR0VUT0JKUyA9CSQoT0ZJTEVTKQotVEFSR0VUT0JKUyA9CW1tLm8KLQotLmMubzoKLQkJJChDQykgLWMgJChDRkxBR1MpICQoREVGUykgLUkuIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgJDwKLQotIyBEbyB3ZSB3YW50L25lZWQgYW55IGNvbmZpZyBvdmVycmlkZXM/Ci0jCSAKLQotU1RBR0VTVFVGRiA9CSQoVEFSR0VUTElCKSAqLm8KLQotYWxsOgkJJChUQVJHRVRMSUIpCi0KLWluZm86IG1tYWxsb2MuaW5mbwotZHZpOiBtbWFsbG9jLmR2aQotY2xlYW4taW5mbzoKLWluc3RhbGxjaGVjazoKLQotbW1hbGxvYy5pbmZvOiBtbWFsbG9jLnRleGkKLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLW8gLi9tbWFsbG9jLmluZm8gbW1hbGxvYy50ZXhpCi0KLSMgVGhpcyBmaWxlIGRvZXNuJ3QgbmVlZCB0ZXhpbmRleCBjdXJyZW50bHkuCi1tbWFsbG9jLmR2aTogbW1hbGxvYy50ZXhpCi0JJChTRVRfVEVYSU5QVVRTKSAkKFRFWCkgbW1hbGxvYy50ZXhpCi0Jcm0gLWYgbW1hbGxvYy4/PyBtbWFsbG9jLj8/cyBtbWFsbG9jLmxvZyBtbWFsbG9jLmF1eCBtbWFsbG9jLnRvYwotCi1pbnN0YWxsLWluZm86IGluZm8KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbWtpbnN0YWxsZGlycyAkKGluZm9kaXIpCi0JaWYgdGVzdCAhIC1mIG1tYWxsb2MuaW5mbyA7IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAotCSQoSU5TVEFMTF9EQVRBKSBtbWFsbG9jLmluZm8gJChpbmZvZGlyKS9tbWFsbG9jLmluZm8KLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChpbmZvZGlyKSAkKGluZm9kaXIpL21tYWxsb2MuaW5mbyI7XAotCSAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChpbmZvZGlyKSAkKGluZm9kaXIpL21tYWxsb2MuaW5mbyB8fCA6O1wKLQllbHNlIDogOyBmaQotCi1jaGVjazogdGVzdDEuYwotIwkkKENDKSAtZyAkKHNyY2RpcikvdGVzdDEuYyBsaWJtbWFsbG9jLmEKLSMgVGhpcyBsb3NlcyBmb3IgQ2FuYWRpYW4gY3Jvc3MgKGJ1aWxkaW5nIG1tYWxsb2Mgd2l0aCBhIGNyb3NzLWNvbXBpbGVyKS4KLSMgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBkZWphZ251LWlzaCBzb2x1dGlvbiAoc3VjaCBhcyB3aGF0IHdlIGFyZSBkb2luZwotIyBmb3IgZ2RiLCBwZXJoYXBzKS4KLSMJLi9hLm91dAotCi1pbnN0YWxsOglhbGwKLQkJJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKGxpYmRpcikvJChUQVJHRVRMSUIpbgotCQkkKFJBTkxJQikgJChsaWJkaXIpLyQoVEFSR0VUTElCKW4KLQkJbXYgLWYgJChsaWJkaXIpLyQoVEFSR0VUTElCKW4gJChsaWJkaXIpLyQoVEFSR0VUTElCKQotCi0kKFRBUkdFVExJQik6CSQoVEFSR0VUT0JKUykKLQkJJChSTSkgLXJmICRACi0JCSQoQVIpICQoQVJfRkxBR1MpICRAICQoVEFSR0VUT0JKUykKLQkJJChSQU5MSUIpICRACi0KLSQoT0ZJTEVTKSA6CSQoSEZJTEVTKSBNYWtlZmlsZQotCi1tbS5vOgkJJChIRklMRVMpICQoQ0ZJTEVTKQotCQkkKENDKSAtYyAkKENGTEFHUykgJChERUZTKSAtSS4gLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAkKHNyY2RpcikvbW0uYwotCi0uYWx3YXlzLjoKLSMgRG8gbm90aGluZy4KLQotLlBIT05FWTogYWxsIGV0YWdzIHRhZ3MgbHMgY2xlYW4gc3RhZ2UxIHN0YWdlMiAuYWx3YXlzLgotCi1zdGFnZTE6CQlmb3JjZQotCQktbWtkaXIgc3RhZ2UxCi0JCS1tdiAtZiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCi1zdGFnZTI6CQlmb3JjZQotCQktbWtkaXIgc3RhZ2UyCi0JCS1tdiAtZiAkKFNUQUdFU1RVRkYpIHN0YWdlMgotCi1zdGFnZTM6CQlmb3JjZQotCQktbWtkaXIgc3RhZ2UzCi0JCS1tdiAtZiAkKFNUQUdFU1RVRkYpIHN0YWdlMwotCi1zdGFnZTQ6CQlmb3JjZQotCQktbWtkaXIgc3RhZ2U0Ci0JCS1tdiAtZiAkKFNUQUdFU1RVRkYpIHN0YWdlNAotCi1hZ2FpbnN0PXN0YWdlMgotCi1jb21wYXJpc29uOglmb3JjZQotCQlmb3IgaSBpbiAqLm8gOyBkbyBjbXAgJCRpICQoYWdhaW5zdCkvJCRpIHx8IGV4aXQgMSA7IGRvbmUKLQotZGUtc3RhZ2UxOglmb3JjZQotCQktKGNkIHN0YWdlMSA7IG12IC1mICogLi4pCi0JCS1ybWRpciBzdGFnZTEKLQotZGUtc3RhZ2UyOglmb3JjZQotCQktKGNkIHN0YWdlMiA7IG12IC1mICogLi4pCi0JCS1ybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOglmb3JjZQotCQktKGNkIHN0YWdlMyA7IG12IC1mICogLi4pCi0JCS1ybWRpciBzdGFnZTMKLQotZGUtc3RhZ2U0Oglmb3JjZQotCQktKGNkIHN0YWdlNCA7IG12IC1mICogLi4pCi0JCS1ybWRpciBzdGFnZTQKLQotZXRhZ3MgdGFnczoJVEFHUwotCi1UQUdTOgkJJChDRklMRVMpCi0JZXRhZ3MgYGZvciBpIGluICQoSEZJTEVTKSAkKENGSUxFUyk7IGRvIGVjaG8gJChzcmNkaXIpLyQkaSA7IGRvbmVgCi0KLWxzOgotCQlAZWNobyBNYWtlZmlsZSAkKEhGSUxFUykgJChDRklMRVMpCi0KLSMgTmVlZCB0byBkZWFsIHdpdGggcHJvZmlsZWQgbGlicmFyaWVzLCB0b28uCi0KLW1vc3RseWNsZWFuIGNsZWFuOgotCQlybSAtZiAqLmEgKi5vIGNvcmUgZXJycyAqfiBcIyogVEFHUyAqLkUgYS5vdXQgZXJyb3JzIAotCi1kaXN0Y2xlYW46CWNsZWFuIAotCQlybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBjb25maWcuc3RhdHVzCi0JCXJtIC1mIE1ha2VmaWxlIGRlcGVuZAotCi1tYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogZGlzdGNsZWFuIGNsZWFuCi0JCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQkJcm0gLWYgbW1hbGxvYy5pbmZvCi0KLWZvcmNlOgotCi1NYWtlZmlsZToJTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCQkkKFNIRUxMKSBjb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6CWNvbmZpZ3VyZQotCQkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9UT0RPIGIvbW1hbGxvYy9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDEyMDQzLi4wMDAwMDAwCi0tLSBhL21tYWxsb2MvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVRoaW5ncyB0aGF0IHN0aWxsIG5lZWQgYXR0ZW50aW9uOgotCi0gICAqCU1ha2UgaW1wbGVtZW50YXRpb24gY2hhbmdlcyBuZWNlc3NhcnkgdG8gYWxsb3cgbXVsdGlwbGUgcHJvY2Vzc2VzCi0JdG8gdXNlIHRoZSBtbWFsbG9jIG1hbmFnZWQgcmVnaW9uIHNpbXVsdGFuZW91c2x5LiAgVGhpcyByZXF1aXJlcywKLQlhdCB0aGUgbWluaW11bSwgc29tZSBzb3J0IG9mIGNvb3BlcmF0aXZlIGxvY2tpbmcgdGhhdCBlbnN1cmVzIHRoYXQKLQlvbmx5IG9uZSBwcm9jZXNzIGF0IGEgdGltZSBpcyBjaGFuZ2luZyBhbnkgb2YgdGhlIG1tYWxsb2MgbWFuYWdlZAotCWRhdGEgc3RydWN0dXJlcyAoaXRzIG9rIGZvciB0aGUgbW1hbGxvYyBtYW5hZ2VkIGRhdGEgcmVnaW9ucyB0byBiZQotCWNoYW5nZWQgYXQgYW55IHRpbWUgc2luY2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBjb250ZW50cykuCi0KLSAgICoJSW4gb3JkZXIgdG8gc3VwcG9ydCBtdWx0aXBsZSBwcm9jZXNzZXMgdXNpbmcgdGhlIG1tYWxsb2MgbWFuYWdlZAotCXJlZ2lvbiwgdGhlIG1hbGxvYyBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIGJyb2tlbiBpbnRvIHR3byBwYXJ0cywKLQlvbmUgcGFydCB3aGljaCBpcyBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgaXMgbWFpbnRhaW5lZAotCXNlcGFyYXRlbHkgb24gYSBwZXIgcHJvY2VzcyBiYXNpcywgYW5kIGFub3RoZXIgcGFydCB3aGljaCBpcyBjb21tb24KLQl0byBhbGwgcHJvY2Vzc2VzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBzcGVjaWZpYwotCXRvIGEgZ2l2ZW4gcHJvY2VzcywgYXMgYXJlIHRoZSBtb3JlY29yZSBhbmQgYWJvcnRmdW5jIHBvaW50ZXJzLgotCUhvd2V2ZXIgbWFnaWNbXSwgdGhlIHZlcnNpb24gbnVtYmVyLCB0aGUgZmxhZ3MgZmllbGQsIGV0YyBhcmUKLQljb21tb24gdG8gYWxsIHByb2Nlc3Nlcy4KZGlmZiAtLWdpdCBhL21tYWxsb2MvYWNpbmNsdWRlLm00IGIvbW1hbGxvYy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9hY2xvY2FsLm00IGIvbW1hbGxvYy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YyYTFlLi4wMDAwMDAwCi0tLSBhL21tYWxsb2MvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCmRpZmYgLS1naXQgYS9tbWFsbG9jL2F0dGFjaC5jIGIvbW1hbGxvYy9hdHRhY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNzBiZi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL2F0dGFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIGZvciBhY2Nlc3MgdG8gYSBtbWFwJ2QgbWFsbG9jIG1hbmFnZWQgcmVnaW9uLgotICAgQ29weXJpZ2h0IDE5OTIsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gICBmbmZAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPiAvKiBBZnRlciBzeXMvdHlwZXMuaCwgYXQgbGVhc3QgZm9yIGRweC8yLiAgKi8KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4JLyogUHJvdG90eXBlcyBmb3IgbHNlZWsgKi8KLSNlbmRpZgotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkKEhBVkVfTU1BUCkKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMvcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWRlc2MgKnJldXNlIFBBUkFNUyAoKGludCkpOwotCi0vKiBJbml0aWFsaXplIGFjY2VzcyB0byBhIG1tYWxsb2MgbWFuYWdlZCByZWdpb24uCi0KLSAgIElmIEZEIGlzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yIGZvciBhbiBvcGVuIGZpbGUgdGhlbiBkYXRhIGZvciB0aGUKLSAgIG1tYWxsb2MgbWFuYWdlZCByZWdpb24gaXMgbWFwcGVkIHRvIHRoYXQgZmlsZSwgb3RoZXJ3aXNlICIvZGV2L3plcm8iCi0gICBpcyB1c2VkIGFuZCB0aGUgZGF0YSB3aWxsIG5vdCBleGlzdCBpbiBhbnkgZmlsZXN5c3RlbSBvYmplY3QuCi0KLSAgIElmIHRoZSBvcGVuIGZpbGUgY29ycmVzcG9uZGluZyB0byBGRCBpcyBmcm9tIGEgcHJldmlvdXMgdXNlIG9mCi0gICBtbWFsbG9jIGFuZCBwYXNzZXMgc29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGl0IGlzCi0gICBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgbW1hbGxvYyBwYWNrYWdlLCB0aGVuIGl0J3MgZGF0YSBpcwotICAgbWFwcGVkIGluIGFuZCBpcyBpbW1lZGlhdGVseSBhY2Nlc3NpYmxlIGF0IHRoZSBzYW1lIGFkZHJlc3NlcyBpbgotICAgdGhlIGN1cnJlbnQgcHJvY2VzcyBhcyB0aGUgcHJvY2VzcyB0aGF0IGNyZWF0ZWQgdGhlIGZpbGUuCi0KLSAgIElmIEJBU0VBRERSIGlzIG5vdCBOVUxMLCB0aGUgbWFwcGluZyBpcyBlc3RhYmxpc2hlZCBzdGFydGluZyBhdCB0aGUKLSAgIHNwZWNpZmllZCBhZGRyZXNzIGluIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuICBJZiBCQVNFQUREUiBpcyBOVUxMLAotICAgdGhlIG1tYWxsb2MgcGFja2FnZSBjaG9vc2VzIGEgc3VpdGFibGUgYWRkcmVzcyBhdCB3aGljaCB0byBzdGFydCB0aGUKLSAgIG1hcHBlZCByZWdpb24sIHdoaWNoIHdpbGwgYmUgdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBtYXBwaW5nIGlmCi0gICBvcGVuaW5nIGFuIGV4aXN0aW5nIGZpbGUgd2hpY2ggd2FzIHByZXZpb3VzbHkgYnVpbHQgYnkgbW1hbGxvYywgb3IKLSAgIGZvciBuZXcgZmlsZXMgd2lsbCBiZSBhIHZhbHVlIGNob3NlbiBieSBtbWFwLgotCi0gICBTcGVjaWZ5aW5nIEJBU0VBRERSIHByb3ZpZGVzIG1vcmUgY29udHJvbCBvdmVyIHdoZXJlIHRoZSByZWdpb25zCi0gICBzdGFydCBhbmQgaG93IGJpZyB0aGV5IGNhbiBiZSBiZWZvcmUgYnVtcGluZyBpbnRvIGV4aXN0aW5nIG1hcHBlZAotICAgcmVnaW9ucyBvciBmdXR1cmUgbWFwcGVkIHJlZ2lvbnMuCi0KLSAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSAibWFsbG9jIGRlc2NyaXB0b3IiIHdoaWNoIGlzIHVzZWQgaW4gc3Vic2VxdWVudAotICAgY2FsbHMgdG8gb3RoZXIgbW1hbGxvYyBwYWNrYWdlIGZ1bmN0aW9ucy4gIEl0IGlzIGV4cGxpY2l0bHkgInZvaWQgKiIKLSAgICgiY2hhciAqIiBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGZ1bGx5IHN1cHBvcnQgdm9pZCkgc28gdGhhdCB1c2VycwotICAgb2YgdGhlIHBhY2thZ2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gICBkZXRhaWxzLgotCi0gICBPbiBmYWlsdXJlIHJldHVybnMgTlVMTC4gKi8KLQotUFRSCi1tbWFsbG9jX2F0dGFjaCAoZmQsIGJhc2VhZGRyKQotICBpbnQgZmQ7Ci0gIFBUUiBiYXNlYWRkcjsKLXsKLSAgc3RydWN0IG1kZXNjIG10ZW1wOwotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgUFRSIG1iYXNlOwotICBzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0gIC8qIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBGRCBpcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgYW5kIGlmIHNvLCBzZWUKLSAgICAgaWYgdGhlIGZpbGUgaGFzIGFueSBjdXJyZW50IGNvbnRlbnRzIChzaXplID4gMCkuICBJZiBpdCBkb2VzLCB0aGVuCi0gICAgIGF0dGVtcHQgdG8gcmV1c2UgdGhlIGZpbGUuICBJZiB3ZSBjYW4ndCByZXVzZSB0aGUgZmlsZSwgZWl0aGVyCi0gICAgIGJlY2F1c2UgaXQgaXNuJ3QgYSB2YWxpZCBtbWFsbG9jIHByb2R1Y2VkIGZpbGUsIHdhcyBwcm9kdWNlZCBieSBhbgotICAgICBvYnNvbGV0ZSB2ZXJzaW9uLCBvciBhbnkgb3RoZXIgcmVhc29uLCB0aGVuIHdlIGZhaWwgdG8gYXR0YWNoIHRvCi0gICAgIHRoaXMgZmlsZS4gKi8KLQotICBpZiAoZmQgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnN0YXQgKGZkLCAmc2J1ZikgPCAwKQotCXsKLQkgIHJldHVybiAoTlVMTCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc2J1Zi5zdF9zaXplID4gMCkKLQl7Ci0JICByZXR1cm4gKChQVFIpIHJldXNlIChmZCkpOwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugc3RhcnQgb2ZmIHdpdGggdGhlIG1hbGxvYyBkZXNjcmlwdG9yIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIHVudGlsCi0gICAgIHdlIGJ1aWxkIGl0IHVwIGVub3VnaCB0byBjYWxsIF9tbWFsbG9jX21tYXBfbW9yZWNvcmUoKSB0byBhbGxvY2F0ZSB0aGUKLSAgICAgZmlyc3QgcGFnZSBvZiB0aGUgcmVnaW9uIGFuZCBjb3B5IGl0IHRoZXJlLiAgRW5zdXJlIHRoYXQgaXQgaXMgemVybydkIGFuZAotICAgICB0aGVuIGluaXRpYWxpemUgdGhlIGZpZWxkcyB0aGF0IHdlIGtub3cgdmFsdWVzIGZvci4gKi8KLQotICBtZHAgPSAmbXRlbXA7Ci0gIG1lbXNldCAoKGNoYXIgKikgbWRwLCAwLCBzaXplb2YgKG10ZW1wKSk7Ci0gIHN0cm5jcHkgKG1kcCAtPiBtYWdpYywgTU1BTExPQ19NQUdJQywgTU1BTExPQ19NQUdJQ19TSVpFKTsKLSAgbWRwIC0+IGhlYWRlcnNpemUgPSBzaXplb2YgKG10ZW1wKTsKLSAgbWRwIC0+IHZlcnNpb24gPSBNTUFMTE9DX1ZFUlNJT047Ci0gIG1kcCAtPiBtb3JlY29yZSA9IF9fbW1hbGxvY19tbWFwX21vcmVjb3JlOwotICBtZHAgLT4gZmQgPSBmZDsKLSAgbWRwIC0+IGJhc2UgPSBtZHAgLT4gYnJlYWt2YWwgPSBtZHAgLT4gdG9wID0gYmFzZWFkZHI7Ci0KLSAgLyogSWYgd2UgaGF2ZSBub3QgYmVlbiBwYXNzZWQgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUKLSAgICAgdG8gbWFwIHRvLCB0aGVuIG9wZW4gL2Rldi96ZXJvIGFuZCB1c2UgdGhhdCB0byBtYXAgdG8uICovCi0KLSAgaWYgKG1kcCAtPiBmZCA8IDApCi0gICAgewotICAgICAgaWYgKChtZHAgLT4gZmQgPSBvcGVuICgiL2Rldi96ZXJvIiwgT19SRFdSKSkgPCAwKQotCXsKLQkgIHJldHVybiAoTlVMTCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1kcCAtPiBmbGFncyB8PSBNTUFMTE9DX0RFVlpFUk87Ci0JfQotICAgIH0KLQotICAvKiAgTm93IHRyeSB0byBtYXAgaW4gdGhlIGZpcnN0IHBhZ2UsIGNvcHkgdGhlIG1hbGxvYyBkZXNjcmlwdG9yIHN0cnVjdHVyZQotICAgICAgdGhlcmUsIGFuZCBhcnJhbmdlIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhpcyBuZXcgY29weS4gIElmIHRoZSBtYXBwaW5nCi0gICAgICBmYWlscywgdGhlbiBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlmIGl0IHdhcyBvcGVuZWQgYnkgdXMsIGFuZCBhcnJhbmdlCi0gICAgICB0byByZXR1cm4gYSBOVUxMLiAqLwotCi0gIGlmICgobWJhc2UgPSBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgc2l6ZW9mIChtdGVtcCkpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG1lbWNweSAobWJhc2UsIG1kcCwgc2l6ZW9mIChtdGVtcCkpOwotICAgICAgbWRwID0gKHN0cnVjdCBtZGVzYyAqKSBtYmFzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWRwIC0+IGZsYWdzICYgTU1BTExPQ19ERVZaRVJPKQotCXsKLQkgIGNsb3NlIChtZHAgLT4gZmQpOwotCX0KLSAgICAgIG1kcCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoKFBUUikgbWRwKTsKLX0KLQotLyogR2l2ZW4gYW4gdmFsaWQgZmlsZSBkZXNjcmlwdG9yIG9uIGFuIG9wZW4gZmlsZSwgdGVzdCB0byBzZWUgaWYgdGhhdCBmaWxlCi0gICBpcyBhIHZhbGlkIG1tYWxsb2MgcHJvZHVjZWQgZmlsZSwgYW5kIGlmIHNvLCBhdHRlbXB0IHRvIHJlbWFwIGl0IGludG8gdGhlCi0gICBjdXJyZW50IHByb2Nlc3MgYXQgdGhlIHNhbWUgYWRkcmVzcyB0byB3aGljaCBpdCB3YXMgcHJldmlvdXNseSBtYXBwZWQuCi0KLSAgIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpbiB0aGUgbWFsbG9jLQotICAgZGVzY3JpcHRvciByZWFkIGZyb20gdGhlIGZpbGUgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgdmFsaWQgb25lLCBiZWZvcmUKLSAgIHRyeWluZyB0byBtYXAgdGhlIGZpbGUgaW4sIGFuZCBhZ2FpbiBhZnRlciBhIHN1Y2Nlc3NmdWwgbWFwcGluZyBhbmQKLSAgIGFmdGVyIHdlJ3ZlIHN3aXRjaGVkIG92ZXIgdG8gdXNpbmcgdGhlIG1hcHBlZCBpbiBtYWxsb2MgZGVzY3JpcHRvciAKLSAgIHJhdGhlciB0aGFuIHRoZSB0ZW1wb3Jhcnkgb25lIG9uIHRoZSBzdGFjay4KLQotICAgT25jZSB3ZSd2ZSBzd2l0Y2hlZCBvdmVyIHRvIHVzaW5nIHRoZSBtYXBwZWQgaW4gbWFsbG9jIGRlc2NyaXB0b3IsIHdlCi0gICBoYXZlIHRvIHVwZGF0ZSB0aGUgcG9pbnRlciB0byB0aGUgbW9yZWNvcmUgZnVuY3Rpb24sIHNpbmNlIGl0IGFsbW9zdAotICAgY2VydGFpbmx5IHdpbGwgYmUgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcyBpZiB0aGUgcHJvY2VzcyByZXVzaW5nIHRoZQotICAgbWFwcGVkIHJlZ2lvbiBpcyBmcm9tIGEgZGlmZmVyZW50IGV4ZWN1dGFibGUuCi0KLSAgIEFsc28gbm90ZSB0aGF0IGlmIHRoZSBoZWFwIGJlaW5nIHJlbWFwcGVkIHByZXZpb3VzbHkgdXNlZCB0aGUgbW1jaGVja2YoKQotICAgcm91dGluZXMsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBob29rcyBzaW5jZSB0aGVpciB0YXJnZXQgZnVuY3Rpb25zCi0gICB3aWxsIGhhdmUgY2VydGFpbmx5IG1vdmVkIGlmIHRoZSBleGVjdXRhYmxlIGhhcyBjaGFuZ2VkIGluIGFueSB3YXkuCi0gICBXZSBkbyB0aGlzIGJ5IGNhbGxpbmcgbW1jaGVja2YoKSBpbnRlcm5hbGx5LgotCi0gICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWFsbG9jIGRlc2NyaXB0b3IgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBpZgotICAgdW5zdWNjZXNzZnVsIGZvciBzb21lIHJlYXNvbi4gKi8KLQotc3RhdGljIHN0cnVjdCBtZGVzYyAqCi1yZXVzZSAoZmQpCi0gIGludCBmZDsKLXsKLSAgc3RydWN0IG1kZXNjIG10ZW1wOwotICBzdHJ1Y3QgbWRlc2MgKm1kcCA9IE5VTEw7Ci0KLSAgaWYgKChsc2VlayAoZmQsIDBMLCBTRUVLX1NFVCkgPT0gMCkgJiYKLSAgICAgIChyZWFkIChmZCwgKGNoYXIgKikgJm10ZW1wLCBzaXplb2YgKG10ZW1wKSkgPT0gc2l6ZW9mIChtdGVtcCkpICYmCi0gICAgICAobXRlbXAuaGVhZGVyc2l6ZSA9PSBzaXplb2YgKG10ZW1wKSkgJiYKLSAgICAgIChzdHJjbXAgKG10ZW1wLm1hZ2ljLCBNTUFMTE9DX01BR0lDKSA9PSAwKSAmJgotICAgICAgKG10ZW1wLnZlcnNpb24gPD0gTU1BTExPQ19WRVJTSU9OKSkKLSAgICB7Ci0gICAgICBtdGVtcC5mZCA9IGZkOwotICAgICAgaWYgKF9fbW1hbGxvY19yZW1hcF9jb3JlICgmbXRlbXApID09IG10ZW1wLmJhc2UpCi0JewotCSAgbWRwID0gKHN0cnVjdCBtZGVzYyAqKSBtdGVtcC5iYXNlOwotCSAgbWRwIC0+IGZkID0gZmQ7Ci0JICBtZHAgLT4gbW9yZWNvcmUgPSBfX21tYWxsb2NfbW1hcF9tb3JlY29yZTsKLQkgIGlmIChtZHAgLT4gbWZyZWVfaG9vayAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbW1jaGVja2YgKChQVFIpIG1kcCwgKHZvaWQgKCopIFBBUkFNUyAoKHZvaWQpKSkgTlVMTCwgMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKG1kcCk7Ci19Ci0KLSNlbHNlCS8qICFkZWZpbmVkIChIQVZFX01NQVApICovCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGhvdXQgbW1hcCwgdGhlIGxpYnJhcnkgc3RpbGwgc3VwcGxpZXMgYW4gZW50cnkgcG9pbnQKLSAgIHRvIGxpbmsgdG8sIGJ1dCB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBhY2Nlc3MgdG8gYW4gbW1hcCdkIG1hbmFnZWQgcmVnaW9uCi0gICBhbHdheXMgZmFpbHMuICovCi0KLS8qIEFSR1NVU0VEICovCi1QVFIKLW1tYWxsb2NfYXR0YWNoIChmZCwgYmFzZWFkZHIpCi0gIGludCBmZDsKLSAgUFRSIGJhc2VhZGRyOwotewotICAgcmV0dXJuIChOVUxMKTsKLX0KLQotI2VuZGlmCS8qIGRlZmluZWQgKEhBVkVfTU1BUCkgKi8KLQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9jb25maWd1cmUgYi9tbWFsbG9jL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQyMGRmYS4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE3NDcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9bW1hbGxvYy5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NTM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDY2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDA6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Mjg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzkwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDk6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzA6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODk2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKLWZpCi1maQotQVI9IiRhY19jdl9wcm9nX0FSIgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTYwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTk0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2OTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gbGltaXRzLmggc3RkZGVmLmggdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODE6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0cGFnZXNpemUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyODogY2hlY2tpbmcgd2hldGhlciBnZXRwYWdlc2l6ZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0cGFnZXNpemUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldHBhZ2VzaXplCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ1NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRwYWdlc2l6ZT1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0cGFnZXNpemU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRwYWdlc2l6ZSIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldHBhZ2VzaXplID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVFBBR0VTSVpFIDEKLUVPRgotCi1maQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KLSMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCi0jIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcwotCi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDUFBAJSRDUFAlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9jb25maWd1cmUuaW4gYi9tbWFsbG9jL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YTRjMi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWRubCBBdXRvY29uZiBjb25maWd1cmUgc2NyaXB0IGZvciBNTUFMTE9DLCB0aGUgR05VIG1tZW1vcnkgYWxsb2NhdG9yLgotZG5sIENvcHlyaWdodCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sCi1kbmwgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotZG5sIAotZG5sIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1kbmwgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLWRubCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotZG5sIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi1kbmwgCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLWRubCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1kbmwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLWRubCAKLWRubCBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotZG5sIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1kbmwgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19QUkVSRVEoMi4xMi4xKWRubAotQUNfSU5JVChtbWFsbG9jLmMpCi0KLUFDX1BST0dfQ0MKLUFDX1BST0dfSU5TVEFMTAotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1BQ19GVU5DX01NQVAKLUFDX0NIRUNLX0hFQURFUlMobGltaXRzLmggc3RkZGVmLmggdW5pc3RkLmgpCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHNicmspCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRwYWdlc2l6ZSkKLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9kZXRhY2guYyBiL21tYWxsb2MvZGV0YWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODA2NzkuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9kZXRhY2guYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEZpbmlzaCBhY2Nlc3MgdG8gYSBtbWFwJ2QgbWFsbG9jIG1hbmFnZWQgcmVnaW9uLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gICBmbmZAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJtbXByaXZhdGUuaCIKLQotLyogVGVybWluYXRlIGFjY2VzcyB0byBhIG1tYWxsb2MgbWFuYWdlZCByZWdpb24gYnkgdW5tYXBwaW5nIGFsbCBtZW1vcnkgcGFnZXMKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVnaW9uLCBhbmQgY2xvc2luZyB0aGUgZmlsZSBkZXNjcmlwdG9yIGlmIGl0IGlzIG9uZQotICAgdGhhdCB3ZSBvcGVuZWQuCi0KLSAgIFJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotCi0gICBSZXR1cm5zIHRoZSBtYWxsb2MgZGVzY3JpcHRvciBvbiBmYWlsdXJlLCB3aGljaCBjYW4gc3Vic2VxdWVudGx5IGJlIHVzZWQKLSAgIGZvciBmdXJ0aGVyIGFjdGlvbiwgc3VjaCBhcyBvYnRhaW5pbmcgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmF0dXJlIG9mCi0gICB0aGUgZmFpbHVyZSBieSBleGFtaW5pbmcgdGhlIHByZXNlcnZlZCBlcnJubyB2YWx1ZS4KLQotICAgTm90ZSB0aGF0IHRoZSBtYWxsb2MgZGVzY3JpcHRvciB0aGF0IHdlIGFyZSB1c2luZyBpcyBjdXJyZW50bHkgbG9jYXRlZCBpbgotICAgcmVnaW9uIHdlIGFyZSBhYm91dCB0byB1bm1hcCwgc28gd2UgZmlyc3QgbWFrZSBhIGxvY2FsIGNvcHkgb2YgaXQgb24gdGhlCi0gICBzdGFjayBhbmQgdXNlIHRoZSBjb3B5LiAqLwotCi1QVFIKLW1tYWxsb2NfZGV0YWNoIChtZCkKLSAgICAgUFRSIG1kOwotewotICBzdHJ1Y3QgbWRlc2MgbXRlbXA7Ci0KLSAgaWYgKG1kICE9IE5VTEwpCi0gICAgewotCi0gICAgICBtdGVtcCA9ICooc3RydWN0IG1kZXNjICopIG1kOwotICAgICAgCi0gICAgICAvKiBOb3cgdW5tYXAgYWxsIHRoZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gYnkgYXNraW5nIGZvciBhCi0JIG5lZ2F0aXZlIGluY3JlbWVudCBlcXVhbCB0byB0aGUgY3VycmVudCBzaXplIG9mIHRoZSByZWdpb24uICovCi0gICAgICAKLSAgICAgIGlmICgobXRlbXAubW9yZWNvcmUgKCZtdGVtcCwgbXRlbXAuYmFzZSAtIG10ZW1wLmJyZWFrdmFsKSkgPT0gTlVMTCkKLQl7Ci0JICAvKiBEZWFsbG9jYXRpbmcgZmFpbGVkLiAgVXBkYXRlIHRoZSBvcmlnaW5hbCBtYWxsb2MgZGVzY3JpcHRvcgotCSAgICAgd2l0aCBhbnkgY2hhbmdlcyAqLwotCSAgKihzdHJ1Y3QgbWRlc2MgKikgbWQgPSBtdGVtcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG10ZW1wLmZsYWdzICYgTU1BTExPQ19ERVZaRVJPKQotCSAgICB7Ci0JICAgICAgY2xvc2UgKG10ZW1wLmZkKTsKLQkgICAgfQotCSAgbWQgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChtZCk7Ci19CmRpZmYgLS1naXQgYS9tbWFsbG9jL2tleXMuYyBiL21tYWxsb2Mva2V5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWYwMGQxLi4wMDAwMDAwCi0tLSBhL21tYWxsb2Mva2V5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogQWNjZXNzIGZvciBhcHBsaWNhdGlvbiBrZXlzIGluIG1tYXAnZCBtYWxsb2MgbWFuYWdlZCByZWdpb24uCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0LiAgIGZuZkBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHNvbWUga2V5cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvCi0gICBwcm92aWRlIHBlcnNpc3RlbnQgYWNjZXNzIHRvIGxvY2F0aW9ucyBpbiB0aGUgbWFwcGVkIG1lbW9yeSBzZWN0aW9uLgotICAgVGhlIGludGVudCBpcyB0aGF0IHRoZXNlIGtleXMgYXJlIHRvIGJlIHVzZWQgc3BhcmluZ2x5IGFzIHNvcnQgb2YKLSAgIHBlcnNpc3RlbnQgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIHVzZSB0byByZWluaXRpYWxpemUKLSAgIGFjY2VzcyB0byBkYXRhIGluIHRoZSBtYXBwZWQgcmVnaW9uLgotCi0gICBGb3IgdGhlIG1vbWVudCwgdGhlc2Uga2V5cyBhcmUgc2ltcGx5IHN0b3JlZCBpbiB0aGUgbWFsbG9jIGRlc2NyaXB0b3IKLSAgIGl0c2VsZiwgaW4gYW4gYXJyYXkgb2YgZml4ZWQgbGVuZ3RoLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgc28gdGhhdCB0aGVyZQotICAgY2FuIGJlIGFuIHVubGltaXRlZCBudW1iZXIgb2Yga2V5cywgcG9zc2libHkgdXNpbmcgYSBtdWx0aWxldmVsIGFjY2VzcwotICAgc2NoZW1lIG9mIHNvbWUgc29ydC4gKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi1pbnQKLW1tYWxsb2Nfc2V0a2V5IChtZCwga2V5bnVtLCBrZXkpCi0gIFBUUiBtZDsgICAgIAotICBpbnQga2V5bnVtOwotICBQVFIga2V5OwotewotICBzdHJ1Y3QgbWRlc2MgKm1kcCA9IChzdHJ1Y3QgbWRlc2MgKikgbWQ7Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGlmICgobWRwICE9IE5VTEwpICYmIChrZXludW0gPj0gMCkgJiYgKGtleW51bSA8IE1NQUxMT0NfS0VZUykpCi0gICAgewotICAgICAgbWRwIC0+IGtleXMgW2tleW51bV0gPSBrZXk7Ci0gICAgICByZXN1bHQrKzsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotUFRSCi1tbWFsbG9jX2dldGtleSAobWQsIGtleW51bSkKLSAgUFRSIG1kOyAgICAgCi0gIGludCBrZXludW07Ci17Ci0gIHN0cnVjdCBtZGVzYyAqbWRwID0gKHN0cnVjdCBtZGVzYyAqKSBtZDsKLSAgUFRSIGtleXZhbCA9IE5VTEw7Ci0KLSAgaWYgKChtZHAgIT0gTlVMTCkgJiYgKGtleW51bSA+PSAwKSAmJiAoa2V5bnVtIDwgTU1BTExPQ19LRVlTKSkKLSAgICB7Ci0gICAgICBrZXl2YWwgPSBtZHAgLT4ga2V5cyBba2V5bnVtXTsKLSAgICB9Ci0gIHJldHVybiAoa2V5dmFsKTsKLX0KZGlmZiAtLWdpdCBhL21tYWxsb2MvbWNhbGxvYy5jIGIvbW1hbGxvYy9tY2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmNjMDcuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9tY2FsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8qIEdDQyBvbiBIUC9VWCBuZWVkcyB0aGlzIGJlZm9yZSBzdHJpbmcuaC4gKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4JLyogUHJvdG90eXBlcyBmb3IgbWVtY3B5LCBtZW1tb3ZlLCBtZW1zZXQsIGV0YyAqLwotCi0jaW5jbHVkZSAibW1wcml2YXRlLmgiCi0KLS8qIEFsbG9jYXRlIGFuIGFycmF5IG9mIE5NRU1CIGVsZW1lbnRzIGVhY2ggU0laRSBieXRlcyBsb25nLgotICAgVGhlIGVudGlyZSBhcnJheSBpcyBpbml0aWFsaXplZCB0byB6ZXJvcy4gICovCi0KLVBUUgotbWNhbGxvYyAobWQsIG5tZW1iLCBzaXplKQotICBQVFIgbWQ7Ci0gIHJlZ2lzdGVyIHNpemVfdCBubWVtYjsKLSAgcmVnaXN0ZXIgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiByZXN1bHQ7Ci0KLSAgaWYgKChyZXN1bHQgPSBtbWFsbG9jIChtZCwgbm1lbWIgKiBzaXplKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtZW1zZXQgKHJlc3VsdCwgMCwgbm1lbWIgKiBzaXplKTsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogV2hlbiB1c2luZyB0aGlzIHBhY2thZ2UsIHByb3ZpZGUgYSB2ZXJzaW9uIG9mIG1hbGxvYy9yZWFsbG9jL2ZyZWUgYnVpbHQKLSAgIG9uIHRvcCBvZiBpdCwgc28gdGhhdCBpZiB3ZSB1c2UgdGhlIGRlZmF1bHQgc2JyaygpIHJlZ2lvbiB3ZSB3aWxsIG5vdAotICAgY29sbGlkZSB3aXRoIGFub3RoZXIgbWFsbG9jIHBhY2thZ2UgdHJ5aW5nIHRvIGRvIHRoZSBzYW1lIHRoaW5nLCBpZgotICAgdGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGFueSAiaGlkZGVuIiBjYWxscyB0byBtYWxsb2MvcmVhbGxvYy9mcmVlIChzdWNoCi0gICBhcyBpbnNpZGUgYSBzeXN0ZW0gbGlicmFyeSkuICovCi0KLVBUUgotY2FsbG9jIChubWVtYiwgc2l6ZSkKLSAgc2l6ZV90IG5tZW1iOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmV0dXJuIChtY2FsbG9jICgoUFRSKSBOVUxMLCBubWVtYiwgc2l6ZSkpOwotfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tZnJlZS5jIGIvbW1hbGxvYy9tZnJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTA5YWM2Li4wMDAwMDAwCi0tLSBhL21tYWxsb2MvbWZyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiBGcmVlIGEgYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSBgbW1hbGxvYycuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgV3JpdHRlbiBNYXkgMTk4OSBieSBNaWtlIEhhZXJ0ZWwuCi0gICBIZWF2aWx5IG1vZGlmaWVkIE1hciAxOTkyIGJ5IEZyZWQgRmlzaC4gIChmbmZAY3lnbnVzLmNvbSkKLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCAoRW1haWwpIGF0IHRoZSBhZGRyZXNzIG1pa2VAYWkubWl0LmVkdSwKLSAgIG9yIChVUyBtYWlsKSBhcyBNaWtlIEhhZXJ0ZWwgYy9vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi0vKiBSZXR1cm4gbWVtb3J5IHRvIHRoZSBoZWFwLgotICAgTGlrZSBgbWZyZWUnIGJ1dCBkb24ndCBjYWxsIGEgbWZyZWVfaG9vayBpZiB0aGVyZSBpcyBvbmUuICAqLwotCi12b2lkCi1fX21tYWxsb2NfZnJlZSAobWRwLCBwdHIpCi0gIHN0cnVjdCBtZGVzYyAqbWRwOwotICBQVFIgcHRyOwotewotICBpbnQgdHlwZTsKLSAgc2l6ZV90IGJsb2NrLCBibG9ja3M7Ci0gIHJlZ2lzdGVyIHNpemVfdCBpOwotICBzdHJ1Y3QgbGlzdCAqcHJldiwgKm5leHQ7Ci0KLSAgYmxvY2sgPSBCTE9DSyAocHRyKTsKLQotICB0eXBlID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LnR5cGU7Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgLyogR2V0IGFzIG1hbnkgc3RhdGlzdGljcyBhcyBlYXJseSBhcyB3ZSBjYW4uICAqLwotICAgICAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfdXNlZC0tOwotICAgICAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc191c2VkIC09Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5zaXplICogQkxPQ0tTSVpFOwotICAgICAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlICs9Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5zaXplICogQkxPQ0tTSVpFOwotCi0gICAgICAvKiBGaW5kIHRoZSBmcmVlIGNsdXN0ZXIgcHJldmlvdXMgdG8gdGhpcyBvbmUgaW4gdGhlIGZyZWUgbGlzdC4KLQkgU3RhcnQgc2VhcmNoaW5nIGF0IHRoZSBsYXN0IGJsb2NrIHJlZmVyZW5jZWQ7IHRoaXMgbWF5IGJlbmVmaXQKLQkgcHJvZ3JhbXMgd2l0aCBsb2NhbGl0eSBvZiBhbGxvY2F0aW9uLiAgKi8KLSAgICAgIGkgPSBtZHAgLT4gaGVhcGluZGV4OwotICAgICAgaWYgKGkgPiBibG9jaykKLQl7Ci0JICB3aGlsZSAoaSA+IGJsb2NrKQotCSAgICB7Ci0JICAgICAgaSA9IG1kcCAtPiBoZWFwaW5mb1tpXS5mcmVlLnByZXY7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGkgPSBtZHAgLT4gaGVhcGluZm9baV0uZnJlZS5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoKGkgIT0gMCkgJiYgKGkgPCBibG9jaykpOwotCSAgaSA9IG1kcCAtPiBoZWFwaW5mb1tpXS5mcmVlLnByZXY7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgaG93IHRvIGxpbmsgdGhpcyBibG9jayBpbnRvIHRoZSBmcmVlIGxpc3QuICAqLwotICAgICAgaWYgKGJsb2NrID09IGkgKyBtZHAgLT4gaGVhcGluZm9baV0uZnJlZS5zaXplKQotCXsKLQkgIC8qIENvYWxlc2NlIHRoaXMgYmxvY2sgd2l0aCBpdHMgcHJlZGVjZXNzb3IuICAqLwotCSAgbWRwIC0+IGhlYXBpbmZvW2ldLmZyZWUuc2l6ZSArPQotCSAgICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5zaXplOwotCSAgYmxvY2sgPSBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBSZWFsbHkgbGluayB0aGlzIGJsb2NrIGJhY2sgaW50byB0aGUgZnJlZSBsaXN0LiAgKi8KLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplID0KLQkgICAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZTsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0ID0gbWRwIC0+IGhlYXBpbmZvW2ldLmZyZWUubmV4dDsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5wcmV2ID0gaTsKLQkgIG1kcCAtPiBoZWFwaW5mb1tpXS5mcmVlLm5leHQgPSBibG9jazsKLQkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dF0uZnJlZS5wcmV2ID0gYmxvY2s7Ci0JICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc19mcmVlKys7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB0aGUgYmxvY2sgaXMgbGlua2VkIGluLCBzZWUgaWYgd2UgY2FuIGNvYWxlc2NlIGl0Ci0JIHdpdGggaXRzIHN1Y2Nlc3NvciAoYnkgZGVsZXRpbmcgaXRzIHN1Y2Nlc3NvciBmcm9tIHRoZSBsaXN0Ci0JIGFuZCBhZGRpbmcgaW4gaXRzIHNpemUpLiAgKi8KLSAgICAgIGlmIChibG9jayArIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplID09Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dCkKLQl7Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUuc2l6ZQotCSAgICArPSBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHRdLmZyZWUuc2l6ZTsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0Ci0JICAgID0gbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLm5leHQ7Ci0JICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHRdLmZyZWUucHJldiA9IGJsb2NrOwotCSAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfZnJlZS0tOwotCX0KLQotICAgICAgLyogTm93IHNlZSBpZiB3ZSBjYW4gcmV0dXJuIHN0dWZmIHRvIHRoZSBzeXN0ZW0uICAqLwotICAgICAgYmxvY2tzID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemU7Ci0gICAgICBpZiAoYmxvY2tzID49IEZJTkFMX0ZSRUVfQkxPQ0tTICYmIGJsb2NrICsgYmxvY2tzID09IG1kcCAtPiBoZWFwbGltaXQKLQkgICYmIG1kcCAtPiBtb3JlY29yZSAobWRwLCAwKSA9PSBBRERSRVNTIChibG9jayArIGJsb2NrcykpCi0JewotCSAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzID0gYmxvY2tzICogQkxPQ0tTSVpFOwotCSAgbWRwIC0+IGhlYXBsaW1pdCAtPSBibG9ja3M7Ci0JICBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgLWJ5dGVzKTsKLQkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldl0uZnJlZS5uZXh0Ci0JICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHQ7Ci0JICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHRdLmZyZWUucHJldgotCSAgICA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5wcmV2OwotCSAgYmxvY2sgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldjsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSAtPSBieXRlczsKLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgbmV4dCBzZWFyY2ggdG8gYmVnaW4gYXQgdGhpcyBibG9jay4gICovCi0gICAgICBtZHAgLT4gaGVhcGluZGV4ID0gYmxvY2s7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBEbyBzb21lIG9mIHRoZSBzdGF0aXN0aWNzLiAgKi8KLSAgICAgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQtLTsKLSAgICAgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCAtPSAxIDw8IHR5cGU7Ci0gICAgICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc19mcmVlKys7Ci0gICAgICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX2ZyZWUgKz0gMSA8PCB0eXBlOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGZyZWUgZnJhZ21lbnQgaW4gdGhpcyBibG9jay4gICovCi0gICAgICBwcmV2ID0gKHN0cnVjdCBsaXN0ICopCi0JKChjaGFyICopIEFERFJFU1MoYmxvY2spICsKLQkgKG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcuZmlyc3QgPDwgdHlwZSkpOwotCi0gICAgICBpZiAobWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uZnJhZy5uZnJlZSA9PQotCSAgKEJMT0NLU0laRSA+PiB0eXBlKSAtIDEpCi0JewotCSAgLyogSWYgYWxsIGZyYWdtZW50cyBvZiB0aGlzIGJsb2NrIGFyZSBmcmVlLCByZW1vdmUgdGhlbQotCSAgICAgZnJvbSB0aGUgZnJhZ21lbnQgbGlzdCBhbmQgZnJlZSB0aGUgd2hvbGUgYmxvY2suICAqLwotCSAgbmV4dCA9IHByZXY7Ci0JICBmb3IgKGkgPSAxOyBpIDwgKHNpemVfdCkgKEJMT0NLU0laRSA+PiB0eXBlKTsgKytpKQotCSAgICB7Ci0JICAgICAgbmV4dCA9IG5leHQgLT4gbmV4dDsKLQkgICAgfQotCSAgcHJldiAtPiBwcmV2IC0+IG5leHQgPSBuZXh0OwotCSAgaWYgKG5leHQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIG5leHQgLT4gcHJldiA9IHByZXYgLT4gcHJldjsKLQkgICAgfQotCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LnR5cGUgPSAwOwotCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSA9IDE7Ci0KLQkgIC8qIEtlZXAgdGhlIHN0YXRpc3RpY3MgYWNjdXJhdGUuICAqLwotCSAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfdXNlZCsrOwotCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc191c2VkICs9IEJMT0NLU0laRTsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUgLT0gQkxPQ0tTSVpFID4+IHR5cGU7Ci0JICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX2ZyZWUgLT0gQkxPQ0tTSVpFOwotCi0JICBtZnJlZSAoKFBUUikgbWRwLCAoUFRSKSBBRERSRVNTKGJsb2NrKSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uZnJhZy5uZnJlZSAhPSAwKQotCXsKLQkgIC8qIElmIHNvbWUgZnJhZ21lbnRzIG9mIHRoaXMgYmxvY2sgYXJlIGZyZWUsIGxpbmsgdGhpcwotCSAgICAgZnJhZ21lbnQgaW50byB0aGUgZnJhZ21lbnQgbGlzdCBhZnRlciB0aGUgZmlyc3QgZnJlZQotCSAgICAgZnJhZ21lbnQgb2YgdGhpcyBibG9jay4gKi8KLQkgIG5leHQgPSAoc3RydWN0IGxpc3QgKikgcHRyOwotCSAgbmV4dCAtPiBuZXh0ID0gcHJldiAtPiBuZXh0OwotCSAgbmV4dCAtPiBwcmV2ID0gcHJldjsKLQkgIHByZXYgLT4gbmV4dCA9IG5leHQ7Ci0JICBpZiAobmV4dCAtPiBuZXh0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBuZXh0IC0+IG5leHQgLT4gcHJldiA9IG5leHQ7Ci0JICAgIH0KLQkgICsrbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uZnJhZy5uZnJlZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gZnJhZ21lbnRzIG9mIHRoaXMgYmxvY2sgYXJlIGZyZWUsIHNvIGxpbmsgdGhpcwotCSAgICAgZnJhZ21lbnQgaW50byB0aGUgZnJhZ21lbnQgbGlzdCBhbmQgYW5ub3VuY2UgdGhhdAotCSAgICAgaXQgaXMgdGhlIGZpcnN0IGZyZWUgZnJhZ21lbnQgb2YgdGhpcyBibG9jay4gKi8KLQkgIHByZXYgPSAoc3RydWN0IGxpc3QgKikgcHRyOwotCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uZnJhZy5uZnJlZSA9IDE7Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLmZpcnN0ID0KLQkgICAgUkVTSURVQUwgKHB0ciwgQkxPQ0tTSVpFKSA+PiB0eXBlOwotCSAgcHJldiAtPiBuZXh0ID0gbWRwIC0+IGZyYWdoZWFkW3R5cGVdLm5leHQ7Ci0JICBwcmV2IC0+IHByZXYgPSAmbWRwIC0+IGZyYWdoZWFkW3R5cGVdOwotCSAgcHJldiAtPiBwcmV2IC0+IG5leHQgPSBwcmV2OwotCSAgaWYgKHByZXYgLT4gbmV4dCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgcHJldiAtPiBuZXh0IC0+IHByZXYgPSBwcmV2OwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gbWVtb3J5IHRvIHRoZSBoZWFwLiAgKi8KLQotdm9pZAotbWZyZWUgKG1kLCBwdHIpCi0gIFBUUiBtZDsKLSAgUFRSIHB0cjsKLXsKLSAgc3RydWN0IG1kZXNjICptZHA7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBhbGlnbmxpc3QgKmw7Ci0KLSAgaWYgKHB0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIG1kcCA9IE1EX1RPX01EUCAobWQpOwotICAgICAgZm9yIChsID0gbWRwIC0+IGFsaWduZWRfYmxvY2tzOyBsICE9IE5VTEw7IGwgPSBsIC0+IG5leHQpCi0JewotCSAgaWYgKGwgLT4gYWxpZ25lZCA9PSBwdHIpCi0JICAgIHsKLQkgICAgICBsIC0+IGFsaWduZWQgPSBOVUxMOyAgLyogTWFyayB0aGUgc2xvdCBpbiB0aGUgbGlzdCBhcyBmcmVlLiAqLwotCSAgICAgIHB0ciA9IGwgLT4gZXhhY3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9ICAgICAgCi0gICAgICBpZiAobWRwIC0+IG1mcmVlX2hvb2sgIT0gTlVMTCkKLQl7Ci0JICAoKm1kcCAtPiBtZnJlZV9ob29rKSAobWQsIHB0cik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIF9fbW1hbGxvY19mcmVlIChtZHAsIHB0cik7Ci0JfQotICAgIH0KLX0KLQotLyogV2hlbiB1c2luZyB0aGlzIHBhY2thZ2UsIHByb3ZpZGUgYSB2ZXJzaW9uIG9mIG1hbGxvYy9yZWFsbG9jL2ZyZWUgYnVpbHQKLSAgIG9uIHRvcCBvZiBpdCwgc28gdGhhdCBpZiB3ZSB1c2UgdGhlIGRlZmF1bHQgc2JyaygpIHJlZ2lvbiB3ZSB3aWxsIG5vdAotICAgY29sbGlkZSB3aXRoIGFub3RoZXIgbWFsbG9jIHBhY2thZ2UgdHJ5aW5nIHRvIGRvIHRoZSBzYW1lIHRoaW5nLCBpZgotICAgdGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGFueSAiaGlkZGVuIiBjYWxscyB0byBtYWxsb2MvcmVhbGxvYy9mcmVlIChzdWNoCi0gICBhcyBpbnNpZGUgYSBzeXN0ZW0gbGlicmFyeSkuICovCi0KLXZvaWQKLWZyZWUgKHB0cikKLSAgUFRSIHB0cjsKLXsKLSAgbWZyZWUgKChQVFIpIE5VTEwsIHB0cik7Ci19CmRpZmYgLS1naXQgYS9tbWFsbG9jL21tLmMgYi9tbWFsbG9jL21tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODdlMGMuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9tbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQnVpbGQgdGhlIGVudGlyZSBtbWFsbG9jIGxpYnJhcnkgYXMgYSBzaW5nbGUgb2JqZWN0IG1vZHVsZS4gVGhpcwotICAgYXZvaWRzIGhhdmluZyBjbGllbnRzIHBpY2sgdXAgcGFydCBvZiB0aGVpciBhbGxvY2F0aW9uIHJvdXRpbmVzCi0gICBmcm9tIG1tYWxsb2MgYW5kIHBhcnQgZnJvbSBsaWJjLCB3aGljaCByZXN1bHRzIGluIHVuZGVmaW5lZAotICAgYmVoYXZpb3IuICBJdCBzaG91bGQgYWxzbyBzdGlsbCBiZSBwb3NzaWJsZSB0byBidWlsZCB0aGUgbGlicmFyeQotICAgYXMgYSBzdGFuZGFyZCBsaWJyYXJ5IHdpdGggbXVsdGlwbGUgb2JqZWN0cy4KLQotICAgQ29weXJpZ2h0IDE5OTYsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+CS8qIFByb3RvdHlwZXMgZm9yIGxzZWVrLCBzYnJrIChtYXliZSkgKi8KLSNlbmRpZgotI2luY2x1ZGUgIm1jYWxsb2MuYyIKLSNpbmNsdWRlICJtZnJlZS5jIgotI2luY2x1ZGUgIm1tYWxsb2MuYyIKLSNpbmNsdWRlICJtbWNoZWNrLmMiCi0jaW5jbHVkZSAibW1lbWFsaWduLmMiCi0jaW5jbHVkZSAibW1zdGF0cy5jIgotI2luY2x1ZGUgIm1tdHJhY2UuYyIKLSNpbmNsdWRlICJtcmVhbGxvYy5jIgotI2luY2x1ZGUgIm12YWxsb2MuYyIKLSNpbmNsdWRlICJtbWFwLXN1cC5jIgotI2luY2x1ZGUgImF0dGFjaC5jIgotI2luY2x1ZGUgImRldGFjaC5jIgotI2luY2x1ZGUgImtleXMuYyIKLSNpbmNsdWRlICJzYnJrLXN1cC5jIgpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tbWFsbG9jLmMgYi9tbWFsbG9jL21tYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2MGZlMi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL21tYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKiBNZW1vcnkgYWxsb2NhdG9yIGBtYWxsb2MnLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIFdyaXR0ZW4gTWF5IDE5ODkgYnkgTWlrZSBIYWVydGVsLgotICAgSGVhdmlseSBtb2RpZmllZCBNYXIgMTk5MiBieSBGcmVkIEZpc2ggZm9yIG1tYXAnZCB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIChFbWFpbCkgYXQgdGhlIGFkZHJlc3MgbWlrZUBhaS5taXQuZWR1LAotICAgb3IgKFVTIG1haWwpIGFzIE1pa2UgSGFlcnRlbCBjL28gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIFByb3RvdHlwZXMgZm9yIG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0LCBldGMgKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCBpbml0aWFsaXplIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqKSk7Ci1zdGF0aWMgUFRSIG1vcmVjb3JlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBzaXplX3QpKTsKLXN0YXRpYyBQVFIgYWxpZ24gUEFSQU1TICgoc3RydWN0IG1kZXNjICosIHNpemVfdCkpOwotCi0vKiBBbGlnbmVkIGFsbG9jYXRpb24uICAqLwotCi1zdGF0aWMgUFRSCi1hbGlnbiAobWRwLCBzaXplKQotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXN1bHQ7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGFkajsKLQotICByZXN1bHQgPSBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgc2l6ZSk7Ci0gIGFkaiA9IFJFU0lEVUFMIChyZXN1bHQsIEJMT0NLU0laRSk7Ci0gIGlmIChhZGogIT0gMCkKLSAgICB7Ci0gICAgICBhZGogPSBCTE9DS1NJWkUgLSBhZGo7Ci0gICAgICBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgYWRqKTsKLSAgICAgIHJlc3VsdCA9IChjaGFyICopIHJlc3VsdCArIGFkajsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogU2V0IGV2ZXJ5dGhpbmcgdXAgYW5kIHJlbWVtYmVyIHRoYXQgd2UgaGF2ZS4gICovCi0KLXN0YXRpYyBpbnQKLWluaXRpYWxpemUgKG1kcCkKLSAgc3RydWN0IG1kZXNjICptZHA7Ci17Ci0gIG1kcCAtPiBoZWFwc2l6ZSA9IEhFQVAgLyBCTE9DS1NJWkU7Ci0gIG1kcCAtPiBoZWFwaW5mbyA9IChtYWxsb2NfaW5mbyAqKSAKLSAgICBhbGlnbiAobWRwLCBtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7Ci0gIGlmIChtZHAgLT4gaGVhcGluZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgbWVtc2V0ICgoUFRSKW1kcCAtPiBoZWFwaW5mbywgMCwgbWRwIC0+IGhlYXBzaXplICogc2l6ZW9mIChtYWxsb2NfaW5mbykpOwotICBtZHAgLT4gaGVhcGluZm9bMF0uZnJlZS5zaXplID0gMDsKLSAgbWRwIC0+IGhlYXBpbmZvWzBdLmZyZWUubmV4dCA9IG1kcCAtPiBoZWFwaW5mb1swXS5mcmVlLnByZXYgPSAwOwotICBtZHAgLT4gaGVhcGluZGV4ID0gMDsKLSAgbWRwIC0+IGhlYXBiYXNlID0gKGNoYXIgKikgbWRwIC0+IGhlYXBpbmZvOwotICBtZHAgLT4gZmxhZ3MgfD0gTU1BTExPQ19JTklUSUFMSVpFRDsKLSAgcmV0dXJuICgxKTsKLX0KLQotLyogR2V0IG5lYXRseSBhbGlnbmVkIG1lbW9yeSwgaW5pdGlhbGl6aW5nIG9yCi0gICBncm93aW5nIHRoZSBoZWFwIGluZm8gdGFibGUgYXMgbmVjZXNzYXJ5LiAqLwotCi1zdGF0aWMgUFRSCi1tb3JlY29yZSAobWRwLCBzaXplKQotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXN1bHQ7Ci0gIG1hbGxvY19pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKLSAgc2l6ZV90IG5ld3NpemU7Ci0KLSAgcmVzdWx0ID0gYWxpZ24gKG1kcCwgc2l6ZSk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGdyb3cgdGhlIGluZm8gdGFibGUuICAqLwotICBpZiAoKHNpemVfdCkgQkxPQ0sgKChjaGFyICopIHJlc3VsdCArIHNpemUpID4gbWRwIC0+IGhlYXBzaXplKQotICAgIHsKLSAgICAgIG5ld3NpemUgPSBtZHAgLT4gaGVhcHNpemU7Ci0gICAgICB3aGlsZSAoKHNpemVfdCkgQkxPQ0sgKChjaGFyICopIHJlc3VsdCArIHNpemUpID4gbmV3c2l6ZSkKLQl7Ci0JICBuZXdzaXplICo9IDI7Ci0JfQotICAgICAgbmV3aW5mbyA9IChtYWxsb2NfaW5mbyAqKSBhbGlnbiAobWRwLCBuZXdzaXplICogc2l6ZW9mIChtYWxsb2NfaW5mbykpOwotICAgICAgaWYgKG5ld2luZm8gPT0gTlVMTCkKLQl7Ci0JICBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgLXNpemUpOwotCSAgcmV0dXJuIChOVUxMKTsKLQl9Ci0gICAgICBtZW1zZXQgKChQVFIpIG5ld2luZm8sIDAsIG5ld3NpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7Ci0gICAgICBtZW1jcHkgKChQVFIpIG5ld2luZm8sIChQVFIpIG1kcCAtPiBoZWFwaW5mbywKLQkgICAgICBtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7Ci0gICAgICBvbGRpbmZvID0gbWRwIC0+IGhlYXBpbmZvOwotICAgICAgbmV3aW5mb1tCTE9DSyAob2xkaW5mbyldLmJ1c3kudHlwZSA9IDA7Ci0gICAgICBuZXdpbmZvW0JMT0NLIChvbGRpbmZvKV0uYnVzeS5pbmZvLnNpemUKLQk9IEJMT0NLSUZZIChtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7Ci0gICAgICBtZHAgLT4gaGVhcGluZm8gPSBuZXdpbmZvOwotICAgICAgX19tbWFsbG9jX2ZyZWUgKG1kcCwgKFBUUilvbGRpbmZvKTsKLSAgICAgIG1kcCAtPiBoZWFwc2l6ZSA9IG5ld3NpemU7Ci0gICAgfQotCi0gIG1kcCAtPiBoZWFwbGltaXQgPSBCTE9DSyAoKGNoYXIgKikgcmVzdWx0ICsgc2l6ZSk7Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIGhlYXAuICAqLwotCi1QVFIKLW1tYWxsb2MgKG1kLCBzaXplKQotICBQVFIgbWQ7Ci0gIHNpemVfdCBzaXplOwotewotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgUFRSIHJlc3VsdDsKLSAgc2l6ZV90IGJsb2NrLCBibG9ja3MsIGxhc3RibG9ja3MsIHN0YXJ0OwotICByZWdpc3RlciBzaXplX3QgaTsKLSAgc3RydWN0IGxpc3QgKm5leHQ7Ci0gIHJlZ2lzdGVyIHNpemVfdCBsb2c7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLSAgICAgIAotICBpZiAobWRwIC0+IG1tYWxsb2NfaG9vayAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoKCptZHAgLT4gbW1hbGxvY19ob29rKSAobWQsIHNpemUpKTsKLSAgICB9Ci0KLSAgaWYgKCEobWRwIC0+IGZsYWdzICYgTU1BTExPQ19JTklUSUFMSVpFRCkpCi0gICAgewotICAgICAgaWYgKCFpbml0aWFsaXplIChtZHApKQotCXsKLQkgIHJldHVybiAoTlVMTCk7Ci0JfQotICAgIH0KLQotICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGxpc3QpKQotICAgIHsKLSAgICAgIHNpemUgPSBzaXplb2YgKHN0cnVjdCBsaXN0KTsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIHBvbGljeSBiYXNlZCBvbiB0aGUgcmVxdWVzdCBzaXplLiAgKi8KLSAgaWYgKHNpemUgPD0gQkxPQ0tTSVpFIC8gMikKLSAgICB7Ci0gICAgICAvKiBTbWFsbCBhbGxvY2F0aW9uIHRvIHJlY2VpdmUgYSBmcmFnbWVudCBvZiBhIGJsb2NrLgotCSBEZXRlcm1pbmUgdGhlIGxvZ2FyaXRobSB0byBiYXNlIHR3byBvZiB0aGUgZnJhZ21lbnQgc2l6ZS4gKi8KLSAgICAgIGxvZyA9IDE7Ci0gICAgICAtLXNpemU7Ci0gICAgICB3aGlsZSAoKHNpemUgLz0gMikgIT0gMCkKLQl7Ci0JICArK2xvZzsKLQl9Ci0KLSAgICAgIC8qIExvb2sgaW4gdGhlIGZyYWdtZW50IGxpc3RzIGZvciBhCi0JIGZyZWUgZnJhZ21lbnQgb2YgdGhlIGRlc2lyZWQgc2l6ZS4gKi8KLSAgICAgIG5leHQgPSBtZHAgLT4gZnJhZ2hlYWRbbG9nXS5uZXh0OwotICAgICAgaWYgKG5leHQgIT0gTlVMTCkKLQl7Ci0JICAvKiBUaGVyZSBhcmUgZnJlZSBmcmFnbWVudHMgb2YgdGhpcyBzaXplLgotCSAgICAgUG9wIGEgZnJhZ21lbnQgb3V0IG9mIHRoZSBmcmFnbWVudCBsaXN0IGFuZCByZXR1cm4gaXQuCi0JICAgICBVcGRhdGUgdGhlIGJsb2NrJ3MgbmZyZWUgYW5kIGZpcnN0IGNvdW50ZXJzLiAqLwotCSAgcmVzdWx0ID0gKFBUUikgbmV4dDsKLQkgIG5leHQgLT4gcHJldiAtPiBuZXh0ID0gbmV4dCAtPiBuZXh0OwotCSAgaWYgKG5leHQgLT4gbmV4dCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbmV4dCAtPiBuZXh0IC0+IHByZXYgPSBuZXh0IC0+IHByZXY7Ci0JICAgIH0KLQkgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7Ci0JICBpZiAoLS1tZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLm5mcmVlICE9IDApCi0JICAgIHsKLQkgICAgICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLmZpcnN0ID0KLQkJUkVTSURVQUwgKG5leHQgLT4gbmV4dCwgQkxPQ0tTSVpFKSA+PiBsb2c7Ci0JICAgIH0KLQotCSAgLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzLiAgKi8KLQkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQrKzsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCArPSAxIDw8IGxvZzsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSAtPSAxIDw8IGxvZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gZnJlZSBmcmFnbWVudHMgb2YgdGhlIGRlc2lyZWQgc2l6ZSwgc28gZ2V0IGEgbmV3IGJsb2NrCi0JICAgICBhbmQgYnJlYWsgaXQgaW50byBmcmFnbWVudHMsIHJldHVybmluZyB0aGUgZmlyc3QuICAqLwotCSAgcmVzdWx0ID0gbW1hbGxvYyAobWQsIEJMT0NLU0laRSk7Ci0JICBpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIExpbmsgYWxsIGZyYWdtZW50cyBidXQgdGhlIGZpcnN0IGludG8gdGhlIGZyZWUgbGlzdC4gICovCi0JICBmb3IgKGkgPSAxOyBpIDwgKHNpemVfdCkgKEJMT0NLU0laRSA+PiBsb2cpOyArK2kpCi0JICAgIHsKLQkgICAgICBuZXh0ID0gKHN0cnVjdCBsaXN0ICopICgoY2hhciAqKSByZXN1bHQgKyAoaSA8PCBsb2cpKTsKLQkgICAgICBuZXh0IC0+IG5leHQgPSBtZHAgLT4gZnJhZ2hlYWRbbG9nXS5uZXh0OwotCSAgICAgIG5leHQgLT4gcHJldiA9ICZtZHAgLT4gZnJhZ2hlYWRbbG9nXTsKLQkgICAgICBuZXh0IC0+IHByZXYgLT4gbmV4dCA9IG5leHQ7Ci0JICAgICAgaWYgKG5leHQgLT4gbmV4dCAhPSBOVUxMKQotCQl7Ci0JCSAgbmV4dCAtPiBuZXh0IC0+IHByZXYgPSBuZXh0OwotCQl9Ci0JICAgIH0KLQotCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmZyZWUgYW5kIGZpcnN0IGNvdW50ZXJzIGZvciB0aGlzIGJsb2NrLiAgKi8KLQkgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kudHlwZSA9IGxvZzsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWUgPSBpIC0gMTsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcuZmlyc3QgPSBpIC0gMTsKLQotCSAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfZnJlZSArPSAoQkxPQ0tTSVpFID4+IGxvZykgLSAxOwotCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlICs9IEJMT0NLU0laRSAtICgxIDw8IGxvZyk7Ci0gCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc191c2VkIC09IEJMT0NLU0laRSAtICgxIDw8IGxvZyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExhcmdlIGFsbG9jYXRpb24gdG8gcmVjZWl2ZSBvbmUgb3IgbW9yZSBibG9ja3MuCi0JIFNlYXJjaCB0aGUgZnJlZSBsaXN0IGluIGEgY2lyY2xlIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IHBsYWNlIHZpc2l0ZWQuCi0JIElmIHdlIGxvb3AgY29tcGxldGVseSBhcm91bmQgd2l0aG91dCBmaW5kaW5nIGEgbGFyZ2UgZW5vdWdoCi0JIHNwYWNlIHdlIHdpbGwgaGF2ZSB0byBnZXQgbW9yZSBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtLiAgKi8KLSAgICAgIGJsb2NrcyA9IEJMT0NLSUZZKHNpemUpOwotICAgICAgc3RhcnQgPSBibG9jayA9IE1BTExPQ19TRUFSQ0hfU1RBUlQ7Ci0gICAgICB3aGlsZSAobWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgPCBibG9ja3MpCi0JewotCSAgYmxvY2sgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dDsKLQkgIGlmIChibG9jayA9PSBzdGFydCkKLQkgICAgewotCSAgICAgIC8qIE5lZWQgdG8gZ2V0IG1vcmUgZnJvbSB0aGUgc3lzdGVtLiAgQ2hlY2sgdG8gc2VlIGlmCi0JCSB0aGUgbmV3IGNvcmUgd2lsbCBiZSBjb250aWd1b3VzIHdpdGggdGhlIGZpbmFsIGZyZWUKLQkJIGJsb2NrOyBpZiBzbyB3ZSBkb24ndCBuZWVkIHRvIGdldCBhcyBtdWNoLiAgKi8KLQkgICAgICBibG9jayA9IG1kcCAtPiBoZWFwaW5mb1swXS5mcmVlLnByZXY7Ci0JICAgICAgbGFzdGJsb2NrcyA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplOwotCSAgICAgIGlmIChtZHAgLT4gaGVhcGxpbWl0ICE9IDAgJiYKLQkJICBibG9jayArIGxhc3RibG9ja3MgPT0gbWRwIC0+IGhlYXBsaW1pdCAmJgotCQkgIG1kcCAtPiBtb3JlY29yZSAobWRwLCAwKSA9PSBBRERSRVNTKGJsb2NrICsgbGFzdGJsb2NrcykgJiYKLQkJICAobW9yZWNvcmUgKG1kcCwgKGJsb2NrcyAtIGxhc3RibG9ja3MpICogQkxPQ0tTSVpFKSkgIT0gTlVMTCkKLQkJewotCQkgIC8qIFdoaWNoIGJsb2NrIHdlIGFyZSBleHRlbmRpbmcgKHRoZSBgZmluYWwgZnJlZQotCQkgICAgIGJsb2NrJyByZWZlcnJlZCB0byBhYm92ZSkgbWlnaHQgaGF2ZSBjaGFuZ2VkLCBpZgotCQkgICAgIGl0IGdvdCBjb21iaW5lZCB3aXRoIGEgZnJlZWQgaW5mbyB0YWJsZS4gICovCi0JCSAgYmxvY2sgPSBtZHAgLT4gaGVhcGluZm9bMF0uZnJlZS5wcmV2OwotCi0JCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgKz0gKGJsb2NrcyAtIGxhc3RibG9ja3MpOwotCQkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSArPQotCQkgICAgICAoYmxvY2tzIC0gbGFzdGJsb2NrcykgKiBCTE9DS1NJWkU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICByZXN1bHQgPSBtb3JlY29yZShtZHAsIGJsb2NrcyAqIEJMT0NLU0laRSk7Ci0JICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotCQl7Ci0JCSAgcmV0dXJuIChOVUxMKTsKLQkJfQotCSAgICAgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7Ci0JICAgICAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LnR5cGUgPSAwOwotCSAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSBibG9ja3M7Ci0JICAgICAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfdXNlZCsrOwotCSAgICAgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCArPSBibG9ja3MgKiBCTE9DS1NJWkU7Ci0JICAgICAgcmV0dXJuIChyZXN1bHQpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSBzdWl0YWJsZSBmcmVlIGxpc3QgZW50cnkuCi0JIEZpZ3VyZSBvdXQgaG93IHRvIHJlbW92ZSB3aGF0IHdlIG5lZWQgZnJvbSB0aGUgbGlzdC4gKi8KLSAgICAgIHJlc3VsdCA9IEFERFJFU1MoYmxvY2spOwotICAgICAgaWYgKG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplID4gYmxvY2tzKQotCXsKLQkgIC8qIFRoZSBibG9jayB3ZSBmb3VuZCBoYXMgYSBiaXQgbGVmdCBvdmVyLAotCSAgICAgc28gcmVsaW5rIHRoZSB0YWlsIGVuZCBiYWNrIGludG8gdGhlIGZyZWUgbGlzdC4gKi8KLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9jayArIGJsb2Nrc10uZnJlZS5zaXplCi0JICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgLSBibG9ja3M7Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2sgKyBibG9ja3NdLmZyZWUubmV4dAotCSAgICA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0OwotCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrICsgYmxvY2tzXS5mcmVlLnByZXYKLQkgICAgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldjsKLQkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldl0uZnJlZS5uZXh0Ci0JICAgID0gbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLnByZXYKLQkgICAgICA9IG1kcCAtPiBoZWFwaW5kZXggPSBibG9jayArIGJsb2NrczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIGJsb2NrIGV4YWN0bHkgbWF0Y2hlcyBvdXIgcmVxdWlyZW1lbnRzLAotCSAgICAgc28ganVzdCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4gKi8KLQkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dF0uZnJlZS5wcmV2Ci0JICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXY7Ci0JICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXZdLmZyZWUubmV4dAotCSAgICA9IG1kcCAtPiBoZWFwaW5kZXggPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dDsKLQkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKLQl9Ci0KLSAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS50eXBlID0gMDsKLSAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSBibG9ja3M7Ci0gICAgICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc191c2VkKys7Ci0gICAgICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX3VzZWQgKz0gYmxvY2tzICogQkxPQ0tTSVpFOwotICAgICAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlIC09IGJsb2NrcyAqIEJMT0NLU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0vKiBXaGVuIHVzaW5nIHRoaXMgcGFja2FnZSwgcHJvdmlkZSBhIHZlcnNpb24gb2YgbWFsbG9jL3JlYWxsb2MvZnJlZSBidWlsdAotICAgb24gdG9wIG9mIGl0LCBzbyB0aGF0IGlmIHdlIHVzZSB0aGUgZGVmYXVsdCBzYnJrKCkgcmVnaW9uIHdlIHdpbGwgbm90Ci0gICBjb2xsaWRlIHdpdGggYW5vdGhlciBtYWxsb2MgcGFja2FnZSB0cnlpbmcgdG8gZG8gdGhlIHNhbWUgdGhpbmcsIGlmCi0gICB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgYW55ICJoaWRkZW4iIGNhbGxzIHRvIG1hbGxvYy9yZWFsbG9jL2ZyZWUgKHN1Y2gKLSAgIGFzIGluc2lkZSBhIHN5c3RlbSBsaWJyYXJ5KS4gKi8KLQotUFRSCi1tYWxsb2MgKHNpemUpCi0gIHNpemVfdCBzaXplOwotewotICBQVFIgcmVzdWx0OwotCi0gIHJlc3VsdCA9IG1tYWxsb2MgKChQVFIpIE5VTEwsIHNpemUpOwotICByZXR1cm4gKHJlc3VsdCk7Ci19CmRpZmYgLS1naXQgYS9tbWFsbG9jL21tYWxsb2MuaCBiL21tYWxsb2MvbW1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODI1NDdlLi4wMDAwMDAwCi0tLSBhL21tYWxsb2MvbW1hbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI2lmbmRlZiBNTUFMTE9DX0gKLSNkZWZpbmUgTU1BTExPQ19IIDEKLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgIC8qIGZvciBzaXplX3QgKi8KLSMgIGluY2x1ZGUgPHN0ZGlvLmg+ICAgICAgIC8qIGZvciBOVUxMICovCi0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0gCi0vKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIG9mIG1lbW9yeS4gICovCi0KLWV4dGVybiBQVFIgbW1hbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotCi0vKiBSZS1hbGxvY2F0ZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYmxvY2sgaW4gUFRSLCBtYWtpbmcgdGhlIG5ldyBibG9jawotICAgU0laRSBieXRlcyBsb25nLiAgKi8KLQotZXh0ZXJuIFBUUiBtcmVhbGxvYyBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7Ci0KLS8qIEFsbG9jYXRlIE5NRU1CIGVsZW1lbnRzIG9mIFNJWkUgYnl0ZXMgZWFjaCwgYWxsIGluaXRpYWxpemVkIHRvIDAuICAqLwotCi1leHRlcm4gUFRSIG1jYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QsIHNpemVfdCkpOwotCi0vKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IGBtbWFsbG9jJywgYG1yZWFsbG9jJyBvciBgbWNhbGxvYycuICAqLwotCi1leHRlcm4gdm9pZCBtZnJlZSBQQVJBTVMgKChQVFIsIFBUUikpOwotCi0vKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIGFsbG9jYXRlZCB0byBBTElHTk1FTlQgYnl0ZXMuICAqLwotCi1leHRlcm4gUFRSIG1tZW1hbGlnbiBQQVJBTVMgKChQVFIsIHNpemVfdCwgc2l6ZV90KSk7Ci0KLS8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgb24gYSBwYWdlIGJvdW5kYXJ5LiAgKi8KLQotZXh0ZXJuIFBUUiBtdmFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci0KLS8qIEFjdGl2YXRlIGEgc3RhbmRhcmQgY29sbGVjdGlvbiBvZiBkZWJ1Z2dpbmcgaG9va3MuICAqLwotCi1leHRlcm4gaW50IG1tY2hlY2sgUEFSQU1TICgoUFRSLCB2b2lkICgqKSAodm9pZCkpKTsKLQotZXh0ZXJuIGludCBtbWNoZWNrZiBQQVJBTVMgKChQVFIsIHZvaWQgKCopICh2b2lkKSwgaW50KSk7Ci0KLS8qIFBpY2sgdXAgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gKHNlZSBGSVhNRSBlbHNld2hlcmUpICovCi0KLWV4dGVybiBzdHJ1Y3QgbXN0YXRzIG1tc3RhdHMgUEFSQU1TICgoUFRSKSk7Ci0KLWV4dGVybiBQVFIgbW1hbGxvY19hdHRhY2ggUEFSQU1TICgoaW50LCBQVFIpKTsKLQotZXh0ZXJuIFBUUiBtbWFsbG9jX2RldGFjaCBQQVJBTVMgKChQVFIpKTsKLQotZXh0ZXJuIGludCBtbWFsbG9jX3NldGtleSBQQVJBTVMgKChQVFIsIGludCwgUFRSKSk7Ci0KLWV4dGVybiBQVFIgbW1hbGxvY19nZXRrZXkgUEFSQU1TICgoUFRSLCBpbnQpKTsKLQotZXh0ZXJuIGludCBtbWFsbG9jX2Vycm5vIFBBUkFNUyAoKFBUUikpOwotCi1leHRlcm4gaW50IG1tdHJhY2UgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gUFRSIG1tYWxsb2NfZmluZGJhc2UgUEFSQU1TICgoaW50KSk7Ci0KLSNlbmRpZiAgLyogTU1BTExPQ19IICovCmRpZmYgLS1naXQgYS9tbWFsbG9jL21tYWxsb2MudGV4aSBiL21tYWxsb2MvbW1hbGxvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM4ZjY1Li4wMDAwMDAwCi0tLSBhL21tYWxsb2MvbW1hbGxvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvICBAYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KLUBzZXRmaWxlbmFtZSBtbWFsbG9jLmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTW1hbGxvYzogKG1tYWxsb2MpLgkJVGhlIEdOVSBtYXBwZWQtbWFsbG9jIHBhY2thZ2UuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBtbWFsbG9jIChtYXBwZWQtbWFsbG9jKSBwYWNrYWdlLCB3cml0dGVuIGJ5Ci1mbmZAQGN5Z251cy5jb20sIGJhc2VkIG9uIEdOVSBtYWxsb2Mgd3JpdHRlbiBieSBtaWtlQEBhaS5taXQuZWR1LgotCi1Db3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBjIEBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIE1NQUxMT0MsIHRoZSBHTlUgbWVtb3J5LW1hcHBlZCBtYWxsb2MgcGFja2FnZQotQHRpdGxlcGFnZQotQHRpdGxlIG1tYWxsb2MKLUBzdWJ0aXRsZSBUaGUgR05VIG1lbW9yeS1tYXBwZWQgbWFsbG9jIHBhY2thZ2UKLUBhdXRob3IgRnJlZCBGaXNoCi1AYXV0aG9yIEN5Z251cyBTdXBwb3J0Ci1AYXV0aG9yIE1pa2UgSGFlcnRlbAotQGF1dGhvciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgZm5mXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgTU1BTExPQywgdGhlIEdOVSBtZW1vcnktbWFwcGVkIG1hbGxvYyBwYWNrYWdlfSwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLQotQGlmaW5mbwotQG5vZGUgVG9wLCBPdmVydmlldywgKGRpciksIChkaXIpCi1AdG9wIG1tYWxsb2MKLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBtZW1vcnktbWFwcGVkIG1hbGxvYyBwYWNrYWdlIG1tYWxsb2MuCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgRGVzY3JpcHRpb24KLSogSW1wbGVtZW50YXRpb246OiAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24KLQotIC0tLSBUaGUgRGV0YWlsZWQgTm9kZSBMaXN0aW5nIC0tLQotCi1JbXBsZW1lbnRhdGlvbgotCi0qIENvbXBhdGliaWxpdHk6OiAgICAgICAgICAgICAgIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5Ci0qIEZ1bmN0aW9uczo6ICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlc2NyaXB0aW9ucwotQGVuZCBtZW51Ci0KLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3LCBJbXBsZW1lbnRhdGlvbiwgVG9wLCBUb3AKLUBjaGFwdGVyIE92ZXJhbGwgRGVzY3JpcHRpb24KLQotVGhpcyBpcyBhIGhlYXZpbHkgbW9kaWZpZWQgdmVyc2lvbiBvZiBHTlUgQGNvZGV7bWFsbG9jfS4gIEl0IHVzZXMKLUBjb2Rle21tYXB9IGFzIHRoZSBiYXNpYyBtZWNoYW5pc20gZm9yIG9idGFpbmluZyBtZW1vcnkgZnJvbSB0aGUKLXN5c3RlbSwgcmF0aGVyIHRoYW4gQGNvZGV7c2Jya30uICBUaGlzIGdpdmVzIGl0IHNldmVyYWwgYWR2YW50YWdlcyBvdmVyIHRoZQotbW9yZSB0cmFkaXRpb25hbCBtYWxsb2M6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1TZXZlcmFsIGRpZmZlcmVudCBoZWFwcyBjYW4gYmUgdXNlZCwgZWFjaCBvZiB0aGVtIGdyb3dpbmcKLW9yIHNoaW5raW5nIHVuZGVyIGNvbnRyb2wgb2YgQGNvZGV7bW1hcH0sIHdpdGggdGhlIEBjb2Rle21tYWxsb2N9IGZ1bmN0aW9ucwotdXNpbmcgYSBzcGVjaWZpYyBoZWFwIG9uIGEgY2FsbCBieSBjYWxsIGJhc2lzLgotCi1AaXRlbQotQnkgdXNpbmcgQGNvZGV7bW1hcH0sIGl0IGlzIGVhc3kgdG8gY3JlYXRlIGhlYXBzIHdoaWNoIGFyZSBpbnRlbmRlZCB0bwotYmUgcGVyc2lzdGVudCBhbmQgZXhpc3QgYXMgYSBmaWxlc3lzdGVtIG9iamVjdCBhZnRlciB0aGUgY3JlYXRpbmcKLXByb2Nlc3MgaGFzIGdvbmUgYXdheS4KLQotQGl0ZW0KLUJlY2F1c2UgbXVsdGlwbGUgaGVhcHMgY2FuIGJlIG1hbmFnZWQsIGRhdGEgdXNlZCBmb3IgYSAKLXNwZWNpZmljIHB1cnBvc2UgY2FuIGJlIGFsbG9jYXRlZCBpbnRvIGl0cyBvd24gaGVhcCwgbWFraW5nCi1pdCBlYXNpZXIgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGBgZHVtcCcnIGFuZCBgYHJlc3RvcmUnJyBpbml0aWFsaXplZAotbWFsbG9jLW1hbmFnZWQgbWVtb3J5IHJlZ2lvbnMuICBGb3IgZXhhbXBsZSwgdGhlIGBgdW5leGVjJycgaGFjayBwb3B1bGFyaXplZAotYnkgR05VIEVtYWNzIGNvdWxkIHBvdGVudGlhbGx5IGdvIGF3YXkuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgSW1wbGVtZW50YXRpb24sICAsIE92ZXJ2aWV3LCBUb3AKLUBjaGFwdGVyIEltcGxlbWVudGF0aW9uCi0KLVRoZSBAY29kZXttbWFsbG9jfSBmdW5jdGlvbnMgY29udGFpbiBubyBpbnRlcm5hbCBzdGF0aWMgc3RhdGUuICBBbGwKLUBjb2Rle21tYWxsb2N9IGludGVybmFsIGRhdGEgaXMgYWxsb2NhdGVkIGluIHRoZSBtYXBwZWQgaW4gcmVnaW9uLCBhbG9uZwotd2l0aCB0aGUgdXNlciBkYXRhIHRoYXQgaXQgbWFuYWdlcy4gIFRoaXMgYWxsb3dzIGl0IHRvIG1hbmFnZSBtdWx0aXBsZQotc3VjaCByZWdpb25zIGFuZCB0byBgYHBpY2sgdXAgd2hlcmUgaXQgbGVmdCBvZmYnJyB3aGVuIHN1Y2ggcmVnaW9ucyBhcmUKLWxhdGVyIGR5bmFtaWNhbGx5IG1hcHBlZCBiYWNrIGluLgotCi1JbiBzb21lIHNlbnNlLCBtYWxsb2MgaGFzIGJlZW4gYGBwdXJpZmllZCcnIHRvIGNvbnRhaW4gbm8gaW50ZXJuYWwgc3RhdGUKLWluZm9ybWF0aW9uIGFuZCBnZW5lcmFsaXplZCB0byB1c2UgbXVsdGlwbGUgbWVtb3J5IHJlZ2lvbnMgcmF0aGVyIHRoYW4gYQotc2luZ2xlIHJlZ2lvbiBtYW5hZ2VkIGJ5IEBjb2Rle3Nicmt9LiAgSG93ZXZlciB0aGUgbmV3IHJvdXRpbmVzIG5vdyBuZWVkIGFuCi1leHRyYSBwYXJhbWV0ZXIgd2hpY2ggaW5mb3JtcyBAY29kZXttbWFsbG9jfSB3aGljaCBtZW1vcnkgcmVnaW9uIGl0IGlzIGRlYWxpbmcKLXdpdGggKGFsb25nIHdpdGggb3RoZXIgaW5mb3JtYXRpb24pLiAgVGhpcyBwYXJhbWV0ZXIgaXMgY2FsbGVkIHRoZQotQGRmbnttYWxsb2MgZGVzY3JpcHRvcn0uCi0KLVRoZSBmdW5jdGlvbnMgaW5pdGlhbGx5IHByb3ZpZGVkIGJ5IEBjb2Rle21tYWxsb2N9IGFyZToKLQotQGV4YW1wbGUKLXZvaWQgKm1tYWxsb2NfYXR0YWNoIChpbnQgZmQsIHZvaWQgKmJhc2VhZGRyKTsKLXZvaWQgKm1tYWxsb2NfZGV0YWNoICh2b2lkICptZCk7Ci1pbnQgbW1hbGxvY19lcnJubyAodm9pZCAqbWQpOwotaW50IG1tYWxsb2Nfc2V0a2V5ICh2b2lkICptZCwgaW50IGtleW51bSwgdm9pZCAqa2V5KTsKLXZvaWQgKm1tYWxsb2NfZ2V0a2V5ICh2b2lkICptZCwgaW50IGtleW51bSk7Ci0KLXZvaWQgKm1tYWxsb2MgKHZvaWQgKm1kLCBzaXplX3Qgc2l6ZSk7Ci12b2lkICptcmVhbGxvYyAodm9pZCAqbWQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwotdm9pZCAqbXZhbGxvYyAodm9pZCAqbWQsIHNpemVfdCBzaXplKTsKLXZvaWQgbWZyZWUgKHZvaWQgKm1kLCB2b2lkICpwdHIpOwotQGVuZCBleGFtcGxlCi0KLUBtZW51Ci0qIENvbXBhdGliaWxpdHk6OiAgICAgICAgICAgICAgIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5Ci0qIEZ1bmN0aW9uczo6ICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlc2NyaXB0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIENvbXBhdGliaWxpdHksIEZ1bmN0aW9ucywgSW1wbGVtZW50YXRpb24sIEltcGxlbWVudGF0aW9uCi1Ac2VjdGlvbiBCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eQotCi1UbyBhbGxvdyBhIHNpbmdsZSBtYWxsb2MgcGFja2FnZSB0byBiZSB1c2VkIGluIGEgZ2l2ZW4gYXBwbGljYXRpb24sCi1wcm92aXNpb24gaXMgbWFkZSBmb3IgdGhlIHRyYWRpdGlvbmFsIEBjb2Rle21hbGxvY30sIEBjb2Rle3JlYWxsb2N9LCBhbmQKLUBjb2Rle2ZyZWV9IGZ1bmN0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcyBzcGVjaWFsIGNhc2VzIG9mIHRoZQotQGNvZGV7bW1hbGxvY30gZnVuY3Rpb25zLiAgSW4gcGFydGljdWxhciwgaWYgYW55IG9mIHRoZSBmdW5jdGlvbnMgdGhhdAotZXhwZWN0IG1hbGxvYyBkZXNjcmlwdG9ycyBhcmUgY2FsbGVkIHdpdGggYSBAY29kZXtOVUxMfSBwb2ludGVyIHJhdGhlciB0aGFuIGEKLXZhbGlkIG1hbGxvYyBkZXNjcmlwdG9yLCB0aGVuIHRoZXkgZGVmYXVsdCB0byB1c2luZyBhbiBAY29kZXtzYnJrfSBtYW5hZ2VkCi1yZWdpb24uCi1UaGUgQGNvZGV7bW1hbGxvY30gcGFja2FnZSBwcm92aWRlcyBjb21wYXRpYmxlIEBjb2Rle21hbGxvY30sIEBjb2Rle3JlYWxsb2N9LAotYW5kIEBjb2Rle2ZyZWV9IGZ1bmN0aW9ucyB1c2luZyB0aGlzIG1lY2hhbmlzbSBpbnRlcm5hbGx5LgotQXBwbGljYXRpb25zIGNhbiBhdm9pZCB0aGlzIGV4dHJhIGludGVyZmFjZSBsYXllciBieSBzaW1wbHkgaW5jbHVkaW5nIHRoZQotZm9sbG93aW5nIGRlZmluZXM6Ci0KLUBleGFtcGxlCi0jZGVmaW5lIG1hbGxvYyhzaXplKQkJbW1hbGxvYyAoKHZvaWQgKikwLCAoc2l6ZSkpCi0jZGVmaW5lIHJlYWxsb2MocHRyLHNpemUpCW1yZWFsbG9jICgodm9pZCAqKTAsIChwdHIpLCAoc2l6ZSkpOwotI2RlZmluZSBmcmVlKHB0cikJCW1mcmVlICgodm9pZCAqKTAsIChwdHIpKQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotb3IgcmVwbGFjZSB0aGUgZXhpc3RpbmcgQGNvZGV7bWFsbG9jfSwgQGNvZGV7cmVhbGxvY30sIGFuZCBAY29kZXtmcmVlfQotY2FsbHMgd2l0aCB0aGUgYWJvdmUgcGF0dGVybnMgaWYgdXNpbmcgQGNvZGV7I2RlZmluZX0gY2F1c2VzIHByb2JsZW1zLgotCi1Abm9kZSBGdW5jdGlvbnMsICAsIENvbXBhdGliaWxpdHksIEltcGxlbWVudGF0aW9uCi1Ac2VjdGlvbiBGdW5jdGlvbiBEZXNjcmlwdGlvbnMKLQotVGhlc2UgYXJlIHRoZSBkZXRhaWxzIG9uIHRoZSBmdW5jdGlvbnMgdGhhdCBtYWtlIHVwIHRoZSBAY29kZXttbWFsbG9jfQotcGFja2FnZS4gCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdm9pZCAqbW1hbGxvY19hdHRhY2ggKGludCBAdmFye2ZkfSwgdm9pZCAqQHZhcntiYXNlYWRkcn0pOwotSW5pdGlhbGl6ZSBhY2Nlc3MgdG8gYSBAY29kZXttbWFsbG9jfSBtYW5hZ2VkIHJlZ2lvbi4KLQotSWYgQHZhcntmZH0gaXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IgZm9yIGFuIG9wZW4gZmlsZSwgdGhlbiBkYXRhIGZvciB0aGUKLUBjb2Rle21tYWxsb2N9IG1hbmFnZWQgcmVnaW9uIGlzIG1hcHBlZCB0byB0aGF0IGZpbGUuICAgT3RoZXJ3aXNlCi1AZmlsZXsvZGV2L3plcm99IGlzIHVzZWQgYW5kIHRoZSBkYXRhIHdpbGwgbm90IGV4aXN0IGluIGFueSBmaWxlc3lzdGVtIG9iamVjdC4KLQotSWYgdGhlIG9wZW4gZmlsZSBjb3JyZXNwb25kaW5nIHRvIEB2YXJ7ZmR9IGlzIGZyb20gYSBwcmV2aW91cyB1c2Ugb2YKLUBjb2Rle21tYWxsb2N9IGFuZCBwYXNzZXMgc29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGl0IGlzCi1jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgQGNvZGV7bW1hbGxvY30gcGFja2FnZSwgdGhlbiBpdHMgZGF0YSBpcwotbWFwcGVkIGluIGFuZCBpcyBpbW1lZGlhdGVseSBhY2Nlc3NpYmxlIGF0IHRoZSBzYW1lIGFkZHJlc3NlcyBpbgotdGhlIGN1cnJlbnQgcHJvY2VzcyBhcyB0aGUgcHJvY2VzcyB0aGF0IGNyZWF0ZWQgdGhlIGZpbGUuCi0KLUlmIEB2YXJ7YmFzZWFkZHJ9IGlzIG5vdCBAY29kZXtOVUxMfSwgdGhlIG1hcHBpbmcgaXMgZXN0YWJsaXNoZWQKLXN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBpbiB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiAgSWYKLUB2YXJ7YmFzZWFkZHJ9IGlzIEBjb2Rle05VTEx9LCB0aGUgQGNvZGV7bW1hbGxvY30gcGFja2FnZSBjaG9vc2VzIGEKLXN1aXRhYmxlIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RhcnQgdGhlIG1hcHBlZCByZWdpb24sIHdoaWNoIHdpbGwgYmUgdGhlCi12YWx1ZSBvZiB0aGUgcHJldmlvdXMgbWFwcGluZyBpZiBvcGVuaW5nIGFuIGV4aXN0aW5nIGZpbGUgd2hpY2ggd2FzCi1wcmV2aW91c2x5IGJ1aWx0IGJ5IEBjb2Rle21tYWxsb2N9LCBvciBmb3IgbmV3IGZpbGVzIHdpbGwgYmUgYSB2YWx1ZQotY2hvc2VuIGJ5IEBjb2Rle21tYXB9LgotCi1TcGVjaWZ5aW5nIEB2YXJ7YmFzZWFkZHJ9IHByb3ZpZGVzIG1vcmUgY29udHJvbCBvdmVyIHdoZXJlIHRoZSByZWdpb25zCi1zdGFydCBhbmQgaG93IGJpZyB0aGV5IGNhbiBiZSBiZWZvcmUgYnVtcGluZyBpbnRvIGV4aXN0aW5nIG1hcHBlZAotcmVnaW9ucyBvciBmdXR1cmUgbWFwcGVkIHJlZ2lvbnMuCi0KLU9uIHN1Y2Nlc3MsIHJldHVybnMgYSBtYWxsb2MgZGVzY3JpcHRvciB3aGljaCBpcyB1c2VkIGluIHN1YnNlcXVlbnQKLWNhbGxzIHRvIG90aGVyIEBjb2Rle21tYWxsb2N9IHBhY2thZ2UgZnVuY3Rpb25zLiAgSXQgaXMgZXhwbGljaXRseQotQHNhbXB7dm9pZCAqfSAoQHNhbXB7Y2hhciAqfSBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGZ1bGx5IHN1cHBvcnQKLUBjb2Rle3ZvaWR9KSBzbyB0aGF0IHVzZXJzIG9mIHRoZSBwYWNrYWdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlCi1hY3R1YWwgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KLQotT24gZmFpbHVyZSByZXR1cm5zIEBjb2Rle05VTEx9LgotCi1AaXRlbSB2b2lkICptbWFsbG9jX2RldGFjaCAodm9pZCAqQHZhcnttZH0pOwotVGVybWluYXRlIGFjY2VzcyB0byBhIEBjb2Rle21tYWxsb2N9IG1hbmFnZWQgcmVnaW9uIGlkZW50aWZpZWQgYnkgdGhlCi1kZXNjcmlwdG9yIEB2YXJ7bWR9LCBieSBjbG9zaW5nIHRoZSBiYXNlIGZpbGUgYW5kIHVubWFwcGluZyBhbGwgbWVtb3J5Ci1wYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lvbi4gCi0KLVJldHVybnMgQGNvZGV7TlVMTH0gb24gc3VjY2Vzcy4KLQotUmV0dXJucyB0aGUgbWFsbG9jIGRlc2NyaXB0b3Igb24gZmFpbHVyZSwgd2hpY2ggY2FuIHN1YnNlcXVlbnRseQotYmUgdXNlZCBmb3IgZnVydGhlciBhY3Rpb24gKHN1Y2ggYXMgb2J0YWluaW5nIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZSBuYXR1cmUgb2YgdGhlIGZhaWx1cmUpLgotCi1AaXRlbSB2b2lkICptbWFsbG9jICh2b2lkICpAdmFye21kfSwgc2l6ZV90IEB2YXJ7c2l6ZX0pOwotR2l2ZW4gYW4gQGNvZGV7bW1hbGxvY30gZGVzY3JpcHRvciBAdmFye21kfSwgYWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnkgb2YKLUB2YXJ7c2l6ZX0gYnl0ZXMgaW4gdGhlIGFzc29jaWF0ZWQgbWFwcGVkIHJlZ2lvbi4KLQotQGl0ZW0gKm1yZWFsbG9jICh2b2lkICpAdmFye21kfSwgdm9pZCAqQHZhcntwdHJ9LCBzaXplX3QgQHZhcntzaXplfSk7Ci1HaXZlbiBhbiBAY29kZXttbWFsbG9jfSBkZXNjcmlwdG9yIEB2YXJ7bWR9IGFuZCBhIHBvaW50ZXIgdG8gbWVtb3J5Ci1wcmV2aW91c2x5IGFsbG9jYXRlZCBieSBAY29kZXttbWFsbG9jfSBpbiBAdmFye3B0cn0sIHJlYWxsb2NhdGUgdGhlCi1tZW1vcnkgdG8gYmUgQHZhcntzaXplfSBieXRlcyBsb25nLCBwb3NzaWJseSBtb3ZpbmcgdGhlIGV4aXN0aW5nCi1jb250ZW50cyBvZiBtZW1vcnkgaWYgbmVjZXNzYXJ5LgotCQotQGl0ZW0gdm9pZCAqbXZhbGxvYyAodm9pZCAqQHZhcnttZH0sIHNpemVfdCBAdmFye3NpemV9KTsKLUxpa2UgQGNvZGV7bW1hbGxvY30gYnV0IHRoZSByZXN1bHRpbmcgbWVtb3J5IGlzIGFsaWduZWQgb24gYSBwYWdlIGJvdW5kYXJ5LgotCi1AaXRlbSB2b2lkIG1mcmVlICh2b2lkICpAdmFye21kfSwgdm9pZCAqQHZhcntwdHJ9KTsKLUdpdmVuIGFuIEBjb2Rle21tYWxsb2N9IGRlc2NyaXB0b3IgQHZhcnttZH0gYW5kIGEgcG9pbnRlciB0byBtZW1vcnkgcHJldmlvdXNseQotYWxsb2NhdGVkIGJ5IEBjb2Rle21tYWxsb2N9IGluIEB2YXJ7cHRyfSwgZnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5LgotCi1AaXRlbSBpbnQgbW1hbGxvY19lcnJubyAodm9pZCAqQHZhcnttZH0pOwotR2l2ZW4gYSBAY29kZXttbWFsbG9jfSBkZXNjcmlwdG9yLCBpZiB0aGUgbGFzdCBAY29kZXttbWFsbG9jfSBvcGVyYXRpb24KLWZhaWxlZCBmb3Igc29tZSByZWFzb24gZHVlIHRvIGEgc3lzdGVtIGNhbGwgZmFpbHVyZSwgdGhlbgotcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBAY29kZXtlcnJub30uICBSZXR1cm5zIDAgb3RoZXJ3aXNlLgotKFRoaXMgZnVuY3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCkuCi1AZW5kIHRhYmxlCi0KLUBieWUKZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1hcC1zdXAuYyBiL21tYWxsb2MvbW1hcC1zdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxNDZlMi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL21tYXAtc3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgYW4gc2Jyay1saWtlIGZ1bmN0aW9uIHRoYXQgdXNlcyBtbWFwLgotICAgQ29weXJpZ2h0IDE5OTIsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gICBmbmZAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiBkZWZpbmVkKEhBVkVfTU1BUCkKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4JLyogUHJvdG90eXBlcyBmb3IgbHNlZWsgKi8KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAibW1wcml2YXRlLmgiCi0KLS8qIENhY2hlIHRoZSBwYWdlc2l6ZSBmb3IgdGhlIGN1cnJlbnQgaG9zdCBtYWNoaW5lLiAgTm90ZSB0aGF0IGlmIHRoZSBob3N0Ci0gICBkb2VzIG5vdCByZWFkaWx5IHByb3ZpZGUgYSBnZXRwYWdlc2l6ZSgpIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGVtdWxhdGUgaXQKLSAgIGVsc2V3aGVyZSwgbm90IGNsdXR0ZXIgdXAgdGhpcyBmaWxlIHdpdGggbG90cyBvZiBrbHVnZXMgdG8gdHJ5IHRvIGZpZ3VyZQotICAgaXQgb3V0LiAqLwotCi1zdGF0aWMgc2l6ZV90IHBhZ2VzaXplOwotI2lmIE5FRURfREVDTEFSQVRJT05fR0VUUEFHRVNJWkUKLWV4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgUEFHRV9BTElHTihhZGRyKSAoY2FkZHJfdCkgKCgobG9uZykoYWRkcikgKyBwYWdlc2l6ZSAtIDEpICYgXAotCQkJCSAgICB+KHBhZ2VzaXplIC0gMSkpCi0KLS8qICBHZXQgY29yZSBmb3IgdGhlIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGJ5IE1EUCwgdXNpbmcgU0laRSBhcyB0aGUKLSAgICBhbW91bnQgdG8gZWl0aGVyIGFkZCB0byBvciBzdWJ0cmFjdCBmcm9tIHRoZSBleGlzdGluZyByZWdpb24uICBXb3JrcwotICAgIGxpa2Ugc2JyaygpLCBidXQgdXNpbmcgbW1hcCgpLiAqLwotCi1QVFIKLV9fbW1hbGxvY19tbWFwX21vcmVjb3JlIChtZHAsIHNpemUpCi0gIHN0cnVjdCBtZGVzYyAqbWRwOwotICBpbnQgc2l6ZTsKLXsKLSAgUFRSIHJlc3VsdCA9IE5VTEw7Ci0gIG9mZl90IGZvZmZzZXQ7CS8qIEZpbGUgb2Zmc2V0IGF0IHdoaWNoIG5ldyBtYXBwaW5nIHdpbGwgc3RhcnQgKi8KLSAgc2l6ZV90IG1hcGJ5dGVzOwkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gbWFwICovCi0gIGNhZGRyX3QgbW92ZXRvOwkvKiBBZGRyZXNzIHdoZXJlIHdlIHdpc2ggdG8gbW92ZSAiYnJlYWsgdmFsdWUiIHRvICovCi0gIGNhZGRyX3QgbWFwdG87CS8qIEFkZHJlc3Mgd2UgYWN0dWFsbHkgbWFwcGVkIHRvICovCi0gIGNoYXIgYnVmID0gMDsJCS8qIFNpbmdsZSBieXRlIHRvIHdyaXRlIHRvIGV4dGVuZCBtYXBwZWQgZmlsZSAqLwotCi0gIGlmIChwYWdlc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEp1c3QgcmV0dXJuIHRoZSBjdXJyZW50ICJicmVhayIgdmFsdWUuICovCi0gICAgICByZXN1bHQgPSBtZHAgLT4gYnJlYWt2YWw7Ci0gICAgfQotICBlbHNlIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZGVhbGxvY2F0aW5nIG1lbW9yeS4gIElmIHRoZSBhbW91bnQgcmVxdWVzdGVkIHdvdWxkIGNhdXNlCi0JIHVzIHRvIHRyeSB0byBkZWFsbG9jYXRlIGJhY2sgcGFzdCB0aGUgYmFzZSBvZiB0aGUgbW1hcCdkIHJlZ2lvbgotCSB0aGVuIGRvIG5vdGhpbmcsIGFuZCByZXR1cm4gTlVMTC4gIE90aGVyd2lzZSwgZGVhbGxvY2F0ZSB0aGUKLQkgbWVtb3J5IGFuZCByZXR1cm4gdGhlIG9sZCBicmVhayB2YWx1ZS4gKi8KLSAgICAgIGlmIChtZHAgLT4gYnJlYWt2YWwgKyBzaXplID49IG1kcCAtPiBiYXNlKQotCXsKLQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKLQkgIG1kcCAtPiBicmVha3ZhbCArPSBzaXplOwotCSAgbW92ZXRvID0gUEFHRV9BTElHTiAobWRwIC0+IGJyZWFrdmFsKTsKLQkgIG11bm1hcCAobW92ZXRvLCAoc2l6ZV90KSAobWRwIC0+IHRvcCAtIG1vdmV0bykpOwotCSAgbWRwIC0+IHRvcCA9IG1vdmV0bzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgYXJlIGFsbG9jYXRpbmcgbWVtb3J5LiAgTWFrZSBzdXJlIHdlIGhhdmUgYW4gb3BlbiBmaWxlCi0JIGRlc2NyaXB0b3IgYW5kIHRoZW4gZ28gb24gdG8gZ2V0IHRoZSBtZW1vcnkuICovCi0gICAgICBpZiAobWRwIC0+IGZkIDwgMCkKLQl7Ci0JICByZXN1bHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UgaWYgKG1kcCAtPiBicmVha3ZhbCArIHNpemUgPiBtZHAgLT4gdG9wKQotCXsKLQkgIC8qIFRoZSByZXF1ZXN0IHdvdWxkIG1vdmUgdXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50bHkKLQkgICAgIG1hcHBlZCBtZW1vcnksIHNvIG1hcCBpbiBlbm91Z2ggbW9yZSBtZW1vcnkgdG8gc2F0aXNmeQotCSAgICAgdGhlIHJlcXVlc3QuICBUaGlzIG1lYW5zIHdlIGFsc28gaGF2ZSB0byBncm93IHRoZSBtYXBwZWQtdG8KLQkgICAgIGZpbGUgYnkgYW4gYXBwcm9wcmlhdGUgYW1vdW50LCBzaW5jZSBtbWFwIGNhbm5vdCBiZSB1c2VkCi0JICAgICB0byBleHRlbmQgYSBmaWxlLiAqLwotCSAgbW92ZXRvID0gUEFHRV9BTElHTiAobWRwIC0+IGJyZWFrdmFsICsgc2l6ZSk7Ci0JICBtYXBieXRlcyA9IG1vdmV0byAtIG1kcCAtPiB0b3A7Ci0JICBmb2Zmc2V0ID0gbWRwIC0+IHRvcCAtIG1kcCAtPiBiYXNlOwotCSAgLyogRklYTUU6ICBUZXN0IHJlc3VsdHMgb2YgbHNlZWsoKSBhbmQgd3JpdGUoKSAqLwotCSAgbHNlZWsgKG1kcCAtPiBmZCwgZm9mZnNldCArIG1hcGJ5dGVzIC0gMSwgU0VFS19TRVQpOwotCSAgd3JpdGUgKG1kcCAtPiBmZCwgJmJ1ZiwgMSk7Ci0JICBpZiAobWRwIC0+IGJhc2UgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIExldCBtbWFwIHBpY2sgdGhlIG1hcCBzdGFydCBhZGRyZXNzICovCi0JICAgICAgbWFwdG8gPSBtbWFwICgwLCBtYXBieXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICBNQVBfU0hBUkVELCBtZHAgLT4gZmQsIGZvZmZzZXQpOwotCSAgICAgIGlmIChtYXB0byAhPSAoY2FkZHJfdCkgLTEpCi0JCXsKLQkJICBtZHAgLT4gYmFzZSA9IG1kcCAtPiBicmVha3ZhbCA9IG1hcHRvOwotCQkgIG1kcCAtPiB0b3AgPSBtZHAgLT4gYmFzZSArIG1hcGJ5dGVzOwotCQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKLQkJICBtZHAgLT4gYnJlYWt2YWwgKz0gc2l6ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYXB0byA9IG1tYXAgKG1kcCAtPiB0b3AsIG1hcGJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJICAgIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsIG1kcCAtPiBmZCwgZm9mZnNldCk7Ci0JICAgICAgaWYgKG1hcHRvID09IG1kcCAtPiB0b3ApCi0JCXsKLQkJICBtZHAgLT4gdG9wID0gbW92ZXRvOwotCQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKLQkJICBtZHAgLT4gYnJlYWt2YWwgKz0gc2l6ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKLQkgIG1kcCAtPiBicmVha3ZhbCArPSBzaXplOwotCX0KLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotUFRSCi1fX21tYWxsb2NfcmVtYXBfY29yZSAobWRwKQotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLXsKLSAgY2FkZHJfdCBiYXNlOwotCi0gIC8qIEZJWE1FOiAgUXVpY2sgaGFjaywgbmVlZHMgZXJyb3IgY2hlY2tpbmcgYW5kIG90aGVyIGF0dGVudGlvbi4gKi8KLQotICBiYXNlID0gbW1hcCAobWRwIC0+IGJhc2UsIG1kcCAtPiB0b3AgLSBtZHAgLT4gYmFzZSwKLQkgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKLQkgICAgICAgbWRwIC0+IGZkLCAwKTsKLSAgcmV0dXJuICgoUFRSKSBiYXNlKTsKLX0KLQotUFRSCi1tbWFsbG9jX2ZpbmRiYXNlIChzaXplKQotICBpbnQgc2l6ZTsKLXsKLSAgaW50IGZkOwotICBpbnQgZmxhZ3M7Ci0gIGNhZGRyX3QgYmFzZSA9IE5VTEw7Ci0KLSNpZmRlZiBNQVBfQU5PTllNT1VTCi0gIGZsYWdzID0gTUFQX1NIQVJFRCB8IE1BUF9BTk9OWU1PVVM7Ci0gIGZkID0gLTE7Ci0jZWxzZQotI2lmZGVmIE1BUF9GSUxFCi0gIGZsYWdzID0gTUFQX1NIQVJFRCB8IE1BUF9GSUxFOwotI2Vsc2UKLSAgZmxhZ3MgPSBNQVBfU0hBUkVEOwotI2VuZGlmCi0gIGZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gIGlmIChmZCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChQVFIpIE5VTEwpOwotICAgIH0KLSNlbmRpZgotICBiYXNlID0gbW1hcCAoMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgZmxhZ3MsIGZkLCAwKTsKLSAgaWYgKGJhc2UgIT0gKGNhZGRyX3QpIC0xKQotICAgIHsKLSAgICAgIG11bm1hcCAoYmFzZSwgKHNpemVfdCkgc2l6ZSk7Ci0gICAgfQotICBpZiAoZmQgIT0gLTEpCi0gICAgewotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0gIGlmIChiYXNlID09IDApCi0gICAgewotICAgICAgLyogRG9uJ3QgYWxsb3cgbWFwcGluZyBhdCBhZGRyZXNzIHplcm8uICBXZSB1c2UgdGhhdCB2YWx1ZQotCSB0byBzaWduYWwgYW4gZXJyb3IgcmV0dXJuLCBhbmQgYmVzaWRlcywgaXQgaXMgdXNlZnVsIHRvCi0JIGNhdGNoIE5VTEwgcG9pbnRlcnMgaWYgaXQgaXMgdW5tYXBwZWQuICBJbnN0ZWFkIHN0YXJ0Ci0JIGF0IHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkuICovCi0gICAgICBiYXNlID0gKGNhZGRyX3QpIGdldHBhZ2VzaXplICgpOwotICAgIH0KLSAgZWxzZSBpZiAoYmFzZSA9PSAoY2FkZHJfdCkgLTEpCi0gICAgewotICAgICAgYmFzZSA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gKChQVFIpIGJhc2UpOwotfQotCi0jZWxzZQkvKiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KLS8qIFByZXZlbnQgImVtcHR5IHRyYW5zbGF0aW9uIHVuaXQiIHdhcm5pbmdzIGZyb20gdGhlIGlkaW90cyBhdCBYM0oxMS4gKi8KLXN0YXRpYyBjaGFyIGFuc2lfY19pZGlvdHMgPSA2OTsKLSNlbmRpZgkvKiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1jaGVjay5jIGIvbW1hbGxvYy9tbWNoZWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTM2YjMuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9tbWNoZWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyogU3RhbmRhcmQgZGVidWdnaW5nIGhvb2tzIGZvciBgbW1hbGxvYycuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgV3JpdHRlbiBNYXkgMTk4OSBieSBNaWtlIEhhZXJ0ZWwuCi0gICBIZWF2aWx5IG1vZGlmaWVkIE1hciAxOTkyIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIChFbWFpbCkgYXQgdGhlIGFkZHJlc3MgbWlrZUBhaS5taXQuZWR1LAotIG9yIChVUyBtYWlsKSBhcyBNaWtlIEhhZXJ0ZWwgYy9vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi0vKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzb21ldGhpbmcgYXdmdWwgaGFwcGVucy4gIFRoZSBhcHBsaWNhdGlvbgotICAgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbnN0ZWFkIChhbmQgcHJvYmFibHkgd2lsbAotICAgd2FudCB0bykuICovCi0KLWV4dGVybiB2b2lkIGFib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQXJiaXRyYXJ5IG1hZ2ljYWwgbnVtYmVycy4gICovCi0KLSNkZWZpbmUgTUFHSUNXT1JECSh1bnNpZ25lZCBpbnQpIDB4ZmVkYWJlZWIJLyogQWN0aXZlIGNodW5rICovCi0jZGVmaW5lIE1BR0lDV09SREZSRUUJKHVuc2lnbmVkIGludCkgMHhkZWFkYmVlZgkvKiBJbmFjdGl2ZSBjaHVuayAqLwotI2RlZmluZSBNQUdJQ0JZVEUJKChjaGFyKSAweGQ3KQotCi0vKiBFYWNoIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGJvdW5kZWQgYnkgYSBoZWFkZXIgc3RydWN0dXJlIGFuZCBhIHRyYWlsZXIKLSAgIGJ5dGUuICBJLkUuCi0KLQk8c2l6ZT48bWFnaWN3b3JkPjx1c2VyJ3MgYWxsb2NhdGlvbj48bWFnaWNieXRlPgotCi0gICBUaGUgcG9pbnRlciByZXR1cm5lZCB0byB0aGUgdXNlciBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgaW4gdGhlCi0gICB1c2VyJ3MgYWxsb2NhdGlvbiBhcmVhLiAgVGhlIG1hZ2ljIHdvcmQgY2FuIGJlIHRlc3RlZCB0byBkZXRlY3QKLSAgIGJ1ZmZlciB1bmRlcnJ1bnMgYW5kIHRoZSBtYWdpYyBieXRlIGNhbiBiZSB0ZXN0ZWQgdG8gZGV0ZWN0IG92ZXJydW5zLiAqLwotCi1zdHJ1Y3QgaGRyCi0gIHsKLSAgICBzaXplX3Qgc2l6ZTsJCS8qIEV4YWN0IHNpemUgcmVxdWVzdGVkIGJ5IHVzZXIuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hZ2ljOwkvKiBNYWdpYyBudW1iZXIgdG8gY2hlY2sgaGVhZGVyIGludGVncml0eS4gICovCi0gIH07Ci0KLXN0YXRpYyB2b2lkIGNoZWNraGRyIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBDT05TVCBzdHJ1Y3QgaGRyICopKTsKLXN0YXRpYyB2b2lkIG1mcmVlX2NoZWNrIFBBUkFNUyAoKFBUUiwgUFRSKSk7Ci1zdGF0aWMgUFRSIG1tYWxsb2NfY2hlY2sgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLXN0YXRpYyBQVFIgbXJlYWxsb2NfY2hlY2sgUEFSQU1TICgoUFRSLCBQVFIsIHNpemVfdCkpOwotCi0vKiBDaGVjayB0aGUgbWFnaWN3b3JkIGFuZCBtYWdpY2J5dGUsIGFuZCBpZiBlaXRoZXIgaXMgY29ycnVwdGVkIHRoZW4KLSAgIGNhbGwgdGhlIGVtZXJnZW5jeSBhYm9ydCBmdW5jdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBoZWFwIGluIHVzZS4gKi8KLQotc3RhdGljIHZvaWQKLWNoZWNraGRyIChtZHAsIGhkcikKLSAgc3RydWN0IG1kZXNjICptZHA7Ci0gIENPTlNUIHN0cnVjdCBoZHIgKmhkcjsKLXsKLSAgaWYgKGhkciAtPiBtYWdpYyAhPSBNQUdJQ1dPUkQgfHwKLSAgICAgICgoY2hhciAqKSAmaGRyWzFdKVtoZHIgLT4gc2l6ZV0gIT0gTUFHSUNCWVRFKQotICAgIHsKLSAgICAgICgqbWRwIC0+IGFib3J0ZnVuYykoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZnJlZV9jaGVjayAobWQsIHB0cikKLSAgUFRSIG1kOwotICBQVFIgcHRyOwotewotICBzdHJ1Y3QgaGRyICpoZHIgPSAoKHN0cnVjdCBoZHIgKikgcHRyKSAtIDE7Ci0gIHN0cnVjdCBtZGVzYyAqbWRwOwotCi0gIG1kcCA9IE1EX1RPX01EUCAobWQpOwotICBjaGVja2hkciAobWRwLCBoZHIpOwotICBoZHIgLT4gbWFnaWMgPSBNQUdJQ1dPUkRGUkVFOwotICBtZHAgLT4gbWZyZWVfaG9vayA9IE5VTEw7Ci0gIG1mcmVlIChtZCwgKFBUUiloZHIpOwotICBtZHAgLT4gbWZyZWVfaG9vayA9IG1mcmVlX2NoZWNrOwotfQotCi1zdGF0aWMgUFRSCi1tbWFsbG9jX2NoZWNrIChtZCwgc2l6ZSkKLSAgUFRSIG1kOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgc3RydWN0IGhkciAqaGRyOwotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgc2l6ZV90IG5ieXRlczsKLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLSAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IE5VTEw7Ci0gIG5ieXRlcyA9IHNpemVvZiAoc3RydWN0IGhkcikgKyBzaXplICsgMTsKLSAgaGRyID0gKHN0cnVjdCBoZHIgKikgbW1hbGxvYyAobWQsIG5ieXRlcyk7Ci0gIG1kcCAtPiBtbWFsbG9jX2hvb2sgPSBtbWFsbG9jX2NoZWNrOwotICBpZiAoaGRyICE9IE5VTEwpCi0gICAgewotICAgICAgaGRyIC0+IHNpemUgPSBzaXplOwotICAgICAgaGRyIC0+IG1hZ2ljID0gTUFHSUNXT1JEOwotICAgICAgaGRyKys7Ci0gICAgICAqKChjaGFyICopIGhkciArIHNpemUpID0gTUFHSUNCWVRFOwotICAgIH0KLSAgcmV0dXJuICgoUFRSKSBoZHIpOwotfQotCi1zdGF0aWMgUFRSCi1tcmVhbGxvY19jaGVjayAobWQsIHB0ciwgc2l6ZSkKLSAgUFRSIG1kOwotICBQVFIgcHRyOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgc3RydWN0IGhkciAqaGRyID0gKChzdHJ1Y3QgaGRyICopIHB0cikgLSAxOwotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgc2l6ZV90IG5ieXRlczsKLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLSAgY2hlY2toZHIgKG1kcCwgaGRyKTsKLSAgbWRwIC0+IG1mcmVlX2hvb2sgPSBOVUxMOwotICBtZHAgLT4gbW1hbGxvY19ob29rID0gTlVMTDsKLSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSBOVUxMOwotICBuYnl0ZXMgPSBzaXplb2YgKHN0cnVjdCBoZHIpICsgc2l6ZSArIDE7Ci0gIGhkciA9IChzdHJ1Y3QgaGRyICopIG1yZWFsbG9jIChtZCwgKFBUUikgaGRyLCBuYnl0ZXMpOwotICBtZHAgLT4gbWZyZWVfaG9vayA9IG1mcmVlX2NoZWNrOwotICBtZHAgLT4gbW1hbGxvY19ob29rID0gbW1hbGxvY19jaGVjazsKLSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSBtcmVhbGxvY19jaGVjazsKLSAgaWYgKGhkciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGhkciAtPiBzaXplID0gc2l6ZTsKLSAgICAgIGhkcisrOwotICAgICAgKigoY2hhciAqKSBoZHIgKyBzaXplKSA9IE1BR0lDQllURTsKLSAgICB9Ci0gIHJldHVybiAoKFBUUikgaGRyKTsKLX0KLQotLyogVHVybiBvbiBkZWZhdWx0IGNoZWNraW5nIGZvciBtbWFsbG9jL21yZWFsbG9jL21mcmVlLCBmb3IgdGhlIGhlYXAgc3BlY2lmaWVkCi0gICBieSBNRC4gIElmIEZVTkMgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdG8gY2FsbAotICAgdG8gYWJvcnQgd2hlbmV2ZXIgbWVtb3J5IGNvcnJ1cHRpb24gaXMgZGV0ZWN0ZWQuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZQotICAgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiBhYm9ydCgpLgotCi0gICBOb3RlIHRoYXQgd2UgZGlzYWxsb3cgaW5zdGFsbGF0aW9uIG9mIGluaXRpYWwgY2hlY2tpbmcgaG9va3MgaWYgbW1hbGxvYwotICAgaGFzIGJlZW4gY2FsbGVkIGF0IGFueSB0aW1lIGZvciB0aGlzIHBhcnRpY3VsYXIgaGVhcCwgc2luY2UgaWYgYW55IHJlZ2lvbgotICAgdGhhdCBpcyBhbGxvY2F0ZWQgcHJpb3IgdG8gaW5zdGFsbGF0aW9uIG9mIHRoZSBob29rcyBpcyBzdWJzZXF1ZW50bHkKLSAgIHJlYWxsb2NhdGVkIG9yIGZyZWVkIGFmdGVyIGluc3RhbGxhdGlvbiBvZiB0aGUgaG9va3MsIGl0IGlzIGd1YXJhbnRlZWQKLSAgIHRvIHRyaWdnZXIgYSBtZW1vcnkgY29ycnVwdGlvbiBlcnJvci4gIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmcgdGhlIHN0YXRlCi0gICBvZiB0aGUgTU1BTExPQ19JTklUSUFMSVpFRCBmbGFnLiAgSWYgdGhlIEZPUkNFIGFyZ3VtZW50IGlzIG5vbi16ZXJvLCB0aGlzCi0gICBjaGVja2luZyBpcyBkaXNhYmxlZCBhbmQgaXQgaXMgYWxsb3dlZCB0byBpbnN0YWxsIHRoZSBjaGVja2luZyBob29rcyBhdCBhbnkKLSAgIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBvbiBzeXN0ZW1zIHdoZXJlIHRoZSBDIHJ1bnRpbWUgbWFrZXMgb25lIG9yIG1vcmUKLSAgIG1hbGxvYyBjYWxscyBiZWZvcmUgdGhlIHVzZXIgY29kZSBoYWQgYSBjaGFuY2UgdG8gY2FsbCBtbWNoZWNrIG9yIG1tY2hlY2tmLAotICAgYnV0IG5ldmVyIGNhbGxzIGZyZWUgd2l0aCB0aGVzZSB2YWx1ZXMuICBUaHVzIGlmIHdlIGFyZSBjZXJ0YWluIHRoYXQgb25seQotICAgdmFsdWVzIG9idGFpbmVkIGZyb20gbWFsbG9jcyBhZnRlciBhbiBtbWNoZWNrL21tY2hlY2tmIHdpbGwgZXZlciBiZSBwYXNzZWQKLSAgIHRvIGZyZWUoKSwgd2UgY2FuIGdvIGFoZWFkIGFuZCBmb3JjZSBpbnN0YWxsYXRpb24gb2YgdGhlIHVzZWZ1bCBjaGVja2luZwotICAgaG9va3MuCi0KLSAgIEhvd2V2ZXIsIHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwKLSAgIHRvIHVwZGF0ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIGNoZWNraW5nIHJvdXRpbmVzIGFuZCB0byB0aGUKLSAgIHVzZXIgZGVmaW5lZCBjb3JydXB0aW9uIGhhbmRsZXIgcm91dGluZSwgYXMgbG9uZyBhcyB0aGVzZSBmdW5jdGlvbiBwb2ludGVycwotICAgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZXh0YWJsaXNoZWQgYnkgdGhlIGluaXRpYWwgY2FsbC4gIE5vdGUgdGhhdCB3ZQotICAgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gcmVtYXBwaW5nIGEgcHJldmlvdXNseSB1c2VkIGhlYXAsIHRvIGVuc3VyZQotICAgdGhhdCB0aGUgaG9va3MgZ2V0IHVwZGF0ZWQgdG8gdGhlIGNvcnJlY3QgdmFsdWVzLCBhbHRob3VnaCB0aGUgY29ycnVwdGlvbgotICAgaGFuZGxlciBwb2ludGVyIGdldHMgc2V0IGJhY2sgdG8gdGhlIGRlZmF1bHQuICBUaGUgYXBwbGljYXRpb24gY2FuIHRoZW4KLSAgIGNhbGwgbW1jaGVjayB0byB1c2UgYSBkaWZmZXJlbnQgY29ycnVwdGlvbiBoYW5kbGVyIGlmIGRlc2lyZWQuCi0KLSAgIFJldHVybnMgbm9uLXplcm8gaWYgY2hlY2tpbmcgaXMgc3VjY2Vzc2Z1bGx5IGVuYWJsZWQsIHplcm8gb3RoZXJ3aXNlLiAqLwotCi1pbnQKLW1tY2hlY2tmIChtZCwgZnVuYywgZm9yY2UpCi0gIFBUUiBtZDsKLSAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKHZvaWQpKTsKLSAgaW50IGZvcmNlOwotewotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgaW50IHJ0bnZhbDsKLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLQotICAvKiBXZSBjYW4gc2FmZWx5IHNldCBvciB1cGRhdGUgdGhlIGFib3J0IGZ1bmN0aW9uIGF0IGFueSB0aW1lLCByZWdhcmRsZXNzCi0gICAgIG9mIHdoZXRoZXIgb3Igbm90IHdlIHN1Y2Nlc3NmdWxseSBkbyBhbnl0aGluZyBlbHNlLiAqLwotCi0gIG1kcCAtPiBhYm9ydGZ1bmMgPSAoZnVuYyAhPSBOVUxMID8gZnVuYyA6IGFib3J0KTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IHlldCBjYWxsZWQgbW1hbGxvYyB0aGUgZmlyc3QgdGltZSBmb3IgdGhpcyBoZWFwLCBvciBpZiB3ZQotICAgICBoYXZlIGhvb2tzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGluc3RhbGxlZCwgdGhlbiBhbGxvdyB0aGUgaG9va3MgdG8gYmUKLSAgICAgaW5pdGlhbGl6ZWQgb3IgdXBkYXRlZC4gKi8KLQotICBpZiAoZm9yY2UgfHwKLSAgICAgICEobWRwIC0+IGZsYWdzICYgTU1BTExPQ19JTklUSUFMSVpFRCkgfHwKLSAgICAgIChtZHAgLT4gbWZyZWVfaG9vayAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBtZHAgLT4gbWZyZWVfaG9vayA9IG1mcmVlX2NoZWNrOwotICAgICAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IG1tYWxsb2NfY2hlY2s7Ci0gICAgICBtZHAgLT4gbXJlYWxsb2NfaG9vayA9IG1yZWFsbG9jX2NoZWNrOwotICAgICAgbWRwIC0+IGZsYWdzIHw9IE1NQUxMT0NfTU1DSEVDS19VU0VEOwotICAgICAgcnRudmFsID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBydG52YWwgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwgaW4gY2FzZSB0aGVyZSBhcmUKLSAgIHN0aWxsIGNhbGxlcnMgdG8gdGhlIG9yaWdpbmFsIG1tY2hlY2sgZnVuY3Rpb24uICovCi0KLWludAotbW1jaGVjayAobWQsIGZ1bmMpCi0gIFBUUiBtZDsKLSAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKHZvaWQpKTsKLXsKLSAgaW50IHJ0bnZhbDsKLQotICBydG52YWwgPSBtbWNoZWNrZiAobWQsIGZ1bmMsIDApOwotICByZXR1cm4gKHJ0bnZhbCk7Ci19CmRpZmYgLS1naXQgYS9tbWFsbG9jL21tZW1hbGlnbi5jIGIvbW1hbGxvYy9tbWVtYWxpZ24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkYTAyNy4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL21tZW1hbGlnbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibW1wcml2YXRlLmgiCi0KLVBUUgotbW1lbWFsaWduIChtZCwgYWxpZ25tZW50LCBzaXplKQotICBQVFIgbWQ7Ci0gIHNpemVfdCBhbGlnbm1lbnQ7Ci0gIHNpemVfdCBzaXplOwotewotICBQVFIgcmVzdWx0OwotICB1bnNpZ25lZCBsb25nIGludCBhZGo7Ci0gIHN0cnVjdCBhbGlnbmxpc3QgKmw7Ci0gIHN0cnVjdCBtZGVzYyAqbWRwOwotCi0gIGlmICgocmVzdWx0ID0gbW1hbGxvYyAobWQsIHNpemUgKyBhbGlnbm1lbnQgLSAxKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhZGogPSBSRVNJRFVBTCAocmVzdWx0LCBhbGlnbm1lbnQpOwotICAgICAgaWYgKGFkaiAhPSAwKQotCXsKLQkgIG1kcCA9IE1EX1RPX01EUCAobWQpOwotCSAgZm9yIChsID0gbWRwIC0+IGFsaWduZWRfYmxvY2tzOyBsICE9IE5VTEw7IGwgPSBsIC0+IG5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobCAtPiBhbGlnbmVkID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIHNsb3QgaXMgZnJlZS4gIFVzZSBpdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGwgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGwgPSAoc3RydWN0IGFsaWdubGlzdCAqKSBtbWFsbG9jIChtZCwgc2l6ZW9mIChzdHJ1Y3QgYWxpZ25saXN0KSk7Ci0JICAgICAgaWYgKGwgPT0gTlVMTCkKLQkJewotCQkgIG1mcmVlIChtZCwgcmVzdWx0KTsKLQkJICByZXR1cm4gKE5VTEwpOwotCQl9Ci0JICAgICAgbCAtPiBuZXh0ID0gbWRwIC0+IGFsaWduZWRfYmxvY2tzOwotCSAgICAgIG1kcCAtPiBhbGlnbmVkX2Jsb2NrcyA9IGw7Ci0JICAgIH0KLQkgIGwgLT4gZXhhY3QgPSByZXN1bHQ7Ci0JICByZXN1bHQgPSBsIC0+IGFsaWduZWQgPSAoY2hhciAqKSByZXN1bHQgKyBhbGlnbm1lbnQgLSBhZGo7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tbXByaXZhdGUuaCBiL21tYWxsb2MvbW1wcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzYyNjIuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9tbXByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgZm9yIGBtbWFsbG9jJyBhbmQgZnJpZW5kcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBXcml0dGVuIE1heSAxOTg5IGJ5IE1pa2UgSGFlcnRlbC4KLSAgIEhlYXZpbHkgbW9kaWZpZWQgTWFyIDE5OTIgYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCi0gICBvciAoVVMgbWFpbCkgYXMgTWlrZSBIYWVydGVsIGMvbyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICovCi0KLQotI2lmbmRlZiBfX01NUFJJVkFURV9ICi0jZGVmaW5lIF9fTU1QUklWQVRFX0ggMQotCi0jaW5jbHVkZSAibW1hbGxvYy5oIgotCi0jaWZkZWYgSEFWRV9MSU1JVFNfSAotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyAgaWZuZGVmIENIQVJfQklUCi0jICAgIGRlZmluZSBDSEFSX0JJVCA4Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTUlOCi0jICBkZWZpbmUgTUlOKEEsIEIpICgoQSkgPCAoQikgPyAoQSkgOiAoQikpCi0jZW5kaWYKLQotI2RlZmluZSBNTUFMTE9DX01BR0lDCQkibW1hbGxvYyIJLyogTWFwcGVkIGZpbGUgbWFnaWMgbnVtYmVyICovCi0jZGVmaW5lIE1NQUxMT0NfTUFHSUNfU0laRQk4CQkvKiBTaXplIG9mIG1hZ2ljIG51bWJlciBidWYgKi8KLSNkZWZpbmUgTU1BTExPQ19WRVJTSU9OCQkxCQkvKiBDdXJyZW50IG1tYWxsb2MgdmVyc2lvbiAqLwotI2RlZmluZSBNTUFMTE9DX0tFWVMJCTE2CQkvKiBLZXlzIGZvciBhcHBsaWNhdGlvbiB1c2UgKi8KLQotLyogVGhlIGFsbG9jYXRvciBkaXZpZGVzIHRoZSBoZWFwIGludG8gYmxvY2tzIG9mIGZpeGVkIHNpemU7IGxhcmdlCi0gICByZXF1ZXN0cyByZWNlaXZlIG9uZSBvciBtb3JlIHdob2xlIGJsb2NrcywgYW5kIHNtYWxsIHJlcXVlc3RzCi0gICByZWNlaXZlIGEgZnJhZ21lbnQgb2YgYSBibG9jay4gIEZyYWdtZW50IHNpemVzIGFyZSBwb3dlcnMgb2YgdHdvLAotICAgYW5kIGFsbCBmcmFnbWVudHMgb2YgYSBibG9jayBhcmUgdGhlIHNhbWUgc2l6ZS4gIFdoZW4gYWxsIHRoZQotICAgZnJhZ21lbnRzIGluIGEgYmxvY2sgaGF2ZSBiZWVuIGZyZWVkLCB0aGUgYmxvY2sgaXRzZWxmIGlzIGZyZWVkLiAgKi8KLQotI2RlZmluZSBJTlRfQklUCQkoQ0hBUl9CSVQgKiBzaXplb2YoaW50KSkKLSNkZWZpbmUgQkxPQ0tMT0cJKElOVF9CSVQgPiAxNiA/IDEyIDogOSkKLSNkZWZpbmUgQkxPQ0tTSVpFCSgodW5zaWduZWQgaW50KSAxIDw8IEJMT0NLTE9HKQotI2RlZmluZSBCTE9DS0lGWShTSVpFKQkoKChTSVpFKSArIEJMT0NLU0laRSAtIDEpIC8gQkxPQ0tTSVpFKQotCi0vKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVycyBpcyBhIHNpZ25lZCBpbnQuICBPbiBtYWNoaW5lcyB3aGVyZQotICAgdGhlIGRhdGEgYWRkcmVzc2VzIGhhdmUgdGhlIGhpZ2ggYml0IHNldCwgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgIGRpZmZlcmVuY2UgYmVjb21lcyBhbiB1bnNpZ25lZCBpbnQgd2hlbiB3ZSBhcmUgdXNpbmcgdGhlIGFkZHJlc3MgYXMgYW4KLSAgIGludGVncmFsIHZhbHVlLiAgSW4gYWRkaXRpb24sIHdoZW4gdXNpbmcgd2l0aCB0aGUgJyUnIG9wZXJhdG9yLCB0aGUKLSAgIHNpZ24gb2YgdGhlIHJlc3VsdCBpcyBtYWNoaW5lIGRlcGVuZGVudCBmb3IgbmVnYXRpdmUgdmFsdWVzLCBzbyBmb3JjZQotICAgaXQgdG8gYmUgdHJlYXRlZCBhcyBhbiB1bnNpZ25lZCBpbnQuICovCi0KLSNkZWZpbmUgQUREUjJVSU5UKGFkZHIpCSgodW5zaWduZWQgaW50KSAoKGNoYXIgKikgKGFkZHIpIC0gKGNoYXIgKikgTlVMTCkpCi0jZGVmaW5lIFJFU0lEVUFMKGFkZHIsYnNpemUpICgodW5zaWduZWQgaW50KSAoQUREUjJVSU5UIChhZGRyKSAlIChic2l6ZSkpKQotCi0vKiBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBtZW1vcnkgc3Bhbm5lZCBieSB0aGUgaW5pdGlhbCBoZWFwIHRhYmxlCi0gICAobm90IGFuIGFic29sdXRlIGxpbWl0KS4gICovCi0KLSNkZWZpbmUgSEVBUAkJKElOVF9CSVQgPiAxNiA/IDQxOTQzMDQgOiA2NTUzNikKLQotLyogTnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgYWxsb3dlZCB0byBidWlsZCB1cCBhdCB0aGUgZW5kIG9mCi0gICBtZW1vcnkgYmVmb3JlIHRoZXkgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiAgKi8KLQotI2RlZmluZSBGSU5BTF9GUkVFX0JMT0NLUwk4Ci0KLS8qIFdoZXJlIHRvIHN0YXJ0IHNlYXJjaGluZyB0aGUgZnJlZSBsaXN0IHdoZW4gbG9va2luZyBmb3IgbmV3IG1lbW9yeS4KLSAgIFRoZSB0d28gcG9zc2libGUgdmFsdWVzIGFyZSAwIGFuZCBoZWFwaW5kZXguICBTdGFydGluZyBhdCAwIHNlZW1zCi0gICB0byByZWR1Y2UgdG90YWwgbWVtb3J5IHVzYWdlLCB3aGlsZSBzdGFydGluZyBhdCBoZWFwaW5kZXggc2VlbXMgdG8KLSAgIHJ1biBmYXN0ZXIuICAqLwotCi0jZGVmaW5lIE1BTExPQ19TRUFSQ0hfU1RBUlQJbWRwIC0+IGhlYXBpbmRleAotCi0vKiBBZGRyZXNzIHRvIGJsb2NrIG51bWJlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLSNkZWZpbmUgQkxPQ0soQSkgKCgoY2hhciAqKSAoQSkgLSBtZHAgLT4gaGVhcGJhc2UpIC8gQkxPQ0tTSVpFICsgMSkKLQotI2RlZmluZSBBRERSRVNTKEIpICgoUFRSKSAoKChCKSAtIDEpICogQkxPQ0tTSVpFICsgbWRwIC0+IGhlYXBiYXNlKSkKLQotLyogRGF0YSBzdHJ1Y3R1cmUgZ2l2aW5nIHBlci1ibG9jayBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgdW5pb24KLSAgewotICAgIC8qIEhlYXAgaW5mb3JtYXRpb24gZm9yIGEgYnVzeSBibG9jay4gICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JLyogWmVybyBmb3IgYSBsYXJnZSBibG9jaywgb3IgcG9zaXRpdmUgZ2l2aW5nIHRoZQotCSAgIGxvZ2FyaXRobSB0byB0aGUgYmFzZSB0d28gb2YgdGhlIGZyYWdtZW50IHNpemUuICAqLwotCWludCB0eXBlOwotCXVuaW9uCi0JICB7Ci0JICAgIHN0cnVjdAotCSAgICAgIHsKLQkJc2l6ZV90IG5mcmVlOwkvKiBGcmVlIGZyYWdtZW50cyBpbiBhIGZyYWdtZW50ZWQgYmxvY2suICAqLwotCQlzaXplX3QgZmlyc3Q7CS8qIEZpcnN0IGZyZWUgZnJhZ21lbnQgb2YgdGhlIGJsb2NrLiAgKi8KLQkgICAgICB9IGZyYWc7Ci0JICAgIC8qIFNpemUgKGluIGJsb2Nrcykgb2YgYSBsYXJnZSBjbHVzdGVyLiAgKi8KLQkgICAgc2l6ZV90IHNpemU7Ci0JICB9IGluZm87Ci0gICAgICB9IGJ1c3k7Ci0gICAgLyogSGVhcCBpbmZvcm1hdGlvbiBmb3IgYSBmcmVlIGJsb2NrICh0aGF0IG1heSBiZSB0aGUgZmlyc3Qgb2YKLSAgICAgICBhIGZyZWUgY2x1c3RlcikuICAqLwotICAgIHN0cnVjdAotICAgICAgewotCXNpemVfdCBzaXplOwkJLyogU2l6ZSAoaW4gYmxvY2tzKSBvZiBhIGZyZWUgY2x1c3Rlci4gICovCi0Jc2l6ZV90IG5leHQ7CQkvKiBJbmRleCBvZiBuZXh0IGZyZWUgY2x1c3Rlci4gICovCi0Jc2l6ZV90IHByZXY7CQkvKiBJbmRleCBvZiBwcmV2aW91cyBmcmVlIGNsdXN0ZXIuICAqLwotICAgICAgfSBmcmVlOwotICB9IG1hbGxvY19pbmZvOwotCi0vKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgd2l0aCBgbW1lbWFsaWduJyAob3IgYG12YWxsb2MnKS4gICovCi0KLXN0cnVjdCBhbGlnbmxpc3QKLSAgewotICAgIHN0cnVjdCBhbGlnbmxpc3QgKm5leHQ7Ci0gICAgUFRSIGFsaWduZWQ7CQkvKiBUaGUgYWRkcmVzcyB0aGF0IG1tZW1hbGlnbmVkIHJldHVybmVkLiAgKi8KLSAgICBQVFIgZXhhY3Q7CQkJLyogVGhlIGFkZHJlc3MgdGhhdCBtYWxsb2MgcmV0dXJuZWQuICAqLwotICB9OwotCi0vKiBEb3VibHkgbGlua2VkIGxpc3RzIG9mIGZyZWUgZnJhZ21lbnRzLiAgKi8KLQotc3RydWN0IGxpc3QKLSAgewotICAgIHN0cnVjdCBsaXN0ICpuZXh0OwotICAgIHN0cnVjdCBsaXN0ICpwcmV2OwotICB9OwotCi0vKiBTdGF0aXN0aWNzIGF2YWlsYWJsZSB0byB0aGUgdXNlci4KLSAgIEZJWE1FOiAgQnkgZGVzaWduLCB0aGUgaW50ZXJuYWxzIG9mIHRoZSBtYWxsb2MgcGFja2FnZSBhcmUgbm8gbG9uZ2VyCi0gICBleHBvcnRlZCB0byB0aGUgdXNlciB2aWEgYW4gaW5jbHVkZSBmaWxlLCBzbyBhY2Nlc3MgdG8gdGhpcyBkYXRhIG5lZWRzCi0gICB0byBiZSB2aWEgc29tZSBvdGhlciBtZWNoYW5pc20sIHN1Y2ggYXMgbW1zdGF0Xzxzb21ldGhpbmc+IHdoZXJlIHRoZQotICAgcmV0dXJuIHZhbHVlIGlzIHRoZSA8c29tZXRoaW5nPiB0aGUgdXNlciBpcyBpbnRlcmVzdGVkIGluLiAqLwotCi1zdHJ1Y3QgbXN0YXRzCi0gIHsKLSAgICBzaXplX3QgYnl0ZXNfdG90YWw7CQkvKiBUb3RhbCBzaXplIG9mIHRoZSBoZWFwLiAqLwotICAgIHNpemVfdCBjaHVua3NfdXNlZDsJCS8qIENodW5rcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIuICovCi0gICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBCeXRlIHRvdGFsIG9mIHVzZXItYWxsb2NhdGVkIGNodW5rcy4gKi8KLSAgICBzaXplX3QgY2h1bmtzX2ZyZWU7CQkvKiBDaHVua3MgaW4gdGhlIGZyZWUgbGlzdC4gKi8KLSAgICBzaXplX3QgYnl0ZXNfZnJlZTsJCS8qIEJ5dGUgdG90YWwgb2YgY2h1bmtzIGluIHRoZSBmcmVlIGxpc3QuICovCi0gIH07Ci0KLS8qIEludGVybmFsIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgbWFsbG9jLWRlc2NyaXB0b3IuCi0gICBUaGlzIGdldHMgd3JpdHRlbiB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24gdGhhdCBtbWFsbG9jIGlzCi0gICBtYW5hZ2luZywgYW5kIHRodXMgYWxzbyBiZWNvbWVzIHRoZSBmaWxlIGhlYWRlciBmb3IgdGhlIG1hcHBlZCBmaWxlLAotICAgaWYgc3VjaCBhIGZpbGUgZXhpc3RzLiAqLwotCi1zdHJ1Y3QgbWRlc2MKLXsKLSAgLyogVGhlICJtYWdpYyBudW1iZXIiIGZvciBhbiBtbWFsbG9jIGZpbGUuICovCi0KLSAgY2hhciBtYWdpY1tNTUFMTE9DX01BR0lDX1NJWkVdOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoaXMgc3RydWN0dXJlLCB1c2VkIGFzIGEgc2FuaXR5IGNoZWNrIHdoZW4gcmV1c2luZwotICAgICBhIHByZXZpb3VzbHkgY3JlYXRlZCBtYXBwZWQgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBpbnQgaGVhZGVyc2l6ZTsKLQotICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG1tYWxsb2MgcGFja2FnZSB0aGF0IGNyZWF0ZWQgdGhpcyBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKLQotICAvKiBTb21lIGZsYWcgYml0cyB0byBrZWVwIHRyYWNrIG9mIHZhcmlvdXMgaW50ZXJuYWwgdGhpbmdzLiAqLwotCi0gIHVuc2lnbmVkIGludCBmbGFnczsKLQotICAvKiBJZiBhIHN5c3RlbSBjYWxsIG1hZGUgYnkgdGhlIG1tYWxsb2MgcGFja2FnZSBmYWlscywgdGhlIGVycm5vIGlzCi0gICAgIHByZXNlcnZlZCBmb3IgZnV0dXJlIGV4YW1pbmF0aW9uLiAqLwotCi0gIGludCBzYXZlZF9lcnJubzsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gZ2V0IG1vcmUgY29yZSwgb3IgcmV0dXJuIGNvcmUKLSAgICAgdG8gdGhlIHN5c3RlbSwgZm9yIHJlcXVlc3RzIHVzaW5nIHRoaXMgbWFsbG9jIGRlc2NyaXB0b3IuICBGb3IgbWVtb3J5Ci0gICAgIG1hcHBlZCByZWdpb25zLCB0aGlzIGlzIHRoZSBtbWFwKCkgYmFzZWQgcm91dGluZS4gIFRoZXJlIG1heSBhbHNvIGJlCi0gICAgIGEgc2luZ2xlIG1hbGxvYyBkZXNjcmlwdG9yIHRoYXQgcG9pbnRzIHRvIGFuIHNicmsoKSBiYXNlZCByb3V0aW5lCi0gICAgIGZvciBzeXN0ZW1zIHdpdGhvdXQgbW1hcCgpIG9yIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBjYWxsIHRoZSBtbWFsbG9jKCkKLSAgICAgcGFja2FnZSB3aXRoIGEgTlVMTCBtYWxsb2MgZGVzY3JpcHRvci4KLQotICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCi0gICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KLQotICBQVFIgKCptb3JlY29yZSkgUEFSQU1TICgoc3RydWN0IG1kZXNjICosIGludCkpOwotICAgICAKLSAgLyogUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBjYXVzZXMgYW4gYWJvcnQgd2hlbiB0aGUgbWVtb3J5IGNoZWNraW5nCi0gICAgIGZlYXR1cmVzIGFyZSBhY3RpdmF0ZWQuICBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvIGFib3J0KCksIGJ1dCBjYW4KLSAgICAgYmUgc2V0IHRvIGFub3RoZXIgZnVuY3Rpb24gYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIG1tYWxsb2MoKS4KLQotICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCi0gICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KLQotICB2b2lkICgqYWJvcnRmdW5jKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogRGVidWdnaW5nIGhvb2sgZm9yIGZyZWUuCi0KLSAgICAgRklYTUU6ICBGb3IgbWFwcGVkIHJlZ2lvbnMgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgcHJvY2VzcywgdGhpcwotICAgICBuZWVkcyB0byBiZSBtYWludGFpbmVkIG9uIGEgcGVyLXByb2Nlc3MgYmFzaXMuICovCi0KLSAgdm9pZCAoKm1mcmVlX2hvb2spIFBBUkFNUyAoKFBUUiwgUFRSKSk7Ci0KLSAgLyogRGVidWdnaW5nIGhvb2sgZm9yIGBtYWxsb2MnLgotCi0gICAgIEZJWE1FOiAgRm9yIG1hcHBlZCByZWdpb25zIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHByb2Nlc3MsIHRoaXMKLSAgICAgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCBvbiBhIHBlci1wcm9jZXNzIGJhc2lzLiAqLwotCi0gIFBUUiAoKm1tYWxsb2NfaG9vaykgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLQotICAvKiBEZWJ1Z2dpbmcgaG9vayBmb3IgcmVhbGxvYy4KLQotICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCi0gICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KLQotICBQVFIgKCptcmVhbGxvY19ob29rKSBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7Ci0KLSAgLyogTnVtYmVyIG9mIGluZm8gZW50cmllcy4gICovCi0KLSAgc2l6ZV90IGhlYXBzaXplOwotCi0gIC8qIFBvaW50ZXIgdG8gZmlyc3QgYmxvY2sgb2YgdGhlIGhlYXAgKGJhc2Ugb2YgdGhlIGZpcnN0IGJsb2NrKS4gICovCi0KLSAgY2hhciAqaGVhcGJhc2U7Ci0KLSAgLyogQ3VycmVudCBzZWFyY2ggaW5kZXggZm9yIHRoZSBoZWFwIHRhYmxlLiAgKi8KLSAgLyogU2VhcmNoIGluZGV4IGluIHRoZSBpbmZvIHRhYmxlLiAgKi8KLQotICBzaXplX3QgaGVhcGluZGV4OwotCi0gIC8qIExpbWl0IG9mIHZhbGlkIGluZm8gdGFibGUgaW5kaWNlcy4gICovCi0KLSAgc2l6ZV90IGhlYXBsaW1pdDsKLQotICAvKiBCbG9jayBpbmZvcm1hdGlvbiB0YWJsZS4KLSAgICAgQWxsb2NhdGVkIHdpdGggbWFsaWduL19fbW1hbGxvY19mcmVlIChub3QgbW1hbGxvYy9tZnJlZSkuICAqLwotICAvKiBUYWJsZSBpbmRleGVkIGJ5IGJsb2NrIG51bWJlciBnaXZpbmcgcGVyLWJsb2NrIGluZm9ybWF0aW9uLiAgKi8KLQotICBtYWxsb2NfaW5mbyAqaGVhcGluZm87Ci0KLSAgLyogSW5zdHJ1bWVudGF0aW9uLiAgKi8KLQotICBzdHJ1Y3QgbXN0YXRzIGhlYXBzdGF0czsKLQotICAvKiBGcmVlIGxpc3QgaGVhZGVycyBmb3IgZWFjaCBmcmFnbWVudCBzaXplLiAgKi8KLSAgLyogRnJlZSBsaXN0cyBmb3IgZWFjaCBmcmFnbWVudCBzaXplLiAgKi8KLQotICBzdHJ1Y3QgbGlzdCBmcmFnaGVhZFtCTE9DS0xPR107Ci0KLSAgLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGJ5IG1lbWFsaWduLiAgKi8KLQotICBzdHJ1Y3QgYWxpZ25saXN0ICphbGlnbmVkX2Jsb2NrczsKLQotICAvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgcmVnaW9uIGZvciB0aGlzIG1hbGxvYyBoZWFwLiAgVGhpcwotICAgICBpcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJvb2trZWVwaW5nIGRhdGEgZm9yIG1tYXAgYW5kIGZvciBtYWxsb2MKLSAgICAgYmVnaW5zLiAqLwotCi0gIGNoYXIgKmJhc2U7Ci0KLSAgLyogVGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIG1lbW9yeSByZWdpb24gZm9yIHRoaXMgbWFsbG9jIGhlYXAgd2hpY2gKLSAgICAgcmVwcmVzZW50cyB0aGUgZW5kIG9mIG1lbW9yeSBpbiB1c2UuICovCi0KLSAgY2hhciAqYnJlYWt2YWw7Ci0KLSAgLyogVGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZW1vcnkgcmVnaW9uIGZvciB0aGlzIG1hbGxvYyBoZWFwLiAgVGhpcyBpcwotICAgICB0aGUgZmlyc3QgbG9jYXRpb24gcGFzdCB0aGUgZW5kIG9mIG1hcHBlZCBtZW1vcnkuICovCi0KLSAgY2hhciAqdG9wOwotCi0gIC8qIE9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSB0byB3aGljaCB0aGlzIG1hbGxvYyBoZWFwIGlzIG1hcHBlZC4KLSAgICAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgc2luY2UgL2Rldi96ZXJvIGlzIHVzZWQKLSAgICAgYnkgZGVmYXVsdCBpZiBubyBvcGVuIGZpbGUgaXMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudC4gIEFsc28gbm90ZSB0aGF0Ci0gICAgIGl0IG1heSBjaGFuZ2UgZWFjaCB0aW1lIHRoZSByZWdpb24gaXMgbWFwcGVkIGFuZCB1bm1hcHBlZC4gKi8KLQotICBpbnQgZmQ7Ci0KLSAgLyogQW4gYXJyYXkgb2Yga2V5cyB0byBkYXRhIHdpdGhpbiB0aGUgbWFwcGVkIHJlZ2lvbiwgZm9yIHVzZSBieSB0aGUKLSAgICAgYXBwbGljYXRpb24uICAqLwotCi0gIFBUUiBrZXlzW01NQUxMT0NfS0VZU107Ci0KLX07Ci0KLS8qIEJpdHMgdG8gbG9vayBhdCBpbiB0aGUgbWFsbG9jIGRlc2NyaXB0b3IgZmxhZ3Mgd29yZCAqLwotCi0jZGVmaW5lIE1NQUxMT0NfREVWWkVSTwkJKDEgPDwgMCkJLyogSGF2ZSBtYXBwZWQgdG8gL2Rldi96ZXJvICovCi0jZGVmaW5lIE1NQUxMT0NfSU5JVElBTElaRUQJKDEgPDwgMSkJLyogSW5pdGlhbGl6ZWQgbW1hbGxvYyAqLwotI2RlZmluZSBNTUFMTE9DX01NQ0hFQ0tfVVNFRAkoMSA8PCAyKQkvKiBtbWNoZWNrZigpIGNhbGxlZCBhbHJlYWR5ICovCi0KLS8qIEludGVybmFsIHZlcnNpb24gb2YgYG1mcmVlJyB1c2VkIGluIGBtb3JlY29yZScuICovCi0KLWV4dGVybiB2b2lkIF9fbW1hbGxvY19mcmVlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBQVFIpKTsKLQotLyogSG9va3MgZm9yIGRlYnVnZ2luZyB2ZXJzaW9ucy4gICovCi0KLWV4dGVybiB2b2lkICgqX19tZnJlZV9ob29rKSBQQVJBTVMgKChQVFIsIFBUUikpOwotZXh0ZXJuIFBUUiAoKl9fbW1hbGxvY19ob29rKSBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIFBUUiAoKl9fbXJlYWxsb2NfaG9vaykgUEFSQU1TICgoUFRSLCBQVFIsIHNpemVfdCkpOwotCi0vKiBBIGRlZmF1bHQgbWFsbG9jIGRlc2NyaXB0b3IgZm9yIHRoZSBzaW5nbGUgc2JyaygpIG1hbmFnZWQgcmVnaW9uLiAqLwotCi1leHRlcm4gc3RydWN0IG1kZXNjICpfX21tYWxsb2NfZGVmYXVsdF9tZHA7Ci0KLS8qIEluaXRpYWxpemUgdGhlIGZpcnN0IHVzZSBvZiB0aGUgZGVmYXVsdCBtYWxsb2MgZGVzY3JpcHRvciwgd2hpY2ggdXNlcwotICAgYW4gc2JyaygpIHJlZ2lvbi4gKi8KLQotZXh0ZXJuIHN0cnVjdCBtZGVzYyAqX19tbWFsbG9jX3NicmtfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEdyb3cgb3Igc2hyaW5rIGEgY29udGlndW91cyBtYXBwZWQgcmVnaW9uIHVzaW5nIG1tYXAoKS4KLSAgIFdvcmtzIG11Y2ggbGlrZSBzYnJrKCkgKi8KLQotI2lmIGRlZmluZWQoSEFWRV9NTUFQKQotCi1leHRlcm4gUFRSIF9fbW1hbGxvY19tbWFwX21vcmVjb3JlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBpbnQpKTsKLQotI2VuZGlmCi0KLS8qIFJlbWFwIGEgbW1hbGxvYyByZWdpb24gdGhhdCB3YXMgcHJldmlvdXNseSBtYXBwZWQuICovCi0KLWV4dGVybiBQVFIgX19tbWFsbG9jX3JlbWFwX2NvcmUgUEFSQU1TICgoc3RydWN0IG1kZXNjICopKTsKLQotLyogTWFjcm8gdG8gY29udmVydCBmcm9tIGEgdXNlciBzdXBwbGllZCBtYWxsb2MgZGVzY3JpcHRvciB0byBwb2ludGVyIHRvIHRoZQotICAgaW50ZXJuYWwgbWFsbG9jIGRlc2NyaXB0b3IuICBJZiB0aGUgdXNlciBzdXBwbGllZCBkZXNjcmlwdG9yIGlzIE5VTEwsIHRoZW4KLSAgIHVzZSB0aGUgZGVmYXVsdCBpbnRlcm5hbCB2ZXJzaW9uLCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5LiAgT3RoZXJ3aXNlCi0gICBqdXN0IGNhc3QgdGhlIHVzZXIgc3VwcGxpZWQgdmVyc2lvbiAod2hpY2ggaXMgdm9pZCAqKSB0byB0aGUgcHJvcGVyIHR5cGUKLSAgIChzdHJ1Y3QgbWRlc2MgKikuICovCi0KLSNkZWZpbmUgTURfVE9fTURQKG1kKSBcCi0gICgobWQpID09IE5VTEwgXAotICAgPyAoX19tbWFsbG9jX2RlZmF1bHRfbWRwID09IE5VTEwgXAotICAgICAgPyBfX21tYWxsb2Nfc2Jya19pbml0ICgpIFwKLSAgICAgIDogX19tbWFsbG9jX2RlZmF1bHRfbWRwKSBcCi0gICA6IChzdHJ1Y3QgbWRlc2MgKikgKG1kKSkKLQotI2VuZGlmICAvKiBfX01NUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9tbWFsbG9jL21tc3RhdHMuYyBiL21tYWxsb2MvbW1zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE3MzIzLi4wMDAwMDAwCi0tLSBhL21tYWxsb2MvbW1zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQWNjZXNzIHRoZSBzdGF0aXN0aWNzIG1haW50YWluZWQgYnkgYG1tYWxsb2MnLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIFdyaXR0ZW4gTWF5IDE5ODkgYnkgTWlrZSBIYWVydGVsLgotICAgTW9kaWZpZWQgTWFyIDE5OTIgYnkgRnJlZCBGaXNoLiAgKGZuZkBjeWdudXMuY29tKQotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIChFbWFpbCkgYXQgdGhlIGFkZHJlc3MgbWlrZUBhaS5taXQuZWR1LAotICAgb3IgKFVTIG1haWwpIGFzIE1pa2UgSGFlcnRlbCBjL28gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqLwotCi0jaW5jbHVkZSAibW1wcml2YXRlLmgiCi0KLS8qIEZJWE1FOiAgU2VlIHRoZSBjb21tZW50IGluIG1tcHJpdmF0ZS5oIHdoZXJlIHN0cnVjdCBtc3RhdHMgaXMgZGVmaW5lZC4KLSAgIE5vbmUgb2YgdGhlIGludGVybmFsIG1tYWxsb2Mgc3RydWN0dXJlcyBzaG91bGQgYmUgZXh0ZXJuYWxseSB2aXNpYmxlCi0gICBvdXRzaWRlIHRoZSBsaWJyYXJ5LiAqLwotCi1zdHJ1Y3QgbXN0YXRzCi1tbXN0YXRzIChtZCkKLSAgUFRSIG1kOwotewotICBzdHJ1Y3QgbXN0YXRzIHJlc3VsdDsKLSAgc3RydWN0IG1kZXNjICptZHA7Ci0KLSAgbWRwID0gTURfVE9fTURQIChtZCk7Ci0gIHJlc3VsdC5ieXRlc190b3RhbCA9Ci0gICAgICAoY2hhciAqKSBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgMCkgLSBtZHAgLT4gaGVhcGJhc2U7Ci0gIHJlc3VsdC5jaHVua3NfdXNlZCA9IG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQ7Ci0gIHJlc3VsdC5ieXRlc191c2VkID0gbWRwIC0+IGhlYXBzdGF0cy5ieXRlc191c2VkOwotICByZXN1bHQuY2h1bmtzX2ZyZWUgPSBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc19mcmVlOwotICByZXN1bHQuYnl0ZXNfZnJlZSA9IG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZTsKLSAgcmV0dXJuIChyZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tbXRyYWNlLmF3ayBiL21tYWxsb2MvbW10cmFjZS5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Njg5Y2UuLjAwMDAwMDAKLS0tIGEvbW1hbGxvYy9tbXRyYWNlLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgIEF3ayBwcm9ncmFtIHRvIGFuYWx5emUgbXRyYWNlLmMgb3V0cHV0LgotIwotJDEgPT0gIisiCXsgaWYgKGFsbG9jYXRlZFskMl0gIT0gIiIpCi0JCSAgICBwcmludCAiKyIsICQyLCAiQWxsb2MiLCBOUiwgImR1cGxpY2F0ZToiLCBhbGxvY2F0ZWRbJDJdOwotCQkgIGVsc2UKLQkJICAgIGFsbG9jYXRlZFskMl0gPSAkMzsKLQkJfQotJDEgPT0gIi0iCXsgaWYgKGFsbG9jYXRlZFskMl0gIT0gIiIpIHsKLQkJICAgIGFsbG9jYXRlZFskMl0gPSAiIjsKLQkJICAgIGlmIChhbGxvY2F0ZWRbJDJdICE9ICIiKQotCQkJcHJpbnQgIkRFTEVURSBGQUlMRUQiLCAkMiwgYWxsb2NhdGVkWyQyXTsKLQkJICB9IGVsc2UKLQkJICAgIHByaW50ICItIiwgJDIsICJGcmVlIiwgTlIsICJ3YXMgbmV2ZXIgYWxsb2MnZCI7Ci0JCX0KLSQxID09ICI8Igl7IGlmIChhbGxvY2F0ZWRbJDJdICE9ICIiKQotCQkgICAgYWxsb2NhdGVkWyQyXSA9ICIiOwotCQkgIGVsc2UKLQkJICAgIHByaW50ICItIiwgJDIsICJSZWFsbG9jIiwgTlIsICJ3YXMgbmV2ZXIgYWxsb2MnZCI7Ci0JCX0KLSQxID09ICI+Igl7IGlmIChhbGxvY2F0ZWRbJDJdICE9ICIiKQotCQkgICAgcHJpbnQgIisiLCAkMiwgIlJlYWxsb2MiLCBOUiwgImR1cGxpY2F0ZToiLCBhbGxvY2F0ZWRbJDJdOwotCQkgIGVsc2UKLQkJICAgIGFsbG9jYXRlZFskMl0gPSAkMzsKLQkJfQotCi0jIElnbm9yZSAiPSBTdGFydCIKLSQxID09ICI9Igl7IH0KLSMgSWdub3JlIGZhaWxlZCByZWFsbG9jIGF0dGVtcHRzIGZvciBub3cKLSQxID09ICIhIgl7IH0KLQotCi1FTkQJCXsgZm9yICh4IGluIGFsbG9jYXRlZCkgCi0JCSAgICBpZiAoYWxsb2NhdGVkW3hdICE9ICIiKQotCQkgICAgICBwcmludCAiKyIsIHgsIGFsbG9jYXRlZFt4XTsKLQkJfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tbXRyYWNlLmMgYi9tbWFsbG9jL21tdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYzg2MC4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL21tdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKiBNb3JlIGRlYnVnZ2luZyBob29rcyBmb3IgYG1tYWxsb2MnLgotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIFdyaXR0ZW4gQXByaWwgMiwgMTk5MSBieSBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQKLSAgIEJhc2VkIG9uIG1jaGVjay5jIGJ5IE1pa2UgSGFlcnRlbC4KLSAgIE1vZGlmaWVkIE1hciAxOTkyIGJ5IEZyZWQgRmlzaC4gIChmbmZAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJtbXByaXZhdGUuaCIKLQotc3RhdGljIHZvaWQgdHJfYnJlYWsgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdHJfZnJlZWhvb2sgUEFSQU1TICgoUFRSLCBQVFIpKTsKLXN0YXRpYyBQVFIgdHJfbWFsbG9jaG9vayBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotc3RhdGljIFBUUiB0cl9yZWFsbG9jaG9vayBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7Ci0KLSNpZm5kZWYJX19HTlVfTElCUkFSWV9fCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLXN0YXRpYyBGSUxFICptYWxsc3RyZWFtOwotCi0jaWYgMAkvKiBGSVhNRTogIERpc2FibGVkIGZvciBub3cuICovCi1zdGF0aWMgY2hhciBtYWxsZW52W10gPSAiTUFMTE9DX1RSQUNFIjsKLXN0YXRpYyBjaGFyIG1hbGxidWZbQlVGU0laXTsJLyogQnVmZmVyIGZvciB0aGUgb3V0cHV0LiAgKi8KLSNlbmRpZgotCi0vKiBBZGRyZXNzIHRvIGJyZWFrcG9pbnQgb24gYWNjZXNzZXMgdG8uLi4gKi8KLXN0YXRpYyBQVFIgbWFsbHdhdGNoOwotCi0vKiBPbGQgaG9vayB2YWx1ZXMuICAqLwotCi1zdGF0aWMgdm9pZCAoKm9sZF9tZnJlZV9ob29rKSBQQVJBTVMgKChQVFIsIFBUUikpOwotc3RhdGljIFBUUiAoKm9sZF9tbWFsbG9jX2hvb2spIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1zdGF0aWMgUFRSICgqb2xkX21yZWFsbG9jX2hvb2spIFBBUkFNUyAoKFBUUiwgUFRSLCBzaXplX3QpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgYmVpbmcgYWxsb2MnZCwgcmVhbGxvYydkLCBvcgotICAgZnJlZWQgaGFzIGFuIGFkZHJlc3MgbWF0Y2hpbmcgdGhlIHZhcmlhYmxlICJtYWxsd2F0Y2giLiAgSW4gYSBkZWJ1Z2dlciwKLSAgIHNldCAibWFsbHdhdGNoIiB0byB0aGUgYWRkcmVzcyBvZiBpbnRlcmVzdCwgdGhlbiBwdXQgYSBicmVha3BvaW50IG9uCi0gICB0cl9icmVhay4gICovCi0KLXN0YXRpYyB2b2lkCi10cl9icmVhayAoKQotewotfQotCi1zdGF0aWMgdm9pZAotdHJfZnJlZWhvb2sgKG1kLCBwdHIpCi0gIFBUUiBtZDsKLSAgUFRSIHB0cjsKLXsKLSAgc3RydWN0IG1kZXNjICptZHA7Ci0KLSAgbWRwID0gTURfVE9fTURQIChtZCk7Ci0gIC8qIEJlIHN1cmUgdG8gcHJpbnQgaXQgZmlyc3QuICAqLwotICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiLSAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0cik7Ci0gIGlmIChwdHIgPT0gbWFsbHdhdGNoKQotICAgIHRyX2JyZWFrICgpOwotICBtZHAgLT4gbWZyZWVfaG9vayA9IG9sZF9tZnJlZV9ob29rOwotICBtZnJlZSAobWQsIHB0cik7Ci0gIG1kcCAtPiBtZnJlZV9ob29rID0gdHJfZnJlZWhvb2s7Ci19Ci0KLXN0YXRpYyBQVFIKLXRyX21hbGxvY2hvb2sgKG1kLCBzaXplKQotICBQVFIgbWQ7Ci0gIHNpemVfdCBzaXplOwotewotICBQVFIgaGRyOwotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLSAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IG9sZF9tbWFsbG9jX2hvb2s7Ci0gIGhkciA9IChQVFIpIG1tYWxsb2MgKG1kLCBzaXplKTsKLSAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IHRyX21hbGxvY2hvb2s7Ci0KLSAgLyogV2UgY291bGQgYmUgcHJpbnRpbmcgYSBOVUxMIGhlcmU7IHRoYXQncyBPSy4gICovCi0gIGZwcmludGYgKG1hbGxzdHJlYW0sICIrICUwOGx4ICV4XG4iLCAodW5zaWduZWQgbG9uZykgaGRyLCBzaXplKTsKLQotICBpZiAoaGRyID09IG1hbGx3YXRjaCkKLSAgICB0cl9icmVhayAoKTsKLQotICByZXR1cm4gKGhkcik7Ci19Ci0KLXN0YXRpYyBQVFIKLXRyX3JlYWxsb2Nob29rIChtZCwgcHRyLCBzaXplKQotICBQVFIgbWQ7Ci0gIFBUUiBwdHI7Ci0gIHNpemVfdCBzaXplOwotewotICBQVFIgaGRyOwotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLQotICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKLQotICBpZiAocHRyID09IG1hbGx3YXRjaCkKLSAgICB0cl9icmVhayAoKTsKLQotICBtZHAgLT4gbWZyZWVfaG9vayA9IG9sZF9tZnJlZV9ob29rOwotICBtZHAgLT4gbW1hbGxvY19ob29rID0gb2xkX21tYWxsb2NfaG9vazsKLSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSBvbGRfbXJlYWxsb2NfaG9vazsKLSAgaGRyID0gKFBUUikgbXJlYWxsb2MgKG1kLCBwdHIsIHNpemUpOwotICBtZHAgLT4gbWZyZWVfaG9vayA9IHRyX2ZyZWVob29rOwotICBtZHAgLT4gbW1hbGxvY19ob29rID0gdHJfbWFsbG9jaG9vazsKLSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSB0cl9yZWFsbG9jaG9vazsKLSAgaWYgKGhkciA9PSBOVUxMKQotICAgIC8qIEZhaWxlZCByZWFsbG9jLiAgKi8KLSAgICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiISAlMDhseCAleFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0ciwgc2l6ZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiPCAlMDhseFxuPiAlMDhseCAleFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0ciwKLQkgICAgICh1bnNpZ25lZCBsb25nKSBoZHIsIHNpemUpOwotCi0gIGlmIChoZHIgPT0gbWFsbHdhdGNoKQotICAgIHRyX2JyZWFrICgpOwotCi0gIHJldHVybiBoZHI7Ci19Ci0KLS8qIFdlIGVuYWJsZSB0cmFjaW5nIGlmIGVpdGhlciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTUFMTE9DX1RSQUNFCi0gICBpcyBzZXQsIG9yIGlmIHRoZSB2YXJpYWJsZSBtYWxsd2F0Y2ggaGFzIGJlZW4gcGF0Y2hlZCB0byBhbiBhZGRyZXNzCi0gICB0aGF0IHRoZSBkZWJ1Z2dpbmcgdXNlciB3YW50cyB1cyB0byBzdG9wIG9uLiAgV2hlbiBwYXRjaGluZyBtYWxsd2F0Y2gsCi0gICBkb24ndCBmb3JnZXQgdG8gc2V0IGEgYnJlYWtwb2ludCBvbiB0cl9icmVhayEgICovCi0KLWludAotbW10cmFjZSAoKQotewotI2lmIDAJLyogRklYTUUhICBUaGlzIGlzIGRpc2FibGVkIGZvciBub3cgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8KLQkgICBtYWludGFpbiBhIHN0YWNrIG9mIGhvb2tzIHBlciBoZWFwLCBzaW5jZSB3ZSBtaWdodCBoYXZlIG90aGVyCi0JICAgaG9va3MgKHN1Y2ggYXMgc2V0IGJ5IG1tY2hlY2svbW1jaGVja2YpIGFjdGl2ZSBhbHNvLiAqLwotICBjaGFyICptYWxsZmlsZTsKLQotICBtYWxsZmlsZSA9IGdldGVudiAobWFsbGVudik7Ci0gIGlmIChtYWxsZmlsZSAgIT0gTlVMTCB8fCBtYWxsd2F0Y2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtYWxsc3RyZWFtID0gZm9wZW4gKG1hbGxmaWxlICE9IE5VTEwgPyBtYWxsZmlsZSA6ICIvZGV2L251bGwiLCAidyIpOwotICAgICAgaWYgKG1hbGxzdHJlYW0gIT0gTlVMTCkKLQl7Ci0JICAvKiBCZSBzdXJlIGl0IGRvZXNuJ3QgbW1hbGxvYyBpdHMgYnVmZmVyISAgKi8KLQkgIHNldGJ1ZiAobWFsbHN0cmVhbSwgbWFsbGJ1Zik7Ci0JICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiPSBTdGFydFxuIik7Ci0JICBvbGRfbWZyZWVfaG9vayA9IG1kcCAtPiBtZnJlZV9ob29rOwotCSAgbWRwIC0+IG1mcmVlX2hvb2sgPSB0cl9mcmVlaG9vazsKLQkgIG9sZF9tbWFsbG9jX2hvb2sgPSBtZHAgLT4gbW1hbGxvY19ob29rOwotCSAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IHRyX21hbGxvY2hvb2s7Ci0JICBvbGRfbXJlYWxsb2NfaG9vayA9IG1kcCAtPiBtcmVhbGxvY19ob29rOwotCSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSB0cl9yZWFsbG9jaG9vazsKLQl9Ci0gICAgfQotCi0jZW5kaWYJLyogMCAqLwotCi0gIHJldHVybiAoMSk7Ci19Ci0KZGlmZiAtLWdpdCBhL21tYWxsb2MvbXJlYWxsb2MuYyBiL21tYWxsb2MvbXJlYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwMDRhYS4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL21yZWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogQ2hhbmdlIHRoZSBzaXplIG9mIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IGBtbWFsbG9jJy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotCQkgIFdyaXR0ZW4gTWF5IDE5ODkgYnkgTWlrZSBIYWVydGVsLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIChFbWFpbCkgYXQgdGhlIGFkZHJlc3MgbWlrZUBhaS5taXQuZWR1LAotICAgb3IgKFVTIG1haWwpIGFzIE1pa2UgSGFlcnRlbCBjL28gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIFByb3RvdHlwZXMgZm9yIG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0LCBldGMgKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi0vKiBSZXNpemUgdGhlIGdpdmVuIHJlZ2lvbiB0byB0aGUgbmV3IHNpemUsIHJldHVybmluZyBhIHBvaW50ZXIKLSAgIHRvIHRoZSAocG9zc2libHkgbW92ZWQpIHJlZ2lvbi4gIFRoaXMgaXMgb3B0aW1pemVkIGZvciBzcGVlZDsKLSAgIHNvbWUgYmVuY2htYXJrcyBzZWVtIHRvIGluZGljYXRlIHRoYXQgZ3JlYXRlciBjb21wYWN0bmVzcyBpcwotICAgYWNoaWV2ZWQgYnkgdW5jb25kaXRpb25hbGx5IGFsbG9jYXRpbmcgYW5kIGNvcHlpbmcgdG8gYQotICAgbmV3IHJlZ2lvbi4gIFRoaXMgbW9kdWxlIGhhcyBpbmNlc3R1b3VzIGtub3dsZWRnZSBvZiB0aGUKLSAgIGludGVybmFscyBvZiBib3RoIG1mcmVlIGFuZCBtbWFsbG9jLiAqLwotCi1QVFIKLW1yZWFsbG9jIChtZCwgcHRyLCBzaXplKQotICBQVFIgbWQ7Ci0gIFBUUiBwdHI7Ci0gIHNpemVfdCBzaXplOwotewotICBzdHJ1Y3QgbWRlc2MgKm1kcDsKLSAgUFRSIHJlc3VsdDsKLSAgaW50IHR5cGU7Ci0gIHNpemVfdCBibG9jaywgYmxvY2tzLCBvbGRsaW1pdDsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIG1mcmVlIChtZCwgcHRyKTsKLSAgICAgIHJldHVybiAobW1hbGxvYyAobWQsIDApKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHB0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAobW1hbGxvYyAobWQsIHNpemUpKTsKLSAgICB9Ci0KLSAgbWRwID0gTURfVE9fTURQIChtZCk7Ci0KLSAgaWYgKG1kcCAtPiBtcmVhbGxvY19ob29rICE9IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuICgoKm1kcCAtPiBtcmVhbGxvY19ob29rKSAobWQsIHB0ciwgc2l6ZSkpOwotICAgIH0KLQotICBibG9jayA9IEJMT0NLIChwdHIpOwotCi0gIHR5cGUgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kudHlwZTsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAvKiBNYXliZSByZWFsbG9jYXRlIGEgbGFyZ2UgYmxvY2sgdG8gYSBzbWFsbCBmcmFnbWVudC4gICovCi0gICAgICBpZiAoc2l6ZSA8PSBCTE9DS1NJWkUgLyAyKQotCXsKLQkgIHJlc3VsdCA9IG1tYWxsb2MgKG1kLCBzaXplKTsKLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIG1lbWNweSAocmVzdWx0LCBwdHIsIHNpemUpOwotCSAgICAgIG1mcmVlIChtZCwgcHRyKTsKLQkgICAgICByZXR1cm4gKHJlc3VsdCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSBuZXcgc2l6ZSBpcyBhIGxhcmdlIGFsbG9jYXRpb24gYXMgd2VsbDsKLQkgc2VlIGlmIHdlIGNhbiBob2xkIGl0IGluIHBsYWNlLiAqLwotICAgICAgYmxvY2tzID0gQkxPQ0tJRlkgKHNpemUpOwotICAgICAgaWYgKGJsb2NrcyA8IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUpCi0JewotCSAgLyogVGhlIG5ldyBzaXplIGlzIHNtYWxsZXI7IHJldHVybiBleGNlc3MgbWVtb3J5IHRvIHRoZSBmcmVlIGxpc3QuICovCi0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2sgKyBibG9ja3NdLmJ1c3kudHlwZSA9IDA7Ci0JICBtZHAgLT4gaGVhcGluZm9bYmxvY2sgKyBibG9ja3NdLmJ1c3kuaW5mby5zaXplCi0JICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSAtIGJsb2NrczsKLQkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSBibG9ja3M7Ci0JICBtZnJlZSAobWQsIEFERFJFU1MgKGJsb2NrICsgYmxvY2tzKSk7Ci0JICByZXN1bHQgPSBwdHI7Ci0JfQotICAgICAgZWxzZSBpZiAoYmxvY2tzID09IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUpCi0JewotCSAgLyogTm8gc2l6ZSBjaGFuZ2UgbmVjZXNzYXJ5LiAgKi8KLQkgIHJlc3VsdCA9IHB0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV29uJ3QgZml0LCBzbyBhbGxvY2F0ZSBhIG5ldyByZWdpb24gdGhhdCB3aWxsLgotCSAgICAgRnJlZSB0aGUgb2xkIHJlZ2lvbiBmaXJzdCBpbiBjYXNlIHRoZXJlIGlzIHN1ZmZpY2llbnQKLQkgICAgIGFkamFjZW50IGZyZWUgc3BhY2UgdG8gZ3JvdyB3aXRob3V0IG1vdmluZy4gKi8KLQkgIGJsb2NrcyA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemU7Ci0JICAvKiBQcmV2ZW50IGZyZWUgZnJvbSBhY3R1YWxseSByZXR1cm5pbmcgbWVtb3J5IHRvIHRoZSBzeXN0ZW0uICAqLwotCSAgb2xkbGltaXQgPSBtZHAgLT4gaGVhcGxpbWl0OwotCSAgbWRwIC0+IGhlYXBsaW1pdCA9IDA7Ci0JICBtZnJlZSAobWQsIHB0cik7Ci0JICBtZHAgLT4gaGVhcGxpbWl0ID0gb2xkbGltaXQ7Ci0JICByZXN1bHQgPSBtbWFsbG9jIChtZCwgc2l6ZSk7Ci0JICBpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtbWFsbG9jIChtZCwgYmxvY2tzICogQkxPQ0tTSVpFKTsKLQkgICAgICByZXR1cm4gKE5VTEwpOwotCSAgICB9Ci0JICBpZiAocHRyICE9IHJlc3VsdCkKLQkgICAgewotCSAgICAgIG1lbW1vdmUgKHJlc3VsdCwgcHRyLCBibG9ja3MgKiBCTE9DS1NJWkUpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogT2xkIHNpemUgaXMgYSBmcmFnbWVudDsgdHlwZSBpcyBsb2dhcml0aG0KLQkgdG8gYmFzZSB0d28gb2YgdGhlIGZyYWdtZW50IHNpemUuICAqLwotICAgICAgaWYgKHNpemUgPiAoc2l6ZV90KSAoMSA8PCAodHlwZSAtIDEpKSAmJiBzaXplIDw9IChzaXplX3QpICgxIDw8IHR5cGUpKQotCXsKLQkgIC8qIFRoZSBuZXcgc2l6ZSBpcyB0aGUgc2FtZSBraW5kIG9mIGZyYWdtZW50LiAgKi8KLQkgIHJlc3VsdCA9IHB0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIG5ldyBzaXplIGlzIGRpZmZlcmVudDsgYWxsb2NhdGUgYSBuZXcgc3BhY2UsCi0JICAgICBhbmQgY29weSB0aGUgbGVzc2VyIG9mIHRoZSBuZXcgc2l6ZSBhbmQgdGhlIG9sZC4gKi8KLQkgIHJlc3VsdCA9IG1tYWxsb2MgKG1kLCBzaXplKTsKLQkgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHJldHVybiAoTlVMTCk7Ci0JICAgIH0KLQkgIG1lbWNweSAocmVzdWx0LCBwdHIsIE1JTiAoc2l6ZSwgKHNpemVfdCkgMSA8PCB0eXBlKSk7Ci0JICBtZnJlZSAobWQsIHB0cik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogV2hlbiB1c2luZyB0aGlzIHBhY2thZ2UsIHByb3ZpZGUgYSB2ZXJzaW9uIG9mIG1hbGxvYy9yZWFsbG9jL2ZyZWUgYnVpbHQKLSAgIG9uIHRvcCBvZiBpdCwgc28gdGhhdCBpZiB3ZSB1c2UgdGhlIGRlZmF1bHQgc2JyaygpIHJlZ2lvbiB3ZSB3aWxsIG5vdAotICAgY29sbGlkZSB3aXRoIGFub3RoZXIgbWFsbG9jIHBhY2thZ2UgdHJ5aW5nIHRvIGRvIHRoZSBzYW1lIHRoaW5nLCBpZgotICAgdGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGFueSAiaGlkZGVuIiBjYWxscyB0byBtYWxsb2MvcmVhbGxvYy9mcmVlIChzdWNoCi0gICBhcyBpbnNpZGUgYSBzeXN0ZW0gbGlicmFyeSkuICovCi0KLVBUUgotcmVhbGxvYyAocHRyLCBzaXplKQotICBQVFIgcHRyOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJlc3VsdDsKLQotICByZXN1bHQgPSBtcmVhbGxvYyAoKFBUUikgTlVMTCwgcHRyLCBzaXplKTsKLSAgcmV0dXJuIChyZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tdmFsbG9jLmMgYi9tbWFsbG9jL212YWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0OTQyZi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL212YWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIEFsbG9jYXRlIG1lbW9yeSBvbiBhIHBhZ2UgYm91bmRhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibW1wcml2YXRlLmgiCi0KLS8qIENhY2hlIHRoZSBwYWdlc2l6ZSBmb3IgdGhlIGN1cnJlbnQgaG9zdCBtYWNoaW5lLiAgTm90ZSB0aGF0IGlmIHRoZSBob3N0Ci0gICBkb2VzIG5vdCByZWFkaWx5IHByb3ZpZGUgYSBnZXRwYWdlc2l6ZSgpIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGVtdWxhdGUgaXQKLSAgIGVsc2V3aGVyZSwgbm90IGNsdXR0ZXIgdXAgdGhpcyBmaWxlIHdpdGggbG90cyBvZiBrbHVnZXMgdG8gdHJ5IHRvIGZpZ3VyZQotICAgaXQgb3V0LiAqLwotCi1zdGF0aWMgc2l6ZV90IGNhY2hlX3BhZ2VzaXplOwotI2lmIE5FRURfREVDTEFSQVRJT05fR0VUUEFHRVNJWkUKLWV4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLVBUUgotbXZhbGxvYyAobWQsIHNpemUpCi0gIFBUUiBtZDsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIGlmIChjYWNoZV9wYWdlc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGNhY2hlX3BhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7Ci0gICAgfQotCi0gIHJldHVybiAobW1lbWFsaWduIChtZCwgY2FjaGVfcGFnZXNpemUsIHNpemUpKTsKLX0KLQotCi1QVFIKLXZhbGxvYyAoc2l6ZSkKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJldHVybiBtdmFsbG9jICgoUFRSKSBOVUxMLCBzaXplKTsKLX0KZGlmZiAtLWdpdCBhL21tYWxsb2Mvc2Jyay1zdXAuYyBiL21tYWxsb2Mvc2Jyay1zdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMDc4Yi4uMDAwMDAwMAotLS0gYS9tbWFsbG9jL3Nicmstc3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3Igc2JyaygpIHJlZ2lvbnMuCi0gICBDb3B5cmlnaHQgMTk5MiwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gICBmbmZAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+CS8qIFByb3RvdHlwZXMgZm9yIHNicmsgKG1heWJlKSAqLwotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIFByb3RvdHlwZXMgZm9yIG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0LCBldGMgKi8KLQotI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgotCi1zdGF0aWMgUFRSIHNicmtfbW9yZWNvcmUgUEFSQU1TICgoc3RydWN0IG1kZXNjICosIGludCkpOwotI2lmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIFBUUiBzYnJrIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLS8qIFRoZSBtbWFsbG9jKCkgcGFja2FnZSBjYW4gdXNlIGEgc2luZ2xlIGltcGxpY2l0IG1hbGxvYyBkZXNjcmlwdG9yCi0gICBmb3IgbW1hbGxvYy9tcmVhbGxvYy9tZnJlZSBvcGVyYXRpb25zIHdoaWNoIGRvIG5vdCBzdXBwbHkgYW4gZXhwbGljaXQKLSAgIGRlc2NyaXB0b3IuICBGb3IgdGhlc2Ugb3BlcmF0aW9ucywgc2JyaygpIGlzIHVzZWQgdG8gb2J0YWluIG1vcmUgY29yZQotICAgZnJvbSB0aGUgc3lzdGVtLCBvciByZXR1cm4gY29yZS4gIFRoaXMgYWxsb3dzIG1tYWxsb2MoKSB0byBwcm92aWRlCi0gICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBub24tbW1hcCdkIHZlcnNpb24uICovCi0KLXN0cnVjdCBtZGVzYyAqX19tbWFsbG9jX2RlZmF1bHRfbWRwOwotCi0vKiBVc2Ugc2JyaygpIHRvIGdldCBtb3JlIGNvcmUuICovCi0KLXN0YXRpYyBQVFIKLXNicmtfbW9yZWNvcmUgKG1kcCwgc2l6ZSkKLSAgc3RydWN0IG1kZXNjICptZHA7Ci0gIGludCBzaXplOwotewotICBQVFIgcmVzdWx0OwotCi0gIGlmICgocmVzdWx0ID0gc2JyayAoc2l6ZSkpID09IChQVFIpIC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWRwIC0+IGJyZWFrdmFsICs9IHNpemU7Ci0gICAgICBtZHAgLT4gdG9wICs9IHNpemU7Ci0gICAgfQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgbWFsbG9jIGRlc2NyaXB0b3IgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZQotICAgYSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gdXNlIHRoZSBkZWZhdWx0IHNicmsnZCByZWdpb24uCi0KLSAgIFNpbmNlIG5vIGFsaWdubWVudCBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IHRoZSBpbml0aWFsIHZhbHVlIHJldHVybmVkCi0gICBieSBzYnJrLCB0ZXN0IHRoZSBpbml0aWFsIHZhbHVlIGFuZCAoaWYgbmVjZXNzYXJ5KSBzYnJrIGVub3VnaCBhZGRpdGlvbmFsCi0gICBtZW1vcnkgdG8gc3RhcnQgb2ZmIHdpdGggYWxpZ25tZW50IHRvIEJMT0NLU0laRS4gIFdlIGFjdHVhbGx5IG9ubHkgbmVlZAotICAgaXQgYWxpZ25lZCB0byBhbiBhbGlnbm1lbnQgc3VpdGFibGUgZm9yIGFueSBvYmplY3QsIHNvIHRoaXMgaXMgb3ZlcmtpbGwuCi0gICBCdXQgYXQgbW9zdCBpdCB3YXN0ZXMganVzdCBwYXJ0IG9mIG9uZSBCTE9DS1NJWkUgY2h1bmsgb2YgbWVtb3J5IGFuZAotICAgbWluaW1pemVzIHBvcnRhYmlsaXR5IHByb2JsZW1zIGJ5IGF2b2lkaW5nIHVzIGhhdmluZyB0byBmaWd1cmUgb3V0Ci0gICB3aGF0IHRoZSBhY3R1YWwgbWluaW1hbCBhbGlnbm1lbnQgaXMuICBUaGUgcmVzdCBvZiB0aGUgbWFsbG9jIGNvZGUKLSAgIGF2b2lkcyB0aGlzIGFzIHdlbGwsIGJ5IGFsd2F5cyBhbGlnbmluZyB0byB0aGUgbWluaW11bSBvZiB0aGUgcmVxdWVzdGVkCi0gICBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiB0d28sIG9yIHRvIEJMT0NLU0laRS4KLQotICAgTm90ZSB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2Ugc29tZSBtZW1vcnkgc3RhcnRpbmcgYXQgdGhpcyBpbml0aWFsIHNicmsKLSAgIGFkZHJlc3MgZm9yIHRoZSBzYnJrIHJlZ2lvbiBtYWxsb2MgZGVzY3JpcHRvciwgd2hpY2ggaXMgYSBzdHJ1Y3QsIHNvIHRoZQotICAgYmFzZSBhZGRyZXNzIG11c3QgYmUgc3VpdGFibHkgYWxpZ25lZC4gKi8KLQotc3RydWN0IG1kZXNjICoKLV9fbW1hbGxvY19zYnJrX2luaXQgKCkKLXsKLSAgUFRSIGJhc2U7Ci0gIHVuc2lnbmVkIGludCBhZGo7Ci0KLSAgYmFzZSA9IHNicmsgKDApOwotICBhZGogPSBSRVNJRFVBTCAoYmFzZSwgQkxPQ0tTSVpFKTsKLSAgaWYgKGFkaiAhPSAwKQotICAgIHsKLSAgICAgIHNicmsgKEJMT0NLU0laRSAtIGFkaik7Ci0gICAgICBiYXNlID0gc2JyayAoMCk7Ci0gICAgfQotICBfX21tYWxsb2NfZGVmYXVsdF9tZHAgPSAoc3RydWN0IG1kZXNjICopIHNicmsgKHNpemVvZiAoc3RydWN0IG1kZXNjKSk7Ci0gIG1lbXNldCAoKGNoYXIgKikgX19tbWFsbG9jX2RlZmF1bHRfbWRwLCAwLCBzaXplb2YgKHN0cnVjdCBtZGVzYykpOwotICBfX21tYWxsb2NfZGVmYXVsdF9tZHAgLT4gbW9yZWNvcmUgPSBzYnJrX21vcmVjb3JlOwotICBfX21tYWxsb2NfZGVmYXVsdF9tZHAgLT4gYmFzZSA9IGJhc2U7Ci0gIF9fbW1hbGxvY19kZWZhdWx0X21kcCAtPiBicmVha3ZhbCA9IF9fbW1hbGxvY19kZWZhdWx0X21kcCAtPiB0b3AgPSBzYnJrICgwKTsKLSAgX19tbWFsbG9jX2RlZmF1bHRfbWRwIC0+IGZkID0gLTE7Ci0gIHJldHVybiAoX19tbWFsbG9jX2RlZmF1bHRfbWRwKTsKLX0KLQotCmRpZmYgLS1naXQgYS9tb3ZlLWlmLWNoYW5nZSBiL21vdmUtaWYtY2hhbmdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTFiMzQ4Li4wMDAwMDAwCi0tLSBhL21vdmUtaWYtY2hhbmdlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1pZgotdGVzdCAtciAkMgotdGhlbgotaWYKLWNtcCAkMSAkMiA+IC9kZXYvbnVsbAotdGhlbgotZWNobyAkMiBpcyB1bmNoYW5nZWQKLXJtIC1mICQxCi1lbHNlCi1tdiAtZiAkMSAkMgotZmkKLWVsc2UKLW12IC1mICQxICQyCi1maQpkaWZmIC0tZ2l0IGEvbXB3LVJFQURNRSBiL21wdy1SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzE0MGIuLjAwMDAwMDAKLS0tIGEvbXB3LVJFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi1UaGlzIGlzIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBNYWNpbnRvc2godG0pIE1QVyh0bSkgcG9ydCBvZiB0aGUKLUdOVSB0b29scy4gIFRoZSBpbmZvcm1hdGlvbiBiZWxvdyBhcHBsaWVzIHRvIGJvdGggbmF0aXZlIGFuZCBjcm9zcwotY29tcGlsZXJzLgotCi0oUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoaXMgZmlsZTsgIm1wdy1SRUFETUUiCi1pcyB0aGUgc291cmNlIGZvcm0sIGFuZCAiUmVhZCBNZSBmb3IgTVBXIiBpcyB0aGUgZGlzdHJpYnV0aW9uIGZvcm0uCi0iUmVhZCBNZSBmb3IgTVBXIiBoYXMgOC1iaXQgY2hhcnMgc3VjaCBhcyBcT3B0aW9uLWQgZW1iZWRkZWQgaW4gaXQuKQotCi1JTlNUQUxMSU5HIEdOVSBUT09MUwotCi0qIFN5c3RlbSBSZXF1aXJlbWVudHMKLQotVG8gdXNlIHRoZXNlIHRvb2xzLCB5b3Ugd2lsbCBuZWVkIGEgTWFjIHdpdGggYSA2ODAyMCBvciBiZXR0ZXIgb3IgZWxzZQotYW55IFBvd2VyTWFjLCBTeXN0ZW0gNy4xIG9yIGxhdGVyLCBhbmQgTVBXIDMuMyBvciAzLjQuICBZb3Ugd2lsbCAqbm90KgotbmVlZCBhbnkgb3RoZXIgTVBXIGNvbXBpbGVyIHVubGVzcyB5b3Ugd2FudCB0byByZWJ1aWxkIGZyb20gc291cmNlcywKLW5vciBldmVuIGFueSBpbmNsdWRlIGZpbGVzLCB1bmxlc3MgeW91IGFyZSBidWlsZGluZyBhY3R1YWwgTWFjCi1hcHBsaWNhdGlvbnMuICBGb3IgUG93ZXJNYWMgbmF0aXZlIHlvdSB3aWxsIG5lZWQgUFBDTGluaywgaG93ZXZlcjsKLWFsc28gdGhlIGV4ZWN1dGFibGVzIGFyZSBQb3dlclBDLW9ubHkuCi0KLSogQXV0b21hdGVkIEluc3RhbGxhdGlvbgotCi1UaGUgc2ltcGxlc3Qgd2F5IHRvIGluc3RhbGwgR05VIHRvb2xzIGlzIHRvIHJ1biB0aGUgSW5zdGFsbCBzY3JpcHQuCi1UaGUgc2NyaXB0IHdpbGwgY29weSB0aGluZ3MgdG8gd2hlcmUgeW91IHdhbnQgdG8ga2VlcCB0aGVtLCB3aWxsIGJ1aWxkCi1hIFVzZXJTdGFydHVwIGZpbGUgd2l0aCBzZXR0aW5ncyBjb3JyZXNwb25kaW5nIHRvIHdoZXJlIHRoaW5ncyB3ZXJlCi1jb3BpZWQsIGFuZCBvZmZlciB0byBwdXQgdGhhdCBVc2VyU3RhcnR1cCBmaWxlIGluIHlvdXIgTVBXIGZvbGRlci4KLQotVGhlIEluc3RhbGwgc2NyaXB0IGRvZXMgbm90IGFsdGVyIGFueXRoaW5nIGluIHRoZSBTeXN0ZW0gRm9sZGVyLCBhbmQKLWl0IGRvZXMgbm90IHRha2UgYW55IGFjdGlvbiB3aXRob3V0IGNvbmZpcm1hdGlvbi4KLQotVGhlIEluc3RhbGwgc2NyaXB0IHdpbGwgYmUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgYmluYXJ5Ci1kaXN0cmlidXRpb24sIG9yIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG9iamVjdCBkaXJlY3RvcnkgaWYKLXJlYnVpbGRpbmcgZnJvbSBzb3VyY2UuICAoVGhlIHNvdXJjZXMgaW5jbHVkZSBhIGZpbGUgY2FsbGVkCi0ibXB3LWluc3RhbGwiIGF0IHRoZSB0b3AgbGV2ZWwsIGJ1dCBpdCBpcyB0aGUgc291cmNlIHRvIHRoZSBJbnN0YWxsCi1zY3JpcHQgYW5kIGNhbm5vdCBiZSBydW4gZGlyZWN0bHkuKQotCi0qIE1hbnVhbCBJbnN0YWxsYXRpb24KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdCwgeW91IGNhbiBkbyBpbnN0YWxsYXRpb24KLW1hbnVhbGx5OyB0aGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdGVwcyBpbnZvbHZlZC4KLQotVGhlIEdOVSB0b29scyBjYW4gZ28gaW4gYW55IGRpcmVjdG9yeSB0aGF0IGlzIGluIHlvdXIge0NvbW1hbmRzfSBsaXN0LgotV2UgZ2VuZXJhbGx5IHB1dCBhbGwgdGhlIHRvb2xzIHNvbWV3aGVyZSBsaWtlIHtCb290fUN5Z251czpsYXRlc3Q6YmluLAotYW5kIHRoZW4gYWRkIHRvIGEgVXNlclN0YXJ0dXAgZmlsZToKLQotCXNldCBDb21tYW5kcyAie0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW46LHtDb21tYW5kc30iCi0KLUhvd2V2ZXIsIHRoZSBjcHAgYW5kIGNjMSBwcm9ncmFtcyBvZiBHQ0MgYXJlIG5vdCBub3JtYWxseSBzdG9yZWQgaGVyZS4KLUluc3RlYWQsIHRoZXkgd2lsbCBiZSBpbiBhICJsaWIiIGRpcmVjdG9yeSB0aGF0IGlzIGFsb25nc2lkZSAiYmluIiwKLWFuZCBvcmdhbml6ZWQgYnkgdGFyZ2V0IGFuZCB2ZXJzaW9uIHVuZGVybmVhdGgsIHdpdGggbmFtZXMgbGlrZQotCi0JOmxpYjpnY2MtbGliOjx0YXJnZXQ+OmN5Z251cy08dmVyc2lvbj46Ci0KLUlmIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdXJzZWxmIGFjY29yZGluZyB0byB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBiZWxvdywgdGhlbiB5b3Ugd2lsbCBub3QgaGF2ZSBhbnkgcHJvYmxlbXMuICBIb3dldmVyLCB5b3UKLW1heSBkaXNjb3ZlciB0aGF0IEdDQyBzZWVtcyB1bmFibGUgdG8gZmluZCB0aGUgcmlnaHQgY3BwIGFuZCBjYzE7Ci11c3VhbGx5IHRoaXMgd2lsbCBiZSBiZWNhdXNlIGRpcmVjdG9yeSBuYW1lcyBoYXZlIGNoYW5nZWQuICAoRXZlbgotcmVuYW1pbmcgeW91ciBoYXJkIGRpc2sgd2lsbCBtYWtlIHRoaXMgaGFwcGVuLikgIEluIHN1Y2ggY2FzZXMsIHlvdQotaGF2ZSBzZXZlcmFsIGNob2ljZXMuICBPbmUgaXMganVzdCB0byBhZGQgdGhpcyBkaXJlY3RvcnkgdG8KLXtDb21tYW5kc30sIGJ1dCB0aGVuIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCBhbnkgb3RoZXIgY3BwIG9yIGNjMSwKLXN1Y2ggYXMgdGhvc2UgdXNlZCBieSBhIGRpZmZlcmVudCB0YXJnZXQgb3IgdmVyc2lvbi4gIEFub3RoZXIgd2F5IGlzCi10byByZW5hbWUgeW91ciBkaXNrIGFuZCBkaXJlY3RvcmllcyB0byBtYXRjaCB0aGUgcHJlZml4IHVzZWQgd2hlbiB0aGUKLXRvb2xzIHdlcmUgY29tcGlsZWQuICBGaW5hbGx5LCB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUKLUdDQ19FWEVDX1BSRUZJWCB0byBwb2ludCB0byB0aGUgbGlicmFyeSBkaXJlY3Rvcnk6Ci0KLQlzZXQgR0NDX0VYRUNfUFJFRklYIE15RGlzazpTdHVmZjpsaWI6Z2NjLWxpYjoKLQlleHBvcnQgR0NDX0VYRUNfUFJFRklYCi0KLVlvdSBtYXkgYWxzbyB3YW50IHRvIGVkaXQgTVBXJ3MgSEVYQSAxMjggcmVzb3VyY2UuICBXaGVuIEdDQyBpcyBidWlsdAotdXNpbmcgYSBuYXRpdmUgR0NDLCBpdCBpcyBjb21waWxlZCB0byB1c2UgYSBzcGVjaWFsIHN0YWNrIGFsbG9jYXRvcgotZnVuY3Rpb24gYWxsb2NhKCkuICBXaGlsZSB0aGlzIGlzIHZlcnkgZWZmaWNpZW50LCBpdCBtZWFucyB0aGF0IEdDQwotd2lsbCBuZWVkIGNvbnNpZGVyYWJsZSBzdGFjayBzcGFjZSB0byBydW4sIGVzcGVjaWFsbHkgd2hlbiBjb21waWxpbmcKLWxhcmdlIHByb2dyYW1zIHdpdGggb3B0aW1pemF0aW9uIHR1cm5lZCBvbi4gIFlvdSBnaXZlIE1QVyBtb3JlIHN0YWNrCi1ieSBlZGl0aW5nIHRoZSBIRVhBIDEyOCByZXNvdXJjZSBvZiB0aGUgTVBXIFNoZWxsLiAgQSB2YWx1ZSBvZiAiMDAwOAotMDAwMCIgZ2l2ZXMgNTEySyBvZiBzdGFjayBzaXplLCB3aGljaCBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuCi0KLVVTSU5HIEdOVSBUT09MUwotCi0qIFVzaW5nIE5hdGl2ZSBQb3dlck1hYyBHQ0MKLQotVXNpbmcgYSBuYXRpdmUgUG93ZXJNYWMgR0NDIHRvIHByb2R1Y2UgTVBXIHRvb2xzIG9yIE1hY09TIGFwcGxpY2F0aW9ucwotaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIGp1c3QgImdDIGZvby5jIiwgYWx0aG91Z2ggbm8gbW9yZSBjb21wbGljYXRlZAotdGhhbiB3aXRoIG90aGVyIE1hYyBjb21waWxlcnMuCi0KLVRvIGJ1aWxkIGEgbmF0aXZlIFBvd2VyTWFjIE1QVyB0b29sLCB1c2UgdGhpcyBzZXF1ZW5jZSwgd2hlcmUgaGVsbG8uYwotaXMgdGhlIHVzdWFsICJoZWxsbyB3b3JsZCIgcHJvZ3JhbSwgYW5kIGdlbmVyaWNjZnJnLnIgaXMgdGhlIFJleiBmaWxlCi13aXRoIHRoZSBjb2RlIGZyYWdtZW50IHJlc291cmNlOgotCi1nQyAtSXtDSW5jbHVkZXN9IC1mbm8tYnVpbHRpbiAtRHBhc2NhbD0gLWMgLWcgaGVsbG8uYwotUFBDTGluayBoZWxsby5vIC1vIGhlbGxvIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotcmV6IC1kIEFQUE5BTUU9JyInaGVsbG8nIicgR2VuZXJpY0NGUkcuciAtbyBoZWxsbwotc2V0ZmlsZSAtdCAnTVBTVCcgLWMgJ01QUyAnIGhlbGxvCi0KLVRoZSBzYW1lIHNlcXVlbmNlIHdvcmtzIHRvIGJ1aWxkIGEgTWFjT1MgYXBwbGljYXRpb24sIGJ1dCB5b3Ugc2V0IHRoZSBmaWxlCi10eXBlIHRvICdBUFBMJyBhbmQgZG9uJ3QgbGluayBpbiBQUENUb29sTGlicy5vLiAgRm9yIGZ1cnRoZXIgZGV0YWlscyBvbgotdXNpbmcgTVBXIHRvIGJ1aWxkIE1hYyBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgZ2VuZXJhbCBNUFcgZG9jdW1lbnRhdGlvbi4KLQotUmVjZW50IHZlcnNpb25zIG9mIFBQQ0xpbmsgaGF2ZSBhbiBvcHRpb24gdG8gZ2VuZXJhdGUgdGhlIGNvZGUKLWZyYWdtZW50IHJlc291cmNlIGFuZCBhdXRvbWF0aWNhbGx5IHNldCBjcmVhdG9yIGFuZCBmaWxlIHR5cGU7Ci1oZXJlIGlzIHdoYXQgR2VuZXJpY0NGUkcuciBzaG91bGQgbG9vayBsaWtlIGlmIHlvdSBoYXZlIGFuIG9sZGVyCi1QUENMaW5rIG9yIGFyZSB1c2luZyBHTlUgbGQ6Ci0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGtQb3dlclBDLAotICAgICAgICAgICAgICAgIGtGdWxsTGliLAotICAgICAgICAgICAgICAgIGtOb1ZlcnNpb25OdW0sa05vVmVyc2lvbk51bSwKLSAgICAgICAgICAgICAgICAwLDAsCi0gICAgICAgICAgICAgICAga0lzQXBwLGtPbkRpc2tGbGF0LGtaZXJvT2Zmc2V0LGtXaG9sZUZvcmssCi0gICAgICAgICAgICAgICAgQVBQTkFNRSAvLyBtdXN0IGJlIGRlZmluZWQgb24gUmV6IGNvbW1hbmQgbGluZSB3aXRoIC1kIG9wdGlvbgotICAgICAgICB9Ci19OwotCi1JbiBnZW5lcmFsIHRoaXMgcG9ydCBvZiBHQ0Mgc3VwcG9ydHMgdGhlIHNhbWUgb3B0aW9uIHN5bnRheCBhbmQKLWJlaGF2aW9yIGFzIGl0cyBVbml4IGNvdW50ZXJwYXJ0LiAgSXQgYWxzbyBoYXMgc2ltaWxhciBjb21waWxhdGlvbgotcnVsZXMsIHNvIGl0IHdpbGwgcnVuIHRoZSBhc3NlbWJsZXIgb24gLnMgZmlsZXMgYW5kIHNvIGZvcnRoLgotCi1UaGUgR0NDIG1hbnVhbCBpbmNsdWRlcyBmdWxsIGluZm9ybWF0aW9uIG9uIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KLU9uZSBvcHRpb24gdGhhdCBtYXkgYmUgZXNwZWNpYWxseSB1c2VmdWwgaXMgIi12Iiwgd2hpY2ggc2hvd3MgeW91IHdoYXQKLXRvb2xzIGFuZCBvcHRpb25zIGFyZSBiZWluZyB1c2VkOyB1bmxpa2UgbW9zdCBNYWMgQyBjb21waWxlcnMsIEdDQwotZGlyZWN0cyBhc3NlbWJseSBhbmQgbGlua2luZyBpbiBhZGRpdGlvbiB0byBjb21waWxhdGlvbi4KLQotTVBXIEdDQyBkb2VzIGZlYXR1cmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhlIG9wdGlvbiBzeW50YXg7ICctZCBtYWNybz1uYW1lJwotd29ya3MganVzdCBhcyAnLURtYWNybz1uYW1lJyBkb2VzIGluIFVuaXgsIGFuZCAnLWkgZGlyZWN0b3J5JyB3b3JrcyB0aGUKLXNhbWUgYXMgJy1JZGlyZWN0b3J5Jy4KLQotTVBXIEdDQyBzdXBwb3J0cyB0aGUgdXN1YWwgUGFzY2FsLXN0eWxlIHN0cmluZ3MgYW5kIGFsaWdubWVudCBwcmFnbWFzLgotCi1UbyBmaW5kIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgeW91IGNhbiBzZXQgdGhlIHZhcmlhYmxlIEdDQ0luY2x1ZGVzOgotCi0Jc2V0IEdDQ0luY2x1ZGVzIE15RGlzazpNeUluY2x1ZGVzOgotCWV4cG9ydCBHQ0NJbmNsdWRlcwotCi1HQ0NJbmNsdWRlcyBpcyBzaW1pbGFyIHRvIE1QVydzIENJbmNsdWRlcyBvciBDVydzIE1XQ0luY2x1ZGVzLiAgSW4KLW9yZGVyIHRvIHVzZSBNUFcncyB1c3VhbCBpbmNsdWRlIGZpbGVzLCBqdXN0IHNheToKLQotCXNldCBHQ0NJbmNsdWRlcyAie0NJbmNsdWRlc30iCi0JZXhwb3J0IEdDQ0luY2x1ZGVzCi0KLSogVXNpbmcgR0NDIGFzIGEgQ3Jvc3MtQ29tcGlsZXIKLQotSWYgeW91IGhhdmUgYSBjcm9zcy1jb21waWxlciwgYW5kIHlvdSBoYXZlIGFsbCBvZiB0aGUgY29ycmVjdAotdGFyZ2V0LXNpZGUgY3J0MCBhbmQgbGlicmFyaWVzIGF2YWlsYWJsZSwgdGhlbiB0byBjb21waWxlIGFuZCBsaW5rIGEKLWZpbGUgImZvby5jIiwgeW91IGNhbiBzYXkganVzdAotCi0JZ0MgZm9vLmMKLQotVGhlIG91dHB1dCBmaWxlIHdpbGwgYmUgYW4gTVBXIGJpbmFyeSBmaWxlIG5hbWVkICJhLm91dCI7IHRoZSBmb3JtYXQKLW9mIHRoZSBjb250ZW50cyB3aWxsIGRlcGVuZCBvbiB3aGljaCB0YXJnZXQgaXMgaW4gdXNlLCBzbyBmb3IgaW5zdGFuY2UKLWEgTUlQUy10YXJnZXRpbmcgR0NDIHdpbGwgcHJvZHVjZSBFQ09GRiBvciBFTEYgZXhlY3V0YWJsZXMuCi0KLU5vdGUgdGhhdCB1c2luZyBNUFcgaW5jbHVkZSBmaWxlcyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIgaXMgc29tZXdoYXQKLWRhbmdlcm91cy4KLQotKiBVc2luZyB0aGUgQXNzZW1ibGVyIGFuZCBGcmllbmRzCi0KLVRoZSBhc3NlbWJsZXIgKCJhcyIpIGFuZCBsaW5rZXIgKCJsZCIpIGFyZSBmYWl0aGZ1bCBwb3J0cyBvZiB0aGVpcgotVW5peCBjb3VudGVycGFydHMuICBTaW1pbGFybHksIHRoZSBiaW51dGlscyAiYXIiLCAiY3BsdXNmaWx0IiwgIm5tIiwKLSJvYmpjb3B5IiwgIm9iamR1bXAiLCAicmFubGliIiwgInNpemUiLCAic3RyaW5ncyIsIGFuZCAic3RyaXAiIGFyZSBhbGwKLWxpa2UgdGhleSBhcmUgdW5kZXIgVW5peC4gIChOb3RlIHRoYXQgImNwbHVzZmlsdCIgaXMgdXN1YWxseSBjYWxsZWQKLSJjKytmaWx0IiB1bmRlciBVbml4LikKLQotKiBVc2luZyBHREIKLQotVGhlcmUgYXJlIHR3byBmbGF2b3JzIG9mIEdEQi4gICJnZGIiIGlzIGFuIE1QVyB0b29sIHRoYXQgd29ya3MgdmVyeQotbXVjaCBsaWtlIGl0IGRvZXMgaW4gVW5peDsgcHV0IGEgY29tbWFuZCBpbnRvIHRoZSBNUFcgd29ya3NoZWV0IGFuZAotdHlwZSB0aGUgPGVudGVyPiBrZXkgdG8gc2VuZCBpdCB0byBHREIuICBXaGlsZSAiZ2RiIiBpcyBydW5uaW5nLCB5b3UKLWNhbm5vdCBkbyBhbnl0aGluZyBlbHNlIGluIE1QVywgYWx0aG91Z2ggeW91IGNhbiBzd2l0Y2ggdG8gb3RoZXIKLU1hYyBhcHBsaWNhdGlvbnMgYW5kIHVzZSB0aGVtLgotCi0iU2lvd0dEQiIgaXMgYWxzbyBhIE1hYyBhcHBsaWNhdGlvbiwgYnV0IGl0IGlzIEdEQiB1c2luZyB0aGUgU0lPVwotcGFja2FnZSB0byBwcm92aWRlIGNvbnNvbGUgZW11bGF0aW9uLiAgQ29tbWFuZHMgYXJlIGV4YWN0bHkgYXMgZm9yIHRoZQotTVBXIHRvb2wsIGJ1dCBzaW5jZSB0aGlzIGlzIGl0cyBvd24gYXBwbGljYXRpb24sIHlvdSBjYW4gc3dpdGNoCi1iZXR3ZWVuIGl0IGFuZCBNUFcuCi0KLUJVSUxESU5HIEdOVSBUT09MUwotCi1UaGlzIHBvcnQgb2YgdGhlIEdOVSB0b29scyB1c2VzIGEgY29uZmlndXJlIHNjcmlwdCBzaW1pbGFyIHRvCi10aGF0IHVzZWQgZm9yIEdOVSB0b29scyB1bmRlciBVbml4LCBidXQgcmV3cml0dGVuIGZvciBNUFcuICBBcyB3aXRoCi1Vbml4IGNvbmZpZ3VyYXRpb24sIHRoZXJlIGlzIGFuICJvYmplY3QiIGRpcmVjdG9yeSB0aGF0IG1heSBiZQotZGlmZmVyZW50IGZyb20gdGhlICJzb3VyY2UiIGRpcmVjdG9yeS4gIEluIHRoZSBleGFtcGxlIGNvbW1hbmRzIGJlbG93LAotd2Ugd2lsbCBhc3N1bWUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCBhbmQgdGhhdAotdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgIntCb290fUN5Z251czpzcmM6Ii4KLQotKiBSZXF1aXJlbWVudHMgZm9yIEJ1aWxkaW5nCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIGEgc2V0IG9mIHRvb2xzIHRoYXQgdGhlCi1jb25maWd1cmUgYW5kIGJ1aWxkIHNjcmlwdHMgYXNzdW1lIHRvIGJlIGF2YWlsYWJsZS4gIFRoZXNlIHRvb2xzCi0oYW5kIHRoZWlyIHZlcnNpb25zLCBpZiByZWxldmFudCkgYXJlIGFzIGZvbGxvd3M6Ci0KLQlieWFjYyB0b29sCi0JZmxleCAoMi4zLjcpIHRvb2wgKGFuZCBGbGV4LnNrZWwgZmlsZSkKLQlmb3J3YXJkLWluY2x1ZGUgc2NyaXB0Ci0JTW92ZUlmQ2hhbmdlIHNjcmlwdAotCW1wdy10b3VjaCBzY3JpcHQKLQltcHctdHJ1ZSBzY3JpcHQKLQlOZXdGb2xkZXJSZWN1cnNpdmUgc2NyaXB0Ci0JbnVsbC1jb21tYW5kIHNjcmlwdAotCW9wZW4tYnJhY2Ugc2NyaXB0Ci0Jc2VkICgxLjEzKSB0b29sCi0JdHItN3RvOCBzY3JpcHQKLQl0cnVlIHNjcmlwdAotCi1UaGUgc2NyaXB0cyBhcmUgaW4gdGhlIHNvdXJjZXMsIHVuZGVyIHV0aWxzOm1wdzouIFlvdSBtdXN0IGFycmFuZ2UgdG8KLWdldCB0aGUgb3RoZXIgdG9vbHMgeW91cnNlbGYgKHRoZXkgYXJlIHJlYWRpbHkgYXZhaWxhYmxlIGZyb20gdGhlCi0idXN1YWwiIG5ldCBzaXRlcywgYW5kIGFyZSBhbHNvIG9uIG1hbnkgQ0RST01TKS4gIEluIGFkZGl0aW9uLCB0aGVyZQotd2lsbCB1c3VhbGx5IGJlIGEgc2V0IG9mIHRoZXNlIGF2YWlsYWJsZSBhdCBmdHAuY3lnbnVzLmNvbSwgaW4gcHViL21hYy4KLQotWW91IG1heSBwdXQgdGhlIGJ1aWxkIHRvb2xzIGluIHlvdXIgdXN1YWwgVG9vbHMgb3IgU2NyaXB0cwotZGlyZWN0b3JpZXMsIG9yIGtlZXAgdGhlbSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yaWVzLiAgV2UgcHJlZmVyIHRvCi1tYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYnVpbGR0b29scyIgYW5kIHdlIHB1dCB0aGlzIGluIG9uZSBvZiBvdXIKLVVzZXJTdGFydHVwIGZpbGVzOgotCi0Jc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6YnVpbGR0b29sczose0NvbW1hbmRzfSIKLQotRmxleCB1c2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEZMRVhfU0tFTEVUT04gdG8gbG9jYXRlIGl0cyBza2VsZXRvbgotZmlsZSwgc28geW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcywgcHJlZmVyYWJseSBpbiBhIFVzZXJTdGFydHVwOgotCi0JU2V0IEZMRVhfU0tFTEVUT04gIntCb290fSJDeWdudXM6YnVpbGR0b29sczpGbGV4LnNrZWwKLQlFeHBvcnQgRkxFWF9TS0VMRVRPTgotCi0qIENvbmZpZ3VyaW5nCi0KLUJlZm9yZSB5b3UgY2FuIGJ1aWxkIGFueXRoaW5nLCB5b3UgbXVzdCBjb25maWd1cmUuICBZb3UgZG8gdGhpcyBieQotY3JlYXRpbmcgYW4gZGlyZWN0b3J5IHdoZXJlIG9iamVjdCBmaWxlcyB3aWxsIGJlIHN0b3JlZCwgc2V0ZGlyZWN0b3J5Ci10byB0aGF0IGRpcmVjdG9yeSBhbmQgZG8gYSBjb25maWd1cmUgY29tbWFuZDoKLQotCXtCb290fUN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLXRhcmdldCA8bmFtZT4gLS1jYyA8Y29tcGlsZXI+IC0tc3JjZGlyIHtCb290fUN5Z251czpzcmM6IC0tcHJlZml4IDx3aGF0ZXZlcj4KLQotSWYgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IGluIHlvdXIge0NvbW1hbmRzfSBsaXN0LCB0aGVuIHlvdSBtdXN0Ci1zdXBwbHkgYSBmdWxsIHBhdGhuYW1lIHRvIG1wdy1jb25maWd1cmUsIHNpbmNlIG1wdy1jb25maWd1cmUgaW52b2tlcwotaXRzZWxmIGFmdGVyIHN3aXRjaGluZyBpbnRvIGVhY2ggc3ViZGlyZWN0b3J5LiAgVXNpbmcgYSByZWxhdGl2ZQotcGF0aG5hbWUsIGV2ZW4gc29tZXRoaW5nIGxpa2UgJzptcHctY29uZmlndXJlJywgd2lsbCB0aGVyZWZvcmUgbm90IHdvcmsuCi0KLTxuYW1lPiBtdXN0IGJlIGEga25vd24gdGFyZ2V0LiAgVmFsaWQgb25lcyBpbmNsdWRlICJtNjhrLWFwcGxlLW1hY29zIiwKLSJwb3dlcnBjLWFwcGxlLW1hY29zIiwgImkzODYtdW5rbm93bi1nbzMyIiwgIm1pcHMtaWR0LWVjb2ZmIiwgYW5kCi0ic2gtaGl0YWNoaS1obXMiLiAgTm90IGFsbCB0YXJnZXQgdHlwZXMgYXJlIGFjY2VwdGVkIGZvciBhbGwgb2YgdGhlCi10b29scyB5ZXQuCi0KLTxjb21waWxlcj4gbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gdXNlLiAgSXQgZGVmYXVsdHMgdG8gIm1wd2MiLgotCi0JKG02OGspCi0JbXB3YwlNUFcgQwotCXNjNjhrCVN5bWFudGVjIEMKLQltd2M2OGsJTWV0cm93ZXJrcyBDIChDb2Rld2FycmlvcikKLQlnY2M2OGsJR0NDCi0KLQkocG93ZXJwYykKLQlwcGNjCVBQQ0MKLQltcmMJTWFjaW50b3NoIG9uIFJpc0MgKE1pc3RlciBDLCBha2EoPykgRnJhbmtlbnN0ZWluKQotCXNjcHBjCVN5bWFudGVjIEMKLQltd2NwcGMJTWV0cm93ZXJrcyBDIChDb2Rld2FycmlvcikKLQlnY2NwcGMJR0NDCi0KLU5vdCBhbGwgY29tcGlsZXJzIHdpbGwgY29tcGlsZSBhbGwgdG9vbHMgZXF1YWxseSB3ZWxsISAgRm9yIG02OGsgTWFjcywKLU1QVyBDIGhhcyB0aGUgYmVzdCByZWNvcmQgc28gZmFyIChpdCBoYXMgcHJvYmxlbXMsIGJ1dCB0aGV5IGNhbiBiZQotd29ya2VkIGFyb3VuZCksIHdoaWxlIGZvciBQb3dlck1hY3MsIENvZGVXYXJyaW9yIGlzIHRoZSBvbmx5IGNvbXBpbGVyCi10aGF0IGhhcyBzdWNjZXNzZnVsbHkgY29tcGlsZWQgZXZlcnl0aGluZyBpbnRvIHJ1bm5pbmcgY29kZS4KLQotPHByZWZpeD4gaXMgdGhlIHBhdGggdGhhdCAiZ2NjIiB3aWxsIHByZXBlbmQgd2hlbiBsb29raW5nIGZvciB0b29scwotdG8gZXhlY3V0ZS4gIEdDQ19FWEVDX1BSRUZJWCBvdmVycmlkZXMgdGhpcyB2YWx1ZSwgc28geW91IG5lZWQgbm90Ci1pbmNsdWRlIGl0IGlmIHlvdSBwbGFuIHRvIHVzZSBHQ0NfRVhFQ19QUkVGSVguCi0KLUFzIGFuIGV4YW1wbGUsIGhlcmUgaXMgdGhlIGNvbmZpZ3VyZSBsaW5lIHRoYXQgeW91IGNvdWxkIHVzZSB0byBidWlsZAotbmF0aXZlIFBvd2VyTWFjIEdDQzoKLQotIntCb290fSJDeWdudXM6c3JjOm1wdy1jb25maWd1cmUgLS1jYyBtd2NwcGMgLS10YXJnZXQgcG93ZXJwYy1hcHBsZS1tYWNvcyAtLXNyY2RpciAie0Jvb3R9IkN5Z251czpzcmM6IC0tcHJlZml4ICJ7Qm9vdH0iR05VVG9vbHM6Ci0KLSogQnVpbGRpbmcKLQotSWYgeW91IHVzZSBDb2RlV2FycmlvciwgeW91ICptdXN0KiBmaXJzdCBzZXQgTVdDSW5jbHVkZXMgdG8KLXtDSW5jbHVkZXN9LiAgVGhpcyBpcyBiZWNhdXNlIHlvdSB3aWxsIGJlIGJ1aWxkaW5nIE1QVyB0b29scywgYW5kCi10aGVpciBzdGFuZGFyZCBJL08gd29ya3MgYnkgbWFraW5nIHJlZmVyZW5jZXMgdG8gZGF0YSB0aGF0IGlzIHBhcnQgb2YKLXRoZSBNUFcgU2hlbGwsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNvZGUgbXVzdCBiZSBjb21waWxlZCBhbmQgbGlua2VkCi13aXRoIG1hY3JvcyB0aGF0IHJlZmVyIHRvIHRoYXQgZGF0YSwgYW5kIHRob3NlIG1hY3JvcyBhcmUgaW4KLXtDSW5jbHVkZXN9LCBub3QgdGhlIGRlZmF1bHQge01XQ0luY2x1ZGVzfS4gIFdpdGhvdXQgdGhpcyBjaGFuZ2UsIHlvdQotd2lsbCBlbmNvdW50ZXIgcHJvYmxlbXMgY29tcGlsaW5nIGxpYmliZXJ0eS9tcHcuYywgYnV0IHR3ZWFraW5nIHRoYXQKLWZpbGUgb25seSBtYXNrcyB0aGUgcmVhbCBwcm9ibGVtLCBhbmQgZG9lcyBub3QgZml4IGl0LgotCi1UaGUgY29tbWFuZAotCi0JbXB3LWJ1aWxkCi0KLXdpbGwgYnVpbGQgZXZlcnl0aGluZy4gQnVpbGRpbmcgd2lsbCB0YWtlIG92ZXIgYW4gaG91ciBvbiBhIFF1YWRyYSA4MDAKLW9yIFBvd2VyTWFjIDgxMDAvMTEwLCBsb25nZXIgaWYgdGhlIHNvdXJjZXMgYXJlIG9uIGEgc2hhcmVkIHZvbHVtZS4KLQotWW91IG1heSBzZWUgc29tZSB3YXJuaW5nczsgdGhlc2UgYXJlIG1vc3RseSBsaWtlbHkgYmVuaWduLCB0eXBpY2FsbHkKLWRpc2FncmVlbWVudHMgYWJvdXQgZGVjbGFyYXRpb25zIG9mIGxpYnJhcnkgYW5kIHN5c3RlbSBmdW5jdGlvbnMuCi0KLSogSW5zdGFsbGluZwotCi1UbyBpbnN0YWxsIHRoZSBqdXN0LWJ1aWx0IHRvb2xzLCB1c2UgdGhlIGNvbW1hbmQKLQotCW1wdy1idWlsZCBpbnN0YWxsCi0KLVRoaXMgcGFydCBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBqdXN0IGNvcGllcyBmaWxlcyB0byB0aGUKLWxvY2F0aW9uIHNwZWNpZmllZCBhdCBjb25maWd1cmUgdGltZSBieSA8cHJlZml4PiwgYW5kLCBpbiBzb21lIGNhc2VzLAotcmVuYW1lcyB0aGVtIGZyb20gdGVtcG9yYXJ5IGludGVybmFsIG5hbWVzIHRvIHRoZWlyIHVzdWFsIG5hbWVzLiBUaGlzCi1pbnN0YWxsIHByb2Nlc3MgaXMgKm5vdCogdGhlIHNhbWUgYXMgd2hhdCB0aGUgSW5zdGFsbCBzY3JpcHQgZG9lczsKLUluc3RhbGwgY2FuIGNvcHkgdG9vbHMgZnJvbSB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGNob3NlbiBhdAotY29uZmlndXJhdGlvbiB0aW1lIHRvIGEgdXNlci1jaG9zZW4gcGxhY2UsIGFuZCBzZXRzIHVwIGEgVXNlclN0YXJ0dXAKLWZpbGUuICBOb3RlIHRoYXQgd2hpbGUgdGhlIEluc3RhbGwgc2NyaXB0IGlzIG9wdGlvbmFsLCB0aGUgaW5zdGFsbAotYnVpbGQgYWN0aW9uIHBlcmZvcm1zIHNvbWUgdGFza3Mgd291bGQgYmUgdmVyeSBoYXJkIHRvIHJlcGxpY2F0ZQotbWFudWFsbHksIHNvIHlvdSBzaG91bGQgYWx3YXlzIGRvIGl0IGJlZm9yZSB1c2luZyB0aGUgdG9vbHMuCi0KLSogS25vd24gUHJvYmxlbXMgV2l0aCBVc2luZyBWYXJpb3VzIENvbXBpbGVycyB0byBCdWlsZAotCi1Nb3N0IHZlcnNpb25zIG9mIE1QVyBDIGhhdmUgcHJvYmxlbXMgd2l0aCBjb21waWxpbmcgR05VIHNvZnR3YXJlLgotCi1NUFcgQyAzLjIueCBoYXMgcHJlcHJvY2Vzc2luZyBidWdzIHRoYXQgcmVuZGVyIGl0IGluY2FwYWJsZSBvZgotY29tcGlsaW5nIHRoZSBCRkQgbGlicmFyeSwgc28gaXQgY2FuJ3QgYmUgdXNlZCBhdCBhbGwgZm9yIGJ1aWxkaW5nIEJGRC4KLQotTVBXIEMgMy4zLCAzLjMuMSwgYW5kIDMuMy4yIHdpbGwgc3BvbnRhbmVvdXNseSBjbGFpbSB0byBoYXZlIGZvdW5kCi1lcnJvcnMgaW4gdGhlIHNvdXJjZSBjb2RlLCBidXQgaW4gZmFjdCB0aGUgY29kZSBpcyBwZXJmZWN0bHkgZmluZS4gIElmCi10aGlzIGhhcHBlbnMsIGp1c3Qgc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHRoZSB0b3AtbGV2ZWwKLW9iamRpciAod2hlcmUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGFib3ZlIHdhcyBwZXJmb3JtZWQpLCBhbmQgdHlwZQotIm1wdy1idWlsZCBhbGwiIGFnYWluLiAgSWYgaXQgZ29lcyBvbiB0aHJvdWdoIHRoZSBzdXBwb3NlZCBlcnJvciwgdGhlbgoteW91IGdvdCBvbmUgb2YgdGhlIHNwdXJpb3VzIGVycm9ycy4gIEEgZnVsbCBidWlsZCBtYXkgcmVxdWlyZSBhIG51bWJlcgotb2YgdGhlc2UgcmVzdGFydHMuCi0KLU1QVyBDIDMuMy4zIHNlZW1zIHRvIHdvcmsgT0ssIGF0IGxlYXN0IHdpdGggdGhlIGFpZCBvZiBhIG51bWJlciBvZgotd29ya2Fyb3VuZHMgdGhhdCBhcmUgaW4gdGhlIHNvdXJjZXMgKGxvb2sgZm9yICNpZmRlZiBNUFdfQykuCi0KLVZlcnNpb25zIG9mIE1QVyBNYWtlIGVhcmxpZXIgdGhhbiA0LjBkMiBoYXZlIGV4aGliaXRlZCBiaXphcnJlIGJlaGF2aW9yLAotZmFpbHVyZSB0byBzdWJzdGl0dXRlIHZhcmlhYmxlcyBhbmQgdGhlIGxpa2UuCi0KLU1ldHJvd2Vya3MgQ1c2IFBQQyBsaW5rZXIgKE1XTGlua1BQQykgc2VlbXMgdG8gZG8gYmFkIHRoaW5ncyB3aXRoIG1lbW9yeQotaWYgdGhlICJNb2Rlcm4gTWVtb3J5IE1hbmFnZXIiIGlzIHR1cm5lZCBvbiAoaW4gdGhlIE1lbW9yeSBjb250cm9sIHBhbmVsKSwKLWJ1dCB3b3JrcyBPSyBpZiBpdCBpcyB0dXJuZWQgb2ZmLgotCi1NZXRyb3dlcmtzIENXNiBsb3NlcyBiaWd0aW1lIGNvbXBpbGluZyBvcGNvZGVzOnBwYy1vcGMuYywgd2hpY2ggaGFzCi1zb21lIGRlZXBseSBuZXN0ZWQgbWFjcm9zLiAgKENXNyBpcyBPSy4pICBUaGVyZSBpcyBhIHdheSB0byBwYXRjaCB0aGUKLWZpbGUsIGJ5IHN1YnN0aXR1dGluZyBjb25zdGFudCB2YWx1ZXMuICBJZiB5b3UgbmVlZCB0byBkbyB0aGlzLAotY29udGFjdCBzaGVic0BjeWdudXMuY29tIGZvciBkZXRhaWxzLgotCi08R2VzdGFsdC5oPiBpcyBtaXNzaW5nIGZyb20ge0NJbmNsdWRlc30gaW4gdGhlIE1QVyB2ZXJzaW9uIHRoYXQgY29tZXMKLXdpdGggQ1c3LiAgWW91IGNhbiBqdXN0IGNvcHkgdGhlIG9uZSBpbiBDVzcncyB7TVdDSW5jbHVkZXN9LgotCi1DVzggYW5kIGxhdGVyIGhhdmUgY2hhbmdlcyB0byBoZWFkZXJzIGFuZCBzdWNoIHRoYXQgd2lsbCByZXF1aXJlIGNoYW5nZXMKLXRvIHRoZSBzb3VyY2UgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSB0byByZWJ1aWxkLgotCi1LTk9XTiBCVUdTCi0KLVRoZSBkZWNsYXJhdGlvbnMgZm9yIG1lbWNweSBhbmQgbWVtY21wIGluIHNvbWUgdmVyc2lvbnMgb2YgaGVhZGVyIGZpbGVzCi1tYXkgY29uZmxpY3Qgd2l0aCBHQ0MncyBidWlsdGluIGRlZmluaXRpb24uICBFaXRoZXIgdXNlIC1mbm8tYnVpbHRpbgotb3IgaWdub3JlIHRoZSB3YXJuaW5ncy4KLQotVGhpcyBpcyBub3QgYSBidWcsIGJ1dCAtIHdhdGNoIG91dCBmb3IgY3IvbmwgdHJhbnNsYXRpb24hICBGb3IgaW5zdGFuY2UsCi1pZiBjb25maWcvbXB3LW1oLW1wdyBpcyBub3QgcHJvcGVybHkgdHJhbnNsYXRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuCi1jb3BpZWQgb3IgdXBkYXRlZCBzZXBhcmF0ZWx5LCB0aGVuIGV2ZXJ5dGhpbmcgd2lsbCBhbG1vc3QgYnVpbGQsIGJ1dAoteW91IHdpbGwgZ2V0IHB1enpsaW5nIGVycm9yIG1lc3NhZ2VzIGZyb20gbWFrZSBvciB0aGUgY29tcGlsZXIuCi0KLScvJyBvciAnICcgZW1iZWRkZWQgaW4gYW55IGRldmljZSwgZGlyZWN0b3J5LCBvciBmaWxlIG5hbWUgbWF5IG9yIG1heQotbm90IHdvcmsuCi0KLW9iamNvcHkgLU8gc3JlYyBmb28ubyBtYWtlcyByYW5kb20gb3V0cHV0IGZpbGVuYW1lcy4KLQotTWFjLXgtbWlwcyByZXF1aXJlcyAtbWdhcyBidXQgVW5peCBob3N0cyBkb24ndC4KLQotR0RCIHdpbGwgZnJlcXVlbnRseSByZXF1aXJlIGEgJy8nIG9uIHRoZSBmcm9udCBvZiBhIGRldmljZSBuYW1lIGluIG9yZGVyCi10byByZWNvZ25pemUgaXQgYXMgYW4gYWJzb2x1dGUgcmF0aGVyIHRoYW4gYSByZWxhdGl2ZSBwYXRobmFtZS4KLQotR0RCIGRvZXNuJ3Qgc2VlbSB0byB1c2UgdGhlIHByaW50ZXIgcG9ydCBjb3JyZWN0bHksIGFsdGhvdWdoIGl0IHRyaWVzLgotCi1UaGUgY3Vyc29yIGRvZXNuJ3QgYWx3YXlzIHNwaW4gYXMgbXVjaCBhcyBpdCBzaG91bGQuICBUbyBnZXQgZWxhYm9yYXRlCi1zdGF0aXN0aWNzIGFuZCB3YXJuaW5ncyBhYm91dCBzcGluIHJhdGVzLCBhZGQgdGhpcyB0byBVc2VyU3RhcnR1cDoKLQotCXNldCBNRUFTVVJFX1NQSU4gYWxsCi0JZXhwb3J0IE1FQVNVUkVfU1BJTgpkaWZmIC0tZ2l0IGEvbXB3LWJ1aWxkLmluIGIvbXB3LWJ1aWxkLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5NTMwLi4wMDAwMDAwCi0tLSBhL21wdy1idWlsZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0jIFRvcC1sZXZlbCBzY3JpcHQgZnJhZ21lbnQgdG8gYnVpbGQgZXZlcnl0aGluZyBmb3IgTVBXLgotCi1TZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0KLSNTZXQgRWNobyAxCi0KLVNldCBUaGlzU2NyaXB0ICJ7MH0iCi0KLVNldCBvYmpkaXIgIjoiCi0KLVNldCB2ZXJpZnkgMAotCi1TZXQgQnVpbGRUYXJnZXQgIm5vbmUiCi0KLSMgUGFyc2UgYXJndW1lbnRzLgotCi1Mb29wCi0JQnJlYWsgSWYgeyN9ID09IDAKLQkJSWYgIntCdWlsZFRhcmdldH0iID1+IC9ub25lLwotCQkJU2V0IEJ1aWxkVGFyZ2V0ICJ7MX0iCi0JCUVsc2UKLQkJCUVjaG8gT25seSBvbmUgYnVpbGQgdGFyZ2V0IGFsbG93ZWQsIGlnbm9yaW5nICJ7MX0iCi0JCUVuZCBJZgotCVNoaWZ0IDEKLUVuZCBMb29wCi0KLUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvbm9uZS8KLQlTZXQgQnVpbGRUYXJnZXQgImFsbCIKLUVuZCBJZgotCi1JZiB7dmVyaWZ5fSA9PSAxCi0JRWNobyAiIyIgRG9pbmcgIntUaGlzU2NyaXB0fSIgIntCdWlsZFRhcmdldH0iIGluICJgRGlyZWN0b3J5YCIgLi4uIAotRW5kIElmCi0KLVNldCByYW5tYWtlIDAKLQotSWYgImBFeGlzdHMgTWFrZWZpbGVgIiAhPSAiIgotCUVjaG8gIlNldCBFY2hvIDEiID57QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlNYWtlIC1mIE1ha2VmaWxlIHtCdWlsZFRhcmdldH0gPj57QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQl7QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlEZWxldGUge0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JU2V0IHJhbm1ha2UgMQotRW5kIElmCi0KLUlmICJgRXhpc3RzIE1ha2VmaWxlLlBQQ2AiICE9ICIiCi0JRWNobyAiU2V0IEVjaG8gMSIgPntCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlNYWtlIC1mIE1ha2VmaWxlLlBQQyB7QnVpbGRUYXJnZXR9ID4+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCXtCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlEZWxldGUge0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCVNldCByYW5tYWtlIDEKLUVuZCBJZgotCi1JZiB7cmFubWFrZX0gPT0gMQotCUV4aXQKLUVuZCBJZgotCi0jIERpc3BhdGNoIG9uIHZhcmlvdXMgcHNldWRvLXRhcmdldHMuCi0KLUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLwotCUVjaG8gU3RhcnRlZCBgRGF0ZWAKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2NjCi0JIntUaGlzU2NyaXB0fSIgYWxsLWdkYgotCUVjaG8gRmluaXNoZWQgYERhdGVgCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWxpYmliZXJ0eS8KLQkie1RoaXNTY3JpcHR9IiBkby1saWJpYmVydHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYmZkLwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJmZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1vcGNvZGVzLwotCSJ7VGhpc1NjcmlwdH0iIGRvLW9wY29kZXMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYnlhY2MvCi0JIntUaGlzU2NyaXB0fSIgZG8tYnlhY2MKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZmxleC8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgZG8tZmxleAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1iaW51dGlscy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tYmludXRpbHMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2FzLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1nYXMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2NjLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2FzCi0JIntUaGlzU2NyaXB0fSIgYWxsLWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxkCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2NjCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdkYi8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2RiCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdyZXovCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBkby1ncmV6Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWxkLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1sZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJ5YWNjLwotCVNldERpcmVjdG9yeSA6YnlhY2M6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZmxleC8KLQlTZXREaXJlY3RvcnkgOmZsZXg6Ci0JOjptcHctYnVpbGQgX2Jvb3RzdHJhcAotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJmZC8KLQlTZXREaXJlY3RvcnkgOmJmZDoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1saWJpYmVydHkvCi0JU2V0RGlyZWN0b3J5IDpsaWJpYmVydHk6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tb3Bjb2Rlcy8KLQlTZXREaXJlY3RvcnkgOm9wY29kZXM6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBzdGFtcHMKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgc3RhbXBzCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbmV3bGliLwotCVNldERpcmVjdG9yeSA6bmV3bGliOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwvCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LXRvcAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdhcwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2NjCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1sZAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2RiCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS10b3AKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2FzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdjYwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nZGIKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktbGQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktdG9wLwotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie3ByZWZpeH0iCi0JSWYgIntwcmVmaXh9IiAhPSAiYERpcmVjdG9yeWAiCi0JCUR1cGxpY2F0ZSAteSAnUmVhZCBNZSBmb3IgTVBXJyAie3ByZWZpeH0iJ1JlYWQgTWUgZm9yIE1QVycKLQkJRHVwbGljYXRlIC15IEluc3RhbGwgIntwcmVmaXh9Ikluc3RhbGwKLQlFbmQgSWYKLUVsc2UKLQlFY2hvIHtCdWlsZFRhcmdldH0gbm90IHVuZGVyc3Rvb2QsIGlnbm9yaW5nCi1FbmQgSWYKLQotU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCmRpZmYgLS1naXQgYS9tcHctY29uZmlnLmluIGIvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODczNy4uMDAwMDAwMAotLS0gYS9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQ3lnbnVzIHNvdXJjZSB0cmVlLgotCi0jIENoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYWxsIHRoZSBzcGVjaWFsIHRvb2xzIHRoYXQgd2Ugd2lsbCBuZWVkLgotIyBUaGUgdGVzdCBmb3Igc2VkIGlzIHNlbWktcG9pbnRsZXNzLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGludm9rZWQKLSMgYnkgdGhlIGNhbGN1bGF0aW9uIG9mIHRhcmdldF9jcHUgaW4gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdCwgYnV0Ci0jIHRoZSB0ZXN0IHdpbGwgYWxzbyBzaG93IHdoaWNoIG9uZSBpcyBiZWluZyB1c2VkLgotCi1TZXQgRXhpdCAwCi1FY2hvIGJ5YWNjIGlzIGBXaGljaCBieWFjY2AKLUVjaG8gZmxleCBpcyBgV2hpY2ggZmxleGAKLUVjaG8gZm9yd2FyZC1pbmNsdWRlIGlzIGBXaGljaCBmb3J3YXJkLWluY2x1ZGVgCi1FY2hvIE1vdmVJZkNoYW5nZSBpcyBgV2hpY2ggTW92ZUlmQ2hhbmdlYAotRWNobyBtcHctdG91Y2ggaXMgYFdoaWNoIG1wdy10b3VjaGAKLUVjaG8gbXB3LXRydWUgaXMgYFdoaWNoIG1wdy10cnVlYAotRWNobyBOZXdGb2xkZXJSZWN1cnNpdmUgaXMgYFdoaWNoIE5ld0ZvbGRlclJlY3Vyc2l2ZWAKLUVjaG8gbnVsbC1jb21tYW5kIGlzIGBXaGljaCBudWxsLWNvbW1hbmRgCi1FY2hvIG9wZW4tYnJhY2UgaXMgYFdoaWNoIG9wZW4tYnJhY2VgCi1FY2hvIHNlZCBpcyBgV2hpY2ggc2VkYAotRWNobyAndHItN3RvOCcgaXMgYFdoaWNoIHRyLTd0bzhgCi1FY2hvIHRydWUgaXMgYFdoaWNoIHRydWVgCi1TZXQgRXhpdCAxCi0KLVNldCBob3N0X2xpYnMgIm1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggdGNsIHRrIHRjbFgiCi0KLVNldCBob3N0X3Rvb2xzICJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBnZGIgbWFrZSBwYXRjaCBcT3B0aW9uLWQKLQkgICAgcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgc2ltIGJhc2ggXE9wdGlvbi1kCi0JICAgIG00IGF1dG9jb25mIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2cyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIFxPcHRpb24tZAotCSAgICB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCBcT3B0aW9uLWQKLQkgICAgcmVjb2RlIHJlbGVhc2Ugc2VkIHV0aWxzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgZ2F3ayIKLQotU2V0IHRhcmdldF9saWJzICJuZXdsaWIiCi0KLVNldCB0YXJnZXRfdG9vbHMgImV4YW1wbGVzIgotCi0jIENvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgY29tcGlsZXIgaWYgdGFyZ2V0aW5nIE1hY3MuCi1JZiB7dGFyZ2V0X29zfSA9fiAvbWFjb3MvIHx8IHt0YXJnZXRfb3N9ID1+IC9tcHcvCi0JU2V0IGhvc3RfdG9vbHMgIntob3N0X3Rvb2xzfSBncmV6IgotRW5kIElmCi0JCi1TZXQgY29uZmlnZGlycyAie2hvc3RfbGlic30ge2hvc3RfdG9vbHN9IHt0YXJnZXRfbGlic30ge3RhcmdldF90b29sc30iCi1FeHBvcnQgY29uZmlnZGlycwotCi0jIE1ha2UgdXAgYSBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5IHRoYXQgdG9vbHMgd2lsbCBzaGFyZS4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9ImV4dHJhLWluY2x1ZGVgIiA9PSAiIgotCU5ld0ZvbGRlciAie29iamRpcn0iZXh0cmEtaW5jbHVkZQotRW5kIElmCi0KLVNldCBlZGlyICJ7b2JqZGlyfWV4dHJhLWluY2x1ZGU6IgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpmaWxlLmggIntlZGlyfSInc3lzL2ZpbGUuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmlvY3RsLmggIntlZGlyfSInc3lzL2lvY3RsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpwYXJhbS5oICJ7ZWRpcn0iJ3N5cy9wYXJhbS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6cmVzb3VyY2UuaCAie2VkaXJ9IidzeXMvcmVzb3VyY2UuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnN0YXQuaCAie2VkaXJ9IidzeXMvc3RhdC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6dGltZS5oICJ7ZWRpcn0iJ3N5cy90aW1lLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0eXBlcy5oICJ7ZWRpcn0iJ3N5cy90eXBlcy5oJwotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6YW91dDY0LmggIntlZGlyfSInYW91dC9hb3V0NjQuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphci5oICJ7ZWRpcn0iJ2FvdXQvYXIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpyYW5saWIuaCAie2VkaXJ9Iidhb3V0L3JhbmxpYi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJlbG9jLmggIntlZGlyfSInYW91dC9yZWxvYy5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnN0YWIuZGVmICJ7ZWRpcn0iJ2FvdXQvc3RhYi5kZWYnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYl9nbnUuaCAie2VkaXJ9Iidhb3V0L3N0YWJfZ251LmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2FvdXQvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjplY29mZi5oICJ7ZWRpcn0iJ2NvZmYvZWNvZmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2NvZmYvaW50ZXJuYWwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpzeW0uaCAie2VkaXJ9Iidjb2ZmL3N5bS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bWNvbnN0LmggIntlZGlyfSInY29mZi9zeW1jb25zdC5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9Iidjb2ZmLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnJzNjAwMC5oICJ7ZWRpcn0iJ2NvZmYvcnM2MDAwLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Y29tbW9uLmggIntlZGlyfSInZWxmL2NvbW1vbi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYuaCAie2VkaXJ9IidlbGYvZHdhcmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmR3YXJmMi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZjIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmV4dGVybmFsLmggIntlZGlyfSInZWxmL2V4dGVybmFsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2VsZi9pbnRlcm5hbC5oJwotCi0jIEJlbGlldmUgaXQgb3Igbm90LCBHREIgbmVlZHMgdGhpcyBmb3IgYWxsIHRhcmdldHMuCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjptaXBzLmggIntlZGlyfSInZWxmL21pcHMuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2VsZi8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOnBwYy5oICJ7ZWRpcn0iJ2VsZi9wcGMuaCcKLUVuZCBJZgotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInb3Bjb2RlLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6cHBjLmggIntlZGlyfSInb3Bjb2RlL3BwYy5oJwotRW5kIElmCi0KLSMgQWRkIHNvbWUgYmZkIGluY2x1ZGVzIHRoYXQgZ2V0IG1lbnRpb25lZCBvdXRzaWRlIHRoZSBiZmQgZGlyLgotCQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmNvZmYuaCAie2VkaXJ9IidiZmQvbGliY29mZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmVjb2ZmLmggIntlZGlyfSInYmZkL2xpYmVjb2ZmLmgnCi0KLSMgVHJhbnNsYXRlIHJhbmRvbSBmaWxlcyBpbnRvIE1QVy1vbmx5IGNoYXJhY3RlciBzZXQuCi0KLXRyLTd0bzggIntzcmNkaXJ9Im1wdy1SRUFETUUgPiAie29iamRpcn1SZWFkIE1lIGZvciBNUFciCi10ci03dG84ICJ7c3JjZGlyfSJtcHctaW5zdGFsbCA+ICJ7b2JqZGlyfSJJbnN0YWxsCmRpZmYgLS1naXQgYS9tcHctY29uZmlndXJlIGIvbXB3LWNvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NTE0OC4uMDAwMDAwMAotLS0gYS9tcHctY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBzY3JpcHQKLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIFdBUk5JTkcKLSMjIyBUaGlzIHNjcmlwdCBtdXN0IE5PVCB1c2UgYW55IDgtYml0IGNoYXJzIQotIyMjIFdBUk5JTkcKLQotIyBUaGlzIGlzIGFuIE1QVyBTaGVsbCBzY3JpcHQgdGhhdCBzZXRzIGV2ZXJ5dGhpbmcgdXAgZm9yIGNvbXBpbGF0aW9uLAotIyBtYWlubHkgY3JlYXRpbmcgZGlyZWN0b3JpZXMsIGFuZCBlZGl0aW5nIGNvcGllcyBvZiBmaWxlcy4KLQotU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCi0jU2V0IEVjaG8gMQotCi1TZXQgVGhpc1NjcmlwdCAiezB9IgotCi1TZXQgc3Jjcm9vdCAiLS0tLS0tLS0iCi0KLVNldCBzcmNkaXIgIjoiCi0KLVNldCBvYmpkaXIgIjoiCi0KLVNldCBwcmVmaXggIntNUFd9IjpHTlVUb29sczoKLQotU2V0IGV4ZWNfcHJlZml4ICIiCi0KLVNldCBiaW5kaXIgIiIKLQotU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCi1TZXQgdGFyZ2V0X2FsaWFzIHtob3N0X2FsaWFzfQotCi1TZXQgaG9zdF9jYyAibXB3YyIKLQotU2V0IHdpdGhfZ251X2xkIDAKLQotU2V0IGhlbHBvdXRwdXQgMAotCi1TZXQgcmVjdXJzZSAxCi0KLVNldCB2ZXJpZnkgMAotU2V0IHZlcmlmeXN0ciAiIgotCi1TZXQgZW5hYmxlX29wdGlvbnMgIiIKLVNldCBkaXNhYmxlX29wdGlvbnMgIiIKLQotIyBQYXJzZSBhcmd1bWVudHMuCi0KLUxvb3AKLQlCcmVhayBJZiB7I30gPT0gMAotCUlmICJ7MX0iID1+IC8tLWNjLwotCQlTZXQgaG9zdF9jYyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1iaW5kaXIvCi0JCVNldCBiaW5kaXIgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tZGlzYWJsZS0/Ky8KLQkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWRpc2FibGUtL2VuYWJsZV8vJ2Agbm8KLQkJU2V0IGRpc2FibGVfb3B0aW9ucyAie2Rpc2FibGVfb3B0aW9uc30gJ3sxfSciCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1lbmFibGUtPysvCi0JCVNldCBgRWNobyB7MX0gfCBzZWQgLWUgJ3MvLS1lbmFibGUtL2VuYWJsZV8vJ2AgeWVzCi0JCVNldCBlbmFibGVfb3B0aW9ucyAie2VuYWJsZV9vcHRpb25zfSAnezF9JyIKLQlFbHNlIElmICJ7MX0iID1+IC8tLWV4ZWMtcHJlZml4LwotCQlTZXQgZXhlY19wcmVmaXggInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0taGVscC8KLQkJU2V0IGhlbHBvdXRwdXQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0taG9zdC8KLQkJU2V0IGhvc3RfYWxpYXMgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tbm9yZWN1cnNpb24vCi0JCVNldCByZWN1cnNlIDAKLQlFbHNlIElmICJ7MX0iID1+IC8tLXByZWZpeC8KLQkJU2V0IHByZWZpeCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNkaXIvCi0JCVNldCBzcmNkaXIgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tc3Jjcm9vdC8KLQkJU2V0IHNyY3Jvb3QgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tdGFyZ2V0LwotCQlTZXQgdGFyZ2V0X2FsaWFzICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tdi8KLQkJU2V0IHZlcmlmeSAxCi0JCVNldCB2ZXJpZnlzdHIgIi12IgotCUVsc2UgSWYgInsxfSIgPX4gLy0td2l0aC1nbnUtbGQvCi0JCVNldCB3aXRoX2dudV9sZCAxCi0JRWxzZQotCQlFY2hvIC1uICdtcHctY29uZmlndXJlOiBVbnJlY29nbml6ZWQgb3B0aW9uOiAiJwotCQlFY2hvIC1uICJ7MX0iCi0JCUVjaG8gJyI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLicKLQkJRXhpdCAxCi0JRW5kIElmCi0JU2hpZnQgMQotRW5kIExvb3AKLQotSWYge2hlbHBvdXRwdXR9ID09IDEKLQlFY2hvICJVc2FnZTogbXB3LWNvbmZpZ3VyZSBbT1BUSU9OU10iCi0JRWNobyAiIgotCUVjaG8gIk9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10iCi0JRWNobyAiLS1iaW5kaXIgRElSICAgICAgZGlyZWN0b3J5IGZvciBiaW5hcmllcyBbXSIKLQlFY2hvICItLWNjIENDICAgICAgICAgICB1c2UgQyBjb21waWxlciBDQyBbbXB3Y10iCi0JRWNobyAiLS1kaXNhYmxlLUZPTyAgICAgZG8gbm90IGluY2x1ZGUgZmVhdHVyZSBGT08iCi0JRWNobyAiLS1lbmFibGUtRk9PICAgICAgaW5jbHVkZSBmZWF0dXJlIEZPTyIKLQlFY2hvICItLWV4ZWMtcHJlZml4IERJUiBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gRElSIFtdIgotCUVjaG8gIi0taGVscCAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSIKLQlFY2hvICItLWhvc3QgSE9TVCAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW202OGstYXBwbGUtbXB3XSIKLQlFY2hvICItLW5vcmVjdXJzaW9uICAgICBjb25maWd1cmUgdGhpcyBkaXJlY3Rvcnkgb25seSBbcmVjdXJzZV0iCi0JRWNobyAiLS1wcmVmaXggRElSICAgICAgaW5zdGFsbCBpbnRvIERJUiBbe01QV306R05VVG9vbHM6XSIKLQlFY2hvICItLXNyY2RpciBESVIgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbOl0iCi0JRWNobyAiLS1zcmNyb290IERJUiAgICAgZmluZCB0aGUgdG9wbGV2ZWwgc291cmNlcyBpbiBESVIgWzpdIgotCUVjaG8gIi0tdGFyZ2V0IFRBUkdFVCAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0iCi0JRWNobyAiLXYgICAgICAgICAgICAgICAgdmVyYm9zZSIKLQlFY2hvICItLXdpdGgtZ251LWxkICAgICBsaW5rIHVzaW5nIEdOVSBsZCBbbm9dIgotCUV4aXQgMAotRW5kIElmCi0KLVNldCBFeGl0IDAKLQotIyBEZWZhdWx0IGV4ZWNfcHJlZml4IGZyb20gcHJlZml4LgotCi1JZiAie2V4ZWNfcHJlZml4fSIgPT0gIiIKLQlTZXQgZXhlY19wcmVmaXggIntwcmVmaXh9IgotRW5kIElmCi0KLUlmICJ7YmluZGlyfSIgPT0gIiIKLQlTZXQgYmluZGlyICJ7cHJlZml4fSJiaW46Ci1FbmQgSWYKLQotIyBQb2ludCB0byB0aGUgY29ycmVjdCBzZXQgb2YgdG9vbHMgdG8gdXNlIHdpdGggdGhlIGNob3NlbiBjb21waWxlci4KLQotSWYgIntob3N0X2NjfSIgPX4gL21wd2MvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVBXX0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3NjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9MSUJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVdDNjhLfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9NV0xJTks2OEt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOSzY4S30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19NV0M2OEt9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDXzY4S19HQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSXzY4S19BUn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ182OEtfR0NDfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvcHBjYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19QUENDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXJjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01SQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3NjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXdjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01XQ1BQQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfTVdMSU5LUFBDfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9NV0xJTktQUEN9JwotCSMgTWlzbGVhZGluZywgYnV0IHdlIGRvbid0IG5lZWQgYSBQRUYgc3RlcC4KLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQ1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfUFBDX0dDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JSWYge3dpdGhfZ251X2xkfSA9PSAxCi0JCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9SQU5MSUJ9JwotCQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0dMRH0nCi0JRWxzZQotCQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JRW5kIElmCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UKLQlFY2hvICJ7aG9zdF9jY30iIGlzIG5vdCBhIGtub3duIE1QVyBjb21waWxlciB0eXBlCi1FbmQgSWYKLQotU2V0IGRhc2hfY19mbGFnICcnCi1JZiAie2hvc3RfY2N9IiA9fiAvZ2NjNjhrLwotCVNldCBkYXNoX2NfZmxhZyAnLWMnCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2NwcGMvCi0JU2V0IGRhc2hfY19mbGFnICctYycKLUVuZCBJZgotCi0jIChzaG91bGQgaW50ZXJwcmV0IGFsaWFzZXMgaWYgbm90IGluIGNhbm9uaWNhbCBmb3JtKQotCi1TZXQgaG9zdF9jYW5vbmljYWwgIntob3N0X2FsaWFzfSIKLQotU2V0IHRhcmdldF9jYW5vbmljYWwgInt0YXJnZXRfYWxpYXN9IgotCi1TZXQgY29uZmlnZGlycyAiIgotCi1JZiAie3NyY3Jvb3R9IiA9fiAvLS0tLS0tLS0vCi0JU2V0IHNyY3Jvb3QgIntzcmNkaXJ9IgotRW5kIElmCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0iYCIgPT0gIiIKLQlFY2hvIFNvdXJjZSBkaXJlY3Rvcnkge3NyY2Rpcn0gZG9lcyBub3QgZXhpc3QhCi0JRXhpdCAxCi1FbmQgSWYKLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iYCIgPT0gIiIKLQlFY2hvIFRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5IHtzcmNyb290fSBkb2VzIG5vdCBleGlzdCEKLQlFeGl0IDEKLUVuZCBJZgotCi1TZXQgdGFyZ2V0X2NwdSAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDEvJ2AiCi1TZXQgdGFyZ2V0X3ZlbmRvciAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDIvJ2AiCi1TZXQgdGFyZ2V0X29zICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMy8nYCIKLQotIyBDcmVhdGUgYSBmaWxlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbGRlciB0aGFuIGFueSBvdGhlciBoZXJlLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0iX29sZGVzdGAiID09ICIiCi0JbXB3LXRvdWNoIF9vbGRlc3QKLUVuZCBJZgotCi0jIFJlY29yZCB0aGlzIGJlZm9yZSBjcmVhdGluZyBhbnkgZmlsZXMsIG1ha2VmaWxlcyBzb21ldGltZXMgbWVudGlvbgotIyBkZXBlbmRlbmNpZXMgb24gY29uZmlnLnN0YXR1cy4KLQotRWNobyAiIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOiIgPmNvbmZpZy5uZXcKLUVjaG8gIntUaGlzU2NyaXB0fSAtLWhvc3Qge2hvc3RfYWxpYXN9IC0tdGFyZ2V0IHt0YXJnZXRfYWxpYXN9IC0tc3JjZGlyIHtzcmNkaXJ9ICAtLXNyY3Jvb3Qge3NyY3Jvb3R9ICAtLXByZWZpeCB7cHJlZml4fSAtLWNjIHtob3N0X2NjfSB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9IC0tbm9yZWN1cnNpb24iID4+Y29uZmlnLm5ldwotTW92ZUlmQ2hhbmdlIGNvbmZpZy5uZXcgY29uZmlnLnN0YXR1cwotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWNvbmZpZy5pbmAiICE9ICIiCi0JdHItN3RvOCAie3NyY2Rpcn0ibXB3LWNvbmZpZy5pbiA+IntvYmpkaXJ9Im1wdy1jb25maWcuaW4KLQlFeGVjdXRlICJ7b2JqZGlyfSJtcHctY29uZmlnLmluCi1FbmQgSWYKLQotIyBTdGFydCBNYWtlZmlsZSBjb25zdHJ1Y3Rpb24gYnkgZGVmaW5pbmcgYWxsIHRoZSB2YXJpYWJsZXMgY2hvc2VuIGJ5Ci0jIGNvbmZpZ3VyYXRpb24uCi0KLUVjaG8gIiMgVGhpcyBNYWtlZmlsZSBwcm9kdWNlZCBieSBtcHctY29uZmlndXJlLiAgQ2hhbmdlcyBtYXkgZ2V0IGxvc3QhIiA+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInNyY3Jvb3QgPSAiIHtzcmNyb290fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRvcHNyY2RpciA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAic3JjZGlyID0gIiB7c3JjZGlyfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19wcmVmaXggPSAiIHtwcmVmaXh9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X2V4ZWNfcHJlZml4ID0gIiB7ZXhlY19wcmVmaXh9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfYmluZGlyID0gIiB7YmluZGlyfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gImhvc3RfYWxpYXMgPSAiIHtob3N0X2FsaWFzfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2FsaWFzID0gIiB7dGFyZ2V0X2FsaWFzfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2NwdSA9ICIge3RhcmdldF9jcHV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfdmVuZG9yID0gIiB7dGFyZ2V0X3ZlbmRvcn0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9vcyA9ICIge3RhcmdldF9vc30JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfY2Fub25pY2FsID0gIiB7dGFyZ2V0X2Nhbm9uaWNhbH0JPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiaG9zdF9tYWtlZmlsZV9mcmFnID0gIgkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9tYWtlZmlsZV9mcmFnID0gIgkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkNDID0gIiB7Y2NfbmFtZX0JCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQVIgPSAiIHthcl9uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJSQU5MSUIgPSAiIHtyYW5saWJfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJDQ19MRCA9ICIge2NjX2xkX25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUFJPR19FWFQgPSAiIHtwcm9nX2V4dF9uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiRVhUUkFMSUJTID0gIiB7ZXh0cmFsaWJzX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJNQUtFUEVGID0gIiB7bWFrZXBlZl9uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUkVaID0gIiB7cmV6X25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCi1JZiB7aG9zdF9jY30gPX4gL2djY3BwYy8KLQlFY2hvIC1uICJkcSA9XE9wdGlvbi1kXE9wdGlvbi1kXE9wdGlvbi1kIiA+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCi0JRWNobyAnIicgCQkJCSA+PiAie29iamRpcn0iTWFrZWZpbGUudGVtMAotCXRyLTd0bzggICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCT4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZQotCUVjaG8gLW4gImRxID0nIiAJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRWNobyAtbiAnIicgCQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFY2hvICAgICInIiAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRW5kIElmCi0KLSMgQXBwZW5kIHRoZSBtYXN0ZXIgc2V0IG9mIGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBjb21waWxlcnMuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCi0JdHItN3RvOCAie3NyY2Rpcn0iY29uZmlnOm1wdy1taC1tcHcgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0iY29uZmlnOm1wdy1taC1tcHdgIiAhPSAiIgotCXRyLTd0bzggIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UKLQlFY2hvICJjYW4ndCBmaW5kIGEgaG9zdCBjb25maWcgZmlsZSEiCi0JRXhpdCAwCi1FbmQgSWYKLQotIyBBcHBlbmQgYW55dGhpbmcgcHJvZHVjZWQgYnkgdGhlIGRpcmVjdG9yeSdzIG1wdy1jb25maWcuaW4uCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay50bXBgIiAhPSAiIgotCUNhdGVuYXRlICJ7b2JqZGlyfSJtay50bXAgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JIyBBbiBtcHctY29uZmlnLmluIG1pZ2h0IGNoYW5nZSBzbyBhcyBub3QgdG8gY3JlYXRlIHRoaXMKLQkjIGFueW1vcmUsIHNvIGdldCByaWQgb2YgaXQgbm93IHRvIGJlIHNhZmUuCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJtay50bXAKLUVuZCBJZgotCi0jIElmIHRoZXJlIGFyZSBzZWQgc2NyaXB0cyB0byBlZGl0IHRoZSBVbml4IE1ha2VmaWxlLmluLCB1c2UgdGhlbTsgb3RoZXJ3aXNlCi0jIHVzZSBhbiBtcHctbWFrZS5pbiBpZiBwcmVzZW50LgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQlJZiAiYEV4aXN0cyAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluYCIgIT0gIiIKLQkJU2V0IE1ha2VmaWxlSW4gIntvYmpkaXJ9ImhhY2tlZF9NYWtlZmlsZS5pbgotCUVsc2UKLQkJU2V0IE1ha2VmaWxlSW4gIntzcmNkaXJ9Ik1ha2VmaWxlLmluCi0JRW5kIElmCi0JIyBGaW5kIHRoZSBnZW5lcmljIG1ha2VmaWxlIGVkaXRpbmcgc2NyaXB0LgotCUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY3Jvb3R9ImNvbmZpZzptcHc6Zy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZSBJZiAiYEV4aXN0cyAie3NyY3Jvb3R9InV0aWxzOm1wdzpnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY3Jvb3R9InV0aWxzOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlIElmICJgRXhpc3RzICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY2Rpcn0iZy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZQotCQlFY2hvIFdhcm5pbmc6IGctbXB3LW1ha2Uuc2VkIG5vdCBmb3VuZCwgY29weWluZyAie01ha2VmaWxlSW59IiB2ZXJiYXRpbS4uLgotCQlDYXRlbmF0ZSAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbmQgSWYKLQlzZWQgLWYgIntzcmNkaXJ9Im1wdy1tYWtlLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQlzZWQgLWUgJ3MvXnByZWZpeCA9IC4qJC9wcmVmaXggPSB7bXB3X3ByZWZpeH0vZycgLWUgJ3MvXmV4ZWNfcHJlZml4ID0gLiokL2V4ZWNfcHJlZml4ID0ge21wd19leGVjX3ByZWZpeH0vZycgLWUgJ3MvXmJpbmRpciA9IEBiaW5kaXJAL2JpbmRpciA9IHttcHdfYmluZGlyfS9nJyAie29iamRpcn0iTWFrZWZpbGUudGVtMiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTMKLQlzZWQgLWUgInMvQERBU0hfQ19GTEFHQC97ZGFzaF9jX2ZsYWd9LyIgLWUgInMvQFNFR01FTlRfRkxBRyhcKFteKV0qXCkpQC97c2VnbWVudF9mbGFnfVwxLyIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTMgPiJ7b2JqZGlyfSJtcHctbWFrZS5pbgotCXRyLTd0bzggIntvYmpkaXJ9Im1wdy1tYWtlLmluID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVuZCBJZgotCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQotCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1tYWtlLmluYCIgIT0gIiIKLQlzZWQgLWUgJ3MvXnByZWZpeCA9IC4qJC9wcmVmaXggPSB7bXB3X3ByZWZpeH0vZycgIntzcmNkaXJ9Im1wdy1tYWtlLmluID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9fVwxLyIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JdHItN3RvOCAie29iamRpcn0iTWFrZWZpbGUudGVtMiA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlJZiAiYEV4aXN0cyAie29iamRpcn0ibWsuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7b2JqZGlyfSJtay5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQkJUmVuYW1lIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFbmQgSWYKLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSAie29iamRpcn0iTWFrZWZpbGUKLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbVsxMl0KLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBNYWtlZmlsZSBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbmQgSWYKLQotIyBQcm9kdWNlIGEgYnVpbGQgc2NyaXB0IGlmIHRoZSBzb3VyY2UgaXMgZGVmaW5lZC4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1idWlsZC5pbmAiICE9ICIiCi0JRWNobyAiU2V0IHNyY3Jvb3QgIiB7c3Jjcm9vdH0gPiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCBzcmNkaXIgIiB7c3JjZGlyfSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCB0YXJnZXRfY2Fub25pY2FsICIge3RhcmdldF9jYW5vbmljYWx9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHByZWZpeCAiIHtwcmVmaXh9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JdHItN3RvOCAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluID4+IntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0gIntvYmpkaXJ9Im1wdy1idWlsZAotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIG1wdy1idWlsZCBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbmQgSWYKLQotIyBBcHBseSBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgdG8gdGhlIGxpc3Qgb2Ygc3ViZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLgotCi1JZiB7cmVjdXJzZX0gPT0gMQotCUZvciBzdWJkaXIgSW4ge2NvbmZpZ2RpcnN9Ci0JCVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQkJSWYgImBFeGlzdHMgIntzcmNkaXJ9e3N1YmRpcn06ImAiID09ICIiCi0JCQlJZiB7dmVyaWZ5fSA9PSAxCi0JCQkJRWNobyBObyAie3NyY2Rpcn17c3ViZGlyfToiIGZvdW5kLCBza2lwcGluZwotCQkJRW5kIElmCi0JCQlDb250aW51ZQotCQlFbmQgSWYKLQkJSWYge3ZlcmlmeX0gPT0gMQotCQkJRWNobyBDb25maWd1cmluZyB7c3ViZGlyfS4uLgotCQlFbmQgSWYKLQkJSWYgImBFeGlzdHMgIntvYmpkaXJ9e3N1YmRpcn06ImAiID09ICIiCi0JCQlOZXdGb2xkZXIgIntvYmpkaXJ9e3N1YmRpcn0iCi0JCUVuZCBJZgotCQlTZXREaXJlY3RvcnkgIntvYmpkaXJ9e3N1YmRpcn06IgotCQkie1RoaXNTY3JpcHR9IiAtLXRhcmdldCAie3RhcmdldF9jYW5vbmljYWx9IiAtLXNyY2RpciAie3NyY2Rpcn17c3ViZGlyfToiIC0tc3Jjcm9vdCAie3NyY3Jvb3R9IiAtLXByZWZpeCAie3ByZWZpeH0iIC0tY2MgIntob3N0X2NjfSIge3ZlcmlmeXN0cn0ge2VuYWJsZV9vcHRpb25zfSB7ZGlzYWJsZV9vcHRpb25zfQotCQlTZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKLQlFbmQgRm9yCi1FbmQgSWYKLQotU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCmRpZmYgLS1naXQgYS9tcHctaW5zdGFsbCBiL21wdy1pbnN0YWxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM1YWFjLi4wMDAwMDAwCi0tLSBhL21wdy1pbnN0YWxsCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMgR05VIEluc3RhbGwgc2NyaXB0IGZvciBNUFcuCi0KLVNldCBPbGRFeGl0ICJ7RXhpdH0iCi1TZXQgRXhpdCAwCi0KLVNldCBUZW1wVXNlclN0YXJ0dXAgIntUZW1wRm9sZGVyfSJfX3RlbXBfX1VzZXJTdGFydHVwCi0KLUVjaG8gJyMgVXNlclN0YXJ0dXAgZ2VuZXJhdGVkIGJ5IEdOVSBJbnN0YWxsIHNjcmlwdCcgPiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIChzaG91bGQpIENoZWNrIHRoYXQgZGlzayBzcGFjZSBpcyBzdWZmaWNpZW50IGZvciBpbnN0YWxsYXRpb24uCi0KLSMgQXNzdW1lIHRoYXQgdGhlIGluc3RhbGwgc2NyaXB0IGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZWxzZSBpcy4KLQotU2V0IHRoaXNkaXIgImBEaXJlY3RvcnlgIgotCi0jIENvcHkgdGhlIGJpbmFyaWVzIHRvIHRoZSBkZXNpcmVkIHBsYWNlLgotCi1Db25maXJtIC10ICJDb3B5IHRoZSBiaW5hcmllcyB0byBzb21ld2hlcmUgZWxzZT8iCi1TZXQgVG1wU3RhdHVzIHtTdGF0dXN9Ci1JZiB7VG1wU3RhdHVzfSA9PSAwCi0JU2V0IGJpbmRlc3QgImBHZXRGaWxlTmFtZSAtZCAtbSAiV2hlcmUgdG8gaW5zdGFsbCB0aGUgYmluYXJpZXM/ImAiCi0JSWYge1N0YXR1c30gPT0gMAotCQlJZiAiYEV4aXN0cyAie3RoaXNkaXJ9YmluImAiICE9ICIiCi0JCQlGb3IgYWZpbGUgSW4gInt0aGlzZGlyfSJiaW46XE9wdGlvbi14Ci0JCQkJRHVwbGljYXRlIC15ICJ7YWZpbGV9IiAie2JpbmRlc3R9IgotCQkJRW5kIEZvcgotCQlFbHNlCi0JCQlFY2hvICJiaW4gZGlyZWN0b3J5IG5vdCBmb3VuZCwgZXhpdGluZyIKLQkJCUV4aXQgMQotCQlFbmQgSWYKLQlFbHNlCi0JCUVjaG8gIk5vIGRlc3RpbmF0aW9uIHN1cHBsaWVkLCBleGl0aW5nIgotCQlFeGl0IDEKLQlFbmQgSWYKLUVsc2UgSWYge1RtcFN0YXR1c30gPT0gNAotCSMgVXNlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCi0JU2V0IGJpbmRlc3QgInt0aGlzZGlyfWJpbjoiCi1FbHNlCi0JIyBDYW5jZWxsZWQgZnJvbSBjb25maXJtYXRpb24sIGVzY2FwZSBhbHRvZ2V0aGVyLgotCUV4aXQgMQotRW5kIElmCi0KLSMgQ29weSB0aGUgbGlicmFyaWVzIHRvIHRoZSBkZXNpcmVkIHBsYWNlLgotCi1Db25maXJtIC10ICJDb3B5IHRoZSBsaWJyYXJpZXMgdG8gc29tZXdoZXJlIGVsc2U/IgotU2V0IFRtcFN0YXR1cyB7U3RhdHVzfQotSWYge1RtcFN0YXR1c30gPT0gMAotCVNldCBsaWJkZXN0ICJgR2V0RmlsZU5hbWUgLWQgLW0gIldoZXJlIHRvIGluc3RhbGwgdGhlIGxpYnJhcmllcz8iYCIKLQlJZiB7U3RhdHVzfSA9PSAwCi0JCUlmICJgRXhpc3RzICJ7dGhpc2Rpcn1saWI6ImAiICE9ICIiCi0JCQlGb3IgYWZpbGUgSW4gInt0aGlzZGlyfSJsaWI6XE9wdGlvbi14Ci0JCQkJRHVwbGljYXRlIC15ICJ7YWZpbGV9IiAie2xpYmRlc3R9IgotCQkJRW5kIEZvcgotCQlFbHNlCi0JCQlFY2hvICJsaWIgZGlyZWN0b3J5IG5vdCBmb3VuZCwgZXhpdGluZyIKLQkJCUV4aXQgMQotCQlFbmQgSWYKLQlFbHNlCi0JCUVjaG8gIk5vIGRlc3RpbmF0aW9uIHN1cHBsaWVkLCBleGl0aW5nIgotCQlFeGl0IDEKLQlFbmQgSWYKLUVsc2UgSWYge1RtcFN0YXR1c30gPT0gNAotCSMgVXNlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCi0JU2V0IGxpYmRlc3QgInt0aGlzZGlyfWxpYjoiCi1FbHNlCi0JIyBDYW5jZWxsZWQgZnJvbSBjb25maXJtYXRpb24sIGVzY2FwZSBhbHRvZ2V0aGVyLgotCUV4aXQgMQotRW5kIElmCi0KLQotIyBBZGQgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcmllcyB0byB0aGUgY29tbWFuZCBwYXRoLgotCi1FY2hvIC1uICdTZXQgQ29tbWFuZHMgIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7YmluZGVzdH0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyx7Q29tbWFuZHN9IicJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBTZXQgdXAgR0NDIGV4ZWMgcHJlZml4LgotCi1TZXQgZ2NjbGliZGlyICJ7bGliZGVzdH0iZ2NjLWxpYjoKLQotRWNobyAtbiAnU2V0IEdDQ19FWEVDX1BSRUZJWCAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntnY2NsaWJkaXJ9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICciJwkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAiRXhwb3J0IEdDQ19FWEVDX1BSRUZJWCIJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIFNldCB1cCBwYXRoIHRvIGxpYmdjYy54Y29mZiBldGMuCi0KLUVjaG8gLW4gJ1NldCBHQ0NQUENMaWJyYXJpZXMgIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7bGliZGVzdH0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyInCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICJFeHBvcnQgR0NDUFBDTGlicmFyaWVzIgkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgRGlzcGxheSBjb250ZW50cyBvZiBVc2VyU3RhcnR1cCwgY29uZmlybSBpbnN0YWxsYXRpb24uCi0KLVNldCBVc2VyU3RhcnR1cE5hbWUgIlVzZXJTdGFydHVwXE9wdGlvbi04R05VIgotCi1FY2hvICJDb250ZW50cyBvZiIge1VzZXJTdGFydHVwTmFtZX0gIndpbGwgYmU6IgotQ2F0ZW5hdGUgIntUZW1wVXNlclN0YXJ0dXB9IgotCi1Db25maXJtICJJbnN0YWxsIHtVc2VyU3RhcnR1cE5hbWV9IGludG8gdGhlIE1QVyBmb2xkZXIge01QV30gPyIKLUlmIHtTdGF0dXN9ID09IDAKLQlEdXBsaWNhdGUgIntUZW1wVXNlclN0YXJ0dXB9IiAie01QV317VXNlclN0YXJ0dXBOYW1lfSIKLQlEZWxldGUgLXkgIntUZW1wVXNlclN0YXJ0dXB9IgotRWxzZQotCUVjaG8gIntVc2VyU3RhcnR1cE5hbWV9IGZpbGUgbm90IGluc3RhbGxlZCIKLUVuZCBJZgotCi0jIChzaG91bGQpIENoZWNrIEhFWEEgcmVzb3VyY2UsIHdhcm4gaWYgbG93LgotCi0jIChzaG91bGQpIENoZWNrIGZvciBzcGFjZXMgaW4gcGF0aG5hbWVzLCB3YXJuIGlmIGZvdW5kLgotCi1FY2hvICJJbnN0YWxsYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIgotRWNobyAiIgotRWNobyAiQmUgc3VyZSB0byByZXZpZXcgdGhlIHVzYWdlIG5vdGVzIGluICdSZWFkIE1lIGZvciBNUFcnIGJlZm9yZSBwcm9jZWVkaW5nISIKLQotIyBSZXN0b3JlIHByZXZpb3VzIHNldHRpbmdzLgotCi1TZXQgRXhpdCAie09sZEV4aXR9IgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9DaGFuZ2VMb2cgYi9vcGNvZGVzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxZjNkMi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDU5MjYgKzAsMCBAQAotMjAwMC0wNi0wMiAgS2F6dSBIaXJhdGEgIDxrYXp1QGh4aS5jb20+PTBBPQotCi0JKiBoODMwMC1kaXMuYzogRm9sbG93IHRoZSBHTlUgY29kaW5nIHN0eWxlLgotCShiZmRfaDhfZGlzYXNzZW1ibGUpIEZpeCBhIHR5cG8uCi0JCi0yMDAwLTA2LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogCi0KLTIwMDAtMDYtMDEgIEthenUgSGlyYXRhICA8a2F6dUBoeGkuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQpOiBGaXggYSB0eXBvLgotCShiZmRfaDhfZGlzYXNzZW1ibGUpOiBEaXN0aW5ndWlzaCB0aGUgb3BlcmFuZCBzaXplIG9mIGluYy9kZXYuW3dsXQotCWNvcnJlY3RseS4gIEZpeCBhIHR5cG8uCi0KLTIwMDAtMDUtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9waW50bC5oIChfKFN0cmluZykpOiBFeHBsYWluIHdoeSBkZ2V0dGV4dCBpcyB1c2VkIGluc3RlYWQgb2YKLQlnZXR0ZXh0LgotCi0yMDAwLTA1LTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvcGludGwuaCAoZ2V0dGV4dCwgZGdldHRleHQsIGRjZ2V0dGV4dCwgdGV4dGRvbWFpbiwKLQliaW5kdGV4dGRvbWFpbik6IFJlcGxhY2UgZGVmaW5lcyB3aXRoIHRob3NlIGZyb20gaW50bC9saWJnZXR0ZXh0LmgKLQl0byBxdWlldGVuIGdjYyB3YXJuaW5ncy4KLQotMjAwMC0wNS0yNiAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSBkZXBlbmRlbmNpZXMgd2l0aCAibWFrZSBkZXAtYW0iCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotVGh1IE1heSAyNSAyMjo1MzoyMCAyMDAwICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IERvbid0IGFzc3VtZSAzMi1iaXQgbG9uZ3Mgd2hlbgotCXNpZ24tZXh0ZW5kaW5nIG9wZXJhbmRzLgotCi1Nb24gTWF5IDE1IDE1OjE4OjA3IDIwMDAgIERvbmFsZCBMaW5kc2F5ICA8ZGxpbmRzYXlAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogYWRkIEFMT05FIHRhZyB0byBhbGwgc2hvcnQgYnJhbmNoZXMKLQlleGNlcHQgYnJmJ3MuCi0KLTIwMDAtMDUtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChMSUJJQkVSVFkpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMTkgMTI6Mjk6MjcgRURUIDIwMDAJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AcmVkaGF0LmNvbT4KLQotCSogbWlwcy1kaXMuYyAoUkVHSVNURVJfTkFNRVMpOiBSZW5hbWUgdG8gU1REX1JFR0lTVEVSX05BTUVTLgotCShTVERfUkVHSVNURVJfTkFNRVMpOiBOZXcgbmFtZSBmb3IgUkVHSVNURVJfTkFNRVMuCi0JKHJlZ19uYW1lcyk6IFJlbmFtZSB0byBzdGRfcmVnX25hbWVzLiBDaGFuZ2UgaXQgdG8gYSBjaGFyICoqCi0Jc3RhdGljIHZhcmlhYmxlLgotCShzdGRfcmVnX25hbWVzKTogTmV3IG5hbWUgZm9yIHJlZ19uYW1lcy4KLQkoc2V0X21pcHNfaXNhX3R5cGUpOiBTZXQgcmVnX25hbWVzIHRvIHBvaW50IHRvIHN0ZF9yZWdfbmFtZXMgYnkKLQlkZWZhdWx0LgotCi0yMDAwLTA1LTE2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUByZWRoYXQuY29tPgotCi0JKiBmcjMwLWRlc2MuaDogUGFydGlhbGx5IHJlZ2VuZXJhdGVkIHRvIGFjY291bnQgZm9yIGNoYW5nZWQKLQlDR0VOX01BWF8qIC0+IENHRU5fQUNUVUFMX01BWF8qIG1hY3Jvcy4KLQkqIG0zMnItZGVzYy5oOiBEaXR0by4KLQotMjAwMC0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLW9wYy5oOiBVc2UgdXBwZXIgY2FzZSBmb3IgZmxhc2cgaW4gTVNSIGFuZCBNUlMKLQlpbnN0cnVjdGlvbnMuICBBbGxvdyBhbnkgYml0IHRvIGJlIHNldCBpbiB0aGUgZmllbGRfbWFzayBvZgotCXRoZSBNU1IgaW5zdHJ1Y3Rpb24uCi0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEZWNvZGUgX3ggYW5kIF9zIGJpdHMgb2YgdGhlCi0JZmllbGRfbWFzayBvZiBhbiBNU1IgaW5zdHJ1Y3Rpb24uCi0KLTIwMDAtMDUtMTEgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLSAgICAgICAgKiBhcm0tb3BjLmM6IERpc2Fzc2VtYmx5IG9mIHRodW1iIGxkc2IvbGRzaAotICAgICAgICBpbnN0cnVjdGlvbnMgY2hhbmdlZCB0byBsZHJzYi9sZHJzaC4KLQkKLTIwMDAtMDUtMTEgIFVsZiBDYXJsc3NvbiAgPHVsZmNAZW5nci5zZ2kuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERvbid0IG1hc2sgdG9wIDMyIGJpdHMgb2YgNjQtYml0Ci0JdGFyZ2V0IGFkZHJlc3NlcyBmb3IgJ2phbCcgYW5kICdqJy4KLQotMjAwMC0wNS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IE1ha2UgdGhlIHByZWRpY3RlZC1icmFuY2ggb3Bjb2RlcwotCWFsc28gYXZhaWxhYmxlIGluIGNvbW1vbiBtb2RlIHdoZW4gcG93ZXJwYyBzeW50YXggaXMgYmVpbmcgdXNlZC4KLQotMjAwMC0wNS0wOCAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogbTY4ay1kaXMuYyAoZHVtbXlfcHJpbnRlcik6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIHRvIGFyZ3MuCi0JKGR1bW15X3ByaW50X2FkZHJlc3MpOiBEaXR0by4KLQotMjAwMC0wNS0wNCAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogdGljNTR4LW9wYy5jOiBOZXcuCi0JKiB0aWM1NHgtZGlzLmM6IE5ldy4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEFkZCBBUkNIX3RpYzU0eC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgdGljNTR4IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogRGl0dG8uCi0JKiBNYWtlZmlsZS5hbTogQWRkIHRpYzU0eCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogRGl0dG8uIAotCi0yMDAwLTA1LTAzICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFjay5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoVkEsIFZCLCBWQywgVkQsIFZTLCBTSU1NLCBVSU1NLCBTSEIpOiBOZXcgbWFjcm9zLCBmb3IKLSAJdmVjdG9yIHVuaXQgb3BlcmFuZHMuCi0JKFZYLCBWWF9NQVNLLCBWWEEsIFZYQV9NQVNLLCBWWFIsIFZYUl9NQVNLKTogTmV3IG1hY3JvcywgZm9yIHZlY3RvcgotCXVuaXQgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLQkoUFBDVkVDKTogTmV3IG1hY3JvLCBtYXNrIGZvciB2ZWN0b3IgaW5zdHJ1Y3Rpb25zLgotCShwb3dlcnBjX29wZXJhbmRzKTogQWRkIHRhYmxlIGVudHJpZXMgZm9yIGFib3ZlIG9wZXJhbmQgdHlwZXMuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCB0YWJsZSBlbnRyaWVzIGZvciB2ZWN0b3IgaW5zdHJ1Y3Rpb25zLgotCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fYmlnX3Bvd2VycGMpOiBBZGQgUFBDX09QQ09ERV9BTFRJVkVDIHRvIG1hc2suCi0JKHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9wb3dlcnBjKTogUHJlcGVuZCAndicgd2hlbiBwcmludGluZyB2ZWN0b3IgcmVnaXN0ZXJzLgotCi1TdW4gQXByIDIzIDE3OjU0OjE0IDIwMDAgIERlbmlzIENoZXJ0eWtvdiAgPGRlbmlzY0BvdmVydGEucnU+Ci0KLQkqIGF2ci1kaXMuYyAocmVnX2ZtdWxfZCk6IE5ldy4gRXh0cmFjdCBkZXN0aW5hdGlvbiByZWdpc3RlciBmcm9tCi0JRk1VTCBpbnN0cnVjdGlvbi4KLQkocmVnX2ZtdWxfcik6IE5ldy4gRXh0cmFjdCBzb3VyY2UgcmVnaXN0ZXIgZnJvbSBGTVVMIGluc3RydWN0aW9uLgotCShyZWdfbXVsc19kKTogTmV3LiBFeHRyYWN0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZyb20gTVVMUyBpbnN0cnVjdGlvbi4KLQkocmVnX211bHNfcik6IE5ldy4gRXh0cmFjdCBzb3VyY2UgcmVnaXN0ZXIgZnJvbSBNVUxTIGluc3RydWN0aW9uLgotCShyZWdfbW92d19kKTogTmV3LiBFeHRyYWN0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZyb20gTU9WVyBpbnN0cnVjdGlvbi4KLQkocmVnX21vdndfcik6IE5ldy4gRXh0cmFjdCBzb3VyY2UgcmVnaXN0ZXIgZnJvbSBNT1ZXIGluc3RydWN0aW9uLgotCShwcmludF9pbnNuX2F2cik6IEhhbmRsZSBNT1ZXLCBNVUxTLCBNVUxTVSwgRk1VTCwgRk1VTFMsIEZNVUxTVSwKLQlFSUNBTEwsIEVJSk1QLCBMUE0gcixaLCBFTFBNIHIsWiwgU1BNLCBFU1BNIGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAyNCAxNToyMTozNSAyMDAwICBDbGludG9uIFBvcGV0eiAgPGNwb3BldHpAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgYmZkX3Bvd2VycGNfNjRfYXJjaC4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFVzZSBwcmludF9pbnNuX2JpZ19wb3dlcnBjIGZvcgotCTY0IGJpdCBjb2RlLgotCi0yMDAwLTA0LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBmcjMwLWRlc2MuYyAoZnIzMF9jZ2VuX2NwdV9vcGVuKTogSW5pdGlhbGlzZSBzaWduZWRfb3ZlcmZsb3cKLQlmaWVsZC4gCi0KLTIwMDAtMDQtMjIgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0KLQkqIGlhNjQtZ2VuLmMgKGdlbmVyYWwpOiBBZGQgYW4gb3JkZXJlZCB0YWJsZSBvZiBwcmltYXJ5Ci0Jb3Bjb2RlIG5hbWVzLCBhcyB3ZWxsIGFzIHByaW9yaXR5IGZpZWxkcyB0byBkaXNhc3NlbWJseSBkYXRhCi0Jc3RydWN0dXJlcyB0byBlbmZvcmNlIGEgcHJlZmVycmVkIGRpc2Fzc2VtYmx5IGZvcm1hdCBiYXNlZCBvbiB0aGUKLQlvcmRlcmluZyBvZiB0aGUgb3Bjb2RlIHRhYmxlcy4KLQkobG9hZF9pbnNuX2NsYXNzZXMpOiBTaG93IGEgdXNlZnVsIG1lc3NhZ2UgaWYgSUMgdGFibGVzIGFyZSBtaXNzaW5nLgotCShsb2FkX2RlcGZpbGUpOiBEaXR0by4KLQkqIGlhNjQtYXNtdGFiLmggKHN0cnVjdCBpYTY0X2Rpc19uYW1lcyApOiBBZGQgcHJpb3JpdHkgZmxhZyB0bwotCWRpc3Rpbmd1aXNoIHByZWZlcnJlZCBkaXNhc3NlbWJseS4KLQkqIGlhNjQtb3BjLWYuYzogUmVvcmRlciBzb21lIGluc24gZm9yIHByZWZlcnJlZCBkaXNhc3NlbWJseQotCWZvcm1hdC4gIEZpeCBpbmNvcnJlY3QgZmxhZyBvbiBmbWEucy9mbWEucy5zMC4KLQkqIGlhNjQtb3BjLmM6IFNjYW4gKmFsbCogZGlzYXNzZW1ibHkgbWF0Y2hlcyBhbmQgdXNlIHRoZSBvbmUgd2l0aAotCXRoZSBoaWdoZXN0IHByaW9yaXR5LgotCSogaWE2NC1vcGMtYi5jOiBVc2UgbW9yZSBhYmJyZXZpYXRpb25zLgotCSogaWE2NC1hc210YWIuYzogUmVnZW5lcmF0ZS4KLQkKLUZyaSBBcHIgMjEgMTY6MDM6MzkgMjAwMCAgSmFzb24gRWNraGFyZHQgIDxqbGVAY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAoZXh0cmFjdF8xNik6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9ocHBhKTogRml4IGluY29ycmVjdCBoYW5kbGluZyBvZiAnZmUnLiBBZGRlZCBoYW5kbGluZyBvZgotCW5ldyBvcGVyYW5kIHR5cGVzIGwseSwmLGZlLGZFLGZ4LgotCi1GcmkgQXByIDIxIDEzOjIwOjUzIDIwMDAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0JCQkgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCQkJICBUaW1vdGh5IFdhbGwgPHR3YWxsQGN5Z251cy5jb20+Ci0JCQkgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCQkJICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChIRklMRVMpOiBBZGQgaWE2NC1hc210YWIuaCwgaWE2NC1vcGMuaC4KLQkoQ0ZJTEVTKTogQWRkIGlhNjQtZGlzLmMsIGlhNjQtb3BjLWEuYywgaWE2NC1vcGMtYi5jLCBpYTY0LW9wYy1mLmMsCi0JaWE2NC1vcGMtaS5jLCBpYTY0LW9wYy1tLmMsIGlhNjQtb3BjLWQuYywgaWE2NC1vcGMuYywgaWE2NC1nZW4uYywKLQlpYTY0LWFzbXRhYi5jLgotCShBTExfTUFDSElORVMpOiBBZGQgaWE2NC1kaXMubG8sIGlhNjQtb3BjLmxvLgotCShpYTY0LWljLnRibCwgaWE2NC1yYXcudGJsLCBpYTY0LXdhdy50YmwsIGlhNjQtd2FyLnRibCwgaWE2NC1nZW4sCi0JaWE2NC1nZW4ubywgaWE2NC1hc210YWIuYywgaWE2NC1kaXMubG8sIGlhNjQtb3BjLmxvKTogTmV3IHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWd1cmUgUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2lhNjRfYXJjaCk6IE5ldyB0YXJnZXQuCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX2lhNjQpOiBEZWZpbmUuCi0JKGRpc2Fzc2VtYmxlcik6IFN1cHBvcnQgQVJDSF9pYTY0LgotCSogaWE2NC1hc210YWIuYywgaWE2NC1hc210YWIuaCwgaWE2NC1kaXMuYywgaWE2NC1nZW4uYyBpYTY0LWljLnRibCwKLQlpYTY0LW9wYy1hLmMsIGlhNjQtb3BjLWIuYywgaWE2NC1vcGMtZC5jIGlhNjQtb3BjLWYuYywgaWE2NC1vcGMtaS5jLAotCWlhNjQtb3BjLW0uYywgaWE2NC1vcGMteC5jLCBpYTY0LW9wYy5jLCBpYTY0LW9wYy5oLCBpYTY0LXJhdy50YmwsCi0JaWE2NC13YXIudGJsLCBpYTY0LXdhdy50YmwpOiBOZXcgZmlsZXMuCi0JCi0yMDAwLTA0LTIwICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLWRpcy5jIChIQVZFX0FNMzAsIEhBVkVfQU0zMyk6IERlZmluZS4KLQkoZGlzYXNzZW1ibGUpOiBVc2UgdGhlbS4KLQotMjAwMC0wNC0xNCAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogc3lzZGVwLmg6IEluY2x1ZGUgImFuc2lkZWNsLmgiIG5vdCA8YW5zaWRlY2wuaD4KLQkqIE1ha2VmaWxlLmFtOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDQtMTQgIE1pY2hhZWwgU29rb2xvdiAgPG1zb2tvbG92QGl2YW4uSGFyaGFuLk9SRz4KLQotCSogYTI5ay1kaXMuYywgYWxwaGEtZGlzLmMsIGFscGhhLW9wYy5jLCBhcmMtZGlzLmMsIGFyYy1vcGMuYywKLQlhdnItZGlzLmMsIGQxMHYtZGlzLmMsIGQxMHYtb3BjLmMsIGQzMHYtZGlzLmMsIGQzMHYtb3BjLmMsCi0JZGlzYXNzZW1ibGUuYywgaDgzMDAtZGlzLmMsIGg4NTAwLWRpcy5jLCBocHBhLWRpcy5jLCBpMzcwLWRpcy5jLAotCWkzNzAtb3BjLmMsIGk5NjAtZGlzLmMsIG0xMDIwMC1kaXMuYywgbTEwMjAwLW9wYy5jLCBtMTAzMDAtZGlzLmMsCi0JbTEwMzAwLW9wYy5jLCBtNjhrLWRpcy5jLCBtNjhrLW9wYy5jLCBtODhrLWRpcy5jLCBtY29yZS1kaXMuYywKLQltaXBzLWRpcy5jLCBtaXBzLW9wYy5jLCBtaXBzMTYtb3BjLmMsIHBqLWRpcy5jLCBwai1vcGMuYywKLQlwcGMtZGlzLmMsIHBwYy1vcGMuYywgc2gtZGlzLmMsIHNwYXJjLWRpcy5jLCBzcGFyYy1vcGMuYywKLQl0aWM4MC1kaXMuYywgdGljODAtb3BjLmMsIHY4NTAtZGlzLmMsIHY4NTAtb3BjLmMsIHZheC1kaXMuYywKLQl3NjUtZGlzLmMsIHo4ay1kaXMuYywgejhrZ2VuLmM6IEluY2x1ZGUgc3lzZGVwLmguICBSZW1vdmUKLQlhbnNpZGVjbC5oIGFzIHN5c2RlcC5oIGluY2x1ZGVzIGl0LgotCi1GcmkgQXByICA3IDE1OjU2OjU3IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLSAKLQkqIGNvbmZpZ3VyZS5pbiAoV0FSTl9DRkxBR1MpOiBTZXQgdG8gLVcgLVdhbGwgYnkgZGVmYXVsdC4gIEFkZAotIAktLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvcHRpb24uCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTLCBXQVJOX0NGTEFHUyk6IEFkZCBkZWZpbml0aW9ucy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi1XZWQgQXByICA1IDIyOjI4OjE4IDIwMDAgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogc2gtb3BjLmMgKHNoX3RhYmxlKTogVXNlIEFfRElTUF9QQyAvIFBDUkVMSU1NXzhCWTIgZm9yIGxkcmUgJiBsZHJzLgotCXN0YyBHQlIsQC08UkVHX04+IGlzIGF2YWlsYWJsZSBmb3IgYXJjaF9zaDFfdXAuCi0JR3JvdXAgcGFyYWxsZWwgcHJvY2Vzc2luZyBpbnNuIHdpdGggaWRlbnRpY2FsIG1uZW1vbmljcyB0b2dldGhlci4KLQlNYWtlIHRocmVlLW9wZXJhbmQgcHNoYSAvIHBzaGwgY29tZSBmaXJzdC4KLQotV2VkIEFwciAgNSAyMjowNTo0MCAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSk6IFJlbW92ZSBESVNQXzggYW5kIERJU1BfNC4KLQlTcGxpdCBJTU1fWzQ4XXssQllbMjRdfSBpbnRvIElNTVswMV1fWzQ4XXssQllbMjRdfS4gIEFkZCBSRVBFQVQuCi0JKHNoX2FyZ190eXBlKTogQWRkIEFfUEMuCi0JKHNoX3RhYmxlKTogVXBkYXRlIGVudHJpZXMgdXNpbmcgaW1tZWRpYXRlcy4gIEFkZCByZXBlYXQuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBSZW1vdmUgRElTUF84IGFuZCBESVNQXzQuCi0JU3BsaXQgSU1NX1s0OF17LEJZWzI0XX0gaW50byBJTU1bMDFdX1s0OF17LEJZWzI0XX0uICBBZGQgUkVQRUFULgotCi0yMDAwLTA0LTA0ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZS4KLQotCSogTWFrZWZpbGUuYW0gKE1LREVQKTogVXNlIGdjYyAtTU0gcmF0aGVyIHRoYW4gbWtkZXAuCi0JKERFUCk6IFF1b3RlIHdoZW4gcGFzc2luZyB2YXJzIHRvIHN1Yi1tYWtlLiAgQWRkIHdhcm5pbmcgbWVzc2FnZQotCXRvIGVuZC4KLQkoREVQMSk6IFJld3JpdGUgZm9yICJnY2MgLU1NIi4KLQkoQ0xFQU5GSUxFUyk6IEFkZCBERVAyLgotCVVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotMjAwMC0wNC0wMyAgRGVuaXMgQ2hlcnR5a292ICA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotCSogYXZyLWRpcy5jOiBTeW50YXggY2xlYW51cC4KLQkoYWRkMGZmZik6IFByaW50IHRoZSBwYyByZWxhdGl2ZSBhZGRyZXNzIGFzIGEgc2lnbmVkIG51bWJlci4KLQkoYWRkMDNmOCk6IExpa2V3aXNlLgotCi0yMDAwLTA0LTAxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyX3VzYWdlKTogRG9uJ3QgdXNlIGEgcHJvdG90eXBlLiAgTWFyawotCXRoZSBwYXJhbWV0ZXIgQVRUUklCVVRFX1VOVVNFRC4KLQkqIHBwYy1vcGMuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgbmVlZGVkLgotCi0yMDAwLTA0LTAxICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLW9wYy5jOiBTUC1iYXNlZCBvZmZzZXRzIGFyZSBhbHdheXMgdW5zaWduZWQuCi0KLTIwMDAtMDMtMjkgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IERpc2Fzc2VtYmxlIDB4ZGUuLiB0byAiYmFsIgotCVticmFuY2ggYWx3YXlzXSBpbnN0ZWFkIG9mICJ1bmRlZmluZWQiLgotCi0yMDAwLTAzLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IE1vdmUgU0hPUlRfQVIgdG8gZW5kIG9mIGxpc3Qgb2YKLQlzaG9ydCBpbnN0cnVjdGlvbnMsIGZyb20gZW5kIG9mIGxpc3Qgb2YgbG9uZyBpbnN0cnVjdGlvbnMuCi0KLTIwMDAtMDMtMjcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGF2ci1kaXMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGF2ci1kaXMubG8uCi0KLTIwMDAtMDMtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20+Ci0KLQkqIGF2ci1kaXMuYyAoYWRkMGZmZiwgYWRkMDNmOCk6IERvbid0IHVzZSBzdHJ1Y3R1cmUgYml0ZmllbGRzIHRvCi0JdHJ1bmNhdGUgaW50ZWdlcnMuCi0JKHByaW50X2luc25fYXZyKTogQ2FsbCBmdW5jdGlvbiB2aWEgcG9pbnRlciBpbiBLJlIgY29tcGF0aWJsZSB3YXkuCi0JKGRpc3BMREQsIHJlZ1BQLCByZWc1MCwgcmVnMTA0LCByZWc0MCwgcmVnMjB3LCBsaXQ0MDQsIGxpdDIwNCwKLQlhZGQwZmZmLCBhZGQwM2Y4KTogQ29udmVydCB0byBvbGQgc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gYW5kCi0JYWRkIHByb3RvdHlwZS4KLQkoYXZyZGlzX29wY29kZSk6IEFkZCBwcm90b3R5cGUuCi0KLTIwMDAtMDMtMjcgIERlbmlzIENoZXJ0eWtvdiAgPGRlbmlzY0BvdmVydGEucnU+Ci0KLQkqIGF2ci1kaXMuYzogTmV3IGZpbGUuICBBVlIgZGlzYXNzZW1ibGVyLgotCSogY29uZmlndXJlLmluIChiZmRfYXZyX2FyY2gpOiBOZXcgYXJjaGl0ZWN0dXJlIHN1cHBvcnQuCi0JKiBkaXNhc3NlbWJsZS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotTW9uIE1hciAgNiAxOTo1MjowNSAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IGxkcmUgYW5kIGxkcnMgaGF2ZSBhICpzaWduZWQqIGRpc3BsYWNlbWVudC4KLQotMjAwMC0wMy0wMiAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0gICAgICAgICogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IFJlbW92ZSBkKmkgaGFja3MuICBVc2UgcGVyLW9wZXJhbmQKLSAgICAgICAgZmxhZyB0byBkZXRlcm1pbmUgaWYgb3BlcmFuZCBpcyBwYy1yZWxhdGl2ZS4KLSAgICAgICAgKiBkMzB2LW9wYy5jOgotICAgICAgICAoZDMwdl9mb3JtYXRfdGFibGUpOgotICAgICAgICAoUkVMNlMzKTogUmVuYW1lZCBmcm9tIElNTTZTMy4KLSAgICAgICAgQWRkZWQgZmxhZyBPUEVSQU5EX1BDUkVMLgotICAgICAgICAoUkVMMTJTMywgUkVMMThTMywgUkVMMzIpOiBTcGxpdCBmcm9tIElNTTEyUzMsIElNTTE4UzMsIFJFTDMyLCB3aXRoCi0gICAgICAgIGFkZGVkIGZsYWcgT1BFUkFORF9QQ1JFTC4KLSAgICAgICAgKElNTTEyUzNVKTogUmVwbGFjZWQgd2l0aCBSRUwxMlMzLgotICAgICAgICAoU0hPUlRfRDIsIExPTkdfRCk6IERlbGF5IHRhcmdldCBpcyBwYy1yZWxhdGl2ZS4KLSAgICAgICAgKFNIT1JUX0IyciwgU0hPUlRfQjNyLCBTSE9SVF9CM2JyLCBTSE9SVF9EMnIsIExPTkdfVXIsIExPTkdfMnIpOgotICAgICAgICBTcGxpdCBmcm9tIFNIT1JUX0IyLCBTSE9SVF9EMiwgU0hPUlRfQjNiLCBTSE9SVF9EMiwgTE9OR19VLCBMT05HXzJyLAotICAgICAgICB1c2luZyB0aGUgUkVMKiBvcGVyYW5kcy4KLSAgICAgICAgKExPTkdfMmJyLCBMT05HX0RyKTogTGlrZXdpc2UsIGZyb20gTE9OR18yYiwgTE9OR19ELgotICAgICAgICAoU0hPUlRfRDFyLCBTSE9SVF9EMkJyLCBMT05HX0Ricik6IFJlbmFtZWQgZnJvbSBTSE9SVF9EMSwgU0hPUlRfRDJCLAotICAgICAgICBMT05HX0RiLCB1c2luZyBSRUwqIG9wZXJhbmRzLgotICAgICAgICAoU0hPUlRfVSwgU0hPUlRfQTVTKTogUmVtb3ZlZCBzdHJheSBhbHRlcm5hdGl2ZXMuCi0gICAgICAgIChkMzB2X29wY29kZV90YWJsZSk6IFVzZSBuZXcgKnIgZm9ybWF0cy4KLQotMjAwMC0wMi0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1kZXNjLmMgKG0zMnJfY2dlbl9jcHVfb3Blbik6IFJlcGxhY2UgJ2ZsYWdzJyB3aXRoCi0JJ3NpZ25lZF9vdmVyZmxvd19va19wJy4KLQotMjAwMC0wMi0yNyAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IFVzZSAkKExJQlRPT0wpIC0tY29uZmlnIHRvIGdldCB0aGUKLQluYW1lIG9mIHRoZSBsaWJ0b29sIGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9zaWduZWRfb3ZlcmZsb3dfb2spOiBOZXcgZnVuY3Rpb24uCi0JKGNnZW5fY2xlYXJfc2lnbmVkX292ZXJmbG93X29rKTogTmV3IGZ1bmN0aW9uLgotCShjZ2VuX3NpZ25lZF9vdmVyZmxvd19va19wKTogTmV3IGZ1bmN0aW9uLgotCi0yMDAwLTAyLTIzICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG0zMnItYXNtLmMsIG0zMnItZGVzYy5jLCBtMzJyLWRlc2MuaCwgbTMyci1kaXMuYywKLQltMzJyLWlibGQuYyxtMzJyLW9wYy5oOiBSZWJ1aWxkLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGkzNzAtZGlzLmMsIGkzNzAtb3BjLmM6IE5ldy4KLQotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF9pMzcwKTogRGVmaW5lLgotCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgaXQuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvSUJNIDM3MC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yMiAgQ2hhbmRyYSBDaGF2dmEgICA8Y2NoYXZ2YUBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWIpIDogQWRkZWQgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAgdG8KLQlTVDJILCBTVEIsIFNUSCwgU1RISCwgU1RXIGFuZCBTVDJIIG9wY29kZXMgdG8gcHJvaGliaXQgcGFyYWxsZWwKLQlwcm9jZWR1cmUuCi0KLTE5OTktMTItMzAgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogTmV3IGFyZyBmb3IgT1BDT0RFX0lTX01FTUJFUjoKLQlmb3JjZSBncDMyIHRvIHplcm8uCi0JKiBtaXBzLW9wYy5jIChHNik6IE5ldyBkZWZpbmUuCi0JKG1pcHNfYnVpbHRpbl9vcCk6IEFkZCAibW92ZSIgZGVmaW5pdGlvbiBmb3IgLWdwMzIuCi0KLTIwMDAtMDItMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29AQnJvY2FkZS5DT00+OgotCSogcHBjLW9wYy5jOiBDb3JyZWN0IGRjcmVhZC0taXQgdGFrZXMgMyBhcmd1bWVudHMsIG5vdCAyLgotCi0yMDAwLTAyLTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogQ2hhbmdlIGBsZW5ndGgnIHBhcmFtIGFuZCBhbGwgaW50Ci0JdmFycyB0byB1bnNpZ25lZC4KLQotVGh1IEZlYiAxNyAwMDoxODoxMiAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9tb3Z4eSwgcHJpbnRfaW5zbl9kZHQsIHByaW50X2RzcF9yZWcpOiBOZXcgZnVuY3Rpb25zLgotCShwcmludF9pbnNuX3BwaSk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX3NoeCk6IFVzZSBpbmZvLT5tYWNoIHRvIHNlbGVjdCBhcHByb3ByaWF0ZSBpbnNuIHNldC4KLQlBZGQgc3VwcG9ydCBmb3Igc2gtZHNwLiAgUmVtb3ZlIEZEX1JFR19OIHN1cHBvcnQuCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUpOiBBZGQgbmV3IHZhbHVlcyBmb3Igc2gtZHNwIHN1cHBvcnQuCi0JKHNoX2FyZ190eXBlKTogTGlrZXdpc2UuICBSZW1vdmUgRkRfUkVHX04uCi0JKHNoX2RzcF9yZWdfbnVtcyk6IE5ldyBlbnVtLgotCShhcmNoX3NoMSwgYXJjaF9zaDIsIGFyY2hfc2gzLCBhcmNoX3NoM2UsIGFyY2hfc2g0KTogTmV3IG1hY3Jvcy4KLQkoYXJjaF9zaF9kc3AsIGFyY2hfc2gzX2RzcCwgYXJjaF9zaDFfdXAsIGFyY2hfc2gyX3VwKTogTGlrZXdpc2UuCi0JKGFyY2hfc2gzX3VwLCBhcmNoX3NoM2VfdXAsIGFyY2hfc2g0X3VwLCBhcmNoX3NoX2RzcF91cCk6IExpa2V3aXNlLgotCShhcmNoX3NoM19kc3BfdXApOiBMaWtld2lzZS4KLQkoc2hfb3Bjb2RlX2luZm8pOiBOZXcgZmllbGQ6IGFyY2guCi0JKHNoX3RhYmxlKTogU3BsaXQgdXAgaW5zbiB3aXRoIEZEX1JFR19OIGludG8gb25lcyB3aXRoIEZfUkVHX04gYW5kCi0JRF9SRUdfTi4gIEZpbGwgaW4gYXJjaCBmaWVsZC4gIEFkZCBzaC1kc3AgaW5zbnMuCi0KLTIwMDAtMDItMTQgIEZlcm5hbmRvIE5hc3NlciAgPGZuYXNzZXJAdG90ZW0udG8uY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jOiBDaGFuZ2UgZmxhdm9yIG5hbWUgZnJvbSBhdHBjcy1zcGVjaWFsIHRvCi0Jc3BlY2lhbC1hdHBjcyB0byBwcmV2ZW50IG5hbWUgY29uZmxpY3QgaW4gZ2RiLgotCShnZXRfYXJtX3JlZ25hbWVfbnVtX29wdGlvbnMsIHNldF9hcm1fcmVnbmFtZV9vcHRpb24sCi0JZ2V0X2FybV9yZWduYW1lcyk6IE5ldyBmdW5jdGlvbnMuICBBUEkgdG8gYWNjZXNzIHRoZSBzZXZlcmFsCi0JZmxhdm9yIG9mIHJlZ2lzdGVyIG5hbWVzLiAgTm90ZTogVXNlZCBieSBnZGIuCi0JKHByaW50X2luc25fdGh1bWIpOiBVc2UgdGhlIHJlZ2lzdGVyIG5hbWUgZW50cnkgZnJvbSB0aGUgY3VycmVudGx5Ci0Jc2VsZWN0ZWQgZmxhdm9yIGZvciBMUiBhbmQgUEMuCi0KLTIwMDAtMDItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLW9wYy5oIChlbnVtIG1jb3JlX29wY2xhc3MpOiBBZGQgTVVMU0ggYW5kIE9QU1IKLQljbGFzc2VzLgotCShtY29yZV90YWJsZSk6IEFkZCAiaWRseTQiLCAicHNyY2xyIiwgInBzcnNldCIsICJtdWxzaCIgYW5kCi0JIm11bHNoLmgiIGluc3RydWN0aW9ucy4KLQkqIG1jb3JlLWRpcy5jIChpbXNrIGFycmF5KTogQWRkIG1hc2tzIGZvciBNVUxTSCBhbmQgT1BTUgotCWNsYXNzZXMuCi0JKHByaW50X2luc25fbWNvcmUpOiBBZGQgc3VwcG9ydCBmb3IgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgotCUFkZCBzdXBwb3J0IGZvciBNVUxTSCBhbmQgT1BTUiBjbGFzc2VzLgotCi0yMDAwLTAyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHBhcnNlX2FybV9kaWFzc2VtYmxlcl9vcHRpb24pOiBSZW5hbWUgYWdhaW4uCi0JUHJldmlvdXMgZGVsYXQgZGlkIG5vdCB0YWtlLgotCi0yMDAwLTAyLTAzICBUaW1vdGh5IFdhbGwgIDx0d2FsbEByZWRoYXQuY29tPgkKLQkKLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogIFVzZSBvY3RldHNfcGVyX2J5dGUgZmllbGQKLQl0byBhZGp1c3QgdGFyZ2V0IGFkZHJlc3MgYm91bmRzIGNoZWNraW5nIGFuZCBjYWxjdWxhdGUgdGhlCi0JYXBwcm9wcmlhdGUgb2N0ZXQgb2Zmc2V0IGludG8gZGF0YS4KLQkKLTIwMDAtMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQHJlZGhhdC5jb20+Ci0KLQkqIGFybS1kaXMuYzogKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBSZW5hbWUgdG8KLQlwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbiBhbmQgYWxsb3cgdG8gYmUgZXhwb3J0ZWQuCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcl91c2FnZSk6IE5ldyBmdW5jdGlvbjogUHJpbnQgb3V0IGFueQotCXRhcmdldCBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucy4KLQlDYWxsIGFybV9kaXNhc3NlbWJsZXJfb3B0aW9ucygpIGlmIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGlzIGJlaW5nCi0Jc3VwcG9ydGVkLiAgCi0KLQkqIGFybS1kaXMuYyAoTlVNX0VMRU0pOiBEZWZpbmUgdGhpcyBtYWNybyBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGFybV9yZWduYW1lKTogTmV3IHN0cnVjdCB0eXBlIGZvciBBUk0gcmVnaXN0ZXIgbmFtZXMuCi0JKGFybV90b2dnbGVfcmVnbmFtZXMpOiBEZWxldGUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBVc2UgcmVnaXN0ZXIgbmFtZSBzdHJ1Y3R1cmUuCi0JKHByaW50X2luc24pOiBOZXcgZnVuY3Rpb246IENvbWJpbmVzIGR1cGxpY2F0ZSBjb2RlIGZvdW5kIGluCi0JcHJpbnRfaW5zbl9iaWdfYXJtIGFuZCBwcmludF9pbnNuX2xpdHRsZV9hcm0uCi0JKHByaW50X2luc25fYmlnX2FybSk6IENhbGwgcHJpbnRfaW5zbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2FsbCBwcmludF9pbnNuLgotCShwcmludF9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbnMpOiBEaXNwbGF5IGxpc3Qgb2Ygc3VwcG9ydGVkLAotCUFSTSBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucy4KLQkgIAotMjAwMC0wMS0yNyAgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd2luZHJpdmVyLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRmX2luc25fYmlnX2FybSk6IFRyZWF0IEVMRiBzeW1ib2xzIHdpdGggdGhlCi0JQVJNX1NUVF8xNkJJVCBmbGFnIGFzIFRodW1iIGNvZGUgc3ltYm9scy4KLSAgICAgICAgCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludGZfaW5zbl9saXR0bGVfYXJtKTogRGl0dG8uCi0KLTIwMDAtMDEtMjUgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRmX2luc25fdGh1bWIpOiBQcmV2ZW50IGRvdWJsZSBkdW1waW5nCi0gICAgICAgIG9mIHJhdyB0aHVtYiBpbnN0cnVjdGlvbnMuCi0KLTIwMDAtMDEtMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLW9wYy5oIChtY29yZV90YWJsZSk6IEFkZCAiYWRkIiBhcyBhbiBhbGlhcyBmb3IgImFkZHUiLgotCi0yMDAwLTAxLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHN0cmVxKTogTmV3IG1hY3JvLgotCShzdHJuZXEpOiBOZXcgbWFjcm8uCi0JKGZvcmNlX3RodW1iKTogZXcgbG9jYWwgdmFyaWFibGUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBOZXcgZnVuY3Rpb246IFBhcnNlIGEgc2luZ2xlLCBBUk0KLQlzcGVjaWZpYyBkaXNhc3NlbWJsZXIgY29tbWFuZCBsaW5lIHN3aXRjaC4KLQkocGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbik6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbiB0bwotCXBhcnNlIGluZGl2aWR1YWwgY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBDaGVjayBmb3JjZV90aHVtYi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2hlY2sgZm9yY2VfdGh1bWIuCi0KLTE5OTktMTItMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZ3Jwc1tdKTogQ29ycmVjdCBHUlA1IEZGLzMgZnJvbSAiY2FsbCIgdG8gImxjYWxsIi4KLQotV2VkIERlYyAgMSAwMzozNDo1MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYywgbTEwMzAwLWRpcy5jOiBBZGQgYW0zMyBzdXBwb3J0LgotCi1XZWQgTm92IDI0IDIwOjI5OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAodW5pdF9jb25kX25hbWVzKTogQWRkIFBBMi4wIHVuaXQgY29uZGl0aW9uIG5hbWVzLgotCShwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ0InIG9wZXJhbmQuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IEZpeCBwYXR0ZXJuIGZvciAiY3BmZyxmezB8MX0sYyIgaW5zdHJ1Y3Rpb24uCi0KLTE5OTktMTEtMTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChJNSk6IE5ldy4KLQkoYWJzLnBzLGFkZC5wcyxhbG52LnBzLGMuQ09ORC5wcyxjdnQucy5wbCxjdnQucy5wdSxjdnQucHMucwotCW1hZGQucHMsbW92Zi5wcyxtb3Z0LnBzLG11bC5wcyxuZXQucHMsbm1hZGQucHMsbm1zdWIucHMsCi0JcGxsLnBzLHBsdS5wcyxwdWwucHMscHV1LnBzLHN1Yi5wcyxzdXhjMSxsdXhjMSk6IE5ldy4KLQotTW9uIE5vdiAxNSAxOTozNDo1OCAxOTk5ICBEb25hbGQgTGluZHNheSAgPGRsaW5kc2F5QGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGRlZCBnZW5lcmFsIHB1cnBvc2UgJ1gnIGZvcm1hdC4KLQkqIGFybS1vcGMuaCAocHJpbnRfaW5zbl9hcm0pOiBBZGRlZCBjb21tZW50IGRvY3VtZW50aW5nCi0JdGhlICdYJyBmb3JtYXQganVzdCBhZGRlZCB0byBhcm0tZGlzLmMuCi0KLTE5OTktMTEtMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChsYSk6IENyZWF0ZSBhIHZlcnNpb24gdGhhdCBqdXN0IHVzZXMgYWRkaXUgZGlyZWN0bHkuCi0JKGRsYSk6IEV4cGFuZCB0byBkYWRkaXUgaWYgcG9zc2libGUuCi0KLTE5OTktMTEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBzc25vcCBwYXR0ZXJuLgotCi0xOTk5LTExLTAxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFVzZSBPUENPREVfSVNfTUVNQkVSLgotCi0xOTk5LTEwLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChtdnRhY2MpOiBVc2UgZm9ybWF0IFNIT1JUX0FSIG5vdCBTSE9SVF9BQQotCShkMzB2X2Zvcm1hdF90YWIpOiBEZWZpbmUgdGhlIFNIT1JUX0FSIGZvcm1hdC4KLQotMTk5OS0xMC0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUtZGlzLmM6IFJlbW92ZSBzcHVyaW91cyBjb2RlIGludHJvZHVjZWQgaW4gcHJldmlvdXMgZGVsdGEuIAotCi0xOTk5LTEwLTI3ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogYXJtLWRpcy5jOiBJbmNsdWRlIHN5c2RlcC5oIHRvIHByZXZlbnQgY29tcGlsZSB0aW1lIHdhcm5pbmdzLgotCi0xOTk5LTEwLTE4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wZXJhbmRzKTogRmlsbCBpbiBtaXNzaW5nIGluaXRpYWxpemVyLgotCShhbHBoYV9udW1fb3BlcmFuZHMpOiBDb252ZXJ0IHRvIHVuc2lnbmVkLgotCShhbHBoYV9udW1fb3Bjb2Rlcyk6IERpdHRvLgotCShpbnNlcnRfcmJhKTogRGVjbGFyZSB1bnVzZWQgYXJndW1lbnRzIEFUVFJJQlVURV9VTlVTRUQuCi0JKGluc2VydF9yY2EpOiBEaXR0by4KLQkoaW5zZXJ0X3phKTogRGl0dG8uCi0JKGluc2VydF96Yik6IERpdHRvLgotCShpbnNlcnRfemMpOiBEaXR0by4KLQkoZXh0cmFjdF9iZGlzcCk6IERpdHRvLgotCShleHRyYWN0X2poaW50KTogRGl0dG8uCi0JKGV4dHJhY3RfZXY2aHdqaGludCk6IERpdHRvLgotCi1TdW4gT2N0IDEwIDAxOjQ4OjAxIDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmc+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6ICBBZGQgbmV3IGNvZGVzICdjYycsICdjZCcsICdjQycsCi0JJ2NvJywgJ0AnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZW1vdmVkIHVudXNlZCBhcmdzLiAgRml4ICc/VycuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6ICBJbXBsZW1lbnQgY29kZXMgIj9OIiwgIj9RIi4KLQotVGh1IE9jdCAgNyAwMDoxMjo0MyBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wZXJhbmRzKTogQWRkIFJFU1RSSUNURURfTlVNMyBmbGFnIGZvcgotCXJhYy9yYWNoaSBpbnN0cnVjdGlvbnMuCi0JKGQxMHZfb3Bjb2Rlcyk6IEFkZGVkIHNldmVuIG5ldyBpbnN0cnVjdGlvbnMgbGQsIGxkMncsIHNhYywgc2FjaGksCi0Jc2xhZSwgc3QgYW5kIHN0MncuCi0KLTE5OTktMTAtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRlc2MuaDogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmMsbTMyci1kZXNjLmg6IFJlYnVpbGQuICBBZGQgbTMycnggc3VwcG9ydC4KLQkqIG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItb3BpbnN0LmM6IERpdHRvLgotCi0xOTk5LTA5LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogRml4IGJpdCBwYXR0ZXJucyBmb3Igc2V2ZXJhbCBsb2FkIGFuZCBzdG9yZQotCWluc3RydWN0aW9ucy4gIAotCi1UaHUgU2VwIDIzIDA4OjI3OjIwIDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmcKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVwbGFjZSAnQicsICdNJywgJ2cnIGFuZCAnbCcgd2l0aAotCWNsZWFuZXIgY29kZSB1c2luZyBjb21wbGV0ZXIgcHJlZml4ZXMuICBBZGQgJ1knLgotCi1TdW4gU2VwIDE5IDEwOjQxOjI3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogKHByaW50X2luc25faHBwYSk6IENvcnJlY3QgJ2NKJywgJ2NjJy4KLQotCSogaHBwYS1kaXMuYyAoZXh0cmFjdF8yMik6IE5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdKJywgJ0snLCBhbmQgJ2NjJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdmZScgYW5kICdjSicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnIycsICdkJywgYW5kICdjcScuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnbScsICdoJywgJz0nLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ1gnIG9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnQicgb3BlcmFuZC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdNJyBhbmQgJ0wnIG9wZXJhbmRzLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ2wnIG9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnZycgb3BlcmFuZC4KLQotU2F0IFNlcCAxOCAxMTozNjoxMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IE91dHB1dCBhIHNwYWNlIGFmdGVyICdYJyBjb21wbGV0ZXIuCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBEbyBvdXRwdXQgYSBzcGFjZSBiZWZvcmUgYSAndicKLQlvcGVyYW5kLgotCi0JKiBocHBhLWRpcy5jOiAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdmWCcuCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBBZGQgbWlzc2luZyBicmVhayBhZnRlcgotCUZQIHJlZ2lzdGVyIGNhc2UuCi0KLQkqIGhwcGEtZGlzLmM6IEZpbmlzaCBjb25zdGlmeWluZyB2YXJpb3VzIGNvbXBsZXRlcnMsIHJlZ2lzdGVyCi0JbmFtZXMsIGV0YyBldGMuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIFNlcCAgNyAxMzo1MDozMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEVzY2FwZSAnJScgaW4gb3V0cHV0IHN0cmluZ3MuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnWicgYXJndW1lbnQuCi0KLTE5OTktMDktMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgbXVsdS53IGFuZCBtdWxzLncgcGF0dGVybnMuICBUaGVzZSBhcmUgdGhlIGNvcnJlY3QKLQluYW1lcyBmb3IgdGhlIG11bHUgYW5kIG11bHMgcGF0dGVybnMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogcGotb3BjLmM6IE5ldyBmaWxlLgotCSogcGotZGlzLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYwkoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9hcmNoX3BqLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgYmZkX3BqX2FyY2guCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBwai1kaXMuYyBhbmQgcGotb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBwai1kaXMubG8gYW5kIHBqLW9wYy5sby4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDktMDQgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogU2V0IGJ5dGVzX3Blcl9saW5lIHRvIDcuCi0KLU1vbiBBdWcgMzAgMTg6NTY6MTQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGZldGNoLCBmZXRjaF9tLCBlY2IsIHdoNjQpOiBSQSBtdXN0IGJlIFIzMS4KLQotMTk5OS0wOC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotU2F0IEF1ZyAyOCAwMDoyNzoyNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotICAgICAgICAqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlcGxhY2UgJ2YnIGJ5ICd2Jy4gIFByZWZpeCBmbG9hdAotCXJlZ2lzdGVyIGFyZ3MgYnkgJ2YnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBBZGQgYXJncyBxLCAlLCAhLCBhbmQgfC4KLQotCSogaHBwYS1kaXMuYyAoTUFTS18xMCwgcmVhZF93cml0ZV9uYW1lcywgYWRkX2NvbXBsX25hbWVzLAotCWV4dHJhY3RfMTBVX3N0b3JlKTogIE5ldy4KLQkocHJpbnRfaW5zbl9ocHBhKTogIEFkZCBuZXcgY29tcGxldGVycy4KLQotCSogaHBwYS1kaXMuYyAoc2lnbmVkX3Vuc2lnbmVkX25hbWVzLG1peF9oYWxmX25hbWVzLAotCXNhdHVyYXRpb25fbmFtZXMpOiAgTmV3LgotCShwcmludF9pbnNuX2hwcGEpOiBBZGQgY29tcGxldGVyIGNvZGVzICdhJywgJ2NoJywgJ2NIJywgJ2NTJywgYW5kICdjKicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFBsYWNlIGNvbXBsZXRlcnMgYmVoaW5kIHByZWZpeCAnYycuIAotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBBZGQgY2FzZXMgZm9yICcuJywgJ34nLiAnJCcuIGFuZCAnIScKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogIExvb2sgYXQgbmV4dCBhcmcgaW5zdGVhZCBvZiBiaXRzCi0JdG8gZGVjaWRlIHRvIHByaW50IGEgc3BhY2UuCi0KLTE5OTktMDgtMjEgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogQWRkIEFNRCBhdGhsb24gaW5zdHJ1Y3Rpb24gc3VwcG9ydC4KLQotMTk5OS0wOC0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIFdhbGx5IElpbXVyYSA8aWltdXJhQG1pY3JvdW5pdHkuY29tPjoKLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGF2b2lkCi0Jb3ZlcmZsb3cgYXQgZW5kIG9mIGFkZHJlc3Mgc3BhY2UuCi0JKGdlbmVyaWNfcHJpbnRfYWRkcmVzcyk6IFVzZSBzcHJpbnRmX3ZtYS4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW5hbWUgLmRlcCogZmlsZXMgdG8gREVQKi4gIENoYW5nZSBERVAgdmFyaWFibGUgdG8KLQlNS0RFUC4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDYgMDk6NDY6MzUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKGNvbXBhcmVfY29uZF82NF9uYW1lcywgY21waWJfY29uZF82NF9uYW1lcywKLQlhZGRfY29uZF82NF9uYW1lcywgd2lkZV9hZGRfY29uZF9uYW1lcywgbG9naWNhbF9jb25kXzY0X25hbWVzLAotCXVuaXRfY29uZF82NF9uYW1lcywgc2hpZnRfY29uZF82NF9uYW1lcywgYmJfY29uZF82NF9uYW1lcyk6IE5ldy4KLQkocHJpbnRfaW5zbl9ocHBhKTogQWRkIDY0IGJpdCBjb25kaXRpb24gY29tcGxldGVycy4KLQotVGh1IEF1ZyAgNSAxNjo1OTo1OCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogQ2hhbmdlIGNvbmRpdGlvbiBhcmdzIHRvIHVzZQotCSc/JyBwcmVmaXguCi0KLVdlZCBKdWwgMjggMDQ6MzM6NTggMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0IGluICdFJwotCWNvZGUuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRpcy1idWYuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgYXBwcm9wcmlhdGUuCi0JKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogaTM4Ni1kaXMuYzogSW5pdGlhbGl6ZSBhbGwgc3RydWN0dXJlIGZpZWxkcyB0byBhdm9pZCB3YXJuaW5ncy4KLQlBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBhcHByb3ByaWF0ZS4KLQotMTk5OS0wNy0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IERpZmZlcmVudGlhdGUgYmV0d2VlbgotCWFkZGl0aW9uIGFuZCBvcmluZyB3aGVuIGd1ZXNzaW5nIHN5bWJvbCBmb3IgY29tbWVudC4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERpc3BsYXkgaGV4IGVxdWl2YWxlbnQgb2Ygcm90YXRlZAotCWNvbnN0YW50LiAKLQotMTk5OS0wNi0yMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiBNZW50aW9uIGludGVsIG1vZGUgc3BlY2lhbHMgaW4gbWFjcm8gY2hhciBjb21tZW50LgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYWxwaGEtZGlzLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPi4KLQkqIGFybS1kaXMuYzogSW5jbHVkZSAic3lzZGVwLmgiLgotCSogdGljMzAtZGlzLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPiBvciA8c3RyaW5nLmg+LiAgSW5jbHVkZQotCSJzeXNkZXAuaCIuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZCBkZXRlY3Rpb24gb2YgSU1CIGFuZCBJTUJSYW5nZQotCVNXSXMuIAotCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPiAmIERyZXcgTW9zbGV5IDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKGFybV9yZWduYW1lcyk6IFR1cm4gaW50byBhIHBvaW50ZXIgdG8gYSByZWdpc3RlcgotCW5hbWUgc2V0LgotCShhcm1fcmVnbmFtZXNfc3RhbmRhcmQpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlcgotCW5hbWVzIGFjY29yZGluZyB0byBBUk0gaW5zdHJ1Y3Rpb24gc2V0IG5vbWVuY2xhdHVyZS4gCi0JKGFybV9yZWduYW1lc19hcGNzKTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIgbmFtZXMKLQlhY2NvcmRpbmcgdG8gQVJNIFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkLgotCShhcm1fcmVnbmFtZXNfcmF3KTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIgbmFtZXMKLQl1c2luZyBqdXN0ICdyJyBhbmQgdGhlIHJlZ2lzdGVyIG51bWJlci4KLQkoYXJtX3RvZ2dsZV9yZWduYW1lcyk6IE5ldyBmdW5jdGlvbjogVG9nZ2xlIHRoZSBjaG9zZW4gcmVnaXN0ZXIgc2V0Ci0JbmFtaW5nIHNjaGVtZS4KLQkocGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMpOiBOZXcgZnVuY3Rpb246IFBhcnNlIGFueSB0YXJnZXQKLQlkaXNhc3NlbWJsZXIgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JKHByaW50X2luc25fYmlnX2FybSk6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgaWYgYW55Ci0JYXJlIGRlZmluZWQuCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgaWYgYW55Ci0JYXJlIGRlZmluZWQuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBpMzg2LWRpcy5jIChGV0FJVF9PUENPREUpOiBEZWZpbmUuCi0JKHVzZWRfcHJlZml4ZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmZXRjaF9kYXRhKTogRG9uJ3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBoYXZlIGFscmVhZHkKLQlmZXRjaGVkIHNvbWUgYnl0ZXMgc3VjY2Vzc2Z1bGx5LgotCShja3ByZWZpeCk6IENsZWFyIHVzZWRfcHJlZml4ZXMuICBVc2UgRldBSVRfT1BDT0RFLCBub3QgMHg5Yi4KLQkocHJlZml4X25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9pbnNuX2kzODYpOiBJZiBzZXRqbXAgZmFpbHMsIGluZGljYXRpbmcgYSBkYXRhIGVycm9yLCBidXQKLQl3ZSBoYXZlIG1hbmFnZWQgdG8gZmV0Y2ggc29tZSBieXRlcywgcHJpbnQgdGhlIGZpcnN0IG9uZSBhcyBhCi0JcHJlZml4IG9yIGEgLmJ5dGUgcHNldWRvLW9wLiAgSWYgZndhaXQgaXMgZm9sbG93ZWQgYnkgYSBub24KLQlmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiwgcHJpbnQgdGhlIGZpcnN0IHByZWZpeC4gIFNldAotCXVzZWRfcHJlZml4ZXMgd2hlbiBwcmVmaXhlcyBhcmUgdXNlZC4gIElmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdAotCXVzZWQgYWZ0ZXIgZGlzYXNzZW1ibGluZyB0aGUgaW5zdHJ1Y3Rpb24sIHByaW50IHRoZSBmaXJzdCBwcmVmaXgKLQlpbnN0ZWFkIG9mIHByaW50aW5nIHRoZSBpbnN0cnVjdGlvbi4KLQkocHV0b3ApOiBTZXQgdXNlZF9wcmVmaXhlcyB3aGVuIHByZWZpeGVzIGFyZSB1c2VkLgotCShhcHBlbmRfc2VnLCBPUF9FLCBPUF9HLCBPUF9SRUcsIE9QX0ksIE9QX3NJLCBPUF9KKTogTGlrZXdpc2UuCi0JKE9QX0RJUiwgT1BfU0lNRF9TdWZmaXgpOiBMaWtld2lzZS4KLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1vcGMuYzogRml4IHVwIHNldCwgc2V0c3csIHNldHV3IG9wZXJhbmQga2luZHMuCi0JU3VwcG9ydCBzaWdueCAlcmVnLCBjbHJ1dyAlcmVnLgotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgYWxpYXNlcyBTb2xhcmlzIGFzIHN1cHBvcnRzLgotCi1Nb24gSnVuICA3IDEyOjA0OjUyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZCBhcmMte2RpcyxvcGN9LmMgYW5kIHY4NTAte2RpcyxvcGN9LmMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDYtMDMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBNYWtlIExEUkgvTERSQiBjb25zaXN0ZW50IHdpdGggTERSCi0Jd2hlbiB0YXJnZXQgaXMgUEMtcmVsYXRpdmUuCi0KLTE5OTktMDUtMjggIExpbnVzIE5vcmRiZXJnICA8bGludXMubm9yZGJlcmdAY2FuaXQuc2U+Ci0KLQkqIG02OGstb3BjLmM6IFJlbmFtZSBNQUNML01TQUNMIHRvIE1BQy9NU0FDLiAgQWRkIE1BQ00vTVNBQ00uICBBZGQKLQlNT1ZFIE1BQ1NSLENDUi4KLQotCSogbTY4ay1kaXMuYyAoZmV0Y2hfYXJnKTogQWRkIHBsYWNlcyBgbicsIGBvJy4KLQotCSogbTY4ay1vcGMuYzogQWRkIE1TQUMsIE1BQ0wsIE1PVkUgdG8vZnJvbSBBQ0MsIE1BQ1NSLCBNQVNLLgotCUFkZCBtY2Y1MjA2ZSB0byBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMuCi0JQWRkIGFsaWFzIGZvciBNQUMsIE1TQUMuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogQWRkIGZvcm1hdHMgYEUnLCBgRycsIGBIJyBhbmQgcGxhY2UKLQlgTicuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBkaXZzdywgZGl2c2wsIGRpdnV3LCBkaXZ1bCwgbWFjbCwKLQltYWN3LCByZW1zbCwgcmVtdWwgZm9yIG1jZjUzMDcuICBDaGFuZ2UgbWNmNTIwMCAtLT4gbWNmLgotCi0JKiBtNjhrLWRpcy5jOiBBZGQgZm9ybWF0IGB1JyBhbmQgcGxhY2VzIGBoJywgYG0nLCBgTScuCi0KLTE5OTktMDUtMTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoRWQpOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBVc2UgRWQgZm9yIG1vdmQuCi0JKFJ3KTogUmVtb3ZlLgotCShPUF9ybSk6IFJlbmFtZSB0byBPUF9SZC4KLQkoT05FKTogUmVtb3ZlLgotCShPUF9PTkUpOiBSZW1vdmUuCi0JKHB1dG9wKTogQWRkIGNvbnN0IHRvIHRlbXBsYXRlIGFuZCBwLgotCShwcmludF9pbnNuX3g4Nik6IERlbGV0ZS4KLQkocHJpbnRfaW5zbl9pMzg2KTogTWVyZ2Ugb2xkIGZ1bmN0aW9uIHByaW50X2luc25feDg2LiAgQWRkIGNvbnN0Ci0JdG8gZHAuCi0JKHN0cnVjdCBkaXMzODYpOiBBZGQgY29uc3QgdG8gbmFtZS4KLQkoZGlzMzg2X2F0dCwgZGlzMzg2X2ludGVsKTogQWRkIGNvbnN0LgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogQWRkIGNvbnN0LgotCShuYW1lczMyLCBuYW1lczE2LCBuYW1lczgsIG5hbWVzX3NlZywgaW5kZXgxNik6IEFkZCBjb25zdC4KLQkoZ3JwcywgcHJlZml4X3VzZXJfdGFibGUsIGZsb2F0X3JlZyk6IEFkZCBjb25zdC4KLQkoZmxvYXRfbWVtX2F0dCwgZmxvYXRfbWVtX2ludGVsKTogQWRkIGNvbnN0LgotCShvYXBwZW5kKTogQWRkIGNvbnN0IHRvIHMuCi0JKE9QX1JFRyk6IEFkZCBjb25zdCB0byBzLgotCShwdHJfcmVnKTogQWRkIGNvbnN0IHRvIHMuCi0JKGRvZmxvYXQpOiBBZGQgY29uc3QgdG8gZHAuCi0JKE9QX0MpOiBEb24ndCBza2lwIG1vZHJtLCBpdCdzIG5vdyBkb25lIGluIE9QX1JkLgotCShPUF9EKTogRGl0dG8uCi0JKE9QX1QpOiBEaXR0by4KLQkoT1BfUmQpOiBDaGVjayBmb3IgdmFsaWQgbW9kLiAgQ2FsbCBPcF9FIHRvIHByaW50LgotCShPUF9FKTogSGFuZGxlIGRfbW9kZSBhcmcuICBDaGVjayBmb3IgYmFkIHNmZW5jZSxsZWEsbGRzIGV0Yy4KLQkoT1BfTVMpOiBDaGVjayBmb3IgdmFsaWQgbW9kLiAgQ2FsbCBPcF9FTSB0byBwcmludC4KLQkoT1BfM0ROb3dTdWZmaXgpOiBTZXQgb2J1ZnAgYW5kIHVzZSBvYXBwZW5kIHJhdGhlciB0aGFuCi0Jc3RyY2F0LiAgQ2FsbCBCYWRPcCgpIGZvciBlcnJvcnMuCi0JKE9QX1NJTURfU3VmZml4KTogTGlrZXdpc2UuCi0JKEJhZE9wKTogTmV3IGZ1bmN0aW9uLgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl9pbnRlbCk6IFJlbW92ZSBtYWNybyBjaGFycywgZXhjZXB0IGZvcgotCWpFY3h6LiAgQ2hhbmdlIGNXdFIgYW5kIGNSdGQgdG8gY1cgYW5kIGNSLgotCShkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFJlbW92ZSBtYWNybyBjaGFycyBoZXJlIHRvby4KLQkocHV0b3ApOiBIYW5kbGUgUiBhbmQgVyBtYWNyb3MgZm9yIGludGVsIG1vZGUuCi0KLQkqIGkzODYtZGlzLmMgKFNJTURfRml4dXApOiBOZXcgZnVuY3Rpb24uCi0JKGRpczM4Nl90d29ieXRlX2F0dCk6IFVzZSBpdCBvbiBtb3ZscHMgYW5kIG1vdmhwcywgYW5kIGNoYW5nZQotCUV2IHRvIEVYIG9uIHRoZXNlIGluc25zLiAgQ2hhbmdlIG1vdm1za3BzIEV2LCBYTSB0byBHdiwgRVguCi0JKGRpczM4Nl90d29ieXRlX2ludGVsKTogU2FtZSBoZXJlLgotCi0JKiBpMzg2LWRpcy5jIChBdik6IFJlbW92ZS4KLQkoQXApOiByZW1vdmUgbHB0ci4KLQkobHB0cik6IFJlbW92ZS4KLQkoT1BTSU1EKTogRGVmaW5lLgotCShPUF9TSU1EX1N1ZmZpeCk6IE5ldyBmdW5jdGlvbi4KLQkoT1BfRElSKTogUmVtb3ZlIGRlYWQgY29kZS4KLQkoZUFYX3JlZy4uZURJX3JlZyk6IFJlbnVtYmVyLgotCShvbmVieXRlX2hhc19tb2RybSk6IFRhYmxlIG51bWJlcmluZyBjb21tZW50cy4KLQkoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTogTW92ZSB0byBiZWZvcmUgcHJpbnRfaW5zbl94ODYuCi0JKHByaW50X2luc25feDg2KTogTW92ZSBhbGwgcHJlZml4IG9hcHBlbmRzIHRvIGFmdGVyIHVzZXNfZjNfcHJlZml4Ci0JY2hlY2tzLiAgUHJpbnQgZXJyb3Igb24gaW52YWxpZCBkcC0+Ynl0ZW1vZGUyLiAgUmVtb3ZlIHNpbWRfY21wLAotCWFuZCBoYW5kbGUgU0lNRCBjbXAgaW5zbnMgaW4gT1BfU0lNRF9TdWZmaXguCi0JKGluZm8tPmJ5dGVzX3Blcl9saW5lKTogQnVtcCBmcm9tIDUgdG8gNi4KLQkoT1BfTm9uZSk6IFJlbW92ZS4KLQkoT1BfRSk6IFVzZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IuICBIYW5kbGUgc2ZlbmNlLgotCShPUF8zRE5vd1N1ZmZpeCk6IEVuc3VyZSBtbmVtb25pYyBpbmRleCB1bnNpZ25lZC4KLQotCVBJSUkgU0lNRCBzdXBwb3J0IGZyb20gRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCSogaTM4Ni1kaXMuYyAoWE0sIEVYLCBOb25lKTogRGVmaW5lLgotCShPUF9YTU0sIE9QX0VYLCBPUF9Ob25lKTogTmV3IGZ1bmN0aW9ucy4KLQkoVVNFX0dST1VQUywgVVNFX1BSRUZJWF9VU0VSX1RBQkxFKTogRGVmaW5lLgotCShHUlAxNCk6IFJlbmFtZSB0byBHUlBBTUQuCi0JKEdSUCopOiBBZGQgVVNFX0dST1VQUyBmbGFnLgotCShQUkVHUlAqKTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogQWRkIFNJTUQgaW5zbnMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogQWRkIFNJTUQgZW50cmllcy4KLQkodHdvYnl0ZV91c2VzX2YzX3ByZWZpeCwgc2ltZF9jbXBfb3AsIHByZWZpeF91c2VyX3RhYmxlKTogTmV3LgotCShncnBzKTogQWRkIFNJTUQgaW5zbnMuCi0JKHByaW50X2luc25feDg2KTogTmV3IHZhcnMgdXNlc19mM19wcmVmaXggYW5kIHNpbWRfY21wLiAgRG9uJ3QKLQlvYXBwZW5kIHJlcHogaWYgdXNlc19mM19wcmVmaXguICBBZGQgY29kZSB0byBoYW5kbGUgbmV3IGdyb3VwcyBmb3IKLQlTSU1EIGluc25zLgotCi0JRnJvbSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl9hdHQsIGRpczM4Nl9pbnRlbCk6IENoYW5nZSAweEU4IGNhbGwgaW5zbgotCW9wZXJhbmQgZnJvbSBBdiB0byBKdi4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUtZGlzLmMgKHByaW50X2luc25fbWNvcmUpOiBVc2UgLnNob3J0IHRvIGRpc3BsYXkKLQl1bmlkZW50aWZpZWQgaW5zdHJ1Y3Rpb25zLCBub3QgLndvcmQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQotTW9uIEFwciAxMiAyMzo0NjoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAKLQlpbnN0cnVjdGlvbnMuCi0KLTE5OTktMDQtMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb3BpbnRsLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoaW50ZWxfc3ludGF4LCBvcGVuX2NoYXIsIGNsb3NlX2NoYXIpOiBNYWtlIHN0YXRpYy4KLQkoc2VwYXJhdG9yX2NoYXIsIHNjYWxlX2NoYXIpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl94ODYpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9pMzg2KTogTGlrZXdpc2UuICBBZGQgZGVjbGFyYXRpb24uCi0KLTE5OTktMDMtMjYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kaXMuYzogUmVidWlsZC4KLQkqIG0zMnItZGlzLmM6IFJlYnVpbGQuCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDaGFuZ2UgY29tcGFyZSBpbnN0cnVjdGlvbnMgdG8gdXNlICJAcyIgcmF0aGVyIHRoYW4KLQkiO3MiIHdoZW4gdXNlZCB3aXRoIGFuIGltbWVkaWF0ZSBvcGVyYW5kLgotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IERlbGV0ZS4KLQkoY2dlbl9sb29rdXBfaW5zbik6IG1heF9pbnNuX3NpemUgcmVuYW1lZCB0byBtYXhfaW5zbl9iaXRzaXplLgotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6Ci0JUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOgotCVJlYnVpbGQuCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsZC4KLQotMTk5OS0wMy0xNiAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKG12dHN5cyk6IFJlbW92ZSBGTEFHX0xLUi4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBOZXcgYXJnIGBpc2EnLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkoY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lLGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKTogTmV3IGZucy4KLQkoY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IFJld3JpdGUgdGVzdCBmb3IgaGFyZGNvZGVkL29wZXJhbmQgaW5kZXguCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZXdyaXRlLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBSZXdyaXRlLgotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotU2F0IEZlYiAxMyAxNDowNjoxOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYzogQWRkIHNxcnQrZmxhZ3MgcGF0dGVybnMuICBBZGQgRVY2IFBBTGNvZGUgaW5zbnMuCi0JKGluc2VydF9qaGludCk6IEZpeCBpbnNlcnRpb24gbWFzay4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogRGlzYXNzZW1ibGUgRVY2IFBBTGNvZGUgaW5zbnMuCi0KLTE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmMsaTk2MGMtb3BjLmg6IERlbGV0ZS4KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSBmcm9tIHByaW50X2luc25faTk2MF9vcmlnLgotCSogTWFrZWZpbGUuYW06IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZW0uCi0JKEhGSUxFUyk6IEFkZCBmcjMwLWRlc2MuaCxtMzJyLWRlc2MuaC4KLQkoQ0ZJTEVTKTogQWRkIGZyMzAtZGVzYy5jLGZyMzAtaWJsZC5jLG0zMnItZGVzYy5jLG0zMnItaWJsZC5jLAotCW0zMnItb3BpbnN0LmMuCi0JKEFMTF9NQUNISU5FUyk6IFVwZGF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVkbyBoYW5kbGluZyBvZiBjZ2VuX2ZpbGVzLgotCShiZmRfaTk2MF9hcmNoKTogRGVsZXRlIGk5NjBjLSoubG8gZmlsZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjZ2VuLWFzbS5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCi0JKiBjZ2VuLWRpcy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCi0JKiBjZ2VuLW9wYy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGNnZW5fbG9va3VwX2luc24sY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IERlZmluZSBoZXJlLgotCShjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERpdHRvLgotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsZC4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWxkLgotCi1GcmkgRmViICA1IDAwOjA0OjI0IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgZnIzMC1vcGMuaC4KLQkoQ0ZJTEVTKTogQWRkIGZyMzAtYXNtLmMsIGZyMzAtZGlzLmMsIGZyMzAtb3BjLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBSZW1vdmUgQU1fQ1lHV0lOMzIuCi0JQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQgYW5kIEFNX1BST0dfSU5TVEFMTCB0bwotCUFDX1BST0dfSU5TVEFMTC4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLVRodSBGZWIgIDQgMTM6NDg6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG1vdmUgKG5vdCBtb3ZldykgdG8gc3RhdHVzIHdvcmQgb24gNTIwMC4KLQotTW9uIEZlYiAgMSAyMDo1NDozNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KLSAgICAgICAgKiBpMzg2LWRpcy5jICh4X21vZGUpOiAgRGVmaW5lLgotICAgICAgICAoZGlzMzg2KTogIFJlbW92ZS4KLSAgICAgICAgKGRpczM4Nl9hdHQpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X2ludGVsKTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlKTogIFJlbW92ZS4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlX2F0dCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZV9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX3g4Nik6ICBVc2UgbmV3IGFycmF5cy4KLSAgICAgICAgKGZsb2F0X21lbSk6ICBSZW1vdmUuCi0gICAgICAgIChmbG9hdF9tZW1faW50ZWwpOiAgTmV3LgotICAgICAgICAoZmxvYXRfbWVtX2F0dCk6ICBOZXcuCi0gICAgICAgIChkb2Zsb2F0KTogIFVzZSBuZXcgZmxvYXRfbWVtIGFycmF5cy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nl9hdHQpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KLSAgICAgICAgKHB1dG9wKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9pbmRpckUpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX0UpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX0kpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX3NJKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9PRkYpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLQotCi0KLTE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCi1UdWUgSmFuIDE5IDE4OjAxOjU0IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jOiByZXZlcnQgSFAgbWVyZ2UgY2hhbmdlcyB1bnRpbCBIUCBnaXZlcyB1cwotCWFuIHVwZGF0ZWQgZmlsZS4KLQkKLTE5OTktMDEtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEaXNwbGF5IEFSTSBzeW50YXggZm9yIFBDIHJlbGF0aXZlCi0Jb2Zmc2V0cyBhcyB3ZWxsIGFzIHN5bWJsb2ljIGFkZHJlc3MuCi0KLVR1ZSBKYW4gMTkgMTA6NTE6MDEgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmM6IGZpeCBjb21tZW50cyBhbmQgc29tZSBpbmRlbnRhdGlvbi4KLQotMTk5OS0wMS0xMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGk5NjBjLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi0xOTk4LTEyLTMwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBNYXJrIGJyYW5jaCBpbnNucyB3aXRoIE1JUFMxNl9JTlNOX0JSQU5DSC4KLQotV2VkIERlYyAxNiAxNjoxNzo0OSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoc2V0X21pcHNfaXNhX3R5cGUpOiBIYW5kbGUgYmZkX21hY2hfbWlwczQxMTEuCi0KLTE5OTgtMTItMTUgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0xNCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjIDEwIDE4OjM5OjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAxMCAxMjo0OToyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgRGVjICA4IDEzOjU2OjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiByZWZvcm1hdCB0byBHTlUgY29kaW5nCi0JY29udmVudGlvbnMuICBjaGFuZ2Ugc3ByaW50ZiBjYWxsIHRvIGFuIHNwcmludGZfdm1hIGNhbGwuCi0KLVR1ZSBEZWMgIDggMTM6MTI6NDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIERlYyAgOCAxMDo1MDo0NiAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkKLQlFbGVuYSBaYW5ub25pIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4sCi0JRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4sIGFuZAotCUVkaXRoIEVwc3RlaW4gPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0bwotCW1lcmdlIGluIGNoYW5nZXMgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiBuZXcgZnVuY3Rpb24uCi0KLQkqIGhwcGEtZGlzLmM6IENoYW5nZXMgdG8gaW1wcm92ZSBocHBhIGRpc2Fzc2VtYmx5LgotCSAgQ2hhbmdlZCBmb3JtYXR0aW5nIGluIDogcmVnX25hbWVzLCBmcF9yZWdfbmFtZXMsY29udHJvbF9yZWcsIAotCSAgTmV3IHZhcmlhYmxlcyA6IHNpZ25fZXh0ZW5zaW9uX25hbWVzLCBkZXBvc2l0X25hbWVzLCBjb252ZXJzaW9uX25hbWVzCi0JICAgIGZsb2F0X3Rlc3RfbmFtZXMsIGNvbXBhcmVfY29uZF9uYW1lc19kb3VibGUsIGFkZF9jb25kX25hbWVzX2RvdWJsZSwKLQkgICAgbG9naWNhbF9jb25kX25hbWVzX2RvdWJsZSwgdW5pdF9jb25kX25hbWVzX2RvdWJsZSwgCi0JICAgIGJyYW5jaF9wdXNoX3BvcF9uYW1lcywgc2F0dXJhdGlvbl9uYW1lcywgc2hpZnRfbmFtZXMsIG1peF9uYW1lcywKLQkgIE5ldyBNYWNyb3MgOiAgIEdFVF9DT01QTF9PLCBHRVRfUFVTSF9QT1AsTUVSR0VEX1JFRyAKLQkgIE1vdmUgc29tZSBkZWZpbml0aW9ucyB0byBsaWJocHBhLmg6IEdFVF9GSUVMRCwgR0VUX0JJVAotCSAgKGZwdXRfY29uc3QpOiByZW5hbWVkIGFzIGZwdXRfaGV4X2NvbnN0Ci0JICAocHJpbnRfaW5zbl9ocHBhKToKLQkgICAtIHVzZSB0aGUgbWFjcm9zIGZwdXRzX2ZpbHRlcmVkIGFuZAotCSAgICAgZnB1dF9kZWNpbWFsX2NvbnN0IHdoZW5ldmVyIHBvc3NpYmxlOyBjYWxscyB0byBzaWduX2V4dGVuZCByZXF1aXJlCi0JICAgICAyIHBhcmFtcyAtLSBhZGQgYSBtaXNzaW5nIHNlY29uZCBwYXJhbSBvZiAwLgotCSAgIC0gU29tZSBuZXcgY29kZSBpZmRlZmVkIGZvciBMT0NBTF9PTkxZLCBhbGwgcmVsYXRlZCB0byBmaWd1cmluZyBvdXQKLQkgICAgIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIG51bWJlciBvZiBjdXJyZW50IG1hY2hpbmUuIEhQIGZvbGtzIGFyZQotCSAgICAgdHJ5aW5nIHRvIGhhbmRsZSBzaXR1YXRpb24gd2hlcmUgdGhlIHRhcmdldCBwcm9ncmFtIHdhcyBjb21waWxlZAotCSAgICAgZm9yIFBBIDEueCAoMzItYml0KSwgYnV0IGlzIHJ1bm5pbmcgb24gYSBQQSAyLjAgbWFjaGluZSBhbmQgCi0JICAgICB2aXNhIHZlcnNhLgotCSAgIC0gYWRkZWQgbmV3IGNhc2VzIDogJ2cnLCAnQicsICdtJwotCSAgIC0gYWRkZWQgY2FzZXMgc3BlY2lmaWNhbGx5IGZvciBQQSAyLjAKLQkgICAtIGNoYW5nZWQgdGhlIGZvbGxvd2luZyBjYXNlcyA6ICciJywgJ24nLCAnTicsICdwJywgJ1onLCAKLQkgICAtIGNhbGxzIHRvIGZwdXRfY29uc3QgYmVjb21lIGNhbGxzIHRvIGZwdXRfaGV4X2NvbnN0Ci0KLTE5OTgtMTItMDcgIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGk5NjBjLWFzbSwgaTk2MGMtZGlzLmMsIGk5NjBjLW9wYy5jLgotCShBTExfTUFDSElORVMpOiBBZGQgaTk2MGMtYXNtLmxvLCBpOTYwYy1kaXMubG8sIGk5NjAtb3BjLmxvLgotCShpOTYwLWFzbS5sbywgaTk2MGMtZGlzLmxvLCBpOTYwYy1vcGMubG8pOiBOZXcgTWFrZWZpbGUgcnVsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2k5NjBfYXJjaCk6IEFkZCBpOTYwYy1vcGMubG8sIGk5NjAtYXNtLm8sCi0JaTk2MC1kaXMuYyB0byB0YS4KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSB0byBwcmludF9pbnNuX2k5NjBfb3JpZy4KLQkqIGk5NjBjLWFzbS5jLCBpOTYwYy1kaXMuYywgaTk2MGMtb3BjLmMsIGk5NjBjLW9wYy5oOiBOZXcgZmlsZXMuCi0JCi1Nb24gRGVjICA3IDE0OjMzOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVN1biBEZWMgIDYgMTQ6MDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IEFkZCBkbWZjMiBhbmQgZG10YzIuCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIFBvd2VyUEM0MDMgR0NbWF0gaW5zdHJ1Y3Rpb25zLgotCUZyb20gU2FpdG9oIE1hc2Fub2J1IDxtc2FpdG9oQHNwYS5pcy51ZWMuYWMuanA+LgotCi1GcmkgRGVjICA0IDE3OjQ1OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBEZWMgIDQgMTc6MDg6MDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAgMyAxNDoyNjoyMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjICAzIDAwOjA5OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kaXMuYyAoaGFzaF9pbnNuX2FycmF5KTogQ0dFTl9JTlNOX1ZBTFVFIC0+Ci0JQ0dFTl9JTlNOX0JBU0VfVkFMVUUuCi0JKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oLGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZS4KLQotVGh1IE5vdiAyNiAxMToyNjozMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAyNCAxMToyMDo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMjMgMTg6Mjg6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMS0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxOSAxNjowMjo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDE5IDA3OjU0OjE1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChzeW5jLnAsc3luYy5sKTogU3dhcCBpbnNuIHZhbHVlcy4KLQotMTk5OC0xMS0xOSAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1XZWQgTm92IDE4IDIxOjM2OjM3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCi1XZWQgTm92IDE4IDExOjMwOjA0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMTYgMTk6MjE6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTIgMTk6MjQ6MTggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNToyNjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCB0YXJnZXQuCi0JCi1UdWUgTm92IDEwIDExOjAwOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWJ1aWxkLgotCSogZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlYnVpbGQuCi0KLU1vbiBOb3YgIDkgMTg6MjI6NTUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLUZyaSBOb3YgIDYgMTc6MjE6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgNCAxODo0Njo0NyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY2FzZSBmb3IgYmZkX2ZyMzBfYXJjaC4KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGRlZCBmcjMwLWFzbS5jLCBmcjMwLWRpcy5jLCBmcjMwLW9wYy5jLgotCShBTExfTUFDSElORVMpOiBBZGRlZCBmcjMwLWFzbS5sbywgZnIzMC1kaXMubG8sIGZyMzAtb3BjLmxvLgotCShDTEVBTkZJTEVTKTogQWRkZWQgc3RhbXAtZnIzMC4KLQkoRlIzMF9ERVBTKTogQWRkZWQuCi0JKiBmcjMwLWFzbS5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtZGlzLmM6IE5ldyBmaWxlLgotCSogZnIzMC1vcGMuYzogTmV3IGZpbGUuCi0JKiBmcjMwLW9wYy5oOiBOZXcgZmlsZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZAotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGVkCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE9jdCAyNyAwODo1ODozNyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoSVNfTSk6IEFkZGVkLgotCi1Nb24gT2N0IDE5IDEzOjAzOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgT2N0ICA5IDE0OjAxOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVN1biBPY3QgIDQgMjE6MDE6NDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChPUF8zRE5vd1N1ZmZpeCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE9QU1VGKTogRGVmaW5lLgotCShHUlAxNCk6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGUpOiBBZGQgR1JQMTQsIGZlbW1zLCBhbmQgM0ROb3cgZW50cmllcy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBTZXQgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIEdSUDE0LCAzRE5vdy4KLQkoaW5zbl9jb2RlcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByaW50X2luc25feDg2KTogSW5pdCBpbnNuX2NvZGVwIGFmdGVyIHByZWZpeGVzLgotCShncnBzKTogQWRkIEdSUDE0IGVudHJpZXMgZm9yIHByZWZldGNoLCBwcmVmZXRjaHcuCi0JKE9QX1JFRyk6IFJlZm9ybWF0LgotCi0JRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KLQkqIGkzODYtZGlzLmMgKFN1ZmZpeDNETm93KTogTmV3IHRhYmxlLgotCi1XZWQgU2VwIDMwIDEwOjE3OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IFRyZWF0IFRSQVAgYXMgaWYgaXQgd2VyZSBhIGJyYW5jaCB0eXBlIGluc3RydWN0aW9uLgotCi1Nb24gU2VwIDI4IDE0OjM1OjQzIDE5OTggIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogSWYgbnVtIGlzIG5vbnplcm8sIHRoZW4KLQlhZGQgT1BFUkFORF9BQ0MxLCBub3QgT1BFUkFORF9BQ0MwLgotCi1UaHUgU2VwIDI0IDA5OjIwOjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCBGTEFHX0pTUiBhdHRyaWJ1dGUgdG8gREJULCBSRUlULCBSVEQsIGFuZCBUUkFQCi0JaW5zbnMuIAotCi1UdWUgU2VwIDIyIDE3OjU1OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCB1c2Ugb2YgRUlUSEVSX0JVVF9QUkVGRVJfTVUgZXhlY3V0aW9uIHVuaXQKLQljbGFzcy4gCi0KLVR1ZSBTZXAgMTUgMTU6MTQ6NDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBBZGQgYmJwYyxiYnBzdyBzdXBwb3J0LgotCi0xOTk4LTA5LTA5ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyA3NTAgbW92ZQotCXRvL2Zyb20gU1BScy4KLQotRnJpIFNlcCAgNCAxOTo0Mjo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IERldGVjdCBUaHVtYiBzeW1ib2xzIGluIGVsZgotCW9iamVjdCBmaWxlcy4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogRGV0ZWN0IFRodW1iIHN5bWJvbHMgaW4gZWxmIG9iamVjdAotCWZpbGVzLiAKLQotU2F0IEF1ZyAyOSAyMjoyNDowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSB0aGUgbWFjaGluZSB0eXBlIHRvCi0JZGVjaWRlIHdoaWNoIFBBTGNvZGUgc2V0IHRvIGluY2x1ZGUuCi0KLVN1biBBdWcgMjMgMDI6MTY6MTggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKEZCUlgpOiBGaXggdHlwbyBpbiAiLGEscG4gJWZjYzMiIGNhc2UuCi0KLUZyaSBBdWcgMjEgMTY6MDc6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBBZGQgRkxBR19NVUwzMiB0byBNQUMsIE1BQ1MsCi0JTVNVQiBhbmQgTVNVQlMgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgQXVnIDEzIDE2OjIzOjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogT21pdCBwYXJlbnMgYXJvdW5kIGFkZGl0aW9ucyBpbgotCW9wZXJhbmQgbmFtZSBtYWNyb3MuCi0KLVdlZCBBdWcgMTIgMTQ6MDA6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBQZXRlciBKZXJlbXkgPHBldGVyLmplcmVteUBhdXNzMi5hbGNhdGVsLmNvbS5hdT46Ci0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG11bHNsIGFuZCBtdWx1bCB0byB1c2UgcSByYXRoZXIgdGhhbiBELCBhLAotCSssIC0sIGFuZCBkIGZvciBDb2xkRmlyZS4KLQotCUZyb20gUGV0ZXIgVGhpZW1hbm4gPHRoaWVtYW5uQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZT46Ci0JKiBwcGMtb3BjLmMgKGluc2VydF9tYmUpOiBIYW5kbGUgd3JhcHBpbmcgYml0bWFza3MuCi0JKGV4dHJhY3RfbWJlKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTIgMTE6MTE6MzQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IEZpeCB0eXBvIGluIHVkZjIwIC4uIHVkZjI1IGluc3RydWN0aW9uIG9wY29kZXMuCi0KLQkqIG0xMDMwMC1vcGMuYzogRmlyc3QgY3V0IGF0IFVERiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTQ6MDg6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZSAocmVtb3ZlIHNlbWFudGljIGRlc2NyaXB0aW9ucykuCi0KLU1vbiBBdWcgMTAgMTI6NTE6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6ICBGaXggaW5kZW50YXRpb24uCi0gICAgICAgIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAgOSAyMDoxNzoyOCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogIENoZWNrIGZvciB0aHVtYiBzeW1ib2wKLSAgICAgICAgYXR0cmlidXRlcy4KLSAgICAgICAgKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1Nb24gQXVnICAzIDEyOjQzOjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JTW92ZSBhbGwgZ2xvYmFsIHN0YXRlIGRhdGEgaW50byBvcGNvZGUgdGFibGUgc3RydWN0LCBhbmQgdHJlYXQKLQlvcGNvZGUgdGFibGUgYXMgc29tZXRoaW5nIHRoYXQgaXMgIm9wZW5lZC9jbG9zZWQiLgotCSogY2dlbi1hc20uYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fYXNtX2luaXQpOiBEZWxldGUuCi0JKGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLWRpcy5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9kaXNfaW5pdCk6IERlbGV0ZS4KLQkqIGNnZW4tb3BjLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2N1cnJlbnRfe29wY29kZV90YWJsZV9tYWNoLGVuZGlhbn0pOiBEZWxldGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1UaHUgSnVsIDMwIDIxOjQxOjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQWRkIG5ldyAiTEtSIiBmbGFnIHRvIHNvbWUKLQlpbnN0cnVjdGlvbnMuCi0KLVR1ZSBKdWwgMjggMTE6MDA6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IEFkZCBlbnRyaWVzIGZvciAibm9fbWF0Y2hfb3BlcmFuZHMiIGZpZWxkIGluCi0JdGhlIG9wY29kZSB0YWJsZS4KLQotRnJpIEp1bCAyNCAxMTo0MTozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUgKC1XYWxsIGNsZWFudXBzKS4KLQotVHVlIEp1bCAyMSAxMzo0MTowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEp1bCAxMyAxNDo1Mzo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGNrcHJlZml4KTogSGFuZGxlIGZ3YWl0IHNwZWNpYWxseSBvbmx5IHdoZW4gaXQgaXNuJ3QKLQl0aGUgZmlyc3QgcHJlZml4LgotCShkb2Zsb2F0KTogQ29ycmVjdCB0ZXN0IGZvciBmbnN0c3cuICBQcmludCBgZm5zdHN3ICVheCcgcmF0aGVyCi0JdGhhbiBgZm5zdHN3ICVlYXgnLgotCShPUF9KKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHN1YnRyYWN0aW9uIHdoZW4gMTYtYml0IGRpc3BsYWNlbWVudAotCXdpbGwgYmUgbWFza2VkIGxhdGVyLgotCi1UaHUgSnVsICAyIDE3OjExOjI3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChDR0VOX01JTl9JTlNOX1NJWkUpOiBOZXcgI2RlZmluZS4KLQotV2VkIEp1bCAgMSAxNjoxMToxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotRnJpIEp1biAyNiAxMTowODo1NSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1kaXMuYzogT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGN1cnJlbnRseQotCXNlbGVjdGVkIG1hY2hpbmUuCi0JKiBtMTAzMDAtb3BjLmM6IEFkZCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YKLQl0aGUgbW4xMDMwMCBlYWNoIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbi4KLQotRnJpIEp1biAyNiAxMjowNDoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF92YXhfYXJjaCwgYnVpbGQgdmF4LWRpcy5sby4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCB2YXgtZGlzLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB2YXgtZGlzLmxvLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjYgMTI6MDM6MjAgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIHZheC1kaXMuYzogTmV3IGZpbGUsIGZyb20gd29yayBieSBQYXVsaW5lIE1pZGRlbGluawotCTxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+LgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF92YXgpOiBEZWZpbmUgaWYgQVJDSF9hbGwuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBjYXNlIGZvciBBUkNIX3ZheC4KLQkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBjb21waWxhdGlvbiBvbiB2bXMvdmF4LgotCi1UdWUgSnVuIDIzIDE5OjQyOjE4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBGaXggdmFyaW91cyBub24tcG9ydGFiaWxpdGllcwotCXJlbGF0ZWQgdG8gc2lnbiBleHRlbnNpb24gYW5kIHRoZSBzaXplIG9mIGludHMuCi0KLVR1ZSBKdW4gMjMgMTA6NTk6MjYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IFN1cHBvcnQgb25lIG9wZXJhbmQgImFzciIsICJsc3IiIGFuZCAiYXNsIgotCWluc3RydWN0aW9ucy4gIFN1cHBvcnQgKHNwKSBhZGRyZXNzaW5nIG1vZGUgYnkgZXhwYW5kaW5nIGl0IGludG8KLQkoMCxzcCkuCi0KLVNhdCBKdW4gMjAgMTQ6NDY6MjAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IEZpeCBhcmd1bWVudCBpbnRlcmNoYW5nZSB0eXBvLgotCi1GcmkgSnVuIDE5IDA5OjE2OjQyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBSZWNvZ25pemUgJ2JyZWFrJyBwc2V1ZG8tb3AuCi0KLTE5OTgtMDYtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBBZGQgc3VwcG9ydCBmb3IgZnhzYXZlLCBmeHJzdG9yLCBzeXNlbnRlciBhbmQKLQlzeXNleGl0LgotCi1UaHUgSnVuIDE4IDEwOjIyOjI0IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBQcmV2aW91c2x5LCBpbnN0cnVjdGlvbgotIAlwcmludGluZyByZWZlcmVuY2VzIHRoZSBzeW1ib2wgdGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0gCWluc3RydWN0aW9uIHJlc2lkZXMgaW4gYSBibG9jayByZWd1bGFyIGluc3RydWN0aW9ucyBvciBtaXBzMTYKLSAJaW5zdHJ1Y3Rpb25zLiBIb3dldmVyLCB3aGVuIHRoZSBkaXNhc3NlbWJsZXIgZ2V0cyB1c2VkIGluIG90aGVyCi0gCWVudmlyb25tZW50cyB3aGVyZSB0aGUgc3ltYm9sIHRhYmxlIGlzIG5vdCBwcmVzZW50LCB3ZSBubyBsb25nZXIKLSAJcmVseSBpbiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIsIHVzZSB0aGUgbG93IGJpdCBvZiB0aGUKLSAJaW5zdHJ1Y3Rpb25zIGFkZHJlc3MgdG8gZ3Vlc3MuIFRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2UgZm9yIHVzYWdlCi0gCW9mIHRoZSBkaXNhc3NlbWJsZXIgaW4gaG9zdCBiYXNlZCBwcm9ncmFtcywgZ2RiLCBvYmpkdW1wLgotCShwcmludF9pbnNuX2JpZ19taXBzKTogZGl0dG8uCi0JKHByaW50X2luc25fbWlwcyk6IGRpdHRvCi0KLVdlZCBKdW4gMTcgMjE6MTk6MDEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IERvbid0IGJvbWIgb24gdW5rbm93biBvcGNvZGVzLgotCi1XZWQgSnVuIDE3IDE3OjQ5OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBDaGFuZ2Ugb3Bjb2RlIGZvciAic3lzY2FsbCIuCi0KLVR1ZSBKdW4gMTYgMTM6MTA6NTEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChpbmRleDE2KTogQWRkICclJyB0byByZWdpc3RlciBuYW1lcy4gIFVzZSAnLCcKLQlpbnN0ZWFkIG9mICcrJy4KLQotU2F0IEp1biAxMyAxMTozMzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6IERvbid0IHByaW50IG9wY29kZSBzdWZmaXggd2hlbiB3ZSBjYW4gZmlndXJlIG91dCB0aGUKLQlzaXplIChhbmQgZ2FzIGNhbiEpIGJ5IHJlZ2lzdGVyIG9wZXJhbmRzLCBvciBmcm9tIHRoZSBkZWZhdWx0Ci0Jc2l6ZS4KLQkocHV0b3ApOiBIYW5kbGUgJ0EnLCAnQicsICdMJywgJ1AnLCAnUScsICdSJyBtYWNyb3MuICBSZW5hbWUgJ0MnCi0JbWFjcm8gdG8gJ0UnLgotCShkaXMzODYsIGRpczM4Nl90d29ieXRlLCBncnBzKTogVXNlIG5ldyBzdWZmaXggbWFjcm9zLgotCShkaXMzODYpOiBDb3JyZWN0IGltdWwgSWIgdG8gaW11bCBzSWIuICBDaGFuZ2Ugam5sIHRvIGpnZSB0byBiZQotCWNvbnNpc3RlbnQuICBBZGQgc3VmZml4IGZvciBjYWxsLCBqbXAsIGxjYWxsLCBsam1wLCBpcmV0LiAgUmV2ZXJzZQotCW9yZGVyIG9mIGNtcHMgb3BlcmFuZHMgdG8gYWdyZWUgd2l0aCBJbnRlbCBkb2NzLiAgQ29ycmVjdCBvcGVyYW5kCi0Jb2YgYWFkIGFuZCBhYW0gKEliIC0+IHNJYikuICBDaGFuZ2UgdWQyYiBmcm9tIDBmYjggdG8gMGZiOSB0bwotCWFncmVlIHdpdGggSW50ZWwgZG9jcy4KLQkocHJpbnRfaW5zbl94ODYpOiBQcmludCBvcnBoYW4gZndhaXQgYmVmb3JlIG90aGVyIHByZWZpeGVzLgotCVJldHVybiBjb3JyZWN0IGJ5dGUgY291bnQgZm9yIG9ycGhhbiBmd2FpdCB3aXRoIHByZWZpeGVzLiAgRG9uJ3QKLQlwcmludCBgYm91bmQnIG9wZXJhbmRzIGluIHJldmVyc2Ugb3JkZXIuCi0JKGNrcHJlZml4KTogU3RvcCBhY2N1bXVsYXRpbmcgcHJlZml4ZXMgaWYgd2UgZ2V0IGZ3YWl0LgotCShPUF9ESVIpOiBQcmludCBgJCcgYmVmb3JlIEFwIG9wZXJhbmRzIG9mIGxqbXAsIGxjYWxsLgotCi1GcmkgSnVuIDEyIDEzOjQwOjM4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1GcmkgSnVuIDEyIDExOjA0OjA2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JRml4IHByb2JsZW1zIHdoZW4gYmZkX3ZtYSBpcyB3aWRlciB0aGFuIGxvbmcuCi0JKiBpMzg2LWRpcy5jOiBNYWtlIG9wX2FkZHJlc3MgYW5kIHN0YXJ0X3BjIHVuc2lnbmVkLgotCShzZXRfb3ApOiBNYWtlIHBhcmFtZXRlciB1bnNpZ25lZC4KLQkocHJpbnRfaW5zbl94ODYpOiBDYXN0IHRvIGJmZF92bWEgd2hlbiBwYXNzaW5nIGEgdmFsdWUgdG8KLQlwcmludF9hZGRyZXNzX2Z1bmMuCi0JKiBuczMyay1kaXMuYyAoQ09SRV9BRERSKTogRG9uJ3QgZGVmaW5lLgotIAkocHJpbnRfaW5zbl9uczMyayk6IENoYW5nZSB0eXBlIG9mIGFkZHIgdG8gYmZkX3ZtYS4gIFVzZQotCWJmZF9zY2FuX3ZtYSB0byByZWFkIGJhY2sgYWRkcmVzcy4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2UgdHlwZSBvZiBhZGRyIHRvIGJmZF92bWEuICBVc2Ugc3ByaW50Zl92bWEKLQl0byBmb3JtYXQgaXQuCi0JKiBtNjhrLWRpcy5jIChDT0VSQ0UzMik6IENhc3QgdG8gYmZkX3NpZ25lZF92bWEgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKE5FWFRVTE9ORyk6IE5ldyBkZWZpbml0aW9uLgotCShwcmludF9pbnNuX202OGspOiBBdm9pZCBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyB0aGlyZCBhcmd1bWVudCBvZgotCXByaW50X2luc25fYXJnLgotCShwcmludF9pbnNuX2FyZyk6IFVzZSBORVhUVUxPTkcgdG8gZmV0Y2ggMzIgYml0IGFkZHJlc3MgdmFsdWVzLgotCVVzZSBkaXNwIGluc3RlYWQgb2YgdmFsIHRvIHN0b3JlIG9mZnNldCB2YWx1ZXMuCi0JKHByaW50X2luZGV4ZWQpOiBVc2UgYmFzZV9kaXNwIGluc3RlYWQgb2Ygd29yZCB0byBzdG9yZSBiYXNlCi0JZGlzcGxhY2VtZW50LCB0byBhdm9pZCBvdmVyZmxvdy4KLQkqIG0xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBDYXN0IHZhbHVlIHRvIGxvbmcgd2hlbiBjb21wdXRpbmcKLQlwYy1yZWxhdGl2ZSBhZGRyZXNzLCB0byBnZXQgY29ycmVjdCBzaWduIGV4dGVuc2lvbi4KLQotV2VkIEp1biAxMCAxNTo1ODozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgSnVuICA5IDE0OjI3OjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IERpc3BsYXkgJ2FkZCByeCwgclksICMwJyBpbnNucyBhcwotCSdtb3YgclgsIHJZJy4gIFBhdGNoIGNvdXJ0ZXN5IG9mIFRvbnkgVGhvbXBzb24gPFRvbnkuVGhvbXBzb25AYXJtLmNvbT4KLQotTW9uIEp1biAgOCAxODoxNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBSZW1vdmUgRkFMR19NVUwzMiBhdHRyaWJ5dGUgZnJvbSBNVUxYMkggaW5zbi4KLQotRnJpIEp1biAgNSAyMzo0Nzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6ICBDb21iaW5lIGFmbGFnIGFuZCBkZmxhZyBpbnRvIHNpemVmbGFnLiAgQ2hhbmdlIE9QXyoKLQlmdW5jdGlvbnMgdG8gdm9pZC4KLQkoT1BfRFNyZWcpOiBSZW5hbWUgZnJvbSBPUF9EU1NJLgotCShPUF9FU3JlZyk6IFJlbmFtZSBmcm9tIE9QX0VTREkuCi0JKFhiLCBYdiwgWWIsIFl2KTogVXNlIGluZGV4IHJlZyBjb2RlLCBub3QgYl9tb2RlIG9yIHZfbW9kZS4KLQkoRFNCWCk6IERlZmluZS4KLQkoYXBwZW5kX3NlZyk6IFJlbmFtZSBmcm9tIGFwcGVuZF9wcmVmaXguCi0JKHB0cl9yZWcpOiBOZXcgZnVuY3Rpb24uCi0JKGRpczM4Nik6IEFkZCBTIHN1ZmZpeCB0byBwdXNoZiwgcG9wZiwgcmV0LCBscmV0LCBlbnRlciwgbGVhdmUuCi0JQWRkIERTQlggZm9yIHhsYXQuCi0JKFBSRUZJWF9BRERSKTogUmVuYW1lIGZyb20gUFJFRklYX0FEUi4KLQkoZmxvYXRfcmVnKTogQWRkIG5vbi1icm9rZW4gb3Bjb2RlcyBmb3IgcGVvcGxlIHdobyBkb24ndCB3YW50Ci0JVU5JWFdBUkVfQ09NUEFULgotCi1GcmkgSnVuICA1IDE5OjE1OjA0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jICh0c3RiLCB0c3R3LCB0c3RsKTogRG9uJ3QgYWxsb3cgcGNyZWwgb24KLQk2ODAwMC82ODAwOC82ODAxMC4KLQotV2VkIEp1biAgMyAxODo1NjoyMiAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IENoYW5nZSAweDYwIHRvICJwdXNoYVMiLCAweDYxIHRvICJwb3BhUyIuCi0KLVR1ZSBKdW4gIDIgMTU6MDY6NDYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX21hY3Jvcyk6IFN1cHBvcnQgc2hpZnRzIGFuZCByb3RhdGVzIG9mIHNpemUKLQkwOyBwcm9kdWNlIGVycm9yIG1lc3NhZ2UgZm9yIHNoaWZ0cyBvZiBzaXplIDMyIChvciA2NCBmb3IgNjQtYml0Ci0Jc2hpZnRzKSwgYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoZW0uCi0KLVdlZCBNYXkgMjcgMTU6Mjk6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIG5ldyBvcGVyYW5kOiBSYTMuICBDaGFuZ2UgU0hPUlRfQjMsIFNIT1JUX0IzYiwKLQlMT05HXzIsIExPTkdfMmIgZm9ybWF0cyB0byB1c2UgdGhpcyBuZXcgb3BlcmFuZC4KLQotVHVlIE1heSAyNiAyMDo0Nzo0OCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkZWQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCi1UdWUgTWF5IDI2IDIwOjQ1OjMzIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBiaWcgZW5kaWFuIGluc3RydWN0aW9uIC8gbGl0dGxlCi0JZW5kaWFuIGRhdGEgc3VwcG9ydC4KLQotVHVlIE1heSAyNiAxNjoxNDozOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENoYW5nZSBkZWZpbml0aW9uIG9mIFNIT1JUX0IzCi0JYW5kIFNIT1JUX0IzYiBmb3JtYXRzIHRvIHVzZSBSYiBpbnN0ZWFkIG9mIFJhLgotCi0JQWRkIEZMQUdfTVVMMTYgdG8gTVVMMlhIIG9wY29kZS4KLQotCUFkZCBGTEFHX0FERFNVQnBwcCB0byBTUkMgYW5kIFNBVEhwIG9wY29kZXMgdG8gaW1wbGVtZW50IGV4dGVuc2lvbgotCXRvIGV4aXN0aW5nIDEuMS4xIHBhcmFsbGVsaXNhdGlvbiBwcm9oaWJpdGlvbiBwcm9jZWR1cmUuCi0KLUZyaSBNYXkgMjIgMTY6MDA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgTWF5IDE5IDE3OjM2OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogSGFuZGxlIHR5cGUgJ10nIGNvcnJlY3RseQotCXdpdGggYSBzaGlmdCBjb3VudCBvZiAwLgotCi1GcmkgTWF5IDE1IDE0OjU4OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmVuYW1lZCBmcm9tIGNnZW5faHdfbG9va3VwLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBNYXkgMTMgMTc6MDM6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZSAoaGFuZGxlIHVwcGVyY2FzZSBISUdIL1NISUdIL0xPVy9TREEpLgotCi1XZWQgTWF5IDEzIDE0OjM0OjMxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBBbHdheXMgZmV0Y2ggaW5zdHJ1Y3Rpb25zCi0JYXMgYmlnLWVuZGlhbiBvbiBTUEFSQ2xpdGUuCi0KLVR1ZSBNYXkgMTIgMTE6NDY6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXIpOiBSZW1vdmUgYWxpYXMgZm9yIHIwLgotCi1TdW4gTWF5IDEwIDIyOjM3OjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVGh1IE1heSAgNyAxNzoxNTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoV0lOMzJMSUJBREQpOiBBZGQgLWxpbnRsIG9uIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWF5ICA3IDEyOjQ5OjQ2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHRlcSx0Z2UsdGdldSx0bHQsdGx0dSx0bmUpOiBBZGRlZCB0aHJlZS1vcGVyYW5kCi0gCXZhcmlldHkgb2YgSVNBMiBpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiB0cmFwIGNvZGUuCi0KLVRodSBNYXkgIDcgMTE6NTQ6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY29uZmlnLnN0YXR1cyk6IEFkZCBleHBsaWNpdCB0YXJnZXQgc28gdGhhdAotCWNvbmZpZy5zdGF0dXMgZGVwZW5kcyB1cG9uIGJmZC9jb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IE1heSAgNyAwOTozMzowMiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChicmVhaywgc2RiYnApOiBBZGRlZCB0d28tb3BlcmFuZCB2YXJpZXR5IG9mIElTQTEKLQlpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiBicmVhayBjb2RlLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBJbXBsZW1lbnQgJ3EnIG9wZXJhbmQgZm9ybWF0IHVzZWQKLQlmb3IgYWJvdmUgb3B0aW9uYWwgYXJndW1lbnQuCi0KLVdlZCBNYXkgIDYgMTU6MzA6MDYgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuCi0KLU1vbiBNYXkgIDQgMTA6MTk6NTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmFtOiBSZWdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgd2l0aCBta2RlcC4KLQotCSogb3BpbnRsLmggKF8pOiBEZWZpbmUgYXMgZGdldHRleHQuCi0KLVR1ZSBBcHIgMjggMTQ6MTI6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIE1ha2VmaWxlLmFtIChQT1RGSUxFUyk6IFJlbW92ZSBpbmNsdXNpb24gb2YgQkZEX0guCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWx0IHVzaW5nIHJ1bGUgaW4gTWFrZWZpbGUuaW4uCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsdCBhZnRlciBjaGFuZ2luZyBQT1RGSUxFUy5pbi4KLQotVHVlIEFwciAyOCAxMzoxMzoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19JU0NfUE9TSVggbmVhciBzdGFydC4gIE1vdmUgQ1lfR05VX0dFVFRFWFQKLQlhZnRlciBBQ19QUk9HX0NDLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQotTW9uIEFwciAyNyAxNDozMTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvcGludGwuaDogTmV3IGZpbGUgLSBjb250YWlucyBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdXNlZAotCWJ5IHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4KLQkqIHBvLzogTmV3IHN1YmRpcmVjdG9yeSAtIGNvbnRhaW5zIGludGVybmF0aW9uYWxpc2F0aW9uIGZpbGVzLgotCSogcG8vTWFrZS1pbjogTmV3IGZpbGUgLSBNYWtlZmlsZSBjb25zdHJ1Y3Rvci4KLQkqIHBvL1BPVEZJTEVTLmluOiBOZXcgZmlsZSAtIGxpc3Qgb2YgZmlsZXMgaW4gb3Bjb2RlcyBkaXJlY3RvcnkKLQl0aGF0IHNob3VsZCBiZSBzY2FuIGZvciBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MuCi0JKiBwby9vcGNvZGVzLnBvdDogTmV3IGZpbGUgLSBsaXN0IG9mIGludGVybmF0aW9uaXNhdGlvbiBzdHJpbmdzCi0JZm91bmQgaW4gZmlsZXMgbWVudGlvbmVkIGluIHBvL1BPVEZJTEVTLmluLgotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlIHRvIGJ1aWxkIHBvL1BPVEZJTEVTLmluLiAgQWRkIFNVQkRJUlMKLQllbnRyeS4gIEFkZCBpbnRsIGRpcmVjdG9yeSB0byBpbmNsdWRlIHBhdGhzLgotCSogYWNjb25maWcuaDogQWRkIEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRFWFQsCi0JSEFWRV9TVFJDUFksIEhBVkVfTENfTUVTU0FHRVMKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHJ1bGUgdG8gYnVpbGQgTWFrZWZpbGUgaW4gcG8gc3ViZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWx0LgotCSogY29uZmlnLmluOiBSZWJ1aWx0LgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCSogYWxwaGEtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFyYy1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcm0tZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBkMzB2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGRpcy1idWYuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBoODMwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBoODUwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBpMzg2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0xMDIwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMTAzMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTY4ay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtODhrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG1pcHMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbnMzMmstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogb3BpbnRsLmg6IEludGVybmF0aW9uYWxpc2VkLgotCSogcHBjLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHNwYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHY4NTAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogdjg1MC1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0KLU1vbiBBcHIgMjcgMTA6MzM6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGFzbV9oYXNoX3RhYmxlX2VudHJpZXMpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW5fYXNtX2luaXQpOiBGcmVlIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMuCi0JKGhhc2hfaW5zbl9hcnJheSxoYXNoX2luc25fbGlzdCk6IE5ldyBmdW5jdGlvbnMuCi0JKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVXNlIHRoZW0uICBIYXNoIG1hY3JvIGluc25zIGFzIHdlbGwuCi0JKGNnZW5fYXNtX2xvb2t1cF9pbnNuKTogVXBkYXRlLgotCSogY2dlbl9kaXMuYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoZGlzX2hhc2hfdGFibGVfZW50cmllcyk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbl9kaXNfaW5pdCk6IEZyZWUgZGlzX2hhc2hfdGFibGVfZW50cmllcy4KLQkoaGFzaF9pbnNuX2FycmF5LGhhc2hfaW5zbl9saXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBVc2UgdGhlbS4gIEhhc2ggbWFjcm8gaW5zbnMgYXMgd2VsbC4KLQkoY2dlbl9kaXNfbG9va3VwX2luc24pOiBVcGRhdGUuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShjZ2VuX3NldF9jcHUsY2dlbl9od19sb29rdXAsY2dlbl9pbnNuX2NvdW50KTogVXBkYXRlLgotCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgQXByIDI0IDE2OjA3OjU3IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfRFNTSSk6IFByaW50IHNlZ21lbnQgb3ZlcnJpZGUuCi0KLU1vbiBBcHIgMTMgMTY6NTk6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZCAiX2FsbCIgZXh0ZW5zaW9uIHRvICdDJwotCW9wZXJhdG9yLgotCi1Nb24gQXByIDEzIDE2OjUwOjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTElCQUREKTogQWRkIEBXSU4zMkxJQkFEREAuCi0JKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKLQlXSU4zMkxJQkFERC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTAgMTg6MTQ6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotU3VuIEFwciAgNSAxNjowNDozOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBDaGVjayB0aGF0IC5saWJzL2xpYm9wY29kZXMuYSBleGlzdHMKLQliZWZvcmUgdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEFwciAgMiAxNzoyNTo0OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBVc2Ugc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgZm9yIENNUFVJIGluc3RydWN0aW9uLgotCi1XZWQgQXByICAxIDE2OjIwOjI3IDE5OTggIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotICAgICAgICAqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdF9zaW1wbGUpOiBOZXcgZnVuY3Rpb24gdG8gZXh0cmFjdCBiaXRzCi0gICAgICAgIGZyb20gYW4gYXJiaXRyYXJ5IHZhbGlkIGJ1ZmZlciBpbnN0ZWFkIG9mIGZldGNoaW5nIHRoZW0gb24gZGVtYW5kCi0gICAgICAgIHVzaW5nIGZldGNoX2RhdGEoKS4KLSAgICAgICAgKGludmFsaWRfZmxvYXQpOiB1c2UgYml0X2V4dHJhY3Rfc2ltcGxlKCkgaW5zdGVhZCBvZiBiaXRfZXh0cmFjdCgpLgotCi1UdWUgTWFyIDMxIDExOjA5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogQ2hhbmdlIDB4OGMgYW5kIDB4OGUgdG8gbW92UywgYW5kIGNoYW5nZSBFdwotCXRvIEV2IGZvciBib3RoLgotCi1Nb24gTWFyIDMwIDE3OjMyOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1Nb24gTWFyIDMwIDE1OjE4OjAwIDE5OTggIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYpOiBEb24ndCB1c2UgdW5pbml0aWFsaXplZCAibnVtIiB3aGVuCi0JZGlzYXNzZW1ibGluZyBsYXN0IDQgYnl0ZXMgb2YgYSBzZWN0aW9uLgotCi1GcmkgTWFyIDI3IDE4OjA4OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSk6IExpa2V3aXNlLgotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCi0JKiBtMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBtMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgotCSogcHBjLW9wYy5jIChpbnNlcnRfcmFsLCBpbnNlcnRfcmFtKTogTGlrZXdpc2UuCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IFJlbW92ZSB1c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCk6IExpa2V3aXNlLgotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYsIGxvb2t1cF9vcGNvZGUpOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdCwgcHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgotCSogdGljODAtZGlzLmMgKHByaW50X29uZV9pbnN0cnVjdGlvbik6IExpa2V3aXNlLgotCSogdzY1LWRpcy5jIChwcmludF9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKiB6OGstZGlzLmMgKGZldGNoX2RhdGEpOiBMaWtld2lzZS4KLQkqIGEyOWstZGlzLmM6IEFkZCByZXR1cm4gdHlwZSBmb3IgZmluZF9ieXRlX2Z1bmNfdHlwZS4KLQkqIGFyYy1vcGMuYzogSW5jbHVkZSA8c3RkaW8uaD4uICBSZW1vdmUgZGVjbGFyYXRpb25zIG9mCi0JaW5zZXJ0X211bHRzaGlmdCBhbmQgZXh0cmFjdF9tdWx0c2hpZnQuCi0JKiBkMzB2LWRpcy5jIChsb29rdXBfb3Bjb2RlKTogUGFyZW50aGVzaXplIGFzc2lnbm1lbnRzIGluCi0JY29uZGl0aW9uYWxzLgotCShleHRyYWN0X3ZhbHVlKTogRnVsbHkgcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgotCSogaDg1MDAtb3BjLmggKGg4NTAwX3RhYmxlKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXplci4KLQkqIHc2NS1vcGMuaCAob3B0YWJsZSk6IExpa2V3aXNlLgotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBEZWNsYXJlIGFmbGFnIGFuZCBmbGFnIHBhcmFtZXRlcnMuCi0JKiBpMzg2LWRpcy5jIChPUF9FKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IExpa2V3aXNlLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBMaWtld2lzZS4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IExpa2V3aXNlLgotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlLgotCShnZXRfZGlzcGxhY2VtZW50LCBpbnZhbGlkX2Zsb2F0KTogRGVjbGFyZS4KLQkobGlzdF9zZWFyY2gsIHNpZ25fZXh0ZW5kLCBmbGlwX2J5dGVzKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQkoZ2V0X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2FyZyk6IExpa2V3aXNlLiAgTWFrZSBkIGludC4gIEZpeCBzcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkocHJpbnRfaW5zbl9uczMyayk6IE1ha2UgaSB1bnNpZ25lZC4KLQkoaW52YWxpZF9mbG9hdCk6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZSB0eXBlIG9mIHZhbC4KLQkqIHRpYzMwLWRpcy5jIChwcmludF9wYXJfaW5zbik6IE1ha2UgaSBzaXplX3QuICBEb24ndCBjaGVjayBzdHJsZW4KLQlvbiBlYWNoIGZvciBpdGVyYXRpb24uCi0JKiB0aWMzMC1kaXMuYyAoZ2V0X2luZGlyZWN0X29wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JKHByaW50X2luc25fejgwMDIpOiBMaWtld2lzZS4KLQkodW5wYXJzZV9pbnN0cik6IEZpeCBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzLgotCi1GcmkgTWFyIDI3IDAwOjA1OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkICJzeW5jLmwiIGFuZCAic3luYy5wIi4KLQotV2VkIE1hciAyNSAxNDozMjo0OCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogVXNlIGluZm8tPm1hY2ggdG8gc2VsZWN0IHRoZQotCWRlZmF1bHQgbTY4ayB2YXJpYW50IHRvIHJlY29nbml6ZS4KLQotCSogaTk2MC1kaXMuYyAocGluc24pOiBDaGFuZ2UgdHlwZSBvZiBmaXJzdCBhcmd1bWVudCB0byBiZmRfdm1hLgotCShjdHJsLCBjb2JyLCBtZW0sIGVhKTogTGlrZXdpc2UuCi0JKHByaW50X2FkZHIpOiBMaWtld2lzZS4gIFJlbW92ZSBjYXN0LgotCShlYSk6IENhc3QgYXJndW1lbnQgb2YgcHJpbnRfYWRkciB0byBiZmRfdm1hLgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyKTogRml4IHR5cGUgb2YgbG9jYWwKLQl2YXJpYWJsZSB2YWx1ZS4KLQkoY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyKTogTGlrZXdpc2UuCi0JKGNnZW5fcGFyc2VfYWRkcmVzcyk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDI1IDE0OjMxOjMxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoY3RybCk6IEFkZCBmdWxsIGJyYWNlcyB0byBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCi0JKGNvYnIsIG1lbSwgcmVnKTogTGlrZXdpc2UuCi0JKGVhKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIGluIGV4cHJlc3Npb24uCi0KLQkqIGNnZW4tYXNtLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShidWlsZF9hc21faGFzaF90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQkoY2dlbl9wYXJzZV9rZXl3b3JkKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IE9ubHkgY2FsbCBjb2Zmc3ltYm9sIGZvciBhIENPRkYKLQlzeW1ib2wuICBGaXggaW5kZW50YXRpb24uCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDIwIDE4OjU1OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQU1fRElTQUJMRV9TSEFSRUQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNTo0Njo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JVGhlc2UgcGF0Y2hlcyBhcmUgY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255IFRob21wc29uCi0JKGF0aG9tcHNvQGNhbWJyaWRnZS5hcm0uY29tKS4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3RodW1iKTogSWdub3JlIGJvdHRvbSB0d28gYml0cyBvZiBQQwotCXJlbGF0aXZlIGFkZHJlc3Nlcy4KLQotCSogYXJtLW9wYy5oICh0aHVtYl9vcGNvZGVzKTogQW5ub3RhdGUgUEMgcmVsYXRpdmUgYWRkcmVzc2VzIHdpdGgKLQlib3RoIHRoZSBvZmZzZXQgYW5kIHRoZSBsYWJlbCBjbG9zZXN0IHRvIHRoZSBkZXN0aW5hdGlvbi4KLQotU2F0IE1hciAxNCAyMzo0NzoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotV2VkIE1hciAgNCAxMjowODoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1TYXQgRmViIDI4IDE2OjAyOjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBEbyBub3QKLQlhc3N1bWUgdGhhdCBpbmZvLT5zeW1ib2xzIGlzIG5vbi1lbXB0eS4KLQotU2F0IEZlYiAyOCAxMjoxOTowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoY3Z0cXMpIFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcuCi0JKGN2dHRxKTogTWlzc2luZyBtb3N0IG9mIHRoZSAvKmQgdmFyaWFudHMuCi0KLVRodSBGZWIgMjYgMTU6NTM6MDkgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogSW5kaWNhdGUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQotCWRlbGF5ZWQgYnJhbmNoZXMgb3IganVtcHMuCi0KLVR1ZSBGZWIgMjQgMTA6NDY6NDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9hcm0pOiBpbmZvLT5zeW1ib2wgY2hhbmdlZAotCXRvICppbmZvLT5zeW1ib2xzLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fbWlwcyk6IExpa2V3aXNlLgotCSogdGljMzAtZGlzLmMgKHByaW50X2JyYW5jaCk6IExpa2V3aXNlLgotCi1UdWUgRmViIDI0IDExOjA2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBSZW1vdmUKLQlzYXZlZF9zeW1ib2wgY29kZSBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotCi1Nb24gRmViIDIzIDEzOjE2OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jOiBJbmNsdWRlIHN5bWNhdC5oLgotCSogY2dlbi1kaXMuYyxjZ2VuLW9wYy5jOiBEaXR0by4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgMjMgMTA6MzQ6NTggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERvIG5vdCBwcmVmaXggJ1AnIGFyZ3VtZW50cyB3aXRoICckJy4KLQotVGh1IEZlYiAxOSAxNjo1MToxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5bY2hdOiBSZWdlbmVyYXRlLgotCi1UdWUgRmViIDE3IDE3OjE0OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heAotCWFyZ3VtZW50cy4gIERvbid0IHBlcmZvcm0gdmFsaWRhdGlvbiBoZXJlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgMTMgMTQ6MjY6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAxMyAxNDo1MzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLUZyaSBGZWIgMTMgMTA6MjE6MDkgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAzMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDMwMCk6IFJlY29nbml6ZSBicmVhayBpbnN0cnVjdGlvbi4KLQotRnJpIEZlYiAxMyAxMzoxMjoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEJGRC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgRmViIDEzIDA5OjUwOjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViIDEyIDExOjAxOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiBkMTB2LW9wYy5jIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzLCBkMTB2X29wZXJhbmRzLCBkMTB2X29wY29kZXMpOgotCVNwbGl0IE9QRVJBTkRfQUNDIGludG8gT1BFUkFORF9BQ0MwIGFuZCBPUEVSQU5EX0FDQzEuCi0JSW50cm9kdWNlIE9QRVJBTkRfR1BSLgotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1XZWQgRmViIDExIDE4OjU4OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBEZWxldGUgaW5pdCBvZiBodyBsaXN0IGBuZXh0JyBjaGFpbi4KLQkoY2dlbl9od19sb29rdXApOiBNYWtlIHJlc3VsdCBjb25zdC4KLQkqIG0zMnItb3BjLmgsIG0zMnItb3BjLmMsIG0zMnItYXNtLmMsIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVNhdCBGZWIgIDcgMTU6MzA6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxNzo1NjoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocmVwZWF0eyxpfSBpbnN0cnVjdGlvbnMpOiBSZXBlYXQvcmVwZWF0aQotCWluc3RydWN0aW9ucyB1c2UgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG5vdCBhYnNvbHV0ZS4KLQotV2VkIEZlYiAgNCAxOToxNzozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYnRvb2xfZW5hYmxlX3NoYXJlZCByYXRoZXIgdGhhbgotCWxpYnRvb2xfc2hhcmVkLiAgUmVtb3ZlIGRpdmVyc2lvbiBoYWNrLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UdWUgRmViICAzIDE3OjE5OjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBJbml0aWFsaXplIGhhcmR3YXJlIHRhYmxlLgotCSogbTMyci1vcGMuaCwgbTMyci1vcGMuYywgbTMyci1hc20uYywgbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEZlYiAgMiAxOToyMjoxNSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC1kaXMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jCShkaXNhc3NlbWJsZXIpOiBBZGQgYmZkX2FyY2hfdGljMzAgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGJmZF90aWMzMF9hcmNoLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgdGljMzAtZGlzLmMKLQkoQUxMX01BQ0hJTkVTKTogQWRkIHRpYzMwLWRpcy5sby4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTM6MDI6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoSEFWRV9DUFVfTTMyUik6IERlZmluZS4KLQotV2VkIEphbiAyOCAwOTo1NTowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRpb24gcm91dGluZXMpOiBJZiBib3RoIGFsaWdubWVudCBhbmQgc2l6ZSBpcwotCXdyb25nIHRoZW4gcmVwb3J0IHRoaXMuCi0KLVR1ZSBKYW4gMjcgMjE6NTI6NTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogU2V0IHRhcmdldF9wcm9jZXNzb3IgYXMgYXBwcm9wcmlhdGUuCi0JT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXRfcHJvY2Vzc29yLgotCi1UaHUgSmFuIDIyIDE2OjIwOjE3IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChQQ19NQVNLKTogQ29ycmVjdCB2YWx1ZS4KLQkocHJpbnRfb3BlcmFuZCk6IElmIHRoZXJlJ3MgYSByZWxvYywgZG9uJ3QgY2FsY3VsYXRlIHRoZQotIAlhZGRyZXNzIGJlY2F1c2UgdGhleSBjb3VsZCBiZSBpbiBkaWZmZXJlbnQgc2VjdGlvbnMuCi0KLUZyaSBKYW4gMTYgMTU6Mjk6MTEgMTk5OCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IE1vdmUgNDAxMCdzICJhZGRjaXUiCi0gCWluc3RydWN0aW9uIGFmdGVyIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb247IG5vYm9keSdzIHVzaW5nIHRoZQotIAk0MDEwIHRoZXNlIGRheXMuICBJZiBvYmplY3QgZmlsZXMgc29tZWRheSBpbmRpY2F0ZSB3aGljaCBwcm9jZXNzb3IKLQl2YXJpYW50IHRoZXkncmUgaW50ZW5kZWQgZm9yLCB3ZSBjYW4gZG8gYSBiZXR0ZXIgam9iIGF0IHRoaXMuCi0KLU1vbiBKYW4gMTIgMTQ6NDM6NTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKLQl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NTkVNT05JQy4KLQkoY2dlbl9wYXJzZV9rZXl3b3JkKTogUmV3cml0ZS4KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKLQl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUuCi0JKiBjZ2VuLW9wYy5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlKTogSGFuZGxlICIiIGVudHJ5LgotCShjZ2VuX2tleXdvcmRfYWRkKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMjIgMTI6Mzc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgRlBfRCB0byBzLmQgaW5zdHJ1Y3Rpb24gZmxhZ3MuCi0KLVdlZCBEZWMgMTcgMTE6Mzg6MjkgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKGhhbHQsIHB1bHNlKTogRW5hYmxlIHRoZW0gb24gdGhlIDY4MDYwLgotCi1UdWUgRGVjIDE2IDE1OjIyOjUzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IFJldmVydCBjaGFuZ2UgdGhhdCBwdXQgdGhlIDMyIGJpdAotCVBDIHJlbGF0aXZlIG9mZnNldCBmb3JtcyBiZWZvcmUgdGhlIDE1IGJpdCBmb3Jtcy4gIEFuIGFzc2VtYmxlciBjb21tYW5kCi0JbGluZSBvcHRpb24gbm93IGNob29zZXMgdGhlIGRlZmF1bHQuCi0KLVR1ZSBEZWMgMTYgMTU6MjI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogU2V0IG5ldyBmbGFncyBiaXRzCi0JRkxBR197MldPUkQsTVVMezE2LDMyfSxBRERTVUJwcHB9LCBpbiBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMuCi0KLTE5OTctMTItMTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYm9wY29kZXMgc2hhcmVkIGlmIC0tZW5hYmxlLXNoYXJlZCdzIHZhbHVlCi0Jd2FzIGB5ZXMnLCBvciB3YXMgc2V0IHRvIGAqb3Bjb2RlcyonLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQotCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKLQl3b3VsZCBiZSwgdGhvdWdoLgotCi1GcmkgRGVjIDEyIDExOjU3OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoT0ZGX1NMX1BDLCBPRkZfU0xfQlIpOiBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZS4KLQkodGljODBfb3Bjb2Rlcyk6IFJlb3JkZXIgdGFibGUgZW50cmllcyB0byBwdXQgdGhlIDMyIGJpdCBQQyByZWxhdGl2ZQotIAlvZmZzZXQgZm9ybXMgYmVmb3JlIHRoZSAxNSBiaXQgZm9ybXMsIHRvIGRlZmF1bHQgdG8gdGhlIGxvbmcgZm9ybXMuCi0KLUZyaSBEZWMgMTIgMDE6MzI6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGN2dHRxLyp1Kik6IFJlbW92ZSwgYXMgdGhhdCBzdWZmaXggaXMgaW52YWxpZC4KLQotV2VkIERlYyAxMCAxNzo0MjozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fbGl0dGxlX2FybSk6IFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkCi0Jc3ltYm9sIGlmIG5vbmUgaXMgcHJlc2VudC4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogIFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkIHN5bWJvbCBpZgotCW5vbmUgaXMgcHJlc2VudC4KLQotVGh1IE9jdCAyMyAyMToxMzozNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQ29ycmVjdCBlbnRyeSBmb3IgUlRFLgotCi1Nb24gRGVjICA4IDExOjIxOjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmM6IFJlbW92ZSBkaXNhc21fc3ltYWRkcigpIGZ1bmN0aW9uLgotCi0JKiBhcm0tZGlzLmM6IFVzZSBpbmZvLT5zeW1ib2wgaW5zdGVhZCBvZiBpbmZvLT5mbGFncyB0byBkZXRlcm1pbmUKLQlpZiBkaXNhc3NtYmx5IHNob3VsZCBiZSBpbiBUaHVtYiBvciBBcm0gbW9kZS4KLQotVHVlIERlYyAgMiAwOTo1NDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmM6IEFkZCBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nIFRodW1iIG9wY29kZXMuCi0JKHByaW50X2luc25fdGh1bWIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2FzbV9zeW1hZGRyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcm0tb3BjLmg6IERpc3BsYXkgbm9wIHBzZXVkbyBvcHMgYWxvbmdzaWRlIGVxdWl2YWxlbnQgZGlzYXNzZW1ibHkuCi0JKHRodW1iX29wY29kZXMpOiBUYWJsZSBvZiBUaHVtYiBvcGNvZGVzLgotCi1Nb24gRGVjICAxIDEyOjI1OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChidHN0KTogQ2hhbmdlIERkQHMgdG8gRGQ7Yi4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZWNvZ25pemUgJ20nLCAnbicsICdvJywgJ3AnLCAncScsCi0JYW5kICd2JyBhcyBvcGVyYW5kIHR5cGVzLgotCi1Nb24gRGVjICAxIDExOjU2OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkIGFyZ3VtZW50IGZvciBscHN0b3AuICBGcm9tIE9saXZpZXIgQ2FybW9uYQotCTxvbGl2aWVyLmNhcm1vbmFAZGkuZXBmbC5jaD4uCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGxwc3RvcCwKLQl3aGljaCBoYXMgYSB0d28gd29yZCBvcGNvZGUgd2l0aCBhIG9uZSB3b3JkIGFyZ3VtZW50LgotCi1TdW4gTm92IDIzIDIyOjI1OjIxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSwgY2FzZSBjbXB1KTogSW1tZWRpYXRlIGZpZWxkIGlzCi0JdW5zaWduZWQsIG5vdCBzaWduZWQuCi0JKGQzMHZfZm9ybWF0X3RhYmxlKTogQWRkIFNIT1JUX0NNUFUgY2FzZXMgZm9yIGNtcHUuCi0KLVR1ZSBOb3YgMTggMjM6MTA6MDMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6Ci0JU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LW9wYy5jIChPUEVSQU5EX0ZMQUcpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0ZGTEFHLCBPUEVSQU5EX0NGTEFHKSAuCi0JKEZTUkMpOiBTcGxpdCBpbnRvOgotCShGRlNSQywgQ0ZTUkMpLgotCi1UaHUgTm92IDEzIDExOjA1OjMzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBNb3ZlIHRoZSBJTlNOX01BQ1JPIElTQSB2YWx1ZSB0byB0aGUgbWVtYmVyc2hpcAotCWZpZWxkIGZvciBhbGwgSU5TTl9NQUNSTydzLgotCSogbWlwczE2LW9wYy5jOiBzYW1lCi0KLVdlZCBOb3YgMTIgMTA6MTY6NTcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHN5bmMsY2FjaGUpOiBUaGVzZSBhcmUgMzkwMCBpbnNucy4KLQotVHVlIE5vdiAxMSAyMzo1Mzo0MSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQlzaC1vcGMuaCAoc2hfdGFibGUpOiBSZW1vdmUgZnRzdC9uYW4uCi0KLVR1ZSBPY3QgMjggMTc6NTk6MzIgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGZmYywgZmZzKTogRml4IG1hc2suCi0KLVR1ZSBPY3QgMjggMTY6MzQ6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBlaXRfdmIsIGludF9zLCBhbmQgaW50X20KLQljb250cm9sIHJlZ2lzdGVycy4KLQotTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0JKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KLQotTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0JKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KLQotVGh1IE9jdCAyMyAxNDo1Nzo1OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFJlcGxhY2UgLy8gd2l0aCAvKiAuLi4gKi8KLQotV2VkIE9jdCAyMiAxNzozMzoyMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIHdyICYgcmQgZm9yIHY5YSBhc3Incy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVjb2duaXplICdfJyBhbmQgJy8nIGZvciB2OWEgYXNyJ3MuCi0JKHY5YV9hc3JfcmVnX25hbWVzKTogTmV3IHZhcmlhYmxlLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotV2VkIE9jdCAyMiAxNzoxODowMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAodjlub3R2OWEpOiBOZXcgaW5zbiB0eXBlLgotCShJTVBERVApOiBNb3ZlIHRvIHRoZSBlbmQgdG8gbm90IGNvbmZsaWN0IHdpdGggZWRnZTggZXQgYWwuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1GcmkgT2N0IDE3IDEzOjE4OjUzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChibmV6bCxiZXF6bCk6IE1hcmsgdGhlc2UgYXMgYWxzbyB0eDM5LgotCi1UaHUgT2N0IDE2IDExOjU1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBOb3RlIHRoYXQgJ2phbHgnIGlzIChwcm9iYWJseSBpbmNvcnJlY3RseSkgbWFya2VkIEkxLgotCi1UdWUgT2N0IDE0IDE2OjEwOjMxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIG5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jKCkgZmllbGQKLQlvZiBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgaWYgYW4gb3ZlcmxheSBhZGRyZXNzCi0JaGFzIGEgbWF0Y2hpbmcgc3ltYm9sIGluIGxvdyBtZW1vcnkuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyAoZHVtbXkpIGZ1bmN0aW9uIGZvcgotCW5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIGluIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0dXJlLgotCi1GcmkgT2N0IDEwIDE2OjQ0OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZDIyKTogVXNlIHNpZ25lZCBhcml0aG1hdGljLgotCi1UdWUgT2N0ICA3IDIzOjQwOjQzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBUaHJlZSBvcCBtdWx0IGlzIG5vdCBhbiBJU0EgaW5zbi4KLQotVHVlIE9jdCAgNyAyMzozNzoyMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGZvcm1hdHRpbmcuCi0KLUZyaSBPY3QgIDMgMTc6MjY6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChPUF9FKTogRXhwbGljaXRseSBzaWduIGV4dGVuZCA4IGJpdCB2YWx1ZXMsIHJhdGhlcgotIAl0aGFuIGFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQuICBFeHBsaWNpdGx5IHNpZ24gZXh0ZW5kIDE2IGJpdAotCXZhbHVlcywgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCBzaG9ydCBpcyAxNiBiaXRzLgotCShPUF9zSSwgT1BfSiwgT1BfRElSKTogTGlrZXdpc2UuCi0KLVRodSBPY3QgIDIgMTM6MzY6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9zcmVnX25hbWVzKTogVXNlIHN5bWJvbGljIG5hbWVzIGZvciBoaWdoZXIKLQlzeXN0ZW0gcmVnaXN0ZXJzLgotCi1XZWQgT2N0ICAxIDE2OjU4OjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHRlc3Qgb2YgcHJvY2Vzc29yIHR5cGUgd2hlbgotCWRldGVybWluaW5nIG9wY29kZXMuCi0KLVdlZCBPY3QgIDEgMTQ6MTA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCi0JYXJndW1lbnRzIGFyZSBwYXJzZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBTZXAgMjUgMTM6MDQ6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChUQkwxKTogVXNlICEgcmF0aGVyIHRoYW4gYC4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVtb3ZlIGAgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLVdlZCBTZXAgMjQgMTE6Mjk6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IGJjaGcsIGJjbHIsIGJzZXQsIGFuZCBidHN0IG9uIENvbGRGaXJlLgotCi0JKiBtNjhrLW9wYy5jOiBBY2NlcHQgdHN0e2IsdyxsfSB3aXRoIGltbWVkaWF0ZSBvcGVyYW5kcyBvbiBjcHUzMi4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtb3ZldyBvZiBhbiBpbW1lZGlhdGUgb3BlcmFuZCB0byAlc3Igb3IgJWNjcgotCWZvciBtY2Y1MjAwLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE5IDExOjQ1OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoImNtb3YiKTogT3JkZXIgcmVnIHBhcmFtIHIxLCByMiBub3QgcjIsIHIyLgotCi1UaHUgU2VwIDE4IDExOjIxOjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY2xldF9jcHJlZ190YWJsZSk6IEFkZCAlY2NzcjIsICVjY2NyciwgJWNjcnN0ci4KLQotVHVlIFNlcCAxNiAxNToxODoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGdXJ0aGVyIHJlYXJyYW5nZW1lbnRzLgotCi1UdWUgU2VwIDE2IDE2OjEyOjExIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChyb3QyaCwgc3JhMmgsIHNybDJoIGluc25zKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCi1UdWUgU2VwIDE2IDA5OjQ4OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpZWxkcyByZW9yZGVyZWQgdG8gYWxsb3cgYXNzZW1ibGVyCi0JcGFyc2VyIHRvIHdvcmsuCi0KLVR1ZSBTZXAgMTYgMTA6MDE6MDAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHR4MzkgaW5zbnMgc2RiYnAsIHJmZSwgYW5kIGRlcmV0LgotCi1Nb24gU2VwIDE1IDE4OjMxOjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IEluaXRpYWxpc2UgcHJvY2Vzc29ycyBmaWVsZCBvZiB2ODUwX29wY29kZSBzdHJ1Y3R1cmUuCi0KLVdlZCBBdWcgMjcgMjE6NDI6MzkgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdmZhY2MgdG8gYWNjZXB0IDYtYml0IHVuc2lnbmVkIHZhbHVlcy4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGNvbnRyb2wgcmVnaXN0ZXJzIGZyb20gMC02My4KLQkoZDMwdl9vcGNvZGVfdGFiZWwpOiBBZGQgZGJ0LCBydGQsIHNyYWgsIGFuZCBzcmxoIGluc3RydWN0aW9ucy4gRml4Ci0Jcm90MmgsIHNyYTJoLCBhbmQgc3JsMmggdG8gdXNlIG5ldyBTSE9SVF9BNVMgZm9ybWF0LgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogRml4IGRpc2Fzc2VtYmx5IG9mIFNIT1JUX0QyIG9wY29kZXMuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBGaXJzdCBvcGVyYW5kIG9mIGQqaSAoZGVsYXllZAotCWJyYW5jaCkgaW5zdHJ1Y3Rpb25zIGlzIHJlbGF0aXZlLgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IENoYW5nZSBmb3JtIGZvciByZXBlYXRpLgotCShkMzB2X29wZXJhbmRfdGFibGUpOiBBZGQgSU1NNlMzIHR5cGUuCi0JKGQzMHZfZm9ybWF0X3RhYmxlKTogQ2hhbmdlIFNIT1JUX0QyLiBBZGQgTE9OR19EYi4KLQotCSogZDMwdi1kaXMuYzogRml4IGJ1ZyB3aXRoICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucwotCWFuZCBjbXAgaW5zdHJ1Y3Rpb25zLgotCi0JKiBkMzB2LW9wYy5jOiBDb3JyZWN0IGVudHJpZXMgZm9yIHJlcGVhdCosIGFuZCBzYXQqLgotCU1ha2UgSU1NNSB1bnNpZ25lZC4gQ3JlYXRlIElNTTZVIGFuZCBJTU0xMlMzVSBvcGVyYW5kCi0JdHlwZXMuIENvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzLgotCi0JKiBkMzB2LW9wYy5jOiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGRwc3cgYW5kIGRwYy4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ2hhbmdlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENvcnJlY3QgU0hPUlRfQzEgYW5kCi0JU0hPUlRfQzIuICBNYW51YWwgd2FzIGluY29ycmVjdC4KLQotCSogZDMwdi1kaXMuYyAobG9va3VwX29wY29kZSk6ICBSZXR1cm4gdmFsdWUgbm93IGluZGljYXRlcwotCWlmIGFuIG9wY29kZSBoYXMgYSBzaG9ydCBhbmQgYSBsb25nIGZvcm0uICBVc2VkIGZvciBkZWNpZGluZwotCXRvIGFwcGVuZCBhICIucyIgb3IgIi5sIi4KLQkocHJpbnRfaW5zbik6IEFwcGVuZCBhICIucyIgdG8gYW4gaW5zdHJ1Y3Rpb24gaWYgaXQgaXMKLSAJdGhlIHNob3J0IGZvcm0gYW5kICIubCIgaWYgaXQgaXMgYSBsb25nIGZvcm0uIERvIG5vdCBhcHBlbmQKLQlhbnl0aGluZyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG9ubHkgb25lIHBvc3NpYmxlIHNpemUuCi0KLQkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdWx4MmggdG8gcmVxdWlyZSBhbiBldmVuIHJlZ2lzdGVyLgotCU5ldyBmb3JtOiBTSE9SVF9BMjsgYSBTSE9SVF9BIGZvcm0gdGhhdCBuZWVkcyBhbiBldmVuCi0JcmVnaXN0ZXIgYXMgdGhlIGZpcnN0IG9wZXJhbmQuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdik6IEZpeCBwcm9ibGVtIHdoZXJlIHRoZSBsYXN0Ci0JaW5zdHJ1Y3Rpb24gd2FzIG5vdCBiZWluZyBkaXNhc3NlbWJsZWQgaWYgdGhlcmUgd2VyZSBhbiBvZGQKLQludW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgotCi0JKiBkMzB2LW9wYy5jIChTSE9SVF9NMiwgTE9OR19NMik6ICBUd28gbmV3IGZvcm1zLgotCi1GcmkgU2VwIDEyIDExOjQzOjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSW1wcm92ZWQgZGlzcGxheSBvZiByZWdpc3RlciBsaXN0cy4KLQotVGh1IFNlcCAxMSAxNzozNToxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBhc3NlbWJsZXIgYXJncyB0bwotCWZ6ZXJvcywgZm9uZXMsIGZzcmMxLCBmc3JjMXMsIGZzcmMycywgZm5vdDEsIGZub3QxcywgZm5vdDJzLAotCWZvcnMsIGZub3JzLCBmYW5kcywgZm5hbmRzLCBmeG9ycywgZnhub3JzLCBmb3Jub3QxcywgZm9ybm90MnMsCi0JZmFuZG5vdDFzLCBmYW5kbm90MnMuCi0KLVR1ZSBTZXAgIDkgMTA6MDM6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggb3AzIGZpZWxkIGZvciBmY21wcS9mY21wZXEuCi0KLU1vbiBTZXAgIDggMTQ6MDY6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9hZGRyZXNzKTogTmV3IGFyZ3VtZW50IHJlc3VsdHAuCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIG0zMnItYXNtLmMgKHBhcnNlX2hfaGkxNik6IFJpZ2h0IHNoaWZ0IG51bWJlcnMgYnkgMTYuCi0KLVR1ZSBTZXAgIDIgMTg6Mzk6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogbW4xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJlCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBTZXAgIDIgMTU6NDE6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBPbmx5IHNpZ25lZCBleHRlbmQgdmFsdWVzIHRoYXQgYXJlIG5vdAotCXJldHVybmVkIGJ5IGV4dHJhY3QgZnVuY3Rpb25zLgotCVJlbW92ZSB1c2Ugb2YgVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkgZmxhZy4KLQotVHVlIFNlcCAgMiAxNTozOTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBVcGRhdGUgY29tbWVudHMuICBSZW1vdmUgdXNlIG9mCi0JVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkuICBGaXggc2V2ZXJhbCBvcGVyYW5kIHBhdHRlcm5zLgotCi1UdWUgQXVnIDI2IDA5OjQyOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKE1PVkhJKTogSW1tZWRpYXRlIHBhcmFtZXRlciBpcyB1bnNpZ25lZC4KLQotTW9uIEF1ZyAyNSAxNTo1ODowNyAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsdCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0LgotCi1GcmkgQXVnIDIyIDEwOjM1OjE1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIGN1cmx5IGJyYWNlIHN5bnRheCBmb3IgcmVnaXN0ZXIKLQlsaXN0cy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgTk9UX1IwIGZsYWcgdG8gZGVjZWN0IGNhc2VzCi0Jd2hlcmUgcjAgaXMgYmVpbmcgdXNlZCBhcyBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgotCi1UaHUgQXVnIDIxIDExOjA5OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogTW92ZSBkaXZoIG9wY29kZXMgbmV4dCB0byBlYWNoIG90aGVyLgotCi1UdWUgQXVnIDE5IDEwOjU5OjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGNvZGVzKTogRml4IGh3X3JlaV9zdGFsbCBtdW5nYWdlLgotCi1Nb24gQXVnIDE4IDExOjEwOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogUmVtb3ZlIHVzZSBvZiBmbGFnIGZpZWxkLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgc3VwcG9ydCBmb3IgcmV2ZXJzZWQgc2hvcnQgbG9hZAotCW9wY29kZXMuLgotCi1Nb24gQXVnIDE4IDExOjA4OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoY2dlbl9maWxlcyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiAgQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTowODoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKGNnZW5fZmlsZXMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6ICBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotRnJpIEF1ZyAxNSAwNToxNzo0OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGJmZF9hcmNfYXJjaCk6IEFkZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmFtIChBTExfTUFDSElORVMpOiBBZGQgYXJjLWRpcy5sbywgYXJjLW9wYy5sby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjLWRpcy5jLCBhcmMtb3BjLmM6IE5ldyBmaWxlcy4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfYXJjLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgQVJDIHN1cHBvcnQuCi0KLVdlZCBBdWcgMTMgMTg6NTI6MTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MEVBIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2KTogTmV3IEZ1bmN0aW9ucy4KLQkodjg1MF9vcGNvZGVzKTogQWRkIHY4NTBFQSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBFIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q1XzQsIGV4dHJhY3RfZDVfNCwgaW5zZXJ0X2QxNl8xNiwKLQlleHRyYWN0X2QxNl8xNiwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBpbnNlcnRfdTksIGV4dHJhY3RfdTksCi0JaW5zZXJ0X3NwZSwgZXh0cmFjdF9zcGUpOiBOZXcgRnVuY3Rpb25zLgotCSh2ODUwX29wY29kZXMpOiBBZGQgdjg1MEUgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jOiBSZW9yZ2FuaXNlZCBhbmQgcmUtbGF5ZWQgb3V0IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLQlhbmQgcG9ydGFiaWxpdHkuCi0KLVR1ZSBBdWcgIDUgMjM6MDk6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0KLU1vbiBBdWcgIDQgMTI6MDI6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgcGF0Y2hlcy4KLQotRnJpIEF1ZyAgMSAxMzowMjowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjaW5jbHVkZS5tNDogSnVzdCBpbmNsdWRlIGFjaW5jbHVkZS5tNCBmcm9tIEJGRC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEp1bCAzMSAyMTo0NDo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLgotCVJlbW92ZWQgc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKLQlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGgKLQlBTV9QUk9HX0lOU1RBTEwuICBDaGFuZ2UgYWxsIC5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oCi0JaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEp1bCAyOCAyMTo1MjoyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZpeCB0eXBvL3RoaW5rbyBpbiAiZXJldCIgaW5zdHJ1Y3Rpb24uCi0KLVRodSBKdWwgMjQgMTM6MDM6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggc3BlbGxpbmcgb24gZnBhZGRYLCBmcHN1YlggaW5zbnMuCi0JTWFrZSBhcnJheSBjb25zdC4KLQkqIHNwYXJjLWRpcy5jIChzb3J0ZWRfb3Bjb2Rlcyk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHN0cnVjdCBvcGNvZGVfaGFzaCk6IGBvcGNvZGUnIGlzIHBvaW50ZXIgdG8gY29uc3QgZWxlbWVudC4KLQkoYnVpbGRfaGFzaCk6IEZpcnN0IGFyZyBpcyBub3cgdGFibGUgb2Ygc29ydGVkIHBvaW50ZXJzLgotCShwcmludF9pbnNuX3NwYXJjKTogU29ydCBvcGNvZGVzIGJ5IHNvcnRpbmcgdGFibGUgb2YgcG9pbnRlcnMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IFVwZGF0ZS4KLQotVHVlIEp1bCAxNSAxMjowNToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jOiAjaW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGhhc2hfa2V5d29yZF9uYW1lKTogTmV3IGFyZyBgY2FzZV9zZW5zaXRpdmVfcCcuICBDYWxsZXJzIHVwZGF0ZWQuCi0JSGFuZGxlIGNhc2UgaW5zZW5zaXRpdmUgaGFzaGluZy4KLQkoaGFzaF9rZXl3b3JkX3ZhbHVlKTogQ2hhbmdlIHR5cGUgb2YgYHZhbHVlJyB0byB1bnNpZ25lZCBpbnQuCi0KLVRodSBKdWwgMTAgMTI6NTY6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IElmIGFuIGluc24gdXNlcyBzaW5nbGUKLQlwcmVjaXNpb24gRlAsIG1hcmsgaXQgYXMgc3VjaC4gIExpa2V3aXNlIGZvciBkb3VibGUgcHJlY2lzaW9uCi0JRlAuICBNYXJrIElTQTEgaW5zbnMuICBDb25zb2xpZGF0ZSBkdXBsaWNhdGUgb3Bjb2RlcyB3aGVyZQotCXBvc3NpYmxlLgotCi1XZWQgSnVuIDI1IDE1OjI1OjU3IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY2lyZGFuLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoZXh0cmFjdF9uc2kpOiBtYWtlIHVuc2lnbmVkIGV4cHJlc3Npb24gc2lnbmVkIGJlZm9yZQotIAluZWdhdGluZyBpdC4KLQkoVU5VU0VEKTogcmVtb3ZlIG9uZSBsZXZlbCBvZiBwYXJlbnMsIHNvIE1TVkMgZG9lc24ndCBjaG9rZSBvbgotIAluZXN0aW5nIGRlcHRoIHdoZW4gYWxsIHRoZSBtYWNyb3MgYXJlIGV4cGFuZGVkLgotCi1UdWUgSnVuIDE3IDE3OjAyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IFRoZSBmY21wIHY5YSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBpbnRlZ2VyIHJlZ2lzdGVyCi0JYXMgYSBkZXN0aW5hdGlvbiwgbm90IGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBGcm9tIENocmlzdGlhbgotCUt1ZWhua2UgPENocmlzdGlhbi5LdWVobmtlQGFyYmkuSW5mb3JtYXRpay5VbmktT2xkZW5idXJnLkRFPi4KLQotTW9uIEp1biAxNiAxNDoxMzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY2FzZSA3LjIgdXNpbmcgJXBjQCgpCi0Jc3ludGF4LiAgRnJvbSBSb21hbiBIb2RlawotCTxybmhvZGVrQGZhdWkyMmMuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+LgotCi0JKiBpMzg2LWRpcy5jICh0d29ieXRlX2hhc19tb2RybSk6IEZpeCBwYW5kLgotCi1Nb24gSnVuIDE2IDE0OjA4OjM4IDE5OTcgIE1pY2hhZWwgVGF5bG9yICA8bWJ0QG1pdC5lZHU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl90d29ieXRlKTogRml4IHBhbmQgYW5kIHBhbmRuLgotCi1UdWUgSnVuIDEwIDExOjI2OjQ3IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGFybS1kaXMuYzogQWRkIHByb3RvdHlwZXMgZm9yIGFybV9kZWNvZGVfc2hpZnQgYW5kCi0JcHJpbnRfaW5zbl9hcm0uCi0KLU1vbiBKdW4gIDIgMTE6Mzk6MDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCByMzkwMCBpbnNucy4KLQotVHVlIE1heSAyNyAxNTo1NTo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IENoYW5nZSByZWxtYXNrIHRvIGJmZF92bWEuICBEb24ndAotCXByaW50IGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBzYW1lIGxpbmUuICBXaGVuIHVzaW5nIGEgUEMKLQlyZWxhdGl2ZSBsb2FkLCBhZGQgYSBjb21tZW50IHdpdGggdGhlIHZhbHVlIGJlaW5nIGxvYWRlZCBpZiBpdCBjYW4KLQliZSBvYnRhaW5lZC4KLQotVHVlIE1heSAyNyAxMTowMjowOCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4NltdLCBkaXMzODZfdHdvYnl0ZVtdKTogY2hhbmdlIHB1c2hsL3BvcGwKLQl0byBwdXNoUy9wb3BTIGZvciBzZWdtZW50IHJlZ3MgYW5kIGJ5dGUgY29uc3RhbnQgc28gdGhhdAotCXB1c2h3L3BvcHcgcHJpbnRlZCB3aGVuIGluIDE2IGJpdCBkYXRhIG1vZGUuCi0KLQkqIGkzODYtZGlzLmMgKGRpczM4NltdKTogY2hhbmdlIGN3dGwsIGNsdGQgdG8gY1d0UywgY1N0ZCB0bwotCXByaW50IGNidHcsIGN3dGQgaW4gMTYgYml0IGRhdGEgbW9kZS4KLQkqIGkzODYtZGlzLmMgKHB1dG9wKTogZXh0cmEgY2FzZSBXIHRvIHN1cHBvcnQgYWJvdmUuCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogcHJpbnQgYWRkcjMyIHByZWZpeCB3aGVuIGdpdmVuCi0JYWRkcmVzcyBzaXplIHByZWZpeCBpbiAxNiBiaXQgYWRkcmVzcyBtb2RlLgotCi1GcmkgTWF5IDIzIDE2OjQ3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmM6IFJlaW5kZW50LiAgUmVuYW1lIGxvY2FsIHZhcmlhYmxlIGZwcmludGYgdG8KLQlmcHJpbnRmX2ZuLgotCi1UaHUgTWF5IDIyIDE0OjA2OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMgKG0zMnJfY2dlbl9pbnNuX3RhYmxlLCBjbXB1aSk6IFVuZG8gcGF0Y2ggb2YgTWF5IDIuCi0KLVR1ZSBNYXkgMjAgMTE6MjY6MjcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogTW92ZWQgSU5TTl9JU0EgZmllbGQgaW50byBuZXcKLQkgIGZpZWxkIG1lbWJlcnNoaXAuCi0JKiBtaXBzMTYtb3BjLmMgKG1pcDE2X29wY29kZXMpOiBzYW1lLgotCi1Nb24gTWF5IDEyIDE1OjEwOjUzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobW92ZWIpOiBDaGFuZ2UgJGQgdG8gJWQuCi0KLU1vbiBNYXkgIDUgMTQ6Mjg6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiAoZGlzMzg2X3R3b2J5dGUpOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBMaWtld2lzZS4KLQkoZ3Jwcyk6IExpa2V3aXNlLgotCShPUF9NTVgsIE9QX0VNLCBPUF9NUyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiBpMzg2LWRpcy5jOiBSZXZlcnQgcGF0Y2ggb2YgQXByaWwgNC4gIFRoZSBvdXRwdXQgbm93IG1hdGNoZXMKLQl3aGF0IGdjYyBnZW5lcmF0ZXMuCi0KLUZyaSBNYXkgIDIgMTI6NDg6MzcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyAobTMycl9jZ2VuX2luc25fdGFibGUsIGNtcHVpKTogVXNlICR1aW1tMTYgaW5zdGVhZAotCW9mICRzaW1tMTYuCi0KLVRodSBNYXkgIDEgMTU6MzQ6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoQ0dFTl9BUkNIKTogUmVuYW1lZCBmcm9tIENHRU5fQ1BVLgotCi1UdWUgQXByIDE1IDEyOjQwOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCi1Nb24gQXByIDE0IDEyOjEzOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBBcHIgMTMgMTc6NTA6NDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi0qLmMsIG0zMnItKi5jOiAjaW5jbHVkZSBzeXNkZXAuaCBpbnN0ZWFkIG9mIGNvbmZpZy5oLgotCURlbGV0ZSBzdHJpbmd7LHN9Lmggc3VwcG9ydC4KLQotVGh1IEFwciAxMCAxNDo0NDo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZ2xvYmFsLgotCShjZ2VuX3BhcnNlX3t7LHVufXNpZ25lZF9pbnRlZ2VyLGFkZHJlc3N9KTogVXBkYXRlIGNhbGwgdG8KLQljZ2VuX3BhcnNlX29wZXJhbmRfZm4uCi0JKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgotCSogbTMyci1hc20uYyAocGFyc2VfaW5zbl9ub3JtYWwpOiBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCByZW5hbWVkCi0JZnJvbSBjZ2VuX2FzbV9pbml0X3BhcnNlLgotCShtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbik6IE5ldyBvcGVyYW5kIGBlcnJtc2cnLgotCURlbGV0ZSBjYWxsIHRvIGFzX2JhZCwgcmV0dXJuIGVycm9yIG1lc3NhZ2UgdG8gY2FsbGVyLgotCShtMzJyX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMpOiAjaWYgMCBvdXQuCi0KLVdlZCBBcHIgIDkgMTI6MDU6MjUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKSBbY2FzZSAnZCddOiBQcmludCBhcyBhZGRyZXNzIHJlZ2lzdGVyLAotCW5vdCBkYXRhIHJlZ2lzdGVyLgotCVtjYXNlICdKJ106IEZpeCB0eXBvIGluIHJlZ2lzdGVyIG5hbWUuCi0KLU1vbiBBcHIgIDcgMTY6NDg6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgotCi1Nb24gQXByICA3IDExOjQ1OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogRml4IHhtYWxsb2Mgc2l6ZSBjb21wdXRhdGlvbi4KLQotCSogY2dlbi1vcGMuYyAoaGFzaF9rZXl3b3JkX25hbWUpOiBJbXByb3ZlIGFsZ29yaXRobS4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIG0zMnIuCi0KLUZyaSBBcHIgIDQgMTI6Mjk6MzggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYywgbTMyci1kaXMuYywgbTMyci1vcGMuYywgbTMyci1vcGMuaDogTmV3IGZpbGVzLgotCSogY2dlbi1hc20uYywgY2dlbi1kaXMuYywgY2dlbi1vcGMuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCB0aGVtLgotCShBTExfTUFDSElORVMpOiBBZGQgdGhlbS4KLQkoZGVwZW5kZW5jaWVzKTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6IE5ldyB2YXJpYWJsZS4KLQkoYmZkX20zMnJfYXJjaCk6IEFkZCBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotRnJpIEFwciAgNCAxNDowNDoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBmaWxlIG5hbWVzIGZvciBiZmRfbW4xMFsyM10wMF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGQxMHYtZGlzLmM6IEluY2x1ZGUgImFuc2lkZWNsLmgiIGJlZm9yZSAib3Bjb2RlL2QxMHYuaCIuCi0KLQkqIGkzODYtZGlzLmMgKGZsb2F0X3JlZyk6IFN3YXAgZnN1YnJwIGFuZCBmc3VicC4gIFN3YXAgZmRpdnJwIGFuZAotCWZkaXZwLgotCi1UaHUgQXByICAzIDEzOjIyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDEyOjIzOjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLWRpcy5jLgotCSogbTEwMjAwLW9wYy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLW9wYy5jLgotCSogbTEwMzAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMzAwLWRpcy5jCi0JKiBtMTAzMDAtb3BjLmM6IFJlbmFtZSBmcm9tIG1uMTAzMDAtb3BjLmMuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCBtdWwgYW5kIGRtdWwgbWFjcm9zLgotCi1UdWUgQXByICAxIDE2OjI3OjQ1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBDRkxBR1MsIGFkZCBjbGVhbiB0YXJnZXQuCi0KLUZyaSBNYXIgMjggMTI6MTA6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgIndhaXQiLiAgRnJvbSBSYWxmIEJhZWNobGUKLQk8cmFsZkBnbnUuYWkubWl0LmVkdT4uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN0ZGxpYi5oIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0JKiBzcGFyYy1kaXMuYzogSW5jbHVkZSA8c3RkaW8uaD4gYW5kICJzeXNkZXAuaCIuICBEb24ndCBpbmNsdWRlCi0JPHN0cmluZy5oPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVGh1IE1hciAyNyAxNDoyNDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogQWRkIFBQQyA0MDMgaW5zdHJ1Y3Rpb25zIGFuZCBleHRlbmRlZCBvcGNvZGVzLiAgRnJvbQotCUFuZHJldyBCcmF5IDxhbmR5QG1hZGhvdXNlLmRlbW9uLmNvLnVrPi4KLQotCSogbWlwcy1vcGMuYzogQWRkIGNhc3Qgd2hlbiBzZXR0aW5nIG1pcHNfb3Bjb2Rlcy4KLQotVHVlIE1hciAyNSAyMzowNDowMCAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBGaXggc2lnbiBleHRlbnNpb24gcHJvYmxlbS4KLQkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZCopOiAgRml4IHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIHRvIG1ha2UKLQlkaXNhc3NlbWJseSBjYWxjdWxhdGUgYnJhbmNoIG9mZnNldHMgY29ycmVjdGx5LgotCi1Nb24gTWFyIDI0IDEzOjIyOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZCBiZi9zIGFuZCBidC9zIGFzIHN5bm9ueW1zIGZvciBiZi5zIGFuZCBidC5zLgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgZGN0ciBhbmQgZGN0dy4KLQotU3VuIE1hciAyMyAxODowODoxMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IENoYW5nZSB0aGUgd2F5IHNpZ25lZCBjb25zdGFudHMKLQlhcmUgZGlzcGxheWVkLgotCi1GcmkgTWFyIDIxIDE0OjM3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9IKTogTmV3IHZhcmlhYmxlLgotCShIRklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKENGSUxFUyk6IEFkZCBhbGwgQyBmaWxlcy4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCi0JRGVsZXRlIG9sZCBkZXBlbmRlbmNpZXMsIGFuZCBidWlsZCBuZXcgb25lcy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi1UaHUgTWFyIDIwIDE5OjAzOjMwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGRlZCBibG8gYW5kIGJsb3tzLGIsdyxsfS4KLQotVHVlIE1hciAxOCAxNDoxNzowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmM6IENoYW5nZSAidHJhcCIgdG8gInN5c2NhbGwiLgotCSogbW4xMDMwMC1vcGMuYzogQWRkIG5ldyAic3lzY2FsbCIgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXIgMTcgMDg6NDg6MDMgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBQcm92aWRlIGNvcnJlY3QgZW50cmllcyBmb3IgbXVsc2wgYW5kCi0gCW11bHVsIGluc25zIG9uIHRoZSBjb2xkZmlyZS4KLQotU2F0IE1hciAxNSAxNzoxMzowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEb24ndCBwcmludCBpbnN0cnVjdGlvbiBieXRlcy4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDE0IDE1OjA4OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPjoKLQkqIGkzODYtZGlzLmMgKGZldGNoX2RhdGEpOiBBZGQgcHJvdG90eXBlLgotCSogbTY4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6IEFkZCBwcm90b3R5cGUuCi0JKGR1bW15X3ByaW50X2FkZHJlc3MpOiBBZGQgcHJvdG90eXBlLiAgTWFrZSBzdGF0aWMuCi0JKiBwcGMtb3BjLmMgKHZhbGlkX2JvKTogQWRkIHByb3RvdHlwZS4KLQkqIHNwYXJjLWRpcy5jIChidWlsZF9oYXNoX3RhYmxlKTogQWRkIHByb3RvdHlwZS4KLQkoaXNfZGVsYXllZF9icmFuY2gsIGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkIHByb3RvdHlwZXMuCi0JKHByaW50X2luc25fc3BhcmMpOiBNYWtlIHNldmVyYWwgbG9jYWwgdmFyaWFibGVzIGNvbnN0LgotCShjb21wYXJlX29wY29kZXMpOiBDaGFuZ2UgYXJndW1lbnRzIHRvIGNvbnN0IFBUUi4gIEFkZCBwcm90b3R5cGUuCi0JKiBzcGFyYy1vcGMuYyAoYXJnKTogQ2hhbmdlIG5hbWUgZmllbGQgdG8gYmUgY29uc3QuCi0JKGxvb2t1cF9uYW1lLCBsb29rdXBfdmFsdWUpOiBBZGQgcHJvdG90eXBlcy4gIENoYW5nZSB0YWJsZSBhbmQKLQluYW1lIHBhcmFtZXRlcnMgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2VuY29kZV9hc2kpOiBDaGFuZ2UgbmFtZSBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2VuY29kZV9tZW1iYXIsIHNwYXJjX2VuY29kZV9wcmVmZXRjaCk6IExpa2V3aXNlLgotCShzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcpOiBMaWtld2lzZS4KLQkoc3BhcmNfZGVjb2RlX2FzaSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBiZSBjb25zdC4KLQkoc3BhcmNfZGVjb2RlX21lbWJhciwgc3BhcmNfZGVjb2RlX3ByZWZldGNoKTogTGlrZXdpc2UuCi0JKHNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyk6IExpa2V3aXNlLgotCi1GcmkgTWFyICA3IDEwOjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IEp1c3QgdXNlIGxuIC1zLCBub3QgbG4gLXNmLCBzaW5jZQotCVNvbGFyaXMgZG9lc24ndCBsaWtlIHRoZSBjb21iaW5lZCBvcHRpb25zLCBhbmQgdGhlIC1mIGlzCi0JdW5uZWNlc3NhcnkuCi0JKHN0YW1wLXRzaGxpbmssIGluc3RhbGwpOiBMaWtld2lzZS4KLQotVGh1IE1hciAgNiAxNjo1MToxMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKElNTTE2X1BDUkVMLCBTRDhOX1BDUkVMLCBEMTZfU0hJRlQpOiBNYXJrIHRoZXNlCi0JYXMgcmVsYXhhYmxlLgotCi1UdWUgTWFyICA0IDA2OjEwOjM2IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbGFzdCBjaGFuZ2UgZm9yIHRoZSBtYzY4MDEwLgotCi1Nb24gTWFyICAzIDA3OjQ1OjIwIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGRlZCBlbnRyaWVzIGZvciB0aGUgdHN0IGluc25zIG9uCi0gCXRoZSBtYzY4MDAwLgotCi1UaHUgRmViIDI3IDE0OjA0OjMyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZGVkIHN3YmVnbCBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0KLVRodSBGZWIgMjcgMTE6MzY6NDEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogU2V0IGluZm8tPmJ5dGVzX3Blcl9saW5lIHRvIDguCi0KLVdlZCBGZWIgMjYgMTU6MzQ6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWZpbmUgcjI1IHByb3Blcmx5LgotCi1XZWQgRmViIDI2IDEzOjM4OjMwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChORVhUU0lOR0xFLCBORVhURE9VQkxFLCBORVhURVhURU5EKTogVXNlCi0JZmxvYXRmb3JtYXRfdG9fZG91YmxlIHRvIG1ha2UgcG9ydGFibGUuCi0JKHByaW50X2luc25fYXJnKTogVXNlIE5FWFRFWFRFTkQgbWFjcm8gd2hlbiBleHRyYWN0aW5nIGV4dGVuZGVkCi0JcHJlY2lzaW9uIGZsb2F0LgotCi1Nb24gRmViIDI0IDE5OjI2OjEyIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogSW5pdGlhbGl6ZSBtaXBzX29wY29kZXMgdG8gbWlwc19idWlsdGluX29wY29kZXMsCi0JYW5kIGJmZF9taXBzX251bV9vcGNvZGVzIHRvIGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXMuCi0KLU1vbiBGZWIgMjQgMTU6MTk6MDEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMsIGQxMHYtb3BjLmM6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8KLQlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCi0KLU1vbiBGZWIgMjQgMTQ6MzM6MjYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChMU0lfU0NBTEVEKTogUmVuYW1lZCBmcm9tIHRoaXMgLi4uCi0JKE9GRl9TTF9CUl9TQ0FMRUQpOiAuLi4gdG8gdGhpcywgYW5kIGFkZGVkIHRoZSBmbGFnCi0JVElDODBfT1BFUkFORF9CQVNFUkVMIHRvIHRoZSBmbGFncyB3b3JkLgotCSh0aWM4MF9vcGNvZGVzKTogUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZiBMU0lfU0NBTEVEIHdpdGgKLQlPRkZfU0xfQlJfU0NBTEVELgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgotCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCi0JYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCi0Jc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQotCWR5bmFtaWNhbGx5LgotCi1TYXQgRmViIDIyIDIxOjAzOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogUmV2ZXJ0IGNoYW5nZSB0bwotCXN0b3JlIEJJVE5VTSB2YWx1ZXMgaW4gdGhlIHRhYmxlIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybQotCXRvIG1hdGNoIGJlaGF2aW9yIHdoZW4gYXNzZW1ibGVyIGlzIGdpdmVuIGEgcmF3IG51bWVyaWMKLQl2YWx1ZSBmb3IgYSBCSVROVU0gb3BlcmFuZC4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2JpdG51bSk6IERpdHRvLgotCi1GcmkgRmViIDIxIDE2OjMxOjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gRkxBR19YLgotCi1XZWQgRmViIDE5IDE0OjUxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmNpZXMgb24gLi4vYmZkL2JmZC5oIGFzIHJlcXVpcmVkLgotCi1UdWUgRmViIDE4IDE3OjQzOjQzIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgZDMwdiBvYmplY3QgZmlsZXMuCi0JKiBjb25maWd1cmU6IChiZmRfZDMwdl9hcmNoKSBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiAoYmZkX2QzMHZfYXJjaCkgQWRkZWQgbmV3IGNhc2UuCi0JKiBkMzB2LWRpcy5jOiBOZXcgZmlsZS4KLQkqIGQzMHYtb3BjLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKSBBZGQgZW50cnkgZm9yIGQzMHYuCi0KLVR1ZSBGZWIgMTggMTY6MzI6MDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBBZGQgc3ltYm9saWMKLQlyZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBCSVROVU0gdmFsdWVzLgotCi1GcmkgRmViIDE0IDEyOjE0OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogU3RvcmUgQklUTlVNIHZhbHVlcwotCWluIHRoZSB0YWJsZSBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0sIGFzIHRoZXkgYXBwZWFyIGluIHRoZQotCWFjdHVhbCBpbnN0cnVjdGlvbi4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogVXNlIG1hY3JvcyB0byBhY2Nlc3MgcHJlZGVmaW5lZAotCXN5bWJvbCBmaWVsZHMuCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IERpdHRvLgotCSh0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfYml0bnVtKTogUmVtb3ZlIGNvZGUgdGhhdCBkaWQKLQlvbmUncyBjb21wbGVtZW50IGZvciBCSVROVU0gdmFsdWVzLgotCi1UaHUgRmViIDEzIDIxOjU2OjUxIDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzLiAgVXBkYXRlIHRvIGxhdGVzdAotCWdjYyByZWxlYXNlLgotCi1UaHUgRmViIDEzIDIwOjQxOjIyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBzd2JlZyBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0KLVRodSBGZWIgMTMgMTY6MzA6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChJTU0xNl9QQ1JFTCk6IFRoaXMgaXMgYSBzaWduZWQgb3BlcmFuZC4KLQkoSU1NMjRfUENSRUwpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMyAxMzoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IFVzZSBtZW1hZGRyIC0gMiBhcyB0aGUgYmFzZQotCWFkZHJlc3MgZm9yIGFuIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIHRoYXQgaXMgbm90IGEKLQlicmFuY2guCi0KLVdlZCBGZWIgMTIgMTI6Mjc6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCi0JYnl0ZXNfcGVyX2xpbmUuCi0KLVR1ZSBGZWIgMTEgMTY6MzY6MzEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEZpeCB0eXBvICcrJyAtPiAnfCcuCi0JKHRpYzgwX29wY29kZXMpOiBTb3J0IGVudHJpZXMgc28gdGhhdCBsb25nIGltbWVkaWF0ZSBmb3JtcwotCWNvbWUgYWZ0ZXIgc2hvcnQgaW1tZWRpYXRlIGZvcm1zLCBtYWtpbmcgaXQgZWFzaWVyIGZvcgotCWFzc2VtYmxlciB0byBzZWxlY3QgdGhlIHJpZ2h0IG9uZSBmb3IgYSBnaXZlbiBvcGVyYW5kLgotCi1UdWUgRmViIDExIDE1OjI2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCi0JZGlzcGxheV9lbmRpYW4uCi0JKHByaW50X2luc25fbWlwczE2KTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTAgMTA6MTI6NDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2VkIHRvIGFjY2VwdAotCWEgc3ltYm9sIGNsYXNzIHRoYXQgcmVzdHJpY3RzIHRyYW5zbGF0aW9uIHRvIGp1c3QgdGhhdAotCWNsYXNzIChnZW5lcmFsIHJlZ2lzdGVyLCBjb25kaXRpb24gY29kZSwgZXRjKS4KLQotVGh1IEZlYiAgNiAxNzozNDowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFJFR18wX0UsIFJFR18yMl9FLAotCWFuZCBSRUdfREVTVF9FIGZvciByZWdpc3RlciBvcGVyYW5kcyB0aGF0IGhhdmUgdG8gYmUKLQlhbiBldmVuIG51bWJlcmVkIHJlZ2lzdGVyLiAgQWRkIFJFR19GUEEgZm9yIG9wZXJhbmRzIHRoYXQKLQlhcmUgb25lIG9mIHRoZSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3RlcnMuCi0JQWRkIFRJQzgwX09QRVJBTkRfTUFTSyB0byBmbGFncyBmb3IgRU5ETUFTSyBvcGVyYW5kLgotCSh0aWM4MF9vcGNvZGVzKTogQ2hhbmdlIGVudHJpZXMgdGhhdCBuZWVkIGV2ZW4gbnVtYmVyZWQKLQlyZWdpc3RlciBvcGVyYW5kcyB0byB1c2UgdGhlIG5ldyBvcGVyYW5kIHRhYmxlIGVudHJpZXMuCi0JQWRkICJvciIgZW50cmllcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gIm9yLnR0IiBlbnRyaWVzLgotCi1XZWQgRmViICA1IDExOjEyOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgbmV3IGNhc2VzIG9mIGV4aXQgaW5zdHJ1Y3Rpb24gZm9yCi0JZGlzYXNzZW1ibGVyLgotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogRGlzcGxheSBmbG9hdGluZyBwb2ludAotCXJlZ2lzdGVycyBpbiBvcGVyYW5kcyBvZiBleGl0IGluc3RydWN0aW9uLiAgUHJpbnQgYCQnIGJlZm9yZQotCXJlZ2lzdGVyIG5hbWVzIGluIG9wZXJhbmRzIG9mIGVudHJ5IGFuZCBleGl0IGluc3RydWN0aW9ucy4KLQotVGh1IEphbiAzMCAxNDowOTowMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFRhYmxlIG9mIG5hbWUvdmFsdWUKLQlwYWlycyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scyByZWNvZ25pemVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0JQWxzbyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsaW5nIHJvdXRpbmVzLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIsCi0gCXByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUsIHByaW50X29wZXJhbmRfYml0bnVtKToKLQlSZW1vdmUgcHJpdmF0ZSB0YWJsZXMgYW5kIHVzZSB0aWM4MF92YWx1ZV90b19zeW1ib2wgZnVuY3Rpb24uCi0KLVRodSBKYW4gMzAgMTE6MzA6NDUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBDaGFuZ2UgYWRkcmVzcyBwcmludGluZwotCXRvIGNvcnJlY3RseSBoYW5kbGUgUEMgd3JhcHBpbmcuICBGaXhlcyBQUjExNDkwLgotCi1XZWQgSmFuIDI5IDA5OjM5OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IE1ha2UgOCBhbmQgMTYgYml0IHBjLXJlbGF0aXZlCi0JYnJhbmNoZXMgcmVsYXhhYmxlLgotCi1UdWUgSmFuIDI4IDE1OjU3OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXQgaW5zbl9pbmZvIGluZm9ybWF0aW9uLgotCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBMaWtld2lzZS4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBCZXR0ZXIgaGFuZGxpbmcgb2YgYW4gZXh0ZW5kCi0gCW9wY29kZSBmb2xsb3dlZCBieSBhbiBpbnN0cnVjdGlvbiB3aGljaCBjYW4gbm90IGJlIGV4dGVuZGVkLgotCi1GcmkgSmFuIDI0IDEyOjA4OjIxIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDaGFuZ2VkIG9wZXJhbmQgc3BlY2lmaWVyIGZvciB0aGUKLSAJY29sZGZpcmUgbW92ZWIgaW5zdHJ1Y3Rpb24gdG8gbm90IGFsbG93IGFuIGFkZHJlc3MgcmVnaXN0ZXIgYXMKLSAJZGVzdGluYXRpb24uICBBbHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0Ci0JdGhpcyBpcyBpbnZhbGlkLCBleHBlcmltZW50cyB1bmNvdmVyZWQgdW5leHBlY3RlZCBiZWhhdmlvci4KLQlBZGRlZCBhIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uLiAgVGhhbmtzIHRvIEFuZHJlYXMKLQlTY2h3YWIgZm9yIHBvaW50aW5nIHRoaXMgb3V0IHRvIG1lLgotCi1XZWQgSmFuIDIyIDIwOjEzOjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IEV4cGFuZCBjb21tZW50IHRvIG5vdGUgdGhhdCB0aGUKLSAJZW50cmllcyBhcmUgcHJlc29ydGVkIHNvIHRoYXQgZW50cmllcyB3aXRoIHRoZSBzYW1lIG1uZW1vbmljIGFyZQotCWFkamFjZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHRhYmxlLiAgU29ydCB0aGUgZW50cmllcyBmb3IgZWFjaAotCWluc3RydWN0aW9uIHNvIHRoYXQgdGhpcyBpcyB0cnVlLgotCi1Nb24gSmFuIDIwIDEyOjQ4OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jOiBJbmNsdWRlIDxsaWJpYmVydHkuaD4uCi0JKHByaW50X2luc25fbTY4ayk6IFNvcnQgdGhlIG9wY29kZSB0YWJsZSBvbiB0aGUgbW9zdCBzaWduaWZpY2FudAotCW5pYmJsZSBvZiB0aGUgb3Bjb2RlLgotCi1TYXQgSmFuIDE4IDE1OjE1OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAodGljODBfb3Bjb2Rlcyk6IEFkZCAid3JjciIsICJ2bXB5IiwgInZybmQiLAotCSJ2c3ViIiwgInZzdCIsICJ4bm9yIiwgYW5kICJ4b3IiIGluc3RydWN0aW9ucy4KLQkoVl9hMSk6IFJlbmFtZWQgZnJvbSBWX2EsIG1zYiBvZiBhY2N1bXVsYXRvciByZWcgbnVtYmVyLgotCShWX2EwKTogQWRkIG1hY3JvLCBsc2Igb2YgYWNjdW11bGF0b3IgcmVnIG51bWJlci4KLQotRnJpIEphbiAxNyAxODoyNDozMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBCcm9rZSBleGNlc3NpdmVseSBsb25nCi0JZnVuY3Rpb24gdXAgaW50byBzZXZlcmFsIHNtYWxsZXIgb25lcyBhbmQgYXJyYW5nZWQgZm9yCi0JdGhlIGluc3RydWN0aW9uIHByaW50aW5nIGZ1bmN0aW9uIHRvIGJlIGNhbGxhYmxlIHJlY3Vyc2l2ZWx5Ci0JdG8gcHJpbnQgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYm90aCBhIGxvYWQgYW5kIGEKLQltYXRoIGluc3RydWN0aW9uIHBhY2tlZCBpbnRvIGEgc2luZ2xlIG9wY29kZS4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogRXhwYW5kIGNvbW1lbnQgZm9yIHZsZCBvcGNvZGUKLQl0byBleHBsYWluIHdoeSBpdCBjb21lcyBhZnRlciB0aGUgb3RoZXIgdmVjdG9yIG9wY29kZXMuCi0KLUZyaSBKYW4gMTcgMTY6MTk6MTUgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBhZGQgYiwgdywgb3IgbCBzcGVjaWZpZXIgdG8gY29sZGZpcmUKLQltb3ZlIGluc25zIHRvIGhhbmRsZSBpbW1lZGlhdGUgb3BlcmFuZHMuCi0KLVRodSBKYW4gMTcgMTY6MTk6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgZW50cnkgZm9yICJjbXBpbCIuCi0JZml4IG9wZXJhbmQgbWFzayBpbiB0aGUgIm1vdmVtbCIgZW50cmllcyBmb3IgdGhlIGNvbGRmaXJlLgotCi1UaHUgSmFuIDE2IDIwOjU0OjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoVl9hLCBWX20sIFZfUywgVl9aLCBWX3AsIE9QX1YsIE1BU0tfVik6Ci0JTmV3IG1hY3JvcyBmb3IgYnVpbGRpbmcgdmVjdG9yIGluc3RydWN0aW9uIG9wY29kZXMuCi0JKHRpYzgwX29wY29kZXMpOiBSZW1vdmUgYWxsIHVzZXMgb2YgRk1UX1NJLCBGTVRfUkVHLCBhbmQKLQlGTVRfTEksIHdoaWNoIHdlcmUgdW51c2VkLiAgVGhlIGZpZWxkIGlzIG5vdyBhIGZsYWdzIGZpZWxkLgotCVJlbW92ZSBzb21lIG9wY29kZXMgdGhhdCBhcmUgcG9zc2libGUsIGJ1dCBpbGxlZ2FsLCBzdWNoCi0JYXMgbG9uZyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIHdpdGggZG91YmxlcyBmb3IgaW1tZWRpYXRlCi0JdmFsdWVzLiAgQWRkICJ2YWRkIiBhbmQgInZsZCIgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgSmFuIDE1IDE4OjU5OjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBSZW9yZGVyIHNvbWUgdGFibGUgZW50cmllcyB0byBtYWtlCi0JdGhlIG9yZGVyIG1vcmUgbG9naWNhbC4gIE1vdmUgdGhlIHNoaWZ0IGFsaWFzIGluc3RydWN0aW9ucyAoInJvdGwiLAotCSJzaGwiLCAiaW5zIiwgInJvdHIiLCAiZXh0dSIsICJleHRzIiwgInNybCIsIGFuZCAic3JhIiB0byBiZQotIAlpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcmVndWxhciBzci54IGFuZCBzbC54IGluc3RydWN0aW9ucy4gIEFkZAotCWFuZCB0ZXN0IG5ldyBpbnN0cnVjdGlvbiBvcGNvZGVzIGZvciAic2wiLCAic2xpIiwgInNyIiwgInNyaSIsICJzdCIsCi0gCSJzdWIiLCAic3VidSIsICJzd2NyIiwgYW5kICJ0cmFwIi4KLQotVHVlIEphbiAxNCAxOTo0Mjo1MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKE9GRl9TU19QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU1MuCi0JKE9GRl9TTF9QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU0wuCi0JKE9GRl9TU19CUik6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVsYXRpdmUgb3BlcmFuZC4KLQkoT0ZGX1NMX0JSKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWxhdGl2ZSBvcGVyYW5kLgotCShSRUdfQkFTRSk6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVnaXN0ZXIgb3BlcmFuZC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAiZm1weSIsICJmcm5kbSIsICJmcm5kbiIsICJmcm5kcCIsCi0JImZybmR6IiwgImZzcXJ0IiwgImZzdWIiLCAiaWxsb3AwIiwgImlsbG9wRiIsICJpbnMiLCAianNyIiwKLQkibGQiLCAibGQudSIsICJsbW8iLCAib3IiLCAicmRjciIsICJybW8iLCAicm90bCIsIGFuZCAicm90ciIKLQlpbnN0cnVjdGlvbnMuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IG9wY29kZSBuYW1lIHdpdGggZml4ZWQgd2lkdGgKLSAJMTAgY2hhciBmaWVsZCwgcGFkZGVkIHdpdGggc3BhY2VzIG9uIHJocywgcmF0aGVyIHRoYW4gYSBzdHJpbmcKLSAJZm9sbG93ZWQgYnkgYSB0YWIuICBVc2UgcmVuYW1lZCBUSUM4MF9PUEVSQU5EX1BDUkVMIGZsYWcgYml0IHJhdGhlcgotIAl0aGFuIG9sZCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFLiAgQWRkIHN1cHBvcnQgZm9yIG5ldwotCVRJQzgwX09QRVJBTkRfQkFTRVJFTCBmbGFnIGJpdC4KLQotTW9uIEphbiAxMyAxNTo1ODo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBmbG9hdGluZyBwb2ludCBvcGVyYW5kcwotCWFzIGZsb2F0cy4KLQkqIHRpYzgwLW9wYy5jIChTUEZJKTogQWRkIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQKLQlpbW1lZGlhdGUgb3BlcmFuZCB0eXBlLgotCShST1RBVEUpOiBBZGQgcm90YXRlIG9wZXJhbmQgdHlwZSBmb3Igc2hpZnRzLgotCShFTkRNQVNLKTogQWRkIGZvciBzaGlmdHMuCi0JKG4pOiBNYWNybyBmb3IgdGhlICduJyBiaXQuCi0JKGkpOiBNYWNybyBmb3IgdGhlICdpJyBiaXQuCi0JKFBEKTogTWFjcm8gZm9yIHRoZSAnUEQnIGZpZWxkLgotCShQMik6IE1hY3JvIGZvciB0aGUgJ1AyJyBmaWVsZC4KLQkoUDEpOiBNYWNybyBmb3IgdGhlICdQMScgZmllbGQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgZW50cmllcyBmb3IgImV4dHMiLCAiZXh0dSIsICJmYWRkIiwKLQkiZmNtcCIsIGFuZCAiZmRpdiIuCi0KLU1vbiBKYW4gIDYgMTU6MDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1hc2sgb2ZmIHVud2FudGVkIGJpdHMgYWZ0ZXIKLQlhZGRpbmcgaW4gY3VycmVudCBhZGRyZXNzIGZvciBwYy1yZWxhdGl2ZSBvcGVyYW5kcy4KLQotTW9uIEphbiAgNiAxMDo1NjoyNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKFJfU0NBTEVEKTogQWRkIG1hY3JvIHRvIHRlc3QgZm9yICI6cyIgbW9kaWZpZXIgYml0LgotCShwcmludF9pbnNuX3RpYzgwKTogSWYgUl9TQ0FMRUQgdGhlbiBwcmludCAiOnMiIG1vZGlmaWVyIGZvciBvcGVyYW5kLgotCSogdGljODAtb3BjLmMgKFJFRzAsIFJFRzIyLCBSRUcyNywgU1NPRkYsIExTT0ZGKTogTmFtZXMKLQljaGFuZ2VkIHRvIFJFR18wLCBSRUdfMjIsIFJFR19ERVNULCBPRkZfU1MsIE9GRl9TTCByZXNwZWN0aXZlbHkuCi0JKFNJQ1IsIExJQ1IsIFJFR01fU0ksIFJFR01fTEkpOiBOYW1lcyBjaGFuZ2VkIHRvIENSX1NJLCBDUl9MSSwKLQlSRUdfQkFTRV9NX1NJLCBSRUdfQkFTRV9NX0xJIHJlc3BlY3RpdmVseS4KLQkoUkVHX1NDQUxFRCwgTFNJX1NDQUxFRCk6IE5ldyBvcGVyYW5kIHR5cGVzLgotCShFKTogTmV3IG1hY3JvIGZvciAnRScgYml0IGF0IGJpdCAyNy4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCBkbGQsIGRsZC51LCBkc3QsIGVzdG9wLCBhbmQgZXRyYXAKLQlvcGNvZGVzLCBpbmNsdWRpbmcgdGhlIHZhcmlvdXMgc2l6ZSBmbGF2b3JzIChiLGgsdyxkKSBmb3IKLQl0aGUgZGlyZWN0IGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KLQotU3VuIEphbiAgNSAxMjoxODoxNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKE1fU0ksIE1fTEkpOiBBZGQgbWFjcm9zIHRvIHRlc3QgZm9yICI6bSIgbW9kaWZpZXIgYml0Ci0gCWluIGFuIGluc3RydWN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBDaGFuZ2UgY29tbWEgYW5kIHBhcmVuIGhhbmRsaW5nLgotICAJVXNlIE1fU0kgYW5kIE1fTEkgbWFjcm9zIHRvIGNoZWNrIGZvciAiOm0iIG1vZGlmaWVyIGZvciBHUFIgb3BlcmFuZHMuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgUkVHTV9TSSBhbmQgUkVHTV9MSSBvcGVyYW5kcy4KLQkoRiwgTV9SRUcsIE1fTEksIE1fU0ksIFNaX1JFRywgU1pfTEksIFNaX1NJLCBELCBTKTogTmV3CWJpdC10d2lkZGxlcnMuCi0JKE1BU0tfTElfTSwgTUFTS19TSV9NLCBNQVNLX1JFR19NKTogUmVtb3ZlIGFuZCByZXBsYWNlIGluIG9wY29kZQotCW1hc2tzIHdpdGggIk1BU0tfKiAmIH5NXyoiIHRvIGdldCB0aGUgTSBiaXQgcmVzZXQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYnNyLCBic3IuYSwgY21uZCwgY21wLCBkY2FjaGVjLCBhbmQgZGNhY2hlZi4KLQotU2F0IEphbiAgNCAxOTowNTowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFCi0JY29ycmVjdGx5LiAgQWRkIHN1cHBvcnQgZm9yIHByaW50aW5nIFRJQzgwX09QRVJBTkRfQklUTlVNIGFuZAotCVRJQzgwX09QRVJBTkRfQ0MsIGFuZCBUSUM4MF9PUEVSQU5EX0NSIG9wZXJhbmRzIGluIHN5bWJvbGljCi0JZm9ybS4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBTU09GRiwgTFNPRkYsIEJJVE5VTSwKLQlDQywgU0lDUiwgYW5kIExJQ1IgdGFibGUgZW50cmllcy4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAibm9wIiwgImJyIiwgImJibyIsICJiYnoiLAotCSJiY25kIiwgYW5kICJicmNyIiBvcGNvZGVzLgotCi1GcmkgSmFuICAzIDE4OjMyOjExIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBNYWtlIGNvbW1lbnQgbWF0Y2ggdGhlCi0JYWN0dWFsIGZpZWxkcyAobm8gc2hpZnQgZmllbGQpLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBEb2N1bWVudCB3aHkgdGhpcyBjYW5ub3QgYmUgImNvbnN0Ii4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUmVwbGFjZSBhYm9ydCBzdHViIHdpdGggYQotCXBhcnRpYWwgaW1wbGVtZW50YXRpb24sIHdvcmsgaW4gcHJvZ3Jlc3MuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBCZWdpbiBjb25zdHJ1Y3Rpb24gb3BlcmFuZHMgdGFibGUuCi0JKHRpYzgwX29wY29kZXMpOiBDb250aW51ZSBwb3B1bGF0aW5nIG9wY29kZXMgdGFibGUgYW5kIHN0YXJ0Ci0JZmlsbGluZyBpbiB0aGUgb3BlcmFuZCBpbmRpY2VzLgotCSh0aWM4MF9udW1fb3Bjb2Rlcyk6IEFkZCB0aGlzLgotCi1GcmkgSmFuICAzIDEyOjEzOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkICNCIGNhc2UgZm9yIG1vdmVxLgotCi1UaHUgSmFuICAyIDEyOjE0OjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN1cmUgYWxsIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQKLQliZWZvcmUgdGhleSBhcmUgdXNlZC4KLQotVHVlIERlYyAzMSAxMjoyMDozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IFB1dCBjdXJseS1icmFjZXMgYXJvdW5kIG9wZXJhbmRzCi0JZm9yICJicmVha3BvaW50IiBpbnN0cnVjdGlvbi4KLQotVHVlIERlYyAzMSAxNTozODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0JKGRlcCk6IFVzZSBBTExfQ0ZMQUdTIHJhdGhlciB0aGFuIENGTEFHUy4KLQotVHVlIERlYyAzMSAxNTowOToxNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKEQ4X3s2LDd9KTogU2V0IFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZCi0JZmxhZy4KLQotTW9uIERlYyAzMCAxNzowMjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG02OGstb3BjLm8sIGFscGhhLW9wYy5vKTogUmVtb3ZlIGRpcy1hc20uaCBkZXBlbmRlbmN5LgotCSh0aWM4MC1kaXMubywgdGljODAtb3BjLm8pOiBBZGQgcnVsZXMgcGVyIGNvbW1lbnQgaW4gTWFrZWZpbGUuaW4uCi0KLU1vbiBEZWMgMzAgMTE6Mzg6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCAiYWJzIi4KLQotU3VuIERlYyAyOSAxMDo1ODoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0aWM4MC1kaXMubyBhbmQgdGljODAtb3BjLm8uCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX3RpYzgwKTogRGVmaW5lIGlmIEFSQ0hfYWxsIGlzIGRlZmluZWQuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBiZmRfYXJjaF90aWM4MCBzdXBwb3J0IHRvIHNldCBkaXNhc3NlbWJsZQotIAl0byBwcmludF9pbnNuX3RpYzgwLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBBZGQgc3R1Yi4KLQotRnJpIERlYyAyNyAyMjozMDo1NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcmNoIGluICRzZWxhcmNocyk6IEFkZCBiZmRfdGljODBfYXJjaCBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCSogdGljODAtZGlzLmM6IEFkZCBmaWxlLgotCSogdGljODAtb3BjLmM6IEFkZCBmaWxlLgotCi1GcmkgRGVjIDIwIDE0OjMwOjE5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgQWRkIGNyWzAtMTVdLCBkcGMsIGRwc3csIGxpbmsuCi0KLU1vbiBEZWMgMTYgMTM6MDA6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogQWRkIFNJTU0xNk4uCi0JKG1uMTAyMDBfb3Bjb2Rlcyk6IFVzZSBpdCBmb3Igc29tZSBsb2dpY2FscyBhbmQgYnRzdCBpbnNucy4KLQlBZGQgImJyZWFrIiBhbmQgInRyYXAiIGluc3RydWN0aW9ucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJicmVhayIgaW5zdHJ1Y3Rpb24uCi0KLQkqIG1uMTAyMDAtb3BjLmM6IEFkZCBwc2V1ZG8tb3BzIGZvciAibW92IChhbiksYW0iIGFuZCAibW92IGFuLChhbSkiLgotCi1TYXQgRGVjIDE0IDIyOjM2OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogVGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDCi0JcmVsYXRpdmUgbG9hZCBvciBhZGQgbm93IGRlcGVuZHMgdXBvbiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcwotCWluIGEgZGVsYXkgc2xvdC4KLQotV2VkIERlYyAxMSAwOToyMzo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtZGlzLmM6IEZpbmlzaCB3cml0aW5nIGRpc2Fzc2VtYmxlci4KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciAibW92IGltbTgsZG4iLgotCUZpeCBtYXNrIGZvciAiam1wIChhbikiLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSwgcHJpbnRfaW5zbl9tbjEwMzAwKTogQ29ycmVudGx5Ci0JaGFuZGxlIGVuZGlhbm5lc3MgaXNzdWVzIGZvciBtbjEwMzAwLgotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiBGaXggb3BlcmFuZHMgZm9yICJtb3ZiIGRtLChhbikiLgotCi1UdWUgRGVjIDEwIDEyOjA4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogIm1vdiBpbW04LGQwIiBpcyBhIGZvcm1hdCAyCi0JaW5zdHJ1Y3Rpb24uICBGaXggb3Bjb2RlIGZpZWxkIGZvciAibW92YiAoaW1tMjQpLGRuIi4KLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IEZpeCBpbnNlcnRpb24gcG9zaXRpb24KLQlmb3IgREkgb3BlcmFuZC4KLQotTW9uIERlYyAgOSAxNjo0Mjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmM6IENyZWF0ZSBtbjEwMjAwIG9wY29kZSB0YWJsZS4KLQkqIG1uMTAyMDAtZGlzLmM6IEZsZXNoIG91dCBtbjEwMjAwIGRpc2Fzc2VtYmxlci4gIE5vdCByZWFkeSwKLQlidXQgbW92aW5nIGFsb25nIG5pY2VseS4KLQotU3VuIERlYyAgOCAwNDoyODozMSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIG1pcHMxNi1vcGMuby4KLQotRnJpIERlYyAgNiAxNjo0Nzo0MCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcmhpbm8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogUmV2ZXJ0IGNoYW5nZSB0byB1c2UgPCBhbmQgPgotCXNwZWNpZmllcnMgZm9yIGZtb3ZlbSogaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRGVjICA2IDE0OjQ4OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KLQotRnJpIERlYyAgNiAxNzozNDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQ2hhbmdlIG9wY29kZSBmb3IgZW50cnkvZXhpdCB0byBhdm9pZCBjb25mbGljdGluZwotCXdpdGggZHNybC4KLQotRnJpIERlYyAgNiAxNDo0ODowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmM6IEFkZCBzb21lIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIHZhcmlvdXMKLSAJb3BlcmFuZHMgYW5kIHN1Y2guCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogRml4IG1pbm9yIGdjYyAtV2FsbCB3YXJuaW5ncy4KLQotVGh1IERlYyAgNSAxMjowOTo0OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyA8IGFuZCA+IG9wZXJhbmQKLQlzcGVjaWZpZXJzLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBTaW1wbGlmeSB0YWJsZSBieSB1c2luZyA8IGFuZCA+Ci0Jb3BlcmFuZCBzcGVjaWZpZXJzIGluIGZtb3ZtKiBpbnN0cnVjdGlvbnMuCi0KLVdlZCBEZWMgIDQgMTQ6NTI6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGluc2VydF9saSk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlIG9mZnNldCBoYXMgdGhlIHR3bwotCWxlYXN0IHNpZ25pZmljYW50IGJpdHMgc2V0LgotCi1XZWQgTm92IDI3IDEzOjA5OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXBhcmF0ZSB0aGUgaW5zdHJ1Y3Rpb24gZnJvbQotCXRoZSBhcmd1bWVudHMgd2l0aCBhIHRhYiwgbm90IGEgc3BhY2UuCi0KLVR1ZSBOb3YgMjYgMTM6MjQ6MTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc2VtYmxlKTogRmluaXNoIGNvbnZlcnNpb24gdG8gJyQnIGFzCi0JcmVnaXN0ZXIgcHJlZml4LgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFzayBmaWVsZCBmb3IKLQltb3YgYW0sKGltbTMyLHNwKS4KLQotVHVlIE5vdiAyNiAxMDo1MzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6Ci0JKiBtaXBzMTYtb3BjLmM6IE5ldyBmaWxlLgotCSogbWlwcy1kaXMuYzogSW5jbHVkZSAiZWxmLWJmZC5oIiBhbmQgImVsZi9taXBzLmgiLgotCShtaXBzMTZfcmVnX25hbWVzKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IFVzZSBwcmludF9pbnNuX21pcHMxNiBpbiAxNiBiaXQgbW9kZSBvcgotCWFmdGVyIHNlZWluZyBhIDE2IGJpdCBzeW1ib2wuCi0JKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9taXBzMTYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogbWlwcy1vcGMuYzogQWRkIGphbHggaW5zdHJ1Y3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAobWlwczE2LW9wYy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1pcHMxNi1vcGMubyBmb3IgYmZkX21pcHNfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE5vdiAyNSAxNjoxNToxNyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogU2ltcGxpZnkgdGFibGUgYnkgdXNpbmcgPCBhbmQgPgotIAlvcGVyYW5kIHNwZWNpZmllcnMgaW4gKnNhdmUsICpyZXN0b3JlIGFuZCBtb3ZlbSogaW5zdHJ1Y3Rpb25zLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbW92ZSBhbmQgbW92ZW0gaW5zdHJ1Y3Rpb25zIGZvcgotIAl0aGUgY29sZGZpcmUuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFRoZSBjb2xkZmlyZSAobWNmNTIwMCkgY2FuIG9ubHkgdXNlCi0gCXJlZ2lzdGVyIG9wZXJhbmRzIGZvciBpbW1lZGlhdGUgYXJpdGhtZXRpYywgbm90LCBuZWcsIG5lZ3gsIGFuZAotCXNldCBhY2NvcmRpbmcgdG8gY29uZGl0aW9uIGluc3RydWN0aW9ucy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29uc2lzdGFudGx5IFVzZSAicyIgYXMgdGhlIHN0b3JhZ2UKLSAJc3BlY2lmaWVyIG9mIHRoZSBlZmZlY3RpdmUtYWRkcmVzcyBvcGVyYW5kIGluIGltbWVkaWF0ZSBmb3JtcyBvZgotIAlhcml0aG1ldGljIGluc3RydWN0aW9ucy4gIFRoZSBzcGVjaWZpZXIgZm9yIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAotIAlub3RlcyBob3cgYW5kIHdoZXJlIHRoZSBjb25zdGFudCB3aWxsIGJlIHN0b3JlZC4KLQotTW9uIE5vdiAyNSAxMToxNzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFJlbW92ZSByZWR1bmRhbnQgImxjYyIKLQlvcGNvZGUuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlICckJyBpbnN0ZWFkIG9mICclJyBmb3IKLQlyZWdpc3RlciBwcmVmaXguCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUHJlZml4IHJlZ2lzdGVycyB3aXRoICclJy4KLQotV2VkIE5vdiAyMCAxMDozNzoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzLgotCi0JKiBtbjEwMzAwLW9wYy5jOiBGaXggaGFuZGxpbmcgb2YgcmVnaXN0ZXIgbGlzdCBvcGVyYW5kIGZvcgotCSJjYWxsIiwgInJldCIsIGFuZCAicmV0cyIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFByaW50IFBDLXJlbGF0aXZlIGFuZCBtZW1vcnkKLQlhZGRyZXNzZXMgc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLgotCSogbW4xMDMwMC1vcGMuYzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBhYnNvbHV0ZSBtZW1vcnkgYWRkcmVzc2VzLAotCXBjLXJlbGF0aXZlIG9mZnNldHMgJiByYW5kb20gaW1tZWRpYXRlcy4KLQotCSogbW4xMDMwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMzAwKTogRml4IGZldGNoIG9mIGxhc3QgYnl0ZQotCWluIDcgYnl0ZSBpbnNucy4KLQkoZGlzYXNzZW1ibGUpOiBIYW5kbGUgU1BMSVQgYW5kIEVYVEVOREVEIG9wZXJhbmRzLgotCi1UdWUgTm92IDE5IDEzOjMzOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYzogUm91Z2ggY3V0IGF0IHByaW50aW5nIHNvbWUgb3BlcmFuZHMuCi0KLQkqIG1uMTAzMDAtZGlzLmM6IFN0YXJ0IHdvcmtpbmcgb24gZGlzYXNzZW1ibGVyIHN1cHBvcnQuCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFza3Mgb24gc2V2ZXJhbCBpbnNucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCAiUkVHUyIgZm9yIGEgcmVnaXN0ZXIKLQlsaXN0LgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgUkVHUyBmb3IgcmVnaXN0ZXIgbGlzdCBpbiAibW92bSIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTm92IDE4IDE1OjIwOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQWRkMyBzZXRzIHRoZSBjYXJyeS4KLQotRnJpIE5vdiAxNSAxMzo0MzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IERlbWFuZCBwYXJlbnMgYXJvdW5kCi0JcmVnaXN0ZXIgYXJndW1lbnQgaXMgY2FsbHMgYW5kIGptcCBpbnN0cnVjdGlvbnMuCi0KLVRodSBOb3YgIDcgMDA6MjY6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBVc2UgRE4wMSBmb3IgcHV0eCBhbmQKLQlnZXR4IG9wZXJhbmQuICBGaXggb3Bjb2RlIGZvciBtdWxxdSBpbW0sZG4uCi0KLVdlZCBOb3YgIDYgMTM6NDI6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogSGlqYWNrICJiaXRzIiBmaWVsZAotCWluIE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBmb3IgaG93IG1hbnkgYml0cwotCWFwcGVhciBpbiB0aGUgYmFzaWMgaW5zbiB3b3JkLiAgQWRkIElNTTMyX0hJR0gyNCwKLQlJTU0zMl9ISUdIMjRfTE9XU0hJRlQ4LCBJTU04RV9TSElGVDguCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBuZXcgb3BlcmFuZHMgYXMgbmVlZGVkLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIElNTTMyX0xPV1NISUZUOAotCWZvciBic2V0LCBiY2xyLCBidHN0IGluc3RydWN0aW9ucy4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIG5ldyBJTU0zMl9MT1dTSElGVDggYXMgbmVlZGVkLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogUmVtb3ZlIG1hbnkgcmVkdW5kYW50Ci0Jb3BlcmFuZHMuICBVcGRhdGUgb3Bjb2RlIHRhYmxlIGFzIGFwcHJvcHJpYXRlLgotCShJTU0zMik6IEFkZCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgZmxhZy4KLQkobW4xMDMwMF9vcGNvZGVzKTogRml4IHNpbmdsZSBiaXQgZXJyb3IgaW4gbW92IGltbTMyLGRuIGluc24uCi0KLVR1ZSBOb3YgIDUgMTM6MjY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMiwgRE0yLCBBTjIsIEFNMgotCW9wZXJhbmRzIChmb3IgaW5kZXhlZCBsb2FkL3N0b3JlcykuICBGaXggYml0cG9zIGZvciBESQotCW9wZXJhbmQuICBBZGQgU044Tl9TSElGVDgsIElNTThfU0hJRlQ4LCBhbmQgRDE2X1NISUZUIGZvciB0aGUKLQlmZXcgaW5zdHJ1Y3Rpb25zIHRoYXQgaW5zZXJ0IGltbWVkaWF0ZXMvZGlzcGxhY2VtZW50cyBpbiB0aGUKLQltaWRkbGUgb2YgdGhlIGluc3RydWN0aW9uLiAgQWRkIElNTThFIGZvciA4IGJpdCBpbW1lZGlhdGUgaW4KLQl0aGUgZXh0ZW5kZWQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KLQkobW4xMDMwMF9vcGVyYW5kcyk6IFVzZSBuZXcgb3Bjb2RlcyBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIE5vdiAgNSAxMDozMDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogRGVjbGFyZSB0aGUgdHJhcCBpbnN0cnVjdGlvbgotIAlzZXF1ZW50aWFsIHNvIHRoZSBhc3NlbWJsZXIgbmV2ZXIgcGFyYWxsZWxpemVzIGl0IHdpdGgKLQlvdGhlciBpbnN0cnVjdGlvbnMuCi0KLU1vbiBOb3YgIDQgMTI6NTA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMDEgYW5kIEFOMDEgZm9yCi0JYSBkYXRhL2FkZHJlc3MgcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHJlZ2lzdGVyIGZpZWxkIDAKLQlhbmQgcmVnaXN0ZXIgZmllbGQgMS4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIEROMDEgYW5kIEFOMDEgZm9yIG1vdi9jbXAgaW1tOCxETi9BTgotCi1GcmkgTm92ICAxIDEwOjI5OjExIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSBuZXcgTk9QQUwgbWFzayBmb3IKLQlzdGFuZGFyZCBkaXNhc3NlbWJseS4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wZXJhbmRzKTogUmVhcnJhbmdlIGZsYWdzIHNsb3QuCi0JKGFscGhhX29wY29kZXMpOiBBZGQgbmV3IEJXWCwgQ0lYLCBhbmQgTUFYIGluc3RydWN0aW9ucy4KLQlSZWNhdGVnb3JpemUgUEFMY29kZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBPY3QgMzAgMTY6NDY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgcmVsYXhpbmcgImpiciIuCi0KLVR1ZSBPY3QgMjkgMTY6MzA6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogRG9uJ3QgcHJpbnQgYSB0cmFpbGluZyB0YWIgaWYKLQl0aGVyZSBhcmUgbm8gb3BlcmFuZCB0eXBlcy4KLQotVHVlIE9jdCAyOSAxMjoyMjoyMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKEQ5X1JFTEFYKTogUmVuYW1lZCBmcm9tIEQ5LCBhbGwgcmVmZXJlbmNlcwotCWNoYW5nZWQuCi0JKHY4NTBfb3BlcmFuZHMpOiBNYWtlIHN1cmUgRDIyIGltbWVkaWF0ZWx5IGZvbGxvd3MgRDlfUkVMQVguCi0KLUZyaSBPY3QgMjUgMTI6MTI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IFNldCBpbmZvLT5ieXRlc19wZXJfbGluZSB0byA1LgotCi1UaHUgT2N0IDI0IDE3OjUzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzYpOiBGaXggb3BlcmFuZCBpbnNlcnRpb24gZm9yIHNsZC53Ci0JYW5kIHNzdC53IGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkICJqQ0MiIGluc3RydWN0aW9ucyAoYWxpYXNlcyBmb3IKLQkiYkNDImluc3RydWN0aW9ucykuCi0KLVRodSBPY3QgMjQgMTc6MjE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogVXNlIGEgdGFiIGJldHdlZW4gdGhlIGluc3RydWN0aW9uCi0JYW5kIHRoZSBhcmd1bWVudHMuCi0KLVR1ZSBPY3QgMjIgMjM6MzI6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQ1BXUjIpOiBEZWZpbmUuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IFVzZSBQUENQV1IyIGZvciBmc3FydCwgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcKLQlpdC4KLQotRnJpIE9jdCAxMSAxNjowMzo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvIGluIG9wY29kZQotCWZpZWxkIGZvciBtb3ZodSBpbnN0cnVjdGlvbi4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBGb3IgVjg1MF9PUEVSQU5EX1NJR05FRCBvcGVyYW5kcywKLQljYXN0IHZhbHVlIHRvICJsb25nIiBub3QgInNpZ25lZCBsb25nIiB0byBrZWVwIGhwdXgxMAotCWNvbXBpbGVyIHF1aWV0LgotCi1UaHUgT2N0IDEwIDEwOjI1OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG8gaW4gb3Bjb2RlIGZpZWxkCi0JZm9yIG1vdiAoYWJzMTYpLEROLgotCi0JKiBtbjEwMzAwLW9wYy5jIChGTVQqKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggZGVzdGluYXRpb24gcmVnaXN0ZXIKLQlmb3Igc2hpZnQtYnktcmVnaXN0ZXIgb3Bjb2Rlcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEJyZWFrIEROLCBETSwgQU4sIEFNCi0JaW50byBbQURdW01OXVswMV0gZm9yIGVuY29kaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVnaXN0ZXIKLQlpbiB0aGUgb3Bjb2RlLgotCi1XZWQgT2N0ICA5IDExOjE5OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJleHRlbmRlZCIgaW5zdHJ1Y3Rpb25zLAotCSJwdXR4IiwgImdldHgiLCAibXVscSIsICJtdWxxdSIsICJzYXQxNiIsICJzYXQyNCIsICJic2NoIi4KLQotVHVlIE9jdCAgOCAxMTo1NTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBSZW1vdmUgIlJFR1MiIG9wZXJhbmQuCi0JRml4IHZhcmlvdXMgdHlwb3MuICBBZGQgIlBBUkVOIiBvcGVyYW5kLgotCShNRU0sIE1FTTIpOiBEZWZpbmUuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFN1cnJvdW5kIGFsbCBtZW1vcnkgYWRkcmVzc2VzIHdpdGggIlBBUkVOIgotCW9wZXJhbmRzLiAgRml4IHNldmVyYWwgdHlwb3MuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvcyBpbiB5ZXN0ZXJkYXkncwotCWNoYW5nZXMuCi0KLU1vbiBPY3QgIDcgMTY6NDg6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChGTVRfWFgpOiBSZW51bWJlciBzdGFydGluZyBhdCBvbmUuCi0JKG1uMTAzMDBfb3BlcmFuZHMpOiBSb3VnaCBjdXQuICBFbm91Z2ggdG8gcGFyc2UgIm1vdiIgaW5zdHJ1Y3Rpb25zCi0JYXQgdGhpcyB0aW1lLgotCShtbjEwMzAwX29wY29kZXMpOiBCcmVhayBvcGNvZGUgZm9ybWF0IG91dCBpbnRvIGl0cyBvd24gZmllbGQuCi0JVXBkYXRlIG1hbnkgb3BlcmFuZCBmaWVsZHMgdG8gZGVhbCB3aXRoIHNpZ25lZCB2cyB1bnNpZ25lZAotCWlzc3Vlcy4gIEZpeCBvbmUgb3IgdHdvIHR5cG9zIGluIHRoZSAibW92IiBpbnN0cnVjdGlvbgotCW9wY29kZSwgbWFzayBhbmQvb3Igb3BlcmFuZCBmaWVsZHMuCi0KLU1vbiBPY3QgIDcgMTE6Mzk6NDkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKHBsdXNoYSk6IFByZWZlciBlbmNvZGluZyBmb3IgbTY4MDQwdXAsIGluIGNhc2UKLQltNjg4NTEgd2Fzbid0IHJlc2V0LgotCi1UaHUgT2N0ICAzIDE3OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkIG9wY29kZSAmIG1hc2tzIGZvcgotCWFsbCBvcGNvZGVzLiAgVmVyeSByb3VnaCBjdXQgYXQgb3BlcmFuZHMgZm9yIGFsbCBvcGNvZGVzLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBTdGFydCBmbGVzaGluZyBvdXQgdGhlCi0Jb3Bjb2RlIHRhYmxlLgotCi1UaHUgT2N0ICAzIDEwOjA2OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYywgbW4xMDMwMC1vcGMuYzogTmV3IGZpbGVzLgotCSogbW4xMDIwMC1kaXMuYywgbW4xMDMwMC1kaXMuYzogTmV3IGZpbGVzLgotCSogbW4xMHgwMC1vcGMuYywgbW4xMHgwMC1kaXMuYzogRGVsZXRlZC4KLQkqIGRpc2Fzc2VtYmxlLmM6IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIDEwMjAwIGFuZCAxMDMwMAotCXN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE1OjU5OjEyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChNT1NUTFlDTEVBTik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjM6Mjg6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLW9wYy5jLCBtbjEweDAwLWRpcy5jOiBOZXcgZmlsZXMgZm9yIE1hdHN1c2hpdGEKLQlNTjEweDAwIHByb2Nlc3NvcnMuCi0JKiBkaXNhc3NlbWJsZSAoQVJDSF9tbjEweDAwKTogRGVmaW5lLgotCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX2FyY2hfbW4xMHgwMC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGJmZF9tbjEweDAwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVR1ZSBPY3QgIDEgMTA6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChvcF9ydG4pOiBDaGFuZ2UgdG8gYmUgYSBwb2ludGVyLiAgQWRqdXN0IHVzZXMKLQlhY2NvcmRpbmdseS4gIERvbid0IGRlY2xhcmUgZnVuY3Rpb25zIHVzaW5nIG9wX3J0bi4KLQotRnJpIFNlcCAyNyAxODoyODo1OSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBBZGQgbWVtYWRkciBhcmd1bWVudC4gIFJlLWFycmFuZ2UKLQlwYXJhbXMgdG8gYmUgbW9yZSBzdGFuZGFyZC4KLQkqIChkaXNhc3NlbWJsZSk6ICBQcmludCBhYnNvbHV0ZSBhZGRyZXNzZXMgYW5kIHN5bWJvbGljIG5hbWVzIGZvcgotCWJyYW5jaCBhbmQganVtcCB0YXJnZXRzLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kKTogIEFkZCBkaXNwbGFjZW1lbnQgZmxhZyB0byA5IGFuZCAyMgotCWJpdCBvcGVyYW5kcy4KLQkqICh2ODUwX29wY29kZXMpOiAgQWRkIGJyZWFrcG9pbnQgaW5zbi4KLQotTW9uIFNlcCAyMyAxMjozMjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IE1vdmUgdGhlIGZtb3ZlbXggZGF0YSByZWdpc3RlciBjYXNlcyBiZWZvcmUgdGhlCi0gCW90aGVyIGNhc2VzLCBzbyB0aGF0IHRoZXkgZ2V0IHJlY29nbml6ZWQgYmVmb3JlIHRoZSBkYXRhIHJlZ2lzdGVyCi0gCWRvZXMgZ2V0cyB0cmVhdGVkIGFzIGEgZGVnZW5lcmF0ZSByZWdpc3RlciBsaXN0LgotCi1UdWUgU2VwIDE3IDEyOjA2OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIGEgY2FzZSBmb3IgImRpdiIgYW5kICJkaXZ1IiB3aXRoIHR3byByZWdpc3RlcnMKLQlhbmQgYSBkZXN0aW5hdGlvbiBvZiAkMC4KLQotVHVlIFNlcCAxMCAxNjoxMjozOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogQWRkIHByb3RvdHlwZS4KLQkoX3ByaW50X2luc25fbWlwcyk6IERpdHRvLgotCi1Nb24gU2VwICA5IDE0OjI2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjb25kaXRpb24gY29kZSByZWdpc3RlcnMgYXMKLSAJJGZjY04uCi0KLVR1ZSBTZXAgIDMgMTI6MDk6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgc2V0dXcsIHNldHN3LCBzZXR4LgotCi1UdWUgU2VwICAzIDEyOjA1OjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN0YXRpYy4gIFByb3ZpZGUgcHJvdG90eXBlLgotCi1TdW4gU2VwICAxIDIyOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogRml4IGJvdW5kYXJ5IGNhc2UKLQlpbiByYW5nZSBjaGVja3MuCi0KLVNhdCBBdWcgMzEgMDE6Mjc6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEhhbmRsZSBpbnNlcnRpb24gb2YgJywnLCAnWycgYW5kCi0JJ10nIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2RlczogUmVtb3ZlIHNpemUgZmllbGQgZnJvbSBhbGwgb3Bjb2Rlcy4KLQlBZGQgIm1lbW9wIiBmaWVsZCB0byBhbGwgb3Bjb2RlcyAoZm9yIHRoZSBkaXNhc3NlbWJsZXIpLgotCVJlb3JkZXIgb3Bjb2RlcyBzbyB0aGF0ICJub3AiIGNvbWVzIGJlZm9yZSAibW92IiBhbmQgImpyIgotCWNvbWVzIGJlZm9yZSAiamFybCIuCi0KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBQcm9wZXJseSBoYW5kbGUgZGlzYXNzZW1ibGluZwotCWEgdHdvIGJ5dGUgaW5zbiBhdCB0aGUgZW5kIG9mIGEgbWVtb3J5IHJlZ2lvbiB3aGVuIHRoZSBtZW1vcnkKLQlyZWdpb24ncyBzaXplIGlzIG9ubHkgdHdvIGJ5dGUgYWxpZ25lZC4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9jY19uYW1lcyk6IEZpeCBzdHVwaWQgdGhpbmtvcy4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9yZWdfbmFtZXMpOiBEZWZpbmUuCi0JKHY4NTBfc3JlZ19uYW1lcywgdjg1MF9jY19uYW1lcyk6IExpa2V3aXNlLgotCShkaXNhc3NlbWJsZSk6IFZlcnkgcm91Z2ggY3V0IGF0IHByaW50aW5nIG9wZXJhbmRzICh1bmZvcm1hdHRlZCkuCi0KLQkqIHY4NTAtb3BjLmMgKEJPUF9NQVNLKTogRml4LgotCSh2ODUwX29wY29kZXMpOiBGaXggbWFzayBmb3IgamFybCBhbmQganIuCi0KLQkqIHY4NTAtZGlzLmM6IE5ldyBmaWxlLiAgU2tlbGV0b24gZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4gUmVtb3ZlIHY4NTAgcmVmZXJlbmNlcywgdGhleSdyZSBub3QgbmVlZGVkIGhlcmUuCi0JKiBjb25maWd1cmUuaW46IEFkZCB2ODUwLWRpcy5vIHdoZW4gYnVpbGRpbmcgdjg1MCB0b29sY2hhaW5zLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogQ2FsbCB2ODUwIGRpc2Fzc2VtYmxlci4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzcsIGV4dHJhY3RfZDhfNyk6IE5ldyBmdW5jdGlvbnMuCi0JKGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogUmVuYW1lIEQ3UyB0byBENzsgb3BlcmFuZCBmb3IgRDcgaXMgdW5zaWduZWQuCi0JUmVuYW1lIEQ4IHRvIEQ4XzcsIHVzZSB7aW5zZXJ0LGV4dHJhY3R9X2Q4Xzcgcm91dGluZXMuCi0JQWRkIEQ4XzYuCi0JKElGNEEsIElGNEIpOiBVc2UgIkQ3IiBpbnN0ZWFkIG9mICJEN1MiLgotCShJRjRDLCBJRjREKTogVXNlICJEOF83IiBpbnN0ZWFkIG9mICJEOCIuCi0JKElGNEUsIElGNEYpOiBOZXcuICBVc2UgIkQ4XzYiLgotCSh2ODUwX29wY29kZXMpOiBVc2UgSUY0QS9JRjRCIGZvciBzbGQuYi9zc3QuYi4gIFVzZSBJRjRDL0lGNEQgZm9yCi0Jc2xkLmgvc3N0LmguICBVc2UgSUY0RS9JRjRGIGZvciBzbGQudy9zc3Qudy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogQ2hhbmdlIEQxNiB0byBEMTZfMTUsIHVzZSBzcGVjaWFsIGluc2VydC9leHRyYWN0Ci0Jcm91dGluZXMuICBOZXcgbmV3IEQxNiB0aGF0IHVzZXMgdGhlIGdlbmVyaWMgaW5zZXJ0L2V4dHJhY3QgY29kZS4KLQkoSUY3QSwgSUY3Qik6IFVzZSBEMTZfMTUuCi0JKElGN0MsIElGN0QpOiBOZXcuICBVc2UgRDE2LgotCSh2ODUwX29wY29kZXMpOiBVc2UgSUY3QyBhbmQgSUY3RCBmb3IgbGQuYiBhbmQgc3QuYi4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogU2xpZ2h0bHkgaW1wcm92ZSBlcnJvcgotCW1lc3NhZ2UuICBJc3N1ZSBhbiBlcnJvciBpZiB0aGUgYnJhbmNoIG9mZnNldCBpcyBvZGQuCi0KLQkqIHY4NTAtb3BjLmM6IEFkZCBub3RlcyBhYm91dCBuZWVkaW5nIHNwZWNpYWwgaW5zZXJ0L2V4dHJhY3QKLQlmb3IgYWxsIHRoZSBsb2FkL3N0b3JlIGluc25zLCBleGNlcHQgImxkLmIiIGFuZCAic3QuYiIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kMjIsIGV4dHJhY3RfZDIyKTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IFVzZSBpbnNlcnRfZDIyIGFuZCBleHRyYWN0X2QyMiBmb3IKLQlEMjIgb3BlcmFuZHMuCi0JKGluc2VydF9kOSk6IEZpeCByYW5nZSBjaGVjay4KLQotRnJpIEF1ZyAzMCAxODowMTowMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCBWODUwX09QRVJBTkRfU0lHTkVEIGZsYWcKLQlhbmQgc2V0IGJpdHMgZmllbGQgdG8gRDkgYW5kIEQyMiBvcGVyYW5kcy4KLQotVGh1IEF1ZyAyOSAxMToxMDo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEZWZpbmUgU1IyIG9wZXJhbmQuCi0JKHY4NTBfb3Bjb2Rlcyk6ICJsZHNyIiB1c2VzIFIxLFNSMi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9wY29kZSBzcGVjcyBmb3IKLQlzbGQudywgc3N0LmIsIHNzdC5oLCBzc3QudywgYW5kIG5vcC4KLQotV2VkIEF1ZyAyOCAxNTo1NTo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCBudWxsIG9wY29kZSB0byBtYXJrIHRoZQotCWVuZCBvZiB0aGUgb3Bjb2RlIHRhYmxlLgotCi1Nb24gQXVnIDI2IDEzOjM1OjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGRlZCByZWdpc3RlciBwYWlycywKLQkicjAtcjEiLCAicjItcjMiLCBldGMuCi0KLUZyaSBBdWcgMjMgMDA6Mjc6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogTWFrZSBJMTYgYmUgYSBzaWduZWQgb3BlcmFuZC4KLQlDcmVhdGUgSTE2VSBmb3IgYW4gdW5zaWduZWQgMTZiaXQgbW1lZGlhdGUgb3BlcmFuZC4KLQkodjg1MF9vcGNvZGVzKTogVXNlIEkxNlUgZm9yICJvcmkiLCAiYW5kaSIgYW5kICJ4b3JpIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IERlZmluZSBFUCBvcGVyYW5kLgotCShJRjRBLCBJRjRCLCBJRjRDLCBJRjREKTogVXNlIEVQLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3Bjb2RlIG51bWJlcnMgZm9yICJtb3YiCi0Jd2l0aCBpbW1lZGlhdGUgb3BlcmFuZCwgIm1vdmhpIi4gIFR3ZWFrICJsZHNyIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogR2V0IGxkLltiaHddIGFuZCBzdC5bYmh3XQotCWNvcnJlY3QuICBHZXQgc2xkLltiaHddIGFuZCBzc3QuW2Jod10gY2xvc2VyLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogIm5vdCIgaXMgYSB0d28gYnl0ZSBpbnNuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IENvcnJlY3QgYml0IHBhdHRlcm4gZm9yIHNldGYuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEMTYgaW5zZXJ0cyBhdCBvZmZzZXQgMTYhCi0KLQkqIHY4NTAtb3BjLmMgKHR3byk6IEdldCBvcmRlciBvZiB3b3JkcyBjb3JyZWN0LgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogSTE2IGluc2VydHMgYXQgb2Zmc2V0IDE2IQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkICJTUjEiIGFuZCAiU1IyIiBmb3Igc3lzdGVtCi0JcmVnaXN0ZXIgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvcGVyYW5kcy4KLQkodjg1MF9vcGNvZGVzKTogVXNlIFNSMSBhbmQgU1IyIGZvciAibGRzciIgYW5kICJzdHNyIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IHRoaW5rbyBpbiAiam1wIiBvcGNvZGUuICBGaXgKLQlzYW1lIHRoaW5rbyBpbiAidHJhcCIgb3Bjb2RlLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgaW5pdGlhbGl6ZXIgZm9yIHNpemUgZmllbGQKLQlvbiBhbGwgb3Bjb2Rlcy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEQ2IC0+IERTNy4gIFJlZmVyZW5jZXMgY2hhbmdlZC4KLQlBZGQgRDggZm9yIDgtYml0IHVuc2lnbmVkIGZpZWxkIGluIHNob3J0IGxvYWQvc3RvcmUgaW5zbnMuCi0JKElGNEEsIElGNEQpOiBUaGVzZSBib3RoIG5lZWQgdHdvIHJlZ2lzdGVycy4KLQkoSUY0QywgSUY0RCk6IERlZmluZS4gIFVzZSA4LWJpdCB1bnNpZ25lZCBmaWVsZC4KLQkodjg1MF9vcGNvZGVzKTogRm9yICJzbGQuaCIsICJzbGQudyIsICJzc3QuaCIsICJzc3QudyIsIHVzZQotCUlGNEMgJiBJRjRELiAgRm9yICJ0cmFwIiB1c2UgSTVVLCBub3QgSTUuICBBZGQgSUYxIG9wZXJhbmQKLQlmb3IgImxkc3IiIGFuZCAic3RzciIuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogMy1iaXQgaW1tZWRpYXRlIGZvciBiaXQgaW5zbnMKLQlpcyB1bnNpZ25lZC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQ29ycmVjdCBzaG9ydCBzdG9yZSBoYWxmIChzc3QuaCkgYW5kCi0Jc2hvcnQgc3RvcmUgd29yZCAoc3N0LncpLgotCi1UaHUgQXVnIDIyIDE2OjU3OjI3IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZGVkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsCi0gCXBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmdzLgotCi1UaHUgQXVnIDIyIDAxOjA1OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRW5hYmxlICJ0cmFwIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9yZGVyIG9mIGRpc3BsYWNlbWVudAotCWFuZCByZWdpc3RlciBmb3IgInNldDEiLCAiY2xyMSIsICJub3QxIiwgYW5kICJ0c3QxIi4KLQotV2VkIEF1ZyAyMSAxODo0NjoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgIkIzIiBzdXBwb3J0LgotCSh2ODUwX29wY29kZXMpOiBGaXggYW5kIGVuYWJsZSAic2V0MSIsICJjbHIxIiwgIm5vdDEiCi0JYW5kICJ0c3QxIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogImptcCIgaGFzIG9ubHkgYW4gUjEgb3BlcmFuZC4KLQotCSogdjg1MC1vcGMuYzogQ2xvc2UgdW50ZXJtaW5hdGVkIGNvbW1lbnQuCi0KLVdlZCBBdWcgMjEgMTc6MzE6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCi0gCSh2ODUwX29wY29kZXMpOiBhZGQgbW92ZSBvcGNvZGVzLgotCi1UdWUgQXVnIDIwIDE0OjQxOjAzIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHY4NTAtb3BjLm8uCi0JKiBjb25maWd1cmU6IChiZmRfdjg1MHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogY29uZmlndXJlLmluOiAoYmZkX3Y4NTBfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogdjg1MC1vcGMuYzogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTkgMTU6MjE6MzggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbGl0dGxlIGVuZGlhbiBzcGFyY3MuCi0KLVRodSBBdWcgMTUgMTM6MTQ6NDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IEFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBvcGNvZGUKLQl0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQotCWluIHBhcmFsbGVsLgotCi1UaHUgQXVnIDE1IDEzOjExOjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgZWRpdGluZyBvZiBpbmNsdWRlIHBhdGhuYW1lcyB0byBiZQotCW1vcmUgZ2VuZXJhbC4KLQotVGh1IEF1ZyAxNSAxNjoyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGFybS1vcGMuaDogQWRkZWQgImJ4IiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLgotCi1XZWQgQXVnIDE0IDE3OjAwOjA0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1vcGMuYyAoRVY0RVhUSFdJTkRFWCk6IEZpZWxkIHdpZHRoIHNob3VsZCBiZSA4IG5vdCA1LgotCi1Nb24gQXVnIDEyIDE0OjMwOjM3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBNaW5vciBmaXhlcyB0byBhZGRpIGFuZCBibC5sLgotCi1GcmkgQXVnICA5IDEzOjIxOjU5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBDb3JyZWN0ICdtdicgdW5pdCBlbnRyeSB0byBFSVRIRVIuCi0KLVRodSBBdWcgIDggMTI6NDM6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBhbHBoYS1vcGMgY2hhbmdlcy4KLQotV2VkIEF1ZyAgNyAxMTo1NToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFjdHVhbGx5IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS4KLSAJKE9ORSwgT1BfT05FKTogI2lmZGVmIG91dDsgbm90IHVzZWQuCi0KLUZyaSBBdWcgIDIgMTc6NDc6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IEFkZGVkIDIgYWNjdW11bGF0b3Igc3ViIGluc3RydWN0aW9ucy4KLQlDaGFuZ2VkIHN1Ymkgb3BlcmFuZCB0eXBlIHRvIHRyZWF0IDAgYXMgMTYuCi0KLVdlZCBKdWwgMzEgMTY6MjE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgY3B1c2hsIGZvciB0aGUgbWNmNTIwMC4gIEZyb20gS2VuIFJvc2UKLQk8cm9zZUBuZXRjb20uY29tPi4KLQotV2VkIEp1bCAzMSAxNDozOToyNyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGFybS1vcGMuaDogKGFybV9vcGNvZGVzKTogQWRkZWQgaGFsZndvcmQgYW5kIHNpZ24tZXh0ZW5zaW9uCi0gCW1lbW9yeSB0cmFuc2ZlciBpbnN0cnVjdGlvbnMuIEFkZCBuZXcgZm9ybWF0IHN0cmluZyBlbnRyaWVzICVoIGFuZCAlcy4KLQkqIGFybS1kaXMuYzogKHByaW50X2luc25fYXJtKTogUHJvdmlkZSBkZWNvZGluZyBvZiB0aGUgbmV3Ci0JZm9ybWF0cyAlaCBhbmQgJXMuCi0KLUZyaSBKdWwgMjYgMTE6NDU6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3BlcmFuZHMpOiBBZGRlZCBVTlVNNFM7IGEgNC1iaXQgYWNjdW11bGF0b3Igc2hpZnQuCi0gCShkMTB2X29wY29kZXMpOiBNb2RpZmllZCBhY2N1bXVsYXRvciBzaGlmdCBpbnN0cnVjdGlvbnMgdG8gdXNlIFVOVU00Uy4KLQotRnJpIEp1bCAyNiAxNDowMTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhX29zZik6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9hbHBoYV92bXMpOiBSZW1vdmUuCi0JKHByaW50X2luc25fYWxwaGEpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaG9zZSB0aGUgcmVnaXN0ZXIKLQluYW1lcyBiYXNlZCBvbiBpbmZvLT5mbGF2b3VyLgotCSogZGlzYXNzZW1ibGUuYzogQWx3YXlzIHJldHVybiBwcmludF9pbnNuX2FscGhhIGZvciB0aGUgYWxwaGEuCi0KLVRodSBKdWwgMjUgMTU6MjQ6MTcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nKTogSGFuZGxlIHVua25vd24gb3Bjb2Rlcy4KLQotVGh1IEp1bCAyNSAxMjowODowOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogQ2hhbmdlcyB0byBzdXBwb3J0IHNpZ25lZCBhbmQgdW5zaWduZWQgbnVtYmVycy4KLQlBbGwgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0IGhhdmUgbG9uZyBhbmQgc2hvcnQgZm9ybXMKLQlub3cgZW5kIGluICIubCIgb3IgIi5zIi4gIERpdnMgYWRkZWQuCi0JKiBkMTB2LWRpcy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgc2lnbmVkIGFuZCB1bnNpZ25lZCBudW1iZXJzLgotCi1UdWUgSnVsIDIzIDExOjAyOjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jOiBDaGFuZ2UgYWxsIGZ1bmN0aW9ucyB0byB1c2UgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jLgotCi1Nb24gSnVsIDIyIDE1OjM4OjUzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBNYWtlIG9wY29kZSBtYXNrcyBmb3IgdGhlIENvbGRGaXJlCi0gCW1vdmUgY2NyL3NyIGluc25zIG1vcmUgc3RyaWN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBvbmx5Ci0gCXNlbGVjdHMgdGhlbSB3aGVuIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgZGF0YSByZWdpc3Rlci4KLQotTW9uIEp1bCAyMiAxMToyNToyNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLSAgICAgICAgKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgRGVjbGFyZS4KLSAgICAgICAgKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogTm93IHVzZXMgcHJlX2RlZmluZWRfcmVnaXN0ZXJzCi0gICAgICAgIHRvIHBpY2sgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIHJlZ2lzdGVycy4KLQotTW9uIEp1bCAyMiAxMzo0NzoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBGaXggb3Bjb2RlIHZhbHVlcyBmb3IgZnBhY2sxNiwgYW5kIGZwYWNrZml4LiAgRml4Ci0Jb3BlcmFuZHMgZm9yIGZleHBhbmQgYW5kIGZwbWVyZ2UuICBGcm9tIENocmlzdGlhbiBLdWVobmtlCi0JPENocmlzdGlhbi5LdWVobmtlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlPi4KLQotTW9uIEp1bCAyMiAxMzoxNzowNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBObyBsb25nZXIgdGhlIHVzZXItdmlzaWJsZQotCXByaW50IHJvdXRpbmUuICBUYWtlIG5ldyByZWduYW1lcyBhbmQgY3B1bWFzayBhcmd1bWVudHMuCi0JS2lsbCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm9uc2Vuc2UuCi0JKHByaW50X2luc25fYWxwaGFfb3NmKTogTmV3IGZ1bmN0aW9uLiAgRG8gT1NGLzEgc3R5bGUgcmVnbmFtZXMuCi0JKHByaW50X2luc25fYWxwaGFfdm1zKTogTmV3IGZ1bmN0aW9uLiAgRG8gVk1TIHN0eWxlIHJlZ25hbWVzLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogVGVzdCBiZmQgZmxhdm91ciB0byBwaWNrCi0JYmV0d2VlbiBPU0YgYW5kIFZNUyByb3V0aW5lcy4gIERlZmF1bHQgdG8gT1NGLgotCi1UaHUgSnVsIDE4IDE3OjE5OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KLQotV2VkIEp1bCAxNyAxNDozOTowNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogY29uZmlndXJlLmluOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogZDEwdi1kaXMuYzogTmV3IGZpbGUuCi0JKiBkMTB2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcikgQWRkIGVudHJ5IGZvciBkMTB2LgotCi1XZWQgSnVsIDE3IDEwOjEyOjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IGJ1Z3MgaW4gY29sZGZpcmUgaW5zbnMgcmVsYXRpbmcKLSAJdG8gYmNjLCB0cmFwZmwsIHN1YnhsLCBhbmQgd2RkYXRhIGRpc2NvdmVyZWQgYnkgQW5kcmVhcyBTY2h3YWIuCi0KLU1vbiBKdWwgMTUgMTY6NTk6NTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9pODA4Ni4gIFVzZSBpbmZvLm1hY2ggdG8KLQlkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQuCi0JKiBzcGFyYy1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9zcGFyY2xpdGUuICBVc2UgaW5mby5tYWNoIHRvCi0JZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgotCi1GcmkgSnVsIDEyIDEwOjEyOjAxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTgwODYpOiAgTmV3IHJvdXRpbmUgdG8gZGlzYXNzZW1ibGUgdXNpbmcKLQl0aGUgODA4NiBpbnN0cnVjdGlvbiBzZXQuCi0JKiBpMzg2LWRpcy5jOiAgR2VuZXJhbCBjbGVhbnVwcy4gIE1ha2UgbW9zdCB0aGluZ3Mgc3RhdGljLiAgQWRkCi0JcHJvdG90eXBlcy4gIEdldCByaWQgb2Ygc3RhdGljIHZhcmlhYmxlcyBhZmxhZ3MgYW5kIGRmbGFncy4gIFBhc3MKLQl0aGVtIGFzIGFyZ3MgKHRvIGFsbW9zdCBldmVyeXRoaW5nKS4KLQotVGh1IEp1bCAxMSAxMTo1ODo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBIYW5kbGUgbWFjcmVncyBpbiBsZG1hYyBpbnNucy4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEhhbmRsZSAibGRtLmwiIGFuZCAic3RtLmwiLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogImFicyIgaXMgaW1wbGljaXRseSB0d28KLQlpZiB0aGUgbmV4dCBhcmcgaXMgbWFya2VkIHdpdGggU1JDX0lOX0RTVC4gIEdyb3NzLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUHJpbnQgImV4ciIgd2hlbgotCXdlJ3JlIGxvb2tpbmcgZm9yIGFuZCBmaW5kIEVYUi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFdlIGRvbid0IGhhdmUgYSBtYXRjaAotCWlmIHdlJ3JlIGxvb2tpbmcgZm9yIEtCSVQgYW5kIHdlIGRvbid0IGZpbmQgaXQuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBNYXNrIG9mZiB1bndhbnRlZCBiaXRzCi0JZm9yIExfMyBhbmQgTF8yLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogRG9uJ3Qgc2V0IHBsZW4gZm9yCi0JM2JpdCBpbW1lZGlhdGUgb3BlcmFuZHMuCi0KLVR1ZSBKdWwgIDkgMTA6NTU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGFscGhhLW9wYy5jOiBBZGQgbmV3IGNhc2Ugb2YgIm1vdiIuICBGcm9tIEtsYXVzIEthZW1wZgotCTxra2FlbXBmQHByb2dpcy5hYy1uZXQuZGU+LgotCi1UaHUgSnVsICA0IDExOjQyOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmM6IENvcnJlY3Qgc2Vjb25kIGNhc2Ugb2YgIm1vdiIgdG8gdXNlIE9QUkwuCi0KLVdlZCBKdWwgIDMgMTY6MDM6NDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmNsaXRlKTogIE5ldyByb3V0aW5lIHRvIHByaW50Ci0Jc3BhcmNsaXRlIGluc3RydWN0aW9ucy4KLQotV2VkIEp1bCAgMyAxNDoyMToxOCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBjb2xkZmlyZSBzdXBwb3J0LgotCi1GcmkgSnVuIDI4IDE1OjUzOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChhc2lfdGFibGUpOiBBZGQgI0FTSV9OLCAjQVNJX05fTCwgI0FTSV9OVUNMRVVTLAotCSNBU0lfTlVDTEVVU19MSVRUTEUuICBSZW5hbWUgI0FTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTAotCXRvICNBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KLQotVHVlIEp1biAyNSAyMjo1ODozMSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6Ci0JVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpciwgb2xkaW5jbHVkZWRpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0KLUZyaSBKdW4gMjEgMTM6NTM6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLW9wYy5jOiBOZXcgZmlsZS4KLQkqIGFscGhhLW9wYy5oOiBSZW1vdmUuCi0JKiBhbHBoYS1kaXMuYzogQ29tcGxldGUgcmV3cml0ZSB0byB1c2UgbmV3IG9wY29kZSB0YWJsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF9hbHBoYV9hcmNoLCB1c2UgYWxwaGEtb3BjLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBhbHBoYS1vcGMuby4KLQkoYWxwaGEtZGlzLm8pOiBEZXBlbmQgdXBvbiAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgsIG5vdAotCWFscGhhLW9wYy5oLgotCShhbHBoYS1vcGMubyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBKdW4gMTkgMTU6NTU6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQlTZXQgaW1tX2FkZGVkX3RvX3JzMSBldmVuIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0JYXJlIG5vdCB0aGUgc2FtZS4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBzb21lIHR3byBvcGVyYW5kIGZvcm1zIG9mIHRoZSB3ciBpbnN0cnVjdGlvbi4KLQotVHVlIEp1biAxOCAxNTo1ODoyNyAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFJlbmFtZSAiaG1vZGUiIGFyZ3VtZW50Ci0JdG8ganVzdCAibW9kZSIuCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBIOC9TLgotCSogaDgzMDAtZGlzLmMgKHByaW50X2luc25faDgzMDBzKTogTmV3IGZ1bmN0aW9uIGZvciBIOC9TLgotCi1UdWUgSnVuIDE4IDE4OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBiZXEvdGVxIGFzIGFsaWFzZXMgZm9yIGJlL3RlLgotCi0JKiBwcGMtb3BjLmM6IEZpeCBmY21wbyBvcGNvZGUuICBGcm9tIFNlcmdlaSBTdGVzaGVua28KLQk8c2VyZ2VpQG1zaWwuc3BzLm1vdC5jb20+LgotCi1UdWUgSnVuIDE4IDE1OjA4OjU0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFByaW50IGxkYSByYSxsaXQocnopIGFzIG1vdi4KLQotTW9uIEp1biAxMCAxODo1MDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBBbHdheXMgcHJpbnQgQUJTOE1FTSB3aXRoIDo4LAotCXJlZ2FyZGxlc3Mgb2YgcGxlbi4KLQotVHVlIEp1biAgNCAwOToxNTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChPUF9PRkYpOiBDYWxsIGFwcGVuZF9wcmVmaXguCi0KLVRodSBNYXkgMjMgMTU6MTg6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGluc3RydWN0aW9uIGVuY29kaW5nIG1hY3Jvcyk6IEFkZCBleHBsaWNpdCBjYXN0cyB0bwotCXVuc2lnbmVkIGxvbmcgdG8gc2lsZW5jZSBhIHdhcm5pbmcgZnJvbSB0aGUgU29sYXJpcyBQb3dlclBDCi0JY29tcGlsZXIuCi0KLVRodSBBcHIgMjUgMTk6MzM6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgdWx0cmFzcGFyYyB2aXMgZXh0ZW5zaW9ucy4KLQotTW9uIEFwciAyMiAxNzoxMjozNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChYX0lNTSxYX1NJTU0pOiBOZXcgbWFjcm9zLgotCShYX0lNTTEzKTogRGVsZXRlLgotCShwcmludF9pbnNuX3NwYXJjKTogTWVyZ2UgY2FzZXMgaSxJLGogdG9nZXRoZXIuICBOZXcgY2FzZXMgWCxZLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBVc2UgWCBmb3IgNSBiaXQgc2hpZnQgY29uc3RhbnRzLAotCVkgZm9yIDYgYml0IHNoaWZ0IGNvbnN0YW50cy4gIFJld3JpdGUgZW50cmllcyBmb3IgY3JkY3h0LCBjd3JjeHQsCi0JY3B1c2gsIGNwdXNoYSwgY3B1bGwgc3BhcmNsZXQgaW5zbnMuCi0KLVdlZCBBcHIgMTcgMTQ6MjA6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogUmVwbGFjZSBBTlNJIHN0eWxlIGRlZiB3aXRoIEsmUi4KLQotVGh1IEFwciAxMSAxNzozMDowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBTZXQgRl9GQlIgb24gZmxvYXRpbmcgcG9pbnQgYnJhbmNoIGluc3RydWN0aW9ucy4KLQlTZXQgRl9GTE9BVCBvbiBvdGhlciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgIDggMTc6MDI6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQzg2MCk6IE1hY3JvIGZvciA4NjAvODIxIHNwZWNpZmljIGluc3RydWN0aW9ucyBhbmQKLQlyZWdpc3RlcnMuCi0gCShwb3dlcnBjX29wY29kZXMpOiBBZGQgODYwLzgyMSBzcGVjaWZpYyBTUFJzLgotCi1Nb24gQXByICA4IDE0OjAwOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuICBTZXQgYW5kIHN1YnN0aXR1dGUgQkZEX1BJQ0xJU1QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX1BJQ0xJU1QpOiBSZW5hbWUgZnJvbSBCRkRfTElTVC4gIENoYW5nZSBhbGwKLQl1c2VzLiAgU2V0IHRvIEBCRkRfUElDTElTVEAuCi0KLUZyaSBBcHIgIDUgMTc6MTI6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogVXNlICJiaXQiIGZvciBMXzMgaW1tZWRpYXRlcywKLQlub3QgImFicyIsIHdoaWNoIG1heSBiZSBuZWVkZWQgZm9yIHRoZSBhYnNvbHV0ZSBpbiBzb21ldGhpbmcKLQlsaWtlIGJ0c3QgIzAsQDEwOjguICBQcmludCBMXzMgaW1tZWRpYXRlcyBzZXBhcmF0ZWx5IGZyb20gb3RoZXIKLQlpbW1lZGlhdGVzLiAgQ2hhbmdlIEFCU01PViByZWZlcmVuY2UgdG8gQUJTOE1FTS4KLQotV2VkIEFwciAgMyAxMDo0MDo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAob3Bjb2Rlc19pbml0aWFsaXplZCk6IE1vdmUgaW5zaWRlIHByaW50X2luc25fc3BhcmMuCi0JKGN1cnJlbnRfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBnbG9iYWwuCi0JKGNvbXB1dGVfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBzcGFyY192OV9wLiAgTmV3IHN0YXRpYyBsb2NhbAotCWN1cnJlbnRfbWFjaC4gIFJlc29ydCBvcGNvZGUgdGFibGUgaWYgY3VycmVudF9tYWNoIGNoYW5nZXMuCi0JR2VuZXJhbGl6ZSAiaW5zbiBub3Qgc3VwcG9ydGVkIiB0ZXN0LgotCShjb21wYXJlX29wY29kZXMpOiBQcmVmZXIgc3VwcG9ydGVkIG9wY29kZXMgdG8gbm9uc3VwcG9ydGVkIG9uZXMuCi0JRGVsZXRlIHRlc3QgZm9yIHY5LyF2OS4KLQkqIHNwYXJjLW9wYy5jIChNQVNLXyopOiBVc2UgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSy4KLQkodjZub3RsZXQpOiBEZWZpbmUuCi0JKGJyZmMpOiBTcGxpdCBpbnRvIENCUiBhbmQgRkJSIGZvciBjb3Byb2Nlc3Nvci9mcCBicmFuY2hlcy4KLQkoYnJmY3gpOiBSZW5hbWVkIHRvIEZCUlguCi0JKGNvbmRmYyk6IFJlbmFtZWQgdG8gQ09OREZDLiAgUGFzcyB2Nm5vdGxldCB0byBDQlIgKHN0YW5kYXJkCi0JY29wcm9jZXNzb3IgbW5lbW9uaWNzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGFyY2xldCkuCi0JKGNvbmRmKTogUmVuYW1lZCB0byBDT05ERi4KLQkoU0xDQkNDMik6IERlbGV0ZSBGX0FMSUFTIGZsYWcuCi0KLVNhdCBNYXIgMzAgMjE6NDU6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiByZCBtdXN0IGJlIDAgZm9yCi0JbW92IGZvbyx7JXksJXBzciwld2ltLCV0YnJ9LiAgU3VwcG9ydCBtb3YgZm9vLCVhc3JYLgotCi1GcmkgTWFyIDI5IDEzOjAyOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgVkVSU0lPTiBmaWxlLCBzbwotCXRoYXQgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyIGlzIHNldCBjb3JyZWN0bHkuCi0KLVR1ZSBNYXIgMjYgMTU6NDc6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KLQlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgTWFyIDE2IDEzOjA0OjA3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB6OGtnZW4uYyAoaW50ZXJuYWwsIGdhcyk6IENhbGwgeG1hbGxvYyByYXRoZXIgdGhhbiB1bmNoZWNrZWQKLQltYWxsb2MuCi0KLVR1ZSBNYXIgMTIgMTI6MTQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLVRodSBNYXIgIDcgMTU6MTE6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlICdPJyBvcGVyYW5kIGNoYXIgbGlrZSAncicuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IFVzZSAnTycgb3BlcmFuZCBjaGFyIGZvciBgbmVnIHJlZycuCi0KLVR1ZSBNYXIgIDUgMTU6NTE6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAotCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMjYgMTM6MDM6NDAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYml0cy4KLQotVHVlIEZlYiAyMCAyMDo0ODoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHY4LHY2bm90djkpOiBBZGQgTUFTS19TUEFSQ0xFVC4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogQWRkIE1BU0tfVjggdG8gc3BhcmNsZXQgZW50cnkuCi0JKHNwYXJjX29wY29kZXMpOiBBZGQgc3BhcmNsZXQgaW5zbnMuCi0JKHNwYXJjbGV0X2NwcmVnX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3NwYXJjbGV0X2NwcmVnKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIHNwYXJjbGV0IGNwcmVncy4KLQotVHVlIEZlYiAyMCAxMTowMjo0NCAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4KLQotCSogaTM4Ni1kaXMuYyAoaW5kZXgxNik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHB1dG9wKTogUHJpbnQgamVjeHogZm9yIDMyIGJpdCBjYXNlLCBqY3h6IGZvciAxNiBiaXQsIG5vdCB0aGUKLQlvdGhlciB3YXkgYXJvdW5kLgotCShPUF9pbmRpckUpOiBSZXR1cm4gcmVzdWx0IG9mIE9QX0UuCi0JKE9QX0UpOiBDaGVjayBmb3IgMTYgYml0IGFkZHJlc3NpbmcgbW9kZSwgYW5kIGRpc2Fzc2VtYmxlCi0JY29ycmVjdGx5LiAgT3B0aW1pc2VkIDMyIGJpdCBjYXNlIGEgbGl0dGxlLiAgRG9uJ3QgcHJpbnQKLQkiKGJhc2UsaW5kZXgsc2NhbGUpIiB3aGVuIHNpYiBzcGVjaWZpZXMgb25seSBhbiBvZmZzZXQuCi0KLU1vbiBGZWIgMTkgMTI6MzI6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBTSExJQl9ERVAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfREVQKTogTmV3IHZhcmlhYmxlLgotCShMSUJJQkVSVFlfTElTVFMsIEJGRF9MSVNUKTogTmV3IHZhcmlhYmxlcy4KLQkoc3RhbXAtcGljbGlzdCk6IERlcGVuZCB1cG9uIExJQklCRVJUWV9MSVNUUyBhbmQgQkZEX0xJU1QuICBJZgotCUNPTU1PTl9TSExJQiwgYWRkIHRoZW0gdG8gcGljbGlzdCB3aXRoIGFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMuCi0JKCQoU0hMSUIpKTogRGVwZW5kIHVwb24gJChTSExJQl9ERVApLiAgRG9uJ3QgY2hlY2sgQ09NTU9OX1NITElCCi0JaGVyZToganVzdCB1c2UgcGljbGlzdC4KLQotTW9uIEZlYiAxOSAwMjowMzo1MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKE1BU0tfVjksVjlfT05MWV9QLFY5X1ApOiBEZWZpbmUuCi0JKHByaW50X2luc25fc3BhcmMpOiBSZXdyaXRlIHY5L25vdC12OSB0ZXN0cy4KLQkoY29tcGFyZV9vcGNvZGVzKTogTGlrZXdpc2UuCi0JKiBzcGFyYy1vcGMuYyAoTUFTS188QVJDSD4pOiBEZWZpbmUuCi0JKHY2LHY3LHY4LHNwYXJjbGl0ZSx2OSx2OWEpOiBSZWRlZmluZS4KLQkoc3BhcmNsZXQsdjZub3R2OSk6IERlZmluZS4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogRGVsZXRlIG1lbWJlciBgY29uZmxpY3RzJy4gIEFkZCBgc3VwcG9ydGVkJy4KLQkoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBGX05PVFY5LCB1c2UgdjZub3R2OSBpbnN0ZWFkLgotCi1UaHUgRmViIDE1IDE0OjQ1OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogUmVtb3ZlIGxlYWRpbmcgLi4vYmZkLyBmcm9tICQoU0hMSUIpLgotCi1XZWQgRmViIDE0IDE5OjAxOjI3IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAob25lYnl0ZV9oYXNfbW9kcm0pOiBOZXcgc3RhdGljIGFycmF5LgotCSh0d29ieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHByaW50X2luc25faTM4Nik6IE9ubHkgZmV0Y2ggdGhlIG1vZC9yZWcvcm0gYnl0ZSBpZiBpdCBpcyBuZWVkZWQuCi0KLVR1ZSBGZWIgMTMgMTU6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90Ci0JJChTSExJTkspLgotCi1Nb24gRmViIDEyIDE2OjI2OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUEMpOiBVbmRlZiwgc28gZGVmYXVsdCBkZWZpbmF0aW9uIG9uIFdpbmRvd3MgTlQKLQlkb2Vzbid0IGNvbmZsaWN0LgotCi1XZWQgRmViICA3IDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogVGhlIGJrcHQgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIG9uCi0JbTY4MDEwdXAsIG5vdCBqdXN0IG02ODAyMHVwIHwgY3B1MzIuCi0KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSU5LKSk6IE1ha2UgYSBsaW5rIHRvIHRoZSB0cmFuc2Zvcm1lZCBuYW1lLCBhcyB3ZWxsLgotCShzdGFtcC10c2hsaW5rKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IFNraXAgc3RhbXAtdHNobGluayBkdXJpbmcgaW5zdGFsbC4KLQotVHVlIEZlYiAgNiAxMjoyODo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19BUkdfUFJPR1JBTS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KLQotTW9uIEZlYiAgNSAxNjoxNDo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKG1lbSk6IEFkZCBIWCBkY2ludmEgaW5zdHJ1Y3Rpb24uCi0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20KLQlBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBzaGFyZWQgYW5kIGNvbW1vbmJmZGxpYi4KLQlOZXcgc3Vic3RpdHV0aW9uczogQUxMTElCUywgUElDRkxBRywgU0hMSUIsIFNITElCX0NDLAotCVNITElCX0NGTEFHUywgQ09NTU9OX1NITElCLCBTSExJTksuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCi0JKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgotCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIHJhdGhlciB0aGFuICQoVEFSR0VUTElCKS4KLQkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgotCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCi0JKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQkoZGlzYXNzZW1ibGUubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgotCShNT1NUTFlDTEVBTik6IEFkZCBwaWMvKi5vLgotCShjbGVhbik6IFJlbW92ZSAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQgc3RhbXAtcGljbGlzdC4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHBpYyBhbmQgc3RhbXAtcGljZGlyLgotCShpbnN0YWxsKTogSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzLgotCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgotCi1GcmkgRmViICAyIDE3OjE1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBESVNBU01fUkFXX0lOU04gc3VwcG9ydC4KLQlQcmludCB1bmtub3duIGluc3RydWN0aW9uIGFzICJ1bmtub3duIiwgcmF0aGVyIHRoYW4gaW4gaGV4LgotCi1UdWUgSmFuIDMwIDE0OjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWJ1Zi5jOiBJbmNsdWRlICJzeXNkZXAuaCIgYmVmb3JlICJkaXMtYXNtLmgiLgotCi1UaHUgSmFuIDI1IDIwOjI0OjA3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2RlX2FyY2hzKTogTWFyayB2OC9zcGFyY2xpdGUgYXMgY29uZmxpY3RpbmcuCi0KLVRodSBKYW4gMjUgMTE6NTY6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBPbmx5IGZldGNoIHRoZSBtb2QvcmVnL3JtIGJ5dGUKLQl3aGVuIG5lY2Vzc2FyeS4gIEZyb20gVWxyaWNoIERyZXBwZXIKLQk8ZHJlcHBlckBteXdhcmUucnoudW5pLWthcmxzcnVoZS5kZT4uCi0KLVRodSBKYW4gMjUgMDM6Mzk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogTlVNT1BDT0RFUyByZXBsYWNlZCB3aXRoCi0Jc3BhcmNfbnVtX29wY29kZXMuICBVcGRhdGUgYXJjaGl0ZWN0dXJlIGVudW0gdmFsdWVzLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KLQkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19udW1fb3Bjb2Rlcyk6IFJlbmFtZWQgZnJvbSBiZmRfc3BhcmNfbnVtX29wY29kZXMuCi0JKHNwYXJjX29wY29kZXMpOiBBZGQgdjlhIHNodXRkb3duIGluc24uCi0KLU1vbiBKYW4gMjIgMDg6Mjk6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVuYW1lZCBmcm9tIHByaW50X2luc24uCi0JSWYgRElTQVNNX1JBV19JTlNOLCBwcmludCBpbnNuIGluIGhleC4gIEhhbmRsZSB2OWEgYXMgb3Bjb2RlCi0JYXJjaGl0ZWN0dXJlLgotCShwcmludF9pbnNuX3NwYXJjNjQpOiBEZWxldGVkLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyLCBjYXNlIGJmZF9hcmNoX3NwYXJjKTogQWx3YXlzIHVzZQotCXByaW50X2luc25fc3BhcmMuCi0KLQkqIHNwYXJjLW9wYy5jIChhcmNoaXRlY3R1cmVfcG5hbWUpOiBBZGQgdjlhLgotCi1GcmkgSmFuIDEyIDE0OjM1OjU4IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+Ci0KLQkqIGFscGhhLW9wYy5oIChhbHBoYV9pbnNuX3NldCk6IFZBWCBmbG9hdGluZyBwb2ludCBvcGNvZGUgd2FzCi0gCWluY29ycmVjdGx5IGRlZmluZWQgYXMgMHgxNiB3aGVuIGl0IHNob3VsZCBiZSAweDE1LgotCShGTE9BVF9GT1JNQVRfTUFTSyk6IGZ1bmN0aW9uIGNvZGUgaXMgMTEgYml0cywgbm90IGp1c3QgNyBiaXRzIQotCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGN2dHN0IGFuZCBjdnR0cSBmbG9hdCBvcHMuICBBbHNvIGFkZGVkCi0gCWV4Y2IgKGV4Y2VwdGlvbiBiYXJyaWVyKSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZSBBbHBoYQotIAlBcmNoaXRlY3R1cmUgSGFuZGJvb2sgdmVyc2lvbiAyLgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBGaXhlZCBzcGVjaWFsLWNhc2UgZGVjb2RpbmcgZm9yCi0gCU9QRVJBVEVfRk9STUFUX0NPREUgdHlwZSBpbnN0cnVjdGlvbnMuICBUaGUgYnVnIGNhdXNlZCBtdWxxIHRvIGJlCi0gCWRpc2Fzc2VtYmxlZCBhcyBvciwgZm9yIGV4YW1wbGUuCi0KLVdlZCBKYW4gMTAgMTI6Mzc6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNhc2VzICdpJyBhbmQgJ3UnIGluIGhleC4KLQkoX3ByaW50X2luc25fbWlwcyk6IENoYW5nZSBpIGZyb20gaW50IHRvIHVuc2lnbmVkIGludC4KLQotVGh1IEphbiAgNCAxNzoyMToxMCAxOTk2ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiB0bGJpIFBPV0VSIG9wY29kZSBmb3JtIGRpZmZlcmVudAotCWZyb20gdGxiaWUgUG93ZXJQQyBvcGNvZGUuICBBZGQgUFBDNjAzIHRsYmxkIGFuZCB0bGJsaS4KLQotVGh1IERlYyAyOCAxMzoyOToxOSAxOTk1ICBKb2huIEhhc3NleSAgPGhhc3NleUBydHAuZGcuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBEZWMgMTkgMjI6NTY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGZzcXJ0eywufSk6IER1cGxpY2F0ZSBmb3IgUG93ZXJQQyBpbiBhZGRpdGlvbiB0bwotCWJlaW5nIGZvciBQb3dlcjIuCi0KLUZyaSBEZWMgMTUgMTQ6MTQ6MTUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUpOiBBZGRlZCBSRUdfQi4KLQkoc2hfYXJnX3R5cGUpOiBBZGRlZCBBX1JFR19CLgotCShzaF90YWJsZSk6IEFkZGVkIHByZWYgYW5kIGJhbmsgcmVnIHZlcnNpb25zIG9mIGxkYywgbGRjLmwsIHN0YwotIAlhbmQgc3RjLmwgb3Bjb2Rlcy4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZGVkIGNhc2VzIGZvciBSRUdfQiBhbmQgQV9SRUdfQi4KLQotRnJpIERlYyAxNSAxNjo0NDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLVR1ZSBEZWMgMTIgMTI6MjI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN0YW1wLWguICBGcm9tIFJvbmFsZAotCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotVHVlIERlYyAgNSAxMzo0Mjo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+OgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBmaXhlZCBkZWNvZGluZyBvZiBjcHlzCi0gCWluc3RydWN0aW9uLgotCi1Nb24gRGVjICA0IDEyOjI5OjA1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkZWQgQV9TU1IgYW5kIEFfU1BDLgotCShzaF90YWJsZSk6IEFkZGVkIG1hbnkgU0gzIG9wY29kZXMuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGRlZCBjYXNlcyBmb3IgQV9TU1IgYW5kIEFfU1BDLgotCi1GcmkgRGVjICAxIDA3OjQyOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChzdWJmYy4sIHN1YmZjbyk6IE1hcmsgdGhpcyBQUENDT00sIG5vdCBQUEMuCi0JKHN1YmNvLHN1YmNvLik6IE1hcmsgdGhpcyBQUEMsIG5vdCBQUENDT00uCi0KLU1vbiBOb3YgMjcgMTM6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVR1ZSBOb3YgMjEgMTg6Mjg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLVdlZCBOb3YgMTUgMTk6MDI6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU29ydCBsaXN0IG9mIGFyY2hpdGVjdHVyZXMuICBBY2NlcHQgYnV0IGRvIG5vdGhpbmcKLQlmb3IgYWxsaWFudCwgY29udmV4LCBweXJhbWlkLCByb21wLCBhbmQgdGFob2UuCi0KLVdlZCBOb3YgIDggMjA6MTg6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9zcGVjaWFsKTogQ2hhbmdlIG51bSB0byB1bnNpZ25lZCBpbnQuCi0KLVdlZCBOb3YgIDggMjA6MTA6MzUgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IENhc3QgaW5zbjI0IHRvIHVuc2lnbmVkIGxvbmcgd2hlbgotCXNoaWZ0aW5nIGl0LgotCi1UdWUgTm92ICA3IDE1OjIxOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1BST0cgdG8gZmluZCBhbmQgY2FjaGUgQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBOb3YgIDYgMTc6Mzk6NDcgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBiZmRfaTg2MF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTm92ICAzIDEyOjQ1OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29ycmVjdCBmbW92ZW1sIG9wZXJhbmRzLgotCSogbTY4ay1kaXMuYyAoTkVYVFNJTkdMRSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoTkVYVERPVUJMRSk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX202OGspOiBEb24ndCBtYXRjaCBmbW92ZW1sIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKLQlyZWdpc3RlciBpbiB0aGUgbGlzdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgYSBwbGFjZSBvZiAnOCcgZm9yIGEgdHlwZSBvZiAnTCcuCi0KLVRodSBOb3YgIDIgMjM6MDY6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBVc2UgI1cgcmF0aGVyIHRoYW4gI3cuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgJ1cnIHBsYWNlLgotCi1XZWQgTm92ICAxIDEzOjMwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBkYmZ3IGFzIGFuIGFsaWFzIGZvciBkYmYsCi0JYW5kIGxpa2V3aXNlIGZvciBhbGwgdGhlIGRieHggb3Bjb2Rlcy4KLQotTW9uIE9jdCAzMCAyMDo1MDo0MCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXJjLWRpcy5jOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KLQotTW9uIE9jdCAyMyAxMToxMTozNCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogbWlwcy1vcGMuYzogQWRkZWQgc2hvcnRoYW5kIChWMSkgZm9yIElOU05fNDEwMCBtYW5pZmVzdC4gQWRkZWQKLSAJdGhlIFZSNDEwMCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gdGhlIG1pcHNfb3Bjb2RlcyBzdHJ1Y3R1cmUuCi0KLVRodSBPY3QgMTkgMTE6MDU6MjMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluLCBtcHctbWFrZS5zZWQ6IFJlbW92ZSB1Z2x5IHdvcmthcm91bmQgZm9yCi0JdWdseSBNZXRyb3dlcmtzIGJ1ZyBpbiBDVzYsIGlzIGZpeGVkIGluIENXNy4KLQotTW9uIE9jdCAxNiAxMjo1OTowMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAod2hvbGUgZmlsZSk6IEFkZCBmbGFncyBmb3IgY29tbW9uL2FueSBzdXBwb3J0LgotCi1UdWUgT2N0IDEwIDExOjA2OjA3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0JKEZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgQklTT04uCi0KLUZyaSBPY3QgIDYgMTY6MjY6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBSZWNvZ25pemUgYWxsIHR3by13b3JkCi0JaW5zdHJ1Y3Rpb25zIHRoYXQgdGFrZSBubyBhcmdzIGJ5IGxvb2tpbmcgYXQgdGhlIG1hdGNoIG1hc2suCi0gIAkocHJpbnRfaW5zbl9hcmcpOiBBbHdheXMgcHJpbnQgIiUiIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KLQlbY2FzZSAnYyddOiBVc2UgIm5jIiBmb3IgdGhlIG5vLWNhY2hlIGNhc2UsIGFzIHJlY29nbml6ZWQgYnkgZ2FzLgotCVtjYXNlICdfJ106IERvbid0IHByaW50ICJAIyIgYmVmb3JlIGFkZHJlc3MuCi0JW2Nhc2UgJ0onXTogVXNlICIlcyIgYXMgZm9ybWF0IHN0cmluZywgbm90IHJlZ2lzdGVyIG5hbWUuCi0JW2Nhc2UgJ0InXTogVHJlYXQgcGxhY2UgPT0gJ0MnIGxpa2UgJ2wnIGFuZCAnTCcuCi0KLVRodSBPY3QgIDUgMjI6MTY6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IERlc2NyaWJlIGNtcHhjaGc4YiBvcGVyYW5kLCBhbmQgc3BlbGwgdGhlIG9wY29kZQotCW5hbWUgY29ycmVjdGx5LgotCi1UdWUgT2N0ICAzIDA4OjMwOjIwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGFscGhhLW9wYy5oIChNRU1PUllfRlVOQ1RJT05fRk9STUFUX01BU0spOiBhZGRlZC4KLSAgCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGRlZmluaXRpb25zIGZvciBWQVggZmxvYXRpbmcgcG9pbnQKLSAJaW5zdHJ1Y3Rpb25zIChVbml4IGNvbXBpbGVycyBkb24ndCBnZW5lcmF0ZSB0aGVzZSwgYnV0IGhhbmRjb2RlZAotIAlhc3NlbWJseSBtaWdodCBzdGlsbCB1c2UgdGhlbSkuCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogYWRkZWQgc3VwcG9ydCBmb3IgZGlzYXNzZW1ibGluZwotIAl0aGUgbWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMgaW4gdGhlIEFscGhhIGluc3RydWN0aW9uIHNldC4KLQotVHVlIFNlcCAyNiAxODo0NzoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtNjhrLW9wYy5jLm8gdG8gQkZEX01BQ0hJTkVTIGZvciBtNjhrLAotCW5vIGxvbmdlciBjcmVhdGUgc3lzZGVwLmgsIHNlZCBwcGMtb3BjLmMgdG8gd29yayBhcm91bmQgYQotCXNlcmlvdXMgTWV0cm93ZXJrcyBDIGJ1Zy4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCB1c2VkIGJ5IG1wdy1jb25maWd1cmUgdG8gZWRpdAotCU1ha2VmaWxlLmluIGludG8gYW4gTVBXIG1ha2VmaWxlLgotCi1XZWQgU2VwIDIwIDEyOjU1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgotCi1UdWUgU2VwIDE5IDE1OjI4OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogU3BsaXQgcG1vdmUgcGF0dGVybnMgd2hpY2ggdXNlICdQJyBpbnRvIHBhdHRlcm5zCi0Jd2hpY2ggdXNlICcwJywgJzEnLCBhbmQgJzInIGluc3RlYWQuICBTcGVjaWZ5IHRoZSBwcm9wZXIgc2l6ZSBmb3IKLQlhIHBtb3ZlIGltbWVkaWF0ZSBvcGVyYW5kLiAgQ29ycmVjdCB0aGUgcG1vdmVmZCBwYXR0ZXJucyB0byBiZQotCW1vdmVzIHRvIGEgcmVnaXN0ZXIsIG5vdCBmcm9tIGEgcmVnaXN0ZXIuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlcGxhY2UgJ1AnIHdpdGggJzAnLCAnMScsICcyJy4KLQotVGh1IFNlcCAxNCAxMTo1ODoyMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IE1hcmsgYWxsIGluc25zIHRoYXQgcmVmZXJlbmNlCi0JJXBzciwgJXdpbSwgJXRiciBhcyBGX05PVFY5LgotCi1GcmkgU2VwICA4IDAxOjA3OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogSnVzdCByZWJ1aWxkIE1ha2VmaWxlIHdoZW4gcnVubmluZwotCWNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiBhbmQgQUNfQ0FOT05JQ0FMX1NZU1RFTQotCWVhcmxpZXIuICBEb24ndCBib3RoZXIgdG8gY2FsbCBBQ19BUkdfUFJPR1JBTS4gIFRvdWNoIHN0YW1wLWggd2hlbgotCXJlYnVpbGRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoICJ0LEEiCi0Jb3BlcmFuZHMgdG8gdXNlICJ0LEEoYikiLgotCi1UaHUgU2VwICA3IDE5OjAyOjQ2IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkIEZfRlIwIHN1cHBvcnQuCi0KLVRodSBTZXAgIDcgMTk6MDI6NDYgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBDaGFuZ2UgbG9vcCBvdmVyIG9wLT5hcmdbbl0gdG8gaXRlcmF0ZQotCXVudGlsIDMgaW5zdGVhZCBvZiB1bnRpbCAyLgotCi1XZWQgU2VwICA2IDIxOjIxOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUuCi0JKC5jLm8sIGRpc2Fzc2VtYmxlLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KLQkoTU9TVExZQ0xFQU4pOiBBZGQgY29uZmlnLmxvZy4KLQkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZy5sb2cuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgSERFRklORVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgRl9GUjAuCi0JKHNoX3RhYmxlLCBjYXNlIGZtYWMpOiBBZGQgRl9GUjAgYXMgZmlyc3QgYXJndW1lbnQuCi0KLVdlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfb3Bjb2RlX2luZm8pOiBJbmNyZWFzZSBhcmcgYXJyYXkgc2l6ZSB0byA0LgotCi1UdWUgU2VwICA1IDE4OjI4OjEwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gTk9fVjkuCi0KLVR1ZSBTZXAgIDUgMjA6MDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBKdXN0IGluY2x1ZGUgLi4vYmZkL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgIDUgMTY6MDk6NTkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKFhfRElTUDE5KTogRGVmaW5lLgotCShwcmludF9pbnNuLCBjYXNlICdHJyk6IFVzZSBpdC4KLQkocHJpbnRfaW5zbiwgY2FzZSAnTCcpOiBTaWduIGV4dGVuZCBkaXNwbGFjZW1lbnQuCi0KLU1vbiBTZXAgIDQgMTQ6Mjg6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJ1biAuLi9iZmQvY29uZmlndXJlLmhvc3QgYmVmb3JlIEFDX1BST0dfQ0MuCi0JU3Vic2l0dXRlIENGTEFHUyBhbmQgQVIuICBDYWxsIEFDX1BST0dfSU5TVEFMTC4gIERvbid0IHN1YnN0aXR1dGUKLQlob3N0X21ha2VmaWxlX2ZyYWcgb3IgZnJhZ3MuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9QUk9HUkFNKTogU2V0IHRvIEBJTlNUQUxMX1BST0dSQU1ALgotCShJTlNUQUxMX0RBVEEpOiBTZXQgdG8gQElOU1RBTExfREFUQUAuCi0JKEFSKTogU2V0IHRvIEBBUkAuCi0JKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHFjLgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKEBob3N0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShjb25maWcuc3RhdHVzKTogUmVtb3ZlIGRlcGVuZGVuY3kgdXBvbiBAZnJhZ3NALgotCi0JKiBjb25maWd1cmUuaW46IC4uL2JmZC9jb25maWcuYmZkIG5vdyBqdXN0IHNldHMgc2hlbGwgdmFyaWFibGVzLgotCVVzZSB0aGVtIHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaCB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDMxIDEyOjM1OjMyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKGZ0cmMpOiBDaGFuZ2UgRlBVTF9OIHRvIEZQVUxfTS4KLQotV2VkIEF1ZyAzMCAxMzo1MjoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgd3IgJXkgaW5zbi4KLQlBZGQgY2xyeCwgaXByZWZldGNoLCBzaWdueCwgY2xydXcsIGNhcywgY2FzbCwgY2FzeCwgY2FzeGwgc3ludGhldGljCi0Jc3BhcmM2NCBpbnNucy4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggcHJlZmV0Y2hhIGluc24uCi0JKGxvb2t1cF97bmFtZSx2YWx1ZX0pOiBOZXcgZnVuY3Rpb25zLgotCShwcmVmZXRjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEhhbmRsZSAnKicgYXJnIChwcmVmZXRjaCBmdW5jdGlvbikuCi0KLVdlZCBBdWcgMzAgMTE6MTE6NTggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkIGJsYW5rIGxpbmVzIHRvIGltcHJvdmUgcmVhZGFiaWxpbHR5IG9mIHNoM2UKLQlpbnN0cnVjdGlvbnMuCi0KLVdlZCBBdWcgMzAgMTE6MDk6MzggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYzogQ29ycmVjdCBjb21tZW50IG9uIGZpcnN0IGxpbmUgb2YgZmlsZS4KLQotVHVlIEF1ZyAyOSAxNTozNzoxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX21hY2hfc3BhcmM2NC4KLQotCSogc3BhcmMtb3BjLmMgKGFzaSwgbWVtYmFyKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV97YXNpLG1lbWJhcn0pOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyY19vcGNvZGVzLCBtZW1iYXIgaW5zbik6IEZpeC4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuKTogQ2FsbCBzcGFyY19kZWNvZGVfYXNpLgotCVN1cHBvcnQgZGVjb2Rpbmcgb2YgbWVtYmFyIG1hc2tzLgotCShYX01FTUJBUik6IERlZmluZS4KLQotU2F0IEF1ZyAyNiAyMToyMjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYnIsIGJycywgYnJiLCBicncsIGJybC4KLQotTW9uIEF1ZyAyMSAxNzozMzozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYmhpYiBhcyBhbiBhbGlhcyBmb3IgYmhpcywKLQlhbmQgbGlrZXdpc2UgZm9yIHRoZSBvdGhlciBicmFuY2hlcy4gIEFkZCBiaHMgYXMgYW4gYWxpYXMgZm9yIGJjYywKLQlhbmQgbGlrZXdpc2UgZm9yIHRoZSBzaXplIHZhcmlhbnRzLiAgQWRkIGRiaHMgYXMgYW4gYWxpYXMgZm9yCi0JZGJjYy4KLQotRnJpIEF1ZyAxMSAxMzo0MDoyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2gtb3BjLmggKEZQIHN0cyBpbnN0cnVjdGlvbnMpOiBVcGRhdGUgdG8gbWF0Y2ggcmVhbGl0eS4KLQotTW9uIEF1ZyAgNyAxNjoxMjo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmM6IChmcGNyX25hbWVzKTogQWRkICUgYmVmb3JlIGFsbCByZWdpc3RlciBuYW1lcy4KLQkocmVnX25hbWVzKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fYXJnKTogRG9uJ3QgZXhwbGljaXRseSBwcmludCAlIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KLQlBZGQgJSBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgaW4gc3RhdGljIGFycmF5IG5hbWVzLiAgSW4gY2FzZSAncicsCi0JcHJpbnQgZGF0YSByZWdpc3RlcnMgYXMgYEAoRG4pJywgbm90IGBEbkAnLiAgV2hlbiBwcmludGluZyBhCi0JbWVtb3J5IGFkZHJlc3MsIGRvbid0IHByaW50IEAjIGJlZm9yZSBpdC4KLQkocHJpbnRfaW5kZXhlZCk6IENoYW5nZSBiYXNlX2Rpc3AgYW5kIG91dGVyX2Rpc3AgZnJvbSBpbnQgdG8KLQliZmRfdm1hLiAgUHJpbnQgdXNpbmcgTUlUIHN5bnRheCwgbm90IG11dGFudCBpbnZhbGlkIE1vdG9yb2xhCi0Jc3ludGF4LiAgU2lnbiBleHRlbmQgOCBieXRlIGRpc3BsYWNlbWVudCBjb3JyZWN0bHkuCi0JKHByaW50X2Jhc2UpOiBQcmludCB1c2luZyBNSVQgc3ludGF4LiAgUHJpbnQgenBjIHdoZW4gYXBwcm9wcmlhdGUuCi0JQ2hhbmdlIHBhcmFtZXRlciBkaXNwIGZyb20gaW50IHRvIGJmZF92bWEuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQganNybCBhbmQganNycyBhcyBhbGlhc2VzCi0JZm9yIGpzci4KLQotTW9uIEF1ZyAgNyAwMjoyMTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzIEZfUkVHX04sCi0JRl9SRUdfTSwgRlBTQ1JfTSwgRlBTQ1JfTiwgRlBVTF9NIGFuZCBGUFVMX04uCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuCi0JKHNoX3RhYmxlKTogQWRkIG5ldyBvcGNvZGVzIGZyb20gU0gzRSBGbG9hdGluZyBQb2ludCBJU0EuCi0KLVNhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCi0KLVNhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCi0KLVdlZCBBdWcgIDIgMTg6MzM6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBOZXcgZmlsZSwgaG9sZGluZyB0YWJsZXMgZnJvbSBpbmNsdWRlL29wY29kZS9tNjhrLmguCi0JQ2xlYW4gdXAgdGFibGVzLgotCSogbTY4ay1kaXMuYzogUmVtb3ZlIEJSRUFLX1VQX0JJR19ERUNMIHN0dWZmLgotCShvcGNvZGUpOiBSZW1vdmUuCi0JKHByaW50X2luc25fbTY4ayk6IENoYW5nZSBkIHRvIGJlIGNvbnN0LiAgVXNlIG02OGtfbnVtb3Bjb2RlcwotCXJhdGhlciB0aGFuIG51bW9wY29kZXMuICBVc2UgbTY4a19vcGNvZGVzIHJhdGhlciB0aGFuIHJlbW92ZWQKLQlvcGNvZGUgZnVuY3Rpb24uICBEb24ndCBjaGVjayBGX0FMSUFTLgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBtNjhrLW9wYy5vLgotCShtNjhrLW9wYy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbTY4ay1vcGMubyBmb3IgYmZkX202OGtfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAgMiAwODoyMzozOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoSEFTSF9TSVpFLCBIQVNIX0lOU04pOiBEZWZpbmUuCi0JKG9wY29kZV9iaXRzLCBvcGNvZGVfaGFzaF90YWJsZSk6IE5ldyB2YXJpYWJsZXMuCi0JKG9wY29kZXNfaW5pdGlhbGl6ZWQpOiBSZW5hbWVkIGZyb20gb3Bjb2Rlc19zb3J0ZWQuCi0JKGJ1aWxkX2hhc2hfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKGlzX2RlbGF5ZWRfYnJhbmNoKTogVXNlIGhhc2ggdGFibGUuCi0JKHByaW50X2luc24pOiBSZW5hbWVkIGZyb20gcHJpbnRfaW5zbl9zcGFyYywgbWFkZSBzdGF0aWMuCi0JQnVpbGQgYW5kIHVzZSBoYXNoIHRhYmxlLiAgSWYgIXNwYXJjNjQsIGlnbm9yZSBzcGFyYzY0IGluc25zLAotCWFuZCB2aWNlLXZlcnNhIGlmIHNwYXJjNjQuCi0JKHByaW50X2luc25fc3BhcmMsIHByaW50X2luc25fc3BhcmM2NCk6IE5ldyBmdW5jdGlvbnMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IE1vdmUgc3BhcmM2NCBvcGNvZGVzIHRvIGVuZC4KLQlQcmludCBjb21tdXRhdGl2ZSBpbnNucyB3aXRoIGNvbnN0YW50IHNlY29uZC4KLQkqIHNwYXJjLW9wYy5jIChhbGwgbm9uLXY5IGluc25zKTogVXNlIGZsYWcgRl9OT1RWOSBpbnN0ZWFkIG9mIEZfQUxJQVMuCi0KLVR1ZSBBdWcgIDEgMDA6MTI6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGRzbG90LiAgVXNlCi0JcHJpbnRfYWRkcmVzc19mdW5jIGZvciBBX0JESVNQMTIgYW5kIEFfQkRJU1A4LiAgQ29ycmVjdCB0ZXN0IHdoaWNoCi0JYXZvaWRzIHByaW50aW5nIGEgZGVsYXkgc2xvdCBpbiBhIGRlbGF5IHNsb3QuCi0JKiBzaC1vcGMuaCAoc2hfdGFibGUpOiBGdWxseSBicmFja2V0IGxhc3QgZW50cnkuCi0KLU1vbiBKdWwgMzEgMTI6MDQ6NDcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNsbHgsIHNyYXgsIHNybHgpOiBGaXggZGlzYXNzZW1ibHkuCi0KLVdlZCBKdWwgMTIgMDA6NTk6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3RfbWFrZWZpbGVfZnJhZyBmcm9tICR7c3JjZGlyfS4KLQotCSogY29uZmlndXJlLmluOiBBdXRvY29uZmlzY2F0ZWQuICBDaGVjayBmb3Igc3RyaW5nW3NdLmguICBDcmVhdGUKLQljb25maWcuaCBmcm9tIGNvbmZpZy5pbi4gIERvbid0IHNldCB1cCBzeXNkZXAuaCBsaW5rLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGF1dG9jb25mLXN0eWxlLgotCShkaXN0Y2xlYW4pOiBLZWVwIHN5c2RlcC5oLiAgUmVtb3ZlIGNvbmZpZy5sb2cgYW5kIGNvbmZpZy5jYWNoZS4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyBydWxlLgotCSogY29uZmlndXJlLmJhdDogVXBkYXRlIE1ha2VmaWxlIHN1YnN0aXR1dGlvbnMuCi0KLVR1ZSBKdWwgMTEgMTQ6MjM6MzcgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKEwxKTogRGVmaW5lLgotCShtaXBzX29wY29kZXMpOiBBZGQgUjQwMTAgaW5zdHJ1Y3Rpb25zOiBmbHVzaGksIGZsdXNoZCwgZmx1c2hpZCwKLQlhZGRjaXUsIG1hZGQsIG1hZGR1LCBmZmMsIGZmcywgbXN1YiwgbXN1YnUsIHNlbHNpLCBzZWxzciwgd2FpdGksCi0JYW5kIHdiLgotCi1UdWUgSnVsIDExIDExOjQ5OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogRm9yIHRoZSBtb3ZlIHBzZXVkby1vcCwgcHJlZmVyIGRhZGR1Ci0JaWYgSVNBIDMgYW5kIGFkZHUgb3RoZXJ3aXNlLCByZXBsYWNpbmcgb3IsIHNpbmNlIHNvbWUgTUlQUyBjaGlwcwotCWhhdmUgbXVsdGlwbGUgYWRkIHVuaXRzIGJ1dCBvbmx5IGEgc2luZ2xlIGxvZ2ljYWwgdW5pdC4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogQ2hhbmdlIENSIHRvIHVzZSBhIGJpdHNpemUgb2YgMywKLQlzaGlmdGVkIGJ5IDE4LCB3aXRob3V0IGFueSBpbnNlcnRpb24gb3IgZXh0cmFjdGlvbiBmdW5jdGlvbi4KLQkoaW5zZXJ0X2NyLCBleHRyYWN0X2NyKTogUmVtb3ZlLgotCi1XZWQgSnVuIDIxIDIwOjA1OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnLCBwcmludF9pbmRleGVkKTogUHJpbnQgIiUiIGJlZm9yZQotCXJlZ2lzdGVyIG5hbWVzLgotCi1UaHUgSnVuIDE1IDE3OjIzOjMxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIHNoIGFuZCBpMzg2IGNvbmZpZ3MsIHJlbW92ZSBzcGFyYyBjb25maWcuCi0JKiBzaC1vcGMuaDogQWRkIGNvcHlyaWdodC4KLQotTW9uIEp1biAgNSAwMzozMDo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcnVuY2gtbTY4ayk6IERlbGV0ZSBleHRyYSB0YXJnZXQgYWNjaWRlbnRhbGx5Ci0JY2hlY2tlZCBpbiBhIHdoaWxlIGFnby4KLQotV2VkIE1heSAyNCAxNjoyMjoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IEFkZCBTSDMgc3VwcG9ydC4KLQotV2VkIE1heSAyNCAxNDoxNjowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkZWQgYnNyZiBhbmQgYnJhZi4KLQotV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYXJtLW9wYy5oIChhcm1fb3Bjb2Rlcyk6IEFkZCA2NC1iaXQgbXVsdGlwbHkgcGF0dGVybnMuICBEZWxldGUKLQlib2d1cyBbbHNdZm17ZWEsZmR9IHBhdHRlcm5zLgotCi0JKiBhcm0tb3BjLmggKGFybV9vcGNvZGVzKTogQ29ycmVjdCB0eXBvcyBpbiBzdG0sIGxkbSwgc3RkLCBhbmQgbGRjLgotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IE1ha2UgR0lWRU4gYSBwYXJhbWV0ZXIsIGRvbid0IHRyeSBhbmQKLQlpbml0aWFsaXplIGl0IGZyb20gbWVtb3J5LiAgTWFrZSBmdW5jdGlvbiBzdGF0aWMuCi0JKHByaW50X2luc25fe2JpZyxsaXR0bGV9X2FybSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIsIGNhc2UgYmZkX2FyY2hfYXJtKTogRGlzYXNzZW1ibGUgZm9yCi0JdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4KLQotTW9uIEFwciAyNCAxNDoxODowNSAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSwgc2hfYXJnX3R5cGUpOiByZW1vdmUgdHJhaWxpbmcgLCBmcm9tCi0JZW51bSBsaXN0LgotCi1XZWQgQXByIDE5IDE0OjA3OjAzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogRmluaXNoIGNoYW5nZSBtYWRlIGJ5IEt1bmcgSHN1IG9uIEFwcmlsCi0JMTd0aCwgc28gdGhhdCBpdCBidWlsZHMgYWdhaW4gdXNpbmcgR0NDIGFzIHRoZSBjb21waWxlci4KLQotVHVlIEFwciAxOCAxMjoxNDo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9taXBzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWJmZF9nZXRsMzIgZnJvbSBiZmRfdm1hIHRvIHVuc2lnbmVkIGxvbmcsIGJlY2F1c2UgX3ByaW50X2luc25fbWlwcwotCWV4cGVjdHMgYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoYXQgbWlnaHQgYmUgZmV3ZXIgd29yZHMgb2YKLQlhcmd1bWVudCBzdG9yYWdlIChlLmcuLCBpZiBiZmRfdm1hIGlzIGxvbmcgbG9uZyBvbiBhIDMyLWJpdAotCW1hY2hpbmUpLgotCShwcmludF9pbnNuX2JpZ19taXBzKTogTGlrZXdpc2Ugd2l0aCBiZmRfZ2V0YjMyIHZhbHVlLgotCShfcHJpbnRfaW5zbl9taXBzKTogTm93IHN0YXRpYy4KLQotTW9uIEFwciAxNyAxMjoyMzoyOCAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmM6IFRha2Ugb3V0ICNkZWZpbmUgQlJFQUtfVVBfQklHX0RFQ0wga2x1ZGdlLCBiZWNhdXNlCi0JZ2NjIG1lbW9yeSBob2cgcHJvYmxlbSB3aXRoIGluaXRpYWxpemVyIGlzIGZpeGVkLgotCi1Nb24gQXByIDEwIDE1OjU1OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW4gKGFyY2huYW1lKTogQ29tcHV0ZSBmcm9tIHRoZSBjb25maWcuCi0JKEJGRF9NQUNISU5FUywgQVJDSERFRlMpOiBQdXQgaW50byBtay50bXAuCi0KLQkqIG1wdy1jb25maWcuaW4gKHRhcmdldF9hcmNoKTogQ29tcHV0ZSBmcm9tIGNhbm9uaWNhbCB0YXJnZXQuCi0JKG02OGssIG1pcHMsIHBvd2VycGMsIHNwYXJjKTogQWRkIGFyY2hpdGVjdHVyZXMuCi0JKiBtcHctbWFrZS5pbiAoZGlzYXNzZW1ibGUuYy5vKTogQWRkLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlIHNwZWNpYWwgZmxhZ3MgKC1tYzY4MDIwIC1tYzY4ODgxIC1tb2RlbCBmYXIpLgotCi0JKiBtcHctY29uZmlnLmluIChCRkRfTUFDSElORVMpOiBTZXQgdG8gYSBkZWZhdWx0IHZhbHVlLgotCSogbXB3LW1ha2UuaW4gKEJGRF9NQUNISU5FUyk6IFJlbW92ZSB3aXJlZC1pbiB2YWx1ZS4KLQotCSogbXB3LW1ha2UuaW4gKENTRUFSQ0gpOiBBZGQgZXh0cmEtaW5jbHVkZSB0byBzZWFyY2ggcGF0aC4KLQotCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oKTogRG9uJ3QgY3JlYXRlLgotCShzeXNkZXAuaCk6IENyZWF0ZSB1c2luZyBmb3J3YXJkLWluY2x1ZGUuCi0JKiBtcHctbWFrZS5pbiAoQ1NFQVJDSCk6IEFkZCBpbmNsdWRlL21wdyB0byBzZWFyY2ggcGF0aC4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0KLUZyaSBNYXIgMzEgMTQ6MjM6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBQdXQgZW1wdHkgc3RhdGVtZW50IGFmdGVyCi0JZGVmYXVsdCBsYWJlbC4KLQotVHVlIE1hciAyMSAxMDo1MTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAoc2lnbl9leHRlbmQpOiBEZWxldGUsIHJlZHVuZGFudCB3aXRoIGxpYmhwcGEuaCB2ZXJzaW9uLgotCShsb3dfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQkoZ2V0X2ZpZWxkKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkoc2V0X2ZpZWxkLCBkZXBvc2l0XzE0LCBkZXBvc2l0XzIxKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMTcgMTU6NTU6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBTdXBwb3J0IGZvciBtb3JlIHBlbnRpdW0gb3Bjb2Rlcy4gIEZyb20gR3V5IEhhcnJpcwotCSAgKGd1eUBuZXRhcHAuY29tKS4KLQotVHVlIE1hciAxNCAwMDo1Mjo1NyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCVNhdCBGZWIgMTEgMTc6MjI6NDEgMTk5NSAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBkaWR5bXVzLnJtaS5kZSkKLQotCSogYWxwaGEtb3BjLmggKE9TRl9BU01DT0RFKTogZGVmaW5lCi0JcHJpbnQgcGFsLWNvZGUgbmFtZXMgYXMgZGVmaW5lZCBpbiBBcHAgQyBvZiB0aGUKLQlBbHBoYSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbAotCi0JKiBhbHBoYS1kaXMuYzogY2xlYW5lZCB1cCBvdXRwdXQKLQlwcmludCBzdHlsaXplZCBjb2RlIGZvcm1zIGFzIGRlZmluZWQgaW4gQXBwIEEuNC4zIG9mIHRoZQotCUFscGhhIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsCi0KLVdlZCBNYXIgIDggMTU6MjE6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgbmV3IG1pcHM0IGluc3RydWN0aW9ucy4gIERvbid0IHNldCBJTlNOX1JGRSBmb3IKLQlgcmZlJy4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyBhcmd1bWVudCB0eXBlcyAnaCcsICdSJywKLQknTicsIGFuZCAnTScuCi0KLVdlZCBNYXIgIDggMDI6NTQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyBhZGRyZXNzIG9mIG9wY29kZQotCXRhYmxlIGVudHJ5IGdpdmVuIGluZGV4LCBldmVuIGlmIHRoZSBvcGNvZGUgdGFibGUgd2FzIHNwbGl0IHRvCi0Jd29yayBhcm91bmQgZ2NjIGJ1Z3MuCi0JKHByaW50X2luc25fbTY4ayk6IENhbGwgb3Bjb2RlIGluc3RlYWQgb2YgcmVmZXJlbmNpbmcgbTY4a19vcGNvZGVzCi0JZGlyZWN0bHkuCi0JKEJSRUFLX1VQX0JJR19ERUNMKTogTWFrZSBzZWNvbmRhcnkgYXJyYXkgc3RhdGljIGFuZCBjb25zdC4KLQkocmVnX25hbWVzKTogTm93IGNvbnN0LgotCShwcmludF9pbnNuX2FyZyk6IEFycmF5cyBjYWNoZUZpZWxkTmFtZSBhbmQgbmFtZXMgbm93IGNvbnN0LgotCShwcmludF9pbmRleGVkKTogQXJyYXkgc2NhbGVzIG5vdyBjb25zdC4KLQotVHVlIE1hciAgNyAxNjo0MToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogU29ydCByZWNlbnRseSBhZGRlZCBpbnN0cnVjdGlvbnMgYnkgbWlub3Igb3Bjb2RlCi0JbnVtYmVyIHdpdGhpbiBtYWpvciBvcGNvZGUgbnVtYmVyLgotCi1Nb24gTWFyICA2IDEwOjA0OjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotRnJpIEZlYiAyNCAxOToxNTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSBkbGkgdG8gdXNlIE1fRExJLCBhbmQgYWRkIGRsYS4KLQotTW9uIEZlYiAyMCAyMzo1NDozOCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIHc2NS1kaXMuby4KLQotVGh1IEZlYiAxNiAxNzozNDo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCByNDY1MCBtdWwgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBGZWIgMTUgMTU6NDU6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgdWxkIGFuZCB1c2QgbWFjcm9zIGZvciB1bmFsaWduZWQgZG91YmxlIGxvYWQgYW5kCi0gICAgICAgIHN0b3JlLgotCi1UdWUgRmViIDE0IDEzOjE3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgNDAzR0Egb3Bjb2RlcyByZmNpLCBkY2NjaSwKLQltZmRjciwgbXRkY3IsIGljYnQsIGljY2NpLgotCi1UaHUgRmViICA5IDEyOjI4OjEzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoc3RydWN0IHRhYmVudCwgc3RydWN0IHNwYXJzZV90YWJlbnQpOiBDaGFuZ2UgdGhlCi0gICAgICAgIHNpZ25lZCBjaGFyIGZpZWxkcyB0byBzaG9ydHMsIG1vcmUgcG9ydGFibGUuCi0KLVdlZCBGZWIgIDggMTc6Mjk6MjkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChzdHJ1Y3QgdGFiZW50LCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IERlY2xhcmUgdGhlCi0gICAgICAgIGNoYXIgZmllbGRzIGFzIHNpZ25lZCBjaGFycywgc2luY2UgdGhleSBtYXkgaGF2ZSBuZWdhdGl2ZSB2YWx1ZXMuCi0KLU1vbiBGZWIgIDYgMTA6NTI6MDYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfdHdvYnl0ZSk6IEFkZCBjcHVpZCwgRnJvbSBDaGFybGVzIEhhbm51bQotCSAgKG15Y3JvZnRAbmV0YnNkLm9yZykuCi0KLU1vbiBKYW4gMzAgMTI6Mzg6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSAiTG9nZywgRWQiIDxlbG9nZ0BlYS5jb20+OgotCSogcHBjLW9wYy5jIChleHRyYWN0X2JkbSk6IENvcnJlY3QgcGFyZW50aGV6aXNhdGlvbi4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogUHJpbnQgLmxvbmcgYmVmb3JlIHVucmVjb2duaXplZAotCXZhbHVlLgotCi1UaHUgSmFuIDI2IDE4OjMyOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBDaGFuZ2VzIGJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4KLQk8ZWRlbHNvaG5AbWhwY2MuZWR1Pi4KLQkocG93ZXJwY19vcGVyYW5kcyk6IEFkZCBvcGVyYW5kcyBTUFJCQVQgYW5kIFNQUkcuIFNwbGl0IFRCUiBvdXQgb2YKLQlTUFIuCi0JKEZYTV9NQVNLKTogRGVmaW5lLgotCShpbnNlcnRfdGJyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZXh0cmFjdF90YnIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShYRlhGWE1fTUFTSywgWEZYTSk6IERlZmluZS4KLQkoWFNQUkJBVF9NQVNLLCBYU1BSR19NQVNLKTogRGVmaW5lLgotCShwb3dlcnBjX29wY29kZXMpOiBBZGQgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyBzcGVjaWFsIHJlZ2lzdGVycyBieQotCW5hbWUuICBBZGQgbXRjciBhbmQgbWZ0YnUuCi0KLVR1ZSBKYW4gMTcgMTA6NTY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChQMyk6IERlZmluZS4KLQkobWlwc19vcGNvZGVzKTogQWRkIG1hZCBhbmQgbWFkdS4KLQotU3VuIEphbiAxNSAxNjozMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29uZmlndXJlLmluOiBBZGQgVzY1IHN1cHBvcnQuCi0JKiBkaXNhc3NlbWJsZS5jOiBMaWtld2lzZS4KLQkqIHc2NS1vcGMuaCwgdzY1LWRpcy5jOiBOZXcgZmlsZXMuCi0KLVdlZCBEZWMgMjggMjI6MTU6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciAyIGJpdAotCWltbWVkaWF0ZXMuCi0KLVR1ZSBEZWMgMjAgMTE6MjU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgZGxpIGFzIGEgc3lub255bSBmb3IgbGkuCi0KLVRodSBEZWMgIDggMTg6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBIYW5kbGUgY2FsbF9wYWwgaW5zdHJ1Y3Rpb24sIGFuZAotCXByaW50IHNvbWV0aGluZyBmb3IgcmVzZXJ2ZWQgb3Bjb2RlIHZhbHVlcywgZXZlbiBpZiBpdCB3b24ndAotCWFzc2VtYmxlIGFnYWluLgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogV2hlbiBpbml0aWFsaXppbmcsIHNoaWZ0IHJpZ2h0Ci0JYW5kIG1hc2ssIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIG9uIHRoZSBBbHBoYS4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIGNhc2UgJ0onKTogSGFuZGxlIGJ1c2NyIGFuZCBwY3IKLQljb250cm9sIHJlZ2lzdGVycy4KLQotV2VkIE5vdiAyMyAyMjozNDo1MSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzaC1vcGMuaCAobW92LmwgZ2JyKTogR2V0IGRpcmVjdGlvbiByaWdodC4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9zaGwsIHByaW50X2luc25fc2gpOiBDYWxsIHByaW50X2luc25fc2h4IHRvCi0JcHJpbnQgb3Bjb2RlcyB3aXRoIHJpZ2h0IGJ5dGUgb3JkZXIuCi0KLVRodSBOb3YgIDMgMTk6MzI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbnMzMmstZGlzLmMgKHN0cnVjdCBuczMya19vcHRpb24pOiBSZW5hbWVkIGZyb20gc3RydWN0IG9wdGlvbiwKLQl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBnZXRvcHQuCi0KLU1vbiBPY3QgMzEgMTg6NDg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZWFkIHRoZSBpbnN0cnVjdGlvbiB1c2luZwotCWJmZF9nZXRiMzIsIHNvIHRoYXQgaXQgd29ya3Mgb24gYSBsaXR0bGUgZW5kaWFuIG9yIDY0IGJpdCBob3N0LgotCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgb3AuCi0KLVR1ZSBPY3QgMjUgMTc6MDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBVc2Ugb3IgaW5zdGVhZCBvZiBhZGR1IGZvciBwc2V1ZG8tb3AgbW92ZSwgc2luY2UKLQlhZGR1IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGlmIC1taXBzMy4KLQotV2VkIE9jdCAxOSAxMzo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X3NwZWNpYWwpOiBBZGQgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkCi0Jb24gMjkwMzAsIDI5MDQwIGFuZCAyOTA1MC4KLQkocHJpbnRfaW5zbik6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdJJy4KLQotV2VkIE9jdCAxMiAxMTo1OTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIHRvcCBsZXZlbCBpbnN0YWxsLnNoIHNjcmlwdC4KLQotV2VkIE9jdCAgNSAxOToxNjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jOiBSZXdyaXRlIHRvIHVzZSBiaXRmaWVsZHMsIHJhdGhlciB0aGFuIGEgdW5pb24sIHNvCi0JdGhhdCBpdCB3b3JrcyBvbiBhIGxpdHRsZSBlbmRpYW4gaG9zdC4KLQotVHVlIE9jdCAgNCAxMjoxNDoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotV2VkIFNlcCAyMSAxODo0OToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6ICJkYWJzIiBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIC1taXBzMy4KLQotVGh1IFNlcCAxNSAxNjozMDoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBQcmludCB0aGUgb3Bjb2RlLgotCi1XZWQgU2VwIDE0IDE3OjUyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogU2V0IFdSX3QgZm9yIHNjIGFuZCBzY2QuCi0KLVN1biBTZXAgMTEgMjI6MzI6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHJlZ19uYW1lcyk6IFVzZSByMjYtcjIzIGZvciBhcmcwLWFyZzMuCi0KLVR1ZSBTZXAgIDYgMTE6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgSU5TTl9TVE9SRV9NRU1PUlkgZmxhZyBmb3IgYWxsIGluc3RydWN0aW9ucwotCXdoaWNoIHN0b3JlIGEgdmFsdWUgaW50byBtZW1vcnkuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZGlzYXNzZW1ibGUuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBBUk0uCi0JKiBhcm0tZGlzLmMsIGFybS1vcGMuaDogTmV3IGZpbGVzLgotCi1GcmkgQXVnICA1IDE0OjAwOjA1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG5zMzJrLWRpcy5vKTogQWRkIGRlcGVuZGVuY3kuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlIGluaXRpYWxpemVkIGxvY2FsIGFzCi0Jc3RyaW5nLCBub3QgYXMgYXJyYXkgb2YgY2hhcnMuCi0KLVRodSBKdWwgMjggMTg6MTQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAneCcuCi0KLQkqIHNwYXJjLW9wYy5jOiBBZGRlZCBzcGFyY2xpdGUgZXh0ZW5kZWQgRlAgb3BlcmF0aW9ucywgYW5kCi0JdmVyc2lvbnMgb2YgdjkgaW1wZGVwKiBpbnN0cnVjdGlvbnMgcGVybWl0dGluZyBzcGVjaWZpY2F0aW9uIG9mCi0JdGhlIE9QRiBmaWVsZC4KLQotVHVlIEp1bCAyNiAxNjozNjowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChyZWdfbmFtZXMpOiBOb3cgY29uc3QuCi0JKHN0cnVjdCBzcGFyc2VfdGFiZW50KTogTmV3IHR5cGUsIGNvcGllZCBmcm9tIGFycmF5IHR5cGUgaW4gbWVtCi0JZnVuY3Rpb24uCi0JKGN0cmwpOiBMb2NhbCBzdGF0aWMgYXJyYXkgY3RybF90YWIgbm93IGNvbnN0LgotCShjb2JyKTogTG9jYWwgc3RhdGljIGFycmF5IGNvYnJfdGFiIG5vdyBjb25zdC4KLQkobWVtKTogTG9jYWwgdmFyaWFibGVzIHJlZzEsIHJlZzIsIHJlZzMgbm93IHBvaW50IHRvIGNvbnN0LiAgTG9jYWwKLQlzdGF0aWMgdmFyaWFibGUgbWVtX3RhYiBubyBsb25nZXIgZXhwbGljaXRseSBpbml0aWFsaXplZC4gIENoYW5nZWQKLQltZW1faW5pdCB0byBjb25zdCBhcnJheSBvZiBzdHJ1Y3Qgc3BhcnNlX3RhYmVudC4KLQkocmVnKTogTG9jYWwgc3RhdGljIHZhcmlhYmxlIHJlZ190YWIgbm8gbG9uZ2VyIGV4cGxpY2l0bHkKLQlpbml0aWFsaXplZC4gIENoYW5nZWQgcmVnX2luaXQgdG8gY29uc3QgYXJyYXkgb2Ygc3RydWN0Ci0Jc3BhcnNlX3RhYmVudC4KLQkoZWEpOiBMb2NhbCBzdGF0aWMgYXJyYXkgc2NhbGVfdGFiIG5vdyBjb25zdC4KLQotCSogaTk2MC1kaXMuYyAocmVnKTogQWRkZWQgaTk2MEpYIGluc3RydWN0aW9ucyB0byByZWdfaW5pdCB0YWJsZS4KLQkoUkVHX01BWCk6IFVwZGF0ZWQuCi0KLVR1ZSBKdWwgMTkgMjE6MDA6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB0aGUgZGlzYXNzZW1iZXIgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IKLQkib2JqZHVtcCAtZCIgdG8gd29yayBpbiBkamdwcC4KLQotV2VkIEp1bCAxMyAxODowMTo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBuczMyay1kaXMuYzogRGVsZXRlZCBhbGwgY29kZSBpbiAiI2lmZGVmIEdEQiIuCi0JKGludmFsaWRfZmxvYXQpOiBFbmFibGVkIGdlbmVyYWwgdmVyc2lvbiwgZG9lc24ndCByZXF1aXJlIHJ1bm5pbmcKLQlvbiBuczMyayBob3N0LiAgQ2hhbmdlZCB0byB0YWtlIGNoYXIqIGFyZ3VtZW50LCBhbmQgdGVzdCBmb3IKLQlleHBsaWNpdGx5IHNwZWNpZmllZCBzaXplcywgaW5zdGVhZCBvZiB1c2luZyBzaXplb2YoKSBvbiBob3N0IENQVQotCXR5cGVzLgotCShJTlZBTElEX0ZMT0FUKTogQ2FzdCBmaXJzdCBhcmd1bWVudC4KLQkob3B0X3UsIG9wdF9VLCBvcHRfTywgb3B0X0MsIG9wdF9TLCBsaXN0X1A1MzIsIGxpc3RfTTUzMiwKLQlsaXN0X1AwMzIsIGxpc3RfTTAzMik6IE5vdyBjb25zdC4KLQkob3B0bGlzdCwgbGlzdF9zZWFyY2gpOiBNYWRlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBub3cgcG9pbnQgdG8KLQljb25zdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2VkIHN0YXRpYyBhcnJheSBvZiBvbmUtY2hhcmFjdGVyLXN0cmluZwotCXBvaW50ZXJzIGludG8gYSBzdGF0aWMgY29uc3QgYXJyYXkgb2YgY2hhcmFjdGVyczsgZml4ZWQgc3ByaW50ZgotCXN0YXRlbWVudCBhY2NvcmRpbmdseS4KLQotU3VuIEp1bCAxMCAwMDoyNzo0NyAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogb3Bjb2Rlcy9uczMyay1kaXMuYzogU2VtaS1uZXcgZmlsZS4gIEhhZCBhcHBhcmVudGx5IGJlZW4gZHJvcHBlZAotCWZyb20gZGlzdHJpYnV0aW9uLiBBIG5zMzJrLWRpcy5jIGZyb20gYSBwcmV2aW91cyBkaXN0cmlidXRpb24gaGFzCi0JYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgYW5kIHN1cHBvcnRzIHRoZSBuZXcgaW50ZXJmYWNlLgotCi0JKiBkaXNhc3NlbWJsZS5jOiBkZWZpbmUgQVJDSF9uczMyayBhbmQgYWRkIGNhc2UgYmZkX2FyY2hfbnMzMmsuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGJmZF9uczMya19hcmNoIHRhcmdldCBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIG5zMzJrLWRpcy5vIHRvIEFMTF9NQUNISU5FUy4KLQlBZGQgbnMzMmstZGlzLmMgdG8gQ0ZJTEVTLiBBZGQgZGVwZW5kZW5jaWVzIGZvciBuczMyay1kaXMuby4KLQotV2VkIEp1biAyOSAyMjoxMDozNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogR2V0IDE2Yml0IGJyYW5jaAotCWRpc2Fzc2VtYmx5IHJpZ2h0LgotCi1UdWUgSnVuIDI4IDEzOjIyOjA2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMsIG1pcHMtZGlzLmM6IERvbid0IHVzZSB0cnVlIGFuZCBmYWxzZS4KLQotVGh1IEp1biAyMyAxMjo1MzoxOSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVdlZCBKdW4gMjIgMTM6Mzg6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogQnVpbGQgYSBzdGF0aWMgaGFzaCB0YWJsZSBtYXBwaW5nCi0Jb3Bjb2RlcyB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2l0aCB0aGF0IG9wY29kZSwgdG8gc3BlZWQKLQlkaXNhc3NlbWJseSBvZiBsYXJnZSBmaWxlcy4gIEZyb20gcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaAotCUNhbXBiZWxsKS4KLQotVHVlIEp1biAgNyAxMjo0OTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IEZpeCB0eXBvICh3YXMgbW9zdHljbGVhbikuCi0KLVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0KLVNhdCBNYXkgIDcgMTc6MTM6MjEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFByaW50ICd4JyB0eXBlIG9wZXJhbmQgaW4gaGV4LgotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFByaW50IDE2Yml0IHJlbHMgY29ycmVjdGx5LgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2gpOiBEb24ndCByZWN1ciBlbmRsZXNzbHkgaWYgZGVsYXkKLQlzbG90IGluc24gaXMgaW4gYSBkZWxheSBzbG90LgotCSogejhrLW9wYy5oOiAocmVzZmxnKTogRml4IHBhdHRlcm5zLgotCSogaDg1MDAtb3BjLmggRml4IENSIGluc24gcGF0dGVybnMuCi0KLUZyaSBNYXkgIDYgMTQ6MzQ6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IFB1dCBQb3dlclBDIHZlcnNpb25zIG9mICJjbXAiIGFuZAotCSJjbXBsIiBiZWZvcmUgUE9XRVIgdmVyc2lvbnMsIHNvIHRoYXQgZ2FzIC1tYW55IHVzZXMgdGhlbS4KLQotVGh1IEFwciAyOCAxODozMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkaXNhc3NlbWJsZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBBZGQgZGlzYXNzZW1ibGUuby4KLQkoZGlzYXNzZW1ibGUubyk6IFByb3ZpZGUgZGVwZW5kZW5jaWVzOyBjb21waWxlIHdpdGggJChBUkNIREVGUykuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBBUkNIREVGUyBpbiBNYWtlZmlsZS4gIENvZGUgdGFrZW4gZnJvbQotCWJpbnV0aWxzL2NvbmZpZ3VyZS5pbi4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogSWYgRl9BTElBUyBmbGFnIGlzIHNldCwgc2tpcCB0aGUKLQlvcGNvZGUgYmVpbmcgZXhhbWluZWQuCi0KLVRodSBBcHIgMjEgMTc6MDg6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBBZGRlZCBSQUwsIFJBTSBhbmQgUkFTLgotCShpbnNlcnRfcmFsLCBpbnNlcnRfcmFtLCBpbnNlcnRfcmFzKTogTmV3IGZ1bmN0aW9ucy4KLQkocG93ZXJwY19vcGNvZGVzKTogVXNlIFJBTCBmb3IgbG9hZCB3aXRoIHVwZGF0ZSwgUkFNIGZvciBsbXcsIGFuZAotCVJBUyBmb3Igc3RvcmUgd2l0aCB1cGRhdGUuCi0KLVNhdCBBcHIgMTYgMjM6NDE6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IENvcnJlY3QgZmNpci4gIEZyb20gRGF2aWQgRWRlbHNvaG4KLQkoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KLQotV2VkIEFwciAgNiAxNzoxMTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IENvcnJlY3Qgb3BlcmFuZHMgb2YgIm5vciIgd2l0aCBhbgotCWltbWVkaWF0ZSBhcmd1bWVudC4KLQotTW9uIEFwciAgNCAxNjozMDo0NiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCAicmQgJWZwcnMsJWwwIi4KLQotTW9uIEFwciAgNCAxMzoyMjowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IFRoZSBzaWduZWRwIGZpZWxkIGhhcyBiZWVuCi0JcmVtb3ZlZCwgc28gZG9uJ3QgaW5pdGlhbGl6ZSBpdC4gIFNldCB0aGUgUFBDX09QRVJBTkRfU0lHTkVEIGZsYWcKLQlpbnN0ZWFkLiAgQWRkIG5ldyBvcGVyYW5kIFNJU0lHTk9QVC4KLQkocG93ZXJwY19vcGNvZGVzKTogRm9yIGxpcywgbGl1LCBhZGRpcywgYW5kIGNhdSB1c2UgU0lTSUdOT1BULgotCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRCByYXRoZXIKLQl0aGFuIHNpZ25lZHAgZmllbGQuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpMzg2LWRpcy5jIChzdHJ1Y3QgcHJpdmF0ZSk6ICBSZW5hbWVkIHRvIGRpc19wcml2YXRlLiBgcHJpdmF0ZScKLQlpcyBhIHJlc2VydmVkIHdvcmQgZm9yIGR5bml4IGNjLgotCi1Nb24gTWFyIDI4IDEzOjAwOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byByZWZlciB0byBiZmQvY29uZmlnLmJmZAotCXJhdGhlciB0aGFuIGJmZC9jb25maWd1cmUuaW4uCi0KLU1vbiBNYXIgMjggMTI6Mjg6MzAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCi0KLQkqIHBwYy1vcGMuYzogRGVmaW5lIFBPV0VSMiBhcyBzaG9ydCBhbGlhcyBmbGFnLgotCShwb3dlcnBjX29wY29kZXMpOiBBZGQgUE9XRVIvMiBvcGNvZGVzIGxmcSosIHN0ZnEqLCBmY2lyW3pdLCBhbmQKLQlmc3FydC4KLQotV2VkIE1hciAyMyAxMjoyMzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IERvbid0IHJlYWQgYSBzZWNvbmQgd29yZCBmb3IKLQlvcGNvZGVzIDAsIDEsIDIgYW5kIDMuCi0KLVdlZCBNYXIgMTYgMTU6Mzc6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG02ODg4MS1leHQubyBmb3IgYmZkX202OGtfYXJjaC4KLQotTW9uIE1hciAxNCAxNDo1Mzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02ODg4MS1leHQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotCSogbTY4ay1kaXMuYyAoZXh0X2Zvcm1hdF82ODg4MSk6IERvbid0IGRlY2xhcmUuCi0JKHByaW50X2luc25fbTY4ayk6IElmIGFuIGluc3RydWN0aW9uIHVzZXMgcGxhY2UgJ2knLCBpdCB1c2VzIGF0Ci0JbGVhc3QgZm91ciBmaXhlZCBieXRlcy4KLQkocHJpbnRfaW5zbl9hcmcpOiBEb24ndCBidW1wIHAgYnkgMiBmb3IgY2FzZSAnSScsIHBsYWNlICdpJy4gIEZvcgotCWV4dGVuZGVkIGZsb2F0LCBjb252ZXJ0IHRvIGRvdWJsZSB1c2luZyBmbG9hdGZvcm1hdF90b19kb3VibGUsIG5vdAotCWllZWVfZXh0ZW5kZWRfdG9fZG91YmxlLCBhbmQgZmV0Y2ggdGhlIGRhdGEgYmVmb3JlIGNvbnZlcnRpbmcgaXQuCi0KLVR1ZSBNYXIgIDggMTg6MTI6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBJdCdzIHNxcnQucywgbm90IHNxcnQudy4gIEZyb20KLQlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pLgotCi1UdWUgRmViICA4IDE2OjU1OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBUaGUgUE9XRVIgdXNlcyBiZG5bbF1bYV0gd2hlcmUgdGhlCi0JUG93ZXJQQyB1c2VzIGJkbnpbbF1bYV0uCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBkaXMtYnVmLmMsIGkzODYtZGlzLmM6ICBJbmNsdWRlIHN5c2RlcC5oLgotCi1Nb24gRmViICA3IDE5OjIyOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChiZmRfcG93ZXJwY19hcmNoKTogVXNlIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vLgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IE1hcmsgUE9XRVIgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZAotCWJ5IE1vdG9yb2xhIFBvd2VyUEMgNjAxIHdpdGggUFBDX09QQ09ERV82MDEuCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMpOgotCURpc2Fzc2VtYmxlIE1vdG9yb2xhIFBvd2VyUEMgNjAxIGluc3RydWN0aW9ucyBhcyB3ZWxsIGFzIG5vcm1hbAotCVBvd2VyUEMgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gRmViICA2IDA3OjQ1OjE3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChyZWcsIG1lbSk6IEp1c3QgdXNlIGEgc3RhdGljIGFycmF5IGluc3RlYWQgb2YKLQljYWxsaW5nIHhtYWxsb2MuCi0KLVNhdCBGZWIgIDUgMDA6MDQ6MDIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEZvciAnPycgYW5kICdAJyBvbmx5IGFkanVzdCB0aGUKLQljb25kaXRpb24gbmFtZSBpbmRleCBpZiB0aGlzIGlzIGZvciBhIG5lZ2F0ZWQgY29uZGl0aW9uLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBObyBzcGFjZSBiZWZvcmUgJ0gnIG9wZXJhbmQuCi0JRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGZvciAnSCcgb3BlcmFuZCBpcyBiYWNrd2FyZHMgZnJvbSBub3JtYWwKLQljYXNlICgwID09IGRvdWJsZSwgMSA9PSBzaW5nbGUpLiAgRm9yICc0JywgJzYnLCAnNycsICc5JywgYW5kICc4JwotCW9wZXJhbmRzIChmbXB5YWRkIGFuZCBmbXB5c3ViKSwgaGFuZGxlIGJpemFycmUgcmVnaXN0ZXIKLQl0cmFuc2xhdGlvbiBjb3JyZWN0bHkgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm9ybWF0LgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBEbyBub3QgZW1pdCBhIHNwYWNlIGFmdGVyICdGJwotCW9yICdJJyBvcGVyYW5kcyBpZiB0aGUgbmV4dCBmb3JtYXQgc3BlY2lmaWVyIGlzICdNJyAoZmNtcAotCWNvbmRpdGlvbiBjb21wbGV0ZXIpLgotCi1GZWIgIDQgMjM6Mzg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBOZXcgb3BlcmFuZCB0eXBlIE1CRSB0byBoYW5kbGUgYQotCXNpbmdsZSBudW1iZXIgZ2l2aW5nIGEgYml0bWFzayBmb3IgdGhlIE1CIGFuZCBNRSBmaWVsZHMgb2YgYW4gTQotCWZvcm0gaW5zdHJ1Y3Rpb24uICBDaGFuZ2UgTkIgdG8gYWNjZXB0IDMyLCBhbmQgdHVybiBpdCBpbnRvIDA7Ci0JYWxzbyB0dXJuIDAgaW50byAzMiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBTZXBlcmF0ZWQgU0ggZnJvbSBOQi4KLQkoaW5zZXJ0X21iZSwgZXh0cmFjdF9tYmUpOiBOZXcgZnVuY3Rpb25zLgotCShpbnNlcnRfbmIsIGV4dHJhY3RfbmIpOiBOZXcgZnVuY3Rpb25zLgotCShTQ19NQVNLKTogTWFzayBvdXQgU0EgYW5kIExLIGJpdHMuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IENoYW5nZSAiY2FsIiB0byB1c2UgUlQsIEQsIFJBIHJhdGhlciB0aGFuIFJULAotCVJBLCBTSS4gIENoYW5nZSAibGl1IiBhbmQgImNhdSIgdG8gdXNlIFVJIHJhdGhlciB0aGFuIFNJLiAgTWFyawotCSJiY3RyIiBhbmQgImJjdHJsIiBhcyBhY2NlcHRlZCBieSBQT1dFUi4gIENoYW5nZSAicmx3aW1pIiwKLQkicmxpbWkiLCAicmx3aW1pLiIsICJybGltaS4iLCAicmx3aW5tIiwgInJsaW5tIiwgInJsd2lubS4iLAotCSJybGlubS4iLCAicmxtaSIsICJybG1pLiIsICJybHdubSIsICJybG5tIiwgInJsd25tLiIsICJybG5tLiIgdG8KLQl1c2UgTUJFIHJhdGhlciB0aGFuIE1CLiAgQWRkICJtZm1xIiBhbmQgIm10bXEiIFBPV0VSIGluc3RydWN0aW9ucy4KLQkocG93ZXJwY19tYWNyb3MpOiBEZWZpbmUgdGFibGUgb2YgbWFjcm8gZGVmaW5pdGlvbnMuCi0JKHBvd2VycGNfbnVtX21hY3Jvcyk6IERlZmluZS4KLQotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBEb24ndCBza2lwIG9wdGlvbmFsIG9wZXJhbmRzCi0JaWYgUFBDX09QRVJBTkRfTkVYVCBpcyBzZXQuCi0KLVNhdCBKYW4gMjIgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBNYWtlIGJ1ZmZlciBiZmRfYnl0ZSBpbnN0ZWFkIG9mCi0JY2hhci4gIFJldHJpZXZlIGNvbnRlbnRzIHVzaW5nIGJmZF9nZXRsMzIgaW5zdGVhZCBvZiBzaGlmdGluZy4KLQotRnJpIEphbiAyMSAxOTowMTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYzogTmV3IGZpbGUuICBPcGNvZGUgdGFibGUgZm9yIFBvd2VyUEMsIGluY2x1ZGluZwotCW9wY29kZXMgZm9yIFBPV0VSIChSUy82MDAwKS4KLQkqIHBwYy1kaXMuYzogTmV3IGZpbGUuICBQb3dlclBDIGFuZCBQb3dlciAoUlMvNjAwMCkgZGlzYXNzZW1ibGVyLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBwcGMtZGlzLm8gYW5kIHBwYy1vcGMuby4KLQkoQ0ZJTEVTKTogQWRkIHBwYy1kaXMuYy4KLQkocHBjLWRpcy5vLCBwcGMtb3BjLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8gZm9yIGJmZF9yczYwMDBfYXJjaC4KLQotTW9uIEphbiAxNyAyMDowNTo0OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdOJyBpbiBhc3NlbWJsZXIgdGVtcGxhdGUuCi0JTm8gc3BhY2UgYmVmb3JlICd1JywgJ2YnLCBvciAnTicuCi0KLVN1biBKYW4gMTYgMTQ6MjA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFkZCBGSVhNRSBjb21tZW50IHJlZ2FyZGluZyByZWFkaW5nCi0JZmFydGhlciB0aGFuIHdlIHNob3VsZC4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogVXNlIFliIGFuZCBZdiBmb3Igc2Nhc2IgYW5kIHNjYXNTLgotCi1UaHUgSmFuICA2IDEyOjM4OjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgbTY4ay1kaXMuYyBhbHBoYS1kaXMuYyBhMjlrLWRpcy5jOiBGaXggY29tbWVudHMuCi0KLVdlZCBKYW4gIDUgMTE6NTY6MjEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBPbmx5IHJlYWQgd29yZDIgaWYgdGhlIGluc3RydWN0aW9uCi0JbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLgotCi1XZWQgTm92IDE3IDE3OjIwOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuaDogVXNlIG1hY3JvIGZvciBqIGluc3RydWN0aW9uLCB0byBzdXBwb3J0IFNWUjQgUElDLgotCVJlbW92ZWQgdCxBIGNhc2UgZm9yIGxhOyBhbHdheXMgdXNlIHQsQShiKSBjYXNlLgotCi1Nb24gTm92ICA4IDEyOjM3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUZyb20gVGVkIExlbWVuIDxtZWxsb25AcGVwcGVyLm5jZC5jb20+Ci0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnaycuCi0JKiBtaXBzLW9wYy5jOiBNYWtlIGNhY2hlIHVzZSBrLCBub3QgdC4KLQotU3VuIE5vdiAgNyAyMzo1MjozNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLW9wYy5oLCBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQKLQlGTE9BVF9NRU1PUllfRk9STUFUX0NPREUsIEZMT0FUX0JSQU5DSF9GT1JNQVRfQ09ERSwgY29ycmVjdAotCUZMT0FUX0ZPUk1BVF9DT0RFIHRvIHB1dCBvdXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZXMuCi0KLU1vbiBOb3YgIDEgMTg6MTc6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBVc2UgbWFjcm9zIGZvciBqYWwgdmFyaWFudHMsIHRvIHN1cHBvcnQgU1ZSNCBQSUMuCi0KLVRodSBPY3QgMjggMTc6NDI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogVXNlIDB4JTA4eCwgbm90IDB4JTh4LgotCi1XZWQgT2N0IDI3IDExOjQ4OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAoZHNsbCwgZHNyYSwgZHNybCk6IEFkZGVkICc+JyBjYXNlcyBmb3Igc2hpZnQgY291bnRzCi0JbGFyZ2VyIHRoYW4gMzIuICBNb3ZlZCBkc3h4MzIgdmFyaWFudHMgZmlyc3QgZm9yIGRpc2Fzc2VtYmxlci4KLQotTW9uIE9jdCAyNSAxMTozMzoxNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiB6OGtnZW4uYywgejhrLW9wYy5oOiBBZGQgZnVsbCBsZGEgaW5mb3JtYXRpb24uCi0KLVR1ZSBPY3QgMTkgMTI6Mzk6MjUgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0Bjcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRG8gbm90IGVtaXQgYSBzcGFjZSBhZnRlcgotCW1vdmIgaW5zdHJ1Y3Rpb25zLiAgQW55IG5lY2Vzc2FyeSBzcGFjZSB3aWxsIGJlIGVtaXR0ZWQgYnkKLQl0aGUgY29kZSB0byBoYW5kbGUgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXJzLgotCi1XZWQgT2N0IDEzIDE2OjE5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogTW92ZWQgbC5kIGRvd24gc28gdGhhdCBpdCBkaXNhc3NlbWJsZXMgYXMgbGRjMS4KLQotRnJpIE9jdCAgOCAwMjozNDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLW9wYy5oOiAgQWRkIGxkbF9sLCBmaXggdHlwbyBmb3IgbGRxX3UuCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQgY29kZSBmb3IgUEFMX0ZPUk1BVF9DT0RFLgotCi1UdWUgT2N0ICA1IDE3OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQ29ycmVjdCBsd3Ugb3Bjb2RlIHZhbHVlIChib29rIGhhZCBpdCB3cm9uZykuCi0KLVRodSBTZXAgMzAgMTE6MjY6MTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIChGRVRDSF9EQVRBKTogZ2V0IGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhLgotCSh1bnBhY2tfaW5zdHIpOiBDb3BlIHdpdGggQVJHX0lNTTRNMSB0eXBlIGluc3RydWN0aW9ucy4KLQotV2VkIFNlcCAyOSAxNjoyNDo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmMgKG04OGtkaXMpOiBjb21tZW50IGNoYW5nZS4gIFJlbW92ZSBzcGFjZSBhZnRlcgotCSAgcHJpbnRpbmcgbW5lbW9uaWMuCi0JICAocHJpbnRvcCk6IGhhbmRsZSBuZXcgYXJnIHR5cGVzIERFQyBhbmQgWFJFRyBmb3IgbTg4MTEwLgotCi1UdWUgU2VwIDI4IDE5OjIwOjE2IDE5OTMgIEplZmZyZXkgQSBMYXcgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICd6JyBvcGVyYW5kCi0JdHlwZSBmb3IgYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3Nlcy4gIERlbGV0ZSBzcGVjaWFsCi0JImJsZSIgYW5kICJiZSIgY29kZSBpbiAnVycgb3BlcmFuZCBjb2RlLgotCi1GcmkgU2VwIDI0IDE0OjA4OjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IGhhemFyZCBpbmZvcm1hdGlvbiBjb3JyZWN0bHkgZm9yIGJyYW5jaAotCWxpa2VseSBpbnN0cnVjdGlvbnMuCi0KLUZyaSBTZXAgMTcgMDQ6NDE6MTcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSksIGFscGhhLW9wYy5oOiAgRml4IGJ1Z3MsIHVzZQotCWluZm8tPmZwcmludGZfZnVuYyBmb3IgcHJpbnRpbmcgYW5kIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBmb3IKLQlhZGRyZXNzIG91dHB1dC4KLQotV2VkIFNlcCAxNSAxMjoxMjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBJTlNOX1RSQVAgZm9yIHRYWCBpbnN0cnVjdGlvbnMuCi0KLVRodSBTZXAgIDkgMTA6MTE6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JQ29ycmVjdGVkIHNlY29uZCBjYXNlIG9mICJiIiBmb3IgZGlzYXNzZW1ibGVyLgotCi1UdWUgU2VwICA3IDE0OjI1OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYywgbTg4ay1kaXMuYzogRG9uJ3QgaW5jbHVkZSBsaWJiZmQuaC4gIENoYW5nZWQgY2FsbHMKLQl0byBCRkQgc3dhcHBpbmcgcm91dGluZXMgdG8gY29ycmVzcG9uZCB0byBCRkQgbmFtZSBjaGFuZ2VzLgotCi1UaHUgU2VwICAyIDEwOjM1OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uIHRvIGJlIHoscyx0IHJhdGhlcgotCXRoYW4gcyx0LiAgQ2hhbmdlIGRpdiBtYWNybyB0byBiZSBkLHYsdCByYXRoZXIgdGhhbiBkLHMsdC4KLQlMaWtld2lzZSBmb3IgZGl2dSwgZGRpdiwgZGRpdnUuICBBZGRlZCB6LHMsdCBjYXNlIGZvciBkcmVtLCBkcmVtdSwKLQlyZW0gYW5kIHJlbXUgd2hpY2ggZ2VuZXJhdGVzIG9ubHkgdGhlIGNvcnJlc3BvbmRpbmcgZGl2Ci0JaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgYXNzZW1ibGVyLAotCXdoaWNoIG9ubHkgZ2VuZXJhdGVzIHRoZSBzaW1wbGUgbWFjaGluZSBpbnN0cnVjdGlvbiB3aGVuIGFuCi0JZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAgaXMgdXNlZC4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICd6JyAoYWx3YXlzIHJlZ2lzdGVyIHplcm8pLgotCi1UaHUgQXVnIDI2IDE3OjQxOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBTZXQKLQlXUl8zMSBoYXphcmQgZm9yIGJhbCwgYmdlemFsLCBibHR6YWwuCi0KLVRodSBBdWcgMjYgMTc6MjA6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFVzZSBwcmludCBmdW5jdGlvbgotCWZyb20gd2l0aGluIHRoZSBkaXNhc3NlbWJsZV9pbmZvLCBub3QgZnByaW50Zl9maWx0ZXJlZC4KLQotV2VkIEF1ZyAyNSAxMzo1MTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnfCcgbGlrZSAnPicuICAoRnJvbSBKZWZmCi0JTGF3LCBsYXdAY3MudXRhaC5lZHUuKQotCi1Nb24gQXVnIDIzIDEyOjQ0OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAoImFic3UiKTogUmVtb3ZlZC4KLQkoImRhYnMiKTogQWRkZWQuCi0KLUZyaSBBdWcgMjAgMTA6NTI6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCByNjAwMCBhbmQgcjQwMDAgaW5zdHJ1Y3Rpb25zIGFuZCBtYWNyb3MuCi0JQ2hhbmdlZCBoYXphcmQgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZW1vcnkgbG9hZAotCWRlbGF5cyBhbmQgY29wcm9jZXNzb3IgbG9hZCBkZWxheXMuCi0KLVdlZCBBdWcgMTggMTU6Mzk6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBsaS5kIHVzZXMgIlQsTCIsIG5vdCAiUyxGIi4gIEFkZGVkIGxpLnMuCi0KLVR1ZSBBdWcgMTcgMDk6NDQ6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCi0KLVR1ZSBBdWcgMTcgMTI6MjM6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jIChtODhrZGlzKTogTWFrZSBjbGFzcyB1bnNpZ25lZC4KLQotVGh1IEF1ZyAxMiAxNTowODoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogT25lIGJyYW5jaCBmb3JtYXQgY2FzZSB3YXMKLQltaXNzaW5nIHRoZSBpbnN0cnVjdGlvbiBuYW1lLgotCi1XZWQgQXVnIDExIDE5OjI5OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IFJlbmFtZWQgZnJvbSBESVNfTElCUy4KLQlBZGQgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzLgotCShPRklMRVMpOiBSZW1vdmUgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzCi0JYW5kIHVzZSBCRkRfTUFDSElORVMgaW5zdGVhZCBvZiBESVNfTElCUy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBiYXNlZCBvbiAtLXdpdGgtdGFyZ2V0cyBvcHRpb24uCi0KLVRodSBBdWcgMTIgMTI6MDQ6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCBsd2MxIEUsQShiKSB0byBnbyB3aXRoIGx3YzEgVCxBKGIpLiAgU2ltaWxhcmx5Ci0JZm9yIHN3YzEuCi0KLVN1biBBdWcgIDggMTU6MDk6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBDaGFuZ2UgQ09OU1QgdG8gY29uc3QgdG8gZGVhbCB3aXRoIGdjYwotCS1EY29uc3Q9X19jb25zdCAtdHJhZGl0aW9uYWwuCi0KLUZyaSBBdWcgIDYgMTA6NTg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IFRvb2sKLQljb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgb3V0IG9mICNpZiAwLCBhbmQgbWFkZSB0aGVtIHVzZSBuZXcKLQlhcmd1bWVudCB0eXBlICJDIi4KLQotVGh1IEF1ZyAgNSAxNzoxMTowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IEluY2x1ZGUgYW5zaWRlY2wuaCBiZWZvcmUgb3Bjb2Rlcy9zcGFyYy5oLgotCi1GcmkgSnVsIDMwIDE4OjQ4OjE1IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogIEFkZCBGX0pTUiwgRl9VTkJSLCBvciBGX0NPTkRCUiBmbGFncyB0byBlYWNoIGJyYW5jaAotCWluc3RydWN0aW9uLCBmb3IgdXNlIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0KLQkqIHNwYXJjLWRpcy5jIChTRVgpOiAgQWRkIHNpZ24gZXh0ZW5zaW9uIG1hY3JvLiAgUmVwbGFjZSBtYW55Ci0JaGFuZC1jb2RlZCBzaWduIGV4dGVuc2lvbnMgdGhhdCBkZXBlbmRlZCBvbiAzMi1iaXQgaG9zdCBpbnRzLgotCUZJWE1FLCB3ZSBzdGlsbCBkZXBlbmQgb24gYmlnLWVuZGlhbiBob3N0IGJpdGZpZWxkIG9yZGVyaW5nLgotCShzcGFyY19wcmludF9pbnNuKTogIFNldCB0aGUgaW5zbl9pbmZvX3ZhbGlkIGZpZWxkLCBhbmQgdGhlCi0Jb3RoZXIgZmllbGRzIHRoYXQgZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIGJlaW5nIHByaW50ZWQuCi0KLVR1ZSBKdWwgMjcgMTc6MDQ6NTggMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoY2FsbCk6IEFjY2VwdCBhbGwgNiBhZGRyZXNzaW5nIG1vZGVzIHZhbGlkIGZvcgotCWBqbXAnIGluc3RlYWQgb2YganVzdCBvbmUgb2YgdGhlbS4KLQotV2VkIEp1bCAyMSAxMTo0MzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogTW92ZSBmbG9hdGluZyByZWdpc3RlcnMgZnJvbSByZWdfbmFtZXMgdG8gZnBfcmVnX25hbWVzLgotCShmcHV0X2ZwX3JlZ19yKTogUmVuYW1lZCBmcm9tIGZwdXRfcmVnX3IuCi0JKGZwdXRfZnBfcmVnKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9pbnNuX2hwcGEpOiBVc2UgZnB1dF9mcF9yZWd7LF9yfSB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlcyAnYScsICdkJyk6IFByaW50IHNwYWNlIGFmdGVyd2FyZHMuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnZCcpOiBVc2UgR0VUX0NPTkQgbm90IEdFVF9GSUVMRC4KLQotTW9uIEp1bCAxOSAxMzo1MjoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogVXNlIGV4dHJhY3RfNXJfc3RvcmUgZm9yICdyJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICc+Jyk6IElmIG5leHQgY2hhcmFjdGVyIGlzICduJywKLQlkb24ndCBvdXRwdXQgYSBzcGFjZS4KLQotCSogaHBwYS1kaXMuYyAoZmxvYXRfZm9ybWF0X25hbWVzKTogMTAgaXMgdW5kZWZpbmVkLCBhbmQgMTEgaXMgcXVhZC4KLQotU3VuIEp1bCAxOCAxNjozMDowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IE5ldyBmaWxlLCBjb250YWluaW5nIG9wY29kZSB0YWJsZSBmcm9tCi0JLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgotCSogTWFrZWZpbGUuaW46IEFkZCBpdC4KLQotVGh1IEp1bCAxNSAxMjozNzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmM6IE5ldyBmaWxlLCBtb3ZlZCBpbiBmcm9tIGdkYiBhbmQgY2hhbmdlZCB0byB1c2UgdGhlCi0JbmV3IGRpcy1hc20uaCBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbTg4ay1kaXMuby4KLQkobTg4ay1kaXMubyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKdWwgMTMgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZywgX3ByaW50X2luc25fbWlwcyk6IE1hZGUgcG9pbnRlciB0bwotCWFyZ3VtZW50IHN0cmluZyBjb25zdCBjaGFyICogdG8gY29ycmVzcG9uZCB0byBvcGNvZGUvbWlwcy5oLgotCi1UdWUgSnVsICA2IDE1OjE4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogVXBkYXRlZCB0byBhY2NvdW50IGZvciBuYW1lIGNoYW5nZXMgaW4gbmV3IHZlcnNpb24KLQlvZiBvcGNvZGUvbWlwcy5oLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIGhlYWRlciBmaWxlIGRlcGVuZGVuY2llcy4KLQotU2F0IEp1bCAgMyAyMzo0Nzo1NiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQ29ycmVjdCBmZXRjaGluZyBvZiBpbnN0cnVjdGlvbi4KLQotVGh1IEp1bCAgMSAxMjoyMzozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAoTkVYVFdPUkQsIE5FWFRMT05HKTogVXNlICgoeCkgXiAweDgwMDApIC0gMHg4MDAwIHRvIHNpZ24KLQlleHRlbmQsIHJhdGhlciB0aGFuIHNoaWZ0cy4KLQotU3VuIEp1biAyMCAyMDo1Njo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVuZG8gMTUgSnVuZSBjaGFuZ2UuCi0KLUZyaSBKdW4gMTggMTQ6MTU6MTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogIENoYW5nZSByZXR1cm4gdmFsdWUgdG8gYnl0ZSBjb3VudAotCW9yIGVycm9yIGNvZGUuCi0JKiBtNjhrLWRpcy5jOiAgUmUtd3JpdGUgdG8gZGV0ZWN0IGludmFsaWQgb3BlcmFuZHMgYmVmb3JlCi0JcHJpbnRpbmcgYW55dGhpbmcsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyB0aGUgc2FtZSB3YXkgd2UKLQloYW5kbGUgaW52YWxpZCBvcGNvZGVzLgotCi1UaHUgSnVuIDE3IDE1OjAxOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNoLWRpcy5jLCBzaC1vcGMuaDogVW5kZXJzdGFuZCBzb21lIG1vcmUgb3Bjb2Rlcy4KLQotV2VkIEp1biAxNiAxMzo0ODowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgPGFuc2lkZWNsLmg+IGFuZCBzeXNkZXAuaCBiZWZvcmUgb3RoZXIKLQloZWFkZXIgZmlsZXMuCi0KLVR1ZSBKdW4gMTUgMjE6NDU6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogRG9uJ3QgZGVjbGFyZSBxc29ydCwgc2luY2Ugc3lzZGVwLmggbWlnaHQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbWFrZSBzeXNkZXAuaCBsaW5rLgotCSogTWFrZWZpbGUuaW46IFNlYXJjaCAuLi9pbmNsdWRlLiAgRG9uJ3Qgc2VhcmNoIC4uL2JmZC4KLQotVHVlIEp1biAxNSAxMzozNjoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLWRpcy5jOiBGaXggdHlwby4gICdhJyBhbmQgJ2QnIHdlcmUgcmV2ZXJzZWQuCi0JRG8gbm90IHByaW50IGEgc3BhY2UgYmVmb3JlIHRoZSBjb21wbGV0ZXJzIHNwZWNpZmllZCBieQotCSdhJyBhbmQgJ2QnLgotCi1GcmkgSnVuIDExIDE4OjQwOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBObyBsb25nZXIgbmVlZCB0byBib21iIG91dCBpZiBIT1NUXzY0X0JJVCBpcwotCWRlZmluZWQsIHNpbmNlIGdkYiBoYXMgYmVlbiBmaXhlZC4KLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogTGFzdCBhcmd1bWVudCB0byBmcHV0X3JlZywKLQlmcHV0X3JlZ19yLCBmcHV0X2NyZWcsIGZwdXRfY29uc3QsIGFuZCBmcHV0c19maWx0ZXJlZCBzaG91bGQKLQliZSBhICpkaXNhc3NlbWJsZV9pbmZvLCBub3QgYSAqRklMRS4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ2QnLCAnIScsIGFuZCAnYScuCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdzJyB0byBleHRyYWN0IGEgMiBiaXQgc3BhY2UgcmVnaXN0ZXIuCi0JKiBocHBhLWRpcy5jOiBEZWxldGUgY2FzZXMgd2hpY2ggYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBKdW4gMTEgMDc6NTM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fe202OGssYXJnfSk6IEFkZCBNTVUgY29kZXMuCi0KLVR1ZSBKdW4gIDggMTI6MjU6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmM6IE5ldyBmaWxlLCByZW1vdmVkIGZyb20gYmZkL2NwdS1oODMwMC5jLCB3aXRoCi0JSDgvMzAwLUggb3Bjb2Rlcy4KLQotTW9uIEp1biAgNyAxMjo1ODo0OSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDU0VBUkNIKTogQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCi1UaHUgSnVuICAzIDE1OjU2OjQ5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ0knLCAnSicsIGFuZCAnSycgaW4gb3V0cHV0Ci0JdGVtcGxhdGVzIGZvciAxLjEgRlAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBNYXkgMjUgMTM6MDU6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEFkZHJlc3MgYXJndW1lbnQgaXMgdHlwZQotCWJmZF92bWEuCi0JKiB6OGstZGlzLmMgKHByaW50X2luc25fejhrLCBwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKToKLQlEaXR0by4KLQotCSogaDg1MDAtb3BjLmggKGFkZHJfY2xhc3NfdHlwZSk6IE5vIGNvbW1hIGF0IGVuZCBvZiBlbnVtZXJhdG9yLgotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlLCBzaF9hcmdfdHlwZSk6IERpdHRvLgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcGFyZV9vcGNvZGVzKTogTW92ZSBzdGF0aWMgZGVjbGFyYXRpb24gdG8KLQl0b3AtbGV2ZWwuCi0KLUZyaSBNYXkgMjEgMTQ6MTc6MzcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEltcGxlbWVudCAnbicgYXJndW1lbnQgZm9yIHVuaW1wCi0JaW5zdHJ1Y3Rpb24sIHJlbW92ZSB1bmltcCBoYWNrIGZyb20gJ2wnIGFyZ3VtZW50LgotCi1XZWQgTWF5IDE5IDE1OjM1OjU0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBtYWtlIGFuY2llbnQgZ2NjJ3MKLQloYXBweS4KLQotRnJpIE1heSAxNCAxNToyMjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ0MnIGZvciBnZW5lcmFsIGNvcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zLgotCi1GcmkgTWF5IDE0IDAwOjA5OjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSBkaXMtYXNtLmggYmVmb3JlIHN5c2RlcC5oLiAgQ2hhbmdlZCBzb21lCi0JYXJyYXlzIG9mIHN0cmluZyBwb2ludGVycyB0byAyLWQgYXJyYXlzIG9mIGNoYXJzLCB0byBzYXZlCi0Jc3BhY2UuCi0KLVRodSBNYXkgIDYgMjA6NTE6MTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMsIGFscGhhLWRpcy5jLCBpOTYwLWRpcy5jLCBzcGFyYy1kaXMuYywgejhrLWRpcy5jOgotCUNhc3Qgc2Vjb25kIGFyZyB0byByZWFkX21lbW9yeV9mdW5jIHRvICJiZmRfYnl0ZSAqIiwgYXMgbmVjZXNzYXJ5LgotCi1UdWUgTWF5ICA0IDIwOjMxOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogTmV3IGZpbGUgZnJvbSBVdGFoLCBhZGFwdGVkIHRvIG5ldyBkaXNhc3NlbWJsZXIKLQljYWxsaW5nIGludGVyZmFjZS4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgotCi1Nb24gQXByIDI2IDE4OjE3OjQyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzaC1kaXMuYywgc2gtb3BjLmg6IE5ldyBmaWxlcy4KLQotRnJpIEFwciAyMyAxODo1MToyMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEtZGlzLmMsIGFscGhhLW9wYy5oOiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgIDYgMTI6NTQ6MDggMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaXBzLWRpcy5jOiBTaWduIGV4dGVuZCAnaicgYW5kICdiJyBhcmd1bWVudHMsIGRlbHRhIGlzIGEgc2lnbmVkCi0JdmFsdWUuCi0KLU1vbiBBcHIgIDUgMTc6Mzc6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBNYWtlICJ0YSIgdGhlIGRlZmF1bHQgdHJhcCBpbnN0cnVjdGlvbiwgInQiIHRoZSBhbGlhcy4KLQotRnJpIEFwciAgMiAwNzoyNDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMsIHNwYXJjLWRpcy5jLCBzcGFyYy1vcGMuYzogVXNlIENPTlNUIHJhdGhlciB0aGFuCi0JY29uc3QuCi0KLVRodSBBcHIgIDEgMTE6MjA6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBVc2UgZnByaW50Zl9mdW5jIGEgZmV3IHBsYWNlcyB3aGVyZSBJIGZvcmdvdCwKLQlhbmQgZG91YmxlIHBlcmNlbnQgc2lnbnMgYSBmZXcgcGxhY2VzLgotCi0JKiBhMjlrLWRpcy5jLCBpOTYwLWRpcy5jOiBOZXcsIG1lcmdlZCBmcm9tIGdkYiBhbmQgYmludXRpbHMuCi0KLQkqIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIG1pcHMtZGlzLmMsIHNwYXJjLWRpcy5jOgotCVVzZSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgbm90IHByaW50X2FkZHJlc3MuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19wcmludF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNwYXJjLWRpcy5jLgotCXNwYXJjLWRpcy5jOiBOZXcgZmlsZSwgbWVyZ2VzIGJpbnV0aWxzIGFuZCBnZGIgdmVyc2lvbnMgYXMgZm9sbG93czoKLQlGcm9tIEdEQjoKLQkgICAgQWRkIGBhZGQnIGluc3RydWN0aW9uIHRvIHRoZSBzZXQgdGhhdCBnZXQgY2hlY2tlZAotCSAgICBmb3IgYSBwcmVjZWRpbmcgYHNldGhpJyBpbiBvcmRlciB0byBwcmludCBhbiBhYnNvbHV0ZSBhZGRyZXNzLgotCSAgICAqIChwcmludF9pbnNuKTogIERpc2Fzc2VtYmx5IHByZWZlcnMgcmVhbCBpbnN0cnVjdGlvbnMuCi0JICAgIChpc19kZWxheWVkX2JyYW5jaCk6ICBTcGVlZCB1cC4KLQkgICAgKiBzcGFyYy1vcGNvZGUuaDogQWRkIEFMSUFTIGJpdCB0byBhbGlhc2VzLiAgRml4IHVwIG9wY29kZSB0YWJsZXMuCi0JICAgIFN0aWxsIG1pc3Npbmcgc29tZSBmbG9hdCBvcHMsIGFuZCBuZWVkcyB0ZXN0aW5nLgotCSAgICAqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBFbGltaW5hdGUgJ3NldCcgdGVzdCwgc3Vic3VtZWQgYnkKLQkgICAgRl9BTElBUy4gIFVzZSBwcmludGYsIG5vdCBmcHJpbnRmLCB3aGVuIG5vdCBwYXNzaW5nIGEgZmlsZQotCSAgICBwb2ludGVyLi4uCi0JICAgIChjb21wYXJlX29wY29kZXMpOiBDaGVjayB0aGF0IGlkZW50aWNhbCBpbnN0cnVjdGlvbnMgaGF2ZQotCSAgICBpZGVudGljYWwgb3Bjb2RlcywgY29tcGxhaW4gb3RoZXJ3aXNlLgotCUZyb20gYmludXRpbHM6Ci0JICAgICogTmV3ICdtJyBhcmcuCi0JICAgICogSW5jbHVkZSByZWdfbmFtZXMuCi0JRnJvbSBuZWl0aGVyOgotCSAgICBVc2UgZGlzLWFzbS5oL3JlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCi1XZWQgTWFyIDMxIDIwOjQ5OjA2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMsIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6Ci0JICBkZWxpYmVyYXRlbHkgcmV0dXJuIG5vbi16ZXJvIHRvIHNldGptcCBmcm9tIGxvbmdqbXAuICBPdGhlcndpc2UKLQkgIHRoaXMgY29kZSBmYWlscyB0byBjb21waWxlLgotCi1XZWQgTWFyIDMxIDE3OjA0OjMxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmM6ICBGaXggcHJvdG90eXBlIGZvciBmZXRjaF9hcmcoKS4KLQotV2VkIE1hciAzMSAxMDowNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWJ1Zi5jOiBOZXcgZmlsZSwgZm9yIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQlNYWtlZmlsZS5pbiAoT0ZJTEVTKTogSW5jbHVkZSBpdC4KLQltNjhrLWRpcy5jLCBpMzg2LWRpcy5jLCBoODUwMC1kaXMuYywgbWlwcy1kaXMuYywgejhrLWRpcy5jOgotCVVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0KLU1vbiBNYXIgMjkgMTQ6MDI6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogR2V0IHNpZ24gb2YgZnAgb2Zmc2V0cyByaWdodC4KLQkqIGg4NTAwLW9wYy5oOiBGaXggY291cGxlIG9mIG9wY29kZXMuCi0KLVdlZCBNYXIgMjQgMDI6MDM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpICYgaW5zdGFsbGNoZWNrIHRhcmdldHMKLQotTW9uIE1hciAyMiAxODo1NTowNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGg4NTAwLWRpcy5jLgotCi1GcmkgTWFyIDE5IDE0OjI3OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYywgaDg1MDAtb3BjLmg6IE5ldyBmaWxlcwotCi1UaHUgTWFyIDE4IDE0OjEyOjM3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYywgejhrLWRpcy5jOiAgQ29udmVydGVkIHRvIHVzZSBpbnRlcmZhY2UgZGVmaW5lZCBpbgotCS4uL2luY2x1ZGUvZGlzLWFzbS5oLgotCSogbTY4ay1kaXMuYzogIE5ldyBmaWxlIChtZXJnZSBvZiAuLi9iaW51dGlscy9tNjhrLXBpbnNuLmMKLQlhbmQgLi4vZ2RiL202OGstcGluc24uYykuCi0JKiBpMzg2LWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL2kzODYtcGluc24uYwotCWFuZCAuLi9nZGIvaTM4Ni1waW5zbi5jKS4KLQkqIG02ODg4MS1leHQuYzogIE5ldyBmaWxlLiAgTW92ZWQgZGVmaW5pdGlvbiBvZgotCWV4dF9mb3JtYXQgZXh0X2Zvcm1hdF82ODg4MSBmcm9tIC4uL2dkYi9tNjhrLXRkZXAuYy4KLQkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGZvciBuZXcgZmlsZXMuCi0JKiBpMzg2LWRpcy5jOiAgUGF0Y2hlcyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCi0JKiBtNjhrLWRpcy5jOiAgUmVjb2duaXplICc5JyBwbGFjZW1lbnQgY29kZSwgc28gKHNheSkgcGZsdXNoCi0JY2FuIGJlIGRpcy1hc3NlbWJsZWQuCi0KLVdlZCBGZWIgMTcgMDk6MTk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IE5vdyByZXR1cm5zIHZvaWQuCi0KLU1vbiBKYW4gMTEgMTY6MDk6MTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKGFuc2lkZWNsLmgpOiAgSW5jbHVkZSBmb3IgYmVuZWZpdCBvZiBzeXNkZXAuaAotCWZpbGVzIHRoYXQgdXNlIHRoZSBtYWNyb3MuCi0KLVRodSBKYW4gIDcgMTM6MTU6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBOZXcgZmlsZSwgZnJvbSBnZGIvbWlwcy1waW5zbi5jLgotCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbWlwcy1kaXMuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbWlwcy1kaXMuYy4KLQotVGh1IEphbiAgNyAwNzozNjozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgIAkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSwgcHJpbnRfaW5zbl96ODAwMik6IG5ldyByb3V0aW5lcwotCSogejhrZ2VuLmMsIHo4ay1vcGMuaDogZml4IHNpemVzIG9mIHNvbWUgc2hpZnRzLgotCi1UdWUgRGVjIDIyIDE1OjQyOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBJbXByb3ZlICpjbGVhbiBydWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IGEgZGVmYXVsdCBob3N0LgotCi1UdWUgTm92IDE3IDE5OjUzOjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsc28gdXNlIC1JJChzcmNkaXIpLy4uL2JmZCwgc2luY2Ugc29tZSBzeXNkZXAKLQlmaWxlcyBpbmNsdWRlIG90aGVyIHN5c2RlcCBmaWxlcwotCi1UaHUgTm92IDEyIDE2OjEwOjM3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgejhrLW9wYy5oIHo4a2dlbi5jOiBjaGVja3BvaW50Ci0KLUZyaSBPY3QgIDkgMDQ6NTY6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEZvciBob3N0IHN1cHBvcnQsIHVzZSAuLi9iZmQvY29uZmlndXJlLmhvc3QKLQlzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIC4uL2JmZC9ob3N0cyBkYXRhYmFzZS4KLQotVGh1IE9jdCAgMSAyMzozODo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCi0KLVdlZCBTZXAgMzAgMTY6MDk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogZml4IGJ1ZyB3aGVyZSBvcGNvZGUgcmV0dXJuZWQgd2FzCi0JKmFsd2F5cyogdGhlIHdyb25nIG9uZS4KLQotV2VkIFNlcCAzMCAwNzo0MjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrZ2VuLmM6IGFkZGVkIGNvcHlyaWdodCBpbmZvCi0KLVR1ZSBTZXAgMjkgMTI6MjA6MjEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAodW5wYXJzZV9pbnN0cik6IHByZXR0aWVyIHRhYnMKLQkqIHo4a2dlbi5jIC0+IHo4ay1vcGMuaDogYnVnIGZpeGVzIGluIHRhYmxlcwotCi1GcmkgU2VwIDI1IDEyOjUwOjMyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuY3IqIGNvbmZpZ3VyYXRpb24uCi0JKiB6OGstZGlzLmMgKHN0cnVjdCBpbnN0cl9kYXRhX3MpOiAgTWFrZSBpbnN0cl9hc21zcmMgY2hhciB0byBtYWtlCi0JcGljYXl1bmUgQU5TSSBjb21waWxlcnMgaGFwcHkuCi0KLVNlcCAyMCAwODo1MDo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2KTogIE1ha2UgaTM4NiBhbmQgaTQ4NiBzeW5vbnltb3VzIGZvciBub3cuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zeXN2NCk6ICBBZGQgbXlfaG9zdCBkZWZpbml0aW9uLgotCi1GcmkgU2VwIDE4IDE3OjAxOjIzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggdHlwby4KLQotRnJpIFNlcCAxOCAwMjowNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGNydWQuCi0JKHNwYXJjLW9wYy5vKTogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Zy4KLQotVHVlIFNlcCAgOCAxNzoyOToyNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBzaW5jZSB0aGVyZSBhcmUgbm8gU1VCRElSUywgcmVtb3ZlIHJ1bGUgYW5kCi0JcmVmZXJlbmNlcyBvZiBzdWJkaXJfZG8uCi0KLVR1ZSBTZXAgIDggMTc6MDI6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEdldCB0aGUgbGlicmFyeSBuYW1lIHJpZ2h0IGhlcmUgdG9vLgotCURvbid0IGluc3RhbGwgYmZkLmgsIHNpbmNlIGl0J3MgdW5yZWxhdGVkIHRvIHRoaXMgbGlicmFyeS4gIE5vCi0Jc3ViZGlycyB0byByZWN1cnNlIGludG8sIGVpdGhlci4KLQkoQ0ZJTEVTKTogVGhlIHNvdXJjZSBmaWxlIGhhcyBhIC5jIHN1ZmZpeCwgbm90IC5vLgotCi0JKiBzcGFyYy1vcGMuYzogTmV3IGZpbGUsIG1vdmVkIGZyb20gQkZELgotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEJ1aWxkIGl0LgotCi1UaHUgU2VwICAzIDE2OjU5OjIwIDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYzogZml4ZWQgZm9yd2FyZCByZWZmZXJlbmNlcyBvZiBzb21lIGRlY2xhcmF0aW9ucy4KLQotTW9uIEF1ZyAzMSAxNjowOTo0NSAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZ2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHJpZ2h0Ci0KLU1vbiBBdWcgMzEgMTM6NDc6MzUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYzoga25vd3MgaG93IHRvIGRpc2Fzc2VtYmxlIHo4ayBzdHVmZgotCSogejhrLW9wYy5oOiBuZXcgZmlsZSBmdWxsIG9mIHo4MDAwIG9wY29kZXMKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5hbSBiL29wY29kZXMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjM4NWMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VCRElSUyA9IHBvCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1CRkRESVIgPSAkKHNyY2RpcikvLi4vYmZkCi1NS0RFUCA9IGdjYyAtTU0KLQotV0FSTl9DRkxBR1MgPSBAV0FSTl9DRkxBR1NACi1BTV9DRkxBR1MgPSAkKFdBUk5fQ0ZMQUdTKQotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmxhCi0KLSMgVGhpcyBpcyB3aGVyZSBiZmQuaCBsaXZlcy4KLUJGRF9IID0gLi4vYmZkL2JmZC5oCi0KLSMgVGhpcyBpcyB3aGVyZSBsaWJpYmVydHkgbGl2ZXMuCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotIyBIZWFkZXIgZmlsZXMuCi1IRklMRVMgPSBcCi0JYXJtLW9wYy5oIFwKLQlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKLQloODUwMC1vcGMuaCBcCi0JbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCi0JbWNvcmUtb3BjLmggXAotCXNoLW9wYy5oIFwKLQlzeXNkZXAuaCBcCi0JaWE2NC1hc210YWIuaCBcCi0JaWE2NC1vcGMuaCBcCi0JdzY1LW9wYy5oIFwKLQl6OGstb3BjLmgKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFyYy1kaXMuYyBcCi0JYXJjLW9wYy5jIFwKLQlhcm0tZGlzLmMgXAotCWF2ci1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM3MC1kaXMuYyBcCi0JaTM3MC1vcGMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JaWE2NC1kaXMuYyBcCi0JaWE2NC1vcGMtYS5jIFwKLQlpYTY0LW9wYy1iLmMgXAotCWlhNjQtb3BjLWYuYyBcCi0JaWE2NC1vcGMtaS5jIFwKLQlpYTY0LW9wYy1tLmMgXAotCWlhNjQtb3BjLWQuYyBcCi0JaWE2NC1vcGMuYyBcCi0JaWE2NC1nZW4uYyBcCi0JaWE2NC1hc210YWIuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwai1kaXMuYyBcCi0JcGotb3BjLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljNTR4LWRpcy5jIFwKLQl0aWM1NHgtb3BjLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0Jdjg1MC1kaXMuYyBcCi0Jdjg1MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotQUxMX01BQ0hJTkVTID0gXAotCWEyOWstZGlzLmxvIFwKLQlhbHBoYS1kaXMubG8gXAotCWFscGhhLW9wYy5sbyBcCi0JYXJjLWRpcy5sbyBcCi0JYXJjLW9wYy5sbyBcCi0JYXJtLWRpcy5sbyBcCi0JYXZyLWRpcy5sbyBcCi0JY2dlbi1hc20ubG8gXAotCWNnZW4tZGlzLmxvIFwKLQljZ2VuLW9wYy5sbyBcCi0JZDEwdi1kaXMubG8gXAotCWQxMHYtb3BjLmxvIFwKLQlkMzB2LWRpcy5sbyBcCi0JZDMwdi1vcGMubG8gXAotCWZyMzAtYXNtLmxvIFwKLQlmcjMwLWRlc2MubG8gXAotCWZyMzAtZGlzLmxvIFwKLQlmcjMwLWlibGQubG8gXAotCWZyMzAtb3BjLmxvIFwKLQloODMwMC1kaXMubG8gXAotCWg4NTAwLWRpcy5sbyBcCi0JaHBwYS1kaXMubG8gXAotCWkzODYtZGlzLmxvIFwKLQlpMzcwLWRpcy5sbyBcCi0JaTM3MC1vcGMubG8gXAotCWk5NjAtZGlzLmxvIFwKLQlpYTY0LWRpcy5sbyBcCi0JaWE2NC1vcGMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBqLWRpcy5sbyBcCi0JcGotb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljNTR4LWRpcy5sbyBcCi0JdGljNTR4LW9wYy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi1PRklMRVMgPSBAQkZEX01BQ0hJTkVTQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChJTkNESVIpIC1JJChCRkRESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9ICBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotc3RhbXAtbGliOiBsaWJvcGNvZGVzLmxhCi0JbGlidG9vbGRpcj1gJChMSUJUT09MKSAtLWNvbmZpZyB8IHNlZCAtbiAtZSAncy9eb2JqZGlyPS8vcCdgOyBcCi0JaWYgWyAtZiAkJGxpYnRvb2xkaXIvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgJCRsaWJ0b29sZGlyL2xpYm9wY29kZXMuYSBsaWJvcGNvZGVzLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYm9wY29kZXMudG1wIGxpYm9wY29kZXMuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGlib3Bjb2Rlcy5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgV2Ugc2hvdWxkIHJlY29uZmlndXJlIHdoZW5ldmVyIGJmZC9jb25maWd1cmUuaW4gY2hhbmdlcywgYmVjYXVzZQotIyB0aGF0J3Mgd2hlcmUgdGhlIHZlcnNpb24gbnVtYmVyIGNvbWVzIGZyb20uCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS8uLi9iZmQvY29uZmlndXJlLmluCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1DTEVBTkZJTEVTID0gXAotCWxpYm9wY29kZXMuYSBzdGFtcC1saWIgZGVwLnNlZCBERVAgREVQMSBERVAyCi0KLQotCi0jIFRoZSBzdGFydCBtYXJrZXIgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBwYXNzIHRocm91Z2ggYXV0b21ha2UgdW5zY2F0aGVkLgotCi0KLQotaWE2NC1pYy50Ymw6ICQoc3JjZGlyKS9pYTY0LWljLnRibAotCSQoTE5fUykgLWYgJChzcmNkaXIpL2lhNjQtaWMudGJsCi1pYTY0LXJhdy50Ymw6ICQoc3JjZGlyKS9pYTY0LXJhdy50YmwKLQkkKExOX1MpIC1mICQoc3JjZGlyKS9pYTY0LXJhdy50YmwKLWlhNjQtd2F3LnRibDogJChzcmNkaXIpL2lhNjQtd2F3LnRibAotCSQoTE5fUykgLWYgJChzcmNkaXIpL2lhNjQtd2F3LnRibAotaWE2NC13YXIudGJsOiAkKHNyY2RpcikvaWE2NC13YXIudGJsCi0JJChMTl9TKSAtZiAkKHNyY2RpcikvaWE2NC13YXIudGJsCi0KLWlhNjQtZ2VuOiBpYTY0LWdlbi5vCi0JJChMSU5LKSBpYTY0LWdlbi5vICQoTElCSUJFUlRZKQotCi1pYTY0LWdlbi5vOiBpYTY0LWdlbi5jIGlhNjQtb3BjLmMgaWE2NC1vcGMtYS5jIGlhNjQtb3BjLWIuYyBpYTY0LW9wYy1mLmMgXAotICBpYTY0LW9wYy1pLmMgaWE2NC1vcGMtbS5jIGlhNjQtb3BjLWQuYyBpYTY0LW9wYy5oCi0KLWlhNjQtYXNtdGFiLmM6IEBNQUlOVEAgaWE2NC1nZW4gaWE2NC1pYy50YmwgaWE2NC1yYXcudGJsIGlhNjQtd2F3LnRibCBpYTY0LXdhci50YmwKLQkuL2lhNjQtZ2VuID4gJChzcmNkaXIpL2lhNjQtYXNtdGFiLmMKLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSIkKE1LREVQKSIgREVQMQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+ICRACi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiAkQAotCi1ERVAxOiAkKENGSUxFUykKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQllY2hvICcjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuJyA+PiBERVAyCi0JJChNS0RFUCkgJChJTkNMVURFUykgJChDRkxBR1MpICQ/ID4+IERFUDIKLQltdiAtZiBERVAyICRACi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvYXJjLmggb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotYXZyLWRpcy5sbzogYXZyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9kMTB2LmgKLWQzMHYtZGlzLmxvOiBkMzB2LWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gIG9waW50bC5oCi1oODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotaHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLWkzNzAtZGlzLmxvOiBpMzcwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2kzNzAuaAotaTM3MC1vcGMubG86IGkzNzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzNzAuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWlhNjQtZGlzLmxvOiBpYTY0LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2lhNjQuaAotaWE2NC1vcGMtYS5sbzogaWE2NC1vcGMtYS5jIGlhNjQtb3BjLmggJChJTkNESVIpL29wY29kZS9pYTY0LmgKLWlhNjQtb3BjLWIubG86IGlhNjQtb3BjLWIuYyBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oCi1pYTY0LW9wYy1mLmxvOiBpYTY0LW9wYy1mLmMgaWE2NC1vcGMuaCAkKElOQ0RJUikvb3Bjb2RlL2lhNjQuaAotaWE2NC1vcGMtaS5sbzogaWE2NC1vcGMtaS5jIGlhNjQtb3BjLmggJChJTkNESVIpL29wY29kZS9pYTY0LmgKLWlhNjQtb3BjLW0ubG86IGlhNjQtb3BjLW0uYyBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oCi1pYTY0LW9wYy1kLmxvOiBpYTY0LW9wYy1kLmMKLWlhNjQtb3BjLmxvOiBpYTY0LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oIGlhNjQtYXNtdGFiLmggJChJTkNESVIpL29wY29kZS9pYTY0LmggXAotICBpYTY0LWFzbXRhYi5jCi1pYTY0LWdlbi5sbzogaWE2NC1nZW4uYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBzeXNkZXAuaCBjb25maWcuaCBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oIFwKLSAgaWE2NC1vcGMtYS5jIGlhNjQtb3BjLWkuYyBpYTY0LW9wYy1tLmMgaWE2NC1vcGMtYi5jIFwKLSAgaWE2NC1vcGMtZi5jIGlhNjQtb3BjLXguYyBpYTY0LW9wYy1kLmMKLWlhNjQtYXNtdGFiLmxvOiBpYTY0LWFzbXRhYi5jCi1tMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW02OGstZGlzLmxvOiBtNjhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBcCi0gIG9waW50bC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tNjhrLW9wYy5sbzogbTY4ay1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9tODhrLmggXAotICBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIG1jb3JlLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLW1pcHMtb3BjLmxvOiBtaXBzLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLW0xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1uczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICBvcGludGwuaAotcGotZGlzLmxvOiBwai1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvcGouaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1wai1vcGMubG86IHBqLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9wai5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvcHBjLmggb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljNTR4LWRpcy5sbzogdGljNTR4LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzU0eC5oICQoSU5DRElSKS9jb2ZmL3RpYzU0eC5oIFwKLSAgJChJTkNESVIpL2NvZmYvdGkuaAotdGljNTR4LW9wYy5sbzogdGljNTR4LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljNTR4LmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLXY4NTAtb3BjLmxvOiB2ODUwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS92ODUwLmggb3BpbnRsLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuaW4gYi9vcGNvZGVzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWMxZDAxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9NQUNISU5FUyA9IEBCRkRfTUFDSElORVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1PQkpEVU1QID0gQE9CSkRVTVBACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFyY2hkZWZzID0gQGFyY2hkZWZzQAotbCA9IEBsQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQkZERElSID0gJChzcmNkaXIpLy4uL2JmZAotTUtERVAgPSBnY2MgLU1NCi0KLVdBUk5fQ0ZMQUdTID0gQFdBUk5fQ0ZMQUdTQAotQU1fQ0ZMQUdTID0gJChXQVJOX0NGTEFHUykKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIFRoaXMgaXMgd2hlcmUgbGliaWJlcnR5IGxpdmVzLgotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgSGVhZGVyIGZpbGVzLgotSEZJTEVTID0gXAotCWFybS1vcGMuaCBcCi0JZnIzMC1kZXNjLmggZnIzMC1vcGMuaCBcCi0JaDg1MDAtb3BjLmggXAotCW0zMnItZGVzYy5oIG0zMnItb3BjLmggXAotCW1jb3JlLW9wYy5oIFwKLQlzaC1vcGMuaCBcCi0Jc3lzZGVwLmggXAotCWlhNjQtYXNtdGFiLmggXAotCWlhNjQtb3BjLmggXAotCXc2NS1vcGMuaCBcCi0JejhrLW9wYy5oCi0KLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFyYy1kaXMuYyBcCi0JYXJjLW9wYy5jIFwKLQlhcm0tZGlzLmMgXAotCWF2ci1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM3MC1kaXMuYyBcCi0JaTM3MC1vcGMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JaWE2NC1kaXMuYyBcCi0JaWE2NC1vcGMtYS5jIFwKLQlpYTY0LW9wYy1iLmMgXAotCWlhNjQtb3BjLWYuYyBcCi0JaWE2NC1vcGMtaS5jIFwKLQlpYTY0LW9wYy1tLmMgXAotCWlhNjQtb3BjLWQuYyBcCi0JaWE2NC1vcGMuYyBcCi0JaWE2NC1nZW4uYyBcCi0JaWE2NC1hc210YWIuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwai1kaXMuYyBcCi0JcGotb3BjLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljNTR4LWRpcy5jIFwKLQl0aWM1NHgtb3BjLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0Jdjg1MC1kaXMuYyBcCi0Jdjg1MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotCi1BTExfTUFDSElORVMgPSBcCi0JYTI5ay1kaXMubG8gXAotCWFscGhhLWRpcy5sbyBcCi0JYWxwaGEtb3BjLmxvIFwKLQlhcmMtZGlzLmxvIFwKLQlhcmMtb3BjLmxvIFwKLQlhcm0tZGlzLmxvIFwKLQlhdnItZGlzLmxvIFwKLQljZ2VuLWFzbS5sbyBcCi0JY2dlbi1kaXMubG8gXAotCWNnZW4tb3BjLmxvIFwKLQlkMTB2LWRpcy5sbyBcCi0JZDEwdi1vcGMubG8gXAotCWQzMHYtZGlzLmxvIFwKLQlkMzB2LW9wYy5sbyBcCi0JZnIzMC1hc20ubG8gXAotCWZyMzAtZGVzYy5sbyBcCi0JZnIzMC1kaXMubG8gXAotCWZyMzAtaWJsZC5sbyBcCi0JZnIzMC1vcGMubG8gXAotCWg4MzAwLWRpcy5sbyBcCi0JaDg1MDAtZGlzLmxvIFwKLQlocHBhLWRpcy5sbyBcCi0JaTM4Ni1kaXMubG8gXAotCWkzNzAtZGlzLmxvIFwKLQlpMzcwLW9wYy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCWlhNjQtZGlzLmxvIFwKLQlpYTY0LW9wYy5sbyBcCi0JbTMyci1hc20ubG8gXAotCW0zMnItZGVzYy5sbyBcCi0JbTMyci1kaXMubG8gXAotCW0zMnItaWJsZC5sbyBcCi0JbTMyci1vcGMubG8gXAotCW0zMnItb3BpbnN0LmxvIFwKLQltNjhrLWRpcy5sbyBcCi0JbTY4ay1vcGMubG8gXAotCW04OGstZGlzLmxvIFwKLQltMTAyMDAtZGlzLmxvIFwKLQltMTAyMDAtb3BjLmxvIFwKLQltMTAzMDAtZGlzLmxvIFwKLQltMTAzMDAtb3BjLmxvIFwKLQltY29yZS1kaXMubG8gXAotCW1pcHMtZGlzLmxvIFwKLQltaXBzLW9wYy5sbyBcCi0JbWlwczE2LW9wYy5sbyBcCi0JcGotZGlzLmxvIFwKLQlwai1vcGMubG8gXAotCXBwYy1kaXMubG8gXAotCXBwYy1vcGMubG8gXAotCW5zMzJrLWRpcy5sbyBcCi0Jc2gtZGlzLmxvIFwKLQlzcGFyYy1kaXMubG8gXAotCXNwYXJjLW9wYy5sbyBcCi0JdGljMzAtZGlzLmxvIFwKLQl0aWM1NHgtZGlzLmxvIFwKLQl0aWM1NHgtb3BjLmxvIFwKLQl0aWM4MC1kaXMubG8gXAotCXRpYzgwLW9wYy5sbyBcCi0Jdjg1MC1kaXMubG8gXAotCXY4NTAtb3BjLmxvIFwKLQl2YXgtZGlzLmxvIFwKLQl3NjUtZGlzLmxvIFwKLQl6OGstZGlzLmxvCi0KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9IGRpcy1idWYuYyBkaXNhc3NlbWJsZS5jCi1saWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKQotbGlib3Bjb2Rlc19sYV9MSUJBREQgPSAkKE9GSUxFUykgQFdJTjMyTElCQUREQAotbGlib3Bjb2Rlc19sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJvcGNvZGVzLmEuICBXZSBjcmVhdGUgbGlib3Bjb2Rlcy5hIGluCi0jIHRoZSBidWlsZCBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZQotIyBwcm9ncmFtcyB0aGF0IHVzZSBsaWJvcGNvZGVzLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaAotIyBzaG91bGQgYmUgcmVtb3ZlZCBpZiBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYm9wY29kZXMuYQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLQotQ0xFQU5GSUxFUyA9IFwKLQlsaWJvcGNvZGVzLmEgc3RhbXAtbGliIGRlcC5zZWQgREVQIERFUDEgREVQMgotCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGlib3Bjb2Rlc19hX0xJQkFERCA9IAotbGlib3Bjb2Rlc19hX1NPVVJDRVMgPSBsaWJvcGNvZGVzLmEuYwotbGlib3Bjb2Rlc19hX09CSkVDVFMgPSAgbGlib3Bjb2Rlcy5hLm8KLUxUTElCUkFSSUVTID0gICQobGliX0xUTElCUkFSSUVTKQotCi1saWJvcGNvZGVzX2xhX09CSkVDVFMgPSAgZGlzLWJ1Zi5sbyBkaXNhc3NlbWJsZS5sbwotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKLWFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gdGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jICQobGlib3Bjb2Rlc19sYV9TT1VSQ0VTKQotT0JKRUNUUyA9IGxpYm9wY29kZXMuYS5vICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGlib3Bjb2Rlcy5sYTogJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlib3Bjb2Rlc19sYV9MREZMQUdTKSAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1zdGFtcC1saWI6IGxpYm9wY29kZXMubGEKLQlsaWJ0b29sZGlyPWAkKExJQlRPT0wpIC0tY29uZmlnIHwgc2VkIC1uIC1lICdzL15vYmpkaXI9Ly9wJ2A7IFwKLQlpZiBbIC1mICQkbGlidG9vbGRpci9saWJvcGNvZGVzLmEgXTsgdGhlbiBcCi0JICBjcCAkJGxpYnRvb2xkaXIvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKLSMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLQotaWE2NC1pYy50Ymw6ICQoc3JjZGlyKS9pYTY0LWljLnRibAotCSQoTE5fUykgLWYgJChzcmNkaXIpL2lhNjQtaWMudGJsCi1pYTY0LXJhdy50Ymw6ICQoc3JjZGlyKS9pYTY0LXJhdy50YmwKLQkkKExOX1MpIC1mICQoc3JjZGlyKS9pYTY0LXJhdy50YmwKLWlhNjQtd2F3LnRibDogJChzcmNkaXIpL2lhNjQtd2F3LnRibAotCSQoTE5fUykgLWYgJChzcmNkaXIpL2lhNjQtd2F3LnRibAotaWE2NC13YXIudGJsOiAkKHNyY2RpcikvaWE2NC13YXIudGJsCi0JJChMTl9TKSAtZiAkKHNyY2RpcikvaWE2NC13YXIudGJsCi0KLWlhNjQtZ2VuOiBpYTY0LWdlbi5vCi0JJChMSU5LKSBpYTY0LWdlbi5vICQoTElCSUJFUlRZKQotCi1pYTY0LWdlbi5vOiBpYTY0LWdlbi5jIGlhNjQtb3BjLmMgaWE2NC1vcGMtYS5jIGlhNjQtb3BjLWIuYyBpYTY0LW9wYy1mLmMgXAotICBpYTY0LW9wYy1pLmMgaWE2NC1vcGMtbS5jIGlhNjQtb3BjLWQuYyBpYTY0LW9wYy5oCi0KLWlhNjQtYXNtdGFiLmM6IEBNQUlOVEAgaWE2NC1nZW4gaWE2NC1pYy50YmwgaWE2NC1yYXcudGJsIGlhNjQtd2F3LnRibCBpYTY0LXdhci50YmwKLQkuL2lhNjQtZ2VuID4gJChzcmNkaXIpL2lhNjQtYXNtdGFiLmMKLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSIkKE1LREVQKSIgREVQMQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+ICRACi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiAkQAotCi1ERVAxOiAkKENGSUxFUykKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQllY2hvICcjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuJyA+PiBERVAyCi0JJChNS0RFUCkgJChJTkNMVURFUykgJChDRkxBR1MpICQ/ID4+IERFUDIKLQltdiAtZiBERVAyICRACi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvYXJjLmggb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotYXZyLWRpcy5sbzogYXZyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9kMTB2LmgKLWQzMHYtZGlzLmxvOiBkMzB2LWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gIG9waW50bC5oCi1oODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotaHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLWkzNzAtZGlzLmxvOiBpMzcwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2kzNzAuaAotaTM3MC1vcGMubG86IGkzNzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzNzAuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWlhNjQtZGlzLmxvOiBpYTY0LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2lhNjQuaAotaWE2NC1vcGMtYS5sbzogaWE2NC1vcGMtYS5jIGlhNjQtb3BjLmggJChJTkNESVIpL29wY29kZS9pYTY0LmgKLWlhNjQtb3BjLWIubG86IGlhNjQtb3BjLWIuYyBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oCi1pYTY0LW9wYy1mLmxvOiBpYTY0LW9wYy1mLmMgaWE2NC1vcGMuaCAkKElOQ0RJUikvb3Bjb2RlL2lhNjQuaAotaWE2NC1vcGMtaS5sbzogaWE2NC1vcGMtaS5jIGlhNjQtb3BjLmggJChJTkNESVIpL29wY29kZS9pYTY0LmgKLWlhNjQtb3BjLW0ubG86IGlhNjQtb3BjLW0uYyBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oCi1pYTY0LW9wYy1kLmxvOiBpYTY0LW9wYy1kLmMKLWlhNjQtb3BjLmxvOiBpYTY0LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oIGlhNjQtYXNtdGFiLmggJChJTkNESVIpL29wY29kZS9pYTY0LmggXAotICBpYTY0LWFzbXRhYi5jCi1pYTY0LWdlbi5sbzogaWE2NC1nZW4uYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBzeXNkZXAuaCBjb25maWcuaCBpYTY0LW9wYy5oICQoSU5DRElSKS9vcGNvZGUvaWE2NC5oIFwKLSAgaWE2NC1vcGMtYS5jIGlhNjQtb3BjLWkuYyBpYTY0LW9wYy1tLmMgaWE2NC1vcGMtYi5jIFwKLSAgaWE2NC1vcGMtZi5jIGlhNjQtb3BjLXguYyBpYTY0LW9wYy1kLmMKLWlhNjQtYXNtdGFiLmxvOiBpYTY0LWFzbXRhYi5jCi1tMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW02OGstZGlzLmxvOiBtNjhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBcCi0gIG9waW50bC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tNjhrLW9wYy5sbzogbTY4ay1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9tODhrLmggXAotICBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIG1jb3JlLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLW1pcHMtb3BjLmxvOiBtaXBzLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLW0xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1uczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICBvcGludGwuaAotcGotZGlzLmxvOiBwai1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvcGouaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1wai1vcGMubG86IHBqLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9wai5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvcHBjLmggb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljNTR4LWRpcy5sbzogdGljNTR4LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzU0eC5oICQoSU5DRElSKS9jb2ZmL3RpYzU0eC5oIFwKLSAgJChJTkNESVIpL2NvZmYvdGkuaAotdGljNTR4LW9wYy5sbzogdGljNTR4LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljNTR4LmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgb3BpbnRsLmgKLXY4NTAtb3BjLmxvOiB2ODUwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL29wY29kZS92ODUwLmggb3BpbnRsLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hMjlrLWRpcy5jIGIvb3Bjb2Rlcy9hMjlrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhiMWI3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYTI5ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQU1EIDI5MDAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSmltIEtpbmdkb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBQcmludCBhIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2VuZXJhbC1wdXJwb3NlCi0gICByZWdpc3RlciBudW1iZXIgTlVNIG9uIFNUUkVBTS4KLSAgIE5VTSBpcyBhIG51bWJlciBhcyBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBmb3VuZCBpbgotICAgZGVidWdnaW5nIHN5bWJvbHM7IGl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAtMjU1LiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9nZW5lcmFsIChudW0sIGluZm8pCi0gICAgIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAobnVtIDwgMTI4KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZ3IlZCIsIG51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImxyJWQiLCBudW0gLSAxMjgpOwotfQotCi0vKiBMaWtlIHByaW50X2dlbmVyYWwgYnV0IGEgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyLgotICAgCi0gICBUaGUgbW5lbW9uaWNzIHVzZWQgYnkgdGhlIEFNRCBhc3NlbWJsZXIgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZQotICAgYXMgdGhlIG9uZXMgaW4gdGhlIFVzZXIncyBNYW51YWwuICBXZSB1c2UgdGhlIG9uZXMgdGhhdCB0aGUKLSAgIGFzc2VtYmxlciB1c2VzLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zcGVjaWFsIChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMC1TUEVDMF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMF9uYW1lc1tdID0gewotICAgICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAotICAgICJwYzAiLCAicGMxIiwgInBjMiIsICJtbXUiLCAibHJ1IiwgInJzbiIsICJybWEwIiwgInJtYzAiLCAicm1hMSIsICJybWMxIiwKLSAgICAic3BjMCIsICJzcGMxIiwgInNwYzIiLCAiaWJhMCIsICJpYmMwIiwgImliYTEiLCAiaWJjMSIsICJkYmEiLCAiZGJjIiwKLSAgICAiY2lyIiwgImNkciIKLSAgICB9OwotI2RlZmluZSBTUEVDMF9OVU0gKChzaXplb2Ygc3BlYzBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMF9uYW1lc1swXSkpCi0KLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDEyOC0xMjgrU1BFQzEyOF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMTI4X25hbWVzW10gPSB7Ci0gICAgImlwYyIsICJpcGEiLCAiaXBiIiwgInEiLCAiYWx1IiwgImJwIiwgImZjIiwgImNyIgotICAgIH07Ci0jZGVmaW5lIFNQRUMxMjhfTlVNICgoc2l6ZW9mIHNwZWMxMjhfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTI4X25hbWVzWzBdKSkKLQotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTYwLTE2MCtTUEVDMTYwX05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMxNjBfbmFtZXNbXSA9IHsKLSAgICAiZnBlIiwgImludGUiLCAiZnBzIiwgInNyMTYzIiwgImV4b3AiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzE2MF9OVU0gKChzaXplb2Ygc3BlYzE2MF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxNjBfbmFtZXNbMF0pKQotCi0gIGlmIChudW0gPCBTUEVDMF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMwX25hbWVzW251bV0pOwotICBlbHNlIGlmIChudW0gPj0gMTI4ICYmIG51bSA8IDEyOCArIFNQRUMxMjhfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTI4X25hbWVzW251bS0xMjhdKTsKLSAgZWxzZSBpZiAobnVtID49IDE2MCAmJiBudW0gPCAxNjAgKyBTUEVDMTYwX05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzE2MF9uYW1lc1tudW0tMTYwXSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBudW0pOwotfQotCi0vKiBJcyBhbiBpbnN0cnVjdGlvbiB3aXRoIE9QQ09ERSBhIGRlbGF5ZWQgYnJhbmNoPyAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChvcGNvZGUpCi0gICAgIGludCBvcGNvZGU7Ci17Ci0gIHJldHVybiAob3Bjb2RlID09IDB4YTggfHwgb3Bjb2RlID09IDB4YTkgfHwgb3Bjb2RlID09IDB4YTAgfHwgb3Bjb2RlID09IDB4YTEKLQkgIHx8IG9wY29kZSA9PSAweGE0IHx8IG9wY29kZSA9PSAweGE1Ci0JICB8fCBvcGNvZGUgPT0gMHhiNCB8fCBvcGNvZGUgPT0gMHhiNQotCSAgfHwgb3Bjb2RlID09IDB4YzQgfHwgb3Bjb2RlID09IDB4YzAKLQkgIHx8IG9wY29kZSA9PSAweGFjIHx8IG9wY29kZSA9PSAweGFkCi0JICB8fCBvcGNvZGUgPT0gMHhjYyk7Ci19Ci0KLS8qIE5vdyBmaW5kIHRoZSBmb3VyIGJ5dGVzIG9mIElOU04gYW5kIHB1dCB0aGVtIGluICpJTlNOezAsOCwxNiwyNH0uICAqLwotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfYmlnIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblswXTsKLSAgKmluc24xNiA9IGluc25bMV07Ci0gICppbnNuOCAgPSBpbnNuWzJdOwotICAqaW5zbjAgID0gaW5zblszXTsKLX0KLQotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfbGl0dGxlIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblszXTsKLSAgKmluc24xNiA9IGluc25bMl07Ci0gICppbnNuOCA9IGluc25bMV07Ci0gICppbnNuMCA9IGluc25bMF07Ci19Ci0KLXR5cGVkZWYgdm9pZCAoKmZpbmRfYnl0ZV9mdW5jX3R5cGUpCi0gICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBhMjlrKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSByYXcgaW5zdHJ1Y3Rpb24uICAqLwotICBjaGFyIGluc25bNF07Ci0KLSAgLyogVGhlIGZvdXIgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wOwotCi0gIGZpbmRfYnl0ZV9mdW5jX3R5cGUgZmluZF9ieXRlX2Z1bmMgPSAoZmluZF9ieXRlX2Z1bmNfdHlwZSlpbmZvLT5wcml2YXRlX2RhdGE7Ci0KLSAgc3RydWN0IGEyOWtfb3Bjb2RlIENPTlNUICogb3Bjb2RlOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIChiZmRfYnl0ZSAqKSAmaW5zblswXSwgNCwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gICgqZmluZF9ieXRlX2Z1bmMpIChpbnNuLCAmaW5zbjAsICZpbnNuOCwgJmluc24xNiwgJmluc24yNCk7Ci0KLSAgcHJpbnRmICgiJTAyeCUwMnglMDJ4JTAyeCAiLCBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wKTsKLQotICAvKiBIYW5kbGUgdGhlIG5vcCAoYXNlcSAweDQwLGdyMSxncjEpIHNwZWNpYWxseSAqLwotICBpZiAoKGluc24yND09MHg3MCkgJiYgKGluc24xNj09MHg0MCkgJiYgKGluc244PT0weDAxKSAmJiAoaW5zbjA9PTB4MDEpKSB7Ci0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIm5vcCIpOwotICAgIHJldHVybiA0OwotICB9Ci0KLSAgLyogVGhlIG9wY29kZSBpcyBhbHdheXMgaW4gaW5zbjI0LiAgKi8KLSAgZm9yIChvcGNvZGUgPSAmYTI5a19vcGNvZGVzWzBdOwotICAgICAgIG9wY29kZSA8ICZhMjlrX29wY29kZXNbbnVtX29wY29kZXNdOwotICAgICAgICsrb3Bjb2RlKQotICAgIHsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIGluc24yNCA8PCAyNCkgPT0gb3Bjb2RlLT5vcGNvZGUpCi0JewotCSAgY2hhciAqczsKLQkgIAotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLCBvcGNvZGUtPm5hbWUpOwotCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJ2EnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnYic6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjAsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2MnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc24xNiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wKTsKLQkJICBicmVhazsKLQotCQljYXNlICd4JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCAoaW5zbjE2IDw8IDgpICsgaW5zbjApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2gnOgotCQkgIC8qIFRoaXMgdXNlZCB0byBiZSAleCBmb3IgYmludXRpbHMuICAqLwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkJICAgIChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgICgoaW5zbjE2IDw8IDgpICsgaW5zbjApIHwgMHhmZmZmMDAwMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUCc6Ci0JCSAgLyogVGhpcyBvdXRwdXQgbG9va3MganVzdCBsaWtlIGFic29sdXRlIGFkZHJlc3NpbmcsIGJ1dAotCQkgICAgIG1heWJlIHRoYXQncyBPSyAoaXQncyB3aGF0IHRoZSBHREIgbTY4ayBhbmQgRUJNT04KLQkJICAgICBhMjlrIGRpc2Fzc2VtYmxlcnMgZG8pLiAgKi8KLQkJICAvKiBBbGwgdGhlIHNoaWZ0aW5nIGlzIHRvIHNpZ24tZXh0ZW5kIGl0LiAgcCovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCSAgICAobWVtYWRkciArCi0JCSAgICAgKCgoaW50KSgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSkgPDwgMTQpID4+IDE0KSwKLQkJICAgICBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdBJzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJICAgICgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiA+PiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICduJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYgJiAweDdmKTsKLQkJICBicmVhazsKLQotCQljYXNlICd2JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkgIHByaW50X3NwZWNpYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgPj4gNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiA0KSAmIDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkgIGlmICgoaW5zbjE2ICYgMykgIT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdkJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDIpICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMTYgPj4gMikgJiAxNSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyB3ZSBsb29rIGZvciBhIGNvbnN0LGNvbnN0aCBwYWlyIG9mIGluc3RydWN0aW9ucywKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgdHJ5IHRvIHByaW50IHRoZSBzeW1ib2xpYyBhZGRyZXNzLiAgKi8KLQkgIGlmIChpbnNuMjQgPT0gMikgIC8qIGNvbnN0aCAqLwotCSAgICB7Ci0JICAgICAgaW50IGVycmNvZGU7Ci0JICAgICAgY2hhciBwcmV2X2luc25bNF07Ci0JICAgICAgdW5zaWduZWQgY2hhciBwcmV2X2luc24wLCBwcmV2X2luc244LCBwcmV2X2luc24xNiwgcHJldl9pbnNuMjQ7Ci0JICAgICAgCi0JICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LAotCQkJCQkJICAgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sCi0JCQkJCQkgICA0LAotCQkJCQkJICAgaW5mbyk7Ci0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLQkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhY2ggdG8gaGFuZGxlCi0JCSAgICAgdGhpbmdzIGxpa2UKLQkJICAgICAKLQkJICAgICBjb25zdCBfZm9vCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgY29uc3RoIF9mb28KLQkJICAgICAqLwotCQkgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKLQkJCQkgICAgICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbjI0KSkKLQkJICAgIHsKLQkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJCShtZW1hZGRyIC0gOCwgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sIDQsIGluZm8pOwotCQkgICAgICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCi0JCQkJCSAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7Ci0JCSAgICB9Ci0JCX0KLQkJICAKLQkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQotCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3QgY29uc3QuICAqLwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJcyBpdCBjb25zdCB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCi0JCSAgaWYgKHByZXZfaW5zbjI0ID09IDMKLQkJICAgICAgJiYgcHJldl9pbnNuOCA9PSBpbnNuOCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDsgIik7Ci0JCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJKCgoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikKLQkJCSAgKyAocHJldl9pbnNuMTYgPDwgOCkgKyAocHJldl9pbnNuMCkpLAotCQkJIGluZm8pOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgLyogVGhpcyB1c2VkIHRvIGJlICU4eCBmb3IgYmludXRpbHMuICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykKLSAgICAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHglMDh4IiwKLSAgICAgKGluc24yNCA8PCAyNCkgKyAoaW5zbjE2IDw8IDE2KSArIChpbnNuOCA8PCA4KSArIGluc24wKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGFuIGJpZy1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25fYmlnX2EyOWsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfYmlnOwotICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGEgbGl0dGxlLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYTI5ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19saXR0bGU7Ci0gIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWNpbmNsdWRlLm00IGIvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hY2xvY2FsLm00IGIvb3Bjb2Rlcy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmExZjRlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDkxNiArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCA0MCBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIExERkxBR1M9IiRMREZMQUdTIiBMSUJTPSIkTElCUyIgXAotTE5fUz0iJExOX1MiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIE9CSkRVTVA9IiRPQkpEVU1QIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGx0X3RhcmdldCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi1jYXNlICIkdGFyZ2V0IiBpbgotTk9ORSkgbHRfdGFyZ2V0PSIkaG9zdCIgOzsKLSopIGx0X3RhcmdldD0iJHRhcmdldCIgOzsKLWVzYWMKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfRExPUEVOXSwKLVtsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iXSkKLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKLVtsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS13aW4zMi1kbGwiXSkKLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotICBbICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSkKLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgPSB4bm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi10ZXN0IHgiJHNpbGVudCIgPSB4eWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLWlmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKLVsqLSotY3lnd2luKiB8ICotKi1taW5ndyopCi0gIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKLSAgOzsKLV0pCi1lc2FjCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKV0pCi0KLSMgQUNfTElCVE9PTF9XSU4zMl9ETEwgLSBkZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgZGxsJ3MKLUFDX0RFRlVOKEFDX0xJQlRPT0xfV0lOMzJfRExMLCBbQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwgW2RubAotZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tIHx8IHRlc3QgLWYgJGFjX2Rpci9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1MSUJNPQotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1iZW9zKiB8ICotKi1jeWd3aW4qKQotICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0KLSAgOzsKLSotbmNyLXN5c3Y0LjMqKQotICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09IiRMSUJNIC1sbSIpCi0gIDs7Ci0qKQotICBBQ19DSEVDS19MSUIobSwgbWFpbiwgTElCTT0iLWxtIikKLSAgOzsKLWVzYWMKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotICBJTkNMVERMPWlmZWxzZSgkIywxLC1JJDEsWyctSSR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sCi0gIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCi0gIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCi0gICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQotICAgZWxzZQotICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gICAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotICBlbHNlCi0gICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGw9bm8iCi0gICAgTElCTFRETD0iLWxsdGRsIgotICAgIElOQ0xUREw9Ci0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi0KLWRubCBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAotaWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtZGlzLmMgYi9vcGNvZGVzL2FscGhhLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc3MGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyogYWxwaGEtZGlzLmMgLS0gRGlzYXNzZW1ibGUgQWxwaGEgQVhQIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLS8qIE9TRiByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3NmX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJ2MCIsICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsICJ0NSIsICJ0NiIsCi0gICJ0NyIsICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJmcCIsCi0gICJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJ0OCIsICJ0OSIsCi0gICJ0MTAiLCAidDExIiwgInJhIiwgInQxMiIsICJhdCIsICJncCIsICJzcCIsICJ6ZXJvIiwKLSAgIiRmMCIsICIkZjEiLCAiJGYyIiwgIiRmMyIsICIkZjQiLCAiJGY1IiwgIiRmNiIsICIkZjciLAotICAiJGY4IiwgIiRmOSIsICIkZjEwIiwgIiRmMTEiLCAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsCi0gICIkZjE2IiwgIiRmMTciLCAiJGYxOCIsICIkZjE5IiwgIiRmMjAiLCAiJGYyMSIsICIkZjIyIiwgIiRmMjMiLAotICAiJGYyNCIsICIkZjI1IiwgIiRmMjYiLCAiJGYyNyIsICIkZjI4IiwgIiRmMjkiLCAiJGYzMCIsICIkZjMxIgotfTsKLQotLyogVk1TIHJlZ2lzdGVyIG5hbWVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXNfcmVnbmFtZXNbNjRdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwKLSAgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IiwKLSAgIlIxNiIsICJSMTciLCAiUjE4IiwgIlIxOSIsICJSMjAiLCAiUjIxIiwgIlIyMiIsICJSMjMiLAotICAiUjI0IiwgIkFJIiwgIlJBIiwgIlBWIiwgIkFUIiwgIkZQIiwgIlNQIiwgIlJaIiwKLSAgIkYwIiwgIkYxIiwgIkYyIiwgIkYzIiwgIkY0IiwgIkY1IiwgIkY2IiwgIkY3IiwKLSAgIkY4IiwgIkY5IiwgIkYxMCIsICJGMTEiLCAiRjEyIiwgIkYxMyIsICJGMTQiLCAiRjE1IiwKLSAgIkYxNiIsICJGMTciLCAiRjE4IiwgIkYxOSIsICJGMjAiLCAiRjIxIiwgIkYyMiIsICJGMjMiLAotICAiRjI0IiwgIkYyNSIsICJGMjYiLCAiRjI3IiwgIkYyOCIsICJGMjkiLCAiRjMwIiwgIkZaIgotfTsKLQotLyogRGlzYXNzZW1ibGUgQWxwaGEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2FscGhhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlX2luZGV4W0FYUF9OT1BTKzFdOwotICBjb25zdCBjaGFyICogY29uc3QgKiByZWduYW1lczsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlLCAqb3Bjb2RlX2VuZDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgdW5zaWduZWQgaW5zbiwgb3AsIGlzYV9tYXNrOwotICBpbnQgbmVlZF9jb21tYTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtYWpvcm9wIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgaWYgKCFvcGNvZGVfaW5kZXhbMF0pCi0gICAgewotICAgICAgb3Bjb2RlID0gYWxwaGFfb3Bjb2RlczsKLSAgICAgIG9wY29kZV9lbmQgPSBvcGNvZGUgKyBhbHBoYV9udW1fb3Bjb2RlczsKLQotICAgICAgZm9yIChvcCA9IDA7IG9wIDwgQVhQX05PUFM7ICsrb3ApCi0gICAgICAgIHsKLSAgICAgICAgICBvcGNvZGVfaW5kZXhbb3BdID0gb3Bjb2RlOwotICAgICAgICAgIHdoaWxlIChvcGNvZGUgPCBvcGNvZGVfZW5kICYmIG9wID09IEFYUF9PUCAob3Bjb2RlLT5vcGNvZGUpKQotCSAgICArK29wY29kZTsKLSAgICAgICAgfQotICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpCi0gICAgcmVnbmFtZXMgPSB2bXNfcmVnbmFtZXM7Ci0gIGVsc2UKLSAgICByZWduYW1lcyA9IG9zZl9yZWduYW1lczsKLQotICBpc2FfbWFzayA9IEFYUF9PUENPREVfTk9QQUw7Ci0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjQ6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY1OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NjoKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY2OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGluc24gaW50byBhIGhvc3Qgd29yZCAqLwotICB7Ci0gICAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICAgIGludCBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgfQotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gQVhQX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IG9wY29kZV9pbmRleFtvcCsxXTsKLSAgZm9yIChvcGNvZGUgPSBvcGNvZGVfaW5kZXhbb3BdOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+b3Bjb2RlKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgaXNhX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIHsKLSAgICAgICAgaW50IGludmFsaWQgPSAwOwotICAgICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JICB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IGFscGhhX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLQkgIH0KLSAgICAgICAgaWYgKGludmFsaWQpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGdvdG8gZm91bmQ7Ci0gICAgfQotCi0gIC8qIE5vIGluc3RydWN0aW9uIGZvdW5kICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgJSMwOHgiLCBpbnNuKTsKLSAgICAKLSAgcmV0dXJuIDQ7Ci0KLWZvdW5kOgotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLSAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gIG5lZWRfY29tbWEgPSAwOwotICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotICAgICAgaW50IHZhbHVlOwotCi0gICAgICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQotCSBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZhbGlkLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQl2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBzaWduYml0ID0gMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpOwotCSAgICAgIHZhbHVlID0gKHZhbHVlIF4gc2lnbmJpdCkgLSBzaWduYml0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJgotCSAgKChvcGVyYW5kLT5mbGFncyAmIChBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUEpKQotCSAgICE9IEFYUF9PUEVSQU5EX1BBUkVOUykpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JfQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUEFSRU5TKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCi0gICAgICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfSVIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZQUikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbdmFsdWUrMzJdKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCArIHZhbHVlLCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlI3giLCB2YWx1ZSk7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtb3BjLmMgYi9vcGNvZGVzL2FscGhhLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ1ODkxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ2ICswLDAgQEAKLS8qIGFscGhhLW9wYy5jIC0tIEFscGhhIEFYUCBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBBbHBoYSBBWFAgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZSBpbmNsdWRlcwotICAgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcyBwZXJtaXRzIHRoZQotICAgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyIGxvZ2ljLCBhdCB0aGUKLSAgIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcyBzdHJpY3RseSBjb25zdGFudAotICAgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0IGluc2VydGluZwotICAgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzIGZpbGUuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGJhc2UgaW5zdHJ1Y3Rpb24gc2V0IHdhcyBjb21waWxlZCBmcm9tIHRoZQotICAgX0FscGhhIEFyY2hpdGVjdHVyZSBIYW5kYm9va18sIERpZ2l0YWwgT3JkZXIgTnVtYmVyIEVDLVFEMktCLVRFLAotICAgdmVyc2lvbiAyLgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwb3N0LWV2NSBhcmNoaXRlY3R1cmUgZXh0ZW5zaW9ucyBCV1gsIENJWCBhbmQKLSAgIE1BWCBjYW1lIGZyb20gdmVyc2lvbiAzIG9mIHRoaXMgc2FtZSBkb2N1bWVudCwgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUKLSAgIG9uLWxpbmUgYXQgaHR0cDovL2Z0cC5kaWdpdGFsLmNvbS9wdWIvRGlnaXRhbC9pbmZvL3NlbWljb25kdWN0b3IKLSAgIC9saXRlcmF0dXJlL2FscGhhaGIyLnBkZgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBFVjQgUEFMY29kZSBpbnN0cnVjdGlvbnMgd2FzIGNvbXBpbGVkIGZyb20KLSAgIF9ERUNjaGlwIDIxMDY0IGFuZCBERUNjaGlwIDIxMDY0QSBBbHBoYSBBWFAgTWljcm9wcm9jZXNzb3JzIEhhcmR3YXJlCi0gICBSZWZlcmVuY2UgTWFudWFsXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUTlaVUEtVEUsIHByZWxpbWluYXJ5Ci0gICByZXZpc2lvbiBkYXRlZCBKdW5lIDE5OTQuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNSBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0FscGhhIDIxMTY0IE1pY3JvcHJvY2Vzc29yIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsCi0gICBPcmRlciBOdW1iZXIgRUMtUUFFUUItVEUsIHByZWxpbWluYXJ5IHJldmlzaW9uIGRhdGVkIEFwcmlsIDE5OTUuICAqLwotDAotLyogTG9jYWwgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmNhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3pjIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2V2Nmh3amhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9yYmEgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3piIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgICovCi0KLWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW10gPQotewotICAvKiBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncyAqLwotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIGVuZC1vZi1saXN0ICovCi0jZGVmaW5lIFVOVVNFRAkJMAotICB7IDAsIDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gaW50ZWdlciByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgUkEJCShVTlVTRUQgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQgkJKFJBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLSNkZWZpbmUgUkMJCShSQiArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gZnAgcmVnaXN0ZXIgZmllbGRzICovCi0jZGVmaW5lIEZBCQkoUkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLSNkZWZpbmUgRkIJCShGQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQwkJKEZCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLQotICAvKiBUaGUgaW50ZWdlciByZWdpc3RlcnMgd2hlbiB0aGV5IGFyZSBaRVJPICovCi0jZGVmaW5lIFpBCQkoRkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemEsIGV4dHJhY3RfemEgfSwKLSNkZWZpbmUgWkIJCShaQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YiwgZXh0cmFjdF96YiB9LAotI2RlZmluZSBaQwkJKFpCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemMsIGV4dHJhY3RfemMgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBuZWVkcyBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBQUkIJCShaQyArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUywgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzIF9hbmRfIGEgcHJlY2VkaW5nIGNvbW1hICovCi0jZGVmaW5lIENQUkIJCShQUkIgKyAxKQotICB7IDUsIDE2LCAwLAotICAgIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQSwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJBIGZpZWxkICovCi0jZGVmaW5lIFJCQQkJKENQUkIgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmJhLCBleHRyYWN0X3JiYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJCIGZpZWxkICovCi0jZGVmaW5lIFJDQQkJKFJCQSArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3JjYSwgZXh0cmFjdF9yY2EgfSwKLQotICAvKiBUaGUgUkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERSQzEJCShSQ0EgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkIgKi8KLSNkZWZpbmUgRFJDMgkJKERSQzEgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERGQzEJCShEUkMyICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIEZDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBERkMyCQkoREZDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9GUFJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgdW5zaWduZWQgOC1iaXQgbGl0ZXJhbCBvZiBPcGVyYXRlIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBMSVQJCShERkMyICsgMSkKLSAgeyA4LCAxMywgLUxJVCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgb2YgTWVtb3J5IGZvcm1hdCBpbnNucy4gIEZyb20gaGVyZQotICAgICB3ZSBjYW4ndCB0ZWxsIHdoYXQgcmVsb2NhdGlvbiBzaG91bGQgYmUgdXNlZCwgc28gZG9uJ3QgdXNlIGEgZGVmYXVsdC4gKi8KLSNkZWZpbmUgTURJU1AJCShMSVQgKyAxKQotICB7IDE2LCAwLCAtTURJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgIjIzLWJpdCIgYWxpZ25lZCBkaXNwbGFjZW1lbnQgb2YgQnJhbmNoIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBCRElTUAkJKE1ESVNQICsgMSkKLSAgeyAyMSwgMCwgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLCAKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRSwgaW5zZXJ0X2JkaXNwLCBleHRyYWN0X2JkaXNwIH0sCi0KLSAgLyogVGhlIDI2LWJpdCBQQUxjb2RlIGZ1bmN0aW9uICovCi0jZGVmaW5lIFBBTEZOCQkoQkRJU1AgKyAxKQotICB7IDI2LCAwLCAtUEFMRk4sIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIHNpZ25lZCAiMTYtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiB0aGUgSk1QL0pTUiBoaW50ICovCi0jZGVmaW5lIEpNUEhJTlQJCShQQUxGTiArIDEpCi0gIHsgMTQsIDAsIEJGRF9SRUxPQ19BTFBIQV9ISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9qaGludCwgZXh0cmFjdF9qaGludCB9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBoaW50IHRvIFJFVC9KU1JfQ09ST1VUSU5FICovCi0jZGVmaW5lIFJFVEhJTlQJCShKTVBISU5UICsgMSkKLSAgeyAxNCwgMCwgLVJFVEhJTlQsCi0gICAgQVhQX09QRVJBTkRfVU5TSUdORUR8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPLCAwLCAwIH0sCi0KLSAgLyogVGhlIDEyLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldls0Nl0gaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNEhXRElTUAkoUkVUSElOVCArIDEpCi0jZGVmaW5lIEVWNkhXRElTUAkoRVY0SFdESVNQKQotICB7IDEyLCAwLCAtRVY0SFdESVNQLCBBWFBfT1BFUkFORF9TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgNS1iaXQgaW5kZXggZm9yIHRoZSBldjQgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNEhXSU5ERVgJKEVWNEhXRElTUCArIDEpCi0gIHsgNSwgMCwgLUVWNEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDgtYml0IGluZGV4IGZvciB0aGUgb2RkbHkgdW5xdWFsaWZpZWQgaHdfbVt0Zl1wciBpbnNucwotICAgICB0aGF0IG9jY3VyIGluIERFQyBQQUxjb2RlLiAgKi8KLSNkZWZpbmUgRVY0RVhUSFdJTkRFWAkoRVY0SFdJTkRFWCArIDEpCi0gIHsgOCwgMCwgLUVWNEVYVEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEwLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldjUgaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNUhXRElTUAkoRVY0RVhUSFdJTkRFWCArIDEpCi0gIHsgMTAsIDAsIC1FVjVIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgaW5kZXggZm9yIHRoZSBldjUgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNUhXSU5ERVgJKEVWNUhXRElTUCArIDEpCi0gIHsgMTYsIDAsIC1FVjVIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgY29tYmluZWQgaW5kZXgvc2NvcmVib2FyZCBtYXNrIGZvciB0aGUgZXY2Ci0gICAgIGh3X21bZnRdcHIgKHBhbDE5L3BhbDFkKSBpbnNucyAqLwotI2RlZmluZSBFVjZIV0lOREVYCShFVjVIV0lOREVYICsgMSkKLSAgeyAxNiwgMCwgLUVWNkhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEzLWJpdCBicmFuY2ggaGludCBmb3IgdGhlIGV2NiBod19qbXAvanNyIChwYWwxZSkgaW5zbiAqLwotI2RlZmluZSBFVjZIV0pNUEhJTlQJKEVWNkhXSU5ERVgrIDEpCi0gIHsgOCwgMCwgLUVWNkhXSk1QSElOVCwKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRXxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk98QVhQX09QRVJBTkRfTk9PVkVSRkxPVywKLSAgICBpbnNlcnRfZXY2aHdqaGludCwgZXh0cmFjdF9ldjZod2poaW50IH0KLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGVyYW5kcyA9IHNpemVvZihhbHBoYV9vcGVyYW5kcykvc2l6ZW9mKCphbHBoYV9vcGVyYW5kcyk7Ci0KLS8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBSQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnNuLgotICAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBmYWtlLiAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcwotICAgdGhlIFJBIGZpZWxkIGludG8gdGhlIFJCIGZpZWxkLCBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdAotICAgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfcmJhKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfcmJhKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIHNhbWUgZm9yIHRoZSBSQyBmaWVsZCAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JjYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgoaW5zbiA+PiAyMSkgJiAweDFmKTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF9yY2EoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoaW5zbiAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogRmFrZSBhcmd1bWVudHMgaW4gd2hpY2ggdGhlIHJlZ2lzdGVycyBtdXN0IGJlIHNldCB0byBaRVJPICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfemEoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoMzEgPDwgMjEpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3phKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3piKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YihpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YyhpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8IDMxOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3pjKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmIChpbnNuICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZGlzcGxhY2VtZW50IGZpZWxkIG9mIGEgQnJhbmNoIGZvcm1hdCBpbnNuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfYmRpc3AoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKU5VTEwgJiYgKHZhbHVlICYgMykpCi0gICAgKmVycm1zZyA9IF8oImJyYW5jaCBvcGVyYW5kIHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4MUZGRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2JkaXNwKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDFGRkZGRikgXiAweDEwMDAwMCkgLSAweDEwMDAwMCk7Ci19Ci0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYSBKTVAvSlNSIGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9qaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4M0ZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9qaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgzRkZGKSBeIDB4MjAwMCkgLSAweDIwMDApOwotfQotCi0vKiBUaGUgaGludCBmaWVsZCBvZiBhbiBFVjYgSFdfSk1QL0pTUiBpbnNuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfZXY2aHdqaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4MUZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9ldjZod2poaW50KGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDFGRkYpIF4gMHgxMDAwKSAtIDB4MTAwMCk7Ci19Ci0KLQwKLS8qIE1hY3JvcyB1c2VkIHRvIGZvcm0gb3Bjb2RlcyAqLwotCi0vKiBUaGUgbWFpbiBvcGNvZGUgKi8KLSNkZWZpbmUgT1AoeCkJCSgoKHgpICYgMHgzRikgPDwgMjYpCi0jZGVmaW5lIE9QX01BU0sJCTB4RkMwMDAwMDAKLQotLyogQnJhbmNoIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgQlJBXyhvbykJT1Aob28pCi0jZGVmaW5lIEJSQV9NQVNLCU9QX01BU0sKLSNkZWZpbmUgQlJBKG9vKQkJQlJBXyhvbyksIEJSQV9NQVNLCi0KLS8qIEZsb2F0aW5nIHBvaW50IGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgRlBfKG9vLGZmZikJKE9QKG9vKSB8ICgoKGZmZikgJiAweDdGRikgPDwgNSkpCi0jZGVmaW5lIEZQX01BU0sJCShPUF9NQVNLIHwgMHhGRkUwKQotI2RlZmluZSBGUChvbyxmZmYpCUZQXyhvbyxmZmYpLCBGUF9NQVNLCi0KLS8qIE1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE1FTV8ob28pCU9QKG9vKQotI2RlZmluZSBNRU1fTUFTSwlPUF9NQVNLCi0jZGVmaW5lIE1FTShvbykJCU1FTV8ob28pLCBNRU1fTUFTSwotCi0vKiBNZW1vcnkvRnVuYyBDb2RlIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUZDXyhvbyxmZmZmKQkoT1Aob28pIHwgKChmZmZmKSAmIDB4RkZGRikpCi0jZGVmaW5lIE1GQ19NQVNLCShPUF9NQVNLIHwgMHhGRkZGKQotI2RlZmluZSBNRkMob28sZmZmZikJTUZDXyhvbyxmZmZmKSwgTUZDX01BU0sKLQotLyogTWVtb3J5L0JyYW5jaCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE1CUl8ob28saCkJKE9QKG9vKSB8ICgoKGgpICYgMykgPDwgMTQpKQotI2RlZmluZSBNQlJfTUFTSwkoT1BfTUFTSyB8IDB4QzAwMCkKLSNkZWZpbmUgTUJSKG9vLGgpCU1CUl8ob28saCksIE1CUl9NQVNLCi0KLS8qIE9wZXJhdGUgZm9ybWF0IGluc3RydWN0aW9ucy4gIFRoZSBPUFJMIHZhcmlhbnQgc3BlY2lmaWVzIGEKLSAgIGxpdGVyYWwgc2Vjb25kIGFyZ3VtZW50LiAqLwotI2RlZmluZSBPUFJfKG9vLGZmKQkoT1Aob28pIHwgKCgoZmYpICYgMHg3RikgPDwgNSkpCi0jZGVmaW5lIE9QUkxfKG9vLGZmKQkoT1BSXygob28pLChmZikpIHwgMHgxMDAwKQotI2RlZmluZSBPUFJfTUFTSwkoT1BfTUFTSyB8IDB4MUZFMCkKLSNkZWZpbmUgT1BSKG9vLGZmKQlPUFJfKG9vLGZmKSwgT1BSX01BU0sKLSNkZWZpbmUgT1BSTChvbyxmZikJT1BSTF8ob28sZmYpLCBPUFJfTUFTSwotCi0vKiBHZW5lcmljIFBBTGNvZGUgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQQ0RfKG9vKQlPUChvbykKLSNkZWZpbmUgUENEX01BU0sJT1BfTUFTSwotI2RlZmluZSBQQ0Qob28pCQlQQ0RfKG9vKSwgUENEX01BU0sKLQotLyogU3BlY2lmaWMgUEFMY29kZSBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgU1BDRF8ob28sZmZmZikJKE9QKG9vKSB8ICgoZmZmZikgJiAweDNGRkZGRkYpKQotI2RlZmluZSBTUENEX01BU0sJMHhGRkZGRkZGRgotI2RlZmluZSBTUENEKG9vLGZmZmYpCVNQQ0RfKG9vLGZmZmYpLCBTUENEX01BU0sKLQotLyogSGFyZHdhcmUgbWVtb3J5IChod197bGQsc3R9KSBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgRVY0SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4RikgPDwgMTIpKQotI2RlZmluZSBFVjRIV01FTV9NQVNLCShPUF9NQVNLIHwgMHhGMDAwKQotI2RlZmluZSBFVjRIV01FTShvbyxmKQlFVjRIV01FTV8ob28sZiksIEVWNEhXTUVNX01BU0sKLQotI2RlZmluZSBFVjVIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHgzRikgPDwgMTApKQotI2RlZmluZSBFVjVIV01FTV9NQVNLCShPUF9NQVNLIHwgMHhGODAwKQotI2RlZmluZSBFVjVIV01FTShvbyxmKQlFVjVIV01FTV8ob28sZiksIEVWNUhXTUVNX01BU0sKLQotI2RlZmluZSBFVjZIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHhGKSA8PCAxMikpCi0jZGVmaW5lIEVWNkhXTUVNX01BU0sJKE9QX01BU0sgfCAweEYwMDApCi0jZGVmaW5lIEVWNkhXTUVNKG9vLGYpCUVWNkhXTUVNXyhvbyxmKSwgRVY2SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNkhXTUJSXyhvbyxoKQkoT1Aob28pIHwgKCgoaCkgJiA3KSA8PCAxMykpCi0jZGVmaW5lIEVWNkhXTUJSX01BU0sJKE9QX01BU0sgfCAweEUwMDApCi0jZGVmaW5lIEVWNkhXTUJSKG9vLGgpCUVWNkhXTUJSXyhvbyxoKSwgRVY2SFdNQlJfTUFTSwotCi0vKiBBYmJyZXZpYXRpb25zIGZvciBpbnN0cnVjdGlvbiBzdWJzZXRzLiAgKi8KLSNkZWZpbmUgQkFTRQkJCUFYUF9PUENPREVfQkFTRQotI2RlZmluZSBFVjQJCQlBWFBfT1BDT0RFX0VWNAotI2RlZmluZSBFVjUJCQlBWFBfT1BDT0RFX0VWNQotI2RlZmluZSBFVjYJCQlBWFBfT1BDT0RFX0VWNgotI2RlZmluZSBCV1gJCQlBWFBfT1BDT0RFX0JXWAotI2RlZmluZSBDSVgJCQlBWFBfT1BDT0RFX0NJWAotI2RlZmluZSBNQVgJCQlBWFBfT1BDT0RFX01BWAotCi0vKiBDb21tb24gY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cyAqLwotI2RlZmluZSBBUkdfTk9ORQkJeyAwIH0KLSNkZWZpbmUgQVJHX0JSQQkJCXsgUkEsIEJESVNQIH0KLSNkZWZpbmUgQVJHX0ZCUkEJCXsgRkEsIEJESVNQIH0KLSNkZWZpbmUgQVJHX0ZQCQkJeyBGQSwgRkIsIERGQzEgfQotI2RlZmluZSBBUkdfRlBaMQkJeyBaQSwgRkIsIERGQzEgfQotI2RlZmluZSBBUkdfTUVNCQkJeyBSQSwgTURJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19GTUVNCQl7IEZBLCBNRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX09QUgkJCXsgUkEsIFJCLCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUkwJCXsgUkEsIExJVCwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJaMQkJeyBaQSwgUkIsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSTFoxCQl7IFpBLCBMSVQsIFJDIH0KLSNkZWZpbmUgQVJHX1BDRAkJCXsgUEFMRk4gfQotI2RlZmluZSBBUkdfRVY0SFdNRU0JCXsgUkEsIEVWNEhXRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0VWNEhXTVBSCQl7IFJBLCBSQkEsIEVWNEhXSU5ERVggfQotI2RlZmluZSBBUkdfRVY1SFdNRU0JCXsgUkEsIEVWNUhXRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0VWNkhXTUVNCQl7IFJBLCBFVjZIV0RJU1AsIFBSQiB9Ci0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUgT1BDT0RFIE1BU0sgeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUJCWlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgT1BDT0RFCWlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0KLSAgIE1BU0sJCWlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICAgICAgICAgCXdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0KLSAgIE9QRVJBTkRTCWlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgcHJlY2VkaW5nIG1hY3JvcyBtZXJnZSB0aGUgdGV4dCBvZiB0aGUgT1BDT0RFIGFuZCBNQVNLIGZpZWxkcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuCi0KLSAgIE90aGVyd2lzZSwgaXQgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBhbmQgbWlub3IgZnVuY3Rpb24gY29kZS4KLQotICAgVGhlcmUgYXJlIHRocmVlIGNsYXNzZXMgb2Ygbm90LXJlYWxseS1pbnN0cnVjdGlvbnMgaW4gdGhpcyB0YWJsZToKLQotICAgQUxJQVMJaXMgYW5vdGhlciBuYW1lIGZvciBhbm90aGVyIGluc3RydWN0aW9uLiAgU29tZSBvZgotCQl0aGVzZSBjb21lIGZyb20gdGhlIEFyY2hpdGVjdHVyZSBIYW5kYm9vaywgc29tZQotCQljb21lIGZyb20gdGhlIG9yaWdpbmFsIGdhcyBvcGNvZGUgdGFibGVzLiAgSW4gYWxsCi0JCWNhc2VzLCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3Bjb2RlIGlzIHVuY2hhbmdlZC4KLQotICAgUFNFVURPCWEgc3R5bGl6ZWQgY29kZSBmb3JtIGVuZG9yc2VkIGJ5IENoYXB0ZXIgQS40IG9mIHRoZQotCQlBcmNoaXRlY3R1cmUgSGFuZGJvb2suCi0KLSAgIEVYVFJBCWEgc3R5bGl6ZWQgY29kZSBmb3JtIGZvdW5kIGluIHRoZSBvcmlnaW5hbCBnYXMgdGFibGVzLgotCi0gICBBbmQgdHdvIGFubm90YXRpb25zOgotCi0gICBFVjU2IEJVVAlvcGNvZGVzIHRoYXQgYXJlIG9mZmljaWFsbHkgaW50cm9kdWNlZCBhcyBvZiB0aGUgZXY1NiwKLSAgIAkJYnV0IHdpdGggZGVmaW5lZCByZXN1bHRzIG9uIHByZXZpb3VzIGltcGxlbWVudGF0aW9ucy4KLQotICAgRVY1NiBVTkEJb3Bjb2RlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBhcyBvZiB0aGUgZXY1NiB3aXRoCi0gICAJCXByZXN1bWFibHkgdW5kZWZpbmVkIHJlc3VsdHMgb24gcHJldmlvdXMgaW1wbGVtZW50YXRpb25zCi0JCXRoYXQgd2VyZSBub3QgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbi4KLSovCi0KLWNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgYWxwaGFfb3Bjb2Rlc1tdID0gewotICB7ICJoYWx0IiwJCVNQQ0QoMHgwMCwweDAwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJkcmFpbmEiLAkJU1BDRCgweDAwLDB4MDAwMiksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImJwdCIsCQlTUENEKDB4MDAsMHgwMDgwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiY2FsbHN5cyIsCQlTUENEKDB4MDAsMHgwMDgzKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiY2htayIsIAkJU1BDRCgweDAwLDB4MDA4MyksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImltYiIsCQlTUENEKDB4MDAsMHgwMDg2KSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiY2FsbF9wYWwiLAkJUENEKDB4MDApLCBCQVNFLCBBUkdfUENEIH0sCi0gIHsgInBhbCIsCQlQQ0QoMHgwMCksIEJBU0UsIEFSR19QQ0QgfSwJCS8qIGFsaWFzICovCi0KLSAgeyAibGRhIiwJCU1FTSgweDA4KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZGFoIiwJCU1FTSgweDA5KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZGJ1IiwJCU1FTSgweDBBKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInVub3AiLAkJTUVNKDB4MEIpLCBCQVNFLCB7IFpBIH0gfSwJCS8qIHBzZXVkbyAqLwotICB7ICJsZHFfdSIsCQlNRU0oMHgwQiksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGR3dSIsCQlNRU0oMHgwQyksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdHciLAkJTUVNKDB4MEQpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3RiIiwJCU1FTSgweDBFKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0cV91IiwJCU1FTSgweDBGKSwgQkFTRSwgQVJHX01FTSB9LAotCi0gIHsgInNleHRsIiwJCU9QUigweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgInNleHRsIiwJCU9QUkwoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiYWRkbCIsCQlPUFIoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRsIiwJCU9QUkwoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRhZGRsIiwJCU9QUigweDEwLDB4MDIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0YWRkbCIsCQlPUFJMKDB4MTAsMHgwMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5lZ2wiLAkJT1BSKDB4MTAsMHgwOSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVnbCIsCQlPUFJMKDB4MTAsMHgwOSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmwiLAkJT1BSKDB4MTAsMHgwOSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VibCIsCQlPUFJMKDB4MTAsMHgwOSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0c3VibCIsCQlPUFIoMHgxMCwweDBCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNHN1YmwiLAkJT1BSTCgweDEwLDB4MEIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBiZ2UiLAkJT1BSKDB4MTAsMHgwRiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wYmdlIiwJCU9QUkwoMHgxMCwweDBGKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhhZGRsIiwJCU9QUigweDEwLDB4MTIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4YWRkbCIsCQlPUFJMKDB4MTAsMHgxMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4c3VibCIsCQlPUFIoMHgxMCwweDFCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOHN1YmwiLAkJT1BSTCgweDEwLDB4MUIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXB1bHQiLAkJT1BSKDB4MTAsMHgxRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wdWx0IiwJCU9QUkwoMHgxMCwweDFEKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYWRkcSIsCQlPUFIoMHgxMCwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRxIiwJCU9QUkwoMHgxMCwweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRhZGRxIiwJCU9QUigweDEwLDB4MjIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0YWRkcSIsCQlPUFJMKDB4MTAsMHgyMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5lZ3EiLCAJCU9QUigweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ3EiLCAJCU9QUkwoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicSIsCQlPUFIoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJxIiwJCU9QUkwoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRzdWJxIiwJCU9QUigweDEwLDB4MkIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0c3VicSIsCQlPUFJMKDB4MTAsMHgyQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGVxIiwJCU9QUigweDEwLDB4MkQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGVxIiwJCU9QUkwoMHgxMCwweDJEKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhhZGRxIiwJCU9QUigweDEwLDB4MzIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4YWRkcSIsCQlPUFJMKDB4MTAsMHgzMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4c3VicSIsCQlPUFIoMHgxMCwweDNCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOHN1YnEiLAkJT1BSTCgweDEwLDB4M0IpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXB1bGUiLAkJT1BSKDB4MTAsMHgzRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wdWxlIiwJCU9QUkwoMHgxMCwweDNEKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYWRkbC92IiwJCU9QUigweDEwLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZGwvdiIsCQlPUFJMKDB4MTAsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5lZ2wvdiIsCQlPUFIoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdsL3YiLAkJT1BSTCgweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJsL3YiLAkJT1BSKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VibC92IiwJCU9QUkwoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wbHQiLAkJT1BSKDB4MTAsMHg0RCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wbHQiLAkJT1BSTCgweDEwLDB4NEQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRxL3YiLAkJT1BSKDB4MTAsMHg2MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkcS92IiwJCU9QUkwoMHgxMCwweDYwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVncS92IiwJCU9QUigweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ3EvdiIsCQlPUFJMKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnEvdiIsCQlPUFIoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJxL3YiLAkJT1BSTCgweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBsZSIsCQlPUFIoMHgxMCwweDZEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBsZSIsCQlPUFJMKDB4MTAsMHg2RCksIEJBU0UsIEFSR19PUFJMIH0sCi0KLSAgeyAiYW5kIiwJCU9QUigweDExLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFuZCIsCQlPUFJMKDB4MTEsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFuZG5vdCIsCQlPUFIoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJhbmRub3QiLAkJT1BSTCgweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSTCB9LAkvKiBhbGlhcyAqLwotICB7ICJiaWMiLAkJT1BSKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYmljIiwJCU9QUkwoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmxicyIsCQlPUFIoMHgxMSwweDE0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bGJzIiwJCU9QUkwoMHgxMSwweDE0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmxiYyIsCQlPUFIoMHgxMSwweDE2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bGJjIiwJCU9QUkwoMHgxMSwweDE2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibm9wIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCB7IFpBLCBaQiwgWkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY2xyIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCB7IFpBLCBaQiwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUigweDExLDB4MjApLCBCQVNFLCB7IFpBLCBSQiwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUigweDExLDB4MjApLCBCQVNFLCB7IFJBLCBSQkEsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm1vdiIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIExJVCwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAib3IiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAib3IiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAkvKiBhbGlhcyAqLwotICB7ICJiaXMiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYmlzIiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmVxIiwJCU9QUigweDExLDB4MjQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZlcSIsCQlPUFJMKDB4MTEsMHgyNCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZuZSIsCQlPUFIoMHgxMSwweDI2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bmUiLAkJT1BSTCgweDExLDB4MjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJub3QiLAkJT1BSKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibm90IiwJCU9QUkwoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAib3Jub3QiLAkJT1BSKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAib3Jub3QiLAkJT1BSTCgweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ4b3IiLAkJT1BSKDB4MTEsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAieG9yIiwJCU9QUkwoMHgxMSwweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmx0IiwJCU9QUigweDExLDB4NDQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsdCIsCQlPUFJMKDB4MTEsMHg0NCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZnZSIsCQlPUFIoMHgxMSwweDQ2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92Z2UiLAkJT1BSTCgweDExLDB4NDYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJlcXYiLAkJT1BSKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXF2IiwJCU9QUkwoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAieG9ybm90IiwJCU9QUigweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgInhvcm5vdCIsCQlPUFJMKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImFtYXNrIiwJCU9QUigweDExLDB4NjEpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogZXY1NiBidXQgKi8KLSAgeyAiYW1hc2siLAkJT1BSTCgweDExLDB4NjEpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIGV2NTYgYnV0ICovCi0gIHsgImNtb3ZsZSIsCQlPUFIoMHgxMSwweDY0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bGUiLAkJT1BSTCgweDExLDB4NjQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92Z3QiLAkJT1BSKDB4MTEsMHg2NiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmd0IiwJCU9QUkwoMHgxMSwweDY2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW1wbHZlciIsCQlPUFJMXygweDExLDB4NkMpfCgzMTw8MjEpfCgxPDwxMyksCi0gICAgCQkJMHhGRkZGRkZFMCwgQkFTRSwgeyBSQyB9IH0sCQkvKiBldjU2IGJ1dCAqLwotCi0gIHsgIm1za2JsIiwJCU9QUigweDEyLDB4MDIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za2JsIiwJCU9QUkwoMHgxMiwweDAyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0YmwiLAkJT1BSKDB4MTIsMHgwNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0YmwiLAkJT1BSTCgweDEyLDB4MDYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNibCIsCQlPUFIoMHgxMiwweDBCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNibCIsCQlPUFJMKDB4MTIsMHgwQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3dsIiwJCU9QUigweDEyLDB4MTIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3dsIiwJCU9QUkwoMHgxMiwweDEyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0d2wiLAkJT1BSKDB4MTIsMHgxNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0d2wiLAkJT1BSTCgweDEyLDB4MTYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnN3bCIsCQlPUFIoMHgxMiwweDFCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnN3bCIsCQlPUFJMKDB4MTIsMHgxQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za2xsIiwJCU9QUigweDEyLDB4MjIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za2xsIiwJCU9QUkwoMHgxMiwweDIyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0bGwiLAkJT1BSKDB4MTIsMHgyNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0bGwiLAkJT1BSTCgweDEyLDB4MjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNsbCIsCQlPUFIoMHgxMiwweDJCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNsbCIsCQlPUFJMKDB4MTIsMHgyQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInphcCIsCQlPUFIoMHgxMiwweDMwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ6YXAiLAkJT1BSTCgweDEyLDB4MzApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ6YXBub3QiLAkJT1BSKDB4MTIsMHgzMSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiemFwbm90IiwJCU9QUkwoMHgxMiwweDMxKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrcWwiLAkJT1BSKDB4MTIsMHgzMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrcWwiLAkJT1BSTCgweDEyLDB4MzIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzcmwiLAkJT1BSKDB4MTIsMHgzNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3JsIiwJCU9QUkwoMHgxMiwweDM0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0cWwiLAkJT1BSKDB4MTIsMHgzNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0cWwiLAkJT1BSTCgweDEyLDB4MzYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzbGwiLAkJT1BSKDB4MTIsMHgzOSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic2xsIiwJCU9QUkwoMHgxMiwweDM5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zcWwiLAkJT1BSKDB4MTIsMHgzQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zcWwiLAkJT1BSTCgweDEyLDB4M0IpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzcmEiLAkJT1BSKDB4MTIsMHgzQyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3JhIiwJCU9QUkwoMHgxMiwweDNDKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrd2giLAkJT1BSKDB4MTIsMHg1MiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrd2giLAkJT1BSTCgweDEyLDB4NTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnN3aCIsCQlPUFIoMHgxMiwweDU3KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnN3aCIsCQlPUFJMKDB4MTIsMHg1NyksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHdoIiwJCU9QUigweDEyLDB4NUEpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHdoIiwJCU9QUkwoMHgxMiwweDVBKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrbGgiLAkJT1BSKDB4MTIsMHg2MiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrbGgiLAkJT1BSTCgweDEyLDB4NjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNsaCIsCQlPUFIoMHgxMiwweDY3KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNsaCIsCQlPUFJMKDB4MTIsMHg2NyksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dGxoIiwJCU9QUigweDEyLDB4NkEpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dGxoIiwJCU9QUkwoMHgxMiwweDZBKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrcWgiLAkJT1BSKDB4MTIsMHg3MiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrcWgiLAkJT1BSTCgweDEyLDB4NzIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNxaCIsCQlPUFIoMHgxMiwweDc3KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNxaCIsCQlPUFJMKDB4MTIsMHg3NyksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHFoIiwJCU9QUigweDEyLDB4N0EpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHFoIiwJCU9QUkwoMHgxMiwweDdBKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJtdWxsIiwJCU9QUigweDEzLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bGwiLAkJT1BSTCgweDEzLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtdWxxIiwJCU9QUigweDEzLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bHEiLAkJT1BSTCgweDEzLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ1bXVsaCIsCQlPUFIoMHgxMywweDMwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ1bXVsaCIsCQlPUFJMKDB4MTMsMHgzMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bGwvdiIsCQlPUFIoMHgxMywweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxsL3YiLAkJT1BSTCgweDEzLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtdWxxL3YiLAkJT1BSKDB4MTMsMHg2MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVscS92IiwJCU9QUkwoMHgxMywweDYwKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJpdG9mcyIsCQlGUCgweDE0LDB4MDA0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJzcXJ0Zi9jIiwJCUZQKDB4MTQsMHgwMEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL2MiLAkJRlAoMHgxNCwweDAwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAiaXRvZmYiLAkJRlAoMHgxNCwweDAxNCksIENJWCwgeyBSQSwgWkIsIEZDIH0gfSwKLSAgeyAiaXRvZnQiLAkJRlAoMHgxNCwweDAyNCksIENJWCwgeyBSQSwgWkIsIEZDIH0gfSwKLSAgeyAic3FydGcvYyIsCQlGUCgweDE0LDB4MDJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9jIiwJCUZQKDB4MTQsMHgwMkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL20iLAkJRlAoMHgxNCwweDA0QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvbSIsCQlGUCgweDE0LDB4MDZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0ZiIsCQlGUCgweDE0LDB4MDhBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cyIsCQlGUCgweDE0LDB4MDhCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0ZyIsCQlGUCgweDE0LDB4MEFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dCIsCQlGUCgweDE0LDB4MEFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9kIiwJCUZQKDB4MTQsMHgwQ0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L2QiLAkJRlAoMHgxNCwweDBFQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvdWMiLAkJRlAoMHgxNCwweDEwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdWMiLAkJRlAoMHgxNCwweDEwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvdWMiLAkJRlAoMHgxNCwweDEyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvdWMiLAkJRlAoMHgxNCwweDEyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdW0iLAkJRlAoMHgxNCwweDE0QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvdW0iLAkJRlAoMHgxNCwweDE2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvdSIsCQlGUCgweDE0LDB4MThBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91IiwJCUZQKDB4MTQsMHgxOEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3UiLAkJRlAoMHgxNCwweDFBQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvdSIsCQlGUCgweDE0LDB4MUFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91ZCIsCQlGUCgweDE0LDB4MUNCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91ZCIsCQlGUCgweDE0LDB4MUVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zYyIsCQlGUCgweDE0LDB4NDBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zYyIsCQlGUCgweDE0LDB4NDJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zIiwJCUZQKDB4MTQsMHg0OEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3MiLAkJRlAoMHgxNCwweDRBQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvc3VjIiwJRlAoMHgxNCwweDUwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VjIiwJRlAoMHgxNCwweDUwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvc3VjIiwJRlAoMHgxNCwweDUyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VjIiwJRlAoMHgxNCwweDUyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VtIiwJRlAoMHgxNCwweDU0QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VtIiwJRlAoMHgxNCwweDU2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvc3UiLAkJRlAoMHgxNCwweDU4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3UiLAkJRlAoMHgxNCwweDU4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvc3UiLAkJRlAoMHgxNCwweDVBQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3UiLAkJRlAoMHgxNCwweDVBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VkIiwJRlAoMHgxNCwweDVDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VkIiwJRlAoMHgxNCwweDVFQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpYyIsCUZQKDB4MTQsMHg3MEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aWMiLAlGUCgweDE0LDB4NzJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWltIiwJRlAoMHgxNCwweDc0QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpbSIsCUZQKDB4MTQsMHg3NkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aSIsCUZQKDB4MTQsMHg3OEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aSIsCUZQKDB4MTQsMHg3QUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aWQiLAlGUCgweDE0LDB4N0NCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWlkIiwJRlAoMHgxNCwweDdFQiksIENJWCwgQVJHX0ZQWjEgfSwKLQotICB7ICJhZGRmL2MiLAkJRlAoMHgxNSwweDAwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL2MiLAkJRlAoMHgxNSwweDAwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL2MiLAkJRlAoMHgxNSwweDAwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL2MiLAkJRlAoMHgxNSwweDAwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9jIiwJCUZQKDB4MTUsMHgwMUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL2MiLAkJRlAoMHgxNSwweDAyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL2MiLAkJRlAoMHgxNSwweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL2MiLAkJRlAoMHgxNSwweDAyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL2MiLAkJRlAoMHgxNSwweDAyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9jIiwJCUZQKDB4MTUsMHgwMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9jIiwJCUZQKDB4MTUsMHgwMkQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9jIiwJCUZQKDB4MTUsMHgwMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxZi9jIiwJCUZQKDB4MTUsMHgwM0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxZy9jIiwJCUZQKDB4MTUsMHgwM0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmIiwJCUZQKDB4MTUsMHgwODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVnZiIsCQlGUCgweDE1LDB4MDgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmYiLAkJRlAoMHgxNSwweDA4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmIiwJCUZQKDB4MTUsMHgwODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2ZiIsCQlGUCgweDE1LDB4MDgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnIiwJCUZQKDB4MTUsMHgwOUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnIiwJCUZQKDB4MTUsMHgwQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVnZyIsCQlGUCgweDE1LDB4MEExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmciLAkJRlAoMHgxNSwweDBBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnIiwJCUZQKDB4MTUsMHgwQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2ZyIsCQlGUCgweDE1LDB4MEEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdlcSIsCQlGUCgweDE1LDB4MEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsdCIsCQlGUCgweDE1LDB4MEE2KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsZSIsCQlGUCgweDE1LDB4MEE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmIiwJCUZQKDB4MTUsMHgwQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZCIsCQlGUCgweDE1LDB4MEFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EiLAkJRlAoMHgxNSwweDBBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFmIiwJCUZQKDB4MTUsMHgwQkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxZyIsCQlGUCgweDE1LDB4MEJFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi91YyIsCQlGUCgweDE1LDB4MTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvdWMiLAkJRlAoMHgxNSwweDEwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3VjIiwJCUZQKDB4MTUsMHgxMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi91YyIsCQlGUCgweDE1LDB4MTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3VjIiwJCUZQKDB4MTUsMHgxMUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3VjIiwJCUZQKDB4MTUsMHgxMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy91YyIsCQlGUCgweDE1LDB4MTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvdWMiLAkJRlAoMHgxNSwweDEyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3VjIiwJCUZQKDB4MTUsMHgxMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YvdWMiLAkJRlAoMHgxNSwweDEyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3VjIiwJCUZQKDB4MTUsMHgxMkQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS92YyIsCQlGUCgweDE1LDB4MTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi91IiwJCUZQKDB4MTUsMHgxODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi91IiwJCUZQKDB4MTUsMHgxODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi91IiwJCUZQKDB4MTUsMHgxODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi91IiwJCUZQKDB4MTUsMHgxODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvdSIsCQlGUCgweDE1LDB4MTlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy91IiwJCUZQKDB4MTUsMHgxQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy91IiwJCUZQKDB4MTUsMHgxQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy91IiwJCUZQKDB4MTUsMHgxQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy91IiwJCUZQKDB4MTUsMHgxQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YvdSIsCQlGUCgweDE1LDB4MUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvdSIsCQlGUCgweDE1LDB4MUFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvdiIsCQlGUCgweDE1LDB4MUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi9zYyIsCQlGUCgweDE1LDB4NDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc2MiLAkJRlAoMHgxNSwweDQwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3NjIiwJCUZQKDB4MTUsMHg0MDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9zYyIsCQlGUCgweDE1LDB4NDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3NjIiwJCUZQKDB4MTUsMHg0MUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3NjIiwJCUZQKDB4MTUsMHg0MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9zYyIsCQlGUCgweDE1LDB4NDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvc2MiLAkJRlAoMHgxNSwweDQyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3NjIiwJCUZQKDB4MTUsMHg0MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2Yvc2MiLAkJRlAoMHgxNSwweDQyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3NjIiwJCUZQKDB4MTUsMHg0MkQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zYyIsCQlGUCgweDE1LDB4NDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi9zIiwJCUZQKDB4MTUsMHg0ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVnZi9zIiwJCUZQKDB4MTUsMHg0ODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZi9zIiwJCUZQKDB4MTUsMHg0ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zIiwJCUZQKDB4MTUsMHg0ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9zIiwJCUZQKDB4MTUsMHg0ODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvcyIsCQlGUCgweDE1LDB4NDlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zIiwJCUZQKDB4MTUsMHg0QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVnZy9zIiwJCUZQKDB4MTUsMHg0QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZy9zIiwJCUZQKDB4MTUsMHg0QTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zIiwJCUZQKDB4MTUsMHg0QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zIiwJCUZQKDB4MTUsMHg0QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2VxL3MiLAkJRlAoMHgxNSwweDRBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbHQvcyIsCQlGUCgweDE1LDB4NEE2KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsZS9zIiwJCUZQKDB4MTUsMHg0QTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YvcyIsCQlGUCgweDE1LDB4NEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvcyIsCQlGUCgweDE1LDB4NEFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvcyIsCQlGUCgweDE1LDB4NEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi9zdWMiLAkJRlAoMHgxNSwweDUwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3N1YyIsCQlGUCgweDE1LDB4NTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc3VjIiwJCUZQKDB4MTUsMHg1MDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9zdWMiLAkJRlAoMHgxNSwweDUwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zdWMiLAlGUCgweDE1LDB4NTFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zdWMiLAkJRlAoMHgxNSwweDUyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3N1YyIsCQlGUCgweDE1LDB4NTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvc3VjIiwJCUZQKDB4MTUsMHg1MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zdWMiLAkJRlAoMHgxNSwweDUyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zdWMiLAlGUCgweDE1LDB4NTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc3VjIiwJRlAoMHgxNSwweDUyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3N2YyIsCUZQKDB4MTUsMHg1MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3N1IiwJCUZQKDB4MTUsMHg1ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zdSIsCQlGUCgweDE1LDB4NTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc3UiLAkJRlAoMHgxNSwweDU4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3N1IiwJCUZQKDB4MTUsMHg1ODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc3UiLAkJRlAoMHgxNSwweDU5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc3UiLAkJRlAoMHgxNSwweDVBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3N1IiwJCUZQKDB4MTUsMHg1QTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zdSIsCQlGUCgweDE1LDB4NUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc3UiLAkJRlAoMHgxNSwweDVBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zdSIsCQlGUCgweDE1LDB4NUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc3UiLAkJRlAoMHgxNSwweDVBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3N2IiwJCUZQKDB4MTUsMHg1QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotCi0gIHsgImFkZHMvYyIsCQlGUCgweDE2LDB4MDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvYyIsCQlGUCgweDE2LDB4MDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvYyIsCQlGUCgweDE2LDB4MDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvYyIsCQlGUCgweDE2LDB4MDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvYyIsCQlGUCgweDE2LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvYyIsCQlGUCgweDE2LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvYyIsCQlGUCgweDE2LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvYyIsCQlGUCgweDE2LDB4MDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL2MiLAkJRlAoMHgxNiwweDAyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL2MiLAkJRlAoMHgxNiwweDAyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL2MiLAkJRlAoMHgxNiwweDAzQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L2MiLAkJRlAoMHgxNiwweDAzRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvbSIsCQlGUCgweDE2LDB4MDQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvbSIsCQlGUCgweDE2LDB4MDQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvbSIsCQlGUCgweDE2LDB4MDQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvbSIsCQlGUCgweDE2LDB4MDQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvbSIsCQlGUCgweDE2LDB4MDYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvbSIsCQlGUCgweDE2LDB4MDYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvbSIsCQlGUCgweDE2LDB4MDYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvbSIsCQlGUCgweDE2LDB4MDYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL20iLAkJRlAoMHgxNiwweDA2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL20iLAkJRlAoMHgxNiwweDA2RiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL20iLAkJRlAoMHgxNiwweDA3QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L20iLAkJRlAoMHgxNiwweDA3RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMiLAkJRlAoMHgxNiwweDA4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdzIiwgCQlGUCgweDE2LDB4MDgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMiLAkJRlAoMHgxNiwweDA4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzIiwJCUZQKDB4MTYsMHgwODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cyIsCQlGUCgweDE2LDB4MDgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQiLAkJRlAoMHgxNiwweDBBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0IiwgCQlGUCgweDE2LDB4MEExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnQiLAkJRlAoMHgxNiwweDBBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0IiwJCUZQKDB4MTYsMHgwQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dCIsCQlGUCgweDE2LDB4MEEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHR1biIsCQlGUCgweDE2LDB4MEE0KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRlcSIsCQlGUCgweDE2LDB4MEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsdCIsCQlGUCgweDE2LDB4MEE2KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsZSIsCQlGUCgweDE2LDB4MEE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzIiwJCUZQKDB4MTYsMHgwQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cSIsCQlGUCgweDE2LDB4MEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMiLAkJRlAoMHgxNiwweDBCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0IiwJCUZQKDB4MTYsMHgwQkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL2QiLAkJRlAoMHgxNiwweDBDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL2QiLAkJRlAoMHgxNiwweDBDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL2QiLAkJRlAoMHgxNiwweDBDMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL2QiLAkJRlAoMHgxNiwweDBDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L2QiLAkJRlAoMHgxNiwweDBFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L2QiLAkJRlAoMHgxNiwweDBFMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L2QiLAkJRlAoMHgxNiwweDBFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L2QiLAkJRlAoMHgxNiwweDBFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9kIiwJCUZQKDB4MTYsMHgwRUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9kIiwJCUZQKDB4MTYsMHgwRUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9kIiwJCUZQKDB4MTYsMHgwRkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9kIiwJCUZQKDB4MTYsMHgwRkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VjIiwJCUZQKDB4MTYsMHgxMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91YyIsCQlGUCgweDE2LDB4MTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdWMiLAkJRlAoMHgxNiwweDEwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VjIiwJCUZQKDB4MTYsMHgxMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91YyIsCQlGUCgweDE2LDB4MTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdWMiLAkJRlAoMHgxNiwweDEyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VjIiwJCUZQKDB4MTYsMHgxMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91YyIsCQlGUCgweDE2LDB4MTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VjIiwJCUZQKDB4MTYsMHgxMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92YyIsCQlGUCgweDE2LDB4MTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91bSIsCQlGUCgweDE2LDB4MTQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdW0iLAkJRlAoMHgxNiwweDE0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VtIiwJCUZQKDB4MTYsMHgxNDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91bSIsCQlGUCgweDE2LDB4MTQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdW0iLAkJRlAoMHgxNiwweDE2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VtIiwJCUZQKDB4MTYsMHgxNjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91bSIsCQlGUCgweDE2LDB4MTYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdW0iLAkJRlAoMHgxNiwweDE2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91bSIsCQlGUCgweDE2LDB4MTZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdm0iLAkJRlAoMHgxNiwweDE2RiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdSIsCQlGUCgweDE2LDB4MTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdSIsCQlGUCgweDE2LDB4MTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdSIsCQlGUCgweDE2LDB4MTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdSIsCQlGUCgweDE2LDB4MTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdSIsCQlGUCgweDE2LDB4MUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdSIsCQlGUCgweDE2LDB4MUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdSIsCQlGUCgweDE2LDB4MUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdSIsCQlGUCgweDE2LDB4MUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3UiLAkJRlAoMHgxNiwweDFBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3YiLAkJRlAoMHgxNiwweDFBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdWQiLAkJRlAoMHgxNiwweDFDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VkIiwJCUZQKDB4MTYsMHgxQzEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91ZCIsCQlGUCgweDE2LDB4MUMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdWQiLAkJRlAoMHgxNiwweDFDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VkIiwJCUZQKDB4MTYsMHgxRTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91ZCIsCQlGUCgweDE2LDB4MUUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdWQiLAkJRlAoMHgxNiwweDFFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VkIiwJCUZQKDB4MTYsMHgxRTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdWQiLAkJRlAoMHgxNiwweDFFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZkIiwJCUZQKDB4MTYsMHgxRUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRzdCIsCQlGUCgweDE2LDB4MkFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWMiLAkJRlAoMHgxNiwweDUwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1YyIsCQlGUCgweDE2LDB4NTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VjIiwJCUZQKDB4MTYsMHg1MDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWMiLAkJRlAoMHgxNiwweDUwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1YyIsCQlGUCgweDE2LDB4NTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VjIiwJCUZQKDB4MTYsMHg1MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWMiLAkJRlAoMHgxNiwweDUyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1YyIsCQlGUCgweDE2LDB4NTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1YyIsCUZQKDB4MTYsMHg1MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmMiLAlGUCgweDE2LDB4NTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdW0iLAkJRlAoMHgxNiwweDU0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1bSIsCQlGUCgweDE2LDB4NTQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VtIiwJCUZQKDB4MTYsMHg1NDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdW0iLAkJRlAoMHgxNiwweDU0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1bSIsCQlGUCgweDE2LDB4NTYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VtIiwJCUZQKDB4MTYsMHg1NjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdW0iLAkJRlAoMHgxNiwweDU2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1bSIsCQlGUCgweDE2LDB4NTYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1bSIsCUZQKDB4MTYsMHg1NkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdm0iLAlGUCgweDE2LDB4NTZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdSIsCQlGUCgweDE2LDB4NTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Mvc3UiLAkJRlAoMHgxNiwweDU4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzL3N1IiwJCUZQKDB4MTYsMHg1ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdSIsCQlGUCgweDE2LDB4NTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3UiLAkJRlAoMHgxNiwweDU4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1IiwJCUZQKDB4MTYsMHg1QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVndC9zdSIsCQlGUCgweDE2LDB4NUExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnQvc3UiLAkJRlAoMHgxNiwweDVBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1IiwJCUZQKDB4MTYsMHg1QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdSIsCQlGUCgweDE2LDB4NUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHR1bi9zdSIsCUZQKDB4MTYsMHg1QTQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGVxL3N1IiwJRlAoMHgxNiwweDVBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bHQvc3UiLAlGUCgweDE2LDB4NUE2KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsZS9zdSIsCUZQKDB4MTYsMHg1QTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3UiLAkJRlAoMHgxNiwweDVBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2IiwJCUZQKDB4MTYsMHg1QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1ZCIsCQlGUCgweDE2LDB4NUMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VkIiwJCUZQKDB4MTYsMHg1QzEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWQiLAkJRlAoMHgxNiwweDVDMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1ZCIsCQlGUCgweDE2LDB4NUMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VkIiwJCUZQKDB4MTYsMHg1RTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWQiLAkJRlAoMHgxNiwweDVFMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1ZCIsCQlGUCgweDE2LDB4NUUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VkIiwJCUZQKDB4MTYsMHg1RTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VkIiwJRlAoMHgxNiwweDVFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2ZCIsCUZQKDB4MTYsMHg1RUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRzdC9zIiwJCUZQKDB4MTYsMHg2QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1aWMiLAlGUCgweDE2LDB4NzAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VpYyIsCUZQKDB4MTYsMHg3MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWljIiwJRlAoMHgxNiwweDcwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1aWMiLAlGUCgweDE2LDB4NzAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VpYyIsCUZQKDB4MTYsMHg3MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWljIiwJRlAoMHgxNiwweDcyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aWMiLAlGUCgweDE2LDB4NzIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpYyIsCUZQKDB4MTYsMHg3MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpYyIsCUZQKDB4MTYsMHg3MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmljIiwJRlAoMHgxNiwweDcyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL3N1aWMiLAlGUCgweDE2LDB4NzNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpYyIsCUZQKDB4MTYsMHg3M0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1aW0iLAlGUCgweDE2LDB4NzQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VpbSIsCUZQKDB4MTYsMHg3NDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWltIiwJRlAoMHgxNiwweDc0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1aW0iLAlGUCgweDE2LDB4NzQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VpbSIsCUZQKDB4MTYsMHg3NjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWltIiwJRlAoMHgxNiwweDc2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aW0iLAlGUCgweDE2LDB4NzYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpbSIsCUZQKDB4MTYsMHg3NjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpbSIsCUZQKDB4MTYsMHg3NkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmltIiwJRlAoMHgxNiwweDc2RiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL3N1aW0iLAlGUCgweDE2LDB4NzdDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpbSIsCUZQKDB4MTYsMHg3N0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1aSIsCQlGUCgweDE2LDB4NzgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Mvc3VpIiwgCUZQKDB4MTYsMHg3ODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3Vicy9zdWkiLAkJRlAoMHgxNiwweDc4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aSIsCQlGUCgweDE2LDB4NzgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpIiwJCUZQKDB4MTYsMHg3ODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWkiLAkJRlAoMHgxNiwweDdBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0L3N1aSIsIAlGUCgweDE2LDB4N0ExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnQvc3VpIiwJCUZQKDB4MTYsMHg3QTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWkiLAkJRlAoMHgxNiwweDdBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aSIsCQlGUCgweDE2LDB4N0EzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aSIsCUZQKDB4MTYsMHg3QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmkiLAlGUCgweDE2LDB4N0FGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpIiwJRlAoMHgxNiwweDdCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aSIsCUZQKDB4MTYsMHg3QkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1aWQiLAlGUCgweDE2LDB4N0MwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VpZCIsCUZQKDB4MTYsMHg3QzEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWlkIiwJRlAoMHgxNiwweDdDMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1aWQiLAlGUCgweDE2LDB4N0MzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VpZCIsCUZQKDB4MTYsMHg3RTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWlkIiwJRlAoMHgxNiwweDdFMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aWQiLAlGUCgweDE2LDB4N0UyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpZCIsCUZQKDB4MTYsMHg3RTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpZCIsCUZQKDB4MTYsMHg3RUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmlkIiwJRlAoMHgxNiwweDdFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL3N1aWQiLAlGUCgweDE2LDB4N0ZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpZCIsCUZQKDB4MTYsMHg3RkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotCi0gIHsgImN2dGxxIiwJCUZQKDB4MTcsMHgwMTApLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJmbm9wIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IFpBLCBaQiwgWkMgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZmNsciIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBaQSwgWkIsIEZDIH0gfSwJLyogcHNldWRvICovCi0gIHsgImZhYnMiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJmbW92IiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IEZBLCBSQkEsIEZDIH0gfSwgLyogcHNldWRvICovCi0gIHsgImNweXMiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmbmVnIiwJCUZQKDB4MTcsMHgwMjEpLCBCQVNFLCB7IEZBLCBSQkEsIEZDIH0gfSwgLyogcHNldWRvICovCi0gIHsgImNweXNuIiwJCUZQKDB4MTcsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3B5c2UiLAkJRlAoMHgxNywweDAyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdF9mcGNyIiwJCUZQKDB4MTcsMHgwMjQpLCBCQVNFLCB7IEZBLCBSQkEsIFJDQSB9IH0sCi0gIHsgIm1mX2ZwY3IiLAkJRlAoMHgxNywweDAyNSksIEJBU0UsIHsgRkEsIFJCQSwgUkNBIH0gfSwKLSAgeyAiZmNtb3ZlcSIsCQlGUCgweDE3LDB4MDJBKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bmUiLAkJRlAoMHgxNywweDAyQiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmx0IiwJCUZQKDB4MTcsMHgwMkMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZnZSIsCQlGUCgweDE3LDB4MDJEKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bGUiLAkJRlAoMHgxNywweDAyRSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmd0IiwJCUZQKDB4MTcsMHgwMkYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0cWwiLAkJRlAoMHgxNywweDAzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFsL3YiLAkJRlAoMHgxNywweDEzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFsL3N2IiwJCUZQKDB4MTcsMHg1MzApLCBCQVNFLCBBUkdfRlBaMSB9LAotCi0gIHsgInRyYXBiIiwJCU1GQygweDE4LDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImRyYWludCIsCQlNRkMoMHgxOCwweDAwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAkvKiBhbGlhcyAqLwotICB7ICJleGNiIiwJCU1GQygweDE4LDB4MDQwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgIm1iIiwJCU1GQygweDE4LDB4NDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgIndtYiIsCQlNRkMoMHgxOCwweDQ0MDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJmZXRjaCIsCQlNRkMoMHgxOCwweDgwMDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAotICB7ICJmZXRjaF9tIiwJCU1GQygweDE4LDB4QTAwMCksIEJBU0UsIHsgWkEsIFBSQiB9IH0sCi0gIHsgInJwY2MiLAkJTUZDKDB4MTgsMHhDMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgInJjIiwJCU1GQygweDE4LDB4RTAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJlY2IiLAkJTUZDKDB4MTgsMHhFODAwKSwgQkFTRSwgeyBaQSwgUFJCIH0gfSwJLyogZXY1NiB1bmEgKi8KLSAgeyAicnMiLAkJTUZDKDB4MTgsMHhGMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgIndoNjQiLAkJTUZDKDB4MTgsMHhGODAwKSwgQkFTRSwgeyBaQSwgUFJCIH0gfSwJLyogZXY1NiB1bmEgKi8KLQotICB7ICJod19tZnByIiwJCU9QUigweDE5LDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwciIsCQlPUCgweDE5KSwgT1BfTUFTSywgRVY2LCB7IFJBLCBaQiwgRVY2SFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIvaSIsCU9QUigweDE5LDB4MDEpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL2EiLAlPUFIoMHgxOSwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9haSIsCU9QUigweDE5LDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3AiLAlPUFIoMHgxOSwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9waSIsCU9QUigweDE5LDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BhIiwJT1BSKDB4MTksMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGFpIiwJT1BSKDB4MTksMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgInBhbDE5IiwJCVBDRCgweDE5KSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImptcCIsCQlNQlIoMHgxQSwwKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCi0gIHsgImpzciIsCQlNQlIoMHgxQSwxKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCi0gIHsgInJldCIsCQlNQlIoMHgxQSwyKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCi0gIHsgImpjciIsCQlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sIC8qIGFsaWFzICovCi0gIHsgImpzcl9jb3JvdXRpbmUiLAlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCi0KLSAgeyAiaHdfbGRsIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsIiwJCUVWNUhXTUVNKDB4MUIsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbCIsCQlFVjZIV01FTSgweDFCLDB4OCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY2SFdNRU0oMHgxQiwweEMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvYWwiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXIiLAlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXciLAlFVjVIV01FTSgweDFCLDB4MTgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjZIV01FTSgweDFCLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYSIsCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXIiLAlFVjRIV01FTSgweDFCLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BsIiwJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ByIiwJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcHYiLAlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9yIiwJCUVWNEhXTUVNKDB4MUIsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3YiLAkJRVY2SFdNRU0oMHgxQiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvdmwiLAlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdyIsCQlFVjZIV01FTSgweDFCLDB4QSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC93YSIsCUVWNkhXTUVNKDB4MUIsMHhFKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3dsIiwJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3AiLAlFVjZIV01FTSgweDFCLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC92IiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNEhXTUVNKDB4MUIsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjZIV01FTSgweDFCLDB4OSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNEhXTUVNKDB4MUIsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY1SFdNRU0oMHgxQiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY2SFdNRU0oMHgxQiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvYWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXIiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXciLAlFVjVIV01FTSgweDFCLDB4MWMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2wiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjZIV01FTSgweDFCLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXIiLAlFVjRIV01FTSgweDFCLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXciLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ByIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcHYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9yIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3YiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3YiLAkJRVY2SFdNRU0oMHgxQiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvdmwiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdyIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdyIsCQlFVjZIV01FTSgweDFCLDB4QiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS93YSIsCUVWNkhXTUVNKDB4MUIsMHhGKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3dsIiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3AiLAlFVjZIV01FTSgweDFCLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC92IiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQiLAkJRVY0SFdNRU0oMHgxQiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYSIsCQlFVjVIV01FTSgweDFCLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hbCIsCQlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2FxIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxbCIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hciIsCQlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2FycSIsCUVWNEhXTUVNKDB4MUIsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXYiLAkJRVY1SFdNRU0oMHgxQiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXciLAkJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxIiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cXYiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhIiwJCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGEiLAkJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxIiwJRVY0SFdNRU0oMHgxQiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXEiLAlFVjVIV01FTSgweDFCLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXFsIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxdiIsCUVWNUhXTUVNKDB4MUIsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcXZsIiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXJxIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3EiLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3F2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGwiLAkJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHEiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wcSIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcWwiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcXYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcXZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHIiLAkJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wcnEiLAlFVjRIV01FTSgweDFCLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3B2IiwJCUVWNUhXTUVNKDB4MUIsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3IiwJCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cSIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cWwiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3F2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxdmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3EiLAkJRVY1SFdNRU0oMHgxQiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcWwiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcXYiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcXZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3JxIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvdiIsCQlFVjVIV01FTSgweDFCLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC92bCIsCQlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93IiwJCUVWNUhXTUVNKDB4MUIsMHgwOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dsIiwJCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxIiwJCUVWNUhXTUVNKDB4MUIsMHgwYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxbCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxdiIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3dxdmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93diIsCQlFVjVIV01FTSgweDFCLDB4MGEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJwYWwxYiIsCQlQQ0QoMHgxQiksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJzZXh0YiIsCQlPUFIoMHgxQywgMHgwMCksIEJXWCwgQVJHX09QUloxIH0sCi0gIHsgInNleHR3IiwJCU9QUigweDFDLCAweDAxKSwgQldYLCBBUkdfT1BSWjEgfSwKLSAgeyAiY3Rwb3AiLAkJT1BSKDB4MUMsIDB4MzApLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJwZXJyIiwJCU9QUigweDFDLCAweDMxKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgImN0bHoiLAkJT1BSKDB4MUMsIDB4MzIpLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJjdHR6IiwJCU9QUigweDFDLCAweDMzKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAidW5wa2J3IiwJCU9QUigweDFDLCAweDM0KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAidW5wa2JsIiwJCU9QUigweDFDLCAweDM1KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGt3YiIsCQlPUFIoMHgxQywgMHgzNiksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInBrbGIiLAkJT1BSKDB4MUMsIDB4MzcpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJtaW5zYjgiLCAJCU9QUigweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnNiOCIsIAkJT1BSTCgweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW5zdzQiLCAJCU9QUigweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnN3NCIsIAkJT1BSTCgweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW51YjgiLCAJCU9QUigweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnViOCIsIAkJT1BSTCgweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtaW51dzQiLCAJCU9QUigweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1pbnV3NCIsIAkJT1BSTCgweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXh1YjgiLAkJT1BSKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4dWI4IiwJCU9QUkwoMHgxQywgMHgzQyksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4dXc0IiwJCU9QUigweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHV3NCIsCQlPUFJMKDB4MUMsIDB4M0QpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHNiOCIsCQlPUFIoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXhzYjgiLAkJT1BSTCgweDFDLCAweDNFKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXhzdzQiLAkJT1BSKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4c3c0IiwJCU9QUkwoMHgxQywgMHgzRiksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAiZnRvaXQiLAkJRlAoMHgxQywgMHg3MCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKLSAgeyAiZnRvaXMiLAkJRlAoMHgxQywgMHg3OCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKLQotICB7ICJod19tdHByIiwJCU9QUigweDFELDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwciIsCQlPUCgweDFEKSwgT1BfTUFTSywgRVY2LCB7IFpBLCBSQiwgRVY2SFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIvaSIsIAlPUFIoMHgxRCwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9hIiwgCU9QUigweDFELDB4MDIpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL2FpIiwJT1BSKDB4MUQsMHgwMyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcCIsIAlPUFIoMHgxRCwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9waSIsCU9QUigweDFELDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BhIiwJT1BSKDB4MUQsMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGFpIiwJT1BSKDB4MUQsMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgInBhbDFkIiwJCVBDRCgweDFEKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImh3X3JlaSIsCQlTUENEKDB4MUUsMHgzRkY4MDAwKSwgRVY0fEVWNSwgQVJHX05PTkUgfSwKLSAgeyAiaHdfcmVpX3N0YWxsIiwJU1BDRCgweDFFLDB4M0ZGQzAwMCksIEVWNSwgQVJHX05PTkUgfSwKLSAgeyAiaHdfam1wIiwgCQlFVjZIV01CUigweDFFLDB4MCksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19qc3IiLCAJCUVWNkhXTUJSKDB4MUUsMHgyKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X3JldCIsIAkJRVY2SFdNQlIoMHgxRSwweDQpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2pjciIsIAkJRVY2SFdNQlIoMHgxRSwweDYpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2Nvcm91dGluZSIsCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJod19qbXAvc3RhbGwiLAlFVjZIV01CUigweDFFLDB4MSksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19qc3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDMpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfcmV0L3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDUpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2pjci9zdGFsbCIsIAlFVjZIV01CUigweDFFLDB4NyksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfY29yb3V0aW5lL3N0YWxsIiwgRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sIC8qIGFsaWFzICovCi0gIHsgInBhbDFlIiwJCVBDRCgweDFFKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImh3X3N0bCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwiLAkJRVY2SFdNRU0oMHgxRiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOCAqLwotICB7ICJod19zdGwvYSIsCQlFVjRIV01FTSgweDFGLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hIiwJCUVWNkhXTUVNKDB4MUYsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2FjIiwJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2FyIiwJRVY0SFdNRU0oMHgxRiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvYXYiLAlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjZIV01FTSgweDFGLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYSIsCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wciIsCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3YiLAkJRVY1SFdNRU0oMHgxRiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3AiLAlFVjZIV01FTSgweDFGLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy92IiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjZIV01FTSgweDFGLDB4NSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sIC8qID8/PyA5ICovCi0gIHsgImh3X3N0cS9hIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2EiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2EiLAkJRVY2SFdNRU0oMHgxRiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHEvYWMiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYXIiLAlFVjRIV01FTSgweDFGLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjRIV01FTSgweDFGLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNkhXTUVNKDB4MUYsMHgxKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3ByIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcHYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3IiLAkJRVY0SFdNRU0oMHgxRiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9hIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvYXYiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcCIsCUVWNkhXTUVNKDB4MUYsMHgzKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcGEiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3YiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0IiwJCUVWNUhXTUVNKDB4MUYsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FjIiwJCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXEiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXFjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXF2IiwJRVY1SFdNRU0oMHgxRiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FyIiwJCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXJxIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hdiIsCQlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhIiwJCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGEiLAkJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXJxIiwJRVY0SFdNRU0oMHgxRiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGMiLAkJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHEiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wcSIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcWMiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcXYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcXZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHIiLAkJRVY0SFdNRU0oMHgxRiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wcnEiLAlFVjRIV01FTSgweDFGLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3B2IiwJCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3EiLAkJRVY0SFdNRU0oMHgxRiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9xIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3FjIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3F2IiwJCUVWNUhXTUVNKDB4MUYsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3F2YyIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3IiLAkJRVY0SFdNRU0oMHgxRiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3ZjIiwJCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgInBhbDFmIiwJCVBDRCgweDFGKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgImxkZiIsCQlNRU0oMHgyMCksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkZyIsCQlNRU0oMHgyMSksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkcyIsCQlNRU0oMHgyMiksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgImxkdCIsCQlNRU0oMHgyMyksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0ZiIsCQlNRU0oMHgyNCksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0ZyIsCQlNRU0oMHgyNSksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0cyIsCQlNRU0oMHgyNiksIEJBU0UsIEFSR19GTUVNIH0sCi0gIHsgInN0dCIsCQlNRU0oMHgyNyksIEJBU0UsIEFSR19GTUVNIH0sCi0KLSAgeyAibGRsIiwJCU1FTSgweDI4KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHEiLAkJTUVNKDB4MjkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkbF9sIiwJCU1FTSgweDJBKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHFfbCIsCQlNRU0oMHgyQiksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RsIiwJCU1FTSgweDJDKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdHEiLAkJTUVNKDB4MkQpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0bF9jIiwJCU1FTSgweDJFKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdHFfYyIsCQlNRU0oMHgyRiksIEJBU0UsIEFSR19NRU0gfSwKLQotICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIHsgWkEsIEJESVNQIH0gfSwJLyogcHNldWRvICovCi0gIHsgImJyIiwJCUJSQSgweDMwKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJmYmVxIiwJCUJSQSgweDMxKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJsdCIsCQlCUkEoMHgzMiksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZibGUiLAkJQlJBKDB4MzMpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJic3IiLAkJQlJBKDB4MzQpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImZibmUiLAkJQlJBKDB4MzUpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmdlIiwJCUJSQSgweDM2KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJndCIsCQlCUkEoMHgzNyksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImJsYmMiLAkJQlJBKDB4MzgpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJlcSIsCQlCUkEoMHgzOSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmx0IiwJCUJSQSgweDNBKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibGUiLAkJQlJBKDB4M0IpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsYnMiLAkJQlJBKDB4M0MpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJuZSIsCQlCUkEoMHgzRCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmdlIiwJCUJSQSgweDNFKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZ3QiLAkJQlJBKDB4M0YpLCBCQVNFLCBBUkdfQlJBIH0sCi19OwotCi1jb25zdCB1bnNpZ25lZCBhbHBoYV9udW1fb3Bjb2RlcyA9IHNpemVvZihhbHBoYV9vcGNvZGVzKS9zaXplb2YoKmFscGhhX29wY29kZXMpOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcmMtZGlzLmMgYi9vcGNvZGVzL2FyYy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmMTM3OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FyYy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZSBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICosIGludCwgaW50KSk7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKDQgb3IgOCBmb3IgdGhlIEFSQykuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKHBjLCBpbmZvLCBtYWNoLCBiaWdfcCkKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCBiaWdfcDsKLXsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgaW50IHN0YXR1czsKLSAgLyogRmlyc3QgZWxlbWVudCBpcyBpbnNuLCBzZWNvbmQgZWxlbWVudCBpcyBsaW1tIChpZiBwcmVzZW50KS4gICovCi0gIGFyY19pbnNuIGluc25bMl07Ci0gIGludCBnb3RfbGltbV9wID0gMDsKLSAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0gIHN0YXRpYyBpbnQgY3VycmVudF9tYWNoID0gMDsKLQotICBpZiAoIWluaXRpYWxpemVkIHx8IG1hY2ggIT0gY3VycmVudF9tYWNoKQotICAgIHsKLSAgICAgIGluaXRpYWxpemVkID0gMTsKLSAgICAgIGN1cnJlbnRfbWFjaCA9IGFyY19nZXRfb3Bjb2RlX21hY2ggKG1hY2gsIGJpZ19wKTsKLSAgICAgIGFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGN1cnJlbnRfbWFjaCk7Ci0gICAgfQotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKGJpZ19wKQotICAgIGluc25bMF0gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICBlbHNlCi0gICAgaW5zblswXSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgKCpmdW5jKSAoc3RyZWFtLCAiJTA4bHhcdCIsIGluc25bMF0pOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBsaXN0cyBoYXNoZWQgYnkgdGhlIGluc24gY29kZQotICAgICAodGhvdWdoIHdlIG5lZWRuJ3QgY2FyZSBob3cgdGhleSdyZSBoYXNoZWQpLiAgKi8KLQotICBvcGNvZGUgPSBhcmNfb3Bjb2RlX2xvb2t1cF9kaXMgKGluc25bMF0pOwotICBmb3IgKCA7IG9wY29kZSAhPSBOVUxMOyBvcGNvZGUgPSBBUkNfT1BDT0RFX05FWFRfRElTIChvcGNvZGUpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bjsKLSAgICAgIGludCBtb2RzLGludmFsaWQ7Ci0gICAgICBsb25nIHZhbHVlOwotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpvcHZhbDsKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIGlmICgoaW5zblswXSAmIG9wY29kZS0+bWFzaykgIT0gb3Bjb2RlLT52YWx1ZSkKLQljb250aW51ZTsKLQotICAgICAgLyogU3VwcG9ydGVkIGJ5IHRoaXMgY3B1PyAgKi8KLSAgICAgIGlmICghIGFyY19vcGNvZGVfc3VwcG9ydGVkIChvcGNvZGUpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLQotICAgICAgYXJjX29wY29kZV9pbml0X2V4dHJhY3QgKCk7Ci0gICAgICBpbnZhbGlkID0gMDsKLQotICAgICAgLyogPz8/IEdyYW50ZWQsIHRoaXMgaXMgc2xvd2VyIHRoYW4gdGhlIGBwcGMnIHdheS4gIE1heWJlIHdoZW4gdGhpcyBpcwotCSBkb25lIGl0J2xsIGJlIGNsZWFyIHdoYXQgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGlzLiAgKi8KLSAgICAgIC8qIEluc3RydWN0aW9ucyBsaWtlICJhZGQuZiByMCxyMSwxIiBhcmUgdHJpY2t5IGJlY2F1c2UgdGhlICIuZiIgZ2V0cwotCSBwcmludGVkIGZpcnN0LCBidXQgd2UgZG9uJ3Qga25vdyBob3cgdG8gcHJpbnQgaXQgdW50aWwgd2UndmUgcHJvY2Vzc2VkCi0JIHRoZSByZWdzLiAgU2luY2Ugd2UncmUgc2Nhbm5pbmcgYWxsIHRoZSBhcmdzIGJlZm9yZSBwcmludGluZyB0aGUgaW5zbgotCSBhbnl3YXlzLCBpdCdzIGFjdHVhbGx5IHF1aXRlIGVhc3kuICAqLwotCi0gICAgICBmb3IgKHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luOyArK3N5bikKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCi0JICAgIGNvbnRpbnVlOwotCSAgbW9kcyA9IDA7Ci0JICBjID0gKnN5bjsKLQkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzKSkKLQkgICAgewotCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7Ci0JICAgICAgKytzeW47Ci0JICAgICAgYyA9ICpzeW47Ci0JICAgIH0KLQkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbY107Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkgKGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKikgTlVMTCwKLQkJCQkgJmludmFsaWQpOwotCX0KLSAgICAgIGlmIChpbnZhbGlkKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFuIGluc24gd2l0aCBhIGxpbW0sIGZldGNoIGl0IG5vdy4gIFNjYW5uaW5nIHRoZSBpbnNucwotCSB0d2ljZSBsZXRzIHVzIGRvIHRoaXMuICAqLwotICAgICAgaWYgKGFyY19vcGNvZGVfbGltbV9wIChOVUxMKSkKLQl7Ci0JICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYyArIDQsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICBpZiAoc3RhdHVzICE9IDApCi0JICAgIHsKLQkgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBpZiAoYmlnX3ApCi0JICAgIGluc25bMV0gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCSAgZWxzZQotCSAgICBpbnNuWzFdID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQkgIGdvdF9saW1tX3AgPSAxOwotCX0KLQotICAgICAgZm9yIChzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5bjsgKytzeW4pCi0JewotCSAgaW50IGM7Ci0KLQkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQotCSAgICB7Ci0JICAgICAgKCpmdW5jKSAoc3RyZWFtLCAiJWMiLCAqc3luKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICBGZXRjaCBhbnkgc3BlY2lhbCBtb2RpZmllcnMuICAqLwotCSAgbW9kcyA9IDA7Ci0JICBjID0gKnN5bjsKLQkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzKSkKLQkgICAgewotCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7Ci0JICAgICAgKytzeW47Ci0JICAgICAgYyA9ICpzeW47Ci0JICAgIH0KLQkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbY107Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIG9wdmFsID0gTlVMTDsKLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCQkgICAmb3B2YWwsIChpbnQgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKLQkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCi0JCXZhbHVlIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzdWZmaXggb3BlcmFuZCwgc2V0IGBvcHZhbCcuICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkJb3B2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIHZhbHVlKTsKLQkgICAgfQotCi0JICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfRkFLRSkKLQkgICAgOyAvKiBub3RoaW5nIHRvIGRvICg/Pz8gYXQgbGVhc3Qgbm90IHlldCkgKi8KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCSAgICB7Ci0JICAgICAgLyogRGVmYXVsdCBzdWZmaXhlcyBhcmVuJ3QgcHJpbnRlZC4gIEZvcnR1bmF0ZWx5LCB0aGV5IGFsbCBoYXZlCi0JCSB6ZXJvIHZhbHVlcy4gIEFsc28sIHplcm8gdmFsdWVzIGZvciBib29sZWFuIHN1ZmZpeGVzIGFyZQotCQkgcmVwcmVzZW50ZWQgYnkgdGhlIGFic2VuY2Ugb2YgdGV4dC4gICovCi0KLQkgICAgICBpZiAodmFsdWUgIT0gMCkKLQkJewotCQkgIC8qID8/PyBPUFZBTCBzaG91bGQgaGF2ZSBhIHZhbHVlLiAgSWYgaXQgZG9lc24ndCBqdXN0IGNvcGUKLQkJICAgICBhcyB3ZSB3YW50IGRpc2Fzc2VtYmx5IHRvIGJlIHJlYXNvbmFibHkgcm9idXN0LgotCQkgICAgIEFsc28gcmVtZW1iZXIgdGhhdCBzZXZlcmFsIGNvbmRpdGlvbiBjb2RlIHZhbHVlcyAoMTYtMzEpCi0JCSAgICAgYXJlbid0IGRlZmluZWQgeWV0LiAgRm9yIHRoZXNlIGNhc2VzIGp1c3QgcHJpbnQgdGhlCi0JCSAgICAgbnVtYmVyIHN1aXRhYmx5IGRlY29yYXRlZC4gICovCi0JCSAgaWYgKG9wdmFsKQotCQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMlcyIsCi0JCQkgICAgIG1vZHMgJiBBUkNfTU9EX0RPVCA/ICIuIiA6ICIiLAotCQkJICAgICBvcHZhbC0+bmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMlYyVkIiwKLQkJCSAgICAgbW9kcyAmIEFSQ19NT0RfRE9UID8gIi4iIDogIiIsCi0JCQkgICAgIG9wZXJhbmQtPmZtdCwgdmFsdWUpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHBjICsgNCArIHZhbHVlLCBpbmZvKTsKLQkgIC8qID8/PyBOb3QgYWxsIGNhc2VzIG9mIHRoaXMgYXJlIGN1cnJlbnRseSBjYXVnaHQuICAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0gpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIHZhbHVlICYgMHhmZmZmZmZmZiwgaW5mbyk7Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FERFJFU1MpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIHZhbHVlICYgMHhmZmZmZmZmZiwgaW5mbyk7Ci0JICBlbHNlIGlmIChvcHZhbCkKLQkgICAgLyogTm90ZSB0aGF0IHRoaXMgY2FzZSBjYXRjaGVzIGJvdGggbm9ybWFsIGFuZCBhdXhpbGlhcnkgcmVncy4gICovCi0JICAgICgqZnVuYykgKHN0cmVhbSwgIiVzIiwgb3B2YWwtPm5hbWUpOwotCSAgZWxzZQotCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGZvdW5kIGFuZCBwcmludGVkIGFuIGluc3RydWN0aW9uOyByZXR1cm4uICAqLwotICAgICAgcmV0dXJuIGdvdF9saW1tX3AgPyA4IDogNDsKLSAgICB9Ci0KLSAgKCpmdW5jKSAoc3RyZWFtLCBfKCIqdW5rbm93bioiKSk7Ci0gIHJldHVybiA0OwotfQotCi0vKiBHaXZlbiBNQUNILCBvbmUgb2YgYmZkX21hY2hfYXJjX3h4eCwgcmV0dXJuIHRoZSBwcmludF9pbnNuIGZ1bmN0aW9uIHRvIHVzZS4KLSAgIFRoaXMgZG9lcyB0aGluZ3MgYSBub24tc3RhbmRhcmQgd2F5ICh0aGUgInN0YW5kYXJkIiB3YXkgd291bGQgYmUgdG8gY29weQotICAgdGhpcyBjb2RlIGludG8gZGlzYXNzZW1ibGUuYykuICBTaW5jZSB0aGVyZSBhcmUgbW9yZSB0aGFuIGEgY291cGxlIG9mCi0gICB2YXJpYW50cywgaGlkaW5nIGFsbCB0aGlzIGNydWQgaGVyZSBzZWVtcyBjbGVhbmVyLiAgKi8KLQotZGlzYXNzZW1ibGVyX2Z0eXBlCi1hcmNfZ2V0X2Rpc2Fzc2VtYmxlciAobWFjaCwgYmlnX3ApCi0gICAgIGludCBtYWNoOwotICAgICBpbnQgYmlnX3A7Ci17Ci0gIHN3aXRjaCAobWFjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKLSAgICAgIHJldHVybiBiaWdfcCA/IHByaW50X2luc25fYXJjX2Jhc2VfYmlnIDogcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGU7Ci0gICAgfQotICByZXR1cm4gcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBiZmRfbWFjaF9hcmNfYmFzZSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJjX2Jhc2VfYmlnIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBiZmRfbWFjaF9hcmNfYmFzZSwgMSk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1vcGMuYyBiL29wY29kZXMvYXJjLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdmZmMwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMSArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNkZWZpbmUgSU5TRVJUX0ZOKGZuKSBcCi1zdGF0aWMgYXJjX2luc24gZm4gUEFSQU1TICgoYXJjX2luc24sIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqLCBcCi0JCQkgICAgaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiwgbG9uZywgXAotCQkJICAgIGNvbnN0IGNoYXIgKiopKQotI2RlZmluZSBFWFRSQUNUX0ZOKGZuKSBcCi1zdGF0aWMgbG9uZyBmbiBQQVJBTVMgKChhcmNfaW5zbiAqLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiosIGludCAqKSkKLQotSU5TRVJUX0ZOIChpbnNlcnRfcmVnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2xpbW1maW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW1vZmZzZXQpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW16ZXJvKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWcpOwotSU5TRVJUX0ZOIChpbnNlcnRfZmxhZ2ZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9jb25kKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZvcmNlbGltbSk7Ci1JTlNFUlRfRk4gKGluc2VydF9yZWxhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2Fic2FkZHIpOwotSU5TRVJUX0ZOIChpbnNlcnRfdW5vcG1hY3JvKTsKLQotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWcpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9mbGFnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfY29uZCk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X3JlbGFkZHIpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF91bm9wbWFjcm8pOwotCi0vKiBWYXJpb3VzIHR5cGVzIG9mIEFSQyBvcGVyYW5kcywgaW5jbHVkaW5nIGluc24gc3VmZml4ZXMuICAqLwotCi0vKiBJbnNuIGZvcm1hdCB2YWx1ZXM6Ci0KLSAgICdhJwlSRUdBCQlyZWdpc3RlciBBIGZpZWxkCi0gICAnYicJUkVHQgkJcmVnaXN0ZXIgQiBmaWVsZAotICAgJ2MnCVJFR0MJCXJlZ2lzdGVyIEMgZmllbGQKLSAgICdTJwlTSElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgc2hpbW0gdmFsdWUKLSAgICdMJwlMSU1NRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgYSBsaW1tIHZhbHVlCi0gICAnZCcJU0hJTU1PRkZTRVQJc2hpbW0gb2Zmc2V0IGluIGxkLHN0IGluc25zCi0gICAnMCcJU0hJTU1aRVJPCTAgc2hpbW0gdmFsdWUgaW4gbGQsc3QgaW5zbnMKLSAgICdmJwlGTEFHCQlGIGZsYWcKLSAgICdGJwlGTEFHRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgdGhlIEYgZmxhZwotICAgJ0cnCUZMQUdJTlNOCWluc2VydCBGIGZsYWcgaW4gImZsYWciIGluc24KLSAgICduJwlERUxBWQkJTiBmaWVsZCAobnVsbGlmeSBmaWVsZCkKLSAgICdxJwlDT05ECQljb25kaXRpb24gY29kZSBmaWVsZAotICAgJ1EnCUZPUkNFTElNTQlzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyBhIGxpbW0KLSAgICdCJwlCUkFOQ0gJCWJyYW5jaCBhZGRyZXNzICgyMiBiaXQgcGMgcmVsYXRpdmUpCi0gICAnSicJSlVNUAkJanVtcCBhZGRyZXNzICgyNiBiaXQgYWJzb2x1dGUpCi0gICAneicJU0laRTEJCXNpemUgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1onCVNJWkUxMAkJc2l6ZSBmaWVsZCBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ3knCVNJWkUyMgkJc2l6ZSBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ3gnCVNJR04wCQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLGNdCi0gICAnWCcJU0lHTjkJCXNpZ24gZXh0ZW5kIGZpZWxkIGxkIGEsW2Isc2hpbW1dCi0gICAndycJQUREUkVTUzMJd3JpdGUtYmFjayBmaWVsZCBpbiBsZCBhLFtiLGNdCi0gICAnVycJQUREUkVTUzEyCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd2JwlBRERSRVNTMjQJd3JpdGUtYmFjayBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ2UnCUNBQ0hFQllQQVNTNQljYWNoZSBieXBhc3MgaW4gbGQgYSxbYixjXQotICAgJ0UnCUNBQ0hFQllQQVNTMTQJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2Isc2hpbW1dCi0gICAnRCcJQ0FDSEVCWVBBU1MyNgljYWNoZSBieXBhc3MgaW4gc3QgYyxbYixzaGltbV0KLSAgICdVJwlVTk9QTUFDUk8JZmFrZSBvcGVyYW5kIHRvIGNvcHkgUkVHQiB0byBSRUdDIGZvciB1bm9wIG1hY3JvcwotCi0gICBUaGUgZm9sbG93aW5nIG1vZGlmaWVycyBtYXkgYXBwZWFyIGJldHdlZW4gdGhlICUgYW5kIGNoYXIgKGVnOiAlLmYpOgotCi0gICAnLicJTU9ERE9UCQknLicgcHJlZml4IG11c3QgYmUgcHJlc2VudAotICAgJ3InCVJFRwkJZ2VuZXJpYyByZWdpc3RlciB2YWx1ZSwgZm9yIHJlZ2lzdGVyIHRhYmxlCi0gICAnQScJQVVYUkVHCQlhdXhpbGlhcnkgcmVnaXN0ZXIgaW4gbHIgYSxbYl0sIHNyIGMsW2JdCi0KLSAgIEZpZWxkcyBhcmU6Ci0KLSAgIENIQVIgQklUUyBTSElGVCBGTEFHUyBJTlNFUlRfRk4gRVhUUkFDVF9GTgotKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kIGFyY19vcGVyYW5kc1tdID0KLXsKLS8qIHBsYWNlIGhvbGRlciAoPz8/IG5vdCBzdXJlIGlmIG5lZWRlZCkgKi8KLSNkZWZpbmUgVU5VU0VEIDAKLSAgeyAwIH0sCi0KLS8qIHJlZ2lzdGVyIEEgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQSAoVU5VU0VEICsgMSkKLSAgeyAnYScsIDYsIEFSQ19TSElGVF9SRUdBLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIHJlZ2lzdGVyIEIgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQiAoUkVHQSArIDEpCi0gIHsgJ2InLCA2LCBBUkNfU0hJRlRfUkVHQiwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBDIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0MgKFJFR0IgKyAxKQotICB7ICdjJywgNiwgQVJDX1NISUZUX1JFR0MsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogZmFrZSBvcGVyYW5kIHVzZWQgdG8gaW5zZXJ0IHNoaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgU0hJTU1GSU5JU0ggKFJFR0MgKyAxKQotICB7ICdTJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVEICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1tZmluaXNoLCAwIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBsaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBMSU1NRklOSVNIIChTSElNTUZJTklTSCArIDEpCi0gIHsgJ0wnLCAzMiwgMzIsIEFSQ19PUEVSQU5EX0FERFJFU1MgKyBBUkNfT1BFUkFORF9MSU1NICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2xpbW1maW5pc2gsIDAgfSwKLQotLyogc2hpbW0gb3BlcmFuZCB3aGVuIHRoZXJlIGlzIG5vIHJlZyBpbmRpY2F0b3IgKGxkLHN0KSAqLwotI2RlZmluZSBTSElNTU9GRlNFVCAoTElNTUZJTklTSCArIDEpCi0gIHsgJ2QnLCA5LCAwLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9zaGltbW9mZnNldCwgMCB9LAotCi0vKiAwIHNoaW1tIG9wZXJhbmQgZm9yIGxkLHN0IGluc25zICovCi0jZGVmaW5lIFNISU1NWkVSTyAoU0hJTU1PRkZTRVQgKyAxKQotICB7ICcwJywgOSwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1temVybywgMCB9LAotCi0vKiBmbGFnIHVwZGF0ZSBiaXQgKGluc2VydGlvbiBpcyBkZWZlcmVkIHVudGlsIHdlIGtub3cgaG93KSAqLwotI2RlZmluZSBGTEFHIChTSElNTVpFUk8gKyAxKQotICB7ICdmJywgMSwgOCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfZmxhZywgZXh0cmFjdF9mbGFnIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIGZpbmlzaCAnZicgc3VmZml4IGhhbmRsaW5nICovCi0jZGVmaW5lIEZMQUdGSU5JU0ggKEZMQUcgKyAxKQotICB7ICdGJywgMSwgOCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZsYWdmaW5pc2gsIDAgfSwKLQotLyogZmFrZSB1dGlsaXR5IG9wZXJhbmQgdG8gc2V0IHRoZSAnZicgZmxhZyBmb3IgdGhlICJmbGFnIiBpbnNuICovCi0jZGVmaW5lIEZMQUdJTlNOIChGTEFHRklOSVNIICsgMSkKLSAgeyAnRycsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnLCAwIH0sCi0KLS8qIGJyYW5jaCBkZWxheSB0eXBlcyAqLwotI2RlZmluZSBERUxBWSAoRkxBR0lOU04gKyAxKQotICB7ICduJywgMiwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQ09ORCAoREVMQVkgKyAxKQotICB7ICdxJywgNSwgMCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfY29uZCwgZXh0cmFjdF9jb25kIH0sCi0KLS8qIHNldCBgY29uZF9wJyB0byAxIHRvIGVuc3VyZSBhIGNvbnN0YW50IGlzIHRyZWF0ZWQgYXMgYSBsaW1tICovCi0jZGVmaW5lIEZPUkNFTElNTSAoQ09ORCArIDEpCi0gIHsgJ1EnLCAwLCAwLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZm9yY2VsaW1tIH0sCi0KLS8qIGJyYW5jaCBhZGRyZXNzOyBiLCBibCwgYW5kIGxwIGluc25zICovCi0jZGVmaW5lIEJSQU5DSCAoRk9SQ0VMSU1NICsgMSkKLSAgeyAnQicsIDIwLCA3LCBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0ggKyBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWxhZGRyLCBleHRyYWN0X3JlbGFkZHIgfSwKLQotLyoganVtcCBhZGRyZXNzOyBqIGluc24gKHRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzICdMJyBleGNlcHQgdGhhdCB0aGUKLSAgIHZhbHVlIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgMikgKi8KLSNkZWZpbmUgSlVNUCAoQlJBTkNIICsgMSkKLSAgeyAnSicsIDI0LCAzMiwgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9hYnNhZGRyIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMSwyICovCi0jZGVmaW5lIFNJWkUxIChKVU1QICsgMSkKLSAgeyAneicsIDIsIDEsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEwLDExICovCi0jZGVmaW5lIFNJWkUxMCAoU0laRTEgKyAxKQotICB7ICdaJywgMiwgMTAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAyMiwyMyAqLwotI2RlZmluZSBTSVpFMjIgKFNJWkUxMCArIDEpCi0gIHsgJ3knLCAyLCAyMiwgQVJDX09QRVJBTkRfU1VGRklYLCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCAwICovCi0jZGVmaW5lIFNJR04wIChTSVpFMjIgKyAxKQotICB7ICd4JywgMSwgMCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHNpZ24gZXh0ZW5kIGZpZWxkLCBzdG9yZWQgaW4gYml0IDkgKi8KLSNkZWZpbmUgU0lHTjkgKFNJR04wICsgMSkKLSAgeyAnWCcsIDEsIDksIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMyAqLwotI2RlZmluZSBBRERSRVNTMyAoU0lHTjkgKyAxKQotICB7ICd3JywgMSwgMywgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAxMiAqLwotI2RlZmluZSBBRERSRVNTMTIgKEFERFJFU1MzICsgMSkKLSAgeyAnVycsIDEsIDEyLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDI0ICovCi0jZGVmaW5lIEFERFJFU1MyNCAoQUREUkVTUzEyICsgMSkKLSAgeyAndicsIDEsIDI0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDUgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1M1IChBRERSRVNTMjQgKyAxKQotICB7ICdlJywgMSwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCAxNCAqLwotI2RlZmluZSBDQUNIRUJZUEFTUzE0IChDQUNIRUJZUEFTUzUgKyAxKQotICB7ICdFJywgMSwgMTQsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMjYgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MyNiAoQ0FDSEVCWVBBU1MxNCArIDEpCi0gIHsgJ0QnLCAxLCAyNiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHVub3AgbWFjcm8sIHVzZWQgdG8gY29weSBSRUdCIHRvIFJFR0MgKi8KLSNkZWZpbmUgVU5PUE1BQ1JPIChDQUNIRUJZUEFTUzI2ICsgMSkKLSAgeyAnVScsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfdW5vcG1hY3JvLCBleHRyYWN0X3Vub3BtYWNybyB9LAotCi0vKiAnLicgbW9kaWZpZXIgKCcuJyByZXF1aXJlZCkuICAqLwotI2RlZmluZSBNT0RET1QgKFVOT1BNQUNSTyArIDEpCi0gIHsgJy4nLCAxLCAwLCBBUkNfTU9EX0RPVCB9LAotCi0vKiBEdW1teSAncicgbW9kaWZpZXIgZm9yIHRoZSByZWdpc3RlciB0YWJsZS4KLSAgIEl0J3MgY2FsbGVkIGEgImR1bW15IiBiZWNhdXNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gaW5zZXJ0aW5nIGFuICdyJyBpbnRvIGFsbAotICAgdGhlICVhLyViLyVjIG9jY3VycmVuY2VzIGluIHRoZSBpbnNuIHRhYmxlLiAgKi8KLSNkZWZpbmUgUkVHIChNT0RET1QgKyAxKQotICB7ICdyJywgNiwgMCwgQVJDX01PRF9SRUcgfSwKLQotLyogS25vd24gYXV4aWxpYXJ5IHJlZ2lzdGVyIG1vZGlmaWVyIChzdG9yZWQgaW4gc2hpbW0gZmllbGQpLiAgKi8KLSNkZWZpbmUgQVVYUkVHIChSRUcgKyAxKQotICB7ICdBJywgOSwgMCwgQVJDX01PRF9BVVhSRUcgfSwKLQotLyogZW5kIG9mIGxpc3QgcGxhY2UgaG9sZGVyICovCi0gIHsgMCB9Ci19OwotDAotLyogR2l2ZW4gYSBmb3JtYXQgbGV0dGVyLCB5aWVsZHMgdGhlIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycuCi0gICBlZzogYXJjX29wZXJhbmRfbWFwWydhJ10gPSBSRUdBLiAgKi8KLXVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwWzI1Nl07Ci0KLSNkZWZpbmUgSSh4KSAoKCh4KSAmIDMxKSA8PCAyNykKLSNkZWZpbmUgQSh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0EpCi0jZGVmaW5lIEIoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdCKQotI2RlZmluZSBDKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQykKLSNkZWZpbmUgUih4LGIsbSkgKCgoeCkgJiAobSkpIDw8IChiKSkJLyogdmFsdWUgWCwgbWFzayBNLCBhdCBiaXQgQiAqLwotCi0vKiBBUkMgaW5zdHJ1Y3Rpb25zLgotCi0gICBMb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgbXVzdCBhcHBlYXIgYmVmb3JlIHNob3J0ZXIgb25lcyAoaWYgZ2FzIHNlZXMKLSAgICJsc3IgcjIscjMsMSIgd2hlbiBpdCdzIHBhcnNpbmcgImxzciAlYSwlYiIgaXQgd2lsbCB0aGluayB0aGUgIiwxIiBpcwotICAganVuaykuICBUaGlzIGlzbid0IG5lY2Vzc2FyeSBmb3IgYGxkJyBiZWNhdXNlIG9mIHRoZSB0cmFpbGluZyAnXScuCi0KLSAgIEluc3RydWN0aW9ucyB0aGF0IGFyZSByZWFsbHkgbWFjcm9zIGJhc2VkIG9uIG90aGVyIGluc25zIG11c3QgYXBwZWFyCi0gICBiZWZvcmUgdGhlIHJlYWwgaW5zbiBzbyB0aGV5J3JlIGNob3NlbiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBFZzogVGhlIGBtb3YnCi0gICBpbnNuIGlzIHJlYWxseSB0aGUgYGFuZCcgaW5zbi4KLQotICAgVGhpcyB0YWJsZSBpcyBiZXN0IHZpZXdlZCBvbiBhIHdpZGUgc2NyZWVuICgxNjEgY29sdW1ucykuICBJJ2QgcHJlZmVyIHRvCi0gICBrZWVwIGl0IHRoaXMgd2F5LiAgVGhlIHJlc3Qgb2YgdGhlIGZpbGUsIGhvd2V2ZXIsIHNob3VsZCBiZSB2aWV3YWJsZSBvbiBhbgotICAgODAgY29sdW1uIHRlcm1pbmFsLiAgKi8KLQotLyogPz8/IFRoaXMgdGFibGUgYWxzbyBpbmNsdWRlcyBtYWNyb3M6IGFzbCwgbHNsLCBhbmQgbW92LiAgVGhlIHBwYyBwb3J0IGhhcwotICAgYSBtb3JlIGdlbmVyYWwgZmFjaWxpdHkgZm9yIGRlYWxpbmcgd2l0aCBtYWNyb3Mgd2hpY2ggY291bGQgYmUgdXNlZCBpZgotICAgd2UgbmVlZCB0by4gICovCi0KLS8qIFRoaXMgdGFibGUgY2FuJ3QgYmUgYGNvbnN0JyBiZWNhdXNlIG1lbWJlcnMgYG5leHRfYXNtJyBhbmQgYG5leHRfZGlzJyBhcmUKLSAgIGNvbXB1dGVkIGF0IHJ1bi10aW1lLiAgV2UgY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3bywgYnV0IHRoYXQgZG9lc24ndCBzZWVtCi0gICB3b3J0aCBpdC4gICovCi0KLXN0cnVjdCBhcmNfb3Bjb2RlIGFyY19vcGNvZGVzW10gPSB7Ci0KLSAgLyogTWFjcm9zIGFwcGVhciBmaXJzdC4gICovCi0gIC8qICJtb3YiIGlzIHJlYWxseSBhbiAiYW5kIi4gICovCi0gIHsgIm1vdiUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSgxMikgfSwKLSAgLyogImFzbCIgaXMgcmVhbGx5IGFuICJhZGQiLiAgKi8KLSAgeyAiYXNsJS5xJS5mICVhLCViJUYlUyVMJVUiLAkJSSgtMSksCQlJKDgpIH0sCi0gIC8qICJsc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImxzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibm9wIiBpcyByZWFsbHkgYW4gInhvciIuICAqLwotICB7ICJub3AiLAkJCQkweGZmZmZmZmZmLAkweDdmZmZmZmZmIH0sCi0gIC8qICJybGMiIGlzIHJlYWxseSBhbiAiYWRjIi4gICovCi0gIHsgInJsYyUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg5KSB9LAotCi0gIC8qIFRoZSByZXN0IG9mIHRoZXNlIG5lZWRuJ3QgYmUgc29ydGVkLCBidXQgaXQgaGVscHMgdG8gZmluZCB0aGVtIGlmIHRoZXkgYXJlLiAgKi8KLSAgeyAiYWRjJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg5KSB9LAotICB7ICJhZGQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDgpIH0sCi0gIHsgImFuZCUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIHsgImFzciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDEpIH0sCi0gIHsgImJpYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTQpIH0sCi0gIHsgImIlcSUubiAlQiIsCQkJSSgtMSksCQlJKDQpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJibCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNSksCQlBUkNfT1BDT0RFX0NPTkRfQlJBTkNIIH0sCi0gIHsgImV4dGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg3KSB9LAotICB7ICJleHR3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoOCkgfSwKLSAgeyAiZmxhZyUucSAlYiVHJVMlTCIsCQkJSSgtMSkrQSgtMSkrQygtMSksCQlJKDMpK0EoQVJDX1JFR19TSElNTV9VUERBVEUpK0MoMCkgfSwKLSAgLyogJVE6IGZvcmNlIGNvbmRfcD0xIC0tPiBubyBzaGltbSB2YWx1ZXMgKi8KLSAgLyogPz8/IFRoaXMgaW5zbiBhbGxvd3MgYW4gb3B0aW9uYWwgZmxhZ3Mgc3BlYy4gICovCi0gIHsgImolcSVRJS5uJS5mICViJUoiLAkJCUkoLTEpK0EoLTEpK0MoLTEpK1IoLTEsNywxKSwJSSg3KStBKDApK0MoMCkrUigwLDcsMSkgfSwKLSAgLyogUHV0IG9wY29kZSAxIGxkIGluc25zIGZpcnN0IHNvIHNoaW1tIGdldHMgcHJlZmVyZWQgb3ZlciBsaW1tLiAgKi8KLSAgLyogIlslYl0iIGlzIGJlZm9yZSAiWyViLCVkXSIgc28gMCBvZmZzZXRzIGRvbid0IGdldCBwcmludGVkLiAgKi8KLSAgeyAibGQlWiUuWCUuVyUuRSAlMCVhLFslYl0lTCIsCUkoLTEpK1IoLTEsMTMsMSkrUigtMSwwLDUxMSksCUkoMSkrUigwLDEzLDEpK1IoMCwwLDUxMSkgfSwKLSAgeyAibGQlWiUuWCUuVyUuRSAlYSxbJWIsJWRdJVMlTCIsCUkoLTEpK1IoLTEsMTMsMSksCQlJKDEpK1IoMCwxMywxKSB9LAotICB7ICJsZCV6JS54JS53JS5lJVEgJWEsWyViLCVjXSVMIiwJSSgtMSkrUigtMSw0LDEpK1IoLTEsNiw3KSwJSSgwKStSKDAsNCwxKStSKDAsNiw3KSB9LAotICB7ICJscCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNiksIH0sCi0gIHsgImxyICVhLFslQWJdJVMlTCIsCQkJSSgtMSkrQygtMSksCUkoMSkrQygweDEwKSB9LAotICB7ICJsc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygyKSB9LAotICB7ICJvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTMpIH0sCi0gIHsgInJvciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDMpIH0sCi0gIHsgInJyYyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDQpIH0sCi0gIHsgInNiYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTEpIH0sCi0gIHsgInNleGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg1KSB9LAotICB7ICJzZXh3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNikgfSwKLSAgeyAic3IgJWMsWyVBYl0lUyVMIiwJCQlJKC0xKStBKC0xKSwJSSgyKStBKDB4MTApIH0sCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgInN0JXklLnYlLkQlUSAlMCVjLFslYl0lTCIsCQlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSkrUigtMSwwLDUxMSksCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKStSKDAsMCw1MTEpIH0sCi0gIHsgInN0JXklLnYlLkQgJWMsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSksCQkJSSgyKStSKDAsMjUsMSkrUigwLDIxLDEpIH0sCi0gIHsgInN1YiUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTApIH0sCi0gIHsgInhvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTUpIH0KLX07Ci1jb25zdCBpbnQgYXJjX29wY29kZXNfY291bnQgPSBzaXplb2YgKGFyY19vcGNvZGVzKSAvIHNpemVvZiAoYXJjX29wY29kZXNbMF0pOwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdID0KLXsKLSAgLyogU29ydCB0aGlzIHNvIHRoYXQgdGhlIGZpcnN0IDYxIGVudHJpZXMgYXJlIHNlcXVlbnRpYWwuCi0gICAgIElFOiBGb3IgZWFjaCBpIChpPDYxKSwgYXJjX3JlZ19uYW1lc1tpXS52YWx1ZSA9PSBpLiAgKi8KLQotICB7ICJyMCIsIDAsIFJFRyB9LCB7ICJyMSIsIDEsIFJFRyB9LCB7ICJyMiIsIDIsIFJFRyB9LCB7ICJyMyIsIDMsIFJFRyB9LAotICB7ICJyNCIsIDQsIFJFRyB9LCB7ICJyNSIsIDUsIFJFRyB9LCB7ICJyNiIsIDYsIFJFRyB9LCB7ICJyNyIsIDcsIFJFRyB9LAotICB7ICJyOCIsIDgsIFJFRyB9LCB7ICJyOSIsIDksIFJFRyB9LCB7ICJyMTAiLCAxMCwgUkVHIH0sIHsgInIxMSIsIDExLCBSRUcgfSwKLSAgeyAicjEyIiwgMTIsIFJFRyB9LCB7ICJyMTMiLCAxMywgUkVHIH0sIHsgInIxNCIsIDE0LCBSRUcgfSwgeyAicjE1IiwgMTUsIFJFRyB9LAotICB7ICJyMTYiLCAxNiwgUkVHIH0sIHsgInIxNyIsIDE3LCBSRUcgfSwgeyAicjE4IiwgMTgsIFJFRyB9LCB7ICJyMTkiLCAxOSwgUkVHIH0sCi0gIHsgInIyMCIsIDIwLCBSRUcgfSwgeyAicjIxIiwgMjEsIFJFRyB9LCB7ICJyMjIiLCAyMiwgUkVHIH0sIHsgInIyMyIsIDIzLCBSRUcgfSwKLSAgeyAicjI0IiwgMjQsIFJFRyB9LCB7ICJyMjUiLCAyNSwgUkVHIH0sIHsgInIyNiIsIDI2LCBSRUcgfSwgeyAiZnAiLCAyNywgUkVHIH0sCi0gIHsgInNwIiwgMjgsIFJFRyB9LCB7ICJpbGluazEiLCAyOSwgUkVHIH0sIHsgImlsaW5rMiIsIDMwLCBSRUcgfSwgeyAiYmxpbmsiLCAzMSwgUkVHIH0sCi0gIHsgInIzMiIsIDMyLCBSRUcgfSwgeyAicjMzIiwgMzMsIFJFRyB9LCB7ICJyMzQiLCAzNCwgUkVHIH0sIHsgInIzNSIsIDM1LCBSRUcgfSwKLSAgeyAicjM2IiwgMzYsIFJFRyB9LCB7ICJyMzciLCAzNywgUkVHIH0sIHsgInIzOCIsIDM4LCBSRUcgfSwgeyAicjM5IiwgMzksIFJFRyB9LAotICB7ICJyNDAiLCA0MCwgUkVHIH0sIHsgInI0MSIsIDQxLCBSRUcgfSwgeyAicjQyIiwgNDIsIFJFRyB9LCB7ICJyNDMiLCA0MywgUkVHIH0sCi0gIHsgInI0NCIsIDQ0LCBSRUcgfSwgeyAicjQ1IiwgNDUsIFJFRyB9LCB7ICJyNDYiLCA0NiwgUkVHIH0sIHsgInI0NyIsIDQ3LCBSRUcgfSwKLSAgeyAicjQ4IiwgNDgsIFJFRyB9LCB7ICJyNDkiLCA0OSwgUkVHIH0sIHsgInI1MCIsIDUwLCBSRUcgfSwgeyAicjUxIiwgNTEsIFJFRyB9LAotICB7ICJyNTIiLCA1MiwgUkVHIH0sIHsgInI1MyIsIDUzLCBSRUcgfSwgeyAicjU0IiwgNTQsIFJFRyB9LCB7ICJyNTUiLCA1NSwgUkVHIH0sCi0gIHsgInI1NiIsIDU2LCBSRUcgfSwgeyAicjU3IiwgNTcsIFJFRyB9LCB7ICJyNTgiLCA1OCwgUkVHIH0sIHsgInI1OSIsIDU5LCBSRUcgfSwKLSAgeyAibHBfY291bnQiLCA2MCwgUkVHIH0sCi0KLSAgLyogSSdkIHByZWZlciB0byBvdXRwdXQgdGhlc2UgYXMgImZwIiBhbmQgInNwIiBieSBkZWZhdWx0LCBidXQgd2Ugc3RpbGwgbmVlZAotICAgICB0byByZWNvZ25pemUgdGhlIGNhbm9uaWNhbCB2YWx1ZXMuICAqLwotICB7ICJyMjciLCAyNywgUkVHIH0sIHsgInIyOCIsIDI4LCBSRUcgfSwKLQotICAvKiBTb21lb25lIG1heSB3aXNoIHRvIHJlZmVyIHRvIHRoZXNlIGluIHRoaXMgd2F5LCBhbmQgaXQncyBwcm9iYWJseSBhCi0gICAgIGdvb2QgaWRlYSB0byByZXNlcnZlIHRoZW0gYXMgc3VjaCBhbnl3YXkuICAqLwotICB7ICJyMjkiLCAyOSwgUkVHIH0sIHsgInIzMCIsIDMwLCBSRUcgfSwgeyAicjMxIiwgMzEsIFJFRyB9LCB7ICJyNjAiLCA2MCwgUkVHIH0sCi0KLSAgLyogU3RhbmRhcmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0gIHsgInN0YXR1cyIsCTAsIEFVWFJFRyB9LAotICB7ICJzZW1hcGhvcmUiLCAxLCBBVVhSRUcgfSwKLSAgeyAibHBfc3RhcnQiLAkyLCBBVVhSRUcgfSwKLSAgeyAibHBfZW5kIiwJMywgQVVYUkVHIH0sCi0gIHsgImlkZW50aXR5IiwJNCwgQVVYUkVHIH0sCi0gIHsgImRlYnVnIiwJNSwgQVVYUkVHIH0sCi19OwotY29uc3QgaW50IGFyY19yZWdfbmFtZXNfY291bnQgPSBzaXplb2YgKGFyY19yZWdfbmFtZXMpIC8gc2l6ZW9mIChhcmNfcmVnX25hbWVzWzBdKTsKLQotLyogVGhlIHN1ZmZpeCB0YWJsZS4KLSAgIE9wZXJhbmRzIHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IGJlIHN0b3JlZCB0b2dldGhlci4gICovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfc3VmZml4ZXNbXSA9Ci17Ci0gIC8qIEVudHJ5IDAgaXMgc3BlY2lhbCwgZGVmYXVsdCB2YWx1ZXMgYXJlbid0IHByaW50ZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHsgIiIsIDAsIC0xIH0sCi0gIHsgImFsIiwgMCwgQ09ORCB9LAotICB7ICJyYSIsIDAsIENPTkQgfSwKLSAgeyAiZXEiLCAxLCBDT05EIH0sCi0gIHsgInoiLCAxLCBDT05EIH0sCi0gIHsgIm5lIiwgMiwgQ09ORCB9LAotICB7ICJueiIsIDIsIENPTkQgfSwKLSAgeyAicCIsIDMsIENPTkQgfSwKLSAgeyAicGwiLCAzLCBDT05EIH0sCi0gIHsgIm4iLCA0LCBDT05EIH0sCi0gIHsgIm1pIiwgNCwgQ09ORCB9LAotICB7ICJjIiwgNSwgQ09ORCB9LAotICB7ICJjcyIsIDUsIENPTkQgfSwKLSAgeyAibG8iLCA1LCBDT05EIH0sCi0gIHsgIm5jIiwgNiwgQ09ORCB9LAotICB7ICJjYyIsIDYsIENPTkQgfSwKLSAgeyAiaHMiLCA2LCBDT05EIH0sCi0gIHsgInYiLCA3LCBDT05EIH0sCi0gIHsgInZzIiwgNywgQ09ORCB9LAotICB7ICJudiIsIDgsIENPTkQgfSwKLSAgeyAidmMiLCA4LCBDT05EIH0sCi0gIHsgImd0IiwgOSwgQ09ORCB9LAotICB7ICJnZSIsIDEwLCBDT05EIH0sCi0gIHsgImx0IiwgMTEsIENPTkQgfSwKLSAgeyAibGUiLCAxMiwgQ09ORCB9LAotICB7ICJoaSIsIDEzLCBDT05EIH0sCi0gIHsgImxzIiwgMTQsIENPTkQgfSwKLSAgeyAicG56IiwgMTUsIENPTkQgfSwKLSAgeyAiZiIsIDEsIEZMQUcgfSwKLSAgeyAibmQiLCBBUkNfREVMQVlfTk9ORSwgREVMQVkgfSwKLSAgeyAiZCIsIEFSQ19ERUxBWV9OT1JNQUwsIERFTEFZIH0sCi0gIHsgImpkIiwgQVJDX0RFTEFZX0pVTVAsIERFTEFZIH0sCi0vKnsgImIiLCA3LCBTSVpFRVhUIH0sKi8KLS8qeyAiYiIsIDUsIFNJWkVTRVggfSwqLwotICB7ICJiIiwgMSwgU0laRTEgfSwKLSAgeyAiYiIsIDEsIFNJWkUxMCB9LAotICB7ICJiIiwgMSwgU0laRTIyIH0sCi0vKnsgInciLCA4LCBTSVpFRVhUIH0sKi8KLS8qeyAidyIsIDYsIFNJWkVTRVggfSwqLwotICB7ICJ3IiwgMiwgU0laRTEgfSwKLSAgeyAidyIsIDIsIFNJWkUxMCB9LAotICB7ICJ3IiwgMiwgU0laRTIyIH0sCi0gIHsgIngiLCAxLCBTSUdOMCB9LAotICB7ICJ4IiwgMSwgU0lHTjkgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MzIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMTIgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MyNCB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTNSB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTMTQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzI2IH0sCi19OwotY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudCA9IHNpemVvZiAoYXJjX3N1ZmZpeGVzKSAvIHNpemVvZiAoYXJjX3N1ZmZpeGVzWzBdKTsKLQotLyogSW5kZXhlZCBieSBmaXJzdCBsZXR0ZXIgb2Ygb3Bjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lCi0gICBmaXJzdCBsZXR0ZXIuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGVfbWFwWzI2ICsgMV07Ci0KLS8qIEluZGV4ZWQgYnkgaW5zbiBjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lIGluc24gY29kZS4gICovCi1zdGF0aWMgc3RydWN0IGFyY19vcGNvZGUgKmljb2RlX21hcFszMl07Ci0MCi0vKiBDb25maWd1cmF0aW9uIGZsYWdzLiAgKi8KLQotLyogVmFyaW91cyBBUkNfSEFWRV9YWFggYml0cy4gICovCi1zdGF0aWMgaW50IGNwdV90eXBlOwotCi0vKiBUcmFuc2xhdGUgYSBiZmRfbWFjaF9hcmNfeHh4IHZhbHVlIHRvIGEgQVJDX01BQ0hfWFhYIHZhbHVlLiAgKi8KLQotaW50Ci1hcmNfZ2V0X29wY29kZV9tYWNoIChiZmRfbWFjaCwgYmlnX3ApCi0gICAgIGludCBiZmRfbWFjaCwgYmlnX3A7Ci17Ci0gIHN0YXRpYyBpbnQgbWFjaF90eXBlX21hcFtdID0KLSAgICB7Ci0gICAgICBBUkNfTUFDSF9CQVNFCi0gICAgfTsKLQotICByZXR1cm4gbWFjaF90eXBlX21hcFtiZmRfbWFjaF0gfCAoYmlnX3AgPyBBUkNfTUFDSF9CSUcgOiAwKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbnkgdGFibGVzIHRoYXQgbmVlZCBpdC4KLSAgIE11c3QgYmUgY2FsbGVkIG9uY2UgYXQgc3RhcnQgdXAgKG9yIHdoZW4gZmlyc3QgbmVlZGVkKS4KLQotICAgRkxBR1MgaXMgYSBzZXQgb2YgYml0cyB0aGF0IHNheSB3aGF0IHZlcnNpb24gb2YgdGhlIGNwdSB3ZSBoYXZlLAotICAgYW5kIGluIHBhcnRpY3VsYXIgYXQgbGVhc3QgKG9uZSBvZikgQVJDX01BQ0hfWFhYLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X3RhYmxlcyAoZmxhZ3MpCi0gICAgIGludCBmbGFnczsKLXsKLSAgc3RhdGljIGludCBpbml0X3AgPSAwOwotCi0gIGNwdV90eXBlID0gZmxhZ3M7Ci0KLSAgLyogV2UgbWF5IGJlIGludGVudGlvbmFsbHkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIChmb3IgZXhhbXBsZSBnZGIgd2lsbCBjYWxsCi0gICAgIHVzIGVhY2ggdGltZSB0aGUgdXNlciBzd2l0Y2hlcyBjcHUpLiAgVGhlc2UgdGFibGVzIG9ubHkgbmVlZCB0byBiZSBpbml0J2QKLSAgICAgb25jZSB0aG91Z2guICAqLwotICAvKiA/Pz8gV2UgY2FuIHJlbW92ZSB0aGUgbmVlZCBmb3IgYXJjX29wY29kZV9zdXBwb3J0ZWQgYnkgdGFraW5nIGl0IGludG8KLSAgICAgYWNjb3VudCBoZXJlLCBidXQgSSdtIG5vdCBzdXJlIEkgd2FudCB0byBkbyB0aGF0IHlldCAoaWYgZXZlcikuICAqLwotICBpZiAoIWluaXRfcCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgaSxuOwotCi0gICAgICBtZW1zZXQgKGFyY19vcGVyYW5kX21hcCwgMCwgc2l6ZW9mIChhcmNfb3BlcmFuZF9tYXApKTsKLSAgICAgIG4gPSBzaXplb2YgKGFyY19vcGVyYW5kcykgLyBzaXplb2YgKGFyY19vcGVyYW5kc1swXSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCWFyY19vcGVyYW5kX21hcFthcmNfb3BlcmFuZHNbaV0uZm10XSA9IGk7Ci0KLSAgICAgIG1lbXNldCAob3Bjb2RlX21hcCwgMCwgc2l6ZW9mIChvcGNvZGVfbWFwKSk7Ci0gICAgICBtZW1zZXQgKGljb2RlX21hcCwgMCwgc2l6ZW9mIChpY29kZV9tYXApKTsKLSAgICAgIC8qIFNjYW4gdGhlIHRhYmxlIGJhY2t3YXJkcyBzbyBtYWNyb3MgYXBwZWFyIGF0IHRoZSBmcm9udC4gICovCi0gICAgICBmb3IgKGkgPSBhcmNfb3Bjb2Rlc19jb3VudCAtIDE7IGkgPj0gMDsgLS1pKQotCXsKLQkgIGludCBvcGNvZGVfaGFzaCA9IEFSQ19IQVNIX09QQ09ERSAoYXJjX29wY29kZXNbaV0uc3ludGF4KTsKLQkgIGludCBpY29kZV9oYXNoID0gQVJDX0hBU0hfSUNPREUgKGFyY19vcGNvZGVzW2ldLnZhbHVlKTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9hc20gPSBvcGNvZGVfbWFwW29wY29kZV9oYXNoXTsKLQkgIG9wY29kZV9tYXBbb3Bjb2RlX2hhc2hdID0gJmFyY19vcGNvZGVzW2ldOwotCi0JICBhcmNfb3Bjb2Rlc1tpXS5uZXh0X2RpcyA9IGljb2RlX21hcFtpY29kZV9oYXNoXTsKLQkgIGljb2RlX21hcFtpY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQl9Ci0KLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BDT0RFIGlzIHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWVkIGNwdS4KLSAgIENwdSBzZWxlY3Rpb24gaXMgbWFkZSB3aGVuIGNhbGxpbmcgYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnLiAgKi8KLQotaW50Ci1hcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotewotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BDT0RFX0NQVSAob3Bjb2RlLT5mbGFncykgJiBBUkNfSEFWRV9DUFUgKGNwdV90eXBlKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBPUFZBTCBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wdmFsX3N1cHBvcnRlZCAob3B2YWwpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqb3B2YWw7Ci17Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9hc20gKGluc24pCi0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHJldHVybiBvcGNvZGVfbWFwW0FSQ19IQVNIX09QQ09ERSAoaW5zbildOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBkaXNhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9kaXMgKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICByZXR1cm4gaWNvZGVfbWFwW0FSQ19IQVNIX0lDT0RFIChpbnNuKV07Ci19Ci0MCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYW4gJ2YnIHN1ZmZpeCAoaW4gY2VydGFpbiBpbnNucykuICAqLwotc3RhdGljIGludCBmbGFnX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgJ2YnIHN1ZmZpeC4gICovCi1zdGF0aWMgaW50IGZsYWdzaGltbV9oYW5kbGVkX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgc2VlbiBhICdxJyBzdWZmaXggKGNvbmRpdGlvbiBjb2RlKS4gICovCi1zdGF0aWMgaW50IGNvbmRfcDsKLQotLyogTm9uemVybyBpZiB3ZSd2ZSBpbnNlcnRlZCBhIHNoaW1tLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBzaGltbSB3ZSBpbnNlcnRlZCAoZWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW07Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBsaW1tIChkdXJpbmcgYXNzZW1ibHkpIG9yIHNlZW4gYSBsaW1tCi0gICAoZHVyaW5nIGRpc2Fzc2VtYmx5KS4gICovCi1zdGF0aWMgaW50IGxpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBsaW1tIHdlIGluc2VydGVkLiAgRWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBsb25nIGxpbW07Ci0MCi0vKiBJbnNlcnRpb24gZnVuY3Rpb25zLiAgKi8KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgYmVmb3JlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfaW5zZXJ0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBjb25kX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGhhcyBhIGxpbW0gb3BlcmFuZC4KLSAgIEFsc28gY2FsbGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGNvbnRhaW5zIGEgbGltbS4gICovCi0KLWludAotYXJjX29wY29kZV9saW1tX3AgKGxpbW1wKQotICAgICBsb25nICpsaW1tcDsKLXsKLSAgaWYgKGxpbW1wKQotICAgICpsaW1tcCA9IGxpbW07Ci0gIHJldHVybiBsaW1tX3A7Ci19Ci0KLS8qIEluc2VydCBhIHZhbHVlIGludG8gYSByZWdpc3RlciBmaWVsZC4KLSAgIElmIFJFRyBpcyBOVUxMLCB0aGVuIHRoaXMgaXMgYWN0dWFsbHkgYSBjb25zdGFudC4KLQotICAgV2UgbXVzdCBhbHNvIGhhbmRsZSBhdXhpbGlhcnkgcmVnaXN0ZXJzIGZvciBsci9zciBpbnNucy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBjb25zdGFudCB0aGF0IGFsc28gcmVxdWlyZXMgYSB2YWx1ZSBzdG9yZWQgaW4gYSByZWdpc3RlcgotCSBmaWVsZC4gIEhhbmRsZSB0aGVzZSBieSB1cGRhdGluZyB0aGUgcmVnaXN0ZXIgZmllbGQgYW5kIHNhdmluZyB0aGUKLQkgdmFsdWUgZm9yIGxhdGVyIGhhbmRsaW5nIGJ5IGVpdGhlciAlUyAoc2hpbW0pIG9yICVMIChsaW1tKS4gICovCi0KLSAgICAgIC8qIFRyeSB0byB1c2UgYSBzaGltbSB2YWx1ZSBiZWZvcmUgYSBsaW1tIG9uZS4gICovCi0gICAgICBpZiAoQVJDX1NISU1NX0NPTlNUX1AgKHZhbHVlKQotCSAgLyogSWYgd2UndmUgc2VlbiBhIGNvbmRpdGlvbmFsIHN1ZmZpeCB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgIWNvbmRfcAotCSAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgc2hpbW0gdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiBvdXJzCi0JICAgICB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgKCFzaGltbV9wIHx8IHNoaW1tID09IHZhbHVlKSkKLQl7Ci0JICBpbnQgbWFya2VyID0gZmxhZ19wID8gQVJDX1JFR19TSElNTV9VUERBVEUgOiBBUkNfUkVHX1NISU1NOwotCSAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0JICBzaGltbV9wID0gMTsKLQkgIHNoaW1tID0gdmFsdWU7Ci0JICBpbnNuIHw9IG1hcmtlciA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgIC8qIGluc24gfD0gdmFsdWUgJiA1MTE7IC0gZG9uZSBsYXRlciAqLwotCX0KLSAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIGEgbGltbS4gIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvbmUgdGhleSBtdXN0IG1hdGNoLiAgKi8KLSAgICAgIGVsc2UgaWYgKCFsaW1tX3AgfHwgbGltbSA9PSB2YWx1ZSkKLQl7Ci0JICBsaW1tX3AgPSAxOwotCSAgbGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBBUkNfUkVHX0xJTU0gPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGxhdGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmVycm1zZyA9IF8oInVuYWJsZSB0byBmaXQgZGlmZmVyZW50IHZhbHVlZCBjb25zdGFudHMgaW50byBpbnN0cnVjdGlvbiIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGhhbmRsZSBib3RoIG5vcm1hbCBhbmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0KLSAgICAgIGlmIChyZWctPnR5cGUgPT0gQVVYUkVHKQotCXsKLQkgIGlmICghKG1vZHMgJiBBUkNfTU9EX0FVWFJFRykpCi0JICAgICplcnJtc2cgPSBfKCJhdXhpbGlhcnkgcmVnaXN0ZXIgbm90IGFsbG93ZWQgaGVyZSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSBBUkNfUkVHX1NISU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBhcmNfb3BlcmFuZHNbcmVnLT50eXBlXS5zaGlmdDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGFuIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyIGhlcmUuICAqLwotCSAgaWYgKCh1bnNpZ25lZCBpbnQpIHJlZy0+dmFsdWUgPiA2MCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgc3ByaW50ZiAoYnVmLCBfKCJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBgJWQnIiksIHJlZy0+dmFsdWUpOwotCSAgICAgICplcnJtc2cgPSBidWY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaW5zbiB8PSByZWctPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhbiAnZicgZmxhZy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIC8qIFdlIGNhbid0IHN0b3JlIGFueXRoaW5nIGluIHRoZSBpbnNuIHVudGlsIHdlJ3ZlIHBhcnNlZCB0aGUgcmVnaXN0ZXJzLgotICAgICBKdXN0IHJlY29yZCB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGdvdCB0aGlzIGZsYWcuICBgaW5zZXJ0X3JlZycgd2lsbCB1c2UgaXQKLSAgICAgdG8gc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKEFSQ19SRUdfU0hJTU1fVVBEQVRFIG9yIGJpdCAweDEwMCkuICAqLwotICBmbGFnX3AgPSAxOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgY29tcGxldGVseSBidWlsZGluZyBhbiBpbnNuIHRvIGVuc3VyZSB0aGUgJ2YnIGZsYWcgZ2V0cyBzZXQKLSAgIHByb3Blcmx5LiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBzZXQgdGhpcyBmbGFnIHVudGlsCi0gICB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWdmaW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChmbGFnX3AgJiYgIWZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgewotICAgICAgaWYgKHNoaW1tX3ApCi0JYWJvcnQgKCk7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICAgIGluc24gfD0gKDEgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhIGNvbmRpdGlvbmFsIGZsYWcgKGVnOiAuZXEpLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfY29uZCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIHRoZSAiaiIgaW5zdHJ1Y3Rpb24gdG8gcHJldmVudCBjb25zdGFudHMgZnJvbSBiZWluZyBpbnRlcnByZXRlZCBhcwotICAgc2hpbW0gdmFsdWVzICh3aGljaCB0aGUganVtcCBpbnNuIGRvZXNuJ3QgYWNjZXB0KS4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZAotICAgdG8gZm9yY2UgdGhlIHVzZSBvZiBsaW1tIHZhbHVlcyBpbiBvdGhlciBzaXR1YXRpb25zIChlZzogbGQgcjAsW2Zvb10gdXNlcwotICAgdGhpcykuCi0gICA/Pz8gVGhlIG1lY2hhbmlzbSBpcyBzb3VuZC4gIEFjY2VzcyB0byBpdCBpcyBhIGJpdCBrbHVua3kgcmlnaHQgbm93LiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfZm9yY2VsaW1tIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBjb25kX3AgPSAxOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiBsZC9zdCBpbnNucyB0byBoYW5kbGUgdGhlIHNoaW1tIG9mZnNldCBmaWVsZC4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tb2Zmc2V0IChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBsb25nIG1pbnZhbCwgbWF4dmFsOwotICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICBpZiAocmVnICE9IE5VTEwpCi0gICAgewotICAgICAgKmVycm1zZyA9ICJyZWdpc3RlciBhcHBlYXJzIHdoZXJlIHNoaW1tIHZhbHVlIGV4cGVjdGVkIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzICp3YXkqIG1vcmUgZ2VuZXJhbCB0aGFuIG5lY2Vzc2FyeSwgYnV0IG1heWJlIHNvbWUgZGF5IGl0J2xsCi0JIGJlIHVzZWZ1bC4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JewotCSAgbWludmFsID0gLSgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgbWF4dmFsID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW52YWwgPSAwOwotCSAgbWF4dmFsID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCX0KLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoYnVmLCBfKCJ2YWx1ZSB3b24ndCBmaXQgaW4gcmFuZ2UgJWxkIC0gJWxkIiksCi0JCSAgIG1pbnZhbCwgbWF4dmFsKTsKLQkgICplcnJtc2cgPSBidWY7Ci0JfQotICAgICAgZWxzZQotCWluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgd2hlbiB0aGUgc2hpbW0gb2Zmc2V0IGlzIDAuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbXplcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHNoaW1tX3AgPSAxOwotICBzaGltbSA9IDA7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nIG5vcm1hbCBpbnNucyAoZWc6IGFkZCkgdG8gaW5zZXJ0IGEgc2hpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW1maW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChzaGltbV9wKQotICAgIGluc24gfD0gKHNoaW1tICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIGxpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludGVuZGVkIHRvIGhhbmRsZSBpbnN0cnVjdGlvbnMgKHdpdGggNCBieXRlCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMpLiAgSXQgaXMgbm90IGludGVuZGVkIHRvIGhhbmRsZSBkYXRhLiAgKi8KLQotLyogPz8/IEFjdHVhbGx5LCB0aGVyZSdzIG5vdGhpbmcgZm9yIHVzIHRvIGRvIGFzIHdlIGNhbid0IGNhbGwgZnJhZ19tb3JlLCB0aGUKLSAgIGNhbGxlciBtdXN0IGRvIHRoYXQuICBUaGUgZXh0cmFjdCBmbnMgdGFrZSBhIHBvaW50ZXIgdG8gdHdvIHdvcmRzLiAgVGhlCi0gICBpbnNlcnQgZm5zIGNvdWxkIGJlIGNvbnZlcnRlZCBhbmQgdGhlbiB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgdXNlZnVsLCBidXQKLSAgIHRoZW4gdGhlIHJlbG9jIGhhbmRsZXJzIHdvdWxkIGhhdmUgdG8ga25vdyB0byB3b3JrIG9uIHRoZSBzZWNvbmQgd29yZCBvZgotICAgYSAyIHdvcmQgcXVhbnRpdHkuICBUaGF0J3MgdG9vIG11Y2ggc28gd2UgZG9uJ3QgaGFuZGxlIHRoZW0uICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9saW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAobGltbV9wKQotICAgIDsgLyogbm90aGluZyB0byBkbywgZ2FzIGRvZXMgaXQgKi8KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHVuYXJ5IG9wZXJhbmQgbWFjcm9zIHRvIGNvcHkgdGhlIEIgZmllbGQgdG8gQy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3Vub3BtYWNybyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbiB8PSAoKGluc24gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIHJlbGF0aXZlIGFkZHJlc3MgZm9yIGEgYnJhbmNoIGluc24gKGIsIGJsLCBvciBscCkuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgJiAzKQotICAgICplcnJtc2cgPSBfKCJicmFuY2ggYWRkcmVzcyBub3Qgb24gNCBieXRlIGJvdW5kYXJ5Iik7Ci0gIGluc24gfD0gKCh2YWx1ZSA+PiAyKSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIGxpbW0gdmFsdWUgYXMgYSAyNiBiaXQgYWRkcmVzcyByaWdodCBzaGlmdGVkIDIgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfYWJzYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgcmV0dXJuIGluc247Ci19Ci0MCi0vKiBFeHRyYWN0aW9uIGZ1bmN0aW9ucy4KLQotICAgVGhlIHN1ZmZpeCBleHRyYWN0aW9uIGZ1bmN0aW9ucycgcmV0dXJuIHZhbHVlIGlzIHJlZHVuZGFudCBzaW5jZSBpdCBjYW4gYmUKLSAgIG9idGFpbmVkIGZyb20gKCpPUFZBTCktPnZhbHVlLiAgSG93ZXZlciwgdGhlIGJvb2xlYW4gc3VmZml4ZXMgZG9uJ3QgaGF2ZQotICAgYSBzdWZmaXggdGFibGUgZW50cnkgZm9yIHRoZSAiZmFsc2UiIGNhc2UsIHNvIHZhbHVlcyBvZiB6ZXJvIG11c3QgYmUKLSAgIG9idGFpbmVkIGZyb20gdGhlIHJldHVybiB2YWx1ZSAoKk9QVkFMID09IE5VTEwpLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqbG9va3VwX3JlZ2lzdGVyIChpbnQgdHlwZSwgbG9uZyByZWdubyk7Ci0KLS8qIENhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGJlZm9yZSBwcmludGluZyBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF9leHRyYWN0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQXMgd2UncmUgZXh0cmFjdGluZyByZWdpc3RlcnMsIGtlZXAgYW4gZXllIG91dCBmb3IgdGhlICdmJyBpbmRpY2F0b3IKLSAgIChBUkNfUkVHX1NISU1NX1VQREFURSkuICBJZiB3ZSBmaW5kIGEgcmVnaXN0ZXIgKG5vdCBhIGNvbnN0YW50IG1hcmtlciwKLSAgIGxpa2UgQVJDX1JFR19TSElNTSksIHNldCBPUFZBTCBzbyBvdXIgY2FsbGVyIHdpbGwga25vdyB0aGlzIGlzIGEgcmVnaXN0ZXIuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICBUaGV5IGFyZSBqdXN0Ci0gICBjb25zdGFudHMgd2l0aCBzcGVjaWFsIG5hbWVzLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCByZWdubzsKLSAgbG9uZyB2YWx1ZTsKLQotICAvKiBHZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gIHJlZ25vID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLSAgLyogSXMgaXQgYSBjb25zdGFudCBtYXJrZXI/ICAqLwotICBpZiAocmVnbm8gPT0gQVJDX1JFR19TSElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU1fVVBEQVRFKQotICAgIHsKLSAgICAgIHZhbHVlID0gaW5zblswXSAmIDUxMTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAyNTYpKQotCXZhbHVlIC09IDUxMjsKLSAgICAgIGZsYWdfcCA9IDE7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfTElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMV07Ci0gICAgICBsaW1tX3AgPSAxOwotICAgIH0KLSAgLyogSXQncyBhIHJlZ2lzdGVyLCBzZXQgT1BWQUwgKHRoYXQncyB0aGUgb25seSB3YXkgd2UgZGlzdGluZ3Vpc2ggcmVnaXN0ZXJzCi0gICAgIGZyb20gY29uc3RhbnRzIGhlcmUpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnID0gbG9va3VwX3JlZ2lzdGVyIChSRUcsIHJlZ25vKTsKLQotICAgICAgaWYgKHJlZyA9PSBOVUxMKQotCWFib3J0ICgpOwotICAgICAgaWYgKG9wdmFsICE9IE5VTEwpCi0JKm9wdmFsID0gcmVnOwotICAgICAgdmFsdWUgPSByZWdubzsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCB0YWtlcyBhbiBhdXhpbGlhcnkgcmVnaXN0ZXIsIHNlZSBpZiBpdCdzIGEga25vd24gb25lLiAgKi8KLSAgaWYgKChtb2RzICYgQVJDX01PRF9BVVhSRUcpCi0gICAgICAmJiBBUkNfUkVHX0NPTlNUQU5UX1AgKHJlZ25vKSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoQVVYUkVHLCB2YWx1ZSk7Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGEgY29uc3RhbnQsIGJ1dCB0ZWxsIHRoZSBjYWxsZXIgaXQgaGFzIGEgc3BlY2lhbAotCSBuYW1lLiAgKi8KLSAgICAgIGlmIChyZWcgIT0gTlVMTCAmJiBvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAiZmxhZyB1cGRhdGUiIGZpZWxkIGZvciBzaGltbSBpbnNucy4KLSAgIFRoaXMgdmFsdWUgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSByZWdpc3RlciBmaWVsZC4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaW50IGY7Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdmFsOwotCi0gIGlmIChmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIGYgPSBmbGFnX3AgIT0gMDsKLSAgZWxzZQotICAgIGYgPSAoaW5zblswXSAmICgxIDw8IG9wZXJhbmQtPnNoaWZ0KSkgIT0gMDsKLQotICAvKiBUaGVyZSBpcyBubyB0ZXh0IGZvciB6ZXJvIHZhbHVlcy4gICovCi0gIGlmIChmID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gYXJjX29wY29kZV9sb29rdXBfc3VmZml4IChvcGVyYW5kLCAxKTsKLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gdmFsLT52YWx1ZTsKLX0KLQotLyogRXh0cmFjdCB0aGUgY29uZGl0aW9uIGNvZGUgKGlmIGl0IGV4aXN0cykuCi0gICBJZiB3ZSd2ZSBzZWVuIGEgc2hpbW0gdmFsdWUgaW4gdGhpcyBpbnNuIChtZWFuaW5nIHRoYXQgdGhlIGluc24gY2FuJ3QgaGF2ZQotICAgYSBjb25kaXRpb24gY29kZSBmaWVsZCksIHRoZW4gd2UgZG9uJ3Qgc3RvcmUgYW55dGhpbmcgaW4gT1BWQUwgYW5kIHJldHVybgotICAgemVyby4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyBjb25kOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICByZXR1cm4gMDsKLQotICBjb25kID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgY29uZCk7Ci0KLSAgLyogSWdub3JlIE5VTEwgdmFsdWVzIG9mIGB2YWwnLiAgU2V2ZXJhbCBjb25kaXRpb24gY29kZSB2YWx1ZXMgYXJlCi0gICAgIHJlc2VydmVkIGZvciBleHRlbnNpb25zLiAgKi8KLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gY29uZDsKLX0KLQotLyogRXh0cmFjdCBhIGJyYW5jaCBhZGRyZXNzLgotICAgV2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHJlYWwgYWRkcmVzcyAobm90IHJpZ2h0IHNoaWZ0ZWQgYnkgMikuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgYWRkcjsKLQotICBhZGRyID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0gICAgICAmJiAoYWRkciAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLSAgICBhZGRyIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKLQotICByZXR1cm4gYWRkciA8PCAyOwotfQotCi0vKiBUaGUgb25seSB0aGluZyB0aGlzIGRvZXMgaXMgc2V0IHRoZSBgaW52YWxpZCcgZmxhZyBpZiBCICE9IEMuCi0gICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSAibW92IiBtYWNybyBhcHBlYXJzIGJlZm9yZSBpdCdzIHJlYWwgaW5zbiAiYW5kIgotICAgYW5kIHdlIGRvbid0IHdhbnQgdGhlIGRpc2Fzc2VtYmxlciB0byBjb25mdXNlIHRoZW0uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgLyogVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgQiA9PSBBUkNfUkVHX1NISU1NX1VQREFURSAmJgotICAgICBDID09IEFSQ19SRUdfU0hJTU0gKG9yIHZpY2UgdmVyc2EpLiAgTm8gYmlnIGRlYWwuICBUaG9zZSBpbnNucyB3aWxsIGdldAotICAgICBwcmludGVkIGFzICJhbmQicy4gICovCi0gIGlmICgoKGluc25bMF0gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKQotICAgICAgIT0gKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdDKSAmIEFSQ19NQVNLX1JFRykpCi0gICAgaWYgKGludmFsaWQgIT0gTlVMTCkKLSAgICAgICppbnZhbGlkID0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVXRpbGl0eSBmb3IgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb25zIHRvIHJldHVybiB0aGUgaW5kZXggaW50bwotICAgYGFyY19zdWZmaXhlcycuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotYXJjX29wY29kZV9sb29rdXBfc3VmZml4ICh0eXBlLCB2YWx1ZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdiwqZW5kOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHYgPSBhcmNfc3VmZml4ZXMsIGVuZCA9IGFyY19zdWZmaXhlcyArIGFyY19zdWZmaXhlc19jb3VudDsgdiA8IGVuZDsgKyt2KQotICAgIGlmICh0eXBlID09ICZhcmNfb3BlcmFuZHNbdi0+dHlwZV0KLQkmJiB2YWx1ZSA9PSB2LT52YWx1ZSkKLSAgICAgIHJldHVybiB2OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqCi1sb29rdXBfcmVnaXN0ZXIgKHR5cGUsIHJlZ25vKQotICAgICBpbnQgdHlwZTsKLSAgICAgbG9uZyByZWdubzsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyLCplbmQ7Ci0KLSAgaWYgKHR5cGUgPT0gUkVHKQotICAgIHJldHVybiAmYXJjX3JlZ19uYW1lc1tyZWdub107Ci0KLSAgLyogPz8/IFRoaXMgaXMgYSBsaXR0bGUgc2xvdyBhbmQgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotCi0gIGZvciAociA9IGFyY19yZWdfbmFtZXMsIGVuZCA9IGFyY19yZWdfbmFtZXMgKyBhcmNfcmVnX25hbWVzX2NvdW50OwotICAgICAgIHIgPCBlbmQ7ICsrcikKLSAgICBpZiAodHlwZSA9PSByLT50eXBlCSYmIHJlZ25vID09IHItPnZhbHVlKQotICAgICAgcmV0dXJuIHI7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tZGlzLmMgYi9vcGNvZGVzL2FybS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlNzExMi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNzEgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSTQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLSAgIE1vZGlmaWNhdGlvbiBieSBKYW1lcyBHLiBTbWl0aCAoanNtaXRoQGN5Z251cy5jby51aykKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlib3Bjb2Rlcy4gCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi10aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uIAotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLUFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotbW9yZSBkZXRhaWxzLiAKLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiYXJtLW9wYy5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBkb25lIGhlcmUgKi8KLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotCi0jaWZuZGVmIHN0cmVxCi0jZGVmaW5lIHN0cmVxKGEsYikJKHN0cmNtcCAoKGEpLCAoYikpID09IDApCi0jZW5kaWYKLQotI2lmbmRlZiBzdHJuZXEKLSNkZWZpbmUgc3RybmVxKGEsYixuKQkoc3RybmNtcCAoKGEpLCAoYiksIChuKSkgPT0gMCkKLSNlbmRpZgotCi0jaWZuZGVmIE5VTV9FTEVNCi0jZGVmaW5lIE5VTV9FTEVNKGEpICAgICAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgKiBhcm1fY29uZGl0aW9uYWxbXSA9Ci17ImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwgInBsIiwgInZzIiwgInZjIiwKLSAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAiIiwgIm52In07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBjb25zdCBjaGFyICogZGVzY3JpcHRpb247Ci0gIGNvbnN0IGNoYXIgKiByZWdfbmFtZXNbMTZdOwotfQotYXJtX3JlZ25hbWU7Ci0KLXN0YXRpYyBhcm1fcmVnbmFtZSByZWduYW1lc1tdID0KLXsKLSAgeyAicmF3IiAsICJTZWxlY3QgcmF3IHJlZ2lzdGVyIG5hbWVzIiwKLSAgICB7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSJ9fSwKLSAgeyAic3RkIiwgICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiBBUk0ncyBJU0EgZG9jdW1lbnRhdGlvbiIsCi0gICAgeyAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAic3AiLCAgImxyIiwgICJwYyIgfX0sCi0gIHsgImFwY3MiLCAiU2VsZWN0IHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gdGhlIEFQQ1MiLAotICAgIHsgImExIiwgImEyIiwgImEzIiwgImE0IiwgInYxIiwgInYyIiwgInYzIiwgInY0IiwgInY1IiwgInY2IiwgInNsIiwgICJmcCIsICAiaXAiLCAgInNwIiwgICJsciIsICAicGMiIH19LAotICB7ICJhdHBjcyIsICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiB0aGUgQVRQQ1MiLAotICAgIHsgImExIiwgImEyIiwgImEzIiwgImE0IiwgInYxIiwgInYyIiwgInYzIiwgInY0IiwgInY1IiwgInY2IiwgInY3IiwgICJ2OCIsICAiSVAiLCAgIlNQIiwgICJMUiIsICAiUEMiIH19LAotICB7ICJzcGVjaWFsLWF0cGNzIiwgIlNlbGVjdCBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gdGhlIEFUUENTIiwKLSAgICB7ICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJXUiIsICJ2NSIsICJTQiIsICJTTCIsICAiRlAiLCAgIklQIiwgICJTUCIsICAiTFIiLCAgIlBDIiB9fQotfTsKLQotLyogRGVmYXVsdCB0byBzdGFuZGFyZCByZWdpc3RlciBuYW1lIHNldC4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJlZ25hbWVfc2VsZWN0ZWQgPSAxOwotCi0jZGVmaW5lIE5VTV9BUk1fUkVHTkFNRVMgIE5VTV9FTEVNIChyZWduYW1lcykKLSNkZWZpbmUgYXJtX3JlZ25hbWVzICAgICAgcmVnbmFtZXNbcmVnbmFtZV9zZWxlY3RlZF0ucmVnX25hbWVzCi0KLXN0YXRpYyBib29sZWFuIGZvcmNlX3RodW1iID0gZmFsc2U7Ci0KLXN0YXRpYyBjaGFyICogYXJtX2ZwX2NvbnN0W10gPQoteyIwLjAiLCAiMS4wIiwgIjIuMCIsICIzLjAiLCAiNC4wIiwgIjUuMCIsICIwLjUiLCAiMTAuMCJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9zaGlmdFtdID0gCi17ImxzbCIsICJsc3IiLCAiYXNyIiwgInJvciJ9OwotDAotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLwotc3RhdGljIHZvaWQgYXJtX2RlY29kZV9zaGlmdCBQQVJBTVMgKChsb25nLCBmcHJpbnRmX2Z0eXBlLCB2b2lkICopKTsKLXN0YXRpYyBpbnQgIHByaW50X2luc25fYXJtICAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIGludCAgcHJpbnRfaW5zbl90aHVtYiBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgIHByaW50X2luc24gICAgICAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotaW50IGdldF9hcm1fcmVnbmFtZV9udW1fb3B0aW9ucyAodm9pZCk7Ci1pbnQgc2V0X2FybV9yZWduYW1lX29wdGlvbiAoaW50IG9wdGlvbik7Ci1pbnQgZ2V0X2FybV9yZWduYW1lcyAoaW50IG9wdGlvbiwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgICAgIGNvbnN0IGNoYXIgKipzZXRkZXNjcmlwdGlvbiwKLQkJICAgICAgY29uc3QgY2hhciAqKipyZWdpc3Rlcl9uYW1lcyk7Ci0MCi0vKiBGdW5jdGlvbnMuICovCi1pbnQKLWdldF9hcm1fcmVnbmFtZV9udW1fb3B0aW9ucyAodm9pZCkKLXsKLSAgcmV0dXJuIE5VTV9BUk1fUkVHTkFNRVM7Ci19Ci0KLWludAotc2V0X2FybV9yZWduYW1lX29wdGlvbiAoaW50IG9wdGlvbikKLXsKLSAgaW50IG9sZCA9IHJlZ25hbWVfc2VsZWN0ZWQ7Ci0gIHJlZ25hbWVfc2VsZWN0ZWQgPSBvcHRpb247Ci0gIHJldHVybiBvbGQ7Ci19Ci0KLWludAotZ2V0X2FybV9yZWduYW1lcyAoaW50IG9wdGlvbiwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgY29uc3QgY2hhciAqKnNldGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKipyZWdpc3Rlcl9uYW1lcykKLXsKLSAgKnNldG5hbWUgPSByZWduYW1lc1tvcHRpb25dLm5hbWU7Ci0gICpzZXRkZXNjcmlwdGlvbiA9IHJlZ25hbWVzW29wdGlvbl0uZGVzY3JpcHRpb247Ci0gICpyZWdpc3Rlcl9uYW1lcyA9IHJlZ25hbWVzW29wdGlvbl0ucmVnX25hbWVzOwotICByZXR1cm4gMTY7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKQotICAgICBsb25nIGdpdmVuOwotICAgICBmcHJpbnRmX2Z0eXBlIGZ1bmM7Ci0gICAgIHZvaWQgKiBzdHJlYW07Ci17Ci0gIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0gIAotICBpZiAoKGdpdmVuICYgMHhmZjApICE9IDApCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIDB4MTApID09IDApCi0JewotCSAgaW50IGFtb3VudCA9IChnaXZlbiAmIDB4ZjgwKSA+PiA3OwotCSAgaW50IHNoaWZ0ID0gKGdpdmVuICYgMHg2MCkgPj4gNTsKLQkgIAotCSAgaWYgKGFtb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNoaWZ0ID09IDMpCi0JCXsKLQkJICBmdW5jIChzdHJlYW0sICIsIHJyeCIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIAotCSAgICAgIGFtb3VudCA9IDMyOwotCSAgICB9Ci0JICAKLQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMgIyVkIiwgYXJtX3NoaWZ0W3NoaWZ0XSwgYW1vdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyAoc3RyZWFtLCAiLCAlcyAlcyIsIGFybV9zaGlmdFsoZ2l2ZW4gJiAweDYwKSA+PiA1XSwKLQkgICAgICBhcm1fcmVnbmFtZXNbKGdpdmVuICYgMHhmMDApID4+IDhdKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIEFSTSkuICovCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKQotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci0gICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW47Ci17Ci0gIHN0cnVjdCBhcm1fb3Bjb2RlICogIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICAgZnVuYyAgID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IGFybV9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKLSAgICB7Ci0gICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCi0JewotCSAgY2hhciAqIGM7Ci0JICAKLQkgIGZvciAoYyA9IGluc24tPmFzc2VtYmxlcjsgKmM7IGMrKykKLQkgICAgewotCSAgICAgIGlmICgqYyA9PSAnJScpCi0JCXsKLQkJICBzd2l0Y2ggKCorK2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICclJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICBpZiAoKChnaXZlbiAmIDB4MDAwZjAwMDApID09IDB4MDAwZjAwMDApCi0JCQkgICYmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKSkKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMiKTsKLSAKLQkJCSAgaWYgKGdpdmVuICYgMHgwMTAwMDAwMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQlvZmZzZXQgPSAtIG9mZnNldDsKLQkJCSAgCi0JCQkgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiLCAjJXhdIiwgb2Zmc2V0KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IHBjICsgODsKLQotCQkJICAgICAgLyogQ29wZSB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiB3cml0ZS1iYWNrCi0JCQkJIGJlaW5nIHVzZWQuICBQcm9iYWJseSBhIHZlcnkgZGFuZ2Vyb3VzIHRoaW5nCi0JCQkJIGZvciB0aGUgcHJvZ3JhbW1lciB0byBkbywgYnV0IHdobyBhcmUgd2UgdG8KLQkJCQkgYXJndWUgPyAgKi8KLQkJCSAgICAgIGlmIChnaXZlbiAmIDB4MDAyMDAwMDApCi0JCQkJZnVuYyAoc3RyZWFtLCAiISIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFBvc3QgaW5kZXhlZC4gICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdLCAjJXgiLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgPSBwYyArIDg7ICAvKiBpZSBpZ25vcmUgdGhlIG9mZnNldC4gICovCi0JCQkgICAgfQotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOwotCQkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCwgaW5mbyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCi0JCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApCi0JCQkJewotCQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkJICBpZiAob2Zmc2V0KQotCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIikpOwotCQkJCSAgYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7Ci0JCQkJfQotCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKLQkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKSAKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgMHgwMDRmMDAwMCkgPT0gMHgwMDRmMDAwMCkKLQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgcmVsYXRpdmUgd2l0aCBpbW1lZGlhdGUgb2Zmc2V0LiAgKi8KLQkJCSAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJICAKLQkJCSAgaWYgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIltwYywgIyV4XVx0OyAiLCBvZmZzZXQpOwotCQkJICAKLQkJCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCQkgICAgKG9mZnNldCArIHBjICsgOCwgaW5mbyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCi0JCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlLWluZGV4ZWQuICAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltbWVkaWF0ZS4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyLiAgKi8KLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotCQkJCX0KLQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCi0JCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0LWluZGV4ZWQuICAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltbWVkaWF0ZS4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpc3Rlci4gICovCi0JCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCQkgIAotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJKEJESVNQIChnaXZlbikgKiA0ICsgcGMgKyA4LCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsCi0JCQkgICAgYXJtX2NvbmRpdGlvbmFsIFsoZ2l2ZW4gPj4gMjgpICYgMHhmXSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgewotCQkJaW50IHN0YXJ0ZWQgPSAwOwotCQkJaW50IHJlZzsKLQotCQkJZnVuYyAoc3RyZWFtLCAieyIpOwotCQkJZm9yIChyZWcgPSAwOyByZWcgPCAxNjsgcmVnKyspCi0JCQkgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzdGFydGVkKQotCQkJCWZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0JCQkgICAgICBzdGFydGVkID0gMTsKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotCQkJICAgIH0KLQkJCWZ1bmMgKHN0cmVhbSwgIn0iKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbyc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSAhPSAwKQotCQkJewotCQkJICBpbnQgcm90YXRlID0gKGdpdmVuICYgMHhmMDApID4+IDc7Ci0JCQkgIGludCBpbW1lZCA9IChnaXZlbiAmIDB4ZmYpOwotCQkJICBpbW1lZCA9ICgoKGltbWVkIDw8ICgzMiAtIHJvdGF0ZSkpCi0JCQkJICAgIHwgKGltbWVkID4+IHJvdGF0ZSkpICYgMHhmZmZmZmZmZik7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIiMlZFx0OyAweCV4IiwgaW1tZWQsIGltbWVkKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdwJzoKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDAwMGYwMDApID09IDB4MDAwMGYwMDApCi0JCQlmdW5jIChzdHJlYW0sICJwIik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICd0JzoKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEyMDAwMDApID09IDB4MDAyMDAwMDApCi0JCQlmdW5jIChzdHJlYW0sICJ0Iik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDAwMDAwMjApID09IDB4MDAwMDAwMjApCi0JCQlmdW5jIChzdHJlYW0sICJoIik7Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiYiIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnQSc6Ci0JCSAgICAgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIGFybV9yZWduYW1lcyBbKGdpdmVuID4+IDE2KSAmIDB4Zl0pOwotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKLQkJCSAgaWYgKG9mZnNldCkKLQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkXSVzIiwKLQkJCQkgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAotCQkJCSAgb2Zmc2V0ICogNCwKLQkJCQkgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwID8gIiEiIDogIiIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmOwotCQkJICBpZiAob2Zmc2V0KQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAotCQkJCSAgb2Zmc2V0ICogNCk7Ci0JCQkgIGVsc2UKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdDJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDAwZjAwMDApCi0JCQl7Ci0JCQlkZWZhdWx0OgotCQkJICBmdW5jIChzdHJlYW0sICJfPz8/Iik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDkwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJfYWxsIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDEwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJfYyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX3giKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4NDAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9zIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJfZiIpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0YnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIxIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwNDAwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIyIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJCQotCQkgICAgY2FzZSAnUCc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwOgotCQkJICBmdW5jIChzdHJlYW0sICJkIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwMDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJlIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdRJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg0MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkgICAgICB7Ci0JCQlpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotCQkJaW50IGJpdGVuZCA9IDA7Ci0JCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0JCQlzd2l0Y2ggKCpjKQotCQkJICB7Ci0JCQkgIGNhc2UgJy0nOgotCQkJICAgIGMrKzsKLQkJCSAgICAKLQkJCSAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotCQkJICAgIAotCQkJICAgIGlmICghYml0ZW5kKQotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgCi0JCQkgICAgc3dpdGNoICgqYykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ3InOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgCi0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICAKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2QnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgCi0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICAKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICd4JzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIAotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgCi0JCQkJICBmdW5jIChzdHJlYW0sICIweCUwOHgiLCByZWcpOwotCQkJCSAgCi0JCQkJICAvKiBTb21lIFNXSSBpbnN0cnVjdGlvbnMgaGF2ZSBzcGVjaWFsCi0JCQkJICAgICBtZWFuaW5ncy4gICovCi0JCQkJICBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQiIpOwotCQkJCSAgZWxzZSBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMSkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQlJhbmdlIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnWCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICAKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIAotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJTAxeCIsIHJlZyAmIDB4Zik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZic6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICAKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIAotCQkJCSAgaWYgKHJlZyA+IDcpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlcyIsCi0JCQkJCSAgYXJtX2ZwX2NvbnN0W3JlZyAmIDddKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiZiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBkZWZhdWx0OgotCQkJCWFib3J0ICgpOwotCQkJICAgICAgfQotCQkJICAgIGJyZWFrOwotCQkJICAgIAotCQkJICBjYXNlICdgJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgPT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdcJyc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnPyc6Ci0JCQkgICAgKytjOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYWJvcnQgKCk7Ci0JCQkgIH0KLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlhYm9ydCAoKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkgICAgfQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IHRodW1iX29wY29kZSAqIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgICBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IHRodW1iX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKiBjID0gaW5zbi0+YXNzZW1ibGVyOwotCi0gICAgICAgICAgLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBUaHVtYiAyIGluc3RydWN0aW9uIEJMIHNlcXVlbmNlOiAgKi8KLSAgICAgICAgICBpZiAoISpjKSAvKiBDaGVjayBmb3IgZW1wdHkgKG5vdCBOVUxMKSBhc3NlbWJsZXIgc3RyaW5nLiAgKi8KLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAgICAgCi0gICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiYmxcdCIpOwotCQkKLSAgICAgICAgICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChCRElTUDIzIChnaXZlbikgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKLQkgIAkgICAgICAKLSAgICAgICAgICAgICAgZ2l2ZW4gJj0gMHhmZmZmOwotCSAgICAgIAotICAgICAgICAgICAgICBmb3IgKDsgKmM7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJyUnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW50IGRvbWFza3BjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrbHIgPSAwOwotCQkgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCorK2MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKGdpdmVuID4+IDMpICYgMHg3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZ2l2ZW4gJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiA4KSAmIDB4Zl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza2xyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChnaXZlbiAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2twYyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnOwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNwb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVnID0gMDsgKHJlZyA8IDgpOyByZWcrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrbHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sIGFybV9yZWduYW1lc1sxNF0gLyogImxyIiAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrcGMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgYXJtX3JlZ25hbWVzWzE1XSAvKiAicGMiICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ZW5kID0gMDsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotCQkJCSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0JCQkJICAgICAgLyogUEMtcmVsYXRpdmUgYWRkcmVzcyAtLSB0aGUgYm90dG9tIHR3bwotCQkJCQkgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZAotCQkJCQkgYmVmb3JlIHRoZSBjYWxjdWxhdGlvbi4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYwotCQkJCQkoKChwYyArIDQpICYgfjMpICsgKHJlZyA8PCAyKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMDR4IiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWcgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgfQotICAgIH0KLQotICAvKiBObyBtYXRjaC4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBQYXJzZSBhbiBpbmRpdmlkdWFsIGRpc2Fzc2VtYmxlciBvcHRpb24uICAqLwotdm9pZAotcGFyc2VfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb24gKG9wdGlvbikKLSAgICAgY2hhciAqIG9wdGlvbjsKLXsKLSAgaWYgKG9wdGlvbiA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBpZiAoc3RybmVxIChvcHRpb24sICJyZWctbmFtZXMtIiwgMTApKQotICAgIHsKLSAgICAgIGludCBpOwotCQotICAgICAgb3B0aW9uICs9IDEwOwotCi0gICAgICBmb3IgKGkgPSBOVU1fQVJNX1JFR05BTUVTOyBpLS07KQotCWlmIChzdHJlcSAob3B0aW9uLCByZWduYW1lc1tpXS5uYW1lKSkKLQkgIHsKLQkgICAgcmVnbmFtZV9zZWxlY3RlZCA9IGk7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgCi0gICAgICBpZiAoaSA8IDApCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbmlzZWQgcmVnaXN0ZXIgbmFtZSBzZXQ6ICVzXG4iKSwgb3B0aW9uKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmVxIChvcHRpb24sICJmb3JjZS10aHVtYiIpKQotICAgIGZvcmNlX3RodW1iID0gMTsKLSAgZWxzZSBpZiAoc3RyZXEgKG9wdGlvbiwgIm5vLWZvcmNlLXRodW1iIikpCi0gICAgZm9yY2VfdGh1bWIgPSAwOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbmlzZWQgZGlzYXNzZW1ibGVyIG9wdGlvbjogJXNcbiIpLCBvcHRpb24pOwotICAKLSAgcmV0dXJuOwotfQotCi0vKiBQYXJzZSB0aGUgc3RyaW5nIG9mIGRpc2Fzc2VtYmxlciBvcHRpb25zLCBzcGxpdGluZyBpdCBhdCB3aGl0ZXNwYWNlcy4gICovCi1zdGF0aWMgdm9pZAotcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKG9wdGlvbnMpCi0gICAgIGNoYXIgKiBvcHRpb25zOwotewotICBjaGFyICogc3BhY2U7Ci0gIAotICBpZiAob3B0aW9ucyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBkbwotICAgIHsKLSAgICAgIHNwYWNlID0gc3RyY2hyIChvcHRpb25zLCAnICcpOwotCi0gICAgICBpZiAoc3BhY2UpCi0JewotCSAgKiBzcGFjZSA9ICdcMCc7Ci0JICBwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbiAob3B0aW9ucyk7Ci0JICAqIHNwYWNlID0gJyAnOwotCSAgb3B0aW9ucyA9IHNwYWNlICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JcGFyc2VfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb24gKG9wdGlvbnMpOwotICAgIH0KLSAgd2hpbGUgKHNwYWNlKTsKLX0KLQotLyogTk9URTogVGhlcmUgYXJlIG5vIGNoZWNrcyBpbiB0aGVzZSByb3V0aW5lcyB0aGF0Ci0gICB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgZXhpc3QuICAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbiAocGMsIGluZm8sIGxpdHRsZSkKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotICAgICBib29sZWFuIGxpdHRsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07Ci0gIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKLSAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOwotCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoZXNlIG9wdGlvbnMsIHdlIHJlbW92ZSB0aGVtIGhlcmUuICAqLwotICAgICAgaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBOVUxMOwotICAgIH0KLSAgCi0gIGlzX3RodW1iID0gZm9yY2VfdGh1bWI7Ci0gIAotICBpZiAoIWlzX3RodW1iICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKiBjczsKLQkgIAotCSAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9ICggICBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGVsZl9zeW1ib2xfdHlwZSAqICBlczsKLQkgIHVuc2lnbmVkIGludCAgICAgICB0eXBlOwotCSAgCi0JICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLQkgIHR5cGUgPSBFTEZfU1RfVFlQRSAoZXMtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbyk7Ci0JICAKLQkgIGlzX3RodW1iID0gKHR5cGUgPT0gU1RUX0FSTV9URlVOQykgfHwgKHR5cGUgPT0gU1RUX0FSTV8xNkJJVCk7Ci0JfQotICAgIH0KLSAgCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuICA9IGxpdHRsZSA/IEJGRF9FTkRJQU5fTElUVExFIDogQkZEX0VORElBTl9CSUc7Ci0KLSAgaWYgKGxpdHRsZSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCAmJiBpc190aHVtYikKLQl7Ci0JICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCSAgCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYywgKGJmZF9ieXRlICopIGIsIDIsIGluZm8pOwotCSAgYlszXSA9IGJbMl0gPSAwOwotCX0KLSAgICAgIAotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAKLSAgICAgIGdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoYlsyXSA8PCAxNikgfCAoYlszXSA8PCAyNCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYwotCShwYyAmIH4gMHgzLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChpc190aHVtYikKLQl7Ci0JICBpZiAocGMgJiAweDIpCi0JICAgIHsKLQkgICAgICBnaXZlbiA9IChiWzJdIDw8IDgpIHwgYlszXTsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jCi0JCSgocGMgKyA0KSAmIH4gMHgzLCAoYmZkX2J5dGUgKikgYiwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgcGMgKyA0LCBpbmZvKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICAKLQkgICAgICBnaXZlbiB8PSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2l2ZW4gPSAoYlswXSA8PCA4KSB8IGJbMV0gfCAoYlsyXSA8PCAyNCkgfCAoYlszXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZQotCWdpdmVuID0gKGJbMF0gPDwgMjQpIHwgKGJbMV0gPDwgMTYpIHwgKGJbMl0gPDwgOCkgfCAoYlszXSk7Ci0gICAgfQotICAKLSAgaWYgKGlzX3RodW1iKQotICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1pbnQKLXByaW50X2luc25fYmlnX2FybSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBmYWxzZSk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIHRydWUpOwotfQotCi12b2lkCi1wcmludF9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbnMgKEZJTEUgKiBzdHJlYW0pCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCi1UaGUgZm9sbG93aW5nIEFSTSBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGZvciB1c2Ugd2l0aFxuXAotdGhlIC1NIHN3aXRjaDpcbiIpKTsKLSAgCi0gIGZvciAoaSA9IE5VTV9BUk1fUkVHTkFNRVM7IGktLTspCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiICByZWctbmFtZXMtJXMgJSpjJXNcbiIsCi0JICAgICByZWduYW1lc1tpXS5uYW1lLAotCSAgICAgMTQgLSBzdHJsZW4gKHJlZ25hbWVzW2ldLm5hbWUpLCAnICcsCi0JICAgICByZWduYW1lc1tpXS5kZXNjcmlwdGlvbik7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAiICBmb3JjZS10aHVtYiAgICAgICAgICAgICAgQXNzdW1lIGFsbCBpbnNucyBhcmUgVGh1bWIgaW5zbnNcbiIpOwotICBmcHJpbnRmIChzdHJlYW0sICIgIG5vLWZvcmNlLXRodW1iICAgICAgICAgICBFeGFtaW5lIHByZWNlZWRpbmcgbGFiZWwgdG8gZGV0ZXJtaW5lIGFuIGluc24ncyB0eXBlXG5cbiIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tb3BjLmggYi9vcGNvZGVzL2FybS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjZGU0Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUk0uCi0KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXN0cnVjdCBhcm1fb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqIGFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5YCQlwcmludCB0aGUgYml0ZmllbGQgYXMgMSBoZXggZGlnaXQgd2l0aG91dCBsZWFkaW5nICIweCIKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCi0JCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAldAkJCXByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCi0gICAlaCAgICAgICAgICAgICAgICAgICBwcmludCAnaCcgaWZmIGJpdCA1IHNldCwgZWxzZSBwcmludCAnYicKLSAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQotICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gICAlQwkJCXByaW50IHRoZSBQU1Igc3ViIHR5cGUuCi0gICAlRgkJCXByaW50IHRoZSBDT1VOVCBmaWVsZCBvZiBhIExGTS9TRk0gaW5zdHJ1Y3Rpb24uCi1UaHVtYiBzcGVjaWZpYyBmb3JtYXQgb3B0aW9uczoKLSAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQotICAgJVMgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMy4uNSBhcyBoaWdoIG51bWJlciBpZiBiaXQgNiBzZXQpCi0gICAlPGJpdGZpZWxkPkkgICAgICAgICBwcmludCBiaXRmaWVsZCBhcyBhIHNpZ25lZCBkZWNpbWFsCi0gICAJCQkJKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQotICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzawotICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKLSAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCi0gICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKLSAgICU8Yml0ZmllbGQ+QiAgICAgICAgIHByaW50IFRodW1iIGJyYW5jaCBkZXN0aW5hdGlvbiAoc2lnbmVkIGRpc3BsYWNlbWVudCkKLSAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgZGVjaW1hbAotICAgJTxiaXRmaWVsZD5IICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogMikgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAotKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoaXMgdGFibGUgLSBpdCBtdXN0IGJlIHNlYXJjaGVkIGZyb20KLSAgIHRoZSB0b3AgdG8gb2J0YWluIGEgY29ycmVjdCBtYXRjaC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcm1fb3Bjb2RlIGFybV9vcGNvZGVzW10gPQotewotICAgIC8qIEFSTSBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHhlMWEwMDAwMCwgMHhmZmZmZmZmZiwgIm5vcFx0XHRcdChtb3YgcjAscjApIn0sCi0gICAgezB4MDEyRkZGMTAsIDB4MGZmZmZmZjAsICJieCVjXHQlMC0zciJ9LAotICAgIHsweDAwMDAwMDkwLCAweDBmZTAwMGYwLCAibXVsJWMlMjAnc1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwMjAwMDkwLCAweDBmZTAwMGYwLCAibWxhJWMlMjAnc1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAotICAgIHsweDAxMDAwMDkwLCAweDBmYjAwZmYwLCAic3dwJWMlMjInYlx0JTEyLTE1ciwgJTAtM3IsIFslMTYtMTlyXSJ9LAotICAgIHsweDAwODAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bXVsbCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMGEwMDA5MCwgMHgwZmEwMDBmMCwgIiUyMj9zdW1sYWwlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDAwMDAwOTAsIDB4MGUxMDAwOTAsICJzdHIlYyU2J3MlaFx0JTEyLTE1ciwgJXMifSwKLSAgICB7MHgwMDEwMDA5MCwgMHgwZTEwMDA5MCwgImxkciVjJTYncyVoXHQlMTItMTVyLCAlcyJ9LAotICAgIHsweDAwMDAwMDAwLCAweDBkZTAwMDAwLCAiYW5kJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDIwMDAwMCwgMHgwZGUwMDAwMCwgImVvciVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA0MDAwMDAsIDB4MGRlMDAwMDAsICJzdWIlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwNjAwMDAwLCAweDBkZTAwMDAwLCAicnNiJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDgwMDAwMCwgMHgwZGUwMDAwMCwgImFkZCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBhMDAwMDAsIDB4MGRlMDAwMDAsICJhZGMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwYzAwMDAwLCAweDBkZTAwMDAwLCAic2JjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGUwMDAwMCwgMHgwZGUwMDAwMCwgInJzYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDEyMGYwMDAsIDB4MGRiMGYwMDAsICJtc3IlY1x0JTIyP1NDUFNSJUMsICVvIn0sCi0gICAgezB4MDEwZjAwMDAsIDB4MGZiZjBmZmYsICJtcnMlY1x0JTEyLTE1ciwgJTIyP1NDUFNSIn0sCi0gICAgezB4MDEwMDAwMDAsIDB4MGRlMDAwMDAsICJ0c3QlYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxMjAwMDAwLCAweDBkZTAwMDAwLCAidGVxJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTQwMDAwMCwgMHgwZGUwMDAwMCwgImNtcCVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE2MDAwMDAsIDB4MGRlMDAwMDAsICJjbW4lYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxODAwMDAwLCAweDBkZTAwMDAwLCAib3JyJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMWEwMDAwMCwgMHgwZGUwMDAwMCwgIm1vdiVjJTIwJ3NcdCUxMi0xNXIsICVvIn0sCi0gICAgezB4MDFjMDAwMDAsIDB4MGRlMDAwMDAsICJiaWMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxZTAwMDAwLCAweDBkZTAwMDAwLCAibXZuJWMlMjAnc1x0JTEyLTE1ciwgJW8ifSwKLSAgICB7MHgwNDAwMDAwMCwgMHgwZTEwMDAwMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNjAwMDAwMCwgMHgwZTEwMGZmMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNDAwMDAwMCwgMHgwYzEwMDAxMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNjAwMDAxMCwgMHgwZTAwMDAxMCwgInVuZGVmaW5lZCJ9LAotICAgIHsweDA0MTAwMDAwLCAweDBjMTAwMDAwLCAibGRyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA4MDAwMDAwLCAweDBlMTAwMDAwLCAic3RtJWMlMjM/aWQlMjQ/YmFcdCUxNi0xOXIlMjEnISwgJW0lMjInXiJ9LAotICAgIHsweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmFcdCUxNi0xOXIlMjEnISwgJW0lMjInXiJ9LAotICAgIHsweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiUyNCdsJWNcdCViIn0sCi0gICAgezB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klY1x0JTAtMjN4In0sCi0KLSAgICAvKiBGbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHgwZTAwMDEwMCwgMHgwZmYwOGYxMCwgImFkZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTEwMDEwMCwgMHgwZmYwOGYxMCwgIm11ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTMwMDEwMCwgMHgwZmYwOGYxMCwgInJzZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTQwMDEwMCwgMHgwZmYwOGYxMCwgImR2ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTYwMDEwMCwgMHgwZmYwOGYxMCwgInBvdyVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTcwMDEwMCwgMHgwZmYwOGYxMCwgInJwdyVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTkwMDEwMCwgMHgwZmYwOGYxMCwgImZtbCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWEwMDEwMCwgMHgwZmYwOGYxMCwgImZkdiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWMwMDEwMCwgMHgwZmYwOGYxMCwgInBvbCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTAwODEwMCwgMHgwZmYwOGYxMCwgIm12ZiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTIwODEwMCwgMHgwZmYwOGYxMCwgImFicyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTMwODEwMCwgMHgwZmYwOGYxMCwgInJuZCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTUwODEwMCwgMHgwZmYwOGYxMCwgImxvZyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTYwODEwMCwgMHgwZmYwOGYxMCwgImxnbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTgwODEwMCwgMHgwZmYwOGYxMCwgInNpbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTkwODEwMCwgMHgwZmYwOGYxMCwgImNvcyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwODEwMCwgMHgwZmYwOGYxMCwgImFzbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWMwODEwMCwgMHgwZmYwOGYxMCwgImFjcyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWUwODEwMCwgMHgwZmYwOGYxMCwgInVyZCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWYwODEwMCwgMHgwZmYwOGYxMCwgIm5ybSVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUlx0JTE2LTE4ZiwgJTEyLTE1ciJ9LAotICAgIHsweDBlMTAwMTEwLCAweDBmZmYwZjk4LCAiZml4JWMlUlx0JTEyLTE1ciwgJTAtMmYifSwKLSAgICB7MHgwZTIwMDExMCwgMHgwZmZmMGZmZiwgIndmcyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlNDAwMTEwLCAweDBmZmYwZmZmLCAid2ZjJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTUwMDExMCwgMHgwZmZmMGZmZiwgInJmYyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwZjExMCwgMHgwZmY4ZmZmMCwgImNuZiVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlZDBmMTEwLCAweDBmZjhmZmYwLCAiY21mZSVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBjMDAwMTAwLCAweDBlMTAwZjAwLCAic3RmJWMlUVx0JTEyLTE0ZiwgJUEifSwKLSAgICB7MHgwYzEwMDEwMCwgMHgwZTEwMGYwMCwgImxkZiVjJVFcdCUxMi0xNGYsICVBIn0sCi0gICAgezB4MGMwMDAyMDAsIDB4MGUxMDBmMDAsICJzZm0lY1x0JTEyLTE0ZiwgJUYsICVBIn0sCi0gICAgezB4MGMxMDAyMDAsIDB4MGUxMDBmMDAsICJsZm0lY1x0JTEyLTE0ZiwgJUYsICVBIn0sCi0KLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIHsweDBlMDAwMDAwLCAweDBmMDAwMDEwLCAiY2RwJWNcdCU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1yYyVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibWNyJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGMwMDAwMDAsIDB4MGUxMDAwMDAsICJzdGMlYyUyMidsXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKLSAgICB7MHgwYzEwMDAwMCwgMHgwZTEwMDAwMCwgImxkYyVjJTIyJ2xcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAotCi0gICAgLyogVGhlIHJlc3QuICAqLwotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCJ9LAotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUCh4KSAoKCgoeCkgJiAweGZmZmZmZikgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkgLyogMjYgYml0ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRodW1iX29wY29kZXNbXSA9Ci17Ci0gIC8qIFRodW1iIGluc3RydWN0aW9ucyAqLwotICB7MHg0NkMwLCAweEZGRkYsICJub3BcdFx0XHQobW92IHI4LHI4KSJ9LCAvKiBmb3JtYXQgNSBpbnN0cnVjdGlvbnMgZG8gbm90IHVwZGF0ZSB0aGUgUFNSICovCi0gIHsweDFDMDAsIDB4RkZDMCwgIm1vdlx0JTAtMnIsICUzLTVyXHRcdChhZGQgJTAtMnIsICUzLTVyLCAjJTYtOGQpIn0sCi0gIC8qIGZvcm1hdCA0ICovCi0gIHsweDQwMDAsIDB4RkZDMCwgImFuZFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwNDAsIDB4RkZDMCwgImVvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwODAsIDB4RkZDMCwgImxzbFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwQzAsIDB4RkZDMCwgImxzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxMDAsIDB4RkZDMCwgImFzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxNDAsIDB4RkZDMCwgImFkY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxODAsIDB4RkZDMCwgInNiY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxQzAsIDB4RkZDMCwgInJvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyMDAsIDB4RkZDMCwgInRzdFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyNDAsIDB4RkZDMCwgIm5lZ1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyODAsIDB4RkZDMCwgImNtcFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyQzAsIDB4RkZDMCwgImNtblx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzMDAsIDB4RkZDMCwgIm9yclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzNDAsIDB4RkZDMCwgIm11bFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzODAsIDB4RkZDMCwgImJpY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzQzAsIDB4RkZDMCwgIm12blx0JTAtMnIsICUzLTVyIn0sCi0gIC8qIGZvcm1hdCAxMyAqLwotICB7MHhCMDAwLCAweEZGODAsICJhZGRcdHNwLCAjJTAtNlcifSwKLSAgezB4QjA4MCwgMHhGRjgwLCAic3ViXHRzcCwgIyUwLTZXIn0sCi0gIC8qIGZvcm1hdCA1ICovCi0gIHsweDQ3MDAsIDB4RkY4MCwgImJ4XHQlUyJ9LAotICB7MHg0NDAwLCAweEZGMDAsICJhZGRcdCVELCAlUyJ9LAotICB7MHg0NTAwLCAweEZGMDAsICJjbXBcdCVELCAlUyJ9LAotICB7MHg0NjAwLCAweEZGMDAsICJtb3ZcdCVELCAlUyJ9LAotICAvKiBmb3JtYXQgMTQgKi8KLSAgezB4QjQwMCwgMHhGRTAwLCAicHVzaFx0JU4ifSwKLSAgezB4QkMwMCwgMHhGRTAwLCAicG9wXHQlTyJ9LAotICAvKiBmb3JtYXQgMiAqLwotICB7MHgxODAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgJTYtOHIifSwKLSAgezB4MUEwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFDMDAsIDB4RkUwMCwgImFkZFx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgezB4MUUwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICMlNi04ZCJ9LAotICAvKiBmb3JtYXQgOCAqLwotICB7MHg1MjAwLCAweEZFMDAsICJzdHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NUEwMCwgMHhGRTAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU2MDAsIDB4RjYwMCwgImxkcnMlMTE/aGJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgNyAqLwotICB7MHg1MDAwLCAweEZBMDAsICJzdHIlMTAnYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU4MDAsIDB4RkEwMCwgImxkciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgLyogZm9ybWF0IDEgKi8KLSAgezB4MDAwMCwgMHhGODAwLCAibHNsXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MDgwMCwgMHhGODAwLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MTAwMCwgMHhGODAwLCAiYXNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgLyogZm9ybWF0IDMgKi8KLSAgezB4MjAwMCwgMHhGODAwLCAibW92XHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgyODAwLCAweEY4MDAsICJjbXBcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDMwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzgwMCwgMHhGODAwLCAic3ViXHQlOC0xMHIsICMlMC03ZCJ9LAotICAvKiBmb3JtYXQgNiAqLwotICB7MHg0ODAwLCAweEY4MDAsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLwotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogZm9ybWF0IDEwICovCi0gIHsweDgwMDAsIDB4RjgwMCwgInN0cmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIHsweDg4MDAsIDB4RjgwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIC8qIGZvcm1hdCAxMSAqLwotICB7MHg5MDAwLCAweEY4MDAsICJzdHJcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCi0gIHsweDk4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgLyogZm9ybWF0IDEyICovCi0gIHsweEEwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwlMC03YSkifSwKLSAgezB4QTgwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKLSAgLyogZm9ybWF0IDE1ICovCi0gIHsweEMwMDAsIDB4RjgwMCwgInN0bWlhXHQlOC0xMHIhLCVNIn0sCi0gIHsweEM4MDAsIDB4RjgwMCwgImxkbWlhXHQlOC0xMHIhLCVNIn0sCi0gIC8qIGZvcm1hdCAxOCAqLwotICB7MHhFMDAwLCAweEY4MDAsICJiXHQlMC0xMEIifSwKLSAgezB4RTgwMCwgMHhGODAwLCAidW5kZWZpbmVkIn0sCi0gIC8qIGZvcm1hdCAxOSAqLwotICB7MHhGMDAwLCAweEY4MDAsICIifSwgLyogc3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGluIGRpc2Fzc2VtYmxlciAqLwotICB7MHhGODAwLCAweEY4MDAsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgLyogZm9ybWF0IDE2ICovCi0gIHsweEQwMDAsIDB4RkYwMCwgImJlcVx0JTAtN0IifSwKLSAgezB4RDEwMCwgMHhGRjAwLCAiYm5lXHQlMC03QiJ9LAotICB7MHhEMjAwLCAweEZGMDAsICJiY3NcdCUwLTdCIn0sCi0gIHsweEQzMDAsIDB4RkYwMCwgImJjY1x0JTAtN0IifSwKLSAgezB4RDQwMCwgMHhGRjAwLCAiYm1pXHQlMC03QiJ9LAotICB7MHhENTAwLCAweEZGMDAsICJicGxcdCUwLTdCIn0sCi0gIHsweEQ2MDAsIDB4RkYwMCwgImJ2c1x0JTAtN0IifSwKLSAgezB4RDcwMCwgMHhGRjAwLCAiYnZjXHQlMC03QiJ9LAotICB7MHhEODAwLCAweEZGMDAsICJiaGlcdCUwLTdCIn0sCi0gIHsweEQ5MDAsIDB4RkYwMCwgImJsc1x0JTAtN0IifSwKLSAgezB4REEwMCwgMHhGRjAwLCAiYmdlXHQlMC03QiJ9LAotICB7MHhEQjAwLCAweEZGMDAsICJibHRcdCUwLTdCIn0sCi0gIHsweERDMDAsIDB4RkYwMCwgImJndFx0JTAtN0IifSwKLSAgezB4REQwMCwgMHhGRjAwLCAiYmxlXHQlMC03QiJ9LAotICAvKiBmb3JtYXQgMTcgKi8KLSAgezB4REUwMCwgMHhGRjAwLCAiYmFsXHQlMC03QiJ9LAotICB7MHhERjAwLCAweEZGMDAsICJzd2lcdCUwLTdkIn0sCi0gIC8qIGZvcm1hdCA5ICovCi0gIHsweDYwMDAsIDB4RjgwMCwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NjgwMCwgMHhGODAwLCAibGRyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg3MDAwLCAweEY4MDAsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICB7MHg3ODAwLCAweEY4MDAsICJsZHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAvKiB0aGUgcmVzdCAqLwotICB7MHgwMDAwLCAweDAwMDAsICJ1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gJTAtMTV4In0sCi0gIHsweDAwMDAsIDB4MDAwMCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AyMyh4KSAoKCgoKCh4KSAmIDB4MDdmZikgPDwgMTEpIHwgKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiAxNikpIFwKLSAgICAgICAgICAgICAgICAgICAgIF4gMHgyMDAwMDApIC0gMHgyMDAwMDApIC8qIDIzYml0ICovCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXZyLWRpcy5jIGIvb3Bjb2Rlcy9hdnItZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2Q1OGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hdnItZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgQVZSIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgRGVuaXMgQ2hlcnR5a292IDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHUzMjsKLQotI2RlZmluZSBJRk1BU0soYSxiKSAgICAgKChvcGNvZGUgJiAoYSkpID09IChiKSkKLQotc3RhdGljIGNoYXIqIFNSRUdfZmxhZ3MgPSAiQ1pOVlNIVEkiOwotc3RhdGljIGNoYXIqIHNlY3Q5NFtdID0geyJDT00iLCJORUciLCJTV0FQIiwiSU5DIiwwLCJBU1IiLCJMU1IiLCJST1IiLAotCQkJIDAsMCwiREVDIiwwLDAsMCwwLDB9Owotc3RhdGljIGNoYXIqIHNlY3Q5OFtdID0geyJDQkkiLCJTQklDIiwiU0JJIiwiU0JJUyJ9Owotc3RhdGljIGNoYXIqIGJyYW5jaHNbXSA9IHsKLSAgIkJSQ1MiLCJCUkVRIiwiQlJNSSIsIkJSVlMiLAotICAiQlJMVCIsIkJSSFMiLCJCUlRTIiwiQlJJRSIsCi0gICJCUkNDIiwiQlJORSIsIkJSUEwiLCJCUlZDIiwKLSAgIkJSR0UiLCJCUkhDIiwiQlJUQyIsIkJSSUQiCi19OwotCi1zdGF0aWMgY2hhciogbGFzdDRbXSA9IHsiQkxEIiwiQlNUIiwiU0JSQyIsIlNCUlMifTsKLQotCi1zdGF0aWMgdm9pZCBkaXNwTEREIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwTEREIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgoKG9wY29kZSAmIDB4MjAwMCkgPj4gOCkgfCAoKG9wY29kZSAmIDB4MGMwMCkgPj4gNykKLQkgICAgfCAob3Bjb2RlICYgNykpOwotICBzcHJpbnRmKGRlc3QsICIlZCIsIG9wY29kZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcmVnUFAgUEFSQU1TICgodTE2LCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlZ1BQIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgob3Bjb2RlICYgMHgwNjAwKSA+PiA1KSB8IChvcGNvZGUgJiAweGYpOwotICBzcHJpbnRmKGRlc3QsICIweCUwMlgiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzUwIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWc1MCAob3Bjb2RlLCBkZXN0KQotICAgICB1MTYgb3Bjb2RlOwotICAgICBjaGFyICpkZXN0OwotewotICBvcGNvZGUgPSAob3Bjb2RlICYgMHgwMWYwKSA+PiA0OwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzEwNCBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVnMTA0IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9IChvcGNvZGUgJiAweGYpIHwgKChvcGNvZGUgJiAweDAyMDApID4+IDUpOwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzQwIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWc0MCAob3Bjb2RlLCBkZXN0KQotICAgICB1MTYgb3Bjb2RlOwotICAgICBjaGFyICpkZXN0OwotewotICBvcGNvZGUgPSAob3Bjb2RlICYgMHhmMCkgPj4gNDsKLSAgc3ByaW50ZihkZXN0LCAiUiVkIiwgb3Bjb2RlICsgMTYpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzIwdyBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVnMjB3IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9IChvcGNvZGUgJiAweDMwKSA+PiA0OwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCAyNCArIG9wY29kZSAqIDIpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZ19mbXVsX2QgUEFSQU1TICgodTE2LCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlZ19mbXVsX2QgKG9wY29kZSwgZGVzdCkKLSAgICAgdTE2IG9wY29kZTsKLSAgICAgY2hhciAqZGVzdDsKLXsKLSAgc3ByaW50ZihkZXN0LCAiUiVkIiwgMTYgKyAoKG9wY29kZSA+PiA0KSAmIDcpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCByZWdfZm11bF9yIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWdfZm11bF9yIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIHNwcmludGYoZGVzdCwgIlIlZCIsIDE2ICsgKG9wY29kZSAmIDcpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCByZWdfbXVsc19kIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWdfbXVsc19kIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIHNwcmludGYoZGVzdCwgIlIlZCIsIDE2ICsgKChvcGNvZGUgPj4gNCkgJiAweGYpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCByZWdfbXVsc19yIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWdfbXVsc19yIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIHNwcmludGYoZGVzdCwgIlIlZCIsIDE2ICsgKG9wY29kZSAmIDB4ZikpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZ19tb3Z3X2QgUEFSQU1TICgodTE2LCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlZ19tb3Z3X2QgKG9wY29kZSwgZGVzdCkKLSAgICAgdTE2IG9wY29kZTsKLSAgICAgY2hhciAqZGVzdDsKLXsKLSAgc3ByaW50ZihkZXN0LCAiUiVkIiwgMiAqICgob3Bjb2RlID4+IDQpICYgMHhmKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcmVnX21vdndfciBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVnX21vdndfciAob3Bjb2RlLCBkZXN0KQotICAgICB1MTYgb3Bjb2RlOwotICAgICBjaGFyICpkZXN0OwotewotICBzcHJpbnRmKGRlc3QsICJSJWQiLCAyICogKG9wY29kZSAmIDB4ZikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGxpdDQwNCBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotbGl0NDA0IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgob3Bjb2RlICYgMHhmMDApID4+IDQpIHwgKG9wY29kZSAmIDB4Zik7Ci0gIHNwcmludGYoZGVzdCwgIjB4JTAyWCIsIG9wY29kZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgbGl0MjA0IFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1saXQyMDQgKG9wY29kZSwgZGVzdCkKLSAgICAgdTE2IG9wY29kZTsKLSAgICAgY2hhciAqZGVzdDsKLXsKLSAgb3Bjb2RlID0gKChvcGNvZGUgJiAweGMwKSA+PiAyKSB8IChvcGNvZGUgJiAweGYpOwotICBzcHJpbnRmKGRlc3QsICIweCUwMlgiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkZDBmZmYgUEFSQU1TICgodTE2LCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotYWRkMGZmZiAob3AsIGRlc3QsIHBjKQotICAgICB1MTYgb3A7Ci0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGludCBwYzsKLXsKLSAgaW50IHJlbF9hZGRyID0gKCgob3AgJiAweGZmZikgXiAweDgwMCkgLSAweDgwMCkgKiAyOwotICBzcHJpbnRmKGRlc3QsICIuJSstOGQgOyAweCUwNlgiLCByZWxfYWRkciwgcGMgKyAyICsgcmVsX2FkZHIpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkZDAzZjggUEFSQU1TICgodTE2LCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotYWRkMDNmOCAob3AsIGRlc3QsIHBjKQotICAgICB1MTYgb3A7Ci0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGludCBwYzsKLXsKLSAgaW50IHJlbF9hZGRyID0gKCgoKG9wID4+IDMpICYgMHg3ZikgXiAweDQwKSAtIDB4NDApICogMjsKLSAgc3ByaW50ZihkZXN0LCAiLiUrLThkIDsgMHglMDZYIiwgcmVsX2FkZHIsIHBjICsgMiArIHJlbF9hZGRyKTsKLX0KLQotCi1zdGF0aWMgdTE2IGF2cmRpc19vcGNvZGUgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB1MTYKLWF2cmRpc19vcGNvZGUgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotICBpbnQgc3RhdHVzOwotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyhzdGF0dXMsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci19Ci0KLQotaW50Ci1wcmludF9pbnNuX2F2cihhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgcnJbMjAwXTsKLSAgY2hhciByZFsyMDBdOwotICB1MTYgb3Bjb2RlOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgcHJpbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgaW50IGNtZF9sZW4gPSAyOwotCi0gIG9wY29kZSA9IGF2cmRpc19vcGNvZGUgKGFkZHIsIGluZm8pOwotCi0gIGlmIChJRk1BU0soMHhkMDAwLCAweDgwMDApKQotICAgIHsKLSAgICAgIGNoYXIgbGV0dGVyOwotICAgICAgcmVnNTAob3Bjb2RlLCByZCk7Ci0gICAgICBkaXNwTEREKG9wY29kZSwgcnIpOwotICAgICAgaWYgKG9wY29kZSAmIDgpCi0JbGV0dGVyID0gJ1knOwotICAgICAgZWxzZQotCWxldHRlciA9ICdaJzsKLSAgICAgIGlmIChvcGNvZGUgJiAweDAyMDApCi0JKCpwcmluKSAoc3RyZWFtLCAiICAgIFNURCAgICAgJWMrJXMsJXMiLCBsZXR0ZXIsIHJyLCByZCk7Ci0gICAgICBlbHNlCi0JKCpwcmluKSAoc3RyZWFtLCAiICAgIExERCAgICAgJXMsJWMrJXMiLCByZCwgbGV0dGVyLCBycik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGNvZGUgJiAweGYwMDApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDAwMDA6Ci0JICB7Ci0JICAgIHJlZzUwKG9wY29kZSwgcmQpOwotCSAgICByZWcxMDQob3Bjb2RlLCBycik7Ci0JICAgIHN3aXRjaCAob3Bjb2RlICYgMHgwYzAwKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDB4MDAwMDoKLQkJc3dpdGNoIChvcGNvZGUgJiAweDAzMDApCi0JCSAgewotCQkgIGNhc2UgMHgwMDAwOgotCQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIE5PUCIpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAweDAxMDA6Ci0JCSAgICByZWdfbW92d19kKG9wY29kZSwgcmQpOwotCQkgICAgcmVnX21vdndfcihvcGNvZGUsIHJyKTsKLQkJICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBNT1ZXICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgMHgwMjAwOgotCQkgICAgcmVnX211bHNfZChvcGNvZGUsIHJkKTsKLQkJICAgIHJlZ19tdWxzX3Iob3Bjb2RlLCBycik7Ci0JCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgTVVMUyAgICAlcywlcyIsIHJkLCBycik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDB4MDMwMDoKLQkJICAgIHJlZ19mbXVsX2Qob3Bjb2RlLCByZCk7Ci0JCSAgICByZWdfZm11bF9yKG9wY29kZSwgcnIpOwotCQkgICAgaWYgKElGTUFTSygweDg4LCAwKSkKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIE1VTFNVICAgJXMsJXMiLCByZCwgcnIpOwotCQkgICAgZWxzZSBpZiAoSUZNQVNLKDB4ODgsIDgpKQotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgRk1VTCAgICAlcywlcyIsIHJkLCBycik7Ci0JCSAgICBlbHNlIGlmIChJRk1BU0soMHg4OCwgMHg4MCkpCi0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBGTVVMUyAgICVzLCVzIiwgcmQsIHJyKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIEZNVUxTVSAgJXMsJXMiLCByZCwgcnIpOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA0MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBDUEMgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA4MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBTQkMgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDBjMDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBBREQgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgxMDAwOgotCSAgewotCSAgICByZWc1MChvcGNvZGUsIHJkKTsKLQkgICAgcmVnMTA0KG9wY29kZSwgcnIpOwotCSAgICBzd2l0Y2ggKG9wY29kZSAmIDB4MGMwMCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAweDAwMDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBDUFNFICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA0MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBDUCAgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA4MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBTVUIgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDBjMDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBBREMgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgyMDAwOgotCSAgewotCSAgICByZWc1MChvcGNvZGUsIHJkKTsKLQkgICAgcmVnMTA0KG9wY29kZSwgcnIpOwotCSAgICBzd2l0Y2ggKG9wY29kZSAmIDB4MGMwMCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAweDAwMDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBBTkQgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA0MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBFT1IgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA4MDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBPUiAgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDBjMDA6Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICBNT1YgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgzMDAwOgotCSAgewotCSAgICByZWc0MChvcGNvZGUsIHJkKTsKLQkgICAgbGl0NDA0KG9wY29kZSwgcnIpOwotCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgQ1BJICAgICAlcywlcyIsIHJkLCBycik7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDQwMDA6Ci0JICB7Ci0JICAgIHJlZzQwKG9wY29kZSwgcmQpOwotCSAgICBsaXQ0MDQob3Bjb2RlLCBycik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBTQkNJICAgICVzLCVzIiwgcmQsIHJyKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4NTAwMDoKLQkgIHsKLQkgICAgcmVnNDAob3Bjb2RlLCByZCk7Ci0JICAgIGxpdDQwNChvcGNvZGUsIHJyKTsKLQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFNVQkkgICAgJXMsJXMiLCByZCwgcnIpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHg2MDAwOgotCSAgewotCSAgICByZWc0MChvcGNvZGUsIHJkKTsKLQkgICAgbGl0NDA0KG9wY29kZSwgcnIpOwotCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgT1JJICAgICAlcywlcyIsIHJkLCBycik7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDcwMDA6Ci0JICB7Ci0JICAgIHJlZzQwKG9wY29kZSwgcmQpOwotCSAgICBsaXQ0MDQob3Bjb2RlLCBycik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBBTkRJICAgICVzLCVzIiwgcmQsIHJyKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4OTAwMDoKLQkgIHsKLQkgICAgc3dpdGNoIChvcGNvZGUgJiAweDBlMDApCi0JICAgICAgewotCSAgICAgIGNhc2UgMHgwMDAwOgotCQl7Ci0JCSAgcmVnNTAob3Bjb2RlLCByZCk7Ci0JCSAgc3dpdGNoIChvcGNvZGUgJiAweGYpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDB4MDoKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEUyAgICAgJXMsMHglMDRYIiwgcmQsCi0JCQkJIGF2cmRpc19vcGNvZGUoYWRkciArIDIsIGluZm8pKTsKLQkJCWNtZF9sZW4gPSA0OwotCQkgICAgICB9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweDE6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBMRCAgICAgICVzLForIiwgcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHgyOgotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgTEQgICAgICAlcywtWiIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4NDoKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIExQTSAgICAgJXMsWiIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4NToKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIExQTSAgICAgJXMsWisiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweDY6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBFTFBNICAgICVzLFoiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweDc6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBFTFBNICAgICVzLForIiwgcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHg5OgotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgTEQgICAgICAlcyxZKyIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YToKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsLVkiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweGM6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBMRCAgICAgICVzLFgiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweGQ6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBMRCAgICAgICVzLFgrIiwgcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhlOgotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgTEQgICAgICAlcywtWCIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4ZjoKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFBPUCAgICAgJXMiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgID8/Pz8iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDAyMDA6Ci0JCXsKLQkJICByZWc1MChvcGNvZGUsIHJkKTsKLQkJICBzd2l0Y2ggKG9wY29kZSAmIDB4ZikKLQkJICAgIHsKLQkJICAgIGNhc2UgMHgwOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU1RTICAgICAweCUwNFgsJXMiLAotCQkJCSBhdnJkaXNfb3Bjb2RlKGFkZHIgKyAyLCBpbmZvKSwgcmQpOwotCQkJY21kX2xlbiA9IDQ7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MToKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgWissJXMiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweDI6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBTVCAgICAgIC1aLCVzIiwgcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHg5OgotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgU1QgICAgICBZKywlcyIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YToKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgLVksJXMiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweGM6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBTVCAgICAgIFgsJXMiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAweGQ6Ci0JCSAgICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBTVCAgICAgIFgrLCVzIiwgcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhlOgotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgU1QgICAgICAtWCwlcyIsIHJkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4ZjoKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFBVU0ggICAgJXMiLCByZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgID8/Pz8iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA0MDA6Ci0JCXsKLQkJICBpZiAoSUZNQVNLKDB4MDIwYywgMHgwMDBjKSkKLQkJICAgIHsKLQkJICAgICAgdTMyIGsgPSAoKG9wY29kZSAmIDB4MDFmMCkgPj4gMykgfCAob3Bjb2RlICYgMSk7Ci0JCSAgICAgIGsgPSAoayA8PCAxNikgfCBhdnJkaXNfb3Bjb2RlKGFkZHIgKyAyLCBpbmZvKTsKLQkJICAgICAgaWYgKG9wY29kZSAmIDB4MDAwMikKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBDQUxMICAgIDB4JTA2WCIsIGsqMik7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBKTVAgICAgIDB4JTA2WCIsIGsqMik7Ci0JCSAgICAgIGNtZF9sZW4gPSA0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKElGTUFTSygweDAxMGYsIDB4MDAwOCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCBzZiA9IChvcGNvZGUgJiAweDcwKSA+PiA0OwotCQkgICAgICBpZiAob3Bjb2RlICYgMHgwMDgwKQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIENMJWMiLCBTUkVHX2ZsYWdzW3NmXSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBTRSVjIiwgU1JFR19mbGFnc1tzZl0pOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKElGTUFTSygweDAwMWYsIDB4MDAwOSkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcGNvZGUgJiAweDAxMDApCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgSUNBTEwiKTsKLQkJICAgICAgZWxzZQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIElKTVAiKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChJRk1BU0soMHgwMDFmLCAweDAwMTkpKQotCQkgICAgewotCQkgICAgICBpZiAob3Bjb2RlICYgMHgwMTAwKQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIEVJQ0FMTCIpOwotCQkgICAgICBlbHNlCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgRUlKTVAiKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChJRk1BU0soMHgwMTBmLCAweDAxMDgpKQotCQkgICAgewotCQkgICAgICBpZiAoSUZNQVNLKDB4MDA5MCwgMHgwMDAwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBSRVQiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDA5MCwgMHgwMDEwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBSRVRJIik7Ci0JCSAgICAgIGVsc2UgaWYgKElGTUFTSygweDAwZTAsIDB4MDA4MCkpCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU0xFRVAiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBlMCwgMHgwMGEwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBXRFIiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBmMCwgMHgwMGMwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBMUE0iKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBmMCwgMHgwMGQwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBFTFBNIik7Ci0JCSAgICAgIGVsc2UgaWYgKElGTUFTSygweDAwZjAsIDB4MDBlMCkpCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU1BNIik7Ci0JCSAgICAgIGVsc2UgaWYgKElGTUFTSygweDAwZjAsIDB4MDBmMCkpCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgRVNQTSIpOwotCQkgICAgICBlbHNlCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgPz8/PyIpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciogcDsKLQkJICAgICAgcmVnNTAob3Bjb2RlLCByZCk7Ci0JCSAgICAgIHAgPSBzZWN0OTRbb3Bjb2RlICYgMHhmXTsKLQkJICAgICAgaWYgKCFwKQotCQkJcCA9ICI/Pz8/IjsKLQkJICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgICUtOHMlcyIsIHAsIHJkKTsKLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDYwMDoKLQkJewotCQkgIGlmIChvcGNvZGUgJiAweDAyMDApCi0JCSAgICB7Ci0JCSAgICAgIGxpdDIwNChvcGNvZGUsIHJkKTsKLQkJICAgICAgcmVnMjB3KG9wY29kZSwgcnIpOwotCQkgICAgICBpZiAob3Bjb2RlICYgMHgwMTAwKQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNCSVcgICAgJXMsJXMiLCByciwgcmQpOwotCQkgICAgICBlbHNlCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgQURJVyAgICAlcywlcyIsIHJyLCByZCk7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA4MDA6Ci0JICAgICAgY2FzZSAweDBhMDA6Ci0JCXsKLQkJICAoKnByaW4pIChzdHJlYW0sICIgICAgJS04czB4JTAyWCwlZCIsCi0JCQkgICBzZWN0OThbKG9wY29kZSAmIDB4MDMwMCkgPj4gOF0sCi0JCQkgICAob3Bjb2RlICYgMHhmOCkgPj4gMywKLQkJCSAgIG9wY29kZSAmIDcpOwotCQl9Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXsKLQkJICByZWc1MChvcGNvZGUsIHJkKTsKLQkJICByZWcxMDQob3Bjb2RlLCBycik7Ci0JCSAgKCpwcmluKSAoc3RyZWFtLCAiICAgIE1VTCAgICAgJXMsJXMiLCByZCwgcnIpOwotCQl9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHhiMDAwOgotCSAgewotCSAgICByZWc1MChvcGNvZGUsIHJkKTsKLQkgICAgcmVnUFAob3Bjb2RlLCBycik7Ci0JICAgIGlmIChvcGNvZGUgJiAweDA4MDApCi0JICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIE9VVCAgICAgJXMsJXMiLCByciwgcmQpOwotCSAgICBlbHNlCi0JICAgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIElOICAgICAgJXMsJXMiLCByZCwgcnIpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHhjMDAwOgotCSAgewotCSAgICBhZGQwZmZmKG9wY29kZSwgcmQsIGFkZHIpOwotCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgUkpNUCAgICAlcyIsIHJkKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4ZDAwMDoKLQkgIHsKLQkgICAgYWRkMGZmZihvcGNvZGUsIHJkLCBhZGRyKTsKLQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFJDQUxMICAgJXMiLCByZCk7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweGUwMDA6Ci0JICB7Ci0JICAgIHJlZzQwKG9wY29kZSwgcmQpOwotCSAgICBsaXQ0MDQob3Bjb2RlLCBycik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBMREkgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4ZjAwMDoKLQkgIHsKLQkgICAgaWYgKG9wY29kZSAmIDB4MDgwMCkKLQkgICAgICB7Ci0JCXJlZzUwKG9wY29kZSwgcmQpOwotCQkoKnByaW4pIChzdHJlYW0sICIgICAgJS04cyVzLCVkIiwKLQkJCSBsYXN0NFsob3Bjb2RlICYgMHgwNjAwKSA+PiA5XSwKLQkJCSByZCwgb3Bjb2RlICYgNyk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyKiBwOwotCQlhZGQwM2Y4KG9wY29kZSwgcmQsIGFkZHIpOwotCQlwID0gYnJhbmNoc1soKG9wY29kZSAmIDB4MDQwMCkgPj4gNykgfCAob3Bjb2RlICYgNyldOwotCQkoKnByaW4pIChzdHJlYW0sICIgICAgJS04cyVzIiwgcCwgcmQpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICByZXR1cm4gY21kX2xlbjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY2dlbi1hc20uYyBiL29wY29kZXMvY2dlbi1hc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNjkzNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NnZW4tYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyogQ0dFTiBnZW5lcmljIGFzc2VtYmxlciBzdXBwb3J0IGNvZGUuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogU2V0IHRoZSBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gY2FsbGJhY2suICAqLwotCi12b2lkCi1jZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuIChjZCwgZm4pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBmbjsKLXsKLSAgY2QtPnBhcnNlX29wZXJhbmRfZm4gPSBmbjsKLX0KLQotLyogQ2FsbGVkIHdoZW5ldmVyIHN0YXJ0aW5nIHRvIHBhcnNlIGFuIGluc24uICAqLwotCi12b2lkCi1jZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIC8qIFRoaXMgdGVsbHMgdGhlIGNhbGxiYWNrIHRvIHJlLWluaXRpYWxpemUuICAqLwotICAodm9pZCkgKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCwgTlVMTCwgMCwgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYXNtX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotCi0gICBDT1VOVCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIElOU05TLgotICAgRU5UU0laRSBpcyBzaXplb2YgKENHRU5fSUJBU0UpIGZvciB0aGUgdGFyZ2V0LgotICAgPz8/IE5vIGxvbmdlciB1c2VkIGJ1dCBsZWF2ZSBpbiBmb3Igbm93LgotICAgSFRBQkxFIHBvaW50cyB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIEhFTlRCVUYgaXMgYSBwb2ludGVyIHRvIHN1ZmZpY2llbnRseSBsYXJnZSBidWZmZXIgb2YgaGFzaCBlbnRyaWVzLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZW50cnkgdG8gdXNlLgotCi0gICBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgYWRkaXRpb25zIGFyZSBtYWRlIHRvIHRoZSBmcm9udCBvZiB0aGUKLSAgIGxpc3QgYW5kIHdlIHdhbnQgZWFybGllciBvbmVzIHRvIGJlIHByZWZlcmVkLiAgKi8KLQotc3RhdGljIENHRU5fSU5TTl9MSVNUICoKLWhhc2hfaW5zbl9hcnJheSAoY2QsIGluc25zLCBjb3VudCwgZW50c2l6ZSwgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc25zOwotICAgICBpbnQgY291bnQ7Ci0gICAgIGludCBlbnRzaXplOwotICAgICBDR0VOX0lOU05fTElTVCAqKmh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKmhlbnRidWY7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWksICsraGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9ICZpbnNuc1tpXTsKLQotICAgICAgaWYgKCEgKCogY2QtPmFzbV9oYXNoX3ApIChpbnNuKSkKLQljb250aW51ZTsKLSAgICAgIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pKTsKLSAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGVbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaW5zbjsKLSAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGhhc2hfaW5zbl9hcnJheSBleGNlcHQgdGhlIGluc25zIGFyZQotICAgaW4gYSBsaXN0LiAgKi8KLQotc3RhdGljIENHRU5fSU5TTl9MSVNUICoKLWhhc2hfaW5zbl9saXN0IChjZCwgaW5zbnMsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25zOwotICAgICBDR0VOX0lOU05fTElTVCAqKmh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKmhlbnRidWY7Ci17Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICBmb3IgKGlsaXN0ID0gaW5zbnM7IGlsaXN0ICE9IE5VTEw7IGlsaXN0ID0gaWxpc3QtPm5leHQsICsrIGhlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgICAgIGlmICghICgqIGNkLT5hc21faGFzaF9wKSAoaWxpc3QtPmluc24pKQotCWNvbnRpbnVlOwotICAgICAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKENHRU5fSU5TTl9NTkVNT05JQyAoaWxpc3QtPmluc24pKTsKLSAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGVbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaWxpc3QtPmluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogQnVpbGQgdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2FzbV9oYXNoX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2dlbl9pbnNuX2NvdW50IChjZCkgKyBjZ2VuX21hY3JvX2luc25fY291bnQgKGNkKTsKLSAgQ0dFTl9JTlNOX1RBQkxFICppbnNuX3RhYmxlID0gJmNkLT5pbnNuX3RhYmxlOwotICBDR0VOX0lOU05fVEFCTEUgKm1hY3JvX2luc25fdGFibGUgPSAmY2QtPm1hY3JvX2luc25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBoYXNoX3NpemUgPSBjZC0+YXNtX2hhc2hfc2l6ZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmhhc2hfZW50cnlfYnVmOwotICBDR0VOX0lOU05fTElTVCAqKmFzbV9oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqYXNtX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGUgc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6Ci0gICAgIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgaGFzaCBsaXN0cy4gICovCi0KLSAgYXNtX2hhc2hfdGFibGUgPSAoQ0dFTl9JTlNOX0xJU1QgKiopCi0gICAgeG1hbGxvYyAoaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIG1lbXNldCAoYXNtX2hhc2hfdGFibGUsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBhc21faGFzaF90YWJsZV9lbnRyaWVzID0gaGFzaF9lbnRyeV9idWYgPSAoQ0dFTl9JTlNOX0xJU1QgKikKLSAgICB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QpKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gaW5zbnMuCi0gICAgIERvbid0IGluY2x1ZGUgdGhlIGZpcnN0IG9uZSBhcyBpdCBpcyBhIHJlc2VydmVkIGVudHJ5LiAgKi8KLSAgLyogPz8/IEl0IHdhcyB0aGUgZW5kIG9mIGFsbCBoYXNoIGNoYWlucywgYW5kIGFsc28gdGhlIHNwZWNpYWwKLSAgICAgImludmFsaWQgaW5zbiIgbWFya2VyLiAgTWF5IGJlIGFibGUgdG8gZG8gaXQgZGlmZmVyZW50bHkgbm93LiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsCi0JCQkJICAgIGluc25fdGFibGUtPmluaXRfZW50cmllcyArIDEsCi0JCQkJICAgIGluc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMgLSAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgaW5zbnMuCi0gICAgIExhdGVyIGFkZGVkIGluc25zIHdpbGwgYmUgcHJlZmVyZWQgb3ZlciBlYXJsaWVyIG9uZXMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJCQkgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2luc25fbGlzdCAoY2QsIG1hY3JvX2luc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgY2QtPmFzbV9oYXNoX3RhYmxlID0gYXNtX2hhc2hfdGFibGU7Ci0gIGNkLT5hc21faGFzaF90YWJsZV9lbnRyaWVzID0gYXNtX2hhc2hfdGFibGVfZW50cmllczsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGFzaCBsaXN0IGZvciBJTlNOLiAgKi8KLQotQ0dFTl9JTlNOX0xJU1QgKgotY2dlbl9hc21fbG9va3VwX2luc24gKGNkLCBpbnNuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICppbnNuOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2QtPmFzbV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfYXNtX2hhc2hfdGFibGUgKGNkKTsKLQotICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoaW5zbik7Ci0gIHJldHVybiBjZC0+YXNtX2hhc2hfdGFibGVbaGFzaF07Ci19Ci0MCi0vKiBLZXl3b3JkIHBhcnNlci4KLSAgIFRoZSByZXN1bHQgaXMgTlVMTCB1cG9uIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgbWVzc2FnZS4KLSAgIElmIHN1Y2Nlc3NmdWwsICpTVFJQIGlzIHVwZGF0ZWQgdG8gcG9pbnQgcGFzc2VkIHRoZSBrZXl3b3JkLgotCi0gICA/Pz8gQXQgcHJlc2VudCB3ZSBoYXZlIGEgc3RhdGljIG5vdGlvbiBvZiBob3cgdG8gcGljayBvdXQgYSBrZXl3b3JkLgotICAgTGF0ZXIgd2UgY2FuIGFsbG93IGEgdGFyZ2V0IHRvIGN1c3RvbWl6ZSB0aGlzIGlmIG5lY2Vzc2FyeSBbc2F5IGJ5Ci0gICByZWNvcmRpbmcgc29tZXRoaW5nIGluIHRoZSBrZXl3b3JkIHRhYmxlXS4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwga2V5d29yZF90YWJsZSwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0gIGNoYXIgYnVmWzI1Nl07Ci0gIGNvbnN0IGNoYXIgKnAsKnN0YXJ0OwotCi0gIHAgPSBzdGFydCA9ICpzdHJwOwotCi0gIC8qIEFsbG93IGFueSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgIE5vdGUgdGhhdCB0aGlzIGFsbG93cyByZWNvZ25pemluZyAiLGEiIGZvciB0aGUgYW5udWwgZmxhZyBpbiBzcGFyYwotICAgICBldmVuIHRob3VnaCAiLCIgaXMgc3Vic2VxdWVudGx5IG5vdCBhIHZhbGlkIGtleXdvcmQgY2hhci4gICovCi0gIGlmICgqcCkKLSAgICArK3A7Ci0KLSAgLyogTm93IGFsbG93IGxldHRlcnMsIGRpZ2l0cywgYW5kIF8uICAqLwotICB3aGlsZSAoKChwIC0gc3RhcnQpIDwgKGludCkgc2l6ZW9mIChidWYpKQotCSAmJiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnXycpKQotICAgICsrcDsKLQotICBpZiAocCAtIHN0YXJ0ID49IChpbnQpIHNpemVvZiAoYnVmKSkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSIpOwotCi0gIG1lbWNweSAoYnVmLCBzdGFydCwgcCAtIHN0YXJ0KTsKLSAgYnVmW3AgLSBzdGFydF0gPSAwOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lIChrZXl3b3JkX3RhYmxlLCBidWYpOwotCi0gIGlmIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICp2YWx1ZXAgPSBrZS0+dmFsdWU7Ci0gICAgICAvKiBEb24ndCBhZHZhbmNlIHBvaW50ZXIgaWYgd2UgcmVjb2duaXplZCB0aGUgbnVsbCBrZXl3b3JkLiAgKi8KLSAgICAgIGlmIChrZS0+bmFtZVswXSAhPSAwKQotCSpzdHJwID0gcDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiOwotfQotCi0vKiBQYXJzZSBhIHNtYWxsIHNpZ25lZCBpbnRlZ2VyIHBhcnNlci4KLSAgID8/PyBWQUxVRVAgaXMgbm90IGEgYmZkX3ZtYSAqIG9uIHB1cnBvc2UsIHRob3VnaCB0aGlzIGlzIGNvbmZ1c2luZy4KLSAgIE5vdGUgdGhhdCBpZiB0aGUgY2FsbGVyIGV4cGVjdHMgYSBiZmRfdm1hIHJlc3VsdCwgaXQgc2hvdWxkIGNhbGwKLSAgIGNnZW5fcGFyc2VfYWRkcmVzcy4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHQ7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICBlcnJtc2cgPSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9JTlRFR0VSLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTk9ORSwKLSAgICAgJnJlc3VsdCwgJnZhbHVlKTsKLSAgLyogRklYTUU6IEV4YW1pbmUgYHJlc3VsdCcuICAqLwotICBpZiAoIWVycm1zZykKLSAgICAqdmFsdWVwID0gdmFsdWU7Ci0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIFBhcnNlIGEgc21hbGwgdW5zaWduZWQgaW50ZWdlciBwYXJzZXIuCi0gICA/Pz8gVkFMVUVQIGlzIG5vdCBhIGJmZF92bWEgKiBvbiBwdXJwb3NlLCB0aG91Z2ggdGhpcyBpcyBjb25mdXNpbmcuCi0gICBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciBleHBlY3RzIGEgYmZkX3ZtYSByZXN1bHQsIGl0IHNob3VsZCBjYWxsCi0gICBjZ2VuX3BhcnNlX2FkZHJlc3MuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHQ7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICBlcnJtc2cgPSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9JTlRFR0VSLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTk9ORSwKLSAgICAgJnJlc3VsdCwgJnZhbHVlKTsKLSAgLyogRklYTUU6IEV4YW1pbmUgYHJlc3VsdCcuICAqLwotICBpZiAoIWVycm1zZykKLSAgICAqdmFsdWVwID0gdmFsdWU7Ci0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIEFkZHJlc3MgcGFyc2VyLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBvcGluZm8sIHJlc3VsdHAsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBpbnQgb3BpbmZvOwotICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKnJlc3VsdHA7Ci0gICAgIGJmZF92bWEgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfQUREUkVTUywgc3RycCwgb3BpbmRleCwgb3BpbmZvLAotICAgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgewotICAgICAgaWYgKHJlc3VsdHAgIT0gTlVMTCkKLQkqcmVzdWx0cCA9IHJlc3VsdF90eXBlOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgIH0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQwKLS8qIFNpZ25lZCBpbnRlZ2VyIHZhbGlkYXRpb24gcm91dGluZS4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl92YWxpZGF0ZV9zaWduZWRfaW50ZWdlciAodmFsdWUsIG1pbiwgbWF4KQotICAgICBsb25nIHZhbHVlLCBtaW4sIG1heDsKLXsKLSAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpLAotCQkgICAgICB2YWx1ZSwgbWluLCBtYXgpOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVuc2lnbmVkIGludGVnZXIgdmFsaWRhdGlvbiByb3V0aW5lLgotICAgU3VwcGx5aW5nIGBtaW4nIGhlcmUgbWF5IHNlZW0gdW5uZWNlc3NhcnksIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gaGFuZGxlCi0gICBjYXNlcyB3aGVyZSBtaW4gIT0gMCAoYW5kIG1heCA+IExPTkdfTUFYKS4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl92YWxpZGF0ZV91bnNpZ25lZF9pbnRlZ2VyICh2YWx1ZSwgbWluLCBtYXgpCi0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1pbiwgbWF4OwotewotICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gJWx1IGFuZCAlbHUpIiksCi0JICAgICAgIHZhbHVlLCBtaW4sIG1heCk7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY2dlbi1kaXMuYyBiL29wY29kZXMvY2dlbi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiMWNkOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NnZW4tZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogQ0dFTiBnZW5lcmljIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGNvZGUuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfZGlzX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotCi0gICBDT1VOVCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIElOU05TLgotICAgRU5UU0laRSBpcyBzaXplb2YgKENHRU5fSUJBU0UpIGZvciB0aGUgdGFyZ2V0LgotICAgPz8/IE5vIGxvbmdlciB1c2VkIGJ1dCBsZWF2ZSBpbiBmb3Igbm93LgotICAgSFRBQkxFIHBvaW50cyB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIEhFTlRCVUYgaXMgYSBwb2ludGVyIHRvIHN1ZmZpY2llbnRseSBsYXJnZSBidWZmZXIgb2YgaGFzaCBlbnRyaWVzLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZW50cnkgdG8gdXNlLgotCi0gICBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgYWRkaXRpb25zIGFyZSBtYWRlIHRvIHRoZSBmcm9udCBvZiB0aGUKLSAgIGxpc3QgYW5kIHdlIHdhbnQgZWFybGllciBvbmVzIHRvIGJlIHByZWZlcmVkLiAgKi8KLQotc3RhdGljIENHRU5fSU5TTl9MSVNUICoKLWhhc2hfaW5zbl9hcnJheSAoY2QsIGluc25zLCBjb3VudCwgZW50c2l6ZSwgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuczsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgZW50c2l6ZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKiogaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqIGhlbnRidWY7Ci17Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IC0taSwgKytoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY2hhciBidWYgWzRdOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9ICZpbnNuc1tpXTsKLQotICAgICAgaWYgKCEgKCogY2QtPmRpc19oYXNoX3ApIChpbnNuKSkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSB0YXJnZXQgdXNlcyB0aGUgYnVmZmVyIG9yIHRoZSBiYXNlIGluc24KLQkgdG8gaGFzaCBvbiwgc28gc2V0IGJvdGggdXAuICAqLwotCi0gICAgICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLSAgICAgIHN3aXRjaCAoQ0dFTl9JTlNOX01BU0tfQklUU0laRSAoaW5zbikpCi0JewotCWNhc2UgODoKLQkgIGJ1ZlswXSA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAxNjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQljYXNlIDMyOgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKLSAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGVbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaW5zbjsKLSAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGhhc2hfaW5zbl9hcnJheSBleGNlcHQgdGhlIGluc25zIGFyZQotICAgaW4gYSBsaXN0LiAgKi8KLQotc3RhdGljIENHRU5fSU5TTl9MSVNUICoKLWhhc2hfaW5zbl9saXN0IChjZCwgaW5zbnMsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25zOwotICAgICBDR0VOX0lOU05fTElTVCAqKmh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKmhlbnRidWY7Ci17Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIGZvciAoaWxpc3QgPSBpbnNuczsgaWxpc3QgIT0gTlVMTDsgaWxpc3QgPSBpbGlzdC0+bmV4dCwgKysgaGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLSAgICAgIGNoYXIgYnVmWzRdOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICAgICAgaWYgKCEgKCogY2QtPmRpc19oYXNoX3ApIChpbGlzdC0+aW5zbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgdGhlIGJ1ZmZlciBvciB0aGUgYmFzZSBpbnNuCi0JIHRvIGhhc2ggb24sIHNvIHNldCBib3RoIHVwLiAgKi8KLQotICAgICAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaWxpc3QtPmluc24pOwotICAgICAgc3dpdGNoIChDR0VOX0lOU05fTUFTS19CSVRTSVpFIChpbGlzdC0+aW5zbikpCi0JewotCWNhc2UgODoKLQkgIGJ1ZlswXSA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAxNjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQljYXNlIDMyOgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKLSAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGUgW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOwotICAgICAgaHRhYmxlIFtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBCdWlsZCB0aGUgZGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfZGlzX2hhc2hfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZ2VuX2luc25fY291bnQgKGNkKSArIGNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpOwotICBDR0VOX0lOU05fVEFCTEUgKmluc25fdGFibGUgPSAmIGNkLT5pbnNuX3RhYmxlOwotICBDR0VOX0lOU05fVEFCTEUgKm1hY3JvX2luc25fdGFibGUgPSAmIGNkLT5tYWNyb19pbnNuX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmRpc19oYXNoX3NpemU7Ci0gIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKLSAgQ0dFTl9JTlNOX0xJU1QgKipkaXNfaGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmRpc19oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLwotCi0gIGRpc19oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQotICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBtZW1zZXQgKGRpc19oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgZGlzX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCi0gICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgotICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCi0gIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCi0gICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAotCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgotICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCQkJICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIGNkLT5kaXNfaGFzaF90YWJsZSA9IGRpc19oYXNoX3RhYmxlOwotICBjZC0+ZGlzX2hhc2hfdGFibGVfZW50cmllcyA9IGRpc19oYXNoX3RhYmxlX2VudHJpZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCi0KLUNHRU5fSU5TTl9MSVNUICoKLWNnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqIGJ1ZjsKLSAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNkLT5kaXNfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIChjZCk7Ci0KLSAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotCi0gIHJldHVybiBjZC0+ZGlzX2hhc2hfdGFibGVbaGFzaF07Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tb3BjLmMgYi9vcGNvZGVzL2NnZW4tb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTNhZGQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBvcGNvZGUgc3VwcG9ydC4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5d29yZF9uYW1lCi0gIFBBUkFNUyAoKGNvbnN0IENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2tleXdvcmRfdmFsdWUKLSAgUEFSQU1TICgoY29uc3QgQ0dFTl9LRVlXT1JEICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcwotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKikpOwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGhhc2ggdGFibGUgZW50cmllcyB0byB1c2UgZm9yIE4gZWxlbWVudHMuICAqLwotI2RlZmluZSBLRVlXT1JEX0hBU0hfU0laRShuKSAoKG4pIDw9IDMxID8gMTcgOiAzMSkKLQotLyogTG9vayB1cCAqTkFNRVAgaW4gdGhlIGtleXdvcmQgdGFibGUgS1QuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBrZXl3b3JkIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKLWNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSAoa3QsIG5hbWUpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0gIGNvbnN0IGNoYXIgKnAsKm47Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAga2UgPSBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hfa2V5d29yZF9uYW1lIChrdCwgbmFtZSwgMCldOwotCi0gIC8qIFdlIGRvIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMuCi0gICAgIElmIHRoYXQgZXZlciBiZWNvbWVzIGEgcHJvYmxlbSwgYWRkIGFuIGF0dHJpYnV0ZSB0aGF0IGRlbm90ZXMKLSAgICAgImRvIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb25zIi4gICovCi0KLSAgd2hpbGUgKGtlICE9IE5VTEwpCi0gICAgewotICAgICAgbiA9IG5hbWU7Ci0gICAgICBwID0ga2UtPm5hbWU7Ci0KLSAgICAgIHdoaWxlICgqcAotCSAgICAgJiYgKCpwID09ICpuCi0JCSB8fCAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpICpwKQotCQkgICAgICYmICh0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnApCi0JCQkgPT0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpuKSkpKSkKLQkrK24sICsrcDsKLQotICAgICAgaWYgKCEqcCAmJiAhKm4pCi0JcmV0dXJuIGtlOwotCi0gICAgICBrZSA9IGtlLT5uZXh0X25hbWU7Ci0gICAgfQotCi0gIGlmIChrdC0+bnVsbF9lbnRyeSkKLSAgICByZXR1cm4ga3QtPm51bGxfZW50cnk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rIHVwIFZBTFVFIGluIHRoZSBrZXl3b3JkIHRhYmxlIEtULgotICAgVGhlIHJlc3VsdCBpcyB0aGUga2V5d29yZCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlIChrdCwgdmFsdWUpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBrZSA9IGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hfa2V5d29yZF92YWx1ZSAoa3QsIHZhbHVlKV07Ci0KLSAgd2hpbGUgKGtlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHZhbHVlID09IGtlLT52YWx1ZSkKLQlyZXR1cm4ga2U7Ci0gICAgICBrZSA9IGtlLT5uZXh0X3ZhbHVlOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQWRkIGFuIGVudHJ5IHRvIGEga2V5d29yZCB0YWJsZS4gICovCi0KLXZvaWQKLWNnZW5fa2V5d29yZF9hZGQgKGt0LCBrZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAgaGFzaCA9IGhhc2hfa2V5d29yZF9uYW1lIChrdCwga2UtPm5hbWUsIDApOwotICBrZS0+bmV4dF9uYW1lID0ga3QtPm5hbWVfaGFzaF90YWJsZVtoYXNoXTsKLSAga3QtPm5hbWVfaGFzaF90YWJsZVtoYXNoXSA9IGtlOwotCi0gIGhhc2ggPSBoYXNoX2tleXdvcmRfdmFsdWUgKGt0LCBrZS0+dmFsdWUpOwotICBrZS0+bmV4dF92YWx1ZSA9IGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hdOwotICBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoXSA9IGtlOwotCi0gIGlmIChrZS0+bmFtZVswXSA9PSAwKQotICAgIGt0LT5udWxsX2VudHJ5ID0ga2U7Ci19Ci0KLS8qIEZJWE1FOiBOZWVkIGZ1bmN0aW9uIHRvIHJldHVybiBjb3VudCBvZiBrZXl3b3Jkcy4gICovCi0KLS8qIEluaXRpYWxpemUgYSBrZXl3b3JkIHRhYmxlIHNlYXJjaC4KLSAgIFNQRUMgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIHdoYXQgdG8gc2VhcmNoIGZvci4KLSAgIEEgdmFsdWUgb2YgTlVMTCBtZWFucyB0byBmaW5kIGV2ZXJ5IGtleXdvcmQuCi0gICBDdXJyZW50bHkgTlVMTCBpcyB0aGUgb25seSBhY2NlcHRhYmxlIHZhbHVlIFtmdXJ0aGVyIHNwZWNpZmljYXRpb24KLSAgIGRlZmVycmVkXS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gb3BhcXVlIGRhdGEgaXRlbSB1c2VkIHRvIHJlY29yZCB0aGUgc2VhcmNoIHN0YXR1cy4KLSAgIEl0IGlzIHBhc3NlZCB0byBlYWNoIGNhbGwgdG8gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0LiAgKi8KLQotQ0dFTl9LRVlXT1JEX1NFQVJDSAotY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChrdCwgc3BlYykKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgY29uc3QgY2hhciAqc3BlYzsKLXsKLSAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2g7Ci0KLSAgLyogRklYTUU6IE5lZWQgdG8gc3BlY2lmeSBmb3JtYXQgb2YgUEFSQU1TLiAgKi8KLSAgaWYgKHNwZWMgIT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBzZWFyY2gudGFibGUgPSBrdDsKLSAgc2VhcmNoLnNwZWMgPSBzcGVjOwotICBzZWFyY2guY3VycmVudF9oYXNoID0gMDsKLSAgc2VhcmNoLmN1cnJlbnRfZW50cnkgPSBOVUxMOwotICByZXR1cm4gc2VhcmNoOwotfQotCi0vKiBSZXR1cm4gdGhlIG5leHQga2V5d29yZCBzcGVjaWZpZWQgYnkgU0VBUkNILgotICAgVGhlIHJlc3VsdCBpcyB0aGUgbmV4dCBlbnRyeSBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBtb3JlLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKLWNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCAoc2VhcmNoKQotICAgICBDR0VOX0tFWVdPUkRfU0VBUkNIICpzZWFyY2g7Ci17Ci0gIC8qIEhhcyBzZWFyY2ggZmluaXNoZWQ/ICAqLwotICBpZiAoc2VhcmNoLT5jdXJyZW50X2hhc2ggPT0gc2VhcmNoLT50YWJsZS0+aGFzaF90YWJsZV9zaXplKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNlYXJjaCBpbiBwcm9ncmVzcz8gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTAotICAgICAgLyogQW55dGhpbmcgbGVmdCBvbiB0aGlzIGhhc2ggY2hhaW4/ICAqLwotICAgICAgJiYgc2VhcmNoLT5jdXJyZW50X2VudHJ5LT5uZXh0X25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWFyY2gtPmN1cnJlbnRfZW50cnkgPSBzZWFyY2gtPmN1cnJlbnRfZW50cnktPm5leHRfbmFtZTsKLSAgICAgIHJldHVybiBzZWFyY2gtPmN1cnJlbnRfZW50cnk7Ci0gICAgfQotCi0gIC8qIE1vdmUgdG8gbmV4dCBoYXNoIGNoYWluIFt1bmxlc3Mgd2UgaGF2ZW4ndCBzdGFydGVkIHlldF0uICAqLwotICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwpCi0gICAgKytzZWFyY2gtPmN1cnJlbnRfaGFzaDsKLQotICB3aGlsZSAoc2VhcmNoLT5jdXJyZW50X2hhc2ggPCBzZWFyY2gtPnRhYmxlLT5oYXNoX3RhYmxlX3NpemUpCi0gICAgewotICAgICAgc2VhcmNoLT5jdXJyZW50X2VudHJ5ID0gc2VhcmNoLT50YWJsZS0+bmFtZV9oYXNoX3RhYmxlW3NlYXJjaC0+Y3VycmVudF9oYXNoXTsKLSAgICAgIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTCkKLQlyZXR1cm4gc2VhcmNoLT5jdXJyZW50X2VudHJ5OwotICAgICAgKytzZWFyY2gtPmN1cnJlbnRfaGFzaDsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiBmaXJzdCBlbnRyeSBpbiBoYXNoIGNoYWluIGZvciBOQU1FLgotICAgSWYgQ0FTRV9TRU5TSVRJVkVfUCBpcyBub24temVybywgcmV0dXJuIGEgY2FzZSBzZW5zaXRpdmUgaGFzaC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWhhc2hfa2V5d29yZF9uYW1lIChrdCwgbmFtZSwgY2FzZV9zZW5zaXRpdmVfcCkKLSAgICAgY29uc3QgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGNhc2Vfc2Vuc2l0aXZlX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjYXNlX3NlbnNpdGl2ZV9wKQotICAgIGZvciAoaGFzaCA9IDA7ICpuYW1lOyArK25hbWUpCi0gICAgICBoYXNoID0gKGhhc2ggKiA5NykgKyAodW5zaWduZWQgY2hhcikgKm5hbWU7Ci0gIGVsc2UKLSAgICBmb3IgKGhhc2ggPSAwOyAqbmFtZTsgKytuYW1lKQotICAgICAgaGFzaCA9IChoYXNoICogOTcpICsgKHVuc2lnbmVkIGNoYXIpIHRvbG93ZXIgKCpuYW1lKTsKLSAgcmV0dXJuIGhhc2ggJSBrdC0+aGFzaF90YWJsZV9zaXplOwotfQotCi0vKiBSZXR1cm4gZmlyc3QgZW50cnkgaW4gaGFzaCBjaGFpbiBmb3IgVkFMVUUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYXNoX2tleXdvcmRfdmFsdWUgKGt0LCB2YWx1ZSkKLSAgICAgY29uc3QgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotICByZXR1cm4gdmFsdWUgJSBrdC0+aGFzaF90YWJsZV9zaXplOwotfQotCi0vKiBCdWlsZCBhIGtleXdvcmQgdGFibGUncyBoYXNoIHRhYmxlcy4KLSAgIFdlIHByb2JhYmx5IG5lZWRuJ3QgYnVpbGQgdGhlIHZhbHVlIGhhc2ggdGFibGUgZm9yIHRoZSBhc3NlbWJsZXIgd2hlbgotICAgd2UncmUgdXNpbmcgdGhlIGRpc2Fzc2VtYmxlciwgYnV0IHdlIGtlZXAgdGhpbmdzIHNpbXBsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLXsKLSAgaW50IGk7Ci0gIC8qIFVzZSB0aGUgbnVtYmVyIG9mIGNvbXBpbGVkIGluIGVudHJpZXMgYXMgYW4gZXN0aW1hdGUgZm9yIHRoZQotICAgICB0eXBpY2FsIHNpemVkIHRhYmxlIFtub3QgdG9vIG1hbnkgYWRkZWQgYXQgcnVudGltZV0uICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZSA9IEtFWVdPUkRfSEFTSF9TSVpFIChrdC0+bnVtX2luaXRfZW50cmllcyk7Ci0KLSAga3QtPmhhc2hfdGFibGVfc2l6ZSA9IHNpemU7Ci0gIGt0LT5uYW1lX2hhc2hfdGFibGUgPSAoQ0dFTl9LRVlXT1JEX0VOVFJZICoqKQotICAgIHhtYWxsb2MgKHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0gIG1lbXNldCAoa3QtPm5hbWVfaGFzaF90YWJsZSwgMCwgc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAga3QtPnZhbHVlX2hhc2hfdGFibGUgPSAoQ0dFTl9LRVlXT1JEX0VOVFJZICoqKQotICAgIHhtYWxsb2MgKHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0gIG1lbXNldCAoa3QtPnZhbHVlX2hhc2hfdGFibGUsIDAsIHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0KLSAgLyogVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIHdlIHdhbnQga2V5d29yZHMgYXBwZWFyaW5nIGVhcmxpZXIgdG8KLSAgICAgYmUgcHJlZmVyZWQgb3ZlciBsYXRlciBvbmVzLiAgKi8KLSAgZm9yIChpID0ga3QtPm51bV9pbml0X2VudHJpZXMgLSAxOyBpID49IDA7IC0taSkKLSAgICBjZ2VuX2tleXdvcmRfYWRkIChrdCwgJmt0LT5pbml0X2VudHJpZXNbaV0pOwotfQotDAotLyogSGFyZHdhcmUgc3VwcG9ydC4gICovCi0KLS8qIExvb2t1cCBhIGhhcmR3YXJlIGVsZW1lbnQgYnkgaXRzIG5hbWUuCi0gICBSZXR1cm5zIE5VTEwgaWYgTkFNRSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9IV19FTlRSWSAqCi1jZ2VuX2h3X2xvb2t1cF9ieV9uYW1lIChjZCwgbmFtZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipodyA9IGNkLT5od190YWJsZS5lbnRyaWVzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjZC0+aHdfdGFibGUubnVtX2VudHJpZXM7ICsraSkKLSAgICBpZiAoaHdbaV0gJiYgc3RyY21wIChuYW1lLCBod1tpXS0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBod1tpXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogTG9va3VwIGEgaGFyZHdhcmUgZWxlbWVudCBieSBpdHMgbnVtYmVyLgotICAgSGFyZHdhcmUgZWxlbWVudHMgYXJlIGVudW1lcmF0ZWQsIGhvd2V2ZXIgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFkZCBzb21lCi0gICBhdCBydW50aW1lLCB0aHVzIEhXTlVNIGlzIG5vdCBhbiBlbnVtIHR5cGUgYnV0IHJhdGhlciBhbiBpbnQuCi0gICBSZXR1cm5zIE5VTEwgaWYgSFdOVU0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hY2guICAqLwotCi1jb25zdCBDR0VOX0hXX0VOVFJZICoKLWNnZW5faHdfbG9va3VwX2J5X251bSAoY2QsIGh3bnVtKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgaHdudW07Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqaHcgPSBjZC0+aHdfdGFibGUuZW50cmllczsKLQotICAvKiA/Pz8gVGhpcyBjYW4gYmUgc3BlZWRlZCB1cC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBjZC0+aHdfdGFibGUubnVtX2VudHJpZXM7ICsraSkKLSAgICBpZiAoaHdbaV0gJiYgaHdudW0gPT0gaHdbaV0tPnR5cGUpCi0gICAgICByZXR1cm4gaHdbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIHN1cHBvcnQuICAqLwotCi0vKiBMb29rdXAgYW4gb3BlcmFuZCBieSBpdHMgbmFtZS4KLSAgIFJldHVybnMgTlVMTCBpZiBOQU1FIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgbWFjaC9pc2EuICAqLwotCi1jb25zdCBDR0VOX09QRVJBTkQgKgotY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lIChjZCwgbmFtZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqKm9wID0gY2QtPm9wZXJhbmRfdGFibGUuZW50cmllczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2QtPm9wZXJhbmRfdGFibGUubnVtX2VudHJpZXM7ICsraSkKLSAgICBpZiAob3BbaV0gJiYgc3RyY21wIChuYW1lLCBvcFtpXS0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBvcFtpXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogTG9va3VwIGFuIG9wZXJhbmQgYnkgaXRzIG51bWJlci4KLSAgIE9wZXJhbmRzIGFyZSBlbnVtZXJhdGVkLCBob3dldmVyIGl0IG1heSBiZSBwb3NzaWJsZSB0byBhZGQgc29tZQotICAgYXQgcnVudGltZSwgdGh1cyBPUE5VTSBpcyBub3QgYW4gZW51bSB0eXBlIGJ1dCByYXRoZXIgYW4gaW50LgotICAgUmV0dXJucyBOVUxMIGlmIE9QTlVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgbWFjaC9pc2EuICAqLwotCi1jb25zdCBDR0VOX09QRVJBTkQgKgotY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0gKGNkLCBvcG51bSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9wbnVtOwotewotICByZXR1cm4gY2QtPm9wZXJhbmRfdGFibGUuZW50cmllc1tvcG51bV07Ci19Ci0MCi0vKiBJbnN0cnVjdGlvbiBzdXBwb3J0LiAgKi8KLQotLyogUmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW50aW1lLiAgKi8KLQotaW50Ci1jZ2VuX2luc25fY291bnQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZC0+aW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqcnRfaW5zbnMgPSBjZC0+aW5zbl90YWJsZS5uZXdfZW50cmllczsKLQotICBmb3IgKCA7IHJ0X2luc25zICE9IE5VTEw7IHJ0X2luc25zID0gcnRfaW5zbnMtPm5leHQpCi0gICAgKytjb3VudDsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIFJldHVybiBudW1iZXIgb2YgbWFjcm8taW5zdHJ1Y3Rpb25zLgotICAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVudGltZS4gICovCi0KLWludAotY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2QtPm1hY3JvX2luc25fdGFibGUubnVtX2luaXRfZW50cmllczsKLSAgQ0dFTl9JTlNOX0xJU1QgKnJ0X2luc25zID0gY2QtPm1hY3JvX2luc25fdGFibGUubmV3X2VudHJpZXM7Ci0KLSAgZm9yICggOyBydF9pbnNucyAhPSBOVUxMOyBydF9pbnNucyA9IHJ0X2luc25zLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byByZWFkIGFuZCBwcm9wZXJseSBieXRlc3dhcCBhbiBpbnNuIHZhbHVlLiAgKi8KLQotQ0dFTl9JTlNOX0lOVAotY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci0KLSAgc3dpdGNoIChsZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHZhbHVlID0gKmJ1ZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQl2YWx1ZSA9IGJmZF9nZXRiMTYgKGJ1Zik7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCXZhbHVlID0gYmZkX2dldGIzMiAoYnVmKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gc3RvcmUgYW4gaW5zbiB2YWx1ZSBwcm9wZXJseSBieXRlc3dhcHBlZC4gICovCi0KLXZvaWQKLWNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCwgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLXsKLSAgc3dpdGNoIChsZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIGJ1ZlswXSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCWJmZF9wdXRiMTYgKHZhbHVlLCBidWYpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHZhbHVlLCBidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCWJmZF9wdXRiMzIgKHZhbHVlLCBidWYpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHZhbHVlLCBidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQwKLS8qIExvb2sgdXAgaW5zdHJ1Y3Rpb24gSU5TTl8qX1ZBTFVFIGFuZCBleHRyYWN0IGl0cyBmaWVsZHMuCi0gICBJTlNOX0lOVF9WQUxVRSBpcyB1c2VkIGlmIENHRU5fSU5UX0lOU05fUC4KLSAgIE90aGVyd2lzZSBJTlNOX0JZVEVTX1ZBTFVFIGlzIHVzZWQuCi0gICBJTlNOLCBpZiBub24tbnVsbCwgaXMgdGhlIGluc24gdGFibGUgZW50cnkuCi0gICBPdGhlcndpc2UgSU5TTl8qX1ZBTFVFIGlzIGV4YW1pbmVkIHRvIGNvbXB1dGUgaXQuCi0gICBMRU5HVEggaXMgdGhlIGJpdCBsZW5ndGggb2YgSU5TTl8qX1ZBTFVFIGlmIGtub3duLCBvdGhlcndpc2UgMC4KLSAgIDAgaXMgb25seSB2YWxpZCBpZiBgaW5zbiA9PSBOVUxMICYmICEgQ0dFTl9JTlRfSU5TTl9QJy4KLSAgIElmIElOU04gIT0gTlVMTCwgTEVOR1RIIG11c3QgYmUgdmFsaWQuCi0gICBBTElBU19QIGlzIG5vbi16ZXJvIGlmIGFsaWFzIGluc25zIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoLgotCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbiB0YWJsZSBlbnRyeSwgb3IgTlVMTCBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgIHdhc24ndCByZWNvZ25pemVkLiAgKi8KLQotLyogPz8/IFdpbGwgbmVlZCB0byBiZSByZXZpc2l0ZWQgZm9yIFZMSVcgYXJjaGl0ZWN0dXJlcy4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1jZ2VuX2xvb2t1cF9pbnNuIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsIGxlbmd0aCwgZmllbGRzLAotCQkgIGFsaWFzX3ApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX2ludF92YWx1ZTsKLSAgICAgLyogPz8/IENHRU5fSU5TTl9CWVRFUyB3b3VsZCBiZSBhIG5pY2UgdHlwZSBuYW1lIHRvIHVzZSBoZXJlLiAgKi8KLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IGFsaWFzX3A7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc247Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0gIENHRU5fRVhUUkFDVF9JTkZPICppbmZvOwotCi0gIGlmIChjZC0+aW50X2luc25fcCkKLSAgICB7Ci0gICAgICBpbmZvID0gTlVMTDsKLSAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGFsbG9jYSAoY2QtPm1heF9pbnNuX2JpdHNpemUgLyA4KTsKLSAgICAgIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCwgaW5zbl9pbnRfdmFsdWUpOwotICAgICAgYmFzZV9pbnNuID0gaW5zbl9pbnRfdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5mbyA9ICZleF9pbmZvOwotICAgICAgZXhfaW5mby5kaXNfaW5mbyA9IE5VTEw7Ci0gICAgICBleF9pbmZvLmluc25fYnl0ZXMgPSBpbnNuX2J5dGVzX3ZhbHVlOwotICAgICAgZXhfaW5mby52YWxpZCA9IC0xOwotICAgICAgYnVmID0gaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgIGJhc2VfaW5zbiA9IGNnZW5fZ2V0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCk7Ci0gICAgfQotCi0gIGlmICghaW5zbikKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbl9saXN0OwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLQkgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gICAgICBpbnNuX2xpc3QgPSBjZ2VuX2Rpc19sb29rdXBfaW5zbiAoY2QsIGJ1ZiwgYmFzZV9pbnNuKTsKLSAgICAgIHdoaWxlIChpbnNuX2xpc3QgIT0gTlVMTCkKLQl7Ci0JICBpbnNuID0gaW5zbl9saXN0LT5pbnNuOwotCi0JICBpZiAoYWxpYXNfcAotCSAgICAgIC8qIEZJWE1FOiBFbnN1cmUgQUxJQVMgYXR0cmlidXRlIGFsd2F5cyBoYXMgc2FtZSBpbmRleC4gICovCi0JICAgICAgfHwgISBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX0FMSUFTKSkKLQkgICAgewotCSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0JICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZQotCQkgZXh0cmFjdCBoYW5kbGVyLiAgKi8KLQkgICAgICBpZiAoKGJhc2VfaW5zbiAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCQkgID09IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKSkKLQkJewotCQkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCQkgIGludCBlbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkJICAgIChjZCwgaW5zbiwgaW5mbywgYmFzZV9pbnNuLCBmaWVsZHMsIChiZmRfdm1hKSAwKTsKLQkJICBpZiAoZWxlbmd0aCA+IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIHNhbml0eSBjaGVjayAqLwotCQkgICAgICBpZiAobGVuZ3RoICE9IDAgJiYgbGVuZ3RoICE9IGVsZW5ndGgpCi0JCQlhYm9ydCAoKTsKLQkJICAgICAgcmV0dXJuIGluc247Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpbnNuX2xpc3QgPSBpbnNuX2xpc3QtPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNhbml0eSBjaGVjazogY2FuJ3QgcGFzcyBhbiBhbGlhcyBpbnNuIGlmICEgYWxpYXNfcC4gICovCi0gICAgICBpZiAoISBhbGlhc19wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX0FMSUFTKSkKLQlhYm9ydCAoKTsKLSAgICAgIC8qIFNhbml0eSBjaGVjazogbGVuZ3RoIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICBpZiAobGVuZ3RoICE9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0gICAgICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCShjZCwgaW5zbiwgaW5mbywgYmFzZV9pbnNuLCBmaWVsZHMsIChiZmRfdm1hKSAwKTsKLSAgICAgIC8qIFNhbml0eSBjaGVjazogbXVzdCBzdWNjZWVkLgotCSBDb3VsZCByZWxheCB0aGlzIGxhdGVyIGlmIGl0IGV2ZXIgcHJvdmVzIHVzZWZ1bC4gICovCi0gICAgICBpZiAobGVuZ3RoID09IDApCi0JYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIG9wZXJhbmQgaW5zdGFuY2VzIHVzZWQgYnkgSU5TTiB3aG9zZSBvcGVyYW5kcyBhcmUgRklFTERTLgotICAgSU5ESUNFUyBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgb2YgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIGludHMgdG8gYmUgZmlsbGVkCi0gICBpbi4gICovCi0KLXZvaWQKLWNnZW5fZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBmaWVsZHMsIGluZGljZXMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50ICppbmRpY2VzOwotewotICBjb25zdCBDR0VOX09QSU5TVCAqb3BpbnN0OwotICBpbnQgaTsKLQotICBpZiAoaW5zbi0+b3BpbnN0ID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0gIGZvciAoaSA9IDAsIG9waW5zdCA9IGluc24tPm9waW5zdDsgb3BpbnN0LT50eXBlICE9IENHRU5fT1BJTlNUX0VORDsgKytpLCArK29waW5zdCkKLSAgICB7Ci0gICAgICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIG9wX3R5cGUgPSBvcGluc3QtPm9wX3R5cGU7Ci0gICAgICBpZiAob3BfdHlwZSA9PSBDR0VOX09QRVJBTkRfTklMKQotCWluZGljZXNbaV0gPSBvcGluc3QtPmluZGV4OwotICAgICAgZWxzZQotCWluZGljZXNbaV0gPSAoKmNkLT5nZXRfaW50X29wZXJhbmQpIChjZCwgb3BfdHlwZSwgZmllbGRzKTsKLSAgICB9Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIGNnZW5fZ2V0X2luc25fb3BlcmFuZHMgd2hlbiBlaXRoZXIgSU5TTiBvciBGSUVMRFMKLSAgIGlzbid0IGtub3duLgotICAgVGhlIElOU04sIElOU05fKl9WQUxVRSwgYW5kIExFTkdUSCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwotICAgY2dlbl9sb29rdXBfaW5zbiB1bmNoYW5nZWQuCi0gICBJTlNOX0lOVF9WQUxVRSBpcyB1c2VkIGlmIENHRU5fSU5UX0lOU05fUC4KLSAgIE90aGVyd2lzZSBJTlNOX0JZVEVTX1ZBTFVFIGlzIHVzZWQuCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGluc24gdGFibGUgZW50cnkgb3IgTlVMTCBpZiB0aGUgaW5zdHJ1Y3Rpb24gd2Fzbid0Ci0gICByZWNvZ25pemVkLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLWNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsCi0JCQkgICAgICAgbGVuZ3RoLCBpbmRpY2VzLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX2ludF92YWx1ZTsKLSAgICAgLyogPz8/IENHRU5fSU5TTl9CWVRFUyB3b3VsZCBiZSBhIG5pY2UgdHlwZSBuYW1lIHRvIHVzZSBoZXJlLiAgKi8KLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgaW50ICppbmRpY2VzOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotewotICAvKiBQYXNzIG5vbi16ZXJvIGZvciBBTElBU19QIG9ubHkgaWYgSU5TTiAhPSBOVUxMLgotICAgICBJZiBJTlNOID09IE5VTEwsIHdlIHdhbnQgYSByZWFsIGluc24uICAqLwotICBpbnNuID0gY2dlbl9sb29rdXBfaW5zbiAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLAotCQkJICAgbGVuZ3RoLCBmaWVsZHMsIGluc24gIT0gTlVMTCk7Ci0gIGlmICghIGluc24pCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGZpZWxkcywgaW5kaWNlcyk7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBBbGxvdyBzaWduZWQgb3ZlcmZsb3cgb2YgaW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8KLXZvaWQKLWNnZW5fc2V0X3NpZ25lZF9vdmVyZmxvd19vayAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5zaWduZWRfb3ZlcmZsb3dfb2tfcCA9IDE7Ci19Ci0KLS8qIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYgYSBzaWduZWQgZmllbGQgaW4gYW4gaW5zdHJ1Y3Rpb24gb3ZlcmZsb3dzLiAgKi8KLXZvaWQKLWNnZW5fY2xlYXJfc2lnbmVkX292ZXJmbG93X29rIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPnNpZ25lZF9vdmVyZmxvd19va19wID0gMDsKLX0KLQotLyogV2lsbCBhbiBlcnJvciBtZXNzYWdlIGJlIGdlbmVyYXRlZCBpZiBhIHNpZ25lZCBmaWVsZCBpbiBhbiBpbnN0cnVjdGlvbiBvdmVyZmxvd3MgPyAqLwotdW5zaWduZWQgaW50Ci1jZ2VuX3NpZ25lZF9vdmVyZmxvd19va19wIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgcmV0dXJuIGNkLT5zaWduZWRfb3ZlcmZsb3dfb2tfcDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlnLmluIGIvb3Bjb2Rlcy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGEzMjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NTVmZTcuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyBpZiBnY2MgaXMgdXNlZCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9ejhrLWRpcy5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwNzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mjg6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjcxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzk1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyNjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1OTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg5MTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1CRkRfVkVSU0lPTj1gZ3JlcCBJTklUX0FVVE9NQUtFICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmluIHwgc2VkIC1uIC1lICdzL1sgCV0vL2cnIC1lICdzL14uKixcKC4qXCkpLiokL1wxL3AnYAotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyOTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODI6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzOTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9b3Bjb2RlcwotCi1WRVJTSU9OPSR7QkZEX1ZFUlNJT059Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk4OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI0OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMzc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjI0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzMwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjk6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTM6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5NjogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzMTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0NzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tIHx8IHRlc3QgLWYgJGFjX2Rpci9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgzOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1jYXNlICIkdGFyZ2V0IiBpbgotTk9ORSkgbHRfdGFyZ2V0PSIkaG9zdCIgOzsKLSopIGx0X3RhcmdldD0iJHRhcmdldCIgOzsKLWVzYWMKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIDoKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgPSB4bm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi10ZXN0IHgiJHNpbGVudCIgPSB4eWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTUzMiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTU0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU1OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLQotZXNhYwotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIG9wY29kZXMgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi1idWlsZF93YXJuaW5ncz0iLVcgLVdhbGwiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYnVpbGQtd2FybmluZ3Mgb3IgLS1kaXNhYmxlLWJ1aWxkLXdhcm5pbmdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2J1aWxkX3dhcm5pbmdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9idWlsZF93YXJuaW5ncyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCTs7Ci0gIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKLSAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0gICAgICAgIGJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotICAgICAgICBidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OwotICAqKSAgICBidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQotZmkKLWZpCi1XQVJOX0NGTEFHUz0iIgotaWYgdGVzdCAieCR7YnVpbGRfd2FybmluZ3N9IiAhPSB4IC1hICJ4JEdDQyIgPSB4eWVzIDsgdGhlbgotICAgIFdBUk5fQ0ZMQUdTPSIke2J1aWxkX3dhcm5pbmdzfSIKLWZpCi0KLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Mzk6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzYyOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzY3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzc4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzk1OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MjY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk3NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTk4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMjI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA1MDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNjQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjY4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMyMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM4MzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDE2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDg0OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0ODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NDk6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU3OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MzQ6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY4NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI2OTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcyNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzc4OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk1NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTk0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTEzOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE0NjogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTY2OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxODU6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMTI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQwOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzE1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzQ5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTEyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1ODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NzI6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MDA6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc4NzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NDQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLXVzaW5nX2NnZW49bm8KLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vYmZkIC1sYmZkIC1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4iCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotc2VsYXJjaHM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLSAgICBmaQotZG9uZQkKLQotIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgotCi1jZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKLQotIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KLQotICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSAgICB0YT0KLQotICAgIGZvciBhcmNoIGluICRzZWxhcmNocwotICAgIGRvCi0JYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCi0JYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgotCWNhc2UgIiRhcmNoIiBpbgotCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OwotCWJmZF9hbGxpYW50X2FyY2gpCTs7Ci0JYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7Ci0JYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7Ci0JYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OwotCWJmZF9hdnJfYXJjaCkJCXRhPSIkdGEgYXZyLWRpcy5sbyIgOzsKLQliZmRfY29udmV4X2FyY2gpCTs7Ci0JYmZkX2QxMHZfYXJjaCkJCXRhPSIkdGEgZDEwdi1kaXMubG8gZDEwdi1vcGMubG8iIDs7Ci0JYmZkX2QzMHZfYXJjaCkJCXRhPSIkdGEgZDMwdi1kaXMubG8gZDMwdi1vcGMubG8iIDs7Ci0JYmZkX2ZyMzBfYXJjaCkgICAgICAgICAgdGE9IiR0YSBmcjMwLWFzbS5sbyBmcjMwLWRlc2MubG8gZnIzMC1kaXMubG8gZnIzMC1pYmxkLmxvIGZyMzAtb3BjLmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9oODMwMF9hcmNoKQkJdGE9IiR0YSBoODMwMC1kaXMubG8iIDs7Ci0JYmZkX2g4NTAwX2FyY2gpCQl0YT0iJHRhIGg4NTAwLWRpcy5sbyIgOzsKLQliZmRfaHBwYV9hcmNoKQkJdGE9IiR0YSBocHBhLWRpcy5sbyIgOzsKLQliZmRfaTM3MF9hcmNoKQkJdGE9IiR0YSBpMzcwLWRpcy5sbyBpMzcwLW9wYy5sbyIgOzsKLQliZmRfaTM4Nl9hcmNoKQkJdGE9IiR0YSBpMzg2LWRpcy5sbyIgOzsKLQliZmRfaTg2MF9hcmNoKQkJOzsKLQliZmRfaTk2MF9hcmNoKQkJdGE9IiR0YSBpOTYwLWRpcy5sbyIgOzsKLQliZmRfaWE2NF9hcmNoKQkJdGE9IiR0YSBpYTY0LWRpcy5sbyBpYTY0LW9wYy5sbyIgOzsKLQliZmRfbTMycl9hcmNoKQkJdGE9IiR0YSBtMzJyLWFzbS5sbyBtMzJyLWRlc2MubG8gbTMyci1kaXMubG8gbTMyci1pYmxkLmxvIG0zMnItb3BjLmxvIG0zMnItb3BpbnN0LmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9tNjhrX2FyY2gpCQl0YT0iJHRhIG02OGstZGlzLmxvIG02OGstb3BjLmxvIiA7OwotCWJmZF9tODhrX2FyY2gpCQl0YT0iJHRhIG04OGstZGlzLmxvIiA7OwotCWJmZF9tY29yZV9hcmNoKQkJdGE9IiR0YSBtY29yZS1kaXMubG8iIDs7Ci0JYmZkX21pcHNfYXJjaCkJCXRhPSIkdGEgbWlwcy1kaXMubG8gbWlwcy1vcGMubG8gbWlwczE2LW9wYy5sbyIgOzsKLQliZmRfbW4xMDIwMF9hcmNoKQl0YT0iJHRhIG0xMDIwMC1kaXMubG8gbTEwMjAwLW9wYy5sbyIgOzsKLQliZmRfbW4xMDMwMF9hcmNoKQl0YT0iJHRhIG0xMDMwMC1kaXMubG8gbTEwMzAwLW9wYy5sbyIgOzsKLQliZmRfbnMzMmtfYXJjaCkJCXRhPSIkdGEgbnMzMmstZGlzLmxvIiA7OwotCWJmZF9wal9hcmNoKQkgICAgICAgIHRhPSIkdGEgcGotZGlzLmxvIHBqLW9wYy5sbyIgOzsKLQliZmRfcG93ZXJwY19hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfcHlyYW1pZF9hcmNoKQk7OwotCWJmZF9yb21wX2FyY2gpCQk7OwotCWJmZF9yczYwMDBfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfNjRfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3NoX2FyY2gpCQl0YT0iJHRhIHNoLWRpcy5sbyIgOzsKLQliZmRfc3BhcmNfYXJjaCkJCXRhPSIkdGEgc3BhcmMtZGlzLmxvIHNwYXJjLW9wYy5sbyIgOzsKLQliZmRfdGFob2VfYXJjaCkJCTs7Ci0JYmZkX3RpYzMwX2FyY2gpCQl0YT0iJHRhIHRpYzMwLWRpcy5sbyIgOzsKLQliZmRfdGljNTR4X2FyY2gpCXRhPSIkdGEgdGljNTR4LWRpcy5sbyB0aWM1NHgtb3BjLmxvIiA7OwotCWJmZF90aWM4MF9hcmNoKQkJdGE9IiR0YSB0aWM4MC1kaXMubG8gdGljODAtb3BjLmxvIiA7OwotCWJmZF92ODUwX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZV9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVhX2FyY2gpCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3ZheF9hcmNoKQkJdGE9IiR0YSB2YXgtZGlzLmxvIiA7OwotCWJmZF93NjVfYXJjaCkJCXRhPSIkdGEgdzY1LWRpcy5sbyIgOzsKLQliZmRfd2UzMmtfYXJjaCkJCTs7Ci0JYmZkX3o4a19hcmNoKQkJdGE9IiR0YSB6OGstZGlzLmxvIiA7OwotCi0JIiIpCQkJOzsKLQkqKQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgYXJjaGl0ZWN0dXJlICRhcmNoIiAxPiYyOyBleGl0IDE7IH0gOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQl0YT0iJHRhICRjZ2VuX2ZpbGVzIgotICAgIGZpCi0KLSAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJHRhIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgdGE9IiRmIgotCi0gICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICBhcmNoZGVmcz0iJGYiCi0KLSAgICBCRkRfTUFDSElORVM9IiR0YSIKLQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCi0gICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCi1maQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATE5fU0AlJExOX1MlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBhcmNoZGVmc0AlJGFyY2hkZWZzJWcKLXMlQEJGRF9NQUNISU5FU0AlJEJGRF9NQUNISU5FUyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlLmluIGIvb3Bjb2Rlcy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTRiZmMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLQotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKHo4ay1kaXMuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1jaGFuZ2VxdW90ZSgsKWRubAotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotQU1fSU5JVF9BVVRPTUFLRShvcGNvZGVzLCAke0JGRF9WRVJTSU9OfSkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKGNvbW1vbmJmZGxpYiwKLVsgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKFtiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBvcGNvZGVzIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLWJ1aWxkX3dhcm5pbmdzPSItVyAtV2FsbCIKLUFDX0FSR19FTkFCTEUoYnVpbGQtd2FybmluZ3MsCi1bICAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyBpZiBnY2MgaXMgdXNlZF0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCTs7Ci0gIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKLSAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0gICAgICAgIGJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotICAgICAgICBidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OwotICAqKSAgICBidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQotZmldKWRubAotV0FSTl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcyA7IHRoZW4KLSAgICBXQVJOX0NGTEFHUz0iJHtidWlsZF93YXJuaW5nc30iCi1maQotQUNfU1VCU1QoV0FSTl9DRkxBR1MpCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotQUNfUFJPR19DQwotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1BST0dfSU5TVEFMTAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCkKLQotCi11c2luZ19jZ2VuPW5vCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2F2cl9hcmNoKQkJdGE9IiR0YSBhdnItZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzcwX2FyY2gpCQl0YT0iJHRhIGkzNzAtZGlzLmxvIGkzNzAtb3BjLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9pYTY0X2FyY2gpCQl0YT0iJHRhIGlhNjQtZGlzLmxvIGlhNjQtb3BjLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3BqX2FyY2gpCSAgICAgICAgdGE9IiR0YSBwai1kaXMubG8gcGotb3BjLmxvIiA7OwotCWJmZF9wb3dlcnBjX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9weXJhbWlkX2FyY2gpCTs7Ci0JYmZkX3JvbXBfYXJjaCkJCTs7Ci0JYmZkX3JzNjAwMF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfcG93ZXJwY182NF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfc2hfYXJjaCkJCXRhPSIkdGEgc2gtZGlzLmxvIiA7OwotCWJmZF9zcGFyY19hcmNoKQkJdGE9IiR0YSBzcGFyYy1kaXMubG8gc3BhcmMtb3BjLmxvIiA7OwotCWJmZF90YWhvZV9hcmNoKQkJOzsKLQliZmRfdGljMzBfYXJjaCkJCXRhPSIkdGEgdGljMzAtZGlzLmxvIiA7OwotCWJmZF90aWM1NHhfYXJjaCkJdGE9IiR0YSB0aWM1NHgtZGlzLmxvIHRpYzU0eC1vcGMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQlBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCkgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQl0YT0iJHRhICRjZ2VuX2ZpbGVzIgotICAgIGZpCi0KLSAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJHRhIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgdGE9IiRmIgotCi0gICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICBhcmNoZGVmcz0iJGYiCi0KLSAgICBCRkRfTUFDSElORVM9IiR0YSIKLQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCi0gICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCi1maQotCi1BQ19TVUJTVChhcmNoZGVmcykKLUFDX1NVQlNUKEJGRF9NQUNISU5FUykKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1kaXMuYyBiL29wY29kZXMvZDEwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkYTEzNC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QxMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDEwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIHRoZSBQQyB3cmFwcyBhdCAxOCBiaXRzLCBleGNlcHQgZm9yIHRoZSBzZWdtZW50IG51bWJlciAqLwotLyogc28gdXNlIHRoaXMgbWFzayB0byBrZWVwIHRoZSBwYXJ0cyB3ZSB3YW50ICovCi0jZGVmaW5lIFBDX01BU0sJMHgwMzAzRkZGRgotCi1zdGF0aWMgdm9pZCBkaXNfMl9zaG9ydCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGJmZF92bWEgbWVtYWRkciwgCi0JCQkJIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBpbnQgb3JkZXIpKTsKLXN0YXRpYyB2b2lkIGRpc19sb25nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCSAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLWludCAKLXByaW50X2luc25fZDEwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgc3RhdHVzID0gaW5zbiAmIEZNMTE7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gIGNhc2UgMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0wMToKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMToKLSAgICBkaXNfbG9uZyAoaW5zbiwgbWVtYWRkciwgaW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChvcGVyLCBpbnNuLCBvcCwgbWVtYWRkciwgaW5mbykKLSAgICAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbnVtLCBzaGlmdDsKLQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2hpZnQgPSBvcGVyLT5zaGlmdDsKLQotICAvKiB0aGUgTE9OR19MIGZvcm1hdCBzaGlmdHMgcmVnaXN0ZXJzIG92ZXIgYnkgMTUgKi8KLSAgaWYgKG9wLT5mb3JtYXQgPT0gTE9OR19MICYmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKSkKLSAgICBzaGlmdCArPSAxNTsKLQotICBudW0gPSAoaW5zbiA+PiBzaGlmdCkgJiAoMHg3RkZGRkZGRiA+PiAoMzEgLSBvcGVyLT5iaXRzKSk7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbWF0Y2g9MDsKLSAgICAgIG51bSArPSAob3Blci0+ZmxhZ3MKLQkgICAgICAmIChPUEVSQU5EX0dQUnxPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUd8T1BFUkFORF9DT05UUk9MKSk7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JbnVtICs9IG51bSA/IE9QRVJBTkRfQUNDMSA6IE9QRVJBTkRfQUNDMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkMTB2X3JlZ19uYW1lX2NudCgpOyBpKyspCi0JewotCSAgaWYgKG51bSA9PSBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCSAgICB7Ci0JICAgICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5uYW1lKTsKLQkgICAgICBtYXRjaD0xOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCSAgICAgcmVnaXN0ZXIgdGFibGUgKi8KLQkgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhIik7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciIpOwotCSAgZWxzZSBpZihvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIiKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLG51bSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFkZHJlc3NlcyBhcmUgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JewotCSAgbG9uZyBtYXg7Ci0JICBpbnQgbmVnPTA7Ci0JICBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgIGlmIChudW0gJiBtYXgpCi0JICAgIHsKLQkgICAgICBudW0gPSAtbnVtICYgKCgxIDw8IG9wZXItPmJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIG51bSA9IG51bTw8MjsKLQkgIGlmIChpbmZvLT5mbGFncyAmIElOU05fSEFTX1JFTE9DKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG51bSAmIFBDX01BU0ssIGluZm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5lZykKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAtIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyBudW0pICYgUENfTUFTSywgaW5mbyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgbWF4ID0gKDEgPDwgKG9wZXItPmJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKG51bSAmIG1heCkKLQkJewotCQkgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IixudW0pOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlszMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZSkpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOyAgIAotCSAgZm9yICggaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkgICAgewotCSAgICAgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCW5lZWRfcGFyZW4gPSAxOwotCSAgICAgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsgICAKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQotCi1zdGF0aWMgdm9pZAotZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIG9yZGVyKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBvcmRlcjsKLXsKLSAgaW50IGksajsKLSAgY2hhciBhc3RyWzJdWzMyXTsKLSAgdW5zaWduZWQgaW50IGluc1syXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLSAgY2hhciBidWZbMzJdOwotICBpbnQgbWF0Y2gsIG51bV9tYXRjaD0wOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0KLSAgaW5zWzBdID0gKGluc24gJiAweDNGRkZGRkZGKSA+PiAxNTsKLSAgaW5zWzFdID0gaW5zbiAmIDB4MDAwMDdGRkY7Ci0KLSAgZm9yKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIG9wID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2RlczsKLSAgICAgIG1hdGNoPTA7Ci0gICAgICB3aGlsZSAob3AtPm5hbWUpCi0JewotCSAgaWYgKChvcC0+Zm9ybWF0ICYgU0hPUlRfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zW2pdKSA9PSBvcC0+b3Bjb2RlKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsb3AtPm5hbWUpOyAgIAotCSAgICAgIGZvciAoaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkJewotCQkgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JCSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCSAgICBuZWVkX3BhcmVuID0gMTsKLQkJICBwcmludF9vcGVyYW5kIChvcGVyLCBpbnNbal0sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJiAKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCQl9Ci0JICAgICAgbWF0Y2ggPSAxOwotCSAgICAgIG51bV9tYXRjaCsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvcCsrOwotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1bmtub3duIik7ICAgCi0KLSAgICAgIHN3aXRjaCAob3JkZXIpCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQtPlx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChudW1fbWF0Y2ggPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMTB2LW9wYy5jIGIvb3Bjb2Rlcy9kMTB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWJlMmNjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDEwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKiBkMTB2LW9wYy5jIC0tIEQxMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLQotCi0vKiAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotY29uc3Qgc3RydWN0IHBkX3JlZyBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIE5VTEwsIE9QRVJBTkRfQUNDMCswIH0sCi0gIHsgImExIiwgTlVMTCwgT1BFUkFORF9BQ0MxKzEgfSwKLSAgeyAiYnBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiYnBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImMiLCBOVUxMLCBPUEVSQU5EX0NGTEFHKzMgfSwKLSAgeyAiY3IwIiwgInBzdyIsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJjcjEiLCAiYnBzdyIsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImNyMTAiLCAibW9kX3MiLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAiY3IxMSIsICJtb2RfZSIsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJjcjEyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEyIH0sCi0gIHsgImNyMTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTMgfSwKLSAgeyAiY3IxNCIsICJpYmEiLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiY3IxNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJjcjIiLCAicGMiLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJjcjMiLCAiYnBjIiwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiY3I0IiwgImRwc3ciLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJjcjUiLCAiZHBjIiwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiY3I2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYgfSwKLSAgeyAiY3I3IiwgInJwdF9jIiwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAiY3I4IiwgInJwdF9zIiwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAiY3I5IiwgInJwdF9lIiwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAiZHBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiZHBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImYwIiwgTlVMTCwgT1BFUkFORF9GRkxBRyswIH0sCi0gIHsgImYxIiwgTlVMTCwgT1BFUkFORF9GRkxBRysxIH0sCi0gIHsgImliYSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJsaW5rIiwgInIxMyIsIE9QRVJBTkRfR1BSKzEzIH0sCi0gIHsgIm1vZF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgIm1vZF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgInBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzAgfSwKLSAgeyAicjAiLCBOVUxMLCBPUEVSQU5EX0dQUiswIH0sCi0gIHsgInIwLXIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMH0sCi0gIHsgInIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMSB9LAotICB7ICJyMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzEgfSwKLSAgeyAicjEwIiwgTlVMTCwgT1BFUkFORF9HUFIrMTAgfSwKLSAgeyAicjEwLXIxMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzEwIH0sCi0gIHsgInIxMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzExIH0sCi0gIHsgInIxMiIsIE5VTEwsIE9QRVJBTkRfR1BSKzEyIH0sCi0gIHsgInIxMi1yMTMiLCBOVUxMLCBPUEVSQU5EX0dQUisxMiB9LAotICB7ICJyMTMiLCBOVUxMLCBPUEVSQU5EX0dQUisxMyB9LAotICB7ICJyMTQiLCBOVUxMLCBPUEVSQU5EX0dQUisxNCB9LAotICB7ICJyMTQtcjE1IiwgTlVMTCwgT1BFUkFORF9HUFIrMTQgfSwKLSAgeyAicjE1IiwgInNwIiwgT1BFUkFORF9HUFIrMTUgfSwKLSAgeyAicjIiLCBOVUxMLCBPUEVSQU5EX0dQUisyIH0sCi0gIHsgInIyLXIzIiwgTlVMTCwgT1BFUkFORF9HUFIrMiB9LAotICB7ICJyMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzMgfSwKLSAgeyAicjQiLCBOVUxMLCBPUEVSQU5EX0dQUis0IH0sCi0gIHsgInI0LXI1IiwgTlVMTCwgT1BFUkFORF9HUFIrNCB9LAotICB7ICJyNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzUgfSwKLSAgeyAicjYiLCBOVUxMLCBPUEVSQU5EX0dQUis2IH0sCi0gIHsgInI2LXI3IiwgTlVMTCwgT1BFUkFORF9HUFIrNiB9LAotICB7ICJyNyIsIE5VTEwsIE9QRVJBTkRfR1BSKzcgfSwKLSAgeyAicjgiLCBOVUxMLCBPUEVSQU5EX0dQUis4IH0sCi0gIHsgInI4LXI5IiwgTlVMTCwgT1BFUkFORF9HUFIrOCB9LAotICB7ICJyOSIsIE5VTEwsIE9QRVJBTkRfR1BSKzkgfSwKLSAgeyAicnB0X2MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJycHRfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgInJwdF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAic3AiLCBOVUxMLCBPUEVSQU5EX0dQUisxNSB9LAotfTsKLQotaW50IAotZDEwdl9yZWdfbmFtZV9jbnQoKQotewotICByZXR1cm4gKHNpemVvZihkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSk7Ci19Ci0KLWNvbnN0IHN0cnVjdCBkMTB2X29wZXJhbmQgZDEwdl9vcGVyYW5kc1tdID0KLXsKLSNkZWZpbmUgVU5VU0VECSgwKQotICB7IDAsIDAsIDAgfSwKLSNkZWZpbmUgUlNSQwkoVU5VU0VEICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSRFNUCShSU1JDICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0RFU1R8T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQVNSQwkoUkRTVCArIDEpCi0gIHsgMSwgNCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBU1JDME9OTFkgKEFTUkMgKyAxKQotICB7IDEsIDQsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBRFNUCShBU1JDME9OTFkgKyAxKQotICB7IDEsIDgsIE9QRVJBTkRfREVTVHxPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJTUkNFCShBRFNUICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX0VWRU58T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUkRTVEUJKFJTUkNFICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0VWRU58T1BFUkFORF9ERVNUfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIE5VTTE2CShSRFNURSArIDEpCi0gIHsgMTYsIDAsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIE5VTTMJKE5VTTE2ICsgMSkJCQkvKiByYWMsIHJhY2hpICovCi0gIHsgMywgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8UkVTVFJJQ1RFRF9OVU0zIH0sCi0jZGVmaW5lIE5VTTQJKE5VTTMgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIFVOVU00CShOVU00ICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBVTlVNNFMJKFVOVU00ICsgMSkJCQkvKiBhZGRpLCBzbGxpLCBzcmFpLCBzcmxpLCBzdWJpICovCi0gIHsgNCwgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBVTlVNOAkoVU5VTTRTICsgMSkJCQkvKiByZXBpICovCi0gIHsgOCwgMTYsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFVOVU0xNgkoVU5VTTggKyAxKQkJCS8qIGNtcHVpICovCi0gIHsgMTYsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIEFOVU0xNgkoVU5VTTE2ICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9BRERSfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIEFOVU04CShBTlVNMTYgKyAxKQotICB7IDgsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBBU1JDMgkoQU5VTTggKyAxKQotICB7IDEsIDgsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQzIJKEFTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDMkUJKFJTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFR3xPUEVSQU5EX0VWRU4gfSwKLSNkZWZpbmUgQVNSQzAJKFJTUkMyRSArIDEpCi0gIHsgMSwgMCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBRFNUMAkoQVNSQzAgKyAxKQotICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEZGU1JDCShBRFNUMCArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIH0sCi0jZGVmaW5lIENGU1JDCShGRlNSQyArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0NGTEFHIH0sCi0jZGVmaW5lIEZEU1QJKENGU1JDICsgMSkKLSAgeyAxLCA1LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBBVFNJR04JKEZEU1QgKyAxKQotICB7IDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ1NSQwkoQVRNSU5VUyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA0LCAxLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDRFNUCShDU1JDICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDQsIDUsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAotfTsKLQotY29uc3Qgc3RydWN0IGQxMHZfb3Bjb2RlIGQxMHZfb3Bjb2Rlc1tdID0gewotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDYwNywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1NjA3LCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsIDB4MDIwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDEsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJhZGQydyIsIFNIT1JUXzIsIDIsIElVLCBQQVJ8V0NBUiwgMHgxMjAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAiYWRkMyIsIExPTkdfTCwgMSwgTVUsIFNFUXxXQ0FSLCAweDEwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgImFkZGkiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAgMHgyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAotICB7ICJhbmQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhjMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAiYW5kMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg2MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAiYmNscmkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGMwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYmwiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJsLnMiLCBTSE9SVF9CLCAzLCBNVSwgQUxPTkV8QlJBTkNIX0xJTkt8UEFSLCAweDQ5MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJsLmwiLCBMT05HX0IsIDMsIE1VLCBCUkFOQ0hfTElOS3xTRVEsIDB4MjQ4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYm5vdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGEwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnJhIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmEucyIsIFNIT1JUX0IsIDMsIE1VLCBBTE9ORXxCUkFOQ0h8UEFSLCAweDQ4MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyYS5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIfFNFUSwgMHgyNDAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJicmYwZiIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJmMGYucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmYwZi5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1MDAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJyZjB0IiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmYwdC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVJ8UkYwLCAweDRiMDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyZjB0LmwiLCBMT05HX0IsIDMsIE1VLCBTRVEsIDB4MjU4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnNldGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDgwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnRzdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHhlMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImNscmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NjAxLCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDE2MDMsIDB4N2VlZiwgeyBBU1JDMiwgQVNSQyB9IH0sCi0gIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wZXEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNDAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAotICB7ICJjbXBlcWkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImNtcGVxaS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKLSAgeyAiY21wZXFpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXBpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJjbXBpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAxLCAweDdlMDEsIHsgUlNSQzIsIE5VTTQgfSB9LAotICB7ICJjbXBpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXB1IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcHVpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIzMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBVTlVNMTYgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTBmLCAweDdmZGYsIHsgRkRTVCwgQ0ZTUkMgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTA5LCAweDdmZDksIHsgRkRTVCwgRkZTUkMgfSB9LAotICB7ICJkYnQiLCBTSE9SVF8yLCA1LCBNVSwgQUxPTkV8UEFSLCAweDVmMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZGl2cyIsIExPTkdfTCwgMSwgQk9USCwgU0VRLCAweDE0MDAyODAwLCAweDNmMTBmZTIxLCB7IFJEU1RFLCBSU1JDIH0gfSwKLSAgeyAiZXhlZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjB0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAwLCAweDNmZmZmZTAzLCB7IFJEU1QsIFJTUkNFIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAyLCAweDNmZmZmZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJqbCIsIFNIT1JUXzIsIDMsIE1VLCBBTE9ORXxCUkFOQ0hfTElOS3xQQVIsIDB4NGQwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAotICB7ICJqbXAiLCBTSE9SVF8yLCAzLCBNVSwgQUxPTkV8QlJBTkNIfFBBUiwgMHg0YzAwLCAweDdmZTEsIHsgUlNSQyB9IH0sCi0gIHsgImxkIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY0MDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjAwMSwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJsZCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMjAxMDAwMCwgMHgzZjBmMDAwMCwgeyBSRFNULCBBVFNJR04sIE5VTTE2IH0gfSwKLSAgeyAibGQydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSRFNURSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NjAxLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MjAwLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkMnciLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzMwMTAwMDAsIDB4M2YxZjAwMDAsIHsgUkRTVEUsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJsZGIiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzgwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGRiIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDcwMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJsZGkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImxkaS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8Uk1FTSwgMHg0MDAxLCAweDdlMDEgLCB7IFJEU1QsIE5VTTQgfSB9LAotICB7ICJsZGkubCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMDAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSRFNULCBOVU0xNiB9IH0sCi0gIHsgImxkdWIiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzkwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGR1YiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg3MjAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibWFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyYTAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibWFjc3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYWN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzYTAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MjYwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAwLCAweDdlZTMsIHsgQURTVCwgUlNSQ0UgfSB9LAotICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAyLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDI2MDEsIDB4N2UwMSAsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDEsIDB4N2VlMyAsIHsgQURTVCwgUlNSQ0UgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgIm1zYiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjgwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1zYnN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXNidSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzgwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm11bCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MmUwMCwgMHg3ZTAxICwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXVseCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MmMwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm11bHhzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWMwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm11bHh1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0MDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12MnciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDUwMDAsIDB4N2UyMywgeyBSRFNURSwgUlNSQ0UgfSB9LAotICB7ICJtdjJ3ZmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzZTAwLCAweDdlMmYsIHsgUkRTVEUsIEFTUkMgfSB9LAotICB7ICJtdjJ3dGFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzZTAxLCAweDdlZTMsIHsgUlNSQ0UsIEFEU1QgfSB9LAotICB7ICJtdmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzZTAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgIm12YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmYwZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJGMCwgMHg0NDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZjB0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8UkYwLCAweDQ0MDEsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmYWNnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTA0LCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDAsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYWNsbyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMiwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZjIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1MjAwLCAweDdlMDEsIHsgUkRTVCwgQ1NSQyB9IH0sCi0gIHsgIm12dGFjZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWU0MSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGFjbG8iLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMjEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NTYwMCwgMHg3ZTAxLCB7IFJTUkMsIENEU1QgfSB9LAotICB7ICJtdnViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NDAxLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm5lZyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQ2MDUsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAibmVnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NjA1LCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgIm5vcCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDVlMDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAibm90IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDYwMywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJvciIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDgwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJvcjMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NDAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIC8qIFNwZWNpYWwgY2FzZS4gc2FjJnNhY2hpIG11c3Qgb2NjdXIgYmVmb3JlIHJhYyZyYWNoaSBiZWNhdXNlIHRoZXkgaGF2ZQotICAgICBpbnRlcnNlY3RpbmcgbWFza3MhIFRoZSBtYXNrcyBmb3IgcmFjJnJhY2hpIHdpbGwgbWF0Y2ggc2FjJnNhY2hpIGJ1dAotICAgICBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuCi0gICAqLwotICB7ICJzYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMHxXRjAsIDB4NTIwOSwgMHg3ZTJmLCB7IFJEU1RFLCBBU1JDIH0gfSwKLSAgeyAic2FjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMHxXRjAsIDB4NDIwOSwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJyYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1MjAxLCAweDdlMjEsIHsgUkRTVEUsIEFTUkMwT05MWSwgTlVNMyB9IH0sCi0gIHsgInJhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NDIwMSwgMHg3ZTAxLCB7IFJEU1QsIEFTUkMsIE5VTTMgfSB9LAotICB7ICJyZXAiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MjcwMDAwMDAsIDB4M2ZmMDAwMDAsIHsgUlNSQywgQU5VTTE2IH0gfSwKLSAgeyAicmVwaSIsIExPTkdfTCwgMiwgTVUsIFNFUSwgMHgyZjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBVTlVNOCwgQU5VTTE2IH0gfSwKLSAgeyAicnRkIiwgU0hPUlRfMiwgMywgTVUsIEFMT05FfFBBUiwgMHg1ZjYwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInJ0ZSIsIFNIT1JUXzIsIDMsIE1VLCBBTE9ORXxQQVIsIDB4NWY0MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjIzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgInNldGYwZiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTEsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic2V0ZjB0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSRjAsIDB4NDYxMywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzbGFlIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjIwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNsZWVwIiwgU0hPUlRfMiwgMSwgTVUsIEFMT05FfFBBUiwgMHg1ZmMwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInNsbCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjIwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzbGwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic2xsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjIwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic2xsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNseCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwLCAweDQ2MGIsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic3JhIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyNDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInNyYSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzQwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzcmFpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyNDAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJzcmFpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzNDAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKLSAgeyAic3JsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInNybCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzAwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzcmxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMDAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJzcmxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMDAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKLSAgeyAic3J4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjAsIDB4NDYwOSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzdCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNDAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSU1JDMiwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NjgwMCwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YzFmLCAweDdlMWYsIHsgUlNSQzIsIEFUTUlOVVMsIFJTUkMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ODAxLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZjMDEsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgInN0IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM2MDEwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBBVFNJR04sIE5VTTE2IH0gfSwKLSAgeyAic3QydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSU1JDMkUsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmEwMCwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ZTFmLCAweDdlM2YsIHsgUlNSQzJFLCBBVE1JTlVTLCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAxLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJzdDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM3MDEwMDAwLCAweDNmMWYwMDAwLCB7IFJTUkMyRSwgQVRTSUdOLCBOVU0xNiB9IH0sCi0gIHsgInN0YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzYzAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSU1JDMiwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3RiIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDc4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3RvcCIsIFNIT1JUXzIsIDEsIE1VLCBBTE9ORXxQQVIsIDB4NWZlMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMDAxLCAweDdlZTMsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJzdWIydyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0NBUiwgMHgxMDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJzdWJhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJzdWJpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4MSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00UyB9IH0sCi0gIHsgInRyYXAiLCBTSE9SVF8yLCA1LCBNVSwgQUxPTkV8QlJBTkNIX0xJTkt8UEFSLCAweDVmMDAsIDB4N2ZlMSwgeyBVTlVNNCB9IH0sCi0gIHsgInRzdDBpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDcwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAidHN0MWkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4ZjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJ3YWl0IiwgU0hPUlRfMiwgMSwgTVUsIEFMT05FfFBBUiwgMHg1ZjgwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInhvciIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweGEwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJ4b3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDUwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIHsgMCB9IH0sCi19OwotCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1kaXMuYyBiL29wY29kZXMvZDMwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1MjAzNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDMwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2RlZmluZSBQQ19NQVNLIDB4RkZGRkZGRkYKLQotc3RhdGljIGludCBsb29rdXBfb3Bjb2RlIFBBUkFNUyAoKCBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBsb25nIG51bSwgaW50IGlzX2xvbmcgKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgYmZkX3ZtYSBtZW1hZGRyLCBsb25nIGxvbmcgbnVtLCAKLQkJCQkgc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgaW50IGlzX2xvbmcsIGludCBzaG93X2V4dCApKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF92YWx1ZSBQQVJBTVMgKCggbG9uZyBsb25nIG51bSwgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlciwgaW50IGlzX2xvbmcgKSk7Ci0KLWludCAKLXByaW50X2luc25fZDMwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1cywgcmVzdWx0OwotICBiZmRfYnl0ZSBidWZmZXJbMTJdOwotICB1bnNpZ25lZCBsb25nIGluMSxpbjI7Ci0gIHN0cnVjdCBkMzB2X2luc24gaW5zbjsKLSAgbG9uZyBsb25nIG51bTsKLQotICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKLQotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW4xID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyKzQsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgKGxvbmcgbG9uZykgaW4xLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIHJldHVybiA0OyAgICAgIAotICAgIH0KLSAgaW4yID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgCi0gIGlmIChpbjEgJiBpbjIgJiBGTTAxKQotICAgIHsKLSAgICAgIC8qIExPTkcgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMSkpKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgsMHgleCIsaW4xLGluMik7Ci0JICByZXR1cm4gODsKLQl9Ci0gICAgICBudW0gPSAobG9uZyBsb25nKWluMSA8PCAzMiB8IGluMjsKLSAgICAgIHByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMSwgcmVzdWx0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudW0gPSBpbjE7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIAotICAgICAgc3dpdGNoICggKChpbjE+PjMxKTw8MSkgfCAoaW4yPj4zMSkgKQotCXsKLQljYXNlIDA6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ8LVx0Iik7ICAgCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7Ci0gICAgICBudW0gPSBpbjI7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjIsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjIpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLQotICAgIH0KLSAgcmV0dXJuIDg7Ci19Ci0KLQotLyogcmV0dXJucyAwIGlmIGxvb2t1cCBmYWlscyAqLwotLyogMSBpZiBmb3VuZCBhbmQgb25seSBvbmUgZm9ybSAqLwotLyogMiBpZiBmb3VuZCBhbmQgdGhlcmUgYXJlIHNob3J0IGFuZCBsb25nIGZvcm1zICovCi1zdGF0aWMgaW50Ci1sb29rdXBfb3Bjb2RlIChpbnNuLCBudW0sIGlzX2xvbmcpCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGxvbmcgbnVtOwotICAgICBpbnQgaXNfbG9uZzsKLXsKLSAgaW50IGk9MCwgaW5kZXg7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKilkMzB2X29wY29kZV90YWJsZTsKLSAgaW50IG9wMSA9IChudW0gPj4gMjUpICYgMHg3OwotICBpbnQgb3AyID0gKG51bSA+PiAyMCkgJiAweDFmOwotICBpbnQgbW9kID0gKG51bSA+PiAxOCkgJiAweDM7Ci0KLSAgLyogZmluZCB0aGUgb3Bjb2RlICovCi0gIGRvIHsKLSAgICBpZiAoKG9wLT5vcDEgPT0gb3AxKSAmJiAob3AtPm9wMiA9PSBvcDIpKQotICAgICAgYnJlYWs7Ci0gICAgb3ArKzsKLSAgfSB3aGlsZSAob3AtPm5hbWUpOwotCi0gIGlmICghb3AgfHwgIW9wLT5uYW1lKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChvcC0+b3AxID09IG9wMSAmJiBvcC0+b3AyID09IG9wMikKLSAgICB7Ci0gICAgICAvKiBzY2FuIHRocm91Z2ggYWxsIHRoZSBmb3JtYXRzIGZvciB0aGUgb3Bjb2RlICAqLwotICAgICAgaW5kZXggPSBvcC0+Zm9ybWF0W2krK107Ci0gICAgICBkbyAKLQl7Ci0JICBmID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07Ci0JICB3aGlsZSAoZi0+Zm9ybSA9PSBpbmRleCkKLQkgICAgewotCSAgICAgIGlmICgoIWlzX2xvbmcgfHwgZi0+Zm9ybSA+PSBMT05HKSAmJiAoZi0+bW9kaWZpZXIgPT0gbW9kKSkKLQkJewotCQkgIGluc24tPmZvcm0gPSBmOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZisrOwotCSAgICB9Ci0JICBpZiAoaW5zbi0+Zm9ybSkKLQkgICAgYnJlYWs7Ci0JfSB3aGlsZSAoKGluZGV4ID0gb3AtPmZvcm1hdFtpKytdKSAhPSAwKTsKLSAgICAgIGlmIChpbnNuLT5mb3JtKQotCWJyZWFrOwotICAgICAgb3ArKzsKLSAgICAgIGk9MDsKLSAgICB9Ci0gIGlmIChpbnNuLT5mb3JtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW5zbi0+b3AgPSBvcDsKLSAgaW5zbi0+ZWNjID0gKG51bSA+PiAyOCkgJiAweDc7Ci0gIGlmIChvcC0+Zm9ybWF0WzFdKQotICAgIHJldHVybiAyOwotICBlbHNlCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQgCi1wcmludF9pbnNuICggaW5mbywgbWVtYWRkciwgbnVtLCBpbnNuLCBpc19sb25nLCBzaG93X2V4dCApCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGxvbmcgbG9uZyBudW07Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGludCBpc19sb25nOwotICAgICBpbnQgc2hvd19leHQ7Ci17Ci0gIGludCB2YWwsIG9wbnVtLCBuZWVkX2NvbW1hPTA7Ci0gIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBpLCBtYXRjaCwgb3BpbmQ9MCwgbmVlZF9wYXJlbj0wLCBmb3VuZF9jb250cm9sPTA7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsaW5zbi0+b3AtPm5hbWUpOwotCi0gIC8qIGNoZWNrIGZvciBDTVAgb3IgQ01QVSAqLwotICBpZiAoZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXS5mbGFncyAmIE9QRVJBTkRfTkFNRSkKLSAgICB7Ci0gICAgICBvcGluZCsrOwotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXSxpc19sb25nKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQzMHZfY2NfbmFtZXNbdmFsXSk7Ci0gICAgfQotCi0gIC8qIGFkZCBpbiAiLnMiIG9yICIubCIgKi8KLSAgaWYgKHNob3dfZXh0ID09IDIpCi0gICAgewotICAgICAgaWYgKGlzX2xvbmcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLnMiKTsKLSAgICB9Ci0KLSAgaWYgKGluc24tPmVjYykKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8lcyIsZDMwdl9lY2NfbmFtZXNbaW5zbi0+ZWNjXSk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gIHdoaWxlICgob3BudW0gPSBpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZCsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgYml0czsKLSAgICAgIG9wZXIgPSAoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbb3BudW1dOwotICAgICAgYml0cyA9IG9wZXItPmJpdHM7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCWJpdHMgKz0gMzsKLQotICAgICAgaWYgKG5lZWRfY29tbWEgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmIG9wZXItPmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JewotCSAgbmVlZF9jb21tYT0wOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRNSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAtIik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9NSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1BMVVMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFNJR04pCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7ICAgCi0JICBuZWVkX3BhcmVuID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfU1BFQ0lBTCkKLQljb250aW51ZTsKLQotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sIG9wZXIsIGlzX2xvbmcpOwotICAgICAgCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICBtYXRjaCA9IDA7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyMyA9IAotCQkoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMl1dOwkgICAgICAKLQkgICAgICBpbnQgaWQgPSBleHRyYWN0X3ZhbHVlIChudW0sIG9wZXIzLCBpc19sb25nICk7Ci0JICAgICAgZm91bmRfY29udHJvbCA9IDE7Ci0JICAgICAgc3dpdGNoICggaWQgKQotCQl7Ci0JCWNhc2UgMDoKLQkJICB2YWwgfD0gT1BFUkFORF9DT05UUk9MOwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJICB2YWwgPSBPUEVSQU5EX0NPTlRST0wgKyBNQVhfQ09OVFJPTF9SRUcgKyBpZDsKLQkJICBicmVhazsKLQkJY2FzZSAzOgotCQkgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZihzdGRlcnIsImlsbGVnYWwgaWQgKCVkKVxuIixpZCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkgICAgdmFsIHw9IE9QRVJBTkRfQUNDOwotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JICAgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JICBmb3IgKGk9MDtpPHJlZ19uYW1lX2NudCgpO2krKykKLQkgICAgewotCSAgICAgIGlmICh2YWwgPT0gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCQl7Ci0JCSAgaWYgKHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoaW5mby0+c3RyZWFtLCAiJXMiLHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCQkgIG1hdGNoPTE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG1hdGNoPT0wKQotCSAgICB7Ci0JICAgICAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCQkgcmVnaXN0ZXIgdGFibGUgKi8KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJKGluZm8tPnN0cmVhbSwgXygiPHVua25vd24gcmVnaXN0ZXIgJWQ+IiksIHZhbCAmIDB4M0YpOwkgICAgICAKLQkgICAgfQotCX0KLSAgICAgIC8qIHJlcGVhdGkgaGFzIGEgcmVsb2NhdGlvbiwgYnV0IGl0cyBmaXJzdCBhcmd1bWVudCBpcyBhIHBsYWluCi0JIGltbWVkaWF0ZS4gIE9UT0ggaW5zdHJ1Y3Rpb25zIGxpa2UgZGpzcmkgaGF2ZSBhIHBjLXJlbGF0aXZlCi0JIGRlbGF5IHRhcmdldCwgYnV0IGEgYWJzb2x1dGUganVtcCB0YXJnZXQuICBUaGVyZWZvcmUsIGEgdGVzdAotCSBvZiBpbnNuLT5vcC0+cmVsb2NfZmxhZyBpcyBub3Qgc3BlY2lmaWMgZW5vdWdoOyB3ZSBtdXN0IHRlc3QKLQkgaWYgdGhlIGFjdHVhbCBvcGVyYW5kIHdlIGFyZSBoYW5kbGluZyBub3cgaXMgcGMtcmVsYXRpdmUuICAqLwotICAgICAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1BDUkVMKQotCXsKLQkgIGludCBuZWcgPSAwOwotCSAgCi0JICAvKiBJTU02UzMgaXMgdW5zaWduZWQuICAqLwotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQgfHwgYml0cyA9PSAzMikKLQkgICAgewotCSAgICAgIGxvbmcgbWF4OwotCSAgICAgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOwotCSAgICAgIGlmICh2YWwgJiBtYXgpCi0JCXsKLQkJICBpZiAoYml0cyA9PSAzMikKLQkJICAgIHZhbCA9IC12YWw7Ci0JCSAgZWxzZQotCQkgICAgdmFsID0gLXZhbCAmICgoMSA8PCBiaXRzKS0xKTsKLQkJICBuZWcgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGlmIChuZWcpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0leFx0KCIsdmFsKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyIC0gdmFsKSAmIFBDX01BU0ssIGluZm8pOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4XHQoIix2YWwpOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyB2YWwpICYgUENfTUFTSywgaW5mbyk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLT5vcC0+cmVsb2NfZmxhZyA9PSBSRUxPQ19BQlMpCi0JewotCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBtYXggPSAoMSA8PCAoYml0cyAtIDEpKTsKLQkgICAgICBpZiAodmFsICYgbWF4KQotCQl7Ci0JCSAgdmFsID0gLXZhbDsKLQkJICBpZiAoYml0cyA8IDMyKQotCQkgICAgdmFsICY9ICgoMSA8PCBiaXRzKSAtIDEpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOwotCQl9Ci0JICAgIH0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsdmFsKTsKLQl9Ci0gICAgICAvKiBpZiB0aGVyZSBpcyBhbm90aGVyIG9wZXJhbmQsIHRoZW4gd3JpdGUgYSBjb21tYSBhbmQgc3BhY2UgKi8KLSAgICAgIGlmIChpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZF0gJiYgIShmb3VuZF9jb250cm9sICYmIG9waW5kID09IDIpKQotCW5lZWRfY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci19Ci0KLQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3ZhbHVlIChudW0sIG9wZXIsIGlzX2xvbmcpCi0gICAgIGxvbmcgbG9uZyBudW07Ci0gICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7Ci0gICAgIGludCBpc19sb25nOwotewotICBpbnQgdmFsOwotICBpbnQgc2hpZnQgPSAxMiAtIG9wZXItPnBvc2l0aW9uOwotICBpbnQgbWFzayA9ICgweEZGRkZGRkZGID4+ICgzMiAtIG9wZXItPmJpdHMpKTsKLQotICBpZiAoaXNfbG9uZykKLSAgICB7Ci0gICAgICBpZiAob3Blci0+Yml0cyA9PSAzMikgCi0JewotCSAgLyogcGllY2UgdG9nZXRoZXIgMzItYml0IGNvbnN0YW50ICovCi0JICB2YWwgPSAoKG51bSAmIDB4M0ZGRkYpCi0JCSB8ICgobnVtICYgMHhGRjAwMDAwKSA+PiAyKQotCQkgfCAoKG51bSAmIDB4M0YwMDAwMDAwMExMKSA+PiA2KSk7Ci0JfQotICAgICAgZWxzZQkKLQl2YWwgPSAobnVtID4+ICgzMiArIHNoaWZ0KSkgJiBtYXNrOwkKLSAgICB9Ci0gIGVsc2UKLSAgICB2YWwgPSAobnVtID4+IHNoaWZ0KSAmIG1hc2s7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB2YWwgPDw9IDM7Ci0KLSAgcmV0dXJuIHZhbDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1vcGMuYyBiL29wY29kZXMvZDMwdi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjYzE1Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyogZDMwdi1vcGMuYyAtLSBEMzBWIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIgotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gKi8KLS8qIElmIHlvdSBhZGQgYW55dGhpbmcsIGl0IE1VU1QgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyICovCi0vKiBUaGUgZmlyc3QgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGFzc2VtYmxlciB1c2VzIHdoZW4gbG9va2luZyAqLwotLyogdXAgb3Jjb2Rlcy4gIFRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIHVzZS4gKi8KLS8qIFRoaXMgYWxsb3dzIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgcmVmZXJlbmNlcyB0byByNjMgKGZvciBleGFtcGxlKSAqLwotLyogb3IgInNwIi4gIFRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgdXNlIHRoZSBwcmVmZXJyZWQgZm9ybSAoc3ApICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQyswIH0sCi0gIHsgImExIiwgTlVMTCwgT1BFUkFORF9BQ0MrMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiY3IwIiwgInBzdyIsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJjcjEiLCAiYnBzdyIsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImNyMTAiLCAibW9kX3MiLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAiY3IxMSIsICJtb2RfZSIsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJjcjEyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEyIH0sCi0gIHsgImNyMTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTMgfSwKLSAgeyAiY3IxNCIsICJpYmEiLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiY3IxNSIsICJlaXRfdmIiLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IxNiIsICJpbnRfcyIsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAotICB7ICJjcjE3IiwgImludF9tIiwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImNyMTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTggfSwKLSAgeyAiY3IxOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxOSB9LAotICB7ICJjcjIiLCAicGMiLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJjcjIwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIwIH0sCi0gIHsgImNyMjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjEgfSwKLSAgeyAiY3IyMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMiB9LAotICB7ICJjcjIzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIzIH0sCi0gIHsgImNyMjQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjQgfSwKLSAgeyAiY3IyNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNSB9LAotICB7ICJjcjI2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI2IH0sCi0gIHsgImNyMjciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjcgfSwKLSAgeyAiY3IyOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOCB9LAotICB7ICJjcjI5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI5IH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjMwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMwIH0sCi0gIHsgImNyMzEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzEgfSwKLSAgeyAiY3IzMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMiB9LAotICB7ICJjcjMzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMzIH0sCi0gIHsgImNyMzQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzQgfSwKLSAgeyAiY3IzNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNSB9LAotICB7ICJjcjM2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM2IH0sCi0gIHsgImNyMzciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzcgfSwKLSAgeyAiY3IzOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOCB9LAotICB7ICJjcjM5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM5IH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I0MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MCB9LAotICB7ICJjcjQxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQxIH0sCi0gIHsgImNyNDIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDIgfSwKLSAgeyAiY3I0MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MyB9LAotICB7ICJjcjQ0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ0IH0sCi0gIHsgImNyNDUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDUgfSwKLSAgeyAiY3I0NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NiB9LAotICB7ICJjcjQ3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ3IH0sCi0gIHsgImNyNDgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDggfSwKLSAgeyAiY3I0OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0OSB9LAotICB7ICJjcjUiLCJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjUwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUwIH0sCi0gIHsgImNyNTEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTEgfSwKLSAgeyAiY3I1MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MiB9LAotICB7ICJjcjUzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUzIH0sCi0gIHsgImNyNTQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTQgfSwKLSAgeyAiY3I1NSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NSB9LAotICB7ICJjcjU2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU2IH0sCi0gIHsgImNyNTciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTcgfSwKLSAgeyAiY3I1OCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OCB9LAotICB7ICJjcjU5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU5IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNjAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjAgfSwKLSAgeyAiY3I2MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MSB9LAotICB7ICJjcjYyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYyIH0sCi0gIHsgImNyNjMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjMgfSwKLSAgeyAiY3I3IiwgInJwdF9jIiwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAiY3I4IiwgInJwdF9zIiwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAiY3I5IiwgInJwdF9lIiwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAiZHBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiZHBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImVpdF92YiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkxBRyswIH0sCi0gIHsgImYxIiwgTlVMTCwgT1BFUkFORF9GTEFHKzEgfSwKLSAgeyAiZjIiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMiB9LAotICB7ICJmMyIsIE5VTEwsIE9QRVJBTkRfRkxBRyszIH0sCi0gIHsgImY0IiwgInMiLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJmNSIsICJ2IiwgT1BFUkFORF9GTEFHKzUgfSwKLSAgeyAiZjYiLCAidmEiLCBPUEVSQU5EX0ZMQUcrNiB9LAotICB7ICJmNyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImludF9tIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImludF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE2IH0sCi0gIHsgImxpbmsiLCAicjYyIiwgNjIgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAicHN3aCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMiB9LAotICB7ICJwc3dsIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysxIH0sCi0gIHsgInIwIiwgTlVMTCwgMCB9LAotICB7ICJyMSIsIE5VTEwsIDEgfSwKLSAgeyAicjEwIiwgTlVMTCwgMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgMTQgfSwKLSAgeyAicjE1IiwgTlVMTCwgMTUgfSwKLSAgeyAicjE2IiwgTlVMTCwgMTYgfSwKLSAgeyAicjE3IiwgTlVMTCwgMTcgfSwKLSAgeyAicjE4IiwgTlVMTCwgMTggfSwKLSAgeyAicjE5IiwgTlVMTCwgMTkgfSwKLSAgeyAicjIiLCBOVUxMLCAyIH0sCi0gIHsgInIyMCIsIE5VTEwsIDIwIH0sCi0gIHsgInIyMSIsIE5VTEwsIDIxIH0sCi0gIHsgInIyMiIsIE5VTEwsIDIyIH0sCi0gIHsgInIyMyIsIE5VTEwsIDIzIH0sCi0gIHsgInIyNCIsIE5VTEwsIDI0IH0sCi0gIHsgInIyNSIsIE5VTEwsIDI1IH0sCi0gIHsgInIyNiIsIE5VTEwsIDI2IH0sCi0gIHsgInIyNyIsIE5VTEwsIDI3IH0sCi0gIHsgInIyOCIsIE5VTEwsIDI4IH0sCi0gIHsgInIyOSIsIE5VTEwsIDI5IH0sCi0gIHsgInIzIiwgTlVMTCwgMyB9LAotICB7ICJyMzAiLCBOVUxMLCAzMCB9LAotICB7ICJyMzEiLCBOVUxMLCAzMSB9LAotICB7ICJyMzIiLCBOVUxMLCAzMiB9LAotICB7ICJyMzMiLCBOVUxMLCAzMyB9LAotICB7ICJyMzQiLCBOVUxMLCAzNCB9LAotICB7ICJyMzUiLCBOVUxMLCAzNSB9LAotICB7ICJyMzYiLCBOVUxMLCAzNiB9LAotICB7ICJyMzciLCBOVUxMLCAzNyB9LAotICB7ICJyMzgiLCBOVUxMLCAzOCB9LAotICB7ICJyMzkiLCBOVUxMLCAzOSB9LAotICB7ICJyNCIsIE5VTEwsIDQgfSwKLSAgeyAicjQwIiwgTlVMTCwgNDAgfSwKLSAgeyAicjQxIiwgTlVMTCwgNDEgfSwKLSAgeyAicjQyIiwgTlVMTCwgNDIgfSwKLSAgeyAicjQzIiwgTlVMTCwgNDMgfSwKLSAgeyAicjQ0IiwgTlVMTCwgNDQgfSwKLSAgeyAicjQ1IiwgTlVMTCwgNDUgfSwKLSAgeyAicjQ2IiwgTlVMTCwgNDYgfSwKLSAgeyAicjQ3IiwgTlVMTCwgNDcgfSwKLSAgeyAicjQ4IiwgTlVMTCwgNDggfSwKLSAgeyAicjQ5IiwgTlVMTCwgNDkgfSwKLSAgeyAicjUiLCBOVUxMLCA1IH0sCi0gIHsgInI1MCIsIE5VTEwsIDUwIH0sCi0gIHsgInI1MSIsIE5VTEwsIDUxIH0sCi0gIHsgInI1MiIsIE5VTEwsIDUyIH0sCi0gIHsgInI1MyIsIE5VTEwsIDUzIH0sCi0gIHsgInI1NCIsIE5VTEwsIDU0IH0sCi0gIHsgInI1NSIsIE5VTEwsIDU1IH0sCi0gIHsgInI1NiIsIE5VTEwsIDU2IH0sCi0gIHsgInI1NyIsIE5VTEwsIDU3IH0sCi0gIHsgInI1OCIsIE5VTEwsIDU4IH0sCi0gIHsgInI1OSIsIE5VTEwsIDU5IH0sCi0gIHsgInI2IiwgTlVMTCwgNiB9LAotICB7ICJyNjAiLCBOVUxMLCA2MCB9LAotICB7ICJyNjEiLCBOVUxMLCA2MSB9LAotICB7ICJyNjIiLCAibGluayIsIDYyIH0sCi0gIHsgInI2MyIsICJzcCIsIDYzIH0sCi0gIHsgInI3IiwgTlVMTCwgNyB9LAotICB7ICJyOCIsIE5VTEwsIDggfSwKLSAgeyAicjkiLCBOVUxMLCA5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJzcCIsIE5VTEwsIDYzIH0sCi0gIHsgInYiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNSB9LAotICB7ICJ2YSIsIE5VTEwsIE9QRVJBTkRfRkxBRys2IH0sCi19OwotCi1pbnQgCi1yZWdfbmFtZV9jbnQoKQotewotICByZXR1cm4gKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotLyogT1BDT0RFIFRBQkxFICovCi0vKiBUaGUgZm9ybWF0IG9mIHRoaXMgdGFibGUgaXMgZGVmaW5lZCBpbiBvcGNvZGUvZDMwdi5oICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGNvZGUgZDMwdl9vcGNvZGVfdGFibGVbXSA9IHsKLSAgeyAiYWJzIiwgSUFMVTEsIDB4OCwgeyBTSE9SVF9VIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGQiLCBJQUxVMSwgMHgwLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGQyaCIsIElBTFUxLCAweDEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGRjIiwgSUFMVTEsIDB4NCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxsbCIsIElBTFUxLCAweDEwLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsbGgiLCBJQUxVMSwgMHgxMSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGhsIiwgSUFMVTEsIDB4MTIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxoaCIsIElBTFUxLCAweDEzLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhobGwiLCBJQUxVMSwgMHgxNCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGxoIiwgSUFMVTEsIDB4MTUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhobCIsIElBTFUxLCAweDE2LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhoaGgiLCBJQUxVMSwgMHgxNywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRzIiwgSUFMVTEsIDB4NiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZHMyaCIsIElBTFUxLCAweDcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kIiwgTE9HSUMsIDB4MTgsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kZmciLCBMT0dJQywgMHg4LCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImF2ZyIsIElBTFUxLCAweGEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhdmcyaCIsIElBTFUxLCAweGIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJiY2xyIiwgTE9HSUMsIDB4MywgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJub3QiLCBMT0dJQywgMHgxLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnJhIiwgQlJBLCAwLCB7IFNIT1JUX0IxLCBTSE9SVF9CMnIsIExPTkdfVXIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0bnoiLCBCUkEsIDB4NCwgeyBTSE9SVF9CM2JyLCBMT05HXzJiciB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJyYXR6ciIsIEJSQSwgMHg0LCB7IFNIT1JUX0IzciwgTE9OR18yciB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzZXQiLCBMT0dJQywgMHgyLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnNyIiwgQlJBLCAweDIsIHsgU0hPUlRfQjEsIFNIT1JUX0IyciwgTE9OR19VciB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnRueiIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzYnIsIExPTkdfMmJyIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnNydHpyIiwgQlJBLCAweDYsIHsgU0hPUlRfQjNyLCBMT05HXzJyIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnRzdCIsIExPR0lDLCAwLCB7IFNIT1JUX0FGIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImNtcCIsIExPR0lDLCAweEMsIHsgU0hPUlRfQ01QLCBMT05HX0NNUCB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiY21wdSIsIExPR0lDLCAweEQsIHsgU0hPUlRfQ01QVSwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImRicmEiLCBCUkEsIDB4MTAsIHsgU0hPUlRfQjNyLCBMT05HXzJyIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRicmFpIiwgQlJBLCAweDE0LCB7IFNIT1JUX0QyciwgTE9OR19EciB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnNyIiwgQlJBLCAweDEyLCB7IFNIT1JUX0IzciwgTE9OR18yciB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnNyaSIsIEJSQSwgMHgxNiwgeyBTSE9SVF9EMnIsIExPTkdfRHIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJ0IiwgQlJBLCAweGIsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19KU1IsIEZMQUdfTEtSLCAwIH0sCi0gIHsgImRqbXAiLCBCUkEsIDB4MTEsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGptcGkiLCBCUkEsIDB4MTUsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzciIsIEJSQSwgMHgxMywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJkanNyaSIsIEJSQSwgMHgxNywgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXAiLCBCUkEsIDB4MSwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXB0bnoiLCBCUkEsIDB4NSwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdHpyIiwgQlJBLCAweDUsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqb2lubGwiLCBJQUxVMSwgMHhDLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5saCIsIElBTFUxLCAweEQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhsIiwgSUFMVTEsIDB4RSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2luaGgiLCBJQUxVMSwgMHhGLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpzciIsIEJSQSwgMHgzLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImpzcnRueiIsIEJSQSwgMHg3LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0enIiLCBCUkEsIDB4NywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImxkMmgiLCBJTUVNLCAweDMsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkMnciLCBJTUVNLCAweDYsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAibGQ0YmgiLCBJTUVNLCAweDUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAibGQ0Ymh1IiwgSU1FTSwgMHhkLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGIiLCBJTUVNLCAwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRidSIsIElNRU0sIDB4OSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaCIsIElNRU0sIDB4MiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaGgiLCBJTUVNLCAweDEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGh1IiwgSU1FTSwgMHhhLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGR3IiwgSU1FTSwgMHg0LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibWFjMCIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjMSIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hY3MwIiwgSUFMVTIsIDB4MTUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWNzMSIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1vZGRlYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RERUMgfSwgTVUsIDAsIDAsIDAgfSwKLSAgeyAibW9kaW5jIiwgSU1FTSwgMHg3LCB7IFNIT1JUX01PRElOQyB9LCBNVSwgMCwgMCwgMCB9LAotICB7ICJtc3ViMCIsIElBTFUyLCAweDE2LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YjEiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViczAiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWJzMSIsIElBTFUyLCAweDE3LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bCIsIElBTFUyLCAweDEwLCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVsMmgiLCBJQUxVMiwgMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4bGwiLCBJQUxVMiwgMHg0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhsaCIsIElBTFUyLCAweDUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGhsIiwgSUFMVTIsIDB4NiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4aGgiLCBJQUxVMiwgMHg3LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVseCIsIElBTFUyLCAweDE4LCB7IFNIT1JUX0FBIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bHgyaCIsIElBTFUyLCAweDEsIHsgU0hPUlRfQTIgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVseHMiLCBJQUxVMiwgMHgxOSwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdmZhY2MiLCBJQUxVMiwgMHgxZiwgeyBTSE9SVF9SQSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJtdmZzeXMiLCBCUkEsIDB4MWUsIHsgU0hPUlRfQzEgfSwgTVUsIEZMQUdfQUxMLCBGTEFHX0FMTCwgMCB9LAotICB7ICJtdnRhY2MiLCBJQUxVMiwgMHhmLCB7IFNIT1JUX0FSIH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgIm12dHN5cyIsIEJSQSwgMHhlLCB7IFNIT1JUX0MyIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKLSAgeyAibm9wIiwgQlJBLCAweEYsIHsgU0hPUlRfTk9ORSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAibm90IiwgTE9HSUMsIDB4MTksIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAibm90ZmciLCBMT0dJQywgMHg5LCB7IFNIT1JUX1VGIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJvciIsIExPR0lDLCAweDFhLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm9yZmciLCBMT0dJQywgMHhhLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJlaXQiLCBCUkEsIDB4OCwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX1NNIHwgRkxBR19KTVAsIEZMQUdfU00gfCBGTEFHX0xLUiwgMCB9LAotICB7ICJyZXBlYXQiLCBCUkEsIDB4MTgsIHsgU0hPUlRfRDFyLCBMT05HXzJyIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyZXBlYXRpIiwgQlJBLCAweDFhLCB7IFNIT1JUX0QyQnIsIExPTkdfRGJyIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyb3QiLCBMT0dJQywgMHgxNCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyb3QyaCIsIExPR0lDLCAweDE1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJ0ZCIsIEJSQSwgMHhhLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSk1QLCBGTEFHX0xLUiwgMCB9LAotICB7ICJzYXQiLCBJQUxVMiwgMHg4LCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNhdDJoIiwgSUFMVTIsIDB4OSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXRobCIsIElBTFUyLCAweDFjLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXRoaCIsIElBTFUyLCAweDFkLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXR6IiwgSUFMVTIsIDB4YSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXR6MmgiLCBJQUxVMiwgMHhiLCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNyYSIsIExPR0lDLCAweDEwLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYTJoIiwgTE9HSUMsIDB4MTEsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JhaGgiLCBMT0dJQywgMHg1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhsIiwgTE9HSUMsIDB4NCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmMiLCBMT0dJQywgMHgxNiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic3JsIiwgTE9HSUMsIDB4MTIsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsMmgiLCBMT0dJQywgMHgxMywgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmxoaCIsIExPR0lDLCAweDcsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGwiLCBMT0dJQywgMHg2LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN0MmgiLCBJTUVNLCAweDEzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwIH0sCi0gIHsgInN0MnciLCBJTUVNLCAweDE2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwIH0sCi0gIHsgInN0NGhiIiwgSU1FTSwgMHgxNSwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCwgMCB9LAotICB7ICJzdGIiLCBJTUVNLCAweDEwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCwgMCB9LAotICB7ICJzdGgiLCBJTUVNLCAweDEyLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCwgMCB9LAotICB7ICJzdGhoIiwgSU1FTSwgMHgxMSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAgfSwKLSAgeyAic3R3IiwgSU1FTSwgMHgxNCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAgfSwKLSAgeyAic3ViIiwgSUFMVTEsIDB4MiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViMmgiLCBJQUxVMSwgMHgzLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3ViYiIsIElBTFUxLCAweDUsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsbCIsIElBTFUxLCAweDE4LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsaCIsIElBTFUxLCAweDE5LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxobCIsIElBTFUxLCAweDFhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxoaCIsIElBTFUxLCAweDFiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsbCIsIElBTFUxLCAweDFjLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsaCIsIElBTFUxLCAweDFkLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhobCIsIElBTFUxLCAweDFlLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhoaCIsIElBTFUxLCAweDFmLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAidHJhcCIsIEJSQSwgMHg5LCB7IFNIT1JUX0IxLCBTSE9SVF9UfSwgTVUsIEZMQUdfSlNSLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAieG9yIiwgTE9HSUMsIDB4MWIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAieG9yZmciLCBMT0dJQywgMHhiLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCwgeyAwIH0sIDAsIDAsIDAsIDAgfSwKLX07Ci0KLQotLyogbm93IGRlZmluZSB0aGUgb3BlcmFuZCB0eXBlcyAqLwotLyogZm9ybWF0IGlzIGxlbmd0aCwgYml0cywgcG9zaXRpb24sIGZsYWdzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGVyYW5kIGQzMHZfb3BlcmFuZF90YWJsZVtdID0KLXsKLSNkZWZpbmUgVU5VU0VECSgwKQotICB7IDAsIDAsIDAsIDAgfSwKLSNkZWZpbmUgUmEJKFVOVVNFRCArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIFJhMgkoUmEgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVHxPUEVSQU5EXzJSRUcgfSwKLSNkZWZpbmUgUmEzCShSYTIgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJiCShSYTMgKyAxKQotICB7IDYsIDYsIDYsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJjCShSYiArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFhCShSYyArIDEpCi0gIHsgNiwgMSwgMCwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEFiCShBYSArIDEpCi0gIHsgNiwgMSwgNiwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgSU1NNQkoQWIgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU01VSAoSU1NNSArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sIC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIElNTTVTMyAgICAgICAgKElNTTVVICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwgLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgSU1NNiAgKElNTTVTMyArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIElNTTZVIChJTU02ICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU02VTIgICAgICAgIChJTU02VSArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFJFTDZTMyAgICAgICAgKElNTTZVMiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVHxPUEVSQU5EX1BDUkVMIH0sCi0jZGVmaW5lIFJFTDEyUzMgICAgICAgKFJFTDZTMyArIDEpCi0gIHsgMTIsIDEyLCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVHxPUEVSQU5EX1BDUkVMIH0sCi0jZGVmaW5lIElNTTEyUzMgICAgICAgKFJFTDEyUzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgUkVMMThTMyAgICAgICAoSU1NMTJTMyArIDEpCi0gIHsgMTgsIDE4LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVHxPUEVSQU5EX1BDUkVMIH0sCi0jZGVmaW5lIElNTTE4UzMgICAgICAgKFJFTDE4UzMgKyAxKQotICB7IDE4LCAxOCwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgUkVMMzIgKElNTTE4UzMgKyAxKQotICB7IDMyLCAzMiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9QQ1JFTCB9LAotI2RlZmluZSBJTU0zMiAoUkVMMzIgKyAxKQotICB7IDMyLCAzMiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgRmEJKElNTTMyICsgMSkKLSAgeyA2LCAzLCAwLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB8IE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBGYgkoRmEgKyAxKQotICB7IDYsIDMsIDYsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEZjCShGYiArIDEpCi0gIHsgNiwgMywgMTIsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEFUU0lHTgkoRmMgKyAxKQotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ2EJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIENiCShDYSArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDQwkoQ2IgKyAxKQkvKiBjb25kaXRpb24gY29kZSAoQ01QY2MgYW5kIENNUFVjYykgKi8KLSAgeyAzLCAzLCAtMywgT1BFUkFORF9OQU1FfSwKLSNkZWZpbmUgRmEyCShDQyArIDEpCS8qIGZsYWcgcmVnaXN0ZXIgKENNUGNjIGFuZCBDTVBVY2MpICovCi0gIHsgMywgMywgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9GTEFHfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIEZha2UJKEZhMiArIDEpCS8qIHBsYWNlIGhvbGRlciBmb3IgImlkIiBmaWVsZCBpbiBtdmZzeXMgYW5kIG12dHN5cyAqLwotICB7IDYsIDIsIDEyLCBPUEVSQU5EX1NQRUNJQUx9LAotfTsKLQotLyogbm93IHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXSA9Ci17Ci0gIHsgMCwgMCwgeyAwIH0gfSwKLSAgeyBTSE9SVF9NLCAwLCB7IFJhLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NLCAxLCB7IFJhLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwJLyogUmEsQChSYissUmMpICovCi0gIHsgU0hPUlRfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00sIDMsIHsgUmEsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwJLyogUmEsQChSYi0sUmMpICovCi0gIHsgU0hPUlRfTTIsIDAsIHsgUmEyLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NMiwgMSwgeyBSYTIsIEFUUEFSLCBSYiwgUExVUywgUmMgfSB9LC8qIFJhLEAoUmIrLFJjKSAqLwotICB7IFNIT1JUX00yLCAyLCB7IFJhMiwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00yLCAzLCB7IFJhMiwgQVRQQVIsIFJiLCBNSU5VUywgUmMgfSB9LC8qIFJhLEAoUmItLFJjKSAqLwotICB7IFNIT1JUX0EsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0EsIDIsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9CMSwgMCwgeyBSYyB9IH0sCQkJLyogUmMgKi8KLSAgeyBTSE9SVF9CMiwgMiwgeyBJTU0xOFMzIH0gfSwJCQkvKiBpbW0xOCAqLwotICB7IFNIT1JUX0IyciwgMiwgeyBSRUwxOFMzIH0gfSwJCS8qIHJlbDE4ICovCi0gIHsgU0hPUlRfQjMsIDAsIHsgUmEzLCBSYyB9IH0sCQkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CMywgMiwgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9CM3IsIDAsIHsgUmEzLCBSYyB9IH0sCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzciwgMiwgeyBSYTMsIFJFTDEyUzMgfSB9LAkJLyogUmEscmVsMTIgKi8KLSAgeyBTSE9SVF9CM2IsIDEsIHsgUmEzLCBSYyB9IH0sCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzYiwgMywgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9CM2JyLCAxLCB7IFJhMywgUmMgfSB9LAkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CM2JyLCAzLCB7IFJhMywgUkVMMTJTMyB9IH0sCQkvKiBSYSxyZWwxMiAqLwotICB7IFNIT1JUX0QxciwgMCwgeyBSYSwgUmMgfSB9LAkJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfRDFyLCAyLCB7IFJhLCBSRUwxMlMzIH0gfSwJCS8qIFJhLHJlbDEyczMgKi8KLSAgeyBTSE9SVF9EMiwgMCwgeyBSRUw2UzMsIFJjIH0gfSwJCS8qIHJlbDZzMyxSYyAqLwotICB7IFNIT1JUX0QyLCAyLCB7IFJFTDZTMywgSU1NMTJTMyB9IH0sCQkvKiByZWw2czMsaW1tMTJzMyAqLwotICB7IFNIT1JUX0QyciwgMCwgeyBSRUw2UzMsIFJjIH0gfSwJCS8qIHJlbDZzMyxSYyAqLwotICB7IFNIT1JUX0QyciwgMiwgeyBSRUw2UzMsIFJFTDEyUzMgfSB9LAkvKiByZWw2czMscmVsMTJzMyAqLwotICB7IFNIT1JUX0QyQnIsIDAsIHsgSU1NNlUsIFJjIH0gfSwJCS8qIGltbTZ1LFJjICovCi0gIHsgU0hPUlRfRDJCciwgMiwgeyBJTU02VSwgUkVMMTJTMyB9IH0sCS8qIGltbTZ1LHJlbDEyczMgKi8KLSAgeyBTSE9SVF9VLCAwLCB7IFJhLCBSYiB9IH0sCQkJLyogUmEsUmIgKi8KLSAgeyBTSE9SVF9GLCAwLCB7IEZhLCBGYiwgRmMgfSB9LAkJLyogRmEsRmIsRmMgIChvcmZnLCB4b3JmZykgKi8KLSAgeyBTSE9SVF9GLCAyLCB7IEZhLCBGYiwgSU1NNiB9IH0sCQkvKiBGYSxGYixpbW02ICovCi0gIHsgU0hPUlRfQUYsIDAsIHsgRmEsIFJiLCBSYyB9IH0sCQkvKiBGYSxSYixSYyAqLwotICB7IFNIT1JUX0FGLCAyLCB7IEZhLCBSYiwgSU1NNiB9IH0sCQkvKiBGYSxSYixpbW02ICovCi0gIHsgU0hPUlRfVCwgMiwgeyBJTU01IH0gfSwJCQkvKiBpbW01czMgICAodHJhcCkgKi8KLSAgeyBTSE9SVF9BNSwgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQTUsIDIsIHsgUmEsIFJiLCBJTU01IH0gfSwJCS8qIFJhLFJiLGltbTUgICAgKHNhdCopICovCi0gIHsgU0hPUlRfQ01QLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJCS8qIENDICBGYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9DTVAsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZ9IH0sCS8qIENDICBGYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0NNUFUsIDAsIHsgQ0MsIEZhMiwgUmIsIFJjfSB9LAkvKiBDQyAgRmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQ01QVSwgMiwgeyBDQywgRmEyLCBSYiwgSU1NNlUyfSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9BMSwgMSwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjIGZvciBNQUMgd2hlcmUgYT0xICovCi0gIHsgU0hPUlRfQTEsIDMsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgZm9yIE1BQyB3aGVyZSBhPTEgKi8KLSAgeyBTSE9SVF9BQSwgMCwgeyBBYSwgUmIsIFJjIH0gfSwJCS8qIEFhLFJiLFJjICovCi0gIHsgU0hPUlRfQUEsIDIsIHsgQWEsIFJiLCBJTU02IH0gfSwJCS8qIEFhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9SQSwgMCwgeyBSYSwgQWIsIFJjIH0gfSwJCS8qIFJhLEFiLFJjICovCi0gIHsgU0hPUlRfUkEsIDIsIHsgUmEsIEFiLCBJTU02VTIgfSB9LAkJLyogUmEsQWIsaW1tNnUgKi8KLSAgeyBTSE9SVF9NT0RJTkMsIDEsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kaW5jKSAqLwotICB7IFNIT1JUX01PRERFQywgMywgeyBSYiwgSU1NNSB9IH0sCQkvKiBSYixpbW01IChtb2RkZWMpICovCi0gIHsgU0hPUlRfQzEsIDAsIHsgUmEsIENiLCBGYWtlIH0gfSwJCS8qIFJhLENiIChtdmZzeXMpICovCi0gIHsgU0hPUlRfQzIsIDAsIHsgQ2EsIFJiLCBGYWtlIH0gfSwJCS8qIENhLFJiIChtdnRzeXMpICovCi0gIHsgU0hPUlRfVUYsIDAsIHsgRmEsIEZiIH0gfSwJCQkvKiBGYSxGYiAgKG5vdGZnKSAqLwotICB7IFNIT1JUX0EyLCAwLCB7IFJhMiwgUmIsIFJjIH0gfSwJCS8qIFJhMixSYixSYyAqLwotICB7IFNIT1JUX0EyLCAyLCB7IFJhMiwgUmIsIElNTTYgfSB9LAkJLyogUmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9OT05FLCAwLCB7IDAgfSB9LAkJCS8qIG5vIG9wZXJhbmRzIChub3AsIHJlaXQpICovCi0gIHsgU0hPUlRfQVIsIDAsIHsgQWEsIFJiLCBSYyB9IH0sCQkvKiBBYSxSYixSYyAqLwotICB7IExPTkcsIDIsIHsgUmEsIFJiLCBJTU0zMiB9IH0sCQkvKiBSYSxSYixpbW0zMiAqLwotICB7IExPTkdfVSwgMiwgeyBJTU0zMiB9IH0sCQkJLyogaW1tMzIgKi8KLSAgeyBMT05HX1VyLCAyLCB7IFJFTDMyIH0gfSwJCQkvKiByZWwzMiAqLwotICB7IExPTkdfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU0zMn0gfSwJLyogQ0MgIEZhMixSYixpbW0zMiAqLwotICB7IExPTkdfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU0zMiB9IH0sCS8qIFJhLEAoUmIsaW1tMzIpICovCi0gIHsgTE9OR19NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLwotICB7IExPTkdfMiwgMiwgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR18yciwgMiwgeyBSYTMsIFJFTDMyIH0gfSwJCS8qIFJhLHJlbDMyICovCi0gIHsgTE9OR18yYiwgMywgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR18yYnIsIDMsIHsgUmEzLCBSRUwzMiB9IH0sCQkvKiBSYSxyZWwzMiAqLwotICB7IExPTkdfRCwgMiwgeyBSRUw2UzMsIElNTTMyIH0gfSwJCS8qIHJlbDZzMyxpbW0zMiAqLwotICB7IExPTkdfRHIsIDIsIHsgUkVMNlMzLCBSRUwzMiB9IH0sCQkvKiByZWw2czMscmVsMzIgKi8KLSAgeyBMT05HX0RiciwgMiwgeyBJTU02VSwgUkVMMzIgfSB9LAkJLyogaW1tNixyZWwzMiAqLwotICB7IDAsIDAsIHsgMCB9IH0sCi19OwotCi1jb25zdCBjaGFyICpkMzB2X2VjY19uYW1lc1tdID0KLXsKLSAgImFsIiwKLSAgInR4IiwKLSAgImZ4IiwKLSAgInh0IiwKLSAgInhmIiwKLSAgInR0IiwKLSAgInRmIiwKLSAgInJlcyIKLX07Ci0KLWNvbnN0IGNoYXIgKmQzMHZfY2NfbmFtZXNbXSA9Ci17Ci0gICJlcSIsCi0gICJuZSIsCi0gICJndCIsCi0gICJnZSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJwcyIsCi0gICJuZyIsCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9vcGNvZGVzL2RlcC1pbi5zZWQgYi9vcGNvZGVzL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGRlZTU2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTpsb29wCi0vXFwkL04KLXMvXFxcbiAqLyAvZwotdCBsb29wCi0KLXMhXC5vOiEubG86IQotcyEgQEJGRF9IQCEgJChCRkRfSCkhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotcy8gKjovOi9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXMtYnVmLmMgYi9vcGNvZGVzL2Rpcy1idWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyODIwNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2Rpcy1idWYuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBmcm9tIGEgYnVmZmVyLCBmb3IgR05VLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEdldCBMRU5HVEggYnl0ZXMgZnJvbSBpbmZvJ3MgYnVmZmVyLCBhdCB0YXJnZXQgYWRkcmVzcyBtZW1hZGRyLgotICAgVHJhbnNmZXIgdGhlbSB0byBteWFkZHIuICAqLwotaW50Ci1idWZmZXJfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuZ3RoLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGJmZF9ieXRlICpteWFkZHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgb3BiID0gaW5mby0+b2N0ZXRzX3Blcl9ieXRlOwotICB1bnNpZ25lZCBpbnQgZW5kX2FkZHJfb2Zmc2V0ID0gbGVuZ3RoIC8gb3BiOwotICB1bnNpZ25lZCBpbnQgbWF4X2FkZHJfb2Zmc2V0ID0gaW5mby0+YnVmZmVyX2xlbmd0aCAvIG9wYjsgCi0gIHVuc2lnbmVkIGludCBvY3RldHMgPSAobWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEpICogb3BiOwotCi0gIGlmIChtZW1hZGRyIDwgaW5mby0+YnVmZmVyX3ZtYQotICAgICAgfHwgbWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEgKyBlbmRfYWRkcl9vZmZzZXQgPiBtYXhfYWRkcl9vZmZzZXQpCi0gICAgLyogT3V0IG9mIGJvdW5kcy4gIFVzZSBFSU8gYmVjYXVzZSBHREIgdXNlcyBpdC4gICovCi0gICAgcmV0dXJuIEVJTzsKLSAgbWVtY3B5IChteWFkZHIsIGluZm8tPmJ1ZmZlciArIG9jdGV0cywgbGVuZ3RoKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvCi0gICBhbiBlcnJvciByZXR1cm4gZnJvbSBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotdm9pZAotcGVycm9yX21lbW9yeSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgc3RhdHVzOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoc3RhdHVzICE9IEVJTykKLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCBfKCJVbmtub3duIGVycm9yICVkXG4iKSwgc3RhdHVzKTsKLSAgZWxzZQotICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKLSAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKLQkJCV8oIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIiksIG1lbWFkZHIpOwotfQotCi0vKiBUaGlzIGNvdWxkIGJlIGluIGEgc2VwYXJhdGUgZmlsZSwgdG8gc2F2ZSBtaW5pc2N1bGUgYW1vdW50cyBvZiBzcGFjZQotICAgaW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuICAqLwotCi0vKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGlzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCi0gICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCi0gICBhZGRyZXNzZXMpLiAgKi8KLQotdm9pZAotZ2VuZXJpY19wcmludF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZlszMF07Ci0KLSAgc3ByaW50Zl92bWEgKGJ1ZiwgYWRkcik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglcyIsIGJ1Zik7Ci19Ci0KLS8qIEp1c3QgY29uY2F0ZW5hdGUgdGhlIGFkZHJlc3MgYXMgaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IKLSAgIGNvbXBsZXRlbmVzcyBldmVuIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8KLSAgIHByaW50IHN5bWJvbGljIGFkZHJlc3NlcykuICAqLwotCi12b2lkCi1nZW5lcmljX3N0cmNhdF9hZGRyZXNzIChhZGRyLCBidWYsIGxlbikKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChidWYgIT0gKGNoYXIgKilOVUxMICYmIGxlbiA+IDApCi0gICAgewotICAgICAgY2hhciB0bXBCdWZbMzBdOwotCi0gICAgICBzcHJpbnRmX3ZtYSAodG1wQnVmLCBhZGRyKTsKLSAgICAgIGlmICgoc3RybGVuIChidWYpICsgc3RybGVuICh0bXBCdWYpKSA8PSAodW5zaWduZWQgaW50KSBsZW4pCi0Jc3RyY2F0IChidWYsIHRtcEJ1Zik7Ci0gICAgICBlbHNlCi0Jc3RybmNhdCAoYnVmLCB0bXBCdWYsIChsZW4gLSBzdHJsZW4oYnVmKSkpOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0vKiBKdXN0IHJldHVybiB0aGUgZ2l2ZW4gYWRkcmVzcy4gICovCi0KLWludAotZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jIGIvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJhYTQyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzYXNzZW1ibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKiBTZWxlY3QgZGlzYXNzZW1ibHkgcm91dGluZSBmb3Igc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2lmZGVmIEFSQ0hfYWxsCi0jZGVmaW5lIEFSQ0hfYTI5awotI2RlZmluZSBBUkNIX2FscGhhCi0jZGVmaW5lIEFSQ0hfYXJjCi0jZGVmaW5lIEFSQ0hfYXJtCi0jZGVmaW5lIEFSQ0hfYXZyCi0jZGVmaW5lIEFSQ0hfZDEwdgotI2RlZmluZSBBUkNIX2QzMHYKLSNkZWZpbmUgQVJDSF9oODMwMAotI2RlZmluZSBBUkNIX2g4NTAwCi0jZGVmaW5lIEFSQ0hfaHBwYQotI2RlZmluZSBBUkNIX2kzNzAKLSNkZWZpbmUgQVJDSF9pMzg2Ci0jZGVmaW5lIEFSQ0hfaTk2MAotI2RlZmluZSBBUkNIX2lhNjQKLSNkZWZpbmUgQVJDSF9mcjMwCi0jZGVmaW5lIEFSQ0hfbTMycgotI2RlZmluZSBBUkNIX202OGsKLSNkZWZpbmUgQVJDSF9tODhrCi0jZGVmaW5lIEFSQ0hfbWNvcmUKLSNkZWZpbmUgQVJDSF9taXBzCi0jZGVmaW5lIEFSQ0hfbW4xMDIwMAotI2RlZmluZSBBUkNIX21uMTAzMDAKLSNkZWZpbmUgQVJDSF9uczMyawotI2RlZmluZSBBUkNIX3BqCi0jZGVmaW5lIEFSQ0hfcG93ZXJwYwotI2RlZmluZSBBUkNIX3JzNjAwMAotI2RlZmluZSBBUkNIX3NoCi0jZGVmaW5lIEFSQ0hfc3BhcmMKLSNkZWZpbmUgQVJDSF90aWMzMAotI2RlZmluZSBBUkNIX3RpYzU0eAotI2RlZmluZSBBUkNIX3RpYzgwCi0jZGVmaW5lIEFSQ0hfdjg1MAotI2RlZmluZSBBUkNIX3ZheAotI2RlZmluZSBBUkNIX3c2NQotI2RlZmluZSBBUkNIX3o4awotI2VuZGlmCi0KLQotZGlzYXNzZW1ibGVyX2Z0eXBlCi1kaXNhc3NlbWJsZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGEgPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGU7Ci0KLSAgc3dpdGNoIChhKQotICAgIHsKLSAgICAgIC8qIElmIHlvdSBhZGQgYSBjYXNlIHRvIHRoaXMgdGFibGUsIGFsc28gYWRkIGl0IHRvIHRoZQotCSBBUkNIX2FsbCBkZWZpbml0aW9uIHJpZ2h0IGFib3ZlIHRoaXMgZnVuY3Rpb24uICAqLwotI2lmZGVmIEFSQ0hfYTI5awotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIC8qIEFzIGZhciBhcyBJIGtub3cgd2Ugb25seSBoYW5kbGUgYmlnLWVuZGlhbiAyOWsgb2JqZWN0cy4gICovCi0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2EyOWs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYWxwaGEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2FscGhhOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FyYwotICAgIGNhc2UgYmZkX2FyY2hfYXJjOgotICAgICAgewotCWRpc2Fzc2VtYmxlID0gYXJjX2dldF9kaXNhc3NlbWJsZXIgKGJmZF9nZXRfbWFjaCAoYWJmZCksCi0JCQkJCSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpOwotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0jaWZkZWYgQVJDSF9hcm0KLSAgICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19hcm07Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9hcm07Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYXZyCi0gICAgY2FzZSBiZmRfYXJjaF9hdnI6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYXZyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QxMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QxMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDEwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9kMzB2Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2QzMHY7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDgzMDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwaDsKLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwczsKLSAgICAgIGVsc2UgCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2g4NTAwCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODUwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9ocHBhCi0gICAgY2FzZSBiZmRfYXJjaF9ocHBhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2hwcGE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaTM3MAotICAgIGNhc2UgYmZkX2FyY2hfaTM3MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzcwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2kzODYKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTM4Nl9pbnRlbDsKLSAgICAgIGVsc2UKLSAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfYXR0OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2k5NjAKLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTk2MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pYTY0Ci0gICAgY2FzZSBiZmRfYXJjaF9pYTY0OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2lhNjQ7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZnIzMAotICAgIGNhc2UgYmZkX2FyY2hfZnIzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9mcjMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX20zMnIKLSAgICBjYXNlIGJmZF9hcmNoX20zMnI6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTMycjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tNjhrCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX202OGs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTg4awotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tODhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX25zMzJrCi0gICAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9uczMyazsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tY29yZQotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbWNvcmU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWlwcwotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19taXBzOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfbWlwczsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tbjEwMjAwCi0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAyMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDMwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3BqCi0gICAgY2FzZSBiZmRfYXJjaF9wajoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9wajsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9wb3dlcnBjCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX3Bvd2VycGM7Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3JzNjAwMAotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gNjIwKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYzsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fcnM2MDAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NoCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NoOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaGw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfc3BhcmMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NwYXJjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3RpYzMwCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWMzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWM1NHgKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzU0eDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWM1NHg7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdGljODAKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3RpYzgwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Y4NTAKLSAgICBjYXNlIGJmZF9hcmNoX3Y4NTA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdjg1MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF93NjUKLSAgICBjYXNlIGJmZF9hcmNoX3c2NToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl93NjU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfejhrCi0gICAgY2FzZSBiZmRfYXJjaF96OGs6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX3o4MDAxKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl96ODAwMTsKLSAgICAgIGVsc2UgCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3ZheAotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3ZheDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGRpc2Fzc2VtYmxlOwotfQotCi12b2lkCi1kaXNhc3NlbWJsZXJfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqIHN0cmVhbSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEFSQ0hfYXJtCi0gIHByaW50X2FybV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoc3RyZWFtKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWFzbS5jIGIvb3Bjb2Rlcy9mcjMwLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM4ZGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLS8qIEhhbmRsZSByZWdpc3RlciBsaXN0cyBmb3IgTERNeCBhbmQgU1RNeCAgKi8KLQotc3RhdGljIGludAotcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKQotICAgICBjb25zdCBjaGFyICoqc3RycDsKLXsKLSAgaW50IHJlZ25vOwotICBpZiAoKipzdHJwIDwgJzAnIHx8ICoqc3RycCA+ICc5JykKLSAgICByZXR1cm4gLTE7IC8qIGVycm9yICovCi0gIHJlZ25vID0gKipzdHJwIC0gJzAnOwotICArKypzdHJwOwotCi0gIGlmICgqKnN0cnAgPj0gJzAnICYmICoqc3RycCA8PSAnOScpCi0gICAgewotICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgKCoqc3RycCAtICcwJyk7Ci0gICAgICArKypzdHJwOwotICAgIH0KLQotICByZXR1cm4gcmVnbm87Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIGhpZ2hfbG93LCBsb2FkX3N0b3JlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLSAgICAgaW50IGhpZ2hfbG93OyAgIC8qIDAgPT0gaGlnaCwgMSA9PSBsb3cgKi8KLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBpbnQgcmVnbm87Ci0gICp2YWx1ZXAgPSAwOwotICB3aGlsZSAoKipzdHJwICYmICoqc3RycCAhPSAnKScpCi0gICAgewotICAgICAgaWYgKCoqc3RycCAhPSAnUicgJiYgKipzdHJwICE9ICdyJykKLQlicmVhazsKLSAgICAgICsrKnN0cnA7Ci0KLSAgICAgIHJlZ25vID0gcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKTsKLSAgICAgIGlmIChyZWdubyA9PSAtMSkKLQlyZXR1cm4gIlJlZ2lzdGVyIG51bWJlciBpcyBub3QgdmFsaWQiOwotICAgICAgaWYgKHJlZ25vID4gNyAmJiAhaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjAgYW5kIHI3IjsKLSAgICAgIGlmIChyZWdubyA8IDggJiYgaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjggYW5kIHIxNSI7Ci0KLSAgICAgIGlmIChoaWdoX2xvdykKLQlyZWdubyAtPSA4OwotCi0gICAgICBpZiAobG9hZF9zdG9yZSkgLyogbWFzayBpcyByZXZlcnNlZCBmb3Igc3RvcmUgKi8KLQkqdmFsdWVwIHw9IDB4ODAgPj4gcmVnbm87Ci0gICAgICBlbHNlCi0JKnZhbHVlcCB8PSAxIDw8IHJlZ25vOwotCi0gICAgICBpZiAoKipzdHJwID09ICcsJykKLQl7Ci0JICBpZiAoKigqc3RycCArIDEpID09ICcpJykKLQkgICAgYnJlYWs7Ci0JICArKypzdHJwOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEqc3RycCB8fCAqKnN0cnAgIT0gJyknKQotICAgIHJldHVybiAiUmVnaXN0ZXIgbGlzdCBpcyBub3QgdmFsaWQiOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAwLypsb3cqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDEvKnN0b3JlKi8pOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgLyogVXNlZCBieSBzY2FsYXIgb3BlcmFuZHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZC4gICovCi0gIGxvbmcganVuazsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SamMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDLCAmZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0NDLCAmZmllbGRzLT5mX2NjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSMTAsICZmaWVsZHMtPmZfZGlyMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOCwgJmZpZWxkcy0+Zl9kaXI4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjksICZmaWVsZHMtPmZfZGlyOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQMTAsICZmaWVsZHMtPmZfZGlzcDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDgsICZmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOSwgJmZpZWxkcy0+Zl9kaXNwOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kyMCwgJmZpZWxkcy0+Zl9pMjApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMzIsICZmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JOCwgJmZpZWxkcy0+Zl9pOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX000LCAmZmllbGRzLT5mX200KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsICYganVuayk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUzEwLCAmZmllbGRzLT5mX3MxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1UxMCwgJmZpZWxkcy0+Zl91MTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0LCAmZmllbGRzLT5mX3U0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTRDLCAmZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTgsICZmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VRElTUDYsICZmaWVsZHMtPmZfdWRpc3A2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIpLCBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotY2dlbl9wYXJzZV9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1tdID0gCi17Ci0gIHBhcnNlX2luc25fbm9ybWFsLAotfTsKLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfYXNtIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIGZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnBhcnNlX2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbMF07Ci0gIGNkLT5wYXJzZV9vcGVyYW5kID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgaW5zbiBwYXJzZXIuCi0KLSAgIFRoZSBzeW50YXggc3RyaW5nIGlzIHNjYW5uZWQgYW5kIG9wZXJhbmRzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBSZWxvY3MgYXJlIHF1ZXVlZCBhcyB3ZSBnbyB2aWEgb3RoZXIgY2FsbGJhY2tzLgotCi0gICA/Pz8gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGFuIGFsbC1vci1ub3RoaW5nIHBhcnNlci4gIElmIHdlIGZhaWwgdG8KLSAgIHBhcnNlIHRoZSBpbnN0cnVjdGlvbiwgd2UgcmV0dXJuIDAgYW5kIHRoZSBjYWxsZXIgd2lsbCBzdGFydCBvdmVyIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcuICBCYWNrdHJhY2tpbmcgd2lsbCBiZSBuZWNlc3NhcnkgaW4gcGFyc2luZyBzdWJleHByZXNzaW9ucywKLSAgIGJ1dCB0aGF0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLiAgTm90IGhhbmRsaW5nIGJhY2t0cmFja2luZyBoZXJlIG1heSBnZXQKLSAgIGV4cGVuc2l2ZSBpbiB0aGUgY2FzZSBvZiB0aGUgbTY4ay4gIERlYWwgd2l0aCBsYXRlci4KLQotICAgUmV0dXJucyBOVUxMIGZvciBzdWNjZXNzLCBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlLgotKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qID8/PyBSdW50aW1lIGFkZGVkIGluc25zIG5vdCBoYW5kbGVkIHlldC4gICovCi0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgY2hhciAqc3RyID0gKnN0cnA7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIC8qIEZJWE1FOiB3aXAgKi8KLSAgaW50IHBhc3Rfb3Bjb2RlX3A7Ci0jZW5kaWYKLQotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgbW5lbW9uaWMgaXMgZmlyc3QgKHRoZXJlIGFyZSBubyBsZWFkaW5nIG9wZXJhbmRzKS4KLSAgICAgV2UgY2FuIHBhcnNlIGl0IHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgb3BlcmFuZCBwYXJzaW5nLgotICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIGVuc3VyZSBtbmVtb25pY3MgYXJlIGxvd2VyY2FzZSwgYnV0IHdlIG1heQotICAgICBub3QgYmUgY2FsbGVkIGZyb20gR0FTLiAgKi8KLSAgcCA9IENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbik7Ci0gIHdoaWxlICgqcCAmJiB0b2xvd2VyICgqcCkgPT0gdG9sb3dlciAoKnN0cikpCi0gICAgKytwLCArK3N0cjsKLQotICBpZiAoKiBwKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLQotI2lmbmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIGlmICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLSNlbmRpZgotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICAvKiBGSVhNRTogV2hpbGUgd2UgYWxsb3cgZm9yIG5vbi1HQVMgY2FsbGVycyBhYm92ZSwgd2UgYXNzdW1lIHRoZQotCSAgICAgZmlyc3QgY2hhciBhZnRlciB0aGUgbW5lbW9uaWMgcGFydCBpcyBhIHNwYWNlLiAgKi8KLQkgIC8qIEZJWE1FOiBXZSBhbHNvIHRha2UgaW5hcHByb3ByaWF0ZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdAotCSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCByZW1vdmUgZXh0cmFuZW91cyBibGFua3MuICAqLwotCSAgaWYgKCpzdHIgPT0gQ0dFTl9TWU5UQVhfQ0hBUiAoKiBzeW4pKQotCSAgICB7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCSAgICAgIGlmICgqIHN5biA9PSAnICcpCi0JCXBhc3Rfb3Bjb2RlX3AgPSAxOwotI2VuZGlmCi0JICAgICAgKysgc3luOwotCSAgICAgICsrIHN0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLiAgKi8KLQkgICAgICAvKiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLQkJICJleHBlY3RlZCBjaGFyIGBjJyIgKi8KLQkgICAgICByZXR1cm4gXygic3ludGF4IGVycm9yIik7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kIG9mIHNvbWUgc29ydC4gICovCi0gICAgICBlcnJtc2cgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJICAmc3RyLCBmaWVsZHMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgICAvKiBEb25lIHdpdGggdGhpcyBvcGVyYW5kLCBjb250aW51ZSB3aXRoIG5leHQgb25lLiAgKi8KLSAgICAgICsrIHN5bjsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gIGlmICgqIHN5biA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluCi0JIGJsYW5rcyBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mCi0JIHRoZSBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotCSsrIHN0cjsKLQotICAgICAgaWYgKCogc3RyICE9ICdcMCcpCi0JcmV0dXJuIF8oImp1bmsgYXQgZW5kIG9mIGxpbmUiKTsgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBgc3RyJyAqLwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGRuJ3QgcGFyc2UgaXQuICAqLwotICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuCi0gICBTVFIgcG9pbnRzIHRvIHRoZSBpbnNuIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFdlIGFzc3VtZSBhbGwgbmVjZXNzYXJ5IHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGUgYXNzZW1ibGVkIGluc3RydWN0aW9uLCBsZXNzIGFueSBmaXh1cHMsIGlzIHN0b3JlZCBpbiBCVUYuCi0gICBSZW1lbWJlciB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCB0aGVuIEJVRiBpcyBhbiBpbnQgYW5kIHRodXMgdGhlIHZhbHVlCi0gICBzdGlsbCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUYgaXMgYW4gYXJyYXkKLSAgIG9mIGJ5dGVzIGluIHRhcmdldCBieXRlIG9yZGVyLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24ncyBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotICAgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkIChhbiBlcnJvciBtZXNzYWdlIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIHByaW50ZWQpLgotCi0gICBOb3RlIHRoYXQgd2hlbiBwcm9jZXNzaW5nIChub24tYWxpYXMpIG1hY3JvLWluc25zLAotICAgdGhpcyBmdW5jdGlvbiByZWN1cnNlcy4KLQotICAgPz8/IEl0J3MgcG9zc2libGUgdG8gbWFrZSB0aGlzIGNwdS1pbmRlcGVuZGVudC4KLSAgIE9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBhIGZldyBtaW5vciB0aGluZ3MuCi0gICBBdCB0aGlzIHBvaW50IGluIHRpbWUgZG9pbmcgc28gd291bGQgYmUgbW9yZSBvZiBhIGN1cmlvc2l0eSB0aGFuIHVzZWZ1bAotICAgW2ZvciBleGFtcGxlIHRoaXMgZmlsZSBpc24ndCBfdGhhdF8gYmlnXSwgYnV0IGtlZXBpbmcgdGhlIHBvc3NpYmlsaXR5IGluCi0gICBtaW5kIGhlbHBzIGtlZXAgdGhlIGRlc2lnbiBjbGVhbi4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1mcjMwX2NnZW5fYXNzZW1ibGVfaW5zbiAoY2QsIHN0ciwgZmllbGRzLCBidWYsIGVycm1zZykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZjsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICAvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaGVkIGxpc3RzLgotICAgICBHZXQgdGhlIGZpcnN0IGluIHRoZSBsaXN0LiAgKi8KLSAgaWxpc3QgPSBDR0VOX0FTTV9MT09LVVBfSU5TTiAoY2QsIHN0cik7Ci0KLSAgLyogS2VlcCBsb29raW5nIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4gICovCi0KLSAgc3RhcnQgPSBzdHI7Ci0gIGZvciAoIDsgaWxpc3QgIT0gTlVMTCA7IGlsaXN0ID0gQ0dFTl9BU01fTkVYVF9JTlNOIChpbGlzdCkpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaWxpc3QtPmluc247Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBzaG91bGRuJ3QgYmUgaW4gdGhlIGhhc2ggbGlzdHMgKi8KLSAgICAgIC8qIElzIHRoaXMgaW5zbiBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBJZiB0aGUgUkVMQVggYXR0cmlidXRlIGlzIHNldCwgdGhpcyBpcyBhbiBpbnNuIHRoYXQgc2hvdWxkbid0IGJlCi0JIGNob3NlbiBpbW1lZGlhdGVseS4gIEluc3RlYWQsIGl0IGlzIHVzZWQgZHVyaW5nIGFzc2VtYmxlci9saW5rZXIKLQkgcmVsYXhhdGlvbiBpZiBwb3NzaWJsZS4gICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyID0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFsbG93IHBhcnNlL2luc2VydCBoYW5kbGVycyB0byBvYnRhaW4gbGVuZ3RoIG9mIGluc24uICAqLwotICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICAgICAgaWYgKCEgQ0dFTl9QQVJTRV9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgJiBzdHIsIGZpZWxkcykpCi0JewotCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICBpZiAoQ0dFTl9JTlNFUlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sIGZpZWxkcywgYnVmLCAoYmZkX3ZtYSkgMCkKLQkgICAgICAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIC8qIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYWN0dWFsbHkgb3V0cHV0IHRoZSBpbnNuIGFuZCBhbnkKLQkgICAgIHF1ZXVlZCByZWxvY3MuICAqLwotCSAgcmV0dXJuIGluc247Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICAvKiBGSVhNRTogV2UgY2FuIHJldHVybiBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoYW4gdGhpcy4KLSAgICAgTmVlZCB0byB0cmFjayB3aHkgaXQgZmFpbGVkIGFuZCBwaWNrIHRoZSByaWdodCBvbmUuICAqLwotICB7Ci0gICAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gICAgaWYgKHN0cmxlbiAoc3RhcnQpID4gNTApCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIpLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIiksIHN0YXJ0KTsKLSAgICAgIAotICAgICplcnJtc2cgPSBlcnJidWY7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQwKLSNpZiAwIC8qIFRoaXMgY2FsbHMgYmFjayB0byBHQVMgd2hpY2ggd2UgY2FuJ3QgZG8gd2l0aG91dCBjYXJlLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgVGhpcyBsZXRzIEdBUyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLgotICAgPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIEZJWE1FOiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotCi12b2lkCi1mcjMwX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMgKGNkLCBvcHZhbHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fS0VZV09SRCAqb3B2YWxzOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaCA9IGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAob3B2YWxzLCBOVUxMKTsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoga2U7Ci0KLSAgd2hpbGUgKChrZSA9IGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCAoJiBzZWFyY2gpKSAhPSBOVUxMKQotICAgIHsKLSNpZiAwIC8qIFVubmVjZXNzYXJ5LCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgc2VhcmNoIHJvdXRpbmUuICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX29wdmFsX3N1cHBvcnRlZCAoa2UpKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIgKGNkLCBrZS0+bmFtZSwga2UtPnZhbHVlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5jIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlMTFlMC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0NiArMCwwIEBACi0vKiBDUFUgZGF0YSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIGJvb2xfYXR0cltdID0KLXsKLSAgeyAiI2YiLCAwIH0sCi0gIHsgIiN0IiwgMSB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBNQUNIX2F0dHJbXSA9Ci17Ci0gIHsgImJhc2UiLCBNQUNIX0JBU0UgfSwKLSAgeyAiZnIzMCIsIE1BQ0hfRlIzMCB9LAotICB7ICJtYXgiLCBNQUNIX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBJU0FfYXR0cltdID0KLXsKLSAgeyAiZnIzMCIsIElTQV9GUjMwIH0sCi0gIHsgIm1heCIsIElTQV9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVTRVJWRUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk9ULUlOLURFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JU0EgZnIzMF9jZ2VuX2lzYV90YWJsZVtdID0gewotICB7ICJmcjMwIiwgMTYsIDE2LCAxNiwgNDgsICB9LAotICB7IDAgfQotfTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggZnIzMF9jZ2VuX21hY2hfdGFibGVbXSA9IHsKLSAgeyAiZnIzMCIsICJmcjMwIiwgTUFDSF9GUjMwIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJyMCIsIDAgfSwKLSAgeyAicjEiLCAxIH0sCi0gIHsgInIyIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAiYWMiLCAxMyB9LAotICB7ICJmcCIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbMF0sCi0gIDE5Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiY3I4IiwgOCB9LAotICB7ICJjcjkiLCA5IH0sCi0gIHsgImNyMTAiLCAxMCB9LAotICB7ICJjcjExIiwgMTEgfSwKLSAgeyAiY3IxMiIsIDEyIH0sCi0gIHsgImNyMTMiLCAxMyB9LAotICB7ICJjcjE0IiwgMTQgfSwKLSAgeyAiY3IxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzWzBdLAotICAxNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAidGJyIiwgMCB9LAotICB7ICJycCIsIDEgfSwKLSAgeyAic3NwIiwgMiB9LAotICB7ICJ1c3AiLCAzIH0sCi0gIHsgIm1kaCIsIDQgfSwKLSAgeyAibWRsIiwgNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1swXSwKLSAgNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzW10gPQotewotICB7ICJwcyIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzW10gPQotewotICB7ICJyMTMiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzW10gPQotewotICB7ICJyMTQiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzW10gPQotewotICB7ICJyMTUiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTUgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzWzBdLAotICAxCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIGZyMzBfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZHIiLCBIV19IX0RSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBzIiwgSFdfSF9QUywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxMyIsIEhXX0hfUjEzLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNCIsIEhXX0hfUjE0LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNSIsIEhXX0hfUjE1LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLW5iaXQiLCBIV19IX05CSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC16Yml0IiwgSFdfSF9aQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdmJpdCIsIEhXX0hfVkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNiaXQiLCBIV19IX0NCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYml0IiwgSFdfSF9JQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2JpdCIsIEhXX0hfU0JJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXRiaXQiLCBIV19IX1RCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMGJpdCIsIEhXX0hfRDBCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMWJpdCIsIEhXX0hfRDFCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jY3IiLCBIV19IX0NDUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNjciIsIEhXX0hfU0NSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWxtIiwgSFdfSF9JTE0sIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQotCi1jb25zdCBDR0VOX0lGTEQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXSA9Ci17Ci0gIHsgRlIzMF9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AxLCAiZi1vcDEiLCAwLCAxNiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AyLCAiZi1vcDIiLCAwLCAxNiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AzLCAiZi1vcDMiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1A0LCAiZi1vcDQiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QNSwgImYtb3A1IiwgMCwgMTYsIDQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NDLCAiZi1jYyIsIDAsIDE2LCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DQ0MsICJmLWNjYyIsIDE2LCAxNiwgMCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkosICJmLVJqIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JJLCAiZi1SaSIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMxLCAiZi1SczEiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMyLCAiZi1SczIiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JKQywgImYtUmpjIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSUMsICJmLVJpYyIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NSSiwgImYtQ1JqIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DUkksICJmLUNSaSIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1U0LCAiZi11NCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VNEMsICJmLXU0YyIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTQsICJmLWk0IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX000LCAiZi1tNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VOCwgImYtdTgiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTgsICJmLWk4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kyMF80LCAiZi1pMjAtNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JMjBfMTYsICJmLWkyMC0xNiIsIDE2LCAxNiwgMCwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kzMiwgImYtaTMyIiwgMTYsIDMyLCAwLCAzMiwgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVURJU1A2LCAiZi11ZGlzcDYiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElTUDgsICJmLWRpc3A4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJU1A5LCAiZi1kaXNwOSIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVNQMTAsICJmLWRpc3AxMCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9TMTAsICJmLXMxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VMTAsICJmLXUxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUw5LCAiZi1yZWw5IiwgMCwgMTYsIDgsIDgsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElSOCwgImYtZGlyOCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVI5LCAiZi1kaXI5IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJUjEwLCAiZi1kaXIxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUwxMiwgImYtcmVsMTIiLCAwLCAxNiwgNSwgMTEsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgImYtcmVnbGlzdF9oaV9zdCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgImYtcmVnbGlzdF9sb3dfc3QiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9MRCwgImYtcmVnbGlzdF9oaV9sZCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgImYtcmVnbGlzdF9sb3dfbGQiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBmcjMwX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBGUjMwX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJSaSIsIEZSMzBfT1BFUkFORF9SSSwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJqOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAiUmoiLCBGUjMwX09QRVJBTkRfUkosIEhXX0hfR1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpYzogdGFyZ2V0IHJlZ2lzdGVyIGNvcHJvYyBpbnNuICovCi0gIHsgIlJpYyIsIEZSMzBfT1BFUkFORF9SSUMsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSamM6IHNvdXJjZSByZWdpc3RlciBjb3Byb2MgaW5zbiAqLwotICB7ICJSamMiLCBGUjMwX09QRVJBTkRfUkpDLCBIV19IX0dSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmk6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaSIsIEZSMzBfT1BFUkFORF9DUkksIEhXX0hfQ1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmo6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaiIsIEZSMzBfT1BFUkFORF9DUkosIEhXX0hfQ1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMTogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMSIsIEZSMzBfT1BFUkFORF9SUzEsIEhXX0hfRFIsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMjogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMiIsIEZSMzBfT1BFUkFORF9SUzIsIEhXX0hfRFIsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSMTM6IEdlbmVyYWwgUmVnaXN0ZXIgMTMgKi8KLSAgeyAiUjEzIiwgRlIzMF9PUEVSQU5EX1IxMywgSFdfSF9SMTMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFIxNDogR2VuZXJhbCBSZWdpc3RlciAxNCAqLwotICB7ICJSMTQiLCBGUjMwX09QRVJBTkRfUjE0LCBIV19IX1IxNCwgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUjE1OiBHZW5lcmFsIFJlZ2lzdGVyIDE1ICovCi0gIHsgIlIxNSIsIEZSMzBfT1BFUkFORF9SMTUsIEhXX0hfUjE1LCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBwczogUHJvZ3JhbSBTdGF0dXMgcmVnaXN0ZXIgKi8KLSAgeyAicHMiLCBGUjMwX09QRVJBTkRfUFMsIEhXX0hfUFMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0OiA0ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInU0IiwgRlIzMF9PUEVSQU5EX1U0LCBIV19IX1VJTlQsIDgsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0YzogNCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1NGMiLCBGUjMwX09QRVJBTkRfVTRDLCBIV19IX1VJTlQsIDEyLCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1OCIsIEZSMzBfT1BFUkFORF9VOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJpOCIsIEZSMzBfT1BFUkFORF9JOCwgSFdfSF9VSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ZGlzcDY6IDYgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWRpc3A2IiwgRlIzMF9PUEVSQU5EX1VESVNQNiwgSFdfSF9VSU5ULCA4LCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwODogOCAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOCIsIEZSMzBfT1BFUkFORF9ESVNQOCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwOTogOSAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOSIsIEZSMzBfT1BFUkFORF9ESVNQOSwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiZGlzcDEwIiwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiczEwIiwgRlIzMF9PUEVSQU5EX1MxMCwgSFdfSF9TSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1MTA6IDEwIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTEwIiwgRlIzMF9PUEVSQU5EX1UxMCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpMzI6IDMyIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaTMyIiwgRlIzMF9PUEVSQU5EX0kzMiwgSFdfSF9VSU5ULCAwLCAzMiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbTQ6IDQgIGJpdCBuZWdhdGl2ZSBpbW1lZGlhdGUgKi8KLSAgeyAibTQiLCBGUjMwX09QRVJBTkRfTTQsIEhXX0hfU0lOVCwgOCwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaTIwOiAyMCBiaXQgaW1tZWRpYXRlICovCi0gIHsgImkyMCIsIEZSMzBfT1BFUkFORF9JMjAsIEhXX0hfVUlOVCwgMCwgMjAsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoVklSVFVBTCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlyODogOCAgYml0IGRpcmVjdCBhZGRyZXNzICovCi0gIHsgImRpcjgiLCBGUjMwX09QRVJBTkRfRElSOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXI5OiA5ICBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyOSIsIEZSMzBfT1BFUkFORF9ESVI5LCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpcjEwOiAxMCBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyMTAiLCBGUjMwX09QRVJBTkRfRElSMTAsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbGFiZWw5OiA5ICBiaXQgcGMgcmVsYXRpdmUgYWRkcmVzcyAqLwotICB7ICJsYWJlbDkiLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBIV19IX0lBRERSLCA4LCA4LAotICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGxhYmVsMTI6IDEyIGJpdCBwYyByZWxhdGl2ZSBhZGRyZXNzICovCi0gIHsgImxhYmVsMTIiLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgSFdfSF9JQUREUiwgNSwgMTEsCi0gICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9sb3dfbGQ6IDggYml0IGxvdyByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9sb3dfbGQiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9oaV9sZDogOCBiaXQgaGlnaCByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9oaV9sZCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfbG93X3N0OiA4IGJpdCBsb3cgcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfbG93X3N0IiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfaGlfc3Q6IDggYml0IGhpZ2ggcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfaGlfc3QiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjYzogY29uZGl0aW9uIGNvZGVzICovCi0gIHsgImNjIiwgRlIzMF9PUEVSQU5EX0NDLCBIV19IX1VJTlQsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNjYzogY29wcm9jZXNzb3IgY2FsYyAqLwotICB7ICJjY2MiLCBGUjMwX09QRVJBTkRfQ0NDLCBIV19IX1VJTlQsIDAsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIG5iaXQ6IG5lZ2F0aXZlICAgYml0ICovCi0gIHsgIm5iaXQiLCBGUjMwX09QRVJBTkRfTkJJVCwgSFdfSF9OQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB2Yml0OiBvdmVyZmxvdyAgIGJpdCAqLwotICB7ICJ2Yml0IiwgRlIzMF9PUEVSQU5EX1ZCSVQsIEhXX0hfVkJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogemJpdDogemVybyAgICAgICBiaXQgKi8KLSAgeyAiemJpdCIsIEZSMzBfT1BFUkFORF9aQklULCBIV19IX1pCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNiaXQ6IGNhcnJ5ICAgICAgYml0ICovCi0gIHsgImNiaXQiLCBGUjMwX09QRVJBTkRfQ0JJVCwgSFdfSF9DQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpYml0OiBpbnRlcnJ1cHQgIGJpdCAqLwotICB7ICJpYml0IiwgRlIzMF9PUEVSQU5EX0lCSVQsIEhXX0hfSUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2JpdDogc3RhY2sgICAgICBiaXQgKi8KLSAgeyAic2JpdCIsIEZSMzBfT1BFUkFORF9TQklULCBIV19IX1NCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHRiaXQ6IHRyYWNlIHRyYXAgYml0ICovCi0gIHsgInRiaXQiLCBGUjMwX09QRVJBTkRfVEJJVCwgSFdfSF9UQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkMGJpdDogZGl2aXNpb24gMCBiaXQgKi8KLSAgeyAiZDBiaXQiLCBGUjMwX09QRVJBTkRfRDBCSVQsIEhXX0hfRDBCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGQxYml0OiBkaXZpc2lvbiAxIGJpdCAqLwotICB7ICJkMWJpdCIsIEZSMzBfT1BFUkFORF9EMUJJVCwgSFdfSF9EMUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2NyOiBjb25kaXRpb24gY29kZSBiaXRzICovCi0gIHsgImNjciIsIEZSMzBfT1BFUkFORF9DQ1IsIEhXX0hfQ0NSLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzY3I6IHN5c3RlbSBjb25kaXRpb24gYml0cyAqLwotICB7ICJzY3IiLCBGUjMwX09QRVJBTkRfU0NSLCBIV19IX1NDUiwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaWxtOiBpbnRlcnJ1cHQgbGV2ZWwgbWFzayAqLwotICB7ICJpbG0iLCBGUjMwX09QRVJBTkRfSUxNLCBIV19IX0lMTSwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9pbnNuX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgMCwgMCwgMCB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQsICJhZGQiLCAiYWRkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BRERJLCAiYWRkaSIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQyLCAiYWRkMiIsICJhZGQyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQUREQywgImFkZGMiLCAiYWRkYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERE4sICJhZGRuIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREROSSwgImFkZG5pIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURETjIsICJhZGRuMiIsICJhZGRuMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NVQkMsICJzdWJjIiwgInN1YmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVUJOLCAic3VibiIsICJzdWJuIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAsICJjbXAiLCAiY21wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVBJLCAiY21waSIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAyLCAiY21wMiIsICJjbXAyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUiwgImVvciIsICJlb3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRNLCAiYW5kbSIsICJhbmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5ESCwgImFuZGgiLCAiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRCLCAiYW5kYiIsICJhbmRiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUk0sICJvcm0iLCAib3IiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUkgsICJvcmgiLCAib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JCLCAib3JiIiwgIm9yYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUk0sICJlb3JtIiwgImVvciIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1JILCAiZW9yaCIsICJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUkIsICJlb3JiIiwgImVvcmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JBTkRMLCAiYmFuZGwiLCAiYmFuZGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk9STCwgImJvcmwiLCAiYm9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVPUkwsICJiZW9ybCIsICJiZW9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkFOREgsICJiYW5kaCIsICJiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CT1JILCAiYm9yaCIsICJib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRU9SSCwgImJlb3JoIiwgImJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUTCwgImJ0c3RsIiwgImJ0c3RsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUSCwgImJ0c3RoIiwgImJ0c3RoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVSwgIm11bHUiLCAibXVsdSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTEgsICJtdWxoIiwgIm11bGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVUgsICJtdWx1aCIsICJtdWx1aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjBTLCAiZGl2MHMiLCAiZGl2MHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYwVSwgImRpdjB1IiwgImRpdjB1IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYxLCAiZGl2MSIsICJkaXYxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYyLCAiZGl2MiIsICJkaXYyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjMsICJkaXYzIiwgImRpdjMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjRTLCAiZGl2NHMiLCAiZGl2NHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTCwgImxzbCIsICJsc2wiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTEksICJsc2xpIiwgImxzbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTDIsICJsc2wyIiwgImxzbDIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUiwgImxzciIsICJsc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUkksICJsc3JpIiwgImxzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUjIsICJsc3IyIiwgImxzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUiwgImFzciIsICJhc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUkksICJhc3JpIiwgImFzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUjIsICJhc3IyIiwgImFzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERJOCwgImxkaTgiLCAibGRpOjgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MREkyMCwgImxkaTIwIiwgImxkaToyMCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xESTMyLCAibGRpMzIiLCAibGRpOjMyIiwgNDgsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEVUgsICJsZHVoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzLCAibGRyMTMiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUgsICJsZHIxM3VoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUIsICJsZHIxM3ViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTQsICJsZHIxNCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVSCwgImxkcjE0dWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVQiwgImxkcjE0dWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNSwgImxkcjE1IiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1R1IsICJsZHIxNWdyIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNURSLCAibGRyMTVkciIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNVBTLCAibGRyMTVwcyIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCRSaiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTMsICJzdHIxMyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxM0gsICJzdHIxM2giLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjEzQiwgInN0cjEzYiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTQsICJzdHIxNCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNEgsICJzdHIxNGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE0QiwgInN0cjE0YiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTUsICJzdHIxNSIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNUdSLCAic3RyMTVnciIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSczIsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVEUiwgInN0cjE1ZHIiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkcHMsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVQUywgInN0cjE1cHMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PViwgIm1vdiIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1ZEUiwgIm1vdmRyIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WUFMsICJtb3ZwcyIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyRFIsICJtb3YyZHIiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyUFMsICJtb3YycHMiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogam1wIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBqbXA6ZCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fSk1QRCwgImptcGQiLCAiam1wOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTFIsICJjYWxsciIsICJjYWxsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExSRCwgImNhbGxyZCIsICJjYWxsOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTEwsICJjYWxsIiwgImNhbGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExELCAiY2FsbGQiLCAiY2FsbDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1JFVCwgInJldCIsICJyZXQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICBGUjMwX0lOU05fUkVUX0QsICJyZXQ6ZCIsICJyZXQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBpbnQgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fSU5ULCAiaW50IiwgImludCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0lOVEUsICJpbnRlIiwgImludGUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldGkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9SRVRJLCAicmV0aSIsICJyZXRpIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JSQUQsICJicmFkIiwgImJyYTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlJBLCAiYnJhIiwgImJyYSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOT0QsICJibm9kIiwgImJubzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOTywgImJubyIsICJibm8iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRRCwgImJlcWQiLCAiYmVxOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkVELCAiYm5lZCIsICJibmU6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkNELCAiYmNkIiwgImJjOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQywgImJjIiwgImJjIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQ0QsICJibmNkIiwgImJuYzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQywgImJuYyIsICJibmMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkQsICJibmQiLCAiYm46ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOLCAiYm4iLCAiYm4iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUEQsICJicGQiLCAiYnA6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JQLCAiYnAiLCAiYnAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVkQsICJidmQiLCAiYnY6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JWLCAiYnYiLCAiYnYiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WRCwgImJudmQiLCAiYm52OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WLCAiYm52IiwgImJudiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFRELCAiYmx0ZCIsICJibHQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFQsICJibHQiLCAiYmx0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRUQsICJiZ2VkIiwgImJnZTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRSwgImJnZSIsICJiZ2UiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFRCwgImJsZWQiLCAiYmxlOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFLCAiYmxlIiwgImJsZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1RELCAiYmd0ZCIsICJiZ3Q6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1QsICJiZ3QiLCAiYmd0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMU0QsICJibHNkIiwgImJsczpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMUywgImJscyIsICJibHMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJRCwgImJoaWQiLCAiYmhpOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJLCAiYmhpIiwgImJoaSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxMywgImRtb3ZyMTMiLCAiZG1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0gsICJkbW92cjEzaCIsICJkbW92aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0IsICJkbW92cjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUEksICJkbW92cjEzcGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElILCAiZG1vdnIxM3BpaCIsICJkbW92aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElCLCAiZG1vdnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjE1UEksICJkbW92cjE1cGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCwkUjEzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTMsICJkbW92MnIxMyIsICJkbW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM0gsICJkbW92MnIxM2giLCAiZG1vdmgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzQiwgImRtb3YycjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCAiZG1vdjJyMTNwaSIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzUElILCAiZG1vdjJyMTNwaWgiLCAiZG1vdmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNQSUIsICJkbW92MnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxNVBELCAiZG1vdjJyMTVwZCIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSRVMsICJsZHJlcyIsICJsZHJlcyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cmVzICR1NCxAJFJpKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUkVTLCAic3RyZXMiLCAic3RyZXMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QT1AsICJjb3BvcCIsICJjb3BvcCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BMRCwgImNvcGxkIiwgImNvcGxkIiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUFNULCAiY29wc3QiLCAiY29wc3QiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QU1YsICJjb3BzdiIsICJjb3BzdiIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRjY3IgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5EQ0NSLCAiYW5kY2NyIiwgImFuZGNjciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SQ0NSLCAib3JjY3IiLCAib3JjY3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVElMTSwgInN0aWxtIiwgInN0aWxtIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkc3AgJHMxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERFNQLCAiYWRkc3AiLCAiYWRkc3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRTQiwgImV4dHNiIiwgImV4dHNiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUVUIsICJleHR1YiIsICJleHR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFNILCAiZXh0c2giLCAiZXh0c2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRVSCwgImV4dHVoIiwgImV4dHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xETTAsICJsZG0wIiwgImxkbTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRE0xLCAibGRtMSIsICJsZG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUTTAsICJzdG0wIiwgInN0bTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVE0xLCAic3RtMSIsICJzdG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VOVEVSLCAiZW50ZXIiLCAiZW50ZXIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xFQVZFLCAibGVhdmUiLCAibGVhdmUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fWENIQiwgInhjaGIiLCAieGNoYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIGZyMzBfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBmcjMwX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgZnIzMF9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1mcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgZnIzMF9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIGZyMzBfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWZyMzBfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAoZnIzMF9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBmcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICAvKiBJbml0aWFsaXNlIGZsYWdzLiAgKi8KLSAgY2QtPnNpZ25lZF9vdmVyZmxvd19va19wID0gMDsKLSAgCi0gIHJldHVybiAoQ0dFTl9DUFVfREVTQykgY2Q7Ci19Ci0KLS8qIENvdmVyIGZuIHRvIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIG9mIDEgaXNhLCAxIG1hY2guCi0gICBNQUNIX05BTUUgaXMgdGhlIGJmZCBuYW1lIG9mIHRoZSBtYWNoLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotZnIzMF9jZ2VuX2NwdV9vcGVuXzEgKG1hY2hfbmFtZSwgZW5kaWFuKQotICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0gICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotewotICByZXR1cm4gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORElBTiwgZW5kaWFuLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5EKTsKLX0KLQotLyogQ2xvc2UgYSBjcHUgdGFibGUuCi0gICA/Pz8gVGhpcyBjYW4gbGl2ZSBpbiBhIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmlsZSwgYnV0IHRoZXJlJ3MgY3VycmVudGx5Ci0gICBubyBwbGFjZSB0byBwdXQgdGhpcyBmaWxlICh0aGVyZSdzIG5vIGxpYmNnZW4pLiAgbGlib3Bjb2RlcyBpcyB0aGUgd3JvbmcKLSAgIHBsYWNlIGFzIHNvbWUgc2ltdWxhdG9yIHBvcnRzIHVzZSB0aGlzIGJ1dCB0aGV5IGRvbid0IHVzZSBsaWJvcGNvZGVzLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2NwdV9jbG9zZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGlmIChjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kZXNjLmggYi9vcGNvZGVzL2ZyMzAtZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU5MjE5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfQ1BVX0gKLSNkZWZpbmUgRlIzMF9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBmcjMwCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gZnIzMF9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKGZyMzAsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX0ZSMzBCRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNaW5pbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUlOX0lOU05fU0laRSAyCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDYKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMAotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBzeW50YXggYnl0ZXMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX0FDVFVBTF9NQVhfU1lOVEFYX0JZVEVTIDE1Ci0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9BQ1RVQUxfTUFYX0lGTVRfT1BFUkFORFMgNwotCi0vKiBFbnVtcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AxIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMSB7Ci0gIE9QMV8wLCBPUDFfMSwgT1AxXzIsIE9QMV8zCi0gLCBPUDFfNCwgT1AxXzUsIE9QMV82LCBPUDFfNwotICwgT1AxXzgsIE9QMV85LCBPUDFfQSwgT1AxX0IKLSAsIE9QMV9DLCBPUDFfRCwgT1AxX0UsIE9QMV9GCi19IElOU05fT1AxOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyX0EsIE9QMl9CCi0gLCBPUDJfQywgT1AyX0QsIE9QMl9FLCBPUDJfRgotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDMgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AzIHsKLSAgT1AzXzAsIE9QM18xLCBPUDNfMiwgT1AzXzMKLSAsIE9QM180LCBPUDNfNSwgT1AzXzYsIE9QM183Ci0gLCBPUDNfOCwgT1AzXzksIE9QM19BLCBPUDNfQgotICwgT1AzX0MsIE9QM19ELCBPUDNfRSwgT1AzX0YKLX0gSU5TTl9PUDM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3A0IGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wNCB7Ci0gIE9QNF8wCi19IElOU05fT1A0OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDUgewotICBPUDVfMCwgT1A1XzEKLX0gSU5TTl9PUDU7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gY2MgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fY2MgewotICBDQ19SQSwgQ0NfTk8sIENDX0VRLCBDQ19ORQotICwgQ0NfQywgQ0NfTkMsIENDX04sIENDX1AKLSAsIENDX1YsIENDX05WLCBDQ19MVCwgQ0NfR0UKLSAsIENDX0xFLCBDQ19HVCwgQ0NfTFMsIENDX0hJCi19IElOU05fQ0M7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gZ3JfbmFtZXMgewotICBIX0dSX1IwID0gMCwgSF9HUl9SMSA9IDEsIEhfR1JfUjIgPSAyLCBIX0dSX1IzID0gMwotICwgSF9HUl9SNCA9IDQsIEhfR1JfUjUgPSA1LCBIX0dSX1I2ID0gNiwgSF9HUl9SNyA9IDcKLSAsIEhfR1JfUjggPSA4LCBIX0dSX1I5ID0gOSwgSF9HUl9SMTAgPSAxMCwgSF9HUl9SMTEgPSAxMQotICwgSF9HUl9SMTIgPSAxMiwgSF9HUl9SMTMgPSAxMywgSF9HUl9SMTQgPSAxNCwgSF9HUl9SMTUgPSAxNQotICwgSF9HUl9BQyA9IDEzLCBIX0dSX0ZQID0gMTQsIEhfR1JfU1AgPSAxNQotfSBHUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBjcl9uYW1lcyB7Ci0gIEhfQ1JfQ1IwLCBIX0NSX0NSMSwgSF9DUl9DUjIsIEhfQ1JfQ1IzCi0gLCBIX0NSX0NSNCwgSF9DUl9DUjUsIEhfQ1JfQ1I2LCBIX0NSX0NSNwotICwgSF9DUl9DUjgsIEhfQ1JfQ1I5LCBIX0NSX0NSMTAsIEhfQ1JfQ1IxMQotICwgSF9DUl9DUjEyLCBIX0NSX0NSMTMsIEhfQ1JfQ1IxNCwgSF9DUl9DUjE1Ci19IENSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGRyX25hbWVzIHsKLSAgSF9EUl9UQlIsIEhfRFJfUlAsIEhfRFJfU1NQLCBIX0RSX1VTUAotICwgSF9EUl9NREgsIEhfRFJfTURMCi19IERSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX0ZSMzAsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfRlIzMCwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX0VORF9CT09MUywgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKLX0gQ0dFTl9JRkxEX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpZmllbGQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKLSAgRlIzMF9GX05JTCwgRlIzMF9GX09QMSwgRlIzMF9GX09QMiwgRlIzMF9GX09QMwotICwgRlIzMF9GX09QNCwgRlIzMF9GX09QNSwgRlIzMF9GX0NDLCBGUjMwX0ZfQ0NDCi0gLCBGUjMwX0ZfUkosIEZSMzBfRl9SSSwgRlIzMF9GX1JTMSwgRlIzMF9GX1JTMgotICwgRlIzMF9GX1JKQywgRlIzMF9GX1JJQywgRlIzMF9GX0NSSiwgRlIzMF9GX0NSSQotICwgRlIzMF9GX1U0LCBGUjMwX0ZfVTRDLCBGUjMwX0ZfSTQsIEZSMzBfRl9NNAotICwgRlIzMF9GX1U4LCBGUjMwX0ZfSTgsIEZSMzBfRl9JMjBfNCwgRlIzMF9GX0kyMF8xNgotICwgRlIzMF9GX0kyMCwgRlIzMF9GX0kzMiwgRlIzMF9GX1VESVNQNiwgRlIzMF9GX0RJU1A4Ci0gLCBGUjMwX0ZfRElTUDksIEZSMzBfRl9ESVNQMTAsIEZSMzBfRl9TMTAsIEZSMzBfRl9VMTAKLSAsIEZSMzBfRl9SRUw5LCBGUjMwX0ZfRElSOCwgRlIzMF9GX0RJUjksIEZSMzBfRl9ESVIxMAotICwgRlIzMF9GX1JFTDEyLCBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgRlIzMF9GX1JFR0xJU1RfTE9XX1NULCBGUjMwX0ZfUkVHTElTVF9ISV9MRAotICwgRlIzMF9GX1JFR0xJU1RfTE9XX0xELCBGUjMwX0ZfTUFYCi19IElGSUVMRF9UWVBFOwotCi0jZGVmaW5lIE1BWF9JRkxEICgoaW50KSBGUjMwX0ZfTUFYKQotCi0vKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7Ci0gIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKLSAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUwotfSBDR0VOX0hXX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaGFyZHdhcmUgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7Ci0gIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCi0gLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0dSLCBIV19IX0NSCi0gLCBIV19IX0RSLCBIV19IX1BTLCBIV19IX1IxMywgSFdfSF9SMTQKLSAsIEhXX0hfUjE1LCBIV19IX05CSVQsIEhXX0hfWkJJVCwgSFdfSF9WQklUCi0gLCBIV19IX0NCSVQsIEhXX0hfSUJJVCwgSFdfSF9TQklULCBIV19IX1RCSVQKLSAsIEhXX0hfRDBCSVQsIEhXX0hfRDFCSVQsIEhXX0hfQ0NSLCBIV19IX1NDUgotICwgSFdfSF9JTE0sIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYLCBDR0VOX09QRVJBTkRfRU5EX0JPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fT1BFUkFORF9NQUNICi0gLCBDR0VOX09QRVJBTkRfRU5EX05CT09MUwotfSBDR0VOX09QRVJBTkRfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5fb3BlcmFuZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIChDR0VOX09QRVJBTkRfRU5EX05CT09MUyAtIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIG9wZXJhbmQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsKLSAgRlIzMF9PUEVSQU5EX1BDLCBGUjMwX09QRVJBTkRfUkksIEZSMzBfT1BFUkFORF9SSiwgRlIzMF9PUEVSQU5EX1JJQwotICwgRlIzMF9PUEVSQU5EX1JKQywgRlIzMF9PUEVSQU5EX0NSSSwgRlIzMF9PUEVSQU5EX0NSSiwgRlIzMF9PUEVSQU5EX1JTMQotICwgRlIzMF9PUEVSQU5EX1JTMiwgRlIzMF9PUEVSQU5EX1IxMywgRlIzMF9PUEVSQU5EX1IxNCwgRlIzMF9PUEVSQU5EX1IxNQotICwgRlIzMF9PUEVSQU5EX1BTLCBGUjMwX09QRVJBTkRfVTQsIEZSMzBfT1BFUkFORF9VNEMsIEZSMzBfT1BFUkFORF9VOAotICwgRlIzMF9PUEVSQU5EX0k4LCBGUjMwX09QRVJBTkRfVURJU1A2LCBGUjMwX09QRVJBTkRfRElTUDgsIEZSMzBfT1BFUkFORF9ESVNQOQotICwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgRlIzMF9PUEVSQU5EX1MxMCwgRlIzMF9PUEVSQU5EX1UxMCwgRlIzMF9PUEVSQU5EX0kzMgotICwgRlIzMF9PUEVSQU5EX000LCBGUjMwX09QRVJBTkRfSTIwLCBGUjMwX09QRVJBTkRfRElSOCwgRlIzMF9PUEVSQU5EX0RJUjkKLSAsIEZSMzBfT1BFUkFORF9ESVIxMCwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRAotICwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsIEZSMzBfT1BFUkFORF9DQwotICwgRlIzMF9PUEVSQU5EX0NDQywgRlIzMF9PUEVSQU5EX05CSVQsIEZSMzBfT1BFUkFORF9WQklULCBGUjMwX09QRVJBTkRfWkJJVAotICwgRlIzMF9PUEVSQU5EX0NCSVQsIEZSMzBfT1BFUkFORF9JQklULCBGUjMwX09QRVJBTkRfU0JJVCwgRlIzMF9PUEVSQU5EX1RCSVQKLSAsIEZSMzBfT1BFUkFORF9EMEJJVCwgRlIzMF9PUEVSQU5EX0QxQklULCBGUjMwX09QRVJBTkRfQ0NSLCBGUjMwX09QRVJBTkRfU0NSCi0gLCBGUjMwX09QRVJBTkRfSUxNLCBGUjMwX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIEZSMzBfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgOAotCi0vKiBJbnNuIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pbnNuIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUywgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEkKLSAsIENHRU5fSU5TTl9TS0lQX0NUSSwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWAotICwgQ0dFTl9JTlNOX05PX0RJUywgQ0dFTl9JTlNOX1BCQiwgQ0dFTl9JTlNOX05PVF9JTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fRU5EX0JPT0xTCi0gLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fRU5EX05CT09MUwotfSBDR0VOX0lOU05fQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbl9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIChDR0VOX0lOU05fRU5EX05CT09MUyAtIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBjZ2VuLmggdXNlcyB0aGluZ3Mgd2UganVzdCBkZWZpbmVkLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2luc25fYXR0cl90YWJsZVtdOwotCi0vKiBIYXJkd2FyZSBkZWNscy4gICovCi0KLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcHM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxMzsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE0OwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTU7Ci0KLQotCi0KLSNlbmRpZiAvKiBGUjMwX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGlzLmMgYi9vcGNvZGVzL2ZyMzAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjkxNWIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1kaXMuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBEZWZhdWx0IHRleHQgdG8gcHJpbnQgaWYgYW4gaW5zdHJ1Y3Rpb24gaXNuJ3QgcmVjb2duaXplZC4gICovCi0jZGVmaW5lIFVOS05PV05fSU5TTl9NU0cgXygiKnVua25vd24qIikKLQotc3RhdGljIHZvaWQgcHJpbnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIENHRU5fS0VZV09SRCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRklFTERTICosCi0JICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwKLQkJCSAgICAgICBkaXNhc3NlbWJsZV9pbmZvICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGRlZmF1bHRfcHJpbnRfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQwKLS8qIC0tIGRpc2Fzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGRpcy5jICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIG9mZnNldCwgbG9hZF9zdG9yZSkKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gZGlzX2luZm87Ci0gIGludCBtYXNrOwotICBpbnQgaW5kZXggPSAwOwotICBjaGFyKiBjb21tYSA9ICIiOwotCi0gIGlmIChsb2FkX3N0b3JlKQotICAgIG1hc2sgPSAweDgwOwotICBlbHNlCi0gICAgbWFzayA9IDE7Ci0KLSAgaWYgKHZhbHVlICYgbWFzaykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlaSIsIGluZGV4ICsgb2Zmc2V0KTsKLSAgICAgIGNvbW1hID0gIiwiOwotICAgIH0KLSAgICAKLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IDc7ICsraW5kZXgpCi0gICAgewotICAgICAgaWYgKGxvYWRfc3RvcmUpCi0JbWFzayA+Pj0gMTsKLSAgICAgIGVsc2UKLQltYXNrIDw8PSAxOwotCi0gICAgICBpZiAodmFsdWUgJiBtYXNrKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNyJWkiLCBjb21tYSwgaW5kZXggKyBvZmZzZXQpOwotCSAgY29tbWEgPSAiLCI7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDgsIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X200IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci19Ci0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBwcmludGluZyBvcGVyYW5kcy4KLSAgIFhJTkZPIGlzIGEgYHZvaWQgKicgYW5kIG5vdCBhIGBkaXNhc3NlbWJsZV9pbmZvIConIHRvIG5vdCBwdXQgYSByZXF1aXJlbWVudAotICAgb2YgZGlzLWFzbS5oIG9uIGNnZW4uaC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotdm9pZAotZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCB4aW5mbywgZmllbGRzLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIFBUUiB4aW5mbzsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgdm9pZCBjb25zdCAqYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIHhpbmZvOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfQ1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JpLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaWMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmosIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsIGZpZWxkcy0+Zl9SczIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfY2NjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXIxMCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI4LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2RpcjksIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTAsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A5LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kyMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1ZJUlRVQUwpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTMyLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfU0lHTl9PUFQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsMTIsIDB8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWw5LCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgcHJpbnRfbTQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfbTQsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfczEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3UxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91NGMsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U4LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWRpc3A2LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBmcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fZnIzMCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX2ZyMzAKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgZnIzMF9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBmcjMwX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBmcjMwX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtaWJsZC5jIGIvb3Bjb2Rlcy9mcjMwLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNDQ1OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MyArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIGZyMzAuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1mcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfQ1JqLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmksIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmljLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmpjLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMiwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfY2NjLCAwLCAxNiwgMCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlyOCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotewotICBGTEQgKGZfaTIwXzQpID0gKCh1bnNpZ25lZCBpbnQpIChGTEQgKGZfaTIwKSkgPj4gKDE2KSk7Ci0gIEZMRCAoZl9pMjBfMTYpID0gKChGTEQgKGZfaTIwKSkgJiAoNjU1MzUpKTsKLX0KLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfNCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfMTYsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pOCwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSArICgyKSkpKSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpICYgKDE1KSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTRjLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgZXh0cmFjdGlvbi4KLSAgIFRoZSByZXN1bHQgaXMgPD0gMCBmb3IgZXJyb3IsID4wIGZvciBzdWNjZXNzLgotICAgPz8/IEFjdHVhbCB2YWx1ZXMgYXJlbid0IHdlbGwgZGVmaW5lZCByaWdodCBub3cuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWludAotZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogQXNzdW1lIHN1Y2Nlc3MgKGZvciB0aG9zZSBvcGVyYW5kcyB0aGF0IGFyZSBub3BzKS4gICovCi0gIGludCBsZW5ndGggPSAxOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmpjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9jY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlyOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMjBfNCk7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzE2KTsKLXsKLSAgRkxEIChmX2kyMCkgPSAoKCgoRkxEIChmX2kyMF80KSkgPDwgKDE2KSkpIHwgKEZMRCAoZl9pMjBfMTYpKSk7Ci19Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMzIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91OCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKLXsKLSAgaW5zZXJ0X2luc25fbm9ybWFsLAotfTsKLQotY2dlbl9leHRyYWN0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAotewotICBleHRyYWN0X2luc25fbm9ybWFsLAotfTsKLQotLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLWludAotZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0YzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotYmZkX3ZtYQotZnIzMF9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBiZmRfdm1hIHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBmaWVsZHMtPmZfQ1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBmaWVsZHMtPmZfUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBmaWVsZHMtPmZfUmljID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBmaWVsZHMtPmZfUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBmaWVsZHMtPmZfUmpjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZmllbGRzLT5mX1JzMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGZpZWxkcy0+Zl9SczIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZmllbGRzLT5mX2kyMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGZpZWxkcy0+Zl9pMzIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGZpZWxkcy0+Zl9pOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBmaWVsZHMtPmZfdTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBmaWVsZHMtPmZfdTRjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBmaWVsZHMtPmZfdTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKLQotICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBmcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQ7Ci0gIGNkLT5leHRyYWN0X29wZXJhbmQgPSBmcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kOwotCi0gIGNkLT5nZXRfaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X2ludF9vcGVyYW5kOwotICBjZC0+c2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKLSAgY2QtPmdldF92bWFfb3BlcmFuZCA9IGZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQ7Ci0gIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5jIGIvb3Bjb2Rlcy9mcjMwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE3ZTBhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotCi0vKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgotICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLXN0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKLSAgMCwgMCwgMHgwLCB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkopLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkaSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfTTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MHMgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYzID0gewotICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX09QNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTggPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMCA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0kyMCksIEYgKEZfT1AyKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMyID0gewotICAxNiwgNDgsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfSTMyKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1AxMCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNHVoID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDkpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1YiA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VRElTUDYpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTVkciA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SUzIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tb3ZkciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUlMxKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NhbGwgPSB7Ci0gIDE2LCAxNiwgMHhmODAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDUpLCBGIChGX1JFTDEyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfaW50ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYWQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQyksIEYgKEZfUkVMOSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTMgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2ggPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzYiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcG9wID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcGxkID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkpDKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcHN0ID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX1JJQyksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZHNwID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9TMTApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19MRCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkbTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19TVCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0bTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbnRlciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTEwKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyB7IDAgfSB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGE2MDAgfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhNDAwIH0KLSAgfSwKLS8qIGFkZDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE1MDAgfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNzAwIH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTIwMCB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhMDAwIH0KLSAgfSwKLS8qIGFkZG4yICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhMTAwIH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYzAwIH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWQwMCB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFlMDAgfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFhMDAgfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhODAwIH0KLSAgfSwKLS8qIGNtcDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE5MDAgfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgyMDAgfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTIwMCB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWEwMCB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODQwMCB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg1MDAgfQotICB9LAotLyogYW5kYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NjAwIH0KLSAgfSwKLS8qIG9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk0MDAgfQotICB9LAotLyogb3JoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk1MDAgfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk2MDAgfQotICB9LAotLyogZW9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDljMDAgfQotICB9LAotLyogZW9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5ZDAwIH0KLSAgfSwKLS8qIGVvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWUwMCB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODAwMCB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MDAwIH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5ODAwIH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4MTAwIH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDkxMDAgfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDk5MDAgfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg4MDAgfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg5MDAgfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFmMDAgfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYjAwIH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmYwMCB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiYjAwIH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc0MCB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NTAgfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NjAgfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NzAgfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY2MCB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY3MCB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjYwMCB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI0MDAgfQotICB9LAotLyogbHNsMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjUwMCB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjIwMCB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIwMDAgfQotICB9LAotLyogbHNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjEwMCB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmEwMCB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI4MDAgfQotICB9LAotLyogYXNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjkwMCB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4LCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMCwgeyAweDliMDAgfQotICB9LAotLyogbGRpOjMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzIsIHsgMHg5ZjgwIH0KLSAgfSwKLS8qIGxkIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDQwMCB9Ci0gIH0sCi0vKiBsZHVoIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDUwMCB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDYwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDAgfQotICB9LAotLyogbGR1aCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjAwIH0KLSAgfSwKLS8qIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDIwMDAgfQotICB9LAotLyogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDkpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHViLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTUsJHVkaXNwNiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTUsIHsgMHgzMDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcwMCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJzMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSUzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDc4MCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg3OTAgfQotICB9LAotLyogc3QgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTQwMCB9Ci0gIH0sCi0vKiBzdGggJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTUwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTYwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTEwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMjAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTQsJGRpc3AxMCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQMTApLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDMwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTQsJGRpc3A5KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1aCwgeyAweDUwMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDcwMDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MTMwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcwMCB9Ci0gIH0sCi0vKiBzdCAkUnMyLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJTMiksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDE3ODAgfQotICB9LAotLyogc3QgJHBzLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFBTKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4MTc5MCB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OGIwMCB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzEpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGI3MDAgfQotICB9LAotLyogbW92ICRwcywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcxMCB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFJTMSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGIzMDAgfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4NzEwIH0KLSAgfSwKLS8qIGptcCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3MDAgfQotICB9LAotLyogam1wOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjAwIH0KLSAgfSwKLS8qIGNhbGwgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzEwIH0KLSAgfSwKLS8qIGNhbGw6ZCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDlmMTAgfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQwMDAgfQotICB9LAotLyogY2FsbDpkICRsYWJlbDEyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUwxMiksIDAgfSB9LAotICAgICYgaWZtdF9jYWxsLCB7IDB4ZDgwMCB9Ci0gIH0sCi0vKiByZXQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDk3MjAgfQotICB9LAotLyogcmV0OmQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMjAgfQotICB9LAotLyogaW50ICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDFmMDAgfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWYzMCB9Ci0gIH0sCi0vKiByZXRpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzMwIH0KLSAgfSwKLS8qIGJyYTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYwMDAgfQotICB9LAotLyogYnJhICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUwMDAgfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjEwMCB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTEwMCB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMjAwIH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMjAwIH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYzMDAgfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUzMDAgfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNDAwIH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU0MDAgfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjUwMCB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTUwMCB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY2MDAgfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTYwMCB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY3MDAgfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTcwMCB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY4MDAgfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTgwMCB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmOTAwIH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlOTAwIH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZhMDAgfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVhMDAgfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmIwMCB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWIwMCB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYzAwIH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYzAwIH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZkMDAgfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVkMDAgfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmUwMCB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWUwMCB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZjAwIH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZjAwIH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MTgwMCB9Ci0gIH0sCi0vKiBkbW92aCAkUjEzLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDE5MDAgfQotICB9LAotLyogZG1vdmIgJFIxMyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxYTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJFIxMyssQCRkaXI5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDFkMDAgfQotICB9LAotLyogZG1vdmIgQCRSMTMrLEAkZGlyOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxZTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWIwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDgwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDkwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI5KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweGQwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI4KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGIwMCB9Ci0gIH0sCi0vKiBsZHJlcyBAJFJpKywkdTQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgJysnLCAnLCcsIE9QIChVNCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmMwMCB9Ci0gIH0sCi0vKiBzdHJlcyAkdTQsQCRSaSsgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmQwMCB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcG9wLCB7IDB4OWZjMCB9Ci0gIH0sCi0vKiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoUkpDKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcGxkLCB7IDB4OWZkMCB9Ci0gIH0sCi0vKiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZlMCB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZmMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmYTAgfQotICB9LAotLyogYW5kY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDgzMDAgfQotICB9LAotLyogb3JjY3IgJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4OTMwMCB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4NzAwIH0KLSAgfSwKLS8qIGFkZHNwICRzMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkc3AsIHsgMHhhMzAwIH0KLSAgfSwKLS8qIGV4dHNiICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc4MCB9Ci0gIH0sCi0vKiBleHR1YiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3OTAgfQotICB9LAotLyogZXh0c2ggJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5N2EwIH0KLSAgfSwKLS8qIGV4dHVoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdiMCB9Ci0gIH0sCi0vKiBsZG0wICgkcmVnbGlzdF9sb3dfbGQpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTAsIHsgMHg4YzAwIH0KLSAgfSwKLS8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTEsIHsgMHg4ZDAwIH0KLSAgfSwKLS8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfTE9XX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMCwgeyAweDhlMDAgfQotICB9LAotLyogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0hJX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMSwgeyAweDhmMDAgfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFUxMCksIDAgfSB9LAotICAgICYgaWZtdF9lbnRlciwgeyAweGYwMCB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY5MCB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhhMDAgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLS8qIEZvcm1hdHMgZm9yIEFMSUFTIG1hY3JvLWluc25zLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4bSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0k4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTIwbSA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkkpLCBGIChGX0kyMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMybSA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIEYgKEZfSTMyKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0vKiBFYWNoIG5vbi1zaW1wbGUgbWFjcm8gZW50cnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVtdID0KLXsKLS8qIGxkaTggJGk4LCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGk4bSIsICJsZGk4IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTIwICRpMjAsJFJpICovCi0gIHsKLSAgICAtMSwgImxkaTIwbSIsICJsZGkyMCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkzMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkzMm0iLCAibGRpMzIiLCA0OCwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJOCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaThtLCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkyMCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTIwbSwgeyAweDliMDAgfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMzIpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkzMm0sIHsgMHg5ZjgwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5oIGIvb3Bjb2Rlcy9mcjMwLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg3ZWQ1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfT1BDX0gKLSNkZWZpbmUgRlIzMF9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0vKiA/Pz8gVGhpcyBjYW4gYmUgaW1wcm92ZWQgdXBvbi4gICovCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAxNgotI3VuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSA+PiA0KQotCi0vKiAtLSAqLwotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpbnN0cnVjdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX3R5cGUgewotICBGUjMwX0lOU05fSU5WQUxJRCwgRlIzMF9JTlNOX0FERCwgRlIzMF9JTlNOX0FEREksIEZSMzBfSU5TTl9BREQyCi0gLCBGUjMwX0lOU05fQUREQywgRlIzMF9JTlNOX0FERE4sIEZSMzBfSU5TTl9BREROSSwgRlIzMF9JTlNOX0FERE4yCi0gLCBGUjMwX0lOU05fU1VCLCBGUjMwX0lOU05fU1VCQywgRlIzMF9JTlNOX1NVQk4sIEZSMzBfSU5TTl9DTVAKLSAsIEZSMzBfSU5TTl9DTVBJLCBGUjMwX0lOU05fQ01QMiwgRlIzMF9JTlNOX0FORCwgRlIzMF9JTlNOX09SCi0gLCBGUjMwX0lOU05fRU9SLCBGUjMwX0lOU05fQU5ETSwgRlIzMF9JTlNOX0FOREgsIEZSMzBfSU5TTl9BTkRCCi0gLCBGUjMwX0lOU05fT1JNLCBGUjMwX0lOU05fT1JILCBGUjMwX0lOU05fT1JCLCBGUjMwX0lOU05fRU9STQotICwgRlIzMF9JTlNOX0VPUkgsIEZSMzBfSU5TTl9FT1JCLCBGUjMwX0lOU05fQkFOREwsIEZSMzBfSU5TTl9CT1JMCi0gLCBGUjMwX0lOU05fQkVPUkwsIEZSMzBfSU5TTl9CQU5ESCwgRlIzMF9JTlNOX0JPUkgsIEZSMzBfSU5TTl9CRU9SSAotICwgRlIzMF9JTlNOX0JUU1RMLCBGUjMwX0lOU05fQlRTVEgsIEZSMzBfSU5TTl9NVUwsIEZSMzBfSU5TTl9NVUxVCi0gLCBGUjMwX0lOU05fTVVMSCwgRlIzMF9JTlNOX01VTFVILCBGUjMwX0lOU05fRElWMFMsIEZSMzBfSU5TTl9ESVYwVQotICwgRlIzMF9JTlNOX0RJVjEsIEZSMzBfSU5TTl9ESVYyLCBGUjMwX0lOU05fRElWMywgRlIzMF9JTlNOX0RJVjRTCi0gLCBGUjMwX0lOU05fTFNMLCBGUjMwX0lOU05fTFNMSSwgRlIzMF9JTlNOX0xTTDIsIEZSMzBfSU5TTl9MU1IKLSAsIEZSMzBfSU5TTl9MU1JJLCBGUjMwX0lOU05fTFNSMiwgRlIzMF9JTlNOX0FTUiwgRlIzMF9JTlNOX0FTUkkKLSAsIEZSMzBfSU5TTl9BU1IyLCBGUjMwX0lOU05fTERJOCwgRlIzMF9JTlNOX0xESTIwLCBGUjMwX0lOU05fTERJMzIKLSAsIEZSMzBfSU5TTl9MRCwgRlIzMF9JTlNOX0xEVUgsIEZSMzBfSU5TTl9MRFVCLCBGUjMwX0lOU05fTERSMTMKLSAsIEZSMzBfSU5TTl9MRFIxM1VILCBGUjMwX0lOU05fTERSMTNVQiwgRlIzMF9JTlNOX0xEUjE0LCBGUjMwX0lOU05fTERSMTRVSAotICwgRlIzMF9JTlNOX0xEUjE0VUIsIEZSMzBfSU5TTl9MRFIxNSwgRlIzMF9JTlNOX0xEUjE1R1IsIEZSMzBfSU5TTl9MRFIxNURSCi0gLCBGUjMwX0lOU05fTERSMTVQUywgRlIzMF9JTlNOX1NULCBGUjMwX0lOU05fU1RILCBGUjMwX0lOU05fU1RCCi0gLCBGUjMwX0lOU05fU1RSMTMsIEZSMzBfSU5TTl9TVFIxM0gsIEZSMzBfSU5TTl9TVFIxM0IsIEZSMzBfSU5TTl9TVFIxNAotICwgRlIzMF9JTlNOX1NUUjE0SCwgRlIzMF9JTlNOX1NUUjE0QiwgRlIzMF9JTlNOX1NUUjE1LCBGUjMwX0lOU05fU1RSMTVHUgotICwgRlIzMF9JTlNOX1NUUjE1RFIsIEZSMzBfSU5TTl9TVFIxNVBTLCBGUjMwX0lOU05fTU9WLCBGUjMwX0lOU05fTU9WRFIKLSAsIEZSMzBfSU5TTl9NT1ZQUywgRlIzMF9JTlNOX01PVjJEUiwgRlIzMF9JTlNOX01PVjJQUywgRlIzMF9JTlNOX0pNUAotICwgRlIzMF9JTlNOX0pNUEQsIEZSMzBfSU5TTl9DQUxMUiwgRlIzMF9JTlNOX0NBTExSRCwgRlIzMF9JTlNOX0NBTEwKLSAsIEZSMzBfSU5TTl9DQUxMRCwgRlIzMF9JTlNOX1JFVCwgRlIzMF9JTlNOX1JFVF9ELCBGUjMwX0lOU05fSU5UCi0gLCBGUjMwX0lOU05fSU5URSwgRlIzMF9JTlNOX1JFVEksIEZSMzBfSU5TTl9CUkFELCBGUjMwX0lOU05fQlJBCi0gLCBGUjMwX0lOU05fQk5PRCwgRlIzMF9JTlNOX0JOTywgRlIzMF9JTlNOX0JFUUQsIEZSMzBfSU5TTl9CRVEKLSAsIEZSMzBfSU5TTl9CTkVELCBGUjMwX0lOU05fQk5FLCBGUjMwX0lOU05fQkNELCBGUjMwX0lOU05fQkMKLSAsIEZSMzBfSU5TTl9CTkNELCBGUjMwX0lOU05fQk5DLCBGUjMwX0lOU05fQk5ELCBGUjMwX0lOU05fQk4KLSAsIEZSMzBfSU5TTl9CUEQsIEZSMzBfSU5TTl9CUCwgRlIzMF9JTlNOX0JWRCwgRlIzMF9JTlNOX0JWCi0gLCBGUjMwX0lOU05fQk5WRCwgRlIzMF9JTlNOX0JOViwgRlIzMF9JTlNOX0JMVEQsIEZSMzBfSU5TTl9CTFQKLSAsIEZSMzBfSU5TTl9CR0VELCBGUjMwX0lOU05fQkdFLCBGUjMwX0lOU05fQkxFRCwgRlIzMF9JTlNOX0JMRQotICwgRlIzMF9JTlNOX0JHVEQsIEZSMzBfSU5TTl9CR1QsIEZSMzBfSU5TTl9CTFNELCBGUjMwX0lOU05fQkxTCi0gLCBGUjMwX0lOU05fQkhJRCwgRlIzMF9JTlNOX0JISSwgRlIzMF9JTlNOX0RNT1ZSMTMsIEZSMzBfSU5TTl9ETU9WUjEzSAotICwgRlIzMF9JTlNOX0RNT1ZSMTNCLCBGUjMwX0lOU05fRE1PVlIxM1BJLCBGUjMwX0lOU05fRE1PVlIxM1BJSCwgRlIzMF9JTlNOX0RNT1ZSMTNQSUIKLSAsIEZSMzBfSU5TTl9ETU9WUjE1UEksIEZSMzBfSU5TTl9ETU9WMlIxMywgRlIzMF9JTlNOX0RNT1YyUjEzSCwgRlIzMF9JTlNOX0RNT1YyUjEzQgotICwgRlIzMF9JTlNOX0RNT1YyUjEzUEksIEZSMzBfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMF9JTlNOX0RNT1YyUjEzUElCLCBGUjMwX0lOU05fRE1PVjJSMTVQRAotICwgRlIzMF9JTlNOX0xEUkVTLCBGUjMwX0lOU05fU1RSRVMsIEZSMzBfSU5TTl9DT1BPUCwgRlIzMF9JTlNOX0NPUExECi0gLCBGUjMwX0lOU05fQ09QU1QsIEZSMzBfSU5TTl9DT1BTViwgRlIzMF9JTlNOX05PUCwgRlIzMF9JTlNOX0FORENDUgotICwgRlIzMF9JTlNOX09SQ0NSLCBGUjMwX0lOU05fU1RJTE0sIEZSMzBfSU5TTl9BRERTUCwgRlIzMF9JTlNOX0VYVFNCCi0gLCBGUjMwX0lOU05fRVhUVUIsIEZSMzBfSU5TTl9FWFRTSCwgRlIzMF9JTlNOX0VYVFVILCBGUjMwX0lOU05fTERNMAotICwgRlIzMF9JTlNOX0xETTEsIEZSMzBfSU5TTl9TVE0wLCBGUjMwX0lOU05fU1RNMSwgRlIzMF9JTlNOX0VOVEVSCi0gLCBGUjMwX0lOU05fTEVBVkUsIEZSMzBfSU5TTl9YQ0hCLCBGUjMwX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBGUjMwX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIEZSMzBfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX29wMzsKLSAgbG9uZyBmX29wNDsKLSAgbG9uZyBmX29wNTsKLSAgbG9uZyBmX2NjOwotICBsb25nIGZfY2NjOwotICBsb25nIGZfUmo7Ci0gIGxvbmcgZl9SaTsKLSAgbG9uZyBmX1JzMTsKLSAgbG9uZyBmX1JzMjsKLSAgbG9uZyBmX1JqYzsKLSAgbG9uZyBmX1JpYzsKLSAgbG9uZyBmX0NSajsKLSAgbG9uZyBmX0NSaTsKLSAgbG9uZyBmX3U0OwotICBsb25nIGZfdTRjOwotICBsb25nIGZfaTQ7Ci0gIGxvbmcgZl9tNDsKLSAgbG9uZyBmX3U4OwotICBsb25nIGZfaTg7Ci0gIGxvbmcgZl9pMjBfNDsKLSAgbG9uZyBmX2kyMF8xNjsKLSAgbG9uZyBmX2kyMDsKLSAgbG9uZyBmX2kzMjsKLSAgbG9uZyBmX3VkaXNwNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDk7Ci0gIGxvbmcgZl9kaXNwMTA7Ci0gIGxvbmcgZl9zMTA7Ci0gIGxvbmcgZl91MTA7Ci0gIGxvbmcgZl9yZWw5OwotICBsb25nIGZfZGlyODsKLSAgbG9uZyBmX2Rpcjk7Ci0gIGxvbmcgZl9kaXIxMDsKLSAgbG9uZyBmX3JlbDEyOwotICBsb25nIGZfcmVnbGlzdF9oaV9zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X3N0OwotICBsb25nIGZfcmVnbGlzdF9oaV9sZDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X2xkOwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIEZSMzBfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvaDgzMDAtZGlzLmMgYi9vcGNvZGVzL2g4MzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZkYmM5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaDgzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaDgzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jZGVmaW5lIGg4X29wY29kZXMgaDhvcHMKLSNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLQotLyogUnVuIHRocm91Z2ggdGhlIG9wY29kZXMgYW5kIHNvcnQgdGhlbSBpbnRvIG9yZGVyIHRvIG1ha2UgdGhlbSBlYXN5Ci0gICB0byBkaXNhc3NlbWJsZS4gICovCi1zdGF0aWMgdm9pZAotYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0KLSAgZm9yIChwID0gaDhfb3Bjb2RlczsgcC0+bmFtZTsgcCsrKQotICAgIHsKLSAgICAgIGludCBuMSA9IDA7Ci0gICAgICBpbnQgbjIgPSAwOwotCi0gICAgICBpZiAoKGludCkgcC0+ZGF0YS5uaWJbMF0gPCAxNikKLQluMSA9IChpbnQpIHAtPmRhdGEubmliWzBdOwotICAgICAgZWxzZQotCW4xID0gMDsKLSAgICAgIAotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCi0JbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKLSAgICAgIGVsc2UKLQluMiA9IDA7Ci0KLSAgICAgIC8qIEp1c3QgbWFrZSBzdXJlIHRoZXJlIGFyZSBhbiBldmVuIG51bWJlciBvZiBuaWJibGVzIGluIGl0LCBhbmQKLQkgdGhhdCB0aGUgY291bnQgaXMgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aC4gICovCi0gICAgICBmb3IgKGkgPSAwOyBwLT5kYXRhLm5pYltpXSAhPSBFOyBpKyspCi0JLypFTVBUWSovOwotICAgICAgCi0gICAgICBpZiAoaSAmIDEpCi0JYWJvcnQgKCk7Ci0gICAgICAKLSAgICAgIHAtPmxlbmd0aCA9IGkgLyAyOwotICAgIH0KLX0KLQotCi11bnNpZ25lZCBpbnQKLWJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgbW9kZSkKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbW9kZTsKLXsKLSAgLyogRmluZCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGZvciB0aGlzIG9wY29kZS4gICovCi0gIHN0YXRpYyBDT05TVCBjaGFyICpyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAicjBoIiwgInIxaCIsICJyMmgiLCAicjNoIiwgInI0aCIsICJyNWgiLCAicjZoIiwgInI3aCIsCi0gICAgICAicjBsIiwgInIxbCIsICJyMmwiLCAicjNsIiwgInI0bCIsICJyNWwiLCAicjZsIiwgInI3bCIKLSAgICB9OwotICBzdGF0aWMgQ09OU1QgY2hhciAqd3JlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCi0gICAgICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciCi0gICAgfTsKLSAgc3RhdGljIENPTlNUIGNoYXIgKmxyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIsCi0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIKLSAgICB9OwotICBpbnQgcnMgPSAwOwotICBpbnQgcmQgPSAwOwotICBpbnQgcmRpc3AgPSAwOwotICBpbnQgYWJzID0gMDsKLSAgaW50IGJpdCA9IDA7Ci0gIGludCBwbGVuID0gMDsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdCA9IDA7Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnEgPSBoOF9vcGNvZGVzOwotICBjaGFyIENPTlNUICoqcHJlZ25hbWVzID0gbW9kZSAhPSAwID8gbHJlZ25hbWVzIDogd3JlZ25hbWVzOwotICBpbnQgc3RhdHVzOwotICBpbnQgbDsKLSAgdW5zaWduZWQgY2hhciBkYXRhWzIwXTsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgaWYgKCFpbml0KQotICAgIHsKLSAgICAgIGJmZF9oOF9kaXNhc3NlbWJsZV9pbml0ICgpOwotICAgICAgaW5pdCA9IDE7Ci0gICAgfQotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIsIGRhdGEsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAKLSAgZm9yIChsID0gMjsgc3RhdHVzID09IDAgJiYgbCA8IDEwOyBsICs9IDIpCi0gICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciArIGwsIGRhdGErbCwgMiwgaW5mbyk7Ci0KLSAgLyogRmluZCB0aGUgZXhhY3Qgb3Bjb2RlL2FyZyBjb21iby4gICovCi0gIHdoaWxlIChxLT5uYW1lKQotICAgIHsKLSAgICAgIG9wX3R5cGUgKm5pYjsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotCi0gICAgICBuaWIgPSBxLT5kYXRhLm5pYjsKLSAgICAgIAotICAgICAgd2hpbGUgKDEpCi0JewotCSAgb3BfdHlwZSBsb29raW5nX2ZvciA9ICpuaWI7Ci0JICBpbnQgdGhpc25pYiA9IGRhdGFbbGVuID4+IDFdOwotCSAgCi0JICB0aGlzbmliID0gKGxlbiAmIDEpID8gKHRoaXNuaWIgJiAweGYpIDogKCh0aGlzbmliID4+IDQpICYgMHhmKTsKLQkgIAotCSAgaWYgKGxvb2tpbmdfZm9yIDwgMTYgJiYgbG9va2luZ19mb3IgPj0gMCkKLQkgICAgewotCSAgICAgIGlmIChsb29raW5nX2ZvciAhPSB0aGlzbmliKQotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMSkKLQkJewotCQkgIGlmICghICgoKGludCkgdGhpc25pYiAmIDB4OCkgIT0gMCkpCi0JCSAgICBnb3RvIGZhaWw7Ci0JCSAgCi0JCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMSk7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzApCi0JCXsKLQkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgPT0gMCkpCi0JCSAgICBnb3RvIGZhaWw7Ci0JCSAgCi0JCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMCk7Ci0JCX0KLQotCSAgICAgIGlmIChsb29raW5nX2ZvciAmIERCSVQpCi0JCXsKLQkJICBpZiAoKGxvb2tpbmdfZm9yICYgMikgIT0gKHRoaXNuaWIgJiAyKSkKLQkJICAgIGdvdG8gZmFpbDsKLQkJICAKLQkJICBhYnMgPSAodGhpc25pYiAmIDB4OCkgPyAyIDogMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgKFJFRyB8IElORCB8IElOQyB8IERFQykpCi0JCXsKLQkJICBpZiAobG9va2luZ19mb3IgJiBTUkMpCi0JCSAgICBycyA9IHRoaXNuaWI7Ci0JCSAgZWxzZQotCQkgICAgcmQgPSB0aGlzbmliOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzE2KQotCQl7Ci0JCSAgYWJzID0gKGRhdGFbbGVuID4+IDFdKSAqIDI1NiArIGRhdGFbKGxlbiArIDIpID4+IDFdOwotCQkgIHBsZW4gPSAxNjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgQUJTSk1QKQotCQl7Ci0JCSAgYWJzID0gKGRhdGFbMV0gPDwgMTYpIHwgKGRhdGFbMl0gPDwgOCkgfCAoZGF0YVszXSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIE1FTUlORCkKLQkJewotCQkgIGFicyA9IGRhdGFbMV07Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMzIpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIAotCQkgIGFicyA9IChkYXRhW2ldIDw8IDI0KQotCQkgICAgfCAoZGF0YVtpICsgMV0gPDwgMTYpCi0JCSAgICB8IChkYXRhW2kgKyAyXSA8PCA4KQotCQkgICAgfCAoZGF0YVtpKyAzXSk7Ci0KLQkJICBwbGVuID0gMzI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMjQpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIAotCQkgIGFicyA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhW2kgKyAxXSA8PCA4KSB8IChkYXRhW2kgKyAyXSk7Ci0JCSAgcGxlbiA9IDI0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBJR05PUkUpCi0JCXsKLQkJICA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIERJU1BSRUcpCi0JCXsKLQkJICByZGlzcCA9IHRoaXNuaWI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIEtCSVQpCi0JCXsKLQkJICBzd2l0Y2ggKHRoaXNuaWIpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDk6Ci0JCSAgICAgIGFicyA9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBhYnMgPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgYWJzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGZhaWw7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfOCkKLQkJewotCQkgIHBsZW4gPSA4OwotCQkgIGFicyA9IGRhdGFbbGVuID4+IDFdOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMpCi0JCXsKLQkJICBiaXQgPSB0aGlzbmliICYgMHg3OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzIpCi0JCXsKLQkJICBwbGVuID0gMjsKLQkJICBhYnMgPSB0aGlzbmliICYgMHgzOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBNQUNSRUcpCi0JCXsKLQkJICBhYnMgPSAodGhpc25pYiA9PSAzKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yID09IEUpCi0JCXsKLQkJICBpbnQgaTsKLQotCQkgIGZvciAoaSA9IDA7IGkgPCBxLT5sZW5ndGg7IGkrKykKLQkJICAgIGZwcmludGYgKHN0cmVhbSwgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCSAgCi0JCSAgZm9yICg7IGkgPCA2OyBpKyspCi0JCSAgICBmcHJpbnRmIChzdHJlYW0sICIgICAiKTsKLQkJICAKLQkJICBmcHJpbnRmIChzdHJlYW0sICIlc1x0IiwgcS0+bmFtZSk7Ci0KLQkJICAvKiBHcm9zcy4gIERpc2d1c3RpbmcuICAqLwotCQkgIGlmIChzdHJjbXAgKHEtPm5hbWUsICJsZG0ubCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGludCBjb3VudCwgaGlnaDsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBoaWdoID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJAc3ArLGVyJWQtZXIlZCIsIGhpZ2ggLSBjb3VudCwgaGlnaCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAic3RtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGxvdzsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBsb3cgPSBkYXRhWzNdICYgMHg3OwotCi0JCSAgICAgIGZwcmludGYgKHN0cmVhbSwgImVyJWQtZXIlZCxALXNwIiwgbG93LCBsb3cgKyBjb3VudCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICAvKiBGaWxsIGluIHRoZSBhcmdzLiAgKi8KLQkJICB7Ci0JCSAgICBvcF90eXBlICphcmdzID0gcS0+YXJncy5uaWI7Ci0JCSAgICBpbnQgaGFkb25lID0gMDsKLQotCQkgICAgd2hpbGUgKCphcmdzICE9IEUpCi0JCSAgICAgIHsKLQkJCWludCB4ID0gKmFyZ3M7Ci0JCQkKLQkJCWlmIChoYWRvbmUpCi0JCQkgIGZwcmludGYgKHN0cmVhbSwgIiwiKTsKLQotCQkJaWYgKHggJiBMXzMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjMHgleCIsICh1bnNpZ25lZCkgYml0KTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIChJTU0gfCBLQklUIHwgREJJVCkpCi0JCQkgIHsKLQkJCSAgICAvKiBCbGV0Y2guICBGb3Igc2hhbCAjMixlcjAgYW5kIGZyaWVuZHMuICAqLwotCQkJICAgIGlmICgqKGFyZ3MgKyAxKSAmIFNSQ19JTl9EU1QpCi0JCQkgICAgICBhYnMgPSAyOwotCi0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBSRUcpCi0JCQkgIHsKLQkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJICAgIAotCQkJICAgIHN3aXRjaCAoeCAmIFNJWkUpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlIExfODoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfMTY6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCB3cmVnbmFtZXNbcm5dKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgTF9QOgotCQkJICAgICAgY2FzZSBMXzMyOgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgbHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBNQUNSRUcpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJtYWMlYyIsIGFicyA/ICdsJyA6ICdoJyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBJTkMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMrIiwgcHJlZ25hbWVzW3JzXSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBERUMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJALSVzIiwgcHJlZ25hbWVzW3JkXSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBJTkQpCi0JCQkgIHsKLQkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAlcyIsIHByZWduYW1lc1tybl0pOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgQUJTOE1FTSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OjgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiAoQUJTIHwgQUJTSk1QKSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OiVkIiwgKHVuc2lnbmVkKSBhYnMsIHBsZW4pOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgTUVNSU5EKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQEAlZCAoJXgpIiwgYWJzLCBhYnMpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUENSRUwpCi0JCQkgIHsKLQkJCSAgICBpZiAoeCAmIExfMTYpCi0JCQkgICAgICB7Ci0JCQkJYWJzICs9IDI7Ci0JCQkJZnByaW50ZiAoc3RyZWFtLAotCQkJCQkgIi4lcyVkICgleCkiLCAoc2hvcnQpIGFicyA+IDAgPyAiKyIgOiAiIiwKLQkJCQkJIChzaG9ydCkgYWJzLCBhZGRyICsgKHNob3J0KSBhYnMgKyAyKTsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJZnByaW50ZiAoc3RyZWFtLAotCQkJCQkgIi4lcyVkICgleCkiLCAoY2hhcikgYWJzID4gMCA/ICIrIiA6ICIiLAotCQkJCQkgKGNoYXIpIGFicywgYWRkciArIChjaGFyKSBhYnMgKyAyKTsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIERJU1ApCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAKDB4JXg6JWQsJXMpIiwKLQkJCQkgICAgIGFicyxwbGVuLCBwcmVnbmFtZXNbcmRpc3BdKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIENDUikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgImNjciIpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRVhSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiZXhyIik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJIbW1tbSAleCIpLCB4KTsKLQkJCQotCQkJaGFkb25lID0gMTsKLQkJCWFyZ3MrKzsKLQkJICAgICAgfQotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gcS0+bGVuZ3RoOwotCQl9Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQlmcHJpbnRmIChzdHJlYW0sIF8oIkRvbid0IHVuZGVyc3RhbmQgJXggXG4iKSwgbG9va2luZ19mb3IpOwotCSAgICB9Ci0JICAKLQkgIGxlbisrOwotCSAgbmliKys7Ci0JfQotICAgICAgCi0gICAgZmFpbDoKLSAgICAgIHErKzsKLSAgICB9Ci0KLSAgLyogRmVsbCBvZmYgdGhlIGVuZC4gICovCi0gIGZwcmludGYgKHN0cmVhbSwgIiUwMnggJTAyeCAgICAgICAgLndvcmRcdEgnJXgsSCcleCIsCi0JICAgZGF0YVswXSwgZGF0YVsxXSwKLQkgICBkYXRhWzBdLCBkYXRhWzFdKTsKLSAgCi0gIHJldHVybiAyOwotfQotCi1pbnQKLXByaW50X2luc25faDgzMDAgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgMCk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9oODMwMGggKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgMSk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9oODMwMHMgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgMik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLWRpcy5jIGIvb3Bjb2Rlcy9oODUwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMTVkNC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4NTAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJoODUwMC1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDgKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKikgaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjcm5hbWVbXSA9Ci17InNyIiwgImNjciIsICIqIiwgImJyIiwgImVwIiwgImRwIiwgIioiLCAidHAifTsKLQotaW50Ci1wcmludF9pbnNuX2g4NTAwIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJiBwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBhZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLWlmICgwKSAgewotICAgIHN0YXRpYyAgICBpbnQgb25lOwotICAgIGlmICghb25lICkgCi0gICAgICB7Ci0Jb25lID0gMTsKLQlmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotCSAgewotCSAgICBpZiAoKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgJiAweDgpID09IDApCi0JICAgICAgcHJpbnRmKCIlc1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0KLSAgLyogUnVuIGRvd24gdGhlIHRhYmxlIHRvIGZpbmQgdGhlIG9uZSB3aGljaCBtYXRjaGVzICovCi0gIGZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaW50IGJ5dGU7Ci0gICAgICBpbnQgcm4gPSAwOwotICAgICAgaW50IHJkID0gMDsKLSAgICAgIGludCBycyA9IDA7Ci0gICAgICBpbnQgZGlzcCA9IDA7Ci0gICAgICBpbnQgYWJzID0gMDsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHBjcmVsID0gMDsKLSAgICAgIGludCBxaW0gPSAwOwotICAgICAgaW50IGk7Ci0gICAgICBpbnQgY3IgPSAwOwotICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG9wY29kZS0+bGVuZ3RoOyBieXRlKyspCi0JewotCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDEpOwotCSAgaWYgKChidWZmZXJbYnl0ZV0gJiBvcGNvZGUtPmJ5dGVzW2J5dGVdLm1hc2spCi0JICAgICAgIT0gKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uY29udGVudHMpKQotCSAgICB7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBleHRyYWN0IGFueSBpbmZvIHBhcnRzICovCi0JICAgICAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCkKLQkJewotCQljYXNlIDA6Ci0JCWNhc2UgRlA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBmdW5jIChzdHJlYW0sIF8oImNhbid0IGNvcGUgd2l0aCBpbnNlcnQgJWRcbiIpLAotCQkJb3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpOwotCQkgIGJyZWFrOwotCQljYXNlIFJOOgotCQkgIHJuID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIFJTOgotCQkgIHJzID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIENSQjoKLQkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBpZiAoY3IgPT0gMCkKLQkJICAgIGdvdG8gbmV4dDsKLQkJICBicmVhazsKLQkJY2FzZSBDUlc6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyICE9IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRElTUDE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBkaXNwID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBGUElORF9EODoKLQkJY2FzZSBESVNQODoKLQkJICBkaXNwID0gKChjaGFyKSAoYnVmZmVyW2J5dGVdKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUkQ6Ci0JCWNhc2UgUkRJTkQ6Ci0JCSAgcmQgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMjQ6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDMpOwotCQkgIGFicyA9Ci0JCSAgICAoYnVmZmVyW2J5dGVdIDw8IDE2KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAxXSA8PCA4KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAyXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGFicyA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTODoKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU0xNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU00OgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pICYgMHhmOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTg6Ci0JCWNhc2UgUkxJU1Q6Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMODoKLQkJICBwY3JlbCA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFFJTToKLQkJICBzd2l0Y2ggKGJ1ZmZlcltieXRlXSAmIDB4NykKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgcWltID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIHFpbSA9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA0OgotCQkgICAgICBxaW0gPSAtMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDU6Ci0JCSAgICAgIHFpbSA9IC0yOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBXZSBnZXQgaGVyZSB3aGVuIGFsbCB0aGUgbWFza3MgaGF2ZSBwYXNzZWQgc28gd2UgY2FuIG91dHB1dCB0aGUKLQkgb3BlcmFuZHMqLwotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgb3Bjb2RlLT5sZW5ndGgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bGVuZ3RoOyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIlMDJ4ICIsIGJ1ZmZlcltpXSk7Ci0JfQotICAgICAgZm9yICg7IGkgPCA2OyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIgICAiKTsKLQl9Ci0gICAgICAoZnVuYykgKHN0cmVhbSwgIiVzXHQiLCBvcGNvZGUtPm5hbWUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bmFyZ3M7IGkrKykKLQl7Ci0JICBpZiAoaSkKLQkgICAgKGZ1bmMpIChzdHJlYW0sICIsIik7Ci0JICBzd2l0Y2ggKG9wY29kZS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgY2FzZSBGUDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJmcCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLHIlZCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCByJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCBmcCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSQjoKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBjcm5hbWVbY3JdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTkRFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklOQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkKyIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQiLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHNwKyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAtc3AiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MjQiLCBhYnMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDoxNiIsIGFicyAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6OCIsIGFicyAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDoxNiIsIGltbSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgICAgewotCQlpbnQgaTsKLQkJaW50IG5jID0gMDsKLQkJZnVuYyAoc3RyZWFtLCAiKCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkgIHsKLQkJICAgIGlmIChpbW0gJiAoMSA8PCBpKSkKLQkJICAgICAgewotCQkJZnVuYyAoc3RyZWFtLCAiciVkIiwgaSk7Ci0JCQlpZiAobmMpCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIiwiKTsKLQkJCW5jID0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkJZnVuYyAoc3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDo4IiwgaW1tICYgMHhmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIweCUweDoxNiIsIChwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsCi0JCSAgICAoKGNoYXIpIHBjcmVsICsgYWRkciArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDpxIiwgcWltKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDo0IiwgaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBvcGNvZGUtPmxlbmd0aDsKLSAgICBuZXh0OjsKLSAgICB9Ci0KLSAgLyogQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZyAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmdW5jIChzdHJlYW0sIF8oIiUwMnhcdFx0KnVua25vd24qIiksIGJ1ZmZlclswXSk7Ci0gIHJldHVybiAxOwotCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLW9wYy5oIGIvb3Bjb2Rlcy9oODUwMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5NDlhZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgzNiArMCwwIEBACi10eXBlZGVmIGVudW0KLXsKLSAgR1IwLEdSMSxHUjIsR1IzLEdSNCxHUjUsR1I2LEdSNywKLSAgR1BSMCwgR1BSMSwgR1BSMiwgR1BSMywgR1BSNCwgR1BSNSwgR1BSNiwgR1BSNywKLSAgR0NDUiwgR1BDLCAKLSAgR1NFR0MsIEdTRUdELCBHU0VHRSwgR1NFR1QsR0xBU1QKLX0gZ2RicmVnX3R5cGU7Ci0jZGVmaW5lIE9fWE9SQyAxCi0jZGVmaW5lIE9fWE9SIDIKLSNkZWZpbmUgT19YQ0ggMwotI2RlZmluZSBPX1VOTEsgNAotI2RlZmluZSBPX1RTVCA1Ci0jZGVmaW5lIE9fVFJBUEEgNgotI2RlZmluZSBPX1RSQVBfVlMgNwotI2RlZmluZSBPX1RBUyA4Ci0jZGVmaW5lIE9fU1dBUCA5Ci0jZGVmaW5lIE9fU1VCWCAxMAotI2RlZmluZSBPX1NVQlMgMTEKLSNkZWZpbmUgT19TVUIgMTIKLSNkZWZpbmUgT19TVE0gMTMKLSNkZWZpbmUgT19TVEMgMTQKLSNkZWZpbmUgT19TTEVFUCAxNQotI2RlZmluZSBPX1NITFIgMTYKLSNkZWZpbmUgT19TSExMIDE3Ci0jZGVmaW5lIE9fU0hBUiAxOAotI2RlZmluZSBPX1NIQUwgMTkKLSNkZWZpbmUgT19TQ0JfTkUgMjAKLSNkZWZpbmUgT19TQ0JfRiAyMQotI2RlZmluZSBPX1NDQl9FUSAyMgotI2RlZmluZSBPX1JUUyAyMwotI2RlZmluZSBPX1JURCAyNAotI2RlZmluZSBPX1JPVFhSIDI1Ci0jZGVmaW5lIE9fUk9UWEwgMjYKLSNkZWZpbmUgT19ST1RSIDI3Ci0jZGVmaW5lIE9fUk9UTCAyOAotI2RlZmluZSBPX1BSVFMgMjkKLSNkZWZpbmUgT19QUlREIDMwCi0jZGVmaW5lIE9fUEpTUiAzMQotI2RlZmluZSBPX1BKTVAgMzIKLSNkZWZpbmUgT19PUkMgMzMKLSNkZWZpbmUgT19PUiAzNAotI2RlZmluZSBPX05PVCAzNQotI2RlZmluZSBPX05PUCAzNgotI2RlZmluZSBPX05FRyAzNwotI2RlZmluZSBPX01VTFhVIDM4Ci0jZGVmaW5lIE9fTU9WVFBFIDM5Ci0jZGVmaW5lIE9fTU9WRlBFIDQwCi0jZGVmaW5lIE9fTU9WIDQxCi0jZGVmaW5lIE9fTElOSyA0MgotI2RlZmluZSBPX0xETSA0MwotI2RlZmluZSBPX0xEQyA0NAotI2RlZmluZSBPX0pTUiA0NQotI2RlZmluZSBPX0pNUCA0NgotI2RlZmluZSBPX0VYVFUgNDcKLSNkZWZpbmUgT19FWFRTIDQ4Ci0jZGVmaW5lIE9fRFNVQiA0OQotI2RlZmluZSBPX0RJVlhVIDUwCi0jZGVmaW5lIE9fREFERCA1MQotI2RlZmluZSBPX0NNUCA1MgotI2RlZmluZSBPX0NMUiA1MwotI2RlZmluZSBPX0JWUyA1NAotI2RlZmluZSBPX0JWQyA1NQotI2RlZmluZSBPX0JUU1QgNTYKLSNkZWZpbmUgT19CVCA1NwotI2RlZmluZSBPX0JTUiA1OAotI2RlZmluZSBPX0JTRVQgNTkKLSNkZWZpbmUgT19CUk4gNjAKLSNkZWZpbmUgT19CUkEgNjEKLSNkZWZpbmUgT19CUFQgNjIKLSNkZWZpbmUgT19CUEwgNjMKLSNkZWZpbmUgT19CTk9UIDY0Ci0jZGVmaW5lIE9fQk5FIDY1Ci0jZGVmaW5lIE9fQk1JIDY2Ci0jZGVmaW5lIE9fQkxUIDY3Ci0jZGVmaW5lIE9fQkxTIDY4Ci0jZGVmaW5lIE9fQkxPIDY5Ci0jZGVmaW5lIE9fQkxFIDcwCi0jZGVmaW5lIE9fQkhTIDcxCi0jZGVmaW5lIE9fQkhJIDcyCi0jZGVmaW5lIE9fQkdUIDczCi0jZGVmaW5lIE9fQkdFIDc0Ci0jZGVmaW5lIE9fQkYgNzUKLSNkZWZpbmUgT19CRVEgNzYKLSNkZWZpbmUgT19CQ1MgNzcKLSNkZWZpbmUgT19CQ0xSIDc4Ci0jZGVmaW5lIE9fQkNDIDc5Ci0jZGVmaW5lIE9fQU5EQyA4MAotI2RlZmluZSBPX0FORCA4MQotI2RlZmluZSBPX0FERFggODIKLSNkZWZpbmUgT19BRERTIDgzCi0jZGVmaW5lIE9fQUREIDg0Ci0jZGVmaW5lIE9fQllURSAxMjgKLSNkZWZpbmUgT19XT1JEIDB4MDAwCi0jZGVmaW5lIE9fVU5TWiAweDAwMAotI2RlZmluZSBGUElORF9EOAkxMAotI2RlZmluZSBSRElORF9EMTYJMTEKLSNkZWZpbmUgUkRJTkRfRDgJMTIKLSNkZWZpbmUgU1BERUMJMTMKLSNkZWZpbmUgUkRJTkQJMTQKLSNkZWZpbmUgUk4JMTUKLSNkZWZpbmUgUk5JTkRfRDgJMTYKLSNkZWZpbmUgUk5JTkRfRDE2CTE3Ci0jZGVmaW5lIFJOREVDCTE4Ci0jZGVmaW5lIFJOSU5DCTE5Ci0jZGVmaW5lIFJOSU5ECTIwCi0jZGVmaW5lIFNQSU5DCTIxCi0jZGVmaW5lIEFCUzE2CTIyCi0jZGVmaW5lIEFCUzI0CTIzCi0jZGVmaW5lIFBDUkVMMTYJMjQKLSNkZWZpbmUgUENSRUw4CTI1Ci0jZGVmaW5lIEFCUzgJMjYKLSNkZWZpbmUgQ1JCCTI3Ci0jZGVmaW5lIENSCTI4Ci0jZGVmaW5lIENSVwkyOQotI2RlZmluZSBESVNQMTYJMzAKLSNkZWZpbmUgRElTUDgJMzEKLSNkZWZpbmUgRlAJMzIKLSNkZWZpbmUgSU1NMTYJMzMKLSNkZWZpbmUgSU1NNAkzNAotI2RlZmluZSBJTU04CTM1Ci0jZGVmaW5lIFJMSVNUCTM2Ci0jZGVmaW5lIFFJTQkzNwotI2RlZmluZSBSRAkzOAotI2RlZmluZSBSUwkzOQotI2RlZmluZSBTUAk0MAotdHlwZWRlZiBlbnVtIHsgQUNfQkFELCBBQ19FSSwgQUNfUkksIEFDX0QsIEFDXyxBQ19FUlIsIEFDX1gsQUNfQiwgQUNfRUUsQUNfUlIsQUNfSUUsCi0gQUNfUkUsQUNfRSwgQUNfSSwgQUNfRVIsQUNfSVJSLCBBQ19JUiwgQUNfUkVSLCBBQ19FUkUsQUNfRUlFIH0gYWRkcl9jbGFzc190eXBlOyAKLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCBpbnQgaWR4OwotCWNoYXIgZmxhZ3Msc3JjMSxzcmMyLGRzdDsKLQl1bnNpZ25lZCBjaGFyIGZsYXZvcjsKLQljaGFyICpuYW1lOwotCWludCBuYXJnczsKLQlpbnQgYXJnX3R5cGVbMl07Ci0JaW50IGxlbmd0aDsKLQlzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIGNvbnRlbnRzO3Vuc2lnbmVkIGNoYXIgbWFzazsgY2hhciBpbnNlcnQ7IH0gYnl0ZXNbNl07Ci19IGg4NTAwX29wY29kZV9pbmZvOwotaDg1MDBfb3Bjb2RlX2luZm8gaDg1MDBfdGFibGVbXQotI2lmZGVmIEFTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLS8qCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsQUJTMTYgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCwgfSwKLQkJCQkJCQkJICAgezB4MDcsMHhmZiwgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwqLwotCi17MSwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fV09SRCwieG9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsQ1JXIH19fSwKLXsyLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19CWVRFLCJ4b3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs2LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1dPUkQsInhjaC53IiwyLHtSUyxSRH0sMiwJe3sweGE4LDB4ZjgsUlMgfSx7MHg5MCwweGY4LFJEIH19fSwKLXs3LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1VOU1osInhjaCIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTYsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX0JZVEUsInN3YXAuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMCwweGZmLCB9fX0sCi17MTcsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX1VOU1osInN3YXAiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk59LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDYsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0VRfE9fVU5TWiwic2NiL2VxIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNywweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU04LDB9LDIsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjEsJy0nLCdCJywnIScsJyEnLE9fUFJUU3xPX1VOU1osInBydHMiLDAsezAsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4MTksMHhmZiwgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjOCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2NiwncycsJ0knLCdDJywnQycsT19PUkN8T19CWVRFLCJvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQ4LDB4ZjgsQ1JCIH19fSwKLXs2NywncycsJ0knLCdDJywnQycsT19PUkN8T19VTlNaLCJvcmMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OnMiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkwLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpsIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17OTEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6aSIsICAyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSx7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNix7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsQUJTOH0sNCwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTYsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTgsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmYiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAwLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjplIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLS8qezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUkR9LDIsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwqLwotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk4sQ1JXfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkMsQ1JXfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOREVDLENSV30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlM4LENSV30sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDgsQ1JXfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDE2LENSV30sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTkRFQyxDUkJ9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTOCxDUkJ9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JXfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSV30sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JXfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JCfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTgsQ1JCfSwzLAkJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7QUJTMTYsMH0sMywJe3sweDE4LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEyLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19VTlNaLCJleHR1IiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTMsJ3MnLCdEJywnIScsJ0QnLE9fRVhUU3xPX0JZVEUsImV4dHMuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE0LCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19VTlNaLCJleHRzIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTIwLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIxLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDppIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNiwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk4sUkR9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOLFJEfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NDAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzgsUkR9LDMsCQl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTn0sNCwJCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzUsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fVU5TWiwiYnZzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzYsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fV09SRCwiYnZjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzOCwnLScsJ0InLCchJywnIScsT19CVkN8T19VTlNaLCJidmMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDIsJy0nLCdCJywnIScsJyEnLE9fQlR8T19XT1JELCJidC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDMsJy0nLCdCJywnIScsJyEnLE9fQlR8T19CWVRFLCJidC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0NiwnLScsJ0InLCchJywnIScsT19CU1J8T19CWVRFLCJic3IuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NywnLScsJ0InLCchJywnIScsT19CU1J8T19VTlNaLCJic3IiLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1MywnLScsJ0InLCchJywnIScsT19CUk58T19VTlNaLCJicm4iLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NCwnLScsJ0InLCchJywnIScsT19CUkF8T19XT1JELCJicmEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU1LCctJywnQicsJyEnLCchJyxPX0JSQXxPX0JZVEUsImJyYS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU2LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1VOU1osImJyYSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYwLCctJywnQicsJyEnLCchJyxPX0JQTHxPX1VOU1osImJwbCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2NCwnLScsJ0InLCchJywnIScsT19CTkV8T19XT1JELCJibmUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY2LCctJywnQicsJyEnLCchJyxPX0JORXxPX1VOU1osImJuZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjgsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fQllURSwiYm1pLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjksJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fVU5TWiwiYm1pIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzAsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fV09SRCwiYmx0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MSwnLScsJ0InLCchJywnIScsT19CTFR8T19CWVRFLCJibHQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3MiwnLScsJ0InLCchJywnIScsT19CTFR8T19VTlNaLCJibHQiLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MywnLScsJ0InLCchJywnIScsT19CTFN8T19XT1JELCJibHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc1LCctJywnQicsJyEnLCchJyxPX0JMU3xPX1VOU1osImJscyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc2LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1dPUkQsImJsby53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzcsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fQllURSwiYmxvLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzgsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fVU5TWiwiYmxvIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MSwnLScsJ0InLCchJywnIScsT19CTEV8T19VTlNaLCJibGUiLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MiwnLScsJ0InLCchJywnIScsT19CSFN8T19XT1JELCJiaHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTgzLCctJywnQicsJyEnLCchJyxPX0JIU3xPX0JZVEUsImJocy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg0LCctJywnQicsJyEnLCchJyxPX0JIU3xPX1VOU1osImJocyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODcsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fVU5TWiwiYmhpIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MCwnLScsJ0InLCchJywnIScsT19CR1R8T19VTlNaLCJiZ3QiLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTkyLCctJywnQicsJyEnLCchJyxPX0JHRXxPX0JZVEUsImJnZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkzLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1VOU1osImJnZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk0LCctJywnQicsJyEnLCchJyxPX0JGfE9fV09SRCwiYmYudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk1LCctJywnQicsJyEnLCchJyxPX0JGfE9fQllURSwiYmYuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk3LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1dPUkQsImJlcS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTksJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fVU5TWiwiYmVxIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDAsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fV09SRCwiYmNzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMSwnLScsJ0InLCchJywnIScsT19CQ1N8T19CWVRFLCJiY3MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwMiwnLScsJ0InLCchJywnIScsT19CQ1N8T19VTlNaLCJiY3MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwOCwnLScsJ0InLCchJywnIScsT19CQ0N8T19VTlNaLCJiY2MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwOSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fV09SRCwiYW5kYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTEsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1VOU1osImFuZGMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotMCwwLDB9Ci0jZW5kaWYKLTsKLSNlbmRpZgotI2lmZGVmIERJU0FTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19XT1JELCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTIsJy0nLCdJJywnIScsJyEnLE9fVFJBUEF8T19VTlNaLCJ0cmFwYSIsMSx7SU1NNCwwfSwyLAl7ezB4MDgsMHhmZiwgfSx7MHgxMCwweGYwLElNTTQgfX19LAotezEzLCctJywnQicsJyEnLCchJyxPX1RSQVBfVlN8T19VTlNaLCJ0cmFwL3ZzIiwwLHswLDB9LDEsCXt7MHgwOSwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMxLCctJywnIScsJyEnLCchJyxPX1NMRUVQfE9fVU5TWiwic2xlZXAiLDAsezAsMH0sMSwJe3sweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ1LCctJywnQicsJ1MnLCdTJyxPX1NDQl9GfE9fVU5TWiwic2NiL2YiLDIse1JTLFBDUkVMOH0sMywJe3sweDAxLDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ0LCctJywnQicsJ1MnLCdTJyxPX1NDQl9ORXxPX1VOU1osInNjYi9uZSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDYsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NywnLScsJ0InLCchJywnIScsT19SVFN8T19VTlNaLCJydHMiLDAsezAsMH0sMSwJe3sweDE5LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpsLnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OnMudyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjUsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fV09SRCwib3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxDUlcgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtBQlMyNCwwfSw0LAl7ezB4MTMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklOQyxSRH0sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOSwncycsJ0QnLCchJywnIScsT19EQUREfE9fVU5TWiwiZGFkZCIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExMSwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fQllURSwiZXh0dS5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDAsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmMCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDUsJy0nLCdFJywnIScsJ0MnLE9fTERNfE9fVU5TWiwibGRtIiwyLHtTUElOQyxSTElTVH0sMiwJe3sweDAyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzMsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fV09SRCwiYnZzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0NSwnLScsJ0InLCchJywnIScsT19CU1J8T19XT1JELCJic3IudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MWUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMCwncycsJ0knLCdTJywnUycsT19BTkRDfE9fQllURSwiYW5kYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OCwnLScsJ0InLCchJywnIScsT19CRVF8T19CWVRFLCJiZXEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTksJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fQllURSwiYnBsLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg5LCctJywnQicsJyEnLCchJyxPX0JHVHxPX0JZVEUsImJndC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MSwnLScsJ0InLCchJywnIScsT19CUk58T19XT1JELCJicm4udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNiwnLScsJ0InLCchJywnIScsT19CQ0N8T19XT1JELCJiY2MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU4LCctJywnQicsJyEnLCchJyxPX0JQTHxPX1dPUkQsImJwbC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjcsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fV09SRCwiYm1pLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3OSwnLScsJ0InLCchJywnIScsT19CTEV8T19XT1JELCJibGUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2YsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0vKiAKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJTLFJEICAnLScsJ1gnLCchJywnIScKLVJOLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJELDAgICdtJywnRCcsJyEnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STiwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0UnLCdDJywnQycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdzJywnRScsJyEnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NNCwwICAnLScsJ0knLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnRScsJ0MnLCdDJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1GUCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STElTVCxTUERFQyAgJy0nLCdJJywnIScsJ0UnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotQ1JXLFJOREVDICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUNSVyxSTiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsUENSRUw4ICAnLScsJ0InLCdTJywnUycKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU04LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotMCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMjQsMCAgJy0nLCdKJywnIScsJyEnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdDJywnQycKLUlNTTgsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotMCwwICAnLScsJyEnLCchJywnIScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLVJESU5ELDAgICctJywnSicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNiwwICAnLScsJ0InLCchJywnIScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTklORF9EOCAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUlMsUk4gICctJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICctJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJy0nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICctJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUFCUzE2LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1STixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOREVDLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EOCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDgsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJELDAgICdzJywnRCcsJyEnLCdEJwotQUJTMTYsQ1JCICAncycsJ0UnLCchJywnQycKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1TUElOQyxSTElTVCAgJy0nLCdFJywnIScsJ0MnCi1JTU04LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1GUCxJTU0xNiAgJy0nLCdTJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1GUCxJTU04ICAnLScsJ1MnLCdJJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzggICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU04LDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdTJywnUycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0wLDAgICctJywnIScsJyEnLCchJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLSovIAotezAsMCwwfX0KLSNlbmRpZgotOwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL2hwcGEtZGlzLmMgYi9vcGNvZGVzL2hwcGEtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzkyNmEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9ocHBhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgZm9yIHRoZSBQQS1SSVNDLiBTb21ld2hhdCBkZXJpdmVkIGZyb20gc3BhcmMtcGluc24uYy4KLSAgIENvcHlyaWdodCAxOTg5LCAxOTkwLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLS8qIEludGVnZXIgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQotICAgb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSAKLSB7ImZsYWdzIiwgInIxIiwgInJwIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwKLSAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsCi0gICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAicjI0IiwgInIyNSIsICJyMjYiLCAiZHAiLCAicmV0MCIsICJyZXQxIiwKLSAgInNwIiwgInIzMSJ9OwotCi0vKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcF9yZWdfbmFtZXNbXSA9IAotIHsiZnBzciIsICJmcGUyIiwgImZwZTQiLCAiZnBlNiIsIAotICAiZnI0IiwgImZyNSIsICJmcjYiLCAiZnI3IiwgImZyOCIsIAotICAiZnI5IiwgImZyMTAiLCAiZnIxMSIsICJmcjEyIiwgImZyMTMiLCAiZnIxNCIsICJmcjE1IiwgCi0gICJmcjE2IiwgImZyMTciLCAiZnIxOCIsICJmcjE5IiwgImZyMjAiLCAiZnIyMSIsICJmcjIyIiwgImZyMjMiLAotICAiZnIyNCIsICJmcjI1IiwgImZyMjYiLCAiZnIyNyIsICJmcjI4IiwgImZyMjkiLCAiZnIzMCIsICJmcjMxIn07Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENPUkVfQUREUjsKLQotLyogR2V0IGF0IHZhcmlvdXMgcmVsZXZlbnQgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uIHdvcmQuICAqLwotCi0jZGVmaW5lIE1BU0tfNSAweDFmCi0jZGVmaW5lIE1BU0tfMTAgMHgzZmYKLSNkZWZpbmUgTUFTS18xMSAweDdmZgotI2RlZmluZSBNQVNLXzE0IDB4M2ZmZgotI2RlZmluZSBNQVNLXzE2IDB4ZmZmZgotI2RlZmluZSBNQVNLXzIxIDB4MWZmZmZmCi0KLS8qIFRoaXMgbWFjcm8gZ2V0cyBiaXQgZmllbGRzIHVzaW5nIEhQJ3MgbnVtYmVyaW5nIChNU0IgPSAwKSAqLwotCi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0KLS8qIFNvbWUgb2YgdGhlc2UgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byAyLWQgYXJyYXlzIGJlY2F1c2UgdGhleQotICAgY29uc3VtZSBsZXNzIHN0b3JhZ2UgdGhpcyB3YXkuICBJZiB0aGUgbWFpbnRlbmFuY2UgYmVjb21lcyBhCi0gICBwcm9ibGVtLCBjb252ZXJ0IHRoZW0gYmFjayB0byBjb25zdCAxLWQgcG9pbnRlciBhcnJheXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbnRyb2xfcmVnW10gPSB7Ci0gICJyY3RyIiwgImNyMSIsICJjcjIiLCAiY3IzIiwgImNyNCIsICJjcjUiLCAiY3I2IiwgImNyNyIsCi0gICJwaWRyMSIsICJwaWRyMiIsICJjY3IiLCAic2FyIiwgInBpZHIzIiwgInBpZHI0IiwKLSAgIml2YSIsICJlaWVtIiwgIml0bXIiLCAicGNzcSIsICJwY29xIiwgImlpciIsICJpc3IiLAotICAiaW9yIiwgImlwc3ciLCAiZWlyciIsICJ0cjAiLCAidHIxIiwgInRyMiIsICJ0cjMiLAotICAidHI0IiwgInRyNSIsICJ0cjYiLCAidHI3IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbXBhcmVfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsPDwiLCAiLDw8PSIsICIsc3YiLCAiLG9kIiwKLSAgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgIiw+Pj0iLCAiLD4+IiwgIixuc3YiLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wYXJlX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLCAiLCo8PCIsICIsKjw8PSIsICIsKnN2IiwgIiwqb2QiLAotICAiLCp0ciIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IiwgIiwqPj49IiwgIiwqPj4iLCAiLCpuc3YiLCAiLCpldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY21waWJfY29uZF82NF9uYW1lc1tdID0gewotICAiLCo8PCIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLCAiLCo+Pj0iLCAiLCo8PiIsICIsKj49IiwgIiwqPiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLG51diIsICIsem52IiwgIixzdiIsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLHV2IiwgIix2bnoiLCAiLG5zdiIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwgIiwqbnV2IiwgIiwqem52IiwgIiwqc3YiLCAiLCpvZCIsCi0gICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iLCAiLCp1diIsICIsKnZueiIsICIsKm5zdiIsICIsKmV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB3aWRlX2FkZF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIixudXYiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwKLSAgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgIix1diIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb2dpY2FsX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAwLCAwLCAwLCAiLG9kIiwKLSAgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgMCwgMCwgMCwgIixldiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvZ2ljYWxfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsIDAsIDAsIDAsICIsKm9kIiwKLSAgIiwqdHIiLCAiLCo8PiIsICIsKj49IiwgIiwqPiIsIDAsIDAsIDAsICIsKmV2In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLHN3eiIsICIsc2J6IiwgIixzaHoiLCAiLHNkYyIsICIsc3djIiwgIixzYmMiLCAiLHNoYyIsCi0gICIsdHIiLCAiLG53eiIsICIsbmJ6IiwgIixuaHoiLCAiLG5kYyIsICIsbndjIiwgIixuYmMiLCAiLG5oYyIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdF9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCpzd3oiLCAiLCpzYnoiLCAiLCpzaHoiLCAiLCpzZGMiLCAiLCpzd2MiLCAiLCpzYmMiLCAiLCpzaGMiLAotICAiLCp0ciIsICIsKm53eiIsICIsKm5ieiIsICIsKm5oeiIsICIsKm5kYyIsICIsKm53YyIsICIsKm5iYyIsICIsKm5oYyIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hpZnRfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIixvZCIsICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNoaWZ0X2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKj0iLCAiLCo8IiwgIiwqb2QiLCAiLCp0ciIsICIsKjw+IiwgIiwqPj0iLCAiLCpldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmJfY29uZF82NF9uYW1lc1tdID0gewotICAiLCo8IiwgIiwqPj0iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGluZGV4X2NvbXBsX25hbWVzW10gPSB7IiIsICIsbSIsICIscyIsICIsc20ifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydF9sZHN0X2NvbXBsX25hbWVzW10gPSB7IiIsICIsbWEiLCAiIiwgIixtYiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNob3J0X2J5dGVzX2NvbXBsX25hbWVzW10gPSB7Ci0gICIiLCAiLGIsbSIsICIsZSIsICIsZSxtIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbG9hdF9mb3JtYXRfbmFtZXNbXSA9IHsiLHNnbCIsICIsZGJsIiwgIiIsICIscXVhZCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZsb2F0X2NvbXBfbmFtZXNbXSA9Ci17Ci0gICIsZmFsc2U/IiwgIixmYWxzZSIsICIsPyIsICIsITw9PiIsICIsPSIsICIsPXQiLCAiLD89IiwgIiwhPD4iLAotICAiLCE/Pj0iLCAiLDwiLCAiLD88IiwgIiwhPj0iLCAiLCE/PiIsICIsPD0iLCAiLD88PSIsICIsIT4iLAotICAiLCE/PD0iLCAiLD4iLCAiLD8+IiwgIiwhPD0iLCAiLCE/PCIsICIsPj0iLCAiLD8+PSIsICIsITwiLAotICAiLCE/PSIsICIsPD4iLCAiLCE9IiwgIiwhPXQiLCAiLCE/IiwgIiw8PT4iLCAiLHRydWU/IiwgIix0cnVlIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaWduZWRfdW5zaWduZWRfbmFtZXNbXSA9IHsiLHUiLCAiLHMifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXhfaGFsZl9uYW1lc1tdID0geyIsbCIsICIsciJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNhdHVyYXRpb25fbmFtZXNbXSA9IHsiLHVzIiwgIixzcyIsIDAsICIifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWFkX3dyaXRlX25hbWVzW10gPSB7IixyIiwgIix3In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX2NvbXBsX25hbWVzW10gPSB7IDAsICIiLCAiLGwiLCAiLHRzdiIgfTsKLQotLyogRm9yIGEgYnVuY2ggb2YgZGlmZmVyZW50IGluc3RydWN0aW9ucyBmb3JtIGFuIGluZGV4IGludG8gYSAKLSAgIGNvbXBsZXRlciBuYW1lIHRhYmxlLiAgKi8KLSNkZWZpbmUgR0VUX0NPTVBMKGluc24pIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgfCBcCi0JCQkgR0VUX0ZJRUxEIChpbnNuLCAxOCwgMTgpIDw8IDEpCi0KLSNkZWZpbmUgR0VUX0NPTkQoaW5zbikgKEdFVF9GSUVMRCAoKGluc24pLCAxNiwgMTgpICsgXAotCQkJKEdFVF9GSUVMRCAoKGluc24pLCAxOSwgMTkpID8gOCA6IDApKQotCi0vKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHJlZ2lzdGVycy4gIFB1dCB0aGVzZSBmaXJzdCwgc28gZ2NjJ3MgZnVuY3Rpb24KLSAgIGlubGluaW5nIGNhbiBkbyBpdHMgc3R1ZmYuICAqLwotCi0jZGVmaW5lIGZwdXRzX2ZpbHRlcmVkKFNUUixGKQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgU1RSKQotCi1zdGF0aWMgdm9pZAotZnB1dF9yZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgcmVnID8gcmVnX25hbWVzW3JlZ10gOiAicjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFNwZWNpYWwgY2FzZSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gcmVnaXN0ZXJzLiAgKi8KLSAgaWYgKHJlZyA8IDQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmcGUlZCIsIHJlZyAqIDIgKyAxKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNSIiwgcmVnID8gZnBfcmVnX25hbWVzW3JlZ10gCi0JCQkJCQkgICAgOiAiZnIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2NyZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgY29udHJvbF9yZWdbcmVnXSk7Ci19Ci0KLS8qIFByaW50IGNvbnN0YW50cyB3aXRoIHNpZ24uICAqLwotCi1zdGF0aWMgdm9pZAotZnB1dF9jb25zdCAobnVtLCBpbmZvKQotICAgICB1bnNpZ25lZCBudW07Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmICgoaW50KW51bSA8IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXgiLCAtKGludCludW0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleCIsIG51bSk7Ci19Ci0KLS8qIFJvdXRpbmVzIHRvIGV4dHJhY3QgdmFyaW91cyBzaXplZCBjb25zdGFudHMgb3V0IG9mIGhwcGEKLSAgIGluc3RydWN0aW9ucy4gICovCi0KLS8qIEV4dHJhY3QgYSAzLWJpdCBzcGFjZSByZWdpc3RlciBudW1iZXIgZnJvbSBhIGJlLCBibGUsIG10c3Agb3IgbWZzcC4gICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzMgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBHRVRfRklFTEQgKHdvcmQsIDE4LCAxOCkgPDwgMiB8IEdFVF9GSUVMRCAod29yZCwgMTYsIDE3KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF81X2xvYWQgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgPj4gMTYgJiBNQVNLXzUsIDUpOwotfQotCi0vKiBFeHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHN0e2Jod31zIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYnJlYWsgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVyX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgJiBNQVNLXzUpOwotfQotCi0vKiBFeHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHtzcn1zbSBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNVJfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAxNiAmIE1BU0tfNSk7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIDEwIGJpdCBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHtzcn1zbSBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfMTBVX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzEwKTsKLX0KLQotLyogRXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBiYiBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNVFfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAyMSAmIE1BU0tfNSk7Ci19Ci0KLS8qIEV4dHJhY3QgYW4gMTEgYml0IGltbWVkaWF0ZSBmaWVsZC4gICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzExICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xMSwgMTEpOwotfQotCi0vKiBFeHRyYWN0IGEgMTQgYml0IGltbWVkaWF0ZSBmaWVsZC4gICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE0ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xNCwgMTQpOwotfQotCi0vKiBFeHRyYWN0IGEgMTYgYml0IGltbWVkaWF0ZSBmaWVsZCAoUEEyLjAgd2lkZSBvbmx5KS4gICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE2ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICBpbnQgbTE1LCBtMCwgbTE7Ci0gIG0wID0gR0VUX0JJVCAod29yZCwgMTYpOwotICBtMSA9IEdFVF9CSVQgKHdvcmQsIDE3KTsKLSAgbTE1ID0gR0VUX0JJVCAod29yZCwgMzEpOwotICB3b3JkID0gKHdvcmQgPj4gMSkgJiAweDFmZmY7Ci0gIHdvcmQgPSB3b3JkIHwgKG0xNSA8PCAxNSkgfCAoKG0xNSBeIG0wKSA8PCAxNCkgfCAoKG0xNSBeIG0xKSA8PCAxMyk7Ci0gIHJldHVybiBzaWduX2V4dGVuZCAod29yZCwgMTYpOwotfQotCi0vKiBFeHRyYWN0IGEgMjEgYml0IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8yMSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgaW50IHZhbDsKLQotICB3b3JkICY9IE1BU0tfMjE7Ci0gIHdvcmQgPDw9IDExOwotICB2YWwgPSBHRVRfRklFTEQgKHdvcmQsIDIwLCAyMCk7Ci0gIHZhbCA8PD0gMTE7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDksIDE5KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA1LCA2KTsKLSAgdmFsIDw8PSA1OwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCAwLCA0KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA3LCA4KTsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh2YWwsIDIxKSA8PCAxMTsKLX0KLQotLyogRXh0cmFjdCBhIDEyIGJpdCBjb25zdGFudCBmcm9tIGJyYW5jaCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzEyICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKLSAgICAgICAgICAgICAgICAgICAgICAod29yZCAmIDB4MSkgPDwgMTEsIDEyKSA8PCAyOwotfQotCi0vKiBFeHRyYWN0IGEgMTcgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucywgcmV0dXJuaW5nIHRoZQotICAgMTkgYml0IHNpZ25lZCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTcgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMTEsIDE1KSA8PCAxMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDE2LCAxNykgPDwgMjsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF8yMiAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAxMSwgMTUpIDw8IDExIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDYsIDEwKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDIxLCAyMikgPDwgMjsKLX0KLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9ocHBhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgaW50IGluc24sIGk7Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwYV9vcGNvZGUgKm9wY29kZSA9ICZwYV9vcGNvZGVzW2ldOwotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSA9PSBvcGNvZGUtPm1hdGNoKQotCXsKLQkgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0jaWZuZGVmIEJGRDY0Ci0JICBpZiAob3Bjb2RlLT5hcmNoID09IHBhMjB3KQotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0KLQkgIGlmICghc3RyY2hyICgiY2ZDWT8tK25ITlpGSXV2Iiwgb3Bjb2RlLT5hcmdzWzBdKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQljYXNlICdiJzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdeJzoKLQkJICBmcHV0X2NyZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndCc6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICovCi0JCWNhc2UgJ2YnOgotCQkgIHN3aXRjaCAoKisrcykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgLyogJ2ZBJyB3aWxsIG5vdCBnZW5lcmF0ZSBhIHNwYWNlIGJlZm9yZSB0aGUgcmVnc2l0ZXIKLQkJCW5hbWUuICBOb3JtYWxseSB0aGF0IGlzIGZpbmUuICBFeGNlcHQgdGhhdCBpdAotCQkJY2F1c2VzIHByb2JsZW1zIHdpdGggeG1weXUgd2hpY2ggaGFzIG5vIEZQIGZvcm1hdAotCQkJY29tcGxldGVyLiAgKi8KLQkJICAgIGNhc2UgJ1gnOgotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQotCQkgICAgLyogRkFMTFRIUlUgKi8KLQotCQkgICAgY2FzZSAnQSc6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI0LCAyNCkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIAotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnQic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDE5LCAxOSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdDJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKTsKLQkJCXJlZyB8PSBHRVRfRklFTEQgKGluc24sIDE2LCAxOCkgPDwgMjsKLQkJCWlmIChHRVRfRklFTEQgKGluc24sIDIzLCAyMykgIT0gMCkKLQkJCSAgZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKTsKLQkJCWVsc2UKLQkJCSAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnaSc6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDYsIDEwKTsKLQotCQkJcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCQlmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdqJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KTsKLQotCQkJcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCQlmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdrJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKTsKLQotCQkJcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCQlmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjEsIDI1KTsKLQotCQkJcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCQlmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDIwKTsKLQotCQkJcmVnIHw9IChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPDwgNCk7Ci0JCQlmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIC8qICdmZScgd2lsbCBub3QgZ2VuZXJhdGUgYSBzcGFjZSBiZWZvcmUgdGhlIHJlZ2lzdGVyCi0JCQluYW1lLiAgTm9ybWFsbHkgdGhhdCBpcyBmaW5lLiAgRXhjZXB0IHRoYXQgaXQKLQkJCWNhdXNlcyBwcm9ibGVtcyB3aXRoIGZzdHcgZmUseShiKSB3aGljaCBoYXMgbm8gRlAKLQkJCWZvcm1hdCBjb21wbGV0ZXIuICAqLwotCQkgICAgY2FzZSAnRSc6Ci0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCi0JCSAgICAvKiBGQUxMVEhSVSAqLwotCi0JCSAgICBjYXNlICdlJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMzAsIDMwKSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3gnOgotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnNSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X2xvYWQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkJCSAic3IlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE3KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgZXh0cmFjdF8zIChpbnNuKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbXBsZXRlcnMuICAqLwotCQljYXNlICdjJzoKLQkJICBzd2l0Y2ggKCorK3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIGluZGV4X2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjEpKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiYyAiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHNsICIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBzd2l0Y2ggKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSkKLQkJCXsKLQkJCWNhc2UgMToKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsY28gIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbyc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG8iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdnJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZ2F0ZSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixsLHB1c2giKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdQJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIscG9wIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICBjYXNlICdMJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbCIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3cnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgcmVhZF93cml0ZV9uYW1lc1tHRVRfRklFTEQgKGluc24sIDI1LCAyNSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMywgMjYpID09IDUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixyIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnWic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixtICIpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgaWYgKCFHRVRfRklFTEQgKGluc24sIDIxLCAyMSkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix6Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJKGluZm8tPnN0cmVhbSwgIiVzIiwgYWRkX2NvbXBsX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1knOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCShpbmZvLT5zdHJlYW0sICIsZGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDIwLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd5JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkoaW5mby0+c3RyZWFtLCAiLGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdHN2Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdCJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZGIiKTsKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRzdiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIC8qIEVYVFJEL1cgaGFzIGEgZm9sbG93aW5nIGNvbmRpdGlvbi4gICovCi0JCSAgICAgIGlmICgqKHMgKyAxKSA9PSAnPycpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2lnbmVkX3Vuc2lnbmVkX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCQkgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyAiLCBzaWduZWRfdW5zaWduZWRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJCSAgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIG1peF9oYWxmX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgKGluc24sIDE3LCAxNyldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdIJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIHNhdHVyYXRpb25fbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgIChpbnNuLCAyNCwgMjUpXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnKic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiLCVkJWQlZCVkICIsCi0JCQkgICBHRVRfRklFTEQgKGluc24sIDE3LCAxOCksIEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSwKLQkJCSAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDIzKSwgR0VUX0ZJRUxEIChpbnNuLCAyNCwgMjUpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3EnOgotCQkgICAgICB7Ci0JCQlpbnQgbSwgYTsKLQotCQkJbSA9IEdFVF9GSUVMRCAoaW5zbiwgMjgsIDI4KTsKLQkJCWEgPSBHRVRfRklFTEQgKGluc24sIDI5LCAyOSk7Ci0KLQkJCWlmIChtICYmICFhKQotCQkJICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCWVsc2UgaWYgKG0gJiYgYSkKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQllbHNlCi0JCQkgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSAnSic6Ci0JCSAgICAgIHsKLQkJCWludCBvcGNvZGUgPSBHRVRfRklFTEQgKGluc24sIDAsIDUpOwotCi0JCQlpZiAob3Bjb2RlID09IDB4MTYgfHwgb3Bjb2RlID09IDB4MWUpCi0JCQkgIHsKLQkJCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyOSwgMjkpID09IDApCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICB7Ci0JCQlpbnQgb3Bjb2RlID0gR0VUX0ZJRUxEIChpbnNuLCAwLCA1KTsKLQotCQkJaWYgKG9wY29kZSA9PSAweDEzIHx8IG9wY29kZSA9PSAweDFiKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKG9wY29kZSA9PSAweDE3IHx8IG9wY29kZSA9PSAweDFmKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0KLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbmRpdGlvbnMuICAqLwotCQljYXNlICc/JzoKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBzd2l0Y2ggKCpzKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgJ2YnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgZmxvYXRfY29tcF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDI3LCAzMSldKTsKLQkJCWJyZWFrOwotCi0JCSAgICAgIC8qIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBhcmUgZm9yIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb25zCi0JCQkgICB3aGljaCBkaXN0aW5ndWlzaCB0cnVlL2ZhbHNlIGNvbmRpdGlvbnMgYnkgb3Bjb2RlCi0JCQkgICByYXRoZXIgdGhhbiBieSB0aGUgJ2YnIGJpdCAoc2lnaCk6IGNvbWIsIGNvbWliLAotCQkJICAgYWRkYiwgYWRkaWIgKi8KLQkJICAgICAgY2FzZSAndCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0sCi0JCQkJCWluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ24nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ04nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDIsIDIpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ1EnOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNtcGliX2NvbmRfNjRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSwKLQkJCQkJaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnQCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpCi0JCQkJCSsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdzJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdTJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdhJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0EnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgYWRkX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnZCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnVyc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICB3aWRlX2FkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSArIAotCQkJCQkgICAgICBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnbCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnTCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAndSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnVSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAneSc6Ci0JCSAgICAgIGNhc2UgJ3gnOgotCQkgICAgICBjYXNlICdiJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJICAgc2hpZnRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldKTsKLQotCQkJLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIGFyZ3MgaXMgJ24nLCBpdCB3aWxsIGhhbmRsZQotCQkJICAgcHV0dGluZyBvdXQgdGhlIHNwYWNlLiAgKi8KLQkJCWlmIChzWzFdICE9ICduJykKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnWCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBzaGlmdF9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0InOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICBiYl9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE2KV0pOwotCi0JCQkvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYXJncyBpcyAnbicsIGl0IHdpbGwgaGFuZGxlCi0JCQkgICBwdXR0aW5nIG91dCB0aGUgc3BhY2UuICAqLwotCQkJaWYgKHNbMV0gIT0gJ24nKQotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnVic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNXJfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81Ul9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdVJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzEwVV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdCJzoKLQkJY2FzZSAnUSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81UV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzExIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnayc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8yMSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdsJzoKLQkJICAvKiAxNi1iaXQgbG9uZyBkaXNwLiwgUEEyLjAgd2lkZSBvbmx5LiAgKi8KLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE2IChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkgIGlmIChpbnNuICYgMHgyKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiAiKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTic6Ci0JCSAgaWYgKChpbnNuICYgMHgyMCkgJiYgc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZSBpZiAoaW5zbiAmIDB4MjApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuIik7Ci0JCSAgZWxzZSBpZiAoc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyA4ICsgZXh0cmFjdF8xMiAoaW5zbiksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVyc6Ci0JCSAgLyogMTcgYml0IFBDLXJlbGF0aXZlIGJyYW5jaC4gICovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIDggCi0JCQkJCQkrIGV4dHJhY3RfMTcgKGluc24pKSwKLQkJCQkJICAgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd6JzoKLQkJICAvKiAxNyBiaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBpcyBhbiBvZmZzZXQgZnJvbSBhIHJlZ2lzdGVyCi0JCSAgICAgc28gaXQgZ2V0cyBkaXNhc3NzZW1ibGVkIGFzIGp1c3QgYSBudW1iZXIsIG5vdCBhbnkgc29ydAotCQkgICAgIG9mIGFkZHJlc3MuICAqLwotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTcgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdaJzoKLQkJICAvKiBhZGRpbCAlcjEgaW1wbGljaXQgb3V0cHV0LiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlcjEiKTsKLQkJICBicmVhazsKLQotCQljYXNlICdZJzoKLQkJICAvKiBiZSxsICVzcjAsJXIzMSBpbXBsaWNpdCBvdXRwdXQuICAqLwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzcjAsJSVyMzEiKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnQCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIEdFVF9GSUVMRCAoaW5zbiwgMjQsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJyonOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDIyLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICchJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc2FyIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAzMSAtIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ34nOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSBHRVRfRklFTEQgKGluc24sIDIwLCAyMCkgPDwgNTsKLQkJICAgIG51bSB8PSBHRVRfRklFTEQgKGluc24sIDIyLCAyNik7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgNjMgLSBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICdQJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpKTsKLQkJICBicmVhazsKLQkJY2FzZSAncSc6Ci0JCSAgewotCQkgICAgaW50IG51bTsKLQkJICAgIG51bSA9IEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSA8PCA1OwotCQkgICAgbnVtIHw9IEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KTsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICdUJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzIgLSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpOwotCQkgIGJyZWFrOwotCQljYXNlICclJzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gKEdFVF9GSUVMRCAoaW5zbiwgMjMsIDIzKSArIDEpICogMzI7Ci0JCSAgICBudW0gLT0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIG51bSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJ3wnOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSAoR0VUX0ZJRUxEIChpbnNuLCAxOSwgMTkpICsgMSkgKiAzMjsKLQkJICAgIG51bSAtPSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSk7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnJCc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjgpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnQSc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxOCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgR0VUX0ZJRUxEIChpbnNuLCAyMywgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTyc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwyMCkgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMic6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjIpIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcxJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcwJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0YnOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChzWzFdID09ICdHJyB8fCBzWzFdID09ICc/JykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxOSwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDE5LCAyMCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLAotCQkJCQkJCQkgIDE3LCAxOCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSCc6Ci0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA9PSAxKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbMF0pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzFdKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSSc6Ci0JCSAgLyogaWYgbm8gZGVzdGluYXRpb24gY29tcGxldGVyIGFuZCBub3QgYmVmb3JlIGEgY29tcGxldGVyCi0JCSAgICAgZm9yIGZjbXAsIG5lZWQgYSBzcGFjZSBoZXJlICovCi0JCSAgaWYgKHNbMV0gPT0gJz8nKQotCQkgICAgZnB1dHNfZmlsdGVyZWQgKGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDIwLCAyMCldLAotCQkJCSAgICBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIwKV0pOwotCQkgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnSic6Ci0gICAgICAgICAgICAgICAgICBmcHV0X2NvbnN0IChleHRyYWN0XzE0IChpbnNuKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICcjJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKTsKLQkJICAgIGludCBpbW0xMCA9IEdFVF9GSUVMRCAoaW5zbiwgMTgsIDI3KTsKLQkJICAgIGludCBkaXNwOwotCi0JCSAgICBpZiAoc2lnbikKLQkJICAgICAgZGlzcCA9ICgtMSA8PCAxMCkgfCBpbW0xMDsKLQkJICAgIGVsc2UKLQkJICAgICAgZGlzcCA9IGltbTEwOwotCi0JCSAgICBkaXNwIDw8PSAzOwotCQkgICAgZnB1dF9jb25zdCAoZGlzcCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnSyc6Ci0JCWNhc2UgJ2QnOgotCQkgIHsKLQkJICAgIGludCBzaWduID0gR0VUX0ZJRUxEIChpbnNuLCAzMSwgMzEpOwotCQkgICAgaW50IGltbTExID0gR0VUX0ZJRUxEIChpbnNuLCAxOCwgMjgpOwotCQkgICAgaW50IGRpc3A7Ci0KLQkJICAgIGlmIChzaWduKQotCQkgICAgICBkaXNwID0gKC0xIDw8IDExKSB8IGltbTExOwotCQkgICAgZWxzZQotCQkgICAgICBkaXNwID0gaW1tMTE7Ci0KLQkJICAgIGRpc3AgPDw9IDI7Ci0JCSAgICBmcHV0X2NvbnN0IChkaXNwLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQljYXNlICd5JzoKLQkJICB7Ci0JCSAgICAvKiAxNi1iaXQgbG9uZyBkaXNwLiwgUEEyLjAgd2lkZSBvbmx5LiAgKi8KLQkJICAgIGludCBkaXNwID0gZXh0cmFjdF8xNiAoaW5zbik7Ci0JCSAgICBkaXNwICY9IH4zOwotCQkgICAgZnB1dF9jb25zdCAoZGlzcCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnJic6Ci0JCSAgewotCQkgICAgLyogMTYtYml0IGxvbmcgZGlzcC4sIFBBMi4wIHdpZGUgb25seS4gICovCi0JCSAgICBpbnQgZGlzcCA9IGV4dHJhY3RfMTYgKGluc24pOwotCQkgICAgZGlzcCAmPSB+NzsKLQkJICAgIGZwdXRfY29uc3QgKGRpc3AsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCS8qID8hPyBGSVhNRSAqLwotCQljYXNlICdfJzoKLQkJY2FzZSAneyc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKCJEaXNhc3NlbWJsZXIgYm90Y2guXG4iLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdtJzoKLQkJICB7Ci0JCSAgICBpbnQgeSA9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KTsKLQotCQkgICAgaWYgKHkgIT0gMSkKLQkJICAgICAgZnB1dF9jb25zdCAoKHkgXiAxKSAtIDEsIGluZm8pOwotCQkgIH0KLQkJICBicmVhazsKLQotCQljYXNlICdoJzoKLQkJICB7Ci0JCSAgICBpbnQgY2JpdDsKLQotCQkgICAgY2JpdCA9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KTsKLQotCQkgICAgaWYgKGNiaXQgPiAwKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIGNiaXQgLSAxKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQljYXNlICc9JzoKLQkJICB7Ci0JCSAgICBpbnQgY29uZCA9IEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKTsKLQotCQkgICAgaWYgKGNvbmQgPT0gMCkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDEpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiYWNjICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAyKQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoInJlaiAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gNSkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2M4ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSA2KQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoInJlajggIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDkpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiYWNjNiAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gMTMpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiYWNjNCAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gMTcpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiYWNjMiAiLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQljYXNlICdYJzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICsgOCAKLQkJCQkJCSsgZXh0cmFjdF8yMiAoaW5zbikpLAotCQkJCQkgICAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0wnOgotCQkgIGZwdXRzX2ZpbHRlcmVkICgiLCVyMiIsIGluZm8pOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqcyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgcmV0dXJuIHNpemVvZihpbnNuKTsKLQl9Ci0gICAgfQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlOHgiLCBpbnNuKTsKLSAgcmV0dXJuIHNpemVvZihpbnNuKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaTM3MC1kaXMuYyBiL29wY29kZXMvaTM3MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjMGZmMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2kzNzAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotCi0vKiBpMzcwLWRpcy5jIC0tIERpc2Fzc2VtYmxlIEluc3RydWN0aW9uIDM3MCAoRVNBLzM5MCkgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFBvd2VyUEMgdmVyc2lvbiB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBSZXdyaXR0ZW4gZm9yIGkzNzAgRVNBLzM5MCBzdXBwb3J0IGJ5IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9pMzcwLmgiCi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMsIGFsbCBvZiB3aGljaCB1c2UKLSAgIHRoZSBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGRlZmluZWQgaW4gZGlzLWFzbS5oLgotKi8KLQotaW50Ci1wcmludF9pbnNuX2kzNzAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls4XTsKLSAgaW50IHN0YXR1czsKLSAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgY29uc3Qgc3RydWN0IGkzNzBfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSAqb3Bjb2RlX2VuZDsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDYsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIENhc3QgdGhlIGJ5dGVzIGludG8gdGhlIGluc24gKGluIGEgaG9zdC1lbmRpYW4gaW5kZXAgd2F5KSAqLwotICBpbnNuLmlbMF0gPSAoYnVmZmVyWzBdIDw8IDI0KSAmIDB4ZmYwMDAwMDA7Ci0gIGluc24uaVswXSB8PSAoYnVmZmVyWzFdIDw8IDE2KSAmIDB4ZmYwMDAwOwotICBpbnNuLmlbMF0gfD0gKGJ1ZmZlclsyXSA8PCA4KSAmIDB4ZmYwMDsKLSAgaW5zbi5pWzBdIHw9IGJ1ZmZlclszXSAgJiAweGZmOwotICBpbnNuLmlbMV0gPSAoYnVmZmVyWzRdIDw8IDI0KSAmIDB4ZmYwMDAwMDA7Ci0gIGluc24uaVsxXSB8PSAoYnVmZmVyWzVdIDw8IDE2KSAmIDB4ZmYwMDAwOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBvcGNvZGUgdGFibGUuICBXZSBjb3VsZCBzcGVlZCB0aGlzIHVwCi0gICAgIGEgYml0IGJ5IGRvaW5nIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbWFqb3Igb3Bjb2RlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IGkzNzBfb3Bjb2RlcyArIGkzNzBfbnVtX29wY29kZXM7Ci0gIGZvciAob3Bjb2RlID0gaTM3MF9vcGNvZGVzOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IGkzNzBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGkzNzBfaW5zbl90IG1hc2tlZDsKLSAgICAgIGludCBpbnZhbGlkOwotCi0gICAgICAvKiBNYXNrIG9mZiBvcGVyYW5kcywgYW5kIGxvb2sgZm9yIGEgbWF0Y2ggLi4uICovCi0gICAgICBtYXNrZWQgPSBpbnNuOwotICAgICAgaWYgKDIgPT0gb3Bjb2RlLT5sZW4pCi0gICAgICAgIHsKLSAgICAgICAgICBtYXNrZWQuaVswXSA+Pj0gMTY7Ci0gICAgICAgICAgbWFza2VkLmlbMF0gJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICBtYXNrZWQuaVswXSAmPSBvcGNvZGUtPm1hc2suaVswXTsKLSAgICAgIGlmIChtYXNrZWQuaVswXSAhPSBvcGNvZGUtPm9wY29kZS5pWzBdKSBjb250aW51ZTsKLQotICAgICAgaWYgKDYgPT0gb3Bjb2RlLT5sZW4pCi0gICAgICAgIHsKLSAgICAgICAgICBtYXNrZWQuaVsxXSAmPSBvcGNvZGUtPm1hc2suaVsxXTsKLSAgICAgICAgICBpZiAobWFza2VkLmlbMV0gIT0gb3Bjb2RlLT5vcGNvZGUuaVsxXSkgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgLyogRm91bmQgYSBtYXRjaC4gIGFkanVzdCBhIHRhZCAqLwotICAgICAgaWYgKDIgPT0gb3Bjb2RlLT5sZW4pCi0gICAgICAgIHsKLSAgICAgICAgICBpbnNuLmlbMF0gPj49IDE2OwotICAgICAgICAgIGluc24uaVswXSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0gICAgICAgICBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLSAgICAgICAgIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGludmFsaWQgPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgb3BlcmFuZCA9IGkzNzBfb3BlcmFuZHMgKyAqb3BpbmRleDsKLSAgICAgICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLSAgICAgICAgICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLSAgICAgICAgfQotICAgICAgaWYgKGludmFsaWQpIGNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgICAgIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgbG9uZyB2YWx1ZTsKLQotICAgICAgICAgIG9wZXJhbmQgPSBpMzcwX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLSAgICAgICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0gICAgICAgICAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2YWx1ZSA9IChpbnNuLmlbMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotICAgICAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfT1BUSU9OQUwpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIihyJWxkKSIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfU0JBU0UpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKHIlbGQpIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9JTkRFWCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKHIlbGQsIiwgdmFsdWUpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9MRU5HVEgpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVsZCwiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX0JBU0UpICE9IDApCi0gICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlbGQpIiwgdmFsdWUpOwotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9HUFIpICE9IDApCi0gICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlbGQsIiwgdmFsdWUpOwotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9GUFIpICE9IDApCi0gICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImYlbGQsIiwgdmFsdWUpOwotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9SRUxBVElWRSkgIT0gMCkKLSAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICVsZCwgIiwgdmFsdWUpOwotCi0gICAgICAgIH0KLQotICAgICAgcmV0dXJuIG9wY29kZS0+bGVuOwotCi0gICAgfQotCi0KLSAgLyogV2UgY291bGQgbm90IGZpbmQgYSBtYXRjaC4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLnNob3J0IDB4JTAyeCUwMngiLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7Ci0KLSAgcmV0dXJuIDI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzNzAtb3BjLmMgYi9vcGNvZGVzL2kzNzAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGYzNzQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pMzcwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTU5ICswLDAgQEAKLS8qIGkzNzAtb3BjLmMgLS0gSW5zdHJ1Y3Rpb24gMzcwIChFU0EvMzkwKSBhcmNoaXRlY3R1cmUgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgUG93ZXJQQyB2ZXJzaW9uIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSAgIFJld3JpdHRlbiBmb3IgaTM3MCBFU0EvMzkwIHN1cHBvcnQgYnkgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPiAxOTk4LCAxOTk5Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvaTM3MC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIGkzNzAgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQotICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcwotICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCi0gICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcwotICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgotICAgdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBpMzcwX2luc25fdCBpbnNlcnRfc3NfYjIgIFBBUkFNUyAoKCBpMzcwX2luc25fdCwgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGkzNzBfaW5zbl90IGluc2VydF9zc19kMiAgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgaTM3MF9pbnNuX3QgaW5zZXJ0X3J4Zl9yMyAgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NzX2IyIFBBUkFNUyAoKCBpMzcwX2luc25fdCwgaW50ICopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc3NfZDIgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBpbnQgKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9yeGZfcjMgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBpbnQgKikpOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuCi0gICBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncywgbmFtZS4KLSAgIFRoZSB0eXBlczoKLSAgIEkzNzBfT1BFUkFORF9HUFIgcmVnaXN0ZXIsIG11c3QgbmFtZSBhIHJlZ2lzdGVyLCBtdXN0IGJlIHByZXNlbnQKLSAgIEkzNzBfT1BFUkFORF9SRUxBVElWRSBkaXNwbGFjZW1lbnQgb3IgbGVnbnRoIGZpZWxkLCBtdXN0IGJlIHByZXNlbnQKLSAgIEkzNzBfT1BFUkFORF9CQVNFIGJhc2UgcmVnaXN0ZXI7IGlmIHByZXNlbnQsIG11c3QgbmFtZSBhIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgYWJzZW50LCBzaG91bGQgdGFrZSB2YWx1ZSBvZiB6ZXJvCi0gICBJMzcwX09QRVJBTkRfSU5ERVggaW5kZXggcmVnaXN0ZXI7IGlmIHByZXNlbnQsIG11c3QgbmFtZSBhIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgYWJzZW50LCBzaG91bGQgdGFrZSB2YWx1ZSBvZiB6ZXJvCi0gICBJMzcwX09QRVJBTkRfT1BUSU9OQUwgb3RoZXIgb3B0aW9uYWwgb3BlcmFuZCAodXN1YWxsIHJlZz8pCi0qLwotCi1jb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kIGkzNzBfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBvcGVyYW5kcy4gICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCwgMCwgMCwgMCwgMCwgInVudXNlZCIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlIgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSX1IxIChVTlVTRUQgKyAxKQotI2RlZmluZSBSUl9SMV9NQVNLICgweGYgPDwgNCkKLSAgeyA0LCA0LCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlIgUjEiIH0sCi0KLSAgLyogVGhlIFIyIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJSIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUl9SMiAoUlJfUjEgKyAxKQotI2RlZmluZSBSUl9SMl9NQVNLICgweGYpCi0gIHsgNCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSIFIyIiB9LAotCi0gIC8qIFRoZSBJIGZpZWxkIGluIGFuIFJSIGZvcm0gU1ZDLXN0eWxlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlJfSSAoUlJfUjIgKyAxKQotI2RlZmluZSBSUl9JX01BU0sgKDB4ZmYpCi0gIHsgOCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiUlIgSSAoc3ZjKSIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkVfUjEgKFJSX0kgKyAxKQotI2RlZmluZSBSUkVfUjFfTUFTSyAoMHhmIDw8IDQpCi0gIHsgNCwgNCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRSBSMSIgfSwKLQotICAvKiBUaGUgUjIgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkVfUjIgKFJSRV9SMSArIDEpCi0jZGVmaW5lIFJSRV9SMl9NQVNLICgweGYpCi0gIHsgNCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRSBSMiIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJGIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkZfUjEgKFJSRV9SMiArIDEpCi0jZGVmaW5lIFJSRl9SMV9NQVNLICgweGYgPDwgNCkKLSAgeyA0LCA0LCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlJGIFIxIiB9LAotCi0gIC8qIFRoZSBSMiByZWdpc3RlciBmaWVsZCBpbiBhbiBSUkYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSRl9SMiAoUlJGX1IxICsgMSkKLSNkZWZpbmUgUlJGX1IyX01BU0sgKDB4ZikKLSAgeyA0LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlJGIFIyIiB9LAotCi0gIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSUkYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSRl9SMyAoUlJGX1IyICsgMSkKLSNkZWZpbmUgUlJGX1IzX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRiBSMyIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlggb3IgUlMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX1IxIChSUkZfUjMgKyAxKQotI2RlZmluZSBSWF9SMV9NQVNLICgweGYgPDwgMjApCi0gIHsgNCwgMjAsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJSWCBSMSIgfSwKLQotICAvKiBUaGUgWDIgaW5kZXggZmllbGQgaW4gYW4gUlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX1gyIChSWF9SMSArIDEpCi0jZGVmaW5lIFJYX1gyX01BU0sgKDB4ZiA8PCAxNikKLSAgeyA0LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiB8IEkzNzBfT1BFUkFORF9JTkRFWCwgIlJYIFgyIn0sCi0KLSAgLyogVGhlIEIyIGJhc2UgZmllbGQgaW4gYW4gUlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX0IyIChSWF9YMiArIDEpCi0jZGVmaW5lIFJYX0IyX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiB8IEkzNzBfT1BFUkFORF9CQVNFLCAiUlggQjIifSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFJYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSWF9EMiAoUlhfQjIgKyAxKQotI2RlZmluZSBSWF9EMl9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiUlggRDIifSwKLQotIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSWEYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYRl9SMyAoUlhfRDIgKyAxKQotI2RlZmluZSBSWEZfUjNfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCBpbnNlcnRfcnhmX3IzLCBleHRyYWN0X3J4Zl9yMywgSTM3MF9PUEVSQU5EX0dQUiwgIlJYRiBSMyIgfSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSU19EMiAoUlhGX1IzICsgMSkKLSNkZWZpbmUgUlNfRDJfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlJTIEQyIn0sCi0KLSAgLyogVGhlIFIzIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSU19SMyAoUlNfRDIgKyAxKQotI2RlZmluZSBSU19SM19NQVNLICgweGYgPDwgMTYpCi0gIHsgNCwgMTYsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJSUyBSMyIgfSwKLQotICAvKiBUaGUgQjIgYmFzZSBmaWVsZCBpbiBhbiBSUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNfQjIgKFJTX1IzICsgMSkKLSNkZWZpbmUgUlNfQjJfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJSUyBCMiJ9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBCMiBiYXNlIGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBOb3RlIHRoYXQgdGhpcyBmaWVsZCB3aWxsIGFsbW9zdCBhbHdheXMgYmUgYWJzZW50ICovCi0jZGVmaW5lIFJTX0IyX09QVCAoUlNfQjIgKyAxKQotI2RlZmluZSBSU19CMl9PUFRfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX09QVElPTkFMLCAiUlMgQjIgT1BUIn0sCi0KLSAgLyogVGhlIFIxIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNJX1IxIChSU19CMl9PUFQgKyAxKQotI2RlZmluZSBSU0lfUjFfTUFTSyAoMHhmIDw8IDIwKQotICB7IDQsIDIwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlNJIFIxIiB9LAotCi0gIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSU0kgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJTSV9SMyAoUlNJX1IxICsgMSkKLSNkZWZpbmUgUlNJX1IzX01BU0sgKDB4ZiA8PCAxNikKLSAgeyA0LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJTSSBSMyIgfSwKLQotICAvKiBUaGUgSTIgaW1tZWRpYXRlIGZpZWxkIGluIGFuIFJTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNJX0kyIChSU0lfUjMgKyAxKQotI2RlZmluZSBSU0lfSTJfTUFTSyAoMHhmZmZmKQotICB7IDE2LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJSU0kgSTIiIH0sCi0KLSAgLyogVGhlIFIxIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSSV9SMSAoUlNJX0kyICsgMSkKLSNkZWZpbmUgUklfUjFfTUFTSyAoMHhmIDw8IDIwKQotICB7IDQsIDIwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUkkgUjEiIH0sCi0KLSAgLyogVGhlIEkyIGltbWVkaWF0ZSBmaWVsZCBpbiBhbiBSSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUklfSTIgKFJJX1IxICsgMSkKLSNkZWZpbmUgUklfSTJfTUFTSyAoMHhmZmZmKQotICB7IDE2LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJSSSBJMiIgfSwKLQotIC8qIFRoZSBJMiBpbmRleCBmaWVsZCBpbiBhbiBTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0lfSTIgKFJJX0kyICsgMSkKLSNkZWZpbmUgU0lfSTJfTUFTSyAoMHhmZiA8PCAxNikKLSAgeyA4LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiU0kgSTIifSwKLQotIC8qIFRoZSBCMSBiYXNlIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFNJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSV9CMSAoU0lfSTIgKyAxKQotI2RlZmluZSBTSV9CMV9NQVNLICgweGYgPDwgMTIpCi0gIHsgNCwgMTIsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJTSSBCMSIgfSwKLQotICAvKiBUaGUgRDEgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFNJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSV9EMSAoU0lfQjEgKyAxKQotI2RlZmluZSBTSV9EMV9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiU0kgRDEiIH0sCi0KLSAvKiBUaGUgQjIgYmFzZSByZWdpc3RlciBmaWVsZCBpbiBhbiBTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTX0IyIChTSV9EMSArIDEpCi0jZGVmaW5lIFNfQjJfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJTIEIyIiB9LAotCi0gIC8qIFRoZSBEMiBkaXNwbGFjZW1lbnQgZmllbGQgaW4gYW4gUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU19EMiAoU19CMiArIDEpCi0jZGVmaW5lIFNfRDJfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlMgRDIiIH0sCi0KLSAgLyogVGhlIEwgbGVuZ3RoIGZpZWxkIGluIGFuIFNTIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFNTX0wgKFNfRDIgKyAxKQotI2RlZmluZSBTU19MX01BU0sgKDB4ZmZmZjw8MTYpCi0gIHsgOCwgMTYsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSB8IEkzNzBfT1BFUkFORF9MRU5HVEgsICJTUyBMIiB9LAotCi0gLyogVGhlIEIxIGJhc2UgcmVnaXN0ZXIgZmllbGQgaW4gYW4gU1MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNTX0IxIChTU19MICsgMSkKLSNkZWZpbmUgU1NfQjFfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiU1MgQjEiIH0sCi0KLSAgLyogVGhlIEQxIGRpc3BsYWNlbWVudCBmaWVsZCBpbiBhbiBTUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1NfRDEgKFNTX0IxICsgMSkKLSNkZWZpbmUgU1NfRDFfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlNTIEQxIiB9LAotCi0gLyogVGhlIEIyIGJhc2UgcmVnaXN0ZXIgZmllbGQgaW4gYW4gU1MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNTX0IyIChTU19EMSArIDEpCi0jZGVmaW5lIFNTX0IyX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgaW5zZXJ0X3NzX2IyLCBleHRyYWN0X3NzX2IyLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJTUyBCMiIgfSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFNTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTU19EMiAoU1NfQjIgKyAxKQotI2RlZmluZSBTU19EMl9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgaW5zZXJ0X3NzX2QyLCBleHRyYWN0X3NzX2QyLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJTUyBEMiIgfSwKLQotCi19OwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaTM3MF9pbnNuX3QKLWluc2VydF9zc19iMiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZikgPDwgMjg7Ci0gIHJldHVybiBpbnNuOwotfQotCi1zdGF0aWMgaTM3MF9pbnNuX3QKLWluc2VydF9zc19kMiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZmZmKSA8PCAxNjsKLSAgcmV0dXJuIGluc247Ci19Ci0KLXN0YXRpYyBpMzcwX2luc25fdAotaW5zZXJ0X3J4Zl9yMyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZikgPDwgMjg7Ci0gIHJldHVybiBpbnNuOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zc19iMiAoaW5zbiwgaW52YWxpZCkKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKGluc24uaVsxXSA+PjI4KSAmIDB4ZjsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc3NfZDIgKGluc24sIGludmFsaWQpCi0gICAgIGkzNzBfaW5zbl90IGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuIChpbnNuLmlbMV0gPj4xNikgJiAweGZmZjsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcnhmX3IzIChpbnNuLCBpbnZhbGlkKQotICAgICBpMzcwX2luc25fdCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoaW5zbi5pWzFdID4+MjgpICYgMHhmOwotfQotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMuICAqLwotCi0vKiBUaGUgc2hvcnQtaW5zdHJ1Y3Rpb24gb3Bjb2RlLiAgKi8KLSNkZWZpbmUgT1BTKHgpICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHhmZikgPDwgOCkKLSNkZWZpbmUgT1BTX01BU0sgT1BTICgweGZmKQotCi0vKiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gb3Bjb2RlICovCi0jZGVmaW5lIFhPUFMoeCkgKCgoKHVuc2lnbmVkIHNob3J0KSh4KSkgJiAweGZmKSA8PCAyNCkKLSNkZWZpbmUgWE9QU19NQVNLIFhPUFMgKDB4ZmYpCi0KLS8qIHRoZSBTIGluc3RydWN0aW9uIG9wY29kZSAqLwotI2RlZmluZSBTT1BTKHgpICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHhmZmZmKSA8PCAxNikKLSNkZWZpbmUgU09QU19NQVNLIFNPUFMgKDB4ZmZmZikKLQotLyogdGhlIEUgaW5zdHJ1Y3Rpb24gb3Bjb2RlICovCi0jZGVmaW5lIEVPUFMoeCkgKCgodW5zaWduZWQgc2hvcnQpKHgpKSAmIDB4ZmZmZikKLSNkZWZpbmUgRU9QU19NQVNLIEVPUFMgKDB4ZmZmZikKLQotLyogdGhlIFJJIGluc3RydWN0aW9uIG9wY29kZSAqLwotI2RlZmluZSBST1BTKHgpICgoKCgodW5zaWduZWQgc2hvcnQpKHgpKSAmIDB4ZmYwKSA8PCAyMCkgfCBcCi0gICAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHgwMGYpIDw8IDE2KSkKLSNkZWZpbmUgUk9QU19NQVNLIFJPUFMgKDB4ZmZmKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEFuIEUgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEUob3ApICAoRU9QUyAob3ApKQotI2RlZmluZSBFX01BU0sgRSAoMHhmZmZmKQotCi0vKiBBbiBSUiBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlIob3AsIHIxLCByMikgXAotICAoT1BTIChvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDQpIHwgICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkocjIpKSAmIDB4ZikgKSkKLQotI2RlZmluZSBSUl9NQVNLIFJSICgweGZmLCAweDAsIDB4MCkKLQotLyogQW4gU1ZDLXN0eWxlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1ZDKG9wLCBpKSBcCi0gIChPUFMgKG9wKSB8ICgoKHVuc2lnbmVkIHNob3J0KShpKSkgJiAweGZmKSkKLQotI2RlZmluZSBTVkNfTUFTSyBTVkMgKDB4ZmYsIDB4MCkKLQotLyogQW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkUob3AsIHIxLCByMikgXAotICAoU09QUyAob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCA0KSB8ICAgXAotICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShyMikpICYgMHhmKSApKQotCi0jZGVmaW5lIFJSRV9NQVNLIFJSRSAoMHhmZmZmLCAweDAsIDB4MCkKLQotLyogQW4gUlJGIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkYob3AsIHIzLCByMSwgcjIpIFwKLSAgKFNPUFMgKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjMpKSAmIDB4ZikgPDwgMTIpIHwgICBcCi0gICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDQpICB8ICAgXAotICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShyMikpICYgMHhmKSApKQotCi0jZGVmaW5lIFJSRl9NQVNLIFJSRiAoMHhmZmZmLCAweDAsIDB4MCwgMHgwKQotCi0vKiBBbiBSWCBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBSWChvcCwgcjEsIHgyLCBiMiwgZDIpIFwKLSAgKFhPUFMob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCAyMCkgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHgyKSkgJiAweGYpIDw8IDE2KSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBSWF9NQVNLIFJYICgweGZmLCAweDAsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFJYRSBmb3JtIGluc3RydWN0aW9uIGhpZ2ggd29yZC4gKi8KLSNkZWZpbmUgUlhFSChvcCwgcjEsIHgyLCBiMiwgZDIpIFwKLSAgKFhPUFMob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCAyMCkgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHgyKSkgJiAweGYpIDw8IDE2KSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBSWEVIX01BU0sgUlhFSCAoMHhmZiwgMCwgMCwgMCwgMCkKLQotLyogQW4gUlhFIGZvcm0gaW5zdHJ1Y3Rpb24gbG93IHdvcmQuICovCi0jZGVmaW5lIFJYRUwob3ApIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShvcCkpICYgMHhmZikgPDwgMTYgKQotCi0jZGVmaW5lIFJYRUxfTUFTSyBSWEVMICgweGZmKQotCi0vKiBBbiBSWEYgZm9ybSBpbnN0cnVjdGlvbiBoaWdoIHdvcmQuICovCi0jZGVmaW5lIFJYRkgob3AsIHIxLCB4MiwgYjIsIGQyKSBcCi0gIChYT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjEpKSAmIDB4ZikgPDwgMjApIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KSh4MikpICYgMHhmKSA8PCAxNikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGIyKSkgJiAweGYpIDw8IDEyKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoZDIpKSAmIDB4ZmZmKSkpCi0KLSNkZWZpbmUgUlhGSF9NQVNLIFJYRkggKDB4ZmYsIDAsIDAsIDAsIDApCi0KLS8qIEFuIFJYRiBmb3JtIGluc3RydWN0aW9uIGxvdyB3b3JkLiAqLwotI2RlZmluZSBSWEZMKG9wLCByMykgXAotICAgICAgICAgICAgICAoKCgoKHVuc2lnbmVkIHNob3J0KShyMykpICYgMHhmKSAgPDwgMjggKSB8IFwKLSAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkob3ApKSAmIDB4ZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgUlhGTF9NQVNLIFJYRkwgKDB4ZmYsIDApCi0KLS8qIEFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFJTKG9wLCByMSwgYjMsIGIyLCBkMikgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDIwKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjMpKSAmIDB4ZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShiMikpICYgMHhmKSA8PCAxMikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGQyKSkgJiAweGZmZikpKQotCi0jZGVmaW5lIFJTX01BU0sgUlMgKDB4ZmYsIDB4MCwgMHgwLCAweDAsIDB4MCkKLQotLyogQW4gUlNJIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFJTSShvcCwgcjEsIHIzLCBpMikgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDIwKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkocjMpKSAmIDB4ZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShpMikpICYgMHhmZmZmKSkpCi0KLSNkZWZpbmUgUlNJX01BU0sgUlNJICgweGZmLCAweDAsIDB4MCwgMHgwKQotCi0vKiBBbiBSSSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBSSShvcCwgcjEsIGkyKSBcCi0gIChST1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjEpKSAmIDB4ZikgPDwgMjApIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShpMikpICYgMHhmZmZmKSkpCi0KLSNkZWZpbmUgUklfTUFTSyBSSSAoMHhmZmYsIDB4MCwgMHgwKQotCi0vKiBBbiBTSSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBTSShvcCwgaTIsIGIxLCBkMSkgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKGkyKSkgJiAweGZmKSA8PCAxNikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICA8PCAxMikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGQxKSkgJiAweGZmZikpKQotCi0jZGVmaW5lIFNJX01BU0sgU0kgKDB4ZmYsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFMgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgUyhvcCwgYjIsIGQyKSBcCi0gIChTT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBTX01BU0sgUyAoMHhmZmZmLCAweDAsIDB4MCkKLQotLyogQW4gU1MgZm9ybSBpbnN0cnVjdGlvbiBoaWdoIHdvcmQuICovCi0jZGVmaW5lIFNTSChvcCwgbCwgYjEsIGQxKSBcCi0gIChYT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkobCkpICYgMHhmZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShiMSkpICYgMHhmKSAgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpKSkKLQotLyogQW4gU1MgZm9ybSBpbnN0cnVjdGlvbiBsb3cgd29yZC4gKi8KLSNkZWZpbmUgU1NMKGIyLCBkMikgXAotICAgICAgICAgICAgKCAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICAgPDwgMjgpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgU1NfTUFTSyBTU0ggKDB4ZmYsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFNTRSBmb3JtIGluc3RydWN0aW9uIGhpZ2ggd29yZC4gKi8KLSNkZWZpbmUgU1NFSChvcCwgYjEsIGQxKSBcCi0gIChTT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkoYjEpKSAmIDB4ZikgIDw8IDEyKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoZDEpKSAmIDB4ZmZmKSkpCi0KLS8qIEFuIFNTRSBmb3JtIGluc3RydWN0aW9uIGxvdyB3b3JkLiAqLwotI2RlZmluZSBTU0VMKGIyLCBkMikgXAotICAgICAgICAgICAgKCAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICAgPDwgMjgpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgU1NFX01BU0sgU1NFSCAoMHhmZmZmLCAweDAsIDB4MCkKLQotDAotLyogU21hbGxlciBuYW1lcyBmb3IgdGhlIGZsYWdzIHNvIGVhY2ggZW50cnkgaW4gdGhlIG9wY29kZXMgdGFibGUgd2lsbAotICAgZml0IG9uIGEgc2luZ2xlIGxpbmUuICBUaGVzZSBmbGFncyBhcmUgc2V0IHVwIHNvIHRoYXQgZS5nLiBJWEEgbWVhbnMKLSAgIHRoZSBpbnNuIGlzIHN1cHBvcnRlZCBvbiB0aGUgMzcwL1hBIG9yIG5ld2VyIGFyY2hpdGVjdHVyZS4KLSAgIE5vdGUgdGhhdCAzNzAgb3Igb2xkZXIgb2Jzb2xldGUgaW5zbidzIGFyZSBub3Qgc3VwcG9ydGVkIC4uLgotICovCi0jZGVmaW5lCUlCRglJMzcwX09QQ09ERV9FU0EzOTBfQkYKLSNkZWZpbmUJSUJTCUkzNzBfT1BDT0RFX0VTQTM5MF9CUwotI2RlZmluZQlJQ0sJSTM3MF9PUENPREVfRVNBMzkwX0NLCi0jZGVmaW5lCUlDTQlJMzcwX09QQ09ERV9FU0EzOTBfQ00KLSNkZWZpbmUJSUZYCUkzNzBfT1BDT0RFX0VTQTM5MF9GWAotI2RlZmluZQlJSFgJSTM3MF9PUENPREVfRVNBMzkwX0hYCi0jZGVmaW5lCUlJUglJMzcwX09QQ09ERV9FU0EzOTBfSVIKLSNkZWZpbmUJSU1JCUkzNzBfT1BDT0RFX0VTQTM5MF9NSQotI2RlZmluZQlJUEMJSTM3MF9PUENPREVfRVNBMzkwX1BDCi0jZGVmaW5lCUlQTAlJMzcwX09QQ09ERV9FU0EzOTBfUEwKLSNkZWZpbmUJSVFSCUkzNzBfT1BDT0RFX0VTQTM5MF9RUgotI2RlZmluZQlJUlAJSTM3MF9PUENPREVfRVNBMzkwX1JQCi0jZGVmaW5lCUlTQQlJMzcwX09QQ09ERV9FU0EzOTBfU0EKLSNkZWZpbmUJSVNHCUkzNzBfT1BDT0RFX0VTQTM5MF9TRwotI2RlZmluZQlJU1IJSTM3MF9PUENPREVfRVNBMzkwX1NSCi0jZGVmaW5lCUlUUglJMzcwX09QQ09ERV9FU0EzOTBfU1IKLSNkZWZpbmUJSTM5MAlJQkYgIHwgSUJTIHwgSUNLIHwgSUNNIHwgSUlSIHwgSUZYIHwgSUhYIHwgSU1JIHwgSVBDIHwgSVBMIHwgSVFSIHwgSVJQIHwgSVNBIHwgSVNHIHwgSVNSIHwgSVRSIHwgSTM3MF9PUENPREVfRVNBMzkwCi0jZGVmaW5lCUlFU0EJSTM5MCB8IEkzNzBfT1BDT0RFX0VTQTM3MAotI2RlZmluZSBJWEEJSUVTQSB8IEkzNzBfT1BDT0RFXzM3MF9YQQotI2RlZmluZQlJMzcwCUlYQSAgfCBJMzcwX09QQ09ERV8zNzAKLSNkZWZpbmUgSTM2MAlJMzcwIHwgSTM3MF9PUENPREVfMzYwCi0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkgICAgTEVOICBPUENPREVfSEkgIE9QQ09ERV9MTwlNQVNLX0hJIE1BU0tfTE8JRkxBR1MJCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIEZMQUdTIGFyZSBmbGFncyBpbmRpY2F0ZWQgd2hhdCBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9uLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSBpMzcwX29wY29kZXNbXSA9IHsKLQotLyogRSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAicHIiLCAgICAgMiwge0UoMHgwMTAxKSwgICAgMH0sIHtFX01BU0ssICAwfSwgSUVTQSwgIHswfSB9LAotCi17ICJ0cmFwMiIsICAyLCB7RSgweDAxRkYpLCAgICAwfSwge0VfTUFTSywgIDB9LCBJVFIsICAgezB9IH0sCi17ICJ1cHQiLCAgICAyLCB7RSgweDAxMDIpLCAgICAwfSwge0VfTUFTSywgIDB9LCBJWEEsICAgezB9IH0sCi0KLS8qIFJSIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhciIsICAgICAyLCB7UlIoMHgxYSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImFkciIsICAgIDIsIHtSUigweDJhLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYWVyIiwgICAgMiwge1JSKDB4M2EsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJhbHIiLCAgICAyLCB7UlIoMHgxZSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImF1ciIsICAgIDIsIHtSUigweDJlLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYXdyIiwgICAgMiwge1JSKDB4M2UsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJheHIiLCAgICAyLCB7UlIoMHgzNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImJhbHIiLCAgIDIsIHtSUigweDA1LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYmFzciIsICAgMiwge1JSKDB4MGQsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSVhBLCAgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJiYXNzbSIsICAyLCB7UlIoMHgwYywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJWEEsICAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImJzbSIsICAgIDIsIHtSUigweDBiLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIElYQSwgICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYmNyIiwgICAgMiwge1JSKDB4MDcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJiY3RyIiwgICAyLCB7UlIoMHgwNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImNkciIsICAgIDIsIHtSUigweDI5LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiY2VyIiwgICAgMiwge1JSKDB4MzksMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJjbHIiLCAgICAyLCB7UlIoMHgxNSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImNsY2wiLCAgIDIsIHtSUigweDBmLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiY3IiLCAgICAgMiwge1JSKDB4MTksMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJkZHIiLCAgICAyLCB7UlIoMHgyZCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImRlciIsICAgIDIsIHtSUigweDNkLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiZHIiLCAgICAgMiwge1JSKDB4MWQsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJoZHIiLCAgICAyLCB7UlIoMHgyNCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImhlciIsICAgIDIsIHtSUigweDM0LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibGNkciIsICAgMiwge1JSKDB4MjMsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsY2VyIiwgICAyLCB7UlIoMHgzMywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxjciIsICAgIDIsIHtSUigweDEzLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibGRyIiwgICAgMiwge1JSKDB4MjgsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsZXIiLCAgICAyLCB7UlIoMHgzOCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxuZHIiLCAgIDIsIHtSUigweDIxLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibG5lciIsICAgMiwge1JSKDB4MzEsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsbnIiLCAgICAyLCB7UlIoMHgxMSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxwZHIiLCAgIDIsIHtSUigweDIwLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHBlciIsICAgMiwge1JSKDB4MzAsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJscHIiLCAgICAyLCB7UlIoMHgxMCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxyIiwgICAgIDIsIHtSUigweDE4LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHJkciIsICAgMiwge1JSKDB4MjUsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJscmVyIiwgICAyLCB7UlIoMHgzNSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImx0ZHIiLCAgIDIsIHtSUigweDIyLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHRlciIsICAgMiwge1JSKDB4MzIsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsdHIiLCAgICAyLCB7UlIoMHgxMiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm1kciIsICAgIDIsIHtSUigweDJjLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibWVyIiwgICAgMiwge1JSKDB4M2MsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJtciIsICAgICAyLCB7UlIoMHgxYywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm12Y2wiLCAgIDIsIHtSUigweDBlLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibXhkciIsICAgMiwge1JSKDB4MjcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJteHIiLCAgICAyLCB7UlIoMHgyNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm5yIiwgICAgIDIsIHtSUigweDE0LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAib3IiLCAgICAgMiwge1JSKDB4MTYsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzZHIiLCAgICAyLCB7UlIoMHgyYiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgInNlciIsICAgIDIsIHtSUigweDNiLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAic2xyIiwgICAgMiwge1JSKDB4MWYsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzcG0iLCAgICAyLCB7UlIoMHgwNCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxfSB9LAoteyAic3IiLCAgICAgMiwge1JSKDB4MWIsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzdXIiLCAgICAyLCB7UlIoMHgzZiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgInN3ciIsICAgIDIsIHtSUigweDJmLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAic3hyIiwgICAgMiwge1JSKDB4MzcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJ4ciIsICAgICAyLCB7UlIoMHgxNywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLQotLyogdW51c3VhbCBSUiBmb3JtYXRzICovCi17ICJzdmMiLCAgICAyLCB7U1ZDKDB4MGEsMCksIDB9LCB7U1ZDX01BU0ssIDB9LCBJMzcwLCAge1JSX0l9IH0sCi0KLS8qIFJSRSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiYWRiciIsICAgNCwge1JSRSgweGIzMWEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYWViciIsICAgNCwge1JSRSgweGIzMGEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYXhiciIsICAgNCwge1JSRSgweGIzNGEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYmFrciIsICAgNCwge1JSRSgweGIyNDAsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYnNhIiwgICAgNCwge1JSRSgweGIyNWEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJTLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYnNnIiwgICAgNCwge1JSRSgweGIyNTgsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVNHLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RiciIsICAgNCwge1JSRSgweGIzMTksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RmYnIiLCAgNCwge1JSRSgweGIzOTUsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RmciIsICAgNCwge1JSRSgweGIzYjUsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2ViciIsICAgNCwge1JSRSgweGIzMDksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2VmYnIiLCAgNCwge1JSRSgweGIzOTQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2VmciIsICAgNCwge1JSRSgweGIzYjQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2tzbSIsICAgNCwge1JSRSgweGIyNDEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUNLLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2xzdCIsICAgNCwge1JSRSgweGIyNWQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVNSLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3B5YSIsICAgNCwge1JSRSgweGIyNGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3VzZSIsICAgNCwge1JSRSgweGIyNTcsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hiciIsICAgNCwge1JSRSgweGIzNDksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hmYnIiLCAgNCwge1JSRSgweGIzOTYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hmciIsICAgNCwge1JSRSgweGIzYjYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hyIiwgICAgNCwge1JSRSgweGIzNjksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZGRiciIsICAgNCwge1JSRSgweGIzMWQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZGViciIsICAgNCwge1JSRSgweGIzMGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZHhiciIsICAgNCwge1JSRSgweGIzNGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZHhyIiwgICAgNCwge1JSRSgweGIyMmQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZWFyIiwgICAgNCwge1JSRSgweGIyNGYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZWZwYyIsICAgNCwge1JSRSgweGIzOGMsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZXBhciIsICAgNCwge1JSRSgweGIyMjYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMX0gfSwKLXsgImVyZWciLCAgIDQsIHtSUkUoMHhiMjQ5LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImVzYXIiLCAgIDQsIHtSUkUoMHhiMjI3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjF9IH0sCi17ICJlc3RhIiwgICA0LCB7UlJFKDB4YjI0YSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaWRyIiwgICA0LCB7UlJFKDB4YjM3ZiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaWVyIiwgICA0LCB7UlJFKDB4YjM3NywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaXhyIiwgICA0LCB7UlJFKDB4YjM2NywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJpYWMiLCAgICA0LCB7UlJFKDB4YjIyNCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxfSB9LAoteyAiaXBtIiwgICAgNCwge1JSRSgweGIyMjIsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMX0gfSwKLXsgImlwdGUiLCAgIDQsIHtSUkUoMHhiMjIxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImlza2UiLCAgIDQsIHtSUkUoMHhiMjI5LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIml2c2siLCAgIDQsIHtSUkUoMHhiMjIzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImtkYnIiLCAgIDQsIHtSUkUoMHhiMzE4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImtlYnIiLCAgIDQsIHtSUkUoMHhiMzA4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImt4YnIiLCAgIDQsIHtSUkUoMHhiMzQ4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjZGJyIiwgIDQsIHtSUkUoMHhiMzEzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjZWJyIiwgIDQsIHtSUkUoMHhiMzAzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjeGJyIiwgIDQsIHtSUkUoMHhiMzQzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjeHIiLCAgIDQsIHtSUkUoMHhiMzYzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxkZXIiLCAgIDQsIHtSUkUoMHhiMzI0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxkeGJyIiwgIDQsIHtSUkUoMHhiMzQ1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxlZGJyIiwgIDQsIHtSUkUoMHhiMzQ0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxleGJyIiwgIDQsIHtSUkUoMHhiMzQ2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxleHIiLCAgIDQsIHtSUkUoMHhiMzY2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxuZGJyIiwgIDQsIHtSUkUoMHhiMzExLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxuZWJyIiwgIDQsIHtSUkUoMHhiMzAxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxueGJyIiwgIDQsIHtSUkUoMHhiMzQxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxueHIiLCAgIDQsIHtSUkUoMHhiMzYxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxwZGJyIiwgIDQsIHtSUkUoMHhiMzEwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxwZWJyIiwgIDQsIHtSUkUoMHhiMzAwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxweGJyIiwgIDQsIHtSUkUoMHhiMzQwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxweHIiLCAgIDQsIHtSUkUoMHhiMzYwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0ZGJyIiwgIDQsIHtSUkUoMHhiMzEyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0ZWJyIiwgIDQsIHtSUkUoMHhiMzAyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0eGJyIiwgIDQsIHtSUkUoMHhiMzQyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0eHIiLCAgIDQsIHtSUkUoMHhiMzYyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx1cmEiLCAgIDQsIHtSUkUoMHhiMjRiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ZHIiLCAgIDQsIHtSUkUoMHhiMzI1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ZXIiLCAgIDQsIHtSUkUoMHhiMzI2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ciIsICAgIDQsIHtSUkUoMHhiMzY1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6ZHIiLCAgIDQsIHtSUkUoMHhiMzc1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6ZXIiLCAgIDQsIHtSUkUoMHhiMzc0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6eHIiLCAgIDQsIHtSUkUoMHhiMzc2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1kYnIiLCAgIDQsIHtSUkUoMHhiMzFjLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1kZWJyIiwgIDQsIHtSUkUoMHhiMzBjLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1lZWJyIiwgIDQsIHtSUkUoMHhiMzE3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1lZXIiLCAgIDQsIHtSUkUoMHhiMzM3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1zciIsICAgIDQsIHtSUkUoMHhiMjUyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElJUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1zdGEiLCAgIDQsIHtSUkUoMHhiMjQ3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjF9IH0sCi17ICJtdnBnIiwgICA0LCB7UlJFKDB4YjI1NCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJtdnN0IiwgICA0LCB7UlJFKDB4YjI1NSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJU1IsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJteGJyIiwgICA0LCB7UlJFKDB4YjM0YywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJteGRiciIsICA0LCB7UlJFKDB4YjMwNywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJwYWxiIiwgICA0LCB7UlJFKDB4YjI0OCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7MH0gfSwKLXsgInByYmUiLCAgIDQsIHtSUkUoMHhiMjJhLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIEkzNzAsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInB0IiwgICAgIDQsIHtSUkUoMHhiMjI4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInJyYmUiLCAgIDQsIHtSUkUoMHhiMjJhLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNhciIsICAgIDQsIHtSUkUoMHhiMjRlLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNkYnIiLCAgIDQsIHtSUkUoMHhiMzFiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNlYnIiLCAgIDQsIHtSUkUoMHhiMzBiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNlcnZjIiwgIDQsIHtSUkUoMHhiMjIwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNmcGMiLCAgIDQsIHtSUkUoMHhiMzg0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZGJyIiwgIDQsIHtSUkUoMHhiMzE1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZHIiLCAgIDQsIHtSUkUoMHhiMjQ0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElRUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZWJyIiwgIDQsIHtSUkUoMHhiMzE0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZXIiLCAgIDQsIHtSUkUoMHhiMjQ1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElRUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxeGJyIiwgIDQsIHtSUkUoMHhiMzE2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxeHIiLCAgIDQsIHtSUkUoMHhiMzM2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNyc3QiLCAgIDQsIHtSUkUoMHhiMjVlLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElTUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNzYXIiLCAgIDQsIHtSUkUoMHhiMjI1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjF9IH0sCi17ICJzc2tlIiwgICA0LCB7UlJFKDB4YjIyYiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJzdHVyYSIsICA0LCB7UlJFKDB4YjI0NiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJzeGJyIiwgICA0LCB7UlJFKDB4YjM0YiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0YXIiLCAgICA0LCB7UlJFKDB4YjI0YywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0YiIsICAgICA0LCB7UlJFKDB4YjIyYywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0aGRyIiwgICA0LCB7UlJFKDB4YjM1OSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRlgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0aGRlciIsICA0LCB7UlJFKDB4YjM1OSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRlgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi0KLS8qIFJSRiBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiY2ZkYnIiLCAgNCwge1JSRigweGIzOTksMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJjZmRyIiwgICA0LCB7UlJGKDB4YjNiOSwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJSFgsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImNmZWJyIiwgIDQsIHtSUkYoMHhiMzk4LDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiY2ZlciIsICAgNCwge1JSRigweGIzYjgsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUhYLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJjZnhiciIsICA0LCB7UlJGKDB4YjM5YSwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImNmeHIiLCAgIDQsIHtSUkYoMHhiM2JhLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElIWCwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiZGlkYnIiLCAgNCwge1JSRigweGIzNWIsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJkaWViciIsICA0LCB7UlJGKDB4YjM1MywwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImZpZGJyIiwgIDQsIHtSUkYoMHhiMzVmLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiZmllYnIiLCAgNCwge1JSRigweGIzNTcsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJmaXhiciIsICA0LCB7UlJGKDB4YjM0NywwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgIm1hZGJyIiwgIDQsIHtSUkYoMHhiMzFlLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAibWFlYnIiLCAgNCwge1JSRigweGIzMGUsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJtc2RiciIsICA0LCB7UlJGKDB4YjMxZiwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgIm1zZWJyIiwgIDQsIHtSUkYoMHhiMzBmLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAidGJkciIsICAgNCwge1JSRigweGIzNTEsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUZYLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJ0YmVkciIsICA0LCB7UlJGKDB4YjM1MCwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJRlgsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLQotLyogUlggZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImEiLCAgICAgIDQsIHtSWCgweDVhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFkIiwgICAgIDQsIHtSWCgweDZhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFlIiwgICAgIDQsIHtSWCgweDdhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFoIiwgICAgIDQsIHtSWCgweDRhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFsIiwgICAgIDQsIHtSWCgweDVlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImF1IiwgICAgIDQsIHtSWCgweDdlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImF3IiwgICAgIDQsIHtSWCgweDZlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJhbCIsICAgIDQsIHtSWCgweDQ1LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJhcyIsICAgIDQsIHtSWCgweDRkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElYQSwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJjIiwgICAgIDQsIHtSWCgweDQ3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJjdCIsICAgIDQsIHtSWCgweDQ2LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImMiLCAgICAgIDQsIHtSWCgweDU5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNkIiwgICAgIDQsIHtSWCgweDY5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNlIiwgICAgIDQsIHtSWCgweDc5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNoIiwgICAgIDQsIHtSWCgweDQ5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNsIiwgICAgIDQsIHtSWCgweDU1LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImN2YiIsICAgIDQsIHtSWCgweDRmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImN2ZCIsICAgIDQsIHtSWCgweDRlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImQiLCAgICAgIDQsIHtSWCgweDVkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImRkIiwgICAgIDQsIHtSWCgweDZkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImRlIiwgICAgIDQsIHtSWCgweDdkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImV4IiwgICAgIDQsIHtSWCgweDQ0LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImljIiwgICAgIDQsIHtSWCgweDQzLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImwiLCAgICAgIDQsIHtSWCgweDU4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxhIiwgICAgIDQsIHtSWCgweDQxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxhZSIsICAgIDQsIHtSWCgweDUxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElFU0EsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxkIiwgICAgIDQsIHtSWCgweDY4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxlIiwgICAgIDQsIHtSWCgweDc4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxoIiwgICAgIDQsIHtSWCgweDQ4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxyYSIsICAgIDQsIHtSWCgweGIxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElYQSwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm0iLCAgICAgIDQsIHtSWCgweDVjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1kIiwgICAgIDQsIHtSWCgweDZjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1lIiwgICAgIDQsIHtSWCgweDdjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1oIiwgICAgIDQsIHtSWCgweDRjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1zIiwgICAgIDQsIHtSWCgweDcxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElJUiwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm14ZCIsICAgIDQsIHtSWCgweDY3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm4iLCAgICAgIDQsIHtSWCgweDU0LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm8iLCAgICAgIDQsIHtSWCgweDU2LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInMiLCAgICAgIDQsIHtSWCgweDViLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNkIiwgICAgIDQsIHtSWCgweDZiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNlIiwgICAgIDQsIHtSWCgweDdiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNoIiwgICAgIDQsIHtSWCgweDRiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNsIiwgICAgIDQsIHtSWCgweDVmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0IiwgICAgIDQsIHtSWCgweDUwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0YyIsICAgIDQsIHtSWCgweDQyLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0ZCIsICAgIDQsIHtSWCgweDYwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0ZSIsICAgIDQsIHtSWCgweDcwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0aCIsICAgIDQsIHtSWCgweDQwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN1IiwgICAgIDQsIHtSWCgweDdmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN3IiwgICAgIDQsIHtSWCgweDZmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIngiLCAgICAgIDQsIHtSWCgweDU3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLQotLyogUlhFIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJhZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJjZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTkpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJjZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDkpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJkZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJkZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJrZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTgpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJrZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDgpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJsZGUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJsZGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGQiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjYpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDYpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWMpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGMpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZWUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZWViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJteGRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWQiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y2RiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y2ViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTApfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y3hiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi0KLS8qIFJYRiBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAibWFkYiIsICAgNiwge1JYRkgoMHhlZCwwLDAsMCwwKSwgUlhGTCgweDFlLDApfSwge1JYRkhfTUFTSywgUlhGTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYRl9SMywgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1hZWIiLCAgIDYsIHtSWEZIKDB4ZWQsMCwwLDAsMCksIFJYRkwoMHgwZSwwKX0sIHtSWEZIX01BU0ssIFJYRkxfTUFTS30sIElCRiwge1JYX1IxLCBSWEZfUjMsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtc2RiIiwgICA2LCB7UlhGSCgweGVkLDAsMCwwLDApLCBSWEZMKDB4MWYsMCl9LCB7UlhGSF9NQVNLLCBSWEZMX01BU0t9LCBJQkYsIHtSWF9SMSwgUlhGX1IzLCBSWF9EMiwgUlhfWDIsIFJYX0IyfSB9LAoteyAibXNlYiIsICAgNiwge1JYRkgoMHhlZCwwLDAsMCwwKSwgUlhGTCgweDBmLDApfSwge1JYRkhfTUFTSywgUlhGTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYRl9SMywgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLQotLyogUlMgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImJ4aCIsICAgIDQsIHtSUygweDg2LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJieGxlIiwgICA0LCB7UlMoMHg4NywwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAiY2RzIiwgICAgNCwge1JTKDB4YmIsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImNsY2xlIiwgIDQsIHtSUygweGE5LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJQ00sICB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJjbG0iLCAgICA0LCB7UlMoMHhiZCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAiY3MiLCAgICAgNCwge1JTKDB4YmEsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImljbSIsICAgIDQsIHtSUygweGJmLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJsYW0iLCAgICA0LCB7UlMoMHg5YSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSUVTQSwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAibGN0bCIsICAgNCwge1JTKDB4YjcsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImxtIiwgICAgIDQsIHtSUygweDk4LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJtdmNsZSIsICA0LCB7UlMoMHhhOCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSUNNLCAge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAic2lncCIsICAgNCwge1JTKDB4YWUsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgInN0YW0iLCAgIDQsIHtSUygweDliLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJRVNBLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJzdGNtIiwgICA0LCB7UlMoMHhiZSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAic3RjdGwiLCAgNCwge1JTKDB4YjYsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgInN0bSIsICAgIDQsIHtSUygweDkwLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJ0cmFjZSIsICA0LCB7UlMoMHg5OSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSVhBLCAge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAotCi0vKiBSUyBmb3JtIGluc3RydWN0aW9ucyB3aXRoIGJsYW5rIFIzIGFuZCBvcHRpb25hbCBCMiAoc2hpZnQgbGVmdC9yaWdodCkgKi8KLXsgInNsYSIsICAgIDQsIHtSUygweDhiLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzbGRhIiwgICA0LCB7UlMoMHg4ZiwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAoteyAic2xkbCIsICAgNCwge1JTKDB4OGQsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfRDIsIFJTX0IyX09QVH0gfSwKLXsgInNsbCIsICAgIDQsIHtSUygweDg5LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzcmEiLCAgICA0LCB7UlMoMHg4YSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAoteyAic3JkYSIsICAgNCwge1JTKDB4OGUsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfRDIsIFJTX0IyX09QVH0gfSwKLXsgInNyZGwiLCAgIDQsIHtSUygweDhjLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzcmwiLCAgICA0LCB7UlMoMHg4OCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAotCi0vKiBSU0kgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImJyeGgiLCAgIDQsIHtSU0koMHg4NCwwLDAsMCksICAwfSwge1JTSV9NQVNLLCAwfSwgSUlSLCAge1JTSV9SMSwgUlNJX1IzLCBSU0lfSTJ9IH0sCi17ICJicnhsZSIsICA0LCB7UlNJKDB4ODUsMCwwLDApLCAgMH0sIHtSU0lfTUFTSywgMH0sIElJUiwgIHtSU0lfUjEsIFJTSV9SMywgUlNJX0kyfSB9LAotCi0vKiBSSSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiYWhpIiwgICAgNCwge1JJKDB4YTdhLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJhcyIsICAgNCwge1JJKDB4YTc1LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJjIiwgICAgNCwge1JJKDB4YTc0LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJjdCIsICAgNCwge1JJKDB4YTc2LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiY2hpIiwgICAgNCwge1JJKDB4YTdlLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAibGhpIiwgICAgNCwge1JJKDB4YTc4LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAibWhpIiwgICAgNCwge1JJKDB4YTdjLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAidG1oIiwgICAgNCwge1JJKDB4YTcwLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAidG1sIiwgICAgNCwge1JJKDB4YTcxLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAotCi0vKiBTSSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiY2xpIiwgICAgNCwge1NJKDB4OTUsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJMzcwLCB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgIm1jIiwgICAgIDQsIHtTSSgweGFmLDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJtdmkiLCAgICA0LCB7U0koMHg5MiwwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIEkzNzAsIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAoteyAibmkiLCAgICAgNCwge1NJKDB4OTQsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJMzcwLCB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgIm9pIiwgICAgIDQsIHtTSSgweDk2LDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJzdG5zbSIsICA0LCB7U0koMHhhYywwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIElYQSwgIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAoteyAic3Rvc20iLCAgNCwge1NJKDB4YWQsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJWEEsICB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgInRtIiwgICAgIDQsIHtTSSgweDkxLDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJ4aSIsICAgICA0LCB7U0koMHg5NywwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIEkzNzAsIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAotCi0vKiBTIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJjZmMiLCAgICA0LCB7UygweGIyMWEsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAiY3NjaCIsICAgNCwge1MoMHhiMjMwLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgImhzY2giLCAgIDQsIHtTKDB4YjIzMSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAgezB9IH0sCi17ICJpcGsiLCAgICA0LCB7UygweGIyMGIsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAibGZwYyIsICAgNCwge1MoMHhiMjlkLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJQkYsICB7U19EMiwgU19CMn0gfSwKLXsgImxwc3ciLCAgIDQsIHtTKDB4ODIwMCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSTM3MCwge1NfRDIsIFNfQjJ9IH0sCi17ICJtc2NoIiwgICA0LCB7UygweGIyMzIsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAicGMiLCAgICAgNCwge1MoMHhiMjE4LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInBjZiIsICAgIDQsIHtTKDB4YjIxOCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVBDLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJwdGxiIiwgICA0LCB7UygweGIyMGQsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAicmNocCIsICAgNCwge1MoMHhiMjNiLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgInJwIiwgICAgIDQsIHtTKDB4YjI3NywwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVJQLCAgezB9IH0sCi17ICJyc2NoIiwgICA0LCB7UygweGIyMzgsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAic2FjIiwgICAgNCwge1MoMHhiMjE5LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInNhY2YiLCAgIDQsIHtTKDB4YjI3OSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVNBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzYWwiLCAgICA0LCB7UygweGIyMzcsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAic2NobSIsICAgNCwge1MoMHhiMjNjLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgInNjayIsICAgIDQsIHtTKDB4YjIwNCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSTM3MCwge1NfRDIsIFNfQjJ9IH0sCi17ICJzY2tjIiwgICA0LCB7UygweGIyMDYsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3BrYSIsICAgNCwge1MoMHhiMjBhLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInNwdCIsICAgIDQsIHtTKDB4YjIwOCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzcHgiLCAgICA0LCB7UygweGIyMTAsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3JubSIsICAgNCwge1MoMHhiMjk5LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJQkYsICB7U19EMiwgU19CMn0gfSwKLXsgInNzY2giLCAgIDQsIHtTKDB4YjIzMywwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzc20iLCAgICA0LCB7UygweDgwMDAsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIEkzNzAsIHtTX0QyLCBTX0IyfSB9LAoteyAic3RhcCIsICAgNCwge1MoMHhiMjEyLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInN0Y2siLCAgIDQsIHtTKDB4YjIwNSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdGNrYyIsICA0LCB7UygweGIyMDcsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIEkzNzAsIHtTX0QyLCBTX0IyfSB9LAoteyAic3RjcHMiLCAgNCwge1MoMHhiMjNhLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInN0Y3J3IiwgIDQsIHtTKDB4YjIzOSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdGZwYyIsICA0LCB7UygweGIyOWMsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElCRiwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3RpZHAiLCAgNCwge1MoMHhiMjAyLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJMzcwLCB7U19EMiwgU19CMn0gfSwKLXsgInN0cHQiLCAgIDQsIHtTKDB4YjIwOSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdHB4IiwgICA0LCB7UygweGIyMTEsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3RzY2giLCAgNCwge1MoMHhiMjM0LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInRwaSIsICAgIDQsIHtTKDB4YjIzNiwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJ0cmFwNCIsICA0LCB7UygweGIyZmYsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElUUiwgIHtTX0QyLCBTX0IyfSB9LAoteyAidHMiLCAgICAgNCwge1MoMHg5MzAwLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJMzcwLCB7U19EMiwgU19CMn0gfSwKLXsgInRzY2giLCAgIDQsIHtTKDB4YjIzNSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi0KLS8qIFNTIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhcCIsICAgICA2LCB7U1NIKDB4ZmEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAiY2xjIiwgICAgNiwge1NTSCgweGQ1LDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgImNwIiwgICAgIDYsIHtTU0goMHhmOSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJkcCIsICAgICA2LCB7U1NIKDB4ZmQsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAiZWQiLCAgICAgNiwge1NTSCgweGRlLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgImVkbWsiLCAgIDYsIHtTU0goMHhkZiwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdmMiLCAgICA2LCB7U1NIKDB4ZDIsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZjaW4iLCAgNiwge1NTSCgweGU4LDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJTUksICB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm12Y2siLCAgIDYsIHtTU0goMHhkOSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSVhBLCAge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdmNwIiwgICA2LCB7U1NIKDB4ZGEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIElYQSwgIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZjcyIsICAgNiwge1NTSCgweGRiLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJWEEsICB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm12biIsICAgIDYsIHtTU0goMHhkMSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdm8iLCAgICA2LCB7U1NIKDB4ZjEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZ6IiwgICAgNiwge1NTSCgweGQzLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm5jIiwgICAgIDYsIHtTU0goMHhkNCwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJvYyIsICAgICA2LCB7U1NIKDB4ZDYsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAicGFjayIsICAgNiwge1NTSCgweGYyLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInBsbyIsICAgIDYsIHtTU0goMHhlZSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSVBMLCAge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJzcCIsICAgICA2LCB7U1NIKDB4ZmIsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAic3JwIiwgICAgNiwge1NTSCgweGYwLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInRyIiwgICAgIDYsIHtTU0goMHhkYywwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJ0cnQiLCAgICA2LCB7U1NIKDB4ZGQsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAidW5wayIsICAgNiwge1NTSCgweGYzLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInhjIiwgICAgIDYsIHtTU0goMHhkNywwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJ6YXAiLCAgICA2LCB7U1NIKDB4ZjgsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAotCi0vKiBTU0UgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImxhc3AiLCAgIDYsIHtTU0VIKDB4ZTUwMCwwLDApLCAwfSwge1NTRV9NQVNLLCAwfSwgSVhBLCAge1NTX0QxLCBTU19CMSwgU1NfRDIsIFNTX0IyfSB9LAoteyAibXZjZGsiLCAgNiwge1NTRUgoMHhlNTBmLDAsMCksIDB9LCB7U1NFX01BU0ssIDB9LCBJRVNBLCB7U1NfRDEsIFNTX0IxLCBTU19EMiwgU1NfQjJ9IH0sCi17ICJtdmNzayIsICA2LCB7U1NFSCgweGU1MGUsMCwwKSwgMH0sIHtTU0VfTUFTSywgMH0sIElFU0EsIHtTU19EMSwgU1NfQjEsIFNTX0QyLCBTU19CMn0gfSwKLXsgInRwcm90IiwgIDYsIHtTU0VIKDB4ZTUwMSwwLDApLCAwfSwge1NTRV9NQVNLLCAwfSwgSVhBLCAge1NTX0QxLCBTU19CMSwgU1NfRDIsIFNTX0IyfSB9LAotCi0vKiAqLwotfTsKLQotY29uc3QgaW50IGkzNzBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKGkzNzBfb3Bjb2RlcykgLyBzaXplb2YgKGkzNzBfb3Bjb2Rlc1swXSk7Ci0MCi0vKiBUaGUgbWFjcm8gdGFibGUuICBUaGlzIGlzIG9ubHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gaTM3MF9tYWNyb3NbXSA9IHsKLXsgImIiLCAgICAgMSwgICBJMzcwLAkiYmMgIDE1LCUwIiB9LAoteyAiYnIiLCAgICAxLCAgIEkzNzAsCSJiY3IgMTUsJTAiIH0sCi0KLXsgIm5vcCIsICAgMSwgICBJMzcwLAkiYmMgIDAsJTAiIH0sCi17ICJub3ByIiwgIDEsICAgSTM3MCwJImJjciAwLCUwIiB9LAotCi17ICJiaCIsICAgIDEsICAgSTM3MCwJImJjICAyLCUwIiB9LAoteyAiYmhyIiwgICAxLCAgIEkzNzAsCSJiY3IgMiwlMCIgfSwKLXsgImJsIiwgICAgMSwgICBJMzcwLAkiYmMgIDQsJTAiIH0sCi17ICJibHIiLCAgIDEsICAgSTM3MCwJImJjciA0LCUwIiB9LAoteyAiYmUiLCAgICAxLCAgIEkzNzAsCSJiYyAgOCwlMCIgfSwKLXsgImJlciIsICAgMSwgICBJMzcwLAkiYmNyIDgsJTAiIH0sCi0KLXsgImJuaCIsICAgIDEsICAgSTM3MCwJImJjICAxMywlMCIgfSwKLXsgImJuaHIiLCAgIDEsICAgSTM3MCwJImJjciAxMywlMCIgfSwKLXsgImJubCIsICAgIDEsICAgSTM3MCwJImJjICAxMSwlMCIgfSwKLXsgImJubHIiLCAgIDEsICAgSTM3MCwJImJjciAxMSwlMCIgfSwKLXsgImJuZSIsICAgIDEsICAgSTM3MCwJImJjICA3LCUwIiB9LAoteyAiYm5lciIsICAgMSwgICBJMzcwLAkiYmNyIDcsJTAiIH0sCi0KLXsgImJwIiwgICAgMSwgICBJMzcwLAkiYmMgIDIsJTAiIH0sCi17ICJicHIiLCAgIDEsICAgSTM3MCwJImJjciAyLCUwIiB9LAoteyAiYm0iLCAgICAxLCAgIEkzNzAsCSJiYyAgNCwlMCIgfSwKLXsgImJtciIsICAgMSwgICBJMzcwLAkiYmNyIDQsJTAiIH0sCi17ICJieiIsICAgIDEsICAgSTM3MCwJImJjICA4LCUwIiB9LAoteyAiYnpyIiwgICAxLCAgIEkzNzAsCSJiY3IgOCwlMCIgfSwKLXsgImJvIiwgICAgMSwgICBJMzcwLAkiYmMgIDEsJTAiIH0sCi17ICJib3IiLCAgIDEsICAgSTM3MCwJImJjciAxLCUwIiB9LAotCi17ICJibnAiLCAgICAxLCAgIEkzNzAsCSJiYyAgMTMsJTAiIH0sCi17ICJibnByIiwgICAxLCAgIEkzNzAsCSJiY3IgMTMsJTAiIH0sCi17ICJibm0iLCAgICAxLCAgIEkzNzAsCSJiYyAgMTEsJTAiIH0sCi17ICJibm1yIiwgICAxLCAgIEkzNzAsCSJiY3IgMTEsJTAiIH0sCi17ICJibnoiLCAgICAxLCAgIEkzNzAsCSJiYyAgNywlMCIgfSwKLXsgImJuenIiLCAgIDEsICAgSTM3MCwJImJjciA3LCUwIiB9LAoteyAiYm5vIiwgICAgMSwgICBJMzcwLAkiYmMgIDE0LCUwIiB9LAoteyAiYm5vciIsICAgMSwgICBJMzcwLAkiYmNyIDE0LCUwIiB9LAotCi17ICJzeW5jIiwgICAwLCAgIEkzNzAsCSJiY3IgMTUsMCIgfSwKLQotfTsKLQotY29uc3QgaW50IGkzNzBfbnVtX21hY3JvcyA9Ci0gIHNpemVvZiAoaTM3MF9tYWNyb3MpIC8gc2l6ZW9mIChpMzcwX21hY3Jvc1swXSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzODYtZGlzLmMgYi9vcGNvZGVzL2kzODYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWQ2ZTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pMzg2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1OSArMCwwIEBACi0vKiBQcmludCBpMzg2IGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCA4OSwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiA4MDM4NiBpbnN0cnVjdGlvbiBwcmludGVyIGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSkKLSAqIEp1bHkgMTk4OAotICogIG1vZGlmaWVkIGJ5IEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkKLSAqLwotCi0vKgotICogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKLSAqIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2Ci0gKiBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAotICogYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAotICogYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvCi0gKiB0aGUgSW50ZWwgbWFudWFsIGZvciBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgTUFYTEVOIDIwCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKLS8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgotICAgbm9uLWJyb2tlbiBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi1zdGF0aWMgaW50IGZldGNoX2RhdGEgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX2J5dGUgKikpOwotCi1zdHJ1Y3QgZGlzX3ByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBUaGUgb3Bjb2RlIGZvciB0aGUgZndhaXQgaW5zdHJ1Y3Rpb24sIHdoaWNoIHdlIHRyZWF0IGFzIGEgcHJlZml4Ci0gICB3aGVuIHdlIGNhbi4gICovCi0jZGVmaW5lIEZXQUlUX09QQ09ERSAoMHg5YikKLQotLyogRmxhZ3MgZm9yIHRoZSBwcmVmaXhlcyBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBTZWUgYmVsb3cuICAqLwotc3RhdGljIGludCBwcmVmaXhlczsKLQotLyogRmxhZ3MgZm9yIHByZWZpeGVzIHdoaWNoIHdlIHNvbWVob3cgaGFuZGxlZCB3aGVuIHByaW50aW5nIHRoZQotICAgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgaW50IHVzZWRfcHJlZml4ZXM7Ci0KLS8qIEZsYWdzIHN0b3JlZCBpbiBQUkVGSVhFUy4gICovCi0jZGVmaW5lIFBSRUZJWF9SRVBaIDEKLSNkZWZpbmUgUFJFRklYX1JFUE5aIDIKLSNkZWZpbmUgUFJFRklYX0xPQ0sgNAotI2RlZmluZSBQUkVGSVhfQ1MgOAotI2RlZmluZSBQUkVGSVhfU1MgMHgxMAotI2RlZmluZSBQUkVGSVhfRFMgMHgyMAotI2RlZmluZSBQUkVGSVhfRVMgMHg0MAotI2RlZmluZSBQUkVGSVhfRlMgMHg4MAotI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKLSNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKLSNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKLSNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBkaXNfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZGlzX3ByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgZGlkIG1hbmFnZSB0byByZWFkIGF0IGxlYXN0IG9uZSBieXRlLCB0aGVuCi0gICAgICAgICBwcmludF9pbnNuX2kzODYgd2lsbCBkbyBzb21ldGhpbmcgc2Vuc2libGUuICBPdGhlcndpc2UsIHByaW50Ci0gICAgICAgICBhbiBlcnJvci4gIFdlIGRvIHRoYXQgaGVyZSBiZWNhdXNlIHRoaXMgaXMgd2hlcmUgd2Uga25vdwotICAgICAgICAgU1RBVFVTLiAgKi8KLSAgICAgIGlmIChwcml2LT5tYXhfZmV0Y2hlZCA9PSBwcml2LT50aGVfYnVmZmVyKQotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgWFggTlVMTCwgMAotCi0jZGVmaW5lIEViIE9QX0UsIGJfbW9kZQotI2RlZmluZSBpbmRpckViIE9QX2luZGlyRSwgYl9tb2RlCi0jZGVmaW5lIEdiIE9QX0csIGJfbW9kZQotI2RlZmluZSBFdiBPUF9FLCB2X21vZGUKLSNkZWZpbmUgRWQgT1BfRSwgZF9tb2RlCi0jZGVmaW5lIGluZGlyRXYgT1BfaW5kaXJFLCB2X21vZGUKLSNkZWZpbmUgRXcgT1BfRSwgd19tb2RlCi0jZGVmaW5lIE1hIE9QX0UsIHZfbW9kZQotI2RlZmluZSBNIE9QX0UsIDAJCS8qIGxlYSAqLwotI2RlZmluZSBNcCBPUF9FLCAwCQkvKiAzMiBvciA0OCBiaXQgbWVtb3J5IG9wZXJhbmQgZm9yIExEUywgTEVTIGV0YyAqLwotI2RlZmluZSBHdiBPUF9HLCB2X21vZGUKLSNkZWZpbmUgR3cgT1BfRywgd19tb2RlCi0jZGVmaW5lIFJkIE9QX1JkLCBkX21vZGUKLSNkZWZpbmUgSWIgT1BfSSwgYl9tb2RlCi0jZGVmaW5lIHNJYiBPUF9zSSwgYl9tb2RlCS8qIHNpZ24gZXh0ZW5lZCBieXRlICovCi0jZGVmaW5lIEl2IE9QX0ksIHZfbW9kZQotI2RlZmluZSBJdyBPUF9JLCB3X21vZGUKLSNkZWZpbmUgSmIgT1BfSiwgYl9tb2RlCi0jZGVmaW5lIEp2IE9QX0osIHZfbW9kZQotI2RlZmluZSBDZCBPUF9DLCBkX21vZGUKLSNkZWZpbmUgRGQgT1BfRCwgZF9tb2RlCi0jZGVmaW5lIFRkIE9QX1QsIGRfbW9kZQotCi0jZGVmaW5lIGVBWCBPUF9SRUcsIGVBWF9yZWcKLSNkZWZpbmUgZUJYIE9QX1JFRywgZUJYX3JlZwotI2RlZmluZSBlQ1ggT1BfUkVHLCBlQ1hfcmVnCi0jZGVmaW5lIGVEWCBPUF9SRUcsIGVEWF9yZWcKLSNkZWZpbmUgZVNQIE9QX1JFRywgZVNQX3JlZwotI2RlZmluZSBlQlAgT1BfUkVHLCBlQlBfcmVnCi0jZGVmaW5lIGVTSSBPUF9SRUcsIGVTSV9yZWcKLSNkZWZpbmUgZURJIE9QX1JFRywgZURJX3JlZwotI2RlZmluZSBBTCBPUF9SRUcsIGFsX3JlZwotI2RlZmluZSBDTCBPUF9SRUcsIGNsX3JlZwotI2RlZmluZSBETCBPUF9SRUcsIGRsX3JlZwotI2RlZmluZSBCTCBPUF9SRUcsIGJsX3JlZwotI2RlZmluZSBBSCBPUF9SRUcsIGFoX3JlZwotI2RlZmluZSBDSCBPUF9SRUcsIGNoX3JlZwotI2RlZmluZSBESCBPUF9SRUcsIGRoX3JlZwotI2RlZmluZSBCSCBPUF9SRUcsIGJoX3JlZwotI2RlZmluZSBBWCBPUF9SRUcsIGF4X3JlZwotI2RlZmluZSBEWCBPUF9SRUcsIGR4X3JlZwotI2RlZmluZSBpbmRpckRYIE9QX1JFRywgaW5kaXJfZHhfcmVnCi0KLSNkZWZpbmUgU3cgT1BfU0VHLCB3X21vZGUKLSNkZWZpbmUgQXAgT1BfRElSLCAwCi0jZGVmaW5lIE9iIE9QX09GRiwgYl9tb2RlCi0jZGVmaW5lIE92IE9QX09GRiwgdl9tb2RlCi0jZGVmaW5lIFhiIE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFh2IE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFliIE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIFl2IE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIERTQlggT1BfRFNyZWcsIGVCWF9yZWcKLQotI2RlZmluZSBlcyBPUF9SRUcsIGVzX3JlZwotI2RlZmluZSBzcyBPUF9SRUcsIHNzX3JlZwotI2RlZmluZSBjcyBPUF9SRUcsIGNzX3JlZwotI2RlZmluZSBkcyBPUF9SRUcsIGRzX3JlZwotI2RlZmluZSBmcyBPUF9SRUcsIGZzX3JlZwotI2RlZmluZSBncyBPUF9SRUcsIGdzX3JlZwotCi0jZGVmaW5lIE1YIE9QX01NWCwgMAotI2RlZmluZSBYTSBPUF9YTU0sIDAKLSNkZWZpbmUgRU0gT1BfRU0sIHZfbW9kZQotI2RlZmluZSBFWCBPUF9FWCwgdl9tb2RlCi0jZGVmaW5lIE1TIE9QX01TLCB2X21vZGUKLSNkZWZpbmUgTm9uZSBPUF9FLCAwCi0jZGVmaW5lIE9QU1VGIE9QXzNETm93U3VmZml4LCAwCi0jZGVmaW5lIE9QU0lNRCBPUF9TSU1EX1N1ZmZpeCwgMAotCi0vKiBiaXRzIGluIHNpemVmbGFnICovCi0jaWYgMCAvKiBsZWF2ZSB1bmRlZmluZWQgdW50aWwgc29tZW9uZSBhZGRzIHRoZSBleHRyYSBmbGFnIHRvIG9iamR1bXAgKi8KLSNkZWZpbmUgU1VGRklYX0FMV0FZUyA0Ci0jZW5kaWYKLSNkZWZpbmUgQUZMQUcgMgotI2RlZmluZSBERkxBRyAxCi0KLXR5cGVkZWYgdm9pZCAoKm9wX3J0bikgUEFSQU1TICgoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpKTsKLQotc3RhdGljIHZvaWQgT1BfRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfaW5kaXJFIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9zSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfUkVHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9KIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9ESVIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX09GRiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVNyZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0RTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TRUcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0MgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JkIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TVCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1RpICBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTU1YIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9YTU0gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VNIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTVMgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QXzNETm93U3VmZml4IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TSU1EX1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgU0lNRF9GaXh1cCBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZCBhcHBlbmRfc2VnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNldF9vcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgb3ApKTsKLXN0YXRpYyB2b2lkIHB1dG9wIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBpbnQgc2l6ZWZsYWcpKTsKLXN0YXRpYyB2b2lkIGRvZmxvYXQgUEFSQU1TICgoaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgaW50IGdldDE2IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0MzIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2twcmVmaXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeF9uYW1lIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwdHJfcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBCYWRPcCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgYl9tb2RlIDEKLSNkZWZpbmUgdl9tb2RlIDIKLSNkZWZpbmUgd19tb2RlIDMKLSNkZWZpbmUgZF9tb2RlIDQKLSNkZWZpbmUgeF9tb2RlIDUKLQotI2RlZmluZSBlc19yZWcgMTAwCi0jZGVmaW5lIGNzX3JlZyAxMDEKLSNkZWZpbmUgc3NfcmVnIDEwMgotI2RlZmluZSBkc19yZWcgMTAzCi0jZGVmaW5lIGZzX3JlZyAxMDQKLSNkZWZpbmUgZ3NfcmVnIDEwNQotCi0jZGVmaW5lIGVBWF9yZWcgMTA4Ci0jZGVmaW5lIGVDWF9yZWcgMTA5Ci0jZGVmaW5lIGVEWF9yZWcgMTEwCi0jZGVmaW5lIGVCWF9yZWcgMTExCi0jZGVmaW5lIGVTUF9yZWcgMTEyCi0jZGVmaW5lIGVCUF9yZWcgMTEzCi0jZGVmaW5lIGVTSV9yZWcgMTE0Ci0jZGVmaW5lIGVESV9yZWcgMTE1Ci0KLSNkZWZpbmUgYWxfcmVnIDExNgotI2RlZmluZSBjbF9yZWcgMTE3Ci0jZGVmaW5lIGRsX3JlZyAxMTgKLSNkZWZpbmUgYmxfcmVnIDExOQotI2RlZmluZSBhaF9yZWcgMTIwCi0jZGVmaW5lIGNoX3JlZyAxMjEKLSNkZWZpbmUgZGhfcmVnIDEyMgotI2RlZmluZSBiaF9yZWcgMTIzCi0KLSNkZWZpbmUgYXhfcmVnIDEyNAotI2RlZmluZSBjeF9yZWcgMTI1Ci0jZGVmaW5lIGR4X3JlZyAxMjYKLSNkZWZpbmUgYnhfcmVnIDEyNwotI2RlZmluZSBzcF9yZWcgMTI4Ci0jZGVmaW5lIGJwX3JlZyAxMjkKLSNkZWZpbmUgc2lfcmVnIDEzMAotI2RlZmluZSBkaV9yZWcgMTMxCi0KLSNkZWZpbmUgaW5kaXJfZHhfcmVnIDE1MAotCi0jZGVmaW5lIFVTRV9HUk9VUFMgMQotI2RlZmluZSBVU0VfUFJFRklYX1VTRVJfVEFCTEUgMgotCi0jZGVmaW5lIEdSUDFiIE5VTEwsIE5VTEwsIDAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMVMgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAxU3MgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyYiBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJTIE5VTEwsIE5VTEwsIDQsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfb25lIE5VTEwsIE5VTEwsIDUsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMlNfb25lIE5VTEwsIE5VTEwsIDYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfY2wgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyU19jbCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDNiIE5VTEwsIE5VTEwsIDksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQM1MgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNCAgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNSAgTlVMTCwgTlVMTCwgMTIsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNiAgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNyBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlA4IE5VTEwsIE5VTEwsIDE1LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDkgTlVMTCwgTlVMTCwgMTYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTAgTlVMTCwgTlVMTCwgMTcsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTEgTlVMTCwgTlVMTCwgMTgsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTIgTlVMTCwgTlVMTCwgMTksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTMgTlVMTCwgTlVMTCwgMjAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTQgTlVMTCwgTlVMTCwgMjEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQQU1EIE5VTEwsIE5VTEwsIDIyLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0KLSNkZWZpbmUgUFJFR1JQMCBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMSBOVUxMLCBOVUxMLCAxLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMiBOVUxMLCBOVUxMLCAyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMyBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNCBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNiBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNyBOVUxMLCBOVUxMLCA3LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOSBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTAgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxMSBOVUxMLCBOVUxMLCAxMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEyIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTMgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxNCBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0KLSNkZWZpbmUgRkxPQVRDT0RFIDUwCi0jZGVmaW5lIEZMT0FUIE5VTEwsIE5VTEwsIEZMT0FUQ09ERSwgTlVMTCwgMCwgTlVMTCwgMAotCi1zdHJ1Y3QgZGlzMzg2IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgb3BfcnRuIG9wMTsKLSAgaW50IGJ5dGVtb2RlMTsKLSAgb3BfcnRuIG9wMjsKLSAgaW50IGJ5dGVtb2RlMjsKLSAgb3BfcnRuIG9wMzsKLSAgaW50IGJ5dGVtb2RlMzsKLX07Ci0KLS8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgotICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnRScgPT4gcHJpbnQgJ2UnIGlmIDMyLWJpdCBmb3JtIG9mIGpjeHoKLSAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCi0gICAnUCcgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1EnID0+IHByaW50ICd3JyBvciAnbCcgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnUicgPT4gcHJpbnQgJ3cnIG9yICdsJyAoIndkIiBvciAiZHEiIGluIGludGVsIG1vZGUpCi0gICAnUycgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdXJyA9PiBwcmludCAnYicgb3IgJ3cnICgidyIgb3IgImRlIiBpbiBpbnRlbCBtb2RlKQotKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2F0dFtdID0gewotICAvKiAwMCAqLwotICB7ICJhZGRCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGRTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGRCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGRTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGRCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGRTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAllcywgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yQiIsCUViLCBHYiwgWFggfSwKLSAgeyAib3JTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgIm9yUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAib3JCIiwJQUwsIEliLCBYWCB9LAotICB7ICJvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWNzLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLwotICAvKiAxMCAqLwotICB7ICJhZGNCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGNTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGNCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGNTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGNCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGNTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAlzcywgWFgsIFhYIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYkIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInNiYlMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYkIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInNiYlMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInNiYkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWRzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiYW5kUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiYW5kQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYW5kQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiYW5kUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWJCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzdWJTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJzdWJCIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWJTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzdWJCIiwJQUwsIEliLCBYWCB9LAotICB7ICJzdWJTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvckIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhvclMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInhvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvclMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInhvckIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInhvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiY21wUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiY21wQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiY21wQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiY21wUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmNTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImRlY1MiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZURYLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNjAgKi8KLSAgeyAicHVzaGFQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiYm91bmRTIiwJR3YsIE1hLCBYWCB9LAotICB7ICJhcnBsIiwJRXcsIEd3LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBzZWcgZnMgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGdzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLwotICAvKiA2OCAqLwotICB7ICJwdXNoUCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWxTIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoUCIsCXNJYiwgWFgsIFhYIH0sCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDIgb3IgNCBieXRlcyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImluc2IiLAlZYiwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW5zUiIsCVl2LCBpbmRpckRYLCBYWCB9LAotICB7ICJvdXRzYiIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzUiIsCWluZGlyRFgsIFh2LCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5vIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamFlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImphIiwJSmIsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5zIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamdlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbGUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpnIiwJSmIsIFhYLCBYWCB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3RCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJ0ZXN0UyIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZ0IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhjaGdTIiwJRXYsIEd2LCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJtb3ZCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3ZTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJtb3ZCIiwJR2IsIEViLCBYWCB9LAotICB7ICJtb3ZTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3ZRIiwJRXYsIFN3LCBYWCB9LAotICB7ICJsZWFTIiwJR3YsIE0sIFhYIH0sCi0gIHsgIm1vdlEiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcFEiLAlFdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQ1gsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU1AsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU0ksIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllREksIGVBWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAiY1d0UiIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY1J0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGNhbGxQIiwJQXAsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAicG9wZlAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdkIiLAlBTCwgT2IsIFhYIH0sCi0gIHsgIm1vdlMiLAllQVgsIE92LCBYWCB9LAotICB7ICJtb3ZCIiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3ZTIiwJT3YsIGVBWCwgWFggfSwKLSAgeyAibW92c2IiLAlZYiwgWGIsIFhYIH0sCi0gIHsgIm1vdnNSIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzYiIsCVhiLCBZYiwgWFggfSwKLSAgeyAiY21wc1IiLAlYdiwgWXYsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInRlc3RCIiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0UyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInN0b3NCIiwJWWIsIEFMLCBYWCB9LAotICB7ICJzdG9zUyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHNCIiwJQUwsIFhiLCBYWCB9LAotICB7ICJsb2RzUyIsCWVBWCwgWHYsIFhYIH0sCi0gIHsgInNjYXNCIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzUyIsCWVBWCwgWXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlETCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlESCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZUNYLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllQlgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZVNQLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllU0ksIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZURJLCBJdiwgWFggfSwKLSAgLyogYzAgKi8KLSAgeyBHUlAyYiB9LAotICB7IEdSUDJTIH0sCi0gIHsgInJldFAiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxlc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgImxkc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdkEiLAlFYiwgSWIsIFhYIH0sCi0gIHsgIm1vdlEiLAlFdiwgSXYsIFhYIH0sCi0gIC8qIGM4ICovCi0gIHsgImVudGVyUCIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmVQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJscmV0UCIsCUl3LCBYWCwgWFggfSwKLSAgeyAibHJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFh9LAotICB7ICJpcmV0UCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW5CIiwJQUwsIEliLCBYWCB9LAotICB7ICJpblMiLAllQVgsIEliLCBYWCB9LAotICB7ICJvdXRCIiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXRTIiwJSWIsIGVBWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImptcFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXBQIiwJQXAsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluQiIsCUFMLCBpbmRpckRYLCBYWCB9LAotICB7ICJpblMiLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dEIiLAlpbmRpckRYLCBBTCwgWFggfSwKLSAgeyAib3V0UyIsCWluZGlyRFgsIGVBWCwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogbG9jayBwcmVmaXggKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcG5lICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcHogKi8KLSAgeyAiaGx0IiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbWMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQM2IgfSwKLSAgeyBHUlAzUyB9LAotICAvKiBmOCAqLwotICB7ICJjbGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0YyIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY2xpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RkIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDQgfSwKLSAgeyBHUlA1IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfaW50ZWxbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRkIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVzLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAib3IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgIm9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvciIsCUdiLCBFYiwgWFggfSwKLSAgeyAib3IiLAlHdiwgRXYsIFhYIH0sCi0gIHsgIm9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJvciIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAljcywgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkYyIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRjIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGMiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkYyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCXNzLCBYWCwgWFggfSwKLSAgLyogMTggKi8KLSAgeyAic2JiIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzYmIiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYiIsCUdiLCBFYiwgWFggfSwKLSAgeyAic2JiIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzYmIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlkcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhbmQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFuZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhbmQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFuZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInN1YiIsCUV2LCBHdiwgWFggfSwKLSAgeyAic3ViIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWIiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInN1YiIsCUFMLCBJYiwgWFggfSwKLSAgeyAic3ViIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvciIsCUViLCBHYiwgWFggfSwKLSAgeyAieG9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJ4b3IiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvciIsCUd2LCBFdiwgWFggfSwKLSAgeyAieG9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJ4b3IiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wIiwJRWIsIEdiLCBYWCB9LAotICB7ICJjbXAiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImNtcCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wIiwJR3YsIEV2LCBYWCB9LAotICB7ICJjbXAiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImNtcCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJpbmMiLAllREksIFhYLCBYWCB9LAotICAvKiA0OCAqLwotICB7ICJkZWMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWMiLAllREksIFhYLCBYWCB9LAotICAvKiA1MCAqLwotICB7ICJwdXNoIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllRFgsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllQlAsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcCIsCWVBWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTSSwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJib3VuZCIsCUd2LCBNYSwgWFggfSwKLSAgeyAiYXJwbCIsCUV3LCBHdywgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWwiLAlHdiwgRXYsIEl2IH0sCi0gIHsgInB1c2giLAlzSWIsIFhYLCBYWCB9LAkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bCIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImlucyIsCVliLCBpbmRpckRYLCBYWCB9LAotICB7ICJpbnMiLAlZdiwgaW5kaXJEWCwgWFggfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzIiwJaW5kaXJEWCwgWHYsIFhYIH0sCi0gIC8qIDcwICovCi0gIHsgImpvIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbm8iLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYWUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImplIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamEiLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgImpzIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnMiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpwIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZ2UiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamciLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgR1JQMWIgfSwKLSAgeyBHUlAxUyB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlAxU3MgfSwKLSAgeyAidGVzdCIsCUViLCBHYiwgWFggfSwKLSAgeyAidGVzdCIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZyIsCUViLCBHYiwgWFggfSwKLSAgeyAieGNoZyIsCUV2LCBHdiwgWFggfSwKLSAgLyogODggKi8KLSAgeyAibW92IiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3YiLAlFdiwgR3YsIFhYIH0sCi0gIHsgIm1vdiIsCUdiLCBFYiwgWFggfSwKLSAgeyAibW92IiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3YiLAlFdiwgU3csIFhYIH0sCi0gIHsgImxlYSIsCUd2LCBNLCBYWCB9LAotICB7ICJtb3YiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcCIsCUV2LCBYWCwgWFggfSwKLSAgLyogOTAgKi8KLSAgeyAibm9wIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZUNYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVCWCwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZVNQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVTSSwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZURJLCBlQVgsIFhYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXIiwJWFgsIFhYLCBYWCB9LAkJLyogY3dkZSBhbmQgY2J3ICovCi0gIHsgImNSIiwJWFgsIFhYLCBYWCB9LAkJLyogY2RxIGFuZCBjd2QgKi8KLSAgeyAibGNhbGwiLAlBcCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJLyogZndhaXQgKi8KLSAgeyAicHVzaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInBvcGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdiIsCUFMLCBPYiwgWFggfSwKLSAgeyAibW92IiwJZUFYLCBPdiwgWFggfSwKLSAgeyAibW92IiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3YiLAlPdiwgZUFYLCBYWCB9LAotICB7ICJtb3ZzIiwJWWIsIFhiLCBYWCB9LAotICB7ICJtb3ZzIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzIiwJWGIsIFliLCBYWCB9LAotICB7ICJjbXBzIiwJWHYsIFl2LCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0IiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0IiwJZUFYLCBJdiwgWFggfSwKLSAgeyAic3RvcyIsCVliLCBBTCwgWFggfSwKLSAgeyAic3RvcyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHMiLAlBTCwgWGIsIFhYIH0sCi0gIHsgImxvZHMiLAllQVgsIFh2LCBYWCB9LAotICB7ICJzY2FzIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzIiwJZUFYLCBZdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAibW92IiwJQUwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCURMLCBJYiwgWFggfSwKLSAgeyAibW92IiwJQkwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCUNILCBJYiwgWFggfSwKLSAgeyAibW92IiwJREgsIEliLCBYWCB9LAotICB7ICJtb3YiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVDWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTSSwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVESSwgSXYsIFhYIH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGVzIiwJR3YsIE1wLCBYWCB9LAotICB7ICJsZHMiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdiIsCUViLCBJYiwgWFggfSwKLSAgeyAibW92IiwJRXYsIEl2LCBYWCB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlciIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmUiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFggfSwKLSAgeyAiaXJldCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgSWIsIFhYIH0sCi0gIHsgImluIiwJZUFYLCBJYiwgWFggfSwKLSAgeyAib3V0IiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlJYiwgZUFYLCBYWCB9LAotICAvKiBlOCAqLwotICB7ICJjYWxsIiwJSnYsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXAiLAlBcCwgWFgsIFhYIH0sCi0gIHsgImptcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW4iLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dCIsCWluZGlyRFgsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBlQVgsIFhYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY21jIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsaSIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfYXR0W10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyUyIsIEd2LCBFdywgWFggfSwKLSAgeyAibHNsUyIsIEd2LCBFdywgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJjbHRzIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAid2JpbnZkIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAidWQyYSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgR1JQQU1EIH0sCi0gIHsgImZlbW1zIiwgWFgsIFhYLCBYWCB9LAotICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLwotICAvKiAxMCAqLwotICB7IFBSRUdSUDggfSwKLSAgeyBQUkVHUlA5IH0sCi0gIHsgIm1vdmxwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2gnIH0sICAvKiByZWFsbHkgb25seSAyIG9wZXJhbmRzICovCi0gIHsgIm1vdmxwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2gnIH0sCi0gIHsgInVucGNrbHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ1bnBja2hwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92aHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgeyAibW92aHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgLyogMTggKi8KLSAgeyBHUlAxNCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCi0gIHsgIm1vdkwiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgRGQsIFhYIH0sCi0gIHsgIm1vdkwiLCBDZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgVGQsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZMIiwgVGQsIFJkLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjggKi8KLSAgeyAibW92YXBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJtb3ZhcHMiLCBFWCwgWE0sIFhYIH0sCi0gIHsgUFJFR1JQMiB9LAotICB7ICJtb3ZudHBzIiwgRXYsIFhNLCBYWCB9LAotICB7IFBSRUdSUDQgfSwKLSAgeyBQUkVHUlAzIH0sCi0gIHsgInVjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIHsgImNvbWlzcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogMzAgKi8KLSAgeyAid3Jtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkdHNjIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZG1zciIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRwbWMiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInN5c2VudGVyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNleGl0IiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDM4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogNDAgKi8KLSAgeyAiY21vdm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZubyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmIiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZhZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZuZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmJlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YSIsIEd2LCBFdiwgWFggfSwKLSAgLyogNDggKi8KLSAgeyAiY21vdnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucCIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmwiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZnZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmxlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92ZyIsIEd2LCBFdiwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAibW92bXNrcHMiLCBHdiwgRVgsIFhYIH0sCi0gIHsgUFJFR1JQMTMgfSwKLSAgeyBQUkVHUlAxMiB9LAotICB7IFBSRUdSUDExIH0sCi0gIHsgImFuZHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJhbmRucHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm9ycHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgInhvcnBzIiwgWE0sIEVYLCBYWCB9LAotICAvKiA1OCAqLwotICB7IFBSRUdSUDAgfSwKLSAgeyBQUkVHUlAxMCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgUFJFR1JQMTQgfSwKLSAgeyBQUkVHUlA3IH0sCi0gIHsgUFJFR1JQNSB9LAotICB7IFBSRUdSUDYgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVucGNrbGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2xkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3Nzd2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2t1c3diIiwgTVgsIEVNLCBYWCB9LAotICAvKiA2OCAqLwotICB7ICJwdW5wY2toYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2h3ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNraGRxIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrc3NkdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgTVgsIEVkLCBYWCB9LAotICB7ICJtb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJwc2h1ZnciLCBNWCwgRU0sIEliIH0sCi0gIHsgR1JQMTAgfSwKLSAgeyBHUlAxMSB9LAotICB7IEdSUDEyIH0sCi0gIHsgInBjbXBlcWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgImVtbXMiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdmQiLCBFZCwgTVgsIFhYIH0sCi0gIHsgIm1vdnEiLCBFTSwgTVgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgImpvIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbm8iLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYWUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImplIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamEiLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDg4ICovCi0gIHsgImpzIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnMiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpwIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnAiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZ2UiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamciLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgInNldG8iLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5vIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bmUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGJlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhIiwgRWIsIFhYLCBYWCB9LAotICAvKiA5OCAqLwotICB7ICJzZXRzIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRucyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0cCIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGwiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGdlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZyIsIEViLCBYWCwgWFggfSwKLSAgLyogYTAgKi8KLSAgeyAicHVzaFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgImNwdWlkIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidFMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidHNTIiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaHJkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bFMiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGdCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJjbXB4Y2hnUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAiYnRyUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibGZzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibW92emJSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Z6d1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnp3dyAhICovCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAiYnNmUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiYnNyUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c2JSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Zzd1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnN3dyAhICovCi0gIC8qIGMwICovCi0gIHsgInhhZGRCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkUyIsIEV2LCBHdiwgWFggfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVgsIFhYLCBYWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1gsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVEWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU1AsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVCUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZVNJLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlREksIFhYLCBYWCB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNybHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YLCBYWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWludWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBvciIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHhvciIsIE1YLCBFTSwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyIiwgR3YsIEV3LCBYWCB9LAotICB7ICJsc2wiLCBHdiwgRXcsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiY2x0cyIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIndiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInVkMmEiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIgLCBYWCwgWFgsIFhYfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3YiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBEZCwgWFggfSwKLSAgeyAibW92IiwgQ2QsIFJkLCBYWCB9LAotICB7ICJtb3YiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBUZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdiIsIFRkLCBSZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNLCBYWCB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSwgWFggfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZHRzYyIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkcG1jIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNlbnRlciIsIFhYLCBYWCwgWFggfSwKLSAgeyAic3lzZXhpdCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YWUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmEiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZwIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92Z2UiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmciLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYLCBYWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSwgWFggfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92ZCIsIE1YLCBFZCwgWFggfSwKLSAgeyAibW92cSIsIE1YLCBFTSwgWFggfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJlbW1zIiwgWFgsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgRWQsIE1YLCBYWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YLCBYWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5vIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYiIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamFlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5lIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImphIiwgSnYsIFhYLCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5zIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqcCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5wIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamdlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbGUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpnIiwgSnYsIFhYLCBYWCB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRubyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YiIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YWUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5lIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YSIsIEViLCBYWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnMiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldHAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5wIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRnZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGciLCBFYiwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2giLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGZzLCBYWCwgWFggfSwKLSAgeyAiY3B1aWQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgImJ0IiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBDTCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInB1c2giLCBncywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiAsIFhYLCBYWCwgWFh9LAotICB7ICJidHMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bCIsIEd2LCBFdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAiY21weGNoZyIsIEViLCBHYiwgWFggfSwKLSAgeyAiY21weGNoZyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJidHIiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxmcyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJtb3Z6eCIsIEd2LCBFYiwgWFggfSwKLSAgeyAibW92engiLCBHdiwgRXcsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjIiwgRXYsIEd2LCBYWCB9LAotICB7ICJic2YiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImJzciIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c3giLCBHdiwgRWIsIFhYIH0sCi0gIHsgIm1vdnN4IiwgR3YsIEV3LCBYWCB9LAotICAvKiBjMCAqLwotICB7ICJ4YWRkIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkIiwgRXYsIEd2LCBYWCB9LAotICB7IFBSRUdSUDEgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBpbnNydyIsIE1YLCBFdiwgSWIgfSwKLSAgeyAicGV4dHJ3IiwgRXYsIE1YLCBJYiB9LAotICB7ICJzaHVmcHMiLCBYTSwgRVgsIEliIH0sCi0gIHsgR1JQOSB9LAotICAvKiBjOCAqLwotICB7ICJic3dhcCIsIGVBWCwgWFgsIFhYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLwotICB7ICJic3dhcCIsIGVDWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZURYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlQlgsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVTUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJQLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU0ksIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVESSwgWFgsIFhYIH0sCi0gIC8qIGQwICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwc3JsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNybGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxxIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG11bGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG1vdm1za2IiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgInBzdWJ1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJ1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW51YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHViIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYW5kbiIsIE1YLCBFTSwgWFggfSwKLSAgLyogZTAgKi8KLSAgeyAicGF2Z2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGF2Z3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdm50cSIsIEV2LCBNWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAicHN1YnNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3Vic3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW5zdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG9yIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJweG9yIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNsbHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzbGxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtYWRkd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzYWRidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAibWFza21vdnEiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGY4ICovCi0gIHsgInBzdWJiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwYWRkYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb25lYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMDAgKi8KLSAgLyogMTAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMTAgKi8KLSAgLyogMjAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMjAgKi8KLSAgLyogMzAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMzAgKi8KLSAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNDAgKi8KLSAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNTAgKi8KLSAgLyogNjAgKi8gMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwgLyogNjAgKi8KLSAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNzAgKi8KLSAgLyogODAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogODAgKi8KLSAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOTAgKi8KLSAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYTAgKi8KLSAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYjAgKi8KLSAgLyogYzAgKi8gMSwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogYzAgKi8KLSAgLyogZDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwgLyogZDAgKi8KLSAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZTAgKi8KLSAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMSAgLyogZjAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCi0gIC8qIDUwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsIC8qIDZmICovCi0gIC8qIDcwICovIDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCi0gIC8qIGIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwxLDEsIC8qIGJmICovCi0gIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGRmICovCi0gIC8qIGUwICovIDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX3VzZXNfZjNfcHJlZml4WzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCi0gIC8qIDUwICovIDAsMSwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDZmICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGJmICovCi0gIC8qIGMwICovIDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY2hhciBvYnVmWzEwMF07Ci1zdGF0aWMgY2hhciAqb2J1ZnA7Ci1zdGF0aWMgY2hhciBzY3JhdGNoYnVmWzEwMF07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhcnRfY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5zbl9jb2RlcDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICp0aGVfaW5mbzsKLXN0YXRpYyBpbnQgbW9kOwotc3RhdGljIGludCBybTsKLXN0YXRpYyBpbnQgcmVnOwotc3RhdGljIHZvaWQgb2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICpzKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczMyW109ewotICAiJWVheCIsIiVlY3giLCIlZWR4IiwiJWVieCIsICIlZXNwIiwiJWVicCIsIiVlc2kiLCIlZWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMxNltdID0gewotICAiJWF4IiwiJWN4IiwiJWR4IiwiJWJ4IiwiJXNwIiwiJWJwIiwiJXNpIiwiJWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXM4W10gPSB7Ci0gICIlYWwiLCIlY2wiLCIlZGwiLCIlYmwiLCIlYWgiLCIlY2giLCIlZGgiLCIlYmgiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc19zZWdbXSA9IHsKLSAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICppbmRleDE2W10gPSB7Ci0gICIlYngsJXNpIiwiJWJ4LCVkaSIsIiVicCwlc2kiLCIlYnAsJWRpIiwiJXNpIiwiJWRpIiwiJWJwIiwiJWJ4IgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZ3Jwc1tdWzhdID0gewotICAvKiBHUlAxYiAqLwotICB7Ci0gICAgeyAiYWRkQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJvckEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiYWRjQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzYmJBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImFuZEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAic3ViQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJ4b3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImNtcEEiLAlFYiwgSWIsIFhYIH0KLSAgfSwKLSAgLyogR1JQMVMgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgImFkY1EiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAic2JiUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgInN1YlEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAieG9yUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIEl2LCBYWCB9Ci0gIH0sCi0gIC8qIEdSUDFTcyAqLwotICB7Ci0gICAgeyAiYWRkUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhZGNRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzYmJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzdWJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJ4b3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIHNJYiwgWFggfQotICB9LAotICAvKiBHUlAyYiAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlMgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAicm9yUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJyY2xRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgInJjclEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAic2hsUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJzaHJRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhclEiLAlFdiwgSWIsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX29uZSAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlNfb25lICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInJvclEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAicmNsUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJyY3JRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInNobFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAic2hyUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFh9LAotICAgIHsgInNhclEiLAlFdiwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX2NsICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInJvckEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAicmNsQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICJyY3JBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInNobEEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAic2hyQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJzYXJBIiwJRWIsIENMLCBYWCB9LAotICB9LAotICAvKiBHUlAyU19jbCAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJyb3JRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInJjbFEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAicmNyUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJzaGxRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInNoclEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyUSIsCUV2LCBDTCwgWFggfQotICB9LAotICAvKiBHUlAzYiAqLwotICB7Ci0gICAgeyAidGVzdEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAibm90QSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJuZWdBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgIm11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiaW11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiZGl2QiIsCUFMLCBFYiwgWFggfSwKLSAgICB7ICJpZGl2QiIsCUFMLCBFYiwgWFggfQotICB9LAotICAvKiBHUlAzUyAqLwotICB7Ci0gICAgeyAidGVzdFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAibm90USIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJuZWdRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgIm11bFMiLAllQVgsIEV2LCBYWCB9LAotICAgIHsgImltdWxTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJkaXZTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJpZGl2UyIsCWVBWCwgRXYsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDQgKi8KLSAgewotICAgIHsgImluY0EiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiZGVjQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQNSAqLwotICB7Ci0gICAgeyAiaW5jUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJkZWNRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAibGNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAiam1wUCIsCWluZGlyRXYsIFhYLCBYWCB9LAotICAgIHsgImxqbXBQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAicHVzaFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDYgKi8KLSAgewotICAgIHsgInNsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAic3RyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgImxsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAibHRyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgInZlcnIiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAidmVydyIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfQotICB9LAotICAvKiBHUlA3ICovCi0gIHsKLSAgICB7ICJzZ2R0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNpZHQiLCBFdywgWFgsIFhYIH0sCi0gICAgeyAibGdkdCIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJsaWR0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNtc3ciLCBFdywgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gICAgeyAibG1zdyIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJpbnZscGciLCBFdywgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDggKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImJ0USIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJidHNRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgImJ0clEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAiYnRjUSIsCUV2LCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQOSAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiY21weGNoZzhiIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMCAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNybHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNyYXciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNsbHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDExICovCi0gIHsKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JhZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc2xsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMTIgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzcmxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzbGxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMyAqLwotICB7Ci0gICAgeyAiZnhzYXZlIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgImZ4cnN0b3IiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAibGRteGNzciIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJzdG14Y3NyIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNmZW5jZSIsIE5vbmUsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxNCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2hudGEiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h0MCIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJwcmVmZXRjaHQxIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgInByZWZldGNodDIiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUEFNRCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2giLCBFYiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h3IiwgRWIsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9Ci0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHByZWZpeF91c2VyX3RhYmxlW11bMl0gPSB7Ci0gIC8qIFBSRUdSUDAgKi8KLSAgewotICAgIHsgImFkZHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImFkZHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxICovCi0gIHsKLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAkvKiBTZWUgT1BfU0lNRF9TVUZGSVggKi8KLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAotICB9LAotICAvKiBQUkVHUlAyICovCi0gIHsKLSAgICB7ICJjdnRwaTJwcyIsIFhNLCBFTSwgWFggfSwKLSAgICB7ICJjdnRzaTJzcyIsIFhNLCBFdiwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMyAqLwotICB7Ci0gICAgeyAiY3Z0cHMycGkiLCBNWCwgRVgsIFhYIH0sCi0gICAgeyAiY3Z0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDQgKi8KLSAgewotICAgIHsgImN2dHRwczJwaSIsIE1YLCBFWCwgWFggfSwKLSAgICB7ICJjdnR0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDUgKi8KLSAgewotICAgIHsgImRpdnBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImRpdnNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlA2ICovCi0gIHsKLSAgICB7ICJtYXhwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtYXhzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQNyAqLwotICB7Ci0gICAgeyAibWlucHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibWluc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDggKi8KLSAgewotICAgIHsgIm1vdnVwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtb3ZzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQOSAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgRVgsIFhNLCBYWCB9LAotICAgIHsgIm1vdnNzIiwgRVgsIFhNLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxMCAqLwotICB7Ci0gICAgeyAibXVscHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibXVsc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDExICovCi0gIHsKLSAgICB7ICJyY3BwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJyY3BzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTIgKi8KLSAgewotICAgIHsgInJzcXJ0cHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAicnNxcnRzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTMgKi8KLSAgewotICAgIHsgInNxcnRwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzcXJ0c3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDE0ICovCi0gIHsKLSAgICB7ICJzdWJwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzdWJzcyIsIFhNLCBFWCwgWFggfSwKLSAgfQotfTsKLQotI2RlZmluZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IgXygiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKQotCi1zdGF0aWMgdm9pZAotY2twcmVmaXggKCkKLXsKLSAgcHJlZml4ZXMgPSAwOwotICB1c2VkX3ByZWZpeGVzID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBzd2l0Y2ggKCpjb2RlcCkKLQl7Ci0JY2FzZSAweGYzOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjI6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjA6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9DUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9TUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9FUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NDoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9HUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EQVRBOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY3OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0FERFI7Ci0JICBicmVhazsKLQljYXNlIEZXQUlUX09QQ09ERToKLQkgIC8qIGZ3YWl0IGlzIHJlYWxseSBhbiBpbnN0cnVjdGlvbi4gIElmIHRoZXJlIGFyZSBwcmVmaXhlcwotCSAgICAgYmVmb3JlIHRoZSBmd2FpdCwgdGhleSBiZWxvbmcgdG8gdGhlIGZ3YWl0LCAqbm90KiB0byB0aGUKLQkgICAgIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gICovCi0JICBpZiAocHJlZml4ZXMpCi0JICAgIHsKLQkgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRldBSVQ7Ci0JICAgICAgY29kZXArKzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHByZWZpeGVzID0gUFJFRklYX0ZXQUlUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgICBjb2RlcCsrOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXggYnl0ZSBQUkVGLCBvciBOVUxMIGlmIFBSRUYgaXMgbm90IGEKLSAgIHByZWZpeCBieXRlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcHJlZml4X25hbWUgKHByZWYsIHNpemVmbGFnKQotICAgICBpbnQgcHJlZjsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzd2l0Y2ggKHByZWYpCi0gICAgewotICAgIGNhc2UgMHhmMzoKLSAgICAgIHJldHVybiAicmVweiI7Ci0gICAgY2FzZSAweGYyOgotICAgICAgcmV0dXJuICJyZXBueiI7Ci0gICAgY2FzZSAweGYwOgotICAgICAgcmV0dXJuICJsb2NrIjsKLSAgICBjYXNlIDB4MmU6Ci0gICAgICByZXR1cm4gImNzIjsKLSAgICBjYXNlIDB4MzY6Ci0gICAgICByZXR1cm4gInNzIjsKLSAgICBjYXNlIDB4M2U6Ci0gICAgICByZXR1cm4gImRzIjsKLSAgICBjYXNlIDB4MjY6Ci0gICAgICByZXR1cm4gImVzIjsKLSAgICBjYXNlIDB4NjQ6Ci0gICAgICByZXR1cm4gImZzIjsKLSAgICBjYXNlIDB4NjU6Ci0gICAgICByZXR1cm4gImdzIjsKLSAgICBjYXNlIDB4NjY6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgREZMQUcpID8gImRhdGExNiIgOiAiZGF0YTMyIjsKLSAgICBjYXNlIDB4Njc6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgQUZMQUcpID8gImFkZHIxNiIgOiAiYWRkcjMyIjsKLSAgICBjYXNlIEZXQUlUX09QQ09ERToKLSAgICAgIHJldHVybiAiZndhaXQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyIG9wMW91dFsxMDBdLCBvcDJvdXRbMTAwXSwgb3Azb3V0WzEwMF07Ci1zdGF0aWMgaW50IG9wX2FkLCBvcF9pbmRleFszXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb3BfYWRkcmVzc1szXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRfcGM7Ci0KLQwKLS8qCi0gKiAgIE9uIHRoZSAzODYncyBvZiAxOTg4LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMgMTUgYnl0ZXMuCi0gKiAgIChzZWUgdG9waWMgIlJlZHVuZGFudCBwcmVmaXhlcyIgaW4gdGhlICJEaWZmZXJlbmNlcyBmcm9tIDgwODYiCi0gKiAgIHNlY3Rpb24gb2YgdGhlICJWaXJ0dWFsIDgwODYgTW9kZSIgY2hhcHRlci4pCi0gKiAncGMnIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGluc3RydWN0aW9uLCBpdCB3aWxsCi0gKiAgIGJlIHVzZWQgdG8gcHJpbnQgdGhlIHRhcmdldCBhZGRyZXNzIGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBqdW1wIG9yIGNhbGwKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25faTM4NgotICBQQVJBTVMgKChiZmRfdm1hIHBjLCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLXN0YXRpYyBjaGFyIGludGVsX3N5bnRheDsKLXN0YXRpYyBjaGFyIG9wZW5fY2hhcjsKLXN0YXRpYyBjaGFyIGNsb3NlX2NoYXI7Ci1zdGF0aWMgY2hhciBzZXBhcmF0b3JfY2hhcjsKLXN0YXRpYyBjaGFyIHNjYWxlX2NoYXI7Ci0KLWludAotcHJpbnRfaW5zbl9pMzg2X2F0dCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludGVsX3N5bnRheCA9IDA7Ci0gIG9wZW5fY2hhciA9ICcoJzsKLSAgY2xvc2VfY2hhciA9ICAnKSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJywnOwotICBzY2FsZV9jaGFyID0gJywnOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotaW50Ci1wcmludF9pbnNuX2kzODZfaW50ZWwgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnRlbF9zeW50YXggPSAxOwotICBvcGVuX2NoYXIgPSAnWyc7Ci0gIGNsb3NlX2NoYXIgPSAnXSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJysnOwotICBzY2FsZV9jaGFyID0gJyonOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpczM4NiAqZHA7Ci0gIGludCBpOwotICBpbnQgdHdvX3NvdXJjZV9vcHM7Ci0gIGNoYXIgKmZpcnN0LCAqc2Vjb25kLCAqdGhpcmQ7Ci0gIGludCBuZWVkY29tbWE7Ci0gIHVuc2lnbmVkIGNoYXIgbmVlZF9tb2RybTsKLSAgdW5zaWduZWQgY2hhciB1c2VzX2YzX3ByZWZpeDsKLSAgVk9MQVRJTEUgaW50IHNpemVmbGFnOwotICBWT0xBVElMRSBpbnQgb3JpZ19zaXplZmxhZzsKLQotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmluYnVmID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgotICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgIHNpemVmbGFnID0gQUZMQUd8REZMQUc7Ci0gIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKLSAgICBzaXplZmxhZyA9IDA7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgb3JpZ19zaXplZmxhZyA9IHNpemVmbGFnOwotCi0gIC8qIFRoZSBvdXRwdXQgbG9va3MgYmV0dGVyIGlmIHdlIHB1dCA3IGJ5dGVzIG9uIGEgbGluZSwgc2luY2UgdGhhdAotICAgICBwdXRzIG1vc3QgbG9uZyB3b3JkIGluc3RydWN0aW9ucyBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA3OwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBwYzsKLQotICBvYnVmWzBdID0gMDsKLSAgb3Axb3V0WzBdID0gMDsKLSAgb3Ayb3V0WzBdID0gMDsKLSAgb3Azb3V0WzBdID0gMDsKLQotICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzFdID0gb3BfaW5kZXhbMl0gPSAtMTsKLQotICB0aGVfaW5mbyA9IGluZm87Ci0gIHN0YXJ0X3BjID0gcGM7Ci0gIHN0YXJ0X2NvZGVwID0gaW5idWY7Ci0gIGNvZGVwID0gaW5idWY7Ci0KLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEdldHRpbmcgaGVyZSBtZWFucyB3ZSB0cmllZCBmb3IgZGF0YSBidXQgZGlkbid0IGdldCBpdC4gIFRoYXQKLSAgICAgICAgIG1lYW5zIHdlIGhhdmUgYW4gaW5jb21wbGV0ZSBpbnN0cnVjdGlvbiBvZiBzb21lIHNvcnQuICBKdXN0Ci0gICAgICAgICBwcmludCB0aGUgZmlyc3QgYnl0ZSBhcyBhIHByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gICovCi0gICAgICBpZiAoY29kZXAgPiBpbmJ1ZikKLQl7Ci0JICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSAuYnl0ZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIuYnl0ZSAweCV4IiwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpIGluYnVmWzBdKTsKLQkgICAgfQotCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgY2twcmVmaXggKCk7Ci0KLSAgaW5zbl9jb2RlcCA9IGNvZGVwOwotCi0gIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOwotCi0gIG9idWZwID0gb2J1ZjsKLQotICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQotICAgICAgJiYgKCgqY29kZXAgPCAweGQ4KSB8fCAoKmNvZGVwID4gMHhkZikpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gIFByaW50IHRoZQotICAgICAgICAgZmlyc3QgcHJlZml4LCB3aGljaCBpcyBwcm9iYWJseSBmd2FpdCBpdHNlbGYuICAqLwotICAgICAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCpjb2RlcCA9PSAweDBmKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMik7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9pbnRlbFsqKytjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2F0dFsqKytjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gdHdvYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsqY29kZXBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl9pbnRlbFsqY29kZXBdOwotICAgICAgZWxzZQotICAgICAgICBkcCA9ICZkaXMzODZfYXR0Wypjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gb25lYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gMDsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgaWYgKCF1c2VzX2YzX3ByZWZpeCAmJiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikpCi0gICAgewotICAgICAgb2FwcGVuZCAoInJlcHogIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJyZXBueiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spCi0gICAgewotICAgICAgb2FwcGVuZCAoImxvY2sgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotICAgIH0KLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSAgICBzaXplZmxhZyBePSBERkxBRzsKLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikKLSAgICB7Ci0gICAgICBzaXplZmxhZyBePSBBRkxBRzsKLSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgICAgICBvYXBwZW5kICgiYWRkcjMyICIpOwotICAgICAgZWxzZQotCW9hcHBlbmQgKCJhZGRyMTYgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotICAgIH0KLQotICBpZiAobmVlZF9tb2RybSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICAgICAgbW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0gICAgICByZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKLSAgICAgIHJtID0gKmNvZGVwICYgNzsKLSAgICB9Ci0KLSAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPmJ5dGVtb2RlMSA9PSBGTE9BVENPREUpCi0gICAgewotICAgICAgZG9mbG9hdCAoc2l6ZWZsYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaChkcC0+Ynl0ZW1vZGUyKQotCSAgICB7Ci0JICAgICAgY2FzZSBVU0VfR1JPVVBTOgotCSAgICAgICAgZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOwotCQlicmVhazsKLQkgICAgICBjYXNlIFVTRV9QUkVGSVhfVVNFUl9UQUJMRToKLQkJZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPmJ5dGVtb2RlMV1bcHJlZml4ZXMgJiBQUkVGSVhfUkVQWiA/IDEgOiAwXTsKLQkJdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCW9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBvcF9hZCA9IDI7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBvcF9hZCA9IDE7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDNvdXQ7Ci0gICAgICBvcF9hZCA9IDA7Ci0gICAgICBpZiAoZHAtPm9wMykKLQkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMsIHNpemVmbGFnKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdCB1c2VkLiAgSWYgc28sIHByaW50IHRoZSBmaXJzdCBvbmUKLSAgICAgc2VwYXJhdGVseS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlJ2xsIHdpbmQgdXAgcHJpbnRpbmcgYW4KLSAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIHdoaWNoIGRvZXMgbm90IHByZWNpc2VseSBjb3JyZXNwb25kIHRvIHRoZQotICAgICBieXRlcyB3ZSBhcmUgZGlzYXNzZW1ibGluZy4gICovCi0gIGlmICgocHJlZml4ZXMgJiB+dXNlZF9wcmVmaXhlcykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOwotICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQotICAgIG9hcHBlbmQgKCIgIik7Ci0gIG9hcHBlbmQgKCIgIik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKLQotICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCi0gICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wMW91dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSBvcF9pbmRleFswXTsKLSAgICAgIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMl07Ci0gICAgICBvcF9pbmRleFsyXSA9IG9wX2FkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Azb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDFvdXQ7Ci0gICAgfQotICBuZWVkY29tbWEgPSAwOwotICBpZiAoKmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChvcF9pbmRleFswXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzBdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGZpcnN0KTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnNlY29uZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzFdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMV1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2Vjb25kKTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnRoaXJkKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMl0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsyXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB0aGlyZCk7Ci0gICAgfQotICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9hdHRbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGRzIiwKLSAgImZtdWxzIiwKLSAgImZjb21zIiwKLSAgImZjb21wcyIsCi0gICJmc3VicyIsCi0gICJmc3VicnMiLAotICAiZmRpdnMiLAotICAiZmRpdnJzIiwKLSAgLyogIGQ5ICovCi0gICJmbGRzIiwKLSAgIihiYWQpIiwKLSAgImZzdHMiLAotICAiZnN0cHMiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkbCIsCi0gICJmaW11bGwiLAotICAiZmljb21sIiwKLSAgImZpY29tcGwiLAotICAiZmlzdWJsIiwKLSAgImZpc3VicmwiLAotICAiZmlkaXZsIiwKLSAgImZpZGl2cmwiLAotICAvKiBkYiAqLwotICAiZmlsZGwiLAotICAiKGJhZCkiLAotICAiZmlzdGwiLAotICAiZmlzdHBsIiwKLSAgIihiYWQpIiwKLSAgImZsZHQiLAotICAiKGJhZCkiLAotICAiZnN0cHQiLAotICAvKiBkYyAqLwotICAiZmFkZGwiLAotICAiZm11bGwiLAotICAiZmNvbWwiLAotICAiZmNvbXBsIiwKLSAgImZzdWJsIiwKLSAgImZzdWJybCIsCi0gICJmZGl2bCIsCi0gICJmZGl2cmwiLAotICAvKiBkZCAqLwotICAiZmxkbCIsCi0gICIoYmFkKSIsCi0gICJmc3RsIiwKLSAgImZzdHBsIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGRsbCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1faW50ZWxbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qICBkOSAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRiICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiKGJhZCkiLAotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdHAiLAotICAvKiBkYyAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogZGQgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotI2RlZmluZSBTVCBPUF9TVCwgMAotI2RlZmluZSBTVGkgT1BfU1RpLCAwCi0KLSNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxLCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMywgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNiwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgsIE5VTEwsIDAsIE5VTEwsIDAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7Ci0gIC8qIGQ4ICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmbXVsIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY29tIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmY29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN1YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXYiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1QsIFNUaSwgWFggfSwKLSAgfSwKLSAgLyogZDkgKi8KLSAgewotICAgIHsgImZsZCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnhjaCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZDlfMiB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGQ5XzQgfSwKLSAgICB7IEZHUlBkOV81IH0sCi0gICAgeyBGR1JQZDlfNiB9LAotICAgIHsgRkdSUGQ5XzcgfSwKLSAgfSwKLSAgLyogZGEgKi8KLSAgewotICAgIHsgImZjbW92YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3ZlIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92dSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZGFfNSB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYiAqLwotICB7Ci0gICAgeyAiZmNtb3ZuYiIsU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdm5lIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bnUiLFNULCBTVGksIFhYIH0sCi0gICAgeyBGR1JQZGJfNCB9LAotICAgIHsgImZ1Y29taSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNvbWkiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYyAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXYiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZzdWIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2IiwJU1RpLCBTVCwgWFggfSwKLSNlbmRpZgotICB9LAotICAvKiBkZCAqLwotICB7Ci0gICAgeyAiZmZyZWUiLAlTVGksIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImZzdCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN0cCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnVjb20iLAlTVGksIFhYLCBYWCB9LAotICAgIHsgImZ1Y29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIGRlICovCi0gIHsKLSAgICB7ICJmYWRkcCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bHAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRlXzMgfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0jZW5kaWYKLSAgfSwKLSAgLyogZGYgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRmXzQgfSwKLSAgICB7ICJmdWNvbWlwIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjb21pcCIsIFNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi19OwotCi0KLXN0YXRpYyBjaGFyICpmZ3Jwc1tdWzhdID0gewotICAvKiBkOV8yICAwICovCi0gIHsKLSAgICAiZm5vcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV80ICAxICovCi0gIHsKLSAgICAiZmNocyIsImZhYnMiLCIoYmFkKSIsIihiYWQpIiwiZnRzdCIsImZ4YW0iLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV81ICAyICovCi0gIHsKLSAgICAiZmxkMSIsImZsZGwydCIsImZsZGwyZSIsImZsZHBpIiwiZmxkbGcyIiwiZmxkbG4yIiwiZmxkeiIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV82ICAzICovCi0gIHsKLSAgICAiZjJ4bTEiLCJmeWwyeCIsImZwdGFuIiwiZnBhdGFuIiwiZnh0cmFjdCIsImZwcmVtMSIsImZkZWNzdHAiLCJmaW5jc3RwIiwKLSAgfSwKLQotICAvKiBkOV83ICA0ICovCi0gIHsKLSAgICAiZnByZW0iLCJmeWwyeHAxIiwiZnNxcnQiLCJmc2luY29zIiwiZnJuZGludCIsImZzY2FsZSIsImZzaW4iLCJmY29zIiwKLSAgfSwKLQotICAvKiBkYV81ICA1ICovCi0gIHsKLSAgICAiKGJhZCkiLCJmdWNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkYl80ICA2ICovCi0gIHsKLSAgICAiZmVuaSgyODcgb25seSkiLCJmZGlzaSgyODcgb25seSkiLCJmTmNsZXgiLCJmTmluaXQiLAotICAgICJmTnNldHBtKDI4NyBvbmx5KSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGVfMyAgNyAqLwotICB7Ci0gICAgIihiYWQpIiwiZmNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkZl80ICA4ICovCi0gIHsKLSAgICAiZk5zdHN3IiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotfTsKLQotc3RhdGljIHZvaWQKLWRvZmxvYXQgKHNpemVmbGFnKQotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOwotICB1bnNpZ25lZCBjaGFyIGZsb2F0b3A7Ci0KLSAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKLQotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9pbnRlbFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHB1dG9wIChmbG9hdF9tZW1fYXR0WyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkYikKLSAgICAgICAgT1BfRSAoeF9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlIGlmIChmbG9hdG9wID09IDB4ZGQpCi0gICAgICAgIE9QX0UgKGRfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZQotICAgICAgICBPUF9FICh2X21vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgZHAgPSAmZmxvYXRfcmVnW2Zsb2F0b3AgLSAweGQ4XVtyZWddOwotICBpZiAoZHAtPm5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRvcCAoZmdycHNbZHAtPmJ5dGVtb2RlMV1bcm1dLCBzaXplZmxhZyk7Ci0KLSAgICAgIC8qIGluc3RydWN0aW9uIGZuc3RzdyBpcyBvbmx5IG9uZSB3aXRoIHN0cmFuZ2UgYXJnICovCi0gICAgICBpZiAoZmxvYXRvcCA9PSAweGRmICYmIGNvZGVwWy0xXSA9PSAweGUwKQotCXN0cmNweSAob3Axb3V0LCBuYW1lczE2WzBdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Ayb3V0OwotICAgICAgaWYgKGRwLT5vcDIpCi0JKCpkcC0+b3AyKShkcC0+Ynl0ZW1vZGUyLCBzaXplZmxhZyk7Ci0gICAgfQotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1NUIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBvYXBwZW5kICgiJXN0Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVzdCglZCkiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0KLS8qIGNhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zICovCi1zdGF0aWMgdm9pZAotcHV0b3AgKHRlbXBsYXRlLCBzaXplZmxhZykKLSAgICAgY29uc3QgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBmb3IgKHAgPSB0ZW1wbGF0ZTsgKnA7IHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpwKQotCXsKLQlkZWZhdWx0OgotCSAgKm9idWZwKysgPSAqcDsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6CQkvKiBGb3IgamN4ei9qZWN4eiAqLwotCSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0JICAgICpvYnVmcCsrID0gJ2UnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2wnOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfRldBSVQpID09IDApCi0JICAgICpvYnVmcCsrID0gJ24nOwotCSAgZWxzZQotCSAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdRJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0JICBpZiAobW9kICE9IDMKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdSJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdxJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQkgICpvYnVmcCsrID0gJ2QnOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICB9Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICAvKiBvcGVyYW5kIHNpemUgZmxhZyBmb3IgY3d0bCwgY2J0dyAqLwotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgICpvYnVmcCsrID0gJ3cnOwotCSAgZWxzZQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdlJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQl9Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgKm9idWZwID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW9hcHBlbmQgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHN0cmNweSAob2J1ZnAsIHMpOwotICBvYnVmcCArPSBzdHJsZW4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NlZyAoKQotewotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVjczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZHM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJXNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVlczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZnM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWdzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfaW5kaXJFIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoIWludGVsX3N5bnRheCkKLSAgICBvYXBwZW5kICgiKiIpOwotICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IGRpc3A7Ci0KLSAgLyogc2tpcCBtb2Qvcm0gYnl0ZSAqLwotICBjb2RlcCsrOwotCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotCXsKLQljYXNlIGJfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB3X21vZGU6Ci0JICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIGRfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2Ugdl9tb2RlOgotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGVsc2UKLQkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOwotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoICEoY29kZXBbLTJdID09IDB4QUUgJiYgY29kZXBbLTFdID09IDB4RjggLyogc2ZlbmNlICovKSkKLQkgICAgQmFkT3AoKTsJLyogYmFkIHNmZW5jZSxsZWEsbGRzLGxlcyxsZnMsbGdzLGxzcyBtb2RybSAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpc3AgPSAwOwotICBhcHBlbmRfc2VnICgpOwotCi0gIGlmIChzaXplZmxhZyAmIEFGTEFHKSAvKiAzMiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgewotICAgICAgaW50IGhhdmVzaWI7Ci0gICAgICBpbnQgaGF2ZWJhc2U7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICBpbnQgc2NhbGUgPSAwOwotCi0gICAgICBoYXZlc2liID0gMDsKLSAgICAgIGhhdmViYXNlID0gMTsKLSAgICAgIGJhc2UgPSBybTsKLQotICAgICAgaWYgKGJhc2UgPT0gNCkKLQl7Ci0JICBoYXZlc2liID0gMTsKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgc2NhbGUgPSAoKmNvZGVwID4+IDYpICYgMzsKLQkgIGluZGV4ID0gKCpjb2RlcCA+PiAzKSAmIDc7Ci0JICBiYXNlID0gKmNvZGVwICYgNzsKLQkgIGNvZGVwKys7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGJhc2UgPT0gNSkKLQkgICAgewotCSAgICAgIGhhdmViYXNlID0gMDsKLQkgICAgICBkaXNwID0gZ2V0MzIgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQzMiAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKGhhdmViYXNlIHx8IChoYXZlc2liICYmIChpbmRleCAhPSA0IHx8IHNjYWxlICE9IDApKSkKLQl7Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChieXRlbW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBiX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJCWVRFIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugd19tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHZfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkRXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZF9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiUVdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB4X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJYV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBpZiAoaGF2ZWJhc2UpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbYmFzZV0pOwotCSAgaWYgKGhhdmVzaWIpCi0JICAgIHsKLQkgICAgICBpZiAoaW5kZXggIT0gNCkKLQkJewotICAgICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlYmFzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzZXBhcmF0b3JfY2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLQkJICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIsJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0JCSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0JCX0KLSAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgIHx8IChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSBiX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB3X21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB2X21vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIDEgPDwgc2NhbGUpOwotCSAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERvbid0IHByaW50IHplcm8gZGlzcGxhY2VtZW50cyAqLwotICAgICAgICAgICAgICAgIGlmIChkaXNwID4gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIislZCIsIGRpc3ApOwotICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwIDwgMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLQkgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgICB7Ci0JICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUwotCQkJICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKLQkJICBvYXBwZW5kICgiOiIpOwotCQl9Ci0gICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7Ci0gICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgeyAvKiAxNiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKHJtID09IDYpCi0JICAgIHsKLQkgICAgICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAgICAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCQlkaXNwIC09IDB4MTAwMDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQxNiAoKTsKLQkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtID09IDYpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICB9Ci0KLSAgICAgIGlmIChtb2QgIT0gMCB8fCBybSAhPSA2KQotCXsKLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBvYXBwZW5kIChpbmRleDE2W3JtXSk7Ci0gICAgICAgICAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU9QX0cgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXM4W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczE2W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgZWxzZQotCW9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXQzMiAoKQotewotICBpbnQgeCA9IDA7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgNCk7Ci0gIHggPSAqY29kZXArKyAmIDB4ZmY7Ci0gIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKLSAgcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDE2ICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAyKTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9vcCAob3ApCi0gICAgIHVuc2lnbmVkIGludCBvcDsKLXsKLSAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7Ci0gIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3A7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9SRUcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBpbmRpcl9keF9yZWc6Ci0gICAgICBzID0gIiglZHgpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYXhfcmVnOiBjYXNlIGN4X3JlZzogY2FzZSBkeF9yZWc6IGNhc2UgYnhfcmVnOgotICAgIGNhc2Ugc3BfcmVnOiBjYXNlIGJwX3JlZzogY2FzZSBzaV9yZWc6IGNhc2UgZGlfcmVnOgotICAgICAgcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVzX3JlZzogY2FzZSBzc19yZWc6IGNhc2UgY3NfcmVnOgotICAgIGNhc2UgZHNfcmVnOiBjYXNlIGZzX3JlZzogY2FzZSBnc19yZWc6Ci0gICAgICBzID0gbmFtZXNfc2VnW2NvZGUgLSBlc19yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6Ci0gICAgY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6Ci0gICAgICBzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgotICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIGVsc2UKLQlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvYXBwZW5kIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0Jb3AgPSBnZXQxNiAoKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvcCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgiLCBvcCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLU9QX3NJIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgb3A7Ci0KLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIG9wID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKG9wICYgMHg4MCkgIT0gMCkKLQlvcCAtPSAweDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcCA9IGdldDE2KCk7Ci0JICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCSAgICBvcCAtPSAweDEwMDAwOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKLQlvcCAtPSAweDEwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9KIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLSAgaW50IG1hc2sgPSAtMTsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgZGlzcCA9ICpjb2RlcCsrOwotICAgICAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQlkaXNwIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlkaXNwID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgLyogZm9yIHNvbWUgcmVhc29uLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wIGluc3RydWN0aW9uCi0JICAgICBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlciB0aGUKLQkgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCi0JICBtYXNrID0gMHhmZmZmOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBkaXNwID0gKHN0YXJ0X3BjICsgY29kZXAgLSBzdGFydF9jb2RlcCArIGRpc3ApICYgbWFzazsKLSAgc2V0X29wIChkaXNwKTsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU0VHIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RhdGljIGNoYXIgKnNyZWdbXSA9IHsKLSAgICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCi0gIH07Ci0KLSAgb2FwcGVuZCAoc3JlZ1tyZWddKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9ESVIgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IHNlZywgb2Zmc2V0OwotCi0gIGlmIChzaXplZmxhZyAmIERGTEFHKQotICAgIHsKLSAgICAgIG9mZnNldCA9IGdldDMyICgpOwotICAgICAgc2VnID0gZ2V0MTYgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgsJDB4JXgiLCBzZWcsIG9mZnNldCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX09GRiAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvZmY7Ci0KLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBvZmYgPSBnZXQzMiAoKTsKLSAgZWxzZQotICAgIG9mZiA9IGdldDE2ICgpOwotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgewotICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCSAgICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKLQl7Ci0JICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCSAgb2FwcGVuZCAoIjoiKTsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIG9hcHBlbmQgKCIoIik7Ci0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgZWxzZQotICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgb2FwcGVuZCAocyk7Ci0gIG9hcHBlbmQgKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIG9hcHBlbmQgKCIlZXM6Iik7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0RTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKChwcmVmaXhlcwotICAgICAgICYgKFBSRUZJWF9DUwotCSAgfCBQUkVGSVhfRFMKLQkgIHwgUFJFRklYX1NTCi0JICB8IFBSRUZJWF9FUwotCSAgfCBQUkVGSVhfRlMKLQkgIHwgUFJFRklYX0dTKSkgPT0gMCkKLSAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0gIGFwcGVuZF9zZWcoKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0MgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVjciVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfRCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWRiJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9UIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUldHIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfUmQgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01NWCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfWE1NIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUleG1tJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29kZXArKzsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FWCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvZGVwKys7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXhtbSVkIiwgcm0pOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01TIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kID09IDMpCi0gICAgT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gIGVsc2UKLSAgICBCYWRPcCgpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU3VmZml4M0ROb3dbXSA9IHsKLS8qIDAwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDBDICovCSJwaTJmdyIsCSJwaTJmZCIsCU5VTEwsCQlOVUxMLAotLyogMTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMUMgKi8JInBmMml3IiwJInBmMmlkIiwJTlVMTCwJCU5VTEwsCi0vKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg4ICovCU5VTEwsCQlOVUxMLAkJInBmbmFjYyIsCU5VTEwsCi0vKiA4QyAqLwlOVUxMLAkJTlVMTCwJCSJwZnBuYWNjIiwJTlVMTCwKLS8qIDkwICovCSJwZmNtcGdlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTQgKi8JInBmbWluIiwJTlVMTCwJCSJwZnJjcCIsCSJwZnJzcXJ0IiwKLS8qIDk4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViIiwJTlVMTCwKLS8qIDlDICovCU5VTEwsCQlOVUxMLAkJInBmYWRkIiwJTlVMTCwKLS8qIEEwICovCSJwZmNtcGd0IiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQTQgKi8JInBmbWF4IiwJTlVMTCwJCSJwZnJjcGl0MSIsCSJwZnJzcWl0MSIsCi0vKiBBOCAqLwlOVUxMLAkJTlVMTCwJCSJwZnN1YnIiLAlOVUxMLAotLyogQUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhY2MiLAlOVUxMLAotLyogQjAgKi8JInBmY21wZXEiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBCNCAqLwkicGZtdWwiLAlOVUxMLAkJInBmcmNwaXQyIiwJInBmbXVsaHJ3IiwKLS8qIEI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwc3dhcGQiLAotLyogQkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJInBhdmd1c2IiLAotLyogQzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQ0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBENCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIERDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLX07Ci0KLXN0YXRpYyB2b2lkCi1PUF8zRE5vd1N1ZmZpeCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCi0gICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAotICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgbW5lbW9uaWMgPSBTdWZmaXgzRE5vd1sqY29kZXArKyAmIDB4ZmZdOwotICBpZiAobW5lbW9uaWMpCi0gICAgb2FwcGVuZCAobW5lbW9uaWMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2luY2UgYSB2YXJpYWJsZSBzaXplZCBtb2RybS9zaWIgY2h1bmsgaXMgYmV0d2VlbiB0aGUgc3RhcnQKLQkgb2YgdGhlIG9wY29kZSAoMHgwZjBmKSBhbmQgdGhlIG9wY29kZSBzdWZmaXgsIHdlIG5lZWQgdG8gZG8KLQkgYWxsIHRoZSBtb2RybSBwcm9jZXNzaW5nIGZpcnN0LCBhbmQgZG9uJ3Qga25vdyB1bnRpbCBub3cgdGhhdAotCSB3ZSBoYXZlIGEgYmFkIG9wY29kZS4gIFRoaXMgbmVjZXNzaXRhdGVzIHNvbWUgY2xlYW5pbmcgdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltZF9jbXBfb3AgW10gPSB7Ci0gICJlcSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bm9yZCIsCi0gICJuZXEiLAotICAibmx0IiwKLSAgIm5sZSIsCi0gICJvcmQiCi19OwotCi1zdGF0aWMgdm9pZAotT1BfU0lNRF9TdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBpbnQgY21wX3R5cGU7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgY21wX3R5cGUgPSAqY29kZXArKyAmIDB4ZmY7Ci0gIGlmIChjbXBfdHlwZSA8IDgpCi0gICAgewotICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgImNtcCVzJWNzIiwKLQkgICAgICAgc2ltZF9jbXBfb3BbY21wX3R5cGVdLAotCSAgICAgICBwcmVmaXhlcyAmIFBSRUZJWF9SRVBaID8gJ3MnIDogJ3AnKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOwotICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIGJhZCBleHRlbnNpb24gYnl0ZS4gIENsZWFuIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1TSU1EX0ZpeHVwIChleHRyYWNoYXIsIHNpemVmbGFnKQotICAgICBpbnQgZXh0cmFjaGFyOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogQ2hhbmdlIG1vdmxwcy9tb3ZocHMgdG8gbW92aGxwcy9tb3ZsaHBzIGZvciAyIHJlZ2lzdGVyIG9wZXJhbmQKLSAgICAgZm9ybXMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICAgICAgKihwKzEpID0gJ1wwJzsKLSAgICAgICpwICAgICA9ICoocC0xKTsKLSAgICAgICoocC0xKSA9ICoocC0yKTsKLSAgICAgICoocC0yKSA9ICoocC0zKTsKLSAgICAgICoocC0zKSA9IGV4dHJhY2hhcjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEJhZE9wICh2b2lkKQotewotICBjb2RlcCA9IGluc25fY29kZXAgKyAxOwkvKiB0aHJvdyBhd2F5IHByZWZpeGVzIGFuZCAxc3QuIG9wY29kZSBieXRlICovCi0gIG9hcHBlbmQgKCIoYmFkKSIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pOTYwLWRpcy5jIGIvb3Bjb2Rlcy9pOTYwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTgyMDg1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTk2MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBpODA5NjAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLS8qICAwICovCSJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCAKLS8qICA4ICovCSJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKLS8qIDE2ICovCSJnMCIsICAiZzEiLCAgImcyIiwgICJnMyIsICAiZzQiLCAgImc1IiwgICJnNiIsICAiZzciLCAKLS8qIDI0ICovCSJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCAKLS8qIDMyICovCSJwYyIsICAiYWMiLCAgImlwIiwgICJ0YyIsICAiZnAwIiwgImZwMSIsICJmcDIiLCAiZnAzIiAKLX07Ci0KLQotc3RhdGljIEZJTEUgKnN0cmVhbTsJCS8qIE91dHB1dCBnb2VzIGhlcmUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHIoKTsKLXN0YXRpYyB2b2lkIGN0cmwoKTsKLXN0YXRpYyB2b2lkIGNvYnIoKTsKLXN0YXRpYyB2b2lkIHJlZygpOwotc3RhdGljIGludCBtZW0oKTsKLXN0YXRpYyB2b2lkIGVhKCk7Ci1zdGF0aWMgdm9pZCBkc3RvcCgpOwotc3RhdGljIHZvaWQgcmVnb3AoKTsKLXN0YXRpYyB2b2lkIGludmFsaWQoKTsKLXN0YXRpYyBpbnQgcGluc24oKTsKLXN0YXRpYyB2b2lkIHB1dF9hYnMoKTsKLQotCi0vKiBQcmludCB0aGUgaTk2MCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICdtZW1hZGRyJyBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2k5NjAgKG1lbWFkZHIsIGluZm9fYXJnKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb19hcmc7Ci17Ci0gIHVuc2lnbmVkIGludCB3b3JkMSwgd29yZDIgPSAweGRlYWRiZWVmOwotICBiZmRfYnl0ZSBidWZmZXJbOF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaW5mbyA9IGluZm9fYXJnOwotICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogUmVhZCB3b3JkMS4gIE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB3b3JkMSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlLiAgKi8KLSAgc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODoKLSAgICBjYXNlIDB4OToKLSAgICBjYXNlIDB4YToKLSAgICBjYXNlIDB4YjoKLSAgICBjYXNlIDB4YzoKLSAgICAgIC8qIFJlYWQgd29yZDIuICAqLwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShtZW1hZGRyICsgNCwgKGJmZF9ieXRlICopIChidWZmZXIgKyA0KSwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd29yZDIgPSBiZmRfZ2V0bDMyIChidWZmZXIgKyA0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotfQotDAotI2RlZmluZSBJTl9HREIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglBbGwgY29kZSBiZWxvdyB0aGlzIHBvaW50IHNob3VsZCBiZSBpZGVudGljYWwgd2l0aCB0aGF0IG9mCi0gKgl0aGUgZGlzYXNzZW1ibGVyIGluIGdkbXA5NjAuCi0KLSBBIG5vYmxlIHNlbnRpbWVudCwgYnV0IGF0IGxlYXN0IGluIGNvc21ldGljIHdheXMgKGluZm8tPmZwcmludGZfZnVuYyksIGl0Ci0ganVzdCBhaW4ndCBzby4gLWtpbmdkb24sIDMxIE1hciA5MwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdGFiZW50IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RydWN0IHNwYXJzZV90YWJlbnQgewotICBpbnQgb3Bjb2RlOwotICBjaGFyICpuYW1lOwotICBzaG9ydCBudW1vcHM7Ci19OwotCi1zdGF0aWMgaW50Ci1waW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IGluc3RyX2xlbjsKLQotCWluc3RyX2xlbiA9IDQ7Ci0JcHV0X2Ficyggd29yZDEsIHdvcmQyICk7Ci0KLQkvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLwotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4MDoKLQljYXNlIDB4MToKLQkJY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHgyOgotCWNhc2UgMHgzOgotCQljb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDU6Ci0JY2FzZSAweDY6Ci0JY2FzZSAweDc6Ci0JCXJlZyggd29yZDEgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCWluc3RyX2xlbiA9IG1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCAwICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGludmFsaWQgaW5zdHJ1Y3Rpb24sIHByaW50IGFzIGRhdGEgd29yZCAqLyAKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBpbnN0cl9sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ1RSTCBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGN0cmxfdGFiW10gPSB7Ci0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAwICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAxICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAyICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAzICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA0ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA1ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA2ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA3ICovCi0JICB7ICJiIiwJCTEsIH0sCS8qIDB4MDggKi8KLQkgIHsgImNhbGwiLAkJMSwgfSwJLyogMHgwOSAqLwotCSAgeyAicmV0IiwJCTAsIH0sCS8qIDB4MGEgKi8KLQkgIHsgImJhbCIsCQkxLCB9LAkvKiAweDBiICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBjICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBkICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBlICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBmICovCi0JICB7ICJibm8iLAkJMSwgfSwJLyogMHgxMCAqLwotCSAgeyAiYmciLAkJMSwgfSwJLyogMHgxMSAqLwotCSAgeyAiYmUiLAkJMSwgfSwJLyogMHgxMiAqLwotCSAgeyAiYmdlIiwJCTEsIH0sCS8qIDB4MTMgKi8KLQkgIHsgImJsIiwJCTEsIH0sCS8qIDB4MTQgKi8KLQkgIHsgImJuZSIsCQkxLCB9LAkvKiAweDE1ICovCi0JICB7ICJibGUiLAkJMSwgfSwJLyogMHgxNiAqLwotCSAgeyAiYm8iLAkJMSwgfSwJLyogMHgxNyAqLwotCSAgeyAiZmF1bHRubyIsCQkwLCB9LAkvKiAweDE4ICovCi0JICB7ICJmYXVsdGciLAkJMCwgfSwJLyogMHgxOSAqLwotCSAgeyAiZmF1bHRlIiwJCTAsIH0sCS8qIDB4MWEgKi8KLQkgIHsgImZhdWx0Z2UiLAkJMCwgfSwJLyogMHgxYiAqLwotCSAgeyAiZmF1bHRsIiwJCTAsIH0sCS8qIDB4MWMgKi8KLQkgIHsgImZhdWx0bmUiLAkJMCwgfSwJLyogMHgxZCAqLwotCSAgeyAiZmF1bHRsZSIsCQkwLCB9LAkvKiAweDFlICovCi0JICB7ICJmYXVsdG8iLAkJMCwgfSwJLyogMHgxZiAqLwotCX07Ci0KLQlpID0gKHdvcmQxID4+IDI0KSAmIDB4ZmY7Ci0JaWYgKCAoY3RybF90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAoKHdvcmQxICYgMSkgIT0gMCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY3RybF90YWJbaV0ubmFtZSApOwotCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOwotCX0KLQotCWlmICggY3RybF90YWJbaV0ubnVtb3BzID09IDEgKXsKLQkJLyogRVhUUkFDVCBESVNQTEFDRU1FTlQgQU5EIENPTlZFUlQgVE8gQUREUkVTUyAqLwotCQl3b3JkMSAmPSAweDAwZmZmZmZmOwotCQlpZiAoIHdvcmQxICYgMHgwMDgwMDAwMCApewkJLyogU2lnbiBiaXQgaXMgc2V0ICovCi0JCQl3b3JkMSB8PSAoLTEgJiB+MHhmZmZmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0JCXByaW50X2FkZHIoIHdvcmQxICsgbWVtYWRkciApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDT0JSIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IHNyYzE7Ci0JaW50IHNyYzI7Ci0JaW50IGk7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjb2JyX3RhYltdID0gewotCSAgeyAidGVzdG5vIiwJMSwgfSwJLyogMHgyMCAqLwotCSAgeyAidGVzdGciLAkxLCB9LAkvKiAweDIxICovCi0JICB7ICJ0ZXN0ZSIsCTEsIH0sCS8qIDB4MjIgKi8KLQkgIHsgInRlc3RnZSIsCTEsIH0sCS8qIDB4MjMgKi8KLQkgIHsgInRlc3RsIiwJMSwgfSwJLyogMHgyNCAqLwotCSAgeyAidGVzdG5lIiwJMSwgfSwJLyogMHgyNSAqLwotCSAgeyAidGVzdGxlIiwJMSwgfSwJLyogMHgyNiAqLwotCSAgeyAidGVzdG8iLAkxLCB9LAkvKiAweDI3ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjggKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJhICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmIgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJkICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmUgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZiAqLwotCSAgeyAiYmJjIiwJMywgfSwJLyogMHgzMCAqLwotCSAgeyAiY21wb2JnIiwJMywgfSwJLyogMHgzMSAqLwotCSAgeyAiY21wb2JlIiwJMywgfSwJLyogMHgzMiAqLwotCSAgeyAiY21wb2JnZSIsCTMsIH0sCS8qIDB4MzMgKi8KLQkgIHsgImNtcG9ibCIsCTMsIH0sCS8qIDB4MzQgKi8KLQkgIHsgImNtcG9ibmUiLAkzLCB9LAkvKiAweDM1ICovCi0JICB7ICJjbXBvYmxlIiwJMywgfSwJLyogMHgzNiAqLwotCSAgeyAiYmJzIiwJMywgfSwJLyogMHgzNyAqLwotCSAgeyAiY21waWJubyIsCTMsIH0sCS8qIDB4MzggKi8KLQkgIHsgImNtcGliZyIsCTMsIH0sCS8qIDB4MzkgKi8KLQkgIHsgImNtcGliZSIsCTMsIH0sCS8qIDB4M2EgKi8KLQkgIHsgImNtcGliZ2UiLAkzLCB9LAkvKiAweDNiICovCi0JICB7ICJjbXBpYmwiLAkzLCB9LAkvKiAweDNjICovCi0JICB7ICJjbXBpYm5lIiwJMywgfSwJLyogMHgzZCAqLwotCSAgeyAiY21waWJsZSIsCTMsIH0sCS8qIDB4M2UgKi8KLQkgIHsgImNtcGlibyIsCTMsIH0sCS8qIDB4M2YgKi8KLQl9OwotCi0JaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSAweDIwOwotCWlmICggY29icl90YWJbaV0ubmFtZSA9PSBOVUxMICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGNvYnJfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQotCXNyYzEgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0KLQlpZiAoIHdvcmQxICYgMHgwMjAwMCApewkJLyogTTEgaXMgMSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgc3JjMSApOwotCX0gZWxzZSB7CQkJLyogTTEgaXMgMCAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3NyYzFdICk7Ci0JfQotCi0JaWYgKCBjb2JyX3RhYltpXS5udW1vcHMgPiAxICl7Ci0JCWlmICggd29yZDEgJiAxICl7CQkvKiBTMiBpcyAxICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIixzZiVkLCIsIHNyYzIgKTsKLQkJfSBlbHNlIHsJCQkvKiBTMSBpcyAwICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcywiLCByZWdfbmFtZXNbc3JjMl0gKTsKLQkJfQotCi0JCS8qIEV4dHJhY3QgZGlzcGxhY2VtZW50IGFuZCBjb252ZXJ0IHRvIGFkZHJlc3MKLQkJICovCi0JCXdvcmQxICY9IDB4MDAwMDFmZmM7Ci0JCWlmICggd29yZDEgJiAweDAwMDAxMDAwICl7CS8qIE5lZ2F0aXZlIGRpc3BsYWNlbWVudCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4MWZmZik7CS8qIFNpZ24gZXh0ZW5kICovCi0JCX0KLQkJcHJpbnRfYWRkciggbWVtYWRkciArIHdvcmQxICk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1FTSBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAkJCQkvKiByZXR1cm5zIGluc3RydWN0aW9uIGxlbmd0aDogNCBvciA4ICovCi1tZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgbm9wcmludCApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotICAgIGludCBub3ByaW50OwkJLyogSWYgVFJVRSwgcmV0dXJuIGluc3RydWN0aW9uIGxlbmd0aCwgYnV0Ci0JCQkJICogZG9uJ3Qgb3V0cHV0IGFueSB0ZXh0LgotCQkJCSAqLwotewotCWludCBpLCBqOwotCWludCBsZW47Ci0JaW50IG1vZGU7Ci0JaW50IG9mZnNldDsKLQljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAotCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCi0JICovCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWI7Ci0vKiBPcGNvZGVzIG9mIDB4OFgsIDlYLCBhWCwgYlgsIGFuZCBjWCBtdXN0IGJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIE1FTV9NSU4JMHg4MAotI2RlZmluZSBNRU1fTUFYCTB4Y2YKLSNkZWZpbmUgTUVNX1NJWgkoICogc2l6ZW9mKHN0cnVjdCB0YWJlbnQpKQotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IG1lbV9pbml0W10gPSB7Ci0JICB7IDB4ODAsCSJsZG9iIiwJIDIgfSwKLQkgIHsgMHg4MiwJInN0b2IiLAktMiB9LAotCSAgeyAweDg0LAkiYngiLAkgMSB9LAotCSAgeyAweDg1LAkiYmFseCIsCSAyIH0sCi0JICB7IDB4ODYsCSJjYWxseCIsIDEgfSwKLQkgIHsgMHg4OCwJImxkb3MiLAkgMiB9LAotCSAgeyAweDhhLAkic3RvcyIsCS0yIH0sCi0JICB7IDB4OGMsCSJsZGEiLAkgMiB9LAotCSAgeyAweDkwLAkibGQiLAkgMiB9LAotCSAgeyAweDkyLAkic3QiLAktMiB9LAotCSAgeyAweDk4LAkibGRsIiwJIDIgfSwKLQkgIHsgMHg5YSwJInN0bCIsCS0yIH0sCi0JICB7IDB4YTAsCSJsZHQiLAkgMiB9LAotCSAgeyAweGEyLAkic3R0IiwJLTIgfSwKLQkgIHsgMHhhYywJImRjaW52YSIsIDEgfSwKLQkgIHsgMHhiMCwJImxkcSIsCSAyIH0sCi0JICB7IDB4YjIsCSJzdHEiLAktMiB9LAotCSAgeyAweGMwLAkibGRpYiIsCSAyIH0sCi0JICB7IDB4YzIsCSJzdGliIiwJLTIgfSwKLQkgIHsgMHhjOCwJImxkaXMiLAkgMiB9LAotCSAgeyAweGNhLAkic3RpcyIsCS0yIH0sCi0JICB7IDAsCQlOVUxMLAkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IG1lbV90YWJfYnVmW01FTV9NQVggLSBNRU1fTUlOICsgMV07Ci0KLQlpZiAoIG1lbV90YWIgPT0gTlVMTCApewotCQltZW1fdGFiID0gbWVtX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyBtZW1faW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gbWVtX2luaXRbaV0ub3Bjb2RlIC0gTUVNX01JTjsKLQkJCW1lbV90YWJbal0ubmFtZSA9IG1lbV9pbml0W2ldLm5hbWU7Ci0JCQltZW1fdGFiW2pdLm51bW9wcyA9IG1lbV9pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gTUVNX01JTjsKLQltb2RlID0gKHdvcmQxID4+IDEwKSAmIDB4ZjsKLQotCWlmICggKG1lbV90YWJbaV0ubmFtZSAhPSBOVUxMKQkJLyogVmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLQkmJiAgICgobW9kZSA9PSA1KSB8fCAobW9kZSA+PTEyKSkgKXsJLyogV2l0aCAzMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JCWxlbiA9IDg7Ci0JfSBlbHNlIHsKLQkJbGVuID0gNDsKLQl9Ci0KLQlpZiAoIG5vcHJpbnQgKXsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKG1vZGUgPT0gNikgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzXHQiLCBtZW1fdGFiW2ldLm5hbWUgKTsKLQotCXJlZzEgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxOSkgJiAweDFmIF07CS8qIE1FTUIgb25seSAqLwotCXJlZzIgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxNCkgJiAweDFmIF07Ci0JcmVnMyA9IHJlZ19uYW1lc1sgd29yZDEgJiAweDFmIF07CQkvKiBNRU1CIG9ubHkgKi8KLQlvZmZzZXQgPSB3b3JkMSAmIDB4ZmZmOwkJCQkvKiBNRU1BIG9ubHkgICovCi0KLQlzd2l0Y2ggKCBtZW1fdGFiW2ldLm51bW9wcyApewotCi0JY2FzZSAyOiAvKiBMT0FEIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIC0yOiAvKiBTVE9SRSBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsIiwgcmVnMSApOwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywweCV4IiwgcmVnMSwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTogLyogQlgvQ0FMTFggSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUkVHIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmVnKCB3b3JkMSApCi0gICAgdW5zaWduZWQgbG9uZyB3b3JkMTsKLXsKLQlpbnQgaSwgajsKLQlpbnQgb3Bjb2RlOwotCWludCBmcDsKLQlpbnQgbTEsIG0yLCBtMzsKLQlpbnQgczEsIHMyOwotCWludCBzcmMsIHNyYzIsIGRzdDsKLQljaGFyICptbmVtcDsKLQotCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKLQkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKLQkgICBhdCBydW50aW1lLiAgKi8KLQotCS8qCi0JICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6Ci0JICoJIDE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KLQkgKgktMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KLQkgKgkgMzogMyBvcGVyYW5kcwotCSAqCi0JICoJSWYgYW4gb3Bjb2RlIG1uZW1vbmljIGJlZ2lucyB3aXRoICJGIiwgaXQgaXMgYSBmbG9hdGluZy1wb2ludAotCSAqCW9wY29kZSAodGhlICJGIiBpcyBub3QgcHJpbnRlZCkuCi0JICovCi0KLQlzdGF0aWMgc3RydWN0IHRhYmVudCAqcmVnX3RhYjsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgcmVnX2luaXRbXSA9IHsKLSNkZWZpbmUgUkVHX01JTgkweDU4MAotCSAgeyAweDU4MCwJIm5vdGJpdCIsCTMgfSwKLQkgIHsgMHg1ODEsCSJhbmQiLAkJMyB9LAotCSAgeyAweDU4MiwJImFuZG5vdCIsCTMgfSwKLQkgIHsgMHg1ODMsCSJzZXRiaXQiLAkzIH0sCi0JICB7IDB4NTg0LAkibm90YW5kIiwJMyB9LAotCSAgeyAweDU4NiwJInhvciIsCQkzIH0sCi0JICB7IDB4NTg3LAkib3IiLAkJMyB9LAotCSAgeyAweDU4OCwJIm5vciIsCQkzIH0sCi0JICB7IDB4NTg5LAkieG5vciIsCQkzIH0sCi0JICB7IDB4NThhLAkibm90IiwJCS0yIH0sCi0JICB7IDB4NThiLAkib3Jub3QiLAkzIH0sCi0JICB7IDB4NThjLAkiY2xyYml0IiwJMyB9LAotCSAgeyAweDU4ZCwJIm5vdG9yIiwJMyB9LAotCSAgeyAweDU4ZSwJIm5hbmQiLAkJMyB9LAotCSAgeyAweDU4ZiwJImFsdGVyYml0IiwJMyB9LAotCSAgeyAweDU5MCwgCSJhZGRvIiwJCTMgfSwKLQkgIHsgMHg1OTEsIAkiYWRkaSIsCQkzIH0sCi0JICB7IDB4NTkyLCAJInN1Ym8iLAkJMyB9LAotCSAgeyAweDU5MywgCSJzdWJpIiwJCTMgfSwKLQkgIHsgMHg1OTQsCSJjbXBvYiIsCTIgfSwKLQkgIHsgMHg1OTUsCSJjbXBpYiIsCTIgfSwKLQkgIHsgMHg1OTYsCSJjbXBvcyIsCTIgfSwKLQkgIHsgMHg1OTcsCSJjbXBpcyIsCTIgfSwKLQkgIHsgMHg1OTgsIAkic2hybyIsCQkzIH0sCi0JICB7IDB4NTlhLCAJInNocmRpIiwJMyB9LAotCSAgeyAweDU5YiwgCSJzaHJpIiwJCTMgfSwKLQkgIHsgMHg1OWMsIAkic2hsbyIsCQkzIH0sCi0JICB7IDB4NTlkLCAJInJvdGF0ZSIsCTMgfSwKLQkgIHsgMHg1OWUsIAkic2hsaSIsCQkzIH0sCi0JICB7IDB4NWEwLCAJImNtcG8iLAkJMiB9LAotCSAgeyAweDVhMSwgCSJjbXBpIiwJCTIgfSwKLQkgIHsgMHg1YTIsIAkiY29uY21wbyIsCTIgfSwKLQkgIHsgMHg1YTMsIAkiY29uY21waSIsCTIgfSwKLQkgIHsgMHg1YTQsIAkiY21waW5jbyIsCTMgfSwKLQkgIHsgMHg1YTUsIAkiY21waW5jaSIsCTMgfSwKLQkgIHsgMHg1YTYsIAkiY21wZGVjbyIsCTMgfSwKLQkgIHsgMHg1YTcsIAkiY21wZGVjaSIsCTMgfSwKLQkgIHsgMHg1YWMsIAkic2NhbmJ5dGUiLAkyIH0sCi0JICB7IDB4NWFkLAkiYnN3YXAiLAktMiB9LAotCSAgeyAweDVhZSwgCSJjaGtiaXQiLAkyIH0sCi0JICB7IDB4NWIwLCAJImFkZGMiLAkJMyB9LAotCSAgeyAweDViMiwgCSJzdWJjIiwJCTMgfSwKLQkgIHsgMHg1YjQsCSJpbnRkaXMiLAkwIH0sCi0JICB7IDB4NWI1LAkiaW50ZW4iLAkwIH0sCi0JICB7IDB4NWNjLAkibW92IiwJCS0yIH0sCi0JICB7IDB4NWQ4LAkiZXNocm8iLAkzIH0sCi0JICB7IDB4NWRjLAkibW92bCIsCQktMiB9LAotCSAgeyAweDVlYywJIm1vdnQiLAkJLTIgfSwKLQkgIHsgMHg1ZmMsCSJtb3ZxIiwJCS0yIH0sCi0JICB7IDB4NjAwLAkic3lubW92IiwJMiB9LAotCSAgeyAweDYwMSwJInN5bm1vdmwiLAkyIH0sCi0JICB7IDB4NjAyLAkic3lubW92cSIsCTIgfSwKLQkgIHsgMHg2MDMsCSJjbXBzdHIiLAkzIH0sCi0JICB7IDB4NjA0LAkibW92cXN0ciIsCTMgfSwKLQkgIHsgMHg2MDUsCSJtb3ZzdHIiLAkzIH0sCi0JICB7IDB4NjEwLAkiYXRtb2QiLAkzIH0sCi0JICB7IDB4NjEyLAkiYXRhZGQiLAkzIH0sCi0JICB7IDB4NjEzLAkiaW5zcGFjYyIsCS0yIH0sCi0JICB7IDB4NjE0LAkibGRwaHkiLAktMiB9LAotCSAgeyAweDYxNSwJInN5bmxkIiwJLTIgfSwKLQkgIHsgMHg2MTcsCSJmaWxsIiwJCTMgfSwKLQkgIHsgMHg2MzAsCSJzZG1hIiwJCTMgfSwKLQkgIHsgMHg2MzEsCSJ1ZG1hIiwJCTAgfSwKLQkgIHsgMHg2NDAsCSJzcGFuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDEsCSJzY2FuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDIsCSJkYWRkYyIsCTMgfSwKLQkgIHsgMHg2NDMsCSJkc3ViYyIsCTMgfSwKLQkgIHsgMHg2NDQsCSJkbW92dCIsCS0yIH0sCi0JICB7IDB4NjQ1LAkibW9kYWMiLAkzIH0sCi0JICB7IDB4NjQ2LAkiY29uZHJlYyIsCS0yIH0sCi0JICB7IDB4NjUwLAkibW9kaWZ5IiwJMyB9LAotCSAgeyAweDY1MSwJImV4dHJhY3QiLAkzIH0sCi0JICB7IDB4NjU0LAkibW9kdGMiLAkzIH0sCi0JICB7IDB4NjU1LAkibW9kcGMiLAkzIH0sCi0JICB7IDB4NjU2LAkicmVjZWl2ZSIsCS0yIH0sCi0JICB7IDB4NjU4LAkiaW50Y3RsIiwJLTIgfSwKLQkgIHsgMHg2NTksCSJzeXNjdGwiLAkzIH0sCi0JICB7IDB4NjViLAkiaWNjdGwiLAkzIH0sCi0JICB7IDB4NjVjLAkiZGNjdGwiLAkzIH0sCi0JICB7IDB4NjVkLAkiaGFsdCIsCQkwIH0sCi0JICB7IDB4NjYwLAkiY2FsbHMiLAkxIH0sCi0JICB7IDB4NjYyLAkic2VuZCIsCQkzIH0sCi0JICB7IDB4NjYzLAkic2VuZHNlcnYiLAkxIH0sCi0JICB7IDB4NjY0LAkicmVzdW1wcmNzIiwJMSB9LAotCSAgeyAweDY2NSwJInNjaGVkcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjYsCSJzYXZlcHJjcyIsCTAgfSwKLQkgIHsgMHg2NjgsCSJjb25kd2FpdCIsCTEgfSwKLQkgIHsgMHg2NjksCSJ3YWl0IiwJCTEgfSwKLQkgIHsgMHg2NmEsCSJzaWduYWwiLAkxIH0sCi0JICB7IDB4NjZiLAkibWFyayIsCQkwIH0sCi0JICB7IDB4NjZjLAkiZm1hcmsiLAkwIH0sCi0JICB7IDB4NjZkLAkiZmx1c2hyZWciLAkwIH0sCi0JICB7IDB4NjZmLAkic3luY2YiLAkwIH0sCi0JICB7IDB4NjcwLAkiZW11bCIsCQkzIH0sCi0JICB7IDB4NjcxLAkiZWRpdiIsCQkzIH0sCi0JICB7IDB4NjczLCAJImxkdGltZSIsCS0xIH0sCi0JICB7IDB4Njc0LAkiRmN2dGlyIiwJLTIgfSwKLQkgIHsgMHg2NzUsCSJGY3Z0aWxyIiwJLTIgfSwKLQkgIHsgMHg2NzYsCSJGc2NhbGVybCIsCTMgfSwKLQkgIHsgMHg2NzcsCSJGc2NhbGVyIiwJMyB9LAotCSAgeyAweDY4MCwJIkZhdGFuciIsCTMgfSwKLQkgIHsgMHg2ODEsCSJGbG9nZXByIiwJMyB9LAotCSAgeyAweDY4MiwJIkZsb2dyIiwJMyB9LAotCSAgeyAweDY4MywJIkZyZW1yIiwJMyB9LAotCSAgeyAweDY4NCwJIkZjbXBvciIsCTIgfSwKLQkgIHsgMHg2ODUsCSJGY21wciIsCTIgfSwKLQkgIHsgMHg2ODgsCSJGc3FydHIiLAktMiB9LAotCSAgeyAweDY4OSwJIkZleHByIiwJLTIgfSwKLQkgIHsgMHg2OGEsCSJGbG9nYm5yIiwJLTIgfSwKLQkgIHsgMHg2OGIsCSJGcm91bmRyIiwJLTIgfSwKLQkgIHsgMHg2OGMsCSJGc2luciIsCS0yIH0sCi0JICB7IDB4NjhkLAkiRmNvc3IiLAktMiB9LAotCSAgeyAweDY4ZSwJIkZ0YW5yIiwJLTIgfSwKLQkgIHsgMHg2OGYsCSJGY2xhc3NyIiwJMSB9LAotCSAgeyAweDY5MCwJIkZhdGFucmwiLAkzIH0sCi0JICB7IDB4NjkxLAkiRmxvZ2VwcmwiLAkzIH0sCi0JICB7IDB4NjkyLAkiRmxvZ3JsIiwJMyB9LAotCSAgeyAweDY5MywJIkZyZW1ybCIsCTMgfSwKLQkgIHsgMHg2OTQsCSJGY21wb3JsIiwJMiB9LAotCSAgeyAweDY5NSwJIkZjbXBybCIsCTIgfSwKLQkgIHsgMHg2OTgsCSJGc3FydHJsIiwJLTIgfSwKLQkgIHsgMHg2OTksCSJGZXhwcmwiLAktMiB9LAotCSAgeyAweDY5YSwJIkZsb2dibnJsIiwJLTIgfSwKLQkgIHsgMHg2OWIsCSJGcm91bmRybCIsCS0yIH0sCi0JICB7IDB4NjljLAkiRnNpbnJsIiwJLTIgfSwKLQkgIHsgMHg2OWQsCSJGY29zcmwiLAktMiB9LAotCSAgeyAweDY5ZSwJIkZ0YW5ybCIsCS0yIH0sCi0JICB7IDB4NjlmLAkiRmNsYXNzcmwiLAkxIH0sCi0JICB7IDB4NmMwLAkiRmN2dHJpIiwJLTIgfSwKLQkgIHsgMHg2YzEsCSJGY3Z0cmlsIiwJLTIgfSwKLQkgIHsgMHg2YzIsCSJGY3Z0enJpIiwJLTIgfSwKLQkgIHsgMHg2YzMsCSJGY3Z0enJpbCIsCS0yIH0sCi0JICB7IDB4NmM5LAkiRm1vdnIiLAktMiB9LAotCSAgeyAweDZkOSwJIkZtb3ZybCIsCS0yIH0sCi0JICB7IDB4NmUxLCAJIkZtb3ZyZSIsCS0yIH0sCi0JICB7IDB4NmUyLCAJIkZjcHlzcmUiLAkzIH0sCi0JICB7IDB4NmUzLCAJIkZjcHlyc3JlIiwJMyB9LAotCSAgeyAweDcwMSwJIm11bG8iLAkJMyB9LAotCSAgeyAweDcwOCwJInJlbW8iLAkJMyB9LAotCSAgeyAweDcwYiwJImRpdm8iLAkJMyB9LAotCSAgeyAweDc0MSwJIm11bGkiLAkJMyB9LAotCSAgeyAweDc0OCwJInJlbWkiLAkJMyB9LAotCSAgeyAweDc0OSwJIm1vZGkiLAkJMyB9LAotCSAgeyAweDc0YiwJImRpdmkiLAkJMyB9LAotCSAgeyAweDc4MCwJImFkZG9ubyIsCTMgfSwKLQkgIHsgMHg3ODEsCSJhZGRpbm8iLAkzIH0sCi0JICB7IDB4NzgyLAkic3Vib25vIiwJMyB9LAotCSAgeyAweDc4MywJInN1YmlubyIsCTMgfSwKLQkgIHsgMHg3ODQsCSJzZWxubyIsCTMgfSwKLQkgIHsgMHg3OGIsCSJGZGl2ciIsCTMgfSwKLQkgIHsgMHg3OGMsCSJGbXVsciIsCTMgfSwKLQkgIHsgMHg3OGQsCSJGc3ViciIsCTMgfSwKLQkgIHsgMHg3OGYsCSJGYWRkciIsCTMgfSwKLQkgIHsgMHg3OTAsCSJhZGRvZyIsCTMgfSwKLQkgIHsgMHg3OTEsCSJhZGRpZyIsICAgICAgICAzIH0sCi0JICB7IDB4NzkyLAkic3Vib2ciLAkzIH0sCi0JICB7IDB4NzkzLAkic3ViaWciLAkzIH0sCi0JICB7IDB4Nzk0LAkic2VsZyIsCQkzIH0sCi0JICB7IDB4NzliLAkiRmRpdnJsIiwJMyB9LAotCSAgeyAweDc5YywJIkZtdWxybCIsCTMgfSwKLQkgIHsgMHg3OWQsCSJGc3VicmwiLAkzIH0sCi0JICB7IDB4NzlmLAkiRmFkZHJsIiwJMyB9LAotCSAgeyAweDdhMCwJImFkZG9lIiwJMyB9LAotCSAgeyAweDdhMSwJImFkZGllIiwgICAgICAgIDMgfSwKLQkgIHsgMHg3YTIsCSJzdWJvZSIsCTMgfSwKLQkgIHsgMHg3YTMsCSJzdWJpZSIsCTMgfSwKLQkgIHsgMHg3YTQsCSJzZWxlIiwJCTMgfSwKLQkgIHsgMHg3YjAsCSJhZGRvZ2UiLAkzIH0sCi0JICB7IDB4N2IxLAkiYWRkaWdlIiwJMyB9LAotCSAgeyAweDdiMiwJInN1Ym9nZSIsCTMgfSwKLQkgIHsgMHg3YjMsCSJzdWJpZ2UiLAkzIH0sCi0JICB7IDB4N2I0LAkic2VsZ2UiLAkzIH0sCi0JICB7IDB4N2MwLAkiYWRkb2wiLAkzIH0sCi0JICB7IDB4N2MxLAkiYWRkaWwiLAkzIH0sCi0JICB7IDB4N2MyLAkic3Vib2wiLAkzIH0sCi0JICB7IDB4N2MzLAkic3ViaWwiLAkzIH0sCi0JICB7IDB4N2M0LAkic2VsbCIsCQkzIH0sCi0JICB7IDB4N2QwLAkiYWRkb25lIiwJMyB9LAotCSAgeyAweDdkMSwJImFkZGluZSIsCTMgfSwKLQkgIHsgMHg3ZDIsCSJzdWJvbmUiLAkzIH0sCi0JICB7IDB4N2QzLAkic3ViaW5lIiwJMyB9LAotCSAgeyAweDdkNCwJInNlbG5lIiwJMyB9LAotCSAgeyAweDdlMCwJImFkZG9sZSIsCTMgfSwKLQkgIHsgMHg3ZTEsCSJhZGRpbGUiLAkzIH0sCi0JICB7IDB4N2UyLAkic3Vib2xlIiwJMyB9LAotCSAgeyAweDdlMywJInN1YmlsZSIsCTMgfSwKLQkgIHsgMHg3ZTQsCSJzZWxsZSIsCTMgfSwKLQkgIHsgMHg3ZjAsCSJhZGRvbyIsCTMgfSwKLQkgIHsgMHg3ZjEsCSJhZGRpbyIsCTMgfSwKLQkgIHsgMHg3ZjIsCSJzdWJvbyIsCTMgfSwKLQkgIHsgMHg3ZjMsCSJzdWJpbyIsCTMgfSwKLQkgIHsgMHg3ZjQsCSJzZWxvIiwJCTMgfSwKLSNkZWZpbmUgUkVHX01BWCAweDdmNAotCSAgeyAwLAkJTlVMTCwJCTAgfQotCX07Ci0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgcmVnX3RhYl9idWZbUkVHX01BWCAtIFJFR19NSU4gKyAxXTsKLQotCWlmICggcmVnX3RhYiA9PSBOVUxMICl7Ci0JCXJlZ190YWIgPSByZWdfdGFiX2J1ZjsKLQkJZm9yICggaSA9IDA7IHJlZ19pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKLQkJCWogPSByZWdfaW5pdFtpXS5vcGNvZGUgLSBSRUdfTUlOOwotCQkJcmVnX3RhYltqXS5uYW1lID0gcmVnX2luaXRbaV0ubmFtZTsKLQkJCXJlZ190YWJbal0ubnVtb3BzID0gcmVnX2luaXRbaV0ubnVtb3BzOwotCQl9Ci0JfQotCi0Jb3Bjb2RlID0gKCh3b3JkMSA+PiAyMCkgJiAweGZmMCkgfCAoKHdvcmQxID4+IDcpICYgMHhmKTsKLQlpID0gb3Bjb2RlIC0gUkVHX01JTjsKLQotCWlmICggKG9wY29kZTxSRUdfTUlOKSB8fCAob3Bjb2RlPlJFR19NQVgpIHx8IChyZWdfdGFiW2ldLm5hbWU9PU5VTEwpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQltbmVtcCA9IHJlZ190YWJbaV0ubmFtZTsKLQlpZiAoICptbmVtcCA9PSAnRicgKXsKLQkJZnAgPSAxOwotCQltbmVtcCsrOwotCX0gZWxzZSB7Ci0JCWZwID0gMDsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgbW5lbXAgKTsKLQotCXMxICAgPSAod29yZDEgPj4gNSkgICYgMTsKLQlzMiAgID0gKHdvcmQxID4+IDYpICAmIDE7Ci0JbTEgICA9ICh3b3JkMSA+PiAxMSkgJiAxOwotCW0yICAgPSAod29yZDEgPj4gMTIpICYgMTsKLQltMyAgID0gKHdvcmQxID4+IDEzKSAmIDE7Ci0Jc3JjICA9ICB3b3JkMSAgICAgICAgJiAweDFmOwotCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKLQlkc3QgID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0KLQlpZiAgKCByZWdfdGFiW2ldLm51bW9wcyAhPSAwICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQkJc3dpdGNoICggcmVnX3RhYltpXS5udW1vcHMgKXsKLQkJY2FzZSAxOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogUHJpbnQgb3V0IGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBtZW1iIGluc3RydWN0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGludCBtb2RlOwotICAgICBjaGFyICpyZWcyLCAqcmVnMzsKLSAgICAgaW50IHdvcmQxOwotICAgICB1bnNpZ25lZCBpbnQgd29yZDI7Ci17Ci0JaW50IHNjYWxlOwotCXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfdGFiW10gPSB7IDEsIDIsIDQsIDgsIDE2IH07Ci0KLQlzY2FsZSA9ICh3b3JkMSA+PiA3KSAmIDB4MDc7Ci0JaWYgKCAoc2NhbGUgPiA0KSB8fCAoKCh3b3JkMSA+PiA1KSAmIDB4MDMpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0Jc2NhbGUgPSBzY2FsZV90YWJbc2NhbGVdOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSA0OgkgCQkJCQkvKiAocmVnKSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCQkJCQkvKiBkaXNwbCs4KGlwKSAqLwotCQlwcmludF9hZGRyKCB3b3JkMis4K21lbWFkZHIgKTsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJCQkJCS8qIChyZWcpW2luZGV4KnNjYWxlXSAqLwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxMjoJCQkJCS8qIGRpc3BsYWNlbWVudCAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDEzOgkJCQkJLyogZGlzcGwocmVnKSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgMTQ6CQkJCQkvKiBkaXNwbFtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzXSIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzKiVkXSIsIHJlZzMsIHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxNToJCQkJLyogZGlzcGwocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUgKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBPcGVyYW5kICAJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZ29wKCBtb2RlLCBzcGVjLCByZWcsIGZwICkKLSAgICBpbnQgbW9kZSwgc3BlYywgcmVnLCBmcDsKLXsKLQlpZiAoIGZwICl7CQkJCS8qIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSA9PSAxICl7CQkJLyogRlAgb3BlcmFuZCAqLwotCQkJc3dpdGNoICggcmVnICl7Ci0JCQljYXNlIDA6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMSIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMiIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDM6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE2OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMC4wIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjI6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYxLjAiICk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICI/IiApOwotCQkJICBicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsJCQkJLyogTm9uLUZQIHJlZ2lzdGVyICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKLQkJfQotCX0gZWxzZSB7CQkJCS8qIE5PVCBGTE9BVElORyBQT0lOVCAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIExpdGVyYWwgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCByZWcgKTsKLQkJfSBlbHNlIHsJCQkJLyogUmVnaXN0ZXIgKi8KLQkJCWlmICggc3BlYyA9PSAwICl7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCQl9IGVsc2UgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAic2YlZCIsIHJlZyApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gRGVzdGluYXRpb24gT3BlcmFuZAkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1kc3RvcCggbW9kZSwgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHJlZywgZnA7Ci17Ci0JLyogJ2RzdCcgb3BlcmFuZCBjYW4ndCBiZSBhIGxpdGVyYWwuIE9uIG5vbi1GUCBpbnN0cnVjdGlvbnMsICByZWdpc3RlcgotCSAqIG1vZGUgaXMgYXNzdW1lZCBhbmQgIm0zIiBhY3RzIGFzIGlmIHdlcmUgInMzIjsgIG9uIEZQLWluc3RydWN0aW9ucywKLQkgKiBzZiByZWdpc3RlcnMgYXJlIG5vdCBhbGxvd2VkIHNvIG0zIGFjdHMgbm9ybWFsbHkuCi0JICovCi0JIGlmICggZnAgKXsKLQkJcmVnb3AoIG1vZGUsIDAsIHJlZywgZnAgKTsKLQkgfSBlbHNlIHsKLQkJcmVnb3AoIDAsIG1vZGUsIHJlZywgZnAgKTsKLQkgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkKCB3b3JkMSApCi0gICAgaW50IHdvcmQxOwotewotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLndvcmRcdDB4JTA4eCIsICh1bnNpZ25lZCkgd29yZDEgKTsKLX0JCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyKGEpCi1iZmRfdm1hIGE7Ci17Ci0gICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYSwgaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdXRfYWJzKCB3b3JkMSwgd29yZDIgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotI2lmZGVmIElOX0dEQgotCXJldHVybjsKLSNlbHNlCi0JaW50IGxlbjsKLQotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4ODoKLQljYXNlIDB4OToKLQljYXNlIDB4YToKLQljYXNlIDB4YjoKLQljYXNlIDB4YzoKLQkJLyogTUVNIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotCQlsZW4gPSBtZW0oIDAsIHdvcmQxLCB3b3JkMiwgMSApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSA0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIGxlbiA9PSA4ICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAlMDh4XHQiLCB3b3JkMSwgd29yZDIgKTsKLQl9IGVsc2UgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggICAgICAgICBcdCIsIHdvcmQxICk7Ci0JfQotOwotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1hc210YWIuYyBiL29wY29kZXMvaWE2NC1hc210YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhZDFjNC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtYXNtdGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQ5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBpYTY0LWdlbi4gIERvIG5vdCBlZGl0ISAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmlhNjRfc3RyaW5nc1tdID0gewotICAiIiwgIjAiLCAiMSIsICJhIiwgImFjcSIsICJhZGQiLCAiYWRkbCIsICJhZGRwNCIsICJhZGRzIiwgImFsbG9jIiwgImFuZCIsCi0gICJhbmRjbSIsICJiIiwgImJpYXMiLCAiYnIiLCAiYnJlYWsiLCAiYnJsIiwgImJycCIsICJic3ciLCAiYyIsICJjYWxsIiwKLSAgImNleGl0IiwgImNoayIsICJjbG9vcCIsICJjbHIiLCAiY2xycnJiIiwgImNtcCIsICJjbXA0IiwgImNtcHhjaGcxIiwKLSAgImNtcHhjaGcyIiwgImNtcHhjaGc0IiwgImNtcHhjaGc4IiwgImNvbmQiLCAiY292ZXIiLCAiY3RvcCIsICJjengxIiwKLSAgImN6eDIiLCAiZCIsICJkZXAiLCAiZHBudCIsICJkcHRrIiwgImUiLCAiZXBjIiwgImVxIiwgImV4Y2wiLCAiZXhpdCIsCi0gICJleHAiLCAiZXh0ciIsICJmIiwgImZhYnMiLCAiZmFkZCIsICJmYW1heCIsICJmYW1pbiIsICJmYW5kIiwgImZhbmRjbSIsCi0gICJmYXVsdCIsICJmYyIsICJmY2hrZiIsICJmY2xhc3MiLCAiZmNscmYiLCAiZmNtcCIsICJmY3Z0IiwgImZldGNoYWRkNCIsCi0gICJmZXRjaGFkZDgiLCAiZmV3IiwgImZpbGwiLCAiZmx1c2hycyIsICJmbWEiLCAiZm1heCIsICJmbWVyZ2UiLCAiZm1pbiIsCi0gICJmbWl4IiwgImZtcHkiLCAiZm1zIiwgImZuZWciLCAiZm5lZ2FicyIsICJmbm1hIiwgImZubXB5IiwgImZub3JtIiwgImZvciIsCi0gICJmcGFicyIsICJmcGFjayIsICJmcGFtYXgiLCAiZnBhbWluIiwgImZwY21wIiwgImZwY3Z0IiwgImZwbWEiLCAiZnBtYXgiLAotICAiZnBtZXJnZSIsICJmcG1pbiIsICJmcG1weSIsICJmcG1zIiwgImZwbmVnIiwgImZwbmVnYWJzIiwgImZwbm1hIiwKLSAgImZwbm1weSIsICJmcHJjcGEiLCAiZnByc3FydGEiLCAiZnBzdWIiLCAiZnJjcGEiLCAiZnJzcXJ0YSIsICJmc2VsZWN0IiwKLSAgImZzZXRjIiwgImZzdWIiLCAiZnN3YXAiLCAiZnN4dCIsICJmd2IiLCAiZngiLCAiZnhvciIsICJmeHUiLCAiZyIsICJnYSIsCi0gICJnZSIsICJnZXRmIiwgImdldSIsICJndCIsICJndHUiLCAiaCIsICJodSIsICJpIiwgImlhIiwgImltcCIsICJpbnZhbGEiLAotICAiaXRjIiwgIml0ciIsICJsIiwgImxkMSIsICJsZDIiLCAibGQ0IiwgImxkOCIsICJsZGYiLCAibGRmOCIsICJsZGZkIiwKLSAgImxkZmUiLCAibGRmcDgiLCAibGRmcGQiLCAibGRmcHMiLCAibGRmcyIsICJsZSIsICJsZXUiLCAibGZldGNoIiwKLSAgImxvYWRycyIsICJsb29wIiwgImxyIiwgImx0IiwgImx0dSIsICJsdSIsICJtIiwgIm1hbnkiLCAibWYiLCAibWl4MSIsCi0gICJtaXgyIiwgIm1peDQiLCAibW92IiwgIm1vdmwiLCAibXV4MSIsICJtdXgyIiwgIm5jIiwgIm5lIiwgIm5lcSIsICJuZ2UiLAotICAibmd0IiwgIm5sIiwgIm5sZSIsICJubHQiLCAibm0iLCAibm9wIiwgIm5yIiwgIm5zIiwgIm50MSIsICJudDIiLCAibnRhIiwKLSAgIm56IiwgIm9yIiwgIm9yY20iLCAib3JkIiwgInBhY2syIiwgInBhY2s0IiwgInBhZGQxIiwgInBhZGQyIiwgInBhZGQ0IiwKLSAgInBhdmcxIiwgInBhdmcyIiwgInBhdmdzdWIxIiwgInBhdmdzdWIyIiwgInBjbXAxIiwgInBjbXAyIiwgInBjbXA0IiwKLSAgInBtYXgxIiwgInBtYXgyIiwgInBtaW4xIiwgInBtaW4yIiwgInBtcHkyIiwgInBtcHlzaHIyIiwgInBvcGNudCIsICJwciIsCi0gICJwcm9iZSIsICJwc2FkMSIsICJwc2hsMiIsICJwc2hsNCIsICJwc2hsYWRkMiIsICJwc2hyMiIsICJwc2hyNCIsCi0gICJwc2hyYWRkMiIsICJwc3ViMSIsICJwc3ViMiIsICJwc3ViNCIsICJwdGMiLCAicHRyIiwgInIiLCAicmF6IiwgInJlbCIsCi0gICJyZXQiLCAicmZpIiwgInJzbSIsICJydW0iLCAicnciLCAicyIsICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzYSIsICJzZSIsCi0gICJzZXRmIiwgInNobCIsICJzaGxhZGQiLCAic2hsYWRkcDQiLCAic2hyIiwgInNocnAiLCAic2lnIiwgInNwaWxsIiwKLSAgInNwbnQiLCAic3B0ayIsICJzcmx6IiwgInNzbSIsICJzc3MiLCAic3QxIiwgInN0MiIsICJzdDQiLCAic3Q4IiwgInN0ZiIsCi0gICJzdGY4IiwgInN0ZmQiLCAic3RmZSIsICJzdGZzIiwgInN1YiIsICJzdW0iLCAic3h0MSIsICJzeHQyIiwgInN4dDQiLAotICAic3luYyIsICJ0YWsiLCAidGJpdCIsICJ0aGFzaCIsICJ0bmF0IiwgInRwYSIsICJ0cnVuYyIsICJ0dGFnIiwgInUiLAotICAidW5jIiwgInVub3JkIiwgInVucGFjazEiLCAidW5wYWNrMiIsICJ1bnBhY2s0IiwgInVzcyIsICJ1dXMiLCAidXV1IiwgInciLAotICAid2V4aXQiLCAid3RvcCIsICJ4IiwgInhjaGcxIiwgInhjaGcyIiwgInhjaGc0IiwgInhjaGc4IiwgInhmIiwgInhtYSIsCi0gICJ4bXB5IiwgInhvciIsICJ4dWYiLCAieiIsICJ6eHQxIiwgInp4dDIiLCAienh0NCIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlhNjRfZGVwZW5kZW5jeQotZGVwZW5kZW5jaWVzW10gPSB7Ci0gIHsgIkFMQVQiLCAwLCAwLCAwLCAtMSwgfSwKLSAgeyAiQVJbQlNQXSIsIDI1LCAwLCAyLCAxNywgfSwKLSAgeyAiQVJbQlNQU1RPUkVdIiwgMjUsIDAsIDIsIDE4LCB9LAotICB7ICJBUltDQ1ZdIiwgMjUsIDAsIDIsIDMyLCB9LAotICB7ICJBUltFQ10iLCAyNSwgMCwgMiwgNjYsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMC5jb250cm9scyIsIDI5LCAwLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YxLmNvbnRyb2xzIiwgMjksIDAsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjIuY29udHJvbHMiLCAyOSwgMCwgMiwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMy5jb250cm9scyIsIDI5LCAwLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YwLmZsYWdzIiwgMjksIDAsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjEuZmxhZ3MiLCAyOSwgMCwgMiwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMi5mbGFncyIsIDI5LCAwLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YzLmZsYWdzIiwgMjksIDAsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS50cmFwcyIsIDI5LCAwLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0ucnYiLCAyOSwgMCwgMiwgLTEsIH0sCi0gIHsgIkFSW0lUQ10iLCAyNSwgMCwgMiwgNDQsIH0sCi0gIHsgIkFSW0slXSwgJSBpbiAwIC0gNyIsIDEsIDAsIDIsIC0xLCB9LAotICB7ICJBUltMQ10iLCAyNSwgMCwgMiwgNjUsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMCwgMiwgNjQsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMCwgMiwgNjQsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMCwgMCwgNjQsIH0sCi0gIHsgIkFSW1JOQVRdIiwgMjUsIDAsIDIsIDE5LCB9LAotICB7ICJBUltSU0NdIiwgMjUsIDAsIDIsIDE2LCB9LAotICB7ICJBUltVTkFUXXslfSwgJSBpbiAwIC0gNjMiLCAyLCAwLCAyLCAtMSwgfSwKLSAgeyAiQVIlLCAlIGluIDgtMTUsIDIwLCAyMi0yMywgMzEsIDMzLTM1LCAzNy0zOSwgNDEtNDMsIDQ1LTQ3LCA2Ny0xMTEiLCAzLCAwLCAwLCAtMSwgfSwKLSAgeyAiQVIlLCAlIGluIDQ4LTYzLCAxMTItMTI3IiwgNCwgMCwgMiwgLTEsIH0sCi0gIHsgIkJSJSwgJSBpbiAwIC0gNyIsIDUsIDAsIDIsIC0xLCB9LAotICB7ICJCUiUsICUgaW4gMCAtIDciLCA1LCAwLCAwLCAtMSwgfSwKLSAgeyAiQlIlLCAlIGluIDAgLSA3IiwgNSwgMCwgMiwgLTEsIH0sCi0gIHsgIkNGTSIsIDYsIDAsIDIsIC0xLCB9LAotICB7ICJDRk0iLCA2LCAwLCAyLCAtMSwgfSwKLSAgeyAiQ0ZNIiwgNiwgMCwgMiwgLTEsIH0sCi0gIHsgIkNGTSIsIDYsIDAsIDIsIC0xLCB9LAotICB7ICJDRk0iLCA2LCAwLCAwLCAtMSwgfSwKLSAgeyAiQ1BVSUQjIiwgNywgMCwgNSwgLTEsIH0sCi0gIHsgIkNSW0NNQ1ZdIiwgMjYsIDAsIDMsIDc0LCB9LAotICB7ICJDUltEQ1JdIiwgMjYsIDAsIDMsIDAsIH0sCi0gIHsgIkNSW0VPSV0iLCAyNiwgMCwgNiwgNjcsICJTQyBTZWN0aW9uIDEwLjguMy40IiwgfSwKLSAgeyAiQ1JbR1BUQV0iLCAyNiwgMCwgMywgOSwgfSwKLSAgeyAiQ1JbSUZBXSIsIDI2LCAwLCAxLCAyMCwgfSwKLSAgeyAiQ1JbSUZBXSIsIDI2LCAwLCAzLCAyMCwgfSwKLSAgeyAiQ1JbSUZTXSIsIDI2LCAwLCAzLCAyMywgfSwKLSAgeyAiQ1JbSUZTXSIsIDI2LCAwLCAxLCAyMywgfSwKLSAgeyAiQ1JbSUZTXSIsIDI2LCAwLCAxLCAyMywgfSwKLSAgeyAiQ1JbSUhBXSIsIDI2LCAwLCAzLCAyNSwgfSwKLSAgeyAiQ1JbSUlNXSIsIDI2LCAwLCAzLCAyNCwgfSwKLSAgeyAiQ1JbSUlQXSIsIDI2LCAwLCAzLCAxOSwgfSwKLSAgeyAiQ1JbSUlQXSIsIDI2LCAwLCAxLCAxOSwgfSwKLSAgeyAiQ1JbSUlQQV0iLCAyNiwgMCwgMywgMjIsIH0sCi0gIHsgIkNSW0lQU1JdIiwgMjYsIDAsIDMsIDE2LCB9LAotICB7ICJDUltJUFNSXSIsIDI2LCAwLCAxLCAxNiwgfSwKLSAgeyAiQ1JbSVJSJV0sICUgaW4gMCAtIDMiLCA4LCAwLCAzLCAtMSwgfSwKLSAgeyAiQ1JbSVNSXSIsIDI2LCAwLCAzLCAxNywgfSwKLSAgeyAiQ1JbSVRJUl0iLCAyNiwgMCwgMywgMjEsIH0sCi0gIHsgIkNSW0lUSVJdIiwgMjYsIDAsIDEsIDIxLCB9LAotICB7ICJDUltJVE1dIiwgMjYsIDAsIDMsIDEsIH0sCi0gIHsgIkNSW0lUVl0iLCAyNiwgMCwgMywgNzIsIH0sCi0gIHsgIkNSW0lWQV0iLCAyNiwgMCwgNCwgMiwgfSwKLSAgeyAiQ1JbSVZSXSIsIDI2LCAwLCA2LCA2NSwgIlNDIFNlY3Rpb24gMTAuOC4zLjIiLCB9LAotICB7ICJDUltMSURdIiwgMjYsIDAsIDYsIDY0LCAiU0MgU2VjdGlvbiAxMC44LjMuMSIsIH0sCi0gIHsgIkNSW0xSUiVdLCAlIGluIDAgLSAxIiwgOSwgMCwgMywgLTEsIH0sCi0gIHsgIkNSW1BNVl0iLCAyNiwgMCwgMywgNzMsIH0sCi0gIHsgIkNSW1BUQV0iLCAyNiwgMCwgMywgOCwgfSwKLSAgeyAiQ1JbVFBSXSIsIDI2LCAwLCAzLCA2NiwgfSwKLSAgeyAiQ1JbVFBSXSIsIDI2LCAwLCA2LCA2NiwgIlNDIFNlY3Rpb24gMTAuOC4zLjMiLCB9LAotICB7ICJDUiUsICUgaW4gMy03LCAxMC0xNSwgMTgsIDI2LTYzLCA3NS03OSwgODItMTI3IiwgMTAsIDAsIDAsIC0xLCB9LAotICB7ICJEQlIjIiwgMTEsIDAsIDIsIC0xLCB9LAotICB7ICJEQlIjIiwgMTEsIDAsIDMsIC0xLCB9LAotICB7ICJEVEMiLCAwLCAwLCAzLCAtMSwgfSwKLSAgeyAiRFRDIiwgMCwgMCwgMiwgLTEsIH0sCi0gIHsgIkRUQyIsIDAsIDAsIDAsIC0xLCB9LAotICB7ICJEVEMiLCAwLCAwLCAyLCAtMSwgfSwKLSAgeyAiRFRDX0xJTUlUKiIsIDAsIDAsIDIsIC0xLCB9LAotICB7ICJEVFIiLCAwLCAwLCAzLCAtMSwgfSwKLSAgeyAiRFRSIiwgMCwgMCwgMiwgLTEsIH0sCi0gIHsgIkRUUiIsIDAsIDAsIDMsIC0xLCB9LAotICB7ICJEVFIiLCAwLCAwLCAwLCAtMSwgfSwKLSAgeyAiRFRSIiwgMCwgMCwgMiwgLTEsIH0sCi0gIHsgIkZSJSwgJSBpbiAwIC0gMSIsIDEyLCAwLCAwLCAtMSwgfSwKLSAgeyAiRlIlLCAlIGluIDIgLSAxMjciLCAxMywgMCwgMiwgLTEsIH0sCi0gIHsgIkZSJSwgJSBpbiAyIC0gMTI3IiwgMTMsIDAsIDAsIC0xLCB9LAotICB7ICJHUjAiLCAxNCwgMCwgMCwgLTEsIH0sCi0gIHsgIkdSJSwgJSBpbiAxIC0gMTI3IiwgMTUsIDAsIDAsIC0xLCB9LAotICB7ICJHUiUsICUgaW4gMSAtIDEyNyIsIDE1LCAwLCAyLCAtMSwgfSwKLSAgeyAiSUJSIyIsIDE2LCAwLCAyLCAtMSwgfSwKLSAgeyAiSW5TZXJ2aWNlKiIsIDE3LCAwLCAzLCAtMSwgfSwKLSAgeyAiSW5TZXJ2aWNlKiIsIDE3LCAwLCAyLCAtMSwgfSwKLSAgeyAiSW5TZXJ2aWNlKiIsIDE3LCAwLCAyLCAtMSwgfSwKLSAgeyAiSVAiLCAwLCAwLCAwLCAtMSwgfSwKLSAgeyAiSVRDIiwgMCwgMCwgNCwgLTEsIH0sCi0gIHsgIklUQyIsIDAsIDAsIDIsIC0xLCB9LAotICB7ICJJVEMiLCAwLCAwLCAwLCAtMSwgfSwKLSAgeyAiSVRDIiwgMCwgMCwgNCwgLTEsIH0sCi0gIHsgIklUQyIsIDAsIDAsIDIsIC0xLCB9LAotICB7ICJJVENfTElNSVQqIiwgMCwgMCwgMiwgLTEsIH0sCi0gIHsgIklUUiIsIDAsIDAsIDIsIC0xLCB9LAotICB7ICJJVFIiLCAwLCAwLCA0LCAtMSwgfSwKLSAgeyAiSVRSIiwgMCwgMCwgMiwgLTEsIH0sCi0gIHsgIklUUiIsIDAsIDAsIDAsIC0xLCB9LAotICB7ICJJVFIiLCAwLCAwLCA0LCAtMSwgfSwKLSAgeyAibWVtb3J5IiwgMCwgMCwgMCwgLTEsIH0sCi0gIHsgIk1TUiMiLCAxOCwgMCwgNSwgLTEsIH0sCi0gIHsgIlBLUiMiLCAxOSwgMCwgMywgLTEsIH0sCi0gIHsgIlBLUiMiLCAxOSwgMCwgMCwgLTEsIH0sCi0gIHsgIlBLUiMiLCAxOSwgMCwgMiwgLTEsIH0sCi0gIHsgIlBLUiMiLCAxOSwgMCwgMiwgLTEsIH0sCi0gIHsgIlBNQyMiLCAyMCwgMCwgMiwgLTEsIH0sCi0gIHsgIlBNQyMiLCAyMCwgMCwgNiwgLTEsICJTQyszIFNlY3Rpb24gMTIuMS4xIiwgfSwKLSAgeyAiUE1EIyIsIDIxLCAwLCAyLCAtMSwgfSwKLSAgeyAiUFIwIiwgMCwgMCwgMCwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMCwgMiwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMCwgMiwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMCwgMCwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMCwgMiwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMCwgMiwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMCwgMCwgLTEsIH0sCi0gIHsgIlBTUi5hYyIsIDI3LCAwLCAxLCAzLCB9LAotICB7ICJQU1IuYWMiLCAyNywgMCwgMywgMywgfSwKLSAgeyAiUFNSLmFjIiwgMjcsIDAsIDIsIDMsIH0sCi0gIHsgIlBTUi5iZSIsIDI3LCAwLCAxLCAxLCB9LAotICB7ICJQU1IuYmUiLCAyNywgMCwgMywgMSwgfSwKLSAgeyAiUFNSLmJlIiwgMjcsIDAsIDIsIDEsIH0sCi0gIHsgIlBTUi5ibiIsIDI3LCAwLCAyLCA0NCwgfSwKLSAgeyAiUFNSLmNwbCIsIDI3LCAwLCAxLCAzMiwgfSwKLSAgeyAiUFNSLmRhIiwgMjcsIDAsIDMsIDM4LCB9LAotICB7ICJQU1IuZGIiLCAyNywgMCwgMywgMjQsIH0sCi0gIHsgIlBTUi5kYiIsIDI3LCAwLCAyLCAyNCwgfSwKLSAgeyAiUFNSLmRiIiwgMjcsIDAsIDMsIDI0LCB9LAotICB7ICJQU1IuZGQiLCAyNywgMCwgMywgMzksIH0sCi0gIHsgIlBTUi5kZmgiLCAyNywgMCwgMywgMTksIH0sCi0gIHsgIlBTUi5kZmgiLCAyNywgMCwgMiwgMTksIH0sCi0gIHsgIlBTUi5kZmwiLCAyNywgMCwgMywgMTgsIH0sCi0gIHsgIlBTUi5kZmwiLCAyNywgMCwgMiwgMTgsIH0sCi0gIHsgIlBTUi5kaSIsIDI3LCAwLCAzLCAyMiwgfSwKLSAgeyAiUFNSLmRpIiwgMjcsIDAsIDIsIDIyLCB9LAotICB7ICJQU1IuZHQiLCAyNywgMCwgMywgMTcsIH0sCi0gIHsgIlBTUi5kdCIsIDI3LCAwLCAyLCAxNywgfSwKLSAgeyAiUFNSLmVkIiwgMjcsIDAsIDMsIDQzLCB9LAotICB7ICJQU1IuaSIsIDI3LCAwLCAyLCAxNCwgfSwKLSAgeyAiUFNSLmkiLCAyNywgMCwgMywgMTQsIH0sCi0gIHsgIlBTUi5pYSIsIDI3LCAwLCAwLCAxNCwgfSwKLSAgeyAiUFNSLmljIiwgMjcsIDAsIDIsIDEzLCB9LAotICB7ICJQU1IuaWMiLCAyNywgMCwgMywgMTMsIH0sCi0gIHsgIlBTUi5pZCIsIDI3LCAwLCAwLCAxNCwgfSwKLSAgeyAiUFNSLmlzIiwgMjcsIDAsIDAsIDE0LCB9LAotICB7ICJQU1IuaXQiLCAyNywgMCwgMywgMTQsIH0sCi0gIHsgIlBTUi5scCIsIDI3LCAwLCAyLCAyNSwgfSwKLSAgeyAiUFNSLmxwIiwgMjcsIDAsIDMsIDI1LCB9LAotICB7ICJQU1IubHAiLCAyNywgMCwgMywgMjUsIH0sCi0gIHsgIlBTUi5tYyIsIDI3LCAwLCAwLCAzNSwgfSwKLSAgeyAiUFNSLm1maCIsIDI3LCAwLCAyLCA1LCB9LAotICB7ICJQU1IubWZsIiwgMjcsIDAsIDIsIDQsIH0sCi0gIHsgIlBTUi5wayIsIDI3LCAwLCAzLCAxNSwgfSwKLSAgeyAiUFNSLnBrIiwgMjcsIDAsIDIsIDE1LCB9LAotICB7ICJQU1IucHAiLCAyNywgMCwgMiwgMjEsIH0sCi0gIHsgIlBTUi5yaSIsIDI3LCAwLCAwLCA0MSwgfSwKLSAgeyAiUFNSLnJ0IiwgMjcsIDAsIDIsIDI3LCB9LAotICB7ICJQU1IucnQiLCAyNywgMCwgMywgMjcsIH0sCi0gIHsgIlBTUi5ydCIsIDI3LCAwLCAzLCAyNywgfSwKLSAgeyAiUFNSLnNpIiwgMjcsIDAsIDIsIDIzLCB9LAotICB7ICJQU1Iuc2kiLCAyNywgMCwgMywgMjMsIH0sCi0gIHsgIlBTUi5zcCIsIDI3LCAwLCAyLCAyMCwgfSwKLSAgeyAiUFNSLnNwIiwgMjcsIDAsIDMsIDIwLCB9LAotICB7ICJQU1Iuc3MiLCAyNywgMCwgMywgNDAsIH0sCi0gIHsgIlBTUi50YiIsIDI3LCAwLCAzLCAyNiwgfSwKLSAgeyAiUFNSLnRiIiwgMjcsIDAsIDIsIDI2LCB9LAotICB7ICJQU1IudXAiLCAyNywgMCwgMiwgMiwgfSwKLSAgeyAiUlIjIiwgMjQsIDAsIDMsIC0xLCB9LAotICB7ICJSUiMiLCAyNCwgMCwgMiwgLTEsIH0sCi0gIHsgIlJTRSIsIDI4LCAwLCAyLCAtMSwgfSwKLSAgeyAiQUxBVCIsIDAsIDEsIDAsIC0xLCB9LAotICB7ICJBUltCU1BdIiwgMjUsIDEsIDIsIDE3LCB9LAotICB7ICJBUltCU1BTVE9SRV0iLCAyNSwgMSwgMiwgMTgsIH0sCi0gIHsgIkFSW0NDVl0iLCAyNSwgMSwgMiwgMzIsIH0sCi0gIHsgIkFSW0VDXSIsIDI1LCAxLCAyLCA2NiwgfSwKLSAgeyAiQVJbRlBTUl0uc2YwLmNvbnRyb2xzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjEuY29udHJvbHMiLCAyOSwgMSwgMiwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMi5jb250cm9scyIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YzLmNvbnRyb2xzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjAuZmxhZ3MiLCAyOSwgMSwgMCwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMC5mbGFncyIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YwLmZsYWdzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjEuZmxhZ3MiLCAyOSwgMSwgMCwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMS5mbGFncyIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YxLmZsYWdzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjIuZmxhZ3MiLCAyOSwgMSwgMCwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMi5mbGFncyIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YyLmZsYWdzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5zZjMuZmxhZ3MiLCAyOSwgMSwgMCwgLTEsIH0sCi0gIHsgIkFSW0ZQU1JdLnNmMy5mbGFncyIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0uc2YzLmZsYWdzIiwgMjksIDEsIDIsIC0xLCB9LAotICB7ICJBUltGUFNSXS5ydiIsIDI5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQVJbRlBTUl0udHJhcHMiLCAyOSwgMSwgMiwgLTEsIH0sCi0gIHsgIkFSW0lUQ10iLCAyNSwgMSwgMiwgNDQsIH0sCi0gIHsgIkFSW0slXSwgJSBpbiAwIC0gNyIsIDEsIDEsIDIsIC0xLCB9LAotICB7ICJBUltMQ10iLCAyNSwgMSwgMiwgNjUsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMSwgMCwgNjQsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMSwgMiwgNjQsIH0sCi0gIHsgIkFSW1BGU10iLCAyNSwgMSwgMiwgNjQsIH0sCi0gIHsgIkFSW1JOQVRdIiwgMjUsIDEsIDIsIDE5LCB9LAotICB7ICJBUltSU0NdIiwgMjUsIDEsIDIsIDE2LCB9LAotICB7ICJBUltVTkFUXXslfSwgJSBpbiAwIC0gNjMiLCAyLCAxLCAyLCAtMSwgfSwKLSAgeyAiQVIlLCAlIGluIDgtMTUsIDIwLCAyMi0yMywgMzEsIDMzLTM1LCAzNy0zOSwgNDEtNDMsIDQ1LTQ3LCA2Ny0xMTEiLCAzLCAxLCAwLCAtMSwgfSwKLSAgeyAiQVIlLCAlIGluIDQ4IC0gNjMsIDExMi0xMjciLCA0LCAxLCAyLCAtMSwgfSwKLSAgeyAiQlIlLCAlIGluIDAgLSA3IiwgNSwgMSwgMiwgLTEsIH0sCi0gIHsgIkJSJSwgJSBpbiAwIC0gNyIsIDUsIDEsIDIsIC0xLCB9LAotICB7ICJCUiUsICUgaW4gMCAtIDciLCA1LCAxLCAyLCAtMSwgfSwKLSAgeyAiQlIlLCAlIGluIDAgLSA3IiwgNSwgMSwgMCwgLTEsIH0sCi0gIHsgIkNGTSIsIDYsIDEsIDIsIC0xLCB9LAotICB7ICJDUFVJRCMiLCA3LCAxLCAwLCAtMSwgfSwKLSAgeyAiQ1JbQ01DVl0iLCAyNiwgMSwgMiwgNzQsIH0sCi0gIHsgIkNSW0RDUl0iLCAyNiwgMSwgMiwgMCwgfSwKLSAgeyAiQ1JbRU9JXSIsIDI2LCAxLCA2LCA2NywgIlNDIFNlY3Rpb24gMTAuOC4zLjQiLCB9LAotICB7ICJDUltHUFRBXSIsIDI2LCAxLCAyLCA5LCB9LAotICB7ICJDUltJRkFdIiwgMjYsIDEsIDIsIDIwLCB9LAotICB7ICJDUltJRlNdIiwgMjYsIDEsIDIsIDIzLCB9LAotICB7ICJDUltJSEFdIiwgMjYsIDEsIDIsIDI1LCB9LAotICB7ICJDUltJSU1dIiwgMjYsIDEsIDIsIDI0LCB9LAotICB7ICJDUltJSVBdIiwgMjYsIDEsIDIsIDE5LCB9LAotICB7ICJDUltJSVBBXSIsIDI2LCAxLCAyLCAyMiwgfSwKLSAgeyAiQ1JbSVBTUl0iLCAyNiwgMSwgMiwgMTYsIH0sCi0gIHsgIkNSW0lSUiVdLCAlIGluIDAgLSAzIiwgOCwgMSwgMiwgLTEsIH0sCi0gIHsgIkNSW0lTUl0iLCAyNiwgMSwgMiwgMTcsIH0sCi0gIHsgIkNSW0lUSVJdIiwgMjYsIDEsIDIsIDIxLCB9LAotICB7ICJDUltJVE1dIiwgMjYsIDEsIDIsIDEsIH0sCi0gIHsgIkNSW0lUVl0iLCAyNiwgMSwgMiwgNzIsIH0sCi0gIHsgIkNSW0lWQV0iLCAyNiwgMSwgMiwgMiwgfSwKLSAgeyAiQ1JbSVZSXSIsIDI2LCAxLCA2LCA2NSwgIlNDIiwgfSwKLSAgeyAiQ1JbTElEXSIsIDI2LCAxLCA2LCA2NCwgIlNDIiwgfSwKLSAgeyAiQ1JbTFJSJV0sICUgaW4gMCAtIDEiLCA5LCAxLCAyLCAtMSwgfSwKLSAgeyAiQ1JbUE1WXSIsIDI2LCAxLCAyLCA3MywgfSwKLSAgeyAiQ1JbUFRBXSIsIDI2LCAxLCAyLCA4LCB9LAotICB7ICJDUltUUFJdIiwgMjYsIDEsIDIsIDY2LCB9LAotICB7ICJDUiUsICUgaW4gMy03LCAxMC0xNSwgMTgsIDI2LTYzLCA3NS03OSwgODItMTI3IiwgMTAsIDEsIDAsIC0xLCB9LAotICB7ICJEQlIjIiwgMTEsIDEsIDIsIC0xLCB9LAotICB7ICJEVEMiLCAwLCAxLCAwLCAtMSwgfSwKLSAgeyAiRFRDIiwgMCwgMSwgMiwgLTEsIH0sCi0gIHsgIkRUQyIsIDAsIDEsIDIsIC0xLCB9LAotICB7ICJEVENfTElNSVQqIiwgMCwgMSwgMiwgLTEsIH0sCi0gIHsgIkRUUiIsIDAsIDEsIDIsIC0xLCB9LAotICB7ICJEVFIiLCAwLCAxLCAyLCAtMSwgfSwKLSAgeyAiRFRSIiwgMCwgMSwgMiwgLTEsIH0sCi0gIHsgIkRUUiIsIDAsIDEsIDAsIC0xLCB9LAotICB7ICJGUiUsICUgaW4gMCAtIDEiLCAxMiwgMSwgMCwgLTEsIH0sCi0gIHsgIkZSJSwgJSBpbiAyIC0gMTI3IiwgMTMsIDEsIDIsIC0xLCB9LAotICB7ICJHUjAiLCAxNCwgMSwgMCwgLTEsIH0sCi0gIHsgIkdSJSwgJSBpbiAxIC0gMTI3IiwgMTUsIDEsIDIsIC0xLCB9LAotICB7ICJJQlIjIiwgMTYsIDEsIDIsIC0xLCB9LAotICB7ICJJblNlcnZpY2UqIiwgMTcsIDEsIDYsIC0xLCAiU0MiLCB9LAotICB7ICJJUCIsIDAsIDEsIDAsIC0xLCB9LAotICB7ICJJVEMiLCAwLCAxLCAwLCAtMSwgfSwKLSAgeyAiSVRDIiwgMCwgMSwgMiwgLTEsIH0sCi0gIHsgIklUQyIsIDAsIDEsIDIsIC0xLCB9LAotICB7ICJJVFIiLCAwLCAxLCAyLCAtMSwgfSwKLSAgeyAiSVRSIiwgMCwgMSwgMiwgLTEsIH0sCi0gIHsgIklUUiIsIDAsIDEsIDAsIC0xLCB9LAotICB7ICJtZW1vcnkiLCAwLCAxLCAwLCAtMSwgfSwKLSAgeyAiTVNSIyIsIDE4LCAxLCA2LCAtMSwgIlNDIiwgfSwKLSAgeyAiUEtSIyIsIDE5LCAxLCAwLCAtMSwgfSwKLSAgeyAiUEtSIyIsIDE5LCAxLCAwLCAtMSwgfSwKLSAgeyAiUEtSIyIsIDE5LCAxLCAyLCAtMSwgfSwKLSAgeyAiUE1DIyIsIDIwLCAxLCAyLCAtMSwgfSwKLSAgeyAiUE1EIyIsIDIxLCAxLCAyLCAtMSwgfSwKLSAgeyAiUFIwIiwgMCwgMSwgMCwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMSwgMCwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMSwgMCwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMSwgMiwgLTEsIH0sCi0gIHsgIlBSJSwgJSBpbiAxIC0gNjIiLCAyMiwgMSwgMiwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMSwgMCwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMSwgMCwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMSwgMiwgLTEsIH0sCi0gIHsgIlBSNjMiLCAyMywgMSwgMiwgLTEsIH0sCi0gIHsgIlBTUi5hYyIsIDI3LCAxLCAyLCAzLCB9LAotICB7ICJQU1IuYmUiLCAyNywgMSwgMiwgMSwgfSwKLSAgeyAiUFNSLmJuIiwgMjcsIDEsIDIsIDQ0LCB9LAotICB7ICJQU1IuY3BsIiwgMjcsIDEsIDIsIDMyLCB9LAotICB7ICJQU1IuZGEiLCAyNywgMSwgMiwgMzgsIH0sCi0gIHsgIlBTUi5kYiIsIDI3LCAxLCAyLCAyNCwgfSwKLSAgeyAiUFNSLmRkIiwgMjcsIDEsIDIsIDM5LCB9LAotICB7ICJQU1IuZGZoIiwgMjcsIDEsIDIsIDE5LCB9LAotICB7ICJQU1IuZGZsIiwgMjcsIDEsIDIsIDE4LCB9LAotICB7ICJQU1IuZGkiLCAyNywgMSwgMiwgMjIsIH0sCi0gIHsgIlBTUi5kdCIsIDI3LCAxLCAyLCAxNywgfSwKLSAgeyAiUFNSLmVkIiwgMjcsIDEsIDIsIDQzLCB9LAotICB7ICJQU1IuaSIsIDI3LCAxLCAyLCAxNCwgfSwKLSAgeyAiUFNSLmlhIiwgMjcsIDEsIDIsIDE0LCB9LAotICB7ICJQU1IuaWMiLCAyNywgMSwgMiwgMTMsIH0sCi0gIHsgIlBTUi5pZCIsIDI3LCAxLCAyLCAxNCwgfSwKLSAgeyAiUFNSLmlzIiwgMjcsIDEsIDIsIDE0LCB9LAotICB7ICJQU1IuaXQiLCAyNywgMSwgMiwgMTQsIH0sCi0gIHsgIlBTUi5scCIsIDI3LCAxLCAyLCAyNSwgfSwKLSAgeyAiUFNSLm1jIiwgMjcsIDEsIDIsIDM1LCB9LAotICB7ICJQU1IubWZoIiwgMjcsIDEsIDAsIDUsIH0sCi0gIHsgIlBTUi5tZmgiLCAyNywgMSwgMiwgNSwgfSwKLSAgeyAiUFNSLm1maCIsIDI3LCAxLCAyLCA1LCB9LAotICB7ICJQU1IubWZsIiwgMjcsIDEsIDAsIDQsIH0sCi0gIHsgIlBTUi5tZmwiLCAyNywgMSwgMiwgNCwgfSwKLSAgeyAiUFNSLm1mbCIsIDI3LCAxLCAyLCA0LCB9LAotICB7ICJQU1IucGsiLCAyNywgMSwgMiwgMTUsIH0sCi0gIHsgIlBTUi5wcCIsIDI3LCAxLCAyLCAyMSwgfSwKLSAgeyAiUFNSLnJpIiwgMjcsIDEsIDIsIDQxLCB9LAotICB7ICJQU1IucnQiLCAyNywgMSwgMiwgMjcsIH0sCi0gIHsgIlBTUi5zaSIsIDI3LCAxLCAyLCAyMywgfSwKLSAgeyAiUFNSLnNwIiwgMjcsIDEsIDIsIDIwLCB9LAotICB7ICJQU1Iuc3MiLCAyNywgMSwgMiwgNDAsIH0sCi0gIHsgIlBTUi50YiIsIDI3LCAxLCAyLCAyNiwgfSwKLSAgeyAiUFNSLnVwIiwgMjcsIDEsIDIsIDIsIH0sCi0gIHsgIlJSIyIsIDI0LCAxLCAyLCAtMSwgfSwKLSAgeyAiUlNFIiwgMjgsIDEsIDIsIC0xLCB9LAotICB7ICJQUjYzIiwgMjMsIDIsIDIsIC0xLCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDBbXSA9IHsKLSAgMjEzMSwgMjI5NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMVtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyW10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjI5NCwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDNbXSA9IHsKLSAgMzIsIDMzLCA4MSwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDRbXSA9IHsKLSAgMjMxNCwgMjMxNSwgMjMxOCwgMjMxOSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNVtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIzMTQsIDIzMTUsIDIzMTgsIDIzMTksIDQxMjcsIAotICAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNltdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA3W10gPSB7Ci0gIDIzMTIsIDIzMTQsIDIzMTYsIDIzMTgsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDhbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMzEyLCAyMzE1LCAyMzE2LCAyMzE5LCA0MTI3LCAKLSAgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDlbXSA9IHsKLSAgMjMxMywgMjMxNSwgMjMxNywgMjMxOSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTBbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMzEzLCAyMzE0LCAyMzE3LCAyMzE4LCA0MTI3LCAKLSAgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExW10gPSB7Ci0gIDIzMTIsIDIzMTMsIDIzMTQsIDIzMTUsIDIzMTYsIDIzMTcsIDIzMTgsIDIzMTksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyW10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjMxMiwgMjMxMywgMjMxNCwgMjMxNSwgMjMxNiwgCi0gIDIzMTcsIDIzMTgsIDIzMTksIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxM1tdID0gewotICAyMzU3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNFtdID0gewotICAxNDUsIDE2NCwgMjA3NCwgMjA3NSwgMjE1NywgMjE1OSwgMjE2MCwgMjE2MiwgMjE2MywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTVbXSA9IHsKLSAgMTQ0LCAyODgsIDIzNTcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE2W10gPSB7Ci0gIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMSwgMjIsIAotICAyMywgMjQsIDI1LCAxMzMsIDE0NSwgMTY0LCAyODgsIDIwNzQsIDIwNzUsIDIxNTcsIDIxNTksIDIxNjAsIDIxNjIsIDIxNjMsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxN1tdID0gewotICAxLCA0LCAzMiwgMTIzLCAxNzEsIDE3NCwgMjA4LCAyNzUsIDIzNTcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE4W10gPSB7Ci0gIDEsIDE4LCAyMCwgMzAsIDMyLCAzMywgMTQ1LCAxNDcsIDE0OCwgMTY0LCAxNzEsIDE3NCwgMjA4LCAyNzUsIDIwNzQsIDIwNzUsIAotICAyMTU3LCAyMTU5LCAyMTYwLCAyMTYyLCAyMTYzLCA0MTI3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOVtdID0gewotICAxLCAzMiwgNDMsIDE3MSwgMjA4LCAyMTUsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIwW10gPSB7Ci0gIDEsIDMwLCAzMiwgMzMsIDE0MiwgMTcxLCAyMDgsIDIxNSwgNDEyNywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjFbXSA9IHsKLSAgMzIsIDIwOCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjJbXSA9IHsKLSAgMjA4LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyM1tdID0gewotICAxLCAzMiwgMTE3LCAxMTgsIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjcsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIAotICAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ4LCAxNDksIDE1MCwgMTUxLCAKLSAgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNzEsIDIwOCwgCi0gIDI3MiwgMjczLCAyNzQsIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsIAotICAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkzLCAyOTQsIDI5NiwgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAKLSAgMzA0LCAzMDUsIDMwNiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjRbXSA9IHsKLSAgMSwgMzAsIDMyLCAzMywgNDIsIDQzLCA0NywgNTAsIDY0LCAxNzEsIDIwOCwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgCi0gIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsIDI4NywgMjg4LCAyODksIDI5MCwgMjkxLCAyOTMsIAotICAyOTQsIDI5NiwgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LCA0MTI3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyNVtdID0gewotICAxMjIsIDI3NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjZbXSA9IHsKLSAgMjc0LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyN1tdID0gewotICAxMjMsIDI3NSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjhbXSA9IHsKLSAgMTgsIDE5LCA4OSwgOTIsIDk2LCA5OSwgMTIzLCAxNDUsIDI3NSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjlbXSA9IHsKLSAgMjE1NywgMjE1OSwgMjE2MCwgMjE2MiwgMjE2MywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMzBbXSA9IHsKLSAgMSwgMTgsIDMyLCAxNzEsIDE5NiwgMTk3LCAyMDgsIDIwNzQsIDIyNTIsIDIyNTUsIDIzNTcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDMxW10gPSB7Ci0gIDEsIDQsIDMwLCAzMiwgMzMsIDEyMywgMTQ1LCAxNjQsIDE3MSwgMTk2LCAxOTgsIDIwOCwgMjA3NCwgMjA3NSwgMjE1NywgMjE1OSwgCi0gIDIxNjAsIDIxNjIsIDIxNjMsIDIyNTMsIDIyNTUsIDQxMjcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDMyW10gPSB7Ci0gIDIwNzQsIDIwNzYsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDMzW10gPSB7Ci0gIDE0NSwgMTY0LCAyMTU3LCAyMTU5LCAyMTYwLCAyMTYyLCAyMTYzLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAzNFtdID0gewotICA0LCAyOSwgMzAsIDMxLCAxMTMsIDExNCwgMTc0LCAyMDgsIDI3MCwgMjcxLCAyMzU3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAzNVtdID0gewotICA0LCAyOSwgMzIsIDMzLCAxNDUsIDE2NCwgMTc0LCAyMDgsIDI3MCwgMjcxLCAzMDksIDIxNTcsIDIxNTksIDIxNjAsIDIxNjIsIAotICAyMTYzLCA0MTI3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAzNltdID0gewotICAxNywgMTk1LCAyMzU3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAzN1tdID0gewotICAxNywgMTQ1LCAxNjQsIDE5NSwgMjE1NywgMjE1OSwgMjE2MCwgMjE2MiwgMjE2MywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMzhbXSA9IHsKLSAgNCwgMTcsIDI5LCAzMCwgMzEsIDExMywgMTE0LCAxNzQsIDE5NSwgMjA4LCAyNzAsIDI3MSwgMjM1NywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMzlbXSA9IHsKLSAgNCwgMTcsIDI5LCAzMiwgMzMsIDE0NSwgMTY0LCAxNzQsIDE5NSwgMjA4LCAyNzAsIDI3MSwgMzA5LCAyMTU3LCAyMTU5LCAyMTYwLCAKLSAgMjE2MiwgMjE2MywgNDEyNywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNDBbXSA9IHsKLSAgMSwgNCwgMzAsIDMyLCAzMywgMTIzLCAxNDUsIDE2NCwgMTcxLCAxOTYsIDE5OCwgMjA4LCAyMTU3LCAyMTU5LCAyMTYwLCAyMTYyLCAKLSAgMjE2MywgMjI1MywgMjI1NSwgNDEyNywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNDFbXSA9IHsKLSAgOSwgMTc5LCAxODAsIDIxMjcsIDIyOTIsIDE4NTgyLCAxODU4MywgMTg3MjQsIDE4NzI1LCAxODcyNywgMTg3MjgsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDQyW10gPSB7Ci0gIDUsIDEzLCAxNCwgMzIsIDMzLCAxNzksIDE4MSwgMjEyNiwgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgCi0gIDE2NTEzLCAxNjUxNSwgMTg3MjQsIDE4NzI2LCAxODcyNywgMTg3MjksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDQzW10gPSB7Ci0gIDksIDEwLCAxMSwgMTIsIDE3OSwgMTgwLCAxODIsIDE4MywgMTg1LCAxODYsIDE4OCwgMTg5LCAyMTI3LCAyMjkyLCAxODU4MiwgCi0gIDE4NTgzLCAxODcyNCwgMTg3MjUsIDE4NzI3LCAxODcyOCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNDRbXSA9IHsKLSAgNSwgNiwgNywgOCwgMTMsIDE0LCAzMiwgMzMsIDE3OSwgMTgxLCAxODIsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTkwLCAyMTI2LCAKLSAgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgMTY1MTMsIDE2NTE1LCAxODcyNCwgMTg3MjYsIDE4NzI3LCAKLSAgMTg3MjksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDQ1W10gPSB7Ci0gIDEwLCAxODIsIDE4MywgMjEyNywgMjI5MiwgMTg1ODIsIDE4NTgzLCAxODcyNCwgMTg3MjUsIDE4NzI3LCAxODcyOCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNDZbXSA9IHsKLSAgNiwgMTMsIDE0LCAzMiwgMzMsIDE4MiwgMTg0LCAyMTI2LCAyMTI3LCAyMTI4LCAyMTU3LCAyMTU4LCAyMTYxLCAyMjkyLCA0MTI3LCAKLSAgMTY1MTMsIDE2NTE1LCAxODcyNCwgMTg3MjYsIDE4NzI3LCAxODcyOSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNDdbXSA9IHsKLSAgMTEsIDE4NSwgMTg2LCAyMTI3LCAyMjkyLCAxODU4MiwgMTg1ODMsIDE4NzI0LCAxODcyNSwgMTg3MjcsIDE4NzI4LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA0OFtdID0gewotICA3LCAxMywgMTQsIDMyLCAzMywgMTg1LCAxODcsIDIxMjYsIDIxMjcsIDIxMjgsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTIsIDQxMjcsIAotICAxNjUxMywgMTY1MTUsIDE4NzI0LCAxODcyNiwgMTg3MjcsIDE4NzI5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA0OVtdID0gewotICAxMiwgMTg4LCAxODksIDIxMjcsIDIyOTIsIDE4NTgyLCAxODU4MywgMTg3MjQsIDE4NzI1LCAxODcyNywgMTg3MjgsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDUwW10gPSB7Ci0gIDgsIDEzLCAxNCwgMzIsIDMzLCAxODgsIDE5MCwgMjEyNiwgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgCi0gIDE2NTEzLCAxNjUxNSwgMTg3MjQsIDE4NzI2LCAxODcyNywgMTg3MjksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDUxW10gPSB7Ci0gIDIxMjcsIDIyOTIsIDE4NTgyLCAxODU4MywgMTg3MjQsIDE4NzI1LCAxODcyNywgMTg3MjgsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDUyW10gPSB7Ci0gIDMyLCAzMywgMjEyNiwgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgMTY1MTMsIDE2NTE1LCAxODcyNCwgCi0gIDE4NzI2LCAxODcyNywgMTg3MjksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDUzW10gPSB7Ci0gIDUsIDE3NSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNTRbXSA9IHsKLSAgNSwgMTc1LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA1NVtdID0gewotICA1LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA1NltdID0gewotICA2LCAxNzYsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDU3W10gPSB7Ci0gIDUsIDE3NiwgMjE1NywgMjE1OCwgMjE2MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNThbXSA9IHsKLSAgNywgMTc3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA1OVtdID0gewotICA1LCAxNzcsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDYwW10gPSB7Ci0gIDgsIDE3OCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNjFbXSA9IHsKLSAgNSwgMTc4LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA2MltdID0gewotICA5LCAxODAsIDE4MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNjNbXSA9IHsKLSAgMTgwLCAxODEsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDY0W10gPSB7Ci0gIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDY1W10gPSB7Ci0gIDEwLCAxODMsIDE4NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNjZbXSA9IHsKLSAgMTgzLCAxODQsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDY3W10gPSB7Ci0gIDExLCAxODYsIDE4NywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNjhbXSA9IHsKLSAgMTg2LCAxODcsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDY5W10gPSB7Ci0gIDEyLCAxODksIDE5MCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNzBbXSA9IHsKLSAgMTg5LCAxOTAsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDcxW10gPSB7Ci0gIDksIDEzLCAxNCwgMTQ1LCAxNjQsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDcyW10gPSB7Ci0gIDksIDEwLCAxMywgMTQsIDE0NSwgMTY0LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA3M1tdID0gewotICA5LCAxMSwgMTMsIDE0LCAxNDUsIDE2NCwgMjE1NywgMjE1OCwgMjE2MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNzRbXSA9IHsKLSAgOSwgMTIsIDEzLCAxNCwgMTQ1LCAxNjQsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDc1W10gPSB7Ci0gIDksIDE3OSwgMTgwLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA3NltdID0gewotICA1LCAxMywgMTQsIDE3OSwgMTgxLCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA3N1tdID0gewotICA5LCAxMCwgMTEsIDEyLCAxNzksIDE4MCwgMTgyLCAxODMsIDE4NSwgMTg2LCAxODgsIDE4OSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwNzhbXSA9IHsKLSAgNSwgNiwgNywgOCwgMTMsIDE0LCAxNzksIDE4MSwgMTgyLCAxODQsIDE4NSwgMTg3LCAxODgsIDE5MCwgMjE1NywgMjE1OCwgMjE2MSwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDc5W10gPSB7Ci0gIDEwLCAxODIsIDE4MywgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwODBbXSA9IHsKLSAgNiwgMTMsIDE0LCAxODIsIDE4NCwgMjE1NywgMjE1OCwgMjE2MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwODFbXSA9IHsKLSAgMTEsIDE4NSwgMTg2LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA4MltdID0gewotICA3LCAxMywgMTQsIDE4NSwgMTg3LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA4M1tdID0gewotICAxMiwgMTg4LCAxODksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDg0W10gPSB7Ci0gIDgsIDEzLCAxNCwgMTg4LCAxOTAsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDg1W10gPSB7Ci0gIDksIDE3OSwgMTgwLCAyMzE0LCAyMzE1LCAyMzE4LCAyMzE5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA4NltdID0gewotICA1LCAxMywgMTQsIDE3OSwgMTgxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMzE0LCAyMzE1LCAyMzE4LCAyMzE5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA4N1tdID0gewotICA5LCAxMCwgMTEsIDEyLCAxNzksIDE4MCwgMTgyLCAxODMsIDE4NSwgMTg2LCAxODgsIDE4OSwgMjMxNCwgMjMxNSwgMjMxOCwgMjMxOSwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDg4W10gPSB7Ci0gIDUsIDYsIDcsIDgsIDEzLCAxNCwgMTc5LCAxODEsIDE4MiwgMTg0LCAxODUsIDE4NywgMTg4LCAxOTAsIDIxNTcsIDIxNTgsIDIxNjEsIAotICAyMzE0LCAyMzE1LCAyMzE4LCAyMzE5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA4OVtdID0gewotICAxMCwgMTgyLCAxODMsIDIzMTQsIDIzMTUsIDIzMTgsIDIzMTksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDkwW10gPSB7Ci0gIDYsIDEzLCAxNCwgMTgyLCAxODQsIDIxNTcsIDIxNTgsIDIxNjEsIDIzMTQsIDIzMTUsIDIzMTgsIDIzMTksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDkxW10gPSB7Ci0gIDExLCAxODUsIDE4NiwgMjMxNCwgMjMxNSwgMjMxOCwgMjMxOSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwOTJbXSA9IHsKLSAgNywgMTMsIDE0LCAxODUsIDE4NywgMjE1NywgMjE1OCwgMjE2MSwgMjMxNCwgMjMxNSwgMjMxOCwgMjMxOSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwOTNbXSA9IHsKLSAgMTIsIDE4OCwgMTg5LCAyMzE0LCAyMzE1LCAyMzE4LCAyMzE5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA5NFtdID0gewotICA4LCAxMywgMTQsIDE4OCwgMTkwLCAyMTU3LCAyMTU4LCAyMTYxLCAyMzE0LCAyMzE1LCAyMzE4LCAyMzE5LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA5NVtdID0gewotICAzMiwgMzMsIDIxMjYsIDIxMjcsIDIxMjgsIDIxNTcsIDIxNTgsIDIxNjEsIDIzMTQsIDIzMTUsIDIzMTgsIDIzMTksIDQxMjcsIAotICAxNjUxMywgMTY1MTUsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDk2W10gPSB7Ci0gIDMyLCAzMywgMjEyNiwgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMTY1MTMsIDE2NTE1LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA5N1tdID0gewotICAxMywgMTQsIDMyLCAzMywgMjEyNiwgMjEyNywgMjEyOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgMTY1MTMsIDE2NTE1LCAKLSAgMTg3MjQsIDE4NzI2LCAxODcyNywgMTg3MjksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDk4W10gPSB7Ci0gIDMyLCAzMywgMTQ1LCAxNjQsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXA5OVtdID0gewotICAyMDc1LCAyMDc2LCAyMjUzLCAyMjU0LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMDBbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjUyLCAyMjU0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTAxW10gPSB7Ci0gIDMyLCAzMywgMjA3NCwgMjA3NiwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEwMltdID0gewotICAxNDQ0NiwgMTQ0NDgsIDE0NDQ5LCAxNDQ1MSwgMTQ2MDIsIDE0NjAzLCAxNDYwNiwgMTQ2MDcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEwM1tdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDQxMjcsIDE0NjAyLCAxNDYwMywgMTQ2MDYsIDE0NjA3LCAyMDYwMiwgMjQ2ODUsIAotICAyNDY4NiwgMjQ2ODksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEwNFtdID0gewotICAxMTAsIDExMiwgMTEzLCAxMTUsIDE0NjAyLCAxNDYwMywgMTQ2MDYsIDE0NjA3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMDVbXSA9IHsKLSAgMTQ2MDIsIDE0NjAzLCAxNDYwNiwgMTQ2MDcsIDI0Njg1LCAyNDY4NiwgMjQ2ODksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEwNltdID0gewotICAzMiwgMzMsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMDdbXSA9IHsKLSAgMzIsIDMzLCAxMTAsIDExMywgMjI5NCwgNDEyNywgMjA2MDIsIDI0Njg1LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMDhbXSA9IHsKLSAgNCwgMTcsIDE5LCAyMCwgMTc0LCAxOTUsIDE5OCwgMjA3MywgMjI1MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTA5W10gPSB7Ci0gIDMyLCAzMywgMTc0LCAxOTUsIDE5NywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI1MSwgNDEyNywgMjA2MDIsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMTBbXSA9IHsKLSAgNCwgMTcsIDE4LCAxOSwgMzIsIDMzLCAyMDczLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTExW10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjMxNCwgMjMxNSwgMjMxOCwgMjMxOSwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExMltdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMTNbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMzEyLCAyMzE1LCAyMzE2LCAyMzE5LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTE0W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjMxMywgMjMxNCwgMjMxNywgMjMxOCwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExNVtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIzMTIsIDIzMTMsIDIzMTQsIDIzMTUsIDIzMTYsIDIzMTcsIDIzMTgsIDIzMTksIAotICA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTE2W10gPSB7Ci0gIDAsIDMyLCAzMywgMTQ1LCAxNjQsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExN1tdID0gewotICAwLCAxNzAsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExOFtdID0gewotICAwLCAzMiwgMzMsIDE0NSwgMTY0LCAxNzAsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDExOVtdID0gewotICAxNzAsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyMFtdID0gewotICAyLCAyMSwgMTcyLCAxOTksIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyMVtdID0gewotICAxLCAyLCAyMSwgMjIsIDE1NywgMTU4LCAxNzIsIDE5OSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTIyW10gPSB7Ci0gIDEsIDIxLCAyMiwgMzAsIDMyLCAzMywgMTU3LCAxNTgsIDE3MiwgMTk5LCA0MTI3LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMjNbXSA9IHsKLSAgMCwgMzIsIDMzLCAxNzAsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyNFtdID0gewotICAxLCAyLCAzLCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAyMSwgMjIsIDIzLCAxNzEsIDE3MiwgMTczLCAKLSAgMTc1LCAxNzYsIDE3NywgMTc4LCAxODAsIDE4MSwgMTgzLCAxODQsIDE4NiwgMTg3LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgCi0gIDE5OSwgMjAwLCAyMDEsIDIwNjQsIDIwNzMsIDIyNDIsIDIyNTEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyNVtdID0gewotICAyMiwgMzIsIDMzLCAxMjMsIDE3MSwgMTcyLCAxNzMsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTgwLCAxODEsIDE4MywgMTg0LCAxODYsIAotICAxODcsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTksIDIwMCwgMjAxLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAKLSAgMjE2MSwgMjI0MiwgMjI1MSwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyNltdID0gewotICAxNjIsIDIxNTcsIDIxNTgsIDIxNjEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyN1tdID0gewotICAxNjIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEyOFtdID0gewotICA2NCwgMjE1NywgMjE1OCwgMjE2MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTI5W10gPSB7Ci0gIDEsIDIsIDMsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDIxLCAyMiwgMjMsIDMyLCAzMywgMTIzLCAxNjAsIAotICAyMDY0LCAyMDczLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTMwW10gPSB7Ci0gIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUyLCA1MywgNTQsIDU1LCAKLSAgNTYsIDU3LCA1OSwgNjEsIDYyLCA2MywgNjQsIDg1LCA4NywgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIAotICAyMTgsIDIxOSwgMjIwLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI4LCAyMzAsIDIzMSwgMjMyLCAyNDgsIDIxMDgsIDIyNzcsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzFbXSA9IHsKLSAgMzIsIDMzLCA4NywgMTQyLCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIyLCAKLSAgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjgsIDIzMCwgMjMxLCAyMzIsIDI0OCwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgCi0gIDIxNjEsIDIyNzcsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzJbXSA9IHsKLSAgNTEsIDg2LCAyMjEsIDI0OCwgMjEzMSwgMjI5NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTMzW10gPSB7Ci0gIDMyLCAzMywgMzUsIDM2LCAzOCwgNDAsIDQxLCA0MywgNDQsIDQ1LCA0NiwgNDgsIDQ5LCA1MiwgNTMsIDU1LCA1NiwgNTcsIDU4LCAKLSAgNTksIDYxLCA2MiwgNjMsIDg1LCA4NiwgMTQyLCAyMjEsIDI0OCwgMjA5OSwgMjEwOCwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgCi0gIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzRbXSA9IHsKLSAgMiwgMjEsIDMzLCAxNzIsIDE5OSwgMjA4LCAyMTMxLCAyMjk0LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzVbXSA9IHsKLSAgMiwgMTgsIDE5LCAyMSwgMjIsIDMwLCAzMiwgMzMsIDE1NywgMTU4LCAxNzIsIDE5OSwgMjA4LCAyMjk0LCA0MTI3LCAyMDYwMiwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDEzNltdID0gewotICAxMTcsIDExOCwgMTIwLCAxMjEsIDEyNSwgMTI2LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM4LCAKLSAgMTQxLCAxNDIsIDE0NiwgMTQ3LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU2LCAxNTcsIDE1OSwgMTYwLCAxNjEsIDE2MiwgCi0gIDE2NCwgMTY1LCAxNjYsIDI3MiwgMjczLCAyNzcsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjg0LCAyODYsIDI5MCwgMjkzLCAyOTQsIAotICAyOTYsIDI5NywgMjk4LCAyOTksIDMwMSwgMzAyLCAzMDMsIDMwNSwgMzA2LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzdbXSA9IHsKLSAgMzIsIDMzLCA2NCwgMjcyLCAyNzMsIDI3NywgMjc5LCAyODAsIDI4MSwgMjgyLCAyODQsIDI4NiwgMjkwLCAyOTMsIDI5NCwgMjk2LCAKLSAgMjk3LCAyOTgsIDI5OSwgMzAxLCAzMDIsIDMwMywgMzA1LCAzMDYsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIAotICA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTM4W10gPSB7Ci0gIDExNiwgMTE4LCAxMTksIDEyMSwgMTUwLCAxNTEsIDE2NiwgMjcyLCAyNzMsIDI5MywgMjk0LCAyOTYsIDI5NywgMzA2LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxMzlbXSA9IHsKLSAgMzIsIDMzLCAxNjIsIDI3MiwgMjczLCAyOTMsIDI5NCwgMjk2LCAyOTcsIDMwNiwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgCi0gIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNDBbXSA9IHsKLSAgMzIsIDMzLCAxMTgsIDEyMSwgMTI2LCAxMjcsIDEzMCwgMTMyLCAxMzQsIDEzNiwgMTM4LCAxMzksIDE0MSwgMTQ1LCAxNDYsIDE0OCwgCi0gIDE0OSwgMTUwLCAxNTEsIDE1MywgMTU0LCAxNTYsIDE1OCwgMTU5LCAxNjEsIDE2NSwgMTY2LCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCAKLSAgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE0MVtdID0gewotICAzMiwgMzMsIDExOCwgMTIxLCAxNTAsIDE1MSwgMTY2LCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTQyW10gPSB7Ci0gIDY4LCA2OSwgOTIsIDkzLCAyMzYsIDIzNywgMjUxLCAyNTIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE0M1tdID0gewotICAzMiwgMzMsIDM5LCA1NCwgNjksIDcxLCA3NywgOTAsIDkzLCAxNDIsIDE2NywgMjM2LCAyMzcsIDI1MSwgMjUyLCAyMTI5LCAyMTMwLCAKLSAgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE0NFtdID0gewotICAzMiwgMzMsIDM5LCA1NCwgNjksIDcxLCA5MCwgOTMsIDk1LCA5NywgMTQyLCAxNjcsIDIzNiwgMjM3LCAyNTEsIDI1MiwgMjEyOSwgCi0gIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNDVbXSA9IHsKLSAgMTI0NTUsIDEyNDU2LCAxMjU5NSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTQ2W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMTI1OTUsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNDdbXSA9IHsKLSAgNjIxMCwgNjIxMSwgNjM3OCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTQ4W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgNjM3OCwgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE0OVtdID0gewotICA2MjI4LCA2MzkxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNTBbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCA0MTI3LCA2MzkxLCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTUxW10gPSB7Ci0gIDYyNDYsIDYyNDcsIDYyNDgsIDYyNDksIDY0MDIsIDY0MDQsIDg0NTEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE1MltdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDYyNDksIDY0MDMsIDY0MDQsIDgyOTUsIAotICA4NDUwLCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTUzW10gPSB7Ci0gIDYyNTAsIDYyNTEsIDY0MDUsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE1NFtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDY0MDUsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNTVbXSA9IHsKLSAgNjI1MiwgNjQwNiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTU2W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgNjQwNiwgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE1N1tdID0gewotICAxMDM0MSwgMTA0OTcsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE1OFtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDEwNDk3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTU5W10gPSB7Ci0gIDY4LCA2OSwgNzMsIDc0LCA5MiwgOTMsIDIzNiwgMjM3LCAyMzksIDI0MCwgMjUxLCAyNTIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE2MFtdID0gewotICAzMiwgMzMsIDM5LCA2OSwgNzEsIDc0LCA3NywgOTAsIDkzLCAxNDIsIDE2NywgMjM2LCAyMzcsIDIzOSwgMjQxLCAyNTEsIDI1MiwgCi0gIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNjFbXSA9IHsKLSAgNjgsIDY5LCA5MiwgOTMsIDk1LCA5NiwgMjM2LCAyMzcsIDI1MSwgMjUyLCAyNTMsIDI1NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTYyW10gPSB7Ci0gIDMyLCAzMywgMzksIDU0LCA2OSwgNzEsIDkwLCA5MywgOTUsIDk3LCAxNDIsIDE2NywgMjM2LCAyMzcsIDI1MSwgMjUyLCAyNTMsIAotICAyNTQsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNjNbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAxMjQ1NiwgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE2NFtdID0gewotICAzMiwgMzMsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIDQxMjcsIDYyMTAsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNjVbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCA2MjI4LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTY2W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgNjI0OCwgODI5NCwgMjA2MDIsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNjdbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCA2MjUwLCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTY4W10gPSB7Ci0gIDMyLCAzMywgMTIzLCAxNjIsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIDQxMjcsIDYyNTEsIDYyNTIsIAotICAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTY5W10gPSB7Ci0gIDMyLCAzMywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgMTAzNDEsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNzBbXSA9IHsKLSAgMzIsIDMzLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCA2MTc4LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTcxW10gPSB7Ci0gIDY4LCA3MCwgNzEsIDg5LCA5MCwgOTEsIDIzNSwgMjM2LCAyNTAsIDI1MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTcyW10gPSB7Ci0gIDMyLCAzMywgNjksIDcwLCA3NCwgNzYsIDkxLCA5MywgOTUsIDk4LCAxNjcsIDIzNSwgMjM3LCAyNTAsIDI1MiwgMjEyOSwgMjEzMCwgCi0gIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNzNbXSA9IHsKLSAgNjgsIDcwLCA3MSwgNzIsIDg5LCA5MCwgOTEsIDk0LCAyMzUsIDIzNiwgMjM4LCAyNTAsIDI1MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTc0W10gPSB7Ci0gIDMyLCAzMywgNjksIDcwLCA3MiwgNzQsIDc2LCA5MSwgOTMsIDk0LCA5NSwgOTgsIDE2NywgMjM1LCAyMzcsIDIzOCwgMjUwLCAyNTIsIAotICAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTc1W10gPSB7Ci0gIDY4LCA3MCwgNzEsIDc1LCA3NiwgNzcsIDg5LCA5MCwgOTEsIDIzNSwgMjM2LCAyNDEsIDI0MiwgMjUwLCAyNTEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE3NltdID0gewotICAzMiwgMzMsIDY5LCA3MCwgNzQsIDc2LCA5MSwgOTMsIDE2NywgMjM1LCAyMzcsIDI0MCwgMjQyLCAyNTAsIDI1MiwgMjEyOSwgMjEzMCwgCi0gIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxNzdbXSA9IHsKLSAgNjgsIDcwLCA3MSwgODksIDkwLCA5MSwgOTcsIDk4LCA5OSwgMjM1LCAyMzYsIDI1MCwgMjUxLCAyNTQsIDI1NSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTc4W10gPSB7Ci0gIDMyLCAzMywgNjksIDcwLCA5MSwgOTMsIDk1LCA5OCwgMTY3LCAyMzUsIDIzNywgMjUwLCAyNTIsIDI1MywgMjU1LCAyMTI5LCAyMTMwLCAKLSAgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE3OVtdID0gewotICAzMiwgMzMsIDM4LCA2MiwgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTgwW10gPSB7Ci0gIDMyLCAzMywgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTgxW10gPSB7Ci0gIDMyLCAzMywgNjgsIDczLCA3NSwgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTgyW10gPSB7Ci0gIDMyLCAzMywgNjgsIDczLCA3NSwgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE4M1tdID0gewotICAzMiwgMzMsIDE0NSwgMTY0LCAyMTI2LCAyMTI3LCAyMTI4LCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCA0MTI3LCAKLSAgMTY1MTMsIDE2NTE1LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTg0W10gPSB7Ci0gIDMyLCAzMywgNjgsIDczLCA3NSwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE4NVtdID0gewotICAzMiwgMzMsIDY5LCA3MCwgOTEsIDIzNSwgMjM3LCAyNTAsIDI1MiwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgCi0gIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxODZbXSA9IHsKLSAgMzIsIDMzLCA2NywgNjgsIDczLCA3NSwgMTAwLCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgMTI3LCAKLSAgMTI4LCAxMzUsIDE1MiwgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE4N1tdID0gewotICAzMiwgMzMsIDM2LCA2NywgNjgsIDczLCA3NSwgMTAwLCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgMTI3LCAKLSAgMTI4LCAxMzUsIDEzNywgMTUyLCAxNjcsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIDQxMjcsIDIwNjAyLCAKLSAgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTg4W10gPSB7Ci0gIDAsIDE3MCwgMjEzMSwgMjI5NCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTg5W10gPSB7Ci0gIDAsIDMyLCAzMywgNjcsIDY4LCA3MywgNzUsIDEwMCwgMTAyLCAxMTYsIDExNywgMTE5LCAxMjAsIDEyMywgMTI0LCAxMjUsIDEyNywgCi0gIDEyOCwgMTM1LCAxNTIsIDE2NywgMTcwLCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE5MFtdID0gewotICAwLCAzMiwgMzMsIDM2LCA2NywgNjgsIDczLCA3NSwgMTAwLCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgCi0gIDEyNywgMTI4LCAxMzUsIDEzNywgMTUyLCAxNjcsIDE3MCwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgCi0gIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOTFbXSA9IHsKLSAgMjMsIDMyLCAzMywgNjcsIDY4LCA3MywgNzUsIDEwMCwgMTAyLCAxMTYsIDExNywgMTE5LCAxMjAsIDEyMywgMTI0LCAxMjUsIDEyNywgCi0gIDEyOCwgMTM1LCAxNTIsIDE2NywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgMjA2MDIsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOTJbXSA9IHsKLSAgMCwgMTcwLCAyMjk0LCAyNjcwNiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTkzW10gPSB7Ci0gIDIzLCAyMDEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE5NFtdID0gewotICAyMDEsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDE5NVtdID0gewotICAwLCAxMDAsIDE3MCwgMjU2LCAyMTMxLCAyMjk0LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOTZbXSA9IHsKLSAgMCwgMywgMzIsIDMzLCA2NywgNjgsIDczLCA3NSwgMTAwLCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgCi0gIDEyNywgMTI4LCAxMzUsIDE1MiwgMTY3LCAxNzAsIDI1NiwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgCi0gIDQxMjcsIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOTdbXSA9IHsKLSAgMCwgMzIsIDMzLCA2NywgNjgsIDczLCA3NSwgMTAwLCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgMTI3LCAKLSAgMTI4LCAxMzUsIDE1MiwgMTY3LCAxNzAsIDI1NiwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5NCwgNDEyNywgCi0gIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAxOThbXSA9IHsKLSAgMzIsIDMzLCAyMTI2LCAyMTI3LCAyMTI4LCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAxNjUxMywgMTY1MTUsIDIwNjAyLCAKLSAgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMTk5W10gPSB7Ci0gIDMyLCAzMywgNjcsIDY4LCA3MywgNzUsIDEwMCwgMTAyLCAxMTYsIDExNywgMTE5LCAxMjAsIDEyMywgMTI0LCAxMjUsIDEyNywgCi0gIDEyOCwgMTM1LCAxNTIsIDE2NywgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgMTY1MTMsIAotICAxNjUxNSwgMTg3MjQsIDE4NzI2LCAxODcyNywgMTg3MjksIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyMDBbXSA9IHsKLSAgMzIsIDMzLCAzNiwgNjcsIDY4LCA3MywgNzUsIDEwMCwgMTAyLCAxMTYsIDExNywgMTE5LCAxMjAsIDEyMywgMTI0LCAxMjUsIDEyNywgCi0gIDEyOCwgMTM1LCAxMzcsIDE1MiwgMTY3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjkyLCA0MTI3LCAxNjUxMywgCi0gIDE2NTE1LCAxODcyNCwgMTg3MjYsIDE4NzI3LCAxODcyOSwgMjA2MDIsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIwMVtdID0gewotICAwLCAxNzAsIDIxMjcsIDIyOTIsIDE4NTgyLCAxODU4MywgMTg3MjQsIDE4NzI1LCAxODcyNywgMTg3MjgsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIwMltdID0gewotICAwLCAzMiwgMzMsIDY3LCA2OCwgNzMsIDc1LCAxMDAsIDEwMiwgMTE2LCAxMTcsIDExOSwgMTIwLCAxMjMsIDEyNCwgMTI1LCAxMjcsIAotICAxMjgsIDEzNSwgMTUyLCAxNjcsIDE3MCwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI5MiwgNDEyNywgMTY1MTMsIAotICAxNjUxNSwgMTg3MjQsIDE4NzI2LCAxODcyNywgMTg3MjksIDIwNjAyLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyMDNbXSA9IHsKLSAgMCwgMzIsIDMzLCAzNiwgNjcsIDY4LCA3MywgNzUsIDEwMCwgMTAyLCAxMTYsIDExNywgMTE5LCAxMjAsIDEyMywgMTI0LCAxMjUsIAotICAxMjcsIDEyOCwgMTM1LCAxMzcsIDE1MiwgMTY3LCAxNzAsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTIsIAotICA0MTI3LCAxNjUxMywgMTY1MTUsIDE4NzI0LCAxODcyNiwgMTg3MjcsIDE4NzI5LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjA0W10gPSB7Ci0gIDAsIDE3MCwgMjEyOCwgMjI5MiwgMTg1ODIsIDE4NTgzLCAxODcyNCwgMTg3MjUsIDE4NzI3LCAxODcyOCwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjA1W10gPSB7Ci0gIDAsIDEwMCwgMTcwLCAyNTYsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIwNltdID0gewotICAwLCAzMiwgMzMsIDY3LCA2OCwgNzMsIDc1LCAxMDIsIDExNiwgMTE3LCAxMTksIDEyMCwgMTIzLCAxMjQsIDEyNSwgMTI3LCAxMjgsIAotICAxMzUsIDE1MiwgMTY3LCAxNzAsIDI1NiwgMjEyOSwgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgNDEyNywgMjA2MDIsIAotICAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyMDdbXSA9IHsKLSAgNjcsIDEyMywgMTM3LCAyMTU3LCAyMTU4LCAyMTYxLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyMDhbXSA9IHsKLSAgNjcsIDEyMywgMTI0LCAxMjgsIDEzNywgMjE1NywgMjE1OCwgMjE2MSwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjA5W10gPSB7Ci0gIDMyLCAzMywgNjcsIDEyMywgMTM3LCAyMTI5LCAyMTMwLCAyMTMxLCAyMTU3LCAyMTU4LCAyMTYxLCAyMjk0LCA0MTI3LCAyMDYwMiwgCi0gIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIxMFtdID0gewotICAzMiwgMzMsIDY3LCAxMjMsIDEyNCwgMTI4LCAxMzcsIDIxMjksIDIxMzAsIDIxMzEsIDIxNTcsIDIxNTgsIDIxNjEsIDIyOTQsIAotICA0MTI3LCAyMDYwMiwgCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgZGVwMjExW10gPSB7Ci0gIDIxNTcsIDIxNTgsIDIxNTksIDIxNjAsIDIxNjEsIDIxNjIsIDIxNjMsIAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGRlcDIxMltdID0gewotICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNywgMTksIDIwLCAyMSwgMjIsIDIzLCAKLSAgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE4MCwgMTgxLCAxODMsIDE4NCwgMTg2LCAxODcsIDE4OSwgCi0gIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk1LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwNjQsIDIwNzMsIDIxMzEsIDIyNDIsIDIyNTEsIAotICAyMjk0LCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBkZXAyMTNbXSA9IHsKLSAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTcsIDE4LCAxOSwgMjEsIDIyLCAyMywgCi0gIDMyLCAzMywgMTIzLCAxNjAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxODAsIDE4MSwgMTgzLCAxODQsIAotICAxODYsIDE4NywgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMCwgMjAxLCAyMDY0LCAyMDczLCAyMTI5LCAKLSAgMjEzMCwgMjEzMSwgMjE1NywgMjE1OCwgMjE2MSwgMjI0MiwgMjI1MSwgMjI5NCwgNDEyNywgMjA2MDIsIAotfTsKLQotI2RlZmluZSBORUxTKFgpIChzaXplb2YoWCkvc2l6ZW9mKFhbMF0pKQotc3RhdGljIGNvbnN0IHN0cnVjdCBpYTY0X29wY29kZV9kZXBlbmRlbmN5Ci1vcF9kZXBlbmRlbmNpZXNbXSA9IHsKLSAgeyBORUxTKGRlcDEpLCBkZXAxLCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMiksIGRlcDIsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgMCwgTlVMTCwgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDMpLCBkZXAzLCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwNSksIGRlcDUsIE5FTFMoZGVwNCksIGRlcDQsIH0sCi0gIHsgTkVMUyhkZXA2KSwgZGVwNiwgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDgpLCBkZXA4LCBORUxTKGRlcDcpLCBkZXA3LCB9LAotICB7IE5FTFMoZGVwMTApLCBkZXAxMCwgTkVMUyhkZXA5KSwgZGVwOSwgfSwKLSAgeyBORUxTKGRlcDEyKSwgZGVwMTIsIE5FTFMoZGVwMTEpLCBkZXAxMSwgfSwKLSAgeyBORUxTKGRlcDE0KSwgZGVwMTQsIE5FTFMoZGVwMTMpLCBkZXAxMywgfSwKLSAgeyBORUxTKGRlcDE2KSwgZGVwMTYsIE5FTFMoZGVwMTUpLCBkZXAxNSwgfSwKLSAgeyBORUxTKGRlcDE4KSwgZGVwMTgsIE5FTFMoZGVwMTcpLCBkZXAxNywgfSwKLSAgeyBORUxTKGRlcDIwKSwgZGVwMjAsIE5FTFMoZGVwMTkpLCBkZXAxOSwgfSwKLSAgeyBORUxTKGRlcDIyKSwgZGVwMjIsIE5FTFMoZGVwMjEpLCBkZXAyMSwgfSwKLSAgeyBORUxTKGRlcDI0KSwgZGVwMjQsIE5FTFMoZGVwMjMpLCBkZXAyMywgfSwKLSAgeyBORUxTKGRlcDI2KSwgZGVwMjYsIE5FTFMoZGVwMjUpLCBkZXAyNSwgfSwKLSAgeyBORUxTKGRlcDI4KSwgZGVwMjgsIE5FTFMoZGVwMjcpLCBkZXAyNywgfSwKLSAgeyBORUxTKGRlcDI5KSwgZGVwMjksIE5FTFMoZGVwMTMpLCBkZXAxMywgfSwKLSAgeyBORUxTKGRlcDMxKSwgZGVwMzEsIE5FTFMoZGVwMzApLCBkZXAzMCwgfSwKLSAgeyBORUxTKGRlcDMyKSwgZGVwMzIsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAzMyksIGRlcDMzLCBORUxTKGRlcDEzKSwgZGVwMTMsIH0sCi0gIHsgTkVMUyhkZXAzNSksIGRlcDM1LCBORUxTKGRlcDM0KSwgZGVwMzQsIH0sCi0gIHsgTkVMUyhkZXAzNyksIGRlcDM3LCBORUxTKGRlcDM2KSwgZGVwMzYsIH0sCi0gIHsgTkVMUyhkZXAzOSksIGRlcDM5LCBORUxTKGRlcDM4KSwgZGVwMzgsIH0sCi0gIHsgTkVMUyhkZXA0MCksIGRlcDQwLCBORUxTKGRlcDMwKSwgZGVwMzAsIH0sCi0gIHsgTkVMUyhkZXA0MiksIGRlcDQyLCBORUxTKGRlcDQxKSwgZGVwNDEsIH0sCi0gIHsgTkVMUyhkZXA0NCksIGRlcDQ0LCBORUxTKGRlcDQzKSwgZGVwNDMsIH0sCi0gIHsgTkVMUyhkZXA0NiksIGRlcDQ2LCBORUxTKGRlcDQ1KSwgZGVwNDUsIH0sCi0gIHsgTkVMUyhkZXA0OCksIGRlcDQ4LCBORUxTKGRlcDQ3KSwgZGVwNDcsIH0sCi0gIHsgTkVMUyhkZXA1MCksIGRlcDUwLCBORUxTKGRlcDQ5KSwgZGVwNDksIH0sCi0gIHsgTkVMUyhkZXA1MiksIGRlcDUyLCBORUxTKGRlcDUxKSwgZGVwNTEsIH0sCi0gIHsgTkVMUyhkZXA1NCksIGRlcDU0LCBORUxTKGRlcDUzKSwgZGVwNTMsIH0sCi0gIHsgTkVMUyhkZXA1NSksIGRlcDU1LCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwNTcpLCBkZXA1NywgTkVMUyhkZXA1NiksIGRlcDU2LCB9LAotICB7IE5FTFMoZGVwNTkpLCBkZXA1OSwgTkVMUyhkZXA1OCksIGRlcDU4LCB9LAotICB7IE5FTFMoZGVwNjEpLCBkZXA2MSwgTkVMUyhkZXA2MCksIGRlcDYwLCB9LAotICB7IE5FTFMoZGVwNjMpLCBkZXA2MywgTkVMUyhkZXA2MiksIGRlcDYyLCB9LAotICB7IE5FTFMoZGVwNjQpLCBkZXA2NCwgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDY2KSwgZGVwNjYsIE5FTFMoZGVwNjUpLCBkZXA2NSwgfSwKLSAgeyBORUxTKGRlcDY4KSwgZGVwNjgsIE5FTFMoZGVwNjcpLCBkZXA2NywgfSwKLSAgeyBORUxTKGRlcDcwKSwgZGVwNzAsIE5FTFMoZGVwNjkpLCBkZXA2OSwgfSwKLSAgeyBORUxTKGRlcDcxKSwgZGVwNzEsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXA3MiksIGRlcDcyLCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwNzMpLCBkZXA3MywgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDc0KSwgZGVwNzQsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXA3NiksIGRlcDc2LCBORUxTKGRlcDc1KSwgZGVwNzUsIH0sCi0gIHsgTkVMUyhkZXA3OCksIGRlcDc4LCBORUxTKGRlcDc3KSwgZGVwNzcsIH0sCi0gIHsgTkVMUyhkZXA4MCksIGRlcDgwLCBORUxTKGRlcDc5KSwgZGVwNzksIH0sCi0gIHsgTkVMUyhkZXA4MiksIGRlcDgyLCBORUxTKGRlcDgxKSwgZGVwODEsIH0sCi0gIHsgTkVMUyhkZXA4NCksIGRlcDg0LCBORUxTKGRlcDgzKSwgZGVwODMsIH0sCi0gIHsgTkVMUyhkZXA4NiksIGRlcDg2LCBORUxTKGRlcDg1KSwgZGVwODUsIH0sCi0gIHsgTkVMUyhkZXA4OCksIGRlcDg4LCBORUxTKGRlcDg3KSwgZGVwODcsIH0sCi0gIHsgTkVMUyhkZXA5MCksIGRlcDkwLCBORUxTKGRlcDg5KSwgZGVwODksIH0sCi0gIHsgTkVMUyhkZXA5MiksIGRlcDkyLCBORUxTKGRlcDkxKSwgZGVwOTEsIH0sCi0gIHsgTkVMUyhkZXA5NCksIGRlcDk0LCBORUxTKGRlcDkzKSwgZGVwOTMsIH0sCi0gIHsgTkVMUyhkZXA5NSksIGRlcDk1LCBORUxTKGRlcDQpLCBkZXA0LCB9LAotICB7IE5FTFMoZGVwOTYpLCBkZXA5NiwgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDk3KSwgZGVwOTcsIE5FTFMoZGVwNTEpLCBkZXA1MSwgfSwKLSAgeyBORUxTKGRlcDk4KSwgZGVwOTgsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAxMDApLCBkZXAxMDAsIE5FTFMoZGVwOTkpLCBkZXA5OSwgfSwKLSAgeyBORUxTKGRlcDEwMSksIGRlcDEwMSwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDEwMyksIGRlcDEwMywgTkVMUyhkZXAxMDIpLCBkZXAxMDIsIH0sCi0gIHsgTkVMUyhkZXAxMDUpLCBkZXAxMDUsIE5FTFMoZGVwMTA0KSwgZGVwMTA0LCB9LAotICB7IE5FTFMoZGVwMTA2KSwgZGVwMTA2LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTA3KSwgZGVwMTA3LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTA5KSwgZGVwMTA5LCBORUxTKGRlcDEwOCksIGRlcDEwOCwgfSwKLSAgeyBORUxTKGRlcDExMCksIGRlcDExMCwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDExMSksIGRlcDExMSwgTkVMUyhkZXA0KSwgZGVwNCwgfSwKLSAgeyBORUxTKGRlcDExMiksIGRlcDExMiwgMCwgTlVMTCwgfSwKLSAgeyBORUxTKGRlcDExMyksIGRlcDExMywgTkVMUyhkZXA3KSwgZGVwNywgfSwKLSAgeyBORUxTKGRlcDExNCksIGRlcDExNCwgTkVMUyhkZXA5KSwgZGVwOSwgfSwKLSAgeyBORUxTKGRlcDExNSksIGRlcDExNSwgTkVMUyhkZXAxMSksIGRlcDExLCB9LAotICB7IE5FTFMoZGVwMTE2KSwgZGVwMTE2LCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwMTE4KSwgZGVwMTE4LCBORUxTKGRlcDExNyksIGRlcDExNywgfSwKLSAgeyBORUxTKGRlcDExOSksIGRlcDExOSwgTkVMUyhkZXAxMTcpLCBkZXAxMTcsIH0sCi0gIHsgTkVMUyhkZXAxMjEpLCBkZXAxMjEsIE5FTFMoZGVwMTIwKSwgZGVwMTIwLCB9LAotICB7IE5FTFMoZGVwMTIyKSwgZGVwMTIyLCBORUxTKGRlcDEyMCksIGRlcDEyMCwgfSwKLSAgeyBORUxTKGRlcDEyMyksIGRlcDEyMywgTkVMUyhkZXAxMTcpLCBkZXAxMTcsIH0sCi0gIHsgTkVMUyhkZXAxMjUpLCBkZXAxMjUsIE5FTFMoZGVwMTI0KSwgZGVwMTI0LCB9LAotICB7IE5FTFMoZGVwMTI2KSwgZGVwMTI2LCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwMTI3KSwgZGVwMTI3LCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwMTI4KSwgZGVwMTI4LCAwLCBOVUxMLCB9LAotICB7IE5FTFMoZGVwMTI5KSwgZGVwMTI5LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTMxKSwgZGVwMTMxLCBORUxTKGRlcDEzMCksIGRlcDEzMCwgfSwKLSAgeyBORUxTKGRlcDEzMyksIGRlcDEzMywgTkVMUyhkZXAxMzIpLCBkZXAxMzIsIH0sCi0gIHsgTkVMUyhkZXAxMzUpLCBkZXAxMzUsIE5FTFMoZGVwMTM0KSwgZGVwMTM0LCB9LAotICB7IE5FTFMoZGVwMTM3KSwgZGVwMTM3LCBORUxTKGRlcDEzNiksIGRlcDEzNiwgfSwKLSAgeyBORUxTKGRlcDEzOSksIGRlcDEzOSwgTkVMUyhkZXAxMzgpLCBkZXAxMzgsIH0sCi0gIHsgTkVMUyhkZXAxNDApLCBkZXAxNDAsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxNDEpLCBkZXAxNDEsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxNDMpLCBkZXAxNDMsIE5FTFMoZGVwMTQyKSwgZGVwMTQyLCB9LAotICB7IE5FTFMoZGVwMTQ0KSwgZGVwMTQ0LCBORUxTKGRlcDE0MiksIGRlcDE0MiwgfSwKLSAgeyBORUxTKGRlcDE0NiksIGRlcDE0NiwgTkVMUyhkZXAxNDUpLCBkZXAxNDUsIH0sCi0gIHsgTkVMUyhkZXAxNDgpLCBkZXAxNDgsIE5FTFMoZGVwMTQ3KSwgZGVwMTQ3LCB9LAotICB7IE5FTFMoZGVwMTUwKSwgZGVwMTUwLCBORUxTKGRlcDE0OSksIGRlcDE0OSwgfSwKLSAgeyBORUxTKGRlcDE1MiksIGRlcDE1MiwgTkVMUyhkZXAxNTEpLCBkZXAxNTEsIH0sCi0gIHsgTkVMUyhkZXAxNTQpLCBkZXAxNTQsIE5FTFMoZGVwMTUzKSwgZGVwMTUzLCB9LAotICB7IE5FTFMoZGVwMTU2KSwgZGVwMTU2LCBORUxTKGRlcDE1NSksIGRlcDE1NSwgfSwKLSAgeyBORUxTKGRlcDE1OCksIGRlcDE1OCwgTkVMUyhkZXAxNTcpLCBkZXAxNTcsIH0sCi0gIHsgTkVMUyhkZXAxNjApLCBkZXAxNjAsIE5FTFMoZGVwMTU5KSwgZGVwMTU5LCB9LAotICB7IE5FTFMoZGVwMTYyKSwgZGVwMTYyLCBORUxTKGRlcDE2MSksIGRlcDE2MSwgfSwKLSAgeyBORUxTKGRlcDE2MyksIGRlcDE2MywgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2NCksIGRlcDE2NCwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2NSksIGRlcDE2NSwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2NiksIGRlcDE2NiwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2NyksIGRlcDE2NywgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2OCksIGRlcDE2OCwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE2OSksIGRlcDE2OSwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE3MCksIGRlcDE3MCwgTkVMUyhkZXAwKSwgZGVwMCwgfSwKLSAgeyBORUxTKGRlcDE3MiksIGRlcDE3MiwgTkVMUyhkZXAxNzEpLCBkZXAxNzEsIH0sCi0gIHsgTkVMUyhkZXAxNzQpLCBkZXAxNzQsIE5FTFMoZGVwMTczKSwgZGVwMTczLCB9LAotICB7IE5FTFMoZGVwMTc2KSwgZGVwMTc2LCBORUxTKGRlcDE3NSksIGRlcDE3NSwgfSwKLSAgeyBORUxTKGRlcDE3OCksIGRlcDE3OCwgTkVMUyhkZXAxNzcpLCBkZXAxNzcsIH0sCi0gIHsgTkVMUyhkZXAxNzkpLCBkZXAxNzksIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxODApLCBkZXAxODAsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxODEpLCBkZXAxODEsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxODIpLCBkZXAxODIsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxODMpLCBkZXAxODMsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAxODQpLCBkZXAxODQsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAxODUpLCBkZXAxODUsIE5FTFMoZGVwMTcxKSwgZGVwMTcxLCB9LAotICB7IE5FTFMoZGVwMTg2KSwgZGVwMTg2LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTg3KSwgZGVwMTg3LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTg5KSwgZGVwMTg5LCBORUxTKGRlcDE4OCksIGRlcDE4OCwgfSwKLSAgeyBORUxTKGRlcDE5MCksIGRlcDE5MCwgTkVMUyhkZXAxODgpLCBkZXAxODgsIH0sCi0gIHsgTkVMUyhkZXAxOTEpLCBkZXAxOTEsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAxODkpLCBkZXAxODksIE5FTFMoZGVwMTkyKSwgZGVwMTkyLCB9LAotICB7IE5FTFMoZGVwMTk0KSwgZGVwMTk0LCBORUxTKGRlcDE5MyksIGRlcDE5MywgfSwKLSAgeyBORUxTKGRlcDE5NiksIGRlcDE5NiwgTkVMUyhkZXAxOTUpLCBkZXAxOTUsIH0sCi0gIHsgTkVMUyhkZXAxOTcpLCBkZXAxOTcsIE5FTFMoZGVwMTk1KSwgZGVwMTk1LCB9LAotICB7IE5FTFMoZGVwMTk4KSwgZGVwMTk4LCBORUxTKGRlcDApLCBkZXAwLCB9LAotICB7IE5FTFMoZGVwMTk5KSwgZGVwMTk5LCBORUxTKGRlcDUxKSwgZGVwNTEsIH0sCi0gIHsgTkVMUyhkZXAyMDApLCBkZXAyMDAsIE5FTFMoZGVwNTEpLCBkZXA1MSwgfSwKLSAgeyBORUxTKGRlcDIwMiksIGRlcDIwMiwgTkVMUyhkZXAyMDEpLCBkZXAyMDEsIH0sCi0gIHsgTkVMUyhkZXAyMDMpLCBkZXAyMDMsIE5FTFMoZGVwMjAxKSwgZGVwMjAxLCB9LAotICB7IE5FTFMoZGVwMjAyKSwgZGVwMjAyLCBORUxTKGRlcDIwNCksIGRlcDIwNCwgfSwKLSAgeyBORUxTKGRlcDIwNiksIGRlcDIwNiwgTkVMUyhkZXAyMDUpLCBkZXAyMDUsIH0sCi0gIHsgTkVMUyhkZXAyMDcpLCBkZXAyMDcsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAyMDgpLCBkZXAyMDgsIDAsIE5VTEwsIH0sCi0gIHsgTkVMUyhkZXAyMDkpLCBkZXAyMDksIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAyMTApLCBkZXAyMTAsIE5FTFMoZGVwMCksIGRlcDAsIH0sCi0gIHsgTkVMUyhkZXAyMTEpLCBkZXAyMTEsIE5FTFMoZGVwMTMpLCBkZXAxMywgfSwKLSAgeyBORUxTKGRlcDIxMyksIGRlcDIxMywgTkVMUyhkZXAyMTIpLCBkZXAyMTIsIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlhNjRfY29tcGxldGVyX3RhYmxlCi1jb21wbGV0ZXJfdGFibGVbXSA9IHsKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgODUgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDQxNywgLTEsIDAsIDEsIDkgfSwKLSAgeyAweDAsIDB4MCwgMCwgNDgwLCAtMSwgMCwgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxNDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgNTc5LCAtMSwgMCwgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTczOSwgLTEsIDAsIDEsIDEzIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMTIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA2MyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDYzIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMTYgfSwKLSAgeyAweDEsIDB4MSwgMCwgLTEsIC0xLCAxMywgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE5MTIsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMTE4IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgNDEgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDc1IH0sCi0gIHsgMHgwLCAweDAsIDAsIDE3NzksIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTk1NSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIDE3ODMsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTc4NSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIDE5NjQsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAxOTY3LCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIDE5ODUsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIDE5ODgsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTk5MSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMiB9LAotICB7IDB4MCwgMHgwLCAwLCAxOTk3LCAtMSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTExOCwgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMzcgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDc0IH0sCi0gIHsgMHgwLCAweDAsIDAsIDExNTEsIC0xLCAwLCAxLCAxMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTE2MCwgLTEsIDAsIDEsIDEyMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMTY5LCAtMSwgMCwgMSwgMTIwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDExNzgsIC0xLCAwLCAxLCAxMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTE4NywgLTEsIDAsIDEsIDEyMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMTk2LCAtMSwgMCwgMSwgMTIwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEyMDUsIC0xLCAwLCAxLCAxMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTIxNCwgLTEsIDAsIDEsIDEyMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMjIzLCAtMSwgMCwgMSwgMTIwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEyMzMsIC0xLCAwLCAxLCAxMjAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTI0MywgLTEsIDAsIDEsIDEyMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMjUzLCAtMSwgMCwgMSwgMTIwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEyNjIsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTI2OCwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMjc0LCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEyODAsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTI4NiwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMjkyLCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEyOTgsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTMwNCwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMzEwLCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEzMTYsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTMyMiwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMzI4LCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEzMzQsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM0MCwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMzQ2LCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEzNTIsIC0xLCAwLCAxLCAxMzAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM1OCwgLTEsIDAsIDEsIDEzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMzY0LCAtMSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDEzNjgsIC0xLCAwLCAxLCAxMzYgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM3MiwgLTEsIDAsIDEsIDEzOCB9LAotICB7IDB4MCwgMHgwLCAwLCAxMzc2LCAtMSwgMCwgMSwgMTM4IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgNzYgfSwKLSAgeyAweDAsIDB4MCwgMCwgMjUwLCAtMSwgMCwgMSwgMzcgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDMgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDU5IH0sCi0gIHsgMHgxLCAweDEsIDAsIDkzMywgLTEsIDIwLCAxLCA1OSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDYwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgNjEgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA2MiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDYzIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgNjQgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA4MyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDg0IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgODYgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA4NyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDg4IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgODkgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA5MiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDkzIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgOTQgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA5NSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDk2IH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgOTcgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA5OCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwMSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwMiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwMyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwNCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwNSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwNiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwNyB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDEwOCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDE0MSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDE0MSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDE0MSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDYzIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxNDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAyMjgzLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAyMjg0LCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTc1MSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTc1MiwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDIyOTgsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAyMjk5LCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAyMzAwLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAyMzAxLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAyMzAyLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgMjI4NSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgMjI4NiwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMTQgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCA4MSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDgwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MSwgMHgxLCAwLCAtMSwgLTEsIDEzLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIDIzMDQsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDgxIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NDAsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NDIsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NDQsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NDYsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NDgsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NTAsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NTMsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NTYsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NTksIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjAsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjIsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjMsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjQsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjUsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIDE2NjYsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgNzkgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxMTYgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxMTMgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxMTUgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxMTQgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM3NywgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM3OCwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM3OSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgMTM4MCwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAxIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMSB9LAotICB7IDB4MCwgMHgwLCAwLCAtMSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMCwgLTEsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDAsIC0xLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAxLCAyMTcsIC0xLCAwLCAxLCAxNSB9LAotICB7IDB4MSwgMHgxLCAyLCAtMSwgLTEsIDI3LCAxLCAxNSB9LAotICB7IDB4MCwgMHgwLCAzLCAtMSwgMTA2MiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMywgLTEsIDEwNjMsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxNzQsIDExNDQsIDMzLCAxLCAxMjIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE3NSwgMTE1MywgMzMsIDEsIDEyMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTc2LCAxMTYyLCAzMywgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxNzcsIDExNzEsIDMzLCAxLCAxMjIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE3OCwgMTE4MCwgMzMsIDEsIDEyMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTc5LCAxMTg5LCAzMywgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxODAsIDExOTgsIDMzLCAxLCAxMjIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE4MSwgMTIwNywgMzMsIDEsIDEyMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTgyLCAxMjE2LCAzMywgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxODMsIDEyMjUsIDMzLCAxLCAxMjIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE4NCwgMTIzNSwgMzMsIDEsIDEyMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTg1LCAxMjQ1LCAzMywgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxODYsIDEyNTgsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE4NywgMTI2NCwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTg4LCAxMjcwLCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxODksIDEyNzYsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE5MCwgMTI4MiwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTkxLCAxMjg4LCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxOTIsIDEyOTQsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE5MywgMTMwMCwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTk0LCAxMzA2LCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxOTUsIDEzMTIsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE5NiwgMTMxOCwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMTk3LCAxMzI0LCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIxOTgsIDEzMzAsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjE5OSwgMTMzNiwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMjAwLCAxMzQyLCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIDIyMDEsIDEzNDgsIDMzLCAxLCAxMzIgfSwKLSAgeyAweDEsIDB4MSwgMywgMjIwMiwgMTM1NCwgMzMsIDEsIDEzMiB9LAotICB7IDB4MSwgMHgxLCAzLCAyMjAzLCAxMzYwLCAzMywgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDMsIC0xLCAtMSwgMjcsIDEsIDM3IH0sCi0gIHsgMHgwLCAweDAsIDQsIDE3NTMsIDExMzEsIDAsIDEsIDEyNyB9LAotICB7IDB4MCwgMHgwLCA0LCAxNzU0LCAxMTMzLCAwLCAxLCAxMjcgfSwKLSAgeyAweDAsIDB4MCwgNCwgMTc1NSwgMTEzNSwgMCwgMSwgMTI3IH0sCi0gIHsgMHgwLCAweDAsIDQsIDE3NTYsIDExMzcsIDAsIDEsIDEyNyB9LAotICB7IDB4MCwgMHgwLCA0LCAxNzU3LCAxMTM5LCAwLCAxLCAxMjggfSwKLSAgeyAweDAsIDB4MCwgNCwgMTc1OCwgMTE0MSwgMCwgMSwgMTI4IH0sCi0gIHsgMHgxLCAweDEsIDQsIC0xLCAxMTQ4LCAzMywgMSwgMTI1IH0sCi0gIHsgMHg1LCAweDUsIDQsIDM3NSwgMTE0NywgMzIsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCA0LCAtMSwgMTE1NywgMzMsIDEsIDEyNSB9LAotICB7IDB4NSwgMHg1LCA0LCAzNzYsIDExNTYsIDMyLCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgNCwgLTEsIDExNjYsIDMzLCAxLCAxMjUgfSwKLSAgeyAweDUsIDB4NSwgNCwgMzc3LCAxMTY1LCAzMiwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDQsIC0xLCAxMTc1LCAzMywgMSwgMTI1IH0sCi0gIHsgMHg1LCAweDUsIDQsIDM3OCwgMTE3NCwgMzIsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCA0LCAtMSwgMTE4NCwgMzMsIDEsIDEyNSB9LAotICB7IDB4NSwgMHg1LCA0LCAzNzksIDExODMsIDMyLCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgNCwgLTEsIDExOTMsIDMzLCAxLCAxMjUgfSwKLSAgeyAweDUsIDB4NSwgNCwgMzgwLCAxMTkyLCAzMiwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDQsIC0xLCAxMjAyLCAzMywgMSwgMTI1IH0sCi0gIHsgMHg1LCAweDUsIDQsIDM4MSwgMTIwMSwgMzIsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCA0LCAtMSwgMTIxMSwgMzMsIDEsIDEyNSB9LAotICB7IDB4NSwgMHg1LCA0LCAzODIsIDEyMTAsIDMyLCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgNCwgLTEsIDEyMjAsIDMzLCAxLCAxMjUgfSwKLSAgeyAweDUsIDB4NSwgNCwgMzgzLCAxMjE5LCAzMiwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDQsIC0xLCAxMjMwLCAzMywgMSwgMTI1IH0sCi0gIHsgMHg1LCAweDUsIDQsIDg0OSwgMTIyOCwgMzIsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCA0LCAtMSwgMTI0MCwgMzMsIDEsIDEyNSB9LAotICB7IDB4NSwgMHg1LCA0LCA4NTAsIDEyMzgsIDMyLCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgNCwgLTEsIDEyNTAsIDMzLCAxLCAxMjUgfSwKLSAgeyAweDUsIDB4NSwgNCwgODUxLCAxMjQ4LCAzMiwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDIxLCAxMCwgMTY3NSwgLTEsIDMzLCAxLCA2IH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxMCwgMTY3NiwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgwLCAweDAsIDEwLCAxNjc3LCAtMSwgMCwgMSwgNiB9LAotICB7IDB4MSwgMHgxLCAxMCwgMTY3OCwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgxLCAweDEsIDEwLCAxNjc5LCAtMSwgMzMsIDEsIDYgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDEwLCAxNjgwLCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDEsIDB4MjEsIDEwLCAxNjgxLCAtMSwgMzMsIDEsIDYgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDEwLCAxNjgyLCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzAzLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MDQsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTcwNSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzA2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MDcsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTcwOCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzA5LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MTAsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDIxLCAxMCwgMTY4MywgLTEsIDMzLCAxLCA2IH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxMCwgMTY4NCwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgwLCAweDAsIDEwLCAxNjg1LCAtMSwgMCwgMSwgNiB9LAotICB7IDB4MSwgMHgxLCAxMCwgMTY4NiwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgxLCAweDEsIDEwLCAxNjg3LCAtMSwgMzMsIDEsIDYgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDEwLCAxNjg4LCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDEsIDB4MjEsIDEwLCAxNjg5LCAtMSwgMzMsIDEsIDYgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDEwLCAxNjkwLCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzE5LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MjAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTcyMSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzIyLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MjMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTcyNCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzI1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MjYsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDEwLCAxNjkxLCAtMSwgMzYsIDEsIDY5IH0sCi0gIHsgMHgxMDAwMDAxLCAweDEwMDAwMDEsIDEwLCAxNjkyLCAtMSwgMTIsIDEsIDY5IH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTcyNywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTAsIC0xLCAxNzI5LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxMCwgMTY5MywgLTEsIDM2LCAxLCA2OSB9LAotICB7IDB4MTAwMDAwMSwgMHgxMDAwMDAxLCAxMCwgMTY5NCwgLTEsIDEyLCAxLCA2OSB9LAotICB7IDB4MCwgMHgwLCAxMCwgLTEsIDE3MzEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwLCAtMSwgMTczMywgMCwgMCwgLTEgfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDAsIDB4MCwgMTEsIDE2OTUsIC0xLCAwLCAxLCA2IH0sCi0gIHsgMHgxLCAweDEsIDExLCAxNjk2LCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDIsIDB4MywgMTEsIC0xLCAtMSwgMzcsIDEsIDggfSwKLSAgeyAweDAsIDB4MCwgMTEsIDE2OTcsIC0xLCAwLCAxLCA2IH0sCi0gIHsgMHgxLCAweDEsIDExLCAxNjk4LCAtMSwgMTIsIDEsIDYgfSwKLSAgeyAweDEsIDB4MSwgMTEsIDE2OTksIC0xLCAzMywgMSwgNiB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTEsIDE3MDAsIC0xLCAxMiwgMSwgNiB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MCwgMHgwLCAxMSwgMTcwMSwgLTEsIDAsIDEsIDYgfSwKLSAgeyAweDEsIDB4MSwgMTEsIDE3MDIsIC0xLCAxMiwgMSwgNiB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MCwgMHgwLCAxMSwgMTcxMSwgLTEsIDAsIDEsIDYgfSwKLSAgeyAweDEsIDB4MSwgMTEsIDE3MTIsIC0xLCAxMiwgMSwgNiB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MiwgMHgzLCAxMSwgLTEsIC0xLCAzNywgMSwgOCB9LAotICB7IDB4MCwgMHgwLCAxMSwgMTcxMywgLTEsIDAsIDEsIDYgfSwKLSAgeyAweDEsIDB4MSwgMTEsIDE3MTQsIC0xLCAxMiwgMSwgNiB9LAotICB7IDB4MSwgMHgxLCAxMSwgMTcxNSwgLTEsIDMzLCAxLCA2IH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxMSwgMTcxNiwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgyLCAweDMsIDExLCAtMSwgLTEsIDM3LCAxLCA4IH0sCi0gIHsgMHgyLCAweDMsIDExLCAtMSwgLTEsIDM3LCAxLCA4IH0sCi0gIHsgMHgwLCAweDAsIDExLCAxNzE3LCAtMSwgMCwgMSwgNiB9LAotICB7IDB4MSwgMHgxLCAxMSwgMTcxOCwgLTEsIDEyLCAxLCA2IH0sCi0gIHsgMHgxLCAweDEsIDExLCAtMSwgLTEsIDM2LCAxLCA3MSB9LAotICB7IDB4MSwgMHgxLCAxMSwgLTEsIC0xLCAzNiwgMSwgNzEgfSwKLSAgeyAweDEsIDB4MSwgMTEsIDE3MjgsIC0xLCAzNiwgMSwgNjkgfSwKLSAgeyAweDEwMDAwMDEsIDB4MTAwMDAwMSwgMTEsIDE3MzAsIC0xLCAxMiwgMSwgNjkgfSwKLSAgeyAweDEsIDB4MSwgMTEsIC0xLCAtMSwgMzYsIDEsIDcxIH0sCi0gIHsgMHgxLCAweDEsIDExLCAtMSwgLTEsIDM2LCAxLCA3MSB9LAotICB7IDB4MSwgMHgxLCAxMSwgMTczMiwgLTEsIDM2LCAxLCA2OSB9LAotICB7IDB4MTAwMDAwMSwgMHgxMDAwMDAxLCAxMSwgMTczNCwgLTEsIDEyLCAxLCA2OSB9LAotICB7IDB4MCwgMHgwLCAxMiwgLTEsIC0xLCAwLCAxLCAxNyB9LAotICB7IDB4MCwgMHgwLCAxMiwgLTEsIC0xLCAwLCAxLCAxNyB9LAotICB7IDB4MSwgMHgxLCAxMywgMjU4LCAxMTQ2LCAzNCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDEzLCAyNjAsIDExNTUsIDM0LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTMsIDI2MiwgMTE2NCwgMzQsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxMywgMjY0LCAxMTczLCAzNCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDEzLCAyNjYsIDExODIsIDM0LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTMsIDI2OCwgMTE5MSwgMzQsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxMywgMjcwLCAxMjAwLCAzNCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDEzLCAyNzIsIDEyMDksIDM0LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTMsIDI3NCwgMTIxOCwgMzQsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxMywgMjc2LCAxMjI3LCAzNCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDEzLCAyNzgsIDEyMzcsIDM0LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTMsIDI4MCwgMTI0NywgMzQsIDEsIDEyMCB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYxOCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MTksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjIwLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYyMSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MjIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjIzLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYyNCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MjUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjI2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYyNywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MjgsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjI5LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYzMCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MzEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjMyLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYzMywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MzQsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjM1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYzNiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2MzcsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjM4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDYzOSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2NDAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjQxLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDY0MiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2NDMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjQ0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxOSwgLTEsIDY0NSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTksIC0xLCA2NDYsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE5LCAtMSwgNjQ3LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMCwgLTEsIDIyNTIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIwLCAtMSwgMjI1MywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjAsIC0xLCAyMjY4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMCwgLTEsIDIyNjksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIwLCAtMSwgMjI3NCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjAsIC0xLCAyMjc1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMSwgNjU0LCAyMjY0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMSwgNjU1LCAyMjY2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMywgLTEsIDIyNjIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzLCAtMSwgMjI2MywgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIDk5NSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDEwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDEwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDEwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDEwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDExIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDExIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDExIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDExIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxOCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTggfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDE4IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxOCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTggfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDE4IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxOCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTggfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDE4IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAxOCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMTggfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDE4IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIDEwMTYsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjEgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIyIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMiB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjIgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIyIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMiB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjIgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIyIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMiB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjIgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIyIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMiB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjIgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIzIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgMTA0OSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzNSwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzUsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAtMSwgLTEsIDM1LCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyNCwgLTEsIC0xLCAzMywgMSwgNzMgfSwKLSAgeyAweDEsIDB4MSwgMjQsIC0xLCAtMSwgMzMsIDEsIDczIH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY0LCAxMTQ5LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY1LCAxMTU4LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY2LCAxMTY3LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY3LCAxMTc2LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY4LCAxMTg1LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDY5LCAxMTk0LCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDcwLCAxMjAzLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDcxLCAxMjEyLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDcyLCAxMjIxLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDczLCAxMjMxLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc0LCAxMjQxLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc1LCAxMjUxLCAzNSwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc2LCAxMjYwLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc3LCAxMjY2LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc4LCAxMjcyLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDc5LCAxMjc4LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDgwLCAxMjg0LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDgxLCAxMjkwLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDgyLCAxMjk2LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDgzLCAxMzAyLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg0LCAxMzA4LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg1LCAxMzE0LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg2LCAxMzIwLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg3LCAxMzI2LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg4LCAxMzMyLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDg5LCAxMzM4LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDkwLCAxMzQ0LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDkxLCAxMzUwLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDkyLCAxMzU2LCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDI0LCAxMDkzLCAxMzYyLCAzNSwgMSwgMTM0IH0sCi0gIHsgMHgwLCAweDAsIDMyLCAyMjQ2LCAyMjQ0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAzMiwgMjI0OSwgMjI0NywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMzIsIDIyNTUsIDIyNTQsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDMyLCAyMjU3LCAyMjU2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAzMiwgMjI3MSwgMjI3MCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMzIsIDIyNzMsIDIyNzIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDM0LCAtMSwgMjI2NSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMzQsIC0xLCAyMjY3LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE4MjMsIDM3LCAxLCAyNiB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE4NTgsIDM3LCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAzNywgLTEsIDE4NjEsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDM3LCAtMSwgLTEsIDM3LCAxLCAyNiB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE4NjYsIDM3LCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAzNywgLTEsIDE4NjksIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDM3LCAtMSwgLTEsIDM3LCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAzNywgLTEsIDE4NzIsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDM3LCAtMSwgLTEsIDM3LCAxLCAyNiB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE4NzUsIDM3LCAxLCAyNiB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE4NzgsIDM3LCAxLCAyNiB9LAotICB7IDB4MSwgMHgxLCAzNywgLTEsIDE5MDgsIDM3LCAxLCAyNiB9LAotICB7IDB4MywgMHgzLCAzNywgLTEsIC0xLCAzMCwgMSwgMTI5IH0sCi0gIHsgMHgwLCAweDAsIDM3LCA5MDksIC0xLCAwLCAxLCA5MCB9LAotICB7IDB4MCwgMHgwLCAzNywgLTEsIC0xLCAwLCAxLCA5OSB9LAotICB7IDB4MCwgMHgwLCAzNywgOTE1LCAtMSwgMCwgMSwgMTExIH0sCi0gIHsgMHgzLCAweDMsIDM3LCAtMSwgLTEsIDMwLCAxLCA1IH0sCi0gIHsgMHgwLCAweDAsIDM3LCA5MTYsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MCwgMHgwLCAzOSwgLTEsIDc4NiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA3OTQsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDM5LCA5MTgsIDc5MCwgMCwgMCwgLTEgfSwKLSAgeyAweDMsIDB4MywgMzksIC0xLCA0NDUsIDMzLCAxLCA5IH0sCi0gIHsgMHgxODAwMDAwMSwgMHgxODAwMDAwMSwgMzksIC0xLCA0NTMsIDYsIDEsIDEwIH0sCi0gIHsgMHgzLCAweDMsIDM5LCA5MTksIDQ0OSwgMzMsIDEsIDkgfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA3OTgsIDAsIDAsIC0xIH0sCi0gIHsgMHgzLCAweDMsIDM5LCAtMSwgNDY1LCAzMywgMSwgMTEgfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA4MDIsIDAsIDAsIC0xIH0sCi0gIHsgMHgzLCAweDMsIDM5LCAtMSwgNDc3LCAzMywgMSwgMTggfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA4MDcsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDM5LCAtMSwgODExLCAwLCAwLCAtMSB9LAotICB7IDB4MywgMHgzLCAzOSwgLTEsIDUwMCwgMzMsIDEsIDIwIH0sCi0gIHsgMHgzLCAweDMsIDM5LCAtMSwgNTA0LCAzMywgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA4MTUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDM5LCAtMSwgODE5LCAwLCAwLCAtMSB9LAotICB7IDB4MywgMHgzLCAzOSwgLTEsIDUyNCwgMzMsIDEsIDIxIH0sCi0gIHsgMHgxODAwMDAwMSwgMHgxODAwMDAwMSwgMzksIC0xLCA1MjgsIDYsIDEsIDIxIH0sCi0gIHsgMHgwLCAweDAsIDM5LCAtMSwgODIzLCAwLCAwLCAtMSB9LAotICB7IDB4MywgMHgzLCAzOSwgLTEsIDU0MCwgMzMsIDEsIDIyIH0sCi0gIHsgMHgwLCAweDAsIDM5LCAtMSwgODI3LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAzOSwgLTEsIDgzMSwgMCwgMCwgLTEgfSwKLSAgeyAweDMsIDB4MywgMzksIC0xLCA1NjAsIDMzLCAxLCAyMyB9LAotICB7IDB4MTgwMDAwMDEsIDB4MTgwMDAwMDEsIDM5LCAtMSwgNTY0LCA2LCAxLCAyMyB9LAotICB7IDB4MCwgMHgwLCAzOSwgLTEsIDgzNSwgMCwgMCwgLTEgfSwKLSAgeyAweDMsIDB4MywgMzksIC0xLCA1NzYsIDMzLCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCAzOSwgLTEsIDg0MCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMzksIC0xLCA4NDQsIDAsIDAsIC0xIH0sCi0gIHsgMHgzLCAweDMsIDM5LCAtMSwgNTk5LCAzMywgMSwgMjAgfSwKLSAgeyAweDMsIDB4MywgMzksIC0xLCA2MDMsIDMzLCAxLCAyMCB9LAotICB7IDB4MCwgMHgwLCAzOSwgLTEsIDg0OCwgMCwgMCwgLTEgfSwKLSAgeyAweDMsIDB4MywgMzksIC0xLCA2MTUsIDMzLCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCA0MCwgNjc0LCA3ODUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDQwLCA2NzUsIDc5MywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDY3NiwgNzg5LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MCwgNjc3LCA0NDQsIDM0LCAxLCA5IH0sCi0gIHsgMHgxMDAwMDAwMSwgMHgxMDAwMDAwMSwgNDAsIDY3OCwgNDUyLCA2LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCA0MCwgNjc5LCA0NDgsIDM0LCAxLCA5IH0sCi0gIHsgMHgwLCAweDAsIDQwLCA2ODAsIDc5NywgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgNDAsIDY4MSwgNDY0LCAzNCwgMSwgMTEgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDY4MiwgODAxLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MCwgNjgzLCA0NzYsIDM0LCAxLCAxOCB9LAotICB7IDB4MCwgMHgwLCA0MCwgNjg0LCA4MDYsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDQwLCA2ODUsIDgxMCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgNDAsIDY4NiwgNDk5LCAzNCwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgNDAsIDY4NywgNTAzLCAzNCwgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDY4OCwgODE0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCA0MCwgNjg5LCA4MTgsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDQwLCA2OTAsIDUyMywgMzQsIDEsIDIxIH0sCi0gIHsgMHgxMDAwMDAwMSwgMHgxMDAwMDAwMSwgNDAsIDY5MSwgNTI3LCA2LCAxLCAyMSB9LAotICB7IDB4MCwgMHgwLCA0MCwgNjkyLCA4MjIsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDQwLCA2OTMsIDUzOSwgMzQsIDEsIDIyIH0sCi0gIHsgMHgwLCAweDAsIDQwLCA2OTQsIDgyNiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDY5NSwgODMwLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MCwgNjk2LCA1NTksIDM0LCAxLCAyMyB9LAotICB7IDB4MTAwMDAwMDEsIDB4MTAwMDAwMDEsIDQwLCA2OTcsIDU2MywgNiwgMSwgMjMgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDY5OCwgODM0LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MCwgNjk5LCA1NzUsIDM0LCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCA0MCwgNzAwLCA4MzksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDQwLCA3MDEsIDg0MywgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgNDAsIDcwMiwgNTk4LCAzNCwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgNDAsIDcwMywgNjAyLCAzNCwgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgNDAsIDcwNCwgODQ3LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MCwgNzA1LCA2MTQsIDM0LCAxLCAyNCB9LAotICB7IDB4ODAwMDAxLCAweDgwMDAwMSwgNDAsIC0xLCA5MjMsIDQsIDEsIDE5IH0sCi0gIHsgMHgxLCAweDEsIDQwLCAxNzY5LCA5MjEsIDQsIDEsIDE5IH0sCi0gIHsgMHgxLCAweDEsIDQwLCA3NzEsIDkyNiwgNCwgMSwgMiB9LAotICB7IDB4MiwgMHgzLCA0MCwgLTEsIDkzMSwgMjAsIDEsIDU5IH0sCi0gIHsgMHgxLCAweDEsIDQwLCAxNzcwLCA5MjksIDIxLCAxLCA1OSB9LAotICB7IDB4MCwgMHgwLCA0MSwgLTEsIC0xLCAwLCAxLCA3NyB9LAotICB7IDB4MCwgMHgwLCA0MSwgLTEsIC0xLCAwLCAxLCA3NyB9LAotICB7IDB4MCwgMHgwLCA0MSwgLTEsIC0xLCAwLCAxLCAxMTkgfSwKLSAgeyAweDEsIDB4MSwgNDMsIDEwOTQsIDI4MSwgMzgsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgNDMsIC0xLCAzMjQsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDQzLCAxMDk3LCAyODcsIDM4LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDQzLCAtMSwgMzM2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCA0MywgLTEsIDI5MCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgNDMsIC0xLCAyOTYsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDQzLCAxMTAyLCAyOTcsIDM4LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDQzLCAtMSwgMzQwLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCA0MywgMTEwNSwgMzAzLCAzOCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCA0MywgLTEsIDM1MiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgNDMsIC0xLCAzMDYsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDQzLCAtMSwgMzEyLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCA0MywgOTc4LCAxODMwLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCA0MywgOTc5LCAyMzUxLCAwLCAxLCA1MSB9LAotICB7IDB4MCwgMHgwLCA0MywgOTgwLCAxODgyLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCA0MywgOTgxLCAtMSwgMCwgMSwgNDYgfSwKLSAgeyAweDAsIDB4MCwgNDMsIDg5MywgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgNDMsIDg5NCwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgNDMsIDg5NSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDEsIDB4MSwgNDQsIC0xLCAxMzY2LCAzMCwgMSwgMTM3IH0sCi0gIHsgMHgxLCAweDEsIDQ0LCA3NzYsIDEzNjUsIDMwLCAxLCAxMzYgfSwKLSAgeyAweDEsIDB4MSwgNDQsIC0xLCAxMzcwLCAzMCwgMSwgMTM5IH0sCi0gIHsgMHgxLCAweDEsIDQ0LCA3NzcsIDEzNjksIDMwLCAxLCAxMzggfSwKLSAgeyAweDEsIDB4MSwgNDQsIC0xLCAxMzc0LCAzMCwgMSwgMTM5IH0sCi0gIHsgMHgxLCAweDEsIDQ0LCA3NzgsIDEzNzMsIDMwLCAxLCAxMzggfSwKLSAgeyAweDMsIDB4MywgNDUsIC0xLCA5MjcsIDMsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgNDYsIDE3OTAsIC0xLCAzMCwgMSwgMTI5IH0sCi0gIHsgMHgxLCAweDEsIDQ2LCAxODIxLCAtMSwgMzAsIDEsIDUgfSwKLSAgeyAweDAsIDB4MCwgNDgsIC0xLCAtMSwgMCwgMSwgMzcgfSwKLSAgeyAweDAsIDB4MCwgNDgsIC0xLCAtMSwgMCwgMSwgMzcgfSwKLSAgeyAweDEsIDB4MSwgNTUsIC0xLCAxMzY3LCAzMSwgMSwgMTM3IH0sCi0gIHsgMHgxLCAweDEsIDU1LCAtMSwgMTM3MSwgMzEsIDEsIDEzOSB9LAotICB7IDB4MSwgMHgxLCA1NSwgLTEsIDEzNzUsIDMxLCAxLCAxMzkgfSwKLSAgeyAweDAsIDB4MCwgNTUsIC0xLCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MiwgMHgzLCA1NSwgLTEsIC0xLCAyNywgMSwgMiB9LAotICB7IDB4MSwgMHgxLCA1NSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCA2NCwgMTIsIDQxNSwgMCwgMSwgOSB9LAotICB7IDB4MCwgMHgwLCA2NCwgOTk2LCA0MTgsIDAsIDEsIDkgfSwKLSAgeyAweDEsIDB4MSwgNjQsIDk5NywgNDIwLCAzMywgMSwgOSB9LAotICB7IDB4MSwgMHgxLCA2NCwgOTk4LCA0MjIsIDM0LCAxLCA5IH0sCi0gIHsgMHgzLCAweDMsIDY0LCA5OTksIDQyNCwgMzMsIDEsIDkgfSwKLSAgeyAweDAsIDB4MCwgNjQsIDEwMDAsIDQyNiwgMCwgMSwgOSB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAwMSwgNDI4LCAzMywgMSwgOSB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAwMiwgNDMwLCAzNCwgMSwgOSB9LAotICB7IDB4MywgMHgzLCA2NCwgMTAwMywgNDMyLCAzMywgMSwgOSB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAwNCwgNDM0LCA2LCAxLCAxMCB9LAotICB7IDB4ODAwMDAwMSwgMHg4MDAwMDAxLCA2NCwgMTAwNSwgNDM2LCA2LCAxLCAxMCB9LAotICB7IDB4MTAwMDAwMDEsIDB4MTAwMDAwMDEsIDY0LCAxMDA2LCA0MzgsIDYsIDEsIDEwIH0sCi0gIHsgMHgxODAwMDAwMSwgMHgxODAwMDAwMSwgNjQsIDEwMDcsIDQ0MCwgNiwgMSwgMTAgfSwKLSAgeyAweDAsIDB4MCwgNjQsIDEwMDgsIDQ1NCwgMCwgMSwgMTEgfSwKLSAgeyAweDEsIDB4MSwgNjQsIDEwMDksIDQ1NiwgMzMsIDEsIDExIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDEwLCA0NTgsIDM0LCAxLCAxMSB9LAotICB7IDB4MywgMHgzLCA2NCwgMTAxMSwgNDYwLCAzMywgMSwgMTEgfSwKLSAgeyAweDAsIDB4MCwgNjQsIDEwMTIsIDQ2NiwgMCwgMSwgMTggfSwKLSAgeyAweDEsIDB4MSwgNjQsIDEwMTMsIDQ2OCwgMzMsIDEsIDE4IH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDE0LCA0NzAsIDM0LCAxLCAxOCB9LAotICB7IDB4MywgMHgzLCA2NCwgMTAxNSwgNDcyLCAzMywgMSwgMTggfSwKLSAgeyAweDAsIDB4MCwgNjQsIDEzLCA0NzgsIDAsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDE3LCA0ODEsIDAsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDE4LCA0ODMsIDMzLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAxOSwgNDg1LCAzNCwgMSwgMjAgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwMjAsIDQ4NywgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDIxLCA0ODksIDAsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDIyLCA0OTEsIDMzLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAyMywgNDkzLCAzNCwgMSwgMjAgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwMjQsIDQ5NSwgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDI1LCA1MDUsIDAsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDI2LCA1MDcsIDMzLCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAyNywgNTA5LCAzNCwgMSwgMjEgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwMjgsIDUxMSwgMzMsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDI5LCA1MTMsIDYsIDEsIDIxIH0sCi0gIHsgMHg4MDAwMDAxLCAweDgwMDAwMDEsIDY0LCAxMDMwLCA1MTUsIDYsIDEsIDIxIH0sCi0gIHsgMHgxMDAwMDAwMSwgMHgxMDAwMDAwMSwgNjQsIDEwMzEsIDUxNywgNiwgMSwgMjEgfSwKLSAgeyAweDE4MDAwMDAxLCAweDE4MDAwMDAxLCA2NCwgMTAzMiwgNTE5LCA2LCAxLCAyMSB9LAotICB7IDB4MCwgMHgwLCA2NCwgMTAzMywgNTI5LCAwLCAxLCAyMiB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAzNCwgNTMxLCAzMywgMSwgMjIgfSwKLSAgeyAweDEsIDB4MSwgNjQsIDEwMzUsIDUzMywgMzQsIDEsIDIyIH0sCi0gIHsgMHgzLCAweDMsIDY0LCAxMDM2LCA1MzUsIDMzLCAxLCAyMiB9LAotICB7IDB4MCwgMHgwLCA2NCwgMTAzNywgNTQxLCAwLCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTAzOCwgNTQzLCAzMywgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgNjQsIDEwMzksIDU0NSwgMzQsIDEsIDIzIH0sCi0gIHsgMHgzLCAweDMsIDY0LCAxMDQwLCA1NDcsIDMzLCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTA0MSwgNTQ5LCA2LCAxLCAyMyB9LAotICB7IDB4ODAwMDAwMSwgMHg4MDAwMDAxLCA2NCwgMTA0MiwgNTUxLCA2LCAxLCAyMyB9LAotICB7IDB4MTAwMDAwMDEsIDB4MTAwMDAwMDEsIDY0LCAxMDQzLCA1NTMsIDYsIDEsIDIzIH0sCi0gIHsgMHgxODAwMDAwMSwgMHgxODAwMDAwMSwgNjQsIDEwNDQsIDU1NSwgNiwgMSwgMjMgfSwKLSAgeyAweDAsIDB4MCwgNjQsIDEwNDUsIDU2NSwgMCwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgNjQsIDEwNDYsIDU2NywgMzMsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDQ3LCA1NjksIDM0LCAxLCAyNCB9LAotICB7IDB4MywgMHgzLCA2NCwgMTA0OCwgNTcxLCAzMywgMSwgMjQgfSwKLSAgeyAweDAsIDB4MCwgNjQsIDE1LCA1NzcsIDAsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDUwLCA1ODAsIDAsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDUxLCA1ODIsIDMzLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTA1MiwgNTg0LCAzNCwgMSwgMjAgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwNTMsIDU4NiwgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDU0LCA1ODgsIDAsIDEsIDIwIH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDU1LCA1OTAsIDMzLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTA1NiwgNTkyLCAzNCwgMSwgMjAgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwNTcsIDU5NCwgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDY0LCAxMDU4LCA2MDQsIDAsIDEsIDI0IH0sCi0gIHsgMHgxLCAweDEsIDY0LCAxMDU5LCA2MDYsIDMzLCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCA2NCwgMTA2MCwgNjA4LCAzNCwgMSwgMjQgfSwKLSAgeyAweDMsIDB4MywgNjQsIDEwNjEsIDYxMCwgMzMsIDEsIDI0IH0sCi0gIHsgMHgzLCAweDMsIDY1LCAzODQsIDEyMjksIDMzLCAxLCAxMjQgfSwKLSAgeyAweDMsIDB4MywgNjUsIDM4NSwgMTIzOSwgMzMsIDEsIDEyNCB9LAotICB7IDB4MywgMHgzLCA2NSwgMzg2LCAxMjQ5LCAzMywgMSwgMTI0IH0sCi0gIHsgMHgwLCAweDAsIDY1LCAtMSwgMTI1NCwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDY1LCAtMSwgMTI1NSwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDY1LCAtMSwgMTI1NiwgMCwgMSwgMTMwIH0sCi0gIHsgMHgwLCAweDAsIDEwNywgODU5LCAxODU0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMDcsIDg2MCwgMjI4OSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMTA3LCA4NjEsIDE4OTEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEwNywgODYyLCAyMjkzLCAwLCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAxMDksIC0xLCAxODU2LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxMDksIC0xLCAyMjkwLCAyNywgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMTA5LCAtMSwgMTg5MywgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMTA5LCAtMSwgMjI5NCwgMjcsIDEsIDI2IH0sCi0gIHsgMHgwLCAweDAsIDExMCwgODY0LCAtMSwgMCwgMSwgMTEwIH0sCi0gIHsgMHgxLCAweDEsIDExMSwgLTEsIC0xLCAyNywgMSwgMTEwIH0sCi0gIHsgMHgwLCAweDAsIDExMiwgODc3LCAyMzEyLCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDExMiwgOTY5LCAyODUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDExMiwgLTEsIDMzMiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTEyLCA4NzgsIDIzMjAsIDAsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTEyLCAtMSwgMjk0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMTIsIDg3OSwgMjMzMiwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMTIsIDk3NCwgMzAxLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMTIsIC0xLCAzNDgsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDExMiwgMTEwNiwgMjMzOSwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMTIsIC0xLCAzMTAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDExMiwgLTEsIDE4NDAsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDksIDExMiwgLTEsIDIzNTgsIDMzLCAxLCA1MSB9LAotICB7IDB4MSwgMHgxLCAxMTQsIDEwOTUsIDIzMTMsIDM3LCAxLCA0IH0sCi0gIHsgMHgxLCAweDEsIDExNCwgMTA5OCwgMjMyMSwgMzcsIDEsIDQgfSwKLSAgeyAweDEsIDB4MSwgMTE0LCAxMTAzLCAyMzMzLCAzNywgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMTQsIC0xLCAyMzQ0LCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDExNSwgODk2LCAyMzEwLCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDExNSwgOTQ5LCAyODMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDExNSwgOTcwLCAzMzAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDExNSwgLTEsIDIzMTksIDAsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCA5NzIsIDI5MiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCA4OTgsIDIzMzAsIDAsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCA5NTQsIDI5OSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCA5NzUsIDM0NiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCAtMSwgMjMzOCwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMTUsIDk3NywgMzA4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMTUsIDg3NSwgMTgzOCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTE1LCA4NzYsIDIzNTcsIDAsIDEsIDUxIH0sCi0gIHsgMHgxLCAweDEsIDExNSwgLTEsIC0xLCAyNywgMSwgMCB9LAotICB7IDB4MSwgMHgxLCAxMTUsIC0xLCAtMSwgMjcsIDEsIDAgfSwKLSAgeyAweDEsIDB4MSwgMTE1LCAtMSwgLTEsIDI3LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDExNiwgLTEsIDIzMTEsIDM3LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDExNiwgLTEsIDIzMjQsIDAsIDEsIDQgfSwKLSAgeyAweDEsIDB4MSwgMTE2LCAtMSwgMjMzMSwgMzcsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTE2LCAtMSwgMjM0MywgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMTcsIDk0MywgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMTE3LCA5NDQsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDExNywgOTQ1LCAtMSwgMCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxMTcsIDkwNSwgLTEsIDM0LCAxLCAzMCB9LAotICB7IDB4MywgMHgzLCAxMTcsIDkwNiwgLTEsIDM0LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDExOCwgLTEsIC0xLCAzNSwgMSwgMzAgfSwKLSAgeyAweDEsIDB4MSwgMTE4LCAtMSwgLTEsIDM1LCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDExOSwgLTEsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MCwgMHgwLCAxMTksIC0xLCAtMSwgMCwgMSwgNTggfSwKLSAgeyAweDEsIDB4MSwgMTE5LCAtMSwgLTEsIDI3LCAxLCA5MSB9LAotICB7IDB4MCwgMHgwLCAxMTksIC0xLCAtMSwgMCwgMSwgMTAwIH0sCi0gIHsgMHgwLCAweDAsIDExOSwgLTEsIC0xLCAwLCAxLCA2NSB9LAotICB7IDB4MCwgMHgwLCAxMTksIC0xLCAtMSwgMCwgMSwgNjUgfSwKLSAgeyAweDAsIDB4MCwgMTE5LCAtMSwgLTEsIDAsIDEsIDY2IH0sCi0gIHsgMHgwLCAweDAsIDExOSwgLTEsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MSwgMHgxLCAxMTksIC0xLCAtMSwgMjcsIDEsIDExMiB9LAotICB7IDB4MSwgMHgxLCAxMTksIC0xLCAtMSwgMjcsIDEsIDM3IH0sCi0gIHsgMHgwLCAweDAsIDExOSwgLTEsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MCwgMHgwLCAxMjAsIC0xLCAyMjQ1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMjAsIC0xLCAyMjQ4LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxMjEsIC0xLCAtMSwgMzUsIDEsIDE5IH0sCi0gIHsgMHgxLCAweDEsIDEyMSwgLTEsIC0xLCAzNSwgMSwgMTkgfSwKLSAgeyAweDEsIDB4MSwgMTIxLCAtMSwgLTEsIDM1LCAxLCAxOSB9LAotICB7IDB4MSwgMHgxLCAxMjEsIC0xLCAtMSwgMzUsIDEsIDE5IH0sCi0gIHsgMHgxLCAweDEsIDEyMSwgLTEsIC0xLCAzNSwgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAxMjEsIC0xLCAtMSwgMzUsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMTIxLCAtMSwgLTEsIDM1LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDEyMSwgLTEsIC0xLCAzNSwgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAxMjEsIC0xLCAtMSwgMjMsIDEsIDU5IH0sCi0gIHsgMHgxLCAweDEsIDEyMSwgLTEsIC0xLCAyMywgMSwgNTkgfSwKLSAgeyAweDEsIDB4MSwgMTIxLCAtMSwgLTEsIDIzLCAxLCA1OSB9LAotICB7IDB4MSwgMHgxLCAxMjEsIC0xLCAtMSwgMjMsIDEsIDU5IH0sCi0gIHsgMHgxLCAweDEsIDEyMSwgNzQxLCAtMSwgMjMsIDEsIDU5IH0sCi0gIHsgMHg5LCAweDksIDEyMSwgNzQyLCAtMSwgMjAsIDEsIDU5IH0sCi0gIHsgMHgwLCAweDAsIDEyNSwgMTc0MCwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMTI1LCAxNzQxLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MSwgMHgxLCAxMjUsIC0xLCAtMSwgMjgsIDEsIDMwIH0sCi0gIHsgMHgxLCAweDEsIDEyNSwgLTEsIC0xLCAyNywgMSwgMzAgfSwKLSAgeyAweDEsIDB4MSwgMTI1LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDEyNSwgLTEsIC0xLCAyOSwgMSwgMCB9LAotICB7IDB4MSwgMHgxLCAxMjUsIC0xLCAtMSwgMjksIDEsIDAgfSwKLSAgeyAweDEsIDB4MSwgMTI1LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDEyNSwgLTEsIC0xLCAwLCAxLCAxMDkgfSwKLSAgeyAweDEsIDB4MSwgMTI1LCAtMSwgLTEsIDI5LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDEyNSwgLTEsIC0xLCAyOSwgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAxMjUsIC0xLCAtMSwgMjksIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMTI1LCA5MDMsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAxMjUsIDk4NywgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMTM4LCA5NjIsIDIzMDgsIDAsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTM4LCA4NjYsIDI4NCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTM4LCA4ODMsIDMyOSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTM4LCAtMSwgMjMxOCwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMzgsIDg4NSwgMjkxLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMzgsIDk2NCwgMjMyOCwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMzgsIDg3MSwgMzAwLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMzgsIDg4OCwgMzQ1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxMzgsIC0xLCAyMzM3LCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDEzOCwgODkwLCAzMDcsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDEzOCwgMjM3NSwgMTgzNCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMTM4LCAyMzc2LCAyMzUzLCAzMywgMSwgNTEgfSwKLSAgeyAweDAsIDB4MCwgMTM4LCAyMzc3LCAxODg0LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxMzgsIDIzNzgsIC0xLCAyOCwgMSwgNDYgfSwKLSAgeyAweDEsIDB4MSwgMTM5LCAtMSwgMjMwOSwgMzcsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTM5LCAtMSwgMjMyMywgMCwgMSwgNCB9LAotICB7IDB4MSwgMHgxLCAxMzksIC0xLCAyMzI5LCAzNywgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxMzksIC0xLCAyMzQyLCAwLCAxLCA0IH0sCi0gIHsgMHgxLCAweDEsIDE0MiwgNzQwLCA5MjUsIDMsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMTQzLCAxNzQyLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMTQ0LCA3NDYsIDIzMDUsIDAsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTQ0LCAtMSwgMjg2LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxNDQsIDg2NywgMzMxLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxNDQsIDc0OCwgMjMxNSwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxNDQsIDg2OSwgMjkzLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxNDQsIDc1MiwgMjMyNSwgMCwgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxNDQsIC0xLCAzMDIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE0NCwgODcyLCAzNDcsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE0NCwgNzU0LCAyMzM1LCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDE0NCwgODc0LCAzMDksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE0NCwgOTU4LCAxODMyLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxNDQsIDk1OSwgMjM1MiwgMzYsIDEsIDUxIH0sCi0gIHsgMHgwLCAweDAsIDE0NCwgOTYwLCAxODgzLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxNDQsIDk2MSwgLTEsIDI3LCAxLCA0NiB9LAotICB7IDB4MSwgMHgxLCAxNDUsIC0xLCAyMzA3LCAzNywgMSwgNCB9LAotICB7IDB4MSwgMHgxLCAxNDUsIC0xLCAyMzE3LCAzNywgMSwgNCB9LAotICB7IDB4MSwgMHgxLCAxNDUsIC0xLCAyMzI3LCAzNywgMSwgNCB9LAotICB7IDB4MCwgMHgwLCAxNDUsIC0xLCAyMzQxLCAwLCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDE0NiwgLTEsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAxNDYsIDkwNCwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMTQ3LCAtMSwgLTEsIDAsIDEsIDM3IH0sCi0gIHsgMHgwLCAweDAsIDE0NywgLTEsIC0xLCAwLCAxLCA1OCB9LAotICB7IDB4MCwgMHgwLCAxNDcsIC0xLCAyMzQ1LCAwLCAxLCA1NSB9LAotICB7IDB4MCwgMHgwLCAxNDcsIC0xLCAtMSwgMCwgMSwgNzggfSwKLSAgeyAweDAsIDB4MCwgMTQ3LCAtMSwgLTEsIDAsIDEsIDc4IH0sCi0gIHsgMHgwLCAweDAsIDE0NywgLTEsIC0xLCAwLCAxLCA4MiB9LAotICB7IDB4MCwgMHgwLCAxNDcsIC0xLCAtMSwgMCwgMSwgMzcgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNDE2LCAxMiwgMSwgOSB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0MTksIDEyLCAxLCA5IH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxNDgsIC0xLCA0MjEsIDEyLCAxLCA5IH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAxNDgsIC0xLCA0MjMsIDEyLCAxLCA5IH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA0MjUsIDEyLCAxLCA5IH0sCi0gIHsgMHgxLCAweDEsIDE0OCwgLTEsIDQyNywgMTIsIDEsIDkgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE0OCwgLTEsIDQyOSwgMTIsIDEsIDkgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDQzMSwgMTIsIDEsIDkgfSwKLSAgeyAweDYwMDAwMSwgMHg2MDAwMDEsIDE0OCwgLTEsIDQzMywgMTIsIDEsIDkgfSwKLSAgeyAweDQxLCAweDQxLCAxNDgsIC0xLCA0MzUsIDYsIDEsIDEwIH0sCi0gIHsgMHg4MDAwMDQxLCAweDgwMDAwNDEsIDE0OCwgLTEsIDQzNywgNiwgMSwgMTAgfSwKLSAgeyAweDEwMDAwMDQxLCAweDEwMDAwMDQxLCAxNDgsIC0xLCA0MzksIDYsIDEsIDEwIH0sCi0gIHsgMHgxODAwMDA0MSwgMHgxODAwMDA0MSwgMTQ4LCAtMSwgNDQxLCA2LCAxLCAxMCB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0NTUsIDEyLCAxLCAxMSB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTQ4LCAtMSwgNDU3LCAxMiwgMSwgMTEgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDQ1OSwgMTIsIDEsIDExIH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA0NjEsIDEyLCAxLCAxMSB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0NjcsIDEyLCAxLCAxOCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTQ4LCAtMSwgNDY5LCAxMiwgMSwgMTggfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDQ3MSwgMTIsIDEsIDE4IH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA0NzMsIDEyLCAxLCAxOCB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0NzksIDEyLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0ODIsIDEyLCAxLCAyMCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTQ4LCAtMSwgNDg0LCAxMiwgMSwgMjAgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDQ4NiwgMTIsIDEsIDIwIH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA0ODgsIDEyLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA0OTAsIDEyLCAxLCAyMCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTQ4LCAtMSwgNDkyLCAxMiwgMSwgMjAgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDQ5NCwgMTIsIDEsIDIwIH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA0OTYsIDEyLCAxLCAyMCB9LAotICB7IDB4MSwgMHgxLCAxNDgsIC0xLCA1MDYsIDEyLCAxLCAyMSB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTQ4LCAtMSwgNTA4LCAxMiwgMSwgMjEgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDE0OCwgLTEsIDUxMCwgMTIsIDEsIDIxIH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAxNDgsIC0xLCA1MTIsIDEyLCAxLCAyMSB9LAotICB7IDB4NDEsIDB4NDEsIDE0OCwgLTEsIDUxNCwgNiwgMSwgMjEgfSwKLSAgeyAweDgwMDAwNDEsIDB4ODAwMDA0MSwgMTQ4LCAtMSwgNTE2LCA2LCAxLCAyMSB9LAotICB7IDB4MTAwMDAwNDEsIDB4MTAwMDAwNDEsIDE0OCwgLTEsIDUxOCwgNiwgMSwgMjEgfSwKLSAgeyAweDE4MDAwMDQxLCAweDE4MDAwMDQxLCAxNDgsIC0xLCA1MjAsIDYsIDEsIDIxIH0sCi0gIHsgMHgxLCAweDEsIDE0OCwgLTEsIDUzMCwgMTIsIDEsIDIyIH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxNDgsIC0xLCA1MzIsIDEyLCAxLCAyMiB9LAotICB7IDB4NDAwMDAxLCAweDQwMDAwMSwgMTQ4LCAtMSwgNTM0LCAxMiwgMSwgMjIgfSwKLSAgeyAweDYwMDAwMSwgMHg2MDAwMDEsIDE0OCwgLTEsIDUzNiwgMTIsIDEsIDIyIH0sCi0gIHsgMHgxLCAweDEsIDE0OCwgLTEsIDU0MiwgMTIsIDEsIDIzIH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxNDgsIC0xLCA1NDQsIDEyLCAxLCAyMyB9LAotICB7IDB4NDAwMDAxLCAweDQwMDAwMSwgMTQ4LCAtMSwgNTQ2LCAxMiwgMSwgMjMgfSwKLSAgeyAweDYwMDAwMSwgMHg2MDAwMDEsIDE0OCwgLTEsIDU0OCwgMTIsIDEsIDIzIH0sCi0gIHsgMHg0MSwgMHg0MSwgMTQ4LCAtMSwgNTUwLCA2LCAxLCAyMyB9LAotICB7IDB4ODAwMDA0MSwgMHg4MDAwMDQxLCAxNDgsIC0xLCA1NTIsIDYsIDEsIDIzIH0sCi0gIHsgMHgxMDAwMDA0MSwgMHgxMDAwMDA0MSwgMTQ4LCAtMSwgNTU0LCA2LCAxLCAyMyB9LAotICB7IDB4MTgwMDAwNDEsIDB4MTgwMDAwNDEsIDE0OCwgLTEsIDU1NiwgNiwgMSwgMjMgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNTY2LCAxMiwgMSwgMjQgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE0OCwgLTEsIDU2OCwgMTIsIDEsIDI0IH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAxNDgsIC0xLCA1NzAsIDEyLCAxLCAyNCB9LAotICB7IDB4NjAwMDAxLCAweDYwMDAwMSwgMTQ4LCAtMSwgNTcyLCAxMiwgMSwgMjQgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNTc4LCAxMiwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNTgxLCAxMiwgMSwgMjAgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE0OCwgLTEsIDU4MywgMTIsIDEsIDIwIH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAxNDgsIC0xLCA1ODUsIDEyLCAxLCAyMCB9LAotICB7IDB4NjAwMDAxLCAweDYwMDAwMSwgMTQ4LCAtMSwgNTg3LCAxMiwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNTg5LCAxMiwgMSwgMjAgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE0OCwgLTEsIDU5MSwgMTIsIDEsIDIwIH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAxNDgsIC0xLCA1OTMsIDEyLCAxLCAyMCB9LAotICB7IDB4NjAwMDAxLCAweDYwMDAwMSwgMTQ4LCAtMSwgNTk1LCAxMiwgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMTQ4LCAtMSwgNjA1LCAxMiwgMSwgMjQgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE0OCwgLTEsIDYwNywgMTIsIDEsIDI0IH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAxNDgsIC0xLCA2MDksIDEyLCAxLCAyNCB9LAotICB7IDB4NjAwMDAxLCAweDYwMDAwMSwgMTQ4LCAtMSwgNjExLCAxMiwgMSwgMjQgfSwKLSAgeyAweDAsIDB4MCwgMTU3LCA2MTYsIC0xLCAwLCAxLCA3MiB9LAotICB7IDB4MCwgMHgwLCAxNTcsIDYxNywgLTEsIDAsIDEsIDcyIH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDExNTAsIDMyLCAxLCAxMjUgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTE1OSwgMzIsIDEsIDEyNSB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMTY4LCAzMiwgMSwgMTI1IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDExNzcsIDMyLCAxLCAxMjUgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTE4NiwgMzIsIDEsIDEyNSB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMTk1LCAzMiwgMSwgMTI1IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEyMDQsIDMyLCAxLCAxMjUgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTIxMywgMzIsIDEsIDEyNSB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMjIyLCAzMiwgMSwgMTI1IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEyMzIsIDMyLCAxLCAxMjUgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTI0MiwgMzIsIDEsIDEyNSB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMjUyLCAzMiwgMSwgMTI1IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEyNjEsIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTI2NywgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMjczLCAzMiwgMSwgMTM0IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEyNzksIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTI4NSwgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMjkxLCAzMiwgMSwgMTM0IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEyOTcsIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTMwMywgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMzA5LCAzMiwgMSwgMTM0IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEzMTUsIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTMyMSwgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMzI3LCAzMiwgMSwgMTM0IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEzMzMsIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTMzOSwgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMzQ1LCAzMiwgMSwgMTM0IH0sCi0gIHsgMHg5LCAweDksIDE1NywgLTEsIDEzNTEsIDMyLCAxLCAxMzQgfSwKLSAgeyAweDksIDB4OSwgMTU3LCAtMSwgMTM1NywgMzIsIDEsIDEzNCB9LAotICB7IDB4OSwgMHg5LCAxNTcsIC0xLCAxMzYzLCAzMiwgMSwgMTM0IH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgOTgyLCAyODIsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDE1OCwgLTEsIDIzMTQsIDM4LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgNzQ3LCAzMjMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgOTgzLCAyODgsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDE1OCwgLTEsIDIzMjIsIDM4LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgNzQ5LCAzMzUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgNzUwLCAyODksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgNzUxLCAyOTUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgOTg0LCAyOTgsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDE1OCwgLTEsIDIzMzQsIDM4LCAxLCA0IH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgNzUzLCAzMzksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE1OCwgLTEsIDMwNCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMTU4LCAtMSwgMjM0MCwgMzgsIDEsIDQgfSwKLSAgeyAweDAsIDB4MCwgMTU4LCA3NTUsIDM1MSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTU4LCA3NTYsIDMwNSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTU4LCA3NTcsIDMxMSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMTU5LCAxMTIzLCAxODQyLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxNTksIDExMjQsIDIzNjMsIDAsIDEsIDUxIH0sCi0gIHsgMHgwLCAweDAsIDE1OSwgMTEyNSwgMTg4NiwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMTU5LCAxMTI2LCAtMSwgMjksIDEsIDQ2IH0sCi0gIHsgMHgwLCAweDAsIDE2MCwgLTEsIDE4NTIsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDksIDE2MCwgLTEsIDIzNzAsIDMzLCAxLCA1MSB9LAotICB7IDB4MCwgMHgwLCAxNjEsIDExMTQsIDE4NTAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE2MSwgMTExNSwgMjM2OSwgMCwgMSwgNTEgfSwKLSAgeyAweDEsIDB4MSwgMTYyLCAxMTI4LCAtMSwgMjcsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDE2MywgMTczNSwgMTg0NiwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMTYzLCAxNzM2LCAyMzY1LCAzMywgMSwgNTEgfSwKLSAgeyAweDAsIDB4MCwgMTYzLCAxNzM3LCAxODg4LCAwLCAwLCAtMSB9LAotICB7IDB4MywgMHgzLCAxNjMsIDE3MzgsIC0xLCAyOCwgMSwgNDYgfSwKLSAgeyAweDAsIDB4MCwgMTY0LCAxMTE5LCAxODQ0LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAxNjQsIDExMjAsIDIzNjQsIDM2LCAxLCA1MSB9LAotICB7IDB4MCwgMHgwLCAxNjQsIDExMjEsIDE4ODcsIDAsIDAsIC0xIH0sCi0gIHsgMHg1LCAweDUsIDE2NCwgMTEyMiwgLTEsIDI3LCAxLCA0NiB9LAotICB7IDB4MCwgMHgwLCAxNjUsIC0xLCAyMzQ2LCAwLCAxLCA1NSB9LAotICB7IDB4MSwgMHgxLCAxNjcsIC0xLCAtMSwgMjgsIDEsIDMwIH0sCi0gIHsgMHgxLCAweDEsIDE2OCwgMjIwNCwgLTEsIDI3LCAxLCAzMCB9LAotICB7IDB4MSwgMHgxLCAxNjgsIDIyMDUsIC0xLCAyNywgMSwgMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzkzLCAtMSwgMjgsIDEsIDEyNyB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzOTQsIC0xLCAyOCwgMSwgMTI3IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM5NSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzk2LCAtMSwgMjgsIDEsIDEyNyB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzOTcsIC0xLCAyOCwgMSwgMTI3IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM5OCwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzk5LCAtMSwgMjgsIDEsIDEyNyB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MDAsIC0xLCAyOCwgMSwgMTI3IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQwMSwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDAyLCAtMSwgMjgsIDEsIDEyOCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MDMsIC0xLCAyOCwgMSwgMTI4IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQwNCwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDA1LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MDYsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQwNywgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDA4LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MDksIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQxMCwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDExLCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MTIsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQxMywgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDE0LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MTUsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQxNiwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDE3LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MTgsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQxOSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDIwLCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MjEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQyMiwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDIzLCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MjQsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQyNSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDI2LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MjcsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQyOCwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDI5LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MzAsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQzMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDMyLCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MzMsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQzNCwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDM1LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MzYsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQzNywgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDM4LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0MzksIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ0MCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDQxLCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NDIsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ0MywgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDQ0LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NDUsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ0NiwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDQ3LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NDgsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ0OSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDUwLCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NTEsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ1MiwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDUzLCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NTQsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ1NSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDU2LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NTcsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ1OCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDU5LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NjAsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ2MSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDYyLCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NjMsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ2NCwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDY1LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NjYsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ2NywgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDY4LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NjksIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ3MCwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDcxLCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NzIsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ3MywgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDc0LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NzUsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ3NiwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDc3LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0NzgsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ3OSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDgwLCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0ODEsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ4MiwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDgzLCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0ODQsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ4NSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDg2LCAtMSwgMjgsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0ODcsIC0xLCAyOCwgMSwgMTIyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ4OCwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDg5LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0OTAsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ5MSwgLTEsIDI4LCAxLCAxMjQgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDkyLCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0OTMsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ5NCwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDk1LCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0OTYsIC0xLCAyOCwgMSwgMTIxIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTQ5NywgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNDk4LCAtMSwgMjgsIDEsIDEyMyB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE0OTksIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUwMCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTAxLCAtMSwgMjgsIDEsIDEyNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MDIsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUwMywgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTA0LCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MDUsIC0xLCAyOCwgMSwgMTIwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUwNiwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTA3LCAtMSwgMjgsIDEsIDEyMiB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MDgsIC0xLCAyOCwgMSwgMTIzIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUwOSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTEwLCAtMSwgMjgsIDEsIDEyMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MTEsIC0xLCAyOCwgMSwgMTI0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUxMiwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTEzLCAtMSwgMjgsIDEsIDEyNSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MTQsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUxNSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTE2LCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MTcsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUxOCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTE5LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MjAsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUyMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTIyLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MjMsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUyNCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTI1LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MjYsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUyNywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTI4LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MjksIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUzMCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTMxLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MzIsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUzMywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTM0LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MzUsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUzNiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTM3LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1MzgsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTUzOSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTQwLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NDEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU0MiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTQzLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NDQsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU0NSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTQ2LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NDcsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU0OCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTQ5LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NTAsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU1MSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTUyLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NTMsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU1NCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTU1LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NTYsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU1NywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTU4LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NTksIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU2MCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTYxLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NjIsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU2MywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTY0LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NjUsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU2NiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTY3LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NjgsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU2OSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTcwLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NzEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU3MiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTczLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NzQsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU3NSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTc2LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1NzcsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU3OCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTc5LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1ODAsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU4MSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTgyLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1ODMsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU4NCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTg1LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1ODYsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU4NywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTg4LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1ODksIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU5MCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTkxLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1OTIsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU5MywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTk0LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1OTUsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU5NiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNTk3LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE1OTgsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTU5OSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjAwLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MDEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYwMiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjAzLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MDQsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYwNSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjA2LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MDcsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYwOCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjA5LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MTAsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYxMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjEyLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MTMsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYxNCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjE1LCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MTYsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYxNywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjE4LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MTksIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYyMCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjIxLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MjIsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYyMywgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjI0LCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MSwgMHgxLCAxNjksIDE2MjUsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTYyNiwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzgxLCAtMSwgMjgsIDEsIDEzNiB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzODIsIC0xLCAyOCwgMSwgMTM3IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM4MywgLTEsIDI4LCAxLCAxMzcgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzg0LCAtMSwgMjgsIDEsIDEzNiB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzODUsIC0xLCAyOCwgMSwgMTM4IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM4NiwgLTEsIDI4LCAxLCAxMzkgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzg3LCAtMSwgMjgsIDEsIDEzOSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzODgsIC0xLCAyOCwgMSwgMTM4IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM4OSwgLTEsIDI4LCAxLCAxMzggfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxMzkwLCAtMSwgMjgsIDEsIDEzOSB9LAotICB7IDB4MSwgMHgxLCAxNjksIDEzOTEsIC0xLCAyOCwgMSwgMTM5IH0sCi0gIHsgMHgxLCAweDEsIDE2OSwgMTM5MiwgLTEsIDI4LCAxLCAxMzggfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjY3LCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjY4LCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjY5LCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMTY5LCAxNjcwLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMTcwLCAxNjI3LCAtMSwgMjksIDEsIDEzNiB9LAotICB7IDB4MSwgMHgxLCAxNzAsIDE2MjgsIC0xLCAyOSwgMSwgMTM3IH0sCi0gIHsgMHgxLCAweDEsIDE3MCwgMTYyOSwgLTEsIDI5LCAxLCAxMzcgfSwKLSAgeyAweDEsIDB4MSwgMTcwLCAxNjMwLCAtMSwgMjksIDEsIDEzNiB9LAotICB7IDB4MSwgMHgxLCAxNzAsIDE2MzEsIC0xLCAyOSwgMSwgMTM4IH0sCi0gIHsgMHgxLCAweDEsIDE3MCwgMTYzMiwgLTEsIDI5LCAxLCAxMzkgfSwKLSAgeyAweDEsIDB4MSwgMTcwLCAxNjMzLCAtMSwgMjksIDEsIDEzOSB9LAotICB7IDB4MSwgMHgxLCAxNzAsIDE2MzQsIC0xLCAyOSwgMSwgMTM4IH0sCi0gIHsgMHgxLCAweDEsIDE3MCwgMTYzNSwgLTEsIDI5LCAxLCAxMzggfSwKLSAgeyAweDEsIDB4MSwgMTcwLCAxNjM2LCAtMSwgMjksIDEsIDEzOSB9LAotICB7IDB4MSwgMHgxLCAxNzAsIDE2MzcsIC0xLCAyOSwgMSwgMTM5IH0sCi0gIHsgMHgxLCAweDEsIDE3MCwgMTYzOCwgLTEsIDI5LCAxLCAxMzggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNTcsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5MSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNTksIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5MiwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNjEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5MywgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNjMsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5NCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNjUsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5NSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNjcsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5NiwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNjksIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5NywgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNzEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5OCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNzMsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc5OSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNzUsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgwMCwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNzcsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgwMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMjUgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAyNzksIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI1IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgwMiwgLTEsIDI4LCAxLCAxMjAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODAzLCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MDQsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgwNSwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODA2LCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MDcsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgwOCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODA5LCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MTAsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgxMSwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODEyLCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MTMsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgxNCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODE1LCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MTYsIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgxNywgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzEgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzMgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzQgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxODE4LCAtMSwgMjgsIDEsIDEzMCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzMyB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNCB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE4MTksIC0xLCAyOCwgMSwgMTMwIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMxIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM0IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTgyMCwgLTEsIDI4LCAxLCAxMzAgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzYgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAxMzcgfSwKLSAgeyAweDMsIDB4MywgMTcxLCA3NjUsIC0xLCAyOCwgMSwgMTM3IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgNzY2LCAtMSwgMjgsIDEsIDEzNiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzOCB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzOSB9LAotICB7IDB4MywgMHgzLCAxNzEsIDc2NywgLTEsIDI4LCAxLCAxMzkgfSwKLSAgeyAweDMsIDB4MywgMTcxLCA3NjgsIC0xLCAyOCwgMSwgMTM4IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM4IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTM5IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgNzY5LCAtMSwgMjgsIDEsIDEzOSB9LAotICB7IDB4MywgMHgzLCAxNzEsIDc3MCwgLTEsIDI4LCAxLCAxMzggfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc1OSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE3NjAsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxNzYxLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc2MiwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE3NjMsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAxNzY0LCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMTI2IH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgMTc2NSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEyNiB9LAotICB7IDB4MywgMHgzLCAxNzEsIDE3NjYsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDEzNSB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAxNzEsIC0xLCAtMSwgMjgsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMTcxLCAtMSwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgzLCAweDMsIDE3MSwgLTEsIC0xLCAyOCwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAxNzIsIC0xLCAzMTQsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDE3MiwgMjQwMiwgMjM3MiwgMCwgMSwgNjcgfSwKLSAgeyAweDAsIDB4MCwgMTcyLCAtMSwgMzE4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAxNzIsIDI0MDQsIDIzNzQsIDAsIDEsIDY3IH0sCi0gIHsgMHgxMSwgMHgzMSwgMTczLCAyMzA2LCAzMjEsIDMzLCAxLCA3IH0sCi0gIHsgMHgyMjAwMDAxLCAweDIyMDAwMDEsIDE3MywgLTEsIDMyMiwgMTIsIDEsIDcgfSwKLSAgeyAweDEsIDB4MSwgMTczLCAtMSwgMzI1LCAzNywgMSwgNyB9LAotICB7IDB4MjAwMDAwMSwgMHgyMDAwMDAxLCAxNzMsIC0xLCAzMjYsIDEyLCAxLCA3IH0sCi0gIHsgMHgxMSwgMHgxMSwgMTczLCAtMSwgMzI3LCAzMywgMSwgNyB9LAotICB7IDB4MjIwMDAwMSwgMHgyMjAwMDAxLCAxNzMsIC0xLCAzMjgsIDEyLCAxLCA3IH0sCi0gIHsgMHgxMSwgMHgzMSwgMTczLCAyMzE2LCAzMzMsIDMzLCAxLCA3IH0sCi0gIHsgMHgyMjAwMDAxLCAweDIyMDAwMDEsIDE3MywgLTEsIDMzNCwgMTIsIDEsIDcgfSwKLSAgeyAweDExLCAweDMxLCAxNzMsIDIzMjYsIDMzNywgMzMsIDEsIDcgfSwKLSAgeyAweDIyMDAwMDEsIDB4MjIwMDAwMSwgMTczLCAtMSwgMzM4LCAxMiwgMSwgNyB9LAotICB7IDB4MSwgMHgxLCAxNzMsIC0xLCAzNDEsIDM3LCAxLCA3IH0sCi0gIHsgMHgyMDAwMDAxLCAweDIwMDAwMDEsIDE3MywgLTEsIDM0MiwgMTIsIDEsIDcgfSwKLSAgeyAweDExLCAweDExLCAxNzMsIC0xLCAzNDMsIDMzLCAxLCA3IH0sCi0gIHsgMHgyMjAwMDAxLCAweDIyMDAwMDEsIDE3MywgLTEsIDM0NCwgMTIsIDEsIDcgfSwKLSAgeyAweDExLCAweDMxLCAxNzMsIDIzMzYsIDM0OSwgMzMsIDEsIDcgfSwKLSAgeyAweDIyMDAwMDEsIDB4MjIwMDAwMSwgMTczLCAtMSwgMzUwLCAxMiwgMSwgNyB9LAotICB7IDB4MSwgMHgxLCAxNzMsIC0xLCAzNTMsIDMzLCAxLCA3MCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTczLCAtMSwgMzU0LCAxMiwgMSwgNzAgfSwKLSAgeyAweDEsIDB4MSwgMTczLCAtMSwgMzU3LCAzMywgMSwgNzAgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE3MywgLTEsIDM1OCwgMTIsIDEsIDcwIH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAzNywgMSwgNyB9LAotICB7IDB4MjAwMDAwMSwgMHgyMDAwMDAxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDcgfSwKLSAgeyAweDEsIDB4MSwgMTc0LCAtMSwgLTEsIDM3LCAxLCA3IH0sCi0gIHsgMHgyMDAwMDAxLCAweDIwMDAwMDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgNyB9LAotICB7IDB4MTEsIDB4MTEsIDE3NCwgLTEsIC0xLCAzMywgMSwgNyB9LAotICB7IDB4MjIwMDAwMSwgMHgyMjAwMDAxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDcgfSwKLSAgeyAweDEsIDB4MSwgMTc0LCAtMSwgLTEsIDM3LCAxLCA3IH0sCi0gIHsgMHgyMDAwMDAxLCAweDIwMDAwMDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgNyB9LAotICB7IDB4MCwgMHgwLCAxNzQsIC0xLCAtMSwgMCwgMSwgOCB9LAotICB7IDB4MSwgMHgxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDggfSwKLSAgeyAweDAsIDB4MCwgMTc0LCAtMSwgLTEsIDAsIDEsIDggfSwKLSAgeyAweDEsIDB4MSwgMTc0LCAtMSwgLTEsIDEyLCAxLCA4IH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAzMywgMSwgOCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMTc0LCAtMSwgLTEsIDEyLCAxLCA4IH0sCi0gIHsgMHgwLCAweDAsIDE3NCwgLTEsIC0xLCAwLCAxLCA4IH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgOCB9LAotICB7IDB4MSwgMHgxLCAxNzQsIC0xLCAtMSwgMzcsIDEsIDcgfSwKLSAgeyAweDIwMDAwMDEsIDB4MjAwMDAwMSwgMTc0LCAtMSwgLTEsIDEyLCAxLCA3IH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAzNywgMSwgNyB9LAotICB7IDB4MjAwMDAwMSwgMHgyMDAwMDAxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDcgfSwKLSAgeyAweDExLCAweDExLCAxNzQsIC0xLCAtMSwgMzMsIDEsIDcgfSwKLSAgeyAweDIyMDAwMDEsIDB4MjIwMDAwMSwgMTc0LCAtMSwgLTEsIDEyLCAxLCA3IH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAzNywgMSwgNyB9LAotICB7IDB4MjAwMDAwMSwgMHgyMDAwMDAxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDcgfSwKLSAgeyAweDAsIDB4MCwgMTc0LCAtMSwgLTEsIDAsIDEsIDggfSwKLSAgeyAweDEsIDB4MSwgMTc0LCAtMSwgLTEsIDEyLCAxLCA4IH0sCi0gIHsgMHgwLCAweDAsIDE3NCwgLTEsIC0xLCAwLCAxLCA4IH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgOCB9LAotICB7IDB4MSwgMHgxLCAxNzQsIC0xLCAtMSwgMzMsIDEsIDggfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgOCB9LAotICB7IDB4MCwgMHgwLCAxNzQsIC0xLCAtMSwgMCwgMSwgOCB9LAotICB7IDB4MSwgMHgxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDggfSwKLSAgeyAweDksIDB4OSwgMTc0LCAtMSwgLTEsIDMzLCAxLCA3MSB9LAotICB7IDB4MSwgMHgxLCAxNzQsIDMxNSwgLTEsIDMzLCAxLCA3MCB9LAotICB7IDB4MTIwMDAwMSwgMHgxMjAwMDAxLCAxNzQsIC0xLCAtMSwgMTIsIDEsIDcxIH0sCi0gIHsgMHgyMDAwMDEsIDB4MjAwMDAxLCAxNzQsIDMxNiwgLTEsIDEyLCAxLCA3MCB9LAotICB7IDB4OSwgMHg5LCAxNzQsIC0xLCAtMSwgMzMsIDEsIDcxIH0sCi0gIHsgMHgxLCAweDEsIDE3NCwgMzE5LCAtMSwgMzMsIDEsIDcwIH0sCi0gIHsgMHgxMjAwMDAxLCAweDEyMDAwMDEsIDE3NCwgLTEsIC0xLCAxMiwgMSwgNzEgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDE3NCwgMzIwLCAtMSwgMTIsIDEsIDcwIH0sCi0gIHsgMHgwLCAweDAsIDE3NSwgLTEsIDE4NDgsIDAsIDAsIC0xIH0sCi0gIHsgMHg5LCAweDksIDE3NSwgLTEsIDIzNjYsIDMzLCAxLCA0NiB9LAotICB7IDB4MCwgMHgwLCAxNzUsIC0xLCAxODg5LCAwLCAwLCAtMSB9LAotICB7IDB4NywgMHg3LCAxNzUsIC0xLCAtMSwgMjcsIDEsIDQ2IH0sCi0gIHsgMHgxLCAweDEsIDE5NSwgLTEsIC0xLCAyNywgMSwgMTMgfSwKLSAgeyAweDEsIDB4MSwgMjA5LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDIwOSwgLTEsIC0xLCAyOSwgMSwgMCB9LAotICB7IDB4MiwgMHgzLCAyMDksIDkzNiwgLTEsIDI3LCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAyMDksIDkzNywgLTEsIDAsIDEsIDMwIH0sCi0gIHsgMHgwLCAweDAsIDIwOSwgOTM4LCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAyMDksIDkzOSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMjA5LCA5NDAsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDIwOSwgOTQxLCAtMSwgMCwgMSwgMCB9LAotICB7IDB4MCwgMHgwLCAyMDksIDIzODgsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDIwOSwgMjM4OSwgLTEsIDAsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMjA5LCAyMzkwLCA3ODAsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIxMCwgLTEsIC0xLCAyNywgMSwgMCB9LAotICB7IDB4MSwgMHgxLCAyMTAsIC0xLCAtMSwgMjcsIDEsIDAgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTEzMiwgMzIsIDEsIDEyNyB9LAotICB7IDB4MSwgMHgxLCAyMTEsIC0xLCAxMTM0LCAzMiwgMSwgMTI3IH0sCi0gIHsgMHgxLCAweDEsIDIxMSwgLTEsIDExMzYsIDMyLCAxLCAxMjcgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTEzOCwgMzIsIDEsIDEyNyB9LAotICB7IDB4MSwgMHgxLCAyMTEsIC0xLCAxMTQwLCAzMiwgMSwgMTI4IH0sCi0gIHsgMHgxLCAweDEsIDIxMSwgLTEsIDExNDIsIDMyLCAxLCAxMjggfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTYzOSwgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTY0MSwgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTY0MywgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTY0NSwgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTY0NywgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAtMSwgMTY0OSwgMzIsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjExLCAyMjA4LCAxNjUxLCAzMiwgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAyMTEsIDIyMDksIDE2NTQsIDMyLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDIxMiwgLTEsIDIyNTAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIxMiwgLTEsIDIyNTEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIxMiwgLTEsIDIyNzYsIDAsIDAsIC0xIH0sCi0gIHsgMHg1LCAweDUsIDIxMiwgLTEsIDIyNzksIDIwLCAxLCA1OSB9LAotICB7IDB4MCwgMHgwLCAyMTYsIDE3NTAsIDc3OSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjE3LCAtMSwgOTA4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMTcsIC0xLCA5ODksIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIxNywgLTEsIC0xLCAwLCAxLCAxMTcgfSwKLSAgeyAweDAsIDB4MCwgMjE3LCAtMSwgLTEsIDAsIDEsIDU4IH0sCi0gIHsgMHgxLCAweDEsIDIxNywgNjU2LCAxODIyLCAzNiwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjE3LCA2NTcsIDE4NTcsIDM2LCAxLCA1NyB9LAotICB7IDB4MCwgMHgwLCAyMTcsIDY1OCwgMTg2MCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjE3LCA2NTksIC0xLCAzNiwgMSwgNTcgfSwKLSAgeyAweDAsIDB4MCwgMjE3LCAxMTI5LCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDEsIDB4MSwgMjE3LCA2NjAsIDE4NjUsIDM2LCAxLCA1NyB9LAotICB7IDB4MCwgMHgwLCAyMTcsIDY2MSwgMTg2OCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjE3LCA2NjIsIC0xLCAzNiwgMSwgNTcgfSwKLSAgeyAweDAsIDB4MCwgMjE3LCA2NjMsIDE4NzEsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIxNywgNjY0LCAtMSwgMzYsIDEsIDU3IH0sCi0gIHsgMHgxLCAweDEsIDIxNywgNjY1LCAxODc0LCAzNiwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjE3LCA2NjYsIDE4NzcsIDM2LCAxLCA1NyB9LAotICB7IDB4MCwgMHgwLCAyMTcsIDExMzAsIC0xLCAwLCAxLCAzMCB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDY2NywgMTkwNywgMzYsIDEsIDU3IH0sCi0gIHsgMHgxLCAweDEsIDIxNywgNjY4LCAtMSwgMzEsIDEsIDEyOSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyMCwgMTE0MywgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyMSwgMTE1MiwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyMiwgMTE2MSwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyMywgMTE3MCwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyNCwgMTE3OSwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyNSwgMTE4OCwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyNiwgMTE5NywgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyNywgMTIwNiwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyOCwgMTIxNSwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIyOSwgMTIyNCwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzMCwgMTIzNCwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzMSwgMTI0NCwgMzIsIDEsIDEyMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzMiwgMTI1NywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzMywgMTI2MywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzNCwgMTI2OSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzNSwgMTI3NSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzNiwgMTI4MSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzNywgMTI4NywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzOCwgMTI5MywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDIzOSwgMTI5OSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0MCwgMTMwNSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0MSwgMTMxMSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0MiwgMTMxNywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0MywgMTMyMywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0NCwgMTMyOSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0NSwgMTMzNSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0NiwgMTM0MSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0NywgMTM0NywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0OCwgMTM1MywgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDI0OSwgMTM1OSwgMzIsIDEsIDEzMSB9LAotICB7IDB4MSwgMHgxLCAyMTcsIDY3MiwgLTEsIDMxLCAxLCA1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTkxMCwgLTEsIDAsIDEsIDU3IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTkxMSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMjMsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5MTMsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5MTQsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5MTUsIC0xLCAwLCAxLCA0MSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5MTYsIC0xLCAwLCAxLCAzNiB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5MTcsIC0xLCAxMiwgMSwgNDUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTE4LCAtMSwgMCwgMSwgNTAgfSwKLSAgeyAweDEwMDAwMDEsIDB4MTAwMDAwMSwgMjE4LCAxOTE5LCAtMSwgMTIsIDEsIDQ1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTkyMCwgLTEsIDM2LCAxLCA1MCB9LAotICB7IDB4MjAwMDAxLCAweDIwMDAwMSwgMjE4LCAxOTIxLCAtMSwgMTIsIDEsIDQ1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTkyMiwgLTEsIDMzLCAxLCA1MCB9LAotICB7IDB4MTIwMDAwMSwgMHgxMjAwMDAxLCAyMTgsIDE5MjMsIC0xLCAxMiwgMSwgNDUgfSwKLSAgeyAweDksIDB4OSwgMjE4LCAxOTI0LCAtMSwgMzMsIDEsIDQ1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTkyNSwgLTEsIDEyLCAxLCA0NSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5MjYsIC0xLCAwLCAxLCA1MCB9LAotICB7IDB4MjAwMDAxLCAweDEyMDAwMDEsIDIxOCwgMTkyNywgLTEsIDEyLCAxLCA0NSB9LAotICB7IDB4MSwgMHg5LCAyMTgsIDE5MjgsIC0xLCAzMywgMSwgNTAgfSwKLSAgeyAweDEsIDB4MSwgMjE4LCAxOTI5LCAtMSwgMTIsIDEsIDQ1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTkzMCwgLTEsIDAsIDEsIDUwIH0sCi0gIHsgMHgxMDAwMDAxLCAweDEwMDAwMDEsIDIxOCwgMTkzMSwgLTEsIDEyLCAxLCA0NSB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5MzIsIC0xLCAzNiwgMSwgNTAgfSwKLSAgeyAweDIwMDAwMSwgMHgyMDAwMDEsIDIxOCwgMTkzMywgLTEsIDEyLCAxLCA0NSB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5MzQsIC0xLCAzMywgMSwgNTAgfSwKLSAgeyAweDEyMDAwMDEsIDB4MTIwMDAwMSwgMjE4LCAxOTM1LCAtMSwgMTIsIDEsIDQ1IH0sCi0gIHsgMHg5LCAweDksIDIxOCwgMTkzNiwgLTEsIDMzLCAxLCA0NSB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5MzcsIC0xLCAxMiwgMSwgNDUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTM4LCAtMSwgMCwgMSwgNTAgfSwKLSAgeyAweDIwMDAwMSwgMHgxMjAwMDAxLCAyMTgsIDE5MzksIC0xLCAxMiwgMSwgNDUgfSwKLSAgeyAweDEsIDB4OSwgMjE4LCAxOTQwLCAtMSwgMzMsIDEsIDUwIH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk0MSwgLTEsIDI4LCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5NDIsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MywgMHgzLCAyMTgsIDE5NDMsIC0xLCAyNywgMSwgMjUgfSwKLSAgeyAweDEsIDB4MSwgMjE4LCAxOTQ0LCAtMSwgMjcsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk0NSwgLTEsIDAsIDEsIDU3IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk0NiwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk0NywgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk0OCwgLTEsIDM2LCAxLCA1NyB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5NDksIC0xLCAzNywgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTUwLCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTUxLCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTUyLCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTUzLCAtMSwgMCwgMSwgNTcgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTU0LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAzNSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk1NiwgLTEsIDM2LCAxLCA1NyB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5NTcsIC0xLCAzNywgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTU4LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDEsIDB4MSwgMjE4LCAxOTU5LCAtMSwgMzYsIDEsIDU3IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk2MCwgLTEsIDM3LCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5NjEsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5NjIsIC0xLCAwLCAxLCA1NyB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5NjMsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDQwLCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTY1LCAtMSwgMCwgMSwgNTcgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTY2LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCA0MSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk2OCwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk2OSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk3MCwgLTEsIDAsIDEsIDQ1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk3MSwgLTEsIDI3LCAxLCA0NSB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5NzIsIC0xLCAyOCwgMSwgNDUgfSwKLSAgeyAweDMsIDB4MywgMjE4LCAxOTczLCAtMSwgMjcsIDEsIDQ1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk3NCwgLTEsIDI5LCAxLCA0NSB9LAotICB7IDB4NSwgMHg1LCAyMTgsIDE5NzUsIC0xLCAyNywgMSwgNDUgfSwKLSAgeyAweDMsIDB4MywgMjE4LCAxOTc2LCAtMSwgMjgsIDEsIDQ1IH0sCi0gIHsgMHg3LCAweDcsIDIxOCwgMTk3NywgLTEsIDI3LCAxLCA0NSB9LAotICB7IDB4MSwgMHgxLCAyMTgsIDE5NzgsIC0xLCAyOCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTc5LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDMsIDB4MywgMjE4LCAxOTgwLCAtMSwgMjcsIDEsIDI1IH0sCi0gIHsgMHgxLCAweDEsIDIxOCwgMTk4MSwgLTEsIDI3LCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5ODIsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5ODMsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDE5ODQsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MCwgMHgwLCAyMTgsIDUwLCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTg2LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCAxOTg3LCAtMSwgMCwgMSwgMjUgfSwKLSAgeyAweDAsIDB4MCwgMjE4LCA1NSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk4OSwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5MCwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgNTgsIC0xLCAwLCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5MiwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5MywgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5NCwgLTEsIDAsIDEsIDMxIH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5NSwgLTEsIDAsIDEsIDU3IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgMTk5NiwgLTEsIDAsIDEsIDI1IH0sCi0gIHsgMHgwLCAweDAsIDIxOCwgNjMsIC0xLCAwLCAxLCAyNSB9LAotICB7IDB4MSwgMHgxLCAyMTksIDE5OTgsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAxOTk5LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAwMCwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMDEsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDAyLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAwMywgLTEsIDM0LCAxLCA0MiB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMDQsIC0xLCAzNCwgMSwgMzggfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDIxOSwgMjAwNSwgLTEsIDEyLCAxLCA0NyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMDYsIC0xLCAzNCwgMSwgNTIgfSwKLSAgeyAweDE0MDAwMDEsIDB4MTQwMDAwMSwgMjE5LCAyMDA3LCAtMSwgMTIsIDEsIDQ3IH0sCi0gIHsgMHg1LCAweDUsIDIxOSwgMjAwOCwgLTEsIDM0LCAxLCA1MiB9LAotICB7IDB4NjAwMDAxLCAweDYwMDAwMSwgMjE5LCAyMDA5LCAtMSwgMTIsIDEsIDQ3IH0sCi0gIHsgMHgzLCAweDMsIDIxOSwgMjAxMCwgLTEsIDMzLCAxLCA1MiB9LAotICB7IDB4MTYwMDAwMSwgMHgxNjAwMDAxLCAyMTksIDIwMTEsIC0xLCAxMiwgMSwgNDcgfSwKLSAgeyAweGIsIDB4YiwgMjE5LCAyMDEyLCAtMSwgMzMsIDEsIDQ3IH0sCi0gIHsgMHg0MDAwMDEsIDB4NDAwMDAxLCAyMTksIDIwMTMsIC0xLCAxMiwgMSwgNDcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDE0LCAtMSwgMzQsIDEsIDUyIH0sCi0gIHsgMHg2MDAwMDEsIDB4MTYwMDAwMSwgMjE5LCAyMDE1LCAtMSwgMTIsIDEsIDQ3IH0sCi0gIHsgMHgzLCAweGIsIDIxOSwgMjAxNiwgLTEsIDMzLCAxLCA1MiB9LAotICB7IDB4NDAwMDAxLCAweDQwMDAwMSwgMjE5LCAyMDE3LCAtMSwgMTIsIDEsIDQ3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAxOCwgLTEsIDM0LCAxLCA1MiB9LAotICB7IDB4MTQwMDAwMSwgMHgxNDAwMDAxLCAyMTksIDIwMTksIC0xLCAxMiwgMSwgNDcgfSwKLSAgeyAweDUsIDB4NSwgMjE5LCAyMDIwLCAtMSwgMzQsIDEsIDUyIH0sCi0gIHsgMHg2MDAwMDEsIDB4NjAwMDAxLCAyMTksIDIwMjEsIC0xLCAxMiwgMSwgNDcgfSwKLSAgeyAweDMsIDB4MywgMjE5LCAyMDIyLCAtMSwgMzMsIDEsIDUyIH0sCi0gIHsgMHgxNjAwMDAxLCAweDE2MDAwMDEsIDIxOSwgMjAyMywgLTEsIDEyLCAxLCA0NyB9LAotICB7IDB4YiwgMHhiLCAyMTksIDIwMjQsIC0xLCAzMywgMSwgNDcgfSwKLSAgeyAweDQwMDAwMSwgMHg0MDAwMDEsIDIxOSwgMjAyNSwgLTEsIDEyLCAxLCA0NyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMjYsIC0xLCAzNCwgMSwgNTIgfSwKLSAgeyAweDYwMDAwMSwgMHgxNjAwMDAxLCAyMTksIDIwMjcsIC0xLCAxMiwgMSwgNDcgfSwKLSAgeyAweDMsIDB4YiwgMjE5LCAyMDI4LCAtMSwgMzMsIDEsIDUyIH0sCi0gIHsgMHg0MSwgMHg0MSwgMjE5LCAyMDI5LCAtMSwgMjgsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAzMCwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4ODMsIDB4ODMsIDIxOSwgMjAzMSwgLTEsIDI3LCAxLCAyNyB9LAotICB7IDB4ODEsIDB4ODEsIDIxOSwgMjAzMiwgLTEsIDI3LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMzMsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDM0LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAzNSwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4NSwgMHg1LCAyMTksIDIwMzYsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweDksIDB4OSwgMjE5LCAyMDM3LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjAzOCwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwMzksIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDQwLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA0MSwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNDIsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDQzLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHg1LCAweDUsIDIxOSwgMjA0NCwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4OSwgMHg5LCAyMTksIDIwNDUsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDQ2LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHg1LCAweDUsIDIxOSwgMjA0NywgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4OSwgMHg5LCAyMTksIDIwNDgsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDQ5LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA1MCwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNTEsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDUyLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA1MywgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNTQsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDU1LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA1NiwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNTcsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDU4LCAtMSwgMzQsIDEsIDQ3IH0sCi0gIHsgMHg4MSwgMHg4MSwgMjE5LCAyMDU5LCAtMSwgMjcsIDEsIDQ3IH0sCi0gIHsgMHg0MSwgMHg0MSwgMjE5LCAyMDYwLCAtMSwgMjgsIDEsIDQ3IH0sCi0gIHsgMHg4MywgMHg4MywgMjE5LCAyMDYxLCAtMSwgMjcsIDEsIDQ3IH0sCi0gIHsgMHgyMSwgMHgyMSwgMjE5LCAyMDYyLCAtMSwgMjksIDEsIDQ3IH0sCi0gIHsgMHg4NSwgMHg4NSwgMjE5LCAyMDYzLCAtMSwgMjcsIDEsIDQ3IH0sCi0gIHsgMHg0MywgMHg0MywgMjE5LCAyMDY0LCAtMSwgMjgsIDEsIDQ3IH0sCi0gIHsgMHg4NywgMHg4NywgMjE5LCAyMDY1LCAtMSwgMjcsIDEsIDQ3IH0sCi0gIHsgMHg0MSwgMHg0MSwgMjE5LCAyMDY2LCAtMSwgMjgsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA2NywgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4ODMsIDB4ODMsIDIxOSwgMjA2OCwgLTEsIDI3LCAxLCAyNyB9LAotICB7IDB4ODEsIDB4ODEsIDIxOSwgMjA2OSwgLTEsIDI3LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNzAsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDcxLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA3MiwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNzMsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDc0LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA3NSwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNzYsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDc3LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA3OCwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwNzksIC0xLCAzNCwgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwODAsIC0xLCAzNCwgMSwgMjcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDgxLCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA4MiwgLTEsIDM0LCAxLCAzMyB9LAotICB7IDB4MSwgMHgxLCAyMTksIDIwODMsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjE5LCAyMDg0LCAtMSwgMzQsIDEsIDI3IH0sCi0gIHsgMHgxLCAweDEsIDIxOSwgMjA4NSwgLTEsIDM0LCAxLCAyNyB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIwODYsIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMDg3LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjA4OCwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIwODksIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMDkwLCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjA5MSwgLTEsIDM1LCAxLCA0MyB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIwOTIsIC0xLCAzNSwgMSwgMzkgfSwKLSAgeyAweDgwMDAwMSwgMHg4MDAwMDEsIDIyMCwgMjA5MywgLTEsIDEyLCAxLCA0OCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIwOTQsIC0xLCAzNSwgMSwgNTMgfSwKLSAgeyAweDE4MDAwMDEsIDB4MTgwMDAwMSwgMjIwLCAyMDk1LCAtMSwgMTIsIDEsIDQ4IH0sCi0gIHsgMHgzLCAweDMsIDIyMCwgMjA5NiwgLTEsIDM1LCAxLCA1MyB9LAotICB7IDB4YTAwMDAxLCAweGEwMDAwMSwgMjIwLCAyMDk3LCAtMSwgMTIsIDEsIDQ4IH0sCi0gIHsgMHg1LCAweDUsIDIyMCwgMjA5OCwgLTEsIDMzLCAxLCA1MyB9LAotICB7IDB4MWEwMDAwMSwgMHgxYTAwMDAxLCAyMjAsIDIwOTksIC0xLCAxMiwgMSwgNDggfSwKLSAgeyAweGQsIDB4ZCwgMjIwLCAyMTAwLCAtMSwgMzMsIDEsIDQ4IH0sCi0gIHsgMHg4MDAwMDEsIDB4ODAwMDAxLCAyMjAsIDIxMDEsIC0xLCAxMiwgMSwgNDggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTAyLCAtMSwgMzUsIDEsIDUzIH0sCi0gIHsgMHhhMDAwMDEsIDB4MWEwMDAwMSwgMjIwLCAyMTAzLCAtMSwgMTIsIDEsIDQ4IH0sCi0gIHsgMHg1LCAweGQsIDIyMCwgMjEwNCwgLTEsIDMzLCAxLCA1MyB9LAotICB7IDB4ODAwMDAxLCAweDgwMDAwMSwgMjIwLCAyMTA1LCAtMSwgMTIsIDEsIDQ4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEwNiwgLTEsIDM1LCAxLCA1MyB9LAotICB7IDB4MTgwMDAwMSwgMHgxODAwMDAxLCAyMjAsIDIxMDcsIC0xLCAxMiwgMSwgNDggfSwKLSAgeyAweDMsIDB4MywgMjIwLCAyMTA4LCAtMSwgMzUsIDEsIDUzIH0sCi0gIHsgMHhhMDAwMDEsIDB4YTAwMDAxLCAyMjAsIDIxMDksIC0xLCAxMiwgMSwgNDggfSwKLSAgeyAweDUsIDB4NSwgMjIwLCAyMTEwLCAtMSwgMzMsIDEsIDUzIH0sCi0gIHsgMHgxYTAwMDAxLCAweDFhMDAwMDEsIDIyMCwgMjExMSwgLTEsIDEyLCAxLCA0OCB9LAotICB7IDB4ZCwgMHhkLCAyMjAsIDIxMTIsIC0xLCAzMywgMSwgNDggfSwKLSAgeyAweDgwMDAwMSwgMHg4MDAwMDEsIDIyMCwgMjExMywgLTEsIDEyLCAxLCA0OCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxMTQsIC0xLCAzNSwgMSwgNTMgfSwKLSAgeyAweGEwMDAwMSwgMHgxYTAwMDAxLCAyMjAsIDIxMTUsIC0xLCAxMiwgMSwgNDggfSwKLSAgeyAweDUsIDB4ZCwgMjIwLCAyMTE2LCAtMSwgMzMsIDEsIDUzIH0sCi0gIHsgMHg4MSwgMHg4MSwgMjIwLCAyMTE3LCAtMSwgMjgsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjExOCwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MTAzLCAweDEwMywgMjIwLCAyMTE5LCAtMSwgMjcsIDEsIDI4IH0sCi0gIHsgMHgxMDEsIDB4MTAxLCAyMjAsIDIxMjAsIC0xLCAyNywgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTIxLCAtMSwgMzUsIDEsIDU3IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEyMiwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxMjMsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDMsIDB4MywgMjIwLCAyMTI0LCAtMSwgMzUsIDEsIDU3IH0sCi0gIHsgMHg1LCAweDUsIDIyMCwgMjEyNSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxMjYsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTI3LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEyOCwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxMjksIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTMwLCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEzMSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MywgMHgzLCAyMjAsIDIxMzIsIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDUsIDB4NSwgMjIwLCAyMTMzLCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEzNCwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MywgMHgzLCAyMjAsIDIxMzUsIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDUsIDB4NSwgMjIwLCAyMTM2LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjEzNywgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxMzgsIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTM5LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE0MCwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNDEsIC0xLCAzNSwgMSwgNTcgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTQyLCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE0MywgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNDQsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTQ1LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE0NiwgLTEsIDM1LCAxLCA0OCB9LAotICB7IDB4MTAxLCAweDEwMSwgMjIwLCAyMTQ3LCAtMSwgMjcsIDEsIDQ4IH0sCi0gIHsgMHg4MSwgMHg4MSwgMjIwLCAyMTQ4LCAtMSwgMjgsIDEsIDQ4IH0sCi0gIHsgMHgxMDMsIDB4MTAzLCAyMjAsIDIxNDksIC0xLCAyNywgMSwgNDggfSwKLSAgeyAweDQxLCAweDQxLCAyMjAsIDIxNTAsIC0xLCAyOSwgMSwgNDggfSwKLSAgeyAweDEwNSwgMHgxMDUsIDIyMCwgMjE1MSwgLTEsIDI3LCAxLCA0OCB9LAotICB7IDB4ODMsIDB4ODMsIDIyMCwgMjE1MiwgLTEsIDI4LCAxLCA0OCB9LAotICB7IDB4MTA3LCAweDEwNywgMjIwLCAyMTUzLCAtMSwgMjcsIDEsIDQ4IH0sCi0gIHsgMHg4MSwgMHg4MSwgMjIwLCAyMTU0LCAtMSwgMjgsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE1NSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MTAzLCAweDEwMywgMjIwLCAyMTU2LCAtMSwgMjcsIDEsIDI4IH0sCi0gIHsgMHgxMDEsIDB4MTAxLCAyMjAsIDIxNTcsIC0xLCAyNywgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTU4LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE1OSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNjAsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTYxLCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE2MiwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNjMsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTY0LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE2NSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNjYsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTY3LCAtMSwgMzUsIDEsIDIgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTY4LCAtMSwgMzUsIDEsIDI4IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE2OSwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNzAsIC0xLCAzNSwgMSwgMzQgfSwKLSAgeyAweDEsIDB4MSwgMjIwLCAyMTcxLCAtMSwgMzUsIDEsIDU3IH0sCi0gIHsgMHgxLCAweDEsIDIyMCwgMjE3MiwgLTEsIDM1LCAxLCAyOCB9LAotICB7IDB4MSwgMHgxLCAyMjAsIDIxNzMsIC0xLCAzNSwgMSwgMjggfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgMTc3NiwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCA0NCB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDQwIH0sCi0gIHsgMHhjMDAwMDEsIDB4YzAwMDAxLCAyMjEsIC0xLCAtMSwgMTIsIDEsIDQ5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgMjM0NywgLTEsIDM0LCAxLCA1NCB9LAotICB7IDB4MWMwMDAwMSwgMHgxYzAwMDAxLCAyMjEsIC0xLCAtMSwgMTIsIDEsIDQ5IH0sCi0gIHsgMHg3LCAweDcsIDIyMSwgMjM0OCwgLTEsIDM0LCAxLCA1NCB9LAotICB7IDB4ZTAwMDAxLCAweGUwMDAwMSwgMjIxLCAtMSwgLTEsIDEyLCAxLCA0OSB9LAotICB7IDB4NywgMHg3LCAyMjEsIDIzNDksIC0xLCAzMywgMSwgNTQgfSwKLSAgeyAweDFlMDAwMDEsIDB4MWUwMDAwMSwgMjIxLCAtMSwgLTEsIDEyLCAxLCA0OSB9LAotICB7IDB4ZiwgMHhmLCAyMjEsIDIzNTAsIC0xLCAzMywgMSwgNDkgfSwKLSAgeyAweGMwMDAwMSwgMHhjMDAwMDEsIDIyMSwgLTEsIC0xLCAxMiwgMSwgNDkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAyMzU1LCAtMSwgMzQsIDEsIDU0IH0sCi0gIHsgMHhlMDAwMDEsIDB4MWUwMDAwMSwgMjIxLCAtMSwgLTEsIDEyLCAxLCA0OSB9LAotICB7IDB4NywgMHhmLCAyMjEsIDIzNTYsIC0xLCAzMywgMSwgNTQgfSwKLSAgeyAweGMwMDAwMSwgMHhjMDAwMDEsIDIyMSwgLTEsIC0xLCAxMiwgMSwgNDkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAyMzU5LCAtMSwgMzQsIDEsIDU0IH0sCi0gIHsgMHgxYzAwMDAxLCAweDFjMDAwMDEsIDIyMSwgLTEsIC0xLCAxMiwgMSwgNDkgfSwKLSAgeyAweDcsIDB4NywgMjIxLCAyMzYwLCAtMSwgMzQsIDEsIDU0IH0sCi0gIHsgMHhlMDAwMDEsIDB4ZTAwMDAxLCAyMjEsIC0xLCAtMSwgMTIsIDEsIDQ5IH0sCi0gIHsgMHg3LCAweDcsIDIyMSwgMjM2MSwgLTEsIDMzLCAxLCA1NCB9LAotICB7IDB4MWUwMDAwMSwgMHgxZTAwMDAxLCAyMjEsIC0xLCAtMSwgMTIsIDEsIDQ5IH0sCi0gIHsgMHhmLCAweGYsIDIyMSwgMjM2MiwgLTEsIDMzLCAxLCA0OSB9LAotICB7IDB4YzAwMDAxLCAweGMwMDAwMSwgMjIxLCAtMSwgLTEsIDEyLCAxLCA0OSB9LAotICB7IDB4MywgMHgzLCAyMjEsIDIzNjcsIC0xLCAzNCwgMSwgNTQgfSwKLSAgeyAweGUwMDAwMSwgMHgxZTAwMDAxLCAyMjEsIC0xLCAtMSwgMTIsIDEsIDQ5IH0sCi0gIHsgMHg3LCAweGYsIDIyMSwgMjM2OCwgLTEsIDMzLCAxLCA1NCB9LAotICB7IDB4YzEsIDB4YzEsIDIyMSwgLTEsIC0xLCAyOCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAyMjg3LCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgxODMsIDB4MTgzLCAyMjEsIC0xLCAtMSwgMjcsIDEsIDI5IH0sCi0gIHsgMHgxODEsIDB4MTgxLCAyMjEsIDIyODgsIC0xLCAyNywgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgMTc3NywgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4NywgMHg3LCAyMjEsIC0xLCAtMSwgMzQsIDEsIDU3IH0sCi0gIHsgMHhiLCAweGIsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAxNzc4LCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDU3IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAxNzgxLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHg3LCAweDcsIDIyMSwgLTEsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweGIsIDB4YiwgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIDE3ODIsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDcsIDB4NywgMjIxLCAtMSwgLTEsIDM0LCAxLCA1NyB9LAotICB7IDB4YiwgMHhiLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgMTc4NCwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDU3IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAxNzg2LCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgNTcgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIDE3ODcsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgNDkgfSwKLSAgeyAweDE4MSwgMHgxODEsIDIyMSwgLTEsIC0xLCAyNywgMSwgNDkgfSwKLSAgeyAweGMxLCAweGMxLCAyMjEsIC0xLCAtMSwgMjgsIDEsIDQ5IH0sCi0gIHsgMHgxODMsIDB4MTgzLCAyMjEsIC0xLCAtMSwgMjcsIDEsIDQ5IH0sCi0gIHsgMHg2MSwgMHg2MSwgMjIxLCAtMSwgLTEsIDI5LCAxLCA0OSB9LAotICB7IDB4MTg1LCAweDE4NSwgMjIxLCAtMSwgLTEsIDI3LCAxLCA0OSB9LAotICB7IDB4YzMsIDB4YzMsIDIyMSwgLTEsIC0xLCAyOCwgMSwgNDkgfSwKLSAgeyAweDE4NywgMHgxODcsIDIyMSwgLTEsIC0xLCAyNywgMSwgNDkgfSwKLSAgeyAweGMxLCAweGMxLCAyMjEsIC0xLCAtMSwgMjgsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgMjI5MSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MTgzLCAweDE4MywgMjIxLCAtMSwgLTEsIDI3LCAxLCAyOSB9LAotICB7IDB4MTgxLCAweDE4MSwgMjIxLCAyMjkyLCAtMSwgMjcsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAyOSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMiB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAtMSwgLTEsIDM0LCAxLCAzNSB9LAotICB7IDB4MywgMHgzLCAyMjEsIC0xLCAtMSwgMzQsIDEsIDU3IH0sCi0gIHsgMHgzLCAweDMsIDIyMSwgLTEsIC0xLCAzNCwgMSwgMjkgfSwKLSAgeyAweDMsIDB4MywgMjIxLCAxNzg5LCAtMSwgMzQsIDEsIDI5IH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzYzLCAxMTQ1LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY0LCAxMTU0LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY1LCAxMTYzLCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY2LCAxMTcyLCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY3LCAxMTgxLCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY4LCAxMTkwLCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzY5LCAxMTk5LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzcwLCAxMjA4LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzcxLCAxMjE3LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzcyLCAxMjI2LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzczLCAxMjM2LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzc0LCAxMjQ2LCAzMiwgMSwgMTIzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzg3LCAxMjU5LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzg4LCAxMjY1LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzg5LCAxMjcxLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzkwLCAxMjc3LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzkxLCAxMjgzLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzkyLCAxMjg5LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzkzLCAxMjk1LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk0LCAxMzAxLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk1LCAxMzA3LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk2LCAxMzEzLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk3LCAxMzE5LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk4LCAxMzI1LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgMzk5LCAxMzMxLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgNDAwLCAxMzM3LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgNDAxLCAxMzQzLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgNDAyLCAxMzQ5LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgNDAzLCAxMzU1LCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgzLCAweDMsIDIyMiwgNDA0LCAxMzYxLCAzMiwgMSwgMTMzIH0sCi0gIHsgMHgxLCAweDEsIDIyMywgLTEsIC0xLCAyOCwgMSwgMzAgfSwKLSAgeyAweDEsIDB4MSwgMjIzLCAtMSwgLTEsIDI4LCAxLCAzMCB9LAotICB7IDB4MCwgMHgwLCAyMzAsIDc3MiwgLTEsIDAsIDEsIDEyOSB9LAotICB7IDB4MCwgMHgwLCAyMzAsIDc3MywgLTEsIDAsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjMxLCAtMSwgMTY1MiwgMzMsIDEsIDEyNiB9LAotICB7IDB4MSwgMHgxLCAyMzEsIC0xLCAxNjU1LCAzMywgMSwgMTI2IH0sCi0gIHsgMHgwLCAweDAsIDIzMSwgLTEsIDE2NTcsIDAsIDEsIDEzNSB9LAotICB7IDB4MCwgMHgwLCAyMzEsIC0xLCAxNjU4LCAwLCAxLCAxMzUgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MDYsIDc4NCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MDcsIDc5MiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MDgsIDc4OCwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MDksIDQ0MywgMzMsIDEsIDkgfSwKLSAgeyAweDgwMDAwMDEsIDB4ODAwMDAwMSwgMjMyLCA3MTAsIDQ1MSwgNiwgMSwgMTAgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MTEsIDQ0NywgMzMsIDEsIDkgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MTIsIDc5NiwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MTMsIDQ2MywgMzMsIDEsIDExIH0sCi0gIHsgMHgwLCAweDAsIDIzMiwgNzE0LCA4MDAsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIzMiwgNzE1LCA0NzUsIDMzLCAxLCAxOCB9LAotICB7IDB4MCwgMHgwLCAyMzIsIDcxNiwgODA1LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMzIsIDcxNywgODA5LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyMzIsIDcxOCwgNDk4LCAzMywgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MTksIDUwMiwgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDIzMiwgNzIwLCA4MTMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMiwgNzIxLCA4MTcsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIzMiwgNzIyLCA1MjIsIDMzLCAxLCAyMSB9LAotICB7IDB4ODAwMDAwMSwgMHg4MDAwMDAxLCAyMzIsIDcyMywgNTI2LCA2LCAxLCAyMSB9LAotICB7IDB4MCwgMHgwLCAyMzIsIDcyNCwgODIxLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyMzIsIDcyNSwgNTM4LCAzMywgMSwgMjIgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MjYsIDgyNSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMyLCA3MjcsIDgyOSwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MjgsIDU1OCwgMzMsIDEsIDIzIH0sCi0gIHsgMHg4MDAwMDAxLCAweDgwMDAwMDEsIDIzMiwgNzI5LCA1NjIsIDYsIDEsIDIzIH0sCi0gIHsgMHgwLCAweDAsIDIzMiwgNzMwLCA4MzMsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIzMiwgNzMxLCA1NzQsIDMzLCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCAyMzIsIDczMiwgODM4LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMzIsIDczMywgODQyLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyMzIsIDczNCwgNTk3LCAzMywgMSwgMjAgfSwKLSAgeyAweDEsIDB4MSwgMjMyLCA3MzUsIDYwMSwgMzMsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDIzMiwgNzM2LCA4NDYsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDIzMiwgNzM3LCA2MTMsIDMzLCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMTIsIDc4MywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjEzLCA3OTEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIxNCwgNzg3LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMTUsIDQ0MiwgMCwgMSwgOSB9LAotICB7IDB4MSwgMHgxLCAyMzMsIDIyMTYsIDQ1MCwgNiwgMSwgMTAgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjE3LCA0NDYsIDAsIDEsIDkgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjE4LCA3OTUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIxOSwgNDYyLCAwLCAxLCAxMSB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMjAsIDc5OSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjIxLCA0NzQsIDAsIDEsIDE4IH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIyMiwgODA0LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMjMsIDgwOCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjI0LCA0OTcsIDAsIDEsIDIwIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIyNSwgNTAxLCAwLCAxLCAyMCB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMjYsIDgxMiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjI3LCA4MTYsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIyOCwgNTIxLCAwLCAxLCAyMSB9LAotICB7IDB4MSwgMHgxLCAyMzMsIDIyMjksIDUyNSwgNiwgMSwgMjEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjMwLCA4MjAsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIzMSwgNTM3LCAwLCAxLCAyMiB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMzIsIDgyNCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjMzLCA4MjgsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIzNCwgNTU3LCAwLCAxLCAyMyB9LAotICB7IDB4MSwgMHgxLCAyMzMsIDIyMzUsIDU2MSwgNiwgMSwgMjMgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjM2LCA4MzIsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjIzNywgNTczLCAwLCAxLCAyNCB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyMzgsIDgzNywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjM5LCA4NDEsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjI0MCwgNTk2LCAwLCAxLCAyMCB9LAotICB7IDB4MCwgMHgwLCAyMzMsIDIyNDEsIDYwMCwgMCwgMSwgMjAgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAyMjQyLCA4NDUsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDIzMywgMjI0MywgNjEyLCAwLCAxLCAyNCB9LAotICB7IDB4MSwgMHgxLCAyMzMsIDczOCwgOTIyLCAyNywgMSwgMTkgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCA3MzksIDkyMCwgMCwgMSwgMTkgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCA5NjYsIDkyNCwgMCwgMSwgMiB9LAotICB7IDB4MCwgMHgxLCAyMzMsIDkzMiwgOTMwLCAyMCwgMSwgNTkgfSwKLSAgeyAweDAsIDB4MCwgMjMzLCAxMDgsIDkyOCwgMCwgMSwgNTkgfSwKLSAgeyAweDEsIDB4MSwgMjM2LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgwLCAweDAsIDIzNiwgLTEsIC0xLCAwLCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDIzNiwgMjM4NCwgLTEsIDI3LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDIzNiwgMjM4NSwgLTEsIDI3LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDIzNiwgMjM4NiwgLTEsIDI3LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDIzNiwgMjM4NywgLTEsIDI3LCAxLCAyIH0sCi0gIHsgMHgwLCAweDAsIDI1NywgLTEsIDE4NTMsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDI1NywgLTEsIDE4NTUsIDAsIDAsIC0xIH0sCi0gIHsgMHgxLCAweDEsIDI1NywgLTEsIC0xLCAyOCwgMSwgMjYgfSwKLSAgeyAweDEsIDB4MSwgMjU3LCAtMSwgLTEsIDI4LCAxLCAyNiB9LAotICB7IDB4MCwgMHgwLCAyNTcsIC0xLCAxODkwLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyNTcsIC0xLCAxODkyLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyNTcsIC0xLCAtMSwgMjgsIDEsIDI2IH0sCi0gIHsgMHgxLCAweDEsIDI1NywgLTEsIC0xLCAyOCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMjU5LCAyMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMjU5LCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MCwgMjU5LCAtMSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MSwgMjU5LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgwLCAweDEsIDI1OSwgLTEsIC0xLCAyOSwgMSwgMiB9LAotICB7IDB4MCwgMHgxLCAyNTksIC0xLCAtMSwgMjksIDEsIDIgfSwKLSAgeyAweDAsIDB4MSwgMjU5LCAtMSwgLTEsIDI5LCAxLCAyIH0sCi0gIHsgMHgwLCAweDEsIDI1OSwgLTEsIC0xLCAyOSwgMSwgMiB9LAotICB7IDB4MCwgMHgwLCAyNTksIDE3NiwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDAsIDB4MSwgMjU5LCAtMSwgLTEsIDI5LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDUgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA1IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDU2IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNTYgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTgyOSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTgzMSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTgzMywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTgzNSwgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA0NiB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDQ2IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNDYgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA0NiB9LAotICB7IDB4MCwgMHgwLCAyNjAsIC0xLCAxODM3LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyNjAsIC0xLCAxODM5LCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDQ2IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNDYgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTg0MSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTg0MywgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTg0NSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjYwLCAtMSwgMTg0NywgMCwgMCwgLTEgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA0NiB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDQ2IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNDYgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAtMSwgLTEsIDEyLCAxLCA0NiB9LAotICB7IDB4MCwgMHgwLCAyNjAsIC0xLCAxODQ5LCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyNjAsIC0xLCAxODUxLCAwLCAwLCAtMSB9LAotICB7IDB4MSwgMHgxLCAyNjAsIC0xLCAtMSwgMTIsIDEsIDQ2IH0sCi0gIHsgMHgxLCAweDEsIDI2MCwgLTEsIC0xLCAxMiwgMSwgNDYgfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAzMTMsIC0xLCAxMiwgMSwgNjggfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAzNTUsIC0xLCAxMiwgMSwgNjggfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAzMTcsIC0xLCAxMiwgMSwgNjggfSwKLSAgeyAweDEsIDB4MSwgMjYwLCAzNTksIC0xLCAxMiwgMSwgNjggfSwKLSAgeyAweDAsIDB4MCwgMjYxLCAtMSwgMTgzNiwgMCwgMCwgLTEgfSwKLSAgeyAweDksIDB4OSwgMjYxLCAtMSwgMjM1NCwgMzMsIDEsIDQ2IH0sCi0gIHsgMHgwLCAweDAsIDI2MSwgMTExMiwgMTg4NSwgMCwgMCwgLTEgfSwKLSAgeyAweDMsIDB4MywgMjYxLCAxMTEzLCAtMSwgMjcsIDEsIDQ2IH0sCi0gIHsgMHgwLCAweDAsIDI2NSwgMjI4MSwgLTEsIDAsIDEsIDAgfSwKLSAgeyAweDMsIDB4MywgMjY2LCAtMSwgLTEsIDI3LCAxLCAwIH0sCi0gIHsgMHgzLCAweDMsIDI2NiwgLTEsIC0xLCAyNywgMSwgMCB9LAotICB7IDB4MywgMHgzLCAyNjYsIC0xLCAtMSwgMjcsIDEsIDIgfSwKLSAgeyAweDMsIDB4MywgMjY2LCAtMSwgLTEsIDI3LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDI2NywgMjM4MCwgLTEsIDI4LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDI2NywgMjM4MSwgLTEsIDI4LCAxLCAwIH0sCi0gIHsgMHgxLCAweDEsIDI2NywgMjM4MiwgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDI2NywgMjM4MywgLTEsIDI4LCAxLCAyIH0sCi0gIHsgMHgxLCAweDEsIDI2OCwgLTEsIC0xLCAyNywgMSwgMiB9LAotICB7IDB4MSwgMHgxLCAyNjgsIC0xLCAtMSwgMjcsIDEsIDIgfSwKLSAgeyAweDAsIDB4MCwgMjY4LCAtMSwgNzgxLCAwLCAwLCAtMSB9LAotICB7IDB4MCwgMHgwLCAyNjksIDIzOTMsIDIyNTgsIDAsIDAsIC0xIH0sCi0gIHsgMHgwLCAweDAsIDI2OSwgMjM5NCwgMjI2MCwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjcwLCAtMSwgMjI1OSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjcwLCAtMSwgMjI2MSwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjcxLCAtMSwgLTEsIDAsIDEsIDM3IH0sCi0gIHsgMHgwLCAweDAsIDI3MSwgLTEsIC0xLCAwLCAxLCAzNyB9LAotICB7IDB4MCwgMHgwLCAyNzYsIC0xLCAtMSwgMCwgMSwgMzAgfSwKLSAgeyAweDAsIDB4MCwgMjgwLCAtMSwgMTg1OSwgMCwgMSwgMjYgfSwKLSAgeyAweDAsIDB4MCwgMjgxLCAtMSwgLTEsIDAsIDEsIDYzIH0sCi0gIHsgMHgwLCAweDAsIDI4MSwgLTEsIC0xLCAwLCAxLCA2MyB9LAotICB7IDB4MCwgMHgwLCAyODEsIDE2NzEsIDIzNzEsIDAsIDEsIDY3IH0sCi0gIHsgMHgwLCAweDAsIDI4MSwgLTEsIDM1NiwgMCwgMCwgLTEgfSwKLSAgeyAweDAsIDB4MCwgMjgxLCAxNjczLCAyMzczLCAwLCAxLCA2NyB9LAotICB7IDB4MCwgMHgwLCAyODEsIC0xLCAzNjAsIDAsIDAsIC0xIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlhNjRfbWFpbl90YWJsZQotbWFpbl90YWJsZVtdID0gewotICB7IDUsIDEsIDEsIDB4MTAwMDAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDAsIH0sCi0gIHsgNSwgMSwgMSwgMHgxMDAwODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAzLCAwIH0sIDB4MCwgMSwgfSwKLSAgeyA1LCA3LCAxLCAweDB1bGwsIDB4MHVsbCwgeyAyMywgNjUsIDI1LCAwLCAwIH0sIDB4MCwgMiwgfSwKLSAgeyA2LCAxLCAxLCAweDEyMDAwMDAwMDAwdWxsLCAweDFlMDAwMDAwMDAwdWxsLCB7IDIzLCA2NSwgMjYsIDAsIDAgfSwgMHgwLCAzLCB9LAotICB7IDcsIDEsIDEsIDB4MTAwNDAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDQsIH0sCi0gIHsgNywgMSwgMSwgMHgxMGMwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMDAwMHVsbCwgeyAyMywgNjIsIDI1LCAwLCAwIH0sIDB4MCwgNSwgfSwKLSAgeyA4LCAxLCAxLCAweDEwODAwMDAwMDAwdWxsLCAweDFlZTAwMDAwMDAwdWxsLCB7IDIzLCA2MiwgMjUsIDAsIDAgfSwgMHgwLCA2LCB9LAotICB7IDksIDMsIDEsIDB4MmMwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMDAwMHVsbCwgeyAyMywgMiwgNTEsIDUyLCA1MyB9LCAweDIyMSwgNywgfSwKLSAgeyAxMCwgMSwgMSwgMHgxMDA2MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgOCwgfSwKLSAgeyAxMCwgMSwgMSwgMHgxMDE2MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgNTQsIDI1LCAwLCAwIH0sIDB4MCwgOSwgfSwKLSAgeyAxMSwgMSwgMSwgMHgxMDA2ODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTAsIH0sCi0gIHsgMTEsIDEsIDEsIDB4MTAxNjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDU0LCAyNSwgMCwgMCB9LCAweDAsIDExLCB9LAotICB7IDE0LCA0LCAwLCAweDEwMDAwMDAwMHVsbCwgMHgxZWZmODAwMTFmZnVsbCwgeyAxNSwgMCwgMCwgMCwgMCB9LCAweDQwLCA3ODIsIH0sCi0gIHsgMTQsIDQsIDAsIDB4MTAwMDAwMDAwdWxsLCAweDFlZmY4MDAxMWMwdWxsLCB7IDE1LCAwLCAwLCAwLCAwIH0sIDB4MCwgNjQ4LCB9LAotICB7IDE0LCA0LCAwLCAweDEwMDAwMDAwMHVsbCwgMHgxZWZmODAwMTFjMHVsbCwgeyAxNSwgMCwgMCwgMCwgMCB9LCAweDQwLCA2NDksIH0sCi0gIHsgMTQsIDQsIDAsIDB4MTA4MDAwMTAwdWxsLCAweDFlZmY4MDAxMWMwdWxsLCB7IDE1LCAwLCAwLCAwLCAwIH0sIDB4MjAwLCAxNzY3LCB9LAotICB7IDE0LCA0LCAwLCAweDEwODAwMDEwMHVsbCwgMHgxZWZmODAwMTFjMHVsbCwgeyAxNSwgMCwgMCwgMCwgMCB9LCAweDI0MCwgMTc2OCwgfSwKLSAgeyAxNCwgNCwgMSwgMHgyMDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDE0LCAxNSwgMCwgMCwgMCB9LCAweDAsIDQwNSwgfSwKLSAgeyAxNCwgNCwgMSwgMHgyMDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDE0LCAxNSwgMCwgMCwgMCB9LCAweDQwLCA0MDYsIH0sCi0gIHsgMTQsIDQsIDAsIDB4ODAwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTFmZnVsbCwgeyA4MCwgMCwgMCwgMCwgMCB9LCAweDQwLCA4MDMsIH0sCi0gIHsgMTQsIDQsIDAsIDB4ODAwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTFjMHVsbCwgeyA4MCwgMCwgMCwgMCwgMCB9LCAweDAsIDY1MCwgfSwKLSAgeyAxNCwgNCwgMCwgMHg4MDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMWMwdWxsLCB7IDgwLCAwLCAwLCAwLCAwIH0sIDB4NDAsIDY1MSwgfSwKLSAgeyAxNCwgNCwgMCwgMHg4MDAwMDAwMDgwdWxsLCAweDFlZTAwMDAxMWMwdWxsLCB7IDgwLCAwLCAwLCAwLCAwIH0sIDB4MjEwLCAyMzkxLCB9LAotICB7IDE0LCA0LCAwLCAweDgwMDAwMDAwODB1bGwsIDB4MWVlMDAwMDExYzB1bGwsIHsgODAsIDAsIDAsIDAsIDAgfSwgMHgyNTAsIDIzOTIsIH0sCi0gIHsgMTQsIDQsIDAsIDB4ODAwMDAwMDE0MHVsbCwgMHgxZWUwMDAwMTFjMHVsbCwgeyA4MCwgMCwgMCwgMCwgMCB9LCAweDMwLCA0MTMsIH0sCi0gIHsgMTQsIDQsIDAsIDB4ODAwMDAwMDE0MHVsbCwgMHgxZWUwMDAwMTFjMHVsbCwgeyA4MCwgMCwgMCwgMCwgMCB9LCAweDcwLCA0MTQsIH0sCi0gIHsgMTQsIDQsIDAsIDB4ODAwMDAwMDE4MHVsbCwgMHgxZWUwMDAwMTFjMHVsbCwgeyA4MCwgMCwgMCwgMCwgMCB9LCAweDIzMCwgNDExLCB9LAotICB7IDE0LCA0LCAwLCAweDgwMDAwMDAxODB1bGwsIDB4MWVlMDAwMDExYzB1bGwsIHsgODAsIDAsIDAsIDAsIDAgfSwgMHgyNzAsIDQxMiwgfSwKLSAgeyAxNCwgNCwgMSwgMHhhMDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDE0LCA4MCwgMCwgMCwgMCB9LCAweDAsIDQwNywgfSwKLSAgeyAxNCwgNCwgMSwgMHhhMDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDE0LCA4MCwgMCwgMCwgMCB9LCAweDQwLCA0MDgsIH0sCi0gIHsgMTUsIDQsIDAsIDB4MHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyA2NCwgMCwgMCwgMCwgMCB9LCAweDAsIDM2MSwgfSwKLSAgeyAxNSwgNSwgMCwgMHgwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MCwgNzc0LCB9LAotICB7IDE1LCAyLCAwLCAweDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgNjQsIDAsIDAsIDAsIDAgfSwgMHgyLCA5MDcsIH0sCi0gIHsgMTUsIDMsIDAsIDB4MHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyA2NCwgMCwgMCwgMCwgMCB9LCAweDAsIDk4OCwgfSwKLSAgeyAxNSwgNiwgMCwgMHgwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDY4LCAwLCAwLCAwLCAwIH0sIDB4MCwgMjM5NSwgfSwKLSAgeyAxNSwgNywgMCwgMHgwdWxsLCAweDB1bGwsIHsgNjQsIDAsIDAsIDAsIDAgfSwgMHgwLCAxNCwgfSwKLSAgeyAxNiwgNiwgMCwgMHgxODAwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTFmZnVsbCwgeyA4MSwgMCwgMCwgMCwgMCB9LCAweDQwLCA4MzYsIH0sCi0gIHsgMTYsIDYsIDAsIDB4MTgwMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDExYzB1bGwsIHsgODEsIDAsIDAsIDAsIDAgfSwgMHgwLCA2NTIsIH0sCi0gIHsgMTYsIDYsIDAsIDB4MTgwMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDExYzB1bGwsIHsgODEsIDAsIDAsIDAsIDAgfSwgMHg0MCwgNjUzLCB9LAotICB7IDE2LCA2LCAxLCAweDFhMDAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDE0LCA4MSwgMCwgMCwgMCB9LCAweDAsIDQwOSwgfSwKLSAgeyAxNiwgNiwgMSwgMHgxYTAwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTAwMHVsbCwgeyAxNCwgODEsIDAsIDAsIDAgfSwgMHg0MCwgNDEwLCB9LAotICB7IDE3LCA0LCAwLCAweDQwODAwMDAwMDB1bGwsIDB4MWU5ZjgwMDAwMTh1bGwsIHsgMTUsIDc2LCAwLCAwLCAwIH0sIDB4MjAsIDIyNzcsIH0sCi0gIHsgMTcsIDQsIDAsIDB4ZTAwMDAwMDAwMHVsbCwgMHgxZTgwMDAwMDAxOHVsbCwgeyA4MCwgNzYsIDAsIDAsIDAgfSwgMHgyMCwgMjI3OCwgfSwKLSAgeyAxOCwgNCwgMCwgMHg2MDAwMDAwMHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MmMsIDIxNiwgfSwKLSAgeyAyMiwgMiwgMCwgMHgyMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDAwMDB1bGwsIHsgMjQsIDc5LCAwLCAwLCAwIH0sIDB4MCwgMTc3MiwgfSwKLSAgeyAyMiwgMywgMCwgMHg4MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDAwMDB1bGwsIHsgMjMsIDgwLCAwLCAwLCAwIH0sIDB4MCwgMjE4LCB9LAotICB7IDIyLCAzLCAwLCAweGMwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMDAwMHVsbCwgeyAxNywgODAsIDAsIDAsIDAgfSwgMHgwLCAyMTksIH0sCi0gIHsgMjIsIDMsIDAsIDB4MjIwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMDAwMHVsbCwgeyAyNCwgNzksIDAsIDAsIDAgfSwgMHgwLCAxNzczLCB9LAotICB7IDIyLCAzLCAwLCAweDI2MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDAwMDB1bGwsIHsgMTgsIDc5LCAwLCAwLCAwIH0sIDB4MCwgMTc3NCwgfSwKLSAgeyAyMiwgNywgMCwgMHgwdWxsLCAweDB1bGwsIHsgMjQsIDc5LCAwLCAwLCAwIH0sIDB4MCwgMTc3NSwgfSwKLSAgeyAyNSwgNCwgMCwgMHgyMDAwMDAwMHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MjI0LCAxNiwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxODAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDI0LCAyNSwgMCB9LCAweDAsIDk2OCwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxODAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDI1LCAyNCwgMCB9LCAweDAsIDk0OCwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxODAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDI1LCAyNCwgMCB9LCAweDAsIDg4MSwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxODAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDI0LCAyNSwgMCB9LCAweDAsIDg2NSwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxODIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDI0LCAyNSwgMCB9LCAweDQwLCAxMDk2LCB9LAotICB7IDI2LCAxLCAyLCAweDE5MDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgNiwgMjUsIDAgfSwgMHgwLCA4ODIsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MTkwMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA2LCAyNSwgMCB9LCAweDQwLCA5NTAsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MTg4MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA1NCwgMjUsIDAgfSwgMHgwLCA5NzEsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MTg4MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA1NiwgMjUsIDAgfSwgMHgwLCA5NTEsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MTg4MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCA1NiwgMjUsIDAgfSwgMHgwLCA4ODQsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MTg4MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCA1NCwgMjUsIDAgfSwgMHgwLCA4NjgsIH0sCi0gIHsgMjYsIDEsIDIsIDB4MThhMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA1NCwgMjUsIDAgfSwgMHg0MCwgMTA5OSwgfSwKLSAgeyAyNiwgMSwgMiwgMHgxYTgwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDU4LCAyNSwgMCB9LCAweDAsIDk2MywgfSwKLSAgeyAyNiwgMSwgMiwgMHgxYTgwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDU4LCAyNSwgMCB9LCAweDAsIDg5NywgfSwKLSAgeyAyNiwgMSwgMiwgMHgxYzIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDI0LCAyNSwgMCB9LCAweDQwLCAxMTAwLCB9LAotICB7IDI2LCAxLCAyLCAweDFkMDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgNiwgMjUsIDAgfSwgMHg0MCwgOTUyLCB9LAotICB7IDI2LCAxLCAyLCAweDFjYTAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgNTQsIDI1LCAwIH0sIDB4NDAsIDExMDEsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MTg0MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCAyNCwgMjUsIDAgfSwgMHgwLCA5NzMsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MTg0MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCAyNSwgMjQsIDAgfSwgMHgwLCA5NTMsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MTg0MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCAyNSwgMjQsIDAgfSwgMHgwLCA4ODYsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MTg0MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCAyNCwgMjUsIDAgfSwgMHgwLCA4NzAsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MTg2MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCAyNCwgMjUsIDAgfSwgMHg0MCwgMTEwNCwgfSwKLSAgeyAyNywgMSwgMiwgMHgxOTQwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDYsIDI1LCAwIH0sIDB4MCwgODg3LCB9LAotICB7IDI3LCAxLCAyLCAweDE5NDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgNiwgMjUsIDAgfSwgMHg0MCwgOTU1LCB9LAotICB7IDI3LCAxLCAyLCAweDE4YzAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgNTQsIDI1LCAwIH0sIDB4MCwgOTc2LCB9LAotICB7IDI3LCAxLCAyLCAweDE4YzAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgNTYsIDI1LCAwIH0sIDB4MCwgOTU2LCB9LAotICB7IDI3LCAxLCAyLCAweDE4YzAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgNTYsIDI1LCAwIH0sIDB4MCwgODg5LCB9LAotICB7IDI3LCAxLCAyLCAweDE4YzAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgNTQsIDI1LCAwIH0sIDB4MCwgODczLCB9LAotICB7IDI3LCAxLCAyLCAweDE4ZTAwMDAwMDAwdWxsLCAweDFlZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgNTQsIDI1LCAwIH0sIDB4NDAsIDExMDcsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MWFjMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA1NSwgMjUsIDAgfSwgMHgwLCA5ODUsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MWFjMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCA1NywgMjUsIDAgfSwgMHgwLCA5NjUsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MWFjMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCA1NywgMjUsIDAgfSwgMHgwLCA4OTksIH0sCi0gIHsgMjcsIDEsIDIsIDB4MWFjMDAwMDAwMDB1bGwsIDB4MWVlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCA1NSwgMjUsIDAgfSwgMHgwLCA4ODAsIH0sCi0gIHsgMjcsIDEsIDIsIDB4MWM2MDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCAyNCwgMjUsIDAgfSwgMHg0MCwgMTEwOCwgfSwKLSAgeyAyNywgMSwgMiwgMHgxZDQwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDYsIDI1LCAwIH0sIDB4NDAsIDk1NywgfSwKLSAgeyAyNywgMSwgMiwgMHgxY2UwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDU0LCAyNSwgMCB9LCAweDQwLCAxMTA5LCB9LAotICB7IDI4LCAzLCAxLCAweDgwMDgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMSwgMCB9LCAweDAsIDI1MSwgfSwKLSAgeyAyOSwgMywgMSwgMHg4MDQ4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDIzLCAzMiwgMjQsIDEsIDAgfSwgMHgwLCAyNTIsIH0sCi0gIHsgMzAsIDMsIDEsIDB4ODA4ODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMzIsIDI0LCAxLCAwIH0sIDB4MCwgMjUzLCB9LAotICB7IDMxLCAzLCAxLCAweDgwYzgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMSwgMCB9LCAweDAsIDI1NCwgfSwKLSAgeyAzMywgNCwgMCwgMHgxMDAwMDAwMHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MjI0LCAxNywgfSwKLSAgeyAzNSwgMiwgMSwgMHhjMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCA5MzQsIH0sCi0gIHsgMzYsIDIsIDEsIDB4YzgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI1LCAwLCAwLCAwIH0sIDB4MCwgOTM1LCB9LAotICB7IDM4LCAyLCAxLCAweDgwMDAwMDAwMDB1bGwsIDB4MWUwMDAwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgNDYsIDcxIH0sIDB4MCwgMTgsIH0sCi0gIHsgMzgsIDIsIDEsIDB4YTYwMDAwMDAwMHVsbCwgMHgxZWUwNDAwMDAwMHVsbCwgeyAyMywgMjQsIDQ0LCA3MiwgMCB9LCAweDAsIDIzOTksIH0sCi0gIHsgMzgsIDIsIDEsIDB4YTYwNDAwMDAwMHVsbCwgMHgxZWUwNDAwMDAwMHVsbCwgeyAyMywgNTQsIDQ0LCA3MiwgMCB9LCAweDAsIDI0MDAsIH0sCi0gIHsgMzgsIDIsIDEsIDB4YWUwMDAwMDAwMHVsbCwgMHgxZWUwMDAwMDAwMHVsbCwgeyAyMywgNDcsIDI1LCA0NSwgNzIgfSwgMHgwLCAxOSwgfSwKLSAgeyA0MiwgNCwgMCwgMHg4MDAwMDAwMHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MjAsIDIwLCB9LAotICB7IDQ3LCAyLCAxLCAweGE0MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDIwMDB1bGwsIHsgMjMsIDI1LCA3NSwgNzIsIDAgfSwgMHgwLCAyMjk1LCB9LAotICB7IDQ5LCA1LCAxLCAweDgwMDAwMDAwdWxsLCAweDFlM2Y4MGZlMDAwdWxsLCB7IDE3LCAxOSwgMCwgMCwgMCB9LCAweDQwLCAyMiwgfSwKLSAgeyA1MCwgNSwgMSwgMHgxMDAwODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMTksIDE4LCAwLCAwIH0sIDB4NDAsIDE4MjQsIH0sCi0gIHsgNTEsIDUsIDEsIDB4YjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDE4MjUsIH0sCi0gIHsgNTEsIDUsIDEsIDB4YjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDQwLCAyNCwgfSwKLSAgeyA1MiwgNSwgMSwgMHhiMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgMTgyNiwgfSwKLSAgeyA1MiwgNSwgMSwgMHhiMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4NDAsIDI1LCB9LAotICB7IDUzLCA1LCAxLCAweDE2MDAwMDAwMHVsbCwgMHgxZTNmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgMjYsIH0sCi0gIHsgNTQsIDUsIDEsIDB4MTY4MDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCAyNywgfSwKLSAgeyA1NiwgMywgMCwgMHgyMTgwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDI1LCAwLCAwLCAwLCAwIH0sIDB4MCwgMjgsIH0sCi0gIHsgNTcsIDUsIDAsIDB4NDAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgNzgsIDAsIDAsIDAsIDAgfSwgMHgwLCAxODI3LCB9LAotICB7IDU3LCA1LCAwLCAweDQwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDc4LCAwLCAwLCAwLCAwIH0sIDB4NDAsIDI5LCB9LAotICB7IDU4LCA1LCAyLCAweGEwMDAwMDAwMDB1bGwsIDB4MWUwMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCAxOCwgNTksIDAgfSwgMHgwLCA5OTAsIH0sCi0gIHsgNTgsIDUsIDIsIDB4YTAwMDAwMDAwMHVsbCwgMHgxZTAwMDAwMTAwMHVsbCwgeyAyMiwgMjEsIDE4LCA1OSwgMCB9LCAweDQwLCAxMTI3LCB9LAotICB7IDU5LCA1LCAwLCAweDI4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDAsIDAsIDAsIDAsIDAgfSwgMHgwLCAxODI4LCB9LAotICB7IDU5LCA1LCAwLCAweDI4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDAsIDAsIDAsIDAsIDAgfSwgMHg0MCwgMzAsIH0sCi0gIHsgNjAsIDUsIDIsIDB4ODAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMTAwMHVsbCwgeyAyMSwgMjIsIDE4LCAxOSwgMCB9LCAweDAsIDc1OCwgfSwKLSAgeyA2MCwgNSwgMiwgMHg4MDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgMTgsIDE5LCAwIH0sIDB4NDAsIDc1OSwgfSwKLSAgeyA2MCwgNSwgMiwgMHg5MDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIxLCAyMiwgMTksIDE4LCAwIH0sIDB4MCwgODkxLCB9LAotICB7IDYwLCA1LCAyLCAweDkwMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjEsIDIyLCAxOSwgMTgsIDAgfSwgMHg0MCwgODkyLCB9LAotICB7IDYwLCA1LCAyLCAweDgwMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCAxOCwgMTksIDAgfSwgMHgwLCAxMTEwLCB9LAotICB7IDYwLCA1LCAyLCAweDgwMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDEwMDB1bGwsIHsgMjIsIDIxLCAxOCwgMTksIDAgfSwgMHg0MCwgMTExMSwgfSwKLSAgeyA2MCwgNSwgMiwgMHg5MDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgMTksIDE4LCAwIH0sIDB4MCwgMTExNiwgfSwKLSAgeyA2MCwgNSwgMiwgMHg5MDAwMDAwMDAwdWxsLCAweDFmZTAwMDAxMDAwdWxsLCB7IDIyLCAyMSwgMTksIDE4LCAwIH0sIDB4NDAsIDExMTcsIH0sCi0gIHsgNjEsIDUsIDEsIDB4YzAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAwLCAwLCAwIH0sIDB4MCwgODU1LCB9LAotICB7IDYxLCA1LCAxLCAweGMwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMCwgMCwgMCB9LCAweDQwLCA4NTYsIH0sCi0gIHsgNjEsIDUsIDEsIDB4ZTAwMDAwMDB1bGwsIDB4MWUzZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAwLCAwLCAwIH0sIDB4MCwgMjM5NywgfSwKLSAgeyA2MSwgNSwgMSwgMHgxMDAwODAwMDAwMHVsbCwgMHgxZmZmODBmZTAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHg0MCwgMjM5OCwgfSwKLSAgeyA2MiwgMywgMSwgMHg4NDg4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDIzLCAzMiwgNzAsIDAsIDAgfSwgMHgwLCAyNTUsIH0sCi0gIHsgNjMsIDMsIDEsIDB4ODRjODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMzIsIDcwLCAwLCAwIH0sIDB4MCwgMjU2LCB9LAotICB7IDY2LCAzLCAwLCAweDYwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDAsIDAsIDAsIDAsIDAgfSwgMHgyMSwgMzEsIH0sCi0gIHsgNjcsIDUsIDEsIDB4MTAwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHgwLCAxODYyLCB9LAotICB7IDY3LCA1LCAxLCAweDEwMDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4NDAsIDMyLCB9LAotICB7IDY4LCA1LCAxLCAweGE4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCAxODYzLCB9LAotICB7IDY4LCA1LCAxLCAweGE4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHg0MCwgMzMsIH0sCi0gIHsgNjksIDUsIDEsIDB4ODAwMDAwMDB1bGwsIDB4MWUzZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDE3ODAsIH0sCi0gIHsgNzAsIDUsIDEsIDB4YTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDE4NjQsIH0sCi0gIHsgNzAsIDUsIDEsIDB4YTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDQwLCAzNCwgfSwKLSAgeyA3MSwgNSwgMSwgMHgxYzgwMDAwMDB1bGwsIDB4MWUzZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDk2NywgfSwKLSAgeyA3MiwgNSwgMSwgMHgxMDAwMDAwMDAwMHVsbCwgMHgxZmMwMDBmZTAwMHVsbCwgeyAxNywgMTksIDIwLCAwLCAwIH0sIDB4NDAsIDE4NjcsIH0sCi0gIHsgNzMsIDUsIDEsIDB4MTQwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHgwLCAxODcwLCB9LAotICB7IDczLCA1LCAxLCAweDE0MDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4NDAsIDM2LCB9LAotICB7IDc0LCA1LCAxLCAweDg4MDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDE3LCAxOSwgMCwgMCwgMCB9LCAweGMwLCAzNywgfSwKLSAgeyA3NSwgNSwgMSwgMHg4ODAwMDAwMHVsbCwgMHgxZTNmODBmZTAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHg0MCwgMzgsIH0sCi0gIHsgNzYsIDUsIDEsIDB4MTgwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHgwLCAxODczLCB9LAotICB7IDc2LCA1LCAxLCAweDE4MDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4NDAsIDM5LCB9LAotICB7IDc3LCA1LCAxLCAweDE4MDAwMDAwMDAwdWxsLCAweDFmYzAwMGZlMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDAsIDAgfSwgMHg0MCwgMTg3NiwgfSwKLSAgeyA3OCwgNSwgMSwgMHgxMDAwODAwMDAwMHVsbCwgMHgxZmZmODBmZTAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHg0MCwgMTg3OSwgfSwKLSAgeyA3OSwgNSwgMSwgMHgxNzAwMDAwMDB1bGwsIDB4MWUzZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDQyLCB9LAotICB7IDgwLCA1LCAxLCAweDIwODAwMDAwMDB1bGwsIDB4MWUzZjgwZmUwMDB1bGwsIHsgMTcsIDE5LCAwLCAwLCAwIH0sIDB4NDAsIDQzLCB9LAotICB7IDgxLCA1LCAxLCAweDE0MDAwMDAwMHVsbCwgMHgxZTNmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgNDQsIH0sCi0gIHsgODIsIDUsIDEsIDB4MjBiODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgMTg4MCwgfSwKLSAgeyA4MiwgNSwgMSwgMHgyMGI4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHg0MCwgNDUsIH0sCi0gIHsgODMsIDUsIDEsIDB4MjBiMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgMTg4MSwgfSwKLSAgeyA4MywgNSwgMSwgMHgyMGIwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHg0MCwgNDYsIH0sCi0gIHsgODQsIDUsIDEsIDB4MjE4MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4MCwgNzYwLCB9LAotICB7IDg0LCA1LCAxLCAweDIxODAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDQwLCA3NjEsIH0sCi0gIHsgODUsIDUsIDEsIDB4MjBjMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDAsIDAsIDAgfSwgMHgwLCA4NTcsIH0sCi0gIHsgODUsIDUsIDEsIDB4MjBjMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDAsIDAsIDAgfSwgMHg0MCwgODU4LCB9LAotICB7IDg2LCA1LCAxLCAweDEzMDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4MCwgMTg5NCwgfSwKLSAgeyA4NiwgNSwgMSwgMHgxMzAwMDAwMDAwMHVsbCwgMHgxZmMwMDAwMDAwMHVsbCwgeyAxNywgMTksIDIwLCAxOCwgMCB9LCAweDQwLCA0NywgfSwKLSAgeyA4NywgNSwgMSwgMHgyMGE4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCAxODk1LCB9LAotICB7IDg3LCA1LCAxLCAweDIwYTgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDQwLCA0OCwgfSwKLSAgeyA4OCwgNSwgMSwgMHgyMDgwMDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCAxNzg4LCB9LAotICB7IDg5LCA1LCAxLCAweDIwYTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDE4OTYsIH0sCi0gIHsgODksIDUsIDEsIDB4MjBhMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDE5LCAwLCAwIH0sIDB4NDAsIDQ5LCB9LAotICB7IDkwLCA1LCAxLCAweDEzMDAwMDAwMDAwdWxsLCAweDFmYzAwMGZlMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDAsIDAgfSwgMHg0MCwgMTg5NywgfSwKLSAgeyA5MSwgNSwgMSwgMHgxNzAwMDAwMDAwMHVsbCwgMHgxZmMwMDAwMDAwMHVsbCwgeyAxNywgMTksIDIwLCAxOCwgMCB9LCAweDAsIDE4OTgsIH0sCi0gIHsgOTEsIDUsIDEsIDB4MTcwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHg0MCwgNTEsIH0sCi0gIHsgOTIsIDUsIDEsIDB4MjA4ODAwMDAwMHVsbCwgMHgxZTNmODAwMDAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHhjMCwgNTIsIH0sCi0gIHsgOTMsIDUsIDEsIDB4MjA4ODAwMDAwMHVsbCwgMHgxZTNmODBmZTAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHg0MCwgNTMsIH0sCi0gIHsgOTQsIDUsIDEsIDB4MWIwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHgwLCAxODk5LCB9LAotICB7IDk0LCA1LCAxLCAweDFiMDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4NDAsIDU0LCB9LAotICB7IDk1LCA1LCAxLCAweDFiMDAwMDAwMDAwdWxsLCAweDFmYzAwMGZlMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDAsIDAgfSwgMHg0MCwgMTkwMCwgfSwKLSAgeyA5NiwgNSwgMiwgMHgyMjAwMDAwMDAwdWxsLCAweDFmZTAwMDAwMDAwdWxsLCB7IDE3LCAyMiwgMTgsIDE5LCAwIH0sIDB4MCwgMTkwMSwgfSwKLSAgeyA5NiwgNSwgMiwgMHgyMjAwMDAwMDAwdWxsLCAweDFmZTAwMDAwMDAwdWxsLCB7IDE3LCAyMiwgMTgsIDE5LCAwIH0sIDB4NDAsIDU2LCB9LAotICB7IDk3LCA1LCAyLCAweDMyMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDAwMDB1bGwsIHsgMTcsIDIyLCAxOSwgMCwgMCB9LCAweDAsIDE5MDIsIH0sCi0gIHsgOTcsIDUsIDIsIDB4MzIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMDAwMHVsbCwgeyAxNywgMjIsIDE5LCAwLCAwIH0sIDB4NDAsIDU3LCB9LAotICB7IDk4LCA1LCAxLCAweDE3MDA4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAxOSwgMTgsIDAsIDAgfSwgMHg0MCwgMTkwMywgfSwKLSAgeyA5OSwgNSwgMiwgMHgyMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDAwMDB1bGwsIHsgMTcsIDIyLCAxOCwgMTksIDAgfSwgMHgwLCAxOTA0LCB9LAotICB7IDk5LCA1LCAyLCAweDIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMDAwMHVsbCwgeyAxNywgMjIsIDE4LCAxOSwgMCB9LCAweDQwLCA1OSwgfSwKLSAgeyAxMDAsIDUsIDIsIDB4MTIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMDAwMHVsbCwgeyAxNywgMjIsIDE5LCAwLCAwIH0sIDB4MCwgMTkwNSwgfSwKLSAgeyAxMDAsIDUsIDIsIDB4MTIwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMDAwMHVsbCwgeyAxNywgMjIsIDE5LCAwLCAwIH0sIDB4NDAsIDYwLCB9LAotICB7IDEwMSwgNSwgMSwgMHgxYzAwMDAwMDAwMHVsbCwgMHgxZjAwMDAwMDAwMHVsbCwgeyAxNywgMTksIDIwLCAxOCwgMCB9LCAweDAsIDYxLCB9LAotICB7IDEwMiwgNSwgMCwgMHgyMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyA0OSwgNTAsIDAsIDAsIDAgfSwgMHgwLCAxOTA2LCB9LAotICB7IDEwMiwgNSwgMCwgMHgyMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyA0OSwgNTAsIDAsIDAsIDAgfSwgMHg0MCwgNjIsIH0sCi0gIHsgMTAzLCA1LCAxLCAweDE0MDA4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAxOSwgMTgsIDAsIDAgfSwgMHg0MCwgMTkwOSwgfSwKLSAgeyAxMDQsIDUsIDEsIDB4MWEwMDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCA2NCwgfSwKLSAgeyAxMDUsIDUsIDEsIDB4MWUwMDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMTksIDAsIDAgfSwgMHgwLCAxNzQzLCB9LAotICB7IDEwNiwgMywgMCwgMHgxMDAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMCwgMCwgMCwgMCwgMCB9LCAweDAsIDY1LCB9LAotICB7IDEwOCwgNSwgMSwgMHgxNzgwMDAwMDB1bGwsIDB4MWUzZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAxOSwgMCwgMCB9LCAweDAsIDY2LCB9LAotICB7IDExMywgMywgMSwgMHg4NzA4MDAwMDAwdWxsLCAweDFmZmM4MDAwMDAwdWxsLCB7IDIzLCAxOCwgMCwgMCwgMCB9LCAweDAsIDIyMDYsIH0sCi0gIHsgMTIyLCAzLCAwLCAweDgwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDAsIDAsIDAsIDAsIDAgfSwgMHgwLCA2NywgfSwKLSAgeyAxMjIsIDMsIDAsIDB4OTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDAsIDAsIDAsIDAgfSwgMHgwLCA3NDMsIH0sCi0gIHsgMTIyLCAzLCAwLCAweDk4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDE3LCAwLCAwLCAwLCAwIH0sIDB4MCwgNzQ0LCB9LAotICB7IDEyMywgMywgMCwgMHgyMTcwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDI0LCAwLCAwLCAwLCAwIH0sIDB4YywgNjY5LCB9LAotICB7IDEyNCwgMywgMSwgMHgyMDcwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDI5LCAyNCwgMCwgMCwgMCB9LCAweDgsIDY3MCwgfSwKLSAgeyAxMjQsIDMsIDEsIDB4MjA3ODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAzMCwgMjQsIDAsIDAsIDAgfSwgMHg4LCA5MTAsIH0sCi0gIHsgMTI2LCAzLCAxLCAweDgwMDAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAwLCAwLCAwIH0sIDB4MCwgNjgsIH0sCi0gIHsgMTI2LCAzLCAxLCAweDkwMDAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDY5LCB9LAotICB7IDEyNiwgMywgMSwgMHhhMDAwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDIzLCAzMiwgNjEsIDAsIDAgfSwgMHgwLCA3MCwgfSwKLSAgeyAxMjcsIDMsIDEsIDB4ODA0MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMzIsIDAsIDAsIDAgfSwgMHgwLCA3MSwgfSwKLSAgeyAxMjcsIDMsIDEsIDB4OTA0MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMzIsIDI0LCAwLCAwIH0sIDB4MCwgNzIsIH0sCi0gIHsgMTI3LCAzLCAxLCAweGEwNDAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMjMsIDMyLCA2MSwgMCwgMCB9LCAweDAsIDczLCB9LAotICB7IDEyOCwgMywgMSwgMHg4MDgwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDIzLCAzMiwgMCwgMCwgMCB9LCAweDAsIDc0LCB9LAotICB7IDEyOCwgMywgMSwgMHg5MDgwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDIzLCAzMiwgMjQsIDAsIDAgfSwgMHgwLCA3NSwgfSwKLSAgeyAxMjgsIDMsIDEsIDB4YTA4MDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAyMywgMzIsIDYxLCAwLCAwIH0sIDB4MCwgNzYsIH0sCi0gIHsgMTI5LCAzLCAxLCAweDgwYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAwLCAwLCAwIH0sIDB4MCwgNzcsIH0sCi0gIHsgMTI5LCAzLCAxLCAweDkwYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDc4LCB9LAotICB7IDEyOSwgMywgMSwgMHhhMGMwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDIzLCAzMiwgNjEsIDAsIDAgfSwgMHgwLCA3OSwgfSwKLSAgeyAxMzAsIDMsIDEsIDB4YzZjMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMzIsIDAsIDAsIDAgfSwgMHgwLCA4NTIsIH0sCi0gIHsgMTMwLCAzLCAxLCAweGQ2YzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMTcsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDg1MywgfSwKLSAgeyAxMzAsIDMsIDEsIDB4ZTZjMDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAxNywgMzIsIDYxLCAwLCAwIH0sIDB4MCwgODU0LCB9LAotICB7IDEzMSwgMywgMSwgMHhjMDQwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAzMiwgMCwgMCwgMCB9LCAweDAsIDgwLCB9LAotICB7IDEzMSwgMywgMSwgMHhkMDQwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAzMiwgMjQsIDAsIDAgfSwgMHgwLCA4MSwgfSwKLSAgeyAxMzEsIDMsIDEsIDB4ZTA0MDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAxNywgMzIsIDYxLCAwLCAwIH0sIDB4MCwgODIsIH0sCi0gIHsgMTMyLCAzLCAxLCAweGMwYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMTcsIDMyLCAwLCAwLCAwIH0sIDB4MCwgODMsIH0sCi0gIHsgMTMyLCAzLCAxLCAweGQwYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMTcsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDg0LCB9LAotICB7IDEzMiwgMywgMSwgMHhlMGMwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDE3LCAzMiwgNjEsIDAsIDAgfSwgMHgwLCA4NSwgfSwKLSAgeyAxMzMsIDMsIDEsIDB4YzAwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMzIsIDAsIDAsIDAgfSwgMHgwLCA4NiwgfSwKLSAgeyAxMzMsIDMsIDEsIDB4ZDAwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMzIsIDI0LCAwLCAwIH0sIDB4MCwgODcsIH0sCi0gIHsgMTMzLCAzLCAxLCAweGUwMDAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMTcsIDMyLCA2MSwgMCwgMCB9LCAweDAsIDg4LCB9LAotICB7IDEzNCwgMywgMiwgMHhjMDQ4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMzIsIDAsIDAgfSwgMHgwLCA4OSwgfSwKLSAgeyAxMzQsIDMsIDIsIDB4ZDA0ODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDMyLCA1LCAwIH0sIDB4MCwgOTAsIH0sCi0gIHsgMTM1LCAzLCAyLCAweGMwYzgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAzMiwgMCwgMCB9LCAweDAsIDkxLCB9LAotICB7IDEzNSwgMywgMiwgMHhkMGM4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAxOCwgMzIsIDUsIDAgfSwgMHgwLCA5MiwgfSwKLSAgeyAxMzYsIDMsIDIsIDB4YzA4ODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAxNywgMTgsIDMyLCAwLCAwIH0sIDB4MCwgOTMsIH0sCi0gIHsgMTM2LCAzLCAyLCAweGQwODgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMTcsIDE4LCAzMiwgNCwgMCB9LCAweDAsIDk0LCB9LAotICB7IDEzNywgMywgMSwgMHhjMDgwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAzMiwgMCwgMCwgMCB9LCAweDAsIDk1LCB9LAotICB7IDEzNywgMywgMSwgMHhkMDgwMDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDE3LCAzMiwgMjQsIDAsIDAgfSwgMHgwLCA5NiwgfSwKLSAgeyAxMzcsIDMsIDEsIDB4ZTA4MDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAxNywgMzIsIDYxLCAwLCAwIH0sIDB4MCwgOTcsIH0sCi0gIHsgMTQwLCAzLCAwLCAweGNiMDAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDAsIDAsIDAsIDAgfSwgMHgwLCA5OCwgfSwKLSAgeyAxNDAsIDMsIDAsIDB4ZGIwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAzMiwgMjQsIDAsIDAsIDAgfSwgMHgwLCA5OSwgfSwKLSAgeyAxNDAsIDMsIDAsIDB4ZWIwMDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAzMiwgNjEsIDAsIDAsIDAgfSwgMHgwLCAxMDAsIH0sCi0gIHsgMTQxLCAzLCAwLCAweDUwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDAsIDAsIDAsIDAsIDAgfSwgMHgyMSwgMTAxLCB9LAotICB7IDE0OSwgMywgMCwgMHgxMTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMCwgMCwgMCwgMCwgMCB9LCAweDAsIDEwMiwgfSwKLSAgeyAxNTAsIDIsIDEsIDB4ZTg4MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTc0NCwgfSwKLSAgeyAxNTEsIDIsIDEsIDB4ZWE4MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTc0NSwgfSwKLSAgeyAxNTIsIDIsIDEsIDB4Zjg4MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTc0NiwgfSwKLSAgeyAxNTMsIDEsIDEsIDB4MTA4MDAwMDAwMDB1bGwsIDB4MWZmZjgwZmUwMDB1bGwsIHsgMjMsIDI1LCAwLCAwLCAwIH0sIDB4MCwgMTAzLCB9LAotICB7IDE1MywgMSwgMSwgMHgxMDgwMDAwMDAwMHVsbCwgMHgxZWUwN2YwMDAwMHVsbCwgeyAyMywgNjIsIDAsIDAsIDAgfSwgMHg0MCwgMTA0LCB9LAotICB7IDE1MywgMSwgMSwgMHgxMjAwMDAwMDAwMHVsbCwgMHgxZTAwMDMwMDAwMHVsbCwgeyAyMywgNjUsIDAsIDAsIDAgfSwgMHg0MCwgMTA1LCB9LAotICB7IDE1MywgNSwgMSwgMHg4MDAwMDAwMHVsbCwgMHgxZTNmODAwMDAwMHVsbCwgeyAxNywgMTksIDAsIDAsIDAgfSwgMHhjMCwgMTA2LCB9LAotICB7IDE1MywgMiwgMSwgMHhlMDAxMDAwMDB1bGwsIDB4MWVlMDBmMDAwMDB1bGwsIHsgMTQsIDI0LCAwLCAwLCAwIH0sIDB4NDAsIDEwNywgfSwKLSAgeyAxNTMsIDIsIDEsIDB4ZTAwMDAwMDAwdWxsLCAweDFlZTAwZjAwMDAwdWxsLCB7IDE0LCAyNCwgNzcsIDAsIDAgfSwgMHgwLCAyMjgwLCB9LAotICB7IDE1MywgMiwgMSwgMHgxODgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDE1LCAwLCAwLCAwIH0sIDB4MCwgMTA5LCB9LAotICB7IDE1MywgMiwgMSwgMHg2MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDAwMDB1bGwsIHsgOCwgMjQsIDYzLCAwLCAwIH0sIDB4MCwgMTEwLCB9LAotICB7IDE1MywgMiwgMSwgMHg0MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDAwMDB1bGwsIHsgOSwgNjcsIDAsIDAsIDAgfSwgMHgwLCAxMTEsIH0sCi0gIHsgMTUzLCAyLCAxLCAweDE4MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgNywgMCwgMCwgMCB9LCAweDAsIDExMiwgfSwKLSAgeyAxNTMsIDIsIDEsIDB4MTk4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCA4LCAwLCAwLCAwIH0sIDB4MCwgMTEzLCB9LAotICB7IDE1MywgMiwgMSwgMHgxNTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTMsIDI0LCAwLCAwLCAwIH0sIDB4MCwgOTExLCB9LAotICB7IDE1MywgMiwgMSwgMHg1MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxMywgNTQsIDAsIDAsIDAgfSwgMHgwLCA5MTIsIH0sCi0gIHsgMTUzLCAyLCAxLCAweDE5MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMTMsIDAsIDAsIDAgfSwgMHgwLCA5MTMsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDE0MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxMywgNTQsIDAsIDAsIDAgfSwgMHgwLCA5OTEsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIxNTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMTMsIDI0LCAwLCAwLCAwIH0sIDB4MCwgOTkyLCB9LAotICB7IDE1MywgMywgMSwgMHgyMTEwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAxMywgMCwgMCwgMCB9LCAweDAsIDk5MywgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjE2MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxNiwgMjQsIDAsIDAsIDAgfSwgMHg4LCAxMTQsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIxMjAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDE2LCAwLCAwLCAwIH0sIDB4OCwgMTE1LCB9LAotICB7IDE1MywgMywgMSwgMHgyMTY4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDExLCAyNCwgMCwgMCwgMCB9LCAweDgsIDExNiwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjE0ODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAxMiwgMjQsIDAsIDAsIDAgfSwgMHgwLCAxMTcsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIxMjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDEwLCAwLCAwLCAwIH0sIDB4OCwgMTE4LCB9LAotICB7IDE1MywgMywgMSwgMHgyMTA4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAxMiwgMCwgMCwgMCB9LCAweDAsIDExOSwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjAwMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAzNywgMjQsIDAsIDAsIDAgfSwgMHg4LCAxMjAsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIwMDgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjgsIDI0LCAwLCAwLCAwIH0sIDB4OCwgMTIxLCB9LAotICB7IDE1MywgMywgMSwgMHgyMDEwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDMxLCAyNCwgMCwgMCwgMCB9LCAweDgsIDEyMiwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjAxODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAzNCwgMjQsIDAsIDAsIDAgfSwgMHg4LCAxMjMsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIwMjAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMzUsIDI0LCAwLCAwLCAwIH0sIDB4OCwgMTI0LCB9LAotICB7IDE1MywgMywgMSwgMHgyMDI4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDM2LCAyNCwgMCwgMCwgMCB9LCAweDgsIDEyNSwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjAzMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAzMywgMjQsIDAsIDAsIDAgfSwgMHg4LCAxMjYsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIwODAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDM3LCAwLCAwLCAwIH0sIDB4OCwgMTI3LCB9LAotICB7IDE1MywgMywgMSwgMHgyMDg4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyOCwgMCwgMCwgMCB9LCAweDgsIDEyOCwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjA5MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMzEsIDAsIDAsIDAgfSwgMHg4LCAxMjksIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIwOTgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDM0LCAwLCAwLCAwIH0sIDB4OCwgMTMwLCB9LAotICB7IDE1MywgMywgMSwgMHgyMGEwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAzNSwgMCwgMCwgMCB9LCAweDgsIDEzMSwgfSwKLSAgeyAxNTMsIDMsIDEsIDB4MjBhODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMzYsIDAsIDAsIDAgfSwgMHgwLCAxMzIsIH0sCi0gIHsgMTUzLCAzLCAxLCAweDIwYjAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDMzLCAwLCAwLCAwIH0sIDB4OCwgMTMzLCB9LAotICB7IDE1MywgMywgMSwgMHgyMGI4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNywgMCwgMCwgMCB9LCAweDAsIDEzNCwgfSwKLSAgeyAxNTMsIDcsIDEsIDB4MHVsbCwgMHgwdWxsLCB7IDIzLCAxMywgMCwgMCwgMCB9LCAweDAsIDEzNSwgfSwKLSAgeyAxNTMsIDcsIDEsIDB4MHVsbCwgMHgwdWxsLCB7IDEzLCA1NCwgMCwgMCwgMCB9LCAweDAsIDEzNiwgfSwKLSAgeyAxNTMsIDcsIDEsIDB4MHVsbCwgMHgwdWxsLCB7IDEzLCAyNCwgMCwgMCwgMCB9LCAweDAsIDEzNywgfSwKLSAgeyAxNTQsIDYsIDEsIDB4YzAwMDAwMDAwMHVsbCwgMHgxZTAwMDEwMDAwMHVsbCwgeyAyMywgNjksIDAsIDAsIDAgfSwgMHgwLCAxMzgsIH0sCi0gIHsgMTU1LCAyLCAxLCAweGVjYTAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI0LCA3MywgMCwgMCB9LCAweDAsIDEzOSwgfSwKLSAgeyAxNTYsIDIsIDEsIDB4ZWVhMDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDc0LCAwLCAwIH0sIDB4MCwgMTQwLCB9LAotICB7IDE2NiwgNCwgMCwgMHg0MDAwMDAwMDAwdWxsLCAweDFlMWY4MDAwMDAwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MCwgMzYyLCB9LAotICB7IDE2NiwgNSwgMCwgMHg4MDAwMDAwdWxsLCAweDFlM2Y4MDAwMDAwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MCwgNzc1LCB9LAotICB7IDE2NiwgMiwgMCwgMHg4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MiwgOTE0LCB9LAotICB7IDE2NiwgMywgMCwgMHg4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MCwgOTk0LCB9LAotICB7IDE2NiwgNiwgMCwgMHg4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDY4LCAwLCAwLCAwLCAwIH0sIDB4MCwgMjM5NiwgfSwKLSAgeyAxNjYsIDcsIDAsIDB4MHVsbCwgMHgwdWxsLCB7IDY0LCAwLCAwLCAwLCAwIH0sIDB4MCwgMTQxLCB9LAotICB7IDE3MywgMSwgMSwgMHgxMDA3MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQyLCB9LAotICB7IDE3MywgMSwgMSwgMHgxMDE3MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgNTQsIDI1LCAwLCAwIH0sIDB4MCwgMTQzLCB9LAotICB7IDE3NiwgMiwgMSwgMHhlYTAwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAyMzc5LCB9LAotICB7IDE3NywgMiwgMSwgMHhmODIwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAyMjgyLCB9LAotICB7IDE3OCwgMSwgMSwgMHgxMDQwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ0LCB9LAotICB7IDE3OSwgMSwgMSwgMHgxMDYwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ1LCB9LAotICB7IDE4MCwgMSwgMSwgMHgxMTQwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ2LCB9LAotICB7IDE4MSwgMSwgMSwgMHgxMDQ1MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ3LCB9LAotICB7IDE4MiwgMSwgMSwgMHgxMDY1MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ4LCB9LAotICB7IDE4MywgMSwgMSwgMHgxMDQ3MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTQ5LCB9LAotICB7IDE4NCwgMSwgMSwgMHgxMDY3MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTUwLCB9LAotICB7IDE4NSwgMSwgMSwgMHgxMDUyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgNzYyLCB9LAotICB7IDE4NiwgMSwgMSwgMHgxMDcyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgNzYzLCB9LAotICB7IDE4NywgMSwgMSwgMHgxMTUyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgNzY0LCB9LAotICB7IDE4OCwgMiwgMSwgMHhlODUwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAyMjk2LCB9LAotICB7IDE4OSwgMiwgMSwgMHhlYTcwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAxNTEsIH0sCi0gIHsgMTkwLCAyLCAxLCAweGU4MTAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDIyOTcsIH0sCi0gIHsgMTkxLCAyLCAxLCAweGVhMzAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDE1MiwgfSwKLSAgeyAxOTIsIDIsIDEsIDB4ZWFkMDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTc0NywgfSwKLSAgeyAxOTMsIDIsIDEsIDB4ZTIzMDAwMDAwMHVsbCwgMHgxZmYzMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCA0MSwgMCB9LCAweDAsIDE1MywgfSwKLSAgeyAxOTQsIDIsIDEsIDB4ZTY5MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCAxNTQsIH0sCi0gIHsgMTk2LCAzLCAxLCAweDIxYzAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI1LCAyNCwgMCwgMCB9LCAweDAsIDE3NDgsIH0sCi0gIHsgMTk2LCAzLCAxLCAweDIwYzAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI1LCA0OCwgMCwgMCB9LCAweDAsIDE3NDksIH0sCi0gIHsgMTk2LCAzLCAwLCAweDIxODgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjUsIDQ4LCAwLCAwLCAwIH0sIDB4MCwgMTc3MSwgfSwKLSAgeyAxOTcsIDIsIDEsIDB4ZThiMDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTU1LCB9LAotICB7IDE5OCwgMiwgMSwgMHhlMjQwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAxNTYsIH0sCi0gIHsgMTk4LCAyLCAxLCAweGVlNTAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI0LCAzOCwgMCwgMCB9LCAweDAsIDE1NywgfSwKLSAgeyAxOTksIDIsIDEsIDB4ZjA0MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTU4LCB9LAotICB7IDE5OSwgMiwgMSwgMHhmYzUwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMzgsIDAsIDAgfSwgMHgwLCAxNTksIH0sCi0gIHsgMjAwLCAxLCAxLCAweDEwNjgwMDAwMDAwdWxsLCAweDFmZmUwMDAwMDAwdWxsLCB7IDIzLCAyNCwgNDAsIDI1LCAwIH0sIDB4MCwgMTYwLCB9LAotICB7IDIwMSwgMiwgMSwgMHhlMjIwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNSwgMjQsIDAsIDAgfSwgMHgwLCAxNjEsIH0sCi0gIHsgMjAxLCAyLCAxLCAweGU2MzAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI1LCA0MiwgMCwgMCB9LCAweDAsIDE2MiwgfSwKLSAgeyAyMDIsIDIsIDEsIDB4ZjAyMDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjUsIDI0LCAwLCAwIH0sIDB4MCwgMTYzLCB9LAotICB7IDIwMiwgMiwgMSwgMHhmNDMwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNSwgNDIsIDAsIDAgfSwgMHgwLCAxNjQsIH0sCi0gIHsgMjAzLCAxLCAxLCAweDEwNmMwMDAwMDAwdWxsLCAweDFmZmUwMDAwMDAwdWxsLCB7IDIzLCAyNCwgNDAsIDI1LCAwIH0sIDB4MCwgMTY1LCB9LAotICB7IDIwNCwgMSwgMSwgMHgxMDQyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTY2LCB9LAotICB7IDIwNSwgMSwgMSwgMHgxMDYyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTY3LCB9LAotICB7IDIwNiwgMSwgMSwgMHgxMTQyMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTY4LCB9LAotICB7IDIwNywgMywgMCwgMHgyMDQ4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDI1LCAyNCwgMCwgMCwgMCB9LCAweDgsIDk0MiwgfSwKLSAgeyAyMDcsIDMsIDAsIDB4MjA1MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyNSwgMjQsIDAsIDAsIDAgfSwgMHhjLCA4NjMsIH0sCi0gIHsgMjA3LCAzLCAwLCAweDIxYTAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjUsIDAsIDAsIDAsIDAgfSwgMHg4LCA3NDUsIH0sCi0gIHsgMjA4LCAzLCAwLCAweDIwNjAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjUsIDI0LCAwLCAwLCAwIH0sIDB4OCwgNjcxLCB9LAotICB7IDIxMywgNCwgMCwgMHg0MDAwMDAwMHVsbCwgMHgxZTFmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MjJjLCAxNjksIH0sCi0gIHsgMjE0LCAzLCAwLCAweDM4MDAwMDAwdWxsLCAweDFlZTc4MDAwMDAwdWxsLCB7IDY2LCAwLCAwLCAwLCAwIH0sIDB4OCwgMTcwLCB9LAotICB7IDIxNSwgMywgMCwgMHgyODAwMDAwMHVsbCwgMHgxZWU3ODAwMDAwMHVsbCwgeyA2NiwgMCwgMCwgMCwgMCB9LCAweDAsIDE3MSwgfSwKLSAgeyAyMjQsIDMsIDEsIDB4YzcwODAwMDAwMHVsbCwgMHgxZmZjODAwMDAwMHVsbCwgeyAxNywgMjQsIDAsIDAsIDAgfSwgMHgwLCAyMjA3LCB9LAotICB7IDIyNSwgMiwgMSwgMHhhNjAwMDAwMDAwdWxsLCAweDFlZTA0MDAwMDAwdWxsLCB7IDIzLCAyNCwgNDQsIDAsIDAgfSwgMHgxNDAsIDE3MiwgfSwKLSAgeyAyMjUsIDIsIDEsIDB4ZjI0MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgMTczLCB9LAotICB7IDIyNiwgMSwgMSwgMHgxMDA4MDAwMDAwMHVsbCwgMHgxZWZlMDAwMDAwMHVsbCwgeyAyMywgMjQsIDM5LCAyNSwgMCB9LCAweDAsIDE3NCwgfSwKLSAgeyAyMjcsIDEsIDEsIDB4MTAwYzAwMDAwMDB1bGwsIDB4MWVmZTAwMDAwMDB1bGwsIHsgMjMsIDI0LCAzOSwgMjUsIDAgfSwgMHgwLCAxNzUsIH0sCi0gIHsgMjI4LCAyLCAxLCAweGE0MDAwMDAwMDB1bGwsIDB4MWVlMDAwMDIwMDB1bGwsIHsgMjMsIDI1LCA3NSwgMCwgMCB9LCAweDE0MCwgMjMwMywgfSwKLSAgeyAyMjgsIDIsIDEsIDB4ZjIyMDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjUsIDI0LCAwLCAwIH0sIDB4MCwgMTc3LCB9LAotICB7IDIyOSwgMiwgMSwgMHhhYzAwMDAwMDAwdWxsLCAweDFlZTAwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDQzLCAwIH0sIDB4MCwgMTc4LCB9LAotICB7IDIzNCwgMywgMCwgMHgxODAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMCwgMCwgMCwgMCwgMCB9LCAweDAsIDY3MywgfSwKLSAgeyAyMzUsIDMsIDAsIDB4MzAwMDAwMDB1bGwsIDB4MWVlNzgwMDAwMDB1bGwsIHsgNjYsIDAsIDAsIDAsIDAgfSwgMHg4LCAxNzksIH0sCi0gIHsgMjM3LCAzLCAxLCAweDhjMDAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDI0LCAwLCAwLCAwIH0sIDB4MCwgMTgwLCB9LAotICB7IDIzNywgMywgMSwgMHhhYzAwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDMyLCAyNCwgNjAsIDAsIDAgfSwgMHgwLCAxODEsIH0sCi0gIHsgMjM4LCAzLCAxLCAweDhjNDAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDI0LCAwLCAwLCAwIH0sIDB4MCwgMTgyLCB9LAotICB7IDIzOCwgMywgMSwgMHhhYzQwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDMyLCAyNCwgNjAsIDAsIDAgfSwgMHgwLCAxODMsIH0sCi0gIHsgMjM5LCAzLCAxLCAweDhjODAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDI0LCAwLCAwLCAwIH0sIDB4MCwgMTg0LCB9LAotICB7IDIzOSwgMywgMSwgMHhhYzgwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDMyLCAyNCwgNjAsIDAsIDAgfSwgMHgwLCAxODUsIH0sCi0gIHsgMjQwLCAzLCAxLCAweDhjYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDI0LCAwLCAwLCAwIH0sIDB4MCwgMTg2LCB9LAotICB7IDI0MCwgMywgMSwgMHhhY2MwMDAwMDAwdWxsLCAweDFlZmYwMDAwMDAwdWxsLCB7IDMyLCAyNCwgNjAsIDAsIDAgfSwgMHgwLCAxODcsIH0sCi0gIHsgMjQxLCAzLCAxLCAweGNlYzAwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMzIsIDE4LCAwLCAwLCAwIH0sIDB4MCwgMjIxMCwgfSwKLSAgeyAyNDEsIDMsIDEsIDB4ZWVjMDAwMDAwMHVsbCwgMHgxZWZmMDAwMDAwMHVsbCwgeyAzMiwgMTgsIDYwLCAwLCAwIH0sIDB4MCwgMjIxMSwgfSwKLSAgeyAyNDIsIDMsIDEsIDB4Y2M0MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAzMiwgMTgsIDAsIDAsIDAgfSwgMHgwLCAxODgsIH0sCi0gIHsgMjQyLCAzLCAxLCAweGVjNDAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMzIsIDE4LCA2MCwgMCwgMCB9LCAweDAsIDE4OSwgfSwKLSAgeyAyNDMsIDMsIDEsIDB4Y2NjMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAzMiwgMTgsIDAsIDAsIDAgfSwgMHgwLCAxOTAsIH0sCi0gIHsgMjQzLCAzLCAxLCAweGVjYzAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMzIsIDE4LCA2MCwgMCwgMCB9LCAweDAsIDE5MSwgfSwKLSAgeyAyNDQsIDMsIDEsIDB4Y2MwMDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAzMiwgMTgsIDAsIDAsIDAgfSwgMHgwLCAxOTIsIH0sCi0gIHsgMjQ0LCAzLCAxLCAweGVjMDAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMzIsIDE4LCA2MCwgMCwgMCB9LCAweDAsIDE5MywgfSwKLSAgeyAyNDUsIDMsIDEsIDB4Y2M4MDAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAzMiwgMTgsIDAsIDAsIDAgfSwgMHgwLCAxOTQsIH0sCi0gIHsgMjQ1LCAzLCAxLCAweGVjODAwMDAwMDB1bGwsIDB4MWVmZjAwMDAwMDB1bGwsIHsgMzIsIDE4LCA2MCwgMCwgMCB9LCAweDAsIDE5NSwgfSwKLSAgeyAyNDYsIDEsIDEsIDB4MTAwMjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDE5NiwgfSwKLSAgeyAyNDYsIDEsIDEsIDB4MTAwMjAwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMywgMCB9LCAweDAsIDE5NywgfSwKLSAgeyAyNDYsIDEsIDEsIDB4MTAxMjgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDU0LCAyNSwgMCwgMCB9LCAweDAsIDE5OCwgfSwKLSAgeyAyNDcsIDMsIDAsIDB4MjAwMDAwMDB1bGwsIDB4MWVlNzgwMDAwMDB1bGwsIHsgNjYsIDAsIDAsIDAsIDAgfSwgMHgwLCAxOTksIH0sCi0gIHsgMjQ4LCAyLCAxLCAweGEwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNSwgMCwgMCwgMCB9LCAweDAsIDIwMCwgfSwKLSAgeyAyNDksIDIsIDEsIDB4YTgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI1LCAwLCAwLCAwIH0sIDB4MCwgMjAxLCB9LAotICB7IDI1MCwgMiwgMSwgMHhiMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCAyMDIsIH0sCi0gIHsgMjUxLCAzLCAwLCAweDE5ODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAwLCAwLCAwLCAwLCAwIH0sIDB4MCwgOTE3LCB9LAotICB7IDI1MiwgMywgMSwgMHgyMGY4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNSwgMCwgMCwgMCB9LCAweDgsIDIwMywgfSwKLSAgeyAyNTMsIDIsIDIsIDB4YTAwMDAwMDAwMHVsbCwgMHgxZmUwMDAwMzAwMHVsbCwgeyAyMSwgMjIsIDI1LCA3NSwgMCB9LCAweDAsIDI0MDEsIH0sCi0gIHsgMjUzLCAyLCAyLCAweGEwMDAwMDAwMDB1bGwsIDB4MWZlMDAwMDMwMDB1bGwsIHsgMjIsIDIxLCAyNSwgNzUsIDAgfSwgMHg0MCwgMTY3MiwgfSwKLSAgeyAyNTQsIDMsIDEsIDB4MjBkMDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCAyMDQsIH0sCi0gIHsgMjU1LCAyLCAyLCAweGEwMDAwMDIwMDB1bGwsIDB4MWZlMDAwMDMwMDB1bGwsIHsgMjEsIDIyLCAyNSwgMCwgMCB9LCAweDAsIDI0MDMsIH0sCi0gIHsgMjU1LCAyLCAyLCAweGEwMDAwMDIwMDB1bGwsIDB4MWZlMDAwMDMwMDB1bGwsIHsgMjIsIDIxLCAyNSwgMCwgMCB9LCAweDQwLCAxNjc0LCB9LAotICB7IDI1NiwgMywgMSwgMHgyMGYwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNSwgMCwgMCwgMCB9LCAweDgsIDIwNSwgfSwKLSAgeyAyNTgsIDMsIDEsIDB4MjBkODAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCAyMDYsIH0sCi0gIHsgMjYyLCAyLCAxLCAweGU4NDAwMDAwMDB1bGwsIDB4MWZmZjAwMDAwMDB1bGwsIHsgMjMsIDI0LCAyNSwgMCwgMCB9LCAweDAsIDkwMCwgfSwKLSAgeyAyNjMsIDIsIDEsIDB4ZWE0MDAwMDAwMHVsbCwgMHgxZmZmMDAwMDAwMHVsbCwgeyAyMywgMjQsIDI1LCAwLCAwIH0sIDB4MCwgOTAxLCB9LAotICB7IDI2NCwgMiwgMSwgMHhmODQwMDAwMDAwdWxsLCAweDFmZmYwMDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCA5MDIsIH0sCi0gIHsgMjcyLCAzLCAxLCAweDgyMDgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDIwNywgfSwKLSAgeyAyNzMsIDMsIDEsIDB4ODI0ODAwMDAwMHVsbCwgMHgxZmZmODAwMDAwMHVsbCwgeyAyMywgMzIsIDI0LCAwLCAwIH0sIDB4MCwgMjA4LCB9LAotICB7IDI3NCwgMywgMSwgMHg4Mjg4MDAwMDAwdWxsLCAweDFmZmY4MDAwMDAwdWxsLCB7IDIzLCAzMiwgMjQsIDAsIDAgfSwgMHgwLCAyMDksIH0sCi0gIHsgMjc1LCAzLCAxLCAweDgyYzgwMDAwMDB1bGwsIDB4MWZmZjgwMDAwMDB1bGwsIHsgMjMsIDMyLCAyNCwgMCwgMCB9LCAweDAsIDIxMCwgfSwKLSAgeyAyNzcsIDUsIDEsIDB4MWQwMDAwMDAwMDB1bGwsIDB4MWZjMDAwMDAwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMTgsIDAgfSwgMHgwLCA5NDYsIH0sCi0gIHsgMjc3LCA1LCAxLCAweDFkMDAwMDAwMDAwdWxsLCAweDFmYzAwMDAwMDAwdWxsLCB7IDE3LCAxOSwgMjAsIDE4LCAwIH0sIDB4NDAsIDk4NiwgfSwKLSAgeyAyNzgsIDUsIDEsIDB4MWQwMDAwMDAwMDB1bGwsIDB4MWZjMDAwZmUwMDB1bGwsIHsgMTcsIDE5LCAyMCwgMCwgMCB9LCAweDQwLCA5NDcsIH0sCi0gIHsgMjc5LCAxLCAxLCAweDEwMDc4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNCwgMjUsIDAsIDAgfSwgMHgwLCAyMTEsIH0sCi0gIHsgMjc5LCAxLCAxLCAweDEwMTc4MDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCA1NCwgMjUsIDAsIDAgfSwgMHgwLCAyMTIsIH0sCi0gIHsgMjgyLCAyLCAxLCAweDgwMDAwMDAwdWxsLCAweDFlZmY4MDAwMDAwdWxsLCB7IDIzLCAyNSwgMCwgMCwgMCB9LCAweDAsIDIxMywgfSwKLSAgeyAyODMsIDIsIDEsIDB4ODgwMDAwMDB1bGwsIDB4MWVmZjgwMDAwMDB1bGwsIHsgMjMsIDI1LCAwLCAwLCAwIH0sIDB4MCwgMjE0LCB9LAotICB7IDI4NCwgMiwgMSwgMHg5MDAwMDAwMHVsbCwgMHgxZWZmODAwMDAwMHVsbCwgeyAyMywgMjUsIDAsIDAsIDAgfSwgMHgwLCAyMTUsIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciBkaXNfdGFibGVbXSA9IHsKLTB4YTAsIDB4YzIsIDB4NjAsIDB4YTAsIDB4MmMsIDB4ODAsIDB4YTAsIDB4MmEsIDB4ODAsIDB4YTAsIDB4MWEsIDB4NzAsIAotMHg5OCwgMHhiMCwgMHgwMSwgMHg0MCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHgyNCwgMHgzMCwgMHhkMCwgMHgyNCwgCi0weDMwLCAweGM4LCAweDkwLCAweDI4LCAweDI0LCAweDMwLCAweGMwLCAweDI0LCAweDMwLCAweGI4LCAweDkwLCAweDUwLCAKLTB4OTAsIDB4MjgsIDB4MjQsIDB4MzAsIDB4YTgsIDB4MjQsIDB4MzAsIDB4YTAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MzAsIAotMHg5OCwgMHgyNCwgMHgzMCwgMHg5MCwgMHhhOCwgMHgwYiwgMHgyOCwgMHgxNSwgMHgwMCwgMHg5NywgMHgwMCwgMHg5NSwgCi0weGE4LCAweDlhLCAweDk4LCAweDA1LCAweDE4LCAweDkwLCAweGY4LCAweDkwLCAweDgwLCAweDkwLCAweDQwLCAweDgwLCAKLTB4YTQsIDB4MjEsIDB4MTgsIDB4MzQsIDB4MjYsIDB4ODAsIDB4YTQsIDB4MmUsIDB4NDgsIDB4MzUsIDB4Y2UsIDB4OTAsIAotMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzNSwgMHhjNCwgMHg4MCwgMHgzNCwgMHgwYSwgMHg4MSwgMHgzMywgMHhhNiwgCi0weDkwLCAweGUwLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDIwLCAweDMwLCAweDM0LCAweDA3LCAweGE0LCAKLTB4MWQsIDB4MjgsIDB4MzQsIDB4MDQsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MzAsIDB4NDgsIDB4MzYsIDB4MGYsIDB4YTQsIAotMHgyZiwgMHhmMCwgMHgzNiwgMHgwMywgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyZSwgMHhjOCwgMHgzNSwgCi0weGU0LCAweGE0LCAweDJlLCAweGEwLCAweDM1LCAweGRmLCAweDgwLCAweGE0LCAweDIwLCAweDEwLCAweDM0LCAweDAzLCAKLTB4OTIsIDB4MTgsIDB4OTEsIDB4YzAsIDB4ODAsIDB4OTEsIDB4ODAsIDB4OTAsIDB4ZjgsIDB4ZGIsIDB4ODQsIDB4NjAsIAotMHhlYSwgMHg0MCwgMHhjMCwgMHhjMCwgMHg4MCwgMHhhNCwgMHgzOSwgMHhmOCwgMHg4YywgMHgzYiwgMHg1OCwgMHg4NCwgCi0weDM3LCAweDc1LCAweGMwLCAweGMwLCAweDgwLCAweGE0LCAweDM5LCAweGU4LCAweDhjLCAweDNiLCAweDM4LCAweDg0LCAKLTB4MzcsIDB4NzMsIDB4ZDMsIDB4ODIsIDB4NDAsIDB4NTAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzcsIDB4MjcsIDB4NTAsIAotMHhjMCwgMHhjMCwgMHg4MSwgMHgzNywgMHgyNSwgMHhhNCwgMHgxZCwgMHgzOCwgMHgzMywgMHhhOCwgMHg4MCwgMHg5MCwgCi0weDI4LCAweDgwLCAweDMzLCAweGE0LCAweDgwLCAweDM0LCAweDBjLCAweDgxLCAweDkwLCAweDM4LCAweGE0LCAweDIwLCAKLTB4OTgsIDB4MzQsIDB4MGYsIDB4YTQsIDB4MjAsIDB4NjgsIDB4MzQsIDB4MDksIDB4YzAsIDB4NDAsIDB4MTAsIDB4MTAsIAotMHg5MCwgMHgzOCwgMHhhNCwgMHgxZCwgMHgxMCwgMHgzMywgMHhhMywgMHhhNCwgMHgxZCwgMHgwMCwgMHgzMywgMHhhMSwgCi0weDE4LCAweDI0LCAweDIxLCAweDEwLCAweDgzLCAweDkwLCAweGE4LCAweGQzLCAweDgyLCAweGMwLCAweGMwLCAweGMwLCAKLTB4ODAsIDB4YTQsIDB4MzksIDB4YzgsIDB4MzcsIDB4NWYsIDB4YzAsIDB4YzAsIDB4ODAsIDB4YTQsIDB4MzksIDB4YjgsIAotMHgzNywgMHg1YiwgMHhkMywgMHg4MiwgMHg0MCwgMHg1MCwgMHhjMCwgMHhjMCwgMHg4MSwgMHgzNywgMHgyMSwgMHg1MCwgCi0weGMwLCAweGMwLCAweDgxLCAweDM3LCAweDFmLCAweDkyLCAweGI4LCAweDk5LCAweDg0LCAweDIwLCAweDg4LCAweDkwLCAKLTB4NzgsIDB4OTAsIDB4NTAsIDB4MTAsIDB4MTAsIDB4ODAsIDB4YTQsIDB4MmUsIDB4NDAsIDB4MzUsIDB4Y2QsIDB4ODIsIAotMHgzNSwgMHhjMywgMHg5MCwgMHg4MCwgMHgxMCwgMHgxMCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgzMCwgMHg0MCwgMHgzNiwgCi0weDBlLCAweGE0LCAweDJmLCAweGU4LCAweDM2LCAweDAyLCAweDgwLCAweDkwLCAweDM4LCAweGE0LCAweDJlLCAweGMwLCAKLTB4MzUsIDB4ZTMsIDB4YTQsIDB4MmUsIDB4OTgsIDB4MzUsIDB4ZGUsIDB4ODMsIDB4OTAsIDB4YTgsIDB4ZDMsIDB4ODIsIAotMHhjMCwgMHhjMCwgMHhjMCwgMHg4MCwgMHhhNCwgMHgzOSwgMHg5OCwgMHgzNywgMHg1MywgMHhjMCwgMHhjMCwgMHg4MCwgCi0weGE0LCAweDM5LCAweDg4LCAweDM3LCAweDRmLCAweGQzLCAweDgyLCAweDQwLCAweDUwLCAweGMwLCAweGMwLCAweDgxLCAKLTB4MzcsIDB4MWIsIDB4NTAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzcsIDB4MTksIDB4MTgsIDB4MjQsIDB4MjAsIDB4OTAsIAotMHg4MywgMHg5MCwgMHhhOCwgMHhkMywgMHg4MiwgMHhjMCwgMHhjMCwgMHhjMCwgMHg4MCwgMHhhNCwgMHgzOSwgMHg2OCwgCi0weDM3LCAweDQ3LCAweGMwLCAweGMwLCAweDgwLCAweGE0LCAweDM5LCAweDU4LCAweDM3LCAweDQzLCAweGQzLCAweDgyLCAKLTB4NDAsIDB4NTAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzcsIDB4MTUsIDB4NTAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzcsIAotMHgxMywgMHg5NCwgMHg1MCwgMHg5MiwgMHhmOCwgMHg5OSwgMHg4NCwgMHgxZCwgMHg2OCwgMHg5MCwgMHg3OCwgMHg5MCwgCi0weDUwLCAweDEwLCAweDEwLCAweDgwLCAweGE0LCAweDJlLCAweDM4LCAweDM1LCAweGNjLCAweDgyLCAweDM1LCAweGMyLCAKLTB4OTAsIDB4ODAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MzAsIDB4MzgsIDB4MzYsIDB4MGQsIDB4YTQsIAotMHgyZiwgMHhlMCwgMHgzNiwgMHgwMSwgMHg4MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyZSwgMHhiOCwgMHgzNSwgMHhlMiwgCi0weGE0LCAweDJlLCAweDkwLCAweDM1LCAweGRkLCAweDgzLCAweDkwLCAweGU4LCAweGQzLCAweDgzLCAweGMwLCAweGMwLCAKLTB4YzAsIDB4ODAsIDB4YTQsIDB4M2EsIDB4MDgsIDB4OGMsIDB4M2IsIDB4NzgsIDB4ODQsIDB4MzcsIDB4NzcsIDB4YzAsIAotMHhjMCwgMHg4MCwgMHhhNCwgMHgzOSwgMHhmMCwgMHg4YywgMHgzYiwgMHg0OCwgMHg4NCwgMHgzNywgMHg3NCwgMHhkMywgCi0weDgyLCAweDQwLCAweDUwLCAweGMwLCAweGMwLCAweDgxLCAweDM3LCAweDI5LCAweDUwLCAweGMwLCAweGMwLCAweDgxLCAKLTB4MzcsIDB4MjYsIDB4MTgsIDB4MjQsIDB4MWQsIDB4NjAsIDB4ODMsIDB4OTAsIDB4YTgsIDB4ZDMsIDB4ODIsIDB4YzAsIAotMHhjMCwgMHhjMCwgMHg4MCwgMHhhNCwgMHgzOSwgMHhkOCwgMHgzNywgMHg2MywgMHhjMCwgMHhjMCwgMHg4MCwgMHhhNCwgCi0weDM5LCAweGMwLCAweDM3LCAweDVkLCAweGQzLCAweDgyLCAweDQwLCAweDUwLCAweGMwLCAweGMwLCAweDgxLCAweDM3LCAKLTB4MjMsIDB4NTAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzcsIDB4MjAsIDB4OTIsIDB4YjgsIDB4OTksIDB4ODQsIDB4MWQsIAotMHg1OCwgMHg5MCwgMHg3OCwgMHg5MCwgMHg1MCwgMHgxMCwgMHgxMCwgMHg4MCwgMHhhNCwgMHgyZSwgMHgzMCwgMHgzNSwgCi0weGNiLCAweDgyLCAweDM1LCAweGMxLCAweDkwLCAweDgwLCAweDEwLCAweDEwLCAweDkwLCAweDM4LCAweGE0LCAweDMwLCAKLTB4MzAsIDB4MzYsIDB4MGMsIDB4YTQsIDB4MmYsIDB4ZDgsIDB4MzYsIDB4MDAsIDB4ODAsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgyZSwgMHhiMCwgMHgzNSwgMHhlMSwgMHhhNCwgMHgyZSwgMHg4OCwgMHgzNSwgMHhkYywgMHg4MywgMHg5MCwgMHhhOCwgCi0weGQzLCAweDgyLCAweGMwLCAweGMwLCAweGMwLCAweDgwLCAweGE0LCAweDM5LCAweGE4LCAweDM3LCAweDU3LCAweGMwLCAKLTB4YzAsIDB4ODAsIDB4YTQsIDB4MzksIDB4OTAsIDB4MzcsIDB4NTEsIDB4ZDMsIDB4ODIsIDB4NDAsIDB4NTAsIDB4YzAsIAotMHhjMCwgMHg4MSwgMHgzNywgMHgxZCwgMHg1MCwgMHhjMCwgMHhjMCwgMHg4MSwgMHgzNywgMHgxYSwgMHgxOCwgMHgyMCwgCi0weDAxLCAweDQ4LCAweDgzLCAweDkwLCAweGE4LCAweGQzLCAweDgyLCAweGMwLCAweGMwLCAweGMwLCAweDgwLCAweGE0LCAKLTB4MzksIDB4NzgsIDB4MzcsIDB4NGIsIDB4YzAsIDB4YzAsIDB4ODAsIDB4YTQsIDB4MzksIDB4NjAsIDB4MzcsIDB4NDUsIAotMHhkMywgMHg4MiwgMHg0MCwgMHg1MCwgMHhjMCwgMHhjMCwgMHg4MSwgMHgzNywgMHgxNywgMHg1MCwgMHhjMCwgMHhjMCwgCi0weDgxLCAweDM3LCAweDE0LCAweGRhLCAweDA2LCAweGUwLCAweGVhLCAweDgwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAKLTB4YTQsIDB4MjEsIDB4MDAsIDB4MzQsIDB4MWUsIDB4ODAsIDB4MzQsIDB4MWIsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MjAsIAotMHhhOCwgMHgzNCwgMHgxOSwgMHg4MCwgMHgzNCwgMHgxNiwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyMCwgCi0weGU4LCAweDM0LCAweDFmLCAweDgwLCAweDM0LCAweDFjLCAweDkwLCAweDM4LCAweGE0LCAweDIwLCAweGMwLCAweDM0LCAKLTB4MWEsIDB4ODAsIDB4MzQsIDB4MTcsIDB4YzgsIDB4NDAsIDB4MTgsIDB4MDAsIDB4OTEsIDB4MzgsIDB4OTAsIDB4NDAsIAotMHg4MiwgMHhhNCwgMHgyZCwgMHhmOCwgMHgzNSwgMHhjMCwgMHg5MCwgMHhjMCwgMHg4MCwgMHg5MCwgMHg5MCwgMHg5MCwgCi0weDQ4LCAweGM5LCAweGUxLCAweDdlLCAweDQwLCAweDg1LCAweDM1LCAweGY4LCAweGM5LCAweGUxLCAweDdkLCAweDgwLCAKLTB4ODUsIDB4MzUsIDB4ZjUsIDB4ODAsIDB4MzUsIDB4ZjQsIDB4MTAsIDB4MTAsIDB4ODEsIDB4MzUsIDB4ZDAsIDB4OTAsIAotMHhhOCwgMHgxMCwgMHgxMCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzNSwgMHhlZSwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyZiwgCi0weDQ4LCAweDM1LCAweGVhLCAweGE0LCAweDJmLCAweDM4LCAweDM1LCAweGU4LCAweDkwLCAweDcwLCAweDEwLCAweDEwLCAKLTB4OTAsIDB4MzgsIDB4YTQsIDB4MmYsIDB4NjAsIDB4MzUsIDB4ZWQsIDB4ODAsIDB4MzUsIDB4ZWIsIDB4OTAsIDB4NjAsIAotMHg5MCwgMHgyOCwgMHgyNCwgMHgyZiwgMHg5OCwgMHhhNCwgMHgyZiwgMHg4OCwgMHgzNSwgMHhmMiwgMHg4MCwgMHhhNCwgCi0weDJmLCAweDc4LCAweDM1LCAweGYwLCAweDgwLCAweDkwLCAweGY4LCAweDkwLCAweDkwLCAweDkwLCAweDUwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzcsIDB4MGIsIDB4ODAsIDB4MzcsIDB4MTIsIDB4ODAsIDB4YTQsIDB4MzgsIDB4ODAsIDB4MzcsIAotMHgxMSwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzNywgMHgwZiwgMHg4MCwgMHhhNCwgMHgzOCwgMHg2OCwgMHgzNywgMHgwZSwgCi0weDgzLCAweDM3LCAweDBjLCAweDk4LCAweGIwLCAweDAxLCAweDQwLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDI0LCAKLTB4MmQsIDB4ZTgsIDB4MjQsIDB4MmQsIDB4ZTAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MmQsIDB4ZDgsIDB4MjQsIDB4MmQsIAotMHhkMCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHgyNCwgMHgyZCwgMHhjMCwgMHgyNCwgMHgyZCwgMHhiOCwgMHg5MCwgCi0weDI4LCAweDI0LCAweDJkLCAweGIwLCAweDI0LCAweDJkLCAweGE4LCAweGE4LCAweDA4LCAweGUwLCAweDBkLCAweGUwLCAKLTB4OTYsIDB4MzgsIDB4OTUsIDB4ZTgsIDB4OWIsIDB4NDgsIDB4MDUsIDB4YTgsIDB4OTEsIDB4YTAsIDB4OTAsIDB4ZDAsIAotMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxYywgMHg4OCwgMHgzMywgMHg5MiwgMHhhNCwgMHgxYywgMHg3OCwgCi0weDMzLCAweDkwLCAweDkwLCAweDM4LCAweGE0LCAweDFjLCAweDY4LCAweDMzLCAweDhlLCAweDgwLCAweDMzLCAweDhjLCAKLTB4OTAsIDB4NjAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MWMsIDB4MjgsIDB4YTQsIDB4MWMsIDB4MTgsIDB4MzMsIDB4ODQsIAotMHg5MCwgMHgzOCwgMHhhNCwgMHgxYywgMHgwOCwgMHgzMywgMHg4MiwgMHhhNCwgMHgxYywgMHg1MCwgMHgzMywgMHg4YiwgCi0weDkwLCAweGUwLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDFjLCAweDQwLCAweDMzLCAweDg5LCAweGE0LCAKLTB4MWMsIDB4MzAsIDB4MzMsIDB4ODcsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MmQsIDB4NjAsIDB4MzUsIDB4YjIsIDB4YTQsIAotMHgyZCwgMHgwMCwgMHgzNSwgMHhhNiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyYSwgMHhkOCwgMHgzNSwgCi0weDY3LCAweGE0LCAweDJhLCAweGE4LCAweDM1LCAweDYxLCAweDEwLCAweDEwLCAweGE0LCAweDFiLCAweGY4LCAweDMzLCAKLTB4ODAsIDB4OTEsIDB4NTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MWMsIDB4YjgsIAotMHg4MCwgMHgzMywgMHg5ZSwgMHg4MCwgMHhhNCwgMHgxYywgMHhjMCwgMHgzMywgMHg5YywgMHg5MCwgMHg1MCwgMHg5MCwgCi0weDI4LCAweDI0LCAweDFjLCAweGM4LCAweDgwLCAweDMzLCAweDlmLCAweDkwLCAweDM4LCAweGE0LCAweDFjLCAweGQwLCAKLTB4MzMsIDB4OWQsIDB4YTQsIDB4MWMsIDB4OTgsIDB4MzMsIDB4OTQsIDB4OTAsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgyYywgMHhhMCwgMHgzNSwgMHg5YSwgMHhhNCwgMHgyYywgMHg0MCwgMHgzNSwgMHg4ZSwgMHg5MCwgCi0weDM4LCAweGE0LCAweDJiLCAweGU4LCAweDM1LCAweDgyLCAweGE0LCAweDJiLCAweDk4LCAweDM1LCAweDc4LCAweDgxLCAKLTB4YTQsIDB4MWMsIDB4YTgsIDB4MzMsIDB4OTYsIDB4ZTQsIDB4ZTEsIDB4YzEsIDB4NDAsIDB4MzcsIDB4MDcsIDB4ZWQsIAotMHgyMSwgMHhiZiwgMHhlMCwgMHhkZiwgMHg4MCwgMHgzNywgMHgwMSwgMHg5MiwgMHg0MCwgMHg5OSwgMHgxOCwgMHgwMiwgCi0weDAwLCAweDEwLCAweDEwLCAweDkwLCAweDgwLCAweDEwLCAweDEwLCAweDkwLCAweDM4LCAweGE0LCAweDJkLCAweDU4LCAKLTB4MzUsIDB4YjEsIDB4YTQsIDB4MmMsIDB4ZjgsIDB4MzUsIDB4YTUsIDB4ODAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MmEsIAotMHhkMCwgMHgzNSwgMHg2NiwgMHhhNCwgMHgyYSwgMHhhMCwgMHgzNSwgMHg2MCwgMHgxMCwgMHgxMCwgMHg4MCwgMHg5MCwgCi0weDcwLCAweDkwLCAweDM4LCAweGE0LCAweDJjLCAweDk4LCAweDM1LCAweDk5LCAweGE0LCAweDJjLCAweDM4LCAweDM1LCAKLTB4OGQsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MmIsIDB4ZTAsIDB4MzUsIDB4ODEsIDB4YTQsIDB4MmIsIDB4OTAsIDB4MzUsIAotMHg3NywgMHhlNCwgMHhlMSwgMHhiZSwgMHg0MCwgMHgzNiwgMHhmYiwgMHhlZCwgMHgyMSwgMHhiYywgMHhlMCwgMHhkZiwgCi0weDQwLCAweDM2LCAweGY1LCAweDkyLCAweDgwLCAweDkyLCAweDQwLCAweDk5LCAweDE4LCAweDAyLCAweDAwLCAweDEwLCAKLTB4MTAsIDB4OTAsIDB4ODAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MmQsIDB4NTAsIDB4MzUsIDB4YjAsIAotMHhhNCwgMHgyYywgMHhmMCwgMHgzNSwgMHhhNCwgMHg4MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyYSwgMHhjOCwgMHgzNSwgCi0weDY1LCAweGE0LCAweDJhLCAweDk4LCAweDM1LCAweDVmLCAweDEwLCAweDEwLCAweDgwLCAweDkwLCAweDcwLCAweDkwLCAKLTB4MzgsIDB4YTQsIDB4MmMsIDB4OTAsIDB4MzUsIDB4OTgsIDB4YTQsIDB4MmMsIDB4MzAsIDB4MzUsIDB4OGMsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgyYiwgMHhkOCwgMHgzNSwgMHg4MCwgMHhhNCwgMHgyYiwgMHg4OCwgMHgzNSwgMHg3NiwgMHhlNCwgCi0weGUxLCAweGMxLCAweDgwLCAweDM3LCAweDA5LCAweGU1LCAweDIxLCAweGMwLCAweDAwLCAweDM3LCAweDAzLCAweDkyLCAKLTB4NTAsIDB4OTksIDB4MTgsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4ODAsIDB4MTAsIDB4MTAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgyZCwgMHg0OCwgMHgzNSwgMHhhZiwgMHhhNCwgMHgyYywgMHhlOCwgMHgzNSwgMHhhMywgMHg4MCwgCi0weDkwLCAweDM4LCAweGE0LCAweDJhLCAweGMwLCAweDM1LCAweDY0LCAweGE0LCAweDJhLCAweDkwLCAweDM1LCAweDVlLCAKLTB4MTAsIDB4MTAsIDB4ODAsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MmMsIDB4ODgsIDB4MzUsIDB4OTcsIAotMHhhNCwgMHgyYywgMHgyOCwgMHgzNSwgMHg4YiwgMHg5MCwgMHgzOCwgMHhhNCwgMHgyYiwgMHhkMCwgMHgzNSwgMHg3ZiwgCi0weGE0LCAweDJiLCAweDgwLCAweDM1LCAweDc1LCAweGVjLCAweGUxLCAweGJlLCAweGEwLCAweGU2LCAweGMwLCAweDM2LCAKLTB4ZmQsIDB4ZTUsIDB4MjEsIDB4YmQsIDB4MDAsIDB4MzYsIDB4ZjcsIDB4YzAsIDB4NDAsIDB4ODAsIDB4MTAsIDB4MTAsIAotMHg4MSwgMHg5MCwgMHg5MCwgMHg5MCwgMHg0OCwgMHhjOSwgMHhlMSwgMHg1YSwgMHhjMCwgMHg4NSwgMHgzNSwgMHg2ZiwgCi0weGM5LCAweGUxLCAweDViLCAweDQwLCAweDg1LCAweDM1LCAweDZjLCAweDgwLCAweDM1LCAweDZhLCAweDgwLCAweGQ4LCAKLTB4NDcsIDB4ODAsIDB4MGQsIDB4YzAsIDB4YzAsIDB4ODAsIDB4MTAsIDB4MTAsIDB4ODIsIDB4OTAsIDB4NTgsIDB4ZDUsIAotMHg4MSwgMHg4MCwgMHg4MCwgMHgzNiwgMHhmMSwgMHg4MCwgMHgzNiwgMHhlZiwgMHhkNSwgMHg4MSwgMHg4MCwgMHg4MCwgCi0weDM2LCAweGVkLCAweDgwLCAweDM2LCAweGViLCAweGMwLCAweDgwLCAweDEwLCAweDEwLCAweDgyLCAweDkwLCAweDU4LCAKLTB4ZDUsIDB4ODEsIDB4ODAsIDB4ODAsIDB4MzYsIDB4ZjIsIDB4ODAsIDB4MzYsIDB4ZjAsIDB4ZDUsIDB4ODEsIDB4ODAsIAotMHg4MCwgMHgzNiwgMHhlZSwgMHg4MCwgMHgzNiwgMHhlYywgMHhjMCwgMHg4MCwgMHg4NCwgMHgzNiwgMHhlYSwgMHhhMCwgCi0weDU2LCAweDUwLCAweGEwLCAweDQwLCAweDcwLCAweGE4LCAweDFkLCAweDQwLCAweDMzLCAweDE4LCAweGEwLCAweDEyLCAKLTB4MzgsIDB4YTAsIDB4MGIsIDB4NDgsIDB4OTYsIDB4MDAsIDB4OWEsIDB4ZjAsIDB4MDUsIDB4YzAsIDB4OTEsIDB4NzAsIAotMHg5MCwgMHhiOCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxNCwgMHg1MCwgMHgzMywgMHg3YywgMHhhNCwgCi0weDE0LCAweDYwLCAweDMzLCAweDdiLCAweDEwLCAweDEwLCAweGE0LCAweDE0LCAweDU4LCAweDMzLCAweDdhLCAweDkwLCAKLTB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTQsIDB4MjAsIDB4MzMsIDB4NjEsIDB4YTQsIDB4MTQsIDB4MzAsIDB4MzMsIAotMHg2MCwgMHgxMCwgMHgxMCwgMHhhNCwgMHgxNCwgMHgyOCwgMHgzMywgMHg1ZiwgMHg5MCwgMHhiOCwgMHg5MCwgMHg3MCwgCi0weDkwLCAweDM4LCAweGE0LCAweDEzLCAweGYwLCAweDMzLCAweDQ2LCAweGE0LCAweDE0LCAweDAwLCAweDMzLCAweDQ1LCAKLTB4MTAsIDB4MTAsIDB4YTQsIDB4MTMsIDB4ZjgsIDB4MzMsIDB4NDQsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgxMywgMHhjMCwgMHgzMywgMHgyYiwgMHhhNCwgMHgxMywgMHhkMCwgMHgzMywgMHgyYSwgMHgxMCwgMHgxMCwgMHhhNCwgCi0weDEzLCAweGM4LCAweDMzLCAweDI5LCAweDkxLCAweDcwLCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAKLTB4YTQsIDB4MTQsIDB4MzgsIDB4MzMsIDB4NzcsIDB4YTQsIDB4MTQsIDB4NDgsIDB4MzMsIDB4NzksIDB4MTAsIDB4MTAsIAotMHhhNCwgMHgxNCwgMHg0MCwgMHgzMywgMHg3OCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxNCwgMHgwOCwgCi0weDMzLCAweDVjLCAweGE0LCAweDE0LCAweDE4LCAweDMzLCAweDVlLCAweDEwLCAweDEwLCAweGE0LCAweDE0LCAweDEwLCAKLTB4MzMsIDB4NWQsIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTMsIDB4ZDgsIDB4MzMsIAotMHg0MSwgMHhhNCwgMHgxMywgMHhlOCwgMHgzMywgMHg0MywgMHgxMCwgMHgxMCwgMHhhNCwgMHgxMywgMHhlMCwgMHgzMywgCi0weDQyLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDEzLCAweGE4LCAweDMzLCAweDI2LCAweGE0LCAweDEzLCAKLTB4YjgsIDB4MzMsIDB4MjgsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MTMsIDB4YjAsIDB4MzMsIDB4MjcsIDB4ZTQsIDB4ZTEsIAotMHg1MSwgMHgwMCwgMHgzNSwgMHg0ZSwgMHg5YSwgMHhmMCwgMHgwNSwgMHgwMCwgMHg5MSwgMHg3MCwgMHg5MCwgMHhiOCwgCi0weDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDEzLCAweGEwLCAweDMzLCAweDc0LCAweGE0LCAweDEzLCAweDk4LCAKLTB4MzMsIDB4NzYsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MTMsIDB4OTAsIDB4MzMsIDB4NzUsIDB4OTAsIDB4NzAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgxMywgMHg4OCwgMHgzMywgMHg1OSwgMHhhNCwgMHgxMywgMHg4MCwgMHgzMywgMHg1YiwgMHgxMCwgCi0weDEwLCAweGE0LCAweDEzLCAweDc4LCAweDMzLCAweDVhLCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAKLTB4YTQsIDB4MTMsIDB4NzAsIDB4MzMsIDB4M2UsIDB4YTQsIDB4MTMsIDB4NjgsIDB4MzMsIDB4NDAsIDB4MTAsIDB4MTAsIAotMHhhNCwgMHgxMywgMHg2MCwgMHgzMywgMHgzZiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMywgMHg1OCwgCi0weDMzLCAweDIzLCAweGE0LCAweDEzLCAweDUwLCAweDMzLCAweDI1LCAweDEwLCAweDEwLCAweGE0LCAweDEzLCAweDQ4LCAKLTB4MzMsIDB4MjQsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIAotMHg3MSwgMHg4MCwgMHgzMywgMHg3MywgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHg3MiwgMHg5MCwgMHg1MCwgMHg5MCwgCi0weDI4LCAweDgwLCAweDMzLCAweDU2LCAweDgwLCAweDMzLCAweDU4LCAweDEwLCAweDEwLCAweDgwLCAweDMzLCAweDU3LCAKLTB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIDB4M2IsIDB4ODAsIDB4MzMsIDB4M2QsIAotMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgzYywgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHgyMCwgCi0weDgwLCAweDMzLCAweDIyLCAweDEwLCAweDEwLCAweDgwLCAweDMzLCAweDIxLCAweGU0LCAweGUxLCAweDNlLCAweDgwLCAKLTB4MzUsIDB4MGUsIDB4OTUsIDB4NDAsIDB4OWEsIDB4OTAsIDB4MDUsIDB4MDAsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIAotMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHg2ZSwgMHg4MCwgMHgzMywgMHg3MCwgMHgxMCwgMHgxMCwgCi0weDgwLCAweDMzLCAweDZmLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweDUzLCAweDgwLCAweDMzLCAKLTB4NTUsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4NTQsIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIAotMHhhNCwgMHgxMywgMHgzMCwgMHgzMywgMHgzOCwgMHhhNCwgMHgxMywgMHg0MCwgMHgzMywgMHgzYSwgMHgxMCwgMHgxMCwgCi0weGE0LCAweDEzLCAweDM4LCAweDMzLCAweDM5LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDEzLCAweDAwLCAKLTB4MzMsIDB4MWQsIDB4YTQsIDB4MTMsIDB4MTAsIDB4MzMsIDB4MWYsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MTMsIDB4MDgsIAotMHgzMywgMHgxZSwgMHg5MSwgMHgxMCwgMHg5MCwgMHg4OCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgCi0weDZiLCAweDgwLCAweDMzLCAweDZkLCAweDEwLCAweDEwLCAweDgwLCAweDMzLCAweDZjLCAweDkwLCAweDUwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzMsIDB4NTAsIDB4ODAsIDB4MzMsIDB4NTIsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4NTEsIAotMHg5MCwgMHhiOCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMywgMHgxOCwgMHgzMywgMHgzNSwgMHhhNCwgCi0weDEzLCAweDI4LCAweDMzLCAweDM3LCAweDEwLCAweDEwLCAweGE0LCAweDEzLCAweDIwLCAweDMzLCAweDM2LCAweDkwLCAKLTB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTIsIDB4ZTgsIDB4MzMsIDB4MWEsIDB4YTQsIDB4MTIsIDB4ZjgsIDB4MzMsIAotMHgxYywgMHgxMCwgMHgxMCwgMHhhNCwgMHgxMiwgMHhmMCwgMHgzMywgMHgxYiwgMHhlNCwgMHhlMSwgMHg1MCwgMHg4MCwgCi0weDM1LCAweDRjLCAweDk4LCAweGI4LCAweDAxLCAweDY4LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDkwLCAweDUwLCAKLTB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIDB4MTcsIDB4ODAsIDB4MzMsIDB4MTksIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIAotMHgxOCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzMCwgMHg2MCwgMHhhMCwgMHg5NywgMHgwMCwgMHg2MCwgMHhhMCwgMHg5NiwgCi0weGMwLCAweDkwLCAweDMwLCAweDYwLCAweGEwLCAweDk2LCAweDgwLCAweDYwLCAweGEwLCAweDk2LCAweDQwLCAweGU0LCAKLTB4ZTEsIDB4M2QsIDB4ODAsIDB4MzUsIDB4MGEsIDB4OTYsIDB4ZTgsIDB4OTQsIDB4ODAsIDB4OWEsIDB4MzAsIDB4MDQsIAotMHg0MCwgMHg5MSwgMHgxMCwgMHg5MCwgMHg4OCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHg2NSwgCi0weDgwLCAweDMzLCAweDZhLCAweDEwLCAweDEwLCAweDgwLCAweDMzLCAweDY5LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAKLTB4ODAsIDB4MzMsIDB4NGEsIDB4ODAsIDB4MzMsIDB4NGYsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4NGUsIDB4OTAsIAotMHg4OCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHgyZiwgMHg4MCwgMHgzMywgMHgzNCwgMHgxMCwgCi0weDEwLCAweDgwLCAweDMzLCAweDMzLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweDExLCAweDgwLCAKLTB4MzMsIDB4MTYsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4MTUsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIAotMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHg2MiwgMHg4MCwgMHgzMywgMHg2NCwgMHgxMCwgMHgxMCwgMHg4MCwgCi0weDMzLCAweDYzLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweDQ3LCAweDgwLCAweDMzLCAweDQ5LCAKLTB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4NDgsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzMywgMHgyYywgMHg4MCwgMHgzMywgMHgyZSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgyZCwgMHg5MCwgMHg1MCwgCi0weDkwLCAweDI4LCAweDgwLCAweDMzLCAweDBlLCAweDgwLCAweDMzLCAweDEwLCAweDEwLCAweDEwLCAweDgwLCAweDMzLCAKLTB4MGYsIDB4ZTQsIDB4ZTEsIDB4NTAsIDB4MDAsIDB4MzUsIDB4NGEsIDB4ODgsIDB4MDIsIDB4MjgsIDB4OTEsIDB4MTAsIAotMHg5MCwgMHg4OCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHg2NiwgMHg4MCwgMHgzMywgMHg2OCwgCi0weDEwLCAweDEwLCAweDgwLCAweDMzLCAweDY3LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweDRiLCAKLTB4ODAsIDB4MzMsIDB4NGQsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzMsIDB4NGMsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHgzMCwgMHg4MCwgMHgzMywgMHgzMiwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgCi0weDMxLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweDEyLCAweDgwLCAweDMzLCAweDE0LCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4MzMsIDB4MTMsIDB4ZTQsIDB4ZTEsIDB4M2MsIDB4ODAsIDB4MzUsIDB4MDYsIDB4OTMsIDB4NDAsIAotMHg5OSwgMHg5MCwgMHgwMywgMHgwMCwgMHg5MCwgMHhjMCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzMiwgCi0weDllLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweDlkLCAweDkwLCAweDI4LCAweDgxLCAweDMyLCAweDlhLCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4MzIsIDB4OTksIDB4OTAsIDB4NjAsIDB4OTAsIDB4MjgsIDB4ODEsIDB4MzIsIDB4OTYsIDB4MTAsIAotMHgxMCwgMHg4MCwgMHgzMiwgMHg5NSwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzMiwgMHg5MiwgMHgxMCwgMHgxMCwgMHg4MCwgCi0weDMyLCAweDkxLCAweDkwLCAweGMwLCAweDkwLCAweDYwLCAweDkwLCAweDI4LCAweDgxLCAweDMyLCAweDliLCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4MzIsIDB4OWMsIDB4OTAsIDB4MjgsIDB4ODEsIDB4MzIsIDB4OTcsIDB4MTAsIDB4MTAsIDB4ODAsIAotMHgzMiwgMHg5OCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzMiwgMHg5MywgMHgxMCwgMHgxMCwgMHg4MCwgCi0weDMyLCAweDk0LCAweDkwLCAweDI4LCAweDgxLCAweDMyLCAweDhmLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweDkwLCAKLTB4ZTQsIDB4ZTEsIDB4NGYsIDB4ODAsIDB4MzUsIDB4NDgsIDB4ODgsIDB4MDAsIDB4ODgsIDB4MTAsIDB4MTAsIDB4MTAsIAotMHgxMCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzMiwgMHg4ZCwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHg4ZSwgMHhlNCwgCi0weGUxLCAweDNiLCAweDgwLCAweDM1LCAweDAyLCAweGEwLCAweDBlLCAweDgwLCAweGEwLCAweDA5LCAweDA4LCAweDk0LCAKLTB4ODAsIDB4OWEsIDB4MzAsIDB4MDQsIDB4NDAsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIAotMHgyOCwgMHg4MCwgMHgzMywgMHgwZCwgMHg4MCwgMHgzMywgMHgwYywgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgwYiwgCi0weDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMyLCAweGYyLCAweDgwLCAweDMyLCAweGYxLCAweDEwLCAweDEwLCAKLTB4ODAsIDB4MzIsIDB4ZjAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4ZDcsIAotMHg4MCwgMHgzMiwgMHhkNiwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhkNSwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDMyLCAweGJjLCAweDgwLCAweDMyLCAweGJiLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGJhLCAweDkxLCAKLTB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIDB4MDgsIDB4ODAsIDB4MzMsIAotMHgwYSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgwOSwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgCi0weGVkLCAweDgwLCAweDMyLCAweGVmLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGVlLCAweDkwLCAweDg4LCAweDkwLCAKLTB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4ZDIsIDB4ODAsIDB4MzIsIDB4ZDQsIDB4MTAsIDB4MTAsIDB4ODAsIAotMHgzMiwgMHhkMywgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhiNywgMHg4MCwgMHgzMiwgMHhiOSwgCi0weDEwLCAweDEwLCAweDgwLCAweDMyLCAweGI4LCAweGU0LCAweGUxLCAweDQ4LCAweDgwLCAweDM1LCAweDM2LCAweDlhLCAKLTB4MzAsIDB4MDQsIDB4NDAsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzMywgMHgwNSwgMHg4MCwgMHgzMywgMHgwNywgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgwNiwgMHg5MCwgMHg1MCwgCi0weDkwLCAweDI4LCAweDgwLCAweDMyLCAweGVhLCAweDgwLCAweDMyLCAweGVjLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAKLTB4ZWIsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4Y2YsIDB4ODAsIDB4MzIsIAotMHhkMSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhkMCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgCi0weGI0LCAweDgwLCAweDMyLCAweGI2LCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGI1LCAweDkxLCAweDEwLCAweDkwLCAKLTB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIDB4MDIsIDB4ODAsIDB4MzMsIDB4MDQsIDB4MTAsIAotMHgxMCwgMHg4MCwgMHgzMywgMHgwMywgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhlNywgMHg4MCwgCi0weDMyLCAweGU5LCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGU4LCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzIsIDB4Y2MsIDB4ODAsIDB4MzIsIDB4Y2UsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4Y2QsIAotMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhiMSwgMHg4MCwgMHgzMiwgMHhiMywgMHgxMCwgMHgxMCwgCi0weDgwLCAweDMyLCAweGIyLCAweGU0LCAweGUxLCAweDM4LCAweDAwLCAweDM0LCAweGVhLCAweDk0LCAweDgwLCAweDlhLCAKLTB4MzAsIDB4MDQsIDB4NDAsIDB4OTEsIDB4MTAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzMiwgMHhmZiwgMHg4MCwgMHgzMywgMHgwMSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHgwMCwgMHg5MCwgMHg1MCwgCi0weDkwLCAweDI4LCAweDgwLCAweDMyLCAweGU0LCAweDgwLCAweDMyLCAweGU2LCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAKLTB4ZTUsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4YzksIDB4ODAsIDB4MzIsIAotMHhjYiwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhjYSwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgCi0weGFlLCAweDgwLCAweDMyLCAweGIwLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGFmLCAweDkxLCAweDEwLCAweDkwLCAKLTB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4ZmMsIDB4ODAsIDB4MzIsIDB4ZmUsIDB4MTAsIAotMHgxMCwgMHg4MCwgMHgzMiwgMHhmZCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhlMSwgMHg4MCwgCi0weDMyLCAweGUzLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGUyLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzIsIDB4YzYsIDB4ODAsIDB4MzIsIDB4YzgsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4YzcsIAotMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhhYiwgMHg4MCwgMHgzMiwgMHhhZCwgMHgxMCwgMHgxMCwgCi0weDgwLCAweDMyLCAweGFjLCAweGU0LCAweGUxLCAweDQ3LCAweDgwLCAweDM1LCAweDMyLCAweDg4LCAweDAwLCAweGIwLCAKLTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4YTgsIDB4ODAsIAotMHgzMiwgMHhhYSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhhOSwgMHhlNCwgMHhlMSwgMHgzNywgMHg4MCwgMHgzNCwgCi0weGU4LCAweDk2LCAweGU4LCAweDk0LCAweDgwLCAweDlhLCAweDMwLCAweDA0LCAweDQwLCAweDkxLCAweDEwLCAweDkwLCAKLTB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4ZjYsIDB4ODAsIDB4MzIsIDB4ZmIsIDB4MTAsIAotMHgxMCwgMHg4MCwgMHgzMiwgMHhmYSwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhkYiwgMHg4MCwgCi0weDMyLCAweGUwLCAweDEwLCAweDEwLCAweDgwLCAweDMyLCAweGRmLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzIsIDB4YzAsIDB4ODAsIDB4MzIsIDB4YzUsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4YzQsIAotMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhhMiwgMHg4MCwgMHgzMiwgMHhhNywgMHgxMCwgMHgxMCwgCi0weDgwLCAweDMyLCAweGE2LCAweDkxLCAweDEwLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAKLTB4MzIsIDB4ZjMsIDB4ODAsIDB4MzIsIDB4ZjUsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4ZjQsIDB4OTAsIDB4NTAsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhkOCwgMHg4MCwgMHgzMiwgMHhkYSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgCi0weGQ5LCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMyLCAweGJkLCAweDgwLCAweDMyLCAKLTB4YmYsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4YmUsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIAotMHg5ZiwgMHg4MCwgMHgzMiwgMHhhMSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhhMCwgMHhlNCwgMHhlMSwgMHg0NiwgCi0weDgwLCAweDM1LCAweDJlLCAweDg4LCAweDAyLCAweDI4LCAweDkxLCAweDEwLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAKLTB4OTAsIDB4MjgsIDB4ODAsIDB4MzIsIDB4ZjcsIDB4ODAsIDB4MzIsIDB4ZjksIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIAotMHhmOCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMiwgMHhkYywgMHg4MCwgMHgzMiwgMHhkZSwgMHgxMCwgCi0weDEwLCAweDgwLCAweDMyLCAweGRkLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMyLCAKLTB4YzEsIDB4ODAsIDB4MzIsIDB4YzMsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzIsIDB4YzIsIDB4OTAsIDB4NTAsIDB4OTAsIAotMHgyOCwgMHg4MCwgMHgzMiwgMHhhMywgMHg4MCwgMHgzMiwgMHhhNSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMiwgMHhhNCwgCi0weGU0LCAweGUxLCAweDM3LCAweDAwLCAweDM0LCAweGU2LCAweDkwLCAweDQwLCAweGU1LCAweDIxLCAweDQ1LCAweDgwLCAKLTB4MzUsIDB4MmEsIDB4ZTUsIDB4MjEsIDB4MzYsIDB4ODAsIDB4MzQsIDB4ZTQsIDB4OWUsIDB4YjQsIDB4MjAsIDB4MDgsIAotMHg5MywgMHg3MCwgMHg5MSwgMHhkOCwgMHhkNSwgMHgwNywgMHg4MCwgMHhkMCwgMHhjNCwgMHg0MCwgMHg5MCwgMHg0OCwgCi0weDgwLCAweDhjLCAweDM2LCAweGUwLCAweDg0LCAweDM2LCAweGU2LCAweGE0LCAweDM0LCAweGMwLCAweDM2LCAweGIwLCAKLTB4OTAsIDB4MjgsIDB4MjQsIDB4MzQsIDB4MDAsIDB4YTQsIDB4MzIsIDB4ODAsIDB4MzYsIDB4NjgsIDB4ZDAsIDB4YzQsIAotMHg0MCwgMHg5MCwgMHg0OCwgMHg4MCwgMHg4YywgMHgzNiwgMHhjMCwgMHg4NCwgMHgzNiwgMHhlNCwgMHhhNCwgMHgzNCwgCi0weGIwLCAweDM2LCAweGFlLCAweDkwLCAweDI4LCAweDI0LCAweDMzLCAweGYwLCAweGE0LCAweDMyLCAweDcwLCAweDM2LCAKLTB4NjYsIDB4ZDUsIDB4MDYsIDB4ODAsIDB4ZDAsIDB4YzMsIDB4NDAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzYsIDB4ZDAsIAotMHhhNCwgMHgzNCwgMHg5MCwgMHgzNiwgMHhhYSwgMHg5MCwgMHgyOCwgMHgyNCwgMHgzMywgMHhkMCwgMHhhNCwgMHgzMiwgCi0weDUwLCAweDM2LCAweDYyLCAweGQwLCAweGMzLCAweDQwLCAweDkwLCAweDI4LCAweDgwLCAweDM2LCAweGNjLCAweGE0LCAKLTB4MzQsIDB4ODAsIDB4MzYsIDB4YTgsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MzMsIDB4YzAsIDB4YTQsIDB4MzIsIDB4NDAsIAotMHgzNiwgMHg2MCwgMHg5MSwgMHg5OCwgMHhkNSwgMHgwNiwgMHg4MCwgMHhkMCwgMHhjMywgMHg0MCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDM2LCAweGM0LCAweGE0LCAweDM0LCAweDYwLCAweDM2LCAweGE0LCAweDkwLCAweDI4LCAweDI0LCAweDMzLCAKLTB4YTAsIDB4YTQsIDB4MzIsIDB4MjAsIDB4MzYsIDB4NWMsIDB4ZDAsIDB4YzMsIDB4NDAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzNiwgMHhjMCwgMHhhNCwgMHgzNCwgMHg1MCwgMHgzNiwgMHhhMiwgMHg5MCwgMHgyOCwgMHgyNCwgMHgzMywgMHg5MCwgCi0weGE0LCAweDMyLCAweDEwLCAweDM2LCAweDVhLCAweGQ1LCAweDA2LCAweDgwLCAweGQwLCAweGMzLCAweDQwLCAweDkwLCAKLTB4MjgsIDB4ODAsIDB4MzYsIDB4YjgsIDB4YTQsIDB4MzQsIDB4MzAsIDB4MzYsIDB4OWUsIDB4OTAsIDB4MjgsIDB4MjQsIAotMHgzMywgMHg3MCwgMHhhNCwgMHgzMSwgMHhmMCwgMHgzNiwgMHg1NiwgMHhkMCwgMHhjMywgMHg0MCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDM2LCAweGI0LCAweGE0LCAweDM0LCAweDIwLCAweDM2LCAweDljLCAweDkwLCAweDI4LCAweDI0LCAweDMzLCAKLTB4NjAsIDB4YTQsIDB4MzEsIDB4ZTAsIDB4MzYsIDB4NTQsIDB4OTMsIDB4NzAsIDB4OTEsIDB4ZDgsIDB4ZDUsIDB4MDcsIAotMHg4MCwgMHhkMCwgMHhjNCwgMHg0MCwgMHg5MCwgMHg0OCwgMHg4MCwgMHg4YywgMHgzNywgMHgwMCwgMHg4NCwgMHgzNiwgCi0weGU4LCAweGE0LCAweDM0LCAweGQwLCAweDM2LCAweGIyLCAweDkwLCAweDI4LCAweDI0LCAweDM0LCAweDEwLCAweGE0LCAKLTB4MzIsIDB4OTAsIDB4MzYsIDB4NmEsIDB4ZDAsIDB4YzQsIDB4NDAsIDB4OTAsIDB4NDgsIDB4ODAsIDB4OGMsIDB4MzYsIAotMHhkMCwgMHg4NCwgMHgzNiwgMHhlNSwgMHhhNCwgMHgzNCwgMHhiOCwgMHgzNiwgMHhhZiwgMHg5MCwgMHgyOCwgMHgyNCwgCi0weDMzLCAweGY4LCAweGE0LCAweDMyLCAweDc4LCAweDM2LCAweDY3LCAweGQ1LCAweDA2LCAweDgwLCAweGQwLCAweGMzLCAKLTB4NDAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzYsIDB4ZDQsIDB4YTQsIDB4MzQsIDB4YTAsIDB4MzYsIDB4YWMsIDB4OTAsIAotMHgyOCwgMHgyNCwgMHgzMywgMHhlMCwgMHhhNCwgMHgzMiwgMHg2MCwgMHgzNiwgMHg2NCwgMHhkMCwgMHhjMywgMHg0MCwgCi0weDkwLCAweDI4LCAweDgwLCAweDM2LCAweGNlLCAweGE0LCAweDM0LCAweDg4LCAweDM2LCAweGE5LCAweDkwLCAweDI4LCAKLTB4MjQsIDB4MzMsIDB4YzgsIDB4YTQsIDB4MzIsIDB4NDgsIDB4MzYsIDB4NjEsIDB4OTEsIDB4OTgsIDB4ZDUsIDB4MDYsIAotMHg4MCwgMHhkMCwgMHhjMywgMHg0MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzNiwgMHhjOCwgMHhhNCwgMHgzNCwgMHg3MCwgCi0weDM2LCAweGE2LCAweDkwLCAweDI4LCAweDI0LCAweDMzLCAweGIwLCAweGE0LCAweDMyLCAweDMwLCAweDM2LCAweDVlLCAKLTB4ZDAsIDB4YzMsIDB4NDAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzYsIDB4YzIsIDB4YTQsIDB4MzQsIDB4NTgsIDB4MzYsIAotMHhhMywgMHg5MCwgMHgyOCwgMHgyNCwgMHgzMywgMHg5OCwgMHhhNCwgMHgzMiwgMHgxOCwgMHgzNiwgMHg1YiwgMHhkNSwgCi0weDA2LCAweDgwLCAweGQwLCAweGMzLCAweDQwLCAweDkwLCAweDI4LCAweDgwLCAweDM2LCAweGJjLCAweGE0LCAweDM0LCAKLTB4NDAsIDB4MzYsIDB4YTAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MzMsIDB4ODAsIDB4YTQsIDB4MzIsIDB4MDAsIDB4MzYsIAotMHg1OCwgMHhkMCwgMHhjMywgMHg0MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzNiwgMHhiNiwgMHhhNCwgMHgzNCwgMHgyOCwgCi0weDM2LCAweDlkLCAweDkwLCAweDI4LCAweDI0LCAweDMzLCAweDY4LCAweGE0LCAweDMxLCAweGU4LCAweDM2LCAweDU1LCAKLTB4OTksIDB4MDgsIDB4MDEsIDB4ZjAsIDB4ODEsIDB4OTAsIDB4NzgsIDB4ZDQsIDB4YzIsIDB4MDAsIDB4YTQsIDB4MWYsIAotMHhiMCwgMHgzMywgMHhlZSwgMHhhNCwgMHgxZiwgMHgzMCwgMHgzMywgMHhkZSwgMHhkNCwgMHhjMiwgMHgwMCwgMHhhNCwgCi0weDFmLCAweDQwLCAweDMzLCAweGYwLCAweGE0LCAweDFlLCAweGMwLCAweDMzLCAweGUwLCAweDgxLCAweDkwLCAweDc4LCAKLTB4ZDQsIDB4YzIsIDB4MDAsIDB4YTQsIDB4MWYsIDB4NjAsIDB4MzMsIDB4ZjQsIDB4YTQsIDB4MWUsIDB4ZTAsIDB4MzMsIAotMHhlNCwgMHhkNCwgMHhjMiwgMHgwMCwgMHhhNCwgMHgxZiwgMHg1MCwgMHgzMywgMHhmMiwgMHhhNCwgMHgxZSwgMHhkMCwgCi0weDMzLCAweGUyLCAweGE4LCAweDBiLCAweDE4LCAweDEzLCAweGE4LCAweDk2LCAweDgwLCAweDkzLCAweDQwLCAweDk5LCAKLTB4OTAsIDB4MDMsIDB4MDAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTIsIDB4YjgsIAotMHgzMiwgMHg1OCwgMHgyNCwgMHgxMiwgMHhiMCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMSwgMHhlMCwgMHgzMiwgMHgzZCwgCi0weDI0LCAweDExLCAweGQ4LCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAweDExLCAweDA4LCAweDMyLCAweDIyLCAKLTB4MjQsIDB4MTEsIDB4MDAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTAsIDB4MzAsIDB4MzIsIDB4MDcsIDB4MjQsIDB4MTAsIAotMHgyOCwgMHg5MCwgMHhjMCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMiwgMHhhOCwgMHgzMiwgMHg1MywgCi0weDI0LCAweDEyLCAweGEwLCAweDkwLCAweDM4LCAweGE0LCAweDExLCAweGQwLCAweDMyLCAweDM4LCAweDI0LCAweDExLCAKLTB4YzgsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTAsIDB4ZjgsIDB4MzIsIDB4MWQsIDB4MjQsIDB4MTAsIAotMHhmMCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMCwgMHgyMCwgMHgzMiwgMHgwMiwgMHgyNCwgMHgxMCwgMHgxOCwgMHhlNCwgCi0weGUxLCAweDhkLCAweDgwLCAweDM2LCAweDM4LCAweDk5LCAweDkwLCAweDAzLCAweDAwLCAweDkwLCAweGMwLCAweDkwLCAKLTB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTIsIDB4OTAsIDB4MzIsIDB4NTAsIDB4MjQsIDB4MTIsIDB4ODgsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgxMSwgMHhiOCwgMHgzMiwgMHgzNSwgMHgyNCwgMHgxMSwgMHhiMCwgMHg5MCwgMHg2MCwgMHg5MCwgCi0weDM4LCAweGE0LCAweDEwLCAweGUwLCAweDMyLCAweDFhLCAweDI0LCAweDEwLCAweGQ4LCAweDkwLCAweDM4LCAweGE0LCAKLTB4MTAsIDB4MDgsIDB4MzEsIDB4ZmYsIDB4MjQsIDB4MTAsIDB4MDAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgxMiwgMHg3OCwgMHgzMiwgMHg0ZCwgMHgyNCwgMHgxMiwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDExLCAweGEwLCAweDMyLCAweDMyLCAweDI0LCAweDExLCAweDk4LCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MTAsIDB4YzgsIDB4MzIsIDB4MTcsIDB4MjQsIDB4MTAsIDB4YzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MGYsIDB4ZjAsIAotMHgzMSwgMHhmYywgMHgyNCwgMHgwZiwgMHhlOCwgMHhlNCwgMHhlMSwgMHg4YywgMHgwMCwgMHgzNiwgMHgzMiwgMHg5MywgCi0weDc4LCAweDk5LCAweDkwLCAweDAzLCAweDAwLCAweDkwLCAweGMwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MTIsIDB4NjAsIDB4MzIsIDB4NGEsIDB4MjQsIDB4MTIsIDB4NTgsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTEsIDB4ODgsIAotMHgzMiwgMHgyZiwgMHgyNCwgMHgxMSwgMHg4MCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMCwgMHhiMCwgCi0weDMyLCAweDE0LCAweDI0LCAweDEwLCAweGE4LCAweDkwLCAweDM4LCAweGE0LCAweDBmLCAweGQ4LCAweDMxLCAweGY5LCAKLTB4MjQsIDB4MGYsIDB4ZDAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTIsIDB4NDgsIAotMHgzMiwgMHg0NywgMHgyNCwgMHgxMiwgMHg0MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMSwgMHg3MCwgMHgzMiwgMHgyYywgCi0weDI0LCAweDExLCAweDY4LCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAweDEwLCAweDk4LCAweDMyLCAweDExLCAKLTB4MjQsIDB4MTAsIDB4OTAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MGYsIDB4YzAsIDB4MzEsIDB4ZjYsIDB4MjQsIDB4MGYsIAotMHhiOCwgMHhlYywgMHhhMCwgMHhmZiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgzMywgMHhmZSwgMHhhNCwgMHgzMSwgMHg1MCwgCi0weDM2LCAweDJjLCAweDg4LCAweDAwLCAweDg4LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MGYsIDB4YTgsIDB4MzEsIDB4ZjMsIDB4MjQsIDB4MGYsIDB4YTAsIDB4ZTksIDB4NjAsIDB4ZmUsIDB4NDAsIDB4MDIsIAotMHgwMCwgMHgzMywgMHhmYSwgMHhlMywgMHg2MSwgMHg4OSwgMHgwMCwgMHgzNiwgMHgyNiwgMHg5NSwgMHgwOCwgMHg5MywgCi0weDQwLCAweDk5LCAweDkwLCAweDAzLCAweDAwLCAweDkwLCAweGMwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MTIsIDB4MzAsIDB4MzIsIDB4NDEsIDB4MjQsIDB4MTIsIDB4MjgsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTEsIDB4NTgsIAotMHgzMiwgMHgyNiwgMHgyNCwgMHgxMSwgMHg1MCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMCwgMHg4MCwgCi0weDMyLCAweDBiLCAweDI0LCAweDEwLCAweDc4LCAweDkwLCAweDM4LCAweGE0LCAweDBmLCAweDkwLCAweDMxLCAweGVkLCAKLTB4MjQsIDB4MGYsIDB4ODgsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MTIsIDB4MDAsIAotMHgzMiwgMHgzZSwgMHgyNCwgMHgxMSwgMHhmOCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgxMSwgMHgyOCwgMHgzMiwgMHgyMywgCi0weDI0LCAweDExLCAweDIwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAweDEwLCAweDUwLCAweDMyLCAweDA4LCAKLTB4MjQsIDB4MTAsIDB4NDgsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MGYsIDB4NjAsIDB4MzEsIDB4ZWEsIDB4MjQsIDB4MGYsIAotMHg1OCwgMHhlNCwgMHhlMSwgMHg4ZCwgMHhjMCwgMHgzNiwgMHgzYSwgMHg4OCwgMHgwMSwgMHg4OCwgMHg5MCwgMHhjMCwgCi0weDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAweDEyLCAweDIwLCAweDMyLCAweDQyLCAweDI0LCAweDEyLCAweDE4LCAKLTB4OTAsIDB4MzgsIDB4YTQsIDB4MTEsIDB4NDgsIDB4MzIsIDB4MjcsIDB4MjQsIDB4MTEsIDB4NDAsIDB4OTAsIDB4NjAsIAotMHg5MCwgMHgzOCwgMHhhNCwgMHgxMCwgMHg3MCwgMHgzMiwgMHgwYywgMHgyNCwgMHgxMCwgMHg2OCwgMHg5MCwgMHgzOCwgCi0weGE0LCAweDBmLCAweDgwLCAweDMxLCAweGVlLCAweDI0LCAweDBmLCAweDc4LCAweGU0LCAweGUxLCAweDhjLCAweDQwLCAKLTB4MzYsIDB4MzQsIDB4OTIsIDB4ZDAsIDB4OTksIDB4NTAsIDB4MDIsIDB4ODAsIDB4OTAsIDB4YTAsIDB4OTAsIDB4NTAsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgMHhlOSwgMHgyNCwgMHgwZiwgMHg0MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgCi0weGU1LCAweDI0LCAweDBmLCAweDIwLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweGUxLCAweDI0LCAKLTB4MGYsIDB4MDAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4ZGQsIDB4MjQsIDB4MGUsIDB4ZTAsIDB4OTAsIDB4YTAsIAotMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgMHhlNiwgMHgyNCwgMHgwZiwgMHgzOCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDMxLCAweGUyLCAweDI0LCAweDBmLCAweDE4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAKLTB4ZGUsIDB4MjQsIDB4MGUsIDB4ZjgsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4ZGEsIDB4MjQsIDB4MGUsIDB4ZDgsIAotMHhlYywgMHhlMSwgMHg4YSwgMHhlMSwgMHgwMCwgMHgwMCwgMHgzNiwgMHgyZSwgMHg4OCwgMHgwMCwgMHg3OCwgMHgxMCwgCi0weDEwLCAweDEwLCAweDEwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweGQ4LCAweDI0LCAweDBlLCAweGM4LCAweGVjLCAKLTB4ZTEsIDB4ODksIDB4NjAsIDB4ZmUsIDB4MDAsIDB4MzYsIDB4MjgsIDB4ZTUsIDB4YTEsIDB4MzYsIDB4MDAsIDB4MzQsIAotMHhkNiwgMHhhMCwgMHgyYSwgMHgxMCwgMHhhOCwgMHgxNiwgMHg2MCwgMHgyOSwgMHhkOCwgMHhhMCwgMHgwYywgMHg0OCwgCi0weGEwLCAweDBhLCAweGM4LCAweDk1LCAweDYwLCAweDkyLCAweGIwLCAweDkxLCAweDQwLCAweDkwLCAweDg4LCAweDkwLCAKLTB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4YTEsIDB4ODAsIDB4MzEsIDB4YTAsIDB4MTAsIDB4MTAsIDB4ODAsIAotMHgzMSwgMHg5ZiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwOCwgMHg5OCwgMHgzMSwgMHhiMywgMHhhNCwgCi0weDA4LCAweDkwLCAweDMxLCAweGIyLCAweDEwLCAweDEwLCAweGE0LCAweDA4LCAweDg4LCAweDMxLCAweGIxLCAweDkwLCAKLTB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDksIDB4YjgsIDB4MzEsIDB4ZDcsIDB4YTQsIDB4MDksIAotMHhiMCwgMHgzMSwgMHhkNiwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwOSwgMHhhOCwgMHgzMSwgMHhkNSwgMHg5MCwgMHg3MCwgCi0weDkwLCAweDM4LCAweGE0LCAweDA5LCAweDI4LCAweDMxLCAweGM1LCAweGE0LCAweDA5LCAweDIwLCAweDMxLCAweGM0LCAKLTB4MTAsIDB4MTAsIDB4YTQsIDB4MDksIDB4MTgsIDB4MzEsIDB4YzMsIDB4OTEsIDB4NDAsIDB4OTAsIDB4ODgsIDB4OTAsIAotMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgMHg5YywgMHg4MCwgMHgzMSwgMHg5ZSwgMHgxMCwgMHgxMCwgMHg4MCwgCi0weDMxLCAweDlkLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA4LCAweDcwLCAweDMxLCAweGFlLCAweGE0LCAKLTB4MDgsIDB4ODAsIDB4MzEsIDB4YjAsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDgsIDB4NzgsIDB4MzEsIDB4YWYsIDB4OTAsIAotMHhiOCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwOSwgMHg5MCwgMHgzMSwgMHhkMiwgMHhhNCwgMHgwOSwgCi0weGEwLCAweDMxLCAweGQ0LCAweDEwLCAweDEwLCAweGE0LCAweDA5LCAweDk4LCAweDMxLCAweGQzLCAweDkwLCAweDcwLCAKLTB4OTAsIDB4MzgsIDB4YTQsIDB4MDksIDB4MDAsIDB4MzEsIDB4YzAsIDB4YTQsIDB4MDksIDB4MTAsIDB4MzEsIDB4YzIsIAotMHgxMCwgMHgxMCwgMHhhNCwgMHgwOSwgMHgwOCwgMHgzMSwgMHhjMSwgMHg5MiwgMHhiMCwgMHg5MSwgMHg0MCwgMHg5MCwgCi0weDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweDk5LCAweDgwLCAweDMxLCAweDliLCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4MzEsIDB4OWEsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDgsIDB4NTgsIDB4MzEsIAotMHhhYiwgMHhhNCwgMHgwOCwgMHg2OCwgMHgzMSwgMHhhZCwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwOCwgMHg2MCwgMHgzMSwgCi0weGFjLCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA5LCAweDc4LCAweDMxLCAweGNmLCAKLTB4YTQsIDB4MDksIDB4ODgsIDB4MzEsIDB4ZDEsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDksIDB4ODAsIDB4MzEsIDB4ZDAsIAotMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwOCwgMHhlOCwgMHgzMSwgMHhiZCwgMHhhNCwgMHgwOCwgMHhmOCwgCi0weDMxLCAweGJmLCAweDEwLCAweDEwLCAweGE0LCAweDA4LCAweGYwLCAweDMxLCAweGJlLCAweDkxLCAweDQwLCAweDkwLCAKLTB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4OTYsIDB4ODAsIDB4MzEsIDB4OTgsIDB4MTAsIAotMHgxMCwgMHg4MCwgMHgzMSwgMHg5NywgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwOCwgMHg0MCwgMHgzMSwgCi0weGE4LCAweGE0LCAweDA4LCAweDUwLCAweDMxLCAweGFhLCAweDEwLCAweDEwLCAweGE0LCAweDA4LCAweDQ4LCAweDMxLCAKLTB4YTksIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDksIDB4NjAsIDB4MzEsIDB4Y2MsIAotMHhhNCwgMHgwOSwgMHg3MCwgMHgzMSwgMHhjZSwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwOSwgMHg2OCwgMHgzMSwgMHhjZCwgCi0weDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA4LCAweGQwLCAweDMxLCAweGJhLCAweGE0LCAweDA4LCAweGUwLCAKLTB4MzEsIDB4YmMsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDgsIDB4ZDgsIDB4MzEsIDB4YmIsIDB4MTAsIDB4MTAsIDB4OTAsIAotMHhhOCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgMHg4ZCwgCi0weDgwLCAweDMxLCAweDhmLCAweDEwLCAweDEwLCAweDgwLCAweDMxLCAweDhlLCAweDkwLCAweDYwLCAweDkwLCAweDMwLCAKLTB4NjAsIDB4YTAsIDB4MmEsIDB4YzAsIDB4NjAsIDB4YTAsIDB4MmEsIDB4ODAsIDB4OTAsIDB4MzAsIDB4NjAsIDB4YTAsIAotMHgyYSwgMHg0MCwgMHg2MCwgMHhhMCwgMHgyYSwgMHgwMCwgMHg5NywgMHhmMCwgMHg5NSwgMHg2MCwgMHg5MiwgMHhiMCwgCi0weDkxLCAweDQwLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweDkzLCAweDgwLCAKLTB4MzEsIDB4OTUsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4OTQsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgwOCwgMHgyOCwgMHgzMSwgMHhhNSwgMHhhNCwgMHgwOCwgMHgzOCwgMHgzMSwgMHhhNywgMHgxMCwgMHgxMCwgMHhhNCwgCi0weDA4LCAweDMwLCAweDMxLCAweGE2LCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA5LCAKLTB4NDgsIDB4MzEsIDB4YzksIDB4YTQsIDB4MDksIDB4NTgsIDB4MzEsIDB4Y2IsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDksIAotMHg1MCwgMHgzMSwgMHhjYSwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwOCwgMHhiOCwgMHgzMSwgMHhiNywgCi0weGE0LCAweDA4LCAweGM4LCAweDMxLCAweGI5LCAweDEwLCAweDEwLCAweGE0LCAweDA4LCAweGMwLCAweDMxLCAweGI4LCAKLTB4OTEsIDB4NDAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4OTAsIDB4ODAsIAotMHgzMSwgMHg5MiwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMSwgMHg5MSwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDA4LCAweDEwLCAweDMxLCAweGEyLCAweGE0LCAweDA4LCAweDIwLCAweDMxLCAweGE0LCAweDEwLCAweDEwLCAweGE0LCAKLTB4MDgsIDB4MTgsIDB4MzEsIDB4YTMsIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDksIAotMHgzMCwgMHgzMSwgMHhjNiwgMHhhNCwgMHgwOSwgMHg0MCwgMHgzMSwgMHhjOCwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwOSwgCi0weDM4LCAweDMxLCAweGM3LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA4LCAweGEwLCAweDMxLCAweGI0LCAKLTB4YTQsIDB4MDgsIDB4YjAsIDB4MzEsIDB4YjYsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDgsIDB4YTgsIDB4MzEsIDB4YjUsIAotMHgxMCwgMHgxMCwgMHg5MSwgMHg0MCwgMHg5MCwgMHhhMCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMCwgCi0weGNiLCAweDgwLCAweDMwLCAweGNhLCAweDkwLCAweDI4LCAweDgwLCAweDMwLCAweGM5LCAweDgwLCAweDMwLCAweGM4LCAKLTB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4YzQsIDB4ODAsIDB4MzAsIDB4YzcsIDB4OTAsIDB4MjgsIAotMHg4MCwgMHgzMCwgMHhjNiwgMHg4MCwgMHgzMCwgMHhjNSwgMHg5MCwgMHhhMCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDMwLCAweGJjLCAweDgwLCAweDMwLCAweGMzLCAweDkwLCAweDI4LCAweDgwLCAweDMwLCAweGMyLCAweDgwLCAKLTB4MzAsIDB4YzEsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4YmQsIDB4ODAsIDB4MzAsIDB4YzAsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMCwgMHhiZiwgMHg4MCwgMHgzMCwgMHhiZSwgMHg5MSwgMHg4OCwgMHg4MCwgMHg5MCwgCi0weGMwLCAweDkwLCAweDYwLCAweDkwLCAweDI4LCAweDgxLCAweDMxLCAweDNiLCAweDEwLCAweDEwLCAweDgwLCAweDMxLCAKLTB4M2EsIDB4OTAsIDB4MjgsIDB4ODEsIDB4MzEsIDB4M2QsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4M2MsIDB4OTAsIAotMHg2MCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzMSwgMHg0MSwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMSwgMHg0MCwgMHg5MCwgCi0weDI4LCAweDgxLCAweDMxLCAweDNmLCAweDEwLCAweDEwLCAweDgwLCAweDMxLCAweDNlLCAweDgwLCAweDEwLCAweDEwLCAKLTB4MTAsIDB4MTAsIDB4OTAsIDB4MjgsIDB4ODEsIDB4MzEsIDB4MzgsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4MzksIAotMHhhMCwgMHgwYiwgMHg5MCwgMHhhMCwgMHgwYSwgMHhjOCwgMHg5NSwgMHg2MCwgMHg5MiwgMHhiMCwgMHg5MSwgMHg0MCwgCi0weDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweDU2LCAweDgwLCAweDMxLCAweDU1LCAKLTB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4NTQsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDYsIDB4ZTgsIAotMHgzMSwgMHg2OCwgMHhhNCwgMHgwNiwgMHhlMCwgMHgzMSwgMHg2NywgMHgxMCwgMHgxMCwgMHhhNCwgMHgwNiwgMHhkOCwgCi0weDMxLCAweDY2LCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA4LCAweDA4LCAweDMxLCAKLTB4OGMsIDB4YTQsIDB4MDgsIDB4MDAsIDB4MzEsIDB4OGIsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDcsIDB4ZjgsIDB4MzEsIAotMHg4YSwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNywgMHg3OCwgMHgzMSwgMHg3YSwgMHhhNCwgMHgwNywgCi0weDcwLCAweDMxLCAweDc5LCAweDEwLCAweDEwLCAweGE0LCAweDA3LCAweDY4LCAweDMxLCAweDc4LCAweDkxLCAweDQwLCAKLTB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzEsIDB4NTEsIDB4ODAsIDB4MzEsIDB4NTMsIAotMHgxMCwgMHgxMCwgMHg4MCwgMHgzMSwgMHg1MiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNiwgMHhjMCwgCi0weDMxLCAweDYzLCAweGE0LCAweDA2LCAweGQwLCAweDMxLCAweDY1LCAweDEwLCAweDEwLCAweGE0LCAweDA2LCAweGM4LCAKLTB4MzEsIDB4NjQsIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDcsIDB4ZTAsIDB4MzEsIAotMHg4NywgMHhhNCwgMHgwNywgMHhmMCwgMHgzMSwgMHg4OSwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwNywgMHhlOCwgMHgzMSwgCi0weDg4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA3LCAweDUwLCAweDMxLCAweDc1LCAweGE0LCAweDA3LCAKLTB4NjAsIDB4MzEsIDB4NzcsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDcsIDB4NTgsIDB4MzEsIDB4NzYsIDB4OTIsIDB4YjAsIAotMHg5MSwgMHg0MCwgMHg5MCwgMHg4OCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMSwgMHg0ZSwgMHg4MCwgCi0weDMxLCAweDUwLCAweDEwLCAweDEwLCAweDgwLCAweDMxLCAweDRmLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MDYsIDB4YTgsIDB4MzEsIDB4NjAsIDB4YTQsIDB4MDYsIDB4YjgsIDB4MzEsIDB4NjIsIDB4MTAsIDB4MTAsIDB4YTQsIAotMHgwNiwgMHhiMCwgMHgzMSwgMHg2MSwgMHg5MCwgMHhiOCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNywgCi0weGM4LCAweDMxLCAweDg0LCAweGE0LCAweDA3LCAweGQ4LCAweDMxLCAweDg2LCAweDEwLCAweDEwLCAweGE0LCAweDA3LCAKLTB4ZDAsIDB4MzEsIDB4ODUsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDcsIDB4MzgsIDB4MzEsIDB4NzIsIAotMHhhNCwgMHgwNywgMHg0OCwgMHgzMSwgMHg3NCwgMHgxMCwgMHgxMCwgMHhhNCwgMHgwNywgMHg0MCwgMHgzMSwgMHg3MywgCi0weDkxLCAweDQwLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMxLCAweDRiLCAweDgwLCAKLTB4MzEsIDB4NGQsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4NGMsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgwNiwgMHg5MCwgMHgzMSwgMHg1ZCwgMHhhNCwgMHgwNiwgMHhhMCwgMHgzMSwgMHg1ZiwgMHgxMCwgMHgxMCwgMHhhNCwgCi0weDA2LCAweDk4LCAweDMxLCAweDVlLCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA3LCAKLTB4YjAsIDB4MzEsIDB4ODEsIDB4YTQsIDB4MDcsIDB4YzAsIDB4MzEsIDB4ODMsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDcsIAotMHhiOCwgMHgzMSwgMHg4MiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNywgMHgyMCwgMHgzMSwgMHg2ZiwgCi0weGE0LCAweDA3LCAweDMwLCAweDMxLCAweDcxLCAweDEwLCAweDEwLCAweGE0LCAweDA3LCAweDI4LCAweDMxLCAweDcwLCAKLTB4MTAsIDB4MTAsIDB4ODAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzMSwgMHg0MiwgMHg4MCwgMHgzMSwgMHg0NCwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMSwgMHg0MywgMHg4MCwgMHg5NSwgCi0weDYwLCAweDkyLCAweGIwLCAweDkxLCAweDQwLCAweDkwLCAweDg4LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAKLTB4MzEsIDB4NDgsIDB4ODAsIDB4MzEsIDB4NGEsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzEsIDB4NDksIDB4OTAsIDB4NzAsIAotMHg5MCwgMHgzOCwgMHhhNCwgMHgwNiwgMHg3OCwgMHgzMSwgMHg1YSwgMHhhNCwgMHgwNiwgMHg4OCwgMHgzMSwgMHg1YywgCi0weDEwLCAweDEwLCAweGE0LCAweDA2LCAweDgwLCAweDMxLCAweDViLCAweDkwLCAweGI4LCAweDkwLCAweDcwLCAweDkwLCAKLTB4MzgsIDB4YTQsIDB4MDcsIDB4OTgsIDB4MzEsIDB4N2UsIDB4YTQsIDB4MDcsIDB4YTgsIDB4MzEsIDB4ODAsIDB4MTAsIAotMHgxMCwgMHhhNCwgMHgwNywgMHhhMCwgMHgzMSwgMHg3ZiwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNywgCi0weDA4LCAweDMxLCAweDZjLCAweGE0LCAweDA3LCAweDE4LCAweDMxLCAweDZlLCAweDEwLCAweDEwLCAweGE0LCAweDA3LCAKLTB4MTAsIDB4MzEsIDB4NmQsIDB4OTEsIDB4NDAsIDB4OTAsIDB4ODgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIAotMHgzMSwgMHg0NSwgMHg4MCwgMHgzMSwgMHg0NywgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMSwgMHg0NiwgMHg5MCwgMHg3MCwgCi0weDkwLCAweDM4LCAweGE0LCAweDA2LCAweDYwLCAweDMxLCAweDU3LCAweGE0LCAweDA2LCAweDcwLCAweDMxLCAweDU5LCAKLTB4MTAsIDB4MTAsIDB4YTQsIDB4MDYsIDB4NjgsIDB4MzEsIDB4NTgsIDB4OTAsIDB4YjgsIDB4OTAsIDB4NzAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgwNywgMHg4MCwgMHgzMSwgMHg3YiwgMHhhNCwgMHgwNywgMHg5MCwgMHgzMSwgMHg3ZCwgMHgxMCwgCi0weDEwLCAweGE0LCAweDA3LCAweDg4LCAweDMxLCAweDdjLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDA2LCAKLTB4ZjAsIDB4MzEsIDB4NjksIDB4YTQsIDB4MDcsIDB4MDAsIDB4MzEsIDB4NmIsIDB4MTAsIDB4MTAsIDB4YTQsIDB4MDYsIAotMHhmOCwgMHgzMSwgMHg2YSwgMHgxMCwgMHgxMCwgMHg5MSwgMHg0MCwgMHg5MCwgMHhhMCwgMHg5MCwgMHg1MCwgMHg5MCwgCi0weDI4LCAweDgwLCAweDMwLCAweGJiLCAweDgwLCAweDMwLCAweGJhLCAweDkwLCAweDI4LCAweDgwLCAweDMwLCAweGI5LCAKLTB4ODAsIDB4MzAsIDB4YjgsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4YjQsIDB4ODAsIDB4MzAsIAotMHhiNywgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMCwgMHhiNiwgMHg4MCwgMHgzMCwgMHhiNSwgMHg5MCwgMHhhMCwgMHg5MCwgCi0weDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMwLCAweGFjLCAweDgwLCAweDMwLCAweGIzLCAweDkwLCAweDI4LCAweDgwLCAKLTB4MzAsIDB4YjIsIDB4ODAsIDB4MzAsIDB4YjEsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4YWQsIAotMHg4MCwgMHgzMCwgMHhiMCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMCwgMHhhZiwgMHg4MCwgMHgzMCwgMHhhZSwgMHhjMywgCi0weGMwLCAweDMwLCAweDQyLCAweDljLCAweGU4LCAweDA3LCAweDYwLCAweDkxLCAweDkwLCAweDkwLCAweGYwLCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4ODgsIDB4MDAsIDB4ODAsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzMsIDB4YmMsIAotMHg4MCwgMHgzMywgMHhiZCwgMHg4MSwgMHgzMywgMHhiMywgMHhkMCwgMHg0MSwgMHg4MCwgMHgyNCwgMHgxZSwgMHhiMCwgCi0weDI0LCAweDFlLCAweGI4LCAweDEwLCAweDEwLCAweDgwLCAweDkwLCAweDU4LCAweDgwLCAweDkwLCAweDI4LCAweDI0LCAKLTB4MWQsIDB4YjAsIDB4MjQsIDB4MWQsIDB4YjgsIDB4ODEsIDB4MjQsIDB4MWQsIDB4NzAsIDB4OTIsIDB4NjgsIDB4OTEsIAotMHgwMCwgMHg4MCwgMHg5MCwgMHg5MCwgMHg5MCwgMHgzMCwgMHg4MCwgMHgyNCwgMHgxZSwgMHgyMCwgMHg5MCwgMHgzOCwgCi0weGE0LCAweDFlLCAweDE4LCAweDMzLCAweGNhLCAweDgwLCAweDMzLCAweGM5LCAweDgwLCAweDkwLCAweDI4LCAweDgwLCAKLTB4MzMsIDB4ZDMsIDB4YTQsIDB4MWUsIDB4MDAsIDB4MzMsIDB4ZDIsIDB4ODAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHhjZCwgMHhhNCwgMHgxZSwgMHgxMCwgMHgzMywgMHhjYywgMHg5MCwgMHgyOCwgCi0weDgwLCAweDMzLCAweGM4LCAweGE0LCAweDFlLCAweDA4LCAweDMzLCAweGM3LCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAKLTB4ODAsIDB4MzMsIDB4ZDEsIDB4ODAsIDB4MzMsIDB4ZDAsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MWUsIDB4YTgsIDB4MjQsIAotMHgxZSwgMHhhMCwgMHg5MCwgMHg1OCwgMHg4MCwgMHgxMCwgMHgxMCwgMHg4MCwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgCi0weGJmLCAweDgwLCAweDkwLCAweDQwLCAweDEwLCAweDEwLCAweDgwLCAweDI0LCAweDFkLCAweDgwLCAweDgwLCAweDEwLCAKLTB4MTAsIDB4ODAsIDB4MzMsIDB4YmUsIDB4OTEsIDB4NTgsIDB4OTEsIDB4MDAsIDB4OTAsIDB4ODAsIDB4ODEsIDB4OTAsIAotMHg1MCwgMHg5MCwgMHgyOCwgMHg4MCwgMHgzMywgMHhiYSwgMHg4MCwgMHgzMywgMHhiYiwgMHg4MSwgMHgzMywgMHhiMiwgCi0weDgxLCAweDkwLCAweDUwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAweGI4LCAweDgwLCAweDMzLCAweGI5LCAweDgxLCAKLTB4MzMsIDB4YjEsIDB4ODMsIDB4OTAsIDB4MjgsIDB4MjQsIDB4MWQsIDB4YTAsIDB4MjQsIDB4MWQsIDB4YTgsIDB4OTAsIAotMHhlOCwgMHg4MSwgMHg5MCwgMHg4OCwgMHg5MCwgMHgzOCwgMHgxMCwgMHgxMCwgMHg4MCwgMHgzMywgMHhjYiwgMHg5MCwgCi0weDI4LCAweDgwLCAweDMzLCAweGM2LCAweDgwLCAweDMzLCAweGM1LCAweDgwLCAweDkwLCAweDI4LCAweDgwLCAweDMzLCAKLTB4Y2YsIDB4ODAsIDB4MzMsIDB4Y2UsIDB4ODIsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MjQsIDB4MWQsIDB4NzgsIDB4OTcsIAotMHgxMCwgMHg5ZSwgMHgxMCwgMHgwNiwgMHg5OCwgMHg5MywgMHgwMCwgMHg5MSwgMHg4MCwgMHg5MCwgMHhjMCwgMHg5MCwgCi0weDYwLCAweDkwLCAweDM4LCAweGE0LCAweDAzLCAweDgwLCAweDMwLCAweDcxLCAweDI0LCAweDAzLCAweDc4LCAweDkwLCAKLTB4MzgsIDB4YTQsIDB4MDQsIDB4MTAsIDB4MzAsIDB4ODMsIDB4MjQsIDB4MDQsIDB4MDgsIDB4OTAsIDB4NjAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgwNSwgMHgzMCwgMHgzMCwgMHhhNywgMHgyNCwgMHgwNSwgMHgyOCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDA0LCAweGEwLCAweDMwLCAweDk1LCAweDI0LCAweDA0LCAweDk4LCAweDkwLCAweGMwLCAweDkwLCAweDYwLCAweDkwLCAKLTB4MzgsIDB4YTQsIDB4MDMsIDB4NzAsIDB4MzAsIDB4NmMsIDB4MjQsIDB4MDMsIDB4NjgsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgwNCwgMHgwMCwgMHgzMCwgMHg3ZSwgMHgyNCwgMHgwMywgMHhmOCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDA1LCAweDIwLCAweDMwLCAweGEyLCAweDI0LCAweDA1LCAweDE4LCAweDkwLCAweDM4LCAweGE0LCAweDA0LCAweDkwLCAKLTB4MzAsIDB4OTAsIDB4MjQsIDB4MDQsIDB4ODgsIDB4OTEsIDB4ODAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIAotMHgzOCwgMHhhNCwgMHgwMywgMHg1OCwgMHgzMCwgMHg2OSwgMHgyNCwgMHgwMywgMHg1MCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDAzLCAweGU4LCAweDMwLCAweDdiLCAweDI0LCAweDAzLCAweGUwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MDUsIDB4MDgsIDB4MzAsIDB4OWYsIDB4MjQsIDB4MDUsIDB4MDAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDQsIDB4NzgsIAotMHgzMCwgMHg4ZCwgMHgyNCwgMHgwNCwgMHg3MCwgMHg5MCwgMHhjMCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDAzLCAweDQwLCAweDMwLCAweDY2LCAweDI0LCAweDAzLCAweDM4LCAweDkwLCAweDM4LCAweGE0LCAweDAzLCAweGQwLCAKLTB4MzAsIDB4NzgsIDB4MjQsIDB4MDMsIDB4YzgsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDQsIDB4ZjAsIAotMHgzMCwgMHg5YywgMHgyNCwgMHgwNCwgMHhlOCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNCwgMHg2MCwgMHgzMCwgMHg4YSwgCi0weDI0LCAweDA0LCAweDU4LCAweDEwLCAweDEwLCAweDgwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDkwLCAweDM4LCAKLTB4YTQsIDB4MDIsIDB4ZjgsIDB4MzAsIDB4NWQsIDB4MjQsIDB4MDIsIDB4ZjAsIDB4ZDcsIDB4NDIsIDB4MDAsIDB4YTQsIAotMHgzMSwgMHgwMCwgMHgzNiwgMHgyMiwgMHhhNCwgMHgzMCwgMHhlMCwgMHgzNiwgMHgxZSwgMHg5YywgMHhlMCwgMHgwNiwgCi0weDkwLCAweDkzLCAweDAwLCAweDkxLCAweDgwLCAweDkwLCAweGMwLCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAKLTB4MDMsIDB4MjgsIDB4MzAsIDB4NjMsIDB4MjQsIDB4MDMsIDB4MjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDMsIDB4YjgsIAotMHgzMCwgMHg3NSwgMHgyNCwgMHgwMywgMHhiMCwgMHg5MCwgMHg2MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwNCwgMHhkOCwgCi0weDMwLCAweDk5LCAweDI0LCAweDA0LCAweGQwLCAweDkwLCAweDM4LCAweGE0LCAweDA0LCAweDQ4LCAweDMwLCAweDg3LCAKLTB4MjQsIDB4MDQsIDB4NDAsIDB4OTAsIDB4YzAsIDB4OTAsIDB4NjAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDMsIDB4MTAsIAotMHgzMCwgMHg2MCwgMHgyNCwgMHgwMywgMHgwOCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwMywgMHhhMCwgMHgzMCwgMHg3MiwgCi0weDI0LCAweDAzLCAweDk4LCAweDkwLCAweDYwLCAweDkwLCAweDM4LCAweGE0LCAweDA0LCAweGMwLCAweDMwLCAweDk2LCAKLTB4MjQsIDB4MDQsIDB4YjgsIDB4OTAsIDB4MzgsIDB4YTQsIDB4MDQsIDB4MzAsIDB4MzAsIDB4ODQsIDB4MjQsIDB4MDQsIAotMHgyOCwgMHgxMCwgMHgxMCwgMHg5MCwgMHhlMCwgMHg5MCwgMHg3MCwgMHg5MCwgMHgzOCwgMHhhNCwgMHgwMiwgMHg4OCwgCi0weDMwLCAweDUyLCAweGE0LCAweDAyLCAweDc4LCAweDMwLCAweDUwLCAweDkwLCAweDM4LCAweGE0LCAweDAyLCAweDcwLCAKLTB4MzAsIDB4NGIsIDB4YTQsIDB4MDIsIDB4NjAsIDB4MzAsIDB4NGQsIDB4OTAsIDB4NzAsIDB4OTAsIDB4MzgsIDB4YTQsIAotMHgwMiwgMHg1MCwgMHgzMCwgMHg0MywgMHhhNCwgMHgwMiwgMHg0MCwgMHgzMCwgMHg0OSwgMHg5MCwgMHgzOCwgMHhhNCwgCi0weDAyLCAweDM4LCAweDMwLCAweDQ0LCAweGE0LCAweDAyLCAweDI4LCAweDMwLCAweDQ2LCAweDkxLCAweDQ4LCAweDgwLCAKLTB4OTAsIDB4YTAsIDB4OTAsIDB4NTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4NTYsIDB4MjQsIDB4MDIsIDB4YTgsIAotMHg5MCwgMHgyOCwgMHg4MCwgMHgzMCwgMHg1OCwgMHgyNCwgMHgwMiwgMHhiOCwgMHg5MCwgMHg1MCwgMHg5MCwgMHgyOCwgCi0weDgwLCAweDMwLCAweDVjLCAweDI0LCAweDAyLCAweGQ4LCAweDkwLCAweDI4LCAweDgwLCAweDMwLCAweDVhLCAweDI0LCAKLTB4MDIsIDB4YzgsIDB4ODAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4OTAsIDB4MjgsIDB4ODAsIDB4MzAsIDB4NTMsIAotMHgyNCwgMHgwMiwgMHhhMCwgMHhkNywgMHg0MiwgMHgwMCwgMHhhNCwgMHgzMSwgMHgwOCwgMHgzNiwgMHgyMywgMHhhNCwgCi0weDMwLCAweGU4LCAweDM2LCAweDFmLCAweGEwLCAweDE1LCAweDQwLCAweGEwLCAweDEwLCAweGI4LCAweGEwLCAweDBjLCAKLTB4ODgsIDB4OWUsIDB4ODgsIDB4MDksIDB4ZDAsIDB4OTQsIDB4ZjAsIDB4OTAsIDB4YjAsIDB4ODgsIDB4MDAsIDB4NjgsIAotMHg4NCwgMHgxMCwgMHgxMCwgMHhjOSwgMHhlMSwgMHgyZCwgMHg4MCwgMHg4NSwgMHgzNCwgMHhkMiwgMHhjYiwgMHg2MSwgCi0weDI2LCAweDQwLCAweDg1LCAweDM0LCAweGE4LCAweDlhLCAweDAwLCAweDAzLCAweGY4LCAweDkxLCAweDk4LCAweDgwLCAKLTB4OTEsIDB4MTAsIDB4OTAsIDB4YTAsIDB4OTAsIDB4NjgsIDB4OTAsIDB4MjAsIDB4MzgsIDB4NTcsIDB4YzksIDB4ZTIsIAotMHgxNSwgMHg0MCwgMHg4NSwgMHgzNCwgMHhkMCwgMHhhNCwgMHg0MiwgMHg5OCwgMHgzOCwgMHg1NCwgMHg5MCwgMHgzOCwgCi0weGE0LCAweDQyLCAweDYwLCAweDM4LCAweDRkLCAweGE0LCAweDQyLCAweDUwLCAweDM4LCAweDRiLCAweDkwLCAweDQ4LCAKLTB4MTAsIDB4MTAsIDB4YTQsIDB4NDIsIDB4MTgsIDB4MzgsIDB4NDQsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MzgsIDB4NDAsIAotMHg4MSwgMHgxMCwgMHgxMCwgMHg4MCwgMHhhNCwgMHg0MSwgMHhlOCwgMHgzOCwgMHgzZSwgMHg5MSwgMHhiMCwgMHg5MSwgCi0weDYwLCAweDkwLCAweGUwLCAweDkwLCAweDcwLCAweDkwLCAweDM4LCAweGE0LCAweDQyLCAweDg4LCAweDM4LCAweDUyLCAKLTB4YTQsIDB4NDIsIDB4NzgsIDB4MzgsIDB4NTAsIDB4OTAsIDB4MzgsIDB4YTQsIDB4NDIsIDB4NDAsIDB4MzgsIDB4NDksIAotMHhhNCwgMHg0MiwgMHgzMCwgMHgzOCwgMHg0NywgMHg5MCwgMHg0OCwgMHgxMCwgMHgxMCwgMHhhNCwgMHg0MiwgMHgwOCwgCi0weDM4LCAweDQyLCAweDEwLCAweDEwLCAweDgwLCAweDM4LCAweDNmLCAweDkwLCAweDI4LCAweDgwLCAweDM4LCAweDM4LCAKLTB4ODAsIDB4MzgsIDB4MzcsIDB4ODEsIDB4MTAsIDB4MTAsIDB4ODAsIDB4YTQsIDB4NDEsIDB4ZDgsIDB4MzgsIDB4M2MsIAotMHhjYiwgMHg2MSwgMHgyNiwgMHgwMCwgMHg4NSwgMHgzNCwgMHhhNywgMHg5MCwgMHhkOCwgMHg4OCwgMHgwMCwgMHg5MCwgCi0weDg0LCAweDkwLCAweDM4LCAweGMxLCAweGMwLCAweDg1LCAweDM4LCAweDViLCAweGM5LCAweGUxLCAweDJkLCAweDQwLCAKLTB4ODUsIDB4MzQsIDB4Y2UsIDB4Y2IsIDB4NjEsIDB4MjUsIDB4YzAsIDB4ODUsIDB4MzQsIDB4YTYsIDB4ODgsIDB4MDAsIAotMHg2OCwgMHg4NCwgMHgxMCwgMHgxMCwgMHhjOSwgMHhlMSwgMHgyZCwgMHgwMCwgMHg4NSwgMHgzNCwgMHhjYywgMHhjYiwgCi0weDYxLCAweDI1LCAweDgwLCAweDg1LCAweDM0LCAweGE1LCAweDkxLCAweGY4LCAweDkwLCAweGIwLCAweDg4LCAweDAwLCAKLTB4NjgsIDB4ODQsIDB4MTAsIDB4MTAsIDB4YzksIDB4ZTEsIDB4MmMsIDB4ODAsIDB4ODUsIDB4MzQsIDB4YzgsIDB4Y2IsIAotMHg2MSwgMHgyNSwgMHgwMCwgMHg4NSwgMHgzNCwgMHhhMywgMHg4OCwgMHgwMSwgMHgwMCwgMHg5MCwgMHhhMCwgMHg4MSwgCi0weDkwLCAweDcwLCAweDgwLCAweDkwLCAweDIwLCAweDM4LCAweDRlLCAweGM5LCAweGUxLCAweDJjLCAweDQwLCAweDg1LCAKLTB4MzQsIDB4YzYsIDB4ODEsIDB4MzgsIDB4NDUsIDB4ODEsIDB4MTAsIDB4MTAsIDB4ODAsIDB4YTQsIDB4NDEsIDB4YzgsIAotMHgzOCwgMHgzYSwgMHhjYiwgMHg2MSwgMHgyNCwgMHhjMCwgMHg4NSwgMHgzNCwgMHhhMiwgMHg5MCwgMHhiMCwgMHg4OCwgCi0weDAwLCAweDY4LCAweDg0LCAweDEwLCAweDEwLCAweGM5LCAweGUxLCAweDJjLCAweDAwLCAweDg1LCAweDM0LCAweGM0LCAKLTB4Y2IsIDB4NjEsIDB4MjQsIDB4ODAsIDB4ODUsIDB4MzQsIDB4YTEsIDB4ODgsIDB4MDAsIDB4NjgsIDB4ODQsIDB4MTAsIAotMHgxMCwgMHhjOSwgMHhlMSwgMHgyYiwgMHhjMCwgMHg4NSwgMHgzNCwgMHhjMiwgMHhjYiwgMHg2MSwgMHgyNCwgMHg0MCwgCi0weDg1LCAweDM0LCAweGEwLCAweDkyLCAweDM4LCAweDgxLCAweDkxLCAweDY4LCAweDkxLCAweDE4LCAweDkwLCAweDgwLCAKLTB4OTAsIDB4NDAsIDB4ODAsIDB4YTQsIDB4NDMsIDB4NTAsIDB4MzgsIDB4NmIsIDB4ODAsIDB4YTQsIDB4NDMsIDB4NDgsIAotMHgzOCwgMHg2OCwgMHg5MCwgMHgyOCwgMHg4MSwgMHgzOCwgMHg2NywgMHg5MCwgMHgzOCwgMHhhNCwgMHg0MywgMHgyOCwgCi0weDM4LCAweDY2LCAweGE0LCAweDQzLCAweDE4LCAweDM4LCAweDY0LCAweDkwLCAweDI4LCAweDgwLCAweDM4LCAweDYyLCAKLTB4ODAsIDB4MzgsIDB4NjEsIDB4ODAsIDB4OTAsIDB4NDAsIDB4MTAsIDB4MTAsIDB4ODAsIDB4MjQsIDB4NDMsIDB4MDAsIAotMHgxMCwgMHgxMCwgMHg5MCwgMHgzOCwgMHhhNCwgMHg0MiwgMHhmMCwgMHgzOCwgMHg1ZiwgMHhhNCwgMHg0MiwgMHhlMCwgCi0weDM4LCAweDVkLCAweDkwLCAweDUwLCAweDgwLCAweGM5LCAweGEyLCAweDE2LCAweDQwLCAweDg1LCAweDM4LCAweDVhLCAKLTB4ODAsIDB4MzgsIDB4NTgsIDB4OWEsIDB4ZDAsIDB4MDMsIDB4ZTAsIDB4OTEsIDB4NjAsIDB4OTAsIDB4YjAsIDB4ODgsIAotMHgwMCwgMHg2OCwgMHg4NCwgMHgxMCwgMHgxMCwgMHhjOSwgMHhlMSwgMHgyYiwgMHg0MCwgMHg4NSwgMHgzNCwgMHhiZSwgCi0weGNiLCAweDYxLCAweDIzLCAweGMwLCAweDg1LCAweDM0LCAweDllLCAweDg4LCAweDAwLCAweDY4LCAweDg0LCAweDEwLCAKLTB4MTAsIDB4YzksIDB4ZTEsIDB4MmIsIDB4MDAsIDB4ODUsIDB4MzQsIDB4YmMsIDB4Y2IsIDB4NjEsIDB4MjMsIDB4ODAsIAotMHg4NSwgMHgzNCwgMHg5ZCwgMHg5MCwgMHhiMCwgMHg4OCwgMHgwMCwgMHg2OCwgMHg4NCwgMHgxMCwgMHgxMCwgMHhjOSwgCi0weGUxLCAweDJhLCAweGMwLCAweDg1LCAweDM0LCAweGJhLCAweGNiLCAweDYxLCAweDIzLCAweDQwLCAweDg1LCAweDM0LCAKLTB4OWMsIDB4ODgsIDB4MDAsIDB4NjgsIDB4ODQsIDB4MTAsIDB4MTAsIDB4YzksIDB4ZTEsIDB4MmEsIDB4ODAsIDB4ODUsIAotMHgzNCwgMHhiOCwgMHhjYiwgMHg2MSwgMHgyMywgMHgwMCwgMHg4NSwgMHgzNCwgMHg5YiwgMHg5MCwgMHg5MCwgMHg5MCwgCi0weDQ4LCAweGNiLCAweGExLCAweDIxLCAweDQwLCAweDg1LCAweDM0LCAweDhhLCAweGNiLCAweGExLCAweDIxLCAweDAwLCAKLTB4ODUsIDB4MzQsIDB4ODksIDB4OTAsIDB4NDgsIDB4Y2IsIDB4YTEsIDB4MjAsIDB4YzAsIDB4ODUsIDB4MzQsIDB4ODgsIAotMHhjYiwgMHhhMSwgMHgyMCwgMHg4MCwgMHg4NSwgMHgzNCwgMHg4NywgMHhjYiwgMHhhMiwgMHgwZCwgMHg0MCwgMHg4MCwgCi0weDM4LCAweDM2LCAweDkyLCAweDQwLCAweDkxLCAweDIwLCAweDkwLCAweDkwLCAweDkwLCAweDQ4LCAweDhjLCAweDIzLCAKLTB4ODgsIDB4ODQsIDB4MjQsIDB4MjQsIDB4MDAsIDB4OGMsIDB4MjMsIDB4ODAsIDB4ODQsIDB4MjQsIDB4MjMsIDB4ZjgsIAotMHg5MCwgMHg0OCwgMHg4YywgMHgyMywgMHg3OCwgMHg4NCwgMHgyNCwgMHgyMywgMHhmMCwgMHg4YywgMHgyMywgMHg3MCwgCi0weDg0LCAweDI0LCAweDIzLCAweGU4LCAweDkwLCAweDkwLCAweDkwLCAweDQ4LCAweDhjLCAweDIzLCAweDYwLCAweDg0LCAKLTB4MjQsIDB4MjMsIDB4ZDgsIDB4OGMsIDB4MjMsIDB4NTgsIDB4ODQsIDB4MjQsIDB4MjMsIDB4ZDAsIDB4OTAsIDB4NDgsIAotMHg4YywgMHgyMywgMHg1MCwgMHg4NCwgMHgyNCwgMHgyMywgMHhjOCwgMHg4YywgMHgyMywgMHg0OCwgMHg4NCwgMHgyNCwgCi0weDIzLCAweGMwLCAweDkxLCAweDIwLCAweDkwLCAweDkwLCAweDkwLCAweDQ4LCAweDhjLCAweDIzLCAweDM4LCAweDg0LCAKLTB4MjQsIDB4MjMsIDB4YjAsIDB4OGMsIDB4MjMsIDB4MzAsIDB4ODQsIDB4MjQsIDB4MjMsIDB4YTgsIDB4OTAsIDB4NDgsIAotMHg4YywgMHgyMywgMHgyOCwgMHg4NCwgMHgyNCwgMHgyMywgMHhhMCwgMHg4YywgMHgyMywgMHgyMCwgMHg4NCwgMHgyNCwgCi0weDIzLCAweDk4LCAweDkwLCAweDkwLCAweDkwLCAweDQ4LCAweDhjLCAweDIzLCAweDEwLCAweDg0LCAweDI0LCAweDIyLCAKLTB4ZTgsIDB4OGMsIDB4MjMsIDB4MDgsIDB4ODQsIDB4MjQsIDB4MjIsIDB4ZTAsIDB4OTAsIDB4NDgsIDB4OGMsIDB4MjMsIAotMHgwMCwgMHg4NCwgMHgyNCwgMHgyMiwgMHhkOCwgMHg4YywgMHgyMiwgMHhmOCwgMHg4NCwgMHgyNCwgMHgyMiwgMHhkMCwgCi0weGEwLCAweDBmLCAweDUwLCAweGEwLCAweDA5LCAweDA4LCAweDlhLCAweDMwLCAweDA0LCAweDQwLCAweDkxLCAweDkwLCAKLTB4OTAsIDB4YzgsIDB4OTgsIDB4NTAsIDB4MDAsIDB4ODAsIDB4ZTUsIDB4MjIsIDB4MGMsIDB4NDAsIDB4MzgsIDB4MmQsIAotMHhlNSwgMHgyMiwgMHgwOCwgMHg0MCwgMHgzOCwgMHgyYiwgMHhjYiwgMHg2MSwgMHgxMiwgMHg0MCwgMHg4NSwgMHgzNCwgCi0weDU4LCAweDk4LCAweDUwLCAweDAwLCAweDgwLCAweGU1LCAweDIyLCAweDA0LCAweDQwLCAweDM4LCAweDBkLCAweGU1LCAKLTB4MjIsIDB4MDAsIDB4NDAsIDB4MzgsIDB4MGIsIDB4Y2IsIDB4NjEsIDB4MTIsIDB4MDAsIDB4ODUsIDB4MzQsIDB4NTcsIAotMHg5MCwgMHg0OCwgMHhjYiwgMHhhMSwgMHgxMSwgMHhjMCwgMHg4NSwgMHgzNCwgMHg1NiwgMHhjYiwgMHhhMSwgMHgxMSwgCi0weDgwLCAweDg1LCAweDM0LCAweDU1LCAweDkxLCAweDkwLCAweDkwLCAweGM4LCAweDk4LCAweDUwLCAweDAwLCAweDgwLCAKLTB4ZTUsIDB4MjEsIDB4ZmIsIDB4NDAsIDB4MzcsIDB4ZjMsIDB4ZTUsIDB4MjEsIDB4ZjgsIDB4NDAsIDB4MzcsIDB4ZTcsIAotMHhjYiwgMHg2MSwgMHgxMSwgMHgwMCwgMHg4NSwgMHgzNCwgMHg1MywgMHg5OCwgMHg1MCwgMHgwMCwgMHg4MCwgMHhlNSwgCi0weDIxLCAweGY1LCAweDQwLCAweDM3LCAweGRiLCAweGU1LCAweDIxLCAweGYyLCAweDQwLCAweDM3LCAweGNmLCAweGNiLCAKLTB4NjEsIDB4MTAsIDB4YzAsIDB4ODUsIDB4MzQsIDB4NTIsIDB4OTAsIDB4NDgsIDB4Y2IsIDB4YTEsIDB4MTAsIDB4ODAsIAotMHg4NSwgMHgzNCwgMHg1MSwgMHhjYiwgMHhhMSwgMHgxMCwgMHg0MCwgMHg4NSwgMHgzNCwgMHg1MCwgMHg5MiwgMHgyMCwgCi0weDkxLCAweDMwLCAweDkwLCAweGI4LCAweGQ1LCAweDAzLCAweDAwLCAweGMwLCAweGMwLCAweDgxLCAweDhjLCAweDAxLCAKLTB4YTAsIDB4ODQsIDB4MzAsIDB4M2UsIDB4YzAsIDB4YzAsIDB4ODEsIDB4OGMsIDB4MDEsIDB4ODAsIDB4ODQsIDB4MzAsIAotMHgzYywgMHhkNSwgMHgwMiwgMHgwMCwgMHhjMCwgMHhjMCwgMHg4MSwgMHgzMCwgMHgyOCwgMHhjMCwgMHhjMCwgMHg4MSwgCi0weDMwLCAweDI0LCAweDkwLCAweDc4LCAweGQ1LCAweDAyLCAweDAwLCAweGMwLCAweGMwLCAweDgxLCAweDMwLCAweDFjLCAKLTB4YzAsIDB4YzAsIDB4ODEsIDB4MzAsIDB4MTgsIDB4ZDUsIDB4MDIsIDB4MDAsIDB4YzAsIDB4YzAsIDB4ODEsIDB4MzAsIAotMHgxMCwgMHhjMCwgMHhjMCwgMHg4MSwgMHgzMCwgMHgwYywgMHg5MSwgMHg3MCwgMHg5MCwgMHhkOCwgMHhkNSwgMHgwMywgCi0weDgwLCAweGM4LCAweGUxLCAweGVmLCAweDQwLCAweDgxLCAweDhjLCAweDAxLCAweGMwLCAweDg0LCAweDMwLCAweDQwLCAKLTB4YzgsIDB4ZTEsIDB4ZjAsIDB4NDAsIDB4ODEsIDB4OGMsIDB4MDEsIDB4OTAsIDB4ODQsIDB4MzAsIDB4M2QsIDB4ZDUsIAotMHgwMiwgMHg4MCwgMHhjOCwgMHhlMSwgMHhlZSwgMHhjMCwgMHg4MSwgMHgzMCwgMHgyYywgMHhjOCwgMHhlMSwgMHhlYiwgCi0weGMwLCAweDgxLCAweDMwLCAweDI2LCAweDkwLCAweDk4LCAweGQ1LCAweDAyLCAweDgwLCAweGM4LCAweGUxLCAweGU1LCAKLTB4YzAsIDB4ODEsIDB4MzAsIDB4MjAsIDB4YzgsIDB4ZTEsIDB4ZTYsIDB4YzAsIDB4ODEsIDB4MzAsIDB4MWEsIDB4ZDUsIAotMHgwMiwgMHg4MCwgMHhjOCwgMHhlMSwgMHhlNSwgMHg0MCwgMHg4MSwgMHgzMCwgMHgxNCwgMHhjOCwgMHhlMSwgMHhlMiwgCi0weDQwLCAweDgxLCAweDMwLCAweDBlLCAweDlhLCAweDMwLCAweDA0LCAweDQwLCAweDkxLCAweDkwLCAweDkwLCAweGM4LCAKLTB4OTgsIDB4NTAsIDB4MDAsIDB4ODAsIDB4ZTUsIDB4MjIsIDB4MDYsIDB4NDAsIDB4MzgsIDB4MTUsIDB4ZTUsIDB4MjIsIAotMHgwNywgMHg0MCwgMHgzOCwgMHgyNywgMHhjYiwgMHg2MSwgMHgwZiwgMHhjMCwgMHg4NSwgMHgzNCwgMHg0ZSwgMHg5OCwgCi0weDUwLCAweDAwLCAweDgwLCAweGU1LCAweDIxLCAweGZlLCAweDQwLCAweDM3LCAweGY1LCAweGU1LCAweDIxLCAweGZmLCAKLTB4NDAsIDB4MzgsIDB4MDcsIDB4Y2IsIDB4NjEsIDB4MGYsIDB4ODAsIDB4ODUsIDB4MzQsIDB4NGQsIDB4OTAsIDB4NDgsIAotMHhjYiwgMHhhMSwgMHgwZiwgMHg0MCwgMHg4NSwgMHgzNCwgMHg0YywgMHhjYiwgMHhhMSwgMHgwZiwgMHgwMCwgMHg4NSwgCi0weDM0LCAweDRiLCAweDkxLCAweDkwLCAweDkwLCAweGM4LCAweDk4LCAweDUwLCAweDAwLCAweDgwLCAweGU1LCAweDIxLCAKLTB4ZmEsIDB4NDAsIDB4MzcsIDB4ZWYsIDB4ZTUsIDB4MjEsIDB4ZjcsIDB4NDAsIDB4MzcsIDB4ZTMsIDB4Y2IsIDB4NjEsIAotMHgwZCwgMHg0MCwgMHg4NSwgMHgzNCwgMHgzYSwgMHg5OCwgMHg1MCwgMHgwMCwgMHg4MCwgMHhlNSwgMHgyMSwgMHhmNCwgCi0weDQwLCAweDM3LCAweGQ3LCAweGU1LCAweDIxLCAweGYxLCAweDQwLCAweDM3LCAweGNiLCAweGNiLCAweDYxLCAweDBkLCAKLTB4MDAsIDB4ODUsIDB4MzQsIDB4MzksIDB4OTAsIDB4NDgsIDB4Y2IsIDB4YTEsIDB4MGMsIDB4YzAsIDB4ODUsIDB4MzQsIAotMHgzOCwgMHhjYiwgMHhhMSwgMHgwYywgMHg4MCwgMHg4NSwgMHgzNCwgMHgzNywgMHg5MSwgMHgwMCwgMHg5MCwgMHg4MCwgCi0weDkwLCAweDQwLCAweGU1LCAweDIwLCAweDAyLCAweDQwLCAweDMwLCAweDBhLCAweGU1LCAweDIwLCAweDAxLCAweDgwLCAKLTB4MzAsIDB4MDcsIDB4OTAsIDB4NDAsIDB4ZTUsIDB4MjAsIDB4MDAsIDB4YzAsIDB4MzAsIDB4MDQsIDB4ZTUsIDB4MjAsIAotMHgwMCwgMHgwMCwgMHgzMCwgMHgwMSwgMHg5MCwgMHg4MCwgMHg5MCwgMHg0MCwgMHhlNSwgMHgyMSwgMHhlOSwgMHg0MCwgCi0weDM3LCAweDlmLCAweGU1LCAweDIxLCAweGVhLCAweDgwLCAweDM3LCAweGI1LCAweDkwLCAweDQwLCAweGU1LCAweDIxLCAKLTB4ZGYsIDB4YzAsIDB4MzcsIDB4NzksIDB4ZTUsIDB4MjEsIDB4ZTEsIDB4MDAsIDB4MzcsIDB4OGYsIDB4ODAsIDB4OTksIAotMHgyOCwgMHgwMiwgMHhmMCwgMHg4YywgMHgyMSwgMHg0OCwgMHg5MCwgMHg4MCwgMHg5MCwgMHg0MCwgMHhlNSwgMHgyMiwgCi0weDA5LCAweDQwLCAweDM4LCAweDIzLCAweGU1LCAweDIyLCAweDA3LCAweGMwLCAweDM4LCAweDI5LCAweDkwLCAweDQwLCAKLTB4ZTUsIDB4MjIsIDB4MDEsIDB4NDAsIDB4MzgsIDB4MDMsIDB4ZTUsIDB4MjEsIDB4ZmYsIDB4YzAsIDB4MzgsIDB4MDksIAotMHg5MSwgMHg0OCwgMHg5MCwgMHhjOCwgMHg5OCwgMHg1MCwgMHgwMCwgMHg4MCwgMHhlNSwgMHgyMSwgMHhmYSwgMHhjMCwgCi0weDM3LCAweGYxLCAweGU1LCAweDIxLCAweGY3LCAweGMwLCAweDM3LCAweGU1LCAweGNiLCAweDYxLCAweDBiLCAweDAwLCAKLTB4ODUsIDB4MzQsIDB4MzAsIDB4OTAsIDB4NDAsIDB4ZTUsIDB4MjEsIDB4ZjQsIDB4YzAsIDB4MzcsIDB4ZDksIDB4ZTUsIAotMHgyMSwgMHhmMSwgMHhjMCwgMHgzNywgMHhjZCwgMHg5MCwgMHg0OCwgMHhjYiwgMHhhMSwgMHgwYSwgMHg4MCwgMHg4NSwgCi0weDM0LCAweDJlLCAweGNiLCAweGExLCAweDBhLCAweGMwLCAweDg1LCAweDM0LCAweDJmLCAweDEwLCAweDEwLCAweDkwLCAKLTB4ODAsIDB4OTAsIDB4NDAsIDB4ZTUsIDB4MjEsIDB4ZWMsIDB4YzAsIDB4MzcsIDB4YjEsIDB4ZTUsIDB4MjEsIDB4ZWIsIAotMHg0MCwgMHgzNywgMHhiOSwgMHg5MCwgMHg0MCwgMHhlNSwgMHgyMSwgMHhlMywgMHg0MCwgMHgzNywgMHg4YiwgMHhlNSwgCi0weDIxLCAweGUxLCAweGMwLCAweDM3LCAweDkzLCAKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWE2NF9kaXNfbmFtZXMgaWE2NF9kaXNfbmFtZXNbXSA9IHsKLXsgMHg1MSwgMzksIDAsIDggfSwKLXsgMHgzMSwgMzksIDEsIDE4IH0sCi17IDB4MTEsIDQwLCAwLCAxNyB9LAoteyAweDI5LCAzOSwgMCwgMTAgfSwKLXsgMHgxOSwgMzksIDEsIDIyIH0sCi17IDB4OSwgNDAsIDAsIDIxIH0sCi17IDB4MTUsIDM5LCAwLCAxMiB9LAoteyAweGQsIDM5LCAxLCAyNiB9LAoteyAweDUsIDQwLCAwLCAyNSB9LAoteyAweGIsIDM5LCAwLCAxNCB9LAoteyAweDcsIDM5LCAxLCAzMCB9LAoteyAweDMsIDQwLCAwLCAyOSB9LAoteyAweDUxLCAzNywgMSwgNTYgfSwKLXsgMHg1MCwgMzcsIDAsIDMyIH0sCi17IDB4ZDEsIDM3LCAxLCA1NSB9LAoteyAweGQwLCAzNywgMCwgMzEgfSwKLXsgMHgzMSwgMzcsIDEsIDY2IH0sCi17IDB4MzAsIDM3LCAxLCA0MiB9LAoteyAweDExLCAzOCwgMSwgNjUgfSwKLXsgMHgxMCwgMzgsIDAsIDQxIH0sCi17IDB4NzEsIDM3LCAxLCA2NCB9LAoteyAweDcwLCAzNywgMSwgNDAgfSwKLXsgMHgzMSwgMzgsIDEsIDYzIH0sCi17IDB4MzAsIDM4LCAwLCAzOSB9LAoteyAweDI5LCAzNywgMSwgNTggfSwKLXsgMHgyOCwgMzcsIDAsIDM0IH0sCi17IDB4NjksIDM3LCAxLCA1NyB9LAoteyAweDY4LCAzNywgMCwgMzMgfSwKLXsgMHgxOSwgMzcsIDEsIDcwIH0sCi17IDB4MTgsIDM3LCAxLCA0NiB9LAoteyAweDksIDM4LCAxLCA2OSB9LAoteyAweDgsIDM4LCAwLCA0NSB9LAoteyAweDM5LCAzNywgMSwgNjggfSwKLXsgMHgzOCwgMzcsIDEsIDQ0IH0sCi17IDB4MTksIDM4LCAxLCA2NyB9LAoteyAweDE4LCAzOCwgMCwgNDMgfSwKLXsgMHgxNSwgMzcsIDEsIDYwIH0sCi17IDB4MTQsIDM3LCAwLCAzNiB9LAoteyAweDM1LCAzNywgMSwgNTkgfSwKLXsgMHgzNCwgMzcsIDAsIDM1IH0sCi17IDB4ZCwgMzcsIDEsIDc0IH0sCi17IDB4YywgMzcsIDEsIDUwIH0sCi17IDB4NSwgMzgsIDEsIDczIH0sCi17IDB4NCwgMzgsIDAsIDQ5IH0sCi17IDB4MWQsIDM3LCAxLCA3MiB9LAoteyAweDFjLCAzNywgMSwgNDggfSwKLXsgMHhkLCAzOCwgMSwgNzEgfSwKLXsgMHhjLCAzOCwgMCwgNDcgfSwKLXsgMHhiLCAzNywgMSwgNjIgfSwKLXsgMHhhLCAzNywgMCwgMzggfSwKLXsgMHgxYiwgMzcsIDEsIDYxIH0sCi17IDB4MWEsIDM3LCAwLCAzNyB9LAoteyAweDcsIDM3LCAxLCA3OCB9LAoteyAweDYsIDM3LCAxLCA1NCB9LAoteyAweDMsIDM4LCAxLCA3NyB9LAoteyAweDIsIDM4LCAwLCA1MyB9LAoteyAweGYsIDM3LCAxLCA3NiB9LAoteyAweGUsIDM3LCAxLCA1MiB9LAoteyAweDcsIDM4LCAxLCA3NSB9LAoteyAweDYsIDM4LCAwLCA1MSB9LAoteyAweDgsIDM2LCAwLCA4MCB9LAoteyAweDE4LCAzNiwgMCwgNzkgfSwKLXsgMHgxLCAzNiwgMSwgODQgfSwKLXsgMHgyLCAzNiwgMCwgODMgfSwKLXsgMHgzLCAzNiwgMSwgODIgfSwKLXsgMHg0LCAzNiwgMCwgODEgfSwKLXsgMHgxLCAyNzksIDAsIDg1IH0sCi17IDB4MjAsIDIzMiwgMCwgOTUgfSwKLXsgMHgyMjAsIDIzMiwgMCwgOTEgfSwKLXsgMHgxMjIwLCAyMzIsIDAsIDg4IH0sCi17IDB4YTIwLCAyMzIsIDAsIDg5IH0sCi17IDB4NjIwLCAyMzIsIDAsIDkwIH0sCi17IDB4MTIwLCAyMzIsIDAsIDkyIH0sCi17IDB4YTAsIDIzMiwgMCwgOTMgfSwKLXsgMHg2MCwgMjMyLCAwLCA5NCB9LAoteyAweDEwLCAyMzIsIDAsIDk5IH0sCi17IDB4OTAsIDIzMiwgMCwgOTYgfSwKLXsgMHg1MCwgMjMyLCAwLCA5NyB9LAoteyAweDMwLCAyMzIsIDAsIDk4IH0sCi17IDB4OCwgMjMyLCAwLCAxMDAgfSwKLXsgMHg0LCAyMzIsIDAsIDEwMSB9LAoteyAweDIsIDIzMiwgMCwgMTAyIH0sCi17IDB4MSwgMjMyLCAwLCAxMDMgfSwKLXsgMHgxLCAzNTIsIDAsIDEwNSB9LAoteyAweDMsIDM1MiwgMCwgMTA0IH0sCi17IDB4MiwgMzU4LCAwLCAxMDYgfSwKLXsgMHgxLCAzNTgsIDAsIDEwNyB9LAoteyAweDIsIDM1NCwgMCwgMTA4IH0sCi17IDB4MSwgMzU0LCAwLCAxMDkgfSwKLXsgMHgyLCAzNTYsIDAsIDExMCB9LAoteyAweDEsIDM1NiwgMCwgMTExIH0sCi17IDB4MiwgMzYwLCAwLCAxMTIgfSwKLXsgMHgxLCAzNjAsIDAsIDExMyB9LAoteyAweDEsIDIxMSwgMCwgMTQwIH0sCi17IDB4NSwgMjExLCAwLCAxMzggfSwKLXsgMHgzLCAyMTEsIDAsIDEzOSB9LAoteyAweDE0MCwgMjIwLCAwLCAxMTYgfSwKLXsgMHg1NDAsIDIyMCwgMCwgMTE0IH0sCi17IDB4MzQwLCAyMjAsIDAsIDExNSB9LAoteyAweGMwLCAyMjAsIDAsIDEyOCB9LAoteyAweDJjMCwgMjIwLCAwLCAxMjYgfSwKLXsgMHgxYzAsIDIyMCwgMCwgMTI3IH0sCi17IDB4MjAsIDIyMCwgMCwgMTQzIH0sCi17IDB4YTAsIDIyMCwgMCwgMTQxIH0sCi17IDB4NjAsIDIyMCwgMCwgMTQyIH0sCi17IDB4MTAsIDIyMCwgMCwgMTU1IH0sCi17IDB4NTAsIDIyMCwgMCwgMTUzIH0sCi17IDB4MzAsIDIyMCwgMCwgMTU0IH0sCi17IDB4OCwgMjIwLCAwLCAxNjcgfSwKLXsgMHgyOCwgMjIwLCAwLCAxNjUgfSwKLXsgMHgxOCwgMjIwLCAwLCAxNjYgfSwKLXsgMHg0LCAyMjAsIDAsIDE3NyB9LAoteyAweDIsIDIyMCwgMCwgMTc4IH0sCi17IDB4MSwgMjIwLCAwLCAxNzkgfSwKLXsgMHgxNDAsIDIxNCwgMCwgMTE5IH0sCi17IDB4NTQwLCAyMTQsIDAsIDExNyB9LAoteyAweDM0MCwgMjE0LCAwLCAxMTggfSwKLXsgMHhjMCwgMjE0LCAwLCAxMzEgfSwKLXsgMHgyYzAsIDIxNCwgMCwgMTI5IH0sCi17IDB4MWMwLCAyMTQsIDAsIDEzMCB9LAoteyAweDIwLCAyMTQsIDAsIDE0NiB9LAoteyAweGEwLCAyMTQsIDAsIDE0NCB9LAoteyAweDYwLCAyMTQsIDAsIDE0NSB9LAoteyAweDEwLCAyMTQsIDAsIDE1OCB9LAoteyAweDUwLCAyMTQsIDAsIDE1NiB9LAoteyAweDMwLCAyMTQsIDAsIDE1NyB9LAoteyAweDgsIDIxNCwgMCwgMTcwIH0sCi17IDB4MjgsIDIxNCwgMCwgMTY4IH0sCi17IDB4MTgsIDIxNCwgMCwgMTY5IH0sCi17IDB4NCwgMjE0LCAwLCAxODAgfSwKLXsgMHgyLCAyMTQsIDAsIDE4MSB9LAoteyAweDEsIDIxNCwgMCwgMTgyIH0sCi17IDB4MTQwLCAyMTcsIDAsIDEyMiB9LAoteyAweDU0MCwgMjE3LCAwLCAxMjAgfSwKLXsgMHgzNDAsIDIxNywgMCwgMTIxIH0sCi17IDB4YzAsIDIxNywgMCwgMTM0IH0sCi17IDB4MmMwLCAyMTcsIDAsIDEzMiB9LAoteyAweDFjMCwgMjE3LCAwLCAxMzMgfSwKLXsgMHgyMCwgMjE3LCAwLCAxNDkgfSwKLXsgMHhhMCwgMjE3LCAwLCAxNDcgfSwKLXsgMHg2MCwgMjE3LCAwLCAxNDggfSwKLXsgMHgxMCwgMjE3LCAwLCAxNjEgfSwKLXsgMHg1MCwgMjE3LCAwLCAxNTkgfSwKLXsgMHgzMCwgMjE3LCAwLCAxNjAgfSwKLXsgMHg4LCAyMTcsIDAsIDE3MyB9LAoteyAweDI4LCAyMTcsIDAsIDE3MSB9LAoteyAweDE4LCAyMTcsIDAsIDE3MiB9LAoteyAweDQsIDIxNywgMCwgMTgzIH0sCi17IDB4MiwgMjE3LCAwLCAxODQgfSwKLXsgMHgxLCAyMTcsIDAsIDE4NSB9LAoteyAweDE0MCwgMjI5LCAwLCAxMjUgfSwKLXsgMHg1NDAsIDIyOSwgMCwgMTIzIH0sCi17IDB4MzQwLCAyMjksIDAsIDEyNCB9LAoteyAweGMwLCAyMjksIDAsIDEzNyB9LAoteyAweDJjMCwgMjI5LCAwLCAxMzUgfSwKLXsgMHgxYzAsIDIyOSwgMCwgMTM2IH0sCi17IDB4MjAsIDIyOSwgMCwgMTUyIH0sCi17IDB4YTAsIDIyOSwgMCwgMTUwIH0sCi17IDB4NjAsIDIyOSwgMCwgMTUxIH0sCi17IDB4MTAsIDIyOSwgMCwgMTY0IH0sCi17IDB4NTAsIDIyOSwgMCwgMTYyIH0sCi17IDB4MzAsIDIyOSwgMCwgMTYzIH0sCi17IDB4OCwgMjI5LCAwLCAxNzYgfSwKLXsgMHgyOCwgMjI5LCAwLCAxNzQgfSwKLXsgMHgxOCwgMjI5LCAwLCAxNzUgfSwKLXsgMHg0LCAyMjksIDAsIDE4NiB9LAoteyAweDIsIDIyOSwgMCwgMTg3IH0sCi17IDB4MSwgMjI5LCAwLCAxODggfSwKLXsgMHg4LCAzMzMsIDAsIDE4OSB9LAoteyAweDQsIDMzMywgMCwgMTkwIH0sCi17IDB4MiwgMzMzLCAwLCAxOTEgfSwKLXsgMHgxLCAzMzMsIDAsIDE5MiB9LAoteyAweDIwLCAyMzEsIDAsIDIwMCB9LAoteyAweDIyMCwgMjMxLCAwLCAxOTYgfSwKLXsgMHgxMjIwLCAyMzEsIDAsIDE5MyB9LAoteyAweGEyMCwgMjMxLCAwLCAxOTQgfSwKLXsgMHg2MjAsIDIzMSwgMCwgMTk1IH0sCi17IDB4MTIwLCAyMzEsIDAsIDE5NyB9LAoteyAweGEwLCAyMzEsIDAsIDE5OCB9LAoteyAweDYwLCAyMzEsIDAsIDE5OSB9LAoteyAweDEwLCAyMzEsIDAsIDIwNCB9LAoteyAweDkwLCAyMzEsIDAsIDIwMSB9LAoteyAweDUwLCAyMzEsIDAsIDIwMiB9LAoteyAweDMwLCAyMzEsIDAsIDIwMyB9LAoteyAweDgsIDIzMSwgMCwgMjA1IH0sCi17IDB4NCwgMjMxLCAwLCAyMDYgfSwKLXsgMHgyLCAyMzEsIDAsIDIwNyB9LAoteyAweDEsIDIzMSwgMCwgMjA4IH0sCi17IDB4MjAsIDIzMCwgMCwgMjE2IH0sCi17IDB4MjIwLCAyMzAsIDAsIDIxMiB9LAoteyAweDEyMjAsIDIzMCwgMCwgMjA5IH0sCi17IDB4YTIwLCAyMzAsIDAsIDIxMCB9LAoteyAweDYyMCwgMjMwLCAwLCAyMTEgfSwKLXsgMHgxMjAsIDIzMCwgMCwgMjEzIH0sCi17IDB4YTAsIDIzMCwgMCwgMjE0IH0sCi17IDB4NjAsIDIzMCwgMCwgMjE1IH0sCi17IDB4MTAsIDIzMCwgMCwgMjIwIH0sCi17IDB4OTAsIDIzMCwgMCwgMjE3IH0sCi17IDB4NTAsIDIzMCwgMCwgMjE4IH0sCi17IDB4MzAsIDIzMCwgMCwgMjE5IH0sCi17IDB4OCwgMjMwLCAwLCAyMjEgfSwKLXsgMHg0LCAyMzAsIDAsIDIyMiB9LAoteyAweDIsIDIzMCwgMCwgMjIzIH0sCi17IDB4MSwgMjMwLCAwLCAyMjQgfSwKLXsgMHgxNDAsIDIyMiwgMCwgMjI3IH0sCi17IDB4NTQwLCAyMjIsIDAsIDIyNSB9LAoteyAweDM0MCwgMjIyLCAwLCAyMjYgfSwKLXsgMHhjMCwgMjIyLCAwLCAyMzYgfSwKLXsgMHgyYzAsIDIyMiwgMCwgMjM0IH0sCi17IDB4MWMwLCAyMjIsIDAsIDIzNSB9LAoteyAweDIwLCAyMjIsIDAsIDI0NSB9LAoteyAweGEwLCAyMjIsIDAsIDI0MyB9LAoteyAweDYwLCAyMjIsIDAsIDI0NCB9LAoteyAweDEwLCAyMjIsIDAsIDI1NCB9LAoteyAweDUwLCAyMjIsIDAsIDI1MiB9LAoteyAweDMwLCAyMjIsIDAsIDI1MyB9LAoteyAweDgsIDIyMiwgMCwgMjYzIH0sCi17IDB4MjgsIDIyMiwgMCwgMjYxIH0sCi17IDB4MTgsIDIyMiwgMCwgMjYyIH0sCi17IDB4NCwgMjIyLCAwLCAyNzAgfSwKLXsgMHgyLCAyMjIsIDAsIDI3MSB9LAoteyAweDEsIDIyMiwgMCwgMjcyIH0sCi17IDB4MTQwLCAyMjQsIDAsIDIzMCB9LAoteyAweDU0MCwgMjI0LCAwLCAyMjggfSwKLXsgMHgzNDAsIDIyNCwgMCwgMjI5IH0sCi17IDB4YzAsIDIyNCwgMCwgMjM5IH0sCi17IDB4MmMwLCAyMjQsIDAsIDIzNyB9LAoteyAweDFjMCwgMjI0LCAwLCAyMzggfSwKLXsgMHgyMCwgMjI0LCAwLCAyNDggfSwKLXsgMHhhMCwgMjI0LCAwLCAyNDYgfSwKLXsgMHg2MCwgMjI0LCAwLCAyNDcgfSwKLXsgMHgxMCwgMjI0LCAwLCAyNTcgfSwKLXsgMHg1MCwgMjI0LCAwLCAyNTUgfSwKLXsgMHgzMCwgMjI0LCAwLCAyNTYgfSwKLXsgMHg4LCAyMjQsIDAsIDI2NiB9LAoteyAweDI4LCAyMjQsIDAsIDI2NCB9LAoteyAweDE4LCAyMjQsIDAsIDI2NSB9LAoteyAweDQsIDIyNCwgMCwgMjczIH0sCi17IDB4MiwgMjI0LCAwLCAyNzQgfSwKLXsgMHgxLCAyMjQsIDAsIDI3NSB9LAoteyAweDE0MCwgMjI2LCAwLCAyMzMgfSwKLXsgMHg1NDAsIDIyNiwgMCwgMjMxIH0sCi17IDB4MzQwLCAyMjYsIDAsIDIzMiB9LAoteyAweGMwLCAyMjYsIDAsIDI0MiB9LAoteyAweDJjMCwgMjI2LCAwLCAyNDAgfSwKLXsgMHgxYzAsIDIyNiwgMCwgMjQxIH0sCi17IDB4MjAsIDIyNiwgMCwgMjUxIH0sCi17IDB4YTAsIDIyNiwgMCwgMjQ5IH0sCi17IDB4NjAsIDIyNiwgMCwgMjUwIH0sCi17IDB4MTAsIDIyNiwgMCwgMjYwIH0sCi17IDB4NTAsIDIyNiwgMCwgMjU4IH0sCi17IDB4MzAsIDIyNiwgMCwgMjU5IH0sCi17IDB4OCwgMjI2LCAwLCAyNjkgfSwKLXsgMHgyOCwgMjI2LCAwLCAyNjcgfSwKLXsgMHgxOCwgMjI2LCAwLCAyNjggfSwKLXsgMHg0LCAyMjYsIDAsIDI3NiB9LAoteyAweDIsIDIyNiwgMCwgMjc3IH0sCi17IDB4MSwgMjI2LCAwLCAyNzggfSwKLXsgMHgxNDAsIDIyMSwgMCwgMjgxIH0sCi17IDB4NTQwLCAyMjEsIDAsIDI3OSB9LAoteyAweDM0MCwgMjIxLCAwLCAyODAgfSwKLXsgMHhjMCwgMjIxLCAwLCAyOTAgfSwKLXsgMHgyYzAsIDIyMSwgMCwgMjg4IH0sCi17IDB4MWMwLCAyMjEsIDAsIDI4OSB9LAoteyAweDIwLCAyMjEsIDAsIDI5OSB9LAoteyAweGEwLCAyMjEsIDAsIDI5NyB9LAoteyAweDYwLCAyMjEsIDAsIDI5OCB9LAoteyAweDEwLCAyMjEsIDAsIDMwOCB9LAoteyAweDUwLCAyMjEsIDAsIDMwNiB9LAoteyAweDMwLCAyMjEsIDAsIDMwNyB9LAoteyAweDgsIDIyMSwgMCwgMzE3IH0sCi17IDB4MjgsIDIyMSwgMCwgMzE1IH0sCi17IDB4MTgsIDIyMSwgMCwgMzE2IH0sCi17IDB4NCwgMjIxLCAwLCAzMjQgfSwKLXsgMHgyLCAyMjEsIDAsIDMyNSB9LAoteyAweDEsIDIyMSwgMCwgMzI2IH0sCi17IDB4MTQwLCAyMjMsIDAsIDI4NCB9LAoteyAweDU0MCwgMjIzLCAwLCAyODIgfSwKLXsgMHgzNDAsIDIyMywgMCwgMjgzIH0sCi17IDB4YzAsIDIyMywgMCwgMjkzIH0sCi17IDB4MmMwLCAyMjMsIDAsIDI5MSB9LAoteyAweDFjMCwgMjIzLCAwLCAyOTIgfSwKLXsgMHgyMCwgMjIzLCAwLCAzMDIgfSwKLXsgMHhhMCwgMjIzLCAwLCAzMDAgfSwKLXsgMHg2MCwgMjIzLCAwLCAzMDEgfSwKLXsgMHgxMCwgMjIzLCAwLCAzMTEgfSwKLXsgMHg1MCwgMjIzLCAwLCAzMDkgfSwKLXsgMHgzMCwgMjIzLCAwLCAzMTAgfSwKLXsgMHg4LCAyMjMsIDAsIDMyMCB9LAoteyAweDI4LCAyMjMsIDAsIDMxOCB9LAoteyAweDE4LCAyMjMsIDAsIDMxOSB9LAoteyAweDQsIDIyMywgMCwgMzI3IH0sCi17IDB4MiwgMjIzLCAwLCAzMjggfSwKLXsgMHgxLCAyMjMsIDAsIDMyOSB9LAoteyAweDE0MCwgMjI1LCAwLCAyODcgfSwKLXsgMHg1NDAsIDIyNSwgMCwgMjg1IH0sCi17IDB4MzQwLCAyMjUsIDAsIDI4NiB9LAoteyAweGMwLCAyMjUsIDAsIDI5NiB9LAoteyAweDJjMCwgMjI1LCAwLCAyOTQgfSwKLXsgMHgxYzAsIDIyNSwgMCwgMjk1IH0sCi17IDB4MjAsIDIyNSwgMCwgMzA1IH0sCi17IDB4YTAsIDIyNSwgMCwgMzAzIH0sCi17IDB4NjAsIDIyNSwgMCwgMzA0IH0sCi17IDB4MTAsIDIyNSwgMCwgMzE0IH0sCi17IDB4NTAsIDIyNSwgMCwgMzEyIH0sCi17IDB4MzAsIDIyNSwgMCwgMzEzIH0sCi17IDB4OCwgMjI1LCAwLCAzMjMgfSwKLXsgMHgyOCwgMjI1LCAwLCAzMjEgfSwKLXsgMHgxOCwgMjI1LCAwLCAzMjIgfSwKLXsgMHg0LCAyMjUsIDAsIDMzMCB9LAoteyAweDIsIDIyNSwgMCwgMzMxIH0sCi17IDB4MSwgMjI1LCAwLCAzMzIgfSwKLXsgMHgxLCAzNTEsIDAsIDMzNCB9LAoteyAweDMsIDM1MSwgMCwgMzMzIH0sCi17IDB4MiwgMzU3LCAwLCAzMzUgfSwKLXsgMHgxLCAzNTcsIDAsIDMzNiB9LAoteyAweDIsIDM1MywgMCwgMzM3IH0sCi17IDB4MSwgMzUzLCAwLCAzMzggfSwKLXsgMHgyLCAzNTUsIDAsIDMzOSB9LAoteyAweDEsIDM1NSwgMCwgMzQwIH0sCi17IDB4MiwgMzU5LCAwLCAzNDEgfSwKLXsgMHgxLCAzNTksIDAsIDM0MiB9LAoteyAweDEsIDIxMCwgMCwgMzY5IH0sCi17IDB4NSwgMjEwLCAwLCAzNjcgfSwKLXsgMHgzLCAyMTAsIDAsIDM2OCB9LAoteyAweDE0MCwgMjE5LCAwLCAzNDUgfSwKLXsgMHg1NDAsIDIxOSwgMCwgMzQzIH0sCi17IDB4MzQwLCAyMTksIDAsIDM0NCB9LAoteyAweGMwLCAyMTksIDAsIDM1NyB9LAoteyAweDJjMCwgMjE5LCAwLCAzNTUgfSwKLXsgMHgxYzAsIDIxOSwgMCwgMzU2IH0sCi17IDB4MjAsIDIxOSwgMCwgMzcyIH0sCi17IDB4YTAsIDIxOSwgMCwgMzcwIH0sCi17IDB4NjAsIDIxOSwgMCwgMzcxIH0sCi17IDB4MTAsIDIxOSwgMCwgMzg0IH0sCi17IDB4NTAsIDIxOSwgMCwgMzgyIH0sCi17IDB4MzAsIDIxOSwgMCwgMzgzIH0sCi17IDB4OCwgMjE5LCAwLCAzOTYgfSwKLXsgMHgyOCwgMjE5LCAwLCAzOTQgfSwKLXsgMHgxOCwgMjE5LCAwLCAzOTUgfSwKLXsgMHg0LCAyMTksIDAsIDQwNiB9LAoteyAweDIsIDIxOSwgMCwgNDA3IH0sCi17IDB4MSwgMjE5LCAwLCA0MDggfSwKLXsgMHgxNDAsIDIxMywgMCwgMzQ4IH0sCi17IDB4NTQwLCAyMTMsIDAsIDM0NiB9LAoteyAweDM0MCwgMjEzLCAwLCAzNDcgfSwKLXsgMHhjMCwgMjEzLCAwLCAzNjAgfSwKLXsgMHgyYzAsIDIxMywgMCwgMzU4IH0sCi17IDB4MWMwLCAyMTMsIDAsIDM1OSB9LAoteyAweDIwLCAyMTMsIDAsIDM3NSB9LAoteyAweGEwLCAyMTMsIDAsIDM3MyB9LAoteyAweDYwLCAyMTMsIDAsIDM3NCB9LAoteyAweDEwLCAyMTMsIDAsIDM4NyB9LAoteyAweDUwLCAyMTMsIDAsIDM4NSB9LAoteyAweDMwLCAyMTMsIDAsIDM4NiB9LAoteyAweDgsIDIxMywgMCwgMzk5IH0sCi17IDB4MjgsIDIxMywgMCwgMzk3IH0sCi17IDB4MTgsIDIxMywgMCwgMzk4IH0sCi17IDB4NCwgMjEzLCAwLCA0MDkgfSwKLXsgMHgyLCAyMTMsIDAsIDQxMCB9LAoteyAweDEsIDIxMywgMCwgNDExIH0sCi17IDB4MTQwLCAyMTYsIDAsIDM1MSB9LAoteyAweDU0MCwgMjE2LCAwLCAzNDkgfSwKLXsgMHgzNDAsIDIxNiwgMCwgMzUwIH0sCi17IDB4YzAsIDIxNiwgMCwgMzYzIH0sCi17IDB4MmMwLCAyMTYsIDAsIDM2MSB9LAoteyAweDFjMCwgMjE2LCAwLCAzNjIgfSwKLXsgMHgyMCwgMjE2LCAwLCAzNzggfSwKLXsgMHhhMCwgMjE2LCAwLCAzNzYgfSwKLXsgMHg2MCwgMjE2LCAwLCAzNzcgfSwKLXsgMHgxMCwgMjE2LCAwLCAzOTAgfSwKLXsgMHg1MCwgMjE2LCAwLCAzODggfSwKLXsgMHgzMCwgMjE2LCAwLCAzODkgfSwKLXsgMHg4LCAyMTYsIDAsIDQwMiB9LAoteyAweDI4LCAyMTYsIDAsIDQwMCB9LAoteyAweDE4LCAyMTYsIDAsIDQwMSB9LAoteyAweDQsIDIxNiwgMCwgNDEyIH0sCi17IDB4MiwgMjE2LCAwLCA0MTMgfSwKLXsgMHgxLCAyMTYsIDAsIDQxNCB9LAoteyAweDE0MCwgMjI4LCAwLCAzNTQgfSwKLXsgMHg1NDAsIDIyOCwgMCwgMzUyIH0sCi17IDB4MzQwLCAyMjgsIDAsIDM1MyB9LAoteyAweGMwLCAyMjgsIDAsIDM2NiB9LAoteyAweDJjMCwgMjI4LCAwLCAzNjQgfSwKLXsgMHgxYzAsIDIyOCwgMCwgMzY1IH0sCi17IDB4MjAsIDIyOCwgMCwgMzgxIH0sCi17IDB4YTAsIDIyOCwgMCwgMzc5IH0sCi17IDB4NjAsIDIyOCwgMCwgMzgwIH0sCi17IDB4MTAsIDIyOCwgMCwgMzkzIH0sCi17IDB4NTAsIDIyOCwgMCwgMzkxIH0sCi17IDB4MzAsIDIyOCwgMCwgMzkyIH0sCi17IDB4OCwgMjI4LCAwLCA0MDUgfSwKLXsgMHgyOCwgMjI4LCAwLCA0MDMgfSwKLXsgMHgxOCwgMjI4LCAwLCA0MDQgfSwKLXsgMHg0LCAyMjgsIDAsIDQxNSB9LAoteyAweDIsIDIyOCwgMCwgNDE2IH0sCi17IDB4MSwgMjI4LCAwLCA0MTcgfSwKLXsgMHgxLCAyMDksIDAsIDQ0NCB9LAoteyAweDUsIDIwOSwgMCwgNDQyIH0sCi17IDB4MywgMjA5LCAwLCA0NDMgfSwKLXsgMHgxNDAsIDIxOCwgMCwgNDIwIH0sCi17IDB4NTQwLCAyMTgsIDAsIDQxOCB9LAoteyAweDM0MCwgMjE4LCAwLCA0MTkgfSwKLXsgMHhjMCwgMjE4LCAwLCA0MzIgfSwKLXsgMHgyYzAsIDIxOCwgMCwgNDMwIH0sCi17IDB4MWMwLCAyMTgsIDAsIDQzMSB9LAoteyAweDIwLCAyMTgsIDAsIDQ0NyB9LAoteyAweGEwLCAyMTgsIDAsIDQ0NSB9LAoteyAweDYwLCAyMTgsIDAsIDQ0NiB9LAoteyAweDEwLCAyMTgsIDAsIDQ1OSB9LAoteyAweDUwLCAyMTgsIDAsIDQ1NyB9LAoteyAweDMwLCAyMTgsIDAsIDQ1OCB9LAoteyAweDgsIDIxOCwgMCwgNDcxIH0sCi17IDB4MjgsIDIxOCwgMCwgNDY5IH0sCi17IDB4MTgsIDIxOCwgMCwgNDcwIH0sCi17IDB4NCwgMjE4LCAwLCA0ODEgfSwKLXsgMHgyLCAyMTgsIDAsIDQ4MiB9LAoteyAweDEsIDIxOCwgMCwgNDgzIH0sCi17IDB4MTQwLCAyMTIsIDAsIDQyMyB9LAoteyAweDU0MCwgMjEyLCAwLCA0MjEgfSwKLXsgMHgzNDAsIDIxMiwgMCwgNDIyIH0sCi17IDB4YzAsIDIxMiwgMCwgNDM1IH0sCi17IDB4MmMwLCAyMTIsIDAsIDQzMyB9LAoteyAweDFjMCwgMjEyLCAwLCA0MzQgfSwKLXsgMHgyMCwgMjEyLCAwLCA0NTAgfSwKLXsgMHhhMCwgMjEyLCAwLCA0NDggfSwKLXsgMHg2MCwgMjEyLCAwLCA0NDkgfSwKLXsgMHgxMCwgMjEyLCAwLCA0NjIgfSwKLXsgMHg1MCwgMjEyLCAwLCA0NjAgfSwKLXsgMHgzMCwgMjEyLCAwLCA0NjEgfSwKLXsgMHg4LCAyMTIsIDAsIDQ3NCB9LAoteyAweDI4LCAyMTIsIDAsIDQ3MiB9LAoteyAweDE4LCAyMTIsIDAsIDQ3MyB9LAoteyAweDQsIDIxMiwgMCwgNDg0IH0sCi17IDB4MiwgMjEyLCAwLCA0ODUgfSwKLXsgMHgxLCAyMTIsIDAsIDQ4NiB9LAoteyAweDE0MCwgMjE1LCAwLCA0MjYgfSwKLXsgMHg1NDAsIDIxNSwgMCwgNDI0IH0sCi17IDB4MzQwLCAyMTUsIDAsIDQyNSB9LAoteyAweGMwLCAyMTUsIDAsIDQzOCB9LAoteyAweDJjMCwgMjE1LCAwLCA0MzYgfSwKLXsgMHgxYzAsIDIxNSwgMCwgNDM3IH0sCi17IDB4MjAsIDIxNSwgMCwgNDUzIH0sCi17IDB4YTAsIDIxNSwgMCwgNDUxIH0sCi17IDB4NjAsIDIxNSwgMCwgNDUyIH0sCi17IDB4MTAsIDIxNSwgMCwgNDY1IH0sCi17IDB4NTAsIDIxNSwgMCwgNDYzIH0sCi17IDB4MzAsIDIxNSwgMCwgNDY0IH0sCi17IDB4OCwgMjE1LCAwLCA0NzcgfSwKLXsgMHgyOCwgMjE1LCAwLCA0NzUgfSwKLXsgMHgxOCwgMjE1LCAwLCA0NzYgfSwKLXsgMHg0LCAyMTUsIDAsIDQ4NyB9LAoteyAweDIsIDIxNSwgMCwgNDg4IH0sCi17IDB4MSwgMjE1LCAwLCA0ODkgfSwKLXsgMHgxNDAsIDIyNywgMCwgNDI5IH0sCi17IDB4NTQwLCAyMjcsIDAsIDQyNyB9LAoteyAweDM0MCwgMjI3LCAwLCA0MjggfSwKLXsgMHhjMCwgMjI3LCAwLCA0NDEgfSwKLXsgMHgyYzAsIDIyNywgMCwgNDM5IH0sCi17IDB4MWMwLCAyMjcsIDAsIDQ0MCB9LAoteyAweDIwLCAyMjcsIDAsIDQ1NiB9LAoteyAweGEwLCAyMjcsIDAsIDQ1NCB9LAoteyAweDYwLCAyMjcsIDAsIDQ1NSB9LAoteyAweDEwLCAyMjcsIDAsIDQ2OCB9LAoteyAweDUwLCAyMjcsIDAsIDQ2NiB9LAoteyAweDMwLCAyMjcsIDAsIDQ2NyB9LAoteyAweDgsIDIyNywgMCwgNDgwIH0sCi17IDB4MjgsIDIyNywgMCwgNDc4IH0sCi17IDB4MTgsIDIyNywgMCwgNDc5IH0sCi17IDB4NCwgMjI3LCAwLCA0OTAgfSwKLXsgMHgyLCAyMjcsIDAsIDQ5MSB9LAoteyAweDEsIDIyNywgMCwgNDkyIH0sCi17IDB4OCwgMzUwLCAwLCA0OTQgfSwKLXsgMHgxOCwgMzUwLCAwLCA0OTMgfSwKLXsgMHg0LCAzNTAsIDAsIDQ5NiB9LAoteyAweGMsIDM1MCwgMCwgNDk1IH0sCi17IDB4MiwgMzUwLCAwLCA1MDMgfSwKLXsgMHgxLCAzNTAsIDAsIDUwNCB9LAoteyAweDQsIDM0OCwgMCwgNDk4IH0sCi17IDB4YywgMzQ4LCAwLCA0OTcgfSwKLXsgMHgyLCAzNDgsIDAsIDUwNSB9LAoteyAweDEsIDM0OCwgMCwgNTA2IH0sCi17IDB4NCwgMzQ2LCAwLCA1MDAgfSwKLXsgMHhjLCAzNDYsIDAsIDQ5OSB9LAoteyAweDIsIDM0NiwgMCwgNTA3IH0sCi17IDB4MSwgMzQ2LCAwLCA1MDggfSwKLXsgMHg0LCAzNDQsIDAsIDUwMiB9LAoteyAweGMsIDM0NCwgMCwgNTAxIH0sCi17IDB4MiwgMzQ0LCAwLCA1MDkgfSwKLXsgMHgxLCAzNDQsIDAsIDUxMCB9LAoteyAweGEwMCwgMjA4LCAwLCA1MjUgfSwKLXsgMHgyYTAwLCAyMDgsIDAsIDUyMyB9LAoteyAweDFhMDAsIDIwOCwgMCwgNTI0IH0sCi17IDB4NjAwLCAyMDgsIDAsIDUzNyB9LAoteyAweDI2MDAsIDIwOCwgMCwgNTEzIH0sCi17IDB4YTYwMCwgMjA4LCAwLCA1MTEgfSwKLXsgMHg2NjAwLCAyMDgsIDAsIDUxMiB9LAoteyAweDE2MDAsIDIwOCwgMCwgNTM1IH0sCi17IDB4ZTAwLCAyMDgsIDAsIDUzNiB9LAoteyAweDEwMCwgMjA4LCAwLCA1NDkgfSwKLXsgMHg1MDAsIDIwOCwgMCwgNTQ3IH0sCi17IDB4MzAwLCAyMDgsIDAsIDU0OCB9LAoteyAweDgwLCAyMDgsIDAsIDU1MiB9LAoteyAweDI4MCwgMjA4LCAwLCA1NTAgfSwKLXsgMHgxODAsIDIwOCwgMCwgNTUxIH0sCi17IDB4NDAsIDIwOCwgMCwgNTY0IH0sCi17IDB4MTQwLCAyMDgsIDAsIDU2MiB9LAoteyAweGMwLCAyMDgsIDAsIDU2MyB9LAoteyAweDIwLCAyMDgsIDAsIDU3NiB9LAoteyAweGEwLCAyMDgsIDAsIDU3NCB9LAoteyAweDYwLCAyMDgsIDAsIDU3NSB9LAoteyAweDEwLCAyMDgsIDAsIDU4OCB9LAoteyAweDUwLCAyMDgsIDAsIDU4NiB9LAoteyAweDMwLCAyMDgsIDAsIDU4NyB9LAoteyAweDgsIDIwOCwgMCwgNjAwIH0sCi17IDB4MjgsIDIwOCwgMCwgNTk4IH0sCi17IDB4MTgsIDIwOCwgMCwgNTk5IH0sCi17IDB4NCwgMjA4LCAwLCA2MTAgfSwKLXsgMHgyLCAyMDgsIDAsIDYxMSB9LAoteyAweDEsIDIwOCwgMCwgNjEyIH0sCi17IDB4NTAwLCAyMDUsIDAsIDUyOCB9LAoteyAweDE1MDAsIDIwNSwgMCwgNTI2IH0sCi17IDB4ZDAwLCAyMDUsIDAsIDUyNyB9LAoteyAweDMwMCwgMjA1LCAwLCA1NDAgfSwKLXsgMHgxMzAwLCAyMDUsIDAsIDUxNiB9LAoteyAweDUzMDAsIDIwNSwgMCwgNTE0IH0sCi17IDB4MzMwMCwgMjA1LCAwLCA1MTUgfSwKLXsgMHhiMDAsIDIwNSwgMCwgNTM4IH0sCi17IDB4NzAwLCAyMDUsIDAsIDUzOSB9LAoteyAweDgwLCAyMDUsIDAsIDU1NSB9LAoteyAweDI4MCwgMjA1LCAwLCA1NTMgfSwKLXsgMHgxODAsIDIwNSwgMCwgNTU0IH0sCi17IDB4NDAsIDIwNSwgMCwgNTY3IH0sCi17IDB4MTQwLCAyMDUsIDAsIDU2NSB9LAoteyAweGMwLCAyMDUsIDAsIDU2NiB9LAoteyAweDIwLCAyMDUsIDAsIDU3OSB9LAoteyAweGEwLCAyMDUsIDAsIDU3NyB9LAoteyAweDYwLCAyMDUsIDAsIDU3OCB9LAoteyAweDEwLCAyMDUsIDAsIDU5MSB9LAoteyAweDUwLCAyMDUsIDAsIDU4OSB9LAoteyAweDMwLCAyMDUsIDAsIDU5MCB9LAoteyAweDgsIDIwNSwgMCwgNjAzIH0sCi17IDB4MjgsIDIwNSwgMCwgNjAxIH0sCi17IDB4MTgsIDIwNSwgMCwgNjAyIH0sCi17IDB4NCwgMjA1LCAwLCA2MTMgfSwKLXsgMHgyLCAyMDUsIDAsIDYxNCB9LAoteyAweDEsIDIwNSwgMCwgNjE1IH0sCi17IDB4NTAwLCAyMDIsIDAsIDUzMSB9LAoteyAweDE1MDAsIDIwMiwgMCwgNTI5IH0sCi17IDB4ZDAwLCAyMDIsIDAsIDUzMCB9LAoteyAweDMwMCwgMjAyLCAwLCA1NDMgfSwKLXsgMHgxMzAwLCAyMDIsIDAsIDUxOSB9LAoteyAweDUzMDAsIDIwMiwgMCwgNTE3IH0sCi17IDB4MzMwMCwgMjAyLCAwLCA1MTggfSwKLXsgMHhiMDAsIDIwMiwgMCwgNTQxIH0sCi17IDB4NzAwLCAyMDIsIDAsIDU0MiB9LAoteyAweDgwLCAyMDIsIDAsIDU1OCB9LAoteyAweDI4MCwgMjAyLCAwLCA1NTYgfSwKLXsgMHgxODAsIDIwMiwgMCwgNTU3IH0sCi17IDB4NDAsIDIwMiwgMCwgNTcwIH0sCi17IDB4MTQwLCAyMDIsIDAsIDU2OCB9LAoteyAweGMwLCAyMDIsIDAsIDU2OSB9LAoteyAweDIwLCAyMDIsIDAsIDU4MiB9LAoteyAweGEwLCAyMDIsIDAsIDU4MCB9LAoteyAweDYwLCAyMDIsIDAsIDU4MSB9LAoteyAweDEwLCAyMDIsIDAsIDU5NCB9LAoteyAweDUwLCAyMDIsIDAsIDU5MiB9LAoteyAweDMwLCAyMDIsIDAsIDU5MyB9LAoteyAweDgsIDIwMiwgMCwgNjA2IH0sCi17IDB4MjgsIDIwMiwgMCwgNjA0IH0sCi17IDB4MTgsIDIwMiwgMCwgNjA1IH0sCi17IDB4NCwgMjAyLCAwLCA2MTYgfSwKLXsgMHgyLCAyMDIsIDAsIDYxNyB9LAoteyAweDEsIDIwMiwgMCwgNjE4IH0sCi17IDB4NTAwLCAxOTksIDAsIDUzNCB9LAoteyAweDE1MDAsIDE5OSwgMCwgNTMyIH0sCi17IDB4ZDAwLCAxOTksIDAsIDUzMyB9LAoteyAweDMwMCwgMTk5LCAwLCA1NDYgfSwKLXsgMHgxMzAwLCAxOTksIDAsIDUyMiB9LAoteyAweDUzMDAsIDE5OSwgMCwgNTIwIH0sCi17IDB4MzMwMCwgMTk5LCAwLCA1MjEgfSwKLXsgMHhiMDAsIDE5OSwgMCwgNTQ0IH0sCi17IDB4NzAwLCAxOTksIDAsIDU0NSB9LAoteyAweDgwLCAxOTksIDAsIDU2MSB9LAoteyAweDI4MCwgMTk5LCAwLCA1NTkgfSwKLXsgMHgxODAsIDE5OSwgMCwgNTYwIH0sCi17IDB4NDAsIDE5OSwgMCwgNTczIH0sCi17IDB4MTQwLCAxOTksIDAsIDU3MSB9LAoteyAweGMwLCAxOTksIDAsIDU3MiB9LAoteyAweDIwLCAxOTksIDAsIDU4NSB9LAoteyAweGEwLCAxOTksIDAsIDU4MyB9LAoteyAweDYwLCAxOTksIDAsIDU4NCB9LAoteyAweDEwLCAxOTksIDAsIDU5NyB9LAoteyAweDUwLCAxOTksIDAsIDU5NSB9LAoteyAweDMwLCAxOTksIDAsIDU5NiB9LAoteyAweDgsIDE5OSwgMCwgNjA5IH0sCi17IDB4MjgsIDE5OSwgMCwgNjA3IH0sCi17IDB4MTgsIDE5OSwgMCwgNjA4IH0sCi17IDB4NCwgMTk5LCAwLCA2MTkgfSwKLXsgMHgyLCAxOTksIDAsIDYyMCB9LAoteyAweDEsIDE5OSwgMCwgNjIxIH0sCi17IDB4OCwgMTkwLCAwLCA2MjIgfSwKLXsgMHg0LCAxOTAsIDAsIDYyMyB9LAoteyAweDIsIDE5MCwgMCwgNjI0IH0sCi17IDB4MSwgMTkwLCAwLCA2MjUgfSwKLXsgMHgyLCAxMjgsIDAsIDYyOCB9LAoteyAweGEsIDEyOCwgMCwgNjI2IH0sCi17IDB4NiwgMTI4LCAwLCA2MjcgfSwKLXsgMHgxLCAxMjgsIDAsIDYzNCB9LAoteyAweDUsIDEyOCwgMCwgNjMyIH0sCi17IDB4MywgMTI4LCAwLCA2MzMgfSwKLXsgMHgyLCAxMjcsIDAsIDYzMSB9LAoteyAweGEsIDEyNywgMCwgNjI5IH0sCi17IDB4NiwgMTI3LCAwLCA2MzAgfSwKLXsgMHgxLCAxMjcsIDAsIDYzNyB9LAoteyAweDUsIDEyNywgMCwgNjM1IH0sCi17IDB4MywgMTI3LCAwLCA2MzYgfSwKLXsgMHg0LCAzODMsIDAsIDYzOCB9LAoteyAweDIsIDM4MywgMCwgNjM5IH0sCi17IDB4MSwgMzgzLCAwLCA2NDAgfSwKLXsgMHg0LCAzODIsIDAsIDY0MSB9LAoteyAweDIsIDM4MiwgMCwgNjQyIH0sCi17IDB4MSwgMzgyLCAwLCA2NDMgfSwKLXsgMHg0LCAzODEsIDAsIDY0NCB9LAoteyAweDIsIDM4MSwgMCwgNjQ1IH0sCi17IDB4MSwgMzgxLCAwLCA2NDYgfSwKLXsgMHg0LCAzODAsIDAsIDY0NyB9LAoteyAweDIsIDM4MCwgMCwgNjQ4IH0sCi17IDB4MSwgMzgwLCAwLCA2NDkgfSwKLXsgMHgyLCA5MCwgMCwgNjUyIH0sCi17IDB4YSwgOTAsIDAsIDY1MCB9LAoteyAweDYsIDkwLCAwLCA2NTEgfSwKLXsgMHgxLCA5MCwgMCwgNjY0IH0sCi17IDB4NSwgOTAsIDAsIDY2MiB9LAoteyAweDMsIDkwLCAwLCA2NjMgfSwKLXsgMHgyLCA4OSwgMCwgNjU1IH0sCi17IDB4YSwgODksIDAsIDY1MyB9LAoteyAweDYsIDg5LCAwLCA2NTQgfSwKLXsgMHgxLCA4OSwgMCwgNjY3IH0sCi17IDB4NSwgODksIDAsIDY2NSB9LAoteyAweDMsIDg5LCAwLCA2NjYgfSwKLXsgMHgyLCA4OCwgMCwgNjU4IH0sCi17IDB4YSwgODgsIDAsIDY1NiB9LAoteyAweDYsIDg4LCAwLCA2NTcgfSwKLXsgMHgxLCA4OCwgMCwgNjcwIH0sCi17IDB4NSwgODgsIDAsIDY2OCB9LAoteyAweDMsIDg4LCAwLCA2NjkgfSwKLXsgMHgyLCA4NywgMCwgNjYxIH0sCi17IDB4YSwgODcsIDAsIDY1OSB9LAoteyAweDYsIDg3LCAwLCA2NjAgfSwKLXsgMHgxLCA4NywgMCwgNjczIH0sCi17IDB4NSwgODcsIDAsIDY3MSB9LAoteyAweDMsIDg3LCAwLCA2NzIgfSwKLXsgMHg4LCAzNDksIDAsIDY3NSB9LAoteyAweDE4LCAzNDksIDAsIDY3NCB9LAoteyAweDQsIDM0OSwgMCwgNjc3IH0sCi17IDB4YywgMzQ5LCAwLCA2NzYgfSwKLXsgMHgyLCAzNDksIDAsIDY4NCB9LAoteyAweDEsIDM0OSwgMCwgNjg1IH0sCi17IDB4NCwgMzQ3LCAwLCA2NzkgfSwKLXsgMHhjLCAzNDcsIDAsIDY3OCB9LAoteyAweDIsIDM0NywgMCwgNjg2IH0sCi17IDB4MSwgMzQ3LCAwLCA2ODcgfSwKLXsgMHg0LCAzNDUsIDAsIDY4MSB9LAoteyAweGMsIDM0NSwgMCwgNjgwIH0sCi17IDB4MiwgMzQ1LCAwLCA2ODggfSwKLXsgMHgxLCAzNDUsIDAsIDY4OSB9LAoteyAweDQsIDM0MywgMCwgNjgzIH0sCi17IDB4YywgMzQzLCAwLCA2ODIgfSwKLXsgMHgyLCAzNDMsIDAsIDY5MCB9LAoteyAweDEsIDM0MywgMCwgNjkxIH0sCi17IDB4YTAwLCAyMDcsIDAsIDcwNiB9LAoteyAweDJhMDAsIDIwNywgMCwgNzA0IH0sCi17IDB4MWEwMCwgMjA3LCAwLCA3MDUgfSwKLXsgMHg2MDAsIDIwNywgMCwgNzE4IH0sCi17IDB4MjYwMCwgMjA3LCAwLCA2OTQgfSwKLXsgMHhhNjAwLCAyMDcsIDAsIDY5MiB9LAoteyAweDY2MDAsIDIwNywgMCwgNjkzIH0sCi17IDB4MTYwMCwgMjA3LCAwLCA3MTYgfSwKLXsgMHhlMDAsIDIwNywgMCwgNzE3IH0sCi17IDB4MTAwLCAyMDcsIDAsIDczMCB9LAoteyAweDUwMCwgMjA3LCAwLCA3MjggfSwKLXsgMHgzMDAsIDIwNywgMCwgNzI5IH0sCi17IDB4ODAsIDIwNywgMCwgNzMzIH0sCi17IDB4MjgwLCAyMDcsIDAsIDczMSB9LAoteyAweDE4MCwgMjA3LCAwLCA3MzIgfSwKLXsgMHg0MCwgMjA3LCAwLCA3NDUgfSwKLXsgMHgxNDAsIDIwNywgMCwgNzQzIH0sCi17IDB4YzAsIDIwNywgMCwgNzQ0IH0sCi17IDB4MjAsIDIwNywgMCwgNzU3IH0sCi17IDB4YTAsIDIwNywgMCwgNzU1IH0sCi17IDB4NjAsIDIwNywgMCwgNzU2IH0sCi17IDB4MTAsIDIwNywgMCwgNzY5IH0sCi17IDB4NTAsIDIwNywgMCwgNzY3IH0sCi17IDB4MzAsIDIwNywgMCwgNzY4IH0sCi17IDB4OCwgMjA3LCAwLCA3ODEgfSwKLXsgMHgyOCwgMjA3LCAwLCA3NzkgfSwKLXsgMHgxOCwgMjA3LCAwLCA3ODAgfSwKLXsgMHg0LCAyMDcsIDAsIDc5MSB9LAoteyAweDIsIDIwNywgMCwgNzkyIH0sCi17IDB4MSwgMjA3LCAwLCA3OTMgfSwKLXsgMHg1MDAsIDIwNCwgMCwgNzA5IH0sCi17IDB4MTUwMCwgMjA0LCAwLCA3MDcgfSwKLXsgMHhkMDAsIDIwNCwgMCwgNzA4IH0sCi17IDB4MzAwLCAyMDQsIDAsIDcyMSB9LAoteyAweDEzMDAsIDIwNCwgMCwgNjk3IH0sCi17IDB4NTMwMCwgMjA0LCAwLCA2OTUgfSwKLXsgMHgzMzAwLCAyMDQsIDAsIDY5NiB9LAoteyAweGIwMCwgMjA0LCAwLCA3MTkgfSwKLXsgMHg3MDAsIDIwNCwgMCwgNzIwIH0sCi17IDB4ODAsIDIwNCwgMCwgNzM2IH0sCi17IDB4MjgwLCAyMDQsIDAsIDczNCB9LAoteyAweDE4MCwgMjA0LCAwLCA3MzUgfSwKLXsgMHg0MCwgMjA0LCAwLCA3NDggfSwKLXsgMHgxNDAsIDIwNCwgMCwgNzQ2IH0sCi17IDB4YzAsIDIwNCwgMCwgNzQ3IH0sCi17IDB4MjAsIDIwNCwgMCwgNzYwIH0sCi17IDB4YTAsIDIwNCwgMCwgNzU4IH0sCi17IDB4NjAsIDIwNCwgMCwgNzU5IH0sCi17IDB4MTAsIDIwNCwgMCwgNzcyIH0sCi17IDB4NTAsIDIwNCwgMCwgNzcwIH0sCi17IDB4MzAsIDIwNCwgMCwgNzcxIH0sCi17IDB4OCwgMjA0LCAwLCA3ODQgfSwKLXsgMHgyOCwgMjA0LCAwLCA3ODIgfSwKLXsgMHgxOCwgMjA0LCAwLCA3ODMgfSwKLXsgMHg0LCAyMDQsIDAsIDc5NCB9LAoteyAweDIsIDIwNCwgMCwgNzk1IH0sCi17IDB4MSwgMjA0LCAwLCA3OTYgfSwKLXsgMHg1MDAsIDIwMSwgMCwgNzEyIH0sCi17IDB4MTUwMCwgMjAxLCAwLCA3MTAgfSwKLXsgMHhkMDAsIDIwMSwgMCwgNzExIH0sCi17IDB4MzAwLCAyMDEsIDAsIDcyNCB9LAoteyAweDEzMDAsIDIwMSwgMCwgNzAwIH0sCi17IDB4NTMwMCwgMjAxLCAwLCA2OTggfSwKLXsgMHgzMzAwLCAyMDEsIDAsIDY5OSB9LAoteyAweGIwMCwgMjAxLCAwLCA3MjIgfSwKLXsgMHg3MDAsIDIwMSwgMCwgNzIzIH0sCi17IDB4ODAsIDIwMSwgMCwgNzM5IH0sCi17IDB4MjgwLCAyMDEsIDAsIDczNyB9LAoteyAweDE4MCwgMjAxLCAwLCA3MzggfSwKLXsgMHg0MCwgMjAxLCAwLCA3NTEgfSwKLXsgMHgxNDAsIDIwMSwgMCwgNzQ5IH0sCi17IDB4YzAsIDIwMSwgMCwgNzUwIH0sCi17IDB4MjAsIDIwMSwgMCwgNzYzIH0sCi17IDB4YTAsIDIwMSwgMCwgNzYxIH0sCi17IDB4NjAsIDIwMSwgMCwgNzYyIH0sCi17IDB4MTAsIDIwMSwgMCwgNzc1IH0sCi17IDB4NTAsIDIwMSwgMCwgNzczIH0sCi17IDB4MzAsIDIwMSwgMCwgNzc0IH0sCi17IDB4OCwgMjAxLCAwLCA3ODcgfSwKLXsgMHgyOCwgMjAxLCAwLCA3ODUgfSwKLXsgMHgxOCwgMjAxLCAwLCA3ODYgfSwKLXsgMHg0LCAyMDEsIDAsIDc5NyB9LAoteyAweDIsIDIwMSwgMCwgNzk4IH0sCi17IDB4MSwgMjAxLCAwLCA3OTkgfSwKLXsgMHg1MDAsIDE5OCwgMCwgNzE1IH0sCi17IDB4MTUwMCwgMTk4LCAwLCA3MTMgfSwKLXsgMHhkMDAsIDE5OCwgMCwgNzE0IH0sCi17IDB4MzAwLCAxOTgsIDAsIDcyNyB9LAoteyAweDEzMDAsIDE5OCwgMCwgNzAzIH0sCi17IDB4NTMwMCwgMTk4LCAwLCA3MDEgfSwKLXsgMHgzMzAwLCAxOTgsIDAsIDcwMiB9LAoteyAweGIwMCwgMTk4LCAwLCA3MjUgfSwKLXsgMHg3MDAsIDE5OCwgMCwgNzI2IH0sCi17IDB4ODAsIDE5OCwgMCwgNzQyIH0sCi17IDB4MjgwLCAxOTgsIDAsIDc0MCB9LAoteyAweDE4MCwgMTk4LCAwLCA3NDEgfSwKLXsgMHg0MCwgMTk4LCAwLCA3NTQgfSwKLXsgMHgxNDAsIDE5OCwgMCwgNzUyIH0sCi17IDB4YzAsIDE5OCwgMCwgNzUzIH0sCi17IDB4MjAsIDE5OCwgMCwgNzY2IH0sCi17IDB4YTAsIDE5OCwgMCwgNzY0IH0sCi17IDB4NjAsIDE5OCwgMCwgNzY1IH0sCi17IDB4MTAsIDE5OCwgMCwgNzc4IH0sCi17IDB4NTAsIDE5OCwgMCwgNzc2IH0sCi17IDB4MzAsIDE5OCwgMCwgNzc3IH0sCi17IDB4OCwgMTk4LCAwLCA3OTAgfSwKLXsgMHgyOCwgMTk4LCAwLCA3ODggfSwKLXsgMHgxOCwgMTk4LCAwLCA3ODkgfSwKLXsgMHg0LCAxOTgsIDAsIDgwMCB9LAoteyAweDIsIDE5OCwgMCwgODAxIH0sCi17IDB4MSwgMTk4LCAwLCA4MDIgfSwKLXsgMHhhMDAsIDIwNiwgMCwgODE3IH0sCi17IDB4MmEwMCwgMjA2LCAwLCA4MTUgfSwKLXsgMHgxYTAwLCAyMDYsIDAsIDgxNiB9LAoteyAweDYwMCwgMjA2LCAwLCA4MjkgfSwKLXsgMHgyNjAwLCAyMDYsIDAsIDgwNSB9LAoteyAweGE2MDAsIDIwNiwgMCwgODAzIH0sCi17IDB4NjYwMCwgMjA2LCAwLCA4MDQgfSwKLXsgMHgxNjAwLCAyMDYsIDAsIDgyNyB9LAoteyAweGUwMCwgMjA2LCAwLCA4MjggfSwKLXsgMHgxMDAsIDIwNiwgMCwgODQxIH0sCi17IDB4NTAwLCAyMDYsIDAsIDgzOSB9LAoteyAweDMwMCwgMjA2LCAwLCA4NDAgfSwKLXsgMHg4MCwgMjA2LCAwLCA4NDQgfSwKLXsgMHgyODAsIDIwNiwgMCwgODQyIH0sCi17IDB4MTgwLCAyMDYsIDAsIDg0MyB9LAoteyAweDQwLCAyMDYsIDAsIDg1NiB9LAoteyAweDE0MCwgMjA2LCAwLCA4NTQgfSwKLXsgMHhjMCwgMjA2LCAwLCA4NTUgfSwKLXsgMHgyMCwgMjA2LCAwLCA4NjggfSwKLXsgMHhhMCwgMjA2LCAwLCA4NjYgfSwKLXsgMHg2MCwgMjA2LCAwLCA4NjcgfSwKLXsgMHgxMCwgMjA2LCAwLCA4ODAgfSwKLXsgMHg1MCwgMjA2LCAwLCA4NzggfSwKLXsgMHgzMCwgMjA2LCAwLCA4NzkgfSwKLXsgMHg4LCAyMDYsIDAsIDg5MiB9LAoteyAweDI4LCAyMDYsIDAsIDg5MCB9LAoteyAweDE4LCAyMDYsIDAsIDg5MSB9LAoteyAweDQsIDIwNiwgMCwgOTAyIH0sCi17IDB4MiwgMjA2LCAwLCA5MDMgfSwKLXsgMHgxLCAyMDYsIDAsIDkwNCB9LAoteyAweDUwMCwgMjAzLCAwLCA4MjAgfSwKLXsgMHgxNTAwLCAyMDMsIDAsIDgxOCB9LAoteyAweGQwMCwgMjAzLCAwLCA4MTkgfSwKLXsgMHgzMDAsIDIwMywgMCwgODMyIH0sCi17IDB4MTMwMCwgMjAzLCAwLCA4MDggfSwKLXsgMHg1MzAwLCAyMDMsIDAsIDgwNiB9LAoteyAweDMzMDAsIDIwMywgMCwgODA3IH0sCi17IDB4YjAwLCAyMDMsIDAsIDgzMCB9LAoteyAweDcwMCwgMjAzLCAwLCA4MzEgfSwKLXsgMHg4MCwgMjAzLCAwLCA4NDcgfSwKLXsgMHgyODAsIDIwMywgMCwgODQ1IH0sCi17IDB4MTgwLCAyMDMsIDAsIDg0NiB9LAoteyAweDQwLCAyMDMsIDAsIDg1OSB9LAoteyAweDE0MCwgMjAzLCAwLCA4NTcgfSwKLXsgMHhjMCwgMjAzLCAwLCA4NTggfSwKLXsgMHgyMCwgMjAzLCAwLCA4NzEgfSwKLXsgMHhhMCwgMjAzLCAwLCA4NjkgfSwKLXsgMHg2MCwgMjAzLCAwLCA4NzAgfSwKLXsgMHgxMCwgMjAzLCAwLCA4ODMgfSwKLXsgMHg1MCwgMjAzLCAwLCA4ODEgfSwKLXsgMHgzMCwgMjAzLCAwLCA4ODIgfSwKLXsgMHg4LCAyMDMsIDAsIDg5NSB9LAoteyAweDI4LCAyMDMsIDAsIDg5MyB9LAoteyAweDE4LCAyMDMsIDAsIDg5NCB9LAoteyAweDQsIDIwMywgMCwgOTA1IH0sCi17IDB4MiwgMjAzLCAwLCA5MDYgfSwKLXsgMHgxLCAyMDMsIDAsIDkwNyB9LAoteyAweDUwMCwgMjAwLCAwLCA4MjMgfSwKLXsgMHgxNTAwLCAyMDAsIDAsIDgyMSB9LAoteyAweGQwMCwgMjAwLCAwLCA4MjIgfSwKLXsgMHgzMDAsIDIwMCwgMCwgODM1IH0sCi17IDB4MTMwMCwgMjAwLCAwLCA4MTEgfSwKLXsgMHg1MzAwLCAyMDAsIDAsIDgwOSB9LAoteyAweDMzMDAsIDIwMCwgMCwgODEwIH0sCi17IDB4YjAwLCAyMDAsIDAsIDgzMyB9LAoteyAweDcwMCwgMjAwLCAwLCA4MzQgfSwKLXsgMHg4MCwgMjAwLCAwLCA4NTAgfSwKLXsgMHgyODAsIDIwMCwgMCwgODQ4IH0sCi17IDB4MTgwLCAyMDAsIDAsIDg0OSB9LAoteyAweDQwLCAyMDAsIDAsIDg2MiB9LAoteyAweDE0MCwgMjAwLCAwLCA4NjAgfSwKLXsgMHhjMCwgMjAwLCAwLCA4NjEgfSwKLXsgMHgyMCwgMjAwLCAwLCA4NzQgfSwKLXsgMHhhMCwgMjAwLCAwLCA4NzIgfSwKLXsgMHg2MCwgMjAwLCAwLCA4NzMgfSwKLXsgMHgxMCwgMjAwLCAwLCA4ODYgfSwKLXsgMHg1MCwgMjAwLCAwLCA4ODQgfSwKLXsgMHgzMCwgMjAwLCAwLCA4ODUgfSwKLXsgMHg4LCAyMDAsIDAsIDg5OCB9LAoteyAweDI4LCAyMDAsIDAsIDg5NiB9LAoteyAweDE4LCAyMDAsIDAsIDg5NyB9LAoteyAweDQsIDIwMCwgMCwgOTA4IH0sCi17IDB4MiwgMjAwLCAwLCA5MDkgfSwKLXsgMHgxLCAyMDAsIDAsIDkxMCB9LAoteyAweDUwMCwgMTk3LCAwLCA4MjYgfSwKLXsgMHgxNTAwLCAxOTcsIDAsIDgyNCB9LAoteyAweGQwMCwgMTk3LCAwLCA4MjUgfSwKLXsgMHgzMDAsIDE5NywgMCwgODM4IH0sCi17IDB4MTMwMCwgMTk3LCAwLCA4MTQgfSwKLXsgMHg1MzAwLCAxOTcsIDAsIDgxMiB9LAoteyAweDMzMDAsIDE5NywgMCwgODEzIH0sCi17IDB4YjAwLCAxOTcsIDAsIDgzNiB9LAoteyAweDcwMCwgMTk3LCAwLCA4MzcgfSwKLXsgMHg4MCwgMTk3LCAwLCA4NTMgfSwKLXsgMHgyODAsIDE5NywgMCwgODUxIH0sCi17IDB4MTgwLCAxOTcsIDAsIDg1MiB9LAoteyAweDQwLCAxOTcsIDAsIDg2NSB9LAoteyAweDE0MCwgMTk3LCAwLCA4NjMgfSwKLXsgMHhjMCwgMTk3LCAwLCA4NjQgfSwKLXsgMHgyMCwgMTk3LCAwLCA4NzcgfSwKLXsgMHhhMCwgMTk3LCAwLCA4NzUgfSwKLXsgMHg2MCwgMTk3LCAwLCA4NzYgfSwKLXsgMHgxMCwgMTk3LCAwLCA4ODkgfSwKLXsgMHg1MCwgMTk3LCAwLCA4ODcgfSwKLXsgMHgzMCwgMTk3LCAwLCA4ODggfSwKLXsgMHg4LCAxOTcsIDAsIDkwMSB9LAoteyAweDI4LCAxOTcsIDAsIDg5OSB9LAoteyAweDE4LCAxOTcsIDAsIDkwMCB9LAoteyAweDQsIDE5NywgMCwgOTExIH0sCi17IDB4MiwgMTk3LCAwLCA5MTIgfSwKLXsgMHgxLCAxOTcsIDAsIDkxMyB9LAoteyAweDEsIDQ4LCAwLCA5MTYgfSwKLXsgMHgzLCA0NywgMCwgOTE3IH0sCi17IDB4MSwgMzY5LCAwLCA5MTggfSwKLXsgMHgxLCAzNzUsIDAsIDkxOSB9LAoteyAweDIsIDMyOSwgMCwgOTIyIH0sCi17IDB4MSwgMzI5LCAwLCA5MjMgfSwKLXsgMHgyLCAzMjcsIDAsIDkyNCB9LAoteyAweDEsIDMyNywgMCwgOTI1IH0sCi17IDB4MSwgMzI2LCAwLCA5MjYgfSwKLXsgMHgxLCAyNzEsIDAsIDkzMSB9LAoteyAweDEsIDI3MCwgMCwgOTMyIH0sCi17IDB4MSwgMjY5LCAwLCA5MzMgfSwKLXsgMHgxLCAyNjgsIDAsIDkzNCB9LAoteyAweDEsIDE5NiwgMCwgOTM1IH0sCi17IDB4MSwgMTk1LCAwLCA5MzYgfSwKLXsgMHgxLCAyNjcsIDAsIDkzNyB9LAoteyAweDEsIDI2NiwgMCwgOTM4IH0sCi17IDB4MSwgMjY1LCAwLCA5MzkgfSwKLXsgMHgxLCAyNjQsIDAsIDk0MCB9LAoteyAweDEsIDI2MywgMCwgOTQxIH0sCi17IDB4MSwgMjYyLCAwLCA5NDIgfSwKLXsgMHgxLCAyNjEsIDAsIDk0MyB9LAoteyAweDIsIDE5NCwgMCwgOTQ0IH0sCi17IDB4MSwgMTk0LCAwLCA5NDUgfSwKLXsgMHgyLCAzMDksIDAsIDk1MSB9LAoteyAweDEsIDMwOSwgMCwgOTUyIH0sCi17IDB4MSwgMjYwLCAwLCA5NTMgfSwKLXsgMHgxLCAyNTksIDAsIDk1NCB9LAoteyAweDEsIDI1OCwgMCwgOTU1IH0sCi17IDB4MSwgMjU3LCAwLCA5NTYgfSwKLXsgMHgxLCA3LCAwLCA5NTcgfSwKLXsgMHgxLCAyNTYsIDAsIDk1OCB9LAoteyAweDEsIDI1NSwgMCwgOTU5IH0sCi17IDB4MSwgMjU0LCAwLCA5NjAgfSwKLXsgMHgxLCAyNTMsIDAsIDk2MSB9LAoteyAweDEsIDMzMSwgMCwgOTYyIH0sCi17IDB4MSwgMzQyLCAwLCA5NjMgfSwKLXsgMHgxLCAzMzIsIDAsIDk2NCB9LAoteyAweDEsIDM2NCwgMCwgOTY1IH0sCi17IDB4MSwgMjUyLCAwLCA5NjggfSwKLXsgMHgxLCAxOTMsIDAsIDk2OSB9LAoteyAweDEsIDEyOSwgMCwgOTcyIH0sCi17IDB4MiwgMjM0LCAwLCA5NzYgfSwKLXsgMHgxLCAyMzQsIDAsIDk3NyB9LAoteyAweDEsIDE4OCwgMCwgOTc4IH0sCi17IDB4NSwgNDYsIDAsIDk4MCB9LAoteyAweDMsIDQ2LCAwLCA5ODEgfSwKLXsgMHg1LCA0NSwgMCwgOTgyIH0sCi17IDB4MywgNDUsIDAsIDk4MyB9LAoteyAweDEsIDMwOCwgMCwgOTg0IH0sCi17IDB4MSwgMzE2LCAwLCA5ODUgfSwKLXsgMHgxLCAzMTQsIDAsIDk4NiB9LAoteyAweDEsIDMzNSwgMCwgOTg3IH0sCi17IDB4MSwgMzE1LCAwLCA5ODggfSwKLXsgMHgxLCAzMTMsIDAsIDk4OSB9LAoteyAweDIsIDMyMSwgMCwgOTkwIH0sCi17IDB4MSwgMzIxLCAwLCA5OTIgfSwKLXsgMHgyLCAzMTksIDAsIDk5MSB9LAoteyAweDEsIDMxOSwgMCwgOTkzIH0sCi17IDB4MiwgMzM5LCAwLCA5OTQgfSwKLXsgMHgxLCAzMzksIDAsIDk5NyB9LAoteyAweDIsIDMyMCwgMCwgOTk1IH0sCi17IDB4MSwgMzIwLCAwLCA5OTggfSwKLXsgMHgyLCAzMTgsIDAsIDk5NiB9LAoteyAweDEsIDMxOCwgMCwgOTk5IH0sCi17IDB4MSwgMjgxLCAwLCAxMDAwIH0sCi17IDB4MSwgMjgwLCAwLCAxMDAxIH0sCi17IDB4MSwgMzEyLCAwLCAxMDAyIH0sCi17IDB4MSwgMzAzLCAwLCAxMDAzIH0sCi17IDB4MSwgMzA1LCAwLCAxMDA0IH0sCi17IDB4MSwgMzAyLCAwLCAxMDA1IH0sCi17IDB4MSwgMzA0LCAwLCAxMDA2IH0sCi17IDB4MiwgMzc5LCAwLCAxMDA3IH0sCi17IDB4MSwgMzc5LCAwLCAxMDEwIH0sCi17IDB4MiwgMzc4LCAwLCAxMDA4IH0sCi17IDB4MSwgMzc4LCAwLCAxMDExIH0sCi17IDB4MiwgMzc3LCAwLCAxMDA5IH0sCi17IDB4MSwgMzc3LCAwLCAxMDEyIH0sCi17IDB4MSwgMjkxLCAwLCAxMDEzIH0sCi17IDB4MiwgMjkwLCAwLCAxMDE0IH0sCi17IDB4MSwgMjkwLCAwLCAxMDE1IH0sCi17IDB4MiwgMjM3LCAwLCAxMDE2IH0sCi17IDB4MSwgMjM3LCAwLCAxMDE5IH0sCi17IDB4MiwgMjM2LCAwLCAxMDE3IH0sCi17IDB4MSwgMjM2LCAwLCAxMDIwIH0sCi17IDB4MiwgMjM1LCAwLCAxMDE4IH0sCi17IDB4MSwgMjM1LCAwLCAxMDIxIH0sCi17IDB4MiwgMzA2LCAwLCAxMDIyIH0sCi17IDB4MSwgMzA2LCAwLCAxMDIzIH0sCi17IDB4MiwgMzA3LCAwLCAxMDI0IH0sCi17IDB4MSwgMzA3LCAwLCAxMDI1IH0sCi17IDB4YSwgMzczLCAxLCAxMDMxIH0sCi17IDB4YSwgMzc0LCAwLCAxMDMwIH0sCi17IDB4MWEsIDM3MywgMSwgMTAyNyB9LAoteyAweDMyLCAzNzQsIDAsIDEwMjYgfSwKLXsgMHg2LCAzNzMsIDEsIDEwMzUgfSwKLXsgMHg2LCAzNzQsIDAsIDEwMzQgfSwKLXsgMHgxLCAzNzMsIDEsIDEwNDEgfSwKLXsgMHgxLCAzNzQsIDAsIDEwNDAgfSwKLXsgMHg5LCAzNzMsIDEsIDEwMzMgfSwKLXsgMHg5LCAzNzQsIDAsIDEwMzIgfSwKLXsgMHgxOSwgMzczLCAxLCAxMDI5IH0sCi17IDB4MzEsIDM3NCwgMCwgMTAyOCB9LAoteyAweDUsIDM3MywgMSwgMTAzNyB9LAoteyAweDUsIDM3NCwgMCwgMTAzNiB9LAoteyAweDMsIDM3MywgMSwgMTAzOSB9LAoteyAweDMsIDM3NCwgMCwgMTAzOCB9LAoteyAweGEsIDM3MCwgMSwgMTA0NyB9LAoteyAweGEsIDM3MSwgMCwgMTA0NiB9LAoteyAweDFhLCAzNzAsIDEsIDEwNDMgfSwKLXsgMHgzMiwgMzcxLCAwLCAxMDQyIH0sCi17IDB4NiwgMzcwLCAxLCAxMDUxIH0sCi17IDB4NiwgMzcxLCAwLCAxMDUwIH0sCi17IDB4MSwgMzcwLCAxLCAxMDU3IH0sCi17IDB4MSwgMzcxLCAwLCAxMDU2IH0sCi17IDB4OSwgMzcwLCAxLCAxMDQ5IH0sCi17IDB4OSwgMzcxLCAwLCAxMDQ4IH0sCi17IDB4MTksIDM3MCwgMSwgMTA0NSB9LAoteyAweDMxLCAzNzEsIDAsIDEwNDQgfSwKLXsgMHg1LCAzNzAsIDEsIDEwNTMgfSwKLXsgMHg1LCAzNzEsIDAsIDEwNTIgfSwKLXsgMHgzLCAzNzAsIDEsIDEwNTUgfSwKLXsgMHgzLCAzNzEsIDAsIDEwNTQgfSwKLXsgMHgxLCA5NywgMCwgMTA1OCB9LAoteyAweDEsIDk2LCAwLCAxMDU5IH0sCi17IDB4MSwgMzM0LCAxLCAxMDYxIH0sCi17IDB4MSwgOTUsIDAsIDEwNjAgfSwKLXsgMHgyLCAzMzgsIDEsIDEwNjMgfSwKLXsgMHgyLCA5OSwgMCwgMTA2MiB9LAoteyAweDEsIDMzOCwgMSwgMTA2NSB9LAoteyAweDEsIDk5LCAwLCAxMDY0IH0sCi17IDB4MSwgMzQwLCAwLCAxMDY2IH0sCi17IDB4MSwgOTQsIDAsIDEwNjcgfSwKLXsgMHgyLCA5MywgMCwgMTA2OCB9LAoteyAweDIsIDkyLCAwLCAxMDY5IH0sCi17IDB4MSwgMzkxLCAxLCAxMDc1IH0sCi17IDB4MSwgMTkyLCAwLCA5NzAgfSwKLXsgMHgxLCAzOTAsIDAsIDEwNzYgfSwKLXsgMHgxLCAzODksIDEsIDEwNzcgfSwKLXsgMHgxLCAxOTEsIDAsIDk3OSB9LAoteyAweDEsIDI1MSwgMCwgMTA3OCB9LAoteyAweDEsIDI1MCwgMSwgMTA3OSB9LAoteyAweDEsIDIzMywgMCwgOTcxIH0sCi17IDB4MSwgMjQ5LCAwLCAxMDgwIH0sCi17IDB4MSwgMjQ4LCAxLCAxMDgxIH0sCi17IDB4MSwgMzY4LCAwLCA5NzMgfSwKLXsgMHgxLCAyNDcsIDEsIDEwODIgfSwKLXsgMHgxLCAzNDEsIDAsIDk3NSB9LAoteyAweDEsIDI0NiwgMCwgMTA4MyB9LAoteyAweDEsIDI0NSwgMCwgMTA4NCB9LAoteyAweDEsIDI0NCwgMSwgMTA4NSB9LAoteyAweDIsIDM0MSwgMCwgOTc0IH0sCi17IDB4MTAsIDI0MywgMCwgMTA4OSB9LAoteyAweDkwLCAyNDMsIDAsIDEwODcgfSwKLXsgMHgxOTAsIDI0MywgMCwgMTA4NiB9LAoteyAweDUwLCAyNDMsIDAsIDEwODggfSwKLXsgMHgzMCwgMjQzLCAwLCAxMDkxIH0sCi17IDB4NzAsIDI0MywgMCwgMTA5MCB9LAoteyAweDgsIDI0MywgMCwgMTA5MyB9LAoteyAweDE4LCAyNDMsIDAsIDEwOTIgfSwKLXsgMHg0LCAyNDMsIDAsIDEwOTQgfSwKLXsgMHgxLCAyNDMsIDAsIDEwOTcgfSwKLXsgMHgzLCAyNDMsIDAsIDEwOTYgfSwKLXsgMHgxLCAyNDIsIDEsIDEwOTggfSwKLXsgMHgyLCAyNDMsIDAsIDEwOTUgfSwKLXsgMHgzLCA0NCwgMCwgMTA5OSB9LAoteyAweDEsIDI4NCwgMSwgMTEwMCB9LAoteyAweDEsIDI4NSwgMSwgOTY2IH0sCi17IDB4MSwgMjg2LCAwLCA4NiB9LAoteyAweDEsIDMyLCAxLCAxMTAxIH0sCi17IDB4MSwgMzMsIDEsIDk2NyB9LAoteyAweDEsIDM0LCAwLCA4NyB9LAoteyAweDEsIDE4MiwgMCwgMTEwMiB9LAoteyAweDQsIDM4NCwgMCwgMTEwMyB9LAoteyAweDIsIDM4NCwgMCwgMTEwNCB9LAoteyAweDEsIDM4NCwgMSwgMTEwNiB9LAoteyAweDEsIDM4NSwgMCwgMTEwNSB9LAoteyAweDgsIDM4NiwgMCwgMTEwNyB9LAoteyAweDQsIDM4NiwgMCwgMTEwOCB9LAoteyAweDEsIDM4NiwgMSwgMTExMCB9LAoteyAweDIsIDM4NiwgMCwgMTEwOSB9LAoteyAweDgsIDE3MCwgMCwgMTExMSB9LAoteyAweDQsIDE3MCwgMCwgMTExMiB9LAoteyAweDIsIDE3MCwgMCwgMTExMyB9LAoteyAweDEsIDE3MCwgMSwgMTExNSB9LAoteyAweDEsIDE3MSwgMCwgMTExNCB9LAoteyAweDEwLCAxNzIsIDAsIDExMTYgfSwKLXsgMHg4LCAxNzIsIDAsIDExMTcgfSwKLXsgMHg0LCAxNzIsIDAsIDExMTggfSwKLXsgMHgxLCAxNzIsIDEsIDExMjAgfSwKLXsgMHgyLCAxNzIsIDAsIDExMTkgfSwKLXsgMHgyMjAsIDE0MywgMCwgMTEyMSB9LAoteyAweDEyMCwgMTQzLCAwLCAxMTIyIH0sCi17IDB4YTAsIDE0MywgMCwgMTEyMyB9LAoteyAweDYwLCAxNDMsIDEsIDExMjUgfSwKLXsgMHg0LCAxNDQsIDAsIDExMjQgfSwKLXsgMHgxMTAsIDE0MywgMCwgMTEzMSB9LAoteyAweDkwLCAxNDMsIDAsIDExMzIgfSwKLXsgMHg1MCwgMTQzLCAwLCAxMTMzIH0sCi17IDB4MzAsIDE0MywgMSwgMTEzNSB9LAoteyAweDIsIDE0NCwgMCwgMTEzNCB9LAoteyAweDgsIDE0MywgMCwgMTEzNiB9LAoteyAweDQsIDE0MywgMCwgMTEzNyB9LAoteyAweDIsIDE0MywgMCwgMTEzOCB9LAoteyAweDEsIDE0MywgMSwgMTE0MCB9LAoteyAweDEsIDE0NCwgMCwgMTEzOSB9LAoteyAweDQ0MCwgMTQ1LCAwLCAxMTI2IH0sCi17IDB4MjQwLCAxNDUsIDAsIDExMjcgfSwKLXsgMHgxNDAsIDE0NSwgMCwgMTEyOCB9LAoteyAweGMwLCAxNDUsIDEsIDExMzAgfSwKLXsgMHg0MCwgMTQ1LCAwLCAxMTI5IH0sCi17IDB4MjIwLCAxNDUsIDAsIDExNDEgfSwKLXsgMHgxMjAsIDE0NSwgMCwgMTE0MiB9LAoteyAweGEwLCAxNDUsIDAsIDExNDMgfSwKLXsgMHg2MCwgMTQ1LCAxLCAxMTQ1IH0sCi17IDB4MjAsIDE0NSwgMCwgMTE0NCB9LAoteyAweDEwLCAxNDUsIDAsIDExNDYgfSwKLXsgMHg4LCAxNDUsIDAsIDExNDcgfSwKLXsgMHg0LCAxNDUsIDAsIDExNDggfSwKLXsgMHgxLCAxNDUsIDEsIDExNTAgfSwKLXsgMHgyLCAxNDUsIDAsIDExNDkgfSwKLXsgMHgxMCwgMTc3LCAwLCAxMTUxIH0sCi17IDB4OCwgMTc3LCAwLCAxMTUyIH0sCi17IDB4NCwgMTc3LCAwLCAxMTUzIH0sCi17IDB4MSwgMTc3LCAxLCAxMTU1IH0sCi17IDB4MiwgMTc3LCAwLCAxMTU0IH0sCi17IDB4OCwgMTY2LCAwLCAxMTU2IH0sCi17IDB4NCwgMTY2LCAwLCAxMTU3IH0sCi17IDB4MiwgMTY2LCAwLCAxMTU4IH0sCi17IDB4MSwgMTY2LCAxLCAxMTYwIH0sCi17IDB4MSwgMTY3LCAwLCAxMTU5IH0sCi17IDB4MjIwLCAxMzksIDAsIDExNjEgfSwKLXsgMHgxMjAsIDEzOSwgMCwgMTE2MiB9LAoteyAweGEwLCAxMzksIDAsIDExNjMgfSwKLXsgMHg2MCwgMTM5LCAxLCAxMTY1IH0sCi17IDB4NCwgMTQwLCAwLCAxMTY0IH0sCi17IDB4MTEwLCAxMzksIDAsIDExNzEgfSwKLXsgMHg5MCwgMTM5LCAwLCAxMTcyIH0sCi17IDB4NTAsIDEzOSwgMCwgMTE3MyB9LAoteyAweDMwLCAxMzksIDEsIDExNzUgfSwKLXsgMHgyLCAxNDAsIDAsIDExNzQgfSwKLXsgMHg4LCAxMzksIDAsIDExNzYgfSwKLXsgMHg0LCAxMzksIDAsIDExNzcgfSwKLXsgMHgyLCAxMzksIDAsIDExNzggfSwKLXsgMHgxLCAxMzksIDEsIDExODAgfSwKLXsgMHgxLCAxNDAsIDAsIDExNzkgfSwKLXsgMHg0NDAsIDE4NSwgMCwgMTE2NiB9LAoteyAweDI0MCwgMTg1LCAwLCAxMTY3IH0sCi17IDB4MTQwLCAxODUsIDAsIDExNjggfSwKLXsgMHhjMCwgMTg1LCAxLCAxMTcwIH0sCi17IDB4NDAsIDE4NSwgMCwgMTE2OSB9LAoteyAweDIyMCwgMTg1LCAwLCAxMTgxIH0sCi17IDB4MTIwLCAxODUsIDAsIDExODIgfSwKLXsgMHhhMCwgMTg1LCAwLCAxMTgzIH0sCi17IDB4NjAsIDE4NSwgMSwgMTE4NSB9LAoteyAweDIwLCAxODUsIDAsIDExODQgfSwKLXsgMHgxMCwgMTg1LCAwLCAxMTg2IH0sCi17IDB4OCwgMTg1LCAwLCAxMTg3IH0sCi17IDB4NCwgMTg1LCAwLCAxMTg4IH0sCi17IDB4MSwgMTg1LCAxLCAxMTkwIH0sCi17IDB4MiwgMTg1LCAwLCAxMTg5IH0sCi17IDB4OCwgMTU4LCAwLCAxMTkxIH0sCi17IDB4NCwgMTU4LCAwLCAxMTkyIH0sCi17IDB4MiwgMTU4LCAwLCAxMTkzIH0sCi17IDB4MSwgMTU4LCAxLCAxMTk1IH0sCi17IDB4MSwgMTU5LCAwLCAxMTk0IH0sCi17IDB4MTAsIDE2NSwgMCwgMTE5NiB9LAoteyAweDgsIDE2NSwgMCwgMTE5NyB9LAoteyAweDQsIDE2NSwgMCwgMTE5OCB9LAoteyAweDEsIDE2NSwgMSwgMTIwMCB9LAoteyAweDIsIDE2NSwgMCwgMTE5OSB9LAoteyAweDIyMCwgMTMwLCAwLCAxMjAxIH0sCi17IDB4MTIwLCAxMzAsIDAsIDEyMDIgfSwKLXsgMHhhMCwgMTMwLCAwLCAxMjAzIH0sCi17IDB4NjAsIDEzMCwgMSwgMTIwNSB9LAoteyAweDQsIDEzMSwgMCwgMTIwNCB9LAoteyAweDExMCwgMTMwLCAwLCAxMjI2IH0sCi17IDB4OTAsIDEzMCwgMCwgMTIyNyB9LAoteyAweDUwLCAxMzAsIDAsIDEyMjggfSwKLXsgMHgzMCwgMTMwLCAxLCAxMjMwIH0sCi17IDB4MiwgMTMxLCAwLCAxMjI5IH0sCi17IDB4OCwgMTMwLCAwLCAxMjMxIH0sCi17IDB4NCwgMTMwLCAwLCAxMjMyIH0sCi17IDB4MiwgMTMwLCAwLCAxMjMzIH0sCi17IDB4MSwgMTMwLCAxLCAxMjM1IH0sCi17IDB4MSwgMTMxLCAwLCAxMjM0IH0sCi17IDB4NDQwLCAxMzgsIDAsIDEyMDYgfSwKLXsgMHgyNDAsIDEzOCwgMCwgMTIwNyB9LAoteyAweDE0MCwgMTM4LCAwLCAxMjA4IH0sCi17IDB4YzAsIDEzOCwgMSwgMTIxMCB9LAoteyAweDQwLCAxMzgsIDAsIDEyMDkgfSwKLXsgMHgyMjAsIDEzOCwgMCwgMTIzNiB9LAoteyAweDEyMCwgMTM4LCAwLCAxMjM3IH0sCi17IDB4YTAsIDEzOCwgMCwgMTIzOCB9LAoteyAweDYwLCAxMzgsIDEsIDEyNDAgfSwKLXsgMHgyMCwgMTM4LCAwLCAxMjM5IH0sCi17IDB4MTAsIDEzOCwgMCwgMTI0MSB9LAoteyAweDgsIDEzOCwgMCwgMTI0MiB9LAoteyAweDQsIDEzOCwgMCwgMTI0MyB9LAoteyAweDEsIDEzOCwgMSwgMTI0NSB9LAoteyAweDIsIDEzOCwgMCwgMTI0NCB9LAoteyAweDQ0MCwgMTAxLCAwLCAxMjExIH0sCi17IDB4MjQwLCAxMDEsIDAsIDEyMTIgfSwKLXsgMHgxNDAsIDEwMSwgMCwgMTIxMyB9LAoteyAweGMwLCAxMDEsIDEsIDEyMTUgfSwKLXsgMHg0MCwgMTAxLCAwLCAxMjE0IH0sCi17IDB4MjIwLCAxMDEsIDAsIDEyNDYgfSwKLXsgMHgxMjAsIDEwMSwgMCwgMTI0NyB9LAoteyAweGEwLCAxMDEsIDAsIDEyNDggfSwKLXsgMHg2MCwgMTAxLCAxLCAxMjUwIH0sCi17IDB4MjAsIDEwMSwgMCwgMTI0OSB9LAoteyAweDEwLCAxMDEsIDAsIDEyNTEgfSwKLXsgMHg4LCAxMDEsIDAsIDEyNTIgfSwKLXsgMHgxLCAxMDEsIDEsIDEyNTUgfSwKLXsgMHgyLCAxMDEsIDAsIDEyNTQgfSwKLXsgMHg0NDAsIDE0NiwgMSwgMTIyMSB9LAoteyAweDQ0MSwgMTI2LCAwLCAxMjE2IH0sCi17IDB4MjQwLCAxNDYsIDEsIDEyMjIgfSwKLXsgMHgyNDEsIDEyNiwgMCwgMTIxNyB9LAoteyAweDE0MCwgMTQ2LCAxLCAxMjIzIH0sCi17IDB4MTQxLCAxMjYsIDAsIDEyMTggfSwKLXsgMHhjMCwgMTQ2LCAxLCAxMjI1IH0sCi17IDB4NDAsIDE0NiwgMSwgMTIyNCB9LAoteyAweGMxLCAxMjYsIDEsIDEyMjAgfSwKLXsgMHg0MSwgMTI2LCAwLCAxMjE5IH0sCi17IDB4MjIwLCAxNDYsIDEsIDEyNjYgfSwKLXsgMHgyMjEsIDEyNiwgMCwgMTI1NiB9LAoteyAweDEyMCwgMTQ2LCAxLCAxMjY3IH0sCi17IDB4MTIxLCAxMjYsIDAsIDEyNTcgfSwKLXsgMHhhMCwgMTQ2LCAxLCAxMjY4IH0sCi17IDB4YTEsIDEyNiwgMCwgMTI1OCB9LAoteyAweDYwLCAxNDYsIDEsIDEyNzAgfSwKLXsgMHgyMCwgMTQ2LCAxLCAxMjY5IH0sCi17IDB4NjEsIDEyNiwgMSwgMTI2MCB9LAoteyAweDIxLCAxMjYsIDAsIDEyNTkgfSwKLXsgMHgxMCwgMTQ2LCAxLCAxMjcxIH0sCi17IDB4MTEsIDEyNiwgMCwgMTI2MSB9LAoteyAweDgsIDE0NiwgMSwgMTI3MiB9LAoteyAweDksIDEyNiwgMCwgMTI2MiB9LAoteyAweDQsIDE0NiwgMSwgMTI3MyB9LAoteyAweDUsIDEyNiwgMCwgMTI2MyB9LAoteyAweDEsIDE0NiwgMSwgMTI3NSB9LAoteyAweDIsIDE0NiwgMSwgMTI3NCB9LAoteyAweDMsIDEyNiwgMSwgMTI2NSB9LAoteyAweDEsIDEyNiwgMCwgMTI2NCB9LAoteyAweDEsIDExMSwgMSwgMTI3OSB9LAoteyAweDEsIDExMiwgMCwgMTI3OCB9LAoteyAweDMsIDExMSwgMSwgMTI3NyB9LAoteyAweDMsIDExMiwgMCwgMTI3NiB9LAoteyAweDExMDgsIDExNSwgMSwgMTM2MCB9LAoteyAweDExMDgsIDExOSwgMCwgMTI4MCB9LAoteyAweDkwOCwgMTE1LCAxLCAxMzYxIH0sCi17IDB4OTA4LCAxMTksIDAsIDEyODEgfSwKLXsgMHg1MDgsIDExNSwgMSwgMTM2MiB9LAoteyAweDUwOCwgMTE5LCAwLCAxMjgyIH0sCi17IDB4MzA4LCAxMTUsIDEsIDEzNjQgfSwKLXsgMHgxOCwgMTE2LCAxLCAxMzYzIH0sCi17IDB4MzA4LCAxMTksIDEsIDEyODQgfSwKLXsgMHgxOCwgMTIwLCAwLCAxMjgzIH0sCi17IDB4ODgsIDExNSwgMSwgMTM4MCB9LAoteyAweDg4LCAxMTksIDAsIDEzMjAgfSwKLXsgMHg0OCwgMTE1LCAxLCAxMzgxIH0sCi17IDB4NDgsIDExOSwgMCwgMTMyMSB9LAoteyAweDI4LCAxMTUsIDEsIDEzODIgfSwKLXsgMHgyOCwgMTE5LCAwLCAxMzIyIH0sCi17IDB4MTgsIDExNSwgMSwgMTM4NCB9LAoteyAweDgsIDExNiwgMSwgMTM4MyB9LAoteyAweDE4LCAxMTksIDEsIDEzMjQgfSwKLXsgMHg4LCAxMjAsIDAsIDEzMjMgfSwKLXsgMHg4ODQsIDExNSwgMSwgMTM2NSB9LAoteyAweDQ0MiwgMTE3LCAxLCAxMzEwIH0sCi17IDB4ODg0LCAxMTksIDEsIDEyOTUgfSwKLXsgMHg0NDIsIDEyMSwgMCwgMTI4NSB9LAoteyAweDQ4NCwgMTE1LCAxLCAxMzY2IH0sCi17IDB4MjQyLCAxMTcsIDEsIDEzMTEgfSwKLXsgMHg0ODQsIDExOSwgMSwgMTI5NiB9LAoteyAweDI0MiwgMTIxLCAwLCAxMjg2IH0sCi17IDB4Mjg0LCAxMTUsIDEsIDEzNjcgfSwKLXsgMHgxNDIsIDExNywgMSwgMTMxMiB9LAoteyAweDI4NCwgMTE5LCAxLCAxMjk3IH0sCi17IDB4MTQyLCAxMjEsIDAsIDEyODcgfSwKLXsgMHgxODQsIDExNSwgMSwgMTM2OSB9LAoteyAweGMsIDExNiwgMSwgMTM2OCB9LAoteyAweGMyLCAxMTcsIDEsIDEzMTQgfSwKLXsgMHg2LCAxMTgsIDEsIDEzMTMgfSwKLXsgMHgxODQsIDExOSwgMSwgMTI5OSB9LAoteyAweGMsIDEyMCwgMSwgMTI5OCB9LAoteyAweGMyLCAxMjEsIDEsIDEyODkgfSwKLXsgMHg2LCAxMjIsIDAsIDEyODggfSwKLXsgMHg0NCwgMTE1LCAxLCAxMzg1IH0sCi17IDB4MjIsIDExNywgMSwgMTM1MCB9LAoteyAweDQ0LCAxMTksIDEsIDEzMzUgfSwKLXsgMHgyMiwgMTIxLCAwLCAxMzI1IH0sCi17IDB4MjQsIDExNSwgMSwgMTM4NiB9LAoteyAweDEyLCAxMTcsIDEsIDEzNTEgfSwKLXsgMHgyNCwgMTE5LCAxLCAxMzM2IH0sCi17IDB4MTIsIDEyMSwgMCwgMTMyNiB9LAoteyAweDE0LCAxMTUsIDEsIDEzODcgfSwKLXsgMHhhLCAxMTcsIDEsIDEzNTIgfSwKLXsgMHgxNCwgMTE5LCAxLCAxMzM3IH0sCi17IDB4YSwgMTIxLCAwLCAxMzI3IH0sCi17IDB4YywgMTE1LCAxLCAxMzg5IH0sCi17IDB4NCwgMTE2LCAxLCAxMzg4IH0sCi17IDB4NiwgMTE3LCAxLCAxMzU0IH0sCi17IDB4MiwgMTE4LCAxLCAxMzUzIH0sCi17IDB4YywgMTE5LCAxLCAxMzM5IH0sCi17IDB4NCwgMTIwLCAxLCAxMzM4IH0sCi17IDB4NiwgMTIxLCAxLCAxMzI5IH0sCi17IDB4MiwgMTIyLCAwLCAxMzI4IH0sCi17IDB4NDQyLCAxMTUsIDEsIDEzNzAgfSwKLXsgMHgyMjEsIDExNywgMSwgMTMxNSB9LAoteyAweDQ0MiwgMTE5LCAxLCAxMzAwIH0sCi17IDB4MjIxLCAxMjEsIDAsIDEyOTAgfSwKLXsgMHgyNDIsIDExNSwgMSwgMTM3MSB9LAoteyAweDEyMSwgMTE3LCAxLCAxMzE2IH0sCi17IDB4MjQyLCAxMTksIDEsIDEzMDEgfSwKLXsgMHgxMjEsIDEyMSwgMCwgMTI5MSB9LAoteyAweDE0MiwgMTE1LCAxLCAxMzcyIH0sCi17IDB4YTEsIDExNywgMSwgMTMxNyB9LAoteyAweDE0MiwgMTE5LCAxLCAxMzAyIH0sCi17IDB4YTEsIDEyMSwgMCwgMTI5MiB9LAoteyAweGMyLCAxMTUsIDEsIDEzNzQgfSwKLXsgMHg2LCAxMTYsIDEsIDEzNzMgfSwKLXsgMHg2MSwgMTE3LCAxLCAxMzE5IH0sCi17IDB4MywgMTE4LCAxLCAxMzE4IH0sCi17IDB4YzIsIDExOSwgMSwgMTMwNCB9LAoteyAweDYsIDEyMCwgMSwgMTMwMyB9LAoteyAweDYxLCAxMjEsIDEsIDEyOTQgfSwKLXsgMHgzLCAxMjIsIDAsIDEyOTMgfSwKLXsgMHgyMiwgMTE1LCAxLCAxMzkwIH0sCi17IDB4MTEsIDExNywgMSwgMTM1NSB9LAoteyAweDIyLCAxMTksIDEsIDEzNDAgfSwKLXsgMHgxMSwgMTIxLCAwLCAxMzMwIH0sCi17IDB4MTIsIDExNSwgMSwgMTM5MSB9LAoteyAweDksIDExNywgMSwgMTM1NiB9LAoteyAweDEyLCAxMTksIDEsIDEzNDEgfSwKLXsgMHg5LCAxMjEsIDAsIDEzMzEgfSwKLXsgMHhhLCAxMTUsIDEsIDEzOTIgfSwKLXsgMHg1LCAxMTcsIDEsIDEzNTcgfSwKLXsgMHhhLCAxMTksIDEsIDEzNDIgfSwKLXsgMHg1LCAxMjEsIDAsIDEzMzIgfSwKLXsgMHg2LCAxMTUsIDEsIDEzOTQgfSwKLXsgMHgyLCAxMTYsIDEsIDEzOTMgfSwKLXsgMHgzLCAxMTcsIDEsIDEzNTkgfSwKLXsgMHgxLCAxMTgsIDEsIDEzNTggfSwKLXsgMHg2LCAxMTksIDEsIDEzNDQgfSwKLXsgMHgyLCAxMjAsIDEsIDEzNDMgfSwKLXsgMHgzLCAxMjEsIDEsIDEzMzQgfSwKLXsgMHgxLCAxMjIsIDAsIDEzMzMgfSwKLXsgMHgyMjEsIDExNSwgMSwgMTM3NSB9LAoteyAweDIyMSwgMTE5LCAwLCAxMzA1IH0sCi17IDB4MTIxLCAxMTUsIDEsIDEzNzYgfSwKLXsgMHgxMjEsIDExOSwgMCwgMTMwNiB9LAoteyAweGExLCAxMTUsIDEsIDEzNzcgfSwKLXsgMHhhMSwgMTE5LCAwLCAxMzA3IH0sCi17IDB4NjEsIDExNSwgMSwgMTM3OSB9LAoteyAweDMsIDExNiwgMSwgMTM3OCB9LAoteyAweDYxLCAxMTksIDEsIDEzMDkgfSwKLXsgMHgzLCAxMjAsIDAsIDEzMDggfSwKLXsgMHgxMSwgMTE1LCAxLCAxMzk1IH0sCi17IDB4MTEsIDExOSwgMCwgMTM0NSB9LAoteyAweDksIDExNSwgMSwgMTM5NiB9LAoteyAweDksIDExOSwgMCwgMTM0NiB9LAoteyAweDUsIDExNSwgMSwgMTM5NyB9LAoteyAweDUsIDExOSwgMCwgMTM0NyB9LAoteyAweDMsIDExNSwgMSwgMTM5OSB9LAoteyAweDEsIDExNiwgMSwgMTM5OCB9LAoteyAweDMsIDExOSwgMSwgMTM0OSB9LAoteyAweDEsIDEyMCwgMCwgMTM0OCB9LAoteyAweDQ0MiwgMTU2LCAwLCAxNDAwIH0sCi17IDB4MjQyLCAxNTYsIDAsIDE0MDEgfSwKLXsgMHgxNDIsIDE1NiwgMCwgMTQwMiB9LAoteyAweGMyLCAxNTYsIDEsIDE0MDQgfSwKLXsgMHg2LCAxNTcsIDEsIDE0MDMgfSwKLXsgMHgxLCAzNzYsIDAsIDkyMCB9LAoteyAweDIyLCAxNTYsIDAsIDE0MTAgfSwKLXsgMHgxMiwgMTU2LCAwLCAxNDExIH0sCi17IDB4YSwgMTU2LCAwLCAxNDEyIH0sCi17IDB4NiwgMTU2LCAxLCAxNDE0IH0sCi17IDB4MiwgMTU3LCAxLCAxNDEzIH0sCi17IDB4MiwgMzEwLCAwLCA5NDkgfSwKLXsgMHgyMjEsIDE1NiwgMCwgMTQwNSB9LAoteyAweDEyMSwgMTU2LCAwLCAxNDA2IH0sCi17IDB4YTEsIDE1NiwgMCwgMTQwNyB9LAoteyAweDYxLCAxNTYsIDEsIDE0MDkgfSwKLXsgMHgzLCAxNTcsIDEsIDE0MDggfSwKLXsgMHgxLCAzNzIsIDAsIDkyMSB9LAoteyAweDExLCAxNTYsIDAsIDE0MTUgfSwKLXsgMHg5LCAxNTYsIDAsIDE0MTYgfSwKLXsgMHg1LCAxNTYsIDAsIDE0MTcgfSwKLXsgMHgzLCAxNTYsIDEsIDE0MTkgfSwKLXsgMHgxLCAxNTcsIDEsIDE0MTggfSwKLXsgMHgxLCAzMTAsIDAsIDk1MCB9LAoteyAweDQsIDE2MiwgMCwgMTQyMCB9LAoteyAweDEsIDE2MiwgMCwgMTQyMiB9LAoteyAweDEsIDE2OSwgMCwgMTQyMyB9LAoteyAweDEsIDE2OCwgMSwgMTQyNCB9LAoteyAweDIsIDE2MiwgMCwgMTQyMSB9LAoteyAweDEsIDE0OCwgMCwgMTQyNSB9LAoteyAweDg4MCwgMTU0LCAwLCAxNDI2IH0sCi17IDB4NDgwLCAxNTQsIDAsIDE0MjcgfSwKLXsgMHgyODAsIDE1NCwgMCwgMTQyOCB9LAoteyAweDE4MCwgMTU0LCAxLCAxNDMwIH0sCi17IDB4ODAsIDE1NSwgMCwgMTQyOSB9LAoteyAweDQ0MCwgMTU0LCAwLCAxNDMxIH0sCi17IDB4MjQwLCAxNTQsIDAsIDE0MzIgfSwKLXsgMHgxNDAsIDE1NCwgMCwgMTQzMyB9LAoteyAweGMwLCAxNTQsIDEsIDE0MzUgfSwKLXsgMHg0MCwgMTU1LCAwLCAxNDM0IH0sCi17IDB4MjIwLCAxNTQsIDAsIDE0MzYgfSwKLXsgMHgxMjAsIDE1NCwgMCwgMTQzNyB9LAoteyAweGEwLCAxNTQsIDAsIDE0MzggfSwKLXsgMHg2MCwgMTU0LCAxLCAxNDQwIH0sCi17IDB4MjAsIDE1NSwgMCwgMTQzOSB9LAoteyAweDExMCwgMTU0LCAwLCAxNDQxIH0sCi17IDB4OTAsIDE1NCwgMCwgMTQ0MiB9LAoteyAweDUwLCAxNTQsIDAsIDE0NDMgfSwKLXsgMHgzMCwgMTU0LCAxLCAxNDQ1IH0sCi17IDB4MTAsIDE1NSwgMSwgMTQ0NCB9LAoteyAweDEsIDMyOCwgMCwgOTE0IH0sCi17IDB4ODgsIDE1NCwgMCwgMTQ0NiB9LAoteyAweDQ4LCAxNTQsIDAsIDE0NDcgfSwKLXsgMHgyOCwgMTU0LCAwLCAxNDQ4IH0sCi17IDB4MTgsIDE1NCwgMSwgMTQ1MCB9LAoteyAweDgsIDE1NSwgMSwgMTQ0OSB9LAoteyAweGMsIDMxMSwgMCwgOTQ2IH0sCi17IDB4NDQsIDE1NCwgMCwgMTQ1MSB9LAoteyAweDI0LCAxNTQsIDAsIDE0NTIgfSwKLXsgMHgxNCwgMTU0LCAwLCAxNDUzIH0sCi17IDB4YywgMTU0LCAxLCAxNDU1IH0sCi17IDB4NCwgMTU1LCAxLCAxNDU0IH0sCi17IDB4NiwgMzExLCAwLCA5NDcgfSwKLXsgMHgyMiwgMTU0LCAwLCAxNDU2IH0sCi17IDB4MTIsIDE1NCwgMCwgMTQ1NyB9LAoteyAweGEsIDE1NCwgMCwgMTQ1OCB9LAoteyAweDYsIDE1NCwgMSwgMTQ2MCB9LAoteyAweDIsIDE1NSwgMSwgMTQ1OSB9LAoteyAweDMsIDMxMSwgMCwgOTQ4IH0sCi17IDB4MTEsIDE1NCwgMCwgMTQ2MSB9LAoteyAweDksIDE1NCwgMCwgMTQ2MiB9LAoteyAweDUsIDE1NCwgMCwgMTQ2MyB9LAoteyAweDMsIDE1NCwgMSwgMTQ2NSB9LAoteyAweDEsIDE1NSwgMSwgMTQ2NCB9LAoteyAweDEsIDEwOCwgMCwgOTE1IH0sCi17IDB4OCwgMTUwLCAwLCAxNDY2IH0sCi17IDB4NCwgMTUwLCAwLCAxNDY3IH0sCi17IDB4MiwgMTUwLCAwLCAxNDY4IH0sCi17IDB4MSwgMTUwLCAxLCAxNDcwIH0sCi17IDB4MSwgMTUxLCAxLCAxNDY5IH0sCi17IDB4MSwgMjc1LCAwLCA5MjcgfSwKLXsgMHg4LCAxNTIsIDAsIDE0NzEgfSwKLXsgMHg0LCAxNTIsIDAsIDE0NzIgfSwKLXsgMHgyLCAxNTIsIDAsIDE0NzMgfSwKLXsgMHgxLCAxNTIsIDEsIDE0NzUgfSwKLXsgMHgxLCAxNTMsIDEsIDE0NzQgfSwKLXsgMHgxLCAyNzQsIDAsIDkyOCB9LAoteyAweDgsIDE2MCwgMCwgMTQ3NiB9LAoteyAweDQsIDE2MCwgMCwgMTQ3NyB9LAoteyAweDIsIDE2MCwgMCwgMTQ3OCB9LAoteyAweDEsIDE2MCwgMSwgMTQ4MCB9LAoteyAweDEsIDE2MSwgMSwgMTQ3OSB9LAoteyAweDEsIDI3MywgMCwgOTI5IH0sCi17IDB4OCwgMTYzLCAwLCAxNDgxIH0sCi17IDB4NCwgMTYzLCAwLCAxNDgyIH0sCi17IDB4MiwgMTYzLCAwLCAxNDgzIH0sCi17IDB4MSwgMTYzLCAxLCAxNDg1IH0sCi17IDB4MSwgMTY0LCAxLCAxNDg0IH0sCi17IDB4MSwgMjcyLCAwLCA5MzAgfSwKLXsgMHg4LCAxNzUsIDAsIDE0ODYgfSwKLXsgMHg0LCAxNzUsIDAsIDE0ODcgfSwKLXsgMHgyLCAxNzUsIDAsIDE0ODggfSwKLXsgMHgxLCAxNzUsIDEsIDE0OTAgfSwKLXsgMHgxLCAxNzYsIDAsIDE0ODkgfSwKLXsgMHg4LCAxNzMsIDAsIDE0OTEgfSwKLXsgMHg0LCAxNzMsIDAsIDE0OTIgfSwKLXsgMHgyLCAxNzMsIDAsIDE0OTMgfSwKLXsgMHgxLCAxNzMsIDEsIDE0OTUgfSwKLXsgMHgxLCAxNzQsIDAsIDE0OTQgfSwKLXsgMHgxLCAyODMsIDAsIDE0OTYgfSwKLXsgMHgxLCAzMSwgMCwgMTQ5NyB9LAoteyAweDgsIDEwOSwgMCwgMTQ5OCB9LAoteyAweDQsIDEwOSwgMCwgMTQ5OSB9LAoteyAweDIsIDEwOSwgMCwgMTUwMCB9LAoteyAweDEsIDEwOSwgMSwgMTUwMiB9LAoteyAweDEsIDExMCwgMCwgMTUwMSB9LAoteyAweDgsIDExMywgMCwgMTUwMyB9LAoteyAweDQsIDExMywgMCwgMTUwNCB9LAoteyAweDIsIDExMywgMCwgMTUwNSB9LAoteyAweDEsIDExMywgMSwgMTUwNyB9LAoteyAweDEsIDExNCwgMCwgMTUwNiB9LAoteyAweDgsIDE4MywgMCwgMTUwOCB9LAoteyAweDQsIDE4MywgMCwgMTUwOSB9LAoteyAweDIsIDE4MywgMCwgMTUxMCB9LAoteyAweDEsIDE4MywgMSwgMTUxMiB9LAoteyAweDEsIDE4NCwgMCwgMTUxMSB9LAoteyAweDEsIDEyNSwgMCwgMTUxMyB9LAoteyAweDQ0MiwgMTIzLCAwLCAxNTE0IH0sCi17IDB4MjQyLCAxMjMsIDAsIDE1MTUgfSwKLXsgMHgxNDIsIDEyMywgMCwgMTUxNiB9LAoteyAweGMyLCAxMjMsIDEsIDE1MTggfSwKLXsgMHg2LCAxMjQsIDAsIDE1MTcgfSwKLXsgMHgyMiwgMTIzLCAwLCAxNTI0IH0sCi17IDB4MTIsIDEyMywgMCwgMTUyNSB9LAoteyAweGEsIDEyMywgMCwgMTUyNiB9LAoteyAweDYsIDEyMywgMSwgMTUyOCB9LAoteyAweDIsIDEyNCwgMSwgMTUyNyB9LAoteyAweDEsIDkzLCAwLCAxMDcwIH0sCi17IDB4MjIxLCAxMjMsIDAsIDE1MTkgfSwKLXsgMHgxMjEsIDEyMywgMCwgMTUyMCB9LAoteyAweGExLCAxMjMsIDAsIDE1MjEgfSwKLXsgMHg2MSwgMTIzLCAxLCAxNTIzIH0sCi17IDB4MywgMTI0LCAwLCAxNTIyIH0sCi17IDB4MTEsIDEyMywgMCwgMTUyOSB9LAoteyAweDksIDEyMywgMCwgMTUzMCB9LAoteyAweDUsIDEyMywgMCwgMTUzMSB9LAoteyAweDMsIDEyMywgMSwgMTUzMyB9LAoteyAweDEsIDEyNCwgMSwgMTUzMiB9LAoteyAweDEsIDkyLCAwLCAxMDcxIH0sCi17IDB4MSwgMTg5LCAwLCAxNTM0IH0sCi17IDB4MSwgMTQ3LCAwLCAxNTM1IH0sCi17IDB4MSwgMTA3LCAwLCAxNTM2IH0sCi17IDB4MSwgMTA2LCAwLCAxNTM3IH0sCi17IDB4NCwgMTg2LCAwLCAxNTM4IH0sCi17IDB4MiwgMTg2LCAwLCAxNTM5IH0sCi17IDB4MSwgMTg2LCAwLCAxNTQwIH0sCi17IDB4MSwgMTQ5LCAwLCAxNTQxIH0sCi17IDB4MiwgMTg3LCAwLCAxNTQyIH0sCi17IDB4MSwgMTg3LCAwLCAxNTQzIH0sCi17IDB4NCwgMTM3LCAwLCAxNTQ0IH0sCi17IDB4MiwgMTM3LCAwLCAxNTQ1IH0sCi17IDB4MSwgMTM3LCAwLCAxNTQ2IH0sCi17IDB4NCwgMTM0LCAwLCAxNTQ3IH0sCi17IDB4MSwgMTQyLCAwLCAxNTUwIH0sCi17IDB4MSwgMTQxLCAxLCAxNTUxIH0sCi17IDB4MiwgMTM0LCAwLCAxNTQ4IH0sCi17IDB4MSwgMTAwLCAwLCAxNTUyIH0sCi17IDB4MSwgMjQxLCAxLCAxNTUzIH0sCi17IDB4MSwgMTM0LCAwLCAxNTQ5IH0sCi17IDB4OCwgMTAyLCAwLCAxNTU0IH0sCi17IDB4NCwgMTAyLCAwLCAxNTU1IH0sCi17IDB4MiwgMTAyLCAwLCAxNTU2IH0sCi17IDB4MSwgMTAyLCAxLCAxNTU4IH0sCi17IDB4MSwgMTAzLCAwLCAxNTU3IH0sCi17IDB4OCwgMTA0LCAwLCAxNTU5IH0sCi17IDB4NCwgMTA0LCAwLCAxNTYwIH0sCi17IDB4MiwgMTA0LCAwLCAxNTYxIH0sCi17IDB4MSwgMTA0LCAxLCAxNTYzIH0sCi17IDB4MSwgMTA1LCAxLCAxNTYyIH0sCi17IDB4MSwgMzY3LCAwLCAxMDcyIH0sCi17IDB4OCwgMTMyLCAwLCAxNTY0IH0sCi17IDB4NCwgMTMyLCAwLCAxNTY1IH0sCi17IDB4MiwgMTMyLCAwLCAxNTY2IH0sCi17IDB4MSwgMTMyLCAxLCAxNTY4IH0sCi17IDB4MSwgMTMzLCAxLCAxNTY3IH0sCi17IDB4MSwgMzY2LCAwLCAxMDczIH0sCi17IDB4OCwgMTM1LCAwLCAxNTY5IH0sCi17IDB4NCwgMTM1LCAwLCAxNTcwIH0sCi17IDB4MiwgMTM1LCAwLCAxNTcxIH0sCi17IDB4MSwgMTM1LCAxLCAxNTczIH0sCi17IDB4MSwgMTM2LCAxLCAxNTcyIH0sCi17IDB4MSwgMzY1LCAwLCAxMDc0IH0sCi17IDB4OCwgMTgwLCAwLCAxNTc0IH0sCi17IDB4NCwgMTgwLCAwLCAxNTc1IH0sCi17IDB4MiwgMTgwLCAwLCAxNTc2IH0sCi17IDB4MSwgMTgwLCAxLCAxNTc4IH0sCi17IDB4MSwgMTgxLCAwLCAxNTc3IH0sCi17IDB4OCwgMTc4LCAwLCAxNTc5IH0sCi17IDB4NCwgMTc4LCAwLCAxNTgwIH0sCi17IDB4MiwgMTc4LCAwLCAxNTgxIH0sCi17IDB4MSwgMTc4LCAxLCAxNTgzIH0sCi17IDB4MSwgMTc5LCAwLCAxNTgyIH0sCi17IDB4OCwgNDIsIDAsIDE1ODggfSwKLXsgMHgxOCwgNDIsIDAsIDE1ODQgfSwKLXsgMHg0LCA0MiwgMCwgMTU4OSB9LAoteyAweGMsIDQyLCAwLCAxNTg1IH0sCi17IDB4MiwgNDIsIDAsIDE1OTAgfSwKLXsgMHg2LCA0MiwgMCwgMTU4NiB9LAoteyAweDEsIDQyLCAwLCAxNTkxIH0sCi17IDB4MywgNDIsIDAsIDE1ODcgfSwKLXsgMHg1MSwgMjgsIDAsIDE1OTMgfSwKLXsgMHhkMSwgMjgsIDAsIDE1OTIgfSwKLXsgMHgzMSwgMjgsIDEsIDE2MDMgfSwKLXsgMHgxMSwgMjksIDAsIDE2MDIgfSwKLXsgMHg3MSwgMjgsIDEsIDE2MDEgfSwKLXsgMHgzMSwgMjksIDAsIDE2MDAgfSwKLXsgMHgyOSwgMjgsIDAsIDE1OTUgfSwKLXsgMHg2OSwgMjgsIDAsIDE1OTQgfSwKLXsgMHgxOSwgMjgsIDEsIDE2MDcgfSwKLXsgMHg5LCAyOSwgMCwgMTYwNiB9LAoteyAweDM5LCAyOCwgMSwgMTYwNSB9LAoteyAweDE5LCAyOSwgMCwgMTYwNCB9LAoteyAweDE1LCAyOCwgMCwgMTU5NyB9LAoteyAweDM1LCAyOCwgMCwgMTU5NiB9LAoteyAweGQsIDI4LCAxLCAxNjExIH0sCi17IDB4NSwgMjksIDAsIDE2MTAgfSwKLXsgMHgxZCwgMjgsIDEsIDE2MDkgfSwKLXsgMHhkLCAyOSwgMCwgMTYwOCB9LAoteyAweGIsIDI4LCAwLCAxNTk5IH0sCi17IDB4MWIsIDI4LCAwLCAxNTk4IH0sCi17IDB4NywgMjgsIDEsIDE2MTUgfSwKLXsgMHgzLCAyOSwgMCwgMTYxNCB9LAoteyAweGYsIDI4LCAxLCAxNjEzIH0sCi17IDB4NywgMjksIDAsIDE2MTIgfSwKLXsgMHhhMiwgMjYsIDAsIDE2MTcgfSwKLXsgMHgxYTIsIDI2LCAwLCAxNjE2IH0sCi17IDB4NjIsIDI2LCAxLCAxNjI3IH0sCi17IDB4MjIsIDI3LCAwLCAxNjI2IH0sCi17IDB4ZTIsIDI2LCAxLCAxNjI1IH0sCi17IDB4NjIsIDI3LCAwLCAxNjI0IH0sCi17IDB4NTIsIDI2LCAwLCAxNjE5IH0sCi17IDB4ZDIsIDI2LCAwLCAxNjE4IH0sCi17IDB4MzIsIDI2LCAxLCAxNjMxIH0sCi17IDB4MTIsIDI3LCAwLCAxNjMwIH0sCi17IDB4NzIsIDI2LCAxLCAxNjI5IH0sCi17IDB4MzIsIDI3LCAwLCAxNjI4IH0sCi17IDB4MmEsIDI2LCAwLCAxNjIxIH0sCi17IDB4NmEsIDI2LCAwLCAxNjIwIH0sCi17IDB4MWEsIDI2LCAxLCAxNjM1IH0sCi17IDB4YSwgMjcsIDAsIDE2MzQgfSwKLXsgMHgzYSwgMjYsIDEsIDE2MzMgfSwKLXsgMHgxYSwgMjcsIDAsIDE2MzIgfSwKLXsgMHgxNiwgMjYsIDAsIDE2MjMgfSwKLXsgMHgzNiwgMjYsIDAsIDE2MjIgfSwKLXsgMHhlLCAyNiwgMSwgMTYzOSB9LAoteyAweDYsIDI3LCAwLCAxNjM4IH0sCi17IDB4MWUsIDI2LCAxLCAxNjM3IH0sCi17IDB4ZSwgMjcsIDAsIDE2MzYgfSwKLXsgMHg1MSwgMjYsIDAsIDE2NDEgfSwKLXsgMHhkMSwgMjYsIDAsIDE2NDAgfSwKLXsgMHgzMSwgMjYsIDEsIDE2NTEgfSwKLXsgMHgxMSwgMjcsIDAsIDE2NTAgfSwKLXsgMHg3MSwgMjYsIDEsIDE2NDkgfSwKLXsgMHgzMSwgMjcsIDAsIDE2NDggfSwKLXsgMHgyOSwgMjYsIDAsIDE2NDMgfSwKLXsgMHg2OSwgMjYsIDAsIDE2NDIgfSwKLXsgMHgxOSwgMjYsIDEsIDE2NTUgfSwKLXsgMHg5LCAyNywgMCwgMTY1NCB9LAoteyAweDM5LCAyNiwgMSwgMTY1MyB9LAoteyAweDE5LCAyNywgMCwgMTY1MiB9LAoteyAweDE1LCAyNiwgMCwgMTY0NSB9LAoteyAweDM1LCAyNiwgMCwgMTY0NCB9LAoteyAweGQsIDI2LCAxLCAxNjU5IH0sCi17IDB4NSwgMjcsIDAsIDE2NTggfSwKLXsgMHgxZCwgMjYsIDEsIDE2NTcgfSwKLXsgMHhkLCAyNywgMCwgMTY1NiB9LAoteyAweGIsIDI2LCAwLCAxNjQ3IH0sCi17IDB4MWIsIDI2LCAwLCAxNjQ2IH0sCi17IDB4NywgMjYsIDEsIDE2NjMgfSwKLXsgMHgzLCAyNywgMCwgMTY2MiB9LAoteyAweGYsIDI2LCAxLCAxNjYxIH0sCi17IDB4NywgMjcsIDAsIDE2NjAgfSwKLXsgMHg1MSwgMjQsIDAsIDE2NjUgfSwKLXsgMHhkMSwgMjQsIDAsIDE2NjQgfSwKLXsgMHgzMSwgMjQsIDEsIDE2NzUgfSwKLXsgMHgxMSwgMjUsIDAsIDE2NzQgfSwKLXsgMHg3MSwgMjQsIDEsIDE2NzMgfSwKLXsgMHgzMSwgMjUsIDAsIDE2NzIgfSwKLXsgMHgyOSwgMjQsIDAsIDE2NjcgfSwKLXsgMHg2OSwgMjQsIDAsIDE2NjYgfSwKLXsgMHgxOSwgMjQsIDEsIDE2NzkgfSwKLXsgMHg5LCAyNSwgMCwgMTY3OCB9LAoteyAweDM5LCAyNCwgMSwgMTY3NyB9LAoteyAweDE5LCAyNSwgMCwgMTY3NiB9LAoteyAweDE1LCAyNCwgMCwgMTY2OSB9LAoteyAweDM1LCAyNCwgMCwgMTY2OCB9LAoteyAweGQsIDI0LCAxLCAxNjgzIH0sCi17IDB4NSwgMjUsIDAsIDE2ODIgfSwKLXsgMHgxZCwgMjQsIDEsIDE2ODEgfSwKLXsgMHhkLCAyNSwgMCwgMTY4MCB9LAoteyAweGIsIDI0LCAwLCAxNjcxIH0sCi17IDB4MWIsIDI0LCAwLCAxNjcwIH0sCi17IDB4NywgMjQsIDEsIDE2ODcgfSwKLXsgMHgzLCAyNSwgMCwgMTY4NiB9LAoteyAweGYsIDI0LCAxLCAxNjg1IH0sCi17IDB4NywgMjUsIDAsIDE2ODQgfSwKLXsgMHhhMiwgMjIsIDAsIDE2ODkgfSwKLXsgMHgxYTIsIDIyLCAwLCAxNjg4IH0sCi17IDB4NjIsIDIyLCAxLCAxNjk5IH0sCi17IDB4MjIsIDIzLCAwLCAxNjk4IH0sCi17IDB4ZTIsIDIyLCAxLCAxNjk3IH0sCi17IDB4NjIsIDIzLCAwLCAxNjk2IH0sCi17IDB4NTIsIDIyLCAwLCAxNjkxIH0sCi17IDB4ZDIsIDIyLCAwLCAxNjkwIH0sCi17IDB4MzIsIDIyLCAxLCAxNzAzIH0sCi17IDB4MTIsIDIzLCAwLCAxNzAyIH0sCi17IDB4NzIsIDIyLCAxLCAxNzAxIH0sCi17IDB4MzIsIDIzLCAwLCAxNzAwIH0sCi17IDB4MmEsIDIyLCAwLCAxNjkzIH0sCi17IDB4NmEsIDIyLCAwLCAxNjkyIH0sCi17IDB4MWEsIDIyLCAxLCAxNzA3IH0sCi17IDB4YSwgMjMsIDAsIDE3MDYgfSwKLXsgMHgzYSwgMjIsIDEsIDE3MDUgfSwKLXsgMHgxYSwgMjMsIDAsIDE3MDQgfSwKLXsgMHgxNiwgMjIsIDAsIDE2OTUgfSwKLXsgMHgzNiwgMjIsIDAsIDE2OTQgfSwKLXsgMHhlLCAyMiwgMSwgMTcxMSB9LAoteyAweDYsIDIzLCAwLCAxNzEwIH0sCi17IDB4MWUsIDIyLCAxLCAxNzA5IH0sCi17IDB4ZSwgMjMsIDAsIDE3MDggfSwKLXsgMHg1MSwgMjIsIDAsIDE3MTMgfSwKLXsgMHhkMSwgMjIsIDAsIDE3MTIgfSwKLXsgMHgzMSwgMjIsIDEsIDE3MjMgfSwKLXsgMHgxMSwgMjMsIDAsIDE3MjIgfSwKLXsgMHg3MSwgMjIsIDEsIDE3MjEgfSwKLXsgMHgzMSwgMjMsIDAsIDE3MjAgfSwKLXsgMHgyOSwgMjIsIDAsIDE3MTUgfSwKLXsgMHg2OSwgMjIsIDAsIDE3MTQgfSwKLXsgMHgxOSwgMjIsIDEsIDE3MjcgfSwKLXsgMHg5LCAyMywgMCwgMTcyNiB9LAoteyAweDM5LCAyMiwgMSwgMTcyNSB9LAoteyAweDE5LCAyMywgMCwgMTcyNCB9LAoteyAweDE1LCAyMiwgMCwgMTcxNyB9LAoteyAweDM1LCAyMiwgMCwgMTcxNiB9LAoteyAweGQsIDIyLCAxLCAxNzMxIH0sCi17IDB4NSwgMjMsIDAsIDE3MzAgfSwKLXsgMHgxZCwgMjIsIDEsIDE3MjkgfSwKLXsgMHhkLCAyMywgMCwgMTcyOCB9LAoteyAweGIsIDIyLCAwLCAxNzE5IH0sCi17IDB4MWIsIDIyLCAwLCAxNzE4IH0sCi17IDB4NywgMjIsIDEsIDE3MzUgfSwKLXsgMHgzLCAyMywgMCwgMTczNCB9LAoteyAweGYsIDIyLCAxLCAxNzMzIH0sCi17IDB4NywgMjMsIDAsIDE3MzIgfSwKLXsgMHg1MSwgMjAsIDEsIDE3NjEgfSwKLXsgMHg1MCwgMjAsIDAsIDE3MzcgfSwKLXsgMHhkMSwgMjAsIDEsIDE3NjAgfSwKLXsgMHhkMCwgMjAsIDAsIDE3MzYgfSwKLXsgMHgzMSwgMjAsIDEsIDE3NzEgfSwKLXsgMHgzMCwgMjAsIDEsIDE3NDcgfSwKLXsgMHgxMSwgMjEsIDEsIDE3NzAgfSwKLXsgMHgxMCwgMjEsIDAsIDE3NDYgfSwKLXsgMHg3MSwgMjAsIDEsIDE3NjkgfSwKLXsgMHg3MCwgMjAsIDEsIDE3NDUgfSwKLXsgMHgzMSwgMjEsIDEsIDE3NjggfSwKLXsgMHgzMCwgMjEsIDAsIDE3NDQgfSwKLXsgMHgyOSwgMjAsIDEsIDE3NjMgfSwKLXsgMHgyOCwgMjAsIDAsIDE3MzkgfSwKLXsgMHg2OSwgMjAsIDEsIDE3NjIgfSwKLXsgMHg2OCwgMjAsIDAsIDE3MzggfSwKLXsgMHgxOSwgMjAsIDEsIDE3NzUgfSwKLXsgMHgxOCwgMjAsIDEsIDE3NTEgfSwKLXsgMHg5LCAyMSwgMSwgMTc3NCB9LAoteyAweDgsIDIxLCAwLCAxNzUwIH0sCi17IDB4MzksIDIwLCAxLCAxNzczIH0sCi17IDB4MzgsIDIwLCAxLCAxNzQ5IH0sCi17IDB4MTksIDIxLCAxLCAxNzcyIH0sCi17IDB4MTgsIDIxLCAwLCAxNzQ4IH0sCi17IDB4MTUsIDIwLCAxLCAxNzY1IH0sCi17IDB4MTQsIDIwLCAwLCAxNzQxIH0sCi17IDB4MzUsIDIwLCAxLCAxNzY0IH0sCi17IDB4MzQsIDIwLCAwLCAxNzQwIH0sCi17IDB4ZCwgMjAsIDEsIDE3NzkgfSwKLXsgMHhjLCAyMCwgMSwgMTc1NSB9LAoteyAweDUsIDIxLCAxLCAxNzc4IH0sCi17IDB4NCwgMjEsIDAsIDE3NTQgfSwKLXsgMHgxZCwgMjAsIDEsIDE3NzcgfSwKLXsgMHgxYywgMjAsIDEsIDE3NTMgfSwKLXsgMHhkLCAyMSwgMSwgMTc3NiB9LAoteyAweGMsIDIxLCAwLCAxNzUyIH0sCi17IDB4YiwgMjAsIDEsIDE3NjcgfSwKLXsgMHhhLCAyMCwgMCwgMTc0MyB9LAoteyAweDFiLCAyMCwgMSwgMTc2NiB9LAoteyAweDFhLCAyMCwgMCwgMTc0MiB9LAoteyAweDcsIDIwLCAxLCAxNzgzIH0sCi17IDB4NiwgMjAsIDEsIDE3NTkgfSwKLXsgMHgzLCAyMSwgMSwgMTc4MiB9LAoteyAweDIsIDIxLCAwLCAxNzU4IH0sCi17IDB4ZiwgMjAsIDEsIDE3ODEgfSwKLXsgMHhlLCAyMCwgMSwgMTc1NyB9LAoteyAweDcsIDIxLCAxLCAxNzgwIH0sCi17IDB4NiwgMjEsIDAsIDE3NTYgfSwKLXsgMHg4LCAxOSwgMCwgMTc4NSB9LAoteyAweDE4LCAxOSwgMCwgMTc4NCB9LAoteyAweDEsIDE5LCAxLCAxNzg5IH0sCi17IDB4MiwgMTksIDAsIDE3ODggfSwKLXsgMHgzLCAxOSwgMSwgMTc4NyB9LAoteyAweDQsIDE5LCAwLCAxNzg2IH0sCi17IDB4MSwgMjgyLCAwLCAxNzkwIH0sCi17IDB4MTQsIDQxLCAwLCAxNzkzIH0sCi17IDB4MzQsIDQxLCAwLCAxNzkxIH0sCi17IDB4YywgNDEsIDAsIDE3OTQgfSwKLXsgMHgxYywgNDEsIDAsIDE3OTIgfSwKLXsgMHgyLCA0MSwgMCwgMTc5NyB9LAoteyAweDYsIDQxLCAwLCAxNzk1IH0sCi17IDB4MSwgNDEsIDAsIDE3OTggfSwKLXsgMHgzLCA0MSwgMCwgMTc5NiB9LAoteyAweDUxLCAxNywgMCwgMTgwMCB9LAoteyAweGQxLCAxNywgMCwgMTc5OSB9LAoteyAweDMxLCAxNywgMSwgMTgxMCB9LAoteyAweDExLCAxOCwgMCwgMTgwOSB9LAoteyAweDcxLCAxNywgMSwgMTgwOCB9LAoteyAweDMxLCAxOCwgMCwgMTgwNyB9LAoteyAweDI5LCAxNywgMCwgMTgwMiB9LAoteyAweDY5LCAxNywgMCwgMTgwMSB9LAoteyAweDE5LCAxNywgMSwgMTgxNCB9LAoteyAweDksIDE4LCAwLCAxODEzIH0sCi17IDB4MzksIDE3LCAxLCAxODEyIH0sCi17IDB4MTksIDE4LCAwLCAxODExIH0sCi17IDB4MTUsIDE3LCAwLCAxODA0IH0sCi17IDB4MzUsIDE3LCAwLCAxODAzIH0sCi17IDB4ZCwgMTcsIDEsIDE4MTggfSwKLXsgMHg1LCAxOCwgMCwgMTgxNyB9LAoteyAweDFkLCAxNywgMSwgMTgxNiB9LAoteyAweGQsIDE4LCAwLCAxODE1IH0sCi17IDB4YiwgMTcsIDAsIDE4MDYgfSwKLXsgMHgxYiwgMTcsIDAsIDE4MDUgfSwKLXsgMHg3LCAxNywgMSwgMTgyMiB9LAoteyAweDMsIDE4LCAwLCAxODIxIH0sCi17IDB4ZiwgMTcsIDEsIDE4MjAgfSwKLXsgMHg3LCAxOCwgMCwgMTgxOSB9LAoteyAweDEsIDMwLCAwLCAxODIzIH0sCi17IDB4MSwgOTgsIDAsIDE4MjQgfSwKLXsgMHgyLCA0MywgMCwgMTgyNSB9LAoteyAweDEsIDQzLCAwLCAxODI2IH0sCi17IDB4MSwgMzMwLCAwLCAxODI3IH0sCi17IDB4MiwgNTAsIDAsIDE4MjggfSwKLXsgMHgxLCA1MCwgMCwgMTgyOSB9LAoteyAweDEsIDkxLCAwLCAxODMwIH0sCi17IDB4NTEsIDE1LCAwLCAxODMyIH0sCi17IDB4ZDEsIDE1LCAwLCAxODMxIH0sCi17IDB4MzEsIDE1LCAxLCAxODQyIH0sCi17IDB4MTEsIDE2LCAwLCAxODQxIH0sCi17IDB4NzEsIDE1LCAxLCAxODQwIH0sCi17IDB4MzEsIDE2LCAwLCAxODM5IH0sCi17IDB4MjksIDE1LCAwLCAxODM0IH0sCi17IDB4NjksIDE1LCAwLCAxODMzIH0sCi17IDB4MTksIDE1LCAxLCAxODQ2IH0sCi17IDB4OSwgMTYsIDAsIDE4NDUgfSwKLXsgMHgzOSwgMTUsIDEsIDE4NDQgfSwKLXsgMHgxOSwgMTYsIDAsIDE4NDMgfSwKLXsgMHgxNSwgMTUsIDAsIDE4MzYgfSwKLXsgMHgzNSwgMTUsIDAsIDE4MzUgfSwKLXsgMHhkLCAxNSwgMSwgMTg1MCB9LAoteyAweDUsIDE2LCAwLCAxODQ5IH0sCi17IDB4MWQsIDE1LCAxLCAxODQ4IH0sCi17IDB4ZCwgMTYsIDAsIDE4NDcgfSwKLXsgMHhiLCAxNSwgMCwgMTgzOCB9LAoteyAweDFiLCAxNSwgMCwgMTgzNyB9LAoteyAweDcsIDE1LCAxLCAxODU0IH0sCi17IDB4MywgMTYsIDAsIDE4NTMgfSwKLXsgMHhmLCAxNSwgMSwgMTg1MiB9LAoteyAweDcsIDE2LCAwLCAxODUxIH0sCi17IDB4YTIwLCAxMywgMCwgMTg1NiB9LAoteyAweDFhMjAsIDEzLCAwLCAxODU1IH0sCi17IDB4NjIwLCAxMywgMSwgMTg2NiB9LAoteyAweDIyMCwgMTQsIDAsIDE4NjUgfSwKLXsgMHhlMjAsIDEzLCAxLCAxODY0IH0sCi17IDB4NjIwLCAxNCwgMCwgMTg2MyB9LAoteyAweDUyMCwgMTMsIDAsIDE4NTggfSwKLXsgMHhkMjAsIDEzLCAwLCAxODU3IH0sCi17IDB4MzIwLCAxMywgMSwgMTg3MCB9LAoteyAweDEyMCwgMTQsIDAsIDE4NjkgfSwKLXsgMHg3MjAsIDEzLCAxLCAxODY4IH0sCi17IDB4MzIwLCAxNCwgMCwgMTg2NyB9LAoteyAweDJhMCwgMTMsIDAsIDE4NjAgfSwKLXsgMHg2YTAsIDEzLCAwLCAxODU5IH0sCi17IDB4MWEwLCAxMywgMSwgMTg3NCB9LAoteyAweGEwLCAxNCwgMCwgMTg3MyB9LAoteyAweDNhMCwgMTMsIDEsIDE4NzIgfSwKLXsgMHgxYTAsIDE0LCAwLCAxODcxIH0sCi17IDB4MTYwLCAxMywgMCwgMTg2MiB9LAoteyAweDM2MCwgMTMsIDAsIDE4NjEgfSwKLXsgMHhlMCwgMTMsIDEsIDE4NzggfSwKLXsgMHg2MCwgMTQsIDAsIDE4NzcgfSwKLXsgMHgxZTAsIDEzLCAxLCAxODc2IH0sCi17IDB4ZTAsIDE0LCAwLCAxODc1IH0sCi17IDB4NTEsIDEzLCAxLCAxOTA0IH0sCi17IDB4NTAsIDEzLCAwLCAxODgwIH0sCi17IDB4ZDEsIDEzLCAxLCAxOTAzIH0sCi17IDB4ZDAsIDEzLCAwLCAxODc5IH0sCi17IDB4MzEsIDEzLCAxLCAxOTE0IH0sCi17IDB4MzAsIDEzLCAxLCAxODkwIH0sCi17IDB4MTEsIDE0LCAxLCAxOTEzIH0sCi17IDB4MTAsIDE0LCAwLCAxODg5IH0sCi17IDB4NzEsIDEzLCAxLCAxOTEyIH0sCi17IDB4NzAsIDEzLCAxLCAxODg4IH0sCi17IDB4MzEsIDE0LCAxLCAxOTExIH0sCi17IDB4MzAsIDE0LCAwLCAxODg3IH0sCi17IDB4MjksIDEzLCAxLCAxOTA2IH0sCi17IDB4MjgsIDEzLCAwLCAxODgyIH0sCi17IDB4NjksIDEzLCAxLCAxOTA1IH0sCi17IDB4NjgsIDEzLCAwLCAxODgxIH0sCi17IDB4MTksIDEzLCAxLCAxOTE4IH0sCi17IDB4MTgsIDEzLCAxLCAxODk0IH0sCi17IDB4OSwgMTQsIDEsIDE5MTcgfSwKLXsgMHg4LCAxNCwgMCwgMTg5MyB9LAoteyAweDM5LCAxMywgMSwgMTkxNiB9LAoteyAweDM4LCAxMywgMSwgMTg5MiB9LAoteyAweDE5LCAxNCwgMSwgMTkxNSB9LAoteyAweDE4LCAxNCwgMCwgMTg5MSB9LAoteyAweDE1LCAxMywgMSwgMTkwOCB9LAoteyAweDE0LCAxMywgMCwgMTg4NCB9LAoteyAweDM1LCAxMywgMSwgMTkwNyB9LAoteyAweDM0LCAxMywgMCwgMTg4MyB9LAoteyAweGQsIDEzLCAxLCAxOTIyIH0sCi17IDB4YywgMTMsIDEsIDE4OTggfSwKLXsgMHg1LCAxNCwgMSwgMTkyMSB9LAoteyAweDQsIDE0LCAwLCAxODk3IH0sCi17IDB4MWQsIDEzLCAxLCAxOTIwIH0sCi17IDB4MWMsIDEzLCAxLCAxODk2IH0sCi17IDB4ZCwgMTQsIDEsIDE5MTkgfSwKLXsgMHhjLCAxNCwgMCwgMTg5NSB9LAoteyAweGIsIDEzLCAxLCAxOTEwIH0sCi17IDB4YSwgMTMsIDAsIDE4ODYgfSwKLXsgMHgxYiwgMTMsIDEsIDE5MDkgfSwKLXsgMHgxYSwgMTMsIDAsIDE4ODUgfSwKLXsgMHg3LCAxMywgMSwgMTkyNiB9LAoteyAweDYsIDEzLCAxLCAxOTAyIH0sCi17IDB4MywgMTQsIDEsIDE5MjUgfSwKLXsgMHgyLCAxNCwgMCwgMTkwMSB9LAoteyAweGYsIDEzLCAxLCAxOTI0IH0sCi17IDB4ZSwgMTMsIDEsIDE5MDAgfSwKLXsgMHg3LCAxNCwgMSwgMTkyMyB9LAoteyAweDYsIDE0LCAwLCAxODk5IH0sCi17IDB4OCwgMTIsIDAsIDE5MjggfSwKLXsgMHgxOCwgMTIsIDAsIDE5MjcgfSwKLXsgMHgxLCAxMiwgMSwgMTkzMiB9LAoteyAweDIsIDEyLCAwLCAxOTMxIH0sCi17IDB4MywgMTIsIDEsIDE5MzAgfSwKLXsgMHg0LCAxMiwgMCwgMTkyOSB9LAoteyAweDEsIDgwLCAxLCAxOTkyIH0sCi17IDB4MSwgODEsIDEsIDE5OTEgfSwKLXsgMHgxLCA4MiwgMSwgMTk5MCB9LAoteyAweDEsIDgzLCAxLCAxOTg5IH0sCi17IDB4MzksIDM5LCAxLCAyMCB9LAoteyAweDE5LCA0MCwgMCwgMTkgfSwKLXsgMHgzLCA4MCwgMSwgMTk4OCB9LAoteyAweDMsIDgxLCAxLCAxOTg3IH0sCi17IDB4MywgODIsIDEsIDE5ODYgfSwKLXsgMHgzLCA4MywgMSwgMTk4NSB9LAoteyAweDY5LCAzOSwgMCwgOSB9LAoteyAweDE0LCA3NSwgMSwgMTk4MiB9LAoteyAweGEsIDc5LCAxLCAxOTgxIH0sCi17IDB4ZDEsIDM5LCAwLCA3IH0sCi17IDB4MzQsIDc1LCAxLCAxOTM0IH0sCi17IDB4ZSwgODYsIDAsIDE5MzMgfSwKLXsgMHhjLCA3NSwgMSwgMjA0NiB9LAoteyAweDYsIDc5LCAwLCAyMDQ1IH0sCi17IDB4MiwgNzUsIDEsIDE5NDAgfSwKLXsgMHgyLCA3OCwgMCwgMTkzOSB9LAoteyAweDEyLCA3NSwgMSwgMTkzOCB9LAoteyAweDYsIDc4LCAwLCAxOTM3IH0sCi17IDB4YSwgNzUsIDEsIDE5ODQgfSwKLXsgMHg1LCA3OSwgMSwgMTk4MyB9LAoteyAweDcxLCAzOSwgMSwgMTYgfSwKLXsgMHgzMSwgNDAsIDAsIDE1IH0sCi17IDB4MWEsIDc1LCAxLCAxOTM2IH0sCi17IDB4NywgODYsIDAsIDE5MzUgfSwKLXsgMHg2LCA3NSwgMSwgMjA0OCB9LAoteyAweDMsIDc5LCAwLCAyMDQ3IH0sCi17IDB4MSwgNzUsIDEsIDIwNTYgfSwKLXsgMHgxLCA3NiwgMSwgMjA1NSB9LAoteyAweDEsIDc3LCAxLCAyMDU0IH0sCi17IDB4MSwgNzgsIDAsIDIwNTMgfSwKLXsgMHgzLCA3NSwgMSwgMjA1MiB9LAoteyAweDMsIDc2LCAxLCAyMDUxIH0sCi17IDB4MywgNzcsIDEsIDIwNTAgfSwKLXsgMHgzLCA3OCwgMCwgMjA0OSB9LAoteyAweDgsIDU4LCAxLCAyMDA0IH0sCi17IDB4MiwgNjEsIDEsIDIwMDEgfSwKLXsgMHgxLCA2MywgMSwgMjAwMyB9LAoteyAweDEsIDY0LCAxLCAyMDAyIH0sCi17IDB4ZiwgMzksIDEsIDI4IH0sCi17IDB4NywgNDAsIDAsIDI3IH0sCi17IDB4MTgsIDU4LCAxLCAyMDAwIH0sCi17IDB4NiwgNjEsIDEsIDE5OTcgfSwKLXsgMHgzLCA2MywgMSwgMTk5OSB9LAoteyAweDMsIDY0LCAxLCAxOTk4IH0sCi17IDB4MWIsIDM5LCAwLCAxMyB9LAoteyAweDE0LCA1OCwgMSwgMTk5NCB9LAoteyAweGEsIDYyLCAxLCAxOTkzIH0sCi17IDB4MzUsIDM5LCAwLCAxMSB9LAoteyAweDM0LCA1OCwgMSwgMTk0MiB9LAoteyAweGUsIDY3LCAwLCAxOTQxIH0sCi17IDB4YywgNTgsIDEsIDIwNTggfSwKLXsgMHg2LCA2MiwgMCwgMjA1NyB9LAoteyAweDIsIDU4LCAxLCAxOTQ4IH0sCi17IDB4NCwgNjEsIDAsIDE5NDcgfSwKLXsgMHgxMiwgNTgsIDEsIDE5NDYgfSwKLXsgMHhjLCA2MSwgMCwgMTk0NSB9LAoteyAweGEsIDU4LCAxLCAxOTk2IH0sCi17IDB4NSwgNjIsIDEsIDE5OTUgfSwKLXsgMHgxZCwgMzksIDEsIDI0IH0sCi17IDB4ZCwgNDAsIDAsIDIzIH0sCi17IDB4MWEsIDU4LCAxLCAxOTQ0IH0sCi17IDB4NywgNjcsIDAsIDE5NDMgfSwKLXsgMHg2LCA1OCwgMSwgMjA2MCB9LAoteyAweDMsIDYyLCAwLCAyMDU5IH0sCi17IDB4MSwgNTgsIDEsIDIwNjggfSwKLXsgMHgxLCA1OSwgMSwgMjA2NyB9LAoteyAweDEsIDYwLCAxLCAyMDY2IH0sCi17IDB4MSwgNjEsIDAsIDIwNjUgfSwKLXsgMHgzLCA1OCwgMSwgMjA2NCB9LAoteyAweDMsIDU5LCAxLCAyMDYzIH0sCi17IDB4MywgNjAsIDEsIDIwNjIgfSwKLXsgMHgzLCA2MSwgMCwgMjA2MSB9LAoteyAweDI4LCA3MywgMSwgMjAwNiB9LAoteyAweDI4LCA3NCwgMCwgMjAwNSB9LAoteyAweDY4LCA3MywgMSwgMTk1MCB9LAoteyAweDM4LCA4NSwgMCwgMTk0OSB9LAoteyAweDE4LCA3MywgMSwgMjA3MCB9LAoteyAweDE4LCA3NCwgMCwgMjA2OSB9LAoteyAweDE0LCA3MywgMSwgMjAwOCB9LAoteyAweDE0LCA3NCwgMCwgMjAwNyB9LAoteyAweDM0LCA3MywgMSwgMTk1MiB9LAoteyAweDFjLCA4NSwgMCwgMTk1MSB9LAoteyAweGMsIDczLCAxLCAyMDcyIH0sCi17IDB4YywgNzQsIDAsIDIwNzEgfSwKLXsgMHhhLCA3MywgMSwgMjAxMCB9LAoteyAweGEsIDc0LCAwLCAyMDA5IH0sCi17IDB4MWEsIDczLCAxLCAxOTU0IH0sCi17IDB4ZSwgODUsIDAsIDE5NTMgfSwKLXsgMHg2LCA3MywgMSwgMjA3NCB9LAoteyAweDYsIDc0LCAwLCAyMDczIH0sCi17IDB4NSwgNzMsIDEsIDIwMTIgfSwKLXsgMHg1LCA3NCwgMCwgMjAxMSB9LAoteyAweGQsIDczLCAxLCAxOTU2IH0sCi17IDB4NywgODUsIDAsIDE5NTUgfSwKLXsgMHgzLCA3MywgMSwgMjA3NiB9LAoteyAweDMsIDc0LCAwLCAyMDc1IH0sCi17IDB4MjgsIDU2LCAxLCAyMDE0IH0sCi17IDB4MjgsIDU3LCAwLCAyMDEzIH0sCi17IDB4NjgsIDU2LCAxLCAxOTU4IH0sCi17IDB4MzgsIDY2LCAwLCAxOTU3IH0sCi17IDB4MTgsIDU2LCAxLCAyMDc4IH0sCi17IDB4MTgsIDU3LCAwLCAyMDc3IH0sCi17IDB4MTQsIDU2LCAxLCAyMDE2IH0sCi17IDB4MTQsIDU3LCAwLCAyMDE1IH0sCi17IDB4MzQsIDU2LCAxLCAxOTYwIH0sCi17IDB4MWMsIDY2LCAwLCAxOTU5IH0sCi17IDB4YywgNTYsIDEsIDIwODAgfSwKLXsgMHhjLCA1NywgMCwgMjA3OSB9LAoteyAweGEsIDU2LCAxLCAyMDE4IH0sCi17IDB4YSwgNTcsIDAsIDIwMTcgfSwKLXsgMHgxYSwgNTYsIDEsIDE5NjIgfSwKLXsgMHhlLCA2NiwgMCwgMTk2MSB9LAoteyAweDYsIDU2LCAxLCAyMDgyIH0sCi17IDB4NiwgNTcsIDAsIDIwODEgfSwKLXsgMHg1LCA1NiwgMSwgMjAyMCB9LAoteyAweDUsIDU3LCAwLCAyMDE5IH0sCi17IDB4ZCwgNTYsIDEsIDE5NjQgfSwKLXsgMHg3LCA2NiwgMCwgMTk2MyB9LAoteyAweDMsIDU2LCAxLCAyMDg0IH0sCi17IDB4MywgNTcsIDAsIDIwODMgfSwKLXsgMHg4LCA2OCwgMSwgMjAzMiB9LAoteyAweDIsIDY5LCAxLCAyMDMxIH0sCi17IDB4MiwgNzAsIDEsIDIwMzAgfSwKLXsgMHgyLCA3MSwgMCwgMjAyOSB9LAoteyAweDE4LCA2OCwgMSwgMjAyOCB9LAoteyAweDYsIDY5LCAxLCAyMDI3IH0sCi17IDB4NiwgNzAsIDEsIDIwMjYgfSwKLXsgMHg2LCA3MSwgMCwgMjAyNSB9LAoteyAweDE0LCA2OCwgMSwgMjAyMiB9LAoteyAweGEsIDcyLCAwLCAyMDIxIH0sCi17IDB4MzQsIDY4LCAxLCAxOTY2IH0sCi17IDB4ZSwgODQsIDAsIDE5NjUgfSwKLXsgMHhjLCA2OCwgMSwgMjA4NiB9LAoteyAweDYsIDcyLCAwLCAyMDg1IH0sCi17IDB4MiwgNjgsIDEsIDE5NzIgfSwKLXsgMHg0LCA3MSwgMCwgMTk3MSB9LAoteyAweDEyLCA2OCwgMSwgMTk3MCB9LAoteyAweGMsIDcxLCAwLCAxOTY5IH0sCi17IDB4YSwgNjgsIDEsIDIwMjQgfSwKLXsgMHg1LCA3MiwgMCwgMjAyMyB9LAoteyAweDFhLCA2OCwgMSwgMTk2OCB9LAoteyAweDcsIDg0LCAwLCAxOTY3IH0sCi17IDB4NiwgNjgsIDEsIDIwODggfSwKLXsgMHgzLCA3MiwgMCwgMjA4NyB9LAoteyAweDEsIDY4LCAxLCAyMDk2IH0sCi17IDB4MSwgNjksIDEsIDIwOTUgfSwKLXsgMHgxLCA3MCwgMSwgMjA5NCB9LAoteyAweDEsIDcxLCAwLCAyMDkzIH0sCi17IDB4MywgNjgsIDEsIDIwOTIgfSwKLXsgMHgzLCA2OSwgMSwgMjA5MSB9LAoteyAweDMsIDcwLCAxLCAyMDkwIH0sCi17IDB4MywgNzEsIDAsIDIwODkgfSwKLXsgMHg4LCA1MSwgMSwgMjA0NCB9LAoteyAweDIsIDUyLCAxLCAyMDQzIH0sCi17IDB4MiwgNTMsIDEsIDIwNDIgfSwKLXsgMHgyLCA1NCwgMCwgMjA0MSB9LAoteyAweDE4LCA1MSwgMSwgMjA0MCB9LAoteyAweDYsIDUyLCAxLCAyMDM5IH0sCi17IDB4NiwgNTMsIDEsIDIwMzggfSwKLXsgMHg2LCA1NCwgMCwgMjAzNyB9LAoteyAweDE0LCA1MSwgMSwgMjAzNCB9LAoteyAweGEsIDU1LCAwLCAyMDMzIH0sCi17IDB4MzQsIDUxLCAxLCAxOTc0IH0sCi17IDB4ZSwgNjUsIDAsIDE5NzMgfSwKLXsgMHhjLCA1MSwgMSwgMjA5OCB9LAoteyAweDYsIDU1LCAwLCAyMDk3IH0sCi17IDB4MiwgNTEsIDEsIDE5ODAgfSwKLXsgMHg0LCA1NCwgMCwgMTk3OSB9LAoteyAweDEyLCA1MSwgMSwgMTk3OCB9LAoteyAweGMsIDU0LCAwLCAxOTc3IH0sCi17IDB4YSwgNTEsIDEsIDIwMzYgfSwKLXsgMHg1LCA1NSwgMCwgMjAzNSB9LAoteyAweDFhLCA1MSwgMSwgMTk3NiB9LAoteyAweDcsIDY1LCAwLCAxOTc1IH0sCi17IDB4NiwgNTEsIDEsIDIxMDAgfSwKLXsgMHgzLCA1NSwgMCwgMjA5OSB9LAoteyAweDEsIDUxLCAxLCAyMTA4IH0sCi17IDB4MSwgNTIsIDEsIDIxMDcgfSwKLXsgMHgxLCA1MywgMSwgMjEwNiB9LAoteyAweDEsIDU0LCAwLCAyMTA1IH0sCi17IDB4MywgNTEsIDEsIDIxMDQgfSwKLXsgMHgzLCA1MiwgMSwgMjEwMyB9LAoteyAweDMsIDUzLCAxLCAyMTAyIH0sCi17IDB4MywgNTQsIDAsIDIxMDEgfSwKLXsgMHgxLCAzLCAwLCAyMTA5IH0sCi17IDB4MSwgMjQwLCAwLCAyMTEwIH0sCi17IDB4MSwgMzIyLCAwLCAyMTExIH0sCi17IDB4MSwgMzE3LCAwLCAyMTEyIH0sCi17IDB4MiwgMzAxLCAwLCAyMTEzIH0sCi17IDB4MSwgMzAxLCAwLCAyMTE2IH0sCi17IDB4MiwgMzAwLCAwLCAyMTE0IH0sCi17IDB4MSwgMzAwLCAwLCAyMTE3IH0sCi17IDB4MiwgMjk5LCAwLCAyMTE1IH0sCi17IDB4MSwgMjk5LCAwLCAyMTE4IH0sCi17IDB4MSwgMjk4LCAwLCAyMTE5IH0sCi17IDB4MSwgMjk3LCAwLCAyMTIwIH0sCi17IDB4MiwgMjk2LCAwLCAyMTIxIH0sCi17IDB4MSwgMjk2LCAwLCAyMTIzIH0sCi17IDB4MiwgMjk1LCAwLCAyMTIyIH0sCi17IDB4MSwgMjk1LCAwLCAyMTI0IH0sCi17IDB4MSwgMzI1LCAwLCAyMTMxIH0sCi17IDB4OCwgMzI0LCAwLCAyMTI1IH0sCi17IDB4NCwgMzI0LCAwLCAyMTI3IH0sCi17IDB4MiwgMzI0LCAwLCAyMTI5IH0sCi17IDB4MSwgMzI0LCAwLCAyMTMyIH0sCi17IDB4OCwgMzIzLCAwLCAyMTI2IH0sCi17IDB4NCwgMzIzLCAwLCAyMTI4IH0sCi17IDB4MiwgMzIzLCAwLCAyMTMwIH0sCi17IDB4MSwgMzIzLCAwLCAyMTMzIH0sCi17IDB4MSwgMjk0LCAwLCAyMTQwIH0sCi17IDB4OCwgMjkzLCAwLCAyMTM0IH0sCi17IDB4NCwgMjkzLCAwLCAyMTM2IH0sCi17IDB4MiwgMjkzLCAwLCAyMTM4IH0sCi17IDB4MSwgMjkzLCAwLCAyMTQxIH0sCi17IDB4OCwgMjkyLCAwLCAyMTM1IH0sCi17IDB4NCwgMjkyLCAwLCAyMTM3IH0sCi17IDB4MiwgMjkyLCAxLCAyMTM5IH0sCi17IDB4NCwgMTAxLCAwLCAxMjUzIH0sCi17IDB4MSwgMjkyLCAwLCAyMTQyIH0sCi17IDB4MSwgNSwgMCwgMjE0MyB9LAoteyAweDEsIDYsIDAsIDIxNDQgfSwKLXsgMHgxLCAyMzksIDAsIDIxNDUgfSwKLXsgMHgxLCAyMzgsIDAsIDIxNDYgfSwKLXsgMHgxLCAzODgsIDAsIDIxNDcgfSwKLXsgMHgxLCAyODksIDAsIDIxNDggfSwKLXsgMHgxLCAxMSwgMCwgMjE0OSB9LAoteyAweDEsIDksIDAsIDIxNTAgfSwKLXsgMHgxLCAzNjMsIDAsIDIxNTEgfSwKLXsgMHgxLCAzMzcsIDAsIDIxNTIgfSwKLXsgMHgxLCAzMzYsIDAsIDIxNTMgfSwKLXsgMHgxLCAzODcsIDAsIDIxNTQgfSwKLXsgMHgxLCAyODgsIDAsIDIxNTUgfSwKLXsgMHgxLCAxMCwgMCwgMjE1NiB9LAoteyAweDEsIDgsIDAsIDIxNTcgfSwKLXsgMHgxLCA0LCAwLCAyMTU4IH0sCi17IDB4MSwgMzYyLCAwLCAyMTU5IH0sCi17IDB4MSwgMzYxLCAwLCAyMTYwIH0sCi17IDB4MSwgMSwgMCwgMjE2MSB9LAoteyAweDEsIDAsIDAsIDIxNjIgfSwKLX07Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1hc210YWIuaCBiL29wY29kZXMvaWE2NC1hc210YWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiY2JkNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtYXNtdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogaWE2NC1hc210YWIuaCAtLSBIZWFkZXIgZm9yIGNvbXBhY3RlZCBJQS02NCBvcGNvZGUgdGFibGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQm9iIE1hbnNvbiBvZiBDeWdudXMgU3VwcG9ydCA8bWFuc29uQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIElBNjRfQVNNVEFCX0gKLSNkZWZpbmUgSUE2NF9BU01UQUJfSAotCi0jaW5jbHVkZSAib3Bjb2RlL2lhNjQuaCIKLQotLyogVGhlIHByaW1hcnkgb3Bjb2RlIHRhYmxlIGlzIG1hZGUgdXAgb2YgdGhlIGZvbGxvd2luZzogKi8KLXN0cnVjdCBpYTY0X21haW5fdGFibGUKLXsKLSAgLyogVGhlIGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSBvZiB0aGlzCi0gICAgIG9wY29kZS4gKi8KLSAgdW5zaWduZWQgc2hvcnQgbmFtZV9pbmRleDsKLQotICAvKiBUaGUgdHlwZSBvZiBvcGNvZGU7IGNvcnJlc3BvbmRzIHRvIHRoZSBUWVBFIGZpZWxkIGluIAotICAgICBzdHJ1Y3QgaWE2NF9vcGNvZGUuICovCi0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX3R5cGU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIG9wY29kZS4gKi8KLSAgdW5zaWduZWQgY2hhciBudW1fb3V0cHV0czsKLQotICAvKiBUaGUgYmFzZSBpbnNuIHZhbHVlIGZvciB0aGlzIG9wY29kZS4gIEl0IG1heSBiZSBtb2RpZmllZCBieSBjb21wbGV0ZXJzLiAqLwotICBpYTY0X2luc24gb3Bjb2RlOwotCi0gIC8qIFRoZSBtYXNrIG9mIHZhbGlkIGJpdHMgaW4gT1BDT0RFLiBaZXJvcyBpbmRpY2F0ZSBvcGVyYW5kIGZpZWxkcy4gKi8KLSAgaWE2NF9pbnNuIG1hc2s7Ci0KLSAgLyogVGhlIG9wZXJhbmRzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uICBDb3JyZXNwb25kcyB0byB0aGUgT1BFUkFORFMgZmllbGQKLSAgICAgaW4gc3RydWN0IGlhNjRfb3Bjb2RlLiAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzVdOwotCi0gIC8qIFRoZSBmbGFncyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gIENvcnJlc3BvbmRzIHRvIHRoZSBGTEFHUyBmaWVsZCBpbgotICAgICBzdHJ1Y3QgaWE2NF9vcGNvZGUuICovCi0gIHNob3J0IGZsYWdzOwotCi0gIC8qIFRoZSB0cmVlIG9mIGNvbXBsZXRlcnMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW4gb2Zmc2V0IGludG8KLSAgICAgY29tcGxldGVyX3RhYmxlLiAqLwotICBzaG9ydCBjb21wbGV0ZXJzOwotfTsKLQotLyogRWFjaCBpbnN0cnVjdGlvbiBoYXMgYSBzZXQgb2YgcG9zc2libGUgImNvbXBsZXRlcnMiLCBvciBhZGRpdGlvbmFsCi0gICBzdWZmaXhlcyB0aGF0IGNhbiBhbHRlciB0aGUgaW5zdHJ1Y3Rpb24ncyBiZWhhdmlvciwgYW5kIHdoaWNoIGhhcwotICAgcG90ZW50aWFsbHkgZGlmZmVyZW50IGRlcGVuZGVuY2llcy4KLQotICAgVGhlIGNvbXBsZXRlciBlbnRyaWVzIG1vZGlmeSBjZXJ0YWluIGJpdHMgaW4gdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIFdoaWNoIGJpdHMgYXJlIHRvIGJlIG1vZGlmaWVkIGFyZSBtYXJrZWQgYnkgdGhlIEJJVFMsIE1BU0sgYW5kCi0gICBPRkZTRVQgZmllbGRzLiAgVGhlIGNvbXBsZXRlciBlbnRyeSBtYXkgYWxzbyBub3RlIGRlcGVuZGVuY2llcyBmb3IgdGhlCi0gICBvcGNvZGUuIAotCi0gICBUaGVzZSBjb21wbGV0ZXJzIGFyZSBhcnJhbmdlZCBpbiBhIERBRzsgdGhlIHBvaW50ZXJzIGFyZSBpbmRleGVzCi0gICBpbnRvIHRoZSBjb21wbGV0ZXJfdGFibGUgYXJyYXkuICBUaGUgY29tcGxldGVyIERBRyBpcyBzZWFyY2hlZCBieQotICAgZmluZF9jb21wbGV0ZXIgKCkgYW5kIGlhNjRfZmluZF9tYXRjaGluZ19vcGNvZGUgKCkuCi0KLSAgIE5vdGUgdGhhdCBlYWNoIGNvbXBsZXRlciBuZWVkcyB0byBiZSBhcHBsaWVkIGluIHR1cm4sIHNvIHRoYXQgaWYgd2UKLSAgIGhhdmUgdGhlIGluc3RydWN0aW9uCi0gICAJY21wLmx0LnVuYwotICAgdGhlIGNvbXBsZXRlciBlbnRyaWVzIGZvciBib3RoICJsdCIgYW5kICJ1bmMiIHdvdWxkIG5lZWQgdG8gYmUgYXBwbGllZAotICAgdG8gdGhlIG9wY29kZSdzIHZhbHVlLgotCi0gICBTb21lIGluc3RydWN0aW9ucyBkbyBub3QgcmVxdWlyZSBhbnkgY29tcGxldGVyczsgdGhlc2UgY29udGFpbiBhbgotICAgZW1wdHkgY29tcGxldGVyIGVudHJ5LiAgSW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBhIGNvbXBsZXRlciBkbwotICAgbm90IGNvbnRhaW4gYW4gZW1wdHkgZW50cnkuCi0KLSAgIFRlcm1pbmFsIGNvbXBsZXRlcnMgKHRob3NlIGNvbXBsZXRlcnMgdGhhdCB2YWxpZGx5IGNvbXBsZXRlIGFuCi0gICBpbnN0cnVjdGlvbikgYXJlIG1hcmtlZCBieSBoYXZpbmcgdGhlIFRFUk1JTkFMX0NPTVBMRVRFUiBmbGFnIHNldC4gCi0KLSAgIE9ubHkgZGVwZW5kZW5jaWVzIGxpc3RlZCBpbiB0aGUgdGVybWluYWwgY29tcGxldGVyIGZvciBhbiBvcGNvZGUgYXJlCi0gICBjb25zaWRlcmVkIHRvIGFwcGx5IHRvIHRoYXQgb3Bjb2RlIGluc3RhbmNlLiAqLwotCi1zdHJ1Y3QgaWE2NF9jb21wbGV0ZXJfdGFibGUKLXsKLSAgLyogVGhlIGJpdCB2YWx1ZSB0aGF0IHRoaXMgY29tcGxldGVyIHNldHMuICovCi0gIHVuc2lnbmVkIGludCBiaXRzOwotCi0gIC8qIEFuZCBpdHMgbWFzay4gMXMgYXJlIGJpdHMgdGhhdCBhcmUgdG8gYmUgbW9kaWZpZWQgaW4gdGhlIAotICAgICBpbnN0cnVjdGlvbi4gKi8KLSAgdW5zaWduZWQgaW50IG1hc2s7Ci0KLSAgLyogVGhlIGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSBvZiB0aGlzCi0gICAgIGNvbXBsZXRlci4gKi8KLSAgdW5zaWduZWQgc2hvcnQgbmFtZV9pbmRleDsKLQotICAvKiBBbiBhbHRlcm5hdGl2ZSBjb21wbGV0ZXIsIG9yIC0xIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgY2hhaW4uICovCi0gIHNob3J0IGFsdGVybmF0aXZlOwotCi0gIC8qIEEgcG9pbnRlciB0byB0aGUgREFHIG9mIGNvbXBsZXRlcnMgdGhhdCBjYW4gcG90ZW50aWFsbHkgZm9sbG93Ci0gICAgIHRoaXMgb25lLCBvciAtMS4gKi8KLSAgc2hvcnQgc3ViZW50cmllczsKLQotICAvKiBUaGUgYml0IG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24gd2hlcmUgQklUUyBhbmQgTUFTSyBzaG91bGQgYmUKLSAgICAgYXBwbGllZC4gKi8KLSAgdW5zaWduZWQgY2hhciBvZmZzZXQgOiA3OwotCi0gIHVuc2lnbmVkIGNoYXIgdGVybWluYWxfY29tcGxldGVyIDogMTsKLQotICAvKiBJbmRleCBpbnRvIHRoZSBkZXBlbmRlbmN5IGxpc3QgdGFibGUgKi8KLSAgc2hvcnQgZGVwZW5kZW5jaWVzOwotfTsKLQotLyogVGhpcyBjb250YWlucyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGZvciB0aGUgZGlzYXNzZW1ibGVyIHRvIHJlc29sdmUKLSAgIHRoZSBjb21wbGV0ZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4gICovCi1zdHJ1Y3QgaWE2NF9kaXNfbmFtZXMgCi17Ci0gIC8qIENPTVBMRVRFUl9JTkRFWCByZXByZXNlbnRzIHRoZSB0cmVlIG9mIGNvbXBsZXRlcnMgdGhhdCBtYWtlIHVwCi0gICAgIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBMU0IgcmVwcmVzZW50cyB0aGUgdG9wIG9mIHRoZSB0cmVlIGZvciB0aGUKLSAgICAgc3BlY2lmaWVkIGluc3RydWN0aW9uLiAKLQotICAgICBBIDAgYml0IGluZGljYXRlcyB0byBnbyB0byB0aGUgbmV4dCBhbHRlcm5hdGUgY29tcGxldGVyIHZpYSB0aGUKLSAgICAgYWx0ZXJuYXRpdmUgZmllbGQ7IGEgMSBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgY29tcGxldGVyCi0gICAgIGlzIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uLCBhbmQgdG8gZ28gZG93biB0aGUgc3ViZW50cmllcyBpbmRleC4KLSAgICAgV2Uga25vdyB3ZSd2ZSByZWFjaGVkIHRoZSBmaW5hbCBjb21wbGV0ZXIgd2hlbiB3ZSBydW4gb3V0IG9mIDEKLSAgICAgYml0cy4KLQotICAgICBUaGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIDEgYml0LiAqLwotICB1bnNpZ25lZCBpbnQgY29tcGxldGVyX2luZGV4IDogMjA7Ci0KLSAgLyogVGhlIGluZGV4IGluIHRoZSBtYWluX3RhYmxlW10gYXJyYXkgZm9yIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5zbl9pbmRleCA6IDExOwotCi0gIC8qIElmIHNldCwgdGhlIG5leHQgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyBhbiBhbHRlcm5hdGUgcG9zc2liaWxpdHkKLSAgICAgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcuICBXaGljaCBvbmUgdG8gdXNlIGlzIGRldGVybWluZWQgYnkKLSAgICAgdGhlIGluc3RydWN0aW9uIHR5cGUgYW5kIG90aGVyIGZhY3RvcnMgKHNlZSBvcGNvZGVfdmVyaWZ5ICgpKS4gICovCi0gIHVuc2lnbmVkIGludCBuZXh0X2ZsYWcgOiAxOwotCi0gIC8qIFRoZSBkaXNhc3NlbWJseSBwcmlvcml0eSBvZiB0aGlzIGVudHJ5IGFtb25nIGluc3RydWN0aW9ucy4gKi8KLSAgdW5zaWduZWQgc2hvcnQgcHJpb3JpdHk7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1kaXMuYyBiL29wY29kZXMvaWE2NC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ODU5Ny4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyogaWE2NC1kaXMuYyAtLSBEaXNhc3NlbWJsZSBpYTY0IGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9pYTY0LmgiCi0KLSNkZWZpbmUgTkVMRU1TKGEpCSgoaW50KSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpKQotCi0vKiBEaXNhc3NlbWJsZSBpYTY0IGluc3RydWN0aW9uLiAgKi8KLQotLyogUmV0dXJuIHRoZSBpbnN0cnVjdGlvbiB0eXBlIGZvciBPUENPREUgZm91bmQgaW4gdW5pdCBVTklULiAqLwotCi1zdGF0aWMgZW51bSBpYTY0X2luc25fdHlwZQotdW5pdF90b190eXBlIChpYTY0X2luc24gb3Bjb2RlLCBlbnVtIGlhNjRfdW5pdCB1bml0KQotewotICBlbnVtIGlhNjRfaW5zbl90eXBlIHR5cGU7Ci0gIGludCBvcDsKLQotICBvcCA9IElBNjRfT1AgKG9wY29kZSk7Ci0KLSAgaWYgKG9wID49IDggJiYgKHVuaXQgPT0gSUE2NF9VTklUX0kgfHwgdW5pdCA9PSBJQTY0X1VOSVRfTSkpCi0gICAgewotICAgICAgdHlwZSA9IElBNjRfVFlQRV9BOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAodW5pdCkKLQl7Ci0JY2FzZSBJQTY0X1VOSVRfSToKLQkgIHR5cGUgPSBJQTY0X1RZUEVfSTsgYnJlYWs7Ci0JY2FzZSBJQTY0X1VOSVRfTToKLQkgIHR5cGUgPSBJQTY0X1RZUEVfTTsgYnJlYWs7Ci0JY2FzZSBJQTY0X1VOSVRfQjoKLQkgIHR5cGUgPSBJQTY0X1RZUEVfQjsgYnJlYWs7Ci0JY2FzZSBJQTY0X1VOSVRfRjoKLQkgIHR5cGUgPSBJQTY0X1RZUEVfRjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUE2NF9VTklUX0w6Ci0JY2FzZSBJQTY0X1VOSVRfWDoKLQkgIHR5cGUgPSBJQTY0X1RZUEVfWDsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHR5cGUgPSAtMTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHlwZTsKLX0KLQotaW50Ci1wcmludF9pbnNuX2lhNjQgKGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCi17Ci0gIGlhNjRfaW5zbiB0MCwgdDEsIHNsb3RbM10sIHRlbXBsYXRlLCBzX2JpdCwgaW5zbjsKLSAgaW50IHNsb3RudW0sIGosIHN0YXR1cywgbmVlZF9jb21tYSwgcmV0dmFsLCBzbG90X211bHRpcGxpZXI7Ci0gIGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKm9kZXNjOwotICBjb25zdCBzdHJ1Y3QgaWE2NF9vcGNvZGUgKmlkZXNjOwotICBjb25zdCBjaGFyICplcnIsICpzdHIsICp0bmFtZTsKLSAgQkZEX0hPU1RfVV82NF9CSVQgdmFsdWU7Ci0gIGJmZF9ieXRlIGJ1bmRsZVsxNl07Ci0gIGVudW0gaWE2NF91bml0IHVuaXQ7Ci0gIGNoYXIgcmVnbmFtZVsxNl07Ci0KLSAgaWYgKGluZm8tPmJ5dGVzX3Blcl9saW5lID09IDApCi0gICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA2OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKLQotICBzbG90X211bHRpcGxpZXIgPSBpbmZvLT5ieXRlc19wZXJfbGluZTsKLSAgcmV0dmFsID0gc2xvdF9tdWx0aXBsaWVyOwotCi0gIHNsb3RudW0gPSAoKChsb25nKSBtZW1hZGRyKSAmIDB4ZikgLyBzbG90X211bHRpcGxpZXI7Ci0gIGlmIChzbG90bnVtID4gMikKLSAgICByZXR1cm4gLTE7Ci0KLSAgbWVtYWRkciAtPSAobWVtYWRkciAmIDB4Zik7Ci0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1bmRsZSwgc2l6ZW9mIChidW5kbGUpLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLyogYnVuZGxlcyBhcmUgYWx3YXlzIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciAqLwotICB0MCA9IGJmZF9nZXRsNjQgKGJ1bmRsZSk7Ci0gIHQxID0gYmZkX2dldGw2NCAoYnVuZGxlICsgOCk7Ci0gIHNfYml0ID0gdDAgJiAxOwotICB0ZW1wbGF0ZSA9ICh0MCA+PiAxKSAmIDB4ZjsKLSAgc2xvdFswXSA9ICh0MCA+PiAgNSkgJiAweDFmZmZmZmZmZmZmTEw7Ci0gIHNsb3RbMV0gPSAoKHQwID4+IDQ2KSAmIDB4M2ZmZmYpIHwgKCh0MSAmIDB4N2ZmZmZmKSA8PCAxOCk7Ci0gIHNsb3RbMl0gPSAodDEgPj4gMjMpICYgMHgxZmZmZmZmZmZmZkxMOwotCi0gIHRuYW1lID0gaWE2NF90ZW1wbF9kZXNjW3RlbXBsYXRlXS5uYW1lOwotICBpZiAoc2xvdG51bSA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyVzXSAiLCB0bmFtZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAgICAgICIsIHRuYW1lKTsKLQotICB1bml0ID0gaWE2NF90ZW1wbF9kZXNjW3RlbXBsYXRlXS5leGVjX3VuaXRbc2xvdG51bV07Ci0KLSAgaWYgKHRlbXBsYXRlID09IDIgJiYgc2xvdG51bSA9PSAxKQotICAgIHsKLSAgICAgIC8qIHNraXAgTCBzbG90IGluIE1MSSB0ZW1wbGF0ZTogKi8KLSAgICAgIHNsb3RudW0gPSAyOwotICAgICAgcmV0dmFsICs9IHNsb3RfbXVsdGlwbGllcjsKLSAgICB9Ci0KLSAgaW5zbiA9IHNsb3Rbc2xvdG51bV07Ci0KLSAgaWYgKHVuaXQgPT0gSUE2NF9VTklUX05JTCkKLSAgICBnb3RvIGRlY29kaW5nX2ZhaWxlZDsKLQotICBpZGVzYyA9IGlhNjRfZGlzX29wY29kZSAoaW5zbiwgdW5pdF90b190eXBlIChpbnNuLCB1bml0KSk7Ci0gIGlmIChpZGVzYyA9PSBOVUxMKQotICAgIGdvdG8gZGVjb2RpbmdfZmFpbGVkOwotCi0gIC8qIHByaW50IHByZWRpY2F0ZSwgaWYgYW55OiAqLwotCi0gIGlmICgoaWRlc2MtPmZsYWdzICYgSUE2NF9PUENPREVfTk9fUFJFRCkKLSAgICAgIHx8IChpbnNuICYgMHgzZikgPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAgICAgICIpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIocCUwMmQpICIsIChpbnQpKGluc24gJiAweDNmKSk7Ci0KLSAgLyogbm93IHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb246ICovCi0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGlkZXNjLT5uYW1lKTsKLSAgaWYgKGlkZXNjLT5vcGVyYW5kc1swXSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQotICBuZWVkX2NvbW1hID0gMDsKLSAgZm9yIChqID0gMDsgaiA8IE5FTEVNUyAoaWRlc2MtPm9wZXJhbmRzKSAmJiBpZGVzYy0+b3BlcmFuZHNbal07ICsraikKLSAgICB7Ci0gICAgICBvZGVzYyA9IGVsZjY0X2lhNjRfb3BlcmFuZHMgKyBpZGVzYy0+b3BlcmFuZHNbal07Ci0KLSAgICAgIGlmIChuZWVkX2NvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0gICAgICBpZiAob2Rlc2MgLSBlbGY2NF9pYTY0X29wZXJhbmRzID09IElBNjRfT1BORF9JTU1VNjQpCi0JewotCSAgLyogc3BlY2lhbCBjYXNlIG9mIDY0IGJpdCBpbW1lZGlhdGUgbG9hZDogKi8KLQkgIHZhbHVlID0gKChpbnNuID4+IDEzKSAmIDB4N2YpIHwgKCgoaW5zbiA+PiAyNykgJiAweDFmZikgPDwgNykKLQkgICAgfCAoKChpbnNuID4+IDIyKSAmIDB4MWYpIDw8IDE2KSB8ICgoKGluc24gPj4gMjEpICYgMHgxKSA8PCAyMSkKLQkgICAgfCAoc2xvdFsxXSA8PCAyMikgfCAoKChpbnNuID4+IDM2KSAmIDB4MSkgPDwgNjMpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9kZXNjIC0gZWxmNjRfaWE2NF9vcGVyYW5kcyA9PSBJQTY0X09QTkRfSU1NVTYyKQotICAgICAgICB7Ci0gICAgICAgICAgLyogNjItYml0IGltbWVkaWF0ZSBmb3Igbm9wLngvYnJlYWsueCAqLwotICAgICAgICAgIHZhbHVlID0gKChzbG90WzFdICYgMHgxZmZmZmZmZmZmZkxMKSA8PCAyMSkKLSAgICAgICAgICAgIHwgKCgoaW5zbiA+PiAzNikgJiAweDEpIDw8IDIwKQotICAgICAgICAgICAgfCAoKGluc24gPj4gNikgJiAweGZmZmZmKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICgqb2Rlc2MtPmV4dHJhY3QpIChvZGVzYywgaW5zbiwgJnZhbHVlKTsKLQkgIGlmIChlcnIpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgZXJyKTsKLQkgICAgICBnb3RvIGRvbmU7Ci0JICAgIH0KLQl9Ci0KLQlzd2l0Y2ggKG9kZXNjLT5jbGFzcykKLQkgIHsKLQkgIGNhc2UgSUE2NF9PUE5EX0NMQVNTX0NTVDoKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9kZXNjLT5zdHIpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBJQTY0X09QTkRfQ0xBU1NfUkVHOgotCSAgICBpZiAob2Rlc2MtPnN0clswXSA9PSAnYScgJiYgb2Rlc2MtPnN0clsxXSA9PSAncicpCi0JICAgICAgewotCQlzd2l0Y2ggKHZhbHVlKQotCQkgIHsKLQkJICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6Ci0JCSAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OgotCQkgICAgc3ByaW50ZiAocmVnbmFtZSwgImFyLmsldSIsICh1bnNpZ25lZCBpbnQpIHZhbHVlKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgMTY6CXN0cmNweSAocmVnbmFtZSwgImFyLnJzYyIpOyBicmVhazsKLQkJICBjYXNlIDE3OglzdHJjcHkgKHJlZ25hbWUsICJhci5ic3AiKTsgYnJlYWs7Ci0JCSAgY2FzZSAxODoJc3RyY3B5IChyZWduYW1lLCAiYXIuYnNwc3RvcmUiKTsgYnJlYWs7Ci0JCSAgY2FzZSAxOToJc3RyY3B5IChyZWduYW1lLCAiYXIucm5hdCIpOyBicmVhazsKLQkJICBjYXNlIDMyOglzdHJjcHkgKHJlZ25hbWUsICJhci5jY3YiKTsgYnJlYWs7Ci0JCSAgY2FzZSAzNjoJc3RyY3B5IChyZWduYW1lLCAiYXIudW5hdCIpOyBicmVhazsKLQkJICBjYXNlIDQwOglzdHJjcHkgKHJlZ25hbWUsICJhci5mcHNyIik7IGJyZWFrOwotCQkgIGNhc2UgNDQ6CXN0cmNweSAocmVnbmFtZSwgImFyLml0YyIpOyBicmVhazsKLQkJICBjYXNlIDY0OglzdHJjcHkgKHJlZ25hbWUsICJhci5wZnMiKTsgYnJlYWs7Ci0JCSAgY2FzZSA2NToJc3RyY3B5IChyZWduYW1lLCAiYXIubGMiKTsgYnJlYWs7Ci0JCSAgY2FzZSA2NjoJc3RyY3B5IChyZWduYW1lLCAiYXIuZWMiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIHNwcmludGYgKHJlZ25hbWUsICJhciV1IiwgKHVuc2lnbmVkIGludCkgdmFsdWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyVkIiwgb2Rlc2MtPnN0ciwgKGludCl2YWx1ZSk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIElBNjRfT1BORF9DTEFTU19JTkQ6Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNbciVkXSIsIG9kZXNjLT5zdHIsIChpbnQpdmFsdWUpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBJQTY0X09QTkRfQ0xBU1NfQUJTOgotCSAgICBzdHIgPSAwOwotCSAgICBpZiAob2Rlc2MgLSBlbGY2NF9pYTY0X29wZXJhbmRzID09IElBNjRfT1BORF9NQlRZUEU0KQotCSAgICAgIHN3aXRjaCAodmFsdWUpCi0JCXsKLQkJY2FzZSAweDA6IHN0ciA9ICJAYnJjc3QiOyBicmVhazsKLQkJY2FzZSAweDg6IHN0ciA9ICJAbWl4IjsgYnJlYWs7Ci0JCWNhc2UgMHg5OiBzdHIgPSAiQHNodWYiOyBicmVhazsKLQkJY2FzZSAweGE6IHN0ciA9ICJAYWx0IjsgYnJlYWs7Ci0JCWNhc2UgMHhiOiBzdHIgPSAiQHJldiI7IGJyZWFrOwotCQl9Ci0KLQkgICAgaWYgKHN0cikKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc3RyKTsKLQkgICAgZWxzZSBpZiAob2Rlc2MtPmZsYWdzICYgSUE2NF9PUE5EX0ZMQUdfREVDSU1BTF9TSUdORUQpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGxkIiwgdmFsdWUpOwotCSAgICBlbHNlIGlmIChvZGVzYy0+ZmxhZ3MgJiBJQTY0X09QTkRfRkxBR19ERUNJTUFMX1VOU0lHTkVEKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxsdSIsIHZhbHVlKTsKLQkgICAgZWxzZQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbGx4IiwgdmFsdWUpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBJQTY0X09QTkRfQ0xBU1NfUkVMOgotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyB2YWx1ZSwgaW5mbyk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICAgIGlmIChqICsgMSA9PSBpZGVzYy0+bnVtX291dHB1dHMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI9Iik7Ci0JICBuZWVkX2NvbW1hID0gMDsKLQl9Ci0gICAgfQotICBpZiAoc2xvdG51bSArIDEgPT0gaWE2NF90ZW1wbF9kZXNjW3RlbXBsYXRlXS5ncm91cF9ib3VuZGFyeSAKLSAgICAgIHx8ICgoc2xvdG51bSA9PSAyKSAmJiBzX2JpdCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI7OyIpOwotCi0gZG9uZToKLSAgaWYgKHNsb3RudW0gPT0gMikKLSAgICByZXR2YWwgKz0gMTYgLSAzKnNsb3RfbXVsdGlwbGllcjsKLSAgcmV0dXJuIHJldHZhbDsKLQotIGRlY29kaW5nX2ZhaWxlZDoKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgICAgICBkYXRhOCAlIzAxMWxseCIsIGluc24pOwotICBnb3RvIGRvbmU7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtZ2VuLmMgYi9vcGNvZGVzL2lhNjQtZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTA2MmUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pYTY0LWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc2MyArMCwwIEBACi0vKiBpYTY0LWdlbi5jIC0tIEdlbmVyYXRlIGEgc2hydW5rIHNldCBvZiBvcGNvZGUgdGFibGVzCi0gICBDb3B5cmlnaHQgKGMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJvYiBNYW5zb24sIEN5Z251cyBTb2x1dGlvbnMsIDxtYW5zb25AY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi0gICB0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAgIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci0gICB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdoaWxlIHRoZSBpYTY0LW9wYy0qIHNldCBvZiBvcGNvZGUgdGFibGVzIGFyZSBlYXN5IHRvIG1haW50YWluLAotICAgdGhleSB3YXN0ZSBhIHRyZW1lbmRvdXMgYW1vdW50IG9mIHNwYWNlLiAgaWE2NC1nZW4gcmVhcnJhbmdlcyB0aGUKLSAgIGluc3RydWN0aW9ucyBpbnRvIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCAoREFHKSBvZiBpbnN0cnVjdGlvbiBvcGNvZGVzIGFuZCAKLSAgIHRoZWlyIHBvc3NpYmxlIGNvbXBsZXRlcnMsIGFzIHdlbGwgYXMgY29tcGFjdGluZyB0aGUgc2V0IG9mIHN0cmluZ3MgdXNlZC4gIAotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHRhYmxlIGNvbnNpc3RzIG9mIGEgc3RhdGUgbWFjaGluZSB0aGF0IGRvZXMKLSAgIGJyYW5jaGluZyBiYXNlZCBvbiB0aGUgYml0cyBvZiB0aGUgb3Bjb2RlIGJlaW5nIGRpc2Fzc2VtYmxlZC4gIFRoZQotICAgc3RhdGUgZW5jb2RpbmdzIGhhdmUgYmVlbiBjaG9zZW4gdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBzcGFjZQotICAgcmVxdWlyZWQuICAKLQotICAgVGhlIHJlc291cmNlIHRhYmxlIGlzIGNvbnN0cnVjdGVkIGJhc2VkIG9uIHNvbWUgdGV4dCBkZXBlbmRlbmN5IHRhYmxlcywgCi0gICB3aGljaCBhcmUgYWxzbyBlYXNpZXIgdG8gbWFpbnRhaW4gdGhhbiB0aGUgZmluYWwgcmVwcmVzZW50YXRpb24uCi0KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImlhNjQtb3BjLmgiCi0jaW5jbHVkZSAiaWE2NC1vcGMtYS5jIgotI2luY2x1ZGUgImlhNjQtb3BjLWkuYyIKLSNpbmNsdWRlICJpYTY0LW9wYy1tLmMiCi0jaW5jbHVkZSAiaWE2NC1vcGMtYi5jIgotI2luY2x1ZGUgImlhNjQtb3BjLWYuYyIKLSNpbmNsdWRlICJpYTY0LW9wYy14LmMiCi0jaW5jbHVkZSAiaWE2NC1vcGMtZC5jIgotCi1pbnQgZGVidWcgPSAwOwotCi0jZGVmaW5lIHRtYWxsb2MoWCkgKFggKikgeG1hbGxvYyAoc2l6ZW9mIChYKSkKLQotLyogVGhlIG1haW4gb3Bjb2RlIHRhYmxlIGVudHJ5LiAgRWFjaCBlbnRyeSBpcyBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZgotICAgbmFtZSBhbmQgZmxhZ3MgKG5vIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBjb21wYXJlIGFzIGJlaW5nIGVxdWFsCi0gICB2aWEgb3Bjb2Rlc19lcSkuICovCi1zdHJ1Y3QgbWFpbl9lbnRyeQotewotICAvKiBUaGUgYmFzZSBuYW1lIG9mIHRoaXMgb3Bjb2RlLiAgVGhlIG5hbWVzIG9mIGl0cyBjb21wbGV0ZXJzIGFyZQotICAgICBhcHBlbmRlZCB0byBpdCB0byBnZW5lcmF0ZSB0aGUgZnVsbCBpbnN0cnVjdGlvbiBuYW1lLiAqLwotICBzdHJ1Y3Qgc3RyaW5nX2VudHJ5ICpuYW1lOwotICAvKiBUaGUgYmFzZSBvcGNvZGUgZW50cnkuICBXaGljaCBvbmUgdG8gdXNlIGlzIGEgZmFpcmx5IGFyYml0cmFyeSBjaG9pY2U7Ci0gICAgIGl0IHVzZXMgdGhlIGZpcnN0IG9uZSBwYXNzZWQgdG8gYWRkX29wY29kZV9lbnRyeS4gKi8KLSAgc3RydWN0IGlhNjRfb3Bjb2RlICpvcGNvZGU7Ci0gIC8qIFRoZSBsaXN0IG9mIGNvbXBsZXRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGlzIG9wY29kZS4gKi8KLSAgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqY29tcGxldGVyczsKLSAgLyogTmV4dCBlbnRyeSBpbiB0aGUgY2hhaW4uICovCi0gIHN0cnVjdCBtYWluX2VudHJ5ICpuZXh0OwotICAvKiBJbmRleCBpbiB0aGUgIG1haW4gdGFibGUuICovCi0gIGludCBtYWluX2luZGV4OwotfSAqbWFpbnRhYmxlLCAqKm9yZGVyZWRfdGFibGU7Ci1pbnQgb3RsZW4gPSAwOwotaW50IG90dG90bGVuID0gMDsKLWludCBvcGNvZGVfY291bnQgPSAwOwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGNvbXBsZXRlcnMgZm9yIGFuIG9wY29kZS4gKi8KLXN0cnVjdCBjb21wbGV0ZXJfZW50cnkKLXsKLSAgLyogVGhpcyBlbnRyeSdzIGluZGV4IGluIHRoZSBpYTY0X2NvbXBsZXRlcl90YWJsZVtdIGFycmF5LiAqLwotICBpbnQgbnVtOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBjb21wbGV0ZXIuICovCi0gIHN0cnVjdCBzdHJpbmdfZW50cnkgKm5hbWU7Ci0KLSAgLyogVGhpcyBlbnRyeSdzIHBhcmVudC4gKi8KLSAgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqcGFyZW50OwotCi0gIC8qIFNldCBpZiB0aGlzIGlzIGEgdGVybWluYWwgY29tcGxldGVyIChvY2N1cnMgYXQgdGhlIGVuZCBvZiBhbgotICAgICBvcGNvZGUpLiAqLwotICBpbnQgaXNfdGVybWluYWw7Ci0KLSAgLyogQW4gYWx0ZXJuYXRpdmUgY29tcGxldGVyLiAqLwotICBzdHJ1Y3QgY29tcGxldGVyX2VudHJ5ICphbHRlcm5hdGl2ZTsKLQotICAvKiBBZGRpdGlvbmFsIGNvbXBsZXRlcnMgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhpcyBvbmUuICAqLwotICBzdHJ1Y3QgY29tcGxldGVyX2VudHJ5ICphZGRsX2VudHJpZXM7Ci0KLSAgLyogQmVmb3JlIGNvbXB1dGVfY29tcGxldGVyX2JpdHMgKCkgaXMgaW52b2tlZCwgdGhpcyBjb250YWlucyB0aGUgYWN0dWFsCi0gICAgIGluc3RydWN0aW9uIG9wY29kZSBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBvcGNvZGUgYW5kIGNvbXBsZXRlcnMuCi0gICAgIEFmdGVyd2FyZHMsIGl0IGNvbnRhaW5zIHRob3NlIGJpdHMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gaXRzCi0gICAgIHBhcmVudCBvcGNvZGUuICovCi0gIGlhNjRfaW5zbiBiaXRzOwotCi0gIC8qIEJpdHMgc2V0IHRvIDEgY29ycmVzcG9uZCB0byB0aG9zZSBiaXRzIGluIHRoaXMgY29tcGxldGVyJ3Mgb3Bjb2RlCi0gICAgIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIGl0cyBwYXJlbnQgY29tcGxldGVyJ3Mgb3Bjb2RlIChvciBmcm9tCi0gICAgIHRoZSBiYXNlIG9wY29kZSBpZiB0aGUgZW50cnkgaXMgdGhlIHJvb3Qgb2YgdGhlIG9wY29kZSdzIGNvbXBsZXRlcgotICAgICBsaXN0KS4gIFRoaXMgZmllbGQgaXMgZmlsbGVkIGluIGJ5IGNvbXB1dGVfY29tcGxldGVyX2JpdHMgKCkuICovCi0gIGlhNjRfaW5zbiBtYXNrOwotCi0gIC8qIEluZGV4IGludG8gdGhlIG9wY29kZSBkZXBlbmRlbmN5IGxpc3QsIG9yIC0xIGlmIG5vbmUuICovCi0gIGludCBkZXBlbmRlbmNpZXM7Ci0KLSAgLyogUmVtZW1iZXIgdGhlIG9yZGVyIGVuY291bnRlcmVkIGluIHRoZSBvcGNvZGUgdGFibGVzLiAgKi8KLSAgaW50IG9yZGVyOwotfTsKLQotLyogT25lIGVudHJ5IGluIHRoZSBkaXNhc3NlbWJsZXIgbmFtZSB0YWJsZS4gKi8KLXN0cnVjdCBkaXNlbnQKLXsKLSAgLyogVGhlIGluZGV4IGludG8gdGhlIGlhNjRfbmFtZV9kaXMgYXJyYXkgZm9yIHRoaXMgZW50cnkuICovCi0gIGludCBvdXJudW07Ci0KLSAgLyogVGhlIGluZGV4IGludG8gdGhlIG1haW5fdGFibGVbXSBhcnJheS4gKi8KLSAgaW50IGluc247Ci0KLSAgLyogVGhlIGRpc2Fzc21ibHkgcHJpb3JpdHkgb2YgdGhpcyBlbnRyeS4gKi8KLSAgaW50IHByaW9yaXR5OwotCi0gIC8qIFRoZSBjb21wbGV0ZXJfaW5kZXggdmFsdWUgZm9yIHRoaXMgZW50cnkuICovCi0gIGludCBjb21wbGV0ZXJfaW5kZXg7Ci0KLSAgLyogSG93IG1hbnkgb3RoZXIgZW50cmllcyBzaGFyZSB0aGlzIGRlY29kZS4gKi8KLSAgaW50IG5leHRjbnQ7Ci0KLSAgLyogVGhlIG5leHQgZW50cnkgc2hhcmluZyB0aGUgc2FtZSBkZWNvZGUuICovCi0gIHN0cnVjdCBkaXNlbnQgKm5leHRlOwotCi0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBuYW1lIGxpc3QuICovCi0gIHN0cnVjdCBkaXNlbnQgKm5leHRfZW50OwotfSAqZGlzaW5zbnRhYmxlID0gTlVMTDsKLQotLyogQSBzdGF0ZSBtYWNoaW5lIHRoYXQgd2lsbCBldmVudHVhbGx5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlCi0gICBkaXNhc3NlbWJsZXIgdGFibGUuICovCi1zdHJ1Y3QgYml0dHJlZQotewotICBzdHJ1Y3QgZGlzZW50ICpkaXNlbnQ7Ci0gIHN0cnVjdCBiaXR0cmVlICpiaXRzWzNdOyAvKiAwLCAxLCBhbmQgWCAoZG9uJ3QgY2FyZSkgKi8KLSAgaW50IGJpdHNfdG9fc2tpcDsKLSAgaW50IHNraXBfZmxhZzsKLX0gKmJpdHRyZWU7Ci0KLS8qIFRoZSBzdHJpbmcgdGFibGUgY29udGFpbnMgYWxsIG9wY29kZXMgYW5kIGNvbXBsZXRlcnMgc29ydGVkIGluCi0gICBhbHBoYWJldGljYWwgb3JkZXIuICAqLwotCi0vKiBPbmUgZW50cnkgaW4gdGhlIHN0cmluZyB0YWJsZS4gKi8KLXN0cnVjdCBzdHJpbmdfZW50cnkgCi17Ci0gIC8qIFRoZSBpbmRleCBpbiB0aGUgaWE2NF9zdHJpbmdzW10gYXJyYXkgZm9yIHRoaXMgZW50cnkuICovCi0gIGludCBudW07Ci0gIC8qIEFuZCB0aGUgc3RyaW5nLiAqLwotICBjaGFyICpzOwotfSAqKnN0cmluZ190YWJsZSA9IE5VTEw7Ci1pbnQgc3RydGFibGVuID0gMDsKLWludCBzdHJ0YWJ0b3RsZW4gPSAwOwotCi0MCi0vKiByZXNvdXJjZSBkZXBlbmRlbmN5IGVudHJpZXMgKi8KLXN0cnVjdCByZGVwCi17Ci0gIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvdXJjZSBuYW1lICovCi0gIHVuc2lnbmVkIAotICAgIG1vZGU6MiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkFXLCBXQVcsIG9yIFdBUiAqLwotICAgIHNlbWFudGljczozOyAgICAgICAgICAgICAgICAgICAgLyogZGVwZW5kZW5jeSBzZW1hbnRpY3MgKi8KLSAgY2hhciAqZXh0cmE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgc2VtYW50aWNzIGluZm8gKi8KLSAgaW50IG5jaGtzOyAgICAgICAgICAgICAgICAgICAKLSAgaW50IHRvdGFsX2Noa3M7ICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsICNvZiB0ZXJtaW5hbCBpbnNucyAqLwotICBpbnQgKmNoa3M7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5zbiBjbGFzc2VzIHdoaWNoIHJlYWQgKFJBVyksIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0FXKSwgb3Igd3JpdGUgKFdBUikgdGhpcyByc3JjICovIC8vIAotICBpbnQgKmNoa25vdGVzOyAgICAgICAgICAgICAgICAgICAgLyogZGVwZW5kZW5jeSBub3RlcyBmb3IgZWFjaCBjbGFzcyAqLwotICBpbnQgbnJlZ3M7Ci0gIGludCB0b3RhbF9yZWdzOyAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCAjb2YgdGVybWluYWwgaW5zbnMgKi8KLSAgaW50ICpyZWdzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluc24gY2xhc3Mgd2hpY2ggd3JpdGUgKFJBVyksIHdyaXRlMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdBVyksIG9yIHJlYWQgKFdBUikgdGhpcyByc3JjICovCi0gIGludCAqcmVnbm90ZXM7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRlbmN5IG5vdGVzIGZvciBlYWNoIGNsYXNzICovCi0KLSAgaW50IHdhd19zcGVjaWFsOyAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgV0FXIGRlcGVuZGVuY3kgbm90ZSAqLwotfSAqKnJkZXBzID0gTlVMTDsKLQotc3RhdGljIGludCByZGVwc2xlbiA9IDA7Ci1zdGF0aWMgaW50IHJkZXBzdG90bGVuID0gMDsKLQotLyogYXJyYXkgb2YgYWxsIGluc3RydWN0aW9uIGNsYXNzZXMgKi8KLXN0cnVjdCBpY2xhc3MKLXsgCi0gIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbiBjbGFzcyBuYW1lICovCi0gIGludCBpc19jbGFzczsgICAgICAgICAgICAgICAgICAgICAvKiBpcyBhIGNsYXNzLCBub3QgYSB0ZXJtaW5hbCAqLwotICBpbnQgbnN1YnM7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGludCAqc3ViczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlciBjbGFzc2VzIHdpdGhpbiB0aGlzIGNsYXNzICovCi0gIGludCBueHN1YnM7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgaW50IHhzdWJzWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIGV4Y2x1c2lvbnMgKi8KLSAgY2hhciAqY29tbWVudDsgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbmFsIGNvbW1lbnQgKi8KLSAgaW50IG5vdGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbmFsIG5vdGUgKi8KLSAgaW50IHRlcm1pbmFsX3Jlc29sdmVkOyAgICAgICAgICAgIC8qIGRpZCB3ZSBtYXRjaCB0aGlzIHdpdGggYW55dGhpbmc/ICovCi0gIGludCBvcnBoYW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXRlY3QgY2xhc3Mgb3JwaGFucyAqLwotfSAqKmljcyA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgaWNsZW4gPSAwOwotc3RhdGljIGludCBpY3RvdGxlbiA9IDA7Ci0KLS8qIGFuIG9wY29kZSBkZXBlbmRlbmN5IChjaGsvcmVnIHBhaXIgb2YgZGVwZW5kZW5jeSBsaXN0cykgKi8KLXN0cnVjdCBvcGRlcAotewotICBpbnQgY2hrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBkbGlzdHMgKi8KLSAgaW50IHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gZGxpc3RzICovCi19ICoqb3BkZXBzOwotCi1zdGF0aWMgaW50IG9wZGVwbGVuID0gMDsKLXN0YXRpYyBpbnQgb3BkZXB0b3RsZW4gPSAwOwotCi0vKiBhIGdlbmVyaWMgbGlzdCBvZiBkZXBlbmRlbmNpZXMgdy9ub3RlcyBlbmNvZGVkLiAgdGhlc2UgbWF5IGJlIHNoYXJlZC4gKi8KLXN0cnVjdCBkZXBsaXN0Ci17Ci0gIGludCBsZW47Ci0gIHVuc2lnbmVkIHNob3J0ICpkZXBzOwotfSAqKmRsaXN0czsKLQotc3RhdGljIGludCBkbGlzdGxlbiA9IDA7Ci1zdGF0aWMgaW50IGRsaXN0dG90bGVuID0gMDsKLQotLyogYWRkIE5BTUUgdG8gdGhlIHJlc291cmNlIHRhYmxlLCB3aGVyZSBUWVBFIGlzIFJBVyBvciBXQVcgKi8KLXN0YXRpYyBzdHJ1Y3QgcmRlcCAqCi1pbnNlcnRfcmVzb3VyY2UgKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gaWE2NF9kZXBlbmRlbmN5X21vZGUgdHlwZSkKLXsKLSAgaWYgKHJkZXBzbGVuID09IHJkZXBzdG90bGVuKQotICAgIHsKLSAgICAgIHJkZXBzdG90bGVuICs9IDIwOwotICAgICAgcmRlcHMgPSAoc3RydWN0IHJkZXAgKiopCi0gICAgICAgIHhyZWFsbG9jIChyZGVwcywgc2l6ZW9mKHN0cnVjdCByZGVwICoqKSAqIHJkZXBzdG90bGVuKTsKLSAgICB9Ci0gIHJkZXBzW3JkZXBzbGVuXSA9IHRtYWxsb2Moc3RydWN0IHJkZXApOwotICBtZW1zZXQoKHZvaWQgKilyZGVwc1tyZGVwc2xlbl0sIDAsIHNpemVvZihzdHJ1Y3QgcmRlcCkpOwotICByZGVwc1tyZGVwc2xlbl0tPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgcmRlcHNbcmRlcHNsZW5dLT5tb2RlID0gdHlwZTsKLSAgcmRlcHNbcmRlcHNsZW5dLT53YXdfc3BlY2lhbCA9IDA7Ci0gIAotICByZXR1cm4gcmRlcHNbcmRlcHNsZW4rK107Ci19Ci0KLS8qIGFyZSB0aGUgbGlzdHMgb2YgZGVwZW5kZW5jeSBpbmRleGVzIGVxdWl2YWxlbnQ/ICovCi1zdGF0aWMgaW50Ci1kZXBsaXN0X2VxdWFscyAoc3RydWN0IGRlcGxpc3QgKmQxLCBzdHJ1Y3QgZGVwbGlzdCAqZDIpCi17Ci0gIGludCBpOwotCi0gIGlmIChkMS0+bGVuICE9IGQyLT5sZW4pCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChpPTA7aSA8IGQxLT5sZW47aSsrKQotICAgIHsKLSAgICAgIGlmIChkMS0+ZGVwc1tpXSAhPSBkMi0+ZGVwc1tpXSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBhZGQgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHRvIHRoZSBsaXN0IG9mIGRlcGVuZGVuY3kgbGlzdHMgKi8KLXN0YXRpYyBzaG9ydAotaW5zZXJ0X2RlcGxpc3QoaW50IGNvdW50LCB1bnNpZ25lZCBzaG9ydCAqZGVwcykKLXsKLSAgLyogc29ydCB0aGUgbGlzdCwgdGhlbiBzZWUgaWYgYW4gZXF1aXZhbGVudCBsaXN0IGV4aXN0cyBhbHJlYWR5LgotICAgICB0aGlzIHJlc3VsdHMgaW4gYSBtdWNoIHNtYWxsZXIgc2V0IG9mIGRlcGVuZGVuY3kgbGlzdHMKLSAgICovCi0gIHN0cnVjdCBkZXBsaXN0ICpsaXN0OwotICBjaGFyIHNldFsweDEwMDAwXTsKLSAgaW50IGk7Ci0KLSAgbWVtc2V0ICgodm9pZCAqKXNldCwgMCwgc2l6ZW9mKHNldCkpOwotICBmb3IgKGk9MDtpIDwgY291bnQ7aSsrKQotICAgIHNldFtkZXBzW2ldXSA9IDE7Ci0gIGNvdW50ID0gMDsKLSAgZm9yIChpPTA7aSA8IHNpemVvZihzZXQpO2krKykKLSAgICBpZiAoc2V0W2ldKQotICAgICAgKytjb3VudDsKLQotICBsaXN0ID0gdG1hbGxvYyhzdHJ1Y3QgZGVwbGlzdCk7Ci0gIGxpc3QtPmxlbiA9IGNvdW50OwotICBsaXN0LT5kZXBzID0gKHVuc2lnbmVkIHNob3J0ICopbWFsbG9jIChzaXplb2YodW5zaWduZWQgc2hvcnQpICogY291bnQpOwotICBmb3IgKGk9MCwgY291bnQ9MDtpIDwgc2l6ZW9mKHNldCk7aSsrKQotICAgIHsKLSAgICAgIGlmIChzZXRbaV0pCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LT5kZXBzW2NvdW50KytdID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBkb2VzIHRoaXMgbGlzdCBleGlzdCBhbHJlYWR5PyAqLwotICBmb3IgKGk9MDtpIDwgZGxpc3RsZW47aSsrKQotICAgIHsKLSAgICAgIGlmIChkZXBsaXN0X2VxdWFscyAobGlzdCwgZGxpc3RzW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGZyZWUgKGxpc3QtPmRlcHMpOwotICAgICAgICAgIGZyZWUgKGxpc3QpOwotICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gIGlmIChkbGlzdGxlbiA9PSBkbGlzdHRvdGxlbikKLSAgICB7Ci0gICAgICBkbGlzdHRvdGxlbiArPSAyMDsKLSAgICAgIGRsaXN0cyA9IChzdHJ1Y3QgZGVwbGlzdCAqKikKLSAgICAgICAgeHJlYWxsb2MgKGRsaXN0cywgc2l6ZW9mKHN0cnVjdCBkZXBsaXN0ICoqKSAqIGRsaXN0dG90bGVuKTsKLSAgICB9Ci0gIGRsaXN0c1tkbGlzdGxlbl0gPSBsaXN0OwotCi0gIHJldHVybiBkbGlzdGxlbisrOwotfQotCi0vKiBhZGQgdGhlIGdpdmVuIHBhaXIgb2YgZGVwZW5kZW5jeSBsaXN0cyB0byB0aGUgb3Bjb2RlIGRlcGVuZGVuY3kgbGlzdCAqLwotc3RhdGljIHNob3J0Ci1pbnNlcnRfZGVwZW5kZW5jaWVzIChpbnQgbmNoa3MsIHVuc2lnbmVkIHNob3J0ICpjaGtzLCAKLSAgICAgICAgICAgICAgICAgICAgIGludCBucmVncywgdW5zaWduZWQgc2hvcnQgKnJlZ3MpCi17Ci0gIHN0cnVjdCBvcGRlcCAqcGFpcjsKLSAgaW50IGk7Ci0gIGludCByZWdpbmQgPSAtMTsKLSAgaW50IGNoa2luZCA9IC0xOwotCi0gIGlmIChucmVncyA+IDApCi0gICAgcmVnaW5kID0gaW5zZXJ0X2RlcGxpc3QgKG5yZWdzLCByZWdzKTsKLSAgaWYgKG5jaGtzID4gMCkKLSAgICBjaGtpbmQgPSBpbnNlcnRfZGVwbGlzdCAobmNoa3MsIGNoa3MpOwotCi0gIGZvciAoaT0wO2kgPCBvcGRlcGxlbjtpKyspCi0gICAgewotICAgICAgaWYgKG9wZGVwc1tpXS0+Y2hrID09IGNoa2luZCAKLSAgICAgICAgICAmJiBvcGRlcHNbaV0tPnJlZyA9PSByZWdpbmQpCi0gICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgcGFpciA9IHRtYWxsb2Moc3RydWN0IG9wZGVwKTsKLSAgcGFpci0+Y2hrID0gY2hraW5kOwotICBwYWlyLT5yZWcgPSByZWdpbmQ7Ci0gIAotICBpZiAob3BkZXBsZW4gPT0gb3BkZXB0b3RsZW4pCi0gICAgewotICAgICAgb3BkZXB0b3RsZW4gKz0gMjA7Ci0gICAgICBvcGRlcHMgPSAoc3RydWN0IG9wZGVwICoqKQotICAgICAgICB4cmVhbGxvYyAob3BkZXBzLCBzaXplb2Yoc3RydWN0IG9wZGVwICoqKSAqIG9wZGVwdG90bGVuKTsKLSAgICB9Ci0gIG9wZGVwc1tvcGRlcGxlbl0gPSBwYWlyOwotCi0gIHJldHVybiBvcGRlcGxlbisrOwotfQotCi1zdGF0aWMgdm9pZCAKLW1hcmtfdXNlZCAoc3RydWN0IGljbGFzcyAqaWMsIGludCBjbGVhcl90ZXJtaW5hbHMpCi17Ci0gIGludCBpOwotCi0gIGljLT5vcnBoYW4gPSAwOwotICBpZiAoY2xlYXJfdGVybWluYWxzKQotICAgIGljLT50ZXJtaW5hbF9yZXNvbHZlZCA9IDE7Ci0KLSAgZm9yIChpPTA7aSA8IGljLT5uc3VicztpKyspCi0gICAgewotICAgICAgbWFya191c2VkIChpY3NbaWMtPnN1YnNbaV1dLCBjbGVhcl90ZXJtaW5hbHMpOwotICAgIH0KLSAgZm9yIChpPTA7aSA8IGljLT5ueHN1YnM7aSsrKQotICAgIHsKLSAgICAgIG1hcmtfdXNlZCAoaWNzW2ljLT54c3Vic1tpXV0sIGNsZWFyX3Rlcm1pbmFscyk7Ci0gICAgfQotfQotCi0vKiBsb29rIHVwIGFuIGluc3RydWN0aW9uIGNsYXNzOyBpZiBDUkVBVEUgbWFrZSBhIG5ldyBvbmUgaWYgbm9uZSBmb3VuZDsKLSAgIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGluc24gY2xhc3MgYXJyYXkgKi8KLXN0YXRpYyBpbnQKLWZldGNoX2luc25fY2xhc3MoY29uc3QgY2hhciAqZnVsbF9uYW1lLCBpbnQgY3JlYXRlKQotewotICBjaGFyICpuYW1lOwotICBjaGFyICpub3Rlc3RyOwotICBjaGFyICp4c2VjdDsKLSAgY2hhciAqY29tbWVudDsKLSAgaW50IGksIG5vdGUgPSAwOwotICBpbnQgaW5kOwotICBpbnQgaXNfY2xhc3MgPSAwOwotCi0gIGlmIChzdHJuY21wIChmdWxsX25hbWUsICJJQzoiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIG5hbWUgPSB4c3RyZHVwIChmdWxsX25hbWUgKyAzKTsKLSAgICAgIGlzX2NsYXNzID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBuYW1lID0geHN0cmR1cCAoZnVsbF9uYW1lKTsKLQotICBpZiAoKHhzZWN0ID0gc3RyY2hyKG5hbWUsICdcXCcpKSAhPSBOVUxMKQotICAgIGlzX2NsYXNzID0gMTsKLSAgaWYgKChjb21tZW50ID0gc3RyY2hyKG5hbWUsICdbJykpICE9IE5VTEwpCi0gICAgaXNfY2xhc3MgPSAxOwotICBpZiAoKG5vdGVzdHIgPSBzdHJjaHIobmFtZSwgJysnKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpuZXh0bm90ZXN0cjsKLSAgICAgIGlzX2NsYXNzID0gMTsKLSAgICAgIG5vdGUgPSBhdG9pIChub3Rlc3RyICsgMSk7Ci0gICAgICBpZiAoKG5leHRub3Rlc3RyID0gc3RyY2hyIChub3Rlc3RyICsgMSwgJysnKSkgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHJjbXAgKG5vdGVzdHIsICIrMSsxMyIpID09IDApCi0gICAgICAgICAgICBub3RlID0gMTM7Ci0gICAgICAgICAgZWxzZSBpZiAoIXhzZWN0IHx8IG5leHRub3Rlc3RyIDwgeHNlY3QpCi0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBtdWx0aXBsZSBub3RlICVzIG5vdCBoYW5kbGVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgbm90ZXN0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgLyogaWYgaXQncyBhIGNvbXBvc2l0ZSBjbGFzcywgbGVhdmUgdGhlIG5vdGVzIGFuZCBjb21tZW50cyBpbiBwbGFjZSBzbyB0aGF0Ci0gICAgIHdlIGhhdmUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGNvbXBvc2l0ZSBjbGFzcyAqLwotICBpZiAoIXhzZWN0KQotICAgIHsKLSAgICAgIGlmIChub3Rlc3RyKQotICAgICAgICAqbm90ZXN0ciA9IDA7Ci0gICAgICBpZiAoY29tbWVudCkKLSAgICAgICAgKmNvbW1lbnQgPSAwOwotICAgIH0KLQotICBmb3IgKGk9MDtpIDwgaWNsZW47aSsrKQotICAgIGlmIChzdHJjbXAobmFtZSwgaWNzW2ldLT5uYW1lKSA9PSAwCi0gICAgICAgICYmICgoY29tbWVudCA9PSBOVUxMICYmIGljc1tpXS0+Y29tbWVudCA9PSBOVUxMKQotICAgICAgICAgICAgfHwgKGNvbW1lbnQgIT0gTlVMTCAmJiBpY3NbaV0tPmNvbW1lbnQgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIHN0cm5jbXAgKGljc1tpXS0+Y29tbWVudCwgY29tbWVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChpY3NbaV0tPmNvbW1lbnQpKSA9PSAwKSkKLSAgICAgICAgJiYgbm90ZSA9PSBpY3NbaV0tPm5vdGUpCi0gICAgICByZXR1cm4gaTsKLQotICBpZiAoIWNyZWF0ZSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogZG9lc24ndCBleGlzdCwgc28gbWFrZSBhIG5ldyBvbmUgKi8KLSAgaWYgKGljbGVuID09IGljdG90bGVuKQotICAgIHsKLSAgICAgIGljdG90bGVuICs9IDIwOwotICAgICAgaWNzID0gKHN0cnVjdCBpY2xhc3MgKiopCi0gICAgICAgIHhyZWFsbG9jKGljcywgKGljdG90bGVuKSpzaXplb2Yoc3RydWN0IGljbGFzcyAqKSk7Ci0gICAgfQotICBpbmQgPSBpY2xlbisrOwotICBpY3NbaW5kXSA9IHRtYWxsb2Moc3RydWN0IGljbGFzcyk7Ci0gIG1lbXNldCgodm9pZCAqKWljc1tpbmRdLCAwLCBzaXplb2Yoc3RydWN0IGljbGFzcykpOwotICBpY3NbaW5kXS0+bmFtZSA9IHhzdHJkdXAobmFtZSk7Ci0gIGljc1tpbmRdLT5pc19jbGFzcyA9IGlzX2NsYXNzOwotICBpY3NbaW5kXS0+b3JwaGFuID0gMTsKLQotICBpZiAoY29tbWVudCkKLSAgICB7Ci0gICAgICBpY3NbaW5kXS0+Y29tbWVudCA9IHhzdHJkdXAgKGNvbW1lbnQgKyAxKTsKLSAgICAgIGljc1tpbmRdLT5jb21tZW50W3N0cmxlbihpY3NbaW5kXS0+Y29tbWVudCktMV0gPSAwOwotICAgIH0KLSAgaWYgKG5vdGVzdHIpCi0gICAgaWNzW2luZF0tPm5vdGUgPSBub3RlOwotCi0gIC8qIGlmIGl0J3MgYSBjb21wb3NpdGUgY2xhc3MsIHRoZXJlJ3MgYSBjb21tZW50IG9yIG5vdGUsIGxvb2sgZm9yIGFuCi0gICAgIGV4aXN0aW5nIGNsYXNzIG9yIHRlcm1pbmFsIHdpdGggdGhlIHNhbWUgbmFtZS4gKi8gCi0gIGlmICgoeHNlY3QgfHwgY29tbWVudCB8fCBub3Rlc3RyKSAmJiBpc19jbGFzcykKLSAgICB7Ci0gICAgICAvLyBmaXJzdCwgcG9wdWxhdGUgd2l0aCB0aGUgY2xhc3Mgd2UncmUgYmFzZWQgb24KLSAgICAgIGNoYXIgKnN1Ym5hbWUgPSBuYW1lOwotICAgICAgaWYgKHhzZWN0KQotICAgICAgICAqeHNlY3QgPSAwOwotICAgICAgZWxzZSBpZiAoY29tbWVudCkKLSAgICAgICAgKmNvbW1lbnQgPSAwOwotICAgICAgZWxzZSBpZiAobm90ZXN0cikKLSAgICAgICAgKm5vdGVzdHIgPSAwOwotICAgICAgaWNzW2luZF0tPm5zdWJzID0gMTsKLSAgICAgIGljc1tpbmRdLT5zdWJzID0gdG1hbGxvYyhpbnQpOwotICAgICAgaWNzW2luZF0tPnN1YnNbMF0gPSBmZXRjaF9pbnNuX2NsYXNzIChzdWJuYW1lLCAxKTs7Ci0gICAgfQotCi0gIHdoaWxlICh4c2VjdCkKLSAgICB7Ci0gICAgICBjaGFyICpzdWJuYW1lID0geHNlY3QgKyAxOwotICAgICAgeHNlY3QgPSBzdHJjaHIgKHN1Ym5hbWUsICdcXCcpOwotICAgICAgaWYgKHhzZWN0KQotICAgICAgICAqeHNlY3QgPSAwOwotICAgICAgaWNzW2luZF0tPnhzdWJzW2ljc1tpbmRdLT5ueHN1YnNdID0gZmV0Y2hfaW5zbl9jbGFzcyAoc3VibmFtZSwxKTsKLSAgICAgIGljc1tpbmRdLT5ueHN1YnMrKzsKLSAgICB9Ci0gIGZyZWUgKG5hbWUpOwotCi0gIHJldHVybiBpbmQ7Ci19Ci0KLS8qIGZvciBzb3J0aW5nIGEgY2xhc3MncyBzdWItY2xhc3MgbGlzdCBvbmx5OyBtYWtlIHN1cmUgY2xhc3NlcyBhcHBlYXIgYmVmb3JlCi0gICB0ZXJtaW5hbHMgICovCi1zdGF0aWMgaW50Ci1zdWJfY29tcGFyZSAoY29uc3Qgdm9pZCAqZTEsIGNvbnN0IHZvaWQgKmUyKQotewotICBzdHJ1Y3QgaWNsYXNzICppYzEgPSBpY3NbKihpbnQgKillMV07Ci0gIHN0cnVjdCBpY2xhc3MgKmljMiA9IGljc1sqKGludCAqKWUyXTsKLQotICBpZiAoaWMxLT5pc19jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoIWljMi0+aXNfY2xhc3MpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGljMi0+aXNfY2xhc3MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoaWMxLT5uYW1lLCBpYzItPm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotbG9hZF9pbnNuX2NsYXNzZXMoKQotewotICBGSUxFICpmcCA9IGZvcGVuKCJpYTY0LWljLnRibCIsICJyIik7Ci0gIGNoYXIgYnVmWzIwNDhdOwotCi0gIGlmIChmcCA9PSBOVUxMKXsKLSAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBmaW5kIGlhNjQtaWMudGJsIGZvciByZWFkaW5nXG4iKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLyogZGlzY2FyZCBmaXJzdCBsaW5lICovCi0gIGZnZXRzIChidWYsIHNpemVvZihidWYpLCBmcCk7Ci0KLSAgd2hpbGUgKCFmZW9mKGZwKSkKLSAgICB7Ci0gICAgICBpbnQgaWNsYXNzOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKnRtcDsKLSAgICAgIAotICAgICAgaWYgKGZnZXRzIChidWYsIHNpemVvZihidWYpLCBmcCkgPT0gTlVMTCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIHdoaWxlIChpc3NwYWNlKGJ1ZltzdHJsZW4oYnVmKS0xXSkpCi0gICAgICAgIGJ1ZltzdHJsZW4oYnVmKS0xXSA9ICdcMCc7Ci0KLSAgICAgIG5hbWUgPSB0bXAgPSBidWY7Ci0gICAgICB3aGlsZSAoKnRtcCAhPSAnOycpCi0gICAgICAgIHsKLSAgICAgICAgICArK3RtcDsKLSAgICAgICAgICBpZiAodG1wID09IGJ1ZiArIHNpemVvZihidWYpKQotICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgICp0bXArKyA9ICdcMCc7Ci0KLSAgICAgIGljbGFzcyA9IGZldGNoX2luc25fY2xhc3MobmFtZSwgMSk7Ci0gICAgICBpY3NbaWNsYXNzXS0+aXNfY2xhc3MgPSAxOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAibm9uZSIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpY3NbaWNsYXNzXS0+aXNfY2xhc3MgPSAwOwotICAgICAgICAgIGljc1tpY2xhc3NdLT50ZXJtaW5hbF9yZXNvbHZlZCA9IDE7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgLyogZm9yIHRoaXMgY2xhc3MsIHJlY29yZCBhbGwgc3ViLWNsYXNzZXMgKi8KLSAgICAgIHdoaWxlICgqdG1wKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqc3VibmFtZTsKLSAgICAgICAgICBpbnQgc3ViOwotCi0gICAgICAgICAgd2hpbGUgKCp0bXAgJiYgaXNzcGFjZSgqdG1wKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKyt0bXA7Ci0gICAgICAgICAgICAgIGlmICh0bXAgPT0gYnVmICsgc2l6ZW9mKGJ1ZikpCi0gICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBzdWJuYW1lID0gdG1wOwotICAgICAgICAgIHdoaWxlICgqdG1wICYmICp0bXAgIT0gJywnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICArK3RtcDsKLSAgICAgICAgICAgICAgaWYgKHRtcCA9PSBidWYgKyBzaXplb2YoYnVmKSkKLSAgICAgICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGlmICgqdG1wID09ICcsJykKLSAgICAgICAgICAgICp0bXArKyA9ICdcMCc7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWNzW2ljbGFzc10tPnN1YnMgPSAoaW50ICopCi0gICAgICAgICAgICB4cmVhbGxvYygodm9pZCAqKWljc1tpY2xhc3NdLT5zdWJzLCAKLSAgICAgICAgICAgICAgICAgICAgIChpY3NbaWNsYXNzXS0+bnN1YnMrMSkqc2l6ZW9mKGludCkpOwotCi0gICAgICAgICAgc3ViID0gZmV0Y2hfaW5zbl9jbGFzcyhzdWJuYW1lLCAxKTsKLSAgICAgICAgICBpY3NbaWNsYXNzXS0+c3VicyA9IChpbnQgKikKLSAgICAgICAgICAgIHhyZWFsbG9jKGljc1tpY2xhc3NdLT5zdWJzLCAoaWNzW2ljbGFzc10tPm5zdWJzKzEpKnNpemVvZihpbnQpKTsKLSAgICAgICAgICBpY3NbaWNsYXNzXS0+c3Vic1tpY3NbaWNsYXNzXS0+bnN1YnMrK10gPSBzdWI7Ci0gICAgICAgIH0KLSAgICAgIC8qIG1ha2Ugc3VyZSBjbGFzc2VzIGNvbWUgYmVmb3JlIHRlcm1pbmFscyAqLwotICAgICAgcXNvcnQgKCh2b2lkICopaWNzW2ljbGFzc10tPnN1YnMsIAotICAgICAgICAgICAgIGljc1tpY2xhc3NdLT5uc3Vicywgc2l6ZW9mKGludCksIHN1Yl9jb21wYXJlKTsKLSAgICB9Ci0gIGZjbG9zZShmcCk7Ci0KLSAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVkIGNsYXNzZXNcbiIsIGljbGVuKTsKLSAgICB9Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGluc24gY2xhc3NlcyBmcm9tIHRoZSBnaXZlbiBsaW5lICovCi1zdGF0aWMgdm9pZAotcGFyc2VfcmVzb3VyY2VfdXNlcnMocmVmLCB1c2Vyc3AsIG51c2Vyc3AsIG5vdGVzcCkKLSAgY2hhciAqcmVmOwotICBpbnQgKip1c2Vyc3A7Ci0gIGludCAqbnVzZXJzcDsKLSAgaW50ICoqbm90ZXNwOwotewotICBpbnQgYzsKLSAgY2hhciAqbGluZSA9IHhzdHJkdXAgKHJlZik7Ci0gIGNoYXIgKnRtcCA9IGxpbmU7Ci0gIGludCAqdXNlcnMgPSAqdXNlcnNwOwotICBpbnQgY291bnQgPSAqbnVzZXJzcDsKLSAgaW50ICpub3RlcyA9ICpub3Rlc3A7Ci0KLSAgYyA9ICp0bXA7Ci0gIHdoaWxlIChjICE9IDApCi0gICAgewotICAgICAgY2hhciAqbm90ZXN0cjsKLSAgICAgIGludCBub3RlOwotICAgICAgY2hhciAqeHNlY3Q7Ci0gICAgICBpbnQgaWNsYXNzOwotICAgICAgaW50IGNyZWF0ZSA9IDA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgCi0gICAgICB3aGlsZSAoaXNzcGFjZSgqdG1wKSkKLSAgICAgICAgKyt0bXA7Ci0gICAgICBuYW1lID0gdG1wOwotICAgICAgd2hpbGUgKCp0bXAgJiYgKnRtcCAhPSAnLCcpCi0gICAgICAgICsrdG1wOwotICAgICAgYyA9ICp0bXA7Ci0gICAgICAqdG1wKysgPSAnXDAnOwotICAgICAgCi0gICAgICB4c2VjdCA9IHN0cmNocihuYW1lLCAnXFwnKTsKLSAgICAgIGlmICgobm90ZXN0ciA9IHN0cnN0cihuYW1lLCAiKyIpKSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqbmV4dG5vdGVzdHI7Ci0gICAgICAgICAgbm90ZSA9IGF0b2kgKG5vdGVzdHIgKyAxKTsKLSAgICAgICAgICBpZiAoKG5leHRub3Rlc3RyID0gc3RyY2hyIChub3Rlc3RyICsgMSwgJysnKSkgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogbm90ZSAxMyBhbHdheXMgaW1wbGllcyBub3RlIDEgKi8KLSAgICAgICAgICAgICAgaWYgKHN0cmNtcCAobm90ZXN0ciwgIisxKzEzIikgPT0gMCkKLSAgICAgICAgICAgICAgICBub3RlID0gMTM7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCF4c2VjdCB8fCBuZXh0bm90ZXN0ciA8IHhzZWN0KQotICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG11bHRpcGxlIG5vdGUgJXMgbm90IGhhbmRsZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbm90ZXN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCF4c2VjdCkKLSAgICAgICAgICAgICpub3Rlc3RyID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgICAgbm90ZSA9IDA7Ci0gICAgICAKLSAgICAgIC8qIEFsbCBjbGFzc2VzIGFyZSBjcmVhdGVkIHdoZW4gdGhlIGluc24gY2xhc3MgdGFibGUgaXMgcGFyc2VkOwotICAgICAgICAgSW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMgbWlnaHQgbm90IGFwcGVhciB1bnRpbCB0aGUgZGVwZW5kZW5jeSB0YWJsZXMKLSAgICAgICAgIGFyZSByZWFkLiAgT25seSBjcmVhdGUgbmV3IGNsYXNzZXMgaWYgaXQncyAqbm90KiBhbiBpbnNuIGNsYXNzLAotICAgICAgICAgb3IgaWYgaXQncyBhIGNvbXBvc2l0ZSBjbGFzcyAod2hpY2ggd291bGRuJ3QgbmVjZXNzYXJpbHkgYmUgaW4gdGhlIElDCi0gICAgICAgICB0YWJsZSkuCi0gICAgICAqLwotICAgICAgaWYgKHN0cm5jbXAobmFtZSwgIklDOiIsIDMpICE9IDAgfHwgeHNlY3QgIT0gTlVMTCkKLSAgICAgICAgY3JlYXRlID0gMTsKLSAgICAgIAotICAgICAgaWNsYXNzID0gZmV0Y2hfaW5zbl9jbGFzcyhuYW1lLCBjcmVhdGUpOwotICAgICAgaWYgKGljbGFzcyAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHVzZXJzID0gKGludCAqKQotICAgICAgICAgICAgeHJlYWxsb2MgKCh2b2lkICopdXNlcnMsKGNvdW50KzEpKnNpemVvZihpbnQpKTsKLSAgICAgICAgICBub3RlcyA9IChpbnQgKikKLSAgICAgICAgICAgIHhyZWFsbG9jICgodm9pZCAqKW5vdGVzLChjb3VudCsxKSpzaXplb2YoaW50KSk7Ci0gICAgICAgICAgbm90ZXNbY291bnRdID0gbm90ZTsKLSAgICAgICAgICB1c2Vyc1tjb3VudCsrXSA9IGljbGFzczsKLSAgICAgICAgICBtYXJrX3VzZWQgKGljc1tpY2xhc3NdLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICAgICAgcHJpbnRmKCJDbGFzcyAlcyBub3QgZm91bmRcbiIsIG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAvKiB1cGRhdGUgdGhlIHJldHVybiB2YWx1ZXMgKi8KLSAgKnVzZXJzcCA9IHVzZXJzOwotICAqbnVzZXJzcCA9IGNvdW50OwotICAqbm90ZXNwID0gbm90ZXM7Ci0KLSAgZnJlZSAobGluZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3NlbWFudGljcyAoY2hhciAqc2VtKQotewotICBpZiAoc3RyY21wIChzZW0sICJub25lIikgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9EVlNfTk9ORTsKLSAgZWxzZSBpZiAoc3RyY21wIChzZW0sICJpbXBsaWVkIikgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9EVlNfSU1QTElFRDsKLSAgZWxzZSBpZiAoc3RyY21wIChzZW0sICJpbXBsaWVkRiIpID09IDApCi0gICAgcmV0dXJuIElBNjRfRFZTX0lNUExJRURGOwotICBlbHNlIGlmIChzdHJjbXAgKHNlbSwgImRhdGEiKSA9PSAwKQotICAgIHJldHVybiBJQTY0X0RWU19EQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKHNlbSwgImluc3RyIikgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9EVlNfSU5TVFI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VtLCAic3BlY2lmaWMiKSA9PSAwKQotICAgIHJldHVybiBJQTY0X0RWU19TUEVDSUZJQzsKLSAgZWxzZSAKLSAgICByZXR1cm4gSUE2NF9EVlNfT1RIRVI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfZGVwIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpjaGssIGNvbnN0IGNoYXIgKnJlZywKLSAgICAgICAgIGludCBzZW1hbnRpY3MsIGludCBtb2RlLCBjaGFyICpleHRyYSwgaW50IGZsYWcpCi17Ci0gIHN0cnVjdCByZGVwICpyczsKLQotICBycyA9IGluc2VydF9yZXNvdXJjZSAobmFtZSwgbW9kZSk7Ci0gIHBhcnNlX3Jlc291cmNlX3VzZXJzIChjaGssICZycy0+Y2hrcywgJnJzLT5uY2hrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICZycy0+Y2hrbm90ZXMpOwotICBwYXJzZV9yZXNvdXJjZV91c2VycyAocmVnLCAmcnMtPnJlZ3MsICZycy0+bnJlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcnMtPnJlZ25vdGVzKTsKLSAgcnMtPnNlbWFudGljcyA9IHNlbWFudGljczsKLSAgcnMtPmV4dHJhID0gZXh0cmE7Ci0gIHJzLT53YXdfc3BlY2lhbCA9IGZsYWc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2FkX2RlcGZpbGUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBlbnVtIGlhNjRfZGVwZW5kZW5jeV9tb2RlIG1vZGUpCi17Ci0gIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gIGNoYXIgYnVmWzEwMjRdOwotCi0gIGlmIChmcCA9PSBOVUxMKXsKLSAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBmaW5kICVzIGZvciByZWFkaW5nXG4iLCBmaWxlbmFtZSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKTsKLSAgd2hpbGUgKCFmZW9mKGZwKSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lLCAqdG1wOwotICAgICAgaW50IHNlbWFudGljczsKLSAgICAgIGNoYXIgKmV4dHJhOwotICAgICAgY2hhciAqcmVncCwgKmNoa3A7Ci0KLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBzaXplb2YoYnVmKSwgZnApID09IE5VTEwpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICB3aGlsZSAoaXNzcGFjZShidWZbc3RybGVuKGJ1ZiktMV0pKQotICAgICAgICBidWZbc3RybGVuKGJ1ZiktMV0gPSAnXDAnOwotCi0gICAgICBuYW1lID0gdG1wID0gYnVmOwotICAgICAgd2hpbGUgKCp0bXAgIT0gJzsnKQotICAgICAgICArK3RtcDsKLSAgICAgICp0bXArKyA9ICdcMCc7Ci0gICAgICAKLSAgICAgIHdoaWxlIChpc3NwYWNlICgqdG1wKSkKLSAgICAgICAgKyt0bXA7Ci0gICAgICByZWdwID0gdG1wOwotICAgICAgdG1wID0gc3RyY2hyICh0bXAsICc7Jyk7Ci0gICAgICBpZiAoIXRtcCkKLSAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAqdG1wKysgPSAwOwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCp0bXApKQotICAgICAgICArK3RtcDsKLSAgICAgIGNoa3AgPSB0bXA7Ci0gICAgICB0bXAgPSBzdHJjaHIgKHRtcCwgJzsnKTsKLSAgICAgIGlmICghdG1wKQotICAgICAgICBhYm9ydCAoKTsKLSAgICAgICp0bXArKyA9IDA7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKnRtcCkpCi0gICAgICAgICsrdG1wOwotICAgICAgc2VtYW50aWNzID0gcGFyc2Vfc2VtYW50aWNzICh0bXApOwotICAgICAgZXh0cmEgPSBzZW1hbnRpY3MgPT0gSUE2NF9EVlNfT1RIRVIgPyB4c3RyZHVwICh0bXApIDogTlVMTDsKLQotICAgICAgLyogRm9yIFdBVyBlbnRyaWVzLCBpZiB0aGUgY2hrcyBhbmQgcmVncyBkaWZmZXIsIHdlIG5lZWQgdG8gZW50ZXIgdGhlCi0gICAgICAgICBlbnRyaWVzIGluIGJvdGggcG9zaXRpb25zIHNvIHRoYXQgdGhlIHRhYmxlcyB3aWxsIGJlIHBhcnNlZCBwcm9wZXJseSwKLSAgICAgICAgIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayAqLwotICAgICAgaWYgKG1vZGUgPT0gSUE2NF9EVl9XQVcgJiYgc3RyY21wIChyZWdwLCBjaGtwKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkX2RlcCAobmFtZSwgY2hrcCwgcmVncCwgc2VtYW50aWNzLCBtb2RlLCBleHRyYSwgMCk7Ci0gICAgICAgICAgYWRkX2RlcCAobmFtZSwgcmVncCwgY2hrcCwgc2VtYW50aWNzLCBtb2RlLCBleHRyYSwgMSk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFkZF9kZXAgKG5hbWUsIGNoa3AsIHJlZ3AsIHNlbWFudGljcywgbW9kZSwgZXh0cmEsIDApOwotICAgICAgICB9Ci0gICAgfQotICBmY2xvc2UoZnApOwotfQotCi1zdGF0aWMgdm9pZAotbG9hZF9kZXBlbmRlbmNpZXMoKQotewotICBsb2FkX2RlcGZpbGUgKCJpYTY0LXJhdy50YmwiLCBJQTY0X0RWX1JBVyk7Ci0gIGxvYWRfZGVwZmlsZSAoImlhNjQtd2F3LnRibCIsIElBNjRfRFZfV0FXKTsKLSAgbG9hZF9kZXBmaWxlICgiaWE2NC13YXIudGJsIiwgSUE2NF9EVl9XQVIpOwotCi0gIGlmIChkZWJ1ZykKLSAgICAgIHByaW50ZiAoIiVkIFJBVy9XQVcvV0FSIGRlcGVuZGVuY2llc1xuIiwgcmRlcHNsZW4pOwotfQotCi0vKiBpcyB0aGUgZ2l2ZW4gb3BlcmFuZCBhbiBpbmRpcmVjdCByZWdpc3RlciBmaWxlIG9wZXJhbmQ/ICovCi1zdGF0aWMgaW50IAotaXJmX29wZXJhbmQgKGludCBvcCwgY29uc3QgY2hhciAqZmllbGQpCi17Ci0gIGlmICghZmllbGQpCi0gICAgewotICAgICAgcmV0dXJuIG9wID09IElBNjRfT1BORF9SUl9SMyB8fCBvcCA9PSBJQTY0X09QTkRfREJSX1IzCi0gICAgICAgIHx8IG9wID09IElBNjRfT1BORF9JQlJfUjMgIHx8IG9wID09IElBNjRfT1BORF9QS1JfUjMKLQl8fCBvcCA9PSBJQTY0X09QTkRfUE1DX1IzICB8fCBvcCA9PSBJQTY0X09QTkRfUE1EX1IzCi0JfHwgb3AgPT0gSUE2NF9PUE5EX01TUl9SMyB8fCBvcCA9PSBJQTY0X09QTkRfQ1BVSURfUjM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICgob3AgPT0gSUE2NF9PUE5EX1JSX1IzICYmIHN0cnN0ciAoZmllbGQsICJyciIpKQotICAgICAgICAgICAgICB8fCAob3AgPT0gSUE2NF9PUE5EX0RCUl9SMyAmJiBzdHJzdHIgKGZpZWxkLCAiZGJyIikpCi0gICAgICAgICAgICAgIHx8IChvcCA9PSBJQTY0X09QTkRfSUJSX1IzICYmIHN0cnN0ciAoZmllbGQsICJpYnIiKSkKLSAgICAgICAgICAgICAgfHwgKG9wID09IElBNjRfT1BORF9QS1JfUjMgJiYgc3Ryc3RyIChmaWVsZCwgInBrciIpKQotICAgICAgICAgICAgICB8fCAob3AgPT0gSUE2NF9PUE5EX1BNQ19SMyAmJiBzdHJzdHIgKGZpZWxkLCAicG1jIikpCi0gICAgICAgICAgICAgIHx8IChvcCA9PSBJQTY0X09QTkRfUE1EX1IzICYmIHN0cnN0ciAoZmllbGQsICJwbWQiKSkKLSAgICAgICAgICAgICAgfHwgKG9wID09IElBNjRfT1BORF9NU1JfUjMgJiYgc3Ryc3RyIChmaWVsZCwgIm1zciIpKQotICAgICAgICAgICAgICB8fCAob3AgPT0gSUE2NF9PUE5EX0NQVUlEX1IzICYmIHN0cnN0ciAoZmllbGQsICJjcHVpZCIpKSk7Ci0gICAgfQotfQotCi0vKiBoYW5kbGUgbW92X2FyLCBtb3ZfYnIsIG1vdl9jciwgbW92X2luZGlyZWN0LCBtb3ZfaXAsIG1vdl9wciwgbW92X3BzciwgYW5kCi0gICBtb3ZfdW0gaW5zbiBjbGFzc2VzICovCi1zdGF0aWMgaW50Ci1pbl9pY2xhc3NfbW92X3ggKHN0cnVjdCBpYTY0X29wY29kZSAqaWRlc2MsIHN0cnVjdCBpY2xhc3MgKmljLCAKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICpmaWVsZCkKLXsKLSAgaW50IHBsYWluX21vdiA9IHN0cmNtcCAoaWRlc2MtPm5hbWUsICJtb3YiKSA9PSAwOwotCi0gIGlmICghZm9ybWF0KQotICAgIHJldHVybiAwOwotCi0gIHN3aXRjaCAoaWMtPm5hbWVbNF0pCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlICdhJzoKLSAgICAgIHsKLSAgICAgICAgaW50IGkgPSBzdHJjbXAgKGlkZXNjLT5uYW1lLCAibW92LmkiKSA9PSAwOwotICAgICAgICBpbnQgbSA9IHN0cmNtcCAoaWRlc2MtPm5hbWUsICJtb3YubSIpID09IDA7Ci0gICAgICAgIGludCBpMjYyNyA9IGkgJiYgaWRlc2MtPm9wZXJhbmRzWzBdID09IElBNjRfT1BORF9BUjM7Ci0gICAgICAgIGludCBpMjggPSBpICYmIGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfQVIzOwotICAgICAgICBpbnQgbTI5MzAgPSBtICYmIGlkZXNjLT5vcGVyYW5kc1swXSA9PSBJQTY0X09QTkRfQVIzOwotICAgICAgICBpbnQgbTMxID0gbSAmJiBpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX0FSMzsKLSAgICAgICAgaW50IHBzZXVkbzAgPSBwbGFpbl9tb3YgJiYgaWRlc2MtPm9wZXJhbmRzWzFdID09IElBNjRfT1BORF9BUjM7Ci0gICAgICAgIGludCBwc2V1ZG8xID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1swXSA9PSBJQTY0X09QTkRfQVIzOwotCi0gICAgICAgIC8qIElDOm1vdiBhciAqLwotICAgICAgICBpZiAoaTI2MjcpCi0gICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiSTI2IikgfHwgc3Ryc3RyIChmb3JtYXQsICJJMjciKTsKLSAgICAgICAgaWYgKGkyOCkKLSAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJJMjgiKSAhPSBOVUxMOwotICAgICAgICBpZiAobTI5MzApCi0gICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiTTI5IikgfHwgc3Ryc3RyIChmb3JtYXQsICJNMzAiKTsKLSAgICAgICAgaWYgKG0zMSkKLSAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJNMzEiKSAhPSBOVUxMOwotICAgICAgICBpZiAocHNldWRvMCB8fCBwc2V1ZG8xKQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICB7Ci0gICAgICAgIGludCBpMjEgPSBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX0IxOwotICAgICAgICBpbnQgaTIyID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfQjI7Ci0gICAgICAgIGlmIChpMjIpCi0gICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiSTIyIikgIT0gTlVMTDsKLSAgICAgICAgaWYgKGkyMSkKLSAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJJMjEiKSAhPSBOVUxMOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICB7Ci0gICAgICAgIGludCBtMzIgPSBwbGFpbl9tb3YgJiYgaWRlc2MtPm9wZXJhbmRzWzBdID09IElBNjRfT1BORF9DUjM7Ci0gICAgICAgIGludCBtMzMgPSBwbGFpbl9tb3YgJiYgaWRlc2MtPm9wZXJhbmRzWzFdID09IElBNjRfT1BORF9DUjM7Ci0gICAgICAgIGlmIChtMzIpCi0gICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiTTMyIikgIT0gTlVMTDsKLSAgICAgICAgaWYgKG0zMykKLSAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJNMzMiKSAhPSBOVUxMOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBpZiAoaWMtPm5hbWVbNV0gPT0gJ24nKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG00MiA9IHBsYWluX21vdiAmJiBpcmZfb3BlcmFuZCAoaWRlc2MtPm9wZXJhbmRzWzBdLCBmaWVsZCk7Ci0gICAgICAgICAgaW50IG00MyA9IHBsYWluX21vdiAmJiBpcmZfb3BlcmFuZCAoaWRlc2MtPm9wZXJhbmRzWzFdLCBmaWVsZCk7Ci0gICAgICAgICAgaWYgKG00MikKLSAgICAgICAgICAgIHJldHVybiBzdHJzdHIgKGZvcm1hdCwgIk00MiIpICE9IE5VTEw7Ci0gICAgICAgICAgaWYgKG00MykKLSAgICAgICAgICAgIHJldHVybiBzdHJzdHIgKGZvcm1hdCwgIk00MyIpICE9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGljLT5uYW1lWzVdID09ICdwJykKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX0lQOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgICBpZiAoaWMtPm5hbWVbNV0gPT0gJ3InKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGkyNSA9IHBsYWluX21vdiAmJiBpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX1BSOwotICAgICAgICAgIGludCBpMjMgPSBwbGFpbl9tb3YgJiYgaWRlc2MtPm9wZXJhbmRzWzBdID09IElBNjRfT1BORF9QUjsKLSAgICAgICAgICBpbnQgaTI0ID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1swXSA9PSBJQTY0X09QTkRfUFJfUk9UOwotICAgICAgICAgIGlmIChpMjMpCi0gICAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJJMjMiKSAhPSBOVUxMOwotICAgICAgICAgIGlmIChpMjQpCi0gICAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJJMjQiKSAhPSBOVUxMOwotICAgICAgICAgIGlmIChpMjUpCi0gICAgICAgICAgICByZXR1cm4gc3Ryc3RyIChmb3JtYXQsICJJMjUiKSAhPSBOVUxMOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChpYy0+bmFtZVs1XSA9PSAncycpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbTM1ID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1swXSA9PSBJQTY0X09QTkRfUFNSX0w7Ci0gICAgICAgICAgaW50IG0zNiA9IHBsYWluX21vdiAmJiBpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX1BTUjsKLSAgICAgICAgICBpZiAobTM1KQotICAgICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiTTM1IikgIT0gTlVMTDsKLSAgICAgICAgICBpZiAobTM2KQotICAgICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiTTM2IikgIT0gTlVMTDsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3UnOgotICAgICAgewotICAgICAgICBpbnQgbTM1ID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1swXSA9PSBJQTY0X09QTkRfUFNSX1VNOwotICAgICAgICBpbnQgbTM2ID0gcGxhaW5fbW92ICYmIGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfUFNSX1VNOwotICAgICAgICBpZiAobTM1KQotICAgICAgICAgIHJldHVybiBzdHJzdHIgKGZvcm1hdCwgIk0zNSIpICE9IE5VTEw7Ci0gICAgICAgIGlmIChtMzYpCi0gICAgICAgICAgcmV0dXJuIHN0cnN0ciAoZm9ybWF0LCAiTTM2IikgIT0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogaXMgdGhlIGdpdmVuIG9wY29kZSBpbiB0aGUgZ2l2ZW4gaW5zbiBjbGFzcz8gKi8KLXN0YXRpYyBpbnQKLWluX2ljbGFzcyhzdHJ1Y3QgaWE2NF9vcGNvZGUgKmlkZXNjLCBzdHJ1Y3QgaWNsYXNzICppYywgCi0gICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICpmaWVsZCwgaW50ICpub3RlcCkKLXsKLSAgaW50IGk7Ci0gIGludCByZXNvbHZlZCA9IDA7Ci0KLSAgaWYgKGljLT5jb21tZW50KQotICAgIHsKLSAgICAgIGlmICghc3RybmNtcCAoaWMtPmNvbW1lbnQsICJGb3JtYXQiLCA2KSkKLSAgICAgICAgewotICAgICAgICAgIC8qIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBmb3JtYXQgc2VlbiBpcyB0aGUgbW9zdCByZXN0cmljdGl2ZSwgYW5kCi0gICAgICAgICAgICAgb25seSBrZWVwIGEgbGF0ZXIgb25lIGlmIGl0IGxvb2tzIGxpa2UgaXQncyBtb3JlIHJlc3RyaWN0aXZlLiAqLwotICAgICAgICAgIGlmIChmb3JtYXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChzdHJsZW4gKGljLT5jb21tZW50KSA8IHN0cmxlbiAoZm9ybWF0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBtb3N0IHJlY2VudCBmb3JtYXQgJyVzJ1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVhcnMgbW9yZSByZXN0cmljdGl2ZSB0aGFuICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpYy0+Y29tbWVudCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGljLT5jb21tZW50OyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZm9ybWF0ID0gaWMtPmNvbW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChpYy0+Y29tbWVudCwgIkZpZWxkIiwgNSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmllbGQpCi0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPdmVybGFwcGluZyBmaWVsZCAlcy0+JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpYy0+Y29tbWVudCwgZmllbGQpOwotICAgICAgICAgIGZpZWxkID0gaWMtPmNvbW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgLyogYW4gaW5zbiBjbGFzcyBtYXRjaGVzIGFueXRoaW5nIHRoYXQgaXMgdGhlIHNhbWUgZm9sbG93ZWQgYnkgY29tcGxldGVycywKLSAgICAgZXhjZXB0IHdoZW4gdGhlIGFic2VuY2UgYW5kIHByZXNlbmNlIG9mIGNvbXBsZXRlcnMgY29uc3RpdHV0ZXMgZGlmZmVyZW50Ci0gICAgIGluc3RydWN0aW9ucyAqLwotICBpZiAoaWMtPm5zdWJzID09IDAgJiYgaWMtPm54c3VicyA9PSAwKQotICAgIHsKLSAgICAgIGludCBpc19tb3YgPSBzdHJuY21wIChpZGVzYy0+bmFtZSwgIm1vdiIsIDMpID09IDA7Ci0gICAgICBpbnQgcGxhaW5fbW92ID0gc3RyY21wIChpZGVzYy0+bmFtZSwgIm1vdiIpID09IDA7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuKGljLT5uYW1lKTsKLQotICAgICAgcmVzb2x2ZWQgPSAoKHN0cm5jbXAgKGljLT5uYW1lLCBpZGVzYy0+bmFtZSwgbGVuKSA9PSAwKQotICAgICAgICAgICAgICAgICAgJiYgKGlkZXNjLT5uYW1lW2xlbl0gPT0gJ1wwJyAKLSAgICAgICAgICAgICAgICAgICAgICB8fCBpZGVzYy0+bmFtZVtsZW5dID09ICcuJykpOwotCi0gICAgICAvKiBhbGwgYnJlYWsgYW5kIG5vcCB2YXJpYXRpb25zIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotICAgICAgaWYgKHJlc29sdmVkICYmCi0gICAgICAgICAgKHN0cmNtcCAoaWMtPm5hbWUsICJicmVhayIpID09IDAKLSAgICAgICAgICAgfHwgc3RyY21wIChpYy0+bmFtZSwgIm5vcCIpID09IDApKQotICAgICAgICByZXNvbHZlZCA9IHN0cmNtcCAoaWMtPm5hbWUsIGlkZXNjLT5uYW1lKSA9PSAwOwotCi0gICAgICAvKiBhc3N1bWUgcmVzdHJpY3Rpb25zIGluIHRoZSBGT1JNQVQvRklFTEQgbmVnYXRlIHJlc29sdXRpb24sCi0gICAgICAgICB1bmxlc3Mgc3BlY2lmaWNhbGx5IGFsbG93ZWQgYnkgY2xhdXNlcyBpbiB0aGlzIGJsb2NrICovCi0gICAgICBpZiAocmVzb2x2ZWQgJiYgZmllbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBjaGVjayBGaWVsZChzZik9PXNOIGFnYWluc3Qgb3Bjb2RlIHNOICovCi0gICAgICAgICAgaWYgKHN0cnN0cihmaWVsZCwgIihzZik9PSIpICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNoYXIgKnNmOwotICAgICAgICAgICAgICBpZiAoKHNmID0gc3Ryc3RyIChpZGVzYy0+bmFtZSwgIi5zIikpICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBzdHJjbXAgKHNmICsgMSwgc3Ryc3RyIChmaWVsZCwgIj09IikgKyAyKSA9PSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAvKiBjaGVjayBGaWVsZChsZnR5cGUpPT1YWFggKi8KLSAgICAgICAgICBlbHNlIGlmIChzdHJzdHIgKGZpZWxkLCAiKGxmdHlwZSkiKSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc3Ryc3RyIChpZGVzYy0+bmFtZSwgImZhdWx0IikgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHN0cnN0ciAoZmllbGQsICJmYXVsdCIpICE9IE5VTEw7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHN0cnN0ciAoZmllbGQsICJmYXVsdCIpID09IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgLyogaGFuZGxlIEZpZWxkKGN0eXBlKT09WFhYICovCi0gICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyIChmaWVsZCwgIihjdHlwZSkiKSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc3Ryc3RyIChpZGVzYy0+bmFtZSwgIm9yLmFuZGNtIikpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBzdHJzdHIgKGZpZWxkLCAib3IuYW5kY20iKSAhPSBOVUxMOwotICAgICAgICAgICAgICBlbHNlIGlmIChzdHJzdHIgKGlkZXNjLT5uYW1lLCAiYW5kLm9yY20iKSkKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHN0cnN0ciAoZmllbGQsICJhbmQub3JjbSIpICE9IE5VTEw7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnN0ciAoaWRlc2MtPm5hbWUsICJvcmNtIikpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBzdHJzdHIgKGZpZWxkLCAib3Igb3JjbSIpICE9IE5VTEw7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnN0ciAoaWRlc2MtPm5hbWUsICJvciIpKQotICAgICAgICAgICAgICAgIHJlc29sdmVkID0gc3Ryc3RyIChmaWVsZCwgIm9yIG9yY20iKSAhPSBOVUxMOwotICAgICAgICAgICAgICBlbHNlIGlmIChzdHJzdHIgKGlkZXNjLT5uYW1lLCAiYW5kY20iKSkKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHN0cnN0ciAoZmllbGQsICJhbmQgYW5kY20iKSAhPSBOVUxMOwotICAgICAgICAgICAgICBlbHNlIGlmIChzdHJzdHIgKGlkZXNjLT5uYW1lLCAiYW5kIikpCi0gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBzdHJzdHIgKGZpZWxkLCAiYW5kIGFuZGNtIikgIT0gTlVMTDsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyIChpZGVzYy0+bmFtZSwgInVuYyIpKQotICAgICAgICAgICAgICAgIHJlc29sdmVkID0gc3Ryc3RyIChmaWVsZCwgInVuYyIpICE9IE5VTEw7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHN0cmNtcCAoZmllbGQsICJGaWVsZChjdHlwZSk9PSIpID09IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGlmIChyZXNvbHZlZCAmJiBmb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc3RybmNtcCAoaWRlc2MtPm5hbWUsICJkZXAiLCAzKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgJiYgc3Ryc3RyIChmb3JtYXQsICJJMTMiKSAhPSBOVUxMKQotICAgICAgICAgICAgcmVzb2x2ZWQgPSBpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX0lNTTg7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaWRlc2MtPm5hbWUsICJjaGsiLCAzKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgJiYgc3Ryc3RyIChmb3JtYXQsICJNMjEiKSAhPSBOVUxMKQotICAgICAgICAgICAgcmVzb2x2ZWQgPSBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX0YyOwotICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlkZXNjLT5uYW1lLCAibGZldGNoIiwgNikgPT0gMCkKLSAgICAgICAgICAgIHJlc29sdmVkID0gKHN0cnN0ciAoZm9ybWF0LCAiTTE0IE0xNSIpICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChpZGVzYy0+b3BlcmFuZHNbMV0gPT0gSUE2NF9PUE5EX1IyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaWRlc2MtPm9wZXJhbmRzWzFdID09IElBNjRfT1BORF9JTU05YikpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlkZXNjLT5uYW1lLCAiYnIuY2FsbCIsIDcpID09IDAKLSAgICAgICAgICAgICAgICAgICAmJiBzdHJzdHIgKGZvcm1hdCwgIkI1IikgIT0gTlVMTCkKLSAgICAgICAgICAgIHJlc29sdmVkID0gaWRlc2MtPm9wZXJhbmRzWzFdID09IElBNjRfT1BORF9CMjsKLSAgICAgICAgICBlbHNlIGlmIChzdHJuY21wIChpZGVzYy0+bmFtZSwgImJyLmNhbGwiLCA3KSA9PSAwCi0gICAgICAgICAgICAgICAgICAgJiYgc3Ryc3RyIChmb3JtYXQsICJCMyIpICE9IE5VTEwpCi0gICAgICAgICAgICByZXNvbHZlZCA9IGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfVEdUMjVjOwotICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlkZXNjLT5uYW1lLCAiYnJwIiwgMykgPT0gMAotICAgICAgICAgICAgICAgICAgICYmIHN0cnN0ciAoZm9ybWF0LCAiQjciKSAhPSBOVUxMKQotICAgICAgICAgICAgcmVzb2x2ZWQgPSBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX0IyOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaWMtPm5hbWUsICJpbnZhbGEiKSA9PSAwKQotICAgICAgICAgICAgcmVzb2x2ZWQgPSBzdHJjbXAgKGlkZXNjLT5uYW1lLCBpYy0+bmFtZSkgPT0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXNvbHZlZCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgLyogbWlzYyBicmwgdmFyaWF0aW9ucyAoJy5jb25kJyBpcyBvcHRpb25hbCk7IAotICAgICAgICAgcGxhaW4gYnJsIG1hdGNoZXMgYnJsLmNvbmQgKi8KLSAgICAgIGlmICghcmVzb2x2ZWQKLSAgICAgICAgICAmJiAoc3RyY21wIChpZGVzYy0+bmFtZSwgImJybCIpID09IDAKLSAgICAgICAgICAgICAgfHwgc3RybmNtcCAoaWRlc2MtPm5hbWUsICJicmwuIiwgNCkgPT0gMCkKLSAgICAgICAgICAmJiBzdHJjbXAgKGljLT5uYW1lLCAiYnJsLmNvbmQiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgIC8qIG1pc2MgYnIgdmFyaWF0aW9ucyAoJy5jb25kJyBpcyBvcHRpb25hbCkgKi8KLSAgICAgIGlmICghcmVzb2x2ZWQgCi0gICAgICAgICAgJiYgKHN0cmNtcCAoaWRlc2MtPm5hbWUsICJiciIpID09IDAKLSAgICAgICAgICAgICAgfHwgc3RybmNtcCAoaWRlc2MtPm5hbWUsICJici4iLCAzKSA9PSAwKQotICAgICAgICAgICYmIHN0cmNtcCAoaWMtPm5hbWUsICJici5jb25kIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmb3JtYXQpCi0gICAgICAgICAgICByZXNvbHZlZCA9IChzdHJzdHIgKGZvcm1hdCwgIkI0IikgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaWRlc2MtPm9wZXJhbmRzWzBdID09IElBNjRfT1BORF9CMikKLSAgICAgICAgICAgICAgfHwgKHN0cnN0ciAoZm9ybWF0LCAiQjEiKSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAmJiBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX1RHVDI1Yyk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzb2x2ZWQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgIC8qIHByb2JlIHZhcmlhdGlvbnMgKi8KLSAgICAgIGlmICghcmVzb2x2ZWQgJiYgc3RybmNtcCAoaWRlc2MtPm5hbWUsICJwcm9iZSIsIDUpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZCA9IHN0cmNtcCAoaWMtPm5hbWUsICJwcm9iZSIpID09IDAgCi0gICAgICAgICAgICAmJiAhKChzdHJzdHIgKGlkZXNjLT5uYW1lLCAiZmF1bHQiKSAhPSBOVUxMKSAKLSAgICAgICAgICAgICAgICAgXiAoZm9ybWF0ICYmIHN0cnN0ciAoZm9ybWF0LCAiTTQwIikgIT0gTlVMTCkpOwotICAgICAgICB9Ci0gICAgICAvKiBtb3YgdmFyaWF0aW9ucyAqLwotICAgICAgaWYgKCFyZXNvbHZlZCAmJiBpc19tb3YpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGxhaW5fbW92KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBtb3YgYWxpYXMgZm9yIGZtZXJnZSAqLwotICAgICAgICAgICAgICBpZiAoc3RyY21wIChpYy0+bmFtZSwgImZtZXJnZSIpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX0YxCi0gICAgICAgICAgICAgICAgICAgICYmIGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfRjM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvKiBtb3YgYWxpYXMgZm9yIGFkZHMgKHIzIG9yIGltbTE0KSAqLwotICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKGljLT5uYW1lLCAiYWRkcyIpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSAoaWRlc2MtPm9wZXJhbmRzWzBdID09IElBNjRfT1BORF9SMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfUjMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaWRlc2MtPm9wZXJhbmRzWzFdID09IElBNjRfT1BORF9JTU0xNCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIG1vdiBhbGlhcyBmb3IgYWRkbCAqLwotICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKGljLT5uYW1lLCAiYWRkbCIpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBpZGVzYy0+b3BlcmFuZHNbMF0gPT0gSUE2NF9PUE5EX1IxCi0gICAgICAgICAgICAgICAgICAgICYmIGlkZXNjLT5vcGVyYW5kc1sxXSA9PSBJQTY0X09QTkRfSU1NMjI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIC8qIHNvbWUgdmFyaWFudHMgb2YgbW92IGFuZCBtb3YuW2ltXSAqLwotICAgICAgICAgIGlmICghcmVzb2x2ZWQgJiYgc3RybmNtcCAoaWMtPm5hbWUsICJtb3ZfIiwgNCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBpbl9pY2xhc3NfbW92X3ggKGlkZXNjLCBpYywgZm9ybWF0LCBmaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBmbGFnIGFueSBpbnNuIGNsYXNzZXMgd2hpY2ggYXJlbid0IAotICAgICAgICAgbWFwcGVkIG9udG8gYXQgbGVhc3Qgb25lIHJlYWwgaW5zbiAqLwotICAgICAgaWYgKHJlc29sdmVkKQotICAgICAgICB7Ci0gICAgICAgICAgaWMtPnRlcm1pbmFsX3Jlc29sdmVkID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZSBmb3IgKGk9MDtpIDwgaWMtPm5zdWJzO2krKykKLSAgICB7Ci0gICAgICBpZiAoaW5faWNsYXNzKGlkZXNjLCBpY3NbaWMtPnN1YnNbaV1dLCBmb3JtYXQsIGZpZWxkLCBub3RlcCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgajsKLSAgICAgICAgICBmb3IgKGo9MDtqIDwgaWMtPm54c3VicztqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChpbl9pY2xhc3MoaWRlc2MsIGljc1tpYy0+eHN1YnNbal1dLCBOVUxMLCBOVUxMLCBOVUxMKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVidWcgPiAxKQotICAgICAgICAgICAgcHJpbnRmICgiJXMgaXMgaW4gSUMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIGlkZXNjLT5uYW1lLCBpYy0+bmFtZSk7Ci0gICAgICAgICAgcmVzb2x2ZWQgPSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAKLSAgLyogSWYgaXQncyBpbiB0aGlzIElDLCBhZGQgdGhlIElDIG5vdGUgKGlmIGFueSkgdG8gdGhlIGluc24gKi8KLSAgaWYgKHJlc29sdmVkKQotICAgIHsKLSAgICAgIGlmIChpYy0+bm90ZSAmJiBub3RlcCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgqbm90ZXAgJiYgKm5vdGVwICE9IGljLT5ub3RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBvdmVyd3JpdGluZyBub3RlICVkIHdpdGggbm90ZSAlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIihJQzolcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICpub3RlcCwgaWMtPm5vdGUsIGljLT5uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAqbm90ZXAgPSBpYy0+bm90ZTsKLSAgICAgICAgfQotICAgIH0KLQotICByZXR1cm4gcmVzb2x2ZWQ7Ci19Ci0KLQwKLXN0YXRpYyBpbnQKLWxvb2t1cF9yZWdpbmRleCAoY29uc3QgY2hhciAqbmFtZSwgaW50IHNwZWNpZmllcikKLXsKLSAgc3dpdGNoIChzcGVjaWZpZXIpCi0gICAgewotICAgIGNhc2UgSUE2NF9SU19BUlg6Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiW1JTQ10iKSkKLSAgICAgICAgcmV0dXJuIDE2OwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIltCU1BdIikpCi0gICAgICAgIHJldHVybiAxNzsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltCU1BTVE9SRV0iKSkKLSAgICAgICAgcmV0dXJuIDE4OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW1JOQVRdIikpCi0gICAgICAgIHJldHVybiAxOTsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltDQ1ZdIikpCi0gICAgICAgIHJldHVybiAzMjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltJVENdIikpCi0gICAgICAgIHJldHVybiA0NDsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltQRlNdIikpCi0gICAgICAgIHJldHVybiA2NDsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltMQ10iKSkKLSAgICAgICAgcmV0dXJuIDY1OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0VDXSIpKQotICAgICAgICByZXR1cm4gNjY7Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIElBNjRfUlNfQ1JYOgotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIltEQ1JdIikpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lUTV0iKSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICJbSVZBXSIpKQotICAgICAgICByZXR1cm4gMjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltQVEFdIikpCi0gICAgICAgIHJldHVybiA4OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0dQVEFdIikpCi0gICAgICAgIHJldHVybiA5OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lQU1JdIikpCi0gICAgICAgIHJldHVybiAxNjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltJU1JdIikpCi0gICAgICAgIHJldHVybiAxNzsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltJSVBdIikpCi0gICAgICAgIHJldHVybiAxOTsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltJRkFdIikpCi0gICAgICAgIHJldHVybiAyMDsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIltJVElSXSIpKQotICAgICAgICByZXR1cm4gMjE7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICJbSUlQQV0iKSkKLSAgICAgICAgcmV0dXJuIDIyOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lGU10iKSkKLSAgICAgICAgcmV0dXJuIDIzOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lJTV0iKSkKLSAgICAgICAgcmV0dXJuIDI0OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lIQV0iKSkKLSAgICAgICAgcmV0dXJuIDI1OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0xJRF0iKSkKLSAgICAgICAgcmV0dXJuIDY0OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lWUl0iKSkKLSAgICAgICAgcmV0dXJuIDY1OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW1RQUl0iKSkKLSAgICAgICAgcmV0dXJuIDY2OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0VPSV0iKSkKLSAgICAgICAgcmV0dXJuIDY3OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0lUVl0iKSkKLSAgICAgICAgcmV0dXJuIDcyOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW1BNVl0iKSkKLSAgICAgICAgcmV0dXJuIDczOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiW0NNQ1ZdIikpCi0gICAgICAgIHJldHVybiA3NDsKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgSUE2NF9SU19QU1I6Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiLmJlIikpCi0gICAgICAgIHJldHVybiAxOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLnVwIikpCi0gICAgICAgIHJldHVybiAyOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLmFjIikpCi0gICAgICAgIHJldHVybiAzOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLm1mbCIpKQotICAgICAgICByZXR1cm4gNDsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5tZmgiKSkKLSAgICAgICAgcmV0dXJuIDU7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuaWMiKSkKLSAgICAgICAgcmV0dXJuIDEzOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLmkiKSkKLSAgICAgICAgcmV0dXJuIDE0OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLnBrIikpCi0gICAgICAgIHJldHVybiAxNTsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5kdCIpKQotICAgICAgICByZXR1cm4gMTc7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuZGZsIikpCi0gICAgICAgIHJldHVybiAxODsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5kZmgiKSkKLSAgICAgICAgcmV0dXJuIDE5OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLnNwIikpCi0gICAgICAgIHJldHVybiAyMDsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5wcCIpKQotICAgICAgICByZXR1cm4gMjE7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuZGkiKSkKLSAgICAgICAgcmV0dXJuIDIyOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLnNpIikpCi0gICAgICAgIHJldHVybiAyMzsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5kYiIpKQotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIubHAiKSkKLSAgICAgICAgcmV0dXJuIDI1OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLnRiIikpCi0gICAgICAgIHJldHVybiAyNjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5ydCIpKQotICAgICAgICByZXR1cm4gMjc7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuY3BsIikpCi0gICAgICAgIHJldHVybiAzMjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5ycyIpKQotICAgICAgICByZXR1cm4gMzQ7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIubWMiKSkKLSAgICAgICAgcmV0dXJuIDM1OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLml0IikpCi0gICAgICAgIHJldHVybiAzNjsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5pZCIpKQotICAgICAgICByZXR1cm4gMzc7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuZGEiKSkKLSAgICAgICAgcmV0dXJuIDM4OwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLmRkIikpCi0gICAgICAgIHJldHVybiAzOTsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5zcyIpKQotICAgICAgICByZXR1cm4gNDA7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIucmkiKSkKLSAgICAgICAgcmV0dXJuIDQxOwotICAgICAgZWxzZSBpZiAoc3Ryc3RyIChuYW1lLCAiLmVkIikpCi0gICAgICAgIHJldHVybiA0MzsKLSAgICAgIGVsc2UgaWYgKHN0cnN0ciAobmFtZSwgIi5ibiIpKQotICAgICAgICByZXR1cm4gNDQ7Ci0gICAgICBlbHNlIGlmIChzdHJzdHIgKG5hbWUsICIuaWEiKSkKLSAgICAgICAgcmV0dXJuIDQ1OwotICAgICAgZWxzZQotICAgICAgICBhYm9ydCAoKTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gUkVHX05PTkU7Ci19Ci0KLXN0YXRpYyBpbnQKLWxvb2t1cF9zcGVjaWZpZXIgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIGlmIChzdHJjaHIgKG5hbWUsICclJykpCi0gICAgewotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkFSW0slXSIpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBJQTY0X1JTX0FSX0s7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiQVJbVU5BVF0iKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gSUE2NF9SU19BUl9VTkFUOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkFSJSwgJSBpbiA4IikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfQVI7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiQVIlLCAlIGluIDQ4IikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfQVJiOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkJSJSIpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBJQTY0X1JTX0JSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkNSW0lSUiVdIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfQ1JfSVJSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkNSW0xSUiVdIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfQ1JfTFJSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkNSJSIpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBJQTY0X1JTX0NSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIkZSJSwgJSBpbiAwIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfRlI7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiRlIlLCAlIGluIDIiKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gSUE2NF9SU19GUmI7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiR1IlIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfR1I7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiUFIlIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfUFI7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmchIERvbid0IGtub3cgaG93IHRvIHNwZWNpZnkgJSUgZGVwZW5kZW5jeSAlc1xuIiwKLSAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY2hyIChuYW1lLCAnIycpKQotICAgIHsKLSAgICAgIGlmIChzdHJzdHIgKG5hbWUsICJDUFVJRCMiKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gSUE2NF9SU19DUFVJRDsKLSAgICAgIGlmIChzdHJzdHIgKG5hbWUsICJEQlIjIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfREJSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIklCUiMiKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gSUE2NF9SU19JQlI7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiTVNSIyIpICE9IE5VTEwpCi0JcmV0dXJuIElBNjRfUlNfTVNSOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIlBLUiMiKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gSUE2NF9SU19QS1I7Ci0gICAgICBpZiAoc3Ryc3RyIChuYW1lLCAiUE1DIyIpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBJQTY0X1JTX1BNQzsKLSAgICAgIGlmIChzdHJzdHIgKG5hbWUsICJQTUQjIikgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIElBNjRfUlNfUE1EOwotICAgICAgaWYgKHN0cnN0ciAobmFtZSwgIlJSIyIpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBJQTY0X1JTX1JSOwotICAgICAgCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nISBEb24ndCBrbm93IGhvdyB0byBzcGVjaWZ5ICMgZGVwZW5kZW5jeSAlc1xuIiwKLSAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIkFSW0ZQU1JdIiwgOCkgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9SU19BUl9GUFNSOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiQVJbIiwgMykgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9SU19BUlg7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICJDUlsiLCAzKSA9PSAwKQotICAgIHJldHVybiBJQTY0X1JTX0NSWDsKLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIlBTUi4iLCA0KSA9PSAwKQotICAgIHJldHVybiBJQTY0X1JTX1BTUjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiSW5TZXJ2aWNlKiIpID09IDApCi0gICAgcmV0dXJuIElBNjRfUlNfSU5TRVJWSUNFOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJHUjAiKSA9PSAwKQotICAgIHJldHVybiBJQTY0X1JTX0dSMDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiQ0ZNIikgPT0gMCkKLSAgICByZXR1cm4gSUE2NF9SU19DRk07Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIlBSNjMiKSA9PSAwKQotICAgIHJldHVybiBJQTY0X1JTX1BSNjM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIlJTRSIpID09IDApCi0gICAgcmV0dXJuIElBNjRfUlNfUlNFOwotCi0gIHJldHVybiBJQTY0X1JTX0FOWTsKLX0KLQotdm9pZAotcHJpbnRfZGVwZW5kZW5jeV90YWJsZSAoKQotewotICBpbnQgaSwgajsKLQotICBpZiAoZGVidWcpIAotICAgIHsKLSAgICAgIGZvciAoaT0wO2kgPCBpY2xlbjtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaWNzW2ldLT5pc19jbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFpY3NbaV0tPm5zdWJzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IElDOiVzIiwgaWNzW2ldLT5uYW1lKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpY3NbaV0tPmNvbW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlslc10iLCBpY3NbaV0tPmNvbW1lbnQpOwotICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGhhcyBubyB0ZXJtaW5hbHMgb3Igc3ViLWNsYXNzZXNcbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWljc1tpXS0+dGVybWluYWxfcmVzb2x2ZWQgJiYgIWljc1tpXS0+b3JwaGFuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogbm8gaW5zbnMgbWFwcGVkIGRpcmVjdGx5IHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRlcm1pbmFsIElDICVzIiwgaWNzW2ldLT5uYW1lKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpY3NbaV0tPmNvbW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzXSAiLCBpY3NbaV0tPmNvbW1lbnQpOwotICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBmb3IgKGk9MDtpIDwgaWNsZW47aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGljc1tpXS0+b3JwaGFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYXJrX3VzZWQgKGljc1tpXSwgMSk7Ci0gICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IGNsYXNzICVzIGlzIGRlZmluZWQgYnV0IG5vdCB1c2VkXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgaWNzW2ldLT5uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpZiAoZGVidWcgPiAxKSBmb3IgKGk9MDtpIDwgcmRlcHNsZW47aSsrKQotICAgICAgICB7ICAKLSAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZV9zdHJbXSA9IHsgIlJBVyIsICJXQVciLCAiV0FSIiB9OwotICAgICAgICAgIGlmIChyZGVwc1tpXS0+dG90YWxfY2hrcyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiByc3JjICVzICglcykgaGFzIG5vIGNoa3Mlc1xuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgIHJkZXBzW2ldLT5uYW1lLCBtb2RlX3N0cltyZGVwc1tpXS0+bW9kZV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHJkZXBzW2ldLT50b3RhbF9yZWdzID8gIiIgOiAiIG9yIHJlZ3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChyZGVwc1tpXS0+dG90YWxfcmVncyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiByc3JjICVzICglcykgaGFzIG5vIHJlZ3NcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICByZGVwc1tpXS0+bmFtZSwgbW9kZV9zdHJbcmRlcHNbaV0tPm1vZGVdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAvKiB0aGUgZGVwZW5kZW5jaWVzIHRoZW1zZWx2ZXMgKi8KLSAgcHJpbnRmICgic3RhdGljIGNvbnN0IHN0cnVjdCBpYTY0X2RlcGVuZGVuY3lcbmRlcGVuZGVuY2llc1tdID0ge1xuIik7Ci0gIGZvciAoaT0wO2kgPCByZGVwc2xlbjtpKyspCi0gICAgewotICAgICAgLyogJyUnLCAnIycsIEFSW10sIENSW10sIG9yIFBTUi4gaW5kaWNhdGVzIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgYWN0dWFsCi0gICAgICAgICByZXNvdXJjZSB1c2VkICovIAotICAgICAgaW50IHNwZWNpZmllciA9IGxvb2t1cF9zcGVjaWZpZXIgKHJkZXBzW2ldLT5uYW1lKTsKLSAgICAgIGludCByZWdpbmRleCA9IGxvb2t1cF9yZWdpbmRleCAocmRlcHNbaV0tPm5hbWUsIHNwZWNpZmllcik7Ci0KLSAgICAgIHByaW50ZiAoIiAgeyBcIiVzXCIsICVkLCAlZCwgJWQsICVkLCAiLAotICAgICAgICAgICAgICByZGVwc1tpXS0+bmFtZSwgc3BlY2lmaWVyLAotICAgICAgICAgICAgICAoaW50KXJkZXBzW2ldLT5tb2RlLCAoaW50KXJkZXBzW2ldLT5zZW1hbnRpY3MsIHJlZ2luZGV4KTsKLSAgICAgIGlmIChyZGVwc1tpXS0+c2VtYW50aWNzID09IElBNjRfRFZTX09USEVSKQotICAgICAgICBwcmludGYgKCJcIiVzXCIsICIsIHJkZXBzW2ldLT5leHRyYSk7Ci0gICAgICBwcmludGYoIn0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG5cbiIpOwotCi0gIC8qIGFuZCBkZXBlbmRlbmN5IGxpc3RzICovCi0gIGZvciAoaT0wO2kgPCBkbGlzdGxlbjtpKyspCi0gICAgewotICAgICAgaW50IGxlbiA9IDI7Ci0gICAgICBwcmludGYgKCJzdGF0aWMgY29uc3Qgc2hvcnQgZGVwJWRbXSA9IHtcbiAgIiwgaSk7Ci0gICAgICBmb3IgKGo9MDtqIDwgZGxpc3RzW2ldLT5sZW47IGorKykKLSAgICAgICAgewotICAgICAgICAgIGxlbiArPSBwcmludGYgKCIlZCwgIiwgZGxpc3RzW2ldLT5kZXBzW2pdKTsKLSAgICAgICAgICBpZiAobGVuID4gNzUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByaW50ZigiXG4gICIpOwotICAgICAgICAgICAgICBsZW4gPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBwcmludGYgKCJcbn07XG5cbiIpOwotICAgIH0KLQotICAvKiBhbmQgb3Bjb2RlIGRlcGVuZGVuY3kgbGlzdCAqLwotICBwcmludGYgKCIjZGVmaW5lIE5FTFMoWCkgKHNpemVvZihYKS9zaXplb2YoWFswXSkpXG4iKTsKLSAgcHJpbnRmICgic3RhdGljIGNvbnN0IHN0cnVjdCBpYTY0X29wY29kZV9kZXBlbmRlbmN5XG4iKTsKLSAgcHJpbnRmICgib3BfZGVwZW5kZW5jaWVzW10gPSB7XG4iKTsKLSAgZm9yIChpPTA7aSA8IG9wZGVwbGVuO2krKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgIHsgIik7Ci0gICAgICBpZiAob3BkZXBzW2ldLT5jaGsgPT0gLTEpCi0gICAgICAgIHByaW50ZiAoIjAsIE5VTEwsICIpOwotICAgICAgZWxzZSAKLSAgICAgICAgcHJpbnRmICgiTkVMUyhkZXAlZCksIGRlcCVkLCAiLCBvcGRlcHNbaV0tPmNoaywgb3BkZXBzW2ldLT5jaGspOwotICAgICAgaWYgKG9wZGVwc1tpXS0+cmVnID09IC0xKQotICAgICAgICBwcmludGYgKCIwLCBOVUxMLCAiKTsKLSAgICAgIGVsc2UgCi0gICAgICAgIHByaW50ZiAoIk5FTFMoZGVwJWQpLCBkZXAlZCwgIiwgb3BkZXBzW2ldLT5yZWcsIG9wZGVwc1tpXS0+cmVnKTsKLSAgICAgIHByaW50ZiAoIn0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG5cbiIpOwotfQotCi0MCi0vKiBBZGQgU1RSIHRvIHRoZSBzdHJpbmcgdGFibGUuICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2VudHJ5ICoKLWluc2VydF9zdHJpbmcgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBpbnQgc3RhcnQgPSAwLCBlbmQgPSBzdHJ0YWJsZW47Ci0gIGludCBpLCB4OwotCi0gIGlmIChzdHJ0YWJsZW4gPT0gc3RydGFidG90bGVuKQotICAgIHsKLSAgICAgIHN0cnRhYnRvdGxlbiArPSAyMDsKLSAgICAgIHN0cmluZ190YWJsZSA9IChzdHJ1Y3Qgc3RyaW5nX2VudHJ5ICoqKQotCXhyZWFsbG9jIChzdHJpbmdfdGFibGUsIAotCQkgIHNpemVvZiAoc3RydWN0IHN0cmluZ19lbnRyeSAqKikgKiBzdHJ0YWJ0b3RsZW4pOwotICAgIH0KLQotICBpZiAoc3RydGFibGVuID09IDApCi0gICAgewotICAgICAgc3RydGFibGVuID0gMTsKLSAgICAgIHN0cmluZ190YWJsZVswXSA9IHRtYWxsb2MgKHN0cnVjdCBzdHJpbmdfZW50cnkpOwotICAgICAgc3RyaW5nX3RhYmxlWzBdLT5zID0geHN0cmR1cCAoc3RyKTsKLSAgICAgIHN0cmluZ190YWJsZVswXS0+bnVtID0gMDsKLSAgICAgIHJldHVybiBzdHJpbmdfdGFibGVbMF07Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHN0ciwgc3RyaW5nX3RhYmxlW3N0cnRhYmxlbiAtIDFdLT5zKSA+IDApCi0gICAgewotICAgICAgaSA9IGVuZDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCBzdHJpbmdfdGFibGVbMF0tPnMpIDwgMCkKLSAgICB7Ci0gICAgICBpID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpbnQgYzsKLQotCSAgaSA9IChzdGFydCArIGVuZCkgLyAyOwotCSAgYyA9IHN0cmNtcCAoc3RyLCBzdHJpbmdfdGFibGVbaV0tPnMpOwotCSAgaWYgKGMgPCAwKQotCSAgICB7Ci0JICAgICAgZW5kID0gaSAtIDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgPT0gMCkKLQkgICAgewotCSAgICAgIHJldHVybiBzdHJpbmdfdGFibGVbaV07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0YXJ0ID0gaSArIDE7Ci0JICAgIH0KLQkgIGlmIChzdGFydCA+IGVuZCkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZm9yICg7IGkgPiAwICYmIGkgPCBzdHJ0YWJsZW47IGktLSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChzdHIsIHN0cmluZ190YWJsZVtpIC0gMV0tPnMpID4gMCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBmb3IgKDsgaSA8IHN0cnRhYmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHN0ciwgc3RyaW5nX3RhYmxlW2ldLT5zKSA8IDApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZm9yICh4ID0gc3RydGFibGVuIC0gMTsgeCA+PSBpOyB4LS0pCi0gICAgewotICAgICAgc3RyaW5nX3RhYmxlW3ggKyAxXSA9IHN0cmluZ190YWJsZVt4XTsKLSAgICAgIHN0cmluZ190YWJsZVt4ICsgMV0tPm51bSA9IHggKyAxOwotICAgIH0KLSAgc3RyaW5nX3RhYmxlW2ldID0gdG1hbGxvYyAoc3RydWN0IHN0cmluZ19lbnRyeSk7Ci0gIHN0cmluZ190YWJsZVtpXS0+cyA9IHhzdHJkdXAgKHN0cik7Ci0gIHN0cmluZ190YWJsZVtpXS0+bnVtID0gaTsKLSAgc3RydGFibGVuKys7Ci0gIHJldHVybiBzdHJpbmdfdGFibGVbaV07Ci19Ci0MCi1zdHJ1Y3QgYml0dHJlZSAqCi1tYWtlX2JpdHRyZWVfZW50cnkgKCkKLXsKLSAgc3RydWN0IGJpdHRyZWUgKnJlcyA9IHRtYWxsb2MgKHN0cnVjdCBiaXR0cmVlKTsKLQotICByZXMtPmRpc2VudCA9IE5VTEw7Ci0gIHJlcy0+Yml0c1swXSA9IE5VTEw7Ci0gIHJlcy0+Yml0c1sxXSA9IE5VTEw7Ci0gIHJlcy0+Yml0c1syXSA9IE5VTEw7Ci0gIHJlcy0+c2tpcF9mbGFnID0gMDsKLSAgcmVzLT5iaXRzX3RvX3NraXAgPSAwOwotICByZXR1cm4gcmVzOwotfQotDAotc3RydWN0IGRpc2VudCAqCi1hZGRfZGlzX3RhYmxlX2VudCAod2hpY2gsIGluc24sIG9yZGVyLCBjb21wbGV0ZXJfaW5kZXgpCi0gICAgIHN0cnVjdCBkaXNlbnQgKndoaWNoOwotICAgICBpbnQgaW5zbjsKLSAgICAgaW50IG9yZGVyOwotICAgICBpbnQgY29tcGxldGVyX2luZGV4OwotewotICBpbnQgY2kgPSAwOwotICBzdHJ1Y3QgZGlzZW50ICplbnQ7Ci0KLSAgaWYgKHdoaWNoICE9IE5VTEwpCi0gICAgewotICAgICAgZW50ID0gd2hpY2g7Ci0KLSAgICAgIGVudC0+bmV4dGNudCsrOwotICAgICAgd2hpbGUgKGVudC0+bmV4dGUgIT0gTlVMTCkKLQl7Ci0JICBlbnQgPSBlbnQtPm5leHRlOwotCX0KLSAgICAgIGVudCA9IChlbnQtPm5leHRlID0gdG1hbGxvYyAoc3RydWN0IGRpc2VudCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVudCA9IHRtYWxsb2MgKHN0cnVjdCBkaXNlbnQpOwotICAgICAgZW50LT5uZXh0X2VudCA9IGRpc2luc250YWJsZTsKLSAgICAgIGRpc2luc250YWJsZSA9IGVudDsKLSAgICAgIHdoaWNoID0gZW50OwotICAgIH0KLSAgZW50LT5uZXh0Y250ID0gMDsKLSAgZW50LT5uZXh0ZSA9IE5VTEw7Ci0gIGVudC0+aW5zbiA9IGluc247Ci0gIGVudC0+cHJpb3JpdHkgPSBvcmRlcjsKLQotICB3aGlsZSAoY29tcGxldGVyX2luZGV4ICE9IDEpCi0gICAgewotICAgICAgY2kgPSAoY2kgPDwgMSkgfCAoY29tcGxldGVyX2luZGV4ICYgMSk7Ci0gICAgICBjb21wbGV0ZXJfaW5kZXggPj49IDE7Ci0gICAgfQotICBlbnQtPmNvbXBsZXRlcl9pbmRleCA9IGNpOwotICByZXR1cm4gd2hpY2g7Ci19Ci0MCi12b2lkCi1maW5pc2hfZGlzdGFibGUgKCkKLXsKLSAgc3RydWN0IGRpc2VudCAqZW50ID0gZGlzaW5zbnRhYmxlOwotICBzdHJ1Y3QgZGlzZW50ICpwcmV2ID0gZW50OwotCi0gIGVudC0+b3VybnVtID0gMzI3Njg7Ci0gIHdoaWxlICgoZW50ID0gZW50LT5uZXh0X2VudCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBlbnQtPm91cm51bSA9IHByZXYtPm91cm51bSArIHByZXYtPm5leHRjbnQgKyAxOwotICAgICAgcHJldiA9IGVudDsKLSAgICB9Ci19Ci0MCi12b2lkCi1pbnNlcnRfYml0X3RhYmxlX2VudCAoY3Vycl9lbnQsIGJpdCwgb3Bjb2RlLCBtYXNrLCAKLSAgICAgICAgICAgICAgICAgICAgICBvcGNvZGVudW0sIG9yZGVyLCBjb21wbGV0ZXJfaW5kZXgpCi0gICAgIHN0cnVjdCBiaXR0cmVlICpjdXJyX2VudDsKLSAgICAgaW50IGJpdDsKLSAgICAgaWE2NF9pbnNuIG9wY29kZTsgCi0gICAgIGlhNjRfaW5zbiBtYXNrOwotICAgICBpbnQgb3Bjb2RlbnVtOwotICAgICBpbnQgb3JkZXI7Ci0gICAgIGludCBjb21wbGV0ZXJfaW5kZXg7Ci17Ci0gIGlhNjRfaW5zbiBtOwotICBpbnQgYjsKLSAgc3RydWN0IGJpdHRyZWUgKm5leHQ7Ci0KLSAgaWYgKGJpdCA9PSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGlzZW50ICpuZW50ID0gYWRkX2Rpc190YWJsZV9lbnQgKGN1cnJfZW50LT5kaXNlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGVudW0sIG9yZGVyLAotCQkJCQkgICAgICAgY29tcGxldGVyX2luZGV4KTsKLSAgICAgIGN1cnJfZW50LT5kaXNlbnQgPSBuZW50OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBtID0gKChpYTY0X2luc24pIDEpIDw8IGJpdDsKLQotICBpZiAobWFzayAmIG0pCi0gICAgewotICAgICAgYiA9IChvcGNvZGUgJiBtKSA/IDEgOiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGIgPSAyOwotICAgIH0KLSAgbmV4dCA9IGN1cnJfZW50LT5iaXRzW2JdOwotICBpZiAobmV4dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5leHQgPSBtYWtlX2JpdHRyZWVfZW50cnkgKCk7Ci0gICAgICBjdXJyX2VudC0+Yml0c1tiXSA9IG5leHQ7Ci0gICAgfQotICBpbnNlcnRfYml0X3RhYmxlX2VudCAobmV4dCwgYml0IC0gMSwgb3Bjb2RlLCBtYXNrLCBvcGNvZGVudW0sIG9yZGVyLAotCQkJY29tcGxldGVyX2luZGV4KTsKLX0KLQwKLXZvaWQKLWFkZF9kaXNfZW50cnkgKGZpcnN0LCBvcGNvZGUsIG1hc2ssIG9wY29kZW51bSwgZW50LCBjb21wbGV0ZXJfaW5kZXgpCi0gICAgIHN0cnVjdCBiaXR0cmVlICpmaXJzdDsKLSAgICAgaWE2NF9pbnNuIG9wY29kZTsKLSAgICAgaWE2NF9pbnNuIG1hc2s7Ci0gICAgIGludCBvcGNvZGVudW07Ci0gICAgIHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKmVudDsKLSAgICAgaW50IGNvbXBsZXRlcl9pbmRleDsKLXsKLSAgaWYgKGNvbXBsZXRlcl9pbmRleCAmICgxIDw8IDIwKSkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlhNjRfaW5zbiBuZXdvcGNvZGUgPSAob3Bjb2RlICYgKH4gZW50LT5tYXNrKSkgfCBlbnQtPmJpdHM7Ci0gICAgICBhZGRfZGlzX2VudHJ5IChmaXJzdCwgbmV3b3Bjb2RlLCBtYXNrLCBvcGNvZGVudW0sIGVudC0+YWRkbF9lbnRyaWVzLAotCQkgICAgIChjb21wbGV0ZXJfaW5kZXggPDwgMSkgfCAxKTsKLSAgICAgIGlmIChlbnQtPmlzX3Rlcm1pbmFsKQotCXsKLQkgIGluc2VydF9iaXRfdGFibGVfZW50IChiaXR0cmVlLCA0MCwgbmV3b3Bjb2RlLCBtYXNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlbnVtLCBvcGNvZGVfY291bnQgLSBlbnQtPm9yZGVyIC0gMSwgCi0JCQkJKGNvbXBsZXRlcl9pbmRleCA8PCAxKSB8IDEpOwotCX0KLSAgICAgIGNvbXBsZXRlcl9pbmRleCA8PD0gMTsKLSAgICAgIGVudCA9IGVudC0+YWx0ZXJuYXRpdmU7Ci0gICAgfQotfQotDAotLyogVGhpcyBvcHRpbWl6YXRpb24gcGFzcyBjb21iaW5lcyBtdWx0aXBsZSAiZG9uJ3QgY2FyZSIgbm9kZXMuICovCi12b2lkCi1jb21wYWN0X2Rpc3RyZWUgKGVudCkKLSAgICAgc3RydWN0IGJpdHRyZWUgKmVudDsKLXsKLSNkZWZpbmUgSVNfU0tJUChlbnQpIFwKLSAgICAoKGVudC0+Yml0c1syXSAhPU5VTEwpIFwKLSAgICAgJiYgKGVudC0+Yml0c1swXSA9PSBOVUxMICYmIGVudC0+Yml0c1sxXSA9PSBOVUxMICYmIGVudC0+c2tpcF9mbGFnID09IDApKQotCi0gIGludCBiaXRjbnQgPSAwOwotICBzdHJ1Y3QgYml0dHJlZSAqbmVudCA9IGVudDsKLSAgaW50IHg7Ci0KLSAgd2hpbGUgKElTX1NLSVAgKG5lbnQpKQotICAgIHsKLSAgICAgIGJpdGNudCsrOwotICAgICAgbmVudCA9IG5lbnQtPmJpdHNbMl07Ci0gICAgfQotCi0gIGlmIChiaXRjbnQpCi0gICAgewotICAgICAgc3RydWN0IGJpdHRyZWUgKm5leHQgPSBlbnQtPmJpdHNbMl07Ci0KLSAgICAgIGVudC0+Yml0c1swXSA9IG5lbnQtPmJpdHNbMF07Ci0gICAgICBlbnQtPmJpdHNbMV0gPSBuZW50LT5iaXRzWzFdOwotICAgICAgZW50LT5iaXRzWzJdID0gbmVudC0+Yml0c1syXTsKLSAgICAgIGVudC0+ZGlzZW50ID0gbmVudC0+ZGlzZW50OwotICAgICAgZW50LT5za2lwX2ZsYWcgPSAxOwotICAgICAgZW50LT5iaXRzX3RvX3NraXAgPSBiaXRjbnQ7Ci0gICAgICB3aGlsZSAobmV4dCAhPSBuZW50KQotCXsKLQkgIHN0cnVjdCBiaXR0cmVlICpiID0gbmV4dDsKLQkgIG5leHQgPSBuZXh0LT5iaXRzWzJdOwotCSAgZnJlZSAoYik7Ci0JfQotICAgICAgZnJlZSAobmVudCk7Ci0gICAgfQotCi0gIGZvciAoeCA9IDA7IHggPCAzOyB4KyspCi0gICAgewotICAgICAgc3RydWN0IGJpdHRyZWUgKmkgPSBlbnQtPmJpdHNbeF07Ci0gICAgICBpZiAoaSAhPSBOVUxMKQotCXsKLQkgIGNvbXBhY3RfZGlzdHJlZSAoaSk7Ci0JfQotICAgIH0KLX0KLQwKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnNuX2xpc3Q7Ci1zdGF0aWMgaW50IGluc25fbGlzdF9sZW4gPSAwOwotc3RhdGljIGludCB0b3RfaW5zbl9saXN0X2xlbiA9IDA7Ci0KLS8qIEdlbmVyYXRlIHRoZSBkaXNhc3NlbWJsZXIgc3RhdGUgbWFjaGluZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmVlCi0gICBpbiBFTlQuICAqLwotdm9pZAotZ2VuX2Rpc190YWJsZSAoZW50KQotICAgICBzdHJ1Y3QgYml0dHJlZSAqZW50OwotewotICBpbnQgeDsKLSAgaW50IG91cl9vZmZzZXQgPSBpbnNuX2xpc3RfbGVuOwotICBpbnQgYml0c3VzZWQgPSA1OwotICBpbnQgdG90Yml0cyA9IGJpdHN1c2VkOwotICBpbnQgbmVlZGVkX2J5dGVzOwotICBpbnQgemVyb19jb3VudCA9IDA7Ci0gIGludCB6ZXJvX2Rlc3QgPSAwOwkvKiBpbml0aWFsaXplIHRoaXMgd2l0aCAwIHRvIGtlZXAgZ2NjIHF1aWV0Li4uICovCi0KLSAgLyogSWYgdGhpcyBpcyBhIHRlcm1pbmFsIGVudHJ5LCB0aGVyZSdzIG5vIHBvaW50IGluIHNraXBwaW5nIGFueQotICAgICBiaXRzLiAqLwotICBpZiAoZW50LT5za2lwX2ZsYWcgJiYgZW50LT5iaXRzWzBdID09IE5VTEwgJiYgZW50LT5iaXRzWzFdID09IE5VTEwgJiYKLSAgICAgIGVudC0+Yml0c1syXSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlbnQtPmRpc2VudCA9PSBOVUxMKQotCXsKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlbnQtPnNraXBfZmxhZyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoaXMgZW50cnksIG9yIGF0IGxlYXN0Ci0gICAgIGEgY29uc2VydmF0aXZlbHkgbGFyZ2UgYXBwcm94aW1hdGlvbi4gKi8KLSAgaWYgKGVudC0+c2tpcF9mbGFnKQotICAgIHsKLSAgICAgIHRvdGJpdHMgKz0gNTsKLSAgICB9Ci0gIGZvciAoeCA9IDE7IHggPCAzOyB4KyspCi0gICAgewotICAgICAgaWYgKGVudC0+Yml0c1t4XSAhPSBOVUxMKQotCXsKLQkgIHRvdGJpdHMgKz0gMTY7Ci0JfQotICAgIH0KLQotICBpZiAoZW50LT5kaXNlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZW50LT5iaXRzWzJdICE9IE5VTEwpCi0JewotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgdG90Yml0cyArPSAxNjsKLSAgICB9Ci0KLSAgLyogTm93IGFsbG9jYXRlIHRoZSBzcGFjZS4gKi8KLSAgbmVlZGVkX2J5dGVzID0gKHRvdGJpdHMgKyA3KSAvIDg7Ci0gIGlmICgobmVlZGVkX2J5dGVzICsgaW5zbl9saXN0X2xlbikgPiB0b3RfaW5zbl9saXN0X2xlbikKLSAgICB7Ci0gICAgICB0b3RfaW5zbl9saXN0X2xlbiArPSAyNTY7Ci0gICAgICBpbnNuX2xpc3QgPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5zbl9saXN0LCB0b3RfaW5zbl9saXN0X2xlbik7Ci0gICAgfQotICBvdXJfb2Zmc2V0ID0gaW5zbl9saXN0X2xlbjsKLSAgaW5zbl9saXN0X2xlbiArPSBuZWVkZWRfYnl0ZXM7Ci0gIG1lbXNldCAoaW5zbl9saXN0ICsgb3VyX29mZnNldCwgMCwgbmVlZGVkX2J5dGVzKTsKLQotICAvKiBFbmNvZGUgdGhlIHNraXAgZW50cnkgYnkgc2V0dGluZyBiaXQgNiBzZXQgaW4gdGhlIHN0YXRlIG9wIGZpZWxkLAotICAgICBhbmQgc3RvcmUgdGhlICMgb2YgYml0cyB0byBza2lwIGltbWVkaWF0ZWx5IGFmdGVyLiAqLwotICBpZiAoZW50LT5za2lwX2ZsYWcpCi0gICAgewotICAgICAgYml0c3VzZWQgKz0gNTsKLSAgICAgIGluc25fbGlzdFtvdXJfb2Zmc2V0ICsgMF0gfD0gMHg0MCB8ICgoZW50LT5iaXRzX3RvX3NraXAgPj4gMikgJiAweGYpOwotICAgICAgaW5zbl9saXN0W291cl9vZmZzZXQgKyAxXSB8PSAoKGVudC0+Yml0c190b19za2lwICYgMykgPDwgNik7Ci0gICAgfQotCi0jZGVmaW5lIElTX09OTFlfSUZaRVJPKEVOVCkgXAotICAoKEVOVCktPmJpdHNbMF0gIT0gTlVMTCAmJiAoRU5UKS0+Yml0c1sxXSA9PSBOVUxMICYmIChFTlQpLT5iaXRzWzJdID09IE5VTEwgXAotICAgJiYgKEVOVCktPmRpc2VudCA9PSBOVUxMICYmIChFTlQpLT5za2lwX2ZsYWcgPT0gMCkKLQotICAvKiBTdG9yZSBhbiAiaWYgKGJpdCBpcyB6ZXJvKSIgaW5zdHJ1Y3Rpb24gYnkgc2V0dGluZyBiaXQgNyBpbiB0aGUKLSAgICAgc3RhdGUgb3AgZmllbGQuICovCi0KLSAgaWYgKGVudC0+Yml0c1swXSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiaXR0cmVlICpuZW50ID0gZW50LT5iaXRzWzBdOwotICAgICAgemVyb19jb3VudCA9IDA7Ci0KLSAgICAgIGluc25fbGlzdFtvdXJfb2Zmc2V0XSB8PSAweDgwOwotCi0gICAgICAvKiBXZSBjYW4gZW5jb2RlIHNlcXVlbmNlcyBvZiBtdWx0aXBsZSAiaWYgKGJpdCBpcyB6ZXJvKSIgdGVzdHMKLQkgYnkgc3RvcmluZyB0aGUgIyBvZiB6ZXJvIGJpdHMgdG8gY2hlY2sgaW4gdGhlIGxvd2VyIDMgYml0cyBvZgotCSB0aGUgaW5zdHJ1Y3Rpb24uICBIb3dldmVyLCB0aGlzIG9ubHkgYXBwbGllcyBpZiB0aGUgc3RhdGUKLQkgc29sZWx5IHRlc3RzIGZvciBhIHplcm8gYml0LiAgKi8KLQotICAgICAgaWYgKElTX09OTFlfSUZaRVJPIChlbnQpKQotCXsKLQkgIHdoaWxlIChJU19PTkxZX0lGWkVSTyAobmVudCkgJiYgemVyb19jb3VudCA8IDcpCi0JICAgIHsKLQkgICAgICBuZW50ID0gbmVudC0+Yml0c1swXTsKLQkgICAgICB6ZXJvX2NvdW50Kys7Ci0JICAgIH0KLQotCSAgaW5zbl9saXN0W291cl9vZmZzZXQgKyAwXSB8PSB6ZXJvX2NvdW50OwotCX0KLSAgICAgIHplcm9fZGVzdCA9IGluc25fbGlzdF9sZW47Ci0gICAgICBnZW5fZGlzX3RhYmxlIChuZW50KTsKLSAgICB9Ci0KLSAgLyogTm93IHN0b3JlIHRoZSByZW1haW5pbmcgdGVzdHMuICBXZSBhbHNvIGhhbmRsZSBhIHNvbGUgInRlcm1pbmF0aW9uCi0gICAgIGVudHJ5IiBieSBzdG9yaW5nIGl0IGFzIGFuICJhbnkgYml0IiB0ZXN0LiAgKi8KLQotICBmb3IgKHggPSAxOyB4IDwgMzsgeCsrKQotICAgIHsKLSAgICAgIGlmIChlbnQtPmJpdHNbeF0gIT0gTlVMTCB8fCAoeCA9PSAyICYmIGVudC0+ZGlzZW50ICE9IE5VTEwpKQotCXsKLQkgIHN0cnVjdCBiaXR0cmVlICppID0gZW50LT5iaXRzW3hdOwotCSAgaW50IGlkZXN0OwotCSAgaW50IGN1cnJiaXRzID0gMTU7Ci0KLQkgIGlmIChpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYnJhbmNoZWQgdG8gb25seSBjb25zaXN0cyBvZgotCQkgYSB0ZXJtaW5hdGlvbiBlbnRyeSwgdXNlIHRoZSB0ZXJtaW5hdGlvbiBlbnRyeSBhcyB0aGUKLQkJIHBsYWNlIHRvIGJyYW5jaCB0byBpbnN0ZWFkLiAgKi8KLQkgICAgICBpZiAoaS0+Yml0c1swXSA9PSBOVUxMICYmIGktPmJpdHNbMV0gPT0gTlVMTAotCQkgICYmIGktPmJpdHNbMl0gPT0gTlVMTCAmJiBpLT5kaXNlbnQgIT0gTlVMTCkKLQkJewotCQkgIGlkZXN0ID0gaS0+ZGlzZW50LT5vdXJudW07Ci0JCSAgaSA9IE5VTEw7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZGVzdCA9IGluc25fbGlzdF9sZW4gLSBvdXJfb2Zmc2V0OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlkZXN0ID0gZW50LT5kaXNlbnQtPm91cm51bTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgZGVzdGluYXRpb24gb2Zmc2V0IGZvciB0aGUgaWYgKGJpdCBpcyAxKSB0ZXN0IGlzIGxlc3MgCi0JICAgICB0aGFuIDI1NiBieXRlcyBhd2F5LCB3ZSBjYW4gc3RvcmUgaXQgYXMgOC1iaXRzIGluc3RlYWQgb2YgMTY7Ci0JICAgICB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJpdCA1IHNldCBmb3IgdGhlIDE2LWJpdCBhZGRyZXNzLCBhbmQgYml0Ci0JICAgICA0IGZvciB0aGUgOC1iaXQgYWRkcmVzcy4gIFNpbmNlIHdlJ3ZlIGFscmVhZHkgYWxsb2NhdGVkIDE2Ci0JICAgICBiaXRzIGZvciB0aGUgYWRkcmVzcyB3ZSBuZWVkIHRvIGRlYWxsb2NhdGUgdGhlIHNwYWNlLgotCi0JICAgICBOb3RlIHRoYXQgYnJhbmNoaW5ncyB3aXRoaW4gdGhlIHRhYmxlIGFyZSByZWxhdGl2ZSwgYW5kCi0JICAgICB0aGVyZSBhcmUgbm8gYnJhbmNoZXMgdGhhdCBicmFuY2ggcGFzdCBvdXIgaW5zdHJ1Y3Rpb24geWV0Ci0JICAgICBzbyB3ZSBkbyBub3QgbmVlZCB0byBhZGp1c3QgYW55IG90aGVyIG9mZnNldHMuICovCi0KLQkgIGlmICh4ID09IDEpCi0JICAgIHsKLQkgICAgICBpZiAoaWRlc3QgPD0gMjU2KQotCQl7Ci0JCSAgaW50IHN0YXJ0ID0gb3VyX29mZnNldCArIGJpdHN1c2VkIC8gOCArIDE7Ci0KLQkJICBtZW1tb3ZlIChpbnNuX2xpc3QgKyBzdGFydCwKLQkJCSAgIGluc25fbGlzdCArIHN0YXJ0ICsgMSwKLQkJCSAgIGluc25fbGlzdF9sZW4gLSAoc3RhcnQgKyAxKSk7Ci0JCSAgY3VycmJpdHMgPSA3OwotCQkgIHRvdGJpdHMgLT0gODsKLQkJICBuZWVkZWRfYnl0ZXMtLTsKLQkJICBpbnNuX2xpc3RfbGVuLS07Ci0JCSAgaW5zbl9saXN0W291cl9vZmZzZXRdIHw9IDB4MTA7Ci0JCSAgaWRlc3QtLTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc25fbGlzdFtvdXJfb2Zmc2V0XSB8PSAweDIwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEFuIGluc3RydWN0aW9uIHdoaWNoIHNvbGVseSBjb25zaXN0cyBvZiBhIHRlcm1pbmF0aW9uCi0JCSBtYXJrZXIgYW5kIHdob3NlIGRpc2Fzc2VtYmx5IG5hbWUgaW5kZXggaXMgPCA0MDk2Ci0JCSBjYW4gYmUgc3RvcmVkIGluIDE2IGJpdHMuICBUaGUgZW5jb2RpbmcgaXMgc2xpZ2h0bHkKLQkJIG9kZDsgdGhlIHVwcGVyIDQgYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIDB4MywgYW5kCi0JCSBiaXQgMyBsb3NlcyBpdHMgbm9ybWFsIG1lYW5pbmcuICAqLwotCi0JICAgICAgaWYgKGVudC0+Yml0c1swXSA9PSBOVUxMICYmIGVudC0+Yml0c1sxXSA9PSBOVUxMCi0JCSAgJiYgZW50LT5iaXRzWzJdID09IE5VTEwgJiYgZW50LT5za2lwX2ZsYWcgPT0gMAotCQkgICYmIGVudC0+ZGlzZW50ICE9IE5VTEwKLQkJICAmJiBlbnQtPmRpc2VudC0+b3VybnVtIDwgKDMyNzY4ICsgNDA5NikpCi0JCXsKLQkJICBpbnQgc3RhcnQgPSBvdXJfb2Zmc2V0ICsgYml0c3VzZWQgLyA4ICsgMTsKLQotCQkgIG1lbW1vdmUgKGluc25fbGlzdCArIHN0YXJ0LAotCQkJICAgaW5zbl9saXN0ICsgc3RhcnQgKyAxLAotCQkJICAgaW5zbl9saXN0X2xlbiAtIChzdGFydCArIDEpKTsKLQkJICBjdXJyYml0cyA9IDExOwotCQkgIHRvdGJpdHMgLT0gNTsKLQkJICBiaXRzdXNlZC0tOwotCQkgIG5lZWRlZF9ieXRlcy0tOwotCQkgIGluc25fbGlzdF9sZW4tLTsKLQkJICBpbnNuX2xpc3Rbb3VyX29mZnNldF0gfD0gMHgzMDsKLQkJICBpZGVzdCAmPSB+MzI3Njg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNuX2xpc3Rbb3VyX29mZnNldF0gfD0gMHgwODsKLQkJfQotCSAgICB9Ci0JICBpZiAoZGVidWcpCi0JICAgIHsKLQkgICAgICBpbnQgaWQgPSBpZGVzdDsKLQotCSAgICAgIGlmIChpID09IE5VTEwpCi0JCXsKLQkJICBpZCB8PSAzMjc2ODsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCEgKGlkICYgMzI3NjgpKQotCQl7Ci0JCSAgaWQgKz0gb3VyX29mZnNldDsKLQkJfQotCSAgICAgIGlmICh4ID09IDEpCi0JCXsKLQkJICBwcmludGYgKCIlZDogaWYgKDEpIGdvdG8gJWRcbiIsIG91cl9vZmZzZXQsIGlkKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHByaW50ZiAoIiVkOiB0cnkgJWRcbiIsIG91cl9vZmZzZXQsIGlkKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBiZWluZyBicmFuY2hlZCB0by4gKi8KLQkgIHdoaWxlIChjdXJyYml0cyA+PSAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqYnl0ZSA9IGluc25fbGlzdCArIG91cl9vZmZzZXQgKyBiaXRzdXNlZCAvIDg7Ci0KLQkgICAgICBpZiAoaWRlc3QgJiAoMSA8PCBjdXJyYml0cykpCi0JCXsKLQkJICAqYnl0ZSB8PSAoMSA8PCAoNyAtIChiaXRzdXNlZCAlIDgpKSk7Ci0JCX0KLQkgICAgICBiaXRzdXNlZCsrOwotCSAgICAgIGN1cnJiaXRzLS07Ci0JICAgIH0KLQotCSAgLyogTm93IGdlbmVyYXRlIHRoZSBzdGF0ZXMgZm9yIHRoZSBlbnRyeSBiZWluZyBicmFuY2hlZCB0by4gKi8KLQkgIGlmIChpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBnZW5fZGlzX3RhYmxlIChpKTsKLQkgICAgfQotCi0JfQotICAgIH0KLSAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIGlmIChlbnQtPnNraXBfZmxhZykKLQl7Ci0JICBwcmludGYgKCIlZDogc2tpcHBpbmcgJWRcbiIsIG91cl9vZmZzZXQsIGVudC0+Yml0c190b19za2lwKTsKLQl9Ci0gIAotICAgICAgaWYgKGVudC0+Yml0c1swXSAhPSBOVUxMKQotCXsKLQkgIHByaW50ZiAoIiVkOiBpZiAoMDolZCkgZ290byAlZFxuIiwgb3VyX29mZnNldCwgemVyb19jb3VudCArIDEsCi0JCSAgemVyb19kZXN0KTsKLQl9Ci0gICAgfQotICBpZiAoYml0c3VzZWQgIT0gdG90Yml0cykKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0MCi12b2lkCi1wcmludF9kaXNfdGFibGUgKCkKLXsKLSAgaW50IHg7Ci0gIHN0cnVjdCBkaXNlbnQgKmNlbnQgPSBkaXNpbnNudGFibGU7Ci0KLSAgcHJpbnRmICgic3RhdGljIGNvbnN0IGNoYXIgZGlzX3RhYmxlW10gPSB7XG4iKTsKLSAgZm9yICh4ID0gMDsgeCA8IGluc25fbGlzdF9sZW47IHgrKykKLSAgICB7Ci0gICAgICBpZiAoKHggPiAwKSAmJiAoKHggJSAxMikgPT0gMCkpCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBwcmludGYgKCIweCUwMngsICIsIGluc25fbGlzdFt4XSk7Ci0gICAgfQotICBwcmludGYgKCJcbn07XG5cbiIpOwotCi0gIHByaW50ZiAoInN0YXRpYyBjb25zdCBzdHJ1Y3QgaWE2NF9kaXNfbmFtZXMgaWE2NF9kaXNfbmFtZXNbXSA9IHtcbiIpOwotICB3aGlsZSAoY2VudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkaXNlbnQgKmVudCA9IGNlbnQ7Ci0KLSAgICAgIHdoaWxlIChlbnQgIT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJ7IDB4JXgsICVkLCAlZCwgJWQgfSxcbiIsIGVudC0+Y29tcGxldGVyX2luZGV4LAotCQkgIGVudC0+aW5zbiwgKGVudC0+bmV4dGUgIT0gTlVMTCA/IDEgOiAwKSwKLSAgICAgICAgICAgICAgICAgIGVudC0+cHJpb3JpdHkpOwotCSAgZW50ID0gZW50LT5uZXh0ZTsKLQl9Ci0gICAgICBjZW50ID0gY2VudC0+bmV4dF9lbnQ7Ci0gICAgfQotICBwcmludGYgKCJ9O1xuXG4iKTsKLX0KLQwKLXZvaWQKLWdlbmVyYXRlX2Rpc2Fzc2VtYmxlciAoKQotewotICBpbnQgaTsKLQotICBiaXR0cmVlID0gbWFrZV9iaXR0cmVlX2VudHJ5ICgpOwotCi0gIGZvciAoaT0wOyBpIDwgb3RsZW47aSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBtYWluX2VudHJ5ICpwdHIgPSBvcmRlcmVkX3RhYmxlW2ldOwotCi0gICAgICBpZiAocHRyLT5vcGNvZGUtPnR5cGUgIT0gSUE2NF9UWVBFX0RZTikKLQl7Ci0JICBhZGRfZGlzX2VudHJ5IChiaXR0cmVlLAotCQkJIHB0ci0+b3Bjb2RlLT5vcGNvZGUsIHB0ci0+b3Bjb2RlLT5tYXNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm1haW5faW5kZXgsCi0JCQkgcHRyLT5jb21wbGV0ZXJzLCAxKTsKLQl9Ci0gICAgfQotCi0gIGNvbXBhY3RfZGlzdHJlZSAoYml0dHJlZSk7Ci0gIGZpbmlzaF9kaXN0YWJsZSAoKTsKLSAgZ2VuX2Rpc190YWJsZSAoYml0dHJlZSk7Ci0KLSAgcHJpbnRfZGlzX3RhYmxlICgpOwotfQotDAotdm9pZAotcHJpbnRfc3RyaW5nX3RhYmxlICgpCi17Ci0gIGludCB4OwotICBjaGFyIGxidWZbODBdLCBidWZbODBdOwotICBpbnQgYmxlbiA9IDA7Ci0KLSAgcHJpbnRmICgic3RhdGljIGNvbnN0IGNoYXIgKmlhNjRfc3RyaW5nc1tdID0ge1xuIik7Ci0gIGxidWZbMF0gPSAnXDAnOwotICBmb3IgKHggPSAwOyB4IDwgc3RydGFibGVuOyB4KyspCi0gICAgewotICAgICAgaW50IGxlbjsKLSAgICAgIAotICAgICAgaWYgKHN0cmxlbiAoc3RyaW5nX3RhYmxlW3hdLT5zKSA+IDc1KQotCXsKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiBcIiVzXCIsIiwgc3RyaW5nX3RhYmxlW3hdLT5zKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLSAgICAgIGlmICgoYmxlbiArIGxlbikgPiA3NSkKLQl7Ci0JICBwcmludGYgKCIgJXNcbiIsIGxidWYpOwotCSAgbGJ1ZlswXSA9ICdcMCc7Ci0JICBibGVuID0gMDsKLQl9Ci0gICAgICBzdHJjYXQgKGxidWYsIGJ1Zik7Ci0gICAgICBibGVuICs9IGxlbjsKLSAgICB9Ci0gIGlmIChibGVuID4gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJXNcbiIsIGxidWYpOwotICAgIH0KLSAgcHJpbnRmICgifTtcblxuIik7Ci19Ci0MCi1zdGF0aWMgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqKmdsaXN0Owotc3RhdGljIGludCBnbGlzdGxlbiA9IDA7Ci1zdGF0aWMgaW50IGdsaXN0dG90bGVuID0gMDsKLQotLyogSWYgdGhlIGNvbXBsZXRlciB0cmVlcyBFTlQxIGFuZCBFTlQyIGFyZSBlcXVhbCwgcmV0dXJuIDEuICovCi0KLWludAotY29tcGxldGVyX2VudHJpZXNfZXEgKGVudDEsIGVudDIpCi0gICAgIHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKmVudDEsICplbnQyOwotewotICB3aGlsZSAoZW50MSAhPSBOVUxMICYmIGVudDIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZW50MS0+bmFtZS0+bnVtICE9IGVudDItPm5hbWUtPm51bQotCSAgfHwgZW50MS0+Yml0cyAhPSBlbnQyLT5iaXRzCi0JICB8fCBlbnQxLT5tYXNrICE9IGVudDItPm1hc2sKLQkgIHx8IGVudDEtPmlzX3Rlcm1pbmFsICE9IGVudDItPmlzX3Rlcm1pbmFsCi0gICAgICAgICAgfHwgZW50MS0+ZGVwZW5kZW5jaWVzICE9IGVudDItPmRlcGVuZGVuY2llcwotICAgICAgICAgIHx8IGVudDEtPm9yZGVyICE9IGVudDItPm9yZGVyKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICghIGNvbXBsZXRlcl9lbnRyaWVzX2VxIChlbnQxLT5hZGRsX2VudHJpZXMsIGVudDItPmFkZGxfZW50cmllcykpCi0JewotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZW50MSA9IGVudDEtPmFsdGVybmF0aXZlOwotICAgICAgZW50MiA9IGVudDItPmFsdGVybmF0aXZlOwotICAgIH0KLSAgcmV0dXJuIGVudDEgPT0gZW50MjsKLX0KLQwKLS8qIEluc2VydCBFTlQgaW50byB0aGUgZ2xvYmFsIGxpc3Qgb2YgY29tcGxldGVycyBhbmQgcmV0dXJuIGl0LiAgSWYgYW4KLSAgIGVxdWl2YWxlbnQgZW50cnkgKGFjY29yZGluZyB0byBjb21wbGV0ZXJfZW50cmllc19lcSkgYWxyZWFkeSBleGlzdHMsCi0gICBpdCBpcyByZXR1cm5lZCBpbnN0ZWFkLiAqLwotc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqCi1pbnNlcnRfZ2NsaXN0IChlbnQpCi0gICAgIHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKmVudDsKLXsKLSAgaWYgKGVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaW50IHg7Ci0gICAgICBpbnQgc3RhcnQgPSAwLCBlbmQ7Ci0KLSAgICAgIGVudC0+YWRkbF9lbnRyaWVzID0gaW5zZXJ0X2djbGlzdCAoZW50LT5hZGRsX2VudHJpZXMpOwotICAgICAgZW50LT5hbHRlcm5hdGl2ZSA9IGluc2VydF9nY2xpc3QgKGVudC0+YWx0ZXJuYXRpdmUpOwotCi0gICAgICBpID0gZ2xpc3RsZW4gLyAyOwotICAgICAgZW5kID0gZ2xpc3RsZW47Ci0KLSAgICAgIGlmIChnbGlzdHRvdGxlbiA9PSBnbGlzdGxlbikKLQl7Ci0JICBnbGlzdHRvdGxlbiArPSAyMDsKLQkgIGdsaXN0ID0gKHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKiopCi0JICAgIHhyZWFsbG9jIChnbGlzdCwgc2l6ZW9mIChzdHJ1Y3QgY29tcGxldGVyX2VudHJ5ICopICogZ2xpc3R0b3RsZW4pOwotCX0KLQotICAgICAgaWYgKGdsaXN0bGVuID09IDApCi0JewotCSAgZ2xpc3RbMF0gPSBlbnQ7Ci0JICBnbGlzdGxlbiA9IDE7Ci0JICByZXR1cm4gZW50OwotCX0KLQotICAgICAgaWYgKGVudC0+bmFtZS0+bnVtIDwgZ2xpc3RbMF0tPm5hbWUtPm51bSkKLQl7Ci0JICBpID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChlbnQtPm5hbWUtPm51bSA+IGdsaXN0W2VuZCAtIDFdLT5uYW1lLT5udW0pCi0JewotCSAgaSA9IGVuZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGM7Ci0KLQkgIHdoaWxlICgxKQotCSAgICB7Ci0JICAgICAgaSA9IChzdGFydCArIGVuZCkgLyAyOwotCSAgICAgIGMgPSBlbnQtPm5hbWUtPm51bSAtIGdsaXN0W2ldLT5uYW1lLT5udW07Ci0JICAgICAgaWYgKGMgPCAwKQotCQl7Ci0JCSAgZW5kID0gaSAtIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjID09IDApCi0JCXsKLQkJICB3aGlsZSAoaSA+IDAgCi0JCQkgJiYgZW50LT5uYW1lLT5udW0gPT0gZ2xpc3RbaSAtIDFdLT5uYW1lLT5udW0pCi0JCSAgICB7Ci0JCSAgICAgIGktLTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0YXJ0ID0gaSArIDE7Ci0JCX0KLQkgICAgICBpZiAoc3RhcnQgPiBlbmQpCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAoYyA9PSAwKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGkgPCBnbGlzdGxlbikKLQkJewotCQkgIGlmIChlbnQtPm5hbWUtPm51bSAhPSBnbGlzdFtpXS0+bmFtZS0+bnVtKQotCQkgICAgewotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoY29tcGxldGVyX2VudHJpZXNfZXEgKGVudCwgZ2xpc3RbaV0pKQotCQkgICAgewotCQkgICAgICByZXR1cm4gZ2xpc3RbaV07Ci0JCSAgICB9Ci0JCSAgaSsrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBmb3IgKDsgaSA+IDAgJiYgaSA8IGdsaXN0bGVuOyBpLS0pCi0JewotCSAgaWYgKGVudC0+bmFtZS0+bnVtID49IGdsaXN0W2kgLSAxXS0+bmFtZS0+bnVtKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBmb3IgKDsgaSA8IGdsaXN0bGVuOyBpKyspCi0JewotCSAgaWYgKGVudC0+bmFtZS0+bnVtIDwgZ2xpc3RbaV0tPm5hbWUtPm51bSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZm9yICh4ID0gZ2xpc3RsZW4gLSAxOyB4ID49IGk7IHgtLSkKLQl7Ci0JICBnbGlzdFt4ICsgMV0gPSBnbGlzdFt4XTsKLQl9Ci0gICAgICBnbGlzdFtpXSA9IGVudDsKLSAgICAgIGdsaXN0bGVuKys7Ci0gICAgfQotICByZXR1cm4gZW50OwotfQotDAotc3RhdGljIGludAotZ2V0X3ByZWZpeF9sZW4gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmM7Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYyA9IHN0cmNociAobmFtZSwgJy4nKTsKLSAgaWYgKGMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gYyAtIG5hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN0cmxlbiAobmFtZSk7Ci0gICAgfQotfQotDAotc3RhdGljIHZvaWQKLWNvbXB1dGVfY29tcGxldGVyX2JpdHMgKG1lbnQsIGVudCkKLSAgICAgc3RydWN0IG1haW5fZW50cnkgKm1lbnQ7Ci0gICAgIHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKmVudDsKLXsKLSAgd2hpbGUgKGVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbXB1dGVfY29tcGxldGVyX2JpdHMgKG1lbnQsIGVudC0+YWRkbF9lbnRyaWVzKTsKLQotICAgICAgaWYgKGVudC0+aXNfdGVybWluYWwpCi0JewotCSAgaWE2NF9pbnNuIG1hc2sgPSAwOwotCSAgaWE2NF9pbnNuIG91cl9iaXRzID0gZW50LT5iaXRzOwotCSAgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqcCA9IGVudC0+cGFyZW50OwotCSAgaWE2NF9pbnNuIHBfYml0czsKLQkgIGludCB4OwotCi0JICB3aGlsZSAocCAhPSBOVUxMICYmICEgcC0+aXNfdGVybWluYWwpCi0JICAgIHsKLQkgICAgICBwID0gcC0+cGFyZW50OwotCSAgICB9Ci0gICAgICAKLQkgIGlmIChwICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBwX2JpdHMgPSBwLT5iaXRzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwX2JpdHMgPSBtZW50LT5vcGNvZGUtPm9wY29kZTsKLQkgICAgfQotCi0JICBmb3IgKHggPSAwOyB4IDwgNjQ7IHgrKykKLQkgICAgewotCSAgICAgIGlhNjRfaW5zbiBtID0gKChpYTY0X2luc24pIDEpIDw8IHg7Ci0JICAgICAgaWYgKChwX2JpdHMgJiBtKSAhPSAob3VyX2JpdHMgJiBtKSkKLQkJewotCQkgIG1hc2sgfD0gbTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG91cl9iaXRzICY9IH5tOwotCQl9Ci0JICAgIH0KLQkgIGVudC0+Yml0cyA9IG91cl9iaXRzOwotCSAgZW50LT5tYXNrID0gbWFzazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZW50LT5iaXRzID0gMDsKLQkgIGVudC0+bWFzayA9IDA7Ci0JfQotCi0gICAgICBlbnQgPSBlbnQtPmFsdGVybmF0aXZlOwotICAgIH0KLX0KLQwKLS8qIEZpbmQgaWRlbnRpY2FsIGNvbXBsZXRlciB0cmVlcyB0aGF0IGFyZSB1c2VkIGluIGRpZmZlcmVudAotICAgaW5zdHJ1Y3Rpb25zIGFuZCBjb2xsYXBzZSB0aGVpciBlbnRyaWVzLiAqLwotdm9pZAotY29sbGFwc2VfcmVkdW5kYW50X2NvbXBsZXRlcnMgKCkKLXsKLSAgc3RydWN0IG1haW5fZW50cnkgKnB0cjsKLSAgaW50IHg7Ci0KLSAgZm9yIChwdHIgPSBtYWludGFibGU7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpCi0gICAgewotICAgICAgaWYgKHB0ci0+Y29tcGxldGVycyA9PSBOVUxMKQotCXsKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGNvbXB1dGVfY29tcGxldGVyX2JpdHMgKHB0ciwgcHRyLT5jb21wbGV0ZXJzKTsKLSAgICAgIHB0ci0+Y29tcGxldGVycyA9IGluc2VydF9nY2xpc3QgKHB0ci0+Y29tcGxldGVycyk7Ci0gICAgfQotCi0gIC8qIFRoZSB0YWJsZSBoYXMgYmVlbiBmaW5hbGl6ZWQsIG5vdyBudW1iZXIgdGhlIGluZGV4ZXMuICAqLwotICBmb3IgKHggPSAwOyB4IDwgZ2xpc3RsZW47IHgrKykKLSAgICB7Ci0gICAgICBnbGlzdFt4XS0+bnVtID0geDsKLSAgICB9Ci19Ci0MCi0KLS8qIGF0dGFjaCB0d28gbGlzdHMgb2YgZGVwZW5kZW5jaWVzIHRvIGVhY2ggb3Bjb2RlLgotICAgMSkgYWxsIHJlc291cmNlcyB3aGljaCwgd2hlbiBhbHJlYWR5IG1hcmtlZCBpbiB1c2UsIGNvbmZsaWN0IHdpdGggdGhpcwotICAgb3Bjb2RlIChjaGtzKSAKLSAgIDIpIGFsbCByZXNvdXJjZXMgd2hpY2ggbXVzdCBiZSBtYXJrZWQgaW4gdXNlIHdoZW4gdGhpcyBvcGNvZGUgaXMgdXNlZAotICAgKHJlZ3MpIAotKi8KLWludAotaW5zZXJ0X29wY29kZV9kZXBlbmRlbmNpZXMgKG9wYywgY21wKQotICAgICBzdHJ1Y3QgaWE2NF9vcGNvZGUgKm9wYzsKLSAgICAgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqY21wOwotewotICAvKiBub3RlIGFsbCByZXNvdXJjZXMgd2hpY2ggcG9pbnQgdG8gdGhpcyBvcGNvZGUuICByZmkgaGFzIHRoZSBtb3N0IGNoa3MKLSAgICAgKDc5KSBhbmQgY21weGNobmcgaGFzIHRoZSBtb3N0IHJlZ3MgKDU0KSBzbyAxMDAgaGVyZSBzaG91bGQgYmUgZW5vdWdoICovCi0gIGludCBpOwotICBpbnQgbnJlZ3MgPSAwOwotICB1bnNpZ25lZCBzaG9ydCByZWdzWzI1Nl07ICAgICAgICAgICAgICAgICAgCi0gIGludCBuY2hrcyA9IDA7Ci0gIHVuc2lnbmVkIHNob3J0IGNoa3NbMjU2XTsKLSAgLyogZmxhZyBpbnNucyBmb3Igd2hpY2ggbm8gY2xhc3MgbWF0Y2hlZDsgdGhlcmUgc2hvdWxkIGJlIG5vbmUgKi8KLSAgaW50IG5vX2NsYXNzX2ZvdW5kID0gMTsKLQotICBmb3IgKGk9MDtpIDwgcmRlcHNsZW47aSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCByZGVwICpycyA9IHJkZXBzW2ldOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG9wYy0+bmFtZSwgImNtcC5lcS5hbmQiKSA9PSAwCi0gICAgICAgICAgJiYgc3RybmNtcCAocnMtPm5hbWUsICJQUiUiLCAzKSA9PSAwCi0gICAgICAgICAgJiYgcnMtPm1vZGUgPT0gMSkKLSAgICAgICAgbm9fY2xhc3NfZm91bmQgPSA5OTsKLQotICAgICAgZm9yIChqPTA7IGogPCBycy0+bnJlZ3M7aisrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGljX25vdGUgPSAwOwotCi0gICAgICAgICAgaWYgKGluX2ljbGFzcyAob3BjLCBpY3NbcnMtPnJlZ3Nbal1dLCBOVUxMLCBOVUxMLCAmaWNfbm90ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIFdlIGNhbiBpZ25vcmUgaWNfbm90ZSAxMSBmb3Igbm9uIFBSIHJlc291cmNlcyAqLwotICAgICAgICAgICAgICBpZiAoaWNfbm90ZSA9PSAxMSAmJiBzdHJuY21wIChycy0+bmFtZSwgIlBSIiwgMikgIT0gMCkKLSAgICAgICAgICAgICAgICBpY19ub3RlID0gMDsKLQotICAgICAgICAgICAgICBpZiAoaWNfbm90ZSAhPSAwICYmIHJzLT5yZWdub3Rlc1tqXSAhPSAwCi0gICAgICAgICAgICAgICAgICAmJiBpY19ub3RlICE9IHJzLT5yZWdub3Rlc1tqXQotICAgICAgICAgICAgICAgICAgJiYgIShpY19ub3RlID09IDExICYmIHJzLT5yZWdub3Rlc1tqXSA9PSAxKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBJQyBub3RlICVkIGluIG9wY29kZSAlcyAoSUM6JXMpIgotICAgICAgICAgICAgICAgICAgICAgICAgICIgY29uZmxpY3RzIHdpdGggcmVzb3VyY2UgJXMgbm90ZSAlZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWNfbm90ZSwgb3BjLT5uYW1lLCBpY3NbcnMtPnJlZ3Nbal1dLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJzLT5uYW1lLCBycy0+cmVnbm90ZXNbal0pOwotICAgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBjbGFzcyBub3RlcyBvdmVycmlkZSByZXNvdXJjZSBub3Rlcy4KLSAgICAgICAgICAgICAgICAgU28gZmFyLCBvbmx5IG5vdGUgMTEgYXBwbGllcyB0byBhbiBJQyBpbnN0ZWFkIG9mIGEgcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgIGFuZCBub3RlIDExIGltcGxpZXMgbm90ZSAxLgotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKGljX25vdGUpCi0gICAgICAgICAgICAgICAgcmVnc1tucmVncysrXSA9IFJERVAoaWNfbm90ZSwgaSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZWdzW25yZWdzKytdID0gUkRFUChycy0+cmVnbm90ZXNbal0sIGkpOwotICAgICAgICAgICAgICBub19jbGFzc19mb3VuZCA9IDA7Ci0gICAgICAgICAgICAgICsrcnMtPnRvdGFsX3JlZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGZvciAoaj0wO2ogPCBycy0+bmNoa3M7aisrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGljX25vdGUgPSAwOwotCi0gICAgICAgICAgaWYgKGluX2ljbGFzcyAob3BjLCBpY3NbcnMtPmNoa3Nbal1dLCBOVUxMLCBOVUxMLCAmaWNfbm90ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIFdlIGNhbiBpZ25vcmUgaWNfbm90ZSAxMSBmb3Igbm9uIFBSIHJlc291cmNlcyAqLwotICAgICAgICAgICAgICBpZiAoaWNfbm90ZSA9PSAxMSAmJiBzdHJuY21wIChycy0+bmFtZSwgIlBSIiwgMikgIT0gMCkKLSAgICAgICAgICAgICAgICBpY19ub3RlID0gMDsKLQotICAgICAgICAgICAgICBpZiAoaWNfbm90ZSAhPSAwICYmIHJzLT5jaGtub3Rlc1tqXSAhPSAwCi0gICAgICAgICAgICAgICAgICAmJiBpY19ub3RlICE9IHJzLT5jaGtub3Rlc1tqXQotICAgICAgICAgICAgICAgICAgJiYgIShpY19ub3RlID09IDExICYmIHJzLT5jaGtub3Rlc1tqXSA9PSAxKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBJQyBub3RlICVkIGZvciBvcGNvZGUgJXMgKElDOiVzKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbmZsaWN0cyB3aXRoIHJlc291cmNlICVzIG5vdGUgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGljX25vdGUsIG9wYy0+bmFtZSwgaWNzW3JzLT5jaGtzW2pdXS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBycy0+bmFtZSwgcnMtPmNoa25vdGVzW2pdKTsKLSAgICAgICAgICAgICAgaWYgKGljX25vdGUpCi0gICAgICAgICAgICAgICAgY2hrc1tuY2hrcysrXSA9IFJERVAoaWNfbm90ZSwgaSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjaGtzW25jaGtzKytdID0gUkRFUChycy0+Y2hrbm90ZXNbal0sIGkpOwotICAgICAgICAgICAgICBub19jbGFzc19mb3VuZCA9IDA7Ci0gICAgICAgICAgICAgICsrcnMtPnRvdGFsX2Noa3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKG5vX2NsYXNzX2ZvdW5kKQotICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG9wY29kZSAlcyBoYXMgbm8gY2xhc3MgKG9wcyAlZCAlZCAlZClcbiIsIAotICAgICAgICAgICAgIG9wYy0+bmFtZSwgCi0gICAgICAgICAgICAgb3BjLT5vcGVyYW5kc1swXSwgb3BjLT5vcGVyYW5kc1sxXSwgb3BjLT5vcGVyYW5kc1syXSk7Ci0KLSAgcmV0dXJuIGluc2VydF9kZXBlbmRlbmNpZXMgKG5jaGtzLCBjaGtzLCBucmVncywgcmVncyk7Ci19Ci0MCi12b2lkCi1pbnNlcnRfY29tcGxldGVyX2VudHJ5IChvcGMsIHRhYmVudCwgb3JkZXIpCi0gICAgIHN0cnVjdCBpYTY0X29wY29kZSAqb3BjOwotICAgICBzdHJ1Y3QgbWFpbl9lbnRyeSAqdGFiZW50OwotICAgICBpbnQgb3JkZXI7Ci17Ci0gIHN0cnVjdCBjb21wbGV0ZXJfZW50cnkgKipwdHIgPSAmdGFiZW50LT5jb21wbGV0ZXJzOwotICBzdHJ1Y3QgY29tcGxldGVyX2VudHJ5ICpwYXJlbnQgPSBOVUxMOwotICBjaGFyIHBjb3B5WzEyOV0sICpwcmVmaXg7Ci0gIGludCBhdF9lbmQgPSAwOwotCi0gIGlmIChzdHJsZW4gKG9wYy0+bmFtZSkgPiAxMjgpCi0gICAgewotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBzdHJjcHkgKHBjb3B5LCBvcGMtPm5hbWUpOwotICBwcmVmaXggPSBwY29weSArIGdldF9wcmVmaXhfbGVuIChwY29weSk7Ci0gIGlmIChwcmVmaXhbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICBwcmVmaXgrKzsKLSAgICB9Ci0KLSAgd2hpbGUgKCEgYXRfZW5kKQotICAgIHsKLSAgICAgIGludCBuZWVkX25ld19lbnQgPSAxOwotICAgICAgaW50IHBsZW4gPSBnZXRfcHJlZml4X2xlbiAocHJlZml4KTsKLSAgICAgIHN0cnVjdCBzdHJpbmdfZW50cnkgKnNlbnQ7Ci0KLSAgICAgIGF0X2VuZCA9IChwcmVmaXhbcGxlbl0gPT0gJ1wwJyk7Ci0gICAgICBwcmVmaXhbcGxlbl0gPSAnXDAnOwotICAgICAgc2VudCA9IGluc2VydF9zdHJpbmcgKHByZWZpeCk7Ci0KLSAgICAgIHdoaWxlICgqcHRyICE9IE5VTEwpCi0JewotCSAgaW50IGNtcHJlcyA9IHNlbnQtPm51bSAtICgqcHRyKS0+bmFtZS0+bnVtOwotCi0JICBpZiAoY21wcmVzID09IDApCi0JICAgIHsKLQkgICAgICBuZWVkX25ld19lbnQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwdHIgPSAmKCgqcHRyKS0+YWx0ZXJuYXRpdmUpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG5lZWRfbmV3X2VudCkKLQl7Ci0JICBzdHJ1Y3QgY29tcGxldGVyX2VudHJ5ICpuZW50ID0gdG1hbGxvYyAoc3RydWN0IGNvbXBsZXRlcl9lbnRyeSk7Ci0JICBuZW50LT5uYW1lID0gc2VudDsKLQkgIG5lbnQtPnBhcmVudCA9IHBhcmVudDsKLQkgIG5lbnQtPmFkZGxfZW50cmllcyA9IE5VTEw7Ci0JICBuZW50LT5hbHRlcm5hdGl2ZSA9ICpwdHI7Ci0JICAqcHRyID0gbmVudDsKLQkgIG5lbnQtPmlzX3Rlcm1pbmFsID0gMDsKLSAgICAgICAgICBuZW50LT5kZXBlbmRlbmNpZXMgPSAtMTsKLQl9Ci0KLSAgICAgIGlmICghIGF0X2VuZCkKLQl7Ci0JICBwYXJlbnQgPSAqcHRyOwotCSAgcHRyID0gJigoKnB0ciktPmFkZGxfZW50cmllcyk7Ci0JICBwcmVmaXggKz0gcGxlbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoKCpwdHIpLT5pc190ZXJtaW5hbCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgKCpwdHIpLT5pc190ZXJtaW5hbCA9IDE7Ci0gICgqcHRyKS0+bWFzayA9IChpYTY0X2luc24pLTE7Ci0gICgqcHRyKS0+Yml0cyA9IG9wYy0+b3Bjb2RlOwotICAoKnB0ciktPmRlcGVuZGVuY2llcyA9IGluc2VydF9vcGNvZGVfZGVwZW5kZW5jaWVzIChvcGMsICpwdHIpOwotICAoKnB0ciktPm9yZGVyID0gb3JkZXI7Ci19Ci0MCi12b2lkCi1wcmludF9jb21wbGV0ZXJfZW50cnkgKGVudCkKLSAgICAgc3RydWN0IGNvbXBsZXRlcl9lbnRyeSAqZW50OwotewotICBpbnQgbW9mZnNldCA9IDA7Ci0gIGlhNjRfaW5zbiBtYXNrID0gZW50LT5tYXNrLCBiaXRzID0gZW50LT5iaXRzOwotCi0gIGlmIChtYXNrICE9IDApCi0gICAgewotICAgICAgd2hpbGUgKCEgKG1hc2sgJiAxKSkKLQl7Ci0JICBtb2Zmc2V0Kys7Ci0JICBtYXNrID0gbWFzayA+PiAxOwotCSAgYml0cyA9IGJpdHMgPj4gMTsKLQl9Ci0gICAgICBpZiAoYml0cyAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKQotCXsKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIAotICBwcmludGYgKCIgIHsgMHgleCwgMHgleCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCB9LFxuIiwKLQkgIChpbnQpYml0cywKLQkgIChpbnQpbWFzaywKLQkgIGVudC0+bmFtZS0+bnVtLAotCSAgZW50LT5hbHRlcm5hdGl2ZSAhPSBOVUxMID8gZW50LT5hbHRlcm5hdGl2ZS0+bnVtIDogLTEsCi0JICBlbnQtPmFkZGxfZW50cmllcyAhPSBOVUxMID8gZW50LT5hZGRsX2VudHJpZXMtPm51bSA6IC0xLAotCSAgbW9mZnNldCwKLQkgIGVudC0+aXNfdGVybWluYWwgPyAxIDogMCwKLSAgICAgICAgICBlbnQtPmRlcGVuZGVuY2llcyk7Ci19Ci0MCi12b2lkCi1wcmludF9jb21wbGV0ZXJfdGFibGUgKCkKLXsKLSAgaW50IHg7Ci0KLSAgcHJpbnRmICgic3RhdGljIGNvbnN0IHN0cnVjdCBpYTY0X2NvbXBsZXRlcl90YWJsZVxuY29tcGxldGVyX3RhYmxlW10gPSB7XG4iKTsKLSAgZm9yICh4ID0gMDsgeCA8IGdsaXN0bGVuOyB4KyspCi0gICAgewotICAgICAgcHJpbnRfY29tcGxldGVyX2VudHJ5IChnbGlzdFt4XSk7Ci0gICAgfQotICBwcmludGYgKCJ9O1xuXG4iKTsKLX0KLQwKLWludAotb3Bjb2Rlc19lcSAob3BjMSwgb3BjMikKLSAgICAgc3RydWN0IGlhNjRfb3Bjb2RlICpvcGMxOwotICAgICBzdHJ1Y3QgaWE2NF9vcGNvZGUgKm9wYzI7Ci17Ci0gIGludCB4OwotICBpbnQgcGxlbjEsIHBsZW4yOwotCi0gIGlmICgob3BjMS0+bWFzayAhPSBvcGMyLT5tYXNrKSB8fCAob3BjMS0+dHlwZSAhPSBvcGMyLT50eXBlKSAKLSAgICAgIHx8IChvcGMxLT5udW1fb3V0cHV0cyAhPSBvcGMyLT5udW1fb3V0cHV0cykKLSAgICAgIHx8IChvcGMxLT5mbGFncyAhPSBvcGMyLT5mbGFncykpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBmb3IgKHggPSAwOyB4IDwgNTsgeCsrKQotICAgIHsKLSAgICAgIGlmIChvcGMxLT5vcGVyYW5kc1t4XSAhPSBvcGMyLT5vcGVyYW5kc1t4XSkKLQl7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICBwbGVuMSA9IGdldF9wcmVmaXhfbGVuIChvcGMxLT5uYW1lKTsKLSAgcGxlbjIgPSBnZXRfcHJlZml4X2xlbiAob3BjMi0+bmFtZSk7Ci0gIGlmIChwbGVuMSA9PSBwbGVuMiAmJiAobWVtY21wIChvcGMxLT5uYW1lLCBvcGMyLT5uYW1lLCBwbGVuMSkgPT0gMCkpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLXZvaWQKLWFkZF9vcGNvZGVfZW50cnkgKG9wYykKLSAgICAgc3RydWN0IGlhNjRfb3Bjb2RlICpvcGM7Ci17Ci0gIHN0cnVjdCBtYWluX2VudHJ5ICoqcGxhY2U7Ci0gIHN0cnVjdCBzdHJpbmdfZW50cnkgKm5hbWU7Ci0gIGNoYXIgcHJlZml4WzEyOV07Ci0gIGludCBmb3VuZF9pdCA9IDA7Ci0KLSAgaWYgKHN0cmxlbiAob3BjLT5uYW1lKSA+IDEyOCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHBsYWNlID0gJm1haW50YWJsZTsKLSAgc3RyY3B5IChwcmVmaXgsIG9wYy0+bmFtZSk7Ci0gIHByZWZpeFtnZXRfcHJlZml4X2xlbiAocHJlZml4KV0gPSAnXDAnOwotICBuYW1lID0gaW5zZXJ0X3N0cmluZyAocHJlZml4KTsKLQotICAvKiBXYWxrIHRoZSBsaXN0IG9mIG9wY29kZSB0YWJsZSBlbnRyaWVzLiAgSWYgaXQncyBhIG5ldwotICAgICBpbnN0cnVjdGlvbiwgYWxsb2NhdGUgYW5kIGZpbGwgaW4gYSBuZXcgZW50cnkuICBOb3RlIAotICAgICB0aGUgbWFpbiB0YWJsZSBpcyBhbHBoYWJldGljYWwgYnkgb3Bjb2RlIG5hbWUuICovCi0KLSAgd2hpbGUgKCpwbGFjZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoKnBsYWNlKS0+bmFtZS0+bnVtID09IG5hbWUtPm51bQotCSAgJiYgb3Bjb2Rlc19lcSAoKCpwbGFjZSktPm9wY29kZSwgb3BjKSkKLQl7Ci0JICBmb3VuZF9pdCA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoKCpwbGFjZSktPm5hbWUtPm51bSA+IG5hbWUtPm51bSkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwbGFjZSA9ICYoKCpwbGFjZSktPm5leHQpOwotICAgIH0KLSAgaWYgKCEgZm91bmRfaXQpCi0gICAgewotICAgICAgc3RydWN0IG1haW5fZW50cnkgKm5lbnQgPSB0bWFsbG9jIChzdHJ1Y3QgbWFpbl9lbnRyeSk7Ci0KLSAgICAgIG5lbnQtPm5hbWUgPSBuYW1lOwotICAgICAgbmVudC0+b3Bjb2RlID0gb3BjOwotICAgICAgbmVudC0+bmV4dCA9ICpwbGFjZTsKLSAgICAgIG5lbnQtPmNvbXBsZXRlcnMgPSAwOwotICAgICAgKnBsYWNlID0gbmVudDsKLQotICAgICAgaWYgKG90bGVuID09IG90dG90bGVuKQotICAgICAgICB7Ci0gICAgICAgICAgb3R0b3RsZW4gKz0gMjA7Ci0gICAgICAgICAgb3JkZXJlZF90YWJsZSA9IChzdHJ1Y3QgbWFpbl9lbnRyeSAqKikKLSAgICAgICAgICAgIHhyZWFsbG9jIChvcmRlcmVkX3RhYmxlLCBzaXplb2YgKHN0cnVjdCBtYWluX2VudHJ5ICopICogb3R0b3RsZW4pOwotICAgICAgICB9Ci0gICAgICBvcmRlcmVkX3RhYmxlW290bGVuKytdID0gbmVudDsKLSAgICB9Ci0KLSAgaW5zZXJ0X2NvbXBsZXRlcl9lbnRyeSAob3BjLCAqcGxhY2UsIG9wY29kZV9jb3VudCsrKTsKLX0KLQwKLXZvaWQKLXByaW50X21haW5fdGFibGUgKCkKLXsKLSAgc3RydWN0IG1haW5fZW50cnkgKnB0ciA9IG1haW50YWJsZTsKLSAgaW50IGluZGV4ID0gMDsKLQotICBwcmludGYgKCJzdGF0aWMgY29uc3Qgc3RydWN0IGlhNjRfbWFpbl90YWJsZVxubWFpbl90YWJsZVtdID0ge1xuIik7Ci0gIHdoaWxlIChwdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgIHsgJWQsICVkLCAlZCwgMHglbGx4dWxsLCAweCVsbHh1bGwsIHsgJWQsICVkLCAlZCwgJWQsICVkIH0sIDB4JXgsICVkLCB9LFxuIiwKLQkgICAgICBwdHItPm5hbWUtPm51bSwKLQkgICAgICBwdHItPm9wY29kZS0+dHlwZSwKLQkgICAgICBwdHItPm9wY29kZS0+bnVtX291dHB1dHMsCi0JICAgICAgcHRyLT5vcGNvZGUtPm9wY29kZSwKLQkgICAgICBwdHItPm9wY29kZS0+bWFzaywKLQkgICAgICBwdHItPm9wY29kZS0+b3BlcmFuZHNbMF0sCi0JICAgICAgcHRyLT5vcGNvZGUtPm9wZXJhbmRzWzFdLAotCSAgICAgIHB0ci0+b3Bjb2RlLT5vcGVyYW5kc1syXSwKLQkgICAgICBwdHItPm9wY29kZS0+b3BlcmFuZHNbM10sCi0JICAgICAgcHRyLT5vcGNvZGUtPm9wZXJhbmRzWzRdLAotCSAgICAgIHB0ci0+b3Bjb2RlLT5mbGFncywKLQkgICAgICBwdHItPmNvbXBsZXRlcnMtPm51bSk7Ci0KLSAgICAgIHB0ci0+bWFpbl9pbmRleCA9IGluZGV4Kys7Ci0KLSAgICAgIHB0ciA9IHB0ci0+bmV4dDsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG5cbiIpOwotfQotDAotdm9pZAotc2hyaW5rICh0YWJsZSkKLSAgICAgc3RydWN0IGlhNjRfb3Bjb2RlICp0YWJsZTsKLXsKLSAgaW50IGN1cnJfb3Bjb2RlOwotCi0gIGZvciAoY3Vycl9vcGNvZGUgPSAwOyB0YWJsZVtjdXJyX29wY29kZV0ubmFtZSAhPSBOVUxMOyBjdXJyX29wY29kZSsrKQotICAgIHsKLSAgICAgIGFkZF9vcGNvZGVfZW50cnkgKHRhYmxlICsgY3Vycl9vcGNvZGUpOwotICAgIH0KLX0KLQwKLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpZiAoYXJnYyA+IDEpCi0gICAgewotICAgICAgZGVidWcgPSAxOwotICAgIH0KLQotICBsb2FkX2luc25fY2xhc3NlcygpOwotICBsb2FkX2RlcGVuZGVuY2llcygpOwotCi0gIHNocmluayAoaWE2NF9vcGNvZGVzX2EpOwotICBzaHJpbmsgKGlhNjRfb3Bjb2Rlc19iKTsKLSAgc2hyaW5rIChpYTY0X29wY29kZXNfZik7Ci0gIHNocmluayAoaWE2NF9vcGNvZGVzX2kpOwotICBzaHJpbmsgKGlhNjRfb3Bjb2Rlc19tKTsKLSAgc2hyaW5rIChpYTY0X29wY29kZXNfeCk7Ci0gIHNocmluayAoaWE2NF9vcGNvZGVzX2QpOwotCi0gIGNvbGxhcHNlX3JlZHVuZGFudF9jb21wbGV0ZXJzICgpOwotCi0gIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBpYTY0LWdlbi4gIERvIG5vdCBlZGl0ISAqL1xuIik7Ci0gIHByaW50X3N0cmluZ190YWJsZSAoKTsKLSAgcHJpbnRfZGVwZW5kZW5jeV90YWJsZSAoKTsKLSAgcHJpbnRfY29tcGxldGVyX3RhYmxlICgpOwotICBwcmludF9tYWluX3RhYmxlICgpOwotCi0gIGdlbmVyYXRlX2Rpc2Fzc2VtYmxlciAoKTsKLQotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1pYy50YmwgYi9vcGNvZGVzL2lhNjQtaWMudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjExOTRhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1pYy50YmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotQ2xhc3M7CUV2ZW50cy9JbnN0cnVjdGlvbnMKLWFsbDsJSUM6cHJlZGljYXRhYmxlLWluc3RydWN0aW9ucywgSUM6dW5wcmVkaWNhdGFibGUtaW5zdHJ1Y3Rpb25zCi1icmFuY2hlczsJSUM6aW5kaXJlY3QtYnJzLCBJQzppcC1yZWwtYnJzCi1jZm0tcmVhZGVyczsJSUM6ZnItcmVhZGVycywgSUM6ZnItd3JpdGVycywgSUM6Z3ItcmVhZGVycywgSUM6Z3Itd3JpdGVycywgSUM6bW9kLXNjaGVkLWJycywgSUM6cHJlZGljYXRhYmxlLWluc3RydWN0aW9ucywgSUM6cHItd3JpdGVycywgYWxsb2MsIGJyLmNhbGwsIGJybC5jYWxsLCBici5yZXQsIGNvdmVyLCBsb2FkcnMsIHJmaSwgSUM6Y2hrLWEsIGludmFsYS5lCi1jaGstYTsJY2hrLmEuY2xyLCBjaGsuYS5uYwotY21weGNoZzsJY21weGNoZzEsIGNtcHhjaGcyLCBjbXB4Y2hnNCwgY21weGNoZzgKLWN6eDsJY3p4MSwgY3p4MgotZmNtcC1zMDsJZmNtcFtGaWVsZChzZik9PXMwXQotZmNtcC1zMTsJZmNtcFtGaWVsZChzZik9PXMxXQotZmNtcC1zMjsJZmNtcFtGaWVsZChzZik9PXMyXQotZmNtcC1zMzsJZmNtcFtGaWVsZChzZik9PXMzXQotZmV0Y2hhZGQ7CWZldGNoYWRkNCwgZmV0Y2hhZGQ4Ci1mcC1hcml0aDsJZmFkZCwgZmFtYXgsIGZhbWluLCBmY3Z0LmZ4LCBmY3Z0LmZ4dSwgZmN2dC54dWYsIGZtYSwgZm1heCwgZm1pbiwgZm1weSwgZm1zLCBmbm1hLCBmbm1weSwgZm5vcm0sIGZwYW1heCwgZnBhbWluLCBmcGN2dC5meCwgZnBjdnQuZnh1LCBmcG1hLCBmcG1heCwgZnBtaW4sIGZwbXB5LCBmcG1zLCBmcG5tYSwgZnBubXB5LCBmcHJjcGEsIGZwcnNxcnRhLCBmcmNwYSwgZnJzcXJ0YSwgZnN1YgotZnAtYXJpdGgtczA7CUlDOmZwLWFyaXRoW0ZpZWxkKHNmKT09czBdCi1mcC1hcml0aC1zMTsJSUM6ZnAtYXJpdGhbRmllbGQoc2YpPT1zMV0KLWZwLWFyaXRoLXMyOwlJQzpmcC1hcml0aFtGaWVsZChzZik9PXMyXQotZnAtYXJpdGgtczM7CUlDOmZwLWFyaXRoW0ZpZWxkKHNmKT09czNdCi1mcC1ub24tYXJpdGg7CWZhYnMsIGZhbmQsIGZhbmRjbSwgZmNsYXNzLCBmY3Z0LnhmLCBmbWVyZ2UsIGZtaXgsIGZuZWcsIGZuZWdhYnMsIGZvciwgZnBhYnMsIGZwbWVyZ2UsIGZwYWNrLCBmcG5lZywgZnBuZWdhYnMsIGZzZWxlY3QsIGZzd2FwLCBmc3h0LCBmeG9yLCB4bWEKLWZwY21wLXMwOwlmcGNtcFtGaWVsZChzZik9PXMwXQotZnBjbXAtczE7CWZwY21wW0ZpZWxkKHNmKT09czFdCi1mcGNtcC1zMjsJZnBjbXBbRmllbGQoc2YpPT1zMl0KLWZwY21wLXMzOwlmcGNtcFtGaWVsZChzZik9PXMzXQotZnItcmVhZGVyczsJSUM6ZnAtYXJpdGgsIElDOmZwLW5vbi1hcml0aCwgSUM6cHItd3JpdGVycy1mcCwgY2hrLnNbRm9ybWF0IGluIHtNMjF9XSwgZ2V0ZgotZnItd3JpdGVyczsJSUM6ZnAtYXJpdGgsIElDOmZwLW5vbi1hcml0aFxmY2xhc3MsIElDOm1lbS1yZWFkZXJzLWZwCi1nci1yZWFkZXJzOwlJQzpnci1yZWFkZXJzLXdyaXRlcnMsIElDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVycywgY2hrLnMsIGNtcCwgY21wNCwgZmMsIGl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kLCBJQzptb3YtdG8tQVItZ3IsIElDOm1vdi10by1CUiwgSUM6bW92LXRvLUNSLCBJQzptb3YtdG8tSU5ELCBJQzptb3YtZnJvbS1JTkQsIElDOm1vdi10by1QUi1hbGxyZWcsIElDOm1vdi10by1QU1ItbCwgSUM6bW92LXRvLVBTUi11bSwgSUM6cHJvYmUtYWxsLCBwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZCwgc2V0ZiwgdGJpdCwgdG5hdAotZ3ItcmVhZGVycy13cml0ZXJzOwlJQzptb3YtZnJvbS1JTkQsIGFkZCwgYWRkbCwgYWRkcDQsIGFkZHMsIGFuZCwgYW5kY20sIElDOmN6eCwgZGVwXGRlcFtGb3JtYXQgaW4ge0kxM31dLCBleHRyLCBJQzptZW0tcmVhZGVycy1pbnQsIElDOmxkLWFsbC1wb3N0aW5jLCBJQzpsZmV0Y2gtcG9zdGluYywgSUM6bWl4LCBJQzptdXgsIG9yLCBJQzpwYWNrLCBJQzpwYWRkLCBJQzpwYXZnLCBJQzpwYXZnc3ViLCBJQzpwY21wLCBJQzpwbWF4LCBJQzpwbWluLCBJQzpwbXB5LCBJQzpwbXB5c2hyLCBwb3BjbnQsIElDOnByb2JlLW5vZmF1bHQsIElDOnBzYWQsIElDOnBzaGwsIElDOnBzaGxhZGQsIElDOnBzaHIsIElDOnBzaHJhZGQsIElDOnBzdWIsIHNobCwgc2hsYWRkLCBzaGxhZGRwNCwgc2hyLCBzaHJwLCBJQzpzdC1wb3N0aW5jLCBzdWIsIElDOnN4dCwgdGFrLCB0aGFzaCwgdHBhLCB0dGFnLCBJQzp1bnBhY2ssIHhvciwgSUM6enh0Ci1nci13cml0ZXJzOwlhbGxvYywgZGVwLCBnZXRmLCBJQzpnci1yZWFkZXJzLXdyaXRlcnMsIElDOm1lbS1yZWFkZXJzLWludCwgSUM6bW92LWZyb20tQVIsIElDOm1vdi1mcm9tLUJSLCBJQzptb3YtZnJvbS1DUiwgSUM6bW92LWZyb20tUFIsIElDOm1vdi1pbW1lZGlhdGUsIElDOm1vdi1mcm9tLVBTUiwgSUM6bW92LWZyb20tUFNSLXVtLCBJQzptb3YtaXAsIG1vdmwKLWluZGlyZWN0LWJycDsJYnJwW0Zvcm1hdCBpbiB7Qjd9XQotaW5kaXJlY3QtYnJzOwlici5jYWxsW0Zvcm1hdCBpbiB7QjV9XSwgYnIuY29uZFtGb3JtYXQgaW4ge0I0fV0sIGJyLmlhLCBici5yZXQKLWludmFsYS1hbGw7CWludmFsYVtGb3JtYXQgaW4ge00yNH1dLCBpbnZhbGEuZQotaXAtcmVsLWJyczsJSUM6bW9kLXNjaGVkLWJycywgYnIuY2FsbFtGb3JtYXQgaW4ge0IzfV0sIGJybC5jYWxsLCBicmwuY29uZCwgYnIuY29uZFtGb3JtYXQgaW4ge0IxfV0sIGJyLmNsb29wCi1sZDsJbGQxLCBsZDIsIGxkNCwgbGQ4LCBsZDguZmlsbAotbGQtYTsJbGQxLmEsIGxkMi5hLCBsZDQuYSwgbGQ4LmEKLWxkLWFsbC1wb3N0aW5jOwlJQzpsZFtGb3JtYXQgaW4ge00yIE0zfV0sIElDOmxkZnBbRm9ybWF0IGluIHtNMTJ9XSwgSUM6bGRmW0Zvcm1hdCBpbiB7TTcgTTh9XQotbGQtYzsJSUM6bGQtYy1uYywgSUM6bGQtYy1jbHIKLWxkLWMtY2xyOwlsZDEuYy5jbHIsIGxkMi5jLmNsciwgbGQ0LmMuY2xyLCBsZDguYy5jbHIsIElDOmxkLWMtY2xyLWFjcQotbGQtYy1jbHItYWNxOwlsZDEuYy5jbHIuYWNxLCBsZDIuYy5jbHIuYWNxLCBsZDQuYy5jbHIuYWNxLCBsZDguYy5jbHIuYWNxCi1sZC1jLW5jOwlsZDEuYy5uYywgbGQyLmMubmMsIGxkNC5jLm5jLCBsZDguYy5uYwotbGQtczsJbGQxLnMsIGxkMi5zLCBsZDQucywgbGQ4LnMKLWxkLXNhOwlsZDEuc2EsIGxkMi5zYSwgbGQ0LnNhLCBsZDguc2EKLWxkZjsJbGRmcywgbGRmZCwgbGRmZSwgbGRmOCwgbGRmLmZpbGwKLWxkZi1hOwlsZGZzLmEsIGxkZmQuYSwgbGRmZS5hLCBsZGY4LmEKLWxkZi1jOwlJQzpsZGYtYy1uYywgSUM6bGRmLWMtY2xyCi1sZGYtYy1jbHI7CWxkZnMuYy5jbHIsIGxkZmQuYy5jbHIsIGxkZmUuYy5jbHIsIGxkZjguYy5jbHIKLWxkZi1jLW5jOwlsZGZzLmMubmMsIGxkZmQuYy5uYywgbGRmZS5jLm5jLCBsZGY4LmMubmMKLWxkZi1zOwlsZGZzLnMsIGxkZmQucywgbGRmZS5zLCBsZGY4LnMKLWxkZi1zYTsJbGRmcy5zYSwgbGRmZC5zYSwgbGRmZS5zYSwgbGRmOC5zYQotbGRmcDsJbGRmcHMsIGxkZnBkLCBsZGZwOAotbGRmcC1hOwlsZGZwcy5hLCBsZGZwZC5hLCBsZGZwOC5hCi1sZGZwLWM7CUlDOmxkZnAtYy1uYywgSUM6bGRmcC1jLWNscgotbGRmcC1jLWNscjsJbGRmcHMuYy5jbHIsIGxkZnBkLmMuY2xyLCBsZGZwOC5jLmNscgotbGRmcC1jLW5jOwlsZGZwcy5jLm5jLCBsZGZwZC5jLm5jLCBsZGZwOC5jLm5jCi1sZGZwLXM7CWxkZnBzLnMsIGxkZnBkLnMsIGxkZnA4LnMKLWxkZnAtc2E7CWxkZnBzLnNhLCBsZGZwZC5zYSwgbGRmcDguc2EKLWxmZXRjaC1hbGw7CWxmZXRjaAotbGZldGNoLWZhdWx0OwlsZmV0Y2hbRmllbGQobGZ0eXBlKT09ZmF1bHRdCi1sZmV0Y2gtbm9mYXVsdDsJbGZldGNoW0ZpZWxkKGxmdHlwZSk9PV0KLWxmZXRjaC1wb3N0aW5jOwlsZmV0Y2hbRm9ybWF0IGluIHtNMTQgTTE1fV0KLW1lbS1yZWFkZXJzOwlJQzptZW0tcmVhZGVycy1mcCwgSUM6bWVtLXJlYWRlcnMtaW50Ci1tZW0tcmVhZGVycy1hbGF0OwlJQzpsZC1hLCBJQzpsZGYtYSwgSUM6bGRmcC1hLCBJQzpsZC1zYSwgSUM6bGRmLXNhLCBJQzpsZGZwLXNhLCBJQzpsZC1jLCBJQzpsZGYtYywgSUM6bGRmcC1jCi1tZW0tcmVhZGVycy1mcDsJSUM6bGRmLCBJQzpsZGZwCi1tZW0tcmVhZGVycy1pbnQ7CUlDOmNtcHhjaGcsIElDOmZldGNoYWRkLCBJQzp4Y2hnLCBJQzpsZAotbWVtLXJlYWRlcnMtc3BlYzsJSUM6bGQtcywgSUM6bGQtc2EsIElDOmxkZi1zLCBJQzpsZGYtc2EsIElDOmxkZnAtcywgSUM6bGRmcC1zYQotbWVtLXdyaXRlcnM7CUlDOm1lbS13cml0ZXJzLWZwLCBJQzptZW0td3JpdGVycy1pbnQKLW1lbS13cml0ZXJzLWZwOwlJQzpzdGYKLW1lbS13cml0ZXJzLWludDsJSUM6Y21weGNoZywgSUM6ZmV0Y2hhZGQsIElDOnhjaGcsIElDOnN0Ci1taXg7CW1peDEsIG1peDIsIG1peDQKLW1vZC1zY2hlZC1icnM7CWJyLmNleGl0LCBici5jdG9wLCBici53ZXhpdCwgYnIud3RvcAotbW9kLXNjaGVkLWJycy1jb3VudGVkOwlici5jZXhpdCwgYnIuY2xvb3AsIGJyLmN0b3AKLW1vdi1mcm9tLUFSOwlJQzptb3YtZnJvbS1BUi1NLCBJQzptb3YtZnJvbS1BUi1JLCBJQzptb3YtZnJvbS1BUi1JTQotbW92LWZyb20tQVItQlNQOwlJQzptb3YtZnJvbS1BUi1NW0ZpZWxkKGFyMykgPT0gQlNQXQotbW92LWZyb20tQVItQlNQU1RPUkU7CUlDOm1vdi1mcm9tLUFSLU1bRmllbGQoYXIzKSA9PSBCU1BTVE9SRV0KLW1vdi1mcm9tLUFSLUNDVjsJSUM6bW92LWZyb20tQVItTVtGaWVsZChhcjMpID09IENDVl0KLW1vdi1mcm9tLUFSLUVDOwlJQzptb3YtZnJvbS1BUi1JW0ZpZWxkKGFyMykgPT0gRUNdCi1tb3YtZnJvbS1BUi1GUFNSOwlJQzptb3YtZnJvbS1BUi1NW0ZpZWxkKGFyMykgPT0gRlBTUl0KLW1vdi1mcm9tLUFSLUk7CW1vdl9hcltGb3JtYXQgaW4ge0kyOH1dCi1tb3YtZnJvbS1BUi1pZzsJSUM6bW92LWZyb20tQVItSU1bRmllbGQoYXIzKSBpbiB7NDgtNjMgMTEyLTEyN31dCi1tb3YtZnJvbS1BUi1JTTsJbW92X2FyW0Zvcm1hdCBpbiB7STI4IE0zMX1dCi1tb3YtZnJvbS1BUi1JVEM7CUlDOm1vdi1mcm9tLUFSLU1bRmllbGQoYXIzKSA9PSBJVENdCi1tb3YtZnJvbS1BUi1LOwlJQzptb3YtZnJvbS1BUi1NW0ZpZWxkKGFyMykgaW4ge0swIEsxIEsyIEszIEs0IEs1IEs2IEs3fV0KLW1vdi1mcm9tLUFSLUxDOwlJQzptb3YtZnJvbS1BUi1JW0ZpZWxkKGFyMykgPT0gTENdCi1tb3YtZnJvbS1BUi1NOwltb3ZfYXJbRm9ybWF0IGluIHtNMzF9XQotbW92LWZyb20tQVItUEZTOwlJQzptb3YtZnJvbS1BUi1JW0ZpZWxkKGFyMykgPT0gUEZTXQotbW92LWZyb20tQVItUk5BVDsJSUM6bW92LWZyb20tQVItTVtGaWVsZChhcjMpID09IFJOQVRdCi1tb3YtZnJvbS1BUi1SU0M7CUlDOm1vdi1mcm9tLUFSLU1bRmllbGQoYXIzKSA9PSBSU0NdCi1tb3YtZnJvbS1BUi1ydjsJSUM6bm9uZQotbW92LWZyb20tQVItVU5BVDsJSUM6bW92LWZyb20tQVItTVtGaWVsZChhcjMpID09IFVOQVRdCi1tb3YtZnJvbS1CUjsJbW92X2JyW0Zvcm1hdCBpbiB7STIyfV0KLW1vdi1mcm9tLUNSOwltb3ZfY3JbRm9ybWF0IGluIHtNMzN9XQotbW92LWZyb20tQ1ItQ01DVjsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBDTUNWXQotbW92LWZyb20tQ1ItRENSOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IERDUl0KLW1vdi1mcm9tLUNSLUVPSTsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBFT0ldCi1tb3YtZnJvbS1DUi1HUFRBOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IEdQVEFdCi1tb3YtZnJvbS1DUi1JRkE7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSUZBXQotbW92LWZyb20tQ1ItSUZTOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IElGU10KLW1vdi1mcm9tLUNSLUlIQTsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBJSEFdCi1tb3YtZnJvbS1DUi1JSU07CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSUlNXQotbW92LWZyb20tQ1ItSUlQOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IElJUF0KLW1vdi1mcm9tLUNSLUlJUEE7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSUlQQV0KLW1vdi1mcm9tLUNSLUlQU1I7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSVBTUl0KLW1vdi1mcm9tLUNSLUlSUjsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSBpbiB7SVJSMCBJUlIxIElSUjIgSVJSM31dCi1tb3YtZnJvbS1DUi1JU1I7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSVNSXQotbW92LWZyb20tQ1ItSVRJUjsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBJVElSXQotbW92LWZyb20tQ1ItSVRNOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IElUTV0KLW1vdi1mcm9tLUNSLUlUVjsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBJVFZdCi1tb3YtZnJvbS1DUi1JVkE7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gSVZBXQotbW92LWZyb20tQ1ItSVZSOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IElWUl0KLW1vdi1mcm9tLUNSLUxJRDsJSUM6bW92LWZyb20tQ1JbRmllbGQoY3IzKSA9PSBMSURdCi1tb3YtZnJvbS1DUi1MUlI7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgaW4ge0xSUjAgTFJSMX1dCi1tb3YtZnJvbS1DUi1QTVY7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gUE1WXQotbW92LWZyb20tQ1ItUFRBOwlJQzptb3YtZnJvbS1DUltGaWVsZChjcjMpID09IFBUQV0KLW1vdi1mcm9tLUNSLXJ2OwlJQzpub25lCi1tb3YtZnJvbS1DUi1UUFI7CUlDOm1vdi1mcm9tLUNSW0ZpZWxkKGNyMykgPT0gVFBSXQotbW92LWZyb20tSU5EOwltb3ZfaW5kaXJlY3RbRm9ybWF0IGluIHtNNDN9XQotbW92LWZyb20tSU5ELUNQVUlEOwlJQzptb3YtZnJvbS1JTkRbRmllbGQoaXJlZykgPT0gY3B1aWRdCi1tb3YtZnJvbS1JTkQtREJSOwlJQzptb3YtZnJvbS1JTkRbRmllbGQoaXJlZykgPT0gZGJyXQotbW92LWZyb20tSU5ELUlCUjsJSUM6bW92LWZyb20tSU5EW0ZpZWxkKGlyZWcpID09IGlicl0KLW1vdi1mcm9tLUlORC1NU1I7CUlDOm1vdi1mcm9tLUlORFtGaWVsZChpcmVnKSA9PSBtc3JdCi1tb3YtZnJvbS1JTkQtUEtSOwlJQzptb3YtZnJvbS1JTkRbRmllbGQoaXJlZykgPT0gcGtyXQotbW92LWZyb20tSU5ELVBNQzsJSUM6bW92LWZyb20tSU5EW0ZpZWxkKGlyZWcpID09IHBtY10KLW1vdi1mcm9tLUlORC1QTUQ7CUlDOm1vdi1mcm9tLUlORFtGaWVsZChpcmVnKSA9PSBwbWRdCi1tb3YtZnJvbS1JTkQtcHJpdjsJSUM6bW92LWZyb20tSU5EW0ZpZWxkKGlyZWcpIGluIHtkYnIgaWJyIG1zciBwa3IgcG1jIHJyfV0KLW1vdi1mcm9tLUlORC1SUjsJSUM6bW92LWZyb20tSU5EW0ZpZWxkKGlyZWcpID09IHJyXQotbW92LWZyb20tUFI7CW1vdl9wcltGb3JtYXQgaW4ge0kyNX1dCi1tb3YtZnJvbS1QU1I7CW1vdl9wc3JbRm9ybWF0IGluIHtNMzZ9XQotbW92LWZyb20tUFNSLXVtOwltb3ZfdW1bRm9ybWF0IGluIHtNMzZ9XQotbW92LWltbWVkaWF0ZTsJYWRkbFtGb3JtYXQgaW4ge0E1fV0KLW1vdi1pcDsJbW92X2lwW0Zvcm1hdCBpbiB7STI1fV0KLW1vdi10by1BUjsJSUM6bW92LXRvLUFSLU0sIElDOm1vdi10by1BUi1JCi1tb3YtdG8tQVItQlNQOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpID09IEJTUF0KLW1vdi10by1BUi1CU1BTVE9SRTsJSUM6bW92LXRvLUFSLU1bRmllbGQoYXIzKSA9PSBCU1BTVE9SRV0KLW1vdi10by1BUi1DQ1Y7CUlDOm1vdi10by1BUi1NW0ZpZWxkKGFyMykgPT0gQ0NWXQotbW92LXRvLUFSLUVDOwlJQzptb3YtdG8tQVItSVtGaWVsZChhcjMpID09IEVDXQotbW92LXRvLUFSLUZQU1I7CUlDOm1vdi10by1BUi1NW0ZpZWxkKGFyMykgPT0gRlBTUl0KLW1vdi10by1BUi1ncjsJSUM6bW92LXRvLUFSLU1bRm9ybWF0IGluIHtNMjl9XSwgSUM6bW92LXRvLUFSLUlbRm9ybWF0IGluIHtJMjZ9XQotbW92LXRvLUFSLUk7CW1vdl9hcltGb3JtYXQgaW4ge0kyNiBJMjd9XQotbW92LXRvLUFSLWlnOwlJQzptb3YtdG8tQVItSU1bRmllbGQoYXIzKSBpbiB7NDgtNjMgMTEyLTEyN31dCi1tb3YtdG8tQVItSU07CW1vdl9hcltGb3JtYXQgaW4ge0kyNiBJMjcgTTI5IE0zMH1dCi1tb3YtdG8tQVItSVRDOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpID09IElUQ10KLW1vdi10by1BUi1LOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpIGluIHtLMCBLMSBLMiBLMyBLNCBLNSBLNiBLN31dCi1tb3YtdG8tQVItTEM7CUlDOm1vdi10by1BUi1JW0ZpZWxkKGFyMykgPT0gTENdCi1tb3YtdG8tQVItTTsJbW92X2FyW0Zvcm1hdCBpbiB7TTI5IE0zMH1dCi1tb3YtdG8tQVItUEZTOwlJQzptb3YtdG8tQVItSVtGaWVsZChhcjMpID09IFBGU10KLW1vdi10by1BUi1STkFUOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpID09IFJOQVRdCi1tb3YtdG8tQVItUlNDOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpID09IFJTQ10KLW1vdi10by1BUi1VTkFUOwlJQzptb3YtdG8tQVItTVtGaWVsZChhcjMpID09IFVOQVRdCi1tb3YtdG8tQlI7CW1vdl9icltGb3JtYXQgaW4ge0kyMX1dCi1tb3YtdG8tQ1I7CW1vdl9jcltGb3JtYXQgaW4ge00zMn1dCi1tb3YtdG8tQ1ItQ01DVjsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gQ01DVl0KLW1vdi10by1DUi1EQ1I7CUlDOm1vdi10by1DUltGaWVsZChjcjMpID09IERDUl0KLW1vdi10by1DUi1FT0k7CUlDOm1vdi10by1DUltGaWVsZChjcjMpID09IEVPSV0KLW1vdi10by1DUi1HUFRBOwlJQzptb3YtdG8tQ1JbRmllbGQoY3IzKSA9PSBHUFRBXQotbW92LXRvLUNSLUlGQTsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSUZBXQotbW92LXRvLUNSLUlGUzsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSUZTXQotbW92LXRvLUNSLUlIQTsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSUhBXQotbW92LXRvLUNSLUlJTTsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSUlNXQotbW92LXRvLUNSLUlJUDsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSUlQXQotbW92LXRvLUNSLUlJUEE7CUlDOm1vdi10by1DUltGaWVsZChjcjMpID09IElJUEFdCi1tb3YtdG8tQ1ItSVBTUjsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSVBTUl0KLW1vdi10by1DUi1JUlI7CUlDOm1vdi10by1DUltGaWVsZChjcjMpIGluIHtJUlIwIElSUjEgSVJSMiBJUlIzfV0KLW1vdi10by1DUi1JU1I7CUlDOm1vdi10by1DUltGaWVsZChjcjMpID09IElTUl0KLW1vdi10by1DUi1JVElSOwlJQzptb3YtdG8tQ1JbRmllbGQoY3IzKSA9PSBJVElSXQotbW92LXRvLUNSLUlUTTsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSVRNXQotbW92LXRvLUNSLUlUVjsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSVRWXQotbW92LXRvLUNSLUlWQTsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSVZBXQotbW92LXRvLUNSLUlWUjsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gSVZSXQotbW92LXRvLUNSLUxJRDsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgPT0gTElEXQotbW92LXRvLUNSLUxSUjsJSUM6bW92LXRvLUNSW0ZpZWxkKGNyMykgaW4ge0xSUjAgTFJSMX1dCi1tb3YtdG8tQ1ItUE1WOwlJQzptb3YtdG8tQ1JbRmllbGQoY3IzKSA9PSBQTVZdCi1tb3YtdG8tQ1ItUFRBOwlJQzptb3YtdG8tQ1JbRmllbGQoY3IzKSA9PSBQVEFdCi1tb3YtdG8tQ1ItVFBSOwlJQzptb3YtdG8tQ1JbRmllbGQoY3IzKSA9PSBUUFJdCi1tb3YtdG8tSU5EOwltb3ZfaW5kaXJlY3RbRm9ybWF0IGluIHtNNDJ9XQotbW92LXRvLUlORC1DUFVJRDsJSUM6bW92LXRvLUlORFtGaWVsZChpcmVnKSA9PSBjcHVpZF0KLW1vdi10by1JTkQtREJSOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IGRicl0KLW1vdi10by1JTkQtSUJSOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IGlicl0KLW1vdi10by1JTkQtTVNSOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IG1zcl0KLW1vdi10by1JTkQtUEtSOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IHBrcl0KLW1vdi10by1JTkQtUE1DOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IHBtY10KLW1vdi10by1JTkQtUE1EOwlJQzptb3YtdG8tSU5EW0ZpZWxkKGlyZWcpID09IHBtZF0KLW1vdi10by1JTkQtcHJpdjsJSUM6bW92LXRvLUlORAotbW92LXRvLUlORC1SUjsJSUM6bW92LXRvLUlORFtGaWVsZChpcmVnKSA9PSBycl0KLW1vdi10by1QUjsJSUM6bW92LXRvLVBSLWFsbHJlZywgSUM6bW92LXRvLVBSLXJvdHJlZwotbW92LXRvLVBSLWFsbHJlZzsJbW92X3ByW0Zvcm1hdCBpbiB7STIzfV0KLW1vdi10by1QUi1yb3RyZWc7CW1vdl9wcltGb3JtYXQgaW4ge0kyNH1dCi1tb3YtdG8tUFNSLWw7CW1vdl9wc3JbRm9ybWF0IGluIHtNMzV9XQotbW92LXRvLVBTUi11bTsJbW92X3VtW0Zvcm1hdCBpbiB7TTM1fV0KLW11eDsJbXV4MSwgbXV4Mgotbm9uZTsJLQotcGFjazsJcGFjazIsIHBhY2s0Ci1wYWRkOwlwYWRkMSwgcGFkZDIsIHBhZGQ0Ci1wYXZnOwlwYXZnMSwgcGF2ZzIKLXBhdmdzdWI7CXBhdmdzdWIxLCBwYXZnc3ViMgotcGNtcDsJcGNtcDEsIHBjbXAyLCBwY21wNAotcG1heDsJcG1heDEsIHBtYXgyCi1wbWluOwlwbWluMSwgcG1pbjIKLXBtcHk7CXBtcHkyCi1wbXB5c2hyOwlwbXB5c2hyMgotcHItYW5kLXdyaXRlcnM7CUlDOnByLWdlbi13cml0ZXJzLWludFtGaWVsZChjdHlwZSkgaW4ge2FuZCBhbmRjbX1dLCBJQzpwci1nZW4td3JpdGVycy1pbnRbRmllbGQoY3R5cGUpIGluIHtvci5hbmRjbSBhbmQub3JjbX1dCi1wci1nZW4td3JpdGVycy1mcDsJZmNsYXNzLCBmY21wCi1wci1nZW4td3JpdGVycy1pbnQ7CWNtcCwgY21wNCwgdGJpdCwgdG5hdAotcHItbm9ybS13cml0ZXJzLWZwOwlJQzpwci1nZW4td3JpdGVycy1mcFtGaWVsZChjdHlwZSk9PV0KLXByLW5vcm0td3JpdGVycy1pbnQ7CUlDOnByLWdlbi13cml0ZXJzLWludFtGaWVsZChjdHlwZSk9PV0KLXByLW9yLXdyaXRlcnM7CUlDOnByLWdlbi13cml0ZXJzLWludFtGaWVsZChjdHlwZSkgaW4ge29yIG9yY219XSwgSUM6cHItZ2VuLXdyaXRlcnMtaW50W0ZpZWxkKGN0eXBlKSBpbiB7b3IuYW5kY20gYW5kLm9yY219XQotcHItcmVhZGVycy1icjsJYnIuY2FsbCwgYnIuY29uZCwgYnJsLmNhbGwsIGJybC5jb25kLCBici5yZXQsIGJyLndleGl0LCBici53dG9wLCBicmVhay5iLCBicmVhaywgbm9wLmIsIG5vcCwgSUM6UmVzZXJ2ZWRCUVAKLXByLXJlYWRlcnMtbm9ici1ub21vdnByOwlhZGQsIGFkZHA0LCBhbmQsIGFuZGNtLCBicmVhay5mLCBicmVhay5pLCBicmVhay5tLCBicmVhay54LCBicmVhaywgY2hrLnMsIElDOmNoay1hLCBjbXAsIGNtcDQsIElDOmNtcHhjaGcsIElDOmN6eCwgZGVwLCBleHRyLCBJQzpmcC1hcml0aCwgSUM6ZnAtbm9uLWFyaXRoLCBmYywgZmNoa2YsIGZjbHJmLCBmY21wLCBJQzpmZXRjaGFkZCwgZnBjbXAsIGZzZXRjLCBmd2IsIGdldGYsIElDOmludmFsYS1hbGwsIGl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kLCBJQzpsZCwgSUM6bGRmLCBJQzpsZGZwLCBJQzpsZmV0Y2gtYWxsLCBtZiwgSUM6bWl4LCBJQzptb3YtZnJvbS1BUi1NLCBJQzptb3YtZnJvbS1BUi1JTSwgSUM6bW92LWZyb20tQVItSSwgSUM6bW92LXRvLUFSLU0sIElDOm1vdi10by1BUi1JLCBJQzptb3YtdG8tQVItSU0sIElDOm1vdi10by1CUiwgSUM6bW92LWZyb20tQlIsIElDOm1vdi10by1DUiwgSUM6bW92LWZyb20tQ1IsIElDOm1vdi10by1JTkQsIElDOm1vdi1mcm9tLUlORCwgSUM6bW92LWlwLCBJQzptb3YtaW1tZWRpYXRlLCBJQzptb3YtdG8tUFNSLWwsIElDOm1vdi10by1QU1ItdW0sIElDOm1vdi1mcm9tLVBTUiwgSUM6bW92LWZyb20tUFNSLXVtLCBtb3ZsLCBJQzptdXgsIG5vcC5mLCBub3AuaSwgbm9wLm0sIG5vcC54LCBub3AsIG9yLCBJQzpwYWNrLCBJQzpwYWRkLCBJQzpwYXZnLCBJQzpwYXZnc3ViLCBJQzpwY21wLCBJQzpwbWF4LCBJQzpwbWluLCBJQzpwbXB5LCBJQzpwbXB5c2hyLCBwb3BjbnQsIElDOnByb2JlLWFsbCwgSUM6cHNhZCwgSUM6cHNobCwgSUM6cHNobGFkZCwgSUM6cHNociwgSUM6cHNocmFkZCwgSUM6cHN1YiwgcHRjLmUsIHB0Yy5nLCBwdGMuZ2EsIHB0Yy5sLCBwdHIuZCwgcHRyLmksIElDOlJlc2VydmVkUVAsIHJzbSwgc2V0Ziwgc2hsLCBzaGxhZGQsIHNobGFkZHA0LCBzaHIsIHNocnAsIHNybHouaSwgc3Jsei5kLCBzc20sIElDOnN0LCBJQzpzdGYsIHN1Yiwgc3VtLCBJQzpzeHQsIHN5bmMsIHRhaywKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtb3BjLWEuYyBiL29wY29kZXMvaWE2NC1vcGMtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY4MDI5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1vcGMtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qIGlhNjQtb3BjLWEuYyAtLSBJQS02NCBgQScgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImlhNjQtb3BjLmgiCi0KLSNkZWZpbmUgQQlJQTY0X1RZUEVfQSwgMQotI2RlZmluZSBBMglJQTY0X1RZUEVfQSwgMgotCi0vKiBpbnN0cnVjdGlvbiBiaXQgZmllbGRzOiAqLwotI2RlZmluZSBiQyh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMTIpCi0jZGVmaW5lIGJJbW0xNCh4KQkoKCgoaWE2NF9pbnNuKSAoKCh4KSA+PiAgMCkgJiAweDdmKSkgPDwgMTMpIHwgXAotCQkJICgoKGlhNjRfaW5zbikgKCgoeCkgPj4gIDcpICYgMHgzZikpIDw8IDI3KSB8IFwKLQkJCSAoKChpYTY0X2luc24pICgoKHgpID4+IDEzKSAmIDB4MDEpKSA8PCAzNikpCi0jZGVmaW5lIGJSM2EoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4N2YpKSA8PCAyMCkKLSNkZWZpbmUgYlIzYih4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMjApCi0jZGVmaW5lIGJUYSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzMpCi0jZGVmaW5lIGJUYih4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzYpCi0jZGVmaW5lIGJWZSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzMpCi0jZGVmaW5lIGJYKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzMykKLSNkZWZpbmUgYlgyKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDMpKSA8PCAzNCkKLSNkZWZpbmUgYlgyYSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMzQpCi0jZGVmaW5lIGJYMmIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MykpIDw8IDI3KQotI2RlZmluZSBiWDQoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4ZikpIDw8IDI5KQotI2RlZmluZSBiWmEoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDM2KQotI2RlZmluZSBiWmIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDMzKQotCi0vKiBpbnN0cnVjdGlvbiBiaXQgbWFza3M6ICovCi0jZGVmaW5lIG1DCWJDICgtMSkKLSNkZWZpbmUgbUltbTE0CWJJbW0xNCAoLTEpCi0jZGVmaW5lIG1SM2EJYlIzYSAoLTEpCi0jZGVmaW5lIG1SM2IJYlIzYiAoLTEpCi0jZGVmaW5lIG1UYQliVGEgKC0xKQotI2RlZmluZSBtVGIJYlRiICgtMSkKLSNkZWZpbmUgbVZlCWJWZSAoLTEpCi0jZGVmaW5lIG1YCWJYICgtMSkKLSNkZWZpbmUgbVgyCWJYMiAoLTEpCi0jZGVmaW5lIG1YMmEJYlgyYSAoLTEpCi0jZGVmaW5lIG1YMmIJYlgyYiAoLTEpCi0jZGVmaW5lIG1YNAliWDQgKC0xKQotI2RlZmluZSBtWmEJYlphICgtMSkKLSNkZWZpbmUgbVpiCWJaYiAoLTEpCi0KLSNkZWZpbmUgT3BSM2IoYSxiKQkJKGJPcCAoYSkgfCBiUjNiIChiKSksIChtT3AgfCBtUjNiKQotI2RlZmluZSBPcFgyYVZlKGEsYixjKQkJKGJPcCAoYSkgfCBiWDJhIChiKSB8IGJWZSAoYykpLCBcCi0JCQkJKG1PcCB8IG1YMmEgfCBtVmUpCi0jZGVmaW5lIE9wWDJhVmVSM2EoYSxiLGMsZCkJKGJPcCAoYSkgfCBiWDJhIChiKSB8IGJWZSAoYykgfCBiUjNhIChkKSksIFwKLQkJCQkobU9wIHwgbVgyYSB8IG1WZSB8IG1SM2EpCi0jZGVmaW5lIE9wWDJhVmVJbW0xNChhLGIsYyxkKQkoYk9wIChhKSB8IGJYMmEgKGIpIHwgYlZlIChjKSB8IGJJbW0xNCAoZCkpLCBcCi0JCQkJKG1PcCB8IG1YMmEgfCBtVmUgfCBtSW1tMTQpCi0jZGVmaW5lIE9wWDJhVmVYNChhLGIsYyxkKQkoYk9wIChhKSB8IGJYMmEgKGIpIHwgYlZlIChjKSB8IGJYNCAoZCkpLCBcCi0JCQkJKG1PcCB8IG1YMmEgfCBtVmUgfCBtWDQpCi0jZGVmaW5lIE9wWDJhVmVYNFgyYihhLGIsYyxkLGUpCVwKLQkoYk9wIChhKSB8IGJYMmEgKGIpIHwgYlZlIChjKSB8IGJYNCAoZCkgfCBiWDJiIChlKSksIFwKLQkobU9wIHwgbVgyYSB8IG1WZSB8IG1YNCB8IG1YMmIpCi0jZGVmaW5lIE9wWDJUYlRhQyhhLGIsYyxkLGUpIFwKLQkoYk9wIChhKSB8IGJYMiAoYikgfCBiVGIgKGMpIHwgYlRhIChkKSB8IGJDIChlKSksIFwKLQkobU9wIHwgbVgyIHwgbVRiIHwgbVRhIHwgbUMpCi0jZGVmaW5lIE9wWDJUYUMoYSxiLGMsZCkJKGJPcCAoYSkgfCBiWDIgKGIpIHwgYlRhIChjKSB8IGJDIChkKSksIFwKLQkJCQkobU9wIHwgbVgyIHwgbVRhIHwgbUMpCi0jZGVmaW5lIE9wWDJhWmFaYlg0KGEsYixjLGQsZSkgXAotCShiT3AgKGEpIHwgYlgyYSAoYikgfCBiWmEgKGMpIHwgYlpiIChkKSB8IGJYNCAoZSkpLCBcCi0JKG1PcCB8IG1YMmEgfCBtWmEgfCBtWmIgfCBtWDQpCi0jZGVmaW5lIE9wWDJhWmFaYlg0WDJiKGEsYixjLGQsZSxmKSBcCi0JKGJPcCAoYSkgfCBiWDJhIChiKSB8IGJaYSAoYykgfCBiWmIgKGQpIHwgYlg0IChlKSB8IGJYMmIgKGYpKSwgXAotCShtT3AgfCBtWDJhIHwgbVphIHwgbVpiIHwgbVg0IHwgbVgyYikKLQotc3RydWN0IGlhNjRfb3Bjb2RlIGlhNjRfb3Bjb2Rlc19hW10gPQotICB7Ci0gICAgLyogQS10eXBlIGluc3RydWN0aW9uIGVuY29kaW5ncyAoc29ydGVkIGFjY29yZGluZyB0byBtYWpvciBvcGNvZGUpICovCi0KLSAgICB7ImFkZCIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDAsIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsiYWRkIiwJIEEsIE9wWDJhVmVYNFgyYiAoOCwgMCwgMCwgMCwgMSksIHtSMSwgUjIsIFIzLCBDMX19LAotICAgIHsic3ViIiwJIEEsIE9wWDJhVmVYNFgyYiAoOCwgMCwgMCwgMSwgMSksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJzdWIiLAkgQSwgT3BYMmFWZVg0WDJiICg4LCAwLCAwLCAxLCAwKSwge1IxLCBSMiwgUjMsIEMxfX0sCi0gICAgeyJhZGRwNCIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDIsIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsiYW5kIiwJIEEsIE9wWDJhVmVYNFgyYiAoOCwgMCwgMCwgMywgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJhbmRjbSIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDMsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsib3IiLAkgQSwgT3BYMmFWZVg0WDJiICg4LCAwLCAwLCAzLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InhvciIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDMsIDMpLCB7UjEsIFIyLCBSM319LAotICAgIHsic2hsYWRkIiwJIEEsIE9wWDJhVmVYNCAoOCwgMCwgMCwgNCksIHtSMSwgUjIsIENOVDJhLCBSM319LAotICAgIHsic2hsYWRkcDQiLCBBLCBPcFgyYVZlWDQgKDgsIDAsIDAsIDYpLCB7UjEsIFIyLCBDTlQyYSwgUjN9fSwKLSAgICB7InN1YiIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDksIDEpLCB7UjEsIElNTTgsIFIzfX0sCi0gICAgeyJhbmQiLAkgQSwgT3BYMmFWZVg0WDJiICg4LCAwLCAwLCAweGIsIDApLCB7UjEsIElNTTgsIFIzfX0sCi0gICAgeyJhbmRjbSIsCSBBLCBPcFgyYVZlWDRYMmIgKDgsIDAsIDAsIDB4YiwgMSksIHtSMSwgSU1NOCwgUjN9fSwKLSAgICB7Im9yIiwJIEEsIE9wWDJhVmVYNFgyYiAoOCwgMCwgMCwgMHhiLCAyKSwge1IxLCBJTU04LCBSM319LAotICAgIHsieG9yIiwJIEEsIE9wWDJhVmVYNFgyYiAoOCwgMCwgMCwgMHhiLCAzKSwge1IxLCBJTU04LCBSM319LAotICAgIHsibW92IiwJIEEsIE9wWDJhVmVJbW0xNCAoOCwgMiwgMCwgMCksIHtSMSwgUjN9fSwKLSAgICB7Im1vdiIsCSBBLCBPcFgyYVZlUjNhICg4LCAyLCAwLCAwKSwge1IxLCBJTU0xNH0sIFBTRVVET30sCi0gICAgeyJhZGRzIiwJIEEsIE9wWDJhVmUgKDgsIDIsIDApLCB7UjEsIElNTTE0LCBSM319LAotICAgIHsiYWRkcDQiLAkgQSwgT3BYMmFWZSAoOCwgMywgMCksIHtSMSwgSU1NMTQsIFIzfX0sCi0gICAgeyJwYWRkMSIsCQkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDAsIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicGFkZDIiLAkJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAxLCAwLCAwKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBhZGQ0IiwJCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMSwgMCwgMCwgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwYWRkMS5zc3MiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDAsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGFkZDIuc3NzIiwJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAxLCAwLCAxKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBhZGQxLnV1dSIsCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMCwgMCwgMCwgMiksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwYWRkMi51dXUiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDAsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGFkZDEudXVzIiwJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAwLCAwLCAzKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBhZGQyLnV1cyIsCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMCwgMSwgMCwgMyksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwc3ViMSIsCQkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDEsIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicHN1YjIiLAkJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAxLCAxLCAwKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBzdWI0IiwJCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMSwgMCwgMSwgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwc3ViMS5zc3MiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDEsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicHN1YjIuc3NzIiwJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAxLCAxLCAxKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBzdWIxLnV1dSIsCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMCwgMCwgMSwgMiksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwc3ViMi51dXUiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDEsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsicHN1YjEudXVzIiwJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAwLCAxLCAzKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBzdWIyLnV1cyIsCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMCwgMSwgMSwgMyksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwYXZnMSIsCQkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDIsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGF2ZzIiLAkJIEEsIE9wWDJhWmFaYlg0WDJiICg4LCAxLCAwLCAxLCAyLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBhdmcxLnJheiIsCSBBLCBPcFgyYVphWmJYNFgyYiAoOCwgMSwgMCwgMCwgMiwgMyksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwYXZnMi5yYXoiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDIsIDMpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGF2Z3N1YjEiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDMsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGF2Z3N1YjIiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDMsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDEuZXEiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDksIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDIuZXEiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDksIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDQuZXEiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDEsIDAsIDksIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDEuZ3QiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDAsIDksIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDIuZ3QiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDAsIDEsIDksIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicGNtcDQuZ3QiLAkgQSwgT3BYMmFaYVpiWDRYMmIgKDgsIDEsIDEsIDAsIDksIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicHNobGFkZDIiLAkgQSwgT3BYMmFaYVpiWDQgKDgsIDEsIDAsIDEsIDQpLCB7UjEsIFIyLCBDTlQyYiwgUjN9fSwKLSAgICB7InBzaHJhZGQyIiwJIEEsIE9wWDJhWmFaYlg0ICg4LCAxLCAwLCAxLCA2KSwge1IxLCBSMiwgQ05UMmIsIFIzfX0sCi0KLSAgICB7Im1vdiIsCQkgQSwgT3BSM2IgKDksIDApLCB7UjEsIElNTTIyfSwgUFNFVURPfSwKLSAgICB7ImFkZGwiLAkJIEEsIE9wICAgICg5KSwJICB7UjEsIElNTTIyLCBSM18yfX0sCi0KLSAgICB7ImNtcC5sdCIsCQkgQTIsIE9wWDJUYlRhQyAoMHhjLCAwLCAwLCAwLCAwKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXAubGUiLAkJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMCwgMCwgMCksIHtQMiwgUDEsIFIzLCBSMn19LAotICAgIHsiY21wLmd0IiwJCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDAsIDApLCB7UDEsIFAyLCBSMywgUjJ9fSwKLSAgICB7ImNtcC5nZSIsCQkgQTIsIE9wWDJUYlRhQyAoMHhjLCAwLCAwLCAwLCAwKSwge1AyLCBQMSwgUjIsIFIzfX0sCi0gICAgeyJjbXAubHQudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMCwgMCwgMSksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wLmxlLnVuYyIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDAsIDEpLCB7UDIsIFAxLCBSMywgUjJ9fSwKLSAgICB7ImNtcC5ndC51bmMiLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAwLCAwLCAwLCAxKSwge1AxLCBQMiwgUjMsIFIyfX0sCi0gICAgeyJjbXAuZ2UudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMCwgMCwgMSksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wLmVxLmFuZCIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcC5uZS5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLm5lLmFuZCIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDEsIDEpLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcC5lcS5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDAsIDEsIDEpLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5sdCIsCQkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAwLCAwLCAwKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXA0LmxlIiwJCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDAsIDAsIDApLCB7UDIsIFAxLCBSMywgUjJ9fSwKLSAgICB7ImNtcDQuZ3QiLAkJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMCwgMCwgMCksIHtQMSwgUDIsIFIzLCBSMn19LAotICAgIHsiY21wNC5nZSIsCQkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAwLCAwLCAwKSwge1AyLCBQMSwgUjIsIFIzfX0sCi0gICAgeyJjbXA0Lmx0LnVuYyIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDAsIDAsIDEpLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcDQubGUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMCwgMCwgMSksIHtQMiwgUDEsIFIzLCBSMn19LAotICAgIHsiY21wNC5ndC51bmMiLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAwLCAwLCAxKSwge1AxLCBQMiwgUjMsIFIyfX0sCi0gICAgeyJjbXA0LmdlLnVuYyIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDAsIDAsIDEpLCB7UDIsIFAxLCBSMiwgUjN9fSwKLSAgICB7ImNtcDQuZXEuYW5kIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMCwgMSwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wNC5uZS5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5uZS5hbmQiLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAwLCAxLCAxKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXA0LmVxLmFuZGNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMCwgMSwgMSksIHtQMSwgUDIsIFIyLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAuZ3QuYW5kIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMSwgMCwgMCksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5sZS5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDEsIDAsIDApLCB7UDEsIFAyLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcC5sZS5hbmQiLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAwLCAxLCAwLCAxKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wLmd0LmFuZGNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmdlLmFuZCIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDEsIDEsIDApLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXAubHQuYW5kY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAwLCAxLCAxLCAwKSwge1AxLCBQMiwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubHQuYW5kIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMCwgMSwgMSwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5nZS5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDAsIDEsIDEsIDEpLCB7UDEsIFAyLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQuZ3QuYW5kIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMSwgMCwgMCksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcDQubGUuYW5kY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAxLCAwLCAwKSwge1AxLCBQMiwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXA0LmxlLmFuZCIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDEsIDAsIDEpLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXA0Lmd0LmFuZGNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5nZS5hbmQiLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAxLCAxLCAwKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wNC5sdC5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGMsIDEsIDEsIDEsIDApLCB7UDEsIFAyLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQubHQuYW5kIiwJIEEyLCBPcFgyVGJUYUMgKDB4YywgMSwgMSwgMSwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcDQuZ2UuYW5kY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhjLCAxLCAxLCAxLCAxKSwge1AxLCBQMiwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubHQiLAkJIEEyLCBPcFgyVGFDICAgKDB4YywgMiwgMCwgMCksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAubGUiLAkJIEEyLCBPcFgyVGFDICAgKDB4YywgMiwgMCwgMCksIHtQMSwgUDIsIElNTThNMSwgUjN9fSwKLSAgICB7ImNtcC5ndCIsCQkgQTIsIE9wWDJUYUMgICAoMHhjLCAyLCAwLCAwKSwge1AyLCBQMSwgSU1NOE0xLCBSM319LAotICAgIHsiY21wLmdlIiwJCSBBMiwgT3BYMlRhQyAgICgweGMsIDIsIDAsIDApLCB7UDIsIFAxLCBJTU04LCBSM319LAotICAgIHsiY21wLmx0LnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGMsIDIsIDAsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLmxlLnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGMsIDIsIDAsIDEpLCB7UDEsIFAyLCBJTU04TTEsIFIzfX0sCi0gICAgeyJjbXAuZ3QudW5jIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMiwgMCwgMSksIHtQMiwgUDEsIElNTThNMSwgUjN9fSwKLSAgICB7ImNtcC5nZS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAyLCAwLCAxKSwge1AyLCBQMSwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcC5lcS5hbmQiLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAyLCAxLCAwKSwge1AxLCBQMiwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcC5uZS5hbmRjbSIsCSBBMiwgT3BYMlRhQyAgICgweGMsIDIsIDEsIDApLCB7UDEsIFAyLCBJTU04LCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubmUuYW5kIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMiwgMSwgMSksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAuZXEuYW5kY20iLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAyLCAxLCAxKSwge1AxLCBQMiwgSU1NOCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5sdCIsCQkgQTIsIE9wWDJUYUMgICAoMHhjLCAzLCAwLCAwKSwge1AxLCBQMiwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcDQubGUiLAkJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMCwgMCksIHtQMSwgUDIsIElNTThNMSwgUjN9fSwKLSAgICB7ImNtcDQuZ3QiLAkJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMCwgMCksIHtQMiwgUDEsIElNTThNMSwgUjN9fSwKLSAgICB7ImNtcDQuZ2UiLAkJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMCwgMCksIHtQMiwgUDEsIElNTTgsIFIzfX0sCi0gICAgeyJjbXA0Lmx0LnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGMsIDMsIDAsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wNC5sZS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAzLCAwLCAxKSwge1AxLCBQMiwgSU1NOE0xLCBSM319LAotICAgIHsiY21wNC5ndC51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAzLCAwLCAxKSwge1AyLCBQMSwgSU1NOE0xLCBSM319LAotICAgIHsiY21wNC5nZS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhjLCAzLCAwLCAxKSwge1AyLCBQMSwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcDQuZXEuYW5kIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMSwgMCksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXA0Lm5lLmFuZGNtIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMSwgMCksIHtQMSwgUDIsIElNTTgsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQubmUuYW5kIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMSwgMSksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXA0LmVxLmFuZGNtIiwJIEEyLCBPcFgyVGFDICAgKDB4YywgMywgMSwgMSksIHtQMSwgUDIsIElNTTgsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcC5sdHUiLAkJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMCwgMCwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wLmxldSIsCQkgQTIsIE9wWDJUYlRhQyAoMHhkLCAwLCAwLCAwLCAwKSwge1AyLCBQMSwgUjMsIFIyfX0sCi0gICAgeyJjbXAuZ3R1IiwJCSBBMiwgT3BYMlRiVGFDICgweGQsIDAsIDAsIDAsIDApLCB7UDEsIFAyLCBSMywgUjJ9fSwKLSAgICB7ImNtcC5nZXUiLAkJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMCwgMCwgMCksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wLmx0dS51bmMiLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAwLCAwLCAwLCAxKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXAubGV1LnVuYyIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDAsIDAsIDAsIDEpLCB7UDIsIFAxLCBSMywgUjJ9fSwKLSAgICB7ImNtcC5ndHUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMCwgMCwgMSksIHtQMSwgUDIsIFIzLCBSMn19LAotICAgIHsiY21wLmdldS51bmMiLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAwLCAwLCAwLCAxKSwge1AyLCBQMSwgUjIsIFIzfX0sCi0gICAgeyJjbXAuZXEub3IiLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAwLCAwLCAxLCAwKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXAubmUub3JjbSIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDAsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLm5lLm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMCwgMSwgMSksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wLmVxLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAwLCAwLCAxLCAxKSwge1AxLCBQMiwgUjIsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQubHR1IiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wNC5sZXUiLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAxLCAwLCAwLCAwKSwge1AyLCBQMSwgUjMsIFIyfX0sCi0gICAgeyJjbXA0Lmd0dSIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDAsIDAsIDApLCB7UDEsIFAyLCBSMywgUjJ9fSwKLSAgICB7ImNtcDQuZ2V1IiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMCksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wNC5sdHUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMSksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wNC5sZXUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMSksIHtQMiwgUDEsIFIzLCBSMn19LAotICAgIHsiY21wNC5ndHUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMSksIHtQMSwgUDIsIFIzLCBSMn19LAotICAgIHsiY21wNC5nZXUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMCwgMCwgMSksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wNC5lcS5vciIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcDQubmUub3JjbSIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDAsIDEsIDApLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5uZS5vciIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDAsIDEsIDEpLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcDQuZXEub3JjbSIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDAsIDEsIDEpLCB7UDEsIFAyLCBSMiwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmd0Lm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMCwgMCksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5sZS5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMCwgMCksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmxlLm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5ndC5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmdlLm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMSwgMCksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5sdC5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMSwgMCksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmx0Lm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMSwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5nZS5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMCwgMSwgMSwgMSksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5ndC5vciIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDEsIDAsIDApLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXA0LmxlLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAxLCAxLCAwLCAwKSwge1AxLCBQMiwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXA0LmxlLm9yIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcDQuZ3Qub3JjbSIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDEsIDAsIDEpLCB7UDEsIFAyLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQuZ2Uub3IiLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAxLCAxLCAxLCAwKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wNC5sdC5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZCwgMSwgMSwgMSwgMCksIHtQMSwgUDIsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5sdC5vciIsCSBBMiwgT3BYMlRiVGFDICgweGQsIDEsIDEsIDEsIDEpLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXA0LmdlLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhkLCAxLCAxLCAxLCAxKSwge1AxLCBQMiwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubHR1IiwJCSBBMiwgT3BYMlRhQyAgICgweGQsIDIsIDAsIDApLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLmxldSIsCQkgQTIsIE9wWDJUYUMgICAoMHhkLCAyLCAwLCAwKSwge1AxLCBQMiwgSU1NOE0xVTgsIFIzfX0sCi0gICAgeyJjbXAuZ3R1IiwJCSBBMiwgT3BYMlRhQyAgICgweGQsIDIsIDAsIDApLCB7UDIsIFAxLCBJTU04TTFVOCwgUjN9fSwKLSAgICB7ImNtcC5nZXUiLAkJIEEyLCBPcFgyVGFDICAgKDB4ZCwgMiwgMCwgMCksIHtQMiwgUDEsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAubHR1LnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDIsIDAsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLmxldS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAyLCAwLCAxKSwge1AxLCBQMiwgSU1NOE0xVTgsIFIzfX0sCi0gICAgeyJjbXAuZ3R1LnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDIsIDAsIDEpLCB7UDIsIFAxLCBJTU04TTFVOCwgUjN9fSwKLSAgICB7ImNtcC5nZXUudW5jIiwJIEEyLCBPcFgyVGFDICAgKDB4ZCwgMiwgMCwgMSksIHtQMiwgUDEsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAuZXEub3IiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAyLCAxLCAwKSwge1AxLCBQMiwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcC5uZS5vcmNtIiwJIEEyLCBPcFgyVGFDICAgKDB4ZCwgMiwgMSwgMCksIHtQMSwgUDIsIElNTTgsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcC5uZS5vciIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDIsIDEsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLmVxLm9yY20iLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAyLCAxLCAxKSwge1AxLCBQMiwgSU1NOCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5sdHUiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAwLCAwKSwge1AxLCBQMiwgSU1NOFU0LCBSM319LAotICAgIHsiY21wNC5sZXUiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAwLCAwKSwge1AxLCBQMiwgSU1NOE0xVTQsIFIzfX0sCi0gICAgeyJjbXA0Lmd0dSIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDMsIDAsIDApLCB7UDIsIFAxLCBJTU04TTFVNCwgUjN9fSwKLSAgICB7ImNtcDQuZ2V1IiwJIEEyLCBPcFgyVGFDICAgKDB4ZCwgMywgMCwgMCksIHtQMiwgUDEsIElNTThVNCwgUjN9fSwKLSAgICB7ImNtcDQubHR1LnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDMsIDAsIDEpLCB7UDEsIFAyLCBJTU04VTQsIFIzfX0sCi0gICAgeyJjbXA0LmxldS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAwLCAxKSwge1AxLCBQMiwgSU1NOE0xVTQsIFIzfX0sCi0gICAgeyJjbXA0Lmd0dS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAwLCAxKSwge1AyLCBQMSwgSU1NOE0xVTQsIFIzfX0sCi0gICAgeyJjbXA0LmdldS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAwLCAxKSwge1AyLCBQMSwgSU1NOFU0LCBSM319LAotICAgIHsiY21wNC5lcS5vciIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDMsIDEsIDApLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wNC5uZS5vcmNtIiwJIEEyLCBPcFgyVGFDICAgKDB4ZCwgMywgMSwgMCksIHtQMSwgUDIsIElNTTgsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQubmUub3IiLAkgQTIsIE9wWDJUYUMgICAoMHhkLCAzLCAxLCAxKSwge1AxLCBQMiwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcDQuZXEub3JjbSIsCSBBMiwgT3BYMlRhQyAgICgweGQsIDMsIDEsIDEpLCB7UDEsIFAyLCBJTU04LCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAuZXEiLAkJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMCwgMCwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wLm5lIiwJCSBBMiwgT3BYMlRiVGFDICgweGUsIDAsIDAsIDAsIDApLCB7UDIsIFAxLCBSMiwgUjN9fSwKLSAgICB7ImNtcC5lcS51bmMiLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAwLCAwLCAxKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXAubmUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMCwgMCwgMSksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wLmVxLm9yLmFuZGNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMCwgMSwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wLm5lLmFuZC5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMCwgMSwgMCksIHtQMiwgUDEsIFIyLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubmUub3IuYW5kY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAwLCAxLCAxKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXAuZXEuYW5kLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAwLCAxLCAxKSwge1AyLCBQMSwgUjIsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQuZXEiLAkJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMCwgMCwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wNC5uZSIsCQkgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAwLCAwLCAwKSwge1AyLCBQMSwgUjIsIFIzfX0sCi0gICAgeyJjbXA0LmVxLnVuYyIsCSBBMiwgT3BYMlRiVGFDICgweGUsIDEsIDAsIDAsIDEpLCB7UDEsIFAyLCBSMiwgUjN9fSwKLSAgICB7ImNtcDQubmUudW5jIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMCwgMCwgMSksIHtQMiwgUDEsIFIyLCBSM319LAotICAgIHsiY21wNC5lcS5vci5hbmRjbSIsIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMCwgMSwgMCksIHtQMSwgUDIsIFIyLCBSM319LAotICAgIHsiY21wNC5uZS5hbmQub3JjbSIsIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMCwgMSwgMCksIHtQMiwgUDEsIFIyLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXA0Lm5lLm9yLmFuZGNtIiwgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAwLCAxLCAxKSwge1AxLCBQMiwgUjIsIFIzfX0sCi0gICAgeyJjbXA0LmVxLmFuZC5vcmNtIiwgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAwLCAxLCAxKSwge1AyLCBQMSwgUjIsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcC5ndC5vci5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGUsIDAsIDEsIDAsIDApLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXAubGUuYW5kLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAxLCAwLCAwKSwge1AyLCBQMSwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXAubGUub3IuYW5kY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAxLCAwLCAxKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wLmd0LmFuZC5vcmNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMSwgMCwgMSksIHtQMiwgUDEsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmdlLm9yLmFuZGNtIiwJIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMCwgMSwgMSwgMCksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcC5sdC5hbmQub3JjbSIsCSBBMiwgT3BYMlRiVGFDICgweGUsIDAsIDEsIDEsIDApLCB7UDIsIFAxLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcC5sdC5vci5hbmRjbSIsCSBBMiwgT3BYMlRiVGFDICgweGUsIDAsIDEsIDEsIDEpLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXAuZ2UuYW5kLm9yY20iLAkgQTIsIE9wWDJUYlRhQyAoMHhlLCAwLCAxLCAxLCAxKSwge1AyLCBQMSwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXA0Lmd0Lm9yLmFuZGNtIiwgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAxLCAwLCAwKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wNC5sZS5hbmQub3JjbSIsIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMSwgMCwgMCksIHtQMiwgUDEsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5sZS5vci5hbmRjbSIsIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMSwgMCwgMSksIHtQMSwgUDIsIEdSMCwgUjN9fSwKLSAgICB7ImNtcDQuZ3QuYW5kLm9yY20iLCBBMiwgT3BYMlRiVGFDICgweGUsIDEsIDEsIDAsIDEpLCB7UDIsIFAxLCBHUjAsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQuZ2Uub3IuYW5kY20iLCBBMiwgT3BYMlRiVGFDICgweGUsIDEsIDEsIDEsIDApLCB7UDEsIFAyLCBHUjAsIFIzfX0sCi0gICAgeyJjbXA0Lmx0LmFuZC5vcmNtIiwgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAxLCAxLCAwKSwge1AyLCBQMSwgR1IwLCBSM30sIFBTRVVET30sCi0gICAgeyJjbXA0Lmx0Lm9yLmFuZGNtIiwgQTIsIE9wWDJUYlRhQyAoMHhlLCAxLCAxLCAxLCAxKSwge1AxLCBQMiwgR1IwLCBSM319LAotICAgIHsiY21wNC5nZS5hbmQub3JjbSIsIEEyLCBPcFgyVGJUYUMgKDB4ZSwgMSwgMSwgMSwgMSksIHtQMiwgUDEsIEdSMCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLmVxIiwJCSBBMiwgT3BYMlRhQyAgICgweGUsIDIsIDAsIDApLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLm5lIiwJCSBBMiwgT3BYMlRhQyAgICgweGUsIDIsIDAsIDApLCB7UDIsIFAxLCBJTU04LCBSM319LAotICAgIHsiY21wLmVxLnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGUsIDIsIDAsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wLm5lLnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGUsIDIsIDAsIDEpLCB7UDIsIFAxLCBJTU04LCBSM319LAotICAgIHsiY21wLmVxLm9yLmFuZGNtIiwJIEEyLCBPcFgyVGFDICAgKDB4ZSwgMiwgMSwgMCksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAubmUuYW5kLm9yY20iLAkgQTIsIE9wWDJUYUMgICAoMHhlLCAyLCAxLCAwKSwge1AyLCBQMSwgSU1NOCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wLm5lLm9yLmFuZGNtIiwJIEEyLCBPcFgyVGFDICAgKDB4ZSwgMiwgMSwgMSksIHtQMSwgUDIsIElNTTgsIFIzfX0sCi0gICAgeyJjbXAuZXEuYW5kLm9yY20iLAkgQTIsIE9wWDJUYUMgICAoMHhlLCAyLCAxLCAxKSwge1AyLCBQMSwgSU1NOCwgUjN9LCBQU0VVRE99LAotICAgIHsiY21wNC5lcSIsCQkgQTIsIE9wWDJUYUMgICAoMHhlLCAzLCAwLCAwKSwge1AxLCBQMiwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcDQubmUiLAkJIEEyLCBPcFgyVGFDICAgKDB4ZSwgMywgMCwgMCksIHtQMiwgUDEsIElNTTgsIFIzfX0sCi0gICAgeyJjbXA0LmVxLnVuYyIsCSBBMiwgT3BYMlRhQyAgICgweGUsIDMsIDAsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wNC5uZS51bmMiLAkgQTIsIE9wWDJUYUMgICAoMHhlLCAzLCAwLCAxKSwge1AyLCBQMSwgSU1NOCwgUjN9fSwKLSAgICB7ImNtcDQuZXEub3IuYW5kY20iLCBBMiwgT3BYMlRhQyAgICgweGUsIDMsIDEsIDApLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wNC5uZS5hbmQub3JjbSIsIEEyLCBPcFgyVGFDICAgKDB4ZSwgMywgMSwgMCksIHtQMiwgUDEsIElNTTgsIFIzfSwgUFNFVURPfSwKLSAgICB7ImNtcDQubmUub3IuYW5kY20iLCBBMiwgT3BYMlRhQyAgICgweGUsIDMsIDEsIDEpLCB7UDEsIFAyLCBJTU04LCBSM319LAotICAgIHsiY21wNC5lcS5hbmQub3JjbSIsIEEyLCBPcFgyVGFDICAgKDB4ZSwgMywgMSwgMSksIHtQMiwgUDEsIElNTTgsIFIzfSwgUFNFVURPfSwKLQotICAgIHswfQotICB9OwotCi0jdW5kZWYgQQotI3VuZGVmIEEyCi0jdW5kZWYgYkMKLSN1bmRlZiBiSW1tMTQKLSN1bmRlZiBiUjNhCi0jdW5kZWYgYlIzYgotI3VuZGVmIGJUYQotI3VuZGVmIGJUYgotI3VuZGVmIGJWZQotI3VuZGVmIGJYCi0jdW5kZWYgYlgyCi0jdW5kZWYgYlgyYQotI3VuZGVmIGJYMmIKLSN1bmRlZiBiWDQKLSN1bmRlZiBiWmEKLSN1bmRlZiBiWmIKLSN1bmRlZiBtQwotI3VuZGVmIG1JbW0xNAotI3VuZGVmIG1SM2EKLSN1bmRlZiBtUjNiCi0jdW5kZWYgbVRhCi0jdW5kZWYgbVRiCi0jdW5kZWYgbVZlCi0jdW5kZWYgbVgKLSN1bmRlZiBtWDIKLSN1bmRlZiBtWDJhCi0jdW5kZWYgbVgyYgotI3VuZGVmIG1YNAotI3VuZGVmIG1aYQotI3VuZGVmIG1aYgotI3VuZGVmIE9wUjNhCi0jdW5kZWYgT3BSM2IKLSN1bmRlZiBPcFgyYVZlCi0jdW5kZWYgT3BYMmFWZUltbTE0Ci0jdW5kZWYgT3BYMmFWZVg0Ci0jdW5kZWYgT3BYMmFWZVg0WDJiCi0jdW5kZWYgT3BYMlRiVGFDCi0jdW5kZWYgT3BYMlRhQwotI3VuZGVmIE9wWDJhWmFaYlg0Ci0jdW5kZWYgT3BYMmFaYVpiWDRYMmIKZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1vcGMtYi5jIGIvb3Bjb2Rlcy9pYTY0LW9wYy1iLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjA3MTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pYTY0LW9wYy1iLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyogaWE2NC1vcGMtYi5jIC0tIElBLTY0IGBCJyBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiaWE2NC1vcGMuaCIKLQotI2RlZmluZSBCMAlJQTY0X1RZUEVfQiwgMAotI2RlZmluZSBCCUlBNjRfVFlQRV9CLCAxCi0KLS8qIGluc3RydWN0aW9uIGJpdCBmaWVsZHM6ICovCi0jZGVmaW5lIGJCdHlwZSh4KQkoKChpYTY0X2luc24pICgoeCkgJiAweDcpKSA8PCA2KQotI2RlZmluZSBiRCh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzUpCi0jZGVmaW5lIGJJaCh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzUpCi0jZGVmaW5lIGJQYSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMTIpCi0jZGVmaW5lIGJQcih4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzZikpIDw8IDApCi0jZGVmaW5lIGJXaGEoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MykpIDw8IDMzKQotI2RlZmluZSBiV2hiKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDMpKSA8PCAzKQotI2RlZmluZSBiWDYoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4M2YpKSA8PCAyNykKLQotI2RlZmluZSBtQnR5cGUJCWJCdHlwZSAoLTEpCi0jZGVmaW5lIG1ECQliRCAoLTEpCi0jZGVmaW5lIG1JaAkJYkloICgtMSkKLSNkZWZpbmUgbVBhCQliUGEgKC0xKQotI2RlZmluZSBtUHIJCWJQciAoLTEpCi0jZGVmaW5lIG1XaGEJCWJXaGEgKC0xKQotI2RlZmluZSBtV2hiCQliV2hiICgtMSkKLSNkZWZpbmUgbVg2CQliWDYgKC0xKQotCi0jZGVmaW5lIE9wWDYoYSxiKSAJKGJPcCAoYSkgfCBiWDYgKGIpKSwgKG1PcCB8IG1YNikKLSNkZWZpbmUgT3BQYVdoYUQoYSxiLGMsZCkgXAotCShiT3AgKGEpIHwgYlBhIChiKSB8IGJXaGEgKGMpIHwgYkQgKGQpKSwgKG1PcCB8IG1QYSB8IG1XaGEgfCBtRCkKLSNkZWZpbmUgT3BCdHlwZVBhV2hhRChhLGIsYyxkLGUpIFwKLQkoYk9wIChhKSB8IGJCdHlwZSAoYikgfCBiUGEgKGMpIHwgYldoYSAoZCkgfCBiRCAoZSkpLCBcCi0JKG1PcCB8IG1CdHlwZSB8IG1QYSB8IG1XaGEgfCBtRCkKLSNkZWZpbmUgT3BCdHlwZVBhV2hhRFByKGEsYixjLGQsZSxmKSBcCi0JKGJPcCAoYSkgfCBiQnR5cGUgKGIpIHwgYlBhIChjKSB8IGJXaGEgKGQpIHwgYkQgKGUpIHwgYlByIChmKSksIFwKLQkobU9wIHwgbUJ0eXBlIHwgbVBhIHwgbVdoYSB8IG1EIHwgbVByKQotI2RlZmluZSBPcFg2QnR5cGVQYVdoYUQoYSxiLGMsZCxlLGYpIFwKLQkoYk9wIChhKSB8IGJYNiAoYikgfCBiQnR5cGUgKGMpIHwgYlBhIChkKSB8IGJXaGEgKGUpIHwgYkQgKGYpKSwgXAotCShtT3AgfCBtWDYgfCBtQnR5cGUgfCBtUGEgfCBtV2hhIHwgbUQpCi0jZGVmaW5lIE9wWDZCdHlwZVBhV2hhRFByKGEsYixjLGQsZSxmLGcpIFwKLSAgIChiT3AgKGEpIHwgYlg2IChiKSB8IGJCdHlwZSAoYykgfCBiUGEgKGQpIHwgYldoYSAoZSkgfCBiRCAoZikgfCBiUHIgKGcpKSwgXAotCShtT3AgfCBtWDYgfCBtQnR5cGUgfCBtUGEgfCBtV2hhIHwgbUQgfCBtUHIpCi0jZGVmaW5lIE9wSWhXaGIoYSxiLGMpIFwKLQkoYk9wIChhKSB8IGJJaCAoYikgfCBiV2hiIChjKSksIFwKLQkobU9wIHwgbUloIHwgbVdoYikKLSNkZWZpbmUgT3BYNkloV2hiKGEsYixjLGQpIFwKLQkoYk9wIChhKSB8IGJYNiAoYikgfCBiSWggKGMpIHwgYldoYiAoZCkpLCBcCi0JKG1PcCB8IG1YNiB8IG1JaCB8IG1XaGIpCi0KLXN0cnVjdCBpYTY0X29wY29kZSBpYTY0X29wY29kZXNfYltdID0KLSAgewotICAgIC8qIEItdHlwZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgKHNvcnRlZCBhY2NvcmRpbmcgdG8gbWFqb3Igb3Bjb2RlKSAqLwotCi0jZGVmaW5lIEJSKGEsYikgXAotICAgICAgQjAsIE9wWDZCdHlwZVBhV2hhRFByICgwLCAweDIwLCAwLCBhLCAwLCBiLCAwKSwge0IyfSwgUFNFVURPCi0gICAgeyJici5mZXciLAkJQlIgKDAsIDApfSwKLSAgICB7ImJyIiwJCUJSICgwLCAwKX0sCi0gICAgeyJici5mZXcuY2xyIiwJQlIgKDAsIDEpfSwKLSAgICB7ImJyLmNsciIsCQlCUiAoMCwgMSl9LAotICAgIHsiYnIubWFueSIsCQlCUiAoMSwgMCl9LAotICAgIHsiYnIubWFueS5jbHIiLAlCUiAoMSwgMSl9LAotI3VuZGVmIEJSCi0KLSNkZWZpbmUgQlIoYSxiLGMsZCxlKQlCMCwgT3BYNkJ0eXBlUGFXaGFEICgwLCBhLCBiLCBjLCBkLCBlKSwge0IyfQotICAgIHsiYnIuY29uZC5zcHRrLmZldyIsCUJSICgweDIwLCAwLCAwLCAwLCAwKX0sCi0gICAgeyJici5jb25kLnNwdGsiLAkJQlIgKDB4MjAsIDAsIDAsIDAsIDApLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5zcHRrLmZldy5jbHIiLAlCUiAoMHgyMCwgMCwgMCwgMCwgMSl9LAotICAgIHsiYnIuY29uZC5zcHRrLmNsciIsCUJSICgweDIwLCAwLCAwLCAwLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3BudC5mZXciLAlCUiAoMHgyMCwgMCwgMCwgMSwgMCl9LAotICAgIHsiYnIuY29uZC5zcG50IiwJCUJSICgweDIwLCAwLCAwLCAxLCAwKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3BudC5mZXcuY2xyIiwJQlIgKDB4MjAsIDAsIDAsIDEsIDEpfSwKLSAgICB7ImJyLmNvbmQuc3BudC5jbHIiLAlCUiAoMHgyMCwgMCwgMCwgMSwgMSksIFBTRVVET30sCi0gICAgeyJici5jb25kLmRwdGsuZmV3IiwJQlIgKDB4MjAsIDAsIDAsIDIsIDApfSwKLSAgICB7ImJyLmNvbmQuZHB0ayIsCQlCUiAoMHgyMCwgMCwgMCwgMiwgMCksIFBTRVVET30sCi0gICAgeyJici5jb25kLmRwdGsuZmV3LmNsciIsCUJSICgweDIwLCAwLCAwLCAyLCAxKX0sCi0gICAgeyJici5jb25kLmRwdGsuY2xyIiwJQlIgKDB4MjAsIDAsIDAsIDIsIDEpLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5kcG50LmZldyIsCUJSICgweDIwLCAwLCAwLCAzLCAwKX0sCi0gICAgeyJici5jb25kLmRwbnQiLAkJQlIgKDB4MjAsIDAsIDAsIDMsIDApLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5kcG50LmZldy5jbHIiLAlCUiAoMHgyMCwgMCwgMCwgMywgMSl9LAotICAgIHsiYnIuY29uZC5kcG50LmNsciIsCUJSICgweDIwLCAwLCAwLCAzLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3B0ay5tYW55IiwJQlIgKDB4MjAsIDAsIDEsIDAsIDApfSwKLSAgICB7ImJyLmNvbmQuc3B0ay5tYW55LmNsciIsCUJSICgweDIwLCAwLCAxLCAwLCAxKX0sCi0gICAgeyJici5jb25kLnNwbnQubWFueSIsCUJSICgweDIwLCAwLCAxLCAxLCAwKX0sCi0gICAgeyJici5jb25kLnNwbnQubWFueS5jbHIiLAlCUiAoMHgyMCwgMCwgMSwgMSwgMSl9LAotICAgIHsiYnIuY29uZC5kcHRrLm1hbnkiLAlCUiAoMHgyMCwgMCwgMSwgMiwgMCl9LAotICAgIHsiYnIuY29uZC5kcHRrLm1hbnkuY2xyIiwJQlIgKDB4MjAsIDAsIDEsIDIsIDEpfSwKLSAgICB7ImJyLmNvbmQuZHBudC5tYW55IiwJQlIgKDB4MjAsIDAsIDEsIDMsIDApfSwKLSAgICB7ImJyLmNvbmQuZHBudC5tYW55LmNsciIsCUJSICgweDIwLCAwLCAxLCAzLCAxKX0sCi0gICAgeyJici5zcHRrLmZldyIsCQlCUiAoMHgyMCwgMCwgMCwgMCwgMCl9LAotICAgIHsiYnIuc3B0ayIsCQkJQlIgKDB4MjAsIDAsIDAsIDAsIDApLCBQU0VVRE99LAotICAgIHsiYnIuc3B0ay5mZXcuY2xyIiwJCUJSICgweDIwLCAwLCAwLCAwLCAxKX0sCi0gICAgeyJici5zcHRrLmNsciIsCQlCUiAoMHgyMCwgMCwgMCwgMCwgMSksIFBTRVVET30sCi0gICAgeyJici5zcG50LmZldyIsCQlCUiAoMHgyMCwgMCwgMCwgMSwgMCl9LAotICAgIHsiYnIuc3BudCIsCQkJQlIgKDB4MjAsIDAsIDAsIDEsIDApLCBQU0VVRE99LAotICAgIHsiYnIuc3BudC5mZXcuY2xyIiwJCUJSICgweDIwLCAwLCAwLCAxLCAxKX0sCi0gICAgeyJici5zcG50LmNsciIsCQlCUiAoMHgyMCwgMCwgMCwgMSwgMSksIFBTRVVET30sCi0gICAgeyJici5kcHRrLmZldyIsCQlCUiAoMHgyMCwgMCwgMCwgMiwgMCl9LAotICAgIHsiYnIuZHB0ayIsCQkJQlIgKDB4MjAsIDAsIDAsIDIsIDApLCBQU0VVRE99LAotICAgIHsiYnIuZHB0ay5mZXcuY2xyIiwJCUJSICgweDIwLCAwLCAwLCAyLCAxKX0sCi0gICAgeyJici5kcHRrLmNsciIsCQlCUiAoMHgyMCwgMCwgMCwgMiwgMSksIFBTRVVET30sCi0gICAgeyJici5kcG50LmZldyIsCQlCUiAoMHgyMCwgMCwgMCwgMywgMCl9LAotICAgIHsiYnIuZHBudCIsCQkJQlIgKDB4MjAsIDAsIDAsIDMsIDApLCBQU0VVRE99LAotICAgIHsiYnIuZHBudC5mZXcuY2xyIiwJCUJSICgweDIwLCAwLCAwLCAzLCAxKX0sCi0gICAgeyJici5kcG50LmNsciIsCQlCUiAoMHgyMCwgMCwgMCwgMywgMSksIFBTRVVET30sCi0gICAgeyJici5zcHRrLm1hbnkiLAkJQlIgKDB4MjAsIDAsIDEsIDAsIDApfSwKLSAgICB7ImJyLnNwdGsubWFueS5jbHIiLAlCUiAoMHgyMCwgMCwgMSwgMCwgMSl9LAotICAgIHsiYnIuc3BudC5tYW55IiwJCUJSICgweDIwLCAwLCAxLCAxLCAwKX0sCi0gICAgeyJici5zcG50Lm1hbnkuY2xyIiwJQlIgKDB4MjAsIDAsIDEsIDEsIDEpfSwKLSAgICB7ImJyLmRwdGsubWFueSIsCQlCUiAoMHgyMCwgMCwgMSwgMiwgMCl9LAotICAgIHsiYnIuZHB0ay5tYW55LmNsciIsCUJSICgweDIwLCAwLCAxLCAyLCAxKX0sCi0gICAgeyJici5kcG50Lm1hbnkiLAkJQlIgKDB4MjAsIDAsIDEsIDMsIDApfSwKLSAgICB7ImJyLmRwbnQubWFueS5jbHIiLAlCUiAoMHgyMCwgMCwgMSwgMywgMSl9LAotICAgIHsiYnIuaWEuc3B0ay5mZXciLAkJQlIgKDB4MjAsIDEsIDAsIDAsIDApfSwKLSAgICB7ImJyLmlhLnNwdGsiLAkJQlIgKDB4MjAsIDEsIDAsIDAsIDApLCBQU0VVRE99LAotICAgIHsiYnIuaWEuc3B0ay5mZXcuY2xyIiwJQlIgKDB4MjAsIDEsIDAsIDAsIDEpfSwKLSAgICB7ImJyLmlhLnNwdGsuY2xyIiwJCUJSICgweDIwLCAxLCAwLCAwLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmlhLnNwbnQuZmV3IiwJCUJSICgweDIwLCAxLCAwLCAxLCAwKX0sCi0gICAgeyJici5pYS5zcG50IiwJCUJSICgweDIwLCAxLCAwLCAxLCAwKSwgUFNFVURPfSwKLSAgICB7ImJyLmlhLnNwbnQuZmV3LmNsciIsCUJSICgweDIwLCAxLCAwLCAxLCAxKX0sCi0gICAgeyJici5pYS5zcG50LmNsciIsCQlCUiAoMHgyMCwgMSwgMCwgMSwgMSksIFBTRVVET30sCi0gICAgeyJici5pYS5kcHRrLmZldyIsCQlCUiAoMHgyMCwgMSwgMCwgMiwgMCl9LAotICAgIHsiYnIuaWEuZHB0ayIsCQlCUiAoMHgyMCwgMSwgMCwgMiwgMCksIFBTRVVET30sCi0gICAgeyJici5pYS5kcHRrLmZldy5jbHIiLAlCUiAoMHgyMCwgMSwgMCwgMiwgMSl9LAotICAgIHsiYnIuaWEuZHB0ay5jbHIiLAkJQlIgKDB4MjAsIDEsIDAsIDIsIDEpLCBQU0VVRE99LAotICAgIHsiYnIuaWEuZHBudC5mZXciLAkJQlIgKDB4MjAsIDEsIDAsIDMsIDApfSwKLSAgICB7ImJyLmlhLmRwbnQiLAkJQlIgKDB4MjAsIDEsIDAsIDMsIDApLCBQU0VVRE99LAotICAgIHsiYnIuaWEuZHBudC5mZXcuY2xyIiwJQlIgKDB4MjAsIDEsIDAsIDMsIDEpfSwKLSAgICB7ImJyLmlhLmRwbnQuY2xyIiwJCUJSICgweDIwLCAxLCAwLCAzLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmlhLnNwdGsubWFueSIsCQlCUiAoMHgyMCwgMSwgMSwgMCwgMCl9LAotICAgIHsiYnIuaWEuc3B0ay5tYW55LmNsciIsCUJSICgweDIwLCAxLCAxLCAwLCAxKX0sCi0gICAgeyJici5pYS5zcG50Lm1hbnkiLAkJQlIgKDB4MjAsIDEsIDEsIDEsIDApfSwKLSAgICB7ImJyLmlhLnNwbnQubWFueS5jbHIiLAlCUiAoMHgyMCwgMSwgMSwgMSwgMSl9LAotICAgIHsiYnIuaWEuZHB0ay5tYW55IiwJCUJSICgweDIwLCAxLCAxLCAyLCAwKX0sCi0gICAgeyJici5pYS5kcHRrLm1hbnkuY2xyIiwJQlIgKDB4MjAsIDEsIDEsIDIsIDEpfSwKLSAgICB7ImJyLmlhLmRwbnQubWFueSIsCQlCUiAoMHgyMCwgMSwgMSwgMywgMCl9LAotICAgIHsiYnIuaWEuZHBudC5tYW55LmNsciIsCUJSICgweDIwLCAxLCAxLCAzLCAxKX0sCi0gICAgeyJici5yZXQuc3B0ay5mZXciLAkJQlIgKDB4MjEsIDQsIDAsIDAsIDApLCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuc3B0ayIsCQlCUiAoMHgyMSwgNCwgMCwgMCwgMCksIFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcHRrLmZldy5jbHIiLAlCUiAoMHgyMSwgNCwgMCwgMCwgMSksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcHRrLmNsciIsCQlCUiAoMHgyMSwgNCwgMCwgMCwgMSksIFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcG50LmZldyIsCQlCUiAoMHgyMSwgNCwgMCwgMSwgMCksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcG50IiwJCUJSICgweDIxLCA0LCAwLCAxLCAwKSwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LnNwbnQuZmV3LmNsciIsCUJSICgweDIxLCA0LCAwLCAxLCAxKSwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LnNwbnQuY2xyIiwJCUJSICgweDIxLCA0LCAwLCAxLCAxKSwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LmRwdGsuZmV3IiwJCUJSICgweDIxLCA0LCAwLCAyLCAwKSwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LmRwdGsiLAkJQlIgKDB4MjEsIDQsIDAsIDIsIDApLCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuZHB0ay5mZXcuY2xyIiwJQlIgKDB4MjEsIDQsIDAsIDIsIDEpLCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuZHB0ay5jbHIiLAkJQlIgKDB4MjEsIDQsIDAsIDIsIDEpLCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuZHBudC5mZXciLAkJQlIgKDB4MjEsIDQsIDAsIDMsIDApLCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuZHBudCIsCQlCUiAoMHgyMSwgNCwgMCwgMywgMCksIFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5kcG50LmZldy5jbHIiLAlCUiAoMHgyMSwgNCwgMCwgMywgMSksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5kcG50LmNsciIsCQlCUiAoMHgyMSwgNCwgMCwgMywgMSksIFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcHRrLm1hbnkiLAlCUiAoMHgyMSwgNCwgMSwgMCwgMCksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5zcHRrLm1hbnkuY2xyIiwJQlIgKDB4MjEsIDQsIDEsIDAsIDEpLCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuc3BudC5tYW55IiwJQlIgKDB4MjEsIDQsIDEsIDEsIDApLCBNT0RfUlJCU30sCi0gICAgeyJici5yZXQuc3BudC5tYW55LmNsciIsCUJSICgweDIxLCA0LCAxLCAxLCAxKSwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LmRwdGsubWFueSIsCUJSICgweDIxLCA0LCAxLCAyLCAwKSwgTU9EX1JSQlN9LAotICAgIHsiYnIucmV0LmRwdGsubWFueS5jbHIiLAlCUiAoMHgyMSwgNCwgMSwgMiwgMSksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5kcG50Lm1hbnkiLAlCUiAoMHgyMSwgNCwgMSwgMywgMCksIE1PRF9SUkJTfSwKLSAgICB7ImJyLnJldC5kcG50Lm1hbnkuY2xyIiwJQlIgKDB4MjEsIDQsIDEsIDMsIDEpLCBNT0RfUlJCU30sCi0jdW5kZWYgQlIKLQotICAgIHsiY292ZXIiLAkJQjAsIE9wWDYgKDAsIDB4MDIpLCB7MCwgfSwgTk9fUFJFRCB8IExBU1QgfCBNT0RfUlJCU30sCi0gICAgeyJjbHJycmIiLAkJQjAsIE9wWDYgKDAsIDB4MDQpLCB7MCwgfSwgTk9fUFJFRCB8IExBU1QgfCBNT0RfUlJCU30sCi0gICAgeyJjbHJycmIucHIiLAlCMCwgT3BYNiAoMCwgMHgwNSksIHswLCB9LCBOT19QUkVEIHwgTEFTVCB8IE1PRF9SUkJTfSwKLSAgICB7InJmaSIsCQlCMCwgT3BYNiAoMCwgMHgwOCksIHswLCB9LCBOT19QUkVEIHwgTEFTVCB8IFBSSVYgfCBNT0RfUlJCU30sCi0gICAgeyJic3cuMCIsCQlCMCwgT3BYNiAoMCwgMHgwYyksIHswLCB9LCBOT19QUkVEIHwgTEFTVCB8IFBSSVZ9LAotICAgIHsiYnN3LjEiLAkJQjAsIE9wWDYgKDAsIDB4MGQpLCB7MCwgfSwgTk9fUFJFRCB8IExBU1QgfCBQUklWfSwKLSAgICB7ImVwYyIsCQlCMCwgT3BYNiAoMCwgMHgxMCksIHswLCB9LCBOT19QUkVEfSwKLQotICAgIHsiYnJlYWsuYiIsCQlCMCwgT3BYNiAoMCwgMHgwMCksIHtJTU1VMjF9fSwKLQotICAgIHsiYnIuY2FsbC5zcHRrLmZldyIsCUIsIE9wUGFXaGFEICgxLCAwLCAwLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5zcHRrIiwJCUIsIE9wUGFXaGFEICgxLCAwLCAwLCAwKSwge0IxLCBCMn0sIFBTRVVET30sCi0gICAgeyJici5jYWxsLnNwdGsuZmV3LmNsciIsCUIsIE9wUGFXaGFEICgxLCAwLCAwLCAxKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5zcHRrLmNsciIsCUIsIE9wUGFXaGFEICgxLCAwLCAwLCAxKSwge0IxLCBCMn0sIFBTRVVET30sCi0gICAgeyJici5jYWxsLnNwbnQuZmV3IiwJQiwgT3BQYVdoYUQgKDEsIDAsIDEsIDApLCB7QjEsIEIyfX0sCi0gICAgeyJici5jYWxsLnNwbnQiLAkJQiwgT3BQYVdoYUQgKDEsIDAsIDEsIDApLCB7QjEsIEIyfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuc3BudC5mZXcuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDAsIDEsIDEpLCB7QjEsIEIyfX0sCi0gICAgeyJici5jYWxsLnNwbnQuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDAsIDEsIDEpLCB7QjEsIEIyfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuZHB0ay5mZXciLAlCLCBPcFBhV2hhRCAoMSwgMCwgMiwgMCksIHtCMSwgQjJ9fSwKLSAgICB7ImJyLmNhbGwuZHB0ayIsCQlCLCBPcFBhV2hhRCAoMSwgMCwgMiwgMCksIHtCMSwgQjJ9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5kcHRrLmZldy5jbHIiLAlCLCBPcFBhV2hhRCAoMSwgMCwgMiwgMSksIHtCMSwgQjJ9fSwKLSAgICB7ImJyLmNhbGwuZHB0ay5jbHIiLAlCLCBPcFBhV2hhRCAoMSwgMCwgMiwgMSksIHtCMSwgQjJ9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5kcG50LmZldyIsCUIsIE9wUGFXaGFEICgxLCAwLCAzLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5kcG50IiwJCUIsIE9wUGFXaGFEICgxLCAwLCAzLCAwKSwge0IxLCBCMn0sIFBTRVVET30sCi0gICAgeyJici5jYWxsLmRwbnQuZmV3LmNsciIsCUIsIE9wUGFXaGFEICgxLCAwLCAzLCAxKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5kcG50LmNsciIsCUIsIE9wUGFXaGFEICgxLCAwLCAzLCAxKSwge0IxLCBCMn0sIFBTRVVET30sCi0gICAgeyJici5jYWxsLnNwdGsubWFueSIsCUIsIE9wUGFXaGFEICgxLCAxLCAwLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5zcHRrLm1hbnkuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDEsIDAsIDEpLCB7QjEsIEIyfX0sCi0gICAgeyJici5jYWxsLnNwbnQubWFueSIsCUIsIE9wUGFXaGFEICgxLCAxLCAxLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5zcG50Lm1hbnkuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDEsIDEsIDEpLCB7QjEsIEIyfX0sCi0gICAgeyJici5jYWxsLmRwdGsubWFueSIsCUIsIE9wUGFXaGFEICgxLCAxLCAyLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5kcHRrLm1hbnkuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDEsIDIsIDEpLCB7QjEsIEIyfX0sCi0gICAgeyJici5jYWxsLmRwbnQubWFueSIsCUIsIE9wUGFXaGFEICgxLCAxLCAzLCAwKSwge0IxLCBCMn19LAotICAgIHsiYnIuY2FsbC5kcG50Lm1hbnkuY2xyIiwJQiwgT3BQYVdoYUQgKDEsIDEsIDMsIDEpLCB7QjEsIEIyfX0sCi0KLSNkZWZpbmUgQlJQKGEsYixjKSBcCi0gICAgICBCMCwgT3BYNkloV2hiICgyLCBhLCBiLCBjKSwge0IyLCBUQUcxM30sIE5PX1BSRUQKLSAgICB7ImJycC5zcHRrIiwJCUJSUCAoMHgxMCwgMCwgMCl9LAotICAgIHsiYnJwLmRwdGsiLAkJQlJQICgweDEwLCAwLCAyKX0sCi0gICAgeyJicnAuc3B0ay5pbXAiLAkJQlJQICgweDEwLCAxLCAwKX0sCi0gICAgeyJicnAuZHB0ay5pbXAiLAkJQlJQICgweDEwLCAxLCAyKX0sCi0gICAgeyJicnAucmV0LnNwdGsiLAkJQlJQICgweDExLCAwLCAwKX0sCi0gICAgeyJicnAucmV0LmRwdGsiLAkJQlJQICgweDExLCAwLCAyKX0sCi0gICAgeyJicnAucmV0LnNwdGsuaW1wIiwJQlJQICgweDExLCAxLCAwKX0sCi0gICAgeyJicnAucmV0LmRwdGsuaW1wIiwJQlJQICgweDExLCAxLCAyKX0sCi0jdW5kZWYgQlJQCi0KLSAgICB7Im5vcC5iIiwJCUIwLCBPcFg2ICgyLCAweDAwKSwge0lNTVUyMX19LAotCi0jZGVmaW5lIEJSKGEsYikgXAotICAgICAgQjAsIE9wQnR5cGVQYVdoYURQciAoNCwgMCwgYSwgMCwgYiwgMCksIHtUR1QyNWN9LCBQU0VVRE8KLSAgICB7ImJyLmZldyIsCQlCUiAoMCwgMCl9LAotICAgIHsiYnIiLAkJQlIgKDAsIDApfSwKLSAgICB7ImJyLmZldy5jbHIiLAlCUiAoMCwgMSl9LAotICAgIHsiYnIuY2xyIiwJCUJSICgwLCAxKX0sCi0gICAgeyJici5tYW55IiwJCUJSICgxLCAwKX0sCi0gICAgeyJici5tYW55LmNsciIsCUJSICgxLCAxKX0sCi0jdW5kZWYgQlIKLQotI2RlZmluZSBCUihhLGIsYykgXAotICAgICAgQjAsIE9wQnR5cGVQYVdoYUQgKDQsIDAsIGEsIGIsIGMpLCB7VEdUMjVjfQotICAgIHsiYnIuY29uZC5zcHRrLmZldyIsCUJSICgwLCAwLCAwKX0sCi0gICAgeyJici5jb25kLnNwdGsiLAkJQlIgKDAsIDAsIDApLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5zcHRrLmZldy5jbHIiLAlCUiAoMCwgMCwgMSl9LAotICAgIHsiYnIuY29uZC5zcHRrLmNsciIsCUJSICgwLCAwLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3BudC5mZXciLAlCUiAoMCwgMSwgMCl9LAotICAgIHsiYnIuY29uZC5zcG50IiwJCUJSICgwLCAxLCAwKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3BudC5mZXcuY2xyIiwJQlIgKDAsIDEsIDEpfSwKLSAgICB7ImJyLmNvbmQuc3BudC5jbHIiLAlCUiAoMCwgMSwgMSksIFBTRVVET30sCi0gICAgeyJici5jb25kLmRwdGsuZmV3IiwJQlIgKDAsIDIsIDApfSwKLSAgICB7ImJyLmNvbmQuZHB0ayIsCQlCUiAoMCwgMiwgMCksIFBTRVVET30sCi0gICAgeyJici5jb25kLmRwdGsuZmV3LmNsciIsCUJSICgwLCAyLCAxKX0sCi0gICAgeyJici5jb25kLmRwdGsuY2xyIiwJQlIgKDAsIDIsIDEpLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5kcG50LmZldyIsCUJSICgwLCAzLCAwKX0sCi0gICAgeyJici5jb25kLmRwbnQiLAkJQlIgKDAsIDMsIDApLCBQU0VVRE99LAotICAgIHsiYnIuY29uZC5kcG50LmZldy5jbHIiLAlCUiAoMCwgMywgMSl9LAotICAgIHsiYnIuY29uZC5kcG50LmNsciIsCUJSICgwLCAzLCAxKSwgUFNFVURPfSwKLSAgICB7ImJyLmNvbmQuc3B0ay5tYW55IiwJQlIgKDEsIDAsIDApfSwKLSAgICB7ImJyLmNvbmQuc3B0ay5tYW55LmNsciIsCUJSICgxLCAwLCAxKX0sCi0gICAgeyJici5jb25kLnNwbnQubWFueSIsCUJSICgxLCAxLCAwKX0sCi0gICAgeyJici5jb25kLnNwbnQubWFueS5jbHIiLAlCUiAoMSwgMSwgMSl9LAotICAgIHsiYnIuY29uZC5kcHRrLm1hbnkiLAlCUiAoMSwgMiwgMCl9LAotICAgIHsiYnIuY29uZC5kcHRrLm1hbnkuY2xyIiwJQlIgKDEsIDIsIDEpfSwKLSAgICB7ImJyLmNvbmQuZHBudC5tYW55IiwJQlIgKDEsIDMsIDApfSwKLSAgICB7ImJyLmNvbmQuZHBudC5tYW55LmNsciIsCUJSICgxLCAzLCAxKX0sCi0gICAgeyJici5zcHRrLmZldyIsCQlCUiAoMCwgMCwgMCl9LAotICAgIHsiYnIuc3B0ayIsCQkJQlIgKDAsIDAsIDApLCBQU0VVRE99LAotICAgIHsiYnIuc3B0ay5mZXcuY2xyIiwJCUJSICgwLCAwLCAxKX0sCi0gICAgeyJici5zcHRrLmNsciIsCQlCUiAoMCwgMCwgMSksIFBTRVVET30sCi0gICAgeyJici5zcG50LmZldyIsCQlCUiAoMCwgMSwgMCl9LAotICAgIHsiYnIuc3BudCIsCQkJQlIgKDAsIDEsIDApLCBQU0VVRE99LAotICAgIHsiYnIuc3BudC5mZXcuY2xyIiwJCUJSICgwLCAxLCAxKX0sCi0gICAgeyJici5zcG50LmNsciIsCQlCUiAoMCwgMSwgMSksIFBTRVVET30sCi0gICAgeyJici5kcHRrLmZldyIsCQlCUiAoMCwgMiwgMCl9LAotICAgIHsiYnIuZHB0ayIsCQkJQlIgKDAsIDIsIDApLCBQU0VVRE99LAotICAgIHsiYnIuZHB0ay5mZXcuY2xyIiwJCUJSICgwLCAyLCAxKX0sCi0gICAgeyJici5kcHRrLmNsciIsCQlCUiAoMCwgMiwgMSksIFBTRVVET30sCi0gICAgeyJici5kcG50LmZldyIsCQlCUiAoMCwgMywgMCl9LAotICAgIHsiYnIuZHBudCIsCQkJQlIgKDAsIDMsIDApLCBQU0VVRE99LAotICAgIHsiYnIuZHBudC5mZXcuY2xyIiwJCUJSICgwLCAzLCAxKX0sCi0gICAgeyJici5kcG50LmNsciIsCQlCUiAoMCwgMywgMSksIFBTRVVET30sCi0gICAgeyJici5zcHRrLm1hbnkiLAkJQlIgKDEsIDAsIDApfSwKLSAgICB7ImJyLnNwdGsubWFueS5jbHIiLAlCUiAoMSwgMCwgMSl9LAotICAgIHsiYnIuc3BudC5tYW55IiwJCUJSICgxLCAxLCAwKX0sCi0gICAgeyJici5zcG50Lm1hbnkuY2xyIiwJQlIgKDEsIDEsIDEpfSwKLSAgICB7ImJyLmRwdGsubWFueSIsCQlCUiAoMSwgMiwgMCl9LAotICAgIHsiYnIuZHB0ay5tYW55LmNsciIsCUJSICgxLCAyLCAxKX0sCi0gICAgeyJici5kcG50Lm1hbnkiLAkJQlIgKDEsIDMsIDApfSwKLSAgICB7ImJyLmRwbnQubWFueS5jbHIiLAlCUiAoMSwgMywgMSl9LAotI3VuZGVmIEJSCi0KLSNkZWZpbmUgQlIoYSxiLGMsZCkgXAotCUIwLCBPcEJ0eXBlUGFXaGFEICg0LCBhLCBiLCBjLCBkKSwge1RHVDI1Y30sIFNMT1QyCi0gICAgeyJici53ZXhpdC5zcHRrLmZldyIsCUJSICgyLCAwLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LnNwdGsiLAkJQlIgKDIsIDAsIDAsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3B0ay5mZXcuY2xyIiwJQlIgKDIsIDAsIDAsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3B0ay5jbHIiLAlCUiAoMiwgMCwgMCwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5zcG50LmZldyIsCUJSICgyLCAwLCAxLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LnNwbnQiLAkJQlIgKDIsIDAsIDEsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3BudC5mZXcuY2xyIiwJQlIgKDIsIDAsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3BudC5jbHIiLAlCUiAoMiwgMCwgMSwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5kcHRrLmZldyIsCUJSICgyLCAwLCAyLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LmRwdGsiLAkJQlIgKDIsIDAsIDIsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuZHB0ay5mZXcuY2xyIiwJQlIgKDIsIDAsIDIsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuZHB0ay5jbHIiLAlCUiAoMiwgMCwgMiwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5kcG50LmZldyIsCUJSICgyLCAwLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LmRwbnQiLAkJQlIgKDIsIDAsIDMsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuZHBudC5mZXcuY2xyIiwJQlIgKDIsIDAsIDMsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuZHBudC5jbHIiLAlCUiAoMiwgMCwgMywgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5zcHRrLm1hbnkiLAlCUiAoMiwgMSwgMCwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5zcHRrLm1hbnkuY2xyIiwJQlIgKDIsIDEsIDAsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3BudC5tYW55IiwJQlIgKDIsIDEsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud2V4aXQuc3BudC5tYW55LmNsciIsCUJSICgyLCAxLCAxLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LmRwdGsubWFueSIsCUJSICgyLCAxLCAyLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLndleGl0LmRwdGsubWFueS5jbHIiLAlCUiAoMiwgMSwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5kcG50Lm1hbnkiLAlCUiAoMiwgMSwgMywgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici53ZXhpdC5kcG50Lm1hbnkuY2xyIiwJQlIgKDIsIDEsIDMsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5zcHRrLmZldyIsCUJSICgzLCAwLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3Auc3B0ayIsCQlCUiAoMywgMCwgMCwgMCkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLnNwdGsuZmV3LmNsciIsCUJSICgzLCAwLCAwLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3Auc3B0ay5jbHIiLAlCUiAoMywgMCwgMCwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLnNwbnQuZmV3IiwJQlIgKDMsIDAsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5zcG50IiwJCUJSICgzLCAwLCAxLCAwKSB8IFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3Auc3BudC5mZXcuY2xyIiwJQlIgKDMsIDAsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5zcG50LmNsciIsCUJSICgzLCAwLCAxLCAxKSB8IFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3AuZHB0ay5mZXciLAlCUiAoMywgMCwgMiwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLmRwdGsiLAkJQlIgKDMsIDAsIDIsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5kcHRrLmZldy5jbHIiLAlCUiAoMywgMCwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLmRwdGsuY2xyIiwJQlIgKDMsIDAsIDIsIDEpIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5kcG50LmZldyIsCUJSICgzLCAwLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3AuZHBudCIsCQlCUiAoMywgMCwgMywgMCkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLmRwbnQuZmV3LmNsciIsCUJSICgzLCAwLCAzLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3AuZHBudC5jbHIiLAlCUiAoMywgMCwgMywgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLnNwdGsubWFueSIsCUJSICgzLCAxLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3Auc3B0ay5tYW55LmNsciIsCUJSICgzLCAxLCAwLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3Auc3BudC5tYW55IiwJQlIgKDMsIDEsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5zcG50Lm1hbnkuY2xyIiwJQlIgKDMsIDEsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIud3RvcC5kcHRrLm1hbnkiLAlCUiAoMywgMSwgMiwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLmRwdGsubWFueS5jbHIiLAlCUiAoMywgMSwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici53dG9wLmRwbnQubWFueSIsCUJSICgzLCAxLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLnd0b3AuZHBudC5tYW55LmNsciIsCUJSICgzLCAxLCAzLCAxKSB8IE1PRF9SUkJTfSwKLQotI3VuZGVmIEJSCi0jZGVmaW5lIEJSKGEsYixjLGQpIFwKLQlCMCwgT3BCdHlwZVBhV2hhRCAoNCwgYSwgYiwgYywgZCksIHtUR1QyNWN9LCBTTE9UMiB8IE5PX1BSRUQKLSAgICB7ImJyLmNsb29wLnNwdGsuZmV3IiwJQlIgKDUsIDAsIDAsIDApfSwKLSAgICB7ImJyLmNsb29wLnNwdGsiLAkJQlIgKDUsIDAsIDAsIDApIHwgUFNFVURPfSwKLSAgICB7ImJyLmNsb29wLnNwdGsuZmV3LmNsciIsCUJSICg1LCAwLCAwLCAxKX0sCi0gICAgeyJici5jbG9vcC5zcHRrLmNsciIsCUJSICg1LCAwLCAwLCAxKSB8IFBTRVVET30sCi0gICAgeyJici5jbG9vcC5zcG50LmZldyIsCUJSICg1LCAwLCAxLCAwKX0sCi0gICAgeyJici5jbG9vcC5zcG50IiwJCUJSICg1LCAwLCAxLCAwKSB8IFBTRVVET30sCi0gICAgeyJici5jbG9vcC5zcG50LmZldy5jbHIiLAlCUiAoNSwgMCwgMSwgMSl9LAotICAgIHsiYnIuY2xvb3Auc3BudC5jbHIiLAlCUiAoNSwgMCwgMSwgMSkgfCBQU0VVRE99LAotICAgIHsiYnIuY2xvb3AuZHB0ay5mZXciLAlCUiAoNSwgMCwgMiwgMCl9LAotICAgIHsiYnIuY2xvb3AuZHB0ayIsCQlCUiAoNSwgMCwgMiwgMCkgfCBQU0VVRE99LAotICAgIHsiYnIuY2xvb3AuZHB0ay5mZXcuY2xyIiwJQlIgKDUsIDAsIDIsIDEpfSwKLSAgICB7ImJyLmNsb29wLmRwdGsuY2xyIiwJQlIgKDUsIDAsIDIsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJyLmNsb29wLmRwbnQuZmV3IiwJQlIgKDUsIDAsIDMsIDApfSwKLSAgICB7ImJyLmNsb29wLmRwbnQiLAkJQlIgKDUsIDAsIDMsIDApIHwgUFNFVURPfSwKLSAgICB7ImJyLmNsb29wLmRwbnQuZmV3LmNsciIsCUJSICg1LCAwLCAzLCAxKX0sCi0gICAgeyJici5jbG9vcC5kcG50LmNsciIsCUJSICg1LCAwLCAzLCAxKSB8IFBTRVVET30sCi0gICAgeyJici5jbG9vcC5zcHRrLm1hbnkiLAlCUiAoNSwgMSwgMCwgMCl9LAotICAgIHsiYnIuY2xvb3Auc3B0ay5tYW55LmNsciIsCUJSICg1LCAxLCAwLCAxKX0sCi0gICAgeyJici5jbG9vcC5zcG50Lm1hbnkiLAlCUiAoNSwgMSwgMSwgMCl9LAotICAgIHsiYnIuY2xvb3Auc3BudC5tYW55LmNsciIsCUJSICg1LCAxLCAxLCAxKX0sCi0gICAgeyJici5jbG9vcC5kcHRrLm1hbnkiLAlCUiAoNSwgMSwgMiwgMCl9LAotICAgIHsiYnIuY2xvb3AuZHB0ay5tYW55LmNsciIsCUJSICg1LCAxLCAyLCAxKX0sCi0gICAgeyJici5jbG9vcC5kcG50Lm1hbnkiLAlCUiAoNSwgMSwgMywgMCl9LAotICAgIHsiYnIuY2xvb3AuZHBudC5tYW55LmNsciIsCUJSICg1LCAxLCAzLCAxKX0sCi0gICAgeyJici5jZXhpdC5zcHRrLmZldyIsCUJSICg2LCAwLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LnNwdGsiLAkJQlIgKDYsIDAsIDAsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3B0ay5mZXcuY2xyIiwJQlIgKDYsIDAsIDAsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3B0ay5jbHIiLAlCUiAoNiwgMCwgMCwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5zcG50LmZldyIsCUJSICg2LCAwLCAxLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LnNwbnQiLAkJQlIgKDYsIDAsIDEsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3BudC5mZXcuY2xyIiwJQlIgKDYsIDAsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3BudC5jbHIiLAlCUiAoNiwgMCwgMSwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5kcHRrLmZldyIsCUJSICg2LCAwLCAyLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LmRwdGsiLAkJQlIgKDYsIDAsIDIsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuZHB0ay5mZXcuY2xyIiwJQlIgKDYsIDAsIDIsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuZHB0ay5jbHIiLAlCUiAoNiwgMCwgMiwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5kcG50LmZldyIsCUJSICg2LCAwLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LmRwbnQiLAkJQlIgKDYsIDAsIDMsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuZHBudC5mZXcuY2xyIiwJQlIgKDYsIDAsIDMsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuZHBudC5jbHIiLAlCUiAoNiwgMCwgMywgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5zcHRrLm1hbnkiLAlCUiAoNiwgMSwgMCwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5zcHRrLm1hbnkuY2xyIiwJQlIgKDYsIDEsIDAsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3BudC5tYW55IiwJQlIgKDYsIDEsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY2V4aXQuc3BudC5tYW55LmNsciIsCUJSICg2LCAxLCAxLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LmRwdGsubWFueSIsCUJSICg2LCAxLCAyLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmNleGl0LmRwdGsubWFueS5jbHIiLAlCUiAoNiwgMSwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5kcG50Lm1hbnkiLAlCUiAoNiwgMSwgMywgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jZXhpdC5kcG50Lm1hbnkuY2xyIiwJQlIgKDYsIDEsIDMsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5zcHRrLmZldyIsCUJSICg3LCAwLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3Auc3B0ayIsCQlCUiAoNywgMCwgMCwgMCkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLnNwdGsuZmV3LmNsciIsCUJSICg3LCAwLCAwLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3Auc3B0ay5jbHIiLAlCUiAoNywgMCwgMCwgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLnNwbnQuZmV3IiwJQlIgKDcsIDAsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5zcG50IiwJCUJSICg3LCAwLCAxLCAwKSB8IFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3Auc3BudC5mZXcuY2xyIiwJQlIgKDcsIDAsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5zcG50LmNsciIsCUJSICg3LCAwLCAxLCAxKSB8IFBTRVVETyB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3AuZHB0ay5mZXciLAlCUiAoNywgMCwgMiwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLmRwdGsiLAkJQlIgKDcsIDAsIDIsIDApIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5kcHRrLmZldy5jbHIiLAlCUiAoNywgMCwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLmRwdGsuY2xyIiwJQlIgKDcsIDAsIDIsIDEpIHwgUFNFVURPIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5kcG50LmZldyIsCUJSICg3LCAwLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3AuZHBudCIsCQlCUiAoNywgMCwgMywgMCkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLmRwbnQuZmV3LmNsciIsCUJSICg3LCAwLCAzLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3AuZHBudC5jbHIiLAlCUiAoNywgMCwgMywgMSkgfCBQU0VVRE8gfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLnNwdGsubWFueSIsCUJSICg3LCAxLCAwLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3Auc3B0ay5tYW55LmNsciIsCUJSICg3LCAxLCAwLCAxKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3Auc3BudC5tYW55IiwJQlIgKDcsIDEsIDEsIDApIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5zcG50Lm1hbnkuY2xyIiwJQlIgKDcsIDEsIDEsIDEpIHwgTU9EX1JSQlN9LAotICAgIHsiYnIuY3RvcC5kcHRrLm1hbnkiLAlCUiAoNywgMSwgMiwgMCkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLmRwdGsubWFueS5jbHIiLAlCUiAoNywgMSwgMiwgMSkgfCBNT0RfUlJCU30sCi0gICAgeyJici5jdG9wLmRwbnQubWFueSIsCUJSICg3LCAxLCAzLCAwKSB8IE1PRF9SUkJTfSwKLSAgICB7ImJyLmN0b3AuZHBudC5tYW55LmNsciIsCUJSICg3LCAxLCAzLCAxKSB8IE1PRF9SUkJTfSwKLQotI3VuZGVmIEJSCi0jZGVmaW5lIEJSKGEsYixjLGQpIFwKLQlCMCwgT3BCdHlwZVBhV2hhRCAoNCwgYSwgYiwgYywgZCksIHtUR1QyNWN9LCBTTE9UMgotICAgIHsiYnIuY2FsbC5zcHRrLmZldyIsCUIsIE9wUGFXaGFEICg1LCAwLCAwLCAwKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuc3B0ayIsCQlCLCBPcFBhV2hhRCAoNSwgMCwgMCwgMCksIHtCMSwgVEdUMjVjfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuc3B0ay5mZXcuY2xyIiwJQiwgT3BQYVdoYUQgKDUsIDAsIDAsIDEpLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5zcHRrLmNsciIsCUIsIE9wUGFXaGFEICg1LCAwLCAwLCAxKSwge0IxLCBUR1QyNWN9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5zcG50LmZldyIsCUIsIE9wUGFXaGFEICg1LCAwLCAxLCAwKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuc3BudCIsCQlCLCBPcFBhV2hhRCAoNSwgMCwgMSwgMCksIHtCMSwgVEdUMjVjfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuc3BudC5mZXcuY2xyIiwJQiwgT3BQYVdoYUQgKDUsIDAsIDEsIDEpLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5zcG50LmNsciIsCUIsIE9wUGFXaGFEICg1LCAwLCAxLCAxKSwge0IxLCBUR1QyNWN9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5kcHRrLmZldyIsCUIsIE9wUGFXaGFEICg1LCAwLCAyLCAwKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuZHB0ayIsCQlCLCBPcFBhV2hhRCAoNSwgMCwgMiwgMCksIHtCMSwgVEdUMjVjfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuZHB0ay5mZXcuY2xyIiwJQiwgT3BQYVdoYUQgKDUsIDAsIDIsIDEpLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5kcHRrLmNsciIsCUIsIE9wUGFXaGFEICg1LCAwLCAyLCAxKSwge0IxLCBUR1QyNWN9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5kcG50LmZldyIsCUIsIE9wUGFXaGFEICg1LCAwLCAzLCAwKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuZHBudCIsCQlCLCBPcFBhV2hhRCAoNSwgMCwgMywgMCksIHtCMSwgVEdUMjVjfSwgUFNFVURPfSwKLSAgICB7ImJyLmNhbGwuZHBudC5mZXcuY2xyIiwJQiwgT3BQYVdoYUQgKDUsIDAsIDMsIDEpLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5kcG50LmNsciIsCUIsIE9wUGFXaGFEICg1LCAwLCAzLCAxKSwge0IxLCBUR1QyNWN9LCBQU0VVRE99LAotICAgIHsiYnIuY2FsbC5zcHRrLm1hbnkiLAlCLCBPcFBhV2hhRCAoNSwgMSwgMCwgMCksIHtCMSwgVEdUMjVjfX0sCi0gICAgeyJici5jYWxsLnNwdGsubWFueS5jbHIiLAlCLCBPcFBhV2hhRCAoNSwgMSwgMCwgMSksIHtCMSwgVEdUMjVjfX0sCi0gICAgeyJici5jYWxsLnNwbnQubWFueSIsCUIsIE9wUGFXaGFEICg1LCAxLCAxLCAwKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuc3BudC5tYW55LmNsciIsCUIsIE9wUGFXaGFEICg1LCAxLCAxLCAxKSwge0IxLCBUR1QyNWN9fSwKLSAgICB7ImJyLmNhbGwuZHB0ay5tYW55IiwJQiwgT3BQYVdoYUQgKDUsIDEsIDIsIDApLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5kcHRrLm1hbnkuY2xyIiwJQiwgT3BQYVdoYUQgKDUsIDEsIDIsIDEpLCB7QjEsIFRHVDI1Y319LAotICAgIHsiYnIuY2FsbC5kcG50Lm1hbnkiLAlCLCBPcFBhV2hhRCAoNSwgMSwgMywgMCksIHtCMSwgVEdUMjVjfX0sCi0gICAgeyJici5jYWxsLmRwbnQubWFueS5jbHIiLAlCLCBPcFBhV2hhRCAoNSwgMSwgMywgMSksIHtCMSwgVEdUMjVjfX0sCi0jdW5kZWYgQlIKLQotICAgIC8qIGJyYW5jaCBwcmVkaWN0ICovCi0jZGVmaW5lIEJSUChhLGIpIFwKLSAgICAgIEIwLCBPcEloV2hiICg3LCBhLCBiKSwge1RHVDI1YywgVEFHMTN9LCBOT19QUkVECi0gICAgeyJicnAuc3B0ayIsCQlCUlAgKDAsIDApfSwKLSAgICB7ImJycC5sb29wIiwJCUJSUCAoMCwgMSl9LAotICAgIHsiYnJwLmRwdGsiLAkJQlJQICgwLCAyKX0sCi0gICAgeyJicnAuZXhpdCIsCQlCUlAgKDAsIDMpfSwKLSAgICB7ImJycC5zcHRrLmltcCIsCQlCUlAgKDEsIDApfSwKLSAgICB7ImJycC5sb29wLmltcCIsCQlCUlAgKDEsIDEpfSwKLSAgICB7ImJycC5kcHRrLmltcCIsCQlCUlAgKDEsIDIpfSwKLSAgICB7ImJycC5leGl0LmltcCIsCQlCUlAgKDEsIDMpfSwKLSN1bmRlZiBCUlAKLQotICAgIHswfQotICB9OwotCi0jdW5kZWYgQjAKLSN1bmRlZiBCCi0jdW5kZWYgYkJ0eXBlCi0jdW5kZWYgYkQKLSN1bmRlZiBiSWgKLSN1bmRlZiBiUGEKLSN1bmRlZiBiUHIKLSN1bmRlZiBiV2hhCi0jdW5kZWYgYldoYgotI3VuZGVmIGJYNgotI3VuZGVmIG1CdHlwZQotI3VuZGVmIG1ECi0jdW5kZWYgbUloCi0jdW5kZWYgbVBhCi0jdW5kZWYgbVByCi0jdW5kZWYgbVdoYQotI3VuZGVmIG1XaGIKLSN1bmRlZiBtWDYKLSN1bmRlZiBPcFg2Ci0jdW5kZWYgT3BQYVdoYUQKLSN1bmRlZiBPcEJ0eXBlUGFXaGFECi0jdW5kZWYgT3BCdHlwZVBhV2hhRFByCi0jdW5kZWYgT3BYNkJ0eXBlUGFXaGFECi0jdW5kZWYgT3BYNkJ0eXBlUGFXaGFEUHIKLSN1bmRlZiBPcEloV2hiCi0jdW5kZWYgT3BYNkloV2hiCmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtb3BjLWQuYyBiL29wY29kZXMvaWE2NC1vcGMtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDIxZDNiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1vcGMtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc3RydWN0IGlhNjRfb3Bjb2RlIGlhNjRfb3Bjb2Rlc19kW10gPQotICB7Ci0gICAgeyJhZGQiLCAgIElBNjRfVFlQRV9EWU4sIDEsIDAsIDAsCi0gICAgIHtJQTY0X09QTkRfUjEsIElBNjRfT1BORF9JTU0yMiwgSUE2NF9PUE5EX1IzfX0sCi0gICAgeyJicmVhayIsIElBNjRfVFlQRV9EWU4sIDAsIDAsIDAsIHtJQTY0X09QTkRfSU1NVTIxfX0sCi0gICAgeyJjaGsucyIsIElBNjRfVFlQRV9EWU4sIDAsIDAsIDAsIHtJQTY0X09QTkRfUjIsIElBNjRfT1BORF9UR1QyNWJ9fSwKLSAgICB7Im1vdiIsICAgSUE2NF9UWVBFX0RZTiwgMSwgMCwgMCwge0lBNjRfT1BORF9SMSwgIElBNjRfT1BORF9BUjN9fSwKLSAgICB7Im1vdiIsICAgSUE2NF9UWVBFX0RZTiwgMSwgMCwgMCwge0lBNjRfT1BORF9BUjMsIElBNjRfT1BORF9JTU04fX0sCi0gICAgeyJtb3YiLCAgIElBNjRfVFlQRV9EWU4sIDEsIDAsIDAsIHtJQTY0X09QTkRfQVIzLCBJQTY0X09QTkRfUjJ9fSwKLSAgICB7Im5vcCIsICAgSUE2NF9UWVBFX0RZTiwgMCwgMCwgMCwge0lBNjRfT1BORF9JTU1VMjF9fSwKLSAgICB7MH0KLSAgfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1vcGMtZi5jIGIvb3Bjb2Rlcy9pYTY0LW9wYy1mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWJjNmEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pYTY0LW9wYy1mLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyogaWE2NC1vcGMtZi5jIC0tIElBLTY0IGBGJyBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiaWE2NC1vcGMuaCIKLQotI2RlZmluZSBmMAlJQTY0X1RZUEVfRiwgMAotI2RlZmluZSBmCUlBNjRfVFlQRV9GLCAxCi0jZGVmaW5lIGYyCUlBNjRfVFlQRV9GLCAyCi0KLSNkZWZpbmUgYkYyKHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4N2YpKSA8PCAxMykKLSNkZWZpbmUgYkY0KHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4N2YpKSA8PCAyNykKLSNkZWZpbmUgYlEoeCkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzYpCi0jZGVmaW5lIGJSYSh4KQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzMykKLSNkZWZpbmUgYlJiKHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDM2KQotI2RlZmluZSBiU2YoeCkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMzQpCi0jZGVmaW5lIGJUYSh4KQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAxMikKLSNkZWZpbmUgYlhhKHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDM2KQotI2RlZmluZSBiWGIoeCkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzMpCi0jZGVmaW5lIGJYMih4KQkoKChpYTY0X2luc24pICgoeCkgJiAweDMpKSA8PCAzNCkKLSNkZWZpbmUgYlg2KHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4M2YpKSA8PCAyNykKLQotI2RlZmluZSBtRjIJYkYyICgtMSkKLSNkZWZpbmUgbUY0CWJGNCAoLTEpCi0jZGVmaW5lIG1RCWJRICgtMSkKLSNkZWZpbmUgbVJhCWJSYSAoLTEpCi0jZGVmaW5lIG1SYgliUmIgKC0xKQotI2RlZmluZSBtU2YJYlNmICgtMSkKLSNkZWZpbmUgbVRhCWJUYSAoLTEpCi0jZGVmaW5lIG1YYQliWGEgKC0xKQotI2RlZmluZSBtWGIJYlhiICgtMSkKLSNkZWZpbmUgbVgyCWJYMiAoLTEpCi0jZGVmaW5lIG1YNgliWDYgKC0xKQotCi0jZGVmaW5lIE9wWGEoYSxiKQkoYk9wIChhKSB8IGJYYSAoYikpLCAobU9wIHwgbVhhKQotI2RlZmluZSBPcFhhU2YoYSxiLGMpCShiT3AgKGEpIHwgYlhhIChiKSB8IGJTZiAoYykpLCAobU9wIHwgbVhhIHwgbVNmKQotI2RlZmluZSBPcFhhU2ZGMihhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiWGEgKGIpIHwgYlNmIChjKSB8IGJGMiAoZCkpLCAobU9wIHwgbVhhIHwgbVNmIHwgbUYyKQotI2RlZmluZSBPcFhhU2ZGNChhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiWGEgKGIpIHwgYlNmIChjKSB8IGJGNCAoZCkpLCAobU9wIHwgbVhhIHwgbVNmIHwgbUY0KQotI2RlZmluZSBPcFhhU2ZGMkY0KGEsYixjLGQsZSkgXAotCShiT3AgKGEpIHwgYlhhIChiKSB8IGJTZiAoYykgfCBiRjIgKGQpIHwgYkY0IChlKSksIFwKLQkobU9wIHwgbVhhIHwgbVNmIHwgbUYyIHwgbUY0KQotI2RlZmluZSBPcFhhWDIoYSxiLGMpCShiT3AgKGEpIHwgYlhhIChiKSB8IGJYMiAoYykpLCAobU9wIHwgbVhhIHwgbVgyKQotI2RlZmluZSBPcFhhWDJGMihhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiWGEgKGIpIHwgYlgyIChjKSB8IGJGMiAoZCkpLCAobU9wIHwgbVhhIHwgbVgyIHwgbUYyKQotI2RlZmluZSBPcFJhUmJUYVNmKGEsYixjLGQsZSkgXAotCShiT3AgKGEpIHwgYlJhIChiKSB8IGJSYiAoYykgfCBiVGEgKGQpIHwgYlNmIChlKSksIFwKLQkobU9wIHwgbVJhIHwgbVJiIHwgbVRhIHwgbVNmKQotI2RlZmluZSBPcFRhKGEsYikJKGJPcCAoYSkgfCBiVGEgKGIpKSwgKG1PcCB8IG1UYSkKLSNkZWZpbmUgT3BYYlFTZihhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiWGIgKGIpIHwgYlEgKGMpIHwgYlNmIChkKSksIChtT3AgfCBtWGIgfCBtUSB8IG1TZikKLSNkZWZpbmUgT3BYYlg2KGEsYixjKSBcCi0JKGJPcCAoYSkgfCBiWGIgKGIpIHwgYlg2IChjKSksIChtT3AgfCBtWGIgfCBtWDYpCi0jZGVmaW5lIE9wWGJYNkYyKGEsYixjLGQpIFwKLQkoYk9wIChhKSB8IGJYYiAoYikgfCBiWDYgKGMpIHwgYkYyIChkKSksIChtT3AgfCBtWGIgfCBtWDYgfCBtRjIpCi0jZGVmaW5lIE9wWGJYNlNmKGEsYixjLGQpIFwKLQkoYk9wIChhKSB8IGJYYiAoYikgfCBiWDYgKGMpIHwgYlNmIChkKSksIChtT3AgfCBtWGIgfCBtWDYgfCBtU2YpCi0KLXN0cnVjdCBpYTY0X29wY29kZSBpYTY0X29wY29kZXNfZltdID0KLSAgewotICAgIC8qIEYtdHlwZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgKHNvcnRlZCBhY2NvcmRpbmcgdG8gbWFqb3Igb3Bjb2RlKSAqLwotCi0gICAgeyJmcmNwYS5zMCIsCWYyLCBPcFhiUVNmICgwLCAxLCAwLCAwKSwge0YxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmcmNwYSIsCQlmMiwgT3BYYlFTZiAoMCwgMSwgMCwgMCksIHtGMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcmNwYS5zMSIsCWYyLCBPcFhiUVNmICgwLCAxLCAwLCAxKSwge0YxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmcmNwYS5zMiIsCWYyLCBPcFhiUVNmICgwLCAxLCAwLCAyKSwge0YxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmcmNwYS5zMyIsCWYyLCBPcFhiUVNmICgwLCAxLCAwLCAzKSwge0YxLCBQMiwgRjIsIEYzfX0sCi0KLSAgICB7ImZyc3FydGEuczAiLAlmMiwgT3BYYlFTZiAoMCwgMSwgMSwgMCksIHtGMSwgUDIsIEYzfX0sCi0gICAgeyJmcnNxcnRhIiwJCWYyLCBPcFhiUVNmICgwLCAxLCAxLCAwKSwge0YxLCBQMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZnJzcXJ0YS5zMSIsCWYyLCBPcFhiUVNmICgwLCAxLCAxLCAxKSwge0YxLCBQMiwgRjN9fSwKLSAgICB7ImZyc3FydGEuczIiLAlmMiwgT3BYYlFTZiAoMCwgMSwgMSwgMiksIHtGMSwgUDIsIEYzfX0sCi0gICAgeyJmcnNxcnRhLnMzIiwJZjIsIE9wWGJRU2YgKDAsIDEsIDEsIDMpLCB7RjEsIFAyLCBGM319LAotCi0gICAgeyJmbWluLnMwIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE0LCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZtaW4iLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTQsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmbWluLnMxIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE0LCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZtaW4uczIiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTQsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm1pbi5zMyIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNCwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmbWF4LnMwIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE1LCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZtYXgiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTUsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmbWF4LnMxIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE1LCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZtYXguczIiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTUsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm1heC5zMyIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNSwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmYW1pbi5zMCIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDE2LCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZhbWluIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE2LCAwKSwge0YxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmFtaW4uczEiLAlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNiwgMSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmYW1pbi5zMiIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDE2LCAyKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZhbWluLnMzIiwJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTYsIDMpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZmFtYXguczAiLAlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNywgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmYW1heCIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNywgMCksIHtGMSwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZhbWF4LnMxIiwJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTcsIDEpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZmFtYXguczIiLAlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxNywgMiksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmYW1heC5zMyIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDE3LCAzKSwge0YxLCBGMiwgRjN9fSwKLQotICAgIHsibW92IiwJCWYsIE9wWGJYNiAoMCwgMCwgMHgxMCksIHtGMSwgRjN9LCBQU0VVRE8gfCBGMl9FUV9GM30sCi0gICAgeyJmYWJzIiwJCWYsIE9wWGJYNkYyICgwLCAwLCAweDEwLCAwKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbmVnIiwJCWYsIE9wWGJYNiAgICgwLCAwLCAweDExKSwge0YxLCBGM30sIFBTRVVETyB8IEYyX0VRX0YzfSwKLSAgICB7ImZuZWdhYnMiLAkJZiwgT3BYYlg2RjIgKDAsIDAsIDB4MTEsIDApLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZtZXJnZS5zIiwJZiwgT3BYYlg2ICAgKDAsIDAsIDB4MTApLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm1lcmdlLm5zIiwJZiwgT3BYYlg2ICAgKDAsIDAsIDB4MTEpLCB7RjEsIEYyLCBGM319LAotCi0gICAgeyJmbWVyZ2Uuc2UiLAlmLCBPcFhiWDYgKDAsIDAsIDB4MTIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm1peC5sciIsCQlmLCBPcFhiWDYgKDAsIDAsIDB4MzkpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm1peC5yIiwJCWYsIE9wWGJYNiAoMCwgMCwgMHgzYSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmbWl4LmwiLAkJZiwgT3BYYlg2ICgwLCAwLCAweDNiKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZzeHQuciIsCQlmLCBPcFhiWDYgKDAsIDAsIDB4M2MpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnN4dC5sIiwJCWYsIE9wWGJYNiAoMCwgMCwgMHgzZCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFjayIsCQlmLCBPcFhiWDYgKDAsIDAsIDB4MjgpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnN3YXAiLAkJZiwgT3BYYlg2ICgwLCAwLCAweDM0KSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZzd2FwLm5sIiwJZiwgT3BYYlg2ICgwLCAwLCAweDM1KSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZzd2FwLm5yIiwJZiwgT3BYYlg2ICgwLCAwLCAweDM2KSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZhbmQiLAkJZiwgT3BYYlg2ICgwLCAwLCAweDJjKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZhbmRjbSIsCQlmLCBPcFhiWDYgKDAsIDAsIDB4MmQpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZm9yIiwJCWYsIE9wWGJYNiAoMCwgMCwgMHgyZSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmeG9yIiwJCWYsIE9wWGJYNiAoMCwgMCwgMHgyZiksIHtGMSwgRjIsIEYzfX0sCi0KLSAgICB7ImZjdnQuZnguczAiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTgsIDApLCB7RjEsIEYyfX0sCi0gICAgeyJmY3Z0LmZ4IiwJCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxOCwgMCksIHtGMSwgRjJ9LCBQU0VVRE99LAotICAgIHsiZmN2dC5meC5zMSIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxOCwgMSksIHtGMSwgRjJ9fSwKLSAgICB7ImZjdnQuZnguczIiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTgsIDIpLCB7RjEsIEYyfX0sCi0gICAgeyJmY3Z0LmZ4LnMzIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE4LCAzKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meHUuczAiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTksIDApLCB7RjEsIEYyfX0sCi0gICAgeyJmY3Z0LmZ4dSIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxOSwgMCksIHtGMSwgRjJ9LCBQU0VVRE99LAotICAgIHsiZmN2dC5meHUuczEiLAkJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MTksIDEpLCB7RjEsIEYyfX0sCi0gICAgeyJmY3Z0LmZ4dS5zMiIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxOSwgMiksIHtGMSwgRjJ9fSwKLSAgICB7ImZjdnQuZnh1LnMzIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDE5LCAzKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meC50cnVuYy5zMCIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDFhLCAwKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meC50cnVuYyIsCQlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxYSwgMCksIHtGMSwgRjJ9LCBQU0VVRE99LAotICAgIHsiZmN2dC5meC50cnVuYy5zMSIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDFhLCAxKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meC50cnVuYy5zMiIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDFhLCAyKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meC50cnVuYy5zMyIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDFhLCAzKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meHUudHJ1bmMuczAiLAlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxYiwgMCksIHtGMSwgRjJ9fSwKLSAgICB7ImZjdnQuZnh1LnRydW5jIiwJCWYsIE9wWGJYNlNmICgwLCAwLCAweDFiLCAwKSwge0YxLCBGMn0sIFBTRVVET30sCi0gICAgeyJmY3Z0LmZ4dS50cnVuYy5zMSIsCWYsIE9wWGJYNlNmICgwLCAwLCAweDFiLCAxKSwge0YxLCBGMn19LAotICAgIHsiZmN2dC5meHUudHJ1bmMuczIiLAlmLCBPcFhiWDZTZiAoMCwgMCwgMHgxYiwgMiksIHtGMSwgRjJ9fSwKLSAgICB7ImZjdnQuZnh1LnRydW5jLnMzIiwJZiwgT3BYYlg2U2YgKDAsIDAsIDB4MWIsIDMpLCB7RjEsIEYyfX0sCi0KLSAgICB7ImZjdnQueGYiLAkJZiwgT3BYYlg2ICgwLCAwLCAweDFjKSwge0YxLCBGMn19LAotCi0gICAgeyJmc2V0Yy5zMCIsCWYwLCBPcFhiWDZTZiAoMCwgMCwgMHgwNCwgMCksIHtJTU1VN2EsIElNTVU3Yn19LAotICAgIHsiZnNldGMiLAkJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA0LCAwKSwge0lNTVU3YSwgSU1NVTdifSwgUFNFVURPfSwKLSAgICB7ImZzZXRjLnMxIiwJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA0LCAxKSwge0lNTVU3YSwgSU1NVTdifX0sCi0gICAgeyJmc2V0Yy5zMiIsCWYwLCBPcFhiWDZTZiAoMCwgMCwgMHgwNCwgMiksIHtJTU1VN2EsIElNTVU3Yn19LAotICAgIHsiZnNldGMuczMiLAlmMCwgT3BYYlg2U2YgKDAsIDAsIDB4MDQsIDMpLCB7SU1NVTdhLCBJTU1VN2J9fSwKLSAgICB7ImZjbHJmLnMwIiwJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA1LCAwKX0sCi0gICAgeyJmY2xyZiIsCQlmMCwgT3BYYlg2U2YgKDAsIDAsIDB4MDUsIDApLCB7MH0sIFBTRVVET30sCi0gICAgeyJmY2xyZi5zMSIsCWYwLCBPcFhiWDZTZiAoMCwgMCwgMHgwNSwgMSl9LAotICAgIHsiZmNscmYuczIiLAlmMCwgT3BYYlg2U2YgKDAsIDAsIDB4MDUsIDIpfSwKLSAgICB7ImZjbHJmLnMzIiwJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA1LCAzKX0sCi0gICAgeyJmY2hrZi5zMCIsCWYwLCBPcFhiWDZTZiAoMCwgMCwgMHgwOCwgMCksIHtUR1QyNX19LAotICAgIHsiZmNoa2YiLAkJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA4LCAwKSwge1RHVDI1fSwgUFNFVURPfSwKLSAgICB7ImZjaGtmLnMxIiwJZjAsIE9wWGJYNlNmICgwLCAwLCAweDA4LCAxKSwge1RHVDI1fX0sCi0gICAgeyJmY2hrZi5zMiIsCWYwLCBPcFhiWDZTZiAoMCwgMCwgMHgwOCwgMiksIHtUR1QyNX19LAotICAgIHsiZmNoa2YuczMiLAlmMCwgT3BYYlg2U2YgKDAsIDAsIDB4MDgsIDMpLCB7VEdUMjV9fSwKLQotICAgIHsiYnJlYWsuZiIsCQlmMCwgT3BYYlg2ICgwLCAwLCAweDAwKSwge0lNTVUyMX19LAotICAgIHsibm9wLmYiLAkJZjAsIE9wWGJYNiAoMCwgMCwgMHgwMSksIHtJTU1VMjF9fSwKLQotICAgIHsiZnByY3BhLnMwIiwJZjIsIE9wWGJRU2YgKDEsIDEsIDAsIDApLCB7RjEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZwcmNwYSIsCQlmMiwgT3BYYlFTZiAoMSwgMSwgMCwgMCksIHtGMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcHJjcGEuczEiLAlmMiwgT3BYYlFTZiAoMSwgMSwgMCwgMSksIHtGMSwgUDIsIEYyLCBGM319LAotICAgIHsiZnByY3BhLnMyIiwJZjIsIE9wWGJRU2YgKDEsIDEsIDAsIDIpLCB7RjEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZwcmNwYS5zMyIsCWYyLCBPcFhiUVNmICgxLCAxLCAwLCAzKSwge0YxLCBQMiwgRjIsIEYzfX0sCi0KLSAgICB7ImZwcnNxcnRhLnMwIiwJZjIsIE9wWGJRU2YgKDEsIDEsIDEsIDApLCB7RjEsIFAyLCBGM319LAotICAgIHsiZnByc3FydGEiLAlmMiwgT3BYYlFTZiAoMSwgMSwgMSwgMCksIHtGMSwgUDIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwcnNxcnRhLnMxIiwJZjIsIE9wWGJRU2YgKDEsIDEsIDEsIDEpLCB7RjEsIFAyLCBGM319LAotICAgIHsiZnByc3FydGEuczIiLAlmMiwgT3BYYlFTZiAoMSwgMSwgMSwgMiksIHtGMSwgUDIsIEYzfX0sCi0gICAgeyJmcHJzcXJ0YS5zMyIsCWYyLCBPcFhiUVNmICgxLCAxLCAxLCAzKSwge0YxLCBQMiwgRjN9fSwKLQotICAgIHsiZnBtaW4uczAiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNCwgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcG1pbiIsCQlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNCwgMCksIHtGMSwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwbWluLnMxIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTQsIDEpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBtaW4uczIiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNCwgMiksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcG1pbi5zMyIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDE0LCAzKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwbWF4LnMwIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTUsIDApLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBtYXgiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTUsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcG1heC5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDE1LCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwbWF4LnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTUsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBtYXguczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNSwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtaW4uczAiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNiwgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtaW4iLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTYsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGFtaW4uczEiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNiwgMSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtaW4uczIiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNiwgMiksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtaW4uczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNiwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtYXguczAiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNywgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtYXgiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTcsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGFtYXguczEiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNywgMSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtYXguczIiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNywgMiksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGFtYXguczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxNywgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5lcS5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMwLCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmVxIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzAsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGNtcC5lcS5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMwLCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmVxLnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzAsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAuZXEuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzMCwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5sdC5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMxLCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmx0IiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzEsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGNtcC5sdC5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMxLCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmx0LnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzEsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubHQuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzMSwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5sZS5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMyLCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmxlIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzIsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGNtcC5sZS5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMyLCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLmxlLnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzIsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubGUuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzMiwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC51bm9yZC5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMzLCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLnVub3JkIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzMsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGNtcC51bm9yZC5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDMzLCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLnVub3JkLnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzMsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAudW5vcmQuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzMywgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5uZXEuczAiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNCwgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5uZXEiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNCwgMCksIHtGMSwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwY21wLm5lcS5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM0LCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm5lcS5zMiIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM0LCAyKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm5lcS5zMyIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM0LCAzKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm5sdC5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM1LCAwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm5sdCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM1LCAwKSwge0YxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZnBjbXAubmx0LnMxIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzUsIDEpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubmx0LnMyIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzUsIDIpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubmx0LnMzIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzUsIDMpLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubmxlLnMwIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzYsIDApLCB7RjEsIEYyLCBGM319LAotICAgIHsiZnBjbXAubmxlIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MzYsIDApLCB7RjEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmcGNtcC5ubGUuczEiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNiwgMSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5ubGUuczIiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNiwgMiksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5ubGUuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNiwgMyksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5vcmQuczAiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNywgMCksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcGNtcC5vcmQiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgzNywgMCksIHtGMSwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwY21wLm9yZC5zMSIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM3LCAxKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm9yZC5zMiIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM3LCAyKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwY21wLm9yZC5zMyIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDM3LCAzKSwge0YxLCBGMiwgRjN9fSwKLQotICAgIHsiZnBhYnMiLAkJZiwgT3BYYlg2RjIgKDEsIDAsIDB4MTAsIDApLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwbmVnIiwJCWYsIE9wWGJYNiAgICgxLCAwLCAweDExKSwge0YxLCBGM30sIFBTRVVETyB8IEYyX0VRX0YzfSwKLSAgICB7ImZwbmVnYWJzIiwJZiwgT3BYYlg2RjIgKDEsIDAsIDB4MTEsIDApLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZwbWVyZ2UucyIsCWYsIE9wWGJYNiAgICgxLCAwLCAweDEwKSwge0YxLCBGMiwgRjN9fSwKLSAgICB7ImZwbWVyZ2UubnMiLAlmLCBPcFhiWDYgICAoMSwgMCwgMHgxMSksIHtGMSwgRjIsIEYzfX0sCi0gICAgeyJmcG1lcmdlLnNlIiwJZiwgT3BYYlg2ICgxLCAwLCAweDEyKSwge0YxLCBGMiwgRjN9fSwKLQotICAgIHsiZnBjdnQuZnguczAiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTgsIDApLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meCIsCQlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxOCwgMCksIHtGMSwgRjJ9LCBQU0VVRE99LAotICAgIHsiZnBjdnQuZnguczEiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTgsIDEpLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meC5zMiIsCQlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxOCwgMiksIHtGMSwgRjJ9fSwKLSAgICB7ImZwY3Z0LmZ4LnMzIiwJCWYsIE9wWGJYNlNmICgxLCAwLCAweDE4LCAzKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZnh1LnMwIiwJCWYsIE9wWGJYNlNmICgxLCAwLCAweDE5LCAwKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZnh1IiwJCWYsIE9wWGJYNlNmICgxLCAwLCAweDE5LCAwKSwge0YxLCBGMn0sIFBTRVVET30sCi0gICAgeyJmcGN2dC5meHUuczEiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTksIDEpLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meHUuczIiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTksIDIpLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meHUuczMiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MTksIDMpLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meC50cnVuYy5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDFhLCAwKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZngudHJ1bmMiLAkJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MWEsIDApLCB7RjEsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZwY3Z0LmZ4LnRydW5jLnMxIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MWEsIDEpLCB7RjEsIEYyfX0sCi0gICAgeyJmcGN2dC5meC50cnVuYy5zMiIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDFhLCAyKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZngudHJ1bmMuczMiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxYSwgMyksIHtGMSwgRjJ9fSwKLSAgICB7ImZwY3Z0LmZ4dS50cnVuYy5zMCIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDFiLCAwKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZnh1LnRydW5jIiwJCWYsIE9wWGJYNlNmICgxLCAwLCAweDFiLCAwKSwge0YxLCBGMn0sIFBTRVVET30sCi0gICAgeyJmcGN2dC5meHUudHJ1bmMuczEiLAlmLCBPcFhiWDZTZiAoMSwgMCwgMHgxYiwgMSksIHtGMSwgRjJ9fSwKLSAgICB7ImZwY3Z0LmZ4dS50cnVuYy5zMiIsCWYsIE9wWGJYNlNmICgxLCAwLCAweDFiLCAyKSwge0YxLCBGMn19LAotICAgIHsiZnBjdnQuZnh1LnRydW5jLnMzIiwJZiwgT3BYYlg2U2YgKDEsIDAsIDB4MWIsIDMpLCB7RjEsIEYyfX0sCi0KLSAgICB7ImZjbXAuZXEuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAwLCAwKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmVxIiwJCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDAsIDApLCB7UDEsIFAyLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5lcS5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDAsIDEpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAuZXEuczIiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAwLCAyKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmVxLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMCwgMyksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sdC5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDApLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubHQiLAkJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMCksIHtQMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLmx0LnMxIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMSksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sdC5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDIpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubHQuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAzKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmxlLnMwIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMCwgMCksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sZSIsCQkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAwKSwge1AxLCBQMiwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZjbXAubGUuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAxKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmxlLnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMCwgMiksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sZS5zMyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDMpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAudW5vcmQuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAwLCAwKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLnVub3JkIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMCwgMCksIHtQMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLnVub3JkLnMxIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMCwgMSksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC51bm9yZC5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDAsIDIpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAudW5vcmQuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAwLCAzKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmVxLnVuYy5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDEsIDApLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAuZXEudW5jIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMSwgMCksIHtQMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLmVxLnVuYy5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDEsIDEpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAuZXEudW5jLnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMSwgMiksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5lcS51bmMuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAxLCAzKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmx0LnVuYy5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDApLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubHQudW5jIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMSwgMCksIHtQMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLmx0LnVuYy5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDEpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubHQudW5jLnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMSwgMiksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sdC51bmMuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAzKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLmxlLnVuYy5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDApLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubGUudW5jIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMCksIHtQMSwgUDIsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLmxlLnVuYy5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDEpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubGUudW5jLnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMiksIHtQMSwgUDIsIEYyLCBGM319LAotICAgIHsiZmNtcC5sZS51bmMuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAxLCAzKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLnVub3JkLnVuYy5zMCIsIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAxLCAwKSwge1AxLCBQMiwgRjIsIEYzfX0sCi0gICAgeyJmY21wLnVub3JkLnVuYyIsICAgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAxLCAwKSwge1AxLCBQMiwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZjbXAudW5vcmQudW5jLnMxIiwgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDEsIDEpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAudW5vcmQudW5jLnMyIiwgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDEsIDIpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAudW5vcmQudW5jLnMzIiwgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDEsIDMpLCB7UDEsIFAyLCBGMiwgRjN9fSwKLQotICAgIC8qIHBzZXVkby1vcHMgb2YgdGhlIGFib3ZlICovCi0gICAgeyJmY21wLmd0LnMwIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMCksIHtQMSwgUDIsIEYzLCBGMn19LAotICAgIHsiZmNtcC5ndCIsCQkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAwKSwge1AxLCBQMiwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZjbXAuZ3QuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAxKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmd0LnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMiksIHtQMSwgUDIsIEYzLCBGMn19LAotICAgIHsiZmNtcC5ndC5zMyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDMpLCB7UDEsIFAyLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAuZ2UuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAwKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmdlIiwJCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDApLCB7UDEsIFAyLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmNtcC5nZS5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDEpLCB7UDEsIFAyLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAuZ2UuczIiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAyKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmdlLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMCwgMyksIHtQMSwgUDIsIEYzLCBGMn19LAotICAgIHsiZmNtcC5uZXEuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAwLCAwKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5lcSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDAsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5uZXEuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAwLCAxKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5lcS5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDAsIDAsIDIpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmVxLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMCwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5ubHQuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAwKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sdCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5ubHQuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAxKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sdC5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDIpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmx0LnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5ubGUuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAwKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sZSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5ubGUuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAxKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sZS5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDIpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmxlLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMCwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5uZ3QuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAwKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5ndCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDApLCB7UDIsIFAxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmNtcC5uZ3QuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAwLCAxKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5ndC5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDAsIDIpLCB7UDIsIFAxLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAubmd0LnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMCwgMyksIHtQMiwgUDEsIEYzLCBGMn19LAotICAgIHsiZmNtcC5uZ2UuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAwKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5nZSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDApLCB7UDIsIFAxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmNtcC5uZ2UuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAwLCAxKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5nZS5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDAsIDIpLCB7UDIsIFAxLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAubmdlLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMCwgMyksIHtQMiwgUDEsIEYzLCBGMn19LAotICAgIHsiZmNtcC5vcmQuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAwLCAwKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm9yZCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDAsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5vcmQuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAxLCAwLCAxKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm9yZC5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDAsIDIpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAub3JkLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMCwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5ndC51bmMuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAwKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmd0LnVuYyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDApLCB7UDEsIFAyLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmNtcC5ndC51bmMuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAxKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmd0LnVuYy5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDIpLCB7UDEsIFAyLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAuZ3QudW5jLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMSwgMyksIHtQMSwgUDIsIEYzLCBGMn19LAotICAgIHsiZmNtcC5nZS51bmMuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAxLCAwKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmdlLnVuYyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDApLCB7UDEsIFAyLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmNtcC5nZS51bmMuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAxLCAxKSwge1AxLCBQMiwgRjMsIEYyfX0sCi0gICAgeyJmY21wLmdlLnVuYy5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDIpLCB7UDEsIFAyLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAuZ2UudW5jLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMyksIHtQMSwgUDIsIEYzLCBGMn19LAotICAgIHsiZmNtcC5uZXEudW5jLnMwIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMSwgMCksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5uZXEudW5jIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMCwgMSwgMCksIHtQMiwgUDEsIEYyLCBGM30sIFBTRVVET30sCi0gICAgeyJmY21wLm5lcS51bmMuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAxLCAxKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5lcS51bmMuczIiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAxLCAyKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5lcS51bmMuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAwLCAxLCAzKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sdC51bmMuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAwKSwge1AyLCBQMSwgRjIsIEYzfX0sCi0gICAgeyJmY21wLm5sdC51bmMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAwKSwge1AyLCBQMSwgRjIsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZjbXAubmx0LnVuYy5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDEpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmx0LnVuYy5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDIpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmx0LnVuYy5zMyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDAsIDEsIDEsIDMpLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmxlLnVuYy5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDApLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAubmxlLnVuYyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5ubGUudW5jLnMxIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMSksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5ubGUudW5jLnMyIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMiksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5ubGUudW5jLnMzIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMCwgMSwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5uZ3QudW5jLnMwIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMSwgMCksIHtQMiwgUDEsIEYzLCBGMn19LAotICAgIHsiZmNtcC5uZ3QudW5jIiwJICBmMiwgT3BSYVJiVGFTZiAoNCwgMCwgMSwgMSwgMCksIHtQMiwgUDEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmY21wLm5ndC51bmMuczEiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAxKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5ndC51bmMuczIiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAyKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5ndC51bmMuczMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAwLCAxLCAxLCAzKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5nZS51bmMuczAiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAxLCAwKSwge1AyLCBQMSwgRjMsIEYyfX0sCi0gICAgeyJmY21wLm5nZS51bmMiLAkgIGYyLCBPcFJhUmJUYVNmICg0LCAxLCAwLCAxLCAwKSwge1AyLCBQMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZjbXAubmdlLnVuYy5zMSIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDEpLCB7UDIsIFAxLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAubmdlLnVuYy5zMiIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDIpLCB7UDIsIFAxLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAubmdlLnVuYy5zMyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDAsIDEsIDMpLCB7UDIsIFAxLCBGMywgRjJ9fSwKLSAgICB7ImZjbXAub3JkLnVuYy5zMCIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDEsIDApLCB7UDIsIFAxLCBGMiwgRjN9fSwKLSAgICB7ImZjbXAub3JkLnVuYyIsCSAgZjIsIE9wUmFSYlRhU2YgKDQsIDEsIDEsIDEsIDApLCB7UDIsIFAxLCBGMiwgRjN9LCBQU0VVRE99LAotICAgIHsiZmNtcC5vcmQudW5jLnMxIiwgICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMSwgMSksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5vcmQudW5jLnMyIiwgICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMSwgMiksIHtQMiwgUDEsIEYyLCBGM319LAotICAgIHsiZmNtcC5vcmQudW5jLnMzIiwgICBmMiwgT3BSYVJiVGFTZiAoNCwgMSwgMSwgMSwgMyksIHtQMiwgUDEsIEYyLCBGM319LAotCi0gICAgeyJmY2xhc3MubSIsCWYyLCBPcFRhICg1LCAwKSwge1AxLCBQMiwgRjIsIElNTVU5fX0sCi0gICAgeyJmY2xhc3Mubm0iLAlmMiwgT3BUYSAoNSwgMCksIHtQMiwgUDEsIEYyLCBJTU1VOX0sIFBTRVVET30sCi0gICAgeyJmY2xhc3MubS51bmMiLAlmMiwgT3BUYSAoNSwgMSksIHtQMSwgUDIsIEYyLCBJTU1VOX19LAotICAgIHsiZmNsYXNzLm5tLnVuYyIsCWYyLCBPcFRhICg1LCAxKSwge1AyLCBQMSwgRjIsIElNTVU5fSwgUFNFVURPfSwKLQotICAgIC8qIG5vdGU6IGZub3JtIGFuZCBmY3Z0Lnh1ZiBoYXZlIGlkZW50aWNhbCBlbmNvZGluZ3MhICovCi0gICAgeyJmbm9ybS5zMCIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMCwgMCwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZm5vcm0iLAkJZiwgT3BYYVNmRjJGNCAoMHg4LCAwLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5zMSIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMCwgMSwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZm5vcm0uczIiLAlmLCBPcFhhU2ZGMkY0ICgweDgsIDAsIDIsIDAsIDEpLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZub3JtLnMzIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAwLCAzLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5zLnMwIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5zIiwJCWYsIE9wWGFTZkYyRjQgKDB4OCwgMSwgMCwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZm5vcm0ucy5zMSIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMSwgMSwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZm5vcm0ucy5zMiIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMSwgMiwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZm5vcm0ucy5zMyIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMSwgMywgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZmN2dC54dWYuczAiLAlmLCBPcFhhU2ZGMkY0ICgweDgsIDAsIDAsIDAsIDEpLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZjdnQueHVmIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAwLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zMSIsCWYsIE9wWGFTZkYyRjQgKDB4OCwgMCwgMSwgMCwgMSksIHtGMSwgRjN9LCBQU0VVRE99LAotICAgIHsiZmN2dC54dWYuczIiLAlmLCBPcFhhU2ZGMkY0ICgweDgsIDAsIDIsIDAsIDEpLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZjdnQueHVmLnMzIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAwLCAzLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zLnMwIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zLnMxIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAxLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zLnMyIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAyLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5zLnMzIiwJZiwgT3BYYVNmRjJGNCAoMHg4LCAxLCAzLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmYWRkLnMwIiwJCWYsIE9wWGFTZkY0ICgweDgsIDAsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkIiwJCWYsIE9wWGFTZkY0ICgweDgsIDAsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLnMxIiwJCWYsIE9wWGFTZkY0ICgweDgsIDAsIDEsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLnMyIiwJCWYsIE9wWGFTZkY0ICgweDgsIDAsIDIsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLnMzIiwJCWYsIE9wWGFTZkY0ICgweDgsIDAsIDMsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLnMuczAiLAlmLCBPcFhhU2ZGNCAoMHg4LCAxLCAwLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmFkZC5zIiwJCWYsIE9wWGFTZkY0ICgweDgsIDEsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLnMuczEiLAlmLCBPcFhhU2ZGNCAoMHg4LCAxLCAxLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmFkZC5zLnMyIiwJZiwgT3BYYVNmRjQgKDB4OCwgMSwgMiwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZhZGQucy5zMyIsCWYsIE9wWGFTZkY0ICgweDgsIDEsIDMsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMwIiwJCWYsIE9wWGFTZkYyICgweDgsIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5IiwJCWYsIE9wWGFTZkYyICgweDgsIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMxIiwJCWYsIE9wWGFTZkYyICgweDgsIDAsIDEsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMyIiwJCWYsIE9wWGFTZkYyICgweDgsIDAsIDIsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMzIiwJCWYsIE9wWGFTZkYyICgweDgsIDAsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMuczAiLAlmLCBPcFhhU2ZGMiAoMHg4LCAxLCAwLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm1weS5zIiwJCWYsIE9wWGFTZkYyICgweDgsIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LnMuczEiLAlmLCBPcFhhU2ZGMiAoMHg4LCAxLCAxLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm1weS5zLnMyIiwJZiwgT3BYYVNmRjIgKDB4OCwgMSwgMiwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZtcHkucy5zMyIsCWYsIE9wWGFTZkYyICgweDgsIDEsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbWEuczAiLAkJZiwgT3BYYVNmICgweDgsIDAsIDApLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZtYSIsCQlmLCBPcFhhU2YgKDB4OCwgMCwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmbWEuczEiLAkJZiwgT3BYYVNmICgweDgsIDAsIDEpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZtYS5zMiIsCQlmLCBPcFhhU2YgKDB4OCwgMCwgMiksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm1hLnMzIiwJCWYsIE9wWGFTZiAoMHg4LCAwLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEucy5zMCIsCWYsIE9wWGFTZiAoMHg4LCAxLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEucyIsCQlmLCBPcFhhU2YgKDB4OCwgMSwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmbWEucy5zMSIsCWYsIE9wWGFTZiAoMHg4LCAxLCAxKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEucy5zMiIsCWYsIE9wWGFTZiAoMHg4LCAxLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEucy5zMyIsCWYsIE9wWGFTZiAoMHg4LCAxLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0KLSAgICB7ImZub3JtLmQuczAiLAlmLCBPcFhhU2ZGMkY0ICgweDksIDAsIDAsIDAsIDEpLCB7RjEsIEYzfSwgUFNFVURPfSwKLSAgICB7ImZub3JtLmQiLAkJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5kLnMxIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAxLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5kLnMyIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAyLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmbm9ybS5kLnMzIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAzLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5kLnMwIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5kIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAwLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5kLnMxIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAxLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5kLnMyIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAyLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmY3Z0Lnh1Zi5kLnMzIiwJZiwgT3BYYVNmRjJGNCAoMHg5LCAwLCAzLCAwLCAxKSwge0YxLCBGM30sIFBTRVVET30sCi0gICAgeyJmYWRkLmQuczAiLAlmLCBPcFhhU2ZGNCAoMHg5LCAwLCAwLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmFkZC5kIiwJCWYsIE9wWGFTZkY0ICgweDksIDAsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmYWRkLmQuczEiLAlmLCBPcFhhU2ZGNCAoMHg5LCAwLCAxLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZmFkZC5kLnMyIiwJZiwgT3BYYVNmRjQgKDB4OSwgMCwgMiwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZhZGQuZC5zMyIsCWYsIE9wWGFTZkY0ICgweDksIDAsIDMsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmbXB5LmQuczAiLAlmLCBPcFhhU2ZGMiAoMHg5LCAwLCAwLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm1weS5kIiwJCWYsIE9wWGFTZkYyICgweDksIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbXB5LmQuczEiLAlmLCBPcFhhU2ZGMiAoMHg5LCAwLCAxLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm1weS5kLnMyIiwJZiwgT3BYYVNmRjIgKDB4OSwgMCwgMiwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZtcHkuZC5zMyIsCWYsIE9wWGFTZkYyICgweDksIDAsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbWEuZC5zMCIsCWYsIE9wWGFTZiAoMHg5LCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEuZCIsCQlmLCBPcFhhU2YgKDB4OSwgMCwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmbWEuZC5zMSIsCWYsIE9wWGFTZiAoMHg5LCAwLCAxKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEuZC5zMiIsCWYsIE9wWGFTZiAoMHg5LCAwLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbWEuZC5zMyIsCWYsIE9wWGFTZiAoMHg5LCAwLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0KLSAgICB7ImZwbXB5LnMwIiwJZiwgT3BYYVNmRjIgKDB4OSwgMSwgMCwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZwbXB5IiwJCWYsIE9wWGFTZkYyICgweDksIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmcG1weS5zMSIsCWYsIE9wWGFTZkYyICgweDksIDEsIDEsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmcG1weS5zMiIsCWYsIE9wWGFTZkYyICgweDksIDEsIDIsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmcG1weS5zMyIsCWYsIE9wWGFTZkYyICgweDksIDEsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmcG1hLnMwIiwJCWYsIE9wWGFTZiAgICgweDksIDEsIDApLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZwbWEiLAkJZiwgT3BYYVNmICAgKDB4OSwgMSwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmcG1hLnMxIiwJCWYsIE9wWGFTZiAgICgweDksIDEsIDEpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZwbWEuczIiLAkJZiwgT3BYYVNmICAgKDB4OSwgMSwgMiksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZnBtYS5zMyIsCQlmLCBPcFhhU2YgICAoMHg5LCAxLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0KLSAgICB7ImZzdWIuczAiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMCwgMCwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMCwgMCwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIuczEiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMCwgMSwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIuczIiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMCwgMiwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIuczMiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMCwgMywgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIucy5zMCIsCWYsIE9wWGFTZkY0ICgweGEsIDEsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmc3ViLnMiLAkJZiwgT3BYYVNmRjQgKDB4YSwgMSwgMCwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIucy5zMSIsCWYsIE9wWGFTZkY0ICgweGEsIDEsIDEsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmc3ViLnMuczIiLAlmLCBPcFhhU2ZGNCAoMHhhLCAxLCAyLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZnN1Yi5zLnMzIiwJZiwgT3BYYVNmRjQgKDB4YSwgMSwgMywgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZtcy5zMCIsCQlmLCBPcFhhU2YgICAoMHhhLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbXMiLAkJZiwgT3BYYVNmICAgKDB4YSwgMCwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmbXMuczEiLAkJZiwgT3BYYVNmICAgKDB4YSwgMCwgMSksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm1zLnMyIiwJCWYsIE9wWGFTZiAgICgweGEsIDAsIDIpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZtcy5zMyIsCQlmLCBPcFhhU2YgICAoMHhhLCAwLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbXMucy5zMCIsCWYsIE9wWGFTZiAgICgweGEsIDEsIDApLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZtcy5zIiwJCWYsIE9wWGFTZiAgICgweGEsIDEsIDApLCB7RjEsIEYzLCBGNCwgRjJ9LCBQU0VVRE99LAotICAgIHsiZm1zLnMuczEiLAlmLCBPcFhhU2YgICAoMHhhLCAxLCAxKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbXMucy5zMiIsCWYsIE9wWGFTZiAgICgweGEsIDEsIDIpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZtcy5zLnMzIiwJZiwgT3BYYVNmICAgKDB4YSwgMSwgMyksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZnN1Yi5kLnMwIiwJZiwgT3BYYVNmRjQgKDB4YiwgMCwgMCwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIuZCIsCQlmLCBPcFhhU2ZGNCAoMHhiLCAwLCAwLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZnN1Yi5kLnMxIiwJZiwgT3BYYVNmRjQgKDB4YiwgMCwgMSwgMSksIHtGMSwgRjMsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZzdWIuZC5zMiIsCWYsIE9wWGFTZkY0ICgweGIsIDAsIDIsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmc3ViLmQuczMiLAlmLCBPcFhhU2ZGNCAoMHhiLCAwLCAzLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZm1zLmQuczAiLAlmLCBPcFhhU2YgICAoMHhiLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbXMuZCIsCQlmLCBPcFhhU2YgICAoMHhiLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZtcy5kLnMxIiwJZiwgT3BYYVNmICAgKDB4YiwgMCwgMSksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm1zLmQuczIiLAlmLCBPcFhhU2YgICAoMHhiLCAwLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbXMuZC5zMyIsCWYsIE9wWGFTZiAgICgweGIsIDAsIDMpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLQotICAgIHsiZnBtcy5zMCIsCQlmLCBPcFhhU2YgKDB4YiwgMSwgMCksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZnBtcyIsCQlmLCBPcFhhU2YgKDB4YiwgMSwgMCksIHtGMSwgRjMsIEY0LCBGMn0sIFBTRVVET30sCi0gICAgeyJmcG1zLnMxIiwJCWYsIE9wWGFTZiAoMHhiLCAxLCAxKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmcG1zLnMyIiwJCWYsIE9wWGFTZiAoMHhiLCAxLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmcG1zLnMzIiwJCWYsIE9wWGFTZiAoMHhiLCAxLCAzKSwge0YxLCBGMywgRjQsIEYyfX0sCi0KLSAgICB7ImZwc3ViLnMwIiwgICAgICAgIGYsIE9wWGFTZkY0ICgweGIsIDEsIDAsIDEpLCB7RjEsIEYzLCBGMn0sIFBTRVVET30sCi0gICAgeyJmcHN1YiIsCQlmLCBPcFhhU2ZGNCAoMHhiLCAxLCAwLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZnBzdWIuczEiLAlmLCBPcFhhU2ZGNCAoMHhiLCAxLCAxLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZnBzdWIuczIiLAlmLCBPcFhhU2ZGNCAoMHhiLCAxLCAyLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotICAgIHsiZnBzdWIuczMiLAlmLCBPcFhhU2ZGNCAoMHhiLCAxLCAzLCAxKSwge0YxLCBGMywgRjJ9LCBQU0VVRE99LAotCi0gICAgeyJmbm1weS5zMCIsCWYsIE9wWGFTZkYyICgweGMsIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1weSIsCQlmLCBPcFhhU2ZGMiAoMHhjLCAwLCAwLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkuczEiLAlmLCBPcFhhU2ZGMiAoMHhjLCAwLCAxLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkuczIiLAlmLCBPcFhhU2ZGMiAoMHhjLCAwLCAyLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkuczMiLAlmLCBPcFhhU2ZGMiAoMHhjLCAwLCAzLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkucy5zMCIsCWYsIE9wWGFTZkYyICgweGMsIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1weS5zIiwJCWYsIE9wWGFTZkYyICgweGMsIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1weS5zLnMxIiwJZiwgT3BYYVNmRjIgKDB4YywgMSwgMSwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZubXB5LnMuczIiLAlmLCBPcFhhU2ZGMiAoMHhjLCAxLCAyLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkucy5zMyIsCWYsIE9wWGFTZkYyICgweGMsIDEsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1hLnMwIiwJCWYsIE9wWGFTZiAoMHhjLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbm1hIiwJCWYsIE9wWGFTZiAoMHhjLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZubWEuczEiLAkJZiwgT3BYYVNmICgweGMsIDAsIDEpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZubWEuczIiLAkJZiwgT3BYYVNmICgweGMsIDAsIDIpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZubWEuczMiLAkJZiwgT3BYYVNmICgweGMsIDAsIDMpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZubWEucy5zMCIsCWYsIE9wWGFTZiAoMHhjLCAxLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbm1hLnMiLAkJZiwgT3BYYVNmICgweGMsIDEsIDApLCB7RjEsIEYzLCBGNCwgRjJ9LCBQU0VVRE99LAotICAgIHsiZm5tYS5zLnMxIiwJZiwgT3BYYVNmICgweGMsIDEsIDEpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7ImZubWEucy5zMiIsCWYsIE9wWGFTZiAoMHhjLCAxLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbm1hLnMuczMiLAlmLCBPcFhhU2YgKDB4YywgMSwgMyksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm5tcHkuZC5zMCIsCWYsIE9wWGFTZkYyICgweGQsIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1weS5kIiwJCWYsIE9wWGFTZkYyICgweGQsIDAsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1weS5kLnMxIiwJZiwgT3BYYVNmRjIgKDB4ZCwgMCwgMSwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZubXB5LmQuczIiLAlmLCBPcFhhU2ZGMiAoMHhkLCAwLCAyLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZm5tcHkuZC5zMyIsCWYsIE9wWGFTZkYyICgweGQsIDAsIDMsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmbm1hLmQuczAiLAlmLCBPcFhhU2YgKDB4ZCwgMCwgMCksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm5tYS5kIiwJCWYsIE9wWGFTZiAoMHhkLCAwLCAwKSwge0YxLCBGMywgRjQsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZubWEuZC5zMSIsCWYsIE9wWGFTZiAoMHhkLCAwLCAxKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmbm1hLmQuczIiLAlmLCBPcFhhU2YgKDB4ZCwgMCwgMiksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZm5tYS5kLnMzIiwJZiwgT3BYYVNmICgweGQsIDAsIDMpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLQotICAgIHsiZnBubXB5LnMwIiwJZiwgT3BYYVNmRjIgKDB4ZCwgMSwgMCwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZwbm1weSIsCQlmLCBPcFhhU2ZGMiAoMHhkLCAxLCAwLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZnBubXB5LnMxIiwJZiwgT3BYYVNmRjIgKDB4ZCwgMSwgMSwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7ImZwbm1weS5zMiIsCWYsIE9wWGFTZkYyICgweGQsIDEsIDIsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJmcG5tcHkuczMiLAlmLCBPcFhhU2ZGMiAoMHhkLCAxLCAzLCAwKSwge0YxLCBGMywgRjR9LCBQU0VVRE99LAotICAgIHsiZnBubWEuczAiLAlmLCBPcFhhU2YgICAoMHhkLCAxLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmcG5tYSIsCQlmLCBPcFhhU2YgICAoMHhkLCAxLCAwKSwge0YxLCBGMywgRjQsIEYyfSwgUFNFVURPfSwKLSAgICB7ImZwbm1hLnMxIiwJZiwgT3BYYVNmICAgKDB4ZCwgMSwgMSksIHtGMSwgRjMsIEY0LCBGMn19LAotICAgIHsiZnBubWEuczIiLAlmLCBPcFhhU2YgICAoMHhkLCAxLCAyKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJmcG5tYS5zMyIsCWYsIE9wWGFTZiAgICgweGQsIDEsIDMpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLQotICAgIHsieG1weS5sIiwJCWYsIE9wWGFYMkYyICgweGUsIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJ4bXB5Lmx1IiwJCWYsIE9wWGFYMkYyICgweGUsIDEsIDAsIDApLCB7RjEsIEYzLCBGNH0sIFBTRVVET30sCi0gICAgeyJ4bXB5LmgiLAkJZiwgT3BYYVgyRjIgKDB4ZSwgMSwgMywgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7InhtcHkuaHUiLAkJZiwgT3BYYVgyRjIgKDB4ZSwgMSwgMiwgMCksIHtGMSwgRjMsIEY0fSwgUFNFVURPfSwKLSAgICB7InhtYS5sIiwJCWYsIE9wWGFYMiAoMHhlLCAxLCAwKSwge0YxLCBGMywgRjQsIEYyfX0sCi0gICAgeyJ4bWEubHUiLAkJZiwgT3BYYVgyICgweGUsIDEsIDApLCB7RjEsIEYzLCBGNCwgRjJ9LCBQU0VVRE99LAotICAgIHsieG1hLmgiLAkJZiwgT3BYYVgyICgweGUsIDEsIDMpLCB7RjEsIEYzLCBGNCwgRjJ9fSwKLSAgICB7InhtYS5odSIsCQlmLCBPcFhhWDIgKDB4ZSwgMSwgMiksIHtGMSwgRjMsIEY0LCBGMn19LAotCi0gICAgeyJmc2VsZWN0IiwJCWYsIE9wWGEgKDB4ZSwgMCksIHtGMSwgRjMsIEY0LCBGMn19LAotCi0gICAgezB9Ci0gIH07Ci0KLSN1bmRlZiBmMAotI3VuZGVmIGYKLSN1bmRlZiBmMgotI3VuZGVmIGJGMgotI3VuZGVmIGJGNAotI3VuZGVmIGJRCi0jdW5kZWYgYlJhCi0jdW5kZWYgYlJiCi0jdW5kZWYgYlNmCi0jdW5kZWYgYlRhCi0jdW5kZWYgYlhhCi0jdW5kZWYgYlhiCi0jdW5kZWYgYlgyCi0jdW5kZWYgYlg2Ci0jdW5kZWYgbUYyCi0jdW5kZWYgbUY0Ci0jdW5kZWYgbVEKLSN1bmRlZiBtUmEKLSN1bmRlZiBtUmIKLSN1bmRlZiBtU2YKLSN1bmRlZiBtVGEKLSN1bmRlZiBtWGEKLSN1bmRlZiBtWGIKLSN1bmRlZiBtWDIKLSN1bmRlZiBtWDYKLSN1bmRlZiBPcFhhCi0jdW5kZWYgT3BYYVNmCi0jdW5kZWYgT3BYYVNmRjIKLSN1bmRlZiBPcFhhU2ZGNAotI3VuZGVmIE9wWGFTZkYyRjQKLSN1bmRlZiBPcFhhWDIKLSN1bmRlZiBPcFJhUmJUYVNmCi0jdW5kZWYgT3BUYQotI3VuZGVmIE9wWGJRU2YKLSN1bmRlZiBPcFhiWDYKLSN1bmRlZiBPcFhiWDZGMgotI3VuZGVmIE9wWGJYNlNmCmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtb3BjLWkuYyBiL29wY29kZXMvaWE2NC1vcGMtaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODcxOTIwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1vcGMtaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qIGlhNjQtb3BjLWkuYyAtLSBJQS02NCBgSScgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImlhNjQtb3BjLmgiCi0KLSNkZWZpbmUgSTAJSUE2NF9UWVBFX0ksIDAKLSNkZWZpbmUgSQlJQTY0X1RZUEVfSSwgMQotI2RlZmluZSBJMglJQTY0X1RZUEVfSSwgMgotCi0vKiBpbnN0cnVjdGlvbiBiaXQgZmllbGRzOiAqLwotI2RlZmluZSBiQyh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMTIpCi0jZGVmaW5lIGJJaCh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMjMpCi0jZGVmaW5lIGJUYSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgxKSkgPDwgMzMpCi0jZGVmaW5lIGJUYWcxMyh4KQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzMykKLSNkZWZpbmUgYlRiKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzNikKLSNkZWZpbmUgYlZjKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAyMCkKLSNkZWZpbmUgYlZlKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzMikKLSNkZWZpbmUgYldoKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDMpKSA8PCAyMCkKLSNkZWZpbmUgYlgoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDMzKQotI2RlZmluZSBiWGIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDIyKQotI2RlZmluZSBiWDIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MykpIDw8IDM0KQotI2RlZmluZSBiWDJhKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDMpKSA8PCAzNCkKLSNkZWZpbmUgYlgyYih4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMjgpCi0jZGVmaW5lIGJYMmMoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MykpIDw8IDMwKQotI2RlZmluZSBiWDMoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4NykpIDw8IDMzKQotI2RlZmluZSBiWDYoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4M2YpKSA8PCAyNykKLSNkZWZpbmUgYllhKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAxMykKLSNkZWZpbmUgYlliKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAyNikKLSNkZWZpbmUgYlphKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzNikKLSNkZWZpbmUgYlpiKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzMykKLQotLyogaW5zdHJ1Y3Rpb24gYml0IG1hc2tzOiAqLwotI2RlZmluZSBtQwliQyAoLTEpCi0jZGVmaW5lIG1JaAliSWggKC0xKQotI2RlZmluZSBtVGEJYlRhICgtMSkKLSNkZWZpbmUgbVRhZzEzCWJUYWcxMyAoLTEpCi0jZGVmaW5lIG1UYgliVGIgKC0xKQotI2RlZmluZSBtVmMJYlZjICgtMSkKLSNkZWZpbmUgbVZlCWJWZSAoLTEpCi0jZGVmaW5lIG1XaAliV2ggKC0xKQotI2RlZmluZSBtWAliWCAoLTEpCi0jZGVmaW5lIG1YYgliWGIgKC0xKQotI2RlZmluZSBtWDIJYlgyICgtMSkKLSNkZWZpbmUgbVgyYQliWDJhICgtMSkKLSNkZWZpbmUgbVgyYgliWDJiICgtMSkKLSNkZWZpbmUgbVgyYwliWDJjICgtMSkKLSNkZWZpbmUgbVgzCWJYMyAoLTEpCi0jZGVmaW5lIG1YNgliWDYgKC0xKQotI2RlZmluZSBtWWEJYllhICgtMSkKLSNkZWZpbmUgbVliCWJZYiAoLTEpCi0jZGVmaW5lIG1aYQliWmEgKC0xKQotI2RlZmluZSBtWmIJYlpiICgtMSkKLQotI2RlZmluZSBPcFphWmJWZVgyYVgyYihhLGIsYyxkLGUsZikgXAotCShiT3AgKGEpIHwgYlphIChiKSB8IGJaYiAoYykgfCBiVmUgKGQpIHwgYlgyYSAoZSkgfCBiWDJiIChmKSksIFwKLQkobU9wIHwgbVphIHwgbVpiIHwgbVZlIHwgbVgyYSB8IG1YMmIpCi0jZGVmaW5lIE9wWmFaYlZlWDJhWDJiWDJjKGEsYixjLGQsZSxmLGcpIFwKLSAgKGJPcCAoYSkgfCBiWmEgKGIpIHwgYlpiIChjKSB8IGJWZSAoZCkgfCBiWDJhIChlKSB8IGJYMmIgKGYpIHwgYlgyYyAoZykpLCBcCi0JKG1PcCB8IG1aYSB8IG1aYiB8IG1WZSB8IG1YMmEgfCBtWDJiIHwgbVgyYykKLSNkZWZpbmUgT3BYMlgoYSxiLGMpCQkoYk9wIChhKSB8IGJYMiAoYikgfCBiWCAoYykpLCAobU9wIHwgbVgyIHwgbVgpCi0jZGVmaW5lIE9wWDJYWWEoYSxiLGMsZCkJKGJPcCAoYSkgfCBiWDIgKGIpIHwgYlggKGMpIHwgYllhIChkKSksIFwKLQkJCQkobU9wIHwgbVgyIHwgbVggfCBtWWEpCi0jZGVmaW5lIE9wWDJYWWIoYSxiLGMsZCkJKGJPcCAoYSkgfCBiWDIgKGIpIHwgYlggKGMpIHwgYlliIChkKSksIFwKLQkJCQkobU9wIHwgbVgyIHwgbVggfCBtWWIpCi0jZGVmaW5lIE9wWDJUYVRiWWFDKGEsYixjLGQsZSxmKSBcCi0JKGJPcCAoYSkgfCBiWDIgKGIpIHwgYlRhIChjKSB8IGJUYiAoZCkgfCBiWWEgKGUpIHwgYkMgKGYpKSwgXAotCShtT3AgfCBtWDIgfCBtVGEgfCBtVGIgfCBtWWEgfCBtQykKLSNkZWZpbmUgT3BYMyhhLGIpCQkoYk9wIChhKSB8IGJYMyAoYikpLCAobU9wIHwgbVgzKQotI2RlZmluZSBPcFgzWDYoYSxiLGMpCQkoYk9wIChhKSB8IGJYMyAoYikgfCBiWDYoYykpLCBcCi0JCQkJKG1PcCB8IG1YMyB8IG1YNikKLSNkZWZpbmUgT3BYM1hiSWhXaChhLGIsYyxkLGUpIFwKLSAgKGJPcCAoYSkgfCBiWDMgKGIpIHwgYlhiIChjKSB8IGJJaCAoZCkgfCBiV2ggKGUpKSwgXAotICAobU9wIHwgbVgzIHwgbVhiIHwgbUloIHwgbVdoKQotI2RlZmluZSBPcFgzWGJJaFdoVGFnMTMoYSxiLGMsZCxlLGYpIFwKLSAgICAgKGJPcCAoYSkgfCBiWDMgKGIpIHwgYlhiIChjKSB8IGJJaCAoZCkgfCBiV2ggKGUpIHwgYlRhZzEzIChmKSksIFwKLSAgICAgKG1PcCB8IG1YMyB8IG1YYiB8IG1JaCB8IG1XaCB8IG1UYWcxMykKLQotc3RydWN0IGlhNjRfb3Bjb2RlIGlhNjRfb3Bjb2Rlc19pW10gPQotICB7Ci0gICAgLyogSS10eXBlIGluc3RydWN0aW9uIGVuY29kaW5ncyAoc29ydGVkIGFjY29yZGluZyB0byBtYWpvciBvcGNvZGUpICovCi0KLSAgICB7ImJyZWFrLmkiLAlJMCwgT3BYM1g2ICgwLCAwLCAweDAwKSwge0lNTVUyMX0sIFhfSU5fTUxYfSwKLSAgICB7Im5vcC5pIiwJSTAsIE9wWDNYNiAoMCwgMCwgMHgwMSksIHtJTU1VMjF9LCBYX0lOX01MWH0sCi0gICAgeyJjaGsucy5pIiwJSTAsIE9wWDMgKDAsIDEpLCB7UjIsIFRHVDI1Yn19LAotCi0gICAgeyJtb3YiLCBJLCBPcFgzWGJJaFdoVGFnMTMgKDAsIDcsIDAsIDAsIDEsIDApLCB7QjEsIFIyfSwgUFNFVURPfSwKLSNkZWZpbmUgTU9WKGEsYixjLGQpIFwKLSAgICBJLCBPcFgzWGJJaFdoICgwLCBhLCBiLCBjLCBkKSwge0IxLCBSMiwgVEFHMTNifQotICAgIHsibW92LnNwdGsiLAkJTU9WICg3LCAwLCAwLCAwKX0sCi0gICAgeyJtb3Yuc3B0ay5pbXAiLAkJTU9WICg3LCAwLCAxLCAwKX0sCi0gICAgeyJtb3YiLAkJCU1PViAoNywgMCwgMCwgMSl9LAotICAgIHsibW92LmltcCIsCQkJTU9WICg3LCAwLCAxLCAxKX0sCi0gICAgeyJtb3YuZHB0ayIsCQlNT1YgKDcsIDAsIDAsIDIpfSwKLSAgICB7Im1vdi5kcHRrLmltcCIsCQlNT1YgKDcsIDAsIDEsIDIpfSwKLSAgICB7Im1vdi5yZXQuc3B0ayIsCQlNT1YgKDcsIDEsIDAsIDApfSwKLSAgICB7Im1vdi5yZXQuc3B0ay5pbXAiLAlNT1YgKDcsIDEsIDEsIDApfSwKLSAgICB7Im1vdi5yZXQiLAkJCU1PViAoNywgMSwgMCwgMSl9LAotICAgIHsibW92LnJldC5pbXAiLAkJTU9WICg3LCAxLCAxLCAxKX0sCi0gICAgeyJtb3YucmV0LmRwdGsiLAkJTU9WICg3LCAxLCAwLCAyKX0sCi0gICAgeyJtb3YucmV0LmRwdGsuaW1wIiwJTU9WICg3LCAxLCAxLCAyKX0sCi0jdW5kZWYgTU9WCi0gICAgeyJtb3YiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MzEpLCB7UjEsIEIyfX0sCi0gICAgeyJtb3YiLAlJLCBPcFgzICgwLCAzKSwge1BSLCBSMiwgSU1NMTd9fSwKLSAgICB7Im1vdiIsCUksIE9wWDMgKDAsIDIpLCB7UFJfUk9ULCBJTU00NH19LAotICAgIHsibW92IiwJSSwgT3BYM1g2ICgwLCAwLCAweDMwKSwge1IxLCBJUH19LAotICAgIHsibW92IiwJSSwgT3BYM1g2ICgwLCAwLCAweDMzKSwge1IxLCBQUn19LAotICAgIHsibW92LmkiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MmEpLCB7QVIzLCBSMn19LAotICAgIHsibW92LmkiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MGEpLCB7QVIzLCBJTU04fX0sCi0gICAgeyJtb3YuaSIsCUksIE9wWDNYNiAoMCwgMCwgMHgzMiksIHtSMSwgQVIzfX0sCi0gICAgeyJ6eHQxIiwJSSwgT3BYM1g2ICgwLCAwLCAweDEwKSwge1IxLCBSM319LAotICAgIHsienh0MiIsCUksIE9wWDNYNiAoMCwgMCwgMHgxMSksIHtSMSwgUjN9fSwKLSAgICB7Inp4dDQiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MTIpLCB7UjEsIFIzfX0sCi0gICAgeyJzeHQxIiwJSSwgT3BYM1g2ICgwLCAwLCAweDE0KSwge1IxLCBSM319LAotICAgIHsic3h0MiIsCUksIE9wWDNYNiAoMCwgMCwgMHgxNSksIHtSMSwgUjN9fSwKLSAgICB7InN4dDQiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MTYpLCB7UjEsIFIzfX0sCi0gICAgeyJjengxLmwiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MTgpLCB7UjEsIFIzfX0sCi0gICAgeyJjengyLmwiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MTkpLCB7UjEsIFIzfX0sCi0gICAgeyJjengxLnIiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MWMpLCB7UjEsIFIzfX0sCi0gICAgeyJjengyLnIiLAlJLCBPcFgzWDYgKDAsIDAsIDB4MWQpLCB7UjEsIFIzfX0sCi0KLSAgICB7ImRlcCIsCUksIE9wICg0KSwge1IxLCBSMiwgUjMsIENQT1M2YywgTEVONH19LAotCi0gICAgeyJzaHJwIiwJSSwgT3BYMlggKDUsIDMsIDApLCB7UjEsIFIyLCBSMywgQ05UNn19LAotCi0gICAgeyJzaHIudSIsCUksIE9wWDJYWWEgKDUsIDEsIDAsIDApLCB7UjEsIFIzLCBQT1M2fSwKLSAgICAgUFNFVURPIHwgTEVOX0VRXzY0TUNOVH0sCi0gICAgeyJleHRyLnUiLAlJLCBPcFgyWFlhICg1LCAxLCAwLCAwKSwge1IxLCBSMywgUE9TNiwgTEVONn19LAotCi0gICAgeyJzaHIiLAlJLCBPcFgyWFlhICg1LCAxLCAwLCAxKSwge1IxLCBSMywgUE9TNn0sCi0gICAgIFBTRVVETyB8IExFTl9FUV82NE1DTlR9LAotICAgIHsiZXh0ciIsCUksIE9wWDJYWWEgKDUsIDEsIDAsIDEpLCB7UjEsIFIzLCBQT1M2LCBMRU42fX0sCi0KLSAgICB7InNobCIsCUksIE9wWDJYWWIgKDUsIDEsIDEsIDApLCB7UjEsIFIyLCBDUE9TNmF9LAotICAgICBQU0VVRE8gfCBMRU5fRVFfNjRNQ05UfSwKLSAgICB7ImRlcC56IiwJSSwgT3BYMlhZYiAoNSwgMSwgMSwgMCksIHtSMSwgUjIsIENQT1M2YSwgTEVONn19LAotICAgIHsiZGVwLnoiLAlJLCBPcFgyWFliICg1LCAxLCAxLCAxKSwge1IxLCBJTU04LCBDUE9TNmEsIExFTjZ9fSwKLSAgICB7ImRlcCIsCUksIE9wWDJYICg1LCAzLCAxKSwge1IxLCBJTU0xLCBSMywgQ1BPUzZiLCBMRU42fX0sCi0jZGVmaW5lIFRCSVQoYSxiLGMsZCkgXAotICAgICAgICBJMiwgT3BYMlRhVGJZYUMgKDUsIDAsIGEsIGIsIGMsIGQpLCB7UDEsIFAyLCBSMywgUE9TNn0KLSNkZWZpbmUgVEJJVENNKGEsYixjLGQpCVwKLSAgICAgICAgSTIsIE9wWDJUYVRiWWFDICg1LCAwLCBhLCBiLCBjLCBkKSwge1AyLCBQMSwgUjMsIFBPUzZ9LCBQU0VVRE8KLSAgICB7InRiaXQueiIsCQkgVEJJVCAgICgwLCAwLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56IiwJCSBUQklUQ00gKDAsIDAsIDAsIDApfSwKLSAgICB7InRiaXQuei51bmMiLAkgVEJJVCAgICgwLCAwLCAwLCAxKX0sCi0gICAgeyJ0Yml0Lm56LnVuYyIsCSBUQklUQ00gKDAsIDAsIDAsIDEpfSwKLSAgICB7InRiaXQuei5hbmQiLAkgVEJJVCAgICgwLCAxLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56LmFuZGNtIiwJIFRCSVRDTSAoMCwgMSwgMCwgMCl9LAotICAgIHsidGJpdC5uei5hbmQiLAkgVEJJVCAgICgwLCAxLCAwLCAxKX0sCi0gICAgeyJ0Yml0LnouYW5kY20iLAkgVEJJVENNICgwLCAxLCAwLCAxKX0sCi0gICAgeyJ0Yml0Lnoub3IiLAkgVEJJVCAgICgxLCAwLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56Lm9yY20iLAkgVEJJVENNICgxLCAwLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56Lm9yIiwJIFRCSVQgICAoMSwgMCwgMCwgMSl9LAotICAgIHsidGJpdC56Lm9yY20iLAkgVEJJVENNICgxLCAwLCAwLCAxKX0sCi0gICAgeyJ0Yml0Lnoub3IuYW5kY20iLAkgVEJJVCAgICgxLCAxLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56LmFuZC5vcmNtIiwgVEJJVENNICgxLCAxLCAwLCAwKX0sCi0gICAgeyJ0Yml0Lm56Lm9yLmFuZGNtIiwgVEJJVCAgICgxLCAxLCAwLCAxKX0sCi0gICAgeyJ0Yml0LnouYW5kLm9yY20iLCAgVEJJVENNICgxLCAxLCAwLCAxKX0sCi0jdW5kZWYgVEJJVAotI2RlZmluZSBUTkFUKGEsYixjLGQpIFwKLQlJMiwgT3BYMlRhVGJZYUMgKDUsIDAsIGEsIGIsIGMsIGQpLCB7UDEsIFAyLCBSM30KLSNkZWZpbmUgVE5BVENNKGEsYixjLGQpIFwKLQlJMiwgT3BYMlRhVGJZYUMgKDUsIDAsIGEsIGIsIGMsIGQpLCB7UDIsIFAxLCBSM30sIFBTRVVETwotICAgIHsidG5hdC56IiwJCSBUTkFUICAgKDAsIDAsIDEsIDApfSwKLSAgICB7InRuYXQubnoiLAkJIFROQVRDTSAoMCwgMCwgMSwgMCl9LAotICAgIHsidG5hdC56LnVuYyIsCSBUTkFUICAgKDAsIDAsIDEsIDEpfSwKLSAgICB7InRuYXQubnoudW5jIiwJIFROQVRDTSAoMCwgMCwgMSwgMSl9LAotICAgIHsidG5hdC56LmFuZCIsCSBUTkFUICAgKDAsIDEsIDEsIDApfSwKLSAgICB7InRuYXQubnouYW5kY20iLAkgVE5BVENNICgwLCAxLCAxLCAwKX0sCi0gICAgeyJ0bmF0Lm56LmFuZCIsCSBUTkFUICAgKDAsIDEsIDEsIDEpfSwKLSAgICB7InRuYXQuei5hbmRjbSIsCSBUTkFUQ00gKDAsIDEsIDEsIDEpfSwKLSAgICB7InRuYXQuei5vciIsCSBUTkFUICAgKDEsIDAsIDEsIDApfSwKLSAgICB7InRuYXQubnoub3JjbSIsCSBUTkFUQ00gKDEsIDAsIDEsIDApfSwKLSAgICB7InRuYXQubnoub3IiLAkgVE5BVCAgICgxLCAwLCAxLCAxKX0sCi0gICAgeyJ0bmF0Lnoub3JjbSIsCSBUTkFUQ00gKDEsIDAsIDEsIDEpfSwKLSAgICB7InRuYXQuei5vci5hbmRjbSIsCSBUTkFUICAgKDEsIDEsIDEsIDApfSwKLSAgICB7InRuYXQubnouYW5kLm9yY20iLCBUTkFUQ00gKDEsIDEsIDEsIDApfSwKLSAgICB7InRuYXQubnoub3IuYW5kY20iLCBUTkFUICAgKDEsIDEsIDEsIDEpfSwKLSAgICB7InRuYXQuei5hbmQub3JjbSIsICBUTkFUQ00gKDEsIDEsIDEsIDEpfSwKLSN1bmRlZiBUTkFUCi0KLSAgICB7InBtcHlzaHIyIiwgICBJLCBPcFphWmJWZVgyYVgyYiAoNywgMCwgMSwgMCwgMCwgMyksIHtSMSwgUjIsIFIzLCBDTlQyY319LAotICAgIHsicG1weXNocjIudSIsIEksIE9wWmFaYlZlWDJhWDJiICg3LCAwLCAxLCAwLCAwLCAxKSwge1IxLCBSMiwgUjMsIENOVDJjfX0sCi0gICAgeyJwbXB5Mi5yIiwJICAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDIsIDEsIDMpLCB7UjEsIFIyLCBSM319LAotICAgIHsicG1weTIubCIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAyLCAzLCAzKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDEuciIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAwLCAwLCAyLCAwLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDIuciIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAyLCAwLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDQuciIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAyLCAwLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDEubCIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAwLCAwLCAyLCAyLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDIubCIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAyLCAyLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7Im1peDQubCIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAyLCAyLCAyKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBhY2syLnVzcyIsICBJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMSwgMCwgMiwgMCwgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwYWNrMi5zc3MiLCAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDIsIDIsIDApLCB7UjEsIFIyLCBSM319LAotICAgIHsicGFjazQuc3NzIiwgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAyLCAyLCAwKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InVucGFjazEuaCIsICBJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMCwgMCwgMiwgMCwgMSksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJ1bnBhY2syLmgiLCAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDIsIDAsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsidW5wYWNrNC5oIiwgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAyLCAwLCAxKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InVucGFjazEubCIsICBJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMCwgMCwgMiwgMiwgMSksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJ1bnBhY2syLmwiLCAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDIsIDIsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsidW5wYWNrNC5sIiwgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAyLCAyLCAxKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBtaW4xLnUiLAkgICBJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMCwgMCwgMiwgMSwgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwbWF4MS51IiwJICAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDAsIDAsIDIsIDEsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicG1pbjIiLAkgICBJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMSwgMCwgMiwgMywgMCksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwbWF4MiIsCSAgIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAyLCAzLCAxKSwge1IxLCBSMiwgUjN9fSwKLSAgICB7InBzYWQxIiwJICAgSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDAsIDAsIDIsIDMsIDIpLCB7UjEsIFIyLCBSM319LAotICAgIHsibXV4MSIsIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAwLCAwLCAzLCAyLCAyKSwge1IxLCBSMiwgTUJUWVBFNH19LAotICAgIHsibXV4MiIsIEksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAzLCAyLCAyKSwge1IxLCBSMiwgTUhUWVBFOH19LAotICAgIHsicHNocjIiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMSwgMCwgMCwgMiwgMCksIHtSMSwgUjMsIFIyfX0sCi0gICAgeyJwc2hyNCIsCUksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAwLCAwLCAwLCAyLCAwKSwge1IxLCBSMywgUjJ9fSwKLSAgICB7InNociIsCUksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAxLCAxLCAwLCAwLCAyLCAwKSwge1IxLCBSMywgUjJ9fSwKLSAgICB7InBzaHIyLnUiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMSwgMCwgMCwgMCwgMCksIHtSMSwgUjMsIFIyfX0sCi0gICAgeyJwc2hyNC51IiwJSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDEsIDAsIDAsIDAsIDAsIDApLCB7UjEsIFIzLCBSMn19LAotICAgIHsic2hyLnUiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMSwgMSwgMCwgMCwgMCwgMCksIHtSMSwgUjMsIFIyfX0sCi0gICAgeyJwc2hyMiIsCUksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAxLCAzLCAwKSwge1IxLCBSMywgQ05UNX19LAotICAgIHsicHNocjQiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMSwgMCwgMCwgMSwgMywgMCksIHtSMSwgUjMsIENOVDV9fSwKLSAgICB7InBzaHIyLnUiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMCwgMSwgMCwgMSwgMSwgMCksIHtSMSwgUjMsIENOVDV9fSwKLSAgICB7InBzaHI0LnUiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMSwgMCwgMCwgMSwgMSwgMCksIHtSMSwgUjMsIENOVDV9fSwKLSAgICB7InBzaGwyIiwJSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDAsIDAsIDEpLCB7UjEsIFIyLCBSM319LAotICAgIHsicHNobDQiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMSwgMCwgMCwgMCwgMCwgMSksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJzaGwiLAlJLCBPcFphWmJWZVgyYVgyYlgyYyAoNywgMSwgMSwgMCwgMCwgMCwgMSksIHtSMSwgUjIsIFIzfX0sCi0gICAgeyJwc2hsMiIsCUksIE9wWmFaYlZlWDJhWDJiWDJjICg3LCAwLCAxLCAwLCAzLCAxLCAxKSwge1IxLCBSMiwgQ0NOVDV9fSwKLSAgICB7InBzaGw0IiwJSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDEsIDAsIDAsIDMsIDEsIDEpLCB7UjEsIFIyLCBDQ05UNX19LAotICAgIHsicG9wY250IiwJSSwgT3BaYVpiVmVYMmFYMmJYMmMgKDcsIDAsIDEsIDAsIDEsIDEsIDIpLCB7UjEsIFIzfX0sCi0KLSAgICB7MH0KLSAgfTsKLQotI3VuZGVmIEkwCi0jdW5kZWYgSQotI3VuZGVmIEkyCi0jdW5kZWYgTAotI3VuZGVmIGJDCi0jdW5kZWYgYkloCi0jdW5kZWYgYlRhCi0jdW5kZWYgYlRhZzEzCi0jdW5kZWYgYlRiCi0jdW5kZWYgYlZjCi0jdW5kZWYgYlZlCi0jdW5kZWYgYldoCi0jdW5kZWYgYlgKLSN1bmRlZiBiWGIKLSN1bmRlZiBiWDIKLSN1bmRlZiBiWDJhCi0jdW5kZWYgYlgyYgotI3VuZGVmIGJYMmMKLSN1bmRlZiBiWDMKLSN1bmRlZiBiWDYKLSN1bmRlZiBiWQotI3VuZGVmIGJaYQotI3VuZGVmIGJaYgotI3VuZGVmIG1DCi0jdW5kZWYgbUloCi0jdW5kZWYgbVRhCi0jdW5kZWYgbVRhZzEzCi0jdW5kZWYgbVRiCi0jdW5kZWYgbVZjCi0jdW5kZWYgbVZlCi0jdW5kZWYgbVdoCi0jdW5kZWYgbVgKLSN1bmRlZiBtWGIKLSN1bmRlZiBtWDIKLSN1bmRlZiBtWDJhCi0jdW5kZWYgbVgyYgotI3VuZGVmIG1YMmMKLSN1bmRlZiBtWDMKLSN1bmRlZiBtWDYKLSN1bmRlZiBtWQotI3VuZGVmIG1aYQotI3VuZGVmIG1aYgotI3VuZGVmIE9wWmFaYlZlWDJhWDJiCi0jdW5kZWYgT3BaYVpiVmVYMmFYMmJYMmMKLSN1bmRlZiBPcFgyWAotI3VuZGVmIE9wWDJYWWEKLSN1bmRlZiBPcFgyWFliCi0jdW5kZWYgT3BYMlRhVGJZYUMKLSN1bmRlZiBPcFgzCi0jdW5kZWYgT3BYM1g2Ci0jdW5kZWYgT3BYM1hiSWhXaAotI3VuZGVmIE9wWDNYYkloV2hUYWcxMwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pYTY0LW9wYy1tLmMgYi9vcGNvZGVzL2lhNjQtb3BjLW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOTcxZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtb3BjLW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDIgKzAsMCBAQAotLyogaWE2NC1vcGMtbS5jIC0tIElBLTY0IGBNJyBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiaWE2NC1vcGMuaCIKLQotI2RlZmluZSBNMAlJQTY0X1RZUEVfTSwgMAotI2RlZmluZSBNCUlBNjRfVFlQRV9NLCAxCi0jZGVmaW5lIE0yCUlBNjRfVFlQRV9NLCAyCi0KLS8qIGluc3RydWN0aW9uIGJpdCBmaWVsZHM6ICovCi0jZGVmaW5lIGJNKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzNikKLSNkZWZpbmUgYlgoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MSkpIDw8IDI3KQotI2RlZmluZSBiWDIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4MykpIDw8IDMxKQotI2RlZmluZSBiWDMoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4NykpIDw8IDMzKQotI2RlZmluZSBiWDQoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4ZikpIDw8IDI3KQotI2RlZmluZSBiWDZhKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDNmKSkgPDwgMzApCi0jZGVmaW5lIGJYNmIoeCkJCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4M2YpKSA8PCAyNykKLSNkZWZpbmUgYkhpbnQoeCkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMjgpCi0KLSNkZWZpbmUgbU0JYk0gKC0xKQotI2RlZmluZSBtWAliWCAoLTEpCi0jZGVmaW5lIG1YMgliWDIgKC0xKQotI2RlZmluZSBtWDMJYlgzICgtMSkKLSNkZWZpbmUgbVg0CWJYNCAoLTEpCi0jZGVmaW5lIG1YNmEJYlg2YSAoLTEpCi0jZGVmaW5lIG1YNmIJYlg2YiAoLTEpCi0jZGVmaW5lIG1IaW50CWJIaW50ICgtMSkKLQotI2RlZmluZSBPcFgzKGEsYikgCQkoYk9wIChhKSB8IGJYMyAoYikpLCAobU9wIHwgbVgzKQotI2RlZmluZSBPcFgzWDZiKGEsYixjKSAJCShiT3AgKGEpIHwgYlgzIChiKSB8IGJYNmIgKGMpKSwgXAotCQkJCShtT3AgfCBtWDMgfCBtWDZiKQotI2RlZmluZSBPcFgzWDQoYSxiLGMpCSAJKGJPcCAoYSkgfCBiWDMgKGIpIHwgYlg0IChjKSksIFwKLQkJCQkobU9wIHwgbVgzIHwgbVg0KQotI2RlZmluZSBPcFgzWDRYMihhLGIsYyxkKSAJKGJPcCAoYSkgfCBiWDMgKGIpIHwgYlg0IChjKSB8IGJYMiAoZCkpLCBcCi0JCQkJKG1PcCB8IG1YMyB8IG1YNCB8IG1YMikKLSNkZWZpbmUgT3BYNmFIaW50KGEsYixjKSAJKGJPcCAoYSkgfCBiWDZhIChiKSB8IGJIaW50IChjKSksIFwKLQkJCQkobU9wIHwgbVg2YSB8IG1IaW50KQotI2RlZmluZSBPcFhYNmFIaW50KGEsYixjLGQpIAkoYk9wIChhKSB8IGJYIChiKSB8IGJYNmEgKGMpIHwgYkhpbnQgKGQpKSwgXAotCQkJCShtT3AgfCBtWCB8IG1YNmEgfCBtSGludCkKLSNkZWZpbmUgT3BNWFg2YShhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiTSAoYikgfCBiWCAoYykgfCBiWDZhIChkKSksIChtT3AgfCBtTSB8IG1YIHwgbVg2YSkKLSNkZWZpbmUgT3BNWFg2YUhpbnQoYSxiLGMsZCxlKSBcCi0JKGJPcCAoYSkgfCBiTSAoYikgfCBiWCAoYykgfCBiWDZhIChkKSB8IGJIaW50IChlKSksIFwKLQkobU9wIHwgbU0gfCBtWCB8IG1YNmEgfCBtSGludCkKLQotc3RydWN0IGlhNjRfb3Bjb2RlIGlhNjRfb3Bjb2Rlc19tW10gPQotICB7Ci0gICAgLyogTS10eXBlIGluc3RydWN0aW9uIGVuY29kaW5ncyAoc29ydGVkIGFjY29yZGluZyB0byBtYWpvciBvcGNvZGUpICovCi0KLSAgICB7ImNoay5hLm5jIiwJTTAsIE9wWDMgKDAsIDQpLCB7UjEsIFRHVDI1Y319LAotICAgIHsiY2hrLmEuY2xyIiwJTTAsIE9wWDMgKDAsIDUpLCB7UjEsIFRHVDI1Y319LAotICAgIHsiY2hrLmEubmMiLAlNMCwgT3BYMyAoMCwgNiksIHtGMSwgVEdUMjVjfX0sCi0gICAgeyJjaGsuYS5jbHIiLAlNMCwgT3BYMyAoMCwgNyksIHtGMSwgVEdUMjVjfX0sCi0KLSAgICB7ImludmFsYSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDAsIDEpfSwKLSAgICB7ImZ3YiIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDAsIDIpfSwKLSAgICB7Im1mIiwJCU0wLCBPcFgzWDRYMiAoMCwgMCwgMiwgMil9LAotICAgIHsibWYuYSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDMsIDIpfSwKLSAgICB7InNybHouZCIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDAsIDMpfSwKLSAgICB7InNybHouaSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDEsIDMpfSwKLSAgICB7InN5bmMuaSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDMsIDMpfSwKLSAgICB7ImZsdXNocnMiLAkJTTAsIE9wWDNYNFgyICgwLCAwLCAweGMsIDApLCB7MCwgfSwgRklSU1QgfCBOT19QUkVEfSwKLSAgICB7ImxvYWRycyIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDB4YSwgMCksIHswLCB9LCBGSVJTVCB8IE5PX1BSRUR9LAotICAgIHsiaW52YWxhLmUiLAlNMCwgT3BYM1g0WDIgKDAsIDAsIDIsIDEpLCB7UjF9fSwKLSAgICB7ImludmFsYS5lIiwJTTAsIE9wWDNYNFgyICgwLCAwLCAzLCAxKSwge0YxfX0sCi0gICAgeyJtb3YubSIsCQlNLCBPcFgzWDRYMiAoMCwgMCwgOCwgMiksIHtBUjMsIElNTTh9fSwKLQotICAgIHsiYnJlYWsubSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDAsIDApLCB7SU1NVTIxfX0sCi0gICAgeyJub3AubSIsCQlNMCwgT3BYM1g0WDIgKDAsIDAsIDEsIDApLCB7SU1NVTIxfX0sCi0KLSAgICB7InN1bSIsCQlNMCwgT3BYM1g0ICgwLCAwLCA0KSwge0lNTVUyNH19LAotICAgIHsicnVtIiwJCU0wLCBPcFgzWDQgKDAsIDAsIDUpLCB7SU1NVTI0fX0sCi0gICAgeyJzc20iLAkJTTAsIE9wWDNYNCAoMCwgMCwgNiksIHtJTU1VMjR9LCBQUklWfSwKLSAgICB7InJzbSIsCQlNMCwgT3BYM1g0ICgwLCAwLCA3KSwge0lNTVUyNH0sIFBSSVZ9LAotCi0gICAgeyJtb3YubSIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MmEpLCB7QVIzLCBSMn19LAotICAgIHsibW92Lm0iLAlNLCBPcFgzWDZiICgxLCAwLCAweDIyKSwge1IxLCBBUjN9fSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MmMpLCB7Q1IzLCBSMn0sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgyNCksIHtSMSwgQ1IzfSwgUFJJVn0sCi0KLSAgICB7ImFsbG9jIiwJTSwgT3BYMyAoMSwgNiksIHtSMSwgQVJfUEZTLCBTT0YsIFNPTCwgU09SfSwgRklSU1R8Tk9fUFJFRHxNT0RfUlJCU30sCi0KLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MmQpLCB7UFNSX0wsIFIyfSwgUFJJVn0sCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDI5KSwge1BTUl9VTSwgUjJ9fSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MjUpLCB7UjEsIFBTUn0sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgyMSksIHtSMSwgUFNSX1VNfX0sCi0gICAgeyJwcm9iZS5yIiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgzOCksIHtSMSwgUjMsIFIyfX0sCi0gICAgeyJwcm9iZS53IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgzOSksIHtSMSwgUjMsIFIyfX0sCi0gICAgeyJwcm9iZS5yIiwgTSwgT3BYM1g2YiAoMSwgMCwgMHgxOCksIHtSMSwgUjMsIElNTVUyfX0sCi0gICAgeyJwcm9iZS53IiwgTSwgT3BYM1g2YiAoMSwgMCwgMHgxOSksIHtSMSwgUjMsIElNTVUyfX0sCi0gICAgeyJwcm9iZS5ydy5mYXVsdCIsIE0wLCBPcFgzWDZiICgxLCAwLCAweDMxKSwge1IzLCBJTU1VMn19LAotICAgIHsicHJvYmUuci5mYXVsdCIsICBNMCwgT3BYM1g2YiAoMSwgMCwgMHgzMiksIHtSMywgSU1NVTJ9fSwKLSAgICB7InByb2JlLncuZmF1bHQiLCAgTTAsIE9wWDNYNmIgKDEsIDAsIDB4MzMpLCB7UjMsIElNTVUyfX0sCi0gICAgeyJpdGMuZCIsCU0wLCBPcFgzWDZiICgxLCAwLCAweDJlKSwge1IyfSwgTEFTVCB8IFBSSVZ9LAotICAgIHsiaXRjLmkiLAlNMCwgT3BYM1g2YiAoMSwgMCwgMHgyZiksIHtSMn0sIExBU1QgfCBQUklWfSwKLQotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgwMCksIHtSUl9SMywgUjJ9LCBQUklWfSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MDEpLCB7REJSX1IzLCBSMn0sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgwMiksIHtJQlJfUjMsIFIyfSwgUFJJVn0sCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDAzKSwge1BLUl9SMywgUjJ9LCBQUklWfSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MDQpLCB7UE1DX1IzLCBSMn0sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgwNSksIHtQTURfUjMsIFIyfSwgUFJJVn0sCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDA2KSwge01TUl9SMywgUjJ9LCBQUklWfSwKLSAgICB7Iml0ci5kIiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgwZSksIHtEVFJfUjMsIFIyfSwgUFJJVn0sCi0gICAgeyJpdHIuaSIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MGYpLCB7SVRSX1IzLCBSMn0sIFBSSVZ9LAotCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDEwKSwge1IxLCBSUl9SM30sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgxMSksIHtSMSwgREJSX1IzfSwgUFJJVn0sCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDEyKSwge1IxLCBJQlJfUjN9LCBQUklWfSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MTMpLCB7UjEsIFBLUl9SM30sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgxNCksIHtSMSwgUE1DX1IzfSwgUFJJVn0sCi0gICAgeyJtb3YiLAlNLCBPcFgzWDZiICgxLCAwLCAweDE1KSwge1IxLCBQTURfUjN9fSwKLSAgICB7Im1vdiIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MTYpLCB7UjEsIE1TUl9SM30sIFBSSVZ9LAotICAgIHsibW92IiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgxNyksIHtSMSwgQ1BVSURfUjN9fSwKLQotICAgIHsicHRjLmwiLAlNMCwgT3BYM1g2YiAoMSwgMCwgMHgwOSksIHtSMywgUjJ9LCBQUklWfSwKLSAgICB7InB0Yy5nIiwJTTAsIE9wWDNYNmIgKDEsIDAsIDB4MGEpLCB7UjMsIFIyfSwgTEFTVCB8IFBSSVZ9LAotICAgIHsicHRjLmdhIiwJTTAsIE9wWDNYNmIgKDEsIDAsIDB4MGIpLCB7UjMsIFIyfSwgTEFTVCB8IFBSSVZ9LAotICAgIHsicHRyLmQiLAlNMCwgT3BYM1g2YiAoMSwgMCwgMHgwYyksIHtSMywgUjJ9LCBQUklWfSwKLSAgICB7InB0ci5pIiwJTTAsIE9wWDNYNmIgKDEsIDAsIDB4MGQpLCB7UjMsIFIyfSwgUFJJVn0sCi0KLSAgICB7InRoYXNoIiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgxYSksIHtSMSwgUjN9fSwKLSAgICB7InR0YWciLAlNLCBPcFgzWDZiICgxLCAwLCAweDFiKSwge1IxLCBSM319LAotICAgIHsidHBhIiwJTSwgT3BYM1g2YiAoMSwgMCwgMHgxZSksIHtSMSwgUjN9LCBQUklWfSwKLSAgICB7InRhayIsCU0sIE9wWDNYNmIgKDEsIDAsIDB4MWYpLCB7UjEsIFIzfSwgUFJJVn0sCi0KLSAgICB7ImNoay5zLm0iLAlNMCwgT3BYMyAoMSwgMSksIHtSMiwgVEdUMjVifX0sCi0gICAgeyJjaGsucyIsCU0wLCBPcFgzICgxLCAzKSwge0YyLCBUR1QyNWJ9fSwKLQotICAgIHsiZmMiLAlNMCwgT3BYM1g2YiAoMSwgMCwgMHgzMCksIHtSM319LAotICAgIHsicHRjLmUiLAlNMCwgT3BYM1g2YiAoMSwgMCwgMHgzNCksIHtSM30sIFBSSVZ9LAotCi0gICAgLyogaW50ZWdlciBsb2FkICovCi0gICAgeyJsZDEiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MDAsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQxLm50MSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwMCwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDAwLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMiIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwMSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIubnQxIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDAxLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5udGEiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MDEsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ0IiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDAyLCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5udDEiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MDIsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ0Lm50YSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwMiwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDgiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MDMsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQ4Lm50MSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwMywgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDgubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDAzLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5zIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA0LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5zLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA0LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA0LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5zIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA1LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5zLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA1LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA1LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5zIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA2LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5zLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA2LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA2LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5zIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA3LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5zLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA3LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA3LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5hIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA4LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5hLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA4LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA4LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5hIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA5LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5hLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA5LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDA5LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5hIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBhLCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5hLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBhLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBhLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5hIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBiLCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5hLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBiLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBiLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5zYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwYywgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEuc2EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MGMsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQxLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBjLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5zYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwZCwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuc2EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MGQsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQyLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBkLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5zYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwZSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuc2EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MGUsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ0LnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBlLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5zYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgwZiwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguc2EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MGYsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDBmLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5iaWFzIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTAsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQxLmJpYXMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTAsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQxLmJpYXMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTAsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQyLmJpYXMiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxMSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYmlhcy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxMSwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYmlhcy5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxMSwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuYmlhcyIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDEyLCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5iaWFzLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDEyLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5iaWFzLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDEyLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5iaWFzIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTMsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmJpYXMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTMsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmJpYXMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTMsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQxLmFjcSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxNCwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEuYWNxLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDE0LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTQsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQyLmFjcSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxNSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYWNxLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDE1LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTUsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ0LmFjcSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxNiwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuYWNxLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDE2LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTYsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmFjcSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxNywgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguYWNxLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDE3LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MTcsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmZpbGwiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxYiwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguZmlsbC5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxYiwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguZmlsbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgxYiwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEuYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyMCwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEuYy5jbHIubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjAsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQxLmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDIwLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5jLmNsciIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDIxLCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyMSwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYy5jbHIubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjEsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ0LmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjIsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQ0LmMuY2xyLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDIyLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5jLmNsci5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyMiwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyMywgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguYy5jbHIubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjMsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDIzLCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMS5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjQsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQxLmMubmMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjQsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQxLmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjQsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQyLmMubmMiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyNSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyNSwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDIuYy5uYy5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyNSwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDI2LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5jLm5jLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDI2LCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5jLm5jLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDI2LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkOC5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjcsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmMubmMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjcsIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjcsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQxLmMuY2xyLmFjcSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjgsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQxLmMuY2xyLmFjcS5udDEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyOCwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDEuYy5jbHIuYWNxLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDI4LCAzKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5jLmNsci5hY3EiLAkgIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDI5LCAwKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkMi5jLmNsci5hY3EubnQxIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MjksIDEpLCB7UjEsIE1SM319LAotICAgIHsibGQyLmMuY2xyLmFjcS5udGEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyOSwgMyksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuYy5jbHIuYWNxIiwJICBNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyYSwgMCksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDQuYy5jbHIuYWNxLm50MSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDJhLCAxKSwge1IxLCBNUjN9fSwKLSAgICB7ImxkNC5jLmNsci5hY3EubnRhIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MmEsIDMpLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmMuY2xyLmFjcSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MmIsIDApLCB7UjEsIE1SM319LAotICAgIHsibGQ4LmMuY2xyLmFjcS5udDEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgyYiwgMSksIHtSMSwgTVIzfX0sCi0gICAgeyJsZDguYy5jbHIuYWNxLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDJiLCAzKSwge1IxLCBNUjN9fSwKLQotICAgIC8qIGludGVnZXIgbG9hZCB3L2luY3JlbWVudCBieSByZWdpc3RlciAqLwotICAgIHsibGQxIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAwLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEubnQxIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAwLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAwLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDEsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5udDEiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDEsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5udGEiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDEsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNCIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwMiwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0Lm50MSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwMiwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0Lm50YSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwMiwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4IiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAzLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDgubnQxIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAzLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDgubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDAzLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEucyIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwNCwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLnMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDQsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA0LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIucyIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwNSwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLnMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDUsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA1LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDQucyIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwNiwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LnMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDYsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA2LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDgucyIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwNywgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LnMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDcsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA3LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwOCwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLmEubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDgsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA4LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwOSwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLmEubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MDksIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDA5LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDQuYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwYSwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmEubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGEsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBhLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwYiwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LmEubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGIsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBiLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuc2EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGMsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5zYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwYywgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBjLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuc2EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGQsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5zYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwZCwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBkLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDQuc2EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGUsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5zYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwZSwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBlLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguc2EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MGYsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5zYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgwZiwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDBmLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYmlhcyIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDEwLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYmlhcy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgxMCwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLmJpYXMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTAsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5iaWFzIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTEsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5iaWFzLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDExLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYmlhcy5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgxMSwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmJpYXMiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgxMiwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmJpYXMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTIsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5iaWFzLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDEyLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYmlhcyIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDEzLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYmlhcy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgxMywgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LmJpYXMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTMsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5hY3EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTQsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5hY3EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTQsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTQsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5hY3EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTUsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5hY3EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTUsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTUsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5hY3EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTYsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5hY3EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTYsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTYsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5hY3EiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTcsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5hY3EubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTcsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5hY3EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MTcsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5maWxsIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MWIsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5maWxsLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDFiLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguZmlsbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgxYiwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjAsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyMCwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDIwLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyMSwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLmMuY2xyLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDIxLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYy5jbHIubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjEsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5jLmNsciIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDIyLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDQuYy5jbHIubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjIsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5jLmNsci5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyMiwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjMsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyMywgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDIzLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI0LCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyNCwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQxLmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjQsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjUsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMi5jLm5jLm50MSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI1LCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYy5uYy5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyNSwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmMubmMiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyNiwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmMubmMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjYsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5jLm5jLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI2LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI3LCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyNywgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ4LmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MjcsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkMS5jLmNsci5hY3EiLAkgIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI4LCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYy5jbHIuYWNxLm50MSIsIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI4LCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDEuYy5jbHIuYWNxLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDI4LCAzKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDIuYy5jbHIuYWNxIiwJICBNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyOSwgMCksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLmMuY2xyLmFjcS5udDEiLCBNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyOSwgMSksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQyLmMuY2xyLmFjcS5udGEiLCBNLCBPcE1YWDZhSGludCAoNCwgMSwgMCwgMHgyOSwgMyksIHtSMSwgTVIzLCBSMn19LAotICAgIHsibGQ0LmMuY2xyLmFjcSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MmEsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5jLmNsci5hY3EubnQxIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MmEsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkNC5jLmNsci5hY3EubnRhIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDEsIDAsIDB4MmEsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkOC5jLmNsci5hY3EiLAkgIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDJiLCAwKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYy5jbHIuYWNxLm50MSIsIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDJiLCAxKSwge1IxLCBNUjMsIFIyfX0sCi0gICAgeyJsZDguYy5jbHIuYWNxLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAxLCAwLCAweDJiLCAzKSwge1IxLCBNUjMsIFIyfX0sCi0KLSAgICB7InN0MSIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzMCwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDEubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDMwLCAzKSwge01SMywgUjJ9fSwKLSAgICB7InN0MiIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzMSwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDIubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDMxLCAzKSwge01SMywgUjJ9fSwKLSAgICB7InN0NCIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzMiwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDQubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDMyLCAzKSwge01SMywgUjJ9fSwKLSAgICB7InN0OCIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzMywgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDgubnRhIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDMzLCAzKSwge01SMywgUjJ9fSwKLSAgICB7InN0MS5yZWwiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MzQsIDApLCB7TVIzLCBSMn19LAotICAgIHsic3QxLnJlbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzNCwgMyksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDIucmVsIiwJCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDM1LCAwKSwge01SMywgUjJ9fSwKLSAgICB7InN0Mi5yZWwubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MzUsIDMpLCB7TVIzLCBSMn19LAotICAgIHsic3Q0LnJlbCIsCQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzNiwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDQucmVsLm50YSIsCU0sIE9wTVhYNmFIaW50ICg0LCAwLCAwLCAweDM2LCAzKSwge01SMywgUjJ9fSwKLSAgICB7InN0OC5yZWwiLAkJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4MzcsIDApLCB7TVIzLCBSMn19LAotICAgIHsic3Q4LnJlbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzNywgMyksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDguc3BpbGwiLAlNLCBPcE1YWDZhSGludCAoNCwgMCwgMCwgMHgzYiwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJzdDguc3BpbGwubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDAsIDB4M2IsIDMpLCB7TVIzLCBSMn19LAotCi0jZGVmaW5lIENNUFhDSEcoYyxoKQlNLCBPcE1YWDZhSGludCAoNCwgMCwgMSwgYywgaCksIHtSMSwgTVIzLCBSMiwgQVJfQ0NWfQotICAgIHsiY21weGNoZzEuYWNxIiwJCUNNUFhDSEcgKDB4MDAsIDApfSwKLSAgICB7ImNtcHhjaGcxLmFjcS5udDEiLAlDTVBYQ0hHICgweDAwLCAxKX0sCi0gICAgeyJjbXB4Y2hnMS5hY3EubnRhIiwJQ01QWENIRyAoMHgwMCwgMyl9LAotICAgIHsiY21weGNoZzIuYWNxIiwJCUNNUFhDSEcgKDB4MDEsIDApfSwKLSAgICB7ImNtcHhjaGcyLmFjcS5udDEiLAlDTVBYQ0hHICgweDAxLCAxKX0sCi0gICAgeyJjbXB4Y2hnMi5hY3EubnRhIiwJQ01QWENIRyAoMHgwMSwgMyl9LAotICAgIHsiY21weGNoZzQuYWNxIiwJCUNNUFhDSEcgKDB4MDIsIDApfSwKLSAgICB7ImNtcHhjaGc0LmFjcS5udDEiLAlDTVBYQ0hHICgweDAyLCAxKX0sCi0gICAgeyJjbXB4Y2hnNC5hY3EubnRhIiwJQ01QWENIRyAoMHgwMiwgMyl9LAotICAgIHsiY21weGNoZzguYWNxIiwJCUNNUFhDSEcgKDB4MDMsIDApfSwKLSAgICB7ImNtcHhjaGc4LmFjcS5udDEiLAlDTVBYQ0hHICgweDAzLCAxKX0sCi0gICAgeyJjbXB4Y2hnOC5hY3EubnRhIiwJQ01QWENIRyAoMHgwMywgMyl9LAotICAgIHsiY21weGNoZzEucmVsIiwJCUNNUFhDSEcgKDB4MDQsIDApfSwKLSAgICB7ImNtcHhjaGcxLnJlbC5udDEiLAlDTVBYQ0hHICgweDA0LCAxKX0sCi0gICAgeyJjbXB4Y2hnMS5yZWwubnRhIiwJQ01QWENIRyAoMHgwNCwgMyl9LAotICAgIHsiY21weGNoZzIucmVsIiwJCUNNUFhDSEcgKDB4MDUsIDApfSwKLSAgICB7ImNtcHhjaGcyLnJlbC5udDEiLAlDTVBYQ0hHICgweDA1LCAxKX0sCi0gICAgeyJjbXB4Y2hnMi5yZWwubnRhIiwJQ01QWENIRyAoMHgwNSwgMyl9LAotICAgIHsiY21weGNoZzQucmVsIiwJCUNNUFhDSEcgKDB4MDYsIDApfSwKLSAgICB7ImNtcHhjaGc0LnJlbC5udDEiLAlDTVBYQ0hHICgweDA2LCAxKX0sCi0gICAgeyJjbXB4Y2hnNC5yZWwubnRhIiwJQ01QWENIRyAoMHgwNiwgMyl9LAotICAgIHsiY21weGNoZzgucmVsIiwJCUNNUFhDSEcgKDB4MDcsIDApfSwKLSAgICB7ImNtcHhjaGc4LnJlbC5udDEiLAlDTVBYQ0hHICgweDA3LCAxKX0sCi0gICAgeyJjbXB4Y2hnOC5yZWwubnRhIiwJQ01QWENIRyAoMHgwNywgMyl9LAotI3VuZGVmIENNUFhDSEcKLSAgICB7InhjaGcxIiwJCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDgsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGcxLm50MSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDgsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGcxLm50YSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDgsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGcyIiwJCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDksIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGcyLm50MSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDksIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGcyLm50YSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MDksIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc0IiwJCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGEsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc0Lm50MSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGEsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc0Lm50YSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGEsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc4IiwJCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGIsIDApLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc4Lm50MSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGIsIDEpLCB7UjEsIE1SMywgUjJ9fSwKLSAgICB7InhjaGc4Lm50YSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MGIsIDMpLCB7UjEsIE1SMywgUjJ9fSwKLQotICAgIHsiZmV0Y2hhZGQ0LmFjcSIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MTIsIDApLCB7UjEsIE1SMywgSU5DM319LAotICAgIHsiZmV0Y2hhZGQ0LmFjcS5udDEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMSwgMHgxMiwgMSksIHtSMSwgTVIzLCBJTkMzfX0sCi0gICAgeyJmZXRjaGFkZDQuYWNxLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAxLCAweDEyLCAzKSwge1IxLCBNUjMsIElOQzN9fSwKLSAgICB7ImZldGNoYWRkOC5hY3EiLAkgIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAxLCAweDEzLCAwKSwge1IxLCBNUjMsIElOQzN9fSwKLSAgICB7ImZldGNoYWRkOC5hY3EubnQxIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MTMsIDEpLCB7UjEsIE1SMywgSU5DM319LAotICAgIHsiZmV0Y2hhZGQ4LmFjcS5udGEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMSwgMHgxMywgMyksIHtSMSwgTVIzLCBJTkMzfX0sCi0gICAgeyJmZXRjaGFkZDQucmVsIiwJICBNLCBPcE1YWDZhSGludCAoNCwgMCwgMSwgMHgxNiwgMCksIHtSMSwgTVIzLCBJTkMzfX0sCi0gICAgeyJmZXRjaGFkZDQucmVsLm50MSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAxLCAweDE2LCAxKSwge1IxLCBNUjMsIElOQzN9fSwKLSAgICB7ImZldGNoYWRkNC5yZWwubnRhIiwgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MTYsIDMpLCB7UjEsIE1SMywgSU5DM319LAotICAgIHsiZmV0Y2hhZGQ4LnJlbCIsCSAgTSwgT3BNWFg2YUhpbnQgKDQsIDAsIDEsIDB4MTcsIDApLCB7UjEsIE1SMywgSU5DM319LAotICAgIHsiZmV0Y2hhZGQ4LnJlbC5udDEiLCBNLCBPcE1YWDZhSGludCAoNCwgMCwgMSwgMHgxNywgMSksIHtSMSwgTVIzLCBJTkMzfX0sCi0gICAgeyJmZXRjaGFkZDgucmVsLm50YSIsIE0sIE9wTVhYNmFIaW50ICg0LCAwLCAxLCAweDE3LCAzKSwge1IxLCBNUjMsIElOQzN9fSwKLQotICAgIHsiZ2V0Zi5zaWciLAkgIE0sIE9wTVhYNmEgKDQsIDAsIDEsIDB4MWMpLCB7UjEsIEYyfX0sCi0gICAgeyJnZXRmLmV4cCIsCSAgTSwgT3BNWFg2YSAoNCwgMCwgMSwgMHgxZCksIHtSMSwgRjJ9fSwKLSAgICB7ImdldGYucyIsCQkgIE0sIE9wTVhYNmEgKDQsIDAsIDEsIDB4MWUpLCB7UjEsIEYyfX0sCi0gICAgeyJnZXRmLmQiLAkJICBNLCBPcE1YWDZhICg0LCAwLCAxLCAweDFmKSwge1IxLCBGMn19LAotCi0gICAgLyogaW50ZWdlciBsb2FkIHcvaW5jcmVtZW50IGJ5IGltbWVkaWF0ZSAqLwotICAgIHsibGQxIiwJCU0sIE9wWDZhSGludCAoNSwgMHgwMCwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLm50MSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDAsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5udGEiLAkJTSwgT3BYNmFIaW50ICg1LCAweDAwLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIiLAkJTSwgT3BYNmFIaW50ICg1LCAweDAxLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIubnQxIiwJCU0sIE9wWDZhSGludCAoNSwgMHgwMSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQyLm50YSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDEsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNCIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDIsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5udDEiLAkJTSwgT3BYNmFIaW50ICg1LCAweDAyLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQubnRhIiwJCU0sIE9wWDZhSGludCAoNSwgMHgwMiwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4IiwJCU0sIE9wWDZhSGludCAoNSwgMHgwMywgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4Lm50MSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDMsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5udGEiLAkJTSwgT3BYNmFIaW50ICg1LCAweDAzLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEucyIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDQsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5zLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwNCwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLnMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA0LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIucyIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDUsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5zLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwNSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQyLnMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA1LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQucyIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDYsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5zLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwNiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LnMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA2LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDgucyIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDcsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5zLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwNywgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LnMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA3LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDgsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5hLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwOCwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmEubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA4LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MDksIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5hLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwOSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQyLmEubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDA5LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuYSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MGEsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5hLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwYSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmEubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBhLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MGIsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5hLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgwYiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmEubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBiLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuc2EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDBjLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDBjLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuc2EubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBjLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuc2EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDBkLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDBkLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuc2EubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBkLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuc2EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDBlLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDBlLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuc2EubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBlLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguc2EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDBmLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguc2EubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDBmLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguc2EubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDBmLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYmlhcyIsCU0sIE9wWDZhSGludCAoNSwgMHgxMCwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmJpYXMubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDEwLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYmlhcy5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTAsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5iaWFzIiwJTSwgT3BYNmFIaW50ICg1LCAweDExLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYmlhcy5udDEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTEsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5iaWFzLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgxMSwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmJpYXMiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTIsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5iaWFzLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgxMiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmJpYXMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDEyLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYmlhcyIsCU0sIE9wWDZhSGludCAoNSwgMHgxMywgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmJpYXMubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDEzLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYmlhcy5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTMsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5hY3EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDE0LCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYWNxLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgxNCwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmFjcS5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTQsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5hY3EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDE1LCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYWNxLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgxNSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQyLmFjcS5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTUsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5hY3EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDE2LCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuYWNxLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgxNiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmFjcS5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTYsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5hY3EiLAkJTSwgT3BYNmFIaW50ICg1LCAweDE3LCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYWNxLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgxNywgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmFjcS5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MTcsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5maWxsIiwJTSwgT3BYNmFIaW50ICg1LCAweDFiLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguZmlsbC5udDEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MWIsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5maWxsLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgxYiwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmMuY2xyIiwJTSwgT3BYNmFIaW50ICg1LCAweDIwLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYy5jbHIubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDIwLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYy5jbHIubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDIwLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYy5jbHIiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjEsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5jLmNsci5udDEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjEsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5jLmNsci5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjEsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5jLmNsciIsCU0sIE9wWDZhSGludCAoNSwgMHgyMiwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMuY2xyLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgyMiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMuY2xyLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgyMiwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmMuY2xyIiwJTSwgT3BYNmFIaW50ICg1LCAweDIzLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYy5jbHIubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDIzLCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYy5jbHIubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDIzLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYy5uYyIsCU0sIE9wWDZhSGludCAoNSwgMHgyNCwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmMubmMubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDI0LCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDEuYy5uYy5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjQsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5jLm5jIiwJTSwgT3BYNmFIaW50ICg1LCAweDI1LCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYy5uYy5udDEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjUsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5jLm5jLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgyNSwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMubmMiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjYsIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkNC5jLm5jLm50MSIsCU0sIE9wWDZhSGludCAoNSwgMHgyNiwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMubmMubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDI2LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYy5uYyIsCU0sIE9wWDZhSGludCAoNSwgMHgyNywgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmMubmMubnQxIiwJTSwgT3BYNmFIaW50ICg1LCAweDI3LCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDguYy5uYy5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MjcsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5jLmNsci5hY3EiLAkgIE0sIE9wWDZhSGludCAoNSwgMHgyOCwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQxLmMuY2xyLmFjcS5udDEiLCBNLCBPcFg2YUhpbnQgKDUsIDB4MjgsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMS5jLmNsci5hY3EubnRhIiwgTSwgT3BYNmFIaW50ICg1LCAweDI4LCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYy5jbHIuYWNxIiwJICBNLCBPcFg2YUhpbnQgKDUsIDB4MjksIDApLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkMi5jLmNsci5hY3EubnQxIiwgTSwgT3BYNmFIaW50ICg1LCAweDI5LCAxKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDIuYy5jbHIuYWNxLm50YSIsIE0sIE9wWDZhSGludCAoNSwgMHgyOSwgMyksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMuY2xyLmFjcSIsCSAgTSwgT3BYNmFIaW50ICg1LCAweDJhLCAwKSwge1IxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZDQuYy5jbHIuYWNxLm50MSIsIE0sIE9wWDZhSGludCAoNSwgMHgyYSwgMSksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ0LmMuY2xyLmFjcS5udGEiLCBNLCBPcFg2YUhpbnQgKDUsIDB4MmEsIDMpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5jLmNsci5hY3EiLAkgIE0sIE9wWDZhSGludCAoNSwgMHgyYiwgMCksIHtSMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGQ4LmMuY2xyLmFjcS5udDEiLCBNLCBPcFg2YUhpbnQgKDUsIDB4MmIsIDEpLCB7UjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkOC5jLmNsci5hY3EubnRhIiwgTSwgT3BYNmFIaW50ICg1LCAweDJiLCAzKSwge1IxLCBNUjMsIElNTTlifX0sCi0KLSAgICAvKiBzdG9yZSB3L2luY3JlbWVudCBieSBpbW1lZGlhdGUgKi8KLSAgICB7InN0MSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MzAsIDApLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0MS5udGEiLAkJTSwgT3BYNmFIaW50ICg1LCAweDMwLCAzKSwge01SMywgUjIsIElNTTlhfX0sCi0gICAgeyJzdDIiLAkJTSwgT3BYNmFIaW50ICg1LCAweDMxLCAwKSwge01SMywgUjIsIElNTTlhfX0sCi0gICAgeyJzdDIubnRhIiwJCU0sIE9wWDZhSGludCAoNSwgMHgzMSwgMyksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3Q0IiwJCU0sIE9wWDZhSGludCAoNSwgMHgzMiwgMCksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3Q0Lm50YSIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MzIsIDMpLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0OCIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MzMsIDApLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0OC5udGEiLAkJTSwgT3BYNmFIaW50ICg1LCAweDMzLCAzKSwge01SMywgUjIsIElNTTlhfX0sCi0gICAgeyJzdDEucmVsIiwJCU0sIE9wWDZhSGludCAoNSwgMHgzNCwgMCksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3QxLnJlbC5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MzQsIDMpLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0Mi5yZWwiLAkJTSwgT3BYNmFIaW50ICg1LCAweDM1LCAwKSwge01SMywgUjIsIElNTTlhfX0sCi0gICAgeyJzdDIucmVsLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgzNSwgMyksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3Q0LnJlbCIsCQlNLCBPcFg2YUhpbnQgKDUsIDB4MzYsIDApLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0NC5yZWwubnRhIiwJTSwgT3BYNmFIaW50ICg1LCAweDM2LCAzKSwge01SMywgUjIsIElNTTlhfX0sCi0gICAgeyJzdDgucmVsIiwJCU0sIE9wWDZhSGludCAoNSwgMHgzNywgMCksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3Q4LnJlbC5udGEiLAlNLCBPcFg2YUhpbnQgKDUsIDB4MzcsIDMpLCB7TVIzLCBSMiwgSU1NOWF9fSwKLSAgICB7InN0OC5zcGlsbCIsCU0sIE9wWDZhSGludCAoNSwgMHgzYiwgMCksIHtNUjMsIFIyLCBJTU05YX19LAotICAgIHsic3Q4LnNwaWxsLm50YSIsCU0sIE9wWDZhSGludCAoNSwgMHgzYiwgMyksIHtNUjMsIFIyLCBJTU05YX19LAotCi0gICAgLyogZmxvYXRpbmctcG9pbnQgbG9hZCAqLwotICAgIHsibGRmcyIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwMiwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDAyLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDIsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZCIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwMywgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZkLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDAzLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDMsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmOCIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwMSwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4Lm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDAxLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZjgubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDEsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwMCwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDAwLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDAsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmcy5zIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA2LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwNiwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLnMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDYsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZC5zIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA3LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwNywgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZkLnMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDcsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5zIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA1LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZjgucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwNSwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4LnMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDUsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZS5zIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA0LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwNCwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLnMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDQsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmcy5hIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBhLCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwYSwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLmEubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGEsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZC5hIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBiLCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwYiwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZkLmEubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGIsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5hIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA5LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZjguYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwOSwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4LmEubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDksIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZS5hIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDA4LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwOCwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLmEubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MDgsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmcy5zYSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwZSwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBlLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMuc2EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGUsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZC5zYSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwZiwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZkLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBmLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQuc2EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGYsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5zYSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwZCwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4LnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBkLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZjguc2EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGQsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZS5zYSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgwYywgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDBjLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUuc2EubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MGMsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmLmZpbGwiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgxYiwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGYuZmlsbC5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgxYiwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGYuZmlsbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgxYiwgMyksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjIsIDApLCB7RjEsIE1SM319LAotICAgIHsibGRmcy5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyMiwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDIyLCAzKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQuYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyMywgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZkLmMuY2xyLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDIzLCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQuYy5jbHIubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjMsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5jLmNsciIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDIxLCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZjguYy5jbHIubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjEsIDEpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5jLmNsci5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyMSwgMyksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjAsIDApLCB7RjEsIE1SM319LAotICAgIHsibGRmZS5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyMCwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDIwLCAzKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMuYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDI2LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZnMuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyNiwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZzLmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjYsIDMpLCB7RjEsIE1SM319LAotICAgIHsibGRmZC5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjcsIDApLCB7RjEsIE1SM319LAotICAgIHsibGRmZC5jLm5jLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDI3LCAxKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmQuYy5uYy5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyNywgMyksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4LmMubmMiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyNSwgMCksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGY4LmMubmMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjUsIDEpLCB7RjEsIE1SM319LAotICAgIHsibGRmOC5jLm5jLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDI1LCAzKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUuYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDI0LCAwKSwge0YxLCBNUjN9fSwKLSAgICB7ImxkZmUuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyNCwgMSksIHtGMSwgTVIzfX0sCi0gICAgeyJsZGZlLmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MjQsIDMpLCB7RjEsIE1SM319LAotCi0gICAgeyJsZGZzIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAyLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAyLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAyLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAzLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAzLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAzLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4IiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAxLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4Lm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAxLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4Lm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAxLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAwLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAwLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDAwLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLnMiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDYsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZnMucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwNiwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA2LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLnMiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDcsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmQucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwNywgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA3LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LnMiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDUsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjgucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwNSwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmOC5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA1LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLnMiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDQsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmUucy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwNCwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5zLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA0LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLmEiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MGEsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZnMuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwYSwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBhLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLmEiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MGIsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmQuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwYiwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBiLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LmEiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDksIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjguYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwOSwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmOC5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA5LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLmEiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MDgsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmUuYS5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgwOCwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5hLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDA4LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLnNhIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBlLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBlLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZzLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBlLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLnNhIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBmLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBmLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBmLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LnNhIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBkLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBkLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBkLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLnNhIiwJCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBjLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLnNhLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBjLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZlLnNhLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDBjLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGYuZmlsbCIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDFiLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGYuZmlsbC5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgxYiwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmLmZpbGwubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MWIsIDMpLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZnMuYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMiwgMCksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMiwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5jLmNsci5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMiwgMyksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZC5jLmNsciIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDIzLCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLmMuY2xyLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDIzLCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLmMuY2xyLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDIzLCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LmMuY2xyIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjEsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjguYy5jbHIubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjEsIDEpLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjguYy5jbHIubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjEsIDMpLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmUuYy5jbHIiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMCwgMCksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5jLmNsci5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMCwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5jLmNsci5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyMCwgMyksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjYsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZnMuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyNiwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmcy5jLm5jLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDI2LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLmMubmMiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyNywgMCksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZC5jLm5jLm50MSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDI3LCAxKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGZkLmMubmMubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjcsIDMpLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjguYy5uYyIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDI1LCAwKSwge0YxLCBNUjMsIFIyfX0sCi0gICAgeyJsZGY4LmMubmMubnQxIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjUsIDEpLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZjguYy5uYy5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyNSwgMyksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5jLm5jIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MjQsIDApLCB7RjEsIE1SMywgUjJ9fSwKLSAgICB7ImxkZmUuYy5uYy5udDEiLAlNLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyNCwgMSksIHtGMSwgTVIzLCBSMn19LAotICAgIHsibGRmZS5jLm5jLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDI0LCAzKSwge0YxLCBNUjMsIFIyfX0sCi0KLSAgICAvKiBmbG9hdGluZy1wb2ludCBzdG9yZSAqLwotICAgIHsic3RmcyIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgzMiwgMCksIHtNUjMsIEYyfX0sCi0gICAgeyJzdGZzLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDMyLCAzKSwge01SMywgRjJ9fSwKLSAgICB7InN0ZmQiLAkJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MzMsIDApLCB7TVIzLCBGMn19LAotICAgIHsic3RmZC5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgzMywgMyksIHtNUjMsIEYyfX0sCi0gICAgeyJzdGY4IiwJCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDMxLCAwKSwge01SMywgRjJ9fSwKLSAgICB7InN0ZjgubnRhIiwJTSwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MzEsIDMpLCB7TVIzLCBGMn19LAotICAgIHsic3RmZSIsCQlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgzMCwgMCksIHtNUjMsIEYyfX0sCi0gICAgeyJzdGZlLm50YSIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDMwLCAzKSwge01SMywgRjJ9fSwKLSAgICB7InN0Zi5zcGlsbCIsCU0sIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDNiLCAwKSwge01SMywgRjJ9fSwKLSAgICB7InN0Zi5zcGlsbC5udGEiLAlNLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgzYiwgMyksIHtNUjMsIEYyfX0sCi0KLSAgICAvKiBmbG9hdGluZy1wb2ludCBsb2FkIHBhaXIgKi8KLSAgICB7ImxkZnBzIiwJCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwMiwgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcHMubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDAyLCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDIsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkIiwJCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwMywgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDAzLCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwZC5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDMsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnA4IiwJCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwMSwgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDgubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDAxLCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDEsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLnMiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDA2LCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5zLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwNiwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcHMucy5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDYsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkLnMiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDA3LCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwZC5zLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwNywgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQucy5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDcsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnA4LnMiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDA1LCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5zLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwNSwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDgucy5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDUsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLmEiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDBhLCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5hLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwYSwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcHMuYS5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MGEsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkLmEiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDBiLCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwZC5hLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwYiwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuYS5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MGIsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnA4LmEiLAkJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDA5LCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5hLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwOSwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDguYS5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MDksIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLnNhIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDBlLCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5zYS5udDEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MGUsIDEpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLnNhLm50YSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwZSwgMyksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuc2EiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MGYsIDApLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkLnNhLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwZiwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuc2EubnRhIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDBmLCAzKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5zYSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgwZCwgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDguc2EubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDBkLCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5zYS5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MGQsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLmMuY2xyIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDIyLCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5jLmNsci5udDEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjIsIDEpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLmMuY2xyLm50YSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyMiwgMyksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuYy5jbHIiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjMsIDApLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkLmMuY2xyLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyMywgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuYy5jbHIubnRhIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDIzLCAzKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5jLmNsciIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyMSwgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDguYy5jbHIubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDIxLCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5jLmNsci5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjEsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLmMubmMiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjYsIDApLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBzLmMubmMubnQxIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDI2LCAxKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwcy5jLm5jLm50YSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyNiwgMyksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuYy5uYyIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyNywgMCksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcGQuYy5uYy5udDEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjcsIDEpLCB7RjEsIEYyLCBNUjN9fSwKLSAgICB7ImxkZnBkLmMubmMubnRhIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDI3LCAzKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5jLm5jIiwJTTIsIE9wTVhYNmFIaW50ICg2LCAwLCAxLCAweDI1LCAwKSwge0YxLCBGMiwgTVIzfX0sCi0gICAgeyJsZGZwOC5jLm5jLm50MSIsCU0yLCBPcE1YWDZhSGludCAoNiwgMCwgMSwgMHgyNSwgMSksIHtGMSwgRjIsIE1SM319LAotICAgIHsibGRmcDguYy5uYy5udGEiLAlNMiwgT3BNWFg2YUhpbnQgKDYsIDAsIDEsIDB4MjUsIDMpLCB7RjEsIEYyLCBNUjN9fSwKLQotICAgIC8qIGZsb2F0aW5nLXBvaW50IGxvYWQgcGFpciB3L2luY3JlbWVudCBieSBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgTEQoYSxiLGMpCU0yLCBPcE1YWDZhSGludCAoNiwgMSwgMSwgYSwgYiksIHtGMSwgRjIsIE1SMywgY30KLSAgICB7ImxkZnBzIiwJCUxEICgweDAyLCAwLCBDOCl9LAotICAgIHsibGRmcHMubnQxIiwJTEQgKDB4MDIsIDEsIEM4KX0sCi0gICAgeyJsZGZwcy5udGEiLAlMRCAoMHgwMiwgMywgQzgpfSwKLSAgICB7ImxkZnBkIiwJCUxEICgweDAzLCAwLCBDMTYpfSwKLSAgICB7ImxkZnBkLm50MSIsCUxEICgweDAzLCAxLCBDMTYpfSwKLSAgICB7ImxkZnBkLm50YSIsCUxEICgweDAzLCAzLCBDMTYpfSwKLSAgICB7ImxkZnA4IiwJCUxEICgweDAxLCAwLCBDMTYpfSwKLSAgICB7ImxkZnA4Lm50MSIsCUxEICgweDAxLCAxLCBDMTYpfSwKLSAgICB7ImxkZnA4Lm50YSIsCUxEICgweDAxLCAzLCBDMTYpfSwKLSAgICB7ImxkZnBzLnMiLAkJTEQgKDB4MDYsIDAsIEM4KX0sCi0gICAgeyJsZGZwcy5zLm50MSIsCUxEICgweDA2LCAxLCBDOCl9LAotICAgIHsibGRmcHMucy5udGEiLAlMRCAoMHgwNiwgMywgQzgpfSwKLSAgICB7ImxkZnBkLnMiLAkJTEQgKDB4MDcsIDAsIEMxNil9LAotICAgIHsibGRmcGQucy5udDEiLAlMRCAoMHgwNywgMSwgQzE2KX0sCi0gICAgeyJsZGZwZC5zLm50YSIsCUxEICgweDA3LCAzLCBDMTYpfSwKLSAgICB7ImxkZnA4LnMiLAkJTEQgKDB4MDUsIDAsIEMxNil9LAotICAgIHsibGRmcDgucy5udDEiLAlMRCAoMHgwNSwgMSwgQzE2KX0sCi0gICAgeyJsZGZwOC5zLm50YSIsCUxEICgweDA1LCAzLCBDMTYpfSwKLSAgICB7ImxkZnBzLmEiLAkJTEQgKDB4MGEsIDAsIEM4KX0sCi0gICAgeyJsZGZwcy5hLm50MSIsCUxEICgweDBhLCAxLCBDOCl9LAotICAgIHsibGRmcHMuYS5udGEiLAlMRCAoMHgwYSwgMywgQzgpfSwKLSAgICB7ImxkZnBkLmEiLAkJTEQgKDB4MGIsIDAsIEMxNil9LAotICAgIHsibGRmcGQuYS5udDEiLAlMRCAoMHgwYiwgMSwgQzE2KX0sCi0gICAgeyJsZGZwZC5hLm50YSIsCUxEICgweDBiLCAzLCBDMTYpfSwKLSAgICB7ImxkZnA4LmEiLAkJTEQgKDB4MDksIDAsIEMxNil9LAotICAgIHsibGRmcDguYS5udDEiLAlMRCAoMHgwOSwgMSwgQzE2KX0sCi0gICAgeyJsZGZwOC5hLm50YSIsCUxEICgweDA5LCAzLCBDMTYpfSwKLSAgICB7ImxkZnBzLnNhIiwJTEQgKDB4MGUsIDAsIEM4KX0sCi0gICAgeyJsZGZwcy5zYS5udDEiLAlMRCAoMHgwZSwgMSwgQzgpfSwKLSAgICB7ImxkZnBzLnNhLm50YSIsCUxEICgweDBlLCAzLCBDOCl9LAotICAgIHsibGRmcGQuc2EiLAlMRCAoMHgwZiwgMCwgQzE2KX0sCi0gICAgeyJsZGZwZC5zYS5udDEiLAlMRCAoMHgwZiwgMSwgQzE2KX0sCi0gICAgeyJsZGZwZC5zYS5udGEiLAlMRCAoMHgwZiwgMywgQzE2KX0sCi0gICAgeyJsZGZwOC5zYSIsCUxEICgweDBkLCAwLCBDMTYpfSwKLSAgICB7ImxkZnA4LnNhLm50MSIsCUxEICgweDBkLCAxLCBDMTYpfSwKLSAgICB7ImxkZnA4LnNhLm50YSIsCUxEICgweDBkLCAzLCBDMTYpfSwKLSAgICB7ImxkZnBzLmMuY2xyIiwJTEQgKDB4MjIsIDAsIEM4KX0sCi0gICAgeyJsZGZwcy5jLmNsci5udDEiLAlMRCAoMHgyMiwgMSwgQzgpfSwKLSAgICB7ImxkZnBzLmMuY2xyLm50YSIsCUxEICgweDIyLCAzLCBDOCl9LAotICAgIHsibGRmcGQuYy5jbHIiLAlMRCAoMHgyMywgMCwgQzE2KX0sCi0gICAgeyJsZGZwZC5jLmNsci5udDEiLAlMRCAoMHgyMywgMSwgQzE2KX0sCi0gICAgeyJsZGZwZC5jLmNsci5udGEiLAlMRCAoMHgyMywgMywgQzE2KX0sCi0gICAgeyJsZGZwOC5jLmNsciIsCUxEICgweDIxLCAwLCBDMTYpfSwKLSAgICB7ImxkZnA4LmMuY2xyLm50MSIsCUxEICgweDIxLCAxLCBDMTYpfSwKLSAgICB7ImxkZnA4LmMuY2xyLm50YSIsCUxEICgweDIxLCAzLCBDMTYpfSwKLSAgICB7ImxkZnBzLmMubmMiLAlMRCAoMHgyNiwgMCwgQzgpfSwKLSAgICB7ImxkZnBzLmMubmMubnQxIiwJTEQgKDB4MjYsIDEsIEM4KX0sCi0gICAgeyJsZGZwcy5jLm5jLm50YSIsCUxEICgweDI2LCAzLCBDOCl9LAotICAgIHsibGRmcGQuYy5uYyIsCUxEICgweDI3LCAwLCBDMTYpfSwKLSAgICB7ImxkZnBkLmMubmMubnQxIiwJTEQgKDB4MjcsIDEsIEMxNil9LAotICAgIHsibGRmcGQuYy5uYy5udGEiLAlMRCAoMHgyNywgMywgQzE2KX0sCi0gICAgeyJsZGZwOC5jLm5jIiwJTEQgKDB4MjUsIDAsIEMxNil9LAotICAgIHsibGRmcDguYy5uYy5udDEiLAlMRCAoMHgyNSwgMSwgQzE2KX0sCi0gICAgeyJsZGZwOC5jLm5jLm50YSIsCUxEICgweDI1LCAzLCBDMTYpfSwKLSN1bmRlZiBMRAotCi0gICAgLyogbGluZSBwcmVmZXRjaCAqLwotICAgIHsibGZldGNoIiwJCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmMsIDApLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2gubnQxIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyYywgMSksIHtNUjN9fSwKLSAgICB7ImxmZXRjaC5udDIiLAkJTTAsIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDJjLCAyKSwge01SM319LAotICAgIHsibGZldGNoLm50YSIsCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmMsIDMpLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZXhjbCIsCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmQsIDApLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZXhjbC5udDEiLAkJTTAsIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDJkLCAxKSwge01SM319LAotICAgIHsibGZldGNoLmV4Y2wubnQyIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyZCwgMiksIHtNUjN9fSwKLSAgICB7ImxmZXRjaC5leGNsLm50YSIsCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmQsIDMpLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQiLAkJTTAsIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDJlLCAwKSwge01SM319LAotICAgIHsibGZldGNoLmZhdWx0Lm50MSIsCU0wLCBPcE1YWDZhSGludCAoNiwgMCwgMCwgMHgyZSwgMSksIHtNUjN9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5udDIiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmUsIDIpLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQubnRhIiwJTTAsIE9wTVhYNmFIaW50ICg2LCAwLCAwLCAweDJlLCAzKSwge01SM319LAotICAgIHsibGZldGNoLmZhdWx0LmV4Y2wiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmYsIDApLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbC5udDEiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmYsIDEpLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbC5udDIiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmYsIDIpLCB7TVIzfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbC5udGEiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDAsIDAsIDB4MmYsIDMpLCB7TVIzfX0sCi0KLSAgICAvKiBsaW5lIHByZWZldGNoIHcvaW5jcmVtZW50IGJ5IHJlZ2lzdGVyICovCi0gICAgeyJsZmV0Y2giLAkJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyYywgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2gubnQxIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyYywgMSksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2gubnQyIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyYywgMiksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2gubnRhIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyYywgMyksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2guZXhjbCIsCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MmQsIDApLCB7TVIzLCBSMn19LAotICAgIHsibGZldGNoLmV4Y2wubnQxIiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyZCwgMSksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2guZXhjbC5udDIiLAkJTTAsIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDJkLCAyKSwge01SMywgUjJ9fSwKLSAgICB7ImxmZXRjaC5leGNsLm50YSIsCQlNMCwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MmQsIDMpLCB7TVIzLCBSMn19LAotICAgIHsibGZldGNoLmZhdWx0IiwJCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyZSwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQubnQxIiwJTTAsIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDJlLCAxKSwge01SMywgUjJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5udDIiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MmUsIDIpLCB7TVIzLCBSMn19LAotICAgIHsibGZldGNoLmZhdWx0Lm50YSIsCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyZSwgMyksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbCIsCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyZiwgMCksIHtNUjMsIFIyfX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbC5udDEiLAlNMCwgT3BNWFg2YUhpbnQgKDYsIDEsIDAsIDB4MmYsIDEpLCB7TVIzLCBSMn19LAotICAgIHsibGZldGNoLmZhdWx0LmV4Y2wubnQyIiwJTTAsIE9wTVhYNmFIaW50ICg2LCAxLCAwLCAweDJmLCAyKSwge01SMywgUjJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5leGNsLm50YSIsCU0wLCBPcE1YWDZhSGludCAoNiwgMSwgMCwgMHgyZiwgMyksIHtNUjMsIFIyfX0sCi0KLSAgICAvKiBzZW1hcGhvcmUgb3BlcmF0aW9ucyAqLwotICAgIHsic2V0Zi5zaWciLAlNLCBPcE1YWDZhICg2LCAwLCAxLCAweDFjKSwge0YxLCBSMn19LAotICAgIHsic2V0Zi5leHAiLAlNLCBPcE1YWDZhICg2LCAwLCAxLCAweDFkKSwge0YxLCBSMn19LAotICAgIHsic2V0Zi5zIiwJCU0sIE9wTVhYNmEgKDYsIDAsIDEsIDB4MWUpLCB7RjEsIFIyfX0sCi0gICAgeyJzZXRmLmQiLAkJTSwgT3BNWFg2YSAoNiwgMCwgMSwgMHgxZiksIHtGMSwgUjJ9fSwKLQotICAgIHsibGRmcyIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MDIsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZnMubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDAyLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZzLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwMiwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZCIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MDMsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmQubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDAzLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZkLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwMywgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOCIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MDEsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZjgubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDAxLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGY4Lm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwMSwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZSIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MDAsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmUubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDAwLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZlLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwMCwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5zIiwJCU0sIE9wWDZhSGludCAoNywgMHgwNiwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5zLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwNiwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5zLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwNiwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5zIiwJCU0sIE9wWDZhSGludCAoNywgMHgwNywgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5zLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwNywgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5zLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwNywgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5zIiwJCU0sIE9wWDZhSGludCAoNywgMHgwNSwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5zLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwNSwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5zLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwNSwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5zIiwJCU0sIE9wWDZhSGludCAoNywgMHgwNCwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5zLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwNCwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5zLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwNCwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5hIiwJCU0sIE9wWDZhSGludCAoNywgMHgwYSwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5hLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwYSwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5hLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwYSwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5hIiwJCU0sIE9wWDZhSGludCAoNywgMHgwYiwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5hLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwYiwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5hLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwYiwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5hIiwJCU0sIE9wWDZhSGludCAoNywgMHgwOSwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5hLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwOSwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5hLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwOSwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5hIiwJCU0sIE9wWDZhSGludCAoNywgMHgwOCwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5hLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgwOCwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5hLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwOCwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5zYSIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MGUsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZnMuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDBlLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZzLnNhLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwZSwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5zYSIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MGYsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmQuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDBmLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZkLnNhLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwZiwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5zYSIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MGQsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZjguc2EubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDBkLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGY4LnNhLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwZCwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5zYSIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MGMsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmUuc2EubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDBjLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZlLnNhLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgwYywgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmLmZpbGwiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MWIsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZi5maWxsLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgxYiwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmLmZpbGwubnRhIiwJTSwgT3BYNmFIaW50ICg3LCAweDFiLCAzKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZzLmMuY2xyIiwJTSwgT3BYNmFIaW50ICg3LCAweDIyLCAwKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZzLmMuY2xyLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgyMiwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5jLmNsci5udGEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjIsIDMpLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmQuYy5jbHIiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjMsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmQuYy5jbHIubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDIzLCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZkLmMuY2xyLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgyMywgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5jLmNsciIsCU0sIE9wWDZhSGludCAoNywgMHgyMSwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmOC5jLmNsci5udDEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjEsIDEpLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZjguYy5jbHIubnRhIiwJTSwgT3BYNmFIaW50ICg3LCAweDIxLCAzKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZlLmMuY2xyIiwJTSwgT3BYNmFIaW50ICg3LCAweDIwLCAwKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZlLmMuY2xyLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgyMCwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5jLmNsci5udGEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjAsIDMpLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZnMuYy5uYyIsCU0sIE9wWDZhSGludCAoNywgMHgyNiwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5jLm5jLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgyNiwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmcy5jLm5jLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgyNiwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZC5jLm5jIiwJTSwgT3BYNmFIaW50ICg3LCAweDI3LCAwKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZkLmMubmMubnQxIiwJTSwgT3BYNmFIaW50ICg3LCAweDI3LCAxKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGZkLmMubmMubnRhIiwJTSwgT3BYNmFIaW50ICg3LCAweDI3LCAzKSwge0YxLCBNUjMsIElNTTlifX0sCi0gICAgeyJsZGY4LmMubmMiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjUsIDApLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZjguYy5uYy5udDEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjUsIDEpLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZjguYy5uYy5udGEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MjUsIDMpLCB7RjEsIE1SMywgSU1NOWJ9fSwKLSAgICB7ImxkZmUuYy5uYyIsCU0sIE9wWDZhSGludCAoNywgMHgyNCwgMCksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5jLm5jLm50MSIsCU0sIE9wWDZhSGludCAoNywgMHgyNCwgMSksIHtGMSwgTVIzLCBJTU05Yn19LAotICAgIHsibGRmZS5jLm5jLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgyNCwgMyksIHtGMSwgTVIzLCBJTU05Yn19LAotCi0gICAgLyogZmxvYXRpbmctcG9pbnQgc3RvcmUgdy9pbmNyZW1lbnQgYnkgaW1tZWRpYXRlICovCi0gICAgeyJzdGZzIiwJCU0sIE9wWDZhSGludCAoNywgMHgzMiwgMCksIHtNUjMsIEYyLCBJTU05YX19LAotICAgIHsic3Rmcy5udGEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MzIsIDMpLCB7TVIzLCBGMiwgSU1NOWF9fSwKLSAgICB7InN0ZmQiLAkJTSwgT3BYNmFIaW50ICg3LCAweDMzLCAwKSwge01SMywgRjIsIElNTTlhfX0sCi0gICAgeyJzdGZkLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgzMywgMyksIHtNUjMsIEYyLCBJTU05YX19LAotICAgIHsic3RmOCIsCQlNLCBPcFg2YUhpbnQgKDcsIDB4MzEsIDApLCB7TVIzLCBGMiwgSU1NOWF9fSwKLSAgICB7InN0ZjgubnRhIiwJTSwgT3BYNmFIaW50ICg3LCAweDMxLCAzKSwge01SMywgRjIsIElNTTlhfX0sCi0gICAgeyJzdGZlIiwJCU0sIE9wWDZhSGludCAoNywgMHgzMCwgMCksIHtNUjMsIEYyLCBJTU05YX19LAotICAgIHsic3RmZS5udGEiLAlNLCBPcFg2YUhpbnQgKDcsIDB4MzAsIDMpLCB7TVIzLCBGMiwgSU1NOWF9fSwKLSAgICB7InN0Zi5zcGlsbCIsCU0sIE9wWDZhSGludCAoNywgMHgzYiwgMCksIHtNUjMsIEYyLCBJTU05YX19LAotICAgIHsic3RmLnNwaWxsLm50YSIsCU0sIE9wWDZhSGludCAoNywgMHgzYiwgMyksIHtNUjMsIEYyLCBJTU05YX19LAotCi0gICAgLyogbGluZSBwcmVmZXRjaCB3L2luY3JlbWVudCBieSBpbW1lZGlhdGUgKi8KLSAgICB7ImxmZXRjaCIsCQkJTTAsIE9wWDZhSGludCAoNywgMHgyYywgMCksIHtNUjMsIElNTTlifX0sCi0gICAgeyJsZmV0Y2gubnQxIiwJCU0wLCBPcFg2YUhpbnQgKDcsIDB4MmMsIDEpLCB7TVIzLCBJTU05Yn19LAotICAgIHsibGZldGNoLm50MiIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJjLCAyKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5udGEiLAkJTTAsIE9wWDZhSGludCAoNywgMHgyYywgMyksIHtNUjMsIElNTTlifX0sCi0gICAgeyJsZmV0Y2guZXhjbCIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJkLCAwKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5leGNsLm50MSIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJkLCAxKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5leGNsLm50MiIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJkLCAyKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5leGNsLm50YSIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJkLCAzKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdCIsCQlNMCwgT3BYNmFIaW50ICg3LCAweDJlLCAwKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5udDEiLAlNMCwgT3BYNmFIaW50ICg3LCAweDJlLCAxKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5udDIiLAlNMCwgT3BYNmFIaW50ICg3LCAweDJlLCAyKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5udGEiLAlNMCwgT3BYNmFIaW50ICg3LCAweDJlLCAzKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5leGNsIiwJTTAsIE9wWDZhSGludCAoNywgMHgyZiwgMCksIHtNUjMsIElNTTlifX0sCi0gICAgeyJsZmV0Y2guZmF1bHQuZXhjbC5udDEiLAlNMCwgT3BYNmFIaW50ICg3LCAweDJmLCAxKSwge01SMywgSU1NOWJ9fSwKLSAgICB7ImxmZXRjaC5mYXVsdC5leGNsLm50MiIsCU0wLCBPcFg2YUhpbnQgKDcsIDB4MmYsIDIpLCB7TVIzLCBJTU05Yn19LAotICAgIHsibGZldGNoLmZhdWx0LmV4Y2wubnRhIiwJTTAsIE9wWDZhSGludCAoNywgMHgyZiwgMyksIHtNUjMsIElNTTlifX0sCi0KLSAgICB7MH0KLSAgfTsKLQotI3VuZGVmIE0wCi0jdW5kZWYgTQotI3VuZGVmIE0yCi0jdW5kZWYgYk0KLSN1bmRlZiBiWAotI3VuZGVmIGJYMgotI3VuZGVmIGJYMwotI3VuZGVmIGJYNAotI3VuZGVmIGJYNmEKLSN1bmRlZiBiWDZiCi0jdW5kZWYgYkhpbnQKLSN1bmRlZiBtTQotI3VuZGVmIG1YCi0jdW5kZWYgbVgyCi0jdW5kZWYgbVgzCi0jdW5kZWYgbVg0Ci0jdW5kZWYgbVg2YQotI3VuZGVmIG1YNmIKLSN1bmRlZiBtSGludAotI3VuZGVmIE9wWDMKLSN1bmRlZiBPcFgzWDZiCi0jdW5kZWYgT3BYM1g0Ci0jdW5kZWYgT3BYM1g0WDIKLSN1bmRlZiBPcFg2YUhpbnQKLSN1bmRlZiBPcFhYNmFIaW50Ci0jdW5kZWYgT3BNWFg2YQotI3VuZGVmIE9wTVhYNmFIaW50CmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtb3BjLXguYyBiL29wY29kZXMvaWE2NC1vcGMteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMyZDY4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1vcGMteC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qIGlhNjQtb3BjLXguYyAtLSBJQS02NCBgWCcgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVGltb3RoeSBXYWxsIDx0d2FsbEBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImlhNjQtb3BjLmgiCi0KLS8qIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBYLXVuaXQgdHlwZSAqLwotI2RlZmluZSBYMCAgICAgIElBNjRfVFlQRV9YLCAwCi0jZGVmaW5lIFgJSUE2NF9UWVBFX1gsIDEKLQotLyogaW5zdHJ1Y3Rpb24gYml0IGZpZWxkczogKi8KLSNkZWZpbmUgYkJ0eXBlKHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4NykpIDw8IDYpCi0jZGVmaW5lIGJEKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAzNSkKLSNkZWZpbmUgYlBhKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAxMikKLSNkZWZpbmUgYlByKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDNmKSkgPDwgMCkKLSNkZWZpbmUgYlZjKHgpCQkoKChpYTY0X2luc24pICgoeCkgJiAweDEpKSA8PCAyMCkKLSNkZWZpbmUgYldoYSh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzKSkgPDwgMzMpCi0jZGVmaW5lIGJYMyh4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHg3KSkgPDwgMzMpCi0jZGVmaW5lIGJYNih4KQkJKCgoaWE2NF9pbnNuKSAoKHgpICYgMHgzZikpIDw8IDI3KQotCi0jZGVmaW5lIG1CdHlwZQkJYkJ0eXBlICgtMSkKLSNkZWZpbmUgbUQJCWJEICgtMSkKLSNkZWZpbmUgbVBhCQliUGEgKC0xKQotI2RlZmluZSBtUHIJCWJQciAoLTEpCi0jZGVmaW5lIG1WYyAgICAgICAgICAgICBiVmMgKC0xKQotI2RlZmluZSBtV2hhCQliV2hhICgtMSkKLSNkZWZpbmUgbVgzICAgICAgICAgICAgIGJYMyAoLTEpCi0jZGVmaW5lIG1YNgkJYlg2ICgtMSkKLQotI2RlZmluZSBPcFgzWDYoYSxiLGMpCQkoYk9wIChhKSB8IGJYMyAoYikgfCBiWDYoYykpLCBcCi0JCQkJKG1PcCB8IG1YMyB8IG1YNikKLSNkZWZpbmUgT3BWYyhhLGIpCQkoYk9wIChhKSB8IGJWYyAoYikpLCAobU9wIHwgbVZjKQotI2RlZmluZSBPcFBhV2hhRChhLGIsYyxkKSBcCi0JKGJPcCAoYSkgfCBiUGEgKGIpIHwgYldoYSAoYykgfCBiRCAoZCkpLCAobU9wIHwgbVBhIHwgbVdoYSB8IG1EKQotI2RlZmluZSBPcEJ0eXBlUGFXaGFEKGEsYixjLGQsZSkgXAotCShiT3AgKGEpIHwgYkJ0eXBlIChiKSB8IGJQYSAoYykgfCBiV2hhIChkKSB8IGJEIChlKSksIFwKLQkobU9wIHwgbUJ0eXBlIHwgbVBhIHwgbVdoYSB8IG1EKQotI2RlZmluZSBPcEJ0eXBlUGFXaGFEUHIoYSxiLGMsZCxlLGYpIFwKLQkoYk9wIChhKSB8IGJCdHlwZSAoYikgfCBiUGEgKGMpIHwgYldoYSAoZCkgfCBiRCAoZSkgfCBiUHIgKGYpKSwgXAotCShtT3AgfCBtQnR5cGUgfCBtUGEgfCBtV2hhIHwgbUQgfCBtUHIpCi0KLXN0cnVjdCBpYTY0X29wY29kZSBpYTY0X29wY29kZXNfeFtdID0KLSAgewotICAgIHsiYnJlYWsueCIsIFgwLCBPcFgzWDYgKDAsIDAsIDB4MDApLCB7SU1NVTYyfX0sCi0gICAgeyJub3AueCIsICAgWDAsIE9wWDNYNiAoMCwgMCwgMHgwMSksIHtJTU1VNjJ9fSwKLSAgICB7Im1vdmwiLAlYLCAgT3BWYyAoNiwgMCksIHtSMSwgSU1NVTY0fX0sCi0jZGVmaW5lIEJSTChhLGIpIFwKLSAgICAgIFgwLCBPcEJ0eXBlUGFXaGFEUHIgKDB4QywgMCwgYSwgMCwgYiwgMCksIHtUR1Q2NH0sIDAKLSAgICB7ImJybC5mZXciLCAgICAgICAgIEJSTCAoMCwgMCkgfCBQU0VVRE99LAotICAgIHsiYnJsIiwgICAgICAgICAgICAgQlJMICgwLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwuZmV3LmNsciIsCUJSTCAoMCwgMSkgfCBQU0VVRE99LAotICAgIHsiYnJsLmNsciIsCQlCUkwgKDAsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJybC5tYW55IiwJQlJMICgxLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwubWFueS5jbHIiLAlCUkwgKDEsIDEpIHwgUFNFVURPfSwKLSN1bmRlZiBCUkwKLSNkZWZpbmUgQlJMKGEsYixjKSBcCi0gICAgICBYMCwgT3BCdHlwZVBhV2hhRCAoMHhDLCAwLCBhLCBiLCBjKSwge1RHVDY0fSwgMAotICAgIHsiYnJsLmNvbmQuc3B0ay5mZXciLAlCUkwgKDAsIDAsIDApfSwKLSAgICB7ImJybC5jb25kLnNwdGsiLAkJQlJMICgwLCAwLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwuY29uZC5zcHRrLmZldy5jbHIiLAlCUkwgKDAsIDAsIDEpfSwKLSAgICB7ImJybC5jb25kLnNwdGsuY2xyIiwJQlJMICgwLCAwLCAxKSB8IFBTRVVET30sCi0gICAgeyJicmwuY29uZC5zcG50LmZldyIsCUJSTCAoMCwgMSwgMCl9LAotICAgIHsiYnJsLmNvbmQuc3BudCIsCQlCUkwgKDAsIDEsIDApIHwgUFNFVURPfSwKLSAgICB7ImJybC5jb25kLnNwbnQuZmV3LmNsciIsCUJSTCAoMCwgMSwgMSl9LAotICAgIHsiYnJsLmNvbmQuc3BudC5jbHIiLAlCUkwgKDAsIDEsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJybC5jb25kLmRwdGsuZmV3IiwJQlJMICgwLCAyLCAwKX0sCi0gICAgeyJicmwuY29uZC5kcHRrIiwJCUJSTCAoMCwgMiwgMCkgfCBQU0VVRE99LAotICAgIHsiYnJsLmNvbmQuZHB0ay5mZXcuY2xyIiwJQlJMICgwLCAyLCAxKX0sCi0gICAgeyJicmwuY29uZC5kcHRrLmNsciIsCUJSTCAoMCwgMiwgMSkgfCBQU0VVRE99LAotICAgIHsiYnJsLmNvbmQuZHBudC5mZXciLAlCUkwgKDAsIDMsIDApfSwKLSAgICB7ImJybC5jb25kLmRwbnQiLAkJQlJMICgwLCAzLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwuY29uZC5kcG50LmZldy5jbHIiLAlCUkwgKDAsIDMsIDEpfSwKLSAgICB7ImJybC5jb25kLmRwbnQuY2xyIiwJQlJMICgwLCAzLCAxKSB8IFBTRVVET30sCi0gICAgeyJicmwuY29uZC5zcHRrLm1hbnkiLAlCUkwgKDEsIDAsIDApfSwKLSAgICB7ImJybC5jb25kLnNwdGsubWFueS5jbHIiLAlCUkwgKDEsIDAsIDEpfSwKLSAgICB7ImJybC5jb25kLnNwbnQubWFueSIsCUJSTCAoMSwgMSwgMCl9LAotICAgIHsiYnJsLmNvbmQuc3BudC5tYW55LmNsciIsCUJSTCAoMSwgMSwgMSl9LAotICAgIHsiYnJsLmNvbmQuZHB0ay5tYW55IiwJQlJMICgxLCAyLCAwKX0sCi0gICAgeyJicmwuY29uZC5kcHRrLm1hbnkuY2xyIiwJQlJMICgxLCAyLCAxKX0sCi0gICAgeyJicmwuY29uZC5kcG50Lm1hbnkiLAlCUkwgKDEsIDMsIDApfSwKLSAgICB7ImJybC5jb25kLmRwbnQubWFueS5jbHIiLAlCUkwgKDEsIDMsIDEpfSwKLSAgICB7ImJybC5zcHRrLmZldyIsCQlCUkwgKDAsIDAsIDApfSwKLSAgICB7ImJybC5zcHRrIiwJCUJSTCAoMCwgMCwgMCkgfCBQU0VVRE99LAotICAgIHsiYnJsLnNwdGsuZmV3LmNsciIsCUJSTCAoMCwgMCwgMSl9LAotICAgIHsiYnJsLnNwdGsuY2xyIiwJCUJSTCAoMCwgMCwgMSkgfCBQU0VVRE99LAotICAgIHsiYnJsLnNwbnQuZmV3IiwJCUJSTCAoMCwgMSwgMCl9LAotICAgIHsiYnJsLnNwbnQiLAkJQlJMICgwLCAxLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwuc3BudC5mZXcuY2xyIiwJQlJMICgwLCAxLCAxKX0sCi0gICAgeyJicmwuc3BudC5jbHIiLAkJQlJMICgwLCAxLCAxKSB8IFBTRVVET30sCi0gICAgeyJicmwuZHB0ay5mZXciLAkJQlJMICgwLCAyLCAwKX0sCi0gICAgeyJicmwuZHB0ayIsCQlCUkwgKDAsIDIsIDApIHwgUFNFVURPfSwKLSAgICB7ImJybC5kcHRrLmZldy5jbHIiLAlCUkwgKDAsIDIsIDEpfSwKLSAgICB7ImJybC5kcHRrLmNsciIsCQlCUkwgKDAsIDIsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJybC5kcG50LmZldyIsCQlCUkwgKDAsIDMsIDApfSwKLSAgICB7ImJybC5kcG50IiwJCUJSTCAoMCwgMywgMCkgfCBQU0VVRE99LAotICAgIHsiYnJsLmRwbnQuZmV3LmNsciIsCUJSTCAoMCwgMywgMSl9LAotICAgIHsiYnJsLmRwbnQuY2xyIiwJCUJSTCAoMCwgMywgMSkgfCBQU0VVRE99LAotICAgIHsiYnJsLnNwdGsubWFueSIsCQlCUkwgKDEsIDAsIDApfSwKLSAgICB7ImJybC5zcHRrLm1hbnkuY2xyIiwJQlJMICgxLCAwLCAxKX0sCi0gICAgeyJicmwuc3BudC5tYW55IiwJCUJSTCAoMSwgMSwgMCl9LAotICAgIHsiYnJsLnNwbnQubWFueS5jbHIiLAlCUkwgKDEsIDEsIDEpfSwKLSAgICB7ImJybC5kcHRrLm1hbnkiLAkJQlJMICgxLCAyLCAwKX0sCi0gICAgeyJicmwuZHB0ay5tYW55LmNsciIsCUJSTCAoMSwgMiwgMSl9LAotICAgIHsiYnJsLmRwbnQubWFueSIsCQlCUkwgKDEsIDMsIDApfSwKLSAgICB7ImJybC5kcG50Lm1hbnkuY2xyIiwJQlJMICgxLCAzLCAxKX0sCi0jdW5kZWYgQlJMCi0jZGVmaW5lIEJSTChhLGIsYykgWCwgT3BQYVdoYUQgKDB4RCwgYSwgYiwgYyksIHtCMSwgVEdUNjR9LCAwCi0gICAgeyJicmwuY2FsbC5zcHRrLmZldyIsCUJSTCAoMCwgMCwgMCl9LAotICAgIHsiYnJsLmNhbGwuc3B0ayIsCQlCUkwgKDAsIDAsIDApIHwgUFNFVURPfSwKLSAgICB7ImJybC5jYWxsLnNwdGsuZmV3LmNsciIsCUJSTCAoMCwgMCwgMSl9LAotICAgIHsiYnJsLmNhbGwuc3B0ay5jbHIiLAlCUkwgKDAsIDAsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJybC5jYWxsLnNwbnQuZmV3IiwJQlJMICgwLCAxLCAwKX0sCi0gICAgeyJicmwuY2FsbC5zcG50IiwJCUJSTCAoMCwgMSwgMCkgfCBQU0VVRE99LAotICAgIHsiYnJsLmNhbGwuc3BudC5mZXcuY2xyIiwJQlJMICgwLCAxLCAxKX0sCi0gICAgeyJicmwuY2FsbC5zcG50LmNsciIsCUJSTCAoMCwgMSwgMSkgfCBQU0VVRE99LAotICAgIHsiYnJsLmNhbGwuZHB0ay5mZXciLAlCUkwgKDAsIDIsIDApfSwKLSAgICB7ImJybC5jYWxsLmRwdGsiLAkJQlJMICgwLCAyLCAwKSB8IFBTRVVET30sCi0gICAgeyJicmwuY2FsbC5kcHRrLmZldy5jbHIiLAlCUkwgKDAsIDIsIDEpfSwKLSAgICB7ImJybC5jYWxsLmRwdGsuY2xyIiwJQlJMICgwLCAyLCAxKSB8IFBTRVVET30sCi0gICAgeyJicmwuY2FsbC5kcG50LmZldyIsCUJSTCAoMCwgMywgMCl9LAotICAgIHsiYnJsLmNhbGwuZHBudCIsCQlCUkwgKDAsIDMsIDApIHwgUFNFVURPfSwKLSAgICB7ImJybC5jYWxsLmRwbnQuZmV3LmNsciIsCUJSTCAoMCwgMywgMSl9LAotICAgIHsiYnJsLmNhbGwuZHBudC5jbHIiLAlCUkwgKDAsIDMsIDEpIHwgUFNFVURPfSwKLSAgICB7ImJybC5jYWxsLnNwdGsubWFueSIsCUJSTCAoMSwgMCwgMCl9LAotICAgIHsiYnJsLmNhbGwuc3B0ay5tYW55LmNsciIsCUJSTCAoMSwgMCwgMSl9LAotICAgIHsiYnJsLmNhbGwuc3BudC5tYW55IiwJQlJMICgxLCAxLCAwKX0sCi0gICAgeyJicmwuY2FsbC5zcG50Lm1hbnkuY2xyIiwJQlJMICgxLCAxLCAxKX0sCi0gICAgeyJicmwuY2FsbC5kcHRrLm1hbnkiLAlCUkwgKDEsIDIsIDApfSwKLSAgICB7ImJybC5jYWxsLmRwdGsubWFueS5jbHIiLAlCUkwgKDEsIDIsIDEpfSwKLSAgICB7ImJybC5jYWxsLmRwbnQubWFueSIsCUJSTCAoMSwgMywgMCl9LAotICAgIHsiYnJsLmNhbGwuZHBudC5tYW55LmNsciIsCUJSTCAoMSwgMywgMSl9LAotI3VuZGVmIEJSTAotICAgIHswfQotICB9OwotCi0jdW5kZWYgWDAKLSN1bmRlZiBYCi0KLSN1bmRlZiBiQnR5cGUKLSN1bmRlZiBiRAotI3VuZGVmIGJQYQotI3VuZGVmIGJQcgotI3VuZGVmIGJWYwotI3VuZGVmIGJXaGEKLSN1bmRlZiBiWDMKLSN1bmRlZiBiWDYKLQotI3VuZGVmIG1CdHlwZQotI3VuZGVmIG1ECi0jdW5kZWYgbVBhCi0jdW5kZWYgbVByCi0jdW5kZWYgbVZjCi0jdW5kZWYgbVdoYQotI3VuZGVmIG1YMwotI3VuZGVmIG1YNgotCi0jdW5kZWYgT3BYM1g2Ci0jdW5kZWYgT3BWYwotI3VuZGVmIE9wUGFXaGFECi0jdW5kZWYgT3BCdHlwZVBhV2hhRAotI3VuZGVmIE9wQnR5cGVQYVdoYURQcgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pYTY0LW9wYy5jIGIvb3Bjb2Rlcy9pYTY0LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDU0YjNkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKiBpYTY0LW9wYy5jIC0tIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIGNvbXBhY3RlZCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQm9iIE1hbnNvbiBvZiBDeWdudXMgU29sdXRpb25zLCA8bWFuc29uQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJpYTY0LWFzbXRhYi5oIgotI2luY2x1ZGUgImlhNjQtYXNtdGFiLmMiCi0KLWNvbnN0IHN0cnVjdCBpYTY0X3RlbXBsX2Rlc2MgaWE2NF90ZW1wbF9kZXNjWzE2XSA9Ci0gIHsKLSAgICB7IDAsIHsgSUE2NF9VTklUX00sIElBNjRfVU5JVF9JLCBJQTY0X1VOSVRfSSB9LCAiTUlJIiB9LAkvKiAwICovCi0gICAgeyAyLCB7IElBNjRfVU5JVF9NLCBJQTY0X1VOSVRfSSwgSUE2NF9VTklUX0kgfSwgIk1JSSIgfSwKLSAgICB7IDAsIHsgSUE2NF9VTklUX00sIElBNjRfVU5JVF9MLCBJQTY0X1VOSVRfWCB9LCAiTUxYIiB9LAotICAgIHsgMCwgeyAwLCB9LAkJCQkgICAgIi0zLSIgfSwKLSAgICB7IDAsIHsgSUE2NF9VTklUX00sIElBNjRfVU5JVF9NLCBJQTY0X1VOSVRfSSB9LCAiTU1JIiB9LAkvKiA0ICovCi0gICAgeyAxLCB7IElBNjRfVU5JVF9NLCBJQTY0X1VOSVRfTSwgSUE2NF9VTklUX0kgfSwgIk1NSSIgfSwKLSAgICB7IDAsIHsgSUE2NF9VTklUX00sIElBNjRfVU5JVF9GLCBJQTY0X1VOSVRfSSB9LCAiTUZJIiB9LAotICAgIHsgMCwgeyBJQTY0X1VOSVRfTSwgSUE2NF9VTklUX00sIElBNjRfVU5JVF9GIH0sICJNTUYiIH0sCi0gICAgeyAwLCB7IElBNjRfVU5JVF9NLCBJQTY0X1VOSVRfSSwgSUE2NF9VTklUX0IgfSwgIk1JQiIgfSwJLyogOCAqLwotICAgIHsgMCwgeyBJQTY0X1VOSVRfTSwgSUE2NF9VTklUX0IsIElBNjRfVU5JVF9CIH0sICJNQkIiIH0sCi0gICAgeyAwLCB7IDAsIH0sCQkJCSAgICAiLWEtIiB9LAotICAgIHsgMCwgeyBJQTY0X1VOSVRfQiwgSUE2NF9VTklUX0IsIElBNjRfVU5JVF9CIH0sICJCQkIiIH0sCi0gICAgeyAwLCB7IElBNjRfVU5JVF9NLCBJQTY0X1VOSVRfTSwgSUE2NF9VTklUX0IgfSwgIk1NQiIgfSwJLyogYyAqLwotICAgIHsgMCwgeyAwLCB9LAkJCQkgICAgIi1kLSIgfSwKLSAgICB7IDAsIHsgSUE2NF9VTklUX00sIElBNjRfVU5JVF9GLCBJQTY0X1VOSVRfQiB9LCAiTUZCIiB9LAotICAgIHsgMCwgeyAwLCB9LAkJCQkgICAgIi1mLSIgfSwKLSAgfTsKLQotCi0vKiBDb3B5IHRoZSBwcmVmaXggY29udGFpbmVkIGluICpQVFIgKHVwIHRvIGEgJy4nIG9yIGEgTlVMKSB0byBERVNULgotICAgUFRSIHdpbGwgYmUgYWRqdXN0ZWQgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHBvcnRpb24KLSAgIG9mIHRoZSBvcGNvZGUsIG9yIGF0IHRoZSBOVUwgY2hhcmFjdGVyLiAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X29wY19wcmVmaXggKHB0ciwgZGVzdCkKLSAgICAgY29uc3QgY2hhciAqKnB0cjsKLSAgICAgY2hhciAqZGVzdDsKLXsKLSAgY2hhciAqYyA9IHN0cmNociAoKnB0ciwgJy4nKTsKLSAgaWYgKGMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtZW1jcHkgKGRlc3QsICpwdHIsIGMgLSAqcHRyKTsKLSAgICAgIGRlc3RbYyAtICpwdHJdID0gJ1wwJzsKLSAgICAgICpwdHIgPSBjICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgbCA9IHN0cmxlbiAoKnB0cik7Ci0gICAgICBtZW1jcHkgKGRlc3QsICpwdHIsIGwpOwotICAgICAgZGVzdFtsXSA9ICdcMCc7Ci0gICAgICAqcHRyICs9IGw7Ci0gICAgfQotfQotDAotLyogRmluZCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgY29ycmVzcG9uZGluZyB0bwotICAgU1RSOyByZXR1cm4gLTEgaWYgb25lIGRvZXMgbm90IGV4aXN0LiAqLwotCi1zdGF0aWMgc2hvcnQKLWZpbmRfc3RyaW5nX2VudCAoc3RyKQotICAgICBjb25zdCBjaGFyICpzdHI7Ci17Ci0gIHNob3J0IHN0YXJ0ID0gMDsKLSAgc2hvcnQgZW5kID0gc2l6ZW9mIChpYTY0X3N0cmluZ3MpIC8gc2l6ZW9mIChjb25zdCBjaGFyICopOwotICBzaG9ydCBpID0gKHN0YXJ0ICsgZW5kKSAvIDI7Ci0KLSAgaWYgKHN0cmNtcCAoc3RyLCBpYTY0X3N0cmluZ3NbZW5kIC0gMV0pID4gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB3aGlsZSAoc3RhcnQgPD0gZW5kKQotICAgIHsKLSAgICAgIGludCBjID0gc3RyY21wIChzdHIsIGlhNjRfc3RyaW5nc1tpXSk7Ci0gICAgICBpZiAoYyA8IDApCi0JewotCSAgZW5kID0gaSAtIDE7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAwKQotCXsKLQkgIHJldHVybiBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGFydCA9IGkgKyAxOwotCX0KLSAgICAgIGkgPSAoc3RhcnQgKyBlbmQpIC8gMjsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KLQwKLS8qIEZpbmQgdGhlIG9wY29kZSBpbiB0aGUgbWFpbiBvcGNvZGUgdGFibGUgd2hvc2UgbmFtZSBpcyBTVFJJTkdJTkRFWCwgb3IKLSAgIHJldHVybiAtMSBpZiBvbmUgZG9lcyBub3QgZXhpc3QuICovCi0KLXN0YXRpYyBzaG9ydAotZmluZF9tYWluX2VudCAobmFtZWluZGV4KQotICAgICBzaG9ydCBuYW1laW5kZXg7Ci17Ci0gIHNob3J0IHN0YXJ0ID0gMDsKLSAgc2hvcnQgZW5kID0gc2l6ZW9mIChtYWluX3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IGlhNjRfbWFpbl90YWJsZSk7Ci0gIHNob3J0IGkgPSAoc3RhcnQgKyBlbmQpIC8gMjsKLQotICBpZiAobmFtZWluZGV4IDwgbWFpbl90YWJsZVswXS5uYW1lX2luZGV4Ci0gICAgICB8fCBuYW1laW5kZXggPiBtYWluX3RhYmxlW2VuZCAtIDFdLm5hbWVfaW5kZXgpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWluZGV4IDwgbWFpbl90YWJsZVtpXS5uYW1lX2luZGV4KQotCXsKLQkgIGVuZCA9IGkgLSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG5hbWVpbmRleCA9PSBtYWluX3RhYmxlW2ldLm5hbWVfaW5kZXgpCi0JewotCSAgd2hpbGUgKGkgPiAwICYmIG1haW5fdGFibGVbaSAtIDFdLm5hbWVfaW5kZXggPT0gbmFtZWluZGV4KQotCSAgICB7Ci0JICAgICAgaS0tOwotCSAgICB9Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhcnQgPSBpICsgMTsKLQl9Ci0gICAgICBpID0gKHN0YXJ0ICsgZW5kKSAvIDI7Ci0gICAgfQotICByZXR1cm4gLTE7Ci19Ci0MCi0vKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGNvbXBsZXRlciB0YWJsZSB0aGF0IGlzIHBhcnQgb2YKLSAgIE1BSU5fRU5UIChzdGFydGluZyBmcm9tIFBSRVZfQ09NUExFVEVSKSB0aGF0IG1hdGNoZXMgTkFNRSwgb3IKLSAgIHJldHVybiAtMSBpZiBvbmUgZG9lcyBub3QgZXhpc3QuICovCi0KLXN0YXRpYyBzaG9ydCAKLWZpbmRfY29tcGxldGVyIChtYWluX2VudCwgcHJldl9jb21wbGV0ZXIsIG5hbWUpCi0gICAgIHNob3J0IG1haW5fZW50OwotICAgICBzaG9ydCBwcmV2X2NvbXBsZXRlcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc2hvcnQgbmFtZV9pbmRleCA9IGZpbmRfc3RyaW5nX2VudCAobmFtZSk7Ci0KLSAgaWYgKG5hbWVfaW5kZXggPCAwKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKHByZXZfY29tcGxldGVyID09IC0xKQotICAgIHsKLSAgICAgIHByZXZfY29tcGxldGVyID0gbWFpbl90YWJsZVttYWluX2VudF0uY29tcGxldGVyczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X2NvbXBsZXRlciA9IGNvbXBsZXRlcl90YWJsZVtwcmV2X2NvbXBsZXRlcl0uc3ViZW50cmllczsKLSAgICB9Ci0KLSAgd2hpbGUgKHByZXZfY29tcGxldGVyICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChjb21wbGV0ZXJfdGFibGVbcHJldl9jb21wbGV0ZXJdLm5hbWVfaW5kZXggPT0gbmFtZV9pbmRleCkKLQl7Ci0JICByZXR1cm4gcHJldl9jb21wbGV0ZXI7Ci0JfQotICAgICAgcHJldl9jb21wbGV0ZXIgPSBjb21wbGV0ZXJfdGFibGVbcHJldl9jb21wbGV0ZXJdLmFsdGVybmF0aXZlOwotICAgIH0KLSAgcmV0dXJuIC0xOwotfQotDAotLyogQXBwbHkgdGhlIGNvbXBsZXRlciByZWZlcnJlZCB0byBieSBDT01QTEVURVJfSU5ERVggdG8gT1BDT0RFLCBhbmQKLSAgIHJldHVybiB0aGUgcmVzdWx0LiAqLwotCi1zdGF0aWMgaWE2NF9pbnNuCi1hcHBseV9jb21wbGV0ZXIgKG9wY29kZSwgY29tcGxldGVyX2luZGV4KQotICAgICBpYTY0X2luc24gb3Bjb2RlOwotICAgICBpbnQgY29tcGxldGVyX2luZGV4OwotewotICBpYTY0X2luc24gbWFzayA9IGNvbXBsZXRlcl90YWJsZVtjb21wbGV0ZXJfaW5kZXhdLm1hc2s7Ci0gIGlhNjRfaW5zbiBiaXRzID0gY29tcGxldGVyX3RhYmxlW2NvbXBsZXRlcl9pbmRleF0uYml0czsKLSAgaW50IHNoaWZ0YW10ID0gKGNvbXBsZXRlcl90YWJsZVtjb21wbGV0ZXJfaW5kZXhdLm9mZnNldCAmIDYzKTsKLQotICBtYXNrID0gbWFzayA8PCBzaGlmdGFtdDsKLSAgYml0cyA9IGJpdHMgPDwgc2hpZnRhbXQ7Ci0gIG9wY29kZSA9IChvcGNvZGUgJiB+bWFzaykgfCBiaXRzOwotICByZXR1cm4gb3Bjb2RlOwotfQotDAotLyogRXh0cmFjdCBCSVRTIG51bWJlciBvZiBiaXRzIHN0YXJ0aW5nIGZyb20gT1BfUE9JTlRFUiArIEJJVE9GRlNFVCBpbgotICAgdGhlIGRpc190YWJsZSBhcnJheSwgYW5kIHJldHVybiBpdHMgdmFsdWUuICAoQklUT0ZGU0VUIGlzIG51bWJlcmVkCi0gICBzdGFydGluZyBmcm9tIE1TQiB0byBMU0IsIHNvIGEgQklUT0ZGU0VUIG9mIDAgaW5kaWNhdGVzIHRoZSBNU0Igb2YgdGhlCi0gICBmaXJzdCBieXRlIGluIE9QX1BPSU5URVIuKSAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X29wX2JpdHMgKG9wX3BvaW50ZXIsIGJpdG9mZnNldCwgYml0cykKLSAgICAgaW50IG9wX3BvaW50ZXI7Ci0gICAgIGludCBiaXRvZmZzZXQ7Ci0gICAgIGludCBiaXRzOwotewotICBpbnQgcmVzID0gMDsKLQotICBvcF9wb2ludGVyICs9IChiaXRvZmZzZXQgLyA4KTsKLQotICBpZiAoYml0b2Zmc2V0ICUgOCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb3AgPSBkaXNfdGFibGVbb3BfcG9pbnRlcisrXTsKLSAgICAgIGludCBudW1iID0gOCAtIChiaXRvZmZzZXQgJSA4KTsKLSAgICAgIGludCBtYXNrID0gKDEgPDwgbnVtYikgLSAxOwotICAgICAgaW50IGJhdGEgPSAoYml0cyA8IG51bWIpID8gYml0cyA6IG51bWI7Ci0gICAgICBpbnQgZGVsdGEgPSBudW1iIC0gYmF0YTsKLQotICAgICAgcmVzID0gKHJlcyA8PCBiYXRhKSB8ICgob3AgJiBtYXNrKSA+PiBkZWx0YSk7Ci0gICAgICBiaXRvZmZzZXQgKz0gYmF0YTsKLSAgICAgIGJpdHMgLT0gYmF0YTsKLSAgICB9Ci0gIHdoaWxlIChiaXRzID49IDgpCi0gICAgewotICAgICAgcmVzID0gKHJlcyA8PCA4KSB8IChkaXNfdGFibGVbb3BfcG9pbnRlcisrXSAmIDI1NSk7Ci0gICAgICBiaXRzIC09IDg7Ci0gICAgfQotICBpZiAoYml0cyA+IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9wID0gKGRpc190YWJsZVtvcF9wb2ludGVyKytdICYgMjU1KTsKLSAgICAgIHJlcyA9IChyZXMgPDwgYml0cykgfCAob3AgPj4gKDggLSBiaXRzKSk7Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotDAotLyogRXhhbWluZSB0aGUgc3RhdGUgbWFjaGluZSBlbnRyeSBhdCBPUF9QT0lOVEVSIGluIHRoZSBkaXNfdGFibGUKLSAgIGFycmF5LCBhbmQgZXh0cmFjdCBpdHMgdmFsdWVzIGludG8gT1BWQUwgYW5kIE9QLiAgVGhlIGxlbmd0aCBvZiB0aGUKLSAgIHN0YXRlIGVudHJ5IGluIGJpdHMgaXMgcmV0dXJuZWQuICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfb3AgKG9wX3BvaW50ZXIsIG9wdmFsLCBvcCkKLSAgICAgaW50IG9wX3BvaW50ZXI7Ci0gICAgIGludCAqb3B2YWw7Ci0gICAgIHVuc2lnbmVkIGludCAqb3A7Ci17Ci0gIGludCBvcGxlbiA9IDU7Ci0KLSAgKm9wID0gZGlzX3RhYmxlW29wX3BvaW50ZXJdOwotCi0gIGlmICgoKm9wKSAmIDB4NDApCi0gICAgewotICAgICAgb3B2YWxbMF0gPSBleHRyYWN0X29wX2JpdHMgKG9wX3BvaW50ZXIsIG9wbGVuLCA1KTsKLSAgICAgIG9wbGVuICs9IDU7Ci0gICAgfQotICBzd2l0Y2ggKCgqb3ApICYgMHgzMCkKLSAgICB7Ci0gICAgY2FzZSAweDEwOgotICAgICAgewotCW9wdmFsWzFdID0gZXh0cmFjdF9vcF9iaXRzIChvcF9wb2ludGVyLCBvcGxlbiwgOCk7Ci0Jb3BsZW4gKz0gODsKLQlvcHZhbFsxXSArPSBvcF9wb2ludGVyOwotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgMHgyMDoKLSAgICAgIHsKLQlvcHZhbFsxXSA9IGV4dHJhY3Rfb3BfYml0cyAob3BfcG9pbnRlciwgb3BsZW4sIDE2KTsKLQlpZiAoISAob3B2YWxbMV0gJiAzMjc2OCkpCi0JICB7Ci0JICAgIG9wdmFsWzFdICs9IG9wX3BvaW50ZXI7Ci0JICB9Ci0Jb3BsZW4gKz0gMTY7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAweDMwOgotICAgICAgewotCW9wbGVuLS07Ci0Jb3B2YWxbMl0gPSBleHRyYWN0X29wX2JpdHMgKG9wX3BvaW50ZXIsIG9wbGVuLCAxMik7Ci0Jb3BsZW4gKz0gMTI7Ci0Jb3B2YWxbMl0gfD0gMzI3Njg7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICBpZiAoKCgqb3ApICYgMHgwOCkgJiYgKCgoKm9wKSAmIDB4MzApICE9IDB4MzApKQotICAgIHsKLSAgICAgIG9wdmFsWzJdID0gZXh0cmFjdF9vcF9iaXRzIChvcF9wb2ludGVyLCBvcGxlbiwgMTYpOwotICAgICAgb3BsZW4gKz0gMTY7Ci0gICAgICBpZiAoISAob3B2YWxbMl0gJiAzMjc2OCkpCi0JewotCSAgb3B2YWxbMl0gKz0gb3BfcG9pbnRlcjsKLQl9Ci0gICAgfQotICByZXR1cm4gb3BsZW47Ci19Ci0MCi0vKiBSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgdGhlIG9wY29kZSBpbiB0aGUgbWFpbl90YWJsZSBsaXN0IGF0Ci0gICBQTEFDRSBtYXRjaGVzIE9QQ09ERSBhbmQgaXMgb2YgdHlwZSBUWVBFLiAqLwotCi1zdGF0aWMgaW50Ci1vcGNvZGVfdmVyaWZ5IChvcGNvZGUsIHBsYWNlLCB0eXBlKQotICAgICBpYTY0X2luc24gb3Bjb2RlOwotICAgICBpbnQgcGxhY2U7Ci0gICAgIGVudW0gaWE2NF9pbnNuX3R5cGUgdHlwZTsKLXsKLSAgaWYgKG1haW5fdGFibGVbcGxhY2VdLm9wY29kZV90eXBlICE9IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAobWFpbl90YWJsZVtwbGFjZV0uZmxhZ3MgCi0gICAgICAmIChJQTY0X09QQ09ERV9GMl9FUV9GMyB8IElBNjRfT1BDT0RFX0xFTl9FUV82NE1DTlQpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBpYTY0X29wZXJhbmQgKm8xLCAqbzI7Ci0gICAgICBpYTY0X2luc24gZjIsIGYzOwotCi0gICAgICBpZiAobWFpbl90YWJsZVtwbGFjZV0uZmxhZ3MgJiBJQTY0X09QQ09ERV9GMl9FUV9GMykKLQl7Ci0JICBvMSA9IGVsZjY0X2lhNjRfb3BlcmFuZHMgKyBJQTY0X09QTkRfRjI7Ci0JICBvMiA9IGVsZjY0X2lhNjRfb3BlcmFuZHMgKyBJQTY0X09QTkRfRjM7Ci0JICAoKm8xLT5leHRyYWN0KSAobzEsIG9wY29kZSwgJmYyKTsKLQkgICgqbzItPmV4dHJhY3QpIChvMiwgb3Bjb2RlLCAmZjMpOwotCSAgaWYgKGYyICE9IGYzKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWE2NF9pbnNuIGxlbiwgY291bnQ7Ci0KLQkgIC8qIGxlbmd0aCBtdXN0IGVxdWFsIDY0LWNvdW50OiAqLwotCSAgbzEgPSBlbGY2NF9pYTY0X29wZXJhbmRzICsgSUE2NF9PUE5EX0xFTjY7Ci0JICBvMiA9IGVsZjY0X2lhNjRfb3BlcmFuZHMgKyBtYWluX3RhYmxlW3BsYWNlXS5vcGVyYW5kc1syXTsKLQkgICgqbzEtPmV4dHJhY3QpIChvMSwgb3Bjb2RlLCAmbGVuKTsKLQkgICgqbzItPmV4dHJhY3QpIChvMiwgb3Bjb2RlLCAmY291bnQpOwotCSAgaWYgKGxlbiAhPSA2NCAtIGNvdW50KQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQwKLS8qIEZpbmQgYW4gaW5zdHJ1Y3Rpb24gZW50cnkgaW4gdGhlIGlhNjRfZGlzX25hbWVzIGFycmF5IHRoYXQgbWF0Y2hlcwotICAgb3Bjb2RlIE9QQ09ERSBhbmQgaXMgb2YgdHlwZSBUWVBFLiAgUmV0dXJucyBlaXRoZXIgYSBwb3NpdGl2ZSBpbmRleAotICAgaW50byB0aGUgYXJyYXksIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgYW4gZW50cnkgZm9yIE9QQ09ERSBjb3VsZAotICAgbm90IGJlIGZvdW5kLiAgQ2hlY2tzIGFsbCBtYXRjaGVzIGFuZCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdAotICAgcHJpb3JpdHkuICovCi0KLXN0YXRpYyBpbnQKLWxvY2F0ZV9vcGNvZGVfZW50IChvcGNvZGUsIHR5cGUpCi0gICAgIGlhNjRfaW5zbiBvcGNvZGU7Ci0gICAgIGVudW0gaWE2NF9pbnNuX3R5cGUgdHlwZTsKLXsKLSAgaW50IGN1cnJ0ZXN0WzQxXTsKLSAgaW50IGJpdHBvc1s0MV07Ci0gIGludCBvcF9wdHJbNDFdOwotICBpbnQgY3VycnN0YXRlbnVtID0gMDsKLSAgc2hvcnQgZm91bmRfZGlzZW50ID0gLTE7Ci0gIHNob3J0IGZvdW5kX3ByaW9yaXR5ID0gLTE7Ci0KLSAgY3VycnRlc3RbY3VycnN0YXRlbnVtXSA9IDA7Ci0gIG9wX3B0cltjdXJyc3RhdGVudW1dID0gMDsKLSAgYml0cG9zW2N1cnJzdGF0ZW51bV0gPSA0MDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgb3BfcG9pbnRlciA9IG9wX3B0cltjdXJyc3RhdGVudW1dOwotICAgICAgdW5zaWduZWQgaW50IG9wOwotICAgICAgaW50IGN1cnJiaXRudW0gPSBiaXRwb3NbY3VycnN0YXRlbnVtXTsKLSAgICAgIGludCBvcGxlbjsKLSAgICAgIGludCBvcHZhbFszXTsKLSAgICAgIGludCBuZXh0X29wOwotICAgICAgaW50IGN1cnJiaXQ7Ci0KLSAgICAgIG9wbGVuID0gZXh0cmFjdF9vcCAob3BfcG9pbnRlciwgb3B2YWwsICZvcCk7Ci0KLSAgICAgIGJpdHBvc1tjdXJyc3RhdGVudW1dID0gY3VycmJpdG51bTsKLQotICAgICAgLyogU2tpcCBvcHZhbFswXSBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgICAgIGlmIChvcCAmIDB4NDApCi0JewotCSAgY3VycmJpdG51bSAtPSBvcHZhbFswXTsKLQl9Ci0KLSAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBiaXQgYmVpbmcgdGVzdGVkLiAqLwotICAgICAgY3VycmJpdCA9IG9wY29kZSAmICgoKGlhNjRfaW5zbikgMSkgPDwgY3VycmJpdG51bSkgPyAxIDogMDsKLSAgICAgIG5leHRfb3AgPSAtMTsKLQotICAgICAgLyogV2UgYWx3YXlzIHBlcmZvcm0gdGhlIHRlc3RzIHNwZWNpZmllZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBpbgotCSBhIHBhcnRpY3VsYXIgb3JkZXIsIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgbmV4dCB0ZXN0IGlmIHRoZQotCSBwcmV2aW91cyBvbmUgZmFpbGVkLiAqLwotICAgICAgc3dpdGNoIChjdXJydGVzdFtjdXJyc3RhdGVudW1dKQotCXsKLQljYXNlIDA6Ci0JICBjdXJydGVzdFtjdXJyc3RhdGVudW1dKys7Ci0JICBpZiAoY3VycmJpdCA9PSAwICYmIChvcCAmIDB4ODApKQotCSAgICB7Ci0JICAgICAgLyogQ2hlY2sgZm9yIGEgemVybyBiaXQuICBJZiB0aGlzIHRlc3Qgc29sZWx5IGNoZWNrcyBmb3IKLQkJIGEgemVybyBiaXQsIHdlIGNhbiBjaGVjayBmb3IgdXAgdG8gOCBjb25zZWN1dGl2ZSB6ZXJvCi0JCSBiaXRzICh0aGUgbnVtYmVyIHRvIGNoZWNrIGlzIHNwZWNpZmllZCBieSB0aGUgbG93ZXIgMwotCQkgYml0cyBpbiB0aGUgc3RhdGUgY29kZS4pCi0KLQkJIElmIHRoZSBzdGF0ZSBpbnN0cnVjdGlvbiBtYXRjaGVzLCB3ZSBnbyB0byB0aGUgdmVyeQotCQkgbmV4dCBzdGF0ZSBpbnN0cnVjdGlvbjsgb3RoZXJ3aXNlLCB0cnkgdGhlIG5leHQgdGVzdC4gKi8KLQotCSAgICAgIGlmICgob3AgJiAweGY4KSA9PSAweDgwKQotCQl7Ci0JCSAgaW50IGNvdW50ID0gb3AgJiAweDc7Ci0JCSAgaW50IHg7Ci0KLQkJICBmb3IgKHggPSAwOyB4IDw9IGNvdW50OyB4KyspCi0JCSAgICB7Ci0JCSAgICAgIGludCBpID0KLQkJCW9wY29kZSAmICgoKGlhNjRfaW5zbikgMSkgPDwgKGN1cnJiaXRudW0gLSB4KSkgPyAxIDogMDsKLQkJICAgICAgaWYgKGkpCi0JCQl7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQkgIGlmICh4ID4gY291bnQpCi0JCSAgICB7Ci0JCSAgICAgIG5leHRfb3AgPSBvcF9wb2ludGVyICsgKChvcGxlbiArIDcpIC8gOCk7Ci0JCSAgICAgIGN1cnJiaXRudW0gLT0gY291bnQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoISBjdXJyYml0KQotCQl7Ci0JCSAgbmV4dF9vcCA9IG9wX3BvaW50ZXIgKyAoKG9wbGVuICsgNykgLyA4KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICAvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgMToKLQkgIC8qIElmIHRoZSBiaXQgaW4gdGhlIGluc3RydWN0aW9uIGlzIG9uZSwgZ28gdG8gdGhlIHN0YXRlCi0JICAgICBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgb3B2YWxbMV0uICovCi0JICBjdXJydGVzdFtjdXJyc3RhdGVudW1dKys7Ci0JICBpZiAoY3VycmJpdCAmJiAob3AgJiAweDMwKSAhPSAwICYmICgob3AgJiAweDMwKSAhPSAweDMwKSkKLQkgICAgewotCSAgICAgIG5leHRfb3AgPSBvcHZhbFsxXTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlIDI6Ci0JICAvKiBEb24ndCBjYXJlLiAgU2tpcCB0aGUgY3VycmVudCBiaXQgYW5kIGdvIHRvIHRoZSBzdGF0ZQotCSAgICAgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IG9wdmFsWzJdLgotCi0JICAgICBBbiBlbmNvZGluZyBvZiAweDMwIGlzIHNwZWNpYWw7IHRoaXMgbWVhbnMgdGhhdCBhIDEyLWJpdAotCSAgICAgb2Zmc2V0IGludG8gdGhlIGlhNjRfZGlzX25hbWVzW10gYXJyYXkgaXMgc3BlY2lmaWVkLiAgKi8KLQkgIGN1cnJ0ZXN0W2N1cnJzdGF0ZW51bV0rKzsKLQkgIGlmICgob3AgJiAweDA4KSB8fCAoKG9wICYgMHgzMCkgPT0gMHgzMCkpCi0JICAgIHsKLQkgICAgICBuZXh0X29wID0gb3B2YWxbMl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIGJpdCAxNSBpcyBzZXQgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgc3RhdGUsIGFuIG9mZnNldAotCSBpbiB0aGUgaWE2NF9kaXNfbmFtZXMgYXJyYXkgd2FzIHNwZWNpZmllZCBpbnN0ZWFkLiAgV2UgdGhlbgotCSBjaGVjayB0byBzZWUgaWYgYW4gZW50cnkgaW4gdGhlIGxpc3Qgb2Ygb3Bjb2RlcyBtYXRjaGVzIHRoZQotCSBvcGNvZGUgd2Ugd2VyZSBnaXZlbjsgaWYgc28sIHdlIGhhdmUgc3VjY2VlZGVkLiAgKi8KLQotICAgICAgaWYgKChuZXh0X29wID49IDApICYmIChuZXh0X29wICYgMzI3NjgpKQotCXsKLQkgIHNob3J0IGRpc2VudCA9IG5leHRfb3AgJiAzMjc2NzsKLSAgICAgICAgICBzaG9ydCBwcmlvcml0eSA9IC0xOwotCi0JICBpZiAobmV4dF9vcCA+IDY1NTM1KQotCSAgICB7Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgLyogUnVuIHRocm91Z2ggdGhlIGxpc3Qgb2Ygb3Bjb2RlcyB0byBjaGVjaywgdHJ5aW5nIHRvIGZpbmQKLQkgICAgIG9uZSB0aGF0IG1hdGNoZXMuICAqLwotCSAgd2hpbGUgKGRpc2VudCA+PSAwKQotCSAgICB7Ci0JICAgICAgaW50IHBsYWNlID0gaWE2NF9kaXNfbmFtZXNbZGlzZW50XS5pbnNuX2luZGV4OwotCi0gICAgICAgICAgICAgIHByaW9yaXR5ID0gaWE2NF9kaXNfbmFtZXNbZGlzZW50XS5wcmlvcml0eTsKLQotCSAgICAgIGlmIChvcGNvZGVfdmVyaWZ5IChvcGNvZGUsIHBsYWNlLCB0eXBlKSAKLSAgICAgICAgICAgICAgICAgICYmIHByaW9yaXR5ID4gZm91bmRfcHJpb3JpdHkpCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChpYTY0X2Rpc19uYW1lc1tkaXNlbnRdLm5leHRfZmxhZykKLQkJewotCQkgIGRpc2VudCsrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZGlzZW50ID0gLTE7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoZGlzZW50ID49IDApCi0JICAgIHsKLSAgICAgICAgICAgICAgZm91bmRfZGlzZW50ID0gZGlzZW50OwotICAgICAgICAgICAgICBmb3VuZF9wcmlvcml0eSA9IHByaW9yaXR5OwotCSAgICB9Ci0gICAgICAgICAgLyogVHJ5IHRoZSBuZXh0IHRlc3QgaW4gdGhpcyBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgbWF0Y2gKLSAgICAgICAgICAgICB3YXMgZm91bmQuICovCi0gICAgICAgICAgbmV4dF9vcCA9IC0yOwotCX0KLQotICAgICAgLyogbmV4dF9vcCA9PSAtMSBpcyAiYmFjayB1cCB0byB0aGUgcHJldmlvdXMgc3RhdGUiLgotCSBuZXh0X29wID09IC0yIGlzICJzdGF5IGluIHRoaXMgc3RhdGUgYW5kIHRyeSB0aGUgbmV4dCB0ZXN0Ii4KLQkgT3RoZXJ3aXNlLCB0cmFuc2l0aW9uIHRvIHRoZSBzdGF0ZSBpbmRpY2F0ZWQgYnkgbmV4dF9vcC4gKi8KLQotICAgICAgaWYgKG5leHRfb3AgPT0gLTEpCi0JewotCSAgY3VycnN0YXRlbnVtLS07Ci0JICBpZiAoY3VycnN0YXRlbnVtIDwgMCkKLQkgICAgewotICAgICAgICAgICAgICByZXR1cm4gZm91bmRfZGlzZW50OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobmV4dF9vcCA+PSAwKQotCXsKLQkgIGN1cnJzdGF0ZW51bSsrOwotCSAgYml0cG9zW2N1cnJzdGF0ZW51bV0gPSBjdXJyYml0bnVtIC0gMTsKLQkgIG9wX3B0cltjdXJyc3RhdGVudW1dID0gbmV4dF9vcDsKLQkgIGN1cnJ0ZXN0W2N1cnJzdGF0ZW51bV0gPSAwOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBDb25zdHJ1Y3QgYW4gaWE2NF9vcGNvZGUgZW50cnkgYmFzZWQgb24gT1BDT0RFLCBOQU1FIGFuZCBQTEFDRS4gKi8KLQotc3RhdGljIHN0cnVjdCBpYTY0X29wY29kZSAqCi1tYWtlX2lhNjRfb3Bjb2RlIChvcGNvZGUsIG5hbWUsIHBsYWNlLCBkZXBpbmQpCi0gICAgIGlhNjRfaW5zbiBvcGNvZGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBwbGFjZTsKLSAgICAgaW50IGRlcGluZDsKLXsKLSAgc3RydWN0IGlhNjRfb3Bjb2RlICpyZXMgPQotICAgIChzdHJ1Y3QgaWE2NF9vcGNvZGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaWE2NF9vcGNvZGUpKTsKLSAgcmVzLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIHJlcy0+dHlwZSA9IG1haW5fdGFibGVbcGxhY2VdLm9wY29kZV90eXBlOwotICByZXMtPm51bV9vdXRwdXRzID0gbWFpbl90YWJsZVtwbGFjZV0ubnVtX291dHB1dHM7Ci0gIHJlcy0+b3Bjb2RlID0gb3Bjb2RlOwotICByZXMtPm1hc2sgPSBtYWluX3RhYmxlW3BsYWNlXS5tYXNrOwotICByZXMtPm9wZXJhbmRzWzBdID0gbWFpbl90YWJsZVtwbGFjZV0ub3BlcmFuZHNbMF07Ci0gIHJlcy0+b3BlcmFuZHNbMV0gPSBtYWluX3RhYmxlW3BsYWNlXS5vcGVyYW5kc1sxXTsKLSAgcmVzLT5vcGVyYW5kc1syXSA9IG1haW5fdGFibGVbcGxhY2VdLm9wZXJhbmRzWzJdOwotICByZXMtPm9wZXJhbmRzWzNdID0gbWFpbl90YWJsZVtwbGFjZV0ub3BlcmFuZHNbM107Ci0gIHJlcy0+b3BlcmFuZHNbNF0gPSBtYWluX3RhYmxlW3BsYWNlXS5vcGVyYW5kc1s0XTsKLSAgcmVzLT5mbGFncyA9IG1haW5fdGFibGVbcGxhY2VdLmZsYWdzOwotICByZXMtPmVudF9pbmRleCA9IHBsYWNlOwotICByZXMtPmRlcGVuZGVuY2llcyA9ICZvcF9kZXBlbmRlbmNpZXNbZGVwaW5kXTsKLSAgcmV0dXJuIHJlczsKLX0KLQwKLS8qIERldGVybWluZSB0aGUgaWE2NF9vcGNvZGUgZW50cnkgZm9yIHRoZSBvcGNvZGUgc3BlY2lmaWVkIGJ5IElOU04KLSAgIGFuZCBUWVBFLiAgSWYgYSB2YWxpZCBlbnRyeSBpcyBub3QgZm91bmQsIHJldHVybiBOVUxMLiAqLwotc3RydWN0IGlhNjRfb3Bjb2RlICoKLWlhNjRfZGlzX29wY29kZSAoaW5zbiwgdHlwZSkKLSAgICAgaWE2NF9pbnNuIGluc247Ci0gICAgIGVudW0gaWE2NF9pbnNuX3R5cGUgdHlwZTsKLXsKLSAgaW50IGRpc2VudCA9IGxvY2F0ZV9vcGNvZGVfZW50IChpbnNuLCB0eXBlKTsKLQotICBpZiAoZGlzZW50IDwgMCkKLSAgICB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY2IgPSBpYTY0X2Rpc19uYW1lc1tkaXNlbnRdLmNvbXBsZXRlcl9pbmRleDsKLSAgICAgIHN0YXRpYyBjaGFyIG5hbWVbMTI4XTsKLSAgICAgIGludCBwbGFjZSA9IGlhNjRfZGlzX25hbWVzW2Rpc2VudF0uaW5zbl9pbmRleDsKLSAgICAgIGludCBjaSA9IG1haW5fdGFibGVbcGxhY2VdLmNvbXBsZXRlcnM7Ci0gICAgICBpYTY0X2luc24gdGluc24gPSBtYWluX3RhYmxlW3BsYWNlXS5vcGNvZGU7Ci0KLSAgICAgIHN0cmNweSAobmFtZSwgaWE2NF9zdHJpbmdzIFttYWluX3RhYmxlW3BsYWNlXS5uYW1lX2luZGV4XSk7Ci0KLSAgICAgIHdoaWxlIChjYikKLQl7Ci0JICBpZiAoY2IgJiAxKQotCSAgICB7Ci0JICAgICAgaW50IGNuYW1lID0gY29tcGxldGVyX3RhYmxlW2NpXS5uYW1lX2luZGV4OwotCi0JICAgICAgdGluc24gPSBhcHBseV9jb21wbGV0ZXIgKHRpbnNuLCBjaSk7Ci0KLQkgICAgICBpZiAoaWE2NF9zdHJpbmdzW2NuYW1lXVswXSAhPSAnXDAnKQotCQl7Ci0JCSAgc3RyY2F0IChuYW1lLCAiLiIpOwotCQkgIHN0cmNhdCAobmFtZSwgaWE2NF9zdHJpbmdzW2NuYW1lXSk7Ci0JCX0KLQkgICAgICBpZiAoY2IgIT0gMSkKLQkJewotCQkgIGNpID0gY29tcGxldGVyX3RhYmxlW2NpXS5zdWJlbnRyaWVzOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNpID0gY29tcGxldGVyX3RhYmxlW2NpXS5hbHRlcm5hdGl2ZTsKLQkgICAgfQotCSAgaWYgKGNpIDwgMCkKLQkgICAgewotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBjYiA9IGNiID4+IDE7Ci0JfQotICAgICAgaWYgKHRpbnNuICE9IChpbnNuICYgbWFpbl90YWJsZVtwbGFjZV0ubWFzaykpCi0JewotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcmV0dXJuIG1ha2VfaWE2NF9vcGNvZGUgKGluc24sIG5hbWUsIHBsYWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZXJfdGFibGVbY2ldLmRlcGVuZGVuY2llcyk7Ci0gICAgfQotfQotDAotLyogU2VhcmNoIHRoZSBtYWluX29wY29kZSB0YWJsZSBzdGFydGluZyBmcm9tIFBMQUNFIGZvciBhbiBvcGNvZGUgdGhhdAotICAgbWF0Y2hlcyBOQU1FLiAgUmV0dXJuIE5VTEwgaWYgb25lIGlzIG5vdCBmb3VuZC4gKi8KLQotc3RhdGljIHN0cnVjdCBpYTY0X29wY29kZSAqCi1pYTY0X2ZpbmRfbWF0Y2hpbmdfb3Bjb2RlIChuYW1lLCBwbGFjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2hvcnQgcGxhY2U7Ci17Ci0gIGNoYXIgb3BbMTI5XTsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBzaG9ydCBuYW1lX2luZGV4OwotCi0gIGlmIChzdHJsZW4gKG5hbWUpID4gMTI4KQotICAgIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgc3VmZml4ID0gbmFtZTsKLSAgZ2V0X29wY19wcmVmaXggKCZzdWZmaXgsIG9wKTsKLSAgbmFtZV9pbmRleCA9IGZpbmRfc3RyaW5nX2VudCAob3ApOwotICBpZiAobmFtZV9pbmRleCA8IDApCi0gICAgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHdoaWxlIChtYWluX3RhYmxlW3BsYWNlXS5uYW1lX2luZGV4ID09IG5hbWVfaW5kZXgpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqY3Vycl9zdWZmaXggPSBzdWZmaXg7Ci0gICAgICBpYTY0X2luc24gY3Vycl9pbnNuID0gbWFpbl90YWJsZVtwbGFjZV0ub3Bjb2RlOwotICAgICAgc2hvcnQgY29tcGxldGVyID0gLTE7Ci0KLSAgICAgIGRvIHsKLSAgICAgIAlpZiAoc3VmZml4WzBdID09ICdcMCcpCi0JICB7Ci0JICAgIGNvbXBsZXRlciA9IGZpbmRfY29tcGxldGVyIChwbGFjZSwgY29tcGxldGVyLCBzdWZmaXgpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZ2V0X29wY19wcmVmaXggKCZjdXJyX3N1ZmZpeCwgb3ApOwotCSAgICBjb21wbGV0ZXIgPSBmaW5kX2NvbXBsZXRlciAocGxhY2UsIGNvbXBsZXRlciwgb3ApOwotCSAgfQotCWlmIChjb21wbGV0ZXIgIT0gLTEpCi0JICB7Ci0JICAgIGN1cnJfaW5zbiA9IGFwcGx5X2NvbXBsZXRlciAoY3Vycl9pbnNuLCBjb21wbGV0ZXIpOwotCSAgfQotICAgICAgfSB3aGlsZSAoY29tcGxldGVyICE9IC0xICYmIGN1cnJfc3VmZml4WzBdICE9ICdcMCcpOwotCi0gICAgICBpZiAoY29tcGxldGVyICE9IC0xICYmIGN1cnJfc3VmZml4WzBdID09ICdcMCcKLQkgICYmIGNvbXBsZXRlcl90YWJsZVtjb21wbGV0ZXJdLnRlcm1pbmFsX2NvbXBsZXRlcikKLQl7Ci0gICAgICAgICAgaW50IGRlcGluZCA9IGNvbXBsZXRlcl90YWJsZVtjb21wbGV0ZXJdLmRlcGVuZGVuY2llczsKLQkgIHJldHVybiBtYWtlX2lhNjRfb3Bjb2RlIChjdXJyX2luc24sIG5hbWUsIHBsYWNlLCBkZXBpbmQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwbGFjZSsrOwotCX0KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotDAotLyogRmluZCB0aGUgbmV4dCBvcGNvZGUgYWZ0ZXIgUFJFVl9FTlQgdGhhdCBtYXRjaGVzIFBSRVZfRU5ULCBvciByZXR1cm4gTlVMTAotICAgaWYgb25lIGRvZXMgbm90IGV4aXN0LgotCi0gICBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gaW52b2tlIGlhNjRfZnJlZV9vcGNvZGUgKCkgdG8KLSAgIHJlbGVhc2UgYW55IHJlc291cmNlcyB1c2VkIGJ5IHRoZSByZXR1cm5lZCBlbnRyeS4gKi8KLQotc3RydWN0IGlhNjRfb3Bjb2RlICoKLWlhNjRfZmluZF9uZXh0X29wY29kZSAocHJldl9lbnQpCi0gICAgIHN0cnVjdCBpYTY0X29wY29kZSAqcHJldl9lbnQ7Ci17Ci0gIHJldHVybiBpYTY0X2ZpbmRfbWF0Y2hpbmdfb3Bjb2RlIChwcmV2X2VudC0+bmFtZSwKLQkJCQkgICAgcHJldl9lbnQtPmVudF9pbmRleCArIDEpOwotfQotCi0vKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgdGhhdCBtYXRjaGVzIE5BTUUsIG9yIHJldHVybiBOVUxMIGlmIGl0IGRvZXMKLSAgIG5vdCBleGlzdC4KLQotICAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGludm9rZSBpYTY0X2ZyZWVfb3Bjb2RlICgpIHRvCi0gICByZWxlYXNlIGFueSByZXNvdXJjZXMgdXNlZCBieSB0aGUgcmV0dXJuZWQgZW50cnkuICovCi0KLXN0cnVjdCBpYTY0X29wY29kZSAqCi1pYTY0X2ZpbmRfb3Bjb2RlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyIG9wWzEyOV07Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLSAgc2hvcnQgcGxhY2U7Ci0gIHNob3J0IG5hbWVfaW5kZXg7Ci0KLSAgaWYgKHN0cmxlbiAobmFtZSkgPiAxMjgpCi0gICAgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBzdWZmaXggPSBuYW1lOwotICBnZXRfb3BjX3ByZWZpeCAoJnN1ZmZpeCwgb3ApOwotICBuYW1lX2luZGV4ID0gZmluZF9zdHJpbmdfZW50IChvcCk7Ci0gIGlmIChuYW1lX2luZGV4IDwgMCkKLSAgICB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcGxhY2UgPSBmaW5kX21haW5fZW50IChuYW1lX2luZGV4KTsKLQotICBpZiAocGxhY2UgPCAwKQotICAgIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGlhNjRfZmluZF9tYXRjaGluZ19vcGNvZGUgKG5hbWUsIHBsYWNlKTsKLX0KLQotLyogRnJlZSBhbnkgcmVzb3VyY2VzIHVzZWQgYnkgRU5ULiAqLwotdm9pZAotaWE2NF9mcmVlX29wY29kZSAoZW50KQotICAgICBzdHJ1Y3QgaWE2NF9vcGNvZGUgKmVudDsKLXsKLSAgZnJlZSAoKHZvaWQgKillbnQtPm5hbWUpOwotICBmcmVlIChlbnQpOwotfQotCi1jb25zdCBzdHJ1Y3QgaWE2NF9kZXBlbmRlbmN5ICoKLWlhNjRfZmluZF9kZXBlbmRlbmN5IChpbmRleCkKLSAgaW50IGluZGV4OwotewotICBpbmRleCA9IERFUChpbmRleCk7Ci0KLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplb2YoZGVwZW5kZW5jaWVzKSAvIHNpemVvZihkZXBlbmRlbmNpZXNbMF0pKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiAmZGVwZW5kZW5jaWVzW2luZGV4XTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1vcGMuaCBiL29wY29kZXMvaWE2NC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMDhmZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogaWE2NC1vcGMuaCAtLSBJQS02NCBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIElBNjRfT1BDX0gKLSNkZWZpbmUgSUE2NF9PUENfSAotCi0jaW5jbHVkZSAib3Bjb2RlL2lhNjQuaCIKLQotLyogZGVmaW5lIGEgY291cGxlIG9mIGFiYnJldmlhdGlvbnM6ICovCi0KLSNkZWZpbmUgYk9wKHgpCSgoKGlhNjRfaW5zbikgKCh4KSAmIDB4ZikpIDw8IDM3KQotI2RlZmluZSBtT3AJYk9wICgtMSkKLSNkZWZpbmUgT3AoeCkJYk9wICh4KSwgbU9wCi0KLSNkZWZpbmUgRklSU1QJCUlBNjRfT1BDT0RFX0ZJUlNUCi0jZGVmaW5lIFhfSU5fTUxYCUlBNjRfT1BDT0RFX1hfSU5fTUxYCi0jZGVmaW5lIExBU1QJCUlBNjRfT1BDT0RFX0xBU1QKLSNkZWZpbmUgUFJJVgkJSUE2NF9PUENPREVfUFJJVgotI2RlZmluZSBOT19QUkVECQlJQTY0X09QQ09ERV9OT19QUkVECi0jZGVmaW5lIFNMT1QyCQlJQTY0X09QQ09ERV9TTE9UMgotI2RlZmluZSBQU0VVRE8JCUlBNjRfT1BDT0RFX1BTRVVETwotI2RlZmluZSBGMl9FUV9GMwlJQTY0X09QQ09ERV9GMl9FUV9GMwotI2RlZmluZSBMRU5fRVFfNjRNQ05UCUlBNjRfT1BDT0RFX0xFTl9FUV82NE1DTlQKLSNkZWZpbmUgTU9EX1JSQlMgICAgICAgIElBNjRfT1BDT0RFX01PRF9SUkJTCi0KLSNkZWZpbmUgQVJfQ0NWCUlBNjRfT1BORF9BUl9DQ1YKLSNkZWZpbmUgQVJfUEZTCUlBNjRfT1BORF9BUl9QRlMKLSNkZWZpbmUgQzEJSUE2NF9PUE5EX0MxCi0jZGVmaW5lIEM4CUlBNjRfT1BORF9DOAotI2RlZmluZSBDMTYJSUE2NF9PUE5EX0MxNgotI2RlZmluZSBHUjAJSUE2NF9PUE5EX0dSMAotI2RlZmluZSBJUAlJQTY0X09QTkRfSVAKLSNkZWZpbmUgUFIJSUE2NF9PUE5EX1BSCi0jZGVmaW5lIFBSX1JPVAlJQTY0X09QTkRfUFJfUk9UCi0jZGVmaW5lIFBTUglJQTY0X09QTkRfUFNSCi0jZGVmaW5lIFBTUl9MCUlBNjRfT1BORF9QU1JfTAotI2RlZmluZSBQU1JfVU0JSUE2NF9PUE5EX1BTUl9VTQotCi0jZGVmaW5lIEFSMwlJQTY0X09QTkRfQVIzCi0jZGVmaW5lIEIxCUlBNjRfT1BORF9CMQotI2RlZmluZSBCMglJQTY0X09QTkRfQjIKLSNkZWZpbmUgQ1IzCUlBNjRfT1BORF9DUjMKLSNkZWZpbmUgRjEJSUE2NF9PUE5EX0YxCi0jZGVmaW5lIEYyCUlBNjRfT1BORF9GMgotI2RlZmluZSBGMwlJQTY0X09QTkRfRjMKLSNkZWZpbmUgRjQJSUE2NF9PUE5EX0Y0Ci0jZGVmaW5lIFAxCUlBNjRfT1BORF9QMQotI2RlZmluZSBQMglJQTY0X09QTkRfUDIKLSNkZWZpbmUgUjEJSUE2NF9PUE5EX1IxCi0jZGVmaW5lIFIyCUlBNjRfT1BORF9SMgotI2RlZmluZSBSMwlJQTY0X09QTkRfUjMKLSNkZWZpbmUgUjNfMglJQTY0X09QTkRfUjNfMgotCi0jZGVmaW5lIENQVUlEX1IzIElBNjRfT1BORF9DUFVJRF9SMwotI2RlZmluZSBEQlJfUjMJSUE2NF9PUE5EX0RCUl9SMwotI2RlZmluZSBEVFJfUjMJSUE2NF9PUE5EX0RUUl9SMwotI2RlZmluZSBJVFJfUjMJSUE2NF9PUE5EX0lUUl9SMwotI2RlZmluZSBJQlJfUjMJSUE2NF9PUE5EX0lCUl9SMwotI2RlZmluZSBNUjMJSUE2NF9PUE5EX01SMwotI2RlZmluZSBNU1JfUjMJSUE2NF9PUE5EX01TUl9SMwotI2RlZmluZSBQS1JfUjMJSUE2NF9PUE5EX1BLUl9SMwotI2RlZmluZSBQTUNfUjMJSUE2NF9PUE5EX1BNQ19SMwotI2RlZmluZSBQTURfUjMJSUE2NF9PUE5EX1BNRF9SMwotI2RlZmluZSBSUl9SMwlJQTY0X09QTkRfUlJfUjMKLQotI2RlZmluZSBDQ05UNQlJQTY0X09QTkRfQ0NOVDUKLSNkZWZpbmUgQ05UMmEJSUE2NF9PUE5EX0NOVDJhCi0jZGVmaW5lIENOVDJiCUlBNjRfT1BORF9DTlQyYgotI2RlZmluZSBDTlQyYwlJQTY0X09QTkRfQ05UMmMKLSNkZWZpbmUgQ05UNQlJQTY0X09QTkRfQ05UNQotI2RlZmluZSBDTlQ2CUlBNjRfT1BORF9DTlQ2Ci0jZGVmaW5lIENQT1M2YQlJQTY0X09QTkRfQ1BPUzZhCi0jZGVmaW5lIENQT1M2YglJQTY0X09QTkRfQ1BPUzZiCi0jZGVmaW5lIENQT1M2YwlJQTY0X09QTkRfQ1BPUzZjCi0jZGVmaW5lIElNTTEJSUE2NF9PUE5EX0lNTTEKLSNkZWZpbmUgSU1NMTQJSUE2NF9PUE5EX0lNTTE0Ci0jZGVmaW5lIElNTTE3CUlBNjRfT1BORF9JTU0xNwotI2RlZmluZSBJTU0yMglJQTY0X09QTkRfSU1NMjIKLSNkZWZpbmUgSU1NNDQJSUE2NF9PUE5EX0lNTTQ0Ci0jZGVmaW5lIFNPRglJQTY0X09QTkRfU09GCi0jZGVmaW5lIFNPTAlJQTY0X09QTkRfU09MCi0jZGVmaW5lIFNPUglJQTY0X09QTkRfU09SCi0jZGVmaW5lIElNTTgJSUE2NF9PUE5EX0lNTTgKLSNkZWZpbmUgSU1NOFU0CUlBNjRfT1BORF9JTU04VTQKLSNkZWZpbmUgSU1NOE0xCUlBNjRfT1BORF9JTU04TTEKLSNkZWZpbmUgSU1NOE0xVTQgSUE2NF9PUE5EX0lNTThNMVU0Ci0jZGVmaW5lIElNTThNMVU4IElBNjRfT1BORF9JTU04TTFVOAotI2RlZmluZSBJTU05YQlJQTY0X09QTkRfSU1NOWEKLSNkZWZpbmUgSU1NOWIJSUE2NF9PUE5EX0lNTTliCi0jZGVmaW5lIElNTVUyCUlBNjRfT1BORF9JTU1VMgotI2RlZmluZSBJTU1VMjEJSUE2NF9PUE5EX0lNTVUyMQotI2RlZmluZSBJTU1VMjQJSUE2NF9PUE5EX0lNTVUyNAotI2RlZmluZSBJTU1VNjIJSUE2NF9PUE5EX0lNTVU2MgotI2RlZmluZSBJTU1VNjQJSUE2NF9PUE5EX0lNTVU2NAotI2RlZmluZSBJTU1VN2EJSUE2NF9PUE5EX0lNTVU3YQotI2RlZmluZSBJTU1VN2IJSUE2NF9PUE5EX0lNTVU3YgotI2RlZmluZSBJTU1VOQlJQTY0X09QTkRfSU1NVTkKLSNkZWZpbmUgSU5DMwlJQTY0X09QTkRfSU5DMwotI2RlZmluZSBMRU40CUlBNjRfT1BORF9MRU40Ci0jZGVmaW5lIExFTjYJSUE2NF9PUE5EX0xFTjYKLSNkZWZpbmUgTUJUWVBFNAlJQTY0X09QTkRfTUJUWVBFNAotI2RlZmluZSBNSFRZUEU4CUlBNjRfT1BORF9NSFRZUEU4Ci0jZGVmaW5lIFBPUzYJSUE2NF9PUE5EX1BPUzYKLSNkZWZpbmUgVEFHMTMJSUE2NF9PUE5EX1RBRzEzCi0jZGVmaW5lIFRBRzEzYglJQTY0X09QTkRfVEFHMTNiCi0jZGVmaW5lIFRHVDI1CUlBNjRfT1BORF9UR1QyNQotI2RlZmluZSBUR1QyNWIJSUE2NF9PUE5EX1RHVDI1YgotI2RlZmluZSBUR1QyNWMJSUE2NF9PUE5EX1RHVDI1YwotI2RlZmluZSBUR1Q2NCAgIElBNjRfT1BORF9UR1Q2NAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvaWE2NC1yYXcudGJsIGIvb3Bjb2Rlcy9pYTY0LXJhdy50YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzllNzMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pYTY0LXJhdy50YmwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotUmVzb3VyY2UgTmFtZTsJV3JpdGVyczsJUmVhZGVyczsJU2VtYW50aWNzIG9mIERlcGVuZGVuY3kKLUFMQVQ7CWNoay5hLmNsciwgSUM6bWVtLXJlYWRlcnMtYWxhdCwgSUM6bWVtLXdyaXRlcnMsIElDOmludmFsYS1hbGw7CUlDOm1lbS1yZWFkZXJzLWFsYXQsIElDOm1lbS13cml0ZXJzLCBJQzpjaGstYSwgaW52YWxhLmU7CW5vbmUKLUFSW0JTUF07CWJyLmNhbGwsIGJybC5jYWxsLCBici5yZXQsIGNvdmVyLCBJQzptb3YtdG8tQVItQlNQU1RPUkUsIHJmaTsJYnIuY2FsbCwgYnJsLmNhbGwsIGJyLmlhLCBici5yZXQsIGNvdmVyLCBmbHVzaHJzLCBsb2FkcnMsIElDOm1vdi1mcm9tLUFSLUJTUCwgcmZpOwlpbXBsaWVkRgotQVJbQlNQU1RPUkVdOwlhbGxvYywgbG9hZHJzLCBmbHVzaHJzLCBJQzptb3YtdG8tQVItQlNQU1RPUkU7CWFsbG9jLCBici5pYSwgZmx1c2hycywgSUM6bW92LWZyb20tQVItQlNQU1RPUkU7CWltcGxpZWRGCi1BUltDQ1ZdOwlJQzptb3YtdG8tQVItQ0NWOwlici5pYSwgSUM6Y21weGNoZywgSUM6bW92LWZyb20tQVItQ0NWOwlpbXBsaWVkRgotQVJbRUNdOwlJQzptb2Qtc2NoZWQtYnJzLCBici5yZXQsIElDOm1vdi10by1BUi1FQzsJYnIuY2FsbCwgYnJsLmNhbGwsIGJyLmlhLCBJQzptb2Qtc2NoZWQtYnJzLCBJQzptb3YtZnJvbS1BUi1FQzsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMC5jb250cm9sczsJSUM6bW92LXRvLUFSLUZQU1IsIGZzZXRjLnMwOwlici5pYSwgSUM6ZnAtYXJpdGgtczAsIElDOmZjbXAtczAsIElDOmZwY21wLXMwLCBmc2V0YywgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMS5jb250cm9sczsJSUM6bW92LXRvLUFSLUZQU1IsIGZzZXRjLnMxOwlici5pYSwgSUM6ZnAtYXJpdGgtczEsIElDOmZjbXAtczEsIElDOmZwY21wLXMxLCBJQzptb3YtZnJvbS1BUi1GUFNSOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YyLmNvbnRyb2xzOwlJQzptb3YtdG8tQVItRlBTUiwgZnNldGMuczI7CWJyLmlhLCBJQzpmcC1hcml0aC1zMiwgSUM6ZmNtcC1zMiwgSUM6ZnBjbXAtczIsIElDOm1vdi1mcm9tLUFSLUZQU1I7CWltcGxpZWRGCi1BUltGUFNSXS5zZjMuY29udHJvbHM7CUlDOm1vdi10by1BUi1GUFNSLCBmc2V0Yy5zMzsJYnIuaWEsIElDOmZwLWFyaXRoLXMzLCBJQzpmY21wLXMzLCBJQzpmcGNtcC1zMywgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMC5mbGFnczsJSUM6ZnAtYXJpdGgtczAsIGZjbHJmLnMwLCBJQzpmY21wLXMwLCBJQzpmcGNtcC1zMCwgSUM6bW92LXRvLUFSLUZQU1I7CWJyLmlhLCBmY2hrZiwgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMS5mbGFnczsJSUM6ZnAtYXJpdGgtczEsIGZjbHJmLnMxLCBJQzpmY21wLXMxLCBJQzpmcGNtcC1zMSwgSUM6bW92LXRvLUFSLUZQU1I7CWJyLmlhLCBmY2hrZi5zMSwgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMi5mbGFnczsJSUM6ZnAtYXJpdGgtczIsIGZjbHJmLnMyLCBJQzpmY21wLXMyLCBJQzpmcGNtcC1zMiwgSUM6bW92LXRvLUFSLUZQU1I7CWJyLmlhLCBmY2hrZi5zMiwgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMy5mbGFnczsJSUM6ZnAtYXJpdGgtczMsIGZjbHJmLnMzLCBJQzpmY21wLXMzLCBJQzpmcGNtcC1zMywgSUM6bW92LXRvLUFSLUZQU1I7CWJyLmlhLCBmY2hrZi5zMywgSUM6bW92LWZyb20tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnRyYXBzOwlJQzptb3YtdG8tQVItRlBTUjsJYnIuaWEsIElDOmZwLWFyaXRoLCBmY2hrZiwgZmNtcCwgZnBjbXAsIElDOm1vdi1mcm9tLUFSLUZQU1I7CWltcGxpZWRGCi1BUltGUFNSXS5ydjsJSUM6bW92LXRvLUFSLUZQU1I7CWJyLmlhLCBJQzpmcC1hcml0aCwgZmNoa2YsIGZjbXAsIGZwY21wLCBJQzptb3YtZnJvbS1BUi1GUFNSOwlpbXBsaWVkRgotQVJbSVRDXTsJSUM6bW92LXRvLUFSLUlUQzsJYnIuaWEsIElDOm1vdi1mcm9tLUFSLUlUQzsJaW1wbGllZEYKLUFSW0slXSwgJSBpbiAwIC0gNzsJSUM6bW92LXRvLUFSLUsrMTsJYnIuaWEsIElDOm1vdi1mcm9tLUFSLUsrMTsJaW1wbGllZEYKLUFSW0xDXTsJSUM6bW9kLXNjaGVkLWJycy1jb3VudGVkLCBJQzptb3YtdG8tQVItTEM7CWJyLmlhLCBJQzptb2Qtc2NoZWQtYnJzLWNvdW50ZWQsIElDOm1vdi1mcm9tLUFSLUxDOwlpbXBsaWVkRgotQVJbUEZTXTsJYnIuY2FsbCwgYnJsLmNhbGw7CWFsbG9jLCBici5pYSwgYnIucmV0LCBlcGMsIElDOm1vdi1mcm9tLUFSLVBGUzsJaW1wbGllZEYKLUFSW1BGU107CUlDOm1vdi10by1BUi1QRlM7CWFsbG9jLCBici5pYSwgZXBjLCBJQzptb3YtZnJvbS1BUi1QRlM7CWltcGxpZWRGCi1BUltQRlNdOwlJQzptb3YtdG8tQVItUEZTOwlici5yZXQ7CW5vbmUKLUFSW1JOQVRdOwlhbGxvYywgZmx1c2hycywgbG9hZHJzLCBJQzptb3YtdG8tQVItUk5BVCwgSUM6bW92LXRvLUFSLUJTUFNUT1JFOwlhbGxvYywgYnIuaWEsIGZsdXNocnMsIGxvYWRycywgSUM6bW92LWZyb20tQVItUk5BVDsJaW1wbGllZEYKLUFSW1JTQ107CUlDOm1vdi10by1BUi1SU0M7CWFsbG9jLCBici5pYSwgZmx1c2hycywgbG9hZHJzLCBJQzptb3YtZnJvbS1BUi1SU0MsIElDOm1vdi1mcm9tLUFSLUJTUFNUT1JFLCBJQzptb3YtdG8tQVItUk5BVCwgSUM6bW92LWZyb20tQVItUk5BVCwgSUM6bW92LXRvLUFSLUJTUFNUT1JFOwlpbXBsaWVkRgotQVJbVU5BVF17JX0sICUgaW4gMCAtIDYzOwlJQzptb3YtdG8tQVItVU5BVCwgc3Q4LnNwaWxsOwlici5pYSwgbGQ4LmZpbGwsIElDOm1vdi1mcm9tLUFSLVVOQVQ7CWltcGxpZWRGCi1BUiUsICUgaW4gOC0xNSwgMjAsIDIyLTIzLCAzMSwgMzMtMzUsIDM3LTM5LCA0MS00MywgNDUtNDcsIDY3LTExMTsJSUM6bm9uZTsJYnIuaWEsIElDOm1vdi1mcm9tLUFSLXJ2KzE7CW5vbmUKLUFSJSwgJSBpbiA0OC02MywgMTEyLTEyNzsJSUM6bW92LXRvLUFSLWlnKzE7CWJyLmlhLCBJQzptb3YtZnJvbS1BUi1pZysxOwlpbXBsaWVkRgotQlIlLCAlIGluIDAgLSA3Owlici5jYWxsKzEsIGJybC5jYWxsKzE7CUlDOmluZGlyZWN0LWJycysxLCBJQzppbmRpcmVjdC1icnArMSwgSUM6bW92LWZyb20tQlIrMTsJaW1wbGllZEYKLUJSJSwgJSBpbiAwIC0gNzsJSUM6bW92LXRvLUJSKzE7CUlDOmluZGlyZWN0LWJycysxOwlub25lCi1CUiUsICUgaW4gMCAtIDc7CUlDOm1vdi10by1CUisxOwlJQzppbmRpcmVjdC1icnArMSwgSUM6bW92LWZyb20tQlIrMTsJaW1wbGllZEYKLUNGTTsJSUM6bW9kLXNjaGVkLWJyczsJSUM6bW9kLXNjaGVkLWJyczsJaW1wbGllZEYKLUNGTTsJSUM6bW9kLXNjaGVkLWJyczsJY292ZXIsIGFsbG9jLCByZmksIGxvYWRycywgYnIucmV0LCBici5jYWxsLCBicmwuY2FsbDsJaW1wbGllZEYKLUNGTTsJSUM6bW9kLXNjaGVkLWJyczsJSUM6Y2ZtLXJlYWRlcnMrMjsJaW1wbGllZEYKLUNGTTsJYnIuY2FsbCwgYnJsLmNhbGwsIGJyLnJldCwgY2xycnJiLCBjb3ZlciwgcmZpOwlJQzpjZm0tcmVhZGVyczsJaW1wbGllZEYKLUNGTTsJYWxsb2M7CUlDOmNmbS1yZWFkZXJzOwlub25lCi1DUFVJRCM7CUlDOm5vbmU7CUlDOm1vdi1mcm9tLUlORC1DUFVJRCszOwlzcGVjaWZpYwotQ1JbQ01DVl07CUlDOm1vdi10by1DUi1DTUNWOwlJQzptb3YtZnJvbS1DUi1DTUNWOwlkYXRhCi1DUltEQ1JdOwlJQzptb3YtdG8tQ1ItRENSOwlJQzptb3YtZnJvbS1DUi1EQ1IsIElDOm1lbS1yZWFkZXJzLXNwZWM7CWRhdGEKLUNSW0VPSV07CUlDOm1vdi10by1DUi1FT0k7CUlDOm5vbmU7CVNDIFNlY3Rpb24gMTAuOC4zLjQKLUNSW0dQVEFdOwlJQzptb3YtdG8tQ1ItR1BUQTsJSUM6bW92LWZyb20tQ1ItR1BUQSwgdGhhc2g7CWRhdGEKLUNSW0lGQV07CUlDOm1vdi10by1DUi1JRkE7CWl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kOwlpbXBsaWVkCi1DUltJRkFdOwlJQzptb3YtdG8tQ1ItSUZBOwlJQzptb3YtZnJvbS1DUi1JRkE7CWRhdGEKLUNSW0lGU107CUlDOm1vdi10by1DUi1JRlM7CUlDOm1vdi1mcm9tLUNSLUlGUzsJZGF0YQotQ1JbSUZTXTsJSUM6bW92LXRvLUNSLUlGUzsJcmZpOwlpbXBsaWVkCi1DUltJRlNdOwljb3ZlcjsJcmZpLCBJQzptb3YtZnJvbS1DUi1JRlM7CWltcGxpZWQKLUNSW0lIQV07CUlDOm1vdi10by1DUi1JSEE7CUlDOm1vdi1mcm9tLUNSLUlIQTsJZGF0YQotQ1JbSUlNXTsJSUM6bW92LXRvLUNSLUlJTTsJSUM6bW92LWZyb20tQ1ItSUlNOwlkYXRhCi1DUltJSVBdOwlJQzptb3YtdG8tQ1ItSUlQOwlJQzptb3YtZnJvbS1DUi1JSVA7CWRhdGEKLUNSW0lJUF07CUlDOm1vdi10by1DUi1JSVA7CXJmaTsJaW1wbGllZAotQ1JbSUlQQV07CUlDOm1vdi10by1DUi1JSVBBOwlJQzptb3YtZnJvbS1DUi1JSVBBOwlkYXRhCi1DUltJUFNSXTsJSUM6bW92LXRvLUNSLUlQU1I7CUlDOm1vdi1mcm9tLUNSLUlQU1I7CWRhdGEKLUNSW0lQU1JdOwlJQzptb3YtdG8tQ1ItSVBTUjsJcmZpOwlpbXBsaWVkCi1DUltJUlIlXSwgJSBpbiAwIC0gMzsJSUM6bW92LWZyb20tQ1ItSVZSOwlJQzptb3YtZnJvbS1DUi1JUlIrMTsJZGF0YQotQ1JbSVNSXTsJSUM6bW92LXRvLUNSLUlTUjsJSUM6bW92LWZyb20tQ1ItSVNSOwlkYXRhCi1DUltJVElSXTsJSUM6bW92LXRvLUNSLUlUSVI7CUlDOm1vdi1mcm9tLUNSLUlUSVI7CWRhdGEKLUNSW0lUSVJdOwlJQzptb3YtdG8tQ1ItSVRJUjsJaXRjLmksIGl0Yy5kLCBpdHIuaSwgaXRjLmQ7CWltcGxpZWQKLUNSW0lUTV07CUlDOm1vdi10by1DUi1JVE07CUlDOm1vdi1mcm9tLUNSLUlUTTsJZGF0YQotQ1JbSVRWXTsJSUM6bW92LXRvLUNSLUlUVjsJSUM6bW92LWZyb20tQ1ItSVRWOwlkYXRhCi1DUltJVkFdOwlJQzptb3YtdG8tQ1ItSVZBOwlJQzptb3YtZnJvbS1DUi1JVkE7CWluc3RyCi1DUltJVlJdOwlJQzpub25lOwlJQzptb3YtZnJvbS1DUi1JVlI7CVNDIFNlY3Rpb24gMTAuOC4zLjIKLUNSW0xJRF07CUlDOm1vdi10by1DUi1MSUQ7CUlDOm1vdi1mcm9tLUNSLUxJRDsJU0MgU2VjdGlvbiAxMC44LjMuMQotQ1JbTFJSJV0sICUgaW4gMCAtIDE7CUlDOm1vdi10by1DUi1MUlIrMTsJSUM6bW92LWZyb20tQ1ItTFJSKzE7CWRhdGEKLUNSW1BNVl07CUlDOm1vdi10by1DUi1QTVY7CUlDOm1vdi1mcm9tLUNSLVBNVjsJZGF0YQotQ1JbUFRBXTsJSUM6bW92LXRvLUNSLVBUQTsJSUM6bW92LWZyb20tQ1ItUFRBLCB0aGFzaDsJZGF0YQotQ1JbVFBSXTsJSUM6bW92LXRvLUNSLVRQUjsJSUM6bW92LWZyb20tQ1ItVFBSLCBJQzptb3YtZnJvbS1DUi1JVlI7CWRhdGEKLUNSW1RQUl07CUlDOm1vdi10by1DUi1UUFI7CUlDOm1vdi10by1QU1ItbCwgcmZpLCByc20sIHNzbTsJU0MgU2VjdGlvbiAxMC44LjMuMwotQ1IlLCAlIGluIDMtNywgMTAtMTUsIDE4LCAyNi02MywgNzUtNzksIDgyLTEyNzsJSUM6bm9uZTsJSUM6bW92LWZyb20tQ1ItcnYrMTsJbm9uZQotREJSIzsJSUM6bW92LXRvLUlORC1EQlIrMzsJSUM6bW92LWZyb20tSU5ELURCUiszOwlpbXBsaWVkRgotREJSIzsJSUM6bW92LXRvLUlORC1EQlIrMzsJSUM6cHJvYmUtYWxsLCBJQzpsZmV0Y2gtYWxsLCBJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnM7CWRhdGEKLURUQzsJcHRjLmUsIHB0Yy5nLCBwdGMuZ2EsIHB0Yy5sLCBwdHIuaSwgcHRyLmQsIGl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kOwlJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnMsIGZjLCBJQzpwcm9iZS1hbGwsIHRhaywgdHBhOwlkYXRhCi1EVEM7CWl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZCwgaXRjLmksIGl0Yy5kLCBpdHIuaSwgaXRyLmQ7CWltcGxpZWRGCi1EVEM7CXB0Yy5lLCBwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmksIHB0ci5kOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJbm9uZQotRFRDOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJaXRjLmksIGl0Yy5kLCBpdHIuaSwgaXRyLmQ7CWltcGxpZWRGCi1EVENfTElNSVQqOwlwdGMuZywgcHRjLmdhOwlwdGMuZywgcHRjLmdhOwlpbXBsaWVkRgotRFRSOwlpdHIuZDsJSUM6bWVtLXJlYWRlcnMsIElDOm1lbS13cml0ZXJzLCBmYywgSUM6cHJvYmUtYWxsLCB0YWssIHRwYTsJZGF0YQotRFRSOwlpdHIuZDsJcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5kLCBpdHIuZDsJaW1wbGllZEYKLURUUjsJcHRyLmQ7CUlDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVycywgZmMsIElDOnByb2JlLWFsbCwgdGFrLCB0cGE7CWRhdGEKLURUUjsJcHRyLmQ7CXB0Yy5nLCBwdGMuZ2EsIHB0Yy5sLCBwdHIuZDsJbm9uZQotRFRSOwlwdHIuZDsJaXRyLmQsIGl0Yy5kOwlpbXBsaWVkRgotRlIlLCAlIGluIDAgLSAxOwlJQzpub25lOwlJQzpmci1yZWFkZXJzKzE7CW5vbmUKLUZSJSwgJSBpbiAyIC0gMTI3OwlJQzpmci13cml0ZXJzKzFcSUM6bGRmLWMrMVxJQzpsZGZwLWMrMTsJSUM6ZnItcmVhZGVycysxOwlpbXBsaWVkRgotRlIlLCAlIGluIDIgLSAxMjc7CUlDOmxkZi1jKzEsIElDOmxkZnAtYysxOwlJQzpmci1yZWFkZXJzKzE7CW5vbmUKLUdSMDsJSUM6bm9uZTsJSUM6Z3ItcmVhZGVycysxLCBJQzptb3YtaW1tZWRpYXRlOwlub25lCi1HUiUsICUgaW4gMSAtIDEyNzsJSUM6bGQtYysxKzEzOwlJQzpnci1yZWFkZXJzKzE7CW5vbmUKLUdSJSwgJSBpbiAxIC0gMTI3OwlJQzpnci13cml0ZXJzKzFcSUM6bGQtYysxKzEzOwlJQzpnci1yZWFkZXJzKzE7CWltcGxpZWRGCi1JQlIjOwlJQzptb3YtdG8tSU5ELUlCUiszOwlJQzptb3YtZnJvbS1JTkQtSUJSKzM7CWltcGxpZWRGCi1JblNlcnZpY2UqOwlJQzptb3YtdG8tQ1ItRU9JOwlJQzptb3YtZnJvbS1DUi1JVlI7CWRhdGEKLUluU2VydmljZSo7CUlDOm1vdi1mcm9tLUNSLUlWUjsJSUM6bW92LWZyb20tQ1ItSVZSOwlpbXBsaWVkRgotSW5TZXJ2aWNlKjsJSUM6bW92LXRvLUNSLUVPSTsJSUM6bW92LXRvLUNSLUVPSTsJaW1wbGllZEYKLUlQOwlJQzphbGw7CUlDOmFsbDsJbm9uZQotSVRDOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJZXBjOwlpbnN0cgotSVRDOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJaXRjLmksIGl0Yy5kLCBpdHIuaSwgaXRyLmQ7CWltcGxpZWRGCi1JVEM7CXB0Yy5lLCBwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmksIHB0ci5kOwlwdHIuaSwgcHRyLmQsIHB0Yy5lLCBwdGMuZywgcHRjLmdhLCBwdGMubDsJbm9uZQotSVRDOwlpdGMuaSwgaXRjLmQsIGl0ci5pLCBpdHIuZDsJZXBjOwlpbnN0cgotSVRDOwlpdGMuaSwgaXRjLmQsIGl0ci5pLCBpdHIuZDsJaXRjLmQsIGl0Yy5pLCBpdHIuZCwgaXRyLmksIHB0ci5kLCBwdHIuaSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmw7CWltcGxpZWRGCi1JVENfTElNSVQqOwlwdGMuZywgcHRjLmdhOwlwdGMuZywgcHRjLmdhOwlpbXBsaWVkRgotSVRSOwlpdHIuaTsJaXRyLmksIGl0Yy5pLCBwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmk7CWltcGxpZWRGCi1JVFI7CWl0ci5pOwllcGM7CWluc3RyCi1JVFI7CXB0ci5pOwlpdGMuaSwgaXRyLmk7CWltcGxpZWRGCi1JVFI7CXB0ci5pOwlwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmk7CW5vbmUKLUlUUjsJcHRyLmk7CWVwYzsJaW5zdHIKLW1lbW9yeTsJSUM6bWVtLXdyaXRlcnM7CUlDOm1lbS1yZWFkZXJzOwlub25lCi1NU1IjOwlJQzptb3YtdG8tSU5ELU1TUis1OwlJQzptb3YtZnJvbS1JTkQtTVNSKzU7CXNwZWNpZmljCi1QS1IjOwlJQzptb3YtdG8tSU5ELVBLUiszOwlJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnMsIElDOm1vdi1mcm9tLUlORC1QS1IrNCwgSUM6cHJvYmUtYWxsOwlkYXRhCi1QS1IjOwlJQzptb3YtdG8tSU5ELVBLUiszOwlJQzptb3YtdG8tSU5ELVBLUis0Owlub25lCi1QS1IjOwlJQzptb3YtdG8tSU5ELVBLUiszOwlJQzptb3YtZnJvbS1JTkQtUEtSKzM7CWltcGxpZWRGCi1QS1IjOwlJQzptb3YtdG8tSU5ELVBLUiszOwlJQzptb3YtdG8tSU5ELVBLUiszOwlpbXBsaWVkRgotUE1DIzsJSUM6bW92LXRvLUlORC1QTUMrMzsJSUM6bW92LWZyb20tSU5ELVBNQyszOwlpbXBsaWVkRgotUE1DIzsJSUM6bW92LXRvLUlORC1QTUMrMzsJSUM6bW92LWZyb20tSU5ELVBNRCszOwlTQyszIFNlY3Rpb24gMTIuMS4xCi1QTUQjOwlJQzptb3YtdG8tSU5ELVBNRCszOwlJQzptb3YtZnJvbS1JTkQtUE1EKzM7CWltcGxpZWRGCi1QUjA7CUlDOnByLXdyaXRlcnMrMTsJSUM6cHItcmVhZGVycy1icisxLCBJQzpwci1yZWFkZXJzLW5vYnItbm9tb3ZwcisxICwgSUM6bW92LWZyb20tUFIrMTIsIElDOm1vdi10by1QUisxMjsJbm9uZQotUFIlLCAlIGluIDEgLSA2MjsJSUM6cHItd3JpdGVycysxLCBJQzptb3YtdG8tUFItYWxscmVnKzcsIElDOm1vdi10by1QUi1yb3RyZWc7CUlDOnByLXJlYWRlcnMtbm9ici1ub21vdnByKzEgLCBJQzptb3YtZnJvbS1QUiwgSUM6bW92LXRvLVBSKzEyOwlpbXBsaWVkRgotUFIlLCAlIGluIDEgLSA2MjsJSUM6cHItd3JpdGVycy1mcCsxOwlJQzpwci1yZWFkZXJzLWJyKzE7CWltcGxpZWRGCi1QUiUsICUgaW4gMSAtIDYyOwlJQzpwci13cml0ZXJzLWludCsxLCBJQzptb3YtdG8tUFItYWxscmVnKzcsIElDOm1vdi10by1QUi1yb3RyZWc7CUlDOnByLXJlYWRlcnMtYnIrMTsJbm9uZQotUFI2MzsJSUM6bW9kLXNjaGVkLWJycywgSUM6cHItd3JpdGVycysxLCBJQzptb3YtdG8tUFItYWxscmVnKzcsIElDOm1vdi10by1QUi1yb3RyZWc7CUlDOnByLXJlYWRlcnMtbm9ici1ub21vdnByKzEgLCBJQzptb3YtZnJvbS1QUiwgSUM6bW92LXRvLVBSKzEyOwlpbXBsaWVkRgotUFI2MzsJSUM6cHItd3JpdGVycy1mcCsxLCBJQzptb2Qtc2NoZWQtYnJzOwlJQzpwci1yZWFkZXJzLWJyKzE7CWltcGxpZWRGCi1QUjYzOwlJQzpwci13cml0ZXJzLWludCsxLCBJQzptb3YtdG8tUFItYWxscmVnKzcsIElDOm1vdi10by1QUi1yb3RyZWc7CUlDOnByLXJlYWRlcnMtYnIrMTsJbm9uZQotUFNSLmFjOwlJQzp1c2VyLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItdW07CUlDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVyczsJaW1wbGllZAotUFNSLmFjOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVyczsJZGF0YQotUFNSLmFjOwlJQzp1c2VyLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItdW0sIElDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tUFNSLCBJQzptb3YtZnJvbS1QU1ItdW07CWltcGxpZWRGCi1QU1IuYmU7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bTsJSUM6bWVtLXJlYWRlcnMsIElDOm1lbS13cml0ZXJzOwlpbXBsaWVkCi1QU1IuYmU7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bWVtLXJlYWRlcnMsIElDOm1lbS13cml0ZXJzOwlkYXRhCi1QU1IuYmU7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1IsIElDOm1vdi1mcm9tLVBTUi11bTsJaW1wbGllZEYKLVBTUi5ibjsJYnN3LCByZmk7CUlDOmdyLXJlYWRlcnMrMTAsIElDOmdyLXdyaXRlcnMrMTA7CWltcGxpZWRGCi1QU1IuY3BsOwllcGMsIGJyLnJldCwgcmZpOwlJQzpwcml2LW9wcywgYnIuY2FsbCwgYnJsLmNhbGwsIGVwYywgSUM6bW92LWZyb20tQVItSVRDLCBJQzptb3YtdG8tQVItSVRDLCBJQzptb3YtdG8tQVItUlNDLCBJQzptb3YtdG8tQVItSywgSUM6bW92LWZyb20tSU5ELVBNRCwgSUM6cHJvYmUtYWxsLCBJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnMsIElDOmxmZXRjaC1hbGw7CWltcGxpZWQKLVBTUi5kYTsJcmZpOwlJQzptZW0tcmVhZGVycywgSUM6bGZldGNoLWZhdWx0LCBJQzptZW0td3JpdGVycywgSUM6cHJvYmUtZmF1bHQ7CWRhdGEKLVBTUi5kYjsJSUM6bW92LXRvLVBTUi1sOwlJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnMsIElDOnByb2JlLWZhdWx0OwlkYXRhCi1QU1IuZGI7CUlDOm1vdi10by1QU1ItbDsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLmRiOwlyZmk7CUlDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVycywgSUM6bW92LWZyb20tUFNSLCBJQzpwcm9iZS1mYXVsdDsJZGF0YQotUFNSLmRkOwlyZmk7CUlDOm1lbS1yZWFkZXJzLCBJQzpwcm9iZS1mYXVsdCwgSUM6bWVtLXdyaXRlcnMsIElDOmxmZXRjaC1mYXVsdDsJZGF0YQotUFNSLmRmaDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzpmci1yZWFkZXJzKzgsIElDOmZyLXdyaXRlcnMrODsJZGF0YQotUFNSLmRmaDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1I7CWltcGxpZWRGCi1QU1IuZGZsOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOmZyLXdyaXRlcnMrOCwgSUM6ZnItcmVhZGVycys4OwlkYXRhCi1QU1IuZGZsOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi1mcm9tLVBTUjsJaW1wbGllZEYKLVBTUi5kaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlici5pYTsJZGF0YQotUFNSLmRpOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi1mcm9tLVBTUjsJaW1wbGllZEYKLVBTUi5kdDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptZW0tcmVhZGVycywgSUM6bWVtLXdyaXRlcnM7CWRhdGEKLVBTUi5kdDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1I7CWltcGxpZWRGCi1QU1IuZWQ7CXJmaTsJSUM6bGZldGNoLWFsbCwgSUM6bWVtLXJlYWRlcnMtc3BlYzsJZGF0YQotUFNSLmk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWw7CUlDOm1vdi1mcm9tLVBTUjsJaW1wbGllZEYKLVBTUi5pOwlyZmk7CUlDOm1vdi1mcm9tLVBTUjsJZGF0YQotUFNSLmlhOwlyZmk7CUlDOm5vbmU7CW5vbmUKLVBTUi5pYzsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1I7CWltcGxpZWRGCi1QU1IuaWM7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJY292ZXIsIGl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kLCBJQzptb3YtZnJvbS1DUi1JVElSLCBJQzptb3YtZnJvbS1DUi1JRlMsIElDOm1vdi1mcm9tLUNSLUlJTSwgSUM6bW92LWZyb20tQ1ItSUlQLCBJQzptb3YtZnJvbS1DUi1JUFNSLCBJQzptb3YtZnJvbS1DUi1JU1IsIElDOm1vdi1mcm9tLUNSLUlGQSwgSUM6bW92LWZyb20tQ1ItSUhBLCBJQzptb3YtZnJvbS1DUi1JSVBBLCBJQzptb3YtdG8tQ1ItSVRJUiwgSUM6bW92LXRvLUNSLUlGUywgSUM6bW92LXRvLUNSLUlJTSwgSUM6bW92LXRvLUNSLUlJUCwgSUM6bW92LXRvLUNSLUlQU1IsIElDOm1vdi10by1DUi1JU1IsIElDOm1vdi10by1DUi1JRkEsIElDOm1vdi10by1DUi1JSEEsIElDOm1vdi10by1DUi1JSVBBOwlkYXRhCi1QU1IuaWQ7CXJmaTsJSUM6bm9uZTsJbm9uZQotUFNSLmlzOwlici5pYSwgcmZpOwlJQzpub25lOwlub25lCi1QU1IuaXQ7CXJmaTsJSUM6YnJhbmNoZXMsIElDOm1vdi1mcm9tLVBTUiwgY2hrLCBlcGMsIGZjaGtmOwlkYXRhCi1QU1IubHA7CUlDOm1vdi10by1QU1ItbDsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLmxwOwlJQzptb3YtdG8tUFNSLWw7CWJyLnJldDsJZGF0YQotUFNSLmxwOwlyZmk7CUlDOm1vdi1mcm9tLVBTUiwgYnIucmV0OwlkYXRhCi1QU1IubWM7CXJmaTsJSUM6bW92LWZyb20tUFNSOwlub25lCi1QU1IubWZoOwlJQzpmci13cml0ZXJzKzksIElDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1ItdW0sIElDOm1vdi1mcm9tLVBTUjsJaW1wbGllZEYKLVBTUi5tZmw7CUlDOmZyLXdyaXRlcnMrOSwgSUM6dXNlci1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLXVtLCBJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi1mcm9tLVBTUi11bSwgSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLnBrOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1lbS1yZWFkZXJzLCBJQzptZW0td3JpdGVycywgSUM6cHJvYmUtYWxsOwlkYXRhCi1QU1IucGs7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLnBwOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi1mcm9tLVBTUjsJaW1wbGllZEYKLVBTUi5yaTsJcmZpOwlJQzpub25lOwlub25lCi1QU1IucnQ7CUlDOm1vdi10by1QU1ItbDsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLnJ0OwlJQzptb3YtdG8tUFNSLWw7CWFsbG9jLCBmbHVzaHJzLCBsb2FkcnM7CWRhdGEKLVBTUi5ydDsJcmZpOwlJQzptb3YtZnJvbS1QU1IsIGFsbG9jLCBmbHVzaHJzLCBsb2FkcnM7CWRhdGEKLVBTUi5zaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtZnJvbS1QU1I7CWltcGxpZWRGCi1QU1Iuc2k7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tQVItSVRDOwlkYXRhCi1QU1Iuc3A7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLnNwOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi1mcm9tLUlORC1QTUQsIElDOm1vdi10by1QU1ItdW0sIHJ1bSwgc3VtOwlkYXRhCi1QU1Iuc3M7CXJmaTsJSUM6YWxsOwlkYXRhCi1QU1IudGI7CUlDOm1vdi10by1QU1ItbCwgcmZpOwlJQzpicmFuY2hlcywgY2hrLCBmY2hrZjsJZGF0YQotUFNSLnRiOwlJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tUFNSOwlpbXBsaWVkRgotUFNSLnVwOwlJQzp1c2VyLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItdW0sIElDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LWZyb20tUFNSLXVtLCBJQzptb3YtZnJvbS1QU1I7CWltcGxpZWRGCi1SUiM7CUlDOm1vdi10by1JTkQtUlIrNjsJSUM6bWVtLXJlYWRlcnMsIElDOm1lbS13cml0ZXJzLCBpdGMuaSwgaXRjLmQsIGl0ci5pLCBpdHIuZCwgSUM6cHJvYmUtYWxsLCBwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmksIHB0ci5kLCB0YWssIHRoYXNoLCB0cGEsIHR0YWc7CWRhdGEKLVJSIzsJSUM6bW92LXRvLUlORC1SUis2OwlJQzptb3YtZnJvbS1JTkQtUlIrNjsJaW1wbGllZEYKLVJTRTsJSUM6cnNlLXdyaXRlcnMrMTQ7CUlDOnJzZS1yZWFkZXJzKzE0OwlpbXBsaWVkRgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pYTY0LXdhci50YmwgYi9vcGNvZGVzL2lhNjQtd2FyLnRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0OWUwOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2lhNjQtd2FyLnRibAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotUmVzb3VyY2UgTmFtZTsJUmVhZGVyczsJV3JpdGVyczsJUmVzdWx0cyBvZiBEZXBlbmRlbmN5Ci1QUjYzOwlJQzpwci1yZWFkZXJzLWJyKzE7CUlDOm1vZC1zY2hlZC1icnM7CWltcGxpZWRGCmRpZmYgLS1naXQgYS9vcGNvZGVzL2lhNjQtd2F3LnRibCBiL29wY29kZXMvaWE2NC13YXcudGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmE3NDNlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaWE2NC13YXcudGJsCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLVJlc291cmNlIE5hbWU7CVdyaXRlcnM7CVdyaXRlcnM7CVNlbWFudGljcyBvZiBEZXBlbmRlbmN5Ci1BTEFUOwlJQzptZW0tcmVhZGVycy1hbGF0LCBJQzptZW0td3JpdGVycywgY2hrLmEuY2xyLCBJQzppbnZhbGEtYWxsOwlJQzptZW0tcmVhZGVycy1hbGF0LCBJQzptZW0td3JpdGVycywgY2hrLmEuY2xyLCBJQzppbnZhbGEtYWxsOwlub25lCi1BUltCU1BdOwlici5jYWxsLCBicmwuY2FsbCwgYnIucmV0LCBjb3ZlciwgSUM6bW92LXRvLUFSLUJTUFNUT1JFLCByZmk7CWJyLmNhbGwsIGJybC5jYWxsLCBici5yZXQsIGNvdmVyLCBJQzptb3YtdG8tQVItQlNQU1RPUkUsIHJmaTsJaW1wbGllZEYKLUFSW0JTUFNUT1JFXTsJYWxsb2MsIGxvYWRycywgZmx1c2hycywgSUM6bW92LXRvLUFSLUJTUFNUT1JFOwlhbGxvYywgbG9hZHJzLCBmbHVzaHJzLCBJQzptb3YtdG8tQVItQlNQU1RPUkU7CWltcGxpZWRGCi1BUltDQ1ZdOwlJQzptb3YtdG8tQVItQ0NWOwlJQzptb3YtdG8tQVItQ0NWOwlpbXBsaWVkRgotQVJbRUNdOwlici5yZXQsIElDOm1vZC1zY2hlZC1icnMsIElDOm1vdi10by1BUi1FQzsJYnIucmV0LCBJQzptb2Qtc2NoZWQtYnJzLCBJQzptb3YtdG8tQVItRUM7CWltcGxpZWRGCi1BUltGUFNSXS5zZjAuY29udHJvbHM7CUlDOm1vdi10by1BUi1GUFNSLCBmc2V0Yy5zMDsJSUM6bW92LXRvLUFSLUZQU1IsIGZzZXRjLnMwOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YxLmNvbnRyb2xzOwlJQzptb3YtdG8tQVItRlBTUiwgZnNldGMuczE7CUlDOm1vdi10by1BUi1GUFNSLCBmc2V0Yy5zMTsJaW1wbGllZEYKLUFSW0ZQU1JdLnNmMi5jb250cm9sczsJSUM6bW92LXRvLUFSLUZQU1IsIGZzZXRjLnMyOwlJQzptb3YtdG8tQVItRlBTUiwgZnNldGMuczI7CWltcGxpZWRGCi1BUltGUFNSXS5zZjMuY29udHJvbHM7CUlDOm1vdi10by1BUi1GUFNSLCBmc2V0Yy5zMzsJSUM6bW92LXRvLUFSLUZQU1IsIGZzZXRjLnMzOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YwLmZsYWdzOwlJQzpmcC1hcml0aC1zMCwgSUM6ZmNtcC1zMCwgSUM6ZnBjbXAtczA7CUlDOmZwLWFyaXRoLXMwLCBJQzpmY21wLXMwLCBJQzpmcGNtcC1zMDsJbm9uZQotQVJbRlBTUl0uc2YwLmZsYWdzOwlmY2xyZi5zMCwgSUM6ZmNtcC1zMCwgSUM6ZnAtYXJpdGgtczAsIElDOmZwY21wLXMwLCBJQzptb3YtdG8tQVItRlBTUjsJZmNscmYuczAsIElDOm1vdi10by1BUi1GUFNSOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YxLmZsYWdzOwlJQzpmcC1hcml0aC1zMSwgSUM6ZmNtcC1zMSwgSUM6ZnBjbXAtczE7CUlDOmZwLWFyaXRoLXMxLCBJQzpmY21wLXMxLCBJQzpmcGNtcC1zMTsJbm9uZQotQVJbRlBTUl0uc2YxLmZsYWdzOwlmY2xyZi5zMSwgSUM6ZmNtcC1zMSwgSUM6ZnAtYXJpdGgtczEsIElDOmZwY21wLXMxLCBJQzptb3YtdG8tQVItRlBTUjsJZmNscmYuczEsIElDOm1vdi10by1BUi1GUFNSOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YyLmZsYWdzOwlJQzpmcC1hcml0aC1zMiwgSUM6ZmNtcC1zMiwgSUM6ZnBjbXAtczI7CUlDOmZwLWFyaXRoLXMyLCBJQzpmY21wLXMyLCBJQzpmcGNtcC1zMjsJbm9uZQotQVJbRlBTUl0uc2YyLmZsYWdzOwlmY2xyZi5zMiwgSUM6ZmNtcC1zMiwgSUM6ZnAtYXJpdGgtczIsIElDOmZwY21wLXMyLCBJQzptb3YtdG8tQVItRlBTUjsJZmNscmYuczIsIElDOm1vdi10by1BUi1GUFNSOwlpbXBsaWVkRgotQVJbRlBTUl0uc2YzLmZsYWdzOwlJQzpmcC1hcml0aC1zMywgSUM6ZmNtcC1zMywgSUM6ZnBjbXAtczM7CUlDOmZwLWFyaXRoLXMzLCBJQzpmY21wLXMzLCBJQzpmcGNtcC1zMzsJbm9uZQotQVJbRlBTUl0uc2YzLmZsYWdzOwlmY2xyZi5zMywgSUM6ZmNtcC1zMywgSUM6ZnAtYXJpdGgtczMsIElDOmZwY21wLXMzLCBJQzptb3YtdG8tQVItRlBTUjsJZmNscmYuczMsIElDOm1vdi10by1BUi1GUFNSOwlpbXBsaWVkRgotQVJbRlBTUl0ucnY7CUlDOm1vdi10by1BUi1GUFNSOwlJQzptb3YtdG8tQVItRlBTUjsJaW1wbGllZEYKLUFSW0ZQU1JdLnRyYXBzOwlJQzptb3YtdG8tQVItRlBTUjsJSUM6bW92LXRvLUFSLUZQU1I7CWltcGxpZWRGCi1BUltJVENdOwlJQzptb3YtdG8tQVItSVRDOwlJQzptb3YtdG8tQVItSVRDOwlpbXBsaWVkRgotQVJbSyVdLCAlIGluIDAgLSA3OwlJQzptb3YtdG8tQVItSysxOwlJQzptb3YtdG8tQVItSysxOwlpbXBsaWVkRgotQVJbTENdOwlJQzptb2Qtc2NoZWQtYnJzLWNvdW50ZWQsIElDOm1vdi10by1BUi1MQzsJSUM6bW9kLXNjaGVkLWJycy1jb3VudGVkLCBJQzptb3YtdG8tQVItTEM7CWltcGxpZWRGCi1BUltQRlNdOwlici5jYWxsLCBicmwuY2FsbDsJYnIuY2FsbCwgYnJsLmNhbGw7CW5vbmUKLUFSW1BGU107CWJyLmNhbGwsIGJybC5jYWxsOwlJQzptb3YtdG8tQVItUEZTOwlpbXBsaWVkRgotQVJbUk5BVF07CWFsbG9jLCBmbHVzaHJzLCBsb2FkcnMsIElDOm1vdi10by1BUi1STkFULCBJQzptb3YtdG8tQVItQlNQU1RPUkU7CWFsbG9jLCBmbHVzaHJzLCBsb2FkcnMsIElDOm1vdi10by1BUi1STkFULCBJQzptb3YtdG8tQVItQlNQU1RPUkU7CWltcGxpZWRGCi1BUltSU0NdOwlJQzptb3YtdG8tQVItUlNDOwlJQzptb3YtdG8tQVItUlNDOwlpbXBsaWVkRgotQVJbVU5BVF17JX0sICUgaW4gMCAtIDYzOwlJQzptb3YtdG8tQVItVU5BVCwgc3Q4LnNwaWxsOwlJQzptb3YtdG8tQVItVU5BVCwgc3Q4LnNwaWxsOwlpbXBsaWVkRgotQVIlLCAlIGluIDgtMTUsIDIwLCAyMi0yMywgMzEsIDMzLTM1LCAzNy0zOSwgNDEtNDMsIDQ1LTQ3LCA2Ny0xMTE7CUlDOm5vbmU7CUlDOm5vbmU7CW5vbmUKLUFSJSwgJSBpbiA0OCAtIDYzLCAxMTItMTI3OwlJQzptb3YtdG8tQVItaWcrMTsJSUM6bW92LXRvLUFSLWlnKzE7CWltcGxpZWRGCi1CUiUsICUgaW4gMCAtIDc7CWJyLmNhbGwrMSwgYnJsLmNhbGwrMTsJSUM6bW92LXRvLUJSKzE7CWltcGxpZWRGCi1CUiUsICUgaW4gMCAtIDc7CUlDOm1vdi10by1CUisxOwlJQzptb3YtdG8tQlIrMTsJaW1wbGllZEYKLUJSJSwgJSBpbiAwIC0gNzsJYnIuY2FsbCsxLCBicmwuY2FsbCsxOwlici5jYWxsKzEsIGJybC5jYWxsKzE7CW5vbmUKLUNGTTsJSUM6bW9kLXNjaGVkLWJycywgYnIuY2FsbCwgYnJsLmNhbGwsIGJyLnJldCwgYWxsb2MsIGNscnJyYiwgY292ZXIsIHJmaTsJSUM6bW9kLXNjaGVkLWJycywgYnIuY2FsbCwgYnJsLmNhbGwsIGJyLnJldCwgYWxsb2MsIGNscnJyYiwgY292ZXIsIHJmaTsJaW1wbGllZEYKLUNQVUlEIzsJSUM6bm9uZTsJSUM6bm9uZTsJbm9uZQotQ1JbQ01DVl07CUlDOm1vdi10by1DUi1DTUNWOwlJQzptb3YtdG8tQ1ItQ01DVjsJaW1wbGllZEYKLUNSW0RDUl07CUlDOm1vdi10by1DUi1EQ1I7CUlDOm1vdi10by1DUi1EQ1I7CWltcGxpZWRGCi1DUltFT0ldOwlJQzptb3YtdG8tQ1ItRU9JOwlJQzptb3YtdG8tQ1ItRU9JOwlTQyBTZWN0aW9uIDEwLjguMy40Ci1DUltHUFRBXTsJSUM6bW92LXRvLUNSLUdQVEE7CUlDOm1vdi10by1DUi1HUFRBOwlpbXBsaWVkRgotQ1JbSUZBXTsJSUM6bW92LXRvLUNSLUlGQTsJSUM6bW92LXRvLUNSLUlGQTsJaW1wbGllZEYKLUNSW0lGU107CUlDOm1vdi10by1DUi1JRlMsIGNvdmVyOwlJQzptb3YtdG8tQ1ItSUZTLCBjb3ZlcjsJaW1wbGllZEYKLUNSW0lIQV07CUlDOm1vdi10by1DUi1JSEE7CUlDOm1vdi10by1DUi1JSEE7CWltcGxpZWRGCi1DUltJSU1dOwlJQzptb3YtdG8tQ1ItSUlNOwlJQzptb3YtdG8tQ1ItSUlNOwlpbXBsaWVkRgotQ1JbSUlQXTsJSUM6bW92LXRvLUNSLUlJUDsJSUM6bW92LXRvLUNSLUlJUDsJaW1wbGllZEYKLUNSW0lJUEFdOwlJQzptb3YtdG8tQ1ItSUlQQTsJSUM6bW92LXRvLUNSLUlJUEE7CWltcGxpZWRGCi1DUltJUFNSXTsJSUM6bW92LXRvLUNSLUlQU1I7CUlDOm1vdi10by1DUi1JUFNSOwlpbXBsaWVkRgotQ1JbSVJSJV0sICUgaW4gMCAtIDM7CUlDOm1vdi1mcm9tLUNSLUlWUjsJSUM6bW92LWZyb20tQ1ItSVZSOwlpbXBsaWVkRgotQ1JbSVNSXTsJSUM6bW92LXRvLUNSLUlTUjsJSUM6bW92LXRvLUNSLUlTUjsJaW1wbGllZEYKLUNSW0lUSVJdOwlJQzptb3YtdG8tQ1ItSVRJUjsJSUM6bW92LXRvLUNSLUlUSVI7CWltcGxpZWRGCi1DUltJVE1dOwlJQzptb3YtdG8tQ1ItSVRNOwlJQzptb3YtdG8tQ1ItSVRNOwlpbXBsaWVkRgotQ1JbSVRWXTsJSUM6bW92LXRvLUNSLUlUVjsJSUM6bW92LXRvLUNSLUlUVjsJaW1wbGllZEYKLUNSW0lWQV07CUlDOm1vdi10by1DUi1JVkE7CUlDOm1vdi10by1DUi1JVkE7CWltcGxpZWRGCi1DUltJVlJdOwlJQzpub25lOwlJQzpub25lOwlTQwotQ1JbTElEXTsJSUM6bW92LXRvLUNSLUxJRDsJSUM6bW92LXRvLUNSLUxJRDsJU0MKLUNSW0xSUiVdLCAlIGluIDAgLSAxOwlJQzptb3YtdG8tQ1ItTFJSKzE7CUlDOm1vdi10by1DUi1MUlIrMTsJaW1wbGllZEYKLUNSW1BNVl07CUlDOm1vdi10by1DUi1QTVY7CUlDOm1vdi10by1DUi1QTVY7CWltcGxpZWRGCi1DUltQVEFdOwlJQzptb3YtdG8tQ1ItUFRBOwlJQzptb3YtdG8tQ1ItUFRBOwlpbXBsaWVkRgotQ1JbVFBSXTsJSUM6bW92LXRvLUNSLVRQUjsJSUM6bW92LXRvLUNSLVRQUjsJaW1wbGllZEYKLUNSJSwgJSBpbiAzLTcsIDEwLTE1LCAxOCwgMjYtNjMsIDc1LTc5LCA4Mi0xMjc7CUlDOm5vbmU7CUlDOm5vbmU7CW5vbmUKLURCUiM7CUlDOm1vdi10by1JTkQtREJSKzM7CUlDOm1vdi10by1JTkQtREJSKzM7CWltcGxpZWRGCi1EVEM7CXB0Yy5lLCBwdGMuZywgcHRjLmdhLCBwdGMubCwgcHRyLmksIHB0ci5kOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJbm9uZQotRFRDOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZCwgaXRjLmksIGl0Yy5kLCBpdHIuaSwgaXRyLmQ7CWl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kOwlpbXBsaWVkRgotRFRDX0xJTUlUKjsJcHRjLmcsIHB0Yy5nYTsJcHRjLmcsIHB0Yy5nYTsJaW1wbGllZEYKLURUUjsJaXRyLmQ7CWl0ci5kOwlpbXBsaWVkRgotRFRSOwlpdHIuZDsJcHRyLmQ7CWltcGxpZWRGCi1EVFI7CXB0ci5kOwlwdHIuZDsJbm9uZQotRlIlLCAlIGluIDAgLSAxOwlJQzpub25lOwlJQzpub25lOwlub25lCi1GUiUsICUgaW4gMiAtIDEyNzsJSUM6ZnItd3JpdGVycysxLCBJQzpsZGYtYysxLCBJQzpsZGZwLWMrMTsJSUM6ZnItd3JpdGVycysxLCBJQzpsZGYtYysxLCBJQzpsZGZwLWMrMTsJaW1wbGllZEYKLUdSMDsJSUM6bm9uZTsJSUM6bm9uZTsJbm9uZQotR1IlLCAlIGluIDEgLSAxMjc7CUlDOmxkLWMrMSwgSUM6Z3Itd3JpdGVycysxOwlJQzpsZC1jKzEsIElDOmdyLXdyaXRlcnMrMTsJaW1wbGllZEYKLUlCUiM7CUlDOm1vdi10by1JTkQtSUJSKzM7CUlDOm1vdi10by1JTkQtSUJSKzM7CWltcGxpZWRGCi1JblNlcnZpY2UqOwlJQzptb3YtdG8tQ1ItRU9JLCBJQzptb3YtZnJvbS1DUi1JVlI7CUlDOm1vdi10by1DUi1FT0ksIElDOm1vdi1mcm9tLUNSLUlWUjsJU0MKLUlQOwlJQzphbGw7CUlDOmFsbDsJbm9uZQotSVRDOwlwdGMuZSwgcHRjLmcsIHB0Yy5nYSwgcHRjLmwsIHB0ci5pLCBwdHIuZDsJcHRjLmUsIHB0Yy5nLCBwdGMuZ2EsIHB0Yy5sLCBwdHIuaSwgcHRyLmQ7CW5vbmUKLUlUQzsJcHRjLmUsIHB0Yy5nLCBwdGMuZ2EsIHB0Yy5sLCBwdHIuaSwgcHRyLmQsIGl0Yy5pLCBpdGMuZCwgaXRyLmksIGl0ci5kOwlpdGMuaSwgaXRjLmQsIGl0ci5pLCBpdHIuZDsJaW1wbGllZEYKLUlUUjsJaXRyLmk7CWl0ci5pLCBwdHIuaTsJaW1wbGllZEYKLUlUUjsJcHRyLmk7CXB0ci5pOwlub25lCi1tZW1vcnk7CUlDOm1lbS13cml0ZXJzOwlJQzptZW0td3JpdGVyczsJbm9uZQotTVNSIzsJSUM6bW92LXRvLUlORC1NU1IrNTsJSUM6bW92LXRvLUlORC1NU1IrNTsJU0MKLVBLUiM7CUlDOm1vdi10by1JTkQtUEtSKzM7CUlDOm1vdi10by1JTkQtUEtSKzQ7CW5vbmUKLVBLUiM7CUlDOm1vdi10by1JTkQtUEtSKzM7CUlDOm1vdi10by1JTkQtUEtSKzM7CWltcGxpZWRGCi1QTUMjOwlJQzptb3YtdG8tSU5ELVBNQyszOwlJQzptb3YtdG8tSU5ELVBNQyszOwlpbXBsaWVkRgotUE1EIzsJSUM6bW92LXRvLUlORC1QTUQrMzsJSUM6bW92LXRvLUlORC1QTUQrMzsJaW1wbGllZEYKLVBSMDsJSUM6cHItd3JpdGVycysxOwlJQzpwci13cml0ZXJzKzE7CW5vbmUKLVBSJSwgJSBpbiAxIC0gNjI7CUlDOnByLWFuZC13cml0ZXJzKzE7CUlDOnByLWFuZC13cml0ZXJzKzE7CW5vbmUKLVBSJSwgJSBpbiAxIC0gNjI7CUlDOnByLW9yLXdyaXRlcnMrMTsJSUM6cHItb3Itd3JpdGVycysxOwlub25lCi1QUiUsICUgaW4gMSAtIDYyOwlJQzpwci11bmMtd3JpdGVycy1mcCsxLCBJQzpwci11bmMtd3JpdGVycy1pbnQrMSwgSUM6cHItbm9ybS13cml0ZXJzLWZwKzEsIElDOnByLW5vcm0td3JpdGVycy1pbnQrMSwgSUM6cHItYW5kLXdyaXRlcnMrMSwgSUM6bW92LXRvLVBSKzc7CUlDOnByLXVuYy13cml0ZXJzLWZwKzEsIElDOnByLXVuYy13cml0ZXJzLWludCsxLCBJQzpwci1ub3JtLXdyaXRlcnMtZnArMSwgSUM6cHItbm9ybS13cml0ZXJzLWludCsxLCBJQzpwci1vci13cml0ZXJzKzEsIElDOm1vdi10by1QUis3OwlpbXBsaWVkRgotUFI2MzsJSUM6cHItYW5kLXdyaXRlcnMrMTsJSUM6cHItYW5kLXdyaXRlcnMrMTsJbm9uZQotUFI2MzsJSUM6cHItb3Itd3JpdGVycysxOwlJQzpwci1vci13cml0ZXJzKzE7CW5vbmUKLVBSNjM7CUlDOm1vZC1zY2hlZC1icnMsIElDOnByLXVuYy13cml0ZXJzLWZwKzEsIElDOnByLXVuYy13cml0ZXJzLWludCsxLCBJQzpwci1ub3JtLXdyaXRlcnMtZnArMSwgSUM6cHItbm9ybS13cml0ZXJzLWludCsxLCBJQzpwci1hbmQtd3JpdGVycysxLCBJQzptb3YtdG8tUFIrNzsJSUM6bW9kLXNjaGVkLWJycywgSUM6cHItdW5jLXdyaXRlcnMtZnArMSwgSUM6cHItdW5jLXdyaXRlcnMtaW50KzEsIElDOnByLW5vcm0td3JpdGVycy1mcCsxLCBJQzpwci1ub3JtLXdyaXRlcnMtaW50KzEsIElDOnByLW9yLXdyaXRlcnMrMSwgSUM6bW92LXRvLVBSKzc7CWltcGxpZWRGCi1QU1IuYWM7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzp1c2VyLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItdW0sIElDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi5iZTsJSUM6dXNlci1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLXVtLCBJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLmJuOwlic3csIHJmaTsJYnN3LCByZmk7CWltcGxpZWRGCi1QU1IuY3BsOwllcGMsIGJyLnJldCwgcmZpOwllcGMsIGJyLnJldCwgcmZpOwlpbXBsaWVkRgotUFNSLmRhOwlyZmk7CXJmaTsJaW1wbGllZEYKLVBTUi5kYjsJSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLmRkOwlyZmk7CXJmaTsJaW1wbGllZEYKLVBTUi5kZmg7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLmRmbDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CWltcGxpZWRGCi1QU1IuZGk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLmR0OwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi5lZDsJcmZpOwlyZmk7CWltcGxpZWRGCi1QU1IuaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CWltcGxpZWRGCi1QU1IuaWE7CXJmaTsJcmZpOwlpbXBsaWVkRgotUFNSLmljOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi5pZDsJcmZpOwlyZmk7CWltcGxpZWRGCi1QU1IuaXM7CWJyLmlhLCByZmk7CWJyLmlhLCByZmk7CWltcGxpZWRGCi1QU1IuaXQ7CXJmaTsJcmZpOwlpbXBsaWVkRgotUFNSLmxwOwlJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LXRvLVBTUi1sLCByZmk7CWltcGxpZWRGCi1QU1IubWM7CXJmaTsJcmZpOwlpbXBsaWVkRgotUFNSLm1maDsJSUM6ZnItd3JpdGVycys5OwlJQzpmci13cml0ZXJzKzk7CW5vbmUKLVBTUi5tZmg7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6ZnItd3JpdGVycys5LCBJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLm1mbDsJSUM6ZnItd3JpdGVycys5OwlJQzpmci13cml0ZXJzKzk7CW5vbmUKLVBTUi5tZmw7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6ZnItd3JpdGVycys5LCBJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLnBrOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi5wcDsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CWltcGxpZWRGCi1QU1Iucmk7CXJmaTsJcmZpOwlpbXBsaWVkRgotUFNSLnJ0OwlJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6bW92LXRvLVBTUi1sLCByZmk7CWltcGxpZWRGCi1QU1Iuc2k7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUFNSLnNwOwlJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnN5cy1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi5zczsJcmZpOwlyZmk7CWltcGxpZWRGCi1QU1IudGI7CUlDOm1vdi10by1QU1ItbCwgcmZpOwlJQzptb3YtdG8tUFNSLWwsIHJmaTsJaW1wbGllZEYKLVBTUi51cDsJSUM6dXNlci1tYXNrLXdyaXRlcnMtcGFydGlhbCs3LCBJQzptb3YtdG8tUFNSLXVtLCBJQzpzeXMtbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi1sLCByZmk7CUlDOnVzZXItbWFzay13cml0ZXJzLXBhcnRpYWwrNywgSUM6bW92LXRvLVBTUi11bSwgSUM6c3lzLW1hc2std3JpdGVycy1wYXJ0aWFsKzcsIElDOm1vdi10by1QU1ItbCwgcmZpOwlpbXBsaWVkRgotUlIjOwlJQzptb3YtdG8tSU5ELVJSKzY7CUlDOm1vdi10by1JTkQtUlIrNjsJaW1wbGllZEYKLVJTRTsJSUM6cnNlLXdyaXRlcnMrMTQ7CUlDOnJzZS13cml0ZXJzKzE0OwlpbXBsaWVkRgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMgYi9vcGNvZGVzL20xMDIwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkNTQ2Mi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDIwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNTjEwMjAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nLAotCQkJCSB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMjAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICB1bnNpZ25lZCBpbnQgY29uc3VtZTsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMCkgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgzMAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhhMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWIKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNgotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZlCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmYpCi0gICAgewotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4NDAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgd2l0aCBhIDE2Yml0IG9wZXJhbmQgaW4gbGl0dGxlCi0gICAgIGVuZGlhbiBmb3JtLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGRjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGVjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZkKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgdG9vLCBidXQgd2UgZG9uJ3QgaGF2ZSB0byBtZXNzIHdpdGgKLSAgICAgZW5kaWFubmVzcyBzdHVmZi4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjQpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNCwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIgPDwgOCkgJiAweGZmMDA7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBleHRlbnNpb24gPSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7Ci0gICAgICBjb25zdW1lID0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDJ4IiksIGluc24pOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICBpbnQgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzEpCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMwotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCW15c2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF82KQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF83KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0JCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCWV4dHJhX3NoaWZ0ID0gODsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF83KQotCWV4dHJhX3NoaWZ0ID0gMTY7Ci0gICAgICBlbHNlCi0JZXh0cmFfc2hpZnQgPSAwOwotCi0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoaW5zbiAmIDB4ZmZmZikgPDwgODsKLQkJICB2YWx1ZSB8PSBleHRlbnNpb247Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDFMIDw8IG9wZXJhbmQtPmJpdHMpIC0gMUwpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKHZhbHVlICsgbWVtYWRkciArIG15c2l6ZSkgJiAweGZmZmZmZiwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDRseCIpLCBpbnNuKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1vcGMuYyBiL29wY29kZXMvbTEwMjAwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk3MTM3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qIEFzc2VtYmxlIE1hdHN1c2hpdGEgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgotCi0MCi1jb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXSA9IHsKLSNkZWZpbmUgVU5VU0VECTAKLSAgezAsIDAsIDB9LCAKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMSAgICAgIChETjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjAgICAgICAoRE0xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMSAgICAgIChBTjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTAgICAgICAoQU4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMSAgICAgIChBTTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMSsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAyNCBpbW1lZGlhdGUsIGxvdyAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCi0KLSNkZWZpbmUgSU1NMjQgICAgKElNTTE2X01FTSsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRH0sCi0KLS8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIElNTTI0X1BDUkVMICAgIChJTU0yNCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfTUVNICAgIChJTU0yNF9QQ1JFTCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KLSNkZWZpbmUgUFNXICAgIChJTU0yNF9NRU0rMSkKLSAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgNCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDE2KzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fUENSRUwrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IG5vdCBwcm9tb3RlLiAgKi8KLSNkZWZpbmUgU0lNTTE2TiAgICAoU0lNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLfSwKLQotLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLwotI2RlZmluZSBQQVJFTgkoU0lNTTE2TisxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFRyB8IE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRH0sCi19IDsgCi0KLSNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKLSNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJTUFTSwkJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXSA9IHsKLXsgIm1vdiIsCTB4ODAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7U0lNTTgsIEROMDF9fSwKLXsgIm1vdiIsCTB4ODAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAibW92IiwJMHhmMjMwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAibW92IiwJMHhmMjcwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAibW92IiwJMHhmM2YwLAkJMHhmZmZjLAkJRk1UXzQsIHtQU1csIEROMH19LAoteyAibW92IiwJMHhmM2QwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIFBTV319LAoteyAibW92IiwJMHhmM2UwLAkJMHhmZmZjLAkJRk1UXzQsIHtNRFIsIEROMH19LAoteyAibW92IiwJMHhmM2MwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIE1EUn19LAoteyAibW92IiwJMHgyMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4NjAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmN2MwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmNDgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92IiwJMHhmMTQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4YzgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGY0YzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweDcwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTShBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjdiMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjRmMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjEwMCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGY3MzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge01FTShJTU0xNl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjRkMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEFOMH19LAoteyAibW92IiwJMHgwMCwJCTB4ZjAsCQlGTVRfMSwge0RNMCwgTUVNKEFOMSl9fSwKLXsgIm1vdiIsCTB4NDAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHhmNzgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDAwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjFjMCwJCTB4ZmZjMCwJCUZNVF80LCB7RE0wLCBNRU0yKERJLCBBTjEpfX0sCi17ICJtb3YiLAkweGMwMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweDUwMDAsCQkweGYwMDAsCQlGTVRfMiwge0FNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHhmN2EwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtBTTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDEwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtBTTAsIE1FTTIoSU1NMjQsQU4xKX19LAoteyAibW92IiwJMHhmMTgwLAkJMHhmZmMwLAkJRk1UXzQsIHtBTTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjcyMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7QU4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDUwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtBTjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweGY4MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZjQ3MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAibW92IiwJMHhkYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjQ3NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJtb3Z4IiwJMHhmNTcwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY3NzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNGIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92eCIsCTB4ZjU1MDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNzYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92eCIsCTB4ZjQzMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi0KLXsgIm1vdmIiLAkweGY1MjAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjdkMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmMDQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YzQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdmIiLAkweDEwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92YiIsCTB4ZjUxMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNzkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92YiIsCTB4ZjQyMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmMGMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdmIiLAkweGM0MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YiIsCTB4ZjQ0NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7RE4wLCBNRU0oSU1NMjRfTUVNKX19LAotCi17ICJtb3ZidSIsCTB4MzAsCQkweGYwLAkJRk1UXzEsIHtNRU0oQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjUzMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Zjc1MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNDkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGYwODAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGNjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92YnUiLAkweGY0YzgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLQoteyAiZXh0IiwJMHhmM2MxLAkJMHhmZmYzLAkJRk1UXzQsIHtETjF9fSwKLXsgImV4dHgiLAkweGIwLCAJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eHUiLAkweGI0LAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4YiIsCTB4YjgsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhidSIsCTB4YmMsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLQoteyAiYWRkIiwJMHg5MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyMDAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJhZGQiLAkweGYyYzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyNDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJhZGQiLAkweGQ0MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImFkZCIsCTB4ZjcxODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImFkZCIsCTB4ZjQ2MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiYWRkIiwJMHhkMDAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGY3MDgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY0NjQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgImFkZGMiLAkweGYyODAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhZGRuZiIsCTB4ZjUwYzAwLAkweGZmZmMwMCwJRk1UXzUsIHtTSU1NOCwgQU4wfX0sCi0KLXsgInN1YiIsCTB4YTAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAic3ViIiwJMHhmMjEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIEFOMH19LAoteyAic3ViIiwJMHhmMmQwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAic3ViIiwJMHhmMjUwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAic3ViIiwJMHhmNzFjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgRE4wfX0sCi17ICJzdWIiLAkweGY0NjgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgInN1YiIsCTB4ZjcwYzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7SU1NMTYsIEFOMH19LAoteyAic3ViIiwJMHhmNDZjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi17ICJzdWJjIiwJMHhmMjkwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJtdWwiLAkweGYzNDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJtdWx1IiwJMHhmMzUwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJkaXZ1IiwJMHhmMzYwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJjbXAiLAkweGYzOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYyZTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyNjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJjbXAiLAkweGQ4MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImNtcCIsCTB4Zjc0ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImNtcCIsCTB4ZjQ3ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiY21wIiwJMHhlYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgImNtcCIsCTB4ZjQ3YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJhbmQiLAkweGYzMDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhbmQiLAkweGY1MDAwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJhbmQiLAkweGY3MDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYW5kIiwJMHhmNzEwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBQU1d9fSwKLXsgIm9yIiwJCTB4ZjMxMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm9yIiwJCTB4ZjUwODAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgIm9yIiwJCTB4Zjc0MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJvciIsCQkweGY3MTQwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAieG9yIiwJMHhmMzIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAieG9yIiwJMHhmNzRjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm5vdCIsCTB4ZjNlNCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImFzciIsCTB4ZjMzOCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJsc3IiLAkweGYzM2MsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9yIiwJMHhmMzM0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgInJvbCIsCTB4ZjMzMCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImJ0c3QiLAkweGY1MDQwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJidHN0IiwJMHhmNzA0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgImJzZXQiLAkweGYwMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLXsgImJjbHIiLAkweGYwMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLQoteyAiYmVxIiwJMHhlODAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibmUiLAkweGU5MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJsdCIsCTB4ZTAwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhlMzAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2UiLAkweGUyMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJndCIsCTB4ZTEwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzIiwJMHhlNDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGU3MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJjYyIsCTB4ZTYwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpIiwJMHhlNTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJidmMiLAkweGY1ZmMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZzIiwJMHhmNWZkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjVmZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnMiLAkweGY1ZmYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnJhIiwJMHhlYTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImJlcXgiLAkweGY1ZTgwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5leCIsCTB4ZjVlOTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHR4IiwJMHhmNWUwMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsZXgiLAkweGY1ZTMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmdleCIsCTB4ZjVlMjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ3R4IiwJMHhmNWUxMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjc3giLAkweGY1ZTQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxzeCIsCTB4ZjVlNzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiY2N4IiwJMHhmNWU2MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJoaXgiLAkweGY1ZTUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjeCIsCTB4ZjVlYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnN4IiwJMHhmNWVkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuY3giLAkweGY1ZWUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zeCIsCTB4ZjVlZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImptcCIsCTB4ZmMwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAiam1wIiwJMHhmNGUwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAiam1wIiwJMHhmMDAwLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLXsgImpzciIsCTB4ZmQwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAianNyIiwJMHhmNGUxMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAianNyIiwJMHhmMDAxLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLQoteyAibm9wIiwJMHhmNiwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAotCi17ICJydHMiLAkweGZlLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi17ICJydGkiLAkweGViLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLAkweGYwMTAsCQkweGZmZmYsCQlGTVRfNCwge1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwgICAgICAweGZmLCAgICAgICAgICAgMHhmZiwgICAgICAgICAgIEZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgMCwgMCwgMCwgMCwgezB9fSwKLQotfSA7Ci0KLWNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mIChtbjEwMjAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMjAwX29wY29kZXNbMF0pOwotCi0MCmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDMwMC1kaXMuYyBiL29wY29kZXMvbTEwMzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM4OTlmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1OMTAzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgdm9pZCBkaXNhc3NlbWJsZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSB1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGludCkpOwotCi0jZGVmaW5lIEhBVkVfQU0zMyAoaW5mby0+bWFjaCA9PSBBTTMzKQotI2RlZmluZSBIQVZFX0FNMzAgKGluZm8tPm1hY2ggPT0gQU0zMCkKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMzAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGYzKSA9PSAweDAwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzYwotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQxCi0gICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1MAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhiMAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2IKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhlMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjgKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDMKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDIKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NWMKLQkgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYgotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2MKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNkKQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSAyOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYyAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDEKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDIKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MmMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGYKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDg7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY3Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNDsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhjZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBzaXggYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNjsKLSAgICB9Ci0KLSAgLyogRWxzZSBpdHMgYSBzZXZlbiBieXRlIGluc25zIChpbiB0aGVvcnkpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA3OwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgY29uc3VtZSk7Ci0KLSAgcmV0dXJuIGNvbnN1bWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICBpbnQgc3RhdHVzLCBtYXRjaCA9IDA7Ci0KLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OwotCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzApCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MxCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QwKQotCW15c2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzQpCi0JbXlzaXplID0gNTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyKQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENCkKLQlteXNpemUgPSA2OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDYpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxMCkKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDgpCi0JbXlzaXplID0gNjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCW15c2l6ZSA9IDc7Ci0gICAgICBlbHNlCi0JbXlzaXplID0gNzsKLQkKLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiBzaXplID09ICh1bnNpZ25lZCBpbnQpIG15c2l6ZQotCSAgJiYgKG9wLT5tYWNoaW5lID09IDAKLQkgICAgICB8fCAob3AtPm1hY2hpbmUgPT0gQU0zMyAmJiBIQVZFX0FNMzMpCi0JICAgICAgfHwgKG9wLT5tYWNoaW5lID09IEFNMzAgJiYgSEFWRV9BTTMwKSkpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TMSkKLQkgICAgZXh0cmFfc2hpZnQgPSA4OwotCSAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDQKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzQKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzYgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDUpCi0JICAgIGV4dHJhX3NoaWZ0ID0gMTY7Ci0JICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENwotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EOAotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EOSkKLQkgICAgZXh0cmFfc2hpZnQgPSA4OwotCSAgZWxzZQotCSAgICBleHRyYV9zaGlmdCA9IDA7Ci0KLQkgIGlmIChzaXplID09IDEgfHwgc2l6ZSA9PSAyKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSAzCi0JCSAgICYmIChvcC0+Zm9ybWF0ID09IEZNVF9EMQotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRmMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRlMDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMKLQkJICAgJiYgb3AtPmZvcm1hdCA9PSBGTVRfRDYpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNAotCQkgICAmJiAob3AtPm9wY29kZSA9PSAweGZhZjgwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZmFmMDAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWY0MDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQKLQkJICAgJiYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3Ci0JCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMTApKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA0KQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNSAmJiBvcC0+b3Bjb2RlID09IDB4ZGMwMDAwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wICYgMHhmZmZmZmYwMCkgPj4gODsKLQkgICAgICBleHRlbnNpb24gPSB0ZW1wICYgMHhmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA1KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwZmY7Ci0JICAgICAgaW5zbiB8PSB0ZW1wIDw8IDg7Ci0KLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNCwgYnVmZmVyLCAxLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gPSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNiAmJiBvcC0+Zm9ybWF0ID09IEZNVF9EOCkKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZmZmZmYwMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNSwgYnVmZmVyLCAxLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNikKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gMTYpICYgMHhmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9IHRlbXAgJiAweGZmZmY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNyAmJiBvcC0+Zm9ybWF0ID09IEZNVF9EOSkKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZmZmZmYwMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMywgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCSAgICAgIGluc24gfD0gKGV4dGVuc2lvbiAmIDB4ZmYwMDAwMDApID4+IDI0OwotCSAgICAgIGV4dGVuc2lvbiAmPSAweGZmZmZmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3ICYmIG9wLT5vcGNvZGUgPT0gMHhkZDAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gOCkgJiAweGZmZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmYpIDw8IDE2OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA1LCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmZmZikgPDwgODsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNiwgYnVmZmVyLCAxLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCSAgICB9Ci0KLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgYSBQTFVTIChhdXRvaW5jcmVtZW50KSwgdGhlbiBkbyBub3QgZW1pdAotCQkgYSBjb21tYSBiZWZvcmUgZW1pdHRpbmcgdGhlIHBsdXMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUExVUykgIT0gMCkKLQkJbm9jb21tYSA9IDE7Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCQkgIHZhbHVlID0gaW5zbiAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCQkgIHZhbHVlIDw8PSAoMzIgLSBvcGVyYW5kLT5iaXRzKTsKLQkJICB0ZW1wID0gZXh0ZW5zaW9uID4+IG9wZXJhbmQtPnNoaWZ0OwotCQkgIHRlbXAgJj0gKCgxIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpOwotCQkgIHZhbHVlIHw9IHRlbXA7Ci0JCSAgdmFsdWUgPSAoKHZhbHVlIF4gKCgodW5zaWduZWQgbG9uZykxKSA8PCAzMSkpCi0JCQkgICAtICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMzEpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkJICB2YWx1ZSA8PD0gKDI0IC0gb3BlcmFuZC0+Yml0cyk7Ci0JCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKLQkJICB0ZW1wICY9ICgoMSA8PCAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKLQkJICB2YWx1ZSB8PSB0ZW1wOwotCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCQkgICAgdmFsdWUgPSAoKHZhbHVlICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoZXh0ZW5zaW9uID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAvKiBUaGVzZSBhcmUgcHJvcGVybHkgZXh0ZW5kZWQgYnkgdGhlIGNvZGUgYWJvdmUuICAqLwotCQkgICYmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpID09IDApKQotCQl2YWx1ZSA9ICgodmFsdWUgXiAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKQotCQkJIC0gKCgodW5zaWduZWQgbG9uZykxKSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSk7Ci0KLQkgICAgICBpZiAoIW5vY29tbWEKLQkJICAmJiAoIXBhcmVuCi0JCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0KLQkgICAgICBub2NvbW1hID0gMDsKLQkJCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCAoaW50KXZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0FSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImElZCIsIChpbnQpdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1kciIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPCA4KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWQiLCAoaW50KXZhbHVlKTsKLQkJICBlbHNlIGlmICh2YWx1ZSA8IDEyKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCAoaW50KXZhbHVlIC0gOCk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCAoaW50KXZhbHVlIC0gMTIpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfWFJSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiLCB2YWx1ZSk7Ci0JCSAgZWxzZQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAieHIlZCIsIChpbnQpdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfVVNQKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInVzcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NTUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzc3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibXNwIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEMpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicGMiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImVwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGxvbmcpIHZhbHVlICsgbWVtYWRkciwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpICE9IDApCi0JCXsKLQkJICBpbnQgY29tbWEgPSAwOwotCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JCSAgaWYgKHZhbHVlICYgMHg4MCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDQwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDIwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDEwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA4KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA0KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHJlZzAiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgIGlmICh2YWx1ZSAmIDB4MDIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4cmVnMSIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbHVlICYgMHgwMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXhvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0JCX0KLQotCSAgICAgIGVsc2UgCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpdmFsdWUpOwotCSAgICB9Ci0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMgYi9vcGNvZGVzL20xMDMwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwYjk4ZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDMwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjcgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGZvcm1hdHRlZCBhdCA+IDgwIGNvbHVtbnMuICBBdHRlbXB0aW5nIHRvIHJlYWQgaXQgb24gYQotICAgc2NyZWVlbiB3aXRoIGxlc3MgdGhhbiA4MCBjb2x1bW5zIHdpbGwgYmUgZGlmZmljdWx0LiAgKi8KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIgotCi0MCi1jb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXSA9IHsKLSNkZWZpbmUgVU5VU0VECTAKLSAgezAsIDAsIDB9LCAKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMSAgICAgIChETjArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjIgICAgICAoRE4xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0wICAgICAgKEROMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTEgICAgICAoRE0wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0yICAgICAgKERNMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMCAgICAgIChETTIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4xICAgICAgKEFOMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMiAgICAgIChBTjErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTAgICAgICAoQU4yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMSAgICAgIChBTTArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTIgICAgICAoQU0xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0Ci0gICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU04ICAgIChBTTIrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDMyYml0Ci0gICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU0xNiAgICAoSU1NOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHBjLXJlbGF0aXZlIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0Ci0gICBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU0xNl9QQ1JFTCAgICAoSU1NMTYrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVggfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogMTZiaXQgdW5zaWduZWQgZGlzcGxhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyICAgIChJTU0xNl9NRU0rMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVR9LAotCi0vKiAzMmJpdCBwYy1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0zMl9QQ1JFTCAgICAoSU1NMzIrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfTUVNICAgIChJTU0zMl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDE2Yml0cyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsIGxvdyAxNmJpdHMgYXJlIGxlZnQKLSAgIHNoaWZ0ZWQgOCBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfTE9XU0hJRlQ4ICAgIChJTU0zMl9NRU0rMSkKLSAgezE2LCA4LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4KLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0hJR0gyNCAgICAoSU1NMzJfTE9XU0hJRlQ4KzEpCi0gIHsyNCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgOCBiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDE2IHBsYWNlcy4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNiAgICAoSU1NMzJfSElHSDI0KzEpCi0gIHsyNCwgMTYsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIFN0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBTUCAgICAoSU1NMzJfSElHSDI0X0xPV1NISUZUMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TUH0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIFBTVyAgICAoU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4ICAgIChESSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMTYgICAgKFNEOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgdGhhdCBjYW4gbm90IHByb21vdGUuICAqLwotI2RlZmluZSBTRDhOICAgIChTRDE2KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgcGMtcmVsYXRpdmUgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4Tl9QQ1JFTCAgICAoU0Q4TisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWH0sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgc2hpZnRlZCBsZWZ0IDggYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRDhOX1NISUZUOCAgICAoU0Q4Tl9QQ1JFTCsxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU04ICAgIChTRDhOX1NISUZUOCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0xNiAgICAoU0lNTTgrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiBFaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBjbG9zZSBwYXJlbi4gICovCi0jZGVmaW5lIFBBUkVOCShTSU1NMTYrMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QQVJFTn0sIAotCi0vKiBkbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgRE4wMSAgICAgKFBBUkVOKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIGFuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBBTjAxICAgICAoRE4wMSsxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiAxNmJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgcGMtcmVsYXRpdmUKLSAgIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIEQxNl9TSElGVCAoQU4wMSsxKQotICB7MTYsIDgsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBpbW1lZGlhdGUgZm91bmQgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAgKi8KLSNkZWZpbmUgSU1NOEUgICAgKEQxNl9TSElGVCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEfSwKLQotLyogUmVnaXN0ZXIgbGlzdCBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQgc2hpZnRlZCA4IGJpdHMgbGVmdC4gICovCi0jZGVmaW5lIFJFR1NFX1NISUZUOCAgICAoSU1NOEUrMSkKLSAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLS8qIFJlZ2lzdGVyIGxpc3Qgc2hpZnRlZCA4IGJpdHMgbGVmdC4gICovCi0jZGVmaW5lIFJFR1NfU0hJRlQ4IChSRUdTRV9TSElGVDggKyAxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogUmVpZ3N0ZXIgbGlzdC4gICovCi0jZGVmaW5lIFJFR1MgICAgKFJFR1NfU0hJRlQ4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBVU3RhY2sgcG9pbnRlci4gICovCi0jZGVmaW5lIFVTUCAgICAoUkVHUysxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1VTUH0sCi0KLS8qIFNTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgU1NQICAgIChVU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9TU1B9LAotCi0vKiBNU3RhY2sgcG9pbnRlci4gICovCi0jZGVmaW5lIE1TUCAgICAoU1NQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfTVNQfSwKLQotLyogUEMgLiAgKi8KLSNkZWZpbmUgUEMgICAgKE1TUCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BDfSwKLQotLyogNCBiaXQgaW1tZWRpYXRlIGZvciBzeXNjYWxsLiAgKi8KLSNkZWZpbmUgSU1NNCAgICAoUEMrMSkKLSAgezQsIDAsIDB9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBFUFNXICAgIChJTU00KzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfRVBTV30sCi0KLS8qIHJuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk4wICAgICAgKEVQU1crMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogcm4gcmVnaXN0ZXIgaW4gdGhlIGZvdXJ0aCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk4yICAgICAgKFJOMCsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJNMCAgICAgIChSTjIrMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogcm0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk0xICAgICAgKFJNMCsxKQotICB7NCwgMiwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJNMiAgICAgIChSTTErMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotI2RlZmluZSBSTjAyICAgICAgKFJNMisxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0jZGVmaW5lIFhSTjAgICAgICAoUk4wMisxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHfSwKLQotI2RlZmluZSBYUk0yICAgICAgKFhSTjArMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9YUlJFR30sCi0KLS8qICsgZm9yIGF1dG9pbmNyZW1lbnQgKi8KLSNkZWZpbmUgUExVUwkoWFJNMisxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BMVVN9LCAKLQotI2RlZmluZSBYUk4wMiAgICAgIChQTFVTKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfWFJSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBJY2sgKi8KLSNkZWZpbmUgUkQwICAgICAgKFhSTjAyKzEpCi0gIHs0LCAtOCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0jZGVmaW5lIFJEMiAgICAgIChSRDArMSkKLSAgezQsIC00LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIDggdW5zaWduZWQgZGlzcGxhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU04X01FTSAgICAoUkQyKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBSSSAoSU1NOF9NRU0rMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogMjQgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMjQgICAgKFJJKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAyNCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTI0ICAgIChTRDI0KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDI0IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMjQgICAgKElNTTI0KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAyNGJpdCB1bnNpZ25lZCBkaXNwbGFjZW1lbnQgaW4gYSBtZW1vcnkgb3BlcmF0aW9uIHdoaWNoCi0gICBtYXkgcHJvbW90ZSB0byBhIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIElNTTI0X01FTSAgICAoU0lNTTI0KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfMjRCSVQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCA4IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDI0IGluIHRoZSBleHRlbnNpb24gd29yZC4KLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0hJR0g4ICAgIChJTU0yNF9NRU0rMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVH0sCi0KLS8qIFNpbWlsYXJseSwgYnV0IGEgbWVtb3J5IGFkZHJlc3MuICAqLwotI2RlZmluZSBJTU0zMl9ISUdIOF9NRU0gIChJTU0zMl9ISUdIOCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgc2V2ZW50aCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk02ICAgICAgKElNTTMyX0hJR0g4X01FTSsxKQotICB7NCwgMTIsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogcm0gcmVnaXN0ZXIgaW4gdGhlIGZpZnRoIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTjQgICAgICAoUk02KzEpCi0gIHs0LCA4LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIDQgYml0IGltbWVkaWF0ZSBmb3IgZHNwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIElNTTRfMiAgICAoUk40KzEpCi0gIHs0LCA0LCAwfSwKLQotLyogNCBiaXQgaW1tZWRpYXRlIGZvciBkc3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgU0lNTTRfMiAgICAoSU1NNF8yKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogNCBiaXQgaW1tZWRpYXRlIGZvciBkc3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgU0lNTTRfNiAgICAoU0lNTTRfMisxKQotICB7NCwgMTIsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi19IDsgCi0KLSNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKLSNkZWZpbmUgTUVNSU5DKEFERFIpIFBBUkVOLCBBRERSLCBQTFVTLCBQQVJFTiAKLSNkZWZpbmUgTUVNSU5DMihBRERSLElOQykgUEFSRU4sIEFERFIsIFBMVVMsIElOQywgUEFSRU4gCi0jZGVmaW5lIE1FTTIoQUREUjEsQUREUjIpIFBBUkVOLCBBRERSMSwgQUREUjIsIFBBUkVOIAotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCU1BU0sJTUFUQ0hfTUFTSywgRk9STUFULCBQUk9DRVNTT1IJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXSA9IHsKLXsgIm1vdiIsCTB4ODAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMDF9fSwKLXsgIm1vdiIsCTB4ODAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoteyAibW92IiwJMHhmMWUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAibW92IiwJMHhmMWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAibW92IiwJMHg5MDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtJTU04LCBBTjAxfX0sCi17ICJtb3YiLAkweDkwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7QU0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4M2MsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtTUCwgQU4wfX0sCi17ICJtb3YiLAkweGYyZjAsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjJlNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UFNXLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjJmMywJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBQU1d9fSwKLXsgIm1vdiIsCTB4ZjJlMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7TURSLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjJmMiwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRFJ9fSwKLXsgIm1vdiIsCTB4NzAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweDU4MDAsCSAgICAgMHhmY2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92IiwJMHgzMDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGYwMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4NWMwMCwJICAgICAweGZjZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGZhYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTShJTU0xNl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4NjAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3YiLAkweDQyMDAsCSAgICAgMHhmM2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoteyAibW92IiwJMHgwMTAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGYwMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdiIsCTB4NDMwMCwJICAgICAweGYzZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7QU0xLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweGZhODAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4NWMwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNMihJTU04LCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmODAwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweGZhMDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3YiLAkweDU4MDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmFiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjMwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3YiLAkweGY4MjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmYTIwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmYWIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmMzgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBBTjJ9fSwKLXsgIm1vdiIsCTB4NDMwMCwJICAgICAweGYzMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7QU0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92IiwJMHhmODEwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3YiLAkweGZhMTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3YiLAkweDQyMDAsCSAgICAgMHhmMzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmE5MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjM0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3YiLAkweGY4MzAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0FNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmEzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmE5MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjNjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0yLCBNRU0yKERJLCBBTjApfX0sCi0KLXsgIm1vdiIsCTB4ZjAyMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7VVNQLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjAyNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7U1NQLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjAyOCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7TVNQLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjAyYywJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7UEMsIEFOMH19LAoteyAibW92IiwJMHhmMDMwLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtBTjEsIFVTUH19LAoteyAibW92IiwJMHhmMDMxLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtBTjEsIFNTUH19LAoteyAibW92IiwJMHhmMDMyLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtBTjEsIE1TUH19LAoteyAibW92IiwJMHhmMmVjLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtFUFNXLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjJmMSwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0xLCBFUFNXfX0sCi17ICJtb3YiLAkweGY1MDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FNMiwgUk4wfX0sCi17ICJtb3YiLAkweGY1NDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0RNMiwgUk4wfX0sCi17ICJtb3YiLAkweGY1ODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe1JNMSwgQU4wfX0sCi17ICJtb3YiLAkweGY1YzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe1JNMSwgRE4wfX0sCi17ICJtb3YiLAkweGY5MDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtb3YiLAkweGY5ZTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1hSTTIsIFJOMH19LAoteyAibW92IiwJMHhmOWY4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFhSTjB9fSwKLXsgIm1vdiIsCTB4ZjkwYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmOThhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oU1ApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4Zjk2YTAwLCAgICAweGZmZmYwMCwgICAgMHgxMiwgRk1UX0Q2LCBBTTMzLAl7TUVNSU5DKFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmYjBlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0oSU1NOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmQwZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNKElNTTI0X01FTSksIFJOMn19LAoteyAibW92IiwJMHhmOTFhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShSTjApfX0sCi17ICJtb3YiLAkweGY5OWEwMCwgICAgMHhmZmZmMGYsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFNQKX19LAoteyAibW92IiwJMHhmOTdhMDAsICAgIDB4ZmZmZjAwLCAgICAwLAlGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTUlOQyhSTjApfX0sCi17ICJtb3YiLAkweGZiMWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNKElNTThfTUVNKX19LAoteyAibW92IiwJMHhmZDFlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweGZiMGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBSTTApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmQwYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBSTTApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmI4ZTAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihSSSwgUk0wKSwgUkQyfX0sCi17ICJtb3YiLAkweGZiMWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmQxYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmI4YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihJTU04LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmZDhhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKElNTTI0LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmYjlhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGZkOWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihJTU0yNCwgU1ApfX0sCi17ICJtb3YiLAkweGZiOWUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoteyAibW92IiwJMHhmYjZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDcsIEFNMzMsCXtNRU1JTkMyIChSTTAsIFNJTU04KSwgUk4yfX0sCi17ICJtb3YiLAkweGZiN2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9ENywgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBTSU1NOCl9fSwKLXsgIm1vdiIsCTB4ZmQ2YTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q4LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0yNCksIFJOMn19LAoteyAibW92IiwJMHhmZDdhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgSU1NMjQpfX0sCi17ICJtb3YiLAkweGZlNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOSwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmU3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q5LCBBTTMzLAl7Uk4yLCBNRU1JTkMyIChSTTAsIElNTTMyX0hJR0g4KX19LAotLyogVGhlc2UgbXVzdCBjb21lIGFmdGVyIG1vc3Qgb2YgdGhlIG90aGVyIG1vdmUgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIG1hdGNoaW5nCi0gICBhIHN5bWJvbGljIG5hbWUgd2l0aCBJTU14eCBvcGVyYW5kcy4gIFVnaC4gICovCi17ICJtb3YiLAkweDJjMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtb3YiLAkweGZjY2MwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgIm1vdiIsCTB4MjQwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7SU1NMTYsIEFOMH19LAoteyAibW92IiwJMHhmY2RjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJtb3YiLAkweGZjYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmNhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEFOMH19LAoteyAibW92IiwJMHhmYzgxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3YiLAkweGZjODAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdiIsCTB4ZmMwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4ZmNiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmMyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmNiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmMxMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmM5MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmMzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmM5MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLS8qIFRoZXNlIG5vbi1wcm9tb3RpbmcgdmFyaWFudHMgbmVlZCB0byBjb21lIGFmdGVyIGFsbCB0aGUgb3RoZXIgbWVtb3J5Ci0gICBtb3Zlcy4gICovCi17ICJtb3YiLAkweGY4ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe01FTTIoU0Q4TiwgQU0wKSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U1AsIE1FTTIoU0Q4TiwgQU4wKX19LAotLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBub24tcHJvbW90aW5nIHZlcnNpb25zLiAgVGhlIGFtMzMKLSAgIGRvZXMgbm90IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBvZmZzZXRzIHVzZWQgdG8gbG9hZC9zdG9yZSB0aGUgc3RhY2sKLSAgIHBvaW50ZXIuICAqLwoteyAibW92IiwJMHhmOGYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtNRU0yKFNEOCwgQU0wKSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7U1AsIE1FTTIoU0Q4LCBBTjApfX0sCi0vKiBUaGVzZSBtdXN0IGNvbWUgbGFzdCBzbyB0aGF0IHdlIGZhdm9yIHNob3J0ZXIgbW92ZSBpbnN0cnVjdGlvbnMgZm9yCi0gICBsb2FkaW5nIGltbWVkaWF0ZXMgaW50byBkMC1kMy9hMC1hMy4gICovCi17ICJtb3YiLAkweGZiMDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtb3YiLAkweGZkMDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibW92IiwJMHhmZTA4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibW92IiwJMHhmYmY4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgWFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmRmODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBYUk4wMn19LAoteyAibW92IiwJMHhmZWY4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgWFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmUwZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNKElNTTMyX0hJR0g4X01FTSksIFJOMn19LAoteyAibW92IiwJMHhmZTFlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi17ICJtb3YiLAkweGZlMGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZlMWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgUk4wKX19LAoteyAibW92IiwJMHhmZThhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmZTlhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFNQKX19LAotCi17ICJtb3Z1IiwJMHhmYjE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtb3Z1IiwJMHhmZDE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibW92dSIsCTB4ZmUxODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibWNzdDkiLAkweGY2MzAsICAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgIm1jc3Q0OCIsCTB4ZjY2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE4wMX19LAoteyAic3dhcCIsCTB4ZjY4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0xLCBETjB9fSwKLXsgInN3YXAiLAkweGY5Y2IwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzd2FwaCIsCTB4ZjY5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0xLCBETjB9fSwKLXsgInN3YXBoIiwJMHhmOWRiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZ2V0Y2h4IiwJMHhmNmMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETjAxfX0sCi17ICJnZXRjbHgiLAkweGY2ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgIm1hYyIsCTB4ZmIwZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWMiLAkweGY5MGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWMiLAkweGZiMGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtYWMiLAkweGZkMGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjIiwJMHhmZTBiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjdSIsCTB4ZmIxZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWN1IiwJMHhmOTFiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjdSIsCTB4ZmIxYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibWFjdSIsCTB4ZmQxYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1hY3UiLAkweGZlMWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWNiIiwJMHhmYjJmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJtYWNiIiwJMHhmOTJiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjYiIsCTB4ZmIyYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2IiLAkweGZkMmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjYiIsCTB4ZmUyYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2J1IiwJMHhmYjNmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJtYWNidSIsCTB4ZjkzYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY2J1IiwJMHhmYjNiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtYWNidSIsCTB4ZmQzYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1hY2J1IiwJMHhmZTNiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjaCIsCTB4ZmI0ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWNoIiwJMHhmOTRiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjaCIsCTB4ZmI0YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2giLAkweGZkNGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjaCIsCTB4ZmU0YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2h1IiwJMHhmYjVmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm1hY2h1IiwJMHhmOTViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjaHUiLAkweGZiNWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2h1IiwJMHhmZDViMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibWFjaHUiLAkweGZlNWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJkbWFjaCIsCTB4ZmI2ZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiZG1hY2giLAkweGY5NmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbWFjaCIsCTB4ZmU2YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtYWNodSIsCTB4ZmI3ZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiZG1hY2h1IiwJMHhmOTdiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZG1hY2h1IiwJMHhmZTdiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiZG11bGgiLAkweGZiOGYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAiZG11bGgiLAkweGY5OGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbXVsaCIsCTB4ZmU4YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtdWxodSIsCTB4ZmI5ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJkbXVsaHUiLAkweGY5OWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbXVsaHUiLAkweGZlOWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtY3N0ZSIsCTB4ZjliYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1jc3RlIiwJMHhmYmJiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJzd2h3IiwJMHhmOWViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJtb3ZidSIsCTB4ZjA0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4NDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmYTQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmYWI4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGY0MDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92YnUiLAkweDM0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmMDUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg1MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92YnUiLAkweGZhNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92YnUiLAkweGZhOTIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZjQ0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZidSIsCTB4MDIwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YnUiLAkweGY5MmEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmOTNhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShSTjApfX0sCi17ICJtb3ZidSIsCTB4ZjlhYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZjliYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmIyYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGZkMmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgUk0wKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmIzYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgUk4wKX19LAoteyAibW92YnUiLAkweGZkM2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihTRDI0LCBSTjApfX0sCi17ICJtb3ZidSIsCTB4ZmJhYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihJTU04LCBTUCksIFJOMn19LAoteyAibW92YnUiLAkweGZkYWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoSU1NMjQsIFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmJiYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92YnUiLAkweGZkYmEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihJTU0yNCwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmIyZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNKElNTThfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmQyZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNKElNTTI0X01FTSksIFJOMn19LAoteyAibW92YnUiLAkweGZiM2UwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNKElNTThfTUVNKX19LAoteyAibW92YnUiLAkweGZkM2UwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdmJ1IiwJMHhmYmFlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdmJ1IiwJMHhmYmJlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSRDIsIE1FTTIoUkksIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGZjYjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmNhODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92YnUiLAkweGZjNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZidSIsCTB4ZmM5MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzgyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZmUyYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCxSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZTNhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmZWFhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmViYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmZTJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0oSU1NMzJfSElHSDhfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmUzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMzJfSElHSDhfTUVNKX19LAotCi17ICJtb3ZodSIsCTB4ZjA2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4NjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmYTYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92aHUiLAkweGY4YmMwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmYWJjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGY0ODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92aHUiLAkweDM4MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmMDcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg3MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92aHUiLAkweGZhNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZodSIsCTB4Zjg5MzAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92aHUiLAkweGZhOTMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZjRjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZodSIsCTB4MDMwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92aHUiLAkweGY5NGEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmOTVhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShSTjApfX0sCi17ICJtb3ZodSIsCTB4ZjljYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFNQKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZjlkYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3ZodSIsCTB4ZjllYTAwLCAgICAweGZmZmYwMCwgICAgMHgxMiwgRk1UX0Q2LCBBTTMzLAl7TUVNSU5DKFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGY5ZmEwMCwgICAgMHhmZmZmMDAsICAgIDAsCUZNVF9ENiwgQU0zMywJe1JNMiwgTUVNSU5DKFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYjRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgUk0wKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmQ0YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYjVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBSTjApfX0sCi17ICJtb3ZodSIsCTB4ZmQ1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYmNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKElNTTgsIFNQKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmRjYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihJTU0yNCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYmRhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmRkYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTI0LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYjRlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0oSU1NOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZDRlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0oSU1NMjRfTUVNKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmJjZTAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihSSSwgUk0wKSwgUkQyfX0sCi17ICJtb3ZodSIsCTB4ZmJkZTAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7UkQyLCBNRU0yKFJJLCBSTjApfX0sCi17ICJtb3ZodSIsCTB4ZmM2MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmY2JjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGZjYWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmYzcwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92aHUiLAkweGZjOTMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMiwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmM4MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92aHUiLAkweGZlNGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsUk0wKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmU1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBSTjApfX0sCi17ICJtb3ZodSIsCTB4ZmVjYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZWRhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFNQKX19LAoteyAibW92aHUiLAkweGZlNGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTShJTU0zMl9ISUdIOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYjVlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTShJTU04X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmZDVlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmU1ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMzJfSElHSDhfTUVNKX19LAoteyAibW92aHUiLAkweGZiZWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9ENywgQU0zMywJe01FTUlOQzIgKFJNMCwgU0lNTTgpLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYmZhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgU0lNTTgpfX0sCi17ICJtb3ZodSIsCTB4ZmRlYTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q4LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0yNCksIFJOMn19LAoteyAibW92aHUiLAkweGZkZmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9EOCwgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBJTU0yNCl9fSwKLXsgIm1vdmh1IiwJMHhmZWVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDksIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTMyX0hJR0g4KSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmVmYTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q5LCBBTTMzLAl7Uk4yLCBNRU1JTkMyIChSTTAsIElNTTMyX0hJR0g4KX19LAotCi17ICJleHQiLAkweGYyZDAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAoteyAiZXh0IiwJMHhmOTE4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImV4dGIiLAkweGY5MjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJleHRiIiwJMHgxMCwgCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGIiLAkweGY5MjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0YnUiLAkweGY5MzgwMCwgICAgMHhmZmZmMDAsCSAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImV4dGJ1IiwJMHgxNCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiZXh0YnUiLAkweGY5MzgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0aCIsCTB4Zjk0ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImV4dGgiLAkweDE4LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJleHRoIiwJMHhmOTQ4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImV4dGh1IiwJMHhmOTU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0aHUiLAkweDFjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJleHRodSIsCTB4Zjk1ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJtb3ZtIiwJMHhjZTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBSRUdTfX0sCi17ICJtb3ZtIiwJMHhjZjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtSRUdTLCBNRU0oU1ApfX0sCi17ICJtb3ZtIiwJMHhmOGNlMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtNRU0oVVNQKSwgUkVHU319LAoteyAibW92bSIsCTB4ZjhjZjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7UkVHUywgTUVNKFVTUCl9fSwKLQoteyAiY2xyIiwJMHgwMCwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMX19LAoteyAiY2xyIiwJMHhmOTY4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImFkZCIsCTB4ZmI3YzAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYWRkIiwJMHhlMCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhZGQiLAkweGYxNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJhZGQiLAkweGYxNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJhZGQiLAkweGYxNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJhZGQiLAkweDI4MDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgImFkZCIsCTB4ZmFjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBETjB9fSwKLXsgImFkZCIsCTB4MjAwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEFOMH19LAoteyAiYWRkIiwJMHhmYWQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEFOMH19LAoteyAiYWRkIiwJMHhmOGZlMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgU1B9fSwKLXsgImFkZCIsCTB4ZmFmZTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBTUH19LAoteyAiYWRkIiwJMHhmOTc4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYWRkIiwJMHhmY2MwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJhZGQiLAkweGZjZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgImFkZCIsCTB4ZmNmZTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIFNQfX0sCi17ICJhZGQiLAkweGZiNzgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJhZGQiLAkweGZkNzgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAiYWRkIiwJMHhmZTc4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJhZGRjIiwJMHhmYjhjMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhZGRjIiwJMHhmMTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYWRkYyIsCTB4Zjk4ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFkZGMiLAkweGZiODgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJhZGRjIiwJMHhmZDg4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgImFkZGMiLAkweGZlODgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgInN1YiIsCTB4ZmI5YzAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAic3ViIiwJMHhmMTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAic3ViIiwJMHhmMTIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAic3ViIiwJMHhmMTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAic3ViIiwJMHhmMTMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEFOMH19LAoteyAic3ViIiwJMHhmOTk4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAic3ViIiwJMHhmY2M0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJzdWIiLAkweGZjZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgInN1YiIsCTB4ZmI5ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgInN1YiIsCTB4ZmQ5ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJzdWIiLAkweGZlOTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgInN1YmMiLAkweGZhOGMwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgInN1YmMiLAkweGYxODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJzdWJjIiwJMHhmOWE4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAic3ViYyIsCTB4ZmJhODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgInN1YmMiLAkweGZkYTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAic3ViYyIsCTB4ZmVhODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibXVsIiwJMHhmYmFkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm11bCIsCTB4ZjI0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm11bCIsCTB4ZjlhOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm11bCIsCTB4ZmJhOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm11bCIsCTB4ZmRhOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJtdWwiLAkweGZlYTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm11bHUiLAkweGZiYmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibXVsdSIsCTB4ZjI1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm11bHUiLAkweGY5YjkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtdWx1IiwJMHhmYmI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtdWx1IiwJMHhmZGI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibXVsdSIsCTB4ZmViOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAiZGl2IiwJMHhmMjYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiZGl2IiwJMHhmOWM5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJkaXZ1IiwJMHhmMjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiZGl2dSIsCTB4ZjlkOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAiaW5jIiwJMHg0MCwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMX19LAoteyAiaW5jIiwJMHg0MSwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0FOMX19LAoteyAiaW5jIiwJMHhmOWI4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImluYzQiLAkweDUwLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7QU4wfX0sCi17ICJpbmM0IiwJMHhmOWM4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImNtcCIsCTB4YTAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMDF9fSwKLXsgImNtcCIsCTB4YTAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoteyAiY21wIiwJMHhmMWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAiY21wIiwJMHhmMTkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAiY21wIiwJMHhiMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtJTU04LCBBTjAxfX0sCi17ICJjbXAiLAkweGIwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7QU0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZmFjODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBETjB9fSwKLXsgImNtcCIsCTB4ZmFkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEFOMH19LAoteyAiY21wIiwJMHhmOWQ4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiY21wIiwJMHhmY2M4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJjbXAiLAkweGZjZDgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgImNtcCIsCTB4ZmJkODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImNtcCIsCTB4ZmRkODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJjbXAiLAkweGZlZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgImFuZCIsCTB4ZmIwZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYW5kIiwJMHhmMjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYW5kIiwJMHhmOGUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFuZCIsCTB4ZmFlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAiYW5kIiwJMHhmYWZjMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgUFNXfX0sCi17ICJhbmQiLAkweGZjZmMwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMywJe0lNTTMyLCBFUFNXfX0sCi17ICJhbmQiLAkweGY5MDkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhbmQiLAkweGZjZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImFuZCIsCTB4ZmIwOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAiYW5kIiwJMHhmZDA5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAiYW5kIiwJMHhmZTA5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJvciIsCQkweGZiMWQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgIm9yIiwJCTB4ZjIxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm9yIiwJCTB4ZjhlNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJvciIsCQkweGZhZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgIm9yIiwJCTB4ZmFmZDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIFBTV319LAoteyAib3IiLAkJMHhmY2ZkMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzMsCXtJTU0zMiwgRVBTV319LAoteyAib3IiLAkJMHhmOTE5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAib3IiLAkJMHhmY2U0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJvciIsCQkweGZiMTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm9yIiwJCTB4ZmQxOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm9yIiwJCTB4ZmUxOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAieG9yIiwJMHhmYjJkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJ4b3IiLAkweGYyMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ4b3IiLAkweGZhZTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgInhvciIsCTB4ZjkyOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgInhvciIsCTB4ZmNlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAieG9yIiwJMHhmYjI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJ4b3IiLAkweGZkMjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJ4b3IiLAkweGZlMjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm5vdCIsCTB4ZjIzMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi17ICJub3QiLAkweGY5MzkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiYnRzdCIsCTB4ZjhlYzAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJidHN0IiwJMHhmYWVjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJidHN0IiwJMHhmY2VjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0vKiBQbGFjZSB0aGVzZSBiZWZvcmUgdGhlIG9uZXMgd2l0aCBJTU04RSBhbmQgU0Q4Tl9TSElGVDggc2luY2Ugd2Ugd2FudCB0aGUKLSAgIHRoZW0gdG8gbWF0Y2ggbGFzdCBzaW5jZSB0aGV5IGRvIG5vdCBwcm9tb3RlLiAgKi8KLXsgImJ0c3QiLAkweGZiZTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgImJ0c3QiLAkweGZkZTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJidHN0IiwJMHhmZWU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiYnRzdCIsCTB4ZmUwMjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJidHN0IiwJMHhmYWY4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsIAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCwgQU4wKX19LAotCi17ICJic2V0IiwJMHhmMDgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJic2V0IiwJMHhmZTAwMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJzZXQiLAkweGZhZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsIEFOMCl9fSwKLQoteyAiYmNsciIsCTB4ZjA5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAiYmNsciIsCTB4ZmUwMTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJiY2xyIiwJMHhmYWY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LEFOMCl9fSwKLQoteyAiYXNyIiwJMHhmYjRkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhc3IiLAkweGYyYjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhc3IiLAkweGY4YzgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYXNyIiwJMHhmOTQ5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYXNyIiwJMHhmYjQ5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJhc3IiLAkweGZkNDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJhc3IiLAkweGZlNDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJhc3IiLAkweGY4YzgwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAoteyAiYXNyIiwJMHhmYjQ5MDAwMSwgIDB4ZmZmZjAwZmYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImxzciIsCTB4ZmI1ZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAibHNyIiwJMHhmMmEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAibHNyIiwJMHhmOGM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImxzciIsCTB4Zjk1OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImxzciIsCTB4ZmI1OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibHNyIiwJMHhmZDU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibHNyIiwJMHhmZTU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibHNyIiwJMHhmOGM0MDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLXsgImxzciIsCTB4ZmI1OTAwMDEsICAweGZmZmYwMGZmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk4wMn19LAotCi17ICJhc2wiLAkweGZiNmQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFzbCIsCTB4ZjI5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFzbCIsCTB4ZjhjMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhc2wiLAkweGY5NjkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhc2wiLAkweGZiNjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJhc2wiLAkweGZkNjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJhc2wiLAkweGZlNjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJhc2wiLAkweGY4YzAwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAoteyAiYXNsIiwJMHhmYjY5MDAwMSwgIDB4ZmZmZjAwZmYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImFzbDIiLAkweDU0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJhc2wyIiwJMHhmOTc5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgInJvciIsCTB4ZjI4NCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi17ICJyb3IiLAkweGY5ODkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAicm9sIiwJMHhmMjgwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgInJvbCIsCTB4Zjk5OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJiZXEiLAkweGM4MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJuZSIsCTB4YzkwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmd0IiwJMHhjMTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiZ2UiLAkweGMyMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJsZSIsCTB4YzMwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmx0IiwJMHhjMDAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiaGkiLAkweGM1MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJjYyIsCTB4YzYwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmxzIiwJMHhjNzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiY3MiLAkweGM0MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJ2YyIsCTB4ZjhlODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnZzIiwJMHhmOGU5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibmMiLAkweGY4ZWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJucyIsCTB4ZjhlYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnJhIiwJMHhjYTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi0KLXsgImxlcSIsCTB4ZDgsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxuZSIsCTB4ZDksCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxndCIsCTB4ZDEsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxnZSIsCTB4ZDIsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxsZSIsCTB4ZDMsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxsdCIsCTB4ZDAsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxoaSIsCTB4ZDUsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxjYyIsCTB4ZDYsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxscyIsCTB4ZDcsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxjcyIsCTB4ZDQsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgImxyYSIsCTB4ZGEsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLXsgInNldGxiIiwJMHhkYiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAotCi17ICJqbXAiLAkweGYwZjQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BBUkVOLEFOMCxQQVJFTn19LAoteyAiam1wIiwJMHhjYzAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtJTU0xNl9QQ1JFTH19LAoteyAiam1wIiwJMHhkYzAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzQsIDAsCXtJTU0zMl9ISUdIMjR9fSwKLXsgImNhbGwiLAkweGNkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0QxNl9TSElGVCxSRUdTLElNTThFfX0sCi17ICJjYWxsIiwJMHhkZDAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzYsIDAsCXtJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNiwgUkVHU0VfU0hJRlQ4LElNTThFfX0sCi17ICJjYWxscyIsCTB4ZjBmMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCi17ICJjYWxscyIsCTB4ZmFmZjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTZfUENSRUx9fSwKLXsgImNhbGxzIiwJMHhmY2ZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMl9QQ1JFTH19LAotCi17ICJyZXQiLAkweGRmMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCi17ICJyZXRmIiwJMHhkZTAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtSRUdTX1NISUZUOCwgSU1NOH19LAoteyAicmV0cyIsCTB4ZjBmYywJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJydGkiLAkweGYwZmQsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAidHJhcCIsCTB4ZjBmZSwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJydG0iLAkweGYwZmYsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAibm9wIiwJMHhjYiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAotCi0vKiBVREYgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgInVkZjAwIiwJMHhmNjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDAiLAkweGY5MDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAwIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDEiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZjkxMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDEiLAkweGZiMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAxIiwJMHhmZDEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZjYyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAyIiwJMHhmOTIwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZmIyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDIiLAkweGZkMjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAzIiwJMHhmNjMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDMiLAkweGY5MzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAzIiwJMHhmYjMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZmQzMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDQiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4Zjk0MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDQiLAkweGZiNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA0IiwJMHhmZDQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZjY1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA1IiwJMHhmOTUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZmI1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDUiLAkweGZkNTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA2IiwJMHhmNjYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDYiLAkweGY5NjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA2IiwJMHhmYjYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4ZmQ2MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDciLAkweGY2NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4Zjk3MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDciLAkweGZiNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA3IiwJMHhmZDcwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZjY4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA4IiwJMHhmOTgwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZmI4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDgiLAkweGZkODAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA5IiwJMHhmNjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDkiLAkweGY5OTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA5IiwJMHhmYjkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4ZmQ5MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTAiLAkweGY2YTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZjlhMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTAiLAkweGZiYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEwIiwJMHhmZGEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZjZiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjExIiwJMHhmOWIwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZmJiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTEiLAkweGZkYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjEyIiwJMHhmNmMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTIiLAkweGY5YzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjEyIiwJMHhmYmMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZmRjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTMiLAkweGY2ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZjlkMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTMiLAkweGZiZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEzIiwJMHhmZGQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZjZlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjE0IiwJMHhmOWUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZmJlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTQiLAkweGZkZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjE1IiwJMHhmNmYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTUiLAkweGY5ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjE1IiwJMHhmYmYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZmRmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMjAiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMSIsCTB4ZjUxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIyIiwJMHhmNTIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjMiLAkweGY1MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNCIsCTB4ZjU0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI1IiwJMHhmNTUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjYiLAkweGY1NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNyIsCTB4ZjU3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI4IiwJMHhmNTgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjkiLAkweGY1OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMCIsCTB4ZjVhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMxIiwJMHhmNWIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzIiLAkweGY1YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMyIsCTB4ZjVkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjM0IiwJMHhmNWUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzUiLAkweGY1ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGY5MDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAwIiwJMHhmYjA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZmQwNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAxIiwJMHhmOTE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZmIxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGZkMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZjkyNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGZiMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAyIiwJMHhmZDI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGY5MzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAzIiwJMHhmYjM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZmQzNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA0IiwJMHhmOTQ0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNCIsCTB4ZmI0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGZkNDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNSIsCTB4Zjk1NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGZiNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA1IiwJMHhmZDU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGY5NjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA2IiwJMHhmYjY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNiIsCTB4ZmQ2NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA3IiwJMHhmOTc0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNyIsCTB4ZmI3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGZkNzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwOCIsCTB4Zjk4NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGZiODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA4IiwJMHhmZDg0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGY5OTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA5IiwJMHhmYjk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwOSIsCTB4ZmQ5NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTEwIiwJMHhmOWE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZmJhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGZkYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZjliNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGZiYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTExIiwJMHhmZGI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGY5YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEyIiwJMHhmYmM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZmRjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTEzIiwJMHhmOWQ0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZmJkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGZkZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZjllNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGZiZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTE0IiwJMHhmZGU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGY5ZjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTE1IiwJMHhmYmY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZmRmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJwdXR4IiwJMHhmNTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETjAxfX0sCi17ICJnZXR4IiwJMHhmNmYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETjAxfX0sCi17ICJtdWxxIiwJMHhmNjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoteyAibXVscSIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoteyAibXVscSIsCTB4ZmIwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCBBTTMwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm11bHEiLAkweGZkMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMCwJe0lNTTMyLCBETjB9fSwKLXsgIm11bHF1IiwJMHhmNjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoteyAibXVscXUiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NJTU04LCBETjB9fSwKLXsgIm11bHF1IiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoteyAibXVscXUiLAkweGZkMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMCwJe0lNTTMyLCBETjB9fSwKLXsgInNhdDE2IiwJMHhmNjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoteyAic2F0MTYiLAkweGY5YWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgInNhdDI0IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoteyAic2F0MjQiLAkweGZiYWYwMDAwLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgImJzY2giLAkweGZiZmYwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImJzY2giLAkweGY2NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJic2NoIiwJMHhmOWZiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi0vKiBFeHRlbnNpb24uICBXZSBuZWVkIHNvbWUgaW5zdHJ1Y3Rpb24gdG8gdHJpZ2dlciAiZW11bGF0ZWQgc3lzY2FsbHMiCi0gICBmb3Igb3VyIHNpbXVsYXRvci4gICovCi17ICJzeXNjYWxsIiwJMHhmMGUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtJTU00fX0sCi17ICJzeXNjYWxsIiwgICAgMHhmMGMwLCAgICAgIDB4ZmZmZiwgICAgICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2hlbiB0YWxraW5nIHRvIHRoZSBzaW11bGF0b3IsIGdkYiByZXF1aXJlcyBzb21lIGluc3RydWN0aW9uCi0gICB0aGF0IHdpbGwgdHJpZ2dlciBhICJicmVha3BvaW50IiAocmVhbGx5IGp1c3QgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpc24ndAotICAgb3RoZXJ3aXNlIHVzZWQgYnkgdGhlIHRvb2xzLiAgVGhpcyBpbnN0cnVjdGlvbiBtdXN0IGJlIHRoZSBzYW1lIHNpemUKLSAgIGFzIHRoZSBzbWFsbGVzdCBpbnN0cnVjdGlvbiBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBJbiB0aGUgY2FzZSBvZiB0aGUKLSAgIG1uMTB4MDAgdGhlICJicmVhayIgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBvbmUgYnl0ZS4gIDB4ZmYgaXMgYXZhaWxhYmxlIG9uCi0gICBib3RoIG1uMTB4MDAgYXJjaGl0ZWN0dXJlcy4gICovCi17ICJicmVhayIsCTB4ZmYsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQoteyAiYWRkX2FkZCIsCTB4ZjcwMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hZGQiLAkweGY3MTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2FkZCIsCTB4ZjcwNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYWRkIiwJMHhmNzE0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfc3ViIiwJMHhmNzIwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX3N1YiIsCTB4ZjczMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfc3ViIiwJMHhmNzI0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9jbXAiLAkweGY3NDAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfY21wIiwJMHhmNzUwMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9jbXAiLAkweGY3NDQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc1NDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX21vdiIsCTB4Zjc2MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9tb3YiLAkweGY3NzAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX21vdiIsCTB4Zjc2NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzc0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzgwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FzciIsCTB4Zjc5MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc3IiLAkweGY3ODQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FzciIsCTB4Zjc5NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2EwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2xzciIsCTB4ZjdiMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9sc3IiLAkweGY3YTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2xzciIsCTB4ZjdiNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2MwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FzbCIsCTB4ZjdkMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc2wiLAkweGY3YzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FzbCIsCTB4ZjdkNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfYWRkIiwJMHhmNzAxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FkZCIsCTB4ZjcxMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfYWRkIiwJMHhmNzA1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MTUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9zdWIiLAkweGY3MjEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfc3ViIiwJMHhmNzMxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9zdWIiLAkweGY3MjUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjczNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX21vdiIsCTB4Zjc2MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9tb3YiLAkweGY3NzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX21vdiIsCTB4Zjc2NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzc1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzgxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FzciIsCTB4Zjc5MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc3IiLAkweGY3ODUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FzciIsCTB4Zjc5NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2ExMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2xzciIsCTB4ZjdiMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9sc3IiLAkweGY3YTUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2xzciIsCTB4ZjdiNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2MxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FzbCIsCTB4ZjdkMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc2wiLAkweGY3YzUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FzbCIsCTB4ZjdkNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYWRkIiwJMHhmNzAyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FkZCIsCTB4ZjcxMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfYWRkIiwJMHhmNzA2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9zdWIiLAkweGY3MjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfc3ViIiwJMHhmNzMyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9zdWIiLAkweGY3MjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjczNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX2NtcCIsCTB4Zjc0MjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9jbXAiLAkweGY3NTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX2NtcCIsCTB4Zjc0NjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzU2MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfbW92IiwJMHhmNzYyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX21vdiIsCTB4Zjc3MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfbW92IiwJMHhmNzY2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NzYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3ODIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYXNyIiwJMHhmNzkyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2FzciIsCTB4Zjc4NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYXNyIiwJMHhmNzk2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfbHNyIiwJMHhmN2IyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2xzciIsCTB4ZjdhNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfbHNyIiwJMHhmN2I2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3YzIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYXNsIiwJMHhmN2QyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2FzbCIsCTB4ZjdjNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYXNsIiwJMHhmN2Q2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hZGQiLAkweGY3MDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYWRkIiwJMHhmNzEzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hZGQiLAkweGY3MDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcxNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X3N1YiIsCTB4ZjcyMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9zdWIiLAkweGY3MzMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X3N1YiIsCTB4ZjcyNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzM3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfY21wIiwJMHhmNzQzMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2NtcCIsCTB4Zjc1MzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfY21wIiwJMHhmNzQ3MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9tb3YiLAkweGY3NjMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfbW92IiwJMHhmNzczMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9tb3YiLAkweGY3NjcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc3NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc4MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hc3IiLAkweGY3OTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNyIiwJMHhmNzg3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hc3IiLAkweGY3OTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdhMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9sc3IiLAkweGY3YjMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfbHNyIiwJMHhmN2E3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9sc3IiLAkweGY3YjcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdjMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hc2wiLAkweGY3ZDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNsIiwJMHhmN2M3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hc2wiLAkweGY3ZDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYW5kX2FkZCIsCTB4ZjcwODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9hZGQiLAkweGY3MTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYW5kX3N1YiIsCTB4ZjcyODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9zdWIiLAkweGY3MzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYW5kX2NtcCIsCTB4Zjc0ODAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9jbXAiLAkweGY3NTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYW5kX21vdiIsCTB4Zjc2ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9tb3YiLAkweGY3NzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYW5kX2FzciIsCTB4Zjc4ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9hc3IiLAkweGY3OTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhbmRfbHNyIiwJMHhmN2E4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2xzciIsCTB4ZjdiODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9hc2wiLAkweGY3YzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfYXNsIiwJMHhmN2Q4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfYWRkIiwJMHhmNzA5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfYWRkIiwJMHhmNzE5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX3N1YiIsCTB4ZjcyOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX3N1YiIsCTB4ZjczOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9jbXAiLAkweGY3NDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9jbXAiLAkweGY3NTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfbW92IiwJMHhmNzY5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfbW92IiwJMHhmNzc5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2FzciIsCTB4Zjc4OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2FzciIsCTB4Zjc5OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2xzciIsCTB4ZjdhOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2xzciIsCTB4ZjdiOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2FzbCIsCTB4ZjdjOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2FzbCIsCTB4ZjdkOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9hZGQiLAkweGY3MGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfYWRkIiwJMHhmNzFhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9zdWIiLAkweGY3MmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3Jfc3ViIiwJMHhmNzNhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9jbXAiLAkweGY3NGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfY21wIiwJMHhmNzVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9tb3YiLAkweGY3NmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfbW92IiwJMHhmNzdhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9hc3IiLAkweGY3OGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfYXNyIiwJMHhmNzlhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAieG9yX2xzciIsCTB4ZjdhYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9sc3IiLAkweGY3YmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJ4b3JfYXNsIiwJMHhmN2NhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2FzbCIsCTB4ZjdkYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfYWRkIiwJMHhmNzBiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19hZGQiLAkweGY3MWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3dod19zdWIiLAkweGY3MmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X3N1YiIsCTB4ZjczYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2NtcCIsCTB4Zjc0YjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfY21wIiwJMHhmNzViMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfbW92IiwJMHhmNzZiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19tb3YiLAkweGY3N2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3dod19hc3IiLAkweGY3OGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2FzciIsCTB4Zjc5YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfbHNyIiwJMHhmN2FiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19sc3IiLAkweGY3YmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2FzbCIsCTB4ZjdjYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfYXNsIiwJMHhmN2RiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAib3JfYWRkIiwJMHhmNzBjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfYWRkIiwJMHhmNzFjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm9yX3N1YiIsCTB4ZjcyYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX3N1YiIsCTB4ZjczYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJvcl9jbXAiLAkweGY3NGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9jbXAiLAkweGY3NWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3JfbW92IiwJMHhmNzZjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfbW92IiwJMHhmNzdjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2FzciIsCTB4Zjc4YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2FzciIsCTB4Zjc5YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2xzciIsCTB4ZjdhYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2xzciIsCTB4ZjdiYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2FzbCIsCTB4ZjdjYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2FzbCIsCTB4ZjdkYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2FkZCIsCTB4ZjcwZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2FkZCIsCTB4ZjcxZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9zdWIiLAkweGY3MmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9zdWIiLAkweGY3M2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic2F0MTZfY21wIiwJMHhmNzRkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfY21wIiwJMHhmNzVkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X21vdiIsCTB4Zjc2ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X21vdiIsCTB4Zjc3ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9hc3IiLAkweGY3OGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9hc3IiLAkweGY3OWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9sc3IiLAkweGY3YWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9sc3IiLAkweGY3YmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9hc2wiLAkweGY3Y2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9hc2wiLAkweGY3ZGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi0vKiBVZ2guICBTeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImFkZF9hbmQiLAkweGY3MDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfYW5kIiwJMHhmNzE4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9kbWFjaCIsCTB4ZjcwOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9kbWFjaCIsCTB4ZjcxOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfb3IiLAkweGY3MGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfb3IiLAkweGY3MWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3NhdDE2IiwJMHhmNzBkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3NhdDE2IiwJMHhmNzFkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9zd2h3IiwJMHhmNzBiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3N3aHciLAkweGY3MWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3hvciIsCTB4ZjcwYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF94b3IiLAkweGY3MWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdjMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9hZGQiLAkweGY3ZDAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfYWRkIiwJMHhmN2M0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9hZGQiLAkweGY3ZDQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2FuZCIsCTB4ZjdjODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9hbmQiLAkweGY3ZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfY21wIiwJMHhmN2MxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2NtcCIsCTB4ZjdkMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjQsIH19LAoteyAiYXNsX2NtcCIsCTB4ZjdjNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfY21wIiwJMHhmN2Q1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9kbWFjaCIsCTB4ZjdjOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9kbWFjaCIsCTB4ZjdkOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3YzMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfbW92IiwJMHhmN2QzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX21vdiIsCTB4ZjdjNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfbW92IiwJMHhmN2Q3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9vciIsCTB4ZjdjYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9vciIsCTB4ZjdkYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zYXQxNiIsCTB4ZjdjZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zYXQxNiIsCTB4ZjdkZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3YzIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3ViIiwJMHhmN2QyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3N1YiIsCTB4ZjdjNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfc3ViIiwJMHhmN2Q2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9zd2h3IiwJMHhmN2NiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3N3aHciLAkweGY3ZGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfeG9yIiwJMHhmN2NhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3hvciIsCTB4ZjdkYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3ODAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfYWRkIiwJMHhmNzkwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2FkZCIsCTB4Zjc4NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfYWRkIiwJMHhmNzk0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9hbmQiLAkweGY3ODgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfYW5kIiwJMHhmNzk4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2NtcCIsCTB4Zjc4MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9jbXAiLAkweGY3OTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40LCB9fSwKLXsgImFzcl9jbXAiLAkweGY3ODUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX2NtcCIsCTB4Zjc5NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfZG1hY2giLAkweGY3ODkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfZG1hY2giLAkweGY3OTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzgzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX21vdiIsCTB4Zjc5MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9tb3YiLAkweGY3ODcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX21vdiIsCTB4Zjc5NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3Jfb3IiLAkweGY3OGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfb3IiLAkweGY3OWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc2F0MTYiLAkweGY3OGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc2F0MTYiLAkweGY3OWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzgyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N1YiIsCTB4Zjc5MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zdWIiLAkweGY3ODYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX3N1YiIsCTB4Zjc5NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3Jfc3dodyIsCTB4Zjc4YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zd2h3IiwJMHhmNzliMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3hvciIsCTB4Zjc4YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl94b3IiLAkweGY3OWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfYW5kIiwJMHhmNzQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX2FuZCIsCTB4Zjc1ODAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfZG1hY2giLAkweGY3NDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfZG1hY2giLAkweGY3NTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX29yIiwJMHhmNzRjMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX29yIiwJMHhmNzVjMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9zYXQxNiIsCTB4Zjc0ZDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9zYXQxNiIsCTB4Zjc1ZDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfc3dodyIsCTB4Zjc0YjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9zd2h3IiwJMHhmNzViMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF94b3IiLAkweGY3NGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfeG9yIiwJMHhmNzVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfYWRkIiwJMHhmN2IwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2FkZCIsCTB4ZjdhNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfYWRkIiwJMHhmN2I0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9hbmQiLAkweGY3YTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfYW5kIiwJMHhmN2I4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2NtcCIsCTB4ZjdhMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9jbXAiLAkweGY3YjEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40LCB9fSwKLXsgImxzcl9jbXAiLAkweGY3YTUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX2NtcCIsCTB4ZjdiNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfZG1hY2giLAkweGY3YTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfZG1hY2giLAkweGY3YjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2EzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX21vdiIsCTB4ZjdiMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9tb3YiLAkweGY3YTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX21vdiIsCTB4ZjdiNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3Jfb3IiLAkweGY3YWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfb3IiLAkweGY3YmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc2F0MTYiLAkweGY3YWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc2F0MTYiLAkweGY3YmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2EyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N1YiIsCTB4ZjdiMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zdWIiLAkweGY3YTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX3N1YiIsCTB4ZjdiNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3Jfc3dodyIsCTB4ZjdhYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zd2h3IiwJMHhmN2JiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3hvciIsCTB4ZjdhYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl94b3IiLAkweGY3YmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfYW5kIiwJMHhmNzY4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X2FuZCIsCTB4Zjc3ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfZG1hY2giLAkweGY3NjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfZG1hY2giLAkweGY3NzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X29yIiwJMHhmNzZjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X29yIiwJMHhmNzdjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9zYXQxNiIsCTB4Zjc2ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9zYXQxNiIsCTB4Zjc3ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfc3dodyIsCTB4Zjc2YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9zd2h3IiwJMHhmNzdiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl94b3IiLAkweGY3NmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfeG9yIiwJMHhmNzdhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9hbmQiLAkweGY3MjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfYW5kIiwJMHhmNzM4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9kbWFjaCIsCTB4ZjcyOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9kbWFjaCIsCTB4ZjczOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfb3IiLAkweGY3MmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfb3IiLAkweGY3M2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3NhdDE2IiwJMHhmNzJkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3NhdDE2IiwJMHhmNzNkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9zd2h3IiwJMHhmNzJiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3N3aHciLAkweGY3M2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3hvciIsCTB4ZjcyYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl94b3IiLAkweGY3M2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X2xsdCIsCTB4ZjdlMDAwMDAsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xndCIsCTB4ZjdlMDAwMDEsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xnZSIsCTB4ZjdlMDAwMDIsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xsZSIsCTB4ZjdlMDAwMDMsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xjcyIsCTB4ZjdlMDAwMDQsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xoaSIsCTB4ZjdlMDAwMDUsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xjYyIsCTB4ZjdlMDAwMDYsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xscyIsCTB4ZjdlMDAwMDcsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xlcSIsCTB4ZjdlMDAwMDgsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xuZSIsCTB4ZjdlMDAwMDksICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibW92X2xyYSIsCTB4ZjdlMDAwMGEsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGx0X21vdiIsCTB4ZjdlMDAwMDAsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGd0X21vdiIsCTB4ZjdlMDAwMDEsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGdlX21vdiIsCTB4ZjdlMDAwMDIsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGxlX21vdiIsCTB4ZjdlMDAwMDMsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGNzX21vdiIsCTB4ZjdlMDAwMDQsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGhpX21vdiIsCTB4ZjdlMDAwMDUsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGNjX21vdiIsCTB4ZjdlMDAwMDYsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGxzX21vdiIsCTB4ZjdlMDAwMDcsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibGVxX21vdiIsCTB4ZjdlMDAwMDgsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibG5lX21vdiIsCTB4ZjdlMDAwMDksICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAoteyAibHJhX21vdiIsCTB4ZjdlMDAwMGEsICAweGZmZmYwMDBmLCAgMHgyMiwgRk1UX0QxMCwgQU0zMywJIHtNRU1JTkMyIChSTjQsU0lNTTRfMiksIFJNNn19LAotIAoteyAwLCAwLCAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAzMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAzMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1hc20uYyBiL29wY29kZXMvbTMyci1hc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNjJjZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyogQXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWFzbS5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcGFyc2VfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IGNoYXIgKiosIENHRU5fRklFTERTICopKTsKLQwKLS8qIC0tIGFzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGFzbS5jICovCi0KLS8qIEhhbmRsZSAnIycgcHJlZml4ZXMgKGkuZS4gc2tpcCBvdmVyIHRoZW0pLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGFzaCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgc2hpZ2goKSwgaGlnaCgpLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGkxNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImhpZ2goIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA1OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0gIAkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID4+PSAxNjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzaGlnaCgiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDY7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKLSAJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSA9ICh2YWx1ZSA+PiAxNikgKyAodmFsdWUgJiAweDgwMDAgPyAxIDogMCk7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGEgc2lnbmVkIGNvbnRleHQuICBBbHNvIGhhbmRsZSBzZGEoKS4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzZGEoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0JCQkJICAgTlVMTCwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGFuIHVuc2lnbmVkIGNvbnRleHQuCi0gICBUaGUgc2lnbmVkbmVzcyBvZiB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgdG8gbG93KCksIGJ1dCB0aGlzIGFsc28KLSAgIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbG93KCkgaXNuJ3QgcHJlc2VudC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3VsbzE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAibG93KCIsIDQpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNDsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSAmPSAweGZmZmY7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBwYXJzaW5nLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1jb25zdCBjaGFyICoKLW0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgb3BpbmRleCwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgY2hhciAqKiBzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0gIC8qIFVzZWQgYnkgc2NhbGFyIG9wZXJhbmRzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBwYXJzZWQuICAqLwotICBsb25nIGp1bms7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsICYgZmllbGRzLT5mX2FjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCAmIGZpZWxkcy0+Zl9hY2NkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsICYgZmllbGRzLT5mX2FjY3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDE2LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDgsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oYXNoIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0hBU0gsICZqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGkxNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ISTE2LCAmZmllbGRzLT5mX2hpMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSU1NMSwgJmZpZWxkcy0+Zl9pbW0xKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NJTU04LCAmZmllbGRzLT5mX3NpbW04KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3NsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NMTzE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMTYsICZmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU00LCAmZmllbGRzLT5mX3VpbW00KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NNSwgJmZpZWxkcy0+Zl91aW1tNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV91bG8xNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VTE8xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi1jZ2VuX3BhcnNlX2ZuICogY29uc3QgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKLXsKLSAgcGFyc2VfaW5zbl9ub3JtYWwsCi19OwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9hc20gKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKLSAgY2QtPnBhcnNlX29wZXJhbmQgPSBtMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KLQotICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KLSAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCi0KLSAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bwotICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQotICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAotICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAotICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgotCi0gICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBjb25zdCBjaGFyICpwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgLyogRklYTUU6IHdpcCAqLwotICBpbnQgcGFzdF9vcGNvZGVfcDsKLSNlbmRpZgotCi0gIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgotICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCi0gICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5Ci0gICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLwotICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKLSAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKLSAgICArK3AsICsrc3RyOwotCi0gIGlmICgqIHApCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotCi0jaWZuZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgaWYgKCogc3RyICYmICFpc3NwYWNlICgqIHN0cikpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotI2VuZGlmCi0KLSAgQ0dFTl9JTklUX1BBUlNFIChjZCk7Ci0gIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCk7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBwYXN0X29wY29kZV9wID0gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotICAgICBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLwotICBzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7Ci0KLSAgLyogTW5lbW9uaWNzIGNvbWUgZmlyc3QgZm9yIG5vdywgZW5zdXJlIHZhbGlkIHN0cmluZy4gICovCi0gIGlmICghIENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCogc3luKSkKLSAgICBhYm9ydCAoKTsKLQotICArK3N5bjsKLQotICB3aGlsZSAoKiBzeW4gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCXsKLQkgIC8qIEZJWE1FOiBXaGlsZSB3ZSBhbGxvdyBmb3Igbm9uLUdBUyBjYWxsZXJzIGFib3ZlLCB3ZSBhc3N1bWUgdGhlCi0JICAgICBmaXJzdCBjaGFyIGFmdGVyIHRoZSBtbmVtb25pYyBwYXJ0IGlzIGEgc3BhY2UuICAqLwotCSAgLyogRklYTUU6IFdlIGFsc28gdGFrZSBpbmFwcHJvcHJpYXRlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0Ci0JICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIHJlbW92ZSBleHRyYW5lb3VzIGJsYW5rcy4gICovCi0JICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCi0JICAgIHsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0JICAgICAgaWYgKCogc3luID09ICcgJykKLQkJcGFzdF9vcGNvZGVfcCA9IDE7Ci0jZW5kaWYKLQkgICAgICArKyBzeW47Ci0JICAgICAgKysgc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLwotCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLwotCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KLSAgICAgIGVycm1zZyA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQkgICZzdHIsIGZpZWxkcyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLwotICAgICAgKysgc3luOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgaWYgKCogc3luID09ICdcMCcpCi0gICAgewotICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KLQkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKLQkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCi0JIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0JKysgc3RyOwotCi0gICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKLQlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCi0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCi0gIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgotICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KLSAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKLSAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQotICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCi0gICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgotICAgcHJpbnRlZCkuCi0KLSAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCi0gICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgotCi0gICA/Pz8gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgY3B1LWluZGVwZW5kZW50LgotICAgT25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGEgZmV3IG1pbm9yIHRoaW5ncy4KLSAgIEF0IHRoaXMgcG9pbnQgaW4gdGltZSBkb2luZyBzbyB3b3VsZCBiZSBtb3JlIG9mIGEgY3VyaW9zaXR5IHRoYW4gdXNlZnVsCi0gICBbZm9yIGV4YW1wbGUgdGhpcyBmaWxlIGlzbid0IF90aGF0XyBiaWddLCBidXQga2VlcGluZyB0aGUgcG9zc2liaWxpdHkgaW4KLSAgIG1pbmQgaGVscHMga2VlcCB0aGUgZGVzaWduIGNsZWFuLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLW0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuIChjZCwgc3RyLCBmaWVsZHMsIGJ1ZiwgZXJybXNnKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmOwotICAgICBjaGFyICoqZXJybXNnOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotICBjb25zdCBjaGFyICp0bXBfZXJybXNnOwotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoZWQgbGlzdHMuCi0gICAgIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotICBpbGlzdCA9IENHRU5fQVNNX0xPT0tVUF9JTlNOIChjZCwgc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBpbGlzdCAhPSBOVUxMIDsgaWxpc3QgPSBDR0VOX0FTTV9ORVhUX0lOU04gKGlsaXN0KSkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbGlzdC0+aW5zbjsKLQotI2lmZGVmIENHRU5fVkFMSURBVEVfSU5TTl9TVVBQT1JURUQgCi0gICAgICAvKiBub3QgdXN1YWxseSBuZWVkZWQgYXMgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBzaG91bGRuJ3QgYmUgaW4gdGhlIGhhc2ggbGlzdHMgKi8KLSAgICAgIC8qIElzIHRoaXMgaW5zbiBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBJZiB0aGUgUkVMQVggYXR0cmlidXRlIGlzIHNldCwgdGhpcyBpcyBhbiBpbnNuIHRoYXQgc2hvdWxkbid0IGJlCi0JIGNob3NlbiBpbW1lZGlhdGVseS4gIEluc3RlYWQsIGl0IGlzIHVzZWQgZHVyaW5nIGFzc2VtYmxlci9saW5rZXIKLQkgcmVsYXhhdGlvbiBpZiBwb3NzaWJsZS4gICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyID0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFsbG93IHBhcnNlL2luc2VydCBoYW5kbGVycyB0byBvYnRhaW4gbGVuZ3RoIG9mIGluc24uICAqLwotICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICAgICAgaWYgKCEodG1wX2Vycm1zZyA9IENHRU5fUEFSU0VfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sICYgc3RyLCBmaWVsZHMpKSkKLQl7Ci0JICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkgIGlmIChDR0VOX0lOU0VSVF9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgZmllbGRzLCBidWYsIChiZmRfdm1hKSAwKQotCSAgICAgICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhY3R1YWxseSBvdXRwdXQgdGhlIGluc24gYW5kIGFueQotCSAgICAgcXVldWVkIHJlbG9jcy4gICovCi0JICByZXR1cm4gaW5zbjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIHsKLSAgICBzdGF0aWMgY2hhciBlcnJidWZbMTUwXTsKLQotI2lmZGVmIENHRU5fVkVSQk9TRV9BU1NFTUJMRVJfRVJST1JTCi0gICAgLyogaWYgdmVyYm9zZSBlcnJvciBtZXNzYWdlcywgdXNlIGVycm1zZyBmcm9tIENHRU5fUEFSU0VfRk4gKi8KLSAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsICIlcyBgJS41MHMuLi4nIiwgdG1wX2Vycm1zZywgc3RhcnQpOwotICAgIGVsc2UgCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCAiJXMgYCUuNTBzJyIsIHRtcF9lcnJtc2csIHN0YXJ0KTsKLSNlbHNlCi0gICAgaWYgKHN0cmxlbiAoc3RhcnQpID4gNTApCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIpLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIiksIHN0YXJ0KTsKLSNlbmRpZgotICAgICAgCi0gICAgKmVycm1zZyA9IGVycmJ1ZjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotDAotI2lmIDAgLyogVGhpcyBjYWxscyBiYWNrIHRvIEdBUyB3aGljaCB3ZSBjYW4ndCBkbyB3aXRob3V0IGNhcmUuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBUaGlzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgRklYTUU6IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9hc21faGFzaF9rZXl3b3JkcyAoY2QsIG9wdmFscykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9LRVlXT1JEICpvcHZhbHM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChvcHZhbHMsIE5VTEwpOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKiBrZTsKLQotICB3aGlsZSAoKGtlID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0ICgmIHNlYXJjaCkpICE9IE5VTEwpCi0gICAgewotI2lmIDAgLyogVW5uZWNlc3NhcnksIHNob3VsZCBiZSBkb25lIGluIHRoZSBzZWFyY2ggcm91dGluZS4gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5fb3B2YWxfc3VwcG9ydGVkIChrZSkpCi0JY29udGludWU7Ci0jZW5kaWYKLSAgICAgIGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAoY2QsIGtlLT5uYW1lLCBrZS0+dmFsdWUpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmMgYi9vcGNvZGVzL20zMnItZGVzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBjMzhmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc1ICswLDAgQEAKLS8qIENQVSBkYXRhIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQXR0cmlidXRlcy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQotewotICB7ICIjZiIsIDAgfSwKLSAgeyAiI3QiLCAxIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KLXsKLSAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAotICB7ICJtMzJyIiwgTUFDSF9NMzJSIH0sCi0gIHsgIm0zMnJ4IiwgTUFDSF9NMzJSWCB9LAotICB7ICJtYXgiLCBNQUNIX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBJU0FfYXR0cltdID0KLXsKLSAgeyAibTMyciIsIElTQV9NMzJSIH0sCi0gIHsgIm1heCIsIElTQV9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgUElQRV9hdHRyW10gPQotewotICB7ICJOT05FIiwgUElQRV9OT05FIH0sCi0gIHsgIk8iLCBQSVBFX08gfSwKLSAgeyAiUyIsIFBJUEVfUyB9LAotICB7ICJPUyIsIFBJUEVfT1MgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVTRVJWRUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTE9DIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ0FDSEUtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBST0ZJTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJORUdBVElWRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNFTS1PTkxZIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxPQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiSEFTSC1QUkVGSVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2luc25fYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlBJUEUiLCAmIFBJUEVfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiRklMTC1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTUEVDSUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSVNBIG0zMnJfY2dlbl9pc2FfdGFibGVbXSA9IHsKLSAgeyAibTMyciIsIDMyLCAzMiwgMTYsIDMyLCAgfSwKLSAgeyAwIH0KLX07Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIIG0zMnJfY2dlbl9tYWNoX3RhYmxlW10gPSB7Ci0gIHsgIm0zMnIiLCAibTMyciIsIE1BQ0hfTTMyUiB9LAotICB7ICJtMzJyeCIsICJtMzJyeCIsIE1BQ0hfTTMyUlggfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgImZwIiwgMTMgfSwKLSAgeyAibHIiLCAxNCB9LAotICB7ICJzcCIsIDE1IH0sCi0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1swXSwKLSAgMTkKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInBzdyIsIDAgfSwKLSAgeyAiY2JyIiwgMSB9LAotICB7ICJzcGkiLCAyIH0sCi0gIHsgInNwdSIsIDMgfSwKLSAgeyAiYnBjIiwgNiB9LAotICB7ICJiYnBzdyIsIDggfSwKLSAgeyAiYmJwYyIsIDE0IH0sCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotICB7ICJjcjgiLCA4IH0sCi0gIHsgImNyOSIsIDkgfSwKLSAgeyAiY3IxMCIsIDEwIH0sCi0gIHsgImNyMTEiLCAxMSB9LAotICB7ICJjcjEyIiwgMTIgfSwKLSAgeyAiY3IxMyIsIDEzIH0sCi0gIHsgImNyMTQiLCAxNCB9LAotICB7ICJjcjE1IiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbMF0sCi0gIDIzCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3Vtc19lbnRyaWVzW10gPQotewotICB7ICJhMCIsIDAgfSwKLSAgeyAiYTEiLCAxIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMgPQotewotICAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3Vtc19lbnRyaWVzWzBdLAotICAyCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIG0zMnJfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaGkxNiIsIEhXX0hfSEkxNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVsbzE2IiwgSFdfSF9VTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWdyIiwgSFdfSF9HUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIHsgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY3IiLCBIV19IX0NSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFjY3VtcyIsIEhXX0hfQUNDVU1TLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSB9IH0gfSwKLSAgeyAiaC1jb25kIiwgSFdfSF9DT05ELCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcHN3IiwgSFdfSF9QU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1icHN3IiwgSFdfSF9CUFNXLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIGluc3RydWN0aW9uIGZpZWxkIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSUZMRF8sYSkpCi0KLWNvbnN0IENHRU5fSUZMRCBtMzJyX2NnZW5faWZsZF90YWJsZVtdID0KLXsKLSAgeyBNMzJSX0ZfTklMLCAiZi1uaWwiLCAwLCAwLCAwLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9BTllPRiwgImYtYW55b2YiLCAwLCAwLCAwLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9PUDEsICJmLW9wMSIsIDAsIDMyLCAwLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9PUDIsICJmLW9wMiIsIDAsIDMyLCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9DT05ELCAiZi1jb25kIiwgMCwgMzIsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1IxLCAiZi1yMSIsIDAsIDMyLCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9SMiwgImYtcjIiLCAwLCAzMiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NJTU04LCAiZi1zaW1tOCIsIDAsIDMyLCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9TSU1NMTYsICJmLXNpbW0xNiIsIDAsIDMyLCAxNiwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NISUZUX09QMiwgImYtc2hpZnQtb3AyIiwgMCwgMzIsIDgsIDMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU00LCAiZi11aW1tNCIsIDAsIDMyLCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTUsICJmLXVpbW01IiwgMCwgMzIsIDExLCA1LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NMTYsICJmLXVpbW0xNiIsIDAsIDMyLCAxNiwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU0yNCwgImYtdWltbTI0IiwgMCwgMzIsIDgsIDI0LCB7IDB8QShSRUxPQyl8QShBQlNfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ISTE2LCAiZi1oaTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDgsICJmLWRpc3A4IiwgMCwgMzIsIDgsIDgsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDE2LCAiZi1kaXNwMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0RJU1AyNCwgImYtZGlzcDI0IiwgMCwgMzIsIDgsIDI0LCB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMjMsICJmLW9wMjMiLCAwLCAzMiwgOSwgMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AzLCAiZi1vcDMiLCAwLCAzMiwgMTQsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0FDQywgImYtYWNjIiwgMCwgMzIsIDgsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0FDQ1MsICJmLWFjY3MiLCAwLCAzMiwgMTIsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0FDQ0QsICJmLWFjY2QiLCAwLCAzMiwgNCwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQklUUzY3LCAiZi1iaXRzNjciLCAwLCAzMiwgNiwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQklUMTQsICJmLWJpdDE0IiwgMCwgMzIsIDE0LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9JTU0xLCAiZi1pbW0xIiwgMCwgMzIsIDE1LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIG9wZXJhbmQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSkKLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLQotY29uc3QgQ0dFTl9PUEVSQU5EIG0zMnJfY2dlbl9vcGVyYW5kX3RhYmxlW10gPQotewotLyogcGM6IHByb2dyYW0gY291bnRlciAqLwotICB7ICJwYyIsIE0zMlJfT1BFUkFORF9QQywgSFdfSF9QQywgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3I6IHNvdXJjZSByZWdpc3RlciAqLwotICB7ICJzciIsIE0zMlJfT1BFUkFORF9TUiwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRyOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJkciIsIE0zMlJfT1BFUkFORF9EUiwgSFdfSF9HUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMTogc291cmNlIHJlZ2lzdGVyIDEgKi8KLSAgeyAic3JjMSIsIE0zMlJfT1BFUkFORF9TUkMxLCBIV19IX0dSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcmMyOiBzb3VyY2UgcmVnaXN0ZXIgMiAqLwotICB7ICJzcmMyIiwgTTMyUl9PUEVSQU5EX1NSQzIsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzY3I6IHNvdXJjZSBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgInNjciIsIE0zMlJfT1BFUkFORF9TQ1IsIEhXX0hfQ1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkY3I6IGRlc3RpbmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyAiZGNyIiwgTTMyUl9PUEVSQU5EX0RDUiwgSFdfSF9DUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2ltbTg6IDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAic2ltbTgiLCBNMzJSX09QRVJBTkRfU0lNTTgsIEhXX0hfU0lOVCwgOCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2ltbTE2OiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJzaW1tMTYiLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBIV19IX1NJTlQsIDE2LCAxNiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTQ6IDQgYml0IHRyYXAgbnVtYmVyICovCi0gIHsgInVpbW00IiwgTTMyUl9PUEVSQU5EX1VJTU00LCBIV19IX1VJTlQsIDEyLCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tNTogNSBiaXQgc2hpZnQgY291bnQgKi8KLSAgeyAidWltbTUiLCBNMzJSX09QRVJBTkRfVUlNTTUsIEhXX0hfVUlOVCwgMTEsIDUsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW0xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1aW1tMTYiLCBNMzJSX09QRVJBTkRfVUlNTTE2LCBIV19IX1VJTlQsIDE2LCAxNiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaW1tMTogMSBiaXQgaW1tZWRpYXRlICovCi0gIHsgImltbTEiLCBNMzJSX09QRVJBTkRfSU1NMSwgSFdfSF9VSU5ULCAxNSwgMSwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGFjY2Q6IGFjY3VtdWxhdG9yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0gIHsgImFjY2QiLCBNMzJSX09QRVJBTkRfQUNDRCwgSFdfSF9BQ0NVTVMsIDQsIDIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSB9IH0gIH0sCi0vKiBhY2NzOiBhY2N1bXVsYXRvciBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAiYWNjcyIsIE0zMlJfT1BFUkFORF9BQ0NTLCBIV19IX0FDQ1VNUywgMTIsIDIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSB9IH0gIH0sCi0vKiBhY2M6IGFjY3VtdWxhdG9yIHJlZyAoZCkgKi8KLSAgeyAiYWNjIiwgTTMyUl9PUEVSQU5EX0FDQywgSFdfSF9BQ0NVTVMsIDgsIDEsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSB9IH0gIH0sCi0vKiBoYXNoOiAjIHByZWZpeCAqLwotICB7ICJoYXNoIiwgTTMyUl9PUEVSQU5EX0hBU0gsIEhXX0hfU0lOVCwgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaGkxNjogaGlnaCAxNiBiaXQgaW1tZWRpYXRlLCBzaWduIG9wdGlvbmFsICovCi0gIHsgImhpMTYiLCBNMzJSX09QRVJBTkRfSEkxNiwgSFdfSF9ISTE2LCAxNiwgMTYsCi0gICAgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNsbzE2OiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSwgZm9yIGxvdygpICovCi0gIHsgInNsbzE2IiwgTTMyUl9PUEVSQU5EX1NMTzE2LCBIV19IX1NMTzE2LCAxNiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVsbzE2OiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlLCBmb3IgbG93KCkgKi8KLSAgeyAidWxvMTYiLCBNMzJSX09QRVJBTkRfVUxPMTYsIEhXX0hfVUxPMTYsIDE2LCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTI0OiAyNCBiaXQgYWRkcmVzcyAqLwotICB7ICJ1aW1tMjQiLCBNMzJSX09QRVJBTkRfVUlNTTI0LCBIV19IX0FERFIsIDgsIDI0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKXxBKFJFTE9DKXxBKEFCU19BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwODogOCBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3A4IiwgTTMyUl9PUEVSQU5EX0RJU1A4LCBIV19IX0lBRERSLCA4LCA4LAotICAgIHsgMHxBKFJFTEFYKXxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3AxNjogMTYgYml0IGRpc3BsYWNlbWVudCAqLwotICB7ICJkaXNwMTYiLCBNMzJSX09QRVJBTkRfRElTUDE2LCBIV19IX0lBRERSLCAxNiwgMTYsCi0gICAgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDI0OiAyNCBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3AyNCIsIE0zMlJfT1BFUkFORF9ESVNQMjQsIEhXX0hfSUFERFIsIDgsIDI0LAotICAgIHsgMHxBKFJFTEFYKXxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNvbmRiaXQ6IGNvbmRpdGlvbiBiaXQgKi8KLSAgeyAiY29uZGJpdCIsIE0zMlJfT1BFUkFORF9DT05EQklULCBIV19IX0NPTkQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGFjY3VtOiBhY2N1bXVsYXRvciAqLwotICB7ICJhY2N1bSIsIE0zMlJfT1BFUkFORF9BQ0NVTSwgSFdfSF9BQ0NVTSwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIG0zMnJfY2dlbl9pbnNuX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgMCwgMCwgMCB9LAotLyogYWRkICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BREQsICJhZGQiLCAiYWRkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREMywgImFkZDMiLCAiYWRkMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQzLCAiYW5kMyIsICJhbmQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBvciAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fT1IsICJvciIsICJvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fT1IzLCAib3IzIiwgIm9yMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogeG9yICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9YT1IsICJ4b3IiLCAieG9yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogeG9yMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9YT1IzLCAieG9yMyIsICJ4b3IzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERJLCAiYWRkaSIsICJhZGRpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYWRkdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREViwgImFkZHYiLCAiYWRkdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFYzLCAiYWRkdjMiLCAiYWRkdjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFgsICJhZGR4IiwgImFkZHgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBiYy5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDOCwgImJjOCIsICJiYy5zIiwgMTYsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBiYy5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQzI0LCAiYmMyNCIsICJiYy5sIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JFUSwgImJlcSIsICJiZXEiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JFUVosICJiZXF6IiwgImJlcXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJnZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JHRVosICJiZ2V6IiwgImJnZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJndHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JHVFosICJiZ3R6IiwgImJndHoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMRVosICJibGV6IiwgImJsZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJsdHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMVFosICJibHR6IiwgImJsdHoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JORVosICJibmV6IiwgImJuZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkw4LCAiYmw4IiwgImJsLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMMjQsICJibDI0IiwgImJsLmwiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmNsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkNMOCwgImJjbDgiLCAiYmNsLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogYmNsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDTDI0LCAiYmNsMjQiLCAiYmNsLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmMucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkM4LCAiYm5jOCIsICJibmMucyIsIDE2LAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYm5jLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQzI0LCAiYm5jMjQiLCAiYm5jLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FLCAiYm5lIiwgImJuZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYnJhLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQlJBOCwgImJyYTgiLCAiYnJhLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJyYS5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CUkEyNCwgImJyYTI0IiwgImJyYS5sIiwgMzIsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuY2wucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkNMOCwgImJuY2w4IiwgImJuY2wucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmNsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQ0wyNCwgImJuY2wyNCIsICJibmNsLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBjbXAgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVAsICJjbXAiLCAiY21wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogY21waSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QSSwgImNtcGkiLCAiY21waSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFUsICJjbXB1IiwgImNtcHUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVUksICJjbXB1aSIsICJjbXB1aSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogY21wZXEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBFUSwgImNtcGVxIiwgImNtcGVxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGNtcHogJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBaLCAiY21weiIsICJjbXB6IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWLCAiZGl2IiwgImRpdiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogZGl2dSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWVSwgImRpdnUiLCAiZGl2dSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcmVtICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SRU0sICJyZW0iLCAicmVtIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SRU1VLCAicmVtdSIsICJyZW11IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBkaXZoICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVZILCAiZGl2aCIsICJkaXZoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogamMgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSkMsICJqYyIsICJqYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogam5jICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pOQywgImpuYyIsICJqbmMiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGpsICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pMLCAiamwiLCAiamwiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGptcCAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTEQsICJsZCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRF9ELCAibGQtZCIsICJsZCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRiICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERCLCAibGRiIiwgImxkYiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERCX0QsICJsZGItZCIsICJsZGIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESCwgImxkaCIsICJsZGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESF9ELCAibGRoLWQiLCAibGRoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUJfRCwgImxkdWItZCIsICJsZHViIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVSCwgImxkdWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUhfRCwgImxkdWgtZCIsICJsZHVoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzcisgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRF9QTFVTLCAibGQtcGx1cyIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQyNCAkZHIsJHVpbW0yNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEMjQsICJsZDI0IiwgImxkMjQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkaTggJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESTgsICJsZGk4IiwgImxkaTgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREkxNiwgImxkaTE2IiwgImxkaTE2IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsb2NrICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTE9DSywgImxvY2siLCAibG9jayIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNISSwgIm1hY2hpIiwgIm1hY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDSElfQSwgIm1hY2hpLWEiLCAibWFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWNsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xPLCAibWFjbG8iLCAibWFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNMT19BLCAibWFjbG8tYSIsICJtYWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dISSwgIm1hY3doaSIsICJtYWN3aGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0hJX0EsICJtYWN3aGktYSIsICJtYWN3aGkiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dMTywgIm1hY3dsbyIsICJtYWN3bG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0xPX0EsICJtYWN3bG8tYSIsICJtYWN3bG8iLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMLCAibXVsIiwgIm11bCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxISSwgIm11bGhpIiwgIm11bGhpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMSElfQSwgIm11bGhpLWEiLCAibXVsaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTExPLCAibXVsbG8iLCAibXVsbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxMT19BLCAibXVsbG8tYSIsICJtdWxsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTFdISSwgIm11bHdoaSIsICJtdWx3aGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0hJX0EsICJtdWx3aGktYSIsICJtdWx3aGkiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTFdMTywgIm11bHdsbyIsICJtdWx3bG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0xPX0EsICJtdWx3bG8tYSIsICJtdWx3bG8iLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NViwgIm12IiwgIm12IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbXZmYWNoaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0hJLCAibXZmYWNoaSIsICJtdmZhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciwkYWNjcyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDSElfQSwgIm12ZmFjaGktYSIsICJtdmZhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYWNsbyAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0xPLCAibXZmYWNsbyIsICJtdmZhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciwkYWNjcyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTE9fQSwgIm12ZmFjbG8tYSIsICJtdmZhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ01JLCAibXZmYWNtaSIsICJtdmZhY21pIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciwkYWNjcyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTUlfQSwgIm12ZmFjbWktYSIsICJtdmZhY21pIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYyAkZHIsJHNjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkMsICJtdmZjIiwgIm12ZmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0hJLCAibXZ0YWNoaSIsICJtdnRhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNISV9BLCAibXZ0YWNoaS1hIiwgIm12dGFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNMTywgIm12dGFjbG8iLCAibXZ0YWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSwkYWNjcyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDTE9fQSwgIm12dGFjbG8tYSIsICJtdnRhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEMsICJtdnRjIiwgIm12dGMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIG5lZyAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTkVHLCAibmVnIiwgIm5lZyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBub3QgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05PVCwgIm5vdCIsICJub3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiByYWMgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUMsICJyYWMiLCAicmFjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWMgJGFjY2QsJGFjY3MsJGltbTEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNfRFNJLCAicmFjLWRzaSIsICJyYWMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDSCwgInJhY2giLCAicmFjaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQ0hfRFNJLCAicmFjaC1kc2kiLCAicmFjaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJ0ZSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JURSwgInJ0ZSIsICJydGUiLCAxNiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NFVEgsICJzZXRoIiwgInNldGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNsbCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0xMLCAic2xsIiwgInNsbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTEwzLCAic2xsMyIsICJzbGwzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzbGxpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTExJLCAic2xsaSIsICJzbGxpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSQSwgInNyYSIsICJzcmEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNyYTMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBMywgInNyYTMiLCAic3JhMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3JhaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBSSwgInNyYWkiLCAic3JhaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3JsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkwsICJzcmwiLCAic3JsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTDMsICJzcmwzIiwgInNybDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTEksICJzcmxpIiwgInNybGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NULCAic3QiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX0QsICJzdC1kIiwgInN0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RCLCAic3RiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUQl9ELCAic3RiLWQiLCAic3RiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RILCAic3RoIiwgInN0aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUSF9ELCAic3RoLWQiLCAic3RoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKyRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfUExVUywgInN0LXBsdXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAtJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVF9NSU5VUywgInN0LW1pbnVzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQiwgInN1YiIsICJzdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBzdWJ2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJWLCAic3VidiIsICJzdWJ2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogc3VieCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCWCwgInN1YngiLCAic3VieCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICBNMzJSX0lOU05fVFJBUCwgInRyYXAiLCAidHJhcCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1VOTE9DSywgInVubG9jayIsICJ1bmxvY2siLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNhdGIgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBVEIsICJzYXRiIiwgInNhdGIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzYXRoICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TQVRILCAic2F0aCIsICJzYXRoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc2F0ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TQVQsICJzYXQiLCAic2F0IiwgMzIsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBwY21wYnogJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9QQ01QQlosICJwY21wYnoiLCAicGNtcGJ6IiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogc2FkZCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBREQsICJzYWRkIiwgInNhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXVTEsICJtYWN3dTEiLCAibWFjd3UxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXNibG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NU0JMTywgIm1zYmxvIiwgIm1zYmxvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd3UxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV1UxLCAibXVsd3UxIiwgIm11bHd1MSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2xoMSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xIMSwgIm1hY2xoMSIsICJtYWNsaDEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBzYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NDLCAic2MiLCAic2MiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKFNLSVBfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNuYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NOQywgInNuYyIsICJzbmMiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKFNLSVBfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIG0zMnJfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBtMzJyX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgbTMycl9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIG0zMnJfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgbTMycl9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIG0zMnJfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLW0zMnJfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAobTMycl9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJtMzJyX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJtMzJyX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBtMzJyX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICAvKiBJbml0aWFsaXNlIGZsYWdzLiAgKi8KLSAgY2QtPnNpZ25lZF9vdmVyZmxvd19va19wID0gMDsKLSAgCi0gIHJldHVybiAoQ0dFTl9DUFVfREVTQykgY2Q7Ci19Ci0KLS8qIENvdmVyIGZuIHRvIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIG9mIDEgaXNhLCAxIG1hY2guCi0gICBNQUNIX05BTUUgaXMgdGhlIGJmZCBuYW1lIG9mIHRoZSBtYWNoLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuXzEgKG1hY2hfbmFtZSwgZW5kaWFuKQotICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0gICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotewotICByZXR1cm4gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORElBTiwgZW5kaWFuLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5EKTsKLX0KLQotLyogQ2xvc2UgYSBjcHUgdGFibGUuCi0gICA/Pz8gVGhpcyBjYW4gbGl2ZSBpbiBhIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmlsZSwgYnV0IHRoZXJlJ3MgY3VycmVudGx5Ci0gICBubyBwbGFjZSB0byBwdXQgdGhpcyBmaWxlICh0aGVyZSdzIG5vIGxpYmNnZW4pLiAgbGlib3Bjb2RlcyBpcyB0aGUgd3JvbmcKLSAgIHBsYWNlIGFzIHNvbWUgc2ltdWxhdG9yIHBvcnRzIHVzZSB0aGlzIGJ1dCB0aGV5IGRvbid0IHVzZSBsaWJvcGNvZGVzLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGlmIChjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmggYi9vcGNvZGVzL20zMnItZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVhMmY3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfQ1BVX0gKLSNkZWZpbmUgTTMyUl9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBtMzJyCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gbTMycl9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKG0zMnIsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX00zMlJCRgotI2RlZmluZSBIQVZFX0NQVV9NMzJSWEYKLQotI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKLQotLyogTWluaW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01JTl9JTlNOX1NJWkUgMgotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA0Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDEKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygc3ludGF4IGJ5dGVzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9BQ1RVQUxfTUFYX1NZTlRBWF9CWVRFUyAxNQotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIENHRU5fQUNUVUFMX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGZvcm1hdCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxXzEwLCBPUDFfMTEKLSAsIE9QMV8xMiwgT1AxXzEzLCBPUDFfMTQsIE9QMV8xNQotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igb3AyIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMiB7Ci0gIE9QMl8wLCBPUDJfMSwgT1AyXzIsIE9QMl8zCi0gLCBPUDJfNCwgT1AyXzUsIE9QMl82LCBPUDJfNwotICwgT1AyXzgsIE9QMl85LCBPUDJfMTAsIE9QMl8xMQotICwgT1AyXzEyLCBPUDJfMTMsIE9QMl8xNCwgT1AyXzE1Ci19IElOU05fT1AyOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9GUCA9IDEzLCBIX0dSX0xSID0gMTQsIEhfR1JfU1AgPSAxNSwgSF9HUl9SMCA9IDAKLSAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMsIEhfR1JfUjQgPSA0Ci0gLCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3LCBIX0dSX1I4ID0gOAotICwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEsIEhfR1JfUjEyID0gMTIKLSAsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX1BTVyA9IDAsIEhfQ1JfQ0JSID0gMSwgSF9DUl9TUEkgPSAyLCBIX0NSX1NQVSA9IDMKLSAsIEhfQ1JfQlBDID0gNiwgSF9DUl9CQlBTVyA9IDgsIEhfQ1JfQkJQQyA9IDE0LCBIX0NSX0NSMCA9IDAKLSAsIEhfQ1JfQ1IxID0gMSwgSF9DUl9DUjIgPSAyLCBIX0NSX0NSMyA9IDMsIEhfQ1JfQ1I0ID0gNAotICwgSF9DUl9DUjUgPSA1LCBIX0NSX0NSNiA9IDYsIEhfQ1JfQ1I3ID0gNywgSF9DUl9DUjggPSA4Ci0gLCBIX0NSX0NSOSA9IDksIEhfQ1JfQ1IxMCA9IDEwLCBIX0NSX0NSMTEgPSAxMSwgSF9DUl9DUjEyID0gMTIKLSAsIEhfQ1JfQ1IxMyA9IDEzLCBIX0NSX0NSMTQgPSAxNCwgSF9DUl9DUjE1ID0gMTUKLX0gQ1JfTkFNRVM7Ci0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtYWNoaW5lIHR5cGUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBtYWNoX2F0dHIgewotICBNQUNIX0JBU0UsIE1BQ0hfTTMyUiwgTUFDSF9NMzJSWCwgTUFDSF9NQVgKLX0gTUFDSF9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbiBzZXQgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBpc2FfYXR0ciB7Ci0gIElTQV9NMzJSLCBJU0FfTUFYCi19IElTQV9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBwYXJhbGxlbCBleGVjdXRpb24gcGlwZWxpbmUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBwaXBlX2F0dHIgewotICBQSVBFX05PTkUsIFBJUEVfTywgUElQRV9TLCBQSVBFX09TCi19IFBJUEVfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX1JFTE9DLCBDR0VOX0lGTERfRU5EX0JPT0xTCi0gLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUwotfSBDR0VOX0lGTERfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGlmaWVsZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgewotICBNMzJSX0ZfTklMLCBNMzJSX0ZfQU5ZT0YsIE0zMlJfRl9PUDEsIE0zMlJfRl9PUDIKLSAsIE0zMlJfRl9DT05ELCBNMzJSX0ZfUjEsIE0zMlJfRl9SMiwgTTMyUl9GX1NJTU04Ci0gLCBNMzJSX0ZfU0lNTTE2LCBNMzJSX0ZfU0hJRlRfT1AyLCBNMzJSX0ZfVUlNTTQsIE0zMlJfRl9VSU1NNQotICwgTTMyUl9GX1VJTU0xNiwgTTMyUl9GX1VJTU0yNCwgTTMyUl9GX0hJMTYsIE0zMlJfRl9ESVNQOAotICwgTTMyUl9GX0RJU1AxNiwgTTMyUl9GX0RJU1AyNCwgTTMyUl9GX09QMjMsIE0zMlJfRl9PUDMKLSAsIE0zMlJfRl9BQ0MsIE0zMlJfRl9BQ0NTLCBNMzJSX0ZfQUNDRCwgTTMyUl9GX0JJVFM2NwotICwgTTMyUl9GX0JJVDE0LCBNMzJSX0ZfSU1NMSwgTTMyUl9GX01BWAotfSBJRklFTERfVFlQRTsKLQotI2RlZmluZSBNQVhfSUZMRCAoKGludCkgTTMyUl9GX01BWCkKLQotLyogSGFyZHdhcmUgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2h3IGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X2F0dHIgewotICBDR0VOX0hXX1ZJUlRVQUwsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19QQywgQ0dFTl9IV19QUk9GSUxFCi0gLCBDR0VOX0hXX0VORF9CT09MUywgQ0dFTl9IV19TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9IV19NQUNILCBDR0VOX0hXX0VORF9OQk9PTFMKLX0gQ0dFTl9IV19BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9od19hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAoQ0dFTl9IV19FTkRfTkJPT0xTIC0gQ0dFTl9IV19TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGhhcmR3YXJlIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X3R5cGUgewotICBIV19IX01FTU9SWSwgSFdfSF9TSU5ULCBIV19IX1VJTlQsIEhXX0hfQUREUgotICwgSFdfSF9JQUREUiwgSFdfSF9QQywgSFdfSF9ISTE2LCBIV19IX1NMTzE2Ci0gLCBIV19IX1VMTzE2LCBIV19IX0dSLCBIV19IX0NSLCBIV19IX0FDQ1VNCi0gLCBIV19IX0FDQ1VNUywgSFdfSF9DT05ELCBIV19IX1BTVywgSFdfSF9CUFNXCi0gLCBIV19IX0JCUFNXLCBIV19IX0xPQ0ssIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX1JFTE9DLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgsIENHRU5fT1BFUkFORF9FTkRfQk9PTFMsIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9PUEVSQU5EX01BQ0gsIENHRU5fT1BFUkFORF9FTkRfTkJPT0xTCi19IENHRU5fT1BFUkFORF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9vcGVyYW5kX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKENHRU5fT1BFUkFORF9FTkRfTkJPT0xTIC0gQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgb3BlcmFuZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgewotICBNMzJSX09QRVJBTkRfUEMsIE0zMlJfT1BFUkFORF9TUiwgTTMyUl9PUEVSQU5EX0RSLCBNMzJSX09QRVJBTkRfU1JDMQotICwgTTMyUl9PUEVSQU5EX1NSQzIsIE0zMlJfT1BFUkFORF9TQ1IsIE0zMlJfT1BFUkFORF9EQ1IsIE0zMlJfT1BFUkFORF9TSU1NOAotICwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgTTMyUl9PUEVSQU5EX1VJTU00LCBNMzJSX09QRVJBTkRfVUlNTTUsIE0zMlJfT1BFUkFORF9VSU1NMTYKLSAsIE0zMlJfT1BFUkFORF9JTU0xLCBNMzJSX09QRVJBTkRfQUNDRCwgTTMyUl9PUEVSQU5EX0FDQ1MsIE0zMlJfT1BFUkFORF9BQ0MKLSAsIE0zMlJfT1BFUkFORF9IQVNILCBNMzJSX09QRVJBTkRfSEkxNiwgTTMyUl9PUEVSQU5EX1NMTzE2LCBNMzJSX09QRVJBTkRfVUxPMTYKLSAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIE0zMlJfT1BFUkFORF9ESVNQOCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgTTMyUl9PUEVSQU5EX0RJU1AyNAotICwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIE0zMlJfT1BFUkFORF9BQ0NVTSwgTTMyUl9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBNMzJSX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDExCi0KLS8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKLSAgQ0dFTl9JTlNOX0FMSUFTLCBDR0VOX0lOU05fVklSVFVBTCwgQ0dFTl9JTlNOX1VOQ09ORF9DVEksIENHRU5fSU5TTl9DT05EX0NUSQotICwgQ0dFTl9JTlNOX1NLSVBfQ1RJLCBDR0VOX0lOU05fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX1JFTEFYQUJMRSwgQ0dFTl9JTlNOX1JFTEFYCi0gLCBDR0VOX0lOU05fTk9fRElTLCBDR0VOX0lOU05fUEJCLCBDR0VOX0lOU05fRklMTF9TTE9ULCBDR0VOX0lOU05fU1BFQ0lBTAotICwgQ0dFTl9JTlNOX0VORF9CT09MUywgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX1BJUEUKLSAsIENHRU5fSU5TTl9FTkRfTkJPT0xTCi19IENHRU5fSU5TTl9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLwotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW107Ci0KLS8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KLQotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zOwotCi0KLQotCi0jZW5kaWYgLyogTTMyUl9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRpcy5jIGIvb3Bjb2Rlcy9tMzJyLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQ1Mzc3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLwotI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCi0KLXN0YXRpYyB2b2lkIHByaW50X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCi0JCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0MCi0vKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBkaXMuYyAqLwotCi0vKiBJbW1lZGlhdGUgdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICcjJy4gICovCi0KLSNkZWZpbmUgQ0dFTl9QUklOVF9OT1JNQUwoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkgXAotZG8geyBcCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoKGF0dHJzKSwgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSkgXAotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyIpOyBcCi19IHdoaWxlICgwKQotCi0vKiBIYW5kbGUgJyMnIHByZWZpeGVzIGFzIG9wZXJhbmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2hhc2ggKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsKLX0KLQotI3VuZGVmIENHRU5fUFJJTlRfSU5TTgotI2RlZmluZSBDR0VOX1BSSU5UX0lOU04gbXlfcHJpbnRfaW5zbgotCi1zdGF0aWMgaW50Ci1teV9wcmludF9pbnNuIChjZCwgcGMsIGluZm8pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmZmVyW0NHRU5fTUFYX0lOU05fU0laRV07Ci0gIGNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKLSAgaW50IHN0YXR1czsKLSAgaW50IGJ1ZmxlbiA9IChwYyAmIDMpID09IDAgPyA0IDogMjsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGJ1ZmxlbiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIDMyIGJpdCBpbnNuPyAgKi8KLSAgaWYgKChwYyAmIDMpID09IDAgJiYgKGJ1ZlswXSAmIDB4ODApICE9IDApCi0gICAgcmV0dXJuIHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBidWZsZW4pOwotCi0gIC8qIFByaW50IHRoZSBmaXJzdCBpbnNuLiAgKi8KLSAgaWYgKChwYyAmIDMpID09IDApCi0gICAgewotICAgICAgaWYgKHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCAyKSA9PSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgICAgIGJ1ZiArPSAyOwotICAgIH0KLQotICBpZiAoYnVmWzBdICYgMHg4MCkKLSAgICB7Ci0gICAgICAvKiBQYXJhbGxlbC4gICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiB8fCAiKTsKLSAgICAgIGJ1ZlswXSAmPSAweDdmOwotICAgIH0KLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIC0+ICIpOwotCi0gIC8qIFRoZSAiJiAzIiBpcyB0byBwYXNzIGEgY29uc2lzdGVudCBhZGRyZXNzLgotICAgICBQYXJhbGxlbCBpbnNucyBhcmd1YWJseSBib3RoIGJlZ2luIG9uIHRoZSB3b3JkIGJvdW5kYXJ5LgotICAgICBBbHNvLCBicmFuY2ggaW5zbnMgYXJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAocHJpbnRfaW5zbiAoY2QsIHBjICYgfiAoYmZkX3ZtYSkgMywgaW5mbywgYnVmLCAyKSA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLQotICByZXR1cm4gKHBjICYgMykgPyAyIDogNDsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCi0gICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKLSAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLXZvaWQKLW0zMnJfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBQVFIgeGluZm87Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIHZvaWQgY29uc3QgKmF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsIGZpZWxkcy0+Zl9hY2MsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsIGZpZWxkcy0+Zl9hY2NkLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCBmaWVsZHMtPmZfYWNjcywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDE2LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDI0LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTEFYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgcHJpbnRfaGFzaCAoY2QsIGluZm8sIDAsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdOX09QVCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaW1tMSwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0yNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX0FCU19BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW01LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMTYsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwcmludGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLWNnZW5fcHJpbnRfZm4gKiBjb25zdCBtMzJyX2NnZW5fcHJpbnRfaGFuZGxlcnNbXSA9IAotewotICBwcmludF9pbnNuX25vcm1hbCwKLX07Ci0KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfZGlzIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIG0zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnByaW50X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5fcHJpbnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5wcmludF9vcGVyYW5kID0gbTMycl9jZ2VuX3ByaW50X29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9ub3JtYWwgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9OT1JNQUwKLSAgQ0dFTl9QUklOVF9OT1JNQUwgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIHZhbHVlKTsKLX0KLQotLyogRGVmYXVsdCBhZGRyZXNzIGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYWRkcmVzcyAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX0FERFJFU1MKLSAgQ0dFTl9QUklOVF9BRERSRVNTIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX0FCU19BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIChsb25nKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgKGxvbmcpIHZhbHVlKTsKLX0KLQotLyogS2V5d29yZCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2tleXdvcmQgKGNkLCBkaXNfaW5mbywga2V5d29yZF90YWJsZSwgdmFsdWUsIGF0dHJzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlIChrZXl3b3JkX3RhYmxlLCB2YWx1ZSk7Ci0gIGlmIChrZSAhPSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBrZS0+bmFtZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj8/PyIpOwotfQotDAotLyogRGVmYXVsdCBpbnNuIHByaW50ZXIuCi0KLSAgIERJU19JTkZPIGlzIGRlZmluZWQgYXMgYFBUUicgc28gdGhlIGRpc2Fzc2VtYmxlciBuZWVkbid0IGtub3cgYW55dGhpbmcKLSAgIGFib3V0IGRpc2Fzc2VtYmxlX2luZm8uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9ub3JtYWwgKGNkLCBkaXNfaW5mbywgaW5zbiwgZmllbGRzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0lOSVRfUFJJTlQgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaWYgKENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCBDR0VOX1NZTlRBWF9DSEFSICgqc3luKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gICovCi0gICAgICBtMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwgaW5mbywKLQkJCQkgZmllbGRzLCBDR0VOX0lOU05fQVRUUlMgKGluc24pLCBwYywgbGVuZ3RoKTsKLSAgICB9Ci19Ci0MCi0vKiBVdGlsaXR5IHRvIHByaW50IGFuIGluc24uCi0gICBCVUYgaXMgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbiwgdGFyZ2V0IGJ5dGUgb3JkZXIsIEJVRkxFTiBieXRlcyBsb25nLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBidWZsZW4pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3ZhbHVlOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbl9saXN0OwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotCi0gIGV4X2luZm8uZGlzX2luZm8gPSBpbmZvOwotICBleF9pbmZvLnZhbGlkID0gKDEgPDwgKGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpKSAtIDE7Ci0gIGV4X2luZm8uaW5zbl9ieXRlcyA9IGJ1ZjsKLQotICBzd2l0Y2ggKGJ1ZmxlbikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zbl92YWx1ZSA9IGJ1ZlswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjE2IChidWYpIDogYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjMyIChidWYpIDogYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0gICAgIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICBpbnNuX2xpc3QgPSBDR0VOX0RJU19MT09LVVBfSU5TTiAoY2QsIGJ1ZiwgaW5zbl92YWx1ZSk7Ci0gIHdoaWxlIChpbnNuX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbnNuX2xpc3QtPmluc247Ci0gICAgICBDR0VOX0ZJRUxEUyBmaWVsZHM7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0jaWZkZWYgQ0dFTl9WQUxJREFURV9JTlNOX1NVUFBPUlRFRCAKLSAgICAgIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgbTMycl9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0JICBjb250aW51ZTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlIGV4dHJhY3QKLQkgaGFuZGxlci4gICovCi0gICAgICBpZiAoKGluc25fdmFsdWUgJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkgID09IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKSkKLQl7Ci0JICAvKiBQcmludGluZyBpcyBoYW5kbGVkIGluIHR3byBwYXNzZXMuICBUaGUgZmlyc3QgcGFzcyBwYXJzZXMgdGhlCi0JICAgICBtYWNoaW5lIGluc24gYW5kIGV4dHJhY3RzIHRoZSBmaWVsZHMuICBUaGUgc2Vjb25kIHBhc3MgcHJpbnRzCi0JICAgICB0aGVtLiAgKi8KLQotCSAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkgICAgKGNkLCBpbnNuLCAmZXhfaW5mbywgaW5zbl92YWx1ZSwgJmZpZWxkcywgcGMpOwotCSAgLyogbGVuZ3RoIDwgMCAtPiBlcnJvciAqLwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHJldHVybiBsZW5ndGg7Ci0JICBpZiAobGVuZ3RoID4gMCkKLQkgICAgewotCSAgICAgIENHRU5fUFJJTlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluZm8sIGluc24sICZmaWVsZHMsIHBjLCBsZW5ndGgpOwotCSAgICAgIC8qIGxlbmd0aCBpcyBpbiBiaXRzLCByZXN1bHQgaXMgaW4gYnl0ZXMgKi8KLQkgICAgICByZXR1cm4gbGVuZ3RoIC8gODsKLQkgICAgfQotCX0KLQotICAgICAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTkVYVF9JTlNOIChpbnNuX2xpc3QpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogRGVmYXVsdCB2YWx1ZSBmb3IgQ0dFTl9QUklOVF9JTlNOLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQgZmV0Y2hpbmcgYnl0ZXMuICAqLwotCi0jaWZuZGVmIENHRU5fUFJJTlRfSU5TTgotI2RlZmluZSBDR0VOX1BSSU5UX0lOU04gZGVmYXVsdF9wcmludF9pbnNuCi0jZW5kaWYKLQotc3RhdGljIGludAotZGVmYXVsdF9wcmludF9pbnNuIChjZCwgcGMsIGluZm8pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmW0NHRU5fTUFYX0lOU05fU0laRV07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KTsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGluIGJ5dGVzKS4gICovCi0KLWludAotcHJpbnRfaW5zbl9tMzJyIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIENHRU5fQ1BVX0RFU0MgY2QgPSAwOwotICBzdGF0aWMgcHJldl9pc2EscHJldl9tYWNoLHByZXZfZW5kaWFuOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaXNhLG1hY2g7Ci0gIGludCBlbmRpYW4gPSAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCT8gQ0dFTl9FTkRJQU5fQklHCi0JCTogQ0dFTl9FTkRJQU5fTElUVExFKTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogPz8/IGdkYiB3aWxsIHNldCBtYWNoIGJ1dCBsZWF2ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzICJ1bmtub3duIiAqLwotI2lmbmRlZiBDR0VOX0JGRF9BUkNICi0jZGVmaW5lIENHRU5fQkZEX0FSQ0ggYmZkX2FyY2hfbTMycgotI2VuZGlmCi0gIGFyY2ggPSBpbmZvLT5hcmNoOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIGFyY2ggPSBDR0VOX0JGRF9BUkNIOwotICAgICAgCi0gIC8qIFRoZXJlJ3Mgbm8gc3RhbmRhcmQgd2F5IHRvIGNvbXB1dGUgdGhlIGlzYSBudW1iZXIgKGUuZy4gZm9yIGFybSB0aHVtYikKLSAgICAgc28gd2UgbGVhdmUgaXQgdG8gdGhlIHRhcmdldC4gICovCi0jaWZkZWYgQ0dFTl9DT01QVVRFX0lTQQotICBpc2EgPSBDR0VOX0NPTVBVVEVfSVNBIChpbmZvKTsKLSNlbHNlCi0gIGlzYSA9IDA7Ci0jZW5kaWYKLQotICBtYWNoID0gaW5mby0+bWFjaDsKLQotICAvKiBJZiB3ZSd2ZSBzd2l0Y2hlZCBjcHUncywgY2xvc2UgdGhlIGN1cnJlbnQgdGFibGUgYW5kIG9wZW4gYSBuZXcgb25lLiAgKi8KLSAgaWYgKGNkCi0gICAgICAmJiAoaXNhICE9IHByZXZfaXNhCi0JICB8fCBtYWNoICE9IHByZXZfbWFjaAotCSAgfHwgZW5kaWFuICE9IHByZXZfZW5kaWFuKSkKLSAgICB7Ci0gICAgICBtMzJyX2NnZW5fY3B1X2Nsb3NlIChjZCk7Ci0gICAgICBjZCA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgeWV0LCBpbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpZiAoISBjZCkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2hfdHlwZSA9IGJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaCk7Ci0gICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0KLSAgICAgIGlmICghYXJjaF90eXBlKQotCWFib3J0ICgpOwotICAgICAgbWFjaF9uYW1lID0gYXJjaF90eXBlLT5wcmludGFibGVfbmFtZTsKLQotICAgICAgcHJldl9pc2EgPSBpc2E7Ci0gICAgICBwcmV2X21hY2ggPSBtYWNoOwotICAgICAgcHJldl9lbmRpYW4gPSBlbmRpYW47Ci0gICAgICBjZCA9IG0zMnJfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9JU0FTLCBwcmV2X2lzYSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBwcmV2X2VuZGlhbiwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICAgICAgaWYgKCFjZCkKLQlhYm9ydCAoKTsKLSAgICAgIG0zMnJfY2dlbl9pbml0X2RpcyAoY2QpOwotICAgIH0KLQotICAvKiBXZSB0cnkgdG8gaGF2ZSBhcyBtdWNoIGNvbW1vbiBjb2RlIGFzIHBvc3NpYmxlLgotICAgICBCdXQgYXQgdGhpcyBwb2ludCBzb21lIHRhcmdldHMgbmVlZCB0byB0YWtlIG92ZXIuICAqLwotICAvKiA/Pz8gU29tZSB0YXJnZXRzIG1heSBuZWVkIGEgaG9vayBlbHNld2hlcmUuICBUcnkgdG8gYXZvaWQgdGhpcywKLSAgICAgYnV0IGlmIG5vdCBwb3NzaWJsZSB0cnkgdG8gbW92ZSB0aGlzIGhvb2sgZWxzZXdoZXJlIHJhdGhlciB0aGFuCi0gICAgIGhhdmUgdHdvIGhvb2tzLiAgKi8KLSAgbGVuZ3RoID0gQ0dFTl9QUklOVF9JTlNOIChjZCwgcGMsIGluZm8pOwotICBpZiAobGVuZ3RoID4gMCkKLSAgICByZXR1cm4gbGVuZ3RoOwotICBpZiAobGVuZ3RoIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotICByZXR1cm4gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplIC8gODsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1pYmxkLmMgYi9vcGNvZGVzL20zMnItaWJsZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGMzYzZhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1pYmxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA1ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIGJ1aWxkaW5nL2V4dHJhY3Rpb24gc3VwcG9ydCBmb3IgbTMyci4gLSotIEMgLSotCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1pYmxkLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLS8qIFVzZWQgYnkgdGhlIGlmaWVsZCBydHggZnVuY3Rpb24uICAqLwotI2RlZmluZSBGTEQoZikgKGZpZWxkcy0+ZikKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgQ0dFTl9JTlNOX0JZVEVTX1BUUikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosCi0JICAgICAgQ0dFTl9GSUVMRFMgKiwgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgaW50IGV4dHJhY3Rfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIENHRU5fRVhUUkFDVF9JTkZPICosIENHRU5fSU5TTl9JTlQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBsb25nICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9FWFRSQUNUX0lORk8gKiwKLQkgICAgICBDR0VOX0lOU05fSU5ULCBDR0VOX0ZJRUxEUyAqLCBiZmRfdm1hKSk7Ci0MCi0vKiBPcGVyYW5kIGluc2VydGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGluc2VydF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgdm9pZAotaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgeCA9ICh4ICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgICpidWZwID0geDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIxNiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JewotCSAgYnVmcFswXSA9IHggPj4gMTY7Ci0JICBiZmRfcHV0YjE2ICh4LCBidWZwICsgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotCSAgYnVmcFsyXSA9IHggPj4gMTY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjMyICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBpbnNlcnRpb24gcm91dGluZS4KLQotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLS8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgZnVuY3Rpb25hbGl0eSB3aXRoIGJmZCdzIGhvd3RvIHRhYmxlIGFuZAotICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsCi0JICAgICAgIHRvdGFsX2xlbmd0aCwgYnVmZmVyKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci17Ci0gIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZS4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBiYXNlLWluc24tYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBFbnN1cmUgVkFMVUUgd2lsbCBmaXQuICAqLwotICBpZiAoISBDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4dmFsID0gbWFzazsKLSAgICAgIAotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoZXJyYnVmLAotCQkgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiKSwKLQkJICAgdmFsdWUsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBjZ2VuX3NpZ25lZF9vdmVyZmxvd19va19wIChjZCkpCi0JewotCSAgbG9uZyBtaW52YWwgPSAtICgxTCA8PCAobGVuZ3RoIC0gMSkpOwotCSAgbG9uZyBtYXh2YWwgPSAgICgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMTsKLQkgIAotCSAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCSAgICB7Ci0JICAgICAgc3ByaW50ZgotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkoZXJyYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpLAotCQkgdmFsdWUsIG1pbnZhbCwgbWF4dmFsKTsKLQkgICAgICByZXR1cm4gZXJyYnVmOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gIHsKLSAgICBpbnQgc2hpZnQ7Ci0KLSAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gICAgZWxzZQotICAgICAgc2hpZnQgPSB3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCk7Ci0gICAgKmJ1ZmZlciA9ICgqYnVmZmVyICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotICB9Ci0KLSNlbHNlIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXIgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICBpbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCk7Ci0gIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBidWlsZGVyIChpbnNlcnQgaGFuZGxlcikuCi0gICBUaGUgaW5zdHJ1Y3Rpb24gaXMgcmVjb3JkZWQgaW4gQ0dFTl9JTlRfSU5TTl9QIGJ5dGUgb3JkZXIKLSAgIChtZWFuaW5nIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIEJVRkZFUiBpcyBhbiBpbnQgKiBhbmQgdGh1cyB0aGUgdmFsdWUgaXMKLSAgIHJlY29yZGVkIGluIGhvc3QgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRkZFUiBpcyBhbiBhcnJheSBvZiBieXRlcyBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZWNvcmRlZCBpbiB0YXJnZXQgYnl0ZSBvcmRlcikuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLQotICBDR0VOX0lOSVRfSU5TRVJUIChjZCk7Ci0gIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotCi0gIC8qIElmIHdlJ3JlIHJlY29yZGluZyBpbnNucyBhcyBudW1iZXJzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvZiBieXRlcyksCi0gICAgIHRhcmdldCBieXRlIG9yZGVyIGhhbmRsaW5nIGlzIGRlZmVycmVkIHVudGlsIGxhdGVyLiAgKi8KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gICpidWZmZXIgPSB2YWx1ZTsKLQotI2Vsc2UKLQotICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmZmVyLCBtaW4gKGNkLT5iYXNlX2luc25fYml0c2l6ZSwKLQkJCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSksCi0JCSAgICAgICB2YWx1ZSk7Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIC8qID8/PyBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc2NhbiB0aGUgZm9ybWF0J3MgZmllbGRzLgotICAgICBTdGlsbCBuZWVkIHRvIGJlIGFibGUgdG8gaW5zZXJ0IGEgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgdGhvdWdoOwotICAgICBlLmcuIHN0b3JpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IHRoYXQgZ290IHJlc29sdmVkIGxhdGVyLgotICAgICBOZWVkcyBtb3JlIHRob3VnaHQgZmlyc3QuICAqLwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqIHN5biAhPSAnXDAnOyArKyBzeW4pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGVycm1zZyA9ICgqIGNkLT5pbnNlcnRfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJICAgICAgIGZpZWxkcywgYnVmZmVyLCBwYyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBleHRyYWN0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuCi0gICBFbnN1cmUgc3VmZmljaWVudCBieXRlcyBhcmUgY2FjaGVkIGluIEVYX0lORk8uCi0gICBPRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBCWVRFUyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBuZWVkZWQgdmFsdWUuCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgaW50Ci1maWxsX2NhY2hlIChjZCwgZXhfaW5mbywgb2Zmc2V0LCBieXRlcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgb2Zmc2V0LCBieXRlczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogSXQncyBkb3VidGZ1bCB0aGF0IHRoZSBtaWRkbGUgcGFydCBoYXMgYWxyZWFkeSBiZWVuIGZldGNoZWQgc28KLSAgICAgd2UgZG9uJ3Qgb3B0aW1pemUgdGhhdCBjYXNlLiAga2lzcy4gICovCi0gIGludCBtYXNrOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZXhfaW5mby0+ZGlzX2luZm87Ci0KLSAgLyogRmlyc3QgZG8gYSBxdWljayBjaGVjay4gICovCi0gIG1hc2sgPSAoMSA8PCBieXRlcykgLSAxOwotICBpZiAoKChleF9pbmZvLT52YWxpZCA+PiBvZmZzZXQpICYgbWFzaykgPT0gbWFzaykKLSAgICByZXR1cm4gMTsKLQotICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBieXRlIHdlIG5lZWQgdG8gcmVhZC4gICovCi0gIGZvciAobWFzayA9IDEgPDwgb2Zmc2V0OyBieXRlcyA+IDA7IC0tYnl0ZXMsICsrb2Zmc2V0LCBtYXNrIDw8PSAxKQotICAgIGlmICghIChtYXNrICYgZXhfaW5mby0+dmFsaWQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGJ5dGVzKQotICAgIHsKLSAgICAgIGludCBzdGF0dXM7Ci0KLSAgICAgIHBjICs9IG9mZnNldDsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkocGMsIGV4X2luZm8tPmluc25fYnl0ZXMgKyBvZmZzZXQsIGJ5dGVzLCBpbmZvKTsKLQotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgZXhfaW5mby0+dmFsaWQgfD0gKCgxIDw8IGJ5dGVzKSAtIDEpIDw8IG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgbG9uZwotZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICByZXR1cm4gKHggPj4gc2hpZnQpICYgbWFzazsKLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgZXh0cmFjdGlvbiByb3V0aW5lLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIG9mIHRoZSBpbnNuIGluIGhvc3Qgb3JkZXIsCi0gICBvciBzb21ldGltZXMgbGVzcyBmb3IgY2FzZXMgbGlrZSB0aGUgbTMyciB3aGVyZSB0aGUgYmFzZSBpbnNuIHNpemUgaXMgMzIKLSAgIGJ1dCBzb21lIGluc25zIGFyZSAxNiBiaXRzLgotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICBXZSBvbmx5IG5lZWQgYFNJR05FRCcsCi0gICBidXQgZm9yIGdlbmVyYWxpdHkgd2UgdGFrZSBhIGJpdG1hc2sgb2YgYWxsIG9mIHRoZW0uCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotLyogPz8/IFRoZSByZXR1cm4gY29kZSBpc24ndCBwcm9wZXJseSB1c2VkLiAgd2lwLiAgKi8KLQotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsCi0JCXdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGgsIHBjLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBiZmRfdm1hIHBjOwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlCi0gICAgIHNvIGdpdmUgaXQgYSBzdGFuZGFyZCB2YWx1ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgICp2YWx1ZXAgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGluc24tYmFzZS1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIERvZXMgdGhlIHZhbHVlIHJlc2lkZSBpbiBJTlNOX1ZBTFVFPyAgKi8KLQotICBpZiAod29yZF9vZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICAgICAgQ0dFTl9JTlNOX0lOVCBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAgICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICgoc3RhcnQgKyAxKSAtIGxlbmd0aCk7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICAgICAgdmFsdWUgJj0gbWFzazsKLSAgICAgIC8qIHNpZ24gZXh0ZW5kPyAqLwotICAgICAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmICgxTCA8PCAobGVuZ3RoIC0gMSkpKSkKLQl2YWx1ZSB8PSB+bWFzazsKLSAgICB9Ci0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gZXhfaW5mby0+aW5zbl9ieXRlcyArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChmaWxsX2NhY2hlIChjZCwgZXhfaW5mbywgd29yZF9vZmZzZXQgLyA4LCB3b3JkX2xlbmd0aCAvIDgsIHBjKSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgICB2YWx1ZSA9IGV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYyk7Ci0gICAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAqdmFsdWVwID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBleHRyYWN0b3IuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMsIHRyYW5zbGF0ZWQgdG8gaG9zdCBvcmRlci4KLSAgIFRoZSBleHRyYWN0ZWQgZmllbGRzIGFyZSBzdG9yZWQgaW4gRklFTERTLgotICAgRVhfSU5GTyBpcyB1c2VkIHRvIGhhbmRsZSByZWFkaW5nIHZhcmlhYmxlIGxlbmd0aCBpbnNucy4KLSAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMsIG9yIDAgaWYgbm8gbWF0Y2gsCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gIENHRU5fSU5JVF9FWFRSQUNUIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBsZW5ndGggPSAoKiBjZC0+ZXh0cmFjdF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7Ci0gICAgICBpZiAobGVuZ3RoIDw9IDApCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgLyogV2UgcmVjb2duaXplZCBhbmQgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCB0aGlzIGluc24uICAqLwotICByZXR1cm4gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotfQotDAotLyogbWFjaGluZSBnZW5lcmF0ZWQgY29kZSBhZGRlZCBoZXJlICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgaW5zZXJ0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuICBJdCdzIGFsc28gbmVlZGVkIGJ5IEdBUyB0byBpbnNlcnQgb3BlcmFuZHMgdGhhdCBjb3VsZG4ndCBiZQotICAgcmVzb2x2ZWQgZHVyaW5nIHBhcnNpbmcuCi0qLwotCi1jb25zdCBjaGFyICoKLW0zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfYWNjLCAwLCAwLCA4LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2FjY2QsIDAsIDAsIDQsIDIsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfYWNjcywgMCwgMCwgMTIsIDIsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAocGMpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSAmICgtNCkpKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9oaTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9pbW0xOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIC0gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCAxNSwgMSwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMiwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0yNCwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW00LCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBleHRyYWN0aW9uLgotICAgVGhlIHJlc3VsdCBpcyA8PSAwIGZvciBlcnJvciwgPjAgZm9yIHN1Y2Nlc3MuCi0gICA/Pz8gQWN0dWFsIHZhbHVlcyBhcmVuJ3Qgd2VsbCBkZWZpbmVkIHJpZ2h0IG5vdy4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotaW50Ci1tMzJyX2NnZW5fZXh0cmFjdF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBBc3N1bWUgc3VjY2VzcyAoZm9yIHRob3NlIG9wZXJhbmRzIHRoYXQgYXJlIG5vcHMpLiAgKi8KLSAgaW50IGxlbmd0aCA9IDE7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgMSwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2FjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2FjY2QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCAyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfYWNjcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArICgoKHBjKSAmICgtNCkpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaGkxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNSwgMSwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpICsgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2ltbTEgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfQUJTX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW0yNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMSwgNSwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW01KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZGVjb2RpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi1jZ2VuX2luc2VydF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9pbnNlcnRfaGFuZGxlcnNbXSA9IAotewotICBpbnNlcnRfaW5zbl9ub3JtYWwsCi19OwotCi1jZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCBtMzJyX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1tdID0gCi17Ci0gIGV4dHJhY3RfaW5zbl9ub3JtYWwsCi19OwotCi0vKiBHZXR0aW5nIHZhbHVlcyBmcm9tIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgcmV0dXJuLgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSByZXN1bHQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotaW50Ci1tMzJyX2NnZW5fZ2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGludCB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjY2Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjY3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaW1tMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWJmZF92bWEKLW0zMnJfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjY2Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjY3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaW1tMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBmaWVsZHMtPmZfYWNjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NzID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZmllbGRzLT5mX2hpMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgZmllbGRzLT5mX2ltbTEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZmllbGRzLT5mX3VpbW01ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotdm9pZAotbTMycl9jZ2VuX3NldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgZmllbGRzLT5mX2FjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBmaWVsZHMtPmZfYWNjZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBmaWVsZHMtPmZfYWNjcyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIGZpZWxkcy0+Zl9pbW0xID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOwotICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07Ci0KLSAgY2QtPmluc2VydF9vcGVyYW5kID0gbTMycl9jZ2VuX2luc2VydF9vcGVyYW5kOwotICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKLQotICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKLSAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBtMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOwotICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX3NldF92bWFfb3BlcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuYyBiL29wY29kZXMvbTMyci1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlZmVjYy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg1ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZSBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLQotLyogVGhlIGhhc2ggZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBoZXJlIHRvIGhlbHAga2VlcCBhc3NlbWJsZXIgY29kZSBvdXQgb2YKLSAgIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHZpY2UgdmVyc2EuICAqLwotCi1zdGF0aWMgaW50IGFzbV9oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBhc21faGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkaXNfaGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgRihmKSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKE0zMlJfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW1wdHkgPSB7Ci0gIDAsIDAsIDB4MCwgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZDMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FuZDMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X29yMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkaSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZHYzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzggPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzI0ID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iZXEgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0RJU1AxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JlcXogPSB7Ci0gIDMyLCAzMiwgMHhmZmYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0RJU1AxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcCA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21waSA9IHsKLSAgMzIsIDMyLCAweGZmZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21weiA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2ID0gewotICAzMiwgMzIsIDB4ZjBmMGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9qYyA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGQyNCA9IHsKLSAgMzIsIDMyLCAweGYwMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfVUlNTTI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMTYgPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X21hY2hpX2EgPSB7Ci0gIDE2LCAxNiwgMHhmMDcwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfQUNDKSwgRiAoRl9PUDIzKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212ZmFjaGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212ZmFjaGlfYSA9IHsKLSAgMTYsIDE2LCAweGYwZjMsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX09QMyksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212ZmMgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212dGFjaGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212dGFjaGlfYSA9IHsKLSAgMTYsIDE2LCAweGYwZjMsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX09QMyksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X212dGMgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X25vcCA9IHsKLSAgMTYsIDE2LCAweGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjX2RzaSA9IHsKLSAgMTYsIDE2LCAweGYzZjIsIHsgRiAoRl9PUDEpLCBGIChGX0FDQ0QpLCBGIChGX0JJVFM2NyksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9CSVQxNCksIEYgKEZfSU1NMSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NldGggPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0hJMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zbGxpID0gewotICAxNiwgMTYsIDB4ZjBlMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NISUZUX09QMiksIEYgKEZfVUlNTTUpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF9kID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF90cmFwID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfVUlNTTQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zYXRiID0gewotICAzMiwgMzIsIDB4ZjBmMGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9pbnNuX29wY29kZV90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IHsgMCB9IH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTAgfQotICB9LAotLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweDgwYTAwMDAwIH0KLSAgfSwKLS8qIGFuZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhjMCB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChVSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYW5kMywgeyAweDgwYzAwMDAwIH0KLSAgfSwKLS8qIG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGUwIH0KLSAgfSwKLS8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoVUxPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfb3IzLCB7IDB4ODBlMDAwMDAgfQotICB9LAotLyogeG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGQwIH0KLSAgfSwKLS8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBkMDAwMDAgfQotICB9LAotLyogYWRkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgwIH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg4MDgwMDAwMCB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkwIH0KLSAgfSwKLS8qIGJjLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2MwMCB9Ci0gIH0sCi0vKiBiYy5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZjMDAwMDAwIH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxLCB7IDB4YjAwMDAwMDAgfQotICB9LAotLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA4MDAwMDAgfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBiMDAwMDAgfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBkMDAwMDAgfQotICB9LAotLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBjMDAwMDAgfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBhMDAwMDAgfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA5MDAwMDAgfQotICB9LAotLyogYmwucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZTAwIH0KLSAgfSwKLS8qIGJsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYmNsLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4NzgwMCB9Ci0gIH0sCi0vKiBiY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmODAwMDAwMCB9Ci0gIH0sCi0vKiBibmMucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZDAwIH0KLSAgfSwKLS8qIGJuYy5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZkMDAwMDAwIH0KLSAgfSwKLS8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxLCB7IDB4YjAxMDAwMDAgfQotICB9LAotLyogYnJhLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2YwMCB9Ci0gIH0sCi0vKiBicmEubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZjAwMDAwMCB9Ci0gIH0sCi0vKiBibmNsLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4NzkwMCB9Ci0gIH0sCi0vKiBibmNsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZjkwMDAwMDAgfQotICB9LAotLyogY21wICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NDAgfQotICB9LAotLyogY21waSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9jbXBpLCB7IDB4ODA0MDAwMDAgfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwIH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDUwMDAwMCB9Ci0gIH0sCi0vKiBjbXBlcSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDYwIH0KLSAgfSwKLS8qIGNtcHogJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcHosIHsgMHg3MCB9Ci0gIH0sCi0vKiBkaXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAwMDAwMDAgfQotICB9LAotLyogZGl2dSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDEwMDAwMCB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAyMDAwMDAgfQotICB9LAotLyogcmVtdSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDMwMDAwMCB9Ci0gIH0sCi0vKiBkaXZoICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMDAwMDEwIH0KLSAgfSwKLS8qIGpjICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2pjLCB7IDB4MWNjMCB9Ci0gIH0sCi0vKiBqbmMgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxZGMwIH0KLSAgfSwKLS8qIGpsICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2pjLCB7IDB4MWVjMCB9Ci0gIH0sCi0vKiBqbXAgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxZmMwIH0KLSAgfSwKLS8qIGxkICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYzAgfQotICB9LAotLyogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYzAwMDAwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDgwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYTAgfQotICB9LAotLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGEwMDAwMCB9Ci0gIH0sCi0vKiBsZHViICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwOTAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTA5MDAwMDAgfQotICB9LAotLyogbGR1aCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGIwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYjAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwZTAgfQotICB9LAotLyogbGQyNCAkZHIsJHVpbW0yNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkMjQsIHsgMHhlMDAwMDAwMCB9Ci0gIH0sCi0vKiBsZGk4ICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9sZGkxNiwgeyAweDkwZjAwMDAwIH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBkMCB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNDAgfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDQwIH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA1MCB9Ci0gIH0sCi0vKiBtYWNsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNTAgfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA2MCB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDYwIH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNzAgfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzA3MCB9Ci0gIH0sCi0vKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA2MCB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMDAgfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAxMCB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMTAgfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAyMCB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDIwIH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMzAgfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzAzMCB9Ci0gIH0sCi0vKiBtdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDgwIH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjAgfQotICB9LAotLyogbXZmYWNoaSAkZHIsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaV9hLCB7IDB4NTBmMCB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYxIH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGlfYSwgeyAweDUwZjEgfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMiB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpX2EsIHsgMHg1MGYyIH0KLSAgfSwKLS8qIG12ZmMgJGRyLCRzY3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNDUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZjLCB7IDB4MTA5MCB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpLCB7IDB4NTA3MCB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaV9hLCB7IDB4NTA3MCB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpLCB7IDB4NTA3MSB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaV9hLCB7IDB4NTA3MSB9Ci0gIH0sCi0vKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAnLCcsIE9QIChEQ1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YywgeyAweDEwYTAgfQotICB9LAotLyogbmVnICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDMwIH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3MDAwIH0KLSAgfSwKLS8qIG5vdCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiMCB9Ci0gIH0sCi0vKiByYWMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWMgJGFjY2QsJGFjY3MsJGltbTEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgJywnLCBPUCAoQUNDUyksICcsJywgT1AgKElNTTEpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjX2RzaSwgeyAweDUwOTAgfQotICB9LAotLyogcmFjaCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QsJGFjY3MsJGltbTEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgJywnLCBPUCAoQUNDUyksICcsJywgT1AgKElNTTEpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjX2RzaSwgeyAweDUwODAgfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDEwZDYgfQotICB9LAotLyogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChISTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X3NldGgsIHsgMHhkMGMwMDAwMCB9Ci0gIH0sCi0vKiBzbGwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA0MCB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MGMwMDAwMCB9Ci0gIH0sCi0vKiBzbGxpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDQwIH0KLSAgfSwKLS8qIHNyYSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDIwIH0KLSAgfSwKLS8qIHNyYTMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwYTAwMDAwIH0KLSAgfSwKLS8qIHNyYWkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwMjAgfQotICB9LAotLyogc3JsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMDAgfQotICB9LAotLyogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTA4MDAwMDAgfQotICB9LAotLyogc3JsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTAwMCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNDAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTA0MDAwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTAwMDAwMDAgfQotICB9LAotLyogc3RoICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjAyMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kLCB7IDB4YTAyMDAwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCskc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJysnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDYwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAtJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICctJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA3MCB9Ci0gIH0sCi0vKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjAgfQotICB9LAotLyogc3VidiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgwIH0KLSAgfSwKLS8qIHN1YnggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAgfQotICB9LAotLyogdHJhcCAkdWltbTQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVSU1NNCksIDAgfSB9LAotICAgICYgaWZtdF90cmFwLCB7IDB4MTBmMCB9Ci0gIH0sCi0vKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDUwIH0KLSAgfSwKLS8qIHNhdGIgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2F0YiwgeyAweDgwNjAwMzAwIH0KLSAgfSwKLS8qIHNhdGggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2F0YiwgeyAweDgwNjAwMjAwIH0KLSAgfSwKLS8qIHNhdCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9zYXRiLCB7IDB4ODA2MDAwMDAgfQotICB9LAotLyogcGNtcGJ6ICRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXB6LCB7IDB4MzcwIH0KLSAgfSwKLS8qIHNhZGQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NTBlNCB9Ci0gIH0sCi0vKiBtYWN3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MGIwIH0KLSAgfSwKLS8qIG1zYmxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTBkMCB9Ci0gIH0sCi0vKiBtdWx3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MGEwIH0KLSAgfSwKLS8qIG1hY2xoMSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwYzAgfQotICB9LAotLyogc2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NzQwMSB9Ci0gIH0sCi0vKiBzbmMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NzUwMSB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotLyogRm9ybWF0cyBmb3IgQUxJQVMgbWFjcm8taW5zbnMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmw4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iY2w4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjbDI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmMyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYThyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmNsOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmNsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkYl9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1Yl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHVoXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3BvcCA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOGEgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0lNTTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkxNmEgPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfUjEpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3JhY19kID0gewotICAxNiwgMTYsIDB4ZjNmZiwgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjX2RzID0gewotICAxNiwgMTYsIDB4ZjNmMywgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjaF9kID0gewotICAxNiwgMTYsIDB4ZjNmZiwgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjaF9kcyA9IHsKLSAgMTYsIDE2LCAweGYzZjMsIHsgRiAoRl9PUDEpLCBGIChGX0FDQ0QpLCBGIChGX0JJVFM2NyksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9CSVQxNCksIEYgKEZfSU1NMSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0XzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0X2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RiX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9wdXNoID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLS8qIEVhY2ggbm9uLXNpbXBsZSBtYWNybyBlbnRyeSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlW10gPQotewotLyogYmMgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJjOHIiLCAiYmMiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBiYyAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJjMjRyIiwgImJjIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibCAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmw4ciIsICJibCIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJsICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmwyNHIiLCAiYmwiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmNsICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJiY2w4ciIsICJiY2wiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjbCAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJjbDI0ciIsICJiY2wiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmMgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJuYzhyIiwgImJuYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJuYyAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJuYzI0ciIsICJibmMiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYnJhOHIiLCAiYnJhIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYnJhICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYnJhMjRyIiwgImJyYSIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmNsICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibmNsOHIiLCAiYm5jbCIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogYm5jbCAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJuY2wyNHIiLCAiYm5jbCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGQtMiIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkLWQyIiwgImxkIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGRiLTIiLCAibGRiIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkYi1kMiIsICJsZGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGgtMiIsICJsZGgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGRoLWQyIiwgImxkaCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZHViLTIiLCAibGR1YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGR1Yi1kMiIsICJsZHViIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkdWgtMiIsICJsZHVoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZHVoLWQyIiwgImxkdWgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICAtMSwgInBvcCIsICJwb3AiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICAtMSwgImxkaThhIiwgImxkaSIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIC0xLCAibGRpMTZhIiwgImxkaSIsIDMyLAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcmFjICRhY2NkICovCi0gIHsKLSAgICAtMSwgInJhYy1kIiwgInJhYyIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcyAqLwotICB7Ci0gICAgLTEsICJyYWMtZHMiLCAicmFjIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjaCAkYWNjZCAqLwotICB7Ci0gICAgLTEsICJyYWNoLWQiLCAicmFjaCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QsJGFjY3MgKi8KLSAgewotICAgIC0xLCAicmFjaC1kcyIsICJyYWNoIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3QtMiIsICJzdCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJzdC1kMiIsICJzdCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdGItMiIsICJzdGIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0Yi1kMiIsICJzdGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3RoLTIiLCAic3RoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJzdGgtZDIiLCAic3RoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcHVzaCAkc3JjMSAqLwotICB7Ci0gICAgLTEsICJwdXNoIiwgInB1c2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLX07Ci0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgbTMycl9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlW10gPQotewotLyogYmMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4ciwgeyAweDdjMDAgfQotICB9LAotLyogYmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0ciwgeyAweGZjMDAwMDAwIH0KLSAgfSwKLS8qIGJsICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JsOHIsIHsgMHg3ZTAwIH0KLSAgfSwKLS8qIGJsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmwyNHIsIHsgMHhmZTAwMDAwMCB9Ci0gIH0sCi0vKiBiY2wgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmNsOHIsIHsgMHg3ODAwIH0KLSAgfSwKLS8qIGJjbCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjbDI0ciwgeyAweGY4MDAwMDAwIH0KLSAgfSwKLS8qIGJuYyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9ibmM4ciwgeyAweDdkMDAgfQotICB9LAotLyogYm5jICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jMjRyLCB7IDB4ZmQwMDAwMDAgfQotICB9LAotLyogYnJhICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYThyLCB7IDB4N2YwMCB9Ci0gIH0sCi0vKiBicmEgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9icmEyNHIsIHsgMHhmZjAwMDAwMCB9Ci0gIH0sCi0vKiBibmNsICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuY2w4ciwgeyAweDc5MDAgfQotICB9LAotLyogYm5jbCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuY2wyNHIsIHsgMHhmOTAwMDAwMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZF8yLCB7IDB4MjBjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZF9kMiwgeyAweGEwYzAwMDAwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGJfMiwgeyAweDIwODAgfQotICB9LAotLyogbGRiICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkYl9kMiwgeyAweGEwODAwMDAwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGhfMiwgeyAweDIwYTAgfQotICB9LAotLyogbGRoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkaF9kMiwgeyAweGEwYTAwMDAwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1Yl8yLCB7IDB4MjA5MCB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWJfZDIsIHsgMHhhMDkwMDAwMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWhfMiwgeyAweDIwYjAgfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHVoX2QyLCB7IDB4YTBiMDAwMDAgfQotICB9LAotLyogcG9wICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X3BvcCwgeyAweDIwZWYgfQotICB9LAotLyogbGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaThhLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTE2YSwgeyAweDkwZjAwMDAwIH0KLSAgfSwKLS8qIHJhYyAkYWNjZCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjX2QsIHsgMHg1MDkwIH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY19kcywgeyAweDUwOTAgfQotICB9LAotLyogcmFjaCAkYWNjZCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjaF9kLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiByYWNoICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjaF9kcywgeyAweDUwODAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF8yLCB7IDB4MjA0MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QyLCB7IDB4YTA0MDAwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiXzIsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0Yl9kMiwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF8yLCB7IDB4MjAyMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGhfZDIsIHsgMHhhMDIwMDAwMCB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9wdXNoLCB7IDB4MjA3ZiB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuaCBiL29wY29kZXMvbTMyci1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4YzVmOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBNMzJSX09QQ19ICi0jZGVmaW5lIE0zMlJfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jdW5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBYKGIpICgoKHVuc2lnbmVkIGNoYXIgKikgKGIpKVswXSAmIDB4ZjApCi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgXAotKFggKGJ1ZmZlcikgfCBcCi0gKFggKGJ1ZmZlcikgPT0gMHg0MCB8fCBYIChidWZmZXIpID09IDB4ZTAgfHwgWCAoYnVmZmVyKSA9PSAweDYwIHx8IFggKGJ1ZmZlcikgPT0gMHg1MCA/IDAgXAotICA6IFggKGJ1ZmZlcikgPT0gMHg3MCB8fCBYIChidWZmZXIpID09IDB4ZjAgPyAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSAmIDB4ZikgXAotICA6IFggKGJ1ZmZlcikgPT0gMHgzMCA/ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4NzApID4+IDQpIFwKLSAgOiAoKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMV0gJiAweGYwKSA+PiA0KSkpCi0KLS8qIC0tICovCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGluc3RydWN0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fdHlwZSB7Ci0gIE0zMlJfSU5TTl9JTlZBTElELCBNMzJSX0lOU05fQURELCBNMzJSX0lOU05fQUREMywgTTMyUl9JTlNOX0FORAotICwgTTMyUl9JTlNOX0FORDMsIE0zMlJfSU5TTl9PUiwgTTMyUl9JTlNOX09SMywgTTMyUl9JTlNOX1hPUgotICwgTTMyUl9JTlNOX1hPUjMsIE0zMlJfSU5TTl9BRERJLCBNMzJSX0lOU05fQUREViwgTTMyUl9JTlNOX0FERFYzCi0gLCBNMzJSX0lOU05fQUREWCwgTTMyUl9JTlNOX0JDOCwgTTMyUl9JTlNOX0JDMjQsIE0zMlJfSU5TTl9CRVEKLSAsIE0zMlJfSU5TTl9CRVFaLCBNMzJSX0lOU05fQkdFWiwgTTMyUl9JTlNOX0JHVFosIE0zMlJfSU5TTl9CTEVaCi0gLCBNMzJSX0lOU05fQkxUWiwgTTMyUl9JTlNOX0JORVosIE0zMlJfSU5TTl9CTDgsIE0zMlJfSU5TTl9CTDI0Ci0gLCBNMzJSX0lOU05fQkNMOCwgTTMyUl9JTlNOX0JDTDI0LCBNMzJSX0lOU05fQk5DOCwgTTMyUl9JTlNOX0JOQzI0Ci0gLCBNMzJSX0lOU05fQk5FLCBNMzJSX0lOU05fQlJBOCwgTTMyUl9JTlNOX0JSQTI0LCBNMzJSX0lOU05fQk5DTDgKLSAsIE0zMlJfSU5TTl9CTkNMMjQsIE0zMlJfSU5TTl9DTVAsIE0zMlJfSU5TTl9DTVBJLCBNMzJSX0lOU05fQ01QVQotICwgTTMyUl9JTlNOX0NNUFVJLCBNMzJSX0lOU05fQ01QRVEsIE0zMlJfSU5TTl9DTVBaLCBNMzJSX0lOU05fRElWCi0gLCBNMzJSX0lOU05fRElWVSwgTTMyUl9JTlNOX1JFTSwgTTMyUl9JTlNOX1JFTVUsIE0zMlJfSU5TTl9ESVZICi0gLCBNMzJSX0lOU05fSkMsIE0zMlJfSU5TTl9KTkMsIE0zMlJfSU5TTl9KTCwgTTMyUl9JTlNOX0pNUAotICwgTTMyUl9JTlNOX0xELCBNMzJSX0lOU05fTERfRCwgTTMyUl9JTlNOX0xEQiwgTTMyUl9JTlNOX0xEQl9ECi0gLCBNMzJSX0lOU05fTERILCBNMzJSX0lOU05fTERIX0QsIE0zMlJfSU5TTl9MRFVCLCBNMzJSX0lOU05fTERVQl9ECi0gLCBNMzJSX0lOU05fTERVSCwgTTMyUl9JTlNOX0xEVUhfRCwgTTMyUl9JTlNOX0xEX1BMVVMsIE0zMlJfSU5TTl9MRDI0Ci0gLCBNMzJSX0lOU05fTERJOCwgTTMyUl9JTlNOX0xESTE2LCBNMzJSX0lOU05fTE9DSywgTTMyUl9JTlNOX01BQ0hJCi0gLCBNMzJSX0lOU05fTUFDSElfQSwgTTMyUl9JTlNOX01BQ0xPLCBNMzJSX0lOU05fTUFDTE9fQSwgTTMyUl9JTlNOX01BQ1dISQotICwgTTMyUl9JTlNOX01BQ1dISV9BLCBNMzJSX0lOU05fTUFDV0xPLCBNMzJSX0lOU05fTUFDV0xPX0EsIE0zMlJfSU5TTl9NVUwKLSAsIE0zMlJfSU5TTl9NVUxISSwgTTMyUl9JTlNOX01VTEhJX0EsIE0zMlJfSU5TTl9NVUxMTywgTTMyUl9JTlNOX01VTExPX0EKLSAsIE0zMlJfSU5TTl9NVUxXSEksIE0zMlJfSU5TTl9NVUxXSElfQSwgTTMyUl9JTlNOX01VTFdMTywgTTMyUl9JTlNOX01VTFdMT19BCi0gLCBNMzJSX0lOU05fTVYsIE0zMlJfSU5TTl9NVkZBQ0hJLCBNMzJSX0lOU05fTVZGQUNISV9BLCBNMzJSX0lOU05fTVZGQUNMTwotICwgTTMyUl9JTlNOX01WRkFDTE9fQSwgTTMyUl9JTlNOX01WRkFDTUksIE0zMlJfSU5TTl9NVkZBQ01JX0EsIE0zMlJfSU5TTl9NVkZDCi0gLCBNMzJSX0lOU05fTVZUQUNISSwgTTMyUl9JTlNOX01WVEFDSElfQSwgTTMyUl9JTlNOX01WVEFDTE8sIE0zMlJfSU5TTl9NVlRBQ0xPX0EKLSAsIE0zMlJfSU5TTl9NVlRDLCBNMzJSX0lOU05fTkVHLCBNMzJSX0lOU05fTk9QLCBNMzJSX0lOU05fTk9UCi0gLCBNMzJSX0lOU05fUkFDLCBNMzJSX0lOU05fUkFDX0RTSSwgTTMyUl9JTlNOX1JBQ0gsIE0zMlJfSU5TTl9SQUNIX0RTSQotICwgTTMyUl9JTlNOX1JURSwgTTMyUl9JTlNOX1NFVEgsIE0zMlJfSU5TTl9TTEwsIE0zMlJfSU5TTl9TTEwzCi0gLCBNMzJSX0lOU05fU0xMSSwgTTMyUl9JTlNOX1NSQSwgTTMyUl9JTlNOX1NSQTMsIE0zMlJfSU5TTl9TUkFJCi0gLCBNMzJSX0lOU05fU1JMLCBNMzJSX0lOU05fU1JMMywgTTMyUl9JTlNOX1NSTEksIE0zMlJfSU5TTl9TVAotICwgTTMyUl9JTlNOX1NUX0QsIE0zMlJfSU5TTl9TVEIsIE0zMlJfSU5TTl9TVEJfRCwgTTMyUl9JTlNOX1NUSAotICwgTTMyUl9JTlNOX1NUSF9ELCBNMzJSX0lOU05fU1RfUExVUywgTTMyUl9JTlNOX1NUX01JTlVTLCBNMzJSX0lOU05fU1VCCi0gLCBNMzJSX0lOU05fU1VCViwgTTMyUl9JTlNOX1NVQlgsIE0zMlJfSU5TTl9UUkFQLCBNMzJSX0lOU05fVU5MT0NLCi0gLCBNMzJSX0lOU05fU0FUQiwgTTMyUl9JTlNOX1NBVEgsIE0zMlJfSU5TTl9TQVQsIE0zMlJfSU5TTl9QQ01QQloKLSAsIE0zMlJfSU5TTl9TQURELCBNMzJSX0lOU05fTUFDV1UxLCBNMzJSX0lOU05fTVNCTE8sIE0zMlJfSU5TTl9NVUxXVTEKLSAsIE0zMlJfSU5TTl9NQUNMSDEsIE0zMlJfSU5TTl9TQywgTTMyUl9JTlNOX1NOQywgTTMyUl9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgTTMyUl9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBNMzJSX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9hbnlvZjsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX2NvbmQ7Ci0gIGxvbmcgZl9yMTsKLSAgbG9uZyBmX3IyOwotICBsb25nIGZfc2ltbTg7Ci0gIGxvbmcgZl9zaW1tMTY7Ci0gIGxvbmcgZl9zaGlmdF9vcDI7Ci0gIGxvbmcgZl91aW1tNDsKLSAgbG9uZyBmX3VpbW01OwotICBsb25nIGZfdWltbTE2OwotICBsb25nIGZfdWltbTI0OwotICBsb25nIGZfaGkxNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDE2OwotICBsb25nIGZfZGlzcDI0OwotICBsb25nIGZfb3AyMzsKLSAgbG9uZyBmX29wMzsKLSAgbG9uZyBmX2FjYzsKLSAgbG9uZyBmX2FjY3M7Ci0gIGxvbmcgZl9hY2NkOwotICBsb25nIGZfYml0czY3OwotICBsb25nIGZfYml0MTQ7Ci0gIGxvbmcgZl9pbW0xOwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIE0zMlJfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGluc3QuYyBiL29wY29kZXMvbTMyci1vcGluc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NjUxZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BpbnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzMgKzAsMCBAQAotLyogU2VtYW50aWMgb3BlcmFuZCBpbnN0YW5jZXMgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIE9wZXJhbmQgcmVmZXJlbmNlcy4gICovCi0KLSNkZWZpbmUgSU5QVVQgQ0dFTl9PUElOU1RfSU5QVVQKLSNkZWZpbmUgT1VUUFVUIENHRU5fT1BJTlNUX09VVFBVVAotI2RlZmluZSBFTkQgQ0dFTl9PUElOU1RfRU5ECi0jZGVmaW5lIENPTkRfUkVGIENHRU5fT1BJTlNUX0NPTkRfUkVGCi0jZGVmaW5lIE9QX0VOVChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfZW1wdHlfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZDNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYW5kM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTE2IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X29yM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVTE8xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZHZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGR2M19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkeF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmM4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmMyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmVxX29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmVxel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JsOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JsMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JjbDhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iY2wyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYnJhOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYnJhMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfY21wX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXBpX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfY21wel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfZGl2X29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9qY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfamxfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2ptcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZF9kX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGQyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInVpbW0yNCIsIEhXX0hfQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChVSU1NMjQpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkaThfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tOCIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRpMTZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWNoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbWFjaGlfYV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWxoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWxoaV9hX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjYyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZmYWNoaV9hX29wc1tdID0gewotICB7IElOUFVULCAiYWNjcyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDUyksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZmY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNjciIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU0NSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdnRhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdnRhY2hpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERDUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbm9wX29wc1tdID0gewotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9yYWNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3JhY19kc2lfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IElOUFVULCAiaW1tMSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChJTU0xKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY2QiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ0QpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3J0ZV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAotICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NldGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoaTE2IiwgSFdfSF9ISTE2LCBDR0VOX01PREVfU0ksIE9QX0VOVCAoSEkxNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2xsM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zbGxpX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tNSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChVSU1NNSksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0X2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0Yl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfUUksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RiX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RoX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19ERkxUX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3N0X3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfbmV3X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF90cmFwX29wc1tdID0gewotICB7IElOUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgSU5QVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInVpbW00IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2JicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfdW5sb2NrX29wc1tdID0gewotICB7IElOUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zYXRiX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhdF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zYWRkX29wc1tdID0gewotICB7IElOUFVULCAiaF9hY2N1bXNfMCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfYWNjdW1zXzEiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCAwLCAxLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9hY2N1bXNfMCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbWFjd3UxX29wc1tdID0gewotICB7IElOUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdWx3dTFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2Nfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotI3VuZGVmIElOUFVUCi0jdW5kZWYgT1VUUFVUCi0jdW5kZWYgRU5ECi0jdW5kZWYgQ09ORF9SRUYKLSN1bmRlZiBPUF9FTlQKLQotLyogT3BlcmFuZCBpbnN0YW5jZSBsb29rdXAgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgKm0zMnJfY2dlbl9vcGluc3RfdGFibGVbTUFYX0lOU05TXSA9IHsKLSAgMCwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hZGQzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hbmQzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9vcjNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FuZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkaV9vcHNbMF0sCi0gICYgc2ZtdF9hZGR2X29wc1swXSwKLSAgJiBzZm10X2FkZHYzX29wc1swXSwKLSAgJiBzZm10X2FkZHhfb3BzWzBdLAotICAmIHNmbXRfYmM4X29wc1swXSwKLSAgJiBzZm10X2JjMjRfb3BzWzBdLAotICAmIHNmbXRfYmVxX29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JsOF9vcHNbMF0sCi0gICYgc2ZtdF9ibDI0X29wc1swXSwKLSAgJiBzZm10X2JjbDhfb3BzWzBdLAotICAmIHNmbXRfYmNsMjRfb3BzWzBdLAotICAmIHNmbXRfYmM4X29wc1swXSwKLSAgJiBzZm10X2JjMjRfb3BzWzBdLAotICAmIHNmbXRfYmVxX29wc1swXSwKLSAgJiBzZm10X2JyYThfb3BzWzBdLAotICAmIHNmbXRfYnJhMjRfb3BzWzBdLAotICAmIHNmbXRfYmNsOF9vcHNbMF0sCi0gICYgc2ZtdF9iY2wyNF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21waV9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21waV9vcHNbMF0sCi0gICYgc2ZtdF9jbXBfb3BzWzBdLAotICAmIHNmbXRfY21wel9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2pjX29wc1swXSwKLSAgJiBzZm10X2pjX29wc1swXSwKLSAgJiBzZm10X2psX29wc1swXSwKLSAgJiBzZm10X2ptcF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9sZDI0X29wc1swXSwKLSAgJiBzZm10X2xkaThfb3BzWzBdLAotICAmIHNmbXRfbGRpMTZfb3BzWzBdLAotICAmIHNmbXRfbG9ja19vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X212X29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmFjaGlfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X212ZmNfb3BzWzBdLAotICAmIHNmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZ0Y19vcHNbMF0sCi0gICYgc2ZtdF9tdl9vcHNbMF0sCi0gICYgc2ZtdF9ub3Bfb3BzWzBdLAotICAmIHNmbXRfbXZfb3BzWzBdLAotICAmIHNmbXRfcmFjX29wc1swXSwKLSAgJiBzZm10X3JhY19kc2lfb3BzWzBdLAotICAmIHNmbXRfcmFjX29wc1swXSwKLSAgJiBzZm10X3JhY19kc2lfb3BzWzBdLAotICAmIHNmbXRfcnRlX29wc1swXSwKLSAgJiBzZm10X3NldGhfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X3NsbDNfb3BzWzBdLAotICAmIHNmbXRfc2xsaV9vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfc2xsM19vcHNbMF0sCi0gICYgc2ZtdF9zbGxpX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9zbGwzX29wc1swXSwKLSAgJiBzZm10X3NsbGlfb3BzWzBdLAotICAmIHNmbXRfc3Rfb3BzWzBdLAotICAmIHNmbXRfc3RfZF9vcHNbMF0sCi0gICYgc2ZtdF9zdGJfb3BzWzBdLAotICAmIHNmbXRfc3RiX2Rfb3BzWzBdLAotICAmIHNmbXRfc3RoX29wc1swXSwKLSAgJiBzZm10X3N0aF9kX29wc1swXSwKLSAgJiBzZm10X3N0X3BsdXNfb3BzWzBdLAotICAmIHNmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfYWRkdl9vcHNbMF0sCi0gICYgc2ZtdF9hZGR4X29wc1swXSwKLSAgJiBzZm10X3RyYXBfb3BzWzBdLAotICAmIHNmbXRfdW5sb2NrX29wc1swXSwKLSAgJiBzZm10X3NhdGJfb3BzWzBdLAotICAmIHNmbXRfc2F0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zYXRfb3BzWzBdLAotICAmIHNmbXRfY21wel9vcHNbMF0sCi0gICYgc2ZtdF9zYWRkX29wc1swXSwKLSAgJiBzZm10X21hY3d1MV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWx3dTFfb3BzWzBdLAotICAmIHNmbXRfbWFjd3UxX29wc1swXSwKLSAgJiBzZm10X3NjX29wc1swXSwKLSAgJiBzZm10X3NjX29wc1swXSwKLX07Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfb3BpbnN0X3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICoqb2kgPSAmIG0zMnJfY2dlbl9vcGluc3RfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLm9waW5zdCA9IG9pW2ldOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tNjhrLWRpcy5jIGIvb3Bjb2Rlcy9tNjhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRiMTEwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTAgKzAsMCBAQAotLyogUHJpbnQgTW90b3JvbGEgNjhrIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCi0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvbTY4ay5oIgotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX2J5dGUgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtbXlfcHJpbnRfYWRkcmVzcyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWZldGNoX2FyZyBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCwgaW50LCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2Jhc2UgUEFSQU1TICgoaW50LCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcmludF9pbmRleGVkIFBBUkFNUyAoKGludCwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKLQkJCWJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1DT05TVCBjaGFyICogQ09OU1QgZnBjcl9uYW1lc1tdID0gewotICAiIiwgIiVmcGlhciIsICIlZnBzciIsICIlZnBpYXIvJWZwc3IiLCAiJWZwY3IiLAotICAiJWZwaWFyLyVmcGNyIiwgIiVmcHNyLyVmcGNyIiwgIiVmcGlhci8lZnBzci8lZnBjciJ9OwotCi1zdGF0aWMgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSB7Ci0gICIlZDAiLCAiJWQxIiwgIiVkMiIsICIlZDMiLCAiJWQ0IiwgIiVkNSIsICIlZDYiLCAiJWQ3IiwKLSAgIiVhMCIsICIlYTEiLCAiJWEyIiwgIiVhMyIsICIlYTQiLCAiJWE1IiwgIiVmcCIsICIlc3AiLAotICAiJXBzIiwgIiVwYyJ9OwotCi0vKiBTaWduLWV4dGVuZCBhbiAodW5zaWduZWQgY2hhcikuICovCi0jaWYgX19TVERDX18gPT0gMQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoc2lnbmVkIGNoYXIpKGNoKSkKLSNlbHNlCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChpbnQpKCgoY2gpIF4gMHg4MCkgJiAweEZGKSAtIDEyOCkKLSNlbmRpZgotCi0vKiBHZXQgYSAxIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUQllURShwKSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIENPRVJDRV9TSUdORURfQ0hBUihwWy0xXSkpCi0KLS8qIEdldCBhIDIgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTE2KHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMCkgLSAweDgwMDApKQotI2RlZmluZSBORVhUV09SRChwKSAgXAotICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgQ09FUkNFMTYgKChwWy0yXSA8PCA4KSArIHBbLTFdKSkKLQotLyogR2V0IGEgNCBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMzIoeCkgKChiZmRfc2lnbmVkX3ZtYSkgKCh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkKLSNkZWZpbmUgTkVYVExPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIChDT0VSQ0UzMiAoKCgoKChwWy00XSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTFdKSkpCi0KLS8qIEdldCBhIDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgTkVYVFVMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAodW5zaWduZWQgaW50KSAoKCgoKChwWy00XSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTFdKSkKLQotLyogR2V0IGEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRTSU5HTEUodmFsLCBwKSBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcsIChjaGFyICopIHAgLSA0LCAmdmFsKSkKLQotLyogR2V0IGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRET1VCTEUodmFsLCBwKSBcCi0gIChwICs9IDgsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsIChjaGFyICopIHAgLSA4LCAmdmFsKSkKLQotLyogR2V0IGFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRFWFRFTkQodmFsLCBwKSBcCi0gIChwICs9IDEyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgKGNoYXIgKikgcCAtIDEyLCAmdmFsKSkKLQotLyogTmVlZCBhIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBwYWNrZWQgdG8gZG91YmxlCi0gICBwcmVjaXNpb24uICAgQWN0dWFsbHksIGl0J3MgZWFzaWVyIHRvIHByaW50IGEKLSAgIHBhY2tlZCBudW1iZXIgdGhhbiBhIGRvdWJsZSBhbnl3YXksIHNvIG1heWJlCi0gICB0aGVyZSBzaG91bGQgYmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIHRoaXMuLi4gKi8KLSNkZWZpbmUgTkVYVFBBQ0tFRChwKSBcCi0gIChwICs9IDEyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgMC4wKQotCi0MCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiAyMgotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByaW50IHRvIHRoZSBiaXQtYnVja2V0LiAqLwotc3RhdGljIGludAotI2lmZGVmIF9fU1REQ19fCi1kdW1teV9wcmludGVyIChGSUxFICogZmlsZSBBVFRSSUJVVEVfVU5VU0VELAotCSAgICAgICBjb25zdCBjaGFyICogZm9ybWF0IEFUVFJJQlVURV9VTlVTRUQsIC4uLikKLSNlbHNlCi1kdW1teV9wcmludGVyIChmaWxlKSBGSUxFICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0jZW5kaWYKLSB7IHJldHVybiAwOyB9Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wcmludF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci19Ci0KLS8qIFByaW50IHRoZSBtNjhrIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX202OGsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgKnNhdmVfcDsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBiZXN0bWFzazsKLSAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICpiZXN0ID0gMDsKLSAgdW5zaWduZWQgaW50IGFyY2hfbWFzazsKLSAgc3RydWN0IHByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKLSAgZnByaW50Zl9mdHlwZSBzYXZlX3ByaW50ZXIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKCpzYXZlX3ByaW50X2FkZHJlc3MpIFBBUkFNUygoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8qKSkKLSAgICA9IGluZm8tPnByaW50X2FkZHJlc3NfZnVuYzsKLSAgaW50IG1ham9yX29wY29kZTsKLSAgc3RhdGljIGludCBudW1vcGNvZGVzWzE2XTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKm9wY29kZXNbMTZdOwotCi0gIGlmICghb3Bjb2Rlc1swXSkKLSAgICB7Ci0gICAgICAvKiBTcGVlZCB1cCB0aGUgbWF0Y2hpbmcgYnkgc29ydGluZyB0aGUgb3Bjb2RlIHRhYmxlIG9uIHRoZSB1cHBlcgotCSBmb3VyIGJpdHMgb2YgdGhlIG9wY29kZS4gICovCi0gICAgICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKipvcGNfcG9pbnRlclsxNl07Ci0KLSAgICAgIC8qIEZpcnN0IGNvdW50IGhvdyBtYW55IG9wY29kZXMgYXJlIGluIGVhY2ggb2YgdGhlIHNpeHRlZW4gYnVja2V0cy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0JbnVtb3Bjb2Rlc1sobTY4a19vcGNvZGVzW2ldLm9wY29kZSA+PiAyOCkgJiAxNV0rKzsKLQotICAgICAgLyogVGhlbiBjcmVhdGUgYSBzb3J0ZWQgdGFibGUgb2YgcG9pbnRlcnMgdGhhdCBwb2ludCBpbnRvIHRoZQotCSB1bnNvcnRlZCB0YWJsZS4gICovCi0gICAgICBvcGNfcG9pbnRlclswXSA9ICgoY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqKQotCQkJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbTY4a19vcGNvZGUgKikKLQkJCQkgKiBtNjhrX251bW9wY29kZXMpKTsKLSAgICAgIG9wY29kZXNbMF0gPSBvcGNfcG9pbnRlclswXTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotCXsKLQkgIG9wY19wb2ludGVyW2ldID0gb3BjX3BvaW50ZXJbaSAtIDFdICsgbnVtb3Bjb2Rlc1tpIC0gMV07Ci0JICBvcGNvZGVzW2ldID0gb3BjX3BvaW50ZXJbaV07Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCi0JKm9wY19wb2ludGVyWyhtNjhrX29wY29kZXNbaV0ub3Bjb2RlID4+IDI4KSAmIDE1XSsrID0gJm02OGtfb3Bjb2Rlc1tpXTsKLQotICAgIH0KLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgLyogVGVsbCBvYmpkdW1wIHRvIHVzZSB0d28gYnl0ZXMgcGVyIGNodW5rIGFuZCBzaXggYnl0ZXMgcGVyIGxpbmUgZm9yCi0gICAgIGRpc3BsYXlpbmcgcmF3IGRhdGEuICAqLwotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDY7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYXJjaF9tYXNrID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDA4OgotICAgICAgYXJjaF9tYXNrID0gbTY4MDA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAyMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDMwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODA2MDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODA2MDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhcmNoX21hc2sgfD0gbTY4ODgxIHwgbTY4ODUxOwotCi0gIGJlc3RtYXNrID0gMDsKLSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7Ci0gIG1ham9yX29wY29kZSA9IChidWZmZXJbMF0gPj4gNCkgJiAxNTsKLSAgZm9yIChpID0gMDsgaSA8IG51bW9wY29kZXNbbWFqb3Jfb3Bjb2RlXTsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqb3BjID0gb3Bjb2Rlc1ttYWpvcl9vcGNvZGVdW2ldOwotICAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUgPSBvcGMtPm9wY29kZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWF0Y2ggPSBvcGMtPm1hdGNoOwotCi0gICAgICBpZiAoKCgweGZmICYgYnVmZmVyWzBdICYgKG1hdGNoID4+IDI0KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDI0KSkpCi0JICAmJiAoKDB4ZmYgJiBidWZmZXJbMV0gJiAobWF0Y2ggPj4gMTYpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gMTYpKSkKLQkgIC8qIE9ubHkgZmV0Y2ggdGhlIG5leHQgdHdvIGJ5dGVzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgJiYgKCgoMHhmZmZmICYgbWF0Y2gpID09IDApCi0JICAgICAgfHwKLQkgICAgICAoRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNCkKLQkgICAgICAgJiYgKCgweGZmICYgYnVmZmVyWzJdICYgKG1hdGNoID4+IDgpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gOCkpKQotCSAgICAgICAmJiAoKDB4ZmYgJiBidWZmZXJbM10gJiBtYXRjaCkgPT0gKDB4ZmYgJiBvcGNvZGUpKSkKLQkgICAgICApCi0JICAmJiAob3BjLT5hcmNoICYgYXJjaF9tYXNrKSAhPSAwKQotCXsKLQkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIGRpdnVsIGFuZCBkaXZzbAotCSAgICAgdGhhdCBoYXZlIHRoZSBzYW1lIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLgotCSAgICAgVGhlIG1vcmUgZ2VuZXJhbCB2YXJpYW50cyB3aWxsIG1hdGNoIGluc3RlYWQuICAqLwotCSAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCSAgICBpZiAoZFsxXSA9PSAnRCcpCi0JICAgICAgYnJlYWs7Ci0KLQkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIG1vc3QgZmxvYXRpbmcKLQkgICAgIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aGljaCB1c2UgdGhlIHNhbWUKLQkgICAgIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLCBhcyBhYm92ZS4gKi8KLQkgIGlmICgqZCA9PSAnXDAnKQotCSAgICBmb3IgKGQgPSBvcGMtPmFyZ3M7ICpkOyBkICs9IDIpCi0JICAgICAgaWYgKGRbMV0gPT0gJ3QnKQotCQlicmVhazsKLQotCSAgLyogRG9uJ3QgbWF0Y2ggZm1vdmVsIHdpdGggbW9yZSB0aGFuIG9uZSByZWdpc3Rlcjsgd2FpdCBmb3IKLSAgICAgICAgICAgICBmbW92ZW1sLiAgKi8KLQkgIGlmICgqZCA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCQl7Ci0JCSAgaWYgKGRbMF0gPT0gJ3MnICYmIGRbMV0gPT0gJzgnKQotCQkgICAgewotCQkgICAgICBpbnQgdmFsOwotCi0JCSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBkWzFdLCAzLCBpbmZvKTsKLQkJICAgICAgaWYgKCh2YWwgJiAodmFsIC0gMSkpICE9IDApCi0JCQlicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICgqZCA9PSAnXDAnICYmIG1hdGNoID4gYmVzdG1hc2spCi0JICAgIHsKLQkgICAgICBiZXN0ID0gb3BjOwotCSAgICAgIGJlc3RtYXNrID0gbWF0Y2g7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChiZXN0ID09IDApCi0gICAgZ290byBpbnZhbGlkOwotCi0gIC8qIFBvaW50IGF0IGZpcnN0IHdvcmQgb2YgYXJndW1lbnQgZGF0YSwKLSAgICAgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0IGFyZ3VtZW50LiAgKi8KLSAgcCA9IGJ1ZmZlciArIDI7Ci0gIAotICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSBmaXhlZC1zaXplIHBvcnRpb24gb2YgdGhlIGluc3RydWN0aW9uIGlzLgotICAgICBUaGUgb25seSBwbGFjZSB0aGlzIGlzIHN0b3JlZCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIGluIHRoZSBhcmd1bWVudHMtLWxvb2sgZm9yIGFyZ3VtZW50cyB3aGljaCBzcGVjaWZ5IGZpZWxkcyBpbiB0aGUgMm5kCi0gICAgIG9yIDNyZCB3b3JkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmb3IgKGQgPSBiZXN0LT5hcmdzOyAqZDsgZCArPSAyKQotICAgIHsKLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgaXQgaXMgbmVjZXNzYXJ5IHRvIGJlIGNoZWNraW5nIGRbMF0gaGVyZTsgSSBzdXNwZWN0Ci0JIGFsbCB0aGlzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBjYXNlIHN0YXRlbWVudCBiZWxvdy4gICovCi0gICAgICBpZiAoZFswXSA9PSAnIycpCi0JewotCSAgaWYgKGRbMV0gPT0gJ2wnICYmIHAgLSBidWZmZXIgPCA2KQotCSAgICBwID0gYnVmZmVyICsgNjsKLQkgIGVsc2UgaWYgKHAgLSBidWZmZXIgPCA0ICYmIGRbMV0gIT0gJ0MnICYmIGRbMV0gIT0gJzgnICkKLQkgICAgcCA9IGJ1ZmZlciArIDQ7Ci0JfQotICAgICAgaWYgKChkWzBdID09ICdMJyB8fCBkWzBdID09ICdsJykgJiYgZFsxXSA9PSAndycgJiYgcCAtIGJ1ZmZlciA8IDQpCi0JcCA9IGJ1ZmZlciArIDQ7Ci0gICAgICBzd2l0Y2ggKGRbMV0pCi0JewotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCWNhc2UgJ2knOgotCSAgaWYgKHAgLSBidWZmZXIgPCA0KQotCSAgICBwID0gYnVmZmVyICsgNDsKLQkgIGJyZWFrOwotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCSAgaWYgKHAgLSBidWZmZXIgPCA2KQotCSAgICBwID0gYnVmZmVyICsgNjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIHBmbHVzaGEgaXMgYW4gZXhjZXB0aW9ucy4gIEl0IHRha2VzIG5vIGFyZ3VtZW50cyBidXQgaXMgdHdvIHdvcmRzCi0gICAgIGxvbmcuICBSZWNvZ25pemUgaXQgYnkgbG9va2luZyBhdCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbWFzay4gICovCi0gIGlmIChwIC0gYnVmZmVyIDwgNCAmJiAoYmVzdC0+bWF0Y2ggJiAweEZGRkYpICE9IDApCi0gICAgcCA9IGJ1ZmZlciArIDQ7Ci0KLSAgLyogbHBzdG9wIGlzIGFub3RoZXIgZXhjZXB0aW9uLiAgSXQgdGFrZXMgYSBvbmUgd29yZCBhcmd1bWVudCBidXQgaXMKLSAgICAgdGhyZWUgd29yZHMgbG9uZy4gICovCi0gIGlmIChwIC0gYnVmZmVyIDwgNgotICAgICAgJiYgKGJlc3QtPm1hdGNoICYgMHhmZmZmKSA9PSAweGZmZmYKLSAgICAgICYmIGJlc3QtPmFyZ3NbMF0gPT0gJyMnCi0gICAgICAmJiBiZXN0LT5hcmdzWzFdID09ICd3JykKLSAgICB7Ci0gICAgICAvKiBDb3B5IHRoZSBvbmUgd29yZCBhcmd1bWVudCBpbnRvIHRoZSB1c3VhbCBsb2NhdGlvbiBmb3IgYSBvbmUKLQkgd29yZCBhcmd1bWVudCwgdG8gc2ltcGxpZnkgcHJpbnRpbmcgaXQuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAotCSB0aGlzIGJlY2F1c2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgdGhlIHNlY29uZCB3b3JkIGlzLCBhbmQgd2UKLQkgYXJlbid0IGdvaW5nIHRvIHByaW50IGFueXRoaW5nIGJhc2VkIG9uIGl0LiAgKi8KLSAgICAgIHAgPSBidWZmZXIgKyA2OwotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgcCk7Ci0gICAgICBidWZmZXJbMl0gPSBidWZmZXJbNF07Ci0gICAgICBidWZmZXJbM10gPSBidWZmZXJbNV07Ci0gICAgfQotCi0gIEZFVENIX0RBVEEgKGluZm8sIHApOwotICAKLSAgZCA9IGJlc3QtPmFyZ3M7Ci0KLSAgLyogV2UgY2FuIHRoZSBvcGVyYW5kcyB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIGRvbid0IHByaW50IGFueXRoaW5nLAotICAgICBidXQgbG9vayBmb3IgZXJyb3JzLiAqLwotCi0gIHNhdmVfcCA9IHA7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IGR1bW15X3ByaW50X2FkZHJlc3M7Ci0gIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKWR1bW15X3ByaW50ZXI7Ci0gIGZvciAoIDsgKmQ7IGQgKz0gMikKLSAgICB7Ci0gICAgICBpbnQgZWF0ZW4gPSBwcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwLCBtZW1hZGRyICsgKHAgLSBidWZmZXIpLCBpbmZvKTsKLSAgICAgIGlmIChlYXRlbiA+PSAwKQotCXAgKz0gZWF0ZW47Ci0gICAgICBlbHNlIGlmIChlYXRlbiA9PSAtMSkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICBlbHNlCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKGluZm8tPnN0cmVhbSwKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCV8oIjxpbnRlcm5hbCBlcnJvciBpbiBvcGNvZGUgdGFibGU6ICVzICVzPlxuIiksCi0JCQkJYmVzdC0+bmFtZSwKLQkJCQliZXN0LT5hcmdzKTsKLQkgIGdvdG8gaW52YWxpZDsKLQl9Ci0KLSAgICB9Ci0gIHAgPSBzYXZlX3A7Ci0gIGluZm8tPmZwcmludGZfZnVuYyA9IHNhdmVfcHJpbnRlcjsKLSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jID0gc2F2ZV9wcmludF9hZGRyZXNzOwotCi0gIGQgPSBiZXN0LT5hcmdzOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBiZXN0LT5uYW1lKTsKLQotICBpZiAoKmQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0KLSAgd2hpbGUgKCpkKQotICAgIHsKLSAgICAgIHAgKz0gcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgaW5mbyk7Ci0gICAgICBkICs9IDI7Ci0gICAgICBpZiAoKmQgJiYgKihkIC0gMikgIT0gJ0knICYmICpkICE9ICdrJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICB9Ci0gIHJldHVybiBwIC0gYnVmZmVyOwotCi0gaW52YWxpZDoKLSAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSBzYXZlX3ByaW50ZXI7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IHNhdmVfcHJpbnRfYWRkcmVzczsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwJW8iLAotCQkJIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOwotICByZXR1cm4gMjsKLX0KLQotLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IKLSAgIHJldHVybiAtMSBpZiBhbiBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZgotICAgYW4gb3Bjb2RlIHRhYmUgZXJyb3Igd2FzIGZvdW5kLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwMCwgYWRkciwgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWwgPSAwOwotICByZWdpc3RlciBpbnQgcGxhY2UgPSBkWzFdOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0gIGludCByZWdubzsKLSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqcmVnbmFtZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDE7Ci0gIGRvdWJsZSBmbHZhbDsKLSAgaW50IGZsdF9wOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotICB1bnNpZ25lZCBpbnQgdXZhbDsKLQotICBzd2l0Y2ggKCpkKQotICAgIHsKLSAgICBjYXNlICdjJzoJCS8qIGNhY2hlIGlkZW50aWZpZXIgKi8KLSAgICAgIHsKLSAgICAgICAgc3RhdGljIGNoYXIgKmNvbnN0IGNhY2hlRmllbGROYW1lW10gPSB7ICJuYyIsICJkYyIsICJpYyIsICJiYyIgfTsKLSAgICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAyLCBpbmZvKTsKLSAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNhY2hlRmllbGROYW1lW3ZhbF0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ2EnOgkJLyogYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiBDZi4gY2FzZSAnKycuICovCi0gICAgICB7Ci0gICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCSAgKGluZm8tPnN0cmVhbSwKLQkgICAiJXNAIiwKLQkgICByZWdfbmFtZXMgW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnXyc6CQkvKiAzMi1iaXQgYWJzb2x1dGUgYWRkcmVzcyBmb3IgbW92ZTE2LiAqLwotICAgICAgewotICAgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ0MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWNjciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdVJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV1c3AiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlYWNjIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJW1hY3NyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJW1hc2siKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSic6Ci0gICAgICB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGludCB2YWx1ZTsgfSBuYW1lc1tdCi0JICA9IHt7IiVzZmMiLCAweDAwMH0sIHsiJWRmYyIsIDB4MDAxfSwgeyIlY2FjciIsIDB4MDAyfSwKLQkgICAgIHsiJXRjIiwgIDB4MDAzfSwgeyIlaXR0MCIsMHgwMDR9LCB7IiVpdHQxIiwgMHgwMDV9LAotICAgICAgICAgICAgIHsiJWR0dDAiLDB4MDA2fSwgeyIlZHR0MSIsMHgwMDd9LCB7IiVidXNjciIsMHgwMDh9LAotCSAgICAgeyIldXNwIiwgMHg4MDB9LCB7IiV2YnIiLCAweDgwMX0sIHsiJWNhYXIiLCAweDgwMn0sCi0JICAgICB7IiVtc3AiLCAweDgwM30sIHsiJWlzcCIsIDB4ODA0fSwKLQotCSAgICAgLyogU2hvdWxkIHdlIGJlIGNhbGxpbmcgdGhpcyBwc3IgbGlrZSB3ZSBkbyBpbiBjYXNlICdZJz8gICovCi0JICAgICB7IiVtbXVzciIsMHg4MDV9LAotCi0gICAgICAgICAgICAgeyIldXJwIiwgMHg4MDZ9LCB7IiVzcnAiLCAweDgwN30sIHsiJXBjciIsIDB4ODA4fX07Ci0KLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDEyLCBpbmZvKTsKLQlmb3IgKHJlZ25vID0gc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdIC0gMTsgcmVnbm8gPj0gMDsgcmVnbm8tLSkKLQkgIGlmIChuYW1lc1tyZWdub10udmFsdWUgPT0gdmFsKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWVzW3JlZ25vXS5uYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWlmIChyZWdubyA8IDApCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotICAgICAgLyogMCBtZWFucyA4LCBleGNlcHQgZm9yIHRoZSBia3B0IGluc3RydWN0aW9uLi4uICovCi0gICAgICBpZiAodmFsID09IDAgJiYgZFsxXSAhPSAncycpCi0JdmFsID0gODsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICBpZiAocGxhY2UgPT0gJ2gnKQotCXsKLQkgIHN0YXRpYyBjaGFyICpjb25zdCBzY2FsZWZhY3Rvcl9uYW1lW10gPSB7ICI8PCIsICI+PiIgfTsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMSwgaW5mbyk7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc2NhbGVmYWN0b3JfbmFtZVt2YWxdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLQkgIGlmICh2YWwgJiAweDgwKQotCSAgICB2YWwgPSB2YWwgLSAweDEwMDsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgICAgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXMiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDAxMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlcyIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgcmVnbm8gPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOwotICAgICAgaWYgKHJlZ25vID4gNykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCIsIHJlZ19uYW1lc1tyZWdub10pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCglcykiLCByZWdfbmFtZXNbcmVnbm9dKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJSVmcCVkIiwKLQkgZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ08nOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA2LCBpbmZvKTsKLSAgICAgIGlmICh2YWwgJiAweDIwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXMgW3ZhbCAmIDddKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNAKyIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlc0AtIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgaWYgKHBsYWNlID09ICdrJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkgIChpbmZvLT5zdHJlYW0sICJ7JXN9IiwKLQkgICByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ0MnKQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNywgaW5mbyk7Ci0JICBpZiAoIHZhbCA+IDYzICkJCS8qIFRoaXMgaXMgYSBzaWduZWQgY29uc3RhbnQuICovCi0JICAgIHZhbCAtPSAxMjg7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInsjJWR9IiwgdmFsKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICdeJzoKLSAgICAgIHAxID0gYnVmZmVyICsgKCpkID09ICcjJyA/IDIgOiA0KTsKLSAgICAgIGlmIChwbGFjZSA9PSAncycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdDJykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDcsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJzgnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnMycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdiJykKLQl2YWwgPSBORVhUQllURSAocDEpOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ3cnIHx8IHBsYWNlID09ICdXJykKLQl2YWwgPSBORVhUV09SRCAocDEpOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2wnKQotCXZhbCA9IE5FWFRMT05HIChwMSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIGlmIChwbGFjZSA9PSAnYicpCi0JZGlzcCA9IE5FWFRCWVRFIChwKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdCJykKLQlkaXNwID0gQ09FUkNFX1NJR05FRF9DSEFSKGJ1ZmZlclsxXSk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAndycgfHwgcGxhY2UgPT0gJ1cnKQotCWRpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnbCcgfHwgcGxhY2UgPT0gJ0wnIHx8IHBsYWNlID09ICdDJykKLQlkaXNwID0gTkVYVExPTkcgKHApOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2cnKQotCXsKLQkgIGRpc3AgPSBORVhUQllURSAoYnVmZmVyKTsKLQkgIGlmIChkaXNwID09IDApCi0JICAgIGRpc3AgPSBORVhUV09SRCAocCk7Ci0JICBlbHNlIGlmIChkaXNwID09IC0xKQotCSAgICBkaXNwID0gTkVYVExPTkcgKHApOwotCX0KLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdjJykKLQl7Ci0JICBpZiAoYnVmZmVyWzFdICYgMHg0MCkJCS8qIElmIGJpdCBzaXggaXMgb25lLCBsb25nIG9mZnNldCAqLwotCSAgICBkaXNwID0gTkVYVExPTkcgKHApOwotCSAgZWxzZQotCSAgICBkaXNwID0gTkVYVFdPUkQgKHApOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gLTI7Ci0KLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIGRpc3AsIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHZhbCA9IE5FWFRXT1JEIChwKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgICAgZnBjcl9uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0knOgotICAgICAgLyogR2V0IGNvcHJvY2Vzc29yIElELi4uICovCi0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ2QnLCAzLCBpbmZvKTsKLSAgICAgIAotICAgICAgaWYgKHZhbCAhPSAxKQkJCQkvKiBVbnVzdWFsIGNvcHJvY2Vzc29yIElEPyAqLwotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKGNwaWQ9JWQpICIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyUnOgotICAgIGNhc2UgJzsnOgotICAgIGNhc2UgJ0AnOgotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJyQnOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ3wnOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ20nOgotICAgIGNhc2UgJ24nOgotICAgIGNhc2UgJ28nOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ3YnOgotCi0gICAgICBpZiAocGxhY2UgPT0gJ2QnKQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAneCcsIDYsIGluZm8pOwotCSAgdmFsID0gKCh2YWwgJiA3KSA8PCAzKSArICgodmFsID4+IDMpICYgNyk7Ci0JfQotICAgICAgZWxzZQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAncycsIDYsIGluZm8pOwotCi0gICAgICAvKiBHZXQgcmVnaXN0ZXIgbnVtYmVyIGFzc3VtaW5nIGFkZHJlc3MgcmVnaXN0ZXIuICAqLwotICAgICAgcmVnbm8gPSAodmFsICYgNykgKyA4OwotICAgICAgcmVnbmFtZSA9IHJlZ19uYW1lc1tyZWdub107Ci0gICAgICBzd2l0Y2ggKHZhbCA+PiAzKQotCXsKLQljYXNlIDA6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3ZhbF0pOwotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgMzoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKyIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDQ6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQC0iLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA1OgotCSAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwgcmVnbmFtZSwgdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA2OgotCSAgcCA9IHByaW50X2luZGV4ZWQgKHJlZ25vLCBwLCBhZGRyLCBpbmZvKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA3OgotCSAgc3dpdGNoICh2YWwgJiA3KQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkgICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXBjQCgiKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyB2YWwsIGluZm8pOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICBwID0gcHJpbnRfaW5kZXhlZCAoLTEsIHAsIGFkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNDoKLQkgICAgICBmbHRfcCA9IDE7CS8qIEFzc3VtZSBpdCdzIGEgZmxvYXQuLi4gKi8KLQkgICAgICBzd2l0Y2goIHBsYWNlICkKLQkgICAgICB7Ci0JCWNhc2UgJ2InOgotCQkgIHZhbCA9IE5FWFRCWVRFIChwKTsKLQkJICBmbHRfcCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndyc6Ci0JCSAgdmFsID0gTkVYVFdPUkQgKHApOwotCQkgIGZsdF9wID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICdsJzoKLQkJICB2YWwgPSBORVhUTE9ORyAocCk7Ci0JCSAgZmx0X3AgPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgIE5FWFRTSU5HTEUoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0YnOgotCQkgIE5FWFRET1VCTEUoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3gnOgotCQkgIE5FWFRFWFRFTkQoZmx2YWwsIHApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3AnOgotCQkgIGZsdmFsID0gTkVYVFBBQ0tFRChwKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHJldHVybiAtMTsKLQkgICAgICB9Ci0JICAgICAgaWYgKCBmbHRfcCApCS8qIFByaW50IGEgZmxvYXQ/ICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVnIiwgZmx2YWwpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdMJzoKLSAgICBjYXNlICdsJzoKLQlpZiAocGxhY2UgPT0gJ3cnKQotCSAgewotCSAgICBjaGFyIGRvbmVhbnk7Ci0JICAgIHAxID0gYnVmZmVyICsgMjsKLQkgICAgdmFsID0gTkVYVFdPUkQgKHAxKTsKLQkgICAgLyogTW92ZSB0aGUgcG9pbnRlciBhaGVhZCBpZiB0aGlzIHBvaW50IGlzIGZhcnRoZXIgYWhlYWQKLQkgICAgICAgdGhhbiB0aGUgbGFzdC4gICovCi0JICAgIHAgPSBwMSA+IHAgPyBwMSA6IHA7Ci0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIzAiKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoKmQgPT0gJ2wnKQotCSAgICAgIHsKLQkJcmVnaXN0ZXIgaW50IG5ld3ZhbCA9IDA7Ci0JCWZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyArK3JlZ25vKQotCQkgIGlmICh2YWwgJiAoMHg4MDAwID4+IHJlZ25vKSkKLQkJICAgIG5ld3ZhbCB8PSAxIDw8IHJlZ25vOwotCQl2YWwgPSBuZXd2YWw7Ci0JICAgICAgfQotCSAgICB2YWwgJj0gMHhmZmZmOwotCSAgICBkb25lYW55ID0gMDsKLQkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgMTY7ICsrcmVnbm8pCi0JICAgICAgaWYgKHZhbCAmICgxIDw8IHJlZ25vKSkKLQkJewotCQkgIGludCBmaXJzdF9yZWdubzsKLQkJICBpZiAoZG9uZWFueSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyIpOwotCQkgIGRvbmVhbnkgPSAxOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnbm9dKTsKLQkJICBmaXJzdF9yZWdubyA9IHJlZ25vOwotCQkgIHdoaWxlICh2YWwgJiAoMSA8PCAocmVnbm8gKyAxKSkpCi0JCSAgICArK3JlZ25vOwotCQkgIGlmIChyZWdubyA+IGZpcnN0X3JlZ25vKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXMiLAotCQkJCQkgICByZWdfbmFtZXNbcmVnbm9dKTsKLQkJfQotCSAgfQotCWVsc2UgaWYgKHBsYWNlID09ICczJykKLQkgIHsKLQkgICAgLyogYGZtb3ZlbScgaW5zbi4gICovCi0JICAgIGNoYXIgZG9uZWFueTsKLQkgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjMCIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICgqZCA9PSAnbCcpCi0JICAgICAgewotCQlyZWdpc3RlciBpbnQgbmV3dmFsID0gMDsKLQkJZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKLQkJICBpZiAodmFsICYgKDB4ODAgPj4gcmVnbm8pKQotCQkgICAgbmV3dmFsIHw9IDEgPDwgcmVnbm87Ci0JCXZhbCA9IG5ld3ZhbDsKLQkgICAgICB9Ci0JICAgIHZhbCAmPSAweGZmOwotCSAgICBkb25lYW55ID0gMDsKLQkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKLQkgICAgICBpZiAodmFsICYgKDEgPDwgcmVnbm8pKQotCQl7Ci0JCSAgaW50IGZpcnN0X3JlZ25vOwotCQkgIGlmIChkb25lYW55KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIvIik7Ci0JCSAgZG9uZWFueSA9IDE7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWZwJWQiLCByZWdubyk7Ci0JCSAgZmlyc3RfcmVnbm8gPSByZWdubzsKLQkJICB3aGlsZSAodmFsICYgKDEgPDwgKHJlZ25vICsgMSkpKQotCQkgICAgKytyZWdubzsKLQkJICBpZiAocmVnbm8gPiBmaXJzdF9yZWdubykKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSUlZnAlZCIsIHJlZ25vKTsKLQkJfQotCSAgfQotCWVsc2UgaWYgKHBsYWNlID09ICc4JykKLQkgIHsKLQkgICAgLyogZm1vdmVtbCBmb3IgRlAgc3RhdHVzIHJlZ2lzdGVycyAqLwotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkgICBmcGNyX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywKLQkJCQkJCQkgaW5mbyldKTsKLQkgIH0KLQllbHNlCi0JICByZXR1cm4gLTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgcGxhY2UgPSAnOCc7Ci0gICAgY2FzZSAnWSc6Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgICB7Ci0JaW50IHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JY2hhciAqbmFtZSA9IDA7Ci0Jc3dpdGNoICh2YWwpCi0JICB7Ci0JICBjYXNlIDI6IG5hbWUgPSAiJXR0MCI7IGJyZWFrOwotCSAgY2FzZSAzOiBuYW1lID0gIiV0dDEiOyBicmVhazsKLQkgIGNhc2UgMHgxMDogbmFtZSA9ICIldGMiOyBicmVhazsKLQkgIGNhc2UgMHgxMTogbmFtZSA9ICIlZHJwIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTI6IG5hbWUgPSAiJXNycCI7IGJyZWFrOwotCSAgY2FzZSAweDEzOiBuYW1lID0gIiVjcnAiOyBicmVhazsKLQkgIGNhc2UgMHgxNDogbmFtZSA9ICIlY2FsIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTU6IG5hbWUgPSAiJXZhbCI7IGJyZWFrOwotCSAgY2FzZSAweDE2OiBuYW1lID0gIiVzY2MiOyBicmVhazsKLQkgIGNhc2UgMHgxNzogbmFtZSA9ICIlYWMiOyBicmVhazsKLSAJICBjYXNlIDB4MTg6IG5hbWUgPSAiJXBzciI7IGJyZWFrOwotCSAgY2FzZSAweDE5OiBuYW1lID0gIiVwY3NyIjsgYnJlYWs7Ci0JICBjYXNlIDB4MWM6Ci0JICBjYXNlIDB4MWQ6Ci0JICAgIHsKLQkgICAgICBpbnQgYnJlYWtfcmVnID0gKChidWZmZXJbM10gPj4gMikgJiA3KTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJKGluZm8tPnN0cmVhbSwgdmFsID09IDB4MWMgPyAiJSViYWQlZCIgOiAiJSViYWMlZCIsCi0JCSBicmVha19yZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI8bW11IHJlZ2lzdGVyICVkPiIsIHZhbCk7Ci0JICB9Ci0JaWYgKG5hbWUpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgewotCWludCBmYyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JaWYgKGZjID09IDEpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlZGZjIik7Ci0JZWxzZSBpZiAoZmMgPT0gMCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzZmMiKTsKLQllbHNlCi0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oIjxmdW5jdGlvbiBjb2RlICVkPiIpLCBmYyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXZhbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLQlpbnQgbGV2ZWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBsZXZlbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3UnOgotICAgICAgewotCXNob3J0IGlzX3VwcGVyID0gMDsKLQlpbnQgcmVnID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA1LCBpbmZvKTsKLQkKLQlpZiAocmVnICYgMHgxMCkKLQkgIHsKLQkgICAgaXNfdXBwZXIgPSAxOwotCSAgICByZWcgJj0gMHhmOwotCSAgfQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMlcyIsCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10sCi0JCQkgICAgICAgaXNfdXBwZXIgPyAidSIgOiAibCIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0JCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KLQotLyogRmV0Y2ggQklUUyBiaXRzIGZyb20gYSBwb3NpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IENPREUuCi0gICBDT0RFIGlzIGEgInBsYWNlIHRvIHB1dCBhbiBhcmd1bWVudCIsIG9yICd4JyBmb3IgYSBkZXN0aW5hdGlvbgotICAgdGhhdCBpcyBhIGdlbmVyYWwgYWRkcmVzcyAobW9kZSBhbmQgcmVnaXN0ZXIpLgotICAgQlVGRkVSIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWZldGNoX2FyZyAoYnVmZmVyLCBjb2RlLCBiaXRzLCBpbmZvKQotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBjb2RlOwotICAgICBpbnQgYml0czsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbCA9IDA7Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB2YWwgPSBidWZmZXJbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgcmVnaXN0ZXIgb3IgcXVpY2suICAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gOTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6CQkJLyogRGVzdGluYXRpb24sIGZvciBnZW5lcmFsIGFyZyAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbM10gPj4gNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSBidWZmZXJbM107Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJ2onOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc0JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIHZhbCA+Pj0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzUnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNSk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzRdIDw8IDgpICsgYnVmZmVyWzVdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc2JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNyc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDc7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgJzgnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOSc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgdmFsID0gKGJ1ZmZlclsxXSA+PiA2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6IAotICAgICAgdmFsID0gKGJ1ZmZlclsxXSAmIDB4NDAgPyAweDggOiAwKQotCXwgKChidWZmZXJbMF0gPj4gMSkgJiAweDcpCi0JfCAoYnVmZmVyWzNdICYgMHg4MCA/IDB4MTAgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbic6IAotICAgICAgdmFsID0gKGJ1ZmZlclsxXSAmIDB4NDAgPyAweDggOiAwKSB8ICgoYnVmZmVyWzBdID4+IDEpICYgMHg3KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbyc6Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdID4+IDQpIHwgKGJ1ZmZlclszXSAmIDB4ODAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgdmFsID0gYnVmZmVyWzFdIHwgKGJ1ZmZlclszXSAmIDB4NDAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgdmFsID0gYnVmZmVyWzNdIHwgKGJ1ZmZlclszXSAmIDB4NDAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgdmFsID0gYnVmZmVyWzJdID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChiaXRzKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gdmFsICYgMTsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gdmFsICYgMzsKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gdmFsICYgNzsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gdmFsICYgMDE3OwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiB2YWwgJiAwMzc7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIHZhbCAmIDA3NzsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gdmFsICYgMDE3NzsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gdmFsICYgMDM3NzsKLSAgICBjYXNlIDEyOgotICAgICAgcmV0dXJuIHZhbCAmIDA3Nzc3OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGFuIGluZGV4ZWQgYXJndW1lbnQuICBUaGUgYmFzZSByZWdpc3RlciBpcyBCQVNFUkVHICgtMSBmb3IgcGMpLgotICAgUCBwb2ludHMgdG8gZXh0ZW5zaW9uIHdvcmQsIGluIGJ1ZmZlci4KLSAgIEFERFIgaXMgdGhlIG5vbWluYWwgY29yZSBhZGRyZXNzIG9mIHRoYXQgZXh0ZW5zaW9uIHdvcmQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcmludF9pbmRleGVkIChiYXNlcmVnLCBwLCBhZGRyLCBpbmZvKQotICAgICBpbnQgYmFzZXJlZzsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgd29yZDsKLSAgc3RhdGljIGNoYXIgKmNvbnN0IHNjYWxlc1tdID0geyIiLCAiOjIiLCAiOjQiLCAiOjgifTsKLSAgYmZkX3ZtYSBiYXNlX2Rpc3A7Ci0gIGJmZF92bWEgb3V0ZXJfZGlzcDsKLSAgY2hhciBidWZbNDBdOwotICBjaGFyIHZtYWJ1Zls1MF07Ci0KLSAgd29yZCA9IE5FWFRXT1JEIChwKTsKLQotICAvKiBHZW5lcmF0ZSB0aGUgdGV4dCBmb3IgdGhlIGluZGV4IHJlZ2lzdGVyLgotICAgICBXaGVyZSB0aGlzIHdpbGwgYmUgb3V0cHV0IGlzIG5vdCB5ZXQgZGV0ZXJtaW5lZC4gICovCi0gIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLAotCSAgIHJlZ19uYW1lc1sod29yZCA+PiAxMikgJiAweGZdLAotCSAgICh3b3JkICYgMHg4MDApID8gJ2wnIDogJ3cnLAotCSAgIHNjYWxlc1sod29yZCA+PiA5KSAmIDNdKTsKLQotICAvKiBIYW5kbGUgdGhlIDY4MDAwIHN0eWxlIG9mIGluZGV4aW5nLiAgKi8KLQotICBpZiAoKHdvcmQgJiAweDEwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBiYXNlX2Rpc3AgPSB3b3JkICYgMHhmZjsKLSAgICAgIGlmICgoYmFzZV9kaXNwICYgMHg4MCkgIT0gMCkKLQliYXNlX2Rpc3AgLT0gMHgxMDA7Ci0gICAgICBpZiAoYmFzZXJlZyA9PSAtMSkKLQliYXNlX2Rpc3AgKz0gYWRkcjsKLSAgICAgIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcykiLCBidWYpOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgZ2VuZXJhbGl6ZWQga2luZC4gICovCi0gIC8qIEZpcnN0LCBjb21wdXRlIHRoZSBkaXNwbGFjZW1lbnQgdG8gYWRkIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQotICBpZiAod29yZCAmIDAyMDApCi0gICAgewotICAgICAgaWYgKGJhc2VyZWcgPT0gLTEpCi0JYmFzZXJlZyA9IC0zOwotICAgICAgZWxzZQotCWJhc2VyZWcgPSAtMjsKLSAgICB9Ci0gIGlmICh3b3JkICYgMDEwMCkKLSAgICBidWZbMF0gPSAnXDAnOwotICBiYXNlX2Rpc3AgPSAwOwotICBzd2l0Y2ggKCh3b3JkID4+IDQpICYgMykKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgYmFzZV9kaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmFzZV9kaXNwID0gTkVYVExPTkcgKHApOwotICAgIH0KLSAgaWYgKGJhc2VyZWcgPT0gLTEpCi0gICAgYmFzZV9kaXNwICs9IGFkZHI7Ci0KLSAgLyogSGFuZGxlIHNpbmdsZS1sZXZlbCBjYXNlIChub3QgaW5kaXJlY3QpICovCi0KLSAgaWYgKCh3b3JkICYgNykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICAgICAgaWYgKGJ1ZlswXSAhPSAnXDAnKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gIC8qIFR3byBsZXZlbC4gIENvbXB1dGUgZGlzcGxhY2VtZW50IHRvIGFkZCBhZnRlciBpbmRpcmVjdGlvbi4gICovCi0KLSAgb3V0ZXJfZGlzcCA9IDA7Ci0gIHN3aXRjaCAod29yZCAmIDMpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIG91dGVyX2Rpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBvdXRlcl9kaXNwID0gTkVYVExPTkcgKHApOwotICAgIH0KLQotICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICBpZiAoKHdvcmQgJiA0KSA9PSAwICYmIGJ1ZlswXSAhPSAnXDAnKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgICAgIGJ1ZlswXSA9ICdcMCc7Ci0gICAgfQotICBzcHJpbnRmX3ZtYSAodm1hYnVmLCBvdXRlcl9kaXNwKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpQCglcyIsIHZtYWJ1Zik7Ci0gIGlmIChidWZbMF0gIT0gJ1wwJykKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBQcmludCBhIGJhc2UgcmVnaXN0ZXIgUkVHTk8gYW5kIGRpc3BsYWNlbWVudCBESVNQLCBvbiBJTkZPLT5TVFJFQU0uCi0gICBSRUdOTyA9IC0xIGZvciBwYywgLTIgZm9yIG5vbmUgKHN1cHByZXNzZWQpLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2Jhc2UgKHJlZ25vLCBkaXNwLCBpbmZvKQotICAgICBpbnQgcmVnbm87Ci0gICAgIGJmZF92bWEgZGlzcDsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKHJlZ25vID09IC0xKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVwY0AoIik7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGRpc3AsIGluZm8pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgaWYgKHJlZ25vID09IC0yKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsKLSAgICAgIGVsc2UgaWYgKHJlZ25vID09IC0zKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV6cGNAKCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKCIsIHJlZ19uYW1lc1tyZWdub10pOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBkaXNwKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBidWYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTY4ay1vcGMuYyBiL29wY29kZXMvbTY4ay1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljZTVkZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL202OGstb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTg3ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgbTY4MFswMTIzNDZdMC9tNjg4OFsxMl0vbTY4ODUxL21jZjUyMDAuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLQotI2RlZmluZSBvbmUoeCkgKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikKLSNkZWZpbmUgdHdvKHgsIHkpICgoKHVuc2lnbmVkIGludCkgKHgpIDw8IDE2KSArICh5KSkKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdAotICAgYmUgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW10gPQotewoteyJhYmNkIiwJb25lKDAxNDA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWJjZCIsCW9uZSgwMTQwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYWRkYXciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJhZGRhbCIsCW9uZSgwMTUwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYWRkaWIiLAlvbmUoMDAwMzAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpdyIsCW9uZSgwMDAzMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFkZGlsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJhZGRxYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCi17ImFkZHF3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkcWwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBUaGUgYWRkIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGFkZGEsIGFkZGksIGFuZCBhZGRxIGluc3RydWN0aW9ucy4gICovCi17ImFkZGIiLAlvbmUoMDA1MDAwMCksCW9uZSgwMTcwNzAwKSwgIlFkJGIiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAwMDMwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMTUwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDE1MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDAwMzEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAxNTAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi17ImFkZGwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJhZGRsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMTUwMjAwKSwJb25lKDAxNzA3MDApLCAiKmxEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImFkZHhiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGIiLAlvbmUoMDE1MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJhZGR4dyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFkZHh3IiwJb25lKDAxNTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGR4bCIsCW9uZSgwMTUwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYW5kaWIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpYiIsCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZGl3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaXciLAlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGlsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImFuZGkiLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBhbmQgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgYW5kaSBpbnN0cnVjdGlvbi4gICovCi17ImFuZGIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMTQwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDE0MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLXsiYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiYW5kbCIsCW9uZSgwMTQwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFuZGwiLAlvbmUoMDE0MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhbmQiLAkJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyR3IiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAxNDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMTQwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi0KLXsiYXNsYiIsCW9uZSgwMTYwNDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzbGIiLAlvbmUoMDE2MDQ0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA1MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc2xsIiwJb25lKDAxNjA2MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNsbCIsCW9uZSgwMTYwNjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYXNyYiIsCW9uZSgwMTYwMDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzcmIiLAlvbmUoMDE2MDA0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAxMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc3JsIiwJb25lKDAxNjAyMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNybCIsCW9uZSgwMTYwMjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpdyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHN3IiwJb25lKDAwNjE0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjY3ciLAlvbmUoMDA2MjAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNzdyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibmV3IiwJb25lKDAwNjMwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJlcXciLAlvbmUoMDA2MzQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZjdyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidnN3IiwJb25lKDAwNjQ0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJwbHciLAlvbmUoMDA2NTAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm1pdyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ2V3IiwJb25lKDAwNjYwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsdHciLAlvbmUoMDA2NjQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmd0dyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibGV3IiwJb25lKDAwNjc0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpbCIsCW9uZSgwMDYxMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsc2wiLAlvbmUoMDA2MTc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiY2NsIiwJb25lKDAwNjIzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmNzbCIsCW9uZSgwMDYyNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJuZWwiLAlvbmUoMDA2MzM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZXFsIiwJb25lKDAwNjM3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnZjbCIsCW9uZSgwMDY0Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJ2c2wiLAlvbmUoMDA2NDc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJicGxsIiwJb25lKDAwNjUzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYm1pbCIsCW9uZSgwMDY1Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJnZWwiLAlvbmUoMDA2NjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibHRsIiwJb25lKDAwNjY3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmd0bCIsCW9uZSgwMDY3Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsZWwiLAlvbmUoMDA2Nzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImJoaXMiLAlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxzcyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2NzIiwJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjc3MiLAlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm5lcyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZXFzIiwJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2Y3MiLAlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZzcyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicGxzIiwJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJtaXMiLAlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmdlcyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHRzIiwJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJndHMiLAlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxlcyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImpoaSIsCQlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxzIiwJCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqY2MiLAkJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpjcyIsCQlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiam5lIiwJCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqZXEiLAkJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Imp2YyIsCQlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianZzIiwJCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqcGwiLAkJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImptaSIsCQlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamdlIiwJCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbHQiLAkJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpndCIsCQlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxlIiwJCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJjaGciLAlvbmUoMDAwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2hnIiwJb25lKDAwMDQxMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYmZjaGciLAl0d28oMDE2NTMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZjbHIiLAl0d28oMDE2NjMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZleHRzIiwJdHdvKDAxNjU3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSIvc08yTzNEMSIsIG02ODAyMHVwIH0sCi17ImJmZXh0dSIsCXR3bygwMTY0NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmZmbyIsCXR3bygwMTY2NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmlucyIsCXR3bygwMTY3NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiRDE/c08yTzMiLCBtNjgwMjB1cCB9LAoteyJiZnNldCIsCXR3bygwMTY3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiP3NPMk8zIiwgICBtNjgwMjB1cCB9LAoteyJiZnRzdCIsCXR3bygwMTY0MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiL3NPMk8zIiwgICBtNjgwMjB1cCB9LAotCi17ImJnbmQiLAlvbmUoMDA0NTM3MiksCQlvbmUoMDE3Nzc3NyksICIiLCBjcHUzMiB9LAotCi17ImJrcHQiLAlvbmUoMDA0NDExMCksCQlvbmUoMDE3Nzc3MCksICJ0cyIsIG02ODAxMHVwIH0sCi0KLXsiYnJhdyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicmFsIiwJb25lKDAwNjAzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnJhcyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJzZXQiLAlvbmUoMDAwNDMwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYnNydyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJic3JsIiwJb25lKDAwNjA3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnNycyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJ0c3QiLAlvbmUoMDAwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkO2IiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiYnRzdCIsCW9uZSgwMDA0MDAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImNhbGxtIiwJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3MDApLCAiI2IhcyIsIG02ODAyMCB9LAotCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi0KLXsiY2FzYiIsCXR3bygwMDA1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzdyIsCXR3bygwMDA2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzbCIsCXR3bygwMDA3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLQoteyJjaGsyYiIsIHR3bygwMDAwMzAwLDAwMDQwMDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsydyIsIHR3bygwMDAxMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsybCIsIHR3bygwMDAyMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImNoa2wiLAlvbmUoMDA0MDQwMCksCQlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfSwKLXsiY2hrdyIsCW9uZSgwMDQwNjAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi0jZGVmaW5lIFNDT1BFX0xJTkUgKDB4MSA8PCAzKQotI2RlZmluZSBTQ09QRV9QQUdFICgweDIgPDwgMykKLSNkZWZpbmUgU0NPUEVfQUxMICAoMHgzIDw8IDMpCi0KLXsiY2ludmEiLAlvbmUoMHhmNDAwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjaW52bCIsCW9uZSgweGY0MDB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi17ImNpbnZwIiwJb25lKDB4ZjQwMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLQoteyJjcHVzaGEiLAlvbmUoMHhmNDIwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHhmNDIwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHgwNGU4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCAgIG1jZiB9LAoteyJjcHVzaHAiLAlvbmUoMHhmNDIwfFNDT1BFX1BBR0UpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAotCi0jdW5kZWYgU0NPUEVfTElORQotI3VuZGVmIFNDT1BFX1BBR0UKLSN1bmRlZiBTQ09QRV9BTEwKLQoteyJjbHJiIiwJb25lKDAwNDEwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImNscnciLAlvbmUoMDA0MTEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY2xybCIsCW9uZSgwMDQxMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImNtcDJiIiwJdHdvKDAwMDAzMDAsMCksIHR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJ3IiwJdHdvKDAwMDEzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJsIiwJdHdvKDAwMDIzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiY21wYXciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXBhbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiY21waWIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJjbXBtYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcG13IiwJb25lKDAxMzA1MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wbWwiLAlvbmUoMDEzMDYxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgY21wIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGNtcGEsIGNtcG0sIGFuZCBjbXBpIGluc3RydWN0aW9ucy4gICovCi17ImNtcGIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBiIiwJb25lKDAxMzA0MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wYiIsCW9uZSgwMTMwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAwMDYxMDApLAlvbmUoMDE3NzcwMCksICIjd0BzIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJjbXBsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xAcyIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDEzMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImRiY2MiLAlvbmUoMDA1MjMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmNzIiwJb25lKDAwNTI3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJlcSIsCW9uZSgwMDUzNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZiIsCQlvbmUoMDA1MDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmdlIiwJb25lKDAwNTYzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJndCIsCW9uZSgwMDU3MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiaGkiLAlvbmUoMDA1MTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmxlIiwJb25lKDAwNTc3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJscyIsCW9uZSgwMDUxNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibHQiLAlvbmUoMDA1NjcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYm1pIiwJb25lKDAwNTU3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJuZSIsCW9uZSgwMDUzMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRicGwiLAlvbmUoMDA1NTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnQiLAkJb25lKDAwNTAzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ2YyIsCW9uZSgwMDU0MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidnMiLAlvbmUoMDA1NDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAotCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLCAgIG9uZSgwMTcwNzAwKSwgInZzRGQiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDYwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgICBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCJ2c0REIiwgICBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICBtNjgwMjB1cHxjcHUzMiB9LAotCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAidnNEZCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksInZzREQiLCAgIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZW9yaWIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpYiIsCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvcml3IiwJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaXciLAlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpbCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmkiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpIiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBlb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgZW9yaSBpbnN0cnVjdGlvbi4gICovCi17ImVvcmIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JiIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yYiIsCW9uZSgwMTMwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmwiLAlvbmUoMDEzMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJlb3IiLAkJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAxMzA1MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLQoteyJleGciLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNTEwKSwJb25lKDAxNzA3NzApLCAiQWRBcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkQXMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA2MTApLAlvbmUoMDE3MDc3MCksICJBc0RkIiwgbTY4MDAwdXAgfSwKLQoteyJleHR3IiwJb25lKDAwNDQyMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRsIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRibCIsCW9uZSgwMDQ0NzAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLQotLyogZmxvYXQgc3R1ZmYgc3RhcnRzIGhlcmUgKi8KLQoteyJmYWJzYiIsCXR3bygweEYwMDAsIDB4NTgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFic2QiLAl0d28oMHhGMDAwLCAweDU0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWJzcCIsCXR3bygweEYwMDAsIDB4NEMxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFic3MiLAl0d28oMHhGMDAwLCAweDQ0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4MDAxOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDQ4MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzYWJzYiIsCXR3bygweEYwMDAsIDB4NTg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic2QiLAl0d28oMHhGMDAwLCAweDU0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzcCIsCXR3bygweEYwMDAsIDB4NEM1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3MiLAl0d28oMHhGMDAwLCAweDQ0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDQ4NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNkIiwJdHdvKDB4RjAwMCwgMHg1NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNzIiwJdHdvKDB4RjAwMCwgMHg0NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHg0ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwfSwKLQoteyJmYWNvc2IiLAl0d28oMHhGMDAwLCAweDU4MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhY29zZCIsCXR3bygweEYwMDAsIDB4NTQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3AiLAl0d28oMHhGMDAwLCAweDRDMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhY29zcyIsCXR3bygweEYwMDAsIDB4NDQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4NDgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWRkZCIsCXR3bygweEYwMDAsIDB4NTQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFkZGwiLAl0d28oMHhGMDAwLCAweDQwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWRkcyIsCXR3bygweEYwMDAsIDB4NDQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFkZHciLAl0d28oMHhGMDAwLCAweDUwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDIyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWRkeCIsCXR3bygweEYwMDAsIDB4NDgyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2FkZGIiLAl0d28oMHhGMDAwLCAweDU4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHAiLAl0d28oMHhGMDAwLCAweDRDNjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDAwNjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkZCIsCXR3bygweEYwMDAsIDB4NTQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZGwiLAl0d28oMHhGMDAwLCAweDQwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkcyIsCXR3bygweEYwMDAsIDB4NDQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHciLAl0d28oMHhGMDAwLCAweDUwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDY2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkeCIsCXR3bygweEYwMDAsIDB4NDg2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZhc2luYiIsCXR3bygweEYwMDAsIDB4NTgwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhc2lucCIsCXR3bygweEYwMDAsIDB4NEMwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnciLAl0d28oMHhGMDAwLCAweDUwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHg0ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDAwMEMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmF0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhdGFubCIsCXR3bygweEYwMDAsIDB4NDAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhdGFudyIsCXR3bygweEYwMDAsIDB4NTAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4MDAwQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYXRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZiZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAotCi17ImZiZXFsIiwJb25lKDB4RjBDMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJmbCIsCW9uZSgweEYwQzApLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2VsIiwJb25lKDB4RjBEMyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnbGwiLAlvbmUoMHhGMEQ2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdsZWwiLAlvbmUoMHhGMEQ3KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmd0bCIsCW9uZSgweEYwRDIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibGVsIiwJb25lKDB4RjBENSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJsdGwiLAlvbmUoMHhGMEQ0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5lbCIsCW9uZSgweEYwQ0UpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdlbCIsCW9uZSgweEYwREMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsbCIsCW9uZSgweEYwRDkpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsZWwiLAlvbmUoMHhGMEQ4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5ndGwiLAlvbmUoMHhGMEREKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sZWwiLAlvbmUoMHhGMERBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sdGwiLAlvbmUoMHhGMERCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nZWwiLAlvbmUoMHhGMEMzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nbGwiLAlvbmUoMHhGMEM2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ndGwiLAlvbmUoMHhGMEMyKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sZWwiLAlvbmUoMHhGMEM1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sdGwiLAlvbmUoMHhGMEM0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ybCIsCW9uZSgweEYwQzcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2VxbCIsCW9uZSgweEYwRDEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2ZsIiwJb25lKDB4RjBEMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzbmVsIiwJb25lKDB4RjBERSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzdGwiLAlvbmUoMHhGMERGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnRsIiwJb25lKDB4RjBDRiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1ZXFsIiwJb25lKDB4RjBDOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z2VsIiwJb25lKDB4RjBDQiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z3RsIiwJb25lKDB4RjBDQSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bGVsIiwJb25lKDB4RjBDRCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bHRsIiwJb25lKDB4RjBDQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bmwiLAlvbmUoMHhGMEM4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAotCi17ImZqZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAotCi17ImZjbXBiIiwJdHdvKDB4RjAwMCwgMHg1ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY21wZCIsCXR3bygweEYwMDAsIDB4NTQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNtcGwiLAl0d28oMHhGMDAwLCAweDQwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjbXBwIiwJdHdvKDB4RjAwMCwgMHg0QzM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY21wcyIsCXR3bygweEYwMDAsIDB4NDQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNtcHciLAl0d28oMHhGMDAwLCAweDUwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHgwMDM4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY21weCIsCXR3bygweEYwMDAsIDB4NDgzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmY29zYiIsCXR3bygweEYwMDAsIDB4NTgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmY29zcCIsCXR3bygweEYwMDAsIDB4NEMxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZjb3NoYiIsCXR3bygweEYwMDAsIDB4NTgxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hkIiwJdHdvKDB4RjAwMCwgMHg1NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaGwiLAl0d28oMHhGMDAwLCAweDQwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjb3NocCIsCXR3bygweEYwMDAsIDB4NEMxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hzIiwJdHdvKDB4RjAwMCwgMHg0NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaHciLAl0d28oMHhGMDAwLCAweDUwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHg0ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmRiZXEiLAl0d28oMHhGMDQ4LCAweDAwMDEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmYiLAl0d28oMHhGMDQ4LCAweDAwMDApLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdlIiwJdHdvKDB4RjA0OCwgMHgwMDEzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnbCIsCXR3bygweEYwNDgsIDB4MDAxNiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2xlIiwJdHdvKDB4RjA0OCwgMHgwMDE3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJndCIsCXR3bygweEYwNDgsIDB4MDAxMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibGUiLAl0d28oMHhGMDQ4LCAweDAwMTUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmx0IiwJdHdvKDB4RjA0OCwgMHgwMDE0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZSIsCXR3bygweEYwNDgsIDB4MDAwRSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdlIiwJdHdvKDB4RjA0OCwgMHgwMDFDKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2wiLAl0d28oMHhGMDQ4LCAweDAwMTkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nbGUiLAl0d28oMHhGMDQ4LCAweDAwMTgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5ndCIsCXR3bygweEYwNDgsIDB4MDAxRCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmxlIiwJdHdvKDB4RjA0OCwgMHgwMDFBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJubHQiLAl0d28oMHhGMDQ4LCAweDAwMUIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9nZSIsCXR3bygweEYwNDgsIDB4MDAwMyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2dsIiwJdHdvKDB4RjA0OCwgMHgwMDA2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ3QiLAl0d28oMHhGMDQ4LCAweDAwMDIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9sZSIsCXR3bygweEYwNDgsIDB4MDAwNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2x0IiwJdHdvKDB4RjA0OCwgMHgwMDA0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvciIsCXR3bygweEYwNDgsIDB4MDAwNyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic2VxIiwJdHdvKDB4RjA0OCwgMHgwMDExKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzZiIsCXR3bygweEYwNDgsIDB4MDAxMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic25lIiwJdHdvKDB4RjA0OCwgMHgwMDFFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzdCIsCXR3bygweEYwNDgsIDB4MDAxRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidCIsCXR3bygweEYwNDgsIDB4MDAwRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWVxIiwJdHdvKDB4RjA0OCwgMHgwMDA5KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1Z2UiLAl0d28oMHhGMDQ4LCAweDAwMEIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVndCIsCXR3bygweEYwNDgsIDB4MDAwQSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWxlIiwJdHdvKDB4RjA0OCwgMHgwMDBEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1bHQiLAl0d28oMHhGMDQ4LCAweDAwMEMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVuIiwJdHdvKDB4RjA0OCwgMHgwMDA4KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAotCi17ImZkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmRpdnciLAl0d28oMHhGMDAwLCAweDUwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDIwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2RpdmIiLAl0d28oMHhGMDAwLCAweDU4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnAiLAl0d28oMHhGMDAwLCAweDRDNjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDAwNjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdmwiLAl0d28oMHhGMDAwLCAweDQwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2cyIsCXR3bygweEYwMDAsIDB4NDQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnciLAl0d28oMHhGMDAwLCAweDUwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDY0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2eCIsCXR3bygweEYwMDAsIDB4NDg2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZldG94YiIsCXR3bygweEYwMDAsIDB4NTgxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveGwiLAl0d28oMHhGMDAwLCAweDQwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZldG94cCIsCXR3bygweEYwMDAsIDB4NEMxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveHciLAl0d28oMHhGMDAwLCAweDUwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmV0b3htMWIiLAl0d28oMHhGMDAwLCAweDU4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFkIiwJdHdvKDB4RjAwMCwgMHg1NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xbCIsCXR3bygweEYwMDAsIDB4NDAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXAiLAl0d28oMHhGMDAwLCAweDRDMDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFzIiwJdHdvKDB4RjAwMCwgMHg0NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xdyIsCXR3bygweEYwMDAsIDB4NTAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHg0ODA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZ2V0ZXhwYiIsCXR3bygweEYwMDAsIDB4NTgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cGQiLAl0d28oMHhGMDAwLCAweDU0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBsIiwJdHdvKDB4RjAwMCwgMHg0MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwcCIsCXR3bygweEYwMDAsIDB4NEMxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHMiLAl0d28oMHhGMDAwLCAweDQ0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB3IiwJdHdvKDB4RjAwMCwgMHg1MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDQ4MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZnZXRtYW5iIiwJdHdvKDB4RjAwMCwgMHg1ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFuZCIsCXR3bygweEYwMDAsIDB4NTQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbmwiLAl0d28oMHhGMDAwLCAweDQwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5wIiwJdHdvKDB4RjAwMCwgMHg0QzFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFucyIsCXR3bygweEYwMDAsIDB4NDQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnciLAl0d28oMHhGMDAwLCAweDUwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHgwMDFGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4NDgxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmludGIiLAl0d28oMHhGMDAwLCAweDU4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZpbnRkIiwJdHdvKDB4RjAwMCwgMHg1NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50bCIsCXR3bygweEYwMDAsIDB4NDAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmludHAiLAl0d28oMHhGMDAwLCAweDRDMDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZpbnRzIiwJdHdvKDB4RjAwMCwgMHg0NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50dyIsCXR3bygweEYwMDAsIDB4NTAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHg0ODAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmaW50cnpiIiwJdHdvKDB4RjAwMCwgMHg1ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpkIiwJdHdvKDB4RjAwMCwgMHg1NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpsIiwJdHdvKDB4RjAwMCwgMHg0MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpwIiwJdHdvKDB4RjAwMCwgMHg0QzAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpzIiwJdHdvKDB4RjAwMCwgMHg0NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp3IiwJdHdvKDB4RjAwMCwgMHg1MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHg0ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2cxMGIiLAl0d28oMHhGMDAwLCAweDU4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGQiLAl0d28oMHhGMDAwLCAweDU0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGwiLAl0d28oMHhGMDAwLCAweDQwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHAiLAl0d28oMHhGMDAwLCAweDRDMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHMiLAl0d28oMHhGMDAwLCAweDQ0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHciLAl0d28oMHhGMDAwLCAweDUwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDQ4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZzJiIiwJdHdvKDB4RjAwMCwgMHg1ODE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nMmQiLAl0d28oMHhGMDAwLCAweDU0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cybCIsCXR3bygweEYwMDAsIDB4NDAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJwIiwJdHdvKDB4RjAwMCwgMHg0QzE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnMiLAl0d28oMHhGMDAwLCAweDQ0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cydyIsCXR3bygweEYwMDAsIDB4NTAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDQ4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nbmIiLAl0d28oMHhGMDAwLCAweDU4MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2duZCIsCXR3bygweEYwMDAsIDB4NTQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25sIiwJdHdvKDB4RjAwMCwgMHg0MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAiLAl0d28oMHhGMDAwLCAweDRDMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducyIsCXR3bygweEYwMDAsIDB4NDQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ253IiwJdHdvKDB4RjAwMCwgMHg1MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4NDgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2ducDFiIiwJdHdvKDB4RjAwMCwgMHg1ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxZCIsCXR3bygweEYwMDAsIDB4NTQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMWwiLAl0d28oMHhGMDAwLCAweDQwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFwIiwJdHdvKDB4RjAwMCwgMHg0QzA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxcyIsCXR3bygweEYwMDAsIDB4NDQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXciLAl0d28oMHhGMDAwLCAweDUwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4NDgwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZm1vZGIiLAl0d28oMHhGMDAwLCAweDU4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZtb2RkIiwJdHdvKDB4RjAwMCwgMHg1NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kbCIsCXR3bygweEYwMDAsIDB4NDAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm1vZHAiLAl0d28oMHhGMDAwLCAweDRDMjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZtb2RzIiwJdHdvKDB4RjAwMCwgMHg0NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kdyIsCXR3bygweEYwMDAsIDB4NTAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm1vZHgiLAl0d28oMHhGMDAwLCAweDAwMjEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZtb2R4IiwJdHdvKDB4RjAwMCwgMHg0ODIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg3ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckYiIsIG1mbG9hdCB9LAoteyJmbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NzQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fkYiLCBtZmxvYXQgfSwKLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHg0MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDYwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRsIiwgbWZsb2F0IH0sCi0vKiBGSVhNRTogdGhlIG5leHQgdHdvIHZhcmlhbnRzIHNob3VsZCBub3QgcGVybWl0IG1vdmluZyBhbiBhZGRyZXNzCi0gICByZWdpc3RlciB0byBhbnl0aGluZyBidXQgdGhlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIHJlZ2lzdGVyLiAgKi8KLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbHM4IiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4NEMwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg2QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzAwKSwgIklpRjd+cGtDIiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4N0MwMCksIHR3bygweEYxQzAsIDB4RkMwRiksICJJaUY3fnBEayIsIG1mbG9hdCB9LAoteyJmbW92ZXMiLAl0d28oMHhGMDAwLCAweDQ0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NjQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGYiLCBtZmxvYXQgfSwKLXsiZm1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDcwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyR3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDY4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGN354IiwgbWZsb2F0IH0sCi0KLXsiZnNtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZm1vdmVjcngiLAl0d28oMHhGMDAwLCAweDVDMDApLCB0d28oMHhGMUZGLCAweEZDMDApLCAiSWkjQ0Y3IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaURrJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZGwzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCMzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKLQoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpTDh+cyIsIG1mbG9hdCB9LAotLyogRklYTUU6IEluIHRoZSBuZXh0IGluc3RydWN0aW9uLCB3ZSBzaG91bGQgb25seSBwZXJtaXQgJWRuIGlmIHRoZQotICAgdGFyZ2V0IGlzIGEgc2luZ2xlIHJlZ2lzdGVyLiAgV2Ugc2hvdWxkIG9ubHkgcGVybWl0ICVhbiBpZiB0aGUKLSAgIHRhcmdldCBpcyBhIHNpbmdsZSAlZnBpYXIuICAqLwoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKmxMOCIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEU4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWlEay1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQ4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWkmc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaXM4JXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKnNzOCIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYyQzAsIDB4RTNGRiksICJJaSpzTDgiLCBtZmxvYXQgfSwKLQoteyJmbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm11bGQiLAl0d28oMHhGMDAwLCAweDU0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbXVscCIsCXR3bygweEYwMDAsIDB4NEMyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbXVseCIsCXR3bygweEYwMDAsIDB4MDAyMyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnNtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc211bGwiLAl0d28oMHhGMDAwLCAweDQwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHciLAl0d28oMHhGMDAwLCAweDUwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDYzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVseCIsCXR3bygweEYwMDAsIDB4NDg2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZkbXVsYiIsCXR3bygweEYwMDAsIDB4NTg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bGQiLAl0d28oMHhGMDAwLCAweDU0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVscCIsCXR3bygweEYwMDAsIDB4NEM2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHMiLAl0d28oMHhGMDAwLCAweDQ0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVseCIsCXR3bygweEYwMDAsIDB4MDA2NyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHgiLAl0d28oMHhGMDAwLCAweDQ4NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmbmVnYiIsCXR3bygweEYwMDAsIDB4NTgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm5lZ2QiLAl0d28oMHhGMDAwLCAweDU0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbmVncCIsCXR3bygweEYwMDAsIDB4NEMxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3MiLAl0d28oMHhGMDAwLCAweDQ0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDQ4MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzbmVnYiIsCXR3bygweEYwMDAsIDB4NTg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ2QiLAl0d28oMHhGMDAwLCAweDU0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVncCIsCXR3bygweEYwMDAsIDB4NEM1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3MiLAl0d28oMHhGMDAwLCAweDQ0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4MDA1QSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDQ4NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4NDg1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmbm9wIiwJdHdvKDB4RjI4MCwgMHgwMDAwKSwgdHdvKDB4RkZGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi0KLXsiZnJlbWIiLAl0d28oMHhGMDAwLCAweDU4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZyZW1kIiwJdHdvKDB4RjAwMCwgMHg1NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtbCIsCXR3bygweEYwMDAsIDB4NDAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnJlbXAiLAl0d28oMHhGMDAwLCAweDRDMjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZyZW1zIiwJdHdvKDB4RjAwMCwgMHg0NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtdyIsCXR3bygweEYwMDAsIDB4NTAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnJlbXgiLAl0d28oMHhGMDAwLCAweDAwMjUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZyZW14IiwJdHdvKDB4RjAwMCwgMHg0ODI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZyZXN0b3JlIiwJb25lKDB4RjE0MCksCQlvbmUoMHhGMUMwKSwgIklkPHMiLCBtZmxvYXQgfSwKLQoteyJmc2F2ZSIsCW9uZSgweEYxMDApLAkJb25lKDB4RjFDMCksICJJZD5zIiwgbWZsb2F0IH0sCi0KLXsiZnNjYWxlYiIsCXR3bygweEYwMDAsIDB4NTgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlZCIsCXR3bygweEYwMDAsIDB4NTQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlbCIsCXR3bygweEYwMDAsIDB4NDAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcCIsCXR3bygweEYwMDAsIDB4NEMyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcyIsCXR3bygweEYwMDAsIDB4NDQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxldyIsCXR3bygweEYwMDAsIDB4NTAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4MDAyNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4NDgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQotLyogJCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgYXNzZW1ibGVyIGZyb20gdXNpbmcgUEMtcmVsYXRpdmUuCi0gICBJZiBAIHdlcmUgdXNlZCwgImxhYmVsOiBmc2VxIGxhYmVsIiBjb3VsZCBwcm9kdWNlICJmdHJhcGVxIiwKLSAgIGJlY2F1c2UgImxhYmVsIiBiZWNhbWUgInBjQGxhYmVsIi4gICovCi17ImZzZXEiLAl0d28oMHhGMDQwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2YiLAkJdHdvKDB4RjA0MCwgMHgwMDAwKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnZSIsCXR3bygweEYwNDAsIDB4MDAxMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2wiLAl0d28oMHhGMDQwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dsZSIsCXR3bygweEYwNDAsIDB4MDAxNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ3QiLAl0d28oMHhGMDQwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE1KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNsdCIsCXR3bygweEYwNDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmUiLAl0d28oMHhGMDQwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nZSIsCXR3bygweEYwNDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdsIiwJdHdvKDB4RjA0MCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ3QiLAl0d28oMHhGMDQwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25sZSIsCXR3bygweEYwNDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmx0IiwJdHdvKDB4RjA0MCwgMHgwMDFCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ2UiLAl0d28oMHhGMDQwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29nbCIsCXR3bygweEYwNDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2d0IiwJdHdvKDB4RjA0MCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvbGUiLAl0d28oMHhGMDQwLCAweDAwMDUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29sdCIsCXR3bygweEYwNDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb3IiLAl0d28oMHhGMDQwLCAweDAwMDcpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NlcSIsCXR3bygweEYwNDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc2YiLAl0d28oMHhGMDQwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NuZSIsCXR3bygweEYwNDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc3QiLAl0d28oMHhGMDQwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3QiLAkJdHdvKDB4RjA0MCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1ZXEiLAl0d28oMHhGMDQwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VnZSIsCXR3bygweEYwNDAsIDB4MDAwQiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWd0IiwJdHdvKDB4RjA0MCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1bGUiLAl0d28oMHhGMDQwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VsdCIsCXR3bygweEYwNDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdW4iLAl0d28oMHhGMDQwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAotCi17ImZzZ2xkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnciLAl0d28oMHhGMDAwLCAweDUwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDI0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNnbG11bGIiLAl0d28oMHhGMDAwLCAweDU4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsbCIsCXR3bygweEYwMDAsIDB4NDAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHAiLAl0d28oMHhGMDAwLCAweDRDMjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsdyIsCXR3bygweEYwMDAsIDB4NTAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDAwMjcpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2luYiIsCXR3bygweEYwMDAsIDB4NTgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2lucCIsCXR3bygweEYwMDAsIDB4NEMwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW53IiwJdHdvKDB4RjAwMCwgMHg1MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzaW5jb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2JGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO0ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2xGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3BGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3dGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDMwKSwgdHdvKDB4RjFDMCwgMHhFMDc4KSwgIklpRjhGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3hGM0Y3IiwgbWZsb2F0IH0sCi0KLXsiZnNpbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2luaGQiLAl0d28oMHhGMDAwLCAweDU0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5obCIsCXR3bygweEYwMDAsIDB4NDAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2luaHMiLAl0d28oMHhGMDAwLCAweDQ0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW5odyIsCXR3bygweEYwMDAsIDB4NTAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDQ4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4MDAwMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc3FydGIiLAl0d28oMHhGMDAwLCAweDU4MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3FydHAiLAl0d28oMHhGMDAwLCAweDRDMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3FydGIiLAl0d28oMHhGMDAwLCAweDU4NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHAiLAl0d28oMHhGMDAwLCAweDRDNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmc3ViYiIsCXR3bygweEYwMDAsIDB4NTgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnN1YmQiLAl0d28oMHhGMDAwLCAweDU0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3VicCIsCXR3bygweEYwMDAsIDB4NEMyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnN1YnMiLAl0d28oMHhGMDAwLCAweDQ0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4MDAyOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDQ4MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3ViYiIsCXR3bygweEYwMDAsIDB4NTg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YmQiLAl0d28oMHhGMDAwLCAweDU0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VicCIsCXR3bygweEYwMDAsIDB4NEM2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnMiLAl0d28oMHhGMDAwLCAweDQ0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4MDA2OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDQ4NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YmwiLAl0d28oMHhGMDAwLCAweDQwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnciLAl0d28oMHhGMDAwLCAweDUwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDZjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4NDg2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmdGFuYiIsCXR3bygweEYwMDAsIDB4NTgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGFucCIsCXR3bygweEYwMDAsIDB4NEMwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4MDAwRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0YW5oYiIsCXR3bygweEYwMDAsIDB4NTgwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5ocCIsCXR3bygweEYwMDAsIDB4NEMwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRlbnRveGIiLAl0d28oMHhGMDAwLCAweDU4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94bCIsCXR3bygweEYwMDAsIDB4NDAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHAiLAl0d28oMHhGMDAwLCAweDRDMTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94dyIsCXR3bygweEYwMDAsIDB4NTAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdHJhcGVxIiwJdHdvKDB4RjA3QywgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZiIsCXR3bygweEYwN0MsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdlIiwJdHdvKDB4RjA3QywgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2wiLAl0d28oMHhGMDdDLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGUiLAl0d28oMHhGMDdDLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBndCIsCXR3bygweEYwN0MsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGxlIiwJdHdvKDB4RjA3QywgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbHQiLAl0d28oMHhGMDdDLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZSIsCXR3bygweEYwN0MsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nZSIsCXR3bygweEYwN0MsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbCIsCXR3bygweEYwN0MsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGUiLAl0d28oMHhGMDdDLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ3QiLAl0d28oMHhGMDdDLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubGUiLAl0d28oMHhGMDdDLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubHQiLAl0d28oMHhGMDdDLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2UiLAl0d28oMHhGMDdDLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2wiLAl0d28oMHhGMDdDLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ3QiLAl0d28oMHhGMDdDLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbGUiLAl0d28oMHhGMDdDLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbHQiLAl0d28oMHhGMDdDLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvciIsCXR3bygweEYwN0MsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNlcSIsCXR3bygweEYwN0MsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNmIiwJdHdvKDB4RjA3QywgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc25lIiwJdHdvKDB4RjA3QywgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc3QiLAl0d28oMHhGMDdDLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB0IiwJdHdvKDB4RjA3QywgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWVxIiwJdHdvKDB4RjA3QywgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWdlIiwJdHdvKDB4RjA3QywgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWd0IiwJdHdvKDB4RjA3QywgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWxlIiwJdHdvKDB4RjA3QywgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWx0IiwJdHdvKDB4RjA3QywgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdW4iLAl0d28oMHhGMDdDLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLSAgICAgICAgCi17ImZ0cmFwZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBmdyIsCXR3bygweEYwN0EsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnbHciLAl0d28oMHhGMDdBLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZXciLAl0d28oMHhGMDdBLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGd0dyIsCXR3bygweEYwN0EsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBsdHciLAl0d28oMHhGMDdBLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ldyIsCXR3bygweEYwN0EsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdldyIsCXR3bygweEYwN0EsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsdyIsCXR3bygweEYwN0EsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZXciLAl0d28oMHhGMDdBLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndHciLAl0d28oMHhGMDdBLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZXciLAl0d28oMHhGMDdBLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdHciLAl0d28oMHhGMDdBLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZXciLAl0d28oMHhGMDdBLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbHciLAl0d28oMHhGMDdBLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndHciLAl0d28oMHhGMDdBLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZXciLAl0d28oMHhGMDdBLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdHciLAl0d28oMHhGMDdBLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ydyIsCXR3bygweEYwN0EsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxdyIsCXR3bygweEYwN0EsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2Z3IiwJdHdvKDB4RjA3QSwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzdHciLAl0d28oMHhGMDdBLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2V3IiwJdHdvKDB4RjA3QSwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3R3IiwJdHdvKDB4RjA3QSwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGV3IiwJdHdvKDB4RjA3QSwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bnciLAl0d28oMHhGMDdBLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAotCi17ImZ0cmFwZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBmbCIsCXR3bygweEYwN0IsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGwiLAl0d28oMHhGMDdCLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGd0bCIsCXR3bygweEYwN0IsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBsdGwiLAl0d28oMHhGMDdCLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5lbCIsCXR3bygweEYwN0IsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdlbCIsCXR3bygweEYwN0IsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsbCIsCXR3bygweEYwN0IsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndGwiLAl0d28oMHhGMDdCLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZWwiLAl0d28oMHhGMDdCLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdGwiLAl0d28oMHhGMDdCLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZWwiLAl0d28oMHhGMDdCLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbGwiLAl0d28oMHhGMDdCLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndGwiLAl0d28oMHhGMDdCLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZWwiLAl0d28oMHhGMDdCLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdGwiLAl0d28oMHhGMDdCLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ybCIsCXR3bygweEYwN0IsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxbCIsCXR3bygweEYwN0IsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2ZsIiwJdHdvKDB4RjA3QiwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzdGwiLAl0d28oMHhGMDdCLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2VsIiwJdHdvKDB4RjA3QiwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3RsIiwJdHdvKDB4RjA3QiwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGVsIiwJdHdvKDB4RjA3QiwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bmwiLAl0d28oMHhGMDdCLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAotCi17ImZ0c3RiIiwJdHdvKDB4RjAwMCwgMHg1ODNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2IiLCBtZmxvYXQgfSwKLXsiZnRzdGQiLAl0d28oMHhGMDAwLCAweDU0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RiIsIG1mbG9hdCB9LAoteyJmdHN0bCIsCXR3bygweEYwMDAsIDB4NDAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsIiwgbWZsb2F0IH0sCi17ImZ0c3RwIiwJdHdvKDB4RjAwMCwgMHg0QzNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3AiLCBtZmxvYXQgfSwKLXsiZnRzdHMiLAl0d28oMHhGMDAwLCAweDQ0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZiIsIG1mbG9hdCB9LAoteyJmdHN0dyIsCXR3bygweEYwMDAsIDB4NTAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3IiwgbWZsb2F0IH0sCi17ImZ0c3R4IiwJdHdvKDB4RjAwMCwgMHgwMDNBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjgiLCBtZmxvYXQgfSwKLXsiZnRzdHgiLAl0d28oMHhGMDAwLCAweDQ4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eCIsIG1mbG9hdCB9LAotCi17ImZ0d290b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94ZCIsCXR3bygweEYwMDAsIDB4NTQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveGwiLAl0d28oMHhGMDAwLCAweDQwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94cyIsCXR3bygweEYwMDAsIDB4NDQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHciLAl0d28oMHhGMDAwLCAweDUwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4NDgxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiaGFsdCIsCW9uZSgwMDQ1MzEwKSwJb25lKDAxNzc3NzcpLCAiIiwgICAgIG02ODA2MCB8IG1jZiB9LAotCi17ImlsbGVnYWwiLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwMDB1cCB9LAotCi17ImptcCIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqcmEiLAkJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpyYSIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqc3IiLAkJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiamJzciIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqYnNyIiwJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibGVhIiwJCW9uZSgwMDQwNzAwKSwJb25lKDAxNzA3MDApLCAiIXNBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHBzdG9wIiwJdHdvKDAxNzQwMDAsMDAwMDcwMCksdHdvKDAxNzc3NzcsMDE3Nzc3NyksIiN3IiwgY3B1MzJ8bTY4MDYwIH0sCi0KLXsibGlua3ciLAlvbmUoMDA0NzEyMCksCW9uZSgwMTc3NzcwKSwgIkFzI3ciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsaW5rbCIsCW9uZSgwMDQ0MDEwKSwJb25lKDAxNzc3NzApLCAiQXMjbCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsibGluayIsCW9uZSgwMDQ3MTIwKSwJb25lKDAxNzc3NzApLCAiQXMjVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxpbmsiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsibHNsYiIsCW9uZSgwMTYwNDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzbGIiLAlvbmUoMDE2MDQ1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjA1MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYwNTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MTcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc2xsIiwJb25lKDAxNjA2MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNsbCIsCW9uZSgwMTYwNjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHNyYiIsCW9uZSgwMTYwMDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzcmIiLAlvbmUoMDE2MDA1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjAxMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYwMTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MTMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc3JsIiwJb25lKDAxNjAyMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNybCIsCW9uZSgwMTYwMjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLSAgLyogRklYTUU6IGFkZCBNQU0gbW9kZSAoYCYnIGFmdGVyIDxlYT4gb3BlcmFuZCkgLyByZW1vdmUgTUFDTSAqLwoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI0MCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNDAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIyMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI0MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI1MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI0MCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIyMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI0MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI1MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQotLyogTk9URTogVGhlIG1jZjUyMDAgZmFtaWx5IHByb2dyYW1tZXIncyByZWZlcmVuY2UgbWFudWFsIGRvZXMgbm90IAotICAgaW5kaWNhdGUgdGhlIGJ5dGUgZm9ybSBvZiB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCAoYXMgaXQKLSAgIGlzIG9uIDY4MDAwIGZhbWlseSBjcHVzKS4gIEhvd2V2ZXIsIGV4cGVyaW1lbnRzIG9uIHRoZSA1MjAyIHllaWxkCi0gICB1bmV4cGVjdGVkIHJlc3VsdHMuICBUaGUgdmFsdWUgaXMgY29waWVkLCBidXQgaXQgaXMgbm90IHNpZ24gZXh0ZW5kZWQKLSAgIChhcyBpcyBkb25lIHdpdGggbW92ZWEudykgYW5kIHRoZSB0b3AgdGhyZWUgYnl0ZXMgaW4gdGhlIGFkZHJlc3MgCi0gICByZWdpc3RlciBhcmUgbm90IGRpc3R1cmJlZC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBpbnRlbmRlZAotICAgYmVoYXZpb3IgLS0tIGl0IGNvdWxkIGJlIGEgaG9sZSBpbiBpbnN0cnVjdGlvbiBkZWNvZGluZyAoTW90b3JvbGEKLSAgIGRlY2lkZWQgbm90IHRvIHRyYXAgYWxsIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvciBwZXJmb3JtYW5jZSByZWFzb25zKQotICAgLS0tIGJ1dCBJIHN1c3BlY3QgdGhhdCBpdCBpcyBub3QuICAgCi0KLSAgIEkgcmVwb3J0ZWQgdGhpcyB0byBNb3Rvcm9sYSBJU0QgVGVjaG5pY2FsIENvbW11bmljYXRpb25zIFN1cHBvcnQsIAotICAgd2hpY2ggcmVwbGllZCB0aGF0IG90aGVyIGNvbGRmaXJlIGFzc2VtYmxlcnMgcmVqZWN0IG1vdmVhLmIuICBGb3IgCi0gICB0aGlzIHJlYXNvbiBJJ3ZlIGRlY2lkZWQgdG8gbm90IGFsbG93IG1vdmVhYi4gCi0KLQlqdGNAY3lnbnVzLmNvbSAtIDk3LzAxLzI0Ci0gKi8KLQoteyJtb3ZlYWwiLAlvbmUoMDAyMDEwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJtb3ZlYXciLAlvbmUoMDAzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17Im1vdmVjIiwJb25lKDAwNDcxNzMpLAlvbmUoMDE3Nzc3NyksICJSMUpqIiwgbTY4MDEwdXAgfCBtY2YgfSwKLXsibW92ZWMiLAlvbmUoMDA0NzE3MyksCW9uZSgwMTc3Nzc3KSwgIlIxI2oiLCBtNjgwMTB1cCB8IG1jZiB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiSmpSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICIjalIxIiwgbTY4MDEwdXAgfSwKLQoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDI0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAotLyogRklYTUU6IG5lZWQgc3BlY2lmaWVyIGZvciBtb2RlIDIgYW5kIDUgdG8gc2ltcGxpZnkgYmVsb3cgaW5zbiBwYXR0ZXJucyAqLwoteyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIkx3YXMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzMjApLAlvbmUoMDE3Nzc3MCksICIjd2FzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzUwKSwJb25lKDAxNzc3NzApLCAiTHdkcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIiN3ZHMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhc0x3IiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXMjdyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzTHciLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzNTApLAlvbmUoMDE3Nzc3MCksICJkcyN3IiwgbWNmIH0sCi0KLXsibW92ZXB3IiwJb25lKDAwMDA0MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXB3IiwJb25lKDAwMDA2MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA1MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA3MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3ZlcSIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICIjQkRkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogVGhlIG1vdmUgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgbW92ZWEgYW5kIG1vdmVxIGluc3RydWN0aW9ucy4gICovCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICI7YiRkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9ibWQiLCBtY2YgfSwKLQoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3NzcwMCksICJTcyRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3NzApLCAiQ3NEcyIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzNzQpLAlvbmUoMDE3Nzc3NyksICIjd0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICI7d1NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2YgfSwKLQoteyJtb3ZlbCIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICIqbCVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9sbWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMDQ3MTUwKSwJb25lKDAxNzc3NzApLCAiVWRBcyIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAxMjA2MDApLAlvbmUoMDE3Nzc2MCksICJFc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0MDApLAlvbmUoMDE3Nzc2MCksICJSc0VzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEVzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ2MDApLAlvbmUoMDE3Nzc2MCksICJHc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0MDApLAlvbmUoMDE3Nzc2MCksICJSc0dzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEdzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY2MDApLAlvbmUoMDE3Nzc2MCksICJIc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0MDApLAlvbmUoMDE3Nzc2MCksICJSc0hzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEhzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ3MDApLAlvbmUoMDE3Nzc3NyksICJHc0NzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzAwKSwgIlNzJHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIjt3Q2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3Q2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dTZCIsIG1jZiB9LAotCi17Im1vdmUiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3Zlc2IiLAl0d28oMDAwNzAwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLXsibW92ZXN3IiwJdHdvKDAwMDcxMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi17Im1vdmVzbCIsCXR3bygwMDA3MjAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAotCi17Im1vdmUxNiIsCXR3bygweGY2MjAsIDB4ODAwMCksIHR3bygweGZmZjgsIDB4OGZmZiksICIrcysxIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYwMCksCQlvbmUoMHhmZmY4KSwgIitzX0wiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjA4KSwJCW9uZSgweGZmZjgpLCAiX0wrcyIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MTApLAkJb25lKDB4ZmZmOCksICJhc19MIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYxOCksCQlvbmUoMHhmZmY4KSwgIl9MYXMiLCBtNjgwNDB1cCB9LAotCi0gIC8qIEZJWE1FOiBhZGQgTUFNIG1vZGUgKGAmJyBhZnRlciA8ZWE+IG9wZXJhbmQpIC8gcmVtb3ZlIE1TQUNNICovCi17Im1zYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDAwMCwgMDAwMTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIyMCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI1MCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIzMCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIyMCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI1MCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIzMCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im1zYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDAwMCwgMDAwNTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIyMCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI1MCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIzMCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIyMCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI1MCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im11bHN3IiwJb25lKDAxNDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZiB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA2MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi0KLXsibXVsdXciLAlvbmUoMDE0MDMwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmIH0sCi17Im11bHVsIiwJdHdvKDAwNDYwMDAsMDAwMDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgInFzRDEiLCBtY2YgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDIwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJuYmNkIiwJb25lKDAwNDQwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLXsibmVnYiIsCW9uZSgwMDQyMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd3IiwJb25lKDAwNDIxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Z9LAotCi17Im5lZ3hiIiwJb25lKDAwNDAwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3h3IiwJb25lKDAwNDAxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZn0sCi0KLXsibm9wIiwJCW9uZSgwMDQ3MTYxKSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDAwdXAgfCBtY2Z9LAotCi17Im5vdGIiLAlvbmUoMDA0MzAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90dyIsCW9uZSgwMDQzMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmfSwKLQoteyJvcmliIiwJb25lKDAwMDAwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsib3JpYiIsCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaXciLAlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcml3IiwJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3JpbCIsCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JpIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaSIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcmkiLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIG9yIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG9yaSBpbnN0cnVjdGlvbi4gICovCi17Im9yYiIsCQlvbmUoMDAwMDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMTAwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDEwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAxMDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9ybCIsCQlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JsIiwJCW9uZSgwMTAwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im9ybCIsCQlvbmUoMDEwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJvciIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAotCi17InBhY2siLAlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQjdyIsIG02ODAyMHVwIH0sCi17InBhY2siLAlvbmUoMDEwMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQjdyIsIG02ODAyMHVwIH0sCi0KLXsicGJhYyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmFzIiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYXN3IiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYmMiLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJiY3ciLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJicyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmNjIiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiY2N3IiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiY3MiLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJjc3ciLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJnYyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmdzIiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiZ3N3IiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiaWMiLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJpY3ciLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJpcyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmxjIiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBibGN3IiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBibHMiLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJsc3ciLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJzYyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYnNzIiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBic3N3IiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBid2MiLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJ3Y3ciLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJ3cyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAotCi17InBkYmFjIiwJdHdvKDB4ZjA0OCwgMHgwMDA3KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYXMiLAl0d28oMHhmMDQ4LCAweDAwMDYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJiYyIsCXR3bygweGYwNDgsIDB4MDAwMSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmJzIiwJdHdvKDB4ZjA0OCwgMHgwMDAwKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiY2MiLAl0d28oMHhmMDQ4LCAweDAwMGYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJjcyIsCXR3bygweGYwNDgsIDB4MDAwZSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmdjIiwJdHdvKDB4ZjA0OCwgMHgwMDBkKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiZ3MiLAl0d28oMHhmMDQ4LCAweDAwMGMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJpYyIsCXR3bygweGYwNDgsIDB4MDAwYiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmlzIiwJdHdvKDB4ZjA0OCwgMHgwMDBhKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRibGMiLAl0d28oMHhmMDQ4LCAweDAwMDMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJscyIsCXR3bygweGYwNDgsIDB4MDAwMiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYnNjIiwJdHdvKDB4ZjA0OCwgMHgwMDA1KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRic3MiLAl0d28oMHhmMDQ4LCAweDAwMDQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJ3YyIsCXR3bygweGYwNDgsIDB4MDAwOSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYndzIiwJdHdvKDB4ZjA0OCwgMHgwMDA4KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLQoteyJwZWEiLAkJb25lKDAwNDQxMDApLAkJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cHxtY2YgfSwKLQoteyJwZmx1c2hhIiwJb25lKDB4ZjUxOCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLDB4MjQwMCksIHR3bygweGZmZmYsMHhmZmZmKSwgIiIsIG02ODAzMCB8IG02ODg1MSB9LAotCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCi0KLXsicGZsdXNoYW4iLAlvbmUoMHhmNTEwKSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAotCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLCB0d28oMHhmZmMwLCAweGZmZmYpLCAifHMiLCBtNjg4NTEgfSwKLQoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5JnMiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSZzIiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkmcyIsIG02ODg1MSB9LAotCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi0KLXsicGxwYXIiLAlvbmUoMHhmNWM4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLXsicGxwYXciLAlvbmUoMHhmNTg4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLQoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqbDA4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVjMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqdzE4IiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIipiMjgiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMDglcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1ZTAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMTglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIyOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIlc4fnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIip3WDMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiWDMlcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqd1k4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJZOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDY2MDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJaOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MDgwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwYTAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiMzglcyIsIG02ODAzMCB9LAotCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAiKmwwOCIsIG02ODAzMCB9LAoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzAgfSwKLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4MDkwMCksCXR3bygweGZmYzAsIDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCi0KLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLCAiPHMiLCBtNjg4NTEgfSwKLQoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksICI+cyIsIG02ODg1MSB9LAotCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLQoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIxMCksIHR3bygweGZmYzAsIDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwJb25lKDB4ZjU2OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMTApLCB0d28oMHhmZmMwLDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwJb25lKDB4ZjU0OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB1bHNlIiwJb25lKDAwNDUzMTQpLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDYwIHwgbWNmIH0sCi0KLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyODAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIlZzJnMiLCBtNjg4NTEgfSwKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyYzAwKSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwgIkEzJnMiLCBtNjg4NTEgfSwKLQotICAvKiBGSVhNRTogZG9uJ3QgYWxsb3cgRHc9PUR4LiAqLwoteyJyZW1zbCIsICAgICAgIHR3bygweDRjNDAsIDB4MDgwMCksICAgIHR3bygweGZmYzAsIDB4OGZmOCksICJ2c0QzRDEiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsicmVtdWwiLCAgICAgICB0d28oMHg0YzQwLCAweDAwMDApLCAgICB0d28oMHhmZmMwLCAweDhmZjgpLCAidnNEM0QxIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsicmVzZXQiLAlvbmUoMDA0NzE2MCksCQlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAotCi17InJvbGIiLAlvbmUoMDE2MDQzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sYiIsCW9uZSgwMTYwNDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjA1MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MDU3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYzNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb2xsIiwJb25lKDAxNjA2MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbGwiLAlvbmUoMDE2MDY3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3JiIiwJb25lKDAxNjAwMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcmIiLAlvbmUoMDE2MDA3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYwMTMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjAxNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MzMwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm9ybCIsCW9uZSgwMTYwMjMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3JsIiwJb25lKDAxNjAyNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicm94bGIiLAlvbmUoMDE2MDQyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGIiLAlvbmUoMDE2MDQ2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDUyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDU2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MjcwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDYyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDY2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3hyYiIsCW9uZSgwMTYwMDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hyYiIsCW9uZSgwMTYwMDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYyMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJ0ZCIsCQlvbmUoMDA0NzE2NCksCQlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAxMHVwIH0sCi0KLXsicnRlIiwJCW9uZSgwMDQ3MTYzKSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXB8bWNmIH0sCi0KLXsicnRtIiwJCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzYwKSwgIlJzIiwgbTY4MDIwIH0sCi0KLXsicnRyIiwJCW9uZSgwMDQ3MTY3KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXAgfSwKLQoteyJydHMiLAkJb25lKDAwNDcxNjUpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2YgfSwKLQoteyJzYmNkIiwJb25lKDAxMDA0MDApLAkJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InNiY2QiLAlvbmUoMDEwMDQxMCksCQlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQotCi17InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2NjIiwJCW9uZSgwMDUyMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2NzIiwJCW9uZSgwMDUyNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNmIiwJCW9uZSgwMDUwNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNnZSIsCQlvbmUoMDA1NjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNoaSIsCQlvbmUoMDA1MTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNsZSIsCQlvbmUoMDA1NzcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNsdCIsCQlvbmUoMDA1NjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNtaSIsCQlvbmUoMDA1NTcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNwbCIsCQlvbmUoMDA1NTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdCIsCQlvbmUoMDA1MDMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdnMiLAkJb25lKDAwNTQ3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAotCi17InN0b3AiLAlvbmUoMDA0NzE2MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJzdWJhbCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmF3IiwJb25lKDAxMTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLQoteyJzdWJpYiIsCW9uZSgwMDAyMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17InN1Yml3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpbCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAotCi17InN1YnFiIiwJb25lKDAwNTA0MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3VicXciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJxbCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIFRoZSBzdWIgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgc3ViYSwgc3ViaSwgYW5kIHN1YnEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsic3ViYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAxMTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDExMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJsIiwJb25lKDAxMTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsic3VieGIiLAlvbmUoMDExMDQwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4YiIsCW9uZSgwMTEwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17InN1Ynh3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsic3VieHciLAlvbmUoMDExMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4bCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJzd2FwIiwJb25lKDAwNDQxMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIHN3YmVnIGFuZCBzd2JlZ2wgYXJlIG1hZ2ljIGNvbnN0YW50cyB1c2VkIG9uIHN5c1Y2OC4gIFRoZSBjb21waWxlcgotICAgZ2VuZXJhdGVzIHRoZW0gYmVmb3JlIGEgc3dpdGNoIHRhYmxlLiAgVGhleSB0ZWxsIHRoZSBkZWJ1Z2dlciBhbmQKLSAgIGRpc2Fzc2VtYmxlciB0aGF0IGEgc3dpdGNoIHRhYmxlIGZvbGxvd3MuICBUaGUgcGFyYW1ldGVyIGlzIHRoZQotICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZS4gIHN3YmVnIG1lYW5zIHRoYXQgdGhlIGVudHJpZXMgaW4KLSAgIHRoZSB0YWJsZSBhcmUgd29yZCAoMiBieXRlKSBzaXplZCwgYW5kIHN3YmVnbCBtZWFucyB0aGF0IHRoZQotICAgZW50cmllcyBpbiB0aGUgdGFibGUgYXJlIGxvbmd3b3JkICg0IGJ5dGUpIHNpemVkLiAgKi8KLXsic3diZWciLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgICBtNjgwMDB1cCB8IG1jZiB9LAoteyJzd2JlZ2wiLAlvbmUoMDA0NTM3NSksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgICBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRhcyIsCQlvbmUoMDA0NTMwMCksCQlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLSNkZWZpbmUgVEJMMShuYW1lLHNpZ25lZCxyb3VuZCxzaXplKQkJCQkJXAotICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpfDAwMDA0MDApLAlcCi0gICAgIHR3bygwMTc3NzAwLDAxMDc3NzcpLCAiIXNEMSIsIGNwdTMyIH0sCQkJCVwKLSAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KSksCQlcCi0gICAgIHR3bygwMTc3NzcwLDAxMDc3NzApLCAiRHNEM0QxIiwgY3B1MzIgfQotI2RlZmluZSBUQkwobmFtZTEsIG5hbWUyLCBuYW1lMywgcywgcikgXAotICBUQkwxKG5hbWUxLCBzLCByLCAwKSwgVEJMMShuYW1lMiwgcywgciwgMSksIFRCTDEobmFtZTMsIHMsIHIsIDIpCi1UQkwoInRibHNiIiwgInRibHN3IiwgInRibHNsIiwgMSwgMSksCi1UQkwoInRibHNuYiIsICJ0YmxzbnciLCAidGJsc25sIiwgMSwgMCksCi1UQkwoInRibHViIiwgInRibHV3IiwgInRibHVsIiwgMCwgMSksCi1UQkwoInRibHVuYiIsICJ0Ymx1bnciLCAidGJsdW5sIiwgMCwgMCksCi0KLXsidHJhcCIsCW9uZSgwMDQ3MTAwKSwJb25lKDAxNzc3NjApLCAiVHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRyYXBjYyIsCW9uZSgwMDUyMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwY3MiLAlvbmUoMDA1Mjc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGVxIiwJb25lKDAwNTM3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBmIiwJb25lKDAwNTA3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIHwgbWNmIH0sCi17InRyYXBnZSIsCW9uZSgwMDU2Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZ3QiLAlvbmUoMDA1NzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGhpIiwJb25lKDAwNTEzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBsZSIsCW9uZSgwMDU3Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbHMiLAlvbmUoMDA1MTc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGx0IiwJb25lKDAwNTY3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBtaSIsCW9uZSgwMDU1Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbmUiLAlvbmUoMDA1MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHBsIiwJb25lKDAwNTUzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB0IiwJb25lKDAwNTAzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB2YyIsCW9uZSgwMDU0Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwdnMiLAlvbmUoMDA1NDc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJ0cmFwY2N3IiwJb25lKDAwNTIzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBjc3ciLAlvbmUoMDA1Mjc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGVxdyIsCW9uZSgwMDUzNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZnciLAlvbmUoMDA1MDc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmfSwKLXsidHJhcGdldyIsCW9uZSgwMDU2MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3R3IiwJb25lKDAwNTczNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaXciLAlvbmUoMDA1MTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxldyIsCW9uZSgwMDU3NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHN3IiwJb25lKDAwNTE3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdHciLAlvbmUoMDA1Njc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pdyIsCW9uZSgwMDU1NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmV3IiwJb25lKDAwNTMzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbHciLAlvbmUoMDA1NTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHR3IiwJb25lKDAwNTAzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y3ciLAlvbmUoMDA1NDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzdyIsCW9uZSgwMDU0NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXBjY2wiLAlvbmUoMDA1MjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzbCIsCW9uZSgwMDUyNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXFsIiwJb25lKDAwNTM3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmbCIsCW9uZSgwMDUwNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMnxtY2Z9LAoteyJ0cmFwZ2VsIiwJb25lKDAwNTYzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBndGwiLAlvbmUoMDA1NzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGhpbCIsCW9uZSgwMDUxMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbGVsIiwJb25lKDAwNTc3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsc2wiLAlvbmUoMDA1MTc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGx0bCIsCW9uZSgwMDU2NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbWlsIiwJb25lKDAwNTU3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBuZWwiLAlvbmUoMDA1MzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHBsbCIsCW9uZSgwMDU1MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdGwiLAlvbmUoMDA1MDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZjbCIsCW9uZSgwMDU0MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdnNsIiwJb25lKDAwNTQ3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsidHJhcHYiLAlvbmUoMDA0NzE2NiksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCi0KLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiO2IiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiJGIiLCBtNjgwMDB1cCB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIqdyIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIkdyIsIG02ODAwMHVwIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIipsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIiRsIiwgbTY4MDAwdXAgfSwKLQoteyJ1bmxrIiwJb25lKDAwNDcxMzApLAlvbmUoMDE3Nzc3MCksICJBcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsidW5wayIsCW9uZSgwMTAwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKLXsidW5wayIsCW9uZSgwMTAwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKLQoteyJ3ZGRhdGFiIiwJb25lKDAxNzIwMDApLCAgIG9uZSgwMTc3NzAwKSwgIn5zIiwgbWNmIH0sCi17IndkZGF0YXciLAlvbmUoMDE3MjEwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2YgfSwKLXsid2RkYXRhbCIsCW9uZSgwMTcyMjAwKSwgICBvbmUoMDE3NzcwMCksICJ+cyIsIG1jZiB9LAotCi19OwotCi1jb25zdCBpbnQgbTY4a19udW1vcGNvZGVzID0gc2l6ZW9mIG02OGtfb3Bjb2RlcyAvIHNpemVvZiBtNjhrX29wY29kZXNbMF07Ci0KLS8qIFRoZXNlIGFsaWFzZXMgdXNlZCB0byBiZSBpbiB0aGUgYWJvdmUgdGFibGUsIGVhY2ggb25lIGR1cGxpY2F0aW5nCi0gICBhbGwgb2YgdGhlIGVudHJpZXMgZm9yIGl0cyBwcmltYXJ5IGV4YWN0bHkuICBUaGlzIHRhYmxlIHdhcwotICAgY29uc3RydWN0ZWQgYnkgbWVjaGFuaWNhbCBwcm9jZXNzaW5nIG9mIHRoZSBvcGNvZGUgdGFibGUsIHdpdGggYQotICAgc21hbGwgbnVtYmVyIG9mIHR3ZWFrcyBkb25lIGJ5IGhhbmQuICBUaGVyZSBhcmUgcHJvYmFibHkgYSBsb3QgbW9yZQotICAgYWxpYXNlcyBhYm92ZSB0aGF0IGNvdWxkIGJlIG1vdmVkIGRvd24gaGVyZSwgZXhjZXB0IGZvciB2ZXJ5IG1pbm9yCi0gICBkaWZmZXJlbmNlcy4gICovCi0KLWNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW10gPQotewotICB7ICJhZGQiLAkiYWRkdyIsIH0sCi0gIHsgImFkZGEiLAkiYWRkYXciLCB9LAotICB7ICJhZGRpIiwJImFkZGl3IiwgfSwKLSAgeyAiYWRkcSIsCSJhZGRxdyIsIH0sCi0gIHsgImFkZHgiLAkiYWRkeHciLCB9LAotICB7ICJhc2wiLAkiYXNsdyIsIH0sCi0gIHsgImFzciIsCSJhc3J3IiwgfSwKLSAgeyAiYmhpIiwJImJoaXciLCB9LAotICB7ICJibHMiLAkiYmxzdyIsIH0sCi0gIHsgImJjYyIsCSJiY2N3IiwgfSwKLSAgeyAiYmNzIiwJImJjc3ciLCB9LAotICB7ICJibmUiLAkiYm5ldyIsIH0sCi0gIHsgImJlcSIsCSJiZXF3IiwgfSwKLSAgeyAiYnZjIiwJImJ2Y3ciLCB9LAotICB7ICJidnMiLAkiYnZzdyIsIH0sCi0gIHsgImJwbCIsCSJicGx3IiwgfSwKLSAgeyAiYm1pIiwJImJtaXciLCB9LAotICB7ICJiZ2UiLAkiYmdldyIsIH0sCi0gIHsgImJsdCIsCSJibHR3IiwgfSwKLSAgeyAiYmd0IiwJImJndHciLCB9LAotICB7ICJibGUiLAkiYmxldyIsIH0sCi0gIHsgImJyYSIsCSJicmF3IiwgfSwKLSAgeyAiYnNyIiwJImJzcnciLCB9LAotICB7ICJiaGliIiwJImJoaXMiLCB9LAotICB7ICJibHNiIiwJImJsc3MiLCB9LAotICB7ICJiY2NiIiwJImJjY3MiLCB9LAotICB7ICJiY3NiIiwJImJjc3MiLCB9LAotICB7ICJibmViIiwJImJuZXMiLCB9LAotICB7ICJiZXFiIiwJImJlcXMiLCB9LAotICB7ICJidmNiIiwJImJ2Y3MiLCB9LAotICB7ICJidnNiIiwJImJ2c3MiLCB9LAotICB7ICJicGxiIiwJImJwbHMiLCB9LAotICB7ICJibWliIiwJImJtaXMiLCB9LAotICB7ICJiZ2ViIiwJImJnZXMiLCB9LAotICB7ICJibHRiIiwJImJsdHMiLCB9LAotICB7ICJiZ3RiIiwJImJndHMiLCB9LAotICB7ICJibGViIiwJImJsZXMiLCB9LAotICB7ICJicmFiIiwJImJyYXMiLCB9LAotICB7ICJic3JiIiwJImJzcnMiLCB9LAotICB7ICJiaHMiLAkiYmNjdyIgfSwKLSAgeyAiYmhzcyIsCSJiY2NzIiB9LAotICB7ICJiaHNiIiwJImJjY3MiIH0sCi0gIHsgImJoc3ciLAkiYmNjdyIgfSwKLSAgeyAiYmhzbCIsCSJiY2NsIiB9LAotICB7ICJibG8iLAkiYmNzdyIgfSwKLSAgeyAiYmxvcyIsCSJiY3NzIiB9LAotICB7ICJibG9iIiwJImJjc3MiIH0sCi0gIHsgImJsb3ciLAkiYmNzdyIgfSwKLSAgeyAiYmxvbCIsCSJiY3NsIiB9LAotICB7ICJiciIsCSJicmF3IiwgfSwKLSAgeyAiYnJzIiwJImJyYXMiLCB9LAotICB7ICJicmIiLAkiYnJhcyIsIH0sCi0gIHsgImJydyIsCSJicmF3IiwgfSwKLSAgeyAiYnJsIiwJImJyYWwiLCB9LAotICB7ICJqZm5sdCIsCSJiY2MiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImpmbmd0IiwJImJsZSIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiamZlcSIsCSJiZXFzIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJiY2hnYiIsCSJiY2hnIiwgfSwKLSAgeyAiYmNoZ2wiLAkiYmNoZyIsIH0sCi0gIHsgImJjbHJiIiwJImJjbHIiLCB9LAotICB7ICJiY2xybCIsCSJiY2xyIiwgfSwKLSAgeyAiYnNldGIiLAkiYnNldCIsIH0sCi0gIHsgImJzZXRsIiwJImJzZXQiLCB9LAotICB7ICJidHN0YiIsCSJidHN0IiwgfSwKLSAgeyAiYnRzdGwiLAkiYnRzdCIsIH0sCi0gIHsgImNhczIiLAkiY2FzMnciLCB9LAotICB7ICJjYXMiLAkiY2FzdyIsIH0sCi0gIHsgImNoazIiLAkiY2hrMnciLCB9LAotICB7ICJjaGsiLAkiY2hrdyIsIH0sCi0gIHsgImNsciIsCSJjbHJ3IiwgfSwKLSAgeyAiY21wMiIsCSJjbXAydyIsIH0sCi0gIHsgImNtcGEiLAkiY21wYXciLCB9LAotICB7ICJjbXBpIiwJImNtcGl3IiwgfSwKLSAgeyAiY21wbSIsCSJjbXBtdyIsIH0sCi0gIHsgImNtcCIsCSJjbXB3IiwgfSwKLSAgeyAiZGJjY3ciLAkiZGJjYyIsIH0sCi0gIHsgImRiY3N3IiwJImRiY3MiLCB9LAotICB7ICJkYmVxdyIsCSJkYmVxIiwgfSwKLSAgeyAiZGJmdyIsCSJkYmYiLCB9LAotICB7ICJkYmdldyIsCSJkYmdlIiwgfSwKLSAgeyAiZGJndHciLAkiZGJndCIsIH0sCi0gIHsgImRiaGl3IiwJImRiaGkiLCB9LAotICB7ICJkYmxldyIsCSJkYmxlIiwgfSwKLSAgeyAiZGJsc3ciLAkiZGJscyIsIH0sCi0gIHsgImRibHR3IiwJImRibHQiLCB9LAotICB7ICJkYm1pdyIsCSJkYm1pIiwgfSwKLSAgeyAiZGJuZXciLAkiZGJuZSIsIH0sCi0gIHsgImRicGx3IiwJImRicGwiLCB9LAotICB7ICJkYnR3IiwJImRidCIsIH0sCi0gIHsgImRidmN3IiwJImRidmMiLCB9LAotICB7ICJkYnZzdyIsCSJkYnZzIiwgfSwKLSAgeyAiZGJocyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJoc3ciLAkiZGJjYyIsIH0sCi0gIHsgImRicmEiLAkiZGJmIiwgfSwKLSAgeyAiZGJyYXciLAkiZGJmIiwgfSwKLSAgeyAidGRpdnNsIiwJImRpdnNsIiwgfSwKLSAgeyAiZGl2cyIsCSJkaXZzdyIsIH0sCi0gIHsgImRpdnUiLAkiZGl2dXciLCB9LAotICB7ICJleHQiLAkiZXh0dyIsIH0sCi0gIHsgImV4dGJ3IiwJImV4dHciLCB9LAotICB7ICJleHR3bCIsCSJleHRsIiwgfSwKLSAgeyAiZmJuZXEiLAkiZmJuZSIsIH0sCi0gIHsgImZic25lcSIsCSJmYnNuZSIsIH0sCi0gIHsgImZkYm5lcSIsCSJmZGJuZSIsIH0sCi0gIHsgImZkYnNuZXEiLAkiZmRic25lIiwgfSwKLSAgeyAiZm1vdmVjciIsCSJmbW92ZWNyeCIsIH0sCi0gIHsgImZtb3ZtIiwJImZtb3ZlbSIsIH0sCi0gIHsgImZzbmVxIiwJImZzbmUiLCB9LAotICB7ICJmc3NuZXEiLAkiZnNzbmUiLCB9LAotICB7ICJmdHJhcG5lcSIsCSJmdHJhcG5lIiwgfSwKLSAgeyAiZnRyYXBzbmVxIiwgImZ0cmFwc25lIiwgfSwKLSAgeyAiZmpuZXEiLAkiZmpuZSIsIH0sCi0gIHsgImZqc25lcSIsCSJmanNuZSIsIH0sCi0gIHsgImptcGwiLAkiam1wIiwgfSwKLSAgeyAiam1wcyIsCSJqbXAiLCB9LAotICB7ICJqc3JsIiwJImpzciIsIH0sCi0gIHsgImpzcnMiLAkianNyIiwgfSwKLSAgeyAibGVhbCIsCSJsZWEiLCB9LAotICB7ICJsc2wiLAkibHNsdyIsIH0sCi0gIHsgImxzciIsCSJsc3J3IiwgfSwKLSAgeyAibWFjIiwJIm1hY3ciIH0sCi0gIHsgIm1vdmVhIiwJIm1vdmVhdyIsIH0sCi0gIHsgIm1vdmVtIiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm1sIiwJIm1vdmVtbCIsIH0sCi0gIHsgIm1vdm13IiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm0iLAkibW92ZW13IiwgfSwKLSAgeyAibW92ZXAiLAkibW92ZXB3IiwgfSwKLSAgeyAibW92cHciLAkibW92ZXB3IiwgfSwKLSAgeyAibW92ZXMiLAkibW92ZXN3IiB9LAotICB7ICJtdWxzIiwJIm11bHN3IiwgfSwKLSAgeyAibXVsdSIsCSJtdWx1dyIsIH0sCi0gIHsgIm1zYWMiLAkibXNhY3ciIH0sCi0gIHsgIm5iY2RiIiwJIm5iY2QiIH0sCi0gIHsgIm5lZyIsCSJuZWd3IiwgfSwKLSAgeyAibmVneCIsCSJuZWd4dyIsIH0sCi0gIHsgIm5vdCIsCSJub3R3IiwgfSwKLSAgeyAicGVhbCIsCSJwZWEiLCB9LAotICB7ICJyb2wiLAkicm9sdyIsIH0sCi0gIHsgInJvciIsCSJyb3J3IiwgfSwKLSAgeyAicm94bCIsCSJyb3hsdyIsIH0sCi0gIHsgInJveHIiLAkicm94cnciLCB9LAotICB7ICJzYmNkYiIsCSJzYmNkIiwgfSwKLSAgeyAic2NjYiIsCSJzY2MiLCB9LAotICB7ICJzY3NiIiwJInNjcyIsIH0sCi0gIHsgInNlcWIiLAkic2VxIiwgfSwKLSAgeyAic2ZiIiwJInNmIiwgfSwKLSAgeyAic2dlYiIsCSJzZ2UiLCB9LAotICB7ICJzZ3RiIiwJInNndCIsIH0sCi0gIHsgInNoaWIiLAkic2hpIiwgfSwKLSAgeyAic2xlYiIsCSJzbGUiLCB9LAotICB7ICJzbHNiIiwJInNscyIsIH0sCi0gIHsgInNsdGIiLAkic2x0IiwgfSwKLSAgeyAic21pYiIsCSJzbWkiLCB9LAotICB7ICJzbmViIiwJInNuZSIsIH0sCi0gIHsgInNwbGIiLAkic3BsIiwgfSwKLSAgeyAic3RiIiwJInN0IiwgfSwKLSAgeyAic3ZjYiIsCSJzdmMiLCB9LAotICB7ICJzdnNiIiwJInN2cyIsIH0sCi0gIHsgInNmZ2UiLAkic2dlIiwgfSwKLSAgeyAic2ZndCIsCSJzZ3QiLCB9LAotICB7ICJzZmxlIiwJInNsZSIsIH0sCi0gIHsgInNmbHQiLAkic2x0IiwgfSwKLSAgeyAic2ZuZXEiLAkic25lIiwgfSwKLSAgeyAic3ViYSIsCSJzdWJhdyIsIH0sCi0gIHsgInN1YmkiLAkic3ViaXciLCB9LAotICB7ICJzdWJxIiwJInN1YnF3IiwgfSwKLSAgeyAic3ViIiwJInN1YnciLCB9LAotICB7ICJzdWJ4IiwJInN1Ynh3IiwgfSwKLSAgeyAic3dhcHciLAkic3dhcCIsIH0sCi0gIHsgInRhc2IiLAkidGFzIiwgfSwKLSAgeyAidHBjYyIsCSJ0cmFwY2MiLCB9LAotICB7ICJ0Y2MiLAkidHJhcGNjIiwgfSwKLSAgeyAidHN0IiwJInRzdHciLCB9LAotICB7ICJqYnJhIiwJImpyYSIsIH0sCi0gIHsgImpiaGkiLAkiamhpIiwgfSwKLSAgeyAiamJscyIsCSJqbHMiLCB9LAotICB7ICJqYmNjIiwJImpjYyIsIH0sCi0gIHsgImpiY3MiLAkiamNzIiwgfSwKLSAgeyAiamJuZSIsCSJqbmUiLCB9LAotICB7ICJqYmVxIiwJImplcSIsIH0sCi0gIHsgImpidmMiLAkianZjIiwgfSwKLSAgeyAiamJ2cyIsCSJqdnMiLCB9LAotICB7ICJqYnBsIiwJImpwbCIsIH0sCi0gIHsgImpibWkiLAkiam1pIiwgfSwKLSAgeyAiamJnZSIsCSJqZ2UiLCB9LAotICB7ICJqYmx0IiwJImpsdCIsIH0sCi0gIHsgImpiZ3QiLAkiamd0IiwgfSwKLSAgeyAiamJsZSIsCSJqbGUiLCB9LAotICB7ICJtb3ZxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmVxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmwiLAkibW92ZWwiLCB9LAotICB7ICJtb3ZxIiwJIm1vdmVxIiwgfSwKLSAgeyAibW92YWwiLAkibW92ZWFsIiwgfSwKLSAgeyAibW92YXciLAkibW92ZWF3IiwgfSwKLSAgeyAibW92YiIsCSJtb3ZlYiIsIH0sCi0gIHsgIm1vdmMiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZlY2wiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZwbCIsCSJtb3ZlcGwiLCB9LAotICB7ICJtb3Z3IiwJIm1vdmV3IiwgfSwKLSAgeyAibW92c2IiLAkibW92ZXNiIiwgfSwKLSAgeyAibW92c2wiLAkibW92ZXNsIiwgfSwKLSAgeyAibW92c3ciLAkibW92ZXN3IiwgfSwKLQotICB7ICJ0ZGl2dWwiLAkiZGl2dWwiLCB9LAkvKiBmb3IgbTY4ay1zdnI0ICovCi0gIHsgImZtb3ZiIiwJImZtb3ZlYiIsIH0sCi0gIHsgImZzbW92YiIsCSJmc21vdmViIiwgfSwKLSAgeyAiZmRtb3ZiIiwJImZkbW92ZWIiLCB9LAotICB7ICJmbW92ZCIsCSJmbW92ZWQiLCB9LAotICB7ICJmc21vdmQiLAkiZnNtb3ZlZCIsIH0sCi0gIHsgImZtb3ZsIiwJImZtb3ZlbCIsIH0sCi0gIHsgImZzbW92bCIsCSJmc21vdmVsIiwgfSwKLSAgeyAiZmRtb3ZsIiwJImZkbW92ZWwiLCB9LAotICB7ICJmbW92cCIsCSJmbW92ZXAiLCB9LAotICB7ICJmc21vdnAiLAkiZnNtb3ZlcCIsIH0sCi0gIHsgImZkbW92cCIsCSJmZG1vdmVwIiwgfSwKLSAgeyAiZm1vdnMiLAkiZm1vdmVzIiwgfSwKLSAgeyAiZnNtb3ZzIiwJImZzbW92ZXMiLCB9LAotICB7ICJmZG1vdnMiLAkiZmRtb3ZlcyIsIH0sCi0gIHsgImZtb3Z3IiwJImZtb3ZldyIsIH0sCi0gIHsgImZzbW92dyIsCSJmc21vdmV3IiwgfSwKLSAgeyAiZmRtb3Z3IiwJImZkbW92ZXciLCB9LAotICB7ICJmbW92eCIsCSJmbW92ZXgiLCB9LAotICB7ICJmc21vdngiLAkiZnNtb3ZleCIsIH0sCi0gIHsgImZkbW92eCIsCSJmZG1vdmV4IiwgfSwKLSAgeyAiZm1vdmNyIiwJImZtb3ZlY3IiLCB9LAotICB7ICJmbW92Y3J4IiwJImZtb3ZlY3J4IiwgfSwKLSAgeyAiZnRlc3RiIiwJImZ0c3RiIiwgfSwKLSAgeyAiZnRlc3RkIiwJImZ0c3RkIiwgfSwKLSAgeyAiZnRlc3RsIiwJImZ0c3RsIiwgfSwKLSAgeyAiZnRlc3RwIiwJImZ0c3RwIiwgfSwKLSAgeyAiZnRlc3RzIiwJImZ0c3RzIiwgfSwKLSAgeyAiZnRlc3R3IiwJImZ0c3R3IiwgfSwKLSAgeyAiZnRlc3R4IiwJImZ0c3R4IiwgfSwKLX07Ci0KLWNvbnN0IGludCBtNjhrX251bWFsaWFzZXMgPQotICBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlcyAvIHNpemVvZiBtNjhrX29wY29kZV9hbGlhc2VzWzBdOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tODhrLWRpcy5jIGIvb3Bjb2Rlcy9tODhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNmMzJhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTg4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKiBQcmludCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMCwgZm9yIEdEQiBhbmQgR05VIEJpbnV0aWxzLgotICAgQ29weXJpZ2h0IChjKSAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdGEgR2VuZXJhbCBDb3Jwb3JhdGlvbiwgTm92ZW1iZXIgMTk4OS4KLSAgIFBhcnRpYWxseSBkZXJpdmVkIGZyb20gYW4gZWFybGllciBwcmludGNtZC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIHRoZSBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL204OGsuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotSU5TVEFCICAqaGFzaHRhYmxlW0hBU0hWQUxdID0gezB9OwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50b3AgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgT1BTUEVDICosCi0JCSB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWluaXRfZGlzYXNtIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWluc3RhbGwgUEFSQU1TICgoSU5TVEFCICppbnN0cHRyKSk7Ci0KLS8qCi0qCQlEaXNhc3NlbWJsZSBhbiBNODgwMDAgSW5zdHJ1Y3Rpb24KLSoKLSoKLSogICAgICAgVGhpcyBtb2R1bGUgZGVjb2RlcyB0aGUgaW5zdHJ1Y3Rpb24gYXQgbWVtYWRkci4KLSoKLSoJCQlSZXZpc2lvbiBIaXN0b3J5Ci0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZSBieSBNb3Rvcm9sYQotKgkJCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCB0byBHREIgaW50ZXJmYWNlLgotKgkJCTA3LzEyLzkzCUlhbiBMYW5jZSBUYXlsb3IgdXBkYXRlZCB0bwotKgkJCQkJYmludXRpbHMgaW50ZXJmYWNlLgotKi8KLQotaW50Ci1wcmludF9pbnNuX204OGsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBJbnN0cnVjdGlvbiBhZGRyZXNzZXMgbWF5IGhhdmUgbG93IHR3byBiaXRzIHNldC4gQ2xlYXIgdGhlbS4JKi8KLSAgbWVtYWRkciAmPX4gKGJmZF92bWEpIDM7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gbTg4a2RpcyAobWVtYWRkciwgYmZkX2dldGIzMiAoYnVmZmVyKSwgaW5mbyk7Ci19Ci0KLS8qCi0gKiBkaXNhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24gaW4gJ2luc3RydWN0aW9uJy4KLSAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKLSAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAotICogdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyB3cml0dGVuIHRvICdpbmZvJy4KLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIChwYywgaW5zdHJ1Y3Rpb24sIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgaW50IGloYXNodGFiX2luaXRpYWxpemVkID0gMDsKLSAgdW5zaWduZWQgaW50IG9wY29kZTsKLSAgSU5TVEFCICplbnRyeV9wdHI7Ci0gIGludCBvcG1hc2s7Ci0gIHVuc2lnbmVkIGludCBjbGFzczsKLQotICBpZiAoISBpaGFzaHRhYl9pbml0aWFsaXplZCkKLSAgICBpbml0X2Rpc2FzbSAoKTsKLQotICAvKiBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gaXNvbGF0ZSB0aGUgb3Bjb2RlICovCi0gIG9wbWFzayA9IERFRk1BU0s7Ci0gIGNsYXNzID0gaW5zdHJ1Y3Rpb24gJiBERUZNQVNLOwotICBpZiAoKGNsYXNzID49IFNGVTApICYmIChjbGFzcyA8PSBTRlU3KSkKLSAgICB7Ci0gICAgICBpZiAoaW5zdHJ1Y3Rpb24gPCBTRlUxKQotCW9wbWFzayA9IENUUkxNQVNLOwotICAgICAgZWxzZQotCW9wbWFzayA9IFNGVU1BU0s7Ci0gICAgfQotICBlbHNlIGlmIChjbGFzcyA9PSBSUlIpCi0gICAgb3BtYXNrID0gUlJSTUFTSzsKLSAgZWxzZSBpZiAoY2xhc3MgPT0gUlJJMTApCi0gICAgb3BtYXNrID0gUlJJMTBNQVNLOwotCi0gIC8qIGlzb2xhdGUgdGhlIG9wY29kZSAqLwotICBvcGNvZGUgPSBpbnN0cnVjdGlvbiAmIG9wbWFzazsKLQotICAvKiBzZWFyY2ggdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgaXNvbGF0ZWQgb3Bjb2RlICovCi0gIGZvciAoZW50cnlfcHRyID0gaGFzaHRhYmxlW29wY29kZSAlIEhBU0hWQUxdOwotICAgICAgIChlbnRyeV9wdHIgIT0gTlVMTCkgJiYgKGVudHJ5X3B0ci0+b3Bjb2RlICE9IG9wY29kZSk7Ci0gICAgICAgZW50cnlfcHRyID0gZW50cnlfcHRyLT5uZXh0KQotICAgIDsKLQotICBpZiAoZW50cnlfcHRyID09IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ3b3JkXHQlMDh4IiwgaW5zdHJ1Y3Rpb24pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGVudHJ5X3B0ci0+bW5lbW9uaWMpOwotICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMSksIGluc3RydWN0aW9uLCBwYywgMSk7Ci0gICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AyKSwgaW5zdHJ1Y3Rpb24sIHBjLCAwKTsKLSAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDMpLCBpbnN0cnVjdGlvbiwgcGMsIDApOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KLQwKLS8qCi0qICAgICAgICAgICAgICAgICAgICAgIERlY29kZSBhbiBPcGVyYW5kIG9mIGFuIEluc3RydWN0aW9uCi0qCi0qCQkJRnVuY3Rpb25hbCBEZXNjcmlwdGlvbgotKgotKiAgICAgICBUaGlzIG1vZHVsZSBmb3JtYXRzIGFuZCB3cml0ZXMgYW4gb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiB0byBpbmZvCi0qICAgICAgIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHNwZWNpZmljYXRpb24uICBXaGVuIHRoZSBmaXJzdCBmbGFnIGlzIHNldCB0aGlzCi0qICAgICAgIGlzIHRoZSBmaXJzdCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uLiAgVW5kZWZpbmVkIG9wZXJhbmQgdHlwZXMKLSogICAgICAgY2F1c2UgYSA8ZGlzIGVycm9yPiBtZXNzYWdlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoJZGlzYXNzZW1ibGVfaW5mbwl3aGVyZSB0aGUgb3BlcmFuZCBtYXkgYmUgcHJpbnRlZAotKiAgICAgICBPUFNQRUMgICpvcHB0ciAgICAgICAgICBQb2ludGVyIHRvIGFuIG9wZXJhbmQgc3BlY2lmaWNhdGlvbgotKiAgICAgICBVSU5UICAgIGluc3QgICAgICAgICAgICBJbnN0cnVjdGlvbiBmcm9tIHdoaWNoIG9wZXJhbmQgaXMgZXh0cmFjdGVkCi0qCVVJTlQgICAgcGMJCVBDIG9mIGluc3RydWN0aW9uOyB1c2VkIGZvciBwYy1yZWxhdGl2ZSBkaXNwLgotKiAgICAgICBpbnQgICAgIGZpcnN0ICAgICAgICAgICBGbGFnIHdoaWNoIGlmIG5vbnplcm8gaW5kaWNhdGVzIHRoZSBmaXJzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uCi0qCi0qCQkJT3V0cHV0Ci0qCi0qICAgICAgIFRoZSBvcGVyYW5kIHNwZWNpZmllZCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGlzCi0qICAgICAgIHdyaXR0ZW4gdG8gYnVmIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkLiBUaGUgb3BlcmFuZCBpcyBwcmVjZWRlZAotKiAgICAgICBieSBhIGNvbW1hIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiBhbmQgaXQKLSogICAgICAgaXMgbm90IGEgcmVnaXN0ZXIgaW5kaXJlY3QgZm9ybS4gIFJlZ2lzdGVycyBhcmUgcHJlY2VkZWQgYnkgJ3InIGFuZAotKiAgICAgICBoZXggdmFsdWVzIGJ5ICcweCcuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1wcmludG9wIChpbmZvLCBvcHB0ciwgaW5zdCwgcGMsIGZpcnN0KQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgT1BTUEVDICpvcHB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnN0OwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIGludCBleHRyYWN0ZWRfZmllbGQ7Ci0gIGNoYXIgKmNvbmRfbWFza19zeW07Ci0KLSAgaWYgKG9wcHRyLT53aWR0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoISBmaXJzdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wcHRyLT50eXBlKQotCXsKLQljYXNlIFJFR1NDOgotCWNhc2UgQ09OVDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChvcHB0ci0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZmNyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUdTQzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiW3IlZF0iLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFhSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInglZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhFWDoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBpZiAoZXh0cmFjdGVkX2ZpZWxkID09IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCUwMngiLCBleHRyYWN0ZWRfZmllbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT05ETUFTSzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBzd2l0Y2ggKGV4dHJhY3RlZF9maWVsZCAmIDB4MGYpCi0JewotCWNhc2UgMHgxOiBjb25kX21hc2tfc3ltID0gImd0MCI7IGJyZWFrOwotCWNhc2UgMHgyOiBjb25kX21hc2tfc3ltID0gImVxMCI7IGJyZWFrOwotCWNhc2UgMHgzOiBjb25kX21hc2tfc3ltID0gImdlMCI7IGJyZWFrOwotCWNhc2UgMHhjOiBjb25kX21hc2tfc3ltID0gImx0MCI7IGJyZWFrOwotCWNhc2UgMHhkOiBjb25kX21hc2tfc3ltID0gIm5lMCI7IGJyZWFrOwotCWNhc2UgMHhlOiBjb25kX21hc2tfc3ltID0gImxlMCI7IGJyZWFrOwotCWRlZmF1bHQ6IGNvbmRfbWFza19zeW0gPSBOVUxMOyBicmVhazsKLQl9Ci0gICAgICBpZiAoY29uZF9tYXNrX3N5bSAhPSBOVUxMKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb25kX21hc2tfc3ltKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCQkJCi0gICAgY2FzZSBQQ1JFTDoKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCShwYyArICg0ICogKFNFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpKSwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09OVDoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQsciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSksCi0JCQkgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRjoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQ8JWQ+IiwKLQkJCSAgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpLAotCQkJICAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCIjIDxkaXMgZXJyb3I6ICUwOHg+IiksIGluc3QpOwotICAgIH0KLX0KLQotLyoKLSogICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIERpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotKgotKiAgICAgICBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGFuZCBpbnN0cnVjdGlvbiB0YWJsZSBmb3IgdGhlIGRpc2Fzc2VtYmxlci4KLSogICAgICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGRpc2FzbSgpLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSoJCQlPdXRwdXQKLSoKLSogICAgICAgSWYgdGhlIGRlYnVnIG9wdGlvbiBpcyBzZWxlY3RlZCwgY2VydGFpbiBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXNoaW5nCi0qICAgICAgIGRpc3RyaWJ1dGlvbiBhcmUgd3JpdHRlbiB0byBzdGRvdXQuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2Rpc2FzbSAoKQotewotICAgaW50IGksIHNpemU7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBIQVNIVkFMOyBpKyspCi0gICAgIGhhc2h0YWJsZVtpXSA9IE5VTEw7Ci0KLSAgIHNpemUgPSBzaXplb2YgKGluc3RydWN0aW9ucykgLyBzaXplb2YgKElOU1RBQik7Ci0gICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICBpbnN0YWxsICgmaW5zdHJ1Y3Rpb25zW2ldKTsKLX0KLQotLyoKLSogICAgICAgSW5zZXJ0IGFuIGluc3RydWN0aW9uIGludG8gdGhlIGRpc2Fzc2VtYmxlciB0YWJsZSBieSBoYXNoaW5nIHRoZQotKiAgICAgICBvcGNvZGUgYW5kIGluc2VydGluZyBpdCBpbnRvIHRoZSBsaW5rZWQgbGlzdCBmb3IgdGhhdCBoYXNoIHZhbHVlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSogICAgICAgSU5TVEFCICppbnN0cHRyICAgICAgICAgUG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZAotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSoJCQkwNS8xMS84OQlSLiBUUkFXSUNLIEFEQVBURUQgRlJPTSBNT1RPUk9MQQotKi8KLQotc3RhdGljIHZvaWQKLWluc3RhbGwgKGluc3RwdHIpCi0gICAgIElOU1RBQiAqaW5zdHB0cjsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaSA9IChpbnN0cHRyLT5vcGNvZGUpICUgSEFTSFZBTDsKLSAgaW5zdHB0ci0+bmV4dCA9IGhhc2h0YWJsZVtpXTsKLSAgaGFzaHRhYmxlW2ldID0gaW5zdHB0cjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWFrZWZpbGUudm1zIGIvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODcwNDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBsaWJvcGNvZGVzIHVuZGVyIG9wZW5WTVMgVkFYIGFuZCBBbHBoYQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLSMKLWlmZXEgKCQoQVJDSCksYWxwaGEpCi1PQkpTPWFscGhhLWRpcy5vYmosYWxwaGEtb3BjLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKLUZPUk1BVD1PQkpfRVZBWAotQVJDSERFRj0iQVJDSF9hbHBoYSIKLWVsc2UKLU9CSlM9dmF4LWRpcy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX1ZBWAotQVJDSERFRj0iQVJDSF92YXgiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSkKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi1saWJvcGNvZGVzLm9sYjogc3lzZGVwLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJvcGNvZGVzICoub2JqCi0KLWRpc2Fzc2VtYmxlLm9iajogZGlzYXNzZW1ibGUuYwotCSQoQ0MpJChDRkxBR1MpL2RlZmluZT0oJChBUkNIREVGKSkgJDwKLQotc3lzZGVwLmg6IFstLmJmZC5ob3N0c10kKEFSQ0gpdm1zLmgKLQkkKENQKSAkPCAkQAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGxpYm9wY29kZXMub2xiOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1kaXMuYyBiL29wY29kZXMvbWNvcmUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjEyNGYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNb3Rvcm9sYSBNKkNvcmUgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAibWNvcmUtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0vKiBNYXNrIGZvciBlYWNoIG1jb3JlX29wY2xhc3M6ICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW1za1tdID0KLXsKLSAgICAvKiBPMCAgKi8gMHhGRkZGLAotICAgIC8qIE9UICAqLyAweEZGRkMsCi0gICAgLyogTzEgICovIDB4RkZGMCwKLSAgICAvKiBPQyAgKi8gMHhGRkUwLAotICAgIC8qIE8yICAqLyAweEZGMDAsCi0gICAgLyogWDEgICovIDB4RkZGMCwKLSAgICAvKiBPSSAgKi8gMHhGRTAwLAotICAgIC8qIE9CICAqLyAweEZFMDAsCi0JICAgICAgCi0gICAgLyogT01hICovIDB4RkZGMCwKLSAgICAvKiBTSSAgKi8gMHhGRTAwLAotICAgIC8qIEk3ICAqLyAweEY4MDAsCi0gICAgLyogTFMgICovIDB4RjAwMCwKLSAgICAvKiBCUiAgKi8gMHhGODAwLAotICAgIC8qIEJMICAqLyAweEZGMDAsCi0gICAgLyogTFIgICovIDB4RjAwMCwKLSAgICAvKiBMSiAgKi8gMHhGRjAwLAotCSAgICAgIAotICAgIC8qIFJNICAqLyAweEZGRjAsCi0gICAgLyogUlEgICovIDB4RkZGMCwKLSAgICAvKiBKU1IgKi8gMHhGRkYwLAotICAgIC8qIEpNUCAqLyAweEZGRjAsCi0gICAgLyogT0JSYSovIDB4RkZGMCwKLSAgICAvKiBPQlJiKi8gMHhGRjgwLAotICAgIC8qIE9CUmMqLyAweEZGMDAsCi0gICAgLyogT0JSMiovIDB4RkUwMCwKLQkgICAgICAKLSAgICAvKiBPMVIxKi8gMHhGRkYwLAotICAgIC8qIE9NYiAqLyAweEZGODAsCi0gICAgLyogT01jICovIDB4RkYwMCwKLSAgICAvKiBTSWEgKi8gMHhGRTAwLAotCi0gIC8qIE1VTFNIICovIDB4RkYwMCwgICAgCi0gIC8qIE9QU1IgICovIDB4RkZGOCwgICAvKiBwc3JzZXQvcHNyY2xyICovCi0JCSAKLSAgICAvKiBKQyAgKi8gMCwJCS8qIEpDLEpVLEpMIGRvbid0IGFwcGVhciBpbiBvYmplY3QgKi8KLSAgICAvKiBKVSAgKi8gMCwKLSAgICAvKiBKTCAgKi8gMCwKLSAgICAvKiBSU0kgKi8gMCwKLSAgICAvKiBETzIxKi8gMCwKLSAgICAvKiBPQjIgKi8gMCAJCS8qIE9CMiB3b24ndCBhcHBlYXIgaW4gb2JqZWN0LiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBncm5hbWVbXSA9Ci17Ci0gInIwIiwgICJyMSIsICAicjIiLCAgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsCi0gInI4IiwgICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIFhbXSA9ICI/PyI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY3JuYW1lW10gPQotewotICAicHNyIiwgICJ2YnIiLCAiZXBzciIsICJmcHNyIiwgImVwYyIsICAiZnBjIiwgICJzczAiLCAgInNzMSIsCi0gICJzczIiLCAgInNzMyIsICJzczQiLCAgImdjciIsICAiZ3NyIiwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWCwKLSAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpc2l6W10gPSB7IDIsIDAsIDEsIDAgfTsKLQotaW50IAotcHJpbnRfaW5zbl9tY29yZSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICAgaWJ5dGVzWzRdOwotICBmcHJpbnRmX2Z0eXBlICAgICAgIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKiAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBzaG9ydCAgICAgIGluc3Q7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3A7Ci0gIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaWJ5dGVzLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIGluc3QgPSAoaWJ5dGVzWzBdIDw8IDgpIHwgaWJ5dGVzWzFdOwotICBlbHNlIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgaW5zdCA9IChpYnl0ZXNbMV0gPDwgOCkgfCBpYnl0ZXNbMF07Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICAvKiBKdXN0IGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgdGFibGUuICAqLwotICBmb3IgKG9wID0gbWNvcmVfdGFibGU7IG9wLT5uYW1lICE9IDA7IG9wICsrKQotICAgIGlmIChvcC0+aW5zdCA9PSAoaW5zdCAmIGltc2tbb3AtPm9wY2xhc3NdKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChvcC0+bmFtZSA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgIi5zaG9ydCAweCUwNHgiLCBpbnN0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lID0gZ3JuYW1lW2luc3QgJiAweDBGXTsKLSAgICAgIAotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAob3AtPm9wY2xhc3MpCi0JewotCWNhc2UgTzA6IGJyZWFrOwotCWNhc2UgT1Q6IGZwcmludGYgKHN0cmVhbSwgIlx0JWQiLCBpbnN0ICYgMHgzKTsgYnJlYWs7Ci0JY2FzZSBPMToKLQljYXNlIEpNUDoKLQljYXNlIEpTUjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9DOiAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBjcm5hbWVbKGluc3QgPj4gNCkgJiAweDFGXSk7IGJyZWFrOwotCWNhc2UgTzFSMTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgcjEiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBNVUxTSDoKLQljYXNlIE8yOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0pOyBicmVhazsKLQljYXNlIFgxOiBmcHJpbnRmIChzdHJlYW0sICJcdHIxLCAlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9JOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4MUYpICsgMSk7IGJyZWFrOwotCWNhc2UgUk06IGZwcmludGYgKHN0cmVhbSwgIlx0JXMtcjE1LCAocjApIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgUlE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjQtcjcsICglcykiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQjoKLQljYXNlIE9CUmE6Ci0JY2FzZSBPQlJiOgotCWNhc2UgT0JSYzoKLQljYXNlIFNJOgotCWNhc2UgU0lhOgotCWNhc2UgT01hOgotCWNhc2UgT01iOgotCWNhc2UgT01jOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHgxRik7IGJyZWFrOwotCWNhc2UgSTc6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDdGKTsgYnJlYWs7Ci0JY2FzZSBMUzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgKCVzLCAlZCkiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLAotCQkJICBuYW1lLCAoKGluc3QgPj4gNCkgJiAweEYpIDw8IGlzaXpbKGluc3QgPj4gMTMpICYgM10pOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEJSOgotCSAgewotCSAgICBsb25nIHZhbCA9IGluc3QgJiAweDNGRjsKLQkgICAgCi0JICAgIGlmIChpbnN0ICYgMHg0MDApCi0JICAgICAgdmFsIHw9IDB4RkZGRkZDMDA7Ci0JICAgIAotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JXgiLCBtZW1hZGRyICsgMiArICh2YWw8PDEpKTsKLQkgICAgCi0JICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAiYnNyIikgPT0gMCkKLQkgICAgICB7Ci0JCS8qIEZvciBic3IsIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQuICAqLwotCQl2YWwgPSBtZW1hZGRyICsgMiArICh2YWwgPDwgMSk7Ci0JCQotCQlpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCQkgIHsKLQkJICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gIik7Ci0JCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgaW5mbyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBCTDoKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0JICAgIHZhbCA9IChpbnN0ICYgMHgwMDBGKTsKLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHgleCIsCi0JCSAgICBncm5hbWVbKGluc3QgPj4gNCkgJiAweEZdLCBtZW1hZGRyIC0gKHZhbCA8PCAxKSk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgTFI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAKLQkgICAgdmFsID0gKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQzsKLQkgICAgCi0JICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHZhbCwgaWJ5dGVzLCA0LCBpbmZvKTsKLQkgICAgaWYgKHN0YXR1cyAhPSAwKSAKLQkgICAgICB7Ci0JCWluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCSAgICAgIHZhbCA9IChpYnl0ZXNbM10gPDwgMjQpIHwgKGlieXRlc1syXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzFdIDw8IDgpIHwgKGlieXRlc1swXSk7Ci0JICAgIGVsc2UKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCi0JCXwgKGlieXRlc1syXSA8PCA4KSB8IChpYnl0ZXNbM10pOwotCSAgICAKLQkgICAgLyogUmVtb3ZlZCBbXSBhcm91bmQgbGl0ZXJhbCB2YWx1ZSB0byBtYXRjaCBBQkkgc3ludGF4IDEyLzk1LiAgKi8KLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHglWCIsIGdybmFtZVsoaW5zdCA+PiA4KSAmIDB4Rl0sIHZhbCk7Ci0KLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gZnJvbSBhZGRyZXNzIHBvb2wgYXQgMHgleCIsCi0JCSAgICAgICAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBMSjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgIAotCSAgICB2YWwgPSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDOwotCSAgICAKLQkgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAodmFsLCBpYnl0ZXMsIDQsIGluZm8pOwotCSAgICBpZiAoc3RhdHVzICE9IDApIAotCSAgICAgIHsKLQkJaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCSAgICAgIHZhbCA9IChpYnl0ZXNbM10gPDwgMjQpIHwgKGlieXRlc1syXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzFdIDw8IDgpIHwgKGlieXRlc1swXSk7Ci0JICAgIGVsc2UKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCi0JCXwgKGlieXRlc1syXSA8PCA4KSB8IChpYnl0ZXNbM10pOwotCSAgICAKLQkgICAgLyogUmVtb3ZlZCBbXSBhcm91bmQgbGl0ZXJhbCB2YWx1ZSB0byBtYXRjaCBBQkkgc3ludGF4IDEyLzk1LiAgKi8KLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQweCVYIiwgdmFsKTsKLQkgICAgLyogRm9yIGptcGkvanNyaSwgd2UnbGwgdHJ5IHRvIGdldCBhIHN5bWJvbCBmb3IgdGhlIHRhcmdldC4gICovCi0JICAgIGlmIChpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgJiYgdmFsICE9IDApCi0JICAgICAgewotCQlmcHJpbnRmIChzdHJlYW0sICJcdC8vICIpOwotCQlpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgaW5mbyk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlmcHJpbnRmIChzdHJlYW0sICJcdC8vIGZyb20gYWRkcmVzcyBwb29sIGF0IDB4JXgiLAotCQkJIChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkMpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBPUFNSOgotCSAgewotCSAgICBzdGF0aWMgY2hhciAqIGZpZWxkc1tdID0gCi0JICAgIHsKLQkgICAgICAiYWYiLCAiaWUiLCAgICAiZmUiLCAgICAiZmUsaWUiLCAKLQkgICAgICAiZWUiLCAiZWUsaWUiLCAiZWUsZmUiLCAiZWUsZmUsaWUiCi0JICAgIH07Ci0JICAgIAotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzIiwgZmllbGRzW2luc3QgJiAweDddKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgIC8qIElmIHRoZSBkaXNhc3NlbWJsZXIgbGFncyB0aGUgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLQkgIGZwcmludGYgKHN0cmVhbSwgIlx0dW5kZWNvZGVkIG9wZXJhbmRzLCBpbnN0IGlzIDB4JTA0eCIsIGluc3QpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgCi0gIC8qIFNheSBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZC4gICovCi0gIHJldHVybiAyOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1vcGMuaCBiL29wY29kZXMvbWNvcmUtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjA1ZWUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zIGZvciBNb3Rvcm9sYSdzIE1jb3JlIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgTzAsICAgIE9ULCAgIE8xLCAgIE9DLCAgIE8yLCAgICBYMSwgICAgT0ksICAgIE9CLAotICBPTWEsICAgU0ksICAgSTcsICAgTFMsICAgQlIsICAgIEJMLCAgICBMUiwgICAgTEosCi0gIFJNLCAgICBSUSwgICBKU1IsICBKTVAsICBPQlJhLCAgT0JSYiwgIE9CUmMsICBPQlIyLAotICBPMVIxLCAgT01iLCAgT01jLCAgU0lhLAotICBNVUxTSCwgT1BTUiwKLSAgSkMsICAgIEpVLCAgIEpMLCAgIFJTSSwgIERPMjEsICBPQjIKLX0KLW1jb3JlX29wY2xhc3M7Ci0KLXR5cGVkZWYgc3RydWN0IGluc3QKLXsKLSAgY2hhciAqICAgICAgICAgbmFtZTsKLSAgbWNvcmVfb3BjbGFzcyAgb3BjbGFzczsKLSAgdW5zaWduZWQgY2hhciAgdHJhbnNmZXI7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3Q7Ci19Ci1tY29yZV9vcGNvZGVfaW5mbzsKLQotI2lmZGVmIERFRklORV9UQUJMRQotbWNvcmVfb3Bjb2RlX2luZm8gbWNvcmVfdGFibGVbXSA9Ci17Ci0gIHsgImJrcHQiLAlPMCwJMCwJMHgwMDAwIH0sCi0gIHsgInN5bmMiLAlPMCwJMCwJMHgwMDAxIH0sCi0gIHsgInJ0ZSIsCU8wLAkxLAkweDAwMDIgfSwKLSAgeyAicmZlIiwJTzAsCTEsCTB4MDAwMiB9LAotICB7ICJyZmkiLAlPMCwJMSwJMHgwMDAzIH0sCi0gIHsgInN0b3AiLAlPMCwJMCwJMHgwMDA0IH0sCi0gIHsgIndhaXQiLAlPMCwJMCwJMHgwMDA1IH0sCi0gIHsgImRvemUiLAlPMCwJMCwJMHgwMDA2IH0sCi0gIHsgImlkbHk0IiwgICAgTzAsICAgICAwLCAgICAgIDB4MDAwNyB9LAotICB7ICJ0cmFwIiwJT1QsCTAsCTB4MDAwOCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgLSAweDAwMEYgKi8KLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwIC0gMHgwMDFGICovCi0gIHsgIm12YyIsCU8xLAkwLAkweDAwMjAgfSwKLSAgeyAibXZjdiIsCU8xLAkwLAkweDAwMzAgfSwKLSAgeyAibGRxIiwJUlEsCTAsCTB4MDA0MCB9LAotICB7ICJzdHEiLAlSUSwJMCwJMHgwMDUwIH0sCi0gIHsgImxkbSIsCVJNLAkwLAkweDAwNjAgfSwKLSAgeyAic3RtIiwJUk0sCTAsCTB4MDA3MCB9LAotICB7ICJkZWN0IiwJTzEsCTAsCTB4MDA4MCB9LAotICB7ICJkZWNmIiwJTzEsCTAsCTB4MDA5MCB9LAotICB7ICJpbmN0IiwJTzEsCTAsCTB4MDBBMCB9LAotICB7ICJpbmNmIiwJTzEsCTAsCTB4MDBCMCB9LAotICB7ICJqbXAiLAlKTVAsCTIsCTB4MDBDMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pNUAkweDAwQzAKLSAgeyAianNyIiwJSlNSLAkwLAkweDAwRDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KU1IJMHgwMEUwCi0gIHsgImZmMSIsCU8xLAkwLAkweDAwRTAgfSwKLSAgeyAiYnJldiIsCU8xLAkwLAkweDAwRjAgfSwKLSAgeyAieHRyYjMiLAlYMSwJMCwJMHgwMTAwIH0sCi0gIHsgInh0cmIyIiwJWDEsCTAsCTB4MDExMCB9LAotICB7ICJ4dHJiMSIsCVgxLAkwLAkweDAxMjAgfSwKLSAgeyAieHRyYjAiLAlYMSwJMCwJMHgwMTMwIH0sCi0gIHsgInpleHRiIiwJTzEsCTAsCTB4MDE0MCB9LAotICB7ICJzZXh0YiIsCU8xLAkwLAkweDAxNTAgfSwKLSAgeyAiemV4dGgiLAlPMSwJMCwJMHgwMTYwIH0sCi0gIHsgInNleHRoIiwJTzEsCTAsCTB4MDE3MCB9LAotICB7ICJkZWNsdCIsCU8xLAkwLAkweDAxODAgfSwKLSAgeyAidHN0bmJ6IiwJTzEsCTAsCTB4MDE5MCB9LAotICB7ICJkZWNndCIsCU8xLAkwLAkweDAxQTAgfSwKLSAgeyAiZGVjbmUiLAlPMSwJMCwJMHgwMUIwIH0sCi0gIHsgImNscnQiLAlPMSwJMCwJMHgwMUMwIH0sCi0gIHsgImNscmYiLAlPMSwJMCwJMHgwMUQwIH0sCi0gIHsgImFicyIsCU8xLAkwLAkweDAxRTAgfSwKLSAgeyAibm90IiwJTzEsCTAsCTB4MDFGMCB9LAotICB7ICJtb3Z0IiwJTzIsCTAsCTB4MDIwMCB9LAotICB7ICJtdWx0IiwJTzIsCTAsCTB4MDMwMCB9LAotICB7ICJsb29wdCIsCUJMLAkwLAkweDA0MDAgfSwKLSAgeyAic3VidSIsCU8yLAkwLAkweDA1MDAgfSwKLSAgeyAic3ViIiwJTzIsCTAsCTB4MDUwMCB9LCAvKiBPZmZpY2lhbCBhbGlhcy4gICovCi0gIHsgImFkZGMiLAlPMiwJMCwJMHgwNjAwIH0sCi0gIHsgInN1YmMiLAlPMiwJMCwJMHgwNzAwIH0sCi0vKiBTUEFDRTogMHgwODAwLTB4MDhmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0vKiBTUEFDRTogMHgwOTAwLTB4MDlmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0gIHsgIm1vdmYiLAlPMiwJMCwJMHgwQTAwIH0sCi0gIHsgImxzciIsCU8yLAkwLAkweDBCMDAgfSwKLSAgeyAiY21waHMiLAlPMiwJMCwJMHgwQzAwIH0sCi0gIHsgImNtcGx0IiwJTzIsCTAsCTB4MEQwMCB9LAotICB7ICJ0c3QiLAlPMiwJMCwJMHgwRTAwIH0sCi0gIHsgImNtcG5lIiwJTzIsCTAsCTB4MEYwMCB9LAotICB7ICJtZmNyIiwJT0MsCTAsCTB4MTAwMCB9LAotICB7ICJwc3JjbHIiLAlPUFNSLAkwLAkweDExRjAgfSwKLSAgeyAicHNyc2V0IiwJT1BTUiwJMCwJMHgxMUY4IH0sCi0gIHsgIm1vdiIsCU8yLAkwLAkweDEyMDAgfSwKLSAgeyAiYmdlbnIiLAlPMiwJMCwJMHgxMzAwIH0sCi0gIHsgInJzdWIiLAlPMiwJMCwJMHgxNDAwIH0sCi0gIHsgIml4dyIsCU8yLAkwLAkweDE1MDAgfSwKLSAgeyAiYW5kIiwJTzIsCTAsCTB4MTYwMCB9LAotICB7ICJ4b3IiLAlPMiwJMCwJMHgxNzAwIH0sCi0gIHsgIm10Y3IiLAlPQywJMCwJMHgxODAwIH0sCi0gIHsgImFzciIsCU8yLAkwLAkweDFBMDAgfSwKLSAgeyAibHNsIiwJTzIsCTAsCTB4MUIwMCB9LAotICB7ICJhZGR1IiwJTzIsCTAsCTB4MUMwMCB9LAotICB7ICJhZGQiLAlPMiwJMCwJMHgxQzAwIH0sIC8qIE9mZmljaWFsIGFsaWFzLiAgKi8KLSAgeyAiaXhoIiwJTzIsCTAsCTB4MUQwMCB9LAotICB7ICJvciIsCU8yLAkwLAkweDFFMDAgfSwKLSAgeyAiYW5kbiIsCU8yLAkwLAkweDFGMDAgfSwKLSAgeyAiYWRkaSIsCU9JLAkwLAkweDIwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9BRERJCTB4MjAwMAotICB7ICJjbXBsdGkiLAlPSSwJMCwJMHgyMjAwIH0sCi0gIHsgInN1YmkiLAlPSSwJMCwJMHgyNDAwIH0sCi0vKiBTUEFDRTogMHgyNjAwLTB4MjdmZiBvcGVuIGZvciBhIHJlZ2lzdGVyK2ltbWVkaWF0ZSAgb3BlcmF0aW9uICovCi0gIHsgInJzdWJpIiwJT0IsCTAsCTB4MjgwMCB9LAotICB7ICJjbXBuZWkiLAlPQiwJMCwJMHgyQTAwIH0sCi0gIHsgImJtYXNraSIsCU9NYSwJMCwJMHgyQzAwIH0sCi0gIHsgImRpdnUiLAlPMVIxLAkwLAkweDJDMTAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgyYzIwIC0gMHgyYzdmICovICAKLSAgeyAiYm1hc2tpIiwJT01iLAkwLAkweDJDODAgfSwKLSAgeyAiYm1hc2tpIiwJT01jLAkwLAkweDJEMDAgfSwKLSAgeyAiYW5kaSIsCU9CLAkwLAkweDJFMDAgfSwKLSAgeyAiYmNscmkiLAlPQiwJMCwJMHgzMDAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIwMCAtIDB4MzIwZiAqLwotICB7ICJkaXZzIiwJTzFSMSwJMCwJMHgzMjEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIyMCAtIDB4MzI2ZiAqLyAgCi0gIHsgImJnZW5pIiwJT0JSYSwJMCwJMHgzMjcwIH0sCi0gIHsgImJnZW5pIiwJT0JSYiwJMCwJMHgzMjgwIH0sCi0gIHsgImJnZW5pIiwJT0JSYywJMCwJMHgzMzAwIH0sCi0gIHsgImJzZXRpIiwJT0IsCTAsCTB4MzQwMCB9LAotICB7ICJidHN0aSIsCU9CLAkwLAkweDM2MDAgfSwKLSAgeyAieHNyIiwJTzEsCTAsCTB4MzgwMCB9LAotICB7ICJyb3RsaSIsCVNJYSwJMCwJMHgzODAwIH0sCi0gIHsgImFzcmMiLAlPMSwJMCwJMHgzQTAwIH0sCi0gIHsgImFzcmkiLAlTSWEsCTAsCTB4M0EwMCB9LAotICB7ICJsc2xjIiwJTzEsCTAsCTB4M0MwMCB9LAotICB7ICJsc2xpIiwJU0lhLAkwLAkweDNDMDAgfSwKLSAgeyAibHNyYyIsCU8xLAkwLAkweDNFMDAgfSwKLSAgeyAibHNyaSIsCVNJYSwJMCwJMHgzRTAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAtIDB4NWZmZiAqLwotICB7ICJtb3ZpIiwJSTcsCTAsCTB4NjAwMCB9LAotI2RlZmluZSBNQ09SRV9JTlNUX0JNQVNLSV9BTFQJMHg2MDAwCi0jZGVmaW5lIE1DT1JFX0lOU1RfQkdFTklfQUxUCTB4NjAwMAotICB7ICJtdWxzaCIsICAgIE1VTFNILCAgMCwgICAgICAweDY4MDAgfSwKLSAgeyAibXVscy5oIiwgICBNVUxTSCwgIDAsICAgICAgMHg2ODAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NjkwMCAtIDB4NkZGRiAqLwotICB7ICJqbXBpIiwJTEosCTEsCTB4NzAwMCB9LAotICB7ICJqc3JpIiwJTEosCTAsCTB4N0YwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pNUEkJMHg3MDAwCi0gIHsgImxydyIsCUxSLAkwLAkweDcwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KU1JJCTB4N0YwMAotICB7ICJsZCIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAibGR3IiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJsZC53IiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJzdCIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAic3R3IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJzdC53IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJsZGIiLAlMUywJMCwJMHhBMDAwIH0sCi0gIHsgImxkLmIiLAlMUywJMCwJMHhBMDAwIH0sCi0gIHsgInN0YiIsCUxTLAkwLAkweEIwMDAgfSwKLSAgeyAic3QuYiIsCUxTLAkwLAkweEIwMDAgfSwKLSAgeyAibGRoIiwJTFMsCTAsCTB4QzAwMCB9LAotICB7ICJsZC5oIiwJTFMsCTAsCTB4QzAwMCB9LAotICB7ICJzdGgiLAlMUywJMCwJMHhEMDAwIH0sCi0gIHsgInN0LmgiLAlMUywJMCwJMHhEMDAwIH0sCi0gIHsgImJ0IiwJQlIsCTAsCTB4RTAwMCB9LAotICB7ICJiZiIsCUJSLAkwLAkweEU4MDAgfSwKLSAgeyAiYnIiLAlCUiwJMSwJMHhGMDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQlIJMHhGMDAwCi0gIHsgImJzciIsCUJSLAkwLAkweEY4MDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHJlbGF4YWJsZSBicmFuY2hlcyAqLwotICB7ICJqYnQiLAlKQywJMCwJMHhFMDAwIH0sCi0gIHsgImpiZiIsCUpDLAkwLAkweEU4MDAgfSwKLSAgeyAiamJyIiwJSlUsCTEsCTB4RjAwMCB9LAotICB7ICJqYnNyIiwJSkwsCTAsCTB4RjgwMCB9LAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBhbGlhc2VzIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKi8KLSAgeyAicnRzIiwJTzAsCTIsCTB4MDBDRiB9LCAgLyogam1wIHIxNSAqLwotICB7ICJyb2xjIiwJRE8yMSwJMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCi0gIHsgInJvdGxjIiwJRE8yMSwgICAwLAkweDA2MDAgfSwgIC8qIGFkZGMgcmQscmQgKi8KLSAgeyAic2V0YyIsCU8wLAkwLAkweDBDMDAgfSwgIC8qIGNtcGhzIHIwLHIwICovCi0gIHsgImNscmMiLAlPMCwJMCwJMHgwRjAwIH0sICAvKiBjbXBuZSByMCxyMCAqLwotICB7ICJ0c3RsZSIsCU8xLAkwLAkweDIyMDAgfSwgIC8qIGNtcGx0aSByZCwxICovCi0gIHsgImNtcGxlaSIsCU9CLAkwLAkweDIyMDAgfSwgIC8qIGNtcGxlaSByZCxYIC0+IGNtcGx0aSByZCxYKzEgKi8KLSAgeyAibmVnIiwJTzEsCTAsCTB4MjgwMCB9LCAgLyogcnN1YmkgcmQsMCAqLwotICB7ICJ0c3RuZSIsCU8xLAkwLAkweDJBMDAgfSwgIC8qIGNtcG5laSByZCwwICovCi0gIHsgInRzdGx0IiwJTzEsCTAsCTB4MzdGMCB9LCAgLyogYnRzdGkgcngsMzEgKi8KLSAgeyAibWNscmkiLAlPQjIsCTAsCTB4MzAwMCB9LCAgLyogYmNscmkgcngsbG9nMihpbW0pICovCi0gIHsgIm1nZW5pIiwJT0JSMiwJMCwJMHgzMjAwIH0sICAvKiBiZ2VuaSByeCxsb2cyKGltbSkgKi8KLSAgeyAibXNldGkiLAlPQjIsCTAsCTB4MzQwMCB9LCAgLyogYnNldGkgcngsbG9nMihpbW0pICovCi0gIHsgIm10c3RpIiwJT0IyLAkwLAkweDM2MDAgfSwgIC8qIGJ0c3RpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJyb3JpIiwJUlNJLAkwLAkweDM4MDAgfSwKLSAgeyAicm90cmkiLAlSU0ksICAgIDAsCTB4MzgwMCB9LAotICB7ICJub3AiLAlPMCwgICAgIDAsCTB4MTIwMCB9LCAgLyogbW92IHIwLCByMCAqLwotICB7IDAsCQkwLAkwLCAgICAgIDAgfQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLWRpcy5jIGIvb3Bjb2Rlcy9taXBzLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMzODIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwcy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTYgKzAsMCBAQAotLyogUHJpbnQgbWlwcyBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgb3IgZm9yIG9iamR1bXAuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTm9idXl1a2kgSGlraWNoaShoaWtpY2hpQHNyYS5jby5qcCkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBjb2RlIGlzIG1pcHMxNiBvcgotICAgbm90LiBUaGUgbG93IGJpdCBvZiB0aGUgYWRkcmVzcyBpcyBvZnRlbiBhIGdvb2QgaW5kaWNhdG9yLiAgTm8KLSAgIHN5bWJvbCB0YWJsZSBpcyBhdmFpbGFibGUgd2hlbiB0aGlzIGNvZGUgcnVucyBvdXQgaW4gYW4gZW1iZWRkZWQKLSAgIHN5c3RlbSBhcyB3aGVuIGl0IGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGluIGEgbW9uaXRvci4gKi8KLQotI2lmICFkZWZpbmVkKEVNQkVEREVEX0VOVikKLSNkZWZpbmUgU1lNVEFCX0FWQUlMQUJMRSAxCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotc3RhdGljIGludCBwcmludF9pbnNuX21pcHMxNiBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9taXBzMTZfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKiwgaW50LCBib29sZWFuLCBpbnQsIGJmZF92bWEsCi0JICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNaXBzIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcyBtYW55IGJ5dGVzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDQKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLAotCQkJCSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IF9wcmludF9pbnNuX21pcHMgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgbG9uZyBpbnQsCi0JCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQwKLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBnZGIgc29tZWhvdy4gICovCi0jZGVmaW5lIFNURF9SRUdJU1RFUl9OQU1FUyAJXAotICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCi0JInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAotCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKLQkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLCBcCi0JInNyIiwJImxvIiwJImhpIiwJImJhZCIsCSJjYXVzZSIsInBjIiwgICAgXAotCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwgXAotCSJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsIFwKLQkiZjE2IiwgICJmMTciLCAgImYxOCIsICAiZjE5IiwgICJmMjAiLCAgImYyMSIsICAiZjIyIiwgICJmMjMiLFwKLQkiZjI0IiwgICJmMjUiLCAgImYyNiIsICAiZjI3IiwgICJmMjgiLCAgImYyOSIsICAiZjMwIiwgICJmMzEiLFwKLQkiZnNyIiwgICJmaXIiLCAgImZwIiwgICAiaW54IiwgICJyYW5kIiwgInRsYmxvIiwiY3R4dCIsICJ0bGJoaSIsXAotCSJlcGMiLCAgInByaWQiXAotICAgIH0KLQotc3RhdGljIENPTlNUIGNoYXIgKiBDT05TVCBzdGRfcmVnX25hbWVzW10gPSBTVERfUkVHSVNURVJfTkFNRVM7Ci0KLS8qIFRoZSBtaXBzMTYgcmVnaXN0ZXIgbmFtZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzMTZfcmVnX25hbWVzW10gPQotewotICAiczAiLCAiczEiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiCi19OwotCi0vKiBTY2FsYXIgcmVnaXN0ZXIgbmFtZXMuIHNldF9taXBzX2lzYV90eXBlKCkgZGVjaWRlcyB3aGljaCByZWdpc3RlciBuYW1lCi0gICB0YWJsZSB0byB1c2UuICAqLwotc3RhdGljIENPTlNUIGNoYXIgKiBDT05TVCAqcmVnX25hbWVzID0gTlVMTDsKLQwKLS8qIHN1YnJvdXRpbmUgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX2FyZyAoZCwgbCwgcGMsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IGw7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgZGVsdGE7Ci0KLSAgc3dpdGNoICgqZCkKLSAgICB7Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlNdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOgotICAgIGNhc2UgJ3UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCShsID4+IE9QX1NIX0lNTUVESUFURSkgJiBPUF9NQVNLX0lNTUVESUFURSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2onOiAvKiBzYW1lIGFzIGksIGJ1dCBzaWduLWV4dGVuZGVkICovCi0gICAgY2FzZSAnbyc6Ci0gICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7Ci0gICAgICBpZiAoZGVsdGEgJiAweDgwMDApCi0JZGVsdGEgfD0gfjB4ZmZmZjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJICAgICBkZWx0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX1BSRUZYKQotCQkJCQkgICAgICYgT1BfTUFTS19QUkVGWCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgICh1bnNpZ25lZCBpbnQpICgobCA+PiBPUF9TSF9DQUNIRSkKLQkJCQkJICAgICAmIE9QX01BU0tfQ0FDSEUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkoKChwYyAmIH4gKGJmZF92bWEpIDB4MGZmZmZmZmYpCi0JICB8ICgoKGwgPj4gT1BfU0hfVEFSR0VUKSAmIE9QX01BU0tfVEFSR0VUKSA8PCAyKSksCi0JIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIHNpZ24gZXh0ZW5kIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIGRlbHRhID0gKGwgPj4gT1BfU0hfREVMVEEpICYgT1BfTUFTS19ERUxUQTsKLSAgICAgIGlmIChkZWx0YSAmIDB4ODAwMCkKLQlkZWx0YSB8PSB+MHhmZmZmOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JKChkZWx0YSA8PCAyKSArIHBjICsgNCwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd6JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9TSEFNVCkgJiBPUF9NQVNLX1NIQU1UKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT0RFKSAmIE9QX01BU0tfQ09ERSk7Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSAncSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT0RFMikgJiBPUF9NQVNLX0NPREUyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT1BaKSAmIE9QX01BU0tfQ09QWik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfU1lTQ0FMTCkgJiBPUF9NQVNLX1NZU0NBTEwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICBjYXNlICdWJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgJ1QnOgotICAgIGNhc2UgJ1cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRkQpICYgT1BfTUFTS19GRCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlIpICYgT1BfTUFTS19GUik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQkNDKSAmIE9QX01BU0tfQkNDKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmY2MlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NDQykgJiBPUF9NQVNLX0NDQyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1AnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1BFUkZSRUcpICYgT1BfTUFTS19QRVJGUkVHKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAotCQkJICAgICBfKCIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIiksCi0JCQkgICAgICpkKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0KLS8qIEZpZ3VyZSBvdXQgdGhlIE1JUFMgSVNBIGFuZCBDUFUgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotICAgRklYTUU6IFdoYXQgZG9lcyB0aGlzIGhhdmUgdG8gZG8gd2l0aCBTWU1UQUJfQVZBSUxBQkxFPyAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9taXBzX2lzYV90eXBlIChtYWNoLCBpc2EsIGNwdXR5cGUpCi0gICAgIGludCBtYWNoOwotICAgICBpbnQgKmlzYTsKLSAgICAgaW50ICpjcHV0eXBlOwotewotICBpbnQgdGFyZ2V0X3Byb2Nlc3NvciA9IDA7Ci0gIGludCBtaXBzX2lzYSA9IDA7Ci0KLSAgLyogVXNlIHN0YW5kYXJkIE1JUFMgcmVnaXN0ZXIgbmFtZXMgYnkgZGVmYXVsdC4gICovCi0gIHJlZ19uYW1lcyA9IHN0ZF9yZWdfbmFtZXM7Ci0KLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDMwMDA7Ci0JbWlwc19pc2EgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMzkwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzkwMDsKLQltaXBzX2lzYSA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQwMTA7Ci0JbWlwc19pc2EgPSAyOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDEwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTExOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MTAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQzMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDQwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDQwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NjAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ2NTA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNTAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNTAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA2MDAwOwotCW1pcHNfaXNhID0gMjsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDgwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMTAwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDEwMDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczE2OgotCXRhcmdldF9wcm9jZXNzb3IgPSAxNjsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXRhcmdldF9wcm9jZXNzb3IgPSAzMDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLQotICAgIH0KLQotICAqaXNhID0gbWlwc19pc2E7Ci0gICpjcHV0eXBlID0gdGFyZ2V0X3Byb2Nlc3NvcjsKLX0KLQotI2VuZGlmIC8qIFNZTVRBQl9BVkFJTEFCTEUgKi8KLQotLyogUHJpbnQgdGhlIG1pcHMgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIHVzaW5nIElORk8uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLCB3aGljaCBpcwotICAgYWx3YXlzIDQuICBCSUdFTkRJQU4gbXVzdCBiZSAxIGlmIHRoaXMgaXMgYmlnLWVuZGlhbiBjb2RlLCAwIGlmCi0gICB0aGlzIGlzIGxpdHRsZS1lbmRpYW4gY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLV9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsIHdvcmQsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnQgd29yZDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3A7Ci0gIGludCB0YXJnZXRfcHJvY2Vzc29yLCBtaXBzX2lzYTsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdCA9IDA7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfaGFzaFtPUF9NQVNLX09QICsgMV07Ci0KLSAgLyogQnVpbGQgYSBoYXNoIHRhYmxlIHRvIHNob3J0ZW4gdGhlIHNlYXJjaCB0aW1lLiAgKi8KLSAgaWYgKCEgaW5pdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8PSBPUF9NQVNLX09QOyBpKyspCi0JewotCSAgZm9yIChvcCA9IG1pcHNfb3Bjb2Rlczsgb3AgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdOyBvcCsrKQotCSAgICB7Ci0JICAgICAgaWYgKG9wLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoaSA9PSAoKG9wLT5tYXRjaCA+PiBPUF9TSF9PUCkgJiBPUF9NQVNLX09QKSkKLQkJewotCQkgIG1pcHNfaGFzaFtpXSA9IG9wOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpbml0ID0gMTsKLSAgICB9Ci0KLSNpZiAhIFNZTVRBQl9BVkFJTEFCTEUKLSAgLyogVGhpcyBpcyBydW5uaW5nIG91dCBvbiBhIHRhcmdldCBtYWNoaW5lLCBub3QgaW4gYSBob3N0IHRvb2wuCi0gICAgIEZJWE1FOiBXaGVyZSBkb2VzIG1pcHNfdGFyZ2V0X2luZm8gY29tZSBmcm9tPyAgKi8KLSAgdGFyZ2V0X3Byb2Nlc3NvciA9IG1pcHNfdGFyZ2V0X2luZm8ucHJvY2Vzc29yOwotICBtaXBzX2lzYSA9IG1pcHNfdGFyZ2V0X2luZm8uaXNhOwotI2Vsc2UgIAotICBzZXRfbWlwc19pc2FfdHlwZSAoaW5mby0+bWFjaCwgJm1pcHNfaXNhLCAmdGFyZ2V0X3Byb2Nlc3Nvcik7Ci0jZW5kaWYgIAotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOwotCi0gIG9wID0gbWlwc19oYXNoWyh3b3JkID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1BdOwotICBpZiAob3AgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKDsgb3AgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdOyBvcCsrKQotCXsKLQkgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAod29yZCAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCi0JICAgIHsKLQkgICAgICByZWdpc3RlciBjb25zdCBjaGFyICpkOwotCi0JICAgICAgaWYgKCEgT1BDT0RFX0lTX01FTUJFUiAob3AsIG1pcHNfaXNhLCB0YXJnZXRfcHJvY2Vzc29yLCAwKSkKLQkJY29udGludWU7Ci0KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCi0JICAgICAgZCA9IG9wLT5hcmdzOwotCSAgICAgIGlmIChkICE9IE5VTEwgJiYgKmQgIT0gJ1wwJykKLQkJewotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCQkgIGZvciAoOyAqZCAhPSAnXDAnOyBkKyspCi0JCSAgICAgIHByaW50X2luc25fYXJnIChkLCB3b3JkLCBtZW1hZGRyLCBpbmZvKTsKLQkJfQotCi0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iiwgd29yZCk7Ci0gIHJldHVybiA0OwotfQotCi0KLS8qIEluIGFuIGVudmlyb25tZW50IHdoZXJlIHdlIGRvIG5vdCBrbm93IHRoZSBzeW1ib2wgdHlwZSBvZiB0aGUKLSAgIGluc3RydWN0aW9uIHdlIGFyZSBmb3JjZWQgdG8gYXNzdW1lIHRoYXQgdGhlIGxvdyBvcmRlciBiaXQgb2YgdGhlCi0gICBpbnN0cnVjdGlvbnMnIGFkZHJlc3MgbWF5IG1hcmsgaXQgYXMgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICBJZiB3ZQotICAgYXJlIHNpbmdsZSBzdGVwcGluZywgb3IgdGhlIHBjIGlzIHdpdGhpbiB0aGUgZGlzYXNzZW1ibGVkIGZ1bmN0aW9uLAotICAgdGhpcyB3b3Jrcy4gIE90aGVyd2lzZSwgd2UgbmVlZCBhIGNsdWUuICBTb21ldGltZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX21pcHMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotI2lmIDEKLSAgLyogRklYTUU6IElmIG9kZCBhZGRyZXNzLCB0aGlzIGlzIENMRUFSTFkgYSBtaXBzIDE2IGluc3RydWN0aW9uLiAgKi8KLSAgLyogT25seSBhIGZldyB0b29scyB3aWxsIHdvcmsgdGhpcyB3YXkuICAqLwotICBpZiAobWVtYWRkciAmIDB4MDEpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0gIGlmIChpbmZvLT5tYWNoID09IDE2Ci0gICAgICB8fCAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBpbmZvLT5zeW1ib2xzICE9IE5VTEwKLQkgICYmICgoKihlbGZfc3ltYm9sX3R5cGUgKiopIGluZm8tPnN5bWJvbHMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyCi0JICAgICAgPT0gU1RPX01JUFMxNikpKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICByZXR1cm4gX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRiMzIgKGJ1ZmZlciksCi0JCQkgICAgIGluZm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX21pcHMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotCi0jaWYgMQotICBpZiAobWVtYWRkciAmIDB4MDEpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0gIGlmIChpbmZvLT5tYWNoID09IDE2Ci0gICAgICB8fCAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBpbmZvLT5zeW1ib2xzICE9IE5VTEwKLQkgICYmICgoKihlbGZfc3ltYm9sX3R5cGUgKiopIGluZm8tPnN5bWJvbHMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyCi0JICAgICAgPT0gU1RPX01JUFMxNikpKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICByZXR1cm4gX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKGJ1ZmZlciksCi0JCQkgICAgIGluZm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotDAotLyogRGlzYXNzZW1ibGUgbWlwczE2IGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpbnNuOwotICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gIGludCBleHRlbmQgPSAwOwotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wLCAqb3BlbmQ7Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBpbmZvLT5lbmRpYW47Ci0KLSAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsKLSAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsKLSAgaW5mby0+ZGF0YV9zaXplID0gMDsKLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsKLSAgaW5mby0+dGFyZ2V0ID0gMDsKLSAgaW5mby0+dGFyZ2V0MiA9IDA7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsZW5ndGggPSAyOwotCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0gICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotICAvKiBIYW5kbGUgdGhlIGV4dGVuZCBvcGNvZGUgc3BlY2lhbGx5LiAgKi8KLSAgdXNlX2V4dGVuZCA9IGZhbHNlOwotICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKLSAgICB7Ci0gICAgICB1c2VfZXh0ZW5kID0gdHJ1ZTsKLSAgICAgIGV4dGVuZCA9IGluc24gJiAweDdmZjsKLQotICAgICAgbWVtYWRkciArPSAyOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotCWluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0gICAgICAvKiBDaGVjayBmb3IgYW4gZXh0ZW5kIG9wY29kZSBmb2xsb3dlZCBieSBhbiBleHRlbmQgb3Bjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0JICByZXR1cm4gbGVuZ3RoOwotCX0KLQotICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgdXNlIGEgaGFzaCB0YWJsZSBvbiB0aGUgbWFqb3Igb3Bjb2RlIGhlcmUuICAqLwotCi0gIG9wZW5kID0gbWlwczE2X29wY29kZXMgKyBiZmRfbWlwczE2X251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gbWlwczE2X29wY29kZXM7IG9wIDwgb3BlbmQ7IG9wKyspCi0gICAgewotICAgICAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPICYmIChpbnNuICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBpZiAoc3RyY2hyIChvcC0+YXJncywgJ2EnKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHVzZV9leHRlbmQpCi0JCXsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JCSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0JCSAgcmV0dXJuIGxlbmd0aCAtIDI7Ci0JCX0KLQotCSAgICAgIHVzZV9leHRlbmQgPSBmYWxzZTsKLQotCSAgICAgIG1lbWFkZHIgKz0gMjsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwKLQkJCQkJCSAgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCQl7Ci0JCSAgdXNlX2V4dGVuZCA9IHRydWU7Ci0JCSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLQkJICAgIGV4dGVuZCA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JCSAgZWxzZQotCQkgICAgZXh0ZW5kID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkJICBsZW5ndGggKz0gMjsKLQkJfQotCSAgICB9Ci0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0JICBpZiAob3AtPmFyZ3NbMF0gIT0gJ1wwJykKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0JICBmb3IgKHMgPSBvcC0+YXJnczsgKnMgIT0gJ1wwJzsgcysrKQotCSAgICB7Ci0JICAgICAgaWYgKCpzID09ICcsJwotCQkgICYmIHNbMV0gPT0gJ3cnCi0JCSAgJiYgKCgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYKQotCQkgICAgICA9PSAoKGluc24gPj4gTUlQUzE2T1BfU0hfUlkpICYgTUlQUzE2T1BfTUFTS19SWSkpKQotCQl7Ci0JCSAgLyogU2tpcCB0aGUgcmVnaXN0ZXIgYW5kIHRoZSBjb21tYS4gICovCi0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICcsJwotCQkgICYmIHNbMV0gPT0gJ3YnCi0JCSAgJiYgKCgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaKQotCQkgICAgICA9PSAoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkpKQotCQl7Ci0JCSAgLyogU2tpcCB0aGUgcmVnaXN0ZXIgYW5kIHRoZSBjb21tYS4gICovCi0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgcHJpbnRfbWlwczE2X2luc25fYXJnICgqcywgb3AsIGluc24sIHVzZV9leHRlbmQsIGV4dGVuZCwgbWVtYWRkciwKLQkJCQkgICAgIGluZm8pOwotCSAgICB9Ci0KLQkgIGlmICgob3AtPnBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKLQkgICAgICBpZiAoaW5mby0+aW5zbl90eXBlICE9IGRpc19qc3IpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7Ci0JICAgIH0KLQotCSAgcmV0dXJuIGxlbmd0aDsKLQl9Ci0gICAgfQotCi0gIGlmICh1c2VfZXh0ZW5kKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGV4dGVuZCB8IDB4ZjAwMCk7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24pOwotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKiBEaXNhc3NlbWJsZSBhbiBvcGVyYW5kIGZvciBhIG1pcHMxNiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9taXBzMTZfaW5zbl9hcmcgKHR5cGUsIG9wLCBsLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsIGluZm8pCi0gICAgIGludCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wOwotICAgICBpbnQgbDsKLSAgICAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICAgICBpbnQgZXh0ZW5kOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJygnOgotICAgIGNhc2UgJyknOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd5JzoKLSAgICBjYXNlICd3JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlkpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ3YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWCldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdaJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19NT1ZFMzJaKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcwJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1syOV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJHBjIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMzFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQotCQkJCQkmIE1JUFMxNk9QX01BU0tfUkVHUjMyKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdZJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzW01JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChsKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICdIJzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdqJzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICdWJzoKLSAgICBjYXNlICdDJzoKLSAgICBjYXNlICdVJzoKLSAgICBjYXNlICdrJzoKLSAgICBjYXNlICdLJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdxJzoKLSAgICBjYXNlICdBJzoKLSAgICBjYXNlICdCJzoKLSAgICBjYXNlICdFJzoKLSAgICAgIHsKLQlpbnQgaW1tZWQsIG5iaXRzLCBzaGlmdCwgc2lnbmVkcCwgZXh0Yml0cywgcGNyZWwsIGV4dHUsIGJyYW5jaDsKLQotCXNoaWZ0ID0gMDsKLQlzaWduZWRwID0gMDsKLQlleHRiaXRzID0gMTY7Ci0JcGNyZWwgPSAwOwotCWV4dHUgPSAwOwotCWJyYW5jaCA9IDA7Ci0Jc3dpdGNoICh0eXBlKQotCSAgewotCSAgY2FzZSAnPCc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaOwotCSAgICBleHRiaXRzID0gNTsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnPic6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYOwotCSAgICBleHRiaXRzID0gNTsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnWyc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaOwotCSAgICBleHRiaXRzID0gNjsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnXSc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYOwotCSAgICBleHRiaXRzID0gNjsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNCc6Ci0JICAgIG5iaXRzID0gNDsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU00KSAmIE1JUFMxNk9QX01BU0tfSU1NNDsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGV4dGJpdHMgPSAxNTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc1JzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdIJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDE7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSAyOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1cnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaWYgKChvcC0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1BDKSA9PSAwCi0JCSYmIChvcC0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1NQKSA9PSAwKQotCSAgICAgIHsKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JCWluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIGNhc2UgJ0QnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaic6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNic6Ci0JICAgIG5iaXRzID0gNjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc4JzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1YnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgLyogRklYTUU6IFRoaXMgbWlnaHQgYmUgbHcsIG9yIGl0IG1pZ2h0IGJlIGFkZGl1IHRvICRzcCBvcgotICAgICAgICAgICAgICAgJHBjLiAgV2UgYXNzdW1lIGl0J3MgbG9hZC4gICovCi0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0MnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVSc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnayc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnSyc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdwJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmFuY2ggPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdxJzoKLQkgICAgbmJpdHMgPSAxMTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU0xMSkgJiBNSVBTMTZPUF9NQVNLX0lNTTExOwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmFuY2ggPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0EnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgcGNyZWwgPSAxOwotCSAgICAvKiBGSVhNRTogVGhpcyBjYW4gYmUgbHcgb3IgbGEuICBXZSBhc3N1bWUgaXQgaXMgbHcuICAqLwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdCJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnRSc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0KLQlpZiAoISB1c2VfZXh0ZW5kKQotCSAgewotCSAgICBpZiAoc2lnbmVkcCAmJiBpbW1lZCA+PSAoMSA8PCAobmJpdHMgLSAxKSkpCi0JICAgICAgaW1tZWQgLT0gMSA8PCBuYml0czsKLQkgICAgaW1tZWQgPDw9IHNoaWZ0OwotCSAgICBpZiAoKHR5cGUgPT0gJzwnIHx8IHR5cGUgPT0gJz4nIHx8IHR5cGUgPT0gJ1snIHx8IHR5cGUgPT0gJ10nKQotCQkmJiBpbW1lZCA9PSAwKQotCSAgICAgIGltbWVkID0gODsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChleHRiaXRzID09IDE2KQotCSAgICAgIGltbWVkIHw9ICgoZXh0ZW5kICYgMHgxZikgPDwgMTEpIHwgKGV4dGVuZCAmIDB4N2UwKTsKLQkgICAgZWxzZSBpZiAoZXh0Yml0cyA9PSAxNSkKLQkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4ZikgPDwgMTEpIHwgKGV4dGVuZCAmIDB4N2YwKTsKLQkgICAgZWxzZQotCSAgICAgIGltbWVkID0gKChleHRlbmQgPj4gNikgJiAweDFmKSB8IChleHRlbmQgJiAweDIwKTsKLQkgICAgaW1tZWQgJj0gKDEgPDwgZXh0Yml0cykgLSAxOwotCSAgICBpZiAoISBleHR1ICYmIGltbWVkID49ICgxIDw8IChleHRiaXRzIC0gMSkpKQotCSAgICAgIGltbWVkIC09IDEgPDwgZXh0Yml0czsKLQkgIH0KLQotCWlmICghIHBjcmVsKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGltbWVkKTsKLQllbHNlCi0JICB7Ci0JICAgIGJmZF92bWEgYmFzZWFkZHI7Ci0JICAgIGJmZF92bWEgdmFsOwotCi0JICAgIGlmIChicmFuY2gpCi0JICAgICAgewotCQlpbW1lZCAqPSAyOwotCQliYXNlYWRkciA9IG1lbWFkZHIgKyAyOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAodXNlX2V4dGVuZCkKLQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgc3RhdHVzOwotCQliZmRfYnl0ZSBidWZmZXJbMl07Ci0KLQkJYmFzZWFkZHIgPSBtZW1hZGRyOwotCi0JCS8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgYSBqcgotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgYmFzZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgIGpyIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgamFscgotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgYmFzZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgIGphbHIgaW5zdHJ1Y3Rpb24uICBUaGlzIHRlc3QgaXMgdW5yZWxpYWJsZTogd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgIG5vIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgdGhlIHByZXZpb3VzIHdvcmQgaXMKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiBvciBkYXRhLiAgKi8KLQkJc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDQsIGJ1ZmZlciwgMiwKLQkJCQkJCSAgICBpbmZvKTsKLQkJaWYgKHN0YXR1cyA9PSAwCi0JCSAgICAmJiAoKChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJCSAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCi0JCQkgIDogYmZkX2dldGwxNiAoYnVmZmVyKSkKLQkJCSAmIDB4ZjgwMCkgPT0gMHgxODAwKSkKLQkJICBiYXNlYWRkciA9IG1lbWFkZHIgLSA0OwotCQllbHNlCi0JCSAgewotCQkgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDIsIGJ1ZmZlciwKLQkJCQkJCQkyLCBpbmZvKTsKLQkJICAgIGlmIChzdGF0dXMgPT0gMAotCQkJJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCQkgICAgICA/IGJmZF9nZXRiMTYgKGJ1ZmZlcikKLQkJCSAgICAgIDogYmZkX2dldGwxNiAoYnVmZmVyKSkKLQkJCSAgICAgJiAweGY4MWYpID09IDB4ZTgwMCkpCi0JCSAgICAgIGJhc2VhZGRyID0gbWVtYWRkciAtIDI7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgdmFsID0gKGJhc2VhZGRyICYgfiAoKDEgPDwgc2hpZnQpIC0gMSkpICsgaW1tZWQ7Ci0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsLCBpbmZvKTsKLQkgICAgaW5mby0+dGFyZ2V0ID0gdmFsOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIGlmICghIHVzZV9leHRlbmQpCi0JZXh0ZW5kID0gMDsKLSAgICAgIGwgPSAoKGwgJiAweDFmKSA8PCAyMykgfCAoKGwgJiAweDNlMCkgPDwgMTMpIHwgKGV4dGVuZCA8PCAyKTsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgJiAweGYwMDAwMDAwKSB8IGwsIGluZm8pOwotICAgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2pzcjsKLSAgICAgIGluZm8tPnRhcmdldCA9IChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsOwotICAgICAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAnTCc6Ci0gICAgICB7Ci0JaW50IG5lZWRfY29tbWEsIGFtYXNrLCBzbWFzazsKLQotCW5lZWRfY29tbWEgPSAwOwotCi0JbCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OwotCi0JYW1hc2sgPSAobCA+PiAzKSAmIDc7Ci0KLQlpZiAoYW1hc2sgPiAwICYmIGFtYXNrIDwgNSkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbNF0pOwotCSAgICBpZiAoYW1hc2sgPiAxKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCi0JCQkJICAgICByZWdfbmFtZXNbYW1hc2sgKyAzXSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0Jc21hc2sgPSAobCA+PiAxKSAmIDM7Ci0JaWYgKHNtYXNrID09IDMpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXM/PyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoc21hc2sgPiAwKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJCVzIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIsCi0JCQkJICAgcmVnX25hbWVzWzE2XSk7Ci0JICAgIGlmIChzbWFzayA+IDEpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJCVzIiwKLQkJCQkgICAgIHJlZ19uYW1lc1tzbWFzayArIDE1XSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0JaWYgKGwgJiAxKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJCVzIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIsCi0JCQkJICAgcmVnX25hbWVzWzMxXSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0JaWYgKGFtYXNrID09IDUgfHwgYW1hc2sgPT0gNikKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyRmMCIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiKTsKLQkgICAgaWYgKGFtYXNrID09IDYpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJGYxIik7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMtb3BjLmMgYi9vcGNvZGVzL21pcHMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTI2ZjYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLS8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgotICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBTaG9ydCBoYW5kIHNvIHRoZSBsaW5lcyBhcmVuJ3QgdG9vIGxvbmcuICAqLwotCi0jZGVmaW5lIExERCAgICAgSU5TTl9MT0FEX01FTU9SWV9ERUxBWQotI2RlZmluZSBMQ0QJSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDQkQJSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDT0QgICAgIElOU05fQ09QUk9DX01PVkVfREVMQVkKLSNkZWZpbmUgQ0xECUlOU05fQ09QUk9DX01FTU9SWV9ERUxBWQotI2RlZmluZSBDQkwJSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkKLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLSNkZWZpbmUgU00JSU5TTl9TVE9SRV9NRU1PUlkKLQotI2RlZmluZSBXUl9kICAgIElOU05fV1JJVEVfR1BSX0QKLSNkZWZpbmUgV1JfdCAgICBJTlNOX1dSSVRFX0dQUl9UCi0jZGVmaW5lIFdSXzMxICAgSU5TTl9XUklURV9HUFJfMzEgICAgICAgCi0jZGVmaW5lIFdSX0QgICAgSU5TTl9XUklURV9GUFJfRCAgICAgICAgCi0jZGVmaW5lIFdSX1QJSU5TTl9XUklURV9GUFJfVAotI2RlZmluZSBXUl9TCUlOU05fV1JJVEVfRlBSX1MKLSNkZWZpbmUgUkRfcyAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfYiAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfdCAgICBJTlNOX1JFQURfR1BSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUyAgICBJTlNOX1JFQURfRlBSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfVCAgICBJTlNOX1JFQURfRlBSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUglJTlNOX1JFQURfRlBSX1IKLSNkZWZpbmUgV1JfQ0MJSU5TTl9XUklURV9DT05EX0NPREUKLSNkZWZpbmUgUkRfQ0MJSU5TTl9SRUFEX0NPTkRfQ09ERQotI2RlZmluZSBSRF9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MxCUlOU05fQ09QCi0jZGVmaW5lIFJEX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzMgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MxCUlOU05fQ09QCi0jZGVmaW5lIFdSX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzMgICBJTlNOX0NPUAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIE1PRF9ISSAgV1JfSEl8UkRfSEkKLQotI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotI2RlZmluZSBNT0RfTE8gIFdSX0xPfFJEX0xPCi0KLSNkZWZpbmUgV1JfSElMTyBXUl9ISXxXUl9MTwotI2RlZmluZSBSRF9ISUxPIFJEX0hJfFJEX0xPCi0jZGVmaW5lIE1PRF9ISUxPIFdSX0hJTE98UkRfSElMTwotCi0jZGVmaW5lIElTX00gICAgSU5TTl9NVUxUCi0KLSNkZWZpbmUgSTEJSU5TTl9JU0ExCi0jZGVmaW5lIEkyCUlOU05fSVNBMgotI2RlZmluZSBJMwlJTlNOX0lTQTMKLSNkZWZpbmUgSTQJSU5TTl9JU0E0Ci0jZGVmaW5lIEk1CUlOU05fSVNBNQotI2RlZmluZSBQMwlJTlNOXzQ2NTAKLSNkZWZpbmUgTDEJSU5TTl80MDEwCi0jZGVmaW5lIFYxICAgICAgSU5TTl80MTAwCi0jZGVmaW5lIFQzICAgICAgSU5TTl8zOTAwCi0KLSNkZWZpbmUgRzEgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzIgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzMgKEk0ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICkKLQotI2RlZmluZSBHNiAgICAgIElOU05fR1AzMgotCi0jZGVmaW5lIE0xICAgICAgMAotI2RlZmluZSBNMiAgICAgIDAKLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1jb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwc19idWlsdGluX29wY29kZXNbXSA9IHsKLS8qIFRoZXNlIGluc3RydWN0aW9ucyBhcHBlYXIgZmlyc3Qgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZmluZAotICAgdGhlbSBmaXJzdC4gIFRoZSBhc3NlbWJsZXJzIHVzZXMgYSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24gbmFtZSBhbnlob3cuICAqLwotLyogbmFtZSwJYXJncywJbWFzaywJCW1hdGNoLAlwaW5mbyAqLwoteyJub3AiLCAgICAgIiIsCQkweDAwMDAwMDAwLCAweGZmZmZmZmZmLAkwLAkJSTEJfSwKLXsibGkiLCAgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBhZGRpdSAqLwoteyJsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCUkxCX0sIC8qIG9yaSAqLwoteyJsaSIsICAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fTEksCUlOU05fTUFDUk8sCUkxCX0sCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAlJMXxHNgl9LC8qIG9yICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyZCwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMwl9LC8qIGRhZGR1ICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyMSwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMQl9LC8qIGFkZHUgKi8KLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDI1LCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsCUkxCX0sLyogb3IgKi8KLXsiYiIsICAgICAgICJwIiwJMHgxMDAwMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJSTEJfSwvKiBiZXEgMCwwICovCi17ImIiLCAgICAgICAicCIsCTB4MDQwMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmdleiAwICovCi17ImJhbCIsICAgICAicCIsCTB4MDQxMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRHxXUl8zMSwJSTEJfSwvKiBiZ2V6YWwgMCovCi0KLXsiYWJzIiwgICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0FCUywJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWJzLnMiLCAgICJELFYiLAkweDQ2MDAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiYWJzLmQiLCAgICJELFYiLAkweDQ2MjAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiYWJzLnBzIiwgICJELFYiLAkweDQ2YzAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTUJfSwKLXsiYWRkIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjAsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWRkLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxfSwKLXsiYWRkLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxfSwKLXsiYWRkLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsiYWRkaSIsICAgICJ0LHIsaiIsCTB4MjAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkaXUiLCAgICJ0LHIsaiIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkdSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMjEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGR1IiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFsbnYucHMiLCAiRCxWLFQscyIsCTB4NGMwMDAwMWUsIDB4ZmMwMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsiYW5kIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhbmQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BTkRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYW5kaSIsICAgICJ0LHIsaSIsCTB4MzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLS8qIGIgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwotLyogYmFsIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLXsiYmMwZiIsICAgICJwIiwJMHg0MTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzBmbCIsICAgInAiLAkweDQxMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMWYiLCAgICAicCIsCTB4NDUwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJMXxNMQl9LAoteyJiYzFmIiwgICAgIk4scCIsCTB4NDUwMDAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJiYzFmbCIsICAgInAiLAkweDQ1MDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTJ8VDN8TTF9LAoteyJiYzFmbCIsICAgIk4scCIsCTB4NDUwMjAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJiYzJmIiwgICAgInAiLAkweDQ5MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMmZsIiwgICAicCIsCTB4NDkwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMzZiIsICAgICJwIiwJMHg0ZDAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzNmbCIsICAgInAiLAkweDRkMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMHQiLCAgICAicCIsCTB4NDEwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMwdGwiLCAgICJwIiwJMHg0MTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzF0IiwgICAgInAiLAkweDQ1MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTEJfSwKLXsiYmMxdCIsICAgICJOLHAiLAkweDQ1MDEwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYmMxdGwiLCAgICJwIiwJMHg0NTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzCX0sCi17ImJjMXRsIiwgICAiTixwIiwJMHg0NTAzMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17ImJjMnQiLCAgICAicCIsCTB4NDkwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMydGwiLCAgICJwIiwJMHg0OTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzN0IiwgICAgInAiLAkweDRkMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjM3RsIiwgICAicCIsCTB4NGQwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmVxeiIsICAgICJzLHAiLAkweDEwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmVxemwiLCAgICJzLHAiLAkweDUwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmVxIiwgICAgICJzLHQscCIsCTB4MTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCi17ImJlcSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZXFsIiwgICAgInMsdCxwIiwJMHg1MDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwJSTJ8VDMJfSwKLXsiYmVxbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2UiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0UsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2VsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2VsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXoiLCAgICAicyxwIiwJMHgwNDAxMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJnZXpsIiwgICAicyxwIiwJMHgwNDAzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJnZXphbCIsICAicyxwIiwJMHgwNDExMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJnZXphbGwiLCAicyxwIiwJMHgwNDEzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJndCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVEwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3R1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0eiIsICAgICJzLHAiLAkweDFjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmd0emwiLCAgICJzLHAiLAkweDVjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmxlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGV1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV6IiwgICAgInMscCIsCTB4MTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibGV6bCIsICAgInMscCIsCTB4NTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibHQiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHRsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHRsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHoiLCAgICAicyxwIiwJMHgwNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJsdHpsIiwgICAicyxwIiwJMHgwNDAyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsdHphbCIsICAicyxwIiwJMHgwNDEwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJsdHphbGwiLCAicyxwIiwJMHgwNDEyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZXoiLCAgICAicyxwIiwJMHgxNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJuZXpsIiwgICAicyxwIiwJMHg1NDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZSIsICAgICAicyx0LHAiLAkweDE0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoteyJibmUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYm5lbCIsICAgICJzLHQscCIsCTB4NTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsIAlJMnxUMwl9LAoteyJibmVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJyZWFrIiwgICAiIiwJCTB4MDAwMDAwMGQsIDB4ZmZmZmZmZmYsCVRSQVAsCQlJMQl9LAoteyJicmVhayIsICAgImMiLAkweDAwMDAwMDBkLCAweGZjMDBmZmZmLAlUUkFQLAkJSTEJfSwKLXsiYnJlYWsiLCAgICJjLHEiLAkweDAwMDAwMDBkLCAweGZjMDAwMDNmLAlUUkFQLAkJSTEJfSwKLXsiYy5mLmQiLCAgICJTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5mLmQiLCAgICJNLFMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLmYucyIsICAgIlMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmYucyIsICAgIk0sUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMuZi5wcyIsICAiUyxUIiwJMHg0NmMwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuZi5wcyIsICAiTSxTLFQiLAkweDQ2YzAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bi5kIiwgICJTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bi5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLnVuLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVuLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMudW4ucHMiLCAiUyxUIiwJMHg0NmMwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudW4ucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5lcS5kIiwgICJTLFQiLAkweDQ2MjAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5lcS5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLmVxLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmVxLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMuZXEucHMiLCAiUyxUIiwJMHg0NmMwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuZXEucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51ZXEuZCIsICJTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51ZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLnVlcS5zIiwgIlMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMudWVxLnBzIiwiUyxUIiwJMHg0NmMwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWVxLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sdC5zIiwgICJTLFQiLAkweDQ2MDAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5sdC5zIiwgICJNLFMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLm9sdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm9sdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0fE0xCX0sCi17ImMub2x0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMub2x0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYy5vbHQucHMiLCJTLFQiLAkweDQ2YzAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5vbHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVsdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0fE0xCX0sCi17ImMudWx0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWx0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYy51bHQucHMiLCJTLFQiLAkweDQ2YzAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmxlLnMiLCAgIlMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmxlLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMub2xlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMub2xlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy5vbGUucyIsICJTLFQiLAkweDQ2MDAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5vbGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLm9sZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm9sZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWxlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWxlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy51bGUucyIsICJTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLnVsZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2YuZCIsICAiUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuc2YuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy5zZi5zIiwgICJTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5zZi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLnNmLnBzIiwgIlMsVCIsCTB4NDZjMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnNmLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsZS5kIiwiUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdsZS5kIiwiTSxTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy5uZ2xlLnMiLCJTLFQiLAkweDQ2MDAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2xlLnMiLCJNLFMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLm5nbGUucHMiLCJTLFQiLAkweDQ2YzAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2xlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5zZXEuZCIsICJTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5zZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLnNlcS5zIiwgIlMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnNlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMuc2VxLnBzIiwiUyxUIiwJMHg0NmMwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2VxLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2wuZCIsICJTLFQiLAkweDQ2MjAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2wuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLm5nbC5zIiwgIlMsVCIsCTB4NDYwMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nbC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0fE0xCX0sCi17ImMubmdsLnBzIiwiUyxUIiwJMHg0NmMwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sdC5kIiwgICJTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5sdC5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNHxNMQl9LAoteyJjLmx0LnBzIiwgIlMsVCIsCTB4NDZjMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmx0LnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdlLmQiLCAiUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy5uZ2UucyIsICJTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2UucyIsICJNLFMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNHxNMQl9LAoteyJjLm5nZS5wcyIsIlMsVCIsCTB4NDZjMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubGUuZCIsICAiUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubGUuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTR8TTEJfSwKLXsiYy5sZS5wcyIsICJTLFQiLAkweDQ2YzAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sZS5wcyIsICJNLFMsVCIsCTB4NDZjMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5ndC5kIiwgIlMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5ndC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0fE0xCX0sCi17ImMubmd0LnMiLCAiUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmd0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYy5uZ3QucHMiLCJTLFQiLAkweDQ2YzAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ3QucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjYWNoZSIsICAgImssbyhiKSIsCTB4YmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlJM3xUM3xNMQl9LAoteyJjZWlsLmwuZCIsICJELFMiLAkweDQ2MjAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY2VpbC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImNlaWwudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJjZWlsLncucyIsICJELFMiLAkweDQ2MDAwMDBlLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsiY2ZjMCIsICAgICJ0LEciLAkweDQwNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKLXsiY2ZjMSIsICAgICJ0LEciLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAlJMQl9LAoteyJjZmMxIiwgICAgInQsUyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCi17ImNmYzIiLCAgICAidCxHIiwJMHg0ODQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCUkxCX0sCi17ImNmYzMiLCAgICAidCxHIiwJMHg0YzQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzMsCUkxCX0sCi17ImN0YzAiLCAgICAidCxHIiwJMHg0MGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN0YzEiLCAgICAidCxHIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiY3RjMSIsICAgICJ0LFMiLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjdGMyIiwgICAgInQsRyIsCTB4NDhjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdGMzIiwgICAgInQsRyIsCTB4NGNjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdnQuZC5sIiwgIkQsUyIsCTB4NDZhMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjdnQuZC5zIiwgIkQsUyIsCTB4NDYwMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9EfEZQX1MsCUkxCX0sCi17ImN2dC5kLnciLCAiRCxTIiwJMHg0NjgwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImN2dC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmwiLCAiRCxTIiwJMHg0NmEwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmQiLCAiRCxTIiwJMHg0NjIwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LnMudyIsICJELFMiLAkweDQ2ODAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiY3Z0LnMucGwiLCJELFMiLAkweDQ2YzAwMDI4LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJNQl9LAoteyJjdnQucy5wdSIsIkQsUyIsCTB4NDZjMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCUk1CX0sCi17ImN2dC53LmQiLCAiRCxTIiwJMHg0NjIwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC53LnMiLCAiRCxTIiwJMHg0NjAwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImN2dC5wcy5zIiwiRCxWLFQiLAkweDQ2MDAwMDI2LCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17ImRhYnMiLCAgICAiZCx2IiwJMCwgICAgKGludCkgTV9EQUJTLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkYWRkIiwgICAgImQsdix0IiwJMHgwMDAwMDAyYywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRhZGQiLCAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0RBRERfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGFkZGkiLCAgICJ0LHIsaiIsCTB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZGl1IiwgICJ0LHIsaiIsCTB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZHUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkYWRkdSIsICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogZGN0ciBhbmQgZGN0dyBhcmUgdXNlZCBvbiB0aGUgcjUwMDAuICAqLwoteyJkY3RyIiwgICAgIm8oYikiLAkweGJjMDUwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkY3R3IiwgICAgIm8oYikiLAkweGJjMDkwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkZXJldCIsICAgIiIsICAgICAgICAgMHg0MjAwMDAxZiwgMHhmZmZmZmZmZiwgICAgMCwJRzJ8TTEJfSwKLS8qIEZvciBkZGl2LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRkaXYiLCAgICAieixzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRkaXYiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RESVZfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGRpdiIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVl8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIEZvciBkZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkZGl2dSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIFRoZSBNSVBTIGFzc2VtYmxlciB0cmVhdHMgdGhlIGRpdiBvcGNvZGUgd2l0aCB0d28gb3BlcmFuZHMgYXMKLSAgIHRob3VnaCB0aGUgZmlyc3Qgb3BlcmFuZCBhcHBlYXJlZCB0d2ljZSAodGhlIGZpcnN0IG9wZXJhbmQgaXMgYm90aAotICAgYSBzb3VyY2UgYW5kIGEgZGVzdGluYXRpb24pLiAgVG8gZ2V0IHRoZSBkaXYgbWFjaGluZSBpbnN0cnVjdGlvbiwKLSAgIHlvdSBtdXN0IHVzZSBhbiBleHBsaWNpdCBkZXN0aW5hdGlvbiBvZiAkMC4gICovCi17ImRpdiIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdiIsICAgICAieix0IiwJMHgwMDAwMDAxYSwgMHhmZmUwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXYiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXYuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwKLXsiZGl2LnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi0vKiBGb3IgZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkaXZ1IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXZ1IiwgICAgInosdCIsCTB4MDAwMDAwMWIsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWVV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXZ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZVXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkbGEiLCAgICAgInQsbyhiKSIsCTB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwgLyogZGFkZGl1ICovCi17ImRsYSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9ETEFfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRsaSIsICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAlJMwl9LCAvKiBhZGRpdSAqLwoteyJkbGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIG9yaSAqLwoteyJkbGkiLCAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fRExJLAlJTlNOX01BQ1JPLAlJMwl9LAotCi17ImRtYWRkMTYiLCAicyx0IiwgICAgICAweDAwMDAwMDI5LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfTE98UkRfTE8sCVYxCX0sCi17ImRtZmMwIiwgICAidCxHIiwJMHg0MDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfQzAsCUkzCX0sCi17ImRtdGMwIiwgICAidCxHIiwJMHg0MGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkzCX0sCi17ImRtZmMxIiwgICAidCxTIiwJMHg0NDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9TLAlJMwl9LAoteyJkbXRjMSIsICAgInQsUyIsCTB4NDRhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfUywJSTMJfSwKLXsiZG1mYzIiLCAgICJ0LFMiLAkweDQ4MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCi17ImRtdGMyIiwgICAidCxTIiwJMHg0OGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvIiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsbyIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMT19JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsb3UiLCAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMT1UsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvdSIsICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsdCIsICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJICAgIEkzfSwKLXsiZG11bHR1IiwgICJzLHQiLAkweDAwMDAwMDFkLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sICAgICAgSTN9LAoteyJkbmVnIiwgICAgImQsdyIsCTB4MDAwMDAwMmUsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTMJfSwgLyogZHN1YiAwICovCi17ImRuZWd1IiwgICAiZCx3IiwJMHgwMDAwMDAyZiwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3VidSAwKi8KLXsiZHJlbSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZHJlbSIsICAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtIiwgICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHNsbHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc2xsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzYywgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc2xsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzbGx2ICovCi17ImRzbGwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzbGwzMiAqLwoteyJkc2xsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzOCwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3JhdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzcmEzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmEiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNyYXYgKi8KLXsiZHNyYSIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNyYTMyICovCi17ImRzcmEiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNiLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmx2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNybDMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2UsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNybCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JsdiAqLwoteyJkc3JsIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JsMzIgKi8KLXsiZHNybCIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2EsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHN1YiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkc3ViIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRzdWJ1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJmLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZHN1YnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQlVfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZXJldCIsICAgICIiLAkJMHg0MjAwMDAxOCwgMHhmZmZmZmZmZiwJMCwJSTN8TTEJfSwKLXsiZmxvb3IubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGIsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJmbG9vci5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImZsb29yLncuZCIsICJELFMiLAkweDQ2MjAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsiZmxvb3Iudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJmbHVzaGkiLCAgIiIsCQkweGJjMDEwMDAwLCAweGZmZmZmZmZmLCAwLAkJTDEJfSwKLXsiZmx1c2hkIiwgICIiLAkJMHhiYzAyMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCi17ImZsdXNoaWQiLCAiIiwJCTB4YmMwMzAwMDAsIDB4ZmZmZmZmZmYsIDAsIEwxCQl9LAoteyJoaWJlcm5hdGUiLCIiLCAgICAgICAgMHg0MjAwMDAyMywgMHhmZmZmZmZmZiwJMCwgVjEJfSwKLXsianIiLCAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sCi17ImoiLCAgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAlJMQl9LCAvKiBqciAqLwotLyogU1ZSNCBQSUMgY29kZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBqLCBzbyBpdCBtdXN0IGJlIGEKLSAgIG1hY3JvLiAgKi8KLXsiaiIsCSAgICAiYSIsCTAsICAgICAoaW50KSBNX0pfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBhbmQgaW50ZXJuYWxseSBieSB0aGUKLSAgIGFzc2VtYmxlciwgYnV0IHdpbGwgbmV2ZXIgbWF0Y2ggdXNlciBpbnB1dCAoYmVjYXVzZSB0aGUgbGluZSBhYm92ZQotICAgd2lsbCBtYXRjaCBmaXJzdCkuICAqLwoteyJqIiwgICAgICAgImEiLAkweDA4MDAwMDAwLCAweGZjMDAwMDAwLAlVQkQsCQlJMQl9LAoteyJqYWxyIiwgICAgInMiLAkweDAwMDBmODA5LCAweGZjMWZmZmZmLAlVQkR8UkRfc3xXUl9kLAlJMQl9LAoteyJqYWxyIiwgICAgImQscyIsCTB4MDAwMDAwMDksIDB4ZmMxZjA3ZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCi0vKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGphbCwgc28gaXQgbXVzdCBiZSBhCi0gICBtYWNyby4gICovCi17ImphbCIsICAgICAiZCxzIiwJMCwgICAgIChpbnQpIE1fSkFMXzIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImphbCIsICAgICAicyIsCTAsICAgICAoaW50KSBNX0pBTF8xLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJqYWwiLCAgICAgImEiLAkwLCAgICAgKGludCkgTV9KQUxfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqYWwgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQotICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCi0gICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCi17ImphbCIsICAgICAiYSIsCTB4MGMwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRHxXUl8zMSwJSTEJfSwKLSAgLyogamFseCByZWFsbHkgc2hvdWxkIG9ubHkgYmUgYXZhbGlhYmxlIGlmIG1pcHMxNiBpcyBhdmFpbGFibGUsCi0gICAgIGJ1dCBmb3Igbm93IG1ha2UgaXQgSTEuICovCi17ImphbHgiLCAgICAiYSIsCTB4NzQwMDAwMDAsIDB4ZmMwMDAwMDAsIFVCRHxXUl8zMSwJSTEgICAgICB9LAoteyJsYSIsICAgICAgInQsbyhiKSIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwgLyogYWRkaXUgKi8KLXsibGEiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xBX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsYiIsICAgICAgInQsbyhiKSIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGJ1IiwgICAgICJ0LG8oYikiLAkweDkwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsYnUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZCIsCSAgICAidCxvKGIpIiwgICAweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX2IsCUkzCX0sCi17ImxkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9MRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGQiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZGMxIiwgICAgIlQsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwKLXsibGRjMSIsICAgICJFLG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCi17ImxkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibC5kIiwgICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sIC8qIGxkYzEgKi8KLXsibC5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX0xfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTF9EQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkYzIiLCAgICAiRSxvKGIpIiwJMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCUkyCX0sCi17ImxkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsbyhiKSIsCTB4ZGMwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRsIiwJICAgICJ0LG8oYikiLAkweDY4MDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoteyJsZGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsZHIiLAkgICAgInQsbyhiKSIsCTB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCUkzCX0sCi17ImxkciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRFJfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImxkeGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMSwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAoteyJsaCIsICAgICAgInQsbyhiKSIsCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxoIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGh1IiwgICAgICJ0LG8oYikiLAkweDk0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsaHUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogbGkgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17ImxpLmQiLCAgICAidCxGIiwJMCwgICAgKGludCkgTV9MSV9ELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5kIiwgICAgIlQsTCIsCTAsICAgIChpbnQpIE1fTElfREQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLnMiLCAgICAidCxmIiwJMCwgICAgKGludCkgTV9MSV9TLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5zIiwgICAgIlQsbCIsCTAsICAgIChpbnQpIE1fTElfU1MsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxsIiwJICAgICJ0LG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMgl9LAoteyJsbCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGxkIiwJICAgICJ0LG8oYikiLAkweGQwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMwl9LAoteyJsbGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExEX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsdWkiLCAgICAgInQsdSIsCTB4M2MwMDAwMDAsIDB4ZmZlMDAwMDAsCVdSX3QsCQlJMQl9LAoteyJsdXhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDUsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTUJfSwKLXsibHciLCAgICAgICJ0LG8oYikiLAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzAiLCAgICAiRSxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKLXsibHdjMSIsICAgICJFLG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCi17Imx3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibC5zIiwgICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sIC8qIGx3YzEgKi8KLXsibC5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzIiLCAgICAiRSxvKGIpIiwJMHhjODAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdsIiwgICAgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsY2FjaGUiLCAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KLXsibGNhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdsICovCi17Imx3ciIsICAgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHdyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZmx1c2giLCAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCi17ImZsdXNoIiwgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3ciAqLwoteyJsd3UiLCAgICAgInQsbyhiKSIsCTB4OWMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkzCX0sCi17Imx3dSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1VfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17Imx3eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMCwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAotCi0KLXsibWFkIiwJICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCi17Im1hZHUiLCAgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoteyJtYWRkLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1hZGQucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibWFkZC5wcyIsICJELFIsUyxUIiwJMHg0YzAwMDAyNiwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAoteyJtYWRkIiwgICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCi17Im1hZGQiLCAgICAicyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCSAgICAgICAgRzF8TTEJfSwKLXsibWFkZCIsICAgICJkLHMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxCX0sCi17Im1hZGR1IiwgICAicyx0IiwJMHgwMDAwMDAxZCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkJTDEJfSwKLXsibWFkZHUiLCAgICJzLHQiLAkweDcwMDAwMDAxLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJRzF8TTF9LAoteyJtYWRkdSIsICAgImQscyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwJRzF9LAoteyJtYWRkMTYiLCAgInMsdCIsICAgICAgMHgwMDAwMDAyOCwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlWMQl9LAoteyJtZmMwIiwgICAgInQsRyIsCTB4NDAwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoteyJtZmMxIiwgICAgInQsUyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTF9LAoteyJtZmMxIiwgICAgInQsRyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTF9LAoteyJtZmMyIiwgICAgInQsRyIsCTB4NDgwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoteyJtZmMzIiwgICAgInQsRyIsCTB4NGMwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoteyJtZmhpIiwgICAgImQiLAkweDAwMDAwMDEwLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0hJLAlJMQl9LAoteyJtZmxvIiwgICAgImQiLAkweDAwMDAwMDEyLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0xPLAlJMQl9LAoteyJtb3YuZCIsICAgIkQsUyIsCTB4NDYyMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJtb3YucyIsICAgIkQsUyIsCTB4NDYwMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJtb3YucHMiLCAgIkQsUyIsCTB4NDZjMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJNQl9LAoteyJtb3ZmIiwgICAgImQscyxOIiwJMHgwMDAwMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDfEZQX0R8RlBfUywgSTR8TTF9LAoteyJtb3ZmLmQiLCAgIkQsUyxOIiwJMHg0NjIwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0fE0xCX0sCi17Im1vdmYucyIsICAiRCxTLE4iLAkweDQ2MDAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsibW92Zi5wcyIsICJELFMsTiIsCTB4NDZjMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNQl9LAoteyJtb3ZuIiwgICAgImQsdix0IiwJMHgwMDAwMDAwYiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0fE0xCX0sCi17ImZmYyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYiwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdm4uZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNHxNMQl9LAoteyJtb3ZuLnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMywgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTR8TTEJfSwKLXsibW92dCIsICAgICJkLHMsTiIsCTB4MDAwMTAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQywJSTR8TTEJfSwKLXsibW92dC5kIiwgICJELFMsTiIsCTB4NDYyMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNHxNMQl9LAoteyJtb3Z0LnMiLCAgIkQsUyxOIiwJMHg0NjAxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17Im1vdnQucHMiLCAiRCxTLE4iLAkweDQ2YzEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTV9LAoteyJtb3Z6IiwgICAgImQsdix0IiwJMHgwMDAwMDAwYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0fE0xCX0sCi17ImZmcyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdnouZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEyLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNHxNMQl9LAoteyJtb3Z6LnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTR8TTEJfSwKLS8qIG1vdmUgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwoteyJtc3ViLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1zdWIucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibXN1Yi5wcyIsICJELFIsUyxUIiwJMHg0YzAwMDAyZSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAoteyJtc3ViIiwgICAgInMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtc3VidSIsICAgInMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtdGMwIiwgICAgInQsRyIsCTB4NDA4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MwfFdSX0NDLAlJMQl9LAoteyJtdGMxIiwgICAgInQsUyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKLXsibXRjMSIsICAgICJ0LEciLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCUkxCX0sCi17Im10YzIiLCAgICAidCxHIiwJMHg0ODgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzJ8V1JfQ0MsCUkxCX0sCi17Im10YzMiLCAgICAidCxHIiwJMHg0YzgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzN8V1JfQ0MsCUkxCX0sCi17Im10aGkiLCAgICAicyIsCTB4MDAwMDAwMTEsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfSEksCUkxCX0sCi17Im10bG8iLCAgICAicyIsCTB4MDAwMDAwMTMsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfTE8sCUkxCX0sCi17Im11bC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LAoteyJtdWwucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsibXVsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1CX0sCi17Im11bCIsICAgICAiZCx2LHQiLAkweDcwMDAwMDAyLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISXxXUl9MTyxQM30sCi17Im11bCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE8sCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9fSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsb3UiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMT1UsCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG91IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9VX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bHQiLCAgICAicyx0IiwJMHgwMDAwMDAxOCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKLXsibXVsdCIsICAgICJkLHMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKLXsibXVsdHUiLCAgICJzLHQiLAkweDAwMDAwMDE5LCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJSTF9LAoteyJtdWx0dSIsICAgImQscyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwgRzF9LAoteyJuZWciLCAgICAgImQsdyIsCTB4MDAwMDAwMjIsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTEJfSwgLyogc3ViIDAgKi8KLXsibmVndSIsICAgICJkLHciLAkweDAwMDAwMDIzLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YnUgMCAqLwoteyJuZWcuZCIsICAgIkQsViIsCTB4NDYyMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJuZWcucyIsICAgIkQsViIsCTB4NDYwMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJuZWcucHMiLCAgIkQsViIsCTB4NDZjMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELEk1CX0sCi17Im5tYWRkLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1hZGQucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJubWFkZC5wcyIsIkQsUixTLFQiLAkweDRjMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi17Im5tc3ViLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1zdWIucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJubXN1Yi5wcyIsIkQsUixTLFQiLAkweDRjMDAwMDNlLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi0vKiBub3AgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17Im5vciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsibm9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fTk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im5vdCIsICAgICAiZCx2IiwJMHgwMDAwMDAyNywgMHhmYzFmMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sLypub3IgZCxzLDAqLwoteyJvciIsICAgICAgImQsdix0IiwJMHgwMDAwMDAyNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17Im9yIiwgICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX09SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im9yaSIsICAgICAidCxyLGkiLAkweDM0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi0KLXsicGxsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsicGx1LnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmQsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLQoteyJwcmVmIiwgICAgImssbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlHM3xNMQl9LAoteyJwcmVmeCIsICAgImgsdChiKSIsCTB4NGMwMDAwMGYsIDB4ZmMwMDA3ZmYsIFJEX2J8UkRfdCwJSTQJfSwKLQoteyJwdWwucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyZSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJwdXUucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyZiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAotCi17InJlY2lwLmQiLCAiRCxTIiwJMHg0NjIwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCi17InJlY2lwLnMiLCAiRCxTIiwJMHg0NjAwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCi17InJlbSIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW0iLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1fM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbXUiLCAgICAieixzLHQiLAkweDAwMDAwMDFiLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTVVfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtdSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicmZlIiwgICAgICIiLAkJMHg0MjAwMDAxMCwgMHhmZmZmZmZmZiwJMCwJSTF8VDMJCX0sCi17InJvbCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9sIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9MX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvciIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPUiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9yIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvdW5kLmwuZCIsICJELFMiLAkweDQ2MjAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsicm91bmQubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDgsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJyb3VuZC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InJvdW5kLncucyIsICJELFMiLAkweDQ2MDAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsicnNxcnQuZCIsICJELFMiLAkweDQ2MjAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTQJfSwKLXsicnNxcnQucyIsICJELFMiLAkweDQ2MDAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTQJfSwKLXsic2IiLCAgICAgICJ0LG8oYikiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InNiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2MiLAkgICAgInQsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAlJMgl9LAoteyJzYyIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2NkIiwJICAgICJ0LG8oYikiLAkweGYwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTMJfSwKLXsic2NkIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NDRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2QiLAkgICAgInQsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2QiLCAgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1NEX09CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkYmJwIiwgICAiIiwJCTB4MDAwMDAwMGUsIDB4ZmZmZmZmZmYsCVRSQVAsICAgICAgICAgICBHMnxNMQl9LAoteyJzZGJicCIsICAgImMiLAkweDAwMDAwMDBlLCAweGZjMDBmZmZmLAlUUkFQLAkJRzJ8TTEJfSwKLXsic2RiYnAiLCAgICJjLHEiLAkweDAwMDAwMDBlLCAweGZjMDAwMDNmLAlUUkFQLAkJRzJ8TTEJfSwKLXsic2RjMSIsICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJFLG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMyIiwgICAgIkUsbyhiKSIsCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MyfFJEX2IsCUkyCX0sCi17InNkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMzIiwgICAgIkUsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MzfFJEX2IsCUkyCX0sCi17InNkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMzX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fU19ET0IsCUlOU05fTUFDUk8sCUkxCX0sCi17InMuZCIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TX0RBQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2RsIiwgICAgICJ0LG8oYikiLAkweGIwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkbCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRExfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkciIsICAgICAidCxvKGIpIiwJMHhiNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZHhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOSwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk0CX0sCi17InNlbHNsIiwgICAiZCx2LHQiLAkweDAwMDAwMDA1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCxMMQl9LAoteyJzZWxzciIsICAgImQsdix0IiwJMHgwMDAwMDAwMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKLXsic2VxIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0VRLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZXEiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TRVFfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dlIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2UiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3QiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1QsCUlOU05fTUFDUk8sCUkxCX0sCi17InNndCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1RVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNoIiwgICAgICAidCxvKGIpIiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0hfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xsdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzbGwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNsbHYgKi8KLXsic2xsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic2x0IiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMmEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHQiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2x0aSIsICAgICJ0LHIsaiIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0aXUiLCAgICJ0LHIsaiIsCTB4MmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0dSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHR1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNuZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NORSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic25lIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU05FX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNxcnQuZCIsICAiRCxTIiwJMHg0NjIwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InNxcnQucyIsICAiRCxTIiwJMHg0NjAwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InNyYXYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JhIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmF2ICovCi17InNyYSIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAzLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNybHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmx2ICovCi17InNybCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAyLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNzbm9wIiwgICAgICIiLAkweDAwMDAwMDQwLCAweGZmZmZmZmZmLAkwLAkJTTEJfSwKLXsic3RhbmRieSIsICIiLCAgICAgICAgIDB4NDIwMDAwMjEsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoteyJzdWIiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyMiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InN1YiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdWIuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwgICAgIAoteyJzdWIucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsic3ViLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1CX0sCi17InN1YnUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIzLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic3VidSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdXNwZW5kIiwgIiIsICAgICAgICAgMHg0MjAwMDAyMiwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCi17InN1eGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDBkLCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTUJfSwKLXsic3ciLCAgICAgICJ0LG8oYikiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3IiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMCIsICAgICJFLG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DMHxSRF9iLAlJMQl9LAoteyJzd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMSIsICAgICJULG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJFLG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzLnMiLCAgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LCAvKiBzd2MxICovCi17InMucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MyIiwgICAgIkUsbyhiKSIsCTB4ZTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MyfFJEX2IsCUkxCX0sCi17InN3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MzIiwgICAgIkUsbyhiKSIsCTB4ZWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MzfFJEX2IsCUkxCX0sCi17InN3YzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MzX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2wiLCAgICAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3dsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2NhY2hlIiwgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KLXsic2NhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dsICovCi17InN3ciIsICAgICAidCxvKGIpIiwJMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzd3IiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJpbnZhbGlkYXRlIiwgInQsbyhiKSIsMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJUkRfdHxSRF9iLAlJMgl9LCAvKiBzYW1lICovCi17ImludmFsaWRhdGUiLCAidCxBKGIpIiwwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dyICovCi17InN3eGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDA4LCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTQJfSwKLXsic3luYyIsICAgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMnxHMQl9LAoteyJzeW5jLnAiLCAgIiIsCQkweDAwMDAwNDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyCX0sCi17InN5bmMubCIsICAiIiwJCTB4MDAwMDAwMGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKLXsic3lzY2FsbCIsICIiLAkJMHgwMDAwMDAwYywgMHhmZmZmZmZmZiwJVFJBUCwJSTEJCX0sCi17InN5c2NhbGwiLCAiQiIsCTB4MDAwMDAwMGMsIDB4ZmMwMDAwM2YsCVRSQVAsCUkxCQl9LAoteyJ0ZXFpIiwgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQiLAkweDAwMDAwMDM0LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQscSIsCTB4MDAwMDAwMzQsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0ZXEiLCAgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwgLyogdGVxaSAqLwoteyJ0ZXEiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEVRX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRnZWkiLCAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCIsCTB4MDAwMDAwMzAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzMCwgMHhmYzAwMDAzZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRnZSIsICAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0Z2VpICovCi17InRnZSIsCSAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VfSSwgICAgSU5TTl9NQUNSTywJSTIJfSwKLXsidGdlaXUiLCAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0Z2V1IiwgICAgInMsdCIsCTB4MDAwMDAwMzEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0Z2VpdSAqLwoteyJ0Z2V1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bGJwIiwgICAgIiIsCQkweDQyMDAwMDA4LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGxiciIsICAgICIiLAkJMHg0MjAwMDAwMSwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxfE0xCX0sCi17InRsYndpIiwgICAiIiwJCTB4NDIwMDAwMDIsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMXxNMQl9LAoteyJ0bGJ3ciIsICAgIiIsCQkweDQyMDAwMDA2LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGx0aSIsICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHQiLCAgICAgInMsdCIsCTB4MDAwMDAwMzIsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLHQscSIsCTB4MDAwMDAwMzIsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpICovCi17InRsdCIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGx0aXUiLCAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHR1IiwgICAgInMsdCIsCTB4MDAwMDAwMzMsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzMsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpdSAqLwoteyJ0bHR1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bmVpIiwgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRuZSIsICAgICAicyx0IiwJMHgwMDAwMDAzNiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzNiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRuZWkgKi8KLXsidG5lIiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RORV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0cnVuYy5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17InRydW5jLmwucyIsICJELFMiLAkweDQ2MDAwMDA5LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJ0cnVuYy53LmQiLCAiRCxTLHgiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ0cnVuYy53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InRydW5jLncucyIsICJELFMseCIsCTB4NDYwMDAwMGQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJ0cnVuYy53LnMiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV1MsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEQsCUlOU05fTUFDUk8sCUkzCX0sCi17InVsZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTERfQSwJSU5TTl9NQUNSTywJSTMJfSwKLXsidWxoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMSCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGh1IiwgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxIVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxodSIsICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSFVfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c2QiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNELAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1c2QiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNEX0EsCUlOU05fTUFDUk8sCUkzCX0sCi17InVzaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0gsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzaCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0hfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InhvciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX1hPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3JpIiwgICAgInQscixpIiwJMHgzODAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJ3YWl0IiwgICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlJM3xNMQl9LAoteyJ3YWl0aSIsICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlMMQl9LAoteyJ3YiIsIAkgICAgIm8oYikiLAkweGJjMDQwMDAwLCAweGZjMWYwMDAwLCBTTXxSRF9iLAlMMQl9LAotLyogTm8gaGF6YXJkIHByb3RlY3Rpb24gb24gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLS10aGV5IHNob3VsZG4ndAotICAgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIGFuZCBpZiB0aGV5IGRvIGl0J3MgdXAgdG8gdGhlCi0gICB1c2VyIHRvIHB1dCBpbiBub3BzIGFzIG5lY2Vzc2FyeS4gIFRoZXNlIGFyZSBhdCB0aGUgZW5kIHNvIHRoYXQgdGhlCi0gICBkaXNhc2VtYmxlciByZWNvZ25pemVzIG1vcmUgc3BlY2lmaWMgdmVyc2lvbnMgZmlyc3QuICAqLwoteyJjMCIsICAgICAgIkMiLAkweDQyMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzEiLCAgICAgICJDIiwJMHg0NjAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMyIiwgICAgICAiQyIsCTB4NGEwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMyIsICAgICAgIkMiLAkweDRlMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiY29wMCIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMSIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMiIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMyIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMywJSU5TTl9NQUNSTywJSTEJfSwKLQotICAvKiBDb25mbGljdHMgd2l0aCB0aGUgNDY1MCdzICJtdWwiIGluc3RydWN0aW9uLiAgTm9ib2R5J3MgdXNpbmcgdGhlCi0gICAgIDQwMTAgYW55IG1vcmUsIHNvIG1vdmUgdGhpcyBpbnNuIG91dCBvZiB0aGUgd2F5LiAgSWYgdGhlIG9iamVjdAotICAgICBmb3JtYXQgZ2F2ZSB1cyBtb3JlIGluZm8sIHdlIGNvdWxkIGRvIHRoaXMgcmlnaHQuICAqLwoteyJhZGRjaXUiLCAgInQscixqIiwJMHg3MDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLEwxCX0sCi19OwotCi0jZGVmaW5lIE1JUFNfTlVNX09QQ09ERVMgXAotCSgoc2l6ZW9mIG1pcHNfYnVpbHRpbl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHNfYnVpbHRpbl9vcGNvZGVzWzBdKSkpCi1jb25zdCBpbnQgYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7Ci0KLS8qIGNvbnN0IHJlbW92ZWQgZnJvbSB0aGUgZm9sbG93aW5nIHRvIGFsbG93IGZvciBkeW5hbWljIGV4dGVuc2lvbnMgdG8gdGhlIAotICogYnVpbHQtaW4gaW5zdHJ1Y3Rpb24gc2V0LiAqLwotc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXMgPQotICAoc3RydWN0IG1pcHNfb3Bjb2RlICopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOwotaW50IGJmZF9taXBzX251bV9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKLSN1bmRlZiBNSVBTX05VTV9PUENPREVTCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwczE2LW9wYy5jIGIvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmQ3YzAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbWlwczE2LW9wYy5jLiAgTWlwczE2IG9wY29kZSB0YWJsZS4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG9wY29kZXMgdGFibGUgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgVGhlIGZvcm1hdCBvZgotICAgdGhpcyB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb25lIGluIG1pcHMtb3BjLmMuCi0gICBIb3dldmVyLCB0aGUgc3BlY2lhbCBsZXR0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgYXJlCi0gICBkaWZmZXJlbnQsIGFuZCB0aGUgdGFibGUgdXNlcyBzb21lIGRpZmZlcmVudCBmbGFncy4gICovCi0KLS8qIFVzZSBzb21lIHNob3J0IGhhbmQgbWFjcm9zIHRvIGtlZXAgZG93biB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lcyBpbgotICAgdGhlIG9wY29kZXMgdGFibGUuICAqLwotCi0jZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0jZGVmaW5lIEJSICAgICAgTUlQUzE2X0lOU05fQlJBTkNICi0KLSNkZWZpbmUgV1JfeAlNSVBTMTZfSU5TTl9XUklURV9YCi0jZGVmaW5lIFdSX3kJTUlQUzE2X0lOU05fV1JJVEVfWQotI2RlZmluZSBXUl96CU1JUFMxNl9JTlNOX1dSSVRFX1oKLSNkZWZpbmUgV1JfVAlNSVBTMTZfSU5TTl9XUklURV9UCi0jZGVmaW5lIFdSX1NQCU1JUFMxNl9JTlNOX1dSSVRFX1NQCi0jZGVmaW5lIFdSXzMxCU1JUFMxNl9JTlNOX1dSSVRFXzMxCi0jZGVmaW5lIFdSX1kJTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kKLQotI2RlZmluZSBSRF94CU1JUFMxNl9JTlNOX1JFQURfWAotI2RlZmluZSBSRF95CU1JUFMxNl9JTlNOX1JFQURfWQotI2RlZmluZSBSRF9aCU1JUFMxNl9JTlNOX1JFQURfWgotI2RlZmluZSBSRF9UCU1JUFMxNl9JTlNOX1JFQURfVAotI2RlZmluZSBSRF9TUAlNSVBTMTZfSU5TTl9SRUFEX1NQCi0jZGVmaW5lIFJEXzMxCU1JUFMxNl9JTlNOX1JFQURfMzEKLSNkZWZpbmUgUkRfUEMJTUlQUzE2X0lOU05fUkVBRF9QQwotI2RlZmluZSBSRF9YCU1JUFMxNl9JTlNOX1JFQURfR1BSX1gKLQotI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCi0jZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotCi0jZGVmaW5lIFRSQVAJSU5TTl9UUkFQCi0KLSNkZWZpbmUgSTMJSU5TTl9JU0EzCi0KLSNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKLQotY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW10gPSB7Ci17Im5vcCIsCSAgICAiIiwJCTB4NjUwMCwgMHhmZmZmLCBSRF9aIH0sIC8qIG1vdmUgJDAsJFogKi8KLXsibGEiLAkgICAgIngsQSIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFicyIsCSAgICAieCx3IiwJMCwgKGludCkgTV9BQlMsIElOU05fTUFDUk8gfSwKLXsiYWRkaXUiLCAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKLXsiYWRkaXUiLCAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCi17ImFkZGl1IiwgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZGl1IiwgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkaXUiLCAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFkZGl1IiwgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJhZGR1IiwgICAgInosdix5IiwJMHhlMDAxLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCi17ImFkZHUiLCAgICAieSx4LDQiLAkweDQwMDAsIDB4ZjgxMCwgV1JfeXxSRF94IH0sCi17ImFkZHUiLCAgICAieCxrIiwJMHg0ODAwLCAweGY4MDAsIFdSX3h8UkRfeCB9LAoteyJhZGR1IiwgICAgIlMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGR1IiwgICAgIlMsUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZHUiLCAgICAieCxQLFYiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJhZGR1IiwgICAgIngsUyxWIiwJMHgwMDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsiYW5kIiwJICAgICJ4LHkiLAkweGU4MGMsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLXsiYiIsCSAgICAicSIsCTB4MTAwMCwgMHhmODAwLCBCUn0sCi17ImJlcSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JFUSwgSU5TTl9NQUNSTyB9LAoteyJiZXEiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CRVFfSSwgSU5TTl9NQUNSTyB9LAoteyJiZXF6IiwgICAgIngscCIsCTB4MjAwMCwgMHhmODAwLCBCUnxSRF94IH0sCi17ImJnZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRSwgSU5TTl9NQUNSTyB9LAoteyJiZ2UiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR0VfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ2V1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR0VVLCBJTlNOX01BQ1JPIH0sCi17ImJnZXUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRVVfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ3QiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1QsIElOU05fTUFDUk8gfSwKLXsiYmd0IiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdUX0ksIElOU05fTUFDUk8gfSwKLXsiYmd0dSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdUVSwgSU5TTl9NQUNSTyB9LAoteyJiZ3R1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RVX0ksIElOU05fTUFDUk8gfSwKLXsiYmxlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFLCBJTlNOX01BQ1JPIH0sCi17ImJsZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMRV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMRVUsIElOU05fTUFDUk8gfSwKLXsiYmxldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsdCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVCwgSU5TTl9NQUNSTyB9LAoteyJibHQiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTFRfSSwgSU5TTl9NQUNSTyB9LAoteyJibHR1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CTFRVLCBJTlNOX01BQ1JPIH0sCi17ImJsdHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVFVfSSwgSU5TTl9NQUNSTyB9LAoteyJibmUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTkUsIElOU05fTUFDUk8gfSwKLXsiYm5lIiwgICAgICJ4LFUscCIsCTAsIChpbnQpIE1fQk5FX0ksIElOU05fTUFDUk8gfSwKLXsiYm5leiIsICAgICJ4LHAiLAkweDI4MDAsIDB4ZjgwMCwgQlJ8UkRfeCB9LAoteyJicmVhayIsICAgIjYiLAkweGU4MDUsIDB4ZjgxZiwgVFJBUCB9LAoteyJidGVxeiIsICAgInAiLAkweDYwMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJidG5leiIsICAgInAiLAkweDYxMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJjbXBpIiwgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsiY21wIiwJICAgICJ4LHkiLAkweGU4MGEsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsiY21wIiwgICAgICJ4LFUiLAkweDcwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17ImRsYSIsCSAgICAieSxFIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSx4LDQiLAkweDQwMTAsIDB4ZjgxMCwgV1JfeXxSRF94LCBJMyB9LAoteyJkYWRkaXUiLCAgInksaiIsCTB4ZmQwMCwgMHhmZjAwLCBXUl95fFJEX3ksIEkzIH0sCi17ImRhZGRpdSIsICAiUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgIlMsUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgInksUCxXIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSxTLFciLAkweGZmMDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ6LHYseSIsCTB4ZTAwMCwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCi17ImRhZGR1IiwgICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJkZGl2IiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZGRpdiIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRERJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRkaXZ1IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkZGl2dSIsICAgInosdix5IiwJMCwgKGludCkgTV9ERElWVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdiIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdiIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdnUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdnUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVlVfMywgSU5TTl9NQUNSTyB9LAoteyJkbXVsIiwgICAgInosdix5IiwJMCwgKGludCkgTV9ETVVMLCBJTlNOX01BQ1JPLCBJMyB9LAoteyJkbXVsdCIsICAgIngseSIsCTB4ZTgxYywgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRtdWx0dSIsICAieCx5IiwJMHhlODFkLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbSIsICAgICIwLHgseSIsCTB4ZTgxZSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRyZW0iLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RSRU1fMywgSU5TTl9NQUNSTyB9LAoteyJkcmVtdSIsICAgIjAseCx5IiwJMHhlODFmLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbXUiLCAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTVVfMywgSU5TTl9NQUNSTyB9LAoteyJkc2xsdiIsICAgInkseCIsCTB4ZTgxNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNsbCIsICAgICJ4LHcsWyIsCTB4MzAwMSwgMHhmODAzLCBXUl94fFJEX3ksIEkzIH0sCi17ImRzbGwiLCAgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JhdiIsICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNyYSIsICAgICJ5LF0iLAkweGU4MTMsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoteyJkc3JhIiwgICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNybHYiLCAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmwiLCAgICAieSxdIiwJMHhlODA4LCAweGY4MWYsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZHNybCIsICAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzdWJ1IiwgICAieix2LHkiLAkweGUwMDIsIDB4ZjgwMywgV1JfenxSRF94fFJEX3ksIEkzIH0sCi17ImRzdWJ1IiwgICAieSx4LDQiLAkwLCAoaW50KSBNX0RTVUJVX0ksIElOU05fTUFDUk8gfSwKLXsiZHN1YnUiLCAgICJ5LGoiLAkwLCAoaW50KSBNX0RTVUJVX0lfMiwgSU5TTl9NQUNSTyB9LAoteyJleGl0IiwgICAgIkwiLAkweGVkMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVlMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVmMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJlbnRyeSIsICAgImwiLAkweGU4MDksIDB4ZjgxZiwgVFJBUCB9LAoteyJleHRlbmQiLCAgImUiLAkweGYwMDAsIDB4ZjgwMCwgMCB9LAoteyJqYWxyIiwgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsciIsICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwgICAgICJ4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsICAgICAiUix4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsCSAgICAiYSIsCTB4MTgwMCwgMHhmYzAwLCBVQkR8V1JfMzEgfSwKLXsiamFseCIsICAgICJhIiwJMHgxYzAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoteyJqciIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqciIsCSAgICAiUiIsCTB4ZTgyMCwgMHhmZmZmLCBVQkR8UkRfMzEgfSwKLXsiaiIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoteyJsYiIsCSAgICAieSw1KHgpIiwJMHg4MDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsYnUiLAkgICAgInksNSh4KSIsCTB4YTAwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGQiLAkgICAgInksRCh4KSIsCTB4MzgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCi17ImxkIiwJICAgICJ5LEIiLAkweGZjMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsibGQiLAkgICAgInksRChQKSIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJsZCIsCSAgICAieSxEKFMpIiwJMHhmODAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImxoIiwJICAgICJ5LEgoeCkiLAkweDg4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxodSIsCSAgICAieSxIKHgpIiwJMHhhODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsaSIsCSAgICAieCxVIiwJMHg2ODAwLCAweGY4MDAsIFdSX3ggfSwKLXsibHciLAkgICAgInksVyh4KSIsCTB4OTgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibHciLAkgICAgIngsQSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17Imx3IiwJICAgICJ4LFYoUCkiLAkweGIwMDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJsdyIsCSAgICAieCxWKFMpIiwJMHg5MDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsibHd1IiwgICAgICJ5LFcoeCkiLAkweGI4MDAsIDB4ZjgwMCwgV1JfeXxSRF94LCBJMyB9LAoteyJtZmhpIiwgICAgIngiLAkweGU4MTAsIDB4ZjhmZiwgV1JfeHxSRF9ISSB9LAoteyJtZmxvIiwgICAgIngiLAkweGU4MTIsIDB4ZjhmZiwgV1JfeHxSRF9MTyB9LAoteyJtb3ZlIiwgICAgInksWCIsCTB4NjcwMCwgMHhmZjAwLCBXUl95fFJEX1ggfSwKLXsibW92ZSIsICAgICJZLFoiLAkweDY1MDAsIDB4ZmYwMCwgV1JfWXxSRF9aIH0sCi17Im11bCIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX01VTCwgSU5TTl9NQUNSTyB9LAoteyJtdWx0IiwgICAgIngseSIsCTB4ZTgxOCwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsibXVsdHUiLCAgICJ4LHkiLAkweGU4MTksIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17Im5lZyIsCSAgICAieCx3IiwJMHhlODBiLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoteyJub3QiLAkgICAgIngsdyIsCTB4ZTgwZiwgMHhmODFmLCBXUl94fFJEX3kgfSwKLXsib3IiLAkgICAgIngseSIsCTB4ZTgwZCwgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoteyJyZW0iLCAgICAgIjAseCx5IiwJMHhlODFhLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW0iLCAgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1fMywgSU5TTl9NQUNSTyB9LAoteyJyZW11IiwgICAgIjAseCx5IiwJMHhlODFiLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW11IiwgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1VXzMsIElOU05fTUFDUk8gfSwKLXsic2IiLAkgICAgInksNSh4KSIsCTB4YzAwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic2QiLAkgICAgInksRCh4KSIsCTB4NzgwMCwgMHhmODAwLCBSRF95fFJEX3gsIEkzIH0sCi17InNkIiwJICAgICJ5LEQoUykiLAkweGY5MDAsIDB4ZmYwMCwgUkRfeXxSRF9QQywgSTMgfSwKLXsic2QiLAkgICAgIlIsQyhTKSIsCTB4ZmEwMCwgMHhmZjAwLCBSRF8zMXxSRF9QQyB9LAoteyJzaCIsCSAgICAieSxIKHgpIiwJMHhjODAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzbGx2IiwgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbGwiLAkgICAgIngsdyw8IiwJMHgzMDAwLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzbGwiLCAgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbHRpIiwgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0IiwJICAgICJ4LHkiLAkweGU4MDIsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsic2x0IiwgICAgICJ4LDgiLAkweDUwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdGl1IiwgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHR1IiwgICAgIngseSIsCTB4ZTgwMywgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJzbHR1IiwgICAgIngsOCIsCTB4NTgwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic3JhdiIsICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JhIiwJICAgICJ4LHcsPCIsCTB4MzAwMywgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JhIiwgICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsdiIsICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsIiwJICAgICJ4LHcsPCIsCTB4MzAwMiwgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JsIiwgICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3VidSIsICAgICJ6LHYseSIsCTB4ZTAwMywgMHhmODAzLCBXUl96fFJEX3h8UkRfeSB9LAoteyJzdWJ1IiwgICAgInkseCw0IiwJMCwgKGludCkgTV9TVUJVX0ksIElOU05fTUFDUk8gfSwKLXsic3VidSIsICAgICJ4LGsiLAkwLCAoaW50KSBNX1NVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCi17InN3IiwJICAgICJ5LFcoeCkiLAkweGQ4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InN3IiwJICAgICJ4LFYoUykiLAkweGQwMDAsIDB4ZjgwMCwgUkRfeHxSRF9TUCB9LAoteyJzdyIsCSAgICAiUixWKFMpIiwJMHg2MjAwLCAweGZmMDAsIFJEXzMxfFJEX1NQIH0sCi17InhvciIsCSAgICAieCx5IiwJMHhlODBlLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi19OwotCi1jb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlcyA9Ci0gICgoc2l6ZW9mIG1pcHMxNl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHMxNl9vcGNvZGVzWzBdKSkpOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluIGIvb3Bjb2Rlcy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjliZTlkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3Igb3Bjb2Rlcy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLVNldCBhcmNobmFtZSBBUkNIX3t0YXJnZXRfYXJjaH0KLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9tNjhrLwotCVNldCBCRkRfTUFDSElORVMgICcie299Im02OGstZGlzLmMubyAie299Im02OGstb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLwotCVNldCBCRkRfTUFDSElORVMgICcie299InBwYy1kaXMuYy5vICJ7b30icHBjLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvaTM4Ni8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJpMzg2LWRpcy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbWlwcy8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJtaXBzLWRpcy5jLm8gIntvfSJtaXBzLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvc2gvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ic2gtZGlzLmMubycKLUVuZCBJZgotCi1FY2hvICcjIFN0YXJ0IGZyb20gbXB3LWNvbmZpZy5pbicJCQkgPiAie299Im1rLnRtcAotRWNobyAiQkZEX01BQ0hJTkVTID0gIiB7QkZEX01BQ0hJTkVTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJIAkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL29wY29kZXMvbXB3LW1ha2Uuc2VkIGIvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjA0ODYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIG9wY29kZXMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0jIEVtcHR5IEhERUZJTkVTLgotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLS9CRkRfTUFDSElORVMvcy9AQkZEX01BQ0hJTkVTQC97QkZEX01BQ0hJTkVTfS8KLS9hcmNoZGVmcy9zL0BhcmNoZGVmc0Ave0FSQ0hERUZTfS8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBSZW1vdmUgcGljIHRyaWNrZXJ5IGZyb20gb3RoZXIgcnVsZXMgLSBhaW1lZCBhdCB0aGUgcnVsZQotIyBmb3IgZGlzYXNzZW1ibGUubyBpbiBwYXJ0aWN1bGFyLgotLy1uICJ7UElDRkxBR30iLywvRW5kIElmL2QKZGlmZiAtLWdpdCBhL29wY29kZXMvbnMzMmstZGlzLmMgYi9vcGNvZGVzL25zMzJrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyNjZiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbnMzMmstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotLyogUHJpbnQgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODYsIDg4LCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaWYgIWRlZmluZWQoY29uc3QpICYmICFkZWZpbmVkKF9fU1REQ19fKQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICpkaXNfaW5mbzsKLQotLyoKLSAqIEhhY2tzIHRvIGdldCBpdCB0byBjb21waWxlIDw9IFJFQUQgVEhFU0UgQVMgRklYRVMgTkVFREVECi0gKi8KLSNkZWZpbmUgSU5WQUxJRF9GTE9BVCh2YWwsIHNpemUpIGludmFsaWRfZmxvYXQoKGNoYXIgKil2YWwsIHNpemUpCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBpbnQsIGludCAqLCBjaGFyICosIGJmZF92bWEsIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGdldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBpbnQgKikpOwotc3RhdGljIGludCBpbnZhbGlkX2Zsb2F0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBsb25nIHJlYWRfbWVtb3J5X2ludGVnZXIoYWRkciwgbnIpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0gICAgIGludCBucjsKLXsKLSAgbG9uZyB2YWw7Ci0gIGludCBpOwotICBmb3IgKHZhbCA9IDAsIGkgPSBuciAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFsID0gICh2YWwgPDwgOCk7Ci0gICAgdmFsIHw9ICgweGZmICYgKihhZGRyICsgaSkpOwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIDMyMDAwIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcy4gICovCi0jZGVmaW5lIE1BWExFTiA2MgotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSNkZWZpbmUgTk9QQ09ERVMgKHNpemVvZiBuczMya19vcGNvZGVzIC8gc2l6ZW9mIG5zMzJrX29wY29kZXNbMF0pCi0KLSNkZWZpbmUgTkVYVF9JU19BRERSCSd8JwotCi0MCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIHsKLSAgY2hhciAqcGF0dGVybjsJCS8qIHRoZSBvcHRpb24gaXRzZWxmICovCi0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiBiaW5hcnkgdmFsdWUgb2YgdGhlIG9wdGlvbiAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwkJLyogdGhlc2UgYml0cyBtdXN0IG1hdGNoICovCi19OwotCi0MCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfdVtdPSAvKiByZXN0b3JlLCBleGl0ICovCi17Ci0gIHsgInIwIiwJMHg4MCwJMHg4MAl9LAotICB7ICJyMSIsCTB4NDAsCTB4NDAJfSwKLSAgeyAicjIiLAkweDIwLAkweDIwCX0sCi0gIHsgInIzIiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNCIsCTB4MDgsCTB4MDgJfSwKLSAgeyAicjUiLAkweDA0LAkweDA0CX0sCi0gIHsgInI2IiwJMHgwMiwJMHgwMgl9LAotICB7ICJyNyIsCTB4MDEsCTB4MDEJfSwKLSAgeyAgMCAsCTB4MDAsCTB4MDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X1VbXT0gLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyAicjAiLAkweDAxLAkweDAxCX0sCi0gIHsgInIxIiwJMHgwMiwJMHgwMgl9LAotICB7ICJyMiIsCTB4MDQsCTB4MDQJfSwKLSAgeyAicjMiLAkweDA4LAkweDA4CX0sCi0gIHsgInI0IiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNSIsCTB4MjAsCTB4MjAJfSwKLSAgeyAicjYiLAkweDQwLAkweDQwCX0sCi0gIHsgInI3IiwJMHg4MCwJMHg4MAl9LAotICB7ICAwICwJMHgwMCwJMHgwMAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfT1tdPSAvKiBzZXRjZmcgKi8KLXsKLSAgeyAiYyIsCTB4OCwJMHg4CX0sCi0gIHsgIm0iLAkweDQsCTB4NAl9LAotICB7ICJmIiwJMHgyLAkweDIJfSwKLSAgeyAiaSIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfQ1tdPSAvKiBjaW52ICovCi17Ci0gIHsgImEiLAkweDQsCTB4NAl9LAotICB7ICJpIiwJMHgyLAkweDIJfSwKLSAgeyAiZCIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfU1tdPSAvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ICJiIiwJMHgxLAkweDEJfSwKLSAgeyAidSIsCTB4NiwJMHg2CX0sCi0gIHsgInciLAkweDIsCTB4Mgl9LAotICB7ICAwICwJMHgwLAkweDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QNTMyW109IC8qIGxwciBzcHIgKi8KLXsKLSAgeyAidXMiLAkweDAsCTB4Zgl9LAotICB7ICJkY3IiLAkweDEsCTB4Zgl9LAotICB7ICJicGMiLAkweDIsCTB4Zgl9LAotICB7ICJkc3IiLAkweDMsCTB4Zgl9LAotICB7ICJjYXIiLAkweDQsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJ1c3AiLAkweGIsCTB4Zgl9LAotICB7ICJjZmciLAkweGMsCTB4Zgl9LAotICB7ICJwc3IiLAkweGQsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MDAsCTB4Zgl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X001MzJbXT0gLyogbG1yIHNtciAqLwotewotICB7ICJtY3IiLAkweDksCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJ0ZWFyIiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJpdmFyMCIsCTB4ZSwJMHhmCX0sCi0gIHsgIml2YXIxIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfUDAzMltdPSAvKiBscHIgc3ByICovCi17Ci0gIHsgInVwc3IiLAkweDAsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJwc3IiLAkweGIsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTAzMltdPSAvKiBsbXIgc21yICovCi17Ci0gIHsgImJwcjAiLAkweDAsCTB4Zgl9LAotICB7ICJicHIxIiwJMHgxLAkweGYJfSwKLSAgeyAicGYwIiwJMHg0LAkweGYJfSwKLSAgeyAicGYxIiwJMHg1LAkweGYJfSwKLSAgeyAic2MiLAkweDgsCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJiY250IiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJlaWEiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotCi0vKgotICogZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBwcmVzZW50Ci0gKi8KLXN0YXRpYyB2b2lkCi1vcHRsaXN0KG9wdGlvbnMsIG9wdGlvblAsIHJlc3VsdCkKLSAgICAgaW50IG9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLXsKLSAgICBpZiAob3B0aW9ucyA9PSAwKSB7Ci0Jc3ByaW50ZihyZXN1bHQsICJbXSIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJbIik7Ci0KLSAgICBmb3IgKDsgKG9wdGlvbnMgIT0gMCkgJiYgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7Ci0JaWYgKChvcHRpb25zICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIC8qIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSByZXN1bHQgYW5kIG9wdGlvbnMgKi8KLQkgICAgc3RyY2F0KHJlc3VsdCwgb3B0aW9uUC0+cGF0dGVybik7Ci0JICAgIG9wdGlvbnMgJj0gfm9wdGlvblAtPnZhbHVlOwotCSAgICBpZiAob3B0aW9ucyAhPSAwKQkvKiBtb3JlIG9wdGlvbnMgdG8gY29tZSAqLwotCQlzdHJjYXQocmVzdWx0LCAiLCIpOwotCX0KLSAgICB9Ci0gICAgaWYgKG9wdGlvbnMgIT0gMCkKLQlzdHJjYXQocmVzdWx0LCAidW5kZWZpbmVkIik7Ci0KLSAgICBzdHJjYXQocmVzdWx0LCAiXSIpOwotfQotCi1zdGF0aWMgdm9pZAotbGlzdF9zZWFyY2ggKHJlZ192YWx1ZSwgb3B0aW9uUCwgcmVzdWx0KQotICAgICBpbnQgcmVnX3ZhbHVlOwotICAgICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwotICAgICBjaGFyICpyZXN1bHQ7Ci17Ci0gICAgZm9yICg7IG9wdGlvblAtPnBhdHRlcm47IG9wdGlvblArKykgewotCWlmICgocmVnX3ZhbHVlICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIHNwcmludGYocmVzdWx0LCAiJXMiLCBvcHRpb25QLT5wYXR0ZXJuKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJ1bmRlZmluZWQiKTsKLX0KLQwKLS8qCi0gKiBleHRyYWN0ICJjb3VudCIgYml0cyBzdGFydGluZyAib2Zmc2V0IiBiaXRzCi0gKiBpbnRvIGJ1ZmZlcgotICovCi0KLXN0YXRpYyBpbnQKLWJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IGJpdDsKLQotICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7Ci0gIG9mZnNldCAmPSA3OwotICBiaXQgPSAxOwotICByZXN1bHQgPSAwOwotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBKGRpc19pbmZvLCBidWZmZXIgKyAxKTsKLSAgICAgIGlmICgoKmJ1ZmZlciAmICgxIDw8IG9mZnNldCkpKQotCXJlc3VsdCB8PSBiaXQ7Ci0gICAgICBpZiAoKytvZmZzZXQgPT0gOCkKLQl7Ci0JICBvZmZzZXQgPSAwOwotCSAgYnVmZmVyKys7Ci0JfQotICAgICAgYml0IDw8PSAxOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogTGlrZSBiaXQgZXh0cmFjdCBidXQgdGhlIGJ1ZmZlciBpcyB2YWxpZCBhbmQgZG9lbid0IG5lZWQgdG8gYmUKLSAqIGZldGNoZWQKLSAqLwotc3RhdGljIGludAotYml0X2V4dHJhY3Rfc2ltcGxlIChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IG1hc2s7Ci0gIGludCBiaXQ7Ci0KLSAgYnVmZmVyICs9IG9mZnNldCA+PiAzOwotICBvZmZzZXQgJj0gNzsKLSAgYml0ID0gMTsKLSAgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCi0JcmVzdWx0IHw9IGJpdDsKLSAgICAgIGlmICgrK29mZnNldCA9PSA4KQotCXsKLQkgIG9mZnNldCA9IDA7Ci0JICBidWZmZXIrKzsKLQl9Ci0gICAgICBiaXQgPDw9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotYml0X2NvcHkgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgdG8pCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotICAgICBjaGFyICp0bzsKLXsKLSAgZm9yKDsgY291bnQgPiA4OyBjb3VudCAtPSA4LCB0bysrLCBvZmZzZXQgKz0gOCkKLSAgICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIDgpOwotICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKLX0KLQotCi1zdGF0aWMgaW50Ci1zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZSwgYml0czsKLXsKLSAgdmFsdWUgPSB2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpOwotICByZXR1cm4gKHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpCi0JICA/IHZhbHVlIHwgKH4oKDEgPDwgYml0cykgLSAxKSkKLQkgIDogdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotZmxpcF9ieXRlcyAocHRyLCBjb3VudCkKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGNoYXIgdG1wOwotCi0gIHdoaWxlIChjb3VudCA+IDApCi0gICAgewotICAgICAgdG1wID0gcHRyWzBdOwotICAgICAgcHRyWzBdID0gcHRyW2NvdW50LTFdOwotICAgICAgcHRyW2NvdW50LTFdID0gdG1wOwotICAgICAgcHRyKys7Ci0gICAgICBjb3VudCAtPSAyOwotICAgIH0KLX0KLQwKLS8qIEdpdmVuIGEgY2hhcmFjdGVyIEMsIGRvZXMgaXQgcmVwcmVzZW50IGEgZ2VuZXJhbCBhZGRyZXNzaW5nIG1vZGU/ICAqLwotI2RlZmluZSBJc19nZW4oYykgXAotICAoKGMpID09ICdGJyB8fCAoYykgPT0gJ0wnIHx8IChjKSA9PSAnQicgXAotICAgfHwgKGMpID09ICdXJyB8fCAoYykgPT0gJ0QnIHx8IChjKSA9PSAnQScgfHwgKGMpID09ICdJJyB8fCAoYykgPT0gJ1onKQotCi0vKiBBZHJlc3NpbmcgbW9kZXMuICAqLwotI2RlZmluZSBBZHJtb2RfaW5kZXhfYnl0ZSAweDFjCi0jZGVmaW5lIEFkcm1vZF9pbmRleF93b3JkIDB4MWQKLSNkZWZpbmUgQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgMHgxZQotI2RlZmluZSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQgMHgxZgotCi0vKiBJcyBNT0RFIGFuIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlPyAgKi8KLSNkZWZpbmUgQWRybW9kX2lzX2luZGV4KG1vZGUpIFwKLSAgKG1vZGUgPT0gQWRybW9kX2luZGV4X2J5dGUgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfd29yZCBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF9kb3VibGV3b3JkIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X3F1YWR3b3JkKQotCi0MCi0vKiBQcmludCB0aGUgMzIwMDAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fbnMzMmsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgKmQ7Ci0gIHVuc2lnbmVkIHNob3J0IGZpcnN0X3dvcmQ7Ci0gIGludCBpb2Zmc2V0OwkJLyogYml0cyBpbnRvIGluc3RydWN0aW9uICovCi0gIGludCBhb2Zmc2V0OwkJLyogYml0cyBpbnRvIGFyZ3VtZW50cyAqLwotICBjaGFyIGFyZ19idWZzW01BWF9BUkdTKzFdW0FSR19MRU5dOwotICBpbnQgYXJnbnVtOwotICBpbnQgbWF4YXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotICBkaXNfaW5mbyA9IGluZm87Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICAvKiBMb29rIGZvciA4Yml0IG9wY29kZXMgZmlyc3QuIE90aGVyIHdpc2UsIGZldGNoaW5nIHR3byBieXRlcyBjb3VsZCB0YWtlCi0gICAqIHVzIG92ZXIgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgdW5uZWNlc3NhcmlsbHkKLSAgICovCi0gIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgIGlmIChuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplIDw9IDgKLQkmJiAoKGJ1ZmZlclswXQotCSAgICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICAgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpKQotICAgICAgYnJlYWs7Ci0gIGlmIChpID09IE5PUENPREVTKSB7Ci0gICAgLyogTWF5YmUgaXQgaXMgOSB0byAxNiBiaXRzIGJpZyAqLwotICAgIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMik7Ci0gICAgZmlyc3Rfd29yZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIoYnVmZmVyLCAyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgICAgaWYgKChmaXJzdF93b3JkCi0JICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICA9PSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zZWVkKQotCWJyZWFrOwotCi0gICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGlmIChpID09IE5PUENPREVTKQotICAgICAgewotCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIjAlbyIsIGJ1ZmZlclswXSk7Ci0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0KLQotICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlcyIsIG5zMzJrX29wY29kZXNbaV0ubmFtZSk7Ci0KLSAgaW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7Ci0gIGFvZmZzZXQgPSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zaXplOwotICBkID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGVyYW5kczsKLQotICBpZiAoKmQpCi0gICAgewotICAgICAgLyogT2Zmc2V0IGluIGJpdHMgb2YgdGhlIGZpcnN0IHRoaW5nIGJleW9uZCBlYWNoIGluZGV4IGJ5dGUuCi0JIEVsZW1lbnQgMCBpcyBmb3Igb3BlcmFuZCBBIGFuZCBlbGVtZW50IDEgaXMgZm9yIG9wZXJhbmQgQi4KLQkgVGhlIHJlc3QgYXJlIGlycmVsZXZhbnQsIGJ1dCB3ZSBwdXQgdGhlbSBoZXJlIHNvIHdlIGRvbid0Ci0JIGluZGV4IG91dHNpZGUgdGhlIGFycmF5LiAgKi8KLSAgICAgIGludCBpbmRleF9vZmZzZXRbTUFYX0FSR1NdOwotCi0gICAgICAvKiAwIGZvciBvcGVyYW5kIEEsIDEgZm9yIG9wZXJhbmQgQiwgZ3JlYXRlciBmb3Igb3RoZXIgYXJncy4gICovCi0gICAgICBpbnQgd2hpY2hhcmcgPSAwOwotICAgICAgCi0gICAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gICAgICBtYXhhcmcgPSAwOwotCi0gICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IGJ5dGVzLAotCSBpZiB3ZSBhcmUgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlLCBzaW5jZSB0aGUgaW5kZXgKLQkgYnl0ZXMgb2NjdXIgcmlnaHQgYWZ0ZXIgdGhlIGJhc2ljIGluc3RydWN0aW9uLCBub3QgYXMgcGFydAotCSBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICAqLwotICAgICAgaWYgKElzX2dlbihkWzFdKSkKLQl7Ci0JICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDUsIDUpOwotCi0JICBpZiAoQWRybW9kX2lzX2luZGV4IChhZGRyX21vZGUpKQotCSAgICB7Ci0JICAgICAgYW9mZnNldCArPSA4OwotCSAgICAgIGluZGV4X29mZnNldFswXSA9IGFvZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZFsyXSAmJiBJc19nZW4oZFszXSkpCi0JewotCSAgaW50IGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQgLSAxMCwgNSk7Ci0KLQkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCi0JICAgIHsKLQkgICAgICBhb2Zmc2V0ICs9IDg7Ci0JICAgICAgaW5kZXhfb2Zmc2V0WzFdID0gYW9mZnNldDsKLQkgICAgfQotCX0KLQotICAgICAgd2hpbGUgKCpkKQotCXsKLQkgIGFyZ251bSA9ICpkIC0gJzEnOwotCSAgZCsrOwotCSAgaWYgKGFyZ251bSA+IG1heGFyZyAmJiBhcmdudW0gPCBNQVhfQVJHUykKLQkgICAgbWF4YXJnID0gYXJnbnVtOwotCSAgaW9mZnNldCA9IHByaW50X2luc25fYXJnICgqZCwgaW9mZnNldCwgJmFvZmZzZXQsIGJ1ZmZlciwKLQkJCQkgICAgbWVtYWRkciwgYXJnX2J1ZnNbYXJnbnVtXSwKLQkJCQkgICAgaW5kZXhfb2Zmc2V0W3doaWNoYXJnXSk7Ci0JICBkKys7Ci0JICB3aGljaGFyZysrOwotCX0KLSAgICAgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDw9IG1heGFyZzsgYXJnbnVtKyspCi0JewotCSAgYmZkX3ZtYSBhZGRyOwotCSAgY2hhciAqY2g7Ci0JICBmb3IgKGNoID0gYXJnX2J1ZnNbYXJnbnVtXTsgKmNoOykKLQkgICAgewotCSAgICAgIGlmICgqY2ggPT0gTkVYVF9JU19BRERSKQotCQl7Ci0JCSAgKytjaDsKLQkJICBhZGRyID0gYmZkX3NjYW5fdm1hIChjaCwgTlVMTCwgMTYpOwotCQkgICgqZGlzX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIsIGRpc19pbmZvKTsKLQkJICB3aGlsZSAoKmNoICYmICpjaCAhPSBORVhUX0lTX0FERFIpCi0JCSAgICArK2NoOwotCQkgIGlmICgqY2gpCi0JCSAgICArK2NoOwotCQl9Ci0JICAgICAgZWxzZQotCQkoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlYyIsICpjaCsrKTsKLQkgICAgfQotCSAgaWYgKGFyZ251bSA8IG1heGFyZykKLQkgICAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiLCAiKTsKLQl9Ci0gICAgfQotICByZXR1cm4gYW9mZnNldCAvIDg7Ci19Ci0KLS8qIFByaW50IGFuIGluc3RydWN0aW9uIG9wZXJhbmQgb2YgY2F0ZWdvcnkgZ2l2ZW4gYnkgZC4gIElPRkZTRVQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gYmVsb3cgd2hpY2ggc21hbGwgKDwxIGJ5dGUpIHBhcnRzIG9mIHRoZSBvcGVyYW5kIGNhbgotICAgYmUgZm91bmQgKHVzdWFsbHkgaW4gdGhlIGJhc2ljIGluc3RydWN0aW9uLCBidXQgZm9yIGluZGV4ZWQKLSAgIGFkZHJlc3NpbmcgaXQgY2FuIGJlIGluIHRoZSBpbmRleCBieXRlKS4gIEFPRkZTRVRQIGlzIGEgcG9pbnRlciB0byB0aGUKLSAgIGJpdCBwb3NpdGlvbiBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICBCVUZGRVIgY29udGFpbnMgdGhlCi0gICBpbnN0cnVjdGlvbi4gIEFERFIgaXMgd2hlcmUgQlVGRkVSIHdhcyByZWFkIGZyb20uICBQdXQgdGhlIGRpc2Fzc2VtYmxlZAotICAgdmVyc2lvbiBvZiB0aGUgb3BlcmFuZCBpbiBSRVNVTFQuICBJTkRFWF9PRkZTRVQgaXMgdGhlIGJpdCBwb3NpdGlvbgotICAgb2YgdGhlIGluZGV4IGJ5dGUgKGl0IGNvbnRhaW5zIGdhcmJhZ2UgaWYgdGhpcyBvcGVyYW5kIGlzIG5vdCBhCi0gICBnZW5lcmFsIG9wZXJhbmQgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIChkLCBpb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLCByZXN1bHQsIGluZGV4X29mZnNldCkKLSAgICAgaW50IGQ7Ci0gICAgIGludCBpb2Zmc2V0LCAqYW9mZnNldHA7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpyZXN1bHQ7Ci0gICAgIGludCBpbmRleF9vZmZzZXQ7Ci17Ci0gIGludCBhZGRyX21vZGU7Ci0gIGZsb2F0IEZ2YWx1ZTsKLSAgZG91YmxlIEx2YWx1ZTsKLSAgaW50IEl2YWx1ZTsKLSAgaW50IGRpc3AxLCBkaXNwMjsKLSAgaW50IGluZGV4OwotICBpbnQgc2l6ZTsKLQotICBzd2l0Y2ggKGQpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgLyogYSAiZ2VuIiBvcGVyYW5kIGJ1dCA1IGJpdHMgZnJvbSB0aGUgZW5kIG9mIGluc3RydWN0aW9uICovCi0gICAgICBpb2Zmc2V0IC09IDU7Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnTCc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgICBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTUsIDUpOwotICAgICAgaW9mZnNldCAtPSA1OwotICAgICAgc3dpdGNoIChhZGRyX21vZGUpCi0JewotCWNhc2UgMHgwOiBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgotCWNhc2UgMHg0OiBjYXNlIDB4NTogY2FzZSAweDY6IGNhc2UgMHg3OgotCSAgLyogcmVnaXN0ZXIgbW9kZSBSMCAtLSBSNyAqLwotCSAgc3dpdGNoIChkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0YnOgotCSAgICBjYXNlICdMJzoKLQkgICAgY2FzZSAnWic6Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiZiVkIiwgYWRkcl9tb2RlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICJyJWQiLCBhZGRyX21vZGUpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4ODogY2FzZSAweDk6IGNhc2UgMHhhOiBjYXNlIDB4YjoKLQljYXNlIDB4YzogY2FzZSAweGQ6IGNhc2UgMHhlOiBjYXNlIDB4ZjoKLQkgIC8qIFJlZ2lzdGVyIHJlbGF0aXZlIGRpc3AoUjAgLS0gUjcpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQociVkKSIsIGRpc3AxLCBhZGRyX21vZGUgJiA3KTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMDoKLQljYXNlIDB4MTE6Ci0JY2FzZSAweDEyOgotCSAgLyogTWVtb3J5IHJlbGF0aXZlIGRpc3AyKGRpc3AxKEZQLCBTUCwgU0IpKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIGRpc3AyID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZCglZCglcykpIiwgZGlzcDIsIGRpc3AxLAotCQkgICBhZGRyX21vZGU9PTB4MTA/ImZwIjphZGRyX21vZGU9PTB4MTE/InNwIjoic2IiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMzoKLQkgIC8qIHJlc2VydmVkICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJyZXNlcnZlZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE0OgotCSAgLyogSW1tZWRpYXRlICovCi0JICBzd2l0Y2ggKGQpCi0JICAgIHsKLQkgICAgY2FzZSAnSSc6IGNhc2UgJ1onOiBjYXNlICdBJzoKLQkgICAgICAvKiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQotCSAgICAgICAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotCSAgICAgICAqIGFuIGltbWVkaWF0ZSBlaXRoZXIuIFdlIGRvbid0IGtub3cgaG93IG11Y2ggdG8gaW5jcmVhc2UKLQkgICAgICAgKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KLQkgICAgICAgKiBhbnl3YXkhCi0JICAgICAgICovCi0JICAgICAgc3ByaW50ZiAocmVzdWx0LCBfKCIkPHVuZGVmaW5lZD4iKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0JICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgOCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDg7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgMik7Ci0JICAgICAgKmFvZmZzZXRwICs9IDE2OwotCSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDE2KTsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdEJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKLQkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLQkgICAgICAqYW9mZnNldHAgKz0gMzI7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnRic6Ci0JICAgICAgYml0X2NvcHkgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMiwgKGNoYXIgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkZ2YWx1ZSwgNCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDMyOwotCSAgICAgIGlmIChJTlZBTElEX0ZMT0FUICgmRnZhbHVlLCA0KSkKLQkJc3ByaW50ZiAocmVzdWx0LCAiPDxpbnZhbGlkIGZsb2F0IDB4JS44eD4+IiwgKihpbnQgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBGdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdMJzoKLQkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDY0LCAoY2hhciAqKSAmTHZhbHVlKTsKLQkgICAgICBmbGlwX2J5dGVzICgmTHZhbHVlLCA4KTsKLQkgICAgICAqYW9mZnNldHAgKz0gNjQ7Ci0JICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZMdmFsdWUsIDgpKQotCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgbG9uZyAweCUuOHglLjh4Pj4iLAotCQkJICooKChpbnQgKikgJkx2YWx1ZSkgKyAxKSwgKihpbnQgKikgJkx2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBMdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4MTU6Ci0JICAvKiBBYnNvbHV0ZSBAZGlzcCAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkB8JWR8IiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE2OgotCSAgLyogRXh0ZXJuYWwgRVhUKGRpc3AxKSArIGRpc3AyIChNb2QgdGFibGUgc3R1ZmYpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkVYVCglZCkgKyAlZCIsIGRpc3AxLCBkaXNwMik7Ci0JICBicmVhazsKLQljYXNlIDB4MTc6Ci0JICAvKiBUb3Agb2Ygc3RhY2sgdG9zICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJ0b3MiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxODoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKEZQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKGZwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxOToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNCKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNiKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYjoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFBDKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLQkgIHNwcmludGZfdm1hIChyZXN1bHQsIGFkZHIgKyBkaXNwMSk7Ci0JICByZXN1bHQgKz0gc3RybGVuIChyZXN1bHQpOwotCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotCSAgKnJlc3VsdCA9ICdcMCc7Ci0JICBicmVhazsKLQljYXNlIDB4MWM6Ci0JY2FzZSAweDFkOgotCWNhc2UgMHgxZToKLQljYXNlIDB4MWY6Ci0JICAvKiBTY2FsZWQgaW5kZXggYmFzZW1vZGVbUjAgLS0gUjc6QixXLEQsUV0gKi8KLQkgIGluZGV4ID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW5kZXhfb2Zmc2V0IC0gOCwgMyk7Ci0JICBwcmludF9pbnNuX2FyZyAoZCwgaW5kZXhfb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLAotCQkJICByZXN1bHQsIDApOwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqaW5kID0gImJ3ZHEiOwotCSAgICBjaGFyICpvZmY7Ci0KLQkgICAgb2ZmID0gcmVzdWx0ICsgc3RybGVuIChyZXN1bHQpOwotCSAgICBzcHJpbnRmIChvZmYsICJbciVkOiVjXSIsIGluZGV4LAotCQkgICAgIGluZFthZGRyX21vZGUgJiAzXSk7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdIJzoKLSAgICBjYXNlICdxJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA0KTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgSXZhbHVlKTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC0zLCAzKTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIEl2YWx1ZSY3KTsKLSAgICAgIGlvZmZzZXQgLT0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIEl2YWx1ZSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotICAgICAgLyoKLSAgICAgICAqIFdhcm5pbmchISAgSEFDSyBBTEVSVCEKLSAgICAgICAqIE9wZXJhbmQgdHlwZSAnYicgaXMgb25seSB1c2VkIGJ5IHRoZSBjbXB7Yix3LGR9IGFuZAotICAgICAgICogbW92bXtiLHcsZH0gaW5zdHJ1Y3Rpb25zOyB3ZSBuZWVkIHRvIGtub3cgd2hldGhlcgotICAgICAgICogaXQncyBhIGBiJyBvciBgdycgb3IgYGQnIGluc3RydWN0aW9uOyBhbmQgZm9yIGJvdGgKLSAgICAgICAqIGNtcG0gYW5kIG1vdm0gaXQncyBzdG9yZWQgYXQgdGhlIHNhbWUgcGxhY2Ugc28gd2UKLSAgICAgICAqIGp1c3QgZ3JhYiB0d28gYml0cyBvZiB0aGUgb3Bjb2RlIGFuZCBsb29rIGF0IGl0Li4uCi0gICAgICAgKiAKLSAgICAgICAqLwotICAgICAgc2l6ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC02LCAyKTsKLSAgICAgIGlmIChzaXplID09IDApCQkvKiAwMCA9PiBiICovCi0Jc2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChzaXplID09IDEpCS8qIDAxID0+IHcgKi8KLQlzaXplID0gMjsKLSAgICAgIGVsc2UKLQlzaXplID0gNDsJCS8qIDExID0+IGQgKi8KLQotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCAoSXZhbHVlIC8gc2l6ZSkgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgotICAgICAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotICAgICAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKLSAgICAgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7Ci0gICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0gICAgICAqcmVzdWx0ID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiMHgleCIsIEl2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd1JzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X3UsIHJlc3VsdCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9VLCByZXN1bHQpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdPJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC05LCA5KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfTywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0MnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9DLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQgLSA4LCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfUywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ00nOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgbGlzdF9zZWFyY2goSXZhbHVlLCAwID8gbGlzdF9NMDMyIDogbGlzdF9NNTMyLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X1AwMzIgOiBsaXN0X1A1MzIsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCAzKTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUpOwotICAgICAgKmFvZmZzZXRwICs9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdHJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCA1KTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUgKyAxKTsKLSAgICAgICphb2Zmc2V0cCArPSA1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gaW9mZnNldDsKLX0KLQotc3RhdGljIGludAotZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgKmFvZmZzZXRwOwotewotICBpbnQgSXZhbHVlOwotICBzaG9ydCBJdmFsdWUyOwotCi0gIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gIHN3aXRjaCAoSXZhbHVlICYgMHhjMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHg0MDoKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDcpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6Ci0gICAgICBJdmFsdWUyID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlMiwgMik7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlMiwgMTQpOwotICAgICAgKmFvZmZzZXRwICs9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGMwOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDMwKTsKLSAgICAgICphb2Zmc2V0cCArPSAzMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIEl2YWx1ZTsKLX0KLQwKLQotI2lmIDEgLyogYSB2ZXJzaW9uIHRoYXQgc2hvdWxkIHdvcmsgb24gbnMzMmsgZidzJmQncyBvbiBhbnkgbWFjaGluZSAqLwotc3RhdGljIGludAotaW52YWxpZF9mbG9hdCAocCwgbGVuKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotCi0gIGlmICggbGVuID09IDQgKQotICAgIHZhbCA9IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDB4ZmYKLQkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDIzLCA4KS8qZXhwb25lbnQqLyA9PSAwICYmCi0JICAgICAgIGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAyMykvKm1hbnRpc2EqLyAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gOCApCi0gICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDB4N2ZmCi0JICAgfHwgKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDAKLQkgICAgICAgJiYgKGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAzMikvKmxvdyBtYW50aXNhKi8gIT0gMAotCQkgICB8fCBiaXRfZXh0cmFjdF9zaW1wbGUocCwgMzIsIDIwKS8qaGlnaCBtYW50aXNhKi8gIT0gMCkpKTsKLSAgZWxzZQotICAgIHZhbCA9IDE7Ci0gIHJldHVybiAodmFsKTsKLX0KLSNlbHNlCi0KLS8qIGFzc3VtZXMgdGhlIGJ5dGVzIGhhdmUgYmVlbiBzd2FwcGVkIHRvIGxvY2FsIG9yZGVyICovCi10eXBlZGVmIHVuaW9uIHsgZG91YmxlIGQ7Ci0JCWZsb2F0IGY7Ci0JCXN0cnVjdCB7IHVuc2lnbmVkIG06MjMsIGU6OCwgOjE7fSBzZjsKLQkJc3RydWN0IHsgdW5zaWduZWQgbG07IHVuc2lnbmVkIG06MjAsIGU6MTEsIDoxO30gc2Q7Ci0JICAgICAgfSBmbG9hdF90eXBlX3U7Ci0KLXN0YXRpYyBpbnQKLWludmFsaWRfZmxvYXQgKHAsIGxlbikKLSAgICAgcmVnaXN0ZXIgZmxvYXRfdHlwZV91ICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotICBpZiAoIGxlbiA9PSBzaXplb2YgKGZsb2F0KSApCi0gICAgdmFsID0gKHAtPnNmLmUgPT0gMHhmZgotCSAgIHx8IChwLT5zZi5lID09IDAgJiYgcC0+c2YubSAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gc2l6ZW9mIChkb3VibGUpICkKLSAgICB2YWwgPSAocC0+c2QuZSA9PSAweDdmZgotCSAgIHx8IChwLT5zZC5lID09IDAgJiYgKHAtPnNkLm0gIT0gMCB8fCBwLT5zZC5sbSAhPSAwKSkpOwotICBlbHNlCi0gICAgdmFsID0gMTsKLSAgcmV0dXJuICh2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL29waW50bC5oIGIvb3Bjb2Rlcy9vcGludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyZmMxYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL29waW50bC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogb3BpbnRsLmggLSBvcGNvZGVzIHNwZWNpZmljIGhlYWRlciBmb3IgZ2V0dGV4dCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgb3Bjb2RlcyBsaWJyYXJ5IHVzZWQgYnkgR0FTIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLS8qIE5vdGUgdGhlIHVzZSBvZiBkZ2V0ZXh0KCkgYW5kIFBBQ0tBR0UgaGVyZSwgcmF0aGVyIHRoYW4gZ2V0dGV4dCgpLgotICAgCi0gICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkgaXMgdXNlZCB0byBidWlsZCBhIGxpYnJhcnkgd2hpY2gKLSAgIHdpbGwgYmUgbGlua2VkIHdpdGggY29kZSBpbiBvdGhlciBkaXJlY3RvcmllcyB0byBmb3JtIHByb2dyYW1zLiAgV2Ugd2FudCB0bwotICAgbWFpbnRhaW4gYSBzZXBlcmF0ZSB0cmFuc2xhdGlvbiBmaWxlIGZvciB0aGlzIGRpcmVjdG9yeSBob3dldmVyLCByYXRoZXIKLSAgIHRoYW4gYmVpbmcgZm9yY2VkIHRvIG1lcmdlIGl0IHdpdGggdGhhdCBvZiBhbnkgcHJvZ3JhbSBsaW5rZWQgdG8KLSAgIGxpYm9wY29kZXMuICBUaGlzIGlzIGEgbGlicmFyeSwgc28gaXQgY2Fubm90IGRlcGVuZCBvbiB0aGUgY2F0YWxvZwotICAgY3VycmVudGx5IGxvYWRlZC4KLQotICAgSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGV4dHJhY3QgbWVzc2FnZXMgd2UKLSAgIHVzZSB0aGUgT1BDT0RFUyBkb21haW4gcmF0aGVyIHRoYW4gdGhlIGRvbWFpbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGluY2x1ZGVkCi0gICB0aGUgb3Bjb2RlcyBsaWJyYXJ5LCAoZWcgT0JKRFVNUCkuICBIZW5jZSB3ZSB1c2UgZGdldHRleHQgKFBBQ0tBR0UsIFN0cmluZykKLSAgIGFuZCBkZWZpbmUgUEFDS0FHRSB0byBiZSAnb3Bjb2RlcycuICAoU2VlIHRoZSBjb2RlIGluIGNvbmZpZ3VyZSkuICAqLwotIyBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpIChNc2dpZCkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpIChNc2dpZCkKLSMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wai1kaXMuYyBiL29wY29kZXMvcGotZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5M2JiZWUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wai1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKiBwai1kaXMuYyAtLSBEaXNhc3NlbWJsZSBwaWNvSmF2YSBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4sIG9mIFRyYW5zbWV0YSAoc2FjQHBvYm94LmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BqLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1leHRlcm4gY29uc3QgcGpfb3BjX2luZm9fdCBwal9vcGNfaW5mb1s1MTJdOwotCi1zdGF0aWMgaW50IGdldF9pbnQgKG1lbWFkZHIsIGlwdHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgaW50ICppcHRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciBpdmFsWzRdOwotCi0gIGludCBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpdmFsLCA0LCBpbmZvKTsKLQotICAqaXB0ciA9IChpdmFsWzBdIDw8IDI0KSAKLSAgICB8IChpdmFsWzFdIDw8IDE2KSAKLSAgICB8IChpdmFsWzJdIDw8IDgpIAotICAgIHwgKGl2YWxbM10gPDwgMCkgOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9waiAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICBpbnQgc3RhdHVzOwotCi0gIGlmICgoc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciwgJm9wY29kZSwgMSwgaW5mbykpKQotICAgIGdvdG8gZmFpbDsKLQotICBpZiAob3Bjb2RlID09IDB4ZmYpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBieXRlXzI7Ci0gICAgICBpZiAoKHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIgKyAxLCAmYnl0ZV8yLCAxLCBpbmZvKSkpCi0JZ290byBmYWlsOwotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiJXNcdCIsIHBqX29wY19pbmZvW29wY29kZSArIGJ5dGVfMl0ubmFtZSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpzZXAgPSAiXHQiOwotICAgICAgaW50IGluc25fc3RhcnQgPSBhZGRyOwotICAgICAgY29uc3QgcGpfb3BjX2luZm9fdCAqb3AgPSAmcGpfb3BjX2luZm9bb3Bjb2RlXTsKLSAgICAgIGludCBhOwotICAgICAgYWRkcisrOwotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0KLSAgICAgIC8qIFRoZSB0YWJsZXN3aXRjaCBpbnN0cnVjdGlvbiBpcyBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdAotCSBhZGRyZXNzLCBsb3cgdmFsdWUsIGhpZ2ggdmFsdWUgYW5kIHRoZSBkZXN0aW5hdGlvbnMuICovCi0KLSAgICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAidGFibGVzd2l0Y2giKSA9PSAwKQotCXsKLQkgIGludCBsb3d2YWw7Ci0JICBpbnQgaGlnaHZhbDsKLQkgIGludCB2YWw7Ci0KLQkgIGFkZHIgPSAoYWRkciArIDMpICYgfjM7Ci0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCi0JICBmcHJpbnRmX2ZuIChzdHJlYW0sIiBkZWZhdWx0OiAiKTsKLQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJmxvd3ZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJmhpZ2h2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICB3aGlsZSAobG93dmFsIDw9IGhpZ2h2YWwpIHsKLQkgICAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiAlZDpbIiwgbG93dmFsKTsKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgXSIpOwotCSAgICBhZGRyICs9IDQ7Ci0JICAgIGxvd3ZhbCsrOwotCSAgfQotCSAgcmV0dXJuIGFkZHIgLSBpbnNuX3N0YXJ0OwotCX0KLQotICAgICAgLyogVGhlIGxvb2t1cHN3aXRjaCBpbnN0cnVjdGlvbiBpcyBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdAotCSBhZGRyZXNzLCBlbGVtZW50IGNvdW50IGFuZCBwYWlycyBvZiB2YWx1ZXMgYW5kCi0JIGFkZHJlc3Nlcy4gKi8KLQkgICAgCi0gICAgICBpZiAoc3RyY21wIChvcC0+bmFtZSwgImxvb2t1cHN3aXRjaCIpID09IDApCi0JewotCSAgaW50IGNvdW50OwotCSAgaW50IHZhbDsKLQotCSAgYWRkciA9IChhZGRyICsgMykgJiB+MzsKLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGZwcmludGZfZm4gKHN0cmVhbSwiIGRlZmF1bHQ6ICIpOwotCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmY291bnQsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICB3aGlsZSAoY291bnQtLSkgewotCSAgICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIGFkZHIgKz0gNDsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgJWQ6WyIsIHZhbCk7Ci0KLQkgICAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBhZGRyICs9IDQ7Ci0KLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgXSIpOwotCSAgfQotCSAgcmV0dXJuIGFkZHIgLSBpbnNuX3N0YXJ0OwotCX0KLSAgICAgIGZvciAoYSA9IDA7IG9wLT5hcmdbYV07IGErKykKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIGRhdGFbNF07Ci0JICBpbnQgdmFsID0gMDsKLQkgIGludCBpOwotCSAgaW50IHNpemUgPSBBU0laRSAob3AtPmFyZ1thXSk7Ci0KLQkgIGlmICgoc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciwgZGF0YSwgc2l6ZSwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0KLQkgIHZhbCA9IChVTlMgKG9wLT5hcmdbMF0pIHx8ICgoZGF0YVswXSAmIDB4ODApID09IDApKSA/IDAgOiAtMTsKLQotCSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkgICAgdmFsID0gKHZhbCA8PCA4KSB8IChkYXRhW2ldICYgMHhmZik7Ci0KLQkgIGlmIChQQ1JFTCAob3AtPmFyZ1thXSkpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICBlbHNlCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzJWQiLCBzZXAsIHZhbCk7Ci0KLQkgIHNlcCA9ICIsIjsKLQkgIGFkZHIgKz0gc2l6ZTsKLQl9Ci0gICAgICByZXR1cm4gb3AtPmxlbjsKLSAgICB9Ci0KLSBmYWlsOgotICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBhZGRyLCBpbmZvKTsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wai1vcGMuYyBiL29wY29kZXMvcGotb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWJjNjQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wai1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKiBwai1vcGMuYyAtLSBEZWZpbml0aW9ucyBmb3IgcGljb0phdmEgb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIFRyYW5zbWV0YSAoc2FjQHBvYm94LmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS9wai5oIgotCi1jb25zdCBwal9vcGNfaW5mb190IHBqX29wY19pbmZvWzUxMl0gPQotewoteyAweDAwLCAgIC0xLCAxLCB7T19OLCBPX059LCAibm9wIn0sCi17IDB4MDEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhY29uc3RfbnVsbCJ9LAoteyAweDAyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0X20xIn0sCi17IDB4MDMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMCJ9LAoteyAweDA0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzEifSwKLXsgMHgwNSwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF8yIn0sCi17IDB4MDYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMyJ9LAoteyAweDA3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzQifSwKLXsgMHgwOCwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF81In0sCi17IDB4MDksICAgLTEsIDEsIHtPX04sIE9fTn0sICJsY29uc3RfMCJ9LAoteyAweDBhLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGNvbnN0XzEifSwKLXsgMHgwYiwgICAtMSwgMSwge09fTiwgT19OfSwgImZjb25zdF8wIn0sCi17IDB4MGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY29uc3RfMSJ9LAoteyAweDBkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNvbnN0XzIifSwKLXsgMHgwZSwgICAtMSwgMSwge09fTiwgT19OfSwgImRjb25zdF8wIn0sCi17IDB4MGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY29uc3RfMSJ9LAoteyAweDEwLCAgIC0xLCAyLCB7T184LCBPX059LCAiYmlwdXNoIn0sCi17IDB4MTEsICAgLTEsIDMsIHtPXzE2LCBPX059LCAic2lwdXNoIn0sCi17IDB4MTIsICAgLTEsIDIsIHtPX04sIE9fTn0sICJsZGMifSwKLXsgMHgxMywgICAtMSwgMywge09fTiwgT19OfSwgImxkY193In0sCi17IDB4MTQsICAgLTEsIDMsIHtPX04sIE9fTn0sICJsZGMyX3cifSwKLXsgMHgxNSwgICAtMSwgMiwge09fVTgsIE9fTn0sICJpbG9hZCJ9LAoteyAweDE2LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImxsb2FkIn0sCi17IDB4MTcsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiZmxvYWQifSwKLXsgMHgxOCwgICAtMSwgMiwge09fVTgsIE9fTn0sICJkbG9hZCJ9LAoteyAweDE5LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImFsb2FkIn0sCi17IDB4MWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8wIn0sCi17IDB4MWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8xIn0sCi17IDB4MWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8yIn0sCi17IDB4MWQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8zIn0sCi17IDB4MWUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8wIn0sCi17IDB4MWYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8xIn0sCi17IDB4MjAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8yIn0sCi17IDB4MjEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8zIn0sCi17IDB4MjIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8wIn0sCi17IDB4MjMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8xIn0sCi17IDB4MjQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8yIn0sCi17IDB4MjUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8zIn0sCi17IDB4MjYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8wIn0sCi17IDB4MjcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8xIn0sCi17IDB4MjgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8yIn0sCi17IDB4MjksICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8zIn0sCi17IDB4MmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8wIn0sCi17IDB4MmIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8xIn0sCi17IDB4MmMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8yIn0sCi17IDB4MmQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8zIn0sCi17IDB4MmUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYWxvYWQifSwKLXsgMHgyZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxhbG9hZCJ9LAoteyAweDMwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmFsb2FkIn0sCi17IDB4MzEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkYWxvYWQifSwKLXsgMHgzMiwgICAtMSwgMSwge09fTiwgT19OfSwgImFhbG9hZCJ9LAoteyAweDMzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFsb2FkIn0sCi17IDB4MzQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJjYWxvYWQifSwKLXsgMHgzNSwgICAtMSwgMSwge09fTiwgT19OfSwgInNhbG9hZCJ9LAoteyAweDM2LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImlzdG9yZSJ9LAoteyAweDM3LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImxzdG9yZSJ9LAoteyAweDM4LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImZzdG9yZSJ9LAoteyAweDM5LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImRzdG9yZSJ9LAoteyAweDNhLCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImFzdG9yZSJ9LAoteyAweDNiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzAifSwKLXsgMHgzYywgICAtMSwgMSwge09fTiwgT19OfSwgImlzdG9yZV8xIn0sCi17IDB4M2QsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3RvcmVfMiJ9LAoteyAweDNlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzMifSwKLXsgMHgzZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8wIn0sCi17IDB4NDAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3RvcmVfMSJ9LAoteyAweDQxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN0b3JlXzIifSwKLXsgMHg0MiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8zIn0sCi17IDB4NDMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMCJ9LAoteyAweDQ0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN0b3JlXzEifSwKLXsgMHg0NSwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdG9yZV8yIn0sCi17IDB4NDYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMyJ9LAoteyAweDQ3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzAifSwKLXsgMHg0OCwgICAtMSwgMSwge09fTiwgT19OfSwgImRzdG9yZV8xIn0sCi17IDB4NDksICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3RvcmVfMiJ9LAoteyAweDRhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzMifSwKLXsgMHg0YiwgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8wIn0sCi17IDB4NGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhc3RvcmVfMSJ9LAoteyAweDRkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXN0b3JlXzIifSwKLXsgMHg0ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8zIn0sCi17IDB4NGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYXN0b3JlIn0sCi17IDB4NTAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsYXN0b3JlIn0sCi17IDB4NTEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmYXN0b3JlIn0sCi17IDB4NTIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkYXN0b3JlIn0sCi17IDB4NTMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhYXN0b3JlIn0sCi17IDB4NTQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYXN0b3JlIn0sCi17IDB4NTUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJjYXN0b3JlIn0sCi17IDB4NTYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJzYXN0b3JlIn0sCi17IDB4NTcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJwb3AifSwKLXsgMHg1OCwgICAtMSwgMSwge09fTiwgT19OfSwgInBvcDIifSwKLXsgMHg1OSwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cCJ9LAoteyAweDVhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwX3gxIn0sCi17IDB4NWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXBfeDIifSwKLXsgMHg1YywgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDIifSwKLXsgMHg1ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDJfeDEifSwKLXsgMHg1ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDJfeDIifSwKLXsgMHg1ZiwgICAtMSwgMSwge09fTiwgT19OfSwgInN3YXAifSwKLXsgMHg2MCwgICAtMSwgMSwge09fTiwgT19OfSwgImlhZGQifSwKLXsgMHg2MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxhZGQifSwKLXsgMHg2MiwgICAtMSwgMSwge09fTiwgT19OfSwgImZhZGQifSwKLXsgMHg2MywgICAtMSwgMSwge09fTiwgT19OfSwgImRhZGQifSwKLXsgMHg2NCwgICAtMSwgMSwge09fTiwgT19OfSwgImlzdWIifSwKLXsgMHg2NSwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdWIifSwKLXsgMHg2NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdWIifSwKLXsgMHg2NywgICAtMSwgMSwge09fTiwgT19OfSwgImRzdWIifSwKLXsgMHg2OCwgICAtMSwgMSwge09fTiwgT19OfSwgImltdWwifSwKLXsgMHg2OSwgICAtMSwgMSwge09fTiwgT19OfSwgImxtdWwifSwKLXsgMHg2YSwgICAtMSwgMSwge09fTiwgT19OfSwgImZtdWwifSwKLXsgMHg2YiwgICAtMSwgMSwge09fTiwgT19OfSwgImRtdWwifSwKLXsgMHg2YywgICAtMSwgMSwge09fTiwgT19OfSwgImlkaXYifSwKLXsgMHg2ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImxkaXYifSwKLXsgMHg2ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImZkaXYifSwKLXsgMHg2ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImRkaXYifSwKLXsgMHg3MCwgICAtMSwgMSwge09fTiwgT19OfSwgImlyZW0ifSwKLXsgMHg3MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxyZW0ifSwKLXsgMHg3MiwgICAtMSwgMSwge09fTiwgT19OfSwgImZyZW0ifSwKLXsgMHg3MywgICAtMSwgMSwge09fTiwgT19OfSwgImRyZW0ifSwKLXsgMHg3NCwgICAtMSwgMSwge09fTiwgT19OfSwgImluZWcifSwKLXsgMHg3NSwgICAtMSwgMSwge09fTiwgT19OfSwgImxuZWcifSwKLXsgMHg3NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZuZWcifSwKLXsgMHg3NywgICAtMSwgMSwge09fTiwgT19OfSwgImRuZWcifSwKLXsgMHg3OCwgICAtMSwgMSwge09fTiwgT19OfSwgImlzaGwifSwKLXsgMHg3OSwgICAtMSwgMSwge09fTiwgT19OfSwgImxzaGwifSwKLXsgMHg3YSwgICAtMSwgMSwge09fTiwgT19OfSwgImlzaHIifSwKLXsgMHg3YiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzaHIifSwKLXsgMHg3YywgICAtMSwgMSwge09fTiwgT19OfSwgIml1c2hyIn0sCi17IDB4N2QsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsdXNociJ9LAoteyAweDdlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWFuZCJ9LAoteyAweDdmLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGFuZCJ9LAoteyAweDgwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaW9yIn0sCi17IDB4ODEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsb3IifSwKLXsgMHg4MiwgICAtMSwgMSwge09fTiwgT19OfSwgIml4b3IifSwKLXsgMHg4MywgICAtMSwgMSwge09fTiwgT19OfSwgImx4b3IifSwKLXsgMHg4NCwgICAtMSwgMywge09fVTgsIE9fOH0sICJpaW5jIn0sCi17IDB4ODUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmwifSwKLXsgMHg4NiwgICAtMSwgMSwge09fTiwgT19OfSwgImkyZiJ9LAoteyAweDg3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJkIn0sCi17IDB4ODgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsMmkifSwKLXsgMHg4OSwgICAtMSwgMSwge09fTiwgT19OfSwgImwyZiJ9LAoteyAweDhhLCAgIC0xLCAxLCB7T19OLCBPX059LCAibDJkIn0sCi17IDB4OGIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmMmkifSwKLXsgMHg4YywgICAtMSwgMSwge09fTiwgT19OfSwgImYybCJ9LAoteyAweDhkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZjJkIn0sCi17IDB4OGUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkMmkifSwKLXsgMHg4ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImQybCJ9LAoteyAweDkwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZDJmIn0sCi17IDB4OTEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmIifSwKLXsgMHg5MiwgICAtMSwgMSwge09fTiwgT19OfSwgImkyYyJ9LAoteyAweDkzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJzIn0sCi17IDB4OTQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsY21wIn0sCi17IDB4OTUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY21wbCJ9LAoteyAweDk2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNtcGcifSwKLXsgMHg5NywgICAtMSwgMSwge09fTiwgT19OfSwgImRjbXBsIn0sCi17IDB4OTgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY21wZyJ9LAoteyAweDk5LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmVxIn0sCi17IDB4OWEsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmbmUifSwKLXsgMHg5YiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZsdCJ9LAoteyAweDljLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmdlIn0sCi17IDB4OWQsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmZ3QifSwKLXsgMHg5ZSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZsZSJ9LAoteyAweDlmLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wZXEifSwKLXsgMHhhMCwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcG5lIn0sCi17IDB4YTEsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBsdCJ9LAoteyAweGEyLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wZ2UifSwKLXsgMHhhMywgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGd0In0sCi17IDB4YTQsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBsZSJ9LAoteyAweGE1LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9hY21wZXEifSwKLXsgMHhhNiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfYWNtcG5lIn0sCi17IDB4YTcsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImdvdG8ifSwKLXsgMHhhOCwgICAtMSwgMywge09fTiwgT19OfSwgImpzciJ9LAoteyAweGE5LCAgIC0xLCAyLCB7T19OLCBPX059LCAicmV0In0sCi17IDB4YWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ0YWJsZXN3aXRjaCJ9LAoteyAweGFiLCAgIC0xLCAxLCB7T19OLCBPX059LCAibG9va3Vwc3dpdGNoIn0sCi17IDB4YWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpcmV0dXJuIn0sCi17IDB4YWQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJscmV0dXJuIn0sCi17IDB4YWUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmcmV0dXJuIn0sCi17IDB4YWYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkcmV0dXJuIn0sCi17IDB4YjAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhcmV0dXJuIn0sCi17IDB4YjEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJyZXR1cm4ifSwKLXsgMHhiMiwgICAtMSwgMywge09fTiwgT19OfSwgImdldHN0YXRpYyJ9LAoteyAweGIzLCAgIC0xLCAzLCB7T19OLCBPX059LCAicHV0c3RhdGljIn0sCi17IDB4YjQsICAgLTEsIDMsIHtPX04sIE9fTn0sICJnZXRmaWVsZCJ9LAoteyAweGI1LCAgIC0xLCAzLCB7T19OLCBPX059LCAicHV0ZmllbGQifSwKLXsgMHhiNiwgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXZpcnR1YWwifSwKLXsgMHhiNywgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXNwZWNpYWwifSwKLXsgMHhiOCwgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXN0YXRpYyJ9LAoteyAweGI5LCAgIC0xLCA1LCB7T19OLCBPX059LCAiaW52b2tlaW50ZXJmYWNlIn0sCi17IDB4YmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfYmEifSwKLXsgMHhiYiwgICAtMSwgMywge09fTiwgT19OfSwgIm5ldyJ9LAoteyAweGJjLCAgIC0xLCAyLCB7T19OLCBPX059LCAibmV3YXJyYXkifSwKLXsgMHhiZCwgICAtMSwgMywge09fTiwgT19OfSwgImFuZXdhcnJheSJ9LAoteyAweGJlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXJyYXlsZW5ndGgifSwKLXsgMHhiZiwgICAtMSwgMSwge09fTiwgT19OfSwgImF0aHJvdyJ9LAoteyAweGMwLCAgIC0xLCAzLCB7T19OLCBPX059LCAiY2hlY2tjYXN0In0sCi17IDB4YzEsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpbnN0YW5jZW9mIn0sCi17IDB4YzIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJtb25pdG9yZW50ZXIifSwKLXsgMHhjMywgICAtMSwgMSwge09fTiwgT19OfSwgIm1vbml0b3JleGl0In0sCi17IDB4YzQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ3aWRlIn0sCi17IDB4YzUsICAgLTEsIDQsIHtPX04sIE9fTn0sICJtdWx0aWFuZXdhcnJheSJ9LAoteyAweGM2LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaWZudWxsIn0sCi17IDB4YzcsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpZm5vbm51bGwifSwKLXsgMHhjOCwgICAtMSwgNSwge09fTiwgT19OfSwgImdvdG9fdyJ9LAoteyAweGM5LCAgIC0xLCA1LCB7T19OLCBPX059LCAianNyX3cifSwKLXsgMHhjYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJyZWFrcG9pbnQifSwKLXsgMHhjYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJ5dGVjb2RlIn0sCi17IDB4Y2MsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ0cnkifSwKLXsgMHhjZCwgICAtMSwgMSwge09fTiwgT19OfSwgImVuZHRyeSJ9LAoteyAweGNlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiY2F0Y2gifSwKLXsgMHhjZiwgICAtMSwgMSwge09fTiwgT19OfSwgInZhciJ9LAoteyAweGQwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZW5kdmFyIn0sCi17IDB4ZDEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDEifSwKLXsgMHhkMiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kMiJ9LAoteyAweGQzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2QzIn0sCi17IDB4ZDQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDQifSwKLXsgMHhkNSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kNSJ9LAoteyAweGQ2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q2In0sCi17IDB4ZDcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDcifSwKLXsgMHhkOCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kOCJ9LAoteyAweGQ5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q5In0sCi17IDB4ZGEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGEifSwKLXsgMHhkYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kYiJ9LAoteyAweGRjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RjIn0sCi17IDB4ZGQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGQifSwKLXsgMHhkZSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kZSJ9LAoteyAweGRmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RmIn0sCi17IDB4ZTAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTAifSwKLXsgMHhlMSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lMSJ9LAoteyAweGUyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2UyIn0sCi17IDB4ZTMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTMifSwKLXsgMHhlNCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNCJ9LAoteyAweGU1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U1In0sCi17IDB4ZTYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTYifSwKLXsgMHhlNywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNyJ9LAoteyAweGU4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U4In0sCi17IDB4ZTksICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTkifSwKLXsgMHhlYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lYSJ9LAoteyAweGViLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ViIn0sCi17IDB4ZWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZWMifSwKLXsgMHhlZCwgICAtMSwgMywge09fMTYsIE9fTn0sICJzZXRoaSJ9LAoteyAweGVlLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfd29yZF9pbmRleCJ9LAoteyAweGVmLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfc2hvcnRfaW5kZXgifSwKLXsgMHhmMCwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX2NoYXJfaW5kZXgifSwKLXsgMHhmMSwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX2J5dGVfaW5kZXgifSwKLXsgMHhmMiwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX3VieXRlX2luZGV4In0sCi17IDB4ZjMsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAic3RvcmVfd29yZF9pbmRleCJ9LAoteyAweGY0LCAgIC0xLCAzLCB7T19VOCwgT184fSwgIm5hX3N0b3JlX3dvcmRfaW5kZXgifSwKLXsgMHhmNSwgICAtMSwgMywge09fVTgsIE9fOH0sICJzdG9yZV9zaG9ydF9pbmRleCJ9LAoteyAweGY2LCAgIC0xLCAzLCB7T19VOCwgT184fSwgInN0b3JlX2J5dGVfaW5kZXgifSwKLXsgMHhmNywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mNyJ9LAoteyAweGY4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Y4In0sCi17IDB4ZjksICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZjkifSwKLXsgMHhmYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mYSJ9LAoteyAweGZiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZiIn0sCi17IDB4ZmMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmMifSwKLXsgMHhmZCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mZCJ9LAoteyAweGZlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZlIn0sCi17IDB4ZmYsIDB4MDAsIDIsIHtPX04sIE9fTn0sICJsb2FkX3VieXRlIn0sCi17IDB4ZmYsIDB4MDEsIDIsIHtPX04sIE9fTn0sICJsb2FkX2J5dGUifSwKLXsgMHhmZiwgMHgwMiwgMiwge09fTiwgT19OfSwgImxvYWRfY2hhciJ9LAoteyAweGZmLCAweDAzLCAyLCB7T19OLCBPX059LCAibG9hZF9zaG9ydCJ9LAoteyAweGZmLCAweDA0LCAyLCB7T19OLCBPX059LCAibG9hZF93b3JkIn0sCi17IDB4ZmYsIDB4MDUsIDIsIHtPX04sIE9fTn0sICJwcml2X3JldF9mcm9tX3RyYXAifSwKLXsgMHhmZiwgMHgwNiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9kY2FjaGVfdGFnIn0sCi17IDB4ZmYsIDB4MDcsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfZGNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgwOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDA5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MGEsIDIsIHtPX04sIE9fTn0sICJsb2FkX2NoYXJfb2UifSwKLXsgMHhmZiwgMHgwYiwgMiwge09fTiwgT19OfSwgImxvYWRfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgwYywgMiwge09fTiwgT19OfSwgImxvYWRfd29yZF9vZSJ9LAoteyAweGZmLCAweDBkLCAyLCB7T19OLCBPX059LCAicmV0dXJuMCJ9LAoteyAweGZmLCAweDBlLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2ljYWNoZV90YWcifSwKLXsgMHhmZiwgMHgwZiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9pY2FjaGVfZGF0YSJ9LAoteyAweGZmLCAweDEwLCAyLCB7T19OLCBPX059LCAibmNsb2FkX3VieXRlIn0sCi17IDB4ZmYsIDB4MTEsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfYnl0ZSJ9LAoteyAweGZmLCAweDEyLCAyLCB7T19OLCBPX059LCAibmNsb2FkX2NoYXIifSwKLXsgMHhmZiwgMHgxMywgMiwge09fTiwgT19OfSwgIm5jbG9hZF9zaG9ydCJ9LAoteyAweGZmLCAweDE0LCAyLCB7T19OLCBPX059LCAibmNsb2FkX3dvcmQifSwKLXsgMHhmZiwgMHgxNSwgMiwge09fTiwgT19OfSwgIml1Y21wIn0sCi17IDB4ZmYsIDB4MTYsIDIsIHtPX04sIE9fTn0sICJwcml2X3Bvd2VyZG93biJ9LAoteyAweGZmLCAweDE3LCAyLCB7T19OLCBPX059LCAiY2FjaGVfaW52YWxpZGF0ZSJ9LAoteyAweGZmLCAweDE4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgxYSwgMiwge09fTiwgT19OfSwgIm5jbG9hZF9jaGFyX29lIn0sCi17IDB4ZmYsIDB4MWIsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgxYywgMiwge09fTiwgT19OfSwgIm5jbG9hZF93b3JkX29lIn0sCi17IDB4ZmYsIDB4MWQsIDIsIHtPX04sIE9fTn0sICJyZXR1cm4xIn0sCi17IDB4ZmYsIDB4MWUsIDIsIHtPX04sIE9fTn0sICJjYWNoZV9mbHVzaCJ9LAoteyAweGZmLCAweDFmLCAyLCB7T19OLCBPX059LCAiY2FjaGVfaW5kZXhfZmx1c2gifSwKLXsgMHhmZiwgMHgyMCwgMiwge09fTiwgT19OfSwgInN0b3JlX2J5dGUifSwKLXsgMHhmZiwgMHgyMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDIyLCAyLCB7T19OLCBPX059LCAic3RvcmVfc2hvcnQifSwKLXsgMHhmZiwgMHgyMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDI0LCAyLCB7T19OLCBPX059LCAic3RvcmVfd29yZCJ9LAoteyAweGZmLCAweDI1LCAyLCB7T19OLCBPX059LCAic29mdF90cmFwIn0sCi17IDB4ZmYsIDB4MjYsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2RjYWNoZV90YWcifSwKLXsgMHhmZiwgMHgyNywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfZGNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgyOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDI5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MmEsIDIsIHtPX04sIE9fTn0sICJzdG9yZV9zaG9ydF9vZSJ9LAoteyAweGZmLCAweDJiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MmMsIDIsIHtPX04sIE9fTn0sICJzdG9yZV93b3JkX29lIn0sCi17IDB4ZmYsIDB4MmQsIDIsIHtPX04sIE9fTn0sICJyZXR1cm4yIn0sCi17IDB4ZmYsIDB4MmUsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2ljYWNoZV90YWcifSwKLXsgMHhmZiwgMHgyZiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfaWNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgzMCwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfYnl0ZSJ9LAoteyAweGZmLCAweDMxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzIsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX3Nob3J0In0sCi17IDB4ZmYsIDB4MzMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzNCwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfd29yZCJ9LAoteyAweGZmLCAweDM1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzYsIDIsIHtPX04sIE9fTn0sICJwcml2X3Jlc2V0In0sCi17IDB4ZmYsIDB4MzcsIDIsIHtPX04sIE9fTn0sICJnZXRfY3VycmVudF9jbGFzcyJ9LAoteyAweGZmLCAweDM4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzYSwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgzYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDNjLCAyLCB7T19OLCBPX059LCAibmNzdG9yZV93b3JkX29lIn0sCi17IDB4ZmYsIDB4M2QsIDIsIHtPX04sIE9fTn0sICJjYWxsIn0sCi17IDB4ZmYsIDB4M2UsIDIsIHtPX04sIE9fTn0sICJ6ZXJvX2xpbmUifSwKLXsgMHhmZiwgMHgzZiwgMiwge09fTiwgT19OfSwgInByaXZfdXBkYXRlX29wdG9wIn0sCi17IDB4ZmYsIDB4NDAsIDIsIHtPX04sIE9fTn0sICJyZWFkX3BjIn0sCi17IDB4ZmYsIDB4NDEsIDIsIHtPX04sIE9fTn0sICJyZWFkX3ZhcnMifSwKLXsgMHhmZiwgMHg0MiwgMiwge09fTiwgT19OfSwgInJlYWRfZnJhbWUifSwKLXsgMHhmZiwgMHg0MywgMiwge09fTiwgT19OfSwgInJlYWRfb3B0b3AifSwKLXsgMHhmZiwgMHg0NCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9vcGxpbSJ9LAoteyAweGZmLCAweDQ1LCAyLCB7T19OLCBPX059LCAicmVhZF9jb25zdF9wb29sIn0sCi17IDB4ZmYsIDB4NDYsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfcHNyIn0sCi17IDB4ZmYsIDB4NDcsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdHJhcGJhc2UifSwKLXsgMHhmZiwgMHg0OCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrY291bnQwIn0sCi17IDB4ZmYsIDB4NDksIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfbG9ja2NvdW50MSJ9LAoteyAweGZmLCAweDRhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NGIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg0YywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrYWRkcjAifSwKLXsgMHhmZiwgMHg0ZCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrYWRkcjEifSwKLXsgMHhmZiwgMHg0ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDRmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NTAsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdXNlcnJhbmdlMSJ9LAoteyAweGZmLCAweDUxLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2djX2NvbmZpZyJ9LAoteyAweGZmLCAweDUyLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2JyazFhIn0sCi17IDB4ZmYsIDB4NTMsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfYnJrMmEifSwKLXsgMHhmZiwgMHg1NCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9icmsxMmMifSwKLXsgMHhmZiwgMHg1NSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF91c2VycmFuZ2UyIn0sCi17IDB4ZmYsIDB4NTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg1NywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF92ZXJzaW9uaWQifSwKLXsgMHhmZiwgMHg1OCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9oY3IifSwKLXsgMHhmZiwgMHg1OSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9zY19ib3R0b20ifSwKLXsgMHhmZiwgMHg1YSwgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMCJ9LAoteyAweGZmLCAweDViLCAyLCB7T19OLCBPX059LCAicmVhZF9nbG9iYWwxIn0sCi17IDB4ZmYsIDB4NWMsIDIsIHtPX04sIE9fTn0sICJyZWFkX2dsb2JhbDIifSwKLXsgMHhmZiwgMHg1ZCwgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMyJ9LAoteyAweGZmLCAweDVlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2MCwgMiwge09fTiwgT19OfSwgIndyaXRlX3BjIn0sCi17IDB4ZmYsIDB4NjEsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV92YXJzIn0sCi17IDB4ZmYsIDB4NjIsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9mcmFtZSJ9LAoteyAweGZmLCAweDYzLCAyLCB7T19OLCBPX059LCAid3JpdGVfb3B0b3AifSwKLXsgMHhmZiwgMHg2NCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfb3BsaW0ifSwKLXsgMHhmZiwgMHg2NSwgMiwge09fTiwgT19OfSwgIndyaXRlX2NvbnN0X3Bvb2wifSwKLXsgMHhmZiwgMHg2NiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfcHNyIn0sCi17IDB4ZmYsIDB4NjcsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3RyYXBiYXNlIn0sCi17IDB4ZmYsIDB4NjgsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2tjb3VudDAifSwKLXsgMHhmZiwgMHg2OSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2NvdW50MSJ9LAoteyAweGZmLCAweDZhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2YywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2FkZHIwIn0sCi17IDB4ZmYsIDB4NmQsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2thZGRyMSJ9LAoteyAweGZmLCAweDZlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NmYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3MCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfdXNlcnJhbmdlMSJ9LAoteyAweGZmLCAweDcxLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9nY19jb25maWcifSwKLXsgMHhmZiwgMHg3MiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMWEifSwKLXsgMHhmZiwgMHg3MywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMmEifSwKLXsgMHhmZiwgMHg3NCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMTJjIn0sCi17IDB4ZmYsIDB4NzUsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3VzZXJyYW5nZTIifSwKLXsgMHhmZiwgMHg3NiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDc3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NzgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3OSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfc2NfYm90dG9tIn0sCi17IDB4ZmYsIDB4N2EsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwwIn0sCi17IDB4ZmYsIDB4N2IsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwxIn0sCi17IDB4ZmYsIDB4N2MsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwyIn0sCi17IDB4ZmYsIDB4N2QsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwzIn0sCi17IDB4ZmYsIDB4N2UsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4MiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4NSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4OCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4YiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5MSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDkyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5YSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDliLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5ZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDllLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGExLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWUsIDIsIHtPX04sIE9fTn0sICJ0bV9wdXRjaGFyIn0sCi17IDB4ZmYsIDB4YWYsIDIsIHtPX04sIE9fTn0sICJ0bV9leGl0In0sCi17IDB4ZmYsIDB4YjAsIDIsIHtPX04sIE9fTn0sICJ0bV90cmFwIn0sCi17IDB4ZmYsIDB4YjEsIDIsIHtPX04sIE9fTn0sICJ0bV9taW5mbyJ9LAoteyAweGZmLCAweGIyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGMxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2IsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2UsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGUyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGViLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGYxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAotfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vTWFrZS1pbiBiL29wY29kZXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbiBiL29wY29kZXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MWQ5OGIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLWEyOWstZGlzLmMKLWFscGhhLWRpcy5jCi1hbHBoYS1vcGMuYwotYXJjLWRpcy5jCi1hcmMtb3BjLmMKLWFybS1kaXMuYwotYXJtLW9wYy5oCi1hdnItZGlzLmMKLWNnZW4tYXNtLmMKLWNnZW4tZGlzLmMKLWNnZW4tb3BjLmMKLWQxMHYtZGlzLmMKLWQxMHYtb3BjLmMKLWQzMHYtZGlzLmMKLWQzMHYtb3BjLmMKLWRpc2Fzc2VtYmxlLmMKLWRpcy1idWYuYwotZnIzMC1hc20uYwotZnIzMC1kZXNjLmMKLWZyMzAtZGVzYy5oCi1mcjMwLWRpcy5jCi1mcjMwLWlibGQuYwotZnIzMC1vcGMuYwotZnIzMC1vcGMuaAotaDgzMDAtZGlzLmMKLWg4NTAwLWRpcy5jCi1oODUwMC1vcGMuaAotaHBwYS1kaXMuYwotaTM3MC1kaXMuYwotaTM3MC1vcGMuYwotaTM4Ni1kaXMuYwotaTk2MC1kaXMuYwotaWE2NC1hc210YWIuYwotaWE2NC1hc210YWIuaAotaWE2NC1kaXMuYwotaWE2NC1nZW4uYwotaWE2NC1vcGMtYS5jCi1pYTY0LW9wYy1iLmMKLWlhNjQtb3BjLmMKLWlhNjQtb3BjLWQuYwotaWE2NC1vcGMtZi5jCi1pYTY0LW9wYy5oCi1pYTY0LW9wYy1pLmMKLWlhNjQtb3BjLW0uYwotbTEwMjAwLWRpcy5jCi1tMTAyMDAtb3BjLmMKLW0xMDMwMC1kaXMuYwotbTEwMzAwLW9wYy5jCi1tMzJyLWFzbS5jCi1tMzJyLWRlc2MuYwotbTMyci1kZXNjLmgKLW0zMnItZGlzLmMKLW0zMnItaWJsZC5jCi1tMzJyLW9wYy5jCi1tMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5jCi1tNjhrLWRpcy5jCi1tNjhrLW9wYy5jCi1tODhrLWRpcy5jCi1tY29yZS1kaXMuYwotbWNvcmUtb3BjLmgKLW1pcHMxNi1vcGMuYwotbWlwcy1kaXMuYwotbWlwcy1vcGMuYwotbnMzMmstZGlzLmMKLXBqLWRpcy5jCi1wai1vcGMuYwotcHBjLWRpcy5jCi1wcGMtb3BjLmMKLXNoLWRpcy5jCi1zaC1vcGMuaAotc3BhcmMtZGlzLmMKLXNwYXJjLW9wYy5jCi1zeXNkZXAuaAotdGljMzAtZGlzLmMKLXRpYzU0eC1kaXMuYwotdGljNTR4LW9wYy5jCi10aWM4MC1kaXMuYwotdGljODAtb3BjLmMKLXY4NTAtZGlzLmMKLXY4NTAtb3BjLmMKLXZheC1kaXMuYwotdzY1LWRpcy5jCi13NjUtb3BjLmgKLXo4ay1kaXMuYwotejhrZ2VuLmMKLXo4ay1vcGMuaApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdCBiL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzVjZWUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwMC0wNS0zMCAxMTozMy0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYWxwaGEtb3BjLmM6MzM1Ci1tc2dpZCAiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLW9wYy5jOjM1OCBhbHBoYS1vcGMuYzozODAKLW1zZ2lkICJqdW1wIGhpbnQgdW5hbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGFyYy1kaXMuYzoyMzIKLW1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjYyOQotbXNnaWQgInVuYWJsZSB0byBmaXQgZGlmZmVyZW50IHZhbHVlZCBjb25zdGFudHMgaW50byBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6NjM5Ci1tc2dpZCAiYXV4aWxpYXJ5IHJlZ2lzdGVyIG5vdCBhbGxvd2VkIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBgJWQnIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo3NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmFsdWUgd29uJ3QgZml0IGluIHJhbmdlICVsZCAtICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6ODcxCi1tc2dpZCAiYnJhbmNoIGFkZHJlc3Mgbm90IG9uIDQgYnl0ZSBib3VuZGFyeSIKLW1zZ3N0ciAiIgotCi0jOiBhcm0tZGlzLmM6NDc2Ci1tc2dpZCAiPGlsbGVnYWwgcHJlY2lzaW9uPiIKLW1zZ3N0ciAiIgotCi0jOiBhcm0tZGlzLmM6ODg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCByZWdpc3RlciBuYW1lIHNldDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcm0tZGlzLmM6ODk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkaXNhc3NlbWJsZXIgb3B0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzoxMDU5Ci1tc2dpZCAiIgotIlxuIgotIlRoZSBmb2xsb3dpbmcgQVJNIHNwZWNpZmljIGRpc2Fzc2VtYmxlciBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgZm9yIHVzZSB3aXRoXG4iCi0idGhlIC1NIHN3aXRjaDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjIyNAotbXNnaWQgInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dlbi1hc20uYzozMzIgZnIzMC1pYmxkLmM6MjIzIG0zMnItaWJsZC5jOjIyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBkMzB2LWRpcy5jOjMwNgotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93biByZWdpc3RlciAlZD4iCi1tc2dzdHIgIiIKLQotIy4gQ2FuJ3QgaGFwcGVuLgotIzogZGlzLWJ1Zi5jOjU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXJyb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkaXMtYnVmLmM6NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWRkcmVzcyAweCV4IGlzIG91dCBvZiBib3VuZHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzozMDUgbTMyci1hc20uYzozMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgY291bGRuJ3QgcGFyc2UgaXQuCi0jOiBmcjMwLWFzbS5jOjM2OSBmcjMwLWFzbS5jOjM3MyBmcjMwLWFzbS5jOjQ0NyBtMzJyLWFzbS5jOjM3NyBtMzJyLWFzbS5jOjM4MQotIzogbTMyci1hc20uYzo0NTUKLW1zZ2lkICJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLgotIy4gRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0jLiAiZXhwZWN0ZWQgY2hhciBgYyciCi0jOiBmcjMwLWFzbS5jOjQxNSBtMzJyLWFzbS5jOjQyMwotbXNnaWQgInN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjQ0MSBtMzJyLWFzbS5jOjQ0OQotbXNnaWQgImp1bmsgYXQgZW5kIG9mIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo1MzQgbTMyci1hc20uYzo1NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo1MzcgbTMyci1hc20uYzo1NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciCi1tc2dzdHIgIiIKLQotIzogZnIzMC1kaXMuYzozMDAgbTMyci1kaXMuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MjEwIG0zMnItaWJsZC5jOjIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6NzQ1IG0zMnItaWJsZC5jOjY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzo5NDcgbTMyci1pYmxkLmM6ODA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEwOTEgbTMyci1pYmxkLmM6OTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEyMjAgbTMyci1pYmxkLmM6MTAwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxMzQ5IG0zMnItaWJsZC5jOjEwOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTQ3MSBtMzJyLWlibGQuYzoxMTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJIbW1tbSAleCIKLW1zZ3N0ciAiIgotCi0jOiBoODMwMC1kaXMuYzo0MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIKLW1zZ3N0ciAiIgotCi0jOiBoODUwMC1kaXMuYzoxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIgotbXNnc3RyICIiCi0KLSMuIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcKLSM6IGg4NTAwLWRpcy5jOjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlMDJ4XHRcdCp1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBtMTAyMDAtZGlzLmM6MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAyMDAtZGlzLmM6MzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0bHgiCi1tc2dzdHIgIiIKLQotIzogbTEwMzAwLWRpcy5jOjY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duXHQweCUwNHgiCi1tc2dzdHIgIiIKLQotIzogbTY4ay1kaXMuYzo0MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGludGVybmFsIGVycm9yIGluIG9wY29kZSB0YWJsZTogJXMgJXM+XG4iCi1tc2dzdHIgIiIKLQotIzogbTY4ay1kaXMuYzo5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGZ1bmN0aW9uIGNvZGUgJWQ+IgotbXNnc3RyICIiCi0KLSM6IG04OGstZGlzLmM6Mjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiMgPGRpcyBlcnJvcjogJTA4eD4iCi1tc2dzdHIgIiIKLQotIzogbWlwcy1kaXMuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyBpbnRlcm5hbCBlcnJvciwgdW5kZWZpbmVkIG1vZGlmaWVyKCVjKSIKLW1zZ3N0ciAiIgotCi0jLiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQotIy4gKiBBIGlzIGFuIGFkZHJlc3MgYW5kIHdlIGNhbmB0IGhhdmUgdGhlIGFkZHJlc3Mgb2YKLSMuICogYW4gaW1tZWRpYXRlIGVpdGhlci4gV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB0byBpbmNyZWFzZQotIy4gKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KLSMuICogYW55d2F5IQotIy4KLSM6IG5zMzJrLWRpcy5jOjYxOAotbXNnaWQgIiQ8dW5kZWZpbmVkPiIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NjE5IHBwYy1vcGMuYzo2NTAKLW1zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NjUyCi1tc2dpZCAiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjcwNwotbXNnaWQgImlnbm9yaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4gYnJhbmNoIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6NzQyIHBwYy1vcGMuYzo3NzkKLW1zZ2lkICJpbGxlZ2FsIGJpdG1hc2siCi1tc2dzdHIgIiIKLQotIzogcHBjLW9wYy5jOjg0OAotbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6OTIyCi1tc2dpZCAiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6OTM3Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciCi1tc2dzdHIgIiIKLQotIy4gTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24KLSM6IHNwYXJjLWRpcy5jOjc0MwotbXNnaWQgInVua25vd24iCi1tc2dzdHIgIiIKLQotIzogc3BhcmMtZGlzLmM6ODE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogc3BhcmMtZGlzLmM6ODI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtZGlzLmM6MjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLWRpcy5jOjIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHBvcCByZWc6ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4KLSMuIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKLSMuIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCi0jLiBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCi0jLiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4KLSM6IHY4NTAtb3BjLmM6NDYKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjQ3Ci1tc2dpZCAiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjQ4Ci1tc2dpZCAiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG5vdCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NTAKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NjEKLW1zZ2lkICJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NjMgdjg1MC1vcGMuYzo5NQotbXNnaWQgImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2NiB2ODUwLW9wYy5jOjk4Ci1tc2dpZCAiYnJhbmNoIHRvIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo5MwotbXNnaWQgImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozMjEKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50IgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6MzQzCi1tc2dpZCAiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozNDgKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BwYy1kaXMuYyBiL29wY29kZXMvcHBjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I3OWNhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcHBjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIHBwYy1kaXMuYyAtLSBEaXNhc3NlbWJsZSBQb3dlclBDIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMsIGFsbCBvZiB3aGljaCB1c2UKLSAgIHRoZSBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGRlZmluZWQgaW4gZGlzLWFzbS5oLiAgU2V2ZXJhbCBmdW5jdGlvbnMKLSAgIGFyZSBwcm92aWRlZCBiZWNhdXNlIHRoaXMgZmlsZSBoYW5kbGVzIGRpc2Fzc2VtYmx5IGZvciB0aGUgUG93ZXJQQwotICAgaW4gYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gbW9kZSBhbmQgYWxzbyBmb3IgdGhlIFBPV0VSIChSUy82MDAwKQotICAgY2hpcC4gICovCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9wb3dlcnBjIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJICAgICAgIGludCBiaWdlbmRpYW4sIGludCBkaWFsZWN0KSk7Ci0KLS8qIFByaW50IGEgYmlnIGVuZGlhbiBQb3dlclBDIGluc3RydWN0aW9uLiAgRm9yIGNvbnZlbmllbmNlLCBhbHNvCi0gICBkaXNhc3NlbWJsZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMQotICAgYW5kIHRoZSBBbHRpdmVjIHZlY3RvciB1bml0LiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19wb3dlcnBjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAxLAotCQkJICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxIHwKLQkJCSAgICAgUFBDX09QQ09ERV9BTFRJVkVDKTsKLX0KLQotLyogUHJpbnQgYSBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgaW5zdHJ1Y3Rpb24uICBGb3IgY29udmVuaWVuY2UsIGFsc28KLSAgIGRpc2Fzc2VtYmxlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxCi0gICBhbmQgdGhlIEFsdGl2ZWMgdmVjdG9yIHVuaXQuICAqLwotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDAsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEgfAotCQkJICAgICBQUENfT1BDT0RFX0FMVElWRUMpOwotfQotCi0vKiBQcmludCBhIFBPV0VSIChSUy82MDAwKSBpbnN0cnVjdGlvbi4gICovCi0KLWludAotcHJpbnRfaW5zbl9yczYwMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIFBQQ19PUENPREVfUE9XRVIpOwotfQotCi0vKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGJpZ2VuZGlhbiwgZGlhbGVjdCkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGJpZ2VuZGlhbjsKLSAgICAgaW50IGRpYWxlY3Q7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOwotICB1bnNpZ25lZCBsb25nIG9wOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGJpZ2VuZGlhbikKLSAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gUFBDX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAotICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCi0gIG9wY29kZV9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IHBvd2VycGNfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9vcDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgaW50IGludmFsaWQ7Ci0gICAgICBpbnQgbmVlZF9jb21tYTsKLSAgICAgIGludCBuZWVkX3BhcmVuOwotCi0gICAgICB0YWJsZV9vcCA9IFBQQ19PUCAob3Bjb2RlLT5vcGNvZGUpOwotICAgICAgaWYgKG9wIDwgdGFibGVfb3ApCi0JYnJlYWs7Ci0gICAgICBpZiAob3AgPiB0YWJsZV9vcCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZQotCSAgfHwgKG9wY29kZS0+ZmxhZ3MgJiBkaWFsZWN0KSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGludmFsaWQgPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOwotCX0KLSAgICAgIGlmIChpbnZhbGlkKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAgICAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gICAgICBuZWVkX2NvbW1hID0gMDsKLSAgICAgIG5lZWRfcGFyZW4gPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIGxvbmcgdmFsdWU7Ci0KLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLQkgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCi0JICAgICBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkgIT0gMCkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHZhbHVlIGlzIHplcm8sIGRvbid0Ci0JICAgICBwcmludCBhbnl0aGluZy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKLQkgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSA9PSAwCi0JICAgICAgJiYgdmFsdWUgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JICAgICAgbmVlZF9jb21tYSA9IDA7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZQUikgIT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkIiwgdmFsdWUpOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfVlIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAidiVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyB2YWx1ZSwgaW5mbyk7Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0NSKSA9PSAwCi0JCSAgIHx8IChkaWFsZWN0ICYgUFBDX09QQ09ERV9QUEMpID09IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMykKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciVkIiwgdmFsdWUpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0YXRpYyBjb25zdCBjaGFyICpjYm5hbWVzWzRdID0geyAibHQiLCAiZ3QiLCAiZXEiLCAic28iIH07Ci0JCSAgaW50IGNyOwotCQkgIGludCBjYzsKLQotCQkgIGNyID0gdmFsdWUgPj4gMjsKLQkJICBpZiAoY3IgIT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiNCpjciVkIiwgY3IpOwotCQkgIGNjID0gdmFsdWUgJiAzOwotCQkgIGlmIChjYyAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoY3IgIT0gMCkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgY2JuYW1lc1tjY10pOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKG5lZWRfcGFyZW4pCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICBuZWVkX3BhcmVuID0gMDsKLQkgICAgfQotCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSA9PSAwKQotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCSAgICAgIG5lZWRfcGFyZW4gPSAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGZvdW5kIGFuZCBwcmludGVkIGFuIGluc3RydWN0aW9uOyByZXR1cm4uICAqLwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2guICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nIDB4JWx4IiwgaW5zbik7Ci0KLSAgcmV0dXJuIDQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BwYy1vcGMuYyBiL29wY29kZXMvcHBjLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY3YmQwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcHBjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0NyArMCwwIEBACi0vKiBwcGMtb3BjLmMgLS0gUG93ZXJQQyBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFRoaXMgZmlsZSBob2xkcyB0aGUgUG93ZXJQQyBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlCi0gICBpbmNsdWRlcyBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzCi0gICBwZXJtaXRzIHRoZSBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIKLSAgIGxvZ2ljLCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzCi0gICBzdHJpY3RseSBjb25zdGFudCBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluCi0gICB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0Ci0gICBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzCi0gICBmaWxlLiAgKi8KLQwKLS8qIExvY2FsIGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmF0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmF0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmJhIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmJhIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkcCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkcCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIGludCB2YWxpZF9ibyBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYm8gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9ibyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JvZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2RzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfZHMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9saSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2xpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbWJlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbWJlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbWI2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbWI2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbmIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9uYiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25zaSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X25zaSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhbCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYXMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JicyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3JicyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NoNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NoNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NwciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NwciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3RiciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3RiciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlLgotCi0gICBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncy4KLQotICAgV2UgdXNlZCB0byBwdXQgcGFyZW5zIGFyb3VuZCB0aGUgdmFyaW91cyBhZGRpdGlvbnMsIGxpa2UgdGhlIG9uZQotICAgZm9yIEJBIGp1c3QgYmVsb3cuICBIb3dldmVyLCB0aGF0IGNhdXNlZCB0cm91YmxlIHdpdGggZmVlYmxlCi0gICBjb21waWxlcnMgd2l0aCBhIGxpbWl0IG9uIGRlcHRoIG9mIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCBsaWtlCi0gICAocmVwb3J0ZWRseSkgdGhlIGNvbXBpbGVyIGluIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIDUuICBTbyB3ZQotICAgb21pdCB0aGUgcGFyZW5zLCBzaW5jZSB0aGUgbWFjcm9zIGFyZSBuZXZlciB1c2VkIGluIGEgY29udGV4dCB3aGVyZQotICAgdGhlIGFkZGl0aW9uIHdpbGwgYmUgYW1iaWd1b3VzLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCBwb3dlcnBjX29wZXJhbmRzW10gPQotewotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YKLSAgICAgb3BlcmFuZHMuICAqLwotI2RlZmluZSBVTlVTRUQgMAotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJBIFVOVVNFRCArIDEKLSNkZWZpbmUgQkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIEJUIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkFUIEJBICsgMQotICB7IDUsIDE2LCBpbnNlcnRfYmF0LCBleHRyYWN0X2JhdCwgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkIgQkFUICsgMQotI2RlZmluZSBCQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZQotICAgICBhcyB0aGUgQkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQkEgQkIgKyAxCi0gIHsgNSwgMTEsIGluc2VydF9iYmEsIGV4dHJhY3RfYmJhLCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgICBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIEJEIEJCQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkLCBleHRyYWN0X2JkLCBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGFic29sdXRlIGFkZHJlc3NpbmcgaXMKLSAgICAgdXNlZC4gICovCi0jZGVmaW5lIEJEQSBCRCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkLCBleHRyYWN0X2JkLCBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQuCi0gICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotI2RlZmluZSBCRE0gQkRBICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRtLCBleHRyYWN0X2JkbSwKLSAgICAgIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZAotICAgICBhbmQgYWJzb2x1dGUgYWRkcmVzcyBpcyB1c2VkLiAgKi8KLSNkZWZpbmUgQkRNQSBCRE0gKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZG0sIGV4dHJhY3RfYmRtLAotICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkLgotICAgICBUaGlzIHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLSNkZWZpbmUgQkRQIEJETUEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAotICAgICAgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkCi0gICAgIGFuZCBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzIHVzZWQuICAqLwotI2RlZmluZSBCRFBBIEJEUCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkcCwgZXh0cmFjdF9iZHAsCi0gICAgICBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRiBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCRiBCRFBBICsgMQotICB7IDMsIDIzLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIEFuIG9wdGlvbmFsIEJGIGZpZWxkLiAgVGhpcyBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluc3RydWN0aW9ucywKLSAgICAgaW4gd2hpY2ggYW4gb21pdHRlZCBCRiBmaWVsZCBpcyB0YWtlbiBhcyB6ZXJvLiAgKi8KLSNkZWZpbmUgT0JGIEJGICsgMQotICB7IDMsIDIzLCAwLCAwLCBQUENfT1BFUkFORF9DUiB8IFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIEJGQSBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCRkEgT0JGICsgMQotICB7IDMsIDE4LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCSSBmaWVsZCBpbiBhIEIgZm9ybSBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkkgQkZBICsgMQotI2RlZmluZSBCSV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIENlcnRhaW4gdmFsdWVzIGFyZQotICAgICBpbGxlZ2FsLiAgKi8KLSNkZWZpbmUgQk8gQkkgKyAxCi0jZGVmaW5lIEJPX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIGluc2VydF9ibywgZXh0cmFjdF9ibywgMCB9LAotCi0gIC8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG9yIC0gbW9kaWZpZXIgaXMKLSAgICAgdXNlZC4gIFRoaXMgaXMgbGlrZSB0aGUgQk8gZmllbGQsIGJ1dCBpdCBtdXN0IGJlIGV2ZW4uICAqLwotI2RlZmluZSBCT0UgQk8gKyAxCi0gIHsgNSwgMjEsIGluc2VydF9ib2UsIGV4dHJhY3RfYm9lLCAwIH0sCi0KLSAgLyogVGhlIEJUIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJUIEJPRSArIDEKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgY29uZGl0aW9uIHJlZ2lzdGVyIG51bWJlciBwb3J0aW9uIG9mIHRoZSBCSSBmaWVsZCBpbiBhIEIgZm9ybQotICAgICBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgZXh0ZW5kZWQKLSAgICAgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcywgd2hpY2ggc2V0IHRoZSBsb3dlciB0d28gYml0cyBvZiB0aGUKLSAgICAgQkkgZmllbGQuICBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLiAgKi8KLSNkZWZpbmUgQ1IgQlQgKyAxCi0gIHsgMywgMTgsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgRCBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgYSBkaXNwbGFjZW1lbnQgb2ZmCi0gICAgIGEgcmVnaXN0ZXIsIGFuZCBpbXBsaWVzIHRoYXQgdGhlIG5leHQgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIGluCi0gICAgIHBhcmVudGhlc2VzLiAgKi8KLSNkZWZpbmUgRCBDUiArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCi0gICAgIGxvd2VyIHR3byBiaXRzIGFyZSBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIERTIEQgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9kcywgZXh0cmFjdF9kcywgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEUgZmllbGQgaW4gYSB3cnRlZWkgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBFIERTICsgMQotICB7IDEsIDE1LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMMSBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTDEgRSArIDEKLSAgeyA0LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTDIgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkwyIEZMMSArIDEKLSAgeyAzLCAyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMTSBmaWVsZCBpbiBhbiBYRkwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMTSBGTDIgKyAxCi0gIHsgOCwgMTcsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRlJBIGZpZWxkIGluIGFuIFggb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJBIEZMTSArIDEKLSNkZWZpbmUgRlJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUkIgZmllbGQgaW4gYW4gWCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkIgRlJBICsgMQotI2RlZmluZSBGUkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSQyBmaWVsZCBpbiBhbiBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkMgRlJCICsgMQotI2RlZmluZSBGUkNfTUFTSyAoMHgxZiA8PCA2KQotICB7IDUsIDYsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUlMgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIG9yIHRoZSBGUlQgZmllbGQgaW4gYSBELCBYCi0gICAgIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSUyBGUkMgKyAxCi0jZGVmaW5lIEZSVCBGUlMKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZYTSBmaWVsZCBpbiBhbiBYRlggaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGWE0gRlJTICsgMQotI2RlZmluZSBGWE1fTUFTSyAoMHhmZiA8PCAxMikKLSAgeyA4LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBMIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMIEZYTSArIDEKLSAgeyAxLCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgTEVWIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExFViBMICsgMQotICB7IDcsIDUsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgICBmb3JjZWQgdG8gemVyby4gICovCi0jZGVmaW5lIExJIExFViArIDEKLSAgeyAyNiwgMCwgaW5zZXJ0X2xpLCBleHRyYWN0X2xpLCBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB1c2VkIGFzIGFuIGFic29sdXRlCi0gICAgIGFkZHJlc3MuICAqLwotI2RlZmluZSBMSUEgTEkgKyAxCi0gIHsgMjYsIDAsIGluc2VydF9saSwgZXh0cmFjdF9saSwgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgTUIgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUIgTElBICsgMQotI2RlZmluZSBNQl9NQVNLICgweDFmIDw8IDYpCi0gIHsgNSwgNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBNRSBmaWVsZCBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNRSBNQiArIDEKLSNkZWZpbmUgTUVfTUFTSyAoMHgxZiA8PCAxKQotICB7IDUsIDEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTUIgYW5kIE1FIGZpZWxkcyBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gZXhwcmVzc2VkIGEgc2luZ2xlCi0gICAgIG9wZXJhbmQgd2hpY2ggaXMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggYml0cyB0byBzZWxlY3QuICBUaGlzCi0gICAgIGlzIGEgdHdvIG9wZXJhbmQgZm9ybSB1c2luZyBQUENfT1BFUkFORF9ORVhULiAgU2VlIHRoZQotICAgICBkZXNjcmlwdGlvbiBpbiBvcGNvZGUvcHBjLmggZm9yIHdoYXQgdGhpcyBtZWFucy4gICovCi0jZGVmaW5lIE1CRSBNRSArIDEKLSAgeyA1LCA2LCAwLCAwLCBQUENfT1BFUkFORF9PUFRJT05BTCB8IFBQQ19PUEVSQU5EX05FWFQgfSwKLSAgeyAzMiwgMCwgaW5zZXJ0X21iZSwgZXh0cmFjdF9tYmUsIDAgfSwKLQotICAvKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaAotICAgICBiaXQgaXMgd3JhcHBlZCB0byB0aGUgbG93IGVuZC4gICovCi0jZGVmaW5lIE1CNiBNQkUgKyAyCi0jZGVmaW5lIE1FNiBNQjYKLSNkZWZpbmUgTUI2X01BU0sgKDB4M2YgPDwgNSkKLSAgeyA2LCA1LCBpbnNlcnRfbWI2LCBleHRyYWN0X21iNiwgMCB9LAotCi0gIC8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCi0gICAgIDAuICAqLwotI2RlZmluZSBOQiBNQjYgKyAxCi0gIHsgNiwgMTEsIGluc2VydF9uYiwgZXh0cmFjdF9uYiwgMCB9LAotCi0gIC8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZQotICAgICBTSSBmaWVsZCwgb25seSBuZWdhdGVkLiAgKi8KLSNkZWZpbmUgTlNJIE5CICsgMQotICB7IDE2LCAwLCBpbnNlcnRfbnNpLCBleHRyYWN0X25zaSwKLSAgICAgIFBQQ19PUEVSQU5EX05FR0FUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGFuIEQsIERTLCBYLCBYTywgTSwgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSQSBOU0kgKyAxCi0jZGVmaW5lIFJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICAgIGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBIGZpZWxkIG1heSBub3QgYmUgemVybyBhbmQgbWF5IG5vdAotICAgICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwotI2RlZmluZSBSQUwgUkEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYWwsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCi0gICAgIHJlc3RyaWN0aW9ucy4gICovCi0jZGVmaW5lIFJBTSBSQUwgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYW0sIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICAgIHN0b3JlIG9yIGFuIHVwZGF0aW5nIGZsb2F0aW5nIHBvaW50IGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBCi0gICAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCi0jZGVmaW5lIFJBUyBSQU0gKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYXMsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYLCBYTywgTSwgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSQiBSQVMgKyAxCi0jZGVmaW5lIFJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCi0gICAgIG1uZW1vbmljcyBsaWtlIG1yLiAgKi8KLSNkZWZpbmUgUkJTIFJCICsgMQotICB7IDUsIDEsIGluc2VydF9yYnMsIGV4dHJhY3RfcmJzLCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIFJTIGZpZWxkIGluIGEgRCwgRFMsIFgsIFhGWCwgWFMsIE0sIE1EIG9yIE1EUyBmb3JtCi0gICAgIGluc3RydWN0aW9uIG9yIHRoZSBSVCBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlggb3IgWE8gZm9ybQotICAgICBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJTIFJCUyArIDEKLSNkZWZpbmUgUlQgUlMKLSNkZWZpbmUgUlRfTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFNIIGZpZWxkIGluIGFuIFggb3IgTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0ggUlMgKyAxCi0jZGVmaW5lIFNIX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLwotI2RlZmluZSBTSDYgU0ggKyAxCi0jZGVmaW5lIFNINl9NQVNLICgoMHgxZiA8PCAxMSkgfCAoMSA8PCAxKSkKLSAgeyA2LCAxLCBpbnNlcnRfc2g2LCBleHRyYWN0X3NoNiwgMCB9LAotCi0gIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNJIFNINiArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIFNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uIHdoZW4gd2UgYWNjZXB0IGEgd2lkZSByYW5nZQotICAgICBvZiBwb3NpdGl2ZSB2YWx1ZXMuICAqLwotI2RlZmluZSBTSVNJR05PUFQgU0kgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1NJR05FRCB8IFBQQ19PUEVSQU5EX1NJR05PUFQgfSwKLQotICAvKiBUaGUgU1BSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBmbGlwcGVkLS10aGUKLSAgICAgbG93ZXIgNSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDUgYW5kIHZpY2UtIHZlcnNhLiAgKi8KLSNkZWZpbmUgU1BSIFNJU0lHTk9QVCArIDEKLSNkZWZpbmUgU1BSX01BU0sgKDB4M2ZmIDw8IDExKQotICB7IDEwLCAxMSwgaW5zZXJ0X3NwciwgZXh0cmFjdF9zcHIsIDAgfSwKLQotICAvKiBUaGUgQkFUIGluZGV4IG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XWliYXRbbHVdIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1BSQkFUIFNQUiArIDEKLSNkZWZpbmUgU1BSQkFUX01BU0sgKDB4MyA8PCAxNykKLSAgeyAyLCAxNywgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTUFJHIHJlZ2lzdGVyIG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XXNwcmcgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUFJHIFNQUkJBVCArIDEKLSNkZWZpbmUgU1BSR19NQVNLICgweDMgPDwgMTYpCi0gIHsgMiwgMTYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1IgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1IgU1BSRyArIDEKLSAgeyA0LCAxNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTViBTUiArIDEKLSAgeyAxNCwgMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgdGhlIFNQUgotICAgICBmaWVsZCwgYnV0IGl0IGlzIG9wdGlvbmFsLiAgKi8KLSNkZWZpbmUgVEJSIFNWICsgMQotICB7IDEwLCAxMSwgaW5zZXJ0X3RiciwgZXh0cmFjdF90YnIsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIFRPIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUTyBUQlIgKyAxCi0jZGVmaW5lIFRPX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVSBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVIFRPICsgMQotICB7IDQsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFVJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVUkgVSArIDEKLSAgeyAxNiwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBWQSBmaWVsZCBpbiBhIFZBLCBWWCBvciBWWFIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgVkEgVUkgKyAxCi0jZGVmaW5lIFZBX01BU0sJKDB4MWYgPDwgMTYpCi0gIHs1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfVlJ9LAotCi0gIC8qIFRoZSBWQiBmaWVsZCBpbiBhIFZBLCBWWCBvciBWWFIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgVkIgVkEgKyAxCi0jZGVmaW5lIFZCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHs1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfVlJ9LCAKLQotICAvKiBUaGUgVkMgZmllbGQgaW4gYSBWQSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBWQyBWQiArIDEKLSNkZWZpbmUgVkNfTUFTSyAoMHgxZiA8PCA2KQotICB7NSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfVlJ9LAotCi0gIC8qIFRoZSBWRCBvciBWUyBmaWVsZCBpbiBhIFZBLCBWWCwgVlhSIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgVkQgVkMgKyAxCi0jZGVmaW5lIFZTIFZECi0jZGVmaW5lIFZEX01BU0sgKDB4MWYgPDwgMjEpCi0gIHs1LCAyMSwgMCwgMCwgUFBDX09QRVJBTkRfVlJ9LAotCi0gIC8qIFRoZSBTSU1NIGZpZWxkIGluIGEgVlggZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgU0lNTSBWRCArIDEKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfU0lHTkVEfSwKLQotICAvKiBUaGUgVUlNTSBmaWVsZCBpbiBhIFZYIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFVJTU0gU0lNTSArIDEKLSAgeyA1LCAxNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTSEIgZmllbGQgaW4gYSBWQSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBTSEIgVUlNTSArIDEKLSAgeyA0LCA2LCAwLCAwLCAwIH0sCi19OwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCi0gICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwKLSAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQotICAgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iYXQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JhdCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxNikgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBCQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4KLSAgIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJBIGZpZWxkIGludG8gdGhlIEJCIGZpZWxkLAotICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCi0gICBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JiYSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDE2KSAmIDB4MWYpIDw8IDExKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmJhIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JkIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZC4KLSAgIFRoaXMgbW9kaWZpZXIgbWVhbnMgdGhhdCB0aGUgYnJhbmNoIGlzIG5vdCBleHBlY3RlZCB0byBiZSB0YWtlbi4KLSAgIFdlIG11c3Qgc2V0IHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgdG8gMSBpZiB0aGUgb2Zmc2V0IGlzCi0gICBuZWdhdGl2ZS4gIFdoZW4gZXh0cmFjdGluZywgd2UgcmVxdWlyZSB0aGF0IHRoZSB5IGJpdCBiZSAxIGFuZCB0aGF0Ci0gICB0aGUgb2Zmc2V0IGJlIHBvc2l0aXZlLCBzaW5jZSBpZiB0aGUgeSBiaXQgaXMgMCB3ZSBqdXN0IHdhbnQgdG8KLSAgIHByaW50IHRoZSBub3JtYWwgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmRtIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKLSAgICBpbnNuIHw9IDEgPDwgMjE7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmRtIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKLQkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSA9PSAwKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkLgotICAgVGhpcyBpcyBsaWtlIEJETSwgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUKLSAgIHRha2VuLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JkcCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgodmFsdWUgJiAweDgwMDApID09IDApCi0gICAgaW5zbiB8PSAxIDw8IDIxOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkcCAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwCi0JICB8fCAoaW5zbiAmICgxIDw8IDE1KSkgIT0gMCkpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogQ2hlY2sgZm9yIGxlZ2FsIHZhbHVlcyBvZiBhIEJPIGZpZWxkLiAgKi8KLQotc3RhdGljIGludAotdmFsaWRfYm8gKHZhbHVlKQotICAgICBsb25nIHZhbHVlOwotewotICAvKiBDZXJ0YWluIGVuY29kaW5ncyBoYXZlIGJpdHMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgemVyby4gIFRoZXNlCi0gICAgIGFyZSAoeiBtdXN0IGJlIHplcm8sIHkgbWF5IGJlIGFueXRoaW5nKToKLSAgICAgICAgIDAwMXp5Ci0JIDAxMXp5Ci0JIDF6MDB5Ci0JIDF6MDF5Ci0JIDF6MXp6Ci0gICAgICovCi0gIHN3aXRjaCAodmFsdWUgJiAweDE0KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgMHg0OgotICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4MikgPT0gMDsKLSAgICBjYXNlIDB4MTA6Ci0gICAgICByZXR1cm4gKHZhbHVlICYgMHg4KSA9PSAwOwotICAgIGNhc2UgMHgxNDoKLSAgICAgIHJldHVybiB2YWx1ZSA9PSAweDE0OwotICAgIH0KLX0KLQotLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgV2FybiBhYm91dCBhdHRlbXB0cyB0byBzZXQKLSAgIHRoZSBmaWVsZCB0byBhbiBpbGxlZ2FsIHZhbHVlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9ibyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMCi0gICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCi0gICAgKmVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYm8gKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHZhbHVlOwotCi0gIHZhbHVlID0gKGluc24gPj4gMjEpICYgMHgxZjsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG9yIC0gbW9kaWZpZXIgaXMKLSAgIHVzZWQuICBUaGlzIGlzIGxpa2UgdGhlIEJPIGZpZWxkLCBidXQgaXQgbXVzdCBiZSBldmVuLiAgV2hlbgotICAgZXh0cmFjdGluZyBpdCwgd2UgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYm9lIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgdmFsaWRfYm8gKHZhbHVlKSkKLQkqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKLSAgICAgIGVsc2UgaWYgKCh2YWx1ZSAmIDEpICE9IDApCi0JKmVycm1zZyA9IF8oImF0dGVtcHQgdG8gc2V0IHkgYml0IHdoZW4gdXNpbmcgKyBvciAtIG1vZGlmaWVyIik7Ci0gICAgfQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAyMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JvZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoaW5zbiA+PiAyMSkgJiAweDFmOwotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiB2YWx1ZSAmIDB4MWU7Ci19Ci0KLS8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQotICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2RzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2RzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2xpIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodmFsdWUgJiAzKSAhPSAwICYmIGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLSAgICAqZXJybXNnID0gXygiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0Iik7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHgzZmZmZmZjKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9saSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKChpbnNuICYgMHgyMDAwMDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4M2ZmZmZmYykgLSAweDQwMDAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4M2ZmZmZmYzsKLX0KLQotLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhcyBhIHNpbmdsZQotICAgb3BlcmFuZCB3aGljaCBpcyBpdHNlbGYgYSBiaXRtYXNrLiAgVGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24gYWx3YXlzCi0gICBtYXJrcyBpdCBhcyBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbgotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbWJlIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdXZhbCwgbWFzazsKLSAgaW50IG1iLCBtZSwgbXgsIGNvdW50LCBsYXN0OwotCi0gIHV2YWwgPSB2YWx1ZTsKLQotICBpZiAodXZhbCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0JKmVycm1zZyA9IF8oImlsbGVnYWwgYml0bWFzayIpOwotICAgICAgcmV0dXJuIGluc247Ci0gICAgfQotCi0gIG1iID0gMDsKLSAgbWUgPSAzMjsKLSAgaWYgKCh1dmFsICYgMSkgIT0gMCkKLSAgICBsYXN0ID0gMTsKLSAgZWxzZQotICAgIGxhc3QgPSAwOwotICBjb3VudCA9IDA7Ci0KLSAgLyogbWI6IGxvY2F0aW9uIG9mIGxhc3QgMC0+MSB0cmFuc2l0aW9uICovCi0gIC8qIG1lOiBsb2NhdGlvbiBvZiBsYXN0IDEtPjAgdHJhbnNpdGlvbiAqLwotICAvKiBjb3VudDogIyB0cmFuc2l0aW9ucyAqLwotCi0gIGZvciAobXggPSAwLCBtYXNrID0gMSA8PCAzMTsgbXggPCAzMjsgKytteCwgbWFzayA+Pj0gMSkKLSAgICB7Ci0gICAgICBpZiAoKHV2YWwgJiBtYXNrKSAmJiAhbGFzdCkKLQl7Ci0JICArK2NvdW50OwotCSAgbWIgPSBteDsKLQkgIGxhc3QgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKCEodXZhbCAmIG1hc2spICYmIGxhc3QpCi0JewotCSAgKytjb3VudDsKLQkgIG1lID0gbXg7Ci0JICBsYXN0ID0gMDsKLQl9Ci0gICAgfQotICBpZiAobWUgPT0gMCkKLSAgICBtZSA9IDMyOwotCi0gIGlmIChjb3VudCAhPSAyICYmIChjb3VudCAhPSAwIHx8ICEgbGFzdCkpCi0gICAgewotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7Ci0gICAgfQotCi0gIHJldHVybiBpbnNuIHwgKG1iIDw8IDYpIHwgKChtZSAtIDEpIDw8IDEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9tYmUgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIHJldDsKLSAgaW50IG1iLCBtZTsKLSAgaW50IGk7Ci0KLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMKQotICAgICppbnZhbGlkID0gMTsKLQotICBtYiA9IChpbnNuID4+IDYpICYgMHgxZjsKLSAgbWUgPSAoaW5zbiA+PiAxKSAmIDB4MWY7Ci0gIGlmIChtYiA8IG1lICsgMSkKLSAgICB7Ci0gICAgICByZXQgPSAwOwotICAgICAgZm9yIChpID0gbWI7IGkgPD0gbWU7IGkrKykKLQlyZXQgfD0gKGxvbmcpIDEgPDwgKDMxIC0gaSk7Ci0gICAgfQotICBlbHNlIGlmIChtYiA9PSBtZSArIDEpCi0gICAgcmV0ID0gfjA7Ci0gIGVsc2UgLyogKG1iID4gbWUgKyAxKSAqLwotICAgIHsKLSAgICAgIHJldCA9IH4gKGxvbmcpIDA7Ci0gICAgICBmb3IgKGkgPSBtZSArIDE7IGkgPCBtYjsgaSsrKQotCXJldCAmPSB+ICgobG9uZykgMSA8PCAoMzEgLSBpKSk7Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCBiaXQKLSAgIGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbWI2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgNikgfCAodmFsdWUgJiAweDIwKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9tYjYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gNikgJiAweDFmKSB8IChpbnNuICYgMHgyMCk7Ci19Ci0KLS8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCi0gICAwLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9uYiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzIpCi0gICAgKmVycm1zZyA9IF8oInZhbHVlIG91dCBvZiByYW5nZSIpOwotICBpZiAodmFsdWUgPT0gMzIpCi0gICAgdmFsdWUgPSAwOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfbmIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxvbmcgcmV0OwotCi0gIHJldCA9IChpbnNuID4+IDExKSAmIDB4MWY7Ci0gIGlmIChyZXQgPT0gMCkKLSAgICByZXQgPSAzMjsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIE5TSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFNJCi0gICBmaWVsZCwgb25seSBuZWdhdGVkLiAgVGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24gYWx3YXlzIG1hcmtzIGl0IGFzCi0gICBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzCi0gICBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9uc2kgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgoLSB2YWx1ZSkgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9uc2kgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIC0gKChsb25nKShpbnNuICYgMHhmZmZmKSAtIDB4MTAwMDApOwotICBlbHNlCi0gICAgcmV0dXJuIC0gKGxvbmcpKGluc24gJiAweGZmZmYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90Ci0gICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhbCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPT0gMAotICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHZhbHVlID09ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKLSAgICAqZXJybXNnID0gImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIjsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYW0gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+PSAoKGluc24gPj4gMjEpICYgMHgxZikpCi0gICAgKmVycm1zZyA9IF8oImluZGV4IHJlZ2lzdGVyIGluIGxvYWQgcmFuZ2UiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKLSAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAotICAgbW5lbW9uaWNzIGxpa2UgbXIuICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuICBUaGUgaW5zZXJ0aW9uCi0gICBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQlQgZmllbGQgaW50byB0aGUgQkEgZmllbGQsIGFuZCB0aGUKLSAgIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYnMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3JicyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc2g2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpIHwgKCh2YWx1ZSAmIDB4MjApID4+IDQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X3NoNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuICgoaW5zbiA+PiAxMSkgJiAweDFmKSB8ICgoaW5zbiA8PCA0KSAmIDB4MjApOwotfQotCi0vKiBUaGUgU1BSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBmbGlwcGVkLS10aGUKLSAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfc3ByIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2UwKSA8PCA2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc3ByIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotfQotCi0vKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMganVzdCBsaWtlIFNQUiwgYnV0IGl0Ci0gICBpcyBvcHRpb25hbC4gIFdoZW4gVEJSIGlzIG9taXR0ZWQsIGl0IG11c3QgYmUgaW5zZXJ0ZWQgYXMgMjY4ICh0aGUKLSAgIG1hZ2ljIG51bWJlciBvZiB0aGUgVEIgcmVnaXN0ZXIpLiAgVGhlc2UgZnVuY3Rpb25zIHRyZWF0IDAKLSAgIChpbmRpY2F0aW5nIGFuIG9taXR0ZWQgb3B0aW9uYWwgb3BlcmFuZCkgYXMgMjY4LiAgVGhpcyBtZWFucyB0aGF0Ci0gICBgYG1mdGIgNCwwJycgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgVGhpcyBkb2VzIG5vdCBtYXR0ZXIgdmVyeQotICAgbXVjaCwgc2luY2UgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgZG9lcyBub3QgZGVmaW5lIG1mdGIgYXMKLSAgIGFjY2VwdGluZyBhbnkgdmFsdWVzIG90aGVyIHRoYW4gMjY4IG9yIDI2OS4gICovCi0KLSNkZWZpbmUgVEIgKDI2OCkKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF90YnIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAodmFsdWUgPT0gMCkKLSAgICB2YWx1ZSA9IFRCOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF90YnIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxvbmcgcmV0OwotCi0gIHJldCA9ICgoaW5zbiA+PiAxNikgJiAweDFmKSB8ICgoaW5zbiA+PiA2KSAmIDB4M2UwKTsKLSAgaWYgKHJldCA9PSBUQikKLSAgICByZXQgPSAwOwotICByZXR1cm4gcmV0OwotfQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzLiAgKi8KLQotLyogVGhlIG1haW4gb3Bjb2RlLiAgKi8KLSNkZWZpbmUgT1AoeCkgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIDB4M2YpIDw8IDI2KQotI2RlZmluZSBPUF9NQVNLIE9QICgweDNmKQotCi0vKiBUaGUgbWFpbiBvcGNvZGUgY29tYmluZWQgd2l0aCBhIHRyYXAgY29kZSBpbiB0aGUgVE8gZmllbGQgb2YgYSBECi0gICBmb3JtIGluc3RydWN0aW9uLiAgVXNlZCBmb3IgZXh0ZW5kZWQgbW5lbW9uaWNzIGZvciB0aGUgdHJhcAotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgT1BUTyh4LHRvKSAoT1AgKHgpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHRvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIE9QVE9fTUFTSyAoT1BfTUFTSyB8IFRPX01BU0spCi0KLS8qIFRoZSBtYWluIG9wY29kZSBjb21iaW5lZCB3aXRoIGEgY29tcGFyaXNvbiBzaXplIGJpdCBpbiB0aGUgTCBmaWVsZAotICAgb2YgYSBEIGZvcm0gb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgVXNlZCBmb3IgZXh0ZW5kZWQgbW5lbW9uaWNzIGZvcgotICAgdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgT1BMKHgsbCkgKE9QICh4KSB8ICgoKCh1bnNpZ25lZCBsb25nKShsKSkgJiAxKSA8PCAyMSkpCi0jZGVmaW5lIE9QTF9NQVNLIE9QTCAoMHgzZiwxKQotCi0vKiBBbiBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBBKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBBX01BU0sgQSAoMHgzZiwgMHgxZiwgMSkKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkJfTUFTSyAoQV9NQVNLIHwgRlJCX01BU0spCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkMgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBBRlJDX01BU0sgKEFfTUFTSyB8IEZSQ19NQVNLKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJBIGFuZCBGUkMgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQUZSQ19NQVNLIChBX01BU0sgfCBGUkFfTUFTSyB8IEZSQ19NQVNLKQotCi0vKiBBIEIgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEIob3AsIGFhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoYWEpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKLSNkZWZpbmUgQl9NQVNLIEIgKDB4M2YsIDEsIDEpCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkLiAgKi8KLSNkZWZpbmUgQkJPKG9wLCBibywgYWEsIGxrKSAoQiAoKG9wKSwgKGFhKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgQkJPX01BU0sgQkJPICgweDNmLCAweDFmLCAxLCAxKQotCi0vKiBBIEJCT19NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgVGhpcyBwZXJtaXRzCi0gICBtYXRjaGluZyBhIGNvbmRpdGlvbmFsIGJyYW5jaCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSB5Ci0gICBiaXQuICAqLwotI2RlZmluZSBZX01BU0sgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkKLSNkZWZpbmUgQkJPWV9NQVNLIChCQk9fTUFTSyAmfiBZX01BU0spCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkIGFuZCB0aGUgY29uZGl0aW9uIGJpdHMgb2YKLSAgIHRoZSBCSSBmaWVsZC4gICovCi0jZGVmaW5lIEJCT0NCKG9wLCBibywgY2IsIGFhLCBsaykgXAotICAoQkJPICgob3ApLCAoYm8pLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMHgzKSA8PCAxNikpCi0jZGVmaW5lIEJCT0NCX01BU0sgQkJPQ0IgKDB4M2YsIDB4MWYsIDB4MywgMSwgMSkKLQotLyogQSBCQk9DQl9NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgKi8KLSNkZWZpbmUgQkJPWUNCX01BU0sgKEJCT0NCX01BU0sgJn4gWV9NQVNLKQotCi0vKiBBIEJCT1lDQl9NQVNLIGluIHdoaWNoIHRoZSBCSSBmaWVsZCBpcyBmaXhlZC4gICovCi0jZGVmaW5lIEJCT1lCSV9NQVNLIChCQk9ZQ0JfTUFTSyB8IEJJX01BU0spCi0KLS8qIFRoZSBtYWluIG9wY29kZSBtYXNrIHdpdGggdGhlIFJBIGZpZWxkIGNsZWFyLiAgKi8KLSNkZWZpbmUgRFJBX01BU0sgKE9QX01BU0sgfCBSQV9NQVNLKQotCi0vKiBBIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBEU08ob3AsIHhvcCkgKE9QIChvcCkgfCAoKHhvcCkgJiAweDMpKQotI2RlZmluZSBEU19NQVNLIERTTyAoMHgzZiwgMykKLQotLyogQW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTShvcCwgcmMpIChPUCAob3ApIHwgKChyYykgJiAxKSkKLSNkZWZpbmUgTV9NQVNLIE0gKDB4M2YsIDEpCi0KLS8qIEFuIE0gZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBNRSBmaWVsZCBzcGVjaWZpZWQuICAqLwotI2RlZmluZSBNTUUob3AsIG1lLCByYykgKE0gKChvcCksIChyYykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKG1lKSkgJiAweDFmKSA8PCAxKSkKLQotLyogQW4gTV9NQVNLIHdpdGggdGhlIE1CIGFuZCBNRSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBNTUJNRV9NQVNLIChNX01BU0sgfCBNQl9NQVNLIHwgTUVfTUFTSykKLQotLyogQW4gTV9NQVNLIHdpdGggdGhlIFNIIGFuZCBNRSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBNU0hNRV9NQVNLIChNX01BU0sgfCBTSF9NQVNLIHwgTUVfTUFTSykKLQotLyogQW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1EKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4NykgPDwgMikgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNRF9NQVNLIE1EICgweDNmLCAweDcsIDEpCi0KLS8qIEFuIE1EX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRE1CX01BU0sgKE1EX01BU0sgfCBNQjZfTUFTSykKLQotLyogQW4gTURfTUFTSyB3aXRoIHRoZSBTSCBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1EU0hfTUFTSyAoTURfTUFTSyB8IFNINl9NQVNLKQotCi0vKiBBbiBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1EUyhvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweGYpIDw8IDEpIHwgKChyYykgJiAxKSkKLSNkZWZpbmUgTURTX01BU0sgTURTICgweDNmLCAweGYsIDEpCi0KLS8qIEFuIE1EU19NQVNLIHdpdGggdGhlIE1CIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURTTUJfTUFTSyAoTURTX01BU0sgfCBNQjZfTUFTSykKLQotLyogQW4gU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNDKG9wLCBzYSwgbGspIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNhKSkgJiAxKSA8PCAxKSB8ICgobGspICYgMSkpCi0jZGVmaW5lIFNDX01BU0sgKE9QX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTB4M2ZmKSA8PCAxNikgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDEpIHwgMSkKLQotLyogQW4gVlggZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgVlgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4N2ZmKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFZYIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFZYX01BU0sJVlgoMHgzZiwgMHg3ZmYpCi0KLS8qIEFuIFZBIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFZYQShvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgwN2YpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gVkEgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgVlhBX01BU0sgVlhBKDB4M2YsIDB4N2YpCi0KLS8qIEFuIFZYUiBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBWWFIob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgocmMpICYgMSkgPDwgMTApIHwgKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikpCi0KLS8qIFRoZSBtYXNrIGZvciBhIFZYUiBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBWWFJfTUFTSyBWWFIoMHgzZiwgMHgzZmYsIDEpCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBSQyBiaXQgc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgWFJDKG9wLCB4b3AsIHJjKSAoWCAoKG9wKSwgKHhvcCkpIHwgKChyYykgJiAxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhfTUFTSyBYUkMgKDB4M2YsIDB4M2ZmLCAxKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUkFfTUFTSyAoWF9NQVNLIHwgUkFfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJCX01BU0sgKFhfTUFTSyB8IFJCX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSVCBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSVF9NQVNLIChYX01BU0sgfCBSVF9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgYW5kIFJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhSQVJCX01BU0sgKFhfTUFTSyB8IFJBX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgYW5kIFJBIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhSVFJBX01BU0sgKFhfTUFTSyB8IFJUX01BU0sgfCBSQV9NQVNLKQotCi0vKiBBbiBYIGZvcm0gY29tcGFyaXNvbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhDTVBMKG9wLCB4b3AsIGwpIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjIpKQotCi0vKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTCBmaWVsZAotICAgZml4ZWQuICAqLwotI2RlZmluZSBYQ01QTF9NQVNLIChYQ01QX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKSkKLQotLyogQW4gWCBmb3JtIHRyYXAgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgVE8gZmllbGQgc3BlY2lmaWVkLiAgKi8KLSNkZWZpbmUgWFRPKG9wLCB4b3AsIHRvKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHRvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIFhUT19NQVNLIChYX01BU0sgfCBUT19NQVNLKQotCi0vKiBBbiBYRkwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhGTChvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhGTF9NQVNLIChYRkwgKDB4M2YsIDB4M2ZmLCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjUpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxNikpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTEsgZmllbGQgc2V0IHRvIDAuICAqLwotI2RlZmluZSBYTChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIHRoZSBMSyBmaWVsZC4gICovCi0jZGVmaW5lIFhMTEsob3AsIHhvcCwgbGspIChYTCAoKG9wKSwgKHhvcCkpIHwgKChsaykgJiAxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYTF9NQVNLIFhMTEsgKDB4M2YsIDB4M2ZmLCAxKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgQk8gZmllbGQuICAqLwotI2RlZmluZSBYTE8ob3AsIGJvLCB4b3AsIGxrKSBcCi0gIChYTExLICgob3ApLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgWExPX01BU0sgKFhMX01BU0sgfCBCT19NQVNLKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPCi0gICBmaWVsZC4gICovCi0jZGVmaW5lIFhMWUxLKG9wLCB4b3AsIHksIGxrKSAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHkpKSAmIDEpIDw8IDIxKSkKLSNkZWZpbmUgWExZTEtfTUFTSyAoWExfTUFTSyB8IFlfTUFTSykKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBzZXRzIHRoZSBCTyBmaWVsZCBhbmQgdGhlIGNvbmRpdGlvbgotICAgYml0cyBvZiB0aGUgQkkgZmllbGQuICAqLwotI2RlZmluZSBYTE9DQihvcCwgYm8sIGNiLCB4b3AsIGxrKSBcCi0gIChYTE8gKChvcCksIChibyksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMykgPDwgMTYpKQotI2RlZmluZSBYTE9DQl9NQVNLIFhMT0NCICgweDNmLCAweDFmLCAweDMsIDB4M2ZmLCAxKQotCi0vKiBBbiBYTF9NQVNLIG9yIFhMWUxLX01BU0sgb3IgWExPQ0JfTUFTSyB3aXRoIHRoZSBCQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhMQkJfTUFTSyAoWExfTUFTSyB8IEJCX01BU0spCi0jZGVmaW5lIFhMWUJCX01BU0sgKFhMWUxLX01BU0sgfCBCQl9NQVNLKQotI2RlZmluZSBYTEJPQ0JCQl9NQVNLIChYTE9DQl9NQVNLIHwgQkJfTUFTSykKLQotLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTyBhbmQgQkIgZmllbGRzIGZpeGVkLiAgKi8KLSNkZWZpbmUgWExCT0JCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQkJfTUFTSykKLQotLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTywgQkkgYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhMQk9CSUJCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQklfTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhPIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYTyhvcCwgeG9wLCBvZSwgcmMpIFwKLSAgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMSkgfCAoKCgodW5zaWduZWQgbG9uZykob2UpKSAmIDEpIDw8IDEwKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWE9fTUFTSyBYTyAoMHgzZiwgMHgxZmYsIDEsIDEpCi0KLS8qIEFuIFhPX01BU0sgd2l0aCB0aGUgUkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYT1JCX01BU0sgKFhPX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWFMob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDIpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYU19NQVNLIFhTICgweDNmLCAweDFmZiwgMSkKLQotLyogQSBtYXNrIGZvciB0aGUgRlhNIHZlcnNpb24gb2YgYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYRlhGWE1fTUFTSyAoWF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMCkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDExKSkKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgRlhNIGZpZWxkIGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhGWE0ob3AsIHhvcCwgZnhtKSBcCi0gIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoZnhtKSkgJiAweGZmKSA8PCAxMikpCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYU1BSKG9wLCB4b3AsIHNwcikgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgxZikgPDwgMTYpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgzZTApIDw8IDYpKQotI2RlZmluZSBYU1BSX01BU0sgKFhfTUFTSyB8IFNQUl9NQVNLKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCi0gICBTUFJCQVQgZmllbGQuICAqLwotI2RlZmluZSBYU1BSQkFUX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJCQVRfTUFTSykKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQotICAgU1BSRyBmaWVsZC4gICovCi0jZGVmaW5lIFhTUFJHX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJHX01BU0spCi0KLS8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZmlsbGVkIGluIGV4Y2VwdCB0aGUgRSBmaWVsZC4gICovCi0jZGVmaW5lIFhFX01BU0sgKDB4ZmZmZjdmZmYpCi0KLS8qIFRoZSBCTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2ggbW5lbW9uaWNzLiAgKi8KLSNkZWZpbmUgQk9ETlpGCSgweDApCi0jZGVmaW5lIEJPRE5aRlAJKDB4MSkKLSNkZWZpbmUgQk9EWkYJKDB4MikKLSNkZWZpbmUgQk9EWkZQCSgweDMpCi0jZGVmaW5lIEJPRgkoMHg0KQotI2RlZmluZSBCT0ZQCSgweDUpCi0jZGVmaW5lIEJPRE5aVAkoMHg4KQotI2RlZmluZSBCT0ROWlRQCSgweDkpCi0jZGVmaW5lIEJPRFpUCSgweGEpCi0jZGVmaW5lIEJPRFpUUAkoMHhiKQotI2RlZmluZSBCT1QJKDB4YykKLSNkZWZpbmUgQk9UUAkoMHhkKQotI2RlZmluZSBCT0ROWgkoMHgxMCkKLSNkZWZpbmUgQk9ETlpQCSgweDExKQotI2RlZmluZSBCT0RaCSgweDEyKQotI2RlZmluZSBCT0RaUAkoMHgxMykKLSNkZWZpbmUgQk9VCSgweDE0KQotCi0vKiBUaGUgQkkgY29uZGl0aW9uIGJpdCBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2gKLSAgIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIENCTFQJKDApCi0jZGVmaW5lIENCR1QJKDEpCi0jZGVmaW5lIENCRVEJKDIpCi0jZGVmaW5lIENCU08JKDMpCi0KLS8qIFRoZSBUTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCB0cmFwIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIFRPTEdUCSgweDEpCi0jZGVmaW5lIFRPTExUCSgweDIpCi0jZGVmaW5lIFRPRVEJKDB4NCkKLSNkZWZpbmUgVE9MR0UJKDB4NSkKLSNkZWZpbmUgVE9MTkwJKDB4NSkKLSNkZWZpbmUgVE9MTEUJKDB4NikKLSNkZWZpbmUgVE9MTkcJKDB4NikKLSNkZWZpbmUgVE9HVAkoMHg4KQotI2RlZmluZSBUT0dFCSgweGMpCi0jZGVmaW5lIFRPTkwJKDB4YykKLSNkZWZpbmUgVE9MVAkoMHgxMCkKLSNkZWZpbmUgVE9MRQkoMHgxNCkKLSNkZWZpbmUgVE9ORwkoMHgxNCkKLSNkZWZpbmUgVE9ORQkoMHgxOCkKLSNkZWZpbmUgVE9VCSgweDFmKQotDAotLyogU21hbGxlciBuYW1lcyBmb3IgdGhlIGZsYWdzIHNvIGVhY2ggZW50cnkgaW4gdGhlIG9wY29kZXMgdGFibGUgd2lsbAotICAgZml0IG9uIGEgc2luZ2xlIGxpbmUuICAqLwotI3VuZGVmCVBQQwotI2RlZmluZSBQUEMgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDQ09NCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUEMzMiAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQzY0ICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzY0IHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDT05MWQlQUENfT1BDT0RFX1BQQwotI2RlZmluZSBQUEM0MDMJUFBDCi0jZGVmaW5lIFBQQzc1MAlQUEMKLSNkZWZpbmUgUFBDODYwCVBQQwotI2RlZmluZSBQUENWRUMJUFBDX09QQ09ERV9BTFRJVkVDIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ1BXUjIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlQT1dFUjMyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJQ09NICAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCUNPTTMyICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJTTYwMSAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQV1JDT00JUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlNRkRFQzEJUFBDX09QQ09ERV9QT1dFUgotI2RlZmluZQlNRkRFQzIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCSAgICAgT1BDT0RFCU1BU0sJCUZMQUdTCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBGTEFHUyBhcmUgZmxhZ3MgaW5kaWNhdGVkIHdoYXQgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW10gPSB7Ci17ICJ0ZGxndGkiLCAgT1BUTygyLFRPTEdUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGx0aSIsICBPUFRPKDIsVE9MTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRlcWkiLCAgIE9QVE8oMixUT0VRKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGdlaSIsICBPUFRPKDIsVE9MR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbmxpIiwgIE9QVE8oMixUT0xOTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxsZWkiLCAgT1BUTygyLFRPTExFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbG5naSIsICBPUFRPKDIsVE9MTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRndGkiLCAgIE9QVE8oMixUT0dUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZ2VpIiwgICBPUFRPKDIsVE9HRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5saSIsICAgT1BUTygyLFRPTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsdGkiLCAgIE9QVE8oMixUT0xUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGVpIiwgICBPUFRPKDIsVE9MRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5naSIsICAgT1BUTygyLFRPTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRuZWkiLCAgIE9QVE8oMixUT05FKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkaSIsICAgICBPUCgyKSwJT1BfTUFTSywJUFBDNjQsCQl7IFRPLCBSQSwgU0kgfSB9LAotCi17ICJ0d2xndGkiLCAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGd0aSIsICAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xsdGkiLCAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGx0aSIsICAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2VxaSIsICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRlcWkiLCAgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsZ2VpIiwgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxnZWkiLCAgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmxpIiwgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxubGkiLCAgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbGVpIiwgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxsZWkiLCAgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmdpIiwgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxuZ2kiLCAgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdndGkiLCAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0Z3RpIiwgICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3Z2VpIiwgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGdlaSIsICAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25saSIsICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRubGkiLCAgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsdGkiLCAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bHRpIiwgICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGVpIiwgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxlaSIsICAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25naSIsICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRuZ2kiLCAgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHduZWkiLCAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmVpIiwgICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3aSIsICAgICBPUCgzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLXsgInRpIiwgICAgICBPUCgzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLSAgCi17ICJtZnZzY3IiLCAgVlgoNCwgMTU0MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQgfSB9LAoteyAibXR2c2NyIiwgIFZYKDQsIDE2MDQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZEIH0gfSwKLXsgInZhZGRjdXciLCBWWCg0LCAgMzg0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZhZGRmcCIsICBWWCg0LCAgIDEwKSwgVlhfTUFTSywgCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2YWRkc2JzIiwgVlgoNCwgIDc2OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2YWRkc2hzIiwgVlgoNCwgIDgzMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2YWRkc3dzIiwgVlgoNCwgIDg5NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2YWRkdWJtIiwgVlgoNCwgICAgMCksIFZYX01BU0ssIAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFkZHVicyIsIFZYKDQsICA1MTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFkZHVobSIsIFZYKDQsICAgNjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFkZHVocyIsIFZYKDQsICA1NzYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFkZHV3bSIsIFZYKDQsICAxMjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFkZHV3cyIsIFZYKDQsICA2NDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFuZCIsICAgIFZYKDQsIDEwMjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmFuZGMiLCAgIFZYKDQsIDEwOTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3NiIiwgIFZYKDQsIDEyODIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3NoIiwgIFZYKDQsIDEzNDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3N3IiwgIFZYKDQsIDE0MTApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3ViIiwgIFZYKDQsIDEwMjYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3VoIiwgIFZYKDQsIDEwOTApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmF2Z3V3IiwgIFZYKDQsIDExNTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNmc3giLCAgIFZYKDQsICA4NDIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiwgVUlNTSB9IH0sCi17ICJ2Y2Z1eCIsICAgVlgoNCwgIDc3OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKLXsgInZjbXBiZnAiLCAgIFZYUig0LCA5NjYsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGJmcC4iLCAgVlhSKDQsIDk2NiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZXFmcCIsICBWWFIoNCwgMTk4LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBlcWZwLiIsIFZYUig0LCAxOTgsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGVxdWIiLCAgVlhSKDQsICAgNiwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZXF1Yi4iLCBWWFIoNCwgICA2LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBlcXVoIiwgIFZYUig0LCAgNzAsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGVxdWguIiwgVlhSKDQsICA3MCwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZXF1dyIsICBWWFIoNCwgMTM0LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBlcXV3LiIsIFZYUig0LCAxMzQsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGdlZnAiLCAgVlhSKDQsIDQ1NCwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZ2VmcC4iLCBWWFIoNCwgNDU0LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBndGZwIiwgIFZYUig0LCA3MTAsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGd0ZnAuIiwgVlhSKDQsIDcxMCwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZ3RzYiIsICBWWFIoNCwgNzc0LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBndHNiLiIsIFZYUig0LCA3NzQsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGd0c2giLCAgVlhSKDQsIDgzOCwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZ3RzaC4iLCBWWFIoNCwgODM4LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBndHN3IiwgIFZYUig0LCA5MDIsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGd0c3cuIiwgVlhSKDQsIDkwMiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZ3R1YiIsICBWWFIoNCwgNTE4LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBndHViLiIsIFZYUig0LCA1MTgsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGd0dWgiLCAgVlhSKDQsIDU4MiwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y21wZ3R1aC4iLCBWWFIoNCwgNTgyLCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZjbXBndHV3IiwgIFZYUig0LCA2NDYsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoteyAidmNtcGd0dXcuIiwgVlhSKDQsIDY0NiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2Y3RzeHMiLCAgICBWWCg0LCAgOTcwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIsIFVJTU0gfSB9LAoteyAidmN0dXhzIiwgICAgVlgoNCwgIDkwNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKLXsgInZleHB0ZWZwIiwgIFZYKDQsICAzOTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCi17ICJ2bG9nZWZwIiwgICBWWCg0LCAgNDU4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoteyAidm1hZGRmcCIsICAgVlhBKDQsICA0NiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKLXsgInZtYXhmcCIsICAgIFZYKDQsIDEwMzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1heHNiIiwgICAgVlgoNCwgIDI1OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bWF4c2giLCAgICBWWCg0LCAgMzIyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtYXhzdyIsICAgIFZYKDQsICAzODYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1heHViIiwgICAgVlgoNCwgICAgMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bWF4dWgiLCAgICBWWCg0LCAgIDY2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtYXh1dyIsICAgIFZYKDQsICAxMzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1oYWRkc2hzIiwgVlhBKDQsICAzMiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKLXsgInZtaHJhZGRzaHMiLCBWWEEoNCwgMzMpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bWluZnAiLCAgICBWWCg0LCAxMDk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtaW5zYiIsICAgIFZYKDQsICA3NzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1pbnNoIiwgICAgVlgoNCwgIDgzNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bWluc3ciLCAgICBWWCg0LCAgODk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtaW51YiIsICAgIFZYKDQsICA1MTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1pbnVoIiwgICAgVlgoNCwgIDU3OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bWludXciLCAgICBWWCg0LCAgNjQyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtbGFkZHVobSIsIFZYQSg0LCAgMzQpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bXJnaGIiLCAgICBWWCg0LCAgIDEyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtcmdoaCIsICAgIFZYKDQsICAgNzYpLCBWWF9NQVNLLCAgICBQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1yZ2h3IiwgICAgVlgoNCwgIDE0MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bXJnbGIiLCAgICBWWCg0LCAgMjY4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtcmdsaCIsICAgIFZYKDQsICAzMzIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm1yZ2x3IiwgICAgVlgoNCwgIDM5NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bXN1bW1ibSIsICBWWEEoNCwgIDM3KSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgVkMgfSB9LAoteyAidm1zdW1zaG0iLCAgVlhBKDQsICA0MCksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKLXsgInZtc3Vtc2hzIiwgIFZYQSg0LCAgNDEpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bXN1bXVibSIsICBWWEEoNCwgIDM2KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bXN1bXVobSIsICBWWEEoNCwgIDM4KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bXN1bXVocyIsICBWWEEoNCwgIDM5KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCi17ICJ2bXVsZXNiIiwgICBWWCg0LCAgNzc2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtdWxlc2giLCAgIFZYKDQsICA4NDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm11bGV1YiIsICAgVlgoNCwgIDUyMCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bXVsZXVoIiwgICBWWCg0LCAgNTg0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtdWxvc2IiLCAgIFZYKDQsICAyNjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm11bG9zaCIsICAgVlgoNCwgIDMyOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2bXVsb3ViIiwgICBWWCg0LCAgICA4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZtdWxvdWgiLCAgIFZYKDQsICAgNzIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm5tc3ViZnAiLCAgVlhBKDQsICA0NyksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkMsIFZCIH0gfSwKLXsgInZub3IiLCAgICAgIFZYKDQsIDEyODQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidm9yIiwgICAgICAgVlgoNCwgMTE1NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2cGVybSIsICAgICBWWEEoNCwgIDQzKSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgVkMgfSB9LAoteyAidnBrcHgiLCAgICAgVlgoNCwgIDc4MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2cGtzaHNzIiwgICBWWCg0LCAgMzk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZwa3NodXMiLCAgIFZYKDQsICAyNzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnBrc3dzcyIsICAgVlgoNCwgIDQ2MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2cGtzd3VzIiwgICBWWCg0LCAgMzM0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZwa3VodW0iLCAgIFZYKDQsICAgMTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnBrdWh1cyIsICAgVlgoNCwgIDE0MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2cGt1d3VtIiwgICBWWCg0LCAgIDc4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZwa3V3dXMiLCAgIFZYKDQsICAyMDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnJlZnAiLCAgICAgVlgoNCwgIDI2NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKLXsgInZyZmltIiwgICAgIFZYKDQsICA3MTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCi17ICJ2cmZpbiIsICAgICBWWCg0LCAgNTIyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoteyAidnJmaXAiLCAgICAgVlgoNCwgIDY1MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKLXsgInZyZml6IiwgICAgIFZYKDQsICA1ODYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCi17ICJ2cmxiIiwgICAgICBWWCg0LCAgICA0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZybGgiLCAgICAgIFZYKDQsICAgNjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnJsdyIsICAgICAgVlgoNCwgIDEzMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2cnNxcnRlZnAiLCBWWCg0LCAgMzMwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoteyAidnNlbCIsICAgICAgVlhBKDQsICA0MiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKLXsgInZzbCIsICAgICAgIFZYKDQsICA0NTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnNsYiIsICAgICAgVlgoNCwgIDI2MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c2xkb2kiLCAgICBWWEEoNCwgIDQ0KSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgU0hCIH0gfSwKLXsgInZzbGgiLCAgICAgIFZYKDQsICAzMjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnNsbyIsICAgICAgVlgoNCwgMTAzNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c2x3IiwgICAgICBWWCg0LCAgMzM4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzcGx0YiIsICAgIFZYKDQsICA1MjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiwgVUlNTSB9IH0sCi17ICJ2c3BsdGgiLCAgICBWWCg0LCAgNTg4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIsIFVJTU0gfSB9LAoteyAidnNwbHRpc2IiLCAgVlgoNCwgIDc4MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoteyAidnNwbHRpc2giLCAgVlgoNCwgIDg0NCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoteyAidnNwbHRpc3ciLCAgVlgoNCwgIDkwOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoteyAidnNwbHR3IiwgICAgVlgoNCwgIDY1MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKLXsgInZzciIsICAgICAgIFZYKDQsICA3MDgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnNyYWIiLCAgICAgVlgoNCwgIDc3MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3JhaCIsICAgICBWWCg0LCAgODM2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzcmF3IiwgICAgIFZYKDQsICA5MDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnNyYiIsICAgICAgVlgoNCwgIDUxNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3JoIiwgICAgICBWWCg0LCAgNTgwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzcm8iLCAgICAgIFZYKDQsIDExMDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnNydyIsICAgICAgVlgoNCwgIDY0NCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3ViY3V3IiwgICBWWCg0LCAxNDA4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzdWJmcCIsICAgIFZYKDQsICAgNzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnN1YnNicyIsICAgVlgoNCwgMTc5MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3Vic2hzIiwgICBWWCg0LCAxODU2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzdWJzd3MiLCAgIFZYKDQsIDE5MjApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnN1YnVibSIsICAgVlgoNCwgMTAyNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3VidWJzIiwgICBWWCg0LCAxNTM2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzdWJ1aG0iLCAgIFZYKDQsIDEwODgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnN1YnVocyIsICAgVlgoNCwgMTYwMCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3VidXdtIiwgICBWWCg0LCAxMTUyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzdWJ1d3MiLCAgIFZYKDQsIDE2NjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnN1bXN3cyIsICAgVlgoNCwgMTkyOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3VtMnN3cyIsICBWWCg0LCAxNjcyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZzdW00c2JzIiwgIFZYKDQsIDE4MDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoteyAidnN1bTRzaHMiLCAgVlgoNCwgMTYwOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCi17ICJ2c3VtNHVicyIsICBWWCg0LCAxNTQ0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKLXsgInZ1cGtocHgiLCAgIFZYKDQsICA4NDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCi17ICJ2dXBraHNiIiwgICBWWCg0LCAgNTI2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoteyAidnVwa2hzaCIsICAgVlgoNCwgIDU5MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKLXsgInZ1cGtscHgiLCAgIFZYKDQsICA5NzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCi17ICJ2dXBrbHNiIiwgICBWWCg0LCAgNjU0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoteyAidnVwa2xzaCIsICAgVlgoNCwgIDcxOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKLXsgInZ4b3IiLCAgICAgIFZYKDQsIDEyMjApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAotCi17ICJtdWxsaSIsICAgT1AoNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJtdWxpIiwgICAgT1AoNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgInN1YmZpYyIsICBPUCg4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgInNmaSIsICAgICBPUCg4KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLQoteyAiZG96aSIsICAgIE9QKDkpLAlPUF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFNJIH0gfSwKLQoteyAiY21wbHdpIiwgIE9QTCgxMCwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgVUkgfSB9LAoteyAiY21wbGRpIiwgIE9QTCgxMCwxKSwgT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBVSSB9IH0sCi17ICJjbXBsaSIsICAgT1AoMTApLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgVUkgfSB9LAoteyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFVJIH0gfSwKLQoteyAiY21wd2kiLCAgIE9QTCgxMSwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgU0kgfSB9LAoteyAiY21wZGkiLCAgIE9QTCgxMSwxKSwJT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBTSSB9IH0sCi17ICJjbXBpIiwgICAgT1AoMTEpLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgU0kgfSB9LAoteyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFNJIH0gfSwKLQoteyAiYWRkaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImFpIiwJICAgICBPUCgxMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzdWJpYyIsICAgT1AoMTIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAiYWRkaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImFpLiIsICAgICBPUCgxMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzdWJpYy4iLCAgT1AoMTMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAibGkiLAkgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJIH0gfSwKLXsgImxpbCIsICAgICBPUCgxNCksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSSB9IH0sCi17ICJhZGRpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAiY2FsIiwgICAgIE9QKDE0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAic3ViaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi17ICJsYSIsCSAgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxpcyIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAibGl1IiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCi17ICJhZGRpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCi17ICJjYXUiLCAgICAgT1AoMTUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCi17ICJzdWJpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKLQoteyAiYmRuei0iLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJETSB9IH0sCi17ICJiZG56KyIsICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRQIH0gfSwKLXsgImJkbnoiLCAgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCi17ICJiZG4iLCAgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoteyAiYmRuemwtIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJETSB9IH0sCi17ICJiZG56bCsiLCAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRQIH0gfSwKLXsgImJkbnpsIiwgICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCi17ICJiZG5sIiwgICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoteyAiYmRuemEtIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJETUEgfSB9LAoteyAiYmRuemErIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEUEEgfSB9LAoteyAiYmRuemEiLCAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEQSB9IH0sCi17ICJiZG5hIiwgICAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkRBIH0gfSwKLXsgImJkbnpsYS0iLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRE1BIH0gfSwKLXsgImJkbnpsYSsiLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRFBBIH0gfSwKLXsgImJkbnpsYSIsICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoteyAiYmRubGEiLCAgIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCi17ICJiZHotIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRNIH0gfSwKLXsgImJkeisiLCAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRFAgfSB9LAoteyAiYmR6IiwgICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKLXsgImJkemwtIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRE0gfSB9LAoteyAiYmR6bCsiLCAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEUCB9IH0sCi17ICJiZHpsIiwgICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkQgfSB9LAoteyAiYmR6YS0iLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJETUEgfSB9LAoteyAiYmR6YSsiLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEUEEgfSB9LAoteyAiYmR6YSIsICAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCi17ICJiZHpsYS0iLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRNQSB9IH0sCi17ICJiZHpsYSsiLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRQQSB9IH0sCi17ICJiZHpsYSIsICAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkRBIH0gfSwKLXsgImJsdC0iLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJibHQiLCAgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGwtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJibHRsIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGEtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsdGErIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsdGEiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJsdGxhLSIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsdGxhKyIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsdGxhIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJndC0iLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3QiLCAgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJndGwtIiwgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3RsIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJndGEtIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGErIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGEiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJndGxhLSIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGxhKyIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGxhIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJlcS0iLCAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmVxKyIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJiZXEiLCAgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWwtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYmVxbCsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJiZXFsIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWEtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWErIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWEiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJlcWxhLSIsICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWxhKyIsICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWxhIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJzby0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJic28iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2wtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvbCsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJic29sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2EtIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJzb2ErIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJzb2EiLCAgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJzb2xhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJzb2xhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJzb2xhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKLXsgImJ1bi0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoteyAiYnVuKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCi17ICJidW4iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkQgfSB9LAoteyAiYnVubC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJidW5sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJ1bmwiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRCB9IH0sCi17ICJidW5hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCi17ICJidW5hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQQSB9IH0sCi17ICJidW5hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJ1bmxhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJ1bmxhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJ1bmxhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmdlLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2UrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJnZSIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYmdlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2VsKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJnZWwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYmdlYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYmdlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5sLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmwrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJubCIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5sbC0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmxsKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJubGwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5sYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5sbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYmxlLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibGUrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJsZSIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYmxlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibGVsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJsZWwiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYmxlYS0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYmxlYSsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmxlYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYmxlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYmxlbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmxlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5nLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmcrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJuZyIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5nbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmdsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJuZ2wiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5nYS0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nYSsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5nbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5lLSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmUrIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJuZSIsICAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5lbC0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibmVsKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJuZWwiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5lYS0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lYSsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lYSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5lbGEtIiwgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lbGErIiwgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lbGEiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5zLSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibnMrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJucyIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5zbC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibnNsKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJuc2wiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkQgfSB9LAoteyAiYm5zYS0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5zYSsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5zYSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm5zbGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5zbGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5zbGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCQl7IENSLCBCREEgfSB9LAoteyAiYm51LSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCi17ICJibnUrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKLXsgImJudSIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibnVsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKLXsgImJudWwrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFAgfSB9LAoteyAiYm51bCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJudWEtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKLXsgImJudWErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKLXsgImJudWEiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm51bGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoteyAiYm51bGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm51bGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJiZG56dC0iLCAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnp0KyIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuenQiLCAgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnp0bC0iLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuenRsKyIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUCB9IH0sCi17ICJiZG56dGwiLCAgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuenRhLSIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoteyAiYmRuenRhKyIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuenRhIiwgIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56dGxhLSIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56dGxhKyIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56dGxhIiwgQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmLSIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuemYrIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUCB9IH0sCi17ICJiZG56ZiIsICAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuemZsLSIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETSB9IH0sCi17ICJiZG56ZmwrIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnpmbCIsICBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56ZmEtIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56ZmErIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56ZmEiLCAgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmbGEtIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnpmbGErIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnpmbGEiLCBCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYnQtIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETSB9IH0sCi17ICJidCsiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKLXsgImJ0IiwJICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYnQiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYnRsLSIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETSB9IH0sCi17ICJidGwrIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKLXsgImJ0bCIsICAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYnRsIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYnRhLSIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoteyAiYnRhKyIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoteyAiYnRhIiwgICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRhIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJ0bGEtIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJ0bGErIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJ0bGEiLCAgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJ0bGEiLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZi0iLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKLXsgImJmKyIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoteyAiYmYiLAkgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZiIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmwtIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKLXsgImJmbCsiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoteyAiYmZsIiwgICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZmwiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmEtIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCi17ICJiZmErIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQQSB9IH0sCi17ICJiZmEiLCAgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJiZmEiLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmZsYS0iLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoteyAiYmZsYSsiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoteyAiYmZsYSIsICAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYmZsYSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkenQtIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETSB9IH0sCi17ICJiZHp0KyIsICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoteyAiYmR6dCIsICAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6dGwtIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKLXsgImJkenRsKyIsICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUCB9IH0sCi17ICJiZHp0bCIsICAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHp0YS0iLCAgQkJPKDE2LEJPRFpULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkenRhKyIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6dGEiLCAgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkenRsYS0iLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoteyAiYmR6dGxhKyIsIEJCTygxNixCT0RaVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHp0bGEiLCAgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6Zi0iLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKLXsgImJkemYrIiwgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEUCB9IH0sCi17ICJiZHpmIiwgICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHpmbC0iLCAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE0gfSB9LAoteyAiYmR6ZmwrIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKLXsgImJkemZsIiwgICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkemZhLSIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoteyAiYmR6ZmErIiwgIEJCTygxNixCT0RaRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHpmYSIsICAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6ZmxhLSIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHpmbGErIiwgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkemZsYSIsICBCQk8oMTYsQk9EWkYsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYy0iLCAgICAgQigxNiwwLDApLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJETSB9IH0sCi17ICJiYysiLCAgICAgQigxNiwwLDApLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJEUCB9IH0sCi17ICJiYyIsCSAgICAgQigxNiwwLDApLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkQgfSB9LAoteyAiYmNsLSIsICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRE0gfSB9LAoteyAiYmNsKyIsICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRFAgfSB9LAoteyAiYmNsIiwgICAgIEIoMTYsMCwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEIH0gfSwKLXsgImJjYS0iLCAgICBCKDE2LDEsMCksCUJfTUFTSywJCVBQQ0NPTSwJCXsgQk9FLCBCSSwgQkRNQSB9IH0sCi17ICJiY2ErIiwgICAgQigxNiwxLDApLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJEUEEgfSB9LAoteyAiYmNhIiwgICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCi17ICJiY2xhLSIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJETUEgfSB9LAoteyAiYmNsYSsiLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKLXsgImJjbGEiLCAgICBCKDE2LDEsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAotCi17ICJzYyIsICAgICAgU0MoMTcsMSwwKSwgMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLXsgInN2YyIsICAgICBTQygxNywwLDApLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNsIiwgICAgU0MoMTcsMCwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IExFViwgRkwxLCBGTDIgfSB9LAoteyAic3ZjYSIsICAgIFNDKDE3LDEsMCksIFNDX01BU0ssCVBXUkNPTSwJCXsgU1YgfSB9LAoteyAic3ZjbGEiLCAgIFNDKDE3LDEsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBTViB9IH0sCi0KLXsgImIiLAkgICAgIEIoMTgsMCwwKSwJQl9NQVNLLAkJQ09NLAl7IExJIH0gfSwKLXsgImJsIiwgICAgICBCKDE4LDAsMSksCUJfTUFTSywJCUNPTSwJeyBMSSB9IH0sCi17ICJiYSIsICAgICAgQigxOCwxLDApLAlCX01BU0ssCQlDT00sCXsgTElBIH0gfSwKLXsgImJsYSIsICAgICBCKDE4LDEsMSksCUJfTUFTSywJCUNPTSwJeyBMSUEgfSB9LAotCi17ICJtY3JmIiwgICAgWEwoMTksMCksCVhMQkJfTUFTS3woMzw8MjEpfCgzPDwxNiksIENPTSwJeyBCRiwgQkZBIH0gfSwKLQoteyAiYmxyIiwgICAgIFhMTygxOSxCT1UsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJyIiwgICAgICBYTE8oMTksQk9VLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQV1JDT00sCXsgMCB9IH0sCi17ICJibHJsIiwgICAgWExPKDE5LEJPVSwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYnJsIiwgICAgIFhMTygxOSxCT1UsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBXUkNPTSwJeyAwIH0gfSwKLXsgImJkbnpsciIsICBYTE8oMTksQk9ETlosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpsci0iLCBYTE8oMTksQk9ETlosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpscisiLCBYTE8oMTksQk9ETlpQLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZG56bHJsIiwgWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZG56bHJsLSIsWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZG56bHJsKyIsWExPKDE5LEJPRE5aUCwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmR6bHIiLCAgIFhMTygxOSxCT0RaLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpsci0iLCAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxyKyIsICBYTE8oMTksQk9EWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxybCIsICBYTE8oMTksQk9EWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmR6bHJsLSIsIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpscmwrIiwgWExPKDE5LEJPRFpQLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJibHRsciIsICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRsci0iLCAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRscisiLCAgWExPQ0IoMTksQk9UUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmx0ciIsICAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHJsIiwgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHJsLSIsIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmx0bHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsdHJsIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJndGxyIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxyLSIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxyKyIsICBYTE9DQigxOSxCT1RQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ3RyIiwgICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZ3RscmwiLCAgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ3RscmwtIiwgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ3RscmwrIiwgWExPQ0IoMTksQk9UUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmd0cmwiLCAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHIiLCAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHItIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJlcXIiLCAgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJlcWxybCIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJlcWxybC0iLCBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJlcWxybCsiLCBYTE9DQigxOSxCT1RQLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZXFybCIsICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJic29sciIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29sci0iLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnNvciIsICAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHJsIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHJsLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnNvbHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJzb3JsIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxyKyIsICBYTE9DQigxOSxCT1RQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidW5scmwiLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidW5scmwtIiwgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidW5scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHIiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHItIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJnZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJnZWxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJnZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJnZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ2VybCIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmxsciIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxsci0iLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5sciIsICAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHJsIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHJsLSIsIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5sbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJubHJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibGVyIiwgICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibGVscmwiLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibGVscmwtIiwgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibGVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmxlcmwiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHIiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHItIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZ3IiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZ2xybCsiLCBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmdybCIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmVsciIsICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVsci0iLCAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVscisiLCAgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5lciIsICAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHJsIiwgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHJsLSIsIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5lbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuc2xyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xyKyIsICBYTE9DQigxOSxCT0ZQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnNyIiwgICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnNscmwiLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnNscmwtIiwgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnNscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5zcmwiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm51bHIiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHItIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJudWxybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJudWxybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJudWxybCsiLCBYTE9DQigxOSxCT0ZQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJidGxyIiwgICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxyLSIsICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxyKyIsICAgWExPKDE5LEJPVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmJ0ciIsICAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYnRscmwiLCAgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRscmwtIiwgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRscmwrIiwgIFhMTygxOSxCT1RQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJidHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJmbHIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHItIiwgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHIrIiwgICBYTE8oMTksQk9GUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiYmZyIiwgICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZmxybCIsICAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmxybC0iLCAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmxybCsiLCAgWExPKDE5LEJPRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmJmcmwiLCAgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmRuenRsciIsIFhMTygxOSxCT0ROWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRsci0iLFhMTygxOSxCT0ROWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRscisiLFhMTygxOSxCT0ROWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsLSIsWExPKDE5LEJPRE5aVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxybCsiLFhMTygxOSxCT0ROWlRQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLHsgQkkgfSB9LAoteyAiYmRuemZsciIsIFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZsci0iLFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZscisiLFhMTygxOSxCT0ROWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsLSIsWExPKDE5LEJPRE5aRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56ZmxybCsiLFhMTygxOSxCT0ROWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLHsgQkkgfSB9LAoteyAiYmR6dGxyIiwgIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHp0bHItIiwgWExPKDE5LEJPRFpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRscisiLCBYTE8oMTksQk9EWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRscmwiLCBYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6dGxybC0iLFhMTygxOSxCT0RaVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHp0bHJsKyIsWExPKDE5LEJPRFpUUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHIiLCAgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkemZsci0iLCBYTE8oMTksQk9EWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxyKyIsIFhMTygxOSxCT0RaRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxybCIsIFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHJsLSIsWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkemZscmwrIixYTE8oMTksQk9EWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTFlCQl9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSB9IH0sCi17ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscisiLCAgIFhMWUxLKDE5LDE2LDEsMCksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHJsKyIsICBYTFlMSygxOSwxNiwxLDEpLCBYTFlCQl9NQVNLLCBQUENDT00sCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNscmwtIiwgIFhMWUxLKDE5LDE2LDAsMSksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKLXsgImJjciIsICAgICBYTExLKDE5LDE2LDApLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjcmwiLCAgICBYTExLKDE5LDE2LDEpLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKLQoteyAiY3Jub3QiLCAgIFhMKDE5LDMzKSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkEsIEJCQSB9IH0sCi17ICJjcm5vciIsICAgWEwoMTksMzMpLAlYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJyZmkiLCAgICAgWEwoMTksNTApLAkweGZmZmZmZmZmLAlDT00sCQl7IDAgfSB9LAoteyAicmZjaSIsICAgIFhMKDE5LDUxKSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAicmZzdmMiLCAgIFhMKDE5LDgyKSwJMHhmZmZmZmZmZiwJUE9XRVIsCQl7IDAgfSB9LAotCi17ICJjcmFuZGMiLCAgWEwoMTksMTI5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiaXN5bmMiLCAgIFhMKDE5LDE1MCksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJpY3MiLCAgICAgWEwoMTksMTUwKSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKLQoteyAiY3JjbHIiLCAgIFhMKDE5LDE5MyksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKLXsgImNyeG9yIiwgICBYTCgxOSwxOTMpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm5hbmQiLCAgWEwoMTksMjI1KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JhbmQiLCAgIFhMKDE5LDI1NyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNyc2V0IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCi17ICJjcmVxdiIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JvcmMiLCAgIFhMKDE5LDQxNyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNybW92ZSIsICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKLXsgImNyb3IiLCAgICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJiY3RyIiwgICAgWExPKDE5LEJPVSw1MjgsMCksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKLXsgImJjdHJsIiwgICBYTE8oMTksQk9VLDUyOCwxKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoteyAiYmx0Y3RyIiwgIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibHRjdHItIiwgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0cisiLCBYTE9DQigxOSxCT1RQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmx0Y3RybCIsIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibHRjdHJsLSIsWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0cmwrIixYTE9DQigxOSxCT1RQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmd0Y3RyIiwgIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ3RjdHItIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0cisiLCBYTE9DQigxOSxCT1RQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmd0Y3RybCIsIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ3RjdHJsLSIsWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0cmwrIixYTE9DQigxOSxCT1RQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmVxY3RyIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZXFjdHItIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0cisiLCBYTE9DQigxOSxCT1RQLENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmVxY3RybCIsIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZXFjdHJsLSIsWExPQ0IoMTksQk9ULENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0cmwrIixYTE9DQigxOSxCT1RQLENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnNvY3RyIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJic29jdHItIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0cisiLCBYTE9DQigxOSxCT1RQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnNvY3RybCIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJic29jdHJsLSIsWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0cmwrIixYTE9DQigxOSxCT1RQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnVuY3RyIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJidW5jdHItIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0cisiLCBYTE9DQigxOSxCT1RQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnVuY3RybCIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJidW5jdHJsLSIsWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwrIixYTE9DQigxOSxCT1RQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmdlY3RyIiwgIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ2VjdHItIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmdlY3RybCIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJiZ2VjdHJsLSIsWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5sY3RyIiwgIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmxjdHItIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0cisiLCBYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5sY3RybCIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmxjdHJsLSIsWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0cmwrIixYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmxlY3RyIiwgIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibGVjdHItIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYmxlY3RybCIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibGVjdHJsLSIsWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5nY3RyIiwgIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmdjdHItIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0cisiLCBYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5nY3RybCIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmdjdHJsLSIsWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwrIixYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5lY3RyIiwgIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmVjdHItIiwgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5lY3RybCIsIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibmVjdHJsLSIsWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5zY3RyIiwgIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnNjdHItIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0cisiLCBYTE9DQigxOSxCT0ZQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm5zY3RybCIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnNjdHJsLSIsWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0cmwrIixYTE9DQigxOSxCT0ZQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm51Y3RyIiwgIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnVjdHItIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0cisiLCBYTE9DQigxOSxCT0ZQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYm51Y3RybCIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCi17ICJibnVjdHJsLSIsWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0cmwrIixYTE9DQigxOSxCT0ZQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoteyAiYnRjdHIiLCAgIFhMTygxOSxCT1QsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGN0ci0iLCAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RyKyIsICBYTE8oMTksQk9UUCw1MjgsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYnRjdHJsIiwgIFhMTygxOSxCT1QsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGN0cmwtIiwgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RybCsiLCBYTE8oMTksQk9UUCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZjdHIiLCAgIFhMTygxOSxCT0YsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmN0ci0iLCAgWExPKDE5LEJPRiw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RyKyIsICBYTE8oMTksQk9GUCw1MjgsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZjdHJsIiwgIFhMTygxOSxCT0YsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZmN0cmwtIiwgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RybCsiLCBYTE8oMTksQk9GUCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmNjdHIiLCAgIFhMTEsoMTksNTI4LDApLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjdHItIiwgIFhMWUxLKDE5LDUyOCwwLDApLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RyKyIsICBYTFlMSygxOSw1MjgsMSwwKSwgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwiLCAgWExMSygxOSw1MjgsMSksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2N0cmwtIiwgWExZTEsoMTksNTI4LDAsMSksICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHJsKyIsIFhMWUxLKDE5LDUyOCwxLDEpLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKLXsgImJjYyIsICAgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY2wiLCAgICBYTExLKDE5LDUyOCwxKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKLQoteyAicmx3aW1pIiwgIE0oMjAsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW1pIiwgICBNKDIwLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJsd2ltaS4iLCBNKDIwLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGltaS4iLCAgTSgyMCwxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAotCi17ICJyb3Rsd2kiLCAgTU1FKDIxLDMxLDApLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAiY2xybHdpIiwgIE1NRSgyMSwzMSwwKSwgTVNITUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIE1CIH0gfSwKLXsgInJsd2lubSIsICBNKDIxLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJybGlubSIsICAgTSgyMSwwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicm90bHdpLiIsIE1NRSgyMSwzMSwxKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSxSUyxTSCB9IH0sCi17ICJjbHJsd2kuIiwgTU1FKDIxLDMxLDEpLCBNU0hNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgTUIgfSB9LAoteyAicmx3aW5tLiIsIE0oMjEsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW5tLiIsICBNKDIxLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJsbWkiLCAgICBNKDIyLDApLAlNX01BU0ssCQlNNjAxLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxtaS4iLCAgIE0oMjIsMSksCU1fTUFTSywJCU02MDEsCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi0KLXsgInJvdGx3IiwgICBNTUUoMjMsMzEsMCksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybHdubSIsICAgTSgyMywwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxubSIsICAgIE0oMjMsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLXsgInJvdGx3LiIsICBNTUUoMjMsMzEsMSksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybHdubS4iLCAgTSgyMywxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicmxubS4iLCAgIE0oMjMsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLQoteyAibm9wIiwgICAgIE9QKDI0KSwJMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgIm9yaSIsICAgICBPUCgyNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJvcmlsIiwgICAgT1AoMjQpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJvcmlzIiwgICAgT1AoMjUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAib3JpdSIsICAgIE9QKDI1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAieG9yaSIsICAgIE9QKDI2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgInhvcmlsIiwgICBPUCgyNiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgInhvcmlzIiwgICBPUCgyNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJ4b3JpdSIsICAgT1AoMjcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJhbmRpLiIsICAgT1AoMjgpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAiYW5kaWwuIiwgIE9QKDI4KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAiYW5kaXMuIiwgIE9QKDI5KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgImFuZGl1LiIsICBPUCgyOSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgInJvdGxkaSIsICBNRCgzMCwwLDApLCBNRE1CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJjbHJsZGkiLCAgTUQoMzAsMCwwKSwgTURTSF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBNQjYgfSB9LAoteyAicmxkaWNsIiwgIE1EKDMwLDAsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJvdGxkaS4iLCBNRCgzMCwwLDEpLCBNRE1CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJjbHJsZGkuIiwgTUQoMzAsMCwxKSwgTURTSF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBNQjYgfSB9LAoteyAicmxkaWNsLiIsIE1EKDMwLDAsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLQoteyAicmxkaWNyIiwgIE1EKDMwLDEsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUU2IH0gfSwKLXsgInJsZGljci4iLCBNRCgzMCwxLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1FNiB9IH0sCi0KLXsgInJsZGljIiwgICBNRCgzMCwyLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJybGRpYy4iLCAgTUQoMzAsMiwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJybGRpbWkiLCAgTUQoMzAsMywwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicmxkaW1pLiIsIE1EKDMwLDMsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLQoteyAicm90bGQiLCAgIE1EUygzMCw4LDApLCBNRFNNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybGRjbCIsICAgTURTKDMwLDgsMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUI2IH0gfSwKLXsgInJvdGxkLiIsICBNRFMoMzAsOCwxKSwgTURTTUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAicmxkY2wuIiwgIE1EUygzMCw4LDEpLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1CNiB9IH0sCi0KLXsgInJsZGNyIiwgICBNRFMoMzAsOSwwKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAoteyAicmxkY3IuIiwgIE1EUygzMCw5LDEpLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCi0KLXsgImNtcHciLCAgICBYQ01QTCgzMSwwLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCQl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGQiLCAgICBYQ01QTCgzMSwwLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFJCIH0gfSwKLXsgImNtcCIsICAgICBYKDMxLDApLAlYQ01QTF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgUkIgfSB9LAotCi17ICJ0d2xndCIsICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxndCIsICAgIFhUTygzMSw0LFRPTEdUKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGx0IiwgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGx0IiwgICAgWFRPKDMxLDQsVE9MTFQpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdlcSIsICAgIFhUTygzMSw0LFRPRVEpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGVxIiwgICAgIFhUTygzMSw0LFRPRVEpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsZ2UiLCAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZ2UiLCAgICBYVE8oMzEsNCxUT0xHRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xubCIsICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxubCIsICAgIFhUTygzMSw0LFRPTE5MKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGxlIiwgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGxlIiwgICAgWFRPKDMxLDQsVE9MTEUpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbmciLCAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbmciLCAgICBYVE8oMzEsNCxUT0xORyksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2d0IiwgICAgWFRPKDMxLDQsVE9HVCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0Z3QiLCAgICAgWFRPKDMxLDQsVE9HVCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2dlIiwgICAgWFRPKDMxLDQsVE9HRSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0Z2UiLCAgICAgWFRPKDMxLDQsVE9HRSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25sIiwgICAgWFRPKDMxLDQsVE9OTCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmwiLCAgICAgWFRPKDMxLDQsVE9OTCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2x0IiwgICAgWFRPKDMxLDQsVE9MVCksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bHQiLCAgICAgWFRPKDMxLDQsVE9MVCksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xlIiwgICAgWFRPKDMxLDQsVE9MRSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGUiLCAgICAgWFRPKDMxLDQsVE9MRSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25nIiwgICAgWFRPKDMxLDQsVE9ORyksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmciLCAgICAgWFRPKDMxLDQsVE9ORyksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d25lIiwgICAgWFRPKDMxLDQsVE9ORSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bmUiLCAgICAgWFRPKDMxLDQsVE9ORSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0cmFwIiwgICAgWFRPKDMxLDQsVE9VKSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgInR3IiwgICAgICBYKDMxLDQpLAlYX01BU0ssCQlQUENDT00sCQl7IFRPLCBSQSwgUkIgfSB9LAoteyAidCIsICAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBXUkNPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCi0KLXsgInN1YmZjIiwgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZiIsICAgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViYyIsICAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjLiIsICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZi4iLCAgICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViYy4iLCAgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjbyIsICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZm8iLCAgICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViY28iLCAgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZjby4iLCBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZm8uIiwgICAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViY28uIiwgIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLQoteyAibXVsaGR1IiwgIFhPKDMxLDksMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaGR1LiIsIFhPKDMxLDksMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGRjIiwgICAgWE8oMzEsMTAsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImEiLCAgICAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkYy4iLCAgIFhPKDMxLDEwLDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhLiIsICAgICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGNvIiwgICBYTygzMSwxMCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYW8iLCAgICAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjby4iLCAgWE8oMzEsMTAsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFvLiIsICAgICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdWxod3UiLCAgWE8oMzEsMTEsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGh3dS4iLCBYTygzMSwxMSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZmNyIiwgICAgWCgzMSwxOSksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAotCi17ICJsd2FyeCIsICAgWCgzMSwyMCksCVhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxkeCIsICAgICBYKDMxLDIxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsd3p4IiwgICAgWCgzMSwyMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJseCIsICAgICAgWCgzMSwyMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNsdyIsICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsIiwgICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsdy4iLCAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsLiIsICAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiY250bHp3IiwgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6IiwgICBYUkMoMzEsMjYsMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsencuIiwgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHouIiwgIFhSQygzMSwyNiwxKSwgWFJCX01BU0ssIAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi0KLXsgInNsZCIsICAgICBYUkMoMzEsMjcsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xkLiIsICAgIFhSQygzMSwyNywxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImFuZCIsICAgICBYUkMoMzEsMjgsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImFuZC4iLCAgICBYUkMoMzEsMjgsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibWFza2ciLCAgIFhSQygzMSwyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1hc2tnLiIsICBYUkMoMzEsMjksMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImNtcGx3IiwgICBYQ01QTCgzMSwzMiwwKSwgWENNUExfTUFTSywgUFBDQ09NLAl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGxkIiwgICBYQ01QTCgzMSwzMiwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKLXsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUF9NQVNLLAkgUFBDT05MWSwJeyBCRiwgTCwgUkEsIFJCIH0gfSwKLXsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUExfTUFTSywJIFBXUkNPTSwJeyBCRiwgUkEsIFJCIH0gfSwKLQoteyAic3ViZiIsICAgIFhPKDMxLDQwLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWIiLCAgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmYuIiwgICBYTygzMSw0MCwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViLiIsICAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmbyIsICAgWE8oMzEsNDAsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Ym8iLCAgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZm8uIiwgIFhPKDMxLDQwLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJvLiIsICAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLQoteyAibGR1eCIsICAgIFgoMzEsNTMpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJkY2JzdCIsICAgWCgzMSw1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImx3enV4IiwgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi17ICJsdXgiLCAgICAgWCgzMSw1NSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImNudGx6ZCIsICBYUkMoMzEsNTgsMCksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6ZC4iLCBYUkMoMzEsNTgsMSksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKLQoteyAiYW5kYyIsICAgIFhSQygzMSw2MCwwKSwgWF9NQVNLLAlDT00sCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJhbmRjLiIsICAgWFJDKDMxLDYwLDEpLCBYX01BU0ssCUNPTSwJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAidGRsZ3QiLCAgIFhUTygzMSw2OCxUT0xHVCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGx0IiwgICBYVE8oMzEsNjgsVE9MTFQpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGVxIiwgICAgWFRPKDMxLDY4LFRPRVEpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsZ2UiLCAgIFhUTygzMSw2OCxUT0xHRSksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbG5sIiwgICBYVE8oMzEsNjgsVE9MTkwpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxsZSIsICAgWFRPKDMxLDY4LFRPTExFKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbmciLCAgIFhUTygzMSw2OCxUT0xORyksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZ3QiLCAgICBYVE8oMzEsNjgsVE9HVCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGdlIiwgICAgWFRPKDMxLDY4LFRPR0UpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRubCIsICAgIFhUTygzMSw2OCxUT05MKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbHQiLCAgICBYVE8oMzEsNjgsVE9MVCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxlIiwgICAgWFRPKDMxLDY4LFRPTEUpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRuZyIsICAgIFhUTygzMSw2OCxUT05HKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbmUiLCAgICBYVE8oMzEsNjgsVE9ORSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZCIsCSAgICAgWCgzMSw2OCksCVhfTUFTSywJCSBQUEM2NCwJCXsgVE8sIFJBLCBSQiB9IH0sCi0KLXsgIm11bGhkIiwgICBYTygzMSw3MywwLDApLCBYT19NQVNLLAkgUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaGQuIiwgIFhPKDMxLDczLDAsMSksIFhPX01BU0ssCSBQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm11bGh3IiwgICBYTygzMSw3NSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaHcuIiwgIFhPKDMxLDc1LDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mbXNyIiwgICBYKDMxLDgzKSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCi0KLXsgImxkYXJ4IiwgICBYKDMxLDg0KSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2JmIiwgICAgWCgzMSw4NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImxiengiLCAgICBYKDMxLDg3KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibmVnIiwgICAgIFhPKDMxLDEwNCwwLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZy4iLCAgICBYTygzMSwxMDQsMCwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWdvIiwgICAgWE8oMzEsMTA0LDEsMCksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnby4iLCAgIFhPKDMxLDEwNCwxLDEpLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXVsIiwgICAgIFhPKDMxLDEwNywwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bC4iLCAgICBYTygzMSwxMDcsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxvIiwgICAgWE8oMzEsMTA3LDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsby4iLCAgIFhPKDMxLDEwNywxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiY2xmIiwgICAgIFgoMzEsMTE4KSwgWFJCX01BU0ssCVBPV0VSLAkJeyBSVCwgUkEgfSB9LAotCi17ICJsYnp1eCIsICAgWCgzMSwxMTkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAibm90IiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJub3IiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibm90LiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJub3IuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ3cnRlZSIsICAgWCgzMSwxMzEpLAlYUkFSQl9NQVNLLAlQUEM0MDMsCQl7IFJTIH0gfSwKLQoteyAic3ViZmUiLCAgIFhPKDMxLDEzNiwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlIiwgICAgIFhPKDMxLDEzNiwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmUuIiwgIFhPKDMxLDEzNiwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlLiIsICAgIFhPKDMxLDEzNiwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmVvIiwgIFhPKDMxLDEzNiwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2ZlbyIsICAgIFhPKDMxLDEzNiwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3ViZmVvLiIsIFhPKDMxLDEzNiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic2Zlby4iLCAgIFhPKDMxLDEzNiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGRlIiwgICAgWE8oMzEsMTM4LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZSIsICAgICAgWE8oMzEsMTM4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlLiIsICAgWE8oMzEsMTM4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZS4iLCAgICAgWE8oMzEsMTM4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlbyIsICAgWE8oMzEsMTM4LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZW8iLCAgICAgWE8oMzEsMTM4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRlby4iLCAgWE8oMzEsMTM4LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZW8uIiwgICAgWE8oMzEsMTM4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10Y3IiLCAgICBYRlhNKDMxLDE0NCwweGZmKSwgWEZYRlhNX01BU0t8RlhNX01BU0ssIENPTSwJeyBSUyB9fSwKLXsgIm10Y3JmIiwgICBYKDMxLDE0NCksCVhGWEZYTV9NQVNLLAlDT00sCQl7IEZYTSwgUlMgfSB9LAotCi17ICJtdG1zciIsICAgWCgzMSwxNDYpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJTIH0gfSwKLQoteyAic3RkeCIsICAgIFgoMzEsMTQ5KSwgWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHdjeC4iLCAgWFJDKDMxLDE1MCwxKSwgWF9NQVNLLAlQUEMsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHd4IiwgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3R4IiwgICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic2xxIiwgICAgIFhSQygzMSwxNTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbHEuIiwgICAgWFJDKDMxLDE1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic2xlIiwgICAgIFhSQygzMSwxNTMsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGUuIiwgICAgWFJDKDMxLDE1MywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAid3J0ZWVpIiwgIFgoMzEsMTYzKSwJWEVfTUFTSywJUFBDNDAzLAkJeyBFIH0gfSwKLQoteyAic3RkdXgiLCAgIFgoMzEsMTgxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAic3R3dXgiLCAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi17ICJzdHV4IiwgICAgWCgzMSwxODMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbGlxIiwgICAgWFJDKDMxLDE4NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNsaXEuIiwgICBYUkMoMzEsMTg0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJzdWJmemUiLCAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZSIsICAgIFhPKDMxLDIwMCwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZS4iLCBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplLiIsICAgWE8oMzEsMjAwLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplbyIsIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemVvIiwgICBYTygzMSwyMDAsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemVvLiIsWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZW8uIiwgIFhPKDMxLDIwMCwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAiYWRkemUiLCAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZSIsICAgICBYTygzMSwyMDIsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZS4iLCAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplLiIsICAgIFhPKDMxLDIwMiwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplbyIsICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemVvIiwgICAgWE8oMzEsMjAyLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemVvLiIsIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZW8uIiwgICBYTygzMSwyMDIsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm10c3IiLCAgICBYKDMxLDIxMCksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFNSLCBSUyB9IH0sCi0KLXsgInN0ZGN4LiIsICBYUkMoMzEsMjE0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3RieCIsICAgIFgoMzEsMjE1KSwJWF9NQVNLLAkJQ09NLAl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbGxxIiwgICAgWFJDKDMxLDIxNiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsbHEuIiwgICBYUkMoMzEsMjE2LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzbGVxIiwgICAgWFJDKDMxLDIxNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZXEuIiwgICBYUkMoMzEsMjE3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdWJmbWUiLCAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZSIsICAgIFhPKDMxLDIzMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZS4iLCBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lLiIsICAgWE8oMzEsMjMyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lbyIsIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWVvIiwgICBYTygzMSwyMzIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWVvLiIsWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZW8uIiwgIFhPKDMxLDIzMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXVsbGQiLCAgIFhPKDMxLDIzMywwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZC4iLCAgWE8oMzEsMjMzLDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkbyIsICBYTygzMSwyMzMsMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGRvLiIsIFhPKDMxLDIzMywxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZG1lIiwgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWUiLCAgICAgWE8oMzEsMjM0LDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWUuIiwgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZS4iLCAgICBYTygzMSwyMzQsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZW8iLCAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lbyIsICAgIFhPKDMxLDIzNCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lby4iLCBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWVvLiIsICAgWE8oMzEsMjM0LDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWxsdyIsICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzIiwgICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsdy4iLCAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzLiIsICAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsd28iLCAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzbyIsICAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsd28uIiwgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxzby4iLCAgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10c3JpbiIsICBYKDMxLDI0MiksCVhSQV9NQVNLLAlQUEMzMiwJCXsgUlMsIFJCIH0gfSwKLXsgIm10c3JpIiwgICBYKDMxLDI0MiksCVhSQV9NQVNLLAlQT1dFUjMyLAl7IFJTLCBSQiB9IH0sCi0KLXsgImRjYnRzdCIsICBYKDMxLDI0NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInN0YnV4IiwgICBYKDMxLDI0NyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJzbGxpcSIsICAgWFJDKDMxLDI0OCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNsbGlxLiIsICBYUkMoMzEsMjQ4LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJkb3oiLCAgICAgWE8oMzEsMjY0LDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96LiIsICAgIFhPKDMxLDI2NCwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvem8iLCAgICBYTygzMSwyNjQsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3pvLiIsICAgWE8oMzEsMjY0LDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJhZGQiLCAgICAgWE8oMzEsMjY2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXgiLCAgICAgWE8oMzEsMjY2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGQuIiwgICAgWE8oMzEsMjY2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXguIiwgICAgWE8oMzEsMjY2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRvIiwgICAgWE8oMzEsMjY2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXhvIiwgICAgWE8oMzEsMjY2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJjYXhvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxzY2J4IiwgICBYUkMoMzEsMjc3LDApLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibHNjYnguIiwgIFhSQygzMSwyNzcsMSksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjYnQiLCAgICBYKDMxLDI3OCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImxoengiLCAgICBYKDMxLDI3OSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImljYnQiLCAgICBYKDMxLDI2MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImVxdiIsICAgICBYUkMoMzEsMjg0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJlcXYuIiwgICAgWFJDKDMxLDI4NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0bGJpZSIsICAgWCgzMSwzMDYpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLXsgInRsYmkiLCAgICBYKDMxLDMwNiksCVhSVF9NQVNLLAlQT1dFUiwJCXsgUkEsIFJCIH0gfSwKLQoteyAiZWNpd3giLCAgIFgoMzEsMzEwKSwgWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGh6dXgiLCAgIFgoMzEsMzExKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgInhvciIsICAgICBYUkMoMzEsMzE2LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJ4b3IuIiwgICAgWFJDKDMxLDMxNiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtZmV4aXNyIiwgWFNQUigzMSwzMjMsNjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmV4aWVyIiwgWFNQUigzMSwzMjMsNjYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMCIsICAgWFNQUigzMSwzMjMsMTI4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjEiLCAgIFhTUFIoMzEsMzIzLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIyIiwgICBYU1BSKDMxLDMyMywxMzApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMyIsICAgWFNQUigzMSwzMjMsMTMxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjQiLCAgIFhTUFIoMzEsMzIzLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI1IiwgICBYU1BSKDMxLDMyMywxMzMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNiIsICAgWFNQUigzMSwzMjMsMTM0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjciLCAgIFhTUFIoMzEsMzIzLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYmVhciIsICBYU1BSKDMxLDMyMywxNDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJlc3IiLCAgWFNQUigzMSwzMjMsMTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpb2NyIiwgIFhTUFIoMzEsMzIzLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IwIiwgWFNQUigzMSwzMjMsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDAiLCBYU1BSKDMxLDMyMywxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMCIsIFhTUFIoMzEsMzIzLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2EwIiwgWFNQUigzMSwzMjMsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzAiLCBYU1BSKDMxLDMyMywxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMSIsIFhTUFIoMzEsMzIzLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QxIiwgWFNQUigzMSwzMjMsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTEiLCBYU1BSKDMxLDMyMywyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMSIsIFhTUFIoMzEsMzIzLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MxIiwgWFNQUigzMSwzMjMsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjIiLCBYU1BSKDMxLDMyMywyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MiIsIFhTUFIoMzEsMzIzLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEyIiwgWFNQUigzMSwzMjMsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTIiLCBYU1BSKDMxLDMyMywyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMiIsIFhTUFIoMzEsMzIzLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IzIiwgWFNQUigzMSwzMjMsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDMiLCBYU1BSKDMxLDMyMywyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMyIsIFhTUFIoMzEsMzIzLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2EzIiwgWFNQUigzMSwzMjMsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzMiLCBYU1BSKDMxLDMyMywyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNyIiwgWFNQUigzMSwzMjMsMjI0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkY3IiLCAgIFgoMzEsMzIzKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgU1BSIH0gfSwKLQoteyAiZGl2IiwgICAgIFhPKDMxLDMzMSwwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdi4iLCAgICBYTygzMSwzMzEsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZvIiwgICAgWE8oMzEsMzMxLDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2by4iLCAgIFhPKDMxLDMzMSwxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZtcSIsICAgICBYU1BSKDMxLDMzOSwwKSwgICBYU1BSX01BU0ssIE02MDEsCXsgUlQgfSB9LAoteyAibWZ4ZXIiLCAgICBYU1BSKDMxLDMzOSwxKSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZydGN1IiwgICBYU1BSKDMxLDMzOSw0KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZydGNsIiwgICBYU1BSKDMxLDMzOSw1KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkZWMiLCAgICBYU1BSKDMxLDMzOSw2KSwgICBYU1BSX01BU0ssIE1GREVDMSwJeyBSVCB9IH0sCi17ICJtZmxyIiwgICAgIFhTUFIoMzEsMzM5LDgpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmN0ciIsICAgIFhTUFIoMzEsMzM5LDkpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnRpZCIsICAgIFhTUFIoMzEsMzM5LDE3KSwgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlQgfSB9LAoteyAibWZkc2lzciIsICBYU1BSKDMxLDMzOSwxOCksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkYXIiLCAgICBYU1BSKDMxLDMzOSwxOSksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZkZWMiLCAgICBYU1BSKDMxLDMzOSwyMiksICBYU1BSX01BU0ssIE1GREVDMiwJeyBSVCB9IH0sCi17ICJtZnNkcjAiLCAgIFhTUFIoMzEsMzM5LDI0KSwgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlQgfSB9LAoteyAibWZzZHIxIiwgICBYU1BSKDMxLDMzOSwyNSksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZzcnIwIiwgICBYU1BSKDMxLDMzOSwyNiksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZzcnIxIiwgICBYU1BSKDMxLDMzOSwyNyksICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoteyAibWZjbXBhIiwgICBYU1BSKDMxLDMzOSwxNDQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGIiLCAgIFhTUFIoMzEsMzM5LDE0NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wYyIsICAgWFNQUigzMSwzMzksMTQ2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBkIiwgICBYU1BSKDMxLDMzOSwxNDcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljciIsICAgIFhTUFIoMzEsMzM5LDE0OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGVyIiwgICAgWFNQUigzMSwzMzksMTQ5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjb3VudGEiLCBYU1BSKDMxLDMzOSwxNTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNvdW50YiIsIFhTUFIoMzEsMzM5LDE1MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZSIsICAgWFNQUigzMSwzMzksMTUyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBmIiwgICBYU1BSKDMxLDMzOSwxNTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGciLCAgIFhTUFIoMzEsMzM5LDE1NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21waCIsICAgWFNQUigzMSwzMzksMTU1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZsY3RybDEiLCBYU1BSKDMxLDMzOSwxNTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmxjdHJsMiIsIFhTUFIoMzEsMzM5LDE1NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWN0cmwiLCAgWFNQUigzMSwzMzksMTU4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZiYXIiLCAgICBYU1BSKDMxLDMzOSwxNTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZnNwcmciLCAgIFhTUFIoMzEsMzM5LDI3MiksIFhTUFJHX01BU0ssIFBQQywJeyBSVCwgU1BSRyB9IH0sCi17ICJtZnNwcmcwIiwgIFhTUFIoMzEsMzM5LDI3MiksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmcxIiwgIFhTUFIoMzEsMzM5LDI3MyksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmcyIiwgIFhTUFIoMzEsMzM5LDI3NCksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnNwcmczIiwgIFhTUFIoMzEsMzM5LDI3NSksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZmFzciIsICAgIFhTUFIoMzEsMzM5LDI4MCksIFhTUFJfTUFTSywgUFBDNjQsCXsgUlQgfSB9LAoteyAibWZlYXIiLCAgICBYU1BSKDMxLDMzOSwyODIpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZwdnIiLCAgICBYU1BSKDMxLDMzOSwyODcpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoteyAibWZpYmF0dSIsICBYU1BSKDMxLDMzOSw1MjgpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1maWJhdGwiLCAgWFNQUigzMSwzMzksNTI5KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmRiYXR1IiwgIFhTUFIoMzEsMzM5LDUzNiksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZkYmF0bCIsICBYU1BSKDMxLDMzOSw1MzcpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1maWNfY3N0IiwgWFNQUigzMSwzMzksNTYwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY19hZHIiLCBYU1BSKDMxLDMzOSw1NjEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljX2RhdCIsIFhTUFIoMzEsMzM5LDU2MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfY3N0IiwgWFNQUigzMSwzMzksNTY4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19hZHIiLCBYU1BSKDMxLDMzOSw1NjkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2RhdCIsIFhTUFIoMzEsMzM5LDU3MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZHBkciIsICAgWFNQUigzMSwzMzksNjMwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkcGlyIiwgICBYU1BSKDMxLDMzOSw2MzEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmltbXIiLCAgIFhTUFIoMzEsMzM5LDYzOCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfY3RyIiwgWFNQUigzMSwzMzksNzg0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9hcCIsICBYU1BSKDMxLDMzOSw3ODYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2VwbiIsIFhTUFIoMzEsMzM5LDc4NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfdHdjIiwgWFNQUigzMSwzMzksNzg5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9ycG4iLCBYU1BSKDMxLDMzOSw3OTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2N0ciIsIFhTUFIoMzEsMzM5LDc5MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbV9jYXNpZCIsWFNQUigzMSwzMzksNzkzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9hcCIsICBYU1BSKDMxLDMzOSw3OTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2VwbiIsIFhTUFIoMzEsMzM5LDc5NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfdHdiIiwgWFNQUigzMSwzMzksNzk2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF90d2MiLCBYU1BSKDMxLDMzOSw3OTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3JwbiIsIFhTUFIoMzEsMzM5LDc5OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbV90dyIsICAgWFNQUigzMSwzMzksNzk5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYmNhbSIsWFNQUigzMSwzMzksODE2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYnJhbTAiLFhTUFIoMzEsMzM5LDgxNyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZGJyYW0xIixYU1BSKDMxLDMzOSw4MTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RiY2FtIiwgWFNQUigzMSwzMzksODI0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYnJhbTAiLFhTUFIoMzEsMzM5LDgyNSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJyYW0xIixYU1BSKDMxLDMzOSw4MjYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZnpwciIsICAgWFNQUigzMSwzMzksOTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwaWQiLCAgIFhTUFIoMzEsMzM5LDk0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWNkYmRyIixYU1BSKDMxLDMzOSw5NzkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnVtbWNyMCIsCVhTUFIoMzEsMzM5LDkzNiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWMxIiwJWFNQUigzMSwzMzksOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzIiLAlYU1BSKDMxLDMzOSw5MzgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1c2lhIiwJWFNQUigzMSwzMzksOTM5KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdW1tY3IxIiwJWFNQUigzMSwzMzksOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzMiLAlYU1BSKDMxLDMzOSw5NDEpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jNCIsCVhTUFIoMzEsMzM5LDk0MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZm1tY3IwIiwJWFNQUigzMSwzMzksOTUyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMSIsCVhTUFIoMzEsMzM5LDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzIiLAlYU1BSKDMxLDMzOSw5NTQpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZzaWEiLAlYU1BSKDMxLDMzOSw5NTUpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZtbWNyMSIsCVhTUFIoMzEsMzM5LDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzMiLAlYU1BSKDMxLDMzOSw5NTcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWM0IiwJWFNQUigzMSwzMzksOTU4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mZXNyIiwgICBYU1BSKDMxLDMzOSw5ODApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRlYXIiLCAgWFNQUigzMSwzMzksOTgxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZldnByIiwgIFhTUFIoMzEsMzM5LDk4MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mY2RiY3IiLCBYU1BSKDMxLDMzOSw5ODMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRzciIsICAgWFNQUigzMSwzMzksOTg0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0Y3IiLCAgIFhTUFIoMzEsMzM5LDk4NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGl0IiwgICBYU1BSKDMxLDMzOSw5ODcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRiaGkiLCAgWFNQUigzMSwzMzksOTg4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZ0YmxvIiwgIFhTUFIoMzEsMzM5LDk4OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mc3JyMiIsICBYU1BSKDMxLDMzOSw5OTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnNycjMiLCAgWFNQUigzMSwzMzksOTkxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkYnNyIiwgIFhTUFIoMzEsMzM5LDEwMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlhYzEiLCAgWFNQUigzMSwzMzksMTAxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWFjMiIsICBYU1BSKDMxLDMzOSwxMDEzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkYWMxIiwgIFhTUFIoMzEsMzM5LDEwMTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRhYzIiLCAgWFNQUigzMSwzMzksMTAxNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGNjciIsICBYU1BSKDMxLDMzOSwxMDE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpY2NyIiwgIFhTUFIoMzEsMzM5LDEwMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBibDEiLCAgWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJ1MSIsICBYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYmwyIiwgIFhTUFIoMzEsMzM5LDEwMjIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBidTIiLCAgWFNQUigzMSwzMzksMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mbDJjciIsCVhTUFIoMzEsMzM5LDEwMTcpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZmljdGMiLAlYU1BSKDMxLDMzOSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMSIsCVhTUFIoMzEsMzM5LDEwMjApLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0yIiwJWFNQUigzMSwzMzksMTAyMSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTMiLAlYU1BSKDMxLDMzOSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZzcHIiLCAgIFgoMzEsMzM5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgU1BSIH0gfSwKLQoteyAibHdheCIsICAgIFgoMzEsMzQxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsaGF4IiwgICAgWCgzMSwzNDMpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkY2NjaSIsICAgWCgzMSw0NTQpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJhYnMiLCAgICAgWE8oMzEsMzYwLDAsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFicy4iLCAgICBYTygzMSwzNjAsMCwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzbyIsICAgIFhPKDMxLDM2MCwxLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnNvLiIsICAgWE8oMzEsMzYwLDEsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAiZGl2cyIsICAgIFhPKDMxLDM2MywwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnMuIiwgICBYTygzMSwzNjMsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzbyIsICAgWE8oMzEsMzYzLDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2c28uIiwgIFhPKDMxLDM2MywxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAidGxiaWEiLCAgIFgoMzEsMzcwKSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAibWZ0YnUiLCAgIFhTUFIoMzEsMzcxLDI2OSksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnRiIiwgICAgWCgzMSwzNzEpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBUQlIgfSB9LAotCi17ICJsd2F1eCIsICAgWCgzMSwzNzMpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJsaGF1eCIsICAgWCgzMSwzNzUpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAic3RoeCIsICAgIFgoMzEsNDA3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAibGZxeCIsICAgIFgoMzEsNzkxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxmcXV4IiwgICBYKDMxLDgyMyksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJzdGZxeCIsICAgWCgzMSw5MTkpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3RmcXV4IiwgIFgoMzEsOTUxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgIm9yYyIsICAgICBYUkMoMzEsNDEyLDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJvcmMuIiwgICAgWFJDKDMxLDQxMiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmFkaSIsICAgWFMoMzEsNDEzLDApLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoteyAic3JhZGkuIiwgIFhTKDMxLDQxMywxKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLQoteyAic2xiaWUiLCAgIFgoMzEsNDM0KSwJWFJUUkFfTUFTSywJUFBDNjQsCQl7IFJCIH0gfSwKLQoteyAiZWNvd3giLCAgIFgoMzEsNDM4KSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RodXgiLCAgIFgoMzEsNDM5KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgIm1yIiwJICAgICBYUkMoMzEsNDQ0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAib3IiLCAgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1yLiIsICAgICBYUkMoMzEsNDQ0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoteyAib3IuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAibXRleGlzciIsIFhTUFIoMzEsNDUxLDY0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRleGllciIsIFhTUFIoMzEsNDUxLDY2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjAiLCAgIFhTUFIoMzEsNDUxLDEyOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIxIiwgICBYU1BSKDMxLDQ1MSwxMjkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMiIsICAgWFNQUigzMSw0NTEsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjMiLCAgIFhTUFIoMzEsNDUxLDEzMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI0IiwgICBYU1BSKDMxLDQ1MSwxMzIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNSIsICAgWFNQUigzMSw0NTEsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjYiLCAgIFhTUFIoMzEsNDUxLDEzNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI3IiwgICBYU1BSKDMxLDQ1MSwxMzUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJlYXIiLCAgWFNQUigzMSw0NTEsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRiZXNyIiwgIFhTUFIoMzEsNDUxLDE0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aW9jciIsICBYU1BSKDMxLDQ1MSwxNjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMCIsIFhTUFIoMzEsNDUxLDE5MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QwIiwgWFNQUigzMSw0NTEsMTkzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTAiLCBYU1BSKDMxLDQ1MSwxOTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMCIsIFhTUFIoMzEsNDUxLDE5NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MwIiwgWFNQUigzMSw0NTEsMTk2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjEiLCBYU1BSKDMxLDQ1MSwyMDApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MSIsIFhTUFIoMzEsNDUxLDIwMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGExIiwgWFNQUigzMSw0NTEsMjAyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTEiLCBYU1BSKDMxLDQ1MSwyMDMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMSIsIFhTUFIoMzEsNDUxLDIwNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IyIiwgWFNQUigzMSw0NTEsMjA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDIiLCBYU1BSKDMxLDQ1MSwyMDkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMiIsIFhTUFIoMzEsNDUxLDIxMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EyIiwgWFNQUigzMSw0NTEsMjExKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzIiLCBYU1BSKDMxLDQ1MSwyMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMyIsIFhTUFIoMzEsNDUxLDIxNiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QzIiwgWFNQUigzMSw0NTEsMjE3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTMiLCBYU1BSKDMxLDQ1MSwyMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMyIsIFhTUFIoMzEsNDUxLDIxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MzIiwgWFNQUigzMSw0NTEsMjIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzciIsIFhTUFIoMzEsNDUxLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dW1tY3IwIiwJWFNQUigzMSw0NTEsOTM2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzEiLAlYU1BSKDMxLDQ1MSw5MzcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMiIsCVhTUFIoMzEsNDUxLDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVzaWEiLAlYU1BSKDMxLDQ1MSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1bW1jcjEiLAlYU1BSKDMxLDQ1MSw5NDApLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMyIsCVhTUFIoMzEsNDUxLDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWM0IiwJWFNQUigzMSw0NTEsOTQyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bW1jcjAiLAlYU1BSKDMxLDQ1MSw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMxIiwJWFNQUigzMSw0NTEsOTUzKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jMiIsCVhTUFIoMzEsNDUxLDk1NCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHNpYSIsCVhTUFIoMzEsNDUxLDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdG1tY3IxIiwJWFNQUigzMSw0NTEsOTU2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jMyIsCVhTUFIoMzEsNDUxLDk1NyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzQiLAlYU1BSKDMxLDQ1MSw5NTgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRsMmNyIiwJWFNQUigzMSw0NTEsMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10aWN0YyIsCVhTUFIoMzEsNDUxLDEwMTkpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0xIiwJWFNQUigzMSw0NTEsMTAyMCksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTIiLAlYU1BSKDMxLDQ1MSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMyIsCVhTUFIoMzEsNDUxLDEwMjIpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGRjciIsICAgWCgzMSw0NTEpLAlYX01BU0ssCQlQUEMsCQl7IFNQUiwgUlMgfSB9LAotCi17ICJkaXZkdSIsICAgWE8oMzEsNDU3LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1LiIsICBYTygzMSw0NTcsMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHVvIiwgIFhPKDMxLDQ1NywxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdW8uIiwgWE8oMzEsNDU3LDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGl2d3UiLCAgIFhPKDMxLDQ1OSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3UuIiwgIFhPKDMxLDQ1OSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3VvIiwgIFhPKDMxLDQ1OSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d3VvLiIsIFhPKDMxLDQ1OSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtdG1xIiwgICAgWFNQUigzMSw0NjcsMCksICAgWFNQUl9NQVNLLCAgICBNNjAxLAl7IFJTIH0gfSwKLXsgIm10eGVyIiwgICBYU1BSKDMxLDQ2NywxKSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGxyIiwgICAgWFNQUigzMSw0NjcsOCksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRjdHIiLCAgIFhTUFIoMzEsNDY3LDkpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10dGlkIiwgICBYU1BSKDMxLDQ2NywxNyksICBYU1BSX01BU0ssICAgIFBPV0VSLAl7IFJTIH0gfSwKLXsgIm10ZHNpc3IiLCBYU1BSKDMxLDQ2NywxOCksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGRhciIsICAgWFNQUigzMSw0NjcsMTkpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRydGN1IiwgIFhTUFIoMzEsNDY3LDIwKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10cnRjbCIsICBYU1BSKDMxLDQ2NywyMSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGRlYyIsICAgWFNQUigzMSw0NjcsMjIpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzZHIwIiwgIFhTUFIoMzEsNDY3LDI0KSwgIFhTUFJfTUFTSywgICAgUE9XRVIsCXsgUlMgfSB9LAoteyAibXRzZHIxIiwgIFhTUFIoMzEsNDY3LDI1KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c3JyMCIsICBYU1BSKDMxLDQ2NywyNiksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNycjEiLCAgWFNQUigzMSw0NjcsMjcpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRjbXBhIiwgICBYU1BSKDMxLDQ2NywxNDQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGIiLCAgIFhTUFIoMzEsNDY3LDE0NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wYyIsICAgWFNQUigzMSw0NjcsMTQ2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBkIiwgICBYU1BSKDMxLDQ2NywxNDcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGljciIsICAgIFhTUFIoMzEsNDY3LDE0OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10ZGVyIiwgICAgWFNQUigzMSw0NjcsMTQ5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjb3VudGEiLCBYU1BSKDMxLDQ2NywxNTApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNvdW50YiIsIFhTUFIoMzEsNDY3LDE1MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZSIsICAgWFNQUigzMSw0NjcsMTUyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBmIiwgICBYU1BSKDMxLDQ2NywxNTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGciLCAgIFhTUFIoMzEsNDY3LDE1NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21waCIsICAgWFNQUigzMSw0NjcsMTU1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRsY3RybDEiLCBYU1BSKDMxLDQ2NywxNTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGxjdHJsMiIsIFhTUFIoMzEsNDY3LDE1NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10aWN0cmwiLCAgWFNQUigzMSw0NjcsMTU4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRiYXIiLCAgICBYU1BSKDMxLDQ2NywxNTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdHNwcmciLCAgWFNQUigzMSw0NjcsMjcyKSwgWFNQUkdfTUFTSywgICBQUEMsCXsgU1BSRywgUlMgfSB9LAoteyAibXRzcHJnMCIsIFhTUFIoMzEsNDY3LDI3MiksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzEiLCBYU1BSKDMxLDQ2NywyNzMpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmcyIiwgWFNQUigzMSw0NjcsMjc0KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMyIsIFhTUFIoMzEsNDY3LDI3NSksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10YXNyIiwgICBYU1BSKDMxLDQ2NywyODApLCBYU1BSX01BU0ssICAgIFBQQzY0LAl7IFJTIH0gfSwKLXsgIm10ZWFyIiwgICBYU1BSKDMxLDQ2NywyODIpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdHRibCIsICAgWFNQUigzMSw0NjcsMjg0KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXR0YnUiLCAgIFhTUFIoMzEsNDY3LDI4NSksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10aWJhdHUiLCBYU1BSKDMxLDQ2Nyw1MjgpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10aWJhdGwiLCBYU1BSKDMxLDQ2Nyw1MjkpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10ZGJhdHUiLCBYU1BSKDMxLDQ2Nyw1MzYpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10ZGJhdGwiLCBYU1BSKDMxLDQ2Nyw1MzcpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKLXsgIm10enByIiwgICBYU1BSKDMxLDQ2Nyw5NDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBpZCIsICAgWFNQUigzMSw0NjcsOTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpY2RiZHIiLFhTUFIoMzEsNDY3LDk3OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXNyIiwgICBYU1BSKDMxLDQ2Nyw5ODApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGV2cHIiLCAgWFNQUigzMSw0NjcsOTgyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRjZGJjciIsIFhTUFIoMzEsNDY3LDk4MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dHNyIiwgICBYU1BSKDMxLDQ2Nyw5ODQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRjciIsICAgWFNQUigzMSw0NjcsOTg2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwaXQiLCAgIFhTUFIoMzEsNDY3LDk4NyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGJoaSIsICBYU1BSKDMxLDQ2Nyw5ODgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHRibG8iLCAgWFNQUigzMSw0NjcsOTg5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcnIyIiwgIFhTUFIoMzEsNDY3LDk5MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10c3JyMyIsICBYU1BSKDMxLDQ2Nyw5OTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRic3IiLCAgWFNQUigzMSw0NjcsMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWFjMSIsICBYU1BSKDMxLDQ2NywxMDEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpYWMyIiwgIFhTUFIoMzEsNDY3LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRhYzEiLCAgWFNQUigzMSw0NjcsMTAxNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGFjMiIsICBYU1BSKDMxLDQ2NywxMDE1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkY2NyIiwgIFhTUFIoMzEsNDY3LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGljY3IiLCAgWFNQUigzMSw0NjcsMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJsMSIsICBYU1BSKDMxLDQ2NywxMDIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYnUxIiwgIFhTUFIoMzEsNDY3LDEwMjEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBibDIiLCAgWFNQUigzMSw0NjcsMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJ1MiIsICBYU1BSKDMxLDQ2NywxMDIzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcHIiLCAgIFgoMzEsNDY3KSwJICAgICAgIFhfTUFTSywJICAgICBDT00sCXsgU1BSLCBSUyB9IH0sCi0KLXsgImRjYmkiLCAgICBYKDMxLDQ3MCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgIm5hbmQiLCAgICBYUkMoMzEsNDc2LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJuYW5kLiIsICAgWFJDKDMxLDQ3NiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJkY3JlYWQiLCAgWCgzMSw0ODYpLAlYX01BU0ssCQlQUEM0MDMsCQl7IFJULCBSQSwgUkIgfX0sCi0KLXsgIm5hYnMiLCAgICBYTygzMSw0ODgsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFicy4iLCAgIFhPKDMxLDQ4OCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzbyIsICAgWE8oMzEsNDg4LDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnNvLiIsICBYTygzMSw0ODgsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZkIiwgICAgWE8oMzEsNDg5LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmQuIiwgICBYTygzMSw0ODksMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZG8iLCAgIFhPKDMxLDQ4OSwxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkby4iLCAgWE8oMzEsNDg5LDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGl2dyIsICAgIFhPKDMxLDQ5MSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2dy4iLCAgIFhPKDMxLDQ5MSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28iLCAgIFhPKDMxLDQ5MSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28uIiwgIFhPKDMxLDQ5MSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzbGJpYSIsICAgWCgzMSw0OTgpLAkweGZmZmZmZmZmLAlQUEM2NCwJCXsgMCB9IH0sCi0KLXsgImNsaSIsICAgICBYKDMxLDUwMiksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKLQoteyAibWNyeHIiLCAgIFgoMzEsNTEyKSwJWFJBUkJfTUFTS3woMzw8MjEpLCBDT00sCXsgQkYgfSB9LAotCi17ICJjbGNzIiwgICAgWCgzMSw1MzEpLCBYUkJfTUFTSywJTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibHN3eCIsICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxzeCIsICAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3YnJ4IiwgICBYKDMxLDUzNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsYnJ4IiwgICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsZnN4IiwgICAgWCgzMSw1MzUpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAic3J3IiwgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyIiwgICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcncuIiwgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3IuIiwgICAgIFhSQygzMSw1MzYsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAicnJpYiIsICAgIFhSQygzMSw1MzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJycmliLiIsICAgWFJDKDMxLDUzNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JkIiwgICAgIFhSQygzMSw1MzksMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JkLiIsICAgIFhSQygzMSw1MzksMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNraXIiLCAgWFJDKDMxLDU0MSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1hc2tpci4iLCBYUkMoMzEsNTQxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0bGJzeW5jIiwgWCgzMSw1NjYpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJsZnN1eCIsICAgWCgzMSw1NjcpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkFTLCBSQiB9IH0sCi0KLXsgIm1mc3IiLCAgICBYKDMxLDU5NSksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFJULCBTUiB9IH0sCi0KLXsgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi17ICJsc2kiLCAgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgTkIgfSB9LAotCi17ICJzeW5jIiwgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAiZGNzIiwgICAgIFgoMzEsNTk4KSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKLQoteyAibGZkeCIsICAgIFgoMzEsNTk5KSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mc3JpIiwgICBYKDMxLDYyNyksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjbHN0IiwgICBYKDMxLDYzMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJTLCBSQSB9IH0sCi0KLXsgImxmZHV4IiwgICBYKDMxLDYzMSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKLQoteyAibWZzcmluIiwgIFgoMzEsNjU5KSwgWFJBX01BU0ssCVBQQzMyLAkJeyBSVCwgUkIgfSB9LAotCi17ICJzdHN3eCIsICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RzeCIsICAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3R3YnJ4IiwgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0YnJ4IiwgICBYKDMxLDY2MiksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnN4IiwgICBYKDMxLDY2MyksIFhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzcnEiLCAgICAgWFJDKDMxLDY2NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNycS4iLCAgICBYUkMoMzEsNjY0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmUiLCAgICAgWFJDKDMxLDY2NSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZS4iLCAgICBYUkMoMzEsNjY1LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdGZzdXgiLCAgWCgzMSw2OTUpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNyaXEiLCAgICBYUkMoMzEsNjk2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JpcS4iLCAgIFhSQygzMSw2OTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN0c3dpIiwgICBYKDMxLDcyNSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi17ICJzdHNpIiwgICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgTkIgfSB9LAotCi17ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3JscSIsICAgIFhSQygzMSw3MjgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmxxLiIsICAgWFJDKDMxLDcyOCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlcSIsICAgIFhSQygzMSw3MjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVxLiIsICAgWFJDKDMxLDcyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3RmZHV4IiwgIFgoMzEsNzU5KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAotCi17ICJzcmxpcSIsICAgWFJDKDMxLDc2MCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNybGlxLiIsICBYUkMoMzEsNzYwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJsaGJyeCIsICAgWCgzMSw3OTApLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzcmF3IiwgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhIiwgICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYXcuIiwgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmEuIiwgICAgWFJDKDMxLDc5MiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmFkIiwgICAgWFJDKDMxLDc5NCwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFkLiIsICAgWFJDKDMxLDc5NCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInJhYyIsICAgICBYKDMxLDgxOCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXdpIiwgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpIiwgICAgWFJDKDMxLDgyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3Jhd2kuIiwgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWkuIiwgICBYUkMoMzEsODI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImVpZWlvIiwgICBYKDMxLDg1NCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInRsYnN4LiIsICBYUkMoMzEsOTE0LDEpLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RoYnJ4IiwgIFgoMzEsOTE4KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3JhcSIsICAgIFhSQygzMSw5MjAsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFxLiIsICAgWFJDKDMxLDkyMCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlYSIsICAgIFhSQygzMSw5MjEsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVhLiIsICAgWFJDKDMxLDkyMSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiZXh0c2giLCAgIFhSQygzMSw5MjIsMCksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzIiwgICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHNoLiIsICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0cy4iLCAgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi0KLXsgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCVBQQzQwMywJCXsgUlQsIFJBLCBTSCB9IH0sCi0KLXsgInNyYWlxIiwgICBYUkMoMzEsOTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaXEuIiwgIFhSQygzMSw5NTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImV4dHNiIiwgICBYUkMoMzEsOTU0LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCi17ICJleHRzYi4iLCAgWFJDKDMxLDk1NCwxKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTfSB9LAotCi17ICJpY2NjaSIsICAgWCgzMSw5NjYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsZCIsICAgWCgzMSw5NzgpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLXsgInRsYndlIiwgICBYKDMxLDk3OCksCVhfTUFTSywJCVBQQzQwMywJCXsgUlMsIFJBLCBTSCB9IH0sCi0KLXsgImljYmkiLCAgICBYKDMxLDk4MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJleHRzdyIsICAgWFJDKDMxLDk4NiwwKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHN3LiIsICBYUkMoMzEsOTg2LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAotCi17ICJpY3JlYWQiLCAgWCgzMSw5OTgpLAlYUlRfTUFTSywJUFBDNDAzLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsaSIsICAgWCgzMSwxMDEwKSwgWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCi0KLXsgImRjYnoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAoteyAiZGNseiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImx2ZWJ4IiwgICBYKDMxLCAgIDcpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFJBLCBSQiB9IH0sCi17ICJsdmVoeCIsICAgWCgzMSwgIDM5KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZELCBSQSwgUkIgfSB9LAoteyAibHZld3giLCAgIFgoMzEsICA3MSksIFhfTUFTSywJUFBDVkVDLAkJeyBWRCwgUkEsIFJCIH0gfSwKLXsgImx2c2wiLCAgICBYKDMxLCAgIDYpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFJBLCBSQiB9IH0sCi17ICJsdnNyIiwgICAgWCgzMSwgIDM4KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZELCBSQSwgUkIgfSB9LAoteyAibHZ4IiwgICAgIFgoMzEsIDEwMyksIFhfTUFTSywJUFBDVkVDLAkJeyBWRCwgUkEsIFJCIH0gfSwKLXsgImx2eGwiLCAgICBYKDMxLCAzNTkpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFJBLCBSQiB9IH0sCi17ICJzdHZlYngiLCAgWCgzMSwgMTM1KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZTLCBSQSwgUkIgfSB9LAoteyAic3R2ZWh4IiwgIFgoMzEsIDE2NyksIFhfTUFTSywJUFBDVkVDLAkJeyBWUywgUkEsIFJCIH0gfSwKLXsgInN0dmV3eCIsICBYKDMxLCAxOTkpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVlMsIFJBLCBSQiB9IH0sCi17ICJzdHZ4IiwgICAgWCgzMSwgMjMxKSwgWF9NQVNLLAlQUENWRUMsCQl7IFZTLCBSQSwgUkIgfSB9LAoteyAic3R2eGwiLCAgIFgoMzEsIDQ4NyksIFhfTUFTSywJUFBDVkVDLAkJeyBWUywgUkEsIFJCIH0gfSwKLQoteyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAibCIsCSAgICAgT1AoMzIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImx3enUiLCAgICBPUCgzMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi17ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGJ6dSIsICAgIE9QKDM1KSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAic3R3IiwgICAgIE9QKDM2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoteyAic3QiLCAgICAgIE9QKDM2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoteyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGIiLCAgICAgT1AoMzgpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0YnUiLCAgICBPUCgzOSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaGF1IiwgICAgT1AoNDMpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAotCi17ICJzdGgiLCAgICAgT1AoNDQpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0aHUiLCAgICBPUCg0NSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxtdyIsICAgICBPUCg0NiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTSB9IH0sCi17ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0bSIsICAgICBPUCg0NyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGZzdSIsICAgIE9QKDQ5KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCi0KLXsgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmZHUiLCAgICBPUCg1MSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAotCi17ICJzdGZzIiwgICAgT1AoNTIpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZzdSIsICAgT1AoNTMpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKLQoteyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RmZHUiLCAgIE9QKDU1KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxmcSIsICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKLQoteyAibGR1IiwgICAgIERTTyg1OCwxKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkFMIH0gfSwKLQoteyAibHdhIiwgICAgIERTTyg1OCwyKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkEgfSB9LAotCi17ICJmZGl2cyIsICAgQSg1OSwxOCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmRpdnMuIiwgIEEoNTksMTgsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnN1YnMiLCAgIEEoNTksMjAsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWJzLiIsICBBKDU5LDIwLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZhZGRzIiwgICBBKDU5LDIxLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYWRkcy4iLCAgQSg1OSwyMSwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydHMiLCAgQSg1OSwyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0cy4iLCBBKDU5LDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmbXVscyIsICAgQSg1OSwyNSwwKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bHMuIiwgIEEoNTksMjUsMSksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLQoteyAiZm1zdWJzIiwgIEEoNTksMjgsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zdWJzLiIsIEEoNTksMjgsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbWFkZHMiLCAgQSg1OSwyOSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWFkZHMuIiwgQSg1OSwyOSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubXN1YnMiLCBBKDU5LDMwLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXN1YnMuIixBKDU5LDMwLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tYWRkcyIsIEEoNTksMzEsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYWRkcy4iLEEoNTksMzEsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJzdGZxIiwgICAgT1AoNjApLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZxdSIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGQiLCAgICAgRFNPKDYyLDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQSB9IH0sCi0KLXsgInN0ZHUiLCAgICBEU08oNjIsMSksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBUyB9IH0sCi0KLXsgImZjbXB1IiwgICBYKDYzLDApLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJmcnNwIiwgICAgWFJDKDYzLDEyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcnNwLiIsICAgWFJDKDYzLDEyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGl3IiwgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIiLCAgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGl3LiIsICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIuIiwgICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmN0aXd6IiwgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnoiLCAgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aXd6LiIsIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnouIiwgIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmZGl2IiwgICAgQSg2MywxOCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmQiLCAgICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkaXYuIiwgICBBKDYzLDE4LDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZC4iLCAgICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3ViIiwgICAgQSg2MywyMCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnMiLCAgICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWIuIiwgICBBKDYzLDIwLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmcy4iLCAgICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmYWRkIiwgICAgQSg2MywyMSwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmEiLCAgICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhZGQuIiwgICBBKDYzLDIxLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYS4iLCAgICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydCIsICAgQSg2MywyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0LiIsICBBKDYzLDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQ1BXUjIsCXsgRlJULCBGUkIgfSB9LAotCi17ICJmc2VsIiwgICAgQSg2MywyMywwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmc2VsLiIsICAgQSg2MywyMywxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtdWwiLCAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbSIsICAgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bC4iLCAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtLiIsICAgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi0KLXsgImZyc3FydGUiLCBBKDYzLDI2LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcXJ0ZS4iLEEoNjMsMjYsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZtc3ViIiwgICBBKDYzLDI4LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcyIsICAgICBBKDYzLDI4LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtc3ViLiIsICBBKDYzLDI4LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcy4iLCAgICBBKDYzLDI4LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm1hZGQiLCAgIEEoNjMsMjksMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hIiwgICAgIEEoNjMsMjksMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hZGQuIiwgIEEoNjMsMjksMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hLiIsICAgIEEoNjMsMjksMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1zdWIiLCAgQSg2MywzMCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zIiwgICAgQSg2MywzMCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zdWIuIiwgQSg2MywzMCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zLiIsICAgQSg2MywzMCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubWFkZCIsICBBKDYzLDMxLDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEiLCAgICBBKDYzLDMxLDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWFkZC4iLCBBKDYzLDMxLDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEuIiwgICBBKDYzLDMxLDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZmNtcG8iLCAgIFgoNjMsMzIpLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJtdGZzYjEiLCAgWFJDKDYzLDM4LDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLXsgIm10ZnNiMS4iLCBYUkMoNjMsMzgsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAotCi17ICJmbmVnIiwgICAgWFJDKDYzLDQwLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmVnLiIsICAgWFJDKDYzLDQwLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm1jcmZzIiwgICBYKDYzLDY0KSwJWFJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCi0KLXsgIm10ZnNiMCIsICBYUkMoNjMsNzAsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoteyAibXRmc2IwLiIsIFhSQyg2Myw3MCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi0KLXsgImZtciIsICAgICBYUkMoNjMsNzIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZtci4iLCAgICBYUkMoNjMsNzIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKLXsgIm10ZnNmaS4iLCBYUkMoNjMsMTM0LDEpLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCi0KLXsgImZuYWJzIiwgICBYUkMoNjMsMTM2LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmFicy4iLCAgWFJDKDYzLDEzNiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibWZmcyIsICAgIFhSQyg2Myw1ODMsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKLXsgIm1mZnMuIiwgICBYUkMoNjMsNTgzLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCi0KLXsgIm10ZnNmIiwgICBYRkwoNjMsNzExLDApLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCi17ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAotCi17ICJmY3RpZCIsICAgWFJDKDYzLDgxNCwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3RpZC4iLCAgWFJDKDYzLDgxNCwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGlkeiIsICBYUkMoNjMsODE1LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGlkei4iLCBYUkMoNjMsODE1LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmNmaWQiLCAgIFhSQyg2Myw4NDYsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNmaWQuIiwgIFhSQyg2Myw4NDYsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi19OwotCi1jb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAocG93ZXJwY19vcGNvZGVzKSAvIHNpemVvZiAocG93ZXJwY19vcGNvZGVzWzBdKTsKLQwKLS8qIFRoZSBtYWNybyB0YWJsZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBUaGUgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gKC14ICEgMzEpICYgKHggfCAzMSkgaGF2ZSB0aGUgdmFsdWUgMAotICAgd2hlbiB4PTA7IDMyLXggd2hlbiB4IGlzIGJldHdlZW4gMSBhbmQgMzE7IGFyZSBuZWdhdGl2ZSBpZiB4IGlzCi0gICBuZWdhdGl2ZTsgYW5kIGFyZSAzMiBvciBtb3JlIG90aGVyd2lzZS4gIFRoaXMgaXMgd2hhdCB5b3Ugd2FudAotICAgd2hlbiwgZm9yIGluc3RhbmNlLCB5b3UgYXJlIGVtdWxhdGluZyBhIHJpZ2h0IHNoaWZ0IGJ5IGEKLSAgIHJvdGF0ZS1sZWZ0LWFuZC1tYXNrLCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBzdXBwb3J0Ci0gICBzaGlmdHMgb2Ygc2l6ZSAwIGJ1dCBub3Qgc2hpZnRzIG9mIHNpemUgMzIuICBCeSBjb21wYXJpc29uLCB3aGVuCi0gICBleHRyYWN0aW5nIHggYml0cyBmcm9tIHNvbWUgd29yZCB5b3Ugd2FudCB0byB1c2UganVzdCAzMi14LCBiZWNhdXNlCi0gICB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgZG9uJ3Qgc3VwcG9ydCBleHRyYWN0aW5nIDAgYml0cyBidXQgZG8KLSAgIHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgd2hvbGUgd29yZCAoMzIgYml0cyBpbiB0aGlzIGNhc2UpLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gcG93ZXJwY19tYWNyb3NbXSA9IHsKLXsgImV4dGxkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUzLCglMiktMSIgfSwKLXsgImV4dGxkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMywoJTIpLTEiIH0sCi17ICJleHRyZGkiLCAgNCwgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImV4dHJkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImluc3JkaSIsICA0LCAgIFBQQzY0LAkicmxkaW1pICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAiaW5zcmRpLiIsIDQsICAgUFBDNjQsCSJybGRpbWkuICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAicm90cmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKLXsgInJvdHJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoteyAic2xkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTIsNjMtKCUyKSIgfSwKLXsgInNsZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMiw2My0oJTIpIiB9LAoteyAic3JkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJzcmRpLiIsICAgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJjbHJyZGkiLCAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwwLDYzLSglMikiIH0sCi17ICJjbHJyZGkuIiwgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsMCw2My0oJTIpIiB9LAoteyAiY2xybHNsZGkiLDQsICAgUFBDNjQsCSJybGRpYyAlMCwlMSwlMywoJTIpLSglMykiIH0sCi17ICJjbHJsc2xkaS4iLDQsICBQUEM2NCwJInJsZGljLiAlMCwlMSwlMywoJTIpLSglMykiIH0sCi0KLXsgImV4dGx3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywwLCglMiktMSIgfSwKLXsgImV4dGx3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCi17ICJleHRyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKCUyKSsoJTMpLDMyLSglMiksMzEiIH0sCi17ICJleHRyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoteyAiaW5zbHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zbHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSJ9LAoteyAiaW5zcndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zcndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSJ9LAoteyAicm90cndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJyb3Ryd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJzbHdpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2xpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2x3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzbGkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic3J3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJzcndpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAiY2xycndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoteyAiY2xycndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKLXsgImNscmxzbHdpIiw0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKLXsgImNscmxzbHdpLiIsNCwgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCi0KLX07Ci0KLWNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3MgPQotICBzaXplb2YgKHBvd2VycGNfbWFjcm9zKSAvIHNpemVvZiAocG93ZXJwY19tYWNyb3NbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1kaXMuYyBiL29wY29kZXMvc2gtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OGUyYTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBTSCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAic2gtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jZGVmaW5lIExJVFRMRV9CSVQgMgotCi1zdGF0aWMgdm9pZAotcHJpbnRfbW92eHkgKG9wLCBybiwgcm0sIGZwcmludGZfZm4sIHN0cmVhbSkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wOwotICAgICBpbnQgcm4sIHJtOwotICAgICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZm47Ci0gICAgIHZvaWQgKnN0cmVhbTsKLXsKLSAgaW50IG47Ci0KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCIlc1x0Iiwgb3AtPm5hbWUpOwotICBmb3IgKG4gPSAwOyBuIDwgMjsgbisrKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3AtPmFyZ1tuXSkKLQl7Ci0JY2FzZSBBX0lORF9OOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfSU5DX046Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfUE1PRF9OOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCtyOCIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfUE1PRFlfTjoKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrcjkiLCBybik7CQotCSAgYnJlYWs7Ci0JY2FzZSBEU1BfUkVHX006Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhJWMiLCAnMCcgKyBybSk7Ci0JICBicmVhazsKLQljYXNlIERTUF9SRUdfWDoKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInglYyIsICcwJyArIHJtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFNQX1JFR19ZOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieSVjIiwgJzAnICsgcm0pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGlmIChuID09IDApCi0JZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwkKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgZG91YmxlIGRhdGEgdHJhbnNmZXIgaW5zbi4gIElOU04gaXMganVzdCB0aGUgbG93ZXIgdGhyZWUKLSAgIG5pYmJsZXMgb2YgdGhlIGluc24sIGkuZS4gZmllbGQgYSBhbmQgdGhlIGJpdCB0aGF0IGluZGljYXRlcyBpZgotICAgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24gZm9sbG93cy4KLSAgIFJldHVybiBub256ZXJvIGlmIGEgZmllbGQgYiBvZiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbnMgZm9sbG93cy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9kZHQgKGluc24sIGluZm8pCi0gICAgIGludCBpbnNuOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogSWYgdGhpcyBpcyBqdXN0IGEgbm9wLCBtYWtlIHN1cmUgdG8gZW1pdCBzb21ldGhpbmcuICAqLwotICBpZiAoaW5zbiA9PSAweDAwMCkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJub3B4XHRub3B5Iik7Ci0KLSAgLyogSWYgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24gd2FzIHByaW50ZWQgYmVmb3JlLAotICAgICBhbmQgd2UgZ290IGEgbm9uLW5vcCwgZW1pdCBhIHRhYi4gICovCi0gIGlmICgoaW5zbiAmIDB4ODAwKSAmJiAoaW5zbiAmIDB4M2ZmKSkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCIpOwotCi0gIC8qIENoZWNrIGlmIGVpdGhlciB0aGUgeCBvciB5IHBhcnQgaXMgaW52YWxpZC4gICovCi0gIGlmICgoKGluc24gJiAweGMpID09IDAgJiYgKGluc24gJiAweDJhMCkpCi0gICAgICB8fCAoKGluc24gJiAzKSA9PSAwICYmIChpbnNuICYgMHgxNTApKSkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIud29yZCAweCV4IiwgaW5zbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0aWMgc2hfb3Bjb2RlX2luZm8gKmZpcnN0X21vdngsICpmaXJzdF9tb3Z5OwotICAgICAgc2hfb3Bjb2RlX2luZm8gKm9weCwgKm9weTsKLSAgICAgIGludCBpbnNuX3gsIGluc25feTsKLQotICAgICAgaWYgKCEgZmlyc3RfbW92eCkKLQl7Ci0JICBmb3IgKGZpcnN0X21vdnggPSBzaF90YWJsZTsgZmlyc3RfbW92eC0+bmliYmxlc1sxXSAhPSBNT1ZYOyApCi0JICAgIGZpcnN0X21vdngrKzsKLQkgIGZvciAoZmlyc3RfbW92eSA9IGZpcnN0X21vdng7IGZpcnN0X21vdnktPm5pYmJsZXNbMV0gIT0gTU9WWTsgKQotCSAgICBmaXJzdF9tb3Z5Kys7Ci0JfQotICAgICAgaW5zbl94ID0gKGluc24gPj4gMikgJiAweGI7Ci0gICAgICBpZiAoaW5zbl94KQotCXsKLQkgIGZvciAob3B4ID0gZmlyc3RfbW92eDsgb3B4LT5uaWJibGVzWzJdICE9IGluc25feDsgKSBvcHgrKzsKLQkgIHByaW50X21vdnh5IChvcHgsICgoaW5zbiA+PiA5KSAmIDEpICsgNCwgKGluc24gPj4gNykgJiAxLAotCQkgICAgICAgZnByaW50Zl9mbiwgc3RyZWFtKTsKLQl9Ci0gICAgICBpbnNuX3kgPSAoaW5zbiAmIDMpIHwgKChpbnNuID4+IDEpICYgOCk7Ci0gICAgICBpZiAoaW5zbl95KQotCXsKLQkgIGlmIChpbnNuX3gpCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0Iik7Ci0JICBmb3IgKG9weSA9IGZpcnN0X21vdnk7IG9weS0+bmliYmxlc1syXSAhPSBpbnNuX3k7ICkgb3B5Kys7Ci0JICBwcmludF9tb3Z4eSAob3B5LCAoKGluc24gPj4gOCkgJiAxKSArIDYsIChpbnNuID4+IDYpICYgMSwKLQkJICAgICAgIGZwcmludGZfZm4sIHN0cmVhbSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2RzcF9yZWcgKHJtLCBmcHJpbnRmX2ZuLCBzdHJlYW0pCi0gICAgIGludCBybTsKLSAgICAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuOwotICAgICB2b2lkICpzdHJlYW07Ci17Ci0gIHN3aXRjaCAocm0pCi0gICAgewotICAgIGNhc2UgQV9BMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0EwX05VTToKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImEwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFfWDBfTlVNOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieDAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9YMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4MSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX1kwX05VTToKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInkwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFfWTFfTlVNOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieTEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9NMF9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0ExR19OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9NMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0EwR19OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMGciKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIweCV4Iiwgcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9wcGkgKGZpZWxkX2IsIGluZm8pCi0gICAgIGludCBmaWVsZF9iOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIGNoYXIgKnN4X3RhYltdID0geyJ4MCIsIngxIiwiYTAiLCJhMSJ9OwotICBzdGF0aWMgY2hhciAqc3lfdGFiW10gPSB7InkwIiwieTEiLCJtMCIsIm0xIn07Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBpbnQgbmliMSwgbmliMiwgbmliMzsKLSAgY2hhciAqZGM7Ci0gIHNoX29wY29kZV9pbmZvICpvcDsKLQotICBpZiAoKGZpZWxkX2IgJiAweGU4MDApID09IDApCi0gICAgewotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicHNoJWNcdCMlZCwiLAotCQkgIGZpZWxkX2IgJiAweDEwMDAgPyAnYScgOiAnbCcsCi0JCSAgKGZpZWxkX2IgPj4gNCkgJiAxMjcpOwotICAgICAgcHJpbnRfZHNwX3JlZyAoZmllbGRfYiAmIDB4ZiwgZnByaW50Zl9mbiwgc3RyZWFtKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoZmllbGRfYiAmIDB4YzAwMCkgPT0gMHg0MDAwICYmIChmaWVsZF9iICYgMHgzMDAwKSAhPSAweDEwMDApCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgKmR1X3RhYltdID0geyJ4MCIsInkwIiwiYTAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNlX3RhYltdID0geyJ4MCIsIngxIiwieTAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNmX3RhYltdID0geyJ5MCIsInkxIiwieDAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNnX3RhYltdID0geyJtMCIsIm0xIiwiYTAiLCJhMSJ9OwotCi0gICAgICBpZiAoZmllbGRfYiAmIDB4MjAwMCkKLQl7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJwJXMgJXMsJXMsJXNcdCIsCi0JCSAgICAgIChmaWVsZF9iICYgMHgxMDAwKSA/ICJhZGQiIDogInN1YiIsCi0JCSAgICAgIHN4X3RhYlsoZmllbGRfYiA+PiA2KSAmIDNdLAotCQkgICAgICBzeV90YWJbKGZpZWxkX2IgPj4gNCkgJiAzXSwKLQkJICAgICAgZHVfdGFiWyhmaWVsZF9iID4+IDApICYgM10pOwotCX0KLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInBtdWxzJWMlcywlcywlcyIsCi0JCSAgZmllbGRfYiAmIDB4MjAwMCA/ICcgJyA6ICdcdCcsCi0JCSAgc2VfdGFiWyhmaWVsZF9iID4+IDEwKSAmIDNdLAotCQkgIHNmX3RhYlsoZmllbGRfYiA+PiAgOCkgJiAzXSwKLQkJICBzZ190YWJbKGZpZWxkX2IgPj4gIDIpICYgM10pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuaWIxID0gUFBJQzsKLSAgbmliMiA9IGZpZWxkX2IgPj4gMTIgJiAweGY7Ci0gIG5pYjMgPSBmaWVsZF9iID4+IDggJiAweGY7Ci0gIHN3aXRjaCAobmliMyAmIDB4MykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZGMgPSAiIjsKLSAgICAgIG5pYjEgPSBQUEkzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZGMgPSAiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGRjID0gImRjdCAiOwotICAgICAgbmliMyAtPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgZGMgPSAiZGNmICI7Ci0gICAgICBuaWIzIC09IDI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZvciAob3AgPSBzaF90YWJsZTsgb3AtPm5hbWU7IG9wKyspCi0gICAgewotICAgICAgaWYgKG9wLT5uaWJibGVzWzFdID09IG5pYjEKLQkgICYmIG9wLT5uaWJibGVzWzJdID09IG5pYjIKLQkgICYmIG9wLT5uaWJibGVzWzNdID09IG5pYjMpCi0JewotCSAgaW50IG47Ci0KLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzJXNcdCIsIGRjLCBvcC0+bmFtZSk7Ci0JICBmb3IgKG4gPSAwOyBuIDwgMyAmJiBvcC0+YXJnW25dICE9IEFfRU5EOyBuKyspIAotCSAgICB7Ci0JICAgICAgaWYgKG4gJiYgb3AtPmFyZ1sxXSAhPSBBX0VORCkKLQkJZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwotCSAgICAgIHN3aXRjaCAob3AtPmFyZ1tuXSkgCi0JCXsKLQkJY2FzZSBEU1BfUkVHX046Ci0JCSAgcHJpbnRfZHNwX3JlZyAoZmllbGRfYiAmIDB4ZiwgZnByaW50Zl9mbiwgc3RyZWFtKTsKLQkJICBicmVhazsKLQkJY2FzZSBEU1BfUkVHX1g6Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCBzeF90YWJbKGZpZWxkX2IgPj4gNikgJiAzXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFNQX1JFR19ZOgotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgc3lfdGFiWyhmaWVsZF9iID4+IDQpICYgM10pOwotCQkgIGJyZWFrOwotCQljYXNlIEFfTUFDSDoKLQkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtYWNoIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9NQUNMOgotCQkgIGZwcmludGZfZm4gKHN0cmVhbSAsIm1hY2wiKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgLyogTm90IGZvdW5kLiAgKi8KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLndvcmQgMHgleCIsIGZpZWxkX2IpOwotfQotCi1zdGF0aWMgaW50IAotcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBjaGFyIGluc25bMl07Ci0gIHVuc2lnbmVkIGNoYXIgbmlic1s0XTsKLSAgaW50IHN0YXR1czsKLSAgYmZkX3ZtYSByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMDsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wOwotICBpbnQgdGFyZ2V0X2FyY2g7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3NoOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gyOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2hfZHNwOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoX2RzcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gzOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gzX2RzcDoKLSAgICAgIHRhcmdldF9hcmNoID0gYXJjaF9zaDNfZHNwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zaDNlOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoM2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NoNDoKLSAgICAgIHRhcmdldF9hcmNoID0gYXJjaF9zaDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGluc24sIDIsIGluZm8pOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpIAotICAgIHsKLSAgICAgIG5pYnNbMF0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbMV0gPSBpbnNuWzFdICYgMHhmOwotCi0gICAgICBuaWJzWzJdID0gKGluc25bMF0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzNdID0gaW5zblswXSAmIDB4ZjsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgbmlic1swXSA9IChpbnNuWzBdID4+IDQpICYgMHhmOwotICAgICAgbmlic1sxXSA9IGluc25bMF0gJiAweGY7Ci0KLSAgICAgIG5pYnNbMl0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbM10gPSBpbnNuWzFdICYgMHhmOwotICAgIH0KLQotICBpZiAobmlic1swXSA9PSAweGYgJiYgKG5pYnNbMV0gJiA0KSA9PSAwICYmIHRhcmdldF9hcmNoICYgYXJjaF9zaF9kc3BfdXApCi0gICAgewotICAgICAgaWYgKG5pYnNbMV0gJiA4KQotCXsKLQkgIGludCBmaWVsZF9iOwotCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgMiwgaW5zbiwgMiwgaW5mbyk7Ci0KLQkgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgIHsKLQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgMiwgaW5mbyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpIAotCSAgICBmaWVsZF9iID0gaW5zblsxXSA8PCA4IHwgaW5zblswXTsKLQkgIGVsc2UKLQkgICAgZmllbGRfYiA9IGluc25bMF0gPDwgOCB8IGluc25bMV07Ci0KLQkgIHByaW50X2luc25fcHBpIChmaWVsZF9iLCBpbmZvKTsKLQkgIHByaW50X2luc25fZGR0ICgobmlic1sxXSA8PCA4KSB8IChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSwgaW5mbyk7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBwcmludF9pbnNuX2RkdCAoKG5pYnNbMV0gPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IG5pYnNbM10sIGluZm8pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBmb3IgKG9wID0gc2hfdGFibGU7IG9wLT5uYW1lOyBvcCsrKSAKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCBybSA9IDA7Ci0gICAgICBpbnQgcmIgPSAwOwotICAgICAgaW50IGRpc3BfcGM7Ci0gICAgICBiZmRfdm1hIGRpc3BfcGNfYWRkciA9IDA7Ci0KLSAgICAgIGlmICgob3AtPmFyY2ggJiB0YXJnZXRfYXJjaCkgPT0gMCkKLQlnb3RvIGZhaWw7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKQotCXsKLQkgIGludCBpID0gb3AtPm5pYmJsZXNbbl07Ci0KLQkgIGlmIChpIDwgMTYpIAotCSAgICB7Ci0JICAgICAgaWYgKG5pYnNbbl0gPT0gaSkKLQkJY29udGludWU7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBCUkFOQ0hfODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsJICAKLQkgICAgICBpZiAoaW1tICYgMHg4MCkKLQkJaW1tIHw9IH4weGZmOwotCSAgICAgIGltbSA9ICgoY2hhcilpbW0pICogMiArIDQgOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgQlJBTkNIXzEyOgotCSAgICAgIGltbSA9ICgobmlic1sxXSkgPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsKLQkgICAgICBpZiAoaW1tICYgMHg4MDApCi0JCWltbSB8PSB+MHhmZmY7Ci0JICAgICAgaW1tID0gaW1tICogMiArIDQ7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU0wXzQ6Ci0JICAgIGNhc2UgSU1NMV80OgotCSAgICAgIGltbSA9IG5pYnNbM107Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU0wXzRCWTI6Ci0JICAgIGNhc2UgSU1NMV80QlkyOgotCSAgICAgIGltbSA9IG5pYnNbM10gPDwxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NMF80Qlk0OgotCSAgICBjYXNlIElNTTFfNEJZNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdIDw8MjsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTTBfODoKLQkgICAgY2FzZSBJTU0xXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDE7Ci0JICAgICAgcmVsbWFzayA9IH4gKGJmZF92bWEpIDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBQQ1JFTElNTV84Qlk0OgotCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MjsKLQkgICAgICByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMzsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTTBfOEJZMjoKLQkgICAgY2FzZSBJTU0xXzhCWTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NMF84Qlk0OgotCSAgICBjYXNlIElNTTFfOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBSRUdfTjoKLQkgICAgICBybiA9IG5pYnNbbl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX006Ci0JICAgICAgcm0gPSBuaWJzW25dOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19OTToKLQkgICAgICBybiA9IChuaWJzW25dICYgMHhjKSA+PiAyOwotCSAgICAgIHJtID0gKG5pYnNbbl0gJiAweDMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19COgotCSAgICAgIHJiID0gbmlic1tuXSAmIDB4MDc7Ci0JICAgICAgYnJlYWs7CQotCSAgICBjYXNlIFNEVF9SRUdfTjoKLQkgICAgICAvKiBzaC1kc3A6IHNpbmdsZSBkYXRhIHRyYW5zZmVyLiAgKi8KLQkgICAgICBybiA9IG5pYnNbbl07Ci0JICAgICAgaWYgKChybiAmIDB4YykgIT0gNCkKLQkJZ290byBmYWlsOwotCSAgICAgIHJuID0gcm4gJiAweDM7Ci0JICAgICAgcm4gfD0gKHJuICYgMikgPDwgMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQUEk6Ci0JICAgIGNhc2UgUkVQRUFUOgotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotCi0gICAgb2s6Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiVzXHQiLCBvcC0+bmFtZSk7Ci0gICAgICBkaXNwX3BjID0gMDsKLSAgICAgIGZvciAobiA9IDA7IG4gPCAzICYmIG9wLT5hcmdbbl0gIT0gQV9FTkQ7IG4rKykgCi0JewotCSAgaWYgKG4gJiYgb3AtPmFyZ1sxXSAhPSBBX0VORCkKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwotCSAgc3dpdGNoIChvcC0+YXJnW25dKSAKLQkgICAgewotCSAgICBjYXNlIEFfSU1NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiMlZCIsIChjaGFyKShpbW0pKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkNfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ERUNfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJALXIlZCIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkRfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkIiwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxyJWQpIiwgaW1tLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUE1PRF9OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrcjgiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5DX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCsiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREVDX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQC1yJWQiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsciVkKSIsIGltbSwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19COgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZF9iYW5rIiwgcmIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9QQzoKLQkgICAgICBkaXNwX3BjID0gMTsKLQkgICAgICBkaXNwX3BjX2FkZHIgPSBpbW0gKyA0ICsgKG1lbWFkZHIgJiByZWxtYXNrKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGRpc3BfcGNfYWRkciwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxyJWQpIiwgcm4pOwotCSAgICAgIGJyZWFrOyAKLQkgICAgY2FzZSBBX0lORF9SMF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLHIlZCkiLCBybSk7Ci0JICAgICAgYnJlYWs7IAotCSAgICBjYXNlIEFfRElTUF9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxnYnIpIixpbW0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUjBfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsZ2JyKSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfQkRJU1AxMjoKLQkgICAgY2FzZSBBX0JESVNQODoKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGltbSArIG1lbWFkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJnYnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1ZCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ2YnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RTUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkc3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX01PRDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtb2QiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInJlIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SUzoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJycyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfQTA6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiYTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1gwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIngwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9YMToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4MSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfWTA6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1kxOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInkxIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFNQX1JFR19NOgotCSAgICAgIHByaW50X2RzcF9yZWcgKHJtLCBmcHJpbnRmX2ZuLCBzdHJlYW0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1NSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNzciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU1BDOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNwYyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfTUFDSDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtYWNoIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9NQUNMOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSAsIm1hY2wiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1BSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInByIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TR1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic2dyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9EQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZGJyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRl9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTjoKLQkgICAgICBpZiAocm4gJiAxKQotCQl7Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieGQlZCIsIHJuICYgfjEpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIGRfcmVnX246Ci0JICAgIGNhc2UgRF9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19NOgotCSAgICAgIGlmIChybSAmIDEpCi0JCXsKLQkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4ZCVkIiwgcm0gJiB+MSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgY2FzZSBEX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBTQ1JfTToKLQkgICAgY2FzZSBGUFNDUl9OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZwc2NyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBVTF9NOgotCSAgICBjYXNlIEZQVUxfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcHVsIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRl9GUjA6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVl9SRUdfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmdiVkIiwgcm4qNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVl9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmdiVkIiwgcm0qNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgWE1UUlhfTTQ6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieG10cngiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotCi0jaWYgMAotICAgICAgLyogVGhpcyBjb2RlIHByaW50cyBpbnN0cnVjdGlvbnMgaW4gZGVsYXkgc2xvdHMgb24gdGhlIHNhbWUgbGluZQotICAgICAgICAgYXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIHRoZSBkZWxheSBzbG90cy4gIFRoaXMgY2FuIGJlCi0gICAgICAgICBjb25mdXNpbmcsIHNpbmNlIG90aGVyIGRpc2Fzc2VtYmxlciBkb24ndCB3b3JrIHRoaXMgd2F5LCBhbmQKLSAgICAgICAgIGl0IG1lYW5zIHRoYXQgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGFsbCBpbiBhIGxpbmUuICBTbyBJCi0gICAgICAgICBkaXNhYmxlZCBpdC4gIElhbi4gICovCi0gICAgICBpZiAoIShpbmZvLT5mbGFncyAmIDEpCi0JICAmJiAob3AtPm5hbWVbMF0gPT0gJ2onCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdiJwotCQkgICYmIChvcC0+bmFtZVsxXSA9PSAncicgCi0JCSAgICAgIHx8IG9wLT5uYW1lWzFdID09ICdzJykpCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdyJyAmJiBvcC0+bmFtZVsxXSA9PSAndCcpCi0JICAgICAgfHwgKG9wLT5uYW1lWzBdID09ICdiJyAmJiBvcC0+bmFtZVsyXSA9PSAnLicpKSkKLQl7Ci0JICBpbmZvLT5mbGFncyB8PSAxOwotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiXHQoc2xvdCAiKTsKLQkgIHByaW50X2luc25fc2h4IChtZW1hZGRyICsgMiwgaW5mbyk7Ci0JICBpbmZvLT5mbGFncyAmPSB+MTsKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIikiKTsKLQkgIHJldHVybiA0OwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoZGlzcF9wYyAmJiBzdHJjbXAgKG9wLT5uYW1lLCAibW92YSIpICE9IDApCi0JewotCSAgaW50IHNpemU7Ci0JICBiZmRfYnl0ZSBieXRlc1s0XTsKLQotCSAgaWYgKHJlbG1hc2sgPT0gfiAoYmZkX3ZtYSkgMSkKLQkgICAgc2l6ZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNpemUgPSA0OwotCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoZGlzcF9wY19hZGRyLCBieXRlcywgc2l6ZSwgaW5mbyk7Ci0JICBpZiAoc3RhdHVzID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotCi0JICAgICAgaWYgKHNpemUgPT0gMikKLQkJewotCQkgIGlmICgoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAhPSAwKQotCQkgICAgdmFsID0gYmZkX2dldGwxNiAoYnl0ZXMpOwotCQkgIGVsc2UKLQkJICAgIHZhbCA9IGJmZF9nZXRiMTYgKGJ5dGVzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAhPSAwKQotCQkgICAgdmFsID0gYmZkX2dldGwzMiAoYnl0ZXMpOwotCQkgIGVsc2UKLQkJICAgIHZhbCA9IGJmZF9nZXRiMzIgKGJ5dGVzKTsKLQkJfQotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0ISAweCV4IiwgdmFsKTsKLQkgICAgfQotCX0KLQotICAgICAgcmV0dXJuIDI7Ci0gICAgZmFpbDoKLSAgICAgIDsKLQotICAgIH0KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLndvcmQgMHgleCV4JXgleCIsIG5pYnNbMF0sIG5pYnNbMV0sIG5pYnNbMl0sIG5pYnNbM10pOwotICByZXR1cm4gMjsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9zaGwgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCByOwotCi0gIGluZm8tPmZsYWdzID0gTElUVExFX0JJVDsKLSAgciA9IHByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2ggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCByOwotCi0gIGluZm8tPmZsYWdzID0gMDsKLSAgciA9IHByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKTsKLSAgcmV0dXJuIHI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NoLW9wYy5oIGIvb3Bjb2Rlcy9zaC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmYWNiZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NoLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQwICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBTSCBvcGNvZGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlIRVhfMCwKLQlIRVhfMSwKLQlIRVhfMiwKLQlIRVhfMywKLQlIRVhfNCwKLQlIRVhfNSwKLQlIRVhfNiwKLQlIRVhfNywKLQlIRVhfOCwKLQlIRVhfOSwKLQlIRVhfQSwKLQlIRVhfQiwKLQlIRVhfQywKLQlIRVhfRCwKLQlIRVhfRSwKLQlIRVhfRiwKLQlSRUdfTiwKLQlSRUdfTSwKLQlTRFRfUkVHX04sCi0JUkVHX05NLAotICAgICAgICBSRUdfQiwKLQlCUkFOQ0hfMTIsCi0JQlJBTkNIXzgsCi0JSU1NMF80LAotCUlNTTBfNEJZMiwKLQlJTU0wXzRCWTQsCi0JSU1NMV80LAotCUlNTTFfNEJZMiwKLQlJTU0xXzRCWTQsCi0JUENSRUxJTU1fOEJZMiwKLQlQQ1JFTElNTV84Qlk0LAotCUlNTTBfOCwKLQlJTU0wXzhCWTIsCi0JSU1NMF84Qlk0LAotCUlNTTFfOCwKLQlJTU0xXzhCWTIsCi0JSU1NMV84Qlk0LAotCVBQSSwKLQlOT1BYLAotCU5PUFksCi0JTU9WWCwKLQlNT1ZZLAotCVBTSCwKLQlQTVVMLAotCVBQSTMsCi0JUERDLAotCVBQSUMsCi0JUkVQRUFUCi19IHNoX25pYmJsZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCUFfRU5ELAotCUFfQkRJU1AxMiwKLQlBX0JESVNQOCwKLQlBX0RFQ19NLAotCUFfREVDX04sCi0JQV9ESVNQX0dCUiwKLQlBX1BDLAotCUFfRElTUF9QQywKLQlBX0RJU1BfUkVHX00sCi0JQV9ESVNQX1JFR19OLAotCUFfR0JSLAotCUFfSU1NLAotCUFfSU5DX00sCi0JQV9JTkNfTiwKLQlBX0lORF9NLAotCUFfSU5EX04sCi0JQV9QTU9EX04sCi0JQV9QTU9EWV9OLAotCUFfSU5EX1IwX1JFR19NLAotCUFfSU5EX1IwX1JFR19OLAotCUFfTUFDSCwKLQlBX01BQ0wsCi0JQV9QUiwKLQlBX1IwLAotCUFfUjBfR0JSLAotCUFfUkVHX00sCi0JQV9SRUdfTiwKLQlBX1JFR19CLAotCUFfU1IsCi0JQV9WQlIsCi0JQV9NT0QsCi0JQV9SRSwKLQlBX1JTLAotCUFfRFNSLAotCURTUF9SRUdfTSwKLQlEU1BfUkVHX04sCi0JRFNQX1JFR19YLAotCURTUF9SRUdfWSwKLQlEU1BfUkVHX0UsCi0JRFNQX1JFR19GLAotCURTUF9SRUdfRywKLQlBX0EwLAotCUFfWDAsCi0JQV9YMSwKLQlBX1kwLAotCUFfWTEsCi0JQV9TU1IsCi0JQV9TUEMsCi0JQV9TR1IsCi0JQV9EQlIsCi0JRl9SRUdfTiwKLQlGX1JFR19NLAotCURfUkVHX04sCi0JRF9SRUdfTSwKLQlYX1JFR19OLCAvKiBPbmx5IHVzZWQgZm9yIGFyZ3VtZW50IHBhcnNpbmcgKi8KLQlYX1JFR19NLCAvKiBPbmx5IHVzZWQgZm9yIGFyZ3VtZW50IHBhcnNpbmcgKi8KLQlEWF9SRUdfTiwKLQlEWF9SRUdfTSwKLQlWX1JFR19OLAotCVZfUkVHX00sCi0JWE1UUlhfTTQsCi0JRl9GUjAsCi0JRlBVTF9OLAotCUZQVUxfTSwKLQlGUFNDUl9OLAotCUZQU0NSX00KLX0gc2hfYXJnX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEFfQTFfTlVNID0gICA1LAotICBBX0EwX05VTSA9ICAgNywKLSAgQV9YMF9OVU0sIEFfWDFfTlVNLCBBX1kwX05VTSwgQV9ZMV9OVU0sCi0gIEFfTTBfTlVNLCBBX0ExR19OVU0sIEFfTTFfTlVNLCBBX0EwR19OVU0KLX0gc2hfZHNwX3JlZ19udW1zOwotCi0jZGVmaW5lIGFyY2hfc2gxICAgICAweDAwMDEKLSNkZWZpbmUgYXJjaF9zaDIgICAgIDB4MDAwMgotI2RlZmluZSBhcmNoX3NoMyAgICAgMHgwMDA0Ci0jZGVmaW5lIGFyY2hfc2gzZSAgICAweDAwMDgKLSNkZWZpbmUgYXJjaF9zaDQgICAgIDB4MDAxMAotI2RlZmluZSBhcmNoX3NoX2RzcCAgMHgwMTAwCi0jZGVmaW5lIGFyY2hfc2gzX2RzcCAweDAyMDAKLQotI2RlZmluZSBhcmNoX3NoMV91cCAoYXJjaF9zaDEgfCBhcmNoX3NoMl91cCkKLSNkZWZpbmUgYXJjaF9zaDJfdXAgKGFyY2hfc2gyIHwgYXJjaF9zaDNfdXAgfCBhcmNoX3NoX2RzcCkKLSNkZWZpbmUgYXJjaF9zaDNfdXAgKGFyY2hfc2gzIHwgYXJjaF9zaDNlX3VwIHwgYXJjaF9zaDNfZHNwKQotI2RlZmluZSBhcmNoX3NoM2VfdXAgKGFyY2hfc2gzZSB8IGFyY2hfc2g0X3VwKQotI2RlZmluZSBhcmNoX3NoNF91cCBhcmNoX3NoNAotCi0jZGVmaW5lIGFyY2hfc2hfZHNwX3VwIChhcmNoX3NoX2RzcCB8IGFyY2hfc2gzX2RzcF91cCkKLSNkZWZpbmUgYXJjaF9zaDNfZHNwX3VwIGFyY2hfc2gzX2RzcAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNoX2FyZ190eXBlIGFyZ1s0XTsKLSAgc2hfbmliYmxlX3R5cGUgbmliYmxlc1s0XTsKLSAgaW50IGFyY2g7Ci19IHNoX29wY29kZV9pbmZvOwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi0KLXNoX29wY29kZV9pbmZvIHNoX3RhYmxlW10gPSB7Ci0KLS8qIDAxMTFubm5uaTgqMS4uLi4gYWRkICM8aW1tPiw8UkVHX04+ICAqL3siYWRkIix7QV9JTU0sQV9SRUdfTn0se0hFWF83LFJFR19OLElNTTBfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMCBhZGQgPFJFR19NPiw8UkVHX04+ICoveyJhZGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTAgYWRkYyA8UkVHX00+LDxSRUdfTj4qL3siYWRkYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMTExMSBhZGR2IDxSRUdfTT4sPFJFR19OPioveyJhZGR2Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9GfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTAwMWk4KjEuLi4uIGFuZCAjPGltbT4sUjAgICAgICAgKi97ImFuZCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOSxJTU0wXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDEgYW5kIDxSRUdfTT4sPFJFR19OPiAqL3siYW5kIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF85fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTTBfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAxMGkxMi4uLi4uLi4uLiBicmEgPGJkaXNwMTI+ICAgICAgICoveyJicmEiLHtBX0JESVNQMTJ9LHtIRVhfQSxCUkFOQ0hfMTJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMTFpMTIuLi4uLi4uLi4gYnNyIDxiZGlzcDEyPiAgICAgICAqL3siYnNyIix7QV9CRElTUDEyfSx7SEVYX0IsQlJBTkNIXzEyfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDAwMTAwMWk4cDEuLi4uIGJ0IDxiZGlzcDg+ICAgICAgICAgKi97ImJ0Iix7QV9CRElTUDh9LHtIRVhfOCxIRVhfOSxCUkFOQ0hfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDEwMTFpOHAxLi4uLiBiZiA8YmRpc3A4PiAgICAgICAgICoveyJiZiIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0IsQlJBTkNIXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQucyA8YmRpc3A4PiAgICAgICAqL3siYnQucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQvcyA8YmRpc3A4PiAgICAgICAqL3siYnQvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYucyA8YmRpc3A4PiAgICAgICAqL3siYmYucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYvcyA8YmRpc3A4PiAgICAgICAqL3siYmYvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDAwMDAwMDAwMDAxMDEwMDAgY2xybWFjICAgICAgICAgICAgICAqL3siY2xybWFjIix7MH0se0hFWF8wLEhFWF8wLEhFWF8yLEhFWF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAxMDAxMDAwIGNscnMgICAgICAgICAgICAgICAgKi97ImNscnMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzQsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMDAgY2xydCAgICAgICAgICAgICAgICAqL3siY2xydCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDEwMDBpOCoxLi4uLiBjbXAvZXEgIzxpbW0+LFIwICAgICoveyJjbXAvZXEiLHtBX0lNTSxBX1IwfSx7SEVYXzgsSEVYXzgsSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMDAwIGNtcC9lcSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2VxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8wfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMDExIGNtcC9nZSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2dlIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8zfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMTExIGNtcC9ndCA8UkVHX00+LDxSRUdfTj4qL3siY21wL2d0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMTEwIGNtcC9oaSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hpIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMDEwIGNtcC9ocyA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDEwMTAxIGNtcC9wbCA8UkVHX04+ICAgICAgKi97ImNtcC9wbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfNX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMSBjbXAvcHogPFJFR19OPiAgICAgICoveyJjbXAvcHoiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzF9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTExMDAgY21wL3N0ciA8UkVHX00+LDxSRUdfTj4qL3siY21wL3N0ciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQ30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMDExMSBkaXYwcyA8UkVHX00+LDxSRUdfTj4qL3siZGl2MHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMDEgZGl2MHUgICAgICAgICAgICAgICAqL3siZGl2MHUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTAxMDAgZGl2MSA8UkVHX00+LDxSRUdfTj4qL3siZGl2MSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTExMCBleHRzLmIgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTExMSBleHRzLncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTEwMCBleHR1LmIgPFJFR19NPiw8UkVHX04+Ki97ImV4dHUuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQ30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTEwMSBleHR1LncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHUudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMSBqbXAgQDxSRUdfTj4gICAgICAgICoveyJqbXAiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0J9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMTEganNyIEA8UkVHX04+ICAgICAgICAqL3sianNyIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9CfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDAxMTEwIGxkYyA8UkVHX04+LFNSICAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDExMTEwIGxkYyA8UkVHX04+LEdCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfRX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTExMCBsZGMgPFJFR19OPixWQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0V9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDEwMTExMTAgbGRjIDxSRUdfTj4sTU9EICAgICAqL3sibGRjIix7QV9SRUdfTixBX01PRH0se0hFWF80LFJFR19OLEhFWF81LEhFWF9FfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTExMTEwIGxkYyA8UkVHX04+LFJFICAgICAqL3sibGRjIix7QV9SRUdfTixBX1JFfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYX0V9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDExMDExMTAgbGRjIDxSRUdfTj4sUlMgICAgICoveyJsZGMiLHtBX1JFR19OLEFfUlN9LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfRX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMDExMTExMCBsZGMgPFJFR19OPixTU1IgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1NSfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYX0V9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5uMDEwMDExMTAgbGRjIDxSRUdfTj4sU1BDICAgICAqL3sibGRjIix7QV9SRUdfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF9FfSwgYXJjaF9zaDNfdXB9LAotCi0vKiAwMTAwbm5ubjExMTExMDEwIGxkYyA8UkVHX04+LERCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfRixIRVhfQX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4xeHh4MTExMCBsZGMgPFJFR19OPixSbl9CQU5LICoveyJsZGMiLHtBX1JFR19OLEFfUkVHX0J9LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfRX0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMDExMSBsZGMubCBAPFJFR19OPissU1IgICoveyJsZGMubCIse0FfSU5DX04sQV9TUn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF83fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDEwMTExIGxkYy5sIEA8UkVHX04+KyxHQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF83fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMTExIGxkYy5sIEA8UkVHX04+KyxWQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX1ZCUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF83fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDEwMTExIGxkYy5sIEA8UkVHX04+KyxNT0QgKi97ImxkYy5sIix7QV9JTkNfTixBX01PRH0se0hFWF80LFJFR19OLEhFWF81LEhFWF83fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTEwMTExIGxkYy5sIEA8UkVHX04+KyxSRSAqL3sibGRjLmwiLHtBX0lOQ19OLEFfUkV9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfN30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTEwMDExMSBsZGMubCBAPFJFR19OPissUlMgKi97ImxkYy5sIix7QV9JTkNfTixBX1JTfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzd9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDAxMTAxMTEgbGRjLmwgQDxSRUdfTj4rLFNTUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1NSfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYXzd9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5uMDEwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNQQyAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1BDfSx7SEVYXzQsUkVHX04sSEVYXzQsSEVYXzd9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5uMTExMTAxMTAgbGRjLmwgQDxSRUdfTj4rLERCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYX0YsSEVYXzZ9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDAxMDBubm5uMXh4eDAxMTEgbGRjLmwgPFJFR19OPixSbl9CQU5LICoveyJsZGMubCIse0FfSU5DX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF83fSwgYXJjaF9zaDNfdXB9LAotCi0vKiAxMDAwMTExMGk4cDIuLi4uIGxkcmUgQCg8ZGlzcD4sUEMpCSoveyJsZHJlIix7QV9ESVNQX1BDfSx7SEVYXzgsSEVYX0UsUENSRUxJTU1fOEJZMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTAwMDExMDBpOHAyLi4uLiBsZHJzIEAoPGRpc3A+LFBDKQkqL3sibGRycyIse0FfRElTUF9QQ30se0hFWF84LEhFWF9DLFBDUkVMSU1NXzhCWTJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMTAgbGRzIDxSRUdfTj4sTUFDSCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0h9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfQX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMTAxMCBsZHMgPFJFR19OPixNQUNMICAgICoveyJsZHMiLHtBX1JFR19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAxMDEwIGxkcyA8UkVHX04+LFBSICAgICAgKi97ImxkcyIse0FfUkVHX04sQV9QUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAxMDEwIGxkcyA8UkVHX04+LERTUgkqL3sibGRzIix7QV9SRUdfTixBX0RTUn0se0hFWF80LFJFR19OLEhFWF82LEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTExMDEwIGxkcyA8UkVHX04+LEEwCSoveyJsZHMiLHtBX1JFR19OLEFfQTB9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDAwMTAxMCBsZHMgPFJFR19OPixYMAkqL3sibGRzIix7QV9SRUdfTixBX1gwfSx7SEVYXzQsUkVHX04sSEVYXzgsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAwMTEwMTAgbGRzIDxSRUdfTj4sWDEJKi97ImxkcyIse0FfUkVHX04sQV9YMX0se0hFWF80LFJFR19OLEhFWF85LEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMTAxMDEwIGxkcyA8UkVHX04+LFkwCSoveyJsZHMiLHtBX1JFR19OLEFfWTB9LHtIRVhfNCxSRUdfTixIRVhfQSxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDExMTAxMCBsZHMgPFJFR19OPixZMQkqL3sibGRzIix7QV9SRUdfTixBX1kxfSx7SEVYXzQsUkVHX04sSEVYX0IsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDEwMTEwMTAgbGRzIDxSRUdfTj4sRlBVTCAgICAqL3sibGRzIix7QV9SRUdfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfQX0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAxMDBubm5uMDExMDEwMTAgbGRzIDxSRUdfTT4sRlBTQ1IgICAqL3sibGRzIix7QV9SRUdfTSxGUFNDUl9OfSx7SEVYXzQsUkVHX00sSEVYXzYsSEVYX0F9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDAwMTEwIGxkcy5sIEA8UkVHX04+KyxNQUNIKi97Imxkcy5sIix7QV9JTkNfTixBX01BQ0h9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDExMCBsZHMubCBAPFJFR19OPissTUFDTCoveyJsZHMubCIse0FfSU5DX04sQV9NQUNMfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzZ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFBSICAqL3sibGRzLmwiLHtBX0lOQ19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMTEwMDExMCBsZHMubCBAPFJFR19OPissRFNSCSoveyJsZHMubCIse0FfSU5DX04sQV9EU1J9LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfNn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTExMDExMCBsZHMubCBAPFJFR19OPissQTAJKi97Imxkcy5sIix7QV9JTkNfTixBX0EwfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzZ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAwMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFgwCSoveyJsZHMubCIse0FfSU5DX04sQV9YMH0se0hFWF80LFJFR19OLEhFWF84LEhFWF82fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMDEwMTEwIGxkcy5sIEA8UkVHX04+KyxYMQkqL3sibGRzLmwiLHtBX0lOQ19OLEFfWDF9LHtIRVhfNCxSRUdfTixIRVhfOSxIRVhfNn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDEwMDExMCBsZHMubCBAPFJFR19OPissWTAJKi97Imxkcy5sIix7QV9JTkNfTixBX1kwfSx7SEVYXzQsUkVHX04sSEVYX0EsSEVYXzZ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAxMTAxMTAgbGRzLmwgQDxSRUdfTj4rLFkxCSoveyJsZHMubCIse0FfSU5DX04sQV9ZMX0se0hFWF80LFJFR19OLEhFWF9CLEhFWF82fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDEwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFVMKi97Imxkcy5sIix7QV9JTkNfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfNn0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAxMDBubm5uMDExMDAxMTAgbGRzLmwgQDxSRUdfTT4rLEZQU0NSKi97Imxkcy5sIix7QV9JTkNfTSxGUFNDUl9OfSx7SEVYXzQsUkVHX00sSEVYXzYsSEVYXzZ9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAwMDAwMDAwMDAwMTExMDAwIGxkdGxiICAgICAgICAgICAgICAgKi97ImxkdGxiIix7MH0se0hFWF8wLEhFWF8wLEhFWF8zLEhFWF84fSwgYXJjaF9zaDNfdXB9LAotCi0vKiAwMTAwbm5ubm1tbW0xMTExIG1hYy53IEA8UkVHX00+KyxAPFJFR19OPisqL3sibWFjLnciLHtBX0lOQ19NLEFfSU5DX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfRn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTExMG5ubm5pOCoxLi4uLiBtb3YgIzxpbW0+LDxSRUdfTj4gICoveyJtb3YiLHtBX0lNTSxBX1JFR19OfSx7SEVYX0UsUkVHX04sSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0wMDExIG1vdiA8UkVHX00+LDxSRUdfTj4gKi97Im1vdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMTAwIG1vdi5iIDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMDAwIG1vdi5iIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzB9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAwMTAwbW1tbWk0KjEgbW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LmIiLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF80LFJFR19NLElNTTBfNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDAxMDBpOCoxLi4uLiBtb3YuYiBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi5iIix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzQsSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubm1tbW0xMTAwIG1vdi5iIEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YuYiIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfQ30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDEwMCBtb3YuYiBAPFJFR19NPissPFJFR19OPioveyJtb3YuYiIse0FfSU5DX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0wMDAwIG1vdi5iIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDAwMDBtbW1taTQqMSBtb3YuYiBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YuYiIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzAsUkVHX00sSU1NMV80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDAwMGk4KjEuLi4uIG1vdi5iIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMCxJTU0xXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDFubm5ubW1tbWk0KjQgbW92LmwgPFJFR19NPixAKDxkaXNwPiw8UkVHX04+KSoveyJtb3YubCIseyBBX1JFR19NLEFfRElTUF9SRUdfTn0se0hFWF8xLFJFR19OLFJFR19NLElNTTFfNEJZNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMTEwIG1vdi5sIDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi5sIix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMDEwIG1vdi5sIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDFubm5ubW1tbWk0KjQgbW92LmwgQCg8ZGlzcD4sPFJFR19NPiksPFJFR19OPioveyJtb3YubCIse0FfRElTUF9SRUdfTSxBX1JFR19OfSx7SEVYXzUsUkVHX04sUkVHX00sSU1NMF80Qlk0fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDExMGk4KjQuLi4uIG1vdi5sIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmwiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNixJTU0wXzhCWTR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDFubm5uaThwNC4uLi4gbW92LmwgQCg8ZGlzcD4sUEMpLDxSRUdfTj4qL3sibW92LmwiLHtBX0RJU1BfUEMsQV9SRUdfTn0se0hFWF9ELFJFR19OLFBDUkVMSU1NXzhCWTR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTExMTAgbW92LmwgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0wMTEwIG1vdi5sIEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzZ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTAwMTAgbW92LmwgQDxSRUdfTT4sPFJFR19OPioveyJtb3YubCIse0FfSU5EX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDAxMGk4KjQuLi4uIG1vdi5sIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmwiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMixJTU0xXzhCWTR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMDEgbW92LncgPFJFR19NPixAKFIwLDxSRUdfTj4pKi97Im1vdi53Iix7IEFfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMDEwMSBtb3YudyA8UkVHX00+LEAtPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMDAwMSBtb3YudyA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi53Iix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8xfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDAwMDEwMW1tbW1pNCoyIG1vdi53IEAoPGRpc3A+LDxSRUdfTT4pLFIwKi97Im1vdi53Iix7QV9ESVNQX1JFR19NLEFfUjB9LHtIRVhfOCxIRVhfNSxSRUdfTSxJTU0wXzRCWTJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDAwMTAxaTgqMi4uLi4gbW92LncgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YudyIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF81LElNTTBfOEJZMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMW5ubm5pOHAyLi4uLiBtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YudyIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYXzksUkVHX04sUENSRUxJTU1fOEJZMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMTEwMSBtb3YudyBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LnciLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0R9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMDEgbW92LncgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LnciLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDAwMSBtb3YudyBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzF9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAwMDAxbW1tbWk0KjIgbW92LncgUjAsQCg8ZGlzcD4sPFJFR19NPikqL3sibW92LnciLHtBX1IwLEFfRElTUF9SRUdfTX0se0hFWF84LEhFWF8xLFJFR19NLElNTTFfNEJZMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDAwMDFpOCoyLi4uLiBtb3YudyBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi53Iix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzEsSU1NMF84QlkyfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDExMWk4cDQuLi4uIG1vdmEgQCg8ZGlzcD4sUEMpLFIwKi97Im1vdmEiLHtBX0RJU1BfUEMsQV9SMH0se0hFWF9DLEhFWF83LFBDUkVMSU1NXzhCWTR9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDAwbm5ubjExMDAwMDExIG1vdmNhLmwgUjAsQDxSRUdfTj4gKi97Im1vdmNhLmwiLHtBX1IwLEFfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQyxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotCi0vKiAwMDAwbm5ubjAwMTAxMDAxIG1vdnQgPFJFR19OPiAgICAgICAgKi97Im1vdnQiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTExMTEgbXVscy53IDxSRUdfTT4sPFJFR19OPioveyJtdWxzLnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTEgbXVsLmwgPFJFR19NPiw8UkVHX04+Ki97Im11bC5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDJfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMTEwIG11bHUudyA8UkVHX00+LDxSRUdfTj4qL3sibXVsdS53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0xMDExIG5lZyA8UkVHX00+LDxSRUdfTj4gKi97Im5lZyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAxMCBuZWdjIDxSRUdfTT4sPFJFR19OPioveyJuZWdjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDExMSBub3QgPFJFR19NPiw8UkVHX04+ICoveyJub3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDAwbm5ubjEwMDEwMDExIG9jYmkgQDxSRUdfTj4gICAgICAgKi97Im9jYmkiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYXzksSEVYXzN9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotLyogMDAwMG5ubm4xMDExMDAxMSBvY2J3YiBAPFJFR19OPiAgICAgICoveyJvY2J3YiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQixIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotCi0vKiAxMTAwMTAxMWk4KjEuLi4uIG9yICM8aW1tPixSMCAgICAgICAgKi97Im9yIix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF9CLElNTTBfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMTAxMSBvciA8UkVHX00+LDxSRUdfTj4gICoveyJvciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDExMTFpOCoxLi4uLiBvci5iICM8aW1tPixAKFIwLEdCUikqL3sib3IuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0YsSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubjEwMDAwMDExIHByZWYgQDxSRUdfTj4gICAgICAgKi97InByZWYiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYXzgsSEVYXzN9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDAgcm90Y2wgPFJFR19OPiAgICAgICAqL3sicm90Y2wiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDEgcm90Y3IgPFJFR19OPiAgICAgICAqL3sicm90Y3IiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzV9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDAgcm90bCA8UkVHX04+ICAgICAgICAqL3sicm90bCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMDEwMSByb3RyIDxSRUdfTj4gICAgICAgICoveyJyb3RyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF81fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAwMTAxMDExIHJ0ZSAgICAgICAgICAgICAgICAgKi97InJ0ZSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMDAwMDAwMDAwMTAxMSBydHMgICAgICAgICAgICAgICAgICoveyJydHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzAsSEVYX0J9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDEwMTEwMDAgc2V0cyAgICAgICAgICAgICAgICAqL3sic2V0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfNSxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLS8qIDAwMDAwMDAwMDAwMTEwMDAgc2V0dCAgICAgICAgICAgICAgICAqL3sic2V0dCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDEwMCBzZXRyYyA8UkVHX04+ICAgICAgICoveyJzZXRyYyIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfNH0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTAwMDAwMTBpOCoxLi4uLiBzZXRyYyAjPGltbT4gICAgICAgICoveyJzZXRyYyIse0FfSU1NfSx7SEVYXzgsSEVYXzIsSU1NMF84fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiByZXBlYXQgc3RhcnQgZW5kIDxSRUdfTj4gICAgICAgCSoveyJyZXBlYXQiLHtBX0RJU1BfUEMsQV9ESVNQX1BDLEFfUkVHX059LHtSRVBFQVQsUkVHX04sSEVYXzEsSEVYXzR9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIHJlcGVhdCBzdGFydCBlbmQgIzxpbW0+ICAgICAgICAJKi97InJlcGVhdCIse0FfRElTUF9QQyxBX0RJU1BfUEMsQV9JTU19LHtSRVBFQVQsSEVYXzIsSU1NMF84LEhFWF84fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5ubW1tbTExMDEgc2hsZCA8UkVHX00+LDxSRUdfTj4qL3sic2hsZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMDAwMCBzaGFsIDxSRUdfTj4gICAgICAgICoveyJzaGFsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8wfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDAgc2hsbCA8UkVHX04+ICAgICAgICAqL3sic2hsbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMCBzaGxsMTYgPFJFR19OPiAgICAgICoveyJzaGxsMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDAgc2hsbDggPFJFR19OPiAgICAgICAqL3sic2hsbDgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDEgc2hsciA8UkVHX04+ICAgICAgICAqL3sic2hsciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDEgc2hscjIgPFJFR19OPiAgICAgICAqL3sic2hscjIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDEgc2hscjggPFJFR19OPiAgICAgICAqL3sic2hscjgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAwMDAwMTAgc3RjIFNSLDxSRUdfTj4gICAgICAqL3sic3RjIix7QV9TUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAwMTAwMTAgc3RjIEdCUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9HQlIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8xLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm4wMTAxMDAxMCBzdGMgTU9ELDxSRUdfTj4gICAgICoveyJzdGMiLHtBX01PRCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzUsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMDExMTAwMTAgc3RjIFJFLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1JFLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNyxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4wMTEwMDAxMCBzdGMgUlMsPFJFR19OPiAgICAgKi97InN0YyIse0FfUlMsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF82LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDAwMG5ubm4wMTAwMDAxMCBzdGMgU1BDLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1NQQyxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzQsSEVYXzJ9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAwMDBubm5uMDAxMTEwMTAgc3RjIFNHUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9TR1IsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8zLEhFWF9BfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAwMDAwbm5ubjExMTExMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfRixIRVhfQX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDAwMG5ubm4xeHh4MDAxMCBzdGMgUm5fQkFOSyw8UkVHX04+ICoveyJzdGMiLHtBX1JFR19CLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfQixIRVhfMn0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMDAxMSBzdGMubCBTUixALTxSRUdfTj4gICoveyJzdGMubCIse0FfU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8zfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMDExIHN0Yy5sIFZCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9WQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8zfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDEwMDExIHN0Yy5sIE1PRCxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9NT0QsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF81LEhFWF8zfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTEwMDExIHN0Yy5sIFJFLEAtPFJFR19OPiAgKi97InN0Yy5sIix7QV9SRSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzN9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDExMDAwMTEgc3RjLmwgUlMsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1JTLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfM30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMTAwMDAxMSBzdGMubCBTUEMsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1BDLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDAxMSBzdGMubCBHQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfR0JSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfM30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDExMDAxMCBzdGMubCBTR1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU0dSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfMn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4xMTExMDAxMCBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfRixIRVhfMn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4xeHh4MDAxMSBzdGMubCBSbl9CQU5LLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1JFR19CLEFfREVDX059LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDAwMG5ubm4wMDAwMTAxMCBzdHMgTUFDSCw8UkVHX04+ICAgICoveyJzdHMiLHtBX01BQ0gsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubjAwMDExMDEwIHN0cyBNQUNMLDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDTCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAxMDEwMTAgc3RzIFBSLDxSRUdfTj4gICAgICAqL3sic3RzIix7QV9QUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDExMDEwMTAgc3RzIERTUiw8UkVHX04+CSoveyJzdHMiLHtBX0RTUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzYsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMDExMTEwMTAgc3RzIEEwLDxSRUdfTj4JKi97InN0cyIse0FfQTAsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF83LEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjEwMDAxMDEwIHN0cyBYMCw8UkVHX04+CSoveyJzdHMiLHtBX1gwLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4xMDAxMTAxMCBzdHMgWDEsPFJFR19OPgkqL3sic3RzIix7QV9YMSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzksSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMTAxMDEwMTAgc3RzIFkwLDxSRUdfTj4JKi97InN0cyIse0FfWTAsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF9BLEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjEwMTExMDEwIHN0cyBZMSw8UkVHX04+CSoveyJzdHMiLHtBX1kxLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfQixIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4wMTAxMTAxMCBzdHMgRlBVTCw8UkVHX04+ICAgICoveyJzdHMiLHtGUFVMX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF81LEhFWF9BfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDAwMG5ubm4wMTEwMTAxMCBzdHMgRlBTQ1IsPFJFR19OPiAgICoveyJzdHMiLHtGUFNDUl9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfQX0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTAgc3RzLmwgTUFDSCxALTxSRUdfTj4qL3sic3RzLmwiLHtBX01BQ0gsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDEwMDEwIHN0cy5sIE1BQ0wsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNMLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMDAxMCBzdHMubCBQUixALTxSRUdfTj4gICoveyJzdHMubCIse0FfUFIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAwMTEwIHN0cy5sIERTUixALTxSRUdfTj4JKi97InN0cy5sIix7QV9EU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF82LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTEwMTEwIHN0cy5sIEEwLEAtPFJFR19OPgkqL3sic3RzLmwiLHtBX0EwLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDAwMDExMCBzdHMubCBYMCxALTxSRUdfTj4JKi97InN0cy5sIix7QV9YMCxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzgsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAwMTAxMTAgc3RzLmwgWDEsQC08UkVHX04+CSoveyJzdHMubCIse0FfWDEsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF85LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMTAwMTEwIHN0cy5sIFkwLEAtPFJFR19OPgkqL3sic3RzLmwiLHtBX1kwLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfQSxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDExMDExMCBzdHMubCBZMSxALTxSRUdfTj4JKi97InN0cy5sIix7QV9ZMSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYX0IsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDEwMTAwMTAgc3RzLmwgRlBVTCxALTxSRUdfTj4qL3sic3RzLmwiLHtGUFVMX00sQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF81LEhFWF8yfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDEwMG5ubm4wMTEwMDAxMCBzdHMubCBGUFNDUixALTxSRUdfTj4qL3sic3RzLmwiLHtGUFNDUl9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfMn0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMDAgc3ViIDxSRUdfTT4sPFJFR19OPiAqL3sic3ViIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0xMDEwIHN1YmMgPFJFR19NPiw8UkVHX04+Ki97InN1YmMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMTEgc3VidiA8UkVHX00+LDxSRUdfTj4qL3sic3VidiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAwMCBzd2FwLmIgPFJFR19NPiw8UkVHX04+Ki97InN3YXAuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAwMSBzd2FwLncgPFJFR19NPiw8UkVHX04+Ki97InN3YXAudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMTAxMSB0YXMuYiBAPFJFR19OPiAgICAgICoveyJ0YXMuYiIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDAwMTFpOCoxLi4uLiB0cmFwYSAjPGltbT4gICAgICAgICoveyJ0cmFwYSIse0FfSU1NfSx7SEVYX0MsSEVYXzMsSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTAwMGk4KjEuLi4uIHRzdCAjPGltbT4sUjAgICAgICAgKi97InRzdCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOCxJTU0wXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDAgdHN0IDxSRUdfTT4sPFJFR19OPiAqL3sidHN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTEwMGk4KjEuLi4uIHRzdC5iICM8aW1tPixAKFIwLEdCUikqL3sidHN0LmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9DLElNTTBfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDEwMTBpOCoxLi4uLiB4b3IgIzxpbW0+LFIwICAgICAgICoveyJ4b3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0EsSU1NMF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMDEwIHhvciA8UkVHX00+LDxSRUdfTj4gKi97InhvciIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfQX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDExMTBpOCoxLi4uLiB4b3IuYiAjPGltbT4sQChSMCxHQlIpKi97Inhvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRSxJTU0wXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTExMDEgeHRyY3QgPFJFR19NPiw8UkVHX04+Ki97Inh0cmN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9EfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubm1tbW0wMTExIG11bC5sIDxSRUdfTT4sPFJFR19OPioveyJtdWwubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfN30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMCBkdCA8UkVHX04+ICAgICAgICAgICoveyJkdCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMSBkbXVscy5sIDxSRUdfTT4sPFJFR19OPioveyJkbXVscy5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9EfSwgYXJjaF9zaDJfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMTAxIGRtdWx1LmwgPFJFR19NPiw8UkVHX04+Ki97ImRtdWx1LmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzV9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTExMTEgbWFjLmwgQDxSRUdfTT4rLEA8UkVHX04+KyoveyJtYWMubCIse0FfSU5DX00sQV9JTkNfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9GfSwgYXJjaF9zaDJfdXB9LAotCi0vKiAwMDAwbm5ubjAwMTAwMDExIGJyYWYgPFJFR19OPiAgICAgICAqL3siYnJhZiIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfM30sIGFyY2hfc2gyX3VwfSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMSBic3JmIDxSRUdfTj4gICAgICAgKi97ImJzcmYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzN9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTAwMDAgbW92cy53IEAtPFJFR19OPiw8RFNQX1JFR19NPiAqLyAgIHsibW92cy53Iix7QV9ERUNfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzB9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTAwMDEgbW92cy53IEA8UkVHX04+LDxEU1BfUkVHX00+ICovICAgIHsibW92cy53Iix7QV9JTkRfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTAwMTAgbW92cy53IEA8UkVHX04+Kyw8RFNQX1JFR19NPiAqLyAgIHsibW92cy53Iix7QV9JTkNfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTAwMTEgbW92cy53IEA8UkVHX04+K3I4LDxEU1BfUkVHX00+ICovIHsibW92cy53Iix7QV9QTU9EX04sRFNQX1JFR19NfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF8zfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMTAwIG1vdnMudyA8RFNQX1JFR19NPixALTxSRUdfTj4gKi8gICB7Im1vdnMudyIse0RTUF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMTAxIG1vdnMudyA8RFNQX1JFR19NPixAPFJFR19OPiAqLyAgICB7Im1vdnMudyIse0RTUF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF81fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMTEwIG1vdnMudyA8RFNQX1JFR19NPixAPFJFR19OPisgKi8gICB7Im1vdnMudyIse0RTUF9SRUdfTSxBX0lOQ19OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMTExIG1vdnMudyA8RFNQX1JFR19NPixAPFJFR19OPityOCAqLyB7Im1vdnMudyIse0RTUF9SRUdfTSxBX1BNT0RfTn0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfN30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMTAwMCBtb3ZzLmwgQC08UkVHX04+LDxEU1BfUkVHX00+ICovICAgeyJtb3ZzLmwiLHtBX0RFQ19OLERTUF9SRUdfTX0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMTAwMSBtb3ZzLmwgQDxSRUdfTj4sPERTUF9SRUdfTT4gKi8gICAgeyJtb3ZzLmwiLHtBX0lORF9OLERTUF9SRUdfTX0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMTAxMCBtb3ZzLmwgQDxSRUdfTj4rLDxEU1BfUkVHX00+ICovICAgeyJtb3ZzLmwiLHtBX0lOQ19OLERTUF9SRUdfTX0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMTAxMSBtb3ZzLmwgQDxSRUdfTj4rcjgsPERTUF9SRUdfTT4gKi8geyJtb3ZzLmwiLHtBX1BNT0RfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYX0J9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTExMDAgbW92cy5sIDxEU1BfUkVHX00+LEAtPFJFR19OPiAqLyAgIHsibW92cy5sIix7RFNQX1JFR19NLEFfREVDX059LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTExMDEgbW92cy5sIDxEU1BfUkVHX00+LEA8UkVHX04+ICovICAgIHsibW92cy5sIix7RFNQX1JFR19NLEFfSU5EX059LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYX0R9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTExMTAgbW92cy5sIDxEU1BfUkVHX00+LEA8UkVHX04+KyAqLyAgIHsibW92cy5sIix7RFNQX1JFR19NLEFfSU5DX059LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYX0V9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTExMTEgbW92cy5sIDxEU1BfUkVHX00+LEA8UkVHX04+K3I4ICovIHsibW92cy5sIix7RFNQX1JFR19NLEFfUE1PRF9OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF9GfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwKjAqMCowMCoqIG5vcHggKi8geyJub3B4Iix7MH0se1BQSSxOT1BYfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKjAqMCowKiowMCBub3B5ICovIHsibm9weSIsezB9LHtQUEksTk9QWX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIG4qbSowKjAxKiogbW92eC53IEA8UkVHX04+LDxEU1BfUkVHX1g+ICovICAgIHsibW92eC53Iix7QV9JTkRfTixEU1BfUkVHX1h9LHtQUEksTU9WWCxIRVhfMX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIG4qbSowKjEwKiogbW92eC53IEA8UkVHX04+Kyw8RFNQX1JFR19YPiAqLyAgIHsibW92eC53Iix7QV9JTkNfTixEU1BfUkVHX1h9LHtQUEksTU9WWCxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIG4qbSowKjExKiogbW92eC53IEA8UkVHX04+K3I4LDxEU1BfUkVHX1g+ICovIHsibW92eC53Iix7QV9QTU9EX04sRFNQX1JFR19YfSx7UFBJLE1PVlgsSEVYXzN9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMSowMSoqIG1vdngudyA8RFNQX1JFR19NPixAPFJFR19OPiAqLyAgICB7Im1vdngudyIse0RTUF9SRUdfTSxBX0lORF9OfSx7UFBJLE1PVlgsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMSoxMCoqIG1vdngudyA8RFNQX1JFR19NPixAPFJFR19OPisgKi8gICB7Im1vdngudyIse0RTUF9SRUdfTSxBX0lOQ19OfSx7UFBJLE1PVlgsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMSoxMSoqIG1vdngudyA8RFNQX1JFR19NPixAPFJFR19OPityOCAqLyB7Im1vdngudyIse0RTUF9SRUdfTSxBX1BNT0RfTn0se1BQSSxNT1ZYLEhFWF9CfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSowKiowMSBtb3Z5LncgQDxSRUdfTj4sPERTUF9SRUdfWT4gKi8gICAgeyJtb3Z5LnciLHtBX0lORF9OLERTUF9SRUdfWX0se1BQSSxNT1ZZLEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSowKioxMCBtb3Z5LncgQDxSRUdfTj4rLDxEU1BfUkVHX1k+ICovICAgeyJtb3Z5LnciLHtBX0lOQ19OLERTUF9SRUdfWX0se1BQSSxNT1ZZLEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSowKioxMSBtb3Z5LncgQDxSRUdfTj4rcjksPERTUF9SRUdfWT4gKi8geyJtb3Z5LnciLHtBX1BNT0RZX04sRFNQX1JFR19ZfSx7UFBJLE1PVlksSEVYXzN9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAqbiptKjEqKjAxIG1vdnkudyA8RFNQX1JFR19NPixAPFJFR19OPiAqLyAgICB7Im1vdnkudyIse0RTUF9SRUdfTSxBX0lORF9OfSx7UFBJLE1PVlksSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAqbiptKjEqKjEwIG1vdnkudyA8RFNQX1JFR19NPixAPFJFR19OPisgKi8gICB7Im1vdnkudyIse0RTUF9SRUdfTSxBX0lOQ19OfSx7UFBJLE1PVlksSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAqbiptKjEqKjExIG1vdnkudyA8RFNQX1JFR19NPixAPFJFR19OPityOSAqLyB7Im1vdnkudyIse0RTUF9SRUdfTSxBX1BNT0RZX059LHtQUEksTU9WWSxIRVhfQn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDFhYWVlZmZ4eHl5Z2dubiBwbXVscyBTZSxTZixEZyAqLyB7InBtdWxzIix7RFNQX1JFR19FLERTUF9SRUdfRixEU1BfUkVHX0d9LHtQUEksUE1VTH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTAwMDAweHh5eW5ubm4gcHN1YmMgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicHN1YmMiLHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUEkzLEhFWF9BLEhFWF8wfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMTAwMDB4eHl5bm5ubiBwYWRkYyA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwYWRkYyIse0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYX0IsSEVYXzB9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAwMDEwMHh4eXlubm5uIHBjbXAgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4gKi8KLXsicGNtcCIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZfSx7UFBJLFBQSTMsSEVYXzgsSEVYXzR9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDEwMDEwMHh4eXlubm5uIHB3c2IgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicHdzYiIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUEkzLEhFWF9BLEhFWF80fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMTAxMDB4eHl5bm5ubiBwd2FkIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InB3YWQiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfQixIRVhfNH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMDAxMDAweHh5eW5ubm4gcGFicyA8RFNQX1JFR19YPiw8RFNQX1JFR19OPiAqLwoteyJwYWJzIiwge0RTUF9SRUdfWCxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfOCxIRVhfOH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTAxMDAweHh5eW5ubm4gcGFicyA8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwYWJzIiwge0RTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfQSxIRVhfOH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMDExMDAweHh5eW5ubm4gcHJuZCA8RFNQX1JFR19YPiw8RFNQX1JFR19OPiAqLwoteyJwcm5kIiwge0RTUF9SRUdfWCxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfOSxIRVhfOH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTExMDAweHh5eW5ubm4gcHJuZCA8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwcm5kIiwge0RTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfQixIRVhfOH0sIGFyY2hfc2hfZHNwX3VwfSwKLQoteyJkY3QiLHswfSx7UFBJLFBEQyxIRVhfMX0sIGFyY2hfc2hfZHNwX3VwfSwKLXsiZGNmIix7MH0se1BQSSxQREMsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDEwMDAwMDAxeHh5eW5ubm4gcHNobCA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwc2hsIiwge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYXzgsSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAwMDAwMGlpaWlpaWlubm5uIHBzaGwgIzxpbW0+LDxEU1BfUkVHX04+ICovIHsicHNobCIse0FfSU1NLERTUF9SRUdfTn0se1BQSSxQU0gsSEVYXzB9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAxMDAwMXh4eXlubm5uIHBzaGEgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicHNoYSIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF85LEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMDAwMTBpaWlpaWlpbm5ubiBwc2hhICM8aW1tPiw8RFNQX1JFR19OPiAqLyB7InBzaGEiLHtBX0lNTSxEU1BfUkVHX059LHtQUEksUFNILEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMDAwMDF4eHl5bm5ubiBwc3ViIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBzdWIiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfQSxIRVhfMX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTEwMDAxeHh5eW5ubm4gcGFkZCA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwYWRkIiwge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0IsSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAxMDEwMXh4eXlubm5uIHBhbmQgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGFuZCIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF85LEhFWF81fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMDAxMDF4eHl5bm5ubiBweG9yIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InB4b3IiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfQSxIRVhfNX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTEwMTAxeHh5eW5ubm4gcG9yICA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwb3IiLCAge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0IsSEVYXzV9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAwMTAwMXh4eXlubm5uIHBkZWMgPERTUF9SRUdfWD4sPERTUF9SRUdfTj4gKi8KLXsicGRlYyIsIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYXzgsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDEwMTAwMXh4eXlubm5uIHBkZWMgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGRlYyIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0EsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAxMTAwMXh4eXlubm5uIHBpbmMgPERTUF9SRUdfWD4sPERTUF9SRUdfTj4gKi8KLXsicGluYyIsIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYXzksSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDExMTAwMXh4eXlubm5uIHBpbmMgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGluYyIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0IsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAwMTEwMXh4eXlubm5uIHBjbHIgPERTUF9SRUdfTj4gKi8KLXsicGNsciIsIHtEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfOCxIRVhfRH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMDExMTAxeHh5eW5ubm4gcGRtc2IgPERTUF9SRUdfWD4sPERTUF9SRUdfTj4gKi8KLXsicGRtc2IiLCB7RFNQX1JFR19YLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF85LEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMTExMDF4eHl5bm5ubiBwZG1zYiA8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwZG1zYiIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0IsSEVYX0R9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTAwMTAwMXh4eXlubm5uIHBuZWcgIDxEU1BfUkVHX1g+LDxEU1BfUkVHX04+ICovCi17InBuZWciLCAge0RTUF9SRUdfWCxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfQyxIRVhfOX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDExMTAxMDAxeHh5eW5ubm4gcG5lZyAgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicG5lZyIsICB7RFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9FLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTEwMTEwMDF4eHl5bm5ubiBwY29weSA8RFNQX1JFR19YPiw8RFNQX1JFR19OPiAqLwoteyJwY29weSIsIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0QsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTExMTAwMXh4eXlubm5uIHBjb3B5IDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBjb3B5Iiwge0RTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfRixIRVhfOX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDExMDAxMTAxeHh5eW5ubm4gcHN0cyBNQUNILDxEU1BfUkVHX04+ICovCi17InBzdHMiLCB7QV9NQUNILERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9DLEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTEwMTExMDF4eHl5bm5ubiBwc3RzIE1BQ0wsPERTUF9SRUdfTj4gKi8KLXsicHN0cyIsIHtBX01BQ0wsRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0QsSEVYX0R9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTEwMTEwMXh4eXlubm5uIHBsZHMgPERTUF9SRUdfTj4sTUFDSCAqLwoteyJwbGRzIiwge0RTUF9SRUdfTixBX01BQ0h9LHtQUEksUFBJQyxIRVhfRSxIRVhfRH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDExMTExMTAxeHh5eW5ubm4gcGxkcyA8RFNQX1JFR19OPixNQUNMICovCi17InBsZHMiLCB7RFNQX1JFR19OLEFfTUFDTH0se1BQSSxQUElDLEhFWF9GLEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExbm5ubjAxMDExMTAxIGZhYnMgPEZfUkVHX04+ICAgICAqL3siZmFicyIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNSxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubjAxMDExMTAxIGZhYnMgPERfUkVHX04+ICAgICAqL3siZmFicyIse0RfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNSxIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDAwMCBmYWRkIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmFkZCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8wfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAwMDAgZmFkZCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZhZGQiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDEwMCBmY21wL2VxIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmNtcC9lcSIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAxMDAgZmNtcC9lcSA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZjbXAvZXEiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDEwMSBmY21wL2d0IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmNtcC9ndCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF81fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAxMDEgZmNtcC9ndCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZjbXAvZ3QiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubjAxMDExMTEwMSBmY252ZHMgPERfUkVHX04+LEZQVUwqL3siZmNudmRzIix7RF9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfQixIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubjAxMDEwMTEwMSBmY252c2QgRlBVTCw8RF9SRUdfTj4qL3siZmNudnNkIix7RlBVTF9NLERfUkVHX059LHtIRVhfRixSRUdfTixIRVhfQSxIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDAxMSBmZGl2IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZmRpdiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8zfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAwMTEgZmRpdiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZkaXYiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubW0xMTEwMTEwMSBmaXByIDxWX1JFR19NPiw8Vl9SRUdfTj4qL3siZmlwciIse1ZfUkVHX00sVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRSxIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm4xMDAwMTEwMSBmbGRpMCA8Rl9SRUdfTj4gICAgKi97ImZsZGkwIix7Rl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF84LEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm4xMDAxMTEwMSBmbGRpMSA8Rl9SRUdfTj4gICAgKi97ImZsZGkxIix7Rl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF85LEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm4wMDAxMTEwMSBmbGRzIDxGX1JFR19OPixGUFVMKi97ImZsZHMiLHtGX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8xLEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm4wMDEwMTEwMSBmbG9hdCBGUFVMLDxGX1JFR19OPioveyJmbG9hdCIse0ZQVUxfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzIsSEVYX0R9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm4wMDEwMTEwMSBmbG9hdCBGUFVMLDxEX1JFR19OPioveyJmbG9hdCIse0ZQVUxfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzIsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTExMTAgZm1hYyBGUjAsPEZfUkVHX00+LDxGX1JFR19OPioveyJmbWFjIix7Rl9GUjAsRl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0V9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMTAwIGZtb3YgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm5tbW1tMTEwMCBmbW92IDxEWF9SRUdfTT4sPERYX1JFR19OPioveyJmbW92Iix7RFhfUkVHX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQ30sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5EX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxGX1JFR19NPixAPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxEWF9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92IEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdiBAPFJFR19NPissPERYX1JFR19OPioveyJmbW92Iix7QV9JTkNfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YgPEZfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92IDxEWF9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5EX1IwX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8RFhfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdiIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5kIEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMDEwIGZtb3YuZCA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92LmQgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkNfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YuZCA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdi5kIEAoUjAsPFJFR19NPiksPERYX1JFR19OPioveyJmbW92LmQiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YuZCA8RFhfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdi5kIix7RFhfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN30sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92LnMgQDxSRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92LnMgPEZfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YucyIse0ZfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92LnMgQDxSRUdfTT4rLDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lOQ19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdi5zIDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5zIix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YucyBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lORF9SMF9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YucyA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMDEwIGZtdWwgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbXVsIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzJ9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubjBtbW0wMDAxMCBmbXVsIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZm11bCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubjAxMDAxMTAxIGZuZWcgPEZfUkVHX04+ICAgICAqL3siZm5lZyIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNCxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubjAxMDAxMTAxIGZuZWcgPERfUkVHX04+ICAgICAqL3siZm5lZyIse0RfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNCxIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMTEwMTExMTExMTEwMSBmcmNoZyAgICAgICAgICAgICAgICoveyJmcmNoZyIsezB9LHtIRVhfRixIRVhfQixIRVhfRixIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMTAwMTExMTExMTEwMSBmc2NoZyAgICAgICAgICAgICAgICoveyJmc2NoZyIsezB9LHtIRVhfRixIRVhfMyxIRVhfRixIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm4wMTEwMTEwMSBmc3FydCA8Rl9SRUdfTj4gICAgKi97ImZzcXJ0Iix7Rl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF82LEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5uMDExMDExMDEgZnNxcnQgPERfUkVHX04+ICAgICoveyJmc3FydCIse0RfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNixIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm4wMDAwMTEwMSBmc3RzIEZQVUwsPEZfUkVHX04+Ki97ImZzdHMiLHtGUFVMX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF8wLEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDAwMSBmc3ViIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZnN1YiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8xfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAwMDEgZnN1YiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZzdWIiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm4wMDExMTEwMSBmdHJjIDxGX1JFR19OPixGUFVMKi97ImZ0cmMiLHtGX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8zLEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5uMDAxMTExMDEgZnRyYyA8RF9SRUdfTj4sRlBVTCoveyJmdHJjIix7RF9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfMyxIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5uMDExMTExMTEwMSBmdHJ2IFhNVFJYX000LDxWX1JFR19uPioveyJmdHJ2Iix7WE1UUlhfTTQsVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRixIRVhfRH0sIGFyY2hfc2g0X3VwfSwKLQoteyAwIH0gCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvc3BhcmMtZGlzLmMgYi9vcGNvZGVzL3NwYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTk1ZDBmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3BhcmMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzMgKzAsMCBAQAotLyogUHJpbnQgU1BBUkMgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEJpdG1hc2sgb2YgdjkgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIE1BU0tfVjkgKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KSBcCi0JCSB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpCi0vKiAxIGlmIElOU04gaXMgZm9yIHY5IG9ubHkuICAqLwotI2RlZmluZSBWOV9PTkxZX1AoaW5zbikgKCEgKChpbnNuKS0+YXJjaGl0ZWN0dXJlICYgfk1BU0tfVjkpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OS4gICovCi0jZGVmaW5lIFY5X1AoaW5zbikgKCgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIE1BU0tfVjkpICE9IDApCi0KLS8qIFRoZSBzb3J0ZWQgb3Bjb2RlIHRhYmxlLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqc29ydGVkX29wY29kZXM7Ci0KLS8qIEZvciBmYXN0ZXIgbG9va3VwLCBhZnRlciBpbnNucyBhcmUgc29ydGVkIHRoZXkgYXJlIGhhc2hlZC4gICovCi0vKiA/Pz8gSSB0aGluayB0aGVyZSBpcyByb29tIGZvciBldmVuIG1vcmUgaW1wcm92ZW1lbnQuICAqLwotCi0jZGVmaW5lIEhBU0hfU0laRSAyNTYKLS8qIEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG9ubHkgbG9vayBhdCBpbnNuIGNvZGUgYml0cyBhcyB0aGF0IGlzIGhvdyB0aGUKLSAgIG9wY29kZSB0YWJsZSBpcyBoYXNoZWQuICBPUENPREVfQklUUyBpcyBhIHRhYmxlIG9mIHZhbGlkIGJpdHMgZm9yIGVhY2gKLSAgIG9mIHRoZSBtYWluIHR5cGVzICgwLDEsMiwzKS4gICovCi1zdGF0aWMgaW50IG9wY29kZV9iaXRzWzRdID0geyAweDAxYzAwMDAwLCAweDAsIDB4MDFmODAwMDAsIDB4MDFmODAwMDAgfTsKLSNkZWZpbmUgSEFTSF9JTlNOKElOU04pIFwKLSAgKCgoKElOU04pID4+IDI0KSAmIDB4YzApIHwgKCgoSU5TTikgJiBvcGNvZGVfYml0c1soKElOU04pID4+IDMwKSAmIDNdKSA+PiAxOSkpCi1zdHJ1Y3Qgb3Bjb2RlX2hhc2ggewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm5leHQ7Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZTsKLX07Ci1zdGF0aWMgc3RydWN0IG9wY29kZV9oYXNoICpvcGNvZGVfaGFzaF90YWJsZVtIQVNIX1NJWkVdOwotCi1zdGF0aWMgdm9pZCBidWlsZF9oYXNoX3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiosIHN0cnVjdCBvcGNvZGVfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGlzX2RlbGF5ZWRfYnJhbmNoIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9vcGNvZGVzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgaW50IGNvbXB1dGVfYXJjaF9tYXNrIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotLyogU2lnbi1leHRlbmQgYSB2YWx1ZSB3aGljaCBpcyBOIGJpdHMgbG9uZy4gICovCi0jZGVmaW5lCVNFWCh2YWx1ZSwgYml0cykgXAotCSgoKChpbnQpKHZhbHVlKSkgPDwgKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpKQlcCi0JCQkgPj4gKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpICkKLQotc3RhdGljICBjaGFyICpyZWdfbmFtZXNbXSA9Ci17ICJnMCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsCQotICAibzAiLCAibzEiLCAibzIiLCAibzMiLCAibzQiLCAibzUiLCAic3AiLCAibzciLAkKLSAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJCi0gICJpMCIsICJpMSIsICJpMiIsICJpMyIsICJpNCIsICJpNSIsICJmcCIsICJpNyIsCQotICAiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLAkKLSAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJCi0gICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwKLSAgImYyNCIsICJmMjUiLCAiZjI2IiwgImYyNyIsICJmMjgiLCAiZjI5IiwgImYzMCIsICJmMzEiLAotICAiZjMyIiwgImYzMyIsICJmMzQiLCAiZjM1IiwgImYzNiIsICJmMzciLCAiZjM4IiwgImYzOSIsCQotICAiZjQwIiwgImY0MSIsICJmNDIiLCAiZjQzIiwgImY0NCIsICJmNDUiLCAiZjQ2IiwgImY0NyIsCQotICAiZjQ4IiwgImY0OSIsICJmNTAiLCAiZjUxIiwgImY1MiIsICJmNTMiLCAiZjU0IiwgImY1NSIsCi0gICJmNTYiLCAiZjU3IiwgImY1OCIsICJmNTkiLCAiZjYwIiwgImY2MSIsICJmNjIiLCAiZjYzIiwKLS8qIHBzciwgd2ltLCB0YnIsIGZwc3IsIGNwc3IgYXJlIHY4IG9ubHkuICAqLwotICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnBzciIsICJjcHNyIgotfTsKLQotI2RlZmluZQlmcmVnX25hbWVzCSgmcmVnX25hbWVzWzQgKiA4XSkKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmRwciBhbmQgd3JwciBpbnNucy4gICovCi1zdGF0aWMgY2hhciAqdjlfcHJpdl9yZWdfbmFtZXNbXSA9Ci17Ci0gICJ0cGMiLCAidG5wYyIsICJ0c3RhdGUiLCAidHQiLCAidGljayIsICJ0YmEiLCAicHN0YXRlIiwgInRsIiwKLSAgInBpbCIsICJjd3AiLCAiY2Fuc2F2ZSIsICJjYW5yZXN0b3JlIiwgImNsZWFud2luIiwgIm90aGVyd2luIiwKLSAgIndzdGF0ZSIsICJmcSIKLSAgLyogInZlciIgLSBzcGVjaWFsIGNhc2VkICovCi19OwotCi0vKiBUaGVzZSBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlcmUgcmVnaXN0ZXIgbnVtYmVyIGluCi0gICByZCBhbmQgd3IgaW5zbnMgKC0xNikuICAqLwotc3RhdGljIGNoYXIgKnY5YV9hc3JfcmVnX25hbWVzW10gPQotewotICAicGNyIiwgInBpYyIsICJkY3IiLCAiZ3NyIiwgInNldF9zb2Z0aW50IiwgImNsZWFyX3NvZnRpbnQiLAotICAic29mdGludCIsICJ0aWNrX2NtcHIiCi19OwotCi0vKiBNYWNyb3MgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcy4gIE5vdCBhbGwgZmllbGRzIGhhdmUKLSAgIG1hY3JvcyBkZWZpbmVkIGhlcmUsIG9ubHkgdGhvc2Ugd2hpY2ggYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFhfUkQoaSkgKCgoaSkgPj4gMjUpICYgMHgxZikKLSNkZWZpbmUgWF9SUzEoaSkgKCgoaSkgPj4gMTQpICYgMHgxZikKLSNkZWZpbmUgWF9MRFNUX0koaSkgKCgoaSkgPj4gMTMpICYgMSkKLSNkZWZpbmUgWF9BU0koaSkgKCgoaSkgPj4gNSkgJiAweGZmKQotI2RlZmluZSBYX1JTMihpKSAoKChpKSA+PiAwKSAmIDB4MWYpCi0jZGVmaW5lIFhfSU1NKGksbikgKCgoaSkgPj4gMCkgJiAoKDEgPDwgKG4pKSAtIDEpKQotI2RlZmluZSBYX1NJTU0oaSxuKSBTRVggKFhfSU1NICgoaSksIChuKSksIChuKSkKLSNkZWZpbmUgWF9ESVNQMjIoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZikKLSNkZWZpbmUgWF9JTU0yMihpKSBYX0RJU1AyMiAoaSkKLSNkZWZpbmUgWF9ESVNQMzAoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZmZmKQotCi0vKiBUaGVzZSBhcmUgZm9yIHY5LiAgKi8KLSNkZWZpbmUgWF9ESVNQMTYoaSkgKCgoKChpKSA+PiAyMCkgJiAzKSA8PCAxNCkgfCAoKChpKSA+PiAwKSAmIDB4M2ZmZikpCi0jZGVmaW5lIFhfRElTUDE5KGkpICgoKGkpID4+IDApICYgMHg3ZmZmZikKLSNkZWZpbmUgWF9NRU1CQVIoaSkgKChpKSAmIDB4N2YpCi0KLS8qIEhlcmUgaXMgdGhlIHVuaW9uIHdoaWNoIHdhcyB1c2VkIHRvIGV4dHJhY3QgaW5zdHJ1Y3Rpb24gZmllbGRzCi0gICBiZWZvcmUgdGhlIHNoaWZ0IGFuZCBtYXNrIG1hY3JvcyB3ZXJlIHdyaXR0ZW4uCi0KLSAgIHVuaW9uIHNwYXJjX2luc24KLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGNvZGU7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgICNkZWZpbmUJb3AJbGRzdC5hbm9wCi0JICAgdW5zaWduZWQgaW50IGFucmQ6NTsKLQkgICAjZGVmaW5lCXJkCWxkc3QuYW5yZAotCSAgIHVuc2lnbmVkIGludCBvcDM6NjsKLQkgICB1bnNpZ25lZCBpbnQgYW5yczE6NTsKLQkgICAjZGVmaW5lCXJzMQlsZHN0LmFucnMxCi0JICAgdW5zaWduZWQgaW50IGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgYW5hc2k6ODsKLQkgICAjZGVmaW5lCWFzaQlsZHN0LmFuYXNpCi0JICAgdW5zaWduZWQgaW50IGFucnMyOjU7Ci0JICAgI2RlZmluZQlyczIJbGRzdC5hbnJzMgotCSAgICNkZWZpbmUJc2hjbnQJcnMyCi0JIH0gbGRzdDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjIsIGFucmQ6NSwgb3AzOjYsIGFucnMxOjUsIGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgSU1NMTM6MTM7Ci0JICAgI2RlZmluZQlpbW0xMwlJTU0xMy5JTU0xMwotCSB9IElNTTEzOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCBjb25kOjQ7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMjI6MjI7Ci0JICAgI2RlZmluZQlkaXNwMjIJYnJhbmNoLkRJU1AyMgotCSAgICNkZWZpbmUJaW1tMjIJZGlzcDIyCi0JIH0gYnJhbmNoOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCB6OjE7Ci0JICAgdW5zaWduZWQgaW50IHJjb25kOjM7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMTZISToyOwotCSAgIHVuc2lnbmVkIGludCBwOjE7Ci0JICAgdW5zaWduZWQgaW50IF9yczE6NTsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2TE86MTQ7Ci0JIH0gYnJhbmNoMTY7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgIHVuc2lnbmVkIGludCBhZGlzcDMwOjMwOwotCSAgICNkZWZpbmUJZGlzcDMwCWNhbGwuYWRpc3AzMAotCSB9IGNhbGw7Ci0gICAgIH07Ci0KLSAgICovCi0KLS8qIE5vbnplcm8gaWYgSU5TTiBpcyB0aGUgb3Bjb2RlIGZvciBhIGRlbGF5ZWQgYnJhbmNoLiAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0KLSAgZm9yIChvcCA9IG9wY29kZV9oYXNoX3RhYmxlW0hBU0hfSU5TTiAoaW5zbildOyBvcDsgb3AgPSBvcC0+bmV4dCkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGUgPSBvcC0+b3Bjb2RlOwotICAgICAgaWYgKChvcGNvZGUtPm1hdGNoICYgaW5zbikgPT0gb3Bjb2RlLT5tYXRjaAotCSAgJiYgKG9wY29kZS0+bG9zZSAmIGluc24pID09IDApCi0JcmV0dXJuIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBleHRlcm4gdm9pZCBxc29ydCAoKTsgKi8KLQotLyogUmVjb3JkcyBjdXJyZW50IG1hc2sgb2YgU1BBUkNfT1BDT0RFX0FSQ0hfRk9PIHZhbHVlcywgdXNlZCB0byBwYXNzIHZhbHVlCi0gICB0byBjb21wYXJlX29wY29kZXMuICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2FyY2hfbWFzazsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0KLSAgIFdlIHN1ZmZpeCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNvbW1lbnQgdGhhdCBnaXZlcyB0aGUgYWJzb2x1dGUKLSAgIGFkZHJlc3MgaW52b2x2ZWQsIGFzIHdlbGwgYXMgaXRzIHN5bWJvbGljIGZvcm0sIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgaXMgcHJlY2VkZWQgYnkgYSBmaW5kYWJsZSBgc2V0aGknIGFuZCBpdCBlaXRoZXIgYWRkcyBhbiBpbW1lZGlhdGUKLSAgIGRpc3BsYWNlbWVudCB0byB0aGF0IHJlZ2lzdGVyLCBvciBpdCBpcyBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uCi0gICBvbiB0aGF0IHJlZ2lzdGVyLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3NwYXJjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0gIC8qIE5vbnplcm8gb2Ygb3Bjb2RlIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLSAgc3RhdGljIGludCBvcGNvZGVzX2luaXRpYWxpemVkID0gMDsKLSAgLyogYmZkIG1hY2ggbnVtYmVyIG9mIGxhc3QgY2FsbC4gICovCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfbWFjaCA9IDA7Ci0gIGJmZF92bWEgKCpnZXR3b3JkKSBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLQotICBpZiAoIW9wY29kZXNfaW5pdGlhbGl6ZWQKLSAgICAgIHx8IGluZm8tPm1hY2ggIT0gY3VycmVudF9tYWNoKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBjdXJyZW50X2FyY2hfbWFzayA9IGNvbXB1dGVfYXJjaF9tYXNrIChpbmZvLT5tYWNoKTsKLQotICAgICAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkKQotCXNvcnRlZF9vcGNvZGVzID0gKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopCi0JICB4bWFsbG9jIChzcGFyY19udW1fb3Bjb2RlcyAqIHNpemVvZiAoc3RydWN0IHNwYXJjX29wY29kZSAqKSk7Ci0gICAgICAvKiBSZXNldCB0aGUgc29ydGVkIHRhYmxlIHNvIHdlIGNhbiByZXNvcnQgaXQuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IHNwYXJjX251bV9vcGNvZGVzOyArK2kpCi0Jc29ydGVkX29wY29kZXNbaV0gPSAmc3BhcmNfb3Bjb2Rlc1tpXTsKLSAgICAgIHFzb3J0ICgoY2hhciAqKSBzb3J0ZWRfb3Bjb2Rlcywgc3BhcmNfbnVtX29wY29kZXMsCi0JICAgICBzaXplb2YgKHNvcnRlZF9vcGNvZGVzWzBdKSwgY29tcGFyZV9vcGNvZGVzKTsKLQotICAgICAgYnVpbGRfaGFzaF90YWJsZSAoc29ydGVkX29wY29kZXMsIG9wY29kZV9oYXNoX3RhYmxlLCBzcGFyY19udW1fb3Bjb2Rlcyk7Ci0gICAgICBjdXJyZW50X21hY2ggPSBpbmZvLT5tYWNoOwotICAgICAgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDE7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgLyogT24gU1BBUkNsaXRlIHZhcmlhbnRzIHN1Y2ggYXMgREFObGl0ZSAoc3BhcmM4NngpLCBpbnN0cnVjdGlvbnMKLSAgICAgYXJlIGFsd2F5cyBiaWctZW5kaWFuIGV2ZW4gd2hlbiB0aGUgbWFjaGluZSBpcyBpbiBsaXR0bGUtZW5kaWFuIG1vZGUuICovCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUpCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRiMzI7Ci0gIGVsc2UKLSAgICBnZXR3b3JkID0gYmZkX2dldGwzMjsKLQotICBpbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwkJCS8qIFdlIGRvIHJldHVybiB0aGlzIGluZm8gKi8KLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsJCS8qIEFzc3VtZSBub24gYnJhbmNoIGluc24gKi8KLSAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsJCQkvKiBBc3N1bWUgbm8gZGVsYXkgKi8KLSAgaW5mby0+dGFyZ2V0ID0gMDsJCQkJLyogQXNzdW1lIG5vIHRhcmdldCBrbm93biAqLwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLQotICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwgc2tpcCBpdC4gICovCi0gICAgICBpZiAoISAob3Bjb2RlLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXsKLQkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcwotCSAgICAgdGhlIGVmZmVjdCBvZiBhZGRpbmcgb3Igb3InaW5nIHRoZSBpbW0xMyBmaWVsZCB0byByczEuICAqLwotCSAgaW50IGltbV9hZGRlZF90b19yczEgPSAwOwotCSAgaW50IGltbV9vcmVkX3RvX3JzMSA9IDA7Ci0KLQkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGEgcGx1cyBzaWduIGluIHRoZSBhcmdzCi0JICAgICBmaWVsZCBvZiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQkgIGludCBmb3VuZF9wbHVzID0gMDsKLQkgIAotCSAgLyogTm9uemVybyBtZWFucyB3ZSBoYXZlIGFuIGFubnVsbGVkIGJyYW5jaC4gICovCi0JICBpbnQgaXNfYW5udWxsZWQgPSAwOwotCi0JICAvKiBEbyB3ZSBoYXZlIGFuIGBhZGQnIG9yIGBvcicgaW5zdHJ1Y3Rpb24gY29tYmluaW5nIGFuCi0gICAgICAgICAgICAgaW1tZWRpYXRlIHdpdGggcnMxPyAgKi8KLQkgIGlmIChvcGNvZGUtPm1hdGNoID09IDB4ODAxMDIwMDApIC8qIG9yICovCi0JICAgIGltbV9vcmVkX3RvX3JzMSA9IDE7Ci0JICBpZiAob3Bjb2RlLT5tYXRjaCA9PSAweDgwMDAyMDAwKSAvKiBhZGQgKi8KLQkgICAgaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0KLQkgIGlmIChYX1JTMSAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ3InKSAhPSAwKQotCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgaWYgKFhfUlMyIChpbnNuKSAhPSBYX1JEIChpbnNuKQotCSAgICAgICYmIHN0cmNociAob3Bjb2RlLT5hcmdzLCAnTycpICE9IDApCi0JICAgICAgLyogQ2FuJ3QgZG8gc2ltcGxlIGZvcm1hdCBpZiBzb3VyY2UgYW5kIGRlc3QgYXJlIGRpZmZlcmVudC4gICovCi0JICAgICAgY29udGludWU7Ci0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCBvcGNvZGUtPm5hbWUpOwotCi0JICB7Ci0JICAgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnM7Ci0KLQkgICAgaWYgKG9wY29kZS0+YXJnc1swXSAhPSAnLCcpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIgIik7Ci0JICAgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICAgIHsKLQkJd2hpbGUgKCpzID09ICcsJykKLQkJICB7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiwiKTsKLQkJICAgICsrczsKLQkJICAgIHN3aXRjaCAoKnMpIHsKLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgImEiKTsKLQkJICAgICAgaXNfYW5udWxsZWQgPSAxOwotCQkgICAgICArK3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgY2FzZSAnTic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicG4iKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnVCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicHQiKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9CQkvKiBzd2l0Y2ggb24gYXJnICovCi0JCSAgfQkJLyogd2hpbGUgdGhlcmUgYXJlIGNvbW1hIHN0YXJ0ZWQgYXJncyAqLwotCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOwotCQkJCi0JCXN3aXRjaCAoKnMpCi0JCSAgewotCQkgIGNhc2UgJysnOgotCQkgICAgZm91bmRfcGx1cyA9IDE7Ci0KLQkJICAgIC8qIG5vdGUgZmFsbC10aHJvdWdoICovCi0JCSAgZGVmYXVsdDoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWMiLCAqcyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyMnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICBicmVhazsKLQotI2RlZmluZQlyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgcmVnX25hbWVzW25dKQotCQkgIGNhc2UgJzEnOgotCQkgIGNhc2UgJ3InOgotCQkgICAgcmVnIChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcyJzoKLQkJICBjYXNlICdPJzoKLQkJICAgIHJlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZCc6Ci0JCSAgICByZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCXJlZwotCi0jZGVmaW5lCWZyZWcobikJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbbl0pCi0jZGVmaW5lCWZyZWd4KG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbKChuKSAmIH4xKSB8ICgoKG4pICYgMSkgPDwgNSldKQotCQkgIGNhc2UgJ2UnOgotCQkgICAgZnJlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ3YnOgkvKiBkb3VibGUvZXZlbiAqLwotCQkgIGNhc2UgJ1YnOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KLQkJICAgIGZyZWd4IChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdmJzoKLQkJICAgIGZyZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdCJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdSJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgICBmcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdIJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdKJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0jdW5kZWYJZnJlZwotI3VuZGVmCWZyZWd4Ci0KLSNkZWZpbmUJY3JlZyhuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYyV1IiwgKHVuc2lnbmVkIGludCkgKG4pKQotCQkgIGNhc2UgJ2InOgotCQkgICAgY3JlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnYyc6Ci0JCSAgICBjcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdEJzoKLQkJICAgIGNyZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCWNyZWcKLQotCQkgIGNhc2UgJ2gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWhpKCUjeCkiLAotCQkJCQkgICAoMHhGRkZGRkZGRgotCQkJCQkgICAgJiAoKGludCkgWF9JTU0yMiAoaW5zbikgPDwgMTApKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2knOgkvKiAxMyBiaXQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnSSc6CS8qIDExIGJpdCBpbW1lZGlhdGUgKi8KLQkJICBjYXNlICdqJzoJLyogMTAgYml0IGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tOwotCi0JCSAgICAgIGlmICgqcyA9PSAnaScpCi0JCSAgICAgICAgaW1tID0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgIGVsc2UgaWYgKCpzID09ICdJJykKLQkJCWltbSA9IFhfU0lNTSAoaW5zbiwgMTEpOwotCQkgICAgICBlbHNlCi0JCQlpbW0gPSBYX1NJTU0gKGluc24sIDEwKTsKLQotCQkgICAgICAvKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgMStpLCBhbmQgdGFrZQotCQkJIG5vdGUgb2YgdGhhdCBmYWN0LgotCi0JCQkgTm90ZTogYmVjYXVzZSBvZiB0aGUgd2F5IHdlIHNvcnQgdGhlIHRhYmxlLAotCQkJIHdlIHdpbGwgYmUgbWF0Y2hpbmcgMStpIHJhdGhlciB0aGFuIGkrMSwKLQkJCSBzbyBpdCBpcyBPSyB0byBhc3N1bWUgdGhhdCBpIGlzIGFmdGVyICssCi0JCQkgbm90IGJlZm9yZSBpdC4gICovCi0JCSAgICAgIGlmIChmb3VuZF9wbHVzKQotCQkJaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlI3giLCBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdYJzoJLyogNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnWSc6CS8qIDYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tID0gWF9JTU0gKGluc24sICpzID09ICdYJyA/IDUgOiA2KTsKLQotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBpbW0pOwotCQkgICAgICBlbHNlCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgKHVuc2lnbmVkKSBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdLJzoKLQkJICAgIHsKLQkJICAgICAgaW50IG1hc2sgPSBYX01FTUJBUiAoaW5zbik7Ci0JCSAgICAgIGludCBiaXQgPSAweDQwLCBwcmludGVkX29uZSA9IDA7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgICAgaWYgKG1hc2sgPT0gMCkKLQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICAgIGVsc2UKLQkJCXdoaWxlIChiaXQpCi0JCQkgIHsKLQkJCSAgICBpZiAobWFzayAmIGJpdCkKLQkJCSAgICAgIHsKLQkJCQlpZiAocHJpbnRlZF9vbmUpCi0JCQkJICAoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAifCIpOwotCQkJCW5hbWUgPSBzcGFyY19kZWNvZGVfbWVtYmFyIChiaXQpOwotCQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkJCXByaW50ZWRfb25lID0gMTsKLQkJCSAgICAgIH0KLQkJCSAgICBiaXQgPj49IDE7Ci0JCQkgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdrJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDE2IChpbnNuKSwgMTYpICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRyc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxOSAoaW5zbiksIDE5KSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJzYnOgotCQkgIGNhc2UgJzcnOgotCQkgIGNhc2UgJzgnOgotCQkgIGNhc2UgJzknOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZjYyVjIiwgKnMgLSAnNicgKyAnMCcpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd6JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVpY2MiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnWic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleGNjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0UnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNjciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdzJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcHJzIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ28nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzaSIpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdXJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0aWNrIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJz8nOgotCQkgICAgaWYgKFhfUlMxIChpbnNuKSA9PSAzMSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXZlciIpOwotCQkgICAgZWxzZSBpZiAoKHVuc2lnbmVkKSBYX1JTMSAoaW5zbikgPCAxNikKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JTMSAoaW5zbildKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyEnOgotCQkgICAgaWYgKCh1bnNpZ25lZCkgWF9SRCAoaW5zbikgPCAxNSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JEIChpbnNuKV0pOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnLyc6Ci0JCSAgICBpZiAoWF9SUzEgKGluc24pIDwgMTYgfHwgWF9SUzEgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUlMxIChpbnNuKS0xNl0pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdfJzoKLQkJICAgIGlmIChYX1JEIChpbnNuKSA8IDE2IHx8IFhfUkQgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUkQgKGluc24pLTE2XSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyonOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3ByZWZldGNoIChYX1JEIChpbnNuKSk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBYX1JEIChpbnNuKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgICAgCi0JCSAgY2FzZSAnTSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdtJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc3IlZCIsIFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnTCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AzMCAoaW5zbiksIDMwKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ24nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChzdHJlYW0sICIlI3giLCBTRVggKFhfRElTUDIyIChpbnNuKSwgMjIpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnbCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0EnOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX2FzaSAoWF9BU0kgKGluc24pKTsKLQotCQkgICAgICBpZiAobmFtZSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIoJWQpIiwgWF9BU0kgKGluc24pKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdDJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnNyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdxJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdRJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd0JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0YnIiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUld2ltIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsCi0JCQkJCSAgICgoWF9MRFNUX0kgKGluc24pIDw8IDgpCi0JCQkJCSAgICArIFhfQVNJIChpbnNuKSkpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd5JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV5Iik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3UnOgotCQkgIGNhc2UgJ1UnOgotCQkgICAgewotCQkgICAgICBpbnQgdmFsID0gKnMgPT0gJ1UnID8gWF9SUzEgKGluc24pIDogWF9SRCAoaW5zbik7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbCk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcHJlZyglZCkiLCB2YWwpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICAvKiBJZiB3ZSBhcmUgYWRkaW5nIG9yIG9yJ2luZyBzb21ldGhpbmcgdG8gcnMxLCB0aGVuCi0JICAgICBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzCi0JICAgICBhIHNldGhpIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIGluIHRoZSBzZXRoaS4KLQkgICAgIElmIHNvLCBhdHRlbXB0IHRvIHByaW50IHRoZSByZXN1bHQgb2YgdGhlIGFkZCBvcgotCSAgICAgb3IgKGluIHRoaXMgY29udGV4dCBhZGQgYW5kIG9yIGRvIHRoZSBzYW1lIHRoaW5nKQotCSAgICAgYW5kIGl0cyBzeW1ib2xpYyB2YWx1ZS4gICovCi0JICBpZiAoaW1tX29yZWRfdG9fcnMxIHx8IGltbV9hZGRlZF90b19yczEpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHByZXZfaW5zbjsKLQkgICAgICBpbnQgZXJyY29kZTsKLQotCSAgICAgIGVycmNvZGUgPQotCQkoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCSAgKG1lbWFkZHIgLSA0LCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0JICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYW5jaC4gIFRoaXMgaGFuZGxlcwotCQkgICAgIHNlcXVlbmNlcyBzdWNoIGFzCi0KLQkJICAgICBzZXRoaSAlbzEsICVoaShfZm9vKSwgJW8xCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgb3IgJW8xLCAlbG8oX2ZvbyksICVvMQotCQkgICAgICovCi0KLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkJICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IHNldGhpLiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgc2V0aGkgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmICgocHJldl9pbnNuICYgMHhjMWMwMDAwMCkgPT0gMHgwMTAwMDAwMAotCQkgICAgICAmJiBYX1JEIChwcmV2X2luc24pID09IFhfUlMxIChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJcdCEgIik7Ci0JCSAgICAgIGluZm8tPnRhcmdldCA9IAotCQkJKDB4RkZGRkZGRkYgJiAoaW50KSBYX0lNTTIyIChwcmV2X2luc24pIDw8IDEwKTsKLQkJICAgICAgaWYgKGltbV9hZGRlZF90b19yczEpCi0JCQlpbmZvLT50YXJnZXQgKz0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgIGVsc2UKLQkJCWluZm8tPnRhcmdldCB8PSBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJICAgICAgaW5mby0+ZGF0YV9zaXplID0gNDsgIC8qIEZJWE1FISEhICovCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAob3Bjb2RlLT5mbGFncyAmIChGX1VOQlJ8Rl9DT05EQlJ8Rl9KU1IpKQotCSAgICB7Ci0JCS8qIEZJWE1FIC0tIGNoZWNrIGlzX2FubnVsbGVkIGZsYWcgKi8KLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfVU5CUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfQ09OREJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfSlNSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKQotCQlpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICB9Ci0KLQkgIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsJLyogTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sIF8oInVua25vd24iKSk7Ci0gIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci19Ci0KLS8qIEdpdmVuIEJGRCBtYWNoIG51bWJlciwgcmV0dXJuIGEgbWFzayBvZiBTUEFSQ19PUENPREVfQVJDSF9GT08gdmFsdWVzLiAgKi8KLQotc3RhdGljIGludAotY29tcHV0ZV9hcmNoX21hc2sgKG1hY2gpCi0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIDAgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmMgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlIDoKLSAgICAgIC8qIHNwYXJjbGl0ZXMgaW5zbnMgYXJlIHJlY29nbml6ZWQgYnkgZGVmYXVsdCAoYmVjYXVzZSB0aGF0J3MgaG93Ci0JIHRoZXkndmUgYWx3YXlzIGJlZW4gdHJlYXRlZCwgZm9yIGJldHRlciBvciB3b3JzZSkuICBLbHVkZ2UgdGhpcyBieQotCSBpbmRpY2F0aW5nIGdlbmVyaWMgdjggaXMgYWxzbyBzZWxlY3RlZC4gICovCi0gICAgICByZXR1cm4gKFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLQkgICAgICB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KSk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjkgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjlhIDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIENvbXBhcmUgb3Bjb2RlcyBBIGFuZCBCLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9vcGNvZGVzIChhLCBiKQotICAgICBjb25zdCBQVFIgYTsKLSAgICAgY29uc3QgUFRSIGI7Ci17Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMCA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGE7Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMSA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGI7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoMCA9IG9wMC0+bWF0Y2gsIG1hdGNoMSA9IG9wMS0+bWF0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGxvc2UwID0gb3AwLT5sb3NlLCBsb3NlMSA9IG9wMS0+bG9zZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSWYgb25lIChhbmQgb25seSBvbmUpIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwKLSAgICAgcHJlZmVyIHRoZSBvbmUgdGhhdCBpcy4gIElmIG5laXRoZXIgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZXkncmUgYm90aCBmb3IKLSAgICAgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlLCBjb250aW51ZSBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIChib3RoIHVuc3VwcG9ydGVkCi0gICAgIGFuZCBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMpLCBwcmVmZXIgbG93ZXIgbnVtYmVyZWQgYXJjaCdzIChmdWRnZWQKLSAgICAgYnkgY29tcGFyaW5nIHRoZSBiaXRtYXNrcykuICAqLwotICBpZiAob3AwLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykKLSAgICB7Ci0gICAgICBpZiAoISAob3AxLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAob3AwLT5hcmNoaXRlY3R1cmUgIT0gb3AxLT5hcmNoaXRlY3R1cmUpCi0JcmV0dXJuIG9wMC0+YXJjaGl0ZWN0dXJlIC0gb3AxLT5hcmNoaXRlY3R1cmU7Ci0gICAgfQotCi0gIC8qIElmIGEgYml0IGlzIHNldCBpbiBib3RoIG1hdGNoIGFuZCBsb3NlLCB0aGVyZSBpcyBzb21ldGhpbmcKLSAgICAgd3Jvbmcgd2l0aCB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKG1hdGNoMCAmIGxvc2UwKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogIGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIiksCi0JIG9wMC0+bmFtZSwgbWF0Y2gwLCBsb3NlMCk7Ci0gICAgICBvcDAtPmxvc2UgJj0gfm9wMC0+bWF0Y2g7Ci0gICAgICBsb3NlMCA9IG9wMC0+bG9zZTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoMSAmIGxvc2UxKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AxLT5uYW1lLCBtYXRjaDEsIGxvc2UxKTsKLSAgICAgIG9wMS0+bG9zZSAmPSB+b3AxLT5tYXRjaDsKLSAgICAgIGxvc2UxID0gb3AxLT5sb3NlOwotICAgIH0KLQotICAvKiBCZWNhdXNlIHRoZSBiaXRzIHRoYXQgYXJlIHZhcmlhYmxlIGluIG9uZSBvcGNvZGUgYXJlIGNvbnN0YW50IGluCi0gICAgIGFub3RoZXIsIGl0IGlzIGltcG9ydGFudCB0byBvcmRlciB0aGUgb3Bjb2RlcyBpbiB0aGUgcmlnaHQgb3JkZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKG1hdGNoMCAmIHgpICE9IDA7Ci0gICAgICBpbnQgeDEgPSAobWF0Y2gxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKGxvc2UwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChsb3NlMSAmIHgpICE9IDA7Ci0KLSAgICAgIGlmICh4MCAhPSB4MSkKLQlyZXR1cm4geDEgLSB4MDsKLSAgICB9Ci0KLSAgLyogVGhleSBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLiAgU28gYXMgbG9uZyBhcyB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIHZhbGlkLCB3ZSBjYW4gcHV0IHdoaWNoZXZlciBvbmUgZmlyc3Qgd2Ugd2FudCwgb24gYWVzdGhldGljIGdyb3VuZHMuICAqLwotCi0gIC8qIE91ciBmaXJzdCBhZXN0aGV0aWMgZ3JvdW5kIGlzIHRoYXQgYWxpYXNlcyBkZWZlciB0byByZWFsIGluc25zLiAgKi8KLSAgewotICAgIGludCBhbGlhc19kaWZmID0gKG9wMC0+ZmxhZ3MgJiBGX0FMSUFTKSAtIChvcDEtPmZsYWdzICYgRl9BTElBUyk7Ci0gICAgaWYgKGFsaWFzX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHRoYXQgaXNuJ3QgYW4gYWxpYXMgZmlyc3QuICAqLwotICAgICAgcmV0dXJuIGFsaWFzX2RpZmY7Ci0gIH0KLQotICAvKiBFeGNlcHQgZm9yIGFsaWFzZXMsIHR3byAiaWRlbnRpY2FsIiBpbnN0cnVjdGlvbnMgaGFkCi0gICAgIGJldHRlciBoYXZlIHRoZSBzYW1lIG9wY29kZS4gIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRhYmxlLiAgKi8KLSAgaSA9IHN0cmNtcCAob3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICBpZiAoaSkKLSAgICB7Ci0gICAgICBpZiAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC8qIElmIHRoZXkncmUgYm90aCBhbGlhc2VzLCBiZSBhcmJpdHJhcnkuICovCi0JcmV0dXJuIGk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiA9PSBcIiVzXCJcbiIpLAotCQkgb3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICAgIH0KLQotICAvKiBGZXdlciBhcmd1bWVudHMgYXJlIHByZWZlcnJlZC4gICovCi0gIHsKLSAgICBpbnQgbGVuZ3RoX2RpZmYgPSBzdHJsZW4gKG9wMC0+YXJncykgLSBzdHJsZW4gKG9wMS0+YXJncyk7Ci0gICAgaWYgKGxlbmd0aF9kaWZmICE9IDApCi0gICAgICAvKiBQdXQgdGhlIG9uZSB3aXRoIGZld2VyIGFyZ3VtZW50cyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gbGVuZ3RoX2RpZmY7Ci0gIH0KLQotICAvKiBQdXQgMStpIGJlZm9yZSBpKzEuICAqLwotICB7Ci0gICAgY2hhciAqcDAgPSAoY2hhciAqKSBzdHJjaHIgKG9wMC0+YXJncywgJysnKTsKLSAgICBjaGFyICpwMSA9IChjaGFyICopIHN0cmNociAob3AxLT5hcmdzLCAnKycpOwotCi0gICAgaWYgKHAwICYmIHAxKQotICAgICAgewotCS8qIFRoZXJlIGlzIGEgcGx1cyBpbiBib3RoIG9wZXJhbmRzLiAgTm90ZSB0aGF0IGEgcGx1cwotCSAgIHNpZ24gY2Fubm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gYXJncywKLQkgICBzbyB0aGUgZm9sbG93aW5nIFstMV0ncyBhcmUgdmFsaWQuICAqLwotCWlmIChwMFstMV0gPT0gJ2knICYmIHAxWzFdID09ICdpJykKLQkgIC8qIG9wMCBpcyBpKzEgYW5kIG9wMSBpcyAxK2ksIHNvIG9wMSBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAxOwotCWlmIChwMFsxXSA9PSAnaScgJiYgcDFbLTFdID09ICdpJykKLQkgIC8qIG9wMCBpcyAxK2kgYW5kIG9wMSBpcyBpKzEsIHNvIG9wMCBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIFB1dCAxLGkgYmVmb3JlIGksMS4gICovCi0gIHsKLSAgICBpbnQgaTAgPSBzdHJuY21wIChvcDAtPmFyZ3MsICJpLDEiLCAzKSA9PSAwOwotICAgIGludCBpMSA9IHN0cm5jbXAgKG9wMS0+YXJncywgImksMSIsIDMpID09IDA7Ci0KLSAgICBpZiAoaTAgXiBpMSkKLSAgICAgIHJldHVybiBpMCAtIGkxOwotICB9Ci0KLSAgLyogVGhleSBhcmUsIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgaWRlbnRpY2FsLgotICAgICBTaW5jZSBxc29ydCBtYXkgaGF2ZSByZWFycmFuZ2VkIHRoZSB0YWJsZSBwYXJ0aWFsbHksIHRoZXJlIGlzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoaWNoIG9uZSB3YXMgZmlyc3QgaW4gdGhlIG9wY29kZSB0YWJsZSBhcwotICAgICB3cml0dGVuLCBzbyBqdXN0IHNheSB0aGVyZSBhcmUgZXF1YWwuICAqLwotICAvKiA/Pz8gVGhpcyBpcyBubyBsb25nZXIgdHJ1ZSBub3cgdGhhdCB3ZSBzb3J0IGEgdmVjdG9yIG9mIHBvaW50ZXJzLAotICAgICBub3QgdGhlIHRhYmxlIGl0c2VsZi4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBCdWlsZCBhIGhhc2ggdGFibGUgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotICAgT1BDT0RFX1RBQkxFIGlzIGEgc29ydGVkIGxpc3Qgb2YgcG9pbnRlcnMgaW50byB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2hhc2hfdGFibGUgKG9wY29kZV90YWJsZSwgaGFzaF90YWJsZSwgbnVtX29wY29kZXMpCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKipvcGNvZGVfdGFibGU7Ci0gICAgIHN0cnVjdCBvcGNvZGVfaGFzaCAqKmhhc2hfdGFibGU7Ci0gICAgIGludCBudW1fb3Bjb2RlczsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBoYXNoX2NvdW50W0hBU0hfU0laRV07Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKmhhc2hfYnVmID0gTlVMTDsKLQotICAvKiBTdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBhbmQgd29yayBiYWNrd2FyZHMgc28gdGhhdCBlYWNoCi0gICAgIGNoYWluIGlzIHNvcnRlZC4gICovCi0KLSAgbWVtc2V0IChoYXNoX3RhYmxlLCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfdGFibGVbMF0pKTsKLSAgbWVtc2V0IChoYXNoX2NvdW50LCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfY291bnRbMF0pKTsKLSAgaWYgKGhhc2hfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF9idWYpOwotICBoYXNoX2J1ZiA9IChzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3Bjb2RlX2hhc2gpICogbnVtX29wY29kZXMpOwotICBmb3IgKGkgPSBudW1fb3Bjb2RlcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBoYXNoID0gSEFTSF9JTlNOIChvcGNvZGVfdGFibGVbaV0tPm1hdGNoKTsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqaCA9ICZoYXNoX2J1ZltpXTsKLSAgICAgIGgtPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOwotICAgICAgaC0+b3Bjb2RlID0gb3Bjb2RlX3RhYmxlW2ldOwotICAgICAgaGFzaF90YWJsZVtoYXNoXSA9IGg7Ci0gICAgICArK2hhc2hfY291bnRbaGFzaF07Ci0gICAgfQotCi0jaWYgMCAvKiBmb3IgZGVidWdnaW5nICovCi0gIHsKLSAgICBpbnQgbWluX2NvdW50ID0gbnVtX29wY29kZXMsIG1heF9jb3VudCA9IDA7Ci0gICAgaW50IHRvdGFsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKQotICAgICAgewotICAgICAgICBpZiAoaGFzaF9jb3VudFtpXSA8IG1pbl9jb3VudCkKLQkgIG1pbl9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JaWYgKGhhc2hfY291bnRbaV0gPiBtYXhfY291bnQpCi0JICBtYXhfY291bnQgPSBoYXNoX2NvdW50W2ldOwotCXRvdGFsICs9IGhhc2hfY291bnRbaV07Ci0gICAgICB9Ci0KLSAgICBwcmludGYgKCJPcGNvZGUgaGFzaCB0YWJsZSBzdGF0czogbWluICVkLCBtYXggJWQsIGF2ZSAlZlxuIiwKLQkgICAgbWluX2NvdW50LCBtYXhfY291bnQsIChkb3VibGUpIHRvdGFsIC8gSEFTSF9TSVpFKTsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLW9wYy5jIGIvb3Bjb2Rlcy9zcGFyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMzJiYi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzMCArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBCRkQgbGlicmFyeS4KLQotQkZEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotdmVyc2lvbi4KLQotQkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1mb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLwotCi0vKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKLSAgIGluc3RydWN0aW9uJ3MgbmFtZSByYXRoZXIgdGhhbiB0aGUgYXJncy4gIFRoaXMgd291bGQgbWFrZSBnYXMgZmFzdGVyLCBwaW5zbgotICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotLyogU29tZSBkZWZpbmVzIHRvIG1ha2UgbGlmZSBlYXN5LiAgKi8KLSNkZWZpbmUgTUFTS19WNgkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjYpCi0jZGVmaW5lIE1BU0tfVjcJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y3KQotI2RlZmluZSBNQVNLX1Y4CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOCkKLSNkZWZpbmUgTUFTS19TUEFSQ0xFVAlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCkKLSNkZWZpbmUgTUFTS19TUEFSQ0xJVEUJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFKQotI2RlZmluZSBNQVNLX1Y5CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOSkKLSNkZWZpbmUgTUFTS19WOUEJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCi0vKiBCaXQgbWFza3Mgb2YgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0aW5nIHRoZSBpbnNuLiAgKi8KLQotI2RlZmluZSB2NgkJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0vKiB2NiBpbnNucyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGFyY2xldCAqLwotI2RlZmluZSB2Nm5vdGxldAkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSB2NwkJKE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLS8qIEFsdGhvdWdoIG5vdCBhbGwgaW5zbnMgYXJlIGltcGxlbWVudGVkIGluIGhhcmR3YXJlLCBzcGFyY2xpdGUgaXMgZGVmaW5lZAotICAgdG8gYmUgYSBzdXBlcnNldCBvZiB2OC4gIFVuaW1wbGVtZW50ZWQgaW5zbnMgdHJhcCBhbmQgYXJlIHRoZW4gdGhlb3JldGljYWxseQotICAgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUuCi0gICBJdCdzIG5vdCBjbGVhciB0aGF0IHRoZSBzYW1lIGlzIHRydWUgZm9yIHNwYXJjbGV0LCBhbHRob3VnaCB0aGUgZG9jcwotICAgc3VnZ2VzdCBpdCBpcy4gIFJhdGhlciB0aGFuIGNvbXBsaWNhdGluZyB0aGluZ3MsIHRoZSBzcGFyY2xldCBhc3NlbWJsZXIKLSAgIHJlY29nbml6ZXMgYWxsIHY4IGluc25zLiAgKi8KLSNkZWZpbmUgdjgJCShNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSBzcGFyY2xldAkoTUFTS19TUEFSQ0xFVCkKLSNkZWZpbmUgc3BhcmNsaXRlCShNQVNLX1NQQVJDTElURSkKLSNkZWZpbmUgdjkJCShNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHY5YQkJKE1BU0tfVjlBKQotLyogdjYgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB2OSAqLwotI2RlZmluZSB2Nm5vdHY5CQkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IFwKLQkJCSB8IE1BU0tfU1BBUkNMRVQgfCBNQVNLX1NQQVJDTElURSkKLS8qIHY5YSBpbnN0cnVjdGlvbnMgd2hpY2ggd291bGQgYXBwZWFyIHRvIGJlIGFsaWFzZXMgdG8gdjkncyBpbXBkZXAncwotICAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIHY5bm90djlhCShNQVNLX1Y5KQotCi0vKiBUYWJsZSBvZiBvcGNvZGUgYXJjaGl0ZWN0dXJlcy4KLSAgIFRoZSBvcmRlciBpcyBkZWZpbmVkIGluIG9wY29kZS9zcGFyYy5oLiAgKi8KLQotY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdID0gewotICB7ICJ2NiIsIE1BU0tfVjYgfSwKLSAgeyAidjciLCBNQVNLX1Y2IHwgTUFTS19WNyB9LAotICB7ICJ2OCIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB9LAotICB7ICJzcGFyY2xldCIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgfSwKLSAgeyAic3BhcmNsaXRlIiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xJVEUgfSwKLSAgLyogPz8/IERvbid0IHNvbWUgdjggcHJpdmlsZWRnZWQgaW5zbnMgY29uZmxpY3Qgd2l0aCB2OT8gICovCi0gIHsgInY5IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19WOSB9LAotICAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIHsgInY5YSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfVjkgfCBNQVNLX1Y5QSB9LAotICB7IE5VTEwsIDAgfQotfTsKLQotLyogR2l2ZW4gTkFNRSwgcmV0dXJuIGl0J3MgYXJjaGl0ZWN0dXJlIGVudHJ5LiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwKLXNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoICpwOwotCi0gIGZvciAocCA9ICZzcGFyY19vcGNvZGVfYXJjaHNbMF07IHAtPm5hbWU7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBwLT5uYW1lKSA9PSAwKQotCXJldHVybiAoZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwpIChwIC0gJnNwYXJjX29wY29kZV9hcmNoc1swXSk7Ci0gICAgfQotCi0gIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9CQUQ7Ci19Ci0MCi0vKiBCcmFuY2ggY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgQ09ORCh4KQkJKCgoeCkmMHhmKTw8MjUpCi0KLS8qIHY5OiBNb3ZlIChNT1ZjYyBhbmQgRk1PVmNjKSBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBNQ09ORCh4LGlfb3JfZikJKCgoKGlfb3JfZikmMSk8PDE4KXwoKCh4KT4+MTEpJigweGY8PDE0KSkpIC8qIHY5ICovCi0KLS8qIHY5OiBNb3ZlIHJlZ2lzdGVyIChNT1ZSY2MgYW5kIEZNT1ZSY2MpIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIFJDT05EKHgpCSgoKHgpJjB4Nyk8PDEwKQkvKiB2OSAqLwotCi0jZGVmaW5lIENPTkRBCShDT05EKDB4OCkpCi0jZGVmaW5lIENPTkRDQwkoQ09ORCgweGQpKQotI2RlZmluZSBDT05EQ1MJKENPTkQoMHg1KSkKLSNkZWZpbmUgQ09OREUJKENPTkQoMHgxKSkKLSNkZWZpbmUgQ09OREcJKENPTkQoMHhhKSkKLSNkZWZpbmUgQ09OREdFCShDT05EKDB4YikpCi0jZGVmaW5lIENPTkRHVQkoQ09ORCgweGMpKQotI2RlZmluZSBDT05ETAkoQ09ORCgweDMpKQotI2RlZmluZSBDT05ETEUJKENPTkQoMHgyKSkKLSNkZWZpbmUgQ09ORExFVQkoQ09ORCgweDQpKQotI2RlZmluZSBDT05ETgkoQ09ORCgweDApKQotI2RlZmluZSBDT05ETkUJKENPTkQoMHg5KSkKLSNkZWZpbmUgQ09ORE5FRwkoQ09ORCgweDYpKQotI2RlZmluZSBDT05EUE9TCShDT05EKDB4ZSkpCi0jZGVmaW5lIENPTkRWQwkoQ09ORCgweGYpKQotI2RlZmluZSBDT05EVlMJKENPTkQoMHg3KSkKLQotI2RlZmluZSBDT05ETloJQ09ORE5FCi0jZGVmaW5lIENPTkRaCUNPTkRFCi0jZGVmaW5lIENPTkRHRVUJQ09ORENDCi0jZGVmaW5lIENPTkRMVQlDT05EQ1MKLQotI2RlZmluZSBGQ09OREEJCShDT05EKDB4OCkpCi0jZGVmaW5lIEZDT05ERQkJKENPTkQoMHg5KSkKLSNkZWZpbmUgRkNPTkRHCQkoQ09ORCgweDYpKQotI2RlZmluZSBGQ09OREdFCQkoQ09ORCgweGIpKQotI2RlZmluZSBGQ09OREwJCShDT05EKDB4NCkpCi0jZGVmaW5lIEZDT05ETEUJCShDT05EKDB4ZCkpCi0jZGVmaW5lIEZDT05ETEcJCShDT05EKDB4MikpCi0jZGVmaW5lIEZDT05ETgkJKENPTkQoMHgwKSkKLSNkZWZpbmUgRkNPTkRORQkJKENPTkQoMHgxKSkKLSNkZWZpbmUgRkNPTkRPCQkoQ09ORCgweGYpKQotI2RlZmluZSBGQ09ORFUJCShDT05EKDB4NykpCi0jZGVmaW5lIEZDT05EVUUJCShDT05EKDB4YSkpCi0jZGVmaW5lIEZDT05EVUcJCShDT05EKDB4NSkpCi0jZGVmaW5lIEZDT05EVUdFCShDT05EKDB4YykpCi0jZGVmaW5lIEZDT05EVUwJCShDT05EKDB4MykpCi0jZGVmaW5lIEZDT05EVUxFCShDT05EKDB4ZSkpCi0KLSNkZWZpbmUgRkNPTkROWglGQ09ORE5FCi0jZGVmaW5lIEZDT05EWglGQ09OREUKLQotI2RlZmluZSBJQ0MgKDApCS8qIHY5ICovCi0jZGVmaW5lIFhDQyAoMTw8MTIpIC8qIHY5ICovCi0jZGVmaW5lIEZDQyh4KQkoKCh4KSYweDMpPDwxMSkgLyogdjkgKi8KLSNkZWZpbmUgRkJGQ0MoeCkJKCgoeCkmMHgzKTw8MjApCS8qIHY5ICovCi0MCi0vKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhlIHRhYmxlIGlzIHNpZ25pZmljYW50OgotCQotCSogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdAotCWJlIGNvbnNlY3V0aXZlLglJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotCSogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLgotCi0qLwotCi0vKiBFbnRyaWVzIGZvciBjb21tdXRhdGl2ZSBhcml0aG1ldGljIG9wZXJhdGlvbnMuICAqLwotLyogPz8/IE1vcmUgZW50cmllcyBjYW4gbWFrZSB1c2Ugb2YgdGhpcy4gICovCi0jZGVmaW5lIENPTU1VVEVPUChvcGNvZGUsIG9wMywgYXJjaF9tYXNrKSBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAwKSwgRjMofjIsIH5vcDMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBhcmNoX21hc2sgfSwgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMSksIEYzKH4yLCB+b3AzLCB+MSksCQkiMSxpLGQiLCAwLCBhcmNoX21hc2sgfSwgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMSksIEYzKH4yLCB+b3AzLCB+MSksCQkiaSwxLGQiLCAwLCBhcmNoX21hc2sgfQotCi1jb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlIHNwYXJjX29wY29kZXNbXSA9IHsKLQoteyAibGQiLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCksCQkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKXxSUzJfRzAsCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjAsIDApLCBGMyh+MywgfjB4MjAsIH4wKSwJCSJbMSsyXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMCksIEYzKH4zLCB+MHgyMCwgfjApfFJTMl9HMCwJIlsxXSxnIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpLAkJIlsxK2ldLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSksCQkiW2krMV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKXxSUzFfRzAsCSJbaV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGciLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGQiLAlGMygzLCAweDIxLCAwKSwgRjMofjMsIH4weDIxLCB+MCl8UkQofjApLAkiWzErMl0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDApLCBGMyh+MywgfjB4MjEsIH4wKXxSUzJfRzB8UkQofjApLCJbMV0sRiIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MCksCSJbMStpXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4wKSwJIltpKzFdLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UlMxX0cwfFJEKH4wKSwiW2ldLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8U0lNTTEzKH4wKXxSRCh+MCksIlsxXSxGIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApLAkJIlsxKzJdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKXxSUzJfRzAsCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIlsxK2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbaSsxXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8UlMxX0cwLAkiW2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMxLCAwKSwgRjMofjMsIH4weDMxLCB+MCksCQkiWzErMl0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMCksIEYzKH4zLCB+MHgzMSwgfjApfFJTMl9HMCwJIlsxXSxDIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSksCQkiWzEraV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpLAkJIltpKzFdLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKXxSUzFfRzAsCSJbaV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sQyIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLS8qIFRoZSB2OSBMRFVXIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgJ2xkJyBvcGNvZGUsIGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKLSAgICdsZCcgcHNldWRvLW9wIGluIHY5LiAgKi8KLXsgImxkdXciLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCksCQkiWzErMl0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApfFJTMl9HMCwJIlsxXSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiWzEraV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIltpKzFdLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGQiLAlGMygzLCAweDAzLCAwKSwgRjMofjMsIH4weDAzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMCksIEYzKH4zLCB+MHgwMywgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRkIFtyczErMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgyMywgMCksIEYzKH4zLCB+MHgyMywgfjApfEFTSSh+MCksCSJbMSsyXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDApLCBGMyh+MywgfjB4MjMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxIIiwgMCwgdjYgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSksCQkiWzEraV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSksCQkiW2krMV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSl8UlMxX0cwLAkiW2ldLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sSCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfEFTSSh+MCksCSJbMSsyXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfEFTSV9SUzIofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIlsxK2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiW2krMV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxSUzFfRzAsCSJbaV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxTSU1NMTMofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRxIiwJRjMoMywgMHgyMiwgMCksIEYzKH4zLCB+MHgyMiwgfjApfEFTSSh+MCksCSJbMSsyXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDApLCBGMyh+MywgfjB4MjIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSksCQkiWzEraV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSksCQkiW2krMV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSl8UlMxX0cwLAkiW2ldLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzYiIsCUYzKDMsIDB4MDksIDApLCBGMyh+MywgfjB4MDksIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMCksIEYzKH4zLCB+MHgwOSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNiIFtyczErJWcwXSxkICovCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNiIFtyczErMF0sZCAqLwotCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMCksIEYzKH4zLCB+MHgwYSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNoIFtyczErJWcwXSxkICovCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMCksIEYzKH4zLCB+MHgwYSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2ggW3JzMSswXSxkICovCi0KLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDApLCBGMyh+MywgfjB4MGQsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAwKSwgRjMofjMsIH4weDBkLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc3R1YiBbcnMxKyVnMF0sZCAqLwoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWIgW3JzMSswXSxkICovCi0KLXsgImxkc3ciLAlGMygzLCAweDA4LCAwKSwgRjMofjMsIH4weDA4LCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDApLCBGMyh+MywgfjB4MDgsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGRzdyBbcnMxKyVnMF0sZCAqLwoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSksCQkiW2krMV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGRzdyBbcnMxKzBdLGQgKi8KLQoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDApLCBGMyh+MywgfjB4MDEsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMCksIEYzKH4zLCB+MHgwMSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHViIFtyczErJWcwXSxkICovCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHViIFtyczErMF0sZCAqLwotCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMCksIEYzKH4zLCB+MHgwMiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAwKSwgRjMofjMsIH4weDAyLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWggW3JzMSslZzBdLGQgKi8KLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWggW3JzMSswXSxkICovCi0KLXsgImxkeCIsCUYzKDMsIDB4MGIsIDApLCBGMyh+MywgfjB4MGIsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAwKSwgRjMofjMsIH4weDBiLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkeCBbcnMxKyVnMF0sZCAqLwoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHggW3JzMSswXSxkICovCi0KLXsgImxkeCIsCUYzKDMsIDB4MjEsIDApfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4wKXxSRCh+MSksCSJbMSsyXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDApfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4wKXxSUzJfRzB8UkQofjEpLAkiWzFdLEYiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4xKSwJIlsxK2ldLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4xKSwJIltpKzFdLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJTMV9HMHxSRCh+MSksCSJbaV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8U0lNTTEzKH4wKXxSRCh+MSksIlsxXSxGIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkYSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKSwJCSJbMSsyXUEsZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCl8UlMyX0cwLAkiWzFdQSxnIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiWzEraV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIltpKzFdbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxSUzFfRzAsCSJbaV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGciLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDApLCBGMyh+MywgfjB4MTMsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMCksIEYzKH4zLCB+MHgxMywgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKSwJCSJbMSsyXUEsSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfFJTMl9HMCwJIlsxXUEsSCIsIDAsIHY5IH0sIC8qIGxkZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiWzEraV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbaSsxXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFJTMV9HMCwJIltpXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFNJTU0xMyh+MCksCSJbMV1vLEgiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDApLCBGMyh+MywgfjB4MzIsIH4wKSwJCSJbMSsyXUEsSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMCksIEYzKH4zLCB+MHgzMiwgfjApfFJTMl9HMCwJIlsxXUEsSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKSwJCSJbMStpXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpLAkJIltpKzFdbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSl8UlMxX0cwLAkiW2ldbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzYmEiLAlGMygzLCAweDE5LCAwKSwgRjMofjMsIH4weDE5LCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAwKSwgRjMofjMsIH4weDE5LCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzYmEgW3JzMSslZzBdLGQgKi8KLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMCksIEYzKH4zLCB+MHgxYSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMCksIEYzKH4zLCB+MHgxYSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc2hhIFtyczErJWcwXSxkICovCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMCksIEYzKH4zLCB+MHgxZCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAwKSwgRjMofjMsIH4weDFkLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzdHViYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDApLCBGMyh+MywgfjB4MTgsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDApLCBGMyh+MywgfjB4MTgsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMCksIEYzKH4zLCB+MHgxMSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMCksIEYzKH4zLCB+MHgxMSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkdWJhIFtyczErJWcwXSxkICovCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDApLCBGMyh+MywgfjB4MTIsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDApLCBGMyh+MywgfjB4MTIsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHVoYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1d2EiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCksCQkiWzErMl1BLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZHV3YSA9PT0gbGRhICovCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIlsxK2ldbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIltpKzFdbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkeGEiLAlGMygzLCAweDFiLCAwKSwgRjMofjMsIH4weDFiLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAic3QiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDApLCBGMyh+MywgfjB4MjQsIH4wKXxBU0kofjApLAkJImcsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJX1JTMih+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKXxSUzFfRzAsCQkiZyxbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8U0lNTTEzKH4wKSwJCSJnLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0kofjApLAkJIkQsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0lfUlMyKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCQkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxTSU1NMTMofjApLAkJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSSh+MCksCQkiQyxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSV9SUzIofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKSwJCQkiQyxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFJTMV9HMCwJCSJDLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFNJTU0xMyh+MCksCQkiQyxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0kofjApLAkiRixbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzAsCQkiRixbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiRixbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3BpbGwiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YSIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKSwJCSJnLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8UlMyKH4wKSwJImcsWzFdQSIsIDAsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJImcsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCSJnLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8UlMxX0cwLAkiZyxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxTSU1NMTMofjApLAkiZyxbMV1vIiwgMCwgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3R1d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLXsgInN0dWIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RzYmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwoteyAic3R1YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJKH4wKSwJInEsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkicSxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJxLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFJTMV9HMCwJInEsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFNJTU0xMyh+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNywgMCksIEYzKH4zLCB+MHgyNywgfjApfEFTSSh+MCksCSJILFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDApLCBGMyh+MywgfjB4MjcsIH4wKXxBU0lfUlMyKH4wKSwJIkgsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSl8UlMxX0cwLAkiSCxbaV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpfFNJTU0xMyh+MCksCSJILFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSSh+MCksCSJRLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSV9SUzIofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIlEsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiUSxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJRLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0kofjApLAkiRCxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0lfUlMyKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZGEiLAlGMygzLCAweDE3LCAwKSwgRjMofjMsIH4weDE3LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCksCQkiSCxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxSUzIofjApLAkiSCxbMV1BIiwgMCwgdjkgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJILFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiSCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkgsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLXsgInN0dWgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHgiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKyVnMF0gKi8KLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHgiLAlGMygzLCAweDI1LCAwKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MCl8QVNJKH4wKXxSRCh+MSksCSJGLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDApfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4wKXxBU0lfUlMyKH4wKXxSRCh+MSksIkYsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSslZzBdICovCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UkQofjEpLAkJIkYsWzEraV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEKH4xKSwJCSJGLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSUzFfRzB8UkQofjEpLAkiRixbaV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFNJTU0xMyh+MCl8UkQofjEpLCJGLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDApLCBGMyh+MywgfjB4MWUsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMCksIEYzKH4zLCB+MHgxZSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2OSB9LCAvKiBzdHhhIGQsW3JzMSslZzBdICovCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHEiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJKH4wKSwJIkosWzErMl0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSV9SUzIofjApLAkiSixbMV0iLCAwLCB2OSB9LCAvKiBzdHEgW3JzMSslZzBdICovCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkiSixbMStpXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkiSixbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8UlMxX0cwLAkiSixbaV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFNJTU0xMyh+MCksCSJKLFsxXSIsIDAsIHY5IH0sIC8qIHN0cSBbcnMxKzBdICovCi0KLXsgInN0cWEiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJKH4wKSwJIkosWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJX1JTMih+MCksCSJKLFsxXUEiLCAwLCB2OSB9LCAvKiBzdHFhIFtyczErJWcwXSAqLwoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJKLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIkosW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8UlMxX0cwLAkiSixbaV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8U0lNTTEzKH4wKSwJIkosWzFdbyIsIDAsIHY5IH0sIC8qIHN0cWEgW3JzMSswXSAqLwotCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMCksIEYzKH4zLCB+MHgwZiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAwKSwgRjMofjMsIH4weDBmLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY3IH0sIC8qIHN3YXAgW3JzMSslZzBdLGQgKi8KLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSksCQkiWzEraV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY3IH0sIC8qIHN3YXAgW3JzMSswXSxkICovCi0KLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMCksIEYzKH4zLCB+MHgxZiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjcgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMCksIEYzKH4zLCB+MHgxZiwgfjApfFJTMih+MCksCSJbMV1BLGQiLCAwLCB2NyB9LCAvKiBzd2FwYSBbcnMxKyVnMF0sZCAqLwoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBzd2FwIFtyczErMF0sZCAqLwotCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMCksIEYzKH4yLCB+MHgzZCwgfjApfEFTSSh+MCksCQkJIjEsMixkIiwgMCwgdjYgfSwKLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAwKSwgRjMofjIsIH4weDNkLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiIiwgMCwgdjYgfSwgLyogcmVzdG9yZSAlZzAsJWcwLCVnMCAqLwoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDEpLCBGMyh+MiwgfjB4M2QsIH4xKSwJCQkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAxKSwgRjMofjIsIH4weDNkLCB+MSl8UkRfRzB8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2NiB9LCAvKiByZXN0b3JlICVnMCwwLCVnMCAqLwotCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfFJEX0cwfEFTSSh+MCksCSIxKzIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IHJzMStyczIgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCByczEsJWcwICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwLAkJIjEraSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgcnMxK1ggKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzAsCQkiaSsxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCBYK3JzMSAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgWCtyczEgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IFggKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IHJzMSswICovCi0KLXsgInNhdmUiLAlGMygyLCAweDNjLCAwKSwgRjMofjIsIH4weDNjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNhdmUiLAlGMygyLCAweDNjLCAxKSwgRjMofjIsIH4weDNjLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAic2F2ZSIsCTB4ODFlMDAwMDAsCX4weDgxZTAwMDAwLAkJCSIiLCBGX0FMSUFTLCB2NiB9LAotCi17ICJyZXQiLCAgRjMoMiwgMHgzOCwgMSl8UlMxKDB4MWYpfFNJTU0xMyg4KSwgRjMofjIsIH4weDM4LCB+MSl8U0lNTTEzKH44KSwJICAgICAgICIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVpNys4LCVnMCAqLwoteyAicmV0bCIsIEYzKDIsIDB4MzgsIDEpfFJTMSgweDBmKXxTSU1NMTMoOCksIEYzKH4yLCB+MHgzOCwgfjEpfFJTMSh+MHgwZil8U0lNTTEzKH44KSwgIiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJW83KzgsJWcwICovCi0KLXsgImptcGwiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8QVNJKH4wKSwJIjErMixkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxBU0lfUlMyKH4wKSwJIjEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8U0lNTTEzKH4wKSwJIjEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJTMV9HMCwJImksZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpLAkJIjEraSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKSwJCSJpKzEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQoteyAiZG9uZSIsCUYzKDIsIDB4M2UsIDApfFJEKDApLCBGMyh+MiwgfjB4M2UsIH4wKXxSRCh+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAicmV0cnkiLAlGMygyLCAweDNlLCAwKXxSRCgxKSwgRjMofjIsIH4weDNlLCB+MCl8UkQofjEpfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInNhdmVkIiwJRjMoMiwgMHgzMSwgMCl8UkQoMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEKH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJyZXN0b3JlZCIsCUYzKDIsIDB4MzEsIDApfFJEKDEpLCBGMyh+MiwgfjB4MzEsIH4wKXxSRCh+MSl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAic2lyIiwJRjMoMiwgMHgzMCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDMwLCB+MSl8UkQofjB4Zil8UlMxX0cwLAkJImkiLCAwLCB2OSB9LAotCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0kofjApLAkiMSsyIiwgMCwgdjggfSwKLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSV9SUzIofjApLAkiMSIsIDAsIHY4IH0sIC8qIGZsdXNoIHJzMSslZzAgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFNJTU0xMyh+MCksCSIxIiwgMCwgdjggfSwgLyogZmx1c2ggcnMxKzAgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFJTMV9HMCwJImkiLCAwLCB2OCB9LCAvKiBmbHVzaCAlZzAraSAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiMStpIiwgMCwgdjggfSwKLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJImkrMSIsIDAsIHY4IH0sCi0KLS8qIElGTFVTSCB3YXMgcmVuYW1lZCB0byBGTFVTSCBpbiB2OC4gICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJKH4wKSwJIjErMiIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJX1JTMih+MCksCSIxIiwgRl9BTElBUywgdjYgfSwgLyogZmx1c2ggcnMxKyVnMCAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFNJTU0xMyh+MCksCSIxIiwgRl9BTElBUywgdjYgfSwgLyogZmx1c2ggcnMxKzAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxSUzFfRzAsCSJpIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSIxK2kiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJImkrMSIsIEZfQUxJQVMsIHY2IH0sCi0KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxBU0kofjApLAkiMSsyIiwgMCwgdjkgfSwKLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2OSB9LCAvKiByZXR1cm4gcnMxKyVnMCAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFNJTU0xMyh+MCksCSIxIiwgMCwgdjkgfSwgLyogcmV0dXJuIHJzMSswICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UlMxX0cwLAkiaSIsIDAsIHY5IH0sIC8qIHJldHVybiAlZzAraSAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpLAkJIjEraSIsIDAsIHY5IH0sCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSksCQkiaSsxIiwgMCwgdjkgfSwKLQoteyAiZmx1c2h3IiwJRjMoMiwgMHgyYiwgMCksIEYzKH4yLCB+MHgyYiwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJIiIsIDAsIHY5IH0sCi0KLXsgIm1lbWJhciIsCUYzKDIsIDB4MjgsIDEpfFJTMSgweGYpLCBGMyh+MiwgfjB4MjgsIH4xKXxSRF9HMHxSUzEofjB4Zil8U0lNTTEzKH4xMjcpLCAiSyIsIDAsIHY5IH0sCi17ICJzdGJhciIsCUYzKDIsIDB4MjgsIDApfFJTMSgweGYpLCBGMyh+MiwgfjB4MjgsIH4wKXxSRF9HMHxSUzEofjB4Zil8U0lNTTEzKH4wKSwgIiIsIDAsIHY4IH0sCi0KLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMCksIEYzKH4zLCB+MHgyZCwgfjApLAkJIlsxKzJdLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAwKSwgRjMofjMsIH4weDJkLCB+MCl8UlMyX0cwLAkiWzFdLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaCBbcnMxKyVnMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKSwJCSJbMStpXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpLAkJIltpKzFdLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSl8UlMxX0cwLAkiW2ldLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2ggW3JzMSswXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDApLCBGMyh+MywgfjB4M2QsIH4wKSwJCSJbMSsyXUEsKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAwKSwgRjMofjMsIH4weDNkLCB+MCl8UlMyX0cwLAkiWzFdQSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2hhIFtyczErJWcwXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKSwJCSJbMStpXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSksCQkiW2krMV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpfFJTMV9HMCwJIltpXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoYSBbcnMxKzBdLGQgKi8KLQoteyAic2xsIiwJRjMoMiwgMHgyNSwgMCksIEYzKH4yLCB+MHgyNSwgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic2xsIiwJRjMoMiwgMHgyNSwgMSksIEYzKH4yLCB+MHgyNSwgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAoteyAic3JhIiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3JhIiwJRjMoMiwgMHgyNywgMSksIEYzKH4yLCB+MHgyNywgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAoteyAic3JsIiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3JsIiwJRjMoMiwgMHgyNiwgMSksIEYzKH4yLCB+MHgyNiwgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAotCi17ICJzbGx4IiwJRjMoMiwgMHgyNSwgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI1LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic2xseCIsCUYzKDIsIDB4MjUsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNSwgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLXsgInNyYXgiLAlGMygyLCAweDI3LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjcsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzcmF4IiwJRjMoMiwgMHgyNywgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI3LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAoteyAic3JseCIsCUYzKDIsIDB4MjYsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNiwgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNybHgiLAlGMygyLCAweDI2LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjYsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi0KLXsgIm11bHNjYyIsCUYzKDIsIDB4MjQsIDApLCBGMyh+MiwgfjB4MjQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAibXVsc2NjIiwJRjMoMiwgMHgyNCwgMSksIEYzKH4yLCB+MHgyNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAiZGl2c2NjIiwJRjMoMiwgMHgxZCwgMCksIEYzKH4yLCB+MHgxZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGl0ZSB9LAoteyAiZGl2c2NjIiwJRjMoMiwgMHgxZCwgMSksIEYzKH4yLCB+MHgxZCwgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsaXRlIH0sCi0KLXsgInNjYW4iLAlGMygyLCAweDJjLCAwKSwgRjMofjIsIH4weDJjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsZXR8c3BhcmNsaXRlIH0sCi17ICJzY2FuIiwJRjMoMiwgMHgyYywgMSksIEYzKH4yLCB+MHgyYywgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsZXR8c3BhcmNsaXRlIH0sCi0KLXsgInBvcGMiLAlGMygyLCAweDJlLCAwKSwgRjMofjIsIH4weDJlLCB+MCl8UlMyX0cwfEFTSSh+MCksIjIsZCIsIDAsIHY5IH0sCi17ICJwb3BjIiwJRjMoMiwgMHgyZSwgMSksIEYzKH4yLCB+MHgyZSwgfjEpfFJTMl9HMCwJImksZCIsIDAsIHY5IH0sCi0KLXsgImNsciIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSJkIiwgRl9BTElBUywgdjYgfSwgLyogb3IgJWcwLCVnMCxkICovCi17ICJjbHIiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8UlMxX0cwfFNJTU0xMyh+MCksCQkiZCIsIEZfQUxJQVMsIHY2IH0sIC8qIG9yICVnMCwwLGQJKi8KLXsgImNsciIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxSRF9HMHxBU0kofjApLAkJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCAlZzAsW3JzMSslZzBdICovCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzAsCQkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMCwJCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwfFJTMV9HMCwJCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ICVnMCxbcnMxKzBdICovCi0KLXsgImNscmIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgJWcwLFtyczErJWcwXSAqLwoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgJWcwLFtyczErMF0gKi8KLQoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCAlZzAsW3JzMSslZzBdICovCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3R4ICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3R4ICVnMCxbcnMxKzBdICovCi0KLXsgIm9yY2MiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9yY2MiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAib3JuY2MiLAlGMygyLCAweDE2LCAwKSwgRjMofjIsIH4weDE2LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9ybmNjIiwJRjMoMiwgMHgxNiwgMSksIEYzKH4yLCB+MHgxNiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJvcm4iLAlGMygyLCAweDA2LCAwKSwgRjMofjIsIH4weDA2LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9ybiIsCUYzKDIsIDB4MDYsIDEpLCBGMyh+MiwgfjB4MDYsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2NiB9LCAvKiBvcmNjIHJzMSwgJWcwLCAlZzAgKi8KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJKH4wKSwJIjIiLCAwLCB2NiB9LCAvKiBvcmNjICVnMCwgcnMyLCAlZzAgKi8KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIDAsIHY2IH0sIC8qIG9yY2MgcnMxLCAwLCAlZzAgKi8KLQoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfEFTSSh+MCksCQkiMSwyLG0iLCAwLCB2OCB9LCAvKiB3ciByLHIsJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMSksCQlGMyh+MiwgfjB4MzAsIH4xKSwJCQkiMSxpLG0iLCAwLCB2OCB9LCAvKiB3ciByLGksJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsJWcwLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix5IiwgMCwgdjYgfSwgLyogd3IgcixyLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDEpLAkJRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiMSxpLHkiLCAwLCB2NiB9LCAvKiB3ciByLGksJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwlZzAsJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMCksCQlGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHAiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDEpLAkJRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiMSxpLHAiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDApLAkJRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdyIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSIxLGksdyIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDApLAkJRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix0IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXRiciAqLwoteyAid3IiLAlGMygyLCAweDMzLCAxKSwJCUYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJIjEsaSx0IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXRiciAqLwoteyAid3IiLAlGMygyLCAweDMzLCAwKSwJCUYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV0YnIgKi8KLQoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIpfEFTSSh+MCksCSIxLDIsRSIsIDAsIHY5IH0sIC8qIHdyIHIsciwlY2NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MiksCQkiMSxpLEUiLCAwLCB2OSB9LCAvKiB3ciByLGksJWNjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgzKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjMpfEFTSSh+MCksCSIxLDIsbyIsIDAsIHY5IH0sIC8qIHdyIHIsciwlYXNpICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDMpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MyksCQkiMSxpLG8iLCAwLCB2OSB9LCAvKiB3ciByLGksJWFzaSAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCg2KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjYpfEFTSSh+MCksCSIxLDIscyIsIDAsIHY5IH0sIC8qIHdyIHIsciwlZnBycyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCg2KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjYpLAkJIjEsaSxzIiwgMCwgdjkgfSwgLyogd3IgcixpLCVmcHJzICovCi0KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTYpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTYpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXBjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxNiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xNiksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVwY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTcpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTcpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXBpYyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxNyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xNyksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVwaWMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTgpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTgpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWRjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxOCksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xOCksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVkY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTkpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTkpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWdzciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxOSksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xOSksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVnc3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjApLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjApfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXNldF9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIwKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIwKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXNldF9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIxKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIxKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVjbGVhcl9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIxKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIxKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWNsZWFyX3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjIpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjIpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXNvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjIpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjIpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMyl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwldGlja19jbXByICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIzKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIzKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXRpY2tfY21wciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApLAkJCUYzKH4yLCB+MHgyOCwgfjApfFNJTU0xMyh+MCksCQkiTSxkIiwgMCwgdjggfSwgLyogcmQgJWFzclgsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKSwJCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInksZCIsIDAsIHY2IH0sIC8qIHJkICV5LHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOSwgMCksCQkJRjMofjIsIH4weDI5LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJwLGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICVwc3IsciAqLwoteyAicmQiLAlGMygyLCAweDJhLCAwKSwJCQlGMyh+MiwgfjB4MmEsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIncsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXdpbSxyICovCi17ICJyZCIsCUYzKDIsIDB4MmIsIDApLAkJCUYzKH4yLCB+MHgyYiwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidCxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAldGJyLHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIpfFNJTU0xMyh+MCksCSJFLGQiLCAwLCB2OSB9LCAvKiByZCAlY2NyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDMpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4zKXxTSU1NMTMofjApLAkibyxkIiwgMCwgdjkgfSwgLyogcmQgJWFzaSxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg0KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+NCl8U0lNTTEzKH4wKSwJIlcsZCIsIDAsIHY5IH0sIC8qIHJkICV0aWNrLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDUpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH41KXxTSU1NMTMofjApLAkiUCxkIiwgMCwgdjkgfSwgLyogcmQgJXBjLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDYpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH42KXxTSU1NMTMofjApLAkicyxkIiwgMCwgdjkgfSwgLyogcmQgJWZwcnMsciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxNiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE2KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVwY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTcpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xNyl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlcGljLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE4KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTgpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJWRjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxOSksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE5KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVnc3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMjIpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yMil8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlc29mdGludCxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyMyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIzKXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICV0aWNrX2NtcHIsciAqLwotCi17ICJyZHByIiwJRjMoMiwgMHgyYSwgMCksCQlGMyh+MiwgfjB4MmEsIH4wKXxTSU1NMTMofjApLAkiPyxkIiwgMCwgdjkgfSwgICAvKiByZHByICVwcml2LHIgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApLAkJIjEsMiwhIiwgMCwgdjkgfSwgLyogd3JwciByMSxyMiwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8U0lNTTEzKH4wKSwJIjEsISIsIDAsIHY5IH0sICAgLyogd3JwciByMSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSksCQkiMSxpLCEiLCAwLCB2OSB9LCAvKiB3cnByIHIxLGksJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpLAkJImksMSwhIiwgRl9BTElBUywgdjkgfSwgLyogd3JwciBpLHIxLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKXxSUzEofjApLAkiaSwhIiwgMCwgdjkgfSwgICAvKiB3cnByIGksJXByaXYgKi8KLQotLyogPz8/IFRoaXMgZ3JvdXAgc2VlbXMgd3JvbmcuICBBIHRocmVlIG9wZXJhbmQgbW92ZT8gICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8QVNJKH4wKSwJCSIxLDIsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHIsciwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpLAkJCSIxLGksbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHIsaSwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHIsciwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJIjEsaSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcixpLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAwKSwgRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMixwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJIjEsaSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMCksIEYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSIxLGksdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDApLCBGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiMSxpLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwldGJyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MjgsIDApLCBGMyh+MiwgfjB4MjgsIH4wKXxTSU1NMTMofjApLAkJIk0sZCIsIEZfQUxJQVMsIHY4IH0sIC8qIHJkICVhc3IxLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MjgsIDApLCBGMyh+MiwgfjB4MjgsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInksZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHJkICV5LHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MjksIDApLCBGMyh+MiwgfjB4MjksIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInAsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXBzcixyICovCi17ICJtb3YiLAlGMygyLCAweDJhLCAwKSwgRjMofjIsIH4weDJhLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ3LGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICV3aW0sciAqLwoteyAibW92IiwJRjMoMiwgMHgyYiwgMCksIEYzKH4yLCB+MHgyYiwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidCxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAldGJyLHIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfEFTSV9SUzIofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwlZzAsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKSwJCQkiaSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgJWcwLGksJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwwLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsJWcwLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiaSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgJWcwLGksJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLDAsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiaSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMCksIEYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSJpLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAwKSwgRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJImksdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCV0YnIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfFJTMV9HMHxBU0kofjApLAkiMixkIiwgMCwgdjYgfSwgLyogb3IgJWcwLHJzMixkICovCi17ICJtb3YiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8UlMxX0cwLAkJImksZCIsIDAsIHY2IH0sIC8qIG9yICVnMCxpLGQJKi8KLXsgIm1vdiIsICAgICAgICBGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJX1JTMih+MCksCQkiMSxkIiwgMCwgdjYgfSwgLyogb3IgcnMxLCVnMCxkICAgKi8KLXsgIm1vdiIsICAgICAgICBGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8U0lNTTEzKH4wKSwJCSIxLGQiLCAwLCB2NiB9LCAvKiBvciByczEsMCxkICovCi0KLXsgIm9yIiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJvciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImJzZXQiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sCS8qIG9yIHJkLHJzMixyZCAqLwoteyAiYnNldCIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBvciByZCxpLHJkICovCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAiYW5kbiIsCUYzKDIsIDB4MDUsIDApLCBGMyh+MiwgfjB4MDUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kbiIsCUYzKDIsIDB4MDUsIDEpLCBGMyh+MiwgfjB4MDUsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAiYW5kbmNjIiwJRjMoMiwgMHgxNSwgMCksIEYzKH4yLCB+MHgxNSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRuY2MiLAlGMygyLCAweDE1LCAxKSwgRjMofjIsIH4weDE1LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJiY2xyIiwJRjMoMiwgMHgwNSwgMCksIEYzKH4yLCB+MHgwNSwgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRuIHJkLHJzMixyZCAqLwoteyAiYmNsciIsCUYzKDIsIDB4MDUsIDEpLCBGMyh+MiwgfjB4MDUsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRuIHJkLGkscmQgKi8KLQoteyAiY21wIiwJRjMoMiwgMHgxNCwgMCksIEYzKH4yLCB+MHgxNCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIiLCAwLCB2NiB9LAkvKiBzdWJjYyByczEscnMyLCVnMCAqLwoteyAiY21wIiwJRjMoMiwgMHgxNCwgMSksIEYzKH4yLCB+MHgxNCwgfjEpfFJEX0cwLAkJIjEsaSIsIDAsIHY2IH0sCS8qIHN1YmNjIHJzMSxpLCVnMCAqLwotCi17ICJzdWIiLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInN1YiIsCUYzKDIsIDB4MDQsIDEpLCBGMyh+MiwgfjB4MDQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInN1YmNjIiwJRjMoMiwgMHgxNCwgMCksIEYzKH4yLCB+MHgxNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzdWJjYyIsCUYzKDIsIDB4MTQsIDEpLCBGMyh+MiwgfjB4MTQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInN1YngiLAlGMygyLCAweDBjLCAwKSwgRjMofjIsIH4weDBjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAic3VieCIsCUYzKDIsIDB4MGMsIDEpLCBGMyh+MiwgfjB4MGMsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YmMiLAlGMygyLCAweDBjLCAwKSwgRjMofjIsIH4weDBjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInN1YmMiLAlGMygyLCAweDBjLCAxKSwgRjMofjIsIH4weDBjLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJzdWJ4Y2MiLAlGMygyLCAweDFjLCAwKSwgRjMofjIsIH4weDFjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAic3VieGNjIiwJRjMoMiwgMHgxYywgMSksIEYzKH4yLCB+MHgxYywgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAic3ViY2NjIiwJRjMoMiwgMHgxYywgMCksIEYzKH4yLCB+MHgxYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzdWJjY2MiLAlGMygyLCAweDFjLCAxKSwgRjMofjIsIH4weDFjLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJhbmQiLAlGMygyLCAweDAxLCAwKSwgRjMofjIsIH4weDAxLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZCIsCUYzKDIsIDB4MDEsIDEpLCBGMyh+MiwgfjB4MDEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhbmQiLAlGMygyLCAweDAxLCAxKSwgRjMofjIsIH4weDAxLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDApLCBGMyh+MiwgfjB4MTEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kY2MiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYW5kY2MiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJkZWMiLAlGMygyLCAweDA0LCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDA0LCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIHN1YiByZCwxLHJkICovCi17ICJkZWMiLAlGMygyLCAweDA0LCAxKSwJCSAgICBGMyh+MiwgfjB4MDQsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogc3ViIHJkLGltbSxyZCAqLwoteyAiZGVjY2MiLAlGMygyLCAweDE0LCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDE0LCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIHN1YmNjIHJkLDEscmQgKi8KLXsgImRlY2NjIiwJRjMoMiwgMHgxNCwgMSksCQkgICAgRjMofjIsIH4weDE0LCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIHN1YmNjIHJkLGltbSxyZCAqLwoteyAiaW5jIiwJRjMoMiwgMHgwMCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgwMCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhZGQgcmQsMSxyZCAqLwoteyAiaW5jIiwJRjMoMiwgMHgwMCwgMSksCQkgICAgRjMofjIsIH4weDAwLCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIGFkZCByZCxpbW0scmQgKi8KLXsgImluY2NjIiwJRjMoMiwgMHgxMCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgxMCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhZGRjYyByZCwxLHJkICovCi17ICJpbmNjYyIsCUYzKDIsIDB4MTAsIDEpLAkJICAgIEYzKH4yLCB+MHgxMCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBhZGRjYyByZCxpbW0scmQgKi8KLQoteyAiYnRzdCIsCUYzKDIsIDB4MTEsIDApLCBGMyh+MiwgfjB4MTEsIH4wKXxSRF9HMHxBU0kofjApLCAiMSwyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kY2MgcnMxLHJzMiwlZzAgKi8KLXsgImJ0c3QiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSl8UkRfRzAsICJpLDEiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRjYyByczEsaSwlZzAgKi8KLQoteyAibmVnIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfFJTMV9HMHxBU0kofjApLCAiMixkIiwgRl9BTElBUywgdjYgfSwgLyogc3ViICVnMCxyczIscmQgKi8KLXsgIm5lZyIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxSUzFfRzB8QVNJKH4wKSwgIk8iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdWIgJWcwLHJkLHJkICovCi0KLXsgImFkZCIsCUYzKDIsIDB4MDAsIDApLCBGMyh+MiwgfjB4MDAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMSksIEYzKH4yLCB+MHgwMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFkZCIsCUYzKDIsIDB4MDAsIDEpLCBGMyh+MiwgfjB4MDAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDApLCBGMyh+MiwgfjB4MTAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAxKSwgRjMofjIsIH4weDEwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAxKSwgRjMofjIsIH4weDEwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMCksIEYzKH4yLCB+MHgwOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHgiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJImksMSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDApLCBGMyh+MiwgfjB4MDgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJImksMSxkIiwgMCwgdjkgfSwKLQoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMCksIEYzKH4yLCB+MHgxOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSJpLDEsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDApLCBGMyh+MiwgfjB4MTgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSJpLDEsZCIsIDAsIHY5IH0sCi0KLXsgInNtdWwiLAlGMygyLCAweDBiLCAwKSwgRjMofjIsIH4weDBiLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNtdWwiLAlGMygyLCAweDBiLCAxKSwgRjMofjIsIH4weDBiLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic211bCIsCUYzKDIsIDB4MGIsIDEpLCBGMyh+MiwgfjB4MGIsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAwKSwgRjMofjIsIH4weDFiLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDEpLCBGMyh+MiwgfjB4MWIsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAxKSwgRjMofjIsIH4weDFiLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDApLCBGMyh+MiwgfjB4MGEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDEpLCBGMyh+MiwgfjB4MGEsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMSksIEYzKH4yLCB+MHgwYSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDApLCBGMyh+MiwgfjB4MWEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMSksIEYzKH4yLCB+MHgxYSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDEpLCBGMyh+MiwgfjB4MWEsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMCksIEYzKH4yLCB+MHgwZiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMSksIEYzKH4yLCB+MHgwZiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAxKSwgRjMofjIsIH4weDBmLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMCksIEYzKH4yLCB+MHgxZiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAxKSwgRjMofjIsIH4weDFmLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMSksIEYzKH4yLCB+MHgxZiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAwKSwgRjMofjIsIH4weDBlLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAxKSwgRjMofjIsIH4weDBlLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDEpLCBGMyh+MiwgfjB4MGUsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAwKSwgRjMofjIsIH4weDFlLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDEpLCBGMyh+MiwgfjB4MWUsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAxKSwgRjMofjIsIH4weDFlLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAotCi17ICJtdWx4IiwJRjMoMiwgMHgwOSwgMCksIEYzKH4yLCB+MHgwOSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJtdWx4IiwJRjMoMiwgMHgwOSwgMSksIEYzKH4yLCB+MHgwOSwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgInNkaXZ4IiwJRjMoMiwgMHgyZCwgMCksIEYzKH4yLCB+MHgyZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzZGl2eCIsCUYzKDIsIDB4MmQsIDEpLCBGMyh+MiwgfjB4MmQsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJ1ZGl2eCIsCUYzKDIsIDB4MGQsIDApLCBGMyh+MiwgfjB4MGQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAidWRpdngiLAlGMygyLCAweDBkLCAxKSwgRjMofjIsIH4weDBkLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJjYWxsIiwJRjEoMHgxKSwgRjEofjB4MSksICJMIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYxKDB4MSksIEYxKH4weDEpLCAiTCwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJKH4wKSwJIjErMiIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErcnMyLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSSh+MCksCSIxKzIsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0lfUlMyKH4wKSwJIjEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0lfUlMyKH4wKSwJIjEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSIxK2kiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK2ksJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiMStpLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiaSsxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIGkrcnMxLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJImkrMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJImkiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8UlMxX0cwLAkiaSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFNJTU0xMyh+MCksCSIxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFNJTU0xMyh+MCksCSIxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLQotLyogQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLgotCi0gICBCZWNhdXNlIHRoaXMgcGFydCBvZiB0aGUgdGFibGUgd2FzIHN1Y2ggYSBtZXNzIGVhcmxpZXIsIEkgaGF2ZQotICAgbWFjcm9maWVkIGl0IHNvIHRoYXQgYWxsIHRoZSBicmFuY2hlcyBhbmQgdHJhcHMgYXJlIGdlbmVyYXRlZCBmcm9tCi0gICBhIHNpbmdsZS1saW5lIGRlc2NyaXB0aW9uIG9mIGVhY2ggY29uZGl0aW9uIHZhbHVlLiAgSm9obiBHaWxtb3JlLiAqLwotCi0vKiBEZWZpbmUgYnJhbmNoZXMgLS0gb25lIGFubnVsbGVkLCBvbmUgd2l0aG91dCwgZXRjLiAqLwotI2RlZmluZSBicihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAgICAgICAiLGEgbCIsICAgKGZsYWdzKSwgdjYgfSwgXAotIHsgb3Bjb2RlLCAobWFzaykgICAgICAsIChsb3NlKXxBTk5VTCwgImwiLCAgICAgKGZsYWdzKSwgdjYgfQotCi0jZGVmaW5lIGJyeChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVELCBBTk5VTHwobG9zZSksICJaLEciLCAgICAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIixUIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEgWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSxUIFosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCksIEFOTlVMfEJQUkVEfChsb3NlKSwgIixOIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxBTk5VTCwgQlBSRUR8KGxvc2UpLCAiLGEsTiBaLEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpfCgyPDwyMCksICJ6LEciLCAgICAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSl8KDI8PDIwKSwgIixUIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKXwoMjw8MjApLCAiLGEgeixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpfCgyPDwyMCksICIsYSxUIHosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHxCUFJFRHwobG9zZSl8KDI8PDIwKSwgIixOIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIEJQUkVEfChsb3NlKXwoMjw8MjApLCAiLGEsTiB6LEciLCAoZmxhZ3MpLCB2OSB9Ci0KLS8qIERlZmluZSBmb3VyIHRyYXBzOiByZWcrcmVnLCByZWcgKyBpbW1lZGlhdGUsIGltbWVkaWF0ZSBhbG9uZSwgcmVnIGFsb25lLiAqLwotI2RlZmluZSB0cihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpfElNTUVELCAobG9zZSl8UlMxX0cwLAkiWixpIiwgICAoZmxhZ3MpLCB2OSB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKXxJTU1FRCwgKGxvc2UpLAkiWiwxK2kiLCAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKSwgSU1NRUR8KGxvc2UpLAkiWiwxKzIiLCAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJIlosMSIsICAgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgJWcwICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSl8UlMxX0cwLAkieixpIiwgICAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpLAkieiwxK2kiLCAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpLAkieiwxKzIiLCAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJInosMSIsICAgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyAlZzAgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCQkiaSIsICAgICAoZmxhZ3MpLCB2NiB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKSwJCSIxK2kiLCAgIChmbGFncyksIHY2IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpLAkJIjErMiIsICAgKGZsYWdzKSwgdjYgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkJIjEiLCAgICAgKGZsYWdzKSwgdjYgfSAvKiByczEgKyAlZzAgKi8KLQotLyogdjk6IFdlIG11c3QgcHV0IGBicngnIGJlZm9yZSBgYnInLCB0byBlbnN1cmUgdGhhdCB3ZSBuZXZlciBtYXRjaCBzb21ldGhpbmcKLSAgIHY5OiBhZ2FpbnN0IGFuIGV4cHJlc3Npb24gdW5sZXNzIGl0IGlzIGFuIGV4cHJlc3Npb24uICBPdGhlcndpc2UsIHdlIGVuZAotICAgdjk6IHVwIHdpdGggdW5kZWZpbmVkIHN5bWJvbCB0YWJsZXMgZW50cmllcywgYmVjYXVzZSB0aGV5IGdldCBhZGRlZCwgYnV0Ci0gICB2OTogYXJlIG5vdCBkZWxldGVkIGlmIHRoZSBwYXR0ZXJuIGZhaWxzIHRvIG1hdGNoLiAgKi8KLQotLyogRGVmaW5lIGJvdGggYnJhbmNoZXMgYW5kIHRyYXBzIGJhc2VkIG9uIGNvbmRpdGlvbiBtYXNrICovCi0jZGVmaW5lIGNvbmQoYm9wLCB0b3AsIG1hc2ssIGZsYWdzKSBcCi0gIGJyeChib3AsIEYyKDAsIDEpfChtYXNrKSwgRjIofjAsIH4xKXwoKH5tYXNrKSZDT05EKH4wKSksIEZfREVMQVlFRHwoZmxhZ3MpKSwgLyogdjkgKi8gXAotICBicihib3AsICBGMigwLCAyKXwobWFzayksIEYyKH4wLCB+Mil8KCh+bWFzaykmQ09ORCh+MCkpLCBGX0RFTEFZRUR8KGZsYWdzKSksIFwKLSAgdHIodG9wLCAgRjMoMiwgMHgzYSwgMCl8KG1hc2spLCBGMyh+MiwgfjB4M2EsIDApfCgofm1hc2spJkNPTkQofjApKSwgKChmbGFncykgJiB+KEZfVU5CUnxGX0NPTkRCUikpKQotCi0vKiBEZWZpbmUgYWxsIHRoZSBjb25kaXRpb25zLCBhbGwgdGhlIGJyYW5jaGVzLCBhbGwgdGhlIHRyYXBzLiAgKi8KLQotLyogU3RhbmRhcmQgYnJhbmNoLCB0cmFwIG1uZW1vbmljcyAqLwotY29uZCAoImIiLAkidGEiLCAgIENPTkRBLCBGX1VOQlIpLAotLyogQWx0ZXJuYXRpdmUgZm9ybSAoanVzdCBmb3IgYXNzZW1ibHksIG5vdCBmb3IgZGlzYXNzZW1ibHkpICovCi1jb25kICgiYmEiLAkidCIsICAgIENPTkRBLCBGX1VOQlJ8Rl9BTElBUyksCi0KLWNvbmQgKCJiY2MiLAkidGNjIiwgIENPTkRDQywgRl9DT05EQlIpLAotY29uZCAoImJjcyIsCSJ0Y3MiLCAgQ09ORENTLCBGX0NPTkRCUiksCi1jb25kICgiYmUiLAkidGUiLCAgIENPTkRFLCBGX0NPTkRCUiksCi1jb25kICgiYmVxIiwJInRlcSIsICBDT05ERSwgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmciLAkidGciLCAgIENPTkRHLCBGX0NPTkRCUiksCi1jb25kICgiYmd0IiwJInRndCIsICBDT05ERywgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmdlIiwJInRnZSIsICBDT05ER0UsIEZfQ09OREJSKSwKLWNvbmQgKCJiZ2V1IiwJInRnZXUiLCBDT05ER0VVLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGNjICovCi1jb25kICgiYmd1IiwJInRndSIsICBDT05ER1UsIEZfQ09OREJSKSwKLWNvbmQgKCJibCIsCSJ0bCIsICAgQ09OREwsIEZfQ09OREJSKSwKLWNvbmQgKCJibHQiLAkidGx0IiwgIENPTkRMLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJibGUiLAkidGxlIiwgIENPTkRMRSwgRl9DT05EQlIpLAotY29uZCAoImJsZXUiLAkidGxldSIsIENPTkRMRVUsIEZfQ09OREJSKSwKLWNvbmQgKCJibHUiLAkidGx1IiwgIENPTkRMVSwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBjcyAqLwotY29uZCAoImJuIiwJInRuIiwgICBDT05ETiwgRl9DT05EQlIpLAotY29uZCAoImJuZSIsCSJ0bmUiLCAgQ09ORE5FLCBGX0NPTkRCUiksCi1jb25kICgiYm5lZyIsCSJ0bmVnIiwgQ09ORE5FRywgRl9DT05EQlIpLAotY29uZCAoImJueiIsCSJ0bnoiLCAgQ09ORE5aLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIG5lICovCi1jb25kICgiYnBvcyIsCSJ0cG9zIiwgQ09ORFBPUywgRl9DT05EQlIpLAotY29uZCAoImJ2YyIsCSJ0dmMiLCAgQ09ORFZDLCBGX0NPTkRCUiksCi1jb25kICgiYnZzIiwJInR2cyIsICBDT05EVlMsIEZfQ09OREJSKSwKLWNvbmQgKCJieiIsCSJ0eiIsICAgQ09ORFosIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgZSAqLwotCi0jdW5kZWYgY29uZAotI3VuZGVmIGJyCi0jdW5kZWYgYnJyIC8qIHY5ICovCi0jdW5kZWYgdHIKLQotI2RlZmluZSBicnIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIjEsayIsICAgICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSksICIsVCAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEgMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhLFQgMSxrIiwgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHxCUFJFRHwobG9zZSksICIsTiAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgQlBSRUR8KGxvc2UpLCAiLGEsTiAxLGsiLCBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfQotCi0jZGVmaW5lIGNvbmRyKGJvcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgYnJyKGJvcCwgRjIoMCwgMyl8Q09ORChtYXNrKSwgRjIofjAsIH4zKXxDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBjb25kcigiYnJueiIsIDB4NSwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyeiIsIDB4MSwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyZ2V6IiwgMHg3LCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJseiIsIDB4MywgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJybGV6IiwgMHgyLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJneiIsIDB4NiwgRl9DT05EQlIpLAotCi0jdW5kZWYgY29uZHIgLyogdjkgKi8KLSN1bmRlZiBicnIgLyogdjkgKi8KLQotI2RlZmluZSBtb3ZyKG9wY29kZSwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgRjMoMiwgMHgyZiwgMCl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgyZiwgfjApfFJDT05EKH4obWFzaykpLCAiMSwyLGQiLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIEYzKDIsIDB4MmYsIDEpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MmYsIH4xKXxSQ09ORCh+KG1hc2spKSwgIjEsaixkIiwgKGZsYWdzKSwgdjkgfQotCi0jZGVmaW5lIGZtcnJzKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLGYsZyIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0jZGVmaW5lIGZtcnJkKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLEIsSCIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0jZGVmaW5lIGZtcnJxKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLFIsSiIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0KLSNkZWZpbmUgZm1vdnJzKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycnMobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg1KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+NSl8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZyZChtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJkKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNil8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjYpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotI2RlZmluZSBmbW92cnEobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJycShtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDcpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH43KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLQotLyogdjkgKi8gbW92cigibW92cm5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJlIiwgMHgxLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJnZXoiLCAweDcsIDApLAotLyogdjkgKi8gbW92cigibW92cmx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJsZXoiLCAweDIsIDApLAotLyogdjkgKi8gbW92cigibW92cmd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc256IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZG56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycW56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxeiIsIDB4MSwgRl9BTElBUyksCi0KLSN1bmRlZiBtb3ZyIC8qIHY5ICovCi0jdW5kZWYgZm1vdnIgLyogdjkgKi8KLSN1bmRlZiBmbXJyIC8qIHY5ICovCi0KLSNkZWZpbmUgbW92aWNjKG9wY29kZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfE1DT05EKGNvbmQsMSl8SUNDLCBGMyh+MiwgfjB4MmMsIH4wKXxNQ09ORCh+Y29uZCx+MSl8WENDfCgxPDwxMSksICJ6LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxNQ09ORChjb25kLDEpfElDQywgRjMofjIsIH4weDJjLCB+MSl8TUNPTkQofmNvbmQsfjEpfFhDQ3woMTw8MTEpLCAieixJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8TUNPTkQoY29uZCwxKXxYQ0MsIEYzKH4yLCB+MHgyYywgfjApfE1DT05EKH5jb25kLH4xKXwoMTw8MTEpLCAgICAgIlosMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfE1DT05EKGNvbmQsMSl8WENDLCBGMyh+MiwgfjB4MmMsIH4xKXxNQ09ORCh+Y29uZCx+MSl8KDE8PDExKSwgICAgICJaLEksZCIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgbW92ZmNjKG9wY29kZSwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMCl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4wKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjYsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygwKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjApfEYzKH4yLCB+MHgyYywgfjEpLCAiNixJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDEpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MSl8RjMofjIsIH4weDJjLCB+MCksICI3LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMSl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4xKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjcsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygyKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjIpfEYzKH4yLCB+MHgyYywgfjApLCAiOCwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDIpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Mil8RjMofjIsIH4weDJjLCB+MSksICI4LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMyl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4zKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjksMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygzKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjMpfEYzKH4yLCB+MHgyYywgfjEpLCAiOSxJLGQiLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIG1vdmNjKG9wY29kZSwgY29uZCwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIG1vdmZjYyAob3Bjb2RlLCBmY29uZCwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIG1vdmljYyAob3Bjb2RlLCBjb25kLCBmbGFncykgLyogdjkgKi8KLQotLyogdjkgKi8gbW92Y2MgICgibW92YSIsCUNPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Y2MiLAlDT05EQ0MsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Z2V1IiwJQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZjcyIsCUNPTkRDUywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZsdSIsCUNPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZlIiwJQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZnIiwJQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZnZSIsCUNPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZndSIsCUNPTkRHVSwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZsIiwJQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZsZSIsCUNPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZsZXUiLAlDT05ETEVVLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdmxnIiwJRkNPTkRMRywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZuIiwJQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZuZSIsCUNPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZuZWciLAlDT05ETkVHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm56IiwJQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdm8iLAlGQ09ORE8sIDApLAotLyogdjkgKi8gbW92aWNjICgibW92cG9zIiwJQ09ORFBPUywgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1IiwJRkNPTkRVLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVlIiwJRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1ZyIsCUZDT05EVUcsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWdlIiwJRkNPTkRVR0UsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWwiLAlGQ09ORFVMLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVsZSIsCUZDT05EVUxFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnZjIiwJQ09ORFZDLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnZzIiwJQ09ORFZTLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdnoiLAlDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLQotI3VuZGVmIG1vdmljYyAvKiB2OSAqLwotI3VuZGVmIG1vdmZjYyAvKiB2OSAqLwotI3VuZGVmIG1vdmNjIC8qIHY5ICovCi0KLSNkZWZpbmUgRk1fU0YgMQkJLyogdjkgLSB2YWx1ZXMgZm9yIGZwc2l6ZSAqLwotI2RlZmluZSBGTV9ERiAyCQkvKiB2OSAqLwotI2RlZmluZSBGTV9RRiAzCQkvKiB2OSAqLwotCi0jZGVmaW5lIGZtb3ZpY2Mob3Bjb2RlLCBmcHNpemUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTAwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxMDArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgInosZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxODArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDE4MCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAiWixmLGciLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIGZtb3ZmY2Mob3Bjb2RlLCBmcHNpemUsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDAwMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDAwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI2LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDQwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwNDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjcsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwODArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA4MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOCxmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDBjMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MGMwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI5LGYsZyIsIGZsYWdzLCB2OSB9Ci0KLS8qIEZJWE1FOiB1c2UgZm1vdmljYy9mbW92ZmNjPyAqLyAvKiB2OSAqLwotI2RlZmluZSBmbW92Y2Mob3Bjb2RlLCBmcHNpemUsIGNvbmQsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDEwMCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTAwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJ6LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDAwMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDAwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI2LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDE4MCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTgwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJaLGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA0MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDQwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI3LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA4MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDgwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI4LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDBjMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MGMwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI5LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfQotCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRhIiwJRk1fREYsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxYSIsCUZNX1FGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2EiLAlGTV9TRiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRjYyIsCUZNX0RGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxY2MiLAlGTV9RRiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2NjIiwJRk1fU0YsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRjcyIsCUZNX0RGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxY3MiLAlGTV9RRiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2NzIiwJRk1fU0YsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRlIiwJRk1fREYsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZSIsCUZNX1FGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2UiLAlGTV9TRiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRnIiwJRk1fREYsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZyIsCUZNX1FGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2ciLAlGTV9TRiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRnZSIsCUZNX0RGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZ2UiLAlGTV9RRiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2dlIiwJRk1fU0YsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRnZXUiLAlGTV9ERiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFnZXUiLAlGTV9RRiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNnZXUiLAlGTV9TRiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRndSIsCUZNX0RGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxZ3UiLAlGTV9RRiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2d1IiwJRk1fU0YsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRsIiwJRk1fREYsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbCIsCUZNX1FGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2wiLAlGTV9TRiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRsZSIsCUZNX0RGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbGUiLAlGTV9RRiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2xlIiwJRk1fU0YsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRsZXUiLAlGTV9ERiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFsZXUiLAlGTV9RRiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNsZXUiLAlGTV9TRiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmRsZyIsCUZNX0RGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cWxnIiwJRk1fUUYsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzbGciLAlGTV9TRiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRsdSIsCUZNX0RGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbHUiLAlGTV9RRiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2x1IiwJRk1fU0YsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRuIiwJRk1fREYsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbiIsCUZNX1FGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c24iLAlGTV9TRiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRuZSIsCUZNX0RGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbmUiLAlGTV9RRiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c25lIiwJRk1fU0YsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRuZWciLAlGTV9ERiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFuZWciLAlGTV9RRiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNuZWciLAlGTV9TRiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRueiIsCUZNX0RGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbnoiLAlGTV9RRiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c256IiwJRk1fU0YsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmRvIiwJRk1fREYsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnFvIiwJRk1fUUYsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnNvIiwJRk1fU0YsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRwb3MiLAlGTV9ERiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFwb3MiLAlGTV9RRiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNwb3MiLAlGTV9TRiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1IiwJRk1fREYsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1IiwJRk1fUUYsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1IiwJRk1fU0YsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1ZSIsCUZNX0RGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVlIiwJRk1fUUYsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWUiLAlGTV9TRiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1ZyIsCUZNX0RGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVnIiwJRk1fUUYsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWciLAlGTV9TRiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1Z2UiLAlGTV9ERiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWdlIiwJRk1fUUYsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VnZSIsCUZNX1NGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1bCIsCUZNX0RGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVsIiwJRk1fUUYsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWwiLAlGTV9TRiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1bGUiLAlGTV9ERiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWxlIiwJRk1fUUYsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VsZSIsCUZNX1NGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmR2YyIsCUZNX0RGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxdmMiLAlGTV9RRiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3ZjIiwJRk1fU0YsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmR2cyIsCUZNX0RGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxdnMiLAlGTV9RRiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3ZzIiwJRk1fU0YsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmR6IiwJRk1fREYsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxeiIsCUZNX1FGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c3oiLAlGTV9TRiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0KLSN1bmRlZiBmbW92aWNjIC8qIHY5ICovCi0jdW5kZWYgZm1vdmZjYyAvKiB2OSAqLwotI3VuZGVmIGZtb3ZjYyAvKiB2OSAqLwotI3VuZGVmIEZNX0RGIC8qIHY5ICovCi0jdW5kZWYgRk1fUUYgLyogdjkgKi8KLSN1bmRlZiBGTV9TRiAvKiB2OSAqLwotCi0vKiBDb3Byb2Nlc3NvciBicmFuY2hlcy4gICovCi0jZGVmaW5lIENCUihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzLCBhcmNoKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIGZsYWdzfEZfREVMQVlFRCwgYXJjaCB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIGZsYWdzfEZfREVMQVlFRCwgYXJjaCB9Ci0KLS8qIEZsb2F0aW5nIHBvaW50IGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgRkJSKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2NiB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjYgfQotCi0vKiBWOSBleHRlbmRlZCBmbG9hdGluZyBwb2ludCBicmFuY2hlcy4gICovCi0jZGVmaW5lIEZCUlgob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4wKXwobG9zZSksICI2LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4wKXwobG9zZSksICIsVCA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4wKXwobG9zZSksICIsYSA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4wKXwobG9zZSksICIsYSxUIDYsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4wKXwobG9zZSksICIsTiA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4wKXwobG9zZSksICIsYSxOIDYsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4xKXwobG9zZSksICI3LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4xKXwobG9zZSksICIsVCA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4xKXwobG9zZSksICIsYSA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4xKXwobG9zZSksICIsYSxUIDcsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4xKXwobG9zZSksICIsTiA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4xKXwobG9zZSksICIsYSxOIDcsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4yKXwobG9zZSksICI4LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4yKXwobG9zZSksICIsVCA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4yKXwobG9zZSksICIsYSA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4yKXwobG9zZSksICIsYSxUIDgsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4yKXwobG9zZSksICIsTiA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4yKXwobG9zZSksICIsYSxOIDgsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4zKXwobG9zZSksICI5LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4zKXwobG9zZSksICIsVCA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4zKXwobG9zZSksICIsYSA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4zKXwobG9zZSksICIsYSxUIDksRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4zKXwobG9zZSksICIsTiA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4zKXwobG9zZSksICIsYSxOIDksRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfQotCi0vKiB2OTogV2UgbXVzdCBwdXQgYEZCUlgnIGJlZm9yZSBgRkJSJywgdG8gZW5zdXJlIHRoYXQgd2UgbmV2ZXIgbWF0Y2gKLSAgIHY5OiBzb21ldGhpbmcgYWdhaW5zdCBhbiBleHByZXNzaW9uIHVubGVzcyBpdCBpcyBhbiBleHByZXNzaW9uLiAgT3RoZXJ3aXNlLAotICAgdjk6IHdlIGVuZCB1cCB3aXRoIHVuZGVmaW5lZCBzeW1ib2wgdGFibGVzIGVudHJpZXMsIGJlY2F1c2UgdGhleSBnZXQgYWRkZWQsCi0gICB2OTogYnV0IGFyZSBub3QgZGVsZXRlZCBpZiB0aGUgcGF0dGVybiBmYWlscyB0byBtYXRjaC4gICovCi0KLSNkZWZpbmUgQ09OREZDKGZvcCwgY29wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncyksIFwKLSAgQ0JSKGNvcCwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpLCBmbGFncywgdjZub3RsZXQpCi0KLSNkZWZpbmUgQ09OREZDTChmb3AsIGNvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCBcCi0gIENCUihjb3AsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSwgZmxhZ3MsIHY2KQotCi0jZGVmaW5lIENPTkRGKGZvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpCi0KLUNPTkRGQyAgKCJmYiIsICAgICJjYiIsICAgIDB4OCwgMCksCi1DT05ERkNMICgiZmJhIiwJICAiY2JhIiwgICAweDgsIEZfQUxJQVMpLAotQ09OREZDICAoImZiZSIsCSAgImNiMCIsICAgMHg5LCAwKSwKLUNPTkRGICAgKCJmYnoiLCAgICAgICAgICAgIDB4OSwgRl9BTElBUyksCi1DT05ERkMgICgiZmJnIiwJICAiY2IyIiwgICAweDYsIDApLAotQ09OREZDICAoImZiZ2UiLCAgImNiMDIiLCAgMHhiLCAwKSwKLUNPTkRGQyAgKCJmYmwiLAkgICJjYjEiLCAgIDB4NCwgMCksCi1DT05ERkMgICgiZmJsZSIsICAiY2IwMSIsICAweGQsIDApLAotQ09OREZDICAoImZibGciLCAgImNiMTIiLCAgMHgyLCAwKSwKLUNPTkRGQ0wgKCJmYm4iLAkgICJjYm4iLCAgIDB4MCwgMCksCi1DT05ERkMgICgiZmJuZSIsICAiY2IxMjMiLCAweDEsIDApLAotQ09OREYgICAoImZibnoiLCAgICAgICAgICAgMHgxLCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYm8iLAkgICJjYjAxMiIsIDB4ZiwgMCksCi1DT05ERkMgICgiZmJ1IiwJICAiY2IzIiwgICAweDcsIDApLAotQ09OREZDICAoImZidWUiLCAgImNiMDMiLCAgMHhhLCAwKSwKLUNPTkRGQyAgKCJmYnVnIiwgICJjYjIzIiwgIDB4NSwgMCksCi1DT05ERkMgICgiZmJ1Z2UiLCAiY2IwMjMiLCAweGMsIDApLAotQ09OREZDICAoImZidWwiLCAgImNiMTMiLCAgMHgzLCAwKSwKLUNPTkRGQyAgKCJmYnVsZSIsICJjYjAxMyIsIDB4ZSwgMCksCi0KLSN1bmRlZiBDT05ERkMKLSN1bmRlZiBDT05ERkNMCi0jdW5kZWYgQ09OREYKLSN1bmRlZiBDQlIKLSN1bmRlZiBGQlIKLSN1bmRlZiBGQlJYCS8qIHY5ICovCi0KLXsgImptcCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxSRF9HMHxBU0kofjApLAkiMSsyIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErcnMyLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMCwJCSIxK2kiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStpLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwLAkJImkrMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgaStyczEsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCwlZzAgKi8KLQoteyAibm9wIiwJRjIoMCwgNCksIDB4ZmVmZmZmZmYsICIiLCAwLCB2NiB9LCAvKiBzZXRoaSAwLCAlZzAgKi8KLQoteyAic2V0IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2NiB9LAoteyAic2V0dXciLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJzZXRzdyIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjkgfSwKLXsgInNldHgiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsMSxkIiwgRl9BTElBUywgdjkgfSwKLQoteyAic2V0aGkiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiaCxkIiwgMCwgdjYgfSwKLQoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMCksIEYzKH4yLCB+MHgyMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAxKSwgRjMofjIsIH4weDIwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMSksIEYzKH4yLCB+MHgyMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMCksIEYzKH4yLCB+MHgyMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDEpLCBGMyh+MiwgfjB4MjIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDEpLCBGMyh+MiwgfjB4MjIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgInRzdWJjYyIsCUYzKDIsIDB4MjEsIDApLCBGMyh+MiwgfjB4MjEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjIiwJRjMoMiwgMHgyMSwgMSksIEYzKH4yLCB+MHgyMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRzdWJjY3R2IiwJRjMoMiwgMHgyMywgMCksIEYzKH4yLCB+MHgyMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2N0diIsCUYzKDIsIDB4MjMsIDEpLCBGMyh+MiwgfjB4MjMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInVuaW1wIiwJRjIoMHgwLCAweDApLCAweGZmYzAwMDAwLCAibiIsIDAsIHY2bm90djkgfSwKLXsgImlsbHRyYXAiLAlGMigwLCAwKSwgRjIofjAsIH4wKXxSRF9HMCwgIm4iLCAwLCB2OSB9LAotCi0vKiBUaGlzICppcyogYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMSksIEYzKH4yLCB+MHgwNywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhub3IiLAlGMygyLCAweDA3LCAxKSwgRjMofjIsIH4weDA3LCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotLyogVGhpcyAqaXMqIGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMCksIEYzKH4yLCB+MHgxNywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAxKSwgRjMofjIsIH4weDE3LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMSksIEYzKH4yLCB+MHgxNywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDApLCBGMyh+MiwgfjB4MDMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDApLCBGMyh+MiwgfjB4MTMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAxKSwgRjMofjIsIH4weDEzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAxKSwgRjMofjIsIH4weDEzLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJub3QiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwgIjEsZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHhub3IgcnMxLCUwLHJkICovCi17ICJub3QiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwgInIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4bm9yIHJkLCUwLHJkICovCi0KLXsgImJ0b2ciLAlGMygyLCAweDAzLCAwKSwgRjMofjIsIH4weDAzLCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhvciByZCxyczIscmQgKi8KLXsgImJ0b2ciLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwgLyogeG9yIHJkLGkscmQgKi8KLQotLyogRlBvcDEgYW5kIEZQb3AyIGFyZSBub3QgaW5zdHJ1Y3Rpb25zLiAgRG9uJ3QgYWNjZXB0IHRoZW0uICAqLwotCi17ICJmZHRvaSIsCUYzRigyLCAweDM0LCAweDBkMiksIEYzRih+MiwgfjB4MzQsIH4weDBkMil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnF0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDMpLCBGM0YofjIsIH4weDM0LCB+MHgwZDMpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZkdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgyKXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnN0b3giLAlGM0YoMiwgMHgzNCwgMHgwODEpLCBGM0YofjIsIH4weDM0LCB+MHgwODEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmcXRveCIsCUYzRigyLCAweDM0LCAweDA4MyksIEYzRih+MiwgfjB4MzQsIH4weDA4Myl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjkgfSwKLQoteyAiZml0b2QiLAlGM0YoMiwgMHgzNCwgMHgwYzgpLCBGM0YofjIsIH4weDM0LCB+MHgwYzgpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmaXRvcyIsCUYzRigyLCAweDM0LCAweDBjNCksIEYzRih+MiwgfjB4MzQsIH4weDBjNCl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZpdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNjKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNjKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmeHRvZCIsCUYzRigyLCAweDM0LCAweDA4OCksIEYzRih+MiwgfjB4MzQsIH4weDA4OCl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZ4dG9zIiwJRjNGKDIsIDB4MzQsIDB4MDg0KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDg0KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnh0b3EiLAlGM0YoMiwgMHgzNCwgMHgwOGMpLCBGM0YofjIsIH4weDM0LCB+MHgwOGMpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY5IH0sCi0KLXsgImZkdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNlKXxSUzFfRzAsICJCLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmR0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzYpLCBGM0YofjIsIH4weDM0LCB+MHgwYzYpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmcXRvZCIsCUYzRigyLCAweDM0LCAweDBjYiksIEYzRih+MiwgfjB4MzQsIH4weDBjYil8UlMxX0cwLCAiUixIIiwgRl9GTE9BVCwgdjggfSwKLXsgImZxdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM3KXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OCB9LAoteyAiZnN0b2QiLAlGM0YoMiwgMHgzNCwgMHgwYzkpLCBGM0YofjIsIH4weDM0LCB+MHgwYzkpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3RvcSIsCUYzRigyLCAweDM0LCAweDBjZCksIEYzRih+MiwgfjB4MzQsIH4weDBjZCl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZmRpdmQiLAlGM0YoMiwgMHgzNCwgMHgwNGUpLCBGM0YofjIsIH4weDM0LCB+MHgwNGUpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZmRpdnEiLAlGM0YoMiwgMHgzNCwgMHgwNGYpLCBGM0YofjIsIH4weDM0LCB+MHgwNGYpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmRpdngiLAlGM0YoMiwgMHgzNCwgMHgwNGYpLCBGM0YofjIsIH4weDM0LCB+MHgwNGYpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmZGl2cyIsCUYzRigyLCAweDM0LCAweDA0ZCksIEYzRih+MiwgfjB4MzQsIH4weDA0ZCksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbXVsZCIsCUYzRigyLCAweDM0LCAweDA0YSksIEYzRih+MiwgfjB4MzQsIH4weDA0YSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbXVscSIsCUYzRigyLCAweDM0LCAweDA0YiksIEYzRih+MiwgfjB4MzQsIH4weDA0YiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmbXVseCIsCUYzRigyLCAweDM0LCAweDA0YiksIEYzRih+MiwgfjB4MzQsIH4weDA0YiksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZtdWxzIiwJRjNGKDIsIDB4MzQsIDB4MDQ5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ5KSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLQoteyAiZmRtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDZlKSwgInYsQixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkbXVseCIsCUYzRigyLCAweDM0LCAweDA2ZSksIEYzRih+MiwgfjB4MzQsIH4weDA2ZSksICJ2LEIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzbXVsZCIsCUYzRigyLCAweDM0LCAweDA2OSksIEYzRih+MiwgfjB4MzQsIH4weDA2OSksICJlLGYsSCIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZzcXJ0ZCIsCUYzRigyLCAweDM0LCAweDAyYSksIEYzRih+MiwgfjB4MzQsIH4weDAyYSl8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjcgfSwKLXsgImZzcXJ0cSIsCUYzRigyLCAweDM0LCAweDAyYiksIEYzRih+MiwgfjB4MzQsIH4weDAyYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzcXJ0eCIsCUYzRigyLCAweDM0LCAweDAyYiksIEYzRih+MiwgfjB4MzQsIH4weDAyYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnNxcnRzIiwJRjNGKDIsIDB4MzQsIDB4MDI5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDI5KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NyB9LAotCi17ICJmYWJzZCIsCUYzRigyLCAweDM0LCAweDAwYSksIEYzRih+MiwgfjB4MzQsIH4weDAwYSl8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZhYnNxIiwJRjNGKDIsIDB4MzQsIDB4MDBiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmFic3giLAlGM0YoMiwgMHgzNCwgMHgwMGIpLCBGM0YofjIsIH4weDM0LCB+MHgwMGIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZhYnNzIiwJRjNGKDIsIDB4MzQsIDB4MDA5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA5KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm1vdmQiLAlGM0YoMiwgMHgzNCwgMHgwMDIpLCBGM0YofjIsIH4weDM0LCB+MHgwMDIpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbW92cSIsCUYzRigyLCAweDM0LCAweDAwMyksIEYzRih+MiwgfjB4MzQsIH4weDAwMyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZtb3Z4IiwJRjNGKDIsIDB4MzQsIDB4MDAzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAzKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmbW92cyIsCUYzRigyLCAweDM0LCAweDAwMSksIEYzRih+MiwgfjB4MzQsIH4weDAwMSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZuZWdkIiwJRjNGKDIsIDB4MzQsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA2KXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm5lZ3EiLAlGM0YoMiwgMHgzNCwgMHgwMDcpLCBGM0YofjIsIH4weDM0LCB+MHgwMDcpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbmVneCIsCUYzRigyLCAweDM0LCAweDAwNyksIEYzRih+MiwgfjB4MzQsIH4weDAwNyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZm5lZ3MiLAlGM0YoMiwgMHgzNCwgMHgwMDUpLCBGM0YofjIsIH4weDM0LCB+MHgwMDUpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLXsgImZhZGRkIiwJRjNGKDIsIDB4MzQsIDB4MDQyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQyKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZhZGRxIiwJRjNGKDIsIDB4MzQsIDB4MDQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQzKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZhZGR4IiwJRjNGKDIsIDB4MzQsIDB4MDQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQzKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmFkZHMiLAlGM0YoMiwgMHgzNCwgMHgwNDEpLCBGM0YofjIsIH4weDM0LCB+MHgwNDEpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN1YmQiLAlGM0YoMiwgMHgzNCwgMHgwNDYpLCBGM0YofjIsIH4weDM0LCB+MHgwNDYpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN1YnEiLAlGM0YoMiwgMHgzNCwgMHgwNDcpLCBGM0YofjIsIH4weDM0LCB+MHgwNDcpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnN1YngiLAlGM0YoMiwgMHgzNCwgMHgwNDcpLCBGM0YofjIsIH4weDM0LCB+MHgwNDcpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc3VicyIsCUYzRigyLCAweDM0LCAweDA0NSksIEYzRih+MiwgfjB4MzQsIH4weDA0NSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLSNkZWZpbmUgQ01QRkNDKHgpCSgoKHgpJjB4Myk8PDI1KQotCi17ICJmY21wZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTIpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Mil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjYsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjksdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTYpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjcsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTMpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Myl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVCwgdjggfSwKLXsgImZjbXBxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjgsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU3KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTcpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjYsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjksVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXB4IiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUzKXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmY21weCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNixWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNyxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOCxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOSxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU3KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTcpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZjbXBleCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNixWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjcsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI4LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOSxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wcyIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTEpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1MSl8UkRfRzAsICJlLGYiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjcsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI4LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NSksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU1KXxSRF9HMCwgImUsZiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI3LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjgsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAotCi0vKiBUaGVzZSBFeHRlbmRlZCBGUG9wIChGSUZPKSBpbnN0cnVjdGlvbnMgYXJlIG5ldyBpbiB0aGUgRnVqaXRzdQotICAgTUI4NjkzNCwgcmVwbGFjaW5nIHRoZSBDUG9wIGluc3RydWN0aW9ucyBmcm9tIHY2IGFuZCBsYXRlcgotICAgcHJvY2Vzc29ycy4gICovCi0KLSNkZWZpbmUgRUZQT1AxXzIobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzYsIG9wKSwgRjNGKH4yLCB+MHgzNiwgfm9wKXxSUzFfRzAsIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0jZGVmaW5lIEVGUE9QMV8zKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM2LCBvcCksIEYzRih+MiwgfjB4MzYsIH5vcCksICAgICAgICBhcmdzLCAwLCBzcGFyY2xpdGUgfQotI2RlZmluZSBFRlBPUDJfMihuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNywgb3ApLCBGM0YofjIsIH4weDM3LCB+b3ApfFJEX0cwLCAgYXJncywgMCwgc3BhcmNsaXRlIH0KLQotRUZQT1AxXzIgKCJlZml0b2QiLAkweDBjOCwgImYsSCIpLAotRUZQT1AxXzIgKCJlZml0b3MiLAkweDBjNCwgImYsZyIpLAotRUZQT1AxXzIgKCJlZmR0b2kiLAkweDBkMiwgIkIsZyIpLAotRUZQT1AxXzIgKCJlZnN0b2kiLAkweDBkMSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZnN0b2QiLAkweDBjOSwgImYsSCIpLAotRUZQT1AxXzIgKCJlZmR0b3MiLAkweDBjNiwgIkIsZyIpLAotRUZQT1AxXzIgKCJlZm1vdnMiLAkweDAwMSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZm5lZ3MiLAkweDAwNSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZmFic3MiLAkweDAwOSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZnNxcnRkIiwJMHgwMmEsICJCLEgiKSwKLUVGUE9QMV8yICgiZWZzcXJ0cyIsCTB4MDI5LCAiZixnIiksCi1FRlBPUDFfMyAoImVmYWRkZCIsCTB4MDQyLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZhZGRzIiwJMHgwNDEsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZnN1YmQiLAkweDA0NiwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmc3VicyIsCTB4MDQ1LCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZkaXZkIiwJMHgwNGUsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZmRpdnMiLAkweDA0ZCwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmbXVsZCIsCTB4MDRhLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZtdWxzIiwJMHgwNDksICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZnNtdWxkIiwJMHgwNjksICJlLGYsSCIpLAotRUZQT1AyXzIgKCJlZmNtcGQiLAkweDA1MiwgInYsQiIpLAotRUZQT1AyXzIgKCJlZmNtcGVkIiwJMHgwNTYsICJ2LEIiKSwKLUVGUE9QMl8yICgiZWZjbXBzIiwJMHgwNTEsICJlLGYiKSwKLUVGUE9QMl8yICgiZWZjbXBlcyIsCTB4MDU1LCAiZSxmIiksCi0KLSN1bmRlZiBFRlBPUDFfMgotI3VuZGVmIEVGUE9QMV8zCi0jdW5kZWYgRUZQT1AyXzIKLQotLyogVGhlc2UgYXJlIG1hcmtlZCBGX0FMSUFTLCBzbyB0aGF0IHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aCBzcGFyY2xpdGUgaW5zbnMKLSAgIHByZXNlbnQuICBPdGhlcndpc2UsIHRoZSBGX0FMSUFTIGZsYWcgaXMgaWdub3JlZC4gICovCi17ICJjcG9wMSIsCUYzKDIsIDB4MzYsIDApLCBGMyh+MiwgfjB4MzYsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCi17ICJjcG9wMiIsCUYzKDIsIDB4MzcsIDApLCBGMyh+MiwgfjB4MzcsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCi0KLS8qIHNwYXJjbGV0IHNwZWNpZmljIGluc25zICovCi0KLUNPTU1VVEVPUCAoInVtYWMiLCAweDNlLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbWFjIiwgMHgzZiwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgidW1hY2QiLCAweDJlLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbWFjZCIsIDB4MmYsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInVtdWxkIiwgMHgwOSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic211bGQiLCAweDBkLCBzcGFyY2xldCksCi0KLXsgInNodWZmbGUiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsZXQgfSwKLXsgInNodWZmbGUiLAlGMygyLCAweDJkLCAxKSwgRjMofjIsIH4weDJkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldCB9LAotCi0vKiBUaGUgbWFudWFsIGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUgb24gdGhlc2UgaW5zbnMuICBUaGUgYHJzMicgZmllbGQgaXMKLSAgIHRyZWF0ZWQgYXMgYmVpbmcgNiBiaXRzIHRvIGFjY291bnQgZm9yIDYgYml0IGltbWVkaWF0ZXMgdG8gY3B1c2guICBJdCBpcwotICAgYXNzdW1lZCB0aGF0IGl0IGlzIGludGVuZGVkIHRoYXQgYml0IDUgaXMgMCB3aGVuIHJzMiBjb250YWlucyBhIHJlZy4gICovCi0jZGVmaW5lIEJJVDUgKDE8PDUpCi17ICJjcmRjeHQiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoNCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+NCl8QklUNXxSUzIofjApLAkiVSxkIiwgMCwgc3BhcmNsZXQgfSwKLXsgImN3cmN4dCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgzKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4zKXxCSVQ1fFJTMih+MCksCSIxLHUiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2giLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MCl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2giLAlGMygyLCAweDM2LCAxKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjEpfFNMQ1BPUCh+MCl8UkQofjApLAkJIjEsWSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaGEiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMSksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MSl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2hhIiwJRjMoMiwgMHgzNiwgMSl8U0xDUE9QKDEpLCBGMyh+MiwgfjB4MzYsIH4xKXxTTENQT1AofjEpfFJEKH4wKSwJCSIxLFkiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1bGwiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMiksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+Mil8QklUNXxSUzEofjApfFJTMih+MCksICJkIiwgMCwgc3BhcmNsZXQgfSwKLSN1bmRlZiBCSVQ1Ci0KLS8qIHNwYXJjbGV0IGNvcHJvY2Vzc29yIGJyYW5jaCBpbnNucyAqLwotI2RlZmluZSBTTENCQ0MyKG9wY29kZSwgbWFzaywgbG9zZSkgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBGX0RFTEFZRUR8Rl9DT05EQlIsIHNwYXJjbGV0IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgRl9ERUxBWUVEfEZfQ09OREJSLCBzcGFyY2xldCB9Ci0jZGVmaW5lIFNMQ0JDQyhvcGNvZGUsIG1hc2spIFwKLSAgU0xDQkNDMihvcGNvZGUsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSkKLQotLyogY2JuLGNiYSBjYW4ndCBiZSBkZWZpbmVkIGhlcmUgYmVjYXVzZSB0aGV5J3JlIGRlZmluZWQgZWxzZXdoZXJlIGFuZCBHQVMKLSAgIHJlcXVpcmVzIGFsbCBtbmVtb25pY3Mgb2YgdGhlIHNhbWUgbmFtZSB0byBiZSBjb25zZWN1dGl2ZS4gICovCi0vKlNMQ0JDQygiY2JuIiwgMCksIC0gYWxyZWFkeSBkZWZpbmVkICovCi1TTENCQ0MoImNiZSIsIDEpLAotU0xDQkNDKCJjYmYiLCAyKSwKLVNMQ0JDQygiY2JlZiIsIDMpLAotU0xDQkNDKCJjYnIiLCA0KSwKLVNMQ0JDQygiY2JlciIsIDUpLAotU0xDQkNDKCJjYmZyIiwgNiksCi1TTENCQ0MoImNiZWZyIiwgNyksCi0vKlNMQ0JDQygiY2JhIiwgOCksIC0gYWxyZWFkeSBkZWZpbmVkICovCi1TTENCQ0MoImNibmUiLCA5KSwKLVNMQ0JDQygiY2JuZiIsIDEwKSwKLVNMQ0JDQygiY2JuZWYiLCAxMSksCi1TTENCQ0MoImNibnIiLCAxMiksCi1TTENCQ0MoImNibmVyIiwgMTMpLAotU0xDQkNDKCJjYm5mciIsIDE0KSwKLVNMQ0JDQygiY2JuZWZyIiwgMTUpLAotCi0jdW5kZWYgU0xDQkNDMgotI3VuZGVmIFNMQ0JDQwotCi17ICJjYXNhIiwJRjMoMywgMHgzYywgMCksIEYzKH4zLCB+MHgzYywgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoteyAiY2FzYSIsCUYzKDMsIDB4M2MsIDEpLCBGMyh+MywgfjB4M2MsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKLXsgImNhc3hhIiwJRjMoMywgMHgzZSwgMCksIEYzKH4zLCB+MHgzZSwgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoteyAiY2FzeGEiLAlGMygzLCAweDNlLCAxKSwgRjMofjMsIH4weDNlLCB+MSksICJbMV1vLDIsZCIsIDAsIHY5IH0sCi0KLS8qIHY5IHN5bnRoZXRpYyBpbnNucyAqLwoteyAiaXByZWZldGNoIiwJRjIoMCwgMSl8KDI8PDIwKXxCUFJFRCwgRjIofjAsIH4xKXwoMTw8MjApfEFOTlVMfENPTkQofjApLCAiRyIsIDAsIHY5IH0sIC8qIGJuLGEscHQgJXhjYyxsYWJlbCAqLwoteyAic2lnbngiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNyYSByczEsJWcwLHJkICovCi17ICJzaWdueCIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiciIsIEZfQUxJQVMsIHY5IH0sIC8qIHNyYSByZCwlZzAscmQgKi8KLXsgImNscnV3IiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICIxLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmwgcnMxLCVnMCxyZCAqLwoteyAiY2xydXciLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgInIiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmwgcmQsJWcwLHJkICovCi17ICJjYXMiLAlGMygzLCAweDNjLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzYywgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzYSBbcnMxXUFTSV9QLHJzMixyZCAqLwoteyAiY2FzbCIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDg4KSwgRjMofjMsIH4weDNjLCB+MCl8QVNJKH4weDg4KSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXNhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KLXsgImNhc3giLAlGMygzLCAweDNlLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzZSwgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzeGEgW3JzMV1BU0lfUCxyczIscmQgKi8KLXsgImNhc3hsIiwJRjMoMywgMHgzZSwgMCl8QVNJKDB4ODgpLCBGMyh+MywgfjB4M2UsIH4wKXxBU0kofjB4ODgpLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc3hhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KLQotLyogVWx0cmFzcGFyYyBleHRlbnNpb25zICovCi17ICJzaHV0ZG93biIsCUYzRigyLCAweDM2LCAweDA4MCksIEYzRih+MiwgfjB4MzYsIH4weDA4MCl8UkRfRzB8UlMxX0cwfFJTMl9HMCwgIiIsIDAsIHY5YSB9LAotCi0vKiBGSVhNRTogRG8gd2Ugd2FudCB0byBtYXJrIHRoZXNlIGFzIEZfRkxPQVQsIG9yIHNvbWV0aGluZyBzaW1pbGFyPyAgKi8KLXsgImZwYWRkMTYiLAlGM0YoMiwgMHgzNiwgMHgwNTApLCBGM0YofjIsIH4weDM2LCB+MHgwNTApLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWRkMTZzIiwJRjNGKDIsIDB4MzYsIDB4MDUxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUxKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcGFkZDMyIiwJRjNGKDIsIDB4MzYsIDB4MDUyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFkZDMycyIsCUYzRigyLCAweDM2LCAweDA1MyksIEYzRih+MiwgfjB4MzYsIH4weDA1MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBzdWIxNiIsCUYzRigyLCAweDM2LCAweDA1NCksIEYzRih+MiwgfjB4MzYsIH4weDA1NCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBzdWIxNnMiLAlGM0YoMiwgMHgzNiwgMHgwNTUpLCBGM0YofjIsIH4weDM2LCB+MHgwNTUpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwc3ViMzIiLAlGM0YoMiwgMHgzNiwgMHgwNTYpLCBGM0YofjIsIH4weDM2LCB+MHgwNTYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwc3ViMzJzIiwJRjNGKDIsIDB4MzYsIDB4MDU3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU3KSwgImUsZixnIiwgMCwgdjlhIH0sCi0KLXsgImZwYWNrMzIiLAlGM0YoMiwgMHgzNiwgMHgwM2EpLCBGM0YofjIsIH4weDM2LCB+MHgwM2EpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWNrMTYiLAlGM0YoMiwgMHgzNiwgMHgwM2IpLCBGM0YofjIsIH4weDM2LCB+MHgwM2IpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoteyAiZnBhY2tmaXgiLAlGM0YoMiwgMHgzNiwgMHgwM2QpLCBGM0YofjIsIH4weDM2LCB+MHgwM2QpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoteyAiZmV4cGFuZCIsCUYzRigyLCAweDM2LCAweDA0ZCksIEYzRih+MiwgfjB4MzYsIH4weDA0ZCl8UlMxX0cwLCAiZixIIiwgMCwgdjlhIH0sCi17ICJmcG1lcmdlIiwJRjNGKDIsIDB4MzYsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDRiKSwgImUsZixIIiwgMCwgdjlhIH0sCi0KLS8qIE5vdGUgdGhhdCB0aGUgbWl4aW5nIG9mIDMyLzY0IGJpdCByZWdzIGlzIGludGVudGlvbmFsLiAgKi8KLXsgImZtdWw4eDE2IiwJCUYzRigyLCAweDM2LCAweDAzMSksIEYzRih+MiwgfjB4MzYsIH4weDAzMSksICJlLEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh4MTZhdSIsCQlGM0YoMiwgMHgzNiwgMHgwMzMpLCBGM0YofjIsIH4weDM2LCB+MHgwMzMpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4eDE2YWwiLAkJRjNGKDIsIDB4MzYsIDB4MDM1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM1KSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHN1eDE2IiwJCUYzRigyLCAweDM2LCAweDAzNiksIEYzRih+MiwgfjB4MzYsIH4weDAzNiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh1bHgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzcpLCBGM0YofjIsIH4weDM2LCB+MHgwMzcpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWxkOHN1eDE2IiwJRjNGKDIsIDB4MzYsIDB4MDM4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM4KSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsZDh1bHgxNiIsCUYzRigyLCAweDM2LCAweDAzOSksIEYzRih+MiwgfjB4MzYsIH4weDAzOSksICJlLGYsSCIsIDAsIHY5YSB9LAotCi17ICJhbGlnbmFkZHIiLAlGM0YoMiwgMHgzNiwgMHgwMTgpLCBGM0YofjIsIH4weDM2LCB+MHgwMTgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFsaWduYWRkcmwiLAlGM0YoMiwgMHgzNiwgMHgwMWEpLCBGM0YofjIsIH4weDM2LCB+MHgwMWEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImZhbGlnbmRhdGEiLAlGM0YoMiwgMHgzNiwgMHgwNDgpLCBGM0YofjIsIH4weDM2LCB+MHgwNDgpLCAidixCLEgiLCAwLCB2OWEgfSwKLQoteyAiZnplcm8iLAlGM0YoMiwgMHgzNiwgMHgwNjApLCBGM0YofjIsIH4weDM2LCB+MHgwNjApLCAiSCIsIDAsIHY5YSB9LAoteyAiZnplcm9zIiwJRjNGKDIsIDB4MzYsIDB4MDYxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYxKSwgImciLCAwLCB2OWEgfSwKLXsgImZvbmUiLAlGM0YoMiwgMHgzNiwgMHgwN2UpLCBGM0YofjIsIH4weDM2LCB+MHgwN2UpLCAiSCIsIDAsIHY5YSB9LAoteyAiZm9uZXMiLAlGM0YoMiwgMHgzNiwgMHgwN2YpLCBGM0YofjIsIH4weDM2LCB+MHgwN2YpLCAiZyIsIDAsIHY5YSB9LAoteyAiZnNyYzEiLAlGM0YoMiwgMHgzNiwgMHgwNzQpLCBGM0YofjIsIH4weDM2LCB+MHgwNzQpLCAidixIIiwgMCwgdjlhIH0sCi17ICJmc3JjMXMiLAlGM0YoMiwgMHgzNiwgMHgwNzUpLCBGM0YofjIsIH4weDM2LCB+MHgwNzUpLCAiZSxnIiwgMCwgdjlhIH0sCi17ICJmc3JjMiIsCUYzRigyLCAweDM2LCAweDA3OCksIEYzRih+MiwgfjB4MzYsIH4weDA3OCksICJCLEgiLCAwLCB2OWEgfSwKLXsgImZzcmMycyIsCUYzRigyLCAweDM2LCAweDA3OSksIEYzRih+MiwgfjB4MzYsIH4weDA3OSksICJmLGciLCAwLCB2OWEgfSwKLXsgImZub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDZhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZhKSwgInYsSCIsIDAsIHY5YSB9LAoteyAiZm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDZiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZiKSwgImUsZyIsIDAsIHY5YSB9LAoteyAiZm5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjYpLCBGM0YofjIsIH4weDM2LCB+MHgwNjYpLCAiQixIIiwgMCwgdjlhIH0sCi17ICJmbm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNjcpLCBGM0YofjIsIH4weDM2LCB+MHgwNjcpLCAiZixnIiwgMCwgdjlhIH0sCi17ICJmb3IiLAlGM0YoMiwgMHgzNiwgMHgwN2MpLCBGM0YofjIsIH4weDM2LCB+MHgwN2MpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcnMiLAlGM0YoMiwgMHgzNiwgMHgwN2QpLCBGM0YofjIsIH4weDM2LCB+MHgwN2QpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZub3IiLAlGM0YoMiwgMHgzNiwgMHgwNjIpLCBGM0YofjIsIH4weDM2LCB+MHgwNjIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZub3JzIiwJRjNGKDIsIDB4MzYsIDB4MDYzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYzKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDcwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcwKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kcyIsCUYzRigyLCAweDM2LCAweDA3MSksIEYzRih+MiwgfjB4MzYsIH4weDA3MSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm5hbmQiLAlGM0YoMiwgMHgzNiwgMHgwNmUpLCBGM0YofjIsIH4weDM2LCB+MHgwNmUpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZuYW5kcyIsCUYzRigyLCAweDM2LCAweDA2ZiksIEYzRih+MiwgfjB4MzYsIH4weDA2ZiksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnhvciIsCUYzRigyLCAweDM2LCAweDA2YyksIEYzRih+MiwgfjB4MzYsIH4weDA2YyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnhvcnMiLAlGM0YoMiwgMHgzNiwgMHgwNmQpLCBGM0YofjIsIH4weDM2LCB+MHgwNmQpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZ4bm9yIiwJRjNGKDIsIDB4MzYsIDB4MDcyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmeG5vcnMiLAlGM0YoMiwgMHgzNiwgMHgwNzMpLCBGM0YofjIsIH4weDM2LCB+MHgwNzMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZvcm5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwN2EpLCBGM0YofjIsIH4weDM2LCB+MHgwN2EpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDdiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdiKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDc2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QycyIsCUYzRigyLCAweDM2LCAweDA3NyksIEYzRih+MiwgfjB4MzYsIH4weDA3NyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwNjgpLCBGM0YofjIsIH4weDM2LCB+MHgwNjgpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRub3QxcyIsCUYzRigyLCAweDM2LCAweDA2OSksIEYzRih+MiwgfjB4MzYsIH4weDA2OSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjQpLCBGM0YofjIsIH4weDM2LCB+MHgwNjQpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRub3QycyIsCUYzRigyLCAweDM2LCAweDA2NSksIEYzRih+MiwgfjB4MzYsIH4weDA2NSksICJlLGYsZyIsIDAsIHY5YSB9LAotCi17ICJmY21wZ3QxNiIsCUYzRigyLCAweDM2LCAweDAyOCksIEYzRih+MiwgfjB4MzYsIH4weDAyOCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGd0MzIiLAlGM0YoMiwgMHgzNiwgMHgwMmMpLCBGM0YofjIsIH4weDM2LCB+MHgwMmMpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBsZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDIwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDIwKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbGUzMiIsCUYzRigyLCAweDM2LCAweDAyNCksIEYzRih+MiwgfjB4MzYsIH4weDAyNCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcG5lMTYiLAlGM0YoMiwgMHgzNiwgMHgwMjIpLCBGM0YofjIsIH4weDM2LCB+MHgwMjIpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBuZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDI2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI2KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZXExNiIsCUYzRigyLCAweDM2LCAweDAyYSksIEYzRih+MiwgfjB4MzYsIH4weDAyYSksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGVxMzIiLAlGM0YoMiwgMHgzNiwgMHgwMmUpLCBGM0YofjIsIH4weDM2LCB+MHgwMmUpLCAidixCLGQiLCAwLCB2OWEgfSwKLQoteyAiZWRnZTgiLAlGM0YoMiwgMHgzNiwgMHgwMDApLCBGM0YofjIsIH4weDM2LCB+MHgwMDApLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2U4bCIsCUYzRigyLCAweDM2LCAweDAwMiksIEYzRih+MiwgfjB4MzYsIH4weDAwMiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDA0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA0KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMTZsIiwJRjNGKDIsIDB4MzYsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA2KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMzIiLAlGM0YoMiwgMHgzNiwgMHgwMDgpLCBGM0YofjIsIH4weDM2LCB+MHgwMDgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UzMmwiLAlGM0YoMiwgMHgzNiwgMHgwMGEpLCBGM0YofjIsIH4weDM2LCB+MHgwMGEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLQoteyAicGRpc3QiLAlGM0YoMiwgMHgzNiwgMHgwM2UpLCBGM0YofjIsIH4weDM2LCB+MHgwM2UpLCAidixCLEgiLCAwLCB2OWEgfSwKLQoteyAiYXJyYXk4IiwJRjNGKDIsIDB4MzYsIDB4MDEwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEwKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhcnJheTE2IiwJRjNGKDIsIDB4MzYsIDB4MDEyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEyKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhcnJheTMyIiwJRjNGKDIsIDB4MzYsIDB4MDE0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDE0KSwgIjEsMixkIiwgMCwgdjlhIH0sCi0KLS8qIE1vcmUgdjkgc3BlY2lmaWMgaW5zbnMsIHRoZXNlIG5lZWQgdG8gY29tZSBsYXN0IHNvIHRoZXkgZG8gbm90IGNsYXNoCi0gICB3aXRoIHY5YSBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZWRnZTgiIHdoaWNoIGxvb2tzIGxpa2UgaW1wZGVwMS4gKi8KLQotI2RlZmluZSBJTVBERVAobmFtZSwgY29kZSkgXAoteyBuYW1lLAlGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCl8QVNJKH4wKSwgIjEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLAlGMygyLCBjb2RlLCAxKSwgRjMofjIsIH5jb2RlLCB+MSksCSAgICIxLGksZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwgRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApLCAgICAgICAgICJ4LDEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLCBGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCksICAgICAgICAgIngsZSxmLGciLCAwLCB2OW5vdHY5YSB9Ci0KLUlNUERFUCAoImltcGRlcDEiLCAweDM2KSwKLUlNUERFUCAoImltcGRlcDIiLCAweDM3KSwKLQotI3VuZGVmIElNUERFUAotCi19OwotCi1jb25zdCBpbnQgc3BhcmNfbnVtX29wY29kZXMgPSAoKHNpemVvZiBzcGFyY19vcGNvZGVzKS8oc2l6ZW9mIHNwYXJjX29wY29kZXNbMF0pKTsKLQwKLS8qIFV0aWxpdGllcyBmb3IgYXJndW1lbnQgcGFyc2luZy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCB2YWx1ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gYXJnOwotCi0vKiBMb29rIHVwIE5BTUUgaW4gVEFCTEUuICAqLwotCi1zdGF0aWMgaW50IGxvb2t1cF9uYW1lIFBBUkFNUyAoKGNvbnN0IGFyZyAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBjb25zdCBjaGFyICpsb29rdXBfdmFsdWUgUEFSQU1TICgoY29uc3QgYXJnICosIGludCkpOwotCi1zdGF0aWMgaW50Ci1sb29rdXBfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IGFyZyAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGFyZyAqcDsKLQotICBmb3IgKHAgPSB0YWJsZTsgcC0+bmFtZTsgKytwKQotICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gcC0+dmFsdWU7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0vKiBMb29rIHVwIFZBTFVFIGluIFRBQkxFLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbG9va3VwX3ZhbHVlICh0YWJsZSwgdmFsdWUpCi0gICAgIGNvbnN0IGFyZyAqdGFibGU7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgY29uc3QgYXJnICpwOwotCi0gIGZvciAocCA9IHRhYmxlOyBwLT5uYW1lOyArK3ApCi0gICAgaWYgKHZhbHVlID09IHAtPnZhbHVlKQotICAgICAgcmV0dXJuIHAtPm5hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIDA7Ci19Ci0MCi0vKiBIYW5kbGUgQVNJJ3MuICAqLwotCi1zdGF0aWMgYXJnIGFzaV90YWJsZVtdID0KLXsKLSAgLyogVGhlc2UgYXJlIGluIHRoZSB2OSBhcmNoaXRlY3R1cmUgbWFudWFsLiAgKi8KLSAgLyogVGhlIHNob3J0ZXIgdmVyc2lvbnMgYXBwZWFyIGZpcnN0LCB0aGV5J3JlIGhlcmUgYmVjYXVzZSBTdW4ncyBhcyBoYXMgdGhlbS4KLSAgICAgU3VuJ3MgYXMgdXNlcyAjQVNJX1BfTCBpbnN0ZWFkIG9mICNBU0lfUEwgKHdoaWNoIGFwcGVhcnMgaW4gdGhlCi0gICAgIFVsdHJhU1BBUkMgYXJjaGl0ZWN0dXJlIG1hbnVhbCkuICAqLwotICB7IDB4MDQsICIjQVNJX04iIH0sCi0gIHsgMHgwYywgIiNBU0lfTl9MIiB9LAotICB7IDB4MTAsICIjQVNJX0FJVVAiIH0sCi0gIHsgMHgxMSwgIiNBU0lfQUlVUyIgfSwKLSAgeyAweDE4LCAiI0FTSV9BSVVQX0wiIH0sCi0gIHsgMHgxOSwgIiNBU0lfQUlVU19MIiB9LAotICB7IDB4ODAsICIjQVNJX1AiIH0sCi0gIHsgMHg4MSwgIiNBU0lfUyIgfSwKLSAgeyAweDgyLCAiI0FTSV9QTkYiIH0sCi0gIHsgMHg4MywgIiNBU0lfU05GIiB9LAotICB7IDB4ODgsICIjQVNJX1BfTCIgfSwKLSAgeyAweDg5LCAiI0FTSV9TX0wiIH0sCi0gIHsgMHg4YSwgIiNBU0lfUE5GX0wiIH0sCi0gIHsgMHg4YiwgIiNBU0lfU05GX0wiIH0sCi0gIHsgMHgwNCwgIiNBU0lfTlVDTEVVUyIgfSwKLSAgeyAweDBjLCAiI0FTSV9OVUNMRVVTX0xJVFRMRSIgfSwKLSAgeyAweDEwLCAiI0FTSV9BU19JRl9VU0VSX1BSSU1BUlkiIH0sCi0gIHsgMHgxMSwgIiNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlkiIH0sCi0gIHsgMHgxOCwgIiNBU0lfQVNfSUZfVVNFUl9QUklNQVJZX0xJVFRMRSIgfSwKLSAgeyAweDE5LCAiI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4MCwgIiNBU0lfUFJJTUFSWSIgfSwKLSAgeyAweDgxLCAiI0FTSV9TRUNPTkRBUlkiIH0sCi0gIHsgMHg4MiwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUIiB9LAotICB7IDB4ODMsICIjQVNJX1NFQ09OREFSWV9OT0ZBVUxUIiB9LAotICB7IDB4ODgsICIjQVNJX1BSSU1BUllfTElUVExFIiB9LAotICB7IDB4ODksICIjQVNJX1NFQ09OREFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4YSwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSIgfSwKLSAgeyAweDhiLCAiI0FTSV9TRUNPTkRBUllfTk9GQVVMVF9MSVRUTEUiIH0sCi0gIC8qIFRoZXNlIGFyZSBVbHRyYVNQQVJDIGV4dGVuc2lvbnMuICAqLwotICAvKiBGSVhNRTogVGhlcmUgYXJlIGRvemVucyBvZiB0aGVtLiAgTm90IHN1cmUgd2Ugd2FudCB0aGVtIGFsbC4KLSAgICAgTW9zdCBhcmUgZm9yIGtlcm5lbCBidWlsZGluZyBidXQgc29tZSBhcmUgZm9yIHZpcyB0eXBlIHN0dWZmLiAgKi8KLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIEFTSSBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9hc2kgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAoYXNpX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBBU0kgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9hc2kgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKGFzaV90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIG1lbWJhciBtYXNrcy4gICovCi0KLXN0YXRpYyBhcmcgbWVtYmFyX3RhYmxlW10gPQotewotICB7IDB4NDAsICIjU3luYyIgfSwKLSAgeyAweDIwLCAiI01lbUlzc3VlIiB9LAotICB7IDB4MTAsICIjTG9va2FzaWRlIiB9LAotICB7IDB4MDgsICIjU3RvcmVTdG9yZSIgfSwKLSAgeyAweDA0LCAiI0xvYWRTdG9yZSIgfSwKLSAgeyAweDAyLCAiI1N0b3JlTG9hZCIgfSwKLSAgeyAweDAxLCAiI0xvYWRMb2FkIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgbWVtYmFyIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9tZW1iYXIgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAobWVtYmFyX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBtZW1iYXIgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9tZW1iYXIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKG1lbWJhcl90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIHByZWZldGNoIGFyZ3MuICAqLwotCi1zdGF0aWMgYXJnIHByZWZldGNoX3RhYmxlW10gPQotewotICB7IDAsICIjbl9yZWFkcyIgfSwKLSAgeyAxLCAiI29uZV9yZWFkIiB9LAotICB7IDIsICIjbl93cml0ZXMiIH0sCi0gIHsgMywgIiNvbmVfd3JpdGUiIH0sCi0gIHsgNCwgIiNwYWdlIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgcHJlZmV0Y2ggYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX3ByZWZldGNoIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKHByZWZldGNoX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBwcmVmZXRjaCB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX3ByZWZldGNoICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChwcmVmZXRjaF90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4gICovCi0KLXN0YXRpYyBhcmcgc3BhcmNsZXRfY3ByZWdfdGFibGVbXSA9Ci17Ci0gIHsgMCwgIiVjY3NyIiB9LAotICB7IDEsICIlY2NmciIgfSwKLSAgeyAyLCAiJWNjY3JjciIgfSwKLSAgeyAzLCAiJWNjcHIiIH0sCi0gIHsgNCwgIiVjY3NyMiIgfSwKLSAgeyA1LCAiJWNjY3JyIiB9LAotICB7IDYsICIlY2Nyc3RyIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3Igc3BhcmNsZXQgY3ByZWcgYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKHNwYXJjbGV0X2NwcmVnX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBzcGFyY2xldCBjcHJlZyB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChzcGFyY2xldF9jcHJlZ190YWJsZSwgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zdGFtcC1oLmluIGIvb3Bjb2Rlcy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zeXNkZXAuaCBiL29wY29kZXMvc3lzZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGViNWQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJhbmRvbSBob3N0LWRlcGVuZGVudCBzdXBwb3J0IGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJvcGNvZGVzLCB0aGUgb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEbyBzeXN0ZW0tZGVwZW5kZW50IHN0dWZmLCBtYWlubHkgZHJpdmVuIGJ5IGF1dG9jb25mLWRldGVjdGVkIGluZm8uCi0KLSAgIFdlbGwsIHNvbWUgZ2VuZXJpYyBjb21tb24gc3R1ZmYgaXMgZG9uZSBoZXJlIHRvbywgbGlrZSBpbmNsdWRpbmcKLSAgIGFuc2lkZWNsLmguICBUaGF0J3MgYmVjYXVzZSB0aGUgLmggZmlsZXMgaW4gYmZkL2hvc3RzIGZpbGVzIEknbQotICAgdHJ5aW5nIHRvIHJlcGxhY2Ugb2Z0ZW4gZGlkIHRoYXQuICBJZiBpdCBjYW4gYmUgZHJvcHBlZCBmcm9tIHRoaXMKLSAgIGZpbGUgKGNoZWNrIGluIGEgbm9uLUFOU0kgZW52aXJvbm1lbnQhKSwgaXQgc2hvdWxkIGJlLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzMwLWRpcy5jIGIvb3Bjb2Rlcy90aWMzMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjZjg5My4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzMwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qIERpc2Fzc2VtYmx5IHJvdXRpbmVzIGZvciBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljMzAuaCIKLQotI2RlZmluZSBOT1JNQUxfSU5TTiAgIDEKLSNkZWZpbmUgUEFSQUxMRUxfSU5TTiAyCi0KLS8qIEdldHMgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIHRvcCAyIG9yIDMgYml0cyBvZiB0aGUKLSAgIGluc3RydWN0aW9uIHdvcmQuICovCi0jZGVmaW5lIEdFVF9UWVBFKGluc24pIChpbnNuICYgMHg4MDAwMDAwMCA/IGluc24gJiAweEMwMDAwMDAwIDogaW5zbiAmIDB4RTAwMDAwMDApCi0KLS8qIEluc3RydWN0aW9uIHR5cGVzLiAqLwotI2RlZmluZSBUV09fT1BFUkFORF8xIDB4MDAwMDAwMDAKLSNkZWZpbmUgVFdPX09QRVJBTkRfMiAweDQwMDAwMDAwCi0jZGVmaW5lIFRIUkVFX09QRVJBTkQgMHgyMDAwMDAwMAotI2RlZmluZSBQQVJfU1RPUkUgICAgIDB4QzAwMDAwMDAKLSNkZWZpbmUgTVVMX0FERFMgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEJSQU5DSEVTICAgICAgMHg2MDAwMDAwMAotCi0vKiBTcGVjaWZpYyBpbnN0cnVjdGlvbiBpZCBiaXRzLiAqLwotI2RlZmluZSBOT1JNQUxfSURFTiAgICAweDFGODAwMDAwCi0jZGVmaW5lIFBBUl9TVE9SRV9JREVOIDB4M0UwMDAwMDAKLSNkZWZpbmUgTVVMX0FERF9JREVOICAgMHgyQzAwMDAwMAotI2RlZmluZSBCUl9JTU1fSURFTiAgICAweDFGMDAwMDAwCi0jZGVmaW5lIEJSX0NPTkRfSURFTiAgIDB4MUMzRjAwMDAKLQotLyogQWRkcmVzc2luZyBtb2Rlcy4gKi8KLSNkZWZpbmUgQU1fUkVHSVNURVIgMHgwMDAwMDAwMAotI2RlZmluZSBBTV9ESVJFQ1QgICAweDAwMjAwMDAwCi0jZGVmaW5lIEFNX0lORElSRUNUIDB4MDA0MDAwMDAKLSNkZWZpbmUgQU1fSU1NICAgICAgMHgwMDYwMDAwMAotCi0jZGVmaW5lIFBfRklFTEQgMHgwMzAwMDAwMAotCi0jZGVmaW5lIFJFR19BUjAgMHgwOAotI2RlZmluZSBMRFBfSU5TTiAweDA4NzAwMDAwCi0KLS8qIFRNUzMyMEMzMCBwcm9ncmFtIGNvdW50ZXIgZm9yIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9wYzsKLQotc3RydWN0IGluc3RydWN0aW9uCi0gIHsKLSAgICBpbnQgdHlwZTsKLSAgICB0ZW1wbGF0ZSAqdG07Ci0gICAgcGFydGVtcGxhdGUgKnB0bTsKLSAgfTsKLQotaW50IGdldF90aWMzMF9pbnN0cnVjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3R3b19vcGVyYW5kCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF90aHJlZV9vcGVyYW5kCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF9wYXJfaW5zbgotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfYnJhbmNoCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBnZXRfaW5kaXJlY3Rfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBzaG9ydCwgaW50LCBjaGFyICopKTsKLWludCBnZXRfcmVnaXN0ZXJfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyLCBjaGFyICopKTsKLWludCBjbnZ0X3Rtc2Zsb2F0X2llZWUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50LCBmbG9hdCAqKSk7Ci0KLWludAotcHJpbnRfaW5zbl90aWMzMCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gaW5zbiA9Ci0gIHswLCBOVUxMLCBOVUxMfTsKLSAgYmZkX3ZtYSBidWZhZGRyID0gcGMgLSBpbmZvLT5idWZmZXJfdm1hOwotICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd29yZCBmcm9tIHRoZSBidWZmZXIuICovCi0gIGluc25fd29yZCA9ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIpIDw8IDI0KSB8ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAxKSA8PCAxNikgfAotICAgICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAyKSA8PCA4KSB8ICooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDMpOwotICBfcGMgPSBwYyAvIDQ7Ci0gIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24gcmVmZXJlZCB0byBieSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkCi0gICAgIGFuZCBwcmludCBpdCBvdXQgYmFzZWQgb24gaXRzIHR5cGUuICovCi0gIGlmICghZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsICZpbnNuKSkKLSAgICByZXR1cm4gLTE7Ci0gIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCi0gICAgewotICAgIGNhc2UgVFdPX09QRVJBTkRfMToKLSAgICBjYXNlIFRXT19PUEVSQU5EXzI6Ci0gICAgICBpZiAoIXByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRIUkVFX09QRVJBTkQ6Ci0gICAgICBpZiAoIXByaW50X3RocmVlX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEFSX1NUT1JFOgotICAgIGNhc2UgTVVMX0FERFM6Ci0gICAgICBpZiAoIXByaW50X3Bhcl9pbnNuIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJSQU5DSEVTOgotICAgICAgaWYgKCFwcmludF9icmFuY2ggKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLWludAotZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsIGluc24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCi0gICAgewotICAgIGNhc2UgVFdPX09QRVJBTkRfMToKLSAgICBjYXNlIFRXT19PUEVSQU5EXzI6Ci0gICAgY2FzZSBUSFJFRV9PUEVSQU5EOgotICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOwotICAgICAgewotCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRzID09IDApCi0JCSAgewotCQkgICAgaWYgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlID09IGluc25fd29yZCkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE5PUk1BTF9JREVOKSA9PSAoaW5zbl93b3JkICYgTk9STUFMX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBBUl9TVE9SRToKLSAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOwotICAgICAgewotCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIFBBUl9TVE9SRV9JREVOKSA9PSAoaW5zbl93b3JkICYgUEFSX1NUT1JFX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnB0bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNVUxfQUREUzoKLSAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOwotICAgICAgewotCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE1VTF9BRERfSURFTikgPT0gKGluc25fd29yZCAmIE1VTF9BRERfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+cHRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJSQU5DSEVTOgotICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOwotICAgICAgewotCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRfdHlwZXNbMF0gJiBJbW0yNCkKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgQlJfSU1NX0lERU4pID09IChpbnNuX3dvcmQgJiBCUl9JTU1fSURFTikpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlIGlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kcyA+IDApCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIEJSX0NPTkRfSURFTikgPT0gKGluc25fd29yZCAmIEJSX0NPTkRfSURFTikpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkgPT0gKGluc25fd29yZCAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgbmFtZVsxMl07Ci0gIGNoYXIgb3BlcmFuZFsyXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfX07Ci0gIGZsb2F0IGZfbnVtYmVyOwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzdHJjcHkgKG5hbWUsIGluc24tPnRtLT5uYW1lKTsKLSAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpCi0gICAgewotICAgICAgaW50IHNyY19vcCwgZGVzdF9vcDsKLSAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIGluc3RydWN0aW9uIGlzIGEgc3RvcmUgb3IgYSBub3JtYWwgaW5zdHJ1Y3Rpb24uICovCi0gICAgICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgKERpcmVjdCB8IEluZGlyZWN0KSkgPT0gKERpcmVjdCB8IEluZGlyZWN0KSkKLQl7Ci0JICBzcmNfb3AgPSAxOwotCSAgZGVzdF9vcCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNyY19vcCA9IDA7Ci0JICBkZXN0X29wID0gMTsKLQl9Ci0gICAgICAvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiAqLwotICAgICAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAyKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbZGVzdF9vcF0pOwotICAgICAgLyogR2V0IHRoZSBzb3VyY2Ugb3BlcmFuZCBiYXNlZCBvbiBhZGRyZXNzaW5nIG1vZGUuICovCi0gICAgICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQotCXsKLQljYXNlIEFNX1JFR0lTVEVSOgotCSAgLyogQ2hlY2sgZm9yIHRoZSBOT1AgaW5zdHJ1Y3Rpb24gYmVmb3JlIGdldHRpbmcgdGhlIG9wZXJhbmQuICovCi0JICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgTm90UmVxKSA9PSAwKQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwMUYpLCBvcGVyYW5kW3NyY19vcF0pOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9ESVJFQ1Q6Ci0JICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICJAMHglbFgiLCAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9JTkRJUkVDVDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsIG9wZXJhbmRbc3JjX29wXSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0lNTToKLQkgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGJhc2VkIG9uIHZhcmlhYmxlIHR5cGUuICovCi0JICBzd2l0Y2ggKGluc24tPnRtLT5pbW1fYXJnX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBJbW1fRmxvYXQ6Ci0JICAgICAgY252dF90bXNmbG9hdF9pZWVlICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsICZmX251bWJlcik7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJTIuMmYiLCBmX251bWJlcik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSW1tX1NJbnQ6Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWQiLCAoc2hvcnQpIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSW1tX1VJbnQ6Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWx1IiwgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgTERQIGluc3RydWN0aW9uLiAqLwotCSAgaWYgKChpbnNuX3dvcmQgJiAweEZGRkZGRjAwKSA9PSBMRFBfSU5TTikKLQkgICAgewotCSAgICAgIHN0cmNweSAobmFtZSwgImxkcCIpOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCUwNmxYIiwgKGluc25fd29yZCAmIDB4MDAwMDAwRkYpIDw8IDE2KTsKLQkgICAgICBvcGVyYW5kWzFdWzBdID0gJ1wwJzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIEhhbmRsZSBjYXNlIGZvciBzdGFjayBhbmQgcm90YXRlIGluc3RydWN0aW9ucy4gKi8KLSAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDEpCi0gICAgewotICAgICAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gU3RhY2tPcCkKLQl7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kWzBdKTsKLQl9Ci0gICAgfQotICAvKiBPdXRwdXQgaW5zdHJ1Y3Rpb24gdG8gc3RyZWFtLiAqLwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzJWMlcyIsIG5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF90aHJlZV9vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgb3BlcmFuZFszXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfSwKLSAgICB7MH19OwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQotICAgIHsKLSAgICBjYXNlIEFNX1JFR0lTVEVSOgotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9ESVJFQ1Q6Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0lORElSRUNUOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9JTU06Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDMpCi0gICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFsyXSk7Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMsJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCi0JCSAgICAgIG9wZXJhbmRbMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMl1bMF0gPyBvcGVyYW5kWzJdIDogIiIpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF9wYXJfaW5zbiAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBzaXplX3QgaSwgbGVuOwotICBjaGFyICpuYW1lMSwgKm5hbWUyOwotICBjaGFyIG9wZXJhbmRbMl1bM11bMTNdID0KLSAgewotICAgIHsKLSAgICAgIHswfSwKLSAgICAgIHswfSwKLSAgICAgIHswfX0sCi0gICAgewotICAgICAgezB9LAotICAgICAgezB9LAotICAgICAgezB9fX07Ci0KLSAgaWYgKGluc24tPnB0bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBQYXJzZSBvdXQgdGhlIG5hbWVzIG9mIGVhY2ggb2YgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyBmcm9tIHRoZQotICAgICBxX2luc24xX2luc24yIGZvcm1hdC4gKi8KLSAgbmFtZTEgPSAoY2hhciAqKSBzdHJkdXAgKGluc24tPnB0bS0+bmFtZSArIDIpOwotICBuYW1lMiA9ICIiOwotICBsZW4gPSBzdHJsZW4gKG5hbWUxKTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuYW1lMVtpXSA9PSAnXycpCi0JewotCSAgbmFtZTIgPSAmbmFtZTFbaSArIDFdOwotCSAgbmFtZTFbaV0gPSAnXDAnOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyogR2V0IHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIG9wZXJhbmQgb3JkZXIuICovCi0gIHN3aXRjaCAoaW5zbi0+cHRtLT5vcG9yZGVyKQotICAgIHsKLSAgICBjYXNlIE9PXzRvcDE6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT180b3AyOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNG9wMzoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzVvcDE6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzVvcDI6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PX1BGaWVsZDoKLSAgICAgIGlmIChpbnNuX3dvcmQgJiAweDAwODAwMDAwKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAxLCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGVsc2UKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMCwgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBpZiAoaW5zbl93b3JkICYgMHgwMDQwMDAwMCkKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMywgb3BlcmFuZFsxXVsyXSk7Ci0gICAgICBlbHNlCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDIsIG9wZXJhbmRbMV1bMl0pOwotICAgICAgc3dpdGNoIChpbnNuX3dvcmQgJiBQX0ZJRUxEKQotCXsKLQljYXNlIDB4MDAwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAxMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDMwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcywlcyVjJXMiLCBuYW1lMSwKLQkJICAgICAgb3BlcmFuZFswXVswXSwgb3BlcmFuZFswXVsxXSwKLQkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/IG9wZXJhbmRbMF1bMl0gOiAiIik7Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiXG5cdFx0XHR8fCAlcyAlcywlcyVjJXMiLCBuYW1lMiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSwgb3BlcmFuZFsxXVsxXSwKLQkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/IG9wZXJhbmRbMV1bMl0gOiAiIik7Ci0gIGZyZWUgKG5hbWUxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfYnJhbmNoIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgb3BlcmFuZFsyXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfX07Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgaW50IHByaW50X2xhYmVsID0gMDsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgMjQtYml0IGltbWVkaWF0ZSBqdW1wcy4gKi8KLSAgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSW1tMjQpCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDBGRkZGRkY7Ci0gICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglbFgiLCBhZGRyZXNzKTsKLSAgICAgIHByaW50X2xhYmVsID0gMTsKLSAgICB9Ci0gIC8qIEdldCB0aGUgb3BlcmFuZCBmb3IgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24uICovCi0gIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSVZlY3RvcikKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMDAwMDAxRjsKLSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCVsWCIsIGFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwMDBGRkZGOwotICAgICAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgdGhlIERCIGluc3RydWN0aW9ucy4gKi8KLSAgICAgIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMikKLQl7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKChpbnNuX3dvcmQgJiAweDAxQzAwMDAwKSA+PiAyMikgKyBSRUdfQVIwLCBvcGVyYW5kWzBdKTsKLQkgIGlmIChpbnNuX3dvcmQgJiBQQ1JlbCkKLQkgICAgewotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMV0sICIlZCIsIChzaG9ydCkgYWRkcmVzcyk7Ci0JICAgICAgcHJpbnRfbGFiZWwgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kIChpbnNuX3dvcmQgJiAweDAwMDAwMDFGLCBvcGVyYW5kWzFdKTsKLQl9Ci0gICAgICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciB0aGUgc3RhbmRhcmQgYnJhbmNoZXMuICovCi0gICAgICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMSkKLQl7Ci0JICBpZiAoaW5zbl93b3JkICYgUENSZWwpCi0JICAgIHsKLQkgICAgICBhZGRyZXNzID0gKHNob3J0KSBhZGRyZXNzOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIlbGQiLCBhZGRyZXNzKTsKLQkgICAgICBwcmludF9sYWJlbCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGluc25fd29yZCAmIDB4MDAwMDAwMUYsIG9wZXJhbmRbMF0pOwotCX0KLSAgICB9Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOwotICAvKiBQcmludCBkZXN0aW5hdGlvbiBvZiBicmFuY2ggaW4gcmVsYXRpb24gdG8gY3VycmVudCBzeW1ib2wuICovCi0gIGlmIChwcmludF9sYWJlbCAmJiBpbmZvLT5zeW1ib2xzKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9ICppbmZvLT5zeW1ib2xzOwotCi0gICAgICBpZiAoKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUENSZWwpICYmIChpbnNuX3dvcmQgJiBQQ1JlbCkpCi0JewotCSAgYWRkcmVzcyA9IChfcGMgKyAxICsgKHNob3J0KSBhZGRyZXNzKSAtICgoc3ltLT5zZWN0aW9uLT52bWEgKyBzeW0tPnZhbHVlKSAvIDQpOwotCSAgLyogQ2hlY2sgZm9yIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24sIGlmIHNvIGFkanVzdCBkZXN0aW5hdGlvbi4gKi8KLQkgIGlmIChpbnNuX3dvcmQgJiAweDAwMjAwMDAwKQotCSAgICBhZGRyZXNzICs9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFkZHJlc3MgLT0gKChzeW0tPnNlY3Rpb24tPnZtYSArIHN5bS0+dmFsdWUpIC8gNCk7Ci0JfQotICAgICAgaWYgKGFkZHJlc3MgPT0gMCkKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXM+Iiwgc3ltLT5uYW1lKTsKLSAgICAgIGVsc2UKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXMgJWMgJWQ+Iiwgc3ltLT5uYW1lLAotCQkJICAgICgoc2hvcnQpIGFkZHJlc3MgPCAwKSA/ICctJyA6ICcrJywKLQkJCSAgICBhYnMgKGFkZHJlc3MpKTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF9pbmRpcmVjdF9vcGVyYW5kIChmcmFnbWVudCwgc2l6ZSwgYnVmZmVyKQotICAgICB1bnNpZ25lZCBzaG9ydCBmcmFnbWVudDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgdW5zaWduZWQgY2hhciBtb2Q7Ci0gIHVuc2lnbmVkIGFybnVtOwotICB1bnNpZ25lZCBjaGFyIGRpc3A7Ci0KLSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBEZXRlcm1pbmUgd2hpY2ggYml0cyBpZGVudGlmeSB0aGUgc2VjdGlvbnMgb2YgdGhlIGluZGlyZWN0IG9wZXJhbmQgYmFzZWQgb24gdGhlCi0gICAgIHNpemUgaW4gYnl0ZXMuICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgbW9kID0gKGZyYWdtZW50ICYgMHgwMEY4KSA+PiAzOwotICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDAwMDcpOwotICAgICAgZGlzcCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBtb2QgPSAoZnJhZ21lbnQgJiAweEY4MDApID4+IDExOwotICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDA3MDApID4+IDg7Ci0gICAgICBkaXNwID0gKGZyYWdtZW50ICYgMHgwMEZGKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHsKLSAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOwotICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQotICAgICAgewotCWlmIChjdXJyZW50X2luZC0+bW9kZmllbGQgPT0gbW9kKQotCSAgewotCSAgICBpZiAoY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBJTVBMSUVEX0RJU1AgJiYgc2l6ZSA9PSAyKQotCSAgICAgIHsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzaXplX3QgaSwgbGVuOwotCQlpbnQgYnVmY250OwotCQkKLQkJbGVuID0gc3RybGVuIChjdXJyZW50X2luZC0+c3ludGF4KTsKLQkJZm9yIChpID0gMCwgYnVmY250ID0gMDsgaSA8IGxlbjsgaSsrLCBidWZjbnQrKykKLQkJICB7Ci0JCSAgICBidWZmZXJbYnVmY250XSA9IGN1cnJlbnRfaW5kLT5zeW50YXhbaV07Ci0JCSAgICBpZiAoYnVmZmVyW2J1ZmNudCAtIDFdID09ICdhJyAmJiBidWZmZXJbYnVmY250XSA9PSAncicpCi0JCSAgICAgIGJ1ZmZlclsrK2J1ZmNudF0gPSBhcm51bSArICcwJzsKLQkJICAgIGlmIChidWZmZXJbYnVmY250XSA9PSAnKCcgJiYgY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKQotCQkgICAgICB7Ci0JCQlzcHJpbnRmICgmYnVmZmVyW2J1ZmNudCArIDFdLCAiJXUiLCBkaXNwKTsKLQkJCWJ1ZmNudCArPSBzdHJsZW4gKCZidWZmZXJbYnVmY250ICsgMV0pOwotCQkgICAgICB9Ci0JCSAgfQotCQlidWZmZXJbYnVmY250ICsgMV0gPSAnXDAnOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGZyYWdtZW50LCBidWZmZXIpCi0gICAgIHVuc2lnbmVkIGNoYXIgZnJhZ21lbnQ7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgY29uc3QgcmVnICpjdXJyZW50X3JlZyA9IHRpYzMwX3JlZ3RhYjsKLQotICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCi0gICAgewotICAgICAgaWYgKChmcmFnbWVudCAmIDB4MUYpID09IGN1cnJlbnRfcmVnLT5vcGNvZGUpCi0JewotCSAgc3RyY3B5IChidWZmZXIsIGN1cnJlbnRfcmVnLT5uYW1lKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLWNudnRfdG1zZmxvYXRfaWVlZSAodG1zZmxvYXQsIHNpemUsIGllZWVmbG9hdCkKLSAgICAgdW5zaWduZWQgbG9uZyB0bXNmbG9hdDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGZsb2F0ICppZWVlZmxvYXQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50OwotCi0gIGlmIChzaXplID09IDIpCi0gICAgewotICAgICAgaWYgKCh0bXNmbG9hdCAmIDB4MDAwMEYwMDApID09IDB4MDAwMDgwMDApCi0JdG1zZmxvYXQgPSAweDgwMDAwMDAwOwotICAgICAgZWxzZQotCXsKLQkgIHRtc2Zsb2F0IDw8PSAxNjsKLQkgIHRtc2Zsb2F0ID0gKGxvbmcpIHRtc2Zsb2F0ID4+IDQ7Ci0JfQotICAgIH0KLSAgZXhwID0gdG1zZmxvYXQgJiAweEZGMDAwMDAwOwotICBpZiAoZXhwID09IDB4ODAwMDAwMDApCi0gICAgewotICAgICAgKmllZWVmbG9hdCA9IDAuMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwICs9IDB4N0YwMDAwMDA7Ci0gIHNpZ24gPSAodG1zZmxvYXQgJiAweDAwODAwMDAwKSA8PCA4OwotICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotICBpZiAoZXhwID09IDB4RkYwMDAwMDApCi0gICAgewotICAgICAgaWYgKG1hbnQgPT0gMCkKLQkqaWVlZWZsb2F0ID0gRVJBTkdFOwotICAgICAgaWYgKHNpZ24gPT0gMCkKLQkqaWVlZWZsb2F0ID0gMS4wIC8gMC4wOwotICAgICAgZWxzZQotCSppZWVlZmxvYXQgPSAtMS4wIC8gMC4wOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHAgPj49IDE7Ci0gIGlmIChzaWduKQotICAgIHsKLSAgICAgIG1hbnQgPSAofm1hbnQpICYgMHgwMDdGRkZGRjsKLSAgICAgIG1hbnQgKz0gMTsKLSAgICAgIGV4cCArPSBtYW50ICYgMHgwMDgwMDAwMDsKLSAgICAgIGV4cCAmPSAweDdGODAwMDAwOwotICAgICAgbWFudCAmPSAweDAwN0ZGRkZGOwotICAgIH0KLSAgaWYgKHRtc2Zsb2F0ID09IDB4ODAwMDAwMDApCi0gICAgc2lnbiA9IG1hbnQgPSBleHAgPSAwOwotICB0bXNmbG9hdCA9IHNpZ24gfCBleHAgfCBtYW50OwotICAqaWVlZWZsb2F0ID0gKigoZmxvYXQgKikgJnRtc2Zsb2F0KTsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzU0eC1kaXMuYyBiL29wY29kZXMvdGljNTR4LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMwYjIwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljNTR4LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qIERpc2Fzc2VtYmx5IHJvdXRpbmVzIGZvciBUTVMzMjBDNTRYIGFyY2hpdGVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBUaW1vdGh5IFdhbGwgKHR3YWxsQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM1NHguaCIKLSNpbmNsdWRlICJjb2ZmL3RpYzU0eC5oIgotCi10eXBlZGVmIHN0cnVjdCBfaW5zdHJ1Y3Rpb24gewotICBpbnQgcGFyYWxsZWw7Ci0gIHRlbXBsYXRlICp0bTsKLSAgcGFydGVtcGxhdGUgKnB0bTsKLX0gaW5zdHJ1Y3Rpb247Ci0KLXN0YXRpYyBpbnQgZ2V0X2luc25fc2l6ZSBQQVJBTVMgKCh1bnNpZ25lZCBzaG9ydCwgaW5zdHJ1Y3Rpb24gKikpOwotc3RhdGljIGludCBnZXRfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0LCBpbnN0cnVjdGlvbiAqKSk7Ci1zdGF0aWMgaW50IHByaW50X2luc3RydWN0aW9uIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0LCBjaGFyICosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG9wdHlwZSBbXSwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJpbnRfcGFyYWxsZWxfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCwgcGFydGVtcGxhdGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSk7IAotc3RhdGljIGludCBzcHJpbnRfZHVhbF9hZGRyZXNzIChkaXNhc3NlbWJsZV9pbmZvICosY2hhciBbXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KTsKLXN0YXRpYyBpbnQgc3ByaW50X2luZGlyZWN0X2FkZHJlc3MgKGRpc2Fzc2VtYmxlX2luZm8gKixjaGFyIFtdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KTsKLXN0YXRpYyBpbnQgc3ByaW50X2RpcmVjdF9hZGRyZXNzIChkaXNhc3NlbWJsZV9pbmZvICosY2hhciBbXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQpOwotc3RhdGljIGludCBzcHJpbnRfbW1yIChkaXNhc3NlbWJsZV9pbmZvICosY2hhciBbXSxpbnQpOwotc3RhdGljIGludCBzcHJpbnRfY29uZGl0aW9uIChkaXNhc3NlbWJsZV9pbmZvICosY2hhciAqLHVuc2lnbmVkIHNob3J0KTsKLXN0YXRpYyBpbnQgc3ByaW50X2NjMiAoZGlzYXNzZW1ibGVfaW5mbyAqLGNoYXIgKix1bnNpZ25lZCBzaG9ydCk7Ci0KLWludAotcHJpbnRfaW5zbl90aWM1NHgobWVtYWRkciwgaW5mbykKLSAgYmZkX3ZtYSBtZW1hZGRyOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBvcGJ1ZlsyXTsgCi0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgaW50IHN0YXR1cywgc2l6ZTsKLSAgaW5zdHJ1Y3Rpb24gaW5zbjsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBvcGJ1ZiwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgewotICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgb3Bjb2RlID0gYmZkX2dldGwxNihvcGJ1Zik7Ci0gIGlmICghZ2V0X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBvcGNvZGUsICZpbnNuKSkKLSAgICAgIHJldHVybiAtMTsKLQotICBzaXplID0gZ2V0X2luc25fc2l6ZSAob3Bjb2RlLCAmaW5zbik7Ci0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gMjsKLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLSAgaW5mby0+b2N0ZXRzX3Blcl9ieXRlID0gMjsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQotICBpZiAoaW5zbi5wYXJhbGxlbCkKLSAgewotICAgIGlmICghcHJpbnRfcGFyYWxsZWxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIG9wY29kZSwgaW5zbi5wdG0sIHNpemUpKQotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmICghcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIG9wY29kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilpbnNuLnRtLT5uYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuLnRtLT5vcGVyYW5kX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIChpbnNuLnRtLT5mbGFncyAmIEZMX0VYVCkpKQotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIHNpemUqMjsKLX0KLQotc3RhdGljIGludAotaGFzX2xrYWRkcihvcGNvZGUsIHRtKQotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIHRlbXBsYXRlICp0bTsKLXsKLSAgcmV0dXJuIElTX0xLQUREUihvcGNvZGUpICYmIAotICAgIChPUFRZUEUodG0tPm9wZXJhbmRfdHlwZXNbMF0pID09IE9QX1NtZW0gfHwKLSAgICAgT1BUWVBFKHRtLT5vcGVyYW5kX3R5cGVzWzFdKSA9PSBPUF9TbWVtIHx8Ci0gICAgIE9QVFlQRSh0bS0+b3BlcmFuZF90eXBlc1syXSkgPT0gT1BfU21lbSB8fAotICAgICBPUFRZUEUodG0tPm9wZXJhbmRfdHlwZXNbMV0pID09IE9QX1NpbmQpOwotfQotCi0vKiBhbHdheXMgcmV0dXJucyAxICh3aGV0aGVyIGFuIGluc24gdGVtcGxhdGUgd2FzIGZvdW5kKSBzaW5jZSB3ZSBwcm92aWRlIGFuCi0gICAidW5rbm93biBpbnN0cnVjdGlvbiIgdGVtcGxhdGUgKi8KLXN0YXRpYyBpbnQgCi1nZXRfaW5zdHJ1Y3Rpb24gKGluZm8sIGFkZHIsIG9wY29kZSwgaW5zbikKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIGluc3RydWN0aW9uICppbnNuOwotewotICB0ZW1wbGF0ZSAqIHRtOwotICBwYXJ0ZW1wbGF0ZSAqIHB0bTsKLQotICBpbnNuLT5wYXJhbGxlbCA9IDA7Ci0gIGZvciAodG0gPSAodGVtcGxhdGUgKil0aWM1NHhfb3B0YWI7IHRtLT5uYW1lOyB0bSsrKQotICB7Ci0gICAgaWYgKHRtLT5vcGNvZGUgPT0gKG9wY29kZSAmIHRtLT5tYXNrKSkKLSAgICB7Ci0gICAgICAvKiBhIGZldyBvcGNvZGVzIHNwYW4gdHdvIHdvcmRzICovCi0gICAgICBpZiAodG0tPmZsYWdzICYgRkxfRVhUKQotICAgICAgICB7Ci0gICAgICAgICAgLyogaWYgbGsgYWRkcmVzc2luZyBpcyB1c2VkLCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIG9wY29kZSBnZXRzCi0gICAgICAgICAgICAgcHVzaGVkIG9uZSB3b3JkIGxhdGVyICovCi0gICAgICAgICAgYmZkX2J5dGUgb3BidWZbMl07Ci0gICAgICAgICAgYmZkX3ZtYSBhZGRyMiA9IGFkZHIgKyAxICsgaGFzX2xrYWRkcihvcGNvZGUsIHRtKTsKLSAgICAgICAgICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKShhZGRyMiwgb3BidWYsIDIsIGluZm8pOwotICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlMiA9IGJmZF9nZXRsMTYob3BidWYpOwotICAgICAgICAgICAgICBpZiAodG0tPm9wY29kZTIgPT0gKG9wY29kZTIgJiB0bS0+bWFzazIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGluc24tPnRtID0gdG07Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGluc24tPnRtID0gdG07Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChwdG0gPSAocGFydGVtcGxhdGUgKil0aWM1NHhfcGFyb3B0YWI7IHB0bS0+bmFtZTsgcHRtKyspCi0gIHsKLSAgICBpZiAocHRtLT5vcGNvZGUgPT0gKG9wY29kZSAmIHB0bS0+bWFzaykpCi0gICAgewotICAgICAgaW5zbi0+cGFyYWxsZWwgPSAxOwotICAgICAgaW5zbi0+cHRtID0gcHRtOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgaW5zbi0+dG0gPSAodGVtcGxhdGUgKikmdGljNTR4X3Vua25vd25fb3Bjb2RlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCAKLWdldF9pbnNuX3NpemUgKG9wY29kZSwgaW5zbikKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgaW50IHNpemU7Ci0KLSAgaWYgKGluc24tPnBhcmFsbGVsKQotICAgIHsKLSAgICAgIC8qIG9ubHkgbm9uLXBhcmFsbGVsIGluc3RydWN0aW9ucyBzdXBwb3J0IGxrIGFkZHJlc3NpbmcgKi8KLSAgICAgIHNpemUgPSBpbnNuLT5wdG0tPndvcmRzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemUgPSBpbnNuLT50bS0+d29yZHMgKyBoYXNfbGthZGRyKG9wY29kZSwgaW5zbi0+dG0pOwotICAgIH0KLQotICByZXR1cm4gc2l6ZTsKLX0KLQotaW50Ci1wcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgb3Bjb2RlLCB0bV9uYW1lLCB0bV9vcGVyYW5kcywgc2l6ZSwgZXh0KQotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICBiZmRfdm1hIG1lbWFkZHI7Ci0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgY2hhciAqdG1fbmFtZTsKLSAgZW51bSBvcHR5cGUgdG1fb3BlcmFuZHNbXTsKLSAgaW50IHNpemU7Ci0gIGludCBleHQ7Ci17Ci0gIHN0YXRpYyBpbnQgbjsKLSAgLyogc3RyaW5nIHN0b3JhZ2UgZm9yIG11bHRpcGxlIG9wZXJhbmRzICovCi0gIGNoYXIgb3BlcmFuZFs0XVs2NF0gPSB7IHswfSx7MH0sezB9LHswfSwgfTsKLSAgYmZkX2J5dGUgYnVmWzJdOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTIsIGxrYWRkcjsKLSAgZW51bSBvcHR5cGUgc3JjID0gT1BfTm9uZTsKLSAgZW51bSBvcHR5cGUgZHN0ID0gT1BfTm9uZTsKLSAgaW50IGksIHNoaWZ0OwotICBjaGFyICpjb21tYSA9ICIiOwotCi0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJS03cyIsIHRtX25hbWUpOwotCi0gIGlmIChzaXplID4gMSkKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkcisxLCBidWYsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGxrYWRkciA9IG9wY29kZTIgPSBiZmRfZ2V0bDE2KGJ1Zik7Ci0gICAgICBpZiAoc2l6ZSA+IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyKzIsIGJ1ZiwgMiwgaW5mbyk7Ci0gICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgb3Bjb2RlMiA9IGJmZF9nZXRsMTYoYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICBmb3IgKGk9MDtpIDwgTUFYX09QRVJBTkRTICYmIE9QVFlQRSh0bV9vcGVyYW5kc1tpXSkgIT0gT1BfTm9uZTtpKyspCi0gICAgewotICAgICAgY2hhciAqbmV4dF9jb21tYSA9ICIsIjsKLSAgICAgIGludCBvcHRpb25hbCA9ICh0bV9vcGVyYW5kc1tpXSAmIE9QVCkgIT0gMDsKLQotICAgICAgc3dpdGNoIChPUFRZUEUodG1fb3BlcmFuZHNbaV0pKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgT1BfWG1lbToKLSAgICAgICAgICBzcHJpbnRfZHVhbF9hZGRyZXNzIChpbmZvLCBvcGVyYW5kW2ldLCBYTUVNKG9wY29kZSkpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9ZbWVtOgotICAgICAgICAgIHNwcmludF9kdWFsX2FkZHJlc3MgKGluZm8sIG9wZXJhbmRbaV0sIFlNRU0ob3Bjb2RlKSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1NtZW06Ci0gICAgICAgIGNhc2UgT1BfU2luZDoKLSAgICAgICAgY2FzZSBPUF9MbWVtOgotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb21tYSk7Ci0gICAgICAgICAgaWYgKElORElSRUNUKG9wY29kZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChNT0Qob3Bjb2RlKSA+PSAxMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiZmRfdm1hIGFkZHIgPSBsa2FkZHI7Ci0gICAgICAgICAgICAgICAgICBpbnQgYXJmID0gQVJGKG9wY29kZSk7Ci0gICAgICAgICAgICAgICAgICBpbnQgbW9kID0gTU9EKG9wY29kZSk7Ci0gICAgICAgICAgICAgICAgICBpZiAobW9kID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiKigiKTsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiolc2FyJWQoIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kID09IDEzIHx8IG1vZCA9PSAxNCA/ICIrIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZik7Ci0gICAgICAgICAgICAgICAgICAoKihpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpKSgoYmZkX3ZtYSlhZGRyLCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiKSVzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCA9PSAxNCA/ICIlIiA6ICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRfaW5kaXJlY3RfYWRkcmVzcyAoaW5mbywgb3BlcmFuZFtpXSwgb3Bjb2RlKTsKLSAgICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZJWE1FIC0tIHVzZSBsYWJlbHMgKHByaW50X2FkZHJlc3NfZnVuYykgKi8KLSAgICAgICAgICAgIC8qIGluIG9yZGVyIHRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gZ3Vlc3Mgd2hhdCBEUCBpcyAqLwotICAgICAgICAgICAgc3ByaW50X2RpcmVjdF9hZGRyZXNzIChpbmZvLCBvcGVyYW5kW2ldLCBvcGNvZGUpOwotICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9kbWFkOgotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb21tYSk7Ci0gICAgICAgICAgKCooaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSkoKGJmZF92bWEpb3Bjb2RlMiwgaW5mbyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfeHBtYWQ6Ci0gICAgICAgICAgLyogdXBwZXIgNyBiaXRzIG9mIGFkZHJlc3MgYXJlIGluIHRoZSBvcGNvZGUgKi8KLSAgICAgICAgICBvcGNvZGUyICs9ICgodW5zaWduZWQgbG9uZylvcGNvZGUgJiAweDdGKSA8PCAxNjsKLSAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgY2FzZSBPUF9wbWFkOgotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb21tYSk7Ci0gICAgICAgICAgKCooaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSkoKGJmZF92bWEpb3Bjb2RlMiwgaW5mbyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfTU1SWDoKLSAgICAgICAgICBzcHJpbnRfbW1yIChpbmZvLCBvcGVyYW5kW2ldLCBNTVJYKG9wY29kZSkpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9NTVJZOgotICAgICAgICAgIHNwcmludF9tbXIgKGluZm8sIG9wZXJhbmRbaV0sIE1NUlkob3Bjb2RlKSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX01NUjoKLSAgICAgICAgICBzcHJpbnRfbW1yIChpbmZvLCBvcGVyYW5kW2ldLCBNTVIob3Bjb2RlKSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1BBOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJwYSVkIiwgKHVuc2lnbmVkKW9wY29kZTIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9TUkM6Ci0gICAgICAgICAgc3JjID0gU1JDKGV4dCA/IG9wY29kZTIgOiBvcGNvZGUpID8gT1BfQiA6IE9QX0E7Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgKHNyYyA9PSBPUF9CKSA/ICJiIiA6ICJhIik7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1NSQzE6Ci0gICAgICAgICAgc3JjID0gU1JDMShleHQgPyBvcGNvZGUyIDogb3Bjb2RlKSA/IE9QX0IgOiBPUF9BOwotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sIChzcmMgPT0gT1BfQikgPyAiYiIgOiAiYSIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9STkQ6Ci0gICAgICAgICAgZHN0ID0gRFNUKG9wY29kZSkgPyBPUF9CIDogT1BfQTsKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAoZHN0ID09IE9QX0IpID8gImEiIDogImIiKTsKLSAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfRFNUOgotICAgICAgICAgIGRzdCA9IERTVChleHQgPyBvcGNvZGUyIDogb3Bjb2RlKSA/IE9QX0IgOiBPUF9BOwotICAgICAgICAgIGlmICghb3B0aW9uYWwgfHwgZHN0ICE9IHNyYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgKGRzdCA9PSBPUF9CKSA/ICJiIiA6ICJhIik7Ci0gICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXh0X2NvbW1hID0gY29tbWE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfQjoKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiYiIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9BOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJhIik7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX0FSWDoKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCJhciVkIiwgKGludClBUlgob3Bjb2RlKSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1NISUZUOgotICAgICAgICAgIHNoaWZ0ID0gU0hJRlQoZXh0ID8gb3Bjb2RlMiA6IG9wY29kZSk7Ci0gICAgICAgICAgaWYgKCFvcHRpb25hbCB8fCBzaGlmdCAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCIlZCIsIHNoaWZ0KTsKLSAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5leHRfY29tbWEgPSBjb21tYTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9TSEZUOgotICAgICAgICAgIHNoaWZ0ID0gU0hGVChvcGNvZGUpOwotICAgICAgICAgIGlmICghb3B0aW9uYWwgfHwgc2hpZnQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwiJWQiLCAodW5zaWduZWQpc2hpZnQpOwotICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV4dF9jb21tYSA9IGNvbW1hOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX2xrOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sIiMlZCIsIChpbnQpKHNob3J0KW9wY29kZTIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9UOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJ0Iik7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1RTOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJ0cyIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9rODoKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiJWQiLCAoaW50KSgoc2lnbmVkIGNoYXIpKG9wY29kZSAmIDB4RkYpKSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QXzE2OgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICIxNiIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9BU006Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgImFzbSIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9CSVRDOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICIlZCIsIChpbnQpKG9wY29kZSAmIDB4RikpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9DQzoKLSAgICAgICAgICAvKiBwdXQgYWxsIENDIG9wZXJhbmRzIGluIHRoZSBzYW1lIG9wZXJhbmQgKi8KLSAgICAgICAgICBzcHJpbnRfY29uZGl0aW9uIChpbmZvLCBvcGVyYW5kW2ldLCBvcGNvZGUpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBpID0gTUFYX09QRVJBTkRTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX0NDMjoKLSAgICAgICAgICBzcHJpbnRfY2MyIChpbmZvLCBvcGVyYW5kW2ldLCBvcGNvZGUpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9DQzM6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICpjb2RlW10gPSB7ICJlcSIsICJsdCIsICJndCIsICJuZXEiIH07Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgY29kZVtDQzMob3Bjb2RlKV0pOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE9QXzEyMzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY29kZSA9IChvcGNvZGU+PjgpICYgMHgzOwotICAgICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIiVkIiwgKGNvZGUgPT0gMCkgPyAxIDogKGNvZGUgPT0gMikgPyAyIDogMyk7Ci0gICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgT1BfazU6Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIiMlZCIsIAotICAgICAgICAgICAgICAgICAgIChpbnQpKCgoc2lnbmVkIGNoYXIpb3Bjb2RlICYgMHgxRikgPDwgMyk+PjMpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9rOHU6Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIiMlZCIsICh1bnNpZ25lZCkob3Bjb2RlICYgMHhGRikpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9rMzoKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiIyVkIiwgKGludCkob3Bjb2RlICYgMHg3KSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX2xrdToKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiIyVkIiwgKHVuc2lnbmVkKW9wY29kZTIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9OOgotICAgICAgICAgIG4gPSAob3Bjb2RlID4+IDkpICYgMHgxOwotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJzdCVkIiwgbik7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9QX1NCSVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICpzdGF0dXMwW10gPSB7Ci0gICAgICAgICAgICAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAKLSAgICAgICAgICAgICJvdmIiLCAib3ZhIiwgImMiLCAidGMiLCAiMTMiLCAiMTQiLCAiMTUiCi0gICAgICAgICAgfTsKLSAgICAgICAgICBjb25zdCBjaGFyICpzdGF0dXMxW10gPSB7Ci0gICAgICAgICAgICAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgCi0gICAgICAgICAgICAiY21wdCIsICJmcmN0IiwgImMxNiIsICJzeG0iLCAib3ZtIiwgIjEwIiwKLSAgICAgICAgICAgICJpbnRtIiwgImhtIiwgInhmIiwgImNwbCIsICJicmFmIgotICAgICAgICAgIH07Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIiVzIiwgCi0gICAgICAgICAgICAgICAgICAgbiA/IHN0YXR1czFbU0JJVChvcGNvZGUpXSA6IHN0YXR1czBbU0JJVChvcGNvZGUpXSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgT1BfMTI6Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIiVkIiwgKGludCkoKG9wY29kZSA+PiA5KSYxKSArIDEpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9UUk46Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgInRybiIpOwotICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMlcyIsIGNvbW1hLCBvcGVyYW5kW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUF9EUDoKLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiZHAiKTsKLSAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1Bfazk6Ci0gICAgICAgICAgLyogRklYTUUtLSB0aGlzIGlzIERQLCBwcmludCB0aGUgb3JpZ2luYWwgYWRkcmVzcz8gKi8KLSAgICAgICAgICBzcHJpbnRmIChvcGVyYW5kW2ldLCAiIyVkIiwgKGludCkob3Bjb2RlICYgMHgxRkYpKTsKLSAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfQVJQOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICJhcnAiKTsKLSAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BfMDMxOgotICAgICAgICAgIHNwcmludGYgKG9wZXJhbmRbaV0sICIlZCIsIChpbnQpKG9wY29kZSAmIDB4MUYpKTsKLSAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzJXMiLCBjb21tYSwgb3BlcmFuZFtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgc3ByaW50ZiAob3BlcmFuZFtpXSwgIj8/PyAoMHgleCkiLCB0bV9vcGVyYW5kc1tpXSk7Ci0gICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyVzIiwgY29tbWEsIG9wZXJhbmRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjb21tYSA9IG5leHRfY29tbWE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfcGFyYWxsZWxfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIG9wY29kZSwgcHRtLCBzaXplKQotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICBiZmRfdm1hIG1lbWFkZHI7Ci0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgcGFydGVtcGxhdGUgKnB0bTsKLSAgaW50IHNpemU7Ci17Ci0gIHByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBvcGNvZGUsIAotICAgICAgICAgICAgICAgICAgICAgcHRtLT5uYW1lLCBwdG0tPm9wZXJhbmRfdHlwZXMsIHNpemUsIDApOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiB8fCAiKTsKLSAgcmV0dXJuIHByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBvcGNvZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0bS0+cGFybmFtZSwgcHRtLT5wYXJvcGVyYW5kX3R5cGVzLCBzaXplLCAwKTsKLX0KLQotc3RhdGljIGludAotc3ByaW50X2R1YWxfYWRkcmVzcyAoaW5mbywgYnVmLCBjb2RlKQotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICBjaGFyIGJ1ZltdOwotICB1bnNpZ25lZCBzaG9ydCBjb2RlOwotewotICBjb25zdCBjaGFyICpmb3JtYXRzW10gPSB7Ci0gICAgIiphciVkIiwKLSAgICAiKmFyJWQtIiwKLSAgICAiKmFyJWQrIiwKLSAgICAiKmFyJWQrMCUlIiwKLSAgfTsKLSAgcmV0dXJuIHNwcmludGYgKGJ1ZiwgZm9ybWF0c1tYTU9EKGNvZGUpXSwgWEFSWChjb2RlKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwcmludF9pbmRpcmVjdF9hZGRyZXNzIChpbmZvLCBidWYsIG9wY29kZSkKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgY2hhciBidWZbXTsKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotewotICBjb25zdCBjaGFyICpmb3JtYXRzW10gPSB7Ci0gICAgIiphciVkIiwKLSAgICAiKmFyJWQtIiwKLSAgICAiKmFyJWQrIiwKLSAgICAiKithciVkIiwKLSAgICAiKmFyJWQtMEIiLAotICAgICIqYXIlZC0wIiwKLSAgICAiKmFyJWQrMCIsCi0gICAgIiphciVkKzBCIiwKLSAgICAiKmFyJWQtJSUiLAotICAgICIqYXIlZC0wJSUiLAotICAgICIqYXIlZCslJSIsCi0gICAgIiphciVkKzAlJSIsCi0gIH07Ci0gIHJldHVybiBzcHJpbnRmIChidWYsIGZvcm1hdHNbTU9EKG9wY29kZSldLCBBUkYob3Bjb2RlKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwcmludF9kaXJlY3RfYWRkcmVzcyAoaW5mbywgYnVmLCBvcGNvZGUpCi0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gIGNoYXIgYnVmW107Ci0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLXsKLSAgLyogRklYTUUgLS0gbG9vayB1cCByZWxvY2F0aW9uIGlmIGF2YWlsYWJsZSAqLwotICByZXR1cm4gc3ByaW50ZiAoYnVmLCAiMHg/PyUwMngiLCAoaW50KShvcGNvZGUgJiAweDdGKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwcmludF9tbXIgKGluZm8sIGJ1ZiwgbW1yKQotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICBjaGFyIGJ1ZltdOwotICBpbnQgbW1yOwotewotICBzeW1ib2wgKnJlZyA9IChzeW1ib2wgKiltbXJlZ3M7Ci0gIHdoaWxlIChyZWctPm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobW1yID09IHJlZy0+dmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICBzcHJpbnRmIChidWYsICIlcyIsIChyZWcrMSktPm5hbWUpOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICArK3JlZzsKLSAgICB9Ci0gIHNwcmludGYgKGJ1ZiwgIk1NUiglZCkiLCBtbXIpOyAvLyBGSVhNRSAtLSBkaWZmZXJlbnQgdGFyZ2V0cwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc3ByaW50X2NjMiAoaW5mbywgYnVmLCBvcGNvZGUpCi0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gIGNoYXIgKmJ1ZjsKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotewotICBjb25zdCBjaGFyICpjYzJbXSA9IHsKLSAgICAiPz8iLCAiPz8iLCAiYWdlcSIsICJhbHQiLCAiYW5lcSIsICJhZXEiLCAiYWd0IiwgImFsZXEiLAotICAgICI/PyIsICI/PyIsICJiZ2VxIiwgImJsdCIsICJibmVxIiwgImJlcSIsICJiZ3QiLCAiYmxlcSIsCi0gIH07Ci0gIHJldHVybiBzcHJpbnRmIChidWYsICIlcyIsIGNjMltvcGNvZGUgJiAweEZdKTsKLX0KLQotc3RhdGljIGludAotc3ByaW50X2NvbmRpdGlvbiAoaW5mbywgYnVmLCBvcGNvZGUpCi0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gIGNoYXIgKmJ1ZjsKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotewotICBjaGFyICpzdGFydCA9IGJ1ZjsKLSAgY29uc3QgY2hhciAqY21wW10gPSB7Ci0gICAgICAiPz8iLCAiPz8iLCAiZ2VxIiwgImx0IiwgIm5lcSIsICJlcSIsICJndCIsICJsZXEiCi0gIH07Ci0gIGlmIChvcGNvZGUgJiAweDQwKQotICAgIHsKLSAgICAgIGNoYXIgYWNjID0gKG9wY29kZSAmIDB4OCkgPyAnYicgOiAnYSc7Ci0gICAgICBpZiAob3Bjb2RlICYgMHg3KQotICAgICAgICAgIGJ1ZiArPSBzcHJpbnRmIChidWYsICIlYyVzJXMiLCBhY2MsIGNtcFsob3Bjb2RlJjB4NyldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAob3Bjb2RlJjB4MjApID8gIiwgIiA6ICIiKTsKLSAgICAgIGlmIChvcGNvZGUgJiAweDIwKQotICAgICAgICAgIGJ1ZiArPSBzcHJpbnRmIChidWYsICIlYyVzIiwgYWNjLCAob3Bjb2RlJjB4MTApID8gIm92IiA6ICJub3YiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZSAmIDB4M0YpCi0gICAgewotICAgICAgaWYgKG9wY29kZSAmIDB4MzApCi0gICAgICAgIGJ1ZiArPSBzcHJpbnRmIChidWYsICIlcyVzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG9wY29kZSAmIDB4MzApID09IDB4MzApID8gInRjIiA6ICJudGMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKG9wY29kZSAmIDB4MEYpID8gIiwgIiA6ICIiKTsKLSAgICAgIGlmIChvcGNvZGUgJiAweDBDKQotICAgICAgICBidWYgKz0gc3ByaW50ZiAoYnVmLCAiJXMlcyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgJiAweDBDKSA9PSAweDBDKSA/ICJjIiA6ICJuYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAob3Bjb2RlICYgMHgwMykgPyAiLCAiIDogIiIpOwotICAgICAgaWYgKG9wY29kZSAmIDB4MDMpCi0gICAgICAgIGJ1ZiArPSBzcHJpbnRmIChidWYsICIlcyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgJiAweDAzKSA9PSAweDAzKSA/ICJiaW8iIDogIm5iaW8iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBidWYgKz0gc3ByaW50ZiAoYnVmLCAidW5jIik7Ci0KLSAgcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM1NHgtb3BjLmMgYi9vcGNvZGVzL3RpYzU0eC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmNGI3ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzU0eC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzU0WAotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVGltb3RoeSBXYWxsICh0d2FsbEBjeWdudXMuY29tKQotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM1NHguaCIKLQotLyogdGhlc2UgYXJlIHRoZSBvbmx5IHJlZ2lzdGVyIG5hbWVzIG5vdCBmb3VuZCBpbiBtbXJlZ3MgKi8KLWNvbnN0IHN5bWJvbCByZWdzW10gPSB7Ci0gIHsgIkFSMCIsIDE2IH0sICAgICAgICAgICAgICAgICAgeyAiYXIwIiwgMTYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSMSIsIDE3IH0sICAgICAgICAgICAgICAgICAgeyAiYXIxIiwgMTcgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSMiIsIDE4IH0sICAgICAgICAgICAgICAgICAgeyAiYXIyIiwgMTggfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSMyIsIDE5IH0sICAgICAgICAgICAgICAgICAgeyAiYXIzIiwgMTkgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSNCIsIDIwIH0sICAgICAgICAgICAgICAgICAgeyAiYXI0IiwgMjAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSNSIsIDIxIH0sICAgICAgICAgICAgICAgICAgeyAiYXI1IiwgMjEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSNiIsIDIyIH0sICAgICAgICAgICAgICAgICAgeyAiYXI2IiwgMjIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgIkFSNyIsIDIzIH0sICAgICAgICAgICAgICAgICAgeyAiYXI3IiwgMjMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHsgTlVMTCwgfQotfTsKLQotLyogc3RhdHVzIGJpdHMsIE1NIHJlZ2lzdGVycywgY29uZGl0aW9uIGNvZGVzLCBldGMgKi8KLS8qIHNvbWUgc3ltYm9scyBhcmUgb25seSB2YWxpZCBmb3IgY2VydGFpbiBjaGlwcy4uLiAqLwotY29uc3Qgc3ltYm9sIG1tcmVnc1tdID0gewotICB7ICJJTVIiLCAwIH0sICAgICAgICAgICAgICAgICAgIHsgImltciIsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJJRlIiLCAxIH0sICAgICAgICAgICAgICAgICAgIHsgImlmciIsIDEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJTVDAiLCA2IH0sICAgICAgICAgICAgICAgICAgIHsgInN0MCIsIDYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJTVDEiLCA3IH0sICAgICAgICAgICAgICAgICAgIHsgInN0MSIsIDcgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBTCIsICA4IH0sICAgICAgICAgICAgICAgICAgIHsgImFsIiwgIDggfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBSCIsICA5IH0sICAgICAgICAgICAgICAgICAgIHsgImFoIiwgIDkgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBRyIsICAxMCB9LCAgICAgICAgICAgICAgICAgIHsgImFnIiwgIDEwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCTCIsICAxMSB9LCAgICAgICAgICAgICAgICAgIHsgImJsIiwgIDExIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCSCIsICAxMiB9LCAgICAgICAgICAgICAgICAgIHsgImJoIiwgIDEyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCRyIsICAxMyB9LCAgICAgICAgICAgICAgICAgIHsgImJnIiwgIDEzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUIiwgICAxNCB9LCAgICAgICAgICAgICAgICAgIHsgInQiLCAgIDE0IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUUk4iLCAxNSB9LCAgICAgICAgICAgICAgICAgIHsgInRybiIsIDE1IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjAiLCAxNiB9LCAgICAgICAgICAgICAgICAgIHsgImFyMCIsIDE2IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjEiLCAxNyB9LCAgICAgICAgICAgICAgICAgIHsgImFyMSIsIDE3IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjIiLCAxOCB9LCAgICAgICAgICAgICAgICAgIHsgImFyMiIsIDE4IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjMiLCAxOSB9LCAgICAgICAgICAgICAgICAgIHsgImFyMyIsIDE5IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjQiLCAyMCB9LCAgICAgICAgICAgICAgICAgIHsgImFyNCIsIDIwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjUiLCAyMSB9LCAgICAgICAgICAgICAgICAgIHsgImFyNSIsIDIxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjYiLCAyMiB9LCAgICAgICAgICAgICAgICAgIHsgImFyNiIsIDIyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUjciLCAyMyB9LCAgICAgICAgICAgICAgICAgIHsgImFyNyIsIDIzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJTUCIsICAyNCB9LCAgICAgICAgICAgICAgICAgIHsgInNwIiwgIDI0IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCSyIsICAyNSB9LCAgICAgICAgICAgICAgICAgIHsgImJrIiwgIDI1IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCUkMiLCAyNiB9LCAgICAgICAgICAgICAgICAgIHsgImJyYyIsIDI2IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJSU0EiLCAyNyB9LCAgICAgICAgICAgICAgICAgIHsgInJzYSIsIDI3IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJSRUEiLCAyOCB9LCAgICAgICAgICAgICAgICAgIHsgInJlYSIsIDI4IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJQTVNUIiwyOSB9LCAgICAgICAgICAgICAgICAgIHsgInBtc3QiLDI5IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJYUEMiLCAzMCB9LCAgICAgICAgICAgICAgICAgIHsgInhwYyIsIDMwIH0sIC8qICdjNTQ4IG9ubHkgKi8gICAgICAgICAgICAgIAotICAvKiBvcHRpb25hbCBwZXJpcGhlcmFscyAqLyAgICAgIC8qIG9wdGlvbmFsIHBlcmlwaGVyYWxzICovICAgICAgICAgICAgICAgICAgIAotICB7ICJNMUYiLCAzMSB9LCAgICAgICAgICAgICAgICAgIHsgIm0xZiIsIDMxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJEUlIwIiwweDIwIH0sICAgICAgICAgICAgICAgIHsgImRycjAiLDB4MjAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCRFJSMCIsMHgyMCB9LCAgICAgICAgICAgICAgIHsgImJkcnIwIiwweDIwIH0sIC8qICdjNTQzLCA1NDUgKi8gICAgICAgICAgIAotICB7ICJEWFIwIiwweDIxIH0sICAgICAgICAgICAgICAgIHsgImR4cjAiLDB4MjEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCRFhSMCIsMHgyMSB9LCAgICAgICAgICAgICAgIHsgImJkeHIwIiwweDIxIH0sIC8qICdjNTQzLCA1NDUgKi8gICAgICAgICAgIAotICB7ICJTUEMwIiwweDIyIH0sICAgICAgICAgICAgICAgIHsgInNwYzAiLDB4MjIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCU1BDMCIsMHgyMiB9LCAgICAgICAgICAgICAgIHsgImJzcGMwIiwweDIyIH0sIC8qICdjNTQzLCA1NDUgKi8gICAgICAgICAgIAotICB7ICJTUENFMCIsMHgyMyB9LCAgICAgICAgICAgICAgIHsgInNwY2UwIiwweDIzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCU1BDRTAiLDB4MjMgfSwgICAgICAgICAgICAgIHsgImJzcGNlMCIsMHgyMyB9LCAvKiAnYzU0MywgNTQ1ICovICAgICAgICAgIAotICB7ICJUSU0iLCAweDI0IH0sICAgICAgICAgICAgICAgIHsgInRpbSIsIDB4MjQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJQUkQiLCAweDI1IH0sICAgICAgICAgICAgICAgIHsgInByZCIsIDB4MjUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUQ1IiLCAweDI2IH0sICAgICAgICAgICAgICAgIHsgInRjciIsIDB4MjYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJTV1dTUiIsMHgyOCB9LCAgICAgICAgICAgICAgIHsgInN3d3NyIiwweDI4IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCU0NSIiwweDI5IH0sICAgICAgICAgICAgICAgIHsgImJzY3IiLDB4MjkgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJIUElDIiwweDJDIH0sICAgICAgICAgICAgICAgIHsgImhwaWMiLDB4MmMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiAnYzU0MSwgJ2M1NDUgKi8gICAgICAgICAgICAgIC8qICdjNTQxLCAnYzU0NSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJEUlIxIiwweDMwIH0sICAgICAgICAgICAgICAgIHsgImRycjEiLDB4MzAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJEWFIxIiwweDMxIH0sICAgICAgICAgICAgICAgIHsgImR4cjEiLDB4MzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJTUEMxIiwweDMyIH0sICAgICAgICAgICAgICAgIHsgInNwYzEiLDB4MzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiAnYzU0MiwgJ2M1NDMgKi8gICAgICAgICAgICAgIC8qICdjNTQyLCAnYzU0MyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUUkNWIiwweDMwIH0sICAgICAgICAgICAgICAgIHsgInRyY3YiLDB4MzAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJURFhSIiwweDMxIH0sICAgICAgICAgICAgICAgIHsgInRkeHIiLDB4MzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUU1BDIiwweDMyIH0sICAgICAgICAgICAgICAgIHsgInRzcGMiLDB4MzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUQ1NSIiwweDMzIH0sICAgICAgICAgICAgICAgIHsgInRjc3IiLDB4MzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUUlRBIiwweDM0IH0sICAgICAgICAgICAgICAgIHsgInRydGEiLDB4MzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJUUkFEIiwweDM1IH0sICAgICAgICAgICAgICAgIHsgInRyYWQiLDB4MzUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBWFIwIiwweDM4IH0sICAgICAgICAgICAgICAgIHsgImF4cjAiLDB4MzggfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCS1gwIiwweDM5IH0sICAgICAgICAgICAgICAgIHsgImJreDAiLDB4MzkgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUlIwIiwweDNBIH0sICAgICAgICAgICAgICAgIHsgImFycjAiLDB4M2EgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCS1IwIiwweDNCIH0sICAgICAgICAgICAgICAgIHsgImJrcjAiLDB4M2IgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiAnYzU0NSwgJ2M1NDYsICdjNTQ4ICovICAgICAgIC8qICdjNTQ1LCAnYzU0NiwgJ2M1NDggKi8gICAgICAgICAgICAgICAgICAgIAotICB7ICJDTEtNRCIsMHg1OCB9LCAgICAgICAgICAgICAgIHsgImNsa21kIiwweDU4IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiAnYzU0OCAqLyAgICAgICAgICAgICAgICAgICAgIC8qICdjNTQ4ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBWFIxIiwweDNDIH0sICAgICAgICAgICAgICAgIHsgImF4cjEiLDB4M2MgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCS1gxIiwweDNEIH0sICAgICAgICAgICAgICAgIHsgImJreDEiLDB4M2QgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJBUlIxIiwweDNFIH0sICAgICAgICAgICAgICAgIHsgImFycjEiLDB4M2UgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCS1IxIiwweDNGIH0sICAgICAgICAgICAgICAgIHsgImJrcjEiLDB4M2YgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCRFJSMSIsMHg0MCB9LCAgICAgICAgICAgICAgIHsgImJkcnIxIiwweDQwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCRFhSMSIsMHg0MSB9LCAgICAgICAgICAgICAgIHsgImJkeHIxIiwweDQxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCU1BDMSIsMHg0MiB9LCAgICAgICAgICAgICAgIHsgImJzcGMxIiwweDQyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7ICJCU1BDRTEiLDB4NDMgfSwgICAgICAgICAgICAgIHsgImJzcGNlMSIsMHg0MyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB7IE5VTEwgfSwKLX07Ci0KLWNvbnN0IHN5bWJvbCBjb25kaXRpb25fY29kZXNbXSA9IHsKLSAgLyogY29uZGl0aW9uIGNvZGVzICovCi0gIHsgIlVOQyIsICAwIH0sICAgICAgICAgICAgICAgIHsgInVuYyIsICAwIH0sCi0jZGVmaW5lIENDMSAgIDB4NDAKLSNkZWZpbmUgQ0NCICAgMHgwOAotI2RlZmluZSBDQ0VRICAweDA1Ci0jZGVmaW5lIENDTkVRIDB4MDQKLSNkZWZpbmUgQ0NMVCAgMHgwMwotI2RlZmluZSBDQ0xFUSAweDA3Ci0jZGVmaW5lIENDR1QgIDB4MDYKLSNkZWZpbmUgQ0NHRVEgMHgwMgotI2RlZmluZSBDQ09WICAweDcwCi0jZGVmaW5lIENDTk9WIDB4NjAKLSNkZWZpbmUgQ0NCSU8gMHgwMwotI2RlZmluZSBDQ05CSU8gMHgwMgotI2RlZmluZSBDQ1RDICAweDMwCi0jZGVmaW5lIENDTlRDIDB4MjAKLSNkZWZpbmUgQ0NDICAgMHgwQwotI2RlZmluZSBDQ05DICAweDA4Ci0gIHsgImFlcSIsICBDQzF8Q0NFUSB9LCAgICAgICAgIHsgIkFFUSIsICBDQzF8Q0NFUSB9LAotICB7ICJhbmVxIiwgQ0MxfENDTkVRIH0sICAgICAgICB7ICJBTkVRIiwgQ0MxfENDTkVRIH0sCi0gIHsgImFsdCIsICBDQzF8Q0NMVCB9LCAgICAgICAgIHsgIkFMVCIsICBDQzF8Q0NMVCB9LAotICB7ICJhbGVxIiwgQ0MxfENDTEVRIH0sICAgICAgICB7ICJBTEVRIiwgQ0MxfENDTEVRIH0sCi0gIHsgImFndCIsICBDQzF8Q0NHVCB9LCAgICAgICAgIHsgIkFHVCIsICBDQzF8Q0NHVCB9LCAgCi0gIHsgImFnZXEiLCBDQzF8Q0NHRVEgfSwgICAgICAgIHsgIkFHRVEiLCBDQzF8Q0NHRVEgfSwgIAotICB7ICJhb3YiLCAgQ0MxfENDT1YgfSwgICAgICAgICB7ICJBT1YiLCAgQ0MxfENDT1YgfSwgIAotICB7ICJhbm92IiwgQ0MxfENDTk9WIH0sICAgICAgICB7ICJBTk9WIiwgQ0MxfENDTk9WIH0sICAKLSAgeyAiYmVxIiwgIENDMXxDQ0J8Q0NFUSB9LCAgICAgeyAiQkVRIiwgIENDMXxDQ0J8Q0NFUSB9LCAgCi0gIHsgImJuZXEiLCBDQzF8Q0NCfENDTkVRIH0sICAgIHsgIkJORVEiLCBDQzF8Q0NCfENDTkVRIH0sICAKLSAgeyAiYmx0IiwgIENDMXxDQ0J8Q0NMVCB9LCAgICAgeyAiQkxUIiwgIENDMXxDQ0J8Q0NMVCB9LCAgCi0gIHsgImJsZXEiLCBDQzF8Q0NCfENDTEVRIH0sICAgIHsgIkJMRVEiLCBDQzF8Q0NCfENDTEVRIH0sICAKLSAgeyAiYmd0IiwgIENDMXxDQ0J8Q0NHVCB9LCAgICAgeyAiQkdUIiwgIENDMXxDQ0J8Q0NHVCB9LCAgCi0gIHsgImJnZXEiLCBDQzF8Q0NCfENDR0VRIH0sICAgIHsgIkJHRVEiLCBDQzF8Q0NCfENDR0VRIH0sICAKLSAgeyAiYm92IiwgIENDMXxDQ0J8Q0NPViB9LCAgICAgeyAiQk9WIiwgIENDMXxDQ0J8Q0NPViB9LCAgCi0gIHsgImJub3YiLCBDQzF8Q0NCfENDTk9WIH0sICAgIHsgIkJOT1YiLCBDQzF8Q0NCfENDTk9WIH0sICAKLSAgeyAidGMiLCAgIENDVEMgfSwgICAgICAgICAgICAgeyAiVEMiLCAgIENDVEMgfSwgIAotICB7ICJudGMiLCAgQ0NOVEMgfSwgICAgICAgICAgICB7ICJOVEMiLCAgQ0NOVEMgfSwgIAotICB7ICJjIiwgICAgQ0NDIH0sICAgICAgICAgICAgICB7ICJDIiwgICAgQ0NDIH0sICAKLSAgeyAibmMiLCAgIENDTkMgfSwgICAgICAgICAgICAgeyAiTkMiLCAgIENDTkMgfSwgIAotICB7ICJiaW8iLCAgQ0NCSU8gfSwgICAgICAgICAgICB7ICJCSU8iLCAgQ0NCSU8gfSwgIAotICB7ICJuYmlvIiwgQ0NOQklPIH0sICAgICAgICAgICB7ICJOQklPIiwgQ0NOQklPIH0sICAKLSAgeyBOVUxMLCB9Ci19OwotCi1jb25zdCBzeW1ib2wgY2MyX2NvZGVzW10gPSB7Ci0gIHsgIlVOQyIsIDAgfSwgIHsgInVuYyIsIDAgfSwKLSAgeyAiQUVRIiwgNSB9LCAgeyAiYWVxIiwgNSB9LAotICB7ICJBTkVRIiwgNCB9LCB7ICJhbmVxIiwgNCB9LAotICB7ICJBR1QiLCA2IH0sICB7ICJhZ3QiLCA2IH0sCi0gIHsgIkFMVCIsIDMgfSwgIHsgImFsdCIsIDMgfSwKLSAgeyAiQUxFUSIsIDcgfSwgeyAiYWxlcSIsIDcgfSwKLSAgeyAiQUdFUSIsIDIgfSwgeyAiYWdlcSIsIDIgfSwKLSAgeyAiQkVRIiwgMTMgfSwgeyAiYmVxIiwgMTMgfSwKLSAgeyAiQk5FUSIsIDEyIH0seyAiYm5lcSIsIDEyIH0sCi0gIHsgIkJHVCIsIDE0IH0sIHsgImJndCIsIDE0IH0sCi0gIHsgIkJMVCIsIDExIH0sIHsgImJsdCIsIDExIH0sCi0gIHsgIkJMRVEiLCAxNSB9LHsgImJsZXEiLCAxNSB9LAotICB7ICJCR0VRIiwgMTAgfSx7ICJiZ2VxIiwgMTAgfSwKLSAgeyBOVUxMIH0sCi19OwotCi1jb25zdCBzeW1ib2wgY2MzX2NvZGVzW10gPSB7Ci0gIHsgIkVRIiwgMHgwMDAwIH0sICB7ICJlcSIsIDB4MDAwMCB9LAotICB7ICJMVCIsIDB4MDEwMCB9LCAgeyAibHQiLCAweDAxMDAgfSwKLSAgeyAiR1QiLCAweDAyMDAgfSwgIHsgImd0IiwgMHgwMjAwIH0sCi0gIHsgIk5FUSIsIDB4MDMwMCB9LCB7ICJuZXEiLCAweDAzMDAgfSwKLSAgeyAiMCIsIDB4MDAwMCB9LCAKLSAgeyAiMSIsIDB4MDEwMCB9LAotICB7ICIyIiwgMHgwMjAwIH0sCi0gIHsgIjMiLCAweDAzMDAgfSwKLSAgeyAiMDAiLCAweDAwMDAgfSwgCi0gIHsgIjAxIiwgMHgwMTAwIH0sCi0gIHsgIjEwIiwgMHgwMjAwIH0sCi0gIHsgIjExIiwgMHgwMzAwIH0sCi0gIHsgTlVMTCB9LAotfTsKLQotLyogRklYTUUgLS0gYWxzbyBhbGxvdyBkZWNpbWFsIGRpZ2l0cyAqLwotY29uc3Qgc3ltYm9sIHN0YXR1c19iaXRzW10gPSB7Ci0gIC8qIHN0YXR1cyByZWdpc3RlciAwICovCi0gIHsgIlRDIiwgIDEyIH0sICAgICAgICAgICAgICAgIHsgInRjIiwgIDEyIH0sCi0gIHsgIkMiLCAgIDExIH0sICAgICAgICAgICAgICAgIHsgImMiLCAgIDExIH0sCi0gIHsgIk9WQSIsIDEwIH0sICAgICAgICAgICAgICAgIHsgIm92YSIsIDEwIH0sCi0gIHsgIk9WQiIsICA5IH0sICAgICAgICAgICAgICAgIHsgIm92YiIsICA5IH0sCi0gIC8qIHN0YXR1cyByZWdpc3RlciAxICovCi0gIHsgIkJSQUYiLDE1IH0sICAgICAgICAgICAgICAgIHsgImJyYWYiLDE1IH0sCi0gIHsgIkNQTCIsIDE0IH0sICAgICAgICAgICAgICAgIHsgImNwbCIsIDE0IH0sCi0gIHsgIlhGIiwgIDEzIH0sICAgICAgICAgICAgICAgIHsgInhmIiwgIDEzIH0sCi0gIHsgIkhNIiwgIDEyIH0sICAgICAgICAgICAgICAgIHsgImhtIiwgIDEyIH0sCi0gIHsgIklOVE0iLDExIH0sICAgICAgICAgICAgICAgIHsgImludG0iLDExIH0sCi0gIHsgIk9WTSIsICA5IH0sICAgICAgICAgICAgICAgIHsgIm92bSIsICA5IH0sCi0gIHsgIlNYTSIsICA4IH0sICAgICAgICAgICAgICAgIHsgInN4bSIsICA4IH0sCi0gIHsgIkMxNiIsICA3IH0sICAgICAgICAgICAgICAgIHsgImMxNiIsICA3IH0sCi0gIHsgIkZSQ1QiLCA2IH0sICAgICAgICAgICAgICAgIHsgImZyY3QiLCA2IH0sCi0gIHsgIkNNUFQiLCA1IH0sICAgICAgICAgICAgICAgIHsgImNtcHQiLCA1IH0sCi0gIHsgTlVMTCB9LAotfTsKLQotY29uc3QgY2hhciAqbWlzY19zeW1ib2xzW10gPSB7Ci0gICJBUlAiLCAiYXJwIiwKLSAgIkRQIiwgICJkcCIsCi0gICJBU00iLCAiYXNtIiwKLSAgIlRTIiwgICJ0cyIsCi0gIE5VTEwKLX07Ci0KLS8qIER1ZSB0byB0aGUgd2F5IGluc3RydWN0aW9ucyBhcmUgaGFzaGVkIGFuZCBzY2FubmVkIGluCi0gICBnYXMvY29uZmlnL3RjLXRpYzU0eC5jLCBhbGwgaWRlbnRpY2FsbHktbmFtZWQgb3Bjb2RlcyBtdXN0IGJlIGNvbnNlY3V0aXZlbHkKLSAgIHBsYWNlZCAKLQotICAgSXRlbXMgbWFya2VkIHdpdGggIlBSRUZFUiIgaGF2ZSBiZWVuIG1vdmVkIHByaW9yIHRvIGEgbW9yZSBjb3N0bHkKLSAgIGluc3RydWN0aW9uIHdpdGggYSBzaW1pbGFyIG9wZXJhbmQgZm9ybWF0LgotCi0gICBNbmVtb25pY3Mgd2hpY2ggY2FuIHRha2UgZWl0aGVyIGEgcHJlZGVmaW5lZCBzeW1ib2wgb3IgYSBtZW1vcnkgcmVmZXJlbmNlCi0gICBhcyBhbiBhcmd1bWVudCBhcmUgYXJyYW5nZWQgc28gdGhhdCB0aGUgbW9yZSByZXN0cmljdGl2ZSAocHJlZGVmaW5lZAotICAgc3ltYm9sKSB2ZXJzaW9uIGlzIGNoZWNrZWQgZmlyc3QgKG1hcmtlZCAiU1JDIikuCi0qLwotY29uc3QgdGVtcGxhdGUgdGljNTR4X3Vua25vd25fb3Bjb2RlID0gCi0gIHsgIj8/PyIsICAgMSwwLDAsMHgwMDAwLCAweDAwMDAsIHswfSwgfTsKLWNvbnN0IHRlbXBsYXRlIHRpYzU0eF9vcHRhYltdID0gewotICAvKiB0aGVzZSBtdXN0IHByZWNlZGUgYmMvYmNkLCBjYy9jY2QgdG8gYXZvaWQgbWlzaW50ZXJwcmV0YXRpb24gKi8KLSAgeyAiZmIiLCAgICAyLDEsMSwweEY4ODAsIDB4RkY4MCwge09QX3hwbWFkfSwgQl9CUkFOQ0h8RkxfRkFSfEZMX05SLCB9LAotICB7ICJmYmQiLCAgIDIsMSwxLDB4RkE4MCwgMHhGRjgwLCB7T1BfeHBtYWR9LCBCX0JSQU5DSHxGTF9GQVJ8RkxfREVMQVl8RkxfTlIsIH0sCi0gIHsgImZjYWxsIiwgMiwxLDEsMHhGOTgwLCAweEZGODAsIHtPUF94cG1hZH0sIEJfQlJBTkNIfEZMX0ZBUnxGTF9OUiwgfSwKLSAgeyAiZmNhbGxkIiwyLDEsMSwweEZCODAsIDB4RkY4MCwge09QX3hwbWFkfSwgQl9CUkFOQ0h8RkxfRkFSfEZMX0RFTEFZfEZMX05SLCB9LAotCi0gIHsgImFiZHN0IiwgMSwyLDIsMHhFMzAwLCAweEZGMDAsIHtPUF9YbWVtLE9QX1ltZW19LCB9LAotICB7ICJhYnMiLCAgIDEsMSwyLDB4RjQ4NSwgMHhGQ0ZGLCB7T1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJhZGQiLCAgIDEsMSwzLDB4RjQwMCwgMHhGQ0UwLCB7T1BfU1JDLE9QVHxPUF9TSElGVCxPUFR8T1BfRFNUfSwgfSwvKlNSQyovCi0gIHsgImFkZCIsICAgMSwyLDMsMHhGNDgwLCAweEZDRkYsIHtPUF9TUkMsT1BfQVNNLE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAiYWRkIiwgICAxLDIsMiwweDAwMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJhZGQiLCAgIDEsMywzLDB4MDQwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9UUyxPUF9TUkMxfSwgRkxfU01SIH0sCi0gIHsgImFkZCIsICAgMSwzLDQsMHgzQzAwLCAweEZDMDAsIHtPUF9TbWVtLE9QXzE2LE9QX1NSQyxPUFR8T1BfRFNUfSwgRkxfU01SfSwKLSAgeyAiYWRkIiwgICAxLDMsMywweDkwMDAsIDB4RkUwMCwge09QX1htZW0sT1BfU0hGVCxPUF9TUkMxfSwgfSwvKlBSRUZFUiovCi0gIHsgImFkZCIsICAgMiwyLDQsMHg2RjAwLCAweEZGMDAsIHtPUF9TbWVtLE9QVHxPUF9TSElGVCxPUF9TUkMsT1BUfE9QX0RTVH0sIAotICAgIEZMX0VYVHxGTF9TTVIsIDB4MEMwMCwgMHhGQ0UwfSwKLSAgeyAiYWRkIiwgICAxLDMsMywweEEwMDAsIDB4RkUwMCwge09QX1htZW0sT1BfWW1lbSxPUF9EU1R9LCB9LAotICB7ICJhZGQiLCAgIDIsMiw0LDB4RjAwMCwgMHhGQ0YwLCB7T1BfbGssT1BUfE9QX1NISUZULE9QX1NSQyxPUFR8T1BfRFNUfSwgfSwKLSAgeyAiYWRkIiwgICAyLDMsNCwweEYwNjAsIDB4RkNGRiwge09QX2xrLE9QXzE2LE9QX1NSQyxPUFR8T1BfRFNUfSwgfSwKLSAgeyAiYWRkYyIsICAxLDIsMiwweDA2MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJhZGRtIiwgIDIsMiwyLDB4NkIwMCwgMHhGRjAwLCB7T1BfbGssT1BfU21lbX0sIEZMX05SfEZMX1NNUiwgfSwKLSAgeyAiYWRkcyIsICAxLDIsMiwweDAyMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJhbmQiLCAgIDEsMSwzLDB4RjA4MCwgMHhGQ0UwLCB7T1BfU1JDLE9QVHxPUF9TSElGVCxPUFR8T1BfRFNUfSwgfSwKLSAgeyAiYW5kIiwgICAxLDIsMiwweDE4MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJhbmQiLCAgIDIsMiw0LDB4RjAzMCwgMHhGQ0YwLCB7T1BfbGssT1BUfE9QX1NIRlQsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJhbmQiLCAgIDIsMyw0LDB4RjA2MywgMHhGQ0ZGLCB7T1BfbGssT1BfMTYsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJhbmRtIiwgIDIsMiwyLDB4NjgwMCwgMHhGRjAwLCB7T1BfbGssT1BfU21lbX0sIEZMX05SLCB9LAotICB7ICJiIiwgICAgIDIsMSwxLDB4RjA3MywgMHhGRkZGLCB7T1BfcG1hZH0sIEJfQlJBTkNIfEZMX05SLCB9LAotICB7ICJiZCIsICAgIDIsMSwxLDB4RjI3MywgMHhGRkZGLCB7T1BfcG1hZH0sIEJfQlJBTkNIfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJiYWNjIiwgIDEsMSwxLDB4RjRFMiwgMHhGRUZGLCB7T1BfU1JDMX0sIEJfQkFDQ3xGTF9OUiwgfSwKLSAgeyAiYmFjY2QiLCAxLDEsMSwweEY2RTIsIDB4RkVGRiwge09QX1NSQzF9LCBCX0JBQ0N8RkxfREVMQVl8RkxfTlIsIH0sCi0gIHsgImJhbnoiLCAgMiwyLDIsMHg2QzAwLCAweEZGMDAsIHtPUF9wbWFkLE9QX1NpbmR9LCBCX0JSQU5DSHxGTF9OUiwgfSwKLSAgeyAiYmFuemQiLCAyLDIsMiwweDZFMDAsIDB4RkYwMCwge09QX3BtYWQsT1BfU2luZH0sIEJfQlJBTkNIfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJiYyIsICAgIDIsMiw0LDB4RjgwMCwgMHhGRjAwLCB7T1BfcG1hZCxPUF9DQyxPUFR8T1BfQ0MsT1BUfE9QX0NDfSwgCi0gICAgQl9CUkFOQ0h8RkxfTlIsIH0sCi0gIHsgImJjZCIsICAgMiwyLDQsMHhGQTAwLCAweEZGMDAsIHtPUF9wbWFkLE9QX0NDLE9QVHxPUF9DQyxPUFR8T1BfQ0N9LAotICAgIEJfQlJBTkNIfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJiaXQiLCAgIDEsMiwyLDB4OTYwMCwgMHhGRjAwLCB7T1BfWG1lbSxPUF9CSVRDfSwgfSwKLSAgeyAiYml0ZiIsICAyLDIsMiwweDYxMDAsIDB4RkYwMCwge09QX1NtZW0sT1BfbGt9LCBGTF9TTVIgfSwKLSAgeyAiYml0dCIsICAxLDEsMSwweDM0MDAsIDB4RkYwMCwge09QX1NtZW19LCBGTF9TTVIgfSwKLSAgeyAiY2FsYSIsICAxLDEsMSwweEY0RTMsIDB4RkVGRiwge09QX1NSQzF9LCBCX0JBQ0N8RkxfTlIsIH0sCi0gIHsgImNhbGFkIiwgMSwxLDEsMHhGNkUzLCAweEZFRkYsIHtPUF9TUkMxfSwgQl9CQUNDfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJjYWxsIiwgIDIsMSwxLDB4RjA3NCwgMHhGRkZGLCB7T1BfcG1hZH0sIEJfQlJBTkNIfEZMX05SLCB9LAotICB7ICJjYWxsZCIsIDIsMSwxLDB4RjI3NCwgMHhGRkZGLCB7T1BfcG1hZH0sIEJfQlJBTkNIfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJjYyIsICAgIDIsMiw0LDB4RjkwMCwgMHhGRjAwLCB7T1BfcG1hZCxPUF9DQyxPUFR8T1BfQ0MsT1BUfE9QX0NDfSwgCi0gICAgQl9CUkFOQ0h8RkxfTlIsIH0sCi0gIHsgImNjZCIsICAgMiwyLDQsMHhGQjAwLCAweEZGMDAsIHtPUF9wbWFkLE9QX0NDLE9QVHxPUF9DQyxPUFR8T1BfQ0N9LAotICAgIEJfQlJBTkNIfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJjbXBsIiwgIDEsMSwyLDB4RjQ5MywgMHhGQ0ZGLCB7T1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJjbXBtIiwgIDIsMiwyLDB4NjAwMCwgMHhGRjAwLCB7T1BfU21lbSxPUF9sa30sIEZMX1NNUiB9LAotICB7ICJjbXByIiwgIDEsMiwyLDB4RjRBOCwgMHhGQ0Y4LCB7T1BfQ0MzLE9QX0FSWH0sIEZMX05SLCB9LAotICB7ICJjbXBzIiwgIDEsMiwyLDB4OEUwMCwgMHhGRTAwLCB7T1BfU1JDMSxPUF9TbWVtfSwgfSwKLSAgeyAiZGFkZCIsICAxLDIsMywweDUwMDAsIDB4RkMwMCwge09QX0xtZW0sT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJkYWRzdCIsIDEsMiwyLDB4NUEwMCwgMHhGRTAwLCB7T1BfTG1lbSxPUF9EU1R9LCB9LAotICB7ICJkZWxheSIsIDEsMSwxLDB4NEQwMCwgMHhGRjAwLCB7T1BfU21lbX0sIEZMX1NNUiB9LAotICB7ICJkbGQiLCAgIDEsMiwyLDB4NTYwMCwgMHhGRTAwLCB7T1BfTG1lbSxPUF9EU1R9LCB9LAotICB7ICJkcnN1YiIsIDEsMiwyLDB4NTgwMCwgMHhGRTAwLCB7T1BfTG1lbSxPUF9TUkMxfSwgfSwKLSAgeyAiZHNhZHQiLCAxLDIsMiwweDVFMDAsIDB4RkUwMCwge09QX0xtZW0sT1BfRFNUfSwgfSwKLSAgeyAiZHN0IiwgICAxLDIsMiwweDRFMDAsIDB4RkUwMCwge09QX1NSQzEsT1BfTG1lbX0sIEZMX05SLCB9LAotICB7ICJkc3ViIiwgIDEsMiwyLDB4NTQwMCwgMHhGRTAwLCB7T1BfTG1lbSxPUF9TUkMxfSwgfSwKLSAgeyAiZHN1YnQiLCAxLDIsMiwweDVDMDAsIDB4RkUwMCwge09QX0xtZW0sT1BfRFNUfSwgfSwKLSAgeyAiZXhwIiwgICAxLDEsMSwweEY0OEUsIDB4RkVGRiwge09QX1NSQzF9LCB9LAotICB7ICJmYmFjYyIsIDEsMSwxLDB4RjRFNiwgMHhGRUZGLCB7T1BfU1JDMX0sIEJfQkFDQ3xGTF9GQVJ8RkxfTlIsIH0sCi0gIHsgImZiYWNjZCIsMSwxLDEsMHhGNkU2LCAweEZFRkYsIHtPUF9TUkMxfSwgQl9CQUNDfEZMX0ZBUnxGTF9ERUxBWXxGTF9OUiwgfSwKLSAgeyAiZmNhbGEiLCAxLDEsMSwweEY0RTcsIDB4RkVGRiwge09QX1NSQzF9LCBCX0JBQ0N8RkxfRkFSfEZMX05SLCB9LAotICB7ICJmY2FsYWQiLDEsMSwxLDB4RjZFNywgMHhGRUZGLCB7T1BfU1JDMX0sIEJfQkFDQ3xGTF9GQVJ8RkxfREVMQVl8RkxfTlIsIH0sCi0gIHsgImZpcnMiLCAgMiwzLDMsMHhFMDAwLCAweEZGMDAsIHtPUF9YbWVtLE9QX1ltZW0sT1BfcG1hZH0sIH0sCi0gIHsgImZyYW1lIiwgMSwxLDEsMHhFRTAwLCAweEZGMDAsIHtPUF9rOH0sIH0sCi0gIHsgImZyZXQiLCAgMSwwLDAsMHhGNEU0LCAweEZGRkYsIHtPUF9Ob25lfSwgQl9SRVR8RkxfRkFSfEZMX05SLCB9LAotICB7ICJmcmV0ZCIsIDEsMCwwLDB4RjZFNCwgMHhGRkZGLCB7T1BfTm9uZX0sIEJfUkVUfEZMX0ZBUnxGTF9ERUxBWXxGTF9OUiwgfSwKLSAgeyAiZnJldGUiLCAxLDAsMCwweEY0RTUsIDB4RkZGRiwge09QX05vbmV9LCBCX1JFVHxGTF9GQVJ8RkxfTlIsIH0sCi0gIHsgImZyZXRlZCIsMSwwLDAsMHhGNkU1LCAweEZGRkYsIHtPUF9Ob25lfSwgQl9SRVR8RkxfRkFSfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJpZGxlIiwgIDEsMSwxLDB4RjRFMSwgMHhGQ0ZGLCB7T1BfMTIzfSwgRkxfTlIsIH0sCi0gIHsgImludHIiLCAgMSwxLDEsMHhGN0MwLCAweEZGRTAsIHtPUF8wMzF9LCBCX0JSQU5DSHxGTF9OUiwgfSwKLSAgeyAibGQiLCAgICAxLDIsMywweEY0ODIsIDB4RkNGRiwge09QX1NSQyxPUF9BU00sT1BUfE9QX0RTVH0sIH0sLypTUkMqLwotICB7ICJsZCIsICAgIDEsMiwzLDB4RjQ0MCwgMHhGQ0UwLCB7T1BfU1JDLE9QVHxPUF9TSElGVCxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgLyogYWx0ZXJuYXRlIHN5bnRheCAqLwotICB7ICJsZCIsICAgIDEsMiwzLDB4RjQ0MCwgMHhGQ0UwLCB7T1BfU1JDLE9QX1NISUZULE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAibGQiLCAgICAxLDIsMiwweEU4MDAsIDB4RkUwMCwge09QX2s4dSxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAibGQiLCAgICAxLDIsMiwweEVEMDAsIDB4RkZFMCwge09QX2s1LE9QX0FTTX0sIH0sLypTUkMqLwotICB7ICJsZCIsICAgIDEsMiwyLDB4RjRBMCwgMHhGRkY4LCB7T1BfazMsT1BfQVJQfSwgRkxfTlIsIH0sLypTUkMqLwotICB7ICJsZCIsICAgIDEsMiwyLDB4RUEwMCwgMHhGRTAwLCB7T1BfazksT1BfRFB9LCBGTF9OUiwgfSwvKlBSRUZFUiAqLwotICB7ICJsZCIsICAgIDEsMiwyLDB4MzAwMCwgMHhGRjAwLCB7T1BfU21lbSxPUF9UfSwgRkxfU01SIH0sLypTUkMqLwotICB7ICJsZCIsICAgIDEsMiwyLDB4NDYwMCwgMHhGRjAwLCB7T1BfU21lbSxPUF9EUH0sIEZMX1NNUiB9LC8qU1JDKi8KLSAgeyAibGQiLCAgICAxLDIsMiwweDMyMDAsIDB4RkYwMCwge09QX1NtZW0sT1BfQVNNfSwgRkxfU01SIH0sLypTUkMqLwotICB7ICJsZCIsICAgIDEsMiwyLDB4MTAwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9EU1R9LCBGTF9TTVIgfSwKLSAgeyAibGQiLCAgICAxLDMsMywweDE0MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfVFMsT1BfRFNUfSwgRkxfU01SIH0sCi0gIHsgImxkIiwgICAgMSwzLDMsMHg0NDAwLCAweEZFMDAsIHtPUF9TbWVtLE9QXzE2LE9QX0RTVH0sIEZMX1NNUiB9LAotICB7ICJsZCIsICAgIDEsMywzLDB4OTQwMCwgMHhGRTAwLCB7T1BfWG1lbSxPUF9TSEZULE9QX0RTVH0sIH0sLypQUkVGRVIqLwotICB7ICJsZCIsICAgIDIsMiwzLDB4NkYwMCwgMHhGRjAwLCB7T1BfU21lbSxPUFR8T1BfU0hJRlQsT1BfRFNUfSwgCi0gICAgRkxfRVhUfEZMX1NNUiwgMHgwQzQwLCAweEZFRTAgfSwKLSAgeyAibGQiLCAgICAyLDIsMywweEYwMjAsIDB4RkVGMCwge09QX2xrLE9QVHxPUF9TSEZULE9QX0RTVH0sIH0sCi0gIHsgImxkIiwgICAgMiwzLDMsMHhGMDYyLCAweEZFRkYsIHtPUF9sayxPUF8xNixPUF9EU1R9LCB9LAotICB7ICJsZG0iLCAgIDEsMiwyLDB4NDgwMCwgMHhGRTAwLCB7T1BfTU1SLE9QX0RTVH0sIH0sCi0gIHsgImxkciIsICAgMSwyLDIsMHgxNjAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX0RTVH0sIEZMX1NNUiB9LAotICB7ICJsZHUiLCAgIDEsMiwyLDB4MTIwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9EU1R9LCBGTF9TTVIgfSwKLSAgeyAibGR4IiwgICAyLDMsMywweEYwNjIsIDB4RkVGRiwge09QX3hwbWFkX21zNyxPUF8xNixPUF9EU1R9LCBGTF9GQVJ9LC8qcHNldWRvLW9wKi8KLSAgeyAibG1zIiwgICAxLDIsMiwweEUxMDAsIDB4RkYwMCwge09QX1htZW0sT1BfWW1lbX0sIH0sCi0gIHsgImx0ZCIsICAgMSwxLDEsMHg0QzAwLCAweEZGMDAsIHtPUF9TbWVtfSwgRkxfU01SIH0sCi0gIHsgIm1hYyIsICAgMSwyLDIsMHgyODAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX1NSQzF9LCBGTF9TTVIgfSwKLSAgeyAibWFjIiwgICAxLDMsNCwweEIwMDAsIDB4RkMwMCwge09QX1htZW0sT1BfWW1lbSxPUF9TUkMsT1BUfE9QX0RTVH0sIH0sCi0gIHsgIm1hYyIsICAgMiwyLDMsMHhGMDY3LCAweEZDRkYsIHtPUF9sayxPUF9TUkMsT1BUfE9QX0RTVH0sIH0sCi0gIHsgIm1hYyIsICAgMiwzLDQsMHg2NDAwLCAweEZDMDAsIHtPUF9TbWVtLE9QX2xrLE9QX1NSQyxPUFR8T1BfRFNUfSwgRkxfU01SIH0sCi0gIHsgIm1hY3IiLCAgMSwyLDIsMHgyQTAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX1NSQzF9LCBGTF9TTVIgfSwKLSAgeyAibWFjciIsICAxLDMsNCwweEI0MDAsIDB4RkMwMCwge09QX1htZW0sT1BfWW1lbSxPUF9TUkMsT1BUfE9QX0RTVH0sRkxfU01SfSwKLSAgeyAibWFjYSIsICAxLDIsMywweEY0ODgsIDB4RkNGRiwge09QX1QsT1BfU1JDLE9QVHxPUF9EU1R9LCBGTF9TTVIgfSwvKlNSQyovCi0gIHsgIm1hY2EiLCAgMSwxLDIsMHgzNTAwLCAweEZGMDAsIHtPUF9TbWVtLE9QVHxPUF9CfSwgRkxfU01SIH0sCi0gIHsgIm1hY2FyIiwgMSwyLDMsMHhGNDg5LCAweEZDRkYsIHtPUF9ULE9QX1NSQyxPUFR8T1BfRFNUfSwgRkxfU01SIH0sLypTUkMqLwotICB7ICJtYWNhciIsIDEsMSwyLDB4MzcwMCwgMHhGRjAwLCB7T1BfU21lbSxPUFR8T1BfQn0sIEZMX1NNUiB9LAotICB7ICJtYWNkIiwgIDIsMywzLDB4N0EwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9wbWFkLE9QX1NSQzF9LCBGTF9TTVIgfSwKLSAgeyAibWFjcCIsICAyLDMsMywweDc4MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfcG1hZCxPUF9TUkMxfSwgRkxfU01SIH0sCi0gIHsgIm1hY3N1IiwgMSwzLDMsMHhBNjAwLCAweEZFMDAsIHtPUF9YbWVtLE9QX1ltZW0sT1BfU1JDMX0sIH0sCi0gIHsgIm1hciIsICAgMSwxLDEsMHg2RDAwLCAweEZGMDAsIHtPUF9TbWVtfSwgfSwKLSAgeyAibWFzIiwgICAxLDIsMiwweDJDMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJtYXMiLCAgIDEsMyw0LDB4QjgwMCwgMHhGQzAwLCB7T1BfWG1lbSxPUF9ZbWVtLE9QX1NSQyxPUFR8T1BfRFNUfSwgfSwKLSAgeyAibWFzciIsICAxLDIsMiwweDJFMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJtYXNyIiwgIDEsMyw0LDB4QkMwMCwgMHhGQzAwLCB7T1BfWG1lbSxPUF9ZbWVtLE9QX1NSQyxPUFR8T1BfRFNUfSwgfSwKLSAgeyAibWFzYSIsICAxLDIsMywweEY0OEEsIDB4RkNGRiwge09QX1QsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAibWFzYSIsICAxLDEsMiwweDMzMDAsIDB4RkYwMCwge09QX1NtZW0sT1BUfE9QX0J9LCBGTF9TTVIgfSwKLSAgeyAibWFzYXIiLCAxLDIsMywweEY0OEIsIDB4RkNGRiwge09QX1QsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJtYXgiLCAgIDEsMSwxLDB4RjQ4NiwgMHhGRUZGLCB7T1BfRFNUfSwgfSwKLSAgeyAibWluIiwgICAxLDEsMSwweEY0ODcsIDB4RkVGRiwge09QX0RTVH0sIH0sCi0gIHsgIm1weSIsICAgMSwyLDIsMHgyMDAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX0RTVH0sIEZMX1NNUiB9LAotICB7ICJtcHkiLCAgIDEsMywzLDB4QTQwMCwgMHhGRTAwLCB7T1BfWG1lbSxPUF9ZbWVtLE9QX0RTVH0sIH0sCi0gIHsgIm1weSIsICAgMiwzLDMsMHg2MjAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX2xrLE9QX0RTVH0sIEZMX1NNUiB9LAotICB7ICJtcHkiLCAgIDIsMiwyLDB4RjA2NiwgMHhGRUZGLCB7T1BfbGssT1BfRFNUfSwgfSwKLSAgeyAibXB5ciIsICAxLDIsMiwweDIyMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfRFNUfSwgRkxfU01SIH0sCi0gIHsgIm1weWEiLCAgMSwxLDEsMHhGNDhDLCAweEZFRkYsIHtPUF9EU1R9LCB9LCAvKlNSQyovCi0gIHsgIm1weWEiLCAgMSwxLDEsMHgzMTAwLCAweEZGMDAsIHtPUF9TbWVtfSwgRkxfU01SIH0sCi0gIHsgIm1weXUiLCAgMSwyLDIsMHgyNDAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX0RTVH0sIEZMX1NNUiB9LAotICB7ICJtdmRkIiwgIDEsMiwyLDB4RTUwMCwgMHhGRjAwLCB7T1BfWG1lbSxPUF9ZbWVtfSwgfSwKLSAgeyAibXZkayIsICAyLDIsMiwweDcxMDAsIDB4RkYwMCwge09QX1NtZW0sT1BfZG1hZH0sIEZMX1NNUiB9LAotICB7ICJtdmRtIiwgIDIsMiwyLDB4NzIwMCwgMHhGRjAwLCB7T1BfZG1hZCxPUF9NTVJ9LCB9LAotICB7ICJtdmRwIiwgIDIsMiwyLDB4N0QwMCwgMHhGRjAwLCB7T1BfU21lbSxPUF9wbWFkfSwgRkxfU01SIH0sCi0gIHsgIm12a2QiLCAgMiwyLDIsMHg3MDAwLCAweEZGMDAsIHtPUF9kbWFkLE9QX1NtZW19LCB9LAotICB7ICJtdm1kIiwgIDIsMiwyLDB4NzMwMCwgMHhGRjAwLCB7T1BfTU1SLE9QX2RtYWR9LCB9LAotICB7ICJtdm1tIiwgIDEsMiwyLDB4RTcwMCwgMHhGRjAwLCB7T1BfTU1SWCxPUF9NTVJZfSwgRkxfTlIsIH0sCi0gIHsgIm12cGQiLCAgMiwyLDIsMHg3QzAwLCAweEZGMDAsIHtPUF9wbWFkLE9QX1NtZW19LCB9LAotICB7ICJuZWciLCAgIDEsMSwyLDB4RjQ4NCwgMHhGQ0ZGLCB7T1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJub3AiLCAgIDEsMCwwLDB4RjQ5NSwgMHhGRkZGLCB7T1BfTm9uZX0sIH0sCi0gIHsgIm5vcm0iLCAgMSwxLDIsMHhGNDhGLCAweEZDRkYsIHtPUF9TUkMsT1BUfE9QX0RTVH0sIH0sCi0gIHsgIm9yIiwgICAgMSwxLDMsMHhGMEEwLCAweEZDRTAsIHtPUF9TUkMsT1BUfE9QX1NISUZULE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAib3IiLCAgICAxLDIsMiwweDFBMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJvciIsICAgIDIsMiw0LDB4RjA0MCwgMHhGQ0YwLCB7T1BfbGssT1BUfE9QX1NIRlQsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJvciIsICAgIDIsMyw0LDB4RjA2NCwgMHhGQ0ZGLCB7T1BfbGssT1BfMTYsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJvcm0iLCAgIDIsMiwyLDB4NjkwMCwgMHhGRjAwLCB7T1BfbGssT1BfU21lbX0sIEZMX05SfEZMX1NNUiwgfSwKLSAgeyAicG9seSIsICAxLDEsMSwweDM2MDAsIDB4RkYwMCwge09QX1NtZW19LCBGTF9TTVIgfSwKLSAgeyAicG9wZCIsICAxLDEsMSwweDhCMDAsIDB4RkYwMCwge09QX1NtZW19LCB9LAotICB7ICJwb3BtIiwgIDEsMSwxLDB4OEEwMCwgMHhGRjAwLCB7T1BfTU1SfSwgfSwKLSAgeyAicG9ydHIiLCAyLDIsMiwweDc0MDAsIDB4RkYwMCwge09QX1BBLE9QX1NtZW19LCB9LAotICB7ICJwb3J0dyIsIDIsMiwyLDB4NzUwMCwgMHhGRjAwLCB7T1BfU21lbSxPUF9QQX0sIEZMX1NNUiB9LAotICB7ICJwc2hkIiwgIDEsMSwxLDB4NEIwMCwgMHhGRjAwLCB7T1BfU21lbX0sIEZMX1NNUiB9LAotICB7ICJwc2htIiwgIDEsMSwxLDB4NEEwMCwgMHhGRjAwLCB7T1BfTU1SfSwgfSwKLSAgeyAicmV0IiwgICAxLDAsMCwweEZDMDAsIDB4RkZGRiwge09QX05vbmV9LCBCX1JFVHxGTF9OUiwgfSwKLSAgeyAicmV0ZCIsICAxLDAsMCwweEZFMDAsIDB4RkZGRiwge09QX05vbmV9LCBCX1JFVHxGTF9ERUxBWXxGTF9OUiwgfSwKLSAgeyAicmMiLCAgICAxLDEsMywweEZDMDAsIDB4RkYwMCwge09QX0NDLE9QVHxPUF9DQyxPUFR8T1BfQ0N9LCAKLSAgICBCX1JFVHxGTF9OUiwgfSwKLSAgeyAicmNkIiwgICAxLDEsMywweEZFMDAsIDB4RkYwMCwge09QX0NDLE9QVHxPUF9DQyxPUFR8T1BfQ0N9LCAKLSAgICBCX1JFVHxGTF9ERUxBWXxGTF9OUiwgfSwKLSAgeyAicmVhZGEiLCAxLDEsMSwweDdFMDAsIDB4RkYwMCwge09QX1NtZW19LCB9LAotICB7ICJyZXNldCIsIDEsMCwwLDB4RjdFMCwgMHhGRkZGLCB7T1BfTm9uZX0sIEZMX05SLCB9LAotICB7ICJyZXRlIiwgIDEsMCwwLDB4RjRFQiwgMHhGRkZGLCB7T1BfTm9uZX0sIEJfUkVUfEZMX05SLCB9LAotICB7ICJyZXRlZCIsIDEsMCwwLDB4RjZFQiwgMHhGRkZGLCB7T1BfTm9uZX0sIEJfUkVUfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJyZXRmIiwgIDEsMCwwLDB4RjQ5QiwgMHhGRkZGLCB7T1BfTm9uZX0sIEJfUkVUfEZMX05SLCB9LAotICB7ICJyZXRmZCIsIDEsMCwwLDB4RjY5QiwgMHhGRkZGLCB7T1BfTm9uZX0sIEJfUkVUfEZMX0RFTEFZfEZMX05SLCB9LAotICB7ICJybmQiLCAgIDEsMSwyLDB4RjQ5RiwgMHhGQ0ZGLCB7T1BfU1JDLE9QVHxPUF9EU1R9LCBGTF9MUHxGTF9OUiB9LAotICB7ICJyb2wiLCAgIDEsMSwxLDB4RjQ5MSwgMHhGRUZGLCB7T1BfU1JDMX0sIH0sCi0gIHsgInJvbHRjIiwgMSwxLDEsMHhGNDkyLCAweEZFRkYsIHtPUF9TUkMxfSwgfSwKLSAgeyAicm9yIiwgICAxLDEsMSwweEY0OTAsIDB4RkVGRiwge09QX1NSQzF9LCB9LAotICB7ICJycHQiLCAgIDEsMSwxLDB4NDcwMCwgMHhGRjAwLCB7T1BfU21lbX0sIEJfUkVQRUFUfEZMX05SfEZMX1NNUiwgfSwKLSAgeyAicnB0IiwgICAxLDEsMSwweEVDMDAsIDB4RkYwMCwge09QX2s4dX0sIEJfUkVQRUFUfEZMX05SLCB9LAotICB7ICJycHQiLCAgIDIsMSwxLDB4RjA3MCwgMHhGRkZGLCB7T1BfbGt1fSwgQl9SRVBFQVR8RkxfTlIsIH0sCi0gIHsgInJwdGIiLCAgMiwxLDEsMHhGMDcyLCAweEZGRkYsIHtPUF9wbWFkfSwgRkxfTlIsIH0sCi0gIHsgInJwdGJkIiwgMiwxLDEsMHhGMjcyLCAweEZGRkYsIHtPUF9wbWFkfSwgRkxfREVMQVl8RkxfTlIsIH0sCi0gIHsgInJwdHoiLCAgMiwyLDIsMHhGMDcxLCAweEZFRkYsIHtPUF9EU1QsT1BfbGt1fSwgQl9SRVBFQVR8RkxfTlIsIH0sCi0gIHsgInJzYngiLCAgMSwxLDIsMHhGNEIwLCAweEZERjAsIHtPUFR8T1BfTixPUF9TQklUfSwgRkxfTlIsIH0sCi0gIHsgInNhY2NkIiwgMSwzLDMsMHg5RTAwLCAweEZFMDAsIHtPUF9TUkMxLE9QX1htZW0sT1BfQ0MyfSwgfSwKLSAgeyAic2F0IiwgICAxLDEsMSwweEY0ODMsIDB4RkVGRiwge09QX1NSQzF9LCB9LAotICB7ICJzZnRhIiwgIDEsMiwzLDB4RjQ2MCwgMHhGQ0UwLCB7T1BfU1JDLE9QX1NISUZULE9QVHxPUF9EU1R9LCB9LAotICB7ICJzZnRjIiwgIDEsMSwxLDB4RjQ5NCwgMHhGRUZGLCB7T1BfU1JDMX0sIH0sCi0gIHsgInNmdGwiLCAgMSwyLDMsMHhGMEUwLCAweEZDRTAsIHtPUF9TUkMsT1BfU0hJRlQsT1BUfE9QX0RTVH0sIH0sCi0gIHsgInNxZHN0IiwgMSwyLDIsMHhFMjAwLCAweEZGMDAsIHtPUF9YbWVtLE9QX1ltZW19LCB9LAotICB7ICJzcXVyIiwgIDEsMiwyLDB4RjQ4RCwgMHhGRUZGLCB7T1BfQSxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAic3F1ciIsICAxLDIsMiwweDI2MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfRFNUfSwgRkxfU01SIH0sCi0gIHsgInNxdXJhIiwgMSwyLDIsMHgzODAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX1NSQzF9LCBGTF9TTVIgfSwKLSAgeyAic3F1cnMiLCAxLDIsMiwweDNBMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJzcmNjZCIsIDEsMiwyLDB4OUQwMCwgMHhGRjAwLCB7T1BfWG1lbSxPUF9DQzJ9LCB9LAotICB7ICJzc2J4IiwgIDEsMSwyLDB4RjVCMCwgMHhGREYwLCB7T1BUfE9QX04sT1BfU0JJVH0sIEZMX05SLCB9LAotICB7ICJzdCIsICAgIDEsMiwyLDB4OEMwMCwgMHhGRjAwLCB7T1BfVCxPUF9TbWVtfSwgfSwKLSAgeyAic3QiLCAgICAxLDIsMiwweDhEMDAsIDB4RkYwMCwge09QX1RSTixPUF9TbWVtfSwgfSwKLSAgeyAic3QiLCAgICAyLDIsMiwweDc2MDAsIDB4RkYwMCwge09QX2xrLE9QX1NtZW19LCB9LAotICB7ICJzdGgiLCAgIDEsMiwyLDB4ODIwMCwgMHhGRTAwLCB7T1BfU1JDMSxPUF9TbWVtfSwgfSwKLSAgeyAic3RoIiwgICAxLDMsMywweDg2MDAsIDB4RkUwMCwge09QX1NSQzEsT1BfQVNNLE9QX1NtZW19LCB9LAotICB7ICJzdGgiLCAgIDEsMywzLDB4OUEwMCwgMHhGRTAwLCB7T1BfU1JDMSxPUF9TSEZULE9QX1htZW19LCB9LAotICB7ICJzdGgiLCAgIDIsMiwzLDB4NkYwMCwgMHhGRjAwLCB7T1BfU1JDMSxPUFR8T1BfU0hJRlQsT1BfU21lbX0sIAotICAgIEZMX0VYVCwgMHgwQzYwLCAweEZFRTAgfSwKLSAgeyAic3RsIiwgICAxLDIsMiwweDgwMDAsIDB4RkUwMCwge09QX1NSQzEsT1BfU21lbX0sIH0sCi0gIHsgInN0bCIsICAgMSwzLDMsMHg4NDAwLCAweEZFMDAsIHtPUF9TUkMxLE9QX0FTTSxPUF9TbWVtfSwgfSwKLSAgeyAic3RsIiwgICAxLDMsMywweDk4MDAsIDB4RkUwMCwge09QX1NSQzEsT1BfU0hGVCxPUF9YbWVtfSwgfSwKLSAgeyAic3RsIiwgICAyLDIsMywweDZGMDAsIDB4RkYwMCwge09QX1NSQzEsT1BUfE9QX1NISUZULE9QX1NtZW19LCAKLSAgICBGTF9FWFQsIDB4MEM4MCwgMHhGRUUwIH0sCi0gIHsgInN0bG0iLCAgMSwyLDIsMHg4ODAwLCAweEZFMDAsIHtPUF9TUkMxLE9QX01NUn0sIH0sCi0gIHsgInN0bSIsICAgMiwyLDIsMHg3NzAwLCAweEZGMDAsIHtPUF9sayxPUF9NTVJ9LCB9LAotICB7ICJzdHJjZCIsIDEsMiwyLDB4OUMwMCwgMHhGRjAwLCB7T1BfWG1lbSxPUF9DQzJ9LCB9LAotICB7ICJzdWIiLCAgIDEsMSwzLDB4RjQyMCwgMHhGQ0UwLCB7T1BfU1JDLE9QVHxPUF9TSElGVCxPUFR8T1BfRFNUfSwgfSwvKlNSQyovCi0gIHsgInN1YiIsICAgMSwyLDMsMHhGNDgxLCAweEZDRkYsIHtPUF9TUkMsT1BfQVNNLE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAic3ViIiwgICAxLDIsMiwweDA4MDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJzdWIiLCAgIDEsMywzLDB4MEMwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9UUyxPUF9TUkMxfSwgRkxfU01SIH0sCi0gIHsgInN1YiIsICAgMSwzLDQsMHg0MDAwLCAweEZDMDAsIHtPUF9TbWVtLE9QXzE2LE9QX1NSQyxPUFR8T1BfRFNUfSwgRkxfU01SIH0sCi0gIHsgInN1YiIsICAgMSwzLDMsMHg5MjAwLCAweEZFMDAsIHtPUF9YbWVtLE9QX1NIRlQsT1BfU1JDMX0sIH0sIC8qUFJFRkVSKi8KLSAgeyAic3ViIiwgICAyLDIsNCwweDZGMDAsIDB4RkYwMCwge09QX1NtZW0sT1BUfE9QX1NISUZULE9QX1NSQyxPUFR8T1BfRFNUfSwgCi0gICAgRkxfRVhUfEZMX1NNUiwgMHgwQzIwLCAweEZDRTAgfSwKLSAgeyAic3ViIiwgICAxLDMsMywweEEyMDAsIDB4RkUwMCwge09QX1htZW0sT1BfWW1lbSxPUF9EU1R9LCB9LAotICB7ICJzdWIiLCAgIDIsMiw0LDB4RjAxMCwgMHhGQ0YwLCB7T1BfbGssT1BUfE9QX1NIRlQsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJzdWIiLCAgIDIsMyw0LDB4RjA2MSwgMHhGQ0ZGLCB7T1BfbGssT1BfMTYsT1BfU1JDLE9QVHxPUF9EU1R9LCB9LAotICB7ICJzdWJiIiwgIDEsMiwyLDB4MEUwMCwgMHhGRTAwLCB7T1BfU21lbSxPUF9TUkMxfSwgRkxfU01SIH0sCi0gIHsgInN1YmMiLCAgMSwyLDIsMHgxRTAwLCAweEZFMDAsIHtPUF9TbWVtLE9QX1NSQzF9LCBGTF9TTVIgfSwKLSAgeyAic3VicyIsICAxLDIsMiwweDBBMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJ0cmFwIiwgIDEsMSwxLDB4RjRDMCwgMHhGRkUwLCB7T1BfMDMxfSwgQl9CUkFOQ0h8RkxfTlIsIH0sCi0gIHsgIndyaXRhIiwgMSwxLDEsMHg3RjAwLCAweEZGMDAsIHtPUF9TbWVtfSwgRkxfU01SIH0sCi0gIHsgInhjIiwgICAgMSwyLDQsMHhGRDAwLCAweEZEMDAsIHtPUF8xMixPUF9DQyxPUFR8T1BfQ0MsT1BUfE9QX0NDfSwgRkxfTlIsIH0sCi0gIHsgInhvciIsICAgMSwxLDMsMHhGMEMwLCAweEZDRTAsIHtPUF9TUkMsT1BUfE9QX1NISUZULE9QVHxPUF9EU1R9LCB9LC8qU1JDKi8KLSAgeyAieG9yIiwgICAxLDIsMiwweDFDMDAsIDB4RkUwMCwge09QX1NtZW0sT1BfU1JDMX0sIEZMX1NNUiB9LAotICB7ICJ4b3IiLCAgIDIsMiw0LDB4RjA1MCwgMHhGQ0YwLCB7T1BfbGt1LE9QVHxPUF9TSEZULE9QX1NSQyxPUFR8T1BfRFNUfSwgfSwKLSAgeyAieG9yIiwgICAyLDMsNCwweEYwNjUsIDB4RkNGRiwge09QX2xrdSxPUF8xNixPUF9TUkMsT1BUfE9QX0RTVH0sIH0sCi0gIHsgInhvcm0iLCAgMiwyLDIsMHg2QTAwLCAweEZGMDAsIHtPUF9sa3UsT1BfU21lbX0sIEZMX05SfEZMX1NNUiwgfSwKLSAgeyBOVUxMLCB9LAotfTsKLQotLyogYXNzdW1lIGFsbCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgaGF2ZSBhdCBsZWFzdCB0aHJlZSBvcGVyYW5kcyAqLwotY29uc3QgcGFydGVtcGxhdGUgdGljNTR4X3Bhcm9wdGFiW10gPSB7Ci0gIHsgImxkIiwibWFjIiwgMSwxLDIsMHhBODAwLCAweEZFMDAsIHtPUF9YbWVtLE9QX0RTVH0se09QX1ltZW0sT1BUfE9QX1JORH0sfSwKLSAgeyAibGQiLCJtYWNyIiwxLDEsMiwweEFBMDAsIDB4RkUwMCwge09QX1htZW0sT1BfRFNUfSx7T1BfWW1lbSxPUFR8T1BfUk5EfSx9LAotICB7ICJsZCIsIm1hcyIsIDEsMSwyLDB4QUMwMCwgMHhGRTAwLCB7T1BfWG1lbSxPUF9EU1R9LHtPUF9ZbWVtLE9QVHxPUF9STkR9LH0sCi0gIHsgImxkIiwibWFzciIsMSwxLDIsMHhBRTAwLCAweEZFMDAsIHtPUF9YbWVtLE9QX0RTVH0se09QX1ltZW0sT1BUfE9QX1JORH0sfSwKLSAgeyAic3QiLCJhZGQiLCAxLDIsMiwweEMwMDAsIDB4RkMwMCwge09QX1NSQyxPUF9ZbWVtfSx7T1BfWG1lbSxPUF9EU1R9LCB9LAotICB7ICJzdCIsImxkIiwgIDEsMiwyLDB4QzgwMCwgMHhGQzAwLCB7T1BfU1JDLE9QX1ltZW19LHtPUF9YbWVtLE9QX0RTVH0sIH0sCi0gIHsgInN0IiwibGQiLCAgMSwyLDIsMHhFNDAwLCAweEZDMDAsIHtPUF9TUkMsT1BfWW1lbX0se09QX1htZW0sT1BfVH0sIH0sCi0gIHsgInN0IiwibWFjIiwgMSwyLDIsMHhEMDAwLCAweEZDMDAsIHtPUF9TUkMsT1BfWW1lbX0se09QX1htZW0sT1BfRFNUfSwgfSwKLSAgeyAic3QiLCJtYWNyIiwxLDIsMiwweEQ0MDAsIDB4RkMwMCwge09QX1NSQyxPUF9ZbWVtfSx7T1BfWG1lbSxPUF9EU1R9LCB9LAotICB7ICJzdCIsIm1hcyIsIDEsMiwyLDB4RDgwMCwgMHhGQzAwLCB7T1BfU1JDLE9QX1ltZW19LHtPUF9YbWVtLE9QX0RTVH0sIH0sCi0gIHsgInN0IiwibWFzciIsMSwyLDIsMHhEQzAwLCAweEZDMDAsIHtPUF9TUkMsT1BfWW1lbX0se09QX1htZW0sT1BfRFNUfSwgfSwKLSAgeyAic3QiLCJtcHkiLCAxLDIsMiwweENDMDAsIDB4RkMwMCwge09QX1NSQyxPUF9ZbWVtfSx7T1BfWG1lbSxPUF9EU1R9LCB9LAotICB7ICJzdCIsInN1YiIsIDEsMiwyLDB4QzQwMCwgMHhGQzAwLCB7T1BfU1JDLE9QX1ltZW19LHtPUF9YbWVtLE9QX0RTVH0sIH0sCi0gIHsgTlVMTCxOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1kaXMuYyBiL29wY29kZXMvdGljODAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWNlOGYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKiBQcmludCBUSSBUTVMzMjBDODAgKE1WUCkgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBpbnQgbGVuZ3RoOwotCi1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2JpdG51bSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2Zsb2F0IFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfaW50ZWdlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGludCBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwgdW5zaWduZWQgbG9uZywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgZmlsbF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLQwKLS8qIFByaW50IGFuIGludGVnZXIgb3BlcmFuZC4gIFRyeSB0byBiZSBzb21ld2hhdCBzbWFydCBhYm91dCB0aGUKLSAgIGZvcm1hdCBieSBhc3N1bWluZyB0aGF0IHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXJzIGFyZQotICAgcHJvYmFibHkgbG9vcCBpbmNyZW1lbnQgdmFsdWVzLCBzdHJ1Y3R1cmUgb2Zmc2V0cywgb3Igc2ltaWxhcgotICAgdmFsdWVzIHRoYXQgYXJlIG1vcmUgbWVhbmluZ2Z1bCBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsIHZhbHVlcy4KLSAgIExhcmdlciBudW1iZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgcHJpbnRlZCBhcyBoZXggdmFsdWVzLiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGlmICgodmFsdWUgPiA5OTk5IHx8IHZhbHVlIDwgLTk5OTkpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotLyogRklYTUU6IGRlcGVuZHMgdXBvbiBzaXplb2YgKGxvbmcpID09IHNpemVvZiAoZmxvYXQpIGFuZAotICAgYWxzbyB1cG9uIGhvc3QgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IG1hdGNoaW5nIHRhcmdldAotICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9mbG9hdCAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICB1bmlvbiB7IGZsb2F0IGY7IGxvbmcgbDsgfSBmdmFsOwotCi0gIGZ2YWwubCA9IHZhbHVlOwotICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlZyIsIGZ2YWwuZik7Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsdWUsIFRJQzgwX09QRVJBTkRfQ1IpOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DQyk7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGludCBiaXRudW07Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICBiaXRudW0gPSB+dmFsdWUgJiAweDFGOwotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKGJpdG51bSwgVElDODBfT1BFUkFORF9CSVROVU0pOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIGJpdG51bSk7Ci0gICAgfQotfQotCi0MCi0vKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotCi0jZGVmaW5lIE1fU0koaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE3KSkpCi0jZGVmaW5lIE1fTEkoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE1KSkpCi0jZGVmaW5lIFJfU0NBTEVEKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDExKSkpCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChpbmZvLCB2YWx1ZSwgaW5zbiwgb3BlcmFuZCwgbWVtYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLXsKLSAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLSAgICAgIGlmIChNX1NJIChpbnNuLCBvcGVyYW5kKSB8fCBNX0xJIChpbnNuLCBvcGVyYW5kKSkKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICI6bSIpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiYSVsZCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKiB2YWx1ZSwgaW5mbyk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2JpdG51bSAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NDKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklURklFTEQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBzY2FsZWQgb3BlcmFuZCwgdGhlbiBwcmludCB0aGUgbW9kaWZpZXIgKi8KLQotICBpZiAoUl9TQ0FMRUQgKGluc24sIG9wZXJhbmQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjpzIik7Ci0gICAgfQotfQotCi0MCi0vKiBXZSBoYXZlIGNob3NlbiBhbiBvcGNvZGUgdGFibGUgZW50cnkgKi8KLQotc3RhdGljIGludAotcHJpbnRfb25lX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgbG9uZyB2YWx1ZTsKLSAgaW50IHN0YXR1czsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgaW50IGNsb3NlX3BhcmVuOwotCi0gICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUtMTBzIiwgb3Bjb2RlIC0+IG5hbWUpOwotCi0gIGZvciAob3BpbmRleCA9IG9wY29kZSAtPiBvcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgIHsKLSAgICAgIG9wZXJhbmQgPSB0aWM4MF9vcGVyYW5kcyArICpvcGluZGV4OwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZCAtPiBleHRyYWN0KQotCXsKLQkgIHZhbHVlID0gKCpvcGVyYW5kIC0+IGV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQgLT4gYml0cyA9PSAzMikKLQl7Ci0JICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAodW5zaWduZWQgbG9uZyAqKSAmdmFsdWUpOwotCSAgaWYgKHN0YXR1cyA9PSAtMSkKLQkgICAgewotCSAgICAgIHJldHVybiAoc3RhdHVzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQgLT4gc2hpZnQpICYgKCgxIDw8IG9wZXJhbmQgLT4gYml0cykgLSAxKTsKLQkgIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQgLT4gYml0cyAtIDEpKSkgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbHVlIC09IDEgPDwgb3BlcmFuZCAtPiBiaXRzOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMsIHRoZW4gcHJpbnQKLQkgdGhlIG9wZW4gcGFyZW4sIG90aGVyd2lzZSBqdXN0IHByaW50IHRoZSByZWd1bGFyIGNvbW1hCi0JIHNlcGFyYXRvciwgZXhjZXB0IGZvciB0aGUgZmlyc3Qgb3BlcmFuZC4gKi8KLQotICAgICAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpID09IDApCi0JewotCSAgY2xvc2VfcGFyZW4gPSAwOwotCSAgaWYgKG9waW5kZXggIT0gb3Bjb2RlIC0+IG9wZXJhbmRzKQotCSAgICB7Ci0JICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiLCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNsb3NlX3BhcmVuID0gMTsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIigiKTsKLQl9Ci0KLSAgICAgIHByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKTsKLQotICAgICAgLyogSWYgd2UgcHJpbnRlZCBhbiBvcGVuIHBhcmVuIGJlZm9yZSBwcmludGluZyB0aGlzIG9wZXJhbmQsIGNsb3NlCi0JIGl0IG5vdy4gVGhlIGZsYWcgZ2V0cyByZXNldCBvbiBlYWNoIGxvb3AuICovCi0KLSAgICAgIGlmIChjbG9zZV9wYXJlbikKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIpIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsZW5ndGgpOwotfQotCi0MCi0KLS8qIFRoZXJlIGFyZSBubyBzcGVjaWZpYyBiaXRzIHRoYXQgdGVsbCB1cyBmb3IgY2VydGFpbiB3aGV0aGVyIGEgdmVjdG9yCi0gICBpbnN0cnVjdGlvbiBvcGNvZGUgY29udGFpbnMgb25lIG9yIHR3byBpbnN0cnVjdGlvbnMuICBIb3dldmVyIHNpbmNlCi0gICBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mIHIwIGlzIGlsbGVnYWwsIHdlIGNhbiBjaGVjayBmb3Igbm9uemVybwotICAgdmFsdWVzIGluIGJvdGggZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGRzLiAgT25seSBvcGNvZGVzIHRoYXQgaGF2ZQotICAgdHdvIHZhbGlkIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgbm9uLXplcm8gaW4gYm90aCAqLwotCi0jZGVmaW5lIFRXT19JTlNOKGluc24pICgoKChpbnNuKSAmICgweDFGIDw8IDI3KSkgIT0gMCkgJiYgKCgoaW5zbikgJiAoMHgxRiA8PCAyMikpICE9IDApKQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgdmVjX29wY29kZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICp2ZWNfb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZV9lbmQ7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIG1hdGNoIGluIHRoZSBvcGNvZGVzIHRhYmxlLiAgRm9yIHZlY3RvcgotICAgICBvcGNvZGVzICh2ZWNfb3Bjb2RlICE9IE5VTEwpIGZpbmQgdGhlIGZpcnN0IG1hdGNoIHRoYXQgaXMgbm90IHRoZQotICAgICBwcmV2aW91c2x5IGZvdW5kIG1hdGNoLiAgRklYTUU6IHRoZXJlIHNob3VsZCBiZSBmYXN0ZXIgd2F5cyB0bwotICAgICBzZWFyY2ggKGhhc2ggdGFibGUgb3IgYmluYXJ5IHNlYXJjaCksIGJ1dCBkb24ndCB3b3JyeSB0b28gbXVjaAotICAgICBhYm91dCBpdCB1bnRpbCBvdGhlciBUSWM4MCBzdXBwb3J0IGlzIGZpbmlzaGVkLiAqLwotCi0gIG9wY29kZV9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIGZvciAob3Bjb2RlID0gdGljODBfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlIC0+IG1hc2spID09IG9wY29kZSAtPiBvcGNvZGUgJiYKLQkgIG9wY29kZSAhPSB2ZWNfb3Bjb2RlKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBvcGNvZGVfZW5kKQotICAgIHsKLSAgICAgIC8qIE5vIG1hdGNoIGZvdW5kLCBqdXN0IHByaW50IHRoZSBiaXRzIGFzIGEgLndvcmQgZGlyZWN0aXZlICovCi0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIud29yZCAlIzA4bHgiLCBpbnNuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNYXRjaCBmb3VuZCwgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsZW5ndGggPSBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSk7Ci0gICAgICBpZiAob3Bjb2RlIC0+IGZsYWdzICYgVElDODBfVkVDVE9SICYmIHZlY19vcGNvZGUgPT0gTlVMTCAmJiBUV09fSU5TTiAoaW5zbikpCi0JewotCSAgLyogVGhlcmUgaXMgYW5vdGhlciBpbnN0cnVjdGlvbiB0byBwcmludCBmcm9tIHRoZSBzYW1lIG9wY29kZS4KLQkgICAgIFByaW50IHRoZSBzZXBhcmF0b3IgYW5kIHRoZW4gZmluZCBhbmQgcHJpbnQgdGhlIG90aGVyCi0JICAgICBpbnN0cnVjdGlvbi4gKi8KLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiAgIHx8ICAgIik7Ci0JICBsZW5ndGggPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLS8qIEdldCB0aGUgbmV4dCAzMiBiaXQgd29yZCBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYW5kIGNvbnZlcnQgaXQKLSAgIGludG8gaW50ZXJuYWwgZm9ybWF0IGluIHRoZSB1bnNpZ25lZCBsb25nIElOU04sIGZvciB3aGljaCB3ZSBhcmUKLSAgIHBhc3NlZCB0aGUgYWRkcmVzcy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgaW50Ci1maWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNucCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBHZXQgdGhlIGJpdHMgZm9yIHRoZSBuZXh0IDMyIGJpdCB3b3JkIGFuZCBwdXQgaW4gYnVmZmVyICovCi0KLSAgc3RhdHVzID0gKCppbmZvIC0+IHJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgbGVuZ3RoLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IG1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAvKiBSZWFkIHdhcyBzdWNjZXNzZnVsLCBzbyBpbmNyZW1lbnQgY291bnQgb2YgYnl0ZXMgcmVhZCBhbmQgY29udmVydAotICAgICB0aGUgYml0cyBpbnRvIGludGVybmFsIGZvcm1hdC4gKi8KLSAgICAgCi0gIGxlbmd0aCArPSA0OwotICBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgewotICAgICAgKmluc25wID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZm8gLT4gZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHsKLSAgICAgICppbnNucCA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSBqdXN0IGRlZmF1bHQgdG8gb25lIG9yIHRoZSBvdGhlciAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0MCi1pbnQgCi1wcmludF9pbnNuX3RpYzgwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGludCBzdGF0dXM7Ci0KLSAgbGVuZ3RoID0gMDsKLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OwotICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gLTEpCi0gICAgewotICAgICAgc3RhdHVzID0gcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIE5VTEwpOwotICAgIH0KLSAgcmV0dXJuIChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1vcGMuYyBiL29wY29kZXMvdGljODAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGQwNmEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTYgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdmFyaW91cyB0YWJsZXMgZm9yIHRoZSBUTVMzMjBDODAgKE1WUCkuCi0KLSAgIFRoZSBvcGNvZGUgdGFibGUgaXMgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZAotICAgYmUgYWJsZSB0byBwdXQgaXQgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4KLQotICAgVGhlIHByZWRlZmluZWQgcmVnaXN0ZXIgdGFibGUgbWFwcyBmcm9tIHJlZ2lzdGVyIG5hbWVzIHRvIHJlZ2lzdGVyCi0gICB2YWx1ZXMuICAqLwotCi0MCi0vKiBUYWJsZSBvZiBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcywgc3VjaCBhcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLAotICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLCBjb25kaXRpb24gY29kZXMsIGNvbnRyb2wgcmVnaXN0ZXJzLCBhbmQgYml0Ci0gICBudW1iZXJzLgotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkIGNhc2UgaW5kZXBlbmRlbnRseSBieSBuYW1lIHNvIHRoYXQgaXQgaXMgc3VpdGFibGUgZm9yCi0gICBzZWFyY2hpbmcgdmlhIGEgYmluYXJ5IHNlYXJjaCB1c2luZyBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbgotICAgZnVuY3Rpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgc3ltYm9sIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdmFsdWUKLSAgIGZpZWxkLCB3aGljaCBhbGxvd3MgdGhlIHZhbHVlIGFuZCB0eXBlIHRvIGJlIHBhc3NlZCBhcm91bmQgYXMgYSB1bml0IGluIGEKLSAgIHNpbmdsZSBpbnQuICBUaGUgdHlwZXMgaGF2ZSB0byBiZSBtYXNrZWQgb2ZmIGJlZm9yZSB1c2luZyB0aGUgbnVtZXJpYwotICAgdmFsdWUgYXMgYSBudW1iZXIuCi0qLwotCi1jb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW10gPQotewotICB7ICJhMCIsCVRJQzgwX09QRVJBTkRfRlBBIHwgMCB9LAotICB7ICJhMSIsCVRJQzgwX09QRVJBTkRfRlBBIHwgMSB9LAotICB7ICJhbHcuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA3IH0sCi0gIHsgImFsdy5oIiwJVElDODBfT1BFUkFORF9DQyB8IDE1IH0sCi0gIHsgImFsdy53IiwJVElDODBfT1BFUkFORF9DQyB8IDIzIH0sCi0gIHsgIkFOQVNUQVQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzNCB9LAotICB7ICJCUksxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzkgfSwKLSAgeyAiQlJLMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDNBIH0sCi0gIHsgIkNPTkZJRyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAyIH0sCi0gIHsgIkRMUlUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg1MDAgfSwKLSAgeyAiRFRBRzAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAgfSwKLSAgeyAiRFRBRzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDEgfSwKLSAgeyAiRFRBRzEwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBBIH0sCi0gIHsgIkRUQUcxMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQiB9LAotICB7ICJEVEFHMTIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEMgfSwKLSAgeyAiRFRBRzEzIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBEIH0sCi0gIHsgIkRUQUcxNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRSB9LAotICB7ICJEVEFHMTUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEYgfSwKLSAgeyAiRFRBRzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDIgfSwKLSAgeyAiRFRBRzMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDMgfSwKLSAgeyAiRFRBRzQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDQgfSwKLSAgeyAiRFRBRzUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDUgfSwKLSAgeyAiRFRBRzYiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDYgfSwKLSAgeyAiRFRBRzciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDcgfSwKLSAgeyAiRFRBRzgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDggfSwKLSAgeyAiRFRBRzkiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDkgfSwKLSAgeyAiRUNPTUNOVEwiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMyB9LAotICB7ICJFSVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMSB9LAotICB7ICJFUEMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMCB9LAotICB7ICJlcS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMCB9LAotICB7ICJlcS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjAgfSwKLSAgeyAiZXEuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEwIH0sCi0gIHsgImVxLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMCB9LAotICB7ICJlcTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyIH0sCi0gIHsgImVxMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEwIH0sCi0gIHsgImVxMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE4IH0sCi0gIHsgIkZMVEFEUiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDExIH0sCi0gIHsgIkZMVERUSCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDE0IH0sCi0gIHsgIkZMVERUTCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEzIH0sCi0gIHsgIkZMVE9QIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTAgfSwKLSAgeyAiRkxUVEFHIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTIgfSwKLSAgeyAiRlBTVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCA4IH0sCi0gIHsgImdlLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA1IH0sCi0gIHsgImdlLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNSB9LAotICB7ICJnZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTUgfSwKLSAgeyAiZ2UudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI1IH0sCi0gIHsgImdlMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDMgfSwKLSAgeyAiZ2UwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTEgfSwKLSAgeyAiZ2UwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTkgfSwKLSAgeyAiZ3QuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIgfSwKLSAgeyAiZ3QuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIyIH0sCi0gIHsgImd0LmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMiB9LAotICB7ICJndC53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjIgfSwKLSAgeyAiZ3QwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMSB9LAotICB7ICJndDAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCA5IH0sCi0gIHsgImd0MC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE3IH0sCi0gIHsgImhpLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA2IH0sCi0gIHsgImhpLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNiB9LAotICB7ICJoaS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjYgfSwKLSAgeyAiaHMuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDkgfSwKLSAgeyAiaHMuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE5IH0sCi0gIHsgImhzLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOSB9LAotICB7ICJpYi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjggfSwKLSAgeyAiSUUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgNiB9LAotICB7ICJJTFJVIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzAwIH0sCi0gIHsgImluLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNyB9LAotICB7ICJJTjBQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMCB9LAotICB7ICJJTjFQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMSB9LAotICB7ICJJTlRQRU4iLAlUSUM4MF9PUEVSQU5EX0NSIHwgNCB9LAotICB7ICJJVEFHMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMCB9LAotICB7ICJJVEFHMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMSB9LAotICB7ICJJVEFHMTAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEEgfSwKLSAgeyAiSVRBRzExIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBCIH0sCi0gIHsgIklUQUcxMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQyB9LAotICB7ICJJVEFHMTMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEQgfSwKLSAgeyAiSVRBRzE0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBFIH0sCi0gIHsgIklUQUcxNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRiB9LAotICB7ICJJVEFHMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMiB9LAotICB7ICJJVEFHMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMyB9LAotICB7ICJJVEFHNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNCB9LAotICB7ICJJVEFHNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNSB9LAotICB7ICJJVEFHNiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNiB9LAotICB7ICJJVEFHNyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNyB9LAotICB7ICJJVEFHOCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwOCB9LAotICB7ICJJVEFHOSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwOSB9LAotICB7ICJsZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMyB9LAotICB7ICJsZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjMgfSwKLSAgeyAibGUuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEzIH0sCi0gIHsgImxlLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMyB9LAotICB7ICJsZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA2IH0sCi0gIHsgImxlMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDE0IH0sCi0gIHsgImxlMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIyIH0sCi0gIHsgImxvLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA4IH0sCi0gIHsgImxvLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxOCB9LAotICB7ICJsby53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjggfSwKLSAgeyAibHMuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDcgfSwKLSAgeyAibHMuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE3IH0sCi0gIHsgImxzLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNyB9LAotICB7ICJsdC5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNCB9LAotICB7ICJsdC5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjQgfSwKLSAgeyAibHQuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE0IH0sCi0gIHsgImx0LnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNCB9LAotICB7ICJsdDAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA0IH0sCi0gIHsgImx0MC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEyIH0sCi0gIHsgImx0MC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIwIH0sCi0gIHsgIk1JUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMxIH0sCi0gIHsgIk1QQyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMwIH0sCi0gIHsgIm5lLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxIH0sCi0gIHsgIm5lLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMSB9LAotICB7ICJuZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTEgfSwKLSAgeyAibmUudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIxIH0sCi0gIHsgIm5lMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDUgfSwKLSAgeyAibmUwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTMgfSwKLSAgeyAibmUwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjEgfSwKLSAgeyAibmV2LmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMCB9LAotICB7ICJuZXYuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCA4IH0sCi0gIHsgIm5ldi53IiwJVElDODBfT1BFUkFORF9DQyB8IDE2IH0sCi0gIHsgIm9iLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOSB9LAotICB7ICJvci5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMzEgfSwKLSAgeyAib3UuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI2IH0sCi0gIHsgIk9VVFAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAyIH0sCi0gIHsgIlBLVFJFUSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEQgfSwKLSAgeyAiUFBFUlJPUiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEEgfSwKLSAgeyAicjAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDAgfSwKLSAgeyAicjEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEgfSwKLSAgeyAicjEwIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMCB9LAotICB7ICJyMTEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDExIH0sCi0gIHsgInIxMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTIgfSwKLSAgeyAicjEzIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMyB9LAotICB7ICJyMTQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE0IH0sCi0gIHsgInIxNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTUgfSwKLSAgeyAicjE2IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNiB9LAotICB7ICJyMTciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE3IH0sCi0gIHsgInIxOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTggfSwKLSAgeyAicjE5IiwJVElDODBfT1BFUkFORF9HUFIgfCAxOSB9LAotICB7ICJyMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMiB9LAotICB7ICJyMjAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIwIH0sCi0gIHsgInIyMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjEgfSwKLSAgeyAicjIyIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMiB9LAotICB7ICJyMjMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIzIH0sCi0gIHsgInIyNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjQgfSwKLSAgeyAicjI1IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNSB9LAotICB7ICJyMjYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI2IH0sCi0gIHsgInIyNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjcgfSwKLSAgeyAicjI4IiwJVElDODBfT1BFUkFORF9HUFIgfCAyOCB9LAotICB7ICJyMjkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI5IH0sCi0gIHsgInIzIiwJVElDODBfT1BFUkFORF9HUFIgfCAzIH0sCi0gIHsgInIzMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMzAgfSwKLSAgeyAicjMxIiwJVElDODBfT1BFUkFORF9HUFIgfCAzMSB9LAotICB7ICJyNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNCB9LAotICB7ICJyNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNSB9LAotICB7ICJyNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNiB9LAotICB7ICJyNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNyB9LAotICB7ICJyOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgOCB9LAotICB7ICJyOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgOSB9LAotICB7ICJTWVNTVEsiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMCB9LAotICB7ICJTWVNUTVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMSB9LAotICB7ICJUQ09VTlQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhFIH0sCi0gIHsgIlRTQ0FMRSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEYgfSwKLSAgeyAidW8uZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMwIH0sCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyA9IHNpemVvZiAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKSAvIHNpemVvZiAoc3RydWN0IHByZWRlZmluZWRfc3ltYm9sKTsKLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHByZWRlZmluZWQgc3ltYm9sIG5hbWUgaW4gTkFNRSwgc3ltYm9sIGNsYXNzCi0gICBpbiBDTEFTUywgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gYSBudW1lcmljIHZhbHVlLCB3aGljaCBpdCByZXR1cm5zLgotCi0gICBJZiBDTEFTUyBpcyB6ZXJvLCBhbnkgc3ltYm9sIHRoYXQgbWF0Y2hlcyBOQU1FIGlzIHRyYW5zbGF0ZWQuICBJZgotICAgQ0xBU1MgaXMgbm9uLXplcm8sIHRoZW4gb25seSBhIHN5bWJvbCB0aGF0IGhhcyBjbGFzcyBDTEFTUyBpcwotICAgbWF0Y2hlZC4KLQotICAgSWYgbm8gdHJhbnNsYXRpb24gaXMgcG9zc2libGUsIGl0IHJldHVybnMgLTEsIGEgdmFsdWUgbm90IHVzZWQgYnkKLSAgIGFueSBwcmVkZWZpbmVkIHN5bWJvbC4gTm90ZSB0aGF0IHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBhcnJheSBpcwotICAgcHJlc29ydGVkIGNhc2UgaW5kZXBlbmRlbnRseSBieSBuYW1lLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGVyZSBhcmUgbm8KLSAgIGR1cGxpY2F0ZSBuYW1lcyBpbiB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgYXJyYXksIHdoaWNoIGhhcHBlbnMgdG8gYmUKLSAgIHRydWUgYXQgdGhlIG1vbWVudC4KLQotICovCi0KLWludAotdGljODBfc3ltYm9sX3RvX3ZhbHVlIChuYW1lLCBjbGFzcykKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNsYXNzOwotewotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGludCBsb3cgPSAwOwotICBpbnQgbWlkZGxlOwotICBpbnQgaGlnaCA9IHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgLSAxOwotICBpbnQgY21wOwotICBpbnQgcnRudmFsID0gLTE7Ci0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKQotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCXsKLQkgIGhpZ2ggPSBtaWRkbGUgLSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JewotCSAgbG93ID0gbWlkZGxlICsgMTsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHBkc3AgPSAmdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW21pZGRsZV07Ci0JICBpZiAoKGNsYXNzID09IDApIHx8IChjbGFzcyAmIFBEU19WQUxVRSAocGRzcCkpKQotCSAgICB7Ci0JICAgICAgcnRudmFsID0gUERTX1ZBTFVFIChwZHNwKTsKLQkgICAgfQotCSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIG5hbWVzICovCi0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2YWx1ZSBWQUwgYW5kIGZpbmRzIGEgbWF0Y2hpbmcgcHJlZGVmaW5lZAotICAgc3ltYm9sIHRoYXQgaXMgaW4gdGhlIG9wZXJhbmQgY2xhc3Mgc3BlY2lmaWVkIGJ5IENMQVNTLiAgSWYgQ0xBU1MKLSAgIGlzIHplcm8sIHRoZSBmaXJzdCBtYXRjaGluZyBzeW1ib2wgaXMgcmV0dXJuZWQuICovCi0KLWNvbnN0IGNoYXIgKgotdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWwsIGNsYXNzKQotICAgICBpbnQgdmFsOwotICAgICBpbnQgY2xhc3M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLSAgaW50IGl2YWw7Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IE5VTEw7Ci0gIGZvciAocGRzcCA9IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICAgICBwZHNwIDwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICsgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICAgICBwZHNwKyspCi0gICAgewotICAgICAgaXZhbCA9IFBEU19WQUxVRSAocGRzcCkgJiB+VElDODBfT1BFUkFORF9NQVNLOwotICAgICAgaWYgKGl2YWwgPT0gdmFsKQotCXsKLQkgIGlmICgoY2xhc3MgPT0gMCkgfHwgKGNsYXNzICYgUERTX1ZBTFVFIChwZHNwKSkpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCB0aGUgZGVzaXJlZCBtYXRjaCAqLwotCSAgICAgIG5hbWUgPSBQRFNfTkFNRSAocGRzcCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKG5hbWUpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN5bWJvbCBpbiB0aGUgcHJlZGVmaW5lZAotICAgc3ltYm9sIHRhYmxlIGFmdGVyIFBEU1AsIG9yIE5VTEwgaWYgUERTUCBwb2ludHMgdG8gdGhlIGxhc3Qgc3ltYm9sLiAgSWYKLSAgIFBEU1AgaXMgTlVMTCwgaXQgcmV0dXJucyB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSB0YWJsZS4gIFRodXMgaXQgY2FuIGJlCi0gICB1c2VkIHRvIHdhbGsgdGhyb3VnaCB0aGUgdGFibGUgYnkgZmlyc3QgY2FsbGluZyBpdCB3aXRoIE5VTEwgYW5kIHRoZW4KLSAgIGNhbGxpbmcgaXQgd2l0aCBlYWNoIHZhbHVlIGl0IHJldHVybmVkIG9uIHRoZSBwcmV2aW91cyBjYWxsLCB1bnRpbCBpdAotICAgcmV0dXJucyBOVUxMLiAqLwotCi1jb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKgotdGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCAocGRzcCkKLSAgICAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotewotICBpZiAocGRzcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBkc3AgPSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgfQotICBlbHNlIGlmIChwZHNwID49IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyAmJgotCSAgIHBkc3AgPCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgKyB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzIC0gMSkKLSAgICB7Ci0gICAgICBwZHNwKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGRzcCA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gKHBkc3ApOwotfQotCi0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZS4gIFRoZSBmaWVsZHMgYXJlOgotCi0JYml0cywgc2hpZnQsIGluc2VydGlvbiBmdW5jdGlvbiwgZXh0cmFjdGlvbiBmdW5jdGlvbiwgZmxhZ3MKLSAqLwotCi1jb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCB0aWM4MF9vcGVyYW5kc1tdID0KLXsKLQotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuICAqLwotCi0jZGVmaW5lIFVOVVNFRCAoMCkKLSAgeyAwLCAwLCAwLCAwLCAwIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBpbiBiaXRzIDE0LTAuICovCi0KLSNkZWZpbmUgU1NJIChVTlVTRUQgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFNob3J0IHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBTVUkgKFNTSSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBTaG9ydCB1bnNpZ25lZCBiaXRmaWVsZCBpbiBiaXRzIDE0LTAuICBXZSBkaXN0aW5ndWlzaCB0aGlzCi0gICAgIGZyb20gYSByZWd1bGFyIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBvbmx5IGZvciB0aGUgY29udmVuaWVuY2UKLSAgICAgb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdGhlIHVzZXIuICovCi0KLSNkZWZpbmUgU1VCRiAoU1VJICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVRGSUVMRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBMU0kgKFNVQkYgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgdW5zaWduZWQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIExVSSAoTFNJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIExvbmcgdW5zaWduZWQgYml0ZmllbGQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkLiAgV2UgZGlzdGluZ3Vpc2gKLSAgICAgdGhpcyBmcm9tIGEgcmVndWxhciB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgb25seSBmb3IgdGhlCi0gICAgIGNvbnZlbmllbmNlIG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB1c2VyLiAqLwotCi0jZGVmaW5lIExVQkYgKExVSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklURklFTEQgfSwKLQotICAvKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0Ci0gICAgIHdvcmQuICovCi0KLSNkZWZpbmUgU1BGSSAoTFVCRiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRkxPQVQgfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDQtMCAqLwotCi0jZGVmaW5lIFJFR18wIChTUEZJICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyA0LTAgKi8KLQotI2RlZmluZSBSRUdfMF9FIChSRUdfMCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDI2LTIyICovCi0KLSNkZWZpbmUgUkVHXzIyIChSRUdfMF9FICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIgKi8KLQotI2RlZmluZSBSRUdfMjJfRSAoUkVHXzIyICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgUkVHX0RFU1QgKFJFR18yMl9FICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBSRUdfREVTVF9FIChSRUdfREVTVCArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXIgKGEwLWEzKSBzcGVjaWZpZWQgYnkgYml0IDE2IChNU0IpCi0gICAgIGFuZCBiaXQgMTEgKExTQikgKi8KLSAgLyogRklYTUUhICBOZWVkcyB0byB1c2UgZnVuY3Rpb25zIHRvIGluc2VydCBhbmQgZXh0cmFjdCB0aGUgcmVnaXN0ZXIKLSAgICAgbnVtYmVyIGluIGJpdHMgMTYgYW5kIDExLiAqLwotCi0jZGVmaW5lIFJFR19GUEEgKFJFR19ERVNUX0UgKyAxKQotICB7IDAsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRlBBIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIFBDIHdvcmQgb2Zmc2V0IGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIE9GRl9TU19QQyAoUkVHX0ZQQSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfUENSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIFBDIHdvcmQgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIE9GRl9TTF9QQyAoT0ZGX1NTX1BDICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9QQ1JFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgT0ZGX1NTX0JSIChPRkZfU0xfUEMgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgT0ZGX1NMX0JSIChPRkZfU1NfQlIgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkCi0gICAgIHdpdGggb3B0aW9uYWwgIjpzIiBtb2RpZmllciBmbGFnIGluIGJpdCAxMSAqLwotCi0jZGVmaW5lIE9GRl9TTF9CUl9TQ0FMRUQgKE9GRl9TTF9CUiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIHwgVElDODBfT1BFUkFORF9TQ0FMRUQgfSwKLQotICAvKiBCSVROVU0gaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIEJJVE5VTSAoT0ZGX1NMX0JSX1NDQUxFRCArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklUTlVNIH0sCi0KLSAgLyogQ29uZGl0aW9uIGNvZGUgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIENDIChCSVROVU0gKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NDIH0sCi0KLSAgLyogQ29udHJvbCByZWdpc3RlciBudW1iZXIgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgQ1JfU0kgKENDICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DUiB9LAotCi0gIC8qIENvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyIGluIG5leHQgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBDUl9MSSAoQ1JfU0kgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NSIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucyAqLwotCi0jZGVmaW5lIFJFR19CQVNFIChDUl9MSSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zLCB3aXRoIG9wdGlvbmFsICI6bSIKLSAgICAgZmxhZyBpbiBiaXQgMTcgKHNob3J0IGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seSkgKi8KLQotI2RlZmluZSBSRUdfQkFTRV9NX1NJIChSRUdfQkFTRSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfCBUSUM4MF9PUEVSQU5EX01fU0kgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zLCB3aXRoIG9wdGlvbmFsICI6bSIKLSAgIGZsYWcgaW4gYml0IDE1IChsb25nIGltbWVkaWF0ZSBhbmQgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zIG9ubHkpICovCi0KLSNkZWZpbmUgUkVHX0JBU0VfTV9MSSAoUkVHX0JBU0VfTV9TSSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfCBUSUM4MF9PUEVSQU5EX01fTEkgfSwKLQotICAvKiBTY2FsZWQgcmVnaXN0ZXIgaW4gYml0cyA0LTAsIHdpdGggb3B0aW9uYWwgIjpzIiBtb2RpZmllciBmbGFnIGluIGJpdCAxMSAqLwotCi0jZGVmaW5lIFJFR19TQ0FMRUQgKFJFR19CQVNFX01fTEkgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9TQ0FMRUQgfSwKLQotICAvKiBVbnNpZ25lZCBpbW1lZGlhdGUgaW4gYml0cyA0LTAsIHVzZWQgb25seSBmb3Igc2hpZnQgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgUk9UQVRFIChSRUdfU0NBTEVEICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogVW5zaWduZWQgaW1tZWRpYXRlIGluIGJpdHMgOS01LCB1c2VkIG9ubHkgZm9yIHNoaWZ0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFTkRNQVNLIChST1RBVEUgKyAxKQotICB7IDUsIDUsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRU5ETUFTSyB9LAotCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX29wZXJhbmRzID0gc2l6ZW9mICh0aWM4MF9vcGVyYW5kcykvc2l6ZW9mKCp0aWM4MF9vcGVyYW5kcyk7Ci0KLQwKLS8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIGVudHJpZXMgZm9yIHRoZSBvcGNvZGVzIHRhYmxlLiAqLwotCi0jZGVmaW5lIEZJWE1FIDAKLQotLyogU2hvcnQtSW1tZWRpYXRlIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfU0koeCkJKCgoeCkgJiAweDdGKSA8PCAxNSkKLSNkZWZpbmUgTUFTS19TSQkJT1BfU0koMHg3RikKLQotLyogTG9uZy1JbW1lZGlhdGUgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9MSSh4KQkoKCh4KSAmIDB4M0ZGKSA8PCAxMikKLSNkZWZpbmUgTUFTS19MSQkJT1BfTEkoMHgzRkYpCi0KLS8qIFJlZ2lzdGVyIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfUkVHKHgpCU9QX0xJKHgpCS8qIEZvciByZWFkYWJpbGl0eSAqLwotI2RlZmluZSBNQVNLX1JFRwlNQVNLX0xJCQkvKiBGb3IgcmVhZGFiaWxpdHkgKi8KLQotLyogVGhlICduJyBiaXQgYXQgYml0IDEwICovCi0jZGVmaW5lIG4oeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnaScgYml0IGF0IGJpdCAxMSAqLwotI2RlZmluZSBpKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ0YnIGJpdCBhdCBiaXQgMjcgKi8KLSNkZWZpbmUgRih4KQkJKCh4KSA8PCAyNykKLQotLyogVGhlICdFJyBiaXQgYXQgYml0IDI3ICovCi0jZGVmaW5lIEUoeCkJCSgoeCkgPDwgMjcpCi0KLS8qIFRoZSAnTScgYml0IGF0IGJpdCAxNSBpbiByZWdpc3RlciBhbmQgbG9uZyBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBNX1JFRyh4KQkoKHgpIDw8IDE1KQotI2RlZmluZSBNX0xJKHgpCQkoKHgpIDw8IDE1KQotCi0vKiBUaGUgJ00nIGJpdCBhdCBiaXQgMTcgaW4gc2hvcnQgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgTV9TSSh4KQkJKCh4KSA8PCAxNykKLQotLyogVGhlICdTWicgZmllbGQgYXQgYml0cyAxNC0xMyBpbiByZWdpc3RlciBhbmQgbG9uZyBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBTWl9SRUcoeCkJKCh4KSA8PCAxMykKLSNkZWZpbmUgU1pfTEkoeCkJKCh4KSA8PCAxMykKLQotLyogVGhlICdTWicgZmllbGQgYXQgYml0cyAxNi0xNSBpbiBzaG9ydCBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBTWl9TSSh4KQkoKHgpIDw8IDE1KQotCi0vKiBUaGUgJ0QnIChkaXJlY3QgZXh0ZXJuYWwgbWVtb3J5IGFjY2VzcykgYml0IGF0IGJpdCAxMCBpbiBsb25nIGltbWVkaWF0ZQotICAgYW5kIHJlZ2lzdGVyIG9wY29kZXMuICovCi0jZGVmaW5lIEQoeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnUycgKHNjYWxlIG9mZnNldCBieSBkYXRhIHNpemUpIGJpdCBhdCBiaXQgMTEgaW4gbG9uZyBpbW1lZGlhdGUKLSAgIGFuZCByZWdpc3RlciBvcGNvZGVzLiAqLwotI2RlZmluZSBTKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ1BEJyBmaWVsZCBhdCBiaXRzIDEwLTkgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBEKHgpCQkoKHgpIDw8IDkpCi0KLS8qIFRoZSAnUDInIGZpZWxkIGF0IGJpdHMgOC03IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQMih4KQkJKCh4KSA8PCA3KQotCi0vKiBUaGUgJ1AxJyBmaWVsZCBhdCBiaXRzIDYtNSBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUDEoeCkJCSgoeCkgPDwgNSkKLQotLyogVGhlICdhJyBmaWVsZCBhdCBiaXQgMTYgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX2ExKHgpCQkoKHgpIDw8IDE2KQotCi0vKiBUaGUgJ2EnIGZpZWxkIGF0IGJpdCAxMSBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfYTAoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnbScgZmllbGQgYXQgYml0IDEwIGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9tKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ1MnIGZpZWxkIGF0IGJpdCA5IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9TKHgpCQkoKHgpIDw8IDkpCi0KLS8qIFRoZSAnWicgZmllbGQgYXQgYml0IDggaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX1ooeCkJCSgoeCkgPDwgOCkKLQotLyogVGhlICdwJyBmaWVsZCBhdCBiaXQgNiBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfcCh4KQkJKCh4KSA8PCA2KQotCi0vKiBUaGUgb3Bjb2RlIGZpZWxkIGF0IGJpdHMgMjEtMTcgZm9yIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgT1BfVih4KQkJKCh4KSA8PCAxNykKLSNkZWZpbmUgTUFTS19WCQlPUF9WKDB4MUYpCi0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuICBGb3JtYXR0ZWQgZm9yIGJldHRlciByZWFkYWJpbGl0eSBvbiBhIHdpZGUgc2NyZWVuLiAgQWxzbywgYWxsCi0gZW50cmllcyB3aXRoIHRoZSBzYW1lIG1uZW1vbmljIGFyZSBzb3J0ZWQgc28gdGhhdCB0aGV5IGFyZSBhZGphY2VudCBpbiB0aGUgdGFibGUsCi0gYWxsb3dpbmcgdGhlIHVzZSBvZiBhIGhhc2ggdGFibGUgdG8gbG9jYXRlIHRoZSBmaXJzdCBvZiBhIHNlcXVlbmNlIG9mIG9wY29kZXMgdGhhdCBoYXZlCi0gYSBwYXJ0aWN1bGFyIG5hbWUuICBUaGUgc2hvcnQgaW1tZWRpYXRlIGZvcm1zIGFsc28gY29tZSBiZWZvcmUgdGhlIGxvbmcgaW1tZWRpYXRlIGZvcm1zCi0gc28gdGhhdCB0aGUgYXNzZW1ibGVyIHdpbGwgcGljayB0aGUgImJlc3QgZml0IiBmb3IgdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQsIGV4Y2VwdCBmb3IKLSB0aGUgY2FzZSBvZiB0aGUgUEMgcmVsYXRpdmUgZm9ybXMsIHdoZXJlIHRoZSBsb25nIGZvcm1zIGNvbWUgZmlyc3QgYW5kIGFyZSB0aGUgZGVmYXVsdAotIGZvcm1zLiAqLwotCi1jb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlIHRpYzgwX29wY29kZXNbXSA9IHsKLQotICAvKiBUaGUgIm5vcCIgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5ICJyZGNyIDAscjAiLiAgV2UgcHV0IGl0IGZpcnN0IHNvIHRoYXQgdGhpcwotICAgICBzcGVjaWZpYyBiaXQgcGF0dGVybiB3aWxsIGdldCBkaXNhc3NlbWJsZWQgYXMgYSBub3AgcmF0aGVyIHRoYW4gYW4gcmRjci4gVGhlCi0gICAgIG1hc2sgb2YgYWxsIG9uZXMgZW5zdXJlcyB0aGF0IHRoaXMgd2lsbCBoYXBwZW4uICovCi0KLSAgeyJub3AiLAlPUF9TSSgweDQpLAl+MCwJCTAsCQl7MH0JCQl9LAotCi0gIC8qIFRoZSAiYnIiIGluc3RydWN0aW9uIGlzIHJlYWxseSAiYmJ6IHRhcmdldCxyMCwzMSIuICBXZSBwdXQgaXQgZmlyc3Qgc28gdGhhdAotICAgICB0aGlzIHNwZWNpZmljIGJpdCBwYXR0ZXJuIHdpbGwgZ2V0IGRpc2Fzc2VtYmxlZCBhcyBhIGJyIHJhdGhlciB0aGFuIGJiei4gKi8KLQotICB7ImJyIiwJT1BfU0koMHg0OCksCTB4RkZGRjgwMDAsCTAsCXtPRkZfU1NfUEN9CX0sCi0gIHsiYnIiLAlPUF9MSSgweDM5MSksCTB4RkZGRkYwMDAsCTAsCXtPRkZfU0xfUEN9CX0sCi0gIHsiYnIiLAlPUF9SRUcoMHgzOTApLAkweEZGRkZGMDAwLAkwLAl7UkVHXzB9CQl9LAotICB7ImJyLmEiLAlPUF9TSSgweDQ5KSwJMHhGRkZGODAwMCwJMCwJe09GRl9TU19QQ30JfSwKLSAgeyJici5hIiwJT1BfTEkoMHgzOTMpLAkweEZGRkZGMDAwLAkwLAl7T0ZGX1NMX1BDfQl9LAotICB7ImJyLmEiLAlPUF9SRUcoMHgzOTIpLAkweEZGRkZGMDAwLAkwLAl7UkVHXzB9CQl9LAotCi0gIC8qIFNpZ25lZCBpbnRlZ2VyIEFERCAqLwotCi0gIHsiYWRkIiwJT1BfU0koMHg1OCksCU1BU0tfU0ksCTAsCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZCIsCU9QX0xJKDB4M0IxKSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkIiwJT1BfUkVHKDB4M0IwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBVbnNpZ25lZCBpbnRlZ2VyIEFERCAqLwotCi0gIHsiYWRkdSIsCU9QX1NJKDB4NTkpLAlNQVNLX1NJLAkwLAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGR1IiwJT1BfTEkoMHgzQjMpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGR1IiwJT1BfUkVHKDB4M0IyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCAqLwotCi0gIHsiYW5kIiwJT1BfU0koMHgxMSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZCIsCU9QX0xJKDB4MzIzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kIiwJT1BfUkVHKDB4MzIyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9TSSgweDExKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfTEkoMHgzMjMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9SRUcoMHgzMjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIGJvdGggc291cmNlcyAqLwotCi0gIHsiYW5kLmZmIiwJT1BfU0koMHgxOCksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mZiIsCU9QX0xJKDB4MzMxKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZmIiwJT1BfUkVHKDB4MzMwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBzb3VyY2UgMSAqLwotCi0gIHsiYW5kLmZ0IiwJT1BfU0koMHgxNCksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mdCIsCU9QX0xJKDB4MzI5KSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZ0IiwJT1BfUkVHKDB4MzI4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBzb3VyY2UgMiAqLwotCi0gIHsiYW5kLnRmIiwJT1BfU0koMHgxMiksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50ZiIsCU9QX0xJKDB4MzI1KSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnRmIiwJT1BfUkVHKDB4MzI0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCcmFuY2ggQml0IE9uZSAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiYm8iLAlPUF9TSSgweDRBKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJibyIsCU9QX0xJKDB4Mzk1KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJibyIsCU9QX1JFRygweDM5NCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IE9uZSAtIGFubnVsbGVkICovCi0KLSAgeyJiYm8uYSIsCU9QX1NJKDB4NEIpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvLmEiLAlPUF9MSSgweDM5NyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8uYSIsCU9QX1JFRygweDM5NiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IFplcm8gLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmJ6IiwJT1BfU0koMHg0OCksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnoiLAlPUF9MSSgweDM5MSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnoiLAlPUF9SRUcoMHgzOTApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBaZXJvIC0gYW5udWxsZWQgKi8KLQotICB7ImJiei5hIiwJT1BfU0koMHg0OSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnouYSIsCU9QX0xJKDB4MzkzKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiei5hIiwJT1BfUkVHKDB4MzkyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBDb25kaXRpb25hbCAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiY25kIiwJT1BfU0koMHg0QyksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQiLAlPUF9MSSgweDM5OSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQiLAlPUF9SRUcoMHgzOTgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIENDfQl9LAotCi0gIC8qIEJyYW5jaCBDb25kaXRpb25hbCAtIGFubnVsbGVkICovCi0KLSAgeyJiY25kLmEiLAlPUF9TSSgweDREKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZC5hIiwJT1BfTEkoMHgzOUIpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kLmEiLAlPUF9SRUcoMHgzOUEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIENDfQl9LAotCi0gIC8qIEJyYW5jaCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJicmNyIiwJT1BfU0koMHg2KSwJTUFTS19TSSwJMCwJe0NSX1NJfQl9LAotICB7ImJyY3IiLAlPUF9MSSgweDMwRCksCU1BU0tfTEksCTAsCXtDUl9MSX0JfSwKLSAgeyJicmNyIiwJT1BfUkVHKDB4MzBDKSwJTUFTS19SRUcsCTAsCXtSRUdfMH0JfSwKLQotICAvKiBCcmFuY2ggYW5kIHNhdmUgcmV0dXJuIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJzciIsCU9QX1NJKDB4NDApLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IiLAlPUF9MSSgweDM4MSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IiLAlPUF9SRUcoMHgzODApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBCcmFuY2ggYW5kIHNhdmUgcmV0dXJuIC0gYW5udWxsZWQgKi8KLQotICB7ImJzci5hIiwJT1BfU0koMHg0MSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IuYSIsCU9QX0xJKDB4MzgzKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzci5hIiwJT1BfUkVHKDB4MzgyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2VuZCBjb21tYW5kICovCi0KLSAgeyJjbW5kIiwJT1BfU0koMHgyKSwJTUFTS19TSSwJMCwgCXtTVUl9CX0sCi0gIHsiY21uZCIsCU9QX0xJKDB4MzA1KSwJTUFTS19MSSwJMCwgCXtMVUl9CX0sCi0gIHsiY21uZCIsCU9QX1JFRygweDMwNCksCU1BU0tfUkVHLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogSW50ZWdlciBjb21wYXJlICovCi0KLSAgeyJjbXAiLAlPUF9TSSgweDUwKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImNtcCIsCU9QX0xJKDB4M0ExKSwJTUFTS19MSSwJMCwgCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImNtcCIsCU9QX1JFRygweDNBMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmx1c2ggZGF0YSBjYWNoZSBzdWJibG9jayAtIGRvbid0IGNsZWFyIHN1YmJsb2NrIHByZXNldCBmbGFnICovCi0KLSAgeyJkY2FjaGVjIiwJT1BfU0koMHgzOCksCUYoMSkgfCAoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkJMCwge1NTSSwgUkVHX0JBU0VfTV9TSX0JCX0sCi0gIHsiZGNhY2hlYyIsCU9QX0xJKDB4MzcxKSwJRigxKSB8IChNQVNLX0xJICAmIH5NX0xJKDEpKSAgfCBTKDEpIHwgRCgxKSwJMCwge0xTSSwgUkVHX0JBU0VfTV9MSX0JCX0sCi0gIHsiZGNhY2hlYyIsCU9QX1JFRygweDM3MCksCUYoMSkgfCAoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgUygxKSB8IEQoMSksCTAsIHtSRUdfMCwgUkVHX0JBU0VfTV9MSX0JfSwKLQotICAvKiBGbHVzaCBkYXRhIGNhY2hlIHN1YmJsb2NrIC0gY2xlYXIgc3ViYmxvY2sgcHJlc2V0IGZsYWcgKi8KLQotICB7ImRjYWNoZWYiLAlPUF9TSSgweDM4KSAgIHwgRigxKSwJRigxKSB8IChNQVNLX1NJICAmIH5NX1NJKDEpKSwJCQkwLCB7U1NJLCBSRUdfQkFTRV9NX1NJfQkJfSwKLSAgeyJkY2FjaGVmIiwJT1BfTEkoMHgzNzEpICB8IEYoMSksCUYoMSkgfCAoTUFTS19MSSAgJiB+TV9MSSgxKSkgICB8IFMoMSkgfCBEKDEpLAkwLCB7TFNJLCBSRUdfQkFTRV9NX0xJfQkJfSwKLSAgeyJkY2FjaGVmIiwJT1BfUkVHKDB4MzcwKSB8IEYoMSksCUYoMSkgfCAoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgUygxKSB8IEQoMSksCTAsIHtSRUdfMCwgUkVHX0JBU0VfTV9MSX0JfSwKLQotICAvKiBEaXJlY3QgbG9hZCBzaWduZWQgZGF0YSBpbnRvIHJlZ2lzdGVyICovCi0KLSAgeyJkbGQiLAlPUF9MSSgweDM0NSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQiLAlPUF9SRUcoMHgzNDQpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLmIiLAlPUF9MSSgweDM0MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQuYiIsCU9QX1JFRygweDM0MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQuZCIsCU9QX0xJKDB4MzQ3KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsiZGxkLmQiLAlPUF9SRUcoMHgzNDYpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJkbGQuaCIsCU9QX0xJKDB4MzQzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC5oIiwJT1BfUkVHKDB4MzQyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIERpcmVjdCBsb2FkIHVuc2lnbmVkIGRhdGEgaW50byByZWdpc3RlciAqLwotCi0gIHsiZGxkLnViIiwJT1BfTEkoMHgzNTEpICB8IEQoMSksCShNQVNLX0xJICAmICB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC51YiIsCU9QX1JFRygweDM1MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpICB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLnVoIiwJT1BfTEkoMHgzNTMpICB8IEQoMSksCShNQVNLX0xJICAmICB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC51aCIsCU9QX1JFRygweDM1MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpICB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRGlyZWN0IHN0b3JlIGRhdGEgaW50byBtZW1vcnkgKi8KLQotICB7ImRzdCIsCU9QX0xJKDB4MzY1KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdCIsCU9QX1JFRygweDM2NCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkc3QuYiIsCU9QX0xJKDB4MzYxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdC5iIiwJT1BfUkVHKDB4MzYwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRzdC5kIiwJT1BfTEkoMHgzNjcpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJkc3QuZCIsCU9QX1JFRygweDM2NikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImRzdC5oIiwJT1BfTEkoMHgzNjMpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0LmgiLAlPUF9SRUcoMHgzNjIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRW11bGF0aW9uIHN0b3AgKi8KLQotICB7ImVzdG9wIiwJT1BfTEkoMHgzRkMpLAlNQVNLX0xJLAkwLAkJezB9CX0sCi0KLSAgLyogRW11bGF0aW9uIHRyYXAgKi8KLQotICB7ImV0cmFwIiwJT1BfU0koMHgxKSAgICB8IEUoMSksCU1BU0tfU0kgIHwgRSgxKSwJMCwJe1NVSX0JfSwKLSAgeyJldHJhcCIsCU9QX0xJKDB4MzAzKSAgfCBFKDEpLAlNQVNLX0xJICB8IEUoMSksCTAsCXtMVUl9CX0sCi0gIHsiZXRyYXAiLAlPUF9SRUcoMHgzMDIpIHwgRSgxKSwJTUFTS19SRUcgfCBFKDEpLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogRmxvYXRpbmctcG9pbnQgYWRkaXRpb24gKi8KLQotICB7ImZhZGQuZGRkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5kc2QiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zZGQiLAlPUF9MSSgweDNFMSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNkZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzZCIsCU9QX0xJKDB4M0UxKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc3MiLAlPUF9MSSgweDNFMSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZhZGQuc3NzIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgY29tcGFyZSAqLwotCi0gIHsiZmNtcC5kZCIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5kcyIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc2QiLAlPUF9MSSgweDNFQikgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc2QiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNzIiwJT1BfTEkoMHgzRUIpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zcyIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBkaXZpZGUgKi8KLQotICB7ImZkaXYuZGRkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5kc2QiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zZGQiLAlPUF9MSSgweDNFNykgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNkZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzZCIsCU9QX0xJKDB4M0U3KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc3MiLAlPUF9MSSgweDNFNykgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZkaXYuc3NzIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgbXVsdGlwbHkgKi8KLQotICB7ImZtcHkuZGRkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5kc2QiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5paWkiLAlPUF9MSSgweDNFNSkgIHwgUEQoMikgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5paWkiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMikgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnNkZCIsCU9QX0xJKDB4M0U1KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc2RkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NkIiwJT1BfTEkoMHgzRTUpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzcyIsCU9QX0xJKDB4M0U1KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5zc3MiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnV1dSIsCU9QX0xJKDB4M0U1KSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnV1dSIsCU9QX1JFRygweDNFNCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gTWludXMgSW5maW5pdHkgKi8KLQotICB7ImZybmRtLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIE5lYXJlc3QgKi8KLQotICB7ImZybmRuLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIFBvc2l0aXZlIEluZmluaXR5ICovCi0KLSAgeyJmcm5kcC5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAudWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAudWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAudXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBaZXJvICovCi0KLSAgeyJmcm5kei5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHoudWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHoudWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHoudXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgc3F1YXJlIHJvb3QgKi8KLQotICB7ImZzcXJ0LmRkIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zZCIsCU9QX0xJKDB4M0VGKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc2QiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zcyIsCU9QX0xJKDB4M0VGKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZzcXJ0LnNzIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IHN1YnRyYWN0aW9uICovCi0KLSAgeyAiZnN1Yi5kZGQiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5kc2QiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc2RkIiwJT1BfTEkoMHgzRTMpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc2RkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzZCIsCU9QX0xJKDB4M0UzKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc2QiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzcyIsCU9QX0xJKDB4M0UzKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsgImZzdWIuc3NzIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogSWxsZWdhbCBpbnN0cnVjdGlvbnMgKi8KLQotICB7ImlsbG9wMCIsCU9QX1NJKDB4MCksCU1BU0tfU0ksCTAsCXswfQl9LAotICB7ImlsbG9wRiIsCTB4MUZGIDw8IDEzLAkweDFGRiA8PCAxMywJMCwJezB9CX0sCi0KLSAgLyogSnVtcCBhbmQgc2F2ZSByZXR1cm4gKi8KLQotICB7ImpzciIsCU9QX1NJKDB4NDQpLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyIiwJT1BfTEkoMHgzODkpLAlNQVNLX0xJLAkwLAl7T0ZGX1NMX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyIiwJT1BfUkVHKDB4Mzg4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfU0koMHg0NSksCU1BU0tfU0ksCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX0xJKDB4MzhCKSwJTUFTS19MSSwJMCwJe09GRl9TTF9CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfUkVHKDB4MzhBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotCi0gIC8qIExvYWQgU2lnbmVkIERhdGEgSW50byBSZWdpc3RlciAqLwotCi0gIHsibGQiLAlPUF9TSSgweDIyKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZCIsCU9QX0xJKDB4MzQ1KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkIiwJT1BfUkVHKDB4MzQ0KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmIiLAlPUF9TSSgweDIwKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5iIiwJT1BfTEkoMHgzNDEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQuYiIsCU9QX1JFRygweDM0MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5kIiwJT1BfU0koMHgyMyksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJsZC5kIiwJT1BfTEkoMHgzNDcpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJsZC5kIiwJT1BfUkVHKDB4MzQ2KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsibGQuaCIsCU9QX1NJKDB4MjEpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmgiLAlPUF9MSSgweDM0MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC5oIiwJT1BfUkVHKDB4MzQyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIExvYWQgVW5zaWduZWQgRGF0YSBJbnRvIFJlZ2lzdGVyICovCi0KLSAgeyJsZC51YiIsCU9QX1NJKDB4MjgpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnViIiwJT1BfTEkoMHgzNTEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQudWIiLAlPUF9SRUcoMHgzNTApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWgiLAlPUF9TSSgweDI5KSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51aCIsCU9QX0xJKDB4MzUzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLnVoIiwJT1BfUkVHKDB4MzUyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIExlZnRtb3N0IG9uZSAqLwotCi0gIHsibG1vIiwJT1BfTEkoMHgzRjApLAlNQVNLX0xJLAkwLAl7UkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIGxvZ2ljYWwgT1IuICBOb3RlIHRoYXQgIm9yLnR0IiBhbmQgIm9yIiBhcmUgdGhlIHNhbWUgaW5zdHJ1Y3Rpb25zLiAqLwotCi0gIHsib3IuZmYiLAlPUF9TSSgweDFFKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZmYiLAlPUF9MSSgweDMzRCksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZmIiwJT1BfUkVHKDB4MzNDKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci5mdCIsCU9QX1NJKDB4MUQpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mdCIsCU9QX0xJKDB4MzNCKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZnQiLAlPUF9SRUcoMHgzM0EpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLnRmIiwJT1BfU0koMHgxQiksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnRmIiwJT1BfTEkoMHgzMzcpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50ZiIsCU9QX1JFRygweDMzNiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IudHQiLAlPUF9TSSgweDE3KSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudHQiLAlPUF9MSSgweDMyRiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnR0IiwJT1BfUkVHKDB4MzJFKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvciIsCU9QX1NJKDB4MTcpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvciIsCU9QX0xJKDB4MzJGKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IiLAlPUF9SRUcoMHgzMkUpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFJlYWQgQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsicmRjciIsCU9QX1NJKDB4NCksCU1BU0tfU0kgIHwgKDB4MUYgPDwgMjIpLAkwLAl7Q1JfU0ksIFJFR19ERVNUfQl9LAotICB7InJkY3IiLAlPUF9MSSgweDMwOSksCU1BU0tfTEkgIHwgKDB4MUYgPDwgMjIpLAkwLAl7Q1JfTEksIFJFR19ERVNUfQl9LAotICB7InJkY3IiLAlPUF9SRUcoMHgzMDgpLAlNQVNLX1JFRyB8ICgweDFGIDw8IDIyKSwJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBSaWdodG1vc3Qgb25lICovCi0KLSAgeyJybW8iLAlPUF9MSSgweDNGMiksCU1BU0tfTEksCTAsCQl7UkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBMZWZ0IC0gbm90ZSB0aGF0IHJvdGwsIHNobCwgYW5kIGlucyBhcmUgYWxsIGFsdGVybmF0ZSBuYW1lcyBmb3Igb25lIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCi0gICAgIFRoZXkgYXBwZWFyIHByaW9yIHRvIHRoZWlyIHNsIGVxdWl2YWxlbnQgc28gdGhhdCB0aGV5IHdpbGwgYmUgZGlhc3NlbWJsZWQgYXMgdGhlIGFsdGVybmF0ZSBuYW1lLiAqLwotCi0KLSAgeyJpbnMiLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJpbnMiLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90bCIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdGwiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2hsIiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNobCIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5keiIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5leiIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5leiIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBMZWZ0IFdpdGggSW52ZXJ0ZWQgRW5kbWFzayAqLwotCi0gIHsic2xpLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5keiIsCU9QX1JFRygweDMxMCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5leiIsCU9QX1JFRygweDMxNikgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5leiIsCU9QX1NJKDB4QikgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIFJpZ2h0IC0gbm90ZSB0aGF0IGV4dHMsIGV4dHUsIHJvdHIsIHNyYSwgYW5kIHNybCBhcmUgYWxsIGFsdGVybmF0ZSBuYW1lcyBmb3Igb25lIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCi0gICAgIFRoZXkgYXBwZWFyIHByaW9yIHRvIHRoZWlyIHNyIGVxdWl2YWxlbnQgc28gdGhhdCB0aGV5IHdpbGwgYmUgZGlhc3NlbWJsZWQgYXMgdGhlIGFsdGVybmF0ZSBuYW1lLiAqLwotCi0gIHsiZXh0cyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHUiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHR1IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RyIiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90ciIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmEiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmEiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNybCIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNybCIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5leiIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgUmlnaHQgV2l0aCBJbnZlcnRlZCBFbmRtYXNrICovCi0KLSAgeyJzcmkuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5peiIsCU9QX1JFRygweDMxQykgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU3RvcmUgRGF0YSBpbnRvIE1lbW9yeSAqLwotCi0gIHsic3QiLAlPUF9TSSgweDMyKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QiLAlPUF9MSSgweDM2NSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdCIsCU9QX1JFRygweDM2NCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5iIiwJT1BfU0koMHgzMCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmIiLAlPUF9MSSgweDM2MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdC5iIiwJT1BfUkVHKDB4MzYwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmQiLAlPUF9TSSgweDMzKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJzdC5kIiwJT1BfTEkoMHgzNjcpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJzdC5kIiwJT1BfUkVHKDB4MzY2KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsic3QuaCIsCU9QX1NJKDB4MzEpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5oIiwJT1BfTEkoMHgzNjMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QuaCIsCU9QX1JFRygweDM2MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBTaWduZWQgSW50ZWdlciBTdWJ0cmFjdCAqLwotCi0gIHsic3ViIiwJT1BfU0koMHg1QSksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWIiLAlPUF9MSSgweDNCNSksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YiIsCU9QX1JFRygweDNCNCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVW5zaWduZWQgSW50ZWdlciBTdWJ0cmFjdCAqLwotCi0gIHsic3VidSIsCU9QX1NJKDB4NUIpLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3VidSIsCU9QX0xJKDB4M0I3KSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3VidSIsCU9QX1JFRygweDNCNiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogV3JpdGUgQ29udHJvbCBSZWdpc3RlcgotICAgICBJcyBhIHNwZWNpYWwgZm9ybSBvZiB0aGUgInN3Y3IiIGluc3RydWN0aW9uIHNvIGNvbWVzIGJlZm9yZSBpdCBpbiB0aGUgdGFibGUuICovCi0KLSAgeyJ3cmNyIiwJT1BfU0koMHg1KSwJTUFTS19TSSB8ICgweDFGIDw8IDI3KSwJCTAsCXtDUl9TSSwgUkVHXzIyfQl9LAotICB7IndyY3IiLAlPUF9MSSgweDMwQiksCU1BU0tfTEkgfCAoMHgxRiA8PCAyNyksCQkwLAl7Q1JfTEksIFJFR18yMn0JfSwKLSAgeyJ3cmNyIiwJT1BfUkVHKDB4MzBBKSwJTUFTS19SRUcgfCAoMHgxRiA8PCAyNyksCTAsCXtSRUdfMCwgUkVHXzIyfQl9LAotCi0gIC8qIFN3YXAgQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsic3djciIsCU9QX1NJKDB4NSksCU1BU0tfU0ksCTAsCXtDUl9TSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzd2NyIiwJT1BfTEkoMHgzMEIpLAlNQVNLX0xJLAkwLAl7Q1JfTEksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3djciIsCU9QX1JFRygweDMwQSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVHJhcCAqLwotCi0gIHsidHJhcCIsCU9QX1NJKDB4MSkgICAgfCBFKDApLAlNQVNLX1NJICB8IEUoMSksCTAsCXtTVUl9CX0sCi0gIHsidHJhcCIsCU9QX0xJKDB4MzAzKSAgfCBFKDApLAlNQVNLX0xJICB8IEUoMSksCTAsCXtMVUl9CX0sCi0gIHsidHJhcCIsCU9QX1JFRygweDMwMikgfCBFKDApLAlNQVNLX1JFRyB8IEUoMSksCTAsCXtSRUdfMH0JfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgQWRkICovCi0KLSAgeyJ2YWRkLmRkIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNkIiwJT1BfTEkoMHgzQzEpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNkIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zcyIsCU9QX0xJKDB4M0MxKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2YWRkLnNzIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjIsIFJFR18yMn0JfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkgYW5kIEFkZCB0byBBY2N1bXVsYXRvciBGSVhNRSEgVGhpcyBpcyBub3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkLgotICAgRnJvbSB0aGUgZG9jdW1lbnRhdGlvbiB0aGVyZSBhcHBlYXJzIHRvIGJlIG5vIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9wY29kZXMgZm9yCi0gICBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHJlZ2lzdGVyIGRlc3RpbmF0aW9ucyBhbmQgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBhY2N1bXVsYXRvciBkZXN0aW5hdGlvbnMuCi0gICBGdXJ0aGVyIGludmVzdGlnYXRpb24gaXMgbmVjZXNzYXJ5LiAgU2luY2UgdGhpcyBpc24ndCBjcml0aWNhbCB0byBnZXR0aW5nIGEgVElDODAgdG9vbGNoYWluIHVwCi0gICBhbmQgcnVubmluZywgaXQgaXMgZGVmZXJlZCB1bnRpbCBsYXRlci4gKi8KLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkKLSAgIE5vdGU6IElmIHIwIGlzIGluIHRoZSBkZXN0aW5hdGlvbiByZWcsIHRoZW4gdGhpcyBpcyBhICJ2ZWN0b3Igbm9wIiBpbnN0cnVjdGlvbi4gKi8KLQotICB7InZtcHkuZGQiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0gfSwKLSAgeyJ2bXB5LnNkIiwJT1BfTEkoMHgzQzUpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidm1weS5zZCIsCU9QX1JFRygweDNDNCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0gfSwKLSAgeyJ2bXB5LnNzIiwJT1BfTEkoMHgzQzUpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2bXB5LnNzIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9IH0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5IGFuZCBTdWJ0cmFjdCBmcm9tIEFjY3VtdWxhdG9yCi0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBTdWJ0cmFjdCBBY2N1bXVsYXRvciBGcm9tIFNvdXJjZQotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgUm91bmQgV2l0aCBGbG9hdGluZy1Qb2ludCBJbnB1dAotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgUm91bmQgd2l0aCBJbnRlZ2VyIElucHV0ICovCi0KLSAgeyJ2cm5kLmlkIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMU0ksIFJFR18yMl9FfX0sCi0gIHsidnJuZC5pZCIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMl9FfX0sCi0gIHsidnJuZC5pcyIsCU9QX0xJICgweDNDQikgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFNJLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLmlzIiwJT1BfUkVHICgweDNDQSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyfX0sCi0gIHsidnJuZC51ZCIsCU9QX0xJICgweDNDQikgIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFVJLCBSRUdfMjJfRX19LAotICB7InZybmQudWQiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJfRX19LAotICB7InZybmQudXMiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDApIHwgUDEoMSksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xVSSwgUkVHXzIyfX0sCi0gIHsidnJuZC51cyIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMn19LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBTdWJ0cmFjdCAqLwotCi0gIHsidnN1Yi5kZCIsCU9QX1JFRygweDNDMikgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zZCIsCU9QX0xJKDB4M0MzKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zZCIsCU9QX1JFRygweDNDMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc3MiLAlPUF9MSSgweDNDMykgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidnN1Yi5zcyIsCU9QX1JFRygweDNDMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0KLSAgLyogVmVjdG9yIExvYWQgRGF0YSBJbnRvIFJlZ2lzdGVyIC0gTm90ZSB0aGF0IHRoZSB2ZWN0b3IgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgY29tZSBhZnRlciB0aGUgb3RoZXIKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHByaW50IHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIHNlY29uZCBmb3IKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHNhbWUgb3Bjb2RlLiAqLwotCi0gIHsidmxkMC5kIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgwKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZsZDAucyIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMCkgfCBWX3AoMCksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0gIHsidmxkMS5kIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZsZDEucyIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMCkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0KLSAgLyogVmVjdG9yIFN0b3JlIERhdGEgSW50byBNZW1vcnkgLSBOb3RlIHRoYXQgdGhlIHZlY3RvciBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBjb21lIGFmdGVyIHRoZSBvdGhlcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgcHJpbnQgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gc2Vjb25kIGZvcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgdHdvIGluc3RydWN0aW9ucyBpbiB0aGUgc2FtZSBvcGNvZGUuICovCi0KLSAgeyJ2c3QuZCIsCU9QX1YoMHgxRSkgfCBWX20oMCkgfCBWX1MoMSkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2c3QucyIsCU9QX1YoMHgxRSkgfCBWX20oMCkgfCBWX1MoMCkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0KLSAgeyJ4bm9yIiwJT1BfU0koMHgxOSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7Inhub3IiLAlPUF9MSSgweDMzMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7Inhub3IiLAlPUF9SRUcoMHgzMzIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotCi0gIHsieG9yIiwJT1BfU0koMHgxNiksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7InhvciIsCU9QX0xJKDB4MzJEKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG9yIiwJT1BfUkVHKDB4MzJDKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLQotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzID0gc2l6ZW9mICh0aWM4MF9vcGNvZGVzKSAvIHNpemVvZiAodGljODBfb3Bjb2Rlc1swXSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL3Y4NTAtZGlzLmMgYi9vcGNvZGVzL3Y4NTAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTdmODAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92ODUwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9yZWdfbmFtZXNbXSA9Ci17ICJyMCIsICJyMSIsICJyMiIsICJzcCIsICJncCIsICJyNSIsICJyNiIsICJyNyIsIAotICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAKLSAgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAKLSAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgImVwIiwgImxwIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9zcmVnX25hbWVzW10gPQoteyAiZWlwYyIsICJlaXBzdyIsICJmZXBjIiwgImZlcHN3IiwgImVjciIsICJwc3ciLCAic3I2IiwgInNyNyIsIAotICAic3I4IiwgInNyOSIsICJzcjEwIiwgInNyMTEiLCAic3IxMiIsICJzcjEzIiwgInNyMTQiLCAic3IxNSIsCi0gICJjdHBjIiwgImN0cHN3IiwgImRicGMiLCAiZGJwc3ciLCAiY3RicCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiwKLSAgInNyMTYiLCAic3IxNyIsICJzcjE4IiwgInNyMTkiLCAic3IyMCIsICJzcjIxIiwgInNyMjIiLCAic3IyMyIsIAotICAic3IyNCIsICJzcjI1IiwgInNyMjYiLCAic3IyNyIsICJzcjI4IiwgInNyMjkiLCAic3IzMCIsICJzcjMxIiB9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdjg1MF9jY19uYW1lc1tdID0KLXsgInYiLCAiYy9sIiwgInoiLCAibmgiLCAicy9uIiwgInQiLCAibHQiLCAibGUiLCAKLSAgIm52IiwgIm5jL25sIiwgIm56IiwgImgiLCAibnMvcCIsICJzYSIsICJnZSIsICJndCIgfTsKLQotc3RhdGljIGludAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICAgICAgb3AgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopdjg1MF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogICBvcGVyYW5kOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICAJc2hvcnRfb3AgPSAoKGluc24gJiAweDA2MDApICE9IDB4MDYwMCk7Ci0gIGludAkJCQlieXRlc19yZWFkOwotICBpbnQJCQkJdGFyZ2V0X3Byb2Nlc3NvcjsKLSAgCi0gIC8qIFNwZWNpYWwgY2FzZTogMzIgYml0IE1PViAqLwotICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKLSAgICBzaG9ydF9vcCA9IHRydWU7Ci0gIAotICBieXRlc19yZWFkID0gc2hvcnRfb3AgPyAyIDogNDsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYSB0d28gYnl0ZSBpbnNuLCB0aGVuIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCi0gIGlmIChzaG9ydF9vcCkKLSAgICBpbnNuICY9IDB4ZmZmZjsKLQotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBkZWZhdWx0OgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOgotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IAotICAgICAgdGFyZ2V0X3Byb2Nlc3NvciA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIChvcC0+cHJvY2Vzc29ycyAmIHRhcmdldF9wcm9jZXNzb3IpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBvcG51bTsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBtZW1vcDsKLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotLypmcHJpbnRmIChzdGRlcnIsICJtYXRjaDogbWFzazogJXggaW5zbjogJXgsIG9wY29kZTogJXgsIG5hbWU6ICVzXG4iLCBvcC0+bWFzaywgaW5zbiwgb3AtPm9wY29kZSwgb3AtPm5hbWUgKTsqLwotCi0JICBtZW1vcCA9IG9wLT5tZW1vcDsKLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuCi0KLQkgICAgIE1FTU9QIGlzIHRoZSBvcGVyYW5kIG51bWJlciBhdCB3aGljaCBhIG1lbW9yeQotCSAgICAgYWRkcmVzcyBzcGVjaWZpY2F0aW9uIHN0YXJ0cywgb3IgemVybyBpZiB0aGlzCi0JICAgICBpbnN0cnVjdGlvbiBoYXMgbm8gbWVtb3J5IGFkZHJlc3Nlcy4KLQotCSAgICAgQSBtZW1vcnkgYWRkcmVzcyBpcyBhbHdheXMgdHdvIGFyZ3VtZW50cy4KLQotCSAgICAgVGhpcyBpbmZvcm1hdGlvbiBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8KLQkgICAgIGluc2VydCBjb21tYXMgaW50byB0aGUgb3V0cHV0IHN0cmVhbSBhcyB3ZWxsIGFzCi0JICAgICB3aGVuIHRvIGluc2VydCBkaXNwW3JlZ10gZXhwcmVzc2lvbnMgb250byB0aGUKLQkgICAgIG91dHB1dCBzdHJlYW0uICAqLwotCSAgCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBvcG51bSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrLCBvcG51bSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyAJdmFsdWU7Ci0JICAgICAgaW50ICAJZmxhZzsKLQkgICAgICBpbnQgICAgICAgc3RhdHVzOwotCSAgICAgIGJmZF9ieXRlCWJ1ZmZlclsgNCBdOwotCSAgICAgIAotCSAgICAgIG9wZXJhbmQgPSAmdjg1MF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCSAgICAgIAotCSAgICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCQl2YWx1ZSA9IChvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgMCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpCi0JCSAgICB2YWx1ZSA9IChpbnNuICYgb3BlcmFuZC0+c2hpZnQpOwotCQkgIGVsc2UKLQkJICAgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLQkJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICAgdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICAgICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGFsd2F5cyBvdXRwdXQgd2l0aG91dCBhbnkKLQkJIHNwZWNpYWwgaGFuZGxpbmcuCi0KLQkJIEZvciB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDEsIHRoZW4gd2UgbmVlZCAnWycgc2luY2UKLQkJICAgd2UncmUgYWJvdXQgdG8gb3V0cHV0IHRoZSByZWdpc3RlciB1c2VkIGluIGEgbWVtb3J5Ci0JCSAgIHJlZmVyZW5jZS4KLQotCQkgICBJZiBtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIsIHRoZW4gd2UgbmVlZCAnXScgc2luY2UKLQkJICAgd2UganVzdCBmaW5pc2hlZCB0aGUgcmVnaXN0ZXIgaW4gYSBtZW1vcnkgcmVmZXJlbmNlLiAgV2UKLQkJICAgYWxzbyBuZWVkIGEgJywnIGJlZm9yZSB0aGlzIG9wZXJhbmQuCi0KLQkJICAgRWxzZSB3ZSBqdXN0IG5lZWQgYSBjb21tYS4KLQotCQkgICBXZSBtYXkgbmVlZCB0byBvdXRwdXQgYSB0cmFpbGluZyAnXScgaWYgdGhlIGxhc3Qgb3BlcmFuZAotCQkgICBpbiBhbiBpbnN0cnVjdGlvbiBpcyB0aGUgcmVnaXN0ZXIgZm9yIGEgbWVtb3J5IGFkZHJlc3MuIAotCi0JCSAgIFRoZSBleGNlcHRpb24gKGFuZCB0aGVyZSdzIGFsd2F5cyBhbiBleGNlcHRpb24pIGlzIHRoZQotCQkgICAiam1wIiBpbnNuIHdoaWNoIG5lZWRzIHNxdWFyZSBicmFja2V0cyBhcm91bmQgaXQncyBvbmx5Ci0JCSAgIHJlZ2lzdGVyIGFyZ3VtZW50LiAgKi8KLQotCSAgICAgICAgICAgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMSkgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKSBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIl0sIik7Ci0JICAgICAgZWxzZSBpZiAobWVtb3AgPT0gMSAmJiBvcG51bSA9PSAxCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSkKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JICAgICAgZWxzZSBpZiAob3BudW0gPiAxKQkgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0KLQkgICAgICAvKiBleHRyYWN0IHRoZSBmbGFncywgaWdub3JuZyBvbmVzIHdoaWNoIGRvIG5vdCBlZmZlY3QgZGlzYXNzZW1ibHkgb3V0cHV0LiAqLwotCSAgICAgIGZsYWcgPSBvcGVyYW5kLT5mbGFnczsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1NJR05FRDsKLQkgICAgICBmbGFnICY9IH4gVjg1MF9PUEVSQU5EX1JFTEFYOwotCSAgICAgIGZsYWcgJj0gLSBmbGFnOwotCSAgICAgIAotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFY4NTBfT1BFUkFORF9SRUc6ICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9yZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX1NSRzogIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX3NyZWdfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0NDOiAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX2NjX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9FUDogICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgImVwIik7IGJyZWFrOwotCQlkZWZhdWx0OiAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfRElTUDoKLQkJICB7Ci0JCSAgICBiZmRfdm1hIGFkZHIgPSB2YWx1ZSArIG1lbWFkZHI7Ci0JCSAgICAKLQkJICAgIC8qIE9uIHRoZSB2ODUwIHRoZSB0b3AgOCBiaXRzIG9mIGFuIGFkZHJlc3MgYXJlIHVzZWQgYnkgYW4gb3ZlcmxheSBtYW5hZ2VyLgotCQkgICAgICAgVGh1cyBpdCBtYXkgaGFwcGVuIHRoYXQgd2hlbiB3ZSBhcmUgbG9va2luZyBmb3IgYSBzeW1ib2wgdG8gbWF0Y2gKLQkJICAgICAgIGFnYWluc3QgYW4gYWRkcmVzcyB3aXRoIHNvbWUgb2YgaXRzIHRvcCBiaXRzIHNldCwgdGhlIHNlYXJjaCBmYWlscyB0bwotCQkgICAgICAgdHVybiB1cCBhbiBleGFjdCBtYXRjaC4gIEluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gZmluZCBhbiBleGFjdCBtYXRjaAotCQkgICAgICAgYWdhaW5zdCBhIHN5bWJvbCBpbiB0aGUgbG93ZXIgYWRkcmVzcyBzcGFjZSwgYW5kIGlmIHdlIGZpbmQgb25lLCB3ZQotCQkgICAgICAgdXNlIHRoYXQgYWRkcmVzcy4gICBXZSBvbmx5IGRvIHRoaXMgZm9yIEpBUkwgaW5zdHJ1Y3Rpb25zIGhvd2V2ZXIsIGFzCi0JCSAgICAgICB3ZSBkbyBub3Qgd2FudCB0byBtaXNpbnRlcnByZXQgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCi0JCSAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAyMikKLQkJICAgICAgewotCQkJaWYgKCAhIGluZm8tPnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgKGFkZHIsIGluZm8pCi0JCQkgICAgJiYgKChhZGRyICYgMHhGRjAwMDAwMCkgIT0gMCkKLQkJCSAgICAmJiBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jIChhZGRyICYgMHgwMEZGRkZGRiwgaW5mbykpCi0JCQkgIHsKLQkJCSAgICBhZGRyICY9IDB4MDBGRkZGRkY7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChhZGRyLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJICAgIAotCQljYXNlIFY4NTBFX1BVU0hfUE9QOgotCQkgIHsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDEyX3JlZ3NbMzJdICAgPSB7IDMwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotCQkgICAgc3RhdGljIGludCBsaXN0MThfaF9yZWdzWzMyXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAzMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxOF9sX3JlZ3NbMzJdID0geyAgMywgIDIsICAxLCAtMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKLQkJICAgIGludCAqICAgICAgICAgICAgIHJlZ3M7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBpOwotCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzayA9IDA7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBwYyAgID0gZmFsc2U7Ci0JCSAgICBpbnQgICAgICAgICAgICAgICBzciAgID0gZmFsc2U7Ci0JCSAgICAKLQkJICAgIAotCQkgICAgc3dpdGNoIChvcGVyYW5kLT5zaGlmdCkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4ZmZlMDAwMDE6IHJlZ3MgPSBsaXN0MTJfcmVnczsgYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IGxpc3QxOF9oX3JlZ3M7IGJyZWFrOwotCQkgICAgICBjYXNlIDB4ZmZmODAwMWY6IHJlZ3MgPSBsaXN0MThfbF9yZWdzOyB2YWx1ZSAmPSB+MHgxMDsgYnJlYWs7ICAvKiBEbyBub3QgaW5jbHVkZSBtYWdpYyBiaXQgKi8KLQkJICAgICAgZGVmYXVsdDoKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCApOwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICAgICAgewotCQkJaWYgKHZhbHVlICYgKDEgPDwgaSkpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKHJlZ3NbIGkgXSkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGRlZmF1bHQ6IG1hc2sgfD0gKDEgPDwgcmVnc1sgaSBdKTsgYnJlYWs7Ci0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgICAgIGNhc2UgMDogIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBwb3AgcmVnOiAlZFxuIiksIGkgKTsgYWJvcnQoKTsKLQkJCSAgICAgIGNhc2UgLTE6IHBjID0gdHJ1ZTsgYnJlYWs7Ci0JCQkgICAgICBjYXNlIC0yOiBzciA9IHRydWU7IGJyZWFrOwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQotCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJ7Iik7Ci0JCSAgICAKLQkJICAgIGlmIChtYXNrIHx8IHBjIHx8IHNyKQotCQkgICAgICB7Ci0JCQlpZiAobWFzaykKLQkJCSAgewotCQkJICAgIHVuc2lnbmVkIGludCBiaXQ7Ci0JCQkgICAgaW50ICAgICAgICAgIHNob3duX29uZSA9IGZhbHNlOwotCQkJICAgIAotCQkJICAgIGZvciAoYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKQotCQkJICAgICAgaWYgKG1hc2sgJiAoMSA8PCBiaXQpKQotCQkJCXsKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGZpcnN0ID0gYml0OwotCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgbGFzdDsKLQotCQkJCSAgaWYgKHNob3duX29uZSkKLQkJCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIsICIpOwotCQkJCSAgZWxzZQotCQkJCSAgICBzaG93bl9vbmUgPSB0cnVlOwotCQkJCSAgCi0JCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgdjg1MF9yZWdfbmFtZXNbZmlyc3RdKTsKLQkJCQkgIAotCQkJCSAgZm9yIChiaXQrKzsgYml0IDwgMzI7IGJpdCsrKQotCQkJCSAgICBpZiAoKG1hc2sgJiAoMSA8PCBiaXQpKSA9PSAwKQotCQkJCSAgICAgIGJyZWFrOwotCi0JCQkJICBsYXN0ID0gYml0OwotCi0JCQkJICBpZiAobGFzdCA+IGZpcnN0ICsgMSkKLQkJCQkgICAgewotCQkJCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIC0gJXMiLCB2ODUwX3JlZ19uYW1lc1sgbGFzdCAtIDEgXSk7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgIH0KLQkJCQotCQkJaWYgKHBjKQotCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzUEMiLCBtYXNrID8gIiwgIiA6ICIiKTsKLQkJCWlmIChzcikKLQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlc1NSIiwgKG1hc2sgfHwgcGMpID8gIiwgIiA6ICIiKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIn0iKTsKLQkJICB9Ci0JCWJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTE2OgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDIsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSAyOwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBhIERJU1BPU0UgaW5zdHJ1Y3Rpb24gd2l0aCBmZiBzZXQgdG8gMHgxMCwgdGhlbiBzaGlmdCB2YWx1ZSB1cCBieSAxNi4gICovCi0JCSAgICAgIGlmICgoaW5zbiAmIDB4MDAxZmZmYzApID09IDB4MDAxMzA3ODApCi0JCQl2YWx1ZSA8PD0gMTY7Ci0KLQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIweCV4IiwgdmFsdWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciArIGJ5dGVzX3JlYWQsIGluZm8pOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIFY4NTBFX0lNTUVESUFURTMyOgotCQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIgKyBieXRlc19yZWFkLCBidWZmZXIsIDQsIGluZm8pOwotCQkgIGlmIChzdGF0dXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgYnl0ZXNfcmVhZCArPSA0OwotCQkgICAgICB2YWx1ZSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgYnl0ZXNfcmVhZCwgaW5mbyk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0JCSAgCi0KLQkgICAgICAvKiBIYW5kbGUgam1wIGNvcnJlY3RseS4gICovCi0JICAgICAgaWYgKG1lbW9wID09IDEgJiYgb3BudW0gPT0gMQotCQkgICYmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSAhPSAwKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0JICAgIH0KLQotCSAgLyogQ2xvc2UgYW55IHNxdWFyZSBicmFja2V0IHdlIGxlZnQgb3Blbi4gICovCi0JICBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLSAgICAgIGlmIChzaG9ydF9vcCkKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIi5zaG9ydFx0MHglMDR4IiwgaW5zbik7Ci0gICAgICBlbHNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHglMDh4IiwgaW5zbik7Ci0gICAgfQotCi0gIHJldHVybiBieXRlc19yZWFkOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3Y4NTAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICBpbnQgICAgICAgICAgIHN0YXR1czsKLSAgYmZkX2J5dGUgICAgICBidWZmZXJbIDQgXTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuID0gMDsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIAotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgewotICAgICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICAKLSAgICAgIGlmICggICAoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwCi0JICAmJiAoaW5zbiAmIDB4ZmZlMCkgIT0gMHgwNjIwKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSA0IGJ5dGUgaW5zbiwgcmVhZCA0IGJ5dGVzIG9mIHN0dWZmLiAgKi8KLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0KLQkgIGlmIChzdGF0dXMgPT0gMCkKLQkgICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIHRlbGwgb3VyIGNhbGxlciBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZC4gICovCi0gIHJldHVybiBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3Y4NTAtb3BjLmMgYi9vcGNvZGVzL3Y4NTAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGRiMWIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92ODUwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8qIEFzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiByZWd1bGFyIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCh4ICYgMHgzZikgPDwgNSkKLSNkZWZpbmUgT1BfTUFTSwkJT1AgKDB4M2YpCi0KLS8qIGNvbmRpdGlvbmFsIGJyYW5jaCBvcGNvZGUgKi8KLSNkZWZpbmUgQk9QKHgpCQkoKDB4MGIgPDwgNykgfCAoeCAmIDB4MGYpKQotI2RlZmluZSBCT1BfTUFTSwkoKDB4MGYgPDwgNykgfCAweDBmKQotCi0vKiBvbmUtd29yZCBvcGNvZGVzICovCi0jZGVmaW5lIG9uZSh4KQkJKCh1bnNpZ25lZCBpbnQpICh4KSkKLQotLyogdHdvLXdvcmQgb3Bjb2RlcyAqLwotI2RlZmluZSB0d28oeCx5KQkoKHVuc2lnbmVkIGludCkgKHgpIHwgKCh1bnNpZ25lZCBpbnQpICh5KSA8PCAxNikpCi0KLQotDAotLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4gICovCi0KLS8qIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKLSAgIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCi0gICBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCi0gICBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogbm90X3ZhbGlkICAgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBvdXRfb2ZfcmFuZ2UgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKLXN0YXRpYyBjb25zdCBjaGFyICogbm90X2FsaWduZWQgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbW1lZGlhdGVfb3V0X29mX3JhbmdlID0gTl8gKCJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0Iik7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXygiYnJhbmNoIHRvIG9kZCBvZmZzZXQiKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHgxZjApIDw8IDcpIHwgKCh2YWx1ZSAmIDB4MGUpIDw8IDMpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9ICgoaW5zbiAmIDB4ZjgwMCkgPj4gNykgfCAoKGluc24gJiAweDAwNzApID4+IDMpOwotCi0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXQgLT0gMHgwMjAwOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDIyIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZmZmZiB8fCB2YWx1ZSA8IC0weDIwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNmMDAwMCkgPj4gMTYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDIyIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpIHwgKChpbnNuICYgMHgzZikgPDwgMTYpOwotCi0gIHJldHVybiAodW5zaWduZWQgbG9uZykgKChyZXQgPDwgMTApID4+IDEwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMTZfMTUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4N2ZmZiB8fCB2YWx1ZSA8IC0weDgwMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QxNl8xNSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHhmZmZlMDAwMCk7Ci0KLSAgcmV0dXJuIHJldCA+PiAxNjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOF83IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q4XzcgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3Zik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q4XzYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSA0KSAhPSAwKQotCSplcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSA0KSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHg3ZSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOF82IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4N2UpOwotCi0gIHJldHVybiByZXQgPDwgMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kNV80IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSplcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDBmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q1XzQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHgwZik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QxNl8xNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKLSAgICAqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNikgfCAoKHZhbHVlICYgMSkgPDwgNSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMTZfMTYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHhmZmZlMDAwMDsKLQotICByZXQgPj49IDE2OwotCi0gIHJldCB8PSAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfaTkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgc2lnbmVkIGxvbmcgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfaTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgwMDNjMDAwMDsKLQotICByZXQgPDw9IDEwOwotICByZXQgPj49IDIzOwotCi0gIHJldCB8PSAoaW5zbiAmIDB4MWYpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF91OSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZmYpCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfdTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOwotCi0gIHJldCA+Pj0gMTM7Ci0KLSAgcmV0IHw9IChpbnNuICYgMHgxZik7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NwZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICE9IDMpCi0gICAgKiBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50Iik7Ci0KLSAgcmV0dXJuIGluc24gJiAofiAweDE4MDAwMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X3NwZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHJldHVybiAzOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2k1ZGl2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZikKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXygiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIik7Ci0KLSAgdmFsdWUgPSAzMiAtIHZhbHVlOwotICAKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZSkgPDwgMTcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9pNWRpdiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4M2MwMDAwOwotCi0gIHJldCA+Pj0gMTc7Ci0KLSAgcmV0ID0gMzIgLSByZXQ7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi0MCi0vKiBXYXJuaW5nOiBjb2RlIGluIGdhcy9jb25maWcvdGMtdjg1MC5jIGV4YW1pbmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgotICAgSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBoZXJlLCBiZSBzdXJlIHRvIGxvb2sgZm9yIHNpZGUgZWZmZWN0cyBpbgotICAgdGhhdCBjb2RlLiAqLwotY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJMAotICB7IDAsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSBSMSBmaWVsZCBpbiBhIGZvcm1hdCAxLCA2LCA3LCBvciA5IGluc24uICovCi0jZGVmaW5lIFIxCShVTlVTRUQgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwgCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIxX05PVFIwIChSMSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sIAotCi0vKiBUaGUgUjIgZmllbGQgaW4gYSBmb3JtYXQgMSwgMiwgNCwgNSwgNiwgNywgOSBpbnNuLiAqLwotI2RlZmluZSBSMgkoUjFfTk9UUjAgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIyX05PVFIwIChSMiArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBUaGUgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCi0jZGVmaW5lIEk1CShSMl9OT1RSMCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHVuc2lnbmVkIGltbTUgZmllbGQgaW4gYSBmb3JtYXQgMiBpbnNuLiAqLwotI2RlZmluZSBJNVUJKEk1ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEkxNgkoSTVVICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSBzaWduZWQgZGlzcDcgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENwkoSTE2ICsgMSkKLSAgeyA3LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEQxNl8xNQkoRDcgKyAxKQotICB7IDE1LCAxNywgaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSAzIGJpdCBpbW1lZGlhdGUgZmllbGQgaW4gZm9ybWF0IDggaW5zbi4gICovCi0jZGVmaW5lIEIzCShEMTZfMTUgKyAxKQotICB7IDMsIDExLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSA0IGJpdCBjb25kaXRpb24gY29kZSBpbiBhIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQ0NDQwkoQjMgKyAxKQotICB7IDQsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgdW5zaWduZWQgRElTUDggZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBEOF83CShDQ0NDICsgMSkKLSAgeyA3LCAwLCBpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83LCAwIH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ4XzYJKEQ4XzcgKyAxKQotICB7IDYsIDEsIGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYsIDAgfSwKLQotLyogU3lzdGVtIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgU1IxCShEOF82ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIEVQIFJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgRVAJKFNSMSArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0VQIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCAodW5zaWduZWQpIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgSTE2VQkoRVAgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgMH0sIAotCi0vKiBUaGUgUjIgZmllbGQgYXMgYSBzeXN0ZW0gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBTUjIJKEkxNlUgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYSBmb3JtYXQgOCBpbnNuLiAqLwotI2RlZmluZSBEMTYJKFNSMiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgRElTUDkgZmllbGQgaW4gYSBmb3JtYXQgMyBpbnNuLCByZWxheGFibGUuICovCi0jZGVmaW5lIEQ5X1JFTEFYCShEMTYgKyAxKQotICB7IDksIDAsIGluc2VydF9kOSwgZXh0cmFjdF9kOSwgVjg1MF9PUEVSQU5EX1JFTEFYIHwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBESVNQMjIgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLCByZWxheGFibGUuCi0gICBUaGlzIF9tdXN0XyBmb2xsb3cgRDlfUkVMQVg7IHRoZSBhc3NlbWJsZXIgYXNzdW1lcyB0aGF0IHRoZSBsb25nZXIKLSAgIHZlcnNpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgc2hvcnRlciB2ZXJzaW9uIGZvciByZWxheGluZy4gICovCi0jZGVmaW5lIEQyMgkoRDlfUkVMQVggKyAxKQotICB7IDIyLCAwLCBpbnNlcnRfZDIyLCBleHRyYWN0X2QyMiwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBzaWduZWQgZGlzcDQgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENAkoRDIyICsgMSkKLSAgeyA0LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIHVuc2lnbmVkIGRpc3A1IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDVfNAkoRDQgKyAxKQotICB7IDQsIDAsIGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIDAgfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhbiBmb3JtYXQgNyB1bnNpZ25lZCBieXRlIGxvYWQgaW5zbi4gKi8KLSNkZWZpbmUgRDE2XzE2CShENV80ICsgMSkKLSAgeyAtMSwgMHhmZmZlMDAyMCwgaW5zZXJ0X2QxNl8xNiwgZXh0cmFjdF9kMTZfMTYsIDAgfSwgCi0KLS8qIFRoaXJkIHJlZ2lzdGVyIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAqLwotI2RlZmluZSBSMwkoRDE2XzE2ICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBDb25kaXRpb24gY29kZSBpbiBjb25kaXRpb25hbCBtb3Zlcy4gICovCi0jZGVmaW5lIE1PVkNDCShSMyArIDEpCi0gIHsgNCwgMTcsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIEk5CShNT1ZDQyArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgdW5zaWduZWQgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIFU5CShJOSArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LCAwIH0sIAotCi0vKiBBIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgcHJlcGFyZS9kaXNwb3NlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDEyCShVOSArIDEpCi0gIHsgLTEsIDB4ZmZlMDAwMDEsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0vKiBUaGUgSU1NNiBmaWVsZCBpbiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk2CShMSVNUMTIgKyAxKQotICB7IDYsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTE2CShJNiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MEVfSU1NRURJQVRFMTYgfSwgCi0KLS8qIFRoZSAzMiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTMyCShJTU0xNiArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MEVfSU1NRURJQVRFMzIgfSwgCi0KLS8qIFRoZSBpbW01IGZpZWxkIGluIGEgcHVzaC9wb3AgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIElNTTUJKElNTTMyICsgMSkKLSAgeyA1LCAxLCBOVUxMLCBOVUxMLCAwIH0sIAotCi0vKiBSZWcyIGluIGRpc3Bvc2UgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFIyRElTUE9TRQkoSU1NNSArIDEpCi0gIHsgNSwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBTdGFjayBwb2ludGVyIGluIHByZXBhcmUgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFNQCShSMkRJU1BPU0UgKyAxKQotICB7IDIsIDE5LCBpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBUaGUgSU1NNSBmaWVsZCBpbiBhIGRpdmlkZSBOIHN0ZXAgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk1RElWCShTUCArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNSC9QT1BNSCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9IIChJNURJViArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMGYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNTC9QT1BNTCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9MIChMSVNUMThfSCArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMWYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIC8qIFRoZSBzZXR0aW5nIG9mIHRoZSA0dGggYml0IGlzIGEgZmxhZyB0byBkaXNhc3NtYmxlKCkgaW4gdjg1MC1kaXMuYyAqLwotfSA7IAotCi0MCi0vKiByZWctcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IEkpICovCi0jZGVmaW5lIElGMQl7UjEsIFIyfQotCi0vKiBpbW0tcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJKSAqLwotI2RlZmluZSBJRjIJe0k1LCBSMn0KLQotLyogY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJSSkgKi8KLSNkZWZpbmUgSUYzCXtEOV9SRUxBWH0KLQotLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCi0jZGVmaW5lIElGNgl7STE2LCBSMSwgUjJ9Ci0KLS8qIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiAoRm9ybWF0IFZJKSAqLwotI2RlZmluZSBJRjZVCXtJMTZVLCBSMSwgUjJ9Ci0KLQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCQlNQVNLCQkgICAgICAgeyBPUEVSQU5EUyB9CSAgIE1FTU9QICAgIFBST0NFU1NPUgotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotICAgTUVNT1Agc3BlY2lmaWVzIHdoaWNoIG9wZXJhbmQgKGlmIGFueSkgaXMgYSBtZW1vcnkgb3BlcmFuZC4KLSAgIFBST0NFU1NPUlMgc3BlY2lmaWVzIHdoaWNoIENQVShzKSBzdXBwb3J0IHRoZSBvcGNvZGUuCi0gICAKLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4KLQotICAgVGhlIHRhYmxlIGlzIGFsc28gc29ydGVkIGJ5IG5hbWUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgIFdoZW4gcGFyc2luZyBhbiBpbnN0cnVjdGlvbiB0aGUgYXNzZW1ibGVyIGZpbmRzIHRoZSBmaXJzdCBvY2N1cmFuY2UKLSAgIG9mIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjaXRvbiBpbiB0aGlzIHRhYmxlIGFuZCB0aGVuIGF0dGVtcHRzIHRvCi0gICBtYXRjaCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudHMgd2l0aCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgaXQgaGFzIGp1c3QgZm91bmQgaW4gdGhpcyB0YWJsZS4gIElmIHRoZQotICAgbWF0Y2ggZmFpbHMgdGhlIGFzc2VtYmxlciBsb29rcyBhdCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIHRhYmxlLgotICAgSWYgdGhhdCBlbnRyeSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJldmlvdXMgZW50cnksIHRoZW4gaXQKLSAgIHRyaWVzIHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiBhZ2FpbnN0IHRoYXQgZW50cnkgYW5kIHNvIG9uLiAgVGhpcwotICAgaXMgaG93IHRoZSBhc3NlbWJsZXIgY29wZXMgd2l0aCBtdWx0aXBsZSwgZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlCi0gICBzYW1lIGluc3RydWN0aW9uLiAgKi8KLQotY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdID0KLXsKLXsgImJyZWFrcG9pbnQiLAkweGZmZmYsCQkJMHhmZmZmLAkJICAgICAgCXtVTlVTRUR9LCAgIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi17ICJqbXAiLAlvbmUgKDB4MDA2MCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjF9LCAJCQkxLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KLXsgInNsZC5idSIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5idSIsICAgICBvbmUgKDB4MDA2MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENCwgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAotCi17ICJzbGQuaHUiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaHUiLCAgICAgb25lICgweDAwNzApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDVfNCwgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLQoteyAic2xkLmIiLCAgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi17ICJzbGQuYiIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMn0sCTEsIFBST0NFU1NPUl9WODUwIH0sCi0KLXsgInNsZC5oIiwgICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaCIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLXsgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwIH0sCi17ICJzbGQudyIsCW9uZSAoMHgwNTAwKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtEOF82LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuYiIsCW9uZSAoMHgwMzgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBENywgICBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuaCIsCW9uZSAoMHgwNDgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBEOF83LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QudyIsCW9uZSAoMHgwNTAxKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtSMiwgICBEOF82LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLXsgInB1c2htbCIsCXR3byAoMHgwN2UwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicHVzaG1oIiwJdHdvICgweDA3ZTAsIDB4MDAwMyksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9IfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwb3BtbCIsCXR3byAoMHgwN2YwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicG9wbWgiLAl0d28gKDB4MDdmMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBTUH0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDBiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDEzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDFiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0zMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAxKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGlzcG9zZSIsCW9uZSAoMHgwNjQwKSwgICAgICAgICAgIG9uZSAoMHhmZmMwKSwgICAgICAgICAJe0lNTTUsIExJU1QxMiwgUjJESVNQT1NFfSwwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpc3Bvc2UiLAl0d28gKDB4MDY0MCwgMHgwMDAwKSwgICB0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtJTU01LCBMSVNUMTJ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgImxkLmIiLAl0d28gKDB4MDcwMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7RDE2LCBSMSwgUjJ9LCAJCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLmgiLAl0d28gKDB4MDcyMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQudyIsCXR3byAoMHgwNzIwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC5idSIsCXR3byAoMHgwNzgwLCAweDAwMDEpLCAgIHR3byAoMHgwN2MwLCAweDAwMDEpLCAJe0QxNl8xNiwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJsZC5odSIsCXR3byAoMHgwN2UwLCAweDAwMDEpLCAgIHR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sICAKLXsgInN0LmIiLAl0d28gKDB4MDc0MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7UjIsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0LmgiLAl0d28gKDB4MDc2MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7UjIsIEQxNl8xNSwgUjF9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3QudyIsCXR3byAoMHgwNzYwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIGJ5dGUgc3dhcC9leHRlbmQgaW5zdHJ1Y3Rpb25zICovCi17ICJ6eGIiLAlvbmUgKDB4MDA4MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAienhoIiwJb25lICgweDAwYzApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJzeGIiLAlvbmUgKDB4MDBhMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAic3hoIiwJb25lICgweDAwZTApLAkJb25lICgweGZmZTApLAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiYnNoIiwJdHdvICgweDA3ZTAsIDB4MDM0MiksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJic3ciLAl0d28gKDB4MDdlMCwgMHgwMzQwKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImhzdyIsCXR3byAoMHgwN2UwLCAweDAzNDQpLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBqdW1wIHRhYmxlIGluc3RydWN0aW9ucyAqLwoteyAic3dpdGNoIiwJb25lICgweDAwNDApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY2FsbHQiLAlvbmUgKDB4MDIwMCksCQlvbmUgKDB4ZmZjMCksIAkgICAgICAJe0k2fSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjdHJldCIsIAl0d28gKDB4MDdlMCwgMHgwMTQ0KSwJdHdvICgweGZmZmYsIDB4ZmZmZiksIAl7MH0sIAkJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBhcml0aG1ldGljIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNldGYiLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwJdHdvICgweDA3ZjAsIDB4ZmZmZiksIAl7Q0NDQywgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzIwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbW92IiwJdHdvICgweDA3ZTAsIDB4MDMwMCksCXR3byAoMHgwN2UwLCAweDA3ZTEpLCAJe01PVkNDLCBJNSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjIwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjQwKSwJdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STksIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDIyMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibXVsdSIsCXR3byAoMHgwN2UwLCAweDAyNDIpLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtVOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAiZGl2IiwJdHdvICgweDA3ZTAsIDB4MDJjMCksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2dSIsCXR3byAoMHgwN2UwLCAweDAyYzIpLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmh1IiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJT1AgICgweDAyKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi17ICJkaXZobiIsCXR3byAoMHgwN2UwLCAweDAyODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdmh1biIsCXR3byAoMHgwN2UwLCAweDAyODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdm4iLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAyYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZobiIsCXR3byAoMHgwN2UwLCAweDAxODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZodW4iLAl0d28gKDB4MDdlMCwgMHgwMTgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2biIsCXR3byAoMHgwN2UwLCAweDAxYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAxYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLSAgCi17ICJub3AiLAlvbmUgKDB4MDApLAkJb25lICgweGZmZmYpLAkJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3YiLAlPUCAgKDB4MTApLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92IiwJb25lICgweDA2MjApLAkJb25lICgweGZmZTApLAkJe0lNTTMyLCBSMV9OT1RSMH0sCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibW92IiwgICAgICAgIE9QICAoMHgwMCksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3ZlYSIsCU9QICAoMHgzMSksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92aGkiLAlPUCAgKDB4MzIpLAkJT1BfTUFTSywJCXtJMTZVLCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGQiLAlPUCAgKDB4MGUpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkIiwJT1AgICgweDEyKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZGkiLAlPUCAgKDB4MzApLAkJT1BfTUFTSywJCUlGNiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3ViIiwJT1AgICgweDBkKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN1YnIiLCAJT1AgICgweDBjKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGgiLAlPUCAgKDB4MTcpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaCIsCU9QICAoMHgwNyksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoaSIsCU9QICAoMHgzNyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21wIiwJT1AgICgweDBmKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtcCIsCU9QICAoMHgxMyksCQlPUF9NQVNLLAkJSUYyLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogc2F0dXJhdGVkIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNhdGFkZCIsCU9QICgweDExKSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdGFkZCIsCU9QICgweDA2KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YiIsCU9QICgweDA1KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YmkiLAlPUCAoMHgzMyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViciIsCU9QICgweDA0KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogbG9naWNhbCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJ0c3QiLAlPUCAoMHgwYiksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvciIsCQlPUCAoMHgwOCksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvcmkiLAlPUCAoMHgzNCksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kIiwJT1AgKDB4MGEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kaSIsCU9QICgweDM2KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3IiLAlPUCAoMHgwOSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3JpIiwJT1AgKDB4MzUpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm5vdCIsCU9QICgweDAxKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhciIsCU9QICgweDE1KSwJCU9QX01BU0ssCQl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FyIiwJdHdvICgweDA3ZTAsIDB4MDBhMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCU9QICAoMHgxNiksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCXR3byAoMHgwN2UwLCAweDAwYzApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAlPUCAgKDB4MTQpLAkJT1BfTUFTSywJICAgICAgCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAl0d28gKDB4MDdlMCwgMHgwMDgwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FzZiIsICAgICAgIHR3byAoMHgwN2UwLCAweDAyMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiYmd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJiaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiYmUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJidiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJicCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJieiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJyIiwJCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJic2EiLAlCT1AgKDB4ZCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBCcmFuY2ggbWFjcm9zLgotCi0gICBXZSB1c2UgdGhlIHNob3J0IGZvcm0gaW4gdGhlIG9wY29kZS9tYXNrIGZpZWxkcy4gIFRoZSBhc3NlbWJsZXIKLSAgIHdpbGwgdHdpZGRsZSBiaXRzIGFzIG5lY2Vzc2FyeSBpZiB0aGUgbG9uZyBmb3JtIGlzIG5lZWRlZC4gICovCi0KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiamd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJqaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiamUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJqdiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqcCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqeiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYnIiLAlCT1AgKDB4NSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLXsgImpyIiwJCW9uZSAoMHgwNzgwKSwJCXR3byAoMHhmZmMwLCAweDAwMDEpLAl7RDIyfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamFybCIsCW9uZSAoMHgwNzgwKSwJCXR3byAoMHgwN2MwLCAweDAwMDEpLAl7RDIyLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTH0sIAotCi0vKiBiaXQgbWFuaXB1bGF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2V0MSIsCXR3byAoMHgwN2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzZXQxIiwJdHdvICgweDA3ZTAsIDB4MDBlMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm5vdDEiLAl0d28gKDB4NDdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAibm90MSIsCXR3byAoMHgwN2UwLCAweDAwZTIpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbHIxIiwJdHdvICgweDg3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNscjEiLAl0d28gKDB4MDdlMCwgMHgwMGU0KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksICAge1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJ0c3QxIiwJdHdvICgweGM3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInRzdDEiLAl0d28gKDB4MDdlMCwgMHgwMGU2KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBzcGVjaWFsIGluc3RydWN0aW9ucyAqLwoteyAiZGkiLAkJdHdvICgweDA3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImVpIiwJCXR3byAoMHg4N2UwLCAweDAxNjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJoYWx0IiwJdHdvICgweDA3ZTAsIDB4MDEyMCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInJldGkiLAl0d28gKDB4MDdlMCwgMHgwMTQwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAidHJhcCIsCXR3byAoMHgwN2UwLCAweDAxMDApLAl0d28gKDB4ZmZlMCwgMHhmZmZmKSwJe0k1VX0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkc3IiLAl0d28gKDB4MDdlMCwgMHgwMDIwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMSwgU1IyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdHNyIiwJdHdvICgweDA3ZTAsIDB4MDA0MCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7U1IxLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAwLCAwLCAwLCB7MH0sIDAsIDAgfSwKLQotfSA7Ci0KLWNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mICh2ODUwX29wY29kZXMpIC8gc2l6ZW9mICh2ODUwX29wY29kZXNbMF0pOwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3ZheC1kaXMuYyBiL29wY29kZXMvdmF4LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY0MWYxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdmF4LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qIFByaW50IFZBWCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3ZheC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsCi0JCQlkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIFBBUkFNUyAoKGludCwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGNoYXIgKnJlZ19uYW1lc1tdID0KLXsKLSAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAiYXAiLCAiZnAiLCAic3AiLCAicGMiCi19OwotCi0vKiBTaWduLWV4dGVuZCBhbiAodW5zaWduZWQgY2hhcikuICovCi0jaWYgX19TVERDX18gPT0gMQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoc2lnbmVkIGNoYXIpKGNoKSkKLSNlbHNlCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChpbnQpKCgoY2gpIF4gMHg4MCkgJiAweEZGKSAtIDEyOCkKLSNlbmRpZgotCi0vKiBHZXQgYSAxIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUQllURShwKSAgXAotICAocCArPSAxLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICBDT0VSQ0VfU0lHTkVEX0NIQVIocFstMV0pKQotCi0vKiBHZXQgYSAyIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKGludCkgKCgoeCkgXiAweDgwMDApIC0gMHg4MDAwKSkKLSNkZWZpbmUgTkVYVFdPUkQocCkgIFwKLSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIENPRVJDRTE2ICgocFstMV0gPDwgOCkgKyBwWy0yXSkpCi0KLS8qIEdldCBhIDQgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTMyKHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIE5FWFRMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAoQ09FUkNFMzIgKCgoKCgocFstMV0gPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy00XSkpKQotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiAyNQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKSBpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCB0aGUgdmF4IGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3ZheCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3Qgdm90ICp2b3RwOwotICBjb25zdCBjaGFyICphcmdwID0gTlVMTDsKLSAgdW5zaWduZWQgY2hhciAqYXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgewotICAgICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7Ci0gIGZvciAodm90cCA9ICZ2b3RzdHJzWzBdOyB2b3RwLT5uYW1lWzBdOyB2b3RwKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgdmF4X29wY29kZVQgb3Bjb2RlID0gdm90cC0+ZGV0YWlsLmNvZGU7Ci0KLSAgICAgIC8qIDIgYnl0ZSBjb2RlcyBtYXRjaCAyIGJ1ZmZlciBwb3MuICovCi0gICAgICBpZiAoKGJmZF9ieXRlKSBvcGNvZGUgPT0gYnVmZmVyWzBdCi0JICAmJiAob3Bjb2RlID4+IDggPT0gMCB8fCBvcGNvZGUgPj4gOCA9PSBidWZmZXJbMV0pKQotCXsKLQkgIGFyZ3AgPSB2b3RwLT5kZXRhaWwuYXJnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChhcmdwID09IE5VTEwpCi0gICAgewotICAgICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi53b3JkIDB4JXgiLAotCQkJICAgICAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAvKiBQb2ludCBhdCBmaXJzdCBieXRlIG9mIGFyZ3VtZW50IGRhdGEsIGFuZCBhdCBkZXNjcmlwdG9yIGZvciBmaXJzdAotICAgICBhcmd1bWVudC4gICovCi0gIGFyZyA9IGJ1ZmZlciArICgodm90cC0+ZGV0YWlsLmNvZGUgPj4gOCkgPyAyIDogMSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgaXQgaW4gbWVtICovCi0gIEZFVENIX0RBVEEgKGluZm8sIGFyZyk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHZvdHAtPm5hbWUpOwotICBpZiAoKmFyZ3ApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0KLSAgd2hpbGUgKCphcmdwKQotICAgIHsKLSAgICAgIGFyZyArPSBwcmludF9pbnNuX2FyZyAoYXJncCwgYXJnLCBtZW1hZGRyICsgYXJnIC0gYnVmZmVyLCBpbmZvKTsKLSAgICAgIGFyZ3AgKz0gMjsKLSAgICAgIGlmICgqYXJncCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFyZyAtIGJ1ZmZlcjsKLX0KLQotLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IgcmV0dXJuIC0xIGlmIGFuCi0gICBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZiBhbiBvcGNvZGUgdGFiZWwgZXJyb3Igd2FzCi0gICBmb3VuZC4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIHAwLCBhZGRyLCBpbmZvKQotICAgICBjb25zdCBjaGFyICpkOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBhcmdfbGVuOwotCi0gIC8qIGNoZWNrIHZhbGlkaXR5IG9mIGFkZHJlc3NpbmcgbGVuZ3RoICovCi0gIHN3aXRjaCAoZFsxXSkKLSAgICB7Ci0gICAgY2FzZSAnYicgOiBhcmdfbGVuID0gMTsJYnJlYWs7Ci0gICAgY2FzZSAnZCcgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnZicgOiBhcmdfbGVuID0gNDsJYnJlYWs7Ci0gICAgY2FzZSAnZycgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnaCcgOiBhcmdfbGVuID0gMTY7CWJyZWFrOwotICAgIGNhc2UgJ2wnIDogYXJnX2xlbiA9IDQ7CWJyZWFrOwotICAgIGNhc2UgJ28nIDogYXJnX2xlbiA9IDE2OwlicmVhazsKLSAgICBjYXNlICd3JyA6IGFyZ19sZW4gPSAyOwlicmVhazsKLSAgICBjYXNlICdxJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBkZWZhdWx0ICA6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIGJyYW5jaGVzIGhhdmUgbm8gbW9kZSBieXRlICovCi0gIGlmIChkWzBdID09ICdiJykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0KLSAgICAgIGlmIChhcmdfbGVuID09IDEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMSArIE5FWFRCWVRFIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMiArIE5FWFRXT1JEIChwKSwgaW5mbyk7Ci0KLSAgICAgIHJldHVybiBwIC0gcDA7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuX21vZGUgKGFyZ19sZW4sIHAwLCBhZGRyLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCwgYWRkciwgaW5mbykKLSAgICAgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotICB1bnNpZ25lZCBjaGFyIG1vZGUsIHJlZzsKLQotICAvKiBmZXRjaCBhbmQgaW50ZXJwcmV0IG1vZGUgYnl0ZSAqLwotICBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIE5FWFRCWVRFIChwKTsKLSAgcmVnID0gbW9kZSAmIDB4RjsKLSAgc3dpdGNoIChtb2RlICYgMHhGMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHgxMDoKLSAgICBjYXNlIDB4MjA6Ci0gICAgY2FzZSAweDMwOiAvKiBsaXRlcmFsIG1vZGUJCQkkbnVtYmVyICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCV4IiwgbW9kZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NDA6IC8qIGluZGV4OgkJCWJhc2UtYWRkcltSbl0gKi8KLSAgICAgIHAgKz0gcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCArIDEsIGFkZHIgKyAxLCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyVzXSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg1MDogLyogcmVnaXN0ZXI6CQkJUm4gKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NjA6IC8qIHJlZ2lzdGVyIGRlZmVycmVkOgkJKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDcwOiAvKiBhdXRvZGVjcmVtZW50OgkJLShSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSglcykiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6IC8qIGF1dG9pbmNyZW1lbnQ6CQkoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JewkvKiBpbW1lZGlhdGU/ICovCi0JICBpbnQgaTsKLQotCSAgRkVUQ0hfREFUQSAoaW5mbywgcCArIHNpemUpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkMHgiKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJTAyeCIsIHBbc2l6ZSAtIGkgLSAxXSk7Ci0JICBwICs9IHNpemU7Ci0JfQotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4OTA6IC8qIGF1dG9pbmNyZW1lbnQgZGVmZXJyZWQ6CUAoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqMHgleCIsIE5FWFRMT05HIChwKSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4QjA6IC8qIGRpc3BsYWNlbWVudCBieXRlIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4QTA6IC8qIGRpc3BsYWNlbWVudCBieXRlOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVEJZVEUgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhEMDogLyogZGlzcGxhY2VtZW50IHdvcmQgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhDMDogLyogZGlzcGxhY2VtZW50IHdvcmQ6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDMgKyBORVhUV09SRCAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUV09SRCAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEYwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZyBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEUwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZzoJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgNSArIE5FWFRMT05HIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRMT05HIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LWRpcy5jIGIvb3Bjb2Rlcy93NjUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWJkNWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgV0RDIDY1ODE2IGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgInc2NS1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyAgIGZwcmludGZfZnR5cGUgZnByOwotc3RhdGljICAgdm9pZCAqc3RyZWFtOwotc3RhdGljICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmxvY2FsX2luZm87Ci0jaWYgMAotc3RhdGljIGNoYXIgKmxuYW1lW10gPSAgeyJyMCIsInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIsInI3IiwiczAifTsKLQotc3RhdGljIGNoYXIgKmZpbmRuYW1lICh2YWwpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gIGlmICh2YWwgPj0gMHgxMCAmJiB2YWwgPD0gMHgyMCkKLSAgICByZXR1cm4gbG5hbWVbKHZhbCAtIDB4MTApIC8gMl07Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZCAobG9va3VwLCBmb3JtYXQsIGFyZ3MpCi0gICAgIGludCBsb29rdXA7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgdW5zaWduZWQgICAgIGludCAqYXJnczsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKCpmb3JtYXQpCi0gICAgewotICAgICAgc3dpdGNoICggYyA9ICpmb3JtYXQrKykgCi0JewotCWNhc2UgJyQnOgotCSAgdmFsID0gYXJnc1soKmZvcm1hdCsrKSAtICcwJ107Ci0JICBpZiAobG9va3VwKSAKLQkgICAgewotI2lmIDAKLQkgICAgICBuYW1lID0gZmluZG5hbWUodmFsKTsKLQkgICAgICBpZiAobmFtZSkKLQkJZnByKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotI2VuZGlmCi0JCWxvY2FsX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBsb2NhbF9pbmZvKTsgIAotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwciAoc3RyZWFtLCAiMHgleCIsIHZhbCk7Ci0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBmcHIoc3RyZWFtLCIlYyIsIGMpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLWludCAKLXByaW50X2luc25fdzY1KG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLQotICBpbnQgc3RhdHVzID0gMDsKLSAgdW5zaWduZWQgY2hhciBpbnNuWzRdOwotICByZWdpc3RlciBzdHJ1Y3Qgb3BpbmZvICpvcDsKLSAgaW50IGk7Ci0gIGludCBYID0wOwotICBpbnQgTSA9IDA7Ci0gIGludCBhcmdzWzJdOwotc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci1sb2NhbF9pbmZvID0gICAgaW5mbzsKLSAgZm9yIChpID0gMDsgaSA8NCAmJiBzdGF0dXMgPT0gMDsgaSsrKSAKLSAgICB7Ci0gICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhtZW1hZGRyK2ksIGluc24gKyBpLCAxLCBpbmZvKTsKLSAgfQotCi0KLSAgZm9yIChvcCA9IG9wdGFibGU7IG9wLT52YWwgIT0gaW5zblswXTsgb3ArKykgCi0gICAgOwotCi0gIGZwcihzdHJlYW0sIiVzIiwgb3AtPm5hbWUpOwotICAKLSAgLyogUHJlcGFyZSBhbGwgdGhlIHBvc2libGUgb3BlcmFuZCB2YWx1ZXMgKi8KLSAgewotICAgIGludCBzaXplID0gMTsKLSAgICBpbnQgYXNSX1c2NV9BQlM4ID0gaW5zblsxXTsKLSAgICBpbnQgYXNSX1c2NV9BQlMxNiA9IChpbnNuWzJdIDw8IDgpICsgYXNSX1c2NV9BQlM4OwotICAgIGludCBhc1JfVzY1X0FCUzI0ID0gKGluc25bM10gPDwgMTYpICsgYXNSX1c2NV9BQlMxNjsKLSAgICBpbnQgYXNSX1c2NV9QQ1I4ID0gKChjaGFyKShhc1JfVzY1X0FCUzgpKSArIG1lbWFkZHIgKyAyOwotICAgIGludCBhc1JfVzY1X1BDUjE2ID0gKChzaG9ydCkoYXNSX1c2NV9BQlMxNikpICsgbWVtYWRkciArIDM7Ci0KLSAgICBzd2l0Y2ggKG9wLT5hbW9kZSkgewotICAgICAgRElTQVNNKCk7Ci0gICAgfQotCi0gIHJldHVybiBzaXplOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LW9wYy5oIGIvb3Bjb2Rlcy93NjUtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzM1MzUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotCQkJLyogV0RDIDY1ODE2IEFzc2VtYmxlciBvcGNvZGUgdGFibGUgKi8KLQkJCS8qICAgKGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBzaW0vdzY1L2dlbmNvZGUgLWEpICovCi0jZGVmaW5lIEFERFJfSU1NVE9BICAgICAgICAgICAgICAxCSAvKiAjYSAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NQ09QICAgICAgICAgICAgICAyCSAvKiAjYyAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NVE9JICAgICAgICAgICAgICAzCSAvKiAjaSAgICAgICovCi0jZGVmaW5lIEFERFJfQUNDICAgICAgICAgICAgICAgICA0CSAvKiBBICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMICAgICAgICAgICAgICA1CSAvKiByICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMX0xPTkcgICAgICAgICA2CSAvKiBybCAgICAgICovCi0jZGVmaW5lIEFERFJfSU1QTElFRCAgICAgICAgICAgICA3CSAvKiBpICAgICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0sgICAgICAgICAgICAgICA4CSAvKiBzICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSICAgICAgICAgICAgICAgICA5CSAvKiBkICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9YICAgICAgICAgICAxMAkgLyogZCx4ICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JRFhfWSAgICAgICAgICAgMTEJIC8qIGQseSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EICAgICAgICAgICAgIDEyCSAvKiAoZCkgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9JTkRfWCAgICAgICAxMwkgLyogKGQseCkgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfSURYX1kgICAgICAgMTQJIC8qIChkKSx5ICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0xPTkcgICAgICAgIDE1CSAvKiBbZF0gICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWV9MT05HICAxNgkgLyogW2RdLHkgICAqLwotI2RlZmluZSBBRERSX0FCUyAgICAgICAgICAgICAgICAgMTcJIC8qIGEgICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSURYX1ggICAgICAgICAgIDE4CSAvKiBhLHggICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lEWF9ZICAgICAgICAgICAxOQkgLyogYSx5ICAgICAqLwotI2RlZmluZSBBRERSX0FCU19MT05HICAgICAgICAgICAgMjAJIC8qIGFsICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EX0xPTkcgICAgICAgIDIxCSAvKiBbYV0gICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0xPTkdfSURYX1ggICAgICAyMgkgLyogYWwseCAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLX1JFTCAgICAgICAgICAgMjMJIC8qIGQscyAgICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDS19SRUxfSU5EWF9JRFggIDI0CSAvKiAoZCxzKSx5ICovCi0jZGVmaW5lIEFERFJfQUJTX0lORCAgICAgICAgICAgICAyNQkgLyogKGEpICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JTkRfSURYICAgICAgICAgMjYJIC8qIChhLHgpICAgKi8KLSNkZWZpbmUgQUREUl9CTE9DS19NT1ZFICAgICAgICAgIDI3CSAvKiB4eXogICAgICovCi1zdHJ1Y3Qgb3BpbmZvIHsKLQlpbnQgdmFsOwotCWludCBjb2RlOwotCWNoYXIgKm5hbWU7Ci0JaW50IGFtb2RlOwotfTsKLXN0cnVjdCBvcGluZm8gb3B0YWJsZVsyNTddPXsKLSNkZWZpbmUgT19hZGMgMQotI2RlZmluZSBPX2FuZCAyCi0jZGVmaW5lIE9fYXNsIDMKLSNkZWZpbmUgT19iY2MgNAotI2RlZmluZSBPX2JjcyA1Ci0jZGVmaW5lIE9fYmVxIDYKLSNkZWZpbmUgT19iaXQgNwotI2RlZmluZSBPX2JtaSA4Ci0jZGVmaW5lIE9fYm5lIDkKLSNkZWZpbmUgT19icGwgMTAKLSNkZWZpbmUgT19icmEgMTEKLSNkZWZpbmUgT19icmsgMTIKLSNkZWZpbmUgT19icmwgMTMKLSNkZWZpbmUgT19idmMgMTQKLSNkZWZpbmUgT19idnMgMTUKLSNkZWZpbmUgT19jbGMgMTYKLSNkZWZpbmUgT19jbGQgMTcKLSNkZWZpbmUgT19jbGkgMTgKLSNkZWZpbmUgT19jbHYgMTkKLSNkZWZpbmUgT19jbXAgMjAKLSNkZWZpbmUgT19jb3AgMjEKLSNkZWZpbmUgT19jcHggMjIKLSNkZWZpbmUgT19jcHkgMjMKLSNkZWZpbmUgT19kZWMgMjQKLSNkZWZpbmUgT19kZXggMjUKLSNkZWZpbmUgT19kZXkgMjYKLSNkZWZpbmUgT19lb3IgMjcKLSNkZWZpbmUgT19pbmMgMjgKLSNkZWZpbmUgT19pbnggMjkKLSNkZWZpbmUgT19pbnkgMzAKLSNkZWZpbmUgT19qbXAgMzEKLSNkZWZpbmUgT19qc3IgMzIKLSNkZWZpbmUgT19sZGEgMzMKLSNkZWZpbmUgT19sZHggMzQKLSNkZWZpbmUgT19sZHkgMzUKLSNkZWZpbmUgT19sc3IgMzYKLSNkZWZpbmUgT19tdm4gMzcKLSNkZWZpbmUgT19tdnAgMzgKLSNkZWZpbmUgT19ub3AgMzkKLSNkZWZpbmUgT19vcmEgNDAKLSNkZWZpbmUgT19wZWEgNDEKLSNkZWZpbmUgT19wZWkgNDIKLSNkZWZpbmUgT19wZXIgNDMKLSNkZWZpbmUgT19waGEgNDQKLSNkZWZpbmUgT19waGIgNDUKLSNkZWZpbmUgT19waGQgNDYKLSNkZWZpbmUgT19waGsgNDcKLSNkZWZpbmUgT19waHAgNDgKLSNkZWZpbmUgT19waHggNDkKLSNkZWZpbmUgT19waHkgNTAKLSNkZWZpbmUgT19wbGEgNTEKLSNkZWZpbmUgT19wbGIgNTIKLSNkZWZpbmUgT19wbGQgNTMKLSNkZWZpbmUgT19wbHAgNTQKLSNkZWZpbmUgT19wbHggNTUKLSNkZWZpbmUgT19wbHkgNTYKLSNkZWZpbmUgT19yZXAgNTcKLSNkZWZpbmUgT19yb2wgNTgKLSNkZWZpbmUgT19yb3IgNTkKLSNkZWZpbmUgT19ydGkgNjAKLSNkZWZpbmUgT19ydGwgNjEKLSNkZWZpbmUgT19ydHMgNjIKLSNkZWZpbmUgT19zYmMgNjMKLSNkZWZpbmUgT19zZWMgNjQKLSNkZWZpbmUgT19zZWQgNjUKLSNkZWZpbmUgT19zZWkgNjYKLSNkZWZpbmUgT19zZXAgNjcKLSNkZWZpbmUgT19zdGEgNjgKLSNkZWZpbmUgT19zdHAgNjkKLSNkZWZpbmUgT19zdHggNzAKLSNkZWZpbmUgT19zdHkgNzEKLSNkZWZpbmUgT19zdHogNzIKLSNkZWZpbmUgT190YXggNzMKLSNkZWZpbmUgT190YXkgNzQKLSNkZWZpbmUgT190Y2QgNzUKLSNkZWZpbmUgT190Y3MgNzYKLSNkZWZpbmUgT190ZGMgNzcKLSNkZWZpbmUgT190cmIgNzgKLSNkZWZpbmUgT190c2IgNzkKLSNkZWZpbmUgT190c2MgODAKLSNkZWZpbmUgT190c3ggODEKLSNkZWZpbmUgT190eGEgODIKLSNkZWZpbmUgT190eHMgODMKLSNkZWZpbmUgT190eHkgODQKLSNkZWZpbmUgT190eWEgODUKLSNkZWZpbmUgT190eXggODYKLSNkZWZpbmUgT193YWkgODcKLSNkZWZpbmUgT193ZG0gODgKLSNkZWZpbmUgT194YmEgODkKLSNkZWZpbmUgT194Y2UgOTAKLSNpZmRlZiBERUZJTkVfVEFCTEUKLQl7MHg2OSwJT19hZGMsCSJhZGMiLAlBRERSX0lNTVRPQX0sCi0JezB4NzIsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg3MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDczLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg2MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDY3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg3NywJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NkQsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlN9LAotCXsweDdELAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg3OSwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NkYsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4N0YsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NjUsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJ9LAotCXsweDYzLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg3NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MjksCU9fYW5kLAkiYW5kIiwJQUREUl9JTU1UT0F9LAotCXsweDMyLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORH0sCi0JezB4MzEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgzMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MjEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MzcsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDJELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTfSwKLQl7MHgzRCwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MzksCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDJGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkd9LAotCXsweDNGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDI1LAlPX2FuZCwJImFuZCIsCUFERFJfRElSfSwKLQl7MHgyMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MzUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDBBLAlPX2FzbCwJImFzbCIsCUFERFJfQUNDfSwKLQl7MHgwRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU30sCi0JezB4MUUsCU9fYXNsLAkiYXNsIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDA2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSfSwKLQl7MHgxNiwJT19hc2wsCSJhc2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OTAsCU9fYmNjLAkiYmNjIiwJQUREUl9QQ19SRUx9LAotCXsweEIwLAlPX2JjcywJImJjcyIsCUFERFJfUENfUkVMfSwKLQl7MHhGMCwJT19iZXEsCSJiZXEiLAlBRERSX1BDX1JFTH0sCi0JezB4ODksCU9fYml0LAkiYml0IiwJQUREUl9JTU1UT0F9LAotCXsweDI0LAlPX2JpdCwJImJpdCIsCUFERFJfRElSX0lORH0sCi0JezB4MzQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU30sCi0JezB4M0MsCU9fYml0LAkiYml0IiwJQUREUl9BQlNfSURYX1h9LAotCXsweDMwLAlPX2JtaSwJImJtaSIsCUFERFJfUENfUkVMfSwKLQl7MHhEMCwJT19ibmUsCSJibmUiLAlBRERSX1BDX1JFTH0sCi0JezB4MTAsCU9fYnBsLAkiYnBsIiwJQUREUl9QQ19SRUx9LAotCXsweDgwLAlPX2JyYSwJImJyYSIsCUFERFJfUENfUkVMfSwKLQl7MHgwMCwJT19icmssCSJicmsiLAlBRERSX1NUQUNLfSwKLQl7MHg4MiwJT19icmwsCSJicmwiLAlBRERSX1BDX1JFTF9MT05HfSwKLQl7MHg1MCwJT19idmMsCSJidmMiLAlBRERSX1BDX1JFTH0sCi0JezB4NzAsCU9fYnZzLAkiYnZzIiwJQUREUl9QQ19SRUx9LAotCXsweDE4LAlPX2NsYywJImNsYyIsCUFERFJfSU1QTElFRH0sCi0JezB4RDgsCU9fY2xkLAkiY2xkIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1OCwJT19jbGksCSJjbGkiLAlBRERSX0lNUExJRUR9LAotCXsweEI4LAlPX2NsdiwJImNsdiIsCUFERFJfSU1QTElFRH0sCi0JezB4QzksCU9fY21wLAkiY21wIiwJQUREUl9JTU1UT0F9LAotCXsweEQyLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORH0sCi0JezB4RDEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHhEMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4QzEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHhDNywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4RDcsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweENELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTfSwKLQl7MHhERCwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RDksCU9fY21wLAkiY21wIiwJQUREUl9BQlNfSURYX1l9LAotCXsweENGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweERGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweEM1LAlPX2NtcCwJImNtcCIsCUFERFJfRElSfSwKLQl7MHhDMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4RDUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDAyLAlPX2NvcCwJImNvcCIsCUFERFJfSU1NQ09QfSwKLQl7MHhFMCwJT19jcHgsCSJjcHgiLAlBRERSX0lNTVRPSX0sCi0JezB4RUMsCU9fY3B4LAkiY3B4IiwJQUREUl9BQlN9LAotCXsweEU0LAlPX2NweCwJImNweCIsCUFERFJfRElSfSwKLQl7MHhDMCwJT19jcHksCSJjcHkiLAlBRERSX0lNTVRPSX0sCi0JezB4Q0MsCU9fY3B5LAkiY3B5IiwJQUREUl9BQlN9LAotCXsweEM0LAlPX2NweSwJImNweSIsCUFERFJfRElSfSwKLQl7MHgzQSwJT19kZWMsCSJkZWMiLAlBRERSX0FDQ30sCi0JezB4Q0UsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlN9LAotCXsweERFLAlPX2RlYywJImRlYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhDNiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUn0sCi0JezB4RDYsCU9fZGVjLAkiZGVjIiwJQUREUl9ESVJfSURYX1h9LAotCXsweENBLAlPX2RleCwJImRleCIsCUFERFJfSU1QTElFRH0sCi0JezB4ODgsCU9fZGV5LAkiZGV5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg0OSwJT19lb3IsCSJlb3IiLAlBRERSX0lNTVRPQX0sCi0JezB4NTIsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg1MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDUzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg0MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDQ3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg1NywJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NEQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlN9LAotCXsweDVELAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg1OSwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NEYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR30sCi0JezB4NUYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NDUsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJ9LAotCXsweDQzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg1NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MUEsCU9faW5jLAkiaW5jIiwJQUREUl9BQ0N9LAotCXsweEVFLAlPX2luYywJImluYyIsCUFERFJfQUJTfSwKLQl7MHhGRSwJT19pbmMsCSJpbmMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RTYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJ9LAotCXsweEY2LAlPX2luYywJImluYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhFOCwJT19pbngsCSJpbngiLAlBRERSX0lNUExJRUR9LAotCXsweEM4LAlPX2lueSwJImlueSIsCUFERFJfSU1QTElFRH0sCi0JezB4NkMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EfSwKLQl7MHg3QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfSURYfSwKLQl7MHhEQywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfTE9OR30sCi0JezB4NEMsCU9fam1wLAkiam1wIiwJQUREUl9BQlN9LAotCXsweDVDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweEZDLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0lORF9JRFh9LAotCXsweDIwLAlPX2pzciwJImpzciIsCUFERFJfQUJTfSwKLQl7MHgyMiwJT19qc3IsCSJqc3IiLAlBRERSX0FCU19MT05HfSwKLQl7MHhBOSwJT19sZGEsCSJsZGEiLAlBRERSX0lNTVRPQX0sCi0JezB4QjIsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhCMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEIzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhBMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEE3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhCNywJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4QUQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlN9LAotCXsweEJELAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhCOSwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QUYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4QkYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4QTUsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJ9LAotCXsweEEzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhCNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4QTIsCU9fbGR4LAkibGR4IiwJQUREUl9JTU1UT0l9LAotCXsweEFFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTfSwKLQl7MHhCRSwJT19sZHgsCSJsZHgiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QTYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJ9LAotCXsweEI2LAlPX2xkeCwJImxkeCIsCUFERFJfRElSX0lEWF9ZfSwKLQl7MHhBMCwJT19sZHksCSJsZHkiLAlBRERSX0lNTVRPSX0sCi0JezB4QUMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlN9LAotCXsweEJDLAlPX2xkeSwJImxkeSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhBNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUn0sCi0JezB4QjQsCU9fbGR5LAkibGR5IiwJQUREUl9ESVJfSURYX1h9LAotCXsweDRBLAlPX2xzciwJImxzciIsCUFERFJfQUNDfSwKLQl7MHg0RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU30sCi0JezB4NUUsCU9fbHNyLAkibHNyIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDQ2LAlPX2xzciwJImxzciIsCUFERFJfRElSfSwKLQl7MHg1NiwJT19sc3IsCSJsc3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NTQsCU9fbXZuLAkibXZuIiwJQUREUl9CTE9DS19NT1ZFfSwKLQl7MHg0NCwJT19tdnAsCSJtdnAiLAlBRERSX0JMT0NLX01PVkV9LAotCXsweEVBLAlPX25vcCwJIm5vcCIsCUFERFJfSU1QTElFRH0sCi0JezB4MDksCU9fb3JhLAkib3JhIiwJQUREUl9JTU1UT0F9LAotCXsweDEyLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORH0sCi0JezB4MTEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgxMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MDEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgwNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MTcsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDBELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTfSwKLQl7MHgxRCwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MTksCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDBGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDFGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDA1LAlPX29yYSwJIm9yYSIsCUFERFJfRElSfSwKLQl7MHgwMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MTUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEY0LAlPX3BlYSwJInBlYSIsCUFERFJfQUJTfSwKLQl7MHhENCwJT19wZWksCSJwZWkiLAlBRERSX0RJUn0sCi0JezB4NjIsCU9fcGVyLAkicGVyIiwJQUREUl9QQ19SRUxfTE9OR30sCi0JezB4NDgsCU9fcGhhLAkicGhhIiwJQUREUl9TVEFDS30sCi0JezB4OEIsCU9fcGhiLAkicGhiIiwJQUREUl9TVEFDS30sCi0JezB4MEIsCU9fcGhkLAkicGhkIiwJQUREUl9TVEFDS30sCi0JezB4NEIsCU9fcGhrLAkicGhrIiwJQUREUl9TVEFDS30sCi0JezB4MDgsCU9fcGhwLAkicGhwIiwJQUREUl9TVEFDS30sCi0JezB4REEsCU9fcGh4LAkicGh4IiwJQUREUl9TVEFDS30sCi0JezB4NUEsCU9fcGh5LAkicGh5IiwJQUREUl9TVEFDS30sCi0JezB4NjgsCU9fcGxhLAkicGxhIiwJQUREUl9TVEFDS30sCi0JezB4QUIsCU9fcGxiLAkicGxiIiwJQUREUl9TVEFDS30sCi0JezB4MkIsCU9fcGxkLAkicGxkIiwJQUREUl9TVEFDS30sCi0JezB4MjgsCU9fcGxwLAkicGxwIiwJQUREUl9TVEFDS30sCi0JezB4RkEsCU9fcGx4LAkicGx4IiwJQUREUl9TVEFDS30sCi0JezB4N0EsCU9fcGx5LAkicGx5IiwJQUREUl9TVEFDS30sCi0JezB4QzIsCU9fcmVwLAkicmVwIiwJQUREUl9JTU1DT1B9LAotCXsweDJBLAlPX3JvbCwJInJvbCIsCUFERFJfQUNDfSwKLQl7MHgyRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU30sCi0JezB4M0UsCU9fcm9sLAkicm9sIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDI2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSfSwKLQl7MHgzNiwJT19yb2wsCSJyb2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NkEsCU9fcm9yLAkicm9yIiwJQUREUl9BQ0N9LAotCXsweDZFLAlPX3JvciwJInJvciIsCUFERFJfQUJTfSwKLQl7MHg3RSwJT19yb3IsCSJyb3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NjYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJ9LAotCXsweDc2LAlPX3JvciwJInJvciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg0MCwJT19ydGksCSJydGkiLAlBRERSX1NUQUNLfSwKLQl7MHg2QiwJT19ydGwsCSJydGwiLAlBRERSX1NUQUNLfSwKLQl7MHg2MCwJT19ydHMsCSJydHMiLAlBRERSX1NUQUNLfSwKLQl7MHhFOSwJT19zYmMsCSJzYmMiLAlBRERSX0lNTVRPQX0sCi0JezB4RjIsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhGMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEYzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhFMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEU3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhGNywJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4RUQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlN9LAotCXsweEZELAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhGOSwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4RUYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4RkYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4RTUsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJ9LAotCXsweEUzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhGNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MzgsCU9fc2VjLAkic2VjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGOCwJT19zZWQsCSJzZWQiLAlBRERSX0lNUExJRUR9LAotCXsweDc4LAlPX3NlaSwJInNlaSIsCUFERFJfSU1QTElFRH0sCi0JezB4RTIsCU9fc2VwLAkic2VwIiwJQUREUl9JTU1DT1B9LAotCXsweDkyLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORH0sCi0JezB4OTEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHg5MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4ODEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHg4NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4OTcsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDhELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTfSwKLQl7MHg5RCwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4OTksCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDhGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDlGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDg1LAlPX3N0YSwJInN0YSIsCUFERFJfRElSfSwKLQl7MHg4MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4OTUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweERCLAlPX3N0cCwJInN0cCIsCUFERFJfSU1QTElFRH0sCi0JezB4OEUsCU9fc3R4LAkic3R4IiwJQUREUl9BQlN9LAotCXsweDg2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSfSwKLQl7MHg5NiwJT19zdHgsCSJzdHgiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OEMsCU9fc3R5LAkic3R5IiwJQUREUl9BQlN9LAotCXsweDg0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSfSwKLQl7MHg5NCwJT19zdHksCSJzdHkiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OUMsCU9fc3R6LAkic3R6IiwJQUREUl9BQlN9LAotCXsweDlFLAlPX3N0eiwJInN0eiIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg2NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUn0sCi0JezB4NzQsCU9fc3R6LAkic3R6IiwJQUREUl9ESVJfSURYX1h9LAotCXsweEFBLAlPX3RheCwJInRheCIsCUFERFJfSU1QTElFRH0sCi0JezB4QTgsCU9fdGF5LAkidGF5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1QiwJT190Y2QsCSJ0Y2QiLAlBRERSX0lNUExJRUR9LAotCXsweDFCLAlPX3RjcywJInRjcyIsCUFERFJfSU1QTElFRH0sCi0JezB4N0IsCU9fdGRjLAkidGRjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgxQywJT190cmIsCSJ0cmIiLAlBRERSX0FCU30sCi0JezB4MTQsCU9fdHJiLAkidHJiIiwJQUREUl9ESVJ9LAotCXsweDBDLAlPX3RzYiwJInRzYiIsCUFERFJfQUJTfSwKLQl7MHgwNCwJT190c2IsCSJ0c2IiLAlBRERSX0RJUn0sCi0JezB4M0IsCU9fdHNjLAkidHNjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCQSwJT190c3gsCSJ0c3giLAlBRERSX0lNUExJRUR9LAotCXsweDhBLAlPX3R4YSwJInR4YSIsCUFERFJfSU1QTElFRH0sCi0JezB4OUEsCU9fdHhzLAkidHhzIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5QiwJT190eHksCSJ0eHkiLAlBRERSX0lNUExJRUR9LAotCXsweDk4LAlPX3R5YSwJInR5YSIsCUFERFJfSU1QTElFRH0sCi0JezB4QkIsCU9fdHl4LAkidHl4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDQiwJT193YWksCSJ3YWkiLAlBRERSX0lNUExJRUR9LAotCXsweDQyLAlPX3dkbSwJIndkbSIsCUFERFJfSU1QTElFRH0sCi0JezB4RUIsCU9feGJhLAkieGJhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGQiwJT194Y2UsCSJ4Y2UiLAlBRERSX0lNUExJRUR9LAotCXsgMCB9Ci19OwotI2VuZGlmCi0jZGVmaW5lIERJU0FTTSgpXAotICBjYXNlIEFERFJfSU1NVE9BOlwKLQlhcmdzWzBdID0gTT09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gTT09MCA/IDI6MTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1NQ09QOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0lNTVRPSTpcCi0JYXJnc1swXSA9IFg9PTAgPyBhc1JfVzY1X0FCUzE2IDogYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IFg9PTAgPyAyOjE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FDQzpcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIglhIiwgMCk7XAotCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9QQ1I4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjE2O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1QTElFRDpcCi0JCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0s6XAotCQlzaXplICs9IDA7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUjpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lEWF9JTkRfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwLHgpIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwKSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVskMF0iLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAseSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMyNDtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk+JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAzO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVs+JDBdIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCT4kMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMztcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0tfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwLHMiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJKCQwLHMpLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoJDApIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lORF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSgkMCx4KSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0JMT0NLX01PVkU6XAotCWFyZ3NbMF0gPSAoYXNSX1c2NV9BQlMxNiA+PjgpICYweGZmO1wKLQlhcmdzWzFdID0gKCBhc1JfVzY1X0FCUzE2ICYgMHhmZik7XAotCXByaW50X29wZXJhbmQgKDAsIgkkMCwkMSIsYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotCi0jZGVmaW5lIEdFVElORk8oc2l6ZSx0eXBlLHBjcmVsKVwKLQljYXNlIEFERFJfSU1NVE9BOiBzaXplID0gTT09MCA/IDI6MTt0eXBlPU09PTAgPyBSX1c2NV9BQlMxNiA6IFJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNTUNPUDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9JTU1UT0k6IHNpemUgPSBYPT0wID8gMjoxO3R5cGU9WD09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUNDOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9QQ19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfUENSODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfUENfUkVMX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfUENSMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNUExJRUQ6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVI6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9YOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfSU5EX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWV9MT05HOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCUzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lEWF9YOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSURYX1k6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSU5EX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HX0lEWF9YOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDS19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkQ6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkRfSURYOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9CTE9DS19NT1ZFOiBzaXplID0gMjt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1kaXMuYyBiL29wY29kZXMvejhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBmOWQzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIHo4MDAwIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIno4ay1vcGMuaCIKLQotDAotI2luY2x1ZGUgPHNldGptcC5oPgotCi0MCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGVzZSBhcmUgYWxsIGluZGV4ZWQgYnkgbmliYmxlIG51bWJlciAoaS5lIG9ubHkgZXZlcnkgb3RoZXIgZW50cnkKLSAgICAgb2YgYnl0ZXMgaXMgdXNlZCwgYW5kIGV2ZXJ5IDR0aCBlbnRyeSBvZiB3b3JkcykuICAqLwotICB1bnNpZ25lZCBjaGFyIG5pYmJsZXNbMjRdOwotICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzI0XTsKLSAgdW5zaWduZWQgc2hvcnQgd29yZHNbMjRdOwotCi0gIC8qIE5pYmJsZSBudW1iZXIgb2YgZmlyc3Qgd29yZCBub3QgeWV0IGZldGNoZWQuICAqLwotICBpbnQgbWF4X2ZldGNoZWQ7Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotCi0gIGxvbmcgdGFibF9pbmRleDsKLSAgY2hhciBpbnN0cl9hc21zcmNbODBdOwotICB1bnNpZ25lZCBsb25nIGFyZ19yZWdbMHgwZl07Ci0gIHVuc2lnbmVkIGxvbmcgaW1tZWRpYXRlOwotICB1bnNpZ25lZCBsb25nIGRpc3BsYWNlbWVudDsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotICB1bnNpZ25lZCBsb25nIGNvbmRfY29kZTsKLSAgdW5zaWduZWQgbG9uZyBjdHJsX2NvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHVuc2lnbmVkIGxvbmcgaW50ZXJydXB0czsKLX0KLWluc3RyX2RhdGFfczsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgbmliYmxlKSBcCi0gICgobmliYmxlKSA8ICgoaW5zdHJfZGF0YV9zICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChuaWJibGUpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgbmliYmxlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG5pYmJsZTsKLXsKLSAgdW5zaWduZWQgY2hhciBteWJ1ZlsyMF07Ci0gIGludCBzdGF0dXM7Ci0gIGluc3RyX2RhdGFfcyAqcHJpdiA9IChpbnN0cl9kYXRhX3MgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0KLSAgaWYgKChuaWJibGUgJSA0KSAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHByaXYtPmluc25fc3RhcnQsCi0JCQkJICAgICAgKGJmZF9ieXRlICopIG15YnVmLAotCQkJCSAgICAgIG5pYmJsZSAvIDIsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwcml2LT5pbnNuX3N0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLQotICB7Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqcCA9IG15YnVmIDsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmliYmxlOykKLSAgICAgIHsKLQlwcml2LT53b3Jkc1tpXSA9IChwWzBdIDw8IDgpIHwgcFsxXTsKLQkKLQlwcml2LT5ieXRlc1tpXSA9ICpwOwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwID4+IDQ7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgJjB4ZjsKLQotCSsrcDsKLQlwcml2LT5ieXRlc1tpXSA9ICpwOwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwID4+IDQ7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgJiAweGY7Ci0KLQkrK3A7Ci0gICAgICB9Ci0gIH0KLSAgcHJpdi0+bWF4X2ZldGNoZWQgPSBuaWJibGU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqY29kZXNbMTZdID0KLXsKLSAgImYiLAotICAibHQiLAotICAibGUiLAotICAidWxlIiwKLSAgIm92L3BlIiwKLSAgIm1pIiwKLSAgImVxIiwKLSAgImMvdWx0IiwKLSAgInQiLAotICAiZ2UiLAotICAiZ3QiLAotICAidWd0IiwKLSAgIm5vdi9wbyIsCi0gICJwbCIsCi0gICJuZSIsCi0gICJuYy91Z2UiCi19OwotCi1pbnQgejhrX2xvb2t1cF9pbnN0ciBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyKiwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdHIKLSAgUEFSQU1TICgoaW5zdHJfZGF0YV9zICosIHVuc2lnbmVkIGxvbmcsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgdW5wYWNrX2luc3RyIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqLCBpbnQsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgdW5wYXJzZV9pbnN0ciBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgaXNfc2VnbWVudGVkKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBpc19zZWdtZW50ZWQ7Ci17Ci0gIGluc3RyX2RhdGFfcyBpbnN0cl9kYXRhOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZpbnN0cl9kYXRhOwotICBpbnN0cl9kYXRhLm1heF9mZXRjaGVkID0gMDsKLSAgaW5zdHJfZGF0YS5pbnNuX3N0YXJ0ID0gYWRkcjsKLSAgaWYgKHNldGptcCAoaW5zdHJfZGF0YS5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIGluc3RyX2RhdGEudGFibF9pbmRleCA9IHo4a19sb29rdXBfaW5zdHIgKGluc3RyX2RhdGEubmliYmxlcywgaW5mbyk7Ci0gIGlmIChpbnN0cl9kYXRhLnRhYmxfaW5kZXggPiAwKQotICAgIHsKLSAgICAgIHVucGFja19pbnN0ciAoJmluc3RyX2RhdGEsIGlzX3NlZ21lbnRlZCwgaW5mbyk7Ci0gICAgICB1bnBhcnNlX2luc3RyICgmaW5zdHJfZGF0YSk7Ci0gICAgICBvdXRwdXRfaW5zdHIgKCZpbnN0cl9kYXRhLCBhZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiB6OGtfdGFibGVbaW5zdHJfZGF0YS50YWJsX2luZGV4XS5sZW5ndGg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgNCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi53b3JkICUwMnglMDJ4IiwKLQkJCSAgICAgaW5zdHJfZGF0YS5ieXRlc1swXSwgaW5zdHJfZGF0YS5ieXRlc1syXSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci19Ci0KLWludAotcHJpbnRfaW5zbl96ODAwMSAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIDEpOwotfQotCi1pbnQKLXByaW50X2luc25fejgwMDIgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCAwKTsKLX0KLQotaW50Ci16OGtfbG9va3VwX2luc3RyIChuaWJibGVzLCBpbmZvKQotICAgICB1bnNpZ25lZCBjaGFyICpuaWJibGVzOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotCi0gIGludCBuaWJsX2luZGV4LCB0YWJsX2luZGV4OwotICBpbnQgbmlibF9tYXRjaGVkOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0cl9uaWJsOwotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0KLSAgbmlibF9tYXRjaGVkID0gMDsKLSAgdGFibF9pbmRleCA9IDA7Ci0gIHdoaWxlICghbmlibF9tYXRjaGVkICYmIHo4a190YWJsZVt0YWJsX2luZGV4XS5uYW1lKQotICAgIHsKLSAgICAgIG5pYmxfbWF0Y2hlZCA9IDE7Ci0gICAgICBmb3IgKG5pYmxfaW5kZXggPSAwOyBuaWJsX2luZGV4IDwgejhrX3RhYmxlW3RhYmxfaW5kZXhdLmxlbmd0aCAqIDIgJiYgbmlibF9tYXRjaGVkOyBuaWJsX2luZGV4KyspCi0JewotCSAgaWYgKChuaWJsX2luZGV4ICUgNCkgPT0gMCkKLQkgICAgLyogRmV0Y2ggb25lIHdvcmQgYXQgYSB0aW1lLiAgKi8KLQkgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9pbmRleCArIDQpOwotCSAgaW5zdHJfbmlibCA9IG5pYmJsZXNbbmlibF9pbmRleF07Ci0KLQkgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbdGFibF9pbmRleF0uYnl0ZV9pbmZvW25pYmxfaW5kZXhdOwotCSAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLQkgIGRhdHVtX3ZhbHVlID0gfkNMQVNTX01BU0sgJiB0YWJsX2RhdHVtOwotCi0JICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ0xBU1NfQklUOgotCSAgICAgIGlmIChkYXR1bV92YWx1ZSAhPSBpbnN0cl9uaWJsKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzAwSUk6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4NCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMDFJSToKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg0KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wQ0NDOgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzFDQ0M6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMERJU1A3OgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIG5pYmxfaW5kZXggKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18xRElTUDc6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgbmlibF9pbmRleCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTX1JFR04wOgotCSAgICAgIGlmIChpbnN0cl9uaWJsID09IDApCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfQklUXzFPUjI6Ci0JICAgICAgaWYgKChpbnN0cl9uaWJsIHwgMHgyKSAhPSAoZGF0dW1fdmFsdWUgfCAweDIpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG5pYmxfbWF0Y2hlZCkKLQl7Ci0JICByZXR1cm4gdGFibF9pbmRleDsKLQl9Ci0KLSAgICAgIHRhYmxfaW5kZXgrKzsKLSAgICB9Ci0gIHJldHVybiAtMTsKLQotfQotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc3RyIChpbnN0cl9kYXRhLCBhZGRyLCBpbmZvKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGxvb3AsIGxvb3BfbGltaXQ7Ci0gIGNoYXIgdG1wX3N0clsyMF07Ci0gIGNoYXIgb3V0X3N0clsxMDBdOwotCi0gIHN0cmNweSAob3V0X3N0ciwgIlx0Iik7Ci0KLSAgbG9vcF9saW1pdCA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5sZW5ndGggKiAyOwotICBGRVRDSF9EQVRBIChpbmZvLCBsb29wX2xpbWl0KTsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGxvb3BfbGltaXQ7IGxvb3ArKykKLSAgICB7Ci0gICAgICBzcHJpbnRmICh0bXBfc3RyLCAiJXgiLCBpbnN0cl9kYXRhLT5uaWJibGVzW2xvb3BdKTsKLSAgICAgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0gICAgfQotCi0gIHdoaWxlIChsb29wKysgPCA4KQotICAgIHsKLSAgICAgIHN0cmNhdCAob3V0X3N0ciwgIiAiKTsKLSAgICB9Ci0KLSAgc3RyY2F0IChvdXRfc3RyLCBpbnN0cl9kYXRhLT5pbnN0cl9hc21zcmMpOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvdXRfc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXVucGFja19pbnN0ciAoaW5zdHJfZGF0YSwgaXNfc2VnbWVudGVkLCBpbmZvKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci0gICAgIGludCBpc19zZWdtZW50ZWQ7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBuaWJsX2NvdW50LCBsb29wOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0cl9uaWJsLCBpbnN0cl9ieXRlLCBpbnN0cl93b3JkOwotICBsb25nIGluc3RyX2xvbmc7Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLQotICBuaWJsX2NvdW50ID0gMDsKLSAgbG9vcCA9IDA7Ci0gIHdoaWxlICh6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYnl0ZV9pbmZvW2xvb3BdICE9IDApCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDQgLSAobmlibF9jb3VudCAlIDQpKTsKLSAgICAgIGluc3RyX25pYmwgPSBpbnN0cl9kYXRhLT5uaWJibGVzW25pYmxfY291bnRdOwotICAgICAgaW5zdHJfYnl0ZSA9IGluc3RyX2RhdGEtPmJ5dGVzW25pYmxfY291bnRdOwotICAgICAgaW5zdHJfd29yZCA9IGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdOwotCi0gICAgICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmJ5dGVfaW5mb1tsb29wXTsKLSAgICAgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0gICAgICBkYXR1bV92YWx1ZSA9IHRhYmxfZGF0dW0gJiB+Q0xBU1NfTUFTSzsKLQotICAgICAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQl7Ci0JY2FzZSBDTEFTU19YOgotCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JBOgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQlg6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBzd2l0Y2ggKGRhdHVtX3ZhbHVlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJHX0RJU1AxNjoKLQkgICAgICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfRElTUDEyOgotCSAgICAgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX3dvcmQgJiAweDBmZmY7Ci0JICAgICAgbmlibF9jb3VudCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIHN3aXRjaCAoZGF0dW1fdmFsdWUpCi0JICAgIHsKLQkgICAgY2FzZSBBUkdfSU1NNDoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19OSU04OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9ICgtaW5zdHJfYnl0ZSk7Ci0JICAgICAgbmlibF9jb3VudCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU04OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX2J5dGU7Ci0JICAgICAgbmlibF9jb3VudCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0xNjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMzI6Ci0JICAgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDgpOwotCSAgICAgIGluc3RyX2xvbmcgPSAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF0gPDwgMTYpCi0JCXwgKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnQgKyA0XSk7Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbG9uZzsKLQkgICAgICBuaWJsX2NvdW50ICs9IDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTU46Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCAtIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTRNMToKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsICsgMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NXzE6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NXzI6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ1RSTDoKLQkgIGluc3RyX2RhdGEtPmN0cmxfY29kZSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RBOgotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIGlmIChpc19zZWdtZW50ZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zdHJfbmlibCAmIDB4OCkKLQkJewotCQkgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA4KTsKLQkJICBpbnN0cl9sb25nID0gKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdIDw8IDE2KQotCQkgICAgfCAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudCArIDRdKTsKLQkJICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gKChpbnN0cl93b3JkICYgMHg3ZjAwKSA8PCA4KSArCi0JCSAgICAoaW5zdHJfbG9uZyAmIDB4ZmZmZik7Ci0JCSAgbmlibF9jb3VudCArPSA3OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9ICgoaW5zdHJfd29yZCAmIDB4N2YwMCkgPDwgOCkgKwotCQkgICAgKGluc3RyX3dvcmQgJiAweDAwZmYpOwotCQkgIG5pYmxfY291bnQgKz0gMzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMENDQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmwgJiAweDc7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzFDQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsICYgMHg3OwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wRElTUDc6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9ieXRlICYgMHg3ZjsKLQkgIG5pYmxfY291bnQgKz0gMTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMURJU1A3OgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfYnl0ZSAmIDB4N2Y7Ci0JICBuaWJsX2NvdW50ICs9IDE7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzAxSUk6Ci0JICBpbnN0cl9kYXRhLT5pbnRlcnJ1cHRzID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMDBJSToKLQkgIGluc3RyX2RhdGEtPmludGVycnVwdHMgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CSVQ6Ci0JICAvKiBkbyBub3RoaW5nICovCi0JICBicmVhazsKLQljYXNlIENMQVNTX0lSOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19GTEFHUzoKLQkgIGluc3RyX2RhdGEtPmZsYWdzID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsb29wICs9IDE7Ci0gICAgICBuaWJsX2NvdW50ICs9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdW5wYXJzZV9pbnN0ciAoaW5zdHJfZGF0YSkKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotewotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0gIGludCBsb29wLCBsb29wX2xpbWl0OwotICBjaGFyIG91dF9zdHJbODBdLCB0bXBfc3RyWzI1XTsKLQotICBzcHJpbnRmIChvdXRfc3RyLCAiXHQlc1x0IiwgejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLm5hbWUpOwotCi0gIGxvb3BfbGltaXQgPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubm9wZXJhbmRzOwotICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9saW1pdDsgbG9vcCsrKQotICAgIHsKLSAgICAgIGlmIChsb29wKQotCXN0cmNhdCAob3V0X3N0ciwgIiwiKTsKLQotICAgICAgdGFibF9kYXR1bSA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5hcmdfaW5mb1tsb29wXTsKLSAgICAgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0gICAgICBkYXR1bV92YWx1ZSA9IHRhYmxfZGF0dW0gJiB+Q0xBU1NfTUFTSzsKLQotICAgICAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQl7Ci0JY2FzZSBDTEFTU19YOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseChSJWxkKSIsIGluc3RyX2RhdGEtPmFkZHJlc3MsCi0JCSAgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JBOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQoIyVseCkiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSwKLQkJICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JYOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQoUiVsZCkiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSwKLQkJICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tBUkdfUlhdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JTU06Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmltbWVkaWF0ZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIlcyIsIGNvZGVzW2luc3RyX2RhdGEtPmNvbmRfY29kZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ1RSTDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgiLCBpbnN0cl9kYXRhLT5jdHJsX2NvZGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfREE6Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5hZGRyZXNzKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lSOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIkBSJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRkxBR1M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4IiwgaW5zdHJfZGF0YS0+ZmxhZ3MpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JICBpZiAoaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPj0gMHg4KQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAodG1wX3N0ciwgInJsJWxkIiwKLQkJICAgICAgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdIC0gMHg4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAodG1wX3N0ciwgInJoJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgICB9Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAicnElbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyciVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzdHJjcHkgKGluc3RyX2RhdGEtPmluc3RyX2FzbXNyYywgb3V0X3N0cik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1vcGMuaCBiL29wY29kZXMvejhrLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzlhM2EzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQzOCArMCwwIEBACi0JCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi8KLSNkZWZpbmUgQVJHX01BU0sgMHgwZgotI2RlZmluZSBBUkdfU1JDIDB4MDEKLSNkZWZpbmUgQVJHX0RTVCAweDAyCi0jZGVmaW5lIEFSR19SUyAweDAxCi0jZGVmaW5lIEFSR19SRCAweDAyCi0jZGVmaW5lIEFSR19SQSAweDAzCi0jZGVmaW5lIEFSR19SQiAweDA0Ci0jZGVmaW5lIEFSR19SUiAweDA1Ci0jZGVmaW5lIEFSR19SWCAweDA2Ci0jZGVmaW5lIEFSR19JTU00IDB4MDEKLSNkZWZpbmUgQVJHX0lNTTggMHgwMgotI2RlZmluZSBBUkdfSU1NMTYgMHgwMwotI2RlZmluZSBBUkdfSU1NMzIgMHgwNAotI2RlZmluZSBBUkdfSU1NTiAweDA1Ci0jZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDUKLSNkZWZpbmUgQVJHX0lNTV8xIDB4MDYKLSNkZWZpbmUgQVJHX0lNTV8yIDB4MDcKLSNkZWZpbmUgQVJHX0RJU1AxNiAweDA4Ci0jZGVmaW5lIEFSR19OSU04IDB4MDkKLSNkZWZpbmUgQVJHX0lNTTIgMHgwYQotI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiCi0jZGVmaW5lIEFSR19ESVNQMTIgMHgwYgotI2RlZmluZSBBUkdfRElTUDggMHgwYwotI2RlZmluZSBBUkdfSU1NNE0xIDB4MGQKLSNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwCi0jZGVmaW5lIENMQVNTX1ggMHgxMAotI2RlZmluZSBDTEFTU19CQSAweDIwCi0jZGVmaW5lIENMQVNTX0RBIDB4MzAKLSNkZWZpbmUgQ0xBU1NfQlggMHg0MAotI2RlZmluZSBDTEFTU19ESVNQIDB4NTAKLSNkZWZpbmUgQ0xBU1NfSU1NIDB4NjAKLSNkZWZpbmUgQ0xBU1NfQ0MgMHg3MAotI2RlZmluZSBDTEFTU19DVFJMIDB4ODAKLSNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwCi0jZGVmaW5lIENMQVNTXzBDQ0MgMHhlMAotI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjAKLSNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwCi0jZGVmaW5lIENMQVNTXzFESVNQNyAweDIwMAotI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwCi0jZGVmaW5lIENMQVNTXzAwSUkgMHg0MDAKLSNkZWZpbmUgQ0xBU1NfQklUIDB4NTAwCi0jZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwCi0jZGVmaW5lIENMQVNTX0lSIDB4NzAwCi0jZGVmaW5lIENMQVNTX0RJU1A4IDB4ODAwCi0jZGVmaW5lIENMQVNTX0JJVF8xT1IyIDB4OTAwCi0jZGVmaW5lIENMQVNTX1JFRyAweDcwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwCi0jZGVmaW5lIENMQVNTX1JFR19XT1JEIDB4MzAwMAotI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwCi0jZGVmaW5lIENMQVNTX1JFR04wIDB4ODAwMAotI2RlZmluZSBDTEFTU19QUiAweDEwMDAwCi0jZGVmaW5lIE9QQ19hZGMgMAotI2RlZmluZSBPUENfYWRjYiAxCi0jZGVmaW5lIE9QQ19hZGQgMgotI2RlZmluZSBPUENfYWRkYiAzCi0jZGVmaW5lIE9QQ19hZGRsIDQKLSNkZWZpbmUgT1BDX2FuZCA1Ci0jZGVmaW5lIE9QQ19hbmRiIDYKLSNkZWZpbmUgT1BDX2JpdCA3Ci0jZGVmaW5lIE9QQ19iaXRiIDgKLSNkZWZpbmUgT1BDX2NhbGwgOQotI2RlZmluZSBPUENfY2FsciAxMAotI2RlZmluZSBPUENfY2xyIDExCi0jZGVmaW5lIE9QQ19jbHJiIDEyCi0jZGVmaW5lIE9QQ19jb20gMTMKLSNkZWZpbmUgT1BDX2NvbWIgMTQKLSNkZWZpbmUgT1BDX2NvbWZsZyAxNQotI2RlZmluZSBPUENfY3AgMTYKLSNkZWZpbmUgT1BDX2NwYiAxNwotI2RlZmluZSBPUENfY3BkIDE4Ci0jZGVmaW5lIE9QQ19jcGRiIDE5Ci0jZGVmaW5lIE9QQ19jcGRyIDIwCi0jZGVmaW5lIE9QQ19jcGRyYiAyMQotI2RlZmluZSBPUENfY3BpIDIyCi0jZGVmaW5lIE9QQ19jcGliIDIzCi0jZGVmaW5lIE9QQ19jcGlyIDI0Ci0jZGVmaW5lIE9QQ19jcGlyYiAyNQotI2RlZmluZSBPUENfY3BsIDI2Ci0jZGVmaW5lIE9QQ19jcHNkIDI3Ci0jZGVmaW5lIE9QQ19jcHNkYiAyOAotI2RlZmluZSBPUENfY3BzZHIgMjkKLSNkZWZpbmUgT1BDX2Nwc2RyYiAzMAotI2RlZmluZSBPUENfY3BzaSAzMQotI2RlZmluZSBPUENfY3BzaWIgMzIKLSNkZWZpbmUgT1BDX2Nwc2lyIDMzCi0jZGVmaW5lIE9QQ19jcHNpcmIgMzQKLSNkZWZpbmUgT1BDX2RhYiAzNQotI2RlZmluZSBPUENfZGJqbnogMzYKLSNkZWZpbmUgT1BDX2RlYyAzNwotI2RlZmluZSBPUENfZGVjYiAzOAotI2RlZmluZSBPUENfZGkgMzkKLSNkZWZpbmUgT1BDX2RpdiA0MAotI2RlZmluZSBPUENfZGl2bCA0MQotI2RlZmluZSBPUENfZGpueiA0MgotI2RlZmluZSBPUENfZWkgNDMKLSNkZWZpbmUgT1BDX2V4IDQ0Ci0jZGVmaW5lIE9QQ19leGIgNDUKLSNkZWZpbmUgT1BDX2V4dHMgNDYKLSNkZWZpbmUgT1BDX2V4dHNiIDQ3Ci0jZGVmaW5lIE9QQ19leHRzbCA0OAotI2RlZmluZSBPUENfaGFsdCA0OQotI2RlZmluZSBPUENfaW4gNTAKLSNkZWZpbmUgT1BDX2luYiA1MQotI2RlZmluZSBPUENfaW5jIDUyCi0jZGVmaW5lIE9QQ19pbmNiIDUzCi0jZGVmaW5lIE9QQ19pbmQgNTQKLSNkZWZpbmUgT1BDX2luZGIgNTUKLSNkZWZpbmUgT1BDX2luaWIgNTYKLSNkZWZpbmUgT1BDX2luaWJyIDU3Ci0jZGVmaW5lIE9QQ19pcmV0IDU4Ci0jZGVmaW5lIE9QQ19qcCA1OQotI2RlZmluZSBPUENfanIgNjAKLSNkZWZpbmUgT1BDX2xkIDYxCi0jZGVmaW5lIE9QQ19sZGEgNjIKLSNkZWZpbmUgT1BDX2xkYXIgNjMKLSNkZWZpbmUgT1BDX2xkYiA2NAotI2RlZmluZSBPUENfbGRjdGwgNjUKLSNkZWZpbmUgT1BDX2xkaXIgNjYKLSNkZWZpbmUgT1BDX2xkaXJiIDY3Ci0jZGVmaW5lIE9QQ19sZGsgNjgKLSNkZWZpbmUgT1BDX2xkbCA2OQotI2RlZmluZSBPUENfbGRtIDcwCi0jZGVmaW5lIE9QQ19sZHBzIDcxCi0jZGVmaW5lIE9QQ19sZHIgNzIKLSNkZWZpbmUgT1BDX2xkcmIgNzMKLSNkZWZpbmUgT1BDX2xkcmwgNzQKLSNkZWZpbmUgT1BDX21iaXQgNzUKLSNkZWZpbmUgT1BDX21yZXEgNzYKLSNkZWZpbmUgT1BDX21yZXMgNzcKLSNkZWZpbmUgT1BDX21zZXQgNzgKLSNkZWZpbmUgT1BDX211bHQgNzkKLSNkZWZpbmUgT1BDX211bHRsIDgwCi0jZGVmaW5lIE9QQ19uZWcgODEKLSNkZWZpbmUgT1BDX25lZ2IgODIKLSNkZWZpbmUgT1BDX25vcCA4MwotI2RlZmluZSBPUENfb3IgODQKLSNkZWZpbmUgT1BDX29yYiA4NQotI2RlZmluZSBPUENfb3V0IDg2Ci0jZGVmaW5lIE9QQ19vdXRiIDg3Ci0jZGVmaW5lIE9QQ19vdXRkIDg4Ci0jZGVmaW5lIE9QQ19vdXRkYiA4OQotI2RlZmluZSBPUENfb3V0aWIgOTAKLSNkZWZpbmUgT1BDX291dGliciA5MQotI2RlZmluZSBPUENfcG9wIDkyCi0jZGVmaW5lIE9QQ19wb3BsIDkzCi0jZGVmaW5lIE9QQ19wdXNoIDk0Ci0jZGVmaW5lIE9QQ19wdXNobCA5NQotI2RlZmluZSBPUENfcmVzIDk2Ci0jZGVmaW5lIE9QQ19yZXNiIDk3Ci0jZGVmaW5lIE9QQ19yZXNmbGcgOTgKLSNkZWZpbmUgT1BDX3JldCA5OQotI2RlZmluZSBPUENfcmwgMTAwCi0jZGVmaW5lIE9QQ19ybGIgMTAxCi0jZGVmaW5lIE9QQ19ybGMgMTAyCi0jZGVmaW5lIE9QQ19ybGNiIDEwMwotI2RlZmluZSBPUENfcmxkYiAxMDQKLSNkZWZpbmUgT1BDX3JyIDEwNQotI2RlZmluZSBPUENfcnJiIDEwNgotI2RlZmluZSBPUENfcnJjIDEwNwotI2RlZmluZSBPUENfcnJjYiAxMDgKLSNkZWZpbmUgT1BDX3JyZGIgMTA5Ci0jZGVmaW5lIE9QQ19zYmMgMTEwCi0jZGVmaW5lIE9QQ19zYmNiIDExMQotI2RlZmluZSBPUENfc2RhIDExMgotI2RlZmluZSBPUENfc2RhYiAxMTMKLSNkZWZpbmUgT1BDX3NkYWwgMTE0Ci0jZGVmaW5lIE9QQ19zZGwgMTE1Ci0jZGVmaW5lIE9QQ19zZGxiIDExNgotI2RlZmluZSBPUENfc2RsbCAxMTcKLSNkZWZpbmUgT1BDX3NldCAxMTgKLSNkZWZpbmUgT1BDX3NldGIgMTE5Ci0jZGVmaW5lIE9QQ19zZXRmbGcgMTIwCi0jZGVmaW5lIE9QQ19zaW5iIDEyMQotI2RlZmluZSBPUENfc2luZCAxMjIKLSNkZWZpbmUgT1BDX3NpbmRiIDEyMwotI2RlZmluZSBPUENfc2luaWIgMTI0Ci0jZGVmaW5lIE9QQ19zaW5pYnIgMTI1Ci0jZGVmaW5lIE9QQ19zbGEgMTI2Ci0jZGVmaW5lIE9QQ19zbGFiIDEyNwotI2RlZmluZSBPUENfc2xhbCAxMjgKLSNkZWZpbmUgT1BDX3NsbCAxMjkKLSNkZWZpbmUgT1BDX3NsbGIgMTMwCi0jZGVmaW5lIE9QQ19zbGxsIDEzMQotI2RlZmluZSBPUENfc291dCAxMzIKLSNkZWZpbmUgT1BDX3NvdXRiIDEzMwotI2RlZmluZSBPUENfc291dGQgMTM0Ci0jZGVmaW5lIE9QQ19zb3V0ZGIgMTM1Ci0jZGVmaW5lIE9QQ19zb3V0aWIgMTM2Ci0jZGVmaW5lIE9QQ19zb3V0aWJyIDEzNwotI2RlZmluZSBPUENfc3JhIDEzOAotI2RlZmluZSBPUENfc3JhYiAxMzkKLSNkZWZpbmUgT1BDX3NyYWwgMTQwCi0jZGVmaW5lIE9QQ19zcmwgMTQxCi0jZGVmaW5lIE9QQ19zcmxiIDE0MgotI2RlZmluZSBPUENfc3JsbCAxNDMKLSNkZWZpbmUgT1BDX3N1YiAxNDQKLSNkZWZpbmUgT1BDX3N1YmIgMTQ1Ci0jZGVmaW5lIE9QQ19zdWJsIDE0NgotI2RlZmluZSBPUENfdGNjIDE0NwotI2RlZmluZSBPUENfdGNjYiAxNDgKLSNkZWZpbmUgT1BDX3Rlc3QgMTQ5Ci0jZGVmaW5lIE9QQ190ZXN0YiAxNTAKLSNkZWZpbmUgT1BDX3Rlc3RsIDE1MQotI2RlZmluZSBPUENfdHJkYiAxNTIKLSNkZWZpbmUgT1BDX3RyZHJiIDE1MwotI2RlZmluZSBPUENfdHJpYiAxNTQKLSNkZWZpbmUgT1BDX3RyaXJiIDE1NQotI2RlZmluZSBPUENfdHJ0ZHJiIDE1NgotI2RlZmluZSBPUENfdHJ0aWIgMTU3Ci0jZGVmaW5lIE9QQ190cnRpcmIgMTU4Ci0jZGVmaW5lIE9QQ190cnRkYiAxNTkKLSNkZWZpbmUgT1BDX3RzZXQgMTYwCi0jZGVmaW5lIE9QQ190c2V0YiAxNjEKLSNkZWZpbmUgT1BDX3hvciAxNjIKLSNkZWZpbmUgT1BDX3hvcmIgMTYzCi0jZGVmaW5lIE9QQ19sZGQgIDE2NCAKLSNkZWZpbmUgT1BDX2xkZGIgIDE2NSAKLSNkZWZpbmUgT1BDX2xkZHIgIDE2NiAKLSNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgCi0jZGVmaW5lIE9QQ19sZGkgIDE2OCAKLSNkZWZpbmUgT1BDX2xkaWIgMTY5ICAKLSNkZWZpbmUgT1BDX3NjICAgMTcwCi0jZGVmaW5lIE9QQ19icHQgICAxNzEKLSNkZWZpbmUgT1BDX2V4dDBlIDE3MgotI2RlZmluZSBPUENfZXh0MGYgMTcyCi0jZGVmaW5lIE9QQ19leHQ4ZSAxNzIKLSNkZWZpbmUgT1BDX2V4dDhmIDE3MgotI2RlZmluZSBPUENfcnN2ZDM2IDE3MgotI2RlZmluZSBPUENfcnN2ZDM4IDE3MgotI2RlZmluZSBPUENfcnN2ZDc4IDE3MgotI2RlZmluZSBPUENfcnN2ZDdlIDE3MgotI2RlZmluZSBPUENfcnN2ZDlkIDE3MgotI2RlZmluZSBPUENfcnN2ZDlmIDE3MgotI2RlZmluZSBPUENfcnN2ZGI5IDE3MgotI2RlZmluZSBPUENfcnN2ZGJmIDE3MgotI2RlZmluZSBPUENfb3V0aSAxNzMKLXR5cGVkZWYgc3RydWN0IHsKLSNpZmRlZiBOSUNFTkFNRVMKLWNoYXIgKm5pY2VuYW1lOwotaW50IHR5cGU7Ci1pbnQgY3ljbGVzOwotaW50IGZsYWdzOwotI2VuZGlmCi1jaGFyICpuYW1lOwotdW5zaWduZWQgY2hhciBvcGNvZGU7Ci12b2lkICgqZnVuYykoKTsKLXVuc2lnbmVkIGludCBhcmdfaW5mb1s0XTsKLXVuc2lnbmVkIGludCBieXRlX2luZm9bMTBdOwotaW50IG5vcGVyYW5kczsKLWludCBsZW5ndGg7Ci1pbnQgaWR4OwotfSBvcGNvZGVfZW50cnlfdHlwZTsKLSNpZmRlZiBERUZJTkVfVEFCTEUKLW9wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0gewotCi0KLS8qIDEwMTEgMDEwMSBzc3NzIGRkZGQgKioqIGFkYyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkYyByZCxycyIsMTYsNSwKLTB4M2MsCi0jZW5kaWYKLSJhZGMiLE9QQ19hZGMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwwfSwKLQotCi0vKiAxMDExIDAxMDAgc3NzcyBkZGRkICoqKiBhZGNiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGNiIHJiZCxyYnMiLDgsNSwKLTB4M2YsCi0jZW5kaWYKLSJhZGNiIixPUENfYWRjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDF9LAotCi0KLS8qIDAwMDAgMDAwMSBzc04wIGRkZGQgKioqIGFkZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDJ9LAotCi0KLS8qIDAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDN9LAotCi0KLS8qIDAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0fSwKLQotCi0vKiAwMDAwIDAwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBhZGQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNX0sCi0KLQotLyogMTAwMCAwMDAxIHNzc3MgZGRkZCAqKiogYWRkIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2fSwKLQotCi0vKiAwMDAwIDAwMDAgc3NOMCBkZGRkICoqKiBhZGRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxAcnMiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDd9LAotCi0KLS8qIDAxMDAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOH0sCi0KLQotLyogMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOX0sCi0KLQotLyogMDAwMCAwMDAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFkZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxpbW04Iiw4LDcsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDEwfSwKLQotCi0vKiAxMDAwIDAwMDAgc3NzcyBkZGRkICoqKiBhZGRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxyYnMiLDgsNCwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMX0sCi0KLQotLyogMDAwMSAwMTEwIHNzTjAgZGRkZCAqKiogYWRkbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyfSwKLQotCi0vKiAwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTN9LAotCi0KLS8qIDAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNH0sCi0KLQotLyogMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiAqKiogYWRkbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwxNX0sCi0KLQotLyogMTAwMSAwMTEwIHNzc3MgZGRkZCAqKiogYWRkbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2fSwKLQotCi0vKiAwMDAwIDAxMTEgc3NOMCBkZGRkICoqKiBhbmQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLEBycyIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxN30sCi0KLQotLyogMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTh9LAotCi0KLS8qIDAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxOX0sCi0KLQotLyogMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiAqKiogYW5kIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGltbTE2IiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIwfSwKLQotCi0vKiAxMDAwIDAxMTEgc3NzcyBkZGRkICoqKiBhbmQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQscnMiLDE2LDQsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIxfSwKLQotCi0vKiAwMDAwIDAxMTAgc3NOMCBkZGRkICoqKiBhbmRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxAcnMiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIyfSwKLQotCi0vKiAwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzfSwKLQotCi0vKiAwMTAwIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNH0sCi0KLQotLyogMDAwMCAwMTEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFuZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxpbW04Iiw4LDcsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDI1fSwKLQotCi0vKiAxMDAwIDAxMTAgc3NzcyBkZGRkICoqKiBhbmRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxyYnMiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNn0sCi0KLQotLyogMDAxMCAwMTExIGRkTjAgaW1tNCAqKiogYml0IEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IEByZCxpbW00IiwxNiw4LAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI3fSwKLQotCi0vKiAwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDExLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI4fSwKLQotCi0vKiAwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5fSwKLQotCi0vKiAxMDEwIDAxMTEgZGRkZCBpbW00ICoqKiBiaXQgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCByZCxpbW00IiwxNiw0LAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMwfSwKLQotCi0vKiAwMDEwIDAxMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIGJpdCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCByZCxycyIsMTYsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMX0sCi0KLQotLyogMDAxMCAwMTEwIGRkTjAgaW1tNCAqKiogYml0YiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgQHJkLGltbTQiLDgsOCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMyfSwKLQotCi0vKiAwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxMSwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzfSwKLQotCi0vKiAwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDM0fSwKLQotCi0vKiAxMDEwIDAxMTAgZGRkZCBpbW00ICoqKiBiaXRiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiByYmQsaW1tNCIsOCw0LAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzV9LAotCi0KLS8qIDAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogYml0YiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIHJiZCxycyIsOCwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzZ9LAotCi0KLS8qIDAwMTEgMDExMCAwMDAwIDAwMDAgKioqIGJwdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJwdCIsOCwyLAotMHgwMCwKLSNlbmRpZgotImJwdCIsT1BDX2JwdCwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDM3fSwKLQotCi0vKiAwMDAxIDExMTEgZGROMCAwMDAwICoqKiBjYWxsIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgQHJkIiwzMiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwzOH0sCi0KLQotLyogMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY2FsbCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgYWRkcmVzc19kc3QiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzl9LAotCi0KLS8qIDAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNhbGwgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBhZGRyZXNzX2RzdChyZCkiLDMyLDEzLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwfSwKLQotCi0vKiAxMTAxIGRpc3AxMiAqKiogY2FsciBkaXNwMTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxyIGRpc3AxMiIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0iY2FsciIsT1BDX2NhbHIsMCx7Q0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhkLENMQVNTX0RJU1ArKEFSR19ESVNQMTIpLDAsMCwwLDAsMCwwLDAsfSwxLDIsNDF9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDEwMDAgKioqIGNsciBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgQHJkIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Mn0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIGFkZHJlc3NfZHN0IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0M30sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0NH0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMTAwMCAqKiogY2xyIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIHJkIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDV9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDEwMDAgKioqIGNscmIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBAcmQiLDgsOCwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Nn0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgYWRkcmVzc19kc3QiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIGFkZHJlc3NfZHN0KHJkKSIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0OH0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMTAwMCAqKiogY2xyYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIHJiZCIsOCw3LAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0OX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAwMCAqKiogY29tIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBAcmQiLDE2LDEyLAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1MH0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIGFkZHJlc3NfZHN0IiwxNiwxNSwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1MX0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBhZGRyZXNzX2RzdChyZCkiLDE2LDE2LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1Mn0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDAwMCAqKiogY29tIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIHJkIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTN9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMDAgKioqIGNvbWIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBAcmQiLDgsMTIsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTR9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIGFkZHJlc3NfZHN0Iiw4LDE1LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTV9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBhZGRyZXNzX2RzdChyZCkiLDgsMTYsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTZ9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAwMDAgKioqIGNvbWIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiByYmQiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTd9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMTAxICoqKiBjb21mbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21mbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY29tZmxnIixPUENfY29tZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzUsMCwwLDAsMCwwLH0sMSwyLDU4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2ICoqKiBjcCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBAcmQsaW1tMTYiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNTl9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiw2MH0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogY3AgYWRkcmVzc19kc3QsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDYxfSwKLQotCi0vKiAwMDAwIDEwMTEgc3NOMCBkZGRkICoqKiBjcCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjJ9LAotCi0KLS8qIDAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2M30sCi0KLQotLyogMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3AgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2NH0sCi0KLQotLyogMDAwMCAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogY3AgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw2NX0sCi0KLQotLyogMTAwMCAxMDExIHNzc3MgZGRkZCAqKiogY3AgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjZ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMDEgaW1tOCBpbW04ICoqKiBjcGIgQHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgQHJkLGltbTgiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNjd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjh9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBhZGRyZXNzX2RzdCxpbW04Iiw4LDE0LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjl9LAotCi0KLS8qIDAwMDAgMTAxMCBzc04wIGRkZGQgKioqIGNwYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxAcnMiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDcwfSwKLQotCi0vKiAwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw3MX0sCi0KLQotLyogMDEwMCAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDcyfSwKLQotCi0vKiAwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogY3BiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxpbW04Iiw4LDcsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDczfSwKLQotCi0vKiAxMDAwIDEwMTAgc3NzcyBkZGRkICoqKiBjcGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQscmJzIiw4LDQsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNzR9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZCByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwZCIsT1BDX2NwZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc1fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZGIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZGIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRiIixPUENfY3BkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc2fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZHIgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkciByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwZHIiLE9QQ19jcGRyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3N30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRyYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkcmIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRyYiIsT1BDX2NwZHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3OH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGkgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpIixPUENfY3BpLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzl9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwaWIiLE9QQ19jcGliLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODB9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpciByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGlyIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpciIsT1BDX2NwaXIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4MX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGlyYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpcmIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGlyYiIsT1BDX2NwaXJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODJ9LAotCi0KLS8qIDAwMDEgMDAwMCBzc04wIGRkZGQgKioqIGNwbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDgzfSwKLQotCi0vKiAwMTAxIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4NH0sCi0KLQotLyogMDEwMSAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsODV9LAotCi0KLS8qIDAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIgKioqIGNwbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiw4Nn0sCi0KLQotLyogMTAwMSAwMDAwIHNzc3MgZGRkZCAqKiogY3BsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsODd9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZCBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZCBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkIixPUENfY3BzZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4OH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZGIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkYiIsT1BDX2Nwc2RiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDg5fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkciIsT1BDX2Nwc2RyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkwfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZHJiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZHJiIixPUENfY3BzZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkxfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2kgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2kgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaSIsT1BDX2Nwc2ksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkyfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2liIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2liIixPUENfY3BzaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkzfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2lyIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpciIsT1BDX2Nwc2lyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5NH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpcmIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2lyYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2lyYiIsT1BDX2Nwc2lyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTV9LAotCi0KLS8qIDEwMTEgMDAwMCBkZGRkIDAwMDAgKioqIGRhYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkYWIgcmJkIiw4LDUsCi0weDM4LAotI2VuZGlmCi0iZGFiIixPUENfZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw5Nn0sCi0KLQotLyogMTExMSBkZGRkIDBkaXNwNyAqKiogZGJqbnogcmJkLGRpc3A3ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGJqbnogcmJkLGRpc3A3IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJkYmpueiIsT1BDX2Riam56LDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMERJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDk3fSwKLQotCi0vKiAwMDEwIDEwMTEgZGROMCBpbW00bTEgKioqIGRlYyBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIEByZCxpbW00bTEiLDE2LDExLAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDk4fSwKLQotCi0vKiAwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDE2LDE0LAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDk5fSwKLQotCi0vKiAwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgYWRkcmVzc19kc3QsaW1tNG0xIiwxNiwxMywKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwMH0sCi0KLQotLyogMTAxMCAxMDExIGRkZGQgaW1tNG0xICoqKiBkZWMgcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIHJkLGltbTRtMSIsMTYsNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDF9LAotCi0KLS8qIDAwMTAgMTAxMCBkZE4wIGltbTRtMSAqKiogZGVjYiBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBAcmQsaW1tNG0xIiw4LDExLAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTAyfSwKLQotCi0vKiAwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsOCwxNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwM30sCi0KLQotLyogMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiw4LDEzLAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDR9LAotCi0KLS8qIDEwMTAgMTAxMCBkZGRkIGltbTRtMSAqKiogZGVjYiByYmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiByYmQsaW1tNG0xIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDV9LAotCi0KLS8qIDAxMTEgMTEwMCAwMDAwIDAwaWkgKioqIGRpIGkyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGkgaTIiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iZGkiLE9QQ19kaSwwLHtDTEFTU19JTU0rKEFSR19JTU0yKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTXzAwSUksMCwwLDAsMCwwLH0sMSwyLDEwNn0sCi0KLQotLyogMDAwMSAxMDExIHNzTjAgZGRkZCAqKiogZGl2IHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLEBycyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTA3fSwKLQotCi0vKiAwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXYgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxhZGRyZXNzX3NyYyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMDh9LAotCi0KLS8qIDAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdiBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEwOX0sCi0KLQotLyogMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogZGl2IHJyZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsaW1tMTYiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDExMH0sCi0KLQotLyogMTAwMSAxMDExIHNzc3MgZGRkZCAqKiogZGl2IHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQscnMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTF9LAotCi0KLS8qIDAwMDEgMTAxMCBzc04wIGRkZGQgKioqIGRpdmwgcnFkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLEBycyIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTJ9LAotCi0KLS8qIDAxMDEgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsYWRkcmVzc19zcmMiLDMyLDc0NSwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTN9LAotCi0KLS8qIDAxMDEgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsNzQ2LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTR9LAotCi0KLS8qIDAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIgKioqIGRpdmwgcnFkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsaW1tMzIiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMTE1fSwKLQotCi0vKiAxMDAxIDEwMTAgc3NzcyBkZGRkICoqKiBkaXZsIHJxZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxycnMiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExNn0sCi0KLQotLyogMTExMSBkZGRkIDFkaXNwNyAqKiogZGpueiByZCxkaXNwNyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRqbnogcmQsZGlzcDciLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImRqbnoiLE9QQ19kam56LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMURJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDExN30sCi0KLQotLyogMDExMSAxMTAwIDAwMDAgMDFpaSAqKiogZWkgaTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJlaSBpMiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJlaSIsT1BDX2VpLDAse0NMQVNTX0lNTSsoQVJHX0lNTTIpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfMDFJSSwwLDAsMCwwLDAsfSwxLDIsMTE4fSwKLQotCi0vKiAwMDEwIDExMDEgc3NOMCBkZGRkICoqKiBleCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxAcnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExOX0sCi0KLQotLyogMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXggcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxhZGRyZXNzX3NyYyIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjB9LAotCi0KLS8qIDAxMTAgMTEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4IHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTIxfSwKLQotCi0vKiAxMDEwIDExMDEgc3NzcyBkZGRkICoqKiBleCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLHJzIiwxNiw2LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyMn0sCi0KLQotLyogMDAxMCAxMTAwIHNzTjAgZGRkZCAqKiogZXhiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLEBycyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyM30sCi0KLQotLyogMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsYWRkcmVzc19zcmMiLDgsMTUsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNH0sCi0KLQotLyogMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxNiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNX0sCi0KLQotLyogMTAxMCAxMTAwIHNzc3MgZGRkZCAqKiogZXhiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLHJicyIsOCw2LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTI2fSwKLQotCi0vKiAwMDAwIDExMTAgaW1tOCAqKiogZXh0MGUgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDBlIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0MGUiLE9QQ19leHQwZSwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyN30sCi0KLQotLyogMDAwMCAxMTExIGltbTggKioqIGV4dDBmIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQwZiBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDBmIixPUENfZXh0MGYsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjh9LAotCi0KLS8qIDEwMDAgMTExMCBpbW04ICoqKiBleHQ4ZSBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0OGUgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQ4ZSIsT1BDX2V4dDhlLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI5fSwKLQotCi0vKiAxMDAwIDExMTEgaW1tOCAqKiogZXh0OGYgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDhmIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0OGYiLE9QQ19leHQ4ZiwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEzMH0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMTAxMCAqKiogZXh0cyBycmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzIHJyZCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0cyIsT1BDX2V4dHMsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwxLDIsMTMxfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAwMDAwICoqKiBleHRzYiByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHNiIHJkIiw4LDExLAotMHgwMCwKLSNlbmRpZgotImV4dHNiIixPUENfZXh0c2IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDEzMn0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMDExMSAqKiogZXh0c2wgcnFkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0c2wgcnFkIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzbCIsT1BDX2V4dHNsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDEsMiwxMzN9LAotCi0KLS8qIDAxMTEgMTAxMCAwMDAwIDAwMDAgKioqIGhhbHQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJoYWx0IiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImhhbHQiLE9QQ19oYWx0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwxMzR9LAotCi0KLS8qIDAwMTEgMTEwMSBzc04wIGRkZGQgKioqIGluIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluIHJkLEBycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0iaW4iLE9QQ19pbiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTM1fSwKLQotCi0vKiAwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2ICoqKiBpbiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluIHJkLGltbTE2IiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJpbiIsT1BDX2luLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMzZ9LAotCi0KLS8qIDAwMTEgMTEwMCBzc04wIGRkZGQgKioqIGluYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5iIHJiZCxAcnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iaW5iIixPUENfaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMzd9LAotCi0KLS8qIDAwMTEgMTAxMCBkZGRkIDAxMDAgaW1tMTYgKioqIGluYiByYmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmIgcmJkLGltbTE2Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImluYiIsT1BDX2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTM4fSwKLQotCi0vKiAwMDEwIDEwMDEgZGROMCBpbW00bTEgKioqIGluYyBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIEByZCxpbW00bTEiLDE2LDExLAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMzl9LAotCi0KLS8qIDAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsMTYsMTQsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0MH0sCi0KLQotLyogMDExMCAxMDAxIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmMgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsMTYsMTMsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQxfSwKLQotCi0vKiAxMDEwIDEwMDEgZGRkZCBpbW00bTEgKioqIGluYyByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgcmQsaW1tNG0xIiwxNiw0LAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDJ9LAotCi0KLS8qIDAwMTAgMTAwMCBkZE4wIGltbTRtMSAqKiogaW5jYiBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBAcmQsaW1tNG0xIiw4LDExLAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0M30sCi0KLQotLyogMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDgsMTQsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQ0fSwKLQotCi0vKiAwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluY2IgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLDgsMTMsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDV9LAotCi0KLS8qIDEwMTAgMTAwMCBkZGRkIGltbTRtMSAqKiogaW5jYiByYmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiByYmQsaW1tNG0xIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQ2fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5kIEByZCxAcnMscmEiLDE2LDIxLAotMHgwNCwKLSNlbmRpZgotImluZCIsT1BDX2luZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0N30sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5kYiBAcmQsQHJzLHJiYSIsOCwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmRiIixPUENfaW5kYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0OH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmliIEByZCxAcnMscmEiLDgsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5pYiIsT1BDX2luaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDl9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogaW5pYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluaWJyIEByZCxAcnMscmEiLDE2LDIxLAotMHgwNCwKLSNlbmRpZgotImluaWJyIixPUENfaW5pYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxNTB9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDAwMDAgKioqIGlyZXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpcmV0IiwxNiwxMywKLTB4M2YsCi0jZW5kaWYKLSJpcmV0IixPUENfaXJldCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMTUxfSwKLQotCi0vKiAwMDAxIDExMTAgZGROMCBjY2NjICoqKiBqcCBjYyxAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxAcmQiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMTUyfSwKLQotCi0vKiAwMTAxIDExMTAgMDAwMCBjY2NjIGFkZHJlc3NfZHN0ICoqKiBqcCBjYyxhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLGFkZHJlc3NfZHN0IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfQ0MsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTN9LAotCi0KLS8qIDAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QgKioqIGpwIGNjLGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQyxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1NH0sCi0KLQotLyogMTExMCBjY2NjIGRpc3A4ICoqKiBqciBjYyxkaXNwOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpyIGNjLGRpc3A4IiwxNiw2LAotMHgwMCwKLSNlbmRpZgotImpyIixPUENfanIsMCx7Q0xBU1NfQ0MsQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhlLENMQVNTX0NDLENMQVNTX0RJU1A4LDAsMCwwLDAsMCwwLH0sMiwyLDE1NX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiAqKiogbGQgQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgQHJkLGltbTE2IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTU2fSwKLQotCi0vKiAwMDEwIDExMTEgZGROMCBzc3NzICoqKiBsZCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBAcmQscnMiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMTU3fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsMTU4fSwKLQotCi0vKiAwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZCBhZGRyZXNzX2RzdChyZCkscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdChyZCkscnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogbGQgYWRkcmVzc19kc3QsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDE2MH0sCi0KLQotLyogMDExMCAxMTExIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGQgYWRkcmVzc19kc3QscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdCxycyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNjF9LAotCi0KLS8qIDAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkIHJkKGltbTE2KSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkKGltbTE2KSxycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTYyfSwKLQotCi0vKiAwMTExIDAwMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkKHJ4KSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkKHJ4KSxycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTYzfSwKLQotCi0vKiAwMDEwIDAwMDEgc3NOMCBkZGRkICoqKiBsZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxAcnMiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2NH0sCi0KLQotLyogMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNjV9LAotCi0KLS8qIDAxMTAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE2Nn0sCi0KLQotLyogMDAxMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogbGQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxpbW0xNiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY3fSwKLQotCi0vKiAxMDEwIDAwMDEgc3NzcyBkZGRkICoqKiBsZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzIiwxNiwzLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNjh9LAotCi0KLS8qIDAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkIHJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzKGltbTE2KSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY5fSwKLQotCi0vKiAwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzKHJ4KSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTcwfSwKLQotCi0vKiAwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGEgcHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxhZGRyZXNzX3NyYyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNzF9LAotCi0KLS8qIDAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYSBwcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE3Mn0sCi0KLQotLyogMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRhIHByZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLHJzKGltbTE2KSIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNzN9LAotCi0KLS8qIDAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRhIHByZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLHJzKHJ4KSIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNzR9LAotCi0KLS8qIDAwMTEgMDEwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZGFyIHByZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGFyIHByZCxkaXNwMTYiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYXIiLE9QQ19sZGFyLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMTc1fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTAxIGltbTggaW1tOCAqKiogbGRiIEByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIEByZCxpbW04Iiw4LDcsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMTc2fSwKLQotCi0vKiAwMDEwIDExMTAgZGROMCBzc3NzICoqKiBsZGIgQHJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBAcmQscmJzIiw4LDgsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwxNzd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsMTc4fSwKLQotCi0vKiAwMTEwIDExMTAgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdChyZCkscmJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTc5fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogbGRiIGFkZHJlc3NfZHN0LGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QsaW1tOCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDE4MH0sCi0KLQotLyogMDExMCAxMTEwIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRiIGFkZHJlc3NfZHN0LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdCxyYnMiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE4MX0sCi0KLQotLyogMDAxMCAwMDAwIHNzTjAgZGRkZCAqKiogbGRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLEBycyIsOCw3LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE4Mn0sCi0KLQotLyogMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4M30sCi0KLQotLyogMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxODR9LAotCi0KLS8qIDExMDAgZGRkZCBpbW04ICoqKiBsZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGltbTgiLDgsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwyLDIsMTg1fSwKLQotCi0vKiAxMDEwIDAwMDAgc3NzcyBkZGRkICoqKiBsZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscmJzIiw4LDMsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTg2fSwKLQotCi0vKiAwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGIgcmJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscnMoaW1tMTYpIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTg3fSwKLQotCi0vKiAwMTExIDAwMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYiByYmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxycyhyeCkiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxODh9LAotCi0KLS8qIDAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYgKioqIGxkYiByZChpbW0xNikscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJkKGltbTE2KSxyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxODl9LAotCi0KLS8qIDAxMTEgMDAxMCBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRiIHJkKHJ4KSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmQocngpLHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE5MH0sCi0KLQotLyogMDExMSAxMTAxIHNzc3MgMWNjYyAqKiogbGRjdGwgY3RybCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkY3RsIGN0cmwscnMiLDMyLDcsCi0weDAwLAotI2VuZGlmCi0ibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19DVFJMLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTXzFDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5MX0sCi0KLQotLyogMDExMSAxMTAxIGRkZGQgMGNjYyAqKiogbGRjdGwgcmQsY3RybCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkY3RsIHJkLGN0cmwiLDMyLDcsCi0weDAwLAotI2VuZGlmCi0ibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19DVFJMLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzBDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5Mn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGQgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZCBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGQiLE9QQ19sZGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5M30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGRiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkYiIsT1BDX2xkZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5NH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGRyIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRyIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkZHIiLE9QQ19sZGRyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTV9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRkcmIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZHJiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkcmIiLE9QQ19sZGRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk2fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaSBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkaSIsT1BDX2xkaSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk3fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaWIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaWIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGliIixPUENfbGRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk4fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkaXIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaXIgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpciIsT1BDX2xkaXIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5OX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGlyYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpcmIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGlyYiIsT1BDX2xkaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwyMDB9LAotCi0KLS8qIDEwMTEgMTEwMSBkZGRkIGltbTQgKioqIGxkayByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRrIHJkLGltbTQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibGRrIixPUENfbGRrLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyMDF9LAotCi0KLS8qIDAwMDEgMTEwMSBkZE4wIHNzc3MgKioqIGxkbCBAcmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIEByZCxycnMiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjAyfSwKLQotCi0vKiAwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGwgYWRkcmVzc19kc3QocmQpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwzMiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDIwM30sCi0KLQotLyogMDEwMSAxMTAxIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRsIGFkZHJlc3NfZHN0LHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBhZGRyZXNzX2RzdCxycnMiLDMyLDE1LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyMDR9LAotCi0KLS8qIDAwMTEgMDExMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkbCByZChpbW0xNikscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJkKGltbTE2KSxycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjA1fSwKLQotCi0vKiAwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCByZChyeCkscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJkKHJ4KSxycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjA2fSwKLQotCi0vKiAwMDAxIDAxMDAgc3NOMCBkZGRkICoqKiBsZGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsQHJzIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMDd9LAotCi0KLS8qIDAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIwOH0sCi0KLQotLyogMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTMsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjA5fSwKLQotCi0vKiAwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyICoqKiBsZGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxpbW0zMiIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjEwfSwKLQotCi0vKiAxMDAxIDAxMDAgc3NzcyBkZGRkICoqKiBsZGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnJzIiwzMiw1LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMTF9LAotCi0KLS8qIDAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkbCBycmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycyhpbW0xNikiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjEyfSwKLQotCi0vKiAwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCBycmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycyhyeCkiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjEzfSwKLQotCi0vKiAwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgKioqIGxkbSBAcmQscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBAcmQscnMsbiIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTR9LAotCi0KLS8qIDAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCAqKiogbGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLH0sMyw2LDIxNX0sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0ICoqKiBsZG0gYWRkcmVzc19kc3QscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBhZGRyZXNzX2RzdCxycyxuIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksfSwzLDYsMjE2fSwKLQotCi0vKiAwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgKioqIGxkbSByZCxAcnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxAcnMsbiIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTd9LAotCi0KLS8qIDAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyAqKiogbGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLH0sMyw2LDIxOH0sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjICoqKiBsZG0gcmQsYWRkcmVzc19zcmMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxhZGRyZXNzX3NyYyxuIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksfSwzLDYsMjE5fSwKLQotCi0vKiAwMDExIDEwMDEgc3NOMCAwMDAwICoqKiBsZHBzIEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgQHJzIiwxNiwxMiwKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMjIwfSwKLQotCi0vKiAwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBhZGRyZXNzX3NyYyIsMTYsMTYsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIxfSwKLQotCi0vKiAwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgYWRkcmVzc19zcmMocnMpIiwxNiwxNywKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIyfSwKLQotCi0vKiAwMDExIDAwMTEgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRyIGRpc3AxNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkciBkaXNwMTYscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkciIsT1BDX2xkciwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyM30sCi0KLQotLyogMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkciByZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHIgcmQsZGlzcDE2IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHIiLE9QQ19sZHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjR9LAotCi0KLS8qIDAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJiIGRpc3AxNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJiIGRpc3AxNixyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjV9LAotCi0KLS8qIDAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHJiIHJiZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJiIHJiZCxkaXNwMTYiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjZ9LAotCi0KLS8qIDAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJsIGRpc3AxNixycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJsIGRpc3AxNixycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkcmwiLE9QQ19sZHJsLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI3fSwKLQotCi0vKiAwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRybCBycmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRybCBycmQsZGlzcDE2IiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZHJsIixPUENfbGRybCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyOH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAxMCAqKiogbWJpdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1iaXQiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ibWJpdCIsT1BDX21iaXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwwLDIsMjI5fSwKLQotCi0vKiAwMTExIDEwMTEgZGRkZCAxMTAxICoqKiBtcmVxIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXJlcSByZCIsMTYsMTIsCi0weDE4LAotI2VuZGlmCi0ibXJlcSIsT1BDX21yZXEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCwwLDAsMCwwLDAsfSwxLDIsMjMwfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDAxICoqKiBtcmVzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXJlcyIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJtcmVzIixPUENfbXJlcywwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOSwwLDAsMCwwLDAsfSwwLDIsMjMxfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDAwICoqKiBtc2V0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXNldCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJtc2V0IixPUENfbXNldCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwwLDIsMjMyfSwKLQotCi0vKiAwMDAxIDEwMDEgc3NOMCBkZGRkICoqKiBtdWx0IHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxAcnMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjMzfSwKLQotCi0vKiAwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM0fSwKLQotCi0vKiAwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM1fSwKLQotCi0vKiAwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBtdWx0IHJyZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGltbTE2IiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIzNn0sCi0KLQotLyogMTAwMSAxMDAxIHNzc3MgZGRkZCAqKiogbXVsdCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxycyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjM3fSwKLQotCi0vKiAwMDAxIDEwMDAgc3NOMCBkZGRkICoqKiBtdWx0bCBycWQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLEBycyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzh9LAotCi0KLS8qIDAxMDEgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHRsIHJxZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzOX0sCi0KLQotLyogMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjQwfSwKLQotCi0vKiAwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyICoqKiBtdWx0bCBycWQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsaW1tMzIiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjQxfSwKLQotCi0vKiAxMDAxIDEwMDAgc3NzcyBkZGRkICoqKiBtdWx0bCBycWQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLHJycyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjQyfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDEwICoqKiBuZWcgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIEByZCIsMTYsMTIsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0M30sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIGFkZHJlc3NfZHN0IiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDR9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZyBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgYWRkcmVzc19kc3QocmQpIiwxNiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ1fSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMDEwICoqKiBuZWcgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgcmQiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDZ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMTAgKioqIG5lZ2IgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBAcmQiLDgsMTIsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQ3fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWdiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBhZGRyZXNzX2RzdCIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0OH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsOCwxNiwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDl9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAwMTAgKioqIG5lZ2IgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiByYmQiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjUwfSwKLQotCi0vKiAxMDAwIDExMDEgMDAwMCAwMTExICoqKiBub3AgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJub3AiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibm9wIixPUENfbm9wLDAsezB9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDAsMiwyNTF9LAotCi0KLS8qIDAwMDAgMDEwMSBzc04wIGRkZGQgKioqIG9yIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLEBycyIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjUyfSwKLQotCi0vKiAwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvciByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1M30sCi0KLQotLyogMDEwMCAwMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3IgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU0fSwKLQotCi0vKiAwMDAwIDAxMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBvciByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGltbTE2IiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNTV9LAotCi0KLS8qIDEwMDAgMDEwMSBzc3NzIGRkZGQgKioqIG9yIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQscnMiLDE2LDQsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTZ9LAotCi0KLS8qIDAwMDAgMDEwMCBzc04wIGRkZGQgKioqIG9yYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxAcnMiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTd9LAotCi0KLS8qIDAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTh9LAotCi0KLS8qIDAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU5fSwKLQotCi0vKiAwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogb3JiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxpbW04Iiw4LDcsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwyNjB9LAotCi0KLS8qIDEwMDAgMDEwMCBzc3NzIGRkZGQgKioqIG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxyYnMiLDgsNCwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjYxfSwKLQotCi0vKiAwMDExIDExMTEgZGROMCBzc3NzICoqKiBvdXQgQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0IEByZCxycyIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXQiLE9QQ19vdXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI2Mn0sCi0KLQotLyogMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiAqKiogb3V0IGltbTE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0IGltbTE2LHJzIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dCIsT1BDX291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjYzfSwKLQotCi0vKiAwMDExIDExMTAgZGROMCBzc3NzICoqKiBvdXRiIEByZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRiIEByZCxyYnMiLDgsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRiIixPUENfb3V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjY0fSwKLQotCi0vKiAwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2ICoqKiBvdXRiIGltbTE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGIgaW1tMTYscmJzIiw4LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0YiIsT1BDX291dGIsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI2NX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRkIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0ZCIsT1BDX291dGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2Nn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGRiIEByZCxAcnMscmJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGRiIixPUENfb3V0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2N30sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRpIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aSIsT1BDX291dGksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjh9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0aWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGliIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aWIiLE9QQ19vdXRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2OX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBvdXRpYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGliciIsT1BDX291dGliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDI3MH0sCi0KLQotLyogMDAwMSAwMTExIHNzTjAgZGROMCAqKiogcG9wIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgQHJkLEBycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzF9LAotCi0KLS8qIDAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcCBhZGRyZXNzX2RzdChyZCksQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjcyfSwKLQotCi0vKiAwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBwb3AgYWRkcmVzc19kc3QsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIGFkZHJlc3NfZHN0LEBycyIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3M30sCi0KLQotLyogMTAwMSAwMTExIHNzTjAgZGRkZCAqKiogcG9wIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCByZCxAcnMiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc0fSwKLQotCi0vKiAwMDAxIDAxMDEgc3NOMCBkZE4wICoqKiBwb3BsIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIEByZCxAcnMiLDMyLDE5LAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzV9LAotCi0KLS8qIDAxMDEgMDEwMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcGwgYWRkcmVzc19kc3QocmQpLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsMzIsMjMsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3Nn0sCi0KLQotLyogMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogcG9wbCBhZGRyZXNzX2RzdCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIGFkZHJlc3NfZHN0LEBycyIsMzIsMjMsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjc3fSwKLQotCi0vKiAxMDAxIDAxMDEgc3NOMCBkZGRkICoqKiBwb3BsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIHJyZCxAcnMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc4fSwKLQotCi0vKiAwMDAxIDAwMTEgZGROMCBzc04wICoqKiBwdXNoIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxAcnMiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNzl9LAotCi0KLS8qIDAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2ggQHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsYWRkcmVzc19zcmMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4MH0sCi0KLQotLyogMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyAqKiogcHVzaCBAcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjgxfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2ICoqKiBwdXNoIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGltbTE2IiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyODJ9LAotCi0KLS8qIDEwMDEgMDAxMSBkZE4wIHNzc3MgKioqIHB1c2ggQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQscnMiLDE2LDksCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODN9LAotCi0KLS8qIDAwMDEgMDAwMSBkZE4wIHNzTjAgKioqIHB1c2hsIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsQHJzIiwzMiwyMCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODR9LAotCi0KLS8qIDAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxhZGRyZXNzX3NyYyIsMzIsMjEsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODV9LAotCi0KLS8qIDAxMDEgMDAwMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwzMiwyMSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODZ9LAotCi0KLS8qIDEwMDEgMDAwMSBkZE4wIHNzc3MgKioqIHB1c2hsIEByZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQscnJzIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjg3fSwKLQotCi0vKiAwMDEwIDAwMTEgZGROMCBpbW00ICoqKiByZXMgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgQHJkLGltbTQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI4OH0sCi0KLQotLyogMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyODl9LAotCi0KLS8qIDAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlcyBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIGFkZHJlc3NfZHN0LGltbTQiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjkwfSwKLQotCi0vKiAxMDEwIDAwMTEgZGRkZCBpbW00ICoqKiByZXMgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyByZCxpbW00IiwxNiw0LAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5MX0sCi0KLQotLyogMDAxMCAwMDExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiByZXMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgcmQscnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjkyfSwKLQotCi0vKiAwMDEwIDAwMTAgZGROMCBpbW00ICoqKiByZXNiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBAcmQsaW1tNCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5M30sCi0KLQotLyogMDExMCAwMDEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTR9LAotCi0KLS8qIDAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlc2IgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsOCwxMywKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjk1fSwKLQotCi0vKiAxMDEwIDAwMTAgZGRkZCBpbW00ICoqKiByZXNiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiByYmQsaW1tNCIsOCw0LAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjk2fSwKLQotCi0vKiAwMDEwIDAwMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHJlc2IgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiByYmQscnMiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDI5N30sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAwMTEgKioqIHJlc2ZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2ZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJyZXNmbGciLE9QQ19yZXNmbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrMywwLDAsMCwwLDAsfSwxLDIsMjk4fSwKLQotCi0vKiAxMDAxIDExMTAgMDAwMCBjY2NjICoqKiByZXQgY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXQgY2MiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInJldCIsT1BDX3JldCwwLHtDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX0NDLDAsMCwwLDAsMCx9LDEsMiwyOTl9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwSTAgKioqIHJsIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybCByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJsIixPUENfcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAwfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMEkwICoqKiBybGIgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGIgcmJkLGltbTFvcjIiLDgsNiwKLTB4M2MsCi0jZW5kaWYKLSJybGIiLE9QQ19ybGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAxfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMEkwICoqKiBybGMgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsYyByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJsYyIsT1BDX3JsYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis4LDAsMCwwLDAsMCx9LDIsMiwzMDJ9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwSTAgKioqIHJsY2IgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGNiIHJiZCxpbW0xb3IyIiw4LDksCi0weDEwLAotI2VuZGlmCi0icmxjYiIsT1BDX3JsY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrOCwwLDAsMCwwLDAsfSwyLDIsMzAzfSwKLQotCi0vKiAxMDExIDExMTAgYWFhYSBiYmJiICoqKiBybGRiIHJiYixyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGRiIHJiYixyYmEiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJybGRiIixPUENfcmxkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFRysoQVJHX1JCKSwwLDAsMCwwLDAsfSwyLDIsMzA0fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMUkwICoqKiByciByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnIgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJyciIsT1BDX3JyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDFJMCAqKiogcnJiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJiIHJiZCxpbW0xb3IyIiw4LDYsCi0weDNjLAotI2VuZGlmCi0icnJiIixPUENfcnJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTFJMCAqKiogcnJjIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmMgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJycmMiLE9QQ19ycmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDd9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDExSTAgKioqIHJyY2IgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmNiIHJiZCxpbW0xb3IyIiw4LDksCi0weDEwLAotI2VuZGlmCi0icnJjYiIsT1BDX3JyY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDh9LAotCi0KLS8qIDEwMTEgMTEwMCBhYWFhIGJiYmIgKioqIHJyZGIgcmJiLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyZGIgcmJiLHJiYSIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJyZGIiLE9QQ19ycmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHKyhBUkdfUkIpLDAsMCwwLDAsMCx9LDIsMiwzMDl9LAotCi0KLS8qIDAwMTEgMDExMCBpbW04ICoqKiByc3ZkMzYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkMzYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDM2IixPUENfcnN2ZDM2LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTB9LAotCi0KLS8qIDAwMTEgMTAwMCBpbW04ICoqKiByc3ZkMzggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkMzgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDM4IixPUENfcnN2ZDM4LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTF9LAotCi0KLS8qIDAxMTEgMTAwMCBpbW04ICoqKiByc3ZkNzggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkNzgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDc4IixPUENfcnN2ZDc4LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTJ9LAotCi0KLS8qIDAxMTEgMTExMCBpbW04ICoqKiByc3ZkN2UgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkN2UiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDdlIixPUENfcnN2ZDdlLDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxM30sCi0KLQotLyogMTAwMSAxMTAxIGltbTggKioqIHJzdmQ5ZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ5ZCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkOWQiLE9QQ19yc3ZkOWQsMCx7MH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGQsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE0fSwKLQotCi0vKiAxMDAxIDExMTEgaW1tOCAqKiogcnN2ZDlmICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDlmIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ5ZiIsT1BDX3JzdmQ5ZiwwLHswfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTV9LAotCi0KLS8qIDEwMTEgMTAwMSBpbW04ICoqKiByc3ZkYjkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkYjkiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZGI5IixPUENfcnN2ZGI5LDAsezB9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs5LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNn0sCi0KLQotLyogMTAxMSAxMTExIGltbTggKioqIHJzdmRiZiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmRiZiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkYmYiLE9QQ19yc3ZkYmYsMCx7MH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTd9LAotCi0KLS8qIDEwMTEgMDExMSBzc3NzIGRkZGQgKioqIHNiYyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNiYyByZCxycyIsMTYsNSwKLTB4M2MsCi0jZW5kaWYKLSJzYmMiLE9QQ19zYmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzMTh9LAotCi0KLS8qIDEwMTEgMDExMCBzc3NzIGRkZGQgKioqIHNiY2IgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNiY2IgcmJkLHJicyIsOCw1LAotMHgzZiwKLSNlbmRpZgotInNiY2IiLE9QQ19zYmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzE5fSwKLQotCi0vKiAwMTExIDExMTEgaW1tOCAqKiogc2MgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNjIGltbTgiLDgsMzMsCi0weDNmLAotI2VuZGlmCi0ic2MiLE9QQ19zYywwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDMyMH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGEgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGEgcmQscnMiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotInNkYSIsT1BDX3NkYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyMX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGFiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYWIgcmJkLHJzIiw4LDE1LAotMHgzYywKLSNlbmRpZgotInNkYWIiLE9QQ19zZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIyfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYWwgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhbCBycmQscnMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotInNkYWwiLE9QQ19zZGFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIzfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbCByZCxycyIsMTYsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsIixPUENfc2RsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbGIgcmJkLHJzIiw4LDE1LAotMHgzOCwKLSNlbmRpZgotInNkbGIiLE9QQ19zZGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxsIHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbGwgcnJkLHJzIiwzMiwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGxsIixPUENfc2RsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjZ9LAotCi0KLS8qIDAwMTAgMDEwMSBkZE4wIGltbTQgKioqIHNldCBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBAcmQsaW1tNCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzI3fSwKLQotCi0vKiAwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMyOH0sCi0KLQotLyogMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0IGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMjl9LAotCi0KLS8qIDEwMTAgMDEwMSBkZGRkIGltbTQgKioqIHNldCByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IHJkLGltbTQiLDE2LDQsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMwfSwKLQotCi0vKiAwMDEwIDAxMDEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHNldCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCByZCxycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMzF9LAotCi0KLS8qIDAwMTAgMDEwMCBkZE4wIGltbTQgKioqIHNldGIgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIEByZCxpbW00Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMyfSwKLQotCi0vKiAwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzM30sCi0KLQotLyogMDExMCAwMTAwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0YiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEzLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMzR9LAotCi0KLS8qIDEwMTAgMDEwMCBkZGRkIGltbTQgKioqIHNldGIgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIHJiZCxpbW00Iiw4LDQsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzV9LAotCi0KLS8qIDAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogc2V0YiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIHJiZCxycyIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzM2fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDAwMSAqKiogc2V0ZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0ZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInNldGZsZyIsT1BDX3NldGZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCsxLDAsMCwwLDAsMCx9LDEsMiwzMzd9LAotCi0KLS8qIDAwMTEgMTAxMCBkZGRkIDAxMDEgaW1tMTYgKioqIHNpbmIgcmJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luYiByYmQsaW1tMTYiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5iIixPUENfc2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzM4fSwKLQotCi0vKiAwMDExIDEwMTEgZGRkZCAwMTAxIGltbTE2ICoqKiBzaW5iIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luYiByZCxpbW0xNiIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmIiLE9QQ19zaW5iLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzMzl9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCAqKiogc2luZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNpbmQiLE9QQ19zaW5kLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQwfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luZGIgQHJkLEBycyxyYmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5kYiIsT1BDX3NpbmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQxfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5pYiBAcmQsQHJzLHJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luaWIiLE9QQ19zaW5pYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0Mn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBzaW5pYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNpbmliciIsT1BDX3NpbmliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM0M30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xhIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGEgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhIixPUENfc2xhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDR9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGFiIixPUENfc2xhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhbCIsT1BDX3NsYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ2fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGwgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbCByZCxpbW04IiwxNiwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGwiLE9QQ19zbGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0N30sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTggKioqIHNsbGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGxiIHJiZCxpbW04Iiw4LDEzLAotMHgzOCwKLSNlbmRpZgotInNsbGIiLE9QQ19zbGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDh9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMDAwMCAwMDAwIGltbTggKioqIHNsbGwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGxsIHJyZCxpbW04IiwzMiwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGxsIixPUENfc2xsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ5fSwKLQotCi0vKiAwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0IGltbTE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dCBpbW0xNixycyIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0IixPUENfc291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzcsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzUwfSwKLQotCi0vKiAwMDExIDEwMTAgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0YiBpbW0xNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0YiBpbW0xNixyYnMiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0YiIsT1BDX3NvdXRiLDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNyxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNTF9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRkIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGQiLE9QQ19zb3V0ZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUyfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRkYiBAcmQsQHJzLHJiYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRkYiIsT1BDX3NvdXRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUzfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRpYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGliIEByZCxAcnMscmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0aWIiLE9QQ19zb3V0aWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTR9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogc291dGliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRpYnIiLE9QQ19zb3V0aWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMzU1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmEgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYSByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmEiLE9QQ19zcmEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTZ9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNyYWIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmFiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNyYWIiLE9QQ19zcmFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTd9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTggKioqIHNyYWwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmFsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmFsIixPUENfc3JhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU4fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmwgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybCByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmwiLE9QQ19zcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTl9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNybGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmxiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNybGIiLE9QQ19zcmxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNjB9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMTExMSAxMTExIG5pbTggKioqIHNybGwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmxsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmxsIixPUENfc3JsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM2MX0sCi0KLQotLyogMDAwMCAwMDExIHNzTjAgZGRkZCAqKiogc3ViIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzYyfSwKLQotCi0vKiAwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWIgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjN9LAotCi0KLS8qIDAxMDAgMDAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YiByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjR9LAotCi0KLS8qIDAwMDAgMDAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIHN1YiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNjV9LAotCi0KLS8qIDEwMDAgMDAxMSBzc3NzIGRkZGQgKioqIHN1YiByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzY2fSwKLQotCi0vKiAwMDAwIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxAcnMiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2N30sCi0KLQotLyogMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjh9LAotCi0KLS8qIDAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2OX0sCi0KLQotLyogMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIHN1YmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxpbW04Iiw4LDcsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDM3MH0sCi0KLQotLyogMTAwMCAwMDEwIHNzc3MgZGRkZCAqKiogc3ViYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQscmJzIiw4LDQsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcxfSwKLQotCi0vKiAwMDAxIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcyfSwKLQotCi0vKiAwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzczfSwKLQotCi0vKiAwMTAxIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzc0fSwKLQotCi0vKiAwMDAxIDAwMTAgMDAwMCBkZGRkIGltbTMyICoqKiBzdWJsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDM3NX0sCi0KLQotLyogMTAwMSAwMDEwIHNzc3MgZGRkZCAqKiogc3VibCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3Nn0sCi0KLQotLyogMTAxMCAxMTExIGRkZGQgY2NjYyAqKiogdGNjIGNjLHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGNjIGNjLHJkIiwxNiw1LAotMHgwMCwKLSNlbmRpZgotInRjYyIsT1BDX3RjYywwLHtDTEFTU19DQyxDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzd9LAotCi0KLS8qIDEwMTAgMTExMCBkZGRkIGNjY2MgKioqIHRjY2IgY2MscmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGNjYiBjYyxyYmQiLDgsNSwKLTB4MDAsCi0jZW5kaWYKLSJ0Y2NiIixPUENfdGNjYiwwLHtDTEFTU19DQyxDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMDAgKioqIHRlc3QgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBAcmQiLDE2LDgsCi0weDE4LAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzc5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0IGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBhZGRyZXNzX2RzdCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODB9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3QgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4MX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDEwMCAqKiogdGVzdCByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgcmQiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4Mn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDEwMCAqKiogdGVzdGIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgQHJkIiw4LDgsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODN9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3RiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgYWRkcmVzc19kc3QiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4NH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgYWRkcmVzc19kc3QocmQpIiw4LDEyLAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg1fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMTAwICoqKiB0ZXN0YiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiByYmQiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODZ9LAotCi0KLS8qIDAwMDEgMTEwMCBkZE4wIDEwMDAgKioqIHRlc3RsIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIEByZCIsMzIsMTMsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiwzODd9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgYWRkcmVzc19kc3QiLDMyLDE2LAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODh9LAotCi0KLS8qIDAxMDEgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsMzIsMTcsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODl9LAotCi0KLS8qIDEwMDEgMTEwMCBkZGRkIDEwMDAgKioqIHRlc3RsIHJyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIHJyZCIsMzIsMTMsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsMzkwfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAxMDAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmRiIEByZCxAcnMscmJhIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyZGIiLE9QQ190cmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkxfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZHJiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJkcmIgQHJkLEBycyxyYmEiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJkcmIiLE9QQ190cmRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkyfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaWIgQHJkLEBycyxyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmliIEByZCxAcnMscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyaWIiLE9QQ190cmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkzfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaXJiIEByZCxAcnMscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJpcmIgQHJkLEBycyxyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJpcmIiLE9QQ190cmlyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NH0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRkYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGRiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGRiIixPUENfdHJ0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NX0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMTExMCAwMDAwIHJycnIgYmJOMCAxMTEwICoqKiB0cnRkcmIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRkcmIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0ZHJiIixPUENfdHJ0ZHJiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzB4ZSwwLH0sMyw0LDM5Nn0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRpYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGliIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGliIixPUENfdHJ0aWIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTd9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCAqKiogdHJ0aXJiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0aXJiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGlyYiIsT1BDX3RydGlyYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMHhlLDAsfSwzLDQsMzk4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTEwICoqKiB0c2V0IEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgQHJkIiwxNiwxMSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiwzOTl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXQgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IGFkZHJlc3NfZHN0IiwxNiwxNCwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwMH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsMTYsMTUsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDAxfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMTEwICoqKiB0c2V0IHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCByZCIsMTYsNywKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDAyfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTEwICoqKiB0c2V0YiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBAcmQiLDgsMTEsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDN9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXRiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgYWRkcmVzc19kc3QiLDgsMTQsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwNH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldGIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgYWRkcmVzc19kc3QocmQpIiw4LDE1LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDA1fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMTEwICoqKiB0c2V0YiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiByYmQiLDgsNywKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDZ9LAotCi0KLS8qIDAwMDAgMTAwMSBzc04wIGRkZGQgKioqIHhvciByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsQHJzIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQwN30sCi0KLQotLyogMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA4fSwKLQotCi0vKiAwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3IgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA5fSwKLQotCi0vKiAwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiB4b3IgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsaW1tMTYiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNDEwfSwKLQotCi0vKiAxMDAwIDEwMDEgc3NzcyBkZGRkICoqKiB4b3IgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQscnMiLDE2LDQsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxMX0sCi0KLQotLyogMDAwMCAxMDAwIHNzTjAgZGRkZCAqKiogeG9yYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsQHJzIiw4LDcsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTJ9LAotCi0KLS8qIDAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvcmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDEzfSwKLQotCi0vKiAwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MTR9LAotCi0KLS8qIDAwMDAgMTAwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiB4b3JiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsaW1tOCIsOCw3LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw0MTV9LAotCi0KLS8qIDEwMDAgMTAwMCBzc3NzIGRkZGQgKioqIHhvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLHJicyIsOCw0LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxNn0sCi0KLQotLyogMTAwMCAxMDAwIHNzc3MgZGRkZCAqKiogeG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQscmJzIiw4LDQsCi0weDAxLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDE3fSwKLTAsMH07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvejhrZ2VuLmMgYi9vcGNvZGVzL3o4a2dlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGRmMGIyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEyICswLDAgQEAKLS8qCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBwcm9ncmFtIGdlbmVyYXRlcyB6OGstb3BjLmggKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIEJZVEVfSU5GT19MRU4gMTAKLQotc3RydWN0IG9wCi17Ci0gIGNoYXIgKmZsYWdzOwotICBpbnQgY3ljbGVzOwotICBjaGFyIHR5cGU7Ci0gIGNoYXIgKmJpdHM7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKmZsYXZvcjsKLX07Ci0KLSNkZWZpbmUgaXN3aGl0ZSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLXN0cnVjdCBvcCBvcHRbXSA9Ci17Ci0gICItLS0tLS0iLCAxMCwgOCwgIjAwMDAgMTExMCBpbW04IiwgImV4dDBlIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTEgaW1tOCIsICJleHQwZiBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMCAxMTEwIGltbTgiLCAiZXh0OGUgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMSBpbW04IiwgImV4dDhmIGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMDExMCBpbW04IiwgInJzdmQzNiIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTAwMCBpbW04IiwgInJzdmQzOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTAwMCBpbW04IiwgInJzdmQ3OCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTEgMTExMCBpbW04IiwgInJzdmQ3ZSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTAxIGltbTgiLCAicnN2ZDlkIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMSAxMTExIGltbTgiLCAicnN2ZDlmIiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDEwMDEgaW1tOCIsICJyc3ZkYjkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDExIDExMTEgaW1tOCIsICJyc3ZkYmYiLCAwLAotCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkZHIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyYiBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGlyIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaSByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaXIgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyIHJkLEBycyxycixjYyIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZCByZCxAcnMscnIsY2MiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpcmIgQHJkLEBycyxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGRiIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRpYiBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZGIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaWIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZGIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkcmIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaSBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2liIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaXJiIEByZCxAcnMscnIsY2MiLCAwLAotCi0gICItLS0tLS0iLCAyLCA4LCAiMDAxMSAwMTEwIDAwMDAgMDAwMCIsICJicHQiLCAwLAotICAiQ1pTVi0tIiwgNSwgMTYsICIxMDExIDAxMDEgc3NzcyBkZGRkIiwgImFkYyByZCxycyIsIDAsCi0gICJDWlNWREgiLCA1LCA4LCAiMTAxMSAwMTAwIHNzc3MgZGRkZCIsICJhZGNiIHJiZCxyYnMiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMDEgc3NOMCBkZGRkIiwgImFkZCByZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJhZGQgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMDEgc3NzcyBkZGRkIiwgImFkZCByZCxycyIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDAwIHNzTjAgZGRkZCIsICJhZGRiIHJiZCxAcnMiLCAwLAotIkNaU1ZESCIsIDksIDgsICIwMTAwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1ZESCIsIDEwLCA4LCAiMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFkZGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVkRIIiwgNCwgOCwgIjEwMDAgMDAwMCBzc3NzIGRkZGQiLCAiYWRkYiByYmQscmJzIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCBzc04wIGRkZGQiLCAiYWRkbCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiIsICJhZGRsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDExMCBzc3NzIGRkZGQiLCAiYWRkbCBycmQscnJzIiwgMCwKLQotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDAxMTEgc3NOMCBkZGRkIiwgImFuZCByZCxAcnMiLCAwLAotIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAwMTExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiIsICJhbmQgcmQsaW1tMTYiLCAwLAotICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDAxMTEgc3NzcyBkZGRkIiwgImFuZCByZCxycyIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTEwIHNzTjAgZGRkZCIsICJhbmRiIHJiZCxAcnMiLCAwLAotIi1aU1AtLSIsIDksIDgsICIwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aU1AtLSIsIDEwLCA4LCAiMDEwMCAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImFuZGIgcmJkLGltbTgiLCAwLAotICAiLVpTUC0tIiwgNCwgOCwgIjEwMDAgMDExMCBzc3NzIGRkZGQiLCAiYW5kYiByYmQscmJzIiwgMCwKLQotICAiLVotLS0tIiwgOCwgMTYsICIwMDEwIDAxMTEgZGROMCBpbW00IiwgImJpdCBAcmQsaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMSwgMTYsICIwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMCwgMTYsICIwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTExIGRkZGQgaW1tNCIsICJiaXQgcmQsaW1tNCIsIDAsCi0iLVotLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgImJpdCByZCxycyIsIDAsCi0KLSAgIi1aLS0tLSIsIDgsIDgsICIwMDEwIDAxMTAgZGROMCBpbW00IiwgImJpdGIgQHJkLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTEsIDgsICIwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTAsIDgsICIwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgImJpdGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItWi0tLS0iLCA0LCA4LCAiMTAxMCAwMTEwIGRkZGQgaW1tNCIsICJiaXRiIHJiZCxpbW00IiwgMCwKLSItWi0tLS0iLCAxMCwgOCwgIjAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXRiIHJiZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCAzMiwgIjAwMDEgMTExMSBkZE4wIDAwMDAiLCAiY2FsbCBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCIsICJjYWxsIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAzMiwgIjAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMTEwMSBkaXNwMTIiLCAiY2FsciBkaXNwMTIiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDEwMDAiLCAiY2xyIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTAwIDExMDEgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNsciBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAxMDAwIiwgImNsciByZCIsIDAsCi0gICItLS0tLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMTAwMCIsICJjbHJiIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDEwMDAiLCAiY2xyYiByYmQiLCAwLAotICAiLVpTLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDAwMCIsICJjb20gQHJkIiwgMCwKLSAgIi1aUy0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aUy0tLSIsIDE2LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAwMDAiLCAiY29tIHJkIiwgMCwKLSAgIi1aU1AtLSIsIDEyLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMCIsICJjb21iIEByZCIsIDAsCi0gICItWlNQLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlNQLS0iLCAxNiwgOCwgIjAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QiLCAiY29tYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAwMDAiLCAiY29tYiByYmQiLCAwLAotICAiQ1pTUC0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMTAxIiwgImNvbWZsZyBmbGFncyIsIDAsCi0KLSAgIkNaU1YtLSIsIDExLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDEgaW1tMTYiLCAiY3AgQHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAiY3AgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSBzc04wIGRkZGQiLCAiY3AgcmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiY3AgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDEwMTEgc3NzcyBkZGRkIiwgImNwIHJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMDAxIGltbTggaW1tOCIsICJjcGIgQHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJjcGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMDAwMCAxMDEwIHNzTjAgZGRkZCIsICJjcGIgcmJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgOCwgIjAxMDAgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgOCwgIjAxMDAgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgImNwYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCA0LCA4LCAiMTAwMCAxMDEwIHNzc3MgZGRkZCIsICJjcGIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCBzc04wIGRkZGQiLCAiY3BsIHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMDEwMSAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJjcGwgcnJkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDgsIDMyLCAiMTAwMSAwMDAwIHNzc3MgZGRkZCIsICJjcGwgcnJkLHJycyIsIDAsCi0KLSAgIkNaUy0tLSIsIDUsIDgsICIxMDExIDAwMDAgZGRkZCAwMDAwIiwgImRhYiByYmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDFkaXNwNyIsICJkYmpueiByYmQsZGlzcDciLCAwLAotICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDExIGRkTjAgaW1tNG0xIiwgImRlYyBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAxMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAxMSBkZGRkIGltbTRtMSIsICJkZWMgcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDEwIGRkTjAgaW1tNG0xIiwgImRlY2IgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAxMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMTAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAxMCBkZGRkIGltbTRtMSIsICJkZWNiIHJiZCxpbW00bTEiLCAwLAotCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMTEgMTEwMCAwMDAwIDAwaWkiLCAiZGkgaTIiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSBzc04wIGRkZGQiLCAiZGl2IHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDEwMSAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiIsICJkaXYgcnJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIxMDAxIDEwMTEgc3NzcyBkZGRkIiwgImRpdiBycmQscnMiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCBzc04wIGRkZGQiLCAiZGl2bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDc0NSwgMzIsICIwMTAxIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDc0NiwgMzIsICIwMTAxIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMDAwMSAxMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJkaXZsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMTAwMSAxMDEwIHNzc3MgZGRkZCIsICJkaXZsIHJxZCxycnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIxMTExIGRkZGQgMGRpc3A3IiwgImRqbnogcmQsZGlzcDciLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMWlpIiwgImVpIGkyIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTAxMCAxMTAxIHNzc3MgZGRkZCIsICJleCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDEwIDExMDEgc3NOMCBkZGRkIiwgImV4IHJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDE2LCAiMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTEwIDExMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMCAxMTAwIHNzTjAgZGRkZCIsICJleGIgcmJkLEBycyIsIDAsCi0iLS0tLS0tIiwgMTUsIDgsICIwMTEwIDExMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDgsICIwMTEwIDExMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4YiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDgsICIxMDEwIDExMDAgc3NzcyBkZGRkIiwgImV4YiByYmQscmJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTAxMSAwMDAxIGRkZGQgMTAxMCIsICJleHRzIHJyZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjEwMTEgMDAwMSBkZGRkIDAwMDAiLCAiZXh0c2IgcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMTAxMSAwMDAxIGRkZGQgMDExMSIsICJleHRzbCBycWQiLCAwLAotCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMTEgMTAxMCAwMDAwIDAwMDAiLCAiaGFsdCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMDExIDExMDEgc3NOMCBkZGRkIiwgImluIHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2IiwgImluIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDAxMSAxMTAwIHNzTjAgZGRkZCIsICJpbmIgcmJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDAgaW1tMTYiLCAiaW5iIHJiZCxpbW0xNiIsIDAsCi0gICItWlNWLS0iLCAxMSwgMTYsICIwMDEwIDEwMDEgZGROMCBpbW00bTEiLCAiaW5jIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDE2LCAiMDExMCAxMDAxIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCAxNiwgIjAxMTAgMTAwMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDE2LCAiMTAxMCAxMDAxIGRkZGQgaW1tNG0xIiwgImluYyByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTEsIDgsICIwMDEwIDEwMDAgZGROMCBpbW00bTEiLCAiaW5jYiBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCA4LCAiMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgOCwgIjAxMTAgMTAwMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCA4LCAiMTAxMCAxMDAwIGRkZGQgaW1tNG0xIiwgImluY2IgcmJkLGltbTRtMSIsIDAsCi0gICItLS1WLS0iLCAyMSwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS1WLS0iLCAyMSwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAwMDAwIiwgImluaWJyIEByZCxAcnMscmEiLCAwLAotICAiQ1pTVkRIIiwgMTMsIDE2LCAiMDExMSAxMDExIDAwMDAgMDAwMCIsICJpcmV0IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjAwMDEgMTExMCBkZE4wIGNjY2MiLCAianAgY2MsQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDEwMSAxMTEwIDAwMDAgY2NjYyBhZGRyZXNzX2RzdCIsICJqcCBjYyxhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDYsIDE2LCAiMTExMCBjY2NjIGRpc3A4IiwgImpyIGNjLGRpc3A4IiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIwMDAwIDExMDEgZGROMCAwMTAxIGltbTE2IiwgImxkIEByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjAwMTAgMTExMSBkZE4wIHNzc3MiLCAibGQgQHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QocmQpLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMTAgMTExMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QocmQpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYiLCAibGQgYWRkcmVzc19kc3QsaW1tMTYiLCAwLAotIi0tLS0tLSIsIDExLCAxNiwgIjAxMTAgMTExMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGQgYWRkcmVzc19kc3QscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIGRkTjAgc3NzcyBpbW0xNiIsICJsZCByZChpbW0xNikscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMSAwMDExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkIHJkKHJ4KSxycyIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSBzc04wIGRkZGQiLCAibGQgcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMTEwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMTAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibGQgcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMywgMTYsICIxMDEwIDAwMDEgc3NzcyBkZGRkIiwgImxkIHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYiLCAibGQgcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCA3LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMSBpbW04IGltbTgiLCAibGRiIEByZCxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDgsIDgsICIwMDEwIDExMTAgZGROMCBzc3NzIiwgImxkYiBAcmQscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDEwMCAxMTEwIGRkTjAgc3NOMCBhZGRyZXNzX2RzdCIsICJsZGIgYWRkcmVzc19kc3QocmQpLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdCxpbW04IiwgMCwKLSItLS0tLS0iLCAxMSwgOCwgIjAxMTAgMTExMCAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0LHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYiLCAibGRiIHJkKGltbTE2KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTExIDAwMTAgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRiIHJkKHJ4KSxyYnMiLCAwLAotICAiLS0tLS0tIiwgNywgOCwgIjAwMTAgMDAwMCBzc04wIGRkZGQiLCAibGRiIHJiZCxAcnMiLCAwLAotIi0tLS0tLSIsIDksIDgsICIwMTEwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTEwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDgsICIxMTAwIGRkZGQgaW1tOCIsICJsZGIgcmJkLGltbTgiLCAwLAotICAiLS0tLS0tIiwgMywgOCwgIjEwMTAgMDAwMCBzc3NzIGRkZGQiLCAibGRiIHJiZCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYiByYmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByYmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAxMTAxIGRkTjAgc3NzcyIsICJsZGwgQHJkLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMzIsICIwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAzMiwgIjAxMDEgMTEwMSAwMDAwIHNzc3MgYWRkcmVzc19kc3QiLCAibGRsIGFkZHJlc3NfZHN0LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgZGROMCBzc3NzIGltbTE2IiwgImxkbCByZChpbW0xNikscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAxMTEgMDExMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGwgcmQocngpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgc3NOMCBkZGRkIiwgImxkbCBycmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGRsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMDEwMCAwMDAwIGRkZGQgaW1tMzIiLCAibGRsIHJyZCxpbW0zMiIsIDAsCi0gICItLS0tLS0iLCA1LCAzMiwgIjEwMDEgMDEwMCBzc3NzIGRkZGQiLCAibGRsIHJyZCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIHNzTjAgZGRkZCBpbW0xNiIsICJsZGwgcnJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJyZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYSBwcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgc3NOMCBkZGRkIGltbTE2IiwgImxkYSBwcmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGEgcHJkLHJzKHJ4KSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMDExIDAxMDAgMDAwMCBkZGRkIGRpc3AxNiIsICJsZGFyIHByZCxkaXNwMTYiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgc3NzcyAxY2NjIiwgImxkY3RsIGN0cmwscnMiLCAwLAotICAiLS0tLS0tIiwgNywgMzIsICIwMTExIDExMDEgZGRkZCAwY2NjIiwgImxkY3RsIHJkLGN0cmwiLCAwLAotCi0gICItLS0tLS0iLCA1LCAxNiwgIjEwMTEgMTEwMSBkZGRkIGltbTQiLCAibGRrIHJkLGltbTQiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEiLCAibGRtIEByZCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc04wIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0IiwgImxkbSBhZGRyZXNzX2RzdCxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSIsICJsZG0gcmQsQHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDEwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyhycyksbiIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDExMDAgMDAwMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMiLCAibGRtIHJkLGFkZHJlc3Nfc3JjLG4iLCAwLAotCi0gICJDWlNWREgiLCAxMiwgMTYsICIwMDExIDEwMDEgc3NOMCAwMDAwIiwgImxkcHMgQHJzIiwgMCwKLSAgIkNaU1ZESCIsIDE2LCAxNiwgIjAxMTEgMTAwMSAwMDAwIDAwMDAgYWRkcmVzc19zcmMiLCAibGRwcyBhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxNywgMTYsICIwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMocnMpIiwgMCwKLQotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDExIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyIGRpc3AxNixycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHIgcmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDEwIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRyYiBkaXNwMTYscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyYiByYmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmwgZGlzcDE2LHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHJsIHJyZCxkaXNwMTYiLCAwLAotCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAxMTEgMTAxMSAwMDAwIDEwMTAiLCAibWJpdCIsIDAsCi0gICItWlMtLS0iLCAxMiwgMTYsICIwMTExIDEwMTEgZGRkZCAxMTAxIiwgIm1yZXEgcmQiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAxIiwgIm1yZXMiLCAwLAotICAiLS0tLS0tIiwgNSwgMTYsICIwMTExIDEwMTEgMDAwMCAxMDAwIiwgIm1zZXQiLCAwLAotCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgc3NOMCBkZGRkIiwgIm11bHQgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAxMDEgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAwMDEgMTAwMSAwMDAwIGRkZGQgaW1tMTYiLCAibXVsdCBycmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMTAwMSAxMDAxIHNzc3MgZGRkZCIsICJtdWx0IHJyZCxycyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIHNzTjAgZGRkZCIsICJtdWx0bCBycWQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMTAxIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyIiwgIm11bHRsIHJxZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMTAwMSAxMDAwIHNzc3MgZGRkZCIsICJtdWx0bCBycWQscnJzIiwgMCwKLSAgIkNaU1YtLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMTAiLCAibmVnIEByZCIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdCIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZyBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDEwIiwgIm5lZyByZCIsIDAsCi0gICJDWlNWLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMTAiLCAibmVnYiBAcmQiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDEwIGFkZHJlc3NfZHN0IiwgIm5lZ2IgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDEwIiwgIm5lZ2IgcmJkIiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgMDAwMCAwMTExIiwgIm5vcCIsIDAsCi0KLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIHNzTjAgZGRkZCIsICJvciByZCxAcnMiLCAwLAotICAiQ1pTLS0tIiwgOSwgMTYsICIwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTAxIDAwMDAgZGRkZCBpbW0xNiIsICJvciByZCxpbW0xNiIsIDAsCi0gICJDWlMtLS0iLCA0LCAxNiwgIjEwMDAgMDEwMSBzc3NzIGRkZGQiLCAib3IgcmQscnMiLCAwLAotCi0gICJDWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTAwIHNzTjAgZGRkZCIsICJvcmIgcmJkLEBycyIsIDAsCi0iQ1pTUC0tIiwgOSwgOCwgIjAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgIm9yYiByYmQsaW1tOCIsIDAsCi0gICJDWlNQLS0iLCA0LCA4LCAiMTAwMCAwMTAwIHNzc3MgZGRkZCIsICJvcmIgcmJkLHJicyIsIDAsCi0KLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMTExIGRkTjAgc3NzcyIsICJvdXQgQHJkLHJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiIsICJvdXQgaW1tMTYscnMiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTExMCBkZE4wIHNzc3MiLCAib3V0YiBAcmQscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2IiwgIm91dGIgaW1tMTYscmJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAib3V0aWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMDEgMDExMSBzc04wIGRkTjAiLCAicG9wIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcCBhZGRyZXNzX2RzdCxAcnMiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIxMDAxIDAxMTEgc3NOMCBkZGRkIiwgInBvcCByZCxAcnMiLCAwLAotCi0gICItLS0tLS0iLCAxOSwgMzIsICIwMDAxIDAxMDEgc3NOMCBkZE4wIiwgInBvcGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMywgMzIsICIwMTAxIDAxMDEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0IiwgInBvcGwgYWRkcmVzc19kc3QsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDEwMSBzc04wIGRkZGQiLCAicG9wbCBycmQsQHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDAwMSAwMDExIGRkTjAgc3NOMCIsICJwdXNoIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDAwMTEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2ggQHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2IiwgInB1c2ggQHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDksIDE2LCAiMTAwMSAwMDExIGRkTjAgc3NzcyIsICJwdXNoIEByZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDIwLCAzMiwgIjAwMDEgMDAwMSBkZE4wIHNzTjAiLCAicHVzaGwgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAyMSwgMzIsICIwMTAxIDAwMDEgZGROMCBzc04wIGFkZHJlc3Nfc3JjIiwgInB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMTAwMSAwMDAxIGRkTjAgc3NzcyIsICJwdXNobCBAcmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMDExIGRkTjAgaW1tNCIsICJyZXMgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMDExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXMgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDAxMSBkZGRkIGltbTQiLCAicmVzIHJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDAxMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXMgcmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDAxMCBkZE4wIGltbTQiLCAicmVzYiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDAxMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzYiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAwMTAgZGRkZCBpbW00IiwgInJlc2IgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMDEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInJlc2IgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDExIiwgInJlc2ZsZyBpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjEwMDEgMTExMCAwMDAwIGNjY2MiLCAicmV0IGNjIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMEkwIiwgInJsIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwSTAiLCAicmxiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTBJMCIsICJybGMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMEkwIiwgInJsY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTExMCBhYWFhIGJiYmIiLCAicmxkYiByYmIscmJhIiwgMCwKLQotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAwMUkwIiwgInJyIHJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgOCwgIjEwMTEgMDAxMCBkZGRkIDAxSTAiLCAicnJiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTFJMCIsICJycmMgcmQsaW1tMW9yMiIsIDAsCi0KLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDAwMTAgZGRkZCAxMUkwIiwgInJyY2IgcmJkLGltbTFvcjIiLCAwLAotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMTEwMCBhYWFhIGJiYmIiLCAicnJkYiByYmIscmJhIiwgMCwKLSAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTExIHNzc3MgZGRkZCIsICJzYmMgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDExMCBzc3NzIGRkZGQiLCAic2JjYiByYmQscmJzIiwgMCwKLQotICAiQ1pTVkRIIiwgMzMsIDgsICIwMTExIDExMTEgaW1tOCIsICJzYyBpbW04IiwgMCwKLQotIkNaU1YtLSIsIDE1LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGEgcmQscnMiLCAwLAotIkNaU1YtLSIsIDE1LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkYWIgcmJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFsIHJyZCxycyIsIDAsCi0KLSJDWlMtLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsIHJkLHJzIiwgMCwKLSJDWlMtLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGxiIHJiZCxycyIsIDAsCi0gICJDWlMtLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAwMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsbCBycmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDEwIDAxMDEgZGROMCBpbW00IiwgInNldCBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgMTYsICIwMTEwIDAxMDEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldCBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDE2LCAiMTAxMCAwMTAxIGRkZGQgaW1tNCIsICJzZXQgcmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDE2LCAiMDAxMCAwMTAxIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxMSwgOCwgIjAwMTAgMDEwMCBkZE4wIGltbTQiLCAic2V0YiBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTAgMDEwMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgOCwgIjAxMTAgMDEwMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAic2V0YiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDgsICIxMDEwIDAxMDAgZGRkZCBpbW00IiwgInNldGIgcmJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCA4LCAiMDAxMCAwMTAwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInNldGIgcmJkLHJzIiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIxMDAwIDExMDEgaW1tNCAwMDAxIiwgInNldGZsZyBpbW00IiwgMCwKLQotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByYmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMSBkZGRkIDAxMDEgaW1tMTYiLCAic2luYiByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCIsICJzaW5kYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNpbmliIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAic2luaWJyIEByZCxAcnMscmEiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsYSByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xhYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsYWwgcnJkLGltbTgiLCAwLAotCi0gICJDWlMtLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04IiwgInNsbCByZCxpbW04IiwgMCwKLSAgIkNaUy0tLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTgiLCAic2xsYiByYmQsaW1tOCIsIDAsCi0gICJDWlMtLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDAwMDAgMDAwMCBpbW04IiwgInNsbGwgcnJkLGltbTgiLCAwLAotCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTEgaW1tMTYiLCAic291dCBpbW0xNixycyIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMSBpbW0xNiIsICJzb3V0YiBpbW0xNixyYnMiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic291dGQgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRpYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNvdXRpYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTgiLCAic3JhIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYWIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAxMTExIDExMTEgbmltOCIsICJzcmFsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCIsICJzcmwgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAwMTAxIDExMTEgMTExMSBuaW04IiwgInNybGwgcnJkLGltbTgiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAxMSBzc04wIGRkZGQiLCAic3ViIHJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgMTYsICIwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDAwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YiByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTE2IiwgInN1YiByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA0LCAxNiwgIjEwMDAgMDAxMSBzc3NzIGRkZGQiLCAic3ViIHJkLHJzIiwgMCwKLQotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAxMCBzc04wIGRkZGQiLCAic3ViYiByYmQsQHJzIiwgMCwKLSJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJzdWJiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMTAgc3NzcyBkZGRkIiwgInN1YmIgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCBzc04wIGRkZGQiLCAic3VibCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDEwIDAwMDAgZGRkZCBpbW0zMiIsICJzdWJsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAxMCBzc3NzIGRkZGQiLCAic3VibCBycmQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgNSwgMTYsICIxMDEwIDExMTEgZGRkZCBjY2NjIiwgInRjYyBjYyxyZCIsIDAsCi0gICItLS0tLS0iLCA1LCA4LCAiMTAxMCAxMTEwIGRkZGQgY2NjYyIsICJ0Y2NiIGNjLHJiZCIsIDAsCi0KLSAgIi1aUy0tLSIsIDgsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMCIsICJ0ZXN0IEByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3QgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMDAiLCAidGVzdCByZCIsIDAsCi0KLSAgIi1aU1AtLSIsIDgsIDgsICIwMDAwIDExMDAgZGROMCAwMTAwIiwgInRlc3RiIEByZCIsIDAsCi0gICItWlNQLS0iLCAxMSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdGIgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTUC0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDEwMCIsICJ0ZXN0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCAxMywgMzIsICIwMDAxIDExMDAgZGROMCAxMDAwIiwgInRlc3RsIEByZCIsIDAsCi0iLVpTLS0tIiwgMTYsIDMyLCAiMDEwMSAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlMtLS0iLCAxNywgMzIsICIwMTAxIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlMtLS0iLCAxMywgMzIsICIxMDAxIDExMDAgZGRkZCAxMDAwIiwgInRlc3RsIHJyZCIsIDAsCi0KLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTAwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAiLCAidHJkcmIgQHJkLEBycyxyYmEiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDAxMDAgMDAwMCBycnJyIHNzTjAgMDAwMCIsICJ0cmlyYiBAcmQsQHJzLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDExMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRkcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0aWIgQHJhLEByYixyciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCIsICJ0cnRpcmIgQHJhLEByYixyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAiLCAidHJ0cmIgQHJhLEByYixyYnIiLCAwLAotCi0gICItLVMtLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMTEwIiwgInRzZXQgQHJkIiwgMCwKLSAgIi0tUy0tLSIsIDE0LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLVMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tUy0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDExMCIsICJ0c2V0IHJkIiwgMCwKLQotICAiLS1TLS0tIiwgMTEsIDgsICIwMDAwIDExMDAgZGROMCAwMTEwIiwgInRzZXRiIEByZCIsIDAsCi0gICItLVMtLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldGIgYWRkcmVzc19kc3QiLCAwLAotICAiLS1TLS0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLVMtLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDExMCIsICJ0c2V0YiByYmQiLCAwLAotCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMTAwMSBzc04wIGRkZGQiLCAieG9yIHJkLEBycyIsIDAsCi0iLVpTLS0tIiwgOSwgMTYsICIwMTAwIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlMtLS0iLCAxMCwgMTYsICIwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvciByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgInhvciByZCxpbW0xNiIsIDAsCi0gICItWlMtLS0iLCA0LCAxNiwgIjEwMDAgMTAwMSBzc3NzIGRkZGQiLCAieG9yIHJkLHJzIiwgMCwKLQotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMTAwMCBzc04wIGRkZGQiLCAieG9yYiByYmQsQHJzIiwgMCwKLSItWlNQLS0iLCA5LCA4LCAiMDEwMCAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3JiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJ4b3JiIHJiZCxpbW04IiwgMCwKLSAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCi0gICIqIiwgNCwgOCwgIjEwMDAgMTAwMCBzc3NzIGRkZGQiLCAieG9yYiByYmQscmJzIiwgMCwKLSAgIioiLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi1pbnQKLWNvdW50ICgpCi17Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IHIgPSAwOwotCi0gIHdoaWxlIChwLT5uYW1lKQotICAgIHsKLSAgICAgIHIrKzsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHJldHVybiByOwotCi19Ci0KLXN0YXRpYwotaW50Ci1mdW5jIChhLCBiKQotICAgICBzdHJ1Y3Qgb3AgKmE7Ci0gICAgIHN0cnVjdCBvcCAqYjsKLXsKLSAgcmV0dXJuIHN0cmNtcCAoKGEpLT5uYW1lLCAoYiktPm5hbWUpOwotfQotCi0KLS8qIG9wY29kZQotCi0gbGl0ZXJhbCAgMDAwMCBubm5uIGluc2VydCBubm4gaW50byBzdHJlYW0KLSBvcGVyYW5kICAwMDAxIG5ubm4gIGluc2VydCBvcGVyYW5kIHJlZyBubm4gaW50byBzdHJlYW0KLSovCi0KLXN0cnVjdCB0b2tfc3RydWN0Ci17Ci0KLSAgY2hhciAqbWF0Y2g7Ci0gIGNoYXIgKnRva2VuOwotICBpbnQgbGVuZ3RoOwotfTsKLQotc3RydWN0IHRva19zdHJ1Y3QgYXJnc1tdID0KLXsKLQotICB7ImFkZHJlc3Nfc3JjKHJzKSIsICJDTEFTU19YKyhBUkdfUlMpIix9LAotICB7ImFkZHJlc3NfZHN0KHJkKSIsICJDTEFTU19YKyhBUkdfUkQpIix9LAotCi0gIHsicnMoaW1tMTYpIiwgIkNMQVNTX0JBKyhBUkdfUlMpIix9LAotICB7InJkKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JEKSIsfSwKLSAgeyJwcmQiLCAgICAgICAiQ0xBU1NfUFIrKEFSR19SRCkiLH0sCi0gIHsiYWRkcmVzc19zcmMiLCAiQ0xBU1NfREErKEFSR19TUkMpIix9LAotICB7ImFkZHJlc3NfZHN0IiwgIkNMQVNTX0RBKyhBUkdfRFNUKSIsfSwKLSAgeyJyZChyeCkiLCAiQ0xBU1NfQlgrKEFSR19SRCkiLH0sCi0gIHsicnMocngpIiwgIkNMQVNTX0JYKyhBUkdfUlMpIix9LAotCi0gIHsiZGlzcDE2IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDEyIiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDciLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJkaXNwOCIsICJDTEFTU19ESVNQIix9LAotICB7ImZsYWdzIiwgIkNMQVNTX0ZMQUdTIix9LAotCi0gIHsiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIix9LAotICB7ImltbTFvcjIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMikiLH0sCi0gIHsiaW1tMzIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMzIpIix9LAotICB7ImltbTRtMSIsICJDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSIsfSwKLSAgeyJpbW00IiwgIkNMQVNTX0lNTSArKEFSR19JTU00KSIsfSwKLSAgeyJuIiwgIkNMQVNTX0lNTSArIChBUkdfSU1NTikiLH0sCi0gIHsiY3RybCIsICJDTEFTU19DVFJMIix9LAotICB7InJiYSIsICJDTEFTU19SRUdfQllURSsoQVJHX1JBKSIsfSwKLSAgeyJyYmIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQikiLH0sCi0gIHsicmJkIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkQpIix9LAotICB7InJicyIsICJDTEFTU19SRUdfQllURSsoQVJHX1JTKSIsfSwKLSAgeyJyYnIiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUikiLH0sCi0KLSAgeyJycmQiLCAiQ0xBU1NfUkVHX0xPTkcrKEFSR19SRCkiLH0sCi0gIHsicnJzIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUlMpIix9LAotCi0gIHsicnFkIiwgIkNMQVNTX1JFR19RVUFEKyhBUkdfUkQpIix9LAotCi0gIHsicmQiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SRCkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyJAcmQiLCAiQ0xBU1NfSVIrKEFSR19SRCkiLH0sCi0gIHsiQHJhIiwgIkNMQVNTX0lSKyhBUkdfUkEpIix9LAotICB7IkByYiIsICJDTEFTU19JUisoQVJHX1JCKSIsfSwKLSAgeyJAcnMiLCAiQ0xBU1NfSVIrKEFSR19SUykiLH0sCi0KLSAgeyJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIix9LAotICB7ImkyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTIpIix9LAotICB7ImNjIiwgIkNMQVNTX0NDIix9LAotCi0gIHsicnIiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUikiLH0sCi0gIHsicmEiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSkiLH0sCi0gIHsicnMiLCAiQ0xBU1NfUkVHX1dPUkQrKEFSR19SUykiLH0sCi0KLSAgeyIxIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8xKSIsfSwKLSAgeyIyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTV8yKSIsfSwKLQotICAwLCAwCi19OwotCi1zdHJ1Y3QgdG9rX3N0cnVjdCB0b2tzW10gPQotewotICAiMDAwMCIsICJDTEFTU19CSVQrMCIsIDEsCi0gICIwMDAxIiwgIkNMQVNTX0JJVCsxIiwgMSwKLSAgIjAwMTAiLCAiQ0xBU1NfQklUKzIiLCAxLAotICAiMDAxMSIsICJDTEFTU19CSVQrMyIsIDEsCi0gICIwMTAwIiwgIkNMQVNTX0JJVCs0IiwgMSwKLSAgIjAxMDEiLCAiQ0xBU1NfQklUKzUiLCAxLAotICAiMDExMCIsICJDTEFTU19CSVQrNiIsIDEsCi0gICIwMTExIiwgIkNMQVNTX0JJVCs3IiwgMSwKLSAgIjEwMDAiLCAiQ0xBU1NfQklUKzgiLCAxLAotICAiMTAwMSIsICJDTEFTU19CSVQrOSIsIDEsCi0gICIxMDEwIiwgIkNMQVNTX0JJVCsweGEiLCAxLAotICAiMTAxMSIsICJDTEFTU19CSVQrMHhiIiwgMSwKLSAgIjExMDAiLCAiQ0xBU1NfQklUKzB4YyIsIDEsCi0gICIxMTAxIiwgIkNMQVNTX0JJVCsweGQiLCAxLAotICAiMTExMCIsICJDTEFTU19CSVQrMHhlIiwgMSwKLSAgIjExMTEiLCAiQ0xBU1NfQklUKzB4ZiIsIDEsCi0KLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMCIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzEiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisyIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMyIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzQiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis1IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNiIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzciLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMis4IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YSIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YiIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4YyIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZCIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZSIsIDEsCi0gICIxMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzB4ZiIsIDEsCi0KLSAgInNzc3MiLCAiQ0xBU1NfUkVHKyhBUkdfUlMpIiwgMSwKLSAgImRkZGQiLCAiQ0xBU1NfUkVHKyhBUkdfUkQpIiwgMSwKLSAgImFhYWEiLCAiQ0xBU1NfUkVHKyhBUkdfUkEpIiwgMSwKLSAgImJiYmIiLCAiQ0xBU1NfUkVHKyhBUkdfUkIpIiwgMSwKLSAgInJycnIiLCAiQ0xBU1NfUkVHKyhBUkdfUlIpIiwgMSwKLQotICAic3NOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JTKSIsIDEsCi0gICJkZE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkQpIiwgMSwKLSAgImFhTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQSkiLCAxLAotICAiYmJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JCKSIsIDEsCi0gICJyck4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlIpIiwgMSwKLQotICAiY2NjYyIsICJDTEFTU19DQyIsIDEsCi0gICJubm5uIiwgIkNMQVNTX0lNTSsoQVJHX0lNTU4pIiwgMSwKLSAgInh4eHgiLCAiQ0xBU1NfUkVHKyhBUkdfUlgpIiwgMSwKLSAgInh4TjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SWCkiLCAxLAotICAibm1pbnVzMSIsICJDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSIsIDEsCi0KLSAgImRpc3AxNiIsICJDTEFTU19ESVNQKyhBUkdfRElTUDE2KSIsIDQsCi0gICJkaXNwMTIiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxMikiLCAzLAotICAiZmxhZ3MiLCAiQ0xBU1NfRkxBR1MiLCAxLAotICAiYWRkcmVzc19kc3QiLCAiQ0xBU1NfQUREUkVTUysoQVJHX0RTVCkiLCA0LAotICAiYWRkcmVzc19zcmMiLCAiQ0xBU1NfQUREUkVTUysoQVJHX1NSQykiLCA0LAotICAiaW1tNG0xIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTRNMSkiLCAxLAotICAiaW1tNCIsICJDTEFTU19JTU0rKEFSR19JTU00KSIsIDEsCi0KLSAgImltbTgiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NOCkiLCAyLAotICAiaW1tMTYiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMTYpIiwgNCwKLSAgImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsIDgsCi0gICJuaW04IiwgIkNMQVNTX0lNTSsoQVJHX05JTTgpIiwgMiwKLSAgIjBjY2MiLCAiQ0xBU1NfMENDQyIsIDEsCi0gICIxY2NjIiwgIkNMQVNTXzFDQ0MiLCAxLAotICAiZGlzcDgiLCAiQ0xBU1NfRElTUDgiLCAyLAotICAiMGRpc3A3IiwgIkNMQVNTXzBESVNQNyIsIDIsCi0gICIxZGlzcDciLCAiQ0xBU1NfMURJU1A3IiwgMiwKLSAgIjAxaWkiLCAiQ0xBU1NfMDFJSSIsIDEsCi0gICIwMGlpIiwgIkNMQVNTXzAwSUkiLCAxLAotICAwLCAwCi0KLX07Ci0KLWNoYXIgKgotdHJhbnNsYXRlICh0YWJsZSwgeCwgbGVuZ3RoKQotICAgICBzdHJ1Y3QgdG9rX3N0cnVjdCAqdGFibGU7Ci0gICAgIGNoYXIgKng7Ci0gICAgIGludCAqbGVuZ3RoOwotewotCi0gIGludCBmb3VuZDsKLQotICBmb3VuZCA9IDA7Ci0gIHdoaWxlICh0YWJsZS0+bWF0Y2gpCi0gICAgewotICAgICAgaW50IGwgPSBzdHJsZW4gKHRhYmxlLT5tYXRjaCk7Ci0KLSAgICAgIGlmIChzdHJuY21wICh0YWJsZS0+bWF0Y2gsIHgsIGwpID09IDApCi0JewotCSAgLyogR290IGEgaGl0ICovCi0JICBwcmludGYgKCIlcyIsIHRhYmxlLT50b2tlbik7Ci0JICAqbGVuZ3RoICs9IHRhYmxlLT5sZW5ndGg7Ci0JICByZXR1cm4geCArIGw7Ci0JfQotCi0gICAgICB0YWJsZSsrOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHByaW50ZiAoIioqKiogQ2FuJ3QgZmluZCAlc1xuIiwgeCk7Ci0gIHdoaWxlICgqeCkKLSAgICB4Kys7Ci0gIHJldHVybiB4OwotfQotCi12b2lkCi1jaGV3Yml0cyAoYml0cywgbGVuZ3RoKQotICAgICBjaGFyICpiaXRzOwotICAgICBpbnQgKmxlbmd0aDsKLXsKLSAgaW50IG4gPSAwOwotCi0gICpsZW5ndGggPSAwOwotICBwcmludGYgKCJ7Iik7Ci0gIHdoaWxlICgqYml0cykKLSAgICB7Ci0gICAgICB3aGlsZSAoKmJpdHMgPT0gJyAnKQotCXsKLQkgIGJpdHMrKzsKLQl9Ci0gICAgICBiaXRzID0gdHJhbnNsYXRlICh0b2tzLCBiaXRzLCBsZW5ndGgpOwotICAgICAgbisrOwotICAgICAgcHJpbnRmICgiLCIpOwotCi0gICAgfQotICB3aGlsZSAobiA8IEJZVEVfSU5GT19MRU4gLSAxKQotICAgIHsKLSAgICAgIHByaW50ZiAoIjAsIik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCJ9Iik7Ci19Ci0KLQotc3RhdGljCi1pbnQKLWNoZXduYW1lIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpuOwotICBpbnQgbmFyZ3MgPSAwOwotCi0gIG4gPSBuYW1lOwotICBwcmludGYgKCJcIiIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIlwiLCIpOwkJLyogU2NhbiB0aGUgb3BlcmFuZHMgYW5kIG1ha2UgZW50aXJlcyBmb3IKLQkJCQkgICB0aGVtIC1yZW1lbWJlciBpbmRpcmVjdCB0aGluZ3MgKi8KLQotICBuID0gbmFtZTsKLSAgcHJpbnRmICgiT1BDXyIpOwotICB3aGlsZSAoKm4gJiYgIWlzd2hpdGUgKCpuKSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyIsICpuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIiwwLHsiKTsKLQotICB3aGlsZSAoKm4pCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIHdoaWxlICgqbiA9PSAnLCcgfHwgaXN3aGl0ZSAoKm4pKQotCW4rKzsKLSAgICAgIG5hcmdzKys7Ci0gICAgICBuID0gdHJhbnNsYXRlIChhcmdzLCBuLCAmZCk7Ci0gICAgICBwcmludGYgKCIsIik7Ci0gICAgfQotICBpZiAobmFyZ3MgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIwIik7Ci0gICAgfQotICBwcmludGYgKCJ9LCIpOwotICByZXR1cm4gbmFyZ3M7Ci19Ci0KLXN0YXRpYyAKLXZvaWQKLXN1YiAoeCwgYykKLSAgICAgY2hhciAqeDsKLSAgICAgY2hhciBjOwotewotICB3aGlsZSAoKngpCi0gICAgewotICAgICAgaWYgKHhbMF0gPT0gYyAmJiB4WzFdID09IGMgJiYKLQkgIHhbMl0gPT0gYyAmJiB4WzNdID09IGMpCi0JewotCSAgeFsyXSA9ICdOJzsKLQkgIHhbM10gPSAnMCc7Ci0JfQotICAgICAgeCsrOwotICAgIH0KLX0KLQotCi0jaWYgMAotI2RlZmluZSBEKHgpICgoeCkgPT0gJzEnIHx8ICh4KSA9PScwJykKLSNkZWZpbmUgTSh5KSAoc3RybmNtcCh5LHgsNCk9PTApCi1wcmludG1hbmdsZWQgKHgpCi0gICAgIGNoYXIgKng7Ci17Ci0gIHJldHVybjsKLSAgd2hpbGUgKCp4KQotICAgIHsKLSAgICAgIGlmIChEICh4WzBdKSAmJiBEICh4WzFdKSAmJiBEICh4WzJdKSAmJiBEICh4WzNdKSkKLQl7Ci0JICBwcmludGYgKCJYWFhYIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoInNzc3MiKSkKLQl7Ci0JICBwcmludGYgKCJzc3NzIik7Ci0JfQotICAgICAgZWxzZSBpZiAoTSAoImRkZGQiKSkKLQl7Ci0JICBwcmludGYgKCJkZGRkIik7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoIl9fX18iKTsKLQotICAgICAgeCArPSA0OwotCi0gICAgICBpZiAoeFswXSA9PSAnICcpCi0JewotCSAgcHJpbnRmICgiXyIpOwotCSAgeCsrOwotCX0KLSAgICB9Ci0KLX0KLQotI2VuZGlmCi0vKiNkZWZpbmUgV09SS19UWVBFKi8KLXZvaWQKLXByaW50X3R5cGUgKG4pCi0gICAgIHN0cnVjdCBvcCAqbjsKLXsKLSNpZmRlZiBXT1JLX1RZUEUKLSAgd2hpbGUgKCpzICYmICFpc3doaXRlICgqcykpCi0gICAgewotICAgICAgbCA9ICpzOwotICAgICAgcysrOwotICAgIH0KLSAgc3dpdGNoIChsKQotICAgIHsKLSAgICBjYXNlICdsJzoKLSAgICAgIHByaW50ZiAoIjMyLCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICBwcmludGYgKCI4LCIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIjE2LCIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2Vsc2UKLSAgcHJpbnRmICgiJTJkLCIsIG4tPnR5cGUpOwotI2VuZGlmCi19Ci0KLQotdm9pZAotaW50ZXJuYWwgKCkKLXsKLSAgaW50IGMgPSBjb3VudCAoKTsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwID0gbmV3OwotICB3aGlsZSAocC0+ZmxhZ3NbMF0gIT0gJyonKQotICB7Ci0gICAgLyogSWYgdGhlcmUgYXJlIGFueSBAcnMsIHN1YiB0aGUgc3NzcyBpbnRvIGEgc3NuMCwKLSAgICAgICAocnMpLCAoc3NuMCkKLSAgICAgICAqLwotICAgIGludCBsb29wID0gMTsKLQotICAgIHByaW50ZiAoIlwiJXNcIiwlMmQsICIsIHAtPmZsYWdzLCBwLT5jeWNsZXMpOwotICAgIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIGNoYXIgKnMgPSBwLT5uYW1lOwotCi0gICAgICBsb29wID0gMDsKLSAgICAgIHdoaWxlICgqcykKLSAgICAgIHsKLQlpZiAoc1swXSA9PSAnQCcpCi0JewotCSAgY2hhciBjOwotCi0JICAvKiBza2lwIHRoZSByIGFuZCBzdWIgdGhlIHN0cmluZyAqLwotCSAgcysrOwotCSAgYyA9IHNbMV07Ci0JICBzdWIgKHAtPmJpdHMsIGMpOwotCX0KLQlpZiAoc1swXSA9PSAnKCcgJiYgc1szXSA9PSAnKScpCi0JewotCSAgc3ViIChwLT5iaXRzLCBzWzJdKTsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnKQotCXsKLQkgIHN1YiAocC0+Yml0cywgc1stMV0pOwotCX0KLQotCXMrKzsKLSAgICAgIH0KLQotICAgIH0KLSAgICBwcmludF90eXBlIChwKTsKLSAgICBwcmludGYgKCJcIiVzXCIsXCIlc1wiLDAsXG4iLCBwLT5iaXRzLCBwLT5uYW1lKTsKLSAgICBwKys7Ci0gIH0KLX0KLQotc3RhdGljIAotdm9pZAotZ2FzICgpCi17Ci0gIGludCBjID0gY291bnQgKCk7Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgaW50IGlkeCA9IDA7Ci0gIGNoYXIgKm9sZG5hbWUgPSAiIjsKLSAgc3RydWN0IG9wICpuZXcgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcCkgKiBjKTsKLQotICBtZW1jcHkgKG5ldywgcCwgYyAqIHNpemVvZiAoc3RydWN0IG9wKSk7Ci0KLSAgLyogc29ydCBhbGwgbmFtZXMgaW4gdGFibGUgYWxwaGFiZXRpY2FsbHkgKi8KLSAgcXNvcnQgKG5ldywgYywgc2l6ZW9mIChzdHJ1Y3Qgb3ApLCBmdW5jKTsKLQotICBwcmludGYgKCIJCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi9cbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX01BU0sgMHgwZlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfU1JDIDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19EU1QgMHgwMlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlMgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JEIDB4MDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SQSAweDAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkIgMHgwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JSIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SWCAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNCAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NOCAweDAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMTYgMHgwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTMyIDB4MDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1fMSAweDA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzIgMHgwN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1AxNiAweDA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfTklNOCAweDA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMiAweDBhXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTIgMHgwYlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1A4IDB4MGNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU00TTEgMHgwZFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19YIDB4MTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JBIDB4MjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RBIDB4MzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JYIDB4NDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RJU1AgMHg1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfSU1NIDB4NjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NDIDB4NzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0NUUkwgMHg4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wQ0NDIDB4ZTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzFDQ0MgMHhmMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xRElTUDcgMHgyMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAxSUkgMHgzMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzAwSUkgMHg0MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JJVCAweDUwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRkxBR1MgMHg2MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lSIDB4NzAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQOCAweDgwMFxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVRfMU9SMiAweDkwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHIDB4NzAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfV09SRCAweDMwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19RVUFEIDB4NDAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdOMCAweDgwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1BSIDB4MTAwMDBcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkYyAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRjYiAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkIDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRiIDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGRsIDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmQgNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FuZGIgNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdCA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYml0YiA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsbCA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2FsciAxMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NsciAxMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NscmIgMTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb20gMTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb21iIDE0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tZmxnIDE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3AgMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGIgMTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGQgMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRiIDE5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkciAyMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHJiIDIxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpIDIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpYiAyM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaXIgMjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyYiAyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwbCAyNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2QgMjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkYiAyOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyIDI5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZHJiIDMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaSAzMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2liIDMyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXIgMzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpcmIgMzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYWIgMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kYmpueiAzNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlYyAzN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RlY2IgMzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaSAzOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdiA0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpdmwgNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kam56IDQyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZWkgNDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leCA0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4YiA0NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHMgNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzYiA0N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHNsIDQ4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaGFsdCA0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luIDUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5iIDUxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jIDUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5jYiA1M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZCA1NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luZGIgNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmliIDU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYnIgNTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pcmV0IDU4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfanAgNTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19qciA2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkIDYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhIDYyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRhciA2M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYiA2NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkY3RsIDY1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpciA2NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXJiIDY3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRrIDY4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRsIDY5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRtIDcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRwcyA3MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkciA3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcmIgNzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJsIDc0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbWJpdCA3NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21yZXEgNzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVzIDc3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXNldCA3OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX211bHQgNzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0bCA4MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZyA4MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25lZ2IgODJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ub3AgODNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vciA4NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX29yYiA4NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dCA4NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGIgODdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRkIDg4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZGIgODlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYiA5MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGliciA5MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcCA5MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3BvcGwgOTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wdXNoIDk0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaGwgOTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXMgOTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXNiIDk3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzZmxnIDk4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmV0IDk5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmwgMTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxiIDEwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYyAxMDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGNiIDEwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsZGIgMTA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnIgMTA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJiIDEwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYyAxMDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmNiIDEwOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyZGIgMTA5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2JjIDExMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiY2IgMTExXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhIDExMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWIgMTEzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhbCAxMTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGwgMTE1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsYiAxMTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGxsIDExN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldCAxMThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRiIDExOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldGZsZyAxMjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5iIDEyMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmQgMTIyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luZGIgMTIzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWIgMTI0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luaWJyIDEyNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYSAxMjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFiIDEyN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYWwgMTI4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsIDEyOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGIgMTMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsbCAxMzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0IDEzMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRiIDEzM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkIDEzNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRkYiAxMzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0aWIgMTM2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliciAxMzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmEgMTM4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhYiAxMzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmFsIDE0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybCAxNDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxiIDE0MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybGwgMTQzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3ViIDE0NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmIgMTQ1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3VibCAxNDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190Y2MgMTQ3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjYiAxNDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0IDE0OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RiIDE1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3RsIDE1MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZGIgMTUyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJkcmIgMTUzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpYiAxNTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmlyYiAxNTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRkcmIgMTU2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aWIgMTU3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0aXJiIDE1OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydHJiIDE1OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXQgMTYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHNldGIgMTYxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfeG9yIDE2MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvcmIgMTYzXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGQgIDE2NCBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRiICAxNjUgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkciAgMTY2IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpICAxNjggXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpYiAxNjkgIFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NjICAgMTcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYnB0ICAgMTcxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0MGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGUgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0OGYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDM2IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzOCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkNzggMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDdlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ5ZCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZGI5IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiZiAxNzJcbiIpOwotI2lmIDAKLSAgZm9yIChpID0gMDsgdG9rc1tpXS50b2tlbjsgaSsrKQotICAgIHByaW50ZiAoIiNkZWZpbmUgJXNcdDB4JXhcbiIsIHRva3NbaV0udG9rZW4sIGkgKiAxNik7Ci0jZW5kaWYKLSAgcHJpbnRmICgidHlwZWRlZiBzdHJ1Y3Qge1xuIik7Ci0KLSAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5pY2VuYW1lO1xuIik7Ci0gIHByaW50ZiAoImludCB0eXBlO1xuIik7Ci0gIHByaW50ZiAoImludCBjeWNsZXM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGZsYWdzO1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0gIHByaW50ZiAoImNoYXIgKm5hbWU7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgY2hhciBvcGNvZGU7XG4iKTsKLSAgcHJpbnRmICgidm9pZCAoKmZ1bmMpKCk7XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgaW50IGFyZ19pbmZvWzRdO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGludCBieXRlX2luZm9bJWRdO1xuIiwgQllURV9JTkZPX0xFTik7Ci0gIHByaW50ZiAoImludCBub3BlcmFuZHM7XG4iKTsKLSAgcHJpbnRmICgiaW50IGxlbmd0aDtcbiIpOwotICBwcmludGYgKCJpbnQgaWR4O1xuIik7Ci0gIHByaW50ZiAoIn0gb3Bjb2RlX2VudHJ5X3R5cGU7XG4iKTsKLSAgcHJpbnRmICgiI2lmZGVmIERFRklORV9UQUJMRVxuIik7Ci0gIHByaW50ZiAoIm9wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0ge1xuIik7Ci0KLSAgd2hpbGUgKG5ldy0+ZmxhZ3MgJiYgbmV3LT5mbGFnc1swXSkKLSAgICB7Ci0gICAgICBpbnQgbmFyZ3M7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBwcmludGYgKCJcblxuLyogJXMgKioqICVzICovXG4iLCBuZXctPmJpdHMsIG5ldy0+bmFtZSk7Ci0gICAgICBwcmludGYgKCJ7XG4iKTsKLQotICAgICAgcHJpbnRmICgiI2lmZGVmIE5JQ0VOQU1FU1xuIik7Ci0gICAgICBwcmludGYgKCJcIiVzXCIsJWQsJWQsXG4iLCBuZXctPm5hbWUsIG5ldy0+dHlwZSwgbmV3LT5jeWNsZXMpOwotICAgICAgewotCWludCBhbnN3ZXIgPSAwOwotCWNoYXIgKnAgPSBuZXctPmZsYWdzOwotCi0Jd2hpbGUgKCpwKQotCSAgewotCSAgICBhbnN3ZXIgPDw9IDE7Ci0KLQkgICAgaWYgKCpwICE9ICctJykKLQkgICAgICBhbnN3ZXIgfD0gMTsKLQkgICAgcCsrOwotCSAgfQotCXByaW50ZiAoIjB4JTAyeCxcbiIsIGFuc3dlcik7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0KLSAgICAgIG5hcmdzID0gY2hld25hbWUgKG5ldy0+bmFtZSk7Ci0KLSAgICAgIHByaW50ZiAoIlxuXHQiKTsKLSAgICAgIGNoZXdiaXRzIChuZXctPmJpdHMsICZsZW5ndGgpOwotICAgICAgbGVuZ3RoIC89IDI7Ci0gICAgICBpZiAobGVuZ3RoICYgMSkKLQlhYm9ydCgpOwotCi0gICAgICBwcmludGYgKCIsJWQsJWQsJWQiLCBuYXJncywgbGVuZ3RoLCBpZHgpOwotICAgICAgaWR4Kys7Ci0gICAgICBvbGRuYW1lID0gbmV3LT5uYW1lOwotICAgICAgcHJpbnRmICgifSxcbiIpOwotICAgICAgbmV3Kys7Ci0gICAgfQotICBwcmludGYgKCIwLDB9O1xuIik7Ci0gIHByaW50ZiAoIiNlbmRpZlxuIik7Ci19Ci0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqKmF2OwotewotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0KLSAgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi10IikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1oIikgPT0gMCkKLSAgICB7Ci0gICAgICB3aGlsZSAocC0+bmFtZSkKLQl7Ci0JICBwcmludGYgKCIlLTI1c1x0JXNcbiIsIHAtPm5hbWUsIHAtPmJpdHMpOwotCSAgcCsrOwotCX0KLSAgICB9Ci0KLSAgZWxzZSBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLWEiKSA9PSAwKQotICAgIHsKLSAgICAgIGdhcyAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1kIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKmRpcygpOyovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiVXNhZ2U6ICVzIC10XG4iLCBhdlswXSk7Ci0gICAgICBwcmludGYgKCItdCA6IGdlbmVyYXRlIG5ldyB6OC5jIGludGVybmFsIHRhYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1hIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBnYXNcbiIpOwotICAgICAgcHJpbnRmICgiLWQgOiBnZW5lcmF0ZSBuZXcgdGFibGUgZm9yIGRpc2Fzc2VtYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIi1oIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBodW1hbnNcbiIpOwotICAgIH0KLXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvQ0hBTkdFTE9HIGIvcmVhZGxpbmUvQ0hBTkdFTE9HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzllNmMwLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL0NIQU5HRUxPRworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi1bUmVhZGxpbmUtc3BlY2lmaWMgY2hhbmdlbG9nLiAgRGVzY3JpcHRpb25zIG9mIGNoYW5nZXMgdG8gdGhlIHNvdXJjZSBhcmUKLSBmb3VuZCBpbiB0aGUgYmFzaCBjaGFuZ2Vsb2cuXQotCi0JCQkJICAgIDYvOQotCQkJCSAgICAtLS0KLU1ha2VmaWxlLmluCi0JLSBxdW90ZSB2YWx1ZSBvZiAke0lOU1RBTExfREFUQX0gd2hlbiBwYXNzaW5nIGl0IHRvIG1ha2VzIGluCi0JICBzdWJkaXJlY3RvcmllcwotCi0JCQkJICAgIDcvMQotCQkJCSAgICAtLS0KLU1ha2VmaWxlLmluCi0JLSBkb24ndCBwYXNzIElOU1RBTExfREFUQSB0byBhIG1ha2UgaW4gdGhlIGBkb2MnIHN1YmRpcmVjdG9yeTsgbGV0Ci0JICBhdXRvY29uZiBzZXQgdGhlIHZhbHVlIGl0c2VsZiBpbiB0aGUgTWFrZWZpbGUKLQktIHJlbW92ZWQgYSBzdHJheSBgLScgYmVmb3JlICQoUkFOTElCKSBpbiB0aGUgYGluc3RhbGwnIHJlY2lwZQotCi1kb2MvTWFrZWZpbGUuaW4KLQktIGFkZCBhIFZQQVRIIGFzc2lnbm1lbnQgc28gdGhlIGRvY3VtZW50YXRpb24gaXMgbm90IHJlbWFkZSBpZiBpdCdzCi0JICBhbHJlYWR5IHVwLXRvLWRhdGUgaW4gdGhlIGRpc3RyaWJ1dGlvbgotCi1jb25maWd1cmUuaW4KLQktIGNhbGwgQUNfU1VCU1QoTE9DQUxfTERGTEFHUyksIHNpbmNlIE1ha2VmaWxlLmluIGNvbnRhaW5zCi0JICBATE9DQUxfTERGTEFHU0AKLQotCQkJCSAgICA3LzkKLQkJCQkgICAgLS0tCi0KLWNvbmZpZy5oLmluCi0JLSBhZGQgZGVmaW5lIGxpbmVzIGZvciBTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwgYW5kCi0JICBTVFJVQ1RfV0lOU0laRV9JTl9URVJNSU9TCi0KLWNvbmZpZ3VyZS5pbgotCS0gY2FsbCBCQVNIX1NUUlVDVF9XSU5TSVpFIHRvIGxvb2sgZm9yIHRoZSBkZWZpbml0aW9uIG9mCi0JICBgc3RydWN0IHdpbnNpemUnCi0KLQkJCQkgICA3LzE3Ci0JCQkJICAgLS0tLQotY29uZmlndXJlLmluCi0JLSBjYWxsIEFDX01JTklYCi0KLWNvbmZpZy5oLmluCi0JLSBhZGQgZGVmaW5lIGxpbmUgZm9yIEFDX01JTklYCi0KLQkJCQkgICA3LzE4Ci0JCQkJICAgLS0tLQotTWFrZWZpbGUuaW4KLQktIGFkZCBgaW5zdGFsbC1zaGFyZWQnIGFuZCBgdW5pbnN0YWxsLXNoYXJlZCcgdGFyZ2V0cwotCi0JCQkJICAgIDgvNAotCQkJCSAgICAtLS0KLU1ha2VmaWxlLmluCi0JLSBpbnN0YWxsIGFuZCB1bmluc3RhbGwgbGliaGlzdG9yeS5hIGluIHRoZSBgaW5zdGFsbCcgYW5kCi0JICBgdW5pbnN0YWxsJyB0YXJnZXRzCi0KLQkJCQkgICAgOS80Ci0JCQkJICAgIC0tLQotY29uZmlndXJlLmluCi0JLSBidW1wZWQgTElCVkVSU0lPTiB1cCB0byAyLjEuMSwgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgcGF0Y2gKLQkgIGxldmVsIDEgdG8gcmVsZWFzZSAyLjEKLQotCi0JCQkJICAgOS8xNgotCQkJCSAgIC0tLS0KLU1ha2VmaWxlLmluCi0JLSBgbWFrZSBkaXN0Y2xlYW4nIG5vdyBkZXNjZW5kcyBpbnRvIHRoZSBgZXhhbXBsZXMnIHN1YmRpcgotCi1kb2MvTWFrZWZpbGUuaW4KLQktIHRoZSBgZGlzdGNsZWFuJyBhbmQgYG1haW50YWluZXItY2xlYW4nIHRhcmdldHMgc2hvdWxkIHJlbW92ZQotCSAgTWFrZWZpbGUKLQotZXhhbXBsZXMvTWFrZWZpbGUuaW4KLQktIGFkZGVkIHRoZSB2YXJpb3VzIGNsZWFuIHRhcmdldHMKLQotCQkJCSAgICA0LzIKLQkJCQkgICAgLS0tCi1jb25maWd1cmUuaW4KLQktIGJ1bXBlZCBMSUJWRVJTSU9OIHVwIHRvIDIuMgotCi0JCQkJICAgNC8xOAotCQkJCSAgIC0tLS0KLVtyZWFkbGluZS0yLjIgcmVsZWFzZWRdCi0KLQkJCQkgICA0LzIwCi0JCQkJICAgLS0tLQotTWFrZWZpbGUuaW4KLQktIG1ha2UgYGxpYmhpc3RvcnkuYScgYSBkZXBlbmRlbmN5IG9mIGBpbnN0YWxsJwotCS0gZml4ZWQgYSB0eXBvIGluIHRoZSByZWNpcGUgZm9yIGBpbnN0YWxsJyB0aGF0IGNvcGllZCBsaWJyZWFkbGluZS5hCi0JICB0byBsaWJoaXN0b3J5Lm9sZCByaWdodCBhZnRlciBpbnN0YWxsaW5nIGl0Ci0KLQkJCQkgICA0LzI3Ci0JCQkJICAgLS0tLQotZG9jL01ha2VmaWxlLmluCi0JLSBpbnN0YWxsIHtyZWFkbGluZSxoaXN0b3J5fS5pbmZvIG91dCBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBpZgotCSAgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IChidWlsZCkgZGlyZWN0b3J5IC0tIG9ubHkgYW4KLQkgIGlzc3VlIGlmIHRoZSBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuCi0JICB0aGUgc291cmNlIGRpcmVjdG9yeQotCi0JCQkJICAgIDUvMQotCQkJCSAgICAtLS0KLXN1cHBvcnQvc2hvYmotY29uZgotCS0gc2NyaXB0IGZyb20gdGhlIGJhc2ggZGlzdHJpYnV0aW9uIHRvIGRvIHNoYXJlZCBvYmplY3QgYW5kIGxpYnJhcnkKLQkgIGNvbmZpZ3VyYXRpb24KLQotc2hsaWIvTWFrZWZpbGUuaW4KLQktIG5ldyBkaXJlY3RvcnkgYW5kIG1ha2VmaWxlIHRvIGhhbmRsZSBidWlsZGluZyBzaGFyZWQgdmVyc2lvbnMgb2YKLQkgIGxpYnJlYWRsaW5lIGFuZCBsaWJoaXN0b3J5LCBjb250cm9sbGVkIGJ5IHN1cHBvcnQvc2hvYmotY29uZgotCi0JCQkJICAgIDUvNwotCQkJCSAgICAtLS0KLWRvYy9NYWtlZmlsZS5pbgotCS0gc2V0IFNIRUxMIHRvIC9iaW4vc2gsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gbWFrZSB0byBiZSBjb3JyZWN0Ci0KLQkJCQkgICA1LzE0Ci0JCQkJICAgLS0tLQotc2F2ZXN0cmluZy5jCi0JLSBuZXcgZmlsZSwgbW92ZWQgZnJvbSBzaGVsbC5jLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLQotTWFrZWZpbGUuaW4sIHNobGliL01ha2VmaWxlLmluCi0JLSBtYWtlIHN1cmUgc2F2ZXN0cmluZy5jIGlzIGNvbXBpbGVkIGFuZCBhZGRlZCB0byBsaWJyZWFkbGluZSBhbmQKLQkgIGxpYmhpc3RvcnkKLQotW1RIRVJFIEFSRSBOTyBNT1JFICNpZmRlZiBTSEVMTCBMSU5FUyBJTiBUSEUgQyBTT1VSQ0UgRklMRVMuXQotCi0JCQkJICAgNS8xNQotCQkJCSAgIC0tLS0KLVJFQURNRQotCS0gdXBkYXRlZCBkZXNjcmlwdGlvbiBvZiBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbiBmb3IgdGhlIG5ldyBzY2hlbWUKLQotW1RIRVJFIEFSRSBOTyBNT1JFICNpZmRlZiBTSEVMTCBMSU5FUyBJTiBBTlkgT0YgVEhFIFNPVVJDRSBGSUxFUy5dCi0KLU1ha2VmaWxlLmluCi0JLSBidW1wZWQgU0hMSUJfTUFKT1IgdXAgdG8gNCBzaW5jZSB3ZSd2ZSBhdWdtZW50ZWQgdGhlIGxpYnJhcnkKLQkgIEFQSQotCS0gcmxjb25mLmggaXMgbm93IG9uZSBvZiB0aGUgaW5zdGFsbGVkIGhlYWRlcnMsIHNvIGFwcGxpY2F0aW9ucyBjYW4KLQkgIGZpbmQgb3V0IHdoZXRoZXIgdGhpbmdzIGxpa2UgdmktbW9kZSBhcmUgYXZhaWxhYmxlIGluIHRoZSBpbnN0YWxsZWQKLQkgIGxpYnJlYWRsaW5lCi0KLQkJCQkgICA1LzIwCi0JCQkJICAgLS0tLQotY29uZmlndXJlLmluCi0JLSBjaGFuZ2VkIFJMX0xJQlJBUllfVkVSU0lPTiB0byA0LjAgdG8gbWF0Y2ggdGhlIHZlcnNpb24gb2YgdGhlCi0JICBpbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcwotCi0JCQkJICAgIDYvNQotCQkJCSAgICAtLS0KLXJsc3RkYy5oCi0JLSBuZXcgZmlsZQotCi1NYWtlZmlsZS5pbgotCS0gcmxzdGRjLmggaXMgbm93IG9uZSBvZiB0aGUgaW5zdGFsbGVkIGhlYWRlcnMKLQotCQkJCSAgICA4LzMKLQkJCQkgICAgLS0tCi1zaGxpYi9NYWtlZmlsZS5pbgotCS0gbWFkZSB0aGUgc3VmZml4IHJ1bGUgdGhhdCBjcmVhdGVzIHh4LnNvIGZyb20geHguYyB3cml0ZSB0aGUKLQkgIGNvbXBpbGVyIG91dHB1dCB0byBgYS5vJywgd2hpY2ggaXMgdGhlbiBtdidkIHRvIHh4LnNvLCBiZWNhdXNlCi0JICBzb21lIGNvbXBpbGVycyAoU3VuIFdTcHJvIDQuMiwgZm9yIGV4YW1wbGUpIGRvbid0IGFsbG93IGFueQotCSAgc3VmZml4ZXMgb3RoZXIgdGhhbiBgLm8nIGZvciBgY2MgLWMnIChub3QgZXZlbiBgYS5vdXQnKQotCi0JCQkJICAgOS8xNQotCQkJCSAgIC0tLS0KLQotTWFrZWZpbGUuaW4KLQktIEFSIGFuZCBBUkZMQUdTIGFyZSBub3cgc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlLCB1c2VkIGluIHJlY2lwZXMKLQkgIHRoYXQgYnVpbGQgdGhlIGxpYnJhcmllcwotCi1jb25maWd1cmUuaW4KLQktIHVzZSBBQ19DSEVDS19QUk9HIHRvIGNoZWNrIGZvciBhcgotCS0gc2V0IEFSRkxBR1MgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBlbnZpcm9ubWVudAotCi0JCQkJICAgMTAvNQotCQkJCSAgIC0tLS0KLU1ha2VmaWxlLmluCi0JLSByZW1vdmVkIHNhdmVzdHJpbmcubyBmcm9tIG9iamVjdCBmaWxlIGxpc3QKLQotCQkJCSAgIDEwLzI4Ci0JCQkJICAgLS0tLS0KLXNobGliL01ha2VmaWxlLmluCi0JLSBkb24ndCB1c2UgYSBmaXhlZCBmaWxlbmFtZSBpbiB0aGUgLmMuc28gc3VmZml4IHJ1bGUgdG8gYXZvaWQKLQkgIHByb2JsZW1zIHdpdGggcGFyYWxsZWwgbWFrZXMKLQotCQkJCSAgIDEyLzIxCi0JCQkJICAgLS0tLS0KLXN1cHBvcnQvc2hsaWItaW5zdGFsbAotCS0gbmV3IHNjcmlwdCB0byBpbnN0YWxsIHNoYXJlZCByZWFkbGluZSBhbmQgaGlzdG9yeSBsaWJyYXJpZXMKLQotc2hsaWIvTWFrZWZpbGUuaW4KLQktIGNoYW5nZWQgdG8gY2FsbCBzaGxpYi1pbnN0YWxsIGZvciBpbnN0YWxsIGFuZCB1bmluc3RhbGwgdGFyZ2V0cwotCi1bcmVhZGxpbmUtNC4wLWJldGExIGZyb3plbl0KLQotCQkJCSAgIDEyLzIyCi0JCQkJICAgLS0tLS0KLWNvbmZpZ3VyZS5pbgotCS0gY2FsbCBBQ19TVUJTVCBmb3IgU0hPQkpfWExERkxBR1MgYW5kIFNITElCX0xJQlMKLQotc2hsaWIvTWFrZWZpbGUuaW4KLQktIFNIT0JKX1hMREZMQUdTIGFuZCBTSExJQl9MSUJTIGFyZSBub3cgc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlCi0JLSBhZGQgJChTSExJQl9MSUJTKSBhdCBlbmQgb2YgY29tbWFuZCBsaW5lIHRoYXQgYnVpbGRzIHRoZSBzaGFyZWQKLQkgIGxpYnJhcmllcyAoY3VycmVudGx5IG5lZWRlZCBvbmx5IGJ5IEFJWCA0LjIpCi0KLQkJCQkgICAxMi8zMQotCQkJCSAgIC0tLS0tCi1NQU5JRkVTVCwgTUFOSUZFU1QuZG9jCi0JLSB0aGUgVE9DIGh0bWwgZmlsZXMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYW5kIG5vIGxvbmdlciBwYXJ0IG9mCi0JICB0aGUgZGlzdHJpYnV0aW9uCi0KLQkJCQkgMi8xOC8xOTk5Ci0JCQkJIC0tLS0tLS0tLQotY29uZmlndXJlLmluCi0JLSBzZXQgTUFLRV9TSEVMTCB0byAvYmluL3NoIGFuZCBzdWJzdGl0dXRlIGludG8gdGhlIE1ha2VmaWxlcwotCi1NYWtlZmlsZS5pbix7ZG9jLGV4YW1wbGVzLHNobGlifS9NYWtlZmlsZS5pbgotCS0gc2V0IFNIRUxMIGZyb20gQE1BS0VfU0hFTExACi0KLVtyZWFkbGluZS00LjAgcmVsZWFzZWRdCmRpZmYgLS1naXQgYS9yZWFkbGluZS9DSEFOR0VTIGIvcmVhZGxpbmUvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzljMi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9DSEFOR0VTCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLVRoaXMgZG9jdW1lbnQgZGV0YWlscyB0aGUgY2hhbmdlcyBiZXR3ZWVuIHRoaXMgdmVyc2lvbiwgcmVhZGxpbmUtNC4wLAotYW5kIHRoZSBwcmV2aW91cyB2ZXJzaW9uLCByZWFkbGluZS0yLjIuCi0KLTEuICBDaGFuZ2VzIHRvIFJlYWRsaW5lCi0KLWEuICBUaGUgdmVyc2lvbiBudW1iZXIgaXMgbm93IDQuMCwgdG8gbWF0Y2ggdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uCi0gICAgbnVtYmVycyBvbiB0aGUgc2hhcmVkIHJlYWRsaW5lIGFuZCBoaXN0b3J5IGxpYnJhcmllcy4gIEZ1dHVyZQotICAgIHJlbGVhc2VzIHdpbGwgbWFpbnRhaW4gdGhlIGlkZW50aWNhbCBudW1iZXJpbmcuCi0KLWIuICBGaXhlZCBhIHR5cG8gaW4gdGhlIGBtYWtlIGluc3RhbGwnIHJlY2lwZSB0aGF0IGNvcGllZCBsaWJyZWFkbGluZS5hCi0gICAgdG8gbGliaGlzdG9yeS5vbGQgcmlnaHQgYWZ0ZXIgaW5zdGFsbGluZyBpdC4KLQotYy4gIFRoZSByZWFkbGluZSBhbmQgaGlzdG9yeSBpbmZvIGZpbGVzIGFyZSBub3cgaW5zdGFsbGVkIG91dCBvZiB0aGUgc291cmNlCi0gICAgZGlyZWN0b3J5IGlmIHRoZXkgYXJlIG5vdCBmb3VuZCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotCi1kLiAgVGhlIGxpYnJhcnkgbm8gbG9uZ2VyIGV4cG9ydHMgYSBmdW5jdGlvbiBuYW1lZCBgc2F2ZXN0cmluZycgLS0gYmFja3dhcmRzCi0gICAgY29tcGF0aWJpbGl0eSBiZSBkYW1uZWQuCi0KLWUuICBUaGVyZSBpcyBubyBsb25nZXIgYW55ICNpZmRlZiBTSEVMTCBjb2RlIGluIHRoZSBzb3VyY2UgZmlsZXMuCi0KLWYuICBTb21lIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBrZXkgYmluZGluZyBjb2RlIHRvIGZpeCBtZW1vcnkgbGVha3MgYW5kCi0gICAgYmV0dGVyIHN1cHBvcnQgV2luMzIgc3lzdGVtcy4KLQotZy4gIEZpeGVkIGEgc2lsbHkgdHlwbyBpbiB0aGUgcGFyZW4gbWF0Y2hpbmcgY29kZSAtLSBpdCdzIG1pY3Jvc2Vjb25kcywgbm90Ci0gICAgbWlsbGlzZWNvbmRzLgotCi1oLiAgVGhlIHJlYWRsaW5lIGxpYnJhcnkgc2hvdWxkIGJlIGNvbXBpbGFibGUgYnkgQysrIGNvbXBpbGVycy4KLQotaS4gIFRoZSByZWFkbGluZS5oIHB1YmxpYyBoZWFkZXIgZmlsZSBub3cgaW5jbHVkZXMgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKLSAgICBhbGwgcmVhZGxpbmUgZnVuY3Rpb25zLCBhbmQgc29tZSBjaGFuZ2VzIHdlcmUgbWFkZSB0byBmaXggZXJyb3JzIGluIHRoZQotICAgIHNvdXJjZSBmaWxlcyB1bmNvdmVyZWQgYnkgdGhlIHVzZSBvZiBwcm90b3R5cGVzLgotCi1qLiAgVGhlIG1heGltdW0gbnVtZXJpYyBhcmd1bWVudCBpcyBub3cgY2xhbXBlZCBhdCAxMDAwMDAwLgotCi1rLiAgRml4ZXMgdG8gcmxfeWFua19sYXN0X2FyZyB0byBtYWtlIGl0IGJlaGF2ZSBiZXR0ZXIuCi0KLWwuICBGaXhlZCBhIGJ1ZyBpbiB0aGUgZGlzcGxheSBjb2RlIHRoYXQgY2F1c2VkIGNvcmUgZHVtcHMgaWYgdGhlIHByb21wdAotICAgIHN0cmluZyBsZW5ndGggZXhjZWVkZWQgMTAyNCBjaGFyYWN0ZXJzLgotCi1tLiAgVGhlIG1lbnUgY29tcGxldGlvbiBjb2RlIHdhcyBmaXhlZCB0byBwcm9wZXJseSBpbnNlcnQgYSBzaW5nbGUgY29tcGxldGlvbgotICAgIGlmIHRoZXJlIGlzIG9ubHkgb25lIG1hdGNoLgotCi1uLiAgQSBidWcgd2FzIGZpeGVkIHRoYXQgY2F1c2VkIHRoZSBkaXNwbGF5IGNvZGUgdG8gaW1wcm9wZXJseSBkaXNwbGF5IHRhYnMKLSAgICBhZnRlciBuZXdsaW5lcy4KLQotby4gIEEgZml4IHdhcyBtYWRlIHRvIHRoZSBjb21wbGV0aW9uIGNvZGUgaW4gd2hpY2ggYSB0eXBvIGNhdXNlZCB0aGUgd3JvbmcKLSAgICB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZWQgdGhlIGxvbmdlc3QgY29tbW9uCi0gICAgcHJlZml4IG9mIHRoZSBsaXN0IG9mIG1hdGNoZXMuCi0KLXAuICBUaGUgY29tcGxldGlvbiBjb2RlIG5vdyBjaGVja3MgdGhlIHZhbHVlIG9mIHJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZCwKLSAgICB3aGljaCBpcyBzZXQgYnkgYXBwbGljYXRpb24tc3VwcGxpZWQgY29tcGxldGlvbiBmdW5jdGlvbnMgdG8gaW5kaWNhdGUKLSAgICB0aGF0IGZpbGVuYW1lIGNvbXBsZXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLCB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8KLSAgICBjYWxsIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGBpZ25vcmUgY29tcGxldGlvbnMnIGZ1bmN0aW9uLgotCi1xLiAgQ29kZSB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlicmFyeSB0byBjYXRjaCBoaXN0b3J5IHN1YnN0aXR1dGlvbnMKLSAgICB1c2luZyBgJicgd2l0aG91dCBhIHByZXZpb3VzIGhpc3Rvcnkgc3Vic3RpdHV0aW9uIG9yIHNlYXJjaCBoYXZpbmcgYmVlbgotICAgIHBlcmZvcm1lZC4KLQotCi0yLiAgTmV3IEZlYXR1cmVzIGluIFJlYWRsaW5lCi0KLWEuICBUaGVyZSBpcyBhIG5ldyBzY3JpcHQsIHN1cHBvcnQvc2hvYmotY29uZiwgdG8gZG8gc3lzdGVtLXNwZWNpZmljIHNoYXJlZAotICAgIG9iamVjdCBhbmQgbGlicmFyeSBjb25maWd1cmF0aW9uLiAgSXQgZ2VuZXJhdGVzIHZhcmlhYmxlcyBmb3IgY29uZmlndXJlCi0gICAgdG8gc3Vic3RpdHV0ZSBpbnRvIG1ha2VmaWxlcy4gIFRoZSBSRUFETUUgZmlsZSBwcm92aWRlcyBhIGRldGFpbGVkCi0gICAgZXhwbGFuYXRpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uIHByb2Nlc3MuCi0KLWIuICBTaGFyZWQgbGlicmFyaWVzIGFuZCBvYmplY3RzIGFyZSBub3cgYnVpbHQgaW4gdGhlIGBzaGxpYicgc3ViZGlyZWN0b3J5LgotICAgIFRoZXJlIGlzIGEgc2hsaWIvTWFrZWZpbGUuaW4gdG8gY29udHJvbCB0aGUgYnVpbGQgcHJvY2Vzcy4gIGBtYWtlIHNoYXJlZCcKLSAgICBmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGlzIHN0aWxsIHRoZSByaWdodCB3YXkgdG8gYnVpbGQgc2hhcmVkCi0gICAgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcy4KLQotYy4gIHJsY29uZi5oIGlzIG5vdyBpbnN0YWxsZWQsIHNvIGFwcGxpY2F0aW9ucyBjYW4gZmluZCBvdXQgd2hpY2ggZmVhdHVyZXMKLSAgICBoYXZlIGJlZW4gY29tcGlsZWQgaW50byB0aGUgaW5zdGFsbGVkIHJlYWRsaW5lIGFuZCBoaXN0b3J5IGxpYnJhcmllcy4KLQotZC4gIHJsc3RkYy5oIGlzIG5vdyBhbiBpbnN0YWxsZWQgaGVhZGVyIGZpbGUuCi0KLWUuICBNYW55IGNoYW5nZXMgdG8gdGhlIHNpZ25hbCBoYW5kbGluZzoKLSAgICAgICAgbyBSZWFkbGluZSBub3cgY2F0Y2hlcyBTSUdRVUlUIGFuZCBjbGVhbnMgdXAgdGhlIHR0eSBiZWZvcmUgcmV0dXJuaW5nOwotICAgICAgICBvIEEgbmV3IHZhcmlhYmxlLCBybF9jYXRjaF9zaWduYWxzLCBpcyBhdmFpbGFibGUgdG8gYXBwbGljYXRpb24gd3JpdGVycyAKLSAgICAgICAgICB0byBpbmRpY2F0ZSB0byByZWFkbGluZSB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgaW5zdGFsbCBpdHMgb3duCi0gICAgICAgICAgc2lnbmFsIGhhbmRsZXJzIGZvciBTSUdJTlQsIFNJR1RFUk0sIFNJR1FVSVQsIFNJR0FMUk0sIFNJR1RTVFAsCi0gICAgICAgICAgU0lHVFRJTiwgYW5kIFNJR1RUT1U7Ci0gICAgICAgIG8gQSBuZXcgdmFyaWFibGUsIHJsX2NhdGNoX3NpZ3dpbmNoLCBpcyBhdmFpbGFibGUgdG8gYXBwbGljYXRpb24KLSAgICAgICAgICB3cml0ZXJzIHRvIGluZGljYXRlIHRvIHJlYWRsaW5lIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCBpbnN0YWxsIGl0cwotICAgICAgICAgIG93biBzaWduYWwgaGFuZGxlciBmb3IgU0lHV0lOQ0gsIHdoaWNoIHdpbGwgY2hhaW4gdG8gdGhlIGNhbGxpbmcKLSAgICAgICAgICBhcHBsaWNhdGlvbnMncyBTSUdXSU5DSCBoYW5kbGVyLCBpZiBvbmUgaXMgaW5zdGFsbGVkOwotICAgICAgICBvIFRoZXJlIGlzIGEgbmV3IGZ1bmN0aW9uLCBybF9mcmVlX2xpbmVfc3RhdGUsIGZvciBhcHBsaWNhdGlvbiBzaWduYWwKLSAgICAgICAgICBoYW5kbGVycyB0byBjYWxsIHRvIGZyZWUgdXAgdGhlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAotICAgICAgICAgIGxpbmUgYWZ0ZXIgcmVjZWl2aW5nIGEgc2lnbmFsOwotICAgICAgICBvIFRoZXJlIGlzIGEgbmV3IGZ1bmN0aW9uLCBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCwgdG8gY2xlYW4gdXAgdGhlCi0gICAgICAgICAgZGlzcGxheSBhbmQgdGVybWluYWwgc3RhdGUgYWZ0ZXIgcmVjZWl2aW5nIGEgc2lnbmFsOwotICAgICAgICBvIFRoZXJlIGlzIGEgbmV3IGZ1bmN0aW9uLCBybF9yZXNldF9hZnRlcl9zaWduYWwsIHRvIHJlaW5pdGlhbGl6ZSB0aGUKLSAgICAgICAgICB0ZXJtaW5hbCBhbmQgZGlzcGxheSBzdGF0ZSBhZnRlciBhbiBhcHBsaWNhdGlvbiBzaWduYWwgaGFuZGxlcgotICAgICAgICAgIHJldHVybnMgYW5kIHJlYWRsaW5lIGNvbnRpbnVlcwotCi1mLiAgVGhlcmUgaXMgYSBuZXcgZnVuY3Rpb24sIHJsX3Jlc2l6ZV90ZXJtaW5hbCwgdG8gcmVzZXQgcmVhZGxpbmUncyBpZGVhIG9mCi0gICAgdGhlIHNjcmVlbiBzaXplIGFmdGVyIGEgU0lHV0lOQ0guCi0KLWcuICBOZXcgcHVibGljIGZ1bmN0aW9uczogcmxfc2F2ZV9wcm9tcHQgYW5kIHJsX3Jlc3RvcmVfcHJvbXB0LiAgVGhlc2Ugd2VyZQotICAgIHByZXZpb3VzbHkgcHJpdmF0ZSBmdW5jdGlvbnMgd2l0aCBhIGBfJyBwcmVmaXguICBUaGVzZSBmdW5jdGlvbnMgYXJlCi0gICAgdXNlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHdyaXRlIGEgbWVzc2FnZSB0byB0aGUgYG1lc3NhZ2UgYXJlYScKLSAgICB3aXRoIHJsX21lc3NhZ2UgYW5kIGhhdmUgdGhlIHByb21wdCByZXN0b3JlZCBjb3JyZWN0bHkgd2hlbiB0aGUgbWVzc2FnZQotICAgIGlzIGVyYXNlZC4KLQotaC4gIE5ldyBmdW5jdGlvbiBob29rOiBybF9wcmVfaW5wdXRfaG9vaywgY2FsbGVkIGp1c3QgYmVmb3JlIHJlYWRsaW5lIHN0YXJ0cwotICAgIHJlYWRpbmcgaW5wdXQsIGFmdGVyIGluaXRpYWxpemF0aW9uLgotCi1pLiAgTmV3IGZ1bmN0aW9uIGhvb2s6IHJsX2Rpc3BsYXlfbWF0Y2hlc19ob29rLCBjYWxsZWQgd2hlbiByZWFkbGluZSB3b3VsZAotICAgIGRpc3BsYXkgdGhlIGxpc3Qgb2YgY29tcGxldGlvbiBtYXRjaGVzLiAgVGhlIG5ldyBmdW5jdGlvbgotICAgIHJsX2Rpc3BsYXlfbWF0Y2hfbGlzdCBpcyB3aGF0IHJlYWRsaW5lIHVzZXMgaW50ZXJuYWxseSwgYW5kIGlzIGF2YWlsYWJsZQotICAgIGZvciB1c2UgYnkgYXBwbGljYXRpb24gZnVuY3Rpb25zIGNhbGxlZCB2aWEgdGhpcyBob29rLgotCi1qLiAgTmV3IGJpbmRhYmxlIGZ1bmN0aW9uLCBkZWxldGUtY2hhci1vci1saXN0LCBsaWtlIHRjc2guCi0KLWsuICBBIG5ldyB2YXJpYWJsZSwgcmxfZXJhc2VfZW1wdHlfbGluZSwgd2hpY2gsIGlmIHNldCBieSBhbiBhcHBsaWNhdGlvbiB1c2luZwotICAgIHJlYWRsaW5lLCB3aWxsIGNhdXNlIHJlYWRsaW5lIHRvIGVyYXNlLCBwcm9tcHQgYW5kIGFsbCwgbGluZXMgb24gd2hpY2ggdGhlCi0gICAgb25seSB0aGluZyB0eXBlZCB3YXMgYSBuZXdsaW5lLgotCi1sLiAgVGhlcmUgaXMgYSBuZXcgc2NyaXB0LCBzdXBwb3J0L3NobGliLWluc3RhbGwsIHRvIGluc3RhbGwgYW5kIHVuaW5zdGFsbAotICAgIHRoZSBzaGFyZWQgcmVhZGxpbmUgYW5kIGhpc3RvcnkgbGlicmFyaWVzLgotCi1tLiAgQSBuZXcgYmluZGFibGUgdmFyaWFibGUsIGBpc2VhcmNoLXRlcm1pbmF0b3JzJywgd2hpY2ggaXMgYSBzdHJpbmcKLSAgICBjb250YWluaW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwKLSAgICBzZWFyY2ggd2l0aG91dCBiZWluZyBleGVjdXRlZCBhcyBhIGNvbW1hbmQuCi0KLW4uICBBIG5ldyBiaW5kYWJsZSBmdW5jdGlvbiwgZm9yd2FyZC1iYWNrd2FyZC1kZWxldGUtY2hhci4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhpcyBkb2N1bWVudCBkZXRhaWxzIHRoZSBjaGFuZ2VzIGJldHdlZW4gdGhpcyB2ZXJzaW9uLCByZWFkbGluZS0yLjIsCi1hbmQgdGhlIHByZXZpb3VzIHZlcnNpb24sIHJlYWRsaW5lLTIuMS4KLQotMS4gIENoYW5nZXMgdG8gUmVhZGxpbmUKLQotYS4gIEFkZGVkIGEgbWlzc2luZyBgZXh0ZXJuJyB0byBhIGRlY2xhcmF0aW9uIGluIHJlYWRsaW5lLmggdGhhdCBrZXB0Ci0gICAgcmVhZGxpbmUgZnJvbSBjb21waWxpbmcgY2xlYW5seSBvbiBzb21lIHN5c3RlbXMuCi0KLWIuICBUaGUgaGlzdG9yeSBmaWxlIGlzIG5vdyBvcGVuZWQgd2l0aCBtb2RlIDA2MDAgd2hlbiBpdCBpcyB3cml0dGVuIGZvcgotICAgIGJldHRlciBzZWN1cml0eS4KLQotYy4gIENoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBTSUdXSU5DSCBoYW5kbGluZyBjb2RlIHNvIHRoYXQgcHJvbXB0IHJlZGlzcGxheQotICAgIGlzIGRvbmUgYmV0dGVyLgotCi1kLiAgXkcgbm93IGludGVycnVwdHMgaW5jcmVtZW50YWwgc2VhcmNoZXMgY29ycmVjdGx5LgotCi1lLiAgQSBidWcgdGhhdCBjYXVzZWQgYSBjb3JlIGR1bXAgd2hlbiB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcXVvdGVkCi0gICAgd2hlbiBjb21wbGV0aW5nIHdvcmRzIHdhcyBlbXB0eSB3YXMgZml4ZWQuCi0KLWYuICBGaXhlZCBhIHByb2JsZW0gaW4gdGhlIHJlYWRsaW5lIHRlc3QgcHJvZ3JhbSBybHRlc3QuYyB0aGF0IGNhdXNlZCBhIGNvcmUKLSAgICBkdW1wLgotCi1nLiAgVGhlIGNvZGUgdGhhdCBoYW5kbGVzIHBhcnNlciBkaXJlY3RpdmVzIGluIGlucHV0cmMgZmlsZXMgbm93IGRpc3BsYXlzCi0gICAgbW9yZSBlcnJvciBtZXNzYWdlcy4KLQotaC4gIFRoZSBoaXN0b3J5IGV4cGFuc2lvbiBjb2RlIHdhcyBmaXhlZCBzbyB0aGF0IHRoZSBhcHBlYXJhbmNlIG9mIHRoZQotICAgIGhpc3RvcnkgY29tbWVudCBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHdvcmQgaW5oaWJpdHMgaGlzdG9yeQotICAgIGV4cGFuc2lvbiBmb3IgdGhhdCB3b3JkIGFuZCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgbGluZS4KLQotaS4gIFRoZSBjb2RlIHRoYXQgcHJpbnRzIGNvbXBsZXRpb24gbGlzdGluZ3Mgbm93IGJlaGF2ZXMgYmV0dGVyIGlmIG9uZSBvcgotICAgIG1vcmUgb2YgdGhlIGZpbGVuYW1lcyBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMuCi0KLWouICBUaGUgdGltZSBkZWxheSB3aGVuIHNob3dpbmcgbWF0Y2hpbmcgcGFyZW50aGVzZXMgaXMgbm93IDAuNSBzZWNvbmRzLgotCi0KLTIuICBOZXcgRmVhdHVyZXMgaW4gUmVhZGxpbmUKLQotYS4gIFRoZXJlIGlzIG5vdyBhbiBvcHRpb24gZm9yIGBpdGVyYXRpdmUnIHlhbmstbGFzdC1hcmcgaGFuZGxpbmUsIHNvIGEgdXNlcgotICAgIGNhbiBrZWVwIGVudGVyaW5nIGBNLS4nLCB5YW5raW5nIHRoZSBsYXN0IGFyZ3VtZW50IG9mIHN1Y2Nlc3NpdmUgaGlzdG9yeQotICAgIGxpbmVzLgotCi1iLiAgTmV3IHZhcmlhYmxlLCBgcHJpbnQtY29tcGxldGlvbnMtaG9yaXpvbnRhbGx5Jywgd2hpY2ggY2F1c2VzIGNvbXBsZXRpb24KLSAgICBtYXRjaGVzIHRvIGJlIGRpc3BsYXllZCBhY3Jvc3MgdGhlIHNjcmVlbiAobGlrZSBgbHMgLXgnKSByYXRoZXIgdGhhbiB1cAotICAgIGFuZCBkb3duIHRoZSBzY3JlZW4gKGxpa2UgYGxzJykuCi0KLWMuICBOZXcgdmFyaWFibGUsIGBjb21wbGV0aW9uLWlnbm9yZS1jYXNlJywgd2hpY2ggY2F1c2VzIGZpbGVuYW1lIGNvbXBsZXRpb24KLSAgICBhbmQgbWF0Y2hpbmcgdG8gYmUgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS4KLQotZC4gIFRoZXJlIGlzIGEgbmV3IGJpbmRhYmxlIGNvbW1hbmQsIGBtYWdpYy1zcGFjZScsIHdoaWNoIGNhdXNlcyBoaXN0b3J5Ci0gICAgZXhwYW5zaW9uIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgY3VycmVudCByZWFkbGluZSBidWZmZXIgYW5kIGEgc3BhY2UgdG8KLSAgICBiZSBpbnNlcnRlZCBpbnRvIHRoZSByZXN1bHQuCi0KLWUuICBUaGVyZSBpcyBhIG5ldyBiaW5kYWJsZSBjb21tYW5kLCBgbWVudS1jb21wbGV0ZScsIHdoaWNoIGVuYWJsZXMgdGNzaC1saWtlCi0gICAgbWVudSBjb21wbGV0aW9uIChzdWNjZXNzaXZlIGV4ZWN1dGlvbnMgb2YgbWVudS1jb21wbGV0ZSBpbnNlcnQgYSBzaW5nbGUKLSAgICBjb21wbGV0aW9uIG1hdGNoLCBjeWNsaW5nIHRocm91Z2ggdGhlIGxpc3Qgb2YgcG9zc2libGUgY29tcGxldGlvbnMpLgotCi1mLiAgVGhlcmUgaXMgYSBuZXcgYmluZGFibGUgY29tbWFuZCwgYHBhc3RlLWZyb20tY2xpcGJvYXJkJywgZm9yIHVzZSBvbiBXaW4zMgotICAgIHN5c3RlbXMsIHRvIGluc2VydCB0aGUgdGV4dCBmcm9tIHRoZSBXaW4zMiBjbGlwYm9hcmQgaW50byB0aGUgZWRpdGluZwotICAgIGJ1ZmZlci4KLQotZy4gIFRoZSBrZXkgc2VxdWVuY2UgdHJhbnNsYXRpb24gY29kZSBub3cgdW5kZXJzdGFuZHMgcHJpbnRmLXN0eWxlIGJhY2tzbGFzaAotICAgIGVzY2FwZSBzZXF1ZW5jZXMsIGluY2x1ZGluZyBcTk5OIG9jdGFsIGVzY2FwZXMuICBUaGVzZSBlc2NhcGUgc2VxdWVuY2VzCi0gICAgbWF5IGJlIHVzZWQgaW4ga2V5IHNlcXVlbmNlIGRlZmluaXRpb25zIG9yIG1hY3JvIHZhbHVlcy4KLQotaC4gIEFuIGAkaW5jbHVkZScgaW5wdXRyYyBmaWxlIHBhcnNlciBkaXJlY3RpdmUgaGFzIGJlZW4gYWRkZWQuCmRpZmYgLS1naXQgYS9yZWFkbGluZS9DT1BZSU5HIGIvcmVhZGxpbmUvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzZWEyMS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQlBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL0NoYW5nZUxvZy5DeWdudXMgYi9yZWFkbGluZS9DaGFuZ2VMb2cuQ3lnbnVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzUzYTMyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL0NoYW5nZUxvZy5DeWdudXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUwICswLDAgQEAKLTIwMDAtMDMtMTYgIEVsaSBaYXJldHNraWkgIDxlbGl6QGlzLmVsdGEuY28uaWw+Ci0KLQkqIHN1cHBvcnQvc2hvYmotY29uZjogU2hhcmVkIGxpYnMgYXJlIHVuc3VwcG9ydGVkIG9uIE1TRE9TLgotCi0JKiBiaW5kLmMgKF9ybF9yZWFkX2ZpbGUpOiBPcGVuIGZpbGVzIGluIGJpbmFyeSBtb2RlLiAgU3RyaXAgQ1IKLQljaGFyYWN0ZXJzIGFmdGVyIHJlYWRpbmcgdGhlIGZpbGUuCi0JKHJsX3JlX3JlYWRfaW5pdF9maWxlLCBybF9yZWFkX2luaXRfZmlsZSk6IEFsbG93IGZvciBfaW5wdXRyYyBvbgotCURPUy4KLQotCSogY29tcGxldGUuYyAodXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbik6IERvbid0IGJ5cGFzcyBnZXRwdyoKLQlmdW5jdGlvbiBjYWxscyBmb3IgREpHUFAuCi0JKEZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBIYW5kbGUgZDpmb28vYmFyIGZpbGUgbmFtZXMuCi0KLQkqIGRpc3BsYXkuYyAoX3JsX21vdmVfdmVydCkgW19fR08zMl9fXTogZmZsdXNoIHRoZSBzdHJlYW0sIHRvIG1ha2UKLQlzdXJlIGN1cnNvciBwb3NpdGlvbiBpcyB1cCB0byBkYXRlLgotCShfcmxfY2xlYXJfc2NyZWVuKSBbX19HTzMyX19dOiBDbGVhciBzY3JlZW4gYW5kIGhvbWUgdGhlIGN1cnNvci4KLQkoaW5zZXJ0X3NvbWVfY2hhcmFjdGVycywgZGVsZXRlX2NoYXJhY3RlcnMpIFtfX0RKR1BQX19dOiBEb24ndCB1c2UKLQltZW1jcHkuCi0KLQkqIGhpc3RmaWxlLmMgKHJlYWRfaGlzdG9yeV9yYW5nZSwgaGlzdG9yeV90cnVuY2F0ZV9maWxlKQotCShoaXN0b3J5X2RvX3dyaXRlKSBbX19NU0RPU19fXTogQWxsb3cgZm9yIHVuZGVyc2NvcmUgaW5zdGVhZCBvZgotCXRoZSBsZWFkaW5nIGRvdCBpbiBmaWxlIG5hbWVzLgotCi0JKiBpbnB1dC5jOiBEb24ndCB1c2UgR08zMi1zcGVjaWZpYyB3b3JrYXJvdW5kcyBpZiBIQVZFX1NFTEVDVCBvcgotCUhBVkVfVEVSTUlPU19IIGFyZSBkZWZpbmVkLgotCi0JKiByZWFkbGluZS5jOiBEb24ndCBkaXNhYmxlIHNpZ25hbHMgaWYgX19ESkdQUF9fIGlzIGRlZmluZWQuCi0KLQkqIHJsdHR5LmM6IERvbid0IGRpc2FibGUgc2lnbmFscyBhbmQgZG9uJ3QgYnlwYXNzIHRlcm1pb3MgY29kZSBmb3IKLQlESkdQUCAoaWYgSEFWRV9URVJNSU9TX0ggaXMgZGVmaW5lZCkuCi0KLQkqIHNpZ25hbHMuYzogRG9uJ3QgZGlzYWJsZSBzaWduYWxzIGZvciBESkdQUC4KLQotCSogdGVybWluYWwuYyAoX3JsX2dldF9zY3JlZW5fc2l6ZSkgW19fREpHUFBfX106IEluaXRpYWxpemUgc2NyZWVuCi0JZGltZW5zaW9ucy4KLQkoZGluZykgW19fREpHUFBfX106IFN1cHBvcnQgdmlzdWFsIGJlbGwuCi0KLTE5OTktMDgtMTMgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCUZyb20gUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0JKiBzaGVsbC5jIChzdGRpby5oKTogRmlsZSBpbmNsdWRlZCwgZm9yIGRlZmluaXRpb24gb2YgTlVMTC4KLQkqIHJlYWRsaW5lL3JsdHR5LmMgKGdldF90dHlfc2V0dGluZ3MpOiBDb25kaXRpb25hbGl6ZQotCWNhbGwgdG8gc2V0X3dpbnNpemUgb24gVElPR1dJTlNaLgotCi0xOTk5LTA3LTMwICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIEltcG9ydGVkIFJlYWRsaW5lIDQuMC4gSW50ZWdyYXRlZCBhbGwgdGhlIEN5Z251cwotCWxvY2FsIGNoYW5nZXMgc2luY2UgbGFzdCBpbXBvcnQuCi0KLQlOZXcgZmlsZXM6IHJsc3RkYy5oLCBzYXZlc3RyaW5nLmMsIHNobGliIGRpcmVjdG9yeSwKLQlkb2MvbWFudmVycy50ZXhpbmZvLCBleGFtcGxlcy9ybHZlcnNpb24uYywgCi0Jc3VwcG9ydC9pbnN0YWxsLXNobGliLCBzdXBwb3J0L3Nob2JqLWNvbmYuCi0KLQlSZW1vdmVkIGZpbGVzOiBNQU5JRkVTVC5kb2MsIGRvYy9pbmMtaGlzdC50ZXhpLgotCi0xOTk5LTA3LTEzICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmg6IEZpeCB0eXBvOiBpdCdzIEdXSU5TWl9JTl9TWVNfSU9DVEwsIG5vdAotCVRJT0NHV0lOU1pfSU5fU1lTX0lPQ1RMLgotCi0JKiBjb25maWcuaC5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9oZWFkZXIuCi0KLTE5OTktMDQtMjcgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogQ2hhbmdlTG9nLkN5Z251czogbmV3IGZpbGUuIEl0IGlzIHRoZSBvbGQgQ2hhbmdlbG9nLgotCSogQ2hhbmdlTG9nOiByZW1vdmVkLiBJdCB3YXMgY29uZmxpY3Rpbmcgd2l0aCBDSEFOR0VMT0cKLQkgIG9uIFdpbmRvd3MuCi0KLTE5OTktMDQtMjIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBNYWtlIGNvbW1lbnQgYWJvdXQgdGhpcyBjaGFuZ2UgbW9yZSBleHBsaWNpdC4KLQotMTk5OS0wNC0yMiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIHRoZSBmaW5hbCBsaWJyZWFkbGluZS5hCi0gICAgICAgIG9yIC5oIGZpbGVzLgotCi1UdWUgTWFyIDIzIDEwOjU2OjA4IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQGdteC5uZXQ+OgotIAkKLQkqIGRpc3BsYXkuYzogQ2hhbmdlIHNvbWUgdGVybWluYWwgY2FsbHMgdG8gd29yayBvbiBESkdQUC4KLQkqIHRlcm1pbmFsLmM6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSAuIGZyb20gdGhlIFZQQVRIIGRpcmVjdGl2ZS4KLQkKLVR1ZSBNYXIgIDkgMTQ6NTg6MTMgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc3VwcG9ydC9jb25maWcuc3ViOiBSZWNvZ25pemUgY3lnd2luKiwgbm90IGp1c3QgY3lnd2luMzIuCi0KLVR1ZSBGZWIgIDkgMTA6Mzg6NTcgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCB1c2UgdGhlIC4vc3VwcG9ydCBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVdlZCBKYW4gIDYgMTI6MjQ6MTkgMTk5OSAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgTE9DQUxfQ0ZMQUdTIHJhdGhlciB0aGFuIENGTEFHUyBmb3IKLQlzZWFyY2hpbmcgbGlidGVybWNhcCBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBEZWMgMzEgMTI6MDc6MDEgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZWFyY2ggZGV2byBsaWJ0ZXJtY2FwIGRpcmVjdG9yeSBmb3IgdGVybWNhcC5oCi0Jd2hlbiBjb21waWxpbmcgZm9yIGN5Z3dpbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE9ubHkgdHJ5IHRvIGNvcHkgbGlicmVhZGxpbmUuYSBhbmQKLQlsaWJoaXN0b3J5LmEgaWYgdGhleSBleGlzdC4KLQotVHVlIERlYyAyOSAyMzo0OToyMCAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjcm9zcy1idWlsZC9jeWd3aW4uY2FjaGU6IEFkZCBhIGNvdXBsZSBtb3JlIGtub3duIHNldHRpbmdzLgotCSogY29uZmlndXJlLmluOiBGaXggdHlwby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBEZWMgMjkgMTg6MTE6MjggMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBjcm9zcy1idWlsZDogbmV3IGRpcmVjdG9yeS4KLQkKLQkqIGNyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZTogbmV3IGZpbGUuIFVzZWQgZm9yIEN5Z3dpbiBjcm9zcyBidWlsZHMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgdGVzdHMgZm9yIGNyb3NzLWJ1aWxkIGZvciBDeWd3aW4uCi0KLTE5OTgtMTItMjQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBDWUdOVVMgTE9DQUwgY29tbWVudC4KLQkqIGFjY29uZmlnLmg6IEFkZCBtaXNzaW5nIGRlZmluZXMuCi0JKiBjb25maWcuaC5ib3Q6IEFkZCBtaXNzaW5nIGNvbnRlbnQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5oLmluOiBSZWdlbmVyYXRlZC4KLQotV2VkIERlYyAyMyAxNjoyMTo0MSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjb21tZW50IG91dCB0aGUgcnVsZSB0byByZWJ1aWxkIGNvbmZpZ3VyZSBieSAKLQlydW5uaW5nIGF1dG9jb25mLiAKLQotVHVlIERlYyAyMiAxMDowMDozMCAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIHNoZWxsLmMgKHNhdmVzdHJpbmcpOiBpZmRlZidkIGl0IG91dC4gCi0KLQkqIEltcG9ydGVkIG5ldyB2ZXJzaW9uIG9mIFJlYWRsaW5lIDIuMi4xLiBSZW1vdmVkIGFsbCB0aGUgQ3lnbnVzCi0JbG9jYWwgY2hhbmdlcy4KLQotCU5ldyBmaWxlczogYWNjb25maWcuaCwgYWNsb2NhbC5tNCwgYW5zaV9zdGRsaWIuaCwgY2FsbGJhY2suYywKLSAJY29uZmlnLmguaW4sIGNvbmZpZ3VyZSwgaGlzdGV4cGFuZC5jLCBoaXN0ZmlsZS5jLCBoaXN0bGliLmgsCi0gCWhpc3RzZWFyY2guYywgaW5wdXQuYywga2lsbC5jLCBtYWNyby5jLCBubHMuYywgcG9zaXhkaXIuaCwKLSAJcG9zaXhqbXAuaCwgcG9zaXhzdGF0LmgsIHJsY29uZi5oLCBybHR0eS5oLCBybHdpbnNpemUuaCwgc2hlbGwuYywKLSAJdGNhcC5oLCB0ZXJtaW5hbC5jLCB1bmRvLmMsIHV0aWwuYywgc3VwcG9ydCBkaXJlY3RvcnkuCi0KLQlSZW1vdmVkIGZpbGVzOiBzeXNkZXAqLCBjb25maWcgZGlyZWN0b3J5LgotCQotCi1GcmkgRGVjICA0IDE1OjI1OjQxIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBKaW0gQmxhbmR5Ci0gCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4gYW5kIERhdmlkIFRheWxvcgotIAk8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluIGNoYW5nZXMKLSAJbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGNvbmZpZy9tcC1lbmFibGUtdHVpOiBOZXcgZmlsZS4KLQkoVFVJX0NGTEFHUyk6IFNlYXJjaCBkZXZvJ3MgaW5jbHVkZSBkaXJlY3RvcnksIGFzIGxvbmcgYXMgd2UncmUKLSAJdG90YWxseSBydWluaW5nIG1vZHVsYXJpdHkuCi0JKElOQ0xVREVfU1JDRElSKTogTmV3IHZhci4KLQkoR0RCX1RVSV9TUkNESVIpOiBGaXggc3ludGF4IGVycm9yLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIHRoZSAtLWVuYWJsZS10dWkgZmxhZzsgaWYgaXQncyBzZXQsIGluY2x1ZGUKLSAJYSBtYWtlZmlsZSBmcmFnbWVudCB0aGF0ICNkZWZpbmVzIFRVSSBhbmQgYWRkcyB0aGUgbmVlZGVkICNpbmNsdWRlCi0gCWRpcmVjdG9yaWVzLgotCSgqLSotaHB1eCopOiBOZXcgaG9zdDsgdXNlIHN5c2RlcC1ocHV4LmguCi0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogQ2hlY2sgdGhlIHZhcmlhYmxlIHNldCBpbiB0aGUgbWFrZWZpbGUKLQlmcmFnbWVudCBhYm92ZS4KLQotCSogZGlzcGxheS5jICh0ZXJtX2dvdG8pOiBkZWNsYXJlIGl0LgotCShpbnNlcnRfc29tZV9jaGFycyk6IHNldCBpdC4KLQkoZGVsZXRlX2NoYXJzKTogc2V0IGl0LgotCi0JKiByZWFkbGluZS5jOiBhZGQgdHVpIGluY2x1ZGUgZmlsZXMgc3Vycm91bmRlZCBieSBUVUkuCi0JKHJsX3Jlc2V0KTogbmV3IGZ1bmN0aW9uLCBtb3ZlIHNvbWUgb2YgcmxfYWJvcnQgZnVuY3Rpb25hbGl0eSB0bwotIAloZXJlLgotCShybF9hYm9ydCk6IGNhbGwgcmxfcmVzZXQuCi0JKHJsX2dldGMpOiB0dWkgY2hhbmdlcy4KLQkoaW5pdF90ZXJtaW5hbF9pbyk6IHR1aSBjaGFuZ2VzLgotCi0JKiByZWFkbGluZS5oICh0dWlfdmVyc2lvbiwgZnB1dGNfdW5maWx0ZXJlZCwgZnB1dHNfdW5maWx0ZXJlZCwKLQl0dWlfdHB1dHMpOiBkZWNsYXJlIGlmIFRVSSBpcyBkZWZpbmVkLgotCi0JKiBybHR0eS5jIChwcmVwYXJlX3Rlcm1pbmFsX3NldHRpbmdzKTogYWRkaXRpb25hbCBjb21tZW50LgotCi0JKiBzaWduYWxzLmM6IGFkZCB0dWkgaW5jbHVkZSBmaWxlcyBzdXJyb3VuZGVkIGJ5IFRVSS4gIG1vdmUgI2lmCi0gCWFuZCAjZW5kaWYgdG8gY29sdW1uIDEgc28gSFAncyBjb21waWxlciB3aWxsIGFjY2VwdCB0aGVtLiAgUmVtb3ZlCi0gCWRlY2xhcmF0aW9uIG9mIHR1aURvQW5kUmV0dXJuVG9Ub3Agc2luY2UgaXQncyBkZWNsYXJlZCBpbiB0dWkuaC4KLQkocmxfaGFuZGxlX3NpZ3dpbmNoKTogY2FsbCB0dWlEb0FuZFJldHVyblRvVG9wIGlmIFRVSSBkZWZpbmVkLgotICAJKHJsX2hhbmRsZV9zaWd3aW5jaF9vbl9jbGVhcik6IGRlZmluZSBpZiBUVUkgZGVmaW5lZC4KLQkocmxfc2V0X3NpZ25hbHMpOiBpZiBUVUksIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4KLQkocmxfY2xlYXJfc2lnbmFscyk6IGluc3RhbGwgcmxfaGFuZGxlX3NpZ3dpbmNoX29uX2NsZWFyLgotCi0JKiBzeXNkZXAtaHB1eC5oOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAxNToyNjozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBDaGVjayBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCi1UdWUgSnVsIDI4IDA5OjQzOjI3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLWhwdXgxMS5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLSotaHB1eDExKik6IFVzZSBzeXNkZXAtaHB1eDExLmguCi0KLVRodSBKdWwgMjMgMTc6NDg6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQkqIGV4YW1wbGVzL2NvbmZpZ3VyZS5iYXQ6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCi1XZWQgTWF5IDEzIDEzOjQxOjUzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3lzZGVwLTZpcml4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotaXJpeDYqKTogTmV3IGhvc3Q7IHVzZSBzeXNkZXAtNmlyaXguaC4KLQotCSogTWFrZWZpbGUuaW4gKGlzZWFyY2gubywgc2VhcmNoLm8pOiBEZXBlbmQgdXBvbiBzeXNkZXAuaC4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiAkKHNyY2RpcikvY29uZmlndXJlLmluLgotCi1UaHUgQXByICA5IDExOjU5OjM4IDE5OTggIElhbiBEYWxsICg8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotCSogY29uZmlndXJlLmluIChob3N0PT1uZXRic2QpOiBJbmNsdWRlIGNvbmZpZy9taC1ic2Q0NC4KLQkqIGNvbmZpZy9taC1ic2Q0NDogTmV3IGZpbGUuCi0KLVdlZCBEZWMgIDMgMTY6NDg6MjAgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYzogZml4IHR5cG9zLgotCi1UdWUgT2N0ICA4IDA4OjU5OjI0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHRpbGRlLmMgKHRpbGRlX3dvcmRfZXhwYW5kKTogIF9fTVNET1NfX18gLT4gX19NU0RPU19fCi0KLVNhdCBPY3QgMDUgMTE6MjQ6MzQgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBybGRlZnMuaDogT24gTGludXgsIGluY2x1ZGUgPHRlcm1pb3MuaD4gdG8gZml4IGNvbXBpbGUgZXJyb3IKLQlpbiA8dGVybWNhcC5oPi4KLQotV2VkIFNlcCAgNCAxODowNjo1MSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuaDogIEVuYWJsZSBIQU5ETEVfU0lHTkFMUyBmb3IgY3lnd2luMzIuCi0KLVRodSBBdWcgMjkgMTY6NTk6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQotRnJpIEF1ZyAxNiAxNzo0OTo1NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb21wbGV0ZS5jOiAgSW5jbHVkZSA8cHdkLmg+IGlmIG5vdCBET1MsIGFuZCBpZiBjeWd3aW4zMiBvciBub3QKLQl3aW4zMi4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB0ZXN0IGZvciAqLSotY3lnd2luMzIqIHRvIHVzZSBjb25maWcvbWgtcG9zaXguCi0JKiByZWFkbGluZS5jOiAgTW92ZSBkZWNsIG9mIHRnZXRzdHIgdG8gcmxkZWZzLmguCi0JKiAoX3JsX3NldF9zY3JlZW5fc2l6ZSk6ICBSZW1vdmUgcmVkdW5kYW50IGlmZGVmIE1JTklNQUxzLgotCSogcmxkZWZzLmg6ICBEb24ndCBkbyBNSU5JTUFMIGZvciBjeWd3aW4zMi4gIEN5Z3dpbjMyIG5vdyB1c2VzCi0JZnVsbC1ibG93biByZWFkbGluZSwgZXhjZXB0IGZvciB0ZXJtY2FwLgotCi1TdW4gQXVnIDExIDIxOjA2OjI2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5jOiAgR2V0IHJpZCBvZiBkZWZpbmUgb2YgU0lHQUxSTSBpZiBfV0lOMzIgb3IgX19NU0RPU19fLgotCSogRG9uJ3QgZGVmaW5lIFNjcmVlbkNvbHMvU2NyZWVuUm93cy8uLi4gaWYgY3lnd2luMzIuCi0JKiBzeXNkZXAtbm9ybS5oOiAgRG9uJ3QgaW5jbHVkZSA8bWFsbG9jLmg+IGlmIGN5Z3dpbjMyLgotCi1TdW4gQXVnIDExIDE0OjU5OjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBybGRlZnMuaDogIElmIF9fb3NmX19pcyBkZWZpbmVkLCBpbmNsdWRlIDx0ZXJtaW8uaD4gaW5zdGVhZCBvZgotCTxzZ3R0eS5oPi4KLQotRnJpIEF1ZyAgOSAwODo1NDoyNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBiaW5kLmMgY29tcGxldGUuYyBoaXN0b3J5LmMgcmVhZGxpbmUuYzogIERvbid0IGluY2x1ZGUgc3lzL2ZpbGUuaC4KLQkqIGNvbXBsZXRlLmMgZGlzcGxheS5jIHBhcmVucy5jIHJlYWRsaW5lLmMgcmxkZWZzLmggcmx0dHkuYwotCXNpZ25hbHMuYyB0aWxkZS5jOiAgQ2hhbmdlIHJlZnMgdG8gX01TQ19WRVIgYW5kIF9fV0lOMzJfXyB0byBfV0lOMzIuCi0JKiBzaWduYWxzLmMgKHJsX3NpZ25hbF9oYW5kbGVyKTogIElmZGVmIG91dCBraWxsIGlmIF9XSU4zMi4KLQkqIHN5c2RlcC1ub3JtLmg6ICBJZmRlZiBvdXQgaW5jbHVkZSBvZiBkaXJlbnQuaCBpZiBfV0lOMzIuCi0JSW5jbHVkZSBtYWxsb2MuaCBpZiBfV0lOMzIuCi0KLVRodSBKdWwgMTggMTU6NTk6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBybGRlZnMuaCAoc3lzL3Vpby5oKSBCZWZvcmUgc3lzL3N0cmVhbS5oIGlzIGluY2x1ZGVkIHVuZGVyIEFJWCwKLQlpbmNsdWRlIHN5cy91aW8uaCwgd2hpY2ggcHJldmVudHMgYW4gdW5kZWZpbmVkIHN0cnVjdHVyZSB1c2VkIGluIGEKLQlwcm90b3R5cGUgbWVzc2FnZSBmcm9tIGJlaW5nIGdlbmVyYXRlZC4KLQotVHVlIEp1biAyNSAyMzowNTo1NSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCi1TdW4gTWF5IDI2IDE1OjE0OjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogc3lzZGVwLWxpbnV4Lmg6IE5ldyBmaWxlLgotCSogZGlzcGxheS5jOiBBZGQgaW5jbHVkZSBvZiAic3lzZGVwLmgiIHRvIGdldCBIQVZFX1ZBUkFSR1NfSC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHBhdHRlcm4gaVszNDVdODYtKi1saW51eCogaW50byAqLSotbGludXgqIHRvCi0Jc3VwcG9ydCBub24teDg2IGJhc2VkIExpbnV4IHBsYXRmb3Jtcy4KLQotU3VuIEFwciAgNyAyMjowNjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcvbWgtZ251OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWdudSopOiBOZXcgaG9zdC4KLQotU3VuIEFwciAgNyAxMzoyMTo1MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPgotCSogY29uZmlndXJlLmluOiBTQ08gT3BlblNlcnZlciA1IChhLmsuYSAzLjJ2NSopIGlzIG1vcmUgbGlrZQotCVNDTyAzLjJ2NCB0aGFuIDMuMnYyLgotCi1XZWQgSmFuICAzIDE4OjIyOjEwIDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJlYWRsaW5lLmMsIGRpc3BsYXkuYywgY29tcGxldGUuYzogQWRkIF9NU0NfVkVSIHRvIGxpc3Qgb2YKLQl0aGluZ3Mgd2hpY2ggY2FuJ3QgZG8gbW9zdCB0aGluZ3MuCi0KLVRodSBOb3YgMTYgMTU6Mzk6MDUgMTk5NSAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb21wbGV0ZS5jOiBDaGFuZ2UgV0lOMzIgdG8gX19XSU4zMl9fLCBhZGRlZCAjZWxzZSByZXR1cm4gTlVMTAotCXRvIGVuZCBvZiB0aGF0IGRlZmluZS4KLQotVHVlIE9jdCAzMSAxMDozODo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkaXNwbGF5LmMsIHBhcmVucy5jLCByZWFkbGluZS5jLCBybGRlZnMuaDogQ2hhbmdlIHVzZSBvZgotCVdJTjMyIHRvIF9fV0lOMzJfXy4KLQotVHVlIE9jdCAxMCAxMTowNzoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgotCi1UdWUgT2N0IDEwIDA4OjQ5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBsZXRlLmMgKGZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBFbmFibGUgZm9yCi0Jd2luMzIgd2hlbiBub3QgTVNDLgotCi1TdW4gT2N0ICA4IDA0OjE3OjE5IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIHBvd2VycGMtaWJtLWFpeCogbGlrZSByczYwMDAtaWJtLWFpeCouCi0KLVNhdCBPY3QgIDcgMjA6MzY6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJsdHR5LmMgKG91dGNoYXIpOiBSZXR1cm4gYW4gaW50LCBsaWtlIHRwdXRzIGV4cGVjdHMuCi0JKiBzaWduYWxzLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTogRGl0dG8uCi0KLUZyaSBTZXAgMjkgMTU6MTk6MjMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUZpeGVzIGZvciB3aGVuIHRoZSBob3N0IFdJTjMyLCBidXQgbm90IE1TQy4KLQkqIGNvbXBsZXRlLmM6IFNvbWV0aW1lcyBoYXZlIHB3ZC5oCi0JKiBwYXJlbnMuYzogV0lOMzIgaGFzIHNpbWlsYXIgcmVzdHJpY3Rpb25zIHRvIF9fR08zMl9fLgotCSogcmVhZGxpbmUuYyAoX19HTzMyX18pOiBTb21lIG9mIHRoaXMgbW92ZWQgaW50byBybGRlZnMuaAotCSogc2lnbmFscy5jIChfX0dPMzJfXyk6IExpa2V3aXNlLgotCSogcmxkZWZzLmggKE1TRE9TfHxXSU4zMikgYmVjb21lcyBNU0RPU3x8TVNDLgotCShXSU4zMiYmIVdJTjMyKTogTmV3IGRlZmluaXRpb25zLgotCi1XZWQgU2VwIDIwIDEyOjU3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgotCi1XZWQgTWFyICAxIDEzOjMzOjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmx0dHkuYyAob3V0Y2hhcik6IFByb3ZpZGUgcHJvdG90eXBlIGZvciBvdXRjaGFyLCB0byBzaWxlbmNlCi0JdHlwZSB3YXJuaW5ncyBpbiBwYXNzaW5nIG91dGNoYXIgdG8gdHB1dHMgb24gc3lzdGVtcyBsaWtlIExpbnV4Ci0JdGhhdCBoYXZlIGZ1bGwgcHJvdG90eXBlcy4KLQotCSogc2lnbmFscy5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik6IFByb3ZpZGUgcHJvdG90eXBlIHRvCi0Jc2lsZW5jZSB0eXBlIHdhcm5pbmdzLgotCi1TdW4gSmFuIDE1IDE0OjEwOjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBybGRlZnMuaDogRGVmaW5lIE1JTklNQUwgZm9yIF9fR08zMl9fIGFuZCBXSU4zMi4KLQkqIGNvbXBsZXRlLmMsIGRpc3BsYXkuYywgcmVhZGxpbmUuYywgcmx0dHkuYzogVGVzdCBNSU5JTUFMCi0JaW5zdGVhZCBvZiBfX0dPMzJfXy4KLQotV2VkIEF1ZyAyNCAxMzowNDo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVNhdCBKdWwgMTYgMTM6MjY6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG04OCotaGFycmlzLWN4dXg3Kik6IFJlY29nbml6ZS4KLQkqIHN5c2RlcC1jeHV4Ny5oOiBOZXcgZmlsZS4KLQotRnJpIEp1bCAgOCAxMzoxODozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBydHR0eS5jIChjb250cm9sX21ldGFfa2V5X29uKTogUmVtb3ZlIHN1cGVyZmx1b3VzIHRlc3Rpbmcgb2YKLQlfX0dPMzJfXy4KLQotVGh1IEp1biAzMCAxNToyMTo1NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jIChjb250cm9sX21ldGFfa2V5X29uKTogRG9uJ3QgY29tcGlsZSBpZiBfX0dPMzJfXyBpcwotCWRlZmluZWQuCi0JKHJsdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzKTogTGlrZXdpc2UuCi0JKiBkaXNwbGF5LmMgKGluc2VydF9zb21lX2NoYXJzLCBkZWxldGVfY2hhcnMpOiByb3dfc3RhcnQgc2hvdWxkIGJlCi0JYSBzaG9ydC4KLQkqIHBhcmVucy5jIChybF9pbnNlcnRfY2xvc2UpOiBObyBGRF9TRVQgaWYgdXNpbmcgX19HTzMyX18uCi0JKiByZWFkbGluZS5jIChybF9nYXRoZXJfdHlpKTogU3RyaXAgb2ZmIHNwdXJpb3VzIGhpZ2ggYml0cy4KLQotU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGhpc3RvcnkuYzogIFN3YXAgaW5jbHVzaW9uIG9mIHJsZGVmcy5oIGFuZCBjaGFyZGVmcy5oIHRvIGF2b2lkCi0JQ1RSTCBtYWNybyByZWRlZmluaXRpb24uCi0KLU1vbiBNYXkgIDkgMTg6Mjk6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChyZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzKTogRG9uJ3QgY29tcGlsZSBpZgotCV9fR08zMl9fIGlzIGRlZmluZWQuCi0JKF9ybF9zZXRfc2NyZWVuX3NpemUpOiBMaWtld2lzZS4KLQkqIHJsdHR5LmMgKHJsdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzKTogTGlrZXdpc2UuCi0JKGNvbnRyb2xfbWV0YV9rZXkpOiBMaWtld2lzZS4KLQkqIGRpc3BsYXkuYzogSWYgX19HTzMyX18gaXMgZGVmaW5lZCwgaW5jbHVkZSA8c3lzL3BjLmg+LgotCSogcGFyZW5zLmM6IElmIF9fR08zMl9fIGlzIGRlZmluZWQsIHVuZGVmaW5lIEZEX1NFVC4KLQkqIHNpZ25hbHMuYzogSW5jbHVkZSBTSUdXSU5DSCBoYW5kbGluZyBpbiB0aGUgc2V0IG9mIHRoaW5ncyB3aGljaAotCWlzIG5vdCBkb25lIGlmIEhBTkRMRV9TSUdOQUxTIGlzIG5vdCBzZXQuCi0KLUZyaSBNYXkgIDYgMTM6Mzg6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy9taC1nbzMyOiBOZXcgZnJhZ21lbnQuCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBVc2UgZ28zMiBmcmFnbWVudC4KLQotV2VkIE1heSAgNCAxNDozNjo1MyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oLCBybGRlZnMuaDogIE1vdmUgZGVjbHMgb2Ygc3RyaW5nIGZ1bmNzIGZyb20gY2hhcmRlZnMuaAotCXRvIHJsZGVmcy5oIHNvIHRoYXQgdGhleSBkb24ndCBwb2xsdXRlIGFwcHMgdGhhdCBpbmNsdWRlCi0JcmVhZGxpbmUuaC4KLQkqIGhpc3RvcnkuYzogIGluY2x1ZGUgcmxkZWZzLmggdG8gZ2V0IGRlY2xzIG9mIHN0cmluZyBmdW5jcy4KLQotV2VkIE1heSAgNCAxMjoxNToxMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLWJ1bGwtYm9zeCopOiBOZXcgY29uZmlndXJhdGlvbiwgUlMvNjAwMAotCXZhcmlhbnQuCi0KLVdlZCBBcHIgMjAgMTA6NDM6NTIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLXBvc2l4IGZvciBzdW5vczQuMSouCi0KLVdlZCBBcHIgMTMgMjE6Mjg6NDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmMgKHNldF90dHlfc2V0dGluZ3MpOiBEb24ndCBzZXQgcmVhZGxpbmVfZWNob2luZ19wLgotCShybF9kZXByZXBfdGVybWluYWwpIFtORVdfVFRZX0RSSVZFUl06IFNldCByZWFkbGluZV9lY2hvaW5nX3AuCi0KLVN1biBNYXIgMTMgMDk6MTM6MTIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgVEFHUyB0YXJnZXQuCi0KLVdlZCBNYXIgIDkgMTg6MDE6MzEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGlzZWFyY2guYywgc2VhcmNoLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLVRodSBNYXIgIDMgMTc6NDA6MDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIElTQywgdXNlIG1oLXN5c3YsIG5vdCBtaC1pc2MuCi0KLVRodSBGZWIgMjQgMDQ6MTM6NTMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYmFzaC0xLjEzLjUuIE1lcmdlIGNoYW5nZXMgZnJvbSBnbG9iL3RpbGRlLmMKLQlpbnRvIHRpbGRlLmMgYW5kIHVzZSBpdC4gQWRkIHN5c3RlbSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2hlcmUKLQluZWNlc3NhcnkuIENoZWNrIGZvciBfX0dPMzJfXywgbm90IF9HTzMyXyBjb25zaXN0ZW50bHkuCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBybHR0eS5jOiAgSW5jbHVkZSA8c3lzL2ZpbGUuaD4gdG8gbWF0Y2ggaW5jbHVkZSBmaWxlIHNldHVwCi0JaW4gcmVhZGxpbmUuYyBmb3IgcmxkZWZzLmguIE90aGVyd2lzZSB3ZSBnZXQgaW5jb25zaXN0ZW50Ci0JVFRZX0RSSVZFUiBkZWZpbml0aW9ucyBpbiByZWFkbGluZS5jIGFuZCBybHR0eS5jLgotCSogYmluZC5jLCBjb21wbGV0ZS5jOiAgRG8gbm90IGluY2x1ZGUgPHN5cy90eXBlcy5oPiwgaXQgaXMgYWxyZWFkeQotCWluY2x1ZGVkIHZpYSBzeXNkZXAuaCwgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGlmIDxzeXMvdHlwZXMuaD4gaGFzCi0Jbm8gbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24uCi0JKiByZWFkbGluZS5jIChfcmxfc2V0X3NjcmVlbl9zaXplKTogIFJlZXN0YWJsaXNoIHRlc3QgZm9yCi0JVElPQ0dXSU5TWl9CUk9LRU4uCi0JKiBybGRlZnMuaDogIERlZmluZSBTX0lTUkVHIGlmIG5lY2Vzc2FyeS4KLQotRnJpIEZlYiAxOCAwODo1NjozNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBzZWFyY2gubyBydWxlIGZvciBTdW4gbWFrZS4KLQotV2VkIEZlYiAxNiAxNjozNTo0OSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYzogICNpZiBvdXQgc29tZSBjb2RlIGlmIF9fR08zMl9fLgotCi1UdWUgRmViIDE1IDE0OjA3OjA4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbiksIGRpc3BsYXkuYzoKLQlSZXR1cm4gaW50LCBub3Qgdm9pZCwgdG8gY29uZm9ybSB3aXRoIHRoZSBleHBlY3RlZCBhcmcgb2YgdHB1dHMuCi0JKiByZWFkbGluZS5jIChpbml0X3Rlcm1pbmFsX2lvKTogIHRnZXRmbGFnIG9ubHkgdGFrZXMgMSBhcmcuCi0JKiByZWFkbGluZS5jIChfcmxfc2F2ZXN0cmluZyk6ICBOZXcgZnVuY3Rpb24uCi0JKiBjaGFyZGVmcy5oOiAgVG8gYXZvaWQgY29uZmxpY3RzIGFuZC9vciB3YXJuaW5ncywgZGVmaW5lCi0Jc2F2ZXN0cmluZyBhcyBhIG1hY3JvIHdyYXBwZXIgZm9yIF9ybF9zYXZlc3RyaW5nLgotCSogZGlzcGxheS5jIChleHRlcm4gdGVybV94bik6ICBJdCdzIGFuIGludCBmbGFnLCBub3QgYSBzdHJpbmcuCi0JKiBjaGFyc2RlZnMuaCwgcmxkZWZzLmg6ICBSZW1vdmUgSEFWRV9TVFJJTkdfSC1yZWxhdGVkIGp1bmsuCi0KLVNhdCBGZWIgIDUgMDg6MzI6MzAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2Jzb2xldGUgcnVsZXMgZm9yIGhpc3RvcnkuaW5mbyBhbmQKLQlyZWFkbGluZS5pbmZvLgotCi1UaHUgSmFuIDI3IDE3OjA0OjAxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oOiBPbmx5IGRlY2xhcmUgc3RycmNociBpZiBpdCBpcyBub3QgI2RlZmluZSdkLgotCi1UdWUgSmFuIDI1IDExOjMwOjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuaDogQWNjZXB0IF9faHB1eCBhcyB3ZWxsIGFzIGhwdXggZm9yIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4KLQotRnJpIEphbiAyMSAxNzozMToyNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oLCB0aWxkZS5jOiBKdXN0IGRlY2xhcmUgc3RycmNociByYXRoZXIgdGhhbiB0cnlpbmcgdG8KLQlpbmNsdWRlIGEgc3lzdGVtIGhlYWRlci4KLQotRnJpIEphbiAyMSAxNDo0MDo0MyAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogIEV4cGFuZCBsb2NhbC1kaXN0Y2xlYW4KLQlpbmxpbmUgYWZ0ZXIgZG9pbmcgcmVjdXJzaW9uLiAgWW91IGNhbid0IHJlY3Vyc2UgYWZ0ZXIgcmVtb3ZpbmcKLQlNYWtlZmlsZS4gIE1ha2UgdGhlbSBkZXBlbmQgb24gbG9jYWwtY2xlYW4uCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogIFJlbW92ZSBub3cgc3VwZXJmbHVvdXMgdGFyZ2V0LgotCi1Nb24gSmFuIDE3IDEyOjQyOjA3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGRvaW5nX2FuX3VuZG8pOiBEZWxldGUgc2Vjb25kIGRlY2xhcmF0aW9uLCBzaW5jZSBpdAotCWNvbmZ1c2VzIHRoZSBhbHBoYS1vc2YxIG5hdGl2ZSBjb21waWxlci4KLQotU3VuIEphbiAxNiAxMjozMzoxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tcGxldGUuYywgYmluZC5jOiBJbmNsdWRlIDxzeXMvc3RhdC5oPi4KLQkqIGNvbXBsZXRlLmM6IERlZmluZSBYX09LIGlmIG5vdCBkZWZpbmVkIGJ5IGEgc3lzdGVtIGhlYWRlci4KLQotCSogY2hhcmRlZnMuaDogRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLgotCi0JKiBrZXltYXBzLmg6IEluY2x1ZGUgImNoYXJkZWZzLmgiIG5vdCA8cmVhZGxpbmUvY2hhcmRlZnMuaD4uCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gcmVhbGNsZWFuKTogUmVjdXJzZQotCWludG8gc3ViZGlyZWN0b3JpZXMgYXMgd2VsbCBhcyBkb2luZyB0aGlzIGRpcmVjdG9yeS4gIEFkZCBjbGVhbi1kdmkKLQl0YXJnZXQuCi0KLVNhdCBKYW4gMTUgMTk6MzY6MTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMsIGRpc3BsYXkuYzogIFBhdGNoZXMgdG8gYWxsb3cgdXNlIG9mIGFsbCA4MAotCWNvbHVtbnMgb24gbW9zdCB0ZXJtaW5hbHMgKHRob3NlIHdpdGggYW0gYW5kIHhuKS4KLQotCU1lcmdlIGluIGNoYW5nZXMgZnJvbSBiYXNoLTEuMTMuICBUaGUgbW9zdCBvYnZpb3VzIG9uZSBpcwotCXRoYXQgdGhlIGZpbGUgcmVhZGxpbmUuYyBoYXMgYmVlbiBzcGxpdCBpbnRvIG11bHRpcGxlIGZpbGVzLgotCSogYmluZC5jLCBjb21wbGV0ZS5jLCBkaXNwYXkuYywgaXNlYXJjaC5jLCBwYXJlbnMuYywgcmxkZWZzLmgsCi0Jcmx0dHkuYywgc2VhcmNoLmMgc2lnbmFscy5jLCB0aWxkZS5jLCB0aWxkZS5oLCB4bWFsbG9jLmM6ICBOZXcgZmlsZXMuCi0KLVNhdCBEZWMgMTEgMTY6Mjk6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2dldGMpOiBJZiBHTzMyLCB0cmltIGhpZ2ggYml0IGZyb20gZ2V0a2V5LAotCW90aGVyd2lzZSBmYW5jeSBQQyBrZXlzIGNhdXNlIGdyaWVmLgotCi1GcmkgTm92ICA1IDExOjQ5OjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBkb2MgdG8gY29uZmlnZGlycy4KLQkqIE1ha2VmaWxlLmluIChpbmZvIGR2aSBpbnN0YWxsLWluZm8gY2xlYW4taW5mbyk6IFJlY3Vyc2UgaW50byBkb2MuCi0KLUZyaSBPY3QgMjIgMDc6NTU6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVHVlIE9jdCAgNSAxMjozMzo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogQWRkIHN0dWZmIGZvciBISVVYIHRvIHBsYWNlIHdoZXJlIHdlIGRldGVjdCB0ZXJtaW8KLQl2cy4gc2d0dHkgKHVnaCwgYnV0IEkgZG9uJ3Qgc2VlIGEgc2ltcGxlIGJldHRlciB3YXkpLgotCi1XZWQgU2VwIDI5IDExOjAyOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChwYXJzZXJfaWYpOiBGcmVlIHRuYW1lIHdoZW4gZG9uZSB3aXRoIGl0IChjaGFuZ2UKLQlpbXBvcnRlZCBmcm9tIGZyb20gYmFzaAkxLjEyIHJlYWRsaW5lKS4KLQotVHVlIFNlcCAgNyAxNzoxNTozNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtODhrLSotc3lzdnI0Kik6IENvbW1lbnQgb3V0IHByZXZpb3VzIGNoYW5nZS4KLQotRnJpIEp1bCAgMiAxMTowNTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXJpc2NvcyopOiBOZXcgZW50cnk7IHVzZSBtaC1zeXN2LgotCi1XZWQgSnVuIDIzIDEzOjAwOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50LgotCi1Nb24gSnVuIDE0IDE0OjI4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBlcmljKQotCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1zeXN2cjQqKTogVXNlIHN5c2RlcC1ub3JtLmguCi0KLVN1biBKdW4gMTMgMTM6MDQ6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh7cmVhbCxkaXN0fWNsZWFuKTogUmVtb3ZlIHN5c2RlcC5oLgotCi1UaHUgSnVuIDEwIDExOjIyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIGFuZCByZWFsY2xlYW4gdGFyZ2V0cy4KLQotRnJpIE1heSAyMSAxNzowOToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWlzYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFVzZSBpdC4KLQotU2F0IEFwciAxNyAwMDo0MDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY2FsdmluKQotCi0JKiByZWFkbGluZS5jLCBoaXN0b3J5LmM6IERvbid0IGluY2x1ZGUgc3lzL3R5cGVzLmg7IHN5c2RlcC5oIGRvZXMuCi0KLQkqIGNvbmZpZy9taC1zeXN2OiBEZWZpbmUgVElPQ0dXSU5TWl9CUk9LRU4uCi0JcmVhZGxpbmUuYzogQ2hlY2sgaXQuCi0KLVdlZCBNYXIgMjQgMDI6MDY6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrICYgZHZpIHRhcmdldHMKLQotRnJpIE1hciAxMiAxODozNjo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplICotKi1zb2xhcmlzMiogaW5zdGVhZCBvZiAqLSotc29sYXJpcyogKGEKLQludW1iZXIgb2YgcGVvcGxlIHdhbnQgdG8gY2FsbCBTdW5PUyA0LjEuMiAic29sYXJpczEuMCIKLQlhbmQgZ2V0IGl0IHJpZ2h0KQotCi1UdWUgTWFyICAyIDIxOjI1OjM2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtc3lzdjQuaDogIE5ldyBmaWxlIGZvciBTVlI0LgotCSogY29uZmlndXJlLmluICgqLSotc3lzdjQqKTogIFVzZSBzeXNkZXAtc3lzdjQuaC4KLQotCSogY29uZmlndXJlLmluICgqLSotdWx0cml4Mik6ICBBZGQgdHJpcGxldCBmcm9tIE1pY2hhZWwgUmVuZGVsbAotCShtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhKQotCi1UdWUgRGVjIDE1IDEyOjM4OjE2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvMy4ydjQqKTogdXNlIG1oLXNjbzQuCi0JKiBjb25maWcvbWgtc2NvNDogTmV3IGZpbGUsIGxpa2UgbWgtc2NvIGJ1dCB3aXRob3V0IGRlZmluaW5nCi0JX1BPU0lYX1NPVVJDRS4KLQotV2VkIE5vdiAxMSAyMToyMDoxNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVmb3JtYXQgdG8gb25lLWNhc2UtcGVyLWxpbmUuCi0JSGFuZGxlIFN1bk9TIDMuNSwgYXMgcGVyIEthcmwgQmVycnksIDxrYXJsQGNsYXVkZS5jcy51bWIuZWR1Pi4KLQotV2VkIE5vdiAgNCAxNTozMjozMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtbm9ybS5oOiAgUmVtb3ZlIHNvbWUgY3J1ZCwgaW5zdGFsbCBkaXJlIHdhcm5pbmcuCi0KLVRodSBPY3QgMjIgMDE6MDg6MTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBTQ08gd29yayBhZ2Fpbi4uLgotCi1Nb24gT2N0IDEyIDE1OjA0OjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoaW5pdF90ZXJtaW5hbF9pbyk6IGlmIHRnZXRlbnQgcmV0dXJucyAwLCB0aGUKLQl0ZXJtaW5hbCB0eXBlIGlzIHVua25vd24uCi0KLVRodSBPY3QgIDEgMjM6NDQ6MTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDEyOjU4OjU3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlX2ludGVybmFsKTogIENhc3QgYWxsb2NhIHRvIChjaGFyICopIHRvCi0JYXZvaWQgd2FybmluZy4KLQotRnJpIFNlcCAyNSAxMjo0NTowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChjbGVhcl90b19lb2wsIHJsX2dlbmVyaWNfYmluZCk6ICBNYWtlIHN0YXRpYy4KLQkocmxfZGlnaXRfbG9vcCk6ICBBZGQgYXJnIHRvIGNhbGwgdG8gcmxfbWVzc2FnZSgpLgotCSogdmlfbW9kZS5jIChybF92aV9maXJzdF9wcmludCk6ICBBZGQgYXJnIHRvIGNhbGwgdG8KLQlybF9iYWNrX3RvX2luZGVudCgpLgotCi1XZWQgQXVnIDE5IDE0OjU5OjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLCB1c2UgZnVsbAotCWZpbGUgbmFtZSBmb3IgaW5zdGFsbCB0YXJnZXQuCi0KLVdlZCBBdWcgMTIgMTU6NTA6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGxhc3RfcmVhZGxpbmVfaW5pdF9maWxlKTogIEZpeCB0eXBvIG1hZGUgYnkgU3RldmUKLQlDaGFtYmVybGFpbi9ESiBEZWxvcmllLiAgUHJvcGVyIGNvbnRyb2wgZmlsZSBuYW1lIGlzIH4vLmlucHV0cmMsCi0Jbm90IH4vaW5wdXRyYy4KLQotVGh1IEp1biAyNSAxNjoxNToyNyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIGJzZCBiYXNlZCBzeXN0ZW1zIHVzZSBzeXNkZXAtb2JzZC5oLgotCi1UdWUgSnVuIDIzIDIzOjIyOjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtcG9zaXg6ICBOZXcgZmlsZSwgZm9yIFBvc2l4LWNvbXBsaWFudCBzeXN0ZW1zLgotCSogY29uZmlndXJlLmluOiAgVXNlIG1oLXBvc2l4IGZvciBMaW51eCAoZnJlZSBVbml4IGNsb25lKS4KLQotVHVlIEp1biAyMyAyMTo1OToyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW5vcm0uaCAoYWxsb2NhKTogIFByb3RlY3QgYWdhaW5zdCBwcmV2aW91cyBkZWZpbml0aW9uIGFzCi0JYSBtYWNybyB3aXRoIGFyZ3VtZW50cy4KLQotRnJpIEp1biAxOSAxNTo0ODo1NCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtb2JzZC5oOiAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiB0byBtYWtlIHRoaXMgbW9yZSBLb3NoZXIuCi0KLUZyaSBKdW4gMTkgMTI6NTM6MjggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hcG9sbG82OHYsIG1oLXNjbywgbWgtc3lzdiwgbWgtc3lzdjR9OiBSQU5MSUI9dHJ1ZS4KLQotTW9uIEp1biAxNSAxMzo1MDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLXN5c3Y0IG9uIHNvbGFyaXMyCi0KLU1vbiBKdW4gMTUgMTI6Mjg6MjQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgotCSogY29uZmlnL21oLW5jcjMwMDAgKFJBTkxJQik6ICBVc2UgUkFOTElCPXRydWUuCi0KLU1vbiBKdW4gMTUgMDE6MzU6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6IE1ha2UgbmV3IFNJR05BTFNfKiBtYWNyb3MgdG8gcGFyYW1ldGVyaXplIHRoZSAKLQl1Z2x5IGNoYW5nZXMgaW4gc2lnbmFsIGJsb2NraW5nLiAgVXNlIHRoZW0gdGhyb3VnaG91dCwKLQlyZWR1Y2luZyAjaWZkZWYgSEFWRV9QT1NJWF9TSUdOQUxTIGFuZCBIQVZFX0JTRF9TSUdOQUxTIGNsdXR0ZXIKLQlzaWduaWZpY2FudGx5LiAgTWFrZSBhbGwgc3VjaCBwbGFjZXMgdXNlIFBPU0lYIGlmIGF2YWlsYWJsZSwKLQl0byBhdm9pZCBsb3Npbmcgd2l0aCBwb29yIGBzaWdzZXRtYXNrJyBlbXVsYXRpb24gZnJvbSBsaWJpYmVydHkuCi0KLVN1biBKdW4gMTQgMTU6MTk6NTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoaW5zZXJ0X3NvbWVfY2hhcnMpOiAgUmV0dXJuIHZvaWQuCi0KLVRodSBKdW4gMTEgMDE6Mjc6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6ICAjdW5kZWYgUEMsIHdoaWNoIFNvbGFyaXMyIGRlZmluZXMgaW4gc3lzL3R5cGVzLmgsCi0JY2xvYmJlcmluZyB0aGUgdGVybWNhcCBnbG9iYWwgdmFyaWFibGUgUEMuCi0KLVR1ZSBKdW4gIDkgMTc6MzA6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQ2hhbmdlIElOU1RBTEwgdG8gdXNlCi0JL3Vzci91Y2IvaW5zdGFsbC4KLQotTW9uIEp1biAgOCAyMzoxMDowNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuaCAocmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMpOiAgQWRkIGRlY2xhcmF0aW9uLgotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMpOiAgQWRkIGdsb2JhbCB2YXIuCi0JKiByZWFkbGluZS5jIChzdHJwYnJrKTogIEFkZCBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uLgotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVfaW50ZXJuYWwpOiAgQWRkIGNvZGUgdG8gaGFuZGxlCi0JZXhwYW5zaW9uIG9mIHF1b3RlZCBzdHJpbmdzLgotCi1Nb24gTWF5IDExIDEyOjM5OjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiAgQ2FuJ3QgaW5pdGlhbGl6ZSBGSUxFIConcyB3aXRoIHN0ZGluIGFuZCBzdGRvdXQsCi0JYmVjYXVzZSB0aGV5IG1pZ2h0IG5vdCBiZSBjb25zdGFudC4gIFBhdGNoIGZyb20gVG9tIFF1aW5uLAotCXRycUBkaW5veXNvcy50aHBoeXMub3guYWMudWsuCi0KLVR1ZSBBcHIgMjggMjE6NTI6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmg6ICBEZWNsYXJlIHJsX2V2ZW50X2hvb2sgKHdoaWNoIGFscmVhZHkgZXhpc3RlZCkuCi0JU3VnZ2VzdGVkIGJ5IENocmlzdG9waCBUaWV0eiA8dGlldHpAemkuZ21kLmRicC5kZT4uCi0KLVdlZCBBcHIgMjIgMTg6MDg6MDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBzdWJkaXJzIGRlY2xhcmF0aW9uLiAgVGhlIG9ic29sZXRlIHNlbWFudGljCi0JICBmb3Igc3ViZGlycyBoYXMgYmVlbiB1c3VycGVkIGJ5IHBlcidzIG5ldyBtZWFuaW5nLgotCi1UdWUgQXByIDIxIDExOjU0OjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBvbiB0aGUKLQkgIGNvbW1hbmQgbGluZSB0byBtYWtlLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxMCAyMzowMjoyNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IE5DUiAzMDAwIGNvbmZpZyBmaWxlLgotCi1XZWQgTWFyIDI1IDEwOjQ2OjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBoaXN0b3J5LmMgKHN0aWZsZV9oaXN0b3J5KTogIE5lZ2F0aXZlIGFyZyB0cmVhdGVkIGFzIHplcm8uCi0KLVR1ZSBNYXIgMjQgMjM6NDY6MjAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zeXN2OiBJTlNUQUxMX1BST0cgLT4gSU5TVEFMTC4KLQotTW9uIEZlYiAxMCAwMTo0MTozNSAxOTkyICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogaGlzdG9yeS5jIChoaXN0b3J5X2RvX3dyaXRlKSBCdWlsZCBhIGJ1ZmZlciBvZiBhbGwgb2YgdGhlIGxpbmVzCi0JdG8gd3JpdGUgYW5kIHdyaXRlIHRoZW0gaW4gb25lIGZlbGwgc3dvb3AgKGxvd2VyIG92ZXJoZWFkIHRoYW4KLQljYWxsaW5nIHdyaXRlICgpIGZvciBlYWNoIGxpbmUpLiAgU3VnZ2VzdGVkIGJ5IFBldGVyIEhvLgotCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX3N1YnN0KSBEb24ndCBmb3JnZXQgdG8gZW5kIHRoZSB1bmRvIGdyb3VwLgotCi1TYXQgTWFyICA3IDAwOjE1OjM2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBGSVhNRSdzIG9uIGluZm8gYW5kIGluc3RhbGwtaW5mbyB0YXJnZXRzLgotCi1GcmkgTWFyICA2IDIyOjAyOjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotRnJpIEZlYiAyMSAxNDozNzozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYywgZXhhbXBsZXMvZmlsZW1hbi5jOiBwYXRjaGVzIGZyb20gREogdG8gc3VwcG9ydCBET1MKLQotVGh1IEZlYiAyMCAyMzoyMzoxNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9yZWFkX2luaXRfZmlsZSk6ICBNYWtlIHN1cmUgdGhhdCBudWxsIGZpbGVuYW1lIGlzCi0Jbm90IHBhc3NlZCB0byBvcGVuKCkgb3IgZWxzZSB3ZSBlbmQgdXAgb3BlbmluZyB0aGUgZGlyZWN0b3J5LCBhbmQKLQlyZWFkIGEgYnVuY2ggb2YgZ2FyYmFnZSBpbnRvIGtleW1hcFtdLgotCi1Nb24gRmViIDE3IDE3OjE1OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChyZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzKTogIE9ubHkgbWFrZSB1c2Ugb2YgVkxORVhUCi0Jd2hlbiBib3RoIFZMTkVYVCBhbmQgVEVSTUlPU19UVFlfRFJJVkVSIGlzIGRlZmluZWQuICBPbiBTVlI0Ci0JPHRlcm1pby5oPiBpbmNsdWRlcyA8dGVybWlvcy5oPiwgc28gVkxORVhUIGlzIGFsd2F5cyBkZWZpbmVkLgotCi0JKiBzeXNkZXAtbm9ybS5oIChfUE9TSVhfVkVSU0lPTik6ICBEZWZpbmUgdGhpcyBmb3IgYWxsIFNWUjQKLQlzeXN0ZW1zIHNvIHRoYXQgPHRlcm1pb3MuaD4gZ2V0cyB1c2VkLCBpbnN0ZWFkIG9mIDx0ZXJtaW8uaD4uCi0KLUZyaSBEZWMgMjAgMTI6MDQ6MzEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLUZyaSBEZWMgIDYgMjM6MjM6MTQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucywgYnNkIG1ha2UgY2FuJ3QKLQkgIGNvcGUuIGFkZGVkIGNsZWFuLWluZm8uICBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgRG9uJ3QKLQkgIGtub3cgaG93IHRvIG1ha2UgaW5mbyBhbnltb3JlLgotCi0JKiBjb25maWd1cmUuaW46IGNvbW1vbnRhcmdldHMgaXMgbm8gbG9uZ2VyIGEgcmVjb2duaXplZCBob29rLCBzbwotCSAgcmVtb3ZlIGl0LiAgbmV3IHN1YmRpciBjYWxsZWQgZG9jLgotCi1UaHUgRGVjICA1IDIyOjQ2OjEwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwOTowMjozMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW9ic2QuaDogIFJlbmFtZSBmcm9tIHN5c2RlcC1uZXdzb3MuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBzeXNkZXAtb2JzZCBmb3IgTWFjaCBhcyB3ZWxsIGFzIE5FV3MuCi0KLQkqIHN5c2RlcC1ub3JtLmgsIHN5c2RlcC1haXguaDogIEFkZCA8c3lzL3R5cGVzLmg+LCB3aGljaCBQT1NJWAotCXJlcXVpcmVzIHRvIG1ha2UgPGRpcmVudC5oPiB3b3JrLiAgSW1wcm92ZSBTdW4gYWxsb2NhIGRlY2wuCi0KLVRodSBOb3YgMjEgMTg6NDg6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2xlYW4gdXAgLi4vZ2xvYi90aWxkZS5jIC0+IHRpbGRlLm8gcGF0aC4KLQlDbGVhbiB1cCBtYWtlZmlsZSBhIGJpdCBpbiBnZW5lcmFsLgotCi1UaHUgTm92IDIxIDE0OjQwOjI5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXN2cjQ6ICBNYWtlIFNWUjQgd29yay4KLQotCSogcmVhZGxpbmUuYzogIE1vdmUgY29uZmlnIHN0dWZmIHRvIHN5c2RlcC5oLCB1c2UgdHlwZWRlZiBkaXJlbnQKLQljb25zaXN0ZW50bHksIHJlbW92ZSByZWZzIHRvIGRfbmFtbGVuICgmIERfTkFNTEVOKSB0byBpbXByb3ZlCi0JcG9ydGFiaWxpdHkuICBBbHNvLCB1cGRhdGUgY29weXJpZ2h0IG5vdGljZS4KLQlyZWFkbGluZS5oOiAgcmVtb3ZlIGNvbmZpZyBzdHVmZiB0aGF0IEkgYWRkZWQgZXJyb25lb3VzbHkgaW4gdGhlCi0JZmlyc3QgcGxhY2UuCi0KLQkqIGVtYWNzX2tleW1hcC5jLCBmdW5tYXAuYywgaGlzdG9yeS5jLCBrZXltYXBzLmMsIHZpX2tleW1hcC5jLAotCXZpX21vZGUuYzogIG1vdmUgY29uZmlnIHN0dWZmIHRvIHN5c2RlcC5oLCB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCi0KLVR1ZSBOb3YgMTkgMTU6MDI6MTMgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaGlzdG9yeS5jOiAgI2luY2x1ZGUgInN5c2RlcC5oIi4KLQotVHVlIE5vdiAxOSAxMDo0OToxNyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9obS1zeXN2LCBjb25maWcvaG0tc2NvOiAgQ2hhbmdlIFNZU1YgdG8KLQlVU0cgdG8gbWF0Y2ggY3VycmVudCB1c2FnZS4KLQotCSogcmVhZGxpbmUuYzogIEFkZCBVU0dyNCB0byBsaXN0IG9mIGRlZmluZWQgdGhpbmdzIHRvIGNoZWNrIGZvcgotCXRvIHVzZSA8ZGlyZW50Lmg+IHN0eWxlIGRpcmVjdG9yeSBhY2Nlc3MuCi0KLQkqIGNvbmZpZy9obS1zdnI0OiAgTmV3IGZpbGUgZm9yIFN5c3RlbSBWIFJlbGVhc2UgNCAoVVNHcjQpLgotCi1Nb24gTm92IDE4IDIzOjU5OjUyIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiAgdXNlIHN0cnVjdCBkaXJlbnQKLQlpbnN0ZWFkCW9mIHN0cnVjdCBkaXJlY3QuCi0KLUZyaSBOb3YgIDEgMDc6MDI6MTMgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3RyYW5zbGF0ZV9rZXlzZXEpIE1ha2UgQy0/IHRyYW5zbGF0ZSB0byBSVUJPVVQKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLU1vbiBPY3QgMjggMTE6MzQ6NTIgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM7IFVzZSBQb3NpeCBkaXJlY3Rvcnkgcm91dGluZXMgYW5kIG1hY3Jvcy4KLQotCSogZnVubWFwLmM7IEFkZCBlbnRyeSBmb3IgY2FsbC1sYXN0LWtiZC1tYWNyby4KLQotCSogcmVhZGxpbmUuYyAocmxfcHJlcF90ZXJtKTsgVXNlIHN5c3RlbSBFT0YgY2hhcmFjdGVyIG9uIFBPU0lYCi0Jc3lzdGVtcyBhbHNvLgotCi1UaHUgT2N0ICAzIDE2OjE5OjUzIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOyBNYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBoYXZpbmcgYSBURVJNSU9TIHR0eQotCWRyaXZlciwgYW5kIGhhdmluZyBQT1NJWCBzaWduYWwgaGFuZGxpbmcuICBZb3UgbWlnaHQgb25lIHdpdGhvdXQKLQl0aGUgb3RoZXIuICBOZXcgZGVmaW5lcyB1c2VkIEhBVkVfUE9TSVhfU0lHTkFMUywgYW5kCi0JVEVSTUlPU19UVFlfRFJJVkVSLgotCi1UdWUgSnVsIDMwIDIyOjM3OjI2IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9nZXRjICgpIElmIGEgY2FsbCB0byByZWFkICgpIHJldHVybnMgd2l0aG91dCBhbgotCWVycm9yLCBidXQgd2l0aCB6ZXJvIGNoYXJhY3RlcnMsIHRoZSBmaWxlIGlzIGVtcHR5LCBzbyByZXR1cm4gRU9GLgotCi1UaHUgSnVsIDExIDIwOjU4OjM4IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiAocmxfZ2V0X25leHRfaGlzdG9yeSwgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkpCi0JUmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHNwYWNlIGlmIHRoZSBsaW5lIGJlaW5nIG1vdmVkIHRvIGlzIGxvbmdlcgotCXRoZSB0aGUgY3VycmVudCBzcGFjZSBhbGxvY2F0ZWQuICBBbWF6aW5nIHRoYXQgbm8gb25lIGhhcyBmb3VuZAotCXRoaXMgYnVnIHVudGlsIG5vdy4KLQotU3VuIEp1bCAgNyAwMjozNzowNSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzoocmxfcGFyc2VfYW5kX2JpbmQpIEFsbG93IGxlYWRpbmcgd2hpdGVzcGFjZS4KLQkgIE1ha2Ugc3VyZSBURVJNSU8gYW5kIFRFUk1JT1Mgc3lzdGVtcyB0cmVhdCBDUiBhbmQgTkwKLQkgIGRpc2N0aW5jdGx5LgotCQotVHVlIEp1biAyNSAwNDowOToyNyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogUmV3b3JrIHBhcnNpbmcgY29uZGl0aW9uYWxzIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlCi0JcHJpb3Igc3RhdGVzIG9mIHRoZSBjb25kaXRpb25hbCBzdGFjay4gIFRoaXMgbWFrZXMgJGlmIHN0YXRlbWVudHMKLQl3b3JrIGNvcnJlY3RseS4KLQotTW9uIEp1biAyNCAyMDo0NTo1OSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogc3VwcG9ydCBmb3IgZGlzcGxheWluZyBrZXkgYmluZGluZyBpbmZvcm1hdGlvbgotCWluY2x1ZGVzIHRoZSBmdW5jdGlvbnMgcmxfbGlzdF9mdW5tYXBfbmFtZXMgKCksCi0JaW52b2tpbmdfa2V5c2Vxc19pbl9tYXAgKCksIHJsX2ludm9raW5nX2tleXNlcXMgKCksCi0JcmxfZHVtcF9mdW5jdGlvbnMgKCksIGFuZCBybF9mdW5jdGlvbl9kdW1wZXIgKCkuCi0KLQlmdW5tYXAuYzogc3VwcG9ydCBmb3Igc2FtZSBpbmNsdWRlcyBybF9mdW5tYXBfbmFtZXMgKCkuCi0KLQlyZWFkbGluZS5jLCBmdW5tYXAuYzogbm8gbG9uZ2VyIGRlZmluZSBTVEFUSUNfTUFMTE9DLiAgSG93ZXZlciwKLQl1cGRhdGUgYm90aCB2ZXJzaW9uIG9mIHhyZWFsbG9jICgpIHRvIGhhbmRsZSBhIG51bGwgcG9pbnRlci4KLQotVGh1IEFwciAyNSAxMjowMzo0OSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogdmlfbW9kZS5jIChybF92aV9md29yZCwgZldvcmQsIGV0Yy4gIEFsbCBmdW5jdGlvbnMgdXNlCi0JdGhlIG1hY3JvIGBpc2lkZW50KCknLiAgRml4ZWQgbW92ZW1lbnQgYnVnIHdoaWNoIHByZXZlbnRzCi0JY29udGluaW91cyBtb3ZlbWVudCB0aHJvdWdoIHRoZSB0ZXh0LgotCi1GcmkgSnVsIDI3IDE2OjQ3OjAxIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChwYXJzZXJfaWYpIEFsbG93ICIkaWYgdGVybT1mb28iIGNvbnN0cnVjdC4KLQotV2VkIE1heSAyMyAxNjoxMDozMyAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocmxfZGlzcGF0Y2gpIENvcnJlY3RseSByZW1lbWJlciB0aGUgbGFzdCBjb21tYW5kCi0JZXhlY3V0ZWQuICBGaXhlZCB0eXBvIGluIHVzZXJuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCkuCi0KLU1vbiBBcHIgIDkgMTk6NTU6NDggMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHVzZXJuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCk7IEZvciB0ZXh0IHBhc3NlZCBpbgotCXdpdGggYSBsZWFkaW5nIGB+JywgcmVtZW1iZXIgdGhhdCB0aGlzIGNvdWxkIGJlIGEgZmlsZW5hbWUgKGFmdGVyCi0JaXQgaXMgY29tcGxldGVkKS4KLQotVGh1IEFwciAgNSAxMzo0NDoyNCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfc2VhcmNoX2hpc3RvcnkgKCk6IENvcnJlY3RseSBoYW5kbGUgY2FzZSBvZiBhbgotCXVuZm91bmQgc2VhcmNoIHN0cmluZywgYnV0IGEgZ3JhY2VmdWwgZXhpdCAoYXMgd2l0aCBFU0MpLgotCi0JKiByZWFkbGluZS5jOiBybF9yZXN0YXJ0X291dHB1dCAoKTsgIFRoZSBBcG9sbG8gcGFzc2VzIHRoZSBhZGRyZXNzCi0Jb2YgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBUSU9DU1RBUlQsIG5vdCB0aGUgZGVzY3JpcHRvciBpdHNlbGYuCi0KLVR1ZSBNYXIgMjAgMDU6Mzg6NTUgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX2NvbXBsZXRlICgpOyBzZWNvbmQgY2FsbCBpbiBhIHJvdyBjYXVzZXMgcG9zc2libGUKLQljb21wbGV0aW9ucyB0byBiZSBsaXN0ZWQuCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3JlZGlzcGxheSAoKSwgYWRkZWQgcHJvbXB0X3RoaXNfbGluZSB2YXJpYWJsZQotCXdoaWNoIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhcmFjdGVyIGZvbGxvd2luZyBcbiBpbiBwcm9tcHQuCi0KLVN1biBNYXIgMTEgMDQ6MzI6MDMgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIFNpZ25hbHMgYXJlIG5vdyBzdXBwb3NlZGx5IGhhbmRsZWQgaW5zaWRlIG9mIFNZU1YgY29tcGlsYXRpb24uCi0KLVdlZCBKYW4gMTcgMTk6MjQ6MDkgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogaGlzdG9yeS5jOiBoaXN0b3J5X2V4cGFuZCAoKTsgZml4ZWQgb3ZlcndyaXRpbmcgbWVtb3J5IGVycm9yLAotCWFkZGVkIG5lZWRlZCBhcmd1bWVudCB0byBjYWxsIHRvIGdldF9oaXN0b3J5X2V2ZW50ICgpLgotCi1UaHUgSmFuIDExIDEwOjU0OjA0IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIHJlYWRsaW5lLmM6IGFkZGVkIG1hcmtfbW9kaWZpZWRfbGluZXMgdG8gY29udHJvbCB0aGUKLQlkaXNwbGF5IG9mIGFuIGFzdGVyaXNrIG9uIG1vZGlmaWVkIGhpc3RvcnkgbGluZXMuICBBbHNvCi0JYWRkZWQgYSB1c2VyIHZhcmlhYmxlIGNhbGxlZCBtYXJrLW1vZGlmaWVkLWxpbmVzIHRvIHRoZQotCWBzZXQnIGNvbW1hbmQuCi0KLVRodSBKYW4gIDQgMTA6Mzg6MDUgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogcmVhZGxpbmUuYzogc3RhcnRfaW5zZXJ0ICgpLiAgT25seSB1c2UgSUMgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBpbQotCWNhcGFiaWxpdHkuCi0KLUZyaSBTZXAgIDggMDk6MDA6NDUgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogcmxfcHJlcF90ZXJtaW5hbCAoKS4gIE9ubHkgdHVybiBvbiA4dGggYml0Ci0JICBhcyBtZXRhLWJpdCBpZmYgdGhlIHRlcm1pbmFsIGlzIG5vdCB1c2luZyBwYXJpdHkuCi0KLVN1biBTZXAgIDMgMDg6NTc6NDAgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogc3RhcnRfaW5zZXJ0ICgpLiAgVXNlcyBtdWx0aXBsZQotCSAgaW5zZXJ0aW9uIGNhbGwgaW4gY2FzZXMgd2hlcmUgdGhhdCBtYWtlcyBzZW5zZS4KLQotCSAgcmxfaW5zZXJ0ICgpLiAgUmVhZCB0eXBlLWFoZWFkIGJ1ZmZlciBmb3IgYWRkaXRpb25hbAotCSAga2V5cyB0aGF0IGFyZSBib3VuZCB0byBybF9pbnNlcnQsIGFuZCBpbnNlcnQgdGhlbQotCSAgYWxsIGF0IG9uY2UuICBNYWtlIGluc2VydGlvbiBvZiBzaW5nbGUga2V5cyBnaXZlbgotCSAgd2l0aCBhbiBhcmd1bWVudCBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1UdWUgQXVnICA4IDE4OjEzOjU3IDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IENoYW5nZWQgaGFuZGxpbmcgb2YgRU9GLiAgcmVhZGxpbmUgKCkgcmV0dXJucwotCSAoY2hhciAqKUVPRiBvciBjb25zZWQgc3RyaW5nLiAgVGhlIEVPRiBjaGFyYWN0ZXIgaXMgcmVhZCBmcm9tIHRoZQotCSB0dHksIG9yIGlmIHRoZSB0dHkgZG9lc24ndCBoYXZlIG9uZSwgZGVmYXVsdHMgdG8gQy1kLgotCi0JKiByZWFkbGluZS5jOiBBZGRlZCBzdXBwb3J0IGZvciBldmVudCBkcml2ZW4gcHJvZ3JhbXMuCi0JICBybF9ldmVudF9ob29rIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24geW91IHdhbnQgY2FsbGVkCi0JICB3aGlsZSBSZWFkbGluZSBpcyB3YWl0aW5nIGZvciBpbnB1dC4KLQotCSogcmVhZGxpbmUuYzogQ2xlYW51cCB0aW1lLiAgRnVuY3Rpb25zIHdpdGhvdXQgdHlwZSBkZWNsYXJhdGlvbnMKLQkgIGRvIG5vdCB1c2UgcmV0dXJuIHdpdGggYSB2YWx1ZS4KLQotCSogaGlzdG9yeS5jOiBoaXN0b3J5X2V4cGFuZCAoKSBoYXMgbmV3IHZhcmlhYmxlIHdoaWNoIGlzIHRoZQotCSAgY2hhcmFjdGVycyB0byBpZ25vcmUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXIuCi0KLVN1biBKdWwgMTYgMDg6MTQ6MDAgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmxfcHJlcF90ZXJtaW5hbCAoKQotCSAgQlNEIHZlcnNpb24gdHVybnMgb2ZmIEMtcywgQy1xLCBDLXksIEMtdi4KLQotCSogcmVhZGxpbmUuYyAtLSBybF9wcmVwX3Rlcm1pbmFsICgpCi0JICBTWVNWIHZlcnNpb24gaGFja3MgcmVhZGxpbmVfZWNob2luZ19wLgotCSAgQlNEIHZlcnNpb24gdHVybnMgb24gcGFzc2luZyBvZiB0aGUgOHRoIGJpdCBmb3IgdGhlIGR1cmF0aW9uCi0JICBvZiByZWFkaW5nIHRoZSBsaW5lLgotCi1UdWUgSnVsIDExIDA2OjI1OjAxIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IG5ldyB2YXJpYWJsZSBybF90aWxkZV9leHBhbmRlci4KLQkgIElmIG5vbi1udWxsLCB0aGlzIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBpZgotCSAgdGhlIHN0YW5kYXJkIG1lYW5pbmcgZm9yIGV4cGFuZGluZyBhIHRpbGRlIGZhaWxzLiAgVGhlIGZ1bmN0aW9uIGlzCi0JICBjYWxsZWQgd2l0aCB0aGUgdGV4dCBzYW5zIHRpbGRlIChhcyBpbiAiZm9vIiksIGFuZCByZXR1cm5zIGEKLQkgIG1hbGxvYygpJ2VkIHN0cmluZyB3aGljaCBpcyB0aGUgZXhwYW5zaW9uLCBvciBhIE5VTEwgcG9pbnRlciBpZgotCSAgdGhlcmUgaXMgbm8gZXhwYW5zaW9uLiAKLQotCSogcmVhZGxpbmUuaCAtIG5ldyBmaWxlIGNoYXJkZWZzLmgKLQkgIFNlcGFyYXRlcyB0aGluZ3MgdGhhdCBvbmx5IHJlYWRsaW5lLmMgbmVlZHMgZnJvbSB0aGUgc3RhbmRhcmQKLQkgIGhlYWRlciBmaWxlIHB1Ymxpc2hpbmcgaW50ZXJlc3RpbmcgdGhpbmdzIGFib3V0IHJlYWRsaW5lLgotCi0JKiByZWFkbGluZS5jOgotCSAgcmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyAoKSBub3cgbG9va3MgYXQgdGVybWluYWwgY2hhcmFyYWN0ZXJzCi0JICBhbmQgYmluZHMgdGhvc2UgYXMgd2VsbC4KLQotV2VkIEp1biAyOCAyMDoyMDo1MSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiBNYWRlIHJlYWRsaW5lIGFuZCBoaXN0b3J5IGludG8gaW5kZXBlbmRlbnQgbGlicmFyaWVzLgotCmRpZmYgLS1naXQgYS9yZWFkbGluZS9JTlNUQUxMIGIvcmVhZGxpbmUvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkODRjOC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9JTlNUQUxMCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLUJhc2ljIEluc3RhbGxhdGlvbgotPT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoZXNlIGFyZSBnZW5lcmljIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCi0KLSAgIFRoZSBgY29uZmlndXJlJyBzaGVsbCBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgY29ycmVjdCB2YWx1ZXMgZm9yCi12YXJpb3VzIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgSXQgdXNlcwotdGhvc2UgdmFsdWVzIHRvIGNyZWF0ZSBhIGBNYWtlZmlsZScgaW4gZWFjaCBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCi1JdCBtYXkgYWxzbyBjcmVhdGUgb25lIG9yIG1vcmUgYC5oJyBmaWxlcyBjb250YWluaW5nIHN5c3RlbS1kZXBlbmRlbnQKLWRlZmluaXRpb25zLiAgRmluYWxseSwgaXQgY3JlYXRlcyBhIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN0YXR1cycgdGhhdAoteW91IGNhbiBydW4gaW4gdGhlIGZ1dHVyZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhIGZpbGUKLWBjb25maWcuY2FjaGUnIHRoYXQgc2F2ZXMgdGhlIHJlc3VsdHMgb2YgaXRzIHRlc3RzIHRvIHNwZWVkIHVwCi1yZWNvbmZpZ3VyaW5nLCBhbmQgYSBmaWxlIGBjb25maWcubG9nJyBjb250YWluaW5nIGNvbXBpbGVyIG91dHB1dAotKHVzZWZ1bCBtYWlubHkgZm9yIGRlYnVnZ2luZyBgY29uZmlndXJlJykuCi0KLSAgIElmIHlvdSBuZWVkIHRvIGRvIHVudXN1YWwgdGhpbmdzIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UsIHBsZWFzZSB0cnkKLXRvIGZpZ3VyZSBvdXQgaG93IGBjb25maWd1cmUnIGNvdWxkIGNoZWNrIHdoZXRoZXIgdG8gZG8gdGhlbSwgYW5kIG1haWwKLWRpZmZzIG9yIGluc3RydWN0aW9ucyB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgYFJFQURNRScgc28gdGhleSBjYW4KLWJlIGNvbnNpZGVyZWQgZm9yIHRoZSBuZXh0IHJlbGVhc2UuICBJZiBhdCBzb21lIHBvaW50IGBjb25maWcuY2FjaGUnCi1jb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0KLSAgIFRoZSBmaWxlIGBjb25maWd1cmUuaW4nIGlzIHVzZWQgdG8gY3JlYXRlIGBjb25maWd1cmUnIGJ5IGEgcHJvZ3JhbQotY2FsbGVkIGBhdXRvY29uZicuICBZb3Ugb25seSBuZWVkIGBjb25maWd1cmUuaW4nIGlmIHlvdSB3YW50IHRvIGNoYW5nZQotaXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZyBhIG5ld2VyIHZlcnNpb24gb2YgYGF1dG9jb25mJy4KLQotVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKLQotICAxLiBgY2QnIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGFuZCB0eXBlCi0gICAgIGAuL2NvbmZpZ3VyZScgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIGZvciB5b3VyIHN5c3RlbS4gIElmIHlvdSdyZQotICAgICB1c2luZyBgY3NoJyBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQgdG8gdHlwZQotICAgICBgc2ggLi9jb25maWd1cmUnIGluc3RlYWQgdG8gcHJldmVudCBgY3NoJyBmcm9tIHRyeWluZyB0byBleGVjdXRlCi0gICAgIGBjb25maWd1cmUnIGl0c2VsZi4KLQotICAgICBSdW5uaW5nIGBjb25maWd1cmUnIHRha2VzIGF3aGlsZS4gIFdoaWxlIHJ1bm5pbmcsIGl0IHByaW50cyBzb21lCi0gICAgIG1lc3NhZ2VzIHRlbGxpbmcgd2hpY2ggZmVhdHVyZXMgaXQgaXMgY2hlY2tpbmcgZm9yLgotCi0gIDIuIFR5cGUgYG1ha2UnIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UuCi0KLSAgMy4gT3B0aW9uYWxseSwgdHlwZSBgbWFrZSBjaGVjaycgdG8gcnVuIGFueSBzZWxmLXRlc3RzIHRoYXQgY29tZSB3aXRoCi0gICAgIHRoZSBwYWNrYWdlLgotCi0gIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAotICAgICBkb2N1bWVudGF0aW9uLgotCi0gIDUuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUKLSAgICAgc291cmNlIGNvZGUgZGlyZWN0b3J5IGJ5IHR5cGluZyBgbWFrZSBjbGVhbicuICBUbyBhbHNvIHJlbW92ZSB0aGUKLSAgICAgZmlsZXMgdGhhdCBgY29uZmlndXJlJyBjcmVhdGVkIChzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yCi0gICAgIGEgZGlmZmVyZW50IGtpbmQgb2YgY29tcHV0ZXIpLCB0eXBlIGBtYWtlIGRpc3RjbGVhbicuICBUaGVyZSBpcwotICAgICBhbHNvIGEgYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgdGFyZ2V0LCBidXQgdGhhdCBpcyBpbnRlbmRlZCBtYWlubHkKLSAgICAgZm9yIHRoZSBwYWNrYWdlJ3MgZGV2ZWxvcGVycy4gIElmIHlvdSB1c2UgaXQsIHlvdSBtYXkgaGF2ZSB0byBnZXQKLSAgICAgYWxsIHNvcnRzIG9mIG90aGVyIHByb2dyYW1zIGluIG9yZGVyIHRvIHJlZ2VuZXJhdGUgZmlsZXMgdGhhdCBjYW1lCi0gICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotQ29tcGlsZXJzIGFuZCBPcHRpb25zCi09PT09PT09PT09PT09PT09PT09PT0KLQotICAgU29tZSBzeXN0ZW1zIHJlcXVpcmUgdW51c3VhbCBvcHRpb25zIGZvciBjb21waWxhdGlvbiBvciBsaW5raW5nIHRoYXQKLXRoZSBgY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3Qga25vdyBhYm91dC4gIFlvdSBjYW4gZ2l2ZSBgY29uZmlndXJlJwotaW5pdGlhbCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBieSBzZXR0aW5nIHRoZW0gaW4gdGhlIGVudmlyb25tZW50LiAgVXNpbmcKLWEgQm91cm5lLWNvbXBhdGlibGUgc2hlbGwsIHlvdSBjYW4gZG8gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIGxpa2UKLXRoaXM6Ci0gICAgIENDPWM4OSBDRkxBR1M9LU8yIExJQlM9LWxwb3NpeCAuL2NvbmZpZ3VyZQotCi1PciBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGUgYGVudicgcHJvZ3JhbSwgeW91IGNhbiBkbyBpdCBsaWtlIHRoaXM6Ci0gICAgIGVudiBDUFBGTEFHUz0tSS91c3IvbG9jYWwvaW5jbHVkZSBMREZMQUdTPS1zIC4vY29uZmlndXJlCi0KLUNvbXBpbGluZyBGb3IgTXVsdGlwbGUgQXJjaGl0ZWN0dXJlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IgbW9yZSB0aGFuIG9uZSBraW5kIG9mIGNvbXB1dGVyIGF0IHRoZQotc2FtZSB0aW1lLCBieSBwbGFjaW5nIHRoZSBvYmplY3QgZmlsZXMgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlIGluIHRoZWlyCi1vd24gZGlyZWN0b3J5LiAgVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIGEgdmVyc2lvbiBvZiBgbWFrZScgdGhhdAotc3VwcG9ydHMgdGhlIGBWUEFUSCcgdmFyaWFibGUsIHN1Y2ggYXMgR05VIGBtYWtlJy4gIGBjZCcgdG8gdGhlCi1kaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhlIG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMgdG8gZ28gYW5kIHJ1bgotdGhlIGBjb25maWd1cmUnIHNjcmlwdC4gIGBjb25maWd1cmUnIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGZvciB0aGUKLXNvdXJjZSBjb2RlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBgY29uZmlndXJlJyBpcyBpbiBhbmQgaW4gYC4uJy4KLQotICAgSWYgeW91IGhhdmUgdG8gdXNlIGEgYG1ha2UnIHRoYXQgZG9lcyBub3Qgc3VwcG9ydHMgdGhlIGBWUEFUSCcKLXZhcmlhYmxlLCB5b3UgaGF2ZSB0byBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBvbmUgYXJjaGl0ZWN0dXJlIGF0IGEgdGltZQotaW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeS4gIEFmdGVyIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgcGFja2FnZSBmb3IKLW9uZSBhcmNoaXRlY3R1cmUsIHVzZSBgbWFrZSBkaXN0Y2xlYW4nIGJlZm9yZSByZWNvbmZpZ3VyaW5nIGZvciBhbm90aGVyCi1hcmNoaXRlY3R1cmUuCi0KLUluc3RhbGxhdGlvbiBOYW1lcwotPT09PT09PT09PT09PT09PT09Ci0KLSAgIEJ5IGRlZmF1bHQsIGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCB0aGUgcGFja2FnZSdzIGZpbGVzIGluCi1gL3Vzci9sb2NhbC9iaW4nLCBgL3Vzci9sb2NhbC9tYW4nLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4KLWluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBgL3Vzci9sb2NhbCcgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQotb3B0aW9uIGAtLXByZWZpeD1QQVRIJy4KLQotICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKLWFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91Ci1naXZlIGBjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UEFUSCcsIHRoZSBwYWNrYWdlIHdpbGwgdXNlCi1QQVRIIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KLURvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgd2lsbCBzdGlsbCB1c2UgdGhlIHJlZ3VsYXIgcHJlZml4LgotCi0gICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKLXdpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCi1vcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgotCi1PcHRpb25hbCBGZWF0dXJlcwotPT09PT09PT09PT09PT09PT0KLQotICAgU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCi1gY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KLVRoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKLWlzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCi1gUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCi1wYWNrYWdlIHJlY29nbml6ZXMuCi0KLSAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQotZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoteW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAotYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KLQotU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbiBub3QgZmlndXJlIG91dAotYXV0b21hdGljYWxseSwgYnV0IG5lZWRzIHRvIGRldGVybWluZSBieSB0aGUgdHlwZSBvZiBob3N0IHRoZSBwYWNrYWdlCi13aWxsIHJ1biBvbi4gIFVzdWFsbHkgYGNvbmZpZ3VyZScgY2FuIGZpZ3VyZSB0aGF0IG91dCwgYnV0IGlmIGl0IHByaW50cwotYSBtZXNzYWdlIHNheWluZyBpdCBjYW4gbm90IGd1ZXNzIHRoZSBob3N0IHR5cGUsIGdpdmUgaXQgdGhlCi1gLS1ob3N0PVRZUEUnIG9wdGlvbi4gIFRZUEUgY2FuIGVpdGhlciBiZSBhIHNob3J0IG5hbWUgZm9yIHRoZSBzeXN0ZW0KLXR5cGUsIHN1Y2ggYXMgYHN1bjQnLCBvciBhIGNhbm9uaWNhbCBuYW1lIHdpdGggdGhyZWUgZmllbGRzOgotICAgICBDUFUtQ09NUEFOWS1TWVNURU0KLQotU2VlIHRoZSBmaWxlIGBjb25maWcuc3ViJyBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBlYWNoIGZpZWxkLiAgSWYKLWBjb25maWcuc3ViJyBpc24ndCBpbmNsdWRlZCBpbiB0aGlzIHBhY2thZ2UsIHRoZW4gdGhpcyBwYWNrYWdlIGRvZXNuJ3QKLW5lZWQgdG8ga25vdyB0aGUgaG9zdCB0eXBlLgotCi0gICBJZiB5b3UgYXJlIGJ1aWxkaW5nIGNvbXBpbGVyIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcsIHlvdSBjYW4gYWxzbwotdXNlIHRoZSBgLS10YXJnZXQ9VFlQRScgb3B0aW9uIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBzeXN0ZW0gdGhleSB3aWxsCi1wcm9kdWNlIGNvZGUgZm9yIGFuZCB0aGUgYC0tYnVpbGQ9VFlQRScgb3B0aW9uIHRvIHNlbGVjdCB0aGUgdHlwZSBvZgotc3lzdGVtIG9uIHdoaWNoIHlvdSBhcmUgY29tcGlsaW5nIHRoZSBwYWNrYWdlLgotCi1TaGFyaW5nIERlZmF1bHRzCi09PT09PT09PT09PT09PT09Ci0KLSAgIElmIHlvdSB3YW50IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYGNvbmZpZ3VyZScgc2NyaXB0cyB0byBzaGFyZSwKLXlvdSBjYW4gY3JlYXRlIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FsbGVkIGBjb25maWcuc2l0ZScgdGhhdCBnaXZlcwotZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBsaWtlIGBDQycsIGBjYWNoZV9maWxlJywgYW5kIGBwcmVmaXgnLgotYGNvbmZpZ3VyZScgbG9va3MgZm9yIGBQUkVGSVgvc2hhcmUvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cywgdGhlbgotYFBSRUZJWC9ldGMvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cy4gIE9yLCB5b3UgY2FuIHNldCB0aGUKLWBDT05GSUdfU0lURScgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlIHNjcmlwdC4KLUEgd2FybmluZzogbm90IGFsbCBgY29uZmlndXJlJyBzY3JpcHRzIGxvb2sgZm9yIGEgc2l0ZSBzY3JpcHQuCi0KLU9wZXJhdGlvbiBDb250cm9scwotPT09PT09PT09PT09PT09PT09Ci0KLSAgIGBjb25maWd1cmUnIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IGl0Ci1vcGVyYXRlcy4KLQotYC0tY2FjaGUtZmlsZT1GSUxFJwotICAgICBVc2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUgaW5zdGVhZCBvZgotICAgICBgLi9jb25maWcuY2FjaGUnLiAgU2V0IEZJTEUgdG8gYC9kZXYvbnVsbCcgdG8gZGlzYWJsZSBjYWNoaW5nLCBmb3IKLSAgICAgZGVidWdnaW5nIGBjb25maWd1cmUnLgotCi1gLS1oZWxwJwotICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgotCi1gLS1xdWlldCcKLWAtLXNpbGVudCcKLWAtcScKLSAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuCi0KLWAtLXNyY2Rpcj1ESVInCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS12ZXJzaW9uJwotICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJwotICAgICBzY3JpcHQsIGFuZCBleGl0LgotCi1gY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCi0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL01BTklGRVNUIGIvcmVhZGxpbmUvTUFOSUZFU1QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2ZmNDEuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvTUFOSUZFU1QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIwotIyBNYXN0ZXIgZGlzdHJpYnV0aW9uIG1hbmlmZXN0IGZvciB0aGUgc3RhbmRhbG9uZSByZWFkbGluZSBkaXN0cmlidXRpb24KLSMKLWRvYwkJZAotZXhhbXBsZXMJZAotc3VwcG9ydAkJZAotc2hsaWIJCWQKLUNPUFlJTkcJCWYKLVJFQURNRQkJZgotTUFOSUZFU1QJZgotSU5TVEFMTAkJZgotQ0hBTkdFTE9HCWYKLUNIQU5HRVMJCWYKLWFjbG9jYWwubTQJZgotYWNjb25maWcuaAlmCi1jb25maWcuaC5pbglmCi1jb25maWd1cmUJZgotY29uZmlndXJlLmluCWYKLU1ha2VmaWxlLmluCWYKLWFuc2lfc3RkbGliLmgJZgotY2hhcmRlZnMuaAlmCi1oaXN0b3J5LmgJZgotaGlzdGxpYi5oCWYKLWtleW1hcHMuaAlmCi1wb3NpeGRpci5oCWYKLXBvc2l4am1wLmgJZgotcG9zaXhzdGF0LmgJZgotcmVhZGxpbmUuaAlmCi1ybGNvbmYuaAlmCi1ybGRlZnMuaAlmCi1ybHN0ZGMuaAlmCi1ybHR0eS5oCQlmCi1ybHdpbnNpemUuaAlmCi10Y2FwLmgJCWYKLXRpbGRlLmgJCWYKLWJpbmQuYwkJZgotY29tcGxldGUuYwlmCi1kaXNwbGF5LmMJZgotZW1hY3Nfa2V5bWFwLmMJZgotZnVubWFwLmMJZgotaW5wdXQuYwkJZgotaXNlYXJjaC5jCWYKLWtleW1hcHMuYwlmCi1raWxsLmMJCWYKLW1hY3JvLmMJCWYKLW5scy5jCQlmCi1wYXJlbnMuYwlmCi1yZWFkbGluZS5jCWYKLXJsdHR5LmMJCWYKLXNhdmVzdHJpbmcuYwlmCi1zZWFyY2guYwlmCi1zaGVsbC5jCQlmCi1zaWduYWxzLmMJZgotdGVybWluYWwuYwlmCi10aWxkZS5jCQlmCi11bmRvLmMJCWYKLXV0aWwuYwkJZgotdmlfa2V5bWFwLmMJZgotdmlfbW9kZS5jCWYKLWNhbGxiYWNrLmMJZgoteG1hbGxvYy5jCWYKLWhpc3RvcnkuYwlmCi1oaXN0ZXhwYW5kLmMJZgotaGlzdGZpbGUuYwlmCi1oaXN0c2VhcmNoLmMJZgotc2hsaWIvTWFrZWZpbGUuaW4JZgotc3VwcG9ydC9jb25maWcuZ3Vlc3MJZgotc3VwcG9ydC9jb25maWcuc3ViCWYKLXN1cHBvcnQvaW5zdGFsbC5zaAlmCi1zdXBwb3J0L21rZGlycwkJZgotc3VwcG9ydC9ta2Rpc3QJCWYKLXN1cHBvcnQvc2hvYmotY29uZglmCi1zdXBwb3J0L3NobGliLWluc3RhbGwJZgotZG9jL01ha2VmaWxlLmluCQlmCi1kb2MvdGV4aW5mby50ZXgJCWYKLWRvYy9tYW52ZXJzLnRleGluZm8JZgotZG9jL3JsbWFuLnRleGluZm8JZgotZG9jL3JsdGVjaC50ZXhpbmZvCWYKLWRvYy9ybHVzZXIudGV4aW5mbwlmCi1kb2MvaGlzdC50ZXhpbmZvCWYKLWRvYy9oc3RlY2gudGV4aW5mbwlmCi1kb2MvaHN1c2VyLnRleGluZm8JZgotZG9jL3JlYWRsaW5lLjMJCWYKLWRvYy90ZXhpMmR2aQkJZgotZG9jL3RleGkyaHRtbAkJZgotZXhhbXBsZXMvTWFrZWZpbGUuaW4JZgotZXhhbXBsZXMvZmlsZW1hbi5jCWYKLWV4YW1wbGVzL21hbmV4YW1wLmMJZgotZXhhbXBsZXMvcmx0ZXN0LmMJZgotZXhhbXBsZXMvcmwuYwkJZgotZXhhbXBsZXMvcmx2ZXJzaW9uLmMJZgotZXhhbXBsZXMvaGlzdGV4YW1wLmMJZgotZXhhbXBsZXMvSW5wdXRyYwlmCi0jIGZvcm1hdHRlZCBkb2N1bWVudGF0aW9uLCBmcm9tIE1BTklGRVNULmRvYwotZG9jL3JlYWRsaW5lLnBzCQlmCi1kb2MvaGlzdG9yeS5wcwkJZgotZG9jL3JlYWRsaW5lLmR2aQlmCi1kb2MvaGlzdG9yeS5kdmkJCWYKLWRvYy9yZWFkbGluZS5pbmZvCWYKLWRvYy9oaXN0b3J5LmluZm8JZgotZG9jL3JlYWRsaW5lLmh0bWwJZgotZG9jL2hpc3RvcnkuaHRtbAlmCi1kb2MvcmVhZGxpbmUuMAkJZgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvTWFrZWZpbGUuaW4gYi9yZWFkbGluZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NjdlZC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0jIyAtKi0gdGV4dCAtKi0gIyMKLSMgTWFzdGVyIE1ha2VmaWxlIGZvciB0aGUgR05VIHJlYWRsaW5lIGxpYnJhcnkuCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi1STF9MSUJSQVJZX1ZFUlNJT04gPSBATElCVkVSU0lPTkAKLVJMX0xJQlJBUllfTkFNRSA9IHJlYWRsaW5lCi0KLXNyY2RpciA9IEBzcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1CVUlMRF9ESVIgPSBAQlVJTERfRElSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQ0MgPSBAQ0NACi1SQU5MSUIgPSBAUkFOTElCQAotQVIgPSBAQVJACi1BUkZMQUdTID0gQEFSRkxBR1NACi1STSA9IHJtIC1mCi1DUCA9IGNwCi1NViA9IG12Ci0KLVNIRUxMID0gQE1BS0VfU0hFTExACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotCi1pbmZvZGlyID0gQGluZm9kaXJACi0KLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotCi0jIFByb2dyYW1zIHRvIG1ha2UgdGFncyBmaWxlcy4KLUVUQUdTID0gZXRhZ3MgLXR3Ci1DVEFHUyA9IGN0YWdzIC10dwotCi1DRkxBR1MgPSBAQ0ZMQUdTQAotTE9DQUxfQ0ZMQUdTID0gQExPQ0FMX0NGTEFHU0AgLURSTF9MSUJSQVJZX1ZFUlNJT049JyIkKFJMX0xJQlJBUllfVkVSU0lPTikiJwotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLURFRlMgPSBAREVGU0AKLUxPQ0FMX0RFRlMgPSBATE9DQUxfREVGU0AKLQotIyBGb3IgbGlicmFyaWVzIHdoaWNoIGluY2x1ZGUgaGVhZGVycyBmcm9tIG90aGVyIGxpYnJhcmllcy4KLUlOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJChpbmNsdWRlZGlyKQotCi1DQ0ZMQUdTID0gJChERUZTKSAkKExPQ0FMX0RFRlMpICQoQ1BQRkxBR1MpICQoSU5DTFVERVMpICQoTE9DQUxfQ0ZMQUdTKSAkKENGTEFHUykKLQotLmMubzoKLQkke1JNfSAkQAotCSQoQ0MpIC1jICQoQ0NGTEFHUykgJDwKLQotIyBUaGUgbmFtZSBvZiB0aGUgbWFpbiBsaWJyYXJ5IHRhcmdldC4KLUxJQlJBUllfTkFNRSA9IGxpYnJlYWRsaW5lLmEKLVNUQVRJQ19MSUJTID0gbGlicmVhZGxpbmUuYSBsaWJoaXN0b3J5LmEKLQotIyBUaGUgQyBjb2RlIHNvdXJjZSBmaWxlcyBmb3IgdGhpcyBsaWJyYXJ5LgotQ1NPVVJDRVMgPSAkKHNyY2RpcikvcmVhZGxpbmUuYyAkKHNyY2RpcikvZnVubWFwLmMgJChzcmNkaXIpL2tleW1hcHMuYyBcCi0JICAgJChzcmNkaXIpL3ZpX21vZGUuYyAkKHNyY2RpcikvcGFyZW5zLmMgJChzcmNkaXIpL3JsdHR5LmMgXAotCSAgICQoc3JjZGlyKS9jb21wbGV0ZS5jICQoc3JjZGlyKS9iaW5kLmMgJChzcmNkaXIpL2lzZWFyY2guYyBcCi0JICAgJChzcmNkaXIpL2Rpc3BsYXkuYyAkKHNyY2Rpcikvc2lnbmFscy5jICQoc3JjZGlyKS9lbWFjc19rZXltYXAuYyBcCi0JICAgJChzcmNkaXIpL3ZpX2tleW1hcC5jICQoc3JjZGlyKS91dGlsLmMgJChzcmNkaXIpL2tpbGwuYyBcCi0JICAgJChzcmNkaXIpL3VuZG8uYyAkKHNyY2RpcikvbWFjcm8uYyAkKHNyY2RpcikvaW5wdXQuYyBcCi0JICAgJChzcmNkaXIpL2NhbGxiYWNrLmMgJChzcmNkaXIpL3Rlcm1pbmFsLmMgJChzcmNkaXIpL3htYWxsb2MuYyBcCi0JICAgJChzcmNkaXIpL2hpc3RvcnkuYyAkKHNyY2RpcikvaGlzdHNlYXJjaC5jICQoc3JjZGlyKS9oaXN0ZXhwYW5kLmMgXAotCSAgICQoc3JjZGlyKS9oaXN0ZmlsZS5jICQoc3JjZGlyKS9ubHMuYyAkKHNyY2Rpcikvc2VhcmNoLmMgXAotCSAgICQoc3JjZGlyKS9zaGVsbC5jICQoc3JjZGlyKS9zYXZlc3RyaW5nLmMgJChzcmNkaXIpL3RpbGRlLmMKLQotIyBUaGUgaGVhZGVyIGZpbGVzIGZvciB0aGlzIGxpYnJhcnkuCi1IU09VUkNFUyA9IHJlYWRsaW5lLmggcmxkZWZzLmggY2hhcmRlZnMuaCBrZXltYXBzLmggaGlzdG9yeS5oIGhpc3RsaWIuaCBcCi0JICAgcG9zaXhzdGF0LmggcG9zaXhkaXIuaCBwb3NpeGptcC5oIHRpbGRlLmggcmxjb25mLmggcmx0dHkuaCBcCi0JICAgYW5zaV9zdGRsaWIuaCB0Y2FwLmggcmxzdGRjLmgKLQotSElTVE9CSiA9IGhpc3RvcnkubyBoaXN0ZXhwYW5kLm8gaGlzdGZpbGUubyBoaXN0c2VhcmNoLm8gc2hlbGwubyAKLVRJTERFT0JKID0gdGlsZGUubwotT0JKRUNUUyA9IHJlYWRsaW5lLm8gdmlfbW9kZS5vIGZ1bm1hcC5vIGtleW1hcHMubyBwYXJlbnMubyBzZWFyY2gubyBcCi0JICBybHR0eS5vIGNvbXBsZXRlLm8gYmluZC5vIGlzZWFyY2gubyBkaXNwbGF5Lm8gc2lnbmFscy5vIFwKLQkgIHV0aWwubyBraWxsLm8gdW5kby5vIG1hY3JvLm8gaW5wdXQubyBjYWxsYmFjay5vIHRlcm1pbmFsLm8gXAotCSAgbmxzLm8geG1hbGxvYy5vICQoSElTVE9CSikgJChUSUxERU9CSikKLQotIyBUaGUgdGV4aW5mbyBmaWxlcyB3aGljaCBkb2N1bWVudCB0aGlzIGxpYnJhcnkuCi1ET0NTT1VSQ0UgPSBkb2MvcmxtYW4udGV4aW5mbyBkb2Mvcmx0ZWNoLnRleGluZm8gZG9jL3JsdXNlci50ZXhpbmZvCi1ET0NPQkpFQ1QgPSBkb2MvcmVhZGxpbmUuZHZpCi1ET0NTVVBQT1JUID0gZG9jL01ha2VmaWxlCi1ET0NVTUVOVEFUSU9OID0gJChET0NTT1VSQ0UpICQoRE9DT0JKRUNUKSAkKERPQ1NVUFBPUlQpCi0KLUNSRUFURURfTUFLRUZJTEVTID0gTWFrZWZpbGUgZG9jL01ha2VmaWxlIGV4YW1wbGVzL01ha2VmaWxlIHNobGliL01ha2VmaWxlCi1DUkVBVEVEX0NPTkZJR1VSRSA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmggY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAotCQkgICAgc3RhbXAtY29uZmlnIHN0YW1wLWgKLUNSRUFURURfVEFHUyA9IFRBR1MgdGFncwotCi1JTlNUQUxMRURfSEVBREVSUyA9IHJlYWRsaW5lLmggY2hhcmRlZnMuaCBrZXltYXBzLmggaGlzdG9yeS5oIHRpbGRlLmggXAotCQkgICAgcmxzdGRjLmggcmxjb25mLmgKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYWxsOiBzdGF0aWMKLQotc3RhdGljOiAkKFNUQVRJQ19MSUJTKQotCi1saWJyZWFkbGluZS5hOiAkKE9CSkVDVFMpCi0JJChSTSkgJEAKLQkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKRUNUUykKLQktdGVzdCAtbiAiJChSQU5MSUIpIiAmJiAkKFJBTkxJQikgJEAKLQotbGliaGlzdG9yeS5hOiAkKEhJU1RPQkopIHhtYWxsb2MubwotCSQoUk0pICRACi0JJChBUikgJChBUkZMQUdTKSAkQCAkKEhJU1RPQkopIHhtYWxsb2MubwotCS10ZXN0IC1uICIkKFJBTkxJQikiICYmICQoUkFOTElCKSAkQAotCi1yZWFkbGluZTogJChPQkpFQ1RTKSByZWFkbGluZS5oIHJsZGVmcy5oIGNoYXJkZWZzLmgKLQkkKENDKSAkKENDRkxBR1MpIC1vICRAIC4vZXhhbXBsZXMvcmwuYyAuL2xpYnJlYWRsaW5lLmEgLWx0ZXJtY2FwCi0KLU1ha2VmaWxlIG1ha2VmaWxlOiBjb25maWcuc3RhdHVzICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLU1ha2VmaWxlcyBtYWtlZmlsZXM6IGNvbmZpZy5zdGF0dXMgJChzcmNkaXIpL01ha2VmaWxlLmluCi0JQGZvciBtZiBpbiAkKENSRUFURURfTUFLRUZJTEVTKTsgZG8gXAotCQlDT05GSUdfRklMRVM9JCRtZiBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIDsgXAotCWRvbmUKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1jb25maWcuaDoJc3RhbXAtaAotCi1zdGFtcC1oOiBjb25maWcuc3RhdHVzICQoc3JjZGlyKS9jb25maWcuaC5pbgotCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmggLi9jb25maWcuc3RhdHVzCi0JZWNobyA+ICRACi0KLSMgQ1lHTlVTIExPQ0FMOiBOZXZlciBydW4gYXV0b2NvbmYuCi0jJChzcmNkaXIpL2NvbmZpZ3VyZTogJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgkgQ29tbWVudC1tZS1vdXQgaW4gZGlzdHJpYnV0aW9uCi0jCWNkICQoc3JjZGlyKSAmJiBhdXRvY29uZgkgQ29tbWVudC1tZS1vdXQgaW4gZGlzdHJpYnV0aW9uCi0KLXNoYXJlZDoJZm9yY2UKLQktdGVzdCAtZCBzaGxpYiB8fCBta2RpciBzaGxpYgotCS0oIGNkIHNobGliIDsgJHtNQUtFfSAke01GTEFHU30gYWxsICkKLQotZG9jdW1lbnRhdGlvbjogZm9yY2UKLQktdGVzdCAtZCBkb2MgfHwgbWtkaXIgZG9jCi0JLSggY2QgZG9jICYmICQoTUFLRSkgJChNRkxBR1MpICkKLQotZXhhbXBsZXM6IGZvcmNlCi0JLXRlc3QgLWQgZXhhbXBsZXMgfHwgbWtkaXIgZXhhbXBsZXMKLQktKGNkIGV4YW1wbGVzICYmICR7TUFLRX0gJHtNRkxBR1N9IGFsbCApCi0KLWZvcmNlOgotCi0jIyBDWUdOVVMgTE9DQUwKLSMjIERvbid0IG1lc3Mgd2l0aCBwZW9wbGUncyBpbnN0YWxsZWQgcmVhZGxpbmUncy4KLSMjIFRoaXMgdHJpZXMgdG8gaW5zdGFsbCB0aGlzIHZlcnNpb24gb2YgcmVhZGxpbmUgb3ZlciB3aGF0ZXZlcgotIyMgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtICh3aGljaCBjb3VsZCBiZSBhCi0jIyBuZXdlciB2ZXJzaW9uKS4gVGhlcmUgaXMgbm8gcmVhbCByZWFzb24gZm9yIHVzIHRvIGluc3RhbGwKLSMjIHJlYWRsaW5lIGFsb25nIHdpdGggR0RCLiBHREIgbGlua3Mgc3RhdGljYWxseSBhZ2FpbnN0IHJlYWRsaW5lLAotIyMgc28gaXQgZG9lc24ndCBkZXBlbmQgb24gdXMgaW5zdGFsbGluZyBpdCBvbiB0aGUgc3lzdGVtLgotCi1pbnN0YWxsOgotCi0jaW5zdGFsbDogaW5zdGFsbGRpcnMgJChTVEFUSUNfTElCUykKLSMJZm9yIGYgaW4gJHtJTlNUQUxMRURfSEVBREVSU307IGRvIFwKLSMJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmICQoaW5jbHVkZWRpcikvcmVhZGxpbmUgOyBcCi0jCWRvbmUKLSMJLSggaWYgdGVzdCAtZiAkKGxpYmRpcikvbGlicmVhZGxpbmUuYSA7IHRoZW4gJChNVikgJChsaWJkaXIpL2xpYnJlYWRsaW5lLmEgJChsaWJkaXIpL2xpYnJlYWRsaW5lLm9sZDsgZmkgKQotIwkkKElOU1RBTExfREFUQSkgbGlicmVhZGxpbmUuYSAkKGxpYmRpcikvbGlicmVhZGxpbmUuYQotIwktdGVzdCAtbiAiJChSQU5MSUIpIiAmJiAkKFJBTkxJQikgLXQgJChsaWJkaXIpL2xpYnJlYWRsaW5lLmEKLSMJLSggaWYgdGVzdCAtZiAkKGxpYmRpcikvbGliaGlzdG9yeS5hOyB0aGVuICQoTVYpICQobGliZGlyKS9saWJoaXN0b3J5LmEgJChsaWJkaXIpL2xpYmhpc3Rvcnkub2xkOyBmaSApCi0jCSQoSU5TVEFMTF9EQVRBKSBsaWJoaXN0b3J5LmEgJChsaWJkaXIpL2xpYmhpc3RvcnkuYQotIwktdGVzdCAtbiAiJChSQU5MSUIpIiAmJiAkKFJBTkxJQikgLXQgJChsaWJkaXIpL2xpYmhpc3RvcnkuYQotIwktKCBpZiB0ZXN0IC1kIGRvYyA7IHRoZW4gXAotIwkJY2QgZG9jICYmIFwKLSMJCSR7TUFLRX0gJHtNRkxBR1N9IGluZm9kaXI9JChpbmZvZGlyKSAkQDsgXAotIwkgIGZpICkKLQotaW5zdGFsbGRpcnM6ICQoc3JjZGlyKS9zdXBwb3J0L21rZGlycwotCS0kKFNIRUxMKSAkKHNyY2Rpcikvc3VwcG9ydC9ta2RpcnMgJChpbmNsdWRlZGlyKSBcCi0JCSQoaW5jbHVkZWRpcikvcmVhZGxpbmUgJChsaWJkaXIpICQoaW5mb2RpcikgJChtYW4zZGlyKQotCi11bmluc3RhbGw6Ci0JLXRlc3QgLW4gIiQoaW5jbHVkZWRpcikiICYmIGNkICQoaW5jbHVkZWRpcikvcmVhZGxpbmUgJiYgXAotCQkke1JNfSAke0lOU1RBTExFRF9IRUFERVJTfQotCS10ZXN0IC1uICIkKGxpYmRpcikiICYmIGNkICQobGliZGlyKSAmJiBcCi0JCSR7Uk19IGxpYnJlYWRsaW5lLmEgbGlicmVhZGxpbmUub2xkIGxpYmhpc3RvcnkuYSBsaWJoaXN0b3J5Lm9sZCAkKFNIQVJFRF9MSUJTKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbGRpcnMgc2hhcmVkCi0JLSggY2Qgc2hsaWIgOyAke01BS0V9ICR7TUZMQUdTfSBpbnN0YWxsICkKLQotdW5pbnN0YWxsLXNoYXJlZDoKLQktKCBjZCBzaGxpYjsgJHtNQUtFfSAke01GTEFHU30gdW5pbnN0YWxsICkKLQotVEFHUzoJZm9yY2UKLQkkKEVUQUdTKSAkKENTT1VSQ0VTKSAkKEhTT1VSQ0VTKQotCi10YWdzOglmb3JjZQotCSQoQ1RBR1MpICQoQ1NPVVJDRVMpICQoSFNPVVJDRVMpCi0KLWNsZWFuOglmb3JjZQotCSQoUk0pICQoT0JKRUNUUykgJChTVEFUSUNfTElCUykKLQktKCBjZCBzaGxpYiAmJiAkKE1BS0UpICQoTUZMQUdTKSAkQCApCi0JLSggY2QgZG9jICYmICQoTUFLRSkgJChNRkxBR1MpICRAICkKLQktKCBjZCBleGFtcGxlcyAmJiAkKE1BS0UpICQoTUZMQUdTKSAkQCApCi0KLW1vc3RseWNsZWFuOiBjbGVhbgotCS0oIGNkIHNobGliICYmICQoTUFLRSkgJChNRkxBR1MpICRAICkKLQktKCBjZCBkb2MgJiYgJChNQUtFKSAkKE1GTEFHUykgJEAgKQotCS0oIGNkIGV4YW1wbGVzICYmICQoTUFLRSkgJChNRkxBR1MpICRAICkKLQotZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW46IGNsZWFuCi0JLSggY2Qgc2hsaWIgJiYgJChNQUtFKSAkKE1GTEFHUykgJEAgKQotCS0oIGNkIGRvYyAmJiAkKE1BS0UpICQoTUZMQUdTKSAkQCApCi0JLSggY2QgZXhhbXBsZXMgJiYgJChNQUtFKSAkKE1GTEFHUykgJEAgKQotCSQoUk0pIE1ha2VmaWxlCi0JJChSTSkgJChDUkVBVEVEX0NPTkZJR1VSRSkKLQkkKFJNKSAkKENSRUFURURfVEFHUykKLQotaW5mbyBkdmk6Ci0JLSggY2QgZG9jICYmICQoTUFLRSkgJChNRkxBR1MpICRAICkKLQotaW5zdGFsbC1pbmZvOgotY2hlY2s6Ci1pbnN0YWxsY2hlY2s6Ci0KLWRpc3Q6ICAgZm9yY2UKLQlAZWNobyBSZWFkbGluZSBkaXN0cmlidXRpb25zIGFyZSBjcmVhdGVkIHVzaW5nICQoc3JjZGlyKS9zdXBwb3J0L21rZGlzdC4KLQlAZWNobyBIZXJlIGlzIGEgc2FtcGxlIG9mIHRoZSBuZWNlc3NhcnkgY29tbWFuZHM6Ci0JQGVjaG8gYmFzaCAkKHNyY2Rpcikvc3VwcG9ydC9ta2Rpc3QgLW0gJChzcmNkaXIpL01BTklGRVNUIC1zICQoc3JjZGlyKSAtciAkKFJMX0xJQlJBUllfTkFNRSktJChSTF9MSUJSQVJZX1ZFUlNJT04pCi0JQGVjaG8gdGFyIGNmICQoUkxfTElCUkFSWV9OQU1FKS0ke1JMX0xJQlJBUllfVkVSU0lPTn0udGFyICR7UkxfTElCUkFSWV9OQU1FfS0kKFJMX0xJQlJBUllfVkVSU0lPTikKLQlAZWNobyBnemlwICQoUkxfTElCUkFSWV9OQU1FKS0kKFJMX0xJQlJBUllfVkVSU0lPTikudGFyCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKLQotIyBEZXBlbmRlbmNpZXMKLWJpbmQubzogYW5zaV9zdGRsaWIuaCBwb3NpeHN0YXQuaAotYmluZC5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLWJpbmQubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oIHJsc3RkYy5oCi1iaW5kLm86IGhpc3RvcnkuaAotY2FsbGJhY2subzogcmxjb25mLmgKLWNhbGxiYWNrLm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAotY2FsbGJhY2subzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oIHJsc3RkYy5oCi1jb21wbGV0ZS5vOiBhbnNpX3N0ZGxpYi5oIHBvc2l4ZGlyLmggcG9zaXhzdGF0LmgKLWNvbXBsZXRlLm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAotY29tcGxldGUubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oIHJsc3RkYy5oCi1kaXNwbGF5Lm86IGFuc2lfc3RkbGliLmggcG9zaXhzdGF0LmgKLWRpc3BsYXkubzogcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oIHJsY29uZi5oCi1kaXNwbGF5Lm86IHRjYXAuaAotZGlzcGxheS5vOiByZWFkbGluZS5oIGtleW1hcHMuaCBjaGFyZGVmcy5oIHRpbGRlLmgKLWRpc3BsYXkubzogaGlzdG9yeS5oIHJsc3RkYy5oCi1mdW5tYXAubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi1mdW5tYXAubzogcmxjb25mLmggYW5zaV9zdGRsaWIuaCBybHN0ZGMuaAotZnVubWFwLm86ICR7QlVJTERfRElSfS9jb25maWcuaAotaGlzdGV4cGFuZC5vOiBhbnNpX3N0ZGxpYi5oCi1oaXN0ZXhwYW5kLm86IGhpc3RvcnkuaCBoaXN0bGliLmggcmxzdGRjLmgKLWhpc3RleHBhbmQubzogJHtCVUlMRF9ESVJ9L2NvbmZpZy5oCi1oaXN0ZmlsZS5vOiBhbnNpX3N0ZGxpYi5oCi1oaXN0ZmlsZS5vOiBoaXN0b3J5LmggaGlzdGxpYi5oIHJsc3RkYy5oCi1oaXN0ZmlsZS5vOiAke0JVSUxEX0RJUn0vY29uZmlnLmgKLWhpc3RvcnkubzogYW5zaV9zdGRsaWIuaAotaGlzdG9yeS5vOiBoaXN0b3J5LmggaGlzdGxpYi5oIHJsc3RkYy5oCi1oaXN0b3J5Lm86ICR7QlVJTERfRElSfS9jb25maWcuaAotaGlzdHNlYXJjaC5vOiBhbnNpX3N0ZGxpYi5oCi1oaXN0c2VhcmNoLm86IGhpc3RvcnkuaCBoaXN0bGliLmggcmxzdGRjLmgKLWhpc3RzZWFyY2gubzogJHtCVUlMRF9ESVJ9L2NvbmZpZy5oCi1pbnB1dC5vOiBhbnNpX3N0ZGxpYi5oCi1pbnB1dC5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLWlucHV0Lm86IHJlYWRsaW5lLmgga2V5bWFwcy5oIGNoYXJkZWZzLmggdGlsZGUuaCBybHN0ZGMuaAotaXNlYXJjaC5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLWlzZWFyY2gubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi1pc2VhcmNoLm86IGFuc2lfc3RkbGliLmggaGlzdG9yeS5oIHJsc3RkYy5oCi1rZXltYXBzLm86IGVtYWNzX2tleW1hcC5jIHZpX2tleW1hcC5jCi1rZXltYXBzLm86IGtleW1hcHMuaCBjaGFyZGVmcy5oIHJsY29uZi5oIGFuc2lfc3RkbGliLmgKLWtleW1hcHMubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi1rZXltYXBzLm86ICR7QlVJTERfRElSfS9jb25maWcuaCBybHN0ZGMuaAota2lsbC5vOiBhbnNpX3N0ZGxpYi5oCi1raWxsLm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAota2lsbC5vOiByZWFkbGluZS5oIGtleW1hcHMuaCBjaGFyZGVmcy5oIHRpbGRlLmgKLWtpbGwubzogaGlzdG9yeS5oIHJsc3RkYy5oCi1tYWNyby5vOiBhbnNpX3N0ZGxpYi5oCi1tYWNyby5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLW1hY3JvLm86IHJlYWRsaW5lLmgga2V5bWFwcy5oIGNoYXJkZWZzLmggdGlsZGUuaAotbWFjcm8ubzogaGlzdG9yeS5oIHJsc3RkYy5oCi1ubHMubzogYW5zaV9zdGRsaWIuaAotbmxzLm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAotcGFyZW5zLm86IHJsY29uZi5oCi1wYXJlbnMubzogJHtCVUlMRF9ESVJ9L2NvbmZpZy5oCi1wYXJlbnMubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oIHJsc3RkYy5oCi1yZWFkbGluZS5vOiByZWFkbGluZS5oIGtleW1hcHMuaCBjaGFyZGVmcy5oIHRpbGRlLmgKLXJlYWRsaW5lLm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAotcmVhZGxpbmUubzogaGlzdG9yeS5oIHJsc3RkYy5oCi1yZWFkbGluZS5vOiBwb3NpeHN0YXQuaCBhbnNpX3N0ZGxpYi5oIHBvc2l4am1wLmgKLXJsdHR5Lm86IHJsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCBybGNvbmYuaAotcmx0dHkubzogcmx0dHkuaAotcmx0dHkubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oIHJsc3RkYy5oCi1zZWFyY2gubzogcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oIHJsY29uZi5oCi1zZWFyY2gubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi1zZWFyY2gubzogYW5zaV9zdGRsaWIuaCBoaXN0b3J5LmggcmxzdGRjLmgKLXNoZWxsLm86ICR7QlVJTERfRElSfS9jb25maWcuaAotc2hlbGwubzogYW5zaV9zdGRsaWIuaAotc2lnbmFscy5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLXNpZ25hbHMubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi1zaWduYWxzLm86IGhpc3RvcnkuaCBybHN0ZGMuaAotdGVybWluYWwubzogcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oIHJsY29uZi5oCi10ZXJtaW5hbC5vOiB0Y2FwLmgKLXRlcm1pbmFsLm86IHJlYWRsaW5lLmgga2V5bWFwcy5oIGNoYXJkZWZzLmggdGlsZGUuaAotdGVybWluYWwubzogaGlzdG9yeS5oIHJsc3RkYy5oCi10aWxkZS5vOiBhbnNpX3N0ZGxpYi5oCi10aWxkZS5vOiAke0JVSUxEX0RJUn0vY29uZmlnLmgKLXRpbGRlLm86IHRpbGRlLmgKLXVuZG8ubzogYW5zaV9zdGRsaWIuaAotdW5kby5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLXVuZG8ubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi11bmRvLm86IGhpc3RvcnkuaCBybHN0ZGMuaAotdXRpbC5vOiBwb3NpeGptcC5oIGFuc2lfc3RkbGliLmgKLXV0aWwubzogcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oIHJsY29uZi5oCi11dGlsLm86IHJlYWRsaW5lLmgga2V5bWFwcy5oIGNoYXJkZWZzLmggdGlsZGUuaCBybHN0ZGMuaAotdmlfbW9kZS5vOiBybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggcmxjb25mLmgKLXZpX21vZGUubzogcmVhZGxpbmUuaCBrZXltYXBzLmggY2hhcmRlZnMuaCB0aWxkZS5oCi12aV9tb2RlLm86IGhpc3RvcnkuaCBhbnNpX3N0ZGxpYi5oIHJsc3RkYy5oCi14bWFsbG9jLm86ICR7QlVJTERfRElSfS9jb25maWcuaAoteG1hbGxvYy5vOiBhbnNpX3N0ZGxpYi5oCi0KLXJlYWRsaW5lLm86ICQoc3JjZGlyKS9yZWFkbGluZS5jCi12aV9tb2RlLm86ICQoc3JjZGlyKS92aV9tb2RlLmMKLWZ1bm1hcC5vOiAkKHNyY2RpcikvZnVubWFwLmMKLWtleW1hcHMubzogJChzcmNkaXIpL2tleW1hcHMuYwotcGFyZW5zLm86ICQoc3JjZGlyKS9wYXJlbnMuYwotc2VhcmNoLm86ICQoc3JjZGlyKS9zZWFyY2guYwotcmx0dHkubzogJChzcmNkaXIpL3JsdHR5LmMKLWNvbXBsZXRlLm86ICQoc3JjZGlyKS9jb21wbGV0ZS5jCi1iaW5kLm86ICQoc3JjZGlyKS9iaW5kLmMKLWlzZWFyY2gubzogJChzcmNkaXIpL2lzZWFyY2guYwotZGlzcGxheS5vOiAkKHNyY2RpcikvZGlzcGxheS5jCi1zaWduYWxzLm86ICQoc3JjZGlyKS9zaWduYWxzLmMKLXV0aWwubzogJChzcmNkaXIpL3V0aWwuYwota2lsbC5vOiAkKHNyY2Rpcikva2lsbC5jCi11bmRvLm86ICQoc3JjZGlyKS91bmRvLmMKLW1hY3JvLm86ICQoc3JjZGlyKS9tYWNyby5jCi1pbnB1dC5vOiAkKHNyY2RpcikvaW5wdXQuYwotY2FsbGJhY2subzogJChzcmNkaXIpL2NhbGxiYWNrLmMKLXRlcm1pbmFsLm86ICQoc3JjZGlyKS90ZXJtaW5hbC5jCi1ubHMubzogJChzcmNkaXIpL25scy5jCi14bWFsbG9jLm86ICQoc3JjZGlyKS94bWFsbG9jLmMKLWhpc3RvcnkubzogJChzcmNkaXIpL2hpc3RvcnkuYwotaGlzdGV4cGFuZC5vOiAkKHNyY2RpcikvaGlzdGV4cGFuZC5jCi1oaXN0ZmlsZS5vOiAkKHNyY2RpcikvaGlzdGZpbGUuYwotaGlzdHNlYXJjaC5vOiAkKHNyY2RpcikvaGlzdHNlYXJjaC5jCi1zYXZlc3RyaW5nLm86ICQoc3JjZGlyKS9zYXZlc3RyaW5nLmMKLXNoZWxsLm86ICQoc3JjZGlyKS9zaGVsbC5jCi10aWxkZS5vOiAkKHNyY2RpcikvdGlsZGUuYwotCi1yZWFkbGluZS5vOiByZWFkbGluZS5jCi12aV9tb2RlLm86IHZpX21vZGUuYwotZnVubWFwLm86IGZ1bm1hcC5jCi1rZXltYXBzLm86IGtleW1hcHMuYwotcGFyZW5zLm86IHBhcmVucy5jCi1zZWFyY2gubzogc2VhcmNoLmMKLXJsdHR5Lm86IHJsdHR5LmMKLWNvbXBsZXRlLm86IGNvbXBsZXRlLmMKLWJpbmQubzogYmluZC5jCi1pc2VhcmNoLm86IGlzZWFyY2guYwotZGlzcGxheS5vOiBkaXNwbGF5LmMKLXNpZ25hbHMubzogc2lnbmFscy5jCi11dGlsLm86IHV0aWwuYwota2lsbC5vOiBraWxsLmMKLXVuZG8ubzogdW5kby5jCi1tYWNyby5vOiBtYWNyby5jCi1pbnB1dC5vOiBpbnB1dC5jCi1jYWxsYmFjay5vOiBjYWxsYmFjay5jCi10ZXJtaW5hbC5vOiB0ZXJtaW5hbC5jCi1ubHMubzogbmxzLmMKLXhtYWxsb2MubzogeG1hbGxvYy5jCi1oaXN0b3J5Lm86IGhpc3RvcnkuYwotaGlzdGV4cGFuZC5vOiBoaXN0ZXhwYW5kLmMKLWhpc3RmaWxlLm86IGhpc3RmaWxlLmMKLWhpc3RzZWFyY2gubzogaGlzdHNlYXJjaC5jCi1zYXZlc3RyaW5nLm86IHNhdmVzdHJpbmcuYwotc2hlbGwubzogc2hlbGwuYwotdGlsZGUubzogdGlsZGUuYwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvUkVBRE1FIGIvcmVhZGxpbmUvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjU2NWIyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi1UaGlzIGlzIHRoZSBHbnUgUmVhZGxpbmUgbGlicmFyeSwgdmVyc2lvbiA0LjAuCi0KLVRoZSBSZWFkbGluZSBsaWJyYXJ5IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucwotdGhhdCBhbGxvdyB1c2VycyB0byBlZGl0IGNvbW1hbmQgbGluZXMgYXMgdGhleSBhcmUgdHlwZWQgaW4uICBCb3RoCi1FbWFjcyBhbmQgdmkgZWRpdGluZyBtb2RlcyBhcmUgYXZhaWxhYmxlLiAgVGhlIFJlYWRsaW5lIGxpYnJhcnkgaW5jbHVkZXMKLWFkZGl0aW9uYWwgZnVuY3Rpb25zIHRvIG1haW50YWluIGEgbGlzdCBvZiBwcmV2aW91c2x5LWVudGVyZWQgY29tbWFuZAotbGluZXMsIHRvIHJlY2FsbCBhbmQgcGVyaGFwcyByZWVkaXQgdGhvc2UgbGluZXMsIGFuZCBwZXJmb3JtIGNzaC1saWtlCi1oaXN0b3J5IGV4cGFuc2lvbiBvbiBwcmV2aW91cyBjb21tYW5kcy4KLQotVGhlIGhpc3RvcnkgZmFjaWxpdGVzIGFyZSBhbHNvIHBsYWNlZCBpbnRvIGEgc2VwYXJhdGUgbGlicmFyeSwgdGhlCi1IaXN0b3J5IGxpYnJhcnksIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuICBUaGUgSGlzdG9yeSBsaWJyYXJ5Ci1tYXkgYmUgdXNlZCB3aXRob3V0IFJlYWRsaW5lIGluIGFwcGxpY2F0aW9ucyB3aGljaCBkZXNpcmUgaXRzCi1jYXBhYmlsaXRpZXMuCi0KLVRoZSBSZWFkbGluZSBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZQotQ09QWUlORy4KLQotVG8gYnVpbGQgdGhlIGxpYnJhcnksIHRyeSB0eXBpbmcgYC4vY29uZmlndXJlJywgdGhlbiBgbWFrZScuICBUaGUKLWNvbmZpZ3VyYXRpb24gcHJvY2VzcyBpcyBhdXRvbWF0ZWQsIHNvIG5vIGZ1cnRoZXIgaW50ZXJ2ZW50aW9uIHNob3VsZAotYmUgbmVjZXNzYXJ5LiAgUmVhZGxpbmUgYnVpbGRzIHdpdGggYGdjYycgYnkgZGVmYXVsdCBpZiBpdCBpcwotYXZhaWxhYmxlLiAgSWYgeW91IHdhbnQgdG8gdXNlIGBjYycgaW5zdGVhZCwgdHlwZQotCi0gICAgICAgIENDPWNjIC4vY29uZmlndXJlCi0KLWlmIHlvdSBhcmUgdXNpbmcgYSBCb3VybmUtc3R5bGUgc2hlbGwuICBJZiB5b3UgYXJlIG5vdCwgdGhlIGZvbGxvd2luZwotbWF5IHdvcms6Ci0KLSAgICAgICAgZW52IENDPWNjIC4vY29uZmlndXJlCi0KLVJlYWQgdGhlIGZpbGUgSU5TVEFMTCBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cKLXRvIGN1c3RvbWl6ZSBhbmQgY29udHJvbCB0aGUgYnVpbGQgcHJvY2Vzcy4KLQotVGhlIGZpbGUgcmxjb25mLmggY29udGFpbnMgQyBwcmVwcm9jZXNzb3IgZGVmaW5lcyB0aGF0IGVuYWJsZSBhbmQgZGlzYWJsZQotY2VydGFpbiBSZWFkbGluZSBmZWF0dXJlcy4KLQotRXhhbXBsZXMKLT09PT09PT09Ci0KLVRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGUgcHJvZ3JhbXMgdGhhdCB1c2UgUmVhZGxpbmUgZmVhdHVyZXMgaW4gdGhlCi1leGFtcGxlcyBkaXJlY3RvcnkuICBUaGUgYHJsJyBwcm9ncmFtIGlzIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3QuICBJdAotaXMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRvIFJlYWRsaW5lLCBzdWl0YWJsZSBmb3IgdXNlIGluIHNoZWxsCi1zY3JpcHRzIGluIHBsYWNlIG9mIGByZWFkJy4KLQotU2hhcmVkIExpYnJhcmllcwotPT09PT09PT09PT09PT09PQotCi1UaGVyZSBpcyBza2VsZXRhbCBzdXBwb3J0IGZvciBidWlsZGluZyBzaGFyZWQgdmVyc2lvbnMgb2YgdGhlCi1SZWFkbGluZSBhbmQgSGlzdG9yeSBsaWJyYXJpZXMuICBUaGUgY29uZmlndXJlIHNjcmlwdCBjcmVhdGVzCi1hIE1ha2VmaWxlIGluIHRoZSBgc2hsaWInIHN1YmRpcmVjdG9yeSwgYW5kIHR5cGluZyBgbWFrZSBzaGFyZWQnCi13aWxsIGNhdXNlIHNoYXJlZCB2ZXJzaW9ucyBvZiB0aGUgUmVhZGxpbmUgYW5kIEhpc3RvcnkgbGlicmFyaWVzCi10byBiZSBidWlsdCBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zLgotCi1Db25maWd1cmUgY2FsbHMgdGhlIHNjcmlwdCBzdXBwb3J0L3Nob2JqLWNvbmYgdG8gdGVzdCB3aGV0aGVyIG9yCi1ub3Qgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24gaXMgc3VwcG9ydGVkIGFuZCB0byBnZW5lcmF0ZSB0aGUgdmFsdWVzCi1vZiB2YXJpYWJsZXMgdGhhdCBhcmUgc3Vic3RpdHV0ZWQgaW50byBzaGxpYi9NYWtlZmlsZS4gIElmIHlvdQotdHJ5IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgb24gYW4gdW5zdXBwb3J0ZWQgcGxhdGZvcm0sIGBtYWtlJwotd2lsbCBkaXNwbGF5IGEgbWVzc2FnZSBhc2tpbmcgeW91IHRvIHVwZGF0ZSBzdXBwb3J0L3Nob2JqLWNvbmYgZm9yCi15b3VyIHBsYXRmb3JtLgotCi1JZiB5b3UgbmVlZCB0byB1cGRhdGUgc3VwcG9ydC9zaG9iai1jb25mLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZQotYSBgc3RhbnphJyBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtIGFuZCBjb21waWxlci4gIFRoZSBzY3JpcHQgdXNlcwotdGhlIHZhbHVlIG9mIGhvc3Rfb3MgYW5kICR7Q0N9IGFzIGRldGVybWluZWQgYnkgY29uZmlndXJlLiAgRm9yCi1pbnN0YW5jZSwgRnJlZUJTRCAyLjIuNSB3aXRoIGFueSB2ZXJzaW9uIG9mIGdjYyBpcyBpZGVudGlmaWVkIGFzCi1gZnJlZWJzZDIuMi41LWdjYyonLgotCi1JbiB0aGUgc3RhbnphIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0tY29tcGlsZXIgcGFpciwgeW91IHdpbGwgbmVlZCB0bwotZGVmaW5lIHNldmVyYWwgdmFyaWFibGVzLiAgVGhleSBhcmU6Ci0KLVNIT0JKX0NDCVRoZSBDIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSBzb3VyY2UgZmlsZXMgaW50byBzaGFyZWFibGUKLQkJb2JqZWN0IGZpbGVzLiAgVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gdGhlIHZhbHVlIG9mICR7Q0N9Ci0JCWJ5IGNvbmZpZ3VyZSwgYW5kIHNob3VsZCBub3QgbmVlZCB0byBiZSBjaGFuZ2VkLgotCi1TSE9CSl9DRkxBR1MJRmxhZ3MgdG8gcGFzcyB0byB0aGUgQyBjb21waWxlciAoJFNIT0JKX0NDKSB0byBjcmVhdGUKLQkJcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZS4gIElmIHlvdSBhcmUgdXNpbmcgZ2NjLCB0aGlzCi0JCXNob3VsZCBwcm9iYWJseSBiZSBzZXQgdG8gYC1mcGljJy4KLQotU0hPQkpfTEQJVGhlIGxpbmsgZWRpdG9yIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBzaGFyZWQgbGlicmFyeSBmcm9tCi0JCXRoZSBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSAkU0hPQkpfQ0MuICBJZiB5b3UgYXJlIHVzaW5nCi0JCWdjYywgYSB2YWx1ZSBvZiBgZ2NjJyB3aWxsIHByb2JhYmx5IHdvcmsuCi0KLVNIT0JKX0xERkxBR1MJRmxhZ3MgdG8gcGFzcyB0byBTSE9CSl9MRCB0byBlbmFibGUgc2hhcmVkIG9iamVjdCBjcmVhdGlvbi4KLQkJSWYgeW91IGFyZSB1c2luZyBnY2MsIGAtc2hhcmVkJyBtYXkgYmUgYWxsIHRoYXQgaXMgbmVjZXNzYXJ5LgotCQlUaGVzZSBzaG91bGQgYmUgdGhlIGZsYWdzIG5lZWRlZCBmb3IgZ2VuZXJpYyBzaGFyZWQgb2JqZWN0Ci0JCWNyZWF0aW9uLgotCi1TSExJQl9YTERGTEFHUwlBZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3MgdG8gU0hPQkpfTEQgZm9yIHNoYXJlZCBsaWJyYXJ5Ci0JCWNyZWF0aW9uLiAgTWFueSBzeXN0ZW1zIHVzZSB0aGUgLVIgb3B0aW9uIHRvIHRoZSBsaW5rCi0JCWVkaXRvciB0byBlbWJlZCBhIHBhdGggd2l0aGluIHRoZSBsaWJyYXJ5IGZvciBydW4tdGltZQotCQlsaWJyYXJ5IHNlYXJjaGVzLiAgQSByZWFzb25hYmxlIHZhbHVlIGZvciBzdWNoIHN5c3RlbXMgd291bGQKLQkJYmUgYC1SJChsaWJkaXIpJy4KLQotU0hMSUJfTElCUwlBbnkgYWRkaXRpb25hbCBsaWJyYXJpZXMgdGhhdCBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBiZQotCQlsaW5rZWQgYWdhaW5zdCB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuCi0KLVNITElCX0xJQlNVRkYJVGhlIHN1ZmZpeCB0byBhZGQgdG8gYGxpYnJlYWRsaW5lJyBhbmQgYGxpYmhpc3RvcnknIHdoZW4KLQkJZ2VuZXJhdGluZyB0aGUgZmlsZW5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgTWFueSBzeXN0ZW1zCi0JCXVzZSBgc28nOyBIUC1VWCB1c2VzIGBzbCcuCi0KLVNITElCX0xJQlZFUlNJT04gVGhlIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIGZpbGVuYW1lIHRvIGluZGljYXRlIHRoZSB2ZXJzaW9uCi0JCW9mIHRoZSBzaGFyZWQgbGlicmFyeS4gIEl0IHNob3VsZCBiZWdpbiB3aXRoICQoU0hMSUJfTElCU1VGRiksCi0JCWFuZCBwb3NzaWJseSBpbmNsdWRlIHZlcnNpb24gaW5mb3JtYXRpb24gdGhhdCBhbGxvd3MgdGhlCi0JCXJ1bi10aW1lIGxvYWRlciB0byBsb2FkIHRoZSB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeQotCQlhcHByb3ByaWF0ZSBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW0uICBTeXN0ZW1zIHVzaW5nIHNoYXJlZAotCQlsaWJyYXJpZXMgc2ltaWxhciB0byBTdW5PUyA0LnggdXNlIG1ham9yIGFuZCBtaW5vciBsaWJyYXJ5Ci0JCXZlcnNpb24gbnVtYmVyczsgZm9yIHRob3NlIHN5c3RlbXMgYSB2YWx1ZSBvZgotCQlgJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKSQoU0hMSUJfTUlOT1IpJyBpcyBhcHByb3ByaWF0ZS4KLQkJU3lzdGVtcyBiYXNlZCBvbiBTeXN0ZW0gViBSZWxlYXNlIDQgZG9uJ3QgdXNlIG1pbm9yIHZlcnNpb24KLQkJbnVtYmVyczsgdXNlIGAkKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJyBvbiB0aG9zZSBzeXN0ZW1zLgotCQlPdGhlciBVbml4IHZlcnNpb25zIHVzZSBkaWZmZXJlbnQgc2NoZW1lcy4KLQotU0hMSUJfU1RBVFVTCVNldCB0aGlzIHRvIGBzdXBwb3J0ZWQnIHdoZW4geW91IGhhdmUgZGVmaW5lZCB0aGUgb3RoZXIKLQkJbmVjZXNzYXJ5IHZhcmlhYmxlcy4gIE1ha2UgdXNlcyB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyCi0JCW9yIG5vdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgotCi1Zb3Ugc2hvdWxkIGxvb2sgYXQgdGhlIGV4aXN0aW5nIHN0YW56YXMgaW4gc3VwcG9ydC9zaG9iai1jb25mIGZvciBpZGVhcy4KLQotT25jZSB5b3UgaGF2ZSB1cGRhdGVkIHN1cHBvcnQvc2hvYmotY29uZiwgcmUtcnVuIGNvbmZpZ3VyZSBhbmQgdHlwZQotYG1ha2Ugc2hhcmVkJy4gIFRoZSBzaGFyZWQgbGlicmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgc2hsaWIKLXN1YmRpcmVjdG9yeS4KLQotU2luY2Ugc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IGNyZWF0ZWQgb24gYWxsIHBsYXRmb3JtcywgYG1ha2UgaW5zdGFsbCcKLXdpbGwgbm90IGF1dG9tYXRpY2FsbHkgaW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcy4gIFRvIGluc3RhbGwgdGhlbSwKLWNoYW5nZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gc2hsaWIgYW5kIHR5cGUgYG1ha2UgaW5zdGFsbCcuICBSdW5uaW5nCi1gbWFrZSBpbnN0YWxsLXNoYXJlZCcgZnJvbSB0aGUgdG9wLWxldmVsIGJ1aWxkIGRpcmVjdG9yeSB3aWxsIGFsc28gd29yay4KLQotRG9jdW1lbnRhdGlvbgotPT09PT09PT09PT09PQotCi1UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFJlYWRsaW5lIGFuZCBIaXN0b3J5IGxpYnJhcmllcyBhcHBlYXJzIGluIHRoZQotYGRvYycgc3ViZGlyZWN0b3J5LiAgVGhlcmUgYXJlIHR3byB0ZXhpbmZvIGZpbGVzIGFuZCBhIFVuaXgtc3R5bGUgbWFudWFsCi1wYWdlIGRlc2NyaWJpbmcgdGhlIHByb2dyYW1taW5nIGZhY2lsaXRpZXMgYXZhaWxhYmxlIGluIHRoZSBSZWFkbGluZQotbGlicmFyeS4gIFRoZSB0ZXhpbmZvIGZpbGVzIGluY2x1ZGUgYm90aCB1c2VyIGFuZCBwcm9ncmFtbWVyJ3MgbWFudWFscy4KLQotUmVwb3J0aW5nIEJ1Z3MKLT09PT09PT09PT09PT09Ci0KLUJ1ZyByZXBvcnRzIGZvciBSZWFkbGluZSBzaG91bGQgYmUgc2VudCB0bzoKLQotICAgICAgICBidWctcmVhZGxpbmVAZ251Lm9yZwotCi1XaGVuIHJlcG9ydGluZyBhIGJ1ZywgcGxlYXNlIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLQotICAgICAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgcmVsZWFzZSBzdGF0dXMgb2YgUmVhZGxpbmUgKGUuZy4sIDQuMC1yZWxlYXNlKQotICAgICAgICAqIHRoZSBtYWNoaW5lIGFuZCBPUyB0aGF0IGl0IGlzIHJ1bm5pbmcgb24KLSAgICAgICAgKiBhIGxpc3Qgb2YgdGhlIGNvbXBpbGF0aW9uIGZsYWdzIG9yIHRoZSBjb250ZW50cyBvZiBgY29uZmlnLmgnLCBpZgotICAgICAgICAgIGFwcHJvcHJpYXRlCi0gICAgICAgICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnCi0gICAgICAgICogYSByZWNpcGUgZm9yIHJlY3JlYXRpbmcgdGhlIGJ1ZyByZWxpYWJseQotICAgICAgICAqIGEgZml4IGZvciB0aGUgYnVnIGlmIHlvdSBoYXZlIG9uZSEKLQotSWYgeW91IHdvdWxkIGxpa2UgdG8gY29udGFjdCB0aGUgUmVhZGxpbmUgbWFpbnRhaW5lciBkaXJlY3RseSwgc2VuZCBtYWlsCi10byBiYXNoLW1haW50YWluZXJzQGdudS5vcmcuCi0KLVNpbmNlIFJlYWRsaW5lIGlzIGRldmVsb3BlZCBhbG9uZyB3aXRoIGJhc2gsIHRoZSBidWctYmFzaEBnbnUub3JnIG1haWxpbmcKLWxpc3QgKG1pcnJvcmVkIHRvIHRoZSBVc2VuZXQgbmV3c2dyb3VwIGdudS5iYXNoLmJ1Zykgb2Z0ZW4gY29udGFpbnMKLVJlYWRsaW5lIGJ1ZyByZXBvcnRzIGFuZCBmaXhlcy4gCi0KLUNoZXQgUmFtZXkKLWNoZXRAcG8uY3dydS5lZHUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2FjY29uZmlnLmggYi9yZWFkbGluZS9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdjZjljLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBhY2NvbmZpZy5oCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0KLSAgIERlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDIHByZXByb2Nlc3NvciBtYWNyb3MgdGhhdAotICAgdGhlIGRpc3RyaWJ1dGVkIEF1dG9jb25mIG1hY3JvcyBjYW4gZGVmaW5lLgotICAgTm8gc29mdHdhcmUgcGFja2FnZSB3aWxsIHVzZSBhbGwgb2YgdGhlbTsgYXV0b2hlYWRlciBjb3BpZXMgdGhlIG9uZXMKLSAgIHlvdXIgY29uZmlndXJlLmluIHVzZXMgaW50byB5b3VyIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZpbGUgdGVtcGxhdGVzLgotCi0gICBUaGUgZW50cmllcyBhcmUgaW4gc29ydCAtZGYgb3JkZXI6IGFscGhhYmV0aWNhbCwgY2FzZSBpbnNlbnNpdGl2ZSwKLSAgIGlnbm9yaW5nIHB1bmN0dWF0aW9uIChzdWNoIGFzIHVuZGVyc2NvcmVzKS4gIEFsdGhvdWdoIHRoaXMgb3JkZXIKLSAgIGNhbiBzcGxpdCB1cCByZWxhdGVkIGVudHJpZXMsIGl0IG1ha2VzIGl0IGVhc2llciB0byBjaGVjayB3aGV0aGVyCi0gICBhIGdpdmVuIGVudHJ5IGlzIGluIHRoZSBmaWxlLgotCi0gICBMZWF2ZSB0aGUgZm9sbG93aW5nIGJsYW5rIGxpbmUgdGhlcmUhISAgQXV0b2hlYWRlciBuZWVkcyBpdC4gICovCi0MCi0KLS8qIERlZmluaXRpb25zIHB1bGxlZCBpbiBmcm9tIGFjbG9jYWwubTQuICovCi0jdW5kZWYgVk9JRF9TSUdIQU5ETEVSCi0KLSN1bmRlZiBHV0lOU1pfSU5fU1lTX0lPQ1RMCi0KLSN1bmRlZiBUSU9DU1RBVF9JTl9TWVNfSU9DVEwKLQotI3VuZGVmIEhBVkVfR0VUUFdfREVDTFMKLQotI3VuZGVmIEZJT05SRUFEX0lOX1NZU19JT0NUTAotCi0jdW5kZWYgSEFWRV9CU0RfU0lHTkFMUwotCi0jdW5kZWYgSEFWRV9MU1RBVAotCi0jdW5kZWYgSEFWRV9QT1NJWF9TSUdOQUxTCi0KLSN1bmRlZiBIQVZFX1BPU0lYX1NJR1NFVEpNUAotCi0jdW5kZWYgSEFWRV9VU0dfU0lHSE9MRAotCi0jdW5kZWYgTVVTVF9SRUlOU1RBTExfU0lHSEFORExFUlMKLQotI3VuZGVmIFNQRUVEX1RfSU5fU1lTX1RZUEVTCi0KLSN1bmRlZiBTVFJDT0xMX0JST0tFTgotCi0jdW5kZWYgU1RSVUNUX0RJUkVOVF9IQVNfRF9GSUxFTk8KLQotI3VuZGVmIFNUUlVDVF9ESVJFTlRfSEFTX0RfSU5PCi0KLSN1bmRlZiBTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwKLQotI3VuZGVmIFNUUlVDVF9XSU5TSVpFX0lOX1RFUk1JT1MKLQotDAotLyogTGVhdmUgdGhhdCBibGFuayBsaW5lIHRoZXJlISEgIEF1dG9oZWFkZXIgbmVlZHMgaXQuCi0gICBJZiB5b3UncmUgYWRkaW5nIHRvIHRoaXMgZmlsZSwga2VlcCBpbiBtaW5kOgotICAgVGhlIGVudHJpZXMgYXJlIGluIHNvcnQgLWRmIG9yZGVyOiBhbHBoYWJldGljYWwsIGNhc2UgaW5zZW5zaXRpdmUsCi0gICBpZ25vcmluZyBwdW5jdHVhdGlvbiAoc3VjaCBhcyB1bmRlcnNjb3JlcykuICAqLwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvYWNsb2NhbC5tNCBiL3JlYWRsaW5lL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzdhMGMuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDEgKzAsMCBAQAotZG5sCi1kbmwgQmFzaCBzcGVjaWZpYyB0ZXN0cwotZG5sCi1kbmwgU29tZSBkZXJpdmVkIGZyb20gUERLU0ggNS4xLjMgYXV0b2NvbmYgdGVzdHMKLWRubAotZG5sCi1kbmwgQ2hlY2sgaWYgZHVwMigpIGRvZXMgbm90IGNsZWFyIHRoZSBjbG9zZSBvbiBleGVjIGZsYWcKLWRubAotQUNfREVGVU4oQkFTSF9EVVAyX0NMT0VYRUNfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKGlmIGR1cDIgZmFpbHMgdG8gY2xlYXIgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZykKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X2R1cDJfYnJva2VuLAotW0FDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci1tYWluKCkKLXsKLSAgaW50IGZkMSwgZmQyLCBmbDsKLSAgZmQxID0gb3BlbigiL2Rldi9udWxsIiwgMik7Ci0gIGlmIChmY250bChmZDEsIDIsIDEpIDwgMCkKLSAgICBleGl0KDEpOwotICBmZDIgPSBkdXAyKGZkMSwgMSk7Ci0gIGlmIChmZDIgPCAwKQotICAgIGV4aXQoMik7Ci0gIGZsID0gZmNudGwoZmQyLCAxLCAwKTsKLSAgLyogZmwgd2lsbCBiZSAxIGlmIGR1cDIgZGlkIG5vdCByZXNldCB0aGUgY2xvc2Utb24tZXhlYyBmbGFnLiAqLwotICBleGl0KGZsICE9IDEpOwotfQotXSwgYmFzaF9jdl9kdXAyX2Jyb2tlbj15ZXMsIGJhc2hfY3ZfZHVwMl9icm9rZW49bm8sCi0gICAgW0FDX01TR19XQVJOKGNhbm5vdCBjaGVjayBkdXAyIGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vKQotICAgICBiYXNoX2N2X2R1cDJfYnJva2VuPW5vXSkKLV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2R1cDJfYnJva2VuKQotaWYgdGVzdCAkYmFzaF9jdl9kdXAyX2Jyb2tlbiA9IHllczsgdGhlbgotQUNfREVGSU5FKERVUDJfQlJPS0VOKQotZmkKLV0pCi0KLWRubCBDaGVjayB0eXBlIG9mIHNpZ25hbCByb3V0aW5lcyAocG9zaXgsIDQuMmJzZCwgNC4xYnNkIG9yIHY3KQotQUNfREVGVU4oQkFTSF9TSUdOQUxfQ0hFQ0ssCi1bQUNfUkVRVUlSRShbQUNfVFlQRV9TSUdOQUxdKQotQUNfTVNHX0NIRUNLSU5HKGZvciB0eXBlIG9mIHNpZ25hbCBmdW5jdGlvbnMpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9zaWduYWxfdmludGFnZSwKLVsKLSAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzaWduYWwuaD5dLFsKLSAgICBzaWdzZXRfdCBzczsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICAgIHNpZ2VtcHR5c2V0KCZzcyk7IHNpZ3N1c3BlbmQoJnNzKTsKLSAgICBzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIChzdHJ1Y3Qgc2lnYWN0aW9uICopIDApOwotICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzLCAoc2lnc2V0X3QgKikgMCk7Ci0gIF0sIGJhc2hfY3Zfc2lnbmFsX3ZpbnRhZ2U9cG9zaXgsCi0gIFsKLSAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHNpZ25hbC5oPl0sIFsKLQlpbnQgbWFzayA9IHNpZ21hc2soU0lHSU5UKTsKLQlzaWdzZXRtYXNrKG1hc2spOyBzaWdibG9jayhtYXNrKTsgc2lncGF1c2UobWFzayk7Ci0gICAgXSwgYmFzaF9jdl9zaWduYWxfdmludGFnZT00LjJic2QsCi0gICAgWwotICAgICAgQUNfVFJZX0xJTksoWwotCSNpbmNsdWRlIDxzaWduYWwuaD4KLQlSRVRTSUdUWVBFIGZvbygpIHsgfV0sIFsKLQkJaW50IG1hc2sgPSBzaWdtYXNrKFNJR0lOVCk7Ci0JCXNpZ3NldChTSUdJTlQsIGZvbyk7IHNpZ3JlbHNlKFNJR0lOVCk7Ci0JCXNpZ2hvbGQoU0lHSU5UKTsgc2lncGF1c2UoU0lHSU5UKTsKLSAgICAgICAgXSwgYmFzaF9jdl9zaWduYWxfdmludGFnZT1zdnIzLCBiYXNoX2N2X3NpZ25hbF92aW50YWdlPXY3Ci0gICAgKV0KLSAgKV0KLSkKLV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X3NpZ25hbF92aW50YWdlKQotaWYgdGVzdCAiJGJhc2hfY3Zfc2lnbmFsX3ZpbnRhZ2UiID0gcG9zaXg7IHRoZW4KLUFDX0RFRklORShIQVZFX1BPU0lYX1NJR05BTFMpCi1lbGlmIHRlc3QgIiRiYXNoX2N2X3NpZ25hbF92aW50YWdlIiA9ICI0LjJic2QiOyB0aGVuCi1BQ19ERUZJTkUoSEFWRV9CU0RfU0lHTkFMUykKLWVsaWYgdGVzdCAiJGJhc2hfY3Zfc2lnbmFsX3ZpbnRhZ2UiID0gc3ZyMzsgdGhlbgotQUNfREVGSU5FKEhBVkVfVVNHX1NJR0hPTEQpCi1maQotXSkKLQotZG5sIENoZWNrIGlmIHRoZSBwZ3JwIG9mIHNldHBncnAoKSBjYW4ndCBiZSB0aGUgcGlkIG9mIGEgem9tYmllIHByb2Nlc3MuCi1BQ19ERUZVTihCQVNIX1BHUlBfU1lOQywKLVtBQ19SRVFVSVJFKFtBQ19GVU5DX0dFVFBHUlBdKQotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgcGdycHMgbmVlZCBzeW5jaHJvbml6YXRpb24pCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9wZ3JwX3BpcGUsCi1bQUNfVFJZX1JVTihbCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLW1haW4oKQotewotIyBpZmRlZiBHRVRQR1JQX1ZPSUQKLSMgIGRlZmluZSBnZXRwZ0lEKCkJZ2V0cGdycCgpCi0jIGVsc2UKLSMgIGRlZmluZSBnZXRwZ0lEKCkJZ2V0cGdycCgwKQotIyAgZGVmaW5lIHNldHBnaWQoeCx5KQlzZXRwZ3JwKHgseSkKLSMgZW5kaWYKLQlpbnQgcGlkMSwgcGlkMiwgZmRzWzJdOwotCWludCBzdGF0dXM7Ci0JY2hhciBvazsKLQotCXN3aXRjaCAocGlkMSA9IGZvcmsoKSkgewotCSAgY2FzZSAtMToKLQkgICAgZXhpdCgxKTsKLQkgIGNhc2UgMDoKLQkgICAgc2V0cGdpZCgwLCBnZXRwaWQoKSk7Ci0JICAgIGV4aXQoMCk7Ci0JfQotCXNldHBnaWQocGlkMSwgcGlkMSk7Ci0KLQlzbGVlcCgyKTsJLyogbGV0IGZpcnN0IGNoaWxkIGRpZSAqLwotCi0JaWYgKHBpcGUoZmRzKSA8IDApCi0JICBleGl0KDIpOwotCi0Jc3dpdGNoIChwaWQyID0gZm9yaygpKSB7Ci0JICBjYXNlIC0xOgotCSAgICBleGl0KDMpOwotCSAgY2FzZSAwOgotCSAgICBzZXRwZ2lkKDAsIHBpZDEpOwotCSAgICBvayA9IGdldHBnSUQoKSA9PSBwaWQxOwotCSAgICB3cml0ZShmZHNbMV0sICZvaywgMSk7Ci0JICAgIGV4aXQoMCk7Ci0JfQotCXNldHBnaWQocGlkMiwgcGlkMSk7Ci0KLQljbG9zZShmZHNbMV0pOwotCWlmIChyZWFkKGZkc1swXSwgJm9rLCAxKSAhPSAxKQotCSAgZXhpdCg0KTsKLQl3YWl0KCZzdGF0dXMpOwotCXdhaXQoJnN0YXR1cyk7Ci0JZXhpdChvayA/IDAgOiA1KTsKLX0KLV0sIGJhc2hfY3ZfcGdycF9waXBlPW5vLGJhc2hfY3ZfcGdycF9waXBlPXllcywKLSAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgcGdycCBzeW5jaHJvbml6YXRpb24gaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8gbm8pCi0gICAgYmFzaF9jdl9wZ3JwX3BpcGU9bm9dKQotXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfcGdycF9waXBlKQotaWYgdGVzdCAkYmFzaF9jdl9wZ3JwX3BpcGUgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShQR1JQX1BJUEUpCi1maQotXSkKLQotZG5sCi1kbmwgY2hlY2sgZm9yIHR5cGVkZWYnZCBzeW1ib2xzIGluIGhlYWRlciBmaWxlcywgYnV0IGFsbG93IHRoZSBjYWxsZXIgdG8KLWRubCBzcGVjaWZ5IHRoZSBpbmNsdWRlIGZpbGVzIHRvIGJlIGNoZWNrZWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQKLWRubCAKLWRubCBCQVNIX0NIRUNLX1RZUEUoVFlQRSwgSEVBREVSUywgREVGQVVMVFssIFZBTFVFLUlGLUZPVU5EXSkKLUFDX0RFRlVOKEJBU0hfQ0hFQ0tfVFlQRSwKLVtBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yICQxKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfdHlwZV8kMSwKLVtBQ19FR1JFUF9DUFAoJDEsIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSQyCi1dLCBiYXNoX2N2X3R5cGVfJDE9eWVzLCBiYXNoX2N2X3R5cGVfJDE9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfdHlwZV8kMSkKLWlmZWxzZSgkIywgNCwgW2lmIHRlc3QgJGJhc2hfY3ZfdHlwZV8kMSA9IHllczsgdGhlbgotCUFDX0RFRklORSgkNCkKLQlmaV0pCi1pZiB0ZXN0ICRiYXNoX2N2X3R5cGVfJDEgPSBubzsgdGhlbgotICBBQ19ERUZJTkUoJDEsICQzKQotZmkKLV0pCi0KLWRubAotZG5sIFR5cGUgb2Ygc3RydWN0IHJsaW1pdCBmaWVsZHM6IHNvbWUgc3lzdGVtcyAoT1NGLzEsIE5ldEJTRCwgUklTQy9vcyA1LjApCi1kbmwgaGF2ZSBhIHJsaW1fdCwgb3RoZXJzICg0LjRCU0QgYmFzZWQgc3lzdGVtcykgdXNlIHF1YWRfdCwgb3RoZXJzIHVzZQotZG5sIGxvbmcgYW5kIHN0aWxsIG90aGVycyB1c2UgaW50IChIUC1VWCA5LjAxLCBTdW5PUyA0LjEuMykuICBUbyBzaW1wbGlmeQotZG5sIG1hdHRlcnMsIHRoaXMganVzdCBjaGVja3MgZm9yIHJsaW1fdCwgcXVhZF90LCBvciBsb25nLgotZG5sCi1BQ19ERUZVTihCQVNIX1JMSU1JVF9UWVBFLAotW0FDX01TR19DSEVDS0lORyhmb3Igc2l6ZSBhbmQgdHlwZSBvZiBzdHJ1Y3QgcmxpbWl0IGZpZWxkcykKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X3R5cGVfcmxpbWl0LAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+XSwKLVtybGltX3QgeHh4O10sIGJhc2hfY3ZfdHlwZV9ybGltaXQ9cmxpbV90LFsKLUFDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci1tYWluKCkKLXsKLSNpZmRlZiBIQVZFX1FVQURfVAotICBzdHJ1Y3QgcmxpbWl0IHJsOwotICBpZiAoc2l6ZW9mKHJsLnJsaW1fY3VyKSA9PSBzaXplb2YocXVhZF90KSkKLSAgICBleGl0KDApOwotI2VuZGlmCi0gIGV4aXQoMSk7Ci19XSwgYmFzaF9jdl90eXBlX3JsaW1pdD1xdWFkX3QsIGJhc2hfY3ZfdHlwZV9ybGltaXQ9bG9uZywKLSAgICAgICAgW0FDX01TR19XQVJOKGNhbm5vdCBjaGVjayBxdWFkX3QgaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8gbG9uZykKLSAgICAgICAgIGJhc2hfY3ZfdHlwZV9ybGltaXQ9bG9uZ10pXSkKLV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X3R5cGVfcmxpbWl0KQotaWYgdGVzdCAkYmFzaF9jdl90eXBlX3JsaW1pdCA9IHF1YWRfdDsgdGhlbgotQUNfREVGSU5FKFJMSU1UWVBFLCBxdWFkX3QpCi1lbGlmIHRlc3QgJGJhc2hfY3ZfdHlwZV9ybGltaXQgPSBybGltX3Q7IHRoZW4KLUFDX0RFRklORShSTElNVFlQRSwgcmxpbV90KQotZmkKLV0pCi0KLWRubAotZG5sIENoZWNrIGZvciBzeXNfc2lnbGlzdFtdIG9yIF9zeXNfc2lnbGlzdFtdCi1kbmwKLUFDX0RFRlVOKEJBU0hfREVDTF9VTkRFUl9TWVNfU0lHTElTVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfc3lzX3NpZ2xpc3QgaW4gc2lnbmFsLmggb3IgdW5pc3RkLmhdKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfZGVjbF91bmRlcl9zeXNfc2lnbGlzdCwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmXSwgWyBjaGFyICptc2cgPSBfc3lzX3NpZ2xpc3RbMl07IF0sCi0gIGJhc2hfY3ZfZGVjbF91bmRlcl9zeXNfc2lnbGlzdD15ZXMsIGJhc2hfY3ZfZGVjbF91bmRlcl9zeXNfc2lnbGlzdD1ubywKLSAgW0FDX01TR19XQVJOKGNhbm5vdCBjaGVjayBmb3IgX3N5c19zaWdsaXN0W10gaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8gbm8pXSldKWRubAotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0KQotaWYgdGVzdCAkYmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0ID0geWVzOyB0aGVuCi1BQ19ERUZJTkUoVU5ERVJfU1lTX1NJR0xJU1RfREVDTEFSRUQpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9VTkRFUl9TWVNfU0lHTElTVCwKLVtBQ19SRVFVSVJFKFtCQVNIX0RFQ0xfVU5ERVJfU1lTX1NJR0xJU1RdKQotQUNfTVNHX0NIRUNLSU5HKFtmb3IgX3N5c19zaWdsaXN0IGluIHN5c3RlbSBDIGxpYnJhcnldKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfdW5kZXJfc3lzX3NpZ2xpc3QsCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZuZGVmIFVOREVSX1NZU19TSUdMSVNUX0RFQ0xBUkVECi1leHRlcm4gY2hhciAqX3N5c19zaWdsaXN0W107Ci0jZW5kaWYKLW1haW4oKQotewotY2hhciAqbXNnID0gKGNoYXIgKilfc3lzX3NpZ2xpc3RbMl07Ci1leGl0KG1zZyA9PSAwKTsKLX1dLAotCWJhc2hfY3ZfdW5kZXJfc3lzX3NpZ2xpc3Q9eWVzLCBiYXNoX2N2X3VuZGVyX3N5c19zaWdsaXN0PW5vLAotCVtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgZm9yIF9zeXNfc2lnbGlzdFtdIGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vKQotCSBiYXNoX2N2X3VuZGVyX3N5c19zaWdsaXN0PW5vXSldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl91bmRlcl9zeXNfc2lnbGlzdCkKLWlmIHRlc3QgJGJhc2hfY3ZfdW5kZXJfc3lzX3NpZ2xpc3QgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShIQVZFX1VOREVSX1NZU19TSUdMSVNUKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfU1lTX1NJR0xJU1QsCi1bQUNfUkVRVUlSRShbQUNfREVDTF9TWVNfU0lHTElTVF0pCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzeXNfc2lnbGlzdCBpbiBzeXN0ZW0gQyBsaWJyYXJ5XSkKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X3N5c19zaWdsaXN0LAotW0FDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmbmRlZiBTWVNfU0lHTElTVF9ERUNMQVJFRAotZXh0ZXJuIGNoYXIgKnN5c19zaWdsaXN0W107Ci0jZW5kaWYKLW1haW4oKQotewotY2hhciAqbXNnID0gc3lzX3NpZ2xpc3RbMl07Ci1leGl0KG1zZyA9PSAwKTsKLX1dLAotCWJhc2hfY3Zfc3lzX3NpZ2xpc3Q9eWVzLCBiYXNoX2N2X3N5c19zaWdsaXN0PW5vLAotCVtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgZm9yIHN5c19zaWdsaXN0IGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vKQotCSBiYXNoX2N2X3N5c19zaWdsaXN0PW5vXSldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl9zeXNfc2lnbGlzdCkKLWlmIHRlc3QgJGJhc2hfY3Zfc3lzX3NpZ2xpc3QgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShIQVZFX1NZU19TSUdMSVNUKQotZmkKLV0pCi0KLWRubCBDaGVjayBmb3Igc3lzX2Vycmxpc3RbXSBhbmQgc3lzX25lcnIsIGNoZWNrIGZvciBkZWNsYXJhdGlvbgotQUNfREVGVU4oQkFTSF9TWVNfRVJSTElTVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzeXNfZXJybGlzdCBhbmQgc3lzX25lcnJdKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3Zfc3lzX2Vycmxpc3QsCi1bQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxlcnJuby5oPl0sCi1bZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107Ci0gZXh0ZXJuIGludCBzeXNfbmVycjsKLSBjaGFyICptc2cgPSBzeXNfZXJybGlzdFtzeXNfbmVyciAtIDFdO10sCi0gICAgYmFzaF9jdl9zeXNfZXJybGlzdD15ZXMsIGJhc2hfY3Zfc3lzX2Vycmxpc3Q9bm8pXSlkbmwKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfc3lzX2Vycmxpc3QpCi1pZiB0ZXN0ICRiYXNoX2N2X3N5c19lcnJsaXN0ID0geWVzOyB0aGVuCi1BQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKLWZpCi1dKQotCi1kbmwgQ2hlY2sgdG8gc2VlIGlmIG9wZW5kaXIgd2lsbCBvcGVuIG5vbi1kaXJlY3RvcmllcyAobm90IGEgbmljZSB0aGluZykKLUFDX0RFRlVOKEJBU0hfRlVOQ19PUEVORElSX0NIRUNLLAotW0FDX1JFUVVJUkUoW0FDX0hFQURFUl9ESVJFTlRdKWRubAotQUNfTVNHX0NIRUNLSU5HKGlmIG9wZW5kaXIoKSBvcGVucyBub24tZGlyZWN0b3JpZXMpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3QsCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogSEFWRV9VTklTVERfSCAqLwotI2lmIGRlZmluZWQoSEFWRV9ESVJFTlRfSCkKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBkZWZpbmUgZGlyZW50IGRpcmVjdAotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmIC8qIFNZU05ESVIgKi8KLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYgLyogU1lTRElSICovCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYgLyogSEFWRV9ESVJFTlRfSCAqLwotbWFpbigpCi17Ci1ESVIgKmRpcjsKLWludCBmZDsKLXVubGluaygiL3RtcC9ub3RfYV9kaXJlY3RvcnkiKTsKLWZkID0gb3BlbigiL3RtcC9ub3RfYV9kaXJlY3RvcnkiLCBPX1dST05MWXxPX0NSRUFULCAwNjY2KTsKLXdyaXRlKGZkLCAiXG4iLCAxKTsKLWNsb3NlKGZkKTsKLWRpciA9IG9wZW5kaXIoIi90bXAvbm90X2FfZGlyZWN0b3J5Iik7Ci11bmxpbmsoIi90bXAvbm90X2FfZGlyZWN0b3J5Iik7Ci1leGl0IChkaXIgPT0gMCk7Ci19XSwgYmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3Q9eWVzLGJhc2hfY3Zfb3BlbmRpcl9ub3Rfcm9idXN0PW5vLAotICAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgb3BlbmRpciBpZiBjcm9zcyBjb21waWxpbmcgLS0gZGVmYXVsdGluZyB0byBubykKLSAgICAgYmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3Q9bm9dCi0pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfb3BlbmRpcl9ub3Rfcm9idXN0KQotaWYgdGVzdCAkYmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3QgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShPUEVORElSX05PVF9ST0JVU1QpCi1maQotXSkKLQotZG5sCi1BQ19ERUZVTihCQVNIX1RZUEVfU0lHSEFORExFUiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc2lnbmFsIGhhbmRsZXJzIGFyZSBvZiB0eXBlIHZvaWRdKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3Zfdm9pZF9zaWdoYW5kbGVyLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgc2lnbmFsCi0jdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi12b2lkICgqc2lnbmFsICgpKSAoKTtdLAotW2ludCBpO10sIGJhc2hfY3Zfdm9pZF9zaWdoYW5kbGVyPXllcywgYmFzaF9jdl92b2lkX3NpZ2hhbmRsZXI9bm8pXSlkbmwKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfdm9pZF9zaWdoYW5kbGVyKQotaWYgdGVzdCAkYmFzaF9jdl92b2lkX3NpZ2hhbmRsZXIgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShWT0lEX1NJR0hBTkRMRVIpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9UWVBFX0lOVDMyX1QsCi1bCi1pZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2ludCIgPSA0OyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUoaW50MzJfdCwgaW50KQotZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2xvbmciID0gNDsgdGhlbgotICBBQ19DSEVDS19UWVBFKGludDMyX3QsIGxvbmcpCi1lbHNlCi0gIEFDX0NIRUNLX1RZUEUoaW50MzJfdCwgaW50KQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfVFlQRV9VX0lOVDMyX1QsCi1bCi1pZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2ludCIgPSA0OyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUodV9pbnQzMl90LCB1bnNpZ25lZCBpbnQpCi1lbGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgPSA0OyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUodV9pbnQzMl90LCB1bnNpZ25lZCBsb25nKQotZWxzZQotICBBQ19DSEVDS19UWVBFKHVfaW50MzJfdCwgdW5zaWduZWQgaW50KQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfVFlQRV9QVFJESUZGX1QsCi1bCi1pZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2ludCIgPSAiJGFjX2N2X3NpemVvZl9jaGFyX3AiOyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUocHRyZGlmZl90LCBpbnQpCi1lbGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgPSAiJGFjX2N2X3NpemVvZl9jaGFyX3AiOyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUocHRyZGlmZl90LCBsb25nKQotZWxzZQotICBBQ19DSEVDS19UWVBFKHB0cmRpZmZfdCwgaW50KQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfVFlQRV9CSVRTNjRfVCwKLVsKLWlmIHRlc3QgIiRhY19zdl9zaXplb2ZfY2hhcl9wIiA9IDg7IHRoZW4KLSAgQUNfQ0hFQ0tfVFlQRShiaXRzNjRfdCwgY2hhciAqKQotZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2RvdWJsZSIgPSA4OyB0aGVuCi0gIEFDX0NIRUNLX1RZUEUoYml0czY0X3QsIGRvdWJsZSkKLWVsaWYgdGVzdCAiJGFjX2N2X3NpemVvZl9sb25nIiA9IDg7IHRoZW4KLSAgQUNfQ0hFQ0tfVFlQRShiaXRzNjRfdCwgbG9uZykKLWVsc2UKLSAgQUNfQ0hFQ0tfVFlQRShiaXRzNjRfdCwgZG91YmxlKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfRlVOQ19TVFJTSUdOQUwsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIGV4aXN0ZW5jZSBvZiBzdHJzaWduYWxdKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfaGF2ZV9zdHJzaWduYWwsCi1bQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD5dLAotW2NoYXIgKnMgPSAoY2hhciAqKXN0cnNpZ25hbCgyKTtdLAotIGJhc2hfY3ZfaGF2ZV9zdHJzaWduYWw9eWVzLCBiYXNoX2N2X2hhdmVfc3Ryc2lnbmFsPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2hhdmVfc3Ryc2lnbmFsKQotaWYgdGVzdCAkYmFzaF9jdl9oYXZlX3N0cnNpZ25hbCA9IHllczsgdGhlbgotQUNfREVGSU5FKEhBVkVfU1RSU0lHTkFMKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfRlVOQ19MU1RBVCwKLVtkbmwgQ2Fubm90IHVzZSBBQ19DSEVDS19GVU5DUyhsc3RhdCkgYmVjYXVzZSBMaW51eCBkZWZpbmVzIGxzdGF0KCkgYXMgYW4KLWRubCBpbmxpbmUgZnVuY3Rpb24gaW4gPHN5cy9zdGF0Lmg+LgotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsc3RhdF0sIGJhc2hfY3ZfZnVuY19sc3RhdCwKLVtBQ19UUllfTElOSyhbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLV0sWyBsc3RhdCgiLiIsKHN0cnVjdCBzdGF0ICopMCk7IF0sCi1iYXNoX2N2X2Z1bmNfbHN0YXQ9eWVzLCBiYXNoX2N2X2Z1bmNfbHN0YXQ9bm8pXSkKLWlmIHRlc3QgJGJhc2hfY3ZfZnVuY19sc3RhdCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9MU1RBVCkKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX1NUUlVDVF9URVJNSU9TX0xESVNDLAotW0FDX01TR19DSEVDS0lORyhbZm9yIGEgY19saW5lIG1lbWJlciBvZiBzdHJ1Y3QgdGVybWlvc10pCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl90ZXJtaW9zX2xkaXNjLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPl0sW3N0cnVjdCB0ZXJtaW9zIHQ7IGludCBpOyBpID0gdC5jX2xpbmU7XSwKLSAgYmFzaF9jdl90ZXJtaW9zX2xkaXNjPXllcywgYmFzaF9jdl90ZXJtaW9zX2xkaXNjPW5vKV0pZG5sCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X3Rlcm1pb3NfbGRpc2MpCi1pZiB0ZXN0ICRiYXNoX2N2X3Rlcm1pb3NfbGRpc2MgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShURVJNSU9TX0xESVNDKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfU1RSVUNUX1RFUk1JT19MRElTQywKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIGNfbGluZSBtZW1iZXIgb2Ygc3RydWN0IHRlcm1pb10pCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl90ZXJtaW9fbGRpc2MsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0ZXJtaW8uaD5dLFtzdHJ1Y3QgdGVybWlvIHQ7IGludCBpOyBpID0gdC5jX2xpbmU7XSwKLSAgYmFzaF9jdl90ZXJtaW9fbGRpc2M9eWVzLCBiYXNoX2N2X3Rlcm1pb19sZGlzYz1ubyldKWRubAotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl90ZXJtaW9fbGRpc2MpCi1pZiB0ZXN0ICRiYXNoX2N2X3Rlcm1pb19sZGlzYyA9IHllczsgdGhlbgotQUNfREVGSU5FKFRFUk1JT19MRElTQykKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0ZVTkNfR0VURU5WLAotW0FDX01TR19DSEVDS0lORyh0byBzZWUgaWYgZ2V0ZW52IGNhbiBiZSByZWRlZmluZWQpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9nZXRlbnZfcmVkZWYsCi1bQUNfVFJZX1JVTihbCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZm5kZWYgX19TVERDX18KLSMgIGlmbmRlZiBjb25zdAotIyAgICBkZWZpbmUgY29uc3QKLSMgIGVuZGlmCi0jZW5kaWYKLWNoYXIgKgotZ2V0ZW52IChuYW1lKQotI2lmIGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19ic2RpX18pIHx8IGRlZmluZWQgKGNvbnZleCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSNlbHNlCi0gICAgIGNoYXIgY29uc3QgKm5hbWU7Ci0jZW5kaWYgLyogIV9fbGludXhfXyAmJiAhX19ic2RpX18gJiYgIWNvbnZleCAqLwotewotcmV0dXJuICI0MiI7Ci19Ci1tYWluKCkKLXsKLWNoYXIgKnM7Ci0vKiBUaGUgbmV4dCBhbGxvd3MgdGhpcyBwcm9ncmFtIHRvIHJ1biwgYnV0IGRvZXMgbm90IGFsbG93IGJhc2ggdG8gbGluawotICAgd2hlbiBpdCByZWRlZmluZXMgZ2V0ZW52LiAgSSdtIG5vdCByZWFsbHkgaW50ZXJlc3RlZCBpbiBmaWd1cmluZyBvdXQKLSAgIHdoeSBub3QuICovCi0jaWYgZGVmaW5lZCAoTmVYVCkKLWV4aXQoMSk7Ci0jZW5kaWYKLXMgPSBnZXRlbnYoIkFCQ0RFIik7Ci1leGl0KHMgPT0gMCk7CS8qIGZvcmNlIG9wdGltaXplciB0byBsZWF2ZSBnZXRlbnYgaW4gKi8KLX0KLV0sIGJhc2hfY3ZfZ2V0ZW52X3JlZGVmPXllcywgYmFzaF9jdl9nZXRlbnZfcmVkZWY9bm8sCi0gICBbQUNfTVNHX1dBUk4oY2Fubm90IGNoZWNrIGdldGVudiByZWRlZmluaXRpb24gaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8geWVzKQotICAgIGJhc2hfY3ZfZ2V0ZW52X3JlZGVmPXllc10KLSldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl9nZXRlbnZfcmVkZWYpCi1pZiB0ZXN0ICRiYXNoX2N2X2dldGVudl9yZWRlZiA9IHllczsgdGhlbgotQUNfREVGSU5FKENBTl9SRURFRklORV9HRVRFTlYpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9GVU5DX1BSSU5URiwKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRlY2xhcmF0aW9uIG9mIHByaW50ZiBpbiA8c3RkaW8uaD4pCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9wcmludGZfZGVjbGFyZWQsCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBfX1NURENfXwotdHlwZWRlZiBpbnQgKCpfYmFzaGZ1bmMpKGNvbnN0IGNoYXIgKiwgLi4uKTsKLSNlbHNlCi10eXBlZGVmIGludCAoKl9iYXNoZnVuYykoKTsKLSNlbmRpZgotbWFpbigpCi17Ci1fYmFzaGZ1bmMgcGY7Ci1wZiA9IChfYmFzaGZ1bmMpIHByaW50ZjsKLWV4aXQocGYgPT0gMCk7Ci19Ci1dLCBiYXNoX2N2X3ByaW50Zl9kZWNsYXJlZD15ZXMsIGJhc2hfY3ZfcHJpbnRmX2RlY2xhcmVkPW5vLAotICAgW0FDX01TR19XQVJOKGNhbm5vdCBjaGVjayBwcmludGYgZGVjbGFyYXRpb24gaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8geWVzKQotICAgIGJhc2hfY3ZfcHJpbnRmX2RlY2xhcmVkPXllc10KLSldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl9wcmludGZfZGVjbGFyZWQpCi1pZiB0ZXN0ICRiYXNoX2N2X3ByaW50Zl9kZWNsYXJlZCA9IHllczsgdGhlbgotQUNfREVGSU5FKFBSSU5URl9ERUNMQVJFRCkKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0ZVTkNfVUxJTUlUX01BWEZEUywKLVtBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB1bGltaXQgY2FuIHN1YnN0aXR1dGUgZm9yIGdldGR0YWJsZXNpemUpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl91bGltaXRfbWF4ZmRzLAotW0FDX1RSWV9SVU4oWwotbWFpbigpCi17Ci1sb25nIG1heGZkcyA9IHVsaW1pdCg0LCAwTCk7Ci1leGl0IChtYXhmZHMgPT0gLTFMKTsKLX0KLV0sIGJhc2hfY3ZfdWxpbWl0X21heGZkcz15ZXMsIGJhc2hfY3ZfdWxpbWl0X21heGZkcz1ubywKLSAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgdWxpbWl0IGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vKQotICAgIGJhc2hfY3ZfdWxpbWl0X21heGZkcz1ub10KLSldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl91bGltaXRfbWF4ZmRzKQotaWYgdGVzdCAkYmFzaF9jdl91bGltaXRfbWF4ZmRzID0geWVzOyB0aGVuCi1BQ19ERUZJTkUoVUxJTUlUX01BWEZEUykKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0NIRUNLX0xJQl9URVJNQ0FQLAotWwotaWYgdGVzdCAiWCRiYXNoX2N2X3Rlcm1jYXBfbGliIiA9ICJYIjsgdGhlbgotX2Jhc2hfbmVlZG1zZz15ZXMKLWVsc2UKLUFDX01TR19DSEVDS0lORyh3aGljaCBsaWJyYXJ5IGhhcyB0aGUgdGVybWNhcCBmdW5jdGlvbnMpCi1fYmFzaF9uZWVkbXNnPQotZmkKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X3Rlcm1jYXBfbGliLAotW0FDX0NIRUNLX0xJQih0ZXJtY2FwLCB0Z2V0ZW50LCBiYXNoX2N2X3Rlcm1jYXBfbGliPWxpYnRlcm1jYXAsCi0gICAgW0FDX0NIRUNLX0xJQihjdXJzZXMsIHRnZXRlbnQsIGJhc2hfY3ZfdGVybWNhcF9saWI9bGliY3Vyc2VzLAotCVtBQ19DSEVDS19MSUIobmN1cnNlcywgdGdldGVudCwgYmFzaF9jdl90ZXJtY2FwX2xpYj1saWJuY3Vyc2VzLAotCSAgICBiYXNoX2N2X3Rlcm1jYXBfbGliPWdudXRlcm1jYXApXSldKV0pCi1pZiB0ZXN0ICJYJF9iYXNoX25lZWRtc2ciID0gIlh5ZXMiOyB0aGVuCi1BQ19NU0dfQ0hFQ0tJTkcod2hpY2ggbGlicmFyeSBoYXMgdGhlIHRlcm1jYXAgZnVuY3Rpb25zKQotZmkKLUFDX01TR19SRVNVTFQodXNpbmcgJGJhc2hfY3ZfdGVybWNhcF9saWIpCi1pZiB0ZXN0ICRiYXNoX2N2X3Rlcm1jYXBfbGliID0gZ251dGVybWNhcCAmJiB0ZXN0IC16ICIkcHJlZmVyX2N1cnNlcyI7IHRoZW4KLUxERkxBR1M9IiRMREZMQUdTIC1MLi9saWIvdGVybWNhcCIKLVRFUk1DQVBfTElCPSIuL2xpYi90ZXJtY2FwL2xpYnRlcm1jYXAuYSIKLVRFUk1DQVBfREVQPSIuL2xpYi90ZXJtY2FwL2xpYnRlcm1jYXAuYSIKLWVsaWYgdGVzdCAkYmFzaF9jdl90ZXJtY2FwX2xpYiA9IGxpYnRlcm1jYXAgJiYgdGVzdCAteiAiJHByZWZlcl9jdXJzZXMiOyB0aGVuCi1URVJNQ0FQX0xJQj0tbHRlcm1jYXAKLVRFUk1DQVBfREVQPQotZWxpZiB0ZXN0ICRiYXNoX2N2X3Rlcm1jYXBfbGliID0gbGlibmN1cnNlczsgdGhlbgotVEVSTUNBUF9MSUI9LWxuY3Vyc2VzCi1URVJNQ0FQX0RFUD0KLWVsc2UKLVRFUk1DQVBfTElCPS1sY3Vyc2VzCi1URVJNQ0FQX0RFUD0KLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0ZVTkNfR0VUQ1dELAotW0FDX01TR19DSEVDS0lORyhbaWYgZ2V0Y3dkKCkgY2FsbHMgcG9wZW4oKV0pCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9nZXRjd2RfY2FsbHNfcG9wZW4sCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfX1NURENfXwotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotaW50IHBvcGVuX2NhbGxlZDsKLQotRklMRSAqCi1wb3Blbihjb21tYW5kLCB0eXBlKQotICAgICBjb25zdCBjaGFyICpjb21tYW5kOwotICAgICBjb25zdCBjaGFyICp0eXBlOwotewotCXBvcGVuX2NhbGxlZCA9IDE7Ci0JcmV0dXJuIChGSUxFICopTlVMTDsKLX0KLQotRklMRSAqX3BvcGVuKGNvbW1hbmQsIHR5cGUpCi0gICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci17Ci0gIHJldHVybiAocG9wZW4gKGNvbW1hbmQsIHR5cGUpKTsKLX0KLQotaW50Ci1wY2xvc2Uoc3RyZWFtKQotRklMRSAqc3RyZWFtOwotewotCXJldHVybiAwOwotfQotCi1pbnQKLV9wY2xvc2Uoc3RyZWFtKQotRklMRSAqc3RyZWFtOwotewotCXJldHVybiAwOwotfQotCi1tYWluKCkKLXsKLQljaGFyCWxidWZbMzJdOwotCXBvcGVuX2NhbGxlZCA9IDA7Ci0JZ2V0Y3dkKGxidWYsIDMyKTsKLQlleGl0IChwb3Blbl9jYWxsZWQpOwotfQotXSwgYmFzaF9jdl9nZXRjd2RfY2FsbHNfcG9wZW49bm8sIGJhc2hfY3ZfZ2V0Y3dkX2NhbGxzX3BvcGVuPXllcywKLSAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgd2hldGhlciBnZXRjd2QgY2FsbHMgcG9wZW4gaWYgY3Jvc3MgY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8gbm8pCi0gICAgYmFzaF9jdl9nZXRjd2RfY2FsbHNfcG9wZW49bm9dCi0pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfZ2V0Y3dkX2NhbGxzX3BvcGVuKQotaWYgdGVzdCAkYmFzaF9jdl9nZXRjd2RfY2FsbHNfcG9wZW4gPSB5ZXM7IHRoZW4KLUFDX0RFRklORShHRVRDV0RfQlJPS0VOKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfU1RSVUNUX0RJUkVOVF9EX0lOTywKLVtBQ19SRVFVSVJFKFtBQ19IRUFERVJfRElSRU5UXSkKLUFDX01TR19DSEVDS0lORyhpZiBzdHJ1Y3QgZGlyZW50IGhhcyBhIGRfaW5vIG1lbWJlcikKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X2RpcmVudF9oYXNfZGlubywKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLSNpZiBkZWZpbmVkKEhBVkVfRElSRU5UX0gpCi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZiAvKiBTWVNORElSICovCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmIC8qIFNZU0RJUiAqLwotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KLV0sWwotc3RydWN0IGRpcmVudCBkOyBpbnQgejsgeiA9IGQuZF9pbm87Ci1dLCBiYXNoX2N2X2RpcmVudF9oYXNfZGlubz15ZXMsIGJhc2hfY3ZfZGlyZW50X2hhc19kaW5vPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2RpcmVudF9oYXNfZGlubykKLWlmIHRlc3QgJGJhc2hfY3ZfZGlyZW50X2hhc19kaW5vID0geWVzOyB0aGVuCi1BQ19ERUZJTkUoU1RSVUNUX0RJUkVOVF9IQVNfRF9JTk8pCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9TVFJVQ1RfRElSRU5UX0RfRklMRU5PLAotW0FDX1JFUVVJUkUoW0FDX0hFQURFUl9ESVJFTlRdKQotQUNfTVNHX0NIRUNLSU5HKGlmIHN0cnVjdCBkaXJlbnQgaGFzIGEgZF9maWxlbm8gbWVtYmVyKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubywKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLSNpZiBkZWZpbmVkKEhBVkVfRElSRU5UX0gpCi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZiAvKiBTWVNORElSICovCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmIC8qIFNZU0RJUiAqLwotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KLV0sWwotc3RydWN0IGRpcmVudCBkOyBpbnQgejsgeiA9IGQuZF9maWxlbm87Ci1dLCBiYXNoX2N2X2RpcmVudF9oYXNfZF9maWxlbm89eWVzLCBiYXNoX2N2X2RpcmVudF9oYXNfZF9maWxlbm89bm8pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubykKLWlmIHRlc3QgJGJhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubyA9IHllczsgdGhlbgotQUNfREVGSU5FKFNUUlVDVF9ESVJFTlRfSEFTX0RfRklMRU5PKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfUkVJTlNUQUxMX1NJR0hBTkRMRVJTLAotW0FDX1JFUVVJUkUoW0FDX1RZUEVfU0lHTkFMXSkKLUFDX1JFUVVJUkUoW0JBU0hfU0lHTkFMX0NIRUNLXSkKLUFDX01TR19DSEVDS0lORyhbaWYgc2lnbmFsIGhhbmRsZXJzIG11c3QgYmUgcmVpbnN0YWxsZWQgd2hlbiBpbnZva2VkXSkKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzLAotW0FDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi10eXBlZGVmIFJFVFNJR1RZUEUgc2lnZnVuYygpOwotCi1pbnQgbnNpZ2ludDsKLQotI2lmZGVmIEhBVkVfUE9TSVhfU0lHTkFMUwotc2lnZnVuYyAqCi1zZXRfc2lnbmFsX2hhbmRsZXIoc2lnLCBoYW5kbGVyKQotICAgICBpbnQgc2lnOwotICAgICBzaWdmdW5jICpoYW5kbGVyOwotewotICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCwgb2FjdDsKLSAgYWN0LnNhX2hhbmRsZXIgPSBoYW5kbGVyOwotICBhY3Quc2FfZmxhZ3MgPSAwOwotICBzaWdlbXB0eXNldCAoJmFjdC5zYV9tYXNrKTsKLSAgc2lnZW1wdHlzZXQgKCZvYWN0LnNhX21hc2spOwotICBzaWdhY3Rpb24gKHNpZywgJmFjdCwgJm9hY3QpOwotICByZXR1cm4gKG9hY3Quc2FfaGFuZGxlcik7Ci19Ci0jZWxzZQotI2RlZmluZSBzZXRfc2lnbmFsX2hhbmRsZXIocywgaCkgc2lnbmFsKHMsIGgpCi0jZW5kaWYKLQotUkVUU0lHVFlQRQotc2lnaW50KHMpCi1pbnQgczsKLXsKLSAgbnNpZ2ludCsrOwotfQotCi1tYWluKCkKLXsKLQluc2lnaW50ID0gMDsKLQlzZXRfc2lnbmFsX2hhbmRsZXIoU0lHSU5ULCBzaWdpbnQpOwotCWtpbGwoKGludClnZXRwaWQoKSwgU0lHSU5UKTsKLQlraWxsKChpbnQpZ2V0cGlkKCksIFNJR0lOVCk7Ci0JZXhpdChuc2lnaW50ICE9IDIpOwotfQotXSwgYmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz1ubywgYmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz15ZXMsCi0gICBbQUNfTVNHX1dBUk4oY2Fubm90IGNoZWNrIHNpZ25hbCBoYW5kbGluZyBpZiBjcm9zcyBjb21waWxpbmcgLS0gZGVmYXVsdGluZyB0byBubykKLSAgICBiYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzPW5vXQotKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzKQotaWYgdGVzdCAkYmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycyA9IHllczsgdGhlbgotQUNfREVGSU5FKE1VU1RfUkVJTlNUQUxMX1NJR0hBTkRMRVJTKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfRlVOQ19TQlJLX0RFQ0xBUkVELAotW0FDX01TR19DSEVDS0lORyhmb3IgZGVjbGFyYXRpb24gb2Ygc2JyayBpbiA8dW5pc3RkLmg+KQotQUNfQ0FDSEVfVkFMKGJhc2hfY3Zfc2Jya19kZWNsYXJlZCwKLVtBQ19FR1JFUF9IRUFERVIoc2JyaywgdW5pc3RkLmgsCi0gYmFzaF9jdl9zYnJrX2RlY2xhcmVkPXllcywgYmFzaF9jdl9zYnJrX2RlY2xhcmVkPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X3NicmtfZGVjbGFyZWQpCi1pZiB0ZXN0ICRiYXNoX2N2X3NicmtfZGVjbGFyZWQgPSB5ZXM7IHRoZW4KLUFDX0RFRklORShTQlJLX0RFQ0xBUkVEKQotZmkKLV0pCi0KLWRubCBjaGVjayB0aGF0IHNvbWUgbmVjZXNzYXJ5IGpvYiBjb250cm9sIGRlZmluaXRpb25zIGFyZSBwcmVzZW50Ci1BQ19ERUZVTihCQVNIX0pPQl9DT05UUk9MX01JU1NJTkcsCi1bQUNfUkVRVUlSRShbQkFTSF9TSUdOQUxfQ0hFQ0tdKQotQUNfTVNHX0NIRUNLSU5HKGZvciBwcmVzZW5jZSBvZiBuZWNlc3Nhcnkgam9iIGNvbnRyb2wgZGVmaW5pdGlvbnMpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9qb2JfY29udHJvbF9taXNzaW5nLAotW0FDX1RSWV9SVU4oWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogQWRkIG1vcmUgdGVzdHMgaW4gaGVyZSBhcyBhcHByb3ByaWF0ZS4gKi8KLW1haW4oKQotewotLyogc2lnbmFsIHR5cGUgKi8KLSNpZiAhZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZCAoSEFWRV9CU0RfU0lHTkFMUykKLWV4aXQoMSk7Ci0jZW5kaWYKLQotLyogc2lnbmFscyBhbmQgdHR5IGNvbnRyb2wuICovCi0jaWYgIWRlZmluZWQgKFNJR1RTVFApIHx8ICFkZWZpbmVkIChTSUdTVE9QKSB8fCAhZGVmaW5lZCAoU0lHQ09OVCkKLWV4aXQgKDEpOwotI2VuZGlmCi0KLS8qIHByb2Nlc3MgY29udHJvbCAqLwotI2lmICFkZWZpbmVkIChXTk9IQU5HKSB8fCAhZGVmaW5lZCAoV1VOVFJBQ0VEKSAKLWV4aXQoMSk7Ci0jZW5kaWYKLQotLyogUG9zaXggc3lzdGVtcyBoYXZlIHRjZ2V0cGdycCBhbmQgd2FpdHBpZC4gKi8KLSNpZiBkZWZpbmVkIChfUE9TSVhfVkVSU0lPTikgJiYgIWRlZmluZWQgKEhBVkVfVENHRVRQR1JQKQotZXhpdCgxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1BPU0lYX1ZFUlNJT04pICYmICFkZWZpbmVkIChIQVZFX1dBSVRQSUQpCi1leGl0KDEpOwotI2VuZGlmCi0KLS8qIE90aGVyIHN5c3RlbXMgaGF2ZSBUSU9DU1BHUlAvVElPQ0dQUkdQIGFuZCB3YWl0My4gKi8KLSNpZiAhZGVmaW5lZCAoX1BPU0lYX1ZFUlNJT04pICYmICFkZWZpbmVkIChIQVZFX1dBSVQzKQotZXhpdCgxKTsKLSNlbmRpZgotCi1leGl0KDApOwotfV0sIGJhc2hfY3Zfam9iX2NvbnRyb2xfbWlzc2luZz1wcmVzZW50LCBiYXNoX2N2X2pvYl9jb250cm9sX21pc3Npbmc9bWlzc2luZywKLSAgICBbQUNfTVNHX1dBUk4oY2Fubm90IGNoZWNrIGpvYiBjb250cm9sIGlmIGNyb3NzLWNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG1pc3NpbmcpCi0gICAgIGJhc2hfY3Zfam9iX2NvbnRyb2xfbWlzc2luZz1taXNzaW5nXQotKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2pvYl9jb250cm9sX21pc3NpbmcpCi1pZiB0ZXN0ICRiYXNoX2N2X2pvYl9jb250cm9sX21pc3NpbmcgPSBtaXNzaW5nOyB0aGVuCi1BQ19ERUZJTkUoSk9CX0NPTlRST0xfTUlTU0lORykKLWZpCi1dKQotCi1kbmwgY2hlY2sgd2hldGhlciBuYW1lZCBwaXBlcyBhcmUgcHJlc2VudAotZG5sIHRoaXMgcmVxdWlyZXMgYSBwcmV2aW91cyBjaGVjayBmb3IgbWtmaWZvLCBidXQgdGhhdCBpcyBhd2t3YXJkIHRvIHNwZWNpZnkKLUFDX0RFRlVOKEJBU0hfU1lTX05BTUVEX1BJUEVTLAotW0FDX01TR19DSEVDS0lORyhmb3IgcHJlc2VuY2Ugb2YgbmFtZWQgcGlwZXMpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9zeXNfbmFtZWRfcGlwZXMsCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyogQWRkIG1vcmUgdGVzdHMgaW4gaGVyZSBhcyBhcHByb3ByaWF0ZS4gKi8KLW1haW4oKQotewotaW50IGZkOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9NS0ZJRk8pCi1leGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFNfSUZJRk8pICYmIChkZWZpbmVkIChfUE9TSVhfVkVSU0lPTikgJiYgIWRlZmluZWQgKFNfSVNGSUZPKSkKLWV4aXQgKDEpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotZXhpdCAoMSk7Ci0jZW5kaWYKLQotZmQgPSBta25vZCAoIi90bXAvc2gtbnAtYXV0b2NvbmYiLCAwNjY2IHwgU19JRklGTywgMCk7Ci1pZiAoZmQgPT0gLTEpCi0gIGV4aXQgKDEpOwotY2xvc2UoZmQpOwotdW5saW5rICgiL3RtcC9zaC1ucC1hdXRvY29uZiIpOwotZXhpdCgwKTsKLX1dLCBiYXNoX2N2X3N5c19uYW1lZF9waXBlcz1wcmVzZW50LCBiYXNoX2N2X3N5c19uYW1lZF9waXBlcz1taXNzaW5nLAotICAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgZm9yIG5hbWVkIHBpcGVzIGlmIGNyb3NzLWNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG1pc3NpbmcpCi0gICAgIGJhc2hfY3Zfc3lzX25hbWVkX3BpcGVzPW1pc3NpbmddCi0pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfc3lzX25hbWVkX3BpcGVzKQotaWYgdGVzdCAkYmFzaF9jdl9zeXNfbmFtZWRfcGlwZXMgPSBtaXNzaW5nOyB0aGVuCi1BQ19ERUZJTkUoTkFNRURfUElQRVNfTUlTU0lORykKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0ZVTkNfUE9TSVhfU0VUSk1QLAotW0FDX1JFUVVJUkUoW0JBU0hfU0lHTkFMX0NIRUNLXSkKLUFDX01TR19DSEVDS0lORyhmb3IgcHJlc2VuY2Ugb2YgUE9TSVgtc3R5bGUgc2lnc2V0am1wL3NpZ2xvbmdqbXApCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9mdW5jX3NpZ3NldGptcCwKLVtBQ19UUllfUlVOKFsKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotbWFpbigpCi17Ci0jaWYgIWRlZmluZWQgKF9QT1NJWF9WRVJTSU9OKSB8fCAhZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotZXhpdCAoMSk7Ci0jZWxzZQotCi1pbnQgY29kZTsKLXNpZ3NldF90IHNldCwgb3NldDsKLXNpZ2ptcF9idWYgeHg7Ci0KLS8qIGdldCB0aGUgbWFzayAqLwotc2lnZW1wdHlzZXQoJnNldCk7Ci1zaWdlbXB0eXNldCgmb3NldCk7Ci1zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIChzaWdzZXRfdCAqKU5VTEwsICZzZXQpOwotc2lncHJvY21hc2soU0lHX0JMT0NLLCAoc2lnc2V0X3QgKilOVUxMLCAmb3NldCk7Ci0KLS8qIHNhdmUgaXQgKi8KLWNvZGUgPSBzaWdzZXRqbXAoeHgsIDEpOwotaWYgKGNvZGUpCi0gIGV4aXQoMCk7CS8qIGNvdWxkIGdldCBzaWdtYXNrIGFuZCBjb21wYXJlIHRvIG9zZXQgaGVyZS4gKi8KLQotLyogY2hhbmdlIGl0ICovCi1zaWdhZGRzZXQoJnNldCwgU0lHSU5UKTsKLXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgKHNpZ3NldF90ICopTlVMTCk7Ci0KLS8qIGFuZCBzaWdsb25nam1wICovCi1zaWdsb25nam1wKHh4LCAxMCk7Ci1leGl0KDEpOwotI2VuZGlmCi19XSwgYmFzaF9jdl9mdW5jX3NpZ3NldGptcD1wcmVzZW50LCBiYXNoX2N2X2Z1bmNfc2lnc2V0am1wPW1pc3NpbmcsCi0gICAgW0FDX01TR19XQVJOKGNhbm5vdCBjaGVjayBmb3Igc2lnc2V0am1wL3NpZ2xvbmdqbXAgaWYgY3Jvc3MtY29tcGlsaW5nIC0tIGRlZmF1bHRpbmcgdG8gbWlzc2luZykKLSAgICAgYmFzaF9jdl9mdW5jX3NpZ3NldGptcD1taXNzaW5nXQotKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2Z1bmNfc2lnc2V0am1wKQotaWYgdGVzdCAkYmFzaF9jdl9mdW5jX3NpZ3NldGptcCA9IHByZXNlbnQ7IHRoZW4KLUFDX0RFRklORShIQVZFX1BPU0lYX1NJR1NFVEpNUCkKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0hBVkVfVElPQ0dXSU5TWiwKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRJT0NHV0lOU1ogaW4gc3lzL2lvY3RsLmgpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+XSwgW2ludCB4ID0gVElPQ0dXSU5TWjtdLAotICBiYXNoX2N2X3Rpb2Nnd2luc3pfaW5faW9jdGw9eWVzLGJhc2hfY3ZfdGlvY2d3aW5zel9pbl9pb2N0bD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsKQotaWYgdGVzdCAkYmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsID0geWVzOyB0aGVuICAgCi1BQ19ERUZJTkUoR1dJTlNaX0lOX1NZU19JT0NUTCkKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX1NUUlVDVF9XSU5TSVpFLAotW0FDX01TR19DSEVDS0lORyhmb3Igc3RydWN0IHdpbnNpemUgaW4gc3lzL2lvY3RsLmggYW5kIHRlcm1pb3MuaCkKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X3N0cnVjdF93aW5zaXplX2hlYWRlciwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPl0sIFtzdHJ1Y3Qgd2luc2l6ZSB4O10sCi0gIGJhc2hfY3Zfc3RydWN0X3dpbnNpemVfaGVhZGVyPWlvY3RsX2gsCi0gIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD5dLCBbc3RydWN0IHdpbnNpemUgeDtdLAotICBiYXNoX2N2X3N0cnVjdF93aW5zaXplX2hlYWRlcj10ZXJtaW9zX2gsIGJhc2hfY3Zfc3RydWN0X3dpbnNpemVfaGVhZGVyPW90aGVyKQotXSldKQotaWYgdGVzdCAkYmFzaF9jdl9zdHJ1Y3Rfd2luc2l6ZV9oZWFkZXIgPSBpb2N0bF9oOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoc3lzL2lvY3RsLmgpCi0gIEFDX0RFRklORShTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwpCi1lbGlmIHRlc3QgJGJhc2hfY3Zfc3RydWN0X3dpbnNpemVfaGVhZGVyID0gdGVybWlvc19oOyB0aGVuCi0gIEFDX01TR19SRVNVTFQodGVybWlvcy5oKQotICBBQ19ERUZJTkUoU1RSVUNUX1dJTlNJWkVfSU5fVEVSTUlPUykKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChub3QgZm91bmQpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9IQVZFX1RJT0NTVEFULAotW0FDX01TR19DSEVDS0lORyhmb3IgVElPQ1NUQVQgaW4gc3lzL2lvY3RsLmgpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl90aW9jc3RhdF9pbl9pb2N0bCwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPl0sIFtpbnQgeCA9IFRJT0NTVEFUO10sCi0gIGJhc2hfY3ZfdGlvY3N0YXRfaW5faW9jdGw9eWVzLGJhc2hfY3ZfdGlvY3N0YXRfaW5faW9jdGw9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfdGlvY3N0YXRfaW5faW9jdGwpCi1pZiB0ZXN0ICRiYXNoX2N2X3Rpb2NzdGF0X2luX2lvY3RsID0geWVzOyB0aGVuICAgCi1BQ19ERUZJTkUoVElPQ1NUQVRfSU5fU1lTX0lPQ1RMKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfSEFWRV9GSU9OUkVBRCwKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIEZJT05SRUFEIGluIHN5cy9pb2N0bC5oKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfZmlvbnJlYWRfaW5faW9jdGwsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD5dLCBbaW50IHggPSBGSU9OUkVBRDtdLAotICBiYXNoX2N2X2Zpb25yZWFkX2luX2lvY3RsPXllcyxiYXNoX2N2X2Zpb25yZWFkX2luX2lvY3RsPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2Zpb25yZWFkX2luX2lvY3RsKQotaWYgdGVzdCAkYmFzaF9jdl9maW9ucmVhZF9pbl9pb2N0bCA9IHllczsgdGhlbiAgIAotQUNfREVGSU5FKEZJT05SRUFEX0lOX1NZU19JT0NUTCkKLWZpCi1dKQotCi1kbmwKLWRubCBTZWUgaWYgc3BlZWRfdCBpcyBkZWNsYXJlZCBpbiA8c3lzL3R5cGVzLmg+LiAgU29tZSB2ZXJzaW9ucyBvZiBsaW51eAotZG5sIHJlcXVpcmUgYSBkZWZpbml0aW9uIG9mIHNwZWVkX3QgZWFjaCB0aW1lIDx0ZXJtY2FwLmg+IGlzIGluY2x1ZGVkLAotZG5sIGJ1dCB5b3UgY2FuIG9ubHkgZ2V0IHNwZWVkX3QgaWYgeW91IGluY2x1ZGUgPHRlcm1pb3MuaD4gKG9uIHNvbWUKLWRubCB2ZXJzaW9ucykgb3IgPHN5cy90eXBlcy5oPiAob24gb3RoZXJzKS4KLWRubAotQUNfREVGVU4oQkFTSF9NSVNDX1NQRUVEX1QsCi1bQUNfTVNHX0NIRUNLSU5HKGZvciBzcGVlZF90IGluIHN5cy90eXBlcy5oKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXMsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLCBbc3BlZWRfdCB4O10sCi0gIGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXM9eWVzLGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXM9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXMpCi1pZiB0ZXN0ICRiYXNoX2N2X3NwZWVkX3RfaW5fc3lzX3R5cGVzID0geWVzOyB0aGVuICAgCi1BQ19ERUZJTkUoU1BFRURfVF9JTl9TWVNfVFlQRVMpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9DSEVDS19HRVRQV19GVU5DUywKLVtBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBwcm9ncmFtcyBhcmUgYWJsZSB0byByZWRlY2xhcmUgZ2V0cHcgZnVuY3Rpb25zKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3ZfY2FuX3JlZGVjbF9nZXRwdywKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3ZW50KCk7Ci1leHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHd1aWQoKTsKLWV4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbSgpO10sCi1bc3RydWN0IHBhc3N3ZCAqejsgeiA9IGdldHB3ZW50KCk7IHogPSBnZXRwd3VpZCgwKTsgeiA9IGdldHB3bmFtKCJyb290Iik7XSwKLSAgYmFzaF9jdl9jYW5fcmVkZWNsX2dldHB3PXllcyxiYXNoX2N2X2Nhbl9yZWRlY2xfZ2V0cHc9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfY2FuX3JlZGVjbF9nZXRwdykKLWlmIHRlc3QgJGJhc2hfY3ZfY2FuX3JlZGVjbF9nZXRwdyA9IG5vOyB0aGVuCi1BQ19ERUZJTkUoSEFWRV9HRVRQV19ERUNMUykKLWZpCi1dKQotCi1BQ19ERUZVTihCQVNIX0NIRUNLX0RFVl9GRCwKLVtBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciAvZGV2L2ZkIGlzIGF2YWlsYWJsZSkKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X2Rldl9mZCwKLVtpZiB0ZXN0IC1kIC9kZXYvZmQgICYmIHRlc3QgLXIgL2Rldi9mZC8wOyB0aGVuCi0gICBiYXNoX2N2X2Rldl9mZD1zdGFuZGFyZAotIGVsaWYgdGVzdCAtZCAvcHJvYy9zZWxmL2ZkICYmIHRlc3QgLXIgL3Byb2Mvc2VsZi9mZC8wOyB0aGVuCi0gICBiYXNoX2N2X2Rldl9mZD13aGFja3kKLSBlbHNlCi0gICBiYXNoX2N2X2Rldl9mZD1hYnNlbnQKLSBmaQotXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfZGV2X2ZkKQotaWYgdGVzdCAkYmFzaF9jdl9kZXZfZmQgPSAic3RhbmRhcmQiOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX0RFVl9GRCkKLSAgQUNfREVGSU5FKERFVl9GRF9QUkVGSVgsICIvZGV2L2ZkLyIpCi1lbGlmIHRlc3QgJGJhc2hfY3ZfZGV2X2ZkID0gIndoYWNreSI7IHRoZW4KLSAgQUNfREVGSU5FKEhBVkVfREVWX0ZEKQotICBBQ19ERUZJTkUoREVWX0ZEX1BSRUZJWCwgIi9wcm9jL3NlbGYvZmQvIikKLWZpCi1dKQotCi1kbmwKLWRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGdldHBlZXJuYW1lICh0aGUgb25seSBuZXR3b3JraW5nIGZ1bmN0aW9uCi1kbmwgYmFzaCBjdXJyZW50bHkgcmVxdWlyZXMpIGluIGxpYnNvY2tldC4gIElmIGxpYnNvY2tldCBpcyBwcmVzZW50LAotZG5sIGNoZWNrIGZvciBsaWJuc2wgYW5kIGFkZCBpdCB0byBMSUJTIGlmIGl0J3MgdGhlcmUsIHNpbmNlIG1vc3QKLWRubCBzeXN0ZW1zIHdpdGggbGlic29ja2V0IHJlcXVpcmUgbGlua2luZyB3aXRoIGxpYm5zbCBhcyB3ZWxsLgotZG5sIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGdldHBlZXJuYW1lIHdhcyBub3QgZm91bmQgaW4gbGliYy4KLWRubAotQUNfREVGVU4oQkFTSF9DSEVDS19TT0NLTElCLAotWwotaWYgdGVzdCAiWCRiYXNoX2N2X2hhdmVfc29ja2xpYiIgPSAiWCI7IHRoZW4KLV9iYXNoX25lZWRtc2c9Ci1lbHNlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHNvY2tldCBsaWJyYXJ5KQotX2Jhc2hfbmVlZG1zZz15ZXMKLWZpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9oYXZlX3NvY2tsaWIsCi1bQUNfQ0hFQ0tfTElCKHNvY2tldCwgZ2V0cGVlcm5hbWUsCi0gICAgICAgIGJhc2hfY3ZfaGF2ZV9zb2NrbGliPXllcywgYmFzaF9jdl9oYXZlX3NvY2tsaWI9bm8sIC1sbnNsKV0pCi1pZiB0ZXN0ICJYJF9iYXNoX25lZWRtc2ciID0gWHllczsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2hhdmVfc29ja2xpYikKLSAgX2Jhc2hfbmVlZG1zZz0KLWZpCi1pZiB0ZXN0ICRiYXNoX2N2X2hhdmVfc29ja2xpYiA9IHllczsgdGhlbgotICAjIGNoZWNrIGZvciBsaWJuc2wsIGFkZCBpdCB0byBMSUJTIGlmIHByZXNlbnQKLSAgaWYgdGVzdCAiWCRiYXNoX2N2X2hhdmVfbGlibnNsIiA9ICJYIjsgdGhlbgotICAgIF9iYXNoX25lZWRtc2c9Ci0gIGVsc2UKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxpYm5zbCkKLSAgICBfYmFzaF9uZWVkbXNnPXllcwotICBmaQotICBBQ19DQUNIRV9WQUwoYmFzaF9jdl9oYXZlX2xpYm5zbCwKLQkgICBbQUNfQ0hFQ0tfTElCKG5zbCwgdF9vcGVuLAotCQkgYmFzaF9jdl9oYXZlX2xpYm5zbD15ZXMsIGJhc2hfY3ZfaGF2ZV9saWJuc2w9bm8pXSkKLSAgaWYgdGVzdCAiWCRfYmFzaF9uZWVkbXNnIiA9IFh5ZXM7IHRoZW4KLSAgICBBQ19NU0dfUkVTVUxUKCRiYXNoX2N2X2hhdmVfbGlibnNsKQotICAgIF9iYXNoX25lZWRtc2c9Ci0gIGZpCi0gIGlmIHRlc3QgJGJhc2hfY3ZfaGF2ZV9saWJuc2wgPSB5ZXM7IHRoZW4KLSAgICBMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKLSAgZWxzZQotICAgIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotICBmaQotICBBQ19ERUZJTkUoSEFWRV9MSUJTT0NLRVQpCi0gIEFDX0RFRklORShIQVZFX0dFVFBFRVJOQU1FKQotZmkKLV0pCi0KLUFDX0RFRlVOKEJBU0hfREVGQVVMVF9NQUlMX0RJUiwKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRlZmF1bHQgbWFpbCBkaXJlY3RvcnkpCi1BQ19DQUNIRV9WQUwoYmFzaF9jdl9tYWlsX2RpciwKLVtpZiB0ZXN0IC1kIC92YXIvbWFpbDsgdGhlbgotICAgYmFzaF9jdl9tYWlsX2Rpcj0vdmFyL21haWwKLSBlbGlmIHRlc3QgLWQgL3Vzci9tYWlsOyB0aGVuCi0gICBiYXNoX2N2X21haWxfZGlyPS91c3IvbWFpbAotIGVsaWYgdGVzdCAtZCAvdmFyL3Nwb29sL21haWw7IHRoZW4KLSAgIGJhc2hfY3ZfbWFpbF9kaXI9L3Zhci9zcG9vbC9tYWlsCi0gZWxpZiB0ZXN0IC1kIC91c3Ivc3Bvb2wvbWFpbDsgdGhlbgotICAgYmFzaF9jdl9tYWlsX2Rpcj0vdXNyL3Nwb29sL21haWwKLSBlbHNlCi0gICBiYXNoX2N2X21haWxfZGlyPXVua25vd24KLSBmaQotXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfbWFpbF9kaXIpCi1pZiB0ZXN0ICRiYXNoX2N2X21haWxfZGlyID0gIi92YXIvbWFpbCI7IHRoZW4KLSAgIEFDX0RFRklORShERUZBVUxUX01BSUxfRElSRUNUT1JZLCAiL3Zhci9tYWlsIikKLWVsaWYgdGVzdCAkYmFzaF9jdl9tYWlsX2RpciA9ICIvdXNyL21haWwiOyB0aGVuCi0gICBBQ19ERUZJTkUoREVGQVVMVF9NQUlMX0RJUkVDVE9SWSwgIi91c3IvbWFpbCIpCi1lbGlmIHRlc3QgJGJhc2hfY3ZfbWFpbF9kaXIgPSAiL3Zhci9zcG9vbC9tYWlsIjsgdGhlbgotICAgQUNfREVGSU5FKERFRkFVTFRfTUFJTF9ESVJFQ1RPUlksICIvdmFyL3Nwb29sL21haWwiKQotZWxpZiB0ZXN0ICRiYXNoX2N2X21haWxfZGlyID0gIi91c3Ivc3Bvb2wvbWFpbCI7IHRoZW4KLSAgIEFDX0RFRklORShERUZBVUxUX01BSUxfRElSRUNUT1JZLCAiL3Vzci9zcG9vbC9tYWlsIikKLWVsc2UKLSAgIEFDX0RFRklORShERUZBVUxUX01BSUxfRElSRUNUT1JZLCAidW5rbm93biIpCi1maQotXSkKLQotZG5sCi1kbmwgQ2hlY2sgaWYgSFBVWCBuZWVkcyBfS0VSTkVMIGRlZmluZWQgZm9yIFJMSU1JVF8qIGRlZmluaXRpb25zCi1kbmwKLUFDX0RFRlVOKEJBU0hfS0VSTkVMX1JMSU1JVF9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJGhvc3Rfb3MgbmVlZHMgX0tFUk5FTCBmb3IgUkxJTUlUIGRlZmluZXNdKQotQUNfQ0FDSEVfVkFMKGJhc2hfY3Zfa2VybmVsX3JsaW1pdCwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci1dLAotWwotICBpbnQgZjsKLSAgZiA9IFJMSU1JVF9EQVRBOwotXSwgYmFzaF9jdl9rZXJuZWxfcmxpbWl0PW5vLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNkZWZpbmUgX0tFUk5FTAotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI3VuZGVmIF9LRVJORUwKLV0sCi1bCi0JaW50IGY7Ci0gICAgICAgIGYgPSBSTElNSVRfREFUQTsKLV0sIGJhc2hfY3Zfa2VybmVsX3JsaW1pdD15ZXMsIGJhc2hfY3Zfa2VybmVsX3JsaW1pdD1ubyldCi0pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3Zfa2VybmVsX3JsaW1pdCkKLWlmIHRlc3QgJGJhc2hfY3Zfa2VybmVsX3JsaW1pdCA9IHllczsgdGhlbgotQUNfREVGSU5FKFJMSU1JVF9ORUVEU19LRVJORUwpCi1maQotXSkKLQotQUNfREVGVU4oQkFTSF9GVU5DX1NUUkNPTEwsCi1bCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBvciBub3Qgc3RyY29sbCBhbmQgc3RyY21wIGRpZmZlcikKLUFDX0NBQ0hFX1ZBTChiYXNoX2N2X2Z1bmNfc3RyY29sbF9icm9rZW4sCi1bQUNfVFJZX1JVTihbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBkZWZpbmVkIChIQVZFX0xPQ0FMRV9IKQotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLW1haW4oYywgdikKLWludCAgICAgYzsKLWNoYXIgICAgKnZbXTsKLXsKLSAgICAgICAgaW50ICAgICByMSwgcjI7Ci0gICAgICAgIGNoYXIgICAgKmRlZmxvY2FsZSwgKmRlZmNvbGw7Ci0KLSNpZmRlZiBIQVZFX1NFVExPQ0FMRQotICAgICAgICBkZWZsb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCAiIik7Ci0JZGVmY29sbCA9IHNldGxvY2FsZShMQ19DT0xMQVRFLCAiIik7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSQ09MTAotCS8qIFRoZXNlIHR3byB2YWx1ZXMgYXJlIHRha2VuIGZyb20gdGVzdHMvZ2xvYi10ZXN0LiAqLwotICAgICAgICByMSA9IHN0cmNvbGwoImFiZCIsICJhWGQiKTsKLSNlbHNlCi0JcjEgPSAwOwotI2VuZGlmCi0gICAgICAgIHIyID0gc3RyY21wKCJhYmQiLCAiYVhkIik7Ci0KLQkvKiBUaGVzZSB0d28gc2hvdWxkIGJvdGggYmUgZ3JlYXRlciB0aGFuIDAuICBJdCBpcyBwZXJtaXNzaWJsZSBmb3IKLQkgICBhIHN5c3RlbSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcywgYXMgbG9uZyBhcyB0aGUgc2lnbiBpcyB0aGUKLQkgICBzYW1lLiAqLwotCi0gICAgICAgIC8qIEV4aXQgd2l0aCAxIChmYWlsdXJlKSBpZiB0aGVzZSB0d28gdmFsdWVzIGFyZSBib3RoID4gMCwgc2luY2UKLQkgICB0aGlzIHRlc3RzIHdoZXRoZXIgc3RyY29sbCgzKSBpcyBicm9rZW4gd2l0aCByZXNwZWN0IHRvIHN0cmNtcCgzKQotCSAgIGluIHRoZSBkZWZhdWx0IGxvY2FsZS4gKi8KLQlleGl0IChyMSA+IDAgJiYgcjIgPiAwKTsKLX0KLV0sIGJhc2hfY3ZfZnVuY19zdHJjb2xsX2Jyb2tlbj15ZXMsIGJhc2hfY3ZfZnVuY19zdHJjb2xsX2Jyb2tlbj1ubywKLSAgIFtBQ19NU0dfV0FSTihjYW5ub3QgY2hlY2sgc3RyY29sbCBpZiBjcm9zcyBjb21waWxpbmcgLS0gZGVmYXVsdGluZyB0byBubykKLSAgICBiYXNoX2N2X2Z1bmNfc3RyY29sbF9icm9rZW49bm9dCi0pXSkKLUFDX01TR19SRVNVTFQoJGJhc2hfY3ZfZnVuY19zdHJjb2xsX2Jyb2tlbikKLWlmIHRlc3QgJGJhc2hfY3ZfZnVuY19zdHJjb2xsX2Jyb2tlbiA9IHllczsgdGhlbgotQUNfREVGSU5FKFNUUkNPTExfQlJPS0VOKQotZmkKLV0pCi0KLWRubAotZG5sIElmIGF2YWlsYWJsZSwgdXNlIHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzIHVubGVzcyB0aGUgdXNlciBzcGVjaWZpZWQKLWRubCBvbmUgb2YgdGhlIENQUEZMQUdTLCBMREZMQUdTLCBvciBMSUJTIHZhcmlhYmxlcyAoPGVnZ2VydEB0d2luc3VuLmNvbT4KLWRubCB2aWEgR05VIHBhdGNoIDIuNSkKLWRubAotQUNfREVGVU4oQkFTSF9MQVJHRV9GSUxFX1NVUFBPUlQsCi1bQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbGFyZ2UgZmlsZSBzdXBwb3J0IG5lZWRzIGV4cGxpY2l0IGVuYWJsaW5nKQotYWNfZ2V0Y29uZnM9JycKLWFjX3Jlc3VsdD15ZXMKLWFjX3NldD0nJwotYWNfc2hlbGx2YXJzPSdDUFBGTEFHUyBMREZMQUdTIExJQlMnCi1mb3IgYWNfc2hlbGx2YXIgaW4gJGFjX3NoZWxsdmFyczsgZG8KLSAgY2FzZSAkYWNfc2hlbGx2YXIgaW4KLSAgQ1BQRkxBR1MpIGFjX2xmc3Zhcj1MRlNfQ0ZMQUdTIGFjX2xmczY0dmFyPUxGUzY0X0NGTEFHUyA7OwotICAqKSBhY19sZnN2YXI9TEZTXyRhY19zaGVsbHZhciBhY19sZnM2NHZhcj1MRlM2NF8kYWNfc2hlbGx2YXIgOzsKLSAgZXNhYwotICBldmFsIHRlc3QgJyIkeyckYWNfc2hlbGx2YXInK3NldH0iJyA9IHNldCAmJiBhY19zZXQ9JGFjX3NoZWxsdmFyCi0gIChnZXRjb25mICRhY19sZnN2YXIpID4vZGV2L251bGwgMj4mMSB8fCB7IGFjX3Jlc3VsdD1ubzsgYnJlYWs7IH0KLSAgYWNfZ2V0Y29uZj1gZ2V0Y29uZiAkYWNfbGZzdmFyYAotICBhY19nZXRjb25mNjQ9YGdldGNvbmYgJGFjX2xmczY0dmFyYAotICBhY19nZXRjb25mcz0kYWNfZ2V0Y29uZnMkYWNfZ2V0Y29uZlwgJGFjX2dldGNvbmY2NAotICBldmFsIGFjX3Rlc3RfJGFjX3NoZWxsdmFyPSJcJGFjX2dldGNvbmZcIFwkYWNfZ2V0Y29uZjY0IgotZG9uZQotY2FzZSAiJGFjX3Jlc3VsdCRhY19nZXRjb25mcyIgaW4KLXllcykgYWNfcmVzdWx0PW5vIDs7Ci1lc2FjCi1jYXNlICIkYWNfcmVzdWx0JGFjX3NldCIgaW4KLXllcz8qKSBhY19yZXN1bHQ9InllcywgYnV0ICRhY19zZXQgaXMgYWxyZWFkeSBzZXQsIHNvIHVzZSBpdHMgc2V0dGluZ3MiCi1lc2FjCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1jYXNlICRhY19yZXN1bHQgaW4KLXllcykKLSAgZm9yIGFjX3NoZWxsdmFyIGluICRhY19zaGVsbHZhcnM7IGRvCi0gICAgZXZhbCAkYWNfc2hlbGx2YXI9XCRhY190ZXN0XyRhY19zaGVsbHZhcgotICBkb25lIDs7Ci1lc2FjCi1dKQotCi1kbmwKLWRubCBBQ19TWVNfUkVTVEFSVEFCTEVfU1lTQ0FMTFMgdGVzdHMgb25seSBmb3IgcmVzdGFydGVkIHN5c3RlbSBjYWxscwotZG5sIGFmdGVyIGEgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gaW5zdGFsbGVkIHdpdGggc2lnbmFsKCkuICBTaW5jZQotZG5sIEJhc2ggdXNlcyBzaWdhY3Rpb24oKSBpZiBpdCBpcyBhdmFpbGFibGUsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlcgotZG5sIG9yIG5vdCBhIHNpZ25hbCBoYW5kbGVyIGluc3RhbGxlZCB3aXRoIHNpZ2FjdGlvbiBhbmQgU0FfUkVTVEFSVAotZG5sIGNhdXNlcyBzeXN0ZW0gY2FsbHMgdG8gYmUgcmVzdGFydGVkIGFmdGVyIHRoZSBzaWduYWwgaXMgY2F1Z2h0Ci1kbmwKLUFDX0RFRlVOKEJBU0hfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTLAotW0FDX1JFUVVJUkUoW0JBU0hfU0lHTkFMX0NIRUNLXSkKLUFDX0NBQ0hFX0NIRUNLKGZvciByZXN0YXJ0YWJsZSBzeXN0ZW0gY2FsbHMgd2l0aCBwb3NpeCBzaWdhY3Rpb24sCi1iYXNoX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscywKLVtBQ19UUllfUlVOKAotWy8qIEV4aXQgMCAodHJ1ZSkgaWYgd2FpdCByZXR1cm5zIHNvbWV0aGluZyBvdGhlciB0aGFuIC0xLAotICAgaS5lLiB0aGUgcGlkIG9mIHRoZSBjaGlsZCwgd2hpY2ggbWVhbnMgdGhhdCB3YWl0IHdhcyByZXN0YXJ0ZWQKLSAgIGFmdGVyIGdldHRpbmcgdGhlIHNpZ25hbC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci1zdGF0aWMgaW50IGNhdWdodCA9IDA7Ci12b2lkIHVjYXRjaCAoaXNpZykgaW50IGlzaWc7IHsgY2F1Z2h0ID0gMTsgfQotbWFpbiAoKQotewotI2lmICFkZWZpbmVkIChfUE9TSVhfVkVSU0lPTikgfHwgIWRlZmluZWQgKEhBVkVfUE9TSVhfU0lHTkFMUykKLSAgZXhpdCAoMSk7Ci0jZWxzZQotICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCwgb2FjdDsKLSAgaW50IGksIHN0YXR1czsKLQotICBhY3Quc2FfaGFuZGxlciA9IHVjYXRjaDsKLSAgLyogTWlnaHQgd2FudCB0byBhZGQgU0FfUkVTVEFSVCBoZXJlLCBidXQgYmFzaCdzIHNldF9zaWduYWxfaGFuZGxlcgotICAgICBkb2VzIG5vdC4gKi8KLSAgYWN0LnNhX2ZsYWdzID0gMDsKLSAgc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKLSAgc2lnZW1wdHlzZXQoJm9hY3Quc2FfbWFzayk7Ci0gIGkgPSBmb3JrICgpOwotICAvKiBBIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGhlcmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBuZXZlciBoYXBwZW5zLiAqLwotICBpZiAoaSA9PSAwKSB7IHNsZWVwICgzKTsga2lsbCAoZ2V0cHBpZCAoKSwgU0lHSU5UKTsgc2xlZXAgKDMpOyBleGl0ICgwKTsgfQotICBzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCAmb2FjdCk7Ci0gIHN0YXR1cyA9IHdhaXQoJmkpOwotICBpZiAoc3RhdHVzID09IC0xKSB3YWl0KCZpKTsKLSAgZXhpdCAoc3RhdHVzID09IC0xKTsKLSNlbmRpZgotfQotXSwgYmFzaF9jdl9zeXNfcmVzdGFydGFibGVfc3lzY2FsbHM9eWVzLCBiYXNoX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz1ubywKLSAgIEFDX01TR19XQVJOKGNhbm5vdCBjaGVjayByZXN0YXJ0YWJsZSBzeXNjYWxscyBpZiBjcm9zcyBjb21waWxpbmcpKQotXSkKLWlmIHRlc3QgJGJhc2hfY3Zfc3lzX3Jlc3RhcnRhYmxlX3N5c2NhbGxzID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX1JFU1RBUlRBQkxFX1NZU0NBTExTKQotZmkKLV0pCi1kbmwKLWRubCBDaGVjayBmb3IgNjQtYml0IG9mZl90IC0tIHVzZWQgZm9yIG1hbGxvYyBhbGlnbm1lbnQKLWRubAotZG5sIEMgZG9lcyBub3QgYWxsb3cgZHVwbGljYXRlIGNhc2UgbGFiZWxzLCBzbyB0aGUgY29tcGlsZSB3aWxsIGZhaWwgaWYKLWRubCBzaXplb2Yob2ZmX3QpIGlzID4gNC4KLWRubAotQUNfREVGVU4oQkFTSF9DSEVDS19PRkZfVF82NCwKLVtBQ19DQUNIRV9DSEVDSyhmb3IgNjQtYml0IG9mZl90LCBiYXNoX2N2X29mZl90XzY0LAotQUNfVFJZX0NPTVBJTEUoWwotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotXSxbCi1zd2l0Y2ggKDApIGNhc2UgMDogY2FzZSAoc2l6ZW9mIChvZmZfdCkgPD0gNCk6OwotXSwgYmFzaF9jdl9vZmZfdF82ND1ubywgYmFzaF9jdl9vZmZfdF82ND15ZXMpKQotaWYgdGVzdCAkYmFzaF9jdl9vZmZfdF82NCA9IHllczsgdGhlbgotICAgICAgICBBQ19ERUZJTkUoSEFWRV9PRkZfVF82NCkKLWZpXSkKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2Fuc2lfc3RkbGliLmggYi9yZWFkbGluZS9hbnNpX3N0ZGxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjMzOWRhLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2Fuc2lfc3RkbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBhbnNpX3N0ZGxpYi5oIC0tIEFuIEFOU0kgU3RhbmRhcmQgc3RkbGliLmguICovCi0vKiBBIG1pbmltYWwgc3RkbGliLmggY29udGFpbmluZyBleHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aG9zZSBmdW5jdGlvbnMKLSAgIHRoYXQgYmFzaCB1c2VzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgotCi0gICBCYXNoIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotICAgdmVyc2lvbi4KLQotICAgQmFzaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEJhc2g7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLSNpZiAhZGVmaW5lZCAoX1NURExJQl9IXykKLSNkZWZpbmUJX1NURExJQl9IXyAxCi0KLS8qIFN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gKi8KLWV4dGVybiBpbnQgYXRvaSAoKTsKLWV4dGVybiBsb25nIGludCBhdG9sICgpOwotCi0vKiBNZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuICovCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwotZXh0ZXJuIGNoYXIgKnJlYWxsb2MgKCk7Ci1leHRlcm4gdm9pZCBmcmVlICgpOwotCi0vKiBPdGhlciBtaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucy4gKi8KLWV4dGVybiB2b2lkIGFib3J0ICgpOwotZXh0ZXJuIHZvaWQgZXhpdCAoKTsKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci1leHRlcm4gdm9pZCBxc29ydCAoKTsKLQotI2VuZGlmIC8qIF9TVERMSUJfSCAgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2JpbmQuYyBiL3JlYWRsaW5lL2JpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjZDgyNy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9iaW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM5ICswLDAgQEAKLS8qIGJpbmQuYyAtLSBrZXkgYmluZGluZyBhbmQgc3RhcnR1cCBmaWxlIHN1cHBvcnQgZm9yIHRoZSByZWFkbGluZSBsaWJyYXJ5LiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkIChIQVZFX1NZU19GSUxFX0gpCi0jICBpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX0ZJTEVfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZiAhZGVmaW5lZCAoZXJybm8pCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmIC8qICFlcnJubyAqLwotCi0jaW5jbHVkZSAicG9zaXhzdGF0LmgiCi0KLS8qIFN5c3RlbS1zcGVjaWZpYyBmZWF0dXJlIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIGZpbGVzLiAqLwotI2luY2x1ZGUgInJsZGVmcy5oIgotCi0vKiBTb21lIHN0YW5kYXJkIGxpYnJhcnkgcm91dGluZXMuICovCi0jaW5jbHVkZSAicmVhZGxpbmUuaCIKLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0KLSNpZiAhZGVmaW5lZCAoc3RyY2hyKSAmJiAhZGVmaW5lZCAoX19TVERDX18pCi1leHRlcm4gY2hhciAqc3RyY2hyICgpLCAqc3RycmNociAoKTsKLSNlbmRpZiAvKiAhc3RyY2hyICYmICFfX1NURENfXyAqLwotCi0jaWZuZGVmIE9fQklOQVJZCi0jIGRlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotZXh0ZXJuIGludCBfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZTsKLWV4dGVybiBpbnQgX3JsX21hcmtfbW9kaWZpZWRfbGluZXM7Ci1leHRlcm4gaW50IF9ybF9iZWxsX3ByZWZlcmVuY2U7Ci1leHRlcm4gaW50IF9ybF9tZXRhX2ZsYWc7Ci1leHRlcm4gaW50IF9ybF9jb252ZXJ0X21ldGFfY2hhcnNfdG9fYXNjaWk7Ci1leHRlcm4gaW50IF9ybF9vdXRwdXRfbWV0YV9jaGFyczsKLWV4dGVybiBpbnQgX3JsX2NvbXBsZXRlX3Nob3dfYWxsOwotZXh0ZXJuIGludCBfcmxfY29tcGxldGVfbWFya19kaXJlY3RvcmllczsKLWV4dGVybiBpbnQgX3JsX3ByaW50X2NvbXBsZXRpb25zX2hvcml6b250YWxseTsKLWV4dGVybiBpbnQgX3JsX2NvbXBsZXRpb25fY2FzZV9mb2xkOwotZXh0ZXJuIGludCBfcmxfZW5hYmxlX2tleXBhZDsKLSNpZiBkZWZpbmVkIChQQVJFTl9NQVRDSElORykKLWV4dGVybiBpbnQgcmxfYmxpbmtfbWF0Y2hpbmdfcGFyZW47Ci0jZW5kaWYgLyogUEFSRU5fTUFUQ0hJTkcgKi8KLSNpZiBkZWZpbmVkIChWSVNJQkxFX1NUQVRTKQotZXh0ZXJuIGludCBybF92aXNpYmxlX3N0YXRzOwotI2VuZGlmIC8qIFZJU0lCTEVfU1RBVFMgKi8KLWV4dGVybiBpbnQgcmxfY29tcGxldGVfd2l0aF90aWxkZV9leHBhbnNpb247Ci1leHRlcm4gaW50IHJsX2NvbXBsZXRpb25fcXVlcnlfaXRlbXM7Ci1leHRlcm4gaW50IHJsX2luaGliaXRfY29tcGxldGlvbjsKLWV4dGVybiBjaGFyICpfcmxfY29tbWVudF9iZWdpbjsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICpfcmxfaXNlYXJjaF90ZXJtaW5hdG9yczsKLQotZXh0ZXJuIGludCBybF9leHBsaWNpdF9hcmc7Ci1leHRlcm4gaW50IHJsX2VkaXRpbmdfbW9kZTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQ7Ci1leHRlcm4gS2V5bWFwIF9ybF9rZXltYXA7Ci0KLWV4dGVybiBjaGFyICpwb3NzaWJsZV9jb250cm9sX3ByZWZpeGVzW10sICpwb3NzaWJsZV9tZXRhX3ByZWZpeGVzW107Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIGZ1bm1hcC5jICovCi1leHRlcm4gY2hhciAqKnJsX2Z1bm1hcF9uYW1lcyAoKTsKLWV4dGVybiBpbnQgcmxfYWRkX2Z1bm1hcF9lbnRyeSAoKTsKLQotLyogRnVuY3Rpb25zIGltcG9ydGVkIGZyb20gdXRpbC5jICovCi1leHRlcm4gY2hhciAqX3JsX3N0cmluZGV4ICgpOwotCi0vKiBGdW5jdGlvbnMgaW1wb3J0ZWQgZnJvbSBzaGVsbC5jICovCi1leHRlcm4gY2hhciAqZ2V0X2Vudl92YWx1ZSAoKTsKLQotLyogVmFyaWFibGVzIGV4cG9ydGVkIGJ5IHRoaXMgZmlsZS4gKi8KLUtleW1hcCBybF9iaW5kaW5nX2tleW1hcDsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXZvaWQgcmxfc2V0X2tleW1hcF9mcm9tX2VkaXRfbW9kZSAoKTsKLQotc3RhdGljIGludCBfcmxfcmVhZF9pbml0X2ZpbGUgKCk7Ci1zdGF0aWMgaW50IGdsZWFuX2tleV9mcm9tX25hbWUgKCk7Ci1zdGF0aWMgaW50IHN1YnN0cmluZ19tZW1iZXJfb2ZfYXJyYXkgKCk7Ci0KLWV4dGVybiBjaGFyICp4bWFsbG9jICgpLCAqeHJlYWxsb2MgKCk7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJQmluZGluZyBrZXlzCQkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBybF9hZGRfZGVmdW4gKGNoYXIgKm5hbWUsIEZ1bmN0aW9uICpmdW5jdGlvbiwgaW50IGtleSkKLSAgIEFkZCBOQU1FIHRvIHRoZSBsaXN0IG9mIG5hbWVkIGZ1bmN0aW9ucy4gIE1ha2UgRlVOQ1RJT04gYmUgdGhlIGZ1bmN0aW9uCi0gICB0aGF0IGdldHMgY2FsbGVkLiAgSWYgS0VZIGlzIG5vdCAtMSwgdGhlbiBiaW5kIGl0LiAqLwotaW50Ci1ybF9hZGRfZGVmdW4gKG5hbWUsIGZ1bmN0aW9uLCBrZXkpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIEZ1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgaW50IGtleTsKLXsKLSAgaWYgKGtleSAhPSAtMSkKLSAgICBybF9iaW5kX2tleSAoa2V5LCBmdW5jdGlvbik7Ci0gIHJsX2FkZF9mdW5tYXBfZW50cnkgKG5hbWUsIGZ1bmN0aW9uKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEJpbmQgS0VZIHRvIEZVTkNUSU9OLiAgUmV0dXJucyBub24temVybyBpZiBLRVkgaXMgb3V0IG9mIHJhbmdlLiAqLwotaW50Ci1ybF9iaW5kX2tleSAoa2V5LCBmdW5jdGlvbikKLSAgICAgaW50IGtleTsKLSAgICAgRnVuY3Rpb24gKmZ1bmN0aW9uOwotewotICBpZiAoa2V5IDwgMCkKLSAgICByZXR1cm4gKGtleSk7Ci0KLSAgaWYgKE1FVEFfQ0hBUiAoa2V5KSAmJiBfcmxfY29udmVydF9tZXRhX2NoYXJzX3RvX2FzY2lpKQotICAgIHsKLSAgICAgIGlmIChfcmxfa2V5bWFwW0VTQ10udHlwZSA9PSBJU0tNQVApCi0JewotCSAgS2V5bWFwIGVzY21hcDsKLQotCSAgZXNjbWFwID0gRlVOQ1RJT05fVE9fS0VZTUFQIChfcmxfa2V5bWFwLCBFU0MpOwotCSAga2V5ID0gVU5NRVRBIChrZXkpOwotCSAgZXNjbWFwW2tleV0udHlwZSA9IElTRlVOQzsKLQkgIGVzY21hcFtrZXldLmZ1bmN0aW9uID0gZnVuY3Rpb247Ci0JICByZXR1cm4gKDApOwotCX0KLSAgICAgIHJldHVybiAoa2V5KTsKLSAgICB9Ci0KLSAgX3JsX2tleW1hcFtrZXldLnR5cGUgPSBJU0ZVTkM7Ci0gIF9ybF9rZXltYXBba2V5XS5mdW5jdGlvbiA9IGZ1bmN0aW9uOwotICBybF9iaW5kaW5nX2tleW1hcCA9IF9ybF9rZXltYXA7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIEJpbmQgS0VZIHRvIEZVTkNUSU9OIGluIE1BUC4gIFJldHVybnMgbm9uLXplcm8gaW4gY2FzZSBvZiBpbnZhbGlkCi0gICBLRVkuICovCi1pbnQKLXJsX2JpbmRfa2V5X2luX21hcCAoa2V5LCBmdW5jdGlvbiwgbWFwKQotICAgICBpbnQga2V5OwotICAgICBGdW5jdGlvbiAqZnVuY3Rpb247Ci0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIGludCByZXN1bHQ7Ci0gIEtleW1hcCBvbGRtYXA7Ci0KLSAgb2xkbWFwID0gX3JsX2tleW1hcDsKLSAgX3JsX2tleW1hcCA9IG1hcDsKLSAgcmVzdWx0ID0gcmxfYmluZF9rZXkgKGtleSwgZnVuY3Rpb24pOwotICBfcmxfa2V5bWFwID0gb2xkbWFwOwotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLS8qIE1ha2UgS0VZIGRvIG5vdGhpbmcgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBrZXltYXAuCi0gICBSZXR1cm5zIG5vbi16ZXJvIGluIGNhc2Ugb2YgZXJyb3IuICovCi1pbnQKLXJsX3VuYmluZF9rZXkgKGtleSkKLSAgICAgaW50IGtleTsKLXsKLSAgcmV0dXJuIChybF9iaW5kX2tleSAoa2V5LCAoRnVuY3Rpb24gKilOVUxMKSk7Ci19Ci0KLS8qIE1ha2UgS0VZIGRvIG5vdGhpbmcgaW4gTUFQLgotICAgUmV0dXJucyBub24temVybyBpbiBjYXNlIG9mIGVycm9yLiAqLwotaW50Ci1ybF91bmJpbmRfa2V5X2luX21hcCAoa2V5LCBtYXApCi0gICAgIGludCBrZXk7Ci0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIHJldHVybiAocmxfYmluZF9rZXlfaW5fbWFwIChrZXksIChGdW5jdGlvbiAqKU5VTEwsIG1hcCkpOwotfQotCi0vKiBVbmJpbmQgYWxsIGtleXMgYm91bmQgdG8gRlVOQ1RJT04gaW4gTUFQLiAqLwotaW50Ci1ybF91bmJpbmRfZnVuY3Rpb25faW5fbWFwIChmdW5jLCBtYXApCi0gICAgIEZ1bmN0aW9uICpmdW5jOwotICAgICBLZXltYXAgbWFwOwotewotICByZWdpc3RlciBpbnQgaSwgcnZhbDsKLQotICBmb3IgKGkgPSBydmFsID0gMDsgaSA8IEtFWU1BUF9TSVpFOyBpKyspCi0gICAgewotICAgICAgaWYgKG1hcFtpXS50eXBlID09IElTRlVOQyAmJiBtYXBbaV0uZnVuY3Rpb24gPT0gZnVuYykKLQl7Ci0JICBtYXBbaV0uZnVuY3Rpb24gPSAoRnVuY3Rpb24gKilOVUxMOwotCSAgcnZhbCA9IDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLWludAotcmxfdW5iaW5kX2NvbW1hbmRfaW5fbWFwIChjb21tYW5kLCBtYXApCi0gICAgIGNoYXIgKmNvbW1hbmQ7Ci0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIEZ1bmN0aW9uICpmdW5jOwotCi0gIGZ1bmMgPSBybF9uYW1lZF9mdW5jdGlvbiAoY29tbWFuZCk7Ci0gIGlmIChmdW5jID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAocmxfdW5iaW5kX2Z1bmN0aW9uX2luX21hcCAoZnVuYywgbWFwKSk7Ci19Ci0KLS8qIEJpbmQgdGhlIGtleSBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIEtFWVNFUSB0bwotICAgRlVOQ1RJT04uICBUaGlzIG1ha2VzIG5ldyBrZXltYXBzIGFzIG5lY2Vzc2FyeS4gIFRoZSBpbml0aWFsCi0gICBwbGFjZSB0byBkbyBiaW5kaW5ncyBpcyBpbiBNQVAuICovCi1pbnQKLXJsX3NldF9rZXkgKGtleXNlcSwgZnVuY3Rpb24sIG1hcCkKLSAgICAgY2hhciAqa2V5c2VxOwotICAgICBGdW5jdGlvbiAqZnVuY3Rpb247Ci0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIHJldHVybiAocmxfZ2VuZXJpY19iaW5kIChJU0ZVTkMsIGtleXNlcSwgKGNoYXIgKilmdW5jdGlvbiwgbWFwKSk7Ci19Ci0KLS8qIEJpbmQgdGhlIGtleSBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIEtFWVNFUSB0bwotICAgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzIE1BQ1JPLiAgVGhpcyBtYWtlcyBuZXcga2V5bWFwcyBhcwotICAgbmVjZXNzYXJ5LiAgVGhlIGluaXRpYWwgcGxhY2UgdG8gZG8gYmluZGluZ3MgaXMgaW4gTUFQLiAqLwotaW50Ci1ybF9tYWNyb19iaW5kIChrZXlzZXEsIG1hY3JvLCBtYXApCi0gICAgIGNoYXIgKmtleXNlcSwgKm1hY3JvOwotICAgICBLZXltYXAgbWFwOwotewotICBjaGFyICptYWNyb19rZXlzOwotICBpbnQgbWFjcm9fa2V5c19sZW47Ci0KLSAgbWFjcm9fa2V5cyA9IChjaGFyICopeG1hbGxvYyAoKDIgKiBzdHJsZW4gKG1hY3JvKSkgKyAxKTsKLQotICBpZiAocmxfdHJhbnNsYXRlX2tleXNlcSAobWFjcm8sIG1hY3JvX2tleXMsICZtYWNyb19rZXlzX2xlbikpCi0gICAgewotICAgICAgZnJlZSAobWFjcm9fa2V5cyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBybF9nZW5lcmljX2JpbmQgKElTTUFDUiwga2V5c2VxLCBtYWNyb19rZXlzLCBtYXApOwotICByZXR1cm4gMDsKLX0KLQotLyogQmluZCB0aGUga2V5IHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgS0VZU0VRIHRvCi0gICB0aGUgYXJiaXRyYXJ5IHBvaW50ZXIgREFUQS4gIFRZUEUgc2F5cyB3aGF0IGtpbmQgb2YgZGF0YSBpcwotICAgcG9pbnRlZCB0byBieSBEQVRBLCByaWdodCBub3cgdGhpcyBjYW4gYmUgYSBmdW5jdGlvbiAoSVNGVU5DKSwKLSAgIGEgbWFjcm8gKElTTUFDUiksIG9yIGEga2V5bWFwIChJU0tNQVApLiAgVGhpcyBtYWtlcyBuZXcga2V5bWFwcwotICAgYXMgbmVjZXNzYXJ5LiAgVGhlIGluaXRpYWwgcGxhY2UgdG8gZG8gYmluZGluZ3MgaXMgaW4gTUFQLiAqLwotaW50Ci1ybF9nZW5lcmljX2JpbmQgKHR5cGUsIGtleXNlcSwgZGF0YSwgbWFwKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqa2V5c2VxLCAqZGF0YTsKLSAgICAgS2V5bWFwIG1hcDsKLXsKLSAgY2hhciAqa2V5czsKLSAgaW50IGtleXNfbGVuOwotICByZWdpc3RlciBpbnQgaTsKLQotICAvKiBJZiBubyBrZXlzIHRvIGJpbmQgdG8sIGV4aXQgcmlnaHQgYXdheS4gKi8KLSAgaWYgKCFrZXlzZXEgfHwgISprZXlzZXEpCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gSVNNQUNSKQotCWZyZWUgKGRhdGEpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBrZXlzID0geG1hbGxvYyAoMSArICgyICogc3RybGVuIChrZXlzZXEpKSk7Ci0KLSAgLyogVHJhbnNsYXRlIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBLRVlTRVEgaW50byBhbiBhcnJheSBvZgotICAgICBjaGFyYWN0ZXJzLiAgU3R1ZmYgdGhlIGNoYXJhY3RlcnMgaW50byBLRVlTLCBhbmQgdGhlIGxlbmd0aCBvZgotICAgICBLRVlTIGludG8gS0VZU19MRU4uICovCi0gIGlmIChybF90cmFuc2xhdGVfa2V5c2VxIChrZXlzZXEsIGtleXMsICZrZXlzX2xlbikpCi0gICAgewotICAgICAgZnJlZSAoa2V5cyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEJpbmQga2V5cywgbWFraW5nIG5ldyBrZXltYXBzIGFzIG5lY2Vzc2FyeS4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGtleXNfbGVuOyBpKyspCi0gICAgewotICAgICAgaW50IGljID0gKGludCkgKCh1bnNpZ25lZCBjaGFyKWtleXNbaV0pOwotCi0gICAgICBpZiAoX3JsX2NvbnZlcnRfbWV0YV9jaGFyc190b19hc2NpaSAmJiBNRVRBX0NIQVIgKGljKSkKLQl7Ci0JICBpYyA9IFVOTUVUQSAoaWMpOwotCSAgaWYgKG1hcFtFU0NdLnR5cGUgPT0gSVNLTUFQKQotCSAgICBtYXAgPSBGVU5DVElPTl9UT19LRVlNQVAgKG1hcCwgRVNDKTsKLQl9Ci0KLSAgICAgIGlmICgoaSArIDEpIDwga2V5c19sZW4pCi0JewotCSAgaWYgKG1hcFtpY10udHlwZSAhPSBJU0tNQVApCi0JICAgIHsKLQkgICAgICBpZiAobWFwW2ljXS50eXBlID09IElTTUFDUikKLQkJZnJlZSAoKGNoYXIgKiltYXBbaWNdLmZ1bmN0aW9uKTsKLQotCSAgICAgIG1hcFtpY10udHlwZSA9IElTS01BUDsKLQkgICAgICBtYXBbaWNdLmZ1bmN0aW9uID0gS0VZTUFQX1RPX0ZVTkNUSU9OIChybF9tYWtlX2JhcmVfa2V5bWFwKCkpOwotCSAgICB9Ci0JICBtYXAgPSBGVU5DVElPTl9UT19LRVlNQVAgKG1hcCwgaWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobWFwW2ljXS50eXBlID09IElTTUFDUikKLQkgICAgZnJlZSAoKGNoYXIgKiltYXBbaWNdLmZ1bmN0aW9uKTsKLQotCSAgbWFwW2ljXS5mdW5jdGlvbiA9IEtFWU1BUF9UT19GVU5DVElPTiAoZGF0YSk7Ci0JICBtYXBbaWNdLnR5cGUgPSB0eXBlOwotCX0KLQotICAgICAgcmxfYmluZGluZ19rZXltYXAgPSBtYXA7Ci0gICAgfQotICBmcmVlIChrZXlzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRyYW5zbGF0ZSB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgU0VRLCBzdHVmZmluZyB0aGUgdmFsdWVzIGludG8gQVJSQVksCi0gICBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgTEVOIGdldHMgdGhlIGZpbmFsIGxlbmd0aCBvZiBBUlJBWS4gIFJldHVybgotICAgbm9uLXplcm8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgU0VRLiAqLwotaW50Ci1ybF90cmFuc2xhdGVfa2V5c2VxIChzZXEsIGFycmF5LCBsZW4pCi0gICAgIGNoYXIgKnNlcSwgKmFycmF5OwotICAgICBpbnQgKmxlbjsKLXsKLSAgcmVnaXN0ZXIgaW50IGksIGMsIGwsIHRlbXA7Ci0KLSAgZm9yIChpID0gbCA9IDA7IGMgPSBzZXFbaV07IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCXsKLQkgIGMgPSBzZXFbKytpXTsKLQotCSAgaWYgKGMgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIEhhbmRsZSBcQy0gYW5kIFxNLSBwcmVmaXhlcy4gKi8KLQkgIGlmICgoYyA9PSAnQycgfHwgYyA9PSAnTScpICYmIHNlcVtpICsgMV0gPT0gJy0nKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBiYWNrd2FyZHMgZGVmaW5lLiAqLwotCSAgICAgIGlmIChzdHJuY21wICgmc2VxW2ldLCAiQy1cXE0tIiwgNSkgPT0gMCkKLQkJewotCQkgIGFycmF5W2wrK10gPSBFU0M7Ci0JCSAgaSArPSA1OwotCQkgIGFycmF5W2wrK10gPSBDVFJMIChfcmxfdG9fdXBwZXIgKHNlcVtpXSkpOwotCQkgIGlmIChzZXFbaV0gPT0gJ1wwJykKLQkJICAgIGktLTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJ00nKQotCQl7Ci0JCSAgaSsrOwotCQkgIGFycmF5W2wrK10gPSBFU0M7CS8qIFhYWCAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA9PSAnQycpCi0JCXsKLQkJICBpICs9IDI7Ci0JCSAgLyogU3BlY2lhbCBoYWNrIGZvciBDLT8uLi4gKi8KLQkJICBhcnJheVtsKytdID0gKHNlcVtpXSA9PSAnPycpID8gUlVCT1VUIDogQ1RSTCAoX3JsX3RvX3VwcGVyIChzZXFbaV0pKTsKLQkJfQotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9CSAgICAgIAotCi0JICAvKiBUcmFuc2xhdGUgb3RoZXIgYmFja3NsYXNoLWVzY2FwZWQgY2hhcmFjdGVycy4gIFRoZXNlIGFyZSB0aGUKLQkgICAgIHNhbWUgZXNjYXBlIHNlcXVlbmNlcyB0aGF0IGJhc2gncyBgZWNobycgYW5kIGBwcmludGYnIGJ1aWx0aW5zCi0JICAgICBoYW5kbGUsIHdpdGggdGhlIGFkZGl0aW9uIG9mIFxkIC0+IFJVQk9VVC4gIEEgYmFja3NsYXNoCi0JICAgICBwcmVjZWRpbmcgYSBjaGFyYWN0ZXIgdGhhdCBpcyBub3Qgc3BlY2lhbCBpcyBzdHJpcHBlZC4gKi8KLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICBjYXNlICdhJzoKLQkgICAgICBhcnJheVtsKytdID0gJ1wwMDcnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBhcnJheVtsKytdID0gJ1xiJzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgYXJyYXlbbCsrXSA9IFJVQk9VVDsJLyogcmVhZGxpbmUtc3BlY2lmaWMgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZSc6Ci0JICAgICAgYXJyYXlbbCsrXSA9IEVTQzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZic6Ci0JICAgICAgYXJyYXlbbCsrXSA9ICdcZic7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ24nOgotCSAgICAgIGFycmF5W2wrK10gPSBORVdMSU5FOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdyJzoKLQkgICAgICBhcnJheVtsKytdID0gUkVUVVJOOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkgICAgICBhcnJheVtsKytdID0gVEFCOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd2JzoKLQkgICAgICBhcnJheVtsKytdID0gMHgwQjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnXFwnOgotCSAgICAgIGFycmF5W2wrK10gPSAnXFwnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6Ci0JICAgICAgaSsrOwotCSAgICAgIGZvciAodGVtcCA9IDIsIGMgLT0gJzAnOyBJU09DVEFMIChzZXFbaV0pICYmIHRlbXAtLTsgaSsrKQotCSAgICAgICAgYyA9IChjICogOCkgKyBPQ1RWQUxVRSAoc2VxW2ldKTsKLQkgICAgICBpLS07CS8qIGF1dG8taW5jcmVtZW50IGluIGZvciBsb29wICovCi0JICAgICAgYXJyYXlbbCsrXSA9IGMgJSAobGFyZ2VzdF9jaGFyICsgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3gnOgotCSAgICAgIGkrKzsKLQkgICAgICBmb3IgKHRlbXAgPSAzLCBjID0gMDsgaXN4ZGlnaXQgKHNlcVtpXSkgJiYgdGVtcC0tOyBpKyspCi0JICAgICAgICBjID0gKGMgKiAxNikgKyBIRVhWQUxVRSAoc2VxW2ldKTsKLQkgICAgICBpZiAodGVtcCA9PSAzKQotCSAgICAgICAgYyA9ICd4JzsKLQkgICAgICBpLS07CS8qIGF1dG8taW5jcmVtZW50IGluIGZvciBsb29wICovCi0JICAgICAgYXJyYXlbbCsrXSA9IGMgJSAobGFyZ2VzdF9jaGFyICsgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CS8qIGJhY2tzbGFzaGVzIGJlZm9yZSBub24tc3BlY2lhbCBjaGFycyBqdXN0IGFkZCB0aGUgY2hhciAqLwotCSAgICAgIGFycmF5W2wrK10gPSBjOwotCSAgICAgIGJyZWFrOwkvKiB0aGUgYmFja3NsYXNoIGlzIHN0cmlwcGVkICovCi0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgYXJyYXlbbCsrXSA9IGM7Ci0gICAgfQotCi0gICpsZW4gPSBsOwotICBhcnJheVtsXSA9ICdcMCc7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWNoYXIgKgotcmxfdW50cmFuc2xhdGVfa2V5c2VxIChzZXEpCi0gICAgIGludCBzZXE7Ci17Ci0gIHN0YXRpYyBjaGFyIGtzZXFbMTZdOwotICBpbnQgaSwgYzsKLQotICBpID0gMDsKLSAgYyA9IHNlcTsKLSAgaWYgKE1FVEFfQ0hBUiAoYykpCi0gICAgewotICAgICAga3NlcVtpKytdID0gJ1xcJzsKLSAgICAgIGtzZXFbaSsrXSA9ICdNJzsKLSAgICAgIGtzZXFbaSsrXSA9ICctJzsKLSAgICAgIGMgPSBVTk1FVEEgKGMpOwotICAgIH0KLSAgZWxzZSBpZiAoQ1RSTF9DSEFSIChjKSkKLSAgICB7Ci0gICAgICBrc2VxW2krK10gPSAnXFwnOwotICAgICAga3NlcVtpKytdID0gJ0MnOwotICAgICAga3NlcVtpKytdID0gJy0nOwotICAgICAgYyA9IF9ybF90b19sb3dlciAoVU5DVFJMIChjKSk7Ci0gICAgfQotICBlbHNlIGlmIChjID09IFJVQk9VVCkKLSAgICB7Ci0gICAgICBrc2VxW2krK10gPSAnXFwnOwotICAgICAga3NlcVtpKytdID0gJ0MnOwotICAgICAga3NlcVtpKytdID0gJy0nOwotICAgICAgYyA9ICc/JzsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gRVNDKQotICAgIHsKLSAgICAgIGtzZXFbaSsrXSA9ICdcXCc7Ci0gICAgICBjID0gJ2UnOwotICAgIH0KLSAgZWxzZSBpZiAoYyA9PSAnXFwnIHx8IGMgPT0gJyInKQotICAgIHsKLSAgICAgIGtzZXFbaSsrXSA9ICdcXCc7Ci0gICAgfQotCi0gIGtzZXFbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKSBjOwotICBrc2VxW2ldID0gJ1wwJzsKLSAgcmV0dXJuIGtzZXE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLV9ybF91bnRyYW5zbGF0ZV9tYWNyb192YWx1ZSAoc2VxKQotICAgICBjaGFyICpzZXE7Ci17Ci0gIGNoYXIgKnJldCwgKnIsICpzOwotICBpbnQgYzsKLQotICByID0gcmV0ID0geG1hbGxvYyAoNyAqIHN0cmxlbiAoc2VxKSArIDEpOwotICBmb3IgKHMgPSBzZXE7ICpzOyBzKyspCi0gICAgewotICAgICAgYyA9ICpzOwotICAgICAgaWYgKE1FVEFfQ0hBUiAoYykpCi0JewotCSAgKnIrKyA9ICdcXCc7Ci0JICAqcisrID0gJ00nOwotCSAgKnIrKyA9ICctJzsKLQkgIGMgPSBVTk1FVEEgKGMpOwotCX0KLSAgICAgIGVsc2UgaWYgKENUUkxfQ0hBUiAoYykgJiYgYyAhPSBFU0MpCi0JewotCSAgKnIrKyA9ICdcXCc7Ci0JICAqcisrID0gJ0MnOwotCSAgKnIrKyA9ICctJzsKLQkgIGMgPSBfcmxfdG9fbG93ZXIgKFVOQ1RSTCAoYykpOwotCX0KLSAgICAgIGVsc2UgaWYgKGMgPT0gUlVCT1VUKQotIAl7Ci0gCSAgKnIrKyA9ICdcXCc7Ci0gCSAgKnIrKyA9ICdDJzsKLSAJICAqcisrID0gJy0nOwotIAkgIGMgPSAnPyc7Ci0gCX0KLQotICAgICAgaWYgKGMgPT0gRVNDKQotCXsKLQkgICpyKysgPSAnXFwnOwotCSAgYyA9ICdlJzsKLQl9Ci0gICAgICBlbHNlIGlmIChjID09ICdcXCcgfHwgYyA9PSAnIicpCi0JKnIrKyA9ICdcXCc7Ci0KLSAgICAgICpyKysgPSAodW5zaWduZWQgY2hhciljOwotICAgIH0KLSAgKnIgPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IFNUUklORyByZXByZXNlbnRzLgotICAgSWYgU1RSSU5HIGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIGZ1bmN0aW9uLCB0aGVuIGEgTlVMTCBwb2ludGVyCi0gICBpcyByZXR1cm5lZC4gKi8KLUZ1bmN0aW9uICoKLXJsX25hbWVkX2Z1bmN0aW9uIChzdHJpbmcpCi0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgcmxfaW5pdGlhbGl6ZV9mdW5tYXAgKCk7Ci0KLSAgZm9yIChpID0gMDsgZnVubWFwW2ldOyBpKyspCi0gICAgaWYgKF9ybF9zdHJpY21wIChmdW5tYXBbaV0tPm5hbWUsIHN0cmluZykgPT0gMCkKLSAgICAgIHJldHVybiAoZnVubWFwW2ldLT5mdW5jdGlvbik7Ci0gIHJldHVybiAoKEZ1bmN0aW9uICopTlVMTCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgZnVuY3Rpb24gKG9yIG1hY3JvKSBkZWZpbml0aW9uIHdoaWNoIHdvdWxkIGJlIGludm9rZWQgdmlhCi0gICBLRVlTRVEgaWYgZXhlY3V0ZWQgaW4gTUFQLiAgSWYgTUFQIGlzIE5VTEwsIHRoZW4gdGhlIGN1cnJlbnQga2V5bWFwIGlzCi0gICB1c2VkLiAgVFlQRSwgaWYgbm9uLU5VTEwsIGlzIGEgcG9pbnRlciB0byBhbiBpbnQgd2hpY2ggd2lsbCByZWNlaXZlIHRoZQotICAgdHlwZSBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8uICBPbmUgb2YgSVNGVU5DIChmdW5jdGlvbiksIElTS01BUCAoa2V5bWFwKSwKLSAgIG9yIElTTUFDUiAobWFjcm8pLiAqLwotRnVuY3Rpb24gKgotcmxfZnVuY3Rpb25fb2Zfa2V5c2VxIChrZXlzZXEsIG1hcCwgdHlwZSkKLSAgICAgY2hhciAqa2V5c2VxOwotICAgICBLZXltYXAgbWFwOwotICAgICBpbnQgKnR5cGU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGlmICghbWFwKQotICAgIG1hcCA9IF9ybF9rZXltYXA7Ci0KLSAgZm9yIChpID0gMDsga2V5c2VxICYmIGtleXNlcVtpXTsgaSsrKQotICAgIHsKLSAgICAgIGludCBpYyA9IGtleXNlcVtpXTsKLQotICAgICAgaWYgKE1FVEFfQ0hBUiAoaWMpICYmIF9ybF9jb252ZXJ0X21ldGFfY2hhcnNfdG9fYXNjaWkpCi0JewotCSAgaWYgKG1hcFtFU0NdLnR5cGUgIT0gSVNLTUFQKQotCSAgICB7Ci0JICAgICAgaWYgKHR5cGUpCi0JCSp0eXBlID0gbWFwW0VTQ10udHlwZTsKLQotCSAgICAgIHJldHVybiAobWFwW0VTQ10uZnVuY3Rpb24pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYXAgPSBGVU5DVElPTl9UT19LRVlNQVAgKG1hcCwgRVNDKTsKLQkgICAgICBpYyA9IFVOTUVUQSAoaWMpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobWFwW2ljXS50eXBlID09IElTS01BUCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGtleSBpbiB0aGUga2V5IHNlcXVlbmNlLCByZXR1cm4gdGhlCi0JICAgICBtYXAuICovCi0JICBpZiAoIWtleXNlcVtpICsgMV0pCi0JICAgIHsKLQkgICAgICBpZiAodHlwZSkKLQkJKnR5cGUgPSBJU0tNQVA7Ci0KLQkgICAgICByZXR1cm4gKG1hcFtpY10uZnVuY3Rpb24pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG1hcCA9IEZVTkNUSU9OX1RPX0tFWU1BUCAobWFwLCBpYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh0eXBlKQotCSAgICAqdHlwZSA9IG1hcFtpY10udHlwZTsKLQotCSAgcmV0dXJuIChtYXBbaWNdLmZ1bmN0aW9uKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKChGdW5jdGlvbiAqKSBOVUxMKTsKLX0KLQotLyogVGhlIGxhc3Qga2V5IGJpbmRpbmdzIGZpbGUgcmVhZC4gKi8KLXN0YXRpYyBjaGFyICpsYXN0X3JlYWRsaW5lX2luaXRfZmlsZSA9IChjaGFyICopTlVMTDsKLQotLyogVGhlIGZpbGUgd2UncmUgY3VycmVudGx5IHJlYWRpbmcga2V5IGJpbmRpbmdzIGZyb20uICovCi1zdGF0aWMgY2hhciAqY3VycmVudF9yZWFkbGluZV9pbml0X2ZpbGU7Ci1zdGF0aWMgaW50IGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9pbmNsdWRlX2xldmVsOwotc3RhdGljIGludCBjdXJyZW50X3JlYWRsaW5lX2luaXRfbGluZW5vOwotCi0vKiBSZWFkIEZJTEVOQU1FIGludG8gYSBsb2NhbGx5LWFsbG9jYXRlZCBidWZmZXIgYW5kIHJldHVybiB0aGUgYnVmZmVyLgotICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBpbiAqU0laRVAuICBSZXR1cm5zIE5VTEwgaWYgYW55Ci0gICBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZC4gKi8KLXN0YXRpYyBjaGFyICoKLV9ybF9yZWFkX2ZpbGUgKGZpbGVuYW1lLCBzaXplcCkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgIHNpemVfdCAqc2l6ZXA7Ci17Ci0gIHN0cnVjdCBzdGF0IGZpbmZvOwotICBzaXplX3QgZmlsZV9zaXplOwotICBjaGFyICpidWZmZXI7Ci0gIGludCBpLCBmaWxlOwotCi0gIGlmICgoc3RhdCAoZmlsZW5hbWUsICZmaW5mbykgPCAwKSB8fCAoZmlsZSA9IG9wZW4gKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZLCAwNjY2KSkgPCAwKQotICAgIHJldHVybiAoKGNoYXIgKilOVUxMKTsKLQotICBmaWxlX3NpemUgPSAoc2l6ZV90KWZpbmZvLnN0X3NpemU7Ci0KLSAgLyogY2hlY2sgZm9yIG92ZXJmbG93IG9uIHZlcnkgbGFyZ2UgZmlsZXMgKi8KLSAgaWYgKGZpbGVfc2l6ZSAhPSBmaW5mby5zdF9zaXplIHx8IGZpbGVfc2l6ZSArIDEgPCBmaWxlX3NpemUpCi0gICAgewotICAgICAgaWYgKGZpbGUgPj0gMCkKLQljbG9zZSAoZmlsZSk7Ci0jaWYgZGVmaW5lZCAoRUZCSUcpCi0gICAgICBlcnJubyA9IEVGQklHOwotI2VuZGlmCi0gICAgICByZXR1cm4gKChjaGFyICopTlVMTCk7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGZpbGUgaW50byBCVUZGRVIuICovCi0gIGJ1ZmZlciA9IChjaGFyICopeG1hbGxvYyAoZmlsZV9zaXplICsgMSk7Ci0gIGkgPSByZWFkIChmaWxlLCBidWZmZXIsIGZpbGVfc2l6ZSk7Ci0gIGNsb3NlIChmaWxlKTsKLQotI2lmIDEKLSAgaWYgKGkgPCBmaWxlX3NpemUpCi0jZWxzZQotICBpZiAoaSA8IDApCi0jZW5kaWYKLSAgICB7Ci0gICAgICBmcmVlIChidWZmZXIpOwotICAgICAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotICAgIH0KLQotICBidWZmZXJbZmlsZV9zaXplXSA9ICdcMCc7Ci0KLSNpZiBPX0JJTkFSWQotICB7Ci0gICAgLyogU3lzdGVtcyB3aGljaCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBuZWVkCi0gICAgICAgdG8gc3RyaXAgdGhlIENSIGNoYXJhY3RlcnMgYmVmb3JlIGVhY2ggTmV3bGluZSwgb3RoZXJ3aXNlIHRoZQotICAgICAgIHBhcnNpbmcgZnVuY3Rpb25zIHdvbid0IHdvcmsuICAqLwotICAgIGNoYXIgKnMsICpkOwotICAgIHNpemVfdCByZW1vdmVkID0gMDsKLQotICAgIGZvciAocyA9IGJ1ZmZlciwgZCA9IGJ1ZmZlcjsgcyA8IGJ1ZmZlciArIGZpbGVfc2l6ZTsgcysrKQotICAgICAgewotCWlmIChyZW1vdmVkKQotCSAgKmQgPSAqczsKLQlpZiAoKnMgIT0gJ1xyJyB8fCBzWzFdICE9ICdcbicpCi0JICBkKys7Ci0JZWxzZQotCSAgcmVtb3ZlZCsrOwotICAgICAgfQotCi0gICAgZmlsZV9zaXplIC09IHJlbW92ZWQ7Ci0gICAgYnVmZmVyW2ZpbGVfc2l6ZV0gPSAnXDAnOwotICB9Ci0jZW5kaWYKLQotICBpZiAoc2l6ZXApCi0gICAgKnNpemVwID0gZmlsZV9zaXplOwotICByZXR1cm4gKGJ1ZmZlcik7Ci19Ci0KLS8qIFJlLXJlYWQgdGhlIGN1cnJlbnQga2V5YmluZGluZ3MgZmlsZS4gKi8KLWludAotcmxfcmVfcmVhZF9pbml0X2ZpbGUgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICBpbnQgcjsKLSAgciA9IHJsX3JlYWRfaW5pdF9maWxlICgoY2hhciAqKU5VTEwpOwotICBybF9zZXRfa2V5bWFwX2Zyb21fZWRpdF9tb2RlICgpOwotICByZXR1cm4gcjsKLX0KLQotLyogRG8ga2V5IGJpbmRpbmdzIGZyb20gYSBmaWxlLiAgSWYgRklMRU5BTUUgaXMgTlVMTCBpdCBkZWZhdWx0cwotICAgdG8gdGhlIGZpcnN0IG5vbi1udWxsIGZpbGVuYW1lIGZyb20gdGhpcyBsaXN0OgotICAgICAxLiB0aGUgZmlsZW5hbWUgdXNlZCBmb3IgdGhlIHByZXZpb3VzIGNhbGwKLSAgICAgMi4gdGhlIHZhbHVlIG9mIHRoZSBzaGVsbCB2YXJpYWJsZSBgSU5QVVRSQycKLSAgICAgMy4gfi8uaW5wdXRyYwotICAgICA0LiAoZm9yIF9fTVNET1NfXyBvbmx5KSB+L19pbnB1dHJjCi0gICBJZiB0aGUgZmlsZSBleGlzdGVkIGFuZCBjb3VsZCBiZSBvcGVuZWQgYW5kIHJlYWQsIDAgaXMgcmV0dXJuZWQsCi0gICBvdGhlcndpc2UgZXJybm8gaXMgcmV0dXJuZWQuICovCi1pbnQKLXJsX3JlYWRfaW5pdF9maWxlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIC8qIERlZmF1bHQgdGhlIGZpbGVuYW1lLiAqLwotICBpZiAoZmlsZW5hbWUgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlbmFtZSA9IGxhc3RfcmVhZGxpbmVfaW5pdF9maWxlOwotICAgICAgaWYgKGZpbGVuYW1lID09IDApCi0gICAgICAgIGZpbGVuYW1lID0gZ2V0X2Vudl92YWx1ZSAoIklOUFVUUkMiKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSAwKQotCWZpbGVuYW1lID0gREVGQVVMVF9JTlBVVFJDOwotICAgIH0KLQotICBpZiAoKmZpbGVuYW1lID09IDApCi0gICAgZmlsZW5hbWUgPSBERUZBVUxUX0lOUFVUUkM7Ci0KLSNpZmRlZiBfX01TRE9TX18KLSAgewotICAgIC8qIERPUyBkb2Vzbid0IGFsbG93IGxlYWRpbmcgZG90cyBpbiBmaWxlIG5hbWVzLiAgSWYgdGhlIG9yaWdpbmFsCi0gICAgICAgbmFtZSBmYWlscyAoaXQgY291bGQgd29yayBpZiB3ZSBhcmUgb24gV2luZG93cyksIGZhbGwgYmFjayB0bwotICAgICAgIH4vX2lucHV0cmMuICAqLwotICAgIGludCByZXR2YWwgPSBfcmxfcmVhZF9pbml0X2ZpbGUgKGZpbGVuYW1lLCAwKTsKLQotICAgIGlmIChyZXR2YWwgPT0gMCkKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChmaWxlbmFtZSwgIn4vLmlucHV0cmMiKSA9PSAwKQotICAgICAgZmlsZW5hbWUgPSAifi9faW5wdXRyYyI7Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiAoX3JsX3JlYWRfaW5pdF9maWxlIChmaWxlbmFtZSwgMCkpOwotfQotCi1zdGF0aWMgaW50Ci1fcmxfcmVhZF9pbml0X2ZpbGUgKGZpbGVuYW1lLCBpbmNsdWRlX2xldmVsKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGluY2x1ZGVfbGV2ZWw7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBjaGFyICpidWZmZXIsICpvcGVubmFtZSwgKmxpbmUsICplbmQ7Ci0gIHNpemVfdCBmaWxlX3NpemU7Ci0KLSAgY3VycmVudF9yZWFkbGluZV9pbml0X2ZpbGUgPSBmaWxlbmFtZTsKLSAgY3VycmVudF9yZWFkbGluZV9pbml0X2luY2x1ZGVfbGV2ZWwgPSBpbmNsdWRlX2xldmVsOwotCi0gIG9wZW5uYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7Ci0gIGJ1ZmZlciA9IF9ybF9yZWFkX2ZpbGUgKG9wZW5uYW1lLCAmZmlsZV9zaXplKTsKLSAgZnJlZSAob3Blbm5hbWUpOwotCi0gIGlmIChidWZmZXIgPT0gMCkKLSAgICByZXR1cm4gKGVycm5vKTsKLSAgCi0gIGlmIChpbmNsdWRlX2xldmVsID09IDAgJiYgZmlsZW5hbWUgIT0gbGFzdF9yZWFkbGluZV9pbml0X2ZpbGUpCi0gICAgewotICAgICAgRlJFRSAobGFzdF9yZWFkbGluZV9pbml0X2ZpbGUpOwotICAgICAgbGFzdF9yZWFkbGluZV9pbml0X2ZpbGUgPSBzYXZlc3RyaW5nIChmaWxlbmFtZSk7Ci0gICAgfQotCi0gIC8qIExvb3Agb3ZlciB0aGUgbGluZXMgaW4gdGhlIGZpbGUuICBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggYCMnIGFyZQotICAgICBjb21tZW50czsgYWxsIG90aGVyIGxpbmVzIGFyZSBjb21tYW5kcyBmb3IgcmVhZGxpbmUgaW5pdGlhbGl6YXRpb24uICovCi0gIGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9saW5lbm8gPSAxOwotICBsaW5lID0gYnVmZmVyOwotICBlbmQgPSBidWZmZXIgKyBmaWxlX3NpemU7Ci0gIHdoaWxlIChsaW5lIDwgZW5kKQotICAgIHsKLSAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGlzIGxpbmUuICovCi0gICAgICBmb3IgKGkgPSAwOyBsaW5lICsgaSAhPSBlbmQgJiYgbGluZVtpXSAhPSAnXG4nOyBpKyspOwotCi0gICAgICAvKiBNYXJrIGVuZCBvZiBsaW5lLiAqLwotICAgICAgbGluZVtpXSA9ICdcMCc7Ci0KLSAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICAgICAgd2hpbGUgKCpsaW5lICYmIHdoaXRlc3BhY2UgKCpsaW5lKSkKLSAgICAgICAgewotCSAgbGluZSsrOwotCSAgaS0tOwotICAgICAgICB9Ci0KLSAgICAgIC8qIElmIHRoZSBsaW5lIGlzIG5vdCBhIGNvbW1lbnQsIHRoZW4gcGFyc2UgaXQuICovCi0gICAgICBpZiAoKmxpbmUgJiYgKmxpbmUgIT0gJyMnKQotCXJsX3BhcnNlX2FuZF9iaW5kIChsaW5lKTsKLQotICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBsaW5lLiAqLwotICAgICAgbGluZSArPSBpICsgMTsKLSAgICAgIGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9saW5lbm8rKzsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmZmVyKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLV9ybF9pbml0X2ZpbGVfZXJyb3IgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBmcHJpbnRmIChzdGRlcnIsICJyZWFkbGluZTogJXM6IGxpbmUgJWQ6ICVzXG4iLCBjdXJyZW50X3JlYWRsaW5lX2luaXRfZmlsZSwKLSAJCSAgIGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9saW5lbm8sCi0gCQkgICBtc2cpOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCVBhcnNlciBEaXJlY3RpdmVzICAgICAgIAkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIENvbmRpdGlvbmFscy4gKi8KLQotLyogQ2FsbGluZyBwcm9ncmFtcyBzZXQgdGhpcyB0byBoYXZlIHRoZWlyIGFyZ3ZbMF0uICovCi1jaGFyICpybF9yZWFkbGluZV9uYW1lID0gIm90aGVyIjsKLQotLyogU3RhY2sgb2YgcHJldmlvdXMgdmFsdWVzIG9mIHBhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dC4gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppZl9zdGFjayA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKLXN0YXRpYyBpbnQgaWZfc3RhY2tfZGVwdGg7Ci1zdGF0aWMgaW50IGlmX3N0YWNrX3NpemU7Ci0KLS8qIFB1c2ggX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dCwgYW5kIHNldCBwYXJzZXIgc3RhdGUgYmFzZWQKLSAgIG9uIEFSR1MuICovCi1zdGF0aWMgaW50Ci1wYXJzZXJfaWYgKGFyZ3MpCi0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIC8qIFB1c2ggcGFyc2VyIHN0YXRlLiAqLwotICBpZiAoaWZfc3RhY2tfZGVwdGggKyAxID49IGlmX3N0YWNrX3NpemUpCi0gICAgewotICAgICAgaWYgKCFpZl9zdGFjaykKLQlpZl9zdGFjayA9ICh1bnNpZ25lZCBjaGFyICopeG1hbGxvYyAoaWZfc3RhY2tfc2l6ZSA9IDIwKTsKLSAgICAgIGVsc2UKLQlpZl9zdGFjayA9ICh1bnNpZ25lZCBjaGFyICopeHJlYWxsb2MgKGlmX3N0YWNrLCBpZl9zdGFja19zaXplICs9IDIwKTsKLSAgICB9Ci0gIGlmX3N0YWNrW2lmX3N0YWNrX2RlcHRoKytdID0gX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dDsKLQotICAvKiBJZiBwYXJzaW5nIGlzIHR1cm5lZCBvZmYsIHRoZW4gbm90aGluZyBjYW4gdHVybiBpdCBiYWNrIG9uIGV4Y2VwdAotICAgICBmb3IgZmluZGluZyB0aGUgbWF0Y2hpbmcgZW5kaWYuICBJbiB0aGF0IGNhc2UsIHJldHVybiByaWdodCBub3cuICovCi0gIGlmIChfcmxfcGFyc2luZ19jb25kaXRpb25hbGl6ZWRfb3V0KQotICAgIHJldHVybiAwOwotCi0gIC8qIElzb2xhdGUgZmlyc3QgYXJndW1lbnQuICovCi0gIGZvciAoaSA9IDA7IGFyZ3NbaV0gJiYgIXdoaXRlc3BhY2UgKGFyZ3NbaV0pOyBpKyspOwotCi0gIGlmIChhcmdzW2ldKQotICAgIGFyZ3NbaSsrXSA9ICdcMCc7Ci0KLSAgLyogSGFuZGxlICIkaWYgdGVybT1mb28iIGFuZCAiJGlmIG1vZGU9ZW1hY3MiIGNvbnN0cnVjdHMuICBJZiB0aGlzCi0gICAgIGlzbid0IHRlcm09Zm9vLCBvciBtb2RlPWVtYWNzLCB0aGVuIGNoZWNrIHRvIHNlZSBpZiB0aGUgZmlyc3QKLSAgICAgd29yZCBpbiBBUkdTIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gcmxfcmVhZGxpbmVfbmFtZS4gKi8KLSAgaWYgKHJsX3Rlcm1pbmFsX25hbWUgJiYgX3JsX3N0cm5pY21wIChhcmdzLCAidGVybT0iLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnRlbSwgKnRuYW1lOwotCi0gICAgICAvKiBUZXJtaW5hbHMgbGlrZSAiYWFhLTYwIiBhcmUgZXF1aXZhbGVudCB0byAiYWFhIi4gKi8KLSAgICAgIHRuYW1lID0gc2F2ZXN0cmluZyAocmxfdGVybWluYWxfbmFtZSk7Ci0gICAgICB0ZW0gPSBzdHJjaHIgKHRuYW1lLCAnLScpOwotICAgICAgaWYgKHRlbSkKLQkqdGVtID0gJ1wwJzsKLQotICAgICAgLyogVGVzdCB0aGUgYGxvbmcnIGFuZCBgc2hvcnQnIGZvcm1zIG9mIHRoZSB0ZXJtaW5hbCBuYW1lIHNvIHRoYXQKLQkgaWYgc29tZW9uZSBoYXMgYSBgc3VuLWNtZCcgYW5kIGRvZXMgbm90IHdhbnQgdG8gaGF2ZSBiaW5kaW5ncwotCSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaWYgdGhlIHRlcm1pbmFsIGlzIGEgYHN1bicsIHRoZXkgY2FuIHB1dAotCSBgJGlmIHRlcm09c3VuLWNtZCcgaW50byB0aGVpciAuaW5wdXRyYy4gKi8KLSAgICAgIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQgPSBfcmxfc3RyaWNtcCAoYXJncyArIDUsIHRuYW1lKSAmJgotCQkJCQlfcmxfc3RyaWNtcCAoYXJncyArIDUsIHJsX3Rlcm1pbmFsX25hbWUpOwotICAgICAgZnJlZSAodG5hbWUpOwotICAgIH0KLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICBlbHNlIGlmIChfcmxfc3RybmljbXAgKGFyZ3MsICJtb2RlPSIsIDUpID09IDApCi0gICAgewotICAgICAgaW50IG1vZGU7Ci0KLSAgICAgIGlmIChfcmxfc3RyaWNtcCAoYXJncyArIDUsICJlbWFjcyIpID09IDApCi0JbW9kZSA9IGVtYWNzX21vZGU7Ci0gICAgICBlbHNlIGlmIChfcmxfc3RyaWNtcCAoYXJncyArIDUsICJ2aSIpID09IDApCi0JbW9kZSA9IHZpX21vZGU7Ci0gICAgICBlbHNlCi0JbW9kZSA9IG5vX21vZGU7Ci0KLSAgICAgIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQgPSBtb2RlICE9IHJsX2VkaXRpbmdfbW9kZTsKLSAgICB9Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpcnN0IHdvcmQgaW4gQVJHUyBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICAgdmFsdWUgc3RvcmVkIGluIHJsX3JlYWRsaW5lX25hbWUuICovCi0gIGVsc2UgaWYgKF9ybF9zdHJpY21wIChhcmdzLCBybF9yZWFkbGluZV9uYW1lKSA9PSAwKQotICAgIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQgPSAwOwotICBlbHNlCi0gICAgX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBJbnZlcnQgdGhlIGN1cnJlbnQgcGFyc2VyIHN0YXRlIGlmIHRoZXJlIGlzIGFueXRoaW5nIG9uIHRoZSBzdGFjay4gKi8KLXN0YXRpYyBpbnQKLXBhcnNlcl9lbHNlIChhcmdzKQotICAgICBjaGFyICphcmdzOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBpZiAoaWZfc3RhY2tfZGVwdGggPT0gMCkKLSAgICB7Ci0gICAgICBfcmxfaW5pdF9maWxlX2Vycm9yICgiJGVsc2UgZm91bmQgd2l0aG91dCBtYXRjaGluZyAkaWYiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgcHJldmlvdXMgKG4gLSAxKSBsZXZlbHMgb2YgdGhlIHN0YWNrIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIHdlIGhhdmVuJ3QgcHJldmlvdXNseSB0dXJuZWQgb2ZmIHBhcnNpbmcuICovCi0gIGZvciAoaSA9IDA7IGkgPCBpZl9zdGFja19kZXB0aCAtIDE7IGkrKykKLSAgICBpZiAoaWZfc3RhY2tbaV0gPT0gMSkKLSAgICAgIHJldHVybiAwOwotCi0gIC8qIEludmVydCB0aGUgc3RhdGUgb2YgcGFyc2luZyBpZiBhdCB0b3AgbGV2ZWwuICovCi0gIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQgPSAhX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRlcm1pbmF0ZSBhIGNvbmRpdGlvbmFsLCBwb3BwaW5nIHRoZSB2YWx1ZSBvZgotICAgX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dCBmcm9tIHRoZSBzdGFjay4gKi8KLXN0YXRpYyBpbnQKLXBhcnNlcl9lbmRpZiAoYXJncykKLSAgICAgY2hhciAqYXJnczsKLXsKLSAgaWYgKGlmX3N0YWNrX2RlcHRoKQotICAgIF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQgPSBpZl9zdGFja1stLWlmX3N0YWNrX2RlcHRoXTsKLSAgZWxzZQotICAgIF9ybF9pbml0X2ZpbGVfZXJyb3IgKCIkZW5kaWYgd2l0aG91dCBtYXRjaGluZyAkaWYiKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlcl9pbmNsdWRlIChhcmdzKQotICAgICBjaGFyICphcmdzOwotewotICBjaGFyICpvbGRfaW5pdF9maWxlLCAqZTsKLSAgaW50IG9sZF9saW5lX251bWJlciwgb2xkX2luY2x1ZGVfbGV2ZWwsIHI7Ci0KLSAgaWYgKF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQpCi0gICAgcmV0dXJuICgwKTsKLQotICBvbGRfaW5pdF9maWxlID0gY3VycmVudF9yZWFkbGluZV9pbml0X2ZpbGU7Ci0gIG9sZF9saW5lX251bWJlciA9IGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9saW5lbm87Ci0gIG9sZF9pbmNsdWRlX2xldmVsID0gY3VycmVudF9yZWFkbGluZV9pbml0X2luY2x1ZGVfbGV2ZWw7Ci0KLSAgZSA9IHN0cmNociAoYXJncywgJ1xuJyk7Ci0gIGlmIChlKQotICAgICplID0gJ1wwJzsKLSAgciA9IF9ybF9yZWFkX2luaXRfZmlsZSAoYXJncywgb2xkX2luY2x1ZGVfbGV2ZWwgKyAxKTsKLQotICBjdXJyZW50X3JlYWRsaW5lX2luaXRfZmlsZSA9IG9sZF9pbml0X2ZpbGU7Ci0gIGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9saW5lbm8gPSBvbGRfbGluZV9udW1iZXI7Ci0gIGN1cnJlbnRfcmVhZGxpbmVfaW5pdF9pbmNsdWRlX2xldmVsID0gb2xkX2luY2x1ZGVfbGV2ZWw7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0gIAotLyogQXNzb2NpYXRlIHRleHR1YWwgbmFtZXMgd2l0aCBhY3R1YWwgZnVuY3Rpb25zLiAqLwotc3RhdGljIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIEZ1bmN0aW9uICpmdW5jdGlvbjsKLX0gcGFyc2VyX2RpcmVjdGl2ZXMgW10gPSB7Ci0gIHsgImlmIiwgcGFyc2VyX2lmIH0sCi0gIHsgImVuZGlmIiwgcGFyc2VyX2VuZGlmIH0sCi0gIHsgImVsc2UiLCBwYXJzZXJfZWxzZSB9LAotICB7ICJpbmNsdWRlIiwgcGFyc2VyX2luY2x1ZGUgfSwKLSAgeyAoY2hhciAqKTB4MCwgKEZ1bmN0aW9uICopMHgwIH0KLX07Ci0KLS8qIEhhbmRsZSBhIHBhcnNlciBkaXJlY3RpdmUuICBTVEFURU1FTlQgaXMgdGhlIGxpbmUgb2YgdGhlIGRpcmVjdGl2ZQotICAgd2l0aG91dCBhbnkgbGVhZGluZyBgJCcuICovCi1zdGF0aWMgaW50Ci1oYW5kbGVfcGFyc2VyX2RpcmVjdGl2ZSAoc3RhdGVtZW50KQotICAgICBjaGFyICpzdGF0ZW1lbnQ7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBjaGFyICpkaXJlY3RpdmUsICphcmdzOwotCi0gIC8qIElzb2xhdGUgdGhlIGFjdHVhbCBkaXJlY3RpdmUuICovCi0KLSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAqLwotICBmb3IgKGkgPSAwOyB3aGl0ZXNwYWNlIChzdGF0ZW1lbnRbaV0pOyBpKyspOwotCi0gIGRpcmVjdGl2ZSA9ICZzdGF0ZW1lbnRbaV07Ci0KLSAgZm9yICg7IHN0YXRlbWVudFtpXSAmJiAhd2hpdGVzcGFjZSAoc3RhdGVtZW50W2ldKTsgaSsrKTsKLQotICBpZiAoc3RhdGVtZW50W2ldKQotICAgIHN0YXRlbWVudFtpKytdID0gJ1wwJzsKLQotICBmb3IgKDsgc3RhdGVtZW50W2ldICYmIHdoaXRlc3BhY2UgKHN0YXRlbWVudFtpXSk7IGkrKyk7Ci0KLSAgYXJncyA9ICZzdGF0ZW1lbnRbaV07Ci0KLSAgLyogTG9va3VwIHRoZSBjb21tYW5kLCBhbmQgYWN0IG9uIGl0LiAqLwotICBmb3IgKGkgPSAwOyBwYXJzZXJfZGlyZWN0aXZlc1tpXS5uYW1lOyBpKyspCi0gICAgaWYgKF9ybF9zdHJpY21wIChkaXJlY3RpdmUsIHBhcnNlcl9kaXJlY3RpdmVzW2ldLm5hbWUpID09IDApCi0gICAgICB7Ci0JKCpwYXJzZXJfZGlyZWN0aXZlc1tpXS5mdW5jdGlvbikgKGFyZ3MpOwotCXJldHVybiAoMCk7Ci0gICAgICB9Ci0KLSAgLyogZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGFib3V0IHRoZSB1bmtub3duIHBhcnNlciBkaXJlY3RpdmUgKi8KLSAgX3JsX2luaXRfZmlsZV9lcnJvciAoInVua25vd24gcGFyc2VyIGRpcmVjdGl2ZSIpOwotICByZXR1cm4gKDEpOwotfQotCi0vKiBSZWFkIHRoZSBiaW5kaW5nIGNvbW1hbmQgZnJvbSBTVFJJTkcgYW5kIHBlcmZvcm0gaXQuCi0gICBBIGtleSBiaW5kaW5nIGNvbW1hbmQgbG9va3MgbGlrZTogS2V5bmFtZTogZnVuY3Rpb24tbmFtZVwwLAotICAgYSB2YXJpYWJsZSBiaW5kaW5nIGNvbW1hbmQgbG9va3MgbGlrZTogc2V0IHZhcmlhYmxlIHZhbHVlLgotICAgQSBuZXctc3R5bGUga2V5YmluZGluZyBsb29rcyBsaWtlICJcQy14XEMteCI6IGV4Y2hhbmdlLXBvaW50LWFuZC1tYXJrLiAqLwotaW50Ci1ybF9wYXJzZV9hbmRfYmluZCAoc3RyaW5nKQotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIGNoYXIgKmZ1bm5hbWUsICprbmFtZTsKLSAgcmVnaXN0ZXIgaW50IGMsIGk7Ci0gIGludCBrZXksIGVxdWl2YWxlbmN5OwotCi0gIHdoaWxlIChzdHJpbmcgJiYgd2hpdGVzcGFjZSAoKnN0cmluZykpCi0gICAgc3RyaW5nKys7Ci0KLSAgaWYgKCFzdHJpbmcgfHwgISpzdHJpbmcgfHwgKnN0cmluZyA9PSAnIycpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHBhcnNlciBkaXJlY3RpdmUsIGFjdCBvbiBpdC4gKi8KLSAgaWYgKCpzdHJpbmcgPT0gJyQnKQotICAgIHsKLSAgICAgIGhhbmRsZV9wYXJzZXJfZGlyZWN0aXZlICgmc3RyaW5nWzFdKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gYmUgcGFyc2luZyByaWdodCBub3csIHRoZW4gd2UncmUgZG9uZS4gKi8KLSAgaWYgKF9ybF9wYXJzaW5nX2NvbmRpdGlvbmFsaXplZF9vdXQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaSA9IDA7Ci0gIC8qIElmIHRoaXMga2V5bmFtZSBpcyBhIGNvbXBsZXgga2V5IGV4cHJlc3Npb24gc3Vycm91bmRlZCBieSBxdW90ZXMsCi0gICAgIGFkdmFuY2UgdG8gYWZ0ZXIgdGhlIG1hdGNoaW5nIGNsb3NlIHF1b3RlLiAgVGhpcyBjb2RlIGFsbG93cyB0aGUKLSAgICAgYmFja3NsYXNoIHRvIHF1b3RlIGNoYXJhY3RlcnMgaW4gdGhlIGtleSBleHByZXNzaW9uLiAqLwotICBpZiAoKnN0cmluZyA9PSAnIicpCi0gICAgewotICAgICAgaW50IHBhc3NjID0gMDsKLQotICAgICAgZm9yIChpID0gMTsgYyA9IHN0cmluZ1tpXTsgaSsrKQotCXsKLQkgIGlmIChwYXNzYykKLQkgICAgewotCSAgICAgIHBhc3NjID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoYyA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgcGFzc2MrKzsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoYyA9PSAnIicpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgY2xvc2luZyBxdW90ZSwgYWJvcnQgdGhlIGxpbmUuICovCi0gICAgICBpZiAoc3RyaW5nW2ldID09ICdcMCcpCi0gICAgICAgIHsKLSAgICAgICAgICBfcmxfaW5pdF9maWxlX2Vycm9yICgibm8gY2xvc2luZyBgXCInIGluIGtleSBiaW5kaW5nIik7Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgLyogQWR2YW5jZSB0byB0aGUgY29sb24gKDopIG9yIHdoaXRlc3BhY2Ugd2hpY2ggc2VwYXJhdGVzIHRoZSB0d28gb2JqZWN0cy4gKi8KLSAgZm9yICg7IChjID0gc3RyaW5nW2ldKSAmJiBjICE9ICc6JyAmJiBjICE9ICcgJyAmJiBjICE9ICdcdCc7IGkrKyApOwotCi0gIGVxdWl2YWxlbmN5ID0gKGMgPT0gJzonICYmIHN0cmluZ1tpICsgMV0gPT0gJz0nKTsKLQotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKG9yIGtleW5hbWUpLiAqLwotICBpZiAoc3RyaW5nW2ldKQotICAgIHN0cmluZ1tpKytdID0gJ1wwJzsKLQotICAvKiBJZiBkb2luZyBhc3NpZ25tZW50LCBza2lwIHRoZSAnPScgc2lnbiBhcyB3ZWxsLiAqLwotICBpZiAoZXF1aXZhbGVuY3kpCi0gICAgc3RyaW5nW2krK10gPSAnXDAnOwotCi0gIC8qIElmIHRoaXMgaXMgYSBjb21tYW5kIHRvIHNldCBhIHZhcmlhYmxlLCB0aGVuIGRvIHRoYXQuICovCi0gIGlmIChfcmxfc3RyaWNtcCAoc3RyaW5nLCAic2V0IikgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICp2YXIgPSBzdHJpbmcgKyBpOwotICAgICAgY2hhciAqdmFsdWU7Ci0KLSAgICAgIC8qIE1ha2UgVkFSIHBvaW50IHRvIHN0YXJ0IG9mIHZhcmlhYmxlIG5hbWUuICovCi0gICAgICB3aGlsZSAoKnZhciAmJiB3aGl0ZXNwYWNlICgqdmFyKSkgdmFyKys7Ci0KLSAgICAgIC8qIE1ha2UgdmFsdWUgcG9pbnQgdG8gc3RhcnQgb2YgdmFsdWUgc3RyaW5nLiAqLwotICAgICAgdmFsdWUgPSB2YXI7Ci0gICAgICB3aGlsZSAoKnZhbHVlICYmICF3aGl0ZXNwYWNlICgqdmFsdWUpKSB2YWx1ZSsrOwotICAgICAgaWYgKCp2YWx1ZSkKLQkqdmFsdWUrKyA9ICdcMCc7Ci0gICAgICB3aGlsZSAoKnZhbHVlICYmIHdoaXRlc3BhY2UgKCp2YWx1ZSkpIHZhbHVlKys7Ci0KLSAgICAgIHJsX3ZhcmlhYmxlX2JpbmQgKHZhciwgdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNraXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiBrZXluYW1lIGFuZCBmdW5uYW1lLiAqLwotICBmb3IgKDsgc3RyaW5nW2ldICYmIHdoaXRlc3BhY2UgKHN0cmluZ1tpXSk7IGkrKyk7Ci0gIGZ1bm5hbWUgPSAmc3RyaW5nW2ldOwotCi0gIC8qIE5vdyBpc29sYXRlIGZ1bm5hbWUuCi0gICAgIEZvciBzdHJhaWdodCBmdW5jdGlvbiBuYW1lcyBqdXN0IGxvb2sgZm9yIHdoaXRlc3BhY2UsIHNpbmNlCi0gICAgIHRoYXQgd2lsbCBzaWduaWZ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIEJ1dCB0aGlzIGNvdWxkIGJlIGEKLSAgICAgbWFjcm8gZGVmaW5pdGlvbi4gIEluIHRoYXQgY2FzZSwgdGhlIHN0cmluZyBpcyBxdW90ZWQsIHNvIHNraXAKLSAgICAgdG8gdGhlIG1hdGNoaW5nIGRlbGltaXRlci4gIFdlIGFsbG93IHRoZSBiYWNrc2xhc2ggdG8gcXVvdGUgdGhlCi0gICAgIGRlbGltaXRlciBjaGFyYWN0ZXJzIGluIHRoZSBtYWNybyBib2R5LiAqLwotICAvKiBUaGlzIGNvZGUgZXhpc3RzIHRvIGFsbG93IHdoaXRlc3BhY2UgaW4gbWFjcm8gZXhwYW5zaW9ucywgd2hpY2gKLSAgICAgd291bGQgb3RoZXJ3aXNlIGJlIGdvYmJsZWQgdXAgYnkgdGhlIG5leHQgYGZvcicgbG9vcC4qLwotICAvKiBYWFggLSBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGFsbG93IGJhY2tzbGFzaCBxdW90aW5nIG9ubHkgaWYgIiBpcwotICAgICB0aGUgcXVvdGVkIHN0cmluZyBkZWxpbWl0ZXIsIGxpa2UgdGhlIHNoZWxsLiAqLwotICBpZiAoKmZ1bm5hbWUgPT0gJ1wnJyB8fCAqZnVubmFtZSA9PSAnIicpCi0gICAgewotICAgICAgaW50IGRlbGltaXRlciA9IHN0cmluZ1tpKytdLCBwYXNzYzsKLQotICAgICAgZm9yIChwYXNzYyA9IDA7IGMgPSBzdHJpbmdbaV07IGkrKykKLQl7Ci0JICBpZiAocGFzc2MpCi0JICAgIHsKLQkgICAgICBwYXNzYyA9IDA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKGMgPT0gJ1xcJykKLQkgICAgewotCSAgICAgIHBhc3NjID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoYyA9PSBkZWxpbWl0ZXIpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChjKQotCWkrKzsKLSAgICB9Ci0KLSAgLyogQWR2YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICAqLwotICBmb3IgKDsgc3RyaW5nW2ldICYmICF3aGl0ZXNwYWNlIChzdHJpbmdbaV0pOyBpKyspOwotCi0gIC8qIE5vIGV4dHJhIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAqLwotICBzdHJpbmdbaV0gPSAnXDAnOwotCi0gIC8qIEhhbmRsZSBlcXVpdmFsZW5jeSBiaW5kaW5ncyBoZXJlLiAgTWFrZSB0aGUgbGVmdC1oYW5kIHNpZGUgYmUgZXhhY3RseQotICAgICB3aGF0ZXZlciB0aGUgcmlnaHQtaGFuZCBldmFsdWF0ZXMgdG8sIGluY2x1ZGluZyBrZXltYXBzLiAqLwotICBpZiAoZXF1aXZhbGVuY3kpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBuZXctc3R5bGUga2V5LWJpbmRpbmcsIHRoZW4gZG8gdGhlIGJpbmRpbmcgd2l0aAotICAgICBybF9zZXRfa2V5ICgpLiAgT3RoZXJ3aXNlLCBsZXQgdGhlIG9sZGVyIGNvZGUgZGVhbCB3aXRoIGl0LiAqLwotICBpZiAoKnN0cmluZyA9PSAnIicpCi0gICAgewotICAgICAgY2hhciAqc2VxOwotICAgICAgcmVnaXN0ZXIgaW50IGosIGssIHBhc3NjOwotCi0gICAgICBzZXEgPSB4bWFsbG9jICgxICsgc3RybGVuIChzdHJpbmcpKTsKLSAgICAgIGZvciAoaiA9IDEsIGsgPSBwYXNzYyA9IDA7IHN0cmluZ1tqXTsgaisrKQotCXsKLQkgIC8qIEFsbG93IGJhY2tzbGFzaCB0byBxdW90ZSBjaGFyYWN0ZXJzLCBidXQgbGVhdmUgdGhlbSBpbiBwbGFjZS4KLQkgICAgIFRoaXMgYWxsb3dzIGEgc3RyaW5nIHRvIGVuZCB3aXRoIGEgYmFja3NsYXNoIHF1b3RpbmcgYW5vdGhlcgotCSAgICAgYmFja3NsYXNoLCBvciB3aXRoIGEgYmFja3NsYXNoIHF1b3RpbmcgYSBkb3VibGUgcXVvdGUuICBUaGUKLQkgICAgIGJhY2tzbGFzaGVzIGFyZSBsZWZ0IGluIHBsYWNlIGZvciBybF90cmFuc2xhdGVfa2V5c2VxICgpLiAqLwotCSAgaWYgKHBhc3NjIHx8IChzdHJpbmdbal0gPT0gJ1xcJykpCi0JICAgIHsKLQkgICAgICBzZXFbaysrXSA9IHN0cmluZ1tqXTsKLQkgICAgICBwYXNzYyA9ICFwYXNzYzsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoc3RyaW5nW2pdID09ICciJykKLQkgICAgYnJlYWs7Ci0KLQkgIHNlcVtrKytdID0gc3RyaW5nW2pdOwotCX0KLSAgICAgIHNlcVtrXSA9ICdcMCc7Ci0KLSAgICAgIC8qIEJpbmRpbmcgbWFjcm8/ICovCi0gICAgICBpZiAoKmZ1bm5hbWUgPT0gJ1wnJyB8fCAqZnVubmFtZSA9PSAnIicpCi0JewotCSAgaiA9IHN0cmxlbiAoZnVubmFtZSk7Ci0KLQkgIC8qIFJlbW92ZSB0aGUgZGVsaW1pdGluZyBxdW90ZXMgZnJvbSBlYWNoIGVuZCBvZiBGVU5OQU1FLiAqLwotCSAgaWYgKGogJiYgZnVubmFtZVtqIC0gMV0gPT0gKmZ1bm5hbWUpCi0JICAgIGZ1bm5hbWVbaiAtIDFdID0gJ1wwJzsKLQotCSAgcmxfbWFjcm9fYmluZCAoc2VxLCAmZnVubmFtZVsxXSwgX3JsX2tleW1hcCk7Ci0JfQotICAgICAgZWxzZQotCXJsX3NldF9rZXkgKHNlcSwgcmxfbmFtZWRfZnVuY3Rpb24gKGZ1bm5hbWUpLCBfcmxfa2V5bWFwKTsKLQotICAgICAgZnJlZSAoc2VxKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGFjdHVhbCBjaGFyYWN0ZXIgd2Ugd2FudCB0byBkZWFsIHdpdGguICovCi0gIGtuYW1lID0gc3RycmNociAoc3RyaW5nLCAnLScpOwotICBpZiAoIWtuYW1lKQotICAgIGtuYW1lID0gc3RyaW5nOwotICBlbHNlCi0gICAga25hbWUrKzsKLQotICBrZXkgPSBnbGVhbl9rZXlfZnJvbV9uYW1lIChrbmFtZSk7Ci0KLSAgLyogQWRkIGluIGNvbnRyb2wgYW5kIG1ldGEgYml0cy4gKi8KLSAgaWYgKHN1YnN0cmluZ19tZW1iZXJfb2ZfYXJyYXkgKHN0cmluZywgcG9zc2libGVfY29udHJvbF9wcmVmaXhlcykpCi0gICAga2V5ID0gQ1RSTCAoX3JsX3RvX3VwcGVyIChrZXkpKTsKLQotICBpZiAoc3Vic3RyaW5nX21lbWJlcl9vZl9hcnJheSAoc3RyaW5nLCBwb3NzaWJsZV9tZXRhX3ByZWZpeGVzKSkKLSAgICBrZXkgPSBNRVRBIChrZXkpOwotCi0gIC8qIFRlbXBvcmFyeS4gIEhhbmRsZSBvbGQtc3R5bGUga2V5bmFtZSB3aXRoIG1hY3JvLWJpbmRpbmcuICovCi0gIGlmICgqZnVubmFtZSA9PSAnXCcnIHx8ICpmdW5uYW1lID09ICciJykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHVzZXFbMl07Ci0gICAgICBpbnQgZmwgPSBzdHJsZW4gKGZ1bm5hbWUpOwotCi0gICAgICB1c2VxWzBdID0ga2V5OyB1c2VxWzFdID0gJ1wwJzsKLSAgICAgIGlmIChmbCAmJiBmdW5uYW1lW2ZsIC0gMV0gPT0gKmZ1bm5hbWUpCi0JZnVubmFtZVtmbCAtIDFdID0gJ1wwJzsKLQotICAgICAgcmxfbWFjcm9fYmluZCAodXNlcSwgJmZ1bm5hbWVbMV0sIF9ybF9rZXltYXApOwotICAgIH0KLSNpZiBkZWZpbmVkIChQUkVGSVhfTUVUQV9IQUNLKQotICAvKiBVZ2x5LCBidXQgd29ya2luZyBoYWNrIHRvIGtlZXAgcHJlZml4LW1ldGEgYXJvdW5kLiAqLwotICBlbHNlIGlmIChfcmxfc3RyaWNtcCAoZnVubmFtZSwgInByZWZpeC1tZXRhIikgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIHNlcVsyXTsKLQotICAgICAgc2VxWzBdID0ga2V5OwotICAgICAgc2VxWzFdID0gJ1wwJzsKLSAgICAgIHJsX2dlbmVyaWNfYmluZCAoSVNLTUFQLCBzZXEsIChjaGFyICopZW1hY3NfbWV0YV9rZXltYXAsIF9ybF9rZXltYXApOwotICAgIH0KLSNlbmRpZiAvKiBQUkVGSVhfTUVUQV9IQUNLICovCi0gIGVsc2UKLSAgICBybF9iaW5kX2tleSAoa2V5LCBybF9uYW1lZF9mdW5jdGlvbiAoZnVubmFtZSkpOwotICByZXR1cm4gMDsKLX0KLQotLyogU2ltcGxlIHN0cnVjdHVyZSBmb3IgYm9vbGVhbiByZWFkbGluZSB2YXJpYWJsZXMgKGkuZS4sIHRob3NlIHRoYXQgY2FuCi0gICBoYXZlIG9uZSBvZiB0d28gdmFsdWVzOyBlaXRoZXIgIk9uIiBvciAxIGZvciB0cnV0aCwgb3IgIk9mZiIgb3IgMCBmb3IKLSAgIGZhbHNlLiAqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgaW50ICp2YWx1ZTsKLX0gYm9vbGVhbl92YXJsaXN0IFtdID0gewotI2lmIGRlZmluZWQgKFBBUkVOX01BVENISU5HKQotICB7ICJibGluay1tYXRjaGluZy1wYXJlbiIsCSZybF9ibGlua19tYXRjaGluZ19wYXJlbiB9LAotI2VuZGlmCi0gIHsgImNvbXBsZXRpb24taWdub3JlLWNhc2UiLAkmX3JsX2NvbXBsZXRpb25fY2FzZV9mb2xkIH0sCi0gIHsgImNvbnZlcnQtbWV0YSIsCQkmX3JsX2NvbnZlcnRfbWV0YV9jaGFyc190b19hc2NpaSB9LAotICB7ICJkaXNhYmxlLWNvbXBsZXRpb24iLAkmcmxfaW5oaWJpdF9jb21wbGV0aW9uIH0sCi0gIHsgImVuYWJsZS1rZXlwYWQiLAkJJl9ybF9lbmFibGVfa2V5cGFkIH0sCi0gIHsgImV4cGFuZC10aWxkZSIsCQkmcmxfY29tcGxldGVfd2l0aF90aWxkZV9leHBhbnNpb24gfSwKLSAgeyAiaG9yaXpvbnRhbC1zY3JvbGwtbW9kZSIsCSZfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZSB9LAotICB7ICJpbnB1dC1tZXRhIiwJCSZfcmxfbWV0YV9mbGFnIH0sCi0gIHsgIm1hcmstZGlyZWN0b3JpZXMiLAkJJl9ybF9jb21wbGV0ZV9tYXJrX2RpcmVjdG9yaWVzIH0sCi0gIHsgIm1hcmstbW9kaWZpZWQtbGluZXMiLAkmX3JsX21hcmtfbW9kaWZpZWRfbGluZXMgfSwKLSAgeyAibWV0YS1mbGFnIiwJCSZfcmxfbWV0YV9mbGFnIH0sCi0gIHsgIm91dHB1dC1tZXRhIiwJCSZfcmxfb3V0cHV0X21ldGFfY2hhcnMgfSwKLSAgeyAicHJpbnQtY29tcGxldGlvbnMtaG9yaXpvbnRhbGx5IiwgJl9ybF9wcmludF9jb21wbGV0aW9uc19ob3Jpem9udGFsbHkgfSwKLSAgeyAic2hvdy1hbGwtaWYtYW1iaWd1b3VzIiwJJl9ybF9jb21wbGV0ZV9zaG93X2FsbCB9LAotI2lmIGRlZmluZWQgKFZJU0lCTEVfU1RBVFMpCi0gIHsgInZpc2libGUtc3RhdHMiLAkJJnJsX3Zpc2libGVfc3RhdHMgfSwKLSNlbmRpZiAvKiBWSVNJQkxFX1NUQVRTICovCi0gIHsgKGNoYXIgKilOVUxMLCAoaW50ICopTlVMTCB9Ci19OwotCi1pbnQKLXJsX3ZhcmlhYmxlX2JpbmQgKG5hbWUsIHZhbHVlKQotICAgICBjaGFyICpuYW1lLCAqdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIC8qIENoZWNrIGZvciBzaW1wbGUgdmFyaWFibGVzIGZpcnN0LiAqLwotICBmb3IgKGkgPSAwOyBib29sZWFuX3Zhcmxpc3RbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChfcmxfc3RyaWNtcCAobmFtZSwgYm9vbGVhbl92YXJsaXN0W2ldLm5hbWUpID09IDApCi0JewotCSAgLyogQSB2YXJpYWJsZSBpcyBUUlVFIGlmIHRoZSAidmFsdWUiIGlzICJvbiIsICIxIiBvciAiIi4gKi8KLQkgICpib29sZWFuX3Zhcmxpc3RbaV0udmFsdWUgPSAqdmFsdWUgPT0gMCB8fAotCSAgCQkJICAgICAgX3JsX3N0cmljbXAgKHZhbHVlLCAib24iKSA9PSAwIHx8Ci0JCQkJICAgICAgKHZhbHVlWzBdID09ICcxJyAmJiB2YWx1ZVsxXSA9PSAnXDAnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogTm90IGEgYm9vbGVhbiB2YXJpYWJsZSwgc28gY2hlY2sgZm9yIHNwZWNpYWxzLiAqLwotCi0gIC8qIEVkaXRpbmcgbW9kZSBjaGFuZ2U/ICovCi0gIGlmIChfcmxfc3RyaWNtcCAobmFtZSwgImVkaXRpbmctbW9kZSIpID09IDApCi0gICAgewotICAgICAgaWYgKF9ybF9zdHJuaWNtcCAodmFsdWUsICJ2aSIsIDIpID09IDApCi0JewotI2lmIGRlZmluZWQgKFZJX01PREUpCi0JICBfcmxfa2V5bWFwID0gdmlfaW5zZXJ0aW9uX2tleW1hcDsKLQkgIHJsX2VkaXRpbmdfbW9kZSA9IHZpX21vZGU7Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKF9ybF9zdHJuaWNtcCAodmFsdWUsICJlbWFjcyIsIDUpID09IDApCi0JewotCSAgX3JsX2tleW1hcCA9IGVtYWNzX3N0YW5kYXJkX2tleW1hcDsKLQkgIHJsX2VkaXRpbmdfbW9kZSA9IGVtYWNzX21vZGU7Ci0JfQotICAgIH0KLQotICAvKiBDb21tZW50IHN0cmluZyBjaGFuZ2U/ICovCi0gIGVsc2UgaWYgKF9ybF9zdHJpY21wIChuYW1lLCAiY29tbWVudC1iZWdpbiIpID09IDApCi0gICAgewotICAgICAgaWYgKCp2YWx1ZSkKLQl7Ci0JICBpZiAoX3JsX2NvbW1lbnRfYmVnaW4pCi0JICAgIGZyZWUgKF9ybF9jb21tZW50X2JlZ2luKTsKLQotCSAgX3JsX2NvbW1lbnRfYmVnaW4gPSBzYXZlc3RyaW5nICh2YWx1ZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoX3JsX3N0cmljbXAgKG5hbWUsICJjb21wbGV0aW9uLXF1ZXJ5LWl0ZW1zIikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbnZhbCA9IDEwMDsKLSAgICAgIGlmICgqdmFsdWUpCi0JewotCSAgbnZhbCA9IGF0b2kgKHZhbHVlKTsKLQkgIGlmIChudmFsIDwgMCkKLQkgICAgbnZhbCA9IDA7Ci0JfQotICAgICAgcmxfY29tcGxldGlvbl9xdWVyeV9pdGVtcyA9IG52YWw7Ci0gICAgfQotICBlbHNlIGlmIChfcmxfc3RyaWNtcCAobmFtZSwgImtleW1hcCIpID09IDApCi0gICAgewotICAgICAgS2V5bWFwIGttYXA7Ci0gICAgICBrbWFwID0gcmxfZ2V0X2tleW1hcF9ieV9uYW1lICh2YWx1ZSk7Ci0gICAgICBpZiAoa21hcCkKLSAgICAgICAgcmxfc2V0X2tleW1hcCAoa21hcCk7Ci0gICAgfQotICBlbHNlIGlmIChfcmxfc3RyaWNtcCAobmFtZSwgImJlbGwtc3R5bGUiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICghKnZhbHVlKQotICAgICAgICBfcmxfYmVsbF9wcmVmZXJlbmNlID0gQVVESUJMRV9CRUxMOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKF9ybF9zdHJpY21wICh2YWx1ZSwgIm5vbmUiKSA9PSAwIHx8IF9ybF9zdHJpY21wICh2YWx1ZSwgIm9mZiIpID09IDApCi0gICAgICAgICAgICBfcmxfYmVsbF9wcmVmZXJlbmNlID0gTk9fQkVMTDsKLSAgICAgICAgICBlbHNlIGlmIChfcmxfc3RyaWNtcCAodmFsdWUsICJhdWRpYmxlIikgPT0gMCB8fCBfcmxfc3RyaWNtcCAodmFsdWUsICJvbiIpID09IDApCi0gICAgICAgICAgICBfcmxfYmVsbF9wcmVmZXJlbmNlID0gQVVESUJMRV9CRUxMOwotICAgICAgICAgIGVsc2UgaWYgKF9ybF9zdHJpY21wICh2YWx1ZSwgInZpc2libGUiKSA9PSAwKQotICAgICAgICAgICAgX3JsX2JlbGxfcHJlZmVyZW5jZSA9IFZJU0lCTEVfQkVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZSBpZiAoX3JsX3N0cmljbXAgKG5hbWUsICJwcmVmZXItdmlzaWJsZS1iZWxsIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLSAgICAgIGlmICgqdmFsdWUgJiYgKF9ybF9zdHJpY21wICh2YWx1ZSwgIm9uIikgPT0gMCB8fAotCQkgICAgICgqdmFsdWUgPT0gJzEnICYmICF2YWx1ZVsxXSkpKQotICAgICAgICBfcmxfYmVsbF9wcmVmZXJlbmNlID0gVklTSUJMRV9CRUxMOwotICAgICAgZWxzZQotICAgICAgICBfcmxfYmVsbF9wcmVmZXJlbmNlID0gQVVESUJMRV9CRUxMOwotICAgIH0KLSAgZWxzZSBpZiAoX3JsX3N0cmljbXAgKG5hbWUsICJpc2VhcmNoLXRlcm1pbmF0b3JzIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJc29sYXRlIHRoZSB2YWx1ZSBhbmQgdHJhbnNsYXRlIGl0IGludG8gYSBjaGFyYWN0ZXIgc3RyaW5nLiAqLwotICAgICAgaW50IGJlZywgZW5kOwotICAgICAgY2hhciAqdjsKLQotICAgICAgdiA9IHNhdmVzdHJpbmcgKHZhbHVlKTsKLSAgICAgIEZSRUUgKF9ybF9pc2VhcmNoX3Rlcm1pbmF0b3JzKTsKLSAgICAgIGlmICh2WzBdID09ICciJyB8fCB2WzBdID09ICdcJycpCi0JewotCSAgaW50IGRlbGltID0gdlswXTsKLQkgIGZvciAoYmVnID0gZW5kID0gMTsgdltlbmRdICYmIHZbZW5kXSAhPSBkZWxpbTsgZW5kKyspCi0JICAgIDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChiZWcgPSBlbmQgPSAwOyB3aGl0ZXNwYWNlICh2W2VuZF0pID09IDA7IGVuZCsrKQotCSAgICA7Ci0JfQotCi0gICAgICB2W2VuZF0gPSAnXDAnOwotICAgICAgLyogVGhlIHZhbHVlIHN0YXJ0cyBhdCB2ICsgYmVnLiAgVHJhbnNsYXRlIGl0IGludG8gYSBjaGFyYWN0ZXIgc3RyaW5nLiAqLwotICAgICAgX3JsX2lzZWFyY2hfdGVybWluYXRvcnMgPSAodW5zaWduZWQgY2hhciAqKXhtYWxsb2MgKDIgKiBzdHJsZW4gKHYpICsgMSk7Ci0gICAgICBybF90cmFuc2xhdGVfa2V5c2VxICh2ICsgYmVnLCBfcmxfaXNlYXJjaF90ZXJtaW5hdG9ycywgJmVuZCk7Ci0gICAgICBfcmxfaXNlYXJjaF90ZXJtaW5hdG9yc1tlbmRdID0gJ1wwJzsKLSAgICAgIGZyZWUgKHYpOwotICAgIH0KLSAgICAgIAotICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIHVua25vd24gdmFyaWFibGUgbmFtZXMgYXJlIHNpbXBseSBpZ25vcmVkLiAqLwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgd2hpY2ggbWF0Y2hlcyBOQU1FLgotICAgRm9yIGV4YW1wbGUsIGBTcGFjZScgcmV0dXJucyAnICcuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfSBhc3NvY19saXN0OwotCi1zdGF0aWMgYXNzb2NfbGlzdCBuYW1lX2tleV9hbGlzdFtdID0gewotICB7ICJERUwiLCAweDdmIH0sCi0gIHsgIkVTQyIsICdcMDMzJyB9LAotICB7ICJFc2NhcGUiLCAnXDAzMycgfSwKLSAgeyAiTEZEIiwgJ1xuJyB9LAotICB7ICJOZXdsaW5lIiwgJ1xuJyB9LAotICB7ICJSRVQiLCAnXHInIH0sCi0gIHsgIlJldHVybiIsICdccicgfSwKLSAgeyAiUnVib3V0IiwgMHg3ZiB9LAotICB7ICJTUEMiLCAnICcgfSwKLSAgeyAiU3BhY2UiLCAnICcgfSwKLSAgeyAiVGFiIiwgMHgwOSB9LAotICB7IChjaGFyICopMHgwLCAwIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWdsZWFuX2tleV9mcm9tX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IG5hbWVfa2V5X2FsaXN0W2ldLm5hbWU7IGkrKykKLSAgICBpZiAoX3JsX3N0cmljbXAgKG5hbWUsIG5hbWVfa2V5X2FsaXN0W2ldLm5hbWUpID09IDApCi0gICAgICByZXR1cm4gKG5hbWVfa2V5X2FsaXN0W2ldLnZhbHVlKTsKLQotICByZXR1cm4gKCoodW5zaWduZWQgY2hhciAqKW5hbWUpOwkvKiBYWFggd2FzIHJldHVybiAoKm5hbWUpICovCi19Ci0KLS8qIEF1eGlsaWFyeSBmdW5jdGlvbnMgdG8gbWFuYWdlIGtleW1hcHMuICovCi1zdGF0aWMgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgS2V5bWFwIG1hcDsKLX0ga2V5bWFwX25hbWVzW10gPSB7Ci0gIHsgImVtYWNzIiwgZW1hY3Nfc3RhbmRhcmRfa2V5bWFwIH0sCi0gIHsgImVtYWNzLXN0YW5kYXJkIiwgZW1hY3Nfc3RhbmRhcmRfa2V5bWFwIH0sCi0gIHsgImVtYWNzLW1ldGEiLCBlbWFjc19tZXRhX2tleW1hcCB9LAotICB7ICJlbWFjcy1jdGx4IiwgZW1hY3NfY3RseF9rZXltYXAgfSwKLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICB7ICJ2aSIsIHZpX21vdmVtZW50X2tleW1hcCB9LAotICB7ICJ2aS1tb3ZlIiwgdmlfbW92ZW1lbnRfa2V5bWFwIH0sCi0gIHsgInZpLWNvbW1hbmQiLCB2aV9tb3ZlbWVudF9rZXltYXAgfSwKLSAgeyAidmktaW5zZXJ0IiwgdmlfaW5zZXJ0aW9uX2tleW1hcCB9LAotI2VuZGlmIC8qIFZJX01PREUgKi8KLSAgeyAoY2hhciAqKTB4MCwgKEtleW1hcCkweDAgfQotfTsKLQotS2V5bWFwCi1ybF9nZXRfa2V5bWFwX2J5X25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGtleW1hcF9uYW1lc1tpXS5uYW1lOyBpKyspCi0gICAgaWYgKHN0cmNtcCAobmFtZSwga2V5bWFwX25hbWVzW2ldLm5hbWUpID09IDApCi0gICAgICByZXR1cm4gKGtleW1hcF9uYW1lc1tpXS5tYXApOwotICByZXR1cm4gKChLZXltYXApIE5VTEwpOwotfQotCi1jaGFyICoKLXJsX2dldF9rZXltYXBfbmFtZSAobWFwKQotICAgICBLZXltYXAgbWFwOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgZm9yIChpID0gMDsga2V5bWFwX25hbWVzW2ldLm5hbWU7IGkrKykKLSAgICBpZiAobWFwID09IGtleW1hcF9uYW1lc1tpXS5tYXApCi0gICAgICByZXR1cm4gKGtleW1hcF9uYW1lc1tpXS5uYW1lKTsKLSAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotfQotICAKLXZvaWQKLXJsX3NldF9rZXltYXAgKG1hcCkKLSAgICAgS2V5bWFwIG1hcDsKLXsKLSAgaWYgKG1hcCkKLSAgICBfcmxfa2V5bWFwID0gbWFwOwotfQotCi1LZXltYXAKLXJsX2dldF9rZXltYXAgKCkKLXsKLSAgcmV0dXJuIChfcmxfa2V5bWFwKTsKLX0KLQotdm9pZAotcmxfc2V0X2tleW1hcF9mcm9tX2VkaXRfbW9kZSAoKQotewotICBpZiAocmxfZWRpdGluZ19tb2RlID09IGVtYWNzX21vZGUpCi0gICAgX3JsX2tleW1hcCA9IGVtYWNzX3N0YW5kYXJkX2tleW1hcDsKLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICBlbHNlIGlmIChybF9lZGl0aW5nX21vZGUgPT0gdmlfbW9kZSkKLSAgICBfcmxfa2V5bWFwID0gdmlfaW5zZXJ0aW9uX2tleW1hcDsKLSNlbmRpZiAvKiBWSV9NT0RFICovCi19Ci0KLWNoYXIgKgotcmxfZ2V0X2tleW1hcF9uYW1lX2Zyb21fZWRpdF9tb2RlICgpCi17Ci0gIGlmIChybF9lZGl0aW5nX21vZGUgPT0gZW1hY3NfbW9kZSkKLSAgICByZXR1cm4gImVtYWNzIjsKLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICBlbHNlIGlmIChybF9lZGl0aW5nX21vZGUgPT0gdmlfbW9kZSkKLSAgICByZXR1cm4gInZpIjsKLSNlbmRpZiAvKiBWSV9NT0RFICovCi0gIGVsc2UKLSAgICByZXR1cm4gIm5vbmUiOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJICBLZXkgQmluZGluZyBhbmQgRnVuY3Rpb24gSW5mb3JtYXRpb24JCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb2R1Y2VzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgc3RhdGUgb2Yga2V5YmluZGluZ3MgYW5kIGZ1bmN0aW9ucyBrbm93biB0byBSZWFkbGluZS4gIFRoZSBpbmZvCi0gICBpcyBhbHdheXMgcHJpbnRlZCB0byBybF9vdXRzdHJlYW0sIGFuZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuCi0gICBiZSByZWFkIGJhY2sgaW4gKGkuZS4sIHBhc3NlZCB0byBybF9wYXJzZV9hbmRfYmluZCAoKS4gKi8KLQotLyogUHJpbnQgdGhlIG5hbWVzIG9mIGZ1bmN0aW9ucyBrbm93biB0byBSZWFkbGluZS4gKi8KLXZvaWQKLXJsX2xpc3RfZnVubWFwX25hbWVzICgpCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBjaGFyICoqZnVubWFwX25hbWVzOwotCi0gIGZ1bm1hcF9uYW1lcyA9IHJsX2Z1bm1hcF9uYW1lcyAoKTsKLQotICBpZiAoIWZ1bm1hcF9uYW1lcykKLSAgICByZXR1cm47Ci0KLSAgZm9yIChpID0gMDsgZnVubWFwX25hbWVzW2ldOyBpKyspCi0gICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiJXNcbiIsIGZ1bm1hcF9uYW1lc1tpXSk7Ci0KLSAgZnJlZSAoZnVubWFwX25hbWVzKTsKLX0KLQotc3RhdGljIGNoYXIgKgotX3JsX2dldF9rZXluYW1lIChrZXkpCi0gICAgIGludCBrZXk7Ci17Ci0gIGNoYXIgKmtleW5hbWU7Ci0gIGludCBpLCBjOwotCi0gIGtleW5hbWUgPSAoY2hhciAqKXhtYWxsb2MgKDgpOwotCi0gIGMgPSBrZXk7Ci0gIC8qIFNpbmNlIHRoaXMgaXMgZ29pbmcgdG8gYmUgdXNlZCB0byB3cml0ZSBvdXQga2V5c2VxdWVuY2UtZnVuY3Rpb24KLSAgICAgcGFpcnMgZm9yIHBvc3NpYmxlIGluY2x1c2lvbiBpbiBhbiBpbnB1dHJjIGZpbGUsIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgZG8gYW55IHNwZWNpYWwgbWV0YSBwcm9jZXNzaW5nIG9uIEtFWS4gKi8KLQotI2lmIDAKLSAgLyogV2UgbWlnaHQgd2FudCB0byBkbyB0aGlzLCBidXQgdGhlIG9sZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIGRpZCBub3QuICovCi0KLSAgLyogSWYgdGhpcyBpcyBhbiBlc2NhcGUgY2hhcmFjdGVyLCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueSBtb3JlIHByb2Nlc3NpbmcuCi0gICAgIEp1c3QgYWRkIHRoZSBzcGVjaWFsIEVTQyBrZXkgc2VxdWVuY2UgYW5kIHJldHVybi4gKi8KLSAgaWYgKGMgPT0gRVNDKQotICAgIHsKLSAgICAgIGtleXNlcVswXSA9ICdcXCc7Ci0gICAgICBrZXlzZXFbMV0gPSAnZSc7Ci0gICAgICBrZXlzZXFbMl0gPSAnXDAnOwotICAgICAgcmV0dXJuIGtleXNlcTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBSVUJPVVQgaXMgdHJhbnNsYXRlZCBkaXJlY3RseSBpbnRvIFxDLT8gKi8KLSAgaWYgKGtleSA9PSBSVUJPVVQpCi0gICAgewotICAgICAga2V5bmFtZVswXSA9ICdcXCc7Ci0gICAgICBrZXluYW1lWzFdID0gJ0MnOwotICAgICAga2V5bmFtZVsyXSA9ICctJzsKLSAgICAgIGtleW5hbWVbM10gPSAnPyc7Ci0gICAgICBrZXluYW1lWzRdID0gJ1wwJzsKLSAgICAgIHJldHVybiBrZXluYW1lOwotICAgIH0KLQotICBpID0gMDsKLSAgLyogTm93IGFkZCBzcGVjaWFsIHByZWZpeGVzIG5lZWRlZCBmb3IgY29udHJvbCBjaGFyYWN0ZXJzLiAgVGhpcyBjYW4KLSAgICAgcG90ZW50aWFsbHkgY2hhbmdlIEMuICovCi0gIGlmIChDVFJMX0NIQVIgKGMpKQotICAgIHsKLSAgICAgIGtleW5hbWVbaSsrXSA9ICdcXCc7Ci0gICAgICBrZXluYW1lW2krK10gPSAnQyc7Ci0gICAgICBrZXluYW1lW2krK10gPSAnLSc7Ci0gICAgICBjID0gX3JsX3RvX2xvd2VyIChVTkNUUkwgKGMpKTsKLSAgICB9Ci0KLSAgLyogWFhYIGV4cGVyaW1lbnRhbCBjb2RlLiAgVHVybiB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgQVNDSUkgb3IKLSAgICAgSVNPIExhdGluIDEgKDEyOCAtIDE1OSkgaW50byBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzIChcMjAwIC0gXDIzNykuCi0gICAgIFRoaXMgY2hhbmdlcyBDLiAqLwotICBpZiAoYyA+PSAxMjggJiYgYyA8PSAxNTkpCi0gICAgewotICAgICAga2V5bmFtZVtpKytdID0gJ1xcJzsKLSAgICAgIGtleW5hbWVbaSsrXSA9ICcyJzsKLSAgICAgIGMgLT0gMTI4OwotICAgICAga2V5bmFtZVtpKytdID0gKGMgLyA4KSArICcwJzsKLSAgICAgIGMgPSAoYyAlIDgpICsgJzAnOwotICAgIH0KLQotICAvKiBOb3csIGlmIHRoZSBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgcXVvdGVkIHdpdGggYSBiYWNrc2xhc2gsIGRvIHRoYXQuICovCi0gIGlmIChjID09ICdcXCcgfHwgYyA9PSAnIicpCi0gICAga2V5bmFtZVtpKytdID0gJ1xcJzsKLQotICAvKiBOb3cgYWRkIHRoZSBrZXksIHRlcm1pbmF0ZSB0aGUgc3RyaW5nLCBhbmQgcmV0dXJuIGl0LiAqLwotICBrZXluYW1lW2krK10gPSAoY2hhcikgYzsKLSAga2V5bmFtZVtpXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIGtleW5hbWU7Ci19Ci0KLS8qIFJldHVybiBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIHJlcHJlc2VudCB0aGUga2V5Ci0gICBzZXF1ZW5jZXMgdGhhdCBhcmUgdXNlZCB0byBpbnZva2UgRlVOQ1RJT04gaW4gTUFQLiAqLwotY2hhciAqKgotcmxfaW52b2tpbmdfa2V5c2Vxc19pbl9tYXAgKGZ1bmN0aW9uLCBtYXApCi0gICAgIEZ1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgS2V5bWFwIG1hcDsKLXsKLSAgcmVnaXN0ZXIgaW50IGtleTsKLSAgY2hhciAqKnJlc3VsdDsKLSAgaW50IHJlc3VsdF9pbmRleCwgcmVzdWx0X3NpemU7Ci0KLSAgcmVzdWx0ID0gKGNoYXIgKiopTlVMTDsKLSAgcmVzdWx0X2luZGV4ID0gcmVzdWx0X3NpemUgPSAwOwotCi0gIGZvciAoa2V5ID0gMDsga2V5IDwgS0VZTUFQX1NJWkU7IGtleSsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAobWFwW2tleV0udHlwZSkKLQl7Ci0JY2FzZSBJU01BQ1I6Ci0JICAvKiBNYWNyb3MgbWF0Y2gsIGlmLCBhbmQgb25seSBpZiwgdGhlIHBvaW50ZXJzIGFyZSBpZGVudGljYWwuCi0JICAgICBUaHVzLCB0aGV5IGFyZSB0cmVhdGVkIGV4YWN0bHkgbGlrZSBmdW5jdGlvbnMgaW4gaGVyZS4gKi8KLQljYXNlIElTRlVOQzoKLQkgIC8qIElmIHRoZSBmdW5jdGlvbiBpbiB0aGUga2V5bWFwIGlzIHRoZSBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yLAotCSAgICAgdGhlbiBhZGQgdGhlIGN1cnJlbnQgS0VZIHRvIHRoZSBsaXN0IG9mIGludm9raW5nIGtleXMuICovCi0JICBpZiAobWFwW2tleV0uZnVuY3Rpb24gPT0gZnVuY3Rpb24pCi0JICAgIHsKLQkgICAgICBjaGFyICprZXluYW1lOwotCi0JICAgICAga2V5bmFtZSA9IF9ybF9nZXRfa2V5bmFtZSAoa2V5KTsKLQotCSAgICAgIGlmIChyZXN1bHRfaW5kZXggKyAyID4gcmVzdWx0X3NpemUpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHJlc3VsdF9zaXplICs9IDEwOwotCQkgIHJlc3VsdCA9IChjaGFyICoqKSB4cmVhbGxvYyAocmVzdWx0LCByZXN1bHRfc2l6ZSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgICB9Ci0KLQkgICAgICByZXN1bHRbcmVzdWx0X2luZGV4KytdID0ga2V5bmFtZTsKLQkgICAgICByZXN1bHRbcmVzdWx0X2luZGV4XSA9IChjaGFyICopTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIElTS01BUDoKLQkgIHsKLQkgICAgY2hhciAqKnNlcXM7Ci0JICAgIHJlZ2lzdGVyIGludCBpOwotCi0JICAgIC8qIEZpbmQgdGhlIGxpc3Qgb2Yga2V5c2VxcyBpbiB0aGlzIG1hcCB3aGljaCBoYXZlIEZVTkNUSU9OIGFzCi0JICAgICAgIHRoZWlyIHRhcmdldC4gIEFkZCB0aGUga2V5IHNlcXVlbmNlcyBmb3VuZCB0byBSRVNVTFQuICovCi0JICAgIGlmIChtYXBba2V5XS5mdW5jdGlvbikKLQkgICAgICBzZXFzID0KLQkgICAgICAgIHJsX2ludm9raW5nX2tleXNlcXNfaW5fbWFwIChmdW5jdGlvbiwgRlVOQ1RJT05fVE9fS0VZTUFQIChtYXAsIGtleSkpOwotCSAgICBlbHNlCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgaWYgKHNlcXMgPT0gMCkKLQkgICAgICBicmVhazsKLQotCSAgICBmb3IgKGkgPSAwOyBzZXFzW2ldOyBpKyspCi0JICAgICAgewotCQljaGFyICprZXluYW1lID0gKGNoYXIgKil4bWFsbG9jICg2ICsgc3RybGVuIChzZXFzW2ldKSk7Ci0KLQkJaWYgKGtleSA9PSBFU0MpCi0JCSAgc3ByaW50ZiAoa2V5bmFtZSwgIlxcZSIpOwotCQllbHNlIGlmIChDVFJMX0NIQVIgKGtleSkpCi0JCSAgc3ByaW50ZiAoa2V5bmFtZSwgIlxcQy0lYyIsIF9ybF90b19sb3dlciAoVU5DVFJMIChrZXkpKSk7Ci0JCWVsc2UgaWYgKGtleSA9PSBSVUJPVVQpCi0JCSAgc3ByaW50ZiAoa2V5bmFtZSwgIlxcQy0/Iik7Ci0JCWVsc2UgaWYgKGtleSA9PSAnXFwnIHx8IGtleSA9PSAnIicpCi0JCSAgewotCQkgICAga2V5bmFtZVswXSA9ICdcXCc7Ci0JCSAgICBrZXluYW1lWzFdID0gKGNoYXIpIGtleTsKLQkJICAgIGtleW5hbWVbMl0gPSAnXDAnOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGtleW5hbWVbMF0gPSAoY2hhcikga2V5OwotCQkgICAga2V5bmFtZVsxXSA9ICdcMCc7Ci0JCSAgfQotCQkKLQkJc3RyY2F0IChrZXluYW1lLCBzZXFzW2ldKTsKLQkJZnJlZSAoc2Vxc1tpXSk7Ci0KLQkJaWYgKHJlc3VsdF9pbmRleCArIDIgPiByZXN1bHRfc2l6ZSkKLQkJICB7Ci0JCSAgICByZXN1bHRfc2l6ZSArPSAxMDsKLQkJICAgIHJlc3VsdCA9IChjaGFyICoqKSB4cmVhbGxvYyAocmVzdWx0LCByZXN1bHRfc2l6ZSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JCSAgfQotCi0JCXJlc3VsdFtyZXN1bHRfaW5kZXgrK10gPSBrZXluYW1lOwotCQlyZXN1bHRbcmVzdWx0X2luZGV4XSA9IChjaGFyICopTlVMTDsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoc2Vxcyk7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLS8qIFJldHVybiBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIHJlcHJlc2VudCB0aGUga2V5Ci0gICBzZXF1ZW5jZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnZva2UgRlVOQ1RJT04gdXNpbmcgdGhlIGN1cnJlbnQga2V5bWFwLiAqLwotY2hhciAqKgotcmxfaW52b2tpbmdfa2V5c2VxcyAoZnVuY3Rpb24pCi0gICAgIEZ1bmN0aW9uICpmdW5jdGlvbjsKLXsKLSAgcmV0dXJuIChybF9pbnZva2luZ19rZXlzZXFzX2luX21hcCAoZnVuY3Rpb24sIF9ybF9rZXltYXApKTsKLX0KLQotLyogUHJpbnQgYWxsIG9mIHRoZSBmdW5jdGlvbnMgYW5kIHRoZWlyIGJpbmRpbmdzIHRvIHJsX291dHN0cmVhbS4gIElmCi0gICBQUklOVF9SRUFEQUJMWSBpcyBub24temVybywgdGhlbiBwcmludCB0aGUgb3V0cHV0IGluIHN1Y2ggYSB3YXkKLSAgIHRoYXQgaXQgY2FuIGJlIHJlYWQgYmFjayBpbi4gKi8KLXZvaWQKLXJsX2Z1bmN0aW9uX2R1bXBlciAocHJpbnRfcmVhZGFibHkpCi0gICAgIGludCBwcmludF9yZWFkYWJseTsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGNoYXIgKipuYW1lczsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lcyA9IHJsX2Z1bm1hcF9uYW1lcyAoKTsKLQotICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJcbiIpOwotCi0gIGZvciAoaSA9IDA7IG5hbWUgPSBuYW1lc1tpXTsgaSsrKQotICAgIHsKLSAgICAgIEZ1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgIGNoYXIgKippbnZva2VyczsKLQotICAgICAgZnVuY3Rpb24gPSBybF9uYW1lZF9mdW5jdGlvbiAobmFtZSk7Ci0gICAgICBpbnZva2VycyA9IHJsX2ludm9raW5nX2tleXNlcXNfaW5fbWFwIChmdW5jdGlvbiwgX3JsX2tleW1hcCk7Ci0KLSAgICAgIGlmIChwcmludF9yZWFkYWJseSkKLQl7Ci0JICBpZiAoIWludm9rZXJzKQotCSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICIjICVzIChub3QgYm91bmQpXG4iLCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGludCBqOwotCi0JICAgICAgZm9yIChqID0gMDsgaW52b2tlcnNbal07IGorKykKLQkJewotCQkgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIlwiJXNcIjogJXNcbiIsCi0JCQkgICBpbnZva2Vyc1tqXSwgbmFtZSk7Ci0JCSAgZnJlZSAoaW52b2tlcnNbal0pOwotCQl9Ci0KLQkgICAgICBmcmVlIChpbnZva2Vycyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFpbnZva2VycykKLQkgICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiJXMgaXMgbm90IGJvdW5kIHRvIGFueSBrZXlzXG4iLAotCQkgICAgIG5hbWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgaW50IGo7Ci0KLQkgICAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICIlcyBjYW4gYmUgZm91bmQgb24gIiwgbmFtZSk7Ci0KLQkgICAgICBmb3IgKGogPSAwOyBpbnZva2Vyc1tqXSAmJiBqIDwgNTsgaisrKQotCQl7Ci0JCSAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiXCIlc1wiJXMiLCBpbnZva2Vyc1tqXSwKLQkJCSAgIGludm9rZXJzW2ogKyAxXSA/ICIsICIgOiAiLlxuIik7Ci0JCX0KLQotCSAgICAgIGlmIChqID09IDUgJiYgaW52b2tlcnNbal0pCi0JCWZwcmludGYgKHJsX291dHN0cmVhbSwgIi4uLlxuIik7Ci0KLQkgICAgICBmb3IgKGogPSAwOyBpbnZva2Vyc1tqXTsgaisrKQotCQlmcmVlIChpbnZva2Vyc1tqXSk7Ci0KLQkgICAgICBmcmVlIChpbnZva2Vycyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBQcmludCBhbGwgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGFuZCB0aGVpciBiaW5kaW5ncyB0bwotICAgcmxfb3V0c3RyZWFtLiAgSWYgYW4gZXhwbGljaXQgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZW4gcHJpbnQKLSAgIHRoZSBvdXRwdXQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSByZWFkIGJhY2sgaW4uICovCi1pbnQKLXJsX2R1bXBfZnVuY3Rpb25zIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKHJsX2Rpc3BhdGNoaW5nKQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIlxyXG4iKTsKLSAgcmxfZnVuY3Rpb25fZHVtcGVyIChybF9leHBsaWNpdF9hcmcpOwotICBybF9vbl9uZXdfbGluZSAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLV9ybF9tYWNyb19kdW1wZXJfaW50ZXJuYWwgKHByaW50X3JlYWRhYmx5LCBtYXAsIHByZWZpeCkKLSAgICAgaW50IHByaW50X3JlYWRhYmx5OwotICAgICBLZXltYXAgbWFwOwotICAgICBjaGFyICpwcmVmaXg7Ci17Ci0gIHJlZ2lzdGVyIGludCBrZXk7Ci0gIGNoYXIgKmtleW5hbWUsICpvdXQ7Ci0gIGludCBwcmVmaXhfbGVuOwotCi0gIGZvciAoa2V5ID0gMDsga2V5IDwgS0VZTUFQX1NJWkU7IGtleSsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAobWFwW2tleV0udHlwZSkKLQl7Ci0JY2FzZSBJU01BQ1I6Ci0JICBrZXluYW1lID0gX3JsX2dldF9rZXluYW1lIChrZXkpOwotI2lmIDAKLQkgIG91dCA9IChjaGFyICopbWFwW2tleV0uZnVuY3Rpb247Ci0jZWxzZQotCSAgb3V0ID0gX3JsX3VudHJhbnNsYXRlX21hY3JvX3ZhbHVlICgoY2hhciAqKW1hcFtrZXldLmZ1bmN0aW9uKTsKLSNlbmRpZgotCSAgaWYgKHByaW50X3JlYWRhYmx5KQotCSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJcIiVzJXNcIjogXCIlc1wiXG4iLCBwcmVmaXggPyBwcmVmaXggOiAiIiwKLQkJCQkJCSAgICAgICAgIGtleW5hbWUsCi0JCQkJCQkgICAgICAgICBvdXQgPyBvdXQgOiAiIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIiVzJXMgb3V0cHV0cyAlc1xuIiwgcHJlZml4ID8gcHJlZml4IDogIiIsCi0JCQkJCQkJa2V5bmFtZSwKLQkJCQkJCQlvdXQgPyBvdXQgOiAiIik7Ci0JICBmcmVlIChrZXluYW1lKTsKLSNpZiAxCi0JICBmcmVlIChvdXQpOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlIElTRlVOQzoKLQkgIGJyZWFrOwotCWNhc2UgSVNLTUFQOgotCSAgcHJlZml4X2xlbiA9IHByZWZpeCA/IHN0cmxlbiAocHJlZml4KSA6IDA7Ci0JICBpZiAoa2V5ID09IEVTQykKLQkgICAgewotCSAgICAgIGtleW5hbWUgPSB4bWFsbG9jICgzICsgcHJlZml4X2xlbik7Ci0JICAgICAgaWYgKHByZWZpeCkKLQkJc3RyY3B5IChrZXluYW1lLCBwcmVmaXgpOwotCSAgICAgIGtleW5hbWVbcHJlZml4X2xlbl0gPSAnXFwnOwotCSAgICAgIGtleW5hbWVbcHJlZml4X2xlbiArIDFdID0gJ2UnOwotCSAgICAgIGtleW5hbWVbcHJlZml4X2xlbiArIDJdID0gJ1wwJzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAga2V5bmFtZSA9IF9ybF9nZXRfa2V5bmFtZSAoa2V5KTsKLQkgICAgICBpZiAocHJlZml4KQotCQl7Ci0JCSAgb3V0ID0geG1hbGxvYyAoc3RybGVuIChrZXluYW1lKSArIHByZWZpeF9sZW4gKyAxKTsKLQkJICBzdHJjcHkgKG91dCwgcHJlZml4KTsKLQkJICBzdHJjcHkgKG91dCArIHByZWZpeF9sZW4sIGtleW5hbWUpOwotCQkgIGZyZWUgKGtleW5hbWUpOwotCQkgIGtleW5hbWUgPSBvdXQ7Ci0JCX0KLQkgICAgfQotCi0JICBfcmxfbWFjcm9fZHVtcGVyX2ludGVybmFsIChwcmludF9yZWFkYWJseSwgRlVOQ1RJT05fVE9fS0VZTUFQIChtYXAsIGtleSksIGtleW5hbWUpOwotCSAgZnJlZSAoa2V5bmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1ybF9tYWNyb19kdW1wZXIgKHByaW50X3JlYWRhYmx5KQotICAgICBpbnQgcHJpbnRfcmVhZGFibHk7Ci17Ci0gIF9ybF9tYWNyb19kdW1wZXJfaW50ZXJuYWwgKHByaW50X3JlYWRhYmx5LCBfcmxfa2V5bWFwLCAoY2hhciAqKU5VTEwpOwotfQotCi1pbnQKLXJsX2R1bXBfbWFjcm9zIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKHJsX2Rpc3BhdGNoaW5nKQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIlxyXG4iKTsKLSAgcmxfbWFjcm9fZHVtcGVyIChybF9leHBsaWNpdF9hcmcpOwotICBybF9vbl9uZXdfbGluZSAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotdm9pZAotcmxfdmFyaWFibGVfZHVtcGVyIChwcmludF9yZWFkYWJseSkKLSAgICAgaW50IHByaW50X3JlYWRhYmx5OwotewotICBpbnQgaTsKLSAgY2hhciAqa25hbWU7Ci0KLSAgZm9yIChpID0gMDsgYm9vbGVhbl92YXJsaXN0W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHJpbnRfcmVhZGFibHkpCi0gICAgICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgInNldCAlcyAlc1xuIiwgYm9vbGVhbl92YXJsaXN0W2ldLm5hbWUsCi0JCQkgICAgICAgKmJvb2xlYW5fdmFybGlzdFtpXS52YWx1ZSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgICBlbHNlCi0gICAgICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIiVzIGlzIHNldCB0byBgJXMnXG4iLCBib29sZWFuX3Zhcmxpc3RbaV0ubmFtZSwKLQkJCSAgICAgICAqYm9vbGVhbl92YXJsaXN0W2ldLnZhbHVlID8gIm9uIiA6ICJvZmYiKTsKLSAgICB9Ci0KLSAgLyogYmVsbC1zdHlsZSAqLwotICBzd2l0Y2ggKF9ybF9iZWxsX3ByZWZlcmVuY2UpCi0gICAgewotICAgIGNhc2UgTk9fQkVMTDoKLSAgICAgIGtuYW1lID0gIm5vbmUiOyBicmVhazsKLSAgICBjYXNlIFZJU0lCTEVfQkVMTDoKLSAgICAgIGtuYW1lID0gInZpc2libGUiOyBicmVhazsKLSAgICBjYXNlIEFVRElCTEVfQkVMTDoKLSAgICBkZWZhdWx0OgotICAgICAga25hbWUgPSAiYXVkaWJsZSI7IGJyZWFrOwotICAgIH0KLSAgaWYgKHByaW50X3JlYWRhYmx5KQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgInNldCBiZWxsLXN0eWxlICVzXG4iLCBrbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJiZWxsLXN0eWxlIGlzIHNldCB0byBgJXMnXG4iLCBrbmFtZSk7Ci0KLSAgLyogY29tbWVudC1iZWdpbiAqLwotICBpZiAocHJpbnRfcmVhZGFibHkpCi0gICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAic2V0IGNvbW1lbnQtYmVnaW4gJXNcbiIsIF9ybF9jb21tZW50X2JlZ2luID8gX3JsX2NvbW1lbnRfYmVnaW4gOiBSTF9DT01NRU5UX0JFR0lOX0RFRkFVTFQpOwotICBlbHNlCi0gICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiY29tbWVudC1iZWdpbiBpcyBzZXQgdG8gYCVzJ1xuIiwgX3JsX2NvbW1lbnRfYmVnaW4gPyBfcmxfY29tbWVudF9iZWdpbiA6ICIiKTsKLQotICAvKiBjb21wbGV0aW9uLXF1ZXJ5LWl0ZW1zICovCi0gIGlmIChwcmludF9yZWFkYWJseSkKLSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJzZXQgY29tcGxldGlvbi1xdWVyeS1pdGVtcyAlZFxuIiwgcmxfY29tcGxldGlvbl9xdWVyeV9pdGVtcyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJjb21wbGV0aW9uLXF1ZXJ5LWl0ZW1zIGlzIHNldCB0byBgJWQnXG4iLCBybF9jb21wbGV0aW9uX3F1ZXJ5X2l0ZW1zKTsKLQotICAvKiBlZGl0aW5nLW1vZGUgKi8KLSAgaWYgKHByaW50X3JlYWRhYmx5KQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgInNldCBlZGl0aW5nLW1vZGUgJXNcbiIsIChybF9lZGl0aW5nX21vZGUgPT0gZW1hY3NfbW9kZSkgPyAiZW1hY3MiIDogInZpIik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJlZGl0aW5nLW1vZGUgaXMgc2V0IHRvIGAlcydcbiIsIChybF9lZGl0aW5nX21vZGUgPT0gZW1hY3NfbW9kZSkgPyAiZW1hY3MiIDogInZpIik7Ci0KLSAgLyoga2V5bWFwICovCi0gIGtuYW1lID0gcmxfZ2V0X2tleW1hcF9uYW1lIChfcmxfa2V5bWFwKTsKLSAgaWYgKGtuYW1lID09IDApCi0gICAga25hbWUgPSBybF9nZXRfa2V5bWFwX25hbWVfZnJvbV9lZGl0X21vZGUgKCk7Ci0gIGlmIChwcmludF9yZWFkYWJseSkKLSAgICBmcHJpbnRmIChybF9vdXRzdHJlYW0sICJzZXQga2V5bWFwICVzXG4iLCBrbmFtZSA/IGtuYW1lIDogIm5vbmUiKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgImtleW1hcCBpcyBzZXQgdG8gYCVzJ1xuIiwga25hbWUgPyBrbmFtZSA6ICJub25lIik7Ci0KLSAgLyogaXNlYXJjaC10ZXJtaW5hdG9ycyAqLwotICBpZiAoX3JsX2lzZWFyY2hfdGVybWluYXRvcnMpCi0gICAgewotICAgICAgY2hhciAqZGlzcDsKLQotICAgICAgZGlzcCA9IF9ybF91bnRyYW5zbGF0ZV9tYWNyb192YWx1ZSAoX3JsX2lzZWFyY2hfdGVybWluYXRvcnMpOwotCi0gICAgICBpZiAocHJpbnRfcmVhZGFibHkpCi0JZnByaW50ZiAocmxfb3V0c3RyZWFtLCAic2V0IGlzZWFyY2gtdGVybWluYXRvcnMgXCIlc1wiXG4iLCBkaXNwKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChybF9vdXRzdHJlYW0sICJpc2VhcmNoLXRlcm1pbmF0b3JzIGlzIHNldCB0byBcIiVzXCJcbiIsIGRpc3ApOwotCi0gICAgICBmcmVlIChkaXNwKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGFsbCBvZiB0aGUgY3VycmVudCB2YXJpYWJsZXMgYW5kIHRoZWlyIHZhbHVlcyB0bwotICAgcmxfb3V0c3RyZWFtLiAgSWYgYW4gZXhwbGljaXQgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZW4gcHJpbnQKLSAgIHRoZSBvdXRwdXQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSByZWFkIGJhY2sgaW4uICovCi1pbnQKLXJsX2R1bXBfdmFyaWFibGVzIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKHJsX2Rpc3BhdGNoaW5nKQotICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIlxyXG4iKTsKLSAgcmxfdmFyaWFibGVfZHVtcGVyIChybF9leHBsaWNpdF9hcmcpOwotICBybF9vbl9uZXdfbGluZSAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogQmluZCBrZXkgc2VxdWVuY2UgS0VZU0VRIHRvIERFRkFVTFRfRlVOQyBpZiBLRVlTRVEgaXMgdW5ib3VuZC4gKi8KLXZvaWQKLV9ybF9iaW5kX2lmX3VuYm91bmQgKGtleXNlcSwgZGVmYXVsdF9mdW5jKQotICAgICBjaGFyICprZXlzZXE7Ci0gICAgIEZ1bmN0aW9uICpkZWZhdWx0X2Z1bmM7Ci17Ci0gIEZ1bmN0aW9uICpmdW5jOwotCi0gIGlmIChrZXlzZXEpCi0gICAgewotICAgICAgZnVuYyA9IHJsX2Z1bmN0aW9uX29mX2tleXNlcSAoa2V5c2VxLCBfcmxfa2V5bWFwLCAoaW50ICopTlVMTCk7Ci0gICAgICBpZiAoIWZ1bmMgfHwgZnVuYyA9PSBybF9kb19sb3dlcmNhc2VfdmVyc2lvbikKLQlybF9zZXRfa2V5IChrZXlzZXEsIGRlZmF1bHRfZnVuYywgX3JsX2tleW1hcCk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgYW55IG1lbWJlcnMgb2YgQVJSQVkgYXJlIGEgc3Vic3RyaW5nIGluIFNUUklORy4gKi8KLXN0YXRpYyBpbnQKLXN1YnN0cmluZ19tZW1iZXJfb2ZfYXJyYXkgKHN0cmluZywgYXJyYXkpCi0gICAgIGNoYXIgKnN0cmluZywgKiphcnJheTsKLXsKLSAgd2hpbGUgKCphcnJheSkKLSAgICB7Ci0gICAgICBpZiAoX3JsX3N0cmluZGV4IChzdHJpbmcsICphcnJheSkpCi0JcmV0dXJuICgxKTsKLSAgICAgIGFycmF5Kys7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvY2FsbGJhY2suYyBiL3JlYWRsaW5lL2NhbGxiYWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTViZTQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvY2FsbGJhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKiBjYWxsYmFjay5jIC0tIGZ1bmN0aW9ucyB0byB1c2UgcmVhZGxpbmUgYXMgYW4gWCBgY2FsbGJhY2snIG1lY2hhbmlzbS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJybGNvbmYuaCIKLQotI2lmIGRlZmluZWQgKFJFQURMSU5FX0NBTExCQUNLUykKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFN5c3RlbS1zcGVjaWZpYyBmZWF0dXJlIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIGZpbGVzLiAqLwotI2luY2x1ZGUgInJsZGVmcy5oIgotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0KLWV4dGVybiB2b2lkIHJlYWRsaW5lX2ludGVybmFsX3NldHVwICgpOwotZXh0ZXJuIGNoYXIgKnJlYWRsaW5lX2ludGVybmFsX3RlYXJkb3duICgpOwotZXh0ZXJuIGludCByZWFkbGluZV9pbnRlcm5hbF9jaGFyICgpOwotZXh0ZXJuIHZvaWQgX3JsX2luaXRfbGluZV9zdGF0ZSAoKTsKLQotZXh0ZXJuIGludCBfcmxfbWV0YV9mbGFnOwotZXh0ZXJuIGNoYXIgKnJsX3Byb21wdDsKLWV4dGVybiBpbnQgcmxfdmlzaWJsZV9wcm9tcHRfbGVuZ3RoOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUNhbGxiYWNrIFJlYWRsaW5lIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogQWxsb3cgdXNpbmcgcmVhZGxpbmUgaW4gc2l0dWF0aW9ucyB3aGVyZSBhIHByb2dyYW0gbWF5IGhhdmUgbXVsdGlwbGUKLSAgIHRoaW5ncyB0byBoYW5kbGUgYXQgb25jZSwgYW5kIGRpc3BhdGNoZXMgdGhlbSB2aWEgc2VsZWN0KCkuICBDYWxsCi0gICBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwoKSB3aXRoIHRoZSBwcm9tcHQgYW5kIGEgZnVuY3Rpb24gdG8gY2FsbAotICAgd2hlbmV2ZXIgYSBjb21wbGV0ZSBsaW5lIG9mIGlucHV0IGlzIHJlYWR5LiAgVGhlIHVzZXIgbXVzdCB0aGVuCi0gICBjYWxsIHJsX2NhbGxiYWNrX3JlYWRfY2hhcigpIGV2ZXJ5IHRpbWUgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuZCAKLSAgIHJsX2NhbGxiYWNrX3JlYWRfY2hhcigpIHdpbGwgY2FsbCB0aGUgdXNlcidzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBsZXRlCi0gICB0ZXh0IHJlYWQgaW4gYXQgZWFjaCBlbmQgb2YgbGluZS4gIFRoZSB0ZXJtaW5hbCBpcyBrZXB0IHByZXBwZWQgYW5kCi0gICBzaWduYWxzIGhhbmRsZWQgYWxsIHRoZSB0aW1lLCBleGNlcHQgZHVyaW5nIGNhbGxzIHRvIHRoZSB1c2VyJ3MgZnVuY3Rpb24uICovCi0KLVZGdW5jdGlvbiAqcmxfbGluZWZ1bmM7CQkvKiB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50IGluX2hhbmRsZXI7CQkvKiB0ZXJtaW5hbF9wcmVwcGVkIGFuZCBzaWduYWxzIHNldD8gKi8KLQotLyogTWFrZSBzdXJlIHRoZSB0ZXJtaW5hbCBpcyBzZXQgdXAsIGluaXRpYWxpemUgcmVhZGxpbmUsIGFuZCBwcm9tcHQuICovCi1zdGF0aWMgdm9pZAotX3JsX2NhbGxiYWNrX25ld2xpbmUgKCkKLXsKLSAgcmxfaW5pdGlhbGl6ZSAoKTsKLQotICBpZiAoaW5faGFuZGxlciA9PSAwKQotICAgIHsKLSAgICAgIGluX2hhbmRsZXIgPSAxOwotCi0gICAgICAoKnJsX3ByZXBfdGVybV9mdW5jdGlvbikgKF9ybF9tZXRhX2ZsYWcpOwotCi0jaWYgZGVmaW5lZCAoSEFORExFX1NJR05BTFMpCi0gICAgICBybF9zZXRfc2lnbmFscyAoKTsKLSNlbmRpZgotICAgIH0KLQotICByZWFkbGluZV9pbnRlcm5hbF9zZXR1cCAoKTsKLX0KLQotLyogSW5zdGFsbCBhIHJlYWRsaW5lIGhhbmRsZXIsIHNldCB1cCB0aGUgdGVybWluYWwsIGFuZCBpc3N1ZSB0aGUgcHJvbXB0LiAqLwotdm9pZAotcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsIChwcm9tcHQsIGxpbmVmdW5jKQotICAgICBjaGFyICpwcm9tcHQ7Ci0gICAgIFZGdW5jdGlvbiAqbGluZWZ1bmM7Ci17Ci0gIHJsX3Byb21wdCA9IHByb21wdDsKLSAgcmxfdmlzaWJsZV9wcm9tcHRfbGVuZ3RoID0gcmxfcHJvbXB0ID8gcmxfZXhwYW5kX3Byb21wdCAocmxfcHJvbXB0KSA6IDA7Ci0gIHJsX2xpbmVmdW5jID0gbGluZWZ1bmM7Ci0gIF9ybF9jYWxsYmFja19uZXdsaW5lICgpOwotfQotCi0vKiBSZWFkIG9uZSBjaGFyYWN0ZXIsIGFuZCBkaXNwYXRjaCB0byB0aGUgaGFuZGxlciBpZiBpdCBlbmRzIHRoZSBsaW5lLiAqLwotdm9pZAotcmxfY2FsbGJhY2tfcmVhZF9jaGFyICgpCi17Ci0gIGNoYXIgKmxpbmU7Ci0gIGludCBlb2Y7Ci0KLSAgaWYgKHJsX2xpbmVmdW5jID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVhZGxpbmU6IHJlYWRsaW5lX2NhbGxiYWNrX3JlYWRfY2hhcigpIGNhbGxlZCB3aXRoIG5vIGhhbmRsZXIhXHJcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGVvZiA9IHJlYWRsaW5lX2ludGVybmFsX2NoYXIgKCk7Ci0KLSAgaWYgKHJsX2RvbmUpCi0gICAgewotICAgICAgbGluZSA9IHJlYWRsaW5lX2ludGVybmFsX3RlYXJkb3duIChlb2YpOwotCi0gICAgICAoKnJsX2RlcHJlcF90ZXJtX2Z1bmN0aW9uKSAoKTsKLSNpZiBkZWZpbmVkIChIQU5ETEVfU0lHTkFMUykKLSAgICAgIHJsX2NsZWFyX3NpZ25hbHMgKCk7Ci0jZW5kaWYKLSAgICAgIGluX2hhbmRsZXIgPSAwOwotICAgICAgKCpybF9saW5lZnVuYykgKGxpbmUpOwotCi0gICAgLyogSWYgdGhlIHVzZXIgZGlkIG5vdCBjbGVhciBvdXQgdGhlIGxpbmUsIGRvIGl0IGZvciBoaW0uICovCi0gICAgaWYgKHJsX2xpbmVfYnVmZmVyWzBdKQotICAgICAgX3JsX2luaXRfbGluZV9zdGF0ZSAoKTsKLQotICAgIC8qIFJlZGlzcGxheSB0aGUgcHJvbXB0IGlmIHJlYWRsaW5lX2hhbmRsZXJfe2luc3RhbGwscmVtb3ZlfSBub3QgY2FsbGVkLiAqLwotICAgICAgaWYgKGluX2hhbmRsZXIgPT0gMCAmJiBybF9saW5lZnVuYykKLQlfcmxfY2FsbGJhY2tfbmV3bGluZSAoKTsKLSAgICB9Ci19Ci0KLS8qIFJlbW92ZSB0aGUgaGFuZGxlciwgYW5kIG1ha2Ugc3VyZSB0aGUgdGVybWluYWwgaXMgaW4gaXRzIG5vcm1hbCBzdGF0ZS4gKi8KLXZvaWQKLXJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlICgpCi17Ci0gIHJsX2xpbmVmdW5jID0gTlVMTDsKLSAgaWYgKGluX2hhbmRsZXIpCi0gICAgewotICAgICAgaW5faGFuZGxlciA9IDA7Ci0gICAgICAoKnJsX2RlcHJlcF90ZXJtX2Z1bmN0aW9uKSAoKTsKLSNpZiBkZWZpbmVkIChIQU5ETEVfU0lHTkFMUykKLSAgICAgIHJsX2NsZWFyX3NpZ25hbHMgKCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvY2hhcmRlZnMuaCBiL3JlYWRsaW5lL2NoYXJkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWUyNzMuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvY2hhcmRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKiBjaGFyZGVmcy5oIC0tIENoYXJhY3RlciBkZWZpbml0aW9ucyBmb3IgcmVhZGxpbmUuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLSNpZm5kZWYgX0NIQVJERUZTX0hfCi0jZGVmaW5lIF9DSEFSREVGU19IXwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGVsc2UKLSMgICAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyAgZW5kaWYgLyogSEFWRV9TVFJJTkdfSCAqLwotI2Vsc2UKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmIC8qICFIQVZFX0NPTkZJR19IICovCi0KLSNpZm5kZWYgd2hpdGVzcGFjZQotI2RlZmluZSB3aGl0ZXNwYWNlKGMpICgoKGMpID09ICcgJykgfHwgKChjKSA9PSAnXHQnKSkKLSNlbmRpZgotCi0jaWZkZWYgQ1RSTAotI3VuZGVmIENUUkwKLSNlbmRpZgotCi0vKiBTb21lIGNoYXJhY3RlciBzdHVmZi4gKi8KLSNkZWZpbmUgY29udHJvbF9jaGFyYWN0ZXJfdGhyZXNob2xkIDB4MDIwICAgLyogU21hbGxlciB0aGFuIHRoaXMgaXMgY29udHJvbC4gKi8KLSNkZWZpbmUgY29udHJvbF9jaGFyYWN0ZXJfbWFzayAweDFmCSAgICAvKiAweDIwIC0gMSAqLwotI2RlZmluZSBtZXRhX2NoYXJhY3Rlcl90aHJlc2hvbGQgMHgwN2YJICAgIC8qIExhcmdlciB0aGFuIHRoaXMgaXMgTWV0YS4gKi8KLSNkZWZpbmUgY29udHJvbF9jaGFyYWN0ZXJfYml0IDB4NDAJICAgIC8qIDB4MDAwMDAwLCBtdXN0IGJlIG9mZi4gKi8KLSNkZWZpbmUgbWV0YV9jaGFyYWN0ZXJfYml0IDB4MDgwCSAgICAvKiB4MDAwMDAwMCwgbXVzdCBiZSBvbi4gKi8KLSNkZWZpbmUgbGFyZ2VzdF9jaGFyIDI1NQkJICAgIC8qIExhcmdlc3QgY2hhcmFjdGVyIHZhbHVlLiAqLwotCi0jZGVmaW5lIENUUkxfQ0hBUihjKSAoKGMpIDwgY29udHJvbF9jaGFyYWN0ZXJfdGhyZXNob2xkICYmIChjKSA+PSAwKQotI2RlZmluZSBNRVRBX0NIQVIoYykgKChjKSA+IG1ldGFfY2hhcmFjdGVyX3RocmVzaG9sZCAmJiAoYykgPD0gbGFyZ2VzdF9jaGFyKQotCi0jZGVmaW5lIENUUkwoYykgKChjKSAmIGNvbnRyb2xfY2hhcmFjdGVyX21hc2spCi0jZGVmaW5lIE1FVEEoYykgKChjKSB8IG1ldGFfY2hhcmFjdGVyX2JpdCkKLQotI2RlZmluZSBVTk1FVEEoYykgKChjKSAmICh+bWV0YV9jaGFyYWN0ZXJfYml0KSkKLSNkZWZpbmUgVU5DVFJMKGMpIF9ybF90b191cHBlcigoKGMpfGNvbnRyb2xfY2hhcmFjdGVyX2JpdCkpCi0KLS8qIE9sZCB2ZXJzaW9ucwotI2RlZmluZSBfcmxfbG93ZXJjYXNlX3AoYykgKCgoYykgPiAoJ2EnIC0gMSkgJiYgKGMpIDwgKCd6JyArIDEpKSkKLSNkZWZpbmUgX3JsX3VwcGVyY2FzZV9wKGMpICgoKGMpID4gKCdBJyAtIDEpICYmIChjKSA8ICgnWicgKyAxKSkpCi0jZGVmaW5lIF9ybF9kaWdpdF9wKGMpICAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQotKi8KLQotI2RlZmluZSBfcmxfbG93ZXJjYXNlX3AoYykgKGlzbG93ZXIoYykpCi0jZGVmaW5lIF9ybF91cHBlcmNhc2VfcChjKSAoaXN1cHBlcihjKSkKLSNkZWZpbmUgX3JsX2RpZ2l0X3AoeCkgIChpc2RpZ2l0ICh4KSkKLQotI2RlZmluZSBfcmxfcHVyZV9hbHBoYWJldGljKGMpIChfcmxfbG93ZXJjYXNlX3AoYykgfHwgX3JsX3VwcGVyY2FzZV9wKGMpKQotI2RlZmluZSBBTFBIQUJFVElDKGMpCShfcmxfbG93ZXJjYXNlX3AoYykgfHwgX3JsX3VwcGVyY2FzZV9wKGMpIHx8IF9ybF9kaWdpdF9wKGMpKQotCi0vKiBPbGQgdmVyc2lvbnMKLSMgIGRlZmluZSBfcmxfdG9fdXBwZXIoYykgKF9ybF9sb3dlcmNhc2VfcChjKSA/ICgoYykgLSAzMikgOiAoYykpCi0jICBkZWZpbmUgX3JsX3RvX2xvd2VyKGMpIChfcmxfdXBwZXJjYXNlX3AoYykgPyAoKGMpICsgMzIpIDogKGMpKQotKi8KLQotI2lmbmRlZiBfcmxfdG9fdXBwZXIKLSMgIGRlZmluZSBfcmxfdG9fdXBwZXIoYykgKGlzbG93ZXIoYykgPyB0b3VwcGVyKGMpIDogKGMpKQotIyAgZGVmaW5lIF9ybF90b19sb3dlcihjKSAoaXN1cHBlcihjKSA/IHRvbG93ZXIoYykgOiAoYykpCi0jZW5kaWYKLQotI2lmbmRlZiBfcmxfZGlnaXRfdmFsdWUKLSNkZWZpbmUgX3JsX2RpZ2l0X3ZhbHVlKHgpICgoeCkgLSAnMCcpCi0jZW5kaWYKLQotI2lmbmRlZiBORVdMSU5FCi0jZGVmaW5lIE5FV0xJTkUgJ1xuJwotI2VuZGlmCi0KLSNpZm5kZWYgUkVUVVJOCi0jZGVmaW5lIFJFVFVSTiBDVFJMKCdNJykKLSNlbmRpZgotCi0jaWZuZGVmIFJVQk9VVAotI2RlZmluZSBSVUJPVVQgMHg3ZgotI2VuZGlmCi0KLSNpZm5kZWYgVEFCCi0jZGVmaW5lIFRBQiAnXHQnCi0jZW5kaWYKLQotI2lmZGVmIEFCT1JUX0NIQVIKLSN1bmRlZiBBQk9SVF9DSEFSCi0jZW5kaWYKLSNkZWZpbmUgQUJPUlRfQ0hBUiBDVFJMKCdHJykKLQotI2lmZGVmIFBBR0UKLSN1bmRlZiBQQUdFCi0jZW5kaWYKLSNkZWZpbmUgUEFHRSBDVFJMKCdMJykKLQotI2lmZGVmIFNQQUNFCi0jdW5kZWYgU1BBQ0UKLSNlbmRpZgotI2RlZmluZSBTUEFDRSAnICcJLyogWFhYIC0gd2FzIDB4MjAgKi8KLQotI2lmZGVmIEVTQwotI3VuZGVmIEVTQwotI2VuZGlmCi0jZGVmaW5lIEVTQyBDVFJMKCdbJykKLQotI2lmbmRlZiBJU09DVEFMCi0jZGVmaW5lIElTT0NUQUwoYykgICAgICAoKGMpID49ICcwJyAmJiAoYykgPD0gJzcnKQotI2VuZGlmCi0jZGVmaW5lIE9DVFZBTFVFKGMpICAgICAoKGMpIC0gJzAnKQotCi0jaWZuZGVmIGlzeGRpZ2l0Ci0jICBkZWZpbmUgaXN4ZGlnaXQoYykgICAoaXNkaWdpdCgoYykpIHx8ICgoYykgPj0gJ2EnICYmIChjKSA8PSAnZicpIHx8ICgoYykgPj0gJ0EnICYmIChjKSA8PSAnRicpKQotI2VuZGlmCi0KLSNkZWZpbmUgSEVYVkFMVUUoYykgXAotICAoKChjKSA+PSAnYScgJiYgKGMpIDw9ICdmJykgXAotICAJPyAoYyktJ2EnKzEwIFwKLSAgCTogKGMpID49ICdBJyAmJiAoYykgPD0gJ0YnID8gKGMpLSdBJysxMCA6IChjKS0nMCcpCi0KLSNlbmRpZiAgLyogX0NIQVJERUZTX0hfICovCmRpZmYgLS1naXQgYS9yZWFkbGluZS9jb21wbGV0ZS5jIGIvcmVhZGxpbmUvY29tcGxldGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4ODEyMC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9jb21wbGV0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2MyArMCwwIEBACi0vKiBjb21wbGV0ZS5jIC0tIGZpbGVuYW1lIGNvbXBsZXRpb24gZm9yIHJlYWRsaW5lLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWYgZGVmaW5lZCAoSEFWRV9TWVNfRklMRV9IKQotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhZGVmaW5lZCAoZXJybm8pCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmIC8qICFlcnJubyAqLwotCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaWYgIWRlZmluZWQgKEhBVkVfR0VUUFdfREVDTFMpCi1leHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHdlbnQgKCk7Ci0jZW5kaWYgLyogVVNHICYmICFIQVZFX0dFVFBXX0RFQ0xTICovCi0KLS8qIElTQyBzeXN0ZW1zIGRvbid0IGRlZmluZSBnZXRwd2VudCgpIGlmIF9QT1NJWF9TT1VSQ0UgaXMgZGVmaW5lZC4gKi8KLSNpZiBkZWZpbmVkIChpc2MzODYpICYmIGRlZmluZWQgKF9QT1NJWF9TT1VSQ0UpCi0jICBpZiBkZWZpbmVkIChfX1NURENfXykKLWV4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd2VudCAodm9pZCk7Ci0jICBlbHNlCi1leHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHdlbnQgKCk7Ci0jICBlbmRpZiAvKiAhX19TVERDX18gKi8KLSNlbmRpZiAvKiBpc2MzODYgJiYgX1BPU0lYX1NPVVJDRSAqLwotCi0jaW5jbHVkZSAicG9zaXhkaXIuaCIKLSNpbmNsdWRlICJwb3NpeHN0YXQuaCIKLQotLyogU3lzdGVtLXNwZWNpZmljIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgZmlsZXMuICovCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi1leHRlcm4gY2hhciAqdGlsZGVfZXhwYW5kICgpOwotZXh0ZXJuIGNoYXIgKnJsX2NvcHlfdGV4dCAoKTsKLWV4dGVybiB2b2lkIF9ybF9hYm9ydF9pbnRlcm5hbCAoKTsKLWV4dGVybiBpbnQgX3JsX3Fzb3J0X3N0cmluZ19jb21wYXJlICgpOwotZXh0ZXJuIHZvaWQgX3JsX3JlcGxhY2VfdGV4dCAoKTsKLQotZXh0ZXJuIEZ1bmN0aW9uICpybF9sYXN0X2Z1bmM7Ci1leHRlcm4gaW50IHJsX2VkaXRpbmdfbW9kZTsKLWV4dGVybiBpbnQgc2NyZWVud2lkdGg7Ci0KLWV4dGVybiB2b2lkIF9ybF9tb3ZlX3ZlcnQgKCk7Ci1leHRlcm4gaW50IF9ybF92aXNfYm90bGluOwotZXh0ZXJuIGludCBybF9kaXNwbGF5X2ZpeGVkOwotCi0vKiBJZiBub24temVybywgdGhlbiB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuCi0gICBjb21wbGV0aW5nIGEgd29yZCB3b3VsZCBub3JtYWxseSBkaXNwbGF5IHRoZSBsaXN0IG9mIHBvc3NpYmxlIG1hdGNoZXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIGFjdHVhbGx5IGRvaW5nIHRoZSBkaXNwbGF5LgotICAgSXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzOiAoY2hhciAqKm1hdGNoZXMsIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpCi0gICB3aGVyZSBNQVRDSEVTIGlzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2hlZCwgTlVNX01BVENIRVMgaXMgdGhlCi0gICBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGF0IGFycmF5LCBhbmQgTUFYX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotICAgbG9uZ2VzdCBzdHJpbmcgaW4gdGhhdCBhcnJheS4gKi8KLVZGdW5jdGlvbiAqcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA9IChWRnVuY3Rpb24gKilOVUxMOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgYW5kIHVzZWQgaW4gdGhpcyBmaWxlLiAqLwotY2hhciAqZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoKTsKLWNoYXIgKipjb21wbGV0aW9uX21hdGNoZXMgKCk7Ci0KLSNpZiBkZWZpbmVkIChWSVNJQkxFX1NUQVRTKQotIyAgaWYgIWRlZmluZWQgKFhfT0spCi0jICAgIGRlZmluZSBYX09LIDEKLSMgIGVuZGlmCi1zdGF0aWMgaW50IHN0YXRfY2hhciAoKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqcmxfcXVvdGVfZmlsZW5hbWUgKCk7Ci1zdGF0aWMgY2hhciAqcmxfc3RycGJyayAoKTsKLQotc3RhdGljIGNoYXIgKipyZW1vdmVfZHVwbGljYXRlX21hdGNoZXMgKCk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfbWF0Y2ggKCk7Ci1zdGF0aWMgaW50IGFwcGVuZF90b19tYXRjaCAoKTsKLXN0YXRpYyB2b2lkIGluc2VydF9hbGxfbWF0Y2hlcyAoKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfbWF0Y2hlcyAoKTsKLXN0YXRpYyBpbnQgY29tcHV0ZV9sY2Rfb2ZfbWF0Y2hlcyAoKTsKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCksICp4cmVhbGxvYyAoKTsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJQ29tcGxldGlvbiBtYXRjaGluZywgZnJvbSByZWFkbGluZSdzIHBvaW50IG9mIHZpZXcuCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBWYXJpYWJsZXMga25vd24gb25seSB0byB0aGUgcmVhZGxpbmUgbGlicmFyeS4gKi8KLQotLyogSWYgbm9uLXplcm8sIG5vbi11bmlxdWUgY29tcGxldGlvbnMgYWx3YXlzIHNob3cgdGhlIGxpc3Qgb2YgbWF0Y2hlcy4gKi8KLWludCBfcmxfY29tcGxldGVfc2hvd19hbGwgPSAwOwotCi0vKiBJZiBub24temVybywgY29tcGxldGVkIGRpcmVjdG9yeSBuYW1lcyBoYXZlIGEgc2xhc2ggYXBwZW5kZWQuICovCi1pbnQgX3JsX2NvbXBsZXRlX21hcmtfZGlyZWN0b3JpZXMgPSAxOwotCi0vKiBJZiBub24temVybywgY29tcGxldGlvbnMgYXJlIHByaW50ZWQgaG9yaXpvbnRhbGx5IGluIGFscGhhYmV0aWNhbCBvcmRlciwKLSAgIGxpa2UgYGxzIC14Jy4gKi8KLWludCBfcmxfcHJpbnRfY29tcGxldGlvbnNfaG9yaXpvbnRhbGx5OwotCi0vKiBOb24temVybyBtZWFucyB0aGF0IGNhc2UgaXMgbm90IHNpZ25pZmljYW50IGluIGZpbGVuYW1lIGNvbXBsZXRpb24uICovCi1pbnQgX3JsX2NvbXBsZXRpb25fY2FzZV9mb2xkOwotCi0vKiBHbG9iYWwgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgcmVhZGxpbmUuICovCi0KLSNpZiBkZWZpbmVkIChWSVNJQkxFX1NUQVRTKQotLyogTm9uLXplcm8gbWVhbnMgYWRkIGFuIGFkZGl0aW9uYWwgY2hhcmFjdGVyIHRvIGVhY2ggZmlsZW5hbWUgZGlzcGxheWVkCi0gICBkdXJpbmcgbGlzdGluZyBjb21wbGV0aW9uIGlmZiBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQgd2hpY2ggaGVscHMKLSAgIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGZpbGUgYmVpbmcgbGlzdGVkLiAqLwotaW50IHJsX3Zpc2libGVfc3RhdHMgPSAwOwotI2VuZGlmIC8qIFZJU0lCTEVfU1RBVFMgKi8KLQotLyogSWYgbm9uLXplcm8sIHRoZW4gdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbgotICAgY29tcGxldGluZyBvbiBhIGRpcmVjdG9yeSBuYW1lLiAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoCi0gICB0aGUgYWRkcmVzcyBvZiBhIHN0cmluZyAodGhlIGN1cnJlbnQgZGlyZWN0b3J5IG5hbWUpIGFzIGFuIGFyZy4gKi8KLUZ1bmN0aW9uICpybF9kaXJlY3RvcnlfY29tcGxldGlvbl9ob29rID0gKEZ1bmN0aW9uICopTlVMTDsKLQotLyogTm9uLXplcm8gbWVhbnMgcmVhZGxpbmUgY29tcGxldGlvbiBmdW5jdGlvbnMgcGVyZm9ybSB0aWxkZSBleHBhbnNpb24uICovCi1pbnQgcmxfY29tcGxldGVfd2l0aF90aWxkZV9leHBhbnNpb24gPSAwOwotCi0vKiBQb2ludGVyIHRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbXBsZXRpb25fbWF0Y2hlcyAoKS4KLSAgIE5VTEwgbWVhbnMgdG8gdXNlIGZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCksIHRoZSBkZWZhdWx0IGZpbGVuYW1lCi0gICBjb21wbGV0ZXIuICovCi1GdW5jdGlvbiAqcmxfY29tcGxldGlvbl9lbnRyeV9mdW5jdGlvbiA9IChGdW5jdGlvbiAqKU5VTEw7Ci0KLS8qIFBvaW50ZXIgdG8gYWx0ZXJuYXRpdmUgZnVuY3Rpb24gdG8gY3JlYXRlIG1hdGNoZXMuCi0gICBGdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBURVhULCBTVEFSVCwgYW5kIEVORC4KLSAgIFNUQVJUIGFuZCBFTkQgYXJlIGluZGljZXMgaW4gUkxfTElORV9CVUZGRVIgc2F5aW5nIHdoYXQgdGhlIGJvdW5kYXJpZXMKLSAgIG9mIFRFWFQgYXJlLgotICAgSWYgdGhpcyBmdW5jdGlvbiBleGlzdHMgYW5kIHJldHVybnMgTlVMTCB0aGVuIGNhbGwgdGhlIHZhbHVlIG9mCi0gICBybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9uIHRvIHRyeSB0byBtYXRjaCwgb3RoZXJ3aXNlIHVzZSB0aGUKLSAgIGFycmF5IG9mIHN0cmluZ3MgcmV0dXJuZWQuICovCi1DUFBGdW5jdGlvbiAqcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSAoQ1BQRnVuY3Rpb24gKilOVUxMOwotCi0vKiBOb24temVybyBtZWFucyB0byBzdXBwcmVzcyBub3JtYWwgZmlsZW5hbWUgY29tcGxldGlvbiBhZnRlciB0aGUKLSAgIHVzZXItc3BlY2lmaWVkIGNvbXBsZXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAqLwotaW50IHJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX292ZXIgPSAwOwotCi0vKiBTZXQgdG8gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBjb21wbGV0aW9uIGJlaW5nIHBlcmZvcm1lZAotICAgYnkgcmxfY29tcGxldGVfaW50ZXJuYWwsIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9uIGNvbXBsZXRpb24KLSAgIGZ1bmN0aW9ucy4gKi8KLWludCBybF9jb21wbGV0aW9uX3R5cGUgPSAwOwotCi0vKiBVcCB0byB0aGlzIG1hbnkgaXRlbXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcmVzcG9uc2UgdG8gYQotICAgcG9zc2libGUtY29tcGxldGlvbnMgY2FsbC4gIEFmdGVyIHRoYXQsIHdlIGFzayB0aGUgdXNlciBpZgotICAgc2hlIGlzIHN1cmUgc2hlIHdhbnRzIHRvIHNlZSB0aGVtIGFsbC4gKi8KLWludCBybF9jb21wbGV0aW9uX3F1ZXJ5X2l0ZW1zID0gMTAwOwotCi0vKiBUaGUgYmFzaWMgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgc2lnbmFsIGEgYnJlYWsgYmV0d2VlbiB3b3JkcyBmb3IgdGhlCi0gICBjb21wbGV0ZXIgcm91dGluZS4gIFRoZSBjb250ZW50cyBvZiB0aGlzIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIHdvcmRzCi0gICBpbiB0aGUgc2hlbGwsIGkuZS4gIiBcdFxuXCJcXCdgQCQ+PD0iICovCi1jaGFyICpybF9iYXNpY193b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSAiIFx0XG5cIlxcJ2BAJD48PTt8JnsoIjsKLQotLyogTGlzdCBvZiBiYXNpYyBxdW90aW5nIGNoYXJhY3RlcnMuICovCi1jaGFyICpybF9iYXNpY19xdW90ZV9jaGFyYWN0ZXJzID0gIlwiJyI7Ci0KLS8qIFRoZSBsaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBzaWduYWwgYSBicmVhayBiZXR3ZWVuIHdvcmRzIGZvcgotICAgcmxfY29tcGxldGVfaW50ZXJuYWwuICBUaGUgZGVmYXVsdCBsaXN0IGlzIHRoZSBjb250ZW50cyBvZgotICAgcmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzLiAgKi8KLWNoYXIgKnJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSAoY2hhciAqKU5VTEw7Ci0KLS8qIExpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCB0byBxdW90ZSBhIHN1YnN0cmluZyBvZiB0aGUgbGluZS4KLSAgIENvbXBsZXRpb24gb2NjdXJzIG9uIHRoZSBlbnRpcmUgc3Vic3RyaW5nLCBhbmQgd2l0aGluIHRoZSBzdWJzdHJpbmcKLSAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgYXMgYW55IG90aGVyIGNoYXJhY3RlciwKLSAgIHVubGVzcyB0aGV5IGFsc28gYXBwZWFyIHdpdGhpbiB0aGlzIGxpc3QuICovCi1jaGFyICpybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyA9IChjaGFyICopTlVMTDsKLQotLyogTGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIHF1b3RlZCBpbiBmaWxlbmFtZXMgYnkgdGhlIGNvbXBsZXRlci4gKi8KLWNoYXIgKnJsX2ZpbGVuYW1lX3F1b3RlX2NoYXJhY3RlcnMgPSAoY2hhciAqKU5VTEw7Ci0KLS8qIExpc3Qgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSB3b3JkIGJyZWFrIGNoYXJhY3RlcnMsIGJ1dCBzaG91bGQgYmUgbGVmdAotICAgaW4gVEVYVCB3aGVuIGl0IGlzIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBmdW5jdGlvbi4gIFRoZSBzaGVsbCB1c2VzCi0gICB0aGlzIHRvIGhlbHAgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBjb21wbGV0aW5nIHRvIGRvLiAqLwotY2hhciAqcmxfc3BlY2lhbF9wcmVmaXhlcyA9IChjaGFyICopTlVMTDsKLQotLyogSWYgbm9uLXplcm8sIHRoZW4gZGlzYWxsb3cgZHVwbGljYXRlcyBpbiB0aGUgbWF0Y2hlcy4gKi8KLWludCBybF9pZ25vcmVfY29tcGxldGlvbl9kdXBsaWNhdGVzID0gMTsKLQotLyogTm9uLXplcm8gbWVhbnMgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGUgbWF0Y2hlcyBhcmUgdG8gYmUgdHJlYXRlZAotICAgYXMgZmlsZW5hbWVzLiAgVGhpcyBpcyBBTFdBWVMgemVybyBvbiBlbnRyeSwgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKLSAgIHdpdGhpbiBhIGNvbXBsZXRpb24gZW50cnkgZmluZGVyIGZ1bmN0aW9uLiAqLwotaW50IHJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZCA9IDA7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhlIG1hdGNoZXMgYXJlIHRvIGJlIHF1b3RlZCB1c2luZwotICAgZG91YmxlIHF1b3RlcyAob3IgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgcXVvdGluZyBtZWNoYW5pc20pIGlmIHRoZQotICAgZmlsZW5hbWUgY29udGFpbnMgYW55IGNoYXJhY3RlcnMgaW4gcmxfZmlsZW5hbWVfcXVvdGVfY2hhcnMuICBUaGlzIGlzCi0gICBBTFdBWVMgbm9uLXplcm8gb24gZW50cnksIGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkIHdpdGhpbiBhIGNvbXBsZXRpb24KLSAgIGVudHJ5IGZpbmRlciBmdW5jdGlvbi4gKi8KLWludCBybF9maWxlbmFtZV9xdW90aW5nX2Rlc2lyZWQgPSAxOwotCi0vKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgYnkgdGhlIGNvbXBsZXRlciB3aGVuIHJlYWwKLSAgIGZpbGVuYW1lIGNvbXBsZXRpb24gaXMgZG9uZSwgYWZ0ZXIgYWxsIHRoZSBtYXRjaGluZyBuYW1lcyBoYXZlIGJlZW4KLSAgIGdlbmVyYXRlZC4gSXQgaXMgcGFzc2VkIGEgKGNoYXIqKikga25vd24gYXMgbWF0Y2hlcyBpbiB0aGUgY29kZSBiZWxvdy4KLSAgIEl0IGNvbnNpc3RzIG9mIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIHBvaW50ZXJzIHRvIHBvdGVudGlhbAotICAgbWF0Y2hpbmcgc3RyaW5ncy4gIFRoZSAxc3QgZWxlbWVudCAobWF0Y2hlc1swXSkgaXMgdGhlIG1heGltYWwKLSAgIHN1YnN0cmluZyB0aGF0IGlzIGNvbW1vbiB0byBhbGwgbWF0Y2hlcy4gVGhpcyBmdW5jdGlvbiBjYW4gcmUtYXJyYW5nZQotICAgdGhlIGxpc3Qgb2YgbWF0Y2hlcyBhcyByZXF1aXJlZCwgYnV0IGFsbCBlbGVtZW50cyBvZiB0aGUgYXJyYXkgbXVzdCBiZQotICAgZnJlZSgpJ2QgaWYgdGhleSBhcmUgZGVsZXRlZC4gVGhlIG1haW4gaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMKLSAgIHRvIGltcGxlbWVudCBGSUdOT1JFIGEgbGEgU3VuT1MgY3NoLiAqLwotRnVuY3Rpb24gKnJsX2lnbm9yZV9zb21lX2NvbXBsZXRpb25zX2Z1bmN0aW9uID0gKEZ1bmN0aW9uICopTlVMTDsKLQotLyogU2V0IHRvIGEgZnVuY3Rpb24gdG8gcXVvdGUgYSBmaWxlbmFtZSBpbiBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBmYXNoaW9uLgotICAgQ2FsbGVkIHdpdGggdGhlIHRleHQgdG8gcXVvdGUsIHRoZSB0eXBlIG9mIG1hdGNoIGZvdW5kIChzaW5nbGUgb3IgbXVsdGlwbGUpCi0gICBhbmQgYSBwb2ludGVyIHRvIHRoZSBxdW90aW5nIGNoYXJhY3RlciB0byBiZSB1c2VkLCB3aGljaCB0aGUgZnVuY3Rpb24gY2FuCi0gICByZXNldCBpZiBkZXNpcmVkLiAqLwotQ1BGdW5jdGlvbiAqcmxfZmlsZW5hbWVfcXVvdGluZ19mdW5jdGlvbiA9IHJsX3F1b3RlX2ZpbGVuYW1lOwotICAgICAgICAgCi0vKiBGdW5jdGlvbiB0byBjYWxsIHRvIHJlbW92ZSBxdW90aW5nIGNoYXJhY3RlcnMgZnJvbSBhIGZpbGVuYW1lLiAgQ2FsbGVkCi0gICBiZWZvcmUgY29tcGxldGlvbiBpcyBhdHRlbXB0ZWQsIHNvIHRoZSBlbWJlZGRlZCBxdW90ZXMgZG8gbm90IGludGVyZmVyZQotICAgd2l0aCBtYXRjaGluZyBuYW1lcyBpbiB0aGUgZmlsZSBzeXN0ZW0uICBSZWFkbGluZSBkb2Vzbid0IGRvIGFueXRoaW5nCi0gICB3aXRoIHRoaXM7IGl0J3Mgc2V0IG9ubHkgYnkgYXBwbGljYXRpb25zLiAqLwotQ1BGdW5jdGlvbiAqcmxfZmlsZW5hbWVfZGVxdW90aW5nX2Z1bmN0aW9uID0gKENQRnVuY3Rpb24gKilOVUxMOwotCi0vKiBGdW5jdGlvbiB0byBjYWxsIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBhIHdvcmQgYnJlYWsgY2hhcmFjdGVyIGlzCi0gICBxdW90ZWQuICBJZiBhIGNoYXJhY3RlciBpcyBxdW90ZWQsIGl0IGRvZXMgbm90IGJyZWFrIHdvcmRzIGZvciB0aGUKLSAgIGNvbXBsZXRlci4gKi8KLUZ1bmN0aW9uICpybF9jaGFyX2lzX3F1b3RlZF9wID0gKEZ1bmN0aW9uICopTlVMTDsKLQotLyogQ2hhcmFjdGVyIGFwcGVuZGVkIHRvIGNvbXBsZXRlZCB3b3JkcyB3aGVuIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGUKLSAgIGRlZmF1bHQgaXMgYSBzcGFjZS4gKi8KLWludCBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIgPSAnICc7Ci0KLS8qIElmIG5vbi16ZXJvLCBpbmhpYml0IGNvbXBsZXRpb24gKHRlbXBvcmFyaWx5KS4gKi8KLWludCBybF9pbmhpYml0X2NvbXBsZXRpb247Ci0KLS8qIFZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIGZpbGUuICovCi0KLS8qIExvY2FsIHZhcmlhYmxlIHN0YXRlcyB3aGF0IGhhcHBlbmVkIGR1cmluZyB0aGUgbGFzdCBjb21wbGV0aW9uIGF0dGVtcHQuICovCi1zdGF0aWMgaW50IGNvbXBsZXRpb25fY2hhbmdlZF9idWZmZXI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoJCQkJICAgICAqLwotLyogICAgQmluZGFibGUgY29tcGxldGlvbiBmdW5jdGlvbnMgICovCi0vKgkJCQkgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGxldGUgdGhlIHdvcmQgYXQgb3IgYmVmb3JlIHBvaW50LiAgWW91IGhhdmUgc3VwcGxpZWQgdGhlIGZ1bmN0aW9uCi0gICB0aGF0IGRvZXMgdGhlIGluaXRpYWwgc2ltcGxlIG1hdGNoaW5nIHNlbGVjdGlvbiBhbGdvcml0aG0gKHNlZQotICAgY29tcGxldGlvbl9tYXRjaGVzICgpKS4gIFRoZSBkZWZhdWx0IGlzIHRvIGRvIGZpbGVuYW1lIGNvbXBsZXRpb24uICovCi1pbnQKLXJsX2NvbXBsZXRlIChpZ25vcmUsIGludm9raW5nX2tleSkKLSAgICAgaW50IGlnbm9yZSwgaW52b2tpbmdfa2V5OwotewotICBpZiAocmxfaW5oaWJpdF9jb21wbGV0aW9uKQotICAgIHJldHVybiAocmxfaW5zZXJ0IChpZ25vcmUsIGludm9raW5nX2tleSkpOwotICBlbHNlIGlmIChybF9sYXN0X2Z1bmMgPT0gcmxfY29tcGxldGUgJiYgIWNvbXBsZXRpb25fY2hhbmdlZF9idWZmZXIpCi0gICAgcmV0dXJuIChybF9jb21wbGV0ZV9pbnRlcm5hbCAoJz8nKSk7Ci0gIGVsc2UgaWYgKF9ybF9jb21wbGV0ZV9zaG93X2FsbCkKLSAgICByZXR1cm4gKHJsX2NvbXBsZXRlX2ludGVybmFsICgnIScpKTsKLSAgZWxzZQotICAgIHJldHVybiAocmxfY29tcGxldGVfaW50ZXJuYWwgKFRBQikpOwotfQotCi0vKiBMaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucy4gIFNlZSBkZXNjcmlwdGlvbiBvZiBybF9jb21wbGV0ZSAoKS4gKi8KLWludAotcmxfcG9zc2libGVfY29tcGxldGlvbnMgKGlnbm9yZSwgaW52b2tpbmdfa2V5KQotICAgICBpbnQgaWdub3JlLCBpbnZva2luZ19rZXk7Ci17Ci0gIHJldHVybiAocmxfY29tcGxldGVfaW50ZXJuYWwgKCc/JykpOwotfQotCi1pbnQKLXJsX2luc2VydF9jb21wbGV0aW9ucyAoaWdub3JlLCBpbnZva2luZ19rZXkpCi0gICAgIGludCBpZ25vcmUsIGludm9raW5nX2tleTsKLXsKLSAgcmV0dXJuIChybF9jb21wbGV0ZV9pbnRlcm5hbCAoJyonKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgkJCQkgICAgKi8KLS8qICAgIENvbXBsZXRpb24gdXRpbGl0eSBmdW5jdGlvbnMgICovCi0vKgkJCQkgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gU1RSSU5HMSBvZiBhbnkgY2hhcmFjdGVyIGZyb20gU1RSSU5HMi4KLSAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBpbiBTVFJJTkcxLiAqLwotc3RhdGljIGNoYXIgKgotcmxfc3RycGJyayAoc3RyaW5nMSwgc3RyaW5nMikKLSAgICAgY2hhciAqc3RyaW5nMSwgKnN0cmluZzI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnNjYW47Ci0KLSAgZm9yICg7ICpzdHJpbmcxOyBzdHJpbmcxKyspCi0gICAgewotICAgICAgZm9yIChzY2FuID0gc3RyaW5nMjsgKnNjYW47IHNjYW4rKykKLQl7Ci0JICBpZiAoKnN0cmluZzEgPT0gKnNjYW4pCi0JICAgIHsKLQkgICAgICByZXR1cm4gKHN0cmluZzEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotfQotCi0vKiBUaGUgdXNlciBtdXN0IHByZXNzICJ5IiBvciAibiIuIE5vbi16ZXJvIHJldHVybiBtZWFucyAieSIgcHJlc3NlZC4gKi8KLXN0YXRpYyBpbnQKLWdldF95X29yX24gKCkKLXsKLSAgaW50IGM7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjID0gcmxfcmVhZF9rZXkgKCk7Ci0gICAgICBpZiAoYyA9PSAneScgfHwgYyA9PSAnWScgfHwgYyA9PSAnICcpCi0JcmV0dXJuICgxKTsKLSAgICAgIGlmIChjID09ICduJyB8fCBjID09ICdOJyB8fCBjID09IFJVQk9VVCkKLQlyZXR1cm4gKDApOwotICAgICAgaWYgKGMgPT0gQUJPUlRfQ0hBUikKLQlfcmxfYWJvcnRfaW50ZXJuYWwgKCk7Ci0gICAgICBkaW5nICgpOwotICAgIH0KLX0KLQotI2lmIGRlZmluZWQgKFZJU0lCTEVfU1RBVFMpCi0vKiBSZXR1cm4gdGhlIGNoYXJhY3RlciB3aGljaCBiZXN0IGRlc2NyaWJlcyBGSUxFTkFNRS4KLSAgICAgYEAnIGZvciBzeW1ib2xpYyBsaW5rcwotICAgICBgLycgZm9yIGRpcmVjdG9yaWVzCi0gICAgIGAqJyBmb3IgZXhlY3V0YWJsZXMKLSAgICAgYD0nIGZvciBzb2NrZXRzCi0gICAgIGB8JyBmb3IgRklGT3MKLSAgICAgYCUnIGZvciBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2VzCi0gICAgIGAjJyBmb3IgYmxvY2sgc3BlY2lhbCBkZXZpY2VzICovCi1zdGF0aWMgaW50Ci1zdGF0X2NoYXIgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHN0YXQgZmluZm87Ci0gIGludCBjaGFyYWN0ZXIsIHI7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xTVEFUKSAmJiBkZWZpbmVkIChTX0lTTE5LKQotICByID0gbHN0YXQgKGZpbGVuYW1lLCAmZmluZm8pOwotI2Vsc2UKLSAgciA9IHN0YXQgKGZpbGVuYW1lLCAmZmluZm8pOwotI2VuZGlmCi0KLSAgaWYgKHIgPT0gLTEpCi0gICAgcmV0dXJuICgwKTsKLQotICBjaGFyYWN0ZXIgPSAwOwotICBpZiAoU19JU0RJUiAoZmluZm8uc3RfbW9kZSkpCi0gICAgY2hhcmFjdGVyID0gJy8nOwotI2lmIGRlZmluZWQgKFNfSVNDSFIpCi0gIGVsc2UgaWYgKFNfSVNDSFIgKGZpbmZvLnN0X21vZGUpKQotICAgIGNoYXJhY3RlciA9ICclJzsKLSNlbmRpZiAvKiBTX0lTQ0hSICovCi0jaWYgZGVmaW5lZCAoU19JU0JMSykKLSAgZWxzZSBpZiAoU19JU0JMSyAoZmluZm8uc3RfbW9kZSkpCi0gICAgY2hhcmFjdGVyID0gJyMnOwotI2VuZGlmIC8qIFNfSVNCTEsgKi8KLSNpZiBkZWZpbmVkIChTX0lTTE5LKQotICBlbHNlIGlmIChTX0lTTE5LIChmaW5mby5zdF9tb2RlKSkKLSAgICBjaGFyYWN0ZXIgPSAnQCc7Ci0jZW5kaWYgLyogU19JU0xOSyAqLwotI2lmIGRlZmluZWQgKFNfSVNTT0NLKQotICBlbHNlIGlmIChTX0lTU09DSyAoZmluZm8uc3RfbW9kZSkpCi0gICAgY2hhcmFjdGVyID0gJz0nOwotI2VuZGlmIC8qIFNfSVNTT0NLICovCi0jaWYgZGVmaW5lZCAoU19JU0ZJRk8pCi0gIGVsc2UgaWYgKFNfSVNGSUZPIChmaW5mby5zdF9tb2RlKSkKLSAgICBjaGFyYWN0ZXIgPSAnfCc7Ci0jZW5kaWYKLSAgZWxzZSBpZiAoU19JU1JFRyAoZmluZm8uc3RfbW9kZSkpCi0gICAgewotICAgICAgaWYgKGFjY2VzcyAoZmlsZW5hbWUsIFhfT0spID09IDApCi0JY2hhcmFjdGVyID0gJyonOwotICAgIH0KLSAgcmV0dXJuIChjaGFyYWN0ZXIpOwotfQotI2VuZGlmIC8qIFZJU0lCTEVfU1RBVFMgKi8KLQotLyogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIFBBVEhOQU1FIHRoYXQgc2hvdWxkIGJlIG91dHB1dCB3aGVuIGxpc3RpbmcKLSAgIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAgSWYgd2UgYXJlIGhhY2tpbmcgZmlsZW5hbWUgY29tcGxldGlvbiwgd2UKLSAgIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGJhc2VuYW1lLCB0aGUgcG9ydGlvbiBmb2xsb3dpbmcgdGhlCi0gICBmaW5hbCBzbGFzaC4gIE90aGVyd2lzZSwgd2UgcmV0dXJuIHdoYXQgd2Ugd2VyZSBwYXNzZWQuICovCi1zdGF0aWMgY2hhciAqCi1wcmludGFibGVfcGFydCAocGF0aG5hbWUpCi0gICAgICBjaGFyICpwYXRobmFtZTsKLXsKLSAgY2hhciAqdGVtcDsKLQotICB0ZW1wID0gcmxfZmlsZW5hbWVfY29tcGxldGlvbl9kZXNpcmVkID8gc3RycmNociAocGF0aG5hbWUsICcvJykgOiAoY2hhciAqKU5VTEw7Ci0gIHJldHVybiAodGVtcCA/ICsrdGVtcCA6IHBhdGhuYW1lKTsKLX0KLQotLyogT3V0cHV0IFRPX1BSSU5UIHRvIHJsX291dHN0cmVhbS4gIElmIFZJU0lCTEVfU1RBVFMgaXMgZGVmaW5lZCBhbmQgd2UKLSAgIGFyZSB1c2luZyBpdCwgY2hlY2sgZm9yIGFuZCBvdXRwdXQgYSBzaW5nbGUgY2hhcmFjdGVyIGZvciBgc3BlY2lhbCcKLSAgIGZpbGVuYW1lcy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2Ugb3V0cHV0LiAqLwotCi0jZGVmaW5lIFBVVFgoYykgXAotICAgIGRvIHsgXAotICAgICAgaWYgKENUUkxfQ0hBUiAoYykpIFwKLSAgICAgICAgeyBcCi0gICAgICAgICAgcHV0YyAoJ14nLCBybF9vdXRzdHJlYW0pOyBcCi0gICAgICAgICAgcHV0YyAoVU5DVFJMIChjKSwgcmxfb3V0c3RyZWFtKTsgXAotICAgICAgICAgIHByaW50ZWRfbGVuICs9IDI7IFwKLSAgICAgICAgfSBcCi0gICAgICBlbHNlIGlmIChjID09IFJVQk9VVCkgXAotCXsgXAotCSAgcHV0YyAoJ14nLCBybF9vdXRzdHJlYW0pOyBcCi0JICBwdXRjICgnPycsIHJsX291dHN0cmVhbSk7IFwKLQkgIHByaW50ZWRfbGVuICs9IDI7IFwKLQl9IFwKLSAgICAgIGVsc2UgXAotCXsgXAotCSAgcHV0YyAoYywgcmxfb3V0c3RyZWFtKTsgXAotCSAgcHJpbnRlZF9sZW4rKzsgXAotCX0gXAotICAgIH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQKLXByaW50X2ZpbGVuYW1lICh0b19wcmludCwgZnVsbF9wYXRobmFtZSkKLSAgICAgY2hhciAqdG9fcHJpbnQsICpmdWxsX3BhdGhuYW1lOwotewotICBpbnQgcHJpbnRlZF9sZW4gPSAwOwotI2lmICFkZWZpbmVkIChWSVNJQkxFX1NUQVRTKQotICBjaGFyICpzOwotCi0gIGZvciAocyA9IHRvX3ByaW50OyAqczsgcysrKQotICAgIHsKLSAgICAgIFBVVFggKCpzKTsKLSAgICB9Ci0jZWxzZSAgCi0gIGNoYXIgKnMsIGMsICpuZXdfZnVsbF9wYXRobmFtZTsKLSAgaW50IGV4dGVuc2lvbl9jaGFyLCBzbGVuLCB0bGVuOwotCi0gIGZvciAocyA9IHRvX3ByaW50OyAqczsgcysrKQotICAgIHsKLSAgICAgIFBVVFggKCpzKTsKLSAgICB9Ci0KLSBpZiAocmxfZmlsZW5hbWVfY29tcGxldGlvbl9kZXNpcmVkICYmIHJsX3Zpc2libGVfc3RhdHMpCi0gICAgewotICAgICAgLyogSWYgdG9fcHJpbnQgIT0gZnVsbF9wYXRobmFtZSwgdG9fcHJpbnQgaXMgdGhlIGJhc2VuYW1lIG9mIHRoZQotCSBwYXRoIHBhc3NlZC4gIEluIHRoaXMgY2FzZSwgd2UgdHJ5IHRvIGV4cGFuZCB0aGUgZGlyZWN0b3J5Ci0JIG5hbWUgYmVmb3JlIGNoZWNraW5nIGZvciB0aGUgc3RhdCBjaGFyYWN0ZXIuICovCi0gICAgICBpZiAodG9fcHJpbnQgIT0gZnVsbF9wYXRobmFtZSkKLQl7Ci0JICAvKiBUZXJtaW5hdGUgdGhlIGRpcmVjdG9yeSBuYW1lLiAqLwotCSAgYyA9IHRvX3ByaW50Wy0xXTsKLQkgIHRvX3ByaW50Wy0xXSA9ICdcMCc7Ci0KLQkgIHMgPSB0aWxkZV9leHBhbmQgKGZ1bGxfcGF0aG5hbWUpOwotCSAgaWYgKHJsX2RpcmVjdG9yeV9jb21wbGV0aW9uX2hvb2spCi0JICAgICgqcmxfZGlyZWN0b3J5X2NvbXBsZXRpb25faG9vaykgKCZzKTsKLQotCSAgc2xlbiA9IHN0cmxlbiAocyk7Ci0JICB0bGVuID0gc3RybGVuICh0b19wcmludCk7Ci0JICBuZXdfZnVsbF9wYXRobmFtZSA9IHhtYWxsb2MgKHNsZW4gKyB0bGVuICsgMik7Ci0JICBzdHJjcHkgKG5ld19mdWxsX3BhdGhuYW1lLCBzKTsKLQkgIG5ld19mdWxsX3BhdGhuYW1lW3NsZW5dID0gJy8nOwotCSAgc3RyY3B5IChuZXdfZnVsbF9wYXRobmFtZSArIHNsZW4gKyAxLCB0b19wcmludCk7Ci0KLQkgIGV4dGVuc2lvbl9jaGFyID0gc3RhdF9jaGFyIChuZXdfZnVsbF9wYXRobmFtZSk7Ci0KLQkgIGZyZWUgKG5ld19mdWxsX3BhdGhuYW1lKTsKLQkgIHRvX3ByaW50Wy0xXSA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHMgPSB0aWxkZV9leHBhbmQgKGZ1bGxfcGF0aG5hbWUpOwotCSAgZXh0ZW5zaW9uX2NoYXIgPSBzdGF0X2NoYXIgKHMpOwotCX0KLQotICAgICAgZnJlZSAocyk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uX2NoYXIpCi0JewotCSAgcHV0YyAoZXh0ZW5zaW9uX2NoYXIsIHJsX291dHN0cmVhbSk7Ci0JICBwcmludGVkX2xlbisrOwotCX0KLSAgICB9Ci0jZW5kaWYgLyogVklTSUJMRV9TVEFUUyAqLwotICByZXR1cm4gcHJpbnRlZF9sZW47Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXJsX3F1b3RlX2ZpbGVuYW1lIChzLCBydHlwZSwgcWNwKQotICAgICBjaGFyICpzOwotICAgICBpbnQgcnR5cGU7Ci0gICAgIGNoYXIgKnFjcDsKLXsKLSAgY2hhciAqcjsKLQotICByID0geG1hbGxvYyAoc3RybGVuIChzKSArIDIpOwotICAqciA9ICpybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVyczsKLSAgc3RyY3B5IChyICsgMSwgcyk7Ci0gIGlmIChxY3ApCi0gICAgKnFjcCA9ICpybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVyczsKLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEZpbmQgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudCB3b3JkIGZvciBjb21wbGV0aW9uIHB1cnBvc2VzLCBhbmQgbGVhdmUKLSAgIHJsX3BvaW50IHNldCB0byB0aGUgZW5kIG9mIHRoZSB3b3JkLiAgVGhpcyBmdW5jdGlvbiBza2lwcyBxdW90ZWQKLSAgIHN1YnN0cmluZ3MgKGNoYXJhY3RlcnMgYmV0d2VlbiBtYXRjaGVkIHBhaXJzIG9mIGNoYXJhY3RlcnMgaW4KLSAgIHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLiAgRmlyc3Qgd2UgdHJ5IHRvIGZpbmQgYW4gdW5jbG9zZWQKLSAgIHF1b3RlZCBzdWJzdHJpbmcgb24gd2hpY2ggdG8gZG8gbWF0Y2hpbmcuICBJZiBvbmUgaXMgbm90IGZvdW5kLCB3ZSB1c2UKLSAgIHRoZSB3b3JkIGJyZWFrIGNoYXJhY3RlcnMgdG8gZmluZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCB3b3JkLgotICAgV2UgY2FsbCBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBmdW5jdGlvbiB0byBkZWNpZGUgd2hldGhlciBvciBub3QgYQotICAgcGFydGljdWxhciB3b3JkIGJyZWFrIGNoYXJhY3RlciBpcyBxdW90ZWQ7IGlmIHRoYXQgZnVuY3Rpb24gcmV0dXJucyBhCi0gICBub24temVybyByZXN1bHQsIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3QgYnJlYWsgYSB3b3JkLiAgVGhpcyBmdW5jdGlvbgotICAgcmV0dXJucyB0aGUgb3BlbmluZyBxdW90ZSBjaGFyYWN0ZXIgaWYgd2UgZm91bmQgYW4gdW5jbG9zZWQgcXVvdGVkCi0gICBzdWJzdHJpbmcsICdcMCcgb3RoZXJ3aXNlLiAgRlAsIGlmIG5vbi1udWxsLCBpcyBzZXQgdG8gYSB2YWx1ZSBzYXlpbmcKLSAgIHdoaWNoIChzaGVsbC1saWtlKSBxdW90ZSBjaGFyYWN0ZXJzIHdlIGZvdW5kIChzaW5nbGUgcXVvdGUsIGRvdWJsZQotICAgcXVvdGUsIG9yIGJhY2tzbGFzaCkgYW55d2hlcmUgaW4gdGhlIHN0cmluZy4gIERQLCBpZiBub24tbnVsbCwgaXMgc2V0IHRvCi0gICB0aGUgdmFsdWUgb2YgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIgdGhhdCBjYXVzZWQgYSB3b3JkIGJyZWFrLiAqLwotCi1zdGF0aWMgY2hhcgotZmluZF9jb21wbGV0aW9uX3dvcmQgKGZwLCBkcCkKLSAgICAgaW50ICpmcCwgKmRwOwotewotICBpbnQgc2NhbiwgZW5kLCBmb3VuZF9xdW90ZSwgZGVsaW1pdGVyLCBwYXNzX25leHQsIGlzYnJrOwotICBjaGFyIHF1b3RlX2NoYXI7Ci0KLSAgZW5kID0gcmxfcG9pbnQ7Ci0gIGZvdW5kX3F1b3RlID0gZGVsaW1pdGVyID0gMDsKLSAgcXVvdGVfY2hhciA9ICdcMCc7Ci0KLSAgaWYgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBsaXN0IG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIHVzZWQgaW4gcGFpcnMgdG8KLQkgcXVvdGUgc3Vic3RyaW5ncyBmb3IgdGhlIGNvbXBsZXRlci4gIFRyeSB0byBmaW5kIHRoZSBzdGFydAotCSBvZiBhbiB1bmNsb3NlZCBxdW90ZWQgc3Vic3RyaW5nLiAqLwotICAgICAgLyogRk9VTkRfUVVPVEUgaXMgc2V0IHNvIHdlIGtub3cgd2hhdCBraW5kIG9mIHF1b3RlcyB3ZSBmb3VuZC4gKi8KLSAgICAgIGZvciAoc2NhbiA9IHBhc3NfbmV4dCA9IDA7IHNjYW4gPCBlbmQ7IHNjYW4rKykKLQl7Ci0JICBpZiAocGFzc19uZXh0KQotCSAgICB7Ci0JICAgICAgcGFzc19uZXh0ID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAocmxfbGluZV9idWZmZXJbc2Nhbl0gPT0gJ1xcJykKLQkgICAgewotCSAgICAgIHBhc3NfbmV4dCA9IDE7Ci0JICAgICAgZm91bmRfcXVvdGUgfD0gUkxfUUZfQkFDS1NMQVNIOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmIChxdW90ZV9jaGFyICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBJZ25vcmUgZXZlcnl0aGluZyB1bnRpbCB0aGUgbWF0Y2hpbmcgY2xvc2UgcXVvdGUgY2hhci4gKi8KLQkgICAgICBpZiAocmxfbGluZV9idWZmZXJbc2Nhbl0gPT0gcXVvdGVfY2hhcikKLQkJewotCQkgIC8qIEZvdW5kIG1hdGNoaW5nIGNsb3NlLiAgQWJhbmRvbiB0aGlzIHN1YnN0cmluZy4gKi8KLQkJICBxdW90ZV9jaGFyID0gJ1wwJzsKLQkJICBybF9wb2ludCA9IGVuZDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjaHIgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLCBybF9saW5lX2J1ZmZlcltzY2FuXSkpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCBzdGFydCBvZiBhIHF1b3RlZCBzdWJzdHJpbmcuICovCi0JICAgICAgcXVvdGVfY2hhciA9IHJsX2xpbmVfYnVmZmVyW3NjYW5dOwotCSAgICAgIHJsX3BvaW50ID0gc2NhbiArIDE7Ci0JICAgICAgLyogU2hlbGwtbGlrZSBxdW90aW5nIGNvbnZlbnRpb25zLiAqLwotCSAgICAgIGlmIChxdW90ZV9jaGFyID09ICdcJycpCi0JCWZvdW5kX3F1b3RlIHw9IFJMX1FGX1NJTkdMRV9RVU9URTsKLQkgICAgICBlbHNlIGlmIChxdW90ZV9jaGFyID09ICciJykKLQkJZm91bmRfcXVvdGUgfD0gUkxfUUZfRE9VQkxFX1FVT1RFOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocmxfcG9pbnQgPT0gZW5kICYmIHF1b3RlX2NoYXIgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBXZSBkaWRuJ3QgZmluZCBhbiB1bmNsb3NlZCBxdW90ZWQgc3Vic3RyaW5nIHVwb24gd2hpY2ggdG8gZG8KLSAgICAgICAgIGNvbXBsZXRpb24sIHNvIHVzZSB0aGUgd29yZCBicmVhayBjaGFyYWN0ZXJzIHRvIGZpbmQgdGhlCi0gICAgICAgICBzdWJzdHJpbmcgb24gd2hpY2ggdG8gY29tcGxldGUuICovCi0gICAgICB3aGlsZSAoLS1ybF9wb2ludCkKLQl7Ci0JICBzY2FuID0gcmxfbGluZV9idWZmZXJbcmxfcG9pbnRdOwotCi0JICBpZiAoc3RyY2hyIChybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzLCBzY2FuKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQ2FsbCB0aGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZnVuY3Rpb24gdG8gdGVsbCB1cyB3aGV0aGVyCi0JICAgICB0aGlzIHdvcmQgYnJlYWsgY2hhcmFjdGVyIGlzIHF1b3RlZCBhbmQgc2hvdWxkIGJlIHNraXBwZWQuICovCi0JICBpZiAocmxfY2hhcl9pc19xdW90ZWRfcCAmJiBmb3VuZF9xdW90ZSAmJgotCSAgICAgICgqcmxfY2hhcl9pc19xdW90ZWRfcCkgKHJsX2xpbmVfYnVmZmVyLCBybF9wb2ludCkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBDb252b2x1dGVkIGNvZGUsIGJ1dCBpdCBhdm9pZHMgYW4gbl4yIGFsZ29yaXRobSB3aXRoIGNhbGxzCi0JICAgICB0byBjaGFyX2lzX3F1b3RlZC4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGF0IGFuIHVucXVvdGVkIHdvcmQgYnJlYWssIHRoZW4gYWR2YW5jZSBwYXN0IGl0LiAqLwotICBzY2FuID0gcmxfbGluZV9idWZmZXJbcmxfcG9pbnRdOwotCi0gIC8qIElmIHRoZXJlIGlzIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZ1bmN0aW9uIHRvIHNheSB3aGV0aGVyIG9yIG5vdAotICAgICBhIGNoYXJhY3RlciBpcyBxdW90ZWQgYW5kIHdlIGZvdW5kIGEgcXVvdGUgY2hhcmFjdGVyLCBsZXQgdGhhdAotICAgICBmdW5jdGlvbiBkZWNpZGUgd2hldGhlciBvciBub3QgYSBjaGFyYWN0ZXIgaXMgYSB3b3JkIGJyZWFrLCBldmVuCi0gICAgIGlmIGl0IGlzIGZvdW5kIGluIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMuICovCi0gIGlmIChybF9jaGFyX2lzX3F1b3RlZF9wKQotICAgIGlzYnJrID0gKGZvdW5kX3F1b3RlID09IDAgfHwKLSAJCSgqcmxfY2hhcl9pc19xdW90ZWRfcCkgKHJsX2xpbmVfYnVmZmVyLCBybF9wb2ludCkgPT0gMCkgJiYKLQkgICAgICBzdHJjaHIgKHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMsIHNjYW4pICE9IDA7Ci0gIGVsc2UKLSAgICBpc2JyayA9IHN0cmNociAocmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycywgc2NhbikgIT0gMDsKLQotICBpZiAoaXNicmspCi0gICAgewotICAgICAgLyogSWYgdGhlIGNoYXJhY3RlciB0aGF0IGNhdXNlZCB0aGUgd29yZCBicmVhayB3YXMgYSBxdW90aW5nCi0JIGNoYXJhY3RlciwgdGhlbiByZW1lbWJlciBpdCBhcyB0aGUgZGVsaW1pdGVyLiAqLwotICAgICAgaWYgKHJsX2Jhc2ljX3F1b3RlX2NoYXJhY3RlcnMgJiYgc3RyY2hyIChybF9iYXNpY19xdW90ZV9jaGFyYWN0ZXJzLCBzY2FuKSAmJiAoZW5kIC0gcmxfcG9pbnQpID4gMSkKLQlkZWxpbWl0ZXIgPSBzY2FuOwotCi0gICAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIGlzbid0IG5lZWRlZCB0byBkZXRlcm1pbmUgc29tZXRoaW5nIHNwZWNpYWwKLQkgYWJvdXQgd2hhdCBraW5kIG9mIGNvbXBsZXRpb24gdG8gcGVyZm9ybSwgdGhlbiBhZHZhbmNlIHBhc3QgaXQuICovCi0gICAgICBpZiAocmxfc3BlY2lhbF9wcmVmaXhlcyA9PSAwIHx8IHN0cmNociAocmxfc3BlY2lhbF9wcmVmaXhlcywgc2NhbikgPT0gMCkKLQlybF9wb2ludCsrOwotICAgIH0KLQotICBpZiAoZnApCi0gICAgKmZwID0gZm91bmRfcXVvdGU7Ci0gIGlmIChkcCkKLSAgICAqZHAgPSBkZWxpbWl0ZXI7Ci0KLSAgcmV0dXJuIChxdW90ZV9jaGFyKTsKLX0KLQotc3RhdGljIGNoYXIgKioKLWdlbl9jb21wbGV0aW9uX21hdGNoZXMgKHRleHQsIHN0YXJ0LCBlbmQsIG91cl9mdW5jLCBmb3VuZF9xdW90ZSwgcXVvdGVfY2hhcikKLSAgICAgY2hhciAqdGV4dDsKLSAgICAgaW50IHN0YXJ0LCBlbmQ7Ci0gICAgIEZ1bmN0aW9uICpvdXJfZnVuYzsKLSAgICAgaW50IGZvdW5kX3F1b3RlLCBxdW90ZV9jaGFyOwotewotICBjaGFyICoqbWF0Y2hlcywgKnRlbXA7Ci0KLSAgLyogSWYgdGhlIHVzZXIgd2FudHMgdG8gVFJZIHRvIGNvbXBsZXRlLCBidXQgdGhlbiB3YW50cyB0byBnaXZlCi0gICAgIHVwIGFuZCB1c2UgdGhlIGRlZmF1bHQgY29tcGxldGlvbiBmdW5jdGlvbiwgdGhleSBzZXQgdGhlCi0gICAgIHZhcmlhYmxlIHJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX2Z1bmN0aW9uLiAqLwotICBpZiAocmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24pCi0gICAgewotICAgICAgbWF0Y2hlcyA9ICgqcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24pICh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgaWYgKG1hdGNoZXMgfHwgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fb3ZlcikKLQl7Ci0JICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9vdmVyID0gMDsKLQkgIHJldHVybiAobWF0Y2hlcyk7Ci0JfQotICAgIH0KLQotICAvKiBCZXdhcmUgLS0gd2UncmUgc3RyaXBwaW5nIHRoZSBxdW90ZXMgaGVyZS4gIERvIHRoaXMgb25seSBpZiB3ZSBrbm93Ci0gICAgIHdlIGFyZSBkb2luZyBmaWxlbmFtZSBjb21wbGV0aW9uIGFuZCB0aGUgYXBwbGljYXRpb24gaGFzIGRlZmluZWQgYQotICAgICBmaWxlbmFtZSBkZXF1b3RpbmcgZnVuY3Rpb24uICovCi0gIHRlbXAgPSAoY2hhciAqKU5VTEw7Ci0KLSAgaWYgKGZvdW5kX3F1b3RlICYmIG91cl9mdW5jID09IChGdW5jdGlvbiAqKWZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gJiYKLSAgICAgIHJsX2ZpbGVuYW1lX2RlcXVvdGluZ19mdW5jdGlvbikKLSAgICB7Ci0gICAgICAvKiBkZWxldGUgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzICovCi0gICAgICB0ZW1wID0gKCpybF9maWxlbmFtZV9kZXF1b3RpbmdfZnVuY3Rpb24pICh0ZXh0LCBxdW90ZV9jaGFyKTsKLSAgICAgIHRleHQgPSB0ZW1wOwkvKiBub3QgZnJlZWluZyB0ZXh0IGlzIG5vdCBhIG1lbW9yeSBsZWFrICovCi0gICAgfQotCi0gIG1hdGNoZXMgPSBjb21wbGV0aW9uX21hdGNoZXMgKHRleHQsIChDUEZ1bmN0aW9uICopb3VyX2Z1bmMpOwotICBGUkVFICh0ZW1wKTsKLSAgcmV0dXJuIG1hdGNoZXM7ICAKLX0KLQotLyogRmlsdGVyIG91dCBkdXBsaWNhdGVzIGluIE1BVENIRVMuICBUaGlzIGZyZWVzIHVwIHRoZSBzdHJpbmdzIGluCi0gICBNQVRDSEVTLiAqLwotc3RhdGljIGNoYXIgKioKLXJlbW92ZV9kdXBsaWNhdGVfbWF0Y2hlcyAobWF0Y2hlcykKLSAgICAgY2hhciAqKm1hdGNoZXM7Ci17Ci0gIGNoYXIgKmxvd2VzdF9jb21tb247Ci0gIGludCBpLCBqLCBuZXdsZW47Ci0gIGNoYXIgZGVhZF9zbG90OwotICBjaGFyICoqdGVtcF9hcnJheTsKLQotICAvKiBTb3J0IHRoZSBpdGVtcy4gKi8KLSAgZm9yIChpID0gMDsgbWF0Y2hlc1tpXTsgaSsrKQotICAgIDsKLQotICAvKiBTb3J0IHRoZSBhcnJheSB3aXRob3V0IG1hdGNoZXNbMF0sIHNpbmNlIHdlIG5lZWQgaXQgdG8KLSAgICAgc3RheSBpbiBwbGFjZSBubyBtYXR0ZXIgd2hhdC4gKi8KLSAgaWYgKGkpCi0gICAgcXNvcnQgKG1hdGNoZXMrMSwgaS0xLCBzaXplb2YgKGNoYXIgKiksIF9ybF9xc29ydF9zdHJpbmdfY29tcGFyZSk7Ci0KLSAgLyogUmVtZW1iZXIgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgZm9yIGl0IG1heSBiZSB1bmlxdWUuICovCi0gIGxvd2VzdF9jb21tb24gPSBzYXZlc3RyaW5nIChtYXRjaGVzWzBdKTsKLQotICBmb3IgKGkgPSBuZXdsZW4gPSAwOyBtYXRjaGVzW2kgKyAxXTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG1hdGNoZXNbaV0sIG1hdGNoZXNbaSArIDFdKSA9PSAwKQotCXsKLQkgIGZyZWUgKG1hdGNoZXNbaV0pOwotCSAgbWF0Y2hlc1tpXSA9IChjaGFyICopJmRlYWRfc2xvdDsKLQl9Ci0gICAgICBlbHNlCi0JbmV3bGVuKys7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgbWFya2VkIGFsbCB0aGUgZGVhZCBzbG90cyB3aXRoIChjaGFyICopJmRlYWRfc2xvdC4KLSAgICAgQ29weSBhbGwgdGhlIG5vbi1kZWFkIGVudHJpZXMgaW50byBhIG5ldyBhcnJheS4gKi8KLSAgdGVtcF9hcnJheSA9IChjaGFyICoqKXhtYWxsb2MgKCgzICsgbmV3bGVuKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIGZvciAoaSA9IGogPSAxOyBtYXRjaGVzW2ldOyBpKyspCi0gICAgewotICAgICAgaWYgKG1hdGNoZXNbaV0gIT0gKGNoYXIgKikmZGVhZF9zbG90KQotCXRlbXBfYXJyYXlbaisrXSA9IG1hdGNoZXNbaV07Ci0gICAgfQotICB0ZW1wX2FycmF5W2pdID0gKGNoYXIgKilOVUxMOwotCi0gIGlmIChtYXRjaGVzWzBdICE9IChjaGFyICopJmRlYWRfc2xvdCkKLSAgICBmcmVlIChtYXRjaGVzWzBdKTsKLQotICAvKiBQbGFjZSB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBiYWNrIGluIFswXS4gKi8KLSAgdGVtcF9hcnJheVswXSA9IGxvd2VzdF9jb21tb247Ci0KLSAgLyogSWYgdGhlcmUgaXMgb25lIHN0cmluZyBsZWZ0LCBhbmQgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZQotICAgICBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yLCB0aGVuIHRoZSBMQ0QgaXMgdGhlIHN0cmluZyB0bwotICAgICBpbnNlcnQuICovCi0gIGlmIChqID09IDIgJiYgc3RyY21wICh0ZW1wX2FycmF5WzBdLCB0ZW1wX2FycmF5WzFdKSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKHRlbXBfYXJyYXlbMV0pOwotICAgICAgdGVtcF9hcnJheVsxXSA9IChjaGFyICopTlVMTDsKLSAgICB9Ci0gIHJldHVybiAodGVtcF9hcnJheSk7Ci19Ci0KLS8qIEZpbmQgdGhlIGNvbW1vbiBwcmVmaXggb2YgdGhlIGxpc3Qgb2YgbWF0Y2hlcywgYW5kIHB1dCBpdCBpbnRvCi0gICBtYXRjaGVzWzBdLiAqLwotc3RhdGljIGludAotY29tcHV0ZV9sY2Rfb2ZfbWF0Y2hlcyAobWF0Y2hfbGlzdCwgbWF0Y2hlcywgdGV4dCkKLSAgICAgY2hhciAqKm1hdGNoX2xpc3Q7Ci0gICAgIGludCBtYXRjaGVzOwotICAgICBjaGFyICp0ZXh0OwotewotICByZWdpc3RlciBpbnQgaSwgYzEsIGMyLCBzaTsKLSAgaW50IGxvdzsJCS8qIENvdW50IG9mIG1heC1tYXRjaGVkIGNoYXJhY3RlcnMuICovCi0KLSAgLyogSWYgb25seSBvbmUgbWF0Y2gsIGp1c3QgdXNlIHRoYXQuICBPdGhlcndpc2UsIGNvbXBhcmUgZWFjaAotICAgICBtZW1iZXIgb2YgdGhlIGxpc3Qgd2l0aCB0aGUgbmV4dCwgZmluZGluZyBvdXQgd2hlcmUgdGhleQotICAgICBzdG9wIG1hdGNoaW5nLiAqLwotICBpZiAobWF0Y2hlcyA9PSAxKQotICAgIHsKLSAgICAgIG1hdGNoX2xpc3RbMF0gPSBtYXRjaF9saXN0WzFdOwotICAgICAgbWF0Y2hfbGlzdFsxXSA9IChjaGFyICopTlVMTDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBmb3IgKGkgPSAxLCBsb3cgPSAxMDAwMDA7IGkgPCBtYXRjaGVzOyBpKyspCi0gICAgewotICAgICAgaWYgKF9ybF9jb21wbGV0aW9uX2Nhc2VfZm9sZCkKLQl7Ci0JICBmb3IgKHNpID0gMDsKLQkgICAgICAgKGMxID0gX3JsX3RvX2xvd2VyKG1hdGNoX2xpc3RbaV1bc2ldKSkgJiYKLQkgICAgICAgKGMyID0gX3JsX3RvX2xvd2VyKG1hdGNoX2xpc3RbaSArIDFdW3NpXSkpOwotCSAgICAgICBzaSsrKQotCSAgICBpZiAoYzEgIT0gYzIpCi0JICAgICAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAoc2kgPSAwOwotCSAgICAgICAoYzEgPSBtYXRjaF9saXN0W2ldW3NpXSkgJiYKLQkgICAgICAgKGMyID0gbWF0Y2hfbGlzdFtpICsgMV1bc2ldKTsKLQkgICAgICAgc2krKykKLQkgICAgaWYgKGMxICE9IGMyKQotCSAgICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGxvdyA+IHNpKQotCWxvdyA9IHNpOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSB3ZXJlIG11bHRpcGxlIG1hdGNoZXMsIGJ1dCBub25lIG1hdGNoZWQgdXAgdG8gZXZlbiB0aGUKLSAgICAgZmlyc3QgY2hhcmFjdGVyLCBhbmQgdGhlIHVzZXIgdHlwZWQgc29tZXRoaW5nLCB1c2UgdGhhdCBhcyB0aGUKLSAgICAgdmFsdWUgb2YgbWF0Y2hlc1swXS4gKi8KLSAgaWYgKGxvdyA9PSAwICYmIHRleHQgJiYgKnRleHQpCi0gICAgewotICAgICAgbWF0Y2hfbGlzdFswXSA9IHhtYWxsb2MgKHN0cmxlbiAodGV4dCkgKyAxKTsKLSAgICAgIHN0cmNweSAobWF0Y2hfbGlzdFswXSwgdGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF0Y2hfbGlzdFswXSA9IHhtYWxsb2MgKGxvdyArIDEpOwotICAgICAgc3RybmNweSAobWF0Y2hfbGlzdFswXSwgbWF0Y2hfbGlzdFsxXSwgbG93KTsKLSAgICAgIG1hdGNoX2xpc3RbMF1bbG93XSA9ICdcMCc7Ci0gICAgfQotCi0gIHJldHVybiBtYXRjaGVzOwotfQotCi1zdGF0aWMgaW50Ci1wb3N0cHJvY2Vzc19tYXRjaGVzIChtYXRjaGVzcCwgbWF0Y2hpbmdfZmlsZW5hbWVzKQotICAgICBjaGFyICoqKm1hdGNoZXNwOwotICAgICBpbnQgbWF0Y2hpbmdfZmlsZW5hbWVzOwotewotICBjaGFyICp0LCAqKm1hdGNoZXMsICoqdGVtcF9tYXRjaGVzOwotICBpbnQgbm1hdGNoLCBpOwotCi0gIG1hdGNoZXMgPSAqbWF0Y2hlc3A7Ci0KLSAgLyogSXQgc2VlbXMgdG8gbWUgdGhhdCBpbiBhbGwgdGhlIGNhc2VzIHdlIGhhbmRsZSB3ZSB3b3VsZCBsaWtlCi0gICAgIHRvIGlnbm9yZSBkdXBsaWNhdGUgcG9zc2libGlsaXRpZXMuICBTY2FuIGZvciB0aGUgdGV4dCB0bwotICAgICBpbnNlcnQgYmVpbmcgaWRlbnRpY2FsIHRvIHRoZSBvdGhlciBjb21wbGV0aW9ucy4gKi8KLSAgaWYgKHJsX2lnbm9yZV9jb21wbGV0aW9uX2R1cGxpY2F0ZXMpCi0gICAgewotICAgICAgdGVtcF9tYXRjaGVzID0gcmVtb3ZlX2R1cGxpY2F0ZV9tYXRjaGVzIChtYXRjaGVzKTsKLSAgICAgIGZyZWUgKG1hdGNoZXMpOwotICAgICAgbWF0Y2hlcyA9IHRlbXBfbWF0Y2hlczsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG1hdGNoaW5nIGZpbGVuYW1lcywgdGhlbiBoZXJlIGlzIG91ciBjaGFuY2UgdG8KLSAgICAgZG8gY2xldmVyIHByb2Nlc3NpbmcgYnkgcmUtZXhhbWluaW5nIHRoZSBsaXN0LiAgQ2FsbCB0aGUKLSAgICAgaWdub3JlIGZ1bmN0aW9uIHdpdGggdGhlIGFycmF5IGFzIGEgcGFyYW1ldGVyLiAgSXQgY2FuCi0gICAgIG11bmdlIHRoZSBhcnJheSwgZGVsZXRpbmcgbWF0Y2hlcyBhcyBpdCBkZXNpcmVzLiAqLwotICBpZiAocmxfaWdub3JlX3NvbWVfY29tcGxldGlvbnNfZnVuY3Rpb24gJiYgbWF0Y2hpbmdfZmlsZW5hbWVzKQotICAgIHsKLSAgICAgIGZvciAobm1hdGNoID0gMTsgbWF0Y2hlc1tubWF0Y2hdOyBubWF0Y2grKykKLQk7Ci0gICAgICAodm9pZCkoKnJsX2lnbm9yZV9zb21lX2NvbXBsZXRpb25zX2Z1bmN0aW9uKSAobWF0Y2hlcyk7Ci0gICAgICBpZiAobWF0Y2hlcyA9PSAwIHx8IG1hdGNoZXNbMF0gPT0gMCkKLQl7Ci0JICBGUkVFIChtYXRjaGVzKTsKLQkgICptYXRjaGVzcCA9IChjaGFyICoqKTA7Ci0JICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHdlIHJlbW92ZWQgc29tZSBtYXRjaGVzLCByZWNvbXB1dGUgdGhlIGNvbW1vbiBwcmVmaXguICovCi0JICBmb3IgKGkgPSAxOyBtYXRjaGVzW2ldOyBpKyspCi0JICAgIDsKLQkgIGlmIChpID4gMSAmJiBpIDwgbm1hdGNoKQotCSAgICB7Ci0JICAgICAgdCA9IG1hdGNoZXNbMF07Ci0JICAgICAgY29tcHV0ZV9sY2Rfb2ZfbWF0Y2hlcyAobWF0Y2hlcywgaSAtIDEsIHQpOwotCSAgICAgIEZSRUUgKHQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAqbWF0Y2hlc3AgPSBtYXRjaGVzOwotICByZXR1cm4gKDEpOwotfQotCi0vKiBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBkaXNwbGF5aW5nIGEgbGlzdCBvZiBzdHJpbmdzIGluCi0gICBjb2x1bW5hciBmb3JtYXQgb24gcmVhZGxpbmUncyBvdXRwdXQgc3RyZWFtLiAgTUFUQ0hFUyBpcyB0aGUgbGlzdAotICAgb2Ygc3RyaW5ncywgaW4gYXJndiBmb3JtYXQsIExFTiBpcyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gTUFUQ0hFUywKLSAgIGFuZCBNQVggaXMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gTUFUQ0hFUy4gKi8KLXZvaWQKLXJsX2Rpc3BsYXlfbWF0Y2hfbGlzdCAobWF0Y2hlcywgbGVuLCBtYXgpCi0gICAgIGNoYXIgKiptYXRjaGVzOwotICAgICBpbnQgbGVuLCBtYXg7Ci17Ci0gIGludCBjb3VudCwgbGltaXQsIHByaW50ZWRfbGVuOwotICBpbnQgaSwgaiwgaywgbDsKLSAgY2hhciAqdGVtcDsKLQotICAvKiBIb3cgbWFueSBpdGVtcyBvZiBNQVggbGVuZ3RoIGNhbiB3ZSBmaXQgaW4gdGhlIHNjcmVlbiB3aW5kb3c/ICovCi0gIG1heCArPSAyOwotICBsaW1pdCA9IHNjcmVlbndpZHRoIC8gbWF4OwotICBpZiAobGltaXQgIT0gMSAmJiAobGltaXQgKiBtYXggPT0gc2NyZWVud2lkdGgpKQotICAgIGxpbWl0LS07Ci0KLSAgLyogQXZvaWQgYSBwb3NzaWJsZSBmbG9hdGluZyBleGNlcHRpb24uICBJZiBtYXggPiBzY3JlZW53aWR0aCwKLSAgICAgbGltaXQgd2lsbCBiZSAwIGFuZCBhIGRpdmlkZS1ieS16ZXJvIGZhdWx0IHdpbGwgcmVzdWx0LiAqLwotICBpZiAobGltaXQgPT0gMCkKLSAgICBsaW1pdCA9IDE7Ci0KLSAgLyogSG93IG1hbnkgaXRlcmF0aW9ucyBvZiB0aGUgcHJpbnRpbmcgbG9vcD8gKi8KLSAgY291bnQgPSAobGVuICsgKGxpbWl0IC0gMSkpIC8gbGltaXQ7Ci0KLSAgLyogV2F0Y2ggb3V0IGZvciBzcGVjaWFsIGNhc2UuICBJZiBMRU4gaXMgbGVzcyB0aGFuIExJTUlULCB0aGVuCi0gICAgIGp1c3QgZG8gdGhlIGlubmVyIHByaW50aW5nIGxvb3AuCi0JICAgMCA8IGxlbiA8PSBsaW1pdCAgaW1wbGllcyAgY291bnQgPSAxLiAqLwotCi0gIC8qIFNvcnQgdGhlIGl0ZW1zIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHNvcnRlZC4gKi8KLSAgaWYgKHJsX2lnbm9yZV9jb21wbGV0aW9uX2R1cGxpY2F0ZXMgPT0gMCkKLSAgICBxc29ydCAobWF0Y2hlcyArIDEsIGxlbiwgc2l6ZW9mIChjaGFyICopLCBfcmxfcXNvcnRfc3RyaW5nX2NvbXBhcmUpOwotCi0gIGNybGYgKCk7Ci0KLSAgaWYgKF9ybF9wcmludF9jb21wbGV0aW9uc19ob3Jpem9udGFsbHkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBQcmludCB0aGUgc29ydGVkIGl0ZW1zLCB1cC1hbmQtZG93biBhbHBoYWJldGljYWxseSwgbGlrZSBscy4gKi8KLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gY291bnQ7IGkrKykKLQl7Ci0JICBmb3IgKGogPSAwLCBsID0gaTsgaiA8IGxpbWl0OyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAobCA+IGxlbiB8fCBtYXRjaGVzW2xdID09IDApCi0JCWJyZWFrOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHRlbXAgPSBwcmludGFibGVfcGFydCAobWF0Y2hlc1tsXSk7Ci0JCSAgcHJpbnRlZF9sZW4gPSBwcmludF9maWxlbmFtZSAodGVtcCwgbWF0Y2hlc1tsXSk7Ci0KLQkJICBpZiAoaiArIDEgPCBsaW1pdCkKLQkJICAgIGZvciAoayA9IDA7IGsgPCBtYXggLSBwcmludGVkX2xlbjsgaysrKQotCQkgICAgICBwdXRjICgnICcsIHJsX291dHN0cmVhbSk7Ci0JCX0KLQkgICAgICBsICs9IGNvdW50OwotCSAgICB9Ci0JICBjcmxmICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQcmludCB0aGUgc29ydGVkIGl0ZW1zLCBhY3Jvc3MgYWxwaGFiZXRpY2FsbHksIGxpa2UgbHMgLXguICovCi0gICAgICBmb3IgKGkgPSAxOyBtYXRjaGVzW2ldOyBpKyspCi0JewotCSAgdGVtcCA9IHByaW50YWJsZV9wYXJ0IChtYXRjaGVzW2ldKTsKLQkgIHByaW50ZWRfbGVuID0gcHJpbnRfZmlsZW5hbWUgKHRlbXAsIG1hdGNoZXNbaV0pOwotCSAgLyogSGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhpcyBsaW5lPyAqLwotCSAgaWYgKG1hdGNoZXNbaSsxXSkKLQkgICAgewotCSAgICAgIGlmIChpICYmIChsaW1pdCA+IDEpICYmIChpICUgbGltaXQpID09IDApCi0JCWNybGYgKCk7Ci0JICAgICAgZWxzZQotCQlmb3IgKGsgPSAwOyBrIDwgbWF4IC0gcHJpbnRlZF9sZW47IGsrKykKLQkJICBwdXRjICgnICcsIHJsX291dHN0cmVhbSk7Ci0JICAgIH0KLQl9Ci0gICAgICBjcmxmICgpOwotICAgIH0KLX0KLQotLyogRGlzcGxheSBNQVRDSEVTLCBhIGxpc3Qgb2YgbWF0Y2hpbmcgZmlsZW5hbWVzIGluIGFyZ3YgZm9ybWF0LiAgVGhpcwotICAgaGFuZGxlcyB0aGUgc2ltcGxlIGNhc2UgLS0gYSBzaW5nbGUgbWF0Y2ggLS0gZmlyc3QuICBJZiB0aGVyZSBpcyBtb3JlCi0gICB0aGFuIG9uZSBtYXRjaCwgd2UgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIGxpc3QgYW5kIHRoZQotICAgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHN0cmluZywgd2hpY2ggd2lsbCBiZSBuZWVkZWQgYnkgdGhlIGRpc3BsYXkKLSAgIGZ1bmN0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGhhbmRsZSBkaXNwbGF5aW5nIHRoZSBsaXN0IG9mCi0gICBtYXRjaGVzIGl0c2VsZiwgaXQgc2V0cyBSTF9DT01QTEVUSU9OX0RJU1BMQVlfTUFUQ0hFU19IT09LIHRvIHRoZQotICAgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLCBhbmQgd2UganVzdCBjYWxsIGl0LiAgSWYgd2UncmUgaGFuZGxpbmcgdGhlCi0gICBkaXNwbGF5IG91cnNlbHZlcywgd2UganVzdCBjYWxsIHJsX2Rpc3BsYXlfbWF0Y2hfbGlzdC4gIFdlIGFsc28gY2hlY2sKLSAgIHRoYXQgdGhlIGxpc3Qgb2YgbWF0Y2hlcyBkb2Vzbid0IGV4Y2VlZCB0aGUgdXNlci1zZXR0YWJsZSB0aHJlc2hvbGQsCi0gICBhbmQgYXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIHNlZSB0aGUgbGlzdCBpZiB0aGVyZSBhcmUgbW9yZSBtYXRjaGVzCi0gICB0aGFuIFJMX0NPTVBMRVRJT05fUVVFUllfSVRFTVMuICovCi1zdGF0aWMgdm9pZAotZGlzcGxheV9tYXRjaGVzIChtYXRjaGVzKQotICAgICBjaGFyICoqbWF0Y2hlczsKLXsKLSAgaW50IGxlbiwgbWF4LCBpOwotICBjaGFyICp0ZW1wOwotCi0gIC8qIE1vdmUgdG8gdGhlIGxhc3QgdmlzaWJsZSBsaW5lIG9mIGEgcG9zc2libHktbXVsdGlwbGUtbGluZSBjb21tYW5kLiAqLwotICBfcmxfbW92ZV92ZXJ0IChfcmxfdmlzX2JvdGxpbik7Ci0KLSAgLyogSGFuZGxlIHNpbXBsZSBjYXNlIGZpcnN0LiAgV2hhdCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBhbnN3ZXI/ICovCi0gIGlmIChtYXRjaGVzWzFdID09IDApCi0gICAgewotICAgICAgdGVtcCA9IHByaW50YWJsZV9wYXJ0IChtYXRjaGVzWzBdKTsKLSAgICAgIGNybGYgKCk7Ci0gICAgICBwcmludF9maWxlbmFtZSAodGVtcCwgbWF0Y2hlc1swXSk7Ci0gICAgICBjcmxmICgpOwotCi0gICAgICBybF9mb3JjZWRfdXBkYXRlX2Rpc3BsYXkgKCk7Ci0gICAgICBybF9kaXNwbGF5X2ZpeGVkID0gMTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGFuc3dlci4gIEZpbmQgb3V0IGhvdyBtYW55IHRoZXJlIGFyZSwKLSAgICAgYW5kIGZpbmQgdGhlIG1heGltdW0gcHJpbnRlZCBsZW5ndGggb2YgYSBzaW5nbGUgZW50cnkuICovCi0gIGZvciAobWF4ID0gMCwgaSA9IDE7IG1hdGNoZXNbaV07IGkrKykKLSAgICB7Ci0gICAgICB0ZW1wID0gcHJpbnRhYmxlX3BhcnQgKG1hdGNoZXNbaV0pOwotICAgICAgbGVuID0gc3RybGVuICh0ZW1wKTsKLQotICAgICAgaWYgKGxlbiA+IG1heCkKLQltYXggPSBsZW47Ci0gICAgfQotCi0gIGxlbiA9IGkgLSAxOwotCi0gIC8qIElmIHRoZSBjYWxsZXIgaGFzIGRlZmluZWQgYSBkaXNwbGF5IGhvb2ssIHRoZW4gY2FsbCB0aGF0IG5vdy4gKi8KLSAgaWYgKHJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2spCi0gICAgewotICAgICAgKCpybF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rKSAobWF0Y2hlcywgbGVuLCBtYXgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQkKLSAgLyogSWYgdGhlcmUgYXJlIG1hbnkgaXRlbXMsIHRoZW4gYXNrIHRoZSB1c2VyIGlmIHNoZSByZWFsbHkgd2FudHMgdG8KLSAgICAgc2VlIHRoZW0gYWxsLiAqLwotICBpZiAobGVuID49IHJsX2NvbXBsZXRpb25fcXVlcnlfaXRlbXMpCi0gICAgewotICAgICAgY3JsZiAoKTsKLSAgICAgIGZwcmludGYgKHJsX291dHN0cmVhbSwgIkRpc3BsYXkgYWxsICVkIHBvc3NpYmlsaXRpZXM/ICh5IG9yIG4pIiwgbGVuKTsKLSAgICAgIGZmbHVzaCAocmxfb3V0c3RyZWFtKTsKLSAgICAgIGlmIChnZXRfeV9vcl9uICgpID09IDApCi0JewotCSAgY3JsZiAoKTsKLQotCSAgcmxfZm9yY2VkX3VwZGF0ZV9kaXNwbGF5ICgpOwotCSAgcmxfZGlzcGxheV9maXhlZCA9IDE7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHJsX2Rpc3BsYXlfbWF0Y2hfbGlzdCAobWF0Y2hlcywgbGVuLCBtYXgpOwotCi0gIHJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSAoKTsKLSAgcmxfZGlzcGxheV9maXhlZCA9IDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaCwgbXR5cGUsIHFjKQotICAgICBjaGFyICptYXRjaDsKLSAgICAgaW50IG10eXBlOwotICAgICBjaGFyICpxYzsJLyogUG9pbnRlciB0byBxdW90aW5nIGNoYXJhY3RlciwgaWYgYW55ICovCi17Ci0gIGludCBzaG91bGRfcXVvdGUsIGRvX3JlcGxhY2U7Ci0gIGNoYXIgKnJlcGxhY2VtZW50OwotCi0gIC8qIElmIHdlIGFyZSBkb2luZyBjb21wbGV0aW9uIG9uIHF1b3RlZCBzdWJzdHJpbmdzLCBhbmQgYW55IG1hdGNoZXMKLSAgICAgY29udGFpbiBhbnkgb2YgdGhlIGNvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMsIHRoZW4gYXV0by0KLSAgICAgbWF0aWNhbGx5IHByZXBlbmQgdGhlIHN1YnN0cmluZyB3aXRoIGEgcXVvdGUgY2hhcmFjdGVyIChqdXN0IHBpY2sKLSAgICAgdGhlIGZpcnN0IG9uZSBmcm9tIHRoZSBsaXN0IG9mIHN1Y2gpIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgYmVnaW4KLSAgICAgd2l0aCBhIHF1b3RlIHN0cmluZy4gIEZJWE1FOiBOZWVkIHRvIHJlbW92ZSBhbnkgc3VjaCBhdXRvbWF0aWNhbGx5Ci0gICAgIGluc2VydGVkIHF1b3RlIGNoYXJhY3RlciB3aGVuIGl0IG5vIGxvbmdlciBpcyBuZWNlc3NhcnksIHN1Y2ggYXMKLSAgICAgaWYgd2UgY2hhbmdlIHRoZSBzdHJpbmcgd2UgYXJlIGNvbXBsZXRpbmcgb24gYW5kIHRoZSBuZXcgc2V0IG9mCi0gICAgIG1hdGNoZXMgZG9uJ3QgcmVxdWlyZSBhIHF1b3RlZCBzdWJzdHJpbmcuICovCi0gIHJlcGxhY2VtZW50ID0gbWF0Y2g7Ci0KLSAgc2hvdWxkX3F1b3RlID0gbWF0Y2ggJiYgcmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMgJiYKLQkJCXJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZCAmJgotCQkJcmxfZmlsZW5hbWVfcXVvdGluZ19kZXNpcmVkOwotCi0gIGlmIChzaG91bGRfcXVvdGUpCi0gICAgc2hvdWxkX3F1b3RlID0gc2hvdWxkX3F1b3RlICYmICghcWMgfHwgISpxYyB8fAotCQkgICAgIChybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyAmJiBzdHJjaHIgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLCAqcWMpKSk7Ci0KLSAgaWYgKHNob3VsZF9xdW90ZSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBhIHNpbmdsZSBtYXRjaCwgc2VlIGlmIHdlIG5lZWQgdG8gcXVvdGUgaXQuCi0gICAgICAgICBUaGlzIGFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIGNvbW1vbiBwcmVmaXggb2Ygc2V2ZXJhbAotCSBtYXRjaGVzIG5lZWRzIHRvIGJlIHF1b3RlZC4gKi8KLSAgICAgIHNob3VsZF9xdW90ZSA9IHJsX2ZpbGVuYW1lX3F1b3RlX2NoYXJhY3RlcnMKLQkJCT8gKHJsX3N0cnBicmsgKG1hdGNoLCBybF9maWxlbmFtZV9xdW90ZV9jaGFyYWN0ZXJzKSAhPSAwKQotCQkJOiAwOwotCi0gICAgICBkb19yZXBsYWNlID0gc2hvdWxkX3F1b3RlID8gbXR5cGUgOiBOT19NQVRDSDsKLSAgICAgIC8qIFF1b3RlIHRoZSByZXBsYWNlbWVudCwgc2luY2Ugd2UgZm91bmQgYW4gZW1iZWRkZWQKLQkgd29yZCBicmVhayBjaGFyYWN0ZXIgaW4gYSBwb3RlbnRpYWwgbWF0Y2guICovCi0gICAgICBpZiAoZG9fcmVwbGFjZSAhPSBOT19NQVRDSCAmJiBybF9maWxlbmFtZV9xdW90aW5nX2Z1bmN0aW9uKQotCXJlcGxhY2VtZW50ID0gKCpybF9maWxlbmFtZV9xdW90aW5nX2Z1bmN0aW9uKSAobWF0Y2gsIGRvX3JlcGxhY2UsIHFjKTsKLSAgICB9Ci0gIHJldHVybiAocmVwbGFjZW1lbnQpOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X21hdGNoIChtYXRjaCwgc3RhcnQsIG10eXBlLCBxYykKLSAgICAgY2hhciAqbWF0Y2g7Ci0gICAgIGludCBzdGFydCwgbXR5cGU7Ci0gICAgIGNoYXIgKnFjOwotewotICBjaGFyICpyZXBsYWNlbWVudDsKLSAgY2hhciBvcWM7Ci0KLSAgb3FjID0gcWMgPyAqcWMgOiAnXDAnOwotICByZXBsYWNlbWVudCA9IG1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaCwgbXR5cGUsIHFjKTsKLQotICAvKiBOb3cgaW5zZXJ0IHRoZSBtYXRjaC4gKi8KLSAgaWYgKHJlcGxhY2VtZW50KQotICAgIHsKLSAgICAgIC8qIERvbid0IGRvdWJsZSBhbiBvcGVuaW5nIHF1b3RlIGNoYXJhY3Rlci4gKi8KLSAgICAgIGlmIChxYyAmJiAqcWMgJiYgc3RhcnQgJiYgcmxfbGluZV9idWZmZXJbc3RhcnQgLSAxXSA9PSAqcWMgJiYKLQkgICAgcmVwbGFjZW1lbnRbMF0gPT0gKnFjKQotCXN0YXJ0LS07Ci0gICAgICAvKiBJZiBtYWtlX3F1b3RlZF9yZXBsYWNlbWVudCBjaGFuZ2VkIHRoZSBxdW90aW5nIGNoYXJhY3RlciwgcmVtb3ZlCi0JIHRoZSBvcGVuaW5nIHF1b3RlIGFuZCBpbnNlcnQgdGhlIChmdWxseS1xdW90ZWQpIHJlcGxhY2VtZW50LiAqLwotICAgICAgZWxzZSBpZiAocWMgJiYgKCpxYyAhPSBvcWMpICYmIHN0YXJ0ICYmIHJsX2xpbmVfYnVmZmVyW3N0YXJ0IC0gMV0gPT0gb3FjICYmCi0JICAgIHJlcGxhY2VtZW50WzBdICE9IG9xYykKLQlzdGFydC0tOwotICAgICAgX3JsX3JlcGxhY2VfdGV4dCAocmVwbGFjZW1lbnQsIHN0YXJ0LCBybF9wb2ludCAtIDEpOwotICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG1hdGNoKQotICAgICAgICBmcmVlIChyZXBsYWNlbWVudCk7Ci0gICAgfQotfQotCi0vKiBBcHBlbmQgYW55IG5lY2Vzc2FyeSBjbG9zaW5nIHF1b3RlIGFuZCBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgdG8gdGhlCi0gICBqdXN0LWluc2VydGVkIG1hdGNoLiAgSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0IGRpcmVjdG9yaWVzCi0gICBzaG91bGQgYmUgbWFya2VkIGJ5IGEgdHJhaWxpbmcgYC8nLCBhcHBlbmQgb25lIG9mIHRob3NlIGluc3RlYWQuICBUaGUKLSAgIGRlZmF1bHQgdHJhaWxpbmcgY2hhcmFjdGVyIGlzIGEgc3BhY2UuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAgYXBwZW5kZWQuICovCi1zdGF0aWMgaW50Ci1hcHBlbmRfdG9fbWF0Y2ggKHRleHQsIGRlbGltaXRlciwgcXVvdGVfY2hhcikKLSAgICAgY2hhciAqdGV4dDsKLSAgICAgaW50IGRlbGltaXRlciwgcXVvdGVfY2hhcjsKLXsKLSAgY2hhciB0ZW1wX3N0cmluZ1s0XSwgKmZpbGVuYW1lOwotICBpbnQgdGVtcF9zdHJpbmdfaW5kZXg7Ci0gIHN0cnVjdCBzdGF0IGZpbmZvOwotCi0gIHRlbXBfc3RyaW5nX2luZGV4ID0gMDsKLSAgaWYgKHF1b3RlX2NoYXIgJiYgcmxfcG9pbnQgJiYgcmxfbGluZV9idWZmZXJbcmxfcG9pbnQgLSAxXSAhPSBxdW90ZV9jaGFyKQotICAgIHRlbXBfc3RyaW5nW3RlbXBfc3RyaW5nX2luZGV4KytdID0gcXVvdGVfY2hhcjsKLQotICBpZiAoZGVsaW1pdGVyKQotICAgIHRlbXBfc3RyaW5nW3RlbXBfc3RyaW5nX2luZGV4KytdID0gZGVsaW1pdGVyOwotICBlbHNlIGlmIChybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIpCi0gICAgdGVtcF9zdHJpbmdbdGVtcF9zdHJpbmdfaW5kZXgrK10gPSBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXI7Ci0KLSAgdGVtcF9zdHJpbmdbdGVtcF9zdHJpbmdfaW5kZXgrK10gPSAnXDAnOwotCi0gIGlmIChybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKHRleHQpOwotICAgICAgaWYgKHN0YXQgKGZpbGVuYW1lLCAmZmluZm8pID09IDAgJiYgU19JU0RJUiAoZmluZm8uc3RfbW9kZSkpCi0JewotCSAgaWYgKF9ybF9jb21wbGV0ZV9tYXJrX2RpcmVjdG9yaWVzICYmIHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSAhPSAnLycpCi0JICAgIHJsX2luc2VydF90ZXh0ICgiLyIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmxfcG9pbnQgPT0gcmxfZW5kKQotCSAgICBybF9pbnNlcnRfdGV4dCAodGVtcF9zdHJpbmcpOwotCX0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmxfcG9pbnQgPT0gcmxfZW5kKQotCXJsX2luc2VydF90ZXh0ICh0ZW1wX3N0cmluZyk7Ci0gICAgfQotCi0gIHJldHVybiAodGVtcF9zdHJpbmdfaW5kZXgpOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2FsbF9tYXRjaGVzIChtYXRjaGVzLCBwb2ludCwgcWMpCi0gICAgIGNoYXIgKiptYXRjaGVzOwotICAgICBpbnQgcG9pbnQ7Ci0gICAgIGNoYXIgKnFjOwotewotICBpbnQgaTsKLSAgY2hhciAqcnA7Ci0KLSAgcmxfYmVnaW5fdW5kb19ncm91cCAoKTsKLSAgLyogcmVtb3ZlIGFueSBvcGVuaW5nIHF1b3RlIGNoYXJhY3RlcjsgbWFrZV9xdW90ZWRfcmVwbGFjZW1lbnQgd2lsbCBhZGQKLSAgICAgaXQgYmFjay4gKi8KLSAgaWYgKHFjICYmICpxYyAmJiBwb2ludCAmJiBybF9saW5lX2J1ZmZlcltwb2ludCAtIDFdID09ICpxYykKLSAgICBwb2ludC0tOwotICBybF9kZWxldGVfdGV4dCAocG9pbnQsIHJsX3BvaW50KTsKLSAgcmxfcG9pbnQgPSBwb2ludDsKLQotICBpZiAobWF0Y2hlc1sxXSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAxOyBtYXRjaGVzW2ldOyBpKyspCi0JewotCSAgcnAgPSBtYWtlX3F1b3RlZF9yZXBsYWNlbWVudCAobWF0Y2hlc1tpXSwgU0lOR0xFX01BVENILCBxYyk7Ci0JICBybF9pbnNlcnRfdGV4dCAocnApOwotCSAgcmxfaW5zZXJ0X3RleHQgKCIgIik7Ci0JICBpZiAocnAgIT0gbWF0Y2hlc1tpXSkKLQkgICAgZnJlZSAocnApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBycCA9IG1ha2VfcXVvdGVkX3JlcGxhY2VtZW50IChtYXRjaGVzWzBdLCBTSU5HTEVfTUFUQ0gsIHFjKTsKLSAgICAgIHJsX2luc2VydF90ZXh0IChycCk7Ci0gICAgICBybF9pbnNlcnRfdGV4dCAoIiAiKTsKLSAgICAgIGlmIChycCAhPSBtYXRjaGVzWzBdKQotCWZyZWUgKHJwKTsKLSAgICB9Ci0gIHJsX2VuZF91bmRvX2dyb3VwICgpOwotfQotCi1zdGF0aWMgdm9pZAotZnJlZV9tYXRjaF9saXN0IChtYXRjaGVzKQotICAgICBjaGFyICoqbWF0Y2hlczsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgbWF0Y2hlc1tpXTsgaSsrKQotICAgIGZyZWUgKG1hdGNoZXNbaV0pOwotICBmcmVlIChtYXRjaGVzKTsKLX0KLQotLyogQ29tcGxldGUgdGhlIHdvcmQgYXQgb3IgYmVmb3JlIHBvaW50LgotICAgV0hBVF9UT19ETyBzYXlzIHdoYXQgdG8gZG8gd2l0aCB0aGUgY29tcGxldGlvbi4KLSAgIGA/JyBtZWFucyBsaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLSAgIFRBQiBtZWFucyBkbyBzdGFuZGFyZCBjb21wbGV0aW9uLgotICAgYConIG1lYW5zIGluc2VydCBhbGwgb2YgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotICAgYCEnIG1lYW5zIHRvIGRvIHN0YW5kYXJkIGNvbXBsZXRpb24sIGFuZCBsaXN0IGFsbCBwb3NzaWJsZSBjb21wbGV0aW9ucyBpZgotICAgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZS4gKi8KLWludAotcmxfY29tcGxldGVfaW50ZXJuYWwgKHdoYXRfdG9fZG8pCi0gICAgIGludCB3aGF0X3RvX2RvOwotewotICBjaGFyICoqbWF0Y2hlczsKLSAgRnVuY3Rpb24gKm91cl9mdW5jOwotICBpbnQgc3RhcnQsIGVuZCwgZGVsaW1pdGVyLCBmb3VuZF9xdW90ZSwgaTsKLSAgY2hhciAqdGV4dCwgKnNhdmVkX2xpbmVfYnVmZmVyOwotICBjaGFyIHF1b3RlX2NoYXI7Ci0KLSAgLyogT25seSB0aGUgY29tcGxldGlvbiBlbnRyeSBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoZXNlLiAqLwotICBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQgPSAwOwotICBybF9maWxlbmFtZV9xdW90aW5nX2Rlc2lyZWQgPSAxOwotICBybF9jb21wbGV0aW9uX3R5cGUgPSB3aGF0X3RvX2RvOwotCi0gIHNhdmVkX2xpbmVfYnVmZmVyID0gcmxfbGluZV9idWZmZXIgPyBzYXZlc3RyaW5nIChybF9saW5lX2J1ZmZlcikgOiAoY2hhciAqKU5VTEw7Ci0gIG91cl9mdW5jID0gcmxfY29tcGxldGlvbl9lbnRyeV9mdW5jdGlvbgotCQk/IHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24KLQkJOiAoRnVuY3Rpb24gKilmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uOwotCi0gIC8qIFdlIG5vdyBsb29rIGJhY2t3YXJkcyBmb3IgdGhlIHN0YXJ0IG9mIGEgZmlsZW5hbWUvdmFyaWFibGUgd29yZC4gKi8KLSAgZW5kID0gcmxfcG9pbnQ7Ci0gIGZvdW5kX3F1b3RlID0gZGVsaW1pdGVyID0gMDsKLSAgcXVvdGVfY2hhciA9ICdcMCc7Ci0KLSAgaWYgKHJsX3BvaW50KQotICAgIC8qIFRoaXMgKHBvc3NpYmx5KSBjaGFuZ2VzIHJsX3BvaW50LiAgSWYgaXQgcmV0dXJucyBhIG5vbi16ZXJvIGNoYXIsCi0gICAgICAgd2Uga25vdyB3ZSBoYXZlIGFuIG9wZW4gcXVvdGUuICovCi0gICAgcXVvdGVfY2hhciA9IGZpbmRfY29tcGxldGlvbl93b3JkICgmZm91bmRfcXVvdGUsICZkZWxpbWl0ZXIpOwotCi0gIHN0YXJ0ID0gcmxfcG9pbnQ7Ci0gIHJsX3BvaW50ID0gZW5kOwotCi0gIHRleHQgPSBybF9jb3B5X3RleHQgKHN0YXJ0LCBlbmQpOwotICBtYXRjaGVzID0gZ2VuX2NvbXBsZXRpb25fbWF0Y2hlcyAodGV4dCwgc3RhcnQsIGVuZCwgb3VyX2Z1bmMsIGZvdW5kX3F1b3RlLCBxdW90ZV9jaGFyKTsKLSAgZnJlZSAodGV4dCk7Ci0KLSAgaWYgKG1hdGNoZXMgPT0gMCkKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgRlJFRSAoc2F2ZWRfbGluZV9idWZmZXIpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSNpZiAwCi0gIC8qIElmIHdlIGFyZSBtYXRjaGluZyBmaWxlbmFtZXMsIG91cl9mdW5jIHdpbGwgaGF2ZSBiZWVuIHNldCB0bwotICAgICBmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICovCi0gIGkgPSBvdXJfZnVuYyA9PSAoRnVuY3Rpb24gKilmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uOwotI2Vsc2UKLSAgLyogSWYgd2UgYXJlIG1hdGNoaW5nIGZpbGVuYW1lcywgdGhlIGF0dGVtcHRlZCBjb21wbGV0aW9uIGZ1bmN0aW9uIHdpbGwKLSAgICAgaGF2ZSBzZXQgcmxfZmlsZW5hbWVfY29tcGxldGlvbl9kZXNpcmVkIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgYmFzaWMKLSAgICAgZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiBkb2VzIHRoaXMuICovCi0gIGkgPSBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQ7Ci0jZW5kaWYKLQotICBpZiAocG9zdHByb2Nlc3NfbWF0Y2hlcyAoJm1hdGNoZXMsIGkpID09IDApCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIEZSRUUgKHNhdmVkX2xpbmVfYnVmZmVyKTsKLSAgICAgIGNvbXBsZXRpb25fY2hhbmdlZF9idWZmZXIgPSAwOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgc3dpdGNoICh3aGF0X3RvX2RvKQotICAgIHsKLSAgICBjYXNlIFRBQjoKLSAgICBjYXNlICchJzoKLSAgICAgIC8qIEluc2VydCB0aGUgZmlyc3QgbWF0Y2ggd2l0aCBwcm9wZXIgcXVvdGluZy4gKi8KLSAgICAgIGlmICgqbWF0Y2hlc1swXSkKLQlpbnNlcnRfbWF0Y2ggKG1hdGNoZXNbMF0sIHN0YXJ0LCBtYXRjaGVzWzFdID8gTVVMVF9NQVRDSCA6IFNJTkdMRV9NQVRDSCwgJnF1b3RlX2NoYXIpOwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbW9yZSBtYXRjaGVzLCByaW5nIHRoZSBiZWxsIHRvIGluZGljYXRlLgotCSBJZiB3ZSBhcmUgaW4gdmkgbW9kZSwgUG9zaXguMiBzYXlzIHRvIG5vdCByaW5nIHRoZSBiZWxsLgotCSBJZiB0aGUgYHNob3ctYWxsLWlmLWFtYmlndW91cycgdmFyaWFibGUgaXMgc2V0LCBkaXNwbGF5Ci0JIGFsbCB0aGUgbWF0Y2hlcyBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgaWYgdGhpcyB3YXMgdGhlCi0JIG9ubHkgbWF0Y2gsIGFuZCB3ZSBhcmUgaGFja2luZyBmaWxlcywgY2hlY2sgdGhlIGZpbGUgdG8KLQkgc2VlIGlmIGl0IHdhcyBhIGRpcmVjdG9yeS4gIElmIHNvLCBhbmQgdGhlIGBtYXJrLWRpcmVjdG9yaWVzJwotCSB2YXJpYWJsZSBpcyBzZXQsIGFkZCBhICcvJyB0byB0aGUgbmFtZS4gIElmIG5vdCwgYW5kIHdlCi0JIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB0aGVuIGFkZCBhIHNwYWNlLiAgKi8KLSAgICAgIGlmIChtYXRjaGVzWzFdKQotCXsKLQkgIGlmICh3aGF0X3RvX2RvID09ICchJykKLQkgICAgewotCSAgICAgIGRpc3BsYXlfbWF0Y2hlcyAobWF0Y2hlcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJsX2VkaXRpbmdfbW9kZSAhPSB2aV9tb2RlKQotCSAgICBkaW5nICgpOwkvKiBUaGVyZSBhcmUgb3RoZXIgbWF0Y2hlcyByZW1haW5pbmcuICovCi0JfQotICAgICAgZWxzZQotCWFwcGVuZF90b19tYXRjaCAobWF0Y2hlc1swXSwgZGVsaW1pdGVyLCBxdW90ZV9jaGFyKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcqJzoKLSAgICAgIGluc2VydF9hbGxfbWF0Y2hlcyAobWF0Y2hlcywgc3RhcnQsICZxdW90ZV9jaGFyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPyc6Ci0gICAgICBkaXNwbGF5X21hdGNoZXMgKG1hdGNoZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHJcbnJlYWRsaW5lOiBiYWQgdmFsdWUgJWQgZm9yIHdoYXRfdG9fZG8gaW4gcmxfY29tcGxldGVcbiIsIHdoYXRfdG9fZG8pOwotICAgICAgZGluZyAoKTsKLSAgICAgIEZSRUUgKHNhdmVkX2xpbmVfYnVmZmVyKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBmcmVlX21hdGNoX2xpc3QgKG1hdGNoZXMpOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbGluZSBoYXMgY2hhbmdlZCB0aHJvdWdoIGFsbCBvZiB0aGlzIG1hbmlwdWxhdGlvbi4gKi8KLSAgaWYgKHNhdmVkX2xpbmVfYnVmZmVyKQotICAgIHsKLSAgICAgIGNvbXBsZXRpb25fY2hhbmdlZF9idWZmZXIgPSBzdHJjbXAgKHJsX2xpbmVfYnVmZmVyLCBzYXZlZF9saW5lX2J1ZmZlcikgIT0gMDsKLSAgICAgIGZyZWUgKHNhdmVkX2xpbmVfYnVmZmVyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgkJCQkJCQkgICAgICAgKi8KLS8qICBBcHBsaWNhdGlvbi1jYWxsYWJsZSBjb21wbGV0aW9uIG1hdGNoIGdlbmVyYXRvciBmdW5jdGlvbnMgICovCi0vKgkJCQkJCQkgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFJldHVybiBhbiBhcnJheSBvZiAoY2hhciAqKSB3aGljaCBpcyBhIGxpc3Qgb2YgY29tcGxldGlvbnMgZm9yIFRFWFQuCi0gICBJZiB0aGVyZSBhcmUgbm8gY29tcGxldGlvbnMsIHJldHVybiBhIE5VTEwgcG9pbnRlci4KLSAgIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhlIHN1YnN0aXR1dGlvbiBmb3IgVEVYVC4KLSAgIFRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotICAgVGhlIGFycmF5IGlzIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTEwgcG9pbnRlci4KLQotICAgRU5UUllfRlVOQ1RJT04gaXMgYSBmdW5jdGlvbiBvZiB0d28gYXJncywgYW5kIHJldHVybnMgYSAoY2hhciAqKS4KLSAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIFRFWFQuCi0gICAgIFRoZSBzZWNvbmQgaXMgYSBzdGF0ZSBhcmd1bWVudDsgaXQgc2hvdWxkIGJlIHplcm8gb24gdGhlIGZpcnN0IGNhbGwsIGFuZAotICAgICBub24temVybyBvbiBzdWJzZXF1ZW50IGNhbGxzLiAgSXQgcmV0dXJucyBhIE5VTEwgcG9pbnRlciB0byB0aGUgY2FsbGVyCi0gICAgIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgbWF0Y2hlcy4KLSAqLwotY2hhciAqKgotY29tcGxldGlvbl9tYXRjaGVzICh0ZXh0LCBlbnRyeV9mdW5jdGlvbikKLSAgICAgY2hhciAqdGV4dDsKLSAgICAgQ1BGdW5jdGlvbiAqZW50cnlfZnVuY3Rpb247Ci17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBpbiBtYXRjaF9saXN0LiAqLwotICBpbnQgbWF0Y2hfbGlzdF9zaXplOwotCi0gIC8qIFRoZSBsaXN0IG9mIG1hdGNoZXMuICovCi0gIGNoYXIgKiptYXRjaF9saXN0OwotCi0gIC8qIE51bWJlciBvZiBtYXRjaGVzIGFjdHVhbGx5IGZvdW5kLiAqLwotICBpbnQgbWF0Y2hlczsKLQotICAvKiBUZW1wb3Jhcnkgc3RyaW5nIGJpbmRlci4gKi8KLSAgY2hhciAqc3RyaW5nOwotCi0gIG1hdGNoZXMgPSAwOwotICBtYXRjaF9saXN0X3NpemUgPSAxMDsKLSAgbWF0Y2hfbGlzdCA9IChjaGFyICoqKXhtYWxsb2MgKChtYXRjaF9saXN0X3NpemUgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIG1hdGNoX2xpc3RbMV0gPSAoY2hhciAqKU5VTEw7Ci0KLSAgd2hpbGUgKHN0cmluZyA9ICgqZW50cnlfZnVuY3Rpb24pICh0ZXh0LCBtYXRjaGVzKSkKLSAgICB7Ci0gICAgICBpZiAobWF0Y2hlcyArIDEgPT0gbWF0Y2hfbGlzdF9zaXplKQotCW1hdGNoX2xpc3QgPSAoY2hhciAqKil4cmVhbGxvYwotCSAgKG1hdGNoX2xpc3QsICgobWF0Y2hfbGlzdF9zaXplICs9IDEwKSArIDEpICogc2l6ZW9mIChjaGFyICopKTsKLQotICAgICAgbWF0Y2hfbGlzdFsrK21hdGNoZXNdID0gc3RyaW5nOwotICAgICAgbWF0Y2hfbGlzdFttYXRjaGVzICsgMV0gPSAoY2hhciAqKU5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIHdlcmUgYW55IG1hdGNoZXMsIHRoZW4gbG9vayB0aHJvdWdoIHRoZW0gZmluZGluZyBvdXQgdGhlCi0gICAgIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IuICBUaGF0IHRoZW4gYmVjb21lcyBtYXRjaF9saXN0WzBdLiAqLwotICBpZiAobWF0Y2hlcykKLSAgICBjb21wdXRlX2xjZF9vZl9tYXRjaGVzIChtYXRjaF9saXN0LCBtYXRjaGVzLCB0ZXh0KTsKLSAgZWxzZQkJCQkvKiBUaGVyZSB3ZXJlIG5vIG1hdGNoZXMuICovCi0gICAgewotICAgICAgZnJlZSAobWF0Y2hfbGlzdCk7Ci0gICAgICBtYXRjaF9saXN0ID0gKGNoYXIgKiopTlVMTDsKLSAgICB9Ci0gIHJldHVybiAobWF0Y2hfbGlzdCk7Ci19Ci0KLS8qIEEgY29tcGxldGlvbiBmdW5jdGlvbiBmb3IgdXNlcm5hbWVzLgotICAgVEVYVCBjb250YWlucyBhIHBhcnRpYWwgdXNlcm5hbWUgcHJlY2VkZWQgYnkgYSByYW5kb20KLSAgIGNoYXJhY3RlciAodXN1YWxseSBgficpLiAgKi8KLWNoYXIgKgotdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAodGV4dCwgc3RhdGUpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCBzdGF0ZTsKLXsKLSNpZiBkZWZpbmVkIChfX1dJTjMyX18pIHx8IGRlZmluZWQgKF9fT1BFTk5UKQotICByZXR1cm4gKGNoYXIgKilOVUxMOwotI2Vsc2UgLyogIV9fV0lOMzJfXyAmJiAhX19PUEVOTlQgKi8KLSAgc3RhdGljIGNoYXIgKnVzZXJuYW1lID0gKGNoYXIgKilOVUxMOwotICBzdGF0aWMgc3RydWN0IHBhc3N3ZCAqZW50cnk7Ci0gIHN0YXRpYyBpbnQgbmFtZWxlbiwgZmlyc3RfY2hhciwgZmlyc3RfY2hhcl9sb2M7Ci0gIGNoYXIgKnZhbHVlOwotCi0gIGlmIChzdGF0ZSA9PSAwKQotICAgIHsKLSAgICAgIEZSRUUgKHVzZXJuYW1lKTsKLQotICAgICAgZmlyc3RfY2hhciA9ICp0ZXh0OwotICAgICAgZmlyc3RfY2hhcl9sb2MgPSBmaXJzdF9jaGFyID09ICd+JzsKLQotICAgICAgdXNlcm5hbWUgPSBzYXZlc3RyaW5nICgmdGV4dFtmaXJzdF9jaGFyX2xvY10pOwotICAgICAgbmFtZWxlbiA9IHN0cmxlbiAodXNlcm5hbWUpOwotICAgICAgc2V0cHdlbnQgKCk7Ci0gICAgfQotCi0gIHdoaWxlIChlbnRyeSA9IGdldHB3ZW50ICgpKQotICAgIHsKLSAgICAgIC8qIE51bGwgdXNlcm5hbWVzIHNob3VsZCByZXN1bHQgaW4gYWxsIHVzZXJzIGFzIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAqLwotICAgICAgaWYgKG5hbWVsZW4gPT0gMCB8fCAoU1RSRVFOICh1c2VybmFtZSwgZW50cnktPnB3X25hbWUsIG5hbWVsZW4pKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotICAgICAgZW5kcHdlbnQgKCk7Ci0gICAgICByZXR1cm4gKChjaGFyICopTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSB4bWFsbG9jICgyICsgc3RybGVuIChlbnRyeS0+cHdfbmFtZSkpOwotCi0gICAgICAqdmFsdWUgPSAqdGV4dDsKLQotICAgICAgc3RyY3B5ICh2YWx1ZSArIGZpcnN0X2NoYXJfbG9jLCBlbnRyeS0+cHdfbmFtZSk7Ci0KLSAgICAgIGlmIChmaXJzdF9jaGFyID09ICd+JykKLQlybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQgPSAxOwotCi0gICAgICByZXR1cm4gKHZhbHVlKTsKLSAgICB9Ci0jZW5kaWYgLyogIV9fR08zMl9fICovCi19Ci0KLS8qIE9rYXksIG5vdyB3ZSB3cml0ZSB0aGUgZW50cnlfZnVuY3Rpb24gZm9yIGZpbGVuYW1lIGNvbXBsZXRpb24uICBJbiB0aGUKLSAgIGdlbmVyYWwgY2FzZS4gIE5vdGUgdGhhdCBjb21wbGV0aW9uIGluIHRoZSBzaGVsbCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKLSAgIGJlY2F1c2Ugb2YgYWxsIHRoZSBwYXRobmFtZXMgdGhhdCBtdXN0IGJlIGZvbGxvd2VkIHdoZW4gbG9va2luZyB1cCB0aGUKLSAgIGNvbXBsZXRpb24gZm9yIGEgY29tbWFuZC4gKi8KLWNoYXIgKgotZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAodGV4dCwgc3RhdGUpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCBzdGF0ZTsKLXsKLSAgc3RhdGljIERJUiAqZGlyZWN0b3J5ID0gKERJUiAqKU5VTEw7Ci0gIHN0YXRpYyBjaGFyICpmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLSAgc3RhdGljIGNoYXIgKmRpcm5hbWUgPSAoY2hhciAqKU5VTEw7Ci0gIHN0YXRpYyBjaGFyICp1c2Vyc19kaXJuYW1lID0gKGNoYXIgKilOVUxMOwotICBzdGF0aWMgaW50IGZpbGVuYW1lX2xlbjsKLSAgY2hhciAqdGVtcDsKLSAgaW50IGRpcmxlbjsKLSAgc3RydWN0IGRpcmVudCAqZW50cnk7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3RhdGUsIHRoZW4gZG8gc29tZSBpbml0aWFsaXphdGlvbi4gKi8KLSAgaWYgKHN0YXRlID09IDApCi0gICAgewotICAgICAgLyogSWYgd2Ugd2VyZSBpbnRlcnJ1cHRlZCBiZWZvcmUgY2xvc2luZyB0aGUgZGlyZWN0b3J5IG9yIHJlYWRpbmcKLQkgYWxsIG9mIGl0cyBjb250ZW50cywgY2xvc2UgaXQuICovCi0gICAgICBpZiAoZGlyZWN0b3J5KQotCXsKLQkgIGNsb3NlZGlyIChkaXJlY3RvcnkpOwotCSAgZGlyZWN0b3J5ID0gKERJUiAqKU5VTEw7Ci0JfQotICAgICAgRlJFRSAoZGlybmFtZSk7Ci0gICAgICBGUkVFIChmaWxlbmFtZSk7Ci0gICAgICBGUkVFICh1c2Vyc19kaXJuYW1lKTsKLQotICAgICAgZmlsZW5hbWUgPSBzYXZlc3RyaW5nICh0ZXh0KTsKLSAgICAgIGlmICgqdGV4dCA9PSAwKQotCXRleHQgPSAiLiI7Ci0gICAgICBkaXJuYW1lID0gc2F2ZXN0cmluZyAodGV4dCk7Ci0KLSAgICAgIHRlbXAgPSBzdHJyY2hyIChkaXJuYW1lLCAnLycpOwotCi0gICAgICBpZiAodGVtcCkKLQl7Ci0JICBzdHJjcHkgKGZpbGVuYW1lLCArK3RlbXApOwotCSAgKnRlbXAgPSAnXDAnOwotCX0KLSNpZiBkZWZpbmVkIChfX1dJTjMyX18pIHx8IGRlZmluZWQgKF9fT1BFTk5UKSB8fCBkZWZpbmVkIChfX01TRE9TX18pCi0gICAgICAvKiBIYW5kbGUgdGhlIGRyaXZlLXJlbGF0aXZlIG5hbWVzICJkOmZvby9iYXIiLiAgKi8KLSAgICAgIGVsc2UgaWYgKGRpcm5hbWVbMV0gPT0gJzonKQotCXsKLQkgIHN0cmNweSAoZmlsZW5hbWUsIGRpcm5hbWUgKyAyKTsKLQkgIGRpcm5hbWVbMl0gPSAnXDAnOwotCX0KLSNlbmRpZgotICAgICAgZWxzZQotCXsKLQkgIGRpcm5hbWVbMF0gPSAnLic7Ci0JICBkaXJuYW1lWzFdID0gJ1wwJzsKLQl9Ci0KLSAgICAgIC8qIFdlIGFyZW4ndCBkb25lIHlldC4gIFdlIGFsc28gc3VwcG9ydCB0aGUgIn51c2VyIiBzeW50YXguICovCi0KLSAgICAgIC8qIFNhdmUgdGhlIHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHRoZSB1c2VyIHR5cGVkLiAqLwotICAgICAgdXNlcnNfZGlybmFtZSA9IHNhdmVzdHJpbmcgKGRpcm5hbWUpOwotCi0gICAgICBpZiAoKmRpcm5hbWUgPT0gJ34nKQotCXsKLQkgIHRlbXAgPSB0aWxkZV9leHBhbmQgKGRpcm5hbWUpOwotCSAgZnJlZSAoZGlybmFtZSk7Ci0JICBkaXJuYW1lID0gdGVtcDsKLQl9Ci0KLSAgICAgIGlmIChybF9kaXJlY3RvcnlfY29tcGxldGlvbl9ob29rICYmICgqcmxfZGlyZWN0b3J5X2NvbXBsZXRpb25faG9vaykgKCZkaXJuYW1lKSkKLQl7Ci0JICBmcmVlICh1c2Vyc19kaXJuYW1lKTsKLQkgIHVzZXJzX2Rpcm5hbWUgPSBzYXZlc3RyaW5nIChkaXJuYW1lKTsKLQl9Ci0KLSAgICAgIGRpcmVjdG9yeSA9IG9wZW5kaXIgKGRpcm5hbWUpOwotICAgICAgZmlsZW5hbWVfbGVuID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgICAgIHJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZCA9IDE7Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGVudGVydGFpbiB0aGUgcG9zc2liaWxpdHkgb2YgaGFja2luZyB3aWxkY2FyZGVkCi0gICAgIGZpbGVuYW1lcywgbGlrZSAvdXNyL21hbi9tYW48V0lMRD4vdGU8VEFCPi4gIElmIHRoZSBkaXJlY3RvcnkgbmFtZQotICAgICBjb250YWlucyBnbG9iYmluZyBjaGFyYWN0ZXJzLCB0aGVuIGJ1aWxkIGFuIGFycmF5IG9mIGRpcmVjdG9yaWVzLCBhbmQKLSAgICAgdGhlbiBtYXAgb3ZlciB0aGF0IGxpc3Qgd2hpbGUgY29tcGxldGluZy4gKi8KLSAgLyogKioqIFVOSU1QTEVNRU5URUQgKioqICovCi0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBzb21lIHN0YXRlLCB3ZSBjYW4gcmVhZCB0aGUgZGlyZWN0b3J5LiAqLwotCi0gIGVudHJ5ID0gKHN0cnVjdCBkaXJlbnQgKilOVUxMOwotICB3aGlsZSAoZGlyZWN0b3J5ICYmIChlbnRyeSA9IHJlYWRkaXIgKGRpcmVjdG9yeSkpKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3Igbm8gZmlsZW5hbWUuCi0JIEFsbCBlbnRyaWVzIGV4Y2VwdCAiLiIgYW5kICIuLiIgbWF0Y2guICovCi0gICAgICBpZiAoZmlsZW5hbWVfbGVuID09IDApCi0JewotCSAgaWYgKGVudHJ5LT5kX25hbWVbMF0gIT0gJy4nIHx8Ci0JICAgICAgIChlbnRyeS0+ZF9uYW1lWzFdICYmCi0JCSAoZW50cnktPmRfbmFtZVsxXSAhPSAnLicgfHwgZW50cnktPmRfbmFtZVsyXSkpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogT3RoZXJ3aXNlLCBpZiB0aGVzZSBtYXRjaCB1cCB0byB0aGUgbGVuZ3RoIG9mIGZpbGVuYW1lLCB0aGVuCi0JICAgICBpdCBpcyBhIG1hdGNoLiAqLwotCSAgaWYgKF9ybF9jb21wbGV0aW9uX2Nhc2VfZm9sZCkKLQkgICAgewotCSAgICAgIGlmICgoX3JsX3RvX2xvd2VyIChlbnRyeS0+ZF9uYW1lWzBdKSA9PSBfcmxfdG9fbG93ZXIgKGZpbGVuYW1lWzBdKSkgJiYKLQkJICAoKChpbnQpRF9OQU1MRU4gKGVudHJ5KSkgPj0gZmlsZW5hbWVfbGVuKSAmJgotCQkgIChfcmxfc3RybmljbXAgKGZpbGVuYW1lLCBlbnRyeS0+ZF9uYW1lLCBmaWxlbmFtZV9sZW4pID09IDApKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKChlbnRyeS0+ZF9uYW1lWzBdID09IGZpbGVuYW1lWzBdKSAmJgotCQkgICgoKGludClEX05BTUxFTiAoZW50cnkpKSA+PSBmaWxlbmFtZV9sZW4pICYmCi0JCSAgKHN0cm5jbXAgKGZpbGVuYW1lLCBlbnRyeS0+ZF9uYW1lLCBmaWxlbmFtZV9sZW4pID09IDApKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotICAgICAgaWYgKGRpcmVjdG9yeSkKLQl7Ci0JICBjbG9zZWRpciAoZGlyZWN0b3J5KTsKLQkgIGRpcmVjdG9yeSA9IChESVIgKilOVUxMOwotCX0KLSAgICAgIGlmIChkaXJuYW1lKQotCXsKLQkgIGZyZWUgKGRpcm5hbWUpOwotCSAgZGlybmFtZSA9IChjaGFyICopTlVMTDsKLQl9Ci0gICAgICBpZiAoZmlsZW5hbWUpCi0JewotCSAgZnJlZSAoZmlsZW5hbWUpOwotCSAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0JfQotICAgICAgaWYgKHVzZXJzX2Rpcm5hbWUpCi0JewotCSAgZnJlZSAodXNlcnNfZGlybmFtZSk7Ci0JICB1c2Vyc19kaXJuYW1lID0gKGNoYXIgKilOVUxMOwotCX0KLQotICAgICAgcmV0dXJuIChjaGFyICopTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBkaXJuYW1lICYmIChzdHJjbXAgKGRpcm5hbWUsICIuIikgIT0gMCkgKi8KLSAgICAgIGlmIChkaXJuYW1lICYmIChkaXJuYW1lWzBdICE9ICcuJyB8fCBkaXJuYW1lWzFdKSkKLQl7Ci0JICBpZiAocmxfY29tcGxldGVfd2l0aF90aWxkZV9leHBhbnNpb24gJiYgKnVzZXJzX2Rpcm5hbWUgPT0gJ34nKQotCSAgICB7Ci0JICAgICAgZGlybGVuID0gc3RybGVuIChkaXJuYW1lKTsKLQkgICAgICB0ZW1wID0geG1hbGxvYyAoMiArIGRpcmxlbiArIERfTkFNTEVOIChlbnRyeSkpOwotCSAgICAgIHN0cmNweSAodGVtcCwgZGlybmFtZSk7Ci0JICAgICAgLyogQ2Fub25pY2FsaXphdGlvbiBjdXRzIG9mZiBhbnkgZmluYWwgc2xhc2ggcHJlc2VudC4gIFdlCi0JCSBtYXkgbmVlZCB0byBhZGQgaXQgYmFjay4gKi8KLQkgICAgICBpZiAoZGlybmFtZVtkaXJsZW4gLSAxXSAhPSAnLycpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHRlbXBbZGlybGVuKytdID0gJy8nOwotCSAgICAgICAgICB0ZW1wW2Rpcmxlbl0gPSAnXDAnOwotCSAgICAgICAgfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkaXJsZW4gPSBzdHJsZW4gKHVzZXJzX2Rpcm5hbWUpOwotCSAgICAgIHRlbXAgPSB4bWFsbG9jICgxICsgZGlybGVuICsgRF9OQU1MRU4gKGVudHJ5KSk7Ci0JICAgICAgc3RyY3B5ICh0ZW1wLCB1c2Vyc19kaXJuYW1lKTsKLQkgICAgfQotCi0JICBzdHJjcHkgKHRlbXAgKyBkaXJsZW4sIGVudHJ5LT5kX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl0ZW1wID0gc2F2ZXN0cmluZyAoZW50cnktPmRfbmFtZSk7Ci0KLSAgICAgIHJldHVybiAodGVtcCk7Ci0gICAgfQotfQotCi0vKiBBbiBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGEgbWVudSBjb21wbGV0aW9uIGZ1bmN0aW9uIGEgbGEgdGNzaC4gIFRoZQotICAgZmlyc3QgdGltZSAoaWYgdGhlIGxhc3QgcmVhZGxpbmUgY29tbWFuZCB3YXMgbm90IHJsX21lbnVfY29tcGxldGUpLCB3ZQotICAgZ2VuZXJhdGUgdGhlIGxpc3Qgb2YgbWF0Y2hlcy4gIFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGNvZGUgaW4KLSAgIHJsX2NvbXBsZXRlX2ludGVybmFsIC0tIHRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBjb21iaW5lIHRoZSB0d28uICBUaGVuLAotICAgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBvZiBtYXRjaGVzLCB3ZSBpbnNlcnQgdGhlIG1hdGNoIGluIGFuIHVuZG9hYmxlCi0gICBmYXNoaW9uLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIgYXBwZW5kZWQgKHRoaXMgaGFwcGVucyBvbiB0aGUKLSAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjb25zZWN1dGl2ZSBjYWxscyB0byBybF9tZW51X2NvbXBsZXRlKS4gIFdoZW4gd2UKLSAgIGhpdCB0aGUgZW5kIG9mIHRoZSBtYXRjaCBsaXN0LCB3ZSByZXN0b3JlIHRoZSBvcmlnaW5hbCB1bm1hdGNoZWQgdGV4dCwKLSAgIHJpbmcgdGhlIGJlbGwsIGFuZCByZXNldCB0aGUgY291bnRlciB0byB6ZXJvLiAqLwotaW50Ci1ybF9tZW51X2NvbXBsZXRlIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgRnVuY3Rpb24gKm91cl9mdW5jOwotICBpbnQgbWF0Y2hpbmdfZmlsZW5hbWVzLCBmb3VuZF9xdW90ZTsKLQotICBzdGF0aWMgY2hhciAqb3JpZ190ZXh0OwotICBzdGF0aWMgY2hhciAqKm1hdGNoZXMgPSAoY2hhciAqKikwOwotICBzdGF0aWMgaW50IG1hdGNoX2xpc3RfaW5kZXggPSAwOwotICBzdGF0aWMgaW50IG1hdGNoX2xpc3Rfc2l6ZSA9IDA7Ci0gIHN0YXRpYyBpbnQgb3JpZ19zdGFydCwgb3JpZ19lbmQ7Ci0gIHN0YXRpYyBjaGFyIHF1b3RlX2NoYXI7Ci0gIHN0YXRpYyBpbnQgZGVsaW1pdGVyOwotCi0gIC8qIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGdlbmVyYXRlIHRoZSBsaXN0IG9mIG1hdGNoZXMgYW5kIHNldCB0aGluZ3MKLSAgICAgdXAgdG8gaW5zZXJ0IHRoZW0uICovCi0gIGlmIChybF9sYXN0X2Z1bmMgIT0gcmxfbWVudV9jb21wbGV0ZSkKLSAgICB7Ci0gICAgICAvKiBDbGVhbiB1cCBmcm9tIHByZXZpb3VzIGNhbGwsIGlmIGFueS4gKi8KLSAgICAgIEZSRUUgKG9yaWdfdGV4dCk7Ci0gICAgICBpZiAobWF0Y2hlcykKLQl7Ci0JICBmb3IgKG1hdGNoX2xpc3RfaW5kZXggPSAwOyBtYXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdOyBtYXRjaF9saXN0X2luZGV4KyspCi0JICAgIGZyZWUgKG1hdGNoZXNbbWF0Y2hfbGlzdF9pbmRleF0pOwotCSAgZnJlZSAobWF0Y2hlcyk7Ci0JfQotCi0gICAgICBtYXRjaF9saXN0X2luZGV4ID0gbWF0Y2hfbGlzdF9zaXplID0gMDsKLSAgICAgIG1hdGNoZXMgPSAoY2hhciAqKilOVUxMOwotCi0gICAgICAvKiBPbmx5IHRoZSBjb21wbGV0aW9uIGVudHJ5IGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhlc2UuICovCi0gICAgICBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQgPSAwOwotICAgICAgcmxfZmlsZW5hbWVfcXVvdGluZ19kZXNpcmVkID0gMTsKLSAgICAgIHJsX2NvbXBsZXRpb25fdHlwZSA9ICclJzsKLQotICAgICAgb3VyX2Z1bmMgPSBybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9uCi0JCQk/IHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24KLQkJCTogKEZ1bmN0aW9uICopZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbjsKLQotICAgICAgLyogV2Ugbm93IGxvb2sgYmFja3dhcmRzIGZvciB0aGUgc3RhcnQgb2YgYSBmaWxlbmFtZS92YXJpYWJsZSB3b3JkLiAqLwotICAgICAgb3JpZ19lbmQgPSBybF9wb2ludDsKLSAgICAgIGZvdW5kX3F1b3RlID0gZGVsaW1pdGVyID0gMDsKLSAgICAgIHF1b3RlX2NoYXIgPSAnXDAnOwotCi0gICAgICBpZiAocmxfcG9pbnQpCi0JLyogVGhpcyAocG9zc2libHkpIGNoYW5nZXMgcmxfcG9pbnQuICBJZiBpdCByZXR1cm5zIGEgbm9uLXplcm8gY2hhciwKLQkgICB3ZSBrbm93IHdlIGhhdmUgYW4gb3BlbiBxdW90ZS4gKi8KLQlxdW90ZV9jaGFyID0gZmluZF9jb21wbGV0aW9uX3dvcmQgKCZmb3VuZF9xdW90ZSwgJmRlbGltaXRlcik7Ci0KLSAgICAgIG9yaWdfc3RhcnQgPSBybF9wb2ludDsKLSAgICAgIHJsX3BvaW50ID0gb3JpZ19lbmQ7Ci0KLSAgICAgIG9yaWdfdGV4dCA9IHJsX2NvcHlfdGV4dCAob3JpZ19zdGFydCwgb3JpZ19lbmQpOwotICAgICAgbWF0Y2hlcyA9IGdlbl9jb21wbGV0aW9uX21hdGNoZXMgKG9yaWdfdGV4dCwgb3JpZ19zdGFydCwgb3JpZ19lbmQsCi0JCQkJCW91cl9mdW5jLCBmb3VuZF9xdW90ZSwgcXVvdGVfY2hhcik7Ci0KLSNpZiAwCi0gICAgICAvKiBJZiB3ZSBhcmUgbWF0Y2hpbmcgZmlsZW5hbWVzLCBvdXJfZnVuYyB3aWxsIGhhdmUgYmVlbiBzZXQgdG8KLQkgZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAqLwotICAgICAgbWF0Y2hpbmdfZmlsZW5hbWVzID0gb3VyX2Z1bmMgPT0gKEZ1bmN0aW9uICopZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbjsKLSNlbHNlCi0gICAgICAvKiBJZiB3ZSBhcmUgbWF0Y2hpbmcgZmlsZW5hbWVzLCB0aGUgYXR0ZW1wdGVkIGNvbXBsZXRpb24gZnVuY3Rpb24gd2lsbAotCSBoYXZlIHNldCBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQgdG8gYSBub24temVybyB2YWx1ZS4gIFRoZSBiYXNpYwotCSBmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uIGRvZXMgdGhpcy4gKi8KLSAgICAgIG1hdGNoaW5nX2ZpbGVuYW1lcyA9IHJsX2ZpbGVuYW1lX2NvbXBsZXRpb25fZGVzaXJlZDsKLSNlbmRpZgotICAgICAgaWYgKG1hdGNoZXMgPT0gMCB8fCBwb3N0cHJvY2Vzc19tYXRjaGVzICgmbWF0Y2hlcywgbWF0Y2hpbmdfZmlsZW5hbWVzKSA9PSAwKQotCXsKLSAgICAJICBkaW5nICgpOwotCSAgRlJFRSAobWF0Y2hlcyk7Ci0JICBtYXRjaGVzID0gKGNoYXIgKiopMDsKLQkgIEZSRUUgKG9yaWdfdGV4dCk7Ci0JICBvcmlnX3RleHQgPSAoY2hhciAqKTA7Ci0gICAgCSAgY29tcGxldGlvbl9jaGFuZ2VkX2J1ZmZlciA9IDA7Ci0gICAgICAgICAgcmV0dXJuICgwKTsKLQl9Ci0KLSAgICAgIGZvciAobWF0Y2hfbGlzdF9zaXplID0gMDsgbWF0Y2hlc1ttYXRjaF9saXN0X3NpemVdOyBtYXRjaF9saXN0X3NpemUrKykKLSAgICAgICAgOwotICAgICAgLyogbWF0Y2hlc1swXSBpcyBsY2QgaWYgbWF0Y2hfbGlzdF9zaXplID4gMSwgYnV0IHRoZSBjaXJjdWxhciBidWZmZXIKLQkgY29kZSBiZWxvdyBzaG91bGQgdGFrZSBjYXJlIG9mIGl0LiAqLwotICAgIH0KLQotICAvKiBOb3cgd2UgaGF2ZSB0aGUgbGlzdCBvZiBtYXRjaGVzLiAgUmVwbGFjZSB0aGUgdGV4dCBiZXR3ZWVuCi0gICAgIHJsX2xpbmVfYnVmZmVyW29yaWdfc3RhcnRdIGFuZCBybF9saW5lX2J1ZmZlcltybF9wb2ludF0gd2l0aAotICAgICBtYXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdLCBhbmQgYWRkIGFueSBuZWNlc3NhcnkgY2xvc2luZyBjaGFyLiAqLwotCi0gIGlmIChtYXRjaGVzID09IDAgfHwgbWF0Y2hfbGlzdF9zaXplID09IDApIAotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICBGUkVFIChtYXRjaGVzKTsKLSAgICAgIG1hdGNoZXMgPSAoY2hhciAqKikwOwotICAgICAgY29tcGxldGlvbl9jaGFuZ2VkX2J1ZmZlciA9IDA7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLQotICBtYXRjaF9saXN0X2luZGV4ID0gKG1hdGNoX2xpc3RfaW5kZXggKyBjb3VudCkgJSBtYXRjaF9saXN0X3NpemU7Ci0gIGlmIChtYXRjaF9saXN0X2luZGV4IDwgMCkKLSAgICBtYXRjaF9saXN0X2luZGV4ICs9IG1hdGNoX2xpc3Rfc2l6ZTsKLQotICBpZiAobWF0Y2hfbGlzdF9pbmRleCA9PSAwICYmIG1hdGNoX2xpc3Rfc2l6ZSA+IDEpCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIGluc2VydF9tYXRjaCAob3JpZ190ZXh0LCBvcmlnX3N0YXJ0LCBNVUxUX01BVENILCAmcXVvdGVfY2hhcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5zZXJ0X21hdGNoIChtYXRjaGVzW21hdGNoX2xpc3RfaW5kZXhdLCBvcmlnX3N0YXJ0LCBTSU5HTEVfTUFUQ0gsICZxdW90ZV9jaGFyKTsKLSAgICAgIGFwcGVuZF90b19tYXRjaCAobWF0Y2hlc1ttYXRjaF9saXN0X2luZGV4XSwgZGVsaW1pdGVyLCBxdW90ZV9jaGFyKTsKLSAgICB9Ci0KLSAgY29tcGxldGlvbl9jaGFuZ2VkX2J1ZmZlciA9IDE7Ci0gIHJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9yZWFkbGluZS9jb25maWcuaC5ib3QgYi9yZWFkbGluZS9jb25maWcuaC5ib3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTZkYzQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvY29uZmlnLmguYm90CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogY29uZmlnLmguYm90ICovCi0vKiBtb2RpZnkgc2V0dGluZ3Mgb3IgbWFrZSBuZXcgb25lcyBiYXNlZCBvbiB3aGF0IGF1dG9jb25mIHRlbGxzIHVzLiAqLwotCi0vKiBVbHRyaXggYm90Y2hlcyB0eXBlLWFoZWFkIHdoZW4gc3dpdGNoaW5nIGZyb20gY2Fub25pY2FsIHRvCi0gICBub24tY2Fub25pY2FsIG1vZGUsIGF0IGxlYXN0IHRocm91Z2ggdmVyc2lvbiA0LjMgKi8KLSNpZiAhZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpIHx8ICFkZWZpbmVkIChIQVZFX1RDR0VUQVRUUikgfHwgZGVmaW5lZCAodWx0cml4KQotIyAgZGVmaW5lIFRFUk1JT1NfTUlTU0lORwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChTVFJDT0xMX0JST0tFTikKLSMgIHVuZGVmIEhBVkVfU1RSQ09MTAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoSEFWRV9TVERBUkdfSCkKLSMgIGRlZmluZSBQUkVGRVJfU1REQVJHCi0jICBkZWZpbmUgVVNFX1ZBUkFSR1MKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChIQVZFX1ZBUkFSR1NfSCkKLSMgICAgZGVmaW5lIFBSRUZFUl9WQVJBUkdTCi0jICAgIGRlZmluZSBVU0VfVkFSQVJHUwotIyAgZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvY29uZmlnLmguaW4gYi9yZWFkbGluZS9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmODA3Zi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNvbGwgZnVuY3Rpb24gYW5kIGl0IGlzIHByb3Blcmx5IGRlZmluZWQuICAqLwotI3VuZGVmIEhBVkVfU1RSQ09MTAotCi0vKiBEZWZpbmUgaWYgb24gTUlOSVguICAqLwotI3VuZGVmIF9NSU5JWAotCi0vKiBEZWZpbmUgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIFBPU0lYLjEgZmVhdHVyZXMgZXhjZXB0Ci0gICB3aXRoIHRoaXMgZGVmaW5lZC4gICovCi0jdW5kZWYgX1BPU0lYXzFfU09VUkNFCi0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgaWYgdGhlIGBTX0lTKicgbWFjcm9zIGluIDxzeXMvc3RhdC5oPiBkbyBub3Qgd29yayBwcm9wZXJseS4gICovCi0jdW5kZWYgU1RBVF9NQUNST1NfQlJPS0VOCi0KLS8qIERlZmluaXRpb25zIHB1bGxlZCBpbiBmcm9tIGFjbG9jYWwubTQuICovCi0jdW5kZWYgVk9JRF9TSUdIQU5ETEVSCi0KLSN1bmRlZiBHV0lOU1pfSU5fU1lTX0lPQ1RMCi0KLSN1bmRlZiBUSU9DU1RBVF9JTl9TWVNfSU9DVEwKLQotI3VuZGVmIEhBVkVfR0VUUFdfREVDTFMKLQotI3VuZGVmIEZJT05SRUFEX0lOX1NZU19JT0NUTAotCi0jdW5kZWYgSEFWRV9CU0RfU0lHTkFMUwotCi0jdW5kZWYgSEFWRV9MU1RBVAotCi0jdW5kZWYgSEFWRV9QT1NJWF9TSUdOQUxTCi0KLSN1bmRlZiBIQVZFX1BPU0lYX1NJR1NFVEpNUAotCi0jdW5kZWYgSEFWRV9VU0dfU0lHSE9MRAotCi0jdW5kZWYgTVVTVF9SRUlOU1RBTExfU0lHSEFORExFUlMKLQotI3VuZGVmIFNQRUVEX1RfSU5fU1lTX1RZUEVTCi0KLSN1bmRlZiBTVFJDT0xMX0JST0tFTgotCi0jdW5kZWYgU1RSVUNUX0RJUkVOVF9IQVNfRF9GSUxFTk8KLQotI3VuZGVmIFNUUlVDVF9ESVJFTlRfSEFTX0RfSU5PCi0KLSN1bmRlZiBTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwKLQotI3VuZGVmIFNUUlVDVF9XSU5TSVpFX0lOX1RFUk1JT1MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsc3RhdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9MU1RBVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZWxlY3QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VMRUNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2dldGF0dHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVENHRVRBVFRSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUREFSR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wdGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BURV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wdGVtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QVEVNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0cmVhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU1RSRUFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGVybWNhcC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9URVJNQ0FQX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGVybWlvLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RFUk1JT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRlcm1pb3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVEVSTUlPU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotLyogY29uZmlnLmguYm90ICovCi0vKiBtb2RpZnkgc2V0dGluZ3Mgb3IgbWFrZSBuZXcgb25lcyBiYXNlZCBvbiB3aGF0IGF1dG9jb25mIHRlbGxzIHVzLiAqLwotCi0vKiBVbHRyaXggYm90Y2hlcyB0eXBlLWFoZWFkIHdoZW4gc3dpdGNoaW5nIGZyb20gY2Fub25pY2FsIHRvCi0gICBub24tY2Fub25pY2FsIG1vZGUsIGF0IGxlYXN0IHRocm91Z2ggdmVyc2lvbiA0LjMgKi8KLSNpZiAhZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpIHx8ICFkZWZpbmVkIChIQVZFX1RDR0VUQVRUUikgfHwgZGVmaW5lZCAodWx0cml4KQotIyAgZGVmaW5lIFRFUk1JT1NfTUlTU0lORwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChTVFJDT0xMX0JST0tFTikKLSMgIHVuZGVmIEhBVkVfU1RSQ09MTAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoSEFWRV9TVERBUkdfSCkKLSMgIGRlZmluZSBQUkVGRVJfU1REQVJHCi0jICBkZWZpbmUgVVNFX1ZBUkFSR1MKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChIQVZFX1ZBUkFSR1NfSCkKLSMgICAgZGVmaW5lIFBSRUZFUl9WQVJBUkdTCi0jICAgIGRlZmluZSBVU0VfVkFSQVJHUwotIyAgZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvY29uZmlndXJlIGIvcmVhZGxpbmUvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGNkZjg4Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI5NzkgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEZyb20gY29uZmlndXJlLmluIGZvciBSZWFkbGluZSA0LjAsIHZlcnNpb24gMi4xNCwgZnJvbSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMKLUxJQlZFUlNJT049NC4wCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotLS13aXRoLWN1cnNlcyAgICAgICAgICAgICAgIHVzZSB0aGUgY3Vyc2VzIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgdGVybWNhcCBsaWJyYXJ5IgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1yZWFkbGluZS5oCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0KLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2MDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotCi1vcHRfY3Vyc2VzPW5vCi1vcHRfc2hhcmVkPW5vCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3Vyc2VzIG9yIC0td2l0aG91dC1jdXJzZXMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2N1cnNlcytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9jdXJzZXMiCi0gIG9wdF9jdXJzZXM9JHdpdGh2YWwKLWZpCi0KLQotaWYgdGVzdCAiJG9wdF9jdXJzZXMiID0gInllcyI7IHRoZW4KLQlwcmVmZXJfY3Vyc2VzPXllcwotZmkKLQotIyBXZSB3YW50IHRoZXNlIGJlZm9yZSB0aGUgY2hlY2tzLCBzbyB0aGUgY2hlY2tzIGNhbiBtb2RpZnkgdGhlaXIgdmFsdWVzLgotdGVzdCAteiAiJENGTEFHUyIgJiYgQ0ZMQUdTPS1nIGF1dG9fY2ZsYWdzPTEKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSA4MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODU2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODYxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTIxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjk1OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotYWNfc2FmZT1gZWNobyAibWluaXgvY29uZmlnLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbml4L2NvbmZpZy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDAyOiBjaGVja2luZyBmb3IgbWluaXgvY29uZmlnLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPG1pbml4L2NvbmZpZy5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTUlOSVg9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTUlOSVg9Ci1maQotCi1pZiB0ZXN0ICIkTUlOSVgiID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfMV9TT1VSQ0UgMgotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9NSU5JWCAxCi1FT0YKLQotZmkKLQotCi0gCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieHllcyI7IHRoZW4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICotY3lnd2luKikKLQljcm9zc19jYWNoZT0ke3NyY2Rpcn0vY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlCi0JaWYgdGVzdCAtciAiJHtjcm9zc19jYWNoZX0iOyB0aGVuCi0JICAgIGVjaG8gImxvYWRpbmcgY3Jvc3MtYnVpbGQgY2FjaGUgZmlsZSAke2Nyb3NzX2NhY2hlfSIKLQkgICAgLiAke2Nyb3NzX2NhY2hlfQotCWZpCi0JTE9DQUxfQ0ZMQUdTPSIkTE9DQUxfQ0ZMQUdTIC1JJHtzcmNkaXJ9Ly4uL2xpYnRlcm1jYXAiCi0JdW5zZXQgY3Jvc3NfY2FjaGUKLQk7OwotICAgICopICBlY2hvICJjb25maWd1cmU6IGNyb3NzLWNvbXBpbGluZyBmb3IgYSBub24tY3lnd2luIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIiA+JjIKLQk7OwotICAgIGVzYWMKLWZpCi0gCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieHllcyI7IHRoZW4KLSAgQ1JPU1NfQ09NUElMSU5HX0ZMQUc9LURDUk9TU19DT01QSUxJTkcKLWVsc2UKLSAgQ1JPU1NfQ09NUElMSU5HX0ZMQUc9Ci1maQotCi0gCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICAgIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gICAgZWxzZQotICAgICAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gICAgZmkKLWZpCi0KLSAKLQotIyBJZiB3ZSdyZSB1c2luZyBnY2MgYW5kIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgQ0ZMQUdTLCBhZGQgLU8gdG8gQ0ZMQUdTLgotdGVzdCAtbiAiJEdDQyIgJiYgdGVzdCAtbiAiJGF1dG9fY2ZsYWdzIiAmJiBDRkxBR1M9IiRDRkxBR1MgLU8iCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBuZWVkcyAtdHJhZGl0aW9uYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODk6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gbmVlZHMgLXRyYWRpdGlvbmFsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgYWNfcGF0dGVybj0iQXV0b2NvbmYuKid4JyIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c2d0dHkuaD4KLUF1dG9jb25mIFRJT0NHRVRQCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0KLSAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSBubzsgdGhlbgotICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHRlcm1pby5oPgotQXV0b2NvbmYgVENHRVRBCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotICBmaQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCIgMT4mNgotICBpZiB0ZXN0ICRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXRyYWRpdGlvbmFsIgotICBmaQotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjAxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVI9ImFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkQVJGTEFHUyIgfHwgQVJGTEFHUz0iY3IiCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLU1BS0VfU0hFTEw9L2Jpbi9zaAotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MzogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwNTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQoU19JU0JMSykgJiYgZGVmaW5lZChTX0lGRElSKQotIyBpZiBTX0lTQkxLIChTX0lGRElSKQotWW91IGxvc2UuCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU19JU0JMSykgJiYgZGVmaW5lZChTX0lGQ0hSKQotIyBpZiBTX0lTQkxLIChTX0lGQ0hSKQotWW91IGxvc2UuCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU19JU0xOSykgJiYgZGVmaW5lZChTX0lGUkVHKQotIyBpZiBTX0lTTE5LIChTX0lGUkVHKQotWW91IGxvc2UuCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU19JU1NPQ0spICYmIGRlZmluZWQoU19JRlJFRykKLSMgaWYgU19JU1NPQ0sgKFNfSUZSRUcpCi1Zb3UgbG9zZS4KLSMgZW5kaWYKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIllvdSBsb3NlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RhdF9icm9rZW49eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNUQVRfTUFDUk9TX0JST0tFTiAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjU6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MDM6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDQ6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotCi1mb3IgYWNfZnVuYyBpbiBzdHJjYXNlY21wIHNlbGVjdCBzZXRlbnYgcHV0ZW52IHRjZ2V0YXR0ciBzZXRsb2NhbGUgbHN0YXQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBzdHJjb2xsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTQzOiBjaGVja2luZyBmb3Igd29ya2luZyBzdHJjb2xsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3N0cmNvbGxfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX3N0cmNvbGxfd29ya3M9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1tYWluICgpCi17Ci0gIGV4aXQgKHN0cmNvbGwgKCJhYmMiLCAiZGVmIikgPj0gMCB8fAotCXN0cmNvbGwgKCJBQkMiLCAiREVGIikgPj0gMCB8fAotCXN0cmNvbGwgKCIxMjMiLCAiNDU2IikgPj0gMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX3N0cmNvbGxfd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfc3RyY29sbF93b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0cmNvbGxfd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSQ09MTCAxCi1FT0YKLQotZmkKLQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oIHN0ZGxpYi5oIHZhcmFyZ3MuaCBzdGRhcmcuaCBzdHJpbmcuaCBcCi0JCXN5cy9wdGVtLmggc3lzL3B0ZS5oIHN5cy9zdHJlYW0uaCBzeXMvc2VsZWN0LmggXAotCQl0ZXJtY2FwLmggdGVybWlvcy5oIHRlcm1pby5oIHN5cy9maWxlLmggbG9jYWxlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTkwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSBvZiBzaWduYWwgZnVuY3Rpb25zIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjI5OiBjaGVja2luZyBmb3IgdHlwZSBvZiBzaWduYWwgZnVuY3Rpb25zIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3NpZ25hbF92aW50YWdlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHNpZ25hbC5oPgotaW50IG1haW4oKSB7Ci0KLSAgICBzaWdzZXRfdCBzczsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICAgIHNpZ2VtcHR5c2V0KCZzcyk7IHNpZ3N1c3BlbmQoJnNzKTsKLSAgICBzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIChzdHJ1Y3Qgc2lnYWN0aW9uICopIDApOwotICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzLCAoc2lnc2V0X3QgKikgMCk7Ci0gIAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3Zfc2lnbmFsX3ZpbnRhZ2U9cG9zaXgKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgCi0gICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY1NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci1pbnQgbWFpbigpIHsKLQotCWludCBtYXNrID0gc2lnbWFzayhTSUdJTlQpOwotCXNpZ3NldG1hc2sobWFzayk7IHNpZ2Jsb2NrKG1hc2spOyBzaWdwYXVzZShtYXNrKTsKLSAgICAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3NpZ25hbF92aW50YWdlPTQuMmJzZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAKLSAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0JI2luY2x1ZGUgPHNpZ25hbC5oPgotCVJFVFNJR1RZUEUgZm9vKCkgeyB9Ci1pbnQgbWFpbigpIHsKLQotCQlpbnQgbWFzayA9IHNpZ21hc2soU0lHSU5UKTsKLQkJc2lnc2V0KFNJR0lOVCwgZm9vKTsgc2lncmVsc2UoU0lHSU5UKTsKLQkJc2lnaG9sZChTSUdJTlQpOyBzaWdwYXVzZShTSUdJTlQpOwotICAgICAgICAKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3NpZ25hbF92aW50YWdlPXN2cjMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9zaWduYWxfdmludGFnZT12NwotICAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGJhc2hfY3Zfc2lnbmFsX3ZpbnRhZ2UiIDE+JjYKLWlmIHRlc3QgIiRiYXNoX2N2X3NpZ25hbF92aW50YWdlIiA9IHBvc2l4OyB0aGVuCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QT1NJWF9TSUdOQUxTIDEKLUVPRgotCi1lbGlmIHRlc3QgIiRiYXNoX2N2X3NpZ25hbF92aW50YWdlIiA9ICI0LjJic2QiOyB0aGVuCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9CU0RfU0lHTkFMUyAxCi1FT0YKLQotZWxpZiB0ZXN0ICIkYmFzaF9jdl9zaWduYWxfdmludGFnZSIgPSBzdnIzOyB0aGVuCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9VU0dfU0lHSE9MRCAxCi1FT0YKLQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHNpZ25hbCBoYW5kbGVycyBtdXN0IGJlIHJlaW5zdGFsbGVkIHdoZW4gaW52b2tlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczMDogY2hlY2tpbmcgaWYgc2lnbmFsIGhhbmRsZXJzIG11c3QgYmUgcmVpbnN0YWxsZWQgd2hlbiBpbnZva2VkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBjYW5ub3QgY2hlY2sgc2lnbmFsIGhhbmRsaW5nIGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vIiAxPiYyCi0gICAgYmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz1ubwotCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLXR5cGVkZWYgUkVUU0lHVFlQRSBzaWdmdW5jKCk7Ci0KLWludCBuc2lnaW50OwotCi0jaWZkZWYgSEFWRV9QT1NJWF9TSUdOQUxTCi1zaWdmdW5jICoKLXNldF9zaWduYWxfaGFuZGxlcihzaWcsIGhhbmRsZXIpCi0gICAgIGludCBzaWc7Ci0gICAgIHNpZ2Z1bmMgKmhhbmRsZXI7Ci17Ci0gIHN0cnVjdCBzaWdhY3Rpb24gYWN0LCBvYWN0OwotICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0gIGFjdC5zYV9mbGFncyA9IDA7Ci0gIHNpZ2VtcHR5c2V0ICgmYWN0LnNhX21hc2spOwotICBzaWdlbXB0eXNldCAoJm9hY3Quc2FfbWFzayk7Ci0gIHNpZ2FjdGlvbiAoc2lnLCAmYWN0LCAmb2FjdCk7Ci0gIHJldHVybiAob2FjdC5zYV9oYW5kbGVyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNldF9zaWduYWxfaGFuZGxlcihzLCBoKSBzaWduYWwocywgaCkKLSNlbmRpZgotCi1SRVRTSUdUWVBFCi1zaWdpbnQocykKLWludCBzOwotewotICBuc2lnaW50Kys7Ci19Ci0KLW1haW4oKQotewotCW5zaWdpbnQgPSAwOwotCXNldF9zaWduYWxfaGFuZGxlcihTSUdJTlQsIHNpZ2ludCk7Ci0Ja2lsbCgoaW50KWdldHBpZCgpLCBTSUdJTlQpOwotCWtpbGwoKGludClnZXRwaWQoKSwgU0lHSU5UKTsKLQlleGl0KG5zaWdpbnQgIT0gMik7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGJhc2hfY3ZfbXVzdF9yZWluc3RhbGxfc2lnaGFuZGxlcnM9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz15ZXMKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGJhc2hfY3ZfbXVzdF9yZWluc3RhbGxfc2lnaGFuZGxlcnMiIDE+JjYKLWlmIHRlc3QgJGJhc2hfY3ZfbXVzdF9yZWluc3RhbGxfc2lnaGFuZGxlcnMgPSB5ZXM7IHRoZW4KLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNVVNUX1JFSU5TVEFMTF9TSUdIQU5ETEVSUyAxCi1FT0YKLQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcmVzZW5jZSBvZiBQT1NJWC1zdHlsZSBzaWdzZXRqbXAvc2lnbG9uZ2ptcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxMjogY2hlY2tpbmcgZm9yIHByZXNlbmNlIG9mIFBPU0lYLXN0eWxlIHNpZ3NldGptcC9zaWdsb25nam1wIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X2Z1bmNfc2lnc2V0am1wJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBjYW5ub3QgY2hlY2sgZm9yIHNpZ3NldGptcC9zaWdsb25nam1wIGlmIGNyb3NzLWNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG1pc3NpbmciIDE+JjIKLSAgICAgYmFzaF9jdl9mdW5jX3NpZ3NldGptcD1taXNzaW5nCi0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotbWFpbigpCi17Ci0jaWYgIWRlZmluZWQgKF9QT1NJWF9WRVJTSU9OKSB8fCAhZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotZXhpdCAoMSk7Ci0jZWxzZQotCi1pbnQgY29kZTsKLXNpZ3NldF90IHNldCwgb3NldDsKLXNpZ2ptcF9idWYgeHg7Ci0KLS8qIGdldCB0aGUgbWFzayAqLwotc2lnZW1wdHlzZXQoJnNldCk7Ci1zaWdlbXB0eXNldCgmb3NldCk7Ci1zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIChzaWdzZXRfdCAqKU5VTEwsICZzZXQpOwotc2lncHJvY21hc2soU0lHX0JMT0NLLCAoc2lnc2V0X3QgKilOVUxMLCAmb3NldCk7Ci0KLS8qIHNhdmUgaXQgKi8KLWNvZGUgPSBzaWdzZXRqbXAoeHgsIDEpOwotaWYgKGNvZGUpCi0gIGV4aXQoMCk7CS8qIGNvdWxkIGdldCBzaWdtYXNrIGFuZCBjb21wYXJlIHRvIG9zZXQgaGVyZS4gKi8KLQotLyogY2hhbmdlIGl0ICovCi1zaWdhZGRzZXQoJnNldCwgU0lHSU5UKTsKLXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgKHNpZ3NldF90ICopTlVMTCk7Ci0KLS8qIGFuZCBzaWdsb25nam1wICovCi1zaWdsb25nam1wKHh4LCAxMCk7Ci1leGl0KDEpOwotI2VuZGlmCi19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBiYXNoX2N2X2Z1bmNfc2lnc2V0am1wPXByZXNlbnQKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYmFzaF9jdl9mdW5jX3NpZ3NldGptcD1taXNzaW5nCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRiYXNoX2N2X2Z1bmNfc2lnc2V0am1wIiAxPiY2Ci1pZiB0ZXN0ICRiYXNoX2N2X2Z1bmNfc2lnc2V0am1wID0gcHJlc2VudDsgdGhlbgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUE9TSVhfU0lHU0VUSk1QIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbHN0YXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4ODY6IGNoZWNraW5nIGZvciBsc3RhdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmFzaF9jdl9mdW5jX2xzdGF0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1pbnQgbWFpbigpIHsKLSBsc3RhdCgiLiIsKHN0cnVjdCBzdGF0ICopMCk7IAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfZnVuY19sc3RhdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9mdW5jX2xzdGF0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJhc2hfY3ZfZnVuY19sc3RhdCIgMT4mNgotaWYgdGVzdCAkYmFzaF9jdl9mdW5jX2xzdGF0ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xTVEFUIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHByb2dyYW1zIGFyZSBhYmxlIHRvIHJlZGVjbGFyZSBnZXRwdyBmdW5jdGlvbnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjI6IGNoZWNraW5nIHdoZXRoZXIgcHJvZ3JhbXMgYXJlIGFibGUgdG8gcmVkZWNsYXJlIGdldHB3IGZ1bmN0aW9ucyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmFzaF9jdl9jYW5fcmVkZWNsX2dldHB3JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci1leHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHdlbnQoKTsKLWV4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCgpOwotZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3bmFtKCk7Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCBwYXNzd2QgKno7IHogPSBnZXRwd2VudCgpOyB6ID0gZ2V0cHd1aWQoMCk7IHogPSBnZXRwd25hbSgicm9vdCIpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5Mzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X2Nhbl9yZWRlY2xfZ2V0cHc9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfY2FuX3JlZGVjbF9nZXRwdz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiYXNoX2N2X2Nhbl9yZWRlY2xfZ2V0cHciIDE+JjYKLWlmIHRlc3QgJGJhc2hfY3ZfY2FuX3JlZGVjbF9nZXRwdyA9IG5vOyB0aGVuCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRQV19ERUNMUyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBzdHJjb2xsIGFuZCBzdHJjbXAgZGlmZmVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTYwOiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBzdHJjb2xsIGFuZCBzdHJjbXAgZGlmZmVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X2Z1bmNfc3RyY29sbF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IGNhbm5vdCBjaGVjayBzdHJjb2xsIGlmIGNyb3NzIGNvbXBpbGluZyAtLSBkZWZhdWx0aW5nIHRvIG5vIiAxPiYyCi0gICAgYmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuPW5vCi0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmIGRlZmluZWQgKEhBVkVfTE9DQUxFX0gpCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotbWFpbihjLCB2KQotaW50ICAgICBjOwotY2hhciAgICAqdltdOwotewotICAgICAgICBpbnQgICAgIHIxLCByMjsKLSAgICAgICAgY2hhciAgICAqZGVmbG9jYWxlLCAqZGVmY29sbDsKLQotI2lmZGVmIEhBVkVfU0VUTE9DQUxFCi0gICAgICAgIGRlZmxvY2FsZSA9IHNldGxvY2FsZShMQ19BTEwsICIiKTsKLQlkZWZjb2xsID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJDT0xMCi0JLyogVGhlc2UgdHdvIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB0ZXN0cy9nbG9iLXRlc3QuICovCi0gICAgICAgIHIxID0gc3RyY29sbCgiYWJkIiwgImFYZCIpOwotI2Vsc2UKLQlyMSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgcjIgPSBzdHJjbXAoImFiZCIsICJhWGQiKTsKLQotCS8qIFRoZXNlIHR3byBzaG91bGQgYm90aCBiZSBncmVhdGVyIHRoYW4gMC4gIEl0IGlzIHBlcm1pc3NpYmxlIGZvcgotCSAgIGEgc3lzdGVtIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzLCBhcyBsb25nIGFzIHRoZSBzaWduIGlzIHRoZQotCSAgIHNhbWUuICovCi0KLSAgICAgICAgLyogRXhpdCB3aXRoIDEgKGZhaWx1cmUpIGlmIHRoZXNlIHR3byB2YWx1ZXMgYXJlIGJvdGggPiAwLCBzaW5jZQotCSAgIHRoaXMgdGVzdHMgd2hldGhlciBzdHJjb2xsKDMpIGlzIGJyb2tlbiB3aXRoIHJlc3BlY3QgdG8gc3RyY21wKDMpCi0JICAgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLiAqLwotCWV4aXQgKHIxID4gMCAmJiByMiA+IDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBiYXNoX2N2X2Z1bmNfc3RyY29sbF9icm9rZW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGJhc2hfY3ZfZnVuY19zdHJjb2xsX2Jyb2tlbj1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuIiAxPiY2Ci1pZiB0ZXN0ICRiYXNoX2N2X2Z1bmNfc3RyY29sbF9icm9rZW4gPSB5ZXM7IHRoZW4KLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVFJDT0xMX0JST0tFTiAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHNpZ25hbCBoYW5kbGVycyBhcmUgb2YgdHlwZSB2b2lkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMzOiBjaGVja2luZyB3aGV0aGVyIHNpZ25hbCBoYW5kbGVycyBhcmUgb2YgdHlwZSB2b2lkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3ZvaWRfc2lnaGFuZGxlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3ZvaWRfc2lnaGFuZGxlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl92b2lkX3NpZ2hhbmRsZXI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGJhc2hfY3Zfdm9pZF9zaWdoYW5kbGVyIiAxPiY2Ci1pZiB0ZXN0ICRiYXNoX2N2X3ZvaWRfc2lnaGFuZGxlciA9IHllczsgdGhlbgotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFZPSURfU0lHSEFORExFUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFRJT0NHV0lOU1ogaW4gc3lzL2lvY3RsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzM6IGNoZWNraW5nIGZvciBUSU9DR1dJTlNaIGluIHN5cy9pb2N0bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3Rpb2Nnd2luc3pfaW5faW9jdGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLWludCBtYWluKCkgewotaW50IHggPSBUSU9DR1dJTlNaOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3Rpb2Nnd2luc3pfaW5faW9jdGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfdGlvY2d3aW5zel9pbl9pb2N0bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiYXNoX2N2X3Rpb2Nnd2luc3pfaW5faW9jdGwiIDE+JjYKLWlmIHRlc3QgJGJhc2hfY3ZfdGlvY2d3aW5zel9pbl9pb2N0bCA9IHllczsgdGhlbiAgIAotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEdXSU5TWl9JTl9TWVNfSU9DVEwgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBUSU9DU1RBVCBpbiBzeXMvaW9jdGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNzogY2hlY2tpbmcgZm9yIFRJT0NTVEFUIGluIHN5cy9pb2N0bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3Rpb2NzdGF0X2luX2lvY3RsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci1pbnQgbWFpbigpIHsKLWludCB4ID0gVElPQ1NUQVQ7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfdGlvY3N0YXRfaW5faW9jdGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfdGlvY3N0YXRfaW5faW9jdGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmFzaF9jdl90aW9jc3RhdF9pbl9pb2N0bCIgMT4mNgotaWYgdGVzdCAkYmFzaF9jdl90aW9jc3RhdF9pbl9pb2N0bCA9IHllczsgdGhlbiAgIAotY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJT0NTVEFUX0lOX1NZU19JT0NUTCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEZJT05SRUFEIGluIHN5cy9pb2N0bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQxOiBjaGVja2luZyBmb3IgRklPTlJFQUQgaW4gc3lzL2lvY3RsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2Jhc2hfY3ZfZmlvbnJlYWRfaW5faW9jdGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLWludCBtYWluKCkgewotaW50IHggPSBGSU9OUkVBRDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9maW9ucmVhZF9pbl9pb2N0bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9maW9ucmVhZF9pbl9pb2N0bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiYXNoX2N2X2Zpb25yZWFkX2luX2lvY3RsIiAxPiY2Ci1pZiB0ZXN0ICRiYXNoX2N2X2Zpb25yZWFkX2luX2lvY3RsID0geWVzOyB0aGVuICAgCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRklPTlJFQURfSU5fU1lTX0lPQ1RMIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3BlZWRfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3NTogY2hlY2tpbmcgZm9yIHNwZWVkX3QgaW4gc3lzL3R5cGVzLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2Jhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludCBtYWluKCkgewotc3BlZWRfdCB4OwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3NwZWVkX3RfaW5fc3lzX3R5cGVzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3NwZWVkX3RfaW5fc3lzX3R5cGVzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXMiIDE+JjYKLWlmIHRlc3QgJGJhc2hfY3Zfc3BlZWRfdF9pbl9zeXNfdHlwZXMgPSB5ZXM7IHRoZW4gICAKLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTUEVFRF9UX0lOX1NZU19UWVBFUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCB3aW5zaXplIGluIHN5cy9pb2N0bC5oIGFuZCB0ZXJtaW9zLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDg6IGNoZWNraW5nIGZvciBzdHJ1Y3Qgd2luc2l6ZSBpbiBzeXMvaW9jdGwuaCBhbmQgdGVybWlvcy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3N0cnVjdF93aW5zaXplX2hlYWRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotaW50IG1haW4oKSB7Ci1zdHJ1Y3Qgd2luc2l6ZSB4OwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X3N0cnVjdF93aW5zaXplX2hlYWRlcj1pb2N0bF9oCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLWludCBtYWluKCkgewotc3RydWN0IHdpbnNpemUgeDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9zdHJ1Y3Rfd2luc2l6ZV9oZWFkZXI9dGVybWlvc19oCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3Zfc3RydWN0X3dpbnNpemVfaGVhZGVyPW90aGVyCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIHRlc3QgJGJhc2hfY3Zfc3RydWN0X3dpbnNpemVfaGVhZGVyID0gaW9jdGxfaDsgdGhlbgotICBlY2hvICIkYWNfdCIic3lzL2lvY3RsLmgiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNUUlVDVF9XSU5TSVpFX0lOX1NZU19JT0NUTCAxCi1FT0YKLQotZWxpZiB0ZXN0ICRiYXNoX2N2X3N0cnVjdF93aW5zaXplX2hlYWRlciA9IHRlcm1pb3NfaDsgdGhlbgotICBlY2hvICIkYWNfdCIidGVybWlvcy5oIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVFJVQ1RfV0lOU0laRV9JTl9URVJNSU9TIDEKLUVPRgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJub3QgZm91bmQiIDE+JjYKLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgc3RydWN0IGRpcmVudCBoYXMgYSBkX2lubyBtZW1iZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNzA6IGNoZWNraW5nIGlmIHN0cnVjdCBkaXJlbnQgaGFzIGEgZF9pbm8gbWVtYmVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X2RpcmVudF9oYXNfZGlubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLSNpZiBkZWZpbmVkKEhBVkVfRElSRU5UX0gpCi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZiAvKiBTWVNORElSICovCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmIC8qIFNZU0RJUiAqLwotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KLQotaW50IG1haW4oKSB7Ci0KLXN0cnVjdCBkaXJlbnQgZDsgaW50IHo7IHogPSBkLmRfaW5vOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfZGlyZW50X2hhc19kaW5vPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiYXNoX2N2X2RpcmVudF9oYXNfZGlubz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiYXNoX2N2X2RpcmVudF9oYXNfZGlubyIgMT4mNgotaWYgdGVzdCAkYmFzaF9jdl9kaXJlbnRfaGFzX2Rpbm8gPSB5ZXM7IHRoZW4KLWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVFJVQ1RfRElSRU5UX0hBU19EX0lOTyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiBzdHJ1Y3QgZGlyZW50IGhhcyBhIGRfZmlsZW5vIG1lbWJlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyNjogY2hlY2tpbmcgaWYgc3RydWN0IGRpcmVudCBoYXMgYSBkX2ZpbGVubyBtZW1iZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2Jhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLSNpZiBkZWZpbmVkKEhBVkVfRElSRU5UX0gpCi0jIGluY2x1ZGUgPGRpcmVudC5oPgotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICi0jICBpbmNsdWRlIDxzeXMvbmRpci5oPgotIyBlbmRpZiAvKiBTWVNORElSICovCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmIC8qIFNZU0RJUiAqLwotIyBpZmRlZiBIQVZFX05ESVJfSAotIyAgaW5jbHVkZSA8bmRpci5oPgotIyBlbmRpZgotI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KLQotaW50IG1haW4oKSB7Ci0KLXN0cnVjdCBkaXJlbnQgZDsgaW50IHo7IHogPSBkLmRfZmlsZW5vOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmFzaF9jdl9kaXJlbnRfaGFzX2RfZmlsZW5vPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJhc2hfY3ZfZGlyZW50X2hhc19kX2ZpbGVubyIgMT4mNgotaWYgdGVzdCAkYmFzaF9jdl9kaXJlbnRfaGFzX2RfZmlsZW5vID0geWVzOyB0aGVuCi1jYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1RSVUNUX0RJUkVOVF9IQVNfRF9GSUxFTk8gMQotRU9GCi0KLWZpCi0KLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKSAgIHByZWZlcl9jdXJzZXM9eWVzIDs7Ci1lc2FjCi0KLWlmIHRlc3QgIlgkYmFzaF9jdl90ZXJtY2FwX2xpYiIgPSAiWCI7IHRoZW4KLV9iYXNoX25lZWRtc2c9eWVzCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyB3aGljaCBsaWJyYXJ5IGhhcyB0aGUgdGVybWNhcCBmdW5jdGlvbnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzODk6IGNoZWNraW5nIHdoaWNoIGxpYnJhcnkgaGFzIHRoZSB0ZXJtY2FwIGZ1bmN0aW9ucyIgPiY1Ci1fYmFzaF9uZWVkbXNnPQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiYXNoX2N2X3Rlcm1jYXBfbGliJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzk2OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQotYWNfbGliX3Zhcj1gZWNobyB0ZXJtY2FwJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWx0ZXJtY2FwICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB0Z2V0ZW50KCk7Ci0KLWludCBtYWluKCkgewotdGdldGVudCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgYmFzaF9jdl90ZXJtY2FwX2xpYj1saWJ0ZXJtY2FwCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MzQ6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxjdXJzZXMgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHRnZXRlbnQoKTsKLQotaW50IG1haW4oKSB7Ci10Z2V0ZW50KCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBiYXNoX2N2X3Rlcm1jYXBfbGliPWxpYmN1cnNlcwotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sbmN1cnNlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3MjogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbmN1cnNlcydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sbmN1cnNlcyAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgdGdldGVudCgpOwotCi1pbnQgbWFpbigpIHsKLXRnZXRlbnQoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGJhc2hfY3ZfdGVybWNhcF9saWI9bGlibmN1cnNlcwotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWJhc2hfY3ZfdGVybWNhcF9saWI9Z251dGVybWNhcAotZmkKLQotZmkKLQotZmkKLQotZmkKLQotaWYgdGVzdCAiWCRfYmFzaF9uZWVkbXNnIiA9ICJYeWVzIjsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hpY2ggbGlicmFyeSBoYXMgdGhlIHRlcm1jYXAgZnVuY3Rpb25zIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTIwOiBjaGVja2luZyB3aGljaCBsaWJyYXJ5IGhhcyB0aGUgdGVybWNhcCBmdW5jdGlvbnMiID4mNQotZmkKLWVjaG8gIiRhY190IiJ1c2luZyAkYmFzaF9jdl90ZXJtY2FwX2xpYiIgMT4mNgotaWYgdGVzdCAkYmFzaF9jdl90ZXJtY2FwX2xpYiA9IGdudXRlcm1jYXAgJiYgdGVzdCAteiAiJHByZWZlcl9jdXJzZXMiOyB0aGVuCi1MREZMQUdTPSIkTERGTEFHUyAtTC4vbGliL3Rlcm1jYXAiCi1URVJNQ0FQX0xJQj0iLi9saWIvdGVybWNhcC9saWJ0ZXJtY2FwLmEiCi1URVJNQ0FQX0RFUD0iLi9saWIvdGVybWNhcC9saWJ0ZXJtY2FwLmEiCi1lbGlmIHRlc3QgJGJhc2hfY3ZfdGVybWNhcF9saWIgPSBsaWJ0ZXJtY2FwICYmIHRlc3QgLXogIiRwcmVmZXJfY3Vyc2VzIjsgdGhlbgotVEVSTUNBUF9MSUI9LWx0ZXJtY2FwCi1URVJNQ0FQX0RFUD0KLWVsaWYgdGVzdCAkYmFzaF9jdl90ZXJtY2FwX2xpYiA9IGxpYm5jdXJzZXM7IHRoZW4KLVRFUk1DQVBfTElCPS1sbmN1cnNlcwotVEVSTUNBUF9ERVA9Ci1lbHNlCi1URVJNQ0FQX0xJQj0tbGN1cnNlcwotVEVSTUNBUF9ERVA9Ci1maQotCi1pZiB0ZXN0ICIkVEVSTUNBUF9MSUIiID0gIi4vbGliL3Rlcm1jYXAvbGlidGVybWNhcC5hIjsgdGhlbgotCVRFUk1DQVBfTElCPS1sdGVybWNhcAkjZGVmYXVsdAotZmkKLQotY2FzZSAiJGhvc3RfY3B1IiBpbgotKmNyYXkqKQlMT0NBTF9DRkxBR1M9LURDUkFZIDs7Ci1lc2FjCi0KLWNhc2UgIiRob3N0X29zIiBpbgotaXNjKikJTE9DQUxfQ0ZMQUdTPS1EaXNjMzg2IDs7Ci1lc2FjCi0KLSMgc2hhcmVkIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzZWN0aW9uCi0jCi0jIFNoYXJlZCBvYmplY3QgY29uZmlndXJhdGlvbiBzZWN0aW9uLiAgVGhlc2UgdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYnkKLSMgJHtzcmNkaXJ9L3N1cHBvcnQvc2hvYmotY29uZgotIwotaWYgdGVzdCAtZiAke3NyY2Rpcn0vc3VwcG9ydC9zaG9iai1jb25mOyB0aGVuCi0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGNvbmZpZ3VyYXRpb24gZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NTc6IGNoZWNraW5nIGNvbmZpZ3VyYXRpb24gZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMiID4mNQotICAgICAgICBldmFsIGAke0NPTkZJR19TSEVMTC0vYmluL3NofSAke3NyY2Rpcn0vc3VwcG9ydC9zaG9iai1jb25mIC1DICR7Q0N9IC1jICR7aG9zdF9jcHV9IC1vICR7aG9zdF9vc30gLXYgJHtob3N0X3ZlbmRvcn1gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotCQotICAgICAgICAKLSAgICAgICAgCi0JCi0JCi0JCi0JCi0JCi0gICAgICAgIGVjaG8gIiRhY190IiIkU0hMSUJfU1RBVFVTIiAxPiY2Ci1maQotCi1CVUlMRF9ESVI9YHB3ZGAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIGV4YW1wbGVzL01ha2VmaWxlIHNobGliL01ha2VmaWxlIGNvbmZpZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQ1JPU1NfQ09NUElMSU5HX0ZMQUdAJSRDUk9TU19DT01QSUxJTkdfRkxBRyVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQE1BS0VfU0hFTExAJSRNQUtFX1NIRUxMJWcKLXMlQFNIT0JKX0NDQCUkU0hPQkpfQ0MlZwotcyVAU0hPQkpfQ0ZMQUdTQCUkU0hPQkpfQ0ZMQUdTJWcKLXMlQFNIT0JKX0xEQCUkU0hPQkpfTEQlZwotcyVAU0hPQkpfTERGTEFHU0AlJFNIT0JKX0xERkxBR1MlZwotcyVAU0hPQkpfWExERkxBR1NAJSRTSE9CSl9YTERGTEFHUyVnCi1zJUBTSE9CSl9MSUJTQCUkU0hPQkpfTElCUyVnCi1zJUBTSE9CSl9TVEFUVVNAJSRTSE9CSl9TVEFUVVMlZwotcyVAU0hMSUJfU1RBVFVTQCUkU0hMSUJfU1RBVFVTJWcKLXMlQFNITElCX1hMREZMQUdTQCUkU0hMSUJfWExERkxBR1MlZwotcyVAU0hMSUJfTElCU1VGRkAlJFNITElCX0xJQlNVRkYlZwotcyVAU0hMSUJfTElCVkVSU0lPTkAlJFNITElCX0xJQlZFUlNJT04lZwotcyVAU0hMSUJfTElCU0AlJFNITElCX0xJQlMlZwotcyVAQlVJTERfRElSQCUkQlVJTERfRElSJWcKLXMlQExPQ0FMX0NGTEFHU0AlJExPQ0FMX0NGTEFHUyVnCi1zJUBMT0NBTF9MREZMQUdTQCUkTE9DQUxfTERGTEFHUyVnCi1zJUBMT0NBTF9ERUZTQCUkTE9DQUxfREVGUyVnCi1zJUBBUkZMQUdTQCUkQVJGTEFHUyVnCi1zJUBMSUJWRVJTSU9OQCUkTElCVkVSU0lPTiVnCi1zJUBURVJNQ0FQX0xJQkAlJFRFUk1DQVBfTElCJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBleGFtcGxlcy9NYWtlZmlsZSBzaGxpYi9NYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmgiCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBNYWtlZmlsZSB1c2VzIHRoaXMgdGltZXN0YW1wIGZpbGUgdG8gcmVjb3JkIHdoZXRoZXIgY29uZmlnLmggaXMgdXAgdG8gZGF0ZS4KLWVjaG8gPiBzdGFtcC1oCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9yZWFkbGluZS9jb25maWd1cmUuaW4gYi9yZWFkbGluZS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmRhYTcuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLWRubAotZG5sIENvbmZpZ3VyZSBzY3JpcHQgZm9yIHJlYWRsaW5lIGxpYnJhcnkKLWRubAotZG5sIHJlcG9ydCBidWdzIHRvIGNoZXRAcG8uY3dydS5lZHUKLWRubAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1BQ19SRVZJU0lPTihbZm9yIFJlYWRsaW5lIDQuMCwgdmVyc2lvbiAyLjE0LCBmcm9tIGF1dG9jb25mIHZlcnNpb25dIEFDX0FDVkVSU0lPTikKLUxJQlZFUlNJT049NC4wCi0KLUFDX0lOSVQocmVhZGxpbmUuaCkKLUFDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCi0KLWRubCBtYWtlIHN1cmUgd2UgYXJlIHVzaW5nIGEgcmVjZW50IGF1dG9jb25mIHZlcnNpb24KLUFDX1BSRVJFUSgyLjEwKQotCi1kbmwgQUNfQ09ORklHX0FVWF9ESVIoLi9zdXBwb3J0KQotCi1BQ19DQU5PTklDQUxfSE9TVAotCi1kbmwgY29uZmlndXJlIGRlZmF1bHRzCi1vcHRfY3Vyc2VzPW5vCi1vcHRfc2hhcmVkPW5vCi0KLWRubCBhcmd1bWVudHMgdG8gY29uZmlndXJlCi1BQ19BUkdfV0lUSChjdXJzZXMsIC0td2l0aC1jdXJzZXMgICAgICAgICAgICAgICB1c2UgdGhlIGN1cnNlcyBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHRlcm1jYXAgbGlicmFyeSxvcHRfY3Vyc2VzPSR3aXRodmFsKQotCi1pZiB0ZXN0ICIkb3B0X2N1cnNlcyIgPSAieWVzIjsgdGhlbgotCXByZWZlcl9jdXJzZXM9eWVzCi1maQotCi0jIFdlIHdhbnQgdGhlc2UgYmVmb3JlIHRoZSBjaGVja3MsIHNvIHRoZSBjaGVja3MgY2FuIG1vZGlmeSB0aGVpciB2YWx1ZXMuCi10ZXN0IC16ICIkQ0ZMQUdTIiAmJiBDRkxBR1M9LWcgYXV0b19jZmxhZ3M9MQotCi1BQ19QUk9HX0NDCi1BQ19NSU5JWAotCi1kbmwgQkVHSU4gY2hhbmdlcyBmb3IgQ1lHTlVTIGNyb3NzLWJ1aWxkaW5nIGZvciBDeWd3aW4KLSAKLWRubCBsb2FkIHVwIHRoZSBjcm9zcy1idWlsZGluZyBjYWNoZSBmaWxlIC0tIGFkZCBtb3JlIGNhc2VzIGFuZCBjYWNoZQotZG5sIGZpbGVzIGFzIG5lY2Vzc2FyeQotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInh5ZXMiOyB0aGVuCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAqLWN5Z3dpbiopCi0JY3Jvc3NfY2FjaGU9JHtzcmNkaXJ9L2Nyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZQotCWlmIHRlc3QgLXIgIiR7Y3Jvc3NfY2FjaGV9IjsgdGhlbgotCSAgICBlY2hvICJsb2FkaW5nIGNyb3NzLWJ1aWxkIGNhY2hlIGZpbGUgJHtjcm9zc19jYWNoZX0iCi0JICAgIC4gJHtjcm9zc19jYWNoZX0KLQlmaQotCUxPQ0FMX0NGTEFHUz0iJExPQ0FMX0NGTEFHUyAtSSR7c3JjZGlyfS8uLi9saWJ0ZXJtY2FwIgotCXVuc2V0IGNyb3NzX2NhY2hlCi0JOzsKLSAgICAqKSAgZWNobyAiY29uZmlndXJlOiBjcm9zcy1jb21waWxpbmcgZm9yIGEgbm9uLWN5Z3dpbiB0YXJnZXQgaXMgbm90IHN1cHBvcnRlZCIgPiYyCi0JOzsKLSAgICBlc2FjCi1maQotIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInh5ZXMiOyB0aGVuCi0gIENST1NTX0NPTVBJTElOR19GTEFHPS1EQ1JPU1NfQ09NUElMSU5HCi1lbHNlCi0gIENST1NTX0NPTVBJTElOR19GTEFHPQotZmkKLUFDX1NVQlNUKENST1NTX0NPTVBJTElOR19GTEFHKQotIAotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgICAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICAgIGVsc2UKLSAgICAgICAgQ0NfRk9SX0JVSUxEPWdjYwotICAgIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIAotZG5sIEVORCBjaGFuZ2VzIGZvciBDWUdOVVMgY3Jvc3MtYnVpbGRpbmcgZm9yIEN5Z3dpbgotCi0jIElmIHdlJ3JlIHVzaW5nIGdjYyBhbmQgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBDRkxBR1MsIGFkZCAtTyB0byBDRkxBR1MuCi10ZXN0IC1uICIkR0NDIiAmJiB0ZXN0IC1uICIkYXV0b19jZmxhZ3MiICYmIENGTEFHUz0iJENGTEFHUyAtTyIKLQotQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKLUFDX1BST0dfSU5TVEFMTAotQUNfQ0hFQ0tfUFJPRyhBUiwgYXIsIGFyKQotZG5sIFNldCBkZWZhdWx0IGZvciBBUkZMQUdTLCBzaW5jZSBhdXRvY29uZiBkb2VzIG5vdCBoYXZlIGEgbWFjcm8gZm9yIGl0LgotZG5sIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBzZXQgaXQgd2hlbiBydW5uaW5nIGNvbmZpZ3VyZSBvciBtYWtlCi10ZXN0IC1uICIkQVJGTEFHUyIgfHwgQVJGTEFHUz0iY3IiCi1BQ19QUk9HX1JBTkxJQgotCi1NQUtFX1NIRUxMPS9iaW4vc2gKLUFDX1NVQlNUKE1BS0VfU0hFTEwpCi0KLUFDX1JFVFNJR1RZUEUKLQotQUNfSEVBREVSX1NUQVQKLUFDX0hFQURFUl9ESVJFTlQKLQotQUNfQ0hFQ0tfRlVOQ1Moc3RyY2FzZWNtcCBzZWxlY3Qgc2V0ZW52IHB1dGVudiB0Y2dldGF0dHIgc2V0bG9jYWxlIGxzdGF0KQotCi1BQ19GVU5DX1NUUkNPTEwKLQotQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCBzdGRsaWIuaCB2YXJhcmdzLmggc3RkYXJnLmggc3RyaW5nLmggXAotCQlzeXMvcHRlbS5oIHN5cy9wdGUuaCBzeXMvc3RyZWFtLmggc3lzL3NlbGVjdC5oIFwKLQkJdGVybWNhcC5oIHRlcm1pb3MuaCB0ZXJtaW8uaCBzeXMvZmlsZS5oIGxvY2FsZS5oKQotCi1CQVNIX1NJR05BTF9DSEVDSwotQkFTSF9SRUlOU1RBTExfU0lHSEFORExFUlMKLQotQkFTSF9GVU5DX1BPU0lYX1NFVEpNUAotQkFTSF9GVU5DX0xTVEFUCi1CQVNIX0NIRUNLX0dFVFBXX0ZVTkNTCi1CQVNIX0ZVTkNfU1RSQ09MTAotCi1CQVNIX1RZUEVfU0lHSEFORExFUgotQkFTSF9IQVZFX1RJT0NHV0lOU1oKLUJBU0hfSEFWRV9USU9DU1RBVAotQkFTSF9IQVZFX0ZJT05SRUFECi1CQVNIX01JU0NfU1BFRURfVAotQkFTSF9TVFJVQ1RfV0lOU0laRQotQkFTSF9TVFJVQ1RfRElSRU5UX0RfSU5PCi1CQVNIX1NUUlVDVF9ESVJFTlRfRF9GSUxFTk8KLQotZG5sIHl1Y2sKLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikgICBwcmVmZXJfY3Vyc2VzPXllcyA7OwotZXNhYwotQkFTSF9DSEVDS19MSUJfVEVSTUNBUAotaWYgdGVzdCAiJFRFUk1DQVBfTElCIiA9ICIuL2xpYi90ZXJtY2FwL2xpYnRlcm1jYXAuYSI7IHRoZW4KLQlURVJNQ0FQX0xJQj0tbHRlcm1jYXAJI2RlZmF1bHQKLWZpCi0KLWNhc2UgIiRob3N0X2NwdSIgaW4KLSpjcmF5KikJTE9DQUxfQ0ZMQUdTPS1EQ1JBWSA7OwotZXNhYwotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWlzYyopCUxPQ0FMX0NGTEFHUz0tRGlzYzM4NiA7OwotZXNhYwotCi0jIHNoYXJlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc2VjdGlvbgotIwotIyBTaGFyZWQgb2JqZWN0IGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gIFRoZXNlIHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGJ5Ci0jICR7c3JjZGlyfS9zdXBwb3J0L3Nob2JqLWNvbmYKLSMKLWlmIHRlc3QgLWYgJHtzcmNkaXJ9L3N1cHBvcnQvc2hvYmotY29uZjsgdGhlbgotICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoY29uZmlndXJhdGlvbiBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcykKLSAgICAgICAgZXZhbCBgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJHtzcmNkaXJ9L3N1cHBvcnQvc2hvYmotY29uZiAtQyAke0NDfSAtYyAke2hvc3RfY3B1fSAtbyAke2hvc3Rfb3N9IC12ICR7aG9zdF92ZW5kb3J9YAotICAgICAgICBBQ19TVUJTVChTSE9CSl9DQykKLSAgICAgICAgQUNfU1VCU1QoU0hPQkpfQ0ZMQUdTKQotICAgICAgICBBQ19TVUJTVChTSE9CSl9MRCkKLSAgICAgICAgQUNfU1VCU1QoU0hPQkpfTERGTEFHUykKLQlBQ19TVUJTVChTSE9CSl9YTERGTEFHUykKLSAgICAgICAgQUNfU1VCU1QoU0hPQkpfTElCUykKLSAgICAgICAgQUNfU1VCU1QoU0hPQkpfU1RBVFVTKQotCUFDX1NVQlNUKFNITElCX1NUQVRVUykKLQlBQ19TVUJTVChTSExJQl9YTERGTEFHUykKLQlBQ19TVUJTVChTSExJQl9MSUJTVUZGKQotCUFDX1NVQlNUKFNITElCX0xJQlZFUlNJT04pCi0JQUNfU1VCU1QoU0hMSUJfTElCUykKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgkU0hMSUJfU1RBVFVTKQotZmkKLQotQlVJTERfRElSPWBwd2RgCi1BQ19TVUJTVChCVUlMRF9ESVIpCi0KLUFDX1NVQlNUKENGTEFHUykKLUFDX1NVQlNUKExPQ0FMX0NGTEFHUykKLUFDX1NVQlNUKExPQ0FMX0xERkxBR1MpCi1BQ19TVUJTVChMT0NBTF9ERUZTKQotCi1BQ19TVUJTVChBUikKLUFDX1NVQlNUKEFSRkxBR1MpCi0KLUFDX1NVQlNUKGhvc3RfY3B1KQotQUNfU1VCU1QoaG9zdF9vcykKLQotQUNfU1VCU1QoTElCVkVSU0lPTikKLQotQUNfU1VCU1QoVEVSTUNBUF9MSUIpCi0KLUFDX09VVFBVVChbTWFrZWZpbGUgZG9jL01ha2VmaWxlIGV4YW1wbGVzL01ha2VmaWxlIHNobGliL01ha2VmaWxlXSwKLVsKLSMgTWFrZWZpbGUgdXNlcyB0aGlzIHRpbWVzdGFtcCBmaWxlIHRvIHJlY29yZCB3aGV0aGVyIGNvbmZpZy5oIGlzIHVwIHRvIGRhdGUuCi1lY2hvID4gc3RhbXAtaAotXSkKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2Nyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZSBiL3JlYWRsaW5lL2Nyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMDc1OS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9jcm9zcy1idWlsZC9jeWd3aW4uY2FjaGUKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgZm9yIENZR1dJTjMyIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBkb25lIHdoZW4gY3Jvc3MtY29tcGlsaW5nLgotCi0jIEFDX0ZVTkNfR0VUUEdSUCBzaG91bGQgYWxzbyBkZWZpbmUgR0VUUEdSUF9WT0lECi1hY19jdl9mdW5jX2dldHBncnBfdm9pZD0ke2FjX2N2X2Z1bmNfZ2V0cGdycF92b2lkPSd5ZXMnfQotIyBBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUQgc2hvdWxkIG5vdCBkZWZpbmUgYW55dGhpbmcgZWxzZQotYWNfY3ZfZnVuY19zZXR2YnVmX3JldmVyc2VkPSR7YWNfY3ZfZnVuY19zZXR2YnVmX3JldmVyc2VkPSdubyd9Ci0jIG9uIENZR1dJTjMyLCBzeXN0ZW0gY2FsbHMgZG8gbm90IHJlc3RhcnQKLWFjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0ke2FjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0nbm8nfQotYmFzaF9jdl9zeXNfcmVzdGFydGFibGVfc3lzY2FsbHM9JHtiYXNoX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0nbm8nfQotCi0jIHRoZXNlIG1heSBiZSBuZWNlc3NhcnksIGJ1dCB0aGV5IGFyZSBjdXJyZW50bHkgY29tbWVudGVkIG91dAotI2FjX2N2X2NfYmlnZW5kaWFuPSR7YWNfY3ZfY19iaWdlbmRpYW49J25vJ30KLWFjX2N2X3NpemVvZl9jaGFyX3A9JHthY19jdl9zaXplb2ZfY2hhcl9wPSc0J30KLWFjX2N2X3NpemVvZl9pbnQ9JHthY19jdl9zaXplb2ZfaW50PSc0J30KLWFjX2N2X3NpemVvZl9sb25nPSR7YWNfY3Zfc2l6ZW9mX2xvbmc9JzQnfQotCi1iYXNoX2N2X2R1cDJfYnJva2VuPSR7YmFzaF9jdl9kdXAyX2Jyb2tlbj0nbm8nfQotYmFzaF9jdl9wZ3JwX3BpcGU9JHtiYXNoX2N2X3BncnBfcGlwZT0nbm8nfQotYmFzaF9jdl90eXBlX3JsaW1pdD0ke2Jhc2hfY3ZfdHlwZV9ybGltaXQ9J2xvbmcnfQotYmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0PSR7YmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0PSdubyd9Ci1iYXNoX2N2X3VuZGVyX3N5c19zaWdsaXN0PSR7YmFzaF9jdl91bmRlcl9zeXNfc2lnbGlzdD0nbm8nfQotYmFzaF9jdl9zeXNfc2lnbGlzdD0ke2Jhc2hfY3Zfc3lzX3NpZ2xpc3Q9J25vJ30KLWJhc2hfY3Zfb3BlbmRpcl9ub3Rfcm9idXN0PSR7YmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3Q9J25vJ30KLWJhc2hfY3ZfZ2V0ZW52X3JlZGVmPSR7YmFzaF9jdl9nZXRlbnZfcmVkZWY9J3llcyd9Ci1iYXNoX2N2X3ByaW50Zl9kZWNsYXJlZD0ke2Jhc2hfY3ZfcHJpbnRmX2RlY2xhcmVkPSd5ZXMnfQotYmFzaF9jdl91bGltaXRfbWF4ZmRzPSR7YmFzaF9jdl91bGltaXRfbWF4ZmRzPSdubyd9Ci1iYXNoX2N2X2dldGN3ZF9jYWxsc19wb3Blbj0ke2Jhc2hfY3ZfZ2V0Y3dkX2NhbGxzX3BvcGVuPSdubyd9Ci1iYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzPSR7YmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz0nbm8nfQotYmFzaF9jdl9qb2JfY29udHJvbF9taXNzaW5nPSR7YmFzaF9jdl9qb2JfY29udHJvbF9taXNzaW5nPSdwcmVzZW50J30KLWJhc2hfY3Zfc3lzX25hbWVkX3BpcGVzPSR7YmFzaF9jdl9zeXNfbmFtZWRfcGlwZXM9J21pc3NpbmcnfQotYmFzaF9jdl9mdW5jX3NpZ3NldGptcD0ke2Jhc2hfY3ZfZnVuY19zaWdzZXRqbXA9J3ByZXNlbnQnfQotYmFzaF9jdl9tYWlsX2Rpcj0ke2Jhc2hfY3ZfbWFpbF9kaXI9J3Vua25vd24nfQotYmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuPSR7YmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuPSdubyd9Ci0KLWJhc2hfY3ZfdHlwZV9pbnQzMl90PSR7YmFzaF9jdl90eXBlX2ludDMyX3Q9J2ludCd9Ci1iYXNoX2N2X3R5cGVfdV9pbnQzMl90PSR7YmFzaF9jdl90eXBlX3VfaW50MzJfdD0naW50J30KLWFjX2N2X2hlYWRlcl90ZXJtY2FwX2g9JHthY19jdl9oZWFkZXJfdGVybWNhcF9oPSd5ZXMnfQotYWNfY3ZfaGVhZGVyX3Rlcm1pb3NfaD0ke2FjX2N2X2hlYWRlcl90ZXJtaW9zX2g9J3llcyd9Ci1iYXNoX2N2X3Rlcm1jYXBfbGliPSR7YmFzaF9jdl90ZXJtY2FwX2xpYj0nLWx0ZXJtY2FwJ30KLQotYmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsPSR7YmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsPSd5ZXMnfQotYWNfY3ZfbGliX3Rlcm1jYXBfdGdldGVudD0ke2FjX2N2X2xpYl90ZXJtY2FwX3RnZXRlbnQ9J3llcyd9Ci0KLSMgZW5kIG9mIGNyb3NzLWJ1aWxkL2N5Z3dpbjMyLmNhY2hlCmRpZmYgLS1naXQgYS9yZWFkbGluZS9kaXNwbGF5LmMgYi9yZWFkbGluZS9kaXNwbGF5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTVhOTQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZGlzcGxheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwMiArMCwwIEBACi0vKiBkaXNwbGF5LmMgLS0gcmVhZGxpbmUgcmVkaXNwbGF5IGZhY2lsaXR5LiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2luY2x1ZGUgInBvc2l4c3RhdC5oIgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQgKF9fR08zMl9fKQotIyAgaW5jbHVkZSA8Z28zMi5oPgotIyAgaW5jbHVkZSA8cGMuaD4KLSNlbmRpZiAvKiBfX0dPMzJfXyAqLwotCi0vKiBTeXN0ZW0tc3BlY2lmaWMgZmVhdHVyZSBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZSBmaWxlcy4gKi8KLSNpbmNsdWRlICJybGRlZnMuaCIKLQotLyogVGVybWNhcCBsaWJyYXJ5IHN0dWZmLiAqLwotI2luY2x1ZGUgInRjYXAuaCIKLQotLyogU29tZSBzdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmVzLiAqLwotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0jaW5jbHVkZSAiaGlzdG9yeS5oIgotCi0jaWYgIWRlZmluZWQgKHN0cmNocikgJiYgIWRlZmluZWQgKF9fU1REQ19fKQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKSwgKnN0cnJjaHIgKCk7Ci0jZW5kaWYgLyogIXN0cmNociAmJiAhX19TVERDX18gKi8KLQotLyogR2xvYmFsIGFuZCBwc2V1ZG8tZ2xvYmFsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0gICBpbXBvcnRlZCBmcm9tIHJlYWRsaW5lLmMuICovCi1leHRlcm4gY2hhciAqcmxfcHJvbXB0OwotZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7Ci0KLWV4dGVybiBpbnQgX3JsX291dHB1dF9tZXRhX2NoYXJzOwotZXh0ZXJuIGludCBfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZTsKLWV4dGVybiBpbnQgX3JsX21hcmtfbW9kaWZpZWRfbGluZXM7Ci1leHRlcm4gaW50IF9ybF9wcmVmZXJfdmlzaWJsZV9iZWxsOwotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHRlcm1pbmFsLmMgKi8KLWV4dGVybiB2b2lkIF9ybF9vdXRwdXRfc29tZV9jaGFycyAoKTsKLSNpZmRlZiBfTUlOSVgKLWV4dGVybiB2b2lkIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uICgpOwotI2Vsc2UKLWV4dGVybiBpbnQgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24gKCk7Ci0jZW5kaWYKLWV4dGVybiBpbnQgX3JsX2JhY2tzcGFjZSAoKTsKLQotZXh0ZXJuIGNoYXIgKnRlcm1fY2xyZW9sLCAqdGVybV9jbHJwYWc7Ci1leHRlcm4gY2hhciAqdGVybV9pbSwgKnRlcm1faWMsICAqdGVybV9laSwgKnRlcm1fREM7Ci1leHRlcm4gY2hhciAqdGVybV91cCwgKnRlcm1fZGMsICp0ZXJtX2NyLCAqdGVybV9JQzsKLWV4dGVybiBpbnQgc2NyZWVuaGVpZ2h0LCBzY3JlZW53aWR0aCwgc2NyZWVuY2hhcnM7Ci1leHRlcm4gaW50IHRlcm1pbmFsX2Nhbl9pbnNlcnQsIF9ybF90ZXJtX2F1dG93cmFwOwotCi0vKiBQc2V1ZG8tZ2xvYmFsIGZ1bmN0aW9ucyAobG9jYWwgdG8gdGhlIHJlYWRsaW5lIGxpYnJhcnkpIGV4cG9ydGVkCi0gICBieSB0aGlzIGZpbGUuICovCi12b2lkIF9ybF9tb3ZlX2N1cnNvcl9yZWxhdGl2ZSAoKSwgX3JsX291dHB1dF9zb21lX2NoYXJzICgpOwotdm9pZCBfcmxfbW92ZV92ZXJ0ICgpOwotdm9pZCBfcmxfY2xlYXJfdG9fZW9sICgpLCBfcmxfY2xlYXJfc2NyZWVuICgpOwotCi1zdGF0aWMgdm9pZCB1cGRhdGVfbGluZSAoKSwgc3BhY2VfdG9fZW9sICgpOwotc3RhdGljIHZvaWQgZGVsZXRlX2NoYXJzICgpLCBpbnNlcnRfc29tZV9jaGFycyAoKTsKLXN0YXRpYyB2b2lkIGNyICgpOwotCi1zdGF0aWMgaW50ICppbnZfbGJyZWFrcywgKnZpc19sYnJlYWtzOwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiBIZXVyaXN0aWMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBpdCBpcyBmYXN0ZXIgdG8gbW92ZSBmcm9tIENVUiB0byBORVcKLSAgIGJ5IGJhY2tpbmcgdXAgb3Igb3V0cHV0dGluZyBhIGNhcnJpYWdlIHJldHVybiBhbmQgbW92aW5nIGZvcndhcmQuICovCi0jZGVmaW5lIENSX0ZBU1RFUihuZXcsIGN1cikgKCgobmV3KSArIDEpIDwgKChjdXIpIC0gKG5ldykpKQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCURpc3BsYXkgc3R1ZmYJCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFRoaXMgaXMgdGhlIHN0dWZmIHRoYXQgaXMgaGFyZCBmb3IgbWUuICBJIG5ldmVyIHNlZW0gdG8gd3JpdGUgZ29vZAotICAgZGlzcGxheSByb3V0aW5lcyBpbiBDLiAgTGV0J3Mgc2VlIGhvdyBJIGRvIHRoaXMgdGltZS4gKi8KLQotLyogKFBXUCkgV2VsbC4uLiBHb29kIGZvciBhIHNpbXBsZSBsaW5lIHVwZGF0ZXIsIGJ1dCB0b3RhbGx5IGlnbm9yZXMKLSAgIHRoZSBwcm9ibGVtcyBvZiBpbnB1dCBsaW5lcyBsb25nZXIgdGhhbiB0aGUgc2NyZWVuIHdpZHRoLgotCi0gICB1cGRhdGVfbGluZSBhbmQgdGhlIGNvZGUgdGhhdCBjYWxscyBpdCBtYWtlcyBhIG11bHRpcGxlIGxpbmUsCi0gICBhdXRvbWF0aWNhbGx5IHdyYXBwaW5nIGxpbmUgdXBkYXRlLiAgQ2FyZWZ1bCBhdHRlbnRpb24gbmVlZHMKLSAgIHRvIGJlIHBhaWQgdG8gdGhlIHZlcnRpY2FsIHBvc2l0aW9uIHZhcmlhYmxlcy4gKi8KLQotLyogS2VlcCB0d28gYnVmZmVyczsgb25lIHdoaWNoIHJlZmxlY3RzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZQotICAgc2NyZWVuLCBhbmQgdGhlIG90aGVyIHRvIGRyYXcgd2hhdCB3ZSB0aGluayB0aGUgbmV3IGNvbnRlbnRzIHNob3VsZAotICAgYmUuICBUaGVuIGNvbXBhcmUgdGhlIGJ1ZmZlcnMsIGFuZCBtYWtlIHdoYXRldmVyIGNoYW5nZXMgdG8gdGhlCi0gICBzY3JlZW4gaXRzZWxmIHRoYXQgd2Ugc2hvdWxkLiAgRmluYWxseSwgbWFrZSB0aGUgYnVmZmVyIHRoYXQgd2UKLSAgIGp1c3QgZHJldyBpbnRvIGJlIHRoZSBvbmUgd2hpY2ggcmVmbGVjdHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlCi0gICBzY3JlZW4sIGFuZCBwbGFjZSB0aGUgY3Vyc29yIHdoZXJlIGl0IGJlbG9uZ3MuCi0KLSAgIENvbW1hbmRzIHRoYXQgd2FudCB0byBjYW4gZml4IHRoZSBkaXNwbGF5IHRoZW1zZWx2ZXMsIGFuZCB0aGVuIGxldAotICAgdGhpcyBmdW5jdGlvbiBrbm93IHRoYXQgdGhlIGRpc3BsYXkgaGFzIGJlZW4gZml4ZWQgYnkgc2V0dGluZyB0aGUKLSAgIFJMX0RJU1BMQVlfRklYRUQgdmFyaWFibGUuICBUaGlzIGlzIGdvb2QgZm9yIGVmZmljaWVuY3kuICovCi0KLS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHJlZGlzcGxheSBmdW5jdGlvbi4gKi8KLVZGdW5jdGlvbiAqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uID0gcmxfcmVkaXNwbGF5OwotCi0vKiBHbG9iYWwgdmFyaWFibGVzIGRlY2xhcmVkIGhlcmUuICovCi0vKiBXaGF0IFlPVSB0dXJuIG9uIHdoZW4geW91IGhhdmUgaGFuZGxlZCBhbGwgcmVkaXNwbGF5IHlvdXJzZWxmLiAqLwotaW50IHJsX2Rpc3BsYXlfZml4ZWQgPSAwOwotCi1pbnQgX3JsX3N1cHByZXNzX3JlZGlzcGxheSA9IDA7Ci0KLS8qIFRoZSBzdHVmZiB0aGF0IGdldHMgcHJpbnRlZCBvdXQgYmVmb3JlIHRoZSBhY3R1YWwgdGV4dCBvZiB0aGUgbGluZS4KLSAgIFRoaXMgaXMgdXN1YWxseSBwb2ludGluZyB0byBybF9wcm9tcHQuICovCi1jaGFyICpybF9kaXNwbGF5X3Byb21wdCA9IChjaGFyICopTlVMTDsKLQotLyogUHNldWRvLWdsb2JhbCB2YXJpYWJsZXMgZGVjbGFyZWQgaGVyZS4gKi8KLS8qIFRoZSB2aXNpYmxlIGN1cnNvciBwb3NpdGlvbi4gIElmIHlvdSBwcmludCBzb21lIHRleHQsIGFkanVzdCB0aGlzLiAqLwotaW50IF9ybF9sYXN0X2NfcG9zID0gMDsKLWludCBfcmxfbGFzdF92X3BvcyA9IDA7Ci0KLS8qIE51bWJlciBvZiBsaW5lcyBjdXJyZW50bHkgb24gc2NyZWVuIG1pbnVzIDEuICovCi1pbnQgX3JsX3Zpc19ib3RsaW4gPSAwOwotCi0vKiBWYXJpYWJsZXMgdXNlZCBvbmx5IGluIHRoaXMgZmlsZS4gKi8KLS8qIFRoZSBsYXN0IGxlZnQgZWRnZSBvZiB0ZXh0IHRoYXQgd2FzIGRpc3BsYXllZC4gIFRoaXMgaXMgdXNlZCB3aGVuCi0gICBkb2luZyBob3Jpem9udGFsIHNjcm9sbGluZy4gIEl0IHNoaWZ0cyBpbiB0aGlyZHMgb2YgYSBzY3JlZW53aWR0aC4gKi8KLXN0YXRpYyBpbnQgbGFzdF9sbWFyZ2luOwotCi0vKiBUaGUgbGluZSBkaXNwbGF5IGJ1ZmZlcnMuICBPbmUgaXMgdGhlIGxpbmUgY3VycmVudGx5IGRpc3BsYXllZCBvbgotICAgdGhlIHNjcmVlbi4gIFRoZSBvdGhlciBpcyB0aGUgbGluZSBhYm91dCB0byBiZSBkaXNwbGF5ZWQuICovCi1zdGF0aWMgY2hhciAqdmlzaWJsZV9saW5lID0gKGNoYXIgKilOVUxMOwotc3RhdGljIGNoYXIgKmludmlzaWJsZV9saW5lID0gKGNoYXIgKilOVUxMOwotCi0vKiBBIGJ1ZmZlciBmb3IgYG1vZGVsaW5lJyBtZXNzYWdlcy4gKi8KLXN0YXRpYyBjaGFyIG1zZ19idWZbMTI4XTsKLQotLyogTm9uLXplcm8gZm9yY2VzIHRoZSByZWRpc3BsYXkgZXZlbiBpZiB3ZSB0aG91Z2h0IGl0IHdhcyB1bm5lY2Vzc2FyeS4gKi8KLXN0YXRpYyBpbnQgZm9yY2VkX2Rpc3BsYXk7Ci0KLS8qIERlZmF1bHQgYW5kIGluaXRpYWwgYnVmZmVyIHNpemUuICBDYW4gZ3Jvdy4gKi8KLXN0YXRpYyBpbnQgbGluZV9zaXplID0gMTAyNDsKLQotc3RhdGljIGNoYXIgKmxvY2FsX3Byb21wdCwgKmxvY2FsX3Byb21wdF9wcmVmaXg7Ci1zdGF0aWMgaW50IHZpc2libGVfbGVuZ3RoLCBwcmVmaXhfbGVuZ3RoOwotCi0vKiBUaGUgbnVtYmVyIG9mIGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBsaW5lIGN1cnJlbnRseSBiZWluZwotICAgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uICovCi1zdGF0aWMgaW50IHZpc2libGVfd3JhcF9vZmZzZXQ7Ci0KLS8qIHN0YXRpYyBzbyBpdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gcmxfcmVkaXNwbGF5IGFuZCB1cGRhdGVfbGluZSAqLwotc3RhdGljIGludCB3cmFwX29mZnNldDsKLQotLyogVGhlIGluZGV4IG9mIHRoZSBsYXN0IGludmlzaWJsZV9jaGFyYWN0ZXIgaW4gdGhlIHByb21wdCBzdHJpbmcuICovCi1zdGF0aWMgaW50IGxhc3RfaW52aXNpYmxlOwotCi0vKiBUaGUgbGVuZ3RoIChidWZmZXIgb2Zmc2V0KSBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbGFzdCAocG9zc2libHkKLSAgIG11bHRpLWxpbmUpIGJ1ZmZlciBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gKi8KLXN0YXRpYyBpbnQgdmlzaWJsZV9maXJzdF9saW5lX2xlbjsKLQotLyogRXhwYW5kIHRoZSBwcm9tcHQgc3RyaW5nIFMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHZpc2libGUKLSAgIGNoYXJhY3RlcnMgaW4gKkxQLCBpZiBMUCBpcyBub3QgbnVsbC4gIFRoaXMgaXMgY3VycmVudGx5IG1vcmUtb3ItbGVzcwotICAgYSBwbGFjZWhvbGRlciBmb3IgZXhwYW5zaW9uLiAgTElQLCBpZiBub24tbnVsbCBpcyBhIHBsYWNlIHRvIHN0b3JlIHRoZQotICAgaW5kZXggb2YgdGhlIGxhc3QgaW52aXNpYmxlIGNoYXJhY3RlciBpbiB0aGVyIGV0dXJuZWQgc3RyaW5nLiAqLwotCi0vKiBDdXJyZW50IGltcGxlbWVudGF0aW9uOgotCVwwMDEgKF5BKSBzdGFydCBub24tdmlzaWJsZSBjaGFyYWN0ZXJzCi0JXDAwMiAoXkIpIGVuZCBub24tdmlzaWJsZSBjaGFyYWN0ZXJzCi0gICBhbGwgY2hhcmFjdGVycyBleGNlcHQgXDAwMSBhbmQgXDAwMiAoZm9sbG93aW5nIGEgXDAwMSkgYXJlIGNvcGllZCB0bwotICAgdGhlIHJldHVybmVkIHN0cmluZzsgYWxsIGNoYXJhY3RlcnMgZXhjZXB0IHRob3NlIGJldHdlZW4gXDAwMSBhbmQKLSAgIFwwMDIgYXJlIGFzc3VtZWQgdG8gYmUgYHZpc2libGUnLiAqLwkKLQotc3RhdGljIGNoYXIgKgotZXhwYW5kX3Byb21wdCAocG10LCBscCwgbGlwKQotICAgICBjaGFyICpwbXQ7Ci0gICAgIGludCAqbHAsICpsaXA7Ci17Ci0gIGNoYXIgKnIsICpyZXQsICpwOwotICBpbnQgbCwgcmwsIGxhc3QsIGlnbm9yaW5nOwotCi0gIC8qIFNob3J0LWNpcmN1aXQgaWYgd2UgY2FuLiAqLwotICBpZiAoc3RyY2hyIChwbXQsIFJMX1BST01QVF9TVEFSVF9JR05PUkUpID09IDApCi0gICAgewotICAgICAgciA9IHNhdmVzdHJpbmcgKHBtdCk7Ci0gICAgICBpZiAobHApCi0JKmxwID0gc3RybGVuIChyKTsKLSAgICAgIHJldHVybiByOwotICAgIH0KLQotICBsID0gc3RybGVuIChwbXQpOwotICByID0gcmV0ID0geG1hbGxvYyAobCArIDEpOwotICAKLSAgZm9yIChybCA9IGlnbm9yaW5nID0gbGFzdCA9IDAsIHAgPSBwbXQ7IHAgJiYgKnA7IHArKykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNvZGUgc3RyaXBzIHRoZSBpbnZpc2libGUgY2hhcmFjdGVyIHN0cmluZyBtYXJrZXJzCi0JIFJMX1BST01QVF9TVEFSVF9JR05PUkUgYW5kIFJMX1BST01QVF9FTkRfSUdOT1JFICovCi0gICAgICBpZiAoKnAgPT0gUkxfUFJPTVBUX1NUQVJUX0lHTk9SRSkKLQl7Ci0JICBpZ25vcmluZysrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoaWdub3JpbmcgJiYgKnAgPT0gUkxfUFJPTVBUX0VORF9JR05PUkUpCi0JewotCSAgaWdub3JpbmcgPSAwOwotCSAgbGFzdCA9IHIgLSByZXQgLSAxOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpyKysgPSAqcDsKLQkgIGlmICghaWdub3JpbmcpCi0JICAgIHJsKys7Ci0JfQotICAgIH0KLQotICAqciA9ICdcMCc7Ci0gIGlmIChscCkKLSAgICAqbHAgPSBybDsKLSAgaWYgKGxpcCkKLSAgICAqbGlwID0gbGFzdDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEV4cGFuZCB0aGUgcHJvbXB0IHN0cmluZyBpbnRvIHRoZSB2YXJpb3VzIGRpc3BsYXkgY29tcG9uZW50cywgaWYKLSAqIG5lY2Vzc2FyeS4KLSAqCi0gKiBsb2NhbF9wcm9tcHQgPSBleHBhbmRlZCBsYXN0IGxpbmUgb2Ygc3RyaW5nIGluIHJsX2Rpc3BsYXlfcHJvbXB0Ci0gKgkJICAocG9ydGlvbiBhZnRlciB0aGUgZmluYWwgbmV3bGluZSkKLSAqIGxvY2FsX3Byb21wdF9wcmVmaXggPSBwb3J0aW9uIGJlZm9yZSBsYXN0IG5ld2xpbmUgb2YgcmxfZGlzcGxheV9wcm9tcHQsCi0gKgkJCSBleHBhbmRlZCB2aWEgZXhwYW5kX3Byb21wdAotICogdmlzaWJsZV9sZW5ndGggPSBudW1iZXIgb2YgdmlzaWJsZSBjaGFyYWN0ZXJzIGluIGxvY2FsX3Byb21wdAotICogcHJlZml4X2xlbmd0aCA9IG51bWJlciBvZiB2aXNpYmxlIGNoYXJhY3RlcnMgaW4gbG9jYWxfcHJvbXB0X3ByZWZpeAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgcGVyIGNhbGwgdG8gcmVhZGxpbmUoKS4gIEl0IG1heSBhbHNvIGJlCi0gKiBjYWxsZWQgYXJiaXRyYXJpbHkgdG8gZXhwYW5kIHRoZSBwcmltYXJ5IHByb21wdC4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjaGFyYWN0ZXJzIG9uIHRoZSBsYXN0IGxpbmUKLSAqIG9mIHRoZSAocG9zc2libHkgbXVsdGktbGluZSkgcHJvbXB0LgotICovCi1pbnQKLXJsX2V4cGFuZF9wcm9tcHQgKHByb21wdCkKLSAgICAgY2hhciAqcHJvbXB0OwotewotICBjaGFyICpwLCAqdDsKLSAgaW50IGM7Ci0KLSAgLyogQ2xlYXIgb3V0IGFueSBzYXZlZCB2YWx1ZXMuICovCi0gIGlmIChsb2NhbF9wcm9tcHQpCi0gICAgZnJlZSAobG9jYWxfcHJvbXB0KTsKLSAgaWYgKGxvY2FsX3Byb21wdF9wcmVmaXgpCi0gICAgZnJlZSAobG9jYWxfcHJvbXB0X3ByZWZpeCk7Ci0gIGxvY2FsX3Byb21wdCA9IGxvY2FsX3Byb21wdF9wcmVmaXggPSAoY2hhciAqKTA7Ci0gIGxhc3RfaW52aXNpYmxlID0gdmlzaWJsZV9sZW5ndGggPSAwOwotCi0gIGlmIChwcm9tcHQgPT0gMCB8fCAqcHJvbXB0ID09IDApCi0gICAgcmV0dXJuICgwKTsKLQotICBwID0gc3RycmNociAocHJvbXB0LCAnXG4nKTsKLSAgaWYgKCFwKQotICAgIHsKLSAgICAgIC8qIFRoZSBwcm9tcHQgaXMgb25seSBvbmUgbGluZS4gKi8KLSAgICAgIGxvY2FsX3Byb21wdCA9IGV4cGFuZF9wcm9tcHQgKHByb21wdCwgJnZpc2libGVfbGVuZ3RoLCAmbGFzdF9pbnZpc2libGUpOwotICAgICAgbG9jYWxfcHJvbXB0X3ByZWZpeCA9IChjaGFyICopMDsKLSAgICAgIHJldHVybiAodmlzaWJsZV9sZW5ndGgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBwcm9tcHQgc3BhbnMgbXVsdGlwbGUgbGluZXMuICovCi0gICAgICB0ID0gKytwOwotICAgICAgbG9jYWxfcHJvbXB0ID0gZXhwYW5kX3Byb21wdCAocCwgJnZpc2libGVfbGVuZ3RoLCAmbGFzdF9pbnZpc2libGUpOwotICAgICAgYyA9ICp0OyAqdCA9ICdcMCc7Ci0gICAgICAvKiBUaGUgcG9ydGlvbiBvZiB0aGUgcHJvbXB0IHN0cmluZyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZQotCSBmaW5hbCBuZXdsaW5lIGlzIG5vdyBudWxsLXRlcm1pbmF0ZWQuICovCi0gICAgICBsb2NhbF9wcm9tcHRfcHJlZml4ID0gZXhwYW5kX3Byb21wdCAocHJvbXB0LCAmcHJlZml4X2xlbmd0aCwgKGludCAqKU5VTEwpOwotICAgICAgKnQgPSBjOwotICAgICAgcmV0dXJuIChwcmVmaXhfbGVuZ3RoKTsKLSAgICB9Ci19Ci0KLS8qIEJhc2ljIHJlZGlzcGxheSBhbGdvcml0aG0uICovCi12b2lkCi1ybF9yZWRpc3BsYXkgKCkKLXsKLSAgcmVnaXN0ZXIgaW50IGluLCBvdXQsIGMsIGxpbmVudW0sIGN1cnNvcl9saW5lbnVtOwotICByZWdpc3RlciBjaGFyICpsaW5lOwotICBpbnQgY19wb3MsIGludl9ib3RsaW4sIGxiX2JvdGxpbiwgbGJfbGluZW51bTsKLSAgaW50IG5ld2xpbmVzLCBscG9zLCB0ZW1wOwotICBjaGFyICpwcm9tcHRfdGhpc19saW5lOwotCi0gIGlmICghcmVhZGxpbmVfZWNob2luZ19wKQotICAgIHJldHVybjsKLQotICBpZiAoIXJsX2Rpc3BsYXlfcHJvbXB0KQotICAgIHJsX2Rpc3BsYXlfcHJvbXB0ID0gIiI7Ci0KLSAgaWYgKGludmlzaWJsZV9saW5lID09IDApCi0gICAgewotICAgICAgdmlzaWJsZV9saW5lID0geG1hbGxvYyAobGluZV9zaXplKTsKLSAgICAgIGludmlzaWJsZV9saW5lID0geG1hbGxvYyAobGluZV9zaXplKTsKLSAgICAgIGZvciAoaW4gPSAwOyBpbiA8IGxpbmVfc2l6ZTsgaW4rKykKLQl7Ci0JICB2aXNpYmxlX2xpbmVbaW5dID0gMDsKLQkgIGludmlzaWJsZV9saW5lW2luXSA9IDE7Ci0JfQotCi0gICAgICAvKiBzaG91bGQgYmUgZW5vdWdoLCBidXQgdGhlbiBhZ2FpbiwgdGhpcyBpcyBqdXN0IGZvciB0ZXN0aW5nLiAqLwotICAgICAgaW52X2xicmVha3MgPSAoaW50ICopbWFsbG9jICgyNTYgKiBzaXplb2YgKGludCkpOwotICAgICAgdmlzX2xicmVha3MgPSAoaW50ICopbWFsbG9jICgyNTYgKiBzaXplb2YgKGludCkpOwotICAgICAgaW52X2xicmVha3NbMF0gPSB2aXNfbGJyZWFrc1swXSA9IDA7Ci0KLSAgICAgIHJsX29uX25ld19saW5lICgpOwotICAgIH0KLQotICAvKiBEcmF3IHRoZSBsaW5lIGludG8gdGhlIGJ1ZmZlci4gKi8KLSAgY19wb3MgPSAtMTsKLQotICBsaW5lID0gaW52aXNpYmxlX2xpbmU7Ci0gIG91dCA9IGludl9ib3RsaW4gPSAwOwotCi0gIC8qIE1hcmsgdGhlIGxpbmUgYXMgbW9kaWZpZWQgb3Igbm90LiAgV2Ugb25seSBkbyB0aGlzIGZvciBoaXN0b3J5Ci0gICAgIGxpbmVzLiAqLwotICBpZiAoX3JsX21hcmtfbW9kaWZpZWRfbGluZXMgJiYgY3VycmVudF9oaXN0b3J5ICgpICYmIHJsX3VuZG9fbGlzdCkKLSAgICB7Ci0gICAgICBsaW5lW291dCsrXSA9ICcqJzsKLSAgICAgIGxpbmVbb3V0XSA9ICdcMCc7Ci0gICAgfQotCi0gIC8qIElmIHNvbWVvbmUgdGhvdWdodCB0aGF0IHRoZSByZWRpc3BsYXkgd2FzIGhhbmRsZWQsIGJ1dCB0aGUgY3VycmVudGx5Ci0gICAgIHZpc2libGUgbGluZSBoYXMgYSBkaWZmZXJlbnQgbW9kaWZpY2F0aW9uIHN0YXRlIHRoYW4gdGhlIG9uZSBhYm91dAotICAgICB0byBiZWNvbWUgdmlzaWJsZSwgdGhlbiBjb3JyZWN0IHRoZSBjYWxsZXIncyBtaXNjb25jZXB0aW9uLiAqLwotICBpZiAodmlzaWJsZV9saW5lWzBdICE9IGludmlzaWJsZV9saW5lWzBdKQotICAgIHJsX2Rpc3BsYXlfZml4ZWQgPSAwOwotCi0gIC8qIElmIHRoZSBwcm9tcHQgdG8gYmUgZGlzcGxheWVkIGlzIHRoZSBgcHJpbWFyeScgcmVhZGxpbmUgcHJvbXB0ICh0aGUKLSAgICAgb25lIHBhc3NlZCB0byByZWFkbGluZSgpKSwgdXNlIHRoZSB2YWx1ZXMgd2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkLgotICAgICBJZiBub3QsIHVzZSB3aGF0J3MgYWxyZWFkeSBpbiBybF9kaXNwbGF5X3Byb21wdC4gIFdSQVBfT0ZGU0VUIGlzIHRoZQotICAgICBudW1iZXIgb2Ygbm9uLXZpc2libGUgY2hhcmFjdGVycyBpbiB0aGUgcHJvbXB0IHN0cmluZy4gKi8KLSAgaWYgKHJsX2Rpc3BsYXlfcHJvbXB0ID09IHJsX3Byb21wdCB8fCBsb2NhbF9wcm9tcHQpCi0gICAgewotICAgICAgaW50IGxvY2FsX2xlbiA9IGxvY2FsX3Byb21wdCA/IHN0cmxlbiAobG9jYWxfcHJvbXB0KSA6IDA7Ci0gICAgICBpZiAobG9jYWxfcHJvbXB0X3ByZWZpeCAmJiBmb3JjZWRfZGlzcGxheSkKLQlfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKGxvY2FsX3Byb21wdF9wcmVmaXgsIHN0cmxlbiAobG9jYWxfcHJvbXB0X3ByZWZpeCkpOwotCi0gICAgICBpZiAobG9jYWxfbGVuID4gMCkKLQl7Ci0JICB0ZW1wID0gbG9jYWxfbGVuICsgb3V0ICsgMjsKLQkgIGlmICh0ZW1wID49IGxpbmVfc2l6ZSkKLQkgICAgewotCSAgICAgIGxpbmVfc2l6ZSA9ICh0ZW1wICsgMTAyNCkgLSAodGVtcCAlIDEwMjQpOwotCSAgICAgIHZpc2libGVfbGluZSA9IHhyZWFsbG9jICh2aXNpYmxlX2xpbmUsIGxpbmVfc2l6ZSk7Ci0JICAgICAgbGluZSA9IGludmlzaWJsZV9saW5lID0geHJlYWxsb2MgKGludmlzaWJsZV9saW5lLCBsaW5lX3NpemUpOwotCSAgICB9Ci0JICBzdHJuY3B5IChsaW5lICsgb3V0LCBsb2NhbF9wcm9tcHQsIGxvY2FsX2xlbik7Ci0JICBvdXQgKz0gbG9jYWxfbGVuOwotCX0KLSAgICAgIGxpbmVbb3V0XSA9ICdcMCc7Ci0gICAgICB3cmFwX29mZnNldCA9IGxvY2FsX2xlbiAtIHZpc2libGVfbGVuZ3RoOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBwbXRsZW47Ci0gICAgICBwcm9tcHRfdGhpc19saW5lID0gc3RycmNociAocmxfZGlzcGxheV9wcm9tcHQsICdcbicpOwotICAgICAgaWYgKCFwcm9tcHRfdGhpc19saW5lKQotCXByb21wdF90aGlzX2xpbmUgPSBybF9kaXNwbGF5X3Byb21wdDsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcm9tcHRfdGhpc19saW5lKys7Ci0JICBpZiAoZm9yY2VkX2Rpc3BsYXkpCi0JICAgIHsKLQkgICAgICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKHJsX2Rpc3BsYXlfcHJvbXB0LCBwcm9tcHRfdGhpc19saW5lIC0gcmxfZGlzcGxheV9wcm9tcHQpOwotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgYXQgY29sdW1uIHplcm8gZXZlbiBhZnRlciBhIG5ld2xpbmUsCi0JCSByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0ZXJtaW5hbCBvdXRwdXQgcHJvY2Vzc2luZy4gKi8KLQkgICAgICBpZiAocHJvbXB0X3RoaXNfbGluZVstMl0gIT0gJ1xyJykKLQkJY3IgKCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHBtdGxlbiA9IHN0cmxlbiAocHJvbXB0X3RoaXNfbGluZSk7Ci0gICAgICB0ZW1wID0gcG10bGVuICsgb3V0ICsgMjsKLSAgICAgIGlmICh0ZW1wID49IGxpbmVfc2l6ZSkKLQl7Ci0JICBsaW5lX3NpemUgPSAodGVtcCArIDEwMjQpIC0gKHRlbXAgJSAxMDI0KTsKLQkgIHZpc2libGVfbGluZSA9IHhyZWFsbG9jICh2aXNpYmxlX2xpbmUsIGxpbmVfc2l6ZSk7Ci0JICBsaW5lID0gaW52aXNpYmxlX2xpbmUgPSB4cmVhbGxvYyAoaW52aXNpYmxlX2xpbmUsIGxpbmVfc2l6ZSk7Ci0JfQotICAgICAgc3RybmNweSAobGluZSArIG91dCwgIHByb21wdF90aGlzX2xpbmUsIHBtdGxlbik7Ci0gICAgICBvdXQgKz0gcG10bGVuOwotICAgICAgbGluZVtvdXRdID0gJ1wwJzsKLSAgICAgIHdyYXBfb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSNkZWZpbmUgQ0hFQ0tfTFBPUygpIFwKLSAgICAgIGRvIHsgXAotCWxwb3MrKzsgXAotCWlmIChscG9zID49IHNjcmVlbndpZHRoKSBcCi0JICB7IFwKLQkgICAgaW52X2xicmVha3NbKytuZXdsaW5lc10gPSBvdXQ7IFwKLQkgICAgbHBvcyA9IDA7IFwKLQkgIH0gXAotICAgICAgfSB3aGlsZSAoMCkKLQotICAvKiBpbnZfbGJyZWFrc1tpXSBpcyB3aGVyZSBsaW5lIGkgc3RhcnRzIGluIHRoZSBidWZmZXIuICovCi0gIGludl9sYnJlYWtzW25ld2xpbmVzID0gMF0gPSAwOwotICBscG9zID0gb3V0IC0gd3JhcF9vZmZzZXQ7Ci0KLSAgLyogWFhYIC0gd2hhdCBpZiBscG9zIGlzIGFscmVhZHkgPj0gc2NyZWVud2lkdGggYmVmb3JlIHdlIHN0YXJ0IGRyYXdpbmcgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSBjb21tYW5kIGxpbmU/ICovCi0gIHdoaWxlIChscG9zID49IHNjcmVlbndpZHRoKQotICAgIHsKLSNpZiAwCi0gICAgICB0ZW1wID0gKChuZXdsaW5lcyArIDEpICogc2NyZWVud2lkdGgpIC0gKChuZXdsaW5lcyA9PSAwKSA/IHdyYXBfb2Zmc2V0IDogMCk7Ci0jZWxzZQotICAgICAgLyogWFhYIC0gcG9zc2libGUgZml4IGZyb20gRGFyaW4gSm9obnNvbiA8ZGFyaW5AYWN1c29uLmNvbT4gZm9yIHByb21wdAotCSBzdHJpbmcgd2l0aCBpbnZpc2libGUgY2hhcmFjdGVycyB0aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBzY3JlZW4KLQkgd2lkdGguICovCi0gICAgICB0ZW1wID0gKChuZXdsaW5lcyArIDEpICogc2NyZWVud2lkdGgpICsgKChuZXdsaW5lcyA9PSAwKSA/IHdyYXBfb2Zmc2V0IDogMCk7Ci0jZW5kaWYKLSAgICAgIGludl9sYnJlYWtzWysrbmV3bGluZXNdID0gdGVtcDsKLSAgICAgIGxwb3MgLT0gc2NyZWVud2lkdGg7Ci0gICAgfQotCi0gIGxiX2xpbmVudW0gPSAwOwotICBmb3IgKGluID0gMDsgaW4gPCBybF9lbmQ7IGluKyspCi0gICAgewotICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXJsX2xpbmVfYnVmZmVyW2luXTsKLQotICAgICAgaWYgKG91dCArIDggPj0gbGluZV9zaXplKQkJLyogWFhYIC0gOCBmb3IgXHQgKi8KLQl7Ci0JICBsaW5lX3NpemUgKj0gMjsKLQkgIHZpc2libGVfbGluZSA9IHhyZWFsbG9jICh2aXNpYmxlX2xpbmUsIGxpbmVfc2l6ZSk7Ci0JICBpbnZpc2libGVfbGluZSA9IHhyZWFsbG9jIChpbnZpc2libGVfbGluZSwgbGluZV9zaXplKTsKLQkgIGxpbmUgPSBpbnZpc2libGVfbGluZTsKLQl9Ci0KLSAgICAgIGlmIChpbiA9PSBybF9wb2ludCkKLQl7Ci0JICBjX3BvcyA9IG91dDsKLQkgIGxiX2xpbmVudW0gPSBuZXdsaW5lczsKLQl9Ci0KLSAgICAgIGlmIChNRVRBX0NIQVIgKGMpKQotCXsKLQkgIGlmIChfcmxfb3V0cHV0X21ldGFfY2hhcnMgPT0gMCkKLQkgICAgewotCSAgICAgIHNwcmludGYgKGxpbmUgKyBvdXQsICJcXCVvIiwgYyk7Ci0KLQkgICAgICBpZiAobHBvcyArIDQgPj0gc2NyZWVud2lkdGgpCi0JCXsKLQkJICB0ZW1wID0gc2NyZWVud2lkdGggLSBscG9zOwotCQkgIGludl9sYnJlYWtzWysrbmV3bGluZXNdID0gb3V0ICsgdGVtcDsKLQkJICBscG9zID0gNCAtIHRlbXA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxwb3MgKz0gNDsKLQotCSAgICAgIG91dCArPSA0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsaW5lW291dCsrXSA9IGM7Ci0JICAgICAgQ0hFQ0tfTFBPUygpOwotCSAgICB9Ci0JfQotI2lmIGRlZmluZWQgKERJU1BMQVlfVEFCUykKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKLQl7Ci0JICByZWdpc3RlciBpbnQgdGVtcCwgbmV3b3V0OwotCi0jaWYgMAotCSAgbmV3b3V0ID0gKG91dCB8IChpbnQpNykgKyAxOwotI2Vsc2UKLQkgIG5ld291dCA9IG91dCArIDggLSBscG9zICUgODsKLSNlbmRpZgotCSAgdGVtcCA9IG5ld291dCAtIG91dDsKLQkgIGlmIChscG9zICsgdGVtcCA+PSBzY3JlZW53aWR0aCkKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGludCB0ZW1wMjsKLQkgICAgICB0ZW1wMiA9IHNjcmVlbndpZHRoIC0gbHBvczsKLQkgICAgICBpbnZfbGJyZWFrc1srK25ld2xpbmVzXSA9IG91dCArIHRlbXAyOwotCSAgICAgIGxwb3MgPSB0ZW1wIC0gdGVtcDI7Ci0JICAgICAgd2hpbGUgKG91dCA8IG5ld291dCkKLQkJbGluZVtvdXQrK10gPSAnICc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdoaWxlIChvdXQgPCBuZXdvdXQpCi0JCWxpbmVbb3V0KytdID0gJyAnOwotCSAgICAgIGxwb3MgKz0gdGVtcDsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nICYmIF9ybF9ob3Jpem9udGFsX3Njcm9sbF9tb2RlID09IDAgJiYgdGVybV91cCAmJiAqdGVybV91cCkKLQl7Ci0JICBsaW5lW291dCsrXSA9ICdcMCc7CS8qIFhYWCAtIHNlbnRpbmVsICovCi0JICBpbnZfbGJyZWFrc1srK25ld2xpbmVzXSA9IG91dDsKLQkgIGxwb3MgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKENUUkxfQ0hBUiAoYykgfHwgYyA9PSBSVUJPVVQpCi0JewotCSAgbGluZVtvdXQrK10gPSAnXic7Ci0JICBDSEVDS19MUE9TKCk7Ci0JICBsaW5lW291dCsrXSA9IENUUkxfQ0hBUiAoYykgPyBVTkNUUkwgKGMpIDogJz8nOwotCSAgQ0hFQ0tfTFBPUygpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsaW5lW291dCsrXSA9IGM7Ci0JICBDSEVDS19MUE9TKCk7Ci0JfQotICAgIH0KLSAgbGluZVtvdXRdID0gJ1wwJzsKLSAgaWYgKGNfcG9zIDwgMCkKLSAgICB7Ci0gICAgICBjX3BvcyA9IG91dDsKLSAgICAgIGxiX2xpbmVudW0gPSBuZXdsaW5lczsKLSAgICB9Ci0KLSAgaW52X2JvdGxpbiA9IGxiX2JvdGxpbiA9IG5ld2xpbmVzOwotICBpbnZfbGJyZWFrc1tuZXdsaW5lcysxXSA9IG91dDsKLSAgY3Vyc29yX2xpbmVudW0gPSBsYl9saW5lbnVtOwotCi0gIC8qIENfUE9TID09IHBvc2l0aW9uIGluIGJ1ZmZlciB3aGVyZSBjdXJzb3Igc2hvdWxkIGJlIHBsYWNlZC4gKi8KLQotICAvKiBQV1A6IG5vdyBpcyB3aGVuIHRoaW5ncyBnZXQgYSBiaXQgaGFpcnkuICBUaGUgdmlzaWJsZSBhbmQgaW52aXNpYmxlCi0gICAgIGxpbmUgYnVmZmVycyBhcmUgcmVhbGx5IG11bHRpcGxlIGxpbmVzLCB3aGljaCB3b3VsZCB3cmFwIGV2ZXJ5Ci0gICAgIChzY3JlZW53aWR0aCAtIDEpIGNoYXJhY3RlcnMuICBHbyB0aHJvdWdoIGVhY2ggaW4gdHVybiwgZmluZGluZwotICAgICB0aGUgY2hhbmdlZCByZWdpb24gYW5kIHVwZGF0aW5nIGl0LiAgVGhlIGxpbmUgb3JkZXIgaXMgdG9wIHRvIGJvdHRvbS4gKi8KLQotICAvKiBJZiB3ZSBjYW4gbW92ZSB0aGUgY3Vyc29yIHVwIGFuZCBkb3duLCB0aGVuIHVzZSBtdWx0aXBsZSBsaW5lcywKLSAgICAgb3RoZXJ3aXNlLCBsZXQgbG9uZyBsaW5lcyBkaXNwbGF5IGluIGEgc2luZ2xlIHRlcm1pbmFsIGxpbmUsIGFuZAotICAgICBob3Jpem9udGFsbHkgc2Nyb2xsIGl0LiAqLwotCi0gIGlmIChfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZSA9PSAwICYmIHRlcm1fdXAgJiYgKnRlcm1fdXApCi0gICAgewotICAgICAgaW50IG5sZWZ0LCBwb3MsIGNoYW5nZWRfc2NyZWVuX2xpbmU7Ci0KLSAgICAgIGlmICghcmxfZGlzcGxheV9maXhlZCB8fCBmb3JjZWRfZGlzcGxheSkKLQl7Ci0JICBmb3JjZWRfZGlzcGxheSA9IDA7Ci0KLQkgIC8qIElmIHdlIGhhdmUgbW9yZSB0aGFuIGEgc2NyZWVuZnVsIG9mIG1hdGVyaWFsIHRvIGRpc3BsYXksIHRoZW4KLQkgICAgIG9ubHkgZGlzcGxheSBhIHNjcmVlbmZ1bC4gIFdlIHNob3VsZCBkaXNwbGF5IHRoZSBsYXN0IHNjcmVlbiwKLQkgICAgIG5vdCB0aGUgZmlyc3QuICAqLwotCSAgaWYgKG91dCA+PSBzY3JlZW5jaGFycykKLQkgICAgb3V0ID0gc2NyZWVuY2hhcnMgLSAxOwotCi0JICAvKiBUaGUgZmlyc3QgbGluZSBpcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gMCBpbiB0aGUgYnVmZmVyLiAgVGhlCi0JICAgICBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbGluZXMgc3RhcnQgYXQgaW52X2xicmVha3NbTl0sIG9mZnNldCBieQotCSAgICAgT0ZGU0VUICh3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYWJvdmUpLiAgKi8KLQotI2RlZmluZSBXX09GRlNFVChsaW5lLCBvZmZzZXQpICgobGluZSkgPT0gMCA/IG9mZnNldCA6IDApCi0jZGVmaW5lIFZJU19MTEVOKGwpCSgobCkgPiBfcmxfdmlzX2JvdGxpbiA/IDAgOiAodmlzX2xicmVha3NbbCsxXSAtIHZpc19sYnJlYWtzW2xdKSkKLSNkZWZpbmUgSU5WX0xMRU4obCkJKGludl9sYnJlYWtzW2wrMV0gLSBpbnZfbGJyZWFrc1tsXSkKLSNkZWZpbmUgVklTX0NIQVJTKGxpbmUpICh2aXNpYmxlX2xpbmUgKyB2aXNfbGJyZWFrc1tsaW5lXSkKLSNkZWZpbmUgVklTX0xJTkUobGluZSkgKChsaW5lKSA+IF9ybF92aXNfYm90bGluKSA/ICIiIDogVklTX0NIQVJTKGxpbmUpCi0jZGVmaW5lIElOVl9MSU5FKGxpbmUpIChpbnZpc2libGVfbGluZSArIGludl9sYnJlYWtzW2xpbmVdKQotCi0JICAvKiBGb3IgZWFjaCBsaW5lIGluIHRoZSBidWZmZXIsIGRvIHRoZSB1cGRhdGluZyBkaXNwbGF5LiAqLwotCSAgZm9yIChsaW5lbnVtID0gMDsgbGluZW51bSA8PSBpbnZfYm90bGluOyBsaW5lbnVtKyspCi0JICAgIHsKLQkgICAgICB1cGRhdGVfbGluZSAoVklTX0xJTkUobGluZW51bSksIElOVl9MSU5FKGxpbmVudW0pLCBsaW5lbnVtLAotCQkJICAgVklTX0xMRU4obGluZW51bSksIElOVl9MTEVOKGxpbmVudW0pLCBpbnZfYm90bGluKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGxpbmUgd2l0aCB0aGUgcHJvbXB0LCB3ZSBtaWdodCBuZWVkIHRvCi0JCSBjb21wZW5zYXRlIGZvciBpbnZpc2libGUgY2hhcmFjdGVycyBpbiB0aGUgbmV3IGxpbmUuIERvCi0JCSB0aGlzIG9ubHkgaWYgdGhlcmUgaXMgbm90IG1vcmUgdGhhbiBvbmUgbmV3IGxpbmUgKHdoaWNoCi0JCSBpbXBsaWVzIHRoYXQgd2UgY29tcGxldGVseSBvdmVyd3JpdGUgdGhlIG9sZCB2aXNpYmxlIGxpbmUpCi0JCSBhbmQgdGhlIG5ldyBsaW5lIGlzIHNob3J0ZXIgdGhhbiB0aGUgb2xkLiAgTWFrZSBzdXJlIHdlIGFyZQotCQkgYXQgdGhlIGVuZCBvZiB0aGUgbmV3IGxpbmUgYmVmb3JlIGNsZWFyaW5nLiAqLwotCSAgICAgIGlmIChsaW5lbnVtID09IDAgJiYKLQkJICBpbnZfYm90bGluID09IDAgJiYgX3JsX2xhc3RfY19wb3MgPT0gb3V0ICYmCi0JCSAgKHdyYXBfb2Zmc2V0ID4gdmlzaWJsZV93cmFwX29mZnNldCkgJiYKLQkJICAoX3JsX2xhc3RfY19wb3MgPCB2aXNpYmxlX2ZpcnN0X2xpbmVfbGVuKSkKLQkJewotCQkgIG5sZWZ0ID0gc2NyZWVud2lkdGggKyB3cmFwX29mZnNldCAtIF9ybF9sYXN0X2NfcG9zOwotCQkgIGlmIChubGVmdCkKLQkJICAgIF9ybF9jbGVhcl90b19lb2wgKG5sZWZ0KTsKLQkJfQotCi0JICAgICAgLyogU2luY2UgdGhlIG5ldyBmaXJzdCBsaW5lIGlzIG5vdyB2aXNpYmxlLCBzYXZlIGl0cyBsZW5ndGguICovCi0JICAgICAgaWYgKGxpbmVudW0gPT0gMCkKLQkJdmlzaWJsZV9maXJzdF9saW5lX2xlbiA9IChpbnZfYm90bGluID4gMCkgPyBpbnZfbGJyZWFrc1sxXSA6IG91dCAtIHdyYXBfb2Zmc2V0OwotCSAgICB9Ci0KLQkgIC8qIFdlIG1heSBoYXZlIGRlbGV0ZWQgc29tZSBsaW5lcy4gIElmIHNvLCBjbGVhciB0aGUgbGVmdCBvdmVyCi0JICAgICBibGFuayBvbmVzIGF0IHRoZSBib3R0b20gb3V0LiAqLwotCSAgaWYgKF9ybF92aXNfYm90bGluID4gaW52X2JvdGxpbikKLQkgICAgewotCSAgICAgIGNoYXIgKnR0OwotCSAgICAgIGZvciAoOyBsaW5lbnVtIDw9IF9ybF92aXNfYm90bGluOyBsaW5lbnVtKyspCi0JCXsKLQkJICB0dCA9IFZJU19DSEFSUyAobGluZW51bSk7Ci0JCSAgX3JsX21vdmVfdmVydCAobGluZW51bSk7Ci0JCSAgX3JsX21vdmVfY3Vyc29yX3JlbGF0aXZlICgwLCB0dCk7Ci0JCSAgX3JsX2NsZWFyX3RvX2VvbAotCQkgICAgKChsaW5lbnVtID09IF9ybF92aXNfYm90bGluKSA/IHN0cmxlbiAodHQpIDogc2NyZWVud2lkdGgpOwotCQl9Ci0JICAgIH0KLQkgIF9ybF92aXNfYm90bGluID0gaW52X2JvdGxpbjsKLQotCSAgLyogQ0hBTkdFRF9TQ1JFRU5fTElORSBpcyBzZXQgdG8gMSBpZiB3ZSBoYXZlIG1vdmVkIHRvIGEKLQkgICAgIGRpZmZlcmVudCBzY3JlZW4gbGluZSBkdXJpbmcgdGhpcyByZWRpc3BsYXkuICovCi0JICBjaGFuZ2VkX3NjcmVlbl9saW5lID0gX3JsX2xhc3Rfdl9wb3MgIT0gY3Vyc29yX2xpbmVudW07Ci0JICBpZiAoY2hhbmdlZF9zY3JlZW5fbGluZSkKLQkgICAgewotCSAgICAgIF9ybF9tb3ZlX3ZlcnQgKGN1cnNvcl9saW5lbnVtKTsKLQkgICAgICAvKiBJZiB3ZSBtb3ZlZCB1cCB0byB0aGUgbGluZSB3aXRoIHRoZSBwcm9tcHQgdXNpbmcgdGVybV91cCwKLQkJIHRoZSBwaHlzaWNhbCBjdXJzb3IgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBzdGF5cyB0aGUgc2FtZSwKLQkJIGJ1dCB0aGUgYnVmZmVyIHBvc2l0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvIGFjY291bnQKLQkJIGZvciBpbnZpc2libGUgY2hhcmFjdGVycy4gKi8KLQkgICAgICBpZiAoY3Vyc29yX2xpbmVudW0gPT0gMCAmJiB3cmFwX29mZnNldCkKLQkJX3JsX2xhc3RfY19wb3MgKz0gd3JhcF9vZmZzZXQ7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSB0byByZXByaW50IHRoZSBwcm9tcHQgaWYgaXQgY29udGFpbnMgaW52aXNpYmxlCi0JICAgICBjaGFyYWN0ZXJzLCBzaW5jZSBpdCdzIG5vdCBnZW5lcmFsbHkgT0sgdG8ganVzdCByZXByaW50Ci0JICAgICB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4gIEJ1dCB3ZQotCSAgICAgb25seSBuZWVkIHRvIHJlcHJpbnQgaXQgaWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGxhc3QKLQkgICAgIGludmlzaWJsZSBjaGFyYWN0ZXIgaW4gdGhlIHByb21wdCBzdHJpbmcuICovCi0JICBubGVmdCA9IHZpc2libGVfbGVuZ3RoICsgd3JhcF9vZmZzZXQ7Ci0JICBpZiAoY3Vyc29yX2xpbmVudW0gPT0gMCAmJiB3cmFwX29mZnNldCA+IDAgJiYgX3JsX2xhc3RfY19wb3MgPiAwICYmCi0JICAgICAgX3JsX2xhc3RfY19wb3MgPD0gbGFzdF9pbnZpc2libGUgJiYgbG9jYWxfcHJvbXB0KQotCSAgICB7Ci0jaWYgZGVmaW5lZCAoX19NU0RPU19fKQotCSAgICAgIHB1dGMgKCdccicsIHJsX291dHN0cmVhbSk7Ci0jZWxzZQotCSAgICAgIGlmICh0ZXJtX2NyKQotCQl0cHV0cyAodGVybV9jciwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotI2VuZGlmCi0JICAgICAgX3JsX291dHB1dF9zb21lX2NoYXJzIChsb2NhbF9wcm9tcHQsIG5sZWZ0KTsKLQkgICAgICBfcmxfbGFzdF9jX3BvcyA9IG5sZWZ0OwotCSAgICB9Ci0KLQkgIC8qIFdoZXJlIG9uIHRoYXQgbGluZT8gIEFuZCB3aGVyZSBkb2VzIHRoYXQgbGluZSBzdGFydAotCSAgICAgaW4gdGhlIGJ1ZmZlcj8gKi8KLQkgIHBvcyA9IGludl9sYnJlYWtzW2N1cnNvcl9saW5lbnVtXTsKLQkgIC8qIG5sZWZ0ID09IG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBsaW5lIGJ1ZmZlciBiZXR3ZWVuIHRoZQotCSAgICAgc3RhcnQgb2YgdGhlIGxpbmUgYW5kIHRoZSBjdXJzb3IgcG9zaXRpb24uICovCi0JICBubGVmdCA9IGNfcG9zIC0gcG9zOwotCi0JICAvKiBTaW5jZSBfcmxfYmFja3NwYWNlKCkgZG9lc24ndCBrbm93IGFib3V0IGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIHRoZQotCSAgICAgcHJvbXB0LCBhbmQgdGhlcmUncyBubyBnb29kIHdheSB0byB0ZWxsIGl0LCB3ZSBjb21wZW5zYXRlIGZvcgotCSAgICAgdGhvc2UgY2hhcmFjdGVycyBoZXJlIGFuZCBjYWxsIF9ybF9iYWNrc3BhY2UoKSBkaXJlY3RseS4gKi8KLQkgIGlmICh3cmFwX29mZnNldCAmJiBjdXJzb3JfbGluZW51bSA9PSAwICYmIG5sZWZ0IDwgX3JsX2xhc3RfY19wb3MpCi0JICAgIHsKLQkgICAgICBfcmxfYmFja3NwYWNlIChfcmxfbGFzdF9jX3BvcyAtIG5sZWZ0KTsKLQkgICAgICBfcmxfbGFzdF9jX3BvcyA9IG5sZWZ0OwotCSAgICB9Ci0KLQkgIGlmIChubGVmdCAhPSBfcmxfbGFzdF9jX3BvcykKLQkgICAgX3JsX21vdmVfY3Vyc29yX3JlbGF0aXZlIChubGVmdCwgJmludmlzaWJsZV9saW5lW3Bvc10pOwotCX0KLSAgICB9Ci0gIGVsc2UJCQkJLyogRG8gaG9yaXpvbnRhbCBzY3JvbGxpbmcuICovCi0gICAgewotI2RlZmluZSBNX09GRlNFVChtYXJnaW4sIG9mZnNldCkgKChtYXJnaW4pID09IDAgPyBvZmZzZXQgOiAwKQotICAgICAgaW50IGxtYXJnaW4sIG5kaXNwLCBubGVmdCwgcGh5c19jX3BvcywgdDsKLQotICAgICAgLyogQWx3YXlzIGF0IHRvcCBsaW5lLiAqLwotICAgICAgX3JsX2xhc3Rfdl9wb3MgPSAwOwotCi0gICAgICAvKiBDb21wdXRlIHdoZXJlIGluIHRoZSBidWZmZXIgdGhlIGRpc3BsYXllZCBsaW5lIHNob3VsZCBzdGFydC4gIFRoaXMKLQkgd2lsbCBiZSBMTUFSR0lOLiAqLwotCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIGN1cnNvci4gKi8KLSAgICAgIG5kaXNwID0gY19wb3MgLSB3cmFwX29mZnNldDsKLSAgICAgIG5sZWZ0ICA9IHZpc2libGVfbGVuZ3RoICsgd3JhcF9vZmZzZXQ7Ci0gICAgICAvKiBXaGVyZSB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiB3aWxsIGJlIG9uIHRoZSBzY3JlZW4uICBUaGlzIGNhbiBiZQotCSBsb25nZXIgdGhhbiBTQ1JFRU5XSURUSDsgaWYgaXQgaXMsIGxtYXJnaW4gd2lsbCBiZSBhZGp1c3RlZC4gKi8KLSAgICAgIHBoeXNfY19wb3MgPSBjX3BvcyAtIChsYXN0X2xtYXJnaW4gPyBsYXN0X2xtYXJnaW4gOiB3cmFwX29mZnNldCk7Ci0gICAgICB0ID0gc2NyZWVud2lkdGggLyAzOwotCi0gICAgICAvKiBJZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaGFkIGFscmVhZHkgZXhjZWVkZWQgdGhlIHNjcmVlbndpZHRoLAotCSBsYXN0X2xtYXJnaW4gd2lsbCBiZSA+IDAuICovCi0KLSAgICAgIC8qIElmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBkaXNwbGF5ZWQgaXMgbW9yZSB0aGFuIHRoZSBzY3JlZW4KLQkgd2lkdGgsIGNvbXB1dGUgdGhlIHN0YXJ0aW5nIG9mZnNldCBzbyB0aGF0IHRoZSBjdXJzb3IgaXMgYWJvdXQKLQkgdHdvLXRoaXJkcyBvZiB0aGUgd2F5IGFjcm9zcyB0aGUgc2NyZWVuLiAqLwotICAgICAgaWYgKHBoeXNfY19wb3MgPiBzY3JlZW53aWR0aCAtIDIpCi0JewotCSAgbG1hcmdpbiA9IGNfcG9zIC0gKDIgKiB0KTsKLQkgIGlmIChsbWFyZ2luIDwgMCkKLQkgICAgbG1hcmdpbiA9IDA7Ci0JICAvKiBJZiB0aGUgbGVmdCBtYXJnaW4gd291bGQgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIHByb21wdCB3aXRoCi0JICAgICBpbnZpc2libGUgY2hhcmFjdGVycywgZG9uJ3QgZGlzcGxheSB0aGUgcHJvbXB0IGF0IGFsbC4gKi8KLQkgIGlmICh3cmFwX29mZnNldCAmJiBsbWFyZ2luID4gMCAmJiBsbWFyZ2luIDwgbmxlZnQpCi0JICAgIGxtYXJnaW4gPSBubGVmdDsKLQl9Ci0gICAgICBlbHNlIGlmIChuZGlzcCA8IHNjcmVlbndpZHRoIC0gMikJCS8qIFhYWCAtIHdhcyAtMSAqLwotCWxtYXJnaW4gPSAwOwotICAgICAgZWxzZSBpZiAocGh5c19jX3BvcyA8IDEpCi0JewotCSAgLyogSWYgd2UgYXJlIG1vdmluZyBiYWNrIHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBhbmQKLQkgICAgIHRoZSBsYXN0IG1hcmdpbiBpcyBubyBsb25nZXIgY29ycmVjdCwgY29tcHV0ZSBhIG5ldyBvbmUuICovCi0JICBsbWFyZ2luID0gKChjX3BvcyAtIDEpIC8gdCkgKiB0OwkvKiBYWFggKi8KLQkgIGlmICh3cmFwX29mZnNldCAmJiBsbWFyZ2luID4gMCAmJiBsbWFyZ2luIDwgbmxlZnQpCi0JICAgIGxtYXJnaW4gPSBubGVmdDsKLQl9Ci0gICAgICBlbHNlCi0JbG1hcmdpbiA9IGxhc3RfbG1hcmdpbjsKLQotICAgICAgLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvbiB0aGUgc2NyZWVuIGlzbid0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQkgaW4gdGhlIGRpc3BsYXkgbGluZSwgaW5kaWNhdGUgdGhpcyB3aXRoIGEgc3BlY2lhbCBjaGFyYWN0ZXIuICovCi0gICAgICBpZiAobG1hcmdpbiA+IDApCi0JbGluZVtsbWFyZ2luXSA9ICc8JzsKLQotICAgICAgLyogSWYgU0NSRUVOV0lEVEggY2hhcmFjdGVycyBzdGFydGluZyBhdCBMTUFSR0lOIGRvIG5vdCBlbmNvbXBhc3MKLQkgdGhlIHdob2xlIGxpbmUsIGluZGljYXRlIHRoYXQgd2l0aCBhIHNwZWNpYWwgY2hhcmFjdGVyIGF0IHRoZQotCSByaWdodCBlZGdlIG9mIHRoZSBzY3JlZW4uICBJZiBMTUFSR0lOIGlzIDAsIHdlIG5lZWQgdG8gdGFrZSB0aGUKLQkgd3JhcCBvZmZzZXQgaW50byBhY2NvdW50LiAqLwotICAgICAgdCA9IGxtYXJnaW4gKyBNX09GRlNFVCAobG1hcmdpbiwgd3JhcF9vZmZzZXQpICsgc2NyZWVud2lkdGg7Ci0gICAgICBpZiAodCA8IG91dCkKLQlsaW5lW3QgLSAxXSA9ICc+JzsKLQotICAgICAgaWYgKCFybF9kaXNwbGF5X2ZpeGVkIHx8IGZvcmNlZF9kaXNwbGF5IHx8IGxtYXJnaW4gIT0gbGFzdF9sbWFyZ2luKQotCXsKLQkgIGZvcmNlZF9kaXNwbGF5ID0gMDsKLQkgIHVwZGF0ZV9saW5lICgmdmlzaWJsZV9saW5lW2xhc3RfbG1hcmdpbl0sCi0JCSAgICAgICAmaW52aXNpYmxlX2xpbmVbbG1hcmdpbl0sCi0JCSAgICAgICAwLAotCQkgICAgICAgc2NyZWVud2lkdGggKyB2aXNpYmxlX3dyYXBfb2Zmc2V0LAotCQkgICAgICAgc2NyZWVud2lkdGggKyAobG1hcmdpbiA/IDAgOiB3cmFwX29mZnNldCksCi0JCSAgICAgICAwKTsKLQotCSAgLyogSWYgdGhlIHZpc2libGUgbmV3IGxpbmUgaXMgc2hvcnRlciB0aGFuIHRoZSBvbGQsIGJ1dCB0aGUgbnVtYmVyCi0JICAgICBvZiBpbnZpc2libGUgY2hhcmFjdGVycyBpcyBncmVhdGVyLCBhbmQgd2UgYXJlIGF0IHRoZSBlbmQgb2YKLQkgICAgIHRoZSBuZXcgbGluZSwgd2UgbmVlZCB0byBjbGVhciB0byBlb2wuICovCi0JICB0ID0gX3JsX2xhc3RfY19wb3MgLSBNX09GRlNFVCAobG1hcmdpbiwgd3JhcF9vZmZzZXQpOwotCSAgaWYgKChNX09GRlNFVCAobG1hcmdpbiwgd3JhcF9vZmZzZXQpID4gdmlzaWJsZV93cmFwX29mZnNldCkgJiYKLQkgICAgICAoX3JsX2xhc3RfY19wb3MgPT0gb3V0KSAmJgotCSAgICAgIHQgPCB2aXNpYmxlX2ZpcnN0X2xpbmVfbGVuKQotCSAgICB7Ci0JICAgICAgbmxlZnQgPSBzY3JlZW53aWR0aCAtIHQ7Ci0JICAgICAgX3JsX2NsZWFyX3RvX2VvbCAobmxlZnQpOwotCSAgICB9Ci0JICB2aXNpYmxlX2ZpcnN0X2xpbmVfbGVuID0gb3V0IC0gbG1hcmdpbiAtIE1fT0ZGU0VUIChsbWFyZ2luLCB3cmFwX29mZnNldCk7Ci0JICBpZiAodmlzaWJsZV9maXJzdF9saW5lX2xlbiA+IHNjcmVlbndpZHRoKQotCSAgICB2aXNpYmxlX2ZpcnN0X2xpbmVfbGVuID0gc2NyZWVud2lkdGg7Ci0KLQkgIF9ybF9tb3ZlX2N1cnNvcl9yZWxhdGl2ZSAoY19wb3MgLSBsbWFyZ2luLCAmaW52aXNpYmxlX2xpbmVbbG1hcmdpbl0pOwotCSAgbGFzdF9sbWFyZ2luID0gbG1hcmdpbjsKLQl9Ci0gICAgfQotICBmZmx1c2ggKHJsX291dHN0cmVhbSk7Ci0KLSAgLyogU3dhcCB2aXNpYmxlIGFuZCBub24tdmlzaWJsZSBsaW5lcy4gKi8KLSAgewotICAgIGNoYXIgKnRlbXAgPSB2aXNpYmxlX2xpbmU7Ci0gICAgaW50ICppdGVtcCA9IHZpc19sYnJlYWtzOwotICAgIHZpc2libGVfbGluZSA9IGludmlzaWJsZV9saW5lOwotICAgIGludmlzaWJsZV9saW5lID0gdGVtcDsKLSAgICB2aXNfbGJyZWFrcyA9IGludl9sYnJlYWtzOwotICAgIGludl9sYnJlYWtzID0gaXRlbXA7Ci0gICAgcmxfZGlzcGxheV9maXhlZCA9IDA7Ci0gICAgLyogSWYgd2UgYXJlIGRpc3BsYXlpbmcgb24gYSBzaW5nbGUgbGluZSwgYW5kIGxhc3RfbG1hcmdpbiBpcyA+IDAsIHdlCi0gICAgICAgYXJlIG5vdCBkaXNwbGF5aW5nIGFueSBpbnZpc2libGUgY2hhcmFjdGVycywgc28gc2V0IHZpc2libGVfd3JhcF9vZmZzZXQKLSAgICAgICB0byAwLiAqLwotICAgIGlmIChfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZSAmJiBsYXN0X2xtYXJnaW4pCi0gICAgICB2aXNpYmxlX3dyYXBfb2Zmc2V0ID0gMDsKLSAgICBlbHNlCi0gICAgICB2aXNpYmxlX3dyYXBfb2Zmc2V0ID0gd3JhcF9vZmZzZXQ7Ci0gIH0KLX0KLQotLyogUFdQOiB1cGRhdGVfbGluZSgpIGlzIGJhc2VkIG9uIGZpbmRpbmcgdGhlIG1pZGRsZSBkaWZmZXJlbmNlIG9mIGVhY2gKLSAgIGxpbmUgb24gdGhlIHNjcmVlbjsgdmlzOgotCi0JCQkgICAgIC9vbGQgZmlyc3QgZGlmZmVyZW5jZQotCS9iZWdpbm5pbmcgb2YgbGluZSAgIHwJICAgICAgL29sZCBsYXN0IHNhbWUgICAgICAgL29sZCBFT0wKLQl2CQkgICAgIHYJICAgICAgdgkJICAgIHYKLW9sZDoJZWRkaWU+IE9oLCBteSBsaXR0bGUgZ3J1bnRsZS1idWdneSBpcyB0byBtZSwgYXMgbHVyZ2lkIGFzCi1uZXc6CWVkZGllPiBPaCwgbXkgbGl0dGxlIGJ1Z2d5IHNheXMgdG8gbWUsIGFzIGx1cmdpZCBhcwotCV4JCSAgICAgXgleCQkJICAgXgotCVxiZWdpbm5pbmcgb2YgbGluZSAgIHwJXG5ldyBsYXN0IHNhbWUJICAgXG5ldyBlbmQgb2YgbGluZQotCQkJICAgICBcbmV3IGZpcnN0IGRpZmZlcmVuY2UKLQotICAgQWxsIGFyZSBjaGFyYWN0ZXIgcG9pbnRlcnMgZm9yIHRoZSBzYWtlIG9mIHNwZWVkLiAgU3BlY2lhbCBjYXNlcyBmb3IKLSAgIG5vIGRpZmZlcmVuY2VzLCBhcyB3ZWxsIGFzIGZvciBlbmQgb2YgbGluZSBhZGRpdGlvbnMgbXVzdCBiZSBoYW5kbGVkLgotCi0gICBDb3VsZCBiZSBtYWRlIGV2ZW4gc21hcnRlciwgYnV0IHRoaXMgd29ya3Mgd2VsbCBlbm91Z2ggKi8KLXN0YXRpYyB2b2lkCi11cGRhdGVfbGluZSAob2xkLCBuZXcsIGN1cnJlbnRfbGluZSwgb21heCwgbm1heCwgaW52X2JvdGxpbikKLSAgICAgcmVnaXN0ZXIgY2hhciAqb2xkLCAqbmV3OwotICAgICBpbnQgY3VycmVudF9saW5lLCBvbWF4LCBubWF4LCBpbnZfYm90bGluOwotewotICByZWdpc3RlciBjaGFyICpvZmQsICpvbHMsICpvZSwgKm5mZCwgKm5scywgKm5lOwotICBpbnQgdGVtcCwgbGVuZGlmZiwgd3NhdGVuZCwgb2QsIG5kOwotICBpbnQgY3VycmVudF9pbnZpc19jaGFyczsKLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgcmlnaHQgZWRnZSBvZiBhIHRlcm1pbmFsIHRoYXQgc3VwcG9ydHMgeG4sIHdlJ3JlCi0gICAgIHJlYWR5IHRvIHdyYXAgYXJvdW5kLCBzbyBkbyBzby4gIFRoaXMgZml4ZXMgcHJvYmxlbXMgd2l0aCBrbm93aW5nCi0gICAgIHRoZSBleGFjdCBjdXJzb3IgcG9zaXRpb24gYW5kIGN1dC1hbmQtcGFzdGUgd2l0aCBjZXJ0YWluIHRlcm1pbmFsCi0gICAgIGVtdWxhdG9ycy4gIEluIHRoaXMgY2FsY3VsYXRpb24sIFRFTVAgaXMgdGhlIHBoeXNpY2FsIHNjcmVlbgotICAgICBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLiAqLwotICB0ZW1wID0gX3JsX2xhc3RfY19wb3MgLSBXX09GRlNFVChfcmxfbGFzdF92X3BvcywgdmlzaWJsZV93cmFwX29mZnNldCk7Ci0gIGlmICh0ZW1wID09IHNjcmVlbndpZHRoICYmIF9ybF90ZXJtX2F1dG93cmFwICYmICFfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZQotICAgICAgJiYgX3JsX2xhc3Rfdl9wb3MgPT0gY3VycmVudF9saW5lIC0gMSkKLSAgICB7Ci0gICAgICBpZiAobmV3WzBdKQotCXB1dGMgKG5ld1swXSwgcmxfb3V0c3RyZWFtKTsKLSAgICAgIGVsc2UKLQlwdXRjICgnICcsIHJsX291dHN0cmVhbSk7Ci0gICAgICBfcmxfbGFzdF9jX3BvcyA9IDE7CQkvKiBYWFggKi8KLSAgICAgIF9ybF9sYXN0X3ZfcG9zKys7Ci0gICAgICBpZiAob2xkWzBdICYmIG5ld1swXSkKLQlvbGRbMF0gPSBuZXdbMF07Ci0gICAgfQotICAgICAgCi0gIC8qIEZpbmQgZmlyc3QgZGlmZmVyZW5jZS4gKi8KLSAgZm9yIChvZmQgPSBvbGQsIG5mZCA9IG5ldzsKLSAgICAgICAob2ZkIC0gb2xkIDwgb21heCkgJiYgKm9mZCAmJiAoKm9mZCA9PSAqbmZkKTsKLSAgICAgICBvZmQrKywgbmZkKyspCi0gICAgOwotCi0gIC8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgc2NyZWVuIGxpbmUuICBORCBhbmQgT0QgYXJlIHVzZWQgdG8ga2VlcCB0cmFjawotICAgICBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBuZSBhbmQgbmV3IGFuZCBvZSBhbmQgb2xkLCByZXNwZWN0aXZlbHksIHRvCi0gICAgIG1vdmUgYSBzdWJ0cmFjdGlvbiBvdXQgb2YgZWFjaCBsb29wLiAqLwotICBmb3IgKG9kID0gb2ZkIC0gb2xkLCBvZSA9IG9mZDsgb2QgPCBvbWF4ICYmICpvZTsgb2UrKywgb2QrKyk7Ci0gIGZvciAobmQgPSBuZmQgLSBuZXcsIG5lID0gbmZkOyBuZCA8IG5tYXggJiYgKm5lOyBuZSsrLCBuZCsrKTsKLQotICAvKiBJZiBubyBkaWZmZXJlbmNlLCBjb250aW51ZSB0byBuZXh0IGxpbmUuICovCi0gIGlmIChvZmQgPT0gb2UgJiYgbmZkID09IG5lKQotICAgIHJldHVybjsKLQotICB3c2F0ZW5kID0gMTsJCQkvKiBmbGFnIGZvciB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0gIG9scyA9IG9lIC0gMTsJCQkvKiBmaW5kIGxhc3Qgc2FtZSAqLwotICBubHMgPSBuZSAtIDE7Ci0gIHdoaWxlICgob2xzID4gb2ZkKSAmJiAobmxzID4gbmZkKSAmJiAoKm9scyA9PSAqbmxzKSkKLSAgICB7Ci0gICAgICBpZiAoKm9scyAhPSAnICcpCi0Jd3NhdGVuZCA9IDA7Ci0gICAgICBvbHMtLTsKLSAgICAgIG5scy0tOwotICAgIH0KLQotICBpZiAod3NhdGVuZCkKLSAgICB7Ci0gICAgICBvbHMgPSBvZTsKLSAgICAgIG5scyA9IG5lOwotICAgIH0KLSAgZWxzZSBpZiAoKm9scyAhPSAqbmxzKQotICAgIHsKLSAgICAgIGlmICgqb2xzKQkJCS8qIGRvbid0IHN0ZXAgcGFzdCB0aGUgTlVMICovCi0Jb2xzKys7Ci0gICAgICBpZiAoKm5scykKLQlubHMrKzsKLSAgICB9Ci0KLSAgLyogY291bnQgb2YgaW52aXNpYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGN1cnJlbnQgaW52aXNpYmxlIGxpbmUuICovCi0gIGN1cnJlbnRfaW52aXNfY2hhcnMgPSBXX09GRlNFVCAoY3VycmVudF9saW5lLCB3cmFwX29mZnNldCk7Ci0gIGlmIChfcmxfbGFzdF92X3BvcyAhPSBjdXJyZW50X2xpbmUpCi0gICAgewotICAgICAgX3JsX21vdmVfdmVydCAoY3VycmVudF9saW5lKTsKLSAgICAgIGlmIChjdXJyZW50X2xpbmUgPT0gMCAmJiB2aXNpYmxlX3dyYXBfb2Zmc2V0KQotCV9ybF9sYXN0X2NfcG9zICs9IHZpc2libGVfd3JhcF9vZmZzZXQ7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgYW5kIHRoZXJlIGFyZSBpbnZpc2libGUgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgcHJvbXB0IHN0cmluZywgYW5kIHRoZSBwcm9tcHQgc3RyaW5nIGhhcyBub3QgY2hhbmdlZCwgYW5kIHRoZSBjdXJyZW50Ci0gICAgIGN1cnNvciBwb3NpdGlvbiBpcyBiZWZvcmUgdGhlIGxhc3QgaW52aXNpYmxlIGNoYXJhY3RlciBpbiB0aGUgcHJvbXB0LAotICAgICBhbmQgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gbW92ZSB0byBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHByb21wdAotICAgICBzdHJpbmcsIHRoZW4gcmVkcmF3IHRoZSBlbnRpcmUgcHJvbXB0IHN0cmluZy4gIFdlIGNhbiBvbmx5IGRvIHRoaXMKLSAgICAgcmVsaWFibHkgaWYgdGhlIHRlcm1pbmFsIHN1cHBvcnRzIGEgYGNyJyBjYXBhYmlsaXR5LgotCi0gICAgIFRoaXMgaXMgbm90IGFuIGVmZmljaWVuY3kgaGFjayAtLSB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCByZWRyYXdpbmcKLSAgICAgcG9ydGlvbnMgb2YgdGhlIHByb21wdCBzdHJpbmcgaWYgdGhleSBjb250YWluIHRlcm1pbmFsIGVzY2FwZQotICAgICBzZXF1ZW5jZXMgKGxpa2UgZHJhd2luZyB0aGUgYHVuYm9sZCcgc2VxdWVuY2Ugd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKLSAgICAgYGJvbGQnKSB0aGF0IG1hbmlmZXN0cyBpdHNlbGYgb24gY2VydGFpbiB0ZXJtaW5hbHMuICovCi0KLSAgbGVuZGlmZiA9IGxvY2FsX3Byb21wdCA/IHN0cmxlbiAobG9jYWxfcHJvbXB0KSA6IDA7Ci0gIG9kID0gb2ZkIC0gb2xkOwkvKiBpbmRleCBvZiBmaXJzdCBkaWZmZXJlbmNlIGluIHZpc2libGUgbGluZSAqLwotICBpZiAoY3VycmVudF9saW5lID09IDAgJiYgIV9ybF9ob3Jpem9udGFsX3Njcm9sbF9tb2RlICYmCi0gICAgICB0ZXJtX2NyICYmIGxlbmRpZmYgPiB2aXNpYmxlX2xlbmd0aCAmJiBfcmxfbGFzdF9jX3BvcyA+IDAgJiYKLSAgICAgIG9kID4gbGVuZGlmZiAmJiBfcmxfbGFzdF9jX3BvcyA8IGxhc3RfaW52aXNpYmxlKQotICAgIHsKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pCi0gICAgICBwdXRjICgnXHInLCBybF9vdXRzdHJlYW0pOwotI2Vsc2UKLSAgICAgIHRwdXRzICh0ZXJtX2NyLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0jZW5kaWYgLyogIV9fTVNET1NfXyAqLwotICAgICAgX3JsX291dHB1dF9zb21lX2NoYXJzIChsb2NhbF9wcm9tcHQsIGxlbmRpZmYpOwotICAgICAgX3JsX2xhc3RfY19wb3MgPSBsZW5kaWZmOwotICAgIH0KLQotICBfcmxfbW92ZV9jdXJzb3JfcmVsYXRpdmUgKG9kLCBvbGQpOwotCi0gIC8qIGlmIChsZW4gKG5ldykgPiBsZW4gKG9sZCkpICovCi0gIGxlbmRpZmYgPSAobmxzIC0gbmZkKSAtIChvbHMgLSBvZmQpOwotCi0gIC8qIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgbnVtYmVyIG9mIGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIGEgbGluZSwgYW5kCi0gICAgIHRoZSBzcG90IG9mIGZpcnN0IGRpZmZlcmVuY2UgaXMgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGludmlzaWJsZSBjaGFycywKLSAgICAgbGVuZGlmZiBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8KLSAgaWYgKGN1cnJlbnRfbGluZSA9PSAwICYmICFfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZSAmJgotICAgICAgY3VycmVudF9pbnZpc19jaGFycyAhPSB2aXNpYmxlX3dyYXBfb2Zmc2V0KQotICAgIGxlbmRpZmYgKz0gdmlzaWJsZV93cmFwX29mZnNldCAtIGN1cnJlbnRfaW52aXNfY2hhcnM7Ci0KLSAgLyogSW5zZXJ0IChkaWZmIChsZW4gKG9sZCksIGxlbiAobmV3KSkgY2guICovCi0gIHRlbXAgPSBuZSAtIG5mZDsKLSAgaWYgKGxlbmRpZmYgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vbi16ZXJvIGlmIHdlJ3JlIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBsaW5lcy4gKi8KLSAgICAgIGludCBnbCA9IGN1cnJlbnRfbGluZSA+PSBfcmxfdmlzX2JvdGxpbiAmJiBpbnZfYm90bGluID4gX3JsX3Zpc19ib3RsaW47Ci0gICAgICAvKiBTb21ldGltZXMgaXQgaXMgY2hlYXBlciB0byBwcmludCB0aGUgY2hhcmFjdGVycyByYXRoZXIgdGhhbgotCSB1c2UgdGhlIHRlcm1pbmFsJ3MgY2FwYWJpbGl0aWVzLiAgSWYgd2UncmUgZ3Jvd2luZyB0aGUgbnVtYmVyCi0JIG9mIGxpbmVzLCBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgY2F1c2UgdGhlIG5ldyBsaW5lIHRvIHdyYXAKLQkgYXJvdW5kIG9uIGF1dG8td3JhcHBpbmcgdGVybWluYWxzLiAqLwotICAgICAgaWYgKHRlcm1pbmFsX2Nhbl9pbnNlcnQgJiYgKCgyICogdGVtcCkgPj0gbGVuZGlmZiB8fCB0ZXJtX0lDKSAmJiAoIV9ybF90ZXJtX2F1dG93cmFwIHx8ICFnbCkpCi0JewotCSAgLyogSWYgbGVuZGlmZiA+IHZpc2libGVfbGVuZ3RoIGFuZCBfcmxfbGFzdF9jX3BvcyA9PSAwIGFuZAotCSAgICAgX3JsX2hvcml6b250YWxfc2Nyb2xsX21vZGUgPT0gMSwgaW5zZXJ0aW5nIHRoZSBjaGFyYWN0ZXJzIHdpdGgKLQkgICAgIHRlcm1fSUMgb3IgdGVybV9pYyB3aWxsIHNjcmV3IHVwIHRoZSBzY3JlZW4gYmVjYXVzZSBvZiB0aGUKLQkgICAgIGludmlzaWJsZSBjaGFyYWN0ZXJzLiAgV2UgbmVlZCB0byBqdXN0IGRyYXcgdGhlbS4gKi8KLQkgIGlmICgqb2xzICYmICghX3JsX2hvcml6b250YWxfc2Nyb2xsX21vZGUgfHwgX3JsX2xhc3RfY19wb3MgPiAwIHx8Ci0JCQlsZW5kaWZmIDw9IHZpc2libGVfbGVuZ3RoIHx8ICFjdXJyZW50X2ludmlzX2NoYXJzKSkKLQkgICAgewotCSAgICAgIGluc2VydF9zb21lX2NoYXJzIChuZmQsIGxlbmRpZmYpOwotCSAgICAgIF9ybF9sYXN0X2NfcG9zICs9IGxlbmRpZmY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpvbHMgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEF0IHRoZSBlbmQgb2YgYSBsaW5lIHRoZSBjaGFyYWN0ZXJzIGRvIG5vdCBoYXZlIHRvCi0JCSBiZSAiaW5zZXJ0ZWQiLiAgVGhleSBjYW4ganVzdCBiZSBwbGFjZWQgb24gdGhlIHNjcmVlbi4gKi8KLQkgICAgICAvKiBIb3dldmVyLCB0aGlzIHNjcmV3cyB1cCB0aGUgcmVzdCBvZiB0aGlzIGJsb2NrLCB3aGljaAotCQkgYXNzdW1lcyB5b3UndmUgZG9uZSB0aGUgaW5zZXJ0IGJlY2F1c2UgeW91IGNhbi4gKi8KLQkgICAgICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKG5mZCwgbGVuZGlmZik7Ci0JICAgICAgX3JsX2xhc3RfY19wb3MgKz0gbGVuZGlmZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgaGF2ZSBob3Jpem9udGFsIHNjcm9sbGluZyBhbmQgd2UgYXJlIG5vdCBpbnNlcnRpbmcgYXQKLQkJIHRoZSBlbmQuICBXZSBoYXZlIGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIHRoaXMgbGluZS4gIFRoaXMKLQkJIGlzIGEgZHVtYiB1cGRhdGUuICovCi0JICAgICAgX3JsX291dHB1dF9zb21lX2NoYXJzIChuZmQsIHRlbXApOwotCSAgICAgIF9ybF9sYXN0X2NfcG9zICs9IHRlbXA7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAvKiBDb3B5IChuZXcpIGNoYXJzIHRvIHNjcmVlbiBmcm9tIGZpcnN0IGRpZmYgdG8gbGFzdCBtYXRjaC4gKi8KLQkgIHRlbXAgPSBubHMgLSBuZmQ7Ci0JICBpZiAoKHRlbXAgLSBsZW5kaWZmKSA+IDApCi0JICAgIHsKLQkgICAgICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKG5mZCArIGxlbmRpZmYsIHRlbXAgLSBsZW5kaWZmKTsKLQkgICAgICBfcmxfbGFzdF9jX3BvcyArPSB0ZW1wIC0gbGVuZGlmZjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBjYW5ub3QgaW5zZXJ0IGNoYXJzLCB3cml0ZSB0byBFT0wgKi8KLQkgIF9ybF9vdXRwdXRfc29tZV9jaGFycyAobmZkLCB0ZW1wKTsKLQkgIF9ybF9sYXN0X2NfcG9zICs9IHRlbXA7Ci0JfQotICAgIH0KLSAgZWxzZQkJCQkvKiBEZWxldGUgY2hhcmFjdGVycyBmcm9tIGxpbmUuICovCi0gICAgewotICAgICAgLyogSWYgcG9zc2libGUgYW5kIGluZXhwZW5zaXZlIHRvIHVzZSB0ZXJtaW5hbCBkZWxldGlvbiwgdGhlbiBkbyBzby4gKi8KLSAgICAgIGlmICh0ZXJtX2RjICYmICgyICogdGVtcCkgPj0gLWxlbmRpZmYpCi0JewotCSAgLyogSWYgYWxsIHdlJ3JlIGRvaW5nIGlzIGVyYXNpbmcgdGhlIGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIHRoZQotCSAgICAgcHJvbXB0IHN0cmluZywgZG9uJ3QgYm90aGVyLiAgSXQgc2NyZXdzIHVwIHRoZSBhc3N1bXB0aW9ucwotCSAgICAgYWJvdXQgd2hhdCdzIG9uIHRoZSBzY3JlZW4uICovCi0JICBpZiAoX3JsX2hvcml6b250YWxfc2Nyb2xsX21vZGUgJiYgX3JsX2xhc3RfY19wb3MgPT0gMCAmJgotCSAgICAgIC1sZW5kaWZmID09IHZpc2libGVfd3JhcF9vZmZzZXQpCi0JICAgIGxlbmRpZmYgPSAwOwotCi0JICBpZiAobGVuZGlmZikKLQkgICAgZGVsZXRlX2NoYXJzICgtbGVuZGlmZik7IC8qIGRlbGV0ZSAoZGlmZikgY2hhcmFjdGVycyAqLwotCi0JICAvKiBDb3B5IChuZXcpIGNoYXJzIHRvIHNjcmVlbiBmcm9tIGZpcnN0IGRpZmYgdG8gbGFzdCBtYXRjaCAqLwotCSAgdGVtcCA9IG5scyAtIG5mZDsKLQkgIGlmICh0ZW1wID4gMCkKLQkgICAgewotCSAgICAgIF9ybF9vdXRwdXRfc29tZV9jaGFycyAobmZkLCB0ZW1wKTsKLQkgICAgICBfcmxfbGFzdF9jX3BvcyArPSB0ZW1wOwotCSAgICB9Ci0JfQotICAgICAgLyogT3RoZXJ3aXNlLCBwcmludCBvdmVyIHRoZSBleGlzdGluZyBtYXRlcmlhbC4gKi8KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAodGVtcCA+IDApCi0JICAgIHsKLQkgICAgICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKG5mZCwgdGVtcCk7Ci0JICAgICAgX3JsX2xhc3RfY19wb3MgKz0gdGVtcDsKLQkgICAgfQotCSAgbGVuZGlmZiA9IChvZSAtIG9sZCkgLSAobmUgLSBuZXcpOwotCSAgaWYgKGxlbmRpZmYpCi0JICAgIHsJICAKLQkgICAgICBpZiAoX3JsX3Rlcm1fYXV0b3dyYXAgJiYgY3VycmVudF9saW5lIDwgaW52X2JvdGxpbikKLQkJc3BhY2VfdG9fZW9sIChsZW5kaWZmKTsKLQkgICAgICBlbHNlCi0JCV9ybF9jbGVhcl90b19lb2wgKGxlbmRpZmYpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGVsbCB0aGUgdXBkYXRlIHJvdXRpbmVzIHRoYXQgd2UgaGF2ZSBtb3ZlZCBvbnRvIGEgbmV3IChlbXB0eSkgbGluZS4gKi8KLWludAotcmxfb25fbmV3X2xpbmUgKCkKLXsKLSAgaWYgKHZpc2libGVfbGluZSkKLSAgICB2aXNpYmxlX2xpbmVbMF0gPSAnXDAnOwotCi0gIF9ybF9sYXN0X2NfcG9zID0gX3JsX2xhc3Rfdl9wb3MgPSAwOwotICBfcmxfdmlzX2JvdGxpbiA9IGxhc3RfbG1hcmdpbiA9IDA7Ci0gIGlmICh2aXNfbGJyZWFrcykKLSAgICB2aXNfbGJyZWFrc1swXSA9IHZpc19sYnJlYWtzWzFdID0gMDsKLSAgdmlzaWJsZV93cmFwX29mZnNldCA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBBY3R1YWxseSB1cGRhdGUgdGhlIGRpc3BsYXksIHBlcmlvZC4gKi8KLWludAotcmxfZm9yY2VkX3VwZGF0ZV9kaXNwbGF5ICgpCi17Ci0gIGlmICh2aXNpYmxlX2xpbmUpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY2hhciAqdGVtcCA9IHZpc2libGVfbGluZTsKLQotICAgICAgd2hpbGUgKCp0ZW1wKQotCSp0ZW1wKysgPSAnXDAnOwotICAgIH0KLSAgcmxfb25fbmV3X2xpbmUgKCk7Ci0gIGZvcmNlZF9kaXNwbGF5Kys7Ci0gICgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1vdmUgdGhlIGN1cnNvciBmcm9tIF9ybF9sYXN0X2NfcG9zIHRvIE5FVywgd2hpY2ggYXJlIGJ1ZmZlciBpbmRpY2VzLgotICAgREFUQSBpcyB0aGUgY29udGVudHMgb2YgdGhlIHNjcmVlbiBsaW5lIG9mIGludGVyZXN0OyBpLmUuLCB3aGVyZQotICAgdGhlIG1vdmVtZW50IGlzIGJlaW5nIGRvbmUuICovCi12b2lkCi1fcmxfbW92ZV9jdXJzb3JfcmVsYXRpdmUgKG5ldywgZGF0YSkKLSAgICAgaW50IG5ldzsKLSAgICAgY2hhciAqZGF0YTsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZywgdGhlbiByZXR1cm4uICovCi0gIGlmIChfcmxfbGFzdF9jX3BvcyA9PSBuZXcpIHJldHVybjsKLQotICAvKiBJdCBtYXkgYmUgZmFzdGVyIHRvIG91dHB1dCBhIENSLCBhbmQgdGhlbiBtb3ZlIGZvcndhcmRzIGluc3RlYWQKLSAgICAgb2YgbW92aW5nIGJhY2t3YXJkcy4gKi8KLSAgLyogaSA9PSBjdXJyZW50IHBoeXNpY2FsIGN1cnNvciBwb3NpdGlvbi4gKi8KLSAgaSA9IF9ybF9sYXN0X2NfcG9zIC0gV19PRkZTRVQoX3JsX2xhc3Rfdl9wb3MsIHZpc2libGVfd3JhcF9vZmZzZXQpOwotICBpZiAobmV3ID09IDAgfHwgQ1JfRkFTVEVSIChuZXcsIF9ybF9sYXN0X2NfcG9zKSB8fAotICAgICAgKF9ybF90ZXJtX2F1dG93cmFwICYmIGkgPT0gc2NyZWVud2lkdGgpKQotICAgIHsKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pCi0gICAgICBwdXRjICgnXHInLCBybF9vdXRzdHJlYW0pOwotI2Vsc2UKLSAgICAgIHRwdXRzICh0ZXJtX2NyLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0jZW5kaWYgLyogIV9fTVNET1NfXyAqLwotICAgICAgX3JsX2xhc3RfY19wb3MgPSAwOwotICAgIH0KLQotICBpZiAoX3JsX2xhc3RfY19wb3MgPCBuZXcpCi0gICAgewotICAgICAgLyogTW92ZSB0aGUgY3Vyc29yIGZvcndhcmQuICBXZSBkbyBpdCBieSBwcmludGluZyB0aGUgY29tbWFuZAotCSB0byBtb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCBpZiB0aGVyZSBpcyBvbmUsIGVsc2UgcHJpbnQgdGhhdAotCSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGFnYWluLiAgV2hpY2ggaXMgY2hlYXBlcj8gKi8KLQotICAgICAgLyogVGhlIGFib3ZlIGNvbW1lbnQgaXMgbGVmdCBoZXJlIGZvciBwb3N0ZXJpdHkuICBJdCBpcyBmYXN0ZXIKLQkgdG8gcHJpbnQgb25lIGNoYXJhY3RlciAobm9uLWNvbnRyb2wpIHRoYW4gdG8gcHJpbnQgYSBjb250cm9sCi0JIHNlcXVlbmNlIHRlbGxpbmcgdGhlIHRlcm1pbmFsIHRvIG1vdmUgZm9yd2FyZCBvbmUgY2hhcmFjdGVyLgotCSBUaGF0IGtpbmQgb2YgY29udHJvbCBpcyBmb3IgcGVvcGxlIHdobyBkb24ndCBrbm93IHdoYXQgdGhlCi0JIGRhdGEgaXMgdW5kZXJuZWF0aCB0aGUgY3Vyc29yLiAqLwotI2lmIGRlZmluZWQgKEhBQ0tfVEVSTUNBUF9NT1RJT04pCi0gICAgICBleHRlcm4gY2hhciAqdGVybV9mb3J3YXJkX2NoYXI7Ci0KLSAgICAgIGlmICh0ZXJtX2ZvcndhcmRfY2hhcikKLQlmb3IgKGkgPSBfcmxfbGFzdF9jX3BvczsgaSA8IG5ldzsgaSsrKQotCSAgdHB1dHMgKHRlcm1fZm9yd2FyZF9jaGFyLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gICAgICBlbHNlCi0JZm9yIChpID0gX3JsX2xhc3RfY19wb3M7IGkgPCBuZXc7IGkrKykKLQkgIHB1dGMgKGRhdGFbaV0sIHJsX291dHN0cmVhbSk7Ci0jZWxzZQotICAgICAgZm9yIChpID0gX3JsX2xhc3RfY19wb3M7IGkgPCBuZXc7IGkrKykKLQlwdXRjIChkYXRhW2ldLCBybF9vdXRzdHJlYW0pOwotI2VuZGlmIC8qIEhBQ0tfVEVSTUNBUF9NT1RJT04gKi8KLSAgICB9Ci0gIGVsc2UgaWYgKF9ybF9sYXN0X2NfcG9zID4gbmV3KQotICAgIF9ybF9iYWNrc3BhY2UgKF9ybF9sYXN0X2NfcG9zIC0gbmV3KTsKLSAgX3JsX2xhc3RfY19wb3MgPSBuZXc7Ci19Ci0KLS8qIFBXUDogbW92ZSB0aGUgY3Vyc29yIHVwIG9yIGRvd24uICovCi12b2lkCi1fcmxfbW92ZV92ZXJ0ICh0bykKLSAgICAgaW50IHRvOwotewotICByZWdpc3RlciBpbnQgZGVsdGEsIGk7Ci0KLSAgaWYgKF9ybF9sYXN0X3ZfcG9zID09IHRvIHx8IHRvID4gc2NyZWVuaGVpZ2h0KQotICAgIHJldHVybjsKLQotI2lmIGRlZmluZWQgKF9fR08zMl9fKQotICB7Ci0gICAgaW50IHJvdywgY29sOwotCi0gICAgaSA9IGZmbHVzaCAocmxfb3V0c3RyZWFtKTsJLyogbWFrZSBzdXJlIHRoZSBjdXJzb3IgcG9zIGlzIGN1cnJlbnQhICovCi0gICAgU2NyZWVuR2V0Q3Vyc29yICgmcm93LCAmY29sKTsKLSAgICBTY3JlZW5TZXRDdXJzb3IgKChyb3cgKyB0byAtIF9ybF9sYXN0X3ZfcG9zKSwgY29sKTsKLSAgICBkZWx0YSA9IGk7Ci0gIH0KLSNlbHNlIC8qICFfX0dPMzJfXyAqLwotCi0gIGlmICgoZGVsdGEgPSB0byAtIF9ybF9sYXN0X3ZfcG9zKSA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlbHRhOyBpKyspCi0JcHV0YyAoJ1xuJywgcmxfb3V0c3RyZWFtKTsKLSAgICAgIHRwdXRzICh0ZXJtX2NyLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gICAgICBfcmxfbGFzdF9jX3BvcyA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCS8qIGRlbHRhIDwgMCAqLwotICAgICAgaWYgKHRlcm1fdXAgJiYgKnRlcm1fdXApCi0JZm9yIChpID0gMDsgaSA8IC1kZWx0YTsgaSsrKQotCSAgdHB1dHMgKHRlcm1fdXAsIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLSAgICB9Ci0jZW5kaWYgLyogIV9fR08zMl9fICovCi0gIF9ybF9sYXN0X3ZfcG9zID0gdG87CQkvKiBOb3cgVE8gaXMgaGVyZSAqLwotfQotCi0vKiBQaHlzaWNhbGx5IHByaW50IEMgb24gcmxfb3V0c3RyZWFtLiAgVGhpcyBpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGtub3cKLSAgIGhvdyB0byBvcHRpbWl6ZSB0aGUgZGlzcGxheS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb3V0cHV0LiAqLwotaW50Ci1ybF9zaG93X2NoYXIgKGMpCi0gICAgIGludCBjOwotewotICBpbnQgbiA9IDE7Ci0gIGlmIChNRVRBX0NIQVIgKGMpICYmIChfcmxfb3V0cHV0X21ldGFfY2hhcnMgPT0gMCkpCi0gICAgewotICAgICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiTS0iKTsKLSAgICAgIG4gKz0gMjsKLSAgICAgIGMgPSBVTk1FVEEgKGMpOwotICAgIH0KLQotI2lmIGRlZmluZWQgKERJU1BMQVlfVEFCUykKLSAgaWYgKChDVFJMX0NIQVIgKGMpICYmIGMgIT0gJ1x0JykgfHwgYyA9PSBSVUJPVVQpCi0jZWxzZQotICBpZiAoQ1RSTF9DSEFSIChjKSB8fCBjID09IFJVQk9VVCkKLSNlbmRpZiAvKiAhRElTUExBWV9UQUJTICovCi0gICAgewotICAgICAgZnByaW50ZiAocmxfb3V0c3RyZWFtLCAiQy0iKTsKLSAgICAgIG4gKz0gMjsKLSAgICAgIGMgPSBDVFJMX0NIQVIgKGMpID8gVU5DVFJMIChjKSA6ICc/JzsKLSAgICB9Ci0KLSAgcHV0YyAoYywgcmxfb3V0c3RyZWFtKTsKLSAgZmZsdXNoIChybF9vdXRzdHJlYW0pOwotICByZXR1cm4gbjsKLX0KLQotaW50Ci1ybF9jaGFyYWN0ZXJfbGVuIChjLCBwb3MpCi0gICAgIHJlZ2lzdGVyIGludCBjLCBwb3M7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdWM7Ci0KLSAgdWMgPSAodW5zaWduZWQgY2hhciljOwotCi0gIGlmIChNRVRBX0NIQVIgKHVjKSkKLSAgICByZXR1cm4gKChfcmxfb3V0cHV0X21ldGFfY2hhcnMgPT0gMCkgPyA0IDogMSk7Ci0KLSAgaWYgKHVjID09ICdcdCcpCi0gICAgewotI2lmIGRlZmluZWQgKERJU1BMQVlfVEFCUykKLSAgICAgIHJldHVybiAoKChwb3MgfCA3KSArIDEpIC0gcG9zKTsKLSNlbHNlCi0gICAgICByZXR1cm4gKDIpOwotI2VuZGlmIC8qICFESVNQTEFZX1RBQlMgKi8KLSAgICB9Ci0KLSAgaWYgKENUUkxfQ0hBUiAoYykgfHwgYyA9PSBSVUJPVVQpCi0gICAgcmV0dXJuICgyKTsKLQotICByZXR1cm4gKChpc3ByaW50ICh1YykpID8gMSA6IDIpOwotfQotCi0vKiBIb3cgdG8gcHJpbnQgdGhpbmdzIGluIHRoZSAiZWNoby1hcmVhIi4gIFRoZSBwcm9tcHQgaXMgdHJlYXRlZCBhcyBhCi0gICBtaW5pLW1vZGVsaW5lLiAqLwotCi0jaWYgZGVmaW5lZCAoVVNFX1ZBUkFSR1MpCi1pbnQKLSNpZiBkZWZpbmVkIChQUkVGRVJfU1REQVJHKQotcmxfbWVzc2FnZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0jZWxzZQotcmxfbWVzc2FnZSAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSNpZiBkZWZpbmVkIChQUkVGRVJfVkFSQVJHUykKLSAgY2hhciAqZm9ybWF0OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChQUkVGRVJfU1REQVJHKQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0KLSAgdnNwcmludGYgKG1zZ19idWYsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgcmxfZGlzcGxheV9wcm9tcHQgPSBtc2dfYnVmOwotICAoKnJsX3JlZGlzcGxheV9mdW5jdGlvbikgKCk7Ci0gIHJldHVybiAwOwotfQotI2Vsc2UgLyogIVVTRV9WQVJBUkdTICovCi1pbnQKLXJsX21lc3NhZ2UgKGZvcm1hdCwgYXJnMSwgYXJnMikKLSAgICAgY2hhciAqZm9ybWF0OwotewotICBzcHJpbnRmIChtc2dfYnVmLCBmb3JtYXQsIGFyZzEsIGFyZzIpOwotICBybF9kaXNwbGF5X3Byb21wdCA9IG1zZ19idWY7Ci0gICgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogIVVTRV9WQVJBUkdTICovCi0KLS8qIEhvdyB0byBjbGVhciB0aGluZ3MgZnJvbSB0aGUgImVjaG8tYXJlYSIuICovCi1pbnQKLXJsX2NsZWFyX21lc3NhZ2UgKCkKLXsKLSAgcmxfZGlzcGxheV9wcm9tcHQgPSBybF9wcm9tcHQ7Ci0gICgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcmxfcmVzZXRfbGluZV9zdGF0ZSAoKQotewotICBybF9vbl9uZXdfbGluZSAoKTsKLQotICBybF9kaXNwbGF5X3Byb21wdCA9IHJsX3Byb21wdCA/IHJsX3Byb21wdCA6ICIiOwotICBmb3JjZWRfZGlzcGxheSA9IDE7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciAqc2F2ZWRfbG9jYWxfcHJvbXB0Owotc3RhdGljIGNoYXIgKnNhdmVkX2xvY2FsX3ByZWZpeDsKLXN0YXRpYyBpbnQgc2F2ZWRfbGFzdF9pbnZpc2libGU7Ci1zdGF0aWMgaW50IHNhdmVkX3Zpc2libGVfbGVuZ3RoOwotCi12b2lkCi1ybF9zYXZlX3Byb21wdCAoKQotewotICBzYXZlZF9sb2NhbF9wcm9tcHQgPSBsb2NhbF9wcm9tcHQ7Ci0gIHNhdmVkX2xvY2FsX3ByZWZpeCA9IGxvY2FsX3Byb21wdF9wcmVmaXg7Ci0gIHNhdmVkX2xhc3RfaW52aXNpYmxlID0gbGFzdF9pbnZpc2libGU7Ci0gIHNhdmVkX3Zpc2libGVfbGVuZ3RoID0gdmlzaWJsZV9sZW5ndGg7Ci0KLSAgbG9jYWxfcHJvbXB0ID0gbG9jYWxfcHJvbXB0X3ByZWZpeCA9IChjaGFyICopMDsKLSAgbGFzdF9pbnZpc2libGUgPSB2aXNpYmxlX2xlbmd0aCA9IDA7Ci19Ci0KLXZvaWQKLXJsX3Jlc3RvcmVfcHJvbXB0ICgpCi17Ci0gIGlmIChsb2NhbF9wcm9tcHQpCi0gICAgZnJlZSAobG9jYWxfcHJvbXB0KTsKLSAgaWYgKGxvY2FsX3Byb21wdF9wcmVmaXgpCi0gICAgZnJlZSAobG9jYWxfcHJvbXB0X3ByZWZpeCk7Ci0KLSAgbG9jYWxfcHJvbXB0ID0gc2F2ZWRfbG9jYWxfcHJvbXB0OwotICBsb2NhbF9wcm9tcHRfcHJlZml4ID0gc2F2ZWRfbG9jYWxfcHJlZml4OwotICBsYXN0X2ludmlzaWJsZSA9IHNhdmVkX2xhc3RfaW52aXNpYmxlOwotICB2aXNpYmxlX2xlbmd0aCA9IHNhdmVkX3Zpc2libGVfbGVuZ3RoOwotfQotCi1jaGFyICoKLV9ybF9tYWtlX3Byb21wdF9mb3Jfc2VhcmNoIChwY2hhcikKLSAgICAgaW50IHBjaGFyOwotewotICBpbnQgbGVuOwotICBjaGFyICpwbXQ7Ci0KLSAgcmxfc2F2ZV9wcm9tcHQgKCk7Ci0KLSAgaWYgKHNhdmVkX2xvY2FsX3Byb21wdCA9PSAwKQotICAgIHsKLSAgICAgIGxlbiA9IChybF9wcm9tcHQgJiYgKnJsX3Byb21wdCkgPyBzdHJsZW4gKHJsX3Byb21wdCkgOiAwOwotICAgICAgcG10ID0geG1hbGxvYyAobGVuICsgMik7Ci0gICAgICBpZiAobGVuKQotCXN0cmNweSAocG10LCBybF9wcm9tcHQpOwotICAgICAgcG10W2xlbl0gPSBwY2hhcjsKLSAgICAgIHBtdFtsZW4rMV0gPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9ICpzYXZlZF9sb2NhbF9wcm9tcHQgPyBzdHJsZW4gKHNhdmVkX2xvY2FsX3Byb21wdCkgOiAwOwotICAgICAgcG10ID0geG1hbGxvYyAobGVuICsgMik7Ci0gICAgICBpZiAobGVuKQotCXN0cmNweSAocG10LCBzYXZlZF9sb2NhbF9wcm9tcHQpOwotICAgICAgcG10W2xlbl0gPSBwY2hhcjsKLSAgICAgIHBtdFtsZW4rMV0gPSAnXDAnOwotICAgICAgbG9jYWxfcHJvbXB0ID0gc2F2ZXN0cmluZyAocG10KTsKLSAgICAgIGxhc3RfaW52aXNpYmxlID0gc2F2ZWRfbGFzdF9pbnZpc2libGU7Ci0gICAgICB2aXNpYmxlX2xlbmd0aCA9IHNhdmVkX3Zpc2libGVfbGVuZ3RoICsgMTsKLSAgICB9Ci0gIHJldHVybiBwbXQ7Ci19Ci0KLS8qIFF1aWNrIHJlZGlzcGxheSBoYWNrIHdoZW4gZXJhc2luZyBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCi12b2lkCi1fcmxfZXJhc2VfYXRfZW5kX29mX2xpbmUgKGwpCi0gICAgIGludCBsOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBfcmxfYmFja3NwYWNlIChsKTsKLSAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykKLSAgICBwdXRjICgnICcsIHJsX291dHN0cmVhbSk7Ci0gIF9ybF9iYWNrc3BhY2UgKGwpOwotICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQotICAgIHZpc2libGVfbGluZVstLV9ybF9sYXN0X2NfcG9zXSA9ICdcMCc7Ci0gIHJsX2Rpc3BsYXlfZml4ZWQrKzsKLX0KLQotLyogQ2xlYXIgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gIENPVU5UIGlzIHRoZSBtaW5pbXVtCi0gICBudW1iZXIgb2YgY2hhcmFjdGVyIHNwYWNlcyB0byBjbGVhciwgKi8KLXZvaWQKLV9ybF9jbGVhcl90b19lb2wgKGNvdW50KQotICAgICBpbnQgY291bnQ7Ci17Ci0jaWYgIWRlZmluZWQgKF9fR08zMl9fKQotICBpZiAodGVybV9jbHJlb2wpCi0gICAgdHB1dHMgKHRlcm1fY2xyZW9sLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gIGVsc2UgaWYgKGNvdW50KQotI2VuZGlmIC8qICFfX0dPMzJfXyAqLwotICAgIHNwYWNlX3RvX2VvbCAoY291bnQpOwotfQotCi0vKiBDbGVhciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lIHVzaW5nIHNwYWNlcy4gIENPVU5UIGlzIHRoZSBtaW5pbXVtCi0gICBudW1iZXIgb2YgY2hhcmFjdGVyIHNwYWNlcyB0byBjbGVhciwgKi8KLXN0YXRpYyB2b2lkCi1zcGFjZV90b19lb2wgKGNvdW50KQotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgcHV0YyAoJyAnLCBybF9vdXRzdHJlYW0pOwotCi0gIF9ybF9sYXN0X2NfcG9zICs9IGNvdW50OwotfQotCi12b2lkCi1fcmxfY2xlYXJfc2NyZWVuICgpCi17Ci0jaWYgZGVmaW5lZCAoX19HTzMyX18pCi0gIFNjcmVlbkNsZWFyICgpOwkvKiBGSVhNRTogb25seSB3b3JrcyBpbiB0ZXh0IG1vZGVzICovCi0gIFNjcmVlblNldEN1cnNvciAoMCwgMCk7ICAvKiB0ZXJtX2NscnBhZyBpcyAiY2wiIHdoaWNoIGhvbWVzIHRoZSBjdXJzb3IgKi8KLSNlbHNlCi0gIGlmICh0ZXJtX2NscnBhZykKLSAgICB0cHV0cyAodGVybV9jbHJwYWcsIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLSAgZWxzZQotI2VuZGlmIC8qICFfX0dPMzJfXyAqLwotICAgIGNybGYgKCk7Ci19Ci0KLS8qIEluc2VydCBDT1VOVCBjaGFyYWN0ZXJzIGZyb20gU1RSSU5HIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLwotc3RhdGljIHZvaWQKLWluc2VydF9zb21lX2NoYXJzIChzdHJpbmcsIGNvdW50KQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBjb3VudDsKLXsKLSNpZiBkZWZpbmVkIChfX0dPMzJfXykKLSNpZm5kZWYgX19ESkdQUF9fCi0gIGludCByb3csIGNvbCwgd2lkdGg7Ci0gIGNoYXIgKnJvd19zdGFydDsKLQotICBTY3JlZW5HZXRDdXJzb3IgKCZyb3csICZjb2wpOwotICB3aWR0aCA9IFNjcmVlbkNvbHMgKCk7Ci0gIHJvd19zdGFydCA9IFNjcmVlblByaW1hcnkgKyAocm93ICogd2lkdGgpOwotCi0gIG1lbWNweSAocm93X3N0YXJ0ICsgY29sICsgY291bnQsIHJvd19zdGFydCArIGNvbCwgd2lkdGggLSBjb2wgLSBjb3VudCk7Ci0jZW5kaWYgLyogIV9fREpHUFBfXyAqLwotICAvKiBQbGFjZSB0aGUgdGV4dCBvbiB0aGUgc2NyZWVuLiAqLwotICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKHN0cmluZywgY291bnQpOwotI2Vsc2UgLyogIV9HTzMyICovCi0KLSAgLyogSWYgSUMgaXMgZGVmaW5lZCwgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byAiZW50ZXIiIGluc2VydCBtb2RlLiAqLwotICBpZiAodGVybV9JQykKLSAgICB7Ci0gICAgICBjaGFyICpidWZmZXI7Ci0gICAgICBidWZmZXIgPSB0Z290byAodGVybV9JQywgMCwgY291bnQpOwotICAgICAgdHB1dHMgKGJ1ZmZlciwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotICAgICAgX3JsX291dHB1dF9zb21lX2NoYXJzIChzdHJpbmcsIGNvdW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgaTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSB0byB0dXJuIG9uIGluc2VydC1tb2RlLCB0aGVuIGRvIHNvLiAqLwotICAgICAgaWYgKHRlcm1faW0gJiYgKnRlcm1faW0pCi0JdHB1dHMgKHRlcm1faW0sIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYSBzcGVjaWFsIGNvbW1hbmQgZm9yIGluc2VydGluZyBjaGFyYWN0ZXJzLCB0aGVuCi0JIHVzZSB0aGF0IGZpcnN0IHRvIG9wZW4gdXAgdGhlIHNwYWNlLiAqLwotICAgICAgaWYgKHRlcm1faWMgJiYgKnRlcm1faWMpCi0JewotCSAgZm9yIChpID0gY291bnQ7IGktLTsgKQotCSAgICB0cHV0cyAodGVybV9pYywgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotCX0KLQotICAgICAgLyogUHJpbnQgdGhlIHRleHQuICovCi0gICAgICBfcmxfb3V0cHV0X3NvbWVfY2hhcnMgKHN0cmluZywgY291bnQpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhIHN0cmluZyB0byB0dXJuIG9mZiBpbnNlcnQgbW9kZSwgd2UgaGFkIGJlc3QgdXNlCi0JIGl0IG5vdy4gKi8KLSAgICAgIGlmICh0ZXJtX2VpICYmICp0ZXJtX2VpKQotCXRwdXRzICh0ZXJtX2VpLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gICAgfQotI2VuZGlmIC8qICFfX0dPMzJfXyAqLwotfQotCi0vKiBEZWxldGUgQ09VTlQgY2hhcmFjdGVycyBmcm9tIHRoZSBkaXNwbGF5IGxpbmUuICovCi1zdGF0aWMgdm9pZAotZGVsZXRlX2NoYXJzIChjb3VudCkKLSAgICAgaW50IGNvdW50OwotewotI2lmICFkZWZpbmVkIChfX0RKR1BQX18pCi0jaWYgZGVmaW5lZCAoX19HTzMyX18pCi0gIGludCByb3csIGNvbCwgd2lkdGg7Ci0gIGNoYXIgKnJvd19zdGFydDsKLQotICBTY3JlZW5HZXRDdXJzb3IgKCZyb3csICZjb2wpOwotICB3aWR0aCA9IFNjcmVlbkNvbHMgKCk7Ci0gIHJvd19zdGFydCA9IFNjcmVlblByaW1hcnkgKyAocm93ICogd2lkdGgpOwotCi0gIG1lbWNweSAocm93X3N0YXJ0ICsgY29sLCByb3dfc3RhcnQgKyBjb2wgKyBjb3VudCwgd2lkdGggLSBjb2wgLSBjb3VudCk7Ci0gIG1lbXNldCAocm93X3N0YXJ0ICsgd2lkdGggLSBjb3VudCwgMCwgY291bnQgKiAyKTsKLSNlbHNlIC8qICFfR08zMiAqLwotCi0gIGlmIChjb3VudCA+IHNjcmVlbndpZHRoKQkvKiBYWFggKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKHRlcm1fREMgJiYgKnRlcm1fREMpCi0gICAgewotICAgICAgY2hhciAqYnVmZmVyOwotICAgICAgYnVmZmVyID0gdGdvdG8gKHRlcm1fREMsIGNvdW50LCBjb3VudCk7Ci0gICAgICB0cHV0cyAoYnVmZmVyLCBjb3VudCwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0ZXJtX2RjICYmICp0ZXJtX2RjKQotCXdoaWxlIChjb3VudC0tKQotCSAgdHB1dHMgKHRlcm1fZGMsIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLSAgICB9Ci0jZW5kaWYgLyogIV9fR08zMl9fICovCi0jZW5kaWYgLyogIV9fREpHUFBfXyAqLwotfQotCi12b2lkCi1fcmxfdXBkYXRlX2ZpbmFsICgpCi17Ci0gIGludCBmdWxsX2xpbmVzOwotCi0gIGZ1bGxfbGluZXMgPSAwOwotICAvKiBJZiB0aGUgY3Vyc29yIGlzIHRoZSBvbmx5IHRoaW5nIG9uIGFuIG90aGVyd2lzZS1ibGFuayBsYXN0IGxpbmUsCi0gICAgIGNvbXBlbnNhdGUgc28gd2UgZG9uJ3QgcHJpbnQgYW4gZXh0cmEgQ1JMRi4gKi8KLSAgaWYgKF9ybF92aXNfYm90bGluICYmIF9ybF9sYXN0X2NfcG9zID09IDAgJiYKLQl2aXNpYmxlX2xpbmVbdmlzX2xicmVha3NbX3JsX3Zpc19ib3RsaW5dXSA9PSAwKQotICAgIHsKLSAgICAgIF9ybF92aXNfYm90bGluLS07Ci0gICAgICBmdWxsX2xpbmVzID0gMTsKLSAgICB9Ci0gIF9ybF9tb3ZlX3ZlcnQgKF9ybF92aXNfYm90bGluKTsKLSAgLyogSWYgd2UndmUgd3JhcHBlZCBsaW5lcywgcmVtb3ZlIHRoZSBmaW5hbCB4dGVybSBsaW5lLXdyYXAgZmxhZy4gKi8KLSAgaWYgKGZ1bGxfbGluZXMgJiYgX3JsX3Rlcm1fYXV0b3dyYXAgJiYgKFZJU19MTEVOKF9ybF92aXNfYm90bGluKSA9PSBzY3JlZW53aWR0aCkpCi0gICAgewotICAgICAgY2hhciAqbGFzdF9saW5lOwotICAgICAgbGFzdF9saW5lID0gJnZpc2libGVfbGluZVtpbnZfbGJyZWFrc1tfcmxfdmlzX2JvdGxpbl1dOwotICAgICAgX3JsX21vdmVfY3Vyc29yX3JlbGF0aXZlIChzY3JlZW53aWR0aCAtIDEsIGxhc3RfbGluZSk7Ci0gICAgICBfcmxfY2xlYXJfdG9fZW9sICgwKTsKLSAgICAgIHB1dGMgKGxhc3RfbGluZVtzY3JlZW53aWR0aCAtIDFdLCBybF9vdXRzdHJlYW0pOwotICAgIH0KLSAgX3JsX3Zpc19ib3RsaW4gPSAwOwotICBjcmxmICgpOwotICBmZmx1c2ggKHJsX291dHN0cmVhbSk7Ci0gIHJsX2Rpc3BsYXlfZml4ZWQrKzsKLX0KLQotLyogTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi8KLXN0YXRpYyB2b2lkCi1jciAoKQotewotICBpZiAodGVybV9jcikKLSAgICB7Ci0jaWYgZGVmaW5lZCAoX19NU0RPU19fKQotICAgICAgcHV0YyAoJ1xyJywgcmxfb3V0c3RyZWFtKTsKLSNlbHNlCi0gICAgICB0cHV0cyAodGVybV9jciwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotI2VuZGlmIC8qICFfX01TRE9TX18gKi8KLSAgICAgIF9ybF9sYXN0X2NfcG9zID0gMDsKLSAgICB9Ci19Ci0KLS8qIFJlZGlzcGxheSB0aGUgY3VycmVudCBsaW5lIGFmdGVyIGEgU0lHV0lOQ0ggaXMgcmVjZWl2ZWQuICovCi12b2lkCi1fcmxfcmVkaXNwbGF5X2FmdGVyX3NpZ3dpbmNoICgpCi17Ci0gIGNoYXIgKnQsICpvbGRwLCAqb2xkbCwgKm9sZGxwcmVmaXg7Ci0KLSAgLyogQ2xlYXIgdGhlIGN1cnJlbnQgbGluZSBhbmQgcHV0IHRoZSBjdXJzb3IgYXQgY29sdW1uIDAuICBNYWtlIHN1cmUKLSAgICAgdGhlIHJpZ2h0IHRoaW5nIGhhcHBlbnMgaWYgd2UgaGF2ZSB3cmFwcGVkIHRvIGEgbmV3IHNjcmVlbiBsaW5lLiAqLwotICBpZiAodGVybV9jcikKLSAgICB7Ci0jaWYgZGVmaW5lZCAoX19NU0RPU19fKQotICAgICAgcHV0YyAoJ1xyJywgcmxfb3V0c3RyZWFtKTsKLSNlbHNlCi0gICAgICB0cHV0cyAodGVybV9jciwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotI2VuZGlmIC8qICFfX01TRE9TX18gKi8KLSAgICAgIF9ybF9sYXN0X2NfcG9zID0gMDsKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pCi0gICAgICBzcGFjZV90b19lb2wgKHNjcmVlbndpZHRoKTsKLSAgICAgIHB1dGMgKCdccicsIHJsX291dHN0cmVhbSk7Ci0jZWxzZQotICAgICAgaWYgKHRlcm1fY2xyZW9sKQotCXRwdXRzICh0ZXJtX2NscmVvbCwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotICAgICAgZWxzZQotCXsKLQkgIHNwYWNlX3RvX2VvbCAoc2NyZWVud2lkdGgpOwotCSAgdHB1dHMgKHRlcm1fY3IsIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLQl9Ci0jZW5kaWYKLSAgICAgIGlmIChfcmxfbGFzdF92X3BvcyA+IDApCi0JX3JsX21vdmVfdmVydCAoMCk7Ci0gICAgfQotICBlbHNlCi0gICAgY3JsZiAoKTsKLQotICAvKiBSZWRyYXcgb25seSB0aGUgbGFzdCBsaW5lIG9mIGEgbXVsdGktbGluZSBwcm9tcHQuICovCi0gIHQgPSBzdHJyY2hyIChybF9kaXNwbGF5X3Byb21wdCwgJ1xuJyk7Ci0gIGlmICh0KQotICAgIHsKLSAgICAgIG9sZHAgPSBybF9kaXNwbGF5X3Byb21wdDsKLSAgICAgIG9sZGwgPSBsb2NhbF9wcm9tcHQ7Ci0gICAgICBvbGRscHJlZml4ID0gbG9jYWxfcHJvbXB0X3ByZWZpeDsKLSAgICAgIHJsX2Rpc3BsYXlfcHJvbXB0ID0gKyt0OwotICAgICAgbG9jYWxfcHJvbXB0ID0gbG9jYWxfcHJvbXB0X3ByZWZpeCA9IChjaGFyICopTlVMTDsKLSAgICAgIHJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSAoKTsKLSAgICAgIHJsX2Rpc3BsYXlfcHJvbXB0ID0gb2xkcDsKLSAgICAgIGxvY2FsX3Byb21wdCA9IG9sZGw7Ci0gICAgICBsb2NhbF9wcm9tcHRfcHJlZml4ID0gb2xkbHByZWZpeDsKLSAgICB9Ci0gIGVsc2UKLSAgICBybF9mb3JjZWRfdXBkYXRlX2Rpc3BsYXkgKCk7Ci19Ci0KLXZvaWQKLV9ybF9jbGVhbl91cF9mb3JfZXhpdCAoKQotewotICBpZiAocmVhZGxpbmVfZWNob2luZ19wKQotICAgIHsKLSAgICAgIF9ybF9tb3ZlX3ZlcnQgKF9ybF92aXNfYm90bGluKTsKLSAgICAgIF9ybF92aXNfYm90bGluID0gMDsKLSAgICAgIGZmbHVzaCAocmxfb3V0c3RyZWFtKTsKLSAgICAgIHJsX3Jlc3RhcnRfb3V0cHV0ICgxLCAwKTsKLSAgICB9Ci19Ci0KLXZvaWQKLV9ybF9lcmFzZV9lbnRpcmVfbGluZSAoKQotewotICBjciAoKTsKLSAgX3JsX2NsZWFyX3RvX2VvbCAoMCk7Ci0gIGNyICgpOwotICBmZmx1c2ggKHJsX291dHN0cmVhbSk7Ci19CmRpZmYgLS1naXQgYS9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nIGIvcmVhZGxpbmUvZG9jL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNmFlNS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotVHVlIEFwciAxOCAxNTo0Mzo1MiAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlYWRsaW5lLjA6IERlbGV0ZS4gIEdlbmVyYXRlZCBieSBNYWtlZmlsZSwgZGVsZXRlZCBieSBkaXN0Y2xlYW4KLSAJcnVsZS4KLQotVHVlIE1hciAyOCAxNjowNjoyMiAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGluYy1oaXN0LnRleGluZm8sIHJsdXNlci50ZXhpbmZvOiBSZXZlcnQgY2hhbmdlIEZyaSBNYXIgMjQKLSAJMTg6MDQ6MzIgMjAwMCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAYjEuY3lnbnVzLmNvbT4uCi0gIAlVbmNvbmRpdGlvbmFsbHkgcHJvdmlkZSBAY2hhcHRlciBhbmQgQG5vZGUuCi0KLUZyaSBNYXIgMjQgMTg6MDQ6MzIgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbmMtaGlzdC50ZXhpbmZvOiBXaGVuIEdEQk4gb21pdCB0aGUgY2hhcHRlci9ub2RlLgotCSogcmx1c2VyLnRleGluZm8gKENvbW1hbmQgTGluZSBFZGl0aW5nKTogRGl0dG8uCi0KLTE5OTktMDgtMTAgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogaHN1c2VyLnRleGluZm8gKEJhc2ggSGlzdG9yeSBCdWlsdGlucyk6IENvbW1lbnQgb3V0IGJ0aW5kZXgKLQljb21tYW5kcy4KLQotCSogaW5jLWhpc3QudGV4aW5mbzogTmV3IGZpbGUuIFNhbWUgYXMgaHN1c2VyLnRleGluZm8sIGJ1dCB3L28KLSAJY3Jvc3MgcmVmZXJlbmNlIHRvIEdOVSBIaXN0b3J5IE1hbnVhbC4KLQkKLVR1ZSBEZWMgMjIgMTA6MDc6NTggMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBoc3VzZXIudGV4aW5mbyAoQmFzaCBIaXN0b3J5IEJ1aWx0aW5zKTogY29tbWVudCBvdXQgYnRpbmRleAotCWNvbW1hbmRzLgotCi0JKiBJbXBvcnQgb2YgUmVhZGxpbmUgMi4yLjEuCi0JCi0JTmV3IGZpbGVzOiByZWFkbGluZS4wLCByZWFkbGluZS4zLCB0ZXhpMmR2aSwgdGV4aTJodG1sLgotCi0xOTk4LTEyLTE3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGluYy1oaXN0LnRleGk6IEBub2RlIGxpbmUgIlVzaW5nIEhpc3RvcnkiIHdhcyB3cm9uZy4KLQotVGh1IEp1bCAgOSAxNzowMzoyNiAxOTk4ICBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+Ci0KLQkqIGluYy1oaXN0LnRleGk6IG9uZSBsaW5lIGNoYW5nZS4KLQotV2VkIFNlcCAyMCAxMjo1NzoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotVHVlIEZlYiAgMiAxMTo0MDowNCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY29uZmlndXJhYmxlIChhbmQgdXNlYWJsZSkgTWFrZWZpbGUgdGVtcGxhdGUKLSAgICAgICAgKiBNYWtlZmlsZTogcmVtb3ZlZCwgcmVwbGFjZWQgd2l0aCBjb25maWd1cmFibGUgTWFrZWZpbGUuaW4KLSAgICAgICAgKiB0ZXhpbmRleC5jIHRleGluZm8udGV4OiByZW1vdmUsIHJlcGxhY2luZyB3L3JlZnMgdG8gdG9vbHMKLQllbHNld2hlcmUgaW4gZGlzdHJpYnV0aW9uIHRyZWUKLSAgICAgICAgKiBjb25maWd1cmUuaW46IHBybyBmb3JtYSBjb25maWd1cmUgc3R1YgotCSogQ2hhbmdlTG9nOiBuZXcgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL01ha2VmaWxlLmluIGIvcmVhZGxpbmUvZG9jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMxNDcyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2RvYy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0jIFRoaXMgbWFrZWZpbGUgZm9yIFJlYWRsaW5lIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBpcyBpbiAtKi0gdGV4dCAtKi0gbW9kZS4KLSMgRW1hY3MgbGlrZXMgaXQgdGhhdCB3YXkuCi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSAuOkBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1pbmZvZGlyID0gQGluZm9kaXJACi0KLW1hbmRpciA9IEBtYW5kaXJACi1tYW4zZGlyID0gJChtYW5kaXIpL21hbjMKLQotU0hFTEwgPSBATUFLRV9TSEVMTEAKLVJNID0gcm0gLWYKLQotVEVYSU5QVVRESVIgPSAkKHNyY2RpcikKLQotTUFLRUlORk8gICAgPSBtYWtlaW5mbwotVEVYSTJEVkkgICAgPSAkKHNyY2RpcikvdGV4aTJkdmkKLVRFWEkySFRNTCAgID0gJChzcmNkaXIpL3RleGkyaHRtbAotUVVJRVRQUyAgICAgPSAjc2V0IHRoaXMgdG8gLXEgdG8gc2h1dCB1cCBkdmlwcwotRFZJUFMgICAgICAgPSBkdmlwcyAtRCAzMDAgJChRVUlFVFBTKSAtbyAkQCAgICAgIyB0cmlja3kKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLVJMU1JDID0gJChzcmNkaXIpL3JsbWFuLnRleGluZm8gJChzcmNkaXIpL3JsdXNlci50ZXhpbmZvIFwKLQkkKHNyY2Rpcikvcmx0ZWNoLnRleGluZm8gJChzcmNkaXIpL21hbnZlcnMudGV4aW5mbwotSElTVFNSQyA9ICQoc3JjZGlyKS9oaXN0LnRleGluZm8gJChzcmNkaXIpL2hzdXNlci50ZXhpbmZvIFwKLQkgICQoc3JjZGlyKS9oc3RlY2gudGV4aW5mbyAkKHNyY2RpcikvbWFudmVycy50ZXhpbmZvCi0KLSMgVGhpcyBzaG91bGQgYmUgYSBwcm9ncmFtIHRoYXQgY29udmVydHMgdHJvZmYgdG8gYW4gYXNjaWktcmVhZGFibGUgZm9ybWF0Ci1OUk9GRiAgICAgICA9IGdyb2ZmIC1UYXNjaWkKLQotIyBUaGlzIHNob3VsZCBiZSBhIHByb2dyYW0gdGhhdCBjb252ZXJ0cyB0cm9mZiB0byBwb3N0c2NyaXB0Ci1HUk9GRiAgICAgICA9IGdyb2ZmCi0KLURWSU9CSiA9IHJlYWRsaW5lLmR2aSBoaXN0b3J5LmR2aQotSU5GT09CSiA9IHJlYWRsaW5lLmluZm8gaGlzdG9yeS5pbmZvCi1QU09CSiA9IHJlYWRsaW5lLnBzIGhpc3RvcnkucHMKLUhUTUxPQkogPSByZWFkbGluZS5odG1sIGhpc3RvcnkuaHRtbAotSFRNTFRPQyA9IHJlYWRsaW5lX3RvYy5odG1sIGhpc3RvcnlfdG9jLmh0bWwKLVRFWFRPQkogPSByZWFkbGluZS4wCi0KLUlOVEVSTUVESUFURV9PQkogPSBybG1hbi5kdmkgaGlzdC5kdmkKLQotQ1JFQVRFRF9ET0NTID0gJChEVklPQkopICQoSU5GT09CSikgJChQU09CSikgJChIVE1MT0JKKSAkKEhUTUxUT0MpICQoVEVYVE9CSikKLQotLlNVRkZJWEVTOiAgICAgIC4wIC4zIC5wcyAudHh0IC5kdmkKLQotLjMuMDoKLQkkKFJNKSAkQAotCS0ke05ST0ZGfSAtbWFuICQ8ID4gJEAKLQotYWxsOiBpbmZvIGR2aSBodG1sIHBzIHRleHQKLW5vZHZpOiBpbmZvIGh0bWwgdGV4dAotCi1yZWFkbGluZS5kdmk6ICQoUkxTUkMpCi0JVEVYSU5QVVRTPS46JChURVhJTlBVVERJUik6JCRURVhJTlBVVFMgJChURVhJMkRWSSkgJChzcmNkaXIpL3JsbWFuLnRleGluZm8KLQltdiBybG1hbi5kdmkgcmVhZGxpbmUuZHZpCi0KLXJlYWRsaW5lLmluZm86ICQoUkxTUkMpCi0JJChNQUtFSU5GTykgLS1uby1zcGxpdCAtSSAkKFRFWElOUFVURElSKSAtbyAkQCAkKHNyY2RpcikvcmxtYW4udGV4aW5mbwotCi1oaXN0b3J5LmR2aTogJHtISVNUU1JDfQotCVRFWElOUFVUUz0uOiQoVEVYSU5QVVRESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9oaXN0LnRleGluZm8KLQltdiBoaXN0LmR2aSBoaXN0b3J5LmR2aQotCi1oaXN0b3J5LmluZm86ICR7SElTVFNSQ30KLQkkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC1JICQoVEVYSU5QVVRESVIpIC1vICRAICQoc3JjZGlyKS9oaXN0LnRleGluZm8KLQotcmVhZGxpbmUucHM6CXJlYWRsaW5lLmR2aQotCSQoUk0pICRACi0JJChEVklQUykgcmVhZGxpbmUuZHZpCi0KLWhpc3RvcnkucHM6CWhpc3RvcnkuZHZpCi0JJChSTSkgJEAKLQkkKERWSVBTKSBoaXN0b3J5LmR2aQotCi1yZWFkbGluZS5odG1sOgkke1JMU1JDfQotCSQoVEVYSTJIVE1MKSAtbWVudSAtbW9ub2xpdGhpYyAtSSAkKFRFWElOUFVURElSKSAkKHNyY2RpcikvcmxtYW4udGV4aW5mbwotCXNlZCAtZSAnczpybG1hbi5odG1sOnJlYWRsaW5lLmh0bWw6JyBybG1hbi5odG1sID4gcmVhZGxpbmUuaHRtbAotCSQoUk0pIHJsbWFuLmh0bWwKLQotaGlzdG9yeS5odG1sOgkke0hJU1RTUkN9Ci0JJChURVhJMkhUTUwpIC1tZW51IC1tb25vbGl0aGljIC1JICQoVEVYSU5QVVRESVIpICQoc3JjZGlyKS9oaXN0LnRleGluZm8KLQlzZWQgLWUgJ3M6aGlzdC5odG1sOmhpc3RvcnkuaHRtbDonIGhpc3QuaHRtbCA+IGhpc3RvcnkuaHRtbAotCSQoUk0pIGhpc3QuaHRtbAotCi1pbmZvOgkkKElORk9PQkopCi1kdmk6CSQoRFZJT0JKKQotcHM6CSQoUFNPQkopCi1odG1sOgkkKEhUTUxPQkopCi10ZXh0OgkkKFRFWFRPQkopCi0KLXJlYWRsaW5lLjA6IHJlYWRsaW5lLjMKLQotY2xlYW46Ci0JJChSTSkgKi5hdXggKi5jcCAqLmZuICoua3kgKi5sb2cgKi5wZyAqLnRvYyAqLnRwICoudnIgKi5jcHMgKi5wZ3MgXAotCSAgICAgICouZm5zICoua3lzICoudHBzICoudnJzICoubyBjb3JlCi0KLWRpc3RjbGVhbjogY2xlYW4KLQkkKFJNKSAkKENSRUFURURfRE9DUykKLQkkKFJNKSAkKElOVEVSTUVESUFURV9PQkopCi0JJChSTSkgTWFrZWZpbGUKLQotbW9zdGx5Y2xlYW46IGNsZWFuCi0KLW1haW50YWluZXItY2xlYW46IGNsZWFuCi0JJChSTSkgJChDUkVBVEVEX0RPQ1MpCi0JJChSTSkgJChJTlRFUk1FRElBVEVfT0JKKQotCSQoUk0pIE1ha2VmaWxlCi0KLWluc3RhbGxkaXJzOgkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvbWtkaXJzCi0JLSQoU0hFTEwpICQodG9wX3NyY2Rpcikvc3VwcG9ydC9ta2RpcnMgJChpbmZvZGlyKSAkKG1hbjNkaXIpCi0KLWluc3RhbGw6CWluc3RhbGxkaXJzCi0JaWYgdGVzdCAtZiByZWFkbGluZS5pbmZvOyB0aGVuIFwKLQkJJHtJTlNUQUxMX0RBVEF9IHJlYWRsaW5lLmluZm8gJChpbmZvZGlyKS9yZWFkbGluZS5pbmZvOyBcCi0JZWxzZSBcCi0JCSR7SU5TVEFMTF9EQVRBfSAkKHNyY2RpcikvcmVhZGxpbmUuaW5mbyAkKGluZm9kaXIpL3JlYWRsaW5lLmluZm87IFwKLQlmaQotCWlmIHRlc3QgLWYgaGlzdG9yeS5pbmZvOyB0aGVuIFwKLQkJJHtJTlNUQUxMX0RBVEF9IGhpc3RvcnkuaW5mbyAkKGluZm9kaXIpL2hpc3RvcnkuaW5mbzsgXAotCWVsc2UgXAotCQkke0lOU1RBTExfREFUQX0gJChzcmNkaXIpL2hpc3RvcnkuaW5mbyAkKGluZm9kaXIpL2hpc3RvcnkuaW5mbzsgXAotCWZpCi0JaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JCWluc3RhbGwtaW5mbyAtLWRpci1maWxlPSQoaW5mb2RpcikvZGlyICQoaW5mb2RpcikvcmVhZGxpbmUuaW5mbyA7IFwKLQkJaW5zdGFsbC1pbmZvIC0tZGlyLWZpbGU9JChpbmZvZGlyKS9kaXIgJChpbmZvZGlyKS9oaXN0b3J5LmluZm8gOyBcCi0JZWxzZSB0cnVlOyBmaQotCS0ke0lOU1RBTExfREFUQX0gJChzcmNkaXIpL3JlYWRsaW5lLjMgJChtYW4zZGlyKS9yZWFkbGluZS4zCi0KLXVuaW5zdGFsbDoKLQkkKFJNKSAkKGluZm9kaXIpL3JlYWRsaW5lLmluZm8KLQkkKFJNKSAkKGluZm9kaXIpL2hpc3RvcnkuaW5mbwotCSQoUk0pICQobWFuM2RpcikvcmVhZGxpbmUuMwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL2hpc3QudGV4aW5mbyBiL3JlYWRsaW5lL2RvYy9oaXN0LnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTBiYTAuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZG9jL2hpc3QudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICBAYyAtKi10ZXhpbmZvLSotCi1AYyAlKipzdGFydCBvZiBoZWFkZXIgKFRoaXMgaXMgZm9yIHJ1bm5pbmcgVGV4aW5mbyBvbiBhIHJlZ2lvbi4pCi1Ac2V0ZmlsZW5hbWUgaGlzdG9yeS5pbmZvCi1Ac2V0dGl0bGUgR05VIEhpc3RvcnkgTGlicmFyeQotQGMgJSoqZW5kIG9mIGhlYWRlciAoVGhpcyBpcyBmb3IgcnVubmluZyBUZXhpbmZvIG9uIGEgcmVnaW9uLikKLQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotCi1AaW5jbHVkZSBtYW52ZXJzLnRleGluZm8KLQotQGlmaW5mbwotQGRpcmNhdGVnb3J5IExpYnJhcmllcwotQGRpcmVudHJ5Ci0qIEhpc3Rvcnk6IChoaXN0b3J5KS4gICAgICAgVGhlIEdOVSBoaXN0b3J5IGxpYnJhcnkgQVBJCi1AZW5kIGRpcmVudHJ5Ci0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5LCBhIHByb2dyYW1taW5nIHRvb2wgdGhhdAotcHJvdmlkZXMgYSBjb25zaXN0ZW50IHVzZXIgaW50ZXJmYWNlIGZvciByZWNhbGxpbmcgbGluZXMgb2YgcHJldmlvdXNseQotdHlwZWQgaW5wdXQuCi0KLUNvcHlyaWdodCAoQykgMTk4OC0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1wYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIEdOVSBIaXN0b3J5IExpYnJhcnkKLUBzdWJ0aXRsZSBFZGl0aW9uIEB2YWx1ZXtFRElUSU9OfSwgZm9yIEBjb2Rle0hpc3RvcnkgTGlicmFyeX0gVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi1Ac3VidGl0bGUgQHZhbHVle1VQREFURS1NT05USH0KLUBhdXRob3IgQnJpYW4gRm94LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLUBhdXRob3IgQ2hldCBSYW1leSwgQ2FzZSBXZXN0ZXJuIFJlc2VydmUgVW5pdmVyc2l0eQotCi1AcGFnZQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBIaXN0b3J5IGxpYnJhcnksIGEgcHJvZ3JhbW1pbmcgdG9vbCB0aGF0Ci1wcm92aWRlcyBhIGNvbnNpc3RlbnQgdXNlciBpbnRlcmZhY2UgZm9yIHJlY2FsbGluZyBsaW5lcyBvZiBwcmV2aW91c2x5Ci10eXBlZCBpbnB1dC4KLQotUHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gQCoKLTY3NSBNYXNzYWNodXNldHRzIEF2ZW51ZSwgQCoKLUNhbWJyaWRnZSwgTUEgMDIxMzkgVVNBCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5ODgtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBHTlUgSGlzdG9yeSBMaWJyYXJ5Ci0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5LCBhIHByb2dyYW1taW5nIHRvb2wgdGhhdAotcHJvdmlkZXMgYSBjb25zaXN0ZW50IHVzZXIgaW50ZXJmYWNlIGZvciByZWNhbGxpbmcgbGluZXMgb2YgcHJldmlvdXNseQotdHlwZWQgaW5wdXQuCi0KLUBtZW51Ci0qIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseTo6CSAgR05VIEhpc3RvcnkgVXNlcidzIE1hbnVhbC4KLSogUHJvZ3JhbW1pbmcgd2l0aCBHTlUgSGlzdG9yeTo6ICBHTlUgSGlzdG9yeSBQcm9ncmFtbWVyJ3MgTWFudWFsLgotKiBDb25jZXB0IEluZGV4OjoJCSAgSW5kZXggb2YgY29uY2VwdHMgZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsLgotKiBGdW5jdGlvbiBhbmQgVmFyaWFibGUgSW5kZXg6OgkgIEluZGV4IG9mIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMKLQkJCQkgIGFuZCB2YXJpYWJsZXMuCi1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBzeW5jb2RlaW5kZXggZm4gdnIKLQotQGluY2x1ZGUgaHN1c2VyLnRleGluZm8KLUBpbmNsdWRlIGhzdGVjaC50ZXhpbmZvCi0KLUBub2RlIENvbmNlcHQgSW5kZXgKLUBhcHBlbmRpeCBDb25jZXB0IEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1Abm9kZSBGdW5jdGlvbiBhbmQgVmFyaWFibGUgSW5kZXgKLUBhcHBlbmRpeCBGdW5jdGlvbiBhbmQgVmFyaWFibGUgSW5kZXgKLUBwcmludGluZGV4IHZyCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL2hzdGVjaC50ZXhpbmZvIGIvcmVhZGxpbmUvZG9jL2hzdGVjaC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDEwMDkwLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2RvYy9oc3RlY2gudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi1AaWdub3JlCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgR05VIEhpc3RvcnkgbGlicmFyeS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkxLCAxOTk0LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQXV0aG9yZWQgYnkgQnJpYW4gRm94IGFuZCBDaGV0IFJhbWV5LgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBtYW51YWwKLXByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFyZSBwcmVzZXJ2ZWQgb24KLWFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbiBub3RpY2UKLWlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoICh0aGlzCi1wYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0IHRoZQotR05VIENvcHlyaWdodCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIHRvIHRoZSBkaXN0cmlidXRlZSwgYW5kIHByb3ZpZGVkIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgUHJvZ3JhbW1pbmcgd2l0aCBHTlUgSGlzdG9yeQotQGNoYXB0ZXIgUHJvZ3JhbW1pbmcgd2l0aCBHTlUgSGlzdG9yeQotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byBpbnRlcmZhY2UgcHJvZ3JhbXMgdGhhdCB5b3Ugd3JpdGUKLXdpdGggdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkuCi1JdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHRlY2huaWNhbCBndWlkZS4KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgaW50ZXJhY3RpdmUgdXNlIG9mIEdOVSBIaXN0b3J5LCBAcHhyZWZ7VXNpbmcKLUhpc3RvcnkgSW50ZXJhY3RpdmVseX0uCi0KLUBtZW51Ci0qIEludHJvZHVjdGlvbiB0byBIaXN0b3J5OjoJV2hhdCBpcyB0aGUgR05VIEhpc3RvcnkgbGlicmFyeSBmb3I/Ci0qIEhpc3RvcnkgU3RvcmFnZTo6CQlIb3cgaW5mb3JtYXRpb24gaXMgc3RvcmVkLgotKiBIaXN0b3J5IEZ1bmN0aW9uczo6CQlGdW5jdGlvbnMgdGhhdCB5b3UgY2FuIHVzZS4KLSogSGlzdG9yeSBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIHRoYXQgY29udHJvbCBiZWhhdmlvdXIuCi0qIEhpc3RvcnkgUHJvZ3JhbW1pbmcgRXhhbXBsZTo6CUV4YW1wbGUgb2YgdXNpbmcgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkuCi1AZW5kIG1lbnUKLQotQG5vZGUgSW50cm9kdWN0aW9uIHRvIEhpc3RvcnkKLUBzZWN0aW9uIEludHJvZHVjdGlvbiB0byBIaXN0b3J5Ci0KLU1hbnkgcHJvZ3JhbXMgcmVhZCBpbnB1dCBmcm9tIHRoZSB1c2VyIGEgbGluZSBhdCBhIHRpbWUuICBUaGUgR05VIEhpc3RvcnkKLWxpYnJhcnkgaXMgYWJsZSB0byBrZWVwIHRyYWNrIG9mIHRob3NlIGxpbmVzLCBhc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aAotZWFjaCBsaW5lLCBhbmQgdXRpbGl6ZSBpbmZvcm1hdGlvbiBmcm9tIHByZXZpb3VzIGxpbmVzIGluIGNvbXBvc2luZyBuZXcKLW9uZXMuCi0KLVRoZSBwcm9ncmFtbWVyIHVzaW5nIHRoZSBIaXN0b3J5IGxpYnJhcnkgaGFzIGF2YWlsYWJsZSBmdW5jdGlvbnMKLWZvciByZW1lbWJlcmluZyBsaW5lcyBvbiBhIGhpc3RvcnkgbGlzdCwgYXNzb2NpYXRpbmcgYXJiaXRyYXJ5IGRhdGEKLXdpdGggYSBsaW5lLCByZW1vdmluZyBsaW5lcyBmcm9tIHRoZSBsaXN0LCBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgbGlzdAotZm9yIGEgbGluZSBjb250YWluaW5nIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZywgYW5kIHJlZmVyZW5jaW5nIGFueSBsaW5lCi1pbiB0aGUgbGlzdCBkaXJlY3RseS4gIEluIGFkZGl0aW9uLCBhIGhpc3RvcnkgQGRmbntleHBhbnNpb259IGZ1bmN0aW9uCi1pcyBhdmFpbGFibGUgd2hpY2ggcHJvdmlkZXMgZm9yIGEgY29uc2lzdGVudCB1c2VyIGludGVyZmFjZSBhY3Jvc3MKLWRpZmZlcmVudCBwcm9ncmFtcy4KLQotVGhlIHVzZXIgdXNpbmcgcHJvZ3JhbXMgd3JpdHRlbiB3aXRoIHRoZSBIaXN0b3J5IGxpYnJhcnkgaGFzIHRoZQotYmVuZWZpdCBvZiBhIGNvbnNpc3RlbnQgdXNlciBpbnRlcmZhY2Ugd2l0aCBhIHNldCBvZiB3ZWxsLWtub3duCi1jb21tYW5kcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSB0ZXh0IG9mIHByZXZpb3VzIGxpbmVzIGFuZCB1c2luZyB0aGF0IHRleHQKLWluIG5ldyBjb21tYW5kcy4gIFRoZSBiYXNpYyBoaXN0b3J5IG1hbmlwdWxhdGlvbiBjb21tYW5kcyBhcmUgc2ltaWxhciB0bwotdGhlIGhpc3Rvcnkgc3Vic3RpdHV0aW9uIHByb3ZpZGVkIGJ5IEBjb2Rle2NzaH0uCi0KLUlmIHRoZSBwcm9ncmFtbWVyIGRlc2lyZXMsIGhlIGNhbiB1c2UgdGhlIFJlYWRsaW5lIGxpYnJhcnksIHdoaWNoCi1pbmNsdWRlcyBzb21lIGhpc3RvcnkgbWFuaXB1bGF0aW9uIGJ5IGRlZmF1bHQsIGFuZCBoYXMgdGhlIGFkZGVkCi1hZHZhbnRhZ2Ugb2YgY29tbWFuZCBsaW5lIGVkaXRpbmcuCi0KLUBub2RlIEhpc3RvcnkgU3RvcmFnZQotQHNlY3Rpb24gSGlzdG9yeSBTdG9yYWdlCi0KLVRoZSBoaXN0b3J5IGxpc3QgaXMgYW4gYXJyYXkgb2YgaGlzdG9yeSBlbnRyaWVzLiAgQSBoaXN0b3J5IGVudHJ5IGlzCi1kZWNsYXJlZCBhcyBmb2xsb3dzOgotCi1AZXhhbXBsZQotdHlwZWRlZiBzdHJ1Y3QgX2hpc3RfZW50cnkgQHsKLSAgY2hhciAqbGluZTsKLSAgY2hhciAqZGF0YTsKLUB9IEhJU1RfRU5UUlk7Ci1AZW5kIGV4YW1wbGUKLQotVGhlIGhpc3RvcnkgbGlzdCBpdHNlbGYgbWlnaHQgdGhlcmVmb3JlIGJlIGRlY2xhcmVkIGFzCi0KLUBleGFtcGxlCi1ISVNUX0VOVFJZICoqdGhlX2hpc3RvcnlfbGlzdDsKLUBlbmQgZXhhbXBsZQotCi1UaGUgc3RhdGUgb2YgdGhlIEhpc3RvcnkgbGlicmFyeSBpcyBlbmNhcHN1bGF0ZWQgaW50byBhIHNpbmdsZSBzdHJ1Y3R1cmU6Ci0KLUBleGFtcGxlCi0vKiBBIHN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGhpc3Rvcnkgc3R1ZmYgYXJvdW5kLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2hpc3Rfc3RhdGUgQHsKLSAgSElTVF9FTlRSWSAqKmVudHJpZXM7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZW50cmllcyB0aGVtc2VsdmVzLiAqLwotICBpbnQgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAvKiBUaGUgbG9jYXRpb24gcG9pbnRlciB3aXRoaW4gdGhpcyBhcnJheS4gKi8KLSAgaW50IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiB0aGlzIGFycmF5LiAqLwotICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2xvdHMgYWxsb2NhdGVkIHRvIHRoaXMgYXJyYXkuICovCi0gIGludCBmbGFnczsKLUB9IEhJU1RPUllfU1RBVEU7Ci1AZW5kIGV4YW1wbGUKLQotSWYgdGhlIGZsYWdzIG1lbWJlciBpbmNsdWRlcyBAY29kZXtIU19TVElGTEVEfSwgdGhlIGhpc3RvcnkgaGFzIGJlZW4KLXN0aWZsZWQuCi0KLUBub2RlIEhpc3RvcnkgRnVuY3Rpb25zCi1Ac2VjdGlvbiBIaXN0b3J5IEZ1bmN0aW9ucwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBjYWxsaW5nIHNlcXVlbmNlIGZvciB0aGUgdmFyaW91cyBmdW5jdGlvbnMKLXByZXNlbnQgaW4gR05VIEhpc3RvcnkuCi0KLUBtZW51Ci0qIEluaXRpYWxpemluZyBIaXN0b3J5IGFuZCBTdGF0ZSBNYW5hZ2VtZW50OjoJRnVuY3Rpb25zIHRvIGNhbGwgd2hlbiB5b3UKLQkJCQkJCXdhbnQgdG8gdXNlIGhpc3RvcnkgaW4gYQotCQkJCQkJcHJvZ3JhbS4KLSogSGlzdG9yeSBMaXN0IE1hbmFnZW1lbnQ6OgkJRnVuY3Rpb25zIHVzZWQgdG8gbWFuYWdlIHRoZSBsaXN0Ci0JCQkJCW9mIGhpc3RvcnkgZW50cmllcy4KLSogSW5mb3JtYXRpb24gQWJvdXQgdGhlIEhpc3RvcnkgTGlzdDo6CUZ1bmN0aW9ucyByZXR1cm5pbmcgaW5mb3JtYXRpb24gYWJvdXQKLQkJCQkJdGhlIGhpc3RvcnkgbGlzdC4KLSogTW92aW5nIEFyb3VuZCB0aGUgSGlzdG9yeSBMaXN0OjoJRnVuY3Rpb25zIHVzZWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbgotCQkJCQlpbiB0aGUgaGlzdG9yeSBsaXN0LgotKiBTZWFyY2hpbmcgdGhlIEhpc3RvcnkgTGlzdDo6CQlGdW5jdGlvbnMgdG8gc2VhcmNoIHRoZSBoaXN0b3J5IGxpc3QKLQkJCQkJZm9yIGVudHJpZXMgY29udGFpbmluZyBhIHN0cmluZy4KLSogTWFuYWdpbmcgdGhlIEhpc3RvcnkgRmlsZTo6CQlGdW5jdGlvbnMgdGhhdCByZWFkIGFuZCB3cml0ZSBhIGZpbGUKLQkJCQkJY29udGFpbmluZyB0aGUgaGlzdG9yeSBsaXN0LgotKiBIaXN0b3J5IEV4cGFuc2lvbjo6CQkJRnVuY3Rpb25zIHRvIHBlcmZvcm0gY3NoLWxpa2UgaGlzdG9yeQotCQkJCQlleHBhbnNpb24uCi1AZW5kIG1lbnUKLQotQG5vZGUgSW5pdGlhbGl6aW5nIEhpc3RvcnkgYW5kIFN0YXRlIE1hbmFnZW1lbnQKLUBzdWJzZWN0aW9uIEluaXRpYWxpemluZyBIaXN0b3J5IGFuZCBTdGF0ZSBNYW5hZ2VtZW50Ci0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgbWFuYWdlCi10aGUgc3RhdGUgb2YgdGhlIEhpc3RvcnkgbGlicmFyeSB3aGVuIHlvdSB3YW50IHRvIHVzZSB0aGUgaGlzdG9yeQotZnVuY3Rpb25zIGluIHlvdXIgcHJvZ3JhbS4KLQotQGRlZnR5cGVmdW4gdm9pZCB1c2luZ19oaXN0b3J5ICgpCi1CZWdpbiBhIHNlc3Npb24gaW4gd2hpY2ggdGhlIGhpc3RvcnkgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQuICBUaGlzCi1pbml0aWFsaXplcyB0aGUgaW50ZXJhY3RpdmUgdmFyaWFibGVzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtISVNUT1JZX1NUQVRFICp9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUgKCkKLVJldHVybiBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnB1dCBoaXN0b3J5LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHZvaWQgaGlzdG9yeV9zZXRfaGlzdG9yeV9zdGF0ZSAoSElTVE9SWV9TVEFURSAqc3RhdGUpCi1TZXQgdGhlIHN0YXRlIG9mIHRoZSBoaXN0b3J5IGxpc3QgYWNjb3JkaW5nIHRvIEB2YXJ7c3RhdGV9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIEhpc3RvcnkgTGlzdCBNYW5hZ2VtZW50Ci1Ac3Vic2VjdGlvbiBIaXN0b3J5IExpc3QgTWFuYWdlbWVudAotCi1UaGVzZSBmdW5jdGlvbnMgbWFuYWdlIGluZGl2aWR1YWwgZW50cmllcyBvbiB0aGUgaGlzdG9yeSBsaXN0LCBvciBzZXQKLXBhcmFtZXRlcnMgbWFuYWdpbmcgdGhlIGxpc3QgaXRzZWxmLgotCi1AZGVmdHlwZWZ1biB2b2lkIGFkZF9oaXN0b3J5IChjaGFyICpzdHJpbmcpCi1QbGFjZSBAdmFye3N0cmluZ30gYXQgdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsaXN0LiAgVGhlIGFzc29jaWF0ZWQgZGF0YQotZmllbGQgKGlmIGFueSkgaXMgc2V0IHRvIEBjb2Rle05VTEx9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtISVNUX0VOVFJZICp9IHJlbW92ZV9oaXN0b3J5IChpbnQgd2hpY2gpCi1SZW1vdmUgaGlzdG9yeSBlbnRyeSBhdCBvZmZzZXQgQHZhcnt3aGljaH0gZnJvbSB0aGUgaGlzdG9yeS4gIFRoZQotcmVtb3ZlZCBlbGVtZW50IGlzIHJldHVybmVkIHNvIHlvdSBjYW4gZnJlZSB0aGUgbGluZSwgZGF0YSwKLWFuZCBjb250YWluaW5nIHN0cnVjdHVyZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB7SElTVF9FTlRSWSAqfSByZXBsYWNlX2hpc3RvcnlfZW50cnkgKGludCB3aGljaCwgY2hhciAqbGluZSwgY2hhciAqZGF0YSkKLU1ha2UgdGhlIGhpc3RvcnkgZW50cnkgYXQgb2Zmc2V0IEB2YXJ7d2hpY2h9IGhhdmUgQHZhcntsaW5lfSBhbmQgQHZhcntkYXRhfS4KLVRoaXMgcmV0dXJucyB0aGUgb2xkIGVudHJ5IHNvIHlvdSBjYW4gZGlzcG9zZSBvZiB0aGUgZGF0YS4gIEluIHRoZSBjYXNlCi1vZiBhbiBpbnZhbGlkIEB2YXJ7d2hpY2h9LCBhIEBjb2Rle05VTEx9IHBvaW50ZXIgaXMgcmV0dXJuZWQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gdm9pZCBjbGVhcl9oaXN0b3J5ICgpCi1DbGVhciB0aGUgaGlzdG9yeSBsaXN0IGJ5IGRlbGV0aW5nIGFsbCB0aGUgZW50cmllcy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHN0aWZsZV9oaXN0b3J5IChpbnQgbWF4KQotU3RpZmxlIHRoZSBoaXN0b3J5IGxpc3QsIHJlbWVtYmVyaW5nIG9ubHkgdGhlIGxhc3QgQHZhcnttYXh9IGVudHJpZXMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHVuc3RpZmxlX2hpc3RvcnkgKCkKLVN0b3Agc3RpZmxpbmcgdGhlIGhpc3RvcnkuICBUaGlzIHJldHVybnMgdGhlIHByZXZpb3VzIGFtb3VudCB0aGUKLWhpc3Rvcnkgd2FzIHN0aWZsZWQuICBUaGUgdmFsdWUgaXMgcG9zaXRpdmUgaWYgdGhlIGhpc3Rvcnkgd2FzCi1zdGlmbGVkLCBuZWdhdGl2ZSBpZiBpdCB3YXNuJ3QuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfaXNfc3RpZmxlZCAoKQotUmV0dXJucyBub24temVybyBpZiB0aGUgaGlzdG9yeSBpcyBzdGlmbGVkLCB6ZXJvIGlmIGl0IGlzIG5vdC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBJbmZvcm1hdGlvbiBBYm91dCB0aGUgSGlzdG9yeSBMaXN0Ci1Ac3Vic2VjdGlvbiBJbmZvcm1hdGlvbiBBYm91dCB0aGUgSGlzdG9yeSBMaXN0Ci0KLVRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVudGlyZSBoaXN0b3J5IGxpc3Qgb3IKLWluZGl2aWR1YWwgbGlzdCBlbnRyaWVzLgotCi1AZGVmdHlwZWZ1biB7SElTVF9FTlRSWSAqKn0gaGlzdG9yeV9saXN0ICgpCi1SZXR1cm4gYSBAY29kZXtOVUxMfSB0ZXJtaW5hdGVkIGFycmF5IG9mIEBjb2Rle0hJU1RfRU5UUll9IHdoaWNoIGlzIHRoZQotY3VycmVudCBpbnB1dCBoaXN0b3J5LiAgRWxlbWVudCAwIG9mIHRoaXMgbGlzdCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRpbWUuCi1JZiB0aGVyZSBpcyBubyBoaXN0b3J5LCByZXR1cm4gQGNvZGV7TlVMTH0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHdoZXJlX2hpc3RvcnkgKCkKLVJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCBoaXN0b3J5IGVsZW1lbnQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKn0gY3VycmVudF9oaXN0b3J5ICgpCi1SZXR1cm4gdGhlIGhpc3RvcnkgZW50cnkgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFzIGRldGVybWluZWQgYnkKLUBjb2Rle3doZXJlX2hpc3RvcnkgKCl9LiAgSWYgdGhlcmUgaXMgbm8gZW50cnkgdGhlcmUsIHJldHVybiBhIEBjb2Rle05VTEx9Ci1wb2ludGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtISVNUX0VOVFJZICp9IGhpc3RvcnlfZ2V0IChpbnQgb2Zmc2V0KQotUmV0dXJuIHRoZSBoaXN0b3J5IGVudHJ5IGF0IHBvc2l0aW9uIEB2YXJ7b2Zmc2V0fSwgc3RhcnRpbmcgZnJvbQotQGNvZGV7aGlzdG9yeV9iYXNlfS4gIElmIHRoZXJlIGlzIG5vIGVudHJ5IHRoZXJlLCBvciBpZiBAdmFye29mZnNldH0KLWlzIGdyZWF0ZXIgdGhhbiB0aGUgaGlzdG9yeSBsZW5ndGgsIHJldHVybiBhIEBjb2Rle05VTEx9IHBvaW50ZXIuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfdG90YWxfYnl0ZXMgKCkKLVJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHByaW1hcnkgaGlzdG9yeSBlbnRyaWVzIGFyZSB1c2luZy4KLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgbGluZXMgaW4gdGhlCi1oaXN0b3J5LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIE1vdmluZyBBcm91bmQgdGhlIEhpc3RvcnkgTGlzdAotQHN1YnNlY3Rpb24gTW92aW5nIEFyb3VuZCB0aGUgSGlzdG9yeSBMaXN0Ci0KLVRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB0aGUgY3VycmVudCBpbmRleCBpbnRvIHRoZSBoaXN0b3J5IGxpc3QgdG8gYmUKLXNldCBvciBjaGFuZ2VkLgotCi1AZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZXRfcG9zIChpbnQgcG9zKQotU2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeSBsaXN0IHRvIEB2YXJ7cG9zfSwgYW4gYWJzb2x1dGUgaW5kZXgKLWludG8gdGhlIGxpc3QuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKn0gcHJldmlvdXNfaGlzdG9yeSAoKQotQmFjayB1cCB0aGUgY3VycmVudCBoaXN0b3J5IG9mZnNldCB0byB0aGUgcHJldmlvdXMgaGlzdG9yeSBlbnRyeSwgYW5kCi1yZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQgZW50cnkuICBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBlbnRyeSwgcmV0dXJuCi1hIEBjb2Rle05VTEx9IHBvaW50ZXIuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge0hJU1RfRU5UUlkgKn0gbmV4dF9oaXN0b3J5ICgpCi1Nb3ZlIHRoZSBjdXJyZW50IGhpc3Rvcnkgb2Zmc2V0IGZvcndhcmQgdG8gdGhlIG5leHQgaGlzdG9yeSBlbnRyeSwgYW5kCi1yZXR1cm4gdGhlIGEgcG9pbnRlciB0byB0aGF0IGVudHJ5LiAgSWYgdGhlcmUgaXMgbm8gbmV4dCBlbnRyeSwgcmV0dXJuCi1hIEBjb2Rle05VTEx9IHBvaW50ZXIuCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgU2VhcmNoaW5nIHRoZSBIaXN0b3J5IExpc3QKLUBzdWJzZWN0aW9uIFNlYXJjaGluZyB0aGUgSGlzdG9yeSBMaXN0Ci1AY2luZGV4IEhpc3RvcnkgU2VhcmNoaW5nCi0KLVRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBzZWFyY2hpbmcgb2YgdGhlIGhpc3RvcnkgbGlzdCBmb3IgZW50cmllcyBjb250YWluaW5nCi1hIHNwZWNpZmljIHN0cmluZy4gIFNlYXJjaGluZyBtYXkgYmUgcGVyZm9ybWVkIGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmQKLWZyb20gdGhlIGN1cnJlbnQgaGlzdG9yeSBwb3NpdGlvbi4gIFRoZSBzZWFyY2ggbWF5IGJlIEBkZm57YW5jaG9yZWR9LAotbWVhbmluZyB0aGF0IHRoZSBzdHJpbmcgbXVzdCBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoaXN0b3J5IGVudHJ5LgotQGNpbmRleCBhbmNob3JlZCBzZWFyY2gKLQotQGRlZnR5cGVmdW4gaW50IGhpc3Rvcnlfc2VhcmNoIChjaGFyICpzdHJpbmcsIGludCBkaXJlY3Rpb24pCi1TZWFyY2ggdGhlIGhpc3RvcnkgZm9yIEB2YXJ7c3RyaW5nfSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgaGlzdG9yeQotb2Zmc2V0LiAgSWYgQHZhcntkaXJlY3Rpb259IDwgMCwgdGhlbiB0aGUgc2VhcmNoIGlzIHRocm91Z2ggcHJldmlvdXMgZW50cmllcywKLWVsc2UgdGhyb3VnaCBzdWJzZXF1ZW50LiAgSWYgQHZhcntzdHJpbmd9IGlzIGZvdW5kLCB0aGVuCi10aGUgY3VycmVudCBoaXN0b3J5IGluZGV4IGlzIHNldCB0byB0aGF0IGhpc3RvcnkgZW50cnksIGFuZCB0aGUgdmFsdWUKLXJldHVybmVkIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUgb2YgdGhlIGVudHJ5IHdoZXJlCi1AdmFye3N0cmluZ30gd2FzIGZvdW5kLiAgT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGNoYW5nZWQsIGFuZCBhIC0xIGlzCi1yZXR1cm5lZC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZWFyY2hfcHJlZml4IChjaGFyICpzdHJpbmcsIGludCBkaXJlY3Rpb24pCi1TZWFyY2ggdGhlIGhpc3RvcnkgZm9yIEB2YXJ7c3RyaW5nfSwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgaGlzdG9yeQotb2Zmc2V0LiAgVGhlIHNlYXJjaCBpcyBhbmNob3JlZDogbWF0Y2hpbmcgbGluZXMgbXVzdCBiZWdpbiB3aXRoCi1AdmFye3N0cmluZ30uICBJZiBAdmFye2RpcmVjdGlvbn0gPCAwLCB0aGVuIHRoZSBzZWFyY2ggaXMgdGhyb3VnaCBwcmV2aW91cwotZW50cmllcywgZWxzZSB0aHJvdWdoIHN1YnNlcXVlbnQuICBJZiBAdmFye3N0cmluZ30gaXMgZm91bmQsIHRoZW4gdGhlCi1jdXJyZW50IGhpc3RvcnkgaW5kZXggaXMgc2V0IHRvIHRoYXQgZW50cnksIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIDAuIAotT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGNoYW5nZWQsIGFuZCBhIC0xIGlzIHJldHVybmVkLiAKLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV9zZWFyY2hfcG9zIChjaGFyICpzdHJpbmcsIGludCBkaXJlY3Rpb24sIGludCBwb3MpCi1TZWFyY2ggZm9yIEB2YXJ7c3RyaW5nfSBpbiB0aGUgaGlzdG9yeSBsaXN0LCBzdGFydGluZyBhdCBAdmFye3Bvc30sIGFuCi1hYnNvbHV0ZSBpbmRleCBpbnRvIHRoZSBsaXN0LiAgSWYgQHZhcntkaXJlY3Rpb259IGlzIG5lZ2F0aXZlLCB0aGUgc2VhcmNoCi1wcm9jZWVkcyBiYWNrd2FyZCBmcm9tIEB2YXJ7cG9zfSwgb3RoZXJ3aXNlIGZvcndhcmQuICBSZXR1cm5zIHRoZSBhYnNvbHV0ZQotaW5kZXggb2YgdGhlIGhpc3RvcnkgZWxlbWVudCB3aGVyZSBAdmFye3N0cmluZ30gd2FzIGZvdW5kLCBvciAtMSBvdGhlcndpc2UuCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgTWFuYWdpbmcgdGhlIEhpc3RvcnkgRmlsZQotQHN1YnNlY3Rpb24gTWFuYWdpbmcgdGhlIEhpc3RvcnkgRmlsZQotCi1UaGUgSGlzdG9yeSBsaWJyYXJ5IGNhbiByZWFkIHRoZSBoaXN0b3J5IGZyb20gYW5kIHdyaXRlIGl0IHRvIGEgZmlsZS4KLVRoaXMgc2VjdGlvbiBkb2N1bWVudHMgdGhlIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgYSBoaXN0b3J5IGZpbGUuCi0KLUBkZWZ0eXBlZnVuIGludCByZWFkX2hpc3RvcnkgKGNoYXIgKmZpbGVuYW1lKQotQWRkIHRoZSBjb250ZW50cyBvZiBAdmFye2ZpbGVuYW1lfSB0byB0aGUgaGlzdG9yeSBsaXN0LCBhIGxpbmUgYXQgYQotdGltZS4gIElmIEB2YXJ7ZmlsZW5hbWV9IGlzIEBjb2Rle05VTEx9LCB0aGVuIHJlYWQgZnJvbQotQGZpbGV7fi8uaGlzdG9yeX0uICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgZXJybm8gaWYgbm90LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCByZWFkX2hpc3RvcnlfcmFuZ2UgKGNoYXIgKmZpbGVuYW1lLCBpbnQgZnJvbSwgaW50IHRvKQotUmVhZCBhIHJhbmdlIG9mIGxpbmVzIGZyb20gQHZhcntmaWxlbmFtZX0sIGFkZGluZyB0aGVtIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1TdGFydCByZWFkaW5nIGF0IGxpbmUgQHZhcntmcm9tfSBhbmQgZW5kIGF0IEB2YXJ7dG99LiAgSWYKLUB2YXJ7ZnJvbX0gaXMgemVybywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4gIElmIEB2YXJ7dG99IGlzIGxlc3MgdGhhbgotQHZhcntmcm9tfSwgdGhlbiByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBAdmFye2ZpbGVuYW1lfSBpcwotQGNvZGV7TlVMTH0sIHRoZW4gcmVhZCBmcm9tIEBmaWxle34vLmhpc3Rvcnl9LiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsCi1vciBAY29kZXtlcnJub30gaWYgbm90LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCB3cml0ZV9oaXN0b3J5IChjaGFyICpmaWxlbmFtZSkKLVdyaXRlIHRoZSBjdXJyZW50IGhpc3RvcnkgdG8gQHZhcntmaWxlbmFtZX0sIG92ZXJ3cml0aW5nIEB2YXJ7ZmlsZW5hbWV9Ci1pZiBuZWNlc3NhcnkuICBJZiBAdmFye2ZpbGVuYW1lfSBpcwotQGNvZGV7TlVMTH0sIHRoZW4gd3JpdGUgdGhlIGhpc3RvcnkgbGlzdCB0byBAZmlsZXt+Ly5oaXN0b3J5fS4gIFZhbHVlcwotcmV0dXJuZWQgYXJlIGFzIGluIEBjb2Rle3JlYWRfaGlzdG9yeSAoKX0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IGFwcGVuZF9oaXN0b3J5IChpbnQgbmVsZW1lbnRzLCBjaGFyICpmaWxlbmFtZSkKLUFwcGVuZCB0aGUgbGFzdCBAdmFye25lbGVtZW50c30gb2YgdGhlIGhpc3RvcnkgbGlzdCB0byBAdmFye2ZpbGVuYW1lfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgaGlzdG9yeV90cnVuY2F0ZV9maWxlIChjaGFyICpmaWxlbmFtZSwgaW50IG5saW5lcykKLVRydW5jYXRlIHRoZSBoaXN0b3J5IGZpbGUgQHZhcntmaWxlbmFtZX0sIGxlYXZpbmcgb25seSB0aGUgbGFzdAotQHZhcntubGluZXN9IGxpbmVzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIEhpc3RvcnkgRXhwYW5zaW9uCi1Ac3Vic2VjdGlvbiBIaXN0b3J5IEV4cGFuc2lvbgotCi1UaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IEBjb2Rle2NzaH0tbGlrZSBoaXN0b3J5IGV4cGFuc2lvbi4KLQotQGRlZnR5cGVmdW4gaW50IGhpc3RvcnlfZXhwYW5kIChjaGFyICpzdHJpbmcsIGNoYXIgKipvdXRwdXQpCi1FeHBhbmQgQHZhcntzdHJpbmd9LCBwbGFjaW5nIHRoZSByZXN1bHQgaW50byBAdmFye291dHB1dH0sIGEgcG9pbnRlcgotdG8gYSBzdHJpbmcgKEBweHJlZntIaXN0b3J5IEludGVyYWN0aW9ufSkuICBSZXR1cm5zOgotQHRhYmxlIEBjb2RlCi1AaXRlbSAwCi1JZiBubyBleHBhbnNpb25zIHRvb2sgcGxhY2UgKG9yLCBpZiB0aGUgb25seSBjaGFuZ2UgaW4KLXRoZSB0ZXh0IHdhcyB0aGUgZGUtc2xhc2hpZnlpbmcgb2YgdGhlIGhpc3RvcnkgZXhwYW5zaW9uCi1jaGFyYWN0ZXIpOwotQGl0ZW0gMQotaWYgZXhwYW5zaW9ucyBkaWQgdGFrZSBwbGFjZTsKLUBpdGVtIC0xCi1pZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gZXhwYW5zaW9uOwotQGl0ZW0gMgotaWYgdGhlIHJldHVybmVkIGxpbmUgc2hvdWxkIG9ubHkgYmUgZGlzcGxheWVkLCBidXQgbm90IGV4ZWN1dGVkLAotYXMgd2l0aCB0aGUgQGNvZGV7OnB9IG1vZGlmaWVyIChAcHhyZWZ7TW9kaWZpZXJzfSkuCi1AZW5kIHRhYmxlCi0KLUlmIGFuIGVycm9yIG9jdXJyZWQgaW4gZXhwYW5zaW9uLCB0aGVuIEB2YXJ7b3V0cHV0fSBjb250YWlucyBhIGRlc2NyaXB0aXZlCi1lcnJvciBtZXNzYWdlLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtjaGFyICp9IGhpc3RvcnlfYXJnX2V4dHJhY3QgKGludCBmaXJzdCwgaW50IGxhc3QsIGNoYXIgKnN0cmluZykKLUV4dHJhY3QgYSBzdHJpbmcgc2VnbWVudCBjb25zaXN0aW5nIG9mIHRoZSBAdmFye2ZpcnN0fSB0aHJvdWdoIEB2YXJ7bGFzdH0KLWFyZ3VtZW50cyBwcmVzZW50IGluIEB2YXJ7c3RyaW5nfS4gIEFyZ3VtZW50cyBhcmUgYnJva2VuIHVwIGFzIGluIEJhc2guCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge2NoYXIgKn0gZ2V0X2hpc3RvcnlfZXZlbnQgKGNoYXIgKnN0cmluZywgaW50ICpjaW5kZXgsIGludCBxY2hhcikKLVJldHVybnMgdGhlIHRleHQgb2YgdGhlIGhpc3RvcnkgZXZlbnQgYmVnaW5uaW5nIGF0IEB2YXJ7c3RyaW5nfSArCi1AdmFyeypjaW5kZXh9LiAgQHZhcnsqY2luZGV4fSBpcyBtb2RpZmllZCB0byBwb2ludCB0byBhZnRlciB0aGUgZXZlbnQKLXNwZWNpZmllci4gIEF0IGZ1bmN0aW9uIGVudHJ5LCBAdmFye2NpbmRleH0gcG9pbnRzIHRvIHRoZSBpbmRleCBpbnRvCi1AdmFye3N0cmluZ30gd2hlcmUgdGhlIGhpc3RvcnkgZXZlbnQgc3BlY2lmaWNhdGlvbiBiZWdpbnMuICBAdmFye3FjaGFyfQotaXMgYSBjaGFyYWN0ZXIgdGhhdCBpcyBhbGxvd2VkIHRvIGVuZCB0aGUgZXZlbnQgc3BlY2lmaWNhdGlvbiBpbiBhZGRpdGlvbgotdG8gdGhlIGBgbm9ybWFsJycgdGVybWluYXRpbmcgY2hhcmFjdGVycy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB7Y2hhciAqKn0gaGlzdG9yeV90b2tlbml6ZSAoY2hhciAqc3RyaW5nKQotUmV0dXJuIGFuIGFycmF5IG9mIHRva2VucyBwYXJzZWQgb3V0IG9mIEB2YXJ7c3RyaW5nfSwgbXVjaCBhcyB0aGUKLXNoZWxsIG1pZ2h0LiAgVGhlIHRva2VucyBhcmUgc3BsaXQgb24gd2hpdGUgc3BhY2UgYW5kIG9uIHRoZQotY2hhcmFjdGVycyBAY29kZXsoKTw+OyZ8JH0sIGFuZCBzaGVsbCBxdW90aW5nIGNvbnZlbnRpb25zIGFyZQotb2JleWVkLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIEhpc3RvcnkgVmFyaWFibGVzCi1Ac2VjdGlvbiBIaXN0b3J5IFZhcmlhYmxlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBleHRlcm5hbGx5IHZpc2libGUgdmFyaWFibGVzIGV4cG9ydGVkIGJ5Ci10aGUgR05VIEhpc3RvcnkgTGlicmFyeS4KLQotQGRlZnR5cGV2YXIgaW50IGhpc3RvcnlfYmFzZQotVGhlIGxvZ2ljYWwgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGlzdG9yeSBsaXN0LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGludCBoaXN0b3J5X2xlbmd0aAotVGhlIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBpbnQgbWF4X2lucHV0X2hpc3RvcnkKLVRoZSBtYXhpbXVtIG51bWJlciBvZiBoaXN0b3J5IGVudHJpZXMuICBUaGlzIG11c3QgYmUgY2hhbmdlZCB1c2luZwotQGNvZGV7c3RpZmxlX2hpc3RvcnkgKCl9LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGNoYXIgaGlzdG9yeV9leHBhbnNpb25fY2hhcgotVGhlIGNoYXJhY3RlciB0aGF0IHN0YXJ0cyBhIGhpc3RvcnkgZXZlbnQuICBUaGUgZGVmYXVsdCBpcyBAc2FtcHshfS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBjaGFyIGhpc3Rvcnlfc3Vic3RfY2hhcgotVGhlIGNoYXJhY3RlciB0aGF0IGludm9rZXMgd29yZCBzdWJzdGl0dXRpb24gaWYgZm91bmQgYXQgdGhlIHN0YXJ0IG9mCi1hIGxpbmUuICBUaGUgZGVmYXVsdCBpcyBAc2FtcHtefS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBjaGFyIGhpc3RvcnlfY29tbWVudF9jaGFyCi1EdXJpbmcgdG9rZW5pemF0aW9uLCBpZiB0aGlzIGNoYXJhY3RlciBpcyBzZWVuIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLW9mIGEgd29yZCwgdGhlbiBpdCBhbmQgYWxsIHN1YnNlcXVlbnQgY2hhcmFjdGVycyB1cCB0byBhIG5ld2xpbmUgYXJlCi1pZ25vcmVkLCBzdXBwcmVzc2luZyBoaXN0b3J5IGV4cGFuc2lvbiBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZS4KLVRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7Y2hhciAqfSBoaXN0b3J5X25vX2V4cGFuZF9jaGFycwotVGhlIGxpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBpbmhpYml0IGhpc3RvcnkgZXhwYW5zaW9uIGlmIGZvdW5kIGltbWVkaWF0ZWx5Ci1mb2xsb3dpbmcgQHZhcntoaXN0b3J5X2V4cGFuc2lvbl9jaGFyfS4gIFRoZSBkZWZhdWx0IGlzIHdoaXRlc3BhY2UgYW5kCi1Ac2FtcHs9fS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7Y2hhciAqfSBoaXN0b3J5X3NlYXJjaF9kZWxpbWl0ZXJfY2hhcnMKLVRoZSBsaXN0IG9mIGFkZGl0aW9uYWwgY2hhcmFjdGVycyB3aGljaCBjYW4gZGVsaW1pdCBhIGhpc3Rvcnkgc2VhcmNoCi1zdHJpbmcsIGluIGFkZGl0aW9uIHRvIHdoaXRlc3BhY2UsIEBzYW1wezp9IGFuZCBAc2FtcHs/fSBpbiB0aGUgY2FzZSBvZgotYSBzdWJzdHJpbmcgc2VhcmNoLiAgVGhlIGRlZmF1bHQgaXMgZW1wdHkuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uCi1JZiBub24temVybywgc2luZ2xlLXF1b3RlZCB3b3JkcyBhcmUgbm90IHNjYW5uZWQgZm9yIHRoZSBoaXN0b3J5IGV4cGFuc2lvbgotY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7RnVuY3Rpb24gKn0gaGlzdG9yeV9pbmhpYml0X2V4cGFuc2lvbl9mdW5jdGlvbgotVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0d28gYXJndW1lbnRzOgotYSBAY29kZXtjaGFyICp9IChAdmFye3N0cmluZ30pIGFuZCBhbiBpbnRlZ2VyIGluZGV4IGludG8gdGhhdCBzdHJpbmcgKEB2YXJ7aX0pLgotSXQgc2hvdWxkIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlIGlmIHRoZSBoaXN0b3J5IGV4cGFuc2lvbiBzdGFydGluZyBhdAotQHZhcntzdHJpbmdbaV19IHNob3VsZCBub3QgYmUgcGVyZm9ybWVkOyB6ZXJvIGlmIHRoZSBleHBhbnNpb24gc2hvdWxkCi1iZSBkb25lLgotSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgbGlrZSBCYXNoIHRoYXQgdXNlIHRoZSBoaXN0b3J5Ci1leHBhbnNpb24gY2hhcmFjdGVyIGZvciBhZGRpdGlvbmFsIHB1cnBvc2VzLgotQnkgZGVmYXVsdCwgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gTlVMTC4KLUBlbmQgZGVmdHlwZXZhcgotCi1Abm9kZSBIaXN0b3J5IFByb2dyYW1taW5nIEV4YW1wbGUKLUBzZWN0aW9uIEhpc3RvcnkgUHJvZ3JhbW1pbmcgRXhhbXBsZQotCi1UaGUgZm9sbG93aW5nIHByb2dyYW0gZGVtb25zdHJhdGVzIHNpbXBsZSB1c2Ugb2YgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkuCi0KLUBzbWFsbGV4YW1wbGUKLW1haW4gKCkKLUB7Ci0gIGNoYXIgbGluZVsxMDI0XSwgKnQ7Ci0gIGludCBsZW4sIGRvbmUgPSAwOwotCi0gIGxpbmVbMF0gPSAwOwotCi0gIHVzaW5nX2hpc3RvcnkgKCk7Ci0gIHdoaWxlICghZG9uZSkKLSAgICBAewotICAgICAgcHJpbnRmICgiaGlzdG9yeSQgIik7Ci0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgICB0ID0gZmdldHMgKGxpbmUsIHNpemVvZiAobGluZSkgLSAxLCBzdGRpbik7Ci0gICAgICBpZiAodCAmJiAqdCkKLSAgICAgICAgQHsKLSAgICAgICAgICBsZW4gPSBzdHJsZW4gKHQpOwotICAgICAgICAgIGlmICh0W2xlbiAtIDFdID09ICdcbicpCi0gICAgICAgICAgICB0W2xlbiAtIDFdID0gJ1wwJzsKLSAgICAgICAgQH0KLQotICAgICAgaWYgKCF0KQotICAgICAgICBzdHJjcHkgKGxpbmUsICJxdWl0Iik7Ci0KLSAgICAgIGlmIChsaW5lWzBdKQotICAgICAgICBAewotICAgICAgICAgIGNoYXIgKmV4cGFuc2lvbjsKLSAgICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgICAgcmVzdWx0ID0gaGlzdG9yeV9leHBhbmQgKGxpbmUsICZleHBhbnNpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXhwYW5zaW9uKTsKLQotICAgICAgICAgIGlmIChyZXN1bHQgPCAwIHx8IHJlc3VsdCA9PSAyKQotICAgICAgICAgICAgQHsKLSAgICAgICAgICAgICAgZnJlZSAoZXhwYW5zaW9uKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBAfQotCi0gICAgICAgICAgYWRkX2hpc3RvcnkgKGV4cGFuc2lvbik7Ci0gICAgICAgICAgc3RybmNweSAobGluZSwgZXhwYW5zaW9uLCBzaXplb2YgKGxpbmUpIC0gMSk7Ci0gICAgICAgICAgZnJlZSAoZXhwYW5zaW9uKTsKLSAgICAgICAgQH0KLQotICAgICAgaWYgKHN0cmNtcCAobGluZSwgInF1aXQiKSA9PSAwKQotICAgICAgICBkb25lID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobGluZSwgInNhdmUiKSA9PSAwKQotICAgICAgICB3cml0ZV9oaXN0b3J5ICgiaGlzdG9yeV9maWxlIik7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGxpbmUsICJyZWFkIikgPT0gMCkKLSAgICAgICAgcmVhZF9oaXN0b3J5ICgiaGlzdG9yeV9maWxlIik7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGxpbmUsICJsaXN0IikgPT0gMCkKLSAgICAgICAgQHsKLSAgICAgICAgICByZWdpc3RlciBISVNUX0VOVFJZICoqdGhlX2xpc3Q7Ci0gICAgICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAgICAgICB0aGVfbGlzdCA9IGhpc3RvcnlfbGlzdCAoKTsKLSAgICAgICAgICBpZiAodGhlX2xpc3QpCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyB0aGVfbGlzdFtpXTsgaSsrKQotICAgICAgICAgICAgICBwcmludGYgKCIlZDogJXNcbiIsIGkgKyBoaXN0b3J5X2Jhc2UsIHRoZV9saXN0W2ldLT5saW5lKTsKLSAgICAgICAgQH0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGxpbmUsICJkZWxldGUiLCA2KSA9PSAwKQotICAgICAgICBAewotICAgICAgICAgIGludCB3aGljaDsKLSAgICAgICAgICBpZiAoKHNzY2FuZiAobGluZSArIDYsICIlZCIsICZ3aGljaCkpID09IDEpCi0gICAgICAgICAgICBAewotICAgICAgICAgICAgICBISVNUX0VOVFJZICplbnRyeSA9IHJlbW92ZV9oaXN0b3J5ICh3aGljaCk7Ci0gICAgICAgICAgICAgIGlmICghZW50cnkpCi0gICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm8gc3VjaCBlbnRyeSAlZFxuIiwgd2hpY2gpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQHsKLSAgICAgICAgICAgICAgICAgIGZyZWUgKGVudHJ5LT5saW5lKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUgKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBAfQotICAgICAgICAgICAgQH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBAewotICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJub24tbnVtZXJpYyBhcmcgZ2l2ZW4gdG8gYGRlbGV0ZSdcbiIpOwotICAgICAgICAgICAgQH0KLSAgICAgICAgQH0KLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCmRpZmYgLS1naXQgYS9yZWFkbGluZS9kb2MvaHN1c2VyLnRleGluZm8gYi9yZWFkbGluZS9kb2MvaHN1c2VyLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDU4MmQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZG9jL2hzdXNlci50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLUBpZ25vcmUKLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIHVzZXIgaW50ZXJmYWNlIHRvIHRoZSBHTlUgSGlzdG9yeSBsaWJyYXJ5LgotCi1Db3B5cmlnaHQgKEMpIDE5ODgsIDE5OTEsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1BdXRob3JlZCBieSBCcmlhbiBGb3ggYW5kIENoZXQgUmFtZXkuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIG1hbnVhbAotcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXJlIHByZXNlcnZlZCBvbgotYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uIG5vdGljZQotaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGggKHRoaXMKLXBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQgdGhlCi1HTlUgQ29weXJpZ2h0IHN0YXRlbWVudCBpcyBhdmFpbGFibGUgdG8gdGhlIGRpc3RyaWJ1dGVlLCBhbmQgcHJvdmlkZWQgdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlnbm9yZQotCi1Abm9kZSBVc2luZyBIaXN0b3J5IEludGVyYWN0aXZlbHkKLUBjaGFwdGVyIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseQotCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgaW50ZXJhY3RpdmVseSwKLWZyb20gYSB1c2VyJ3Mgc3RhbmRwb2ludC4gIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgdXNlcidzIGd1aWRlLiAgRm9yCi1pbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgR05VIEhpc3RvcnkgTGlicmFyeSBpbiBvdGhlciBwcm9ncmFtcywKLXNlZSB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnkgTWFudWFsLgotQGVuZCBpZnNldAotQGlmY2xlYXIgQmFzaEZlYXR1cmVzCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgaW50ZXJhY3RpdmVseSwKLWZyb20gYSB1c2VyJ3Mgc3RhbmRwb2ludC4gIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgdXNlcidzIGd1aWRlLiAgRm9yCi1pbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgR05VIEhpc3RvcnkgTGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtcywKLUBweHJlZntQcm9ncmFtbWluZyB3aXRoIEdOVSBIaXN0b3J5fS4KLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1AbWVudQotKiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllczo6CUhvdyBCYXNoIGxldHMgeW91IG1hbmlwdWxhdGUgeW91ciBjb21tYW5kCi0JCQkJaGlzdG9yeS4KLSogQmFzaCBIaXN0b3J5IEJ1aWx0aW5zOjoJVGhlIEJhc2ggYnVpbHRpbiBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUKLQkJCQl0aGUgY29tbWFuZCBoaXN0b3J5LgotKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KLUBlbmQgbWVudQotQGVuZCBpZnNldAotQGlmY2xlYXIgQmFzaEZlYXR1cmVzCi1AbWVudQotKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KLUBlbmQgbWVudQotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUBub2RlIEJhc2ggSGlzdG9yeSBGYWNpbGl0aWVzCi1Ac2VjdGlvbiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllcwotQGNpbmRleCBjb21tYW5kIGhpc3RvcnkKLUBjaW5kZXggaGlzdG9yeSBsaXN0Ci0KLVdoZW4gdGhlIEBzYW1wey1vIGhpc3Rvcnl9IG9wdGlvbiB0byB0aGUgQGNvZGV7c2V0fSBidWlsdGluCi1pcyBlbmFibGVkIChAcHhyZWZ7VGhlIFNldCBCdWlsdGlufSksCi10aGUgc2hlbGwgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBAdmFye2NvbW1hbmQgaGlzdG9yeX0sCi10aGUgbGlzdCBvZiBjb21tYW5kcyBwcmV2aW91c2x5IHR5cGVkLiAgVGhlIHRleHQgb2YgdGhlIGxhc3QKLUBjb2Rle0hJU1RTSVpFfQotY29tbWFuZHMgKGRlZmF1bHQgNTAwKSBpcyBzYXZlZCBpbiBhIGhpc3RvcnkgbGlzdC4gIFRoZSBzaGVsbAotc3RvcmVzIGVhY2ggY29tbWFuZCBpbiB0aGUgaGlzdG9yeSBsaXN0IHByaW9yIHRvIHBhcmFtZXRlciBhbmQKLXZhcmlhYmxlIGV4cGFuc2lvbgotYnV0IGFmdGVyIGhpc3RvcnkgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCwgc3ViamVjdCB0byB0aGUKLXZhbHVlcyBvZiB0aGUgc2hlbGwgdmFyaWFibGVzCi1AY29kZXtISVNUSUdOT1JFfSBhbmQgQGNvZGV7SElTVENPTlRST0x9LgotV2hlbiB0aGUgc2hlbGwgc3RhcnRzIHVwLCB0aGUgaGlzdG9yeSBpcyBpbml0aWFsaXplZCBmcm9tIHRoZQotZmlsZSBuYW1lZCBieSB0aGUgQGNvZGV7SElTVEZJTEV9IHZhcmlhYmxlIChkZWZhdWx0IEBmaWxle34vLmJhc2hfaGlzdG9yeX0pLgotQGNvZGV7SElTVEZJTEV9IGlzIHRydW5jYXRlZCwgaWYgbmVjZXNzYXJ5LCB0byBjb250YWluIG5vIG1vcmUgdGhhbgotdGhlIG51bWJlciBvZiBsaW5lcyBzcGVjaWZpZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtISVNURklMRVNJWkV9Ci12YXJpYWJsZS4gIFdoZW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwgZXhpdHMsIHRoZSBsYXN0Ci1AY29kZXtISVNUU0laRX0gbGluZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBoaXN0b3J5IGxpc3QgdG8gQGNvZGV7SElTVEZJTEV9LgotSWYgdGhlIEBjb2Rle2hpc3RhcHBlbmR9IHNoZWxsIG9wdGlvbiBpcyBzZXQgKEBweHJlZntCYXNoIEJ1aWx0aW5zfSksCi10aGUgbGluZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBoaXN0b3J5IGZpbGUsCi1vdGhlcndpc2UgdGhlIGhpc3RvcnkgZmlsZSBpcyBvdmVyd3JpdHRlbi4KLUlmIEBjb2Rle0hJU1RGSUxFfQotaXMgdW5zZXQsIG9yIGlmIHRoZSBoaXN0b3J5IGZpbGUgaXMgdW53cml0YWJsZSwgdGhlIGhpc3RvcnkgaXMKLW5vdCBzYXZlZC4gIEFmdGVyIHNhdmluZyB0aGUgaGlzdG9yeSwgdGhlIGhpc3RvcnkgZmlsZSBpcyB0cnVuY2F0ZWQKLXRvIGNvbnRhaW4gbm8gbW9yZSB0aGFuIEBjb2RleyRISVNURklMRVNJWkV9Ci1saW5lcy4gIElmIEBjb2Rle0hJU1RGSUxFU0laRX0gaXMgbm90IHNldCwgbm8gdHJ1bmNhdGlvbiBpcyBwZXJmb3JtZWQuCi0KLVRoZSBidWlsdGluIGNvbW1hbmQgQGNvZGV7ZmN9IG1heSBiZSB1c2VkIHRvIGxpc3Qgb3IgZWRpdCBhbmQgcmUtZXhlY3V0ZQotYSBwb3J0aW9uIG9mIHRoZSBoaXN0b3J5IGxpc3QuCi1UaGUgQGNvZGV7aGlzdG9yeX0gYnVpbHRpbiBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IG9yIG1vZGlmeSB0aGUgaGlzdG9yeQotbGlzdCBhbmQgbWFuaXB1bGF0ZSB0aGUgaGlzdG9yeSBmaWxlLgotV2hlbiB1c2luZyB0aGUgY29tbWFuZC1saW5lIGVkaXRpbmcsIHNlYXJjaCBjb21tYW5kcwotYXJlIGF2YWlsYWJsZSBpbiBlYWNoIGVkaXRpbmcgbW9kZSB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZQotaGlzdG9yeSBsaXN0LgotCi1UaGUgc2hlbGwgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGljaCBjb21tYW5kcyBhcmUgc2F2ZWQgb24gdGhlIGhpc3RvcnkKLWxpc3QuICBUaGUgQGNvZGV7SElTVENPTlRST0x9IGFuZCBAY29kZXtISVNUSUdOT1JFfQotdmFyaWFibGVzIG1heSBiZSBzZXQgdG8gY2F1c2UgdGhlIHNoZWxsIHRvIHNhdmUgb25seSBhIHN1YnNldCBvZiB0aGUKLWNvbW1hbmRzIGVudGVyZWQuCi1UaGUgQGNvZGV7Y21kaGlzdH0KLXNoZWxsIG9wdGlvbiwgaWYgZW5hYmxlZCwgY2F1c2VzIHRoZSBzaGVsbCB0byBhdHRlbXB0IHRvIHNhdmUgZWFjaAotbGluZSBvZiBhIG11bHRpLWxpbmUgY29tbWFuZCBpbiB0aGUgc2FtZSBoaXN0b3J5IGVudHJ5LCBhZGRpbmcKLXNlbWljb2xvbnMgd2hlcmUgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIHN5bnRhY3RpYyBjb3JyZWN0bmVzcy4KLVRoZSBAY29kZXtsaXRoaXN0fQotc2hlbGwgb3B0aW9uIGNhdXNlcyB0aGUgc2hlbGwgdG8gc2F2ZSB0aGUgY29tbWFuZCB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzCi1pbnN0ZWFkIG9mIHNlbWljb2xvbnMuCi1AeHJlZntCYXNoIEJ1aWx0aW5zfSwgZm9yIGEgZGVzY3JpcHRpb24gb2YgQGNvZGV7c2hvcHR9LgotCi1Abm9kZSBCYXNoIEhpc3RvcnkgQnVpbHRpbnMKLUBzZWN0aW9uIEJhc2ggSGlzdG9yeSBCdWlsdGlucwotQGNpbmRleCBoaXN0b3J5IGJ1aWx0aW5zCi0KLUJhc2ggcHJvdmlkZXMgdHdvIGJ1aWx0aW4gY29tbWFuZHMgdGhhdCBhbGxvdyB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUKLWhpc3RvcnkgbGlzdCBhbmQgaGlzdG9yeSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gZmMKLUBjb21tZW50IGJ0aW5kZXggZmMKLUBleGFtcGxlCi1AY29kZXtmYyBbLWUgQHZhcntlbmFtZX1dIFstbmxyXSBbQHZhcntmaXJzdH1dIFtAdmFye2xhc3R9XX0KLUBjb2Rle2ZjIC1zIFtAdmFye3BhdH09QHZhcntyZXB9XSBbQHZhcntjb21tYW5kfV19Ci1AZW5kIGV4YW1wbGUKLQotRml4IENvbW1hbmQuICBJbiB0aGUgZmlyc3QgZm9ybSwgYSByYW5nZSBvZiBjb21tYW5kcyBmcm9tIEB2YXJ7Zmlyc3R9IHRvCi1AdmFye2xhc3R9IGlzIHNlbGVjdGVkIGZyb20gdGhlIGhpc3RvcnkgbGlzdC4gIEJvdGggQHZhcntmaXJzdH0gYW5kCi1AdmFye2xhc3R9IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHRvIGxvY2F0ZSB0aGUgbW9zdCByZWNlbnQKLWNvbW1hbmQgYmVnaW5uaW5nIHdpdGggdGhhdCBzdHJpbmcpIG9yIGFzIGEgbnVtYmVyIChhbiBpbmRleCBpbnRvIHRoZQotaGlzdG9yeSBsaXN0LCB3aGVyZSBhIG5lZ2F0aXZlIG51bWJlciBpcyB1c2VkIGFzIGFuIG9mZnNldCBmcm9tIHRoZQotY3VycmVudCBjb21tYW5kIG51bWJlcikuICBJZiBAdmFye2xhc3R9IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgc2V0IHRvCi1AdmFye2ZpcnN0fS4gIElmIEB2YXJ7Zmlyc3R9IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgc2V0IHRvIHRoZSBwcmV2aW91cwotY29tbWFuZCBmb3IgZWRpdGluZyBhbmQgQG1pbnVze30xNiBmb3IgbGlzdGluZy4gIElmIHRoZSBAc2FtcHstbH0gZmxhZyBpcwotZ2l2ZW4sIHRoZSBjb21tYW5kcyBhcmUgbGlzdGVkIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBAc2FtcHstbn0gZmxhZwotc3VwcHJlc3NlcyB0aGUgY29tbWFuZCBudW1iZXJzIHdoZW4gbGlzdGluZy4gIFRoZSBAc2FtcHstcn0gZmxhZwotcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBsaXN0aW5nLiAgT3RoZXJ3aXNlLCB0aGUgZWRpdG9yIGdpdmVuIGJ5Ci1AdmFye2VuYW1lfSBpcyBpbnZva2VkIG9uIGEgZmlsZSBjb250YWluaW5nIHRob3NlIGNvbW1hbmRzLiAgSWYKLUB2YXJ7ZW5hbWV9IGlzIG5vdCBnaXZlbiwgdGhlIHZhbHVlIG9mIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZXhwYW5zaW9uCi1pcyB1c2VkOiBAY29kZXskQHtGQ0VESVQ6LSRAe0VESVRPUjotdmlAfUB9fS4gIFRoaXMgc2F5cyB0byB1c2UgdGhlCi12YWx1ZSBvZiB0aGUgQGNvZGV7RkNFRElUfSB2YXJpYWJsZSBpZiBzZXQsIG9yIHRoZSB2YWx1ZSBvZiB0aGUKLUBjb2Rle0VESVRPUn0gdmFyaWFibGUgaWYgdGhhdCBpcyBzZXQsIG9yIEBjb2Rle3ZpfSBpZiBuZWl0aGVyIGlzIHNldC4KLVdoZW4gZWRpdGluZyBpcyBjb21wbGV0ZSwgdGhlIGVkaXRlZCBjb21tYW5kcyBhcmUgZWNob2VkIGFuZCBleGVjdXRlZC4KLQotSW4gdGhlIHNlY29uZCBmb3JtLCBAdmFye2NvbW1hbmR9IGlzIHJlLWV4ZWN1dGVkIGFmdGVyIGVhY2ggaW5zdGFuY2UKLW9mIEB2YXJ7cGF0fSBpbiB0aGUgc2VsZWN0ZWQgY29tbWFuZCBpcyByZXBsYWNlZCBieSBAdmFye3JlcH0uCi0KLUEgdXNlZnVsIGFsaWFzIHRvIHVzZSB3aXRoIHRoZSBAY29kZXtmY30gY29tbWFuZCBpcyBAY29kZXtyPSdmYyAtcyd9LCBzbwotdGhhdCB0eXBpbmcgQHNhbXB7ciBjY30gcnVucyB0aGUgbGFzdCBjb21tYW5kIGJlZ2lubmluZyB3aXRoIEBjb2Rle2NjfQotYW5kIHR5cGluZyBAc2FtcHtyfSByZS1leGVjdXRlcyB0aGUgbGFzdCBjb21tYW5kIChAcHhyZWZ7QWxpYXNlc30pLgotCi1AaXRlbSBoaXN0b3J5Ci1AY29tbWVudCBidGluZGV4IGhpc3RvcnkKLUBleGFtcGxlCi1oaXN0b3J5IFstY10gW0B2YXJ7bn1dCi1oaXN0b3J5IFstYW5yd10gW0B2YXJ7ZmlsZW5hbWV9XQotaGlzdG9yeSAtcHMgQHZhcnthcmd9Ci1AZW5kIGV4YW1wbGUKLQotRGlzcGxheSB0aGUgaGlzdG9yeSBsaXN0IHdpdGggbGluZSBudW1iZXJzLiAgTGluZXMgcHJlZml4ZWQgd2l0aAotd2l0aCBhIEBzYW1weyp9IGhhdmUgYmVlbiBtb2RpZmllZC4gIEFuIGFyZ3VtZW50IG9mIEB2YXJ7bn0gc2F5cwotdG8gbGlzdCBvbmx5IHRoZSBsYXN0IEB2YXJ7bn0gbGluZXMuICBPcHRpb25zLCBpZiBzdXBwbGllZCwgaGF2ZQotdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtdwotV3JpdGUgb3V0IHRoZSBjdXJyZW50IGhpc3RvcnkgdG8gdGhlIGhpc3RvcnkgZmlsZS4KLQotQGl0ZW0gLXIKLVJlYWQgdGhlIGN1cnJlbnQgaGlzdG9yeSBmaWxlIGFuZCBhcHBlbmQgaXRzIGNvbnRlbnRzIHRvCi10aGUgaGlzdG9yeSBsaXN0LgotCi1AaXRlbSAtYQotQXBwZW5kIHRoZSBuZXcKLWhpc3RvcnkgbGluZXMgKGhpc3RvcnkgbGluZXMgZW50ZXJlZCBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZQotY3VycmVudCBCYXNoIHNlc3Npb24pIHRvIHRoZSBoaXN0b3J5IGZpbGUuCi0KLUBpdGVtIC1uCi1BcHBlbmQgdGhlIGhpc3RvcnkgbGluZXMgbm90IGFscmVhZHkgcmVhZCBmcm9tIHRoZSBoaXN0b3J5IGZpbGUKLXRvIHRoZSBjdXJyZW50IGhpc3RvcnkgbGlzdC4gIFRoZXNlIGFyZSBsaW5lcyBhcHBlbmRlZCB0byB0aGUgaGlzdG9yeQotZmlsZSBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IEJhc2ggc2Vzc2lvbi4KLQotQGl0ZW0gLWMKLUNsZWFyIHRoZSBoaXN0b3J5IGxpc3QuICBUaGlzIG1heSBiZSBjb21iaW5lZAotd2l0aCB0aGUgb3RoZXIgb3B0aW9ucyB0byByZXBsYWNlIHRoZSBoaXN0b3J5IGxpc3QgY29tcGxldGVseS4KLQotQGl0ZW0gLXMKLVRoZSBAdmFye2FyZ31zIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mCi10aGUgaGlzdG9yeSBsaXN0IGFzIGEgc2luZ2xlIGVudHJ5LgotCi1AaXRlbSAtcAotUGVyZm9ybSBoaXN0b3J5IHN1YnN0aXR1dGlvbiBvbiB0aGUgQHZhcnthcmd9cyBhbmQgZGlzcGxheSB0aGUgcmVzdWx0Ci1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLUBlbmQgdGFibGUKLQotV2hlbiB0aGUgQHNhbXB7LXd9LCBAc2FtcHstcn0sIEBzYW1wey1hfSwgb3IgQHNhbXB7LW59IG9wdGlvbiBpcwotdXNlZCwgaWYgQHZhcntmaWxlbmFtZX0KLWlzIGdpdmVuLCB0aGVuIGl0IGlzIHVzZWQgYXMgdGhlIGhpc3RvcnkgZmlsZS4gIElmIG5vdCwgdGhlbgotdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtISVNURklMRX0gdmFyaWFibGUgaXMgdXNlZC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1Abm9kZSBIaXN0b3J5IEludGVyYWN0aW9uCi1Ac2VjdGlvbiBIaXN0b3J5IEV4cGFuc2lvbgotQGNpbmRleCBoaXN0b3J5IGV4cGFuc2lvbgotCi1UaGUgSGlzdG9yeSBsaWJyYXJ5IHByb3ZpZGVzIGEgaGlzdG9yeSBleHBhbnNpb24gZmVhdHVyZSB0aGF0IGlzIHNpbWlsYXIKLXRvIHRoZSBoaXN0b3J5IGV4cGFuc2lvbiBwcm92aWRlZCBieSBAY29kZXtjc2h9LiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlIHN5bnRheCB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGhpc3RvcnkgaW5mb3JtYXRpb24uCi0KLUhpc3RvcnkgZXhwYW5zaW9ucyBpbnRyb2R1Y2Ugd29yZHMgZnJvbSB0aGUgaGlzdG9yeSBsaXN0IGludG8KLXRoZSBpbnB1dCBzdHJlYW0sIG1ha2luZyBpdCBlYXN5IHRvIHJlcGVhdCBjb21tYW5kcywgaW5zZXJ0IHRoZQotYXJndW1lbnRzIHRvIGEgcHJldmlvdXMgY29tbWFuZCBpbnRvIHRoZSBjdXJyZW50IGlucHV0IGxpbmUsIG9yCi1maXggZXJyb3JzIGluIHByZXZpb3VzIGNvbW1hbmRzIHF1aWNrbHkuCi0KLUhpc3RvcnkgZXhwYW5zaW9uIHRha2VzIHBsYWNlIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBpcyB0byBkZXRlcm1pbmUKLXdoaWNoIGxpbmUgZnJvbSB0aGUgaGlzdG9yeSBsaXN0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBzdWJzdGl0dXRpb24uCi1UaGUgc2Vjb25kIGlzIHRvIHNlbGVjdCBwb3J0aW9ucyBvZiB0aGF0IGxpbmUgZm9yIGluY2x1c2lvbiBpbnRvIHRoZQotY3VycmVudCBvbmUuICBUaGUgbGluZSBzZWxlY3RlZCBmcm9tIHRoZSBoaXN0b3J5IGlzIGNhbGxlZCB0aGUKLUBkZm57ZXZlbnR9LCBhbmQgdGhlIHBvcnRpb25zIG9mIHRoYXQgbGluZSB0aGF0IGFyZSBhY3RlZCB1cG9uIGFyZQotY2FsbGVkIEBkZm57d29yZHN9LiAgVmFyaW91cyBAZGZue21vZGlmaWVyc30gYXJlIGF2YWlsYWJsZSB0byBtYW5pcHVsYXRlCi10aGUgc2VsZWN0ZWQgd29yZHMuICBUaGUgbGluZSBpcyBicm9rZW4gaW50byB3b3JkcyBpbiB0aGUgc2FtZSBmYXNoaW9uCi10aGF0IEJhc2ggZG9lcywgc28gdGhhdCBzZXZlcmFsIHdvcmRzCi1zdXJyb3VuZGVkIGJ5IHF1b3RlcyBhcmUgY29uc2lkZXJlZCBvbmUgd29yZC4KLUhpc3RvcnkgZXhwYW5zaW9ucyBhcmUgaW50cm9kdWNlZCBieSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUKLWhpc3RvcnkgZXhwYW5zaW9uIGNoYXJhY3Rlciwgd2hpY2ggaXMgQHNhbXB7IX0gYnkgZGVmYXVsdC4KLUBpZnNldCBCYXNoRmVhdHVyZXMKLU9ubHkgQHNhbXB7XH0gYW5kIEBzYW1weyd9IG1heSBiZSB1c2VkIHRvIGVzY2FwZSB0aGUgaGlzdG9yeSBleHBhbnNpb24KLWNoYXJhY3Rlci4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEJhc2hGZWF0dXJlcwotU2V2ZXJhbCBzaGVsbCBvcHRpb25zIHNldHRhYmxlIHdpdGggdGhlIEBjb2Rle3Nob3B0fQotYnVpbHRpbiAoQHB4cmVme0Jhc2ggQnVpbHRpbnN9KSBtYXkgYmUgdXNlZCB0byB0YWlsb3IKLXRoZSBiZWhhdmlvciBvZiBoaXN0b3J5IGV4cGFuc2lvbi4gIElmIHRoZQotQGNvZGV7aGlzdHZlcmlmeX0gc2hlbGwgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBSZWFkbGluZQotaXMgYmVpbmcgdXNlZCwgaGlzdG9yeSBzdWJzdGl0dXRpb25zIGFyZSBub3QgaW1tZWRpYXRlbHkgcGFzc2VkIHRvCi10aGUgc2hlbGwgcGFyc2VyLgotSW5zdGVhZCwgdGhlIGV4cGFuZGVkIGxpbmUgaXMgcmVsb2FkZWQgaW50byB0aGUgUmVhZGxpbmUKLWVkaXRpbmcgYnVmZmVyIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbi4KLUlmIFJlYWRsaW5lIGlzIGJlaW5nIHVzZWQsIGFuZCB0aGUgQGNvZGV7aGlzdHJlZWRpdH0KLXNoZWxsIG9wdGlvbiBpcyBlbmFibGVkLCBhIGZhaWxlZCBoaXN0b3J5IGV4cGFuc2lvbiB3aWxsIGJlCi1yZWxvYWRlZCBpbnRvIHRoZSBSZWFkbGluZSBlZGl0aW5nIGJ1ZmZlciBmb3IgY29ycmVjdGlvbi4KLVRoZSBAc2FtcHstcH0gb3B0aW9uIHRvIHRoZSBAY29kZXtoaXN0b3J5fSBidWlsdGluIGNvbW1hbmQKLW1heSBiZSB1c2VkIHRvIHNlZSB3aGF0IGEgaGlzdG9yeSBleHBhbnNpb24gd2lsbCBkbyBiZWZvcmUgdXNpbmcgaXQuCi1UaGUgQHNhbXB7LXN9IG9wdGlvbiB0byB0aGUgQGNvZGV7aGlzdG9yeX0gYnVpbHRpbiBtYXkgYmUgdXNlZCB0bwotYWRkIGNvbW1hbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgbGlzdCB3aXRob3V0IGFjdHVhbGx5IGV4ZWN1dGluZwotdGhlbSwgc28gdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIHN1YnNlcXVlbnQgcmVjYWxsLgotVGhpcyBpcyBtb3N0IHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIFJlYWRsaW5lLgotCi1UaGUgc2hlbGwgYWxsb3dzIGNvbnRyb2wgb2YgdGhlIHZhcmlvdXMgY2hhcmFjdGVycyB1c2VkIGJ5IHRoZQotaGlzdG9yeSBleHBhbnNpb24gbWVjaGFuaXNtIHdpdGggdGhlIEBjb2Rle2hpc3RjaGFyc30gdmFyaWFibGUuCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIEV2ZW50IERlc2lnbmF0b3JzOjoJSG93IHRvIHNwZWNpZnkgd2hpY2ggaGlzdG9yeSBsaW5lIHRvIHVzZS4KLSogV29yZCBEZXNpZ25hdG9yczo6CVNwZWNpZnlpbmcgd2hpY2ggd29yZHMgYXJlIG9mIGludGVyZXN0LgotKiBNb2RpZmllcnM6OgkJTW9kaWZ5aW5nIHRoZSByZXN1bHRzIG9mIHN1YnN0aXR1dGlvbi4KLUBlbmQgbWVudQotCi1Abm9kZSBFdmVudCBEZXNpZ25hdG9ycwotQHN1YnNlY3Rpb24gRXZlbnQgRGVzaWduYXRvcnMKLUBjaW5kZXggZXZlbnQgZGVzaWduYXRvcnMKLQotQW4gZXZlbnQgZGVzaWduYXRvciBpcyBhIHJlZmVyZW5jZSB0byBhIGNvbW1hbmQgbGluZSBlbnRyeSBpbiB0aGUKLWhpc3RvcnkgbGlzdC4KLUBjaW5kZXggaGlzdG9yeSBldmVudHMKLQotQHRhYmxlIEBhc2lzCi0KLUBpdGVtIEBjb2RleyF9Ci1TdGFydCBhIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLCBleGNlcHQgd2hlbiBmb2xsb3dlZCBieSBhIHNwYWNlLCB0YWIsCi10aGUgZW5kIG9mIHRoZSBsaW5lLCBAc2FtcHs9fSBvciBAc2FtcHsofS4KLQotQGl0ZW0gQGNvZGV7IUB2YXJ7bn19Ci1SZWZlciB0byBjb21tYW5kIGxpbmUgQHZhcntufS4KLQotQGl0ZW0gQGNvZGV7IS1AdmFye259fQotUmVmZXIgdG8gdGhlIGNvbW1hbmQgQHZhcntufSBsaW5lcyBiYWNrLgotCi1AaXRlbSBAY29kZXshIX0KLVJlZmVyIHRvIHRoZSBwcmV2aW91cyBjb21tYW5kLiAgVGhpcyBpcyBhIHN5bm9ueW0gZm9yIEBzYW1weyEtMX0uCi0KLUBpdGVtIEBjb2RleyFAdmFye3N0cmluZ319Ci1SZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoIEB2YXJ7c3RyaW5nfS4KLQotQGl0ZW0gQGNvZGV7IT9AdmFye3N0cmluZ31bP119Ci1SZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBjb250YWluaW5nIEB2YXJ7c3RyaW5nfS4gIFRoZSB0cmFpbGluZwotQHNhbXB7P30gbWF5IGJlIG9taXR0ZWQgaWYgdGhlIEB2YXJ7c3RyaW5nfSBpcyBmb2xsb3dlZCBpbW1lZGlhdGVseSBieQotYSBuZXdsaW5lLgotCi1AaXRlbSBAY29kZXteQHZhcntzdHJpbmcxfV5AdmFye3N0cmluZzJ9Xn0KLVF1aWNrIFN1YnN0aXR1dGlvbi4gIFJlcGVhdCB0aGUgbGFzdCBjb21tYW5kLCByZXBsYWNpbmcgQHZhcntzdHJpbmcxfQotd2l0aCBAdmFye3N0cmluZzJ9LiAgRXF1aXZhbGVudCB0bwotQGNvZGV7ISE6cy9AdmFye3N0cmluZzF9L0B2YXJ7c3RyaW5nMn0vfS4KLQotQGl0ZW0gQGNvZGV7ISN9Ci1UaGUgZW50aXJlIGNvbW1hbmQgbGluZSB0eXBlZCBzbyBmYXIuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgV29yZCBEZXNpZ25hdG9ycwotQHN1YnNlY3Rpb24gV29yZCBEZXNpZ25hdG9ycwotCi1Xb3JkIGRlc2lnbmF0b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBkZXNpcmVkIHdvcmRzIGZyb20gdGhlIGV2ZW50LgotQSBAc2FtcHs6fSBzZXBhcmF0ZXMgdGhlIGV2ZW50IHNwZWNpZmljYXRpb24gZnJvbSB0aGUgd29yZCBkZXNpZ25hdG9yLiAgSXQKLW1heSBiZSBvbWl0dGVkIGlmIHRoZSB3b3JkIGRlc2lnbmF0b3IgYmVnaW5zIHdpdGggYSBAc2FtcHtefSwgQHNhbXB7JH0sCi1Ac2FtcHsqfSwgQHNhbXB7LX0sIG9yIEBzYW1weyV9LiAgV29yZHMgYXJlIG51bWJlcmVkIGZyb20gdGhlIGJlZ2lubmluZwotb2YgdGhlIGxpbmUsIHdpdGggdGhlIGZpcnN0IHdvcmQgYmVpbmcgZGVub3RlZCBieSAwICh6ZXJvKS4gIFdvcmRzIGFyZQotaW5zZXJ0ZWQgaW50byB0aGUgY3VycmVudCBsaW5lIHNlcGFyYXRlZCBieSBzaW5nbGUgc3BhY2VzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gMCAoemVybykKLVRoZSBAY29kZXswfXRoIHdvcmQuICBGb3IgbWFueSBhcHBsaWNhdGlvbnMsIHRoaXMgaXMgdGhlIGNvbW1hbmQgd29yZC4KLQotQGl0ZW0gQHZhcntufQotVGhlIEB2YXJ7bn10aCB3b3JkLgotCi1AaXRlbSBeCi1UaGUgZmlyc3QgYXJndW1lbnQ7IHRoYXQgaXMsIHdvcmQgMS4KLQotQGl0ZW0gJAotVGhlIGxhc3QgYXJndW1lbnQuCi0KLUBpdGVtICUKLVRoZSB3b3JkIG1hdGNoZWQgYnkgdGhlIG1vc3QgcmVjZW50IEBzYW1wez9AdmFye3N0cmluZ30/fSBzZWFyY2guCi0KLUBpdGVtIEB2YXJ7eH0tQHZhcnt5fQotQSByYW5nZSBvZiB3b3JkczsgQHNhbXB7LUB2YXJ7eX19IGFiYnJldmlhdGVzIEBzYW1wezAtQHZhcnt5fX0uCi0KLUBpdGVtICoKLUFsbCBvZiB0aGUgd29yZHMsIGV4Y2VwdCB0aGUgQGNvZGV7MH10aC4gIFRoaXMgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsxLSR9LgotSXQgaXMgbm90IGFuIGVycm9yIHRvIHVzZSBAc2FtcHsqfSBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3b3JkIGluIHRoZSBldmVudDsKLXRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gdGhhdCBjYXNlLgotCi1AaXRlbSBAdmFye3h9KgotQWJicmV2aWF0ZXMgQHNhbXB7QHZhcnt4fS0kfQotCi1AaXRlbSBAdmFye3h9LQotQWJicmV2aWF0ZXMgQHNhbXB7QHZhcnt4fS0kfSBsaWtlIEBzYW1we0B2YXJ7eH0qfSwgYnV0IG9taXRzIHRoZSBsYXN0IHdvcmQuCi0KLUBlbmQgdGFibGUKLQotSWYgYSB3b3JkIGRlc2lnbmF0b3IgaXMgc3VwcGxpZWQgd2l0aG91dCBhbiBldmVudCBzcGVjaWZpY2F0aW9uLCB0aGUKLXByZXZpb3VzIGNvbW1hbmQgaXMgdXNlZCBhcyB0aGUgZXZlbnQuCi0KLUBub2RlIE1vZGlmaWVycwotQHN1YnNlY3Rpb24gTW9kaWZpZXJzCi0KLUFmdGVyIHRoZSBvcHRpb25hbCB3b3JkIGRlc2lnbmF0b3IsIHlvdSBjYW4gYWRkIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUKLW9mIHRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzLCBlYWNoIHByZWNlZGVkIGJ5IGEgQHNhbXB7On0uCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSBoCi1SZW1vdmUgYSB0cmFpbGluZyBwYXRobmFtZSBjb21wb25lbnQsIGxlYXZpbmcgb25seSB0aGUgaGVhZC4KLQotQGl0ZW0gdAotUmVtb3ZlIGFsbCBsZWFkaW5nICBwYXRobmFtZSAgY29tcG9uZW50cywgbGVhdmluZyB0aGUgdGFpbC4KLQotQGl0ZW0gcgotUmVtb3ZlIGEgdHJhaWxpbmcgc3VmZml4IG9mIHRoZSBmb3JtIEBzYW1wey5AdmFye3N1ZmZpeH19LCBsZWF2aW5nCi10aGUgYmFzZW5hbWUuCi0KLUBpdGVtIGUKLVJlbW92ZSBhbGwgYnV0IHRoZSB0cmFpbGluZyBzdWZmaXguCi0KLUBpdGVtIHAKLVByaW50IHRoZSBuZXcgY29tbWFuZCBidXQgZG8gbm90IGV4ZWN1dGUgaXQuCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUBpdGVtIHEKLVF1b3RlIHRoZSBzdWJzdGl0dXRlZCB3b3JkcywgZXNjYXBpbmcgZnVydGhlciBzdWJzdGl0dXRpb25zLgotCi1AaXRlbSB4Ci1RdW90ZSB0aGUgc3Vic3RpdHV0ZWQgd29yZHMgYXMgd2l0aCBAc2FtcHtxfSwKLWJ1dCBicmVhayBpbnRvIHdvcmRzIGF0IHNwYWNlcywgdGFicywgYW5kIG5ld2xpbmVzLgotQGVuZCBpZnNldAotCi1AaXRlbSBzL0B2YXJ7b2xkfS9AdmFye25ld30vCi1TdWJzdGl0dXRlIEB2YXJ7bmV3fSBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQHZhcntvbGR9IGluIHRoZQotZXZlbnQgbGluZS4gIEFueSBkZWxpbWl0ZXIgbWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgQHNhbXB7L30uCi1UaGUgZGVsaW1pdGVyIG1heSBiZSBxdW90ZWQgaW4gQHZhcntvbGR9IGFuZCBAdmFye25ld30KLXdpdGggYSBzaW5nbGUgYmFja3NsYXNoLiAgSWYgQHNhbXB7Jn0gYXBwZWFycyBpbiBAdmFye25ld30sCi1pdCBpcyByZXBsYWNlZCBieSBAdmFye29sZH0uICBBIHNpbmdsZSBiYWNrc2xhc2ggd2lsbCBxdW90ZQotdGhlIEBzYW1weyZ9LiAgVGhlIGZpbmFsIGRlbGltaXRlciBpcyBvcHRpb25hbCBpZiBpdCBpcyB0aGUgbGFzdAotY2hhcmFjdGVyIG9uIHRoZSBpbnB1dCBsaW5lLgotCi1AaXRlbSAmCi1SZXBlYXQgdGhlIHByZXZpb3VzIHN1YnN0aXR1dGlvbi4KLQotQGl0ZW0gZwotQ2F1c2UgY2hhbmdlcyB0byBiZSBhcHBsaWVkIG92ZXIgdGhlIGVudGlyZSBldmVudCBsaW5lLiAgVXNlZCBpbgotY29uanVuY3Rpb24gd2l0aCBAc2FtcHtzfSwgYXMgaW4gQGNvZGV7Z3MvQHZhcntvbGR9L0B2YXJ7bmV3fS99LAotb3Igd2l0aCBAc2FtcHsmfS4KLQotQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL2luYy1oaXN0LnRleGluZm8gYi9yZWFkbGluZS9kb2MvaW5jLWhpc3QudGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NzRiNy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9kb2MvaW5jLWhpc3QudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi1AaWdub3JlCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgR05VIEhpc3RvcnkgbGlicmFyeS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkxLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQXV0aG9yZWQgYnkgQnJpYW4gRm94IGFuZCBDaGV0IFJhbWV5LgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBtYW51YWwKLXByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFyZSBwcmVzZXJ2ZWQgb24KLWFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbiBub3RpY2UKLWlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoICh0aGlzCi1wYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0IHRoZQotR05VIENvcHlyaWdodCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIHRvIHRoZSBkaXN0cmlidXRlZSwgYW5kIHByb3ZpZGVkIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgVXNpbmcgSGlzdG9yeSBJbnRlcmFjdGl2ZWx5Ci1AY2hhcHRlciBVc2luZyBIaXN0b3J5IEludGVyYWN0aXZlbHkKLQotQGlmc2V0IEJhc2hGZWF0dXJlcwotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBob3cgdG8gdXNlIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5IGludGVyYWN0aXZlbHksCi1mcm9tIGEgdXNlcidzIHN0YW5kcG9pbnQuICBJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHVzZXIncyBndWlkZS4gIEZvcgotaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgaW4gb3RoZXIgcHJvZ3JhbXMsCi1zZWUgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IE1hbnVhbC4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJhc2hGZWF0dXJlcwotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBob3cgdG8gdXNlIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5IGludGVyYWN0aXZlbHksCi1mcm9tIGEgdXNlcidzIHN0YW5kcG9pbnQuICBJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHVzZXIncyBndWlkZS4gIAotQGMgRm9yCi1AYyBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgR05VIEhpc3RvcnkgTGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtcywKLUBjIEBweHJlZntQcm9ncmFtbWluZyB3aXRoIEdOVSBIaXN0b3J5fS4KLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1AbWVudQotKiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllczo6CUhvdyBCYXNoIGxldHMgeW91IG1hbmlwdWxhdGUgeW91ciBjb21tYW5kCi0JCQkJaGlzdG9yeS4KLSogQmFzaCBIaXN0b3J5IEJ1aWx0aW5zOjoJVGhlIEJhc2ggYnVpbHRpbiBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUKLQkJCQl0aGUgY29tbWFuZCBoaXN0b3J5LgotKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KLUBlbmQgbWVudQotQGVuZCBpZnNldAotQGlmY2xlYXIgQmFzaEZlYXR1cmVzCi1AbWVudQotKiBIaXN0b3J5IEludGVyYWN0aW9uOjoJCVdoYXQgaXQgZmVlbHMgbGlrZSB1c2luZyBIaXN0b3J5IGFzIGEgdXNlci4KLUBlbmQgbWVudQotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUBub2RlIEJhc2ggSGlzdG9yeSBGYWNpbGl0aWVzCi1Ac2VjdGlvbiBCYXNoIEhpc3RvcnkgRmFjaWxpdGllcwotQGNpbmRleCBjb21tYW5kIGhpc3RvcnkKLUBjaW5kZXggaGlzdG9yeSBsaXN0Ci0KLVdoZW4gdGhlIEBzYW1wey1vIGhpc3Rvcnl9IG9wdGlvbiB0byB0aGUgQGNvZGV7c2V0fSBidWlsdGluCi1pcyBlbmFibGVkIChAcHhyZWZ7VGhlIFNldCBCdWlsdGlufSksCi10aGUgc2hlbGwgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBAdmFye2NvbW1hbmQgaGlzdG9yeX0sCi10aGUgbGlzdCBvZiBjb21tYW5kcyBwcmV2aW91c2x5IHR5cGVkLiAgVGhlIHRleHQgb2YgdGhlIGxhc3QKLUBjb2Rle0hJU1RTSVpFfQotY29tbWFuZHMgKGRlZmF1bHQgNTAwKSBpcyBzYXZlZCBpbiBhIGhpc3RvcnkgbGlzdC4gIFRoZSBzaGVsbAotc3RvcmVzIGVhY2ggY29tbWFuZCBpbiB0aGUgaGlzdG9yeSBsaXN0IHByaW9yIHRvIHBhcmFtZXRlciBhbmQKLXZhcmlhYmxlIGV4cGFuc2lvbgotYnV0IGFmdGVyIGhpc3RvcnkgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCwgc3ViamVjdCB0byB0aGUKLXZhbHVlcyBvZiB0aGUgc2hlbGwgdmFyaWFibGVzCi1AY29kZXtISVNUSUdOT1JFfSBhbmQgQGNvZGV7SElTVENPTlRST0x9LgotV2hlbiB0aGUgc2hlbGwgc3RhcnRzIHVwLCB0aGUgaGlzdG9yeSBpcyBpbml0aWFsaXplZCBmcm9tIHRoZQotZmlsZSBuYW1lZCBieSB0aGUgQGNvZGV7SElTVEZJTEV9IHZhcmlhYmxlIChkZWZhdWx0IEBmaWxle34vLmJhc2hfaGlzdG9yeX0pLgotQGNvZGV7SElTVEZJTEV9IGlzIHRydW5jYXRlZCwgaWYgbmVjZXNzYXJ5LCB0byBjb250YWluIG5vIG1vcmUgdGhhbgotdGhlIG51bWJlciBvZiBsaW5lcyBzcGVjaWZpZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtISVNURklMRVNJWkV9Ci12YXJpYWJsZS4gIFdoZW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwgZXhpdHMsIHRoZSBsYXN0Ci1AY29kZXtISVNUU0laRX0gbGluZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBoaXN0b3J5IGxpc3QgdG8gQGNvZGV7SElTVEZJTEV9LgotSWYgdGhlIEBjb2Rle2hpc3RhcHBlbmR9IHNoZWxsIG9wdGlvbiBpcyBzZXQgKEBweHJlZntCYXNoIEJ1aWx0aW5zfSksCi10aGUgbGluZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBoaXN0b3J5IGZpbGUsCi1vdGhlcndpc2UgdGhlIGhpc3RvcnkgZmlsZSBpcyBvdmVyd3JpdHRlbi4KLUlmIEBjb2Rle0hJU1RGSUxFfQotaXMgdW5zZXQsIG9yIGlmIHRoZSBoaXN0b3J5IGZpbGUgaXMgdW53cml0YWJsZSwgdGhlIGhpc3RvcnkgaXMKLW5vdCBzYXZlZC4gIEFmdGVyIHNhdmluZyB0aGUgaGlzdG9yeSwgdGhlIGhpc3RvcnkgZmlsZSBpcyB0cnVuY2F0ZWQKLXRvIGNvbnRhaW4gbm8gbW9yZSB0aGFuIEBjb2RleyRISVNURklMRVNJWkV9Ci1saW5lcy4gIElmIEBjb2Rle0hJU1RGSUxFU0laRX0gaXMgbm90IHNldCwgbm8gdHJ1bmNhdGlvbiBpcyBwZXJmb3JtZWQuCi0KLVRoZSBidWlsdGluIGNvbW1hbmQgQGNvZGV7ZmN9IG1heSBiZSB1c2VkIHRvIGxpc3Qgb3IgZWRpdCBhbmQgcmUtZXhlY3V0ZQotYSBwb3J0aW9uIG9mIHRoZSBoaXN0b3J5IGxpc3QuCi1UaGUgQGNvZGV7aGlzdG9yeX0gYnVpbHRpbiBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IG9yIG1vZGlmeSB0aGUgaGlzdG9yeQotbGlzdCBhbmQgbWFuaXB1bGF0ZSB0aGUgaGlzdG9yeSBmaWxlLgotV2hlbiB1c2luZyB0aGUgY29tbWFuZC1saW5lIGVkaXRpbmcsIHNlYXJjaCBjb21tYW5kcwotYXJlIGF2YWlsYWJsZSBpbiBlYWNoIGVkaXRpbmcgbW9kZSB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZQotaGlzdG9yeSBsaXN0LgotCi1UaGUgc2hlbGwgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGljaCBjb21tYW5kcyBhcmUgc2F2ZWQgb24gdGhlIGhpc3RvcnkKLWxpc3QuICBUaGUgQGNvZGV7SElTVENPTlRST0x9IGFuZCBAY29kZXtISVNUSUdOT1JFfQotdmFyaWFibGVzIG1heSBiZSBzZXQgdG8gY2F1c2UgdGhlIHNoZWxsIHRvIHNhdmUgb25seSBhIHN1YnNldCBvZiB0aGUKLWNvbW1hbmRzIGVudGVyZWQuCi1UaGUgQGNvZGV7Y21kaGlzdH0KLXNoZWxsIG9wdGlvbiwgaWYgZW5hYmxlZCwgY2F1c2VzIHRoZSBzaGVsbCB0byBhdHRlbXB0IHRvIHNhdmUgZWFjaAotbGluZSBvZiBhIG11bHRpLWxpbmUgY29tbWFuZCBpbiB0aGUgc2FtZSBoaXN0b3J5IGVudHJ5LCBhZGRpbmcKLXNlbWljb2xvbnMgd2hlcmUgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIHN5bnRhY3RpYyBjb3JyZWN0bmVzcy4KLVRoZSBAY29kZXtsaXRoaXN0fQotc2hlbGwgb3B0aW9uIGNhdXNlcyB0aGUgc2hlbGwgdG8gc2F2ZSB0aGUgY29tbWFuZCB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzCi1pbnN0ZWFkIG9mIHNlbWljb2xvbnMuCi1AeHJlZntCYXNoIEJ1aWx0aW5zfSwgZm9yIGEgZGVzY3JpcHRpb24gb2YgQGNvZGV7c2hvcHR9LgotCi1Abm9kZSBCYXNoIEhpc3RvcnkgQnVpbHRpbnMKLUBzZWN0aW9uIEJhc2ggSGlzdG9yeSBCdWlsdGlucwotQGNpbmRleCBoaXN0b3J5IGJ1aWx0aW5zCi0KLUJhc2ggcHJvdmlkZXMgdHdvIGJ1aWx0aW4gY29tbWFuZHMgdGhhdCBhbGxvdyB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUKLWhpc3RvcnkgbGlzdCBhbmQgaGlzdG9yeSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gZmMKLUBjIGJ0aW5kZXggZmMKLUBleGFtcGxlCi1AY29kZXtmYyBbLWUgQHZhcntlbmFtZX1dIFstbmxyXSBbQHZhcntmaXJzdH1dIFtAdmFye2xhc3R9XX0KLUBjb2Rle2ZjIC1zIFtAdmFye3BhdH09QHZhcntyZXB9XSBbQHZhcntjb21tYW5kfV19Ci1AZW5kIGV4YW1wbGUKLQotRml4IENvbW1hbmQuICBJbiB0aGUgZmlyc3QgZm9ybSwgYSByYW5nZSBvZiBjb21tYW5kcyBmcm9tIEB2YXJ7Zmlyc3R9IHRvCi1AdmFye2xhc3R9IGlzIHNlbGVjdGVkIGZyb20gdGhlIGhpc3RvcnkgbGlzdC4gIEJvdGggQHZhcntmaXJzdH0gYW5kCi1AdmFye2xhc3R9IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHRvIGxvY2F0ZSB0aGUgbW9zdCByZWNlbnQKLWNvbW1hbmQgYmVnaW5uaW5nIHdpdGggdGhhdCBzdHJpbmcpIG9yIGFzIGEgbnVtYmVyIChhbiBpbmRleCBpbnRvIHRoZQotaGlzdG9yeSBsaXN0LCB3aGVyZSBhIG5lZ2F0aXZlIG51bWJlciBpcyB1c2VkIGFzIGFuIG9mZnNldCBmcm9tIHRoZQotY3VycmVudCBjb21tYW5kIG51bWJlcikuICBJZiBAdmFye2xhc3R9IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgc2V0IHRvCi1AdmFye2ZpcnN0fS4gIElmIEB2YXJ7Zmlyc3R9IGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgc2V0IHRvIHRoZSBwcmV2aW91cwotY29tbWFuZCBmb3IgZWRpdGluZyBhbmQgQG1pbnVze30xNiBmb3IgbGlzdGluZy4gIElmIHRoZSBAc2FtcHstbH0gZmxhZyBpcwotZ2l2ZW4sIHRoZSBjb21tYW5kcyBhcmUgbGlzdGVkIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBAc2FtcHstbn0gZmxhZwotc3VwcHJlc3NlcyB0aGUgY29tbWFuZCBudW1iZXJzIHdoZW4gbGlzdGluZy4gIFRoZSBAc2FtcHstcn0gZmxhZwotcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBsaXN0aW5nLiAgT3RoZXJ3aXNlLCB0aGUgZWRpdG9yIGdpdmVuIGJ5Ci1AdmFye2VuYW1lfSBpcyBpbnZva2VkIG9uIGEgZmlsZSBjb250YWluaW5nIHRob3NlIGNvbW1hbmRzLiAgSWYKLUB2YXJ7ZW5hbWV9IGlzIG5vdCBnaXZlbiwgdGhlIHZhbHVlIG9mIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZXhwYW5zaW9uCi1pcyB1c2VkOiBAY29kZXskQHtGQ0VESVQ6LSRAe0VESVRPUjotdmlAfUB9fS4gIFRoaXMgc2F5cyB0byB1c2UgdGhlCi12YWx1ZSBvZiB0aGUgQGNvZGV7RkNFRElUfSB2YXJpYWJsZSBpZiBzZXQsIG9yIHRoZSB2YWx1ZSBvZiB0aGUKLUBjb2Rle0VESVRPUn0gdmFyaWFibGUgaWYgdGhhdCBpcyBzZXQsIG9yIEBjb2Rle3ZpfSBpZiBuZWl0aGVyIGlzIHNldC4KLVdoZW4gZWRpdGluZyBpcyBjb21wbGV0ZSwgdGhlIGVkaXRlZCBjb21tYW5kcyBhcmUgZWNob2VkIGFuZCBleGVjdXRlZC4KLQotSW4gdGhlIHNlY29uZCBmb3JtLCBAdmFye2NvbW1hbmR9IGlzIHJlLWV4ZWN1dGVkIGFmdGVyIGVhY2ggaW5zdGFuY2UKLW9mIEB2YXJ7cGF0fSBpbiB0aGUgc2VsZWN0ZWQgY29tbWFuZCBpcyByZXBsYWNlZCBieSBAdmFye3JlcH0uCi0KLUEgdXNlZnVsIGFsaWFzIHRvIHVzZSB3aXRoIHRoZSBAY29kZXtmY30gY29tbWFuZCBpcyBAY29kZXtyPSdmYyAtcyd9LCBzbwotdGhhdCB0eXBpbmcgQHNhbXB7ciBjY30gcnVucyB0aGUgbGFzdCBjb21tYW5kIGJlZ2lubmluZyB3aXRoIEBjb2Rle2NjfQotYW5kIHR5cGluZyBAc2FtcHtyfSByZS1leGVjdXRlcyB0aGUgbGFzdCBjb21tYW5kIChAcHhyZWZ7QWxpYXNlc30pLgotCi1AaXRlbSBoaXN0b3J5Ci1AYyBidGluZGV4IGhpc3RvcnkKLUBleGFtcGxlCi1oaXN0b3J5IFstY10gW0B2YXJ7bn1dCi1oaXN0b3J5IFstYW5yd10gW0B2YXJ7ZmlsZW5hbWV9XQotaGlzdG9yeSAtcHMgQHZhcnthcmd9Ci1AZW5kIGV4YW1wbGUKLQotRGlzcGxheSB0aGUgaGlzdG9yeSBsaXN0IHdpdGggbGluZSBudW1iZXJzLiAgTGluZXMgcHJlZml4ZWQgd2l0aAotd2l0aCBhIEBzYW1weyp9IGhhdmUgYmVlbiBtb2RpZmllZC4gIEFuIGFyZ3VtZW50IG9mIEB2YXJ7bn0gc2F5cwotdG8gbGlzdCBvbmx5IHRoZSBsYXN0IEB2YXJ7bn0gbGluZXMuICBPcHRpb25zLCBpZiBzdXBwbGllZCwgaGF2ZQotdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtdwotV3JpdGUgb3V0IHRoZSBjdXJyZW50IGhpc3RvcnkgdG8gdGhlIGhpc3RvcnkgZmlsZS4KLQotQGl0ZW0gLXIKLVJlYWQgdGhlIGN1cnJlbnQgaGlzdG9yeSBmaWxlIGFuZCBhcHBlbmQgaXRzIGNvbnRlbnRzIHRvCi10aGUgaGlzdG9yeSBsaXN0LgotCi1AaXRlbSAtYQotQXBwZW5kIHRoZSBuZXcKLWhpc3RvcnkgbGluZXMgKGhpc3RvcnkgbGluZXMgZW50ZXJlZCBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZQotY3VycmVudCBCYXNoIHNlc3Npb24pIHRvIHRoZSBoaXN0b3J5IGZpbGUuCi0KLUBpdGVtIC1uCi1BcHBlbmQgdGhlIGhpc3RvcnkgbGluZXMgbm90IGFscmVhZHkgcmVhZCBmcm9tIHRoZSBoaXN0b3J5IGZpbGUKLXRvIHRoZSBjdXJyZW50IGhpc3RvcnkgbGlzdC4gIFRoZXNlIGFyZSBsaW5lcyBhcHBlbmRlZCB0byB0aGUgaGlzdG9yeQotZmlsZSBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IEJhc2ggc2Vzc2lvbi4KLQotQGl0ZW0gLWMKLUNsZWFyIHRoZSBoaXN0b3J5IGxpc3QuICBUaGlzIG1heSBiZSBjb21iaW5lZAotd2l0aCB0aGUgb3RoZXIgb3B0aW9ucyB0byByZXBsYWNlIHRoZSBoaXN0b3J5IGxpc3QgY29tcGxldGVseS4KLQotQGl0ZW0gLXMKLVRoZSBAdmFye2FyZ31zIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mCi10aGUgaGlzdG9yeSBsaXN0IGFzIGEgc2luZ2xlIGVudHJ5LgotCi1AaXRlbSAtcAotUGVyZm9ybSBoaXN0b3J5IHN1YnN0aXR1dGlvbiBvbiB0aGUgQHZhcnthcmd9cyBhbmQgZGlzcGxheSB0aGUgcmVzdWx0Ci1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLUBlbmQgdGFibGUKLQotV2hlbiB0aGUgQHNhbXB7LXd9LCBAc2FtcHstcn0sIEBzYW1wey1hfSwgb3IgQHNhbXB7LW59IG9wdGlvbiBpcwotdXNlZCwgaWYgQHZhcntmaWxlbmFtZX0KLWlzIGdpdmVuLCB0aGVuIGl0IGlzIHVzZWQgYXMgdGhlIGhpc3RvcnkgZmlsZS4gIElmIG5vdCwgdGhlbgotdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtISVNURklMRX0gdmFyaWFibGUgaXMgdXNlZC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1Abm9kZSBIaXN0b3J5IEludGVyYWN0aW9uCi1Ac2VjdGlvbiBIaXN0b3J5IEV4cGFuc2lvbgotQGNpbmRleCBoaXN0b3J5IGV4cGFuc2lvbgotCi1UaGUgSGlzdG9yeSBsaWJyYXJ5IHByb3ZpZGVzIGEgaGlzdG9yeSBleHBhbnNpb24gZmVhdHVyZSB0aGF0IGlzIHNpbWlsYXIKLXRvIHRoZSBoaXN0b3J5IGV4cGFuc2lvbiBwcm92aWRlZCBieSBAY29kZXtjc2h9LiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlIHN5bnRheCB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGhpc3RvcnkgaW5mb3JtYXRpb24uCi0KLUhpc3RvcnkgZXhwYW5zaW9ucyBpbnRyb2R1Y2Ugd29yZHMgZnJvbSB0aGUgaGlzdG9yeSBsaXN0IGludG8KLXRoZSBpbnB1dCBzdHJlYW0sIG1ha2luZyBpdCBlYXN5IHRvIHJlcGVhdCBjb21tYW5kcywgaW5zZXJ0IHRoZQotYXJndW1lbnRzIHRvIGEgcHJldmlvdXMgY29tbWFuZCBpbnRvIHRoZSBjdXJyZW50IGlucHV0IGxpbmUsIG9yCi1maXggZXJyb3JzIGluIHByZXZpb3VzIGNvbW1hbmRzIHF1aWNrbHkuCi0KLUhpc3RvcnkgZXhwYW5zaW9uIHRha2VzIHBsYWNlIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBpcyB0byBkZXRlcm1pbmUKLXdoaWNoIGxpbmUgZnJvbSB0aGUgaGlzdG9yeSBsaXN0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBzdWJzdGl0dXRpb24uCi1UaGUgc2Vjb25kIGlzIHRvIHNlbGVjdCBwb3J0aW9ucyBvZiB0aGF0IGxpbmUgZm9yIGluY2x1c2lvbiBpbnRvIHRoZQotY3VycmVudCBvbmUuICBUaGUgbGluZSBzZWxlY3RlZCBmcm9tIHRoZSBoaXN0b3J5IGlzIGNhbGxlZCB0aGUKLUBkZm57ZXZlbnR9LCBhbmQgdGhlIHBvcnRpb25zIG9mIHRoYXQgbGluZSB0aGF0IGFyZSBhY3RlZCB1cG9uIGFyZQotY2FsbGVkIEBkZm57d29yZHN9LiAgVmFyaW91cyBAZGZue21vZGlmaWVyc30gYXJlIGF2YWlsYWJsZSB0byBtYW5pcHVsYXRlCi10aGUgc2VsZWN0ZWQgd29yZHMuICBUaGUgbGluZSBpcyBicm9rZW4gaW50byB3b3JkcyBpbiB0aGUgc2FtZSBmYXNoaW9uCi10aGF0IEJhc2ggZG9lcywgc28gdGhhdCBzZXZlcmFsIHdvcmRzCi1zdXJyb3VuZGVkIGJ5IHF1b3RlcyBhcmUgY29uc2lkZXJlZCBvbmUgd29yZC4KLUhpc3RvcnkgZXhwYW5zaW9ucyBhcmUgaW50cm9kdWNlZCBieSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUKLWhpc3RvcnkgZXhwYW5zaW9uIGNoYXJhY3Rlciwgd2hpY2ggaXMgQHNhbXB7IX0gYnkgZGVmYXVsdC4KLUBpZnNldCBCYXNoRmVhdHVyZXMKLU9ubHkgQHNhbXB7XH0gYW5kIEBzYW1weyd9IG1heSBiZSB1c2VkIHRvIGVzY2FwZSB0aGUgaGlzdG9yeSBleHBhbnNpb24KLWNoYXJhY3Rlci4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEJhc2hGZWF0dXJlcwotU2V2ZXJhbCBzaGVsbCBvcHRpb25zIHNldHRhYmxlIHdpdGggdGhlIEBjb2Rle3Nob3B0fQotYnVpbHRpbiAoQHB4cmVme0Jhc2ggQnVpbHRpbnN9KSBtYXkgYmUgdXNlZCB0byB0YWlsb3IKLXRoZSBiZWhhdmlvciBvZiBoaXN0b3J5IGV4cGFuc2lvbi4gIElmIHRoZQotQGNvZGV7aGlzdHZlcmlmeX0gc2hlbGwgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBSZWFkbGluZQotaXMgYmVpbmcgdXNlZCwgaGlzdG9yeSBzdWJzdGl0dXRpb25zIGFyZSBub3QgaW1tZWRpYXRlbHkgcGFzc2VkIHRvCi10aGUgc2hlbGwgcGFyc2VyLgotSW5zdGVhZCwgdGhlIGV4cGFuZGVkIGxpbmUgaXMgcmVsb2FkZWQgaW50byB0aGUgUmVhZGxpbmUKLWVkaXRpbmcgYnVmZmVyIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbi4KLUlmIFJlYWRsaW5lIGlzIGJlaW5nIHVzZWQsIGFuZCB0aGUgQGNvZGV7aGlzdHJlZWRpdH0KLXNoZWxsIG9wdGlvbiBpcyBlbmFibGVkLCBhIGZhaWxlZCBoaXN0b3J5IGV4cGFuc2lvbiB3aWxsIGJlCi1yZWxvYWRlZCBpbnRvIHRoZSBSZWFkbGluZSBlZGl0aW5nIGJ1ZmZlciBmb3IgY29ycmVjdGlvbi4KLVRoZSBAc2FtcHstcH0gb3B0aW9uIHRvIHRoZSBAY29kZXtoaXN0b3J5fSBidWlsdGluIGNvbW1hbmQKLW1heSBiZSB1c2VkIHRvIHNlZSB3aGF0IGEgaGlzdG9yeSBleHBhbnNpb24gd2lsbCBkbyBiZWZvcmUgdXNpbmcgaXQuCi1UaGUgQHNhbXB7LXN9IG9wdGlvbiB0byB0aGUgQGNvZGV7aGlzdG9yeX0gYnVpbHRpbiBtYXkgYmUgdXNlZCB0bwotYWRkIGNvbW1hbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgbGlzdCB3aXRob3V0IGFjdHVhbGx5IGV4ZWN1dGluZwotdGhlbSwgc28gdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIHN1YnNlcXVlbnQgcmVjYWxsLgotVGhpcyBpcyBtb3N0IHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIFJlYWRsaW5lLgotCi1UaGUgc2hlbGwgYWxsb3dzIGNvbnRyb2wgb2YgdGhlIHZhcmlvdXMgY2hhcmFjdGVycyB1c2VkIGJ5IHRoZQotaGlzdG9yeSBleHBhbnNpb24gbWVjaGFuaXNtIHdpdGggdGhlIEBjb2Rle2hpc3RjaGFyc30gdmFyaWFibGUuCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIEV2ZW50IERlc2lnbmF0b3JzOjoJSG93IHRvIHNwZWNpZnkgd2hpY2ggaGlzdG9yeSBsaW5lIHRvIHVzZS4KLSogV29yZCBEZXNpZ25hdG9yczo6CVNwZWNpZnlpbmcgd2hpY2ggd29yZHMgYXJlIG9mIGludGVyZXN0LgotKiBNb2RpZmllcnM6OgkJTW9kaWZ5aW5nIHRoZSByZXN1bHRzIG9mIHN1YnN0aXR1dGlvbi4KLUBlbmQgbWVudQotCi1Abm9kZSBFdmVudCBEZXNpZ25hdG9ycwotQHN1YnNlY3Rpb24gRXZlbnQgRGVzaWduYXRvcnMKLUBjaW5kZXggZXZlbnQgZGVzaWduYXRvcnMKLQotQW4gZXZlbnQgZGVzaWduYXRvciBpcyBhIHJlZmVyZW5jZSB0byBhIGNvbW1hbmQgbGluZSBlbnRyeSBpbiB0aGUKLWhpc3RvcnkgbGlzdC4KLUBjaW5kZXggaGlzdG9yeSBldmVudHMKLQotQHRhYmxlIEBhc2lzCi0KLUBpdGVtIEBjb2RleyF9Ci1TdGFydCBhIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLCBleGNlcHQgd2hlbiBmb2xsb3dlZCBieSBhIHNwYWNlLCB0YWIsCi10aGUgZW5kIG9mIHRoZSBsaW5lLCBAc2FtcHs9fSBvciBAc2FtcHsofS4KLQotQGl0ZW0gQGNvZGV7IUB2YXJ7bn19Ci1SZWZlciB0byBjb21tYW5kIGxpbmUgQHZhcntufS4KLQotQGl0ZW0gQGNvZGV7IS1AdmFye259fQotUmVmZXIgdG8gdGhlIGNvbW1hbmQgQHZhcntufSBsaW5lcyBiYWNrLgotCi1AaXRlbSBAY29kZXshIX0KLVJlZmVyIHRvIHRoZSBwcmV2aW91cyBjb21tYW5kLiAgVGhpcyBpcyBhIHN5bm9ueW0gZm9yIEBzYW1weyEtMX0uCi0KLUBpdGVtIEBjb2RleyFAdmFye3N0cmluZ319Ci1SZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoIEB2YXJ7c3RyaW5nfS4KLQotQGl0ZW0gQGNvZGV7IT9AdmFye3N0cmluZ31bP119Ci1SZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBjb250YWluaW5nIEB2YXJ7c3RyaW5nfS4gIFRoZSB0cmFpbGluZwotQHNhbXB7P30gbWF5IGJlIG9taXR0ZWQgaWYgdGhlIEB2YXJ7c3RyaW5nfSBpcyBmb2xsb3dlZCBpbW1lZGlhdGVseSBieQotYSBuZXdsaW5lLgotCi1AaXRlbSBAY29kZXteQHZhcntzdHJpbmcxfV5AdmFye3N0cmluZzJ9Xn0KLVF1aWNrIFN1YnN0aXR1dGlvbi4gIFJlcGVhdCB0aGUgbGFzdCBjb21tYW5kLCByZXBsYWNpbmcgQHZhcntzdHJpbmcxfQotd2l0aCBAdmFye3N0cmluZzJ9LiAgRXF1aXZhbGVudCB0bwotQGNvZGV7ISE6cy9AdmFye3N0cmluZzF9L0B2YXJ7c3RyaW5nMn0vfS4KLQotQGl0ZW0gQGNvZGV7ISN9Ci1UaGUgZW50aXJlIGNvbW1hbmQgbGluZSB0eXBlZCBzbyBmYXIuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgV29yZCBEZXNpZ25hdG9ycwotQHN1YnNlY3Rpb24gV29yZCBEZXNpZ25hdG9ycwotCi1Xb3JkIGRlc2lnbmF0b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBkZXNpcmVkIHdvcmRzIGZyb20gdGhlIGV2ZW50LgotQSBAc2FtcHs6fSBzZXBhcmF0ZXMgdGhlIGV2ZW50IHNwZWNpZmljYXRpb24gZnJvbSB0aGUgd29yZCBkZXNpZ25hdG9yLiAgSXQKLW1heSBiZSBvbWl0dGVkIGlmIHRoZSB3b3JkIGRlc2lnbmF0b3IgYmVnaW5zIHdpdGggYSBAc2FtcHtefSwgQHNhbXB7JH0sCi1Ac2FtcHsqfSwgQHNhbXB7LX0sIG9yIEBzYW1weyV9LiAgV29yZHMgYXJlIG51bWJlcmVkIGZyb20gdGhlIGJlZ2lubmluZwotb2YgdGhlIGxpbmUsIHdpdGggdGhlIGZpcnN0IHdvcmQgYmVpbmcgZGVub3RlZCBieSAwICh6ZXJvKS4gIFdvcmRzIGFyZQotaW5zZXJ0ZWQgaW50byB0aGUgY3VycmVudCBsaW5lIHNlcGFyYXRlZCBieSBzaW5nbGUgc3BhY2VzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gMCAoemVybykKLVRoZSBAY29kZXswfXRoIHdvcmQuICBGb3IgbWFueSBhcHBsaWNhdGlvbnMsIHRoaXMgaXMgdGhlIGNvbW1hbmQgd29yZC4KLQotQGl0ZW0gQHZhcntufQotVGhlIEB2YXJ7bn10aCB3b3JkLgotCi1AaXRlbSBeCi1UaGUgZmlyc3QgYXJndW1lbnQ7IHRoYXQgaXMsIHdvcmQgMS4KLQotQGl0ZW0gJAotVGhlIGxhc3QgYXJndW1lbnQuCi0KLUBpdGVtICUKLVRoZSB3b3JkIG1hdGNoZWQgYnkgdGhlIG1vc3QgcmVjZW50IEBzYW1wez9AdmFye3N0cmluZ30/fSBzZWFyY2guCi0KLUBpdGVtIEB2YXJ7eH0tQHZhcnt5fQotQSByYW5nZSBvZiB3b3JkczsgQHNhbXB7LUB2YXJ7eX19IGFiYnJldmlhdGVzIEBzYW1wezAtQHZhcnt5fX0uCi0KLUBpdGVtICoKLUFsbCBvZiB0aGUgd29yZHMsIGV4Y2VwdCB0aGUgQGNvZGV7MH10aC4gIFRoaXMgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsxLSR9LgotSXQgaXMgbm90IGFuIGVycm9yIHRvIHVzZSBAc2FtcHsqfSBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3b3JkIGluIHRoZSBldmVudDsKLXRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gdGhhdCBjYXNlLgotCi1AaXRlbSBAdmFye3h9KgotQWJicmV2aWF0ZXMgQHNhbXB7QHZhcnt4fS0kfQotCi1AaXRlbSBAdmFye3h9LQotQWJicmV2aWF0ZXMgQHNhbXB7QHZhcnt4fS0kfSBsaWtlIEBzYW1we0B2YXJ7eH0qfSwgYnV0IG9taXRzIHRoZSBsYXN0IHdvcmQuCi0KLUBlbmQgdGFibGUKLQotSWYgYSB3b3JkIGRlc2lnbmF0b3IgaXMgc3VwcGxpZWQgd2l0aG91dCBhbiBldmVudCBzcGVjaWZpY2F0aW9uLCB0aGUKLXByZXZpb3VzIGNvbW1hbmQgaXMgdXNlZCBhcyB0aGUgZXZlbnQuCi0KLUBub2RlIE1vZGlmaWVycwotQHN1YnNlY3Rpb24gTW9kaWZpZXJzCi0KLUFmdGVyIHRoZSBvcHRpb25hbCB3b3JkIGRlc2lnbmF0b3IsIHlvdSBjYW4gYWRkIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUKLW9mIHRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzLCBlYWNoIHByZWNlZGVkIGJ5IGEgQHNhbXB7On0uCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSBoCi1SZW1vdmUgYSB0cmFpbGluZyBwYXRobmFtZSBjb21wb25lbnQsIGxlYXZpbmcgb25seSB0aGUgaGVhZC4KLQotQGl0ZW0gdAotUmVtb3ZlIGFsbCBsZWFkaW5nICBwYXRobmFtZSAgY29tcG9uZW50cywgbGVhdmluZyB0aGUgdGFpbC4KLQotQGl0ZW0gcgotUmVtb3ZlIGEgdHJhaWxpbmcgc3VmZml4IG9mIHRoZSBmb3JtIEBzYW1wey5AdmFye3N1ZmZpeH19LCBsZWF2aW5nCi10aGUgYmFzZW5hbWUuCi0KLUBpdGVtIGUKLVJlbW92ZSBhbGwgYnV0IHRoZSB0cmFpbGluZyBzdWZmaXguCi0KLUBpdGVtIHAKLVByaW50IHRoZSBuZXcgY29tbWFuZCBidXQgZG8gbm90IGV4ZWN1dGUgaXQuCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUBpdGVtIHEKLVF1b3RlIHRoZSBzdWJzdGl0dXRlZCB3b3JkcywgZXNjYXBpbmcgZnVydGhlciBzdWJzdGl0dXRpb25zLgotCi1AaXRlbSB4Ci1RdW90ZSB0aGUgc3Vic3RpdHV0ZWQgd29yZHMgYXMgd2l0aCBAc2FtcHtxfSwKLWJ1dCBicmVhayBpbnRvIHdvcmRzIGF0IHNwYWNlcywgdGFicywgYW5kIG5ld2xpbmVzLgotQGVuZCBpZnNldAotCi1AaXRlbSBzL0B2YXJ7b2xkfS9AdmFye25ld30vCi1TdWJzdGl0dXRlIEB2YXJ7bmV3fSBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQHZhcntvbGR9IGluIHRoZQotZXZlbnQgbGluZS4gIEFueSBkZWxpbWl0ZXIgbWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgQHNhbXB7L30uCi1UaGUgZGVsaW1pdGVyIG1heSBiZSBxdW90ZWQgaW4gQHZhcntvbGR9IGFuZCBAdmFye25ld30KLXdpdGggYSBzaW5nbGUgYmFja3NsYXNoLiAgSWYgQHNhbXB7Jn0gYXBwZWFycyBpbiBAdmFye25ld30sCi1pdCBpcyByZXBsYWNlZCBieSBAdmFye29sZH0uICBBIHNpbmdsZSBiYWNrc2xhc2ggd2lsbCBxdW90ZQotdGhlIEBzYW1weyZ9LiAgVGhlIGZpbmFsIGRlbGltaXRlciBpcyBvcHRpb25hbCBpZiBpdCBpcyB0aGUgbGFzdAotY2hhcmFjdGVyIG9uIHRoZSBpbnB1dCBsaW5lLgotCi1AaXRlbSAmCi1SZXBlYXQgdGhlIHByZXZpb3VzIHN1YnN0aXR1dGlvbi4KLQotQGl0ZW0gZwotQ2F1c2UgY2hhbmdlcyB0byBiZSBhcHBsaWVkIG92ZXIgdGhlIGVudGlyZSBldmVudCBsaW5lLiAgVXNlZCBpbgotY29uanVuY3Rpb24gd2l0aCBAc2FtcHtzfSwgYXMgaW4gQGNvZGV7Z3MvQHZhcntvbGR9L0B2YXJ7bmV3fS99LAotb3Igd2l0aCBAc2FtcHsmfS4KLQotQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL21hbnZlcnMudGV4aW5mbyBiL3JlYWRsaW5lL2RvYy9tYW52ZXJzLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTI0ZTMuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZG9jL21hbnZlcnMudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQHNldCBFRElUSU9OIDQuMAotQHNldCBWRVJTSU9OIDQuMAotQHNldCBVUERBVEVEIDMxIERlY2VtYmVyIDE5OTgKLUBzZXQgVVBEQVRFLU1PTlRIIERlY2VtYmVyIDE5OTgKLQotQHNldCBMQVNUQ0hBTkdFIFRodSBEZWMgMzEgMTA6MTc6MDUgRVNUIDE5OTgKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9yZWFkbGluZS4zIGIvcmVhZGxpbmUvZG9jL3JlYWRsaW5lLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzZmMmYuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZG9jL3JlYWRsaW5lLjMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA0ICswLDAgQEAKLS5cIgotLlwiIE1BTiBQQUdFIENPTU1FTlRTIHRvCi0uXCIKLS5cIglDaGV0IFJhbWV5Ci0uXCIJSW5mb3JtYXRpb24gTmV0d29yayBTZXJ2aWNlcwotLlwiCUNhc2UgV2VzdGVybiBSZXNlcnZlIFVuaXZlcnNpdHkKLS5cIgljaGV0QGlucy5DV1JVLkVkdQotLlwiCi0uXCIJTGFzdCBDaGFuZ2U6IFRodSBEZWMgMzEgMTA6MTY6MzAgRVNUIDE5OTgKLS5cIgotLlRIIFJFQURMSU5FIDMgIjE5OTggRGVjIDMxIiBHTlUKLS5cIgotLlwiIEZpbGUgTmFtZSBtYWNyby4gIFRoaXMgdXNlZCB0byBiZSBgLlBOJywgZm9yIFBhdGggTmFtZSwKLS5cIiBidXQgU3VuIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIHRoYXQgdmVyeSBtdWNoLgotLlwiCi0uZGUgRk4KLVxmSVx8XFwkMVx8XGZQCi0uLgotLlNIIE5BTUUKLXJlYWRsaW5lIFwtIGdldCBhIGxpbmUgZnJvbSBhIHVzZXIgd2l0aCBlZGl0aW5nCi0uU0ggU1lOT1BTSVMKLS5MUAotLm5mCi0uZnQgQgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cmVhZGxpbmUuaD4KLSNpbmNsdWRlIDxoaXN0b3J5Lmg+Ci0uZnQKLS5maQotLkxQCi0ubmYKLS5mdCBCCi1jaGFyICpyZWFkbGluZSAocHJvbXB0KQotY2hhciAqcHJvbXB0OwotLmZ0Ci0uZmkKLS5TSCBDT1BZUklHSFQKLS5pZiBuIFJlYWRsaW5lIGlzIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NSwgMTk5NiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uaWYgdCBSZWFkbGluZSBpcyBDb3B5cmlnaHQgXChjbyAxOTg5LCAxOTkxLCAxOTkzLCAxOTk1LCAxOTk2IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5TSCBERVNDUklQVElPTgotLkxQCi0uQiByZWFkbGluZQotd2lsbCByZWFkIGEgbGluZSBmcm9tIHRoZSB0ZXJtaW5hbAotYW5kIHJldHVybiBpdCwgdXNpbmcKLS5CIHByb21wdAotYXMgYSBwcm9tcHQuICBJZiAKLS5CIHByb21wdAotaXMgbnVsbCwgbm8gcHJvbXB0IGlzIGlzc3VlZC4gIFRoZSBsaW5lIHJldHVybmVkIGlzIGFsbG9jYXRlZCB3aXRoCi0uSVIgbWFsbG9jICgzKSwKLXNvIHRoZSBjYWxsZXIgbXVzdCBmcmVlIGl0IHdoZW4gZmluaXNoZWQuICBUaGUgbGluZSByZXR1cm5lZAotaGFzIHRoZSBmaW5hbCBuZXdsaW5lIHJlbW92ZWQsIHNvIG9ubHkgdGhlIHRleHQgb2YgdGhlIGxpbmUKLXJlbWFpbnMuCi0uTFAKLS5CIHJlYWRsaW5lCi1vZmZlcnMgZWRpdGluZyBjYXBhYmlsaXRpZXMgd2hpbGUgdGhlIHVzZXIgaXMgZW50ZXJpbmcgdGhlCi1saW5lLgotQnkgZGVmYXVsdCwgdGhlIGxpbmUgZWRpdGluZyBjb21tYW5kcwotYXJlIHNpbWlsYXIgdG8gdGhvc2Ugb2YgZW1hY3MuCi1BIHZpXC1zdHlsZSBsaW5lIGVkaXRpbmcgaW50ZXJmYWNlIGlzIGFsc28gYXZhaWxhYmxlLgotLlNIIFJFVFVSTiBWQUxVRQotLkxQCi0uQiByZWFkbGluZQotcmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgbGluZSByZWFkLiAgQSBibGFuayBsaW5lCi1yZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuICBJZgotLkIgRU9GCi1pcyBlbmNvdW50ZXJlZCB3aGlsZSByZWFkaW5nIGEgbGluZSwgYW5kIHRoZSBsaW5lIGlzIGVtcHR5LAotLkIgTlVMTAotaXMgcmV0dXJuZWQuICBJZiBhbgotLkIgRU9GCi1pcyByZWFkIHdpdGggYSBub25cLWVtcHR5IGxpbmUsIGl0IGlzCi10cmVhdGVkIGFzIGEgbmV3bGluZS4KLS5TSCBOT1RBVElPTgotLkxQCi1BbiBlbWFjcy1zdHlsZSBub3RhdGlvbiBpcyB1c2VkIHRvIGRlbm90ZQota2V5c3Ryb2tlcy4gIENvbnRyb2wga2V5cyBhcmUgZGVub3RlZCBieSBDXC1cZklrZXlcZlIsIGUuZy4sIENcLW4KLW1lYW5zIENvbnRyb2xcLU4uICBTaW1pbGFybHksIAotLkkgbWV0YQota2V5cyBhcmUgZGVub3RlZCBieSBNXC1cZklrZXlcZlIsIHNvIE1cLXggbWVhbnMgTWV0YVwtWC4gIChPbiBrZXlib2FyZHMKLXdpdGhvdXQgYSAKLS5JIG1ldGEKLWtleSwgTVwtXGZJeFxmUCBtZWFucyBFU0MgXGZJeFxmUCwgaS5lLiwgcHJlc3MgdGhlIEVzY2FwZSBrZXkKLXRoZW4gdGhlCi0uSSB4Ci1rZXkuICBUaGlzIG1ha2VzIEVTQyB0aGUgXGZJbWV0YSBwcmVmaXhcZlAuCi1UaGUgY29tYmluYXRpb24gTVwtQ1wtXGZJeFxmUCBtZWFucyBFU0NcLUNvbnRyb2xcLVxmSXhcZlAsCi1vciBwcmVzcyB0aGUgRXNjYXBlIGtleQotdGhlbiBob2xkIHRoZSBDb250cm9sIGtleSB3aGlsZSBwcmVzc2luZyB0aGUKLS5JIHgKLWtleS4pCi0uUFAKLVJlYWRsaW5lIGNvbW1hbmRzIG1heSBiZSBnaXZlbiBudW1lcmljCi0uSVIgYXJndW1lbnRzICwKLXdoaWNoIG5vcm1hbGx5IGFjdCBhcyBhIHJlcGVhdCBjb3VudC4gIFNvbWV0aW1lcywgaG93ZXZlciwgaXQgaXMgdGhlCi1zaWduIG9mIHRoZSBhcmd1bWVudCB0aGF0IGlzIHNpZ25pZmljYW50LiAgUGFzc2luZyBhIG5lZ2F0aXZlIGFyZ3VtZW50Ci10byBhIGNvbW1hbmQgdGhhdCBhY3RzIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiAoZS5nLiwgXGZCa2lsbFwtbGluZVxmUCkKLWNhdXNlcyB0aGF0IGNvbW1hbmQgdG8gYWN0IGluIGEgYmFja3dhcmQgZGlyZWN0aW9uLiAgQ29tbWFuZHMgd2hvc2UKLWJlaGF2aW9yIHdpdGggYXJndW1lbnRzIGRldmlhdGVzIGZyb20gdGhpcyBhcmUgbm90ZWQuCi0uUFAKLVdoZW4gYSBjb21tYW5kIGlzIGRlc2NyaWJlZCBhcyBcZklraWxsaW5nXGZQIHRleHQsIHRoZSB0ZXh0Ci1kZWxldGVkIGlzIHNhdmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgcmV0cmlldmFsCi0oXGZJeWFua2luZ1xmUCkuICBUaGUga2lsbGVkIHRleHQgaXMgc2F2ZWQgaW4gYQotXGZJa2lsbCByaW5nXGZQLiAgQ29uc2VjdXRpdmUga2lsbHMgY2F1c2UgdGhlIHRleHQgdG8gYmUKLWFjY3VtdWxhdGVkIGludG8gb25lIHVuaXQsIHdoaWNoIGNhbiBiZSB5YW5rZWQgYWxsIGF0IG9uY2UuIAotQ29tbWFuZHMgd2hpY2ggZG8gbm90IGtpbGwgdGV4dCBzZXBhcmF0ZSB0aGUgY2h1bmtzIG9mIHRleHQKLW9uIHRoZSBraWxsIHJpbmcuCi0uU0ggSU5JVElBTElaQVRJT04gRklMRQotLkxQCi1SZWFkbGluZSBpcyBjdXN0b21pemVkIGJ5IHB1dHRpbmcgY29tbWFuZHMgaW4gYW4gaW5pdGlhbGl6YXRpb24KLWZpbGUgKHRoZSBcZklpbnB1dHJjXGZQIGZpbGUpLgotVGhlIG5hbWUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIGZyb20gdGhlIHZhbHVlIG9mIHRoZQotLkIgSU5QVVRSQwotZW52aXJvbm1lbnQgdmFyaWFibGUuICBJZiB0aGF0IHZhcmlhYmxlIGlzIHVuc2V0LCB0aGUgZGVmYXVsdCBpcwotLklSIH4vLmlucHV0cmMgLgotV2hlbiBhIHByb2dyYW0gd2hpY2ggdXNlcyB0aGUgcmVhZGxpbmUgbGlicmFyeSBzdGFydHMgdXAsIHRoZQotaW5pdCBmaWxlIGlzIHJlYWQsIGFuZCB0aGUga2V5IGJpbmRpbmdzIGFuZCB2YXJpYWJsZXMgYXJlIHNldC4KLVRoZXJlIGFyZSBvbmx5IGEgZmV3IGJhc2ljIGNvbnN0cnVjdHMgYWxsb3dlZCBpbiB0aGUKLXJlYWRsaW5lIGluaXQgZmlsZS4gIEJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgotTGluZXMgYmVnaW5uaW5nIHdpdGggYSBcZkIjXGZQIGFyZSBjb21tZW50cy4KLUxpbmVzIGJlZ2lubmluZyB3aXRoIGEgXGZCJFxmUCBpbmRpY2F0ZSBjb25kaXRpb25hbCBjb25zdHJ1Y3RzLgotT3RoZXIgbGluZXMgZGVub3RlIGtleSBiaW5kaW5ncyBhbmQgdmFyaWFibGUgc2V0dGluZ3MuCi1FYWNoIHByb2dyYW0gdXNpbmcgdGhpcyBsaWJyYXJ5IG1heSBhZGQgaXRzIG93biBjb21tYW5kcwotYW5kIGJpbmRpbmdzLgotLlBQCi1Gb3IgZXhhbXBsZSwgcGxhY2luZwotLlJTCi0uUFAKLU1cLUNvbnRyb2xcLXU6IHVuaXZlcnNhbFwtYXJndW1lbnQKLS5SRQotb3IKLS5SUwotQ1wtTWV0YVwtdTogdW5pdmVyc2FsXC1hcmd1bWVudAotLlJFCi1pbnRvIHRoZSAKLS5JIGlucHV0cmMKLXdvdWxkIG1ha2UgTVwtQ1wtdSBleGVjdXRlIHRoZSByZWFkbGluZSBjb21tYW5kCi0uSVIgdW5pdmVyc2FsXC1hcmd1bWVudCAuCi0uUFAKLVRoZSBmb2xsb3dpbmcgc3ltYm9saWMgY2hhcmFjdGVyIG5hbWVzIGFyZSByZWNvZ25pemVkIHdoaWxlCi1wcm9jZXNzaW5nIGtleSBiaW5kaW5nczoKLS5JUiBSVUJPVVQgLAotLklSIERFTCAsCi0uSVIgRVNDICwKLS5JUiBMRkQgLAotLklSIE5FV0xJTkUgLAotLklSIFJFVCAsCi0uSVIgUkVUVVJOICwKLS5JUiBTUEMgLAotLklSIFNQQUNFICwKLWFuZAotLklSIFRBQiAuCi1JbiBhZGRpdGlvbiB0byBjb21tYW5kIG5hbWVzLCByZWFkbGluZSBhbGxvd3Mga2V5cyB0byBiZSBib3VuZAotdG8gYSBzdHJpbmcgdGhhdCBpcyBpbnNlcnRlZCB3aGVuIHRoZSBrZXkgaXMgcHJlc3NlZCAoYSBcZkltYWNyb1xmUCkuCi0uUFAKLS5TUyBLZXkgQmluZGluZ3MKLS5QUAotVGhlIHN5bnRheCBmb3IgY29udHJvbGxpbmcga2V5IGJpbmRpbmdzIGluIHRoZQotLkkgaW5wdXRyYwotZmlsZSBpcyBzaW1wbGUuICBBbGwgdGhhdCBpcyByZXF1aXJlZCBpcyB0aGUgbmFtZSBvZiB0aGUKLWNvbW1hbmQgb3IgdGhlIHRleHQgb2YgYSBtYWNybyBhbmQgYSBrZXkgc2VxdWVuY2UgdG8gd2hpY2gKLWl0IHNob3VsZCBiZSBib3VuZC4gVGhlIG5hbWUgbWF5IGJlIHNwZWNpZmllZCBpbiBvbmUgb2YgdHdvIHdheXM6Ci1hcyBhIHN5bWJvbGljIGtleSBuYW1lLCBwb3NzaWJseSB3aXRoIFxmSU1ldGFcLVxmUCBvciBcZklDb250cm9sXC1cZlAKLXByZWZpeGVzLCBvciBhcyBhIGtleSBzZXF1ZW5jZS4KLVdoZW4gdXNpbmcgdGhlIGZvcm0gXGZCa2V5bmFtZVxmUDpcXlxmSWZ1bmN0aW9uLW5hbWVcZlAgb3IgXGZJbWFjcm9cZlAsCi0uSSBrZXluYW1lCi1pcyB0aGUgbmFtZSBvZiBhIGtleSBzcGVsbGVkIG91dCBpbiBFbmdsaXNoLiAgRm9yIGV4YW1wbGU6Ci0uc3AKLS5SUwotQ29udHJvbFwtdTogdW5pdmVyc2FsXC1hcmd1bWVudAotLmJyCi1NZXRhXC1SdWJvdXQ6IGJhY2t3YXJkXC1raWxsXC13b3JkCi0uYnIKLUNvbnRyb2xcLW86ICI+Jm91dHB1dCIKLS5SRQotLkxQCi1JbiB0aGUgYWJvdmUgZXhhbXBsZSwKLS5JIENcLXUKLWlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbgotLkJSIHVuaXZlcnNhbFwtYXJndW1lbnQgLAotLkkgTS1ERUwKLWlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbgotLkJSIGJhY2t3YXJkXC1raWxsXC13b3JkICwKLWFuZAotLkkgQ1wtbwotaXMgYm91bmQgdG8gcnVuIHRoZSBtYWNybwotZXhwcmVzc2VkIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgKHRoYXQgaXMsIHRvIGluc2VydCB0aGUgdGV4dAotLkkgPiZvdXRwdXQKLWludG8gdGhlIGxpbmUpLgotLlBQCi1JbiB0aGUgc2Vjb25kIGZvcm0sIFxmQiJrZXlzZXEiXGZQOlxeXGZJZnVuY3Rpb25cLW5hbWVcZlAgb3IgXGZJbWFjcm9cZlAsCi0uQiBrZXlzZXEKLWRpZmZlcnMgZnJvbQotLkIga2V5bmFtZQotYWJvdmUgaW4gdGhhdCBzdHJpbmdzIGRlbm90aW5nCi1hbiBlbnRpcmUga2V5IHNlcXVlbmNlIG1heSBiZSBzcGVjaWZpZWQgYnkgcGxhY2luZyB0aGUgc2VxdWVuY2UKLXdpdGhpbiBkb3VibGUgcXVvdGVzLiAgU29tZSBHTlUgRW1hY3Mgc3R5bGUga2V5IGVzY2FwZXMgY2FuIGJlCi11c2VkLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCi0uc3AKLS5SUwotIlxlQ1wtdSI6IHVuaXZlcnNhbFwtYXJndW1lbnQKLS5icgotIlxlQ1wteFxlQ1wtciI6IHJlXC1yZWFkXC1pbml0XC1maWxlCi0uYnIKLSJcZWVbMTF+IjogIkZ1bmN0aW9uIEtleSAxIgotLlJFCi0uUFAKLUluIHRoaXMgZXhhbXBsZSwKLS5JIEMtdQotaXMgYWdhaW4gYm91bmQgdG8gdGhlIGZ1bmN0aW9uCi0uQlIgdW5pdmVyc2FsXC1hcmd1bWVudCAuCi0uSSAiQy14IEMtciIKLWlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbgotLkJSIHJlXC1yZWFkXC1pbml0XC1maWxlICwKLWFuZCAKLS5JICJFU0MgWyAxIDEgfiIKLWlzIGJvdW5kIHRvIGluc2VydCB0aGUgdGV4dAotLkJSICJGdW5jdGlvbiBLZXkgMSIgLgotVGhlIGZ1bGwgc2V0IG9mIEdOVSBFbWFjcyBzdHlsZSBlc2NhcGUgc2VxdWVuY2VzIGlzCi0uUlMKLS5QRCAwCi0uVFAKLS5CIFxlQ1wtCi1jb250cm9sIHByZWZpeAotLlRQCi0uQiBcZU1cLQotbWV0YSBwcmVmaXgKLS5UUAotLkIgXGVlCi1hbiBlc2NhcGUgY2hhcmFjdGVyCi0uVFAKLS5CIFxlXGUKLWJhY2tzbGFzaAotLlRQCi0uQiBcZSIKLWxpdGVyYWwgIgotLlRQCi0uQiBcZScKLWxpdGVyYWwgJwotLlJFCi0uUEQKLS5QUAotSW4gYWRkaXRpb24gdG8gdGhlIEdOVSBFbWFjcyBzdHlsZSBlc2NhcGUgc2VxdWVuY2VzLCBhIHNlY29uZAotc2V0IG9mIGJhY2tzbGFzaCBlc2NhcGVzIGlzIGF2YWlsYWJsZToKLS5SUwotLlBEIDAKLS5UUAotLkIgXGVhCi1hbGVydCAoYmVsbCkKLS5UUAotLkIgXGViCi1iYWNrc3BhY2UKLS5UUAotLkIgXGVkCi1kZWxldGUKLS5UUAotLkIgXGVmCi1mb3JtIGZlZWQKLS5UUAotLkIgXGVuCi1uZXdsaW5lCi0uVFAKLS5CIFxlcgotY2FycmlhZ2UgcmV0dXJuCi0uVFAKLS5CIFxldAotaG9yaXpvbnRhbCB0YWIKLS5UUAotLkIgXGV2Ci12ZXJ0aWNhbCB0YWIKLS5UUAotLkIgXGVcZklubm5cZlAKLXRoZSBjaGFyYWN0ZXIgd2hvc2UgQVNDSUkgY29kZSBpcyB0aGUgb2N0YWwgdmFsdWUgXGZJbm5uXGZQCi0ob25lIHRvIHRocmVlIGRpZ2l0cykKLS5UUAotLkIgXGV4XGZJbm5uXGZQCi10aGUgY2hhcmFjdGVyIHdob3NlIEFTQ0lJIGNvZGUgaXMgdGhlIGhleGFkZWNpbWFsIHZhbHVlIFxmSW5ublxmUAotKG9uZSB0byB0aHJlZSBkaWdpdHMpCi0uUkUKLS5QRAotLlBQCi1XaGVuIGVudGVyaW5nIHRoZSB0ZXh0IG9mIGEgbWFjcm8sIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIHNob3VsZAotYmUgdXNlZCB0byBpbmRpY2F0ZSBhIG1hY3JvIGRlZmluaXRpb24uICBVbnF1b3RlZCB0ZXh0Ci1pcyBhc3N1bWVkIHRvIGJlIGEgZnVuY3Rpb24gbmFtZS4KLUluIHRoZSBtYWNybyBib2R5LCB0aGUgYmFja3NsYXNoIGVzY2FwZXMgZGVzY3JpYmVkIGFib3ZlIGFyZSBleHBhbmRlZC4KLUJhY2tzbGFzaCB3aWxsIHF1b3RlIGFueSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhlIG1hY3JvIHRleHQsCi1pbmNsdWRpbmcgIiBhbmQgJy4KLS5QUAotLkIgQmFzaAotYWxsb3dzIHRoZSBjdXJyZW50IHJlYWRsaW5lIGtleSBiaW5kaW5ncyB0byBiZSBkaXNwbGF5ZWQgb3IgbW9kaWZpZWQKLXdpdGggdGhlCi0uQiBiaW5kCi1idWlsdGluIGNvbW1hbmQuICBUaGUgZWRpdGluZyBtb2RlIG1heSBiZSBzd2l0Y2hlZCBkdXJpbmcgaW50ZXJhY3RpdmUKLXVzZSBieSB1c2luZyB0aGUKLS5CIFwtbwotb3B0aW9uIHRvIHRoZQotLkIgc2V0Ci1idWlsdGluIGNvbW1hbmQuICBPdGhlciBwcm9ncmFtcyB1c2luZyB0aGlzIGxpYnJhcnkgcHJvdmlkZQotc2ltaWxhciBtZWNoYW5pc21zLiAgVGhlCi0uSSBpbnB1dHJjCi1maWxlIG1heSBiZSBlZGl0ZWQgYW5kIHJlLXJlYWQgaWYgYSBwcm9ncmFtIGRvZXMgbm90IHByb3ZpZGUKLWFueSBvdGhlciBtZWFucyB0byBpbmNvcnBvcmF0ZSBuZXcgYmluZGluZ3MuCi0uU1MgVmFyaWFibGVzCi0uUFAKLVJlYWRsaW5lIGhhcyB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIGN1c3RvbWl6ZSBpdHMKLWJlaGF2aW9yLiAgQSB2YXJpYWJsZSBtYXkgYmUgc2V0IGluIHRoZQotLkkgaW5wdXRyYwotZmlsZSB3aXRoIGEgc3RhdGVtZW50IG9mIHRoZSBmb3JtCi0uUlMKLS5QUAotXGZCc2V0XGZQIFxmSXZhcmlhYmxlXC1uYW1lXGZQIFxmSXZhbHVlXGZQCi0uUkUKLS5QUAotRXhjZXB0IHdoZXJlIG5vdGVkLCByZWFkbGluZSB2YXJpYWJsZXMgY2FuIHRha2UgdGhlIHZhbHVlcwotLkIgT24KLW9yCi0uQlIgT2ZmIC4KLVRoZSB2YXJpYWJsZXMgYW5kIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFyZToKLS5QUAotLlBEIDAKLS5UUAotLkIgYmVsbFwtc3R5bGUgKGF1ZGlibGUpCi1Db250cm9scyB3aGF0IGhhcHBlbnMgd2hlbiByZWFkbGluZSB3YW50cyB0byByaW5nIHRoZSB0ZXJtaW5hbCBiZWxsLgotSWYgc2V0IHRvIFxmQm5vbmVcZlAsIHJlYWRsaW5lIG5ldmVyIHJpbmdzIHRoZSBiZWxsLiAgSWYgc2V0IHRvCi1cZkJ2aXNpYmxlXGZQLCByZWFkbGluZSB1c2VzIGEgdmlzaWJsZSBiZWxsIGlmIG9uZSBpcyBhdmFpbGFibGUuCi1JZiBzZXQgdG8gXGZCYXVkaWJsZVxmUCwgcmVhZGxpbmUgYXR0ZW1wdHMgdG8gcmluZyB0aGUgdGVybWluYWwncyBiZWxsLgotLlRQCi0uQiBjb21tZW50XC1iZWdpbiAoYGAjJycpCi1UaGUgc3RyaW5nIHRoYXQgaXMgaW5zZXJ0ZWQgaW4gXGZCdmlcZlAgbW9kZSB3aGVuIHRoZQotLkIgaW5zZXJ0XC1jb21tZW50Ci1jb21tYW5kIGlzIGV4ZWN1dGVkLgotVGhpcyBjb21tYW5kIGlzIGJvdW5kIHRvCi0uQiBNXC0jCi1pbiBlbWFjcyBtb2RlIGFuZCB0bwotLkIgIwotaW4gdmkgY29tbWFuZCBtb2RlLgotLlRQIAotLkIgY29tcGxldGlvblwtaWdub3JlXC1jYXNlIChPZmYpCi1JZiBzZXQgdG8gXGZCT25cZlAsIHJlYWRsaW5lIHBlcmZvcm1zIGZpbGVuYW1lIG1hdGNoaW5nIGFuZCBjb21wbGV0aW9uCi1pbiBhIGNhc2VcLWluc2Vuc2l0aXZlIGZhc2hpb24uCi0uVFAKLS5CIGNvbXBsZXRpb25cLXF1ZXJ5XC1pdGVtcyAoMTAwKQotVGhpcyBkZXRlcm1pbmVzIHdoZW4gdGhlIHVzZXIgaXMgcXVlcmllZCBhYm91dCB2aWV3aW5nCi10aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zCi1nZW5lcmF0ZWQgYnkgdGhlIFxmQnBvc3NpYmxlXC1jb21wbGV0aW9uc1xmUCBjb21tYW5kLgotSXQgbWF5IGJlIHNldCB0byBhbnkgaW50ZWdlciB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KLXplcm8uICBJZiB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIGlzIGdyZWF0ZXIgdGhhbgotb3IgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUsIHRoZSB1c2VyIGlzIGFza2VkIHdoZXRoZXIKLW9yIG5vdCBoZSB3aXNoZXMgdG8gdmlldyB0aGVtOyBvdGhlcndpc2UgdGhleSBhcmUgc2ltcGx5IGxpc3RlZAotb24gdGhlIHRlcm1pbmFsLgotLlRQCi0uQiBjb252ZXJ0XC1tZXRhIChPbikKLUlmIHNldCB0byBcZkJPblxmUCwgcmVhZGxpbmUgd2lsbCBjb252ZXJ0IGNoYXJhY3RlcnMgd2l0aCB0aGUKLWVpZ2h0aCBiaXQgc2V0IHRvIGFuIEFTQ0lJIGtleSBzZXF1ZW5jZQotYnkgc3RyaXBwaW5nIHRoZSBlaWdodGggYml0IGFuZCBwcmVwZW5kaW5nIGFuCi1lc2NhcGUgY2hhcmFjdGVyIChpbiBlZmZlY3QsIHVzaW5nIGVzY2FwZSBhcyB0aGUgXGZJbWV0YSBwcmVmaXhcZlApLgotLlRQCi0uQiBkaXNhYmxlXC1jb21wbGV0aW9uIChPZmYpCi1JZiBzZXQgdG8gXGZCT25cZlAsIHJlYWRsaW5lIHdpbGwgaW5oaWJpdCB3b3JkIGNvbXBsZXRpb24uICBDb21wbGV0aW9uIAotY2hhcmFjdGVycyB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGxpbmUgYXMgaWYgdGhleSBoYWQgYmVlbgotbWFwcGVkIHRvIFxmQnNlbGYtaW5zZXJ0XGZQLgotLlRQCi0uQiBlZGl0aW5nXC1tb2RlIChlbWFjcykKLUNvbnRyb2xzIHdoZXRoZXIgcmVhZGxpbmUgYmVnaW5zIHdpdGggYSBzZXQgb2Yga2V5IGJpbmRpbmdzIHNpbWlsYXIKLXRvIFxmSWVtYWNzXGZQIG9yIFxmSXZpXGZQLgotLkIgZWRpdGluZ1wtbW9kZQotY2FuIGJlIHNldCB0byBlaXRoZXIKLS5CIGVtYWNzCi1vcgotLkJSIHZpIC4KLS5UUAotLkIgZW5hYmxlXC1rZXlwYWQgKE9mZikKLVdoZW4gc2V0IHRvIFxmQk9uXGZQLCByZWFkbGluZSB3aWxsIHRyeSB0byBlbmFibGUgdGhlIGFwcGxpY2F0aW9uCi1rZXlwYWQgd2hlbiBpdCBpcyBjYWxsZWQuICBTb21lIHN5c3RlbXMgbmVlZCB0aGlzIHRvIGVuYWJsZSB0aGUKLWFycm93IGtleXMuCi0uVFAKLS5CIGV4cGFuZFwtdGlsZGUgKE9mZikKLUlmIHNldCB0byBcZkJvblxmUCwgdGlsZGUgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCB3aGVuIHJlYWRsaW5lCi1hdHRlbXB0cyB3b3JkIGNvbXBsZXRpb24uCi0uVFAKLS5CIGhvcml6b250YWxcLXNjcm9sbFwtbW9kZSAoT2ZmKQotV2hlbiBzZXQgdG8gXGZCT25cZlAsIG1ha2VzIHJlYWRsaW5lIHVzZSBhIHNpbmdsZSBsaW5lIGZvciBkaXNwbGF5LAotc2Nyb2xsaW5nIHRoZSBpbnB1dCBob3Jpem9udGFsbHkgb24gYSBzaW5nbGUgc2NyZWVuIGxpbmUgd2hlbiBpdAotYmVjb21lcyBsb25nZXIgdGhhbiB0aGUgc2NyZWVuIHdpZHRoIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRvIGEgbmV3IGxpbmUuCi0uVFAKLS5CIGlucHV0XC1tZXRhIChPZmYpCi1JZiBzZXQgdG8gXGZCT25cZlAsIHJlYWRsaW5lIHdpbGwgZW5hYmxlIGVpZ2h0LWJpdCBpbnB1dCAodGhhdCBpcywKLWl0IHdpbGwgbm90IHN0cmlwIHRoZSBoaWdoIGJpdCBmcm9tIHRoZSBjaGFyYWN0ZXJzIGl0IHJlYWRzKSwKLXJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgdGVybWluYWwgY2xhaW1zIGl0IGNhbiBzdXBwb3J0LiAgVGhlIG5hbWUKLS5CIG1ldGFcLWZsYWcKLWlzIGEgc3lub255bSBmb3IgdGhpcyB2YXJpYWJsZS4KLS5UUAotLkIgaXNlYXJjaFwtdGVybWluYXRvcnMgKGBgQ1wtW0NcLUonJykKLVRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwKLXNlYXJjaCB3aXRob3V0IHN1YnNlcXVlbnRseSBleGVjdXRpbmcgdGhlIGNoYXJhY3RlciBhcyBhIGNvbW1hbmQuCi1JZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBnaXZlbiBhIHZhbHVlLCB0aGUgY2hhcmFjdGVycwotXGZJRVNDXGZQIGFuZCBcZklDXC1KXGZQIHdpbGwgdGVybWluYXRlIGFuIGluY3JlbWVudGFsIHNlYXJjaC4KLS5UUAotLkIga2V5bWFwIChlbWFjcykKLVNldCB0aGUgY3VycmVudCByZWFkbGluZSBrZXltYXAuICBUaGUgc2V0IG9mIGxlZ2FsIGtleW1hcCBuYW1lcyBpcwotXGZJZW1hY3MsIGVtYWNzLXN0YW5kYXJkLCBlbWFjcy1tZXRhLCBlbWFjcy1jdGx4LCB2aSwgdmktbW92ZSwKLXZpLWNvbW1hbmRcZlAsIGFuZAotLklSIHZpLWluc2VydCAuCi1cZkl2aVxmUCBpcyBlcXVpdmFsZW50IHRvIFxmSXZpLWNvbW1hbmRcZlA7IFxmSWVtYWNzXGZQIGlzCi1lcXVpdmFsZW50IHRvIFxmSWVtYWNzLXN0YW5kYXJkXGZQLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLS5JUiBlbWFjcyA7Ci10aGUgdmFsdWUgb2YKLS5CIGVkaXRpbmdcLW1vZGUKLWFsc28gYWZmZWN0cyB0aGUgZGVmYXVsdCBrZXltYXAuCi0uVFAKLS5CIG1hcmtcLWRpcmVjdG9yaWVzIChPbikKLUlmIHNldCB0byBcZkJPblxmUCwgY29tcGxldGU8ZCBkaXJlY3RvcnkgbmFtZXMgaGF2ZSBhIHNsYXNoCi1hcHBlbmRlZC4KLS5UUAotLkIgbWFya1wtbW9kaWZpZWRcLWxpbmVzIChPZmYpCi1JZiBzZXQgdG8gXGZCT25cZlAsIGhpc3RvcnkgbGluZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgYXJlIGRpc3BsYXllZAotd2l0aCBhIHByZWNlZGluZyBhc3RlcmlzayAoXGZCKlxmUCkuCi0uVFAKLS5CIG91dHB1dFwtbWV0YSAoT2ZmKQotSWYgc2V0IHRvIFxmQk9uXGZQLCByZWFkbGluZSB3aWxsIGRpc3BsYXkgY2hhcmFjdGVycyB3aXRoIHRoZQotZWlnaHRoIGJpdCBzZXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gYXMgYSBtZXRhLXByZWZpeGVkIGVzY2FwZQotc2VxdWVuY2UuCi0uVFAKLS5CIHByaW50XC1jb21wbGV0aW9uc1wtaG9yaXpvbnRhbGx5IChPZmYpCi1JZiBzZXQgdG8gXGZCT25cZlAsIHJlYWRsaW5lIHdpbGwgZGlzcGxheSBjb21wbGV0aW9ucyB3aXRoIG1hdGNoZXMKLXNvcnRlZCBob3Jpem9udGFsbHkgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCByYXRoZXIgdGhhbiBkb3duIHRoZSBzY3JlZW4uCi0uVFAKLS5CIHNob3dcLWFsbFwtaWZcLWFtYmlndW91cyAoT2ZmKQotVGhpcyBhbHRlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb25zLiAgSWYKLXNldCB0bwotLkJSIG9uICwKLXdvcmRzIHdoaWNoIGhhdmUgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGNhdXNlIHRoZQotbWF0Y2hlcyB0byBiZSBsaXN0ZWQgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiByaW5naW5nIHRoZSBiZWxsLgotLlRQCi0uQiB2aXNpYmxlXC1zdGF0cyAoT2ZmKQotSWYgc2V0IHRvIFxmQk9uXGZQLCBhIGNoYXJhY3RlciBkZW5vdGluZyBhIGZpbGUncyB0eXBlIGFzIHJlcG9ydGVkICAKLWJ5IFxmQnN0YXRcZlAoMikgaXMgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIHdoZW4gbGlzdGluZyBwb3NzaWJsZQotY29tcGxldGlvbnMuCi0uUEQKLS5TUyBDb25kaXRpb25hbCBDb25zdHJ1Y3RzCi0uUFAKLVJlYWRsaW5lIGltcGxlbWVudHMgYSBmYWNpbGl0eSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgY29uZGl0aW9uYWwKLWNvbXBpbGF0aW9uIGZlYXR1cmVzIG9mIHRoZSBDIHByZXByb2Nlc3NvciB3aGljaCBhbGxvd3Mga2V5Ci1iaW5kaW5ncyBhbmQgdmFyaWFibGUgc2V0dGluZ3MgdG8gYmUgcGVyZm9ybWVkIGFzIHRoZSByZXN1bHQKLW9mIHRlc3RzLiAgVGhlcmUgYXJlIGZvdXIgcGFyc2VyIGRpcmVjdGl2ZXMgdXNlZC4KLS5JUCBcZkIkaWZcZlAKLVRoZSAKLS5CICRpZgotY29uc3RydWN0IGFsbG93cyBiaW5kaW5ncyB0byBiZSBtYWRlIGJhc2VkIG9uIHRoZQotZWRpdGluZyBtb2RlLCB0aGUgdGVybWluYWwgYmVpbmcgdXNlZCwgb3IgdGhlIGFwcGxpY2F0aW9uIHVzaW5nCi1yZWFkbGluZS4gIFRoZSB0ZXh0IG9mIHRoZSB0ZXN0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZTsKLW5vIGNoYXJhY3RlcnMgYXJlIHJlcXVpcmVkIHRvIGlzb2xhdGUgaXQuCi0uUlMKLS5JUCBcZkJtb2RlXGZQCi1UaGUgXGZCbW9kZT1cZlAgZm9ybSBvZiB0aGUgXGZCJGlmXGZQIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIHRlc3QKLXdoZXRoZXIgcmVhZGxpbmUgaXMgaW4gZW1hY3Mgb3IgdmkgbW9kZS4KLVRoaXMgbWF5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFxmQnNldCBrZXltYXBcZlAgY29tbWFuZCwgZm9yIGluc3RhbmNlLCB0byBzZXQgYmluZGluZ3MgaW4KLXRoZSBcZkllbWFjcy1zdGFuZGFyZFxmUCBhbmQgXGZJZW1hY3MtY3RseFxmUCBrZXltYXBzIG9ubHkgaWYKLXJlYWRsaW5lIGlzIHN0YXJ0aW5nIG91dCBpbiBlbWFjcyBtb2RlLgotLklQIFxmQnRlcm1cZlAKLVRoZSBcZkJ0ZXJtPVxmUCBmb3JtIG1heSBiZSB1c2VkIHRvIGluY2x1ZGUgdGVybWluYWwtc3BlY2lmaWMKLWtleSBiaW5kaW5ncywgcGVyaGFwcyB0byBiaW5kIHRoZSBrZXkgc2VxdWVuY2VzIG91dHB1dCBieSB0aGUKLXRlcm1pbmFsJ3MgZnVuY3Rpb24ga2V5cy4gIFRoZSB3b3JkIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZQotLkIgPQotaXMgdGVzdGVkIGFnYWluc3QgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGVybWluYWwgYW5kIHRoZSBwb3J0aW9uCi1vZiB0aGUgdGVybWluYWwgbmFtZSBiZWZvcmUgdGhlIGZpcnN0IFxmQlwtXGZQLiAgVGhpcyBhbGxvd3MKLS5JIHN1bgotdG8gbWF0Y2ggYm90aAotLkkgc3VuCi1hbmQKLS5JUiBzdW5cLWNtZCAsCi1mb3IgaW5zdGFuY2UuCi0uSVAgXGZCYXBwbGljYXRpb25cZlAKLVRoZSBcZkJhcHBsaWNhdGlvblxmUCBjb25zdHJ1Y3QgaXMgdXNlZCB0byBpbmNsdWRlCi1hcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXR0aW5ncy4gIEVhY2ggcHJvZ3JhbSB1c2luZyB0aGUgcmVhZGxpbmUKLWxpYnJhcnkgc2V0cyB0aGUgXGZJYXBwbGljYXRpb24gbmFtZVxmUCwgYW5kIGFuIGluaXRpYWxpemF0aW9uCi1maWxlIGNhbiB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdmFsdWUuCi1UaGlzIGNvdWxkIGJlIHVzZWQgdG8gYmluZCBrZXkgc2VxdWVuY2VzIHRvIGZ1bmN0aW9ucyB1c2VmdWwgZm9yCi1hIHNwZWNpZmljIHByb2dyYW0uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBhZGRzIGEKLWtleSBzZXF1ZW5jZSB0aGF0IHF1b3RlcyB0aGUgY3VycmVudCBvciBwcmV2aW91cyB3b3JkIGluIEJhc2g6Ci0uc3AgMQotLlJTCi0ubmYKLVxmQiRpZlxmUCBiYXNoCi0jIFF1b3RlIHRoZSBjdXJyZW50IG9yIHByZXZpb3VzIHdvcmQKLSJcZUMteHEiOiAiXGVlYlxlIlxlZWZcZSIiCi1cZkIkZW5kaWZcZlAKLS5maQotLlJFCi0uUkUKLS5JUCBcZkIkZW5kaWZcZlAKLVRoaXMgY29tbWFuZCwgYXMgc2VlbiBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGVybWluYXRlcyBhbgotXGZCJGlmXGZQIGNvbW1hbmQuCi0uSVAgXGZCJGVsc2VcZlAKLUNvbW1hbmRzIGluIHRoaXMgYnJhbmNoIG9mIHRoZSBcZkIkaWZcZlAgZGlyZWN0aXZlIGFyZSBleGVjdXRlZCBpZgotdGhlIHRlc3QgZmFpbHMuCi0uSVAgXGZCJGluY2x1ZGVcZlAKLVRoaXMgZGlyZWN0aXZlIHRha2VzIGEgc2luZ2xlIGZpbGVuYW1lIGFzIGFuIGFyZ3VtZW50IGFuZCByZWFkcyBjb21tYW5kcwotYW5kIGJpbmRpbmdzIGZyb20gdGhhdCBmaWxlLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlCi13b3VsZCByZWFkIFxmSS9ldGMvaW5wdXRyY1xmUDoKLS5zcCAxCi0uUlMKLS5uZgotXGZCJGluY2x1ZGVcZlAgXF4gXGZJL2V0Yy9pbnB1dHJjXGZQCi0uZmkgCi0uUkUKLS5TSCBTRUFSQ0hJTkcKLS5QUAotUmVhZGxpbmUgcHJvdmlkZXMgY29tbWFuZHMgZm9yIHNlYXJjaGluZyB0aHJvdWdoIHRoZSBjb21tYW5kIGhpc3RvcnkKLWZvciBsaW5lcyBjb250YWluaW5nIGEgc3BlY2lmaWVkIHN0cmluZy4KLVRoZXJlIGFyZSB0d28gc2VhcmNoIG1vZGVzOgotLkkgaW5jcmVtZW50YWwKLWFuZAotLklSIG5vbi1pbmNyZW1lbnRhbCAuCi0uUFAKLUluY3JlbWVudGFsIHNlYXJjaGVzIGJlZ2luIGJlZm9yZSB0aGUgdXNlciBoYXMgZmluaXNoZWQgdHlwaW5nIHRoZQotc2VhcmNoIHN0cmluZy4KLUFzIGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBzZWFyY2ggc3RyaW5nIGlzIHR5cGVkLCByZWFkbGluZSBkaXNwbGF5cwotdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgaGlzdG9yeSBtYXRjaGluZyB0aGUgc3RyaW5nIHR5cGVkIHNvIGZhci4KLUFuIGluY3JlbWVudGFsIHNlYXJjaCByZXF1aXJlcyBvbmx5IGFzIG1hbnkgY2hhcmFjdGVycyBhcyBuZWVkZWQgdG8KLWZpbmQgdGhlIGRlc2lyZWQgaGlzdG9yeSBlbnRyeS4KLVRoZSBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlIHZhbHVlIG9mIHRoZSBcZklpc2VhcmNoLXRlcm1pbmF0b3JzXGZQCi12YXJpYWJsZSBhcmUgdXNlZCB0byB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgotSWYgdGhhdCB2YXJpYWJsZSBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSB2YWx1ZSB0aGUgRXNjYXBlIGFuZAotQ29udHJvbC1KIGNoYXJhY3RlcnMgd2lsbCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgotQ29udHJvbC1HIHdpbGwgYWJvcnQgYW4gaW5jcmVtZW50YWwgc2VhcmNoIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbAotbGluZS4KLVdoZW4gdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkLCB0aGUgaGlzdG9yeSBlbnRyeSBjb250YWluaW5nIHRoZQotc2VhcmNoIHN0cmluZyBiZWNvbWVzIHRoZSBjdXJyZW50IGxpbmUuCi1UbyBmaW5kIG90aGVyIG1hdGNoaW5nIGVudHJpZXMgaW4gdGhlIGhpc3RvcnkgbGlzdCwgdHlwZSBDb250cm9sLVMgb3IKLUNvbnRyb2wtUiBhcyBhcHByb3ByaWF0ZS4KLVRoaXMgd2lsbCBzZWFyY2ggYmFja3dhcmQgb3IgZm9yd2FyZCBpbiB0aGUgaGlzdG9yeSBmb3IgdGhlIG5leHQKLWxpbmUgbWF0Y2hpbmcgdGhlIHNlYXJjaCBzdHJpbmcgdHlwZWQgc28gZmFyLgotQW55IG90aGVyIGtleSBzZXF1ZW5jZSBib3VuZCB0byBhIHJlYWRsaW5lIGNvbW1hbmQgd2lsbCB0ZXJtaW5hdGUKLXRoZSBzZWFyY2ggYW5kIGV4ZWN1dGUgdGhhdCBjb21tYW5kLgotRm9yIGluc3RhbmNlLCBhIFxmSW5ld2xpbmVcZlAgd2lsbCB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBhbmQgYWNjZXB0Ci10aGUgbGluZSwgdGhlcmVieSBleGVjdXRpbmcgdGhlIGNvbW1hbmQgZnJvbSB0aGUgaGlzdG9yeSBsaXN0LgotLlBQCi1Ob24taW5jcmVtZW50YWwgc2VhcmNoZXMgcmVhZCB0aGUgZW50aXJlIHNlYXJjaCBzdHJpbmcgYmVmb3JlIHN0YXJ0aW5nCi10byBzZWFyY2ggZm9yIG1hdGNoaW5nIGhpc3RvcnkgbGluZXMuICBUaGUgc2VhcmNoIHN0cmluZyBtYXkgYmUKLXR5cGVkIGJ5IHRoZSB1c2VyIG9yIGJlIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0uU0ggRURJVElORyBDT01NQU5EUwotLlBQCi1UaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbW1hbmRzIGFuZCB0aGUgZGVmYXVsdAota2V5IHNlcXVlbmNlcyB0byB3aGljaCB0aGV5IGFyZSBib3VuZC4KLUNvbW1hbmQgbmFtZXMgd2l0aG91dCBhbiBhY2NvbXBhbnlpbmcga2V5IHNlcXVlbmNlIGFyZSB1bmJvdW5kIGJ5IGRlZmF1bHQuCi0uU1MgQ29tbWFuZHMgZm9yIE1vdmluZwotLlBQCi0uUEQgMAotLlRQCi0uQiBiZWdpbm5pbmdcLW9mXC1saW5lIChDXC1hKQotTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZS4KLS5UUAotLkIgZW5kXC1vZlwtbGluZSAoQ1wtZSkKLU1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLS5UUAotLkIgZm9yd2FyZFwtY2hhciAoQ1wtZikKLU1vdmUgZm9yd2FyZCBhIGNoYXJhY3Rlci4KLS5UUAotLkIgYmFja3dhcmRcLWNoYXIgKENcLWIpCi1Nb3ZlIGJhY2sgYSBjaGFyYWN0ZXIuCi0uVFAKLS5CIGZvcndhcmRcLXdvcmQgKE1cLWYpCi1Nb3ZlIGZvcndhcmQgdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCB3b3JkLiAgV29yZHMgYXJlIGNvbXBvc2VkIG9mCi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyAobGV0dGVycyBhbmQgZGlnaXRzKS4KLS5UUAotLkIgYmFja3dhcmRcLXdvcmQgKE1cLWIpCi1Nb3ZlIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoaXMsIG9yIHRoZSBwcmV2aW91cywgd29yZC4gIFdvcmRzIGFyZQotY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgKGxldHRlcnMgYW5kIGRpZ2l0cykuCi0uVFAKLS5CIGNsZWFyXC1zY3JlZW4gKENcLWwpCi1DbGVhciB0aGUgc2NyZWVuIGxlYXZpbmcgdGhlIGN1cnJlbnQgbGluZSBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uCi1XaXRoIGFuIGFyZ3VtZW50LCByZWZyZXNoIHRoZSBjdXJyZW50IGxpbmUgd2l0aG91dCBjbGVhcmluZyB0aGUKLXNjcmVlbi4KLS5UUAotLkIgcmVkcmF3XC1jdXJyZW50XC1saW5lCi1SZWZyZXNoIHRoZSBjdXJyZW50IGxpbmUuCi0uUEQKLS5TUyBDb21tYW5kcyBmb3IgTWFuaXB1bGF0aW5nIHRoZSBIaXN0b3J5Ci0uUFAKLS5QRCAwCi0uVFAKLS5CIGFjY2VwdFwtbGluZSAoTmV3bGluZSwgUmV0dXJuKQotQWNjZXB0IHRoZSBsaW5lIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGN1cnNvciBpcy4gIElmIHRoaXMgbGluZSBpcwotbm9uLWVtcHR5LCBhZGQgaXQgdG8gdGhlIGhpc3RvcnkgbGlzdC4gSWYgdGhlIGxpbmUgaXMgYSBtb2RpZmllZAotaGlzdG9yeSBsaW5lLCB0aGVuIHJlc3RvcmUgdGhlIGhpc3RvcnkgbGluZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCi0uVFAKLS5CIHByZXZpb3VzXC1oaXN0b3J5IChDXC1wKQotRmV0Y2ggdGhlIHByZXZpb3VzIGNvbW1hbmQgZnJvbSB0aGUgaGlzdG9yeSBsaXN0LCBtb3ZpbmcgYmFjayBpbgotdGhlIGxpc3QuCi0uVFAKLS5CIG5leHRcLWhpc3RvcnkgKENcLW4pCi1GZXRjaCB0aGUgbmV4dCBjb21tYW5kIGZyb20gdGhlIGhpc3RvcnkgbGlzdCwgbW92aW5nIGZvcndhcmQgaW4gdGhlCi1saXN0LgotLlRQCi0uQiBiZWdpbm5pbmdcLW9mXC1oaXN0b3J5IChNXC08KQotTW92ZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgaGlzdG9yeS4KLS5UUAotLkIgZW5kXC1vZlwtaGlzdG9yeSAoTVwtPikKLU1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgaGlzdG9yeSwgaS5lLiwgdGhlIGxpbmUgY3VycmVudGx5IGJlaW5nCi1lbnRlcmVkLgotLlRQCi0uQiByZXZlcnNlXC1zZWFyY2hcLWhpc3RvcnkgKENcLXIpCi1TZWFyY2ggYmFja3dhcmQgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgbGluZSBhbmQgbW92aW5nIGB1cCcgdGhyb3VnaAotdGhlIGhpc3RvcnkgYXMgbmVjZXNzYXJ5LiAgVGhpcyBpcyBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCi0uVFAKLS5CIGZvcndhcmRcLXNlYXJjaFwtaGlzdG9yeSAoQ1wtcykKLVNlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgZG93bicgdGhyb3VnaAotdGhlIGhpc3RvcnkgYXMgbmVjZXNzYXJ5LiAgVGhpcyBpcyBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCi0uVFAKLS5CIG5vblwtaW5jcmVtZW50YWxcLXJldmVyc2VcLXNlYXJjaFwtaGlzdG9yeSAoTVwtcCkKLVNlYXJjaCBiYWNrd2FyZCB0aHJvdWdoIHRoZSBoaXN0b3J5IHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUKLXVzaW5nIGEgbm9uLWluY3JlbWVudGFsIHNlYXJjaCBmb3IgYSBzdHJpbmcgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCi0uVFAKLS5CIG5vblwtaW5jcmVtZW50YWxcLWZvcndhcmRcLXNlYXJjaFwtaGlzdG9yeSAoTVwtbikKLVNlYXJjaCBmb3J3YXJkIHRocm91Z2ggdGhlIGhpc3RvcnkgdXNpbmcgYSBub24taW5jcmVtZW50YWwgc2VhcmNoCi1mb3IgYSBzdHJpbmcgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCi0uVFAKLS5CIGhpc3RvcnlcLXNlYXJjaFwtZm9yd2FyZAotU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBmb3IgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi1iZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgY3VycmVudCBjdXJzb3IKLXBvc2l0aW9uICh0aGUgXGZJcG9pbnRcZlApLgotVGhpcyBpcyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2guCi0uVFAKLS5CIGhpc3RvcnlcLXNlYXJjaFwtYmFja3dhcmQKLVNlYXJjaCBiYWNrd2FyZCB0aHJvdWdoIHRoZSBoaXN0b3J5IGZvciB0aGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMKLWJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUgYW5kIHRoZSBwb2ludC4KLVRoaXMgaXMgYSBub24taW5jcmVtZW50YWwgc2VhcmNoLgotLlRQCi0uQiB5YW5rXC1udGhcLWFyZyAoTVwtQ1wteSkKLUluc2VydCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQgKHVzdWFsbHkKLXRoZSBzZWNvbmQgd29yZCBvbiB0aGUgcHJldmlvdXMgbGluZSkgYXQgcG9pbnQgKHRoZSBjdXJyZW50Ci1jdXJzb3IgcG9zaXRpb24pLiAgV2l0aCBhbiBhcmd1bWVudAotLklSIG4gLAotaW5zZXJ0IHRoZSBcZkluXGZQdGggd29yZCBmcm9tIHRoZSBwcmV2aW91cyBjb21tYW5kICh0aGUgd29yZHMKLWluIHRoZSBwcmV2aW91cyBjb21tYW5kIGJlZ2luIHdpdGggd29yZCAwKS4gIEEgbmVnYXRpdmUgYXJndW1lbnQKLWluc2VydHMgdGhlIFxmSW5cZlB0aCB3b3JkIGZyb20gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgY29tbWFuZC4KLS5UUAotLkIKLXlhbmtcLWxhc3RcLWFyZyAoTVwtLlxeLCBNXC1fXF4pCi1JbnNlcnQgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQgKHRoZSBsYXN0IHdvcmQgb2YKLXRoZSBwcmV2aW91cyBoaXN0b3J5IGVudHJ5KS4gIFdpdGggYW4gYXJndW1lbnQsCi1iZWhhdmUgZXhhY3RseSBsaWtlIFxmQnlhbmtcLW50aFwtYXJnXGZQLgotU3VjY2Vzc2l2ZSBjYWxscyB0byBcZkJ5YW5rXC1sYXN0XC1hcmdcZlAgbW92ZSBiYWNrIHRocm91Z2ggdGhlIGhpc3RvcnkKLWxpc3QsIGluc2VydGluZyB0aGUgbGFzdCBhcmd1bWVudCBvZiBlYWNoIGxpbmUgaW4gdHVybi4KLS5QRAotLlNTIENvbW1hbmRzIGZvciBDaGFuZ2luZyBUZXh0Ci0uUFAKLS5QRCAwCi0uVFAKLS5CIGRlbGV0ZVwtY2hhciAoQ1wtZCkKLURlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IuICBJZiBwb2ludCBpcyBhdCB0aGUKLWJlZ2lubmluZyBvZiB0aGUgbGluZSwgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgaW4gdGhlIGxpbmUsIGFuZAotdGhlIGxhc3QgY2hhcmFjdGVyIHR5cGVkIHdhcyBub3QgYm91bmQgdG8gXGZCQmRlbGV0ZVwtY2hhclxmUCwgdGhlbiByZXR1cm4KLS5TTQotLkJSIEVPRiAuCi0uVFAKLS5CIGJhY2t3YXJkXC1kZWxldGVcLWNoYXIgKFJ1Ym91dCkKLURlbGV0ZSB0aGUgY2hhcmFjdGVyIGJlaGluZCB0aGUgY3Vyc29yLiAgV2hlbiBnaXZlbiBhIG51bWVyaWMgYXJndW1lbnQsCi1zYXZlIHRoZSBkZWxldGVkIHRleHQgb24gdGhlIGtpbGwgcmluZy4KLS5UUAotLkIgZm9yd2FyZFwtYmFja3dhcmRcLWRlbGV0ZVwtY2hhciAgIAotRGVsZXRlIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciwgdW5sZXNzIHRoZSBjdXJzb3IgaXMgYXQgdGhlCi1lbmQgb2YgdGhlIGxpbmUsIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlciBiZWhpbmQgdGhlIGN1cnNvciBpcwotZGVsZXRlZC4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgbm90IGJvdW5kIHRvIGEga2V5LgotLlRQCi0uQiBxdW90ZWRcLWluc2VydCAoQ1wtcSwgQ1wtdikKLUFkZCB0aGUgbmV4dCBjaGFyYWN0ZXIgdGhhdCB5b3UgdHlwZSB0byB0aGUgbGluZSB2ZXJiYXRpbS4gIFRoaXMgaXMKLWhvdyB0byBpbnNlcnQgY2hhcmFjdGVycyBsaWtlIFxmQkNcLXFcZlAsIGZvciBleGFtcGxlLgotLlRQCi0uQiB0YWJcLWluc2VydCAoTS1UQUIpCi1JbnNlcnQgYSB0YWIgY2hhcmFjdGVyLgotLlRQCi0uQiBzZWxmXC1pbnNlcnQgKGEsXCBiLFwgQSxcIDEsXCAhLFwgLi4uKQotSW5zZXJ0IHRoZSBjaGFyYWN0ZXIgdHlwZWQuCi0uVFAKLS5CIHRyYW5zcG9zZVwtY2hhcnMgKENcLXQpCi1EcmFnIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHBvaW50IGZvcndhcmQgb3ZlciB0aGUgY2hhcmFjdGVyIGF0IHBvaW50LgotUG9pbnQgbW92ZXMgZm9yd2FyZCBhcyB3ZWxsLiAgSWYgcG9pbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgdGhlbgotdHJhbnNwb3NlIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgcG9pbnQuICBOZWdhdGl2ZSBhcmd1bWVudHMgZG9uJ3Qgd29yay4KLS5UUAotLkIgdHJhbnNwb3NlXC13b3JkcyAoTVwtdCkKLURyYWcgdGhlIHdvcmQgYmVoaW5kIHRoZSBjdXJzb3IgcGFzdCB0aGUgd29yZCBpbiBmcm9udCBvZiB0aGUgY3Vyc29yCi1tb3ZpbmcgdGhlIGN1cnNvciBvdmVyIHRoYXQgd29yZCBhcyB3ZWxsLgotLlRQCi0uQiB1cGNhc2VcLXdvcmQgKE1cLXUpCi1VcHBlcmNhc2UgdGhlIGN1cnJlbnQgKG9yIGZvbGxvd2luZykgd29yZC4gIFdpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCwKLXVwcGVyY2FzZSB0aGUgcHJldmlvdXMgd29yZCwgYnV0IGRvIG5vdCBtb3ZlIHBvaW50LgotLlRQCi0uQiBkb3duY2FzZVwtd29yZCAoTVwtbCkKLUxvd2VyY2FzZSB0aGUgY3VycmVudCAob3IgZm9sbG93aW5nKSB3b3JkLiAgV2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LAotbG93ZXJjYXNlIHRoZSBwcmV2aW91cyB3b3JkLCBidXQgZG8gbm90IG1vdmUgcG9pbnQuCi0uVFAKLS5CIGNhcGl0YWxpemVcLXdvcmQgKE1cLWMpCi1DYXBpdGFsaXplIHRoZSBjdXJyZW50IChvciBmb2xsb3dpbmcpIHdvcmQuICBXaXRoIGEgbmVnYXRpdmUgYXJndW1lbnQsCi1jYXBpdGFsaXplIHRoZSBwcmV2aW91cyB3b3JkLCBidXQgZG8gbm90IG1vdmUgcG9pbnQuCi0uUEQKLS5TUyBLaWxsaW5nIGFuZCBZYW5raW5nCi0uUFAKLS5QRCAwCi0uVFAKLS5CIGtpbGxcLWxpbmUgKENcLWspCi1LaWxsIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0uVFAKLS5CIGJhY2t3YXJkXC1raWxsXC1saW5lIChDXC14IFJ1Ym91dCkKLUtpbGwgYmFja3dhcmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KLS5UUAotLkIgdW5peFwtbGluZVwtZGlzY2FyZCAoQ1wtdSkKLUtpbGwgYmFja3dhcmQgZnJvbSBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotVGhlIGtpbGxlZCB0ZXh0IGlzIHNhdmVkIG9uIHRoZSBraWxsLXJpbmcuCi0uXCIgVGhlcmUgaXMgbm8gcmVhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgYmFja3dhcmQta2lsbC1saW5lCi0uVFAKLS5CIGtpbGxcLXdob2xlXC1saW5lCi1LaWxsIGFsbCBjaGFyYWN0ZXJzIG9uIHRoZSBjdXJyZW50IGxpbmUsIG5vIG1hdHRlciB3aGVyZSB0aGUKLWN1cnNvciBpcy4KLS5UUAotLkIga2lsbFwtd29yZCAgKE1cLWQpCi1LaWxsIGZyb20gdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHdvcmQsIG9yIGlmIGJldHdlZW4KLXdvcmRzLCB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQuICBXb3JkIGJvdW5kYXJpZXMgYXJlIHRoZSBzYW1lIGFzCi10aG9zZSB1c2VkIGJ5IFxmQmZvcndhcmRcLXdvcmRcZlAuCi0uVFAKLS5CIGJhY2t3YXJkXC1raWxsXC13b3JkIChNXC1SdWJvdXQpCi1LaWxsIHRoZSB3b3JkIGJlaGluZCB0aGUgY3Vyc29yLiAgV29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcwotdGhvc2UgdXNlZCBieSBcZkJiYWNrd2FyZFwtd29yZFxmUC4KLS5UUAotLkIgdW5peFwtd29yZFwtcnVib3V0IChDXC13KQotS2lsbCB0aGUgd29yZCBiZWhpbmQgdGhlIGN1cnNvciwgdXNpbmcgd2hpdGUgc3BhY2UgYXMgYSB3b3JkIGJvdW5kYXJ5LgotVGhlIHdvcmQgYm91bmRhcmllcyBhcmUgZGlmZmVyZW50IGZyb20KLS5CUiBiYWNrd2FyZFwta2lsbFwtd29yZCAuCi0uVFAKLS5CIGRlbGV0ZVwtaG9yaXpvbnRhbFwtc3BhY2UgKE1cLVxlKQotRGVsZXRlIGFsbCBzcGFjZXMgYW5kIHRhYnMgYXJvdW5kIHBvaW50LgotLlRQCi0uQiBraWxsXC1yZWdpb24KLUtpbGwgdGhlIHRleHQgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIFxmSW1hcmtcZlAgKHNhdmVkIGN1cnNvciBwb3NpdGlvbikuCi1UaGlzIHRleHQgaXMgcmVmZXJyZWQgdG8gYXMgdGhlIFxmSXJlZ2lvblxmUC4KLS5UUAotLkIgY29weVwtcmVnaW9uXC1hc1wta2lsbAotQ29weSB0aGUgdGV4dCBpbiB0aGUgcmVnaW9uIHRvIHRoZSBraWxsIGJ1ZmZlci4KLS5UUAotLkIgY29weVwtYmFja3dhcmRcLXdvcmQKLUNvcHkgdGhlIHdvcmQgYmVmb3JlIHBvaW50IHRvIHRoZSBraWxsIGJ1ZmZlci4KLVRoZSB3b3JkIGJvdW5kYXJpZXMgYXJlIHRoZSBzYW1lIGFzIFxmQmJhY2t3YXJkXC13b3JkXGZQLgotLlRQCi0uQiBjb3B5XC1mb3J3YXJkXC13b3JkCi1Db3B5IHRoZSB3b3JkIGZvbGxvd2luZyBwb2ludCB0byB0aGUga2lsbCBidWZmZXIuCi1UaGUgd29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcyBcZkJmb3J3YXJkXC13b3JkXGZQLgotLlRQCi0uQiB5YW5rIChDXC15KQotWWFuayB0aGUgdG9wIG9mIHRoZSBraWxsIHJpbmcgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBjdXJzb3IuCi0uVFAKLS5CIHlhbmtcLXBvcCAoTVwteSkKLVJvdGF0ZSB0aGUga2lsbCByaW5nLCBhbmQgeWFuayB0aGUgbmV3IHRvcC4gIE9ubHkgd29ya3MgZm9sbG93aW5nCi0uQiB5YW5rCi1vcgotLkJSIHlhbmtcLXBvcCAuCi0uUEQKLS5TUyBOdW1lcmljIEFyZ3VtZW50cwotLlBQCi0uUEQgMAotLlRQCi0uQiBkaWdpdFwtYXJndW1lbnQgKE1cLTAsIE1cLTEsIC4uLiwgTVwtXC0pCi1BZGQgdGhpcyBkaWdpdCB0byB0aGUgYXJndW1lbnQgYWxyZWFkeSBhY2N1bXVsYXRpbmcsIG9yIHN0YXJ0IGEgbmV3Ci1hcmd1bWVudC4gIE1cLVwtIHN0YXJ0cyBhIG5lZ2F0aXZlIGFyZ3VtZW50LgotLlRQCi0uQiB1bml2ZXJzYWxcLWFyZ3VtZW50Ci1UaGlzIGlzIGFub3RoZXIgd2F5IHRvIHNwZWNpZnkgYW4gYXJndW1lbnQuCi1JZiB0aGlzIGNvbW1hbmQgaXMgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGlnaXRzLCBvcHRpb25hbGx5IHdpdGggYQotbGVhZGluZyBtaW51cyBzaWduLCB0aG9zZSBkaWdpdHMgZGVmaW5lIHRoZSBhcmd1bWVudC4KLUlmIHRoZSBjb21tYW5kIGlzIGZvbGxvd2VkIGJ5IGRpZ2l0cywgZXhlY3V0aW5nCi0uQiB1bml2ZXJzYWxcLWFyZ3VtZW50Ci1hZ2FpbiBlbmRzIHRoZSBudW1lcmljIGFyZ3VtZW50LCBidXQgaXMgb3RoZXJ3aXNlIGlnbm9yZWQuCi1BcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhpcyBjb21tYW5kIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEKLWNoYXJhY3RlciB0aGF0IGlzIG5laXRoZXIgYSBkaWdpdCBvciBtaW51cyBzaWduLCB0aGUgYXJndW1lbnQgY291bnQKLWZvciB0aGUgbmV4dCBjb21tYW5kIGlzIG11bHRpcGxpZWQgYnkgZm91ci4KLVRoZSBhcmd1bWVudCBjb3VudCBpcyBpbml0aWFsbHkgb25lLCBzbyBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbiB0aGUKLWZpcnN0IHRpbWUgbWFrZXMgdGhlIGFyZ3VtZW50IGNvdW50IGZvdXIsIGEgc2Vjb25kIHRpbWUgbWFrZXMgdGhlCi1hcmd1bWVudCBjb3VudCBzaXh0ZWVuLCBhbmQgc28gb24uCi0uUEQKLS5TUyBDb21wbGV0aW5nCi0uUFAKLS5QRCAwCi0uVFAKLS5CIGNvbXBsZXRlIChUQUIpCi1BdHRlbXB0IHRvIHBlcmZvcm0gY29tcGxldGlvbiBvbiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQuCi1UaGUgYWN0dWFsIGNvbXBsZXRpb24gcGVyZm9ybWVkIGlzIGFwcGxpY2F0aW9uLXNwZWNpZmljLgotLkJSIEJhc2ggLAotZm9yIGluc3RhbmNlLCBhdHRlbXB0cyBjb21wbGV0aW9uIHRyZWF0aW5nIHRoZSB0ZXh0IGFzIGEgdmFyaWFibGUKLShpZiB0aGUgdGV4dCBiZWdpbnMgd2l0aCBcZkIkXGZQKSwgdXNlcm5hbWUgKGlmIHRoZSB0ZXh0IGJlZ2lucyB3aXRoCi1cZkJ+XGZQKSwgaG9zdG5hbWUgKGlmIHRoZSB0ZXh0IGJlZ2lucyB3aXRoIFxmQkBcZlApLCBvcgotY29tbWFuZCAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGZ1bmN0aW9ucykgaW4gdHVybi4gIElmIG5vbmUKLW9mIHRoZXNlIHByb2R1Y2VzIGEgbWF0Y2gsIGZpbGVuYW1lIGNvbXBsZXRpb24gaXMgYXR0ZW1wdGVkLgotLkJSIEdkYiAsCi1vbiB0aGUgb3RoZXIgaGFuZCwKLWFsbG93cyBjb21wbGV0aW9uIG9mIHByb2dyYW0gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMsIGFuZAotb25seSBhdHRlbXB0cyBmaWxlbmFtZSBjb21wbGV0aW9uIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4KLS5UUAotLkIgcG9zc2libGVcLWNvbXBsZXRpb25zIChNXC0/KQotTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50LgotLlRQCi0uQiBpbnNlcnRcLWNvbXBsZXRpb25zIChNXC0qKQotSW5zZXJ0IGFsbCBjb21wbGV0aW9ucyBvZiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQKLXRoYXQgd291bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieQotXGZCcG9zc2libGVcLWNvbXBsZXRpb25zXGZQLgotLlRQCi0uQiBtZW51XC1jb21wbGV0ZQotU2ltaWxhciB0byBcZkJjb21wbGV0ZVxmUCwgYnV0IHJlcGxhY2VzIHRoZSB3b3JkIHRvIGJlIGNvbXBsZXRlZAotd2l0aCBhIHNpbmdsZSBtYXRjaCBmcm9tIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotUmVwZWF0ZWQgZXhlY3V0aW9uIG9mIFxmQm1lbnVcLWNvbXBsZXRlXGZQIHN0ZXBzIHRocm91Z2ggdGhlIGxpc3QKLW9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLCBpbnNlcnRpbmcgZWFjaCBtYXRjaCBpbiB0dXJuLgotQXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBjb21wbGV0aW9ucywgdGhlIGJlbGwgaXMgcnVuZyBhbmQgdGhlCi1vcmlnaW5hbCB0ZXh0IGlzIHJlc3RvcmVkLgotQW4gYXJndW1lbnQgb2YgXGZJblxmUCBtb3ZlcyBcZkluXGZQIHBvc2l0aW9ucyBmb3J3YXJkIGluIHRoZSBsaXN0Ci1vZiBtYXRjaGVzOyBhIG5lZ2F0aXZlIGFyZ3VtZW50IG1heSBiZSB1c2VkIHRvIG1vdmUgYmFja3dhcmQgCi10aHJvdWdoIHRoZSBsaXN0LgotVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIHRvIGJlIGJvdW5kIHRvIFxmQlRBQlxmUCwgYnV0IGlzIHVuYm91bmQKLWJ5IGRlZmF1bHQuCi0uVFAKLS5CIGRlbGV0ZVwtY2hhclwtb3JcLWxpc3QKLURlbGV0ZXMgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yIGlmIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9yCi1lbmQgb2YgdGhlIGxpbmUgKGxpa2UgXGZCZGVsZXRlLWNoYXJcZlApLgotSWYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgYmVoYXZlcyBpZGVudGljYWxseSB0bwotXGZCcG9zc2libGUtY29tcGxldGlvbnNcZlAuCi1UaGlzIGNvbW1hbmQgaXMgdW5ib3VuZCBieSBkZWZhdWx0LgotLlBECi0uU1MgS2V5Ym9hcmQgTWFjcm9zCi0uUFAKLS5QRCAwCi0uVFAKLS5CIHN0YXJ0XC1rYmRcLW1hY3JvIChDXC14IChcXikKLUJlZ2luIHNhdmluZyB0aGUgY2hhcmFjdGVycyB0eXBlZCBpbnRvIHRoZSBjdXJyZW50IGtleWJvYXJkIG1hY3JvLgotLlRQCi0uQiBlbmRcLWtiZFwtbWFjcm8gKENcLXggKVxeKQotU3RvcCBzYXZpbmcgdGhlIGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgY3VycmVudCBrZXlib2FyZCBtYWNybwotYW5kIHN0b3JlIHRoZSBkZWZpbml0aW9uLgotLlRQCi0uQiBjYWxsXC1sYXN0XC1rYmRcLW1hY3JvIChDXC14IGUpCi1SZS1leGVjdXRlIHRoZSBsYXN0IGtleWJvYXJkIG1hY3JvIGRlZmluZWQsIGJ5IG1ha2luZyB0aGUgY2hhcmFjdGVycwotaW4gdGhlIG1hY3JvIGFwcGVhciBhcyBpZiB0eXBlZCBhdCB0aGUga2V5Ym9hcmQuCi0uUEQKLS5TUyBNaXNjZWxsYW5lb3VzCi0uUFAKLS5QRCAwCi0uVFAKLS5CIHJlXC1yZWFkXC1pbml0XC1maWxlIChDXC14IENcLXIpCi1SZWFkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgXGZJaW5wdXRyY1xmUCBmaWxlLCBhbmQgaW5jb3Jwb3JhdGUKLWFueSBiaW5kaW5ncyBvciB2YXJpYWJsZSBhc3NpZ25tZW50cyBmb3VuZCB0aGVyZS4KLS5UUAotLkIgYWJvcnQgKENcLWcpCi1BYm9ydCB0aGUgY3VycmVudCBlZGl0aW5nIGNvbW1hbmQgYW5kCi1yaW5nIHRoZSB0ZXJtaW5hbCdzIGJlbGwgKHN1YmplY3QgdG8gdGhlIHNldHRpbmcgb2YKLS5CUiBiZWxsXC1zdHlsZSApLgotLlRQCi0uQiBkb1wtdXBwZXJjYXNlXC12ZXJzaW9uIChNXC1hLCBNXC1iLCBNXC1cZkl4XGZQLCAuLi4pCi1JZiB0aGUgbWV0YWZpZWQgY2hhcmFjdGVyIFxmSXhcZlAgaXMgbG93ZXJjYXNlLCBydW4gdGhlIGNvbW1hbmQKLXRoYXQgaXMgYm91bmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXBwZXJjYXNlIGNoYXJhY3Rlci4KLS5UUAotLkIgcHJlZml4XC1tZXRhIChFU0MpCi1NZXRhZnkgdGhlIG5leHQgY2hhcmFjdGVyIHR5cGVkLgotLlNNCi0uQiBFU0MKLS5CIGYKLWlzIGVxdWl2YWxlbnQgdG8KLS5CUiBNZXRhXC1mIC4KLS5UUAotLkIgdW5kbyAoQ1wtXywgQ1wteCBDXC11KQotSW5jcmVtZW50YWwgdW5kbywgc2VwYXJhdGVseSByZW1lbWJlcmVkIGZvciBlYWNoIGxpbmUuCi0uVFAKLS5CIHJldmVydFwtbGluZSAoTVwtcikKLVVuZG8gYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIGxpbmUuICBUaGlzIGlzIGxpa2UgZXhlY3V0aW5nIHRoZQotLkIgdW5kbwotY29tbWFuZCBlbm91Z2ggdGltZXMgdG8gcmV0dXJuIHRoZSBsaW5lIHRvIGl0cyBpbml0aWFsIHN0YXRlLgotLlRQCi0uQiB0aWxkZVwtZXhwYW5kIChNXC0mKQotUGVyZm9ybSB0aWxkZSBleHBhbnNpb24gb24gdGhlIGN1cnJlbnQgd29yZC4KLS5UUAotLkIgc2V0XC1tYXJrIChDXC1ALCBNLTxzcGFjZT4pCi1TZXQgdGhlIG1hcmsgdG8gdGhlIGN1cnJlbnQgcG9pbnQuICBJZiBhCi1udW1lcmljIGFyZ3VtZW50IGlzIHN1cHBsaWVkLCB0aGUgbWFyayBpcyBzZXQgdG8gdGhhdCBwb3NpdGlvbi4KLS5UUAotLkIgZXhjaGFuZ2VcLXBvaW50XC1hbmRcLW1hcmsgKENcLXggQ1wteCkKLVN3YXAgdGhlIHBvaW50IHdpdGggdGhlIG1hcmsuICBUaGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgc2V0IHRvCi10aGUgc2F2ZWQgcG9zaXRpb24sIGFuZCB0aGUgb2xkIGN1cnNvciBwb3NpdGlvbiBpcyBzYXZlZCBhcyB0aGUgbWFyay4KLS5UUAotLkIgY2hhcmFjdGVyXC1zZWFyY2ggKENcLV0pCi1BIGNoYXJhY3RlciBpcyByZWFkIGFuZCBwb2ludCBpcyBtb3ZlZCB0byB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIHRoYXQKLWNoYXJhY3Rlci4gIEEgbmVnYXRpdmUgY291bnQgc2VhcmNoZXMgZm9yIHByZXZpb3VzIG9jY3VycmVuY2VzLgotLlRQCi0uQiBjaGFyYWN0ZXJcLXNlYXJjaFwtYmFja3dhcmQgKE1cLUNcLV0pCi1BIGNoYXJhY3RlciBpcyByZWFkIGFuZCBwb2ludCBpcyBtb3ZlZCB0byB0aGUgcHJldmlvdXMgb2NjdXJyZW5jZSBvZiB0aGF0Ci1jaGFyYWN0ZXIuICBBIG5lZ2F0aXZlIGNvdW50IHNlYXJjaGVzIGZvciBzdWJzZXF1ZW50IG9jY3VycmVuY2VzLgotLlRQCi0uQiBpbnNlcnRcLWNvbW1lbnQgKE1cLSMpCi1UaGUgdmFsdWUgb2YgdGhlIHJlYWRsaW5lCi0uQiBjb21tZW50XC1iZWdpbgotdmFyaWFibGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBsaW5lLCBhbmQgdGhlIGxpbmUKLWlzIGFjY2VwdGVkIGFzIGlmIGEgbmV3bGluZSBoYWQgYmVlbiB0eXBlZC4gIFRoaXMgbWFrZXMgdGhlIGN1cnJlbnQgbGluZQotYSBzaGVsbCBjb21tZW50LgotLlRQCi0uQiBkdW1wXC1mdW5jdGlvbnMKLVByaW50IGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFuZCB0aGVpciBrZXkgYmluZGluZ3MgdG8gdGhlCi1yZWFkbGluZSBvdXRwdXQgc3RyZWFtLiAgSWYgYSBudW1lcmljIGFyZ3VtZW50IGlzIHN1cHBsaWVkLAotdGhlIG91dHB1dCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQKLW9mIGFuIFxmSWlucHV0cmNcZlAgZmlsZS4KLS5UUAotLkIgZHVtcFwtdmFyaWFibGVzCi1QcmludCBhbGwgb2YgdGhlIHNldHRhYmxlIHZhcmlhYmxlcyBhbmQgdGhlaXIgdmFsdWVzIHRvIHRoZQotcmVhZGxpbmUgb3V0cHV0IHN0cmVhbS4gIElmIGEgbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwKLXRoZSBvdXRwdXQgaXMgZm9ybWF0dGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgbWFkZSBwYXJ0Ci1vZiBhbiBcZklpbnB1dHJjXGZQIGZpbGUuCi0uVFAKLS5CIGR1bXBcLW1hY3JvcwotUHJpbnQgYWxsIG9mIHRoZSByZWFkbGluZSBrZXkgc2VxdWVuY2VzIGJvdW5kIHRvIG1hY3JvcyBhbmQgdGhlCi1zdHJpbmdzIHRoZXkgb3VwdXQuICBJZiBhIG51bWVyaWMgYXJndW1lbnQgaXMgc3VwcGxpZWQsCi10aGUgb3V0cHV0IGlzIGZvcm1hdHRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuIGJlIG1hZGUgcGFydAotb2YgYW4gXGZJaW5wdXRyY1xmUCBmaWxlLgotLlRQCi0uQiBlbWFjc1wtZWRpdGluZ1wtbW9kZSAoQ1wtZSkKLVdoZW4gaW4KLS5CIHZpCi1lZGl0aW5nIG1vZGUsIHRoaXMgY2F1c2VzIGEgc3dpdGNoIHRvCi0uQiBlbWFjcwotZWRpdGluZyBtb2RlLgotLlRQCi0uQiB2aVwtZWRpdGluZ1wtbW9kZSAoTVwtQ1wtaikKLVdoZW4gaW4KLS5CIGVtYWNzCi1lZGl0aW5nIG1vZGUsIHRoaXMgY2F1c2VzIGEgc3dpdGNoIHRvCi0uQiB2aQotZWRpdGluZyBtb2RlLgotLlBECi0uU0ggREVGQVVMVCBLRVkgQklORElOR1MKLS5MUAotVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIGRlZmF1bHQgZW1hY3MgYW5kIHZpIGJpbmRpbmdzLgotQ2hhcmFjdGVycyB3aXRoIHRoZSA4dGggYml0IHNldCBhcmUgd3JpdHRlbiBhcyBNXC08Y2hhcmFjdGVyPiwgYW5kCi1hcmUgcmVmZXJyZWQgdG8gYXMKLS5JIG1ldGFmaWVkCi1jaGFyYWN0ZXJzLgotVGhlIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzIG5vdCBtZW50aW9uZWQgaW4gdGhlIGxpc3Qgb2YgZW1hY3MKLXN0YW5kYXJkIGJpbmRpbmdzIGFyZSBib3VuZCB0byB0aGUKLS5JIHNlbGZcLWluc2VydAotZnVuY3Rpb24sIHdoaWNoIGp1c3QgaW5zZXJ0cyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGludG8gdGhlIGlucHV0IGxpbmUuCi1JbiB2aSBpbnNlcnRpb24gbW9kZSwgYWxsIGNoYXJhY3RlcnMgbm90IHNwZWNpZmljYWxseSBtZW50aW9uZWQgYXJlCi1ib3VuZCB0bwotLklSIHNlbGZcLWluc2VydCAuCi1DaGFyYWN0ZXJzIGFzc2lnbmVkIHRvIHNpZ25hbCBnZW5lcmF0aW9uIGJ5Ci0uSVIgc3R0eSAoMSkKLW9yIHRoZSB0ZXJtaW5hbCBkcml2ZXIsIHN1Y2ggYXMgQy1aIG9yIEMtQywKLXJldGFpbiB0aGF0IGZ1bmN0aW9uLgotVXBwZXIgYW5kIGxvd2VyIGNhc2UKLS5JIG1ldGFmaWVkCi1jaGFyYWN0ZXJzIGFyZSBib3VuZCB0byB0aGUgc2FtZSBmdW5jdGlvbiBpbiB0aGUgZW1hY3MgbW9kZQotbWV0YSBrZXltYXAuCi1UaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIHVuYm91bmQsIHdoaWNoIGNhdXNlcyByZWFkbGluZQotdG8gcmluZyB0aGUgYmVsbCAoc3ViamVjdCB0byB0aGUgc2V0dGluZyBvZiB0aGUKLS5CIGJlbGxcLXN0eWxlCi12YXJpYWJsZSkuCi0uU1MgRW1hY3MgTW9kZQotLlJTICsuNmkKLS5uZgotLnRhIDIuNWkKLS5zcAotRW1hY3MgU3RhbmRhcmQgYmluZGluZ3MKLS5zcAotIkMtQCIgIHNldC1tYXJrCi0iQy1BIiAgYmVnaW5uaW5nLW9mLWxpbmUKLSJDLUIiICBiYWNrd2FyZC1jaGFyCi0iQy1EIiAgZGVsZXRlLWNoYXIKLSJDLUUiICBlbmQtb2YtbGluZQotIkMtRiIgIGZvcndhcmQtY2hhcgotIkMtRyIgIGFib3J0Ci0iQy1IIiAgYmFja3dhcmQtZGVsZXRlLWNoYXIKLSJDLUkiICBjb21wbGV0ZQotIkMtSiIgIGFjY2VwdC1saW5lCi0iQy1LIiAga2lsbC1saW5lCi0iQy1MIiAgY2xlYXItc2NyZWVuCi0iQy1NIiAgYWNjZXB0LWxpbmUKLSJDLU4iICBuZXh0LWhpc3RvcnkKLSJDLVAiICBwcmV2aW91cy1oaXN0b3J5Ci0iQy1RIiAgcXVvdGVkLWluc2VydAotIkMtUiIgIHJldmVyc2Utc2VhcmNoLWhpc3RvcnkKLSJDLVMiICBmb3J3YXJkLXNlYXJjaC1oaXN0b3J5Ci0iQy1UIiAgdHJhbnNwb3NlLWNoYXJzCi0iQy1VIiAgdW5peC1saW5lLWRpc2NhcmQKLSJDLVYiICBxdW90ZWQtaW5zZXJ0Ci0iQy1XIiAgdW5peC13b3JkLXJ1Ym91dAotIkMtWSIgIHlhbmsKLSJDLV0iICBjaGFyYWN0ZXItc2VhcmNoCi0iQy1fIiAgdW5kbwotIlxeICIgdG8gIi8iICBzZWxmLWluc2VydAotIjAiICB0byAiOSIgIHNlbGYtaW5zZXJ0Ci0iOiIgIHRvICJ+IiAgc2VsZi1pbnNlcnQKLSJDLT8iICBiYWNrd2FyZC1kZWxldGUtY2hhcgotLlBQCi1FbWFjcyBNZXRhIGJpbmRpbmdzCi0uc3AKLSJNLUMtRyIgIGFib3J0Ci0iTS1DLUgiICBiYWNrd2FyZC1raWxsLXdvcmQKLSJNLUMtSSIgIHRhYi1pbnNlcnQKLSJNLUMtSiIgIHZpLWVkaXRpbmctbW9kZQotIk0tQy1NIiAgdmktZWRpdGluZy1tb2RlCi0iTS1DLVIiICByZXZlcnQtbGluZQotIk0tQy1ZIiAgeWFuay1udGgtYXJnCi0iTS1DLVsiICBjb21wbGV0ZQotIk0tQy1dIiAgY2hhcmFjdGVyLXNlYXJjaC1iYWNrd2FyZAotIk0tc3BhY2UiICBzZXQtbWFyawotIk0tIyIgIGluc2VydC1jb21tZW50Ci0iTS0mIiAgdGlsZGUtZXhwYW5kCi0iTS0qIiAgaW5zZXJ0LWNvbXBsZXRpb25zCi0iTS0tIiAgZGlnaXQtYXJndW1lbnQKLSJNLS4iICB5YW5rLWxhc3QtYXJnCi0iTS0wIiAgZGlnaXQtYXJndW1lbnQKLSJNLTEiICBkaWdpdC1hcmd1bWVudAotIk0tMiIgIGRpZ2l0LWFyZ3VtZW50Ci0iTS0zIiAgZGlnaXQtYXJndW1lbnQKLSJNLTQiICBkaWdpdC1hcmd1bWVudAotIk0tNSIgIGRpZ2l0LWFyZ3VtZW50Ci0iTS02IiAgZGlnaXQtYXJndW1lbnQKLSJNLTciICBkaWdpdC1hcmd1bWVudAotIk0tOCIgIGRpZ2l0LWFyZ3VtZW50Ci0iTS05IiAgZGlnaXQtYXJndW1lbnQKLSJNLTwiICBiZWdpbm5pbmctb2YtaGlzdG9yeQotIk0tPSIgIHBvc3NpYmxlLWNvbXBsZXRpb25zCi0iTS0+IiAgZW5kLW9mLWhpc3RvcnkKLSJNLT8iICBwb3NzaWJsZS1jb21wbGV0aW9ucwotIk0tQiIgIGJhY2t3YXJkLXdvcmQKLSJNLUMiICBjYXBpdGFsaXplLXdvcmQKLSJNLUQiICBraWxsLXdvcmQKLSJNLUYiICBmb3J3YXJkLXdvcmQKLSJNLUwiICBkb3duY2FzZS13b3JkCi0iTS1OIiAgbm9uLWluY3JlbWVudGFsLWZvcndhcmQtc2VhcmNoLWhpc3RvcnkKLSJNLVAiICBub24taW5jcmVtZW50YWwtcmV2ZXJzZS1zZWFyY2gtaGlzdG9yeQotIk0tUiIgIHJldmVydC1saW5lCi0iTS1UIiAgdHJhbnNwb3NlLXdvcmRzCi0iTS1VIiAgdXBjYXNlLXdvcmQKLSJNLVkiICB5YW5rLXBvcAotIk0tXGUiICBkZWxldGUtaG9yaXpvbnRhbC1zcGFjZQotIk0tfiIgIHRpbGRlLWV4cGFuZAotIk0tQy0/IiAgYmFja3dhcmQtZGVsZXRlLXdvcmQKLSJNLV8iICB5YW5rLWxhc3QtYXJnCi0uUFAKLUVtYWNzIENvbnRyb2wtWCBiaW5kaW5ncwotLnNwCi0iQy1YQy1HIiAgYWJvcnQKLSJDLVhDLVIiICByZS1yZWFkLWluaXQtZmlsZQotIkMtWEMtVSIgIHVuZG8KLSJDLVhDLVgiICBleGNoYW5nZS1wb2ludC1hbmQtbWFyawotIkMtWCgiICBzdGFydC1rYmQtbWFjcm8KLSJDLVgpIiAgZW5kLWtiZC1tYWNybwotIkMtWEUiICBjYWxsLWxhc3Qta2JkLW1hY3JvCi0iQy1YQy0/IiAgYmFja3dhcmQta2lsbC1saW5lCi0uc3AKLS5SRQotLlNTIFZJIE1vZGUgYmluZGluZ3MKLS5SUyArLjZpCi0ubmYKLS50YSAyLjVpCi0uc3AKLS5QUAotVkkgSW5zZXJ0IE1vZGUgZnVuY3Rpb25zCi0uc3AKLSJDLUQiICB2aS1lb2YtbWF5YmUKLSJDLUgiICBiYWNrd2FyZC1kZWxldGUtY2hhcgotIkMtSSIgIGNvbXBsZXRlCi0iQy1KIiAgYWNjZXB0LWxpbmUKLSJDLU0iICBhY2NlcHQtbGluZQotIkMtUiIgIHJldmVyc2Utc2VhcmNoLWhpc3RvcnkKLSJDLVMiICBmb3J3YXJkLXNlYXJjaC1oaXN0b3J5Ci0iQy1UIiAgdHJhbnNwb3NlLWNoYXJzCi0iQy1VIiAgdW5peC1saW5lLWRpc2NhcmQKLSJDLVYiICBxdW90ZWQtaW5zZXJ0Ci0iQy1XIiAgdW5peC13b3JkLXJ1Ym91dAotIkMtWSIgIHlhbmsKLSJDLVsiICB2aS1tb3ZlbWVudC1tb2RlCi0iQy1fIiAgdW5kbwotIlxeICIgdG8gIn4iICBzZWxmLWluc2VydAotIkMtPyIgIGJhY2t3YXJkLWRlbGV0ZS1jaGFyCi0uUFAKLVZJIENvbW1hbmQgTW9kZSBmdW5jdGlvbnMKLS5zcAotIkMtRCIgIHZpLWVvZi1tYXliZQotIkMtRSIgIGVtYWNzLWVkaXRpbmctbW9kZQotIkMtRyIgIGFib3J0Ci0iQy1IIiAgYmFja3dhcmQtY2hhcgotIkMtSiIgIGFjY2VwdC1saW5lCi0iQy1LIiAga2lsbC1saW5lCi0iQy1MIiAgY2xlYXItc2NyZWVuCi0iQy1NIiAgYWNjZXB0LWxpbmUKLSJDLU4iICBuZXh0LWhpc3RvcnkKLSJDLVAiICBwcmV2aW91cy1oaXN0b3J5Ci0iQy1RIiAgcXVvdGVkLWluc2VydAotIkMtUiIgIHJldmVyc2Utc2VhcmNoLWhpc3RvcnkKLSJDLVMiICBmb3J3YXJkLXNlYXJjaC1oaXN0b3J5Ci0iQy1UIiAgdHJhbnNwb3NlLWNoYXJzCi0iQy1VIiAgdW5peC1saW5lLWRpc2NhcmQKLSJDLVYiICBxdW90ZWQtaW5zZXJ0Ci0iQy1XIiAgdW5peC13b3JkLXJ1Ym91dAotIkMtWSIgIHlhbmsKLSJcXiAiICBmb3J3YXJkLWNoYXIKLSIjIiAgaW5zZXJ0LWNvbW1lbnQKLSIkIiAgZW5kLW9mLWxpbmUKLSIlIiAgdmktbWF0Y2gKLSImIiAgdmktdGlsZGUtZXhwYW5kCi0iKiIgIHZpLWNvbXBsZXRlCi0iKyIgIG5leHQtaGlzdG9yeQotIiwiICB2aS1jaGFyLXNlYXJjaAotIi0iICBwcmV2aW91cy1oaXN0b3J5Ci0iLiIgIHZpLXJlZG8KLSIvIiAgdmktc2VhcmNoCi0iMCIgIGJlZ2lubmluZy1vZi1saW5lCi0iMSIgdG8gIjkiICB2aS1hcmctZGlnaXQKLSI7IiAgdmktY2hhci1zZWFyY2gKLSI9IiAgdmktY29tcGxldGUKLSI/IiAgdmktc2VhcmNoCi0iQSIgIHZpLWFwcGVuZC1lb2wKLSJCIiAgdmktcHJldi13b3JkCi0iQyIgIHZpLWNoYW5nZS10bwotIkQiICB2aS1kZWxldGUtdG8KLSJFIiAgdmktZW5kLXdvcmQKLSJGIiAgdmktY2hhci1zZWFyY2gKLSJHIiAgdmktZmV0Y2gtaGlzdG9yeQotIkkiICB2aS1pbnNlcnQtYmVnCi0iTiIgIHZpLXNlYXJjaC1hZ2FpbgotIlAiICB2aS1wdXQKLSJSIiAgdmktcmVwbGFjZQotIlMiICB2aS1zdWJzdAotIlQiICB2aS1jaGFyLXNlYXJjaAotIlUiICByZXZlcnQtbGluZQotIlciICB2aS1uZXh0LXdvcmQKLSJYIiAgYmFja3dhcmQtZGVsZXRlLWNoYXIKLSJZIiAgdmkteWFuay10bwotIlxlIiAgdmktY29tcGxldGUKLSJeIiAgdmktZmlyc3QtcHJpbnQKLSJfIiAgdmkteWFuay1hcmcKLSJgIiAgdmktZ290by1tYXJrCi0iYSIgIHZpLWFwcGVuZC1tb2RlCi0iYiIgIHZpLXByZXYtd29yZAotImMiICB2aS1jaGFuZ2UtdG8KLSJkIiAgdmktZGVsZXRlLXRvCi0iZSIgIHZpLWVuZC13b3JkCi0iZiIgIHZpLWNoYXItc2VhcmNoCi0iaCIgIGJhY2t3YXJkLWNoYXIKLSJpIiAgdmktaW5zZXJ0aW9uLW1vZGUKLSJqIiAgbmV4dC1oaXN0b3J5Ci0iayIgIHByZXYtaGlzdG9yeQotImwiICBmb3J3YXJkLWNoYXIKLSJtIiAgdmktc2V0LW1hcmsKLSJuIiAgdmktc2VhcmNoLWFnYWluCi0icCIgIHZpLXB1dAotInIiICB2aS1jaGFuZ2UtY2hhcgotInMiICB2aS1zdWJzdAotInQiICB2aS1jaGFyLXNlYXJjaAotInUiICB1bmRvCi0idyIgIHZpLW5leHQtd29yZAotIngiICB2aS1kZWxldGUKLSJ5IiAgdmkteWFuay10bwotInwiICB2aS1jb2x1bW4KLSJ+IiAgdmktY2hhbmdlLWNhc2UKLS5SRQotLlNIICJTRUUgQUxTTyIKLS5QRCAwCi0uVFAKLVxmSVRoZSBHbnUgUmVhZGxpbmUgTGlicmFyeVxmUCwgQnJpYW4gRm94IGFuZCBDaGV0IFJhbWV5Ci0uVFAKLVxmSVRoZSBHbnUgSGlzdG9yeSBMaWJyYXJ5XGZQLCBCcmlhbiBGb3ggYW5kIENoZXQgUmFtZXkKLS5UUAotXGZJYmFzaFxmUCgxKQotLlBECi0uU0ggRklMRVMKLS5QRCAwCi0uVFAKLS5GTiB+Ly5pbnB1dHJjCi1JbmRpdmlkdWFsIFxmQnJlYWRsaW5lXGZQIGluaXRpYWxpemF0aW9uIGZpbGUKLS5QRAotLlNIIEFVVEhPUlMKLUJyaWFuIEZveCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChwcmltYXJ5IGF1dGhvcikKLS5icgotYmZveEBhaS5NSVQuRWR1Ci0uUFAKLUNoZXQgUmFtZXksIENhc2UgV2VzdGVybiBSZXNlcnZlIFVuaXZlcnNpdHkKLS5icgotY2hldEBpbnMuQ1dSVS5FZHUKLS5TSCBCVUcgUkVQT1JUUwotSWYgeW91IGZpbmQgYSBidWcgaW4KLS5CIHJlYWRsaW5lLAoteW91IHNob3VsZCByZXBvcnQgaXQuICBCdXQgZmlyc3QsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0aGF0IGl0IHJlYWxseSBpcyBhIGJ1ZywgYW5kIHRoYXQgaXQgYXBwZWFycyBpbiB0aGUgbGF0ZXN0Ci12ZXJzaW9uIG9mIHRoZQotLkIgcmVhZGxpbmUKLWxpYnJhcnkgdGhhdCB5b3UgaGF2ZS4KLS5QUAotT25jZSB5b3UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgYSBidWcgYWN0dWFsbHkgZXhpc3RzLCBtYWlsIGEKLWJ1ZyByZXBvcnQgdG8gXGZJYnVnXC1yZWFkbGluZVxmUEBcZklnbnUub3JnXGZQLgotSWYgeW91IGhhdmUgYSBmaXgsIHlvdSBhcmUgd2VsY29tZSB0byBtYWlsIHRoYXQKLWFzIHdlbGwhICBTdWdnZXN0aW9ucyBhbmQgYHBoaWxvc29waGljYWwnIGJ1ZyByZXBvcnRzIG1heSBiZSBtYWlsZWQKLXRvIFxmUGJ1Zy1yZWFkbGluZVxmUEBcZklnbnUub3JnXGZQIG9yIHBvc3RlZCB0byB0aGUgVXNlbmV0Ci1uZXdzZ3JvdXAKLS5CUiBnbnUuYmFzaC5idWcgLgotLlBQCi1Db21tZW50cyBhbmQgYnVnIHJlcG9ydHMgY29uY2VybmluZwotdGhpcyBtYW51YWwgcGFnZSBzaG91bGQgYmUgZGlyZWN0ZWQgdG8KLS5JUiBjaGV0QGlucy5DV1JVLkVkdSAuCi0uU0ggQlVHUwotLlBQCi1JdCdzIHRvbyBiaWcgYW5kIHRvbyBzbG93LgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3JsbWFuLnRleGluZm8gYi9yZWFkbGluZS9kb2MvcmxtYW4udGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYWZiZi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9kb2MvcmxtYW4udGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICBAYyAtKi10ZXhpbmZvLSotCi1AY29tbWVudCAlKipzdGFydCBvZiBoZWFkZXIgKFRoaXMgaXMgZm9yIHJ1bm5pbmcgVGV4aW5mbyBvbiBhIHJlZ2lvbi4pCi1Ac2V0ZmlsZW5hbWUgcmVhZGxpbmUuaW5mbwotQHNldHRpdGxlIEdOVSBSZWFkbGluZSBMaWJyYXJ5Ci1AY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQotQHN5bmluZGV4IHZyIGZuCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi0KLUBpbmNsdWRlIG1hbnZlcnMudGV4aW5mbwotCi1AaWZpbmZvCi1AZGlyY2F0ZWdvcnkgTGlicmFyaWVzCi1AZGlyZW50cnkKLSogUmVhZGxpbmU6IChyZWFkbGluZSkuICAgICAgIFRoZSBHTlUgcmVhZGxpbmUgbGlicmFyeSBBUEkKLUBlbmQgZGlyZW50cnkKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIHV0aWxpdHkgd2hpY2ggYWlkcwotaW4gdGhlIGNvbnNpc3RlbmN5IG9mIHVzZXIgaW50ZXJmYWNlIGFjcm9zcyBkaXNjcmV0ZSBwcm9ncmFtcyB0aGF0IG5lZWQKLXRvIHByb3ZpZGUgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotCi1Db3B5cmlnaHQgKEMpIDE5ODgtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotcGFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UgIAotQHRpdGxlIEdOVSBSZWFkbGluZSBMaWJyYXJ5Ci1Ac3VidGl0bGUgRWRpdGlvbiBAdmFsdWV7RURJVElPTn0sIGZvciBAY29kZXtSZWFkbGluZSBMaWJyYXJ5fSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLUBzdWJ0aXRsZSBAdmFsdWV7VVBEQVRFLU1PTlRIfQotQGF1dGhvciBCcmlhbiBGb3gsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotQGF1dGhvciBDaGV0IFJhbWV5LCBDYXNlIFdlc3Rlcm4gUmVzZXJ2ZSBVbml2ZXJzaXR5Ci0KLUBwYWdlCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgdXRpbGl0eSB3aGljaCBhaWRzCi1pbiB0aGUgY29uc2lzdGVuY3kgb2YgdXNlciBpbnRlcmZhY2UgYWNyb3NzIGRpc2NyZXRlIHByb2dyYW1zIHRoYXQgbmVlZAotdG8gcHJvdmlkZSBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuCi0KLVB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEAqCi02NzUgTWFzc2FjaHVzZXR0cyBBdmVudWUsIEAqCi1DYW1icmlkZ2UsIE1BIDAyMTM5IFVTQQotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgR05VIFJlYWRsaW5lIExpYnJhcnkKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIHV0aWxpdHkgd2hpY2ggYWlkcwotaW4gdGhlIGNvbnNpc3RlbmN5IG9mIHVzZXIgaW50ZXJmYWNlIGFjcm9zcyBkaXNjcmV0ZSBwcm9ncmFtcyB0aGF0IG5lZWQKLXRvIHByb3ZpZGUgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotCi1AbWVudQotKiBDb21tYW5kIExpbmUgRWRpdGluZzo6CSAgIEdOVSBSZWFkbGluZSBVc2VyJ3MgTWFudWFsLgotKiBQcm9ncmFtbWluZyB3aXRoIEdOVSBSZWFkbGluZTo6ICBHTlUgUmVhZGxpbmUgUHJvZ3JhbW1lcidzIE1hbnVhbC4KLSogQ29uY2VwdCBJbmRleDo6CQkgICBJbmRleCBvZiBjb25jZXB0cyBkZXNjcmliZWQgaW4gdGhpcyBtYW51YWwuCi0qIEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBJbmRleDo6CSAgIEluZGV4IG9mIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMKLQkJCQkgICBhbmQgdmFyaWFibGVzLgotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1AaW5jbHVkZSBybHVzZXIudGV4aW5mbwotQGluY2x1ZGUgcmx0ZWNoLnRleGluZm8KLQotQG5vZGUgQ29uY2VwdCBJbmRleAotQHVubnVtYmVyZWQgQ29uY2VwdCBJbmRleAotQHByaW50aW5kZXggY3AKLQotQG5vZGUgRnVuY3Rpb24gYW5kIFZhcmlhYmxlIEluZGV4Ci1AdW5udW1iZXJlZCBGdW5jdGlvbiBhbmQgVmFyaWFibGUgSW5kZXgKLUBwcmludGluZGV4IGZuCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3JsdGVjaC50ZXhpbmZvIGIvcmVhZGxpbmUvZG9jL3JsdGVjaC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThkN2Y4Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2RvYy9ybHRlY2gudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDE3MDcgKzAsMCBAQAotQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQotQHNldGZpbGVuYW1lIHJsdGVjaC5pbmZvCi1AY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotCi1AaWZpbmZvCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgdXRpbGl0eSBmb3IgYWlkaW5nCi1pbiB0aGUgY29uc2l0ZW5jeSBvZiB1c2VyIGludGVyZmFjZSBhY3Jvc3MgZGlzY3JldGUgcHJvZ3JhbXMgdGhhdCBuZWVkCi10byBwcm92aWRlIGEgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTk0LCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1wYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUBub2RlIFByb2dyYW1taW5nIHdpdGggR05VIFJlYWRsaW5lCi1AY2hhcHRlciBQcm9ncmFtbWluZyB3aXRoIEdOVSBSZWFkbGluZQotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnkgYW5kCi1vdGhlciBwcm9ncmFtcy4gIElmIHlvdSBhcmUgYSBwcm9ncmFtbWVyLCBhbmQgeW91IHdpc2ggdG8gaW5jbHVkZSB0aGUKLWZlYXR1cmVzIGZvdW5kIGluIEdOVSBSZWFkbGluZQotc3VjaCBhcyBjb21wbGV0aW9uLCBsaW5lIGVkaXRpbmcsIGFuZCBpbnRlcmFjdGl2ZSBoaXN0b3J5IG1hbmlwdWxhdGlvbgotaW4geW91ciBvd24gcHJvZ3JhbXMsIHRoaXMgc2VjdGlvbiBpcyBmb3IgeW91LgotCi1AbWVudQotKiBCYXNpYyBCZWhhdmlvcjo6CVVzaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIFJlYWRsaW5lLgotKiBDdXN0b20gRnVuY3Rpb25zOjoJQWRkaW5nIHlvdXIgb3duIGZ1bmN0aW9ucyB0byBSZWFkbGluZS4KLSogUmVhZGxpbmUgVmFyaWFibGVzOjoJCQlWYXJpYWJsZXMgYWNjZXNzaWJsZSB0byBjdXN0b20KLQkJCQkJZnVuY3Rpb25zLgotKiBSZWFkbGluZSBDb252ZW5pZW5jZSBGdW5jdGlvbnM6OglGdW5jdGlvbnMgd2hpY2ggUmVhZGxpbmUgc3VwcGxpZXMgdG8KLQkJCQkJYWlkIGluIHdyaXRpbmcgeW91ciBvd24gY3VzdG9tCi0JCQkJCWZ1bmN0aW9ucy4KLSogUmVhZGxpbmUgU2lnbmFsIEhhbmRsaW5nOjoJSG93IFJlYWRsaW5lIGJlaGF2ZXMgd2hlbiBpdCByZWNlaXZlcyBzaWduYWxzLgotKiBDdXN0b20gQ29tcGxldGVyczo6CVN1cHBsYW50aW5nIG9yIHN1cHBsZW1lbnRpbmcgUmVhZGxpbmUncwotCQkJY29tcGxldGlvbiBmdW5jdGlvbnMuCi1AZW5kIG1lbnUKLQotQG5vZGUgQmFzaWMgQmVoYXZpb3IKLUBzZWN0aW9uIEJhc2ljIEJlaGF2aW9yCi0KLU1hbnkgcHJvZ3JhbXMgcHJvdmlkZSBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UsIHN1Y2ggYXMgQGNvZGV7bWFpbH0sCi1AY29kZXtmdHB9LCBhbmQgQGNvZGV7c2h9LiAgRm9yIHN1Y2ggcHJvZ3JhbXMsIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZgotUmVhZGxpbmUgaXMgc3VmZmljaWVudC4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHRvIHVzZSBSZWFkbGluZSBpbgotdGhlIHNpbXBsZXN0IHdheSBwb3NzaWJsZSwgcGVyaGFwcyB0byByZXBsYWNlIGNhbGxzIGluIHlvdXIgY29kZSB0bwotQGNvZGV7Z2V0cygpfSBvciBAY29kZXtmZ2V0cyAoKX0uCi0KLUBmaW5kZXggcmVhZGxpbmUKLUBjaW5kZXggcmVhZGxpbmUsIGZ1bmN0aW9uCi1UaGUgZnVuY3Rpb24gQGNvZGV7cmVhZGxpbmUgKCl9IHByaW50cyBhIHByb21wdCBhbmQgdGhlbiByZWFkcyBhbmQgcmV0dXJucwotYSBzaW5nbGUgbGluZSBvZiB0ZXh0IGZyb20gdGhlIHVzZXIuICBUaGUgbGluZSBAY29kZXtyZWFkbGluZX0KLXJldHVybnMgaXMgYWxsb2NhdGVkIHdpdGggQGNvZGV7bWFsbG9jICgpfTsgeW91IHNob3VsZCBAY29kZXtmcmVlICgpfQotdGhlIGxpbmUgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4gIFRoZSBkZWNsYXJhdGlvbiBmb3IgQGNvZGV7cmVhZGxpbmV9Ci1pbiBBTlNJIEMgaXMKLQotQGV4YW1wbGUKLUBjb2Rle2NoYXIgKnJlYWRsaW5lIChjaGFyICpAdmFye3Byb21wdH0pO30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVNvLCBvbmUgbWlnaHQgc2F5Ci1AZXhhbXBsZQotQGNvZGV7Y2hhciAqbGluZSA9IHJlYWRsaW5lICgiRW50ZXIgYSBsaW5lOiAiKTt9Ci1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotaW4gb3JkZXIgdG8gcmVhZCBhIGxpbmUgb2YgdGV4dCBmcm9tIHRoZSB1c2VyLgotVGhlIGxpbmUgcmV0dXJuZWQgaGFzIHRoZSBmaW5hbCBuZXdsaW5lIHJlbW92ZWQsIHNvIG9ubHkgdGhlCi10ZXh0IHJlbWFpbnMuCi0KLUlmIEBjb2Rle3JlYWRsaW5lfSBlbmNvdW50ZXJzIGFuIEBjb2Rle0VPRn0gd2hpbGUgcmVhZGluZyB0aGUgbGluZSwgYW5kIHRoZQotbGluZSBpcyBlbXB0eSBhdCB0aGF0IHBvaW50LCB0aGVuIEBjb2RleyhjaGFyICopTlVMTH0gaXMgcmV0dXJuZWQuCi1PdGhlcndpc2UsIHRoZSBsaW5lIGlzIGVuZGVkIGp1c3QgYXMgaWYgYSBuZXdsaW5lIGhhZCBiZWVuIHR5cGVkLgotCi1JZiB5b3Ugd2FudCB0aGUgdXNlciB0byBiZSBhYmxlIHRvIGdldCBhdCB0aGUgbGluZSBsYXRlciwgKHdpdGgKLUBrZXl7Qy1wfSBmb3IgZXhhbXBsZSksIHlvdSBtdXN0IGNhbGwgQGNvZGV7YWRkX2hpc3RvcnkgKCl9IHRvIHNhdmUgdGhlCi1saW5lIGF3YXkgaW4gYSBAZGZue2hpc3Rvcnl9IGxpc3Qgb2Ygc3VjaCBsaW5lcy4KLQotQGV4YW1wbGUKLUBjb2Rle2FkZF9oaXN0b3J5IChsaW5lKX07Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Gb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5LCBzZWUgdGhlIGFzc29jaWF0ZWQgbWFudWFsLgotCi1JdCBpcyBwcmVmZXJhYmxlIHRvIGF2b2lkIHNhdmluZyBlbXB0eSBsaW5lcyBvbiB0aGUgaGlzdG9yeSBsaXN0LCBzaW5jZQotdXNlcnMgcmFyZWx5IGhhdmUgYSBidXJuaW5nIG5lZWQgdG8gcmV1c2UgYSBibGFuayBsaW5lLiAgSGVyZSBpcwotYSBmdW5jdGlvbiB3aGljaCB1c2VmdWxseSByZXBsYWNlcyB0aGUgc3RhbmRhcmQgQGNvZGV7Z2V0cyAoKX0gbGlicmFyeQotZnVuY3Rpb24sIGFuZCBoYXMgdGhlIGFkdmFudGFnZSBvZiBubyBzdGF0aWMgYnVmZmVyIHRvIG92ZXJmbG93OgotCi1AZXhhbXBsZQotLyogQSBzdGF0aWMgdmFyaWFibGUgZm9yIGhvbGRpbmcgdGhlIGxpbmUuICovCi1zdGF0aWMgY2hhciAqbGluZV9yZWFkID0gKGNoYXIgKilOVUxMOwotCi0vKiBSZWFkIGEgc3RyaW5nLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIFJldHVybnMgTlVMTCBvbiBFT0YuICovCi1jaGFyICoKLXJsX2dldHMgKCkKLUB7Ci0gIC8qIElmIHRoZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHJldHVybiB0aGUgbWVtb3J5Ci0gICAgIHRvIHRoZSBmcmVlIHBvb2wuICovCi0gIGlmIChsaW5lX3JlYWQpCi0gICAgQHsKLSAgICAgIGZyZWUgKGxpbmVfcmVhZCk7Ci0gICAgICBsaW5lX3JlYWQgPSAoY2hhciAqKU5VTEw7Ci0gICAgQH0KLQotICAvKiBHZXQgYSBsaW5lIGZyb20gdGhlIHVzZXIuICovCi0gIGxpbmVfcmVhZCA9IHJlYWRsaW5lICgiIik7Ci0KLSAgLyogSWYgdGhlIGxpbmUgaGFzIGFueSB0ZXh0IGluIGl0LCBzYXZlIGl0IG9uIHRoZSBoaXN0b3J5LiAqLwotICBpZiAobGluZV9yZWFkICYmICpsaW5lX3JlYWQpCi0gICAgYWRkX2hpc3RvcnkgKGxpbmVfcmVhZCk7Ci0KLSAgcmV0dXJuIChsaW5lX3JlYWQpOwotQH0KLUBlbmQgZXhhbXBsZQotCi1UaGlzIGZ1bmN0aW9uIGdpdmVzIHRoZSB1c2VyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBAa2V5e1RBQn0KLWNvbXBsZXRpb246IGNvbXBsZXRpb24gb24gZmlsZSBuYW1lcy4gIElmIHlvdSBkbyBub3Qgd2FudCBSZWFkbGluZSB0bwotY29tcGxldGUgb24gZmlsZW5hbWVzLCB5b3UgY2FuIGNoYW5nZSB0aGUgYmluZGluZyBvZiB0aGUgQGtleXtUQUJ9IGtleQotd2l0aCBAY29kZXtybF9iaW5kX2tleSAoKX0uCi0KLUBleGFtcGxlCi1AY29kZXtpbnQgcmxfYmluZF9rZXkgKGludCBAdmFye2tleX0sIGludCAoKkB2YXJ7ZnVuY3Rpb259KSgpKTt9Ci1AZW5kIGV4YW1wbGUKLQotQGNvZGV7cmxfYmluZF9rZXkgKCl9IHRha2VzIHR3byBhcmd1bWVudHM6IEB2YXJ7a2V5fSBpcyB0aGUgY2hhcmFjdGVyIHRoYXQKLXlvdSB3YW50IHRvIGJpbmQsIGFuZCBAdmFye2Z1bmN0aW9ufSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdG8KLWNhbGwgd2hlbiBAdmFye2tleX0gaXMgcHJlc3NlZC4gIEJpbmRpbmcgQGtleXtUQUJ9IHRvIEBjb2Rle3JsX2luc2VydCAoKX0KLW1ha2VzIEBrZXl7VEFCfSBpbnNlcnQgaXRzZWxmLgotQGNvZGV7cmxfYmluZF9rZXkgKCl9IHJldHVybnMgbm9uLXplcm8gaWYgQHZhcntrZXl9IGlzIG5vdCBhIHZhbGlkCi1BU0NJSSBjaGFyYWN0ZXIgY29kZSAoYmV0d2VlbiAwIGFuZCAyNTUpLgotCi1UaHVzLCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IEBrZXl7VEFCfSBiZWhhdmlvciwgdGhlIGZvbGxvd2luZyBzdWZmaWNlczoKLUBleGFtcGxlCi1AY29kZXtybF9iaW5kX2tleSAoJ1x0JywgcmxfaW5zZXJ0KTt9Ci1AZW5kIGV4YW1wbGUKLQotVGhpcyBjb2RlIHNob3VsZCBiZSBleGVjdXRlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiB5b3VyIHByb2dyYW07IHlvdQotbWlnaHQgd3JpdGUgYSBmdW5jdGlvbiBjYWxsZWQgQGNvZGV7aW5pdGlhbGl6ZV9yZWFkbGluZSAoKX0gd2hpY2gKLXBlcmZvcm1zIHRoaXMgYW5kIG90aGVyIGRlc2lyZWQgaW5pdGlhbGl6YXRpb25zLCBzdWNoIGFzIGluc3RhbGxpbmcKLWN1c3RvbSBjb21wbGV0ZXJzIChAcHhyZWZ7Q3VzdG9tIENvbXBsZXRlcnN9KS4KLQotQG5vZGUgQ3VzdG9tIEZ1bmN0aW9ucwotQHNlY3Rpb24gQ3VzdG9tIEZ1bmN0aW9ucwotCi1SZWFkbGluZSBwcm92aWRlcyBtYW55IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSB0ZXh0IG9mCi10aGUgbGluZSwgYnV0IGl0IGlzbid0IHBvc3NpYmxlIHRvIGFudGljaXBhdGUgdGhlIG5lZWRzIG9mIGFsbAotcHJvZ3JhbXMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCi1kZWZpbmVkIHdpdGhpbiB0aGUgUmVhZGxpbmUgbGlicmFyeSB3aGljaCBhbGxvdyBhIHVzZXIgcHJvZ3JhbSB0byBhZGQKLWN1c3RvbWl6ZWQgZnVuY3Rpb25hbGl0eSB0byBSZWFkbGluZS4KLQotQG1lbnUKLSogVGhlIEZ1bmN0aW9uIFR5cGU6OglDIGRlY2xhcmF0aW9ucyB0byBtYWtlIGNvZGUgcmVhZGFibGUuCi0qIEZ1bmN0aW9uIFdyaXRpbmc6OglWYXJpYWJsZXMgYW5kIGNhbGxpbmcgY29udmVudGlvbnMuCi1AZW5kIG1lbnUKLQotQG5vZGUgVGhlIEZ1bmN0aW9uIFR5cGUKLUBzdWJzZWN0aW9uIFRoZSBGdW5jdGlvbiBUeXBlCi0KLUZvciByZWFkYWJpbHR5LCB3ZSBkZWNsYXJlIGEgbmV3IHR5cGUgb2Ygb2JqZWN0LCBjYWxsZWQKLUBkZm57RnVuY3Rpb259LiAgQSBAY29kZXtGdW5jdGlvbn0gaXMgYSBDIGZ1bmN0aW9uIHdoaWNoCi1yZXR1cm5zIGFuIEBjb2Rle2ludH0uICBUaGUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgQGNvZGV7RnVuY3Rpb259IGlzOgotCi1Abm9pbmRlbnQKLUBjb2Rle3R5cGVkZWYgaW50IEZ1bmN0aW9uICgpO30KLQotVGhlIHJlYXNvbiBmb3IgZGVjbGFyaW5nIHRoaXMgbmV3IHR5cGUgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUKLWNvZGUgZGVzY3JpYmluZyBwb2ludGVycyB0byBDIGZ1bmN0aW9ucy4gIExldCB1cyBzYXkgd2UgaGFkIGEgdmFyaWFibGUKLWNhbGxlZCBAdmFye2Z1bmN9IHdoaWNoIHdhcyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbi4gIEluc3RlYWQgb2YgdGhlCi1jbGFzc2ljIEMgZGVjbGFyYXRpb24KLQotQGNvZGV7aW50ICgqKSgpZnVuYzt9Ci0KLUBub2luZGVudAotd2UgbWF5IHdyaXRlCi0KLUBjb2Rle0Z1bmN0aW9uICpmdW5jO30KLQotQG5vaW5kZW50Ci1TaW1pbGFybHksIHRoZXJlIGFyZQotCi1AZXhhbXBsZQotdHlwZWRlZiB2b2lkIFZGdW5jdGlvbiAoKTsKLXR5cGVkZWYgY2hhciAqQ1BGdW5jdGlvbiAoKTsgQHJ7YW5kfQotdHlwZWRlZiBjaGFyICoqQ1BQRnVuY3Rpb24gKCk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1mb3IgZnVuY3Rpb25zIHJldHVybmluZyBubyB2YWx1ZSwgQGNvZGV7cG9pbnRlciB0byBjaGFyfSwgYW5kCi1AY29kZXtwb2ludGVyIHRvIHBvaW50ZXIgdG8gY2hhcn0sIHJlc3BlY3RpdmVseS4KLQotQG5vZGUgRnVuY3Rpb24gV3JpdGluZwotQHN1YnNlY3Rpb24gV3JpdGluZyBhIE5ldyBGdW5jdGlvbgotCi1JbiBvcmRlciB0byB3cml0ZSBuZXcgZnVuY3Rpb25zIGZvciBSZWFkbGluZSwgeW91IG5lZWQgdG8ga25vdyB0aGUKLWNhbGxpbmcgY29udmVudGlvbnMgZm9yIGtleWJvYXJkLWludm9rZWQgZnVuY3Rpb25zLCBhbmQgdGhlIG5hbWVzIG9mIHRoZQotdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpbmUgcmVhZCBzbyBmYXIuCi0KLVRoZSBjYWxsaW5nIHNlcXVlbmNlIGZvciBhIGNvbW1hbmQgQGNvZGV7Zm9vfSBsb29rcyBsaWtlCi0KLUBleGFtcGxlCi1AY29kZXtmb28gKGludCBjb3VudCwgaW50IGtleSl9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2NvdW50fSBpcyB0aGUgbnVtZXJpYyBhcmd1bWVudCAob3IgMSBpZiBkZWZhdWx0ZWQpIGFuZAotQHZhcntrZXl9IGlzIHRoZSBrZXkgdGhhdCBpbnZva2VkIHRoaXMgZnVuY3Rpb24uCi0KLUl0IGlzIGNvbXBsZXRlbHkgdXAgdG8gdGhlIGZ1bmN0aW9uIGFzIHRvIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUKLW51bWVyaWMgYXJndW1lbnQuICBTb21lIGZ1bmN0aW9ucyB1c2UgaXQgYXMgYSByZXBlYXQgY291bnQsIHNvbWUKLWFzIGEgZmxhZywgYW5kIG90aGVycyB0byBjaG9vc2UgYWx0ZXJuYXRlIGJlaGF2aW9yIChyZWZyZXNoaW5nIHRoZSBjdXJyZW50Ci1saW5lIGFzIG9wcG9zZWQgdG8gcmVmcmVzaGluZyB0aGUgc2NyZWVuLCBmb3IgZXhhbXBsZSkuICBTb21lIGNob29zZSB0bwotaWdub3JlIGl0LiAgSW4gZ2VuZXJhbCwgaWYgYQotZnVuY3Rpb24gdXNlcyB0aGUgbnVtZXJpYyBhcmd1bWVudCBhcyBhIHJlcGVhdCBjb3VudCwgaXQgc2hvdWxkIGJlIGFibGUKLXRvIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBib3RoIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBhcmd1bWVudHMuCi1BdCB0aGUgdmVyeSBsZWFzdCwgaXQgc2hvdWxkIGJlIGF3YXJlIHRoYXQgaXQgY2FuIGJlIHBhc3NlZCBhCi1uZWdhdGl2ZSBhcmd1bWVudC4KLQotQG5vZGUgUmVhZGxpbmUgVmFyaWFibGVzCi1Ac2VjdGlvbiBSZWFkbGluZSBWYXJpYWJsZXMKLQotVGhlc2UgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gZnVuY3Rpb24gd3JpdGVycy4KLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfbGluZV9idWZmZXIKLVRoaXMgaXMgdGhlIGxpbmUgZ2F0aGVyZWQgc28gZmFyLiAgWW91IGFyZSB3ZWxjb21lIHRvIG1vZGlmeSB0aGUKLWNvbnRlbnRzIG9mIHRoZSBsaW5lLCBidXQgc2VlIEByZWZ7QWxsb3dpbmcgVW5kb2luZ30uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IHJsX3BvaW50Ci1UaGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiBAY29kZXtybF9saW5lX2J1ZmZlcn0KLSh0aGUgQGVtcGh7cG9pbnR9KS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBpbnQgcmxfZW5kCi1UaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBAY29kZXtybF9saW5lX2J1ZmZlcn0uICBXaGVuCi1AY29kZXtybF9wb2ludH0gaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgQGNvZGV7cmxfcG9pbnR9IGFuZAotQGNvZGV7cmxfZW5kfSBhcmUgZXF1YWwuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IHJsX21hcmsKLVRoZSBtYXJrIChzYXZlZCBwb3NpdGlvbikgaW4gdGhlIGN1cnJlbnQgbGluZS4gIElmIHNldCwgdGhlIG1hcmsKLWFuZCBwb2ludCBkZWZpbmUgYSBAZW1waHtyZWdpb259LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGludCBybF9kb25lCi1TZXR0aW5nIHRoaXMgdG8gYSBub24temVybyB2YWx1ZSBjYXVzZXMgUmVhZGxpbmUgdG8gcmV0dXJuIHRoZSBjdXJyZW50Ci1saW5lIGltbWVkaWF0ZWx5LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGludCBybF9wZW5kaW5nX2lucHV0Ci1TZXR0aW5nIHRoaXMgdG8gYSB2YWx1ZSBtYWtlcyBpdCB0aGUgbmV4dCBrZXlzdHJva2UgcmVhZC4gIFRoaXMgaXMgYQotd2F5IHRvIHN0dWZmIGEgc2luZ2xlIGNoYXJhY3RlciBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IHJsX2VyYXNlX2VtcHR5X2xpbmUKLVNldHRpbmcgdGhpcyB0byBhIG5vbi16ZXJvIHZhbHVlIGNhdXNlcyBSZWFkbGluZSB0byBjb21wbGV0ZWx5IGVyYXNlCi10aGUgY3VycmVudCBsaW5lLCBpbmNsdWRpbmcgYW55IHByb21wdCwgYW55IHRpbWUgYSBuZXdsaW5lIGlzIHR5cGVkIGFzCi10aGUgb25seSBjaGFyYWN0ZXIgb24gYW4gb3RoZXJ3aXNlLWVtcHR5IGxpbmUuICBUaGUgY3Vyc29yIGlzIG1vdmVkIHRvCi10aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXdseS1ibGFuayBsaW5lLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtjaGFyICp9IHJsX3Byb21wdAotVGhlIHByb21wdCBSZWFkbGluZSB1c2VzLiAgVGhpcyBpcyBzZXQgZnJvbSB0aGUgYXJndW1lbnQgdG8KLUBjb2Rle3JlYWRsaW5lICgpfSwgYW5kIHNob3VsZCBub3QgYmUgYXNzaWduZWQgdG8gZGlyZWN0bHkuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfbGlicmFyeV92ZXJzaW9uCi1UaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyByZXZpc2lvbiBvZiB0aGUgbGlicmFyeS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7Y2hhciAqfSBybF90ZXJtaW5hbF9uYW1lCi1UaGUgdGVybWluYWwgdHlwZSwgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfcmVhZGxpbmVfbmFtZQotVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gYSB1bmlxdWUgbmFtZSBieSBlYWNoIGFwcGxpY2F0aW9uIHVzaW5nIFJlYWRsaW5lLgotVGhlIHZhbHVlIGFsbG93cyBjb25kaXRpb25hbCBwYXJzaW5nIG9mIHRoZSBpbnB1dHJjIGZpbGUKLShAcHhyZWZ7Q29uZGl0aW9uYWwgSW5pdCBDb25zdHJ1Y3RzfSkuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge0ZJTEUgKn0gcmxfaW5zdHJlYW0KLVRoZSBzdGRpbyBzdHJlYW0gZnJvbSB3aGljaCBSZWFkbGluZSByZWFkcyBpbnB1dC4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7RklMRSAqfSBybF9vdXRzdHJlYW0KLVRoZSBzdGRpbyBzdHJlYW0gdG8gd2hpY2ggUmVhZGxpbmUgcGVyZm9ybXMgb3V0cHV0LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtGdW5jdGlvbiAqfSBybF9zdGFydHVwX2hvb2sKLUlmIG5vbi16ZXJvLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBqdXN0Ci1iZWZvcmUgQGNvZGV7cmVhZGxpbmV9IHByaW50cyB0aGUgZmlyc3QgcHJvbXB0LgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtGdW5jdGlvbiAqfSBybF9wcmVfaW5wdXRfaG9vawotSWYgbm9uLXplcm8sIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyCi10aGUgZmlyc3QgcHJvbXB0IGhhcyBiZWVuIHByaW50ZWQgYW5kIGp1c3QgYmVmb3JlIEBjb2Rle3JlYWRsaW5lfQotc3RhcnRzIHJlYWRpbmcgaW5wdXQgY2hhcmFjdGVycy4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7RnVuY3Rpb24gKn0gcmxfZXZlbnRfaG9vawotSWYgbm9uLXplcm8sIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIHBlcmlvZGljYWxseQotd2hlbiByZWFkbGluZSBpcyB3YWl0aW5nIGZvciB0ZXJtaW5hbCBpbnB1dC4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7RnVuY3Rpb24gKn0gcmxfZ2V0Y19mdW5jdGlvbgotSWYgbm9uLXplcm8sIEBjb2Rle3JlYWRsaW5lfSB3aWxsIGNhbGwgaW5kaXJlY3RseSB0aHJvdWdoIHRoaXMgcG9pbnRlcgotdG8gZ2V0IGEgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0bwotQGNvZGV7cmxfZ2V0Y30sIHRoZSBkZWZhdWx0IEBjb2Rle3JlYWRsaW5lfSBjaGFyYWN0ZXIgaW5wdXQgZnVuY3Rpb24KLShAcHhyZWZ7VXRpbGl0eSBGdW5jdGlvbnN9KS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7VkZ1bmN0aW9uICp9IHJsX3JlZGlzcGxheV9mdW5jdGlvbgotSWYgbm9uLXplcm8sIEBjb2Rle3JlYWRsaW5lfSB3aWxsIGNhbGwgaW5kaXJlY3RseSB0aHJvdWdoIHRoaXMgcG9pbnRlcgotdG8gdXBkYXRlIHRoZSBkaXNwbGF5IHdpdGggdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGVkaXRpbmcgYnVmZmVyLgotQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIEBjb2Rle3JsX3JlZGlzcGxheX0sIHRoZSBkZWZhdWx0IEBjb2Rle3JlYWRsaW5lfQotcmVkaXNwbGF5IGZ1bmN0aW9uIChAcHhyZWZ7UmVkaXNwbGF5fSkuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge0tleW1hcH0gcmxfZXhlY3V0aW5nX2tleW1hcAotVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGtleW1hcCAoQHB4cmVme0tleW1hcHN9KSBpbiB3aGljaCB0aGUKLWN1cnJlbnRseSBleGVjdXRpbmcgcmVhZGxpbmUgZnVuY3Rpb24gd2FzIGZvdW5kLgotQGVuZCBkZWZ0eXBldmFyIAotCi1AZGVmdHlwZXZhciB7S2V5bWFwfSBybF9iaW5kaW5nX2tleW1hcAotVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGtleW1hcCAoQHB4cmVme0tleW1hcHN9KSBpbiB3aGljaCB0aGUKLWxhc3Qga2V5IGJpbmRpbmcgb2NjdXJyZWQuCi1AZW5kIGRlZnR5cGV2YXIgCi0KLUBub2RlIFJlYWRsaW5lIENvbnZlbmllbmNlIEZ1bmN0aW9ucwotQHNlY3Rpb24gUmVhZGxpbmUgQ29udmVuaWVuY2UgRnVuY3Rpb25zCi0KLUBtZW51Ci0qIEZ1bmN0aW9uIE5hbWluZzo6CUhvdyB0byBnaXZlIGEgZnVuY3Rpb24geW91IHdyaXRlIGEgbmFtZS4KLSogS2V5bWFwczo6CQlNYWtpbmcga2V5bWFwcy4KLSogQmluZGluZyBLZXlzOjoJQ2hhbmdpbmcgS2V5bWFwcy4KLSogQXNzb2NpYXRpbmcgRnVuY3Rpb24gTmFtZXMgYW5kIEJpbmRpbmdzOjoJVHJhbnNsYXRlIGZ1bmN0aW9uIG5hbWVzIHRvCi0JCQkJCQlrZXkgc2VxdWVuY2VzLgotKiBBbGxvd2luZyBVbmRvaW5nOjoJSG93IHRvIG1ha2UgeW91ciBmdW5jdGlvbnMgdW5kb2FibGUuCi0qIFJlZGlzcGxheTo6CQlGdW5jdGlvbnMgdG8gY29udHJvbCBsaW5lIGRpc3BsYXkuCi0qIE1vZGlmeWluZyBUZXh0OjoJRnVuY3Rpb25zIHRvIG1vZGlmeSBAY29kZXtybF9saW5lX2J1ZmZlcn0uCi0qIFV0aWxpdHkgRnVuY3Rpb25zOjoJR2VuZXJhbGx5IHVzZWZ1bCBmdW5jdGlvbnMgYW5kIGhvb2tzLgotKiBBbHRlcm5hdGUgSW50ZXJmYWNlOjoJVXNpbmcgUmVhZGxpbmUgaW4gYSBgY2FsbGJhY2snIGZhc2hpb24uCi1AZW5kIG1lbnUKLQotQG5vZGUgRnVuY3Rpb24gTmFtaW5nCi1Ac3Vic2VjdGlvbiBOYW1pbmcgYSBGdW5jdGlvbgotCi1UaGUgdXNlciBjYW4gZHluYW1pY2FsbHkgY2hhbmdlIHRoZSBiaW5kaW5ncyBvZiBrZXlzIHdoaWxlIHVzaW5nCi1SZWFkbGluZS4gIFRoaXMgaXMgZG9uZSBieSByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uIHdpdGggYSBkZXNjcmlwdGl2ZQotbmFtZS4gIFRoZSB1c2VyIGlzIGFibGUgdG8gdHlwZSB0aGUgZGVzY3JpcHRpdmUgbmFtZSB3aGVuIHJlZmVycmluZyB0bwotdGhlIGZ1bmN0aW9uLiAgVGh1cywgaW4gYW4gaW5pdCBmaWxlLCBvbmUgbWlnaHQgZmluZAotCi1AZXhhbXBsZQotTWV0YS1SdWJvdXQ6CWJhY2t3YXJkLWtpbGwtd29yZAotQGVuZCBleGFtcGxlCi0KLVRoaXMgYmluZHMgdGhlIGtleXN0cm9rZSBAa2V5e01ldGEtUnVib3V0fSB0byB0aGUgZnVuY3Rpb24KLUBlbXBoe2Rlc2NyaXB0aXZlbHl9IG5hbWVkIEBjb2Rle2JhY2t3YXJkLWtpbGwtd29yZH0uICBZb3UsIGFzIHRoZQotcHJvZ3JhbW1lciwgc2hvdWxkIGJpbmQgdGhlIGZ1bmN0aW9ucyB5b3Ugd3JpdGUgdG8gZGVzY3JpcHRpdmUgbmFtZXMgYXMKLXdlbGwuICBSZWFkbGluZSBwcm92aWRlcyBhIGZ1bmN0aW9uIGZvciBkb2luZyB0aGF0OgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfYWRkX2RlZnVuIChjaGFyICpuYW1lLCBGdW5jdGlvbiAqZnVuY3Rpb24sIGludCBrZXkpCi1BZGQgQHZhcntuYW1lfSB0byB0aGUgbGlzdCBvZiBuYW1lZCBmdW5jdGlvbnMuICBNYWtlIEB2YXJ7ZnVuY3Rpb259IGJlCi10aGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZC4gIElmIEB2YXJ7a2V5fSBpcyBub3QgLTEsIHRoZW4gYmluZCBpdCB0bwotQHZhcntmdW5jdGlvbn0gdXNpbmcgQGNvZGV7cmxfYmluZF9rZXkgKCl9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLVVzaW5nIHRoaXMgZnVuY3Rpb24gYWxvbmUgaXMgc3VmZmljaWVudCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICBJdCBpcwotdGhlIHJlY29tbWVuZGVkIHdheSB0byBhZGQgYSBmZXcgZnVuY3Rpb25zIHRvIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyB0aGF0Ci1SZWFkbGluZSBoYXMgYnVpbHQgaW4uICBJZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgb3RoZXIKLXRoYW4gYWRkaW5nIGEgZnVuY3Rpb24gdG8gUmVhZGxpbmUsIHlvdSBtYXkgbmVlZCB0byB1c2UgdGhlCi11bmRlcmx5aW5nIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cuCi0KLUBub2RlIEtleW1hcHMKLUBzdWJzZWN0aW9uIFNlbGVjdGluZyBhIEtleW1hcAotCi1LZXkgYmluZGluZ3MgdGFrZSBwbGFjZSBvbiBhIEBkZm57a2V5bWFwfS4gIFRoZSBrZXltYXAgaXMgdGhlCi1hc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBrZXlzIHRoYXQgdGhlIHVzZXIgdHlwZXMgYW5kIHRoZSBmdW5jdGlvbnMgdGhhdAotZ2V0IHJ1bi4gIFlvdSBjYW4gbWFrZSB5b3VyIG93biBrZXltYXBzLCBjb3B5IGV4aXN0aW5nIGtleW1hcHMsIGFuZCB0ZWxsCi1SZWFkbGluZSB3aGljaCBrZXltYXAgdG8gdXNlLgotCi1AZGVmdHlwZWZ1biBLZXltYXAgcmxfbWFrZV9iYXJlX2tleW1hcCAoKQotUmV0dXJucyBhIG5ldywgZW1wdHkga2V5bWFwLiAgVGhlIHNwYWNlIGZvciB0aGUga2V5bWFwIGlzIGFsbG9jYXRlZCB3aXRoCi1AY29kZXttYWxsb2MgKCl9OyB5b3Ugc2hvdWxkIEBjb2Rle2ZyZWUgKCl9IGl0IHdoZW4geW91IGFyZSBkb25lLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEtleW1hcCBybF9jb3B5X2tleW1hcCAoS2V5bWFwIG1hcCkKLVJldHVybiBhIG5ldyBrZXltYXAgd2hpY2ggaXMgYSBjb3B5IG9mIEB2YXJ7bWFwfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBLZXltYXAgcmxfbWFrZV9rZXltYXAgKCkKLVJldHVybiBhIG5ldyBrZXltYXAgd2l0aCB0aGUgcHJpbnRpbmcgY2hhcmFjdGVycyBib3VuZCB0byBybF9pbnNlcnQsCi10aGUgbG93ZXJjYXNlIE1ldGEgY2hhcmFjdGVycyBib3VuZCB0byBydW4gdGhlaXIgZXF1aXZhbGVudHMsIGFuZAotdGhlIE1ldGEgZGlnaXRzIGJvdW5kIHRvIHByb2R1Y2UgbnVtZXJpYyBhcmd1bWVudHMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gdm9pZCBybF9kaXNjYXJkX2tleW1hcCAoS2V5bWFwIGtleW1hcCkKLUZyZWUgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIEB2YXJ7a2V5bWFwfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1SZWFkbGluZSBoYXMgc2V2ZXJhbCBpbnRlcm5hbCBrZXltYXBzLiAgVGhlc2UgZnVuY3Rpb25zIGFsbG93IHlvdSB0bwotY2hhbmdlIHdoaWNoIGtleW1hcCBpcyBhY3RpdmUuCi0KLUBkZWZ0eXBlZnVuIEtleW1hcCBybF9nZXRfa2V5bWFwICgpCi1SZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleW1hcC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX3NldF9rZXltYXAgKEtleW1hcCBrZXltYXApCi1NYWtlcyBAdmFye2tleW1hcH0gdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5bWFwLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEtleW1hcCBybF9nZXRfa2V5bWFwX2J5X25hbWUgKGNoYXIgKm5hbWUpCi1SZXR1cm4gdGhlIGtleW1hcCBtYXRjaGluZyBAdmFye25hbWV9LiAgQHZhcntuYW1lfSBpcyBvbmUgd2hpY2ggd291bGQKLWJlIHN1cHBsaWVkIGluIGEgQGNvZGV7c2V0IGtleW1hcH0gaW5wdXRyYyBsaW5lIChAcHhyZWZ7UmVhZGxpbmUgSW5pdCBGaWxlfSkuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge2NoYXIgKn0gcmxfZ2V0X2tleW1hcF9uYW1lIChLZXltYXAga2V5bWFwKQotUmV0dXJuIHRoZSBuYW1lIG1hdGNoaW5nIEB2YXJ7a2V5bWFwfS4gIEB2YXJ7bmFtZX0gaXMgb25lIHdoaWNoIHdvdWxkCi1iZSBzdXBwbGllZCBpbiBhIEBjb2Rle3NldCBrZXltYXB9IGlucHV0cmMgbGluZSAoQHB4cmVme1JlYWRsaW5lIEluaXQgRmlsZX0pLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIEJpbmRpbmcgS2V5cwotQHN1YnNlY3Rpb24gQmluZGluZyBLZXlzCi0KLVlvdSBhc3NvY2lhdGUga2V5cyB3aXRoIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSBrZXltYXAuICBSZWFkbGluZSBoYXMKLXNldmVyYWwgaW50ZXJuYWwga2V5bWFwczogQGNvZGV7ZW1hY3Nfc3RhbmRhcmRfa2V5bWFwfSwKLUBjb2Rle2VtYWNzX21ldGFfa2V5bWFwfSwgQGNvZGV7ZW1hY3NfY3RseF9rZXltYXB9LAotQGNvZGV7dmlfbW92ZW1lbnRfa2V5bWFwfSwgYW5kIEBjb2Rle3ZpX2luc2VydGlvbl9rZXltYXB9LgotQGNvZGV7ZW1hY3Nfc3RhbmRhcmRfa2V5bWFwfSBpcyB0aGUgZGVmYXVsdCwgYW5kIHRoZSBleGFtcGxlcyBpbgotdGhpcyBtYW51YWwgYXNzdW1lIHRoYXQuCi0KLVRoZXNlIGZ1bmN0aW9ucyBtYW5hZ2Uga2V5IGJpbmRpbmdzLgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfYmluZF9rZXkgKGludCBrZXksIEZ1bmN0aW9uICpmdW5jdGlvbikKLUJpbmRzIEB2YXJ7a2V5fSB0byBAdmFye2Z1bmN0aW9ufSBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBrZXltYXAuCi1SZXR1cm5zIG5vbi16ZXJvIGluIHRoZSBjYXNlIG9mIGFuIGludmFsaWQgQHZhcntrZXl9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9iaW5kX2tleV9pbl9tYXAgKGludCBrZXksIEZ1bmN0aW9uICpmdW5jdGlvbiwgS2V5bWFwIG1hcCkKLUJpbmQgQHZhcntrZXl9IHRvIEB2YXJ7ZnVuY3Rpb259IGluIEB2YXJ7bWFwfS4gIFJldHVybnMgbm9uLXplcm8gaW4gdGhlIGNhc2UKLW9mIGFuIGludmFsaWQgQHZhcntrZXl9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF91bmJpbmRfa2V5IChpbnQga2V5KQotQmluZCBAdmFye2tleX0gdG8gdGhlIG51bGwgZnVuY3Rpb24gaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5bWFwLgotUmV0dXJucyBub24temVybyBpbiBjYXNlIG9mIGVycm9yLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF91bmJpbmRfa2V5X2luX21hcCAoaW50IGtleSwgS2V5bWFwIG1hcCkKLUJpbmQgQHZhcntrZXl9IHRvIHRoZSBudWxsIGZ1bmN0aW9uIGluIEB2YXJ7bWFwfS4KLVJldHVybnMgbm9uLXplcm8gaW4gY2FzZSBvZiBlcnJvci4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfdW5iaW5kX2Z1bmN0aW9uX2luX21hcCAoRnVuY3Rpb24gKmZ1bmN0aW9uLCBLZXltYXAgbWFwKQotVW5iaW5kIGFsbCBrZXlzIHRoYXQgZXhlY3V0ZSBAdmFye2Z1bmN0aW9ufSBpbiBAdmFye21hcH0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX3VuYmluZF9jb21tYW5kX2luX21hcCAoY2hhciAqY29tbWFuZCwgS2V5bWFwIG1hcCkKLVVuYmluZCBhbGwga2V5cyB0aGF0IGFyZSBib3VuZCB0byBAdmFye2NvbW1hbmR9IGluIEB2YXJ7bWFwfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfZ2VuZXJpY19iaW5kIChpbnQgdHlwZSwgY2hhciAqa2V5c2VxLCBjaGFyICpkYXRhLCBLZXltYXAgbWFwKQotQmluZCB0aGUga2V5IHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgQHZhcntrZXlzZXF9IHRvIHRoZSBhcmJpdHJhcnkKLXBvaW50ZXIgQHZhcntkYXRhfS4gIEB2YXJ7dHlwZX0gc2F5cyB3aGF0IGtpbmQgb2YgZGF0YSBpcyBwb2ludGVkIHRvIGJ5Ci1AdmFye2RhdGF9OyB0aGlzIGNhbiBiZSBhIGZ1bmN0aW9uIChAY29kZXtJU0ZVTkN9KSwgYSBtYWNybwotKEBjb2Rle0lTTUFDUn0pLCBvciBhIGtleW1hcCAoQGNvZGV7SVNLTUFQfSkuICBUaGlzIG1ha2VzIG5ldyBrZXltYXBzIGFzCi1uZWNlc3NhcnkuICBUaGUgaW5pdGlhbCBrZXltYXAgaW4gd2hpY2ggdG8gZG8gYmluZGluZ3MgaXMgQHZhcnttYXB9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9wYXJzZV9hbmRfYmluZCAoY2hhciAqbGluZSkKLVBhcnNlIEB2YXJ7bGluZX0gYXMgaWYgaXQgaGFkIGJlZW4gcmVhZCBmcm9tIHRoZSBAY29kZXtpbnB1dHJjfSBmaWxlIGFuZAotcGVyZm9ybSBhbnkga2V5IGJpbmRpbmdzIGFuZCB2YXJpYWJsZSBhc3NpZ25tZW50cyBmb3VuZAotKEBweHJlZntSZWFkbGluZSBJbml0IEZpbGV9KS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfcmVhZF9pbml0X2ZpbGUgKGNoYXIgKmZpbGVuYW1lKQotUmVhZCBrZXliaW5kaW5ncyBhbmQgdmFyaWFibGUgYXNzaWdubWVudHMgZnJvbSBAdmFye2ZpbGVuYW1lfQotKEBweHJlZntSZWFkbGluZSBJbml0IEZpbGV9KS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBBc3NvY2lhdGluZyBGdW5jdGlvbiBOYW1lcyBhbmQgQmluZGluZ3MKLUBzdWJzZWN0aW9uIEFzc29jaWF0aW5nIEZ1bmN0aW9uIE5hbWVzIGFuZCBCaW5kaW5ncwotCi1UaGVzZSBmdW5jdGlvbnMgYWxsb3cgeW91IHRvIGZpbmQgb3V0IHdoYXQga2V5cyBpbnZva2UgbmFtZWQgZnVuY3Rpb25zCi1hbmQgdGhlIGZ1bmN0aW9ucyBpbnZva2VkIGJ5IGEgcGFydGljdWxhciBrZXkgc2VxdWVuY2UuCi0KLUBkZWZ0eXBlZnVuIHtGdW5jdGlvbiAqfSBybF9uYW1lZF9mdW5jdGlvbiAoY2hhciAqbmFtZSkKLVJldHVybiB0aGUgZnVuY3Rpb24gd2l0aCBuYW1lIEB2YXJ7bmFtZX0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge0Z1bmN0aW9uICp9IHJsX2Z1bmN0aW9uX29mX2tleXNlcSAoY2hhciAqa2V5c2VxLCBLZXltYXAgbWFwLCBpbnQgKnR5cGUpCi1SZXR1cm4gdGhlIGZ1bmN0aW9uIGludm9rZWQgYnkgQHZhcntrZXlzZXF9IGluIGtleW1hcCBAdmFye21hcH0uCi1JZiBAdmFye21hcH0gaXMgTlVMTCwgdGhlIGN1cnJlbnQga2V5bWFwIGlzIHVzZWQuICBJZiBAdmFye3R5cGV9IGlzCi1ub3QgTlVMTCwgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpcyByZXR1cm5lZCBpbiBpdCAob25lIG9mIEBjb2Rle0lTRlVOQ30sCi1AY29kZXtJU0tNQVB9LCBvciBAY29kZXtJU01BQ1J9KS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB7Y2hhciAqKn0gcmxfaW52b2tpbmdfa2V5c2VxcyAoRnVuY3Rpb24gKmZ1bmN0aW9uKQotUmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBrZXkgc2VxdWVuY2VzIHVzZWQgdG8KLWludm9rZSBAdmFye2Z1bmN0aW9ufSBpbiB0aGUgY3VycmVudCBrZXltYXAuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge2NoYXIgKip9IHJsX2ludm9raW5nX2tleXNlcXNfaW5fbWFwIChGdW5jdGlvbiAqZnVuY3Rpb24sIEtleW1hcCBtYXApCi1SZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGtleSBzZXF1ZW5jZXMgdXNlZCB0bwotaW52b2tlIEB2YXJ7ZnVuY3Rpb259IGluIHRoZSBrZXltYXAgQHZhcnttYXB9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHZvaWQgcmxfZnVuY3Rpb25fZHVtcGVyIChpbnQgcmVhZGFibGUpCi1QcmludCB0aGUgcmVhZGxpbmUgZnVuY3Rpb24gbmFtZXMgYW5kIHRoZSBrZXkgc2VxdWVuY2VzIGN1cnJlbnRseQotYm91bmQgdG8gdGhlbSB0byBAY29kZXtybF9vdXRzdHJlYW19LiAgSWYgQHZhcntyZWFkYWJsZX0gaXMgbm9uLXplcm8sCi10aGUgbGlzdCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQgb2YgYW4KLUBjb2Rle2lucHV0cmN9IGZpbGUgYW5kIHJlLXJlYWQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gdm9pZCBybF9saXN0X2Z1bm1hcF9uYW1lcyAoKQotUHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBiaW5kYWJsZSBSZWFkbGluZSBmdW5jdGlvbnMgdG8gQGNvZGV7cmxfb3V0c3RyZWFtfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBBbGxvd2luZyBVbmRvaW5nCi1Ac3Vic2VjdGlvbiBBbGxvd2luZyBVbmRvaW5nCi0KLVN1cHBvcnRpbmcgdGhlIHVuZG8gY29tbWFuZCBpcyBhIHBhaW5sZXNzIHRoaW5nLCBhbmQgbWFrZXMgeW91cgotZnVuY3Rpb25zIG11Y2ggbW9yZSB1c2VmdWwuICBJdCBpcyBjZXJ0YWlubHkgZWFzeSB0byB0cnkKLXNvbWV0aGluZyBpZiB5b3Uga25vdyB5b3UgY2FuIHVuZG8gaXQuICBJIGNvdWxkIHVzZSBhbiB1bmRvIGZ1bmN0aW9uIGZvcgotdGhlIHN0b2NrIG1hcmtldC4KLQotSWYgeW91ciBmdW5jdGlvbiBzaW1wbHkgaW5zZXJ0cyB0ZXh0IG9uY2UsIG9yIGRlbGV0ZXMgdGV4dCBvbmNlLCBhbmQKLXVzZXMgQGNvZGV7cmxfaW5zZXJ0X3RleHQgKCl9IG9yIEBjb2Rle3JsX2RlbGV0ZV90ZXh0ICgpfSB0byBkbyBpdCwgdGhlbgotdW5kb2luZyBpcyBhbHJlYWR5IGRvbmUgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LgotCi1JZiB5b3UgZG8gbXVsdGlwbGUgaW5zZXJ0aW9ucyBvciBtdWx0aXBsZSBkZWxldGlvbnMsIG9yIGFueSBjb21iaW5hdGlvbgotb2YgdGhlc2Ugb3BlcmF0aW9ucywgeW91IHNob3VsZCBncm91cCB0aGVtIHRvZ2V0aGVyIGludG8gb25lIG9wZXJhdGlvbi4KLVRoaXMgaXMgZG9uZSB3aXRoIEBjb2Rle3JsX2JlZ2luX3VuZG9fZ3JvdXAgKCl9IGFuZAotQGNvZGV7cmxfZW5kX3VuZG9fZ3JvdXAgKCl9LgotCi1UaGUgdHlwZXMgb2YgZXZlbnRzIHRoYXQgY2FuIGJlIHVuZG9uZSBhcmU6Ci0KLUBleGFtcGxlCi1lbnVtIHVuZG9fY29kZSBAeyBVTkRPX0RFTEVURSwgVU5ET19JTlNFUlQsIFVORE9fQkVHSU4sIFVORE9fRU5EIEB9OyAKLUBlbmQgZXhhbXBsZQotCi1Ob3RpY2UgdGhhdCBAY29kZXtVTkRPX0RFTEVURX0gbWVhbnMgdG8gaW5zZXJ0IHNvbWUgdGV4dCwgYW5kCi1AY29kZXtVTkRPX0lOU0VSVH0gbWVhbnMgdG8gZGVsZXRlIHNvbWUgdGV4dC4gIFRoYXQgaXMsIHRoZSB1bmRvIGNvZGUKLXRlbGxzIHVuZG8gd2hhdCB0byB1bmRvLCBub3QgaG93IHRvIHVuZG8gaXQuICBAY29kZXtVTkRPX0JFR0lOfSBhbmQKLUBjb2Rle1VORE9fRU5EfSBhcmUgdGFncyBhZGRlZCBieSBAY29kZXtybF9iZWdpbl91bmRvX2dyb3VwICgpfSBhbmQKLUBjb2Rle3JsX2VuZF91bmRvX2dyb3VwICgpfS4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCkKLUJlZ2lucyBzYXZpbmcgdW5kbyBpbmZvcm1hdGlvbiBpbiBhIGdyb3VwIGNvbnN0cnVjdC4gIFRoZSB1bmRvCi1pbmZvcm1hdGlvbiB1c3VhbGx5IGNvbWVzIGZyb20gY2FsbHMgdG8gQGNvZGV7cmxfaW5zZXJ0X3RleHQgKCl9IGFuZAotQGNvZGV7cmxfZGVsZXRlX3RleHQgKCl9LCBidXQgY291bGQgYmUgdGhlIHJlc3VsdCBvZiBjYWxscyB0bwotQGNvZGV7cmxfYWRkX3VuZG8gKCl9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9lbmRfdW5kb19ncm91cCAoKQotQ2xvc2VzIHRoZSBjdXJyZW50IHVuZG8gZ3JvdXAgc3RhcnRlZCB3aXRoIEBjb2Rle3JsX2JlZ2luX3VuZG9fZ3JvdXAKLSgpfS4gIFRoZXJlIHNob3VsZCBiZSBvbmUgY2FsbCB0byBAY29kZXtybF9lbmRfdW5kb19ncm91cCAoKX0KLWZvciBlYWNoIGNhbGwgdG8gQGNvZGV7cmxfYmVnaW5fdW5kb19ncm91cCAoKX0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gdm9pZCBybF9hZGRfdW5kbyAoZW51bSB1bmRvX2NvZGUgd2hhdCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBjaGFyICp0ZXh0KQotUmVtZW1iZXIgaG93IHRvIHVuZG8gYW4gZXZlbnQgKGFjY29yZGluZyB0byBAdmFye3doYXR9KS4gIFRoZSBhZmZlY3RlZAotdGV4dCBydW5zIGZyb20gQHZhcntzdGFydH0gdG8gQHZhcntlbmR9LCBhbmQgZW5jb21wYXNzZXMgQHZhcnt0ZXh0fS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIGZyZWVfdW5kb19saXN0ICgpCi1GcmVlIHRoZSBleGlzdGluZyB1bmRvIGxpc3QuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2RvX3VuZG8gKCkKLVVuZG8gdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSB1bmRvIGxpc3QuICBSZXR1cm5zIEBjb2RlezB9IGlmIHRoZXJlIHdhcwotbm90aGluZyB0byB1bmRvLCBub24temVybyBpZiBzb21ldGhpbmcgd2FzIHVuZG9uZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1GaW5hbGx5LCBpZiB5b3UgbmVpdGhlciBpbnNlcnQgbm9yIGRlbGV0ZSB0ZXh0LCBidXQgZGlyZWN0bHkgbW9kaWZ5IHRoZQotZXhpc3RpbmcgdGV4dCAoZS5nLiwgY2hhbmdlIGl0cyBjYXNlKSwgY2FsbCBAY29kZXtybF9tb2RpZnlpbmcgKCl9Ci1vbmNlLCBqdXN0IGJlZm9yZSB5b3UgbW9kaWZ5IHRoZSB0ZXh0LiAgWW91IG11c3Qgc3VwcGx5IHRoZSBpbmRpY2VzIG9mCi10aGUgdGV4dCByYW5nZSB0aGF0IHlvdSBhcmUgZ29pbmcgdG8gbW9kaWZ5LgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfbW9kaWZ5aW5nIChpbnQgc3RhcnQsIGludCBlbmQpCi1UZWxsIFJlYWRsaW5lIHRvIHNhdmUgdGhlIHRleHQgYmV0d2VlbiBAdmFye3N0YXJ0fSBhbmQgQHZhcntlbmR9IGFzIGEKLXNpbmdsZSB1bmRvIHVuaXQuICBJdCBpcyBhc3N1bWVkIHRoYXQgeW91IHdpbGwgc3Vic2VxdWVudGx5IG1vZGlmeQotdGhhdCB0ZXh0LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIFJlZGlzcGxheQotQHN1YnNlY3Rpb24gUmVkaXNwbGF5Ci0KLUBkZWZ0eXBlZnVuIHZvaWQgcmxfcmVkaXNwbGF5ICgpCi1DaGFuZ2Ugd2hhdCdzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgY29udGVudHMKLW9mIEBjb2Rle3JsX2xpbmVfYnVmZmVyfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfZm9yY2VkX3VwZGF0ZV9kaXNwbGF5ICgpCi1Gb3JjZSB0aGUgbGluZSB0byBiZSB1cGRhdGVkIGFuZCByZWRpc3BsYXllZCwgd2hldGhlciBvciBub3QKLVJlYWRsaW5lIHRoaW5rcyB0aGUgc2NyZWVuIGRpc3BsYXkgaXMgY29ycmVjdC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfb25fbmV3X2xpbmUgKCkKLVRlbGwgdGhlIHVwZGF0ZSByb3V0aW5lcyB0aGF0IHdlIGhhdmUgbW92ZWQgb250byBhIG5ldyAoZW1wdHkpIGxpbmUsCi11c3VhbGx5IGFmdGVyIG91cHV0dGluZyBhIG5ld2xpbmUuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX3Jlc2V0X2xpbmVfc3RhdGUgKCkKLVJlc2V0IHRoZSBkaXNwbGF5IHN0YXRlIHRvIGEgY2xlYW4gc3RhdGUgYW5kIHJlZGlzcGxheSB0aGUgY3VycmVudCBsaW5lCi1zdGFydGluZyBvbiBhIG5ldyBsaW5lLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9tZXNzYWdlICh2YV9hbGlzdCkKLVRoZSBhcmd1bWVudHMgYXJlIGEgc3RyaW5nIGFzIHdvdWxkIGJlIHN1cHBsaWVkIHRvIEBjb2Rle3ByaW50Zn0uICBUaGUKLXJlc3VsdGluZyBzdHJpbmcgaXMgZGlzcGxheWVkIGluIHRoZSBAZGZue2VjaG8gYXJlYX0uICBUaGUgZWNobyBhcmVhCi1pcyBhbHNvIHVzZWQgdG8gZGlzcGxheSBudW1lcmljIGFyZ3VtZW50cyBhbmQgc2VhcmNoIHN0cmluZ3MuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2NsZWFyX21lc3NhZ2UgKCkKLUNsZWFyIHRoZSBtZXNzYWdlIGluIHRoZSBlY2hvIGFyZWEuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gdm9pZCBybF9zYXZlX3Byb21wdCAoKQotU2F2ZSB0aGUgbG9jYWwgUmVhZGxpbmUgcHJvbXB0IGRpc3BsYXkgc3RhdGUgaW4gcHJlcGFyYXRpb24gZm9yCi1kaXNwbGF5aW5nIGEgbmV3IG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgYXJlYSB3aXRoIEBjb2Rle3JsX21lc3NhZ2V9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHZvaWQgcmxfcmVzdG9yZV9wcm9tcHQgKCkKLVJlc3RvcmUgdGhlIGxvY2FsIFJlYWRsaW5lIHByb21wdCBkaXNwbGF5IHN0YXRlIHNhdmVkIGJ5IHRoZSBtb3N0Ci1yZWNlbnQgY2FsbCB0byBAY29kZXtybF9zYXZlX3Byb21wdH0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgTW9kaWZ5aW5nIFRleHQKLUBzdWJzZWN0aW9uIE1vZGlmeWluZyBUZXh0Ci0KLUBkZWZ0eXBlZnVuIGludCBybF9pbnNlcnRfdGV4dCAoY2hhciAqdGV4dCkKLUluc2VydCBAdmFye3RleHR9IGludG8gdGhlIGxpbmUgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9kZWxldGVfdGV4dCAoaW50IHN0YXJ0LCBpbnQgZW5kKQotRGVsZXRlIHRoZSB0ZXh0IGJldHdlZW4gQHZhcntzdGFydH0gYW5kIEB2YXJ7ZW5kfSBpbiB0aGUgY3VycmVudCBsaW5lLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtjaGFyICp9IHJsX2NvcHlfdGV4dCAoaW50IHN0YXJ0LCBpbnQgZW5kKQotUmV0dXJuIGEgY29weSBvZiB0aGUgdGV4dCBiZXR3ZWVuIEB2YXJ7c3RhcnR9IGFuZCBAdmFye2VuZH0gaW4KLXRoZSBjdXJyZW50IGxpbmUuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2tpbGxfdGV4dCAoaW50IHN0YXJ0LCBpbnQgZW5kKQotQ29weSB0aGUgdGV4dCBiZXR3ZWVuIEB2YXJ7c3RhcnR9IGFuZCBAdmFye2VuZH0gaW4gdGhlIGN1cnJlbnQgbGluZQotdG8gdGhlIGtpbGwgcmluZywgYXBwZW5kaW5nIG9yIHByZXBlbmRpbmcgdG8gdGhlIGxhc3Qga2lsbCBpZiB0aGUKLWxhc3QgY29tbWFuZCB3YXMgYSBraWxsIGNvbW1hbmQuICBUaGUgdGV4dCBpcyBkZWxldGVkLgotSWYgQHZhcntzdGFydH0gaXMgbGVzcyB0aGFuIEB2YXJ7ZW5kfSwKLXRoZSB0ZXh0IGlzIGFwcGVuZGVkLCBvdGhlcndpc2UgcHJlcGVuZGVkLiAgSWYgdGhlIGxhc3QgY29tbWFuZCB3YXMKLW5vdCBhIGtpbGwsIGEgbmV3IGtpbGwgcmluZyBzbG90IGlzIHVzZWQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgVXRpbGl0eSBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIFV0aWxpdHkgRnVuY3Rpb25zCi0KLUBkZWZ0eXBlZnVuIGludCBybF9yZWFkX2tleSAoKQotUmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBhdmFpbGFibGUuICBUaGlzIGhhbmRsZXMgaW5wdXQgaW5zZXJ0ZWQgaW50bwotdGhlIGlucHV0IHN0cmVhbSB2aWEgQHZhcntwZW5kaW5nIGlucHV0fSAoQHB4cmVme1JlYWRsaW5lIFZhcmlhYmxlc30pCi1hbmQgQGNvZGV7cmxfc3R1ZmZfY2hhciAoKX0sIG1hY3JvcywgYW5kIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBrZXlib2FyZC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfZ2V0YyAoRklMRSAqKQotUmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBhdmFpbGFibGUgZnJvbSB0aGUga2V5Ym9hcmQuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX3N0dWZmX2NoYXIgKGludCBjKQotSW5zZXJ0IEB2YXJ7Y30gaW50byB0aGUgUmVhZGxpbmUgaW5wdXQgc3RyZWFtLiAgSXQgd2lsbCBiZSAicmVhZCIKLWJlZm9yZSBSZWFkbGluZSBhdHRlbXB0cyB0byByZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGUgdGVybWluYWwgd2l0aAotQGNvZGV7cmxfcmVhZF9rZXkgKCl9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHJsX2V4dGVuZF9saW5lX2J1ZmZlciAoaW50IGxlbikKLUVuc3VyZSB0aGF0IEBjb2Rle3JsX2xpbmVfYnVmZmVyfSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgQHZhcntsZW59Ci1jaGFyYWN0ZXJzLCBwb3NzaWJseSByZWFsbG9jYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9pbml0aWFsaXplICgpCi1Jbml0aWFsaXplIG9yIHJlLWluaXRpYWxpemUgUmVhZGxpbmUncyBpbnRlcm5hbCBzdGF0ZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfcmVzZXRfdGVybWluYWwgKGNoYXIgKnRlcm1pbmFsX25hbWUpCi1SZWluaXRpYWxpemUgUmVhZGxpbmUncyBpZGVhIG9mIHRoZSB0ZXJtaW5hbCBzZXR0aW5ncyB1c2luZwotQHZhcnt0ZXJtaW5hbF9uYW1lfSBhcyB0aGUgdGVybWluYWwgdHlwZSAoZS5nLiwgQGNvZGV7dnQxMDB9KS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgYWxwaGFiZXRpYyAoaW50IGMpCi1SZXR1cm4gMSBpZiBAdmFye2N9IGlzIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBudW1lcmljIChpbnQgYykKLVJldHVybiAxIGlmIEB2YXJ7Y30gaXMgYSBudW1lcmljIGNoYXJhY3Rlci4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgZGluZyAoKQotUmluZyB0aGUgdGVybWluYWwgYmVsbCwgb2JleWluZyB0aGUgc2V0dGluZyBvZiBAY29kZXtiZWxsLXN0eWxlfS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX2Rpc3BsYXlfbWF0Y2hfbGlzdCAoY2hhciAqKm1hdGNoZXMsIGludCBsZW4sIGludCBtYXgpCi1BIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBkaXNwbGF5aW5nIGEgbGlzdCBvZiBzdHJpbmdzIGluCi1jb2x1bW5hciBmb3JtYXQgb24gUmVhZGxpbmUncyBvdXRwdXQgc3RyZWFtLiAgQGNvZGV7bWF0Y2hlc30gaXMgdGhlIGxpc3QKLW9mIHN0cmluZ3MsIGluIGFyZ3YgZm9ybWF0LCBzdWNoIGFzIGEgbGlzdCBvZiBjb21wbGV0aW9uIG1hdGNoZXMuCi1AY29kZXtsZW59IGlzIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBAY29kZXttYXRjaGVzfSwgYW5kIEBjb2Rle21heH0KLWlzIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIEBjb2Rle21hdGNoZXN9LiAgVGhpcyBmdW5jdGlvbiB1c2VzCi10aGUgc2V0dGluZyBvZiBAY29kZXtwcmludC1jb21wbGV0aW9ucy1ob3Jpem9udGFsbHl9IHRvIHNlbGVjdCBob3cgdGhlCi1tYXRjaGVzIGFyZSBkaXNwbGF5ZWQgKEBweHJlZntSZWFkbGluZSBJbml0IEZpbGUgU3ludGF4fSkuCi1AZW5kIGRlZnR5cGVmdW4KLQotVGhlIGZvbGxvd2luZyBhcmUgaW1wbGVtZW50ZWQgYXMgbWFjcm9zLCBkZWZpbmVkIGluIEBjb2Rle2NoYXJ0eXBlcy5ofS4KLQotQGRlZnR5cGVmdW4gaW50IHVwcGVyY2FzZV9wIChpbnQgYykKLVJldHVybiAxIGlmIEB2YXJ7Y30gaXMgYW4gdXBwZXJjYXNlIGFscGhhYmV0aWMgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBsb3dlcmNhc2VfcCAoaW50IGMpCi1SZXR1cm4gMSBpZiBAdmFye2N9IGlzIGEgbG93ZXJjYXNlIGFscGhhYmV0aWMgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBkaWdpdF9wIChpbnQgYykKLVJldHVybiAxIGlmIEB2YXJ7Y30gaXMgYSBudW1lcmljIGNoYXJhY3Rlci4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgdG9fdXBwZXIgKGludCBjKQotSWYgQHZhcntjfSBpcyBhIGxvd2VyY2FzZSBhbHBoYWJldGljIGNoYXJhY3RlciwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi11cHBlcmNhc2UgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCB0b19sb3dlciAoaW50IGMpCi1JZiBAdmFye2N9IGlzIGFuIHVwcGVyY2FzZSBhbHBoYWJldGljIGNoYXJhY3RlciwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi1sb3dlcmNhc2UgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBkaWdpdF92YWx1ZSAoaW50IGMpCi1JZiBAdmFye2N9IGlzIGEgbnVtYmVyLCByZXR1cm4gdGhlIHZhbHVlIGl0IHJlcHJlc2VudHMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgQWx0ZXJuYXRlIEludGVyZmFjZQotQHN1YnNlY3Rpb24gQWx0ZXJuYXRlIEludGVyZmFjZQotCi1BbiBhbHRlcm5hdGUgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSB0byBwbGFpbiBAY29kZXtyZWFkbGluZSgpfS4gIFNvbWUKLWFwcGxpY2F0aW9ucyBuZWVkIHRvIGludGVybGVhdmUga2V5Ym9hcmQgSS9PIHdpdGggZmlsZSwgZGV2aWNlLCBvcgotd2luZG93IHN5c3RlbSBJL08sIHR5cGljYWxseSBieSB1c2luZyBhIG1haW4gbG9vcCB0byBAY29kZXtzZWxlY3QoKX0KLW9uIHZhcmlvdXMgZmlsZSBkZXNjcmlwdG9ycy4gIFRvIGFjY29tb2RhdGUgdGhpcyBuZWVkLCByZWFkbGluZSBjYW4KLWFsc28gYmUgaW52b2tlZCBhcyBhIGBjYWxsYmFjaycgZnVuY3Rpb24gZnJvbSBhbiBldmVudCBsb29wLiAgVGhlcmUKLWFyZSBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIG1ha2UgdGhpcyBlYXN5LgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCAoY2hhciAqcHJvbXB0LCBWZnVuY3Rpb24gKmxoYW5kbGVyKQotU2V0IHVwIHRoZSB0ZXJtaW5hbCBmb3IgcmVhZGxpbmUgSS9PIGFuZCBkaXNwbGF5IHRoZSBpbml0aWFsCi1leHBhbmRlZCB2YWx1ZSBvZiBAdmFye3Byb21wdH0uICBTYXZlIHRoZSB2YWx1ZSBvZiBAdmFye2xoYW5kbGVyfSB0bwotdXNlIGFzIGEgY2FsbGJhY2sgd2hlbiBhIGNvbXBsZXRlIGxpbmUgb2YgaW5wdXQgaGFzIGJlZW4gZW50ZXJlZC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX2NhbGxiYWNrX3JlYWRfY2hhciAoKQotV2hlbmV2ZXIgYW4gYXBwbGljYXRpb24gZGV0ZXJtaW5lcyB0aGF0IGtleWJvYXJkIGlucHV0IGlzIGF2YWlsYWJsZSwgaXQKLXNob3VsZCBjYWxsIEBjb2Rle3JsX2NhbGxiYWNrX3JlYWRfY2hhcigpfSwgd2hpY2ggd2lsbCByZWFkIHRoZSBuZXh0Ci1jaGFyYWN0ZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UuICBJZiB0aGF0IGNoYXJhY3RlciBjb21wbGV0ZXMgdGhlCi1saW5lLCBAY29kZXtybF9jYWxsYmFja19yZWFkX2NoYXJ9IHdpbGwgaW52b2tlIHRoZSBAdmFye2xoYW5kbGVyfQotZnVuY3Rpb24gc2F2ZWQgYnkgQGNvZGV7cmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsfSB0byBwcm9jZXNzIHRoZQotbGluZS4gIEBjb2Rle0VPRn0gaXMgIGluZGljYXRlZCBieSBjYWxsaW5nIEB2YXJ7bGhhbmRsZXJ9IHdpdGggYQotQGNvZGV7TlVMTH0gbGluZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlICgpCi1SZXN0b3JlIHRoZSB0ZXJtaW5hbCB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhbmQgcmVtb3ZlIHRoZSBsaW5lIGhhbmRsZXIuCi1UaGlzIG1heSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsYmFjayBhcyB3ZWxsIGFzIGluZGVwZW5kZW50bHkuCi1AZW5kIGRlZnR5cGVmdW4KLQotQHN1YnNlY3Rpb24gQW4gRXhhbXBsZQotCi1IZXJlIGlzIGEgZnVuY3Rpb24gd2hpY2ggY2hhbmdlcyBsb3dlcmNhc2UgY2hhcmFjdGVycyB0byB0aGVpciB1cHBlcmNhc2UKLWVxdWl2YWxlbnRzLCBhbmQgdXBwZXJjYXNlIGNoYXJhY3RlcnMgdG8gbG93ZXJjYXNlLiAgSWYKLXRoaXMgZnVuY3Rpb24gd2FzIGJvdW5kIHRvIEBzYW1we00tY30sIHRoZW4gdHlwaW5nIEBzYW1we00tY30gd291bGQKLWNoYW5nZSB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVyIHVuZGVyIHBvaW50LiAgVHlwaW5nIEBzYW1we00tMSAwIE0tY30KLXdvdWxkIGNoYW5nZSB0aGUgY2FzZSBvZiB0aGUgZm9sbG93aW5nIDEwIGNoYXJhY3RlcnMsIGxlYXZpbmcgdGhlIGN1cnNvciBvbgotdGhlIGxhc3QgY2hhcmFjdGVyIGNoYW5nZWQuCi0KLUBleGFtcGxlCi0vKiBJbnZlcnQgdGhlIGNhc2Ugb2YgdGhlIENPVU5UIGZvbGxvd2luZyBjaGFyYWN0ZXJzLiAqLwotaW50Ci1pbnZlcnRfY2FzZV9saW5lIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLUB7Ci0gIHJlZ2lzdGVyIGludCBzdGFydCwgZW5kLCBpOwotCi0gIHN0YXJ0ID0gcmxfcG9pbnQ7Ci0KLSAgaWYgKHJsX3BvaW50ID49IHJsX2VuZCkKLSAgICByZXR1cm4gKDApOwotCi0gIGlmIChjb3VudCA8IDApCi0gICAgQHsKLSAgICAgIGRpcmVjdGlvbiA9IC0xOwotICAgICAgY291bnQgPSAtY291bnQ7Ci0gICAgQH0KLSAgZWxzZQotICAgIGRpcmVjdGlvbiA9IDE7Ci0gICAgICAKLSAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBtb2RpZnkuICovCi0gIGVuZCA9IHN0YXJ0ICsgKGNvdW50ICogZGlyZWN0aW9uKTsKLQotICAvKiBGb3JjZSBpdCB0byBiZSB3aXRoaW4gcmFuZ2UuICovCi0gIGlmIChlbmQgPiBybF9lbmQpCi0gICAgZW5kID0gcmxfZW5kOwotICBlbHNlIGlmIChlbmQgPCAwKQotICAgIGVuZCA9IDA7Ci0KLSAgaWYgKHN0YXJ0ID09IGVuZCkKLSAgICByZXR1cm4gKDApOwotCi0gIGlmIChzdGFydCA+IGVuZCkKLSAgICBAewotICAgICAgaW50IHRlbXAgPSBzdGFydDsKLSAgICAgIHN0YXJ0ID0gZW5kOwotICAgICAgZW5kID0gdGVtcDsKLSAgICBAfQotCi0gIC8qIFRlbGwgcmVhZGxpbmUgdGhhdCB3ZSBhcmUgbW9kaWZ5aW5nIHRoZSBsaW5lLCBzbyBpdCB3aWxsIHNhdmUKLSAgICAgdGhlIHVuZG8gaW5mb3JtYXRpb24uICovCi0gIHJsX21vZGlmeWluZyAoc3RhcnQsIGVuZCk7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgIT0gZW5kOyBpKyspCi0gICAgQHsKLSAgICAgIGlmICh1cHBlcmNhc2VfcCAocmxfbGluZV9idWZmZXJbaV0pKQotICAgICAgICBybF9saW5lX2J1ZmZlcltpXSA9IHRvX2xvd2VyIChybF9saW5lX2J1ZmZlcltpXSk7Ci0gICAgICBlbHNlIGlmIChsb3dlcmNhc2VfcCAocmxfbGluZV9idWZmZXJbaV0pKQotICAgICAgICBybF9saW5lX2J1ZmZlcltpXSA9IHRvX3VwcGVyIChybF9saW5lX2J1ZmZlcltpXSk7Ci0gICAgQH0KLSAgLyogTW92ZSBwb2ludCB0byBvbiB0b3Agb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGNoYW5nZWQuICovCi0gIHJsX3BvaW50ID0gKGRpcmVjdGlvbiA9PSAxKSA/IGVuZCAtIDEgOiBzdGFydDsKLSAgcmV0dXJuICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vZGUgUmVhZGxpbmUgU2lnbmFsIEhhbmRsaW5nCi1Ac2VjdGlvbiBSZWFkbGluZSBTaWduYWwgSGFuZGxpbmcKLQotU2lnbmFscyBhcmUgYXN5bmNocm9ub3VzIGV2ZW50cyBzZW50IHRvIGEgcHJvY2VzcyBieSB0aGUgVW5peCBrZXJuZWwsCi1zb21ldGltZXMgb24gYmVoYWxmIG9mIGFub3RoZXIgcHJvY2Vzcy4gIFRoZXkgYXJlIGludGVuZGVkIHRvIGluZGljYXRlCi1leGNlcHRpb25hbCBldmVudHMsIGxpa2UgYSB1c2VyIHByZXNzaW5nIHRoZSBpbnRlcnJ1cHQga2V5IG9uIGhpcwotdGVybWluYWwsIG9yIGEgbmV0d29yayBjb25uZWN0aW9uIGJlaW5nIGJyb2tlbi4gIFRoZXJlIGlzIGEgY2xhc3Mgb2YKLXNpZ25hbHMgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgcHJvY2VzcyBjdXJyZW50bHkgcmVhZGluZyBpbnB1dCBmcm9tCi10aGUga2V5Ym9hcmQuICBTaW5jZSBSZWFkbGluZSBjaGFuZ2VzIHRoZSB0ZXJtaW5hbCBhdHRyaWJ1dGVzIHdoZW4gaXQKLWlzIGNhbGxlZCwgaXQgbmVlZHMgdG8gcGVyZm9ybSBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiBhIHNpZ25hbCBpcwotcmVjZWl2ZWQgdG8gcmVzdG9yZSB0aGUgdGVybWluYWwgdG8gYSBzYW5lIHN0YXRlLCBvciBwcm92aWRlIGFwcGxpY2F0aW9uCi13cml0ZXJzIHdpdGggZnVuY3Rpb25zIHRvIGRvIHNvIG1hbnVhbGx5LgotCi1SZWFkbGluZSBjb250YWlucyBhbiBpbnRlcm5hbCBzaWduYWwgaGFuZGxlciB0aGF0IGlzIGluc3RhbGxlZCBmb3IgYQotbnVtYmVyIG9mIHNpZ25hbHMgKEBjb2Rle1NJR0lOVH0sIEBjb2Rle1NJR1FVSVR9LCBAY29kZXtTSUdURVJNfSwKLUBjb2Rle1NJR0FMUk19LCBAY29kZXtTSUdUU1RQfSwgQGNvZGV7U0lHVFRJTn0sIGFuZCBAY29kZXtTSUdUVE9VfSkuCi1XaGVuIG9uZSBvZiB0aGVzZSBzaWduYWxzIGlzIHJlY2VpdmVkLCB0aGUgc2lnbmFsIGhhbmRsZXIKLXdpbGwgcmVzZXQgdGhlIHRlcm1pbmFsIGF0dHJpYnV0ZXMgdG8gdGhvc2UgdGhhdCB3ZXJlIGluIGVmZmVjdCBiZWZvcmUKLUBjb2Rle3JlYWRsaW5lICgpfSB3YXMgY2FsbGVkLCByZXNldCB0aGUgc2lnbmFsIGhhbmRsaW5nIHRvIHdoYXQgaXQgd2FzCi1iZWZvcmUgQGNvZGV7cmVhZGxpbmUgKCl9IHdhcyBjYWxsZWQsIGFuZCByZXNlbmQgdGhlIHNpZ25hbCB0byB0aGUgY2FsbGluZwotYXBwbGljYXRpb24uCi1JZiBhbmQgd2hlbiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbidzIHNpZ25hbCBoYW5kbGVyIHJldHVybnMsIFJlYWRsaW5lCi13aWxsIHJlaW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgYW5kIGNvbnRpbnVlIHRvIGFjY2VwdCBpbnB1dC4KLVdoZW4gYSBAY29kZXtTSUdJTlR9IGlzIHJlY2VpdmVkLCB0aGUgUmVhZGxpbmUgc2lnbmFsIGhhbmRsZXIgcGVyZm9ybXMKLXNvbWUgYWRkaXRpb25hbCB3b3JrLCB3aGljaCB3aWxsIGNhdXNlIGFueSBwYXJ0aWFsbHktZW50ZXJlZCBsaW5lIHRvIGJlCi1hYm9ydGVkIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBjb2Rle3JsX2ZyZWVfbGluZV9zdGF0ZSAoKX0pLgotCi1UaGVyZSBpcyBhbiBhZGRpdGlvbmFsIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVyLCBmb3IgQGNvZGV7U0lHV0lOQ0h9LCB3aGljaAotdGhlIGtlcm5lbCBzZW5kcyB0byBhIHByb2Nlc3Mgd2hlbmV2ZXIgdGhlIHRlcm1pbmFsJ3Mgc2l6ZSBjaGFuZ2VzIChmb3IKLWV4YW1wbGUsIGlmIGEgdXNlciByZXNpemVzIGFuIEBjb2Rle3h0ZXJtfSkuICBUaGUgUmVhZGxpbmUgQGNvZGV7U0lHV0lOQ0h9Ci1oYW5kbGVyIHVwZGF0ZXMgUmVhZGxpbmUncyBpbnRlcm5hbCBzY3JlZW4gc2l6ZSBzdGF0ZSwgYW5kIHRoZW4gY2FsbHMgYW55Ci1AY29kZXtTSUdXSU5DSH0gc2lnbmFsIGhhbmRsZXIgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gaGFzIGluc3RhbGxlZC4gCi1SZWFkbGluZSBjYWxscyB0aGUgYXBwbGljYXRpb24ncyBAY29kZXtTSUdXSU5DSH0gc2lnbmFsIGhhbmRsZXIgd2l0aG91dAotcmVzZXR0aW5nIHRoZSB0ZXJtaW5hbCB0byBpdHMgb3JpZ2luYWwgc3RhdGUuICBJZiB0aGUgYXBwbGljYXRpb24ncyBzaWduYWwKLWhhbmRsZXIgZG9lcyBtb3JlIHRoYW4gdXBkYXRlIGl0cyBpZGVhIG9mIHRoZSB0ZXJtaW5hbCBzaXplIGFuZCByZXR1cm4gKGZvcgotZXhhbXBsZSwgYSBAY29kZXtsb25nam1wfSBiYWNrIHRvIGEgbWFpbiBwcm9jZXNzaW5nIGxvb3ApLCBpdCBAZW1waHttdXN0fQotY2FsbCBAY29kZXtybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCAoKX0gKGRlc2NyaWJlZCBiZWxvdyksIHRvIHJlc3RvcmUgdGhlCi10ZXJtaW5hbCBzdGF0ZS4gCi0KLVJlYWRsaW5lIHByb3ZpZGVzIHR3byB2YXJpYWJsZXMgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvCi1jb250cm9sIHdoZXRoZXIgb3Igbm90IGl0IHdpbGwgY2F0Y2ggY2VydGFpbiBzaWduYWxzIGFuZCBhY3Qgb24gdGhlbQotd2hlbiB0aGV5IGFyZSByZWNlaXZlZC4gIEl0IGlzIGltcG9ydGFudCB0aGF0IGFwcGxpY2F0aW9ucyBjaGFuZ2UgdGhlCi12YWx1ZXMgb2YgdGhlc2UgdmFyaWFibGVzIG9ubHkgd2hlbiBjYWxsaW5nIEBjb2Rle3JlYWRsaW5lICgpfSwgbm90IGluCi1hIHNpZ25hbCBoYW5kbGVyLCBzbyBSZWFkbGluZSdzIGludGVybmFsIHNpZ25hbCBzdGF0ZSBpcyBub3QgY29ycnVwdGVkLgotCi1AZGVmdHlwZXZhciBpbnQgcmxfY2F0Y2hfc2lnbmFscwotSWYgdGhpcyB2YXJpYWJsZSBpcyBub24temVybywgUmVhZGxpbmUgd2lsbCBpbnN0YWxsIHNpZ25hbCBoYW5kbGVycyBmb3IKLUBjb2Rle1NJR0lOVH0sIEBjb2Rle1NJR1FVSVR9LCBAY29kZXtTSUdURVJNfSwgQGNvZGV7U0lHQUxSTX0sCi1AY29kZXtTSUdUU1RQfSwgQGNvZGV7U0lHVFRJTn0sIGFuZCBAY29kZXtTSUdUVE9VfS4KLQotVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7cmxfY2F0Y2hfc2lnbmFsc30gaXMgMS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBpbnQgcmxfY2F0Y2hfc2lnd2luY2gKLUlmIHRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8sIFJlYWRsaW5lIHdpbGwgaW5zdGFsbCBhIHNpZ25hbCBoYW5kbGVyIGZvcgotQGNvZGV7U0lHV0lOQ0h9LgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtybF9jYXRjaF9zaWd3aW5jaH0gaXMgMS4KLUBlbmQgZGVmdHlwZXZhcgotCi1JZiBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCB3aXNoIHRvIGhhdmUgUmVhZGxpbmUgY2F0Y2ggYW55IHNpZ25hbHMsIG9yCi10byBoYW5kbGUgc2lnbmFscyBvdGhlciB0aGFuIHRob3NlIFJlYWRsaW5lIGNhdGNoZXMgKEBjb2Rle1NJR0hVUH0sCi1mb3IgZXhhbXBsZSksIAotUmVhZGxpbmUgcHJvdmlkZXMgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGRvIHRoZSBuZWNlc3NhcnkgdGVybWluYWwKLWFuZCBpbnRlcm5hbCBzdGF0ZSBjbGVhbnVwIHVwb24gcmVjZWlwdCBvZiBhIHNpZ25hbC4KLQotQGRlZnR5cGVmdW4gdm9pZCBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCAodm9pZCkKLVRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgc3RhdGUgb2YgdGhlIHRlcm1pbmFsIHRvIHdoYXQgaXQgd2FzIGJlZm9yZQotQGNvZGV7cmVhZGxpbmUgKCl9IHdhcyBjYWxsZWQsIGFuZCByZW1vdmUgdGhlIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVycyBmb3IKLWFsbCBzaWduYWxzLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiBAY29kZXtybF9jYXRjaF9zaWduYWxzfSBhbmQKLUBjb2Rle3JsX2NhdGNoX3NpZ3dpbmNofS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX2ZyZWVfbGluZV9zdGF0ZSAodm9pZCkKLVRoaXMgd2lsbCBmcmVlIGFueSBwYXJ0aWFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnB1dCBsaW5lCi0odW5kbyBpbmZvcm1hdGlvbiwgYW55IHBhcnRpYWwgaGlzdG9yeSBlbnRyeSwgYW55IHBhcnRpYWxseS1lbnRlcmVkCi1rZXlib2FyZCBtYWNybywgYW5kIGFueSBwYXJ0aWFsbHktZW50ZXJlZCBudW1lcmljIGFyZ3VtZW50KS4gIFRoaXMKLXNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEBjb2Rle3JsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsICgpfS4gIFRoZQotUmVhZGxpbmUgc2lnbmFsIGhhbmRsZXIgZm9yIEBjb2Rle1NJR0lOVH0gY2FsbHMgdGhpcyB0byBhYm9ydCB0aGUKLWN1cnJlbnQgaW5wdXQgbGluZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biB2b2lkIHJsX3Jlc2V0X2FmdGVyX3NpZ25hbCAodm9pZCkKLVRoaXMgd2lsbCByZWluaXRpYWxpemUgdGhlIHRlcm1pbmFsIGFuZCByZWluc3RhbGwgYW55IFJlYWRsaW5lIHNpZ25hbAotaGFuZGxlcnMsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIEBjb2Rle3JsX2NhdGNoX3NpZ25hbHN9IGFuZAotQGNvZGV7cmxfY2F0Y2hfc2lnd2luY2h9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUlmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHdpc2ggUmVhZGxpbmUgdG8gY2F0Y2ggQGNvZGV7U0lHV0lOQ0h9LCBpdCBtYXkKLWNhbGwgQGNvZGV7cmxfcmVzaXplX3Rlcm1pbmFsICgpfSB0byBmb3JjZSBSZWFkbGluZSB0byB1cGRhdGUgaXRzIGlkZWEgb2YKLXRoZSB0ZXJtaW5hbCBzaXplIHdoZW4gYSBAY29kZXtTSUdXSU5DSH0gaXMgcmVjZWl2ZWQuCi0KLUBkZWZ0eXBlZnVuIHZvaWQgcmxfcmVzaXplX3Rlcm1pbmFsICh2b2lkKQotVXBkYXRlIFJlYWRsaW5lJ3MgaW50ZXJuYWwgc2NyZWVuIHNpemUuCi1AZW5kIGRlZnR5cGVmdW4KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW5zdGFsbCBhbmQgcmVtb3ZlIFJlYWRsaW5lJ3Mgc2lnbmFsIGhhbmRsZXJzLgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfc2V0X3NpZ25hbHMgKHZvaWQpCi1JbnN0YWxsIFJlYWRsaW5lJ3Mgc2lnbmFsIGhhbmRsZXIgZm9yIEBjb2Rle1NJR0lOVH0sIEBjb2Rle1NJR1FVSVR9LAotQGNvZGV7U0lHVEVSTX0sIEBjb2Rle1NJR0FMUk19LCBAY29kZXtTSUdUU1RQfSwgQGNvZGV7U0lHVFRJTn0sCi1AY29kZXtTSUdUVE9VfSwgYW5kIEBjb2Rle1NJR1dJTkNIfSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YKLUBjb2Rle3JsX2NhdGNoX3NpZ25hbHN9IGFuZCBAY29kZXtybF9jYXRjaF9zaWd3aW5jaH0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2NsZWFyX3NpZ25hbHMgKHZvaWQpCi1SZW1vdmUgYWxsIG9mIHRoZSBSZWFkbGluZSBzaWduYWwgaGFuZGxlcnMgaW5zdGFsbGVkIGJ5Ci1AY29kZXtybF9zZXRfc2lnbmFscyAoKX0uCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgQ3VzdG9tIENvbXBsZXRlcnMKLUBzZWN0aW9uIEN1c3RvbSBDb21wbGV0ZXJzCi0KLVR5cGljYWxseSwgYSBwcm9ncmFtIHRoYXQgcmVhZHMgY29tbWFuZHMgZnJvbSB0aGUgdXNlciBoYXMgYSB3YXkgb2YKLWRpc2FtYmlndWF0aW5nIGNvbW1hbmRzIGFuZCBkYXRhLiAgSWYgeW91ciBwcm9ncmFtIGlzIG9uZSBvZiB0aGVzZSwgdGhlbgotaXQgY2FuIHByb3ZpZGUgY29tcGxldGlvbiBmb3IgY29tbWFuZHMsIGRhdGEsIG9yIGJvdGguCi1UaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyB5b3VyIHByb2dyYW0gYW5kIFJlYWRsaW5lCi1jb29wZXJhdGUgdG8gcHJvdmlkZSB0aGlzIHNlcnZpY2UuCi0KLUBtZW51Ci0qIEhvdyBDb21wbGV0aW5nIFdvcmtzOjoJVGhlIGxvZ2ljIHVzZWQgdG8gZG8gY29tcGxldGlvbi4KLSogQ29tcGxldGlvbiBGdW5jdGlvbnM6OglGdW5jdGlvbnMgcHJvdmlkZWQgYnkgUmVhZGxpbmUuCi0qIENvbXBsZXRpb24gVmFyaWFibGVzOjoJVmFyaWFibGVzIHdoaWNoIGNvbnRyb2wgY29tcGxldGlvbi4KLSogQSBTaG9ydCBDb21wbGV0aW9uIEV4YW1wbGU6OglBbiBleGFtcGxlIG9mIHdyaXRpbmcgY29tcGxldGVyIHN1YnJvdXRpbmVzLgotQGVuZCBtZW51Ci0KLUBub2RlIEhvdyBDb21wbGV0aW5nIFdvcmtzCi1Ac3Vic2VjdGlvbiBIb3cgQ29tcGxldGluZyBXb3JrcwotCi1JbiBvcmRlciB0byBjb21wbGV0ZSBzb21lIHRleHQsIHRoZSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgY29tcGxldGlvbnMKLW11c3QgYmUgYXZhaWxhYmxlLiAgVGhhdCBpcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFjY3VyYXRlbHkKLWV4cGFuZCBhIHBhcnRpYWwgd29yZCB3aXRob3V0IGtub3dpbmcgYWxsIG9mIHRoZSBwb3NzaWJsZSB3b3Jkcwotd2hpY2ggbWFrZSBzZW5zZSBpbiB0aGF0IGNvbnRleHQuICBUaGUgUmVhZGxpbmUgbGlicmFyeSBwcm92aWRlcwotdGhlIHVzZXIgaW50ZXJmYWNlIHRvIGNvbXBsZXRpb24sIGFuZCB0d28gb2YgdGhlIG1vc3QgY29tbW9uCi1jb21wbGV0aW9uIGZ1bmN0aW9uczogIGZpbGVuYW1lIGFuZCB1c2VybmFtZS4gIEZvciBjb21wbGV0aW5nIG90aGVyIHR5cGVzCi1vZiB0ZXh0LCB5b3UgbXVzdCB3cml0ZSB5b3VyIG93biBjb21wbGV0aW9uIGZ1bmN0aW9uLiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgZXhhY3RseSB3aGF0IHN1Y2ggZnVuY3Rpb25zIG11c3QgZG8sIGFuZCBwcm92aWRlcyBhbiBleGFtcGxlLgotCi1UaGVyZSBhcmUgdGhyZWUgbWFqb3IgZnVuY3Rpb25zIHVzZWQgdG8gcGVyZm9ybSBjb21wbGV0aW9uOgotCi1AZW51bWVyYXRlCi1AaXRlbQotVGhlIHVzZXItaW50ZXJmYWNlIGZ1bmN0aW9uIEBjb2Rle3JsX2NvbXBsZXRlICgpfS4gIFRoaXMgZnVuY3Rpb24gaXMKLWNhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBvdGhlciBSZWFkbGluZQotZnVuY3Rpb25zIGludGVuZGVkIGZvciBpbnRlcmFjdGl2ZSB1c2U6ICBAdmFye2NvdW50fSBhbmQKLUB2YXJ7aW52b2tpbmdfa2V5fS4gIEl0IGlzb2xhdGVzIHRoZSB3b3JkIHRvIGJlIGNvbXBsZXRlZCBhbmQgY2FsbHMKLUBjb2Rle2NvbXBsZXRpb25fbWF0Y2hlcyAoKX0gdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotSXQgdGhlbiBlaXRoZXIgbGlzdHMgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zLCBpbnNlcnRzIHRoZSBwb3NzaWJsZQotY29tcGxldGlvbnMsIG9yIGFjdHVhbGx5IHBlcmZvcm1zIHRoZQotY29tcGxldGlvbiwgZGVwZW5kaW5nIG9uIHdoaWNoIGJlaGF2aW9yIGlzIGRlc2lyZWQuCi0KLUBpdGVtCi1UaGUgaW50ZXJuYWwgZnVuY3Rpb24gQGNvZGV7Y29tcGxldGlvbl9tYXRjaGVzICgpfSB1c2VzIHlvdXIKLUBkZm57Z2VuZXJhdG9yfSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgbGlzdCBvZiBwb3NzaWJsZSBtYXRjaGVzLCBhbmQKLXRoZW4gcmV0dXJucyB0aGUgYXJyYXkgb2YgdGhlc2UgbWF0Y2hlcy4gIFlvdSBzaG91bGQgcGxhY2UgdGhlIGFkZHJlc3MKLW9mIHlvdXIgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluIEBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259LgotCi1AaXRlbQotVGhlIGdlbmVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgcmVwZWF0ZWRseSBmcm9tCi1AY29kZXtjb21wbGV0aW9uX21hdGNoZXMgKCl9LCByZXR1cm5pbmcgYSBzdHJpbmcgZWFjaCB0aW1lLiAgVGhlCi1hcmd1bWVudHMgdG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBhcmUgQHZhcnt0ZXh0fSBhbmQgQHZhcntzdGF0ZX0uCi1AdmFye3RleHR9IGlzIHRoZSBwYXJ0aWFsIHdvcmQgdG8gYmUgY29tcGxldGVkLiAgQHZhcntzdGF0ZX0gaXMgemVybyB0aGUKLWZpcnN0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsb3dpbmcgdGhlIGdlbmVyYXRvciB0byBwZXJmb3JtCi1hbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLCBhbmQgYSBwb3NpdGl2ZSBub24temVybyBpbnRlZ2VyIGZvcgotZWFjaCBzdWJzZXF1ZW50IGNhbGwuICBXaGVuIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gcmV0dXJucwotQGNvZGV7KGNoYXIgKilOVUxMfSB0aGlzIHNpZ25hbHMgQGNvZGV7Y29tcGxldGlvbl9tYXRjaGVzICgpfSB0aGF0IHRoZXJlIGFyZQotbm8gbW9yZSBwb3NzaWJpbGl0aWVzIGxlZnQuICBVc3VhbGx5IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gY29tcHV0ZXMgdGhlCi1saXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIHdoZW4gQHZhcntzdGF0ZX0gaXMgemVybywgYW5kIHJldHVybnMgdGhlbQotb25lIGF0IGEgdGltZSBvbiBzdWJzZXF1ZW50IGNhbGxzLiAgRWFjaCBzdHJpbmcgdGhlIGdlbmVyYXRvciBmdW5jdGlvbgotcmV0dXJucyBhcyBhIG1hdGNoIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggQGNvZGV7bWFsbG9jKCl9OyBSZWFkbGluZQotZnJlZXMgdGhlIHN0cmluZ3Mgd2hlbiBpdCBoYXMgZmluaXNoZWQgd2l0aCB0aGVtLgotCi1AZW5kIGVudW1lcmF0ZQotCi1AZGVmdHlwZWZ1biBpbnQgcmxfY29tcGxldGUgKGludCBpZ25vcmUsIGludCBpbnZva2luZ19rZXkpCi1Db21wbGV0ZSB0aGUgd29yZCBhdCBvciBiZWZvcmUgcG9pbnQuICBZb3UgaGF2ZSBzdXBwbGllZCB0aGUgZnVuY3Rpb24KLXRoYXQgZG9lcyB0aGUgaW5pdGlhbCBzaW1wbGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGFsZ29yaXRobSAoc2VlCi1AY29kZXtjb21wbGV0aW9uX21hdGNoZXMgKCl9KS4gIFRoZSBkZWZhdWx0IGlzIHRvIGRvIGZpbGVuYW1lIGNvbXBsZXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGV2YXIge0Z1bmN0aW9uICp9IHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24KLVRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEBjb2Rle2NvbXBsZXRpb25fbWF0Y2hlcwotKCl9LiAgSWYgdGhlIHZhbHVlIG9mIEBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259IGlzCi1AY29kZXsoRnVuY3Rpb24gKilOVUxMfSB0aGVuIHRoZSBkZWZhdWx0IGZpbGVuYW1lIGdlbmVyYXRvciBmdW5jdGlvbiwKLUBjb2Rle2ZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCl9LCBpcyB1c2VkLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBub2RlIENvbXBsZXRpb24gRnVuY3Rpb25zCi1Ac3Vic2VjdGlvbiBDb21wbGV0aW9uIEZ1bmN0aW9ucwotCi1IZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGNhbGxhYmxlIGNvbXBsZXRpb24gZnVuY3Rpb25zIHByZXNlbnQgaW4KLVJlYWRsaW5lLgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfY29tcGxldGVfaW50ZXJuYWwgKGludCB3aGF0X3RvX2RvKQotQ29tcGxldGUgdGhlIHdvcmQgYXQgb3IgYmVmb3JlIHBvaW50LiAgQHZhcnt3aGF0X3RvX2RvfSBzYXlzIHdoYXQgdG8gZG8KLXdpdGggdGhlIGNvbXBsZXRpb24uICBBIHZhbHVlIG9mIEBzYW1wez99IG1lYW5zIGxpc3QgdGhlIHBvc3NpYmxlCi1jb21wbGV0aW9ucy4gIEBzYW1we1RBQn0gbWVhbnMgZG8gc3RhbmRhcmQgY29tcGxldGlvbi4gIEBzYW1weyp9IG1lYW5zCi1pbnNlcnQgYWxsIG9mIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucy4gIEBzYW1weyF9IG1lYW5zIHRvIGRpc3BsYXkKLWFsbCBvZiB0aGUgcG9zc2libGUgY29tcGxldGlvbnMsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIGFzIHdlbGwgYXMKLXBlcmZvcm1pbmcgcGFydGlhbCBjb21wbGV0aW9uLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIGludCBybF9jb21wbGV0ZSAoaW50IGlnbm9yZSwgaW50IGludm9raW5nX2tleSkKLUNvbXBsZXRlIHRoZSB3b3JkIGF0IG9yIGJlZm9yZSBwb2ludC4gIFlvdSBoYXZlIHN1cHBsaWVkIHRoZSBmdW5jdGlvbgotdGhhdCBkb2VzIHRoZSBpbml0aWFsIHNpbXBsZSBtYXRjaGluZyBzZWxlY3Rpb24gYWxnb3JpdGhtIChzZWUKLUBjb2Rle2NvbXBsZXRpb25fbWF0Y2hlcyAoKX0gYW5kIEBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259KS4KLVRoZSBkZWZhdWx0IGlzIHRvIGRvIGZpbGVuYW1lCi1jb21wbGV0aW9uLiAgVGhpcyBjYWxscyBAY29kZXtybF9jb21wbGV0ZV9pbnRlcm5hbCAoKX0gd2l0aCBhbgotYXJndW1lbnQgZGVwZW5kaW5nIG9uIEB2YXJ7aW52b2tpbmdfa2V5fS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBpbnQgcmxfcG9zc2libGVfY29tcGxldGlvbnMgKGludCBjb3VudCwgaW50IGludm9raW5nX2tleSkpCi1MaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucy4gIFNlZSBkZXNjcmlwdGlvbiBvZiBAY29kZXtybF9jb21wbGV0ZQotKCl9LiAgVGhpcyBjYWxscyBAY29kZXtybF9jb21wbGV0ZV9pbnRlcm5hbCAoKX0gd2l0aCBhbiBhcmd1bWVudCBvZgotQHNhbXB7P30uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gaW50IHJsX2luc2VydF9jb21wbGV0aW9ucyAoaW50IGNvdW50LCBpbnQgaW52b2tpbmdfa2V5KSkKLUluc2VydCB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucyBpbnRvIHRoZSBsaW5lLCBkZWxldGluZyB0aGUKLXBhcnRpYWxseS1jb21wbGV0ZWQgd29yZC4gIFNlZSBkZXNjcmlwdGlvbiBvZiBAY29kZXtybF9jb21wbGV0ZSAoKX0uCi1UaGlzIGNhbGxzIEBjb2Rle3JsX2NvbXBsZXRlX2ludGVybmFsICgpfSB3aXRoIGFuIGFyZ3VtZW50IG9mIEBzYW1weyp9LgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtjaGFyICoqfSBjb21wbGV0aW9uX21hdGNoZXMgKGNoYXIgKnRleHQsIENQRnVuY3Rpb24gKmVudHJ5X2Z1bmMpCi1SZXR1cm5zIGFuIGFycmF5IG9mIEBjb2RleyhjaGFyICopfSB3aGljaCBpcyBhIGxpc3Qgb2YgY29tcGxldGlvbnMgZm9yCi1AdmFye3RleHR9LiAgSWYgdGhlcmUgYXJlIG5vIGNvbXBsZXRpb25zLCByZXR1cm5zIEBjb2RleyhjaGFyICoqKU5VTEx9LgotVGhlIGZpcnN0IGVudHJ5IGluIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgc3Vic3RpdHV0aW9uIGZvciBAdmFye3RleHR9LgotVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSB0aGUgcG9zc2libGUgY29tcGxldGlvbnMuICBUaGUgYXJyYXkgaXMKLXRlcm1pbmF0ZWQgd2l0aCBhIEBjb2Rle05VTEx9IHBvaW50ZXIuCi0KLUB2YXJ7ZW50cnlfZnVuY30gaXMgYSBmdW5jdGlvbiBvZiB0d28gYXJncywgYW5kIHJldHVybnMgYQotQGNvZGV7KGNoYXIgKil9LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIEB2YXJ7dGV4dH0uICBUaGUgc2Vjb25kIGlzIGEKLXN0YXRlIGFyZ3VtZW50OyBpdCBpcyB6ZXJvIG9uIHRoZSBmaXJzdCBjYWxsLCBhbmQgbm9uLXplcm8gb24gc3Vic2VxdWVudAotY2FsbHMuICBAdmFye2VudHJ5X2Z1bmN9IHJldHVybnMgYSBAY29kZXtOVUxMfSAgcG9pbnRlciB0byB0aGUgY2FsbGVyCi13aGVuIHRoZXJlIGFyZSBubyBtb3JlIG1hdGNoZXMuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4ge2NoYXIgKn0gZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoY2hhciAqdGV4dCwgaW50IHN0YXRlKQotQSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGZpbGVuYW1lIGNvbXBsZXRpb24gaW4gdGhlIGdlbmVyYWwgY2FzZS4gIE5vdGUKLXRoYXQgY29tcGxldGlvbiBpbiBCYXNoIGlzIGEgbGl0dGxlIGRpZmZlcmVudCBiZWNhdXNlIG9mIGFsbAotdGhlIHBhdGhuYW1lcyB0aGF0IG11c3QgYmUgZm9sbG93ZWQgd2hlbiBsb29raW5nIHVwIGNvbXBsZXRpb25zIGZvciBhCi1jb21tYW5kLiAgVGhlIEJhc2ggc291cmNlIGlzIGEgdXNlZnVsIHJlZmVyZW5jZSBmb3Igd3JpdGluZyBjdXN0b20KLWNvbXBsZXRpb24gZnVuY3Rpb25zLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIHtjaGFyICp9IHVzZXJuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKGNoYXIgKnRleHQsIGludCBzdGF0ZSkKLUEgY29tcGxldGlvbiBnZW5lcmF0b3IgZm9yIHVzZXJuYW1lcy4gIEB2YXJ7dGV4dH0gY29udGFpbnMgYSBwYXJ0aWFsCi11c2VybmFtZSBwcmVjZWRlZCBieSBhIHJhbmRvbSBjaGFyYWN0ZXIgKHVzdWFsbHkgQHNhbXB7fn0pLiAgQXMgd2l0aCBhbGwKLWNvbXBsZXRpb24gZ2VuZXJhdG9ycywgQHZhcntzdGF0ZX0gaXMgemVybyBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgbm9uLXplcm8KLWZvciBzdWJzZXF1ZW50IGNhbGxzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIENvbXBsZXRpb24gVmFyaWFibGVzCi1Ac3Vic2VjdGlvbiBDb21wbGV0aW9uIFZhcmlhYmxlcwotCi1AZGVmdHlwZXZhciB7RnVuY3Rpb24gKn0gcmxfY29tcGxldGlvbl9lbnRyeV9mdW5jdGlvbgotQSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEBjb2Rle2NvbXBsZXRpb25fbWF0Y2hlcyAoKX0uCi1AY29kZXtOVUxMfSBtZWFucyB0byB1c2UgQGNvZGV7ZmlsZW5hbWVfZW50cnlfZnVuY3Rpb24gKCl9LCB0aGUgZGVmYXVsdAotZmlsZW5hbWUgY29tcGxldGVyLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtDUFBGdW5jdGlvbiAqfSBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbgotQSBwb2ludGVyIHRvIGFuIGFsdGVybmF0aXZlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBtYXRjaGVzLgotVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIEB2YXJ7dGV4dH0sIEB2YXJ7c3RhcnR9LCBhbmQgQHZhcntlbmR9LgotQHZhcntzdGFydH0gYW5kIEB2YXJ7ZW5kfSBhcmUgaW5kaWNlcyBpbiBAY29kZXtybF9saW5lX2J1ZmZlcn0gc2F5aW5nCi13aGF0IHRoZSBib3VuZGFyaWVzIG9mIEB2YXJ7dGV4dH0gYXJlLiAgSWYgdGhpcyBmdW5jdGlvbiBleGlzdHMgYW5kCi1yZXR1cm5zIEBjb2Rle05VTEx9LCBvciBpZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byBAY29kZXtOVUxMfSwgdGhlbgotQGNvZGV7cmxfY29tcGxldGUgKCl9IHdpbGwgY2FsbCB0aGUgdmFsdWUgb2YKLUBjb2Rle3JsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb259IHRvIGdlbmVyYXRlIG1hdGNoZXMsIG90aGVyd2lzZSB0aGUKLWFycmF5IG9mIHN0cmluZ3MgcmV0dXJuZWQgd2lsbCBiZSB1c2VkLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtDUEZ1bmN0aW9uICp9IHJsX2ZpbGVuYW1lX3F1b3RpbmdfZnVuY3Rpb24KLUEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBxdW90ZSBhIGZpbGVuYW1lIGluIGFuIGFwcGxpY2F0aW9uLQotc3BlY2lmaWMgZmFzaGlvbi4gIFRoaXMgaXMgY2FsbGVkIGlmIGZpbGVuYW1lIGNvbXBsZXRpb24gaXMgYmVpbmcKLWF0dGVtcHRlZCBhbmQgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIEBjb2Rle3JsX2ZpbGVuYW1lX3F1b3RlX2NoYXJhY3RlcnN9Ci1hcHBlYXJzIGluIGEgY29tcGxldGVkIGZpbGVuYW1lLiAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoCi1AdmFye3RleHR9LCBAdmFye21hdGNoX3R5cGV9LCBhbmQgQHZhcntxdW90ZV9wb2ludGVyfS4gIFRoZSBAdmFye3RleHR9Ci1pcyB0aGUgZmlsZW5hbWUgdG8gYmUgcXVvdGVkLiAgVGhlIEB2YXJ7bWF0Y2hfdHlwZX0gaXMgZWl0aGVyCi1AY29kZXtTSU5HTEVfTUFUQ0h9LCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjb21wbGV0aW9uIG1hdGNoLCBvcgotQGNvZGV7TVVMVF9NQVRDSH0uICBTb21lIGZ1bmN0aW9ucyB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8KLWluc2VydCBhIGNsb3NpbmcgcXVvdGUgY2hhcmFjdGVyLiAgVGhlIEB2YXJ7cXVvdGVfcG9pbnRlcn0gaXMgYSBwb2ludGVyCi10byBhbnkgb3BlbmluZyBxdW90ZSBjaGFyYWN0ZXIgdGhlIHVzZXIgdHlwZWQuICBTb21lIGZ1bmN0aW9ucyBjaG9vc2UKLXRvIHJlc2V0IHRoaXMgY2hhcmFjdGVyLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtDUEZ1bmN0aW9uICp9IHJsX2ZpbGVuYW1lX2RlcXVvdGluZ19mdW5jdGlvbgotQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHJlbW92ZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBxdW90aW5nCi1jaGFyYWN0ZXJzIGZyb20gYSBmaWxlbmFtZSBiZWZvcmUgY29tcGxldGlvbiBpcyBhdHRlbXB0ZWQsIHNvIHRob3NlCi1jaGFyYWN0ZXJzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCBtYXRjaGluZyB0aGUgdGV4dCBhZ2FpbnN0IG5hbWVzIGluCi10aGUgZmlsZXN5c3RlbS4gIEl0IGlzIGNhbGxlZCB3aXRoIEB2YXJ7dGV4dH0sIHRoZSB0ZXh0IG9mIHRoZSB3b3JkCi10byBiZSBkZXF1b3RlZCwgYW5kIEB2YXJ7cXVvdGVfY2hhcn0sIHdoaWNoIGlzIHRoZSBxdW90aW5nIGNoYXJhY3RlciAKLXRoYXQgZGVsaW1pdHMgdGhlIGZpbGVuYW1lICh1c3VhbGx5IEBzYW1weyd9IG9yIEBzYW1weyJ9KS4gIElmCi1AdmFye3F1b3RlX2NoYXJ9IGlzIHplcm8sIHRoZSBmaWxlbmFtZSB3YXMgbm90IGluIGFuIGVtYmVkZGVkIHN0cmluZy4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7RnVuY3Rpb24gKn0gcmxfY2hhcl9pc19xdW90ZWRfcAotQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gY2FsbCB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYwotY2hhcmFjdGVyIGluIHRoZSBsaW5lIGJ1ZmZlciBpcyBxdW90ZWQsIGFjY29yZGluZyB0byB3aGF0ZXZlciBxdW90aW5nCi1tZWNoYW5pc20gdGhlIHByb2dyYW0gY2FsbGluZyByZWFkbGluZSB1c2VzLiAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoCi10d28gYXJndW1lbnRzOiBAdmFye3RleHR9LCB0aGUgdGV4dCBvZiB0aGUgbGluZSwgYW5kIEB2YXJ7aW5kZXh9LCB0aGUKLWluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuICBJdCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIGEKLWNoYXJhY3RlciBmb3VuZCBpbiBAY29kZXtybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzfSBzaG91bGQgYmUKLXVzZWQgdG8gYnJlYWsgd29yZHMgZm9yIHRoZSBjb21wbGV0ZXIuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IHJsX2NvbXBsZXRpb25fcXVlcnlfaXRlbXMKLVVwIHRvIHRoaXMgbWFueSBpdGVtcyB3aWxsIGJlIGRpc3BsYXllZCBpbiByZXNwb25zZSB0byBhCi1wb3NzaWJsZS1jb21wbGV0aW9ucyBjYWxsLiAgQWZ0ZXIgdGhhdCwgd2UgYXNrIHRoZSB1c2VyIGlmIHNoZSBpcyBzdXJlCi1zaGUgd2FudHMgdG8gc2VlIHRoZW0gYWxsLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTAwLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtjaGFyICp9IHJsX2Jhc2ljX3dvcmRfYnJlYWtfY2hhcmFjdGVycwotVGhlIGJhc2ljIGxpc3Qgb2YgY2hhcmFjdGVycyB0aGF0IHNpZ25hbCBhIGJyZWFrIGJldHdlZW4gd29yZHMgZm9yIHRoZQotY29tcGxldGVyIHJvdXRpbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGlzIHRoZSBjaGFyYWN0ZXJzCi13aGljaCBicmVhayB3b3JkcyBmb3IgY29tcGxldGlvbiBpbiBCYXNoLCBpLmUuLAotQGNvZGV7IiBcdFxuXCJcXCdgQEAkPjw9O3wmQHsoIn0uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfYmFzaWNfcXVvdGVfY2hhcmFjdGVycwotTGlzdCBvZiBxdW90ZSBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBjYXVzZSBhIHdvcmQgYnJlYWsuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycwotVGhlIGxpc3Qgb2YgY2hhcmFjdGVycyB0aGF0IHNpZ25hbCBhIGJyZWFrIGJldHdlZW4gd29yZHMgZm9yCi1AY29kZXtybF9jb21wbGV0ZV9pbnRlcm5hbCAoKX0uICBUaGUgZGVmYXVsdCBsaXN0IGlzIHRoZSB2YWx1ZSBvZgotQGNvZGV7cmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzfS4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7Y2hhciAqfSBybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycwotTGlzdCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHF1b3RlIGEgc3Vic3RyaW5nIG9mIHRoZSBsaW5lLgotQ29tcGxldGlvbiBvY2N1cnMgb24gdGhlIGVudGlyZSBzdWJzdHJpbmcsIGFuZCB3aXRoaW4gdGhlIHN1YnN0cmluZwotQGNvZGV7cmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyc30gYXJlIHRyZWF0ZWQgYXMgYW55IG90aGVyIGNoYXJhY3RlciwKLXVubGVzcyB0aGV5IGFsc28gYXBwZWFyIHdpdGhpbiB0aGlzIGxpc3QuCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge2NoYXIgKn0gcmxfZmlsZW5hbWVfcXVvdGVfY2hhcmFjdGVycwotQSBsaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBjYXVzZSBhIGZpbGVuYW1lIHRvIGJlIHF1b3RlZCBieSB0aGUgY29tcGxldGVyCi13aGVuIHRoZXkgYXBwZWFyIGluIGEgY29tcGxldGVkIGZpbGVuYW1lLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG51bGwgc3RyaW5nLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtjaGFyICp9IHJsX3NwZWNpYWxfcHJlZml4ZXMKLVRoZSBsaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgd29yZCBicmVhayBjaGFyYWN0ZXJzLCBidXQgc2hvdWxkIGJlCi1sZWZ0IGluIEB2YXJ7dGV4dH0gd2hlbiBpdCBpcyBwYXNzZWQgdG8gdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24uCi1Qcm9ncmFtcyBjYW4gdXNlIHRoaXMgdG8gaGVscCBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIGNvbXBsZXRpbmcgdG8gZG8uCi1Gb3IgaW5zdGFuY2UsIEJhc2ggc2V0cyB0aGlzIHZhcmlhYmxlIHRvICIkQEAiIHNvIHRoYXQgaXQgY2FuIGNvbXBsZXRlCi1zaGVsbCB2YXJpYWJsZXMgYW5kIGhvc3RuYW1lcy4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciB7aW50fSBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIKLVdoZW4gYSBzaW5nbGUgY29tcGxldGlvbiBhbHRlcm5hdGl2ZSBtYXRjaGVzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQKLWxpbmUsIHRoaXMgY2hhcmFjdGVyIGlzIGFwcGVuZGVkIHRvIHRoZSBpbnNlcnRlZCBjb21wbGV0aW9uIHRleHQuICBUaGUKLWRlZmF1bHQgaXMgYSBzcGFjZSBjaGFyYWN0ZXIgKEBzYW1weyB9KS4gIFNldHRpbmcgdGhpcyB0byB0aGUgbnVsbAotY2hhcmFjdGVyIChAc2FtcHtcMH0pIHByZXZlbnRzIGFueXRoaW5nIGJlaW5nIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkuCi1UaGlzIGNhbiBiZSBjaGFuZ2VkIGluIGN1c3RvbSBjb21wbGV0aW9uIGZ1bmN0aW9ucyB0bwotcHJvdmlkZSB0aGUgYGBtb3N0IHNlbnNpYmxlIHdvcmQgc2VwYXJhdG9yIGNoYXJhY3RlcicnIGFjY29yZGluZyB0bwotYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgY29tbWFuZCBsaW5lIHN5bnRheCBzcGVjaWZpY2F0aW9uLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGludCBybF9pZ25vcmVfY29tcGxldGlvbl9kdXBsaWNhdGVzCi1JZiBub24temVybywgdGhlbiBkaXNhbGxvdyBkdXBsaWNhdGVzIGluIHRoZSBtYXRjaGVzLiAgRGVmYXVsdCBpcyAxLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIGludCBybF9maWxlbmFtZV9jb21wbGV0aW9uX2Rlc2lyZWQKLU5vbi16ZXJvIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhlIG1hdGNoZXMgYXJlIHRvIGJlIHRyZWF0ZWQgYXMKLWZpbGVuYW1lcy4gIFRoaXMgaXMgQGVtcGh7YWx3YXlzfSB6ZXJvIG9uIGVudHJ5LCBhbmQgY2FuIG9ubHkgYmUgY2hhbmdlZAotd2l0aGluIGEgY29tcGxldGlvbiBlbnRyeSBnZW5lcmF0b3IgZnVuY3Rpb24uICBJZiBpdCBpcyBzZXQgdG8gYSBub24temVybwotdmFsdWUsIGRpcmVjdG9yeSBuYW1lcyBoYXZlIGEgc2xhc2ggYXBwZW5kZWQgYW5kIFJlYWRsaW5lIGF0dGVtcHRzIHRvCi1xdW90ZSBjb21wbGV0ZWQgZmlsZW5hbWVzIGlmIHRoZXkgY29udGFpbiBhbnkgZW1iZWRkZWQgd29yZCBicmVhawotY2hhcmFjdGVycy4KLUBlbmQgZGVmdHlwZXZhcgotCi1AZGVmdHlwZXZhciBpbnQgcmxfZmlsZW5hbWVfcXVvdGluZ19kZXNpcmVkCi1Ob24temVybyBtZWFucyB0aGF0IHRoZSByZXN1bHRzIG9mIHRoZSBtYXRjaGVzIGFyZSB0byBiZSBxdW90ZWQgdXNpbmcKLWRvdWJsZSBxdW90ZXMgKG9yIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHF1b3RpbmcgbWVjaGFuaXNtKSBpZiB0aGUKLWNvbXBsZXRlZCBmaWxlbmFtZSBjb250YWlucyBhbnkgY2hhcmFjdGVycyBpbgotQGNvZGV7cmxfZmlsZW5hbWVfcXVvdGVfY2hhcnN9LiAgVGhpcyBpcyBAZW1waHthbHdheXN9IG5vbi16ZXJvCi1vbiBlbnRyeSwgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQgd2l0aGluIGEgY29tcGxldGlvbiBlbnRyeSBnZW5lcmF0b3IKLWZ1bmN0aW9uLiAgVGhlIHF1b3RpbmcgaXMgZWZmZWN0ZWQgdmlhIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0bwotYnkgQGNvZGV7cmxfZmlsZW5hbWVfcXVvdGluZ19mdW5jdGlvbn0uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIgaW50IHJsX2luaGliaXRfY29tcGxldGlvbgotSWYgdGhpcyB2YXJpYWJsZSBpcyBub24temVybywgY29tcGxldGlvbiBpcyBpbmhpYml0PGVkLiAgVGhlIGNvbXBsZXRpb24KLWNoYXJhY3RlciB3aWxsIGJlIGluc2VydGVkIGFzIGFueSBvdGhlciBib3VuZCB0byBAY29kZXtzZWxmLWluc2VydH0uCi1AZW5kIGRlZnR5cGV2YXIKLQotQGRlZnR5cGV2YXIge0Z1bmN0aW9uICp9IHJsX2lnbm9yZV9zb21lX2NvbXBsZXRpb25zX2Z1bmN0aW9uCi1UaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgYnkgdGhlIGNvbXBsZXRlciB3aGVuIHJlYWwgZmlsZW5hbWUKLWNvbXBsZXRpb24gaXMgZG9uZSwgYWZ0ZXIgYWxsIHRoZSBtYXRjaGluZyBuYW1lcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotSXQgaXMgcGFzc2VkIGEgQGNvZGV7TlVMTH0gdGVybWluYXRlZCBhcnJheSBvZiBtYXRjaGVzLgotVGhlIGZpcnN0IGVsZW1lbnQgKEBjb2Rle21hdGNoZXNbMF19KSBpcyB0aGUKLW1heGltYWwgc3Vic3RyaW5nIGNvbW1vbiB0byBhbGwgbWF0Y2hlcy4gVGhpcyBmdW5jdGlvbiBjYW4KLXJlLWFycmFuZ2UgdGhlIGxpc3Qgb2YgbWF0Y2hlcyBhcyByZXF1aXJlZCwgYnV0IGVhY2ggZWxlbWVudCBkZWxldGVkCi1mcm9tIHRoZSBhcnJheSBtdXN0IGJlIGZyZWVkLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtGdW5jdGlvbiAqfSBybF9kaXJlY3RvcnlfY29tcGxldGlvbl9ob29rCi1UaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZGlyZWN0b3J5IHBvcnRpb24KLW9mIGZpbGVuYW1lcyBSZWFkbGluZSBjb21wbGV0ZXMuICBJdCBpcyBjYWxsZWQgd2l0aCB0aGUgYWRkcmVzcyBvZiBhCi1zdHJpbmcgKHRoZSBjdXJyZW50IGRpcmVjdG9yeSBuYW1lKSBhcyBhbiBhcmd1bWVudC4gIEl0IGNvdWxkIGJlIHVzZWQKLXRvIGV4cGFuZCBzeW1ib2xpYyBsaW5rcyBvciBzaGVsbCB2YXJpYWJsZXMgaW4gcGF0aG5hbWVzLgotQGVuZCBkZWZ0eXBldmFyCi0KLUBkZWZ0eXBldmFyIHtWRnVuY3Rpb24gKn0gcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vawotSWYgbm9uLXplcm8sIHRoZW4gdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbgotY29tcGxldGluZyBhIHdvcmQgd291bGQgbm9ybWFsbHkgZGlzcGxheSB0aGUgbGlzdCBvZiBwb3NzaWJsZSBtYXRjaGVzLgotVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gbGlldSBvZiBSZWFkbGluZSBkaXNwbGF5aW5nIHRoZSBsaXN0LgotSXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzOgotKEBjb2Rle2NoYXIgKip9QHZhcnttYXRjaGVzfSwgQGNvZGV7aW50fSBAdmFye251bV9tYXRjaGVzfSwgQGNvZGV7aW50fSBAdmFye21heF9sZW5ndGh9KQotd2hlcmUgQHZhcnttYXRjaGVzfSBpcyB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgc3RyaW5ncywKLUB2YXJ7bnVtX21hdGNoZXN9IGlzIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGF0IGFycmF5LCBhbmQKLUB2YXJ7bWF4X2xlbmd0aH0gaXMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gdGhhdCBhcnJheS4KLVJlYWRsaW5lIHByb3ZpZGVzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIEBjb2Rle3JsX2Rpc3BsYXlfbWF0Y2hfbGlzdH0sCi10aGF0IHRha2VzIGNhcmUgb2YgZG9pbmcgdGhlIGRpc3BsYXkgdG8gUmVhZGxpbmUncyBvdXRwdXQgc3RyZWFtLiAgVGhhdAotZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIHRoaXMgaG9vay4KLUBlbmQgZGVmdHlwZXZhcgotCi1Abm9kZSBBIFNob3J0IENvbXBsZXRpb24gRXhhbXBsZQotQHN1YnNlY3Rpb24gQSBTaG9ydCBDb21wbGV0aW9uIEV4YW1wbGUKLQotSGVyZSBpcyBhIHNtYWxsIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiB0aGUgR05VIFJlYWRsaW5lCi1saWJyYXJ5LiAgSXQgaXMgY2FsbGVkIEBjb2Rle2ZpbGVtYW59LCBhbmQgdGhlIHNvdXJjZSBjb2RlIHJlc2lkZXMgaW4KLUBmaWxle2V4YW1wbGVzL2ZpbGVtYW4uY30uICBUaGlzIHNhbXBsZSBhcHBsaWNhdGlvbiBwcm92aWRlcwotY29tcGxldGlvbiBvZiBjb21tYW5kIG5hbWVzLCBsaW5lIGVkaXRpbmcgZmVhdHVyZXMsIGFuZCBhY2Nlc3MgdG8gdGhlCi1oaXN0b3J5IGxpc3QuCi0KLUBwYWdlCi1Ac21hbGxleGFtcGxlCi0vKiBmaWxlbWFuLmMgLS0gQSB0aW55IGFwcGxpY2F0aW9uIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoZQotICAgR05VIFJlYWRsaW5lIGxpYnJhcnkuICBUaGlzIGFwcGxpY2F0aW9uIGludGVyYWN0aXZlbHkgYWxsb3dzIHVzZXJzCi0gICB0byBtYW5pcHVsYXRlIGZpbGVzIGFuZCB0aGVpciBtb2Rlcy4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9lcnJuby5oPgotCi0jaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KLSNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+Ci0KLWV4dGVybiBjaGFyICpnZXR3ZCAoKTsKLWV4dGVybiBjaGFyICp4bWFsbG9jICgpOwotCi0vKiBUaGUgbmFtZXMgb2YgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gdGhlIG1hbmlwdWxhdGlvbi4gKi8KLWludCBjb21fbGlzdCAoKSwgY29tX3ZpZXcgKCksIGNvbV9yZW5hbWUgKCksIGNvbV9zdGF0ICgpLCBjb21fcHdkICgpOwotaW50IGNvbV9kZWxldGUgKCksIGNvbV9oZWxwICgpLCBjb21fY2QgKCksIGNvbV9xdWl0ICgpOwotCi0vKiBBIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZHMgdGhpcyBwcm9ncmFtCi0gICBjYW4gdW5kZXJzdGFuZC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgQHsKLSAgY2hhciAqbmFtZTsJCQkvKiBVc2VyIHByaW50YWJsZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gKi8KLSAgRnVuY3Rpb24gKmZ1bmM7CQkvKiBGdW5jdGlvbiB0byBjYWxsIHRvIGRvIHRoZSBqb2IuICovCi0gIGNoYXIgKmRvYzsJCQkvKiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uLiAgKi8KLUB9IENPTU1BTkQ7Ci0KLUNPTU1BTkQgY29tbWFuZHNbXSA9IEB7Ci0gIEB7ICJjZCIsIGNvbV9jZCwgIkNoYW5nZSB0byBkaXJlY3RvcnkgRElSIiBAfSwKLSAgQHsgImRlbGV0ZSIsIGNvbV9kZWxldGUsICJEZWxldGUgRklMRSIgQH0sCi0gIEB7ICJoZWxwIiwgY29tX2hlbHAsICJEaXNwbGF5IHRoaXMgdGV4dCIgQH0sCi0gIEB7ICI/IiwgY29tX2hlbHAsICJTeW5vbnltIGZvciBgaGVscCciIEB9LAotICBAeyAibGlzdCIsIGNvbV9saXN0LCAiTGlzdCBmaWxlcyBpbiBESVIiIEB9LAotICBAeyAibHMiLCBjb21fbGlzdCwgIlN5bm9ueW0gZm9yIGBsaXN0JyIgQH0sCi0gIEB7ICJwd2QiLCBjb21fcHdkLCAiUHJpbnQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiIEB9LAotICBAeyAicXVpdCIsIGNvbV9xdWl0LCAiUXVpdCB1c2luZyBGaWxlbWFuIiBAfSwKLSAgQHsgInJlbmFtZSIsIGNvbV9yZW5hbWUsICJSZW5hbWUgRklMRSB0byBORVdOQU1FIiBAfSwKLSAgQHsgInN0YXQiLCBjb21fc3RhdCwgIlByaW50IG91dCBzdGF0aXN0aWNzIG9uIEZJTEUiIEB9LAotICBAeyAidmlldyIsIGNvbV92aWV3LCAiVmlldyB0aGUgY29udGVudHMgb2YgRklMRSIgQH0sCi0gIEB7IChjaGFyICopTlVMTCwgKEZ1bmN0aW9uICopTlVMTCwgKGNoYXIgKilOVUxMIEB9Ci1AfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCi1jaGFyICpzdHJpcHdoaXRlICgpOwotQ09NTUFORCAqZmluZF9jb21tYW5kICgpOwotCi0vKiBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0sIGFzIHRha2VuIGZyb20gYXJndlswXS4gKi8KLWNoYXIgKnByb2duYW1lOwotCi0vKiBXaGVuIG5vbi16ZXJvLCB0aGlzIGdsb2JhbCBtZWFucyB0aGUgdXNlciBpcyBkb25lIHVzaW5nIHRoaXMgcHJvZ3JhbS4gKi8KLWludCBkb25lOwotCi1jaGFyICoKLWR1cHN0ciAocykKLSAgICAgaW50IHM7Ci1AewotICBjaGFyICpyOwotCi0gIHIgPSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAociwgcyk7Ci0gIHJldHVybiAocik7Ci1AfQotCi1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci1AewotICBjaGFyICpsaW5lLCAqczsKLQotICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgaW5pdGlhbGl6ZV9yZWFkbGluZSAoKTsJLyogQmluZCBvdXIgY29tcGxldGVyLiAqLwotCi0gIC8qIExvb3AgcmVhZGluZyBhbmQgZXhlY3V0aW5nIGxpbmVzIHVudGlsIHRoZSB1c2VyIHF1aXRzLiAqLwotICBmb3IgKCA7IGRvbmUgPT0gMDsgKQotICAgIEB7Ci0gICAgICBsaW5lID0gcmVhZGxpbmUgKCJGaWxlTWFuOiAiKTsKLQotICAgICAgaWYgKCFsaW5lKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgbGluZS4KLSAgICAgICAgIFRoZW4sIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQsIGFkZCBpdCB0byB0aGUgaGlzdG9yeSBsaXN0Ci0gICAgICAgICBhbmQgZXhlY3V0ZSBpdC4gKi8KLSAgICAgIHMgPSBzdHJpcHdoaXRlIChsaW5lKTsKLQotICAgICAgaWYgKCpzKQotICAgICAgICBAewotICAgICAgICAgIGFkZF9oaXN0b3J5IChzKTsKLSAgICAgICAgICBleGVjdXRlX2xpbmUgKHMpOwotICAgICAgICBAfQotCi0gICAgICBmcmVlIChsaW5lKTsKLSAgICBAfQotICBleGl0ICgwKTsKLUB9Ci0KLS8qIEV4ZWN1dGUgYSBjb21tYW5kIGxpbmUuICovCi1pbnQKLWV4ZWN1dGVfbGluZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLUB7Ci0gIHJlZ2lzdGVyIGludCBpOwotICBDT01NQU5EICpjb21tYW5kOwotICBjaGFyICp3b3JkOwotCi0gIC8qIElzb2xhdGUgdGhlIGNvbW1hbmQgd29yZC4gKi8KLSAgaSA9IDA7Ci0gIHdoaWxlIChsaW5lW2ldICYmIHdoaXRlc3BhY2UgKGxpbmVbaV0pKQotICAgIGkrKzsKLSAgd29yZCA9IGxpbmUgKyBpOwotCi0gIHdoaWxlIChsaW5lW2ldICYmICF3aGl0ZXNwYWNlIChsaW5lW2ldKSkKLSAgICBpKys7Ci0KLSAgaWYgKGxpbmVbaV0pCi0gICAgbGluZVtpKytdID0gJ1wwJzsKLQotICBjb21tYW5kID0gZmluZF9jb21tYW5kICh3b3JkKTsKLQotICBpZiAoIWNvbW1hbmQpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBObyBzdWNoIGNvbW1hbmQgZm9yIEZpbGVNYW4uXG4iLCB3b3JkKTsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIEB9Ci0KLSAgLyogR2V0IGFyZ3VtZW50IHRvIGNvbW1hbmQsIGlmIGFueS4gKi8KLSAgd2hpbGUgKHdoaXRlc3BhY2UgKGxpbmVbaV0pKQotICAgIGkrKzsKLQotICB3b3JkID0gbGluZSArIGk7Ci0KLSAgLyogQ2FsbCB0aGUgZnVuY3Rpb24uICovCi0gIHJldHVybiAoKCooY29tbWFuZC0+ZnVuYykpICh3b3JkKSk7Ci1AfQotCi0vKiBMb29rIHVwIE5BTUUgYXMgdGhlIG5hbWUgb2YgYSBjb21tYW5kLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGF0Ci0gICBjb21tYW5kLiAgUmV0dXJuIGEgTlVMTCBwb2ludGVyIGlmIE5BTUUgaXNuJ3QgYSBjb21tYW5kIG5hbWUuICovCi1DT01NQU5EICoKLWZpbmRfY29tbWFuZCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLUB7Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGNvbW1hbmRzW2ldLm5hbWU7IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBjb21tYW5kc1tpXS5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuICgmY29tbWFuZHNbaV0pOwotCi0gIHJldHVybiAoKENPTU1BTkQgKilOVUxMKTsKLUB9Ci0KLS8qIFN0cmlwIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBTVFJJTkcuICBSZXR1cm4gYSBwb2ludGVyCi0gICBpbnRvIFNUUklORy4gKi8KLWNoYXIgKgotc3RyaXB3aGl0ZSAoc3RyaW5nKQotICAgICBjaGFyICpzdHJpbmc7Ci1AewotICByZWdpc3RlciBjaGFyICpzLCAqdDsKLQotICBmb3IgKHMgPSBzdHJpbmc7IHdoaXRlc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgICAKLSAgaWYgKCpzID09IDApCi0gICAgcmV0dXJuIChzKTsKLQotICB0ID0gcyArIHN0cmxlbiAocykgLSAxOwotICB3aGlsZSAodCA+IHMgJiYgd2hpdGVzcGFjZSAoKnQpKQotICAgIHQtLTsKLSAgKisrdCA9ICdcMCc7Ci0KLSAgcmV0dXJuIHM7Ci1AfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB0byBSZWFkbGluZSBDb21wbGV0aW9uICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLWNoYXIgKmNvbW1hbmRfZ2VuZXJhdG9yICgpOwotY2hhciAqKmZpbGVtYW5fY29tcGxldGlvbiAoKTsKLQotLyogVGVsbCB0aGUgR05VIFJlYWRsaW5lIGxpYnJhcnkgaG93IHRvIGNvbXBsZXRlLiAgV2Ugd2FudCB0byB0cnkgdG8gY29tcGxldGUKLSAgIG9uIGNvbW1hbmQgbmFtZXMgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgbGluZSwgb3Igb24gZmlsZW5hbWVzCi0gICBpZiBub3QuICovCi1pbml0aWFsaXplX3JlYWRsaW5lICgpCi1AewotICAvKiBBbGxvdyBjb25kaXRpb25hbCBwYXJzaW5nIG9mIHRoZSB+Ly5pbnB1dHJjIGZpbGUuICovCi0gIHJsX3JlYWRsaW5lX25hbWUgPSAiRmlsZU1hbiI7Ci0KLSAgLyogVGVsbCB0aGUgY29tcGxldGVyIHRoYXQgd2Ugd2FudCBhIGNyYWNrIGZpcnN0LiAqLwotICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiA9IChDUFBGdW5jdGlvbiAqKWZpbGVtYW5fY29tcGxldGlvbjsKLUB9Ci0KLS8qIEF0dGVtcHQgdG8gY29tcGxldGUgb24gdGhlIGNvbnRlbnRzIG9mIFRFWFQuICBTVEFSVCBhbmQgRU5EIGJvdW5kIHRoZQotICAgcmVnaW9uIG9mIHJsX2xpbmVfYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHdvcmQgdG8gY29tcGxldGUuICBURVhUIGlzCi0gICB0aGUgd29yZCB0byBjb21wbGV0ZS4gIFdlIGNhbiB1c2UgdGhlIGVudGlyZSBjb250ZW50cyBvZiBybF9saW5lX2J1ZmZlcgotICAgaW4gY2FzZSB3ZSB3YW50IHRvIGRvIHNvbWUgc2ltcGxlIHBhcnNpbmcuICBSZXR1cm4gdGhlIGFycmF5IG9mIG1hdGNoZXMsCi0gICBvciBOVUxMIGlmIHRoZXJlIGFyZW4ndCBhbnkuICovCi1jaGFyICoqCi1maWxlbWFuX2NvbXBsZXRpb24gKHRleHQsIHN0YXJ0LCBlbmQpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCBzdGFydCwgZW5kOwotQHsKLSAgY2hhciAqKm1hdGNoZXM7Ci0KLSAgbWF0Y2hlcyA9IChjaGFyICoqKU5VTEw7Ci0KLSAgLyogSWYgdGhpcyB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwgdGhlbiBpdCBpcyBhIGNvbW1hbmQKLSAgICAgdG8gY29tcGxldGUuICBPdGhlcndpc2UgaXQgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeS4gKi8KLSAgaWYgKHN0YXJ0ID09IDApCi0gICAgbWF0Y2hlcyA9IGNvbXBsZXRpb25fbWF0Y2hlcyAodGV4dCwgY29tbWFuZF9nZW5lcmF0b3IpOwotCi0gIHJldHVybiAobWF0Y2hlcyk7Ci1AfQotCi0vKiBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gIFNUQVRFIGxldHMgdXMga25vdyB3aGV0aGVyCi0gICB0byBzdGFydCBmcm9tIHNjcmF0Y2g7IHdpdGhvdXQgYW55IHN0YXRlIChpLmUuIFNUQVRFID09IDApLCB0aGVuIHdlCi0gICBzdGFydCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0LiAqLwotY2hhciAqCi1jb21tYW5kX2dlbmVyYXRvciAodGV4dCwgc3RhdGUpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCBzdGF0ZTsKLUB7Ci0gIHN0YXRpYyBpbnQgbGlzdF9pbmRleCwgbGVuOwotICBjaGFyICpuYW1lOwotCi0gIC8qIElmIHRoaXMgaXMgYSBuZXcgd29yZCB0byBjb21wbGV0ZSwgaW5pdGlhbGl6ZSBub3cuICBUaGlzIGluY2x1ZGVzCi0gICAgIHNhdmluZyB0aGUgbGVuZ3RoIG9mIFRFWFQgZm9yIGVmZmljaWVuY3ksIGFuZCBpbml0aWFsaXppbmcgdGhlIGluZGV4Ci0gICAgIHZhcmlhYmxlIHRvIDAuICovCi0gIGlmICghc3RhdGUpCi0gICAgQHsKLSAgICAgIGxpc3RfaW5kZXggPSAwOwotICAgICAgbGVuID0gc3RybGVuICh0ZXh0KTsKLSAgICBAfQotCi0gIC8qIFJldHVybiB0aGUgbmV4dCBuYW1lIHdoaWNoIHBhcnRpYWxseSBtYXRjaGVzIGZyb20gdGhlIGNvbW1hbmQgbGlzdC4gKi8KLSAgd2hpbGUgKG5hbWUgPSBjb21tYW5kc1tsaXN0X2luZGV4XS5uYW1lKQotICAgIEB7Ci0gICAgICBsaXN0X2luZGV4Kys7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCB0ZXh0LCBsZW4pID09IDApCi0gICAgICAgIHJldHVybiAoZHVwc3RyKG5hbWUpKTsKLSAgICBAfQotCi0gIC8qIElmIG5vIG5hbWVzIG1hdGNoZWQsIHRoZW4gcmV0dXJuIE5VTEwuICovCi0gIHJldHVybiAoKGNoYXIgKilOVUxMKTsKLUB9Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICBGaWxlTWFuIENvbW1hbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogU3RyaW5nIHRvIHBhc3MgdG8gc3lzdGVtICgpLiAgVGhpcyBpcyBmb3IgdGhlIExJU1QsIFZJRVcgYW5kIFJFTkFNRQotICAgY29tbWFuZHMuICovCi1zdGF0aWMgY2hhciBzeXNjb21bMTAyNF07Ci0KLS8qIExpc3QgdGhlIGZpbGUocykgbmFtZWQgaW4gYXJnLiAqLwotY29tX2xpc3QgKGFyZykKLSAgICAgY2hhciAqYXJnOwotQHsKLSAgaWYgKCFhcmcpCi0gICAgYXJnID0gIiI7Ci0KLSAgc3ByaW50ZiAoc3lzY29tLCAibHMgLUZDbGcgJXMiLCBhcmcpOwotICByZXR1cm4gKHN5c3RlbSAoc3lzY29tKSk7Ci1AfQotCi1jb21fdmlldyAoYXJnKQotICAgICBjaGFyICphcmc7Ci1AewotICBpZiAoIXZhbGlkX2FyZ3VtZW50ICgidmlldyIsIGFyZykpCi0gICAgcmV0dXJuIDE7Ci0KLSAgc3ByaW50ZiAoc3lzY29tLCAibW9yZSAlcyIsIGFyZyk7Ci0gIHJldHVybiAoc3lzdGVtIChzeXNjb20pKTsKLUB9Ci0KLWNvbV9yZW5hbWUgKGFyZykKLSAgICAgY2hhciAqYXJnOwotQHsKLSAgdG9vX2Rhbmdlcm91cyAoInJlbmFtZSIpOwotICByZXR1cm4gKDEpOwotQH0KLQotY29tX3N0YXQgKGFyZykKLSAgICAgY2hhciAqYXJnOwotQHsKLSAgc3RydWN0IHN0YXQgZmluZm87Ci0KLSAgaWYgKCF2YWxpZF9hcmd1bWVudCAoInN0YXQiLCBhcmcpKQotICAgIHJldHVybiAoMSk7Ci0KLSAgaWYgKHN0YXQgKGFyZywgJmZpbmZvKSA9PSAtMSkKLSAgICBAewotICAgICAgcGVycm9yIChhcmcpOwotICAgICAgcmV0dXJuICgxKTsKLSAgICBAfQotCi0gIHByaW50ZiAoIlN0YXRpc3RpY3MgZm9yIGAlcyc6XG4iLCBhcmcpOwotCi0gIHByaW50ZiAoIiVzIGhhcyAlZCBsaW5rJXMsIGFuZCBpcyAlZCBieXRlJXMgaW4gbGVuZ3RoLlxuIiwgYXJnLAotICAgICAgICAgIGZpbmZvLnN0X25saW5rLAotICAgICAgICAgIChmaW5mby5zdF9ubGluayA9PSAxKSA/ICIiIDogInMiLAotICAgICAgICAgIGZpbmZvLnN0X3NpemUsCi0gICAgICAgICAgKGZpbmZvLnN0X3NpemUgPT0gMSkgPyAiIiA6ICJzIik7Ci0gIHByaW50ZiAoIklub2RlIExhc3QgQ2hhbmdlIGF0OiAlcyIsIGN0aW1lICgmZmluZm8uc3RfY3RpbWUpKTsKLSAgcHJpbnRmICgiICAgICAgTGFzdCBhY2Nlc3MgYXQ6ICVzIiwgY3RpbWUgKCZmaW5mby5zdF9hdGltZSkpOwotICBwcmludGYgKCIgICAgTGFzdCBtb2RpZmllZCBhdDogJXMiLCBjdGltZSAoJmZpbmZvLnN0X210aW1lKSk7Ci0gIHJldHVybiAoMCk7Ci1AfQotCi1jb21fZGVsZXRlIChhcmcpCi0gICAgIGNoYXIgKmFyZzsKLUB7Ci0gIHRvb19kYW5nZXJvdXMgKCJkZWxldGUiKTsKLSAgcmV0dXJuICgxKTsKLUB9Ci0KLS8qIFByaW50IG91dCBoZWxwIGZvciBBUkcsIG9yIGZvciBhbGwgb2YgdGhlIGNvbW1hbmRzIGlmIEFSRyBpcwotICAgbm90IHByZXNlbnQuICovCi1jb21faGVscCAoYXJnKQotICAgICBjaGFyICphcmc7Ci1AewotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IHByaW50ZWQgPSAwOwotCi0gIGZvciAoaSA9IDA7IGNvbW1hbmRzW2ldLm5hbWU7IGkrKykKLSAgICBAewotICAgICAgaWYgKCEqYXJnIHx8IChzdHJjbXAgKGFyZywgY29tbWFuZHNbaV0ubmFtZSkgPT0gMCkpCi0gICAgICAgIEB7Ci0gICAgICAgICAgcHJpbnRmICgiJXNcdFx0JXMuXG4iLCBjb21tYW5kc1tpXS5uYW1lLCBjb21tYW5kc1tpXS5kb2MpOwotICAgICAgICAgIHByaW50ZWQrKzsKLSAgICAgICAgQH0KLSAgICBAfQotCi0gIGlmICghcHJpbnRlZCkKLSAgICBAewotICAgICAgcHJpbnRmICgiTm8gY29tbWFuZHMgbWF0Y2ggYCVzJy4gIFBvc3NpYmlsdGllcyBhcmU6XG4iLCBhcmcpOwotCi0gICAgICBmb3IgKGkgPSAwOyBjb21tYW5kc1tpXS5uYW1lOyBpKyspCi0gICAgICAgIEB7Ci0gICAgICAgICAgLyogUHJpbnQgaW4gc2l4IGNvbHVtbnMuICovCi0gICAgICAgICAgaWYgKHByaW50ZWQgPT0gNikKLSAgICAgICAgICAgIEB7Ci0gICAgICAgICAgICAgIHByaW50ZWQgPSAwOwotICAgICAgICAgICAgICBwcmludGYgKCJcbiIpOwotICAgICAgICAgICAgQH0KLQotICAgICAgICAgIHByaW50ZiAoIiVzXHQiLCBjb21tYW5kc1tpXS5uYW1lKTsKLSAgICAgICAgICBwcmludGVkKys7Ci0gICAgICAgIEB9Ci0KLSAgICAgIGlmIChwcmludGVkKQotICAgICAgICBwcmludGYgKCJcbiIpOwotICAgIEB9Ci0gIHJldHVybiAoMCk7Ci1AfQotCi0vKiBDaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSBBUkcuICovCi1jb21fY2QgKGFyZykKLSAgICAgY2hhciAqYXJnOwotQHsKLSAgaWYgKGNoZGlyIChhcmcpID09IC0xKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKGFyZyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICBAfQotCi0gIGNvbV9wd2QgKCIiKTsKLSAgcmV0dXJuICgwKTsKLUB9Ci0KLS8qIFByaW50IG91dCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKi8KLWNvbV9wd2QgKGlnbm9yZSkKLSAgICAgY2hhciAqaWdub3JlOwotQHsKLSAgY2hhciBkaXJbMTAyNF0sICpzOwotCi0gIHMgPSBnZXR3ZCAoZGlyKTsKLSAgaWYgKHMgPT0gMCkKLSAgICBAewotICAgICAgcHJpbnRmICgiRXJyb3IgZ2V0dGluZyBwd2Q6ICVzXG4iLCBkaXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgQH0KLQotICBwcmludGYgKCJDdXJyZW50IGRpcmVjdG9yeSBpcyAlc1xuIiwgZGlyKTsKLSAgcmV0dXJuIDA7Ci1AfQotCi0vKiBUaGUgdXNlciB3aXNoZXMgdG8gcXVpdCB1c2luZyB0aGlzIHByb2dyYW0uICBKdXN0IHNldCBET05FIG5vbi16ZXJvLiAqLwotY29tX3F1aXQgKGFyZykKLSAgICAgY2hhciAqYXJnOwotQHsKLSAgZG9uZSA9IDE7Ci0gIHJldHVybiAoMCk7Ci1AfQotCi0vKiBGdW5jdGlvbiB3aGljaCB0ZWxscyB5b3UgdGhhdCB5b3UgY2FuJ3QgZG8gdGhpcy4gKi8KLXRvb19kYW5nZXJvdXMgKGNhbGxlcikKLSAgICAgY2hhciAqY2FsbGVyOwotQHsKLSAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAiJXM6IFRvbyBkYW5nZXJvdXMgZm9yIG1lIHRvIGRpc3RyaWJ1dGUuICBXcml0ZSBpdCB5b3Vyc2VsZi5cbiIsCi0gICAgICAgICAgIGNhbGxlcik7Ci1AfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgQVJHIGlzIGEgdmFsaWQgYXJndW1lbnQgZm9yIENBTExFUiwgZWxzZSBwcmludAotICAgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIHplcm8uICovCi1pbnQKLXZhbGlkX2FyZ3VtZW50IChjYWxsZXIsIGFyZykKLSAgICAgY2hhciAqY2FsbGVyLCAqYXJnOwotQHsKLSAgaWYgKCFhcmcgfHwgISphcmcpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBBcmd1bWVudCByZXF1aXJlZC5cbiIsIGNhbGxlcik7Ci0gICAgICByZXR1cm4gKDApOwotICAgIEB9Ci0KLSAgcmV0dXJuICgxKTsKLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3JsdXNlci50ZXhpbmZvIGIvcmVhZGxpbmUvZG9jL3JsdXNlci50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVmN2NhLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2RvYy9ybHVzZXIudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDEyODcgKzAsMCBAQAotQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQotQHNldGZpbGVuYW1lIHJsdXNlci5pbmZvCi1AY29tbWVudCAlKiplbmQgb2YgaGVhZGVyIChUaGlzIGlzIGZvciBydW5uaW5nIFRleGluZm8gb24gYSByZWdpb24uKQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotCi1AaWdub3JlCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBlbmQgdXNlciBpbnRlcmZhY2UgdG8gdGhlIEdOVSBjb21tYW5kIGxpbmUKLWVkaXRpbmcgZmVhdHVyZXMuICBJdCBpcyB0byBiZSBhbiBhcHBlbmRpeCB0byBtYW51YWxzIGZvciBwcm9ncmFtcyB3aGljaAotdXNlIHRoZXNlIGZlYXR1cmVzLiAgVGhlcmUgaXMgYSBkb2N1bWVudCBlbnRpdGxlZCAicmVhZGxpbmUudGV4aW5mbyIKLXdoaWNoIGNvbnRhaW5zIGJvdGggZW5kLXVzZXIgYW5kIHByb2dyYW1tZXIgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEdOVQotUmVhZGxpbmUgTGlicmFyeS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkxLCAxOTkzLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1BdXRob3JlZCBieSBCcmlhbiBGb3ggYW5kIENoZXQgUmFtZXkuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbiBub3RpY2UKLWlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoICh0aGlzCi1wYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIG1hbnVhbAotcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXJlIHByZXNlcnZlZCBvbgotYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQgdGhlCi1HTlUgQ29weXJpZ2h0IHN0YXRlbWVudCBpcyBhdmFpbGFibGUgdG8gdGhlIGRpc3RyaWJ1dGVlLCBhbmQgcHJvdmlkZWQgdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlnbm9yZQotCi1AY29tbWVudCBJZiB5b3UgYXJlIGluY2x1ZGluZyB0aGlzIG1hbnVhbCBhcyBhbiBhcHBlbmRpeCwgdGhlbiBzZXQgdGhlCi1AY29tbWVudCB2YXJpYWJsZSByZWFkbGluZS1hcHBlbmRpeC4KLQotQG5vZGUgQ29tbWFuZCBMaW5lIEVkaXRpbmcKLUBjaGFwdGVyIENvbW1hbmQgTGluZSBFZGl0aW5nCi0KLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIHRoZSBAc2N7R05VfQotY29tbWFuZCBsaW5lIGVkaXRpbmcgaW50ZXJmYWNlLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb24gYW5kIE5vdGF0aW9uOjoJTm90YXRpb24gdXNlZCBpbiB0aGlzIHRleHQuCi0qIFJlYWRsaW5lIEludGVyYWN0aW9uOjoJVGhlIG1pbmltdW0gc2V0IG9mIGNvbW1hbmRzIGZvciBlZGl0aW5nIGEgbGluZS4KLSogUmVhZGxpbmUgSW5pdCBGaWxlOjoJCUN1c3RvbWl6aW5nIFJlYWRsaW5lIGZyb20gYSB1c2VyJ3Mgdmlldy4KLSogQmluZGFibGUgUmVhZGxpbmUgQ29tbWFuZHM6OglBIGRlc2NyaXB0aW9uIG9mIG1vc3Qgb2YgdGhlIFJlYWRsaW5lIGNvbW1hbmRzCi0JCQkJYXZhaWxhYmxlIGZvciBiaW5kaW5nCi0qIFJlYWRsaW5lIHZpIE1vZGU6OgkJQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiBob3cgdG8gbWFrZSBSZWFkbGluZQotCQkJCWJlaGF2ZSBsaWtlIHRoZSB2aSBlZGl0b3IuCi1AZW5kIG1lbnUKLQotQG5vZGUgSW50cm9kdWN0aW9uIGFuZCBOb3RhdGlvbgotQHNlY3Rpb24gSW50cm9kdWN0aW9uIHRvIExpbmUgRWRpdGluZwotCi1UaGUgZm9sbG93aW5nIHBhcmFncmFwaHMgZGVzY3JpYmUgdGhlIG5vdGF0aW9uIHVzZWQgdG8gcmVwcmVzZW50Ci1rZXlzdHJva2VzLgotCi1UaGUgdGV4dCBAa2V5e0Mta30gaXMgcmVhZCBhcyBgQ29udHJvbC1LJyBhbmQgZGVzY3JpYmVzIHRoZSBjaGFyYWN0ZXIKLXByb2R1Y2VkIHdoZW4gdGhlIEBrZXl7a30ga2V5IGlzIHByZXNzZWQgd2hpbGUgdGhlIENvbnRyb2wga2V5Ci1pcyBkZXByZXNzZWQuCi0KLVRoZSB0ZXh0IEBrZXl7TS1rfSBpcyByZWFkIGFzIGBNZXRhLUsnIGFuZCBkZXNjcmliZXMgdGhlIGNoYXJhY3RlcgotcHJvZHVjZWQgd2hlbiB0aGUgbWV0YSBrZXkgKGlmIHlvdSBoYXZlIG9uZSkgaXMgZGVwcmVzc2VkLCBhbmQgdGhlIEBrZXl7a30KLWtleSBpcyBwcmVzc2VkLiAgSWYgeW91IGRvIG5vdCBoYXZlIGEgbWV0YSBrZXksIHRoZSBpZGVudGljYWwga2V5c3Ryb2tlCi1jYW4gYmUgZ2VuZXJhdGVkIGJ5IHR5cGluZyBAa2V5e0VTQ30gQGl7Zmlyc3R9LCBhbmQgdGhlbiB0eXBpbmcgQGtleXtrfS4KLUVpdGhlciBwcm9jZXNzIGlzIGtub3duIGFzIEBkZm57bWV0YWZ5aW5nfSB0aGUgQGtleXtrfSBrZXkuCi0KLVRoZSB0ZXh0IEBrZXl7TS1DLWt9IGlzIHJlYWQgYXMgYE1ldGEtQ29udHJvbC1rJyBhbmQgZGVzY3JpYmVzIHRoZQotY2hhcmFjdGVyIHByb2R1Y2VkIGJ5IEBkZm57bWV0YWZ5aW5nfSBAa2V5e0Mta30uCi0KLUluIGFkZGl0aW9uLCBzZXZlcmFsIGtleXMgaGF2ZSB0aGVpciBvd24gbmFtZXMuICBTcGVjaWZpY2FsbHksCi1Aa2V5e0RFTH0sIEBrZXl7RVNDfSwgQGtleXtMRkR9LCBAa2V5e1NQQ30sIEBrZXl7UkVUfSwgYW5kIEBrZXl7VEFCfSBhbGwKLXN0YW5kIGZvciB0aGVtc2VsdmVzIHdoZW4gc2VlbiBpbiB0aGlzIHRleHQsIG9yIGluIGFuIGluaXQgZmlsZQotKEBweHJlZntSZWFkbGluZSBJbml0IEZpbGV9KS4KLQotQG5vZGUgUmVhZGxpbmUgSW50ZXJhY3Rpb24KLUBzZWN0aW9uIFJlYWRsaW5lIEludGVyYWN0aW9uCi1AY2luZGV4IGludGVyYWN0aW9uLCByZWFkbGluZQotCi1PZnRlbiBkdXJpbmcgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiB5b3UgdHlwZSBpbiBhIGxvbmcgbGluZSBvZiB0ZXh0LAotb25seSB0byBub3RpY2UgdGhhdCB0aGUgZmlyc3Qgd29yZCBvbiB0aGUgbGluZSBpcyBtaXNzcGVsbGVkLiAgVGhlCi1SZWFkbGluZSBsaWJyYXJ5IGdpdmVzIHlvdSBhIHNldCBvZiBjb21tYW5kcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSB0ZXh0Ci1hcyB5b3UgdHlwZSBpdCBpbiwgYWxsb3dpbmcgeW91IHRvIGp1c3QgZml4IHlvdXIgdHlwbywgYW5kIG5vdCBmb3JjaW5nCi15b3UgdG8gcmV0eXBlIHRoZSBtYWpvcml0eSBvZiB0aGUgbGluZS4gIFVzaW5nIHRoZXNlIGVkaXRpbmcgY29tbWFuZHMsCi15b3UgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwbGFjZSB0aGF0IG5lZWRzIGNvcnJlY3Rpb24sIGFuZCBkZWxldGUgb3IKLWluc2VydCB0aGUgdGV4dCBvZiB0aGUgY29ycmVjdGlvbnMuICBUaGVuLCB3aGVuIHlvdSBhcmUgc2F0aXNmaWVkIHdpdGgKLXRoZSBsaW5lLCB5b3Ugc2ltcGx5IHByZXNzIEBrZXl7UkVUVVJOfS4gIFlvdSBkbyBub3QgaGF2ZSB0byBiZSBhdCB0aGUKLWVuZCBvZiB0aGUgbGluZSB0byBwcmVzcyBAa2V5e1JFVFVSTn07IHRoZSBlbnRpcmUgbGluZSBpcyBhY2NlcHRlZAotcmVnYXJkbGVzcyBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnNvciB3aXRoaW4gdGhlIGxpbmUuCi0KLUBtZW51Ci0qIFJlYWRsaW5lIEJhcmUgRXNzZW50aWFsczo6CVRoZSBsZWFzdCB5b3UgbmVlZCB0byBrbm93IGFib3V0IFJlYWRsaW5lLgotKiBSZWFkbGluZSBNb3ZlbWVudCBDb21tYW5kczo6CU1vdmluZyBhYm91dCB0aGUgaW5wdXQgbGluZS4KLSogUmVhZGxpbmUgS2lsbGluZyBDb21tYW5kczo6CUhvdyB0byBkZWxldGUgdGV4dCwgYW5kIGhvdyB0byBnZXQgaXQgYmFjayEKLSogUmVhZGxpbmUgQXJndW1lbnRzOjoJCUdpdmluZyBudW1lcmljIGFyZ3VtZW50cyB0byBjb21tYW5kcy4KLSogU2VhcmNoaW5nOjoJCQlTZWFyY2hpbmcgdGhyb3VnaCBwcmV2aW91cyBsaW5lcy4KLUBlbmQgbWVudQotCi1Abm9kZSBSZWFkbGluZSBCYXJlIEVzc2VudGlhbHMKLUBzdWJzZWN0aW9uIFJlYWRsaW5lIEJhcmUgRXNzZW50aWFscwotQGNpbmRleCBub3RhdGlvbiwgcmVhZGxpbmUKLUBjaW5kZXggY29tbWFuZCBlZGl0aW5nCi1AY2luZGV4IGVkaXRpbmcgY29tbWFuZCBsaW5lcwotCi1JbiBvcmRlciB0byBlbnRlciBjaGFyYWN0ZXJzIGludG8gdGhlIGxpbmUsIHNpbXBseSB0eXBlIHRoZW0uICBUaGUgdHlwZWQKLWNoYXJhY3RlciBhcHBlYXJzIHdoZXJlIHRoZSBjdXJzb3Igd2FzLCBhbmQgdGhlbiB0aGUgY3Vyc29yIG1vdmVzIG9uZQotc3BhY2UgdG8gdGhlIHJpZ2h0LiAgSWYgeW91IG1pc3R5cGUgYSBjaGFyYWN0ZXIsIHlvdSBjYW4gdXNlIHlvdXIKLWVyYXNlIGNoYXJhY3RlciB0byBiYWNrIHVwIGFuZCBkZWxldGUgdGhlIG1pc3R5cGVkIGNoYXJhY3Rlci4KLQotU29tZXRpbWVzIHlvdSBtYXkgbWlzcyB0eXBpbmcgYSBjaGFyYWN0ZXIgdGhhdCB5b3Ugd2FudGVkIHRvIHR5cGUsIGFuZAotbm90IG5vdGljZSB5b3VyIGVycm9yIHVudGlsIHlvdSBoYXZlIHR5cGVkIHNldmVyYWwgb3RoZXIgY2hhcmFjdGVycy4gIEluCi10aGF0IGNhc2UsIHlvdSBjYW4gdHlwZSBAa2V5e0MtYn0gdG8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBsZWZ0LCBhbmQgdGhlbgotY29ycmVjdCB5b3VyIG1pc3Rha2UuICBBZnRlcndhcmRzLCB5b3UgY2FuIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmlnaHQKLXdpdGggQGtleXtDLWZ9LgotCi1XaGVuIHlvdSBhZGQgdGV4dCBpbiB0aGUgbWlkZGxlIG9mIGEgbGluZSwgeW91IHdpbGwgbm90aWNlIHRoYXQgY2hhcmFjdGVycwotdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgYXJlIGBwdXNoZWQgb3ZlcicgdG8gbWFrZSByb29tIGZvciB0aGUgdGV4dAotdGhhdCB5b3UgaGF2ZSBpbnNlcnRlZC4gIExpa2V3aXNlLCB3aGVuIHlvdSBkZWxldGUgdGV4dCBiZWhpbmQgdGhlIGN1cnNvciwKLWNoYXJhY3RlcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgYXJlIGBwdWxsZWQgYmFjaycgdG8gZmlsbCBpbiB0aGUKLWJsYW5rIHNwYWNlIGNyZWF0ZWQgYnkgdGhlIHJlbW92YWwgb2YgdGhlIHRleHQuICBBIGxpc3Qgb2YgdGhlIGJhc2ljIGJhcmUKLWVzc2VudGlhbHMgZm9yIGVkaXRpbmcgdGhlIHRleHQgb2YgYW4gaW5wdXQgbGluZSBmb2xsb3dzLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEBrZXl7Qy1ifQotTW92ZSBiYWNrIG9uZSBjaGFyYWN0ZXIuCi1AaXRlbSBAa2V5e0MtZn0KLU1vdmUgZm9yd2FyZCBvbmUgY2hhcmFjdGVyLgotQGl0ZW0gQGtleXtERUx9Ci1EZWxldGUgdGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yLgotQGl0ZW0gQGtleXtDLWR9Ci1EZWxldGUgdGhlIGNoYXJhY3RlciB1bmRlcm5lYXRoIHRoZSBjdXJzb3IuCi1AaXRlbSBAd3tQcmludGluZyBjaGFyYWN0ZXJzfQotSW5zZXJ0IHRoZSBjaGFyYWN0ZXIgaW50byB0aGUgbGluZSBhdCB0aGUgY3Vyc29yLgotQGl0ZW0gQGtleXtDLV99Ci1VbmRvIHRoZSBsYXN0IGVkaXRpbmcgY29tbWFuZC4gIFlvdSBjYW4gdW5kbyBhbGwgdGhlIHdheSBiYWNrIHRvIGFuCi1lbXB0eSBsaW5lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBSZWFkbGluZSBNb3ZlbWVudCBDb21tYW5kcwotQHN1YnNlY3Rpb24gUmVhZGxpbmUgTW92ZW1lbnQgQ29tbWFuZHMKLQotCi1UaGUgYWJvdmUgdGFibGUgZGVzY3JpYmVzIHRoZSBtb3N0IGJhc2ljIHBvc3NpYmxlIGtleXN0cm9rZXMgdGhhdCB5b3UgbmVlZAotaW4gb3JkZXIgdG8gZG8gZWRpdGluZyBvZiB0aGUgaW5wdXQgbGluZS4gIEZvciB5b3VyIGNvbnZlbmllbmNlLCBtYW55Ci1vdGhlciBjb21tYW5kcyBoYXZlIGJlZW4gYWRkZWQgaW4gYWRkaXRpb24gdG8gQGtleXtDLWJ9LCBAa2V5e0MtZn0sCi1Aa2V5e0MtZH0sIGFuZCBAa2V5e0RFTH0uICBIZXJlIGFyZSBzb21lIGNvbW1hbmRzIGZvciBtb3ZpbmcgbW9yZSByYXBpZGx5Ci1hYm91dCB0aGUgbGluZS4KLQotQHRhYmxlIEBrZXkKLUBpdGVtIEMtYQotTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCi1AaXRlbSBDLWUKLU1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLUBpdGVtIE0tZgotTW92ZSBmb3J3YXJkIGEgd29yZCwgd2hlcmUgYSB3b3JkIGlzIGNvbXBvc2VkIG9mIGxldHRlcnMgYW5kIGRpZ2l0cy4KLUBpdGVtIE0tYgotTW92ZSBiYWNrd2FyZCBhIHdvcmQuCi1AaXRlbSBDLWwKLUNsZWFyIHRoZSBzY3JlZW4sIHJlcHJpbnRpbmcgdGhlIGN1cnJlbnQgbGluZSBhdCB0aGUgdG9wLgotQGVuZCB0YWJsZQotCi1Ob3RpY2UgaG93IEBrZXl7Qy1mfSBtb3ZlcyBmb3J3YXJkIGEgY2hhcmFjdGVyLCB3aGlsZSBAa2V5e00tZn0gbW92ZXMKLWZvcndhcmQgYSB3b3JkLiAgSXQgaXMgYSBsb29zZSBjb252ZW50aW9uIHRoYXQgY29udHJvbCBrZXlzdHJva2VzCi1vcGVyYXRlIG9uIGNoYXJhY3RlcnMgd2hpbGUgbWV0YSBrZXlzdHJva2VzIG9wZXJhdGUgb24gd29yZHMuCi0KLUBub2RlIFJlYWRsaW5lIEtpbGxpbmcgQ29tbWFuZHMKLUBzdWJzZWN0aW9uIFJlYWRsaW5lIEtpbGxpbmcgQ29tbWFuZHMKLQotQGNpbmRleCBraWxsaW5nIHRleHQKLUBjaW5kZXggeWFua2luZyB0ZXh0Ci0KLUBkZm57S2lsbGluZ30gdGV4dCBtZWFucyB0byBkZWxldGUgdGhlIHRleHQgZnJvbSB0aGUgbGluZSwgYnV0IHRvIHNhdmUKLWl0IGF3YXkgZm9yIGxhdGVyIHVzZSwgdXN1YWxseSBieSBAZGZue3lhbmtpbmd9IChyZS1pbnNlcnRpbmcpCi1pdCBiYWNrIGludG8gdGhlIGxpbmUuCi1JZiB0aGUgZGVzY3JpcHRpb24gZm9yIGEgY29tbWFuZCBzYXlzIHRoYXQgaXQgYGtpbGxzJyB0ZXh0LCB0aGVuIHlvdSBjYW4KLWJlIHN1cmUgdGhhdCB5b3UgY2FuIGdldCB0aGUgdGV4dCBiYWNrIGluIGEgZGlmZmVyZW50IChvciB0aGUgc2FtZSkKLXBsYWNlIGxhdGVyLgotCi1XaGVuIHlvdSB1c2UgYSBraWxsIGNvbW1hbmQsIHRoZSB0ZXh0IGlzIHNhdmVkIGluIGEgQGRmbntraWxsLXJpbmd9LgotQW55IG51bWJlciBvZiBjb25zZWN1dGl2ZSBraWxscyBzYXZlIGFsbCBvZiB0aGUga2lsbGVkIHRleHQgdG9nZXRoZXIsIHNvCi10aGF0IHdoZW4geW91IHlhbmsgaXQgYmFjaywgeW91IGdldCBpdCBhbGwuICBUaGUga2lsbAotcmluZyBpcyBub3QgbGluZSBzcGVjaWZpYzsgdGhlIHRleHQgdGhhdCB5b3Uga2lsbGVkIG9uIGEgcHJldmlvdXNseQotdHlwZWQgbGluZSBpcyBhdmFpbGFibGUgdG8gYmUgeWFua2VkIGJhY2sgbGF0ZXIsIHdoZW4geW91IGFyZSB0eXBpbmcKLWFub3RoZXIgbGluZS4KLUBjaW5kZXgga2lsbCByaW5nCi0KLUhlcmUgaXMgdGhlIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGtpbGxpbmcgdGV4dC4KLQotQHRhYmxlIEBrZXkKLUBpdGVtIEMtawotS2lsbCB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotCi1AaXRlbSBNLWQKLUtpbGwgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgd29yZCwgb3IgaWYgYmV0d2Vlbgotd29yZHMsIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZC4KLQotQGl0ZW0gTS1ERUwKLUtpbGwgZnJvbSB0aGUgY3Vyc29yIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgd29yZCwgb3IgaWYgYmV0d2Vlbgotd29yZHMsIHRvIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgd29yZC4KLQotQGl0ZW0gQy13Ci1LaWxsIGZyb20gdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgd2hpdGVzcGFjZS4gIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4KLUBrZXl7TS1ERUx9IGJlY2F1c2UgdGhlIHdvcmQgYm91bmRhcmllcyBkaWZmZXIuCi0KLUBlbmQgdGFibGUKLQotSGVyZSBpcyBob3cgdG8gQGRmbnt5YW5rfSB0aGUgdGV4dCBiYWNrIGludG8gdGhlIGxpbmUuICBZYW5raW5nCi1tZWFucyB0byBjb3B5IHRoZSBtb3N0LXJlY2VudGx5LWtpbGxlZCB0ZXh0IGZyb20gdGhlIGtpbGwgYnVmZmVyLgotCi1AdGFibGUgQGtleQotQGl0ZW0gQy15Ci1ZYW5rIHRoZSBtb3N0IHJlY2VudGx5IGtpbGxlZCB0ZXh0IGJhY2sgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBjdXJzb3IuCi0KLUBpdGVtIE0teQotUm90YXRlIHRoZSBraWxsLXJpbmcsIGFuZCB5YW5rIHRoZSBuZXcgdG9wLiAgWW91IGNhbiBvbmx5IGRvIHRoaXMgaWYKLXRoZSBwcmlvciBjb21tYW5kIGlzIEBrZXl7Qy15fSBvciBAa2V5e00teX0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFJlYWRsaW5lIEFyZ3VtZW50cwotQHN1YnNlY3Rpb24gUmVhZGxpbmUgQXJndW1lbnRzCi0KLVlvdSBjYW4gcGFzcyBudW1lcmljIGFyZ3VtZW50cyB0byBSZWFkbGluZSBjb21tYW5kcy4gIFNvbWV0aW1lcyB0aGUKLWFyZ3VtZW50IGFjdHMgYXMgYSByZXBlYXQgY291bnQsIG90aGVyIHRpbWVzIGl0IGlzIHRoZSBAaXtzaWdufSBvZiB0aGUKLWFyZ3VtZW50IHRoYXQgaXMgc2lnbmlmaWNhbnQuICBJZiB5b3UgcGFzcyBhIG5lZ2F0aXZlIGFyZ3VtZW50IHRvIGEKLWNvbW1hbmQgd2hpY2ggbm9ybWFsbHkgYWN0cyBpbiBhIGZvcndhcmQgZGlyZWN0aW9uLCB0aGF0IGNvbW1hbmQgd2lsbAotYWN0IGluIGEgYmFja3dhcmQgZGlyZWN0aW9uLiAgRm9yIGV4YW1wbGUsIHRvIGtpbGwgdGV4dCBiYWNrIHRvIHRoZQotc3RhcnQgb2YgdGhlIGxpbmUsIHlvdSBtaWdodCB0eXBlIEBzYW1we00tLSBDLWt9LgotCi1UaGUgZ2VuZXJhbCB3YXkgdG8gcGFzcyBudW1lcmljIGFyZ3VtZW50cyB0byBhIGNvbW1hbmQgaXMgdG8gdHlwZSBtZXRhCi1kaWdpdHMgYmVmb3JlIHRoZSBjb21tYW5kLiAgSWYgdGhlIGZpcnN0IGBkaWdpdCcgdHlwZWQgaXMgYSBtaW51cwotc2lnbiAoQGtleXstfSksIHRoZW4gdGhlIHNpZ24gb2YgdGhlIGFyZ3VtZW50IHdpbGwgYmUgbmVnYXRpdmUuICBPbmNlCi15b3UgaGF2ZSB0eXBlZCBvbmUgbWV0YSBkaWdpdCB0byBnZXQgdGhlIGFyZ3VtZW50IHN0YXJ0ZWQsIHlvdSBjYW4gdHlwZQotdGhlIHJlbWFpbmRlciBvZiB0aGUgZGlnaXRzLCBhbmQgdGhlbiB0aGUgY29tbWFuZC4gIEZvciBleGFtcGxlLCB0byBnaXZlCi10aGUgQGtleXtDLWR9IGNvbW1hbmQgYW4gYXJndW1lbnQgb2YgMTAsIHlvdSBjb3VsZCB0eXBlIEBzYW1we00tMSAwIEMtZH0uCi0KLUBub2RlIFNlYXJjaGluZwotQHN1YnNlY3Rpb24gU2VhcmNoaW5nIGZvciBDb21tYW5kcyBpbiB0aGUgSGlzdG9yeQotCi1SZWFkbGluZSBwcm92aWRlcyBjb21tYW5kcyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgaGlzdG9yeQotQGlmc2V0IEJhc2hGZWF0dXJlcwotKEBweHJlZntCYXNoIEhpc3RvcnkgRmFjaWxpdGllc30pCi1AZW5kIGlmc2V0Ci1mb3IgbGluZXMgY29udGFpbmluZyBhIHNwZWNpZmllZCBzdHJpbmcuCi1UaGVyZSBhcmUgdHdvIHNlYXJjaCBtb2RlczogIEB2YXJ7aW5jcmVtZW50YWx9IGFuZCBAdmFye25vbi1pbmNyZW1lbnRhbH0uCi0KLUluY3JlbWVudGFsIHNlYXJjaGVzIGJlZ2luIGJlZm9yZSB0aGUgdXNlciBoYXMgZmluaXNoZWQgdHlwaW5nIHRoZQotc2VhcmNoIHN0cmluZy4KLUFzIGVhY2ggY2hhcmFjdGVyIG9mIHRoZSBzZWFyY2ggc3RyaW5nIGlzIHR5cGVkLCBSZWFkbGluZSBkaXNwbGF5cwotdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgaGlzdG9yeSBtYXRjaGluZyB0aGUgc3RyaW5nIHR5cGVkIHNvIGZhci4KLUFuIGluY3JlbWVudGFsIHNlYXJjaCByZXF1aXJlcyBvbmx5IGFzIG1hbnkgY2hhcmFjdGVycyBhcyBuZWVkZWQgdG8KLWZpbmQgdGhlIGRlc2lyZWQgaGlzdG9yeSBlbnRyeS4KLVRoZSBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlIHZhbHVlIG9mIHRoZSBAdmFye2lzZWFyY2gtdGVybWluYXRvcnN9IHZhcmlhYmxlCi1hcmUgdXNlZCB0byB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgotSWYgdGhhdCB2YXJpYWJsZSBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSB2YWx1ZSwgdGhlIEBrZXl7RVNDfSBhbmQKLUBrZXl7Qy1KfSBjaGFyYWN0ZXJzIHdpbGwgdGVybWluYXRlIGFuIGluY3JlbWVudGFsIHNlYXJjaC4KLUBrZXl7Qy1nfSB3aWxsIGFib3J0IGFuIGluY3JlbWVudGFsIHNlYXJjaCBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbGluZS4KLVdoZW4gdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkLCB0aGUgaGlzdG9yeSBlbnRyeSBjb250YWluaW5nIHRoZQotc2VhcmNoIHN0cmluZyBiZWNvbWVzIHRoZSBjdXJyZW50IGxpbmUuCi1UbyBmaW5kIG90aGVyIG1hdGNoaW5nIGVudHJpZXMgaW4gdGhlIGhpc3RvcnkgbGlzdCwgdHlwZSBAa2V5e0Mtc30gb3IKLUBrZXl7Qy1yfSBhcyBhcHByb3ByaWF0ZS4KLVRoaXMgd2lsbCBzZWFyY2ggYmFja3dhcmQgb3IgZm9yd2FyZCBpbiB0aGUgaGlzdG9yeSBmb3IgdGhlIG5leHQKLWVudHJ5IG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5nIHR5cGVkIHNvIGZhci4KLUFueSBvdGhlciBrZXkgc2VxdWVuY2UgYm91bmQgdG8gYSBSZWFkbGluZSBjb21tYW5kIHdpbGwgdGVybWluYXRlCi10aGUgc2VhcmNoIGFuZCBleGVjdXRlIHRoYXQgY29tbWFuZC4KLUZvciBpbnN0YW5jZSwgYSBAa2V5e1JFVH0gd2lsbCB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBhbmQgYWNjZXB0Ci10aGUgbGluZSwgdGhlcmVieSBleGVjdXRpbmcgdGhlIGNvbW1hbmQgZnJvbSB0aGUgaGlzdG9yeSBsaXN0LgotCi1Ob24taW5jcmVtZW50YWwgc2VhcmNoZXMgcmVhZCB0aGUgZW50aXJlIHNlYXJjaCBzdHJpbmcgYmVmb3JlIHN0YXJ0aW5nCi10byBzZWFyY2ggZm9yIG1hdGNoaW5nIGhpc3RvcnkgbGluZXMuICBUaGUgc2VhcmNoIHN0cmluZyBtYXkgYmUKLXR5cGVkIGJ5IHRoZSB1c2VyIG9yIGJlIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0KLUBub2RlIFJlYWRsaW5lIEluaXQgRmlsZQotQHNlY3Rpb24gUmVhZGxpbmUgSW5pdCBGaWxlCi1AY2luZGV4IGluaXRpYWxpemF0aW9uIGZpbGUsIHJlYWRsaW5lCi0KLUFsdGhvdWdoIHRoZSBSZWFkbGluZSBsaWJyYXJ5IGNvbWVzIHdpdGggYSBzZXQgb2YgQGNvZGV7ZW1hY3N9LWxpa2UKLWtleWJpbmRpbmdzIGluc3RhbGxlZCBieSBkZWZhdWx0LCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBkaWZmZXJlbnQgc2V0Ci1vZiBrZXliaW5kaW5ncy4KLUFueSB1c2VyIGNhbiBjdXN0b21pemUgcHJvZ3JhbXMgdGhhdCB1c2UgUmVhZGxpbmUgYnkgcHV0dGluZwotY29tbWFuZHMgaW4gYW4gQGRmbntpbnB1dHJjfSBmaWxlIGluIGhpcyBob21lIGRpcmVjdG9yeS4KLVRoZSBuYW1lIG9mIHRoaXMKLUBpZnNldCBCYXNoRmVhdHVyZXMKLWZpbGUgaXMgdGFrZW4gZnJvbSB0aGUgdmFsdWUgb2YgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle0lOUFVUUkN9LiAgSWYKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJhc2hGZWF0dXJlcwotZmlsZSBpcyB0YWtlbiBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7SU5QVVRSQ30uICBJZgotQGVuZCBpZmNsZWFyCi10aGF0IHZhcmlhYmxlIGlzIHVuc2V0LCB0aGUgZGVmYXVsdCBpcyBAZmlsZXt+Ly5pbnB1dHJjfS4KLQotV2hlbiBhIHByb2dyYW0gd2hpY2ggdXNlcyB0aGUgUmVhZGxpbmUgbGlicmFyeSBzdGFydHMgdXAsIHRoZQotaW5pdCBmaWxlIGlzIHJlYWQsIGFuZCB0aGUga2V5IGJpbmRpbmdzIGFyZSBzZXQuCi0KLUluIGFkZGl0aW9uLCB0aGUgQGNvZGV7Qy14IEMtcn0gY29tbWFuZCByZS1yZWFkcyB0aGlzIGluaXQgZmlsZSwgdGh1cwotaW5jb3Jwb3JhdGluZyBhbnkgY2hhbmdlcyB0aGF0IHlvdSBtaWdodCBoYXZlIG1hZGUgdG8gaXQuCi0KLUBtZW51Ci0qIFJlYWRsaW5lIEluaXQgRmlsZSBTeW50YXg6OglTeW50YXggZm9yIHRoZSBjb21tYW5kcyBpbiB0aGUgaW5wdXRyYyBmaWxlLgotCi0qIENvbmRpdGlvbmFsIEluaXQgQ29uc3RydWN0czo6CUNvbmRpdGlvbmFsIGtleSBiaW5kaW5ncyBpbiB0aGUgaW5wdXRyYyBmaWxlLgotCi0qIFNhbXBsZSBJbml0IEZpbGU6OgkJQW4gZXhhbXBsZSBpbnB1dHJjIGZpbGUuCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVhZGxpbmUgSW5pdCBGaWxlIFN5bnRheAotQHN1YnNlY3Rpb24gUmVhZGxpbmUgSW5pdCBGaWxlIFN5bnRheAotCi1UaGVyZSBhcmUgb25seSBhIGZldyBiYXNpYyBjb25zdHJ1Y3RzIGFsbG93ZWQgaW4gdGhlCi1SZWFkbGluZSBpbml0IGZpbGUuICBCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4KLUxpbmVzIGJlZ2lubmluZyB3aXRoIGEgQHNhbXB7I30gYXJlIGNvbW1lbnRzLgotTGluZXMgYmVnaW5uaW5nIHdpdGggYSBAc2FtcHskfSBpbmRpY2F0ZSBjb25kaXRpb25hbAotY29uc3RydWN0cyAoQHB4cmVme0NvbmRpdGlvbmFsIEluaXQgQ29uc3RydWN0c30pLiAgT3RoZXIgbGluZXMKLWRlbm90ZSB2YXJpYWJsZSBzZXR0aW5ncyBhbmQga2V5IGJpbmRpbmdzLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIFZhcmlhYmxlIFNldHRpbmdzCi1Zb3UgY2FuIG1vZGlmeSB0aGUgcnVuLXRpbWUgYmVoYXZpb3Igb2YgUmVhZGxpbmUgYnkKLWFsdGVyaW5nIHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzIGluIFJlYWRsaW5lCi11c2luZyB0aGUgQGNvZGV7c2V0fSBjb21tYW5kIHdpdGhpbiB0aGUgaW5pdCBmaWxlLiAgSGVyZSBpcyBob3cgdG8KLWNoYW5nZSBmcm9tIHRoZSBkZWZhdWx0IEVtYWNzLWxpa2Uga2V5IGJpbmRpbmcgdG8gdXNlCi1AY29kZXt2aX0gbGluZSBlZGl0aW5nIGNvbW1hbmRzOgotCi1AZXhhbXBsZQotc2V0IGVkaXRpbmctbW9kZSB2aQotQGVuZCBleGFtcGxlCi0KLUEgZ3JlYXQgZGVhbCBvZiBydW4tdGltZSBiZWhhdmlvciBpcyBjaGFuZ2VhYmxlIHdpdGggdGhlIGZvbGxvd2luZwotdmFyaWFibGVzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gYmVsbC1zdHlsZQotQHZpbmRleCBiZWxsLXN0eWxlCi1Db250cm9scyB3aGF0IGhhcHBlbnMgd2hlbiBSZWFkbGluZSB3YW50cyB0byByaW5nIHRoZSB0ZXJtaW5hbCBiZWxsLgotSWYgc2V0IHRvIEBzYW1we25vbmV9LCBSZWFkbGluZSBuZXZlciByaW5ncyB0aGUgYmVsbC4gIElmIHNldCB0bwotQHNhbXB7dmlzaWJsZX0sIFJlYWRsaW5lIHVzZXMgYSB2aXNpYmxlIGJlbGwgaWYgb25lIGlzIGF2YWlsYWJsZS4KLUlmIHNldCB0byBAc2FtcHthdWRpYmxlfSAodGhlIGRlZmF1bHQpLCBSZWFkbGluZSBhdHRlbXB0cyB0byByaW5nCi10aGUgdGVybWluYWwncyBiZWxsLgotCi1AaXRlbSBjb21tZW50LWJlZ2luCi1AdmluZGV4IGNvbW1lbnQtYmVnaW4KLVRoZSBzdHJpbmcgdG8gaW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgd2hlbiB0aGUKLUBjb2Rle2luc2VydC1jb21tZW50fSBjb21tYW5kIGlzIGV4ZWN1dGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUKLWlzIEBjb2RleyIjIn0uCi0KLUBpdGVtIGNvbXBsZXRpb24taWdub3JlLWNhc2UKLUlmIHNldCB0byBAc2FtcHtvbn0sIFJlYWRsaW5lIHBlcmZvcm1zIGZpbGVuYW1lIG1hdGNoaW5nIGFuZCBjb21wbGV0aW9uCi1pbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmFzaGlvbi4KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIEBzYW1we29mZn0uCi0KLUBpdGVtIGNvbXBsZXRpb24tcXVlcnktaXRlbXMKLUB2aW5kZXggY29tcGxldGlvbi1xdWVyeS1pdGVtcwotVGhlIG51bWJlciBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucyB0aGF0IGRldGVybWluZXMgd2hlbiB0aGUgdXNlciBpcwotYXNrZWQgd2hldGhlciBoZSB3YW50cyB0byBzZWUgdGhlIGxpc3Qgb2YgcG9zc2liaWxpdGllcy4gIElmIHRoZQotbnVtYmVyIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlLAotUmVhZGxpbmUgd2lsbCBhc2sgdGhlIHVzZXIgd2hldGhlciBvciBub3QgaGUgd2lzaGVzIHRvIHZpZXcKLXRoZW07IG90aGVyd2lzZSwgdGhleSBhcmUgc2ltcGx5IGxpc3RlZC4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzCi1AY29kZXsxMDB9LgotCi1AaXRlbSBjb252ZXJ0LW1ldGEKLUB2aW5kZXggY29udmVydC1tZXRhCi1JZiBzZXQgdG8gQHNhbXB7b259LCBSZWFkbGluZSB3aWxsIGNvbnZlcnQgY2hhcmFjdGVycyB3aXRoIHRoZQotZWlnaHRoIGJpdCBzZXQgdG8gYW4gQVNDSUkga2V5IHNlcXVlbmNlIGJ5IHN0cmlwcGluZyB0aGUgZWlnaHRoCi1iaXQgYW5kIHByZXBlbmRpbmcgYW4gQGtleXtFU0N9IGNoYXJhY3RlciwgY29udmVydGluZyB0aGVtIHRvIGEKLW1ldGEtcHJlZml4ZWQga2V5IHNlcXVlbmNlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7b259LgotCi1AaXRlbSBkaXNhYmxlLWNvbXBsZXRpb24KLUB2aW5kZXggZGlzYWJsZS1jb21wbGV0aW9uCi1JZiBzZXQgdG8gQHNhbXB7T259LCBSZWFkbGluZSB3aWxsIGluaGliaXQgd29yZCBjb21wbGV0aW9uLgotQ29tcGxldGlvbiAgY2hhcmFjdGVycyB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGxpbmUgYXMgaWYgdGhleSBoYWQKLWJlZW4gbWFwcGVkIHRvIEBjb2Rle3NlbGYtaW5zZXJ0fS4gIFRoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCi0KLUBpdGVtIGVkaXRpbmctbW9kZQotQHZpbmRleCBlZGl0aW5nLW1vZGUKLVRoZSBAY29kZXtlZGl0aW5nLW1vZGV9IHZhcmlhYmxlIGNvbnRyb2xzIHdoaWNoIGRlZmF1bHQgc2V0IG9mCi1rZXkgYmluZGluZ3MgaXMgdXNlZC4gIEJ5IGRlZmF1bHQsIFJlYWRsaW5lIHN0YXJ0cyB1cCBpbiBFbWFjcyBlZGl0aW5nCi1tb2RlLCB3aGVyZSB0aGUga2V5c3Ryb2tlcyBhcmUgbW9zdCBzaW1pbGFyIHRvIEVtYWNzLiAgVGhpcyB2YXJpYWJsZSBjYW4gYmUKLXNldCB0byBlaXRoZXIgQHNhbXB7ZW1hY3N9IG9yIEBzYW1we3ZpfS4KLQotQGl0ZW0gZW5hYmxlLWtleXBhZAotQHZpbmRleCBlbmFibGUta2V5cGFkCi1XaGVuIHNldCB0byBAc2FtcHtvbn0sIFJlYWRsaW5lIHdpbGwgdHJ5IHRvIGVuYWJsZSB0aGUgYXBwbGljYXRpb24KLWtleXBhZCB3aGVuIGl0IGlzIGNhbGxlZC4gIFNvbWUgc3lzdGVtcyBuZWVkIHRoaXMgdG8gZW5hYmxlIHRoZQotYXJyb3cga2V5cy4gIFRoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCi0KLUBpdGVtIGV4cGFuZC10aWxkZQotQHZpbmRleCBleHBhbmQtdGlsZGUKLUlmIHNldCB0byBAc2FtcHtvbn0sIHRpbGRlIGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQgd2hlbiBSZWFkbGluZQotYXR0ZW1wdHMgd29yZCBjb21wbGV0aW9uLiAgVGhlIGRlZmF1bHQgaXMgQHNhbXB7b2ZmfS4KLQotQGl0ZW0gaG9yaXpvbnRhbC1zY3JvbGwtbW9kZQotQHZpbmRleCBob3Jpem9udGFsLXNjcm9sbC1tb2RlCi1UaGlzIHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gZWl0aGVyIEBzYW1we29ufSBvciBAc2FtcHtvZmZ9LiAgU2V0dGluZyBpdAotdG8gQHNhbXB7b259IG1lYW5zIHRoYXQgdGhlIHRleHQgb2YgdGhlIGxpbmVzIGJlaW5nIGVkaXRlZCB3aWxsIHNjcm9sbAotaG9yaXpvbnRhbGx5IG9uIGEgc2luZ2xlIHNjcmVlbiBsaW5lIHdoZW4gdGhleSBhcmUgbG9uZ2VyIHRoYW4gdGhlIHdpZHRoCi1vZiB0aGUgc2NyZWVuLCBpbnN0ZWFkIG9mIHdyYXBwaW5nIG9udG8gYSBuZXcgc2NyZWVuIGxpbmUuICBCeSBkZWZhdWx0LAotdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gQHNhbXB7b2ZmfS4KLQotQGl0ZW0gaW5wdXQtbWV0YQotQHZpbmRleCBpbnB1dC1tZXRhCi1AdmluZGV4IG1ldGEtZmxhZwotSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCBlbmFibGUgZWlnaHQtYml0IGlucHV0IChpdAotd2lsbCBub3Qgc3RyaXAgdGhlIGVpZ2h0aCBiaXQgZnJvbSB0aGUgY2hhcmFjdGVycyBpdCByZWFkcyksCi1yZWdhcmRsZXNzIG9mIHdoYXQgdGhlIHRlcm1pbmFsIGNsYWltcyBpdCBjYW4gc3VwcG9ydC4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtvZmZ9LiAgVGhlIG5hbWUgQGNvZGV7bWV0YS1mbGFnfSBpcyBhCi1zeW5vbnltIGZvciB0aGlzIHZhcmlhYmxlLgotCi1AaXRlbSBpc2VhcmNoLXRlcm1pbmF0b3JzCi1AdmluZGV4IGlzZWFyY2gtdGVybWluYXRvcnMKLVRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0ZXJtaW5hdGUgYW4gaW5jcmVtZW50YWwgc2VhcmNoIHdpdGhvdXQKLXN1YnNlcXVlbnRseSBleGVjdXRpbmcgdGhlIGNoYXJhY3RlciBhcyBhIGNvbW1hbmQgKEBweHJlZntTZWFyY2hpbmd9KS4KLUlmIHRoaXMgdmFyaWFibGUgaGFzIG5vdCBiZWVuIGdpdmVuIGEgdmFsdWUsIHRoZSBjaGFyYWN0ZXJzIEBrZXl7RVNDfSBhbmQKLUBrZXl7Qy1KfSB3aWxsIHRlcm1pbmF0ZSBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCi0KLUBpdGVtIGtleW1hcAotQHZpbmRleCBrZXltYXAKLVNldHMgUmVhZGxpbmUncyBpZGVhIG9mIHRoZSBjdXJyZW50IGtleW1hcCBmb3Iga2V5IGJpbmRpbmcgY29tbWFuZHMuCi1BY2NlcHRhYmxlIEBjb2Rle2tleW1hcH0gbmFtZXMgYXJlCi1AY29kZXtlbWFjc30sCi1AY29kZXtlbWFjcy1zdGFuZGFyZH0sCi1AY29kZXtlbWFjcy1tZXRhfSwKLUBjb2Rle2VtYWNzLWN0bHh9LAotQGNvZGV7dml9LAotQGNvZGV7dmktY29tbWFuZH0sIGFuZAotQGNvZGV7dmktaW5zZXJ0fS4KLUBjb2Rle3ZpfSBpcyBlcXVpdmFsZW50IHRvIEBjb2Rle3ZpLWNvbW1hbmR9OyBAY29kZXtlbWFjc30gaXMKLWVxdWl2YWxlbnQgdG8gQGNvZGV7ZW1hY3Mtc3RhbmRhcmR9LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7ZW1hY3N9LgotVGhlIHZhbHVlIG9mIHRoZSBAY29kZXtlZGl0aW5nLW1vZGV9IHZhcmlhYmxlIGFsc28gYWZmZWN0cyB0aGUKLWRlZmF1bHQga2V5bWFwLgotCi1AaXRlbSBtYXJrLWRpcmVjdG9yaWVzCi1JZiBzZXQgdG8gQHNhbXB7b259LCBjb21wbGV0ZWQgZGlyZWN0b3J5IG5hbWVzIGhhdmUgYSBzbGFzaAotYXBwZW5kZWQuICBUaGUgZGVmYXVsdCBpcyBAc2FtcHtvbn0uCi0KLUBpdGVtIG1hcmstbW9kaWZpZWQtbGluZXMKLUB2aW5kZXggbWFyay1tb2RpZmllZC1saW5lcwotVGhpcyB2YXJpYWJsZSwgd2hlbiBzZXQgdG8gQHNhbXB7b259LCBjYXVzZXMgUmVhZGxpbmUgdG8gZGlzcGxheSBhbgotYXN0ZXJpc2sgKEBzYW1weyp9KSBhdCB0aGUgc3RhcnQgb2YgaGlzdG9yeSBsaW5lcyB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQuCi1UaGlzIHZhcmlhYmxlIGlzIEBzYW1we29mZn0gYnkgZGVmYXVsdC4KLQotQGl0ZW0gb3V0cHV0LW1ldGEKLUB2aW5kZXggb3V0cHV0LW1ldGEKLUlmIHNldCB0byBAc2FtcHtvbn0sIFJlYWRsaW5lIHdpbGwgZGlzcGxheSBjaGFyYWN0ZXJzIHdpdGggdGhlCi1laWdodGggYml0IHNldCBkaXJlY3RseSByYXRoZXIgdGhhbiBhcyBhIG1ldGEtcHJlZml4ZWQgZXNjYXBlCi1zZXF1ZW5jZS4gIFRoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCi0KLUBpdGVtIHByaW50LWNvbXBsZXRpb25zLWhvcml6b250YWxseQotSWYgc2V0IHRvIEBzYW1we29ufSwgUmVhZGxpbmUgd2lsbCBkaXNwbGF5IGNvbXBsZXRpb25zIHdpdGggbWF0Y2hlcwotc29ydGVkIGhvcml6b250YWxseSBpbiBhbHBoYWJldGljYWwgb3JkZXIsIHJhdGhlciB0aGFuIGRvd24gdGhlIHNjcmVlbi4KLVRoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCi0KLUBpdGVtIHNob3ctYWxsLWlmLWFtYmlndW91cwotQHZpbmRleCBzaG93LWFsbC1pZi1hbWJpZ3VvdXMKLVRoaXMgYWx0ZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9ucy4gIElmCi1zZXQgdG8gQHNhbXB7b259LCAKLXdvcmRzIHdoaWNoIGhhdmUgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGNhdXNlIHRoZQotbWF0Y2hlcyB0byBiZSBsaXN0ZWQgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiByaW5naW5nIHRoZSBiZWxsLgotVGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7b2ZmfS4KLQotQGl0ZW0gdmlzaWJsZS1zdGF0cwotQHZpbmRleCB2aXNpYmxlLXN0YXRzCi1JZiBzZXQgdG8gQHNhbXB7b259LCBhIGNoYXJhY3RlciBkZW5vdGluZyBhIGZpbGUncyB0eXBlCi1pcyBhcHBlbmRlZCB0byB0aGUgZmlsZW5hbWUgd2hlbiBsaXN0aW5nIHBvc3NpYmxlCi1jb21wbGV0aW9ucy4gIFRoZSBkZWZhdWx0IGlzIEBzYW1we29mZn0uCi0KLUBlbmQgdGFibGUKLQotQGl0ZW0gS2V5IEJpbmRpbmdzCi1UaGUgc3ludGF4IGZvciBjb250cm9sbGluZyBrZXkgYmluZGluZ3MgaW4gdGhlIGluaXQgZmlsZSBpcwotc2ltcGxlLiAgRmlyc3QgeW91IGhhdmUgdG8ga25vdyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0aGF0IHlvdQotd2FudCB0byBjaGFuZ2UuICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGNvbnRhaW4gdGFibGVzIG9mIHRoZSBjb21tYW5kCi1uYW1lLCB0aGUgZGVmYXVsdCBrZXliaW5kaW5nLCBpZiBhbnksIGFuZCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHdoYXQKLXRoZSBjb21tYW5kIGRvZXMuCi0KLU9uY2UgeW91IGtub3cgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQsIHNpbXBseSBwbGFjZSB0aGUgbmFtZSBvZiB0aGUga2V5Ci15b3Ugd2lzaCB0byBiaW5kIHRoZSBjb21tYW5kIHRvLCBhIGNvbG9uLCBhbmQgdGhlbiB0aGUgbmFtZSBvZiB0aGUKLWNvbW1hbmQgb24gYSBsaW5lIGluIHRoZSBpbml0IGZpbGUuICBUaGUgbmFtZSBvZiB0aGUga2V5Ci1jYW4gYmUgZXhwcmVzc2VkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggaXMgbW9zdAotY29tZm9ydGFibGUgZm9yIHlvdS4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBAd3tAdmFye2tleW5hbWV9OiBAdmFye2Z1bmN0aW9uLW5hbWV9IG9yIEB2YXJ7bWFjcm99fQotQHZhcntrZXluYW1lfSBpcyB0aGUgbmFtZSBvZiBhIGtleSBzcGVsbGVkIG91dCBpbiBFbmdsaXNoLiAgRm9yIGV4YW1wbGU6Ci1AZXhhbXBsZQotQ29udHJvbC11OiB1bml2ZXJzYWwtYXJndW1lbnQKLU1ldGEtUnVib3V0OiBiYWNrd2FyZC1raWxsLXdvcmQKLUNvbnRyb2wtbzogIj4gb3V0cHV0IgotQGVuZCBleGFtcGxlCi0KLUluIHRoZSBhYm92ZSBleGFtcGxlLCBAa2V5e0MtdX0gaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uCi1AY29kZXt1bml2ZXJzYWwtYXJndW1lbnR9LCBhbmQgQGtleXtDLW99IGlzIGJvdW5kIHRvIHJ1biB0aGUgbWFjcm8KLWV4cHJlc3NlZCBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlICh0aGF0IGlzLCB0byBpbnNlcnQgdGhlIHRleHQKLUBzYW1wez4gb3V0cHV0fSBpbnRvIHRoZSBsaW5lKS4KLQotQGl0ZW0gQHd7IkB2YXJ7a2V5c2VxfSI6IEB2YXJ7ZnVuY3Rpb24tbmFtZX0gb3IgQHZhcnttYWNyb319Ci1AdmFye2tleXNlcX0gZGlmZmVycyBmcm9tIEB2YXJ7a2V5bmFtZX0gYWJvdmUgaW4gdGhhdCBzdHJpbmdzCi1kZW5vdGluZyBhbiBlbnRpcmUga2V5IHNlcXVlbmNlIGNhbiBiZSBzcGVjaWZpZWQsIGJ5IHBsYWNpbmcKLXRoZSBrZXkgc2VxdWVuY2UgaW4gZG91YmxlIHF1b3Rlcy4gIFNvbWUgR05VIEVtYWNzIHN0eWxlIGtleQotZXNjYXBlcyBjYW4gYmUgdXNlZCwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBidXQgdGhlCi1zcGVjaWFsIGNoYXJhY3RlciBuYW1lcyBhcmUgbm90IHJlY29nbml6ZWQuCi0KLUBleGFtcGxlCi0iXEMtdSI6IHVuaXZlcnNhbC1hcmd1bWVudAotIlxDLXhcQy1yIjogcmUtcmVhZC1pbml0LWZpbGUKLSJcZVsxMX4iOiAiRnVuY3Rpb24gS2V5IDEiCi1AZW5kIGV4YW1wbGUKLQotSW4gdGhlIGFib3ZlIGV4YW1wbGUsIEBrZXl7Qy11fSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24KLUBjb2Rle3VuaXZlcnNhbC1hcmd1bWVudH0gKGp1c3QgYXMgaXQgd2FzIGluIHRoZSBmaXJzdCBleGFtcGxlKSwKLUBzYW1we0BrZXl7Qy14fSBAa2V5e0Mtcn19IGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBAY29kZXtyZS1yZWFkLWluaXQtZmlsZX0sCi1hbmQgQHNhbXB7QGtleXtFU0N9IEBrZXl7W30gQGtleXsxfSBAa2V5ezF9IEBrZXl7fn19IGlzIGJvdW5kIHRvIGluc2VydAotdGhlIHRleHQgQHNhbXB7RnVuY3Rpb24gS2V5IDF9LgotCi1AZW5kIHRhYmxlCi0KLVRoZSBmb2xsb3dpbmcgR05VIEVtYWNzIHN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGF2YWlsYWJsZSB3aGVuCi1zcGVjaWZ5aW5nIGtleSBzZXF1ZW5jZXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQGtiZHtcQy19Ci1jb250cm9sIHByZWZpeAotQGl0ZW0gQGtiZHtcTS19Ci1tZXRhIHByZWZpeAotQGl0ZW0gQGtiZHtcZX0KLWFuIGVzY2FwZSBjaGFyYWN0ZXIKLUBpdGVtIEBrYmR7XFx9Ci1iYWNrc2xhc2gKLUBpdGVtIEBrYmR7XCJ9Ci1Aa2V5eyJ9Ci1AaXRlbSBAa2Jke1wnfQotQGtleXsnfQotQGVuZCB0YWJsZQotCi1JbiBhZGRpdGlvbiB0byB0aGUgR05VIEVtYWNzIHN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMsIGEgc2Vjb25kCi1zZXQgb2YgYmFja3NsYXNoIGVzY2FwZXMgaXMgYXZhaWxhYmxlOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFxhCi1hbGVydCAoYmVsbCkKLUBpdGVtIFxiCi1iYWNrc3BhY2UKLUBpdGVtIFxkCi1kZWxldGUKLUBpdGVtIFxmCi1mb3JtIGZlZWQKLUBpdGVtIFxuCi1uZXdsaW5lCi1AaXRlbSBccgotY2FycmlhZ2UgcmV0dXJuCi1AaXRlbSBcdAotaG9yaXpvbnRhbCB0YWIKLUBpdGVtIFx2Ci12ZXJ0aWNhbCB0YWIKLUBpdGVtIFxAdmFye25ubn0KLXRoZSBjaGFyYWN0ZXIgd2hvc2UgQVNDSUkgY29kZSBpcyB0aGUgb2N0YWwgdmFsdWUgQHZhcntubm59Ci0ob25lIHRvIHRocmVlIGRpZ2l0cykKLUBpdGVtIFx4QHZhcntubm59Ci10aGUgY2hhcmFjdGVyIHdob3NlIEFTQ0lJIGNvZGUgaXMgdGhlIGhleGFkZWNpbWFsIHZhbHVlIEB2YXJ7bm5ufQotKG9uZSB0byB0aHJlZSBkaWdpdHMpCi1AZW5kIHRhYmxlCi0KLVdoZW4gZW50ZXJpbmcgdGhlIHRleHQgb2YgYSBtYWNybywgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgbXVzdAotYmUgdXNlZCB0byBpbmRpY2F0ZSBhIG1hY3JvIGRlZmluaXRpb24uCi1VbnF1b3RlZCB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgYSBmdW5jdGlvbiBuYW1lLgotSW4gdGhlIG1hY3JvIGJvZHksIHRoZSBiYWNrc2xhc2ggZXNjYXBlcyBkZXNjcmliZWQgYWJvdmUgYXJlIGV4cGFuZGVkLgotQmFja3NsYXNoIHdpbGwgcXVvdGUgYW55IG90aGVyIGNoYXJhY3RlciBpbiB0aGUgbWFjcm8gdGV4dCwKLWluY2x1ZGluZyBAc2FtcHsifSBhbmQgQHNhbXB7J30uCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBiaW5kaW5nIHdpbGwgbWFrZSBAc2FtcHtDLXggXH0KLWluc2VydCBhIHNpbmdsZSBAc2FtcHtcfSBpbnRvIHRoZSBsaW5lOgotQGV4YW1wbGUKLSJcQy14XFwiOiAiXFwiCi1AZW5kIGV4YW1wbGUKLQotQGVuZCB0YWJsZQotCi1Abm9kZSBDb25kaXRpb25hbCBJbml0IENvbnN0cnVjdHMKLUBzdWJzZWN0aW9uIENvbmRpdGlvbmFsIEluaXQgQ29uc3RydWN0cwotCi1SZWFkbGluZSBpbXBsZW1lbnRzIGEgZmFjaWxpdHkgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIGNvbmRpdGlvbmFsCi1jb21waWxhdGlvbiBmZWF0dXJlcyBvZiB0aGUgQyBwcmVwcm9jZXNzb3Igd2hpY2ggYWxsb3dzIGtleQotYmluZGluZ3MgYW5kIHZhcmlhYmxlIHNldHRpbmdzIHRvIGJlIHBlcmZvcm1lZCBhcyB0aGUgcmVzdWx0Ci1vZiB0ZXN0cy4gIFRoZXJlIGFyZSBmb3VyIHBhcnNlciBkaXJlY3RpdmVzIHVzZWQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gJGlmCi1UaGUgQGNvZGV7JGlmfSBjb25zdHJ1Y3QgYWxsb3dzIGJpbmRpbmdzIHRvIGJlIG1hZGUgYmFzZWQgb24gdGhlCi1lZGl0aW5nIG1vZGUsIHRoZSB0ZXJtaW5hbCBiZWluZyB1c2VkLCBvciB0aGUgYXBwbGljYXRpb24gdXNpbmcKLVJlYWRsaW5lLiAgVGhlIHRleHQgb2YgdGhlIHRlc3QgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lOwotbm8gY2hhcmFjdGVycyBhcmUgcmVxdWlyZWQgdG8gaXNvbGF0ZSBpdC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBtb2RlCi1UaGUgQGNvZGV7bW9kZT19IGZvcm0gb2YgdGhlIEBjb2RleyRpZn0gZGlyZWN0aXZlIGlzIHVzZWQgdG8gdGVzdAotd2hldGhlciBSZWFkbGluZSBpcyBpbiBAY29kZXtlbWFjc30gb3IgQGNvZGV7dml9IG1vZGUuCi1UaGlzIG1heSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBAc2FtcHtzZXQga2V5bWFwfSBjb21tYW5kLCBmb3IgaW5zdGFuY2UsIHRvIHNldCBiaW5kaW5ncyBpbgotdGhlIEBjb2Rle2VtYWNzLXN0YW5kYXJkfSBhbmQgQGNvZGV7ZW1hY3MtY3RseH0ga2V5bWFwcyBvbmx5IGlmCi1SZWFkbGluZSBpcyBzdGFydGluZyBvdXQgaW4gQGNvZGV7ZW1hY3N9IG1vZGUuCi0KLUBpdGVtIHRlcm0KLVRoZSBAY29kZXt0ZXJtPX0gZm9ybSBtYXkgYmUgdXNlZCB0byBpbmNsdWRlIHRlcm1pbmFsLXNwZWNpZmljCi1rZXkgYmluZGluZ3MsIHBlcmhhcHMgdG8gYmluZCB0aGUga2V5IHNlcXVlbmNlcyBvdXRwdXQgYnkgdGhlCi10ZXJtaW5hbCdzIGZ1bmN0aW9uIGtleXMuICBUaGUgd29yZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUKLUBzYW1wez19IGlzIHRlc3RlZCBhZ2FpbnN0IGJvdGggdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGVybWluYWwgYW5kCi10aGUgcG9ydGlvbiBvZiB0aGUgdGVybWluYWwgbmFtZSBiZWZvcmUgdGhlIGZpcnN0IEBzYW1wey19LiAgVGhpcwotYWxsb3dzIEBjb2Rle3N1bn0gdG8gbWF0Y2ggYm90aCBAY29kZXtzdW59IGFuZCBAY29kZXtzdW4tY21kfSwKLWZvciBpbnN0YW5jZS4KLQotQGl0ZW0gYXBwbGljYXRpb24KLVRoZSBAdmFye2FwcGxpY2F0aW9ufSBjb25zdHJ1Y3QgaXMgdXNlZCB0byBpbmNsdWRlCi1hcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXR0aW5ncy4gIEVhY2ggcHJvZ3JhbSB1c2luZyB0aGUgUmVhZGxpbmUKLWxpYnJhcnkgc2V0cyB0aGUgQHZhcnthcHBsaWNhdGlvbiBuYW1lfSwgYW5kIHlvdSBjYW4gdGVzdCBmb3IgaXQuIAotVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGJpbmQga2V5IHNlcXVlbmNlcyB0byBmdW5jdGlvbnMgdXNlZnVsIGZvcgotYSBzcGVjaWZpYyBwcm9ncmFtLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYWRkcyBhCi1rZXkgc2VxdWVuY2UgdGhhdCBxdW90ZXMgdGhlIGN1cnJlbnQgb3IgcHJldmlvdXMgd29yZCBpbiBCYXNoOgotQGV4YW1wbGUKLSRpZiBCYXNoCi0jIFF1b3RlIHRoZSBjdXJyZW50IG9yIHByZXZpb3VzIHdvcmQKLSJcQy14cSI6ICJcZWJcIlxlZlwiIgotJGVuZGlmCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQGl0ZW0gJGVuZGlmCi1UaGlzIGNvbW1hbmQsIGFzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRlcm1pbmF0ZXMgYW4KLUBjb2RleyRpZn0gY29tbWFuZC4KLQotQGl0ZW0gJGVsc2UKLUNvbW1hbmRzIGluIHRoaXMgYnJhbmNoIG9mIHRoZSBAY29kZXskaWZ9IGRpcmVjdGl2ZSBhcmUgZXhlY3V0ZWQgaWYKLXRoZSB0ZXN0IGZhaWxzLgotCi1AaXRlbSAkaW5jbHVkZQotVGhpcyBkaXJlY3RpdmUgdGFrZXMgYSBzaW5nbGUgZmlsZW5hbWUgYXMgYW4gYXJndW1lbnQgYW5kIHJlYWRzIGNvbW1hbmRzCi1hbmQgYmluZGluZ3MgZnJvbSB0aGF0IGZpbGUuCi1AZXhhbXBsZQotJGluY2x1ZGUgL2V0Yy9pbnB1dHJjCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgU2FtcGxlIEluaXQgRmlsZQotQHN1YnNlY3Rpb24gU2FtcGxlIEluaXQgRmlsZQotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW5wdXRyYyBmaWxlLiAgVGhpcyBpbGx1c3RyYXRlcyBrZXkKLWJpbmRpbmcsIHZhcmlhYmxlIGFzc2lnbm1lbnQsIGFuZCBjb25kaXRpb25hbCBzeW50YXguCi0KLUBleGFtcGxlCi1AcGFnZQotIyBUaGlzIGZpbGUgY29udHJvbHMgdGhlIGJlaGF2aW91ciBvZiBsaW5lIGlucHV0IGVkaXRpbmcgZm9yCi0jIHByb2dyYW1zIHRoYXQgdXNlIHRoZSBHbnUgUmVhZGxpbmUgbGlicmFyeS4gIEV4aXN0aW5nIHByb2dyYW1zCi0jIGluY2x1ZGUgRlRQLCBCYXNoLCBhbmQgR2RiLgotIwotIyBZb3UgY2FuIHJlLXJlYWQgdGhlIGlucHV0cmMgZmlsZSB3aXRoIEMteCBDLXIuCi0jIExpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBhcmUgY29tbWVudHMuCi0jCi0jIEZpcnN0LCBpbmNsdWRlIGFueSBzeXN0ZW13aWRlIGJpbmRpbmdzIGFuZCB2YXJpYWJsZSBhc3NpZ25tZW50cyBmcm9tCi0jIC9ldGMvSW5wdXRyYwotJGluY2x1ZGUgL2V0Yy9JbnB1dHJjCi0KLSMKLSMgU2V0IHZhcmlvdXMgYmluZGluZ3MgZm9yIGVtYWNzIG1vZGUuCi0KLXNldCBlZGl0aW5nLW1vZGUgZW1hY3MgCi0KLSRpZiBtb2RlPWVtYWNzCi0KLU1ldGEtQ29udHJvbC1oOgliYWNrd2FyZC1raWxsLXdvcmQJVGV4dCBhZnRlciB0aGUgZnVuY3Rpb24gbmFtZSBpcyBpZ25vcmVkCi0KLSMKLSMgQXJyb3cga2V5cyBpbiBrZXlwYWQgbW9kZQotIwotIyJcTS1PRCI6ICAgICAgICBiYWNrd2FyZC1jaGFyCi0jIlxNLU9DIjogICAgICAgIGZvcndhcmQtY2hhcgotIyJcTS1PQSI6ICAgICAgICBwcmV2aW91cy1oaXN0b3J5Ci0jIlxNLU9CIjogICAgICAgIG5leHQtaGlzdG9yeQotIwotIyBBcnJvdyBrZXlzIGluIEFOU0kgbW9kZQotIwotIlxNLVtEIjogICAgICAgIGJhY2t3YXJkLWNoYXIKLSJcTS1bQyI6ICAgICAgICBmb3J3YXJkLWNoYXIKLSJcTS1bQSI6ICAgICAgICBwcmV2aW91cy1oaXN0b3J5Ci0iXE0tW0IiOiAgICAgICAgbmV4dC1oaXN0b3J5Ci0jCi0jIEFycm93IGtleXMgaW4gOCBiaXQga2V5cGFkIG1vZGUKLSMKLSMiXE0tXEMtT0QiOiAgICAgICBiYWNrd2FyZC1jaGFyCi0jIlxNLVxDLU9DIjogICAgICAgZm9yd2FyZC1jaGFyCi0jIlxNLVxDLU9BIjogICAgICAgcHJldmlvdXMtaGlzdG9yeQotIyJcTS1cQy1PQiI6ICAgICAgIG5leHQtaGlzdG9yeQotIwotIyBBcnJvdyBrZXlzIGluIDggYml0IEFOU0kgbW9kZQotIwotIyJcTS1cQy1bRCI6ICAgICAgIGJhY2t3YXJkLWNoYXIKLSMiXE0tXEMtW0MiOiAgICAgICBmb3J3YXJkLWNoYXIKLSMiXE0tXEMtW0EiOiAgICAgICBwcmV2aW91cy1oaXN0b3J5Ci0jIlxNLVxDLVtCIjogICAgICAgbmV4dC1oaXN0b3J5Ci0KLUMtcTogcXVvdGVkLWluc2VydAotCi0kZW5kaWYKLQotIyBBbiBvbGQtc3R5bGUgYmluZGluZy4gIFRoaXMgaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdC4KLVRBQjogY29tcGxldGUKLQotIyBNYWNyb3MgdGhhdCBhcmUgY29udmVuaWVudCBmb3Igc2hlbGwgaW50ZXJhY3Rpb24KLSRpZiBCYXNoCi0jIGVkaXQgdGhlIHBhdGgKLSJcQy14cCI6ICJQQVRIPSRAe1BBVEhAfVxlXEMtZVxDLWFcZWZcQy1mIgotIyBwcmVwYXJlIHRvIHR5cGUgYSBxdW90ZWQgd29yZCAtLSBpbnNlcnQgb3BlbiBhbmQgY2xvc2UgZG91YmxlIHF1b3RlcwotIyBhbmQgbW92ZSB0byBqdXN0IGFmdGVyIHRoZSBvcGVuIHF1b3RlCi0iXEMteFwiIjogIlwiXCJcQy1iIgotIyBpbnNlcnQgYSBiYWNrc2xhc2ggKHRlc3RpbmcgYmFja3NsYXNoIGVzY2FwZXMgaW4gc2VxdWVuY2VzIGFuZCBtYWNyb3MpCi0iXEMteFxcIjogIlxcIgotIyBRdW90ZSB0aGUgY3VycmVudCBvciBwcmV2aW91cyB3b3JkCi0iXEMteHEiOiAiXGViXCJcZWZcIiIKLSMgQWRkIGEgYmluZGluZyB0byByZWZyZXNoIHRoZSBsaW5lLCB3aGljaCBpcyB1bmJvdW5kCi0iXEMteHIiOiByZWRyYXctY3VycmVudC1saW5lCi0jIEVkaXQgdmFyaWFibGUgb24gY3VycmVudCBsaW5lLgotIlxNLVxDLXYiOiAiXEMtYVxDLWskXEMteVxNLVxDLWVcQy1hXEMteT0iCi0kZW5kaWYKLQotIyB1c2UgYSB2aXNpYmxlIGJlbGwgaWYgb25lIGlzIGF2YWlsYWJsZQotc2V0IGJlbGwtc3R5bGUgdmlzaWJsZQotCi0jIGRvbid0IHN0cmlwIGNoYXJhY3RlcnMgdG8gNyBiaXRzIHdoZW4gcmVhZGluZwotc2V0IGlucHV0LW1ldGEgb24KLQotIyBhbGxvdyBpc28tbGF0aW4xIGNoYXJhY3RlcnMgdG8gYmUgaW5zZXJ0ZWQgcmF0aGVyIHRoYW4gY29udmVydGVkIHRvCi0jIHByZWZpeC1tZXRhIHNlcXVlbmNlcwotc2V0IGNvbnZlcnQtbWV0YSBvZmYKLQotIyBkaXNwbGF5IGNoYXJhY3RlcnMgd2l0aCB0aGUgZWlnaHRoIGJpdCBzZXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4KLSMgYXMgbWV0YS1wcmVmaXhlZCBjaGFyYWN0ZXJzCi1zZXQgb3V0cHV0LW1ldGEgb24KLQotIyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDE1MCBwb3NzaWJsZSBjb21wbGV0aW9ucyBmb3IgYSB3b3JkLCBhc2sgdGhlCi0jIHVzZXIgaWYgaGUgd2FudHMgdG8gc2VlIGFsbCBvZiB0aGVtCi1zZXQgY29tcGxldGlvbi1xdWVyeS1pdGVtcyAxNTAKLQotIyBGb3IgRlRQCi0kaWYgRnRwCi0iXEMteGciOiAiZ2V0IFxNLT8iCi0iXEMteHQiOiAicHV0IFxNLT8iCi0iXE0tLiI6IHlhbmstbGFzdC1hcmcKLSRlbmRpZgotQGVuZCBleGFtcGxlCi0KLUBub2RlIEJpbmRhYmxlIFJlYWRsaW5lIENvbW1hbmRzCi1Ac2VjdGlvbiBCaW5kYWJsZSBSZWFkbGluZSBDb21tYW5kcwotCi1AbWVudQotKiBDb21tYW5kcyBGb3IgTW92aW5nOjoJCU1vdmluZyBhYm91dCB0aGUgbGluZS4KLSogQ29tbWFuZHMgRm9yIEhpc3Rvcnk6OglHZXR0aW5nIGF0IHByZXZpb3VzIGxpbmVzLgotKiBDb21tYW5kcyBGb3IgVGV4dDo6CQlDb21tYW5kcyBmb3IgY2hhbmdpbmcgdGV4dC4KLSogQ29tbWFuZHMgRm9yIEtpbGxpbmc6OglDb21tYW5kcyBmb3Iga2lsbGluZyBhbmQgeWFua2luZy4KLSogTnVtZXJpYyBBcmd1bWVudHM6OgkJU3BlY2lmeWluZyBudW1lcmljIGFyZ3VtZW50cywgcmVwZWF0IGNvdW50cy4KLSogQ29tbWFuZHMgRm9yIENvbXBsZXRpb246OglHZXR0aW5nIFJlYWRsaW5lIHRvIGRvIHRoZSB0eXBpbmcgZm9yIHlvdS4KLSogS2V5Ym9hcmQgTWFjcm9zOjoJCVNhdmluZyBhbmQgcmUtZXhlY3V0aW5nIHR5cGVkIGNoYXJhY3RlcnMKLSogTWlzY2VsbGFuZW91cyBDb21tYW5kczo6CU90aGVyIG1pc2NlbGxhbmVvdXMgY29tbWFuZHMuCi1AZW5kIG1lbnUKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBSZWFkbGluZSBjb21tYW5kcyB0aGF0IG1heSBiZSBib3VuZCB0byBrZXkKLXNlcXVlbmNlcy4KLQotQG5vZGUgQ29tbWFuZHMgRm9yIE1vdmluZwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgRm9yIE1vdmluZwotQGZ0YWJsZSBAY29kZQotQGl0ZW0gYmVnaW5uaW5nLW9mLWxpbmUgKEMtYSkKLU1vdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUuCi0KLUBpdGVtIGVuZC1vZi1saW5lIChDLWUpCi1Nb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0KLUBpdGVtIGZvcndhcmQtY2hhciAoQy1mKQotTW92ZSBmb3J3YXJkIGEgY2hhcmFjdGVyLgotCi1AaXRlbSBiYWNrd2FyZC1jaGFyIChDLWIpCi1Nb3ZlIGJhY2sgYSBjaGFyYWN0ZXIuCi0KLUBpdGVtIGZvcndhcmQtd29yZCAoTS1mKQotTW92ZSBmb3J3YXJkIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZC4gIFdvcmRzIGFyZSBjb21wb3NlZCBvZgotbGV0dGVycyBhbmQgZGlnaXRzLgotCi1AaXRlbSBiYWNrd2FyZC13b3JkIChNLWIpCi1Nb3ZlIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoaXMsIG9yIHRoZSBwcmV2aW91cywgd29yZC4gIFdvcmRzIGFyZQotY29tcG9zZWQgb2YgbGV0dGVycyBhbmQgZGlnaXRzLgotCi1AaXRlbSBjbGVhci1zY3JlZW4gKEMtbCkKLUNsZWFyIHRoZSBzY3JlZW4gYW5kIHJlZHJhdyB0aGUgY3VycmVudCBsaW5lLAotbGVhdmluZyB0aGUgY3VycmVudCBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KLQotQGl0ZW0gcmVkcmF3LWN1cnJlbnQtbGluZSAoKQotUmVmcmVzaCB0aGUgY3VycmVudCBsaW5lLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyB1bmJvdW5kLgotCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBDb21tYW5kcyBGb3IgSGlzdG9yeQotQHN1YnNlY3Rpb24gQ29tbWFuZHMgRm9yIE1hbmlwdWxhdGluZyBUaGUgSGlzdG9yeQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSBhY2NlcHQtbGluZSAoTmV3bGluZSwgUmV0dXJuKQotQGlmc2V0IEJhc2hGZWF0dXJlcwotQWNjZXB0IHRoZSBsaW5lIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGN1cnNvciBpcy4gIElmIHRoaXMgbGluZSBpcwotbm9uLWVtcHR5LCBhZGQgaXQgdG8gdGhlIGhpc3RvcnkgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmcgb2YKLXRoZSBAY29kZXtISVNUQ09OVFJPTH0gYW5kIEBjb2Rle0hJU1RJR05PUkV9IHZhcmlhYmxlcy4KLUlmIHRoaXMgbGluZSB3YXMgYSBoaXN0b3J5IGxpbmUsIHRoZW4gcmVzdG9yZSB0aGUgaGlzdG9yeSBsaW5lIHRvIGl0cwotb3JpZ2luYWwgc3RhdGUuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBCYXNoRmVhdHVyZXMKLUFjY2VwdCB0aGUgbGluZSByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBjdXJzb3IgaXMuICBJZiB0aGlzIGxpbmUgaXMKLW5vbi1lbXB0eSwgYWRkIGl0IHRvIHRoZSBoaXN0b3J5IGxpc3QuICBJZiB0aGlzIGxpbmUgd2FzIGEgaGlzdG9yeQotbGluZSwgdGhlbiByZXN0b3JlIHRoZSBoaXN0b3J5IGxpbmUgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgotQGVuZCBpZmNsZWFyCi0KLUBpdGVtIHByZXZpb3VzLWhpc3RvcnkgKEMtcCkKLU1vdmUgYHVwJyB0aHJvdWdoIHRoZSBoaXN0b3J5IGxpc3QuCi0KLUBpdGVtIG5leHQtaGlzdG9yeSAoQy1uKQotTW92ZSBgZG93bicgdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0LgotCi1AaXRlbSBiZWdpbm5pbmctb2YtaGlzdG9yeSAoTS08KQotTW92ZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgaGlzdG9yeS4KLQotQGl0ZW0gZW5kLW9mLWhpc3RvcnkgKE0tPikKLU1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgaGlzdG9yeSwgaS5lLiwgdGhlIGxpbmUgY3VycmVudGx5Ci1iZWluZyBlbnRlcmVkLgotCi1AaXRlbSByZXZlcnNlLXNlYXJjaC1oaXN0b3J5IChDLXIpCi1TZWFyY2ggYmFja3dhcmQgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgbGluZSBhbmQgbW92aW5nIGB1cCcgdGhyb3VnaAotdGhlIGhpc3RvcnkgYXMgbmVjZXNzYXJ5LiAgVGhpcyBpcyBhbiBpbmNyZW1lbnRhbCBzZWFyY2guCi0KLUBpdGVtIGZvcndhcmQtc2VhcmNoLWhpc3RvcnkgKEMtcykKLVNlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgZG93bicgdGhyb3VnaAotdGhlIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeS4gIFRoaXMgaXMgYW4gaW5jcmVtZW50YWwgc2VhcmNoLgotCi1AaXRlbSBub24taW5jcmVtZW50YWwtcmV2ZXJzZS1zZWFyY2gtaGlzdG9yeSAoTS1wKQotU2VhcmNoIGJhY2t3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgdXAnCi10aHJvdWdoIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeSB1c2luZyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2gKLWZvciBhIHN0cmluZyBzdXBwbGllZCBieSB0aGUgdXNlci4KLQotQGl0ZW0gbm9uLWluY3JlbWVudGFsLWZvcndhcmQtc2VhcmNoLWhpc3RvcnkgKE0tbikKLVNlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIG1vdmluZyBgZG93bicKLXRocm91Z2ggdGhlIHRoZSBoaXN0b3J5IGFzIG5lY2Vzc2FyeSB1c2luZyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2gKLWZvciBhIHN0cmluZyBzdXBwbGllZCBieSB0aGUgdXNlci4KLQotQGl0ZW0gaGlzdG9yeS1zZWFyY2gtZm9yd2FyZCAoKQotU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBmb3IgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi1iZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgY3VycmVudCBjdXJzb3IKLXBvc2l0aW9uICh0aGUgQHZhcntwb2ludH0pLiAgVGhpcyBpcyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2guICBCeQotZGVmYXVsdCwgdGhpcyBjb21tYW5kIGlzIHVuYm91bmQuCi0KLUBpdGVtIGhpc3Rvcnktc2VhcmNoLWJhY2t3YXJkICgpCi1TZWFyY2ggYmFja3dhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBmb3IgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi1iZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgcG9pbnQuICBUaGlzCi1pcyBhIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2guICBCeSBkZWZhdWx0LCB0aGlzIGNvbW1hbmQgaXMgdW5ib3VuZC4KLQotQGl0ZW0geWFuay1udGgtYXJnIChNLUMteSkKLUluc2VydCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQgKHVzdWFsbHkKLXRoZSBzZWNvbmQgd29yZCBvbiB0aGUgcHJldmlvdXMgbGluZSkuICBXaXRoIGFuIGFyZ3VtZW50IEB2YXJ7bn0sCi1pbnNlcnQgdGhlIEB2YXJ7bn10aCB3b3JkIGZyb20gdGhlIHByZXZpb3VzIGNvbW1hbmQgKHRoZSB3b3JkcwotaW4gdGhlIHByZXZpb3VzIGNvbW1hbmQgYmVnaW4gd2l0aCB3b3JkIDApLiAgQSBuZWdhdGl2ZSBhcmd1bWVudAotaW5zZXJ0cyB0aGUgQHZhcntufXRoIHdvcmQgZnJvbSB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBjb21tYW5kLgotCi1AaXRlbSB5YW5rLWxhc3QtYXJnIChNLS4sIE0tXykKLUluc2VydCBsYXN0IGFyZ3VtZW50IHRvIHRoZSBwcmV2aW91cyBjb21tYW5kICh0aGUgbGFzdCB3b3JkIG9mIHRoZQotcHJldmlvdXMgaGlzdG9yeSBlbnRyeSkuICBXaXRoIGFuCi1hcmd1bWVudCwgYmVoYXZlIGV4YWN0bHkgbGlrZSBAY29kZXt5YW5rLW50aC1hcmd9LgotU3VjY2Vzc2l2ZSBjYWxscyB0byBAY29kZXt5YW5rLWxhc3QtYXJnfSBtb3ZlIGJhY2sgdGhyb3VnaCB0aGUgaGlzdG9yeQotbGlzdCwgaW5zZXJ0aW5nIHRoZSBsYXN0IGFyZ3VtZW50IG9mIGVhY2ggbGluZSBpbiB0dXJuLgotCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBDb21tYW5kcyBGb3IgVGV4dAotQHN1YnNlY3Rpb24gQ29tbWFuZHMgRm9yIENoYW5naW5nIFRleHQKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gZGVsZXRlLWNoYXIgKEMtZCkKLURlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IuICBJZiB0aGUgY3Vyc29yIGlzIGF0IHRoZQotYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyBpbiB0aGUgbGluZSwgYW5kCi10aGUgbGFzdCBjaGFyYWN0ZXIgdHlwZWQgd2FzIG5vdCBib3VuZCB0byBAY29kZXtkZWxldGUtY2hhcn0sIHRoZW4KLXJldHVybiBAY29kZXtFT0Z9LgotCi1AaXRlbSBiYWNrd2FyZC1kZWxldGUtY2hhciAoUnVib3V0KQotRGVsZXRlIHRoZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBjdXJzb3IuICBBIG51bWVyaWMgYXJndW1lbnQgbWVhbnMKLXRvIGtpbGwgdGhlIGNoYXJhY3RlcnMgaW5zdGVhZCBvZiBkZWxldGluZyB0aGVtLgotCi1AaXRlbSBmb3J3YXJkLWJhY2t3YXJkLWRlbGV0ZS1jaGFyICgpCi1EZWxldGUgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yLCB1bmxlc3MgdGhlIGN1cnNvciBpcyBhdCB0aGUKLWVuZCBvZiB0aGUgbGluZSwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyIGJlaGluZCB0aGUgY3Vyc29yIGlzCi1kZWxldGVkLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBub3QgYm91bmQgdG8gYSBrZXkuCi0KLUBpdGVtIHF1b3RlZC1pbnNlcnQgKEMtcSwgQy12KQotQWRkIHRoZSBuZXh0IGNoYXJhY3RlciB0eXBlZCB0byB0aGUgbGluZSB2ZXJiYXRpbS4gIFRoaXMgaXMKLWhvdyB0byBpbnNlcnQga2V5IHNlcXVlbmNlcyBsaWtlIEBrZXl7Qy1xfSwgZm9yIGV4YW1wbGUuCi0KLUBpZmNsZWFyIEJhc2hGZWF0dXJlcwotQGl0ZW0gdGFiLWluc2VydCAoTS1UQUIpCi1JbnNlcnQgYSB0YWIgY2hhcmFjdGVyLgotQGVuZCBpZmNsZWFyCi0KLUBpdGVtIHNlbGYtaW5zZXJ0IChhLCBiLCBBLCAxLCAhLCAuLi4pCi1JbnNlcnQgeW91cnNlbGYuCi0KLUBpdGVtIHRyYW5zcG9zZS1jaGFycyAoQy10KQotRHJhZyB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgY3Vyc29yIGZvcndhcmQgb3ZlcgotdGhlIGNoYXJhY3RlciBhdCB0aGUgY3Vyc29yLCBtb3ZpbmcgdGhlCi1jdXJzb3IgZm9yd2FyZCBhcyB3ZWxsLiAgSWYgdGhlIGluc2VydGlvbiBwb2ludAotaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgdGhlbiB0aGlzCi10cmFuc3Bvc2VzIHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lLgotTmVnYXRpdmUgYXJndW1lbnRzIGRvbid0IHdvcmsuCi0KLUBpdGVtIHRyYW5zcG9zZS13b3JkcyAoTS10KQotRHJhZyB0aGUgd29yZCBiZWhpbmQgdGhlIGN1cnNvciBwYXN0IHRoZSB3b3JkIGluIGZyb250IG9mIHRoZSBjdXJzb3IKLW1vdmluZyB0aGUgY3Vyc29yIG92ZXIgdGhhdCB3b3JkIGFzIHdlbGwuCi0KLUBpdGVtIHVwY2FzZS13b3JkIChNLXUpCi1VcHBlcmNhc2UgdGhlIGN1cnJlbnQgKG9yIGZvbGxvd2luZykgd29yZC4gIFdpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCwKLXVwcGVyY2FzZSB0aGUgcHJldmlvdXMgd29yZCwgYnV0IGRvIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCi0KLUBpdGVtIGRvd25jYXNlLXdvcmQgKE0tbCkKLUxvd2VyY2FzZSB0aGUgY3VycmVudCAob3IgZm9sbG93aW5nKSB3b3JkLiAgV2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LAotbG93ZXJjYXNlIHRoZSBwcmV2aW91cyB3b3JkLCBidXQgZG8gbm90IG1vdmUgdGhlIGN1cnNvci4KLQotQGl0ZW0gY2FwaXRhbGl6ZS13b3JkIChNLWMpCi1DYXBpdGFsaXplIHRoZSBjdXJyZW50IChvciBmb2xsb3dpbmcpIHdvcmQuICBXaXRoIGEgbmVnYXRpdmUgYXJndW1lbnQsCi1jYXBpdGFsaXplIHRoZSBwcmV2aW91cyB3b3JkLCBidXQgZG8gbm90IG1vdmUgdGhlIGN1cnNvci4KLQotQGVuZCBmdGFibGUKLQotQG5vZGUgQ29tbWFuZHMgRm9yIEtpbGxpbmcKLUBzdWJzZWN0aW9uIEtpbGxpbmcgQW5kIFlhbmtpbmcKLQotQGZ0YWJsZSBAY29kZQotCi1AaXRlbSBraWxsLWxpbmUgKEMtaykKLUtpbGwgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLQotQGl0ZW0gYmFja3dhcmQta2lsbC1saW5lIChDLXggUnVib3V0KQotS2lsbCBiYWNrd2FyZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotCi1AaXRlbSB1bml4LWxpbmUtZGlzY2FyZCAoQy11KQotS2lsbCBiYWNrd2FyZCBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBsaW5lLgotVGhlIGtpbGxlZCB0ZXh0IGlzIHNhdmVkIG9uIHRoZSBraWxsLXJpbmcuCi0KLUBpdGVtIGtpbGwtd2hvbGUtbGluZSAoKQotS2lsbCBhbGwgY2hhcmFjdGVycyBvbiB0aGUgY3VycmVudCBsaW5lLCBubyBtYXR0ZXIgd2hlcmUgdGhlCi1jdXJzb3IgaXMuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHVuYm91bmQuCi0KLUBpdGVtIGtpbGwtd29yZCAoTS1kKQotS2lsbCBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB3b3JkLCBvciBpZiBiZXR3ZWVuCi13b3JkcywgdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCB3b3JkLiAgV29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZQotYXMgQGNvZGV7Zm9yd2FyZC13b3JkfS4KLQotQGl0ZW0gYmFja3dhcmQta2lsbC13b3JkIChNLURFTCkKLUtpbGwgdGhlIHdvcmQgYmVoaW5kIHRoZSBjdXJzb3IuICBXb3JkIGJvdW5kYXJpZXMgYXJlIHRoZSBzYW1lCi1hcyBAY29kZXtiYWNrd2FyZC13b3JkfS4KLQotQGl0ZW0gdW5peC13b3JkLXJ1Ym91dCAoQy13KQotS2lsbCB0aGUgd29yZCBiZWhpbmQgdGhlIGN1cnNvciwgdXNpbmcgd2hpdGUgc3BhY2UgYXMgYSB3b3JkCi1ib3VuZGFyeS4gIFRoZSBraWxsZWQgdGV4dCBpcyBzYXZlZCBvbiB0aGUga2lsbC1yaW5nLgotCi1AaXRlbSBkZWxldGUtaG9yaXpvbnRhbC1zcGFjZSAoKQotRGVsZXRlIGFsbCBzcGFjZXMgYW5kIHRhYnMgYXJvdW5kIHBvaW50LiAgQnkgZGVmYXVsdCwgdGhpcyBpcyB1bmJvdW5kLgotCi1AaXRlbSBraWxsLXJlZ2lvbiAoKQotS2lsbCB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIEBlbXBoe21hcmt9IChzYXZlZAotY3Vyc29yIHBvc2l0aW9uKS4gIFRoaXMgdGV4dCBpcyByZWZlcnJlZCB0byBhcyB0aGUgQHZhcntyZWdpb259LgotQnkgZGVmYXVsdCwgdGhpcyBjb21tYW5kIGlzIHVuYm91bmQuCi0KLUBpdGVtIGNvcHktcmVnaW9uLWFzLWtpbGwgKCkKLUNvcHkgdGhlIHRleHQgaW4gdGhlIHJlZ2lvbiB0byB0aGUga2lsbCBidWZmZXIsIHNvIGl0IGNhbiBiZSB5YW5rZWQKLXJpZ2h0IGF3YXkuICBCeSBkZWZhdWx0LCB0aGlzIGNvbW1hbmQgaXMgdW5ib3VuZC4KLQotQGl0ZW0gY29weS1iYWNrd2FyZC13b3JkICgpCi1Db3B5IHRoZSB3b3JkIGJlZm9yZSBwb2ludCB0byB0aGUga2lsbCBidWZmZXIuCi1UaGUgd29yZCBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBhcyBAY29kZXtiYWNrd2FyZC13b3JkfS4KLUJ5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgotCi1AaXRlbSBjb3B5LWZvcndhcmQtd29yZCAoKQotQ29weSB0aGUgd29yZCBmb2xsb3dpbmcgcG9pbnQgdG8gdGhlIGtpbGwgYnVmZmVyLgotVGhlIHdvcmQgYm91bmRhcmllcyBhcmUgdGhlIHNhbWUgYXMgQGNvZGV7Zm9yd2FyZC13b3JkfS4KLUJ5IGRlZmF1bHQsIHRoaXMgY29tbWFuZCBpcyB1bmJvdW5kLgotCi1AaXRlbSB5YW5rIChDLXkpCi1ZYW5rIHRoZSB0b3Agb2YgdGhlIGtpbGwgcmluZyBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIGN1cnJlbnQKLWN1cnNvciBwb3NpdGlvbi4KLQotQGl0ZW0geWFuay1wb3AgKE0teSkKLVJvdGF0ZSB0aGUga2lsbC1yaW5nLCBhbmQgeWFuayB0aGUgbmV3IHRvcC4gIFlvdSBjYW4gb25seSBkbyB0aGlzIGlmCi10aGUgcHJpb3IgY29tbWFuZCBpcyB5YW5rIG9yIHlhbmstcG9wLgotQGVuZCBmdGFibGUKLQotQG5vZGUgTnVtZXJpYyBBcmd1bWVudHMKLUBzdWJzZWN0aW9uIFNwZWNpZnlpbmcgTnVtZXJpYyBBcmd1bWVudHMKLUBmdGFibGUgQGNvZGUKLQotQGl0ZW0gZGlnaXQtYXJndW1lbnQgKE0tMCwgTS0xLCAuLi4gTS0tKQotQWRkIHRoaXMgZGlnaXQgdG8gdGhlIGFyZ3VtZW50IGFscmVhZHkgYWNjdW11bGF0aW5nLCBvciBzdGFydCBhIG5ldwotYXJndW1lbnQuICBAa2V5e00tLX0gc3RhcnRzIGEgbmVnYXRpdmUgYXJndW1lbnQuCi0KLUBpdGVtIHVuaXZlcnNhbC1hcmd1bWVudCAoKQotVGhpcyBpcyBhbm90aGVyIHdheSB0byBzcGVjaWZ5IGFuIGFyZ3VtZW50LgotSWYgdGhpcyBjb21tYW5kIGlzIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRpZ2l0cywgb3B0aW9uYWxseSB3aXRoIGEKLWxlYWRpbmcgbWludXMgc2lnbiwgdGhvc2UgZGlnaXRzIGRlZmluZSB0aGUgYXJndW1lbnQuCi1JZiB0aGUgY29tbWFuZCBpcyBmb2xsb3dlZCBieSBkaWdpdHMsIGV4ZWN1dGluZyBAY29kZXt1bml2ZXJzYWwtYXJndW1lbnR9Ci1hZ2FpbiBlbmRzIHRoZSBudW1lcmljIGFyZ3VtZW50LCBidXQgaXMgb3RoZXJ3aXNlIGlnbm9yZWQuCi1BcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhpcyBjb21tYW5kIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEKLWNoYXJhY3RlciB0aGF0IGlzIG5laXRoZXIgYSBkaWdpdCBvciBtaW51cyBzaWduLCB0aGUgYXJndW1lbnQgY291bnQKLWZvciB0aGUgbmV4dCBjb21tYW5kIGlzIG11bHRpcGxpZWQgYnkgZm91ci4KLVRoZSBhcmd1bWVudCBjb3VudCBpcyBpbml0aWFsbHkgb25lLCBzbyBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbiB0aGUKLWZpcnN0IHRpbWUgbWFrZXMgdGhlIGFyZ3VtZW50IGNvdW50IGZvdXIsIGEgc2Vjb25kIHRpbWUgbWFrZXMgdGhlCi1hcmd1bWVudCBjb3VudCBzaXh0ZWVuLCBhbmQgc28gb24uCi1CeSBkZWZhdWx0LCB0aGlzIGlzIG5vdCBib3VuZCB0byBhIGtleS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIENvbW1hbmRzIEZvciBDb21wbGV0aW9uCi1Ac3Vic2VjdGlvbiBMZXR0aW5nIFJlYWRsaW5lIFR5cGUgRm9yIFlvdQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSBjb21wbGV0ZSAoVEFCKQotQXR0ZW1wdCB0byBkbyBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSB0aGUgY3Vyc29yLiAgVGhpcyBpcwotYXBwbGljYXRpb24tc3BlY2lmaWMuICBHZW5lcmFsbHksIGlmIHlvdSBhcmUgdHlwaW5nIGEgZmlsZW5hbWUKLWFyZ3VtZW50LCB5b3UgY2FuIGRvIGZpbGVuYW1lIGNvbXBsZXRpb247IGlmIHlvdSBhcmUgdHlwaW5nIGEgY29tbWFuZCwKLXlvdSBjYW4gZG8gY29tbWFuZCBjb21wbGV0aW9uOyBpZiB5b3UgYXJlIHR5cGluZyBpbiBhIHN5bWJvbCB0byBHREIsIHlvdQotY2FuIGRvIHN5bWJvbCBuYW1lIGNvbXBsZXRpb247IGlmIHlvdSBhcmUgdHlwaW5nIGluIGEgdmFyaWFibGUgdG8gQmFzaCwKLXlvdSBjYW4gZG8gdmFyaWFibGUgbmFtZSBjb21wbGV0aW9uLCBhbmQgc28gb24uCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1CYXNoIGF0dGVtcHRzIGNvbXBsZXRpb24gdHJlYXRpbmcgdGhlIHRleHQgYXMgYSB2YXJpYWJsZSAoaWYgdGhlCi10ZXh0IGJlZ2lucyB3aXRoIEBzYW1weyR9KSwgdXNlcm5hbWUgKGlmIHRoZSB0ZXh0IGJlZ2lucyB3aXRoCi1Ac2FtcHt+fSksIGhvc3RuYW1lIChpZiB0aGUgdGV4dCBiZWdpbnMgd2l0aCBAc2FtcHtAQH0pLCBvcgotY29tbWFuZCAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGZ1bmN0aW9ucykgaW4gdHVybi4gIElmIG5vbmUgCi1vZiB0aGVzZSBwcm9kdWNlcyBhIG1hdGNoLCBmaWxlbmFtZSBjb21wbGV0aW9uIGlzIGF0dGVtcHRlZC4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gcG9zc2libGUtY29tcGxldGlvbnMgKE0tPykKLUxpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIG9mIHRoZSB0ZXh0IGJlZm9yZSB0aGUgY3Vyc29yLgotCi1AaXRlbSBpbnNlcnQtY29tcGxldGlvbnMgKE0tKikKLUluc2VydCBhbGwgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50IHRoYXQgd291bGQgaGF2ZQotYmVlbiBnZW5lcmF0ZWQgYnkgQGNvZGV7cG9zc2libGUtY29tcGxldGlvbnN9LgotCi1AaXRlbSBtZW51LWNvbXBsZXRlICgpCi1TaW1pbGFyIHRvIEBjb2Rle2NvbXBsZXRlfSwgYnV0IHJlcGxhY2VzIHRoZSB3b3JkIHRvIGJlIGNvbXBsZXRlZAotd2l0aCBhIHNpbmdsZSBtYXRjaCBmcm9tIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotUmVwZWF0ZWQgZXhlY3V0aW9uIG9mIEBjb2Rle21lbnUtY29tcGxldGV9IHN0ZXBzIHRocm91Z2ggdGhlIGxpc3QKLW9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLCBpbnNlcnRpbmcgZWFjaCBtYXRjaCBpbiB0dXJuLgotQXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBjb21wbGV0aW9ucywgdGhlIGJlbGwgaXMgcnVuZyBhbmQgdGhlCi1vcmlnaW5hbCB0ZXh0IGlzIHJlc3RvcmVkLgotQW4gYXJndW1lbnQgb2YgQHZhcntufSBtb3ZlcyBAdmFye259IHBvc2l0aW9ucyBmb3J3YXJkIGluIHRoZSBsaXN0Ci1vZiBtYXRjaGVzOyBhIG5lZ2F0aXZlIGFyZ3VtZW50IG1heSBiZSB1c2VkIHRvIG1vdmUgYmFja3dhcmQKLXRocm91Z2ggdGhlIGxpc3QuCi1UaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgdG8gYmUgYm91bmQgdG8gQGNvZGV7VEFCfSwgYnV0IGlzIHVuYm91bmQKLWJ5IGRlZmF1bHQuCi0KLUBpdGVtIGRlbGV0ZS1jaGFyLW9yLWxpc3QgKCkKLURlbGV0ZXMgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yIGlmIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9yCi1lbmQgb2YgdGhlIGxpbmUgKGxpa2UgQGNvZGV7ZGVsZXRlLWNoYXJ9KS4KLUlmIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8KLUBjb2Rle3Bvc3NpYmxlLWNvbXBsZXRpb25zfS4KLVRoaXMgY29tbWFuZCBpcyB1bmJvdW5kIGJ5IGRlZmF1bHQuCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUBpdGVtIGNvbXBsZXRlLWZpbGVuYW1lIChNLS8pCi1BdHRlbXB0IGZpbGVuYW1lIGNvbXBsZXRpb24gb24gdGhlIHRleHQgYmVmb3JlIHBvaW50LgotCi1AaXRlbSBwb3NzaWJsZS1maWxlbmFtZS1jb21wbGV0aW9ucyAoQy14IC8pCi1MaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBvZiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsCi10cmVhdGluZyBpdCBhcyBhIGZpbGVuYW1lLgotCi1AaXRlbSBjb21wbGV0ZS11c2VybmFtZSAoTS1+KQotQXR0ZW1wdCBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwgdHJlYXRpbmcKLWl0IGFzIGEgdXNlcm5hbWUuCi0KLUBpdGVtIHBvc3NpYmxlLXVzZXJuYW1lLWNvbXBsZXRpb25zIChDLXggfikKLUxpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIG9mIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwKLXRyZWF0aW5nIGl0IGFzIGEgdXNlcm5hbWUuCi0KLUBpdGVtIGNvbXBsZXRlLXZhcmlhYmxlIChNLSQpCi1BdHRlbXB0IGNvbXBsZXRpb24gb24gdGhlIHRleHQgYmVmb3JlIHBvaW50LCB0cmVhdGluZwotaXQgYXMgYSBzaGVsbCB2YXJpYWJsZS4KLQotQGl0ZW0gcG9zc2libGUtdmFyaWFibGUtY29tcGxldGlvbnMgKEMteCAkKQotTGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgb2YgdGhlIHRleHQgYmVmb3JlIHBvaW50LAotdHJlYXRpbmcgaXQgYXMgYSBzaGVsbCB2YXJpYWJsZS4KLQotQGl0ZW0gY29tcGxldGUtaG9zdG5hbWUgKE0tQEApCi1BdHRlbXB0IGNvbXBsZXRpb24gb24gdGhlIHRleHQgYmVmb3JlIHBvaW50LCB0cmVhdGluZwotaXQgYXMgYSBob3N0bmFtZS4KLQotQGl0ZW0gcG9zc2libGUtaG9zdG5hbWUtY29tcGxldGlvbnMgKEMteCBAQCkKLUxpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIG9mIHRoZSB0ZXh0IGJlZm9yZSBwb2ludCwKLXRyZWF0aW5nIGl0IGFzIGEgaG9zdG5hbWUuCi0KLUBpdGVtIGNvbXBsZXRlLWNvbW1hbmQgKE0tISkKLUF0dGVtcHQgY29tcGxldGlvbiBvbiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsIHRyZWF0aW5nCi1pdCBhcyBhIGNvbW1hbmQgbmFtZS4gIENvbW1hbmQgY29tcGxldGlvbiBhdHRlbXB0cyB0bwotbWF0Y2ggdGhlIHRleHQgYWdhaW5zdCBhbGlhc2VzLCByZXNlcnZlZCB3b3Jkcywgc2hlbGwKLWZ1bmN0aW9ucywgc2hlbGwgYnVpbHRpbnMsIGFuZCBmaW5hbGx5IGV4ZWN1dGFibGUgZmlsZW5hbWVzLAotaW4gdGhhdCBvcmRlci4KLQotQGl0ZW0gcG9zc2libGUtY29tbWFuZC1jb21wbGV0aW9ucyAoQy14ICEpCi1MaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBvZiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsCi10cmVhdGluZyBpdCBhcyBhIGNvbW1hbmQgbmFtZS4KLQotQGl0ZW0gZHluYW1pYy1jb21wbGV0ZS1oaXN0b3J5IChNLVRBQikKLUF0dGVtcHQgY29tcGxldGlvbiBvbiB0aGUgdGV4dCBiZWZvcmUgcG9pbnQsIGNvbXBhcmluZwotdGhlIHRleHQgYWdhaW5zdCBsaW5lcyBmcm9tIHRoZSBoaXN0b3J5IGxpc3QgZm9yIHBvc3NpYmxlCi1jb21wbGV0aW9uIG1hdGNoZXMuCi0KLUBpdGVtIGNvbXBsZXRlLWludG8tYnJhY2VzIChNLUB7KQotUGVyZm9ybSBmaWxlbmFtZSBjb21wbGV0aW9uIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgcG9zc2libGUgY29tcGxldGlvbnMKLWVuY2xvc2VkIHdpdGhpbiBicmFjZXMgc28gdGhlIGxpc3QgaXMgYXZhaWxhYmxlIHRvIHRoZSBzaGVsbAotKEBweHJlZntCcmFjZSBFeHBhbnNpb259KS4KLQotQGVuZCBpZnNldAotQGVuZCBmdGFibGUKLQotQG5vZGUgS2V5Ym9hcmQgTWFjcm9zCi1Ac3Vic2VjdGlvbiBLZXlib2FyZCBNYWNyb3MKLUBmdGFibGUgQGNvZGUKLQotQGl0ZW0gc3RhcnQta2JkLW1hY3JvIChDLXggKCkKLUJlZ2luIHNhdmluZyB0aGUgY2hhcmFjdGVycyB0eXBlZCBpbnRvIHRoZSBjdXJyZW50IGtleWJvYXJkIG1hY3JvLgotCi1AaXRlbSBlbmQta2JkLW1hY3JvIChDLXggKSkKLVN0b3Agc2F2aW5nIHRoZSBjaGFyYWN0ZXJzIHR5cGVkIGludG8gdGhlIGN1cnJlbnQga2V5Ym9hcmQgbWFjcm8KLWFuZCBzYXZlIHRoZSBkZWZpbml0aW9uLgotCi1AaXRlbSBjYWxsLWxhc3Qta2JkLW1hY3JvIChDLXggZSkKLVJlLWV4ZWN1dGUgdGhlIGxhc3Qga2V5Ym9hcmQgbWFjcm8gZGVmaW5lZCwgYnkgbWFraW5nIHRoZSBjaGFyYWN0ZXJzCi1pbiB0aGUgbWFjcm8gYXBwZWFyIGFzIGlmIHR5cGVkIGF0IHRoZSBrZXlib2FyZC4KLQotQGVuZCBmdGFibGUKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBDb21tYW5kcwotQHN1YnNlY3Rpb24gU29tZSBNaXNjZWxsYW5lb3VzIENvbW1hbmRzCi1AZnRhYmxlIEBjb2RlCi0KLUBpdGVtIHJlLXJlYWQtaW5pdC1maWxlIChDLXggQy1yKQotUmVhZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0cmMgZmlsZSwgYW5kIGluY29ycG9yYXRlCi1hbnkgYmluZGluZ3Mgb3IgdmFyaWFibGUgYXNzaWdubWVudHMgZm91bmQgdGhlcmUuCi0KLUBpdGVtIGFib3J0IChDLWcpCi1BYm9ydCB0aGUgY3VycmVudCBlZGl0aW5nIGNvbW1hbmQgYW5kCi1yaW5nIHRoZSB0ZXJtaW5hbCdzIGJlbGwgKHN1YmplY3QgdG8gdGhlIHNldHRpbmcgb2YKLUBjb2Rle2JlbGwtc3R5bGV9KS4KLQotQGl0ZW0gZG8tdXBwZXJjYXNlLXZlcnNpb24gKE0tYSwgTS1iLCBNLUB2YXJ7eH0sIEBkb3Rze30pCi1JZiB0aGUgbWV0YWZpZWQgY2hhcmFjdGVyIEB2YXJ7eH0gaXMgbG93ZXJjYXNlLCBydW4gdGhlIGNvbW1hbmQKLXRoYXQgaXMgYm91bmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXBwZXJjYXNlIGNoYXJhY3Rlci4KLQotQGl0ZW0gcHJlZml4LW1ldGEgKEVTQykKLU1ha2UgdGhlIG5leHQgY2hhcmFjdGVyIHR5cGVkIGJlIG1ldGFmaWVkLiAgVGhpcyBpcyBmb3Iga2V5Ym9hcmRzCi13aXRob3V0IGEgbWV0YSBrZXkuICBUeXBpbmcgQHNhbXB7RVNDIGZ9IGlzIGVxdWl2YWxlbnQgdG8gdHlwaW5nCi1Ac2FtcHtNLWZ9LgotCi1AaXRlbSB1bmRvIChDLV8sIEMteCBDLXUpCi1JbmNyZW1lbnRhbCB1bmRvLCBzZXBhcmF0ZWx5IHJlbWVtYmVyZWQgZm9yIGVhY2ggbGluZS4KLQotQGl0ZW0gcmV2ZXJ0LWxpbmUgKE0tcikKLVVuZG8gYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIGxpbmUuICBUaGlzIGlzIGxpa2UgZXhlY3V0aW5nIHRoZSBAY29kZXt1bmRvfQotY29tbWFuZCBlbm91Z2ggdGltZXMgdG8gZ2V0IGJhY2sgdG8gdGhlIGJlZ2lubmluZy4KLQotQGlmc2V0IEJhc2hGZWF0dXJlcwotQGl0ZW0gdGlsZGUtZXhwYW5kIChNLSYpCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBCYXNoRmVhdHVyZXMKLUBpdGVtIHRpbGRlLWV4cGFuZCAoTS1+KQotQGVuZCBpZmNsZWFyCi1QZXJmb3JtIHRpbGRlIGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCB3b3JkLgotCi1AaXRlbSBzZXQtbWFyayAoQy1AQCkKLVNldCB0aGUgbWFyayB0byB0aGUgY3VycmVudCBwb2ludC4gIElmIGEKLW51bWVyaWMgYXJndW1lbnQgaXMgc3VwcGxpZWQsIHRoZSBtYXJrIGlzIHNldCB0byB0aGF0IHBvc2l0aW9uLgotCi1AaXRlbSBleGNoYW5nZS1wb2ludC1hbmQtbWFyayAoQy14IEMteCkKLVN3YXAgdGhlIHBvaW50IHdpdGggdGhlIG1hcmsuICBUaGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgc2V0IHRvCi10aGUgc2F2ZWQgcG9zaXRpb24sIGFuZCB0aGUgb2xkIGN1cnNvciBwb3NpdGlvbiBpcyBzYXZlZCBhcyB0aGUgbWFyay4KLQotQGl0ZW0gY2hhcmFjdGVyLXNlYXJjaCAoQy1dKQotQSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgcG9pbnQgaXMgbW92ZWQgdG8gdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGF0Ci1jaGFyYWN0ZXIuICBBIG5lZ2F0aXZlIGNvdW50IHNlYXJjaGVzIGZvciBwcmV2aW91cyBvY2N1cnJlbmNlcy4KLQotQGl0ZW0gY2hhcmFjdGVyLXNlYXJjaC1iYWNrd2FyZCAoTS1DLV0pCi1BIGNoYXJhY3RlciBpcyByZWFkIGFuZCBwb2ludCBpcyBtb3ZlZCB0byB0aGUgcHJldmlvdXMgb2NjdXJyZW5jZQotb2YgdGhhdCBjaGFyYWN0ZXIuICBBIG5lZ2F0aXZlIGNvdW50IHNlYXJjaGVzIGZvciBzdWJzZXF1ZW50Ci1vY2N1cnJlbmNlcy4KLQotQGl0ZW0gaW5zZXJ0LWNvbW1lbnQgKE0tIykKLVRoZSB2YWx1ZSBvZiB0aGUgQGNvZGV7Y29tbWVudC1iZWdpbn0KLXZhcmlhYmxlIGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgbGluZSwKLWFuZCB0aGUgbGluZSBpcyBhY2NlcHRlZCBhcyBpZiBhIG5ld2xpbmUgaGFkIGJlZW4gdHlwZWQuCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1UaGlzIG1ha2VzIHRoZSBjdXJyZW50IGxpbmUgYSBzaGVsbCBjb21tZW50LgotQGVuZCBpZnNldAotCi1AaXRlbSBkdW1wLWZ1bmN0aW9ucyAoKQotUHJpbnQgYWxsIG9mIHRoZSBmdW5jdGlvbnMgYW5kIHRoZWlyIGtleSBiaW5kaW5ncyB0byB0aGUKLVJlYWRsaW5lIG91dHB1dCBzdHJlYW0uICBJZiBhIG51bWVyaWMgYXJndW1lbnQgaXMgc3VwcGxpZWQsCi10aGUgb3V0cHV0IGlzIGZvcm1hdHRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuIGJlIG1hZGUgcGFydAotb2YgYW4gQHZhcntpbnB1dHJjfSBmaWxlLiAgVGhpcyBjb21tYW5kIGlzIHVuYm91bmQgYnkgZGVmYXVsdC4KLQotQGl0ZW0gZHVtcC12YXJpYWJsZXMgKCkKLVByaW50IGFsbCBvZiB0aGUgc2V0dGFibGUgdmFyaWFibGVzIGFuZCB0aGVpciB2YWx1ZXMgdG8gdGhlCi1SZWFkbGluZSBvdXRwdXQgc3RyZWFtLiAgSWYgYSBudW1lcmljIGFyZ3VtZW50IGlzIHN1cHBsaWVkLAotdGhlIG91dHB1dCBpcyBmb3JtYXR0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBtYWRlIHBhcnQKLW9mIGFuIEB2YXJ7aW5wdXRyY30gZmlsZS4gIFRoaXMgY29tbWFuZCBpcyB1bmJvdW5kIGJ5IGRlZmF1bHQuCi0KLUBpdGVtIGR1bXAtbWFjcm9zICgpCi1QcmludCBhbGwgb2YgdGhlIFJlYWRsaW5lIGtleSBzZXF1ZW5jZXMgYm91bmQgdG8gbWFjcm9zIGFuZCB0aGUKLXN0cmluZ3MgdGhleSBvdXB1dC4gIElmIGEgbnVtZXJpYyBhcmd1bWVudCBpcyBzdXBwbGllZCwKLXRoZSBvdXRwdXQgaXMgZm9ybWF0dGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgbWFkZSBwYXJ0Ci1vZiBhbiBAdmFye2lucHV0cmN9IGZpbGUuICBUaGlzIGNvbW1hbmQgaXMgdW5ib3VuZCBieSBkZWZhdWx0LgotCi1AaWZzZXQgQmFzaEZlYXR1cmVzCi1AaXRlbSBnbG9iLWV4cGFuZC13b3JkIChDLXggKikKLVRoZSB3b3JkIGJlZm9yZSBwb2ludCBpcyB0cmVhdGVkIGFzIGEgcGF0dGVybiBmb3IgcGF0aG5hbWUgZXhwYW5zaW9uLAotYW5kIHRoZSBsaXN0IG9mIG1hdGNoaW5nIGZpbGUgbmFtZXMgaXMgaW5zZXJ0ZWQsIHJlcGxhY2luZyB0aGUgd29yZC4KLQotQGl0ZW0gZ2xvYi1saXN0LWV4cGFuc2lvbnMgKEMteCBnKQotVGhlIGxpc3Qgb2YgZXhwYW5zaW9ucyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkKLUBjb2Rle2dsb2ItZXhwYW5kLXdvcmR9IGlzIGRpc3BsYXllZCwgYW5kIHRoZSBsaW5lIGlzIHJlZHJhd24uCi0KLUBpdGVtIGRpc3BsYXktc2hlbGwtdmVyc2lvbiAoQy14IEMtdikKLURpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiBCYXNoLgotCi1AaXRlbSBzaGVsbC1leHBhbmQtbGluZSAoTS1DLWUpCi1FeHBhbmQgdGhlIGxpbmUgYXMgdGhlIHNoZWxsIGRvZXMuCi1UaGlzIHBlcmZvcm1zIGFsaWFzIGFuZCBoaXN0b3J5IGV4cGFuc2lvbiBhcyB3ZWxsIGFzIGFsbCBvZiB0aGUgc2hlbGwKLXdvcmQgZXhwYW5zaW9ucyAoQHB4cmVme1NoZWxsIEV4cGFuc2lvbnN9KS4KLQotQGl0ZW0gaGlzdG9yeS1leHBhbmQtbGluZSAoTS1eKQotUGVyZm9ybSBoaXN0b3J5IGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lLgotCi1AaXRlbSBtYWdpYy1zcGFjZSAoKQotUGVyZm9ybSBoaXN0b3J5IGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lIGFuZCBpbnNlcnQgYSBzcGFjZQotKEBweHJlZntIaXN0b3J5IEludGVyYWN0aW9ufSkuCi0KLUBpdGVtIGFsaWFzLWV4cGFuZC1saW5lICgpCi1QZXJmb3JtIGFsaWFzIGV4cGFuc2lvbiBvbiB0aGUgY3VycmVudCBsaW5lIChAcHhyZWZ7QWxpYXNlc30pLgotCi1AaXRlbSBoaXN0b3J5LWFuZC1hbGlhcy1leHBhbmQtbGluZSAoKQotUGVyZm9ybSBoaXN0b3J5IGFuZCBhbGlhcyBleHBhbnNpb24gb24gdGhlIGN1cnJlbnQgbGluZS4KLQotQGl0ZW0gaW5zZXJ0LWxhc3QtYXJndW1lbnQgKE0tLiwgTS1fKQotQSBzeW5vbnltIGZvciBAY29kZXt5YW5rLWxhc3QtYXJnfS4KLQotQGl0ZW0gb3BlcmF0ZS1hbmQtZ2V0LW5leHQgKEMtbykKLUFjY2VwdCB0aGUgY3VycmVudCBsaW5lIGZvciBleGVjdXRpb24gYW5kIGZldGNoIHRoZSBuZXh0IGxpbmUKLXJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGxpbmUgZnJvbSB0aGUgaGlzdG9yeSBmb3IgZWRpdGluZy4gIEFueQotYXJndW1lbnQgaXMgaWdub3JlZC4KLQotQGl0ZW0gZW1hY3MtZWRpdGluZy1tb2RlIChDLWUpCi1XaGVuIGluIEBjb2Rle3ZpfSBlZGl0aW5nIG1vZGUsIHRoaXMgY2F1c2VzIGEgc3dpdGNoIGJhY2sgdG8KLUBjb2Rle2VtYWNzfSBlZGl0aW5nIG1vZGUsIGFzIGlmIHRoZSBjb21tYW5kIEBzYW1we3NldCAtbyBlbWFjc30gaGFkCi1iZWVuIGV4ZWN1dGVkLgotCi1AZW5kIGlmc2V0Ci0KLUBlbmQgZnRhYmxlCi0KLUBub2RlIFJlYWRsaW5lIHZpIE1vZGUKLUBzZWN0aW9uIFJlYWRsaW5lIHZpIE1vZGUKLQotV2hpbGUgdGhlIFJlYWRsaW5lIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSBhIGZ1bGwgc2V0IG9mIEBjb2Rle3ZpfQotZWRpdGluZyBmdW5jdGlvbnMsIGl0IGRvZXMgY29udGFpbiBlbm91Z2ggdG8gYWxsb3cgc2ltcGxlIGVkaXRpbmcKLW9mIHRoZSBsaW5lLiAgVGhlIFJlYWRsaW5lIEBjb2Rle3ZpfSBtb2RlIGJlaGF2ZXMgYXMgc3BlY2lmaWVkIGluCi10aGUgQHNje1BPU0lYfSAxMDAzLjIgc3RhbmRhcmQuCi0KLUBpZnNldCBCYXNoRmVhdHVyZXMKLUluIG9yZGVyIHRvIHN3aXRjaCBpbnRlcmFjdGl2ZWx5IGJldHdlZW4gQGNvZGV7ZW1hY3N9IGFuZCBAY29kZXt2aX0KLWVkaXRpbmcgbW9kZXMsIHVzZSB0aGUgQHNhbXB7c2V0IC1vIGVtYWNzfSBhbmQgQHNhbXB7c2V0IC1vIHZpfQotY29tbWFuZHMgKEBweHJlZntUaGUgU2V0IEJ1aWx0aW59KS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJhc2hGZWF0dXJlcwotSW4gb3JkZXIgdG8gc3dpdGNoIGludGVyYWN0aXZlbHkgYmV0d2VlbiBAY29kZXtlbWFjc30gYW5kIEBjb2Rle3ZpfQotZWRpdGluZyBtb2RlcywgdXNlIHRoZSBjb21tYW5kIE0tQy1qICh0b2dnbGUtZWRpdGluZy1tb2RlKS4KLUBlbmQgaWZjbGVhcgotVGhlIFJlYWRsaW5lIGRlZmF1bHQgaXMgQGNvZGV7ZW1hY3N9IG1vZGUuCi0KLVdoZW4geW91IGVudGVyIGEgbGluZSBpbiBAY29kZXt2aX0gbW9kZSwgeW91IGFyZSBhbHJlYWR5IHBsYWNlZCBpbgotYGluc2VydGlvbicgbW9kZSwgYXMgaWYgeW91IGhhZCB0eXBlZCBhbiBAc2FtcHtpfS4gIFByZXNzaW5nIEBrZXl7RVNDfQotc3dpdGNoZXMgeW91IGludG8gYGNvbW1hbmQnIG1vZGUsIHdoZXJlIHlvdSBjYW4gZWRpdCB0aGUgdGV4dCBvZiB0aGUKLWxpbmUgd2l0aCB0aGUgc3RhbmRhcmQgQGNvZGV7dml9IG1vdmVtZW50IGtleXMsIG1vdmUgdG8gcHJldmlvdXMKLWhpc3RvcnkgbGluZXMgd2l0aCBAc2FtcHtrfSBhbmQgc3Vic2VxdWVudCBsaW5lcyB3aXRoIEBzYW1we2p9LCBhbmQKLXNvIGZvcnRoLgpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZG9jL3RleGkyZHZpIGIvcmVhZGxpbmUvZG9jL3RleGkyZHZpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDcxMzRkLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2RvYy90ZXhpMmR2aQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0jISAvYmluL3NoCi0jIHRleGkyZHZpIC0tLSBzbWFydGx5IHByb2R1Y2UgRFZJIGZpbGVzIGZyb20gdGV4aW5mbyBzb3VyY2VzCi0jICRJZCQKLSMKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGVpdGhlciBzZW5kIGVtYWlsIHRvIHRoaXMKLSMgcHJvZ3JhbSdzIG1haW50YWluZXIgb3Igd3JpdGUgdG86IFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy47IDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwOyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQ29tbWVudGFyeToKLSMKLSMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBnbnUub3JnPgotIwotIyBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cywgZXRjLiB0byBidWctdGV4aW5mb0BnbnUub3JnLgotIyBJZiBwb3NzaWJsZSwgcGxlYXNlIHNlbmQgYSBjb3B5IG9mIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBjYWxsZWQgd2l0aAotIyB0aGUgYC0tZGVidWcnIG9wdGlvbiB3aGVuIG1ha2luZyBhIGJ1ZyByZXBvcnQuCi0jCi0jIEluIHRoZSBpbnRlcmVzdCBvZiBnZW5lcmFsIHBvcnRhYmlsaXR5LCBzb21lIGNvbW1vbiBib3VybmUgc2hlbGwKLSMgY29uc3RydWN0cyB3ZXJlIGF2b2lkZWQgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUKLSMgaW4gc29tZSBlYXJsaWVyIGltcGxlbWVudGF0aW9ucy4gIEkndmUgdHJpZWQgdG8gbWFrZSB0aGlzIHByb2dyYW0gYXMKLSMgcG9ydGFibGUgYXMgcG9zc2libGUuICBXZWxjb21lIHRvIHVuaXgsIHdoZXJlIHRoZSBsb3dlc3QgY29tbW9uCi0jIGRlbm9taW5hdG9yIGlzIHJhcGlkbHkgZGltaW5pc2hpbmcuCi0jCi0jIEFtb25nIHRoZSBtb3JlIGludGVyZXN0aW5nIGxvc3NhZ2VzIEkgbm90aWNlZCBhbW9uZyBCb3VybmUgc2hlbGxzOgotIyAgICAgKiBObyBzaGVsbCBmdW5jdGlvbnMuCi0jICAgICAqIE5vIGB1bnNldCcgYnVpbHRpbi4KLSMgICAgICogYHNoaWZ0JyBjYW5ub3QgdGFrZSBhIG51bWVyaWMgYXJndW1lbnQsIGFuZCBzaWduYWxzIGFuIGVycm9yIGlmCi0jICAgICAgIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgdG8gc2hpZnQuCi0jCi0jIENvZGU6Ci0KLSMgTmFtZSBieSB3aGljaCB0aGlzIHNjcmlwdCB3YXMgaW52b2tlZC4KLXByb2duYW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MvW15cL10qXC8vL2cnYAotCi0jIFRoaXMgc3RyaW5nIGlzIGV4cGFuZGVkIGJ5IHJjcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhpcyBmaWxlIGlzIGNoZWNrZWQgb3V0LgotcmNzX3JldmlzaW9uPSckUmV2aXNpb24kJwotdmVyc2lvbj1gc2V0IC0gJHJjc19yZXZpc2lvbjsgZWNobyAkMmAKLQotIyBUbyBwcmV2ZW50IGhhaXJ5IHF1b3RpbmcgYW5kIGVzY2FwaW5nIGxhdGVyLgotYnE9J2AnCi1lcT0iJyIKLQotdXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBGSUxFLi4uCi1SdW4gYSBUZXhpbmZvIGRvY3VtZW50IHRocm91Z2ggVGVYLgotCi1PcHRpb25zOgotLWIsIC0tYmF0Y2ggICAgICAgICAgTm8gaW50ZXJhY3Rpb24gKFxub25zdG9wbW9kZSBpbiBUZVgpLgotLWMsIC0tY2xlYW4gICAgICAgICAgUmVtb3ZlIGFsbCBhdXhpbGlhcnkgZmlsZXMuCi0tRCwgLS1kZWJ1ZyAgICAgICAgICBUdXJuIG9uIHNoZWxsIGRlYnVnZ2luZyAoJGJxJHticX1zZXQgLXgkZXEkZXEpLgotLXQsIC0tdGV4aW5mbyBDTUQgICAgSW5zZXJ0IENNRCBhZnRlciBAc2V0ZmlsZW5hbWUgYmVmb3JlIHJ1bm5pbmcgVGVYLgotLS12ZXJib3NlICAgICAgICAgICAgUmVwb3J0IG9uIHdoYXQgaXMgZG9uZS4KLS1oLCAtLWhlbHAgICAgICAgICAgIERpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgotLXYsIC0tdmVyc2lvbiAgICAgICAgRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0LgotCi1UaGUgdmFsdWVzIG9mIHRoZSBURVgsIFRFWElOREVYLCBhbmQgTUFLRUlORk8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQotdXNlZCB0byBydW4gdGhvc2UgY29tbWFuZHMsIGlmIHRoZXkgYXJlIHNldC4KLQotRW1haWwgYnVnIHJlcG9ydHMgdG8gYnVnLXRleGluZm9AZ251Lm9yZy4iCi0KLSMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCi0jIERvbid0IHVzZSBgdW5zZXQnIHNpbmNlIG9sZCBib3VybmUgc2hlbGxzIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLgotIyBJbnN0ZWFkLCBhc3NpZ24gdGhlbSBhbiBlbXB0eSB2YWx1ZS4KLSMgU29tZSBvZiB0aGVzZSwgbGlrZSBURVggYW5kIFRFWElOREVYLCBtYXkgYmUgaW5oZXJpdGVkIGZyb20gdGhlIGVudmlyb25tZW50LgotYmFja3VwX2V4dGVuc2lvbj0uYmFrICMgdGhlc2UgZmlsZXMgZ2V0IGRlbGV0ZWQgaWYgYWxsIGdvZXMgd2VsbC4KLWJhdGNoPQotY2xlYW49Ci1kZWJ1Zz0KLW9yaWdfcHdkPSJgcHdkYCIKLXRleHRyYT0KLXZlcmJvc2U9ZmFsc2UKLW1ha2VpbmZvPSIke01BS0VJTkZPLW1ha2VpbmZvfSIKLXRleGluZGV4PSIke1RFWElOREVYLXRleGluZGV4fSIKLXRleD0iJHtURVgtdGV4fSIKLQotIyBTYXZlIHRoaXMgc28gd2UgY2FuIGNvbnN0cnVjdCBhIG5ldyBURVhJTlBVVFMgcGF0aCBmb3IgZWFjaCBmaWxlLgotVEVYSU5QVVRTX29yaWc9IiRURVhJTlBVVFMiCi1leHBvcnQgVEVYSU5QVVRTCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSMgTWFrZSBzdXJlIHRoYXQgYWxsIHdpbGRjYXJkZWQgb3B0aW9ucyBhcmUgbG9uZyBlbm91Z2ggdG8gYmUgdW5hbWJpZ3VvdXMuCi0jIEl0J3MgYSBnb29kIGlkZWEgdG8gZG9jdW1lbnQgdGhlIGZ1bGwgbG9uZyBvcHRpb24gbmFtZSBpbiBlYWNoIGNhc2UuCi0jIExvbmcgb3B0aW9ucyB3aGljaCB0YWtlIGFyZ3VtZW50cyB3aWxsIG5lZWQgYSBgKicgYXBwZW5kZWQgdG8gdGhlCi0jIGNhbm9uaWNhbCBuYW1lIHRvIG1hdGNoIHRoZSB2YWx1ZSBhcHBlbmRlZCBhZnRlciB0aGUgYD0nIGNoYXJhY3Rlci4KLXdoaWxlIDo7IGRvCi0gIHRlc3QgJCMgLWVxIDAgJiYgYnJlYWsKLSAgCi0gIGNhc2UgIiQxIiBpbgotICAgIC1iIHwgLS1iYXRjaCB8IC0tYiogKSBiYXRjaD10OyBzaGlmdCA7OwotICAgIC1jIHwgLS1jbGVhbiB8IC0tYyogKSBjbGVhbj10OyBzaGlmdCA7OwotICAgIC1EIHwgLS1kZWJ1ZyB8IC0tZCogKSBkZWJ1Zz10OyBzaGlmdCA7OwotICAgIC1oIHwgLS1oZWxwIHwgLS1oKiApICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7Ci0gICAgIyBPSywgd2Ugc2hvdWxkIGRvIHJlYWwgb3B0aW9uIHBhcnNpbmcgaGVyZSwgYnV0IGJlIGxhenkgZm9yIG5vdy4KLSAgICAtdCB8IC0tdGV4aW5mbyB8IC0tdCopIHNoaWZ0OyB0ZXh0cmE9IiR0ZXh0cmEgJDEiOyBzaGlmdCA7OyAKLSAgICAtdiB8IC0tdmVycyogKQotICAgICAgZWNobyAiJHByb2duYW1lIChHTlUgVGV4aW5mbyAzLjEyKSAkdmVyc2lvbiIKLSAgICAgIGVjaG8gIkNvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoZXJlIGlzIE5PIHdhcnJhbnR5LiAgWW91IG1heSByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG1hdHRlcnMsIHNlZSB0aGUgZmlsZXMgbmFtZWQgQ09QWUlORy4iCi0gICAgICBleGl0IDAgOzsKLSAgICAtLXZlcmIqICkgICAgICAgICAgICB2ZXJib3NlPWVjaG87IHNoaWZ0IDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICBzaGlmdAotICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICBjYXNlICIkMSIgaW4KLSAgICAgICAgLS0qPSogKSBhcmc9YGVjaG8gIiQxIiB8IHNlZCAtZSAncy89LiovLydgIDs7Ci0gICAgICAgICogKSAgICAgYXJnPSIkMSIgOzsKLSAgICAgIGVzYWMKLSAgICAgIGV4ZWMgMT4mMgotICAgICAgZWNobyAiJHByb2duYW1lOiBVbmtub3duIG9yIGFtYmlndW91cyBvcHRpb24gJGJxJGFyZyRlcS4iCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IFRyeSAkYnEtLWhlbHAkZXEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotICAgICAgZXhpdCAxIDs7Ci0gICAgKiApIGJyZWFrIDs7Ci0gICBlc2FjCi1kb25lCi0KLSMgU2VlIGlmIHRoZXJlIGFyZSBhbnkgY29tbWFuZCBsaW5lIGFyZ3MgbGVmdCAod2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcwotIyBmaWxlbmFtZSBhcmd1bWVudHMpLgotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICBleGVjIDE+JjIKLSAgZWNobyAiJHByb2duYW1lOiBBdCBsZWFzdCBvbmUgZmlsZSBuYW1lIGlzIHJlcXVpcmVkIGFzIGFuIGFyZ3VtZW50LiIKLSAgZWNobyAiJHByb2duYW1lOiBUcnkgJGJxLS1oZWxwJGVxIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLSAgZXhpdCAyCi1maQotCi10ZXN0ICIkZGVidWciID0gdCAmJiBzZXQgLXgKLQotIyBUZXhpZnkgZmlsZXMKLWZvciBjb21tYW5kX2xpbmVfZmlsZW5hbWUgaW4gJHsxKyIkQCJ9OyBkbwotICAkdmVyYm9zZSAiUHJvY2Vzc2luZyAkY29tbWFuZF9saW5lX2ZpbGVuYW1lIC4uLiIKLQotICAjIFNlZSBpZiBmaWxlIGV4aXN0cy4gIElmIGl0IGRvZXNuJ3Qgd2UncmUgaW4gdHJvdWJsZSBzaW5jZSwgZXZlbgotICAjIHRob3VnaCB0aGUgdXNlciBtYXkgYmUgYWJsZSB0byByZWVudGVyIGEgdmFsaWQgZmlsZW5hbWUgYXQgdGhlIHRleAotICAjIHByb21wdCAoYXNzdW1pbmcgdGhleSdyZSBhdHRlbmRpbmcgdGhlIHRlcm1pbmFsKSwgdGhpcyBzY3JpcHQgd29uJ3QKLSAgIyBiZSBhYmxlIHRvIGZpbmQgdGhlIHJpZ2h0IGluZGV4IGZpbGVzIGFuZCBzbyBmb3J0aC4KLSAgaWYgdGVzdCAhIC1yICIke2NvbW1hbmRfbGluZV9maWxlbmFtZX0iOyB0aGVuCi0gICAgZWNobyAiJDA6IENvdWxkIG5vdCByZWFkICR7Y29tbWFuZF9saW5lX2ZpbGVuYW1lfS4iID4mMgotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgIyBSb3VnaGx5IGVxdWl2YWxlbnQgdG8gYGRpcm5hbWUgLi4uYCwgYnV0IG1vcmUgcG9ydGFibGUKLSAgZGlyZWN0b3J5PSJgZWNobyAke2NvbW1hbmRfbGluZV9maWxlbmFtZX0gfCBzZWQgJ3MvXC9bXlwvXSokLy8nYCIKLSAgZmlsZW5hbWVfdGV4aT0iYGJhc2VuYW1lICR7Y29tbWFuZF9saW5lX2ZpbGVuYW1lfWAiCi0gICMgU3RyaXAgb2ZmIHRoZSBsYXN0IGV4dGVuc2lvbiBwYXJ0IChwcm9iYWJseSAudGV4aW5mbyBvciAudGV4aSkKLSAgZmlsZW5hbWVfbm9leHQ9ImBlY2hvICR7ZmlsZW5hbWVfdGV4aX0gfCBzZWQgJ3MvXC5bXi5dKiQvLydgIgotCi0gICMgVXNlIHNhbWUgYmFzZW5hbWUgc2luY2Ugd2Ugd2FudCB0byBnZW5lcmF0ZSBhdXggZmlsZXMgd2l0aCB0aGUgc2FtZQotICAjIGJhc2VuYW1lIGFzIHRoZSBtYW51YWwuICBVc2UgZXh0ZW5zaW9uIC50ZXhpIGZvciB0aGUgdGVtcCBmaWxlIHNvCi0gICMgdGhhdCBUZVggd2lsbCBpZ25vcmUgaXQuICBUaHVzLCB3ZSBtdXN0IHVzZSBhIHN1YmRpcmVjdG9yeS4KLSAgIwotICAjIE91dHB1dCB0aGUgbWFjcm8tZXhwYW5kZWQgZmlsZSB0byBoZXJlLiAgVGhlIHZhc3RseSBhYmJyZXZpYXRlZAotICAjIHRlbXBvcmFyeSBkaXJlY3RvcnkgbmFtZSBpcyBzbyB3ZSBkb24ndCBoYXZlIGNvbGxpc2lvbnMgb24gOC4zIG9yCi0gICMgMTQtY2hhcmFjdGVyIGZpbGVzeXN0ZW1zLgotICB0bXBfZGlyPSR7VE1QRElSLS90bXB9L3R4aTJkLiQkCi0gIGZpbGVuYW1lX3RtcD0kdG1wX2Rpci8kZmlsZW5hbWVfbm9leHQudGV4aQotICAjIE91dHB1dCB0aGUgZmlsZSB3aXRoIHRoZSB1c2VyJ3MgZXh0cmEgY29tbWFuZHMgdG8gaGVyZS4KLSAgdG1wX2RpcjI9JHt0bXBfZGlyfS4yCi0gIGZpbGVuYW1lX3RtcDI9JHRtcF9kaXIyLyRmaWxlbmFtZV9ub2V4dC50ZXhpCi0gIG1rZGlyICR0bXBfZGlyICR0bXBfZGlyMgotICAjIEFsd2F5cyByZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KLSAgdHJhcCAicm0gLXJmICR0bXBfZGlyICR0bXBfZGlyMiIgMSAyIDE1Ci0KLSAgIyBJZiBkaXJlY3RvcnkgYW5kIGZpbGUgYXJlIHRoZSBzYW1lLCB0aGVuIGl0J3MgcHJvYmFibHkgYmVjYXVzZSB0aGVyZSdzCi0gICMgbm8gcGF0aG5hbWUgY29tcG9uZW50LiAgU2V0IGRpcm5hbWUgdG8gYC4nLCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gIGlmIHRlc3QgInoke2RpcmVjdG9yeX0iID0gInoke2NvbW1hbmRfbGluZV9maWxlbmFtZX0iOyB0aGVuCi0gICAgZGlyZWN0b3J5PS4KLSAgZmkKLQotICAjIFNvdXJjZSBmaWxlIG1pZ2h0IEBpbmNsdWRlIGFkZGl0aW9uYWwgdGV4aW5mbyBzb3VyY2VzLiAgUHV0IGAuJyBhbmQKLSAgIyBkaXJlY3Rvcnkgd2hlcmUgc291cmNlIGZpbGUocykgcmVzaWRlIGluIFRFWElOUFVUUyBiZWZvcmUgYW55dGhpbmcKLSAgIyBlbHNlLiAgYC4nIGdvZXMgZmlyc3QgdG8gZW5zdXJlIHRoYXQgYW55IG9sZCAuYXV4LCAuY3BzLCBldGMuIGZpbGVzIGluCi0gICMgJHtkaXJlY3Rvcnl9IGRvbid0IGdldCB1c2VkIGluIHByZWZlcmVuY2UgdG8gZnJlc2hlciBmaWxlcyBpbiBgLicuCi0gIFRFWElOUFVUUz0iLjoke2RpcmVjdG9yeX06JHtURVhJTlBVVFNfb3JpZ30iCi0KLSAgIyBFeHBhbmQgbWFjcm8gY29tbWFuZHMgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHVzaW5nIE1ha2VpbmZvOwotICAjICAgdGhlIG1hY3JvIHN5bnRheCBiZm94IGltcGxlbWVudGVkIGlzIGltcG9zc2libGUgdG8gaW1wbGVtZW50IGluIFRlWC4KLSAgIyBBbHdheXMgdXNlIGBlbmQnIGZvb3Rub3RlIHN0eWxlLCBzaW5jZSB0aGUgYHNlcGFyYXRlJyBzdHlsZQotICAjICAgZ2VuZXJhdGVzIGRpZmZlcmVudCBvdXRwdXQgKGFyZ3VhYmx5IHRoaXMgaXMgYSBidWcgaW4gLUUpLgotICAjIERpc2NhcmQgbWFpbiBpbmZvIG91dHB1dCwgdGhlIHVzZXIgYXNrZWQgdG8gcnVuIFRlWCwgbm90IG1ha2VpbmZvLgotICAjIFJlZGlyZWN0IG91dHB1dCB0byAvZGV2L251bGwgdG8gdGhyb3cgYXdheSBgTWFraW5nIGluZm8gZmlsZS4uLicgbXNnLgotICAkdmVyYm9zZSAiTWFjcm8tZXhwYW5kaW5nICRjb21tYW5kX2xpbmVfZmlsZW5hbWUgdG8gJGZpbGVuYW1lX3RtcCAuLi4iCi0gICRtYWtlaW5mbyAtLWZvb3Rub3RlLXN0eWxlPWVuZCAtRSAkZmlsZW5hbWVfdG1wIC1vIC9kZXYvbnVsbCBcCi0gICAgJGNvbW1hbmRfbGluZV9maWxlbmFtZSA+L2Rldi9udWxsCi0KLSAgIyBCdXQgaWYgdGhlcmUgd2VyZSBubyBtYWNyb3MsIG9yIG1ha2VpbmZvIGZhaWxlZCBmb3Igc29tZSByZWFzb24sCi0gICMganVzdCB1c2UgdGhlIG9yaWdpbmFsIGZpbGUuICAoSXQgc2hvdWxkbid0IG1ha2UgYW55IGRpZmZlcmVuY2UsIGJ1dAotICAjIGxldCdzIGJlIHNhZmUuKQotICBpZiB0ZXN0ICQ/IC1uZSAwIHx8IGNtcCAtcyAkZmlsZW5hbWVfdG1wICRjb21tYW5kX2xpbmVfZmlsZW5hbWU7IHRoZW4KLSAgICAkdmVyYm9zZSAiUmV2ZXJ0aW5nIHRvICRjb21tYW5kX2xpbmVfZmlsZW5hbWUgLi4uIgotICAgIGNwIC1wICRjb21tYW5kX2xpbmVfZmlsZW5hbWUgJGZpbGVuYW1lX3RtcAotICBmaQotICBmaWxlbmFtZV9pbnB1dD0kZmlsZW5hbWVfdG1wCi0gIGRpcm5hbWVfaW5wdXQ9JHRtcF9kaXIKLQotICAjIFVzZWQgbW9zdCBjb21tb25seSBmb3IgQGZpbmFsb3V0LCBAc21hbGxib29rLCBldGMuCi0gIGlmIHRlc3QgLW4gIiR0ZXh0cmEiOyB0aGVuCi0gICAgJHZlcmJvc2UgIkluc2VydGluZyBleHRyYSBjb21tYW5kczogJHRleHRyYS4iCi0gICAgc2VkICcvXkBzZXRmaWxlbmFtZS9hXAotJyIkdGV4dHJhIiAkZmlsZW5hbWVfaW5wdXQgPiRmaWxlbmFtZV90bXAyCi0gICBmaWxlbmFtZV9pbnB1dD0kZmlsZW5hbWVfdG1wMgotICAgZGlybmFtZV9pbnB1dD0kdG1wX2RpcjIKLSAgZmkKLQotICAjIElmIGNsZWFuIG1vZGUgd2FzIHNwZWNpZmllZCwgdGhlbiBtb3ZlIHRvIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotICBpZiB0ZXN0ICIkY2xlYW4iID0gdDsgdGhlbgotICAgICR2ZXJib3NlICJjZCAkZGlybmFtZV9pbnB1dCIKLSAgICBjZCAkZGlybmFtZV9pbnB1dCB8fCBleGl0IDEKLSAgICBmaWxlbmFtZV9pbnB1dD1gYmFzZW5hbWUgJGZpbGVuYW1lX2lucHV0YAotICBmaQotCi0gIHdoaWxlIHRydWU7IGRvICMgd2lsbCBicmVhayBvdXQgb2YgbG9vcCBiZWxvdwotICAgICMgIlVuc2V0IiB2YXJpYWJsZXMgdGhhdCBtaWdodCBoYXZlIHZhbHVlcyBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbnMgYW5kCi0gICAgIyB3aGljaCB3b24ndCBiZSBjb21wbGV0ZWx5IHJlc2V0IGxhdGVyLgotICAgIGRlZmluaXRlX2luZGV4X2ZpbGVzPQotCi0gICAgIyBGaW5kIGFsbCBmaWxlcyBoYXZpbmcgcm9vdCBmaWxlbmFtZSB3aXRoIGEgdHdvLWxldHRlciBleHRlbnNpb24sCi0gICAgIyBkZXRlcm1pbmUgd2hldGhlciB0aGV5J3JlIHJlYWxseSBpbmRleCBmaWxlcywgYW5kIHNhdmUgdGhlbS4gIEZvby5hdXgKLSAgICAjIGlzIGFjdHVhbGx5IHRoZSBjcm9zcy1yZWZlcmVuY2VzIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKLSAgICAjIHRoYXQgdG9vLgotICAgIHBvc3NpYmxlX2luZGV4X2ZpbGVzPSJgZXZhbCBlY2hvICR7ZmlsZW5hbWVfbm9leHR9Lj8/ICR7ZmlsZW5hbWVfbm9leHR9LmF1eGAiCi0gICAgZm9yIHRoaXNfZmlsZSBpbiAke3Bvc3NpYmxlX2luZGV4X2ZpbGVzfTsgZG8KLSAgICAgICMgSWYgZmlsZSBpcyBlbXB0eSwgZm9yZ2V0IGl0LgotICAgICAgdGVzdCAtcyAiJHt0aGlzX2ZpbGV9IiB8fCBjb250aW51ZQotCi0gICAgICAjIEV4YW1pbmUgZmlyc3QgY2hhcmFjdGVyIG9mIGZpbGUuICBJZiBpdCdzIG5vdCBzdWl0YWJsZSB0byBiZSBhbgotICAgICAgIyBpbmRleCBvciB4cmVmIGZpbGUsIGRvbid0IHByb2Nlc3MgaXQuCi0gICAgICBmaXJzdF9jaGFyYWN0ZXI9ImBzZWQgLW4gJzFzL15cKC5cKS4qJC9cMS9wO3EnICR7dGhpc19maWxlfWAiCi0gICAgICBpZiB0ZXN0ICJ4JHtmaXJzdF9jaGFyYWN0ZXJ9IiA9ICJ4XFwiIFwKLSAgICAgICAgIHx8IHRlc3QgIngke2ZpcnN0X2NoYXJhY3Rlcn0iID0gIngnIjsgdGhlbgotICAgICAgICBkZWZpbml0ZV9pbmRleF9maWxlcz0iJHtkZWZpbml0ZV9pbmRleF9maWxlc30gJHt0aGlzX2ZpbGV9IgotICAgICAgZmkKLSAgICBkb25lCi0gICAgb3JpZ19pbmRleF9maWxlcz0iJHtkZWZpbml0ZV9pbmRleF9maWxlc30iCi0gICAgb3JpZ19pbmRleF9maWxlc19zYW5zX2F1eD0iYGVjaG8gJHtkZWZpbml0ZV9pbmRleF9maWxlc30gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZWQgJ3MvJyR7ZmlsZW5hbWVfbm9leHR9J1wuYXV4Ly87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy9eWyBdKi8vO3MvWyBdKiQvLzsnYCIKLQotICAgICMgTm93IHNhdmUgY29waWVzIG9mIG9yaWdpbmFsIGluZGV4IGZpbGVzIHNvIHdlIGhhdmUgc29tZSBtZWFucyBvZgotICAgICMgY29tcGFyaXNvbiBsYXRlci4KLSAgICAkdmVyYm9zZSAiQmFja2luZyB1cCBjdXJyZW50IGluZGV4IGZpbGVzOiAkb3JpZ19pbmRleF9maWxlcyAuLi4iICAKLSAgICBmb3IgaW5kZXhfZmlsZV90b19zYXZlIGluICR7b3JpZ19pbmRleF9maWxlc307IGRvCi0gICAgICBjcCAiJHtpbmRleF9maWxlX3RvX3NhdmV9IiAiJHtpbmRleF9maWxlX3RvX3NhdmV9JHtiYWNrdXBfZXh0ZW5zaW9ufSIKLSAgICBkb25lCi0KLSAgICAjIFJ1biB0ZXhpbmRleCBvbiBjdXJyZW50IGluZGV4IGZpbGVzLiAgSWYgdGhleSBhbHJlYWR5IGV4aXN0LCBhbmQKLSAgICAjIGFmdGVyIHJ1bm5pbmcgVGVYIGEgZmlyc3QgdGltZSB0aGUgaW5kZXggZmlsZXMgZG9uJ3QgY2hhbmdlLCB0aGVuCi0gICAgIyB0aGVyZSdzIG5vIHJlYXNvbiB0byBydW4gVGVYIGFnYWluLiAgQnV0IHdlIHdvbid0IGtub3cgdGhhdCBpZiB0aGUKLSAgICAjIGluZGV4IGZpbGVzIGFyZSBvdXQgb2YgZGF0ZSBvciBub25leGlzdGVudC4KLSAgICBpZiB0ZXN0IC1uICIke29yaWdfaW5kZXhfZmlsZXNfc2Fuc19hdXh9IjsgdGhlbgotICAgICAgJHZlcmJvc2UgIlJ1bm5pbmcgJHRleGluZGV4ICRvcmlnX2luZGV4X2ZpbGVzX3NhbnNfYXV4IC4uLiIKLSAgICAgICR7dGV4aW5kZXh9ICR7b3JpZ19pbmRleF9maWxlc19zYW5zX2F1eH0KLSAgICBmaQotCi0gICAgIyBGaW5hbGx5LCBydW4gVGVYLgotICAgIGlmIHRlc3QgIiRiYXRjaCIgPSB0OyB0aGVuCi0gICAgICB0ZXhfbW9kZT0nXG5vbnN0b3Btb2RlJwotICAgIGVsc2UKLSAgICAgIHRleF9tb2RlPQotICAgIGZpCi0gICAgJHZlcmJvc2UgIlJ1bm5pbmcgJHRleCAkZmlsZW5hbWVfaW5wdXQgLi4uIgotICAgIGNtZD0iJHRleCAkdGV4X21vZGUgXFxpbnB1dCAkZmlsZW5hbWVfaW5wdXQiCi0gICAgJGNtZAotCi0gICAgIyBDaGVjayBpZiBpbmRleCBmaWxlcyBjaGFuZ2VkLgotICAgICMgCi0gICAgZGVmaW5pdGVfaW5kZXhfZmlsZXM9Ci0gICAgIyBHZXQgbGlzdCBvZiBuZXcgaW5kZXggZmlsZXMuCi0gICAgcG9zc2libGVfaW5kZXhfZmlsZXM9ImBldmFsIGVjaG8gJHtmaWxlbmFtZV9ub2V4dH0uPz8gJHtmaWxlbmFtZV9ub2V4dH0uYXV4YCIKLSAgICBmb3IgdGhpc19maWxlIGluICR7cG9zc2libGVfaW5kZXhfZmlsZXN9OyBkbwotICAgICAgICMgSWYgZmlsZSBpcyBlbXB0eSwgZm9yZ2V0IGl0LgotICAgICAgIHRlc3QgLXMgIiR7dGhpc19maWxlfSIgfHwgY29udGludWUKLQotICAgICAgICMgRXhhbWluZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZmlsZS4gIElmIGl0J3Mgbm90IGEgYmFja3NsYXNoIG9yCi0gICAgICAgIyBzaW5nbGUgcXVvdGUsIHRoZW4gaXQncyBkZWZpbml0ZWx5IG5vdCBhbiBpbmRleCBvciB4cmVmIGZpbGUuCi0gICAgICAgIyAoV2lsbCBoYXZlIHRvIGNoZWNrIGZvciBAIHdoZW4gd2Ugc3dpdGNoIHRvIFRleGluZm8gc3ludGF4IGluCi0gICAgICAgIyBhbGwgdGhlc2UgZmlsZXMuLi4pCi0gICAgICAgZmlyc3RfY2hhcmFjdGVyPSJgc2VkIC1uICcxcy9eXCguXCkuKiQvXDEvcDtxJyAke3RoaXNfZmlsZX1gIgotICAgICAgIGlmIHRlc3QgIngke2ZpcnN0X2NoYXJhY3Rlcn0iID0gInhcXCIgXAotICAgICAgICAgIHx8IHRlc3QgIngke2ZpcnN0X2NoYXJhY3Rlcn0iID0gIngnIjsgdGhlbgotICAgICAgICAgZGVmaW5pdGVfaW5kZXhfZmlsZXM9IiR7ZGVmaW5pdGVfaW5kZXhfZmlsZXN9ICR7dGhpc19maWxlfSIKLSAgICAgICBmaQotICAgIGRvbmUKLSAgICBuZXdfaW5kZXhfZmlsZXM9IiR7ZGVmaW5pdGVfaW5kZXhfZmlsZXN9IgotICAgIG5ld19pbmRleF9maWxlc19zYW5zX2F1eD0iYGVjaG8gJHtkZWZpbml0ZV9pbmRleF9maWxlc30gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VkICdzLycke2ZpbGVuYW1lX25vZXh0fSdcLmF1eC8vOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzL15bIF0qLy87cy9bIF0qJC8vOydgIgotCi0gICAgIyBJZiBvbGQgYW5kIG5ldyBsaXN0IGRvbid0IGF0IGxlYXN0IGhhdmUgdGhlIHNhbWUgZmlsZSBsaXN0LCB0aGVuIG9uZQotICAgICMgZmlsZSBvciBhbm90aGVyIGhhcyBkZWZpbml0ZWx5IGNoYW5nZWQuCi0gICAgJHZlcmJvc2UgIk9yaWdpbmFsIGluZGV4IGZpbGVzID0kb3JpZ19pbmRleF9maWxlcyIKLSAgICAkdmVyYm9zZSAiTmV3IGluZGV4IGZpbGVzID0kbmV3X2luZGV4X2ZpbGVzIgotICAgIGlmIHRlc3QgInoke29yaWdfaW5kZXhfZmlsZXN9IiAhPSAieiR7bmV3X2luZGV4X2ZpbGVzfSI7IHRoZW4KLSAgICAgIGluZGV4X2ZpbGVzX2NoYW5nZWRfcD10Ci0gICAgZWxzZQotICAgICAgIyBGaWxlIGxpc3QgaXMgdGhlIHNhbWUuICBXZSBtdXN0IGNvbXBhcmUgZWFjaCBmaWxlIHVudGlsIHdlIGZpbmQgYQotICAgICAgIyBkaWZmZXJlbmNlLgotICAgICAgaW5kZXhfZmlsZXNfY2hhbmdlZF9wPQotICAgICAgZm9yIHRoaXNfZmlsZSBpbiAke25ld19pbmRleF9maWxlc307IGRvCi0gICAgICAgICR2ZXJib3NlICJDb21wYXJpbmcgaW5kZXggZmlsZSAkdGhpc19maWxlIC4uLiIKLSAgICAgICAgIyBjbXAgLXMgd2lsbCByZXR1cm4gbm9uemVybyBleGl0IHN0YXR1cyBpZiBmaWxlcyBkaWZmZXIuCi0gICAgICAgIGNtcCAtcyAiJHt0aGlzX2ZpbGV9IiAiJHt0aGlzX2ZpbGV9JHtiYWNrdXBfZXh0ZW5zaW9ufSIKLSAgICAgICAgaWYgdGVzdCAkPyAtbmUgMDsgdGhlbgotICAgICAgICAgICMgV2Ugb25seSBuZWVkIHRvIGtlZXAgY29tcGFyaW5nIHVudGlsIHdlIGZpbmQgKm9uZSogdGhhdAotICAgICAgICAgICMgZGlmZmVycywgYmVjYXVzZSB3ZSdsbCBoYXZlIHRvIHJ1biB0ZXhpbmRleCAmIHRleCBubwotICAgICAgICAgICMgbWF0dGVyIHdoYXQuCi0gICAgICAgICAgaW5kZXhfZmlsZXNfY2hhbmdlZF9wPXQKLSAgICAgICAgICAkdmVyYm9zZSAiSW5kZXggZmlsZSAkdGhpc19maWxlIGRpZmZlcmVkOiIKLSAgICAgICAgICB0ZXN0ICR2ZXJib3NlID0gZWNobyBcCi0gICAgICAgICAgJiYgZGlmZiAtYyAiJHt0aGlzX2ZpbGV9JHtiYWNrdXBfZXh0ZW5zaW9ufSIgIiR7dGhpc19maWxlfSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIElmIGluZGV4IGZpbGVzIGhhdmUgY2hhbmdlZCBzaW5jZSBUZVggaGFzIGJlZW4gcnVuLCBvciBpZiB0aGUgYXV4Ci0gICAgIyBmaWxlIHdhc24ndCBwcmVzZW50IG9yaWdpbmFsbHksIHJ1biB0ZXhpbmRleCBhbmQgVGVYIGFnYWluLgotICAgIGlmIHRlc3QgIiR7aW5kZXhfZmlsZXNfY2hhbmdlZF9wfSI7IHRoZW4gOjsgZWxzZQotICAgICAgIyBOb3RoaW5nIGNoYW5nZWQuICBXZSdyZSBkb25lIHdpdGggVGVYLgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0KLSAgIyBJZiB3ZSB3ZXJlIGluIGNsZWFuIG1vZGUsIGNvbXBpbGF0aW9uIHdhcyBpbiBhIHRtcCBkaXJlY3RvcnkuCi0gICMgQ29weSB0aGUgRFZJIGZpbGUgaW50byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21waWxhdGlvbgotICAjIGhhcyBiZWVuIGRvbmUuICAoVGhlIHRlbXAgZGlyIGlzIGFib3V0IHRvIGdldCByZW1vdmVkIGFueXdheS4pCi0gICMgV2UgYWxzbyByZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGRpcmVjdG9yeSBzbyB0aGF0Ci0gICMgLSB0aGUgbmV4dCBmaWxlIGlzIHByb2Nlc3NlZCBpbiBjb3JyZWN0IGNvbmRpdGlvbnMKLSAgIyAtIHRoZSB0ZW1wb3JhcnkgZmlsZSBjYW4gYmUgcmVtb3ZlZAotICBpZiB0ZXN0IC1uICIkY2xlYW4iOyB0aGVuCi0gICAgJHZlcmJvc2UgIkNvcHlpbmcgRFZJIGZpbGUgZnJvbSBgcHdkYCB0byAkb3JpZ19wd2QiCi0gICAgY3AgLXAgJGZpbGVuYW1lX25vZXh0LmR2aSAkb3JpZ19wd2QKLSAgICBjZCAkb3JpZ19wd2QgfHwgZXhpdCAxCi0gIGZpCi0KLSAgIyBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGRlbGV0ZSwgdGhlbiBjYWxsIHJtIG9uY2Ugd2l0aCB0aGUgZW50aXJlCi0gICMgbGlzdC4gIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHJtLgotICBmaWxlX2xpc3Q9Ci0gIGZvciBmaWxlIGluICR7b3JpZ19pbmRleF9maWxlc307IGRvCi0gICAgZmlsZV9saXN0PSIke2ZpbGVfbGlzdH0gJHtmaWxlfSR7YmFja3VwX2V4dGVuc2lvbn0iCi0gIGRvbmUKLSAgaWYgdGVzdCAtbiAiJHtmaWxlX2xpc3R9IjsgdGhlbgotICAgICR2ZXJib3NlICJSZW1vdmluZyAkZmlsZV9saXN0ICR0bXBfZGlyICR0bXBfZGlyMiAuLi4iCi0gICAgcm0gLWYgJHtmaWxlX2xpc3R9Ci0gICAgcm0gLXJmICR0bXBfZGlyICR0bXBfZGlyMgotICBmaQotZG9uZQotCi0kdmVyYm9zZSAiJDAgZG9uZS4iCi10cnVlICMgZXhpdCBzdWNjZXNzZnVsbHkuCmRpZmYgLS1naXQgYS9yZWFkbGluZS9kb2MvdGV4aTJodG1sIGIvcmVhZGxpbmUvZG9jL3RleGkyaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJlZWMwMS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9kb2MvdGV4aTJodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA4MSArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLSdkaSAnOwotJ2lnIDAwICc7Ci0jKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgRmlsZTogdGV4aTJodG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyBEZXNjcmlwdGlvbjogUHJvZ3JhbSB0byB0cmFuc2Zvcm0gbW9zdCBUZXhpbmZvIGRvY3VtZW50cyB0byBIVE1MICAgICAgICAgICAgICMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEAoIyl0ZXhpMmh0bWwJMS41MiAwMS8wNS85OAlXcml0dGVuIChtYWlubHkpIGJ5IExpb25lbCBDb25zLCBMaW9uZWwuQ29uc0BjZXJuLmNoCi0KLSMgVGhlIG1hbiBwYWdlIGZvciB0aGlzIHByb2dyYW0gaXMgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUgYW5kIGNhbiBiZQotIyB2aWV3ZWQgdXNpbmcgdGhlIGNvbW1hbmQgJ25yb2ZmIC1tYW4gdGV4aTJodG1sJy4KLSMgUGxlYXNlIHJlYWQgdGhlIGNvcHlyaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBtYW4gcGFnZS4KLQotIysrKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMtLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSRERUJVR19UT0MgICA9ICAxOwotJERFQlVHX0lOREVYID0gIDI7Ci0kREVCVUdfQklCICAgPSAgNDsKLSRERUJVR19HTE9TUyA9ICA4OwotJERFQlVHX0RFRiAgID0gMTY7Ci0kREVCVUdfSFRNTCAgPSAzMjsKLSRERUJVR19VU0VSICA9IDY0OwotCi0kQklCUkUgPSAnXFtbXHdcLy1dK1xdJzsJCSMgUkUgZm9yIGEgYmlibGlvZ3JhcGh5IHJlZmVyZW5jZQotJEZJTEVSRSA9ICdbXC9cdy4rLV0rJzsJCQkjIFJFIGZvciBhIGZpbGUgbmFtZQotJFZBUlJFID0gJ1teXHNce1x9XSsnOwkJCSMgUkUgZm9yIGEgdmFyaWFibGUgbmFtZQotJE5PREVSRSA9ICdbXkB7fTpcJ2AiLF0rJzsJCSMgUkUgZm9yIGEgbm9kZSBuYW1lCi0kTk9ERVNSRSA9ICdbXkB7fTpcJ2AiXSsnOwkJIyBSRSBmb3IgYSBsaXN0IG9mIG5vZGUgbmFtZXMKLSRYUkVGUkUgPSAnW15Ae31dKyc7CQkJIyBSRSBmb3IgYSB4cmVmIChzaG91bGQgdXNlIE5PREVSRSkKLQotJEVSUk9SID0gIioqKiI7CQkJICAgICAgICAjIHByZWZpeCBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncwotJFRISVNQUk9HID0gInRleGkyaHRtbCAxLjUyIjsJCQkjIHByb2dyYW0gbmFtZSBhbmQgdmVyc2lvbgotJEhPTUVQQUdFID0gImh0dHA6Ly93d3dpbmZvLmNlcm4uY2gvZGlzL3RleGkyaHRtbC8iOyAjIHByb2dyYW0gaG9tZSBwYWdlCi0kVE9EQVkgPSAmcHJldHR5X2RhdGU7CQkJIyBsaWtlICIyMCBTZXB0ZW1iZXIgMTk5MyIKLSRTUExJVFRBRyA9ICI8IS0tIFNQTElUIEhFUkUgLS0+XG4iOwkjIHRhZyB0byBrbm93IHdoZXJlIHRvIHNwbGl0Ci0kUFJPVEVDVFRBRyA9ICJfVGhpc0lzUHJvdGVjdGVkXyI7CSMgdGFnIHRvIHJlY29nbml6ZSBwcm90ZWN0ZWQgc2VjdGlvbnMKLSRodG1sMl9kb2N0eXBlID0gJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wIFN0cmljdCBMZXZlbCAyLy9FTiI+JzsKLQotIwotIyBsYW5ndWFnZSBkZXBlbmRlbnQgY29uc3RhbnRzCi0jCi0jJExEQ19TRUUgPSAnc2VlJzsKLSMkTERDX1NFQ1RJT04gPSAnc2VjdGlvbic7Ci0jJExEQ19JTiA9ICdpbic7Ci0jJExEQ19UT0MgPSAnVGFibGUgb2YgQ29udGVudHMnOwotIyRMRENfR09UTyA9ICdHbyB0byB0aGUnOwotIyRMRENfRk9PVCA9ICdGb290bm90ZXMnOwotIyBUT0RPOiBAZGVmKiBzaG9ydGN1dHMKLQotIwotIyBwcmUtZGVmaW5lZCBpbmRpY2VzCi0jCi0lcHJlZGVmaW5lZF9pbmRleCA9ICgKLQkJICAgICdjcCcsICdjJywKLQkJICAgICdmbicsICdmJywKLQkJICAgICd2cicsICd2JywKLQkJICAgICdreScsICdrJywKLQkJICAgICdwZycsICdwJywKLQkJICAgICd0cCcsICd0JywKLQkgICAgICAgICAgICApOwotCi0jCi0jIHZhbGlkIGluZGljZXMKLSMKLSV2YWxpZF9pbmRleCA9ICgKLQkJICAgICdjJywgMSwKLQkJICAgICdmJywgMSwKLQkJICAgICd2JywgMSwKLQkJICAgICdrJywgMSwKLQkJICAgICdwJywgMSwKLQkJICAgICd0JywgMSwKLQkJKTsKLQotIwotIyB0ZXhpbmZvIHNlY3Rpb24gbmFtZXMgdG8gbGV2ZWwKLSMKLSVzZWMybGV2ZWwgPSAoCi0JICAgICAgJ3RvcCcsIDAsCi0JICAgICAgJ2NoYXB0ZXInLCAxLAotCSAgICAgICd1bm51bWJlcmVkJywgMSwKLQkgICAgICAnbWFqb3JoZWFkaW5nJywgMSwKLQkgICAgICAnY2hhcGhlYWRpbmcnLCAxLAotCSAgICAgICdhcHBlbmRpeCcsIDEsCi0JICAgICAgJ3NlY3Rpb24nLCAyLAotCSAgICAgICd1bm51bWJlcmVkc2VjJywgMiwKLQkgICAgICAnaGVhZGluZycsIDIsCi0JICAgICAgJ2FwcGVuZGl4c2VjJywgMiwKLQkgICAgICAnYXBwZW5kaXhzZWN0aW9uJywgMiwKLQkgICAgICAnc3Vic2VjdGlvbicsIDMsCi0JICAgICAgJ3VubnVtYmVyZWRzdWJzZWMnLCAzLAotCSAgICAgICdzdWJoZWFkaW5nJywgMywKLQkgICAgICAnYXBwZW5kaXhzdWJzZWMnLCAzLAotCSAgICAgICdzdWJzdWJzZWN0aW9uJywgNCwKLQkgICAgICAndW5udW1iZXJlZHN1YnN1YnNlYycsIDQsCi0JICAgICAgJ3N1YnN1YmhlYWRpbmcnLCA0LAotCSAgICAgICdhcHBlbmRpeHN1YnN1YnNlYycsIDQsCi0JICAgICAgKTsKLQotIwotIyBhY2NlbnQgbWFwLCBUZVggY29tbWFuZCB0byBJU08gbmFtZQotIwotJWFjY2VudF9tYXAgPSAoCi0JICAgICAgICciJywgICd1bWwnLAotCSAgICAgICAnficsICAndGlsZGUnLAotCSAgICAgICAnXicsICAnY2lyYycsCi0JICAgICAgICdgJywgICdncmF2ZScsCi0JICAgICAgICdcJycsICdhY3V0ZScsCi0JICAgICAgICk7Ci0KLSMKLSMgdGV4aW5mbyAic2ltcGxlIHRoaW5ncyIgKEBmb28pIHRvIEhUTUwgb25lcwotIwotJXNpbXBsZV9tYXAgPSAoCi0JICAgICAgICMgY2YuIG1ha2VpbmZvLmMKLQkgICAgICAgIioiLCAiPEJSPiIsCQkjIEhUTUwrCi0JICAgICAgICIgIiwgIiAiLAotCSAgICAgICAiXG4iLCAiXG4iLAotCSAgICAgICAifCIsICIiLAotCSAgICAgICAjIHNwYWNpbmcgY29tbWFuZHMKLQkgICAgICAgIjoiLCAiIiwKLQkgICAgICAgIiEiLCAiISIsCi0JICAgICAgICI/IiwgIj8iLAotCSAgICAgICAiLiIsICIuIiwKLQkgICAgICAgIi0iLCAiIiwKLQkgICAgICAgKTsKLQotIwotIyB0ZXhpbmZvICJ0aGluZ3MiIChAZm9ve30pIHRvIEhUTUwgb25lcwotIwotJXRoaW5nc19tYXAgPSAoCi0JICAgICAgICdUZVgnLCAnVGVYJywKLQkgICAgICAgJ2JyJywgJzxQPicsCQkjIHBhcmFncmFwaCBicmVhawotCSAgICAgICAnYnVsbGV0JywgJyonLAotCSAgICAgICAnY29weXJpZ2h0JywgJyhDKScsCi0JICAgICAgICdkb3RzJywgJy4uLicsCi0JICAgICAgICdlcXVpdicsICc9PScsCi0JICAgICAgICdlcnJvcicsICdlcnJvci0tPicsCi0JICAgICAgICdleHBhbnNpb24nLCAnPT0+JywKLQkgICAgICAgJ21pbnVzJywgJy0nLAotCSAgICAgICAncG9pbnQnLCAnLSEtJywKLQkgICAgICAgJ3ByaW50JywgJy18JywKLQkgICAgICAgJ3Jlc3VsdCcsICc9PicsCi0JICAgICAgICd0b2RheScsICRUT0RBWSwKLQkgICAgICAgKTsKLQotIwotIyB0ZXhpbmZvIHN0eWxlcyAoQGZvb3tiYXJ9KSB0byBIVE1MIG9uZXMKLSMKLSVzdHlsZV9tYXAgPSAoCi0JICAgICAgJ2FzaXMnLCAnJywKLQkgICAgICAnYicsICdCJywKLQkgICAgICAnY2l0ZScsICdDSVRFJywKLQkgICAgICAnY29kZScsICdDT0RFJywKLQkgICAgICAnY3RybCcsICcmZG9fY3RybCcsCSMgc3BlY2lhbCBjYXNlCi0JICAgICAgJ2RmbicsICdFTScsCQkjIERGTiB0YWcgaXMgaWxsZWdhbCBpbiB0aGUgc3RhbmRhcmQKLQkgICAgICAnZG1uJywgJycsCQkjIHVzZWxlc3MKLQkgICAgICAnZW1haWwnLCAnJmRvX2VtYWlsJywgICAgICMgaW5zZXJ0IGEgY2xpY2thYmxlIGVtYWlsIGFkZHJlc3MKLQkgICAgICAnZW1waCcsICdFTScsCi0JICAgICAgJ2ZpbGUnLCAnIlRUJywJCSMgd2lsbCBwdXQgcXVvdGVzLCBjZi4gJmFwcGx5X3N0eWxlCi0JICAgICAgJ2knLCAnSScsCi0JICAgICAgJ2tiZCcsICdLQkQnLAotCSAgICAgICdrZXknLCAnS0JEJywKLQkgICAgICAnbWF0aCcsICdFTScsCi0JICAgICAgJ3InLCAnJywJCQkjIHVuc3VwcG9ydGVkCi0JICAgICAgJ3NhbXAnLCAnIlNBTVAnLAkJIyB3aWxsIHB1dCBxdW90ZXMsIGNmLiAmYXBwbHlfc3R5bGUKLQkgICAgICAnc2MnLCAnJmRvX3NjJywJCSMgc3BlY2lhbCBjYXNlCi0JICAgICAgJ3N0cm9uZycsICdTVFJPTkcnLAotCSAgICAgICd0JywgJ1RUJywKLQkgICAgICAndGl0bGVmb250JywgJycsCQkjIHVzZWxlc3MKLQkgICAgICAndXJlZicsICcmZG9fdXJlZicsICAgICAgICMgaW5zZXJ0IGEgY2xpY2thYmxlIFVSTAotCSAgICAgICd1cmwnLCAnJmRvX3VybCcsICAgICAgICAgIyBpbnNlcnQgYSBjbGlja2FibGUgVVJMCi0JICAgICAgJ3ZhcicsICdWQVInLAotCSAgICAgICd3JywgJycsCQkJIyB1bnN1cHBvcnRlZAotCSAgICAgICk7Ci0KLSMKLSMgdGV4aW5mbyBmb3JtYXQgKEBmb28vQGVuZCBmb28pIHRvIEhUTUwgb25lcwotIwotJWZvcm1hdF9tYXAgPSAoCi0JICAgICAgICdkaXNwbGF5JywgJ1BSRScsCi0JICAgICAgICdleGFtcGxlJywgJ1BSRScsCi0JICAgICAgICdmb3JtYXQnLCAnUFJFJywKLQkgICAgICAgJ2xpc3AnLCAnUFJFJywKLQkgICAgICAgJ3F1b3RhdGlvbicsICdCTE9DS1FVT1RFJywKLQkgICAgICAgJ3NtYWxsZXhhbXBsZScsICdQUkUnLAotCSAgICAgICAnc21hbGxsaXNwJywgJ1BSRScsCi0JICAgICAgICMgbGlzdHMKLQkgICAgICAgJ2l0ZW1pemUnLCAnVUwnLAotCSAgICAgICAnZW51bWVyYXRlJywgJ09MJywKLQkgICAgICAgIyBwb29ybHkgc3VwcG9ydGVkCi0JICAgICAgICdmbHVzaGxlZnQnLCAnUFJFJywKLQkgICAgICAgJ2ZsdXNocmlnaHQnLCAnUFJFJywKLQkgICAgICAgKTsKLQotIwotIyB0ZXhpbmZvIGRlZmluaXRpb24gc2hvcnRjdXRzIHRvIHJlYWwgb25lcwotIwotJWRlZl9tYXAgPSAoCi0JICAgICMgYmFzaWMgY29tbWFuZHMKLQkgICAgJ2RlZmZuJywgMCwKLQkgICAgJ2RlZnZyJywgMCwKLQkgICAgJ2RlZnR5cGVmbicsIDAsCi0JICAgICdkZWZ0eXBldnInLCAwLAotCSAgICAnZGVmY3YnLCAwLAotCSAgICAnZGVmb3AnLCAwLAotCSAgICAnZGVmdHAnLCAwLAotCSAgICAjIGJhc2ljIHggY29tbWFuZHMKLQkgICAgJ2RlZmZueCcsIDAsCi0JICAgICdkZWZ2cngnLCAwLAotCSAgICAnZGVmdHlwZWZueCcsIDAsCi0JICAgICdkZWZ0eXBldnJ4JywgMCwKLQkgICAgJ2RlZmN2eCcsIDAsCi0JICAgICdkZWZvcHgnLCAwLAotCSAgICAnZGVmdHB4JywgMCwKLQkgICAgIyBzaG9ydGN1dHMKLQkgICAgJ2RlZnVuJywgJ2RlZmZuIEZ1bmN0aW9uJywKLQkgICAgJ2RlZm1hYycsICdkZWZmbiBNYWNybycsCi0JICAgICdkZWZzcGVjJywgJ2RlZmZuIHtTcGVjaWFsIEZvcm19JywKLQkgICAgJ2RlZnZhcicsICdkZWZ2ciBWYXJpYWJsZScsCi0JICAgICdkZWZvcHQnLCAnZGVmdnIge1VzZXIgT3B0aW9ufScsCi0JICAgICdkZWZ0eXBlZnVuJywgJ2RlZnR5cGVmbiBGdW5jdGlvbicsCi0JICAgICdkZWZ0eXBldmFyJywgJ2RlZnR5cGV2ciBWYXJpYWJsZScsCi0JICAgICdkZWZpdmFyJywgJ2RlZmN2IHtJbnN0YW5jZSBWYXJpYWJsZX0nLAotCSAgICAnZGVmbWV0aG9kJywgJ2RlZm9wIE1ldGhvZCcsCi0JICAgICMgeCBzaG9ydGN1dHMKLQkgICAgJ2RlZnVueCcsICdkZWZmbnggRnVuY3Rpb24nLAotCSAgICAnZGVmbWFjeCcsICdkZWZmbnggTWFjcm8nLAotCSAgICAnZGVmc3BlY3gnLCAnZGVmZm54IHtTcGVjaWFsIEZvcm19JywKLQkgICAgJ2RlZnZhcngnLCAnZGVmdnJ4IFZhcmlhYmxlJywKLQkgICAgJ2RlZm9wdHgnLCAnZGVmdnJ4IHtVc2VyIE9wdGlvbn0nLAotCSAgICAnZGVmdHlwZWZ1bngnLCAnZGVmdHlwZWZueCBGdW5jdGlvbicsCi0JICAgICdkZWZ0eXBldmFyeCcsICdkZWZ0eXBldnJ4IFZhcmlhYmxlJywKLQkgICAgJ2RlZml2YXJ4JywgJ2RlZmN2eCB7SW5zdGFuY2UgVmFyaWFibGV9JywKLQkgICAgJ2RlZm1ldGhvZHgnLCAnZGVmb3B4IE1ldGhvZCcsCi0JICAgICk7Ci0KLSMKLSMgdGhpbmdzIHRvIHNraXAKLSMKLSV0b19za2lwID0gKAotCSAgICAjIGNvbW1lbnRzCi0JICAgICdjJywgMSwKLQkgICAgJ2NvbW1lbnQnLCAxLAotCSAgICAjIHVzZWxlc3MKLQkgICAgJ2NvbnRlbnRzJywgMSwKLQkgICAgJ3Nob3J0Y29udGVudHMnLCAxLAotCSAgICAnc3VtbWFyeWNvbnRlbnRzJywgMSwKLQkgICAgJ2Zvb3Rub3Rlc3R5bGUnLCAxLAotCSAgICAnZW5kIGlmY2xlYXInLCAxLAotCSAgICAnZW5kIGlmc2V0JywgMSwKLQkgICAgJ3RpdGxlcGFnZScsIDEsCi0JICAgICdlbmQgdGl0bGVwYWdlJywgMSwKLQkgICAgIyB1bnN1cHBvcnRlZCBjb21tYW5kcyAoZm9ybWF0dGluZykKLQkgICAgJ2Fmb3VycGFwZXInLCAxLAotCSAgICAnY3JvcG1hcmtzJywgMSwKLQkgICAgJ2ZpbmFsb3V0JywgMSwKLQkgICAgJ2hlYWRpbmdzJywgMSwKLQkgICAgJ25lZWQnLCAxLAotCSAgICAncGFnZScsIDEsCi0JICAgICdzZXRjaGFwdGVybmV3cGFnZScsIDEsCi0JICAgICdldmVyeWhlYWRpbmcnLCAxLAotCSAgICAnZXZlcnlmb290aW5nJywgMSwKLQkgICAgJ2V2ZW5oZWFkaW5nJywgMSwKLQkgICAgJ2V2ZW5mb290aW5nJywgMSwKLQkgICAgJ29kZGhlYWRpbmcnLCAxLAotCSAgICAnb2RkZm9vdGluZycsIDEsCi0JICAgICdzbWFsbGJvb2snLCAxLAotCSAgICAndnNraXAnLCAxLAotCSAgICAnZmlsYnJlYWsnLCAxLAotCSAgICAncGFyYWdyYXBoaW5kZW50JywgMSwKLQkgICAgIyB1bnN1cHBvcnRlZCBmb3JtYXRzCi0JICAgICdjYXJ0b3VjaGUnLCAxLAotCSAgICAnZW5kIGNhcnRvdWNoZScsIDEsCi0JICAgICdncm91cCcsIDEsCi0JICAgICdlbmQgZ3JvdXAnLCAxLAotCSAgICApOwotCi0jKysrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgQXJndW1lbnQgcGFyc2luZywgaW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIy0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotJXZhbHVlID0gKCk7CQkJCSMgaG9sZCB0ZXhpbmZvIHZhcmlhYmxlcywgc2VlIGFsc28gLUQKLQotJHVzZV9iaWJsaW9ncmFwaHkgPSAxOwotJHVzZV9hY2MgPSAwOwotJGRlYnVnID0gMDsKLSRkb2N0eXBlID0gJyc7Ci0kY2hlY2sgPSAwOwotJGV4cGFuZGluZm8gPSAwOwotJHVzZV9nbG9zc2FyeSA9IDA7Ci0kaW52aXNpYmxlX21hcmsgPSAnJzsKLSR1c2VfaXNvID0gMDsKLUBpbmNsdWRlX2RpcnMgPSAoKTsKLSRzaG93X21lbnUgPSAwOwotJG51bWJlcl9zZWN0aW9ucyA9IDA7Ci0kc3BsaXRfbm9kZSA9IDA7Ci0kc3BsaXRfY2hhcHRlciA9IDA7Ci0kbW9ub2xpdGhpYyA9IDA7Ci0kdmVyYm9zZSA9IDA7Ci0kdXNhZ2UgPSA8PEVPVDsKLVRoaXMgaXMgJFRISVNQUk9HCi1UbyBjb252ZXJ0IGEgVGV4aW5mbyBmaWxlIHRvIEhNVEw6ICQwIFtvcHRpb25zXSBmaWxlCi0gIHdoZXJlIG9wdGlvbnMgY2FuIGJlOgotICAgIC1leHBhbmRpbmZvICAgIDogdXNlIFxAaWZpbmZvIHNlY3Rpb25zLCBub3QgXEBpZnRleAotICAgIC1nbG9zc2FyeSAgICAgIDogaGFuZGxlIGEgZ2xvc3NhcnkKLSAgICAtaW52aXNpYmxlIG5hbWU6IHVzZSAnbmFtZScgYXMgYW4gaW52aXNpYmxlIGFuY2hvcgotICAgIC1EbmFtZSAgICAgICAgIDogZGVmaW5lIG5hbWUgbGlrZSB3aXRoIFxAc2V0Ci0gICAgLUkgZGlyICAgICAgICAgOiBzZWFyY2ggYWxzbyBmb3IgZmlsZXMgaW4gJ2RpcicKLSAgICAtbWVudSAgICAgICAgICA6IGhhbmRsZSBtZW51cwotICAgIC1tb25vbGl0aGljICAgIDogb3V0cHV0IG9ubHkgb25lIGZpbGUgaW5jbHVkaW5nIFRvQwotICAgIC1udW1iZXIgICAgICAgIDogbnVtYmVyIHNlY3Rpb25zCi0gICAgLXNwbGl0X2NoYXB0ZXIgOiBzcGxpdCBvbiBtYWluIHNlY3Rpb25zCi0gICAgLXNwbGl0X25vZGUgICAgOiBzcGxpdCBvbiBub2RlcwotICAgIC11c2FnZSAgICAgICAgIDogcHJpbnQgdXNhZ2UgaW5zdHJ1Y3Rpb25zCi0gICAgLXZlcmJvc2UgICAgICAgOiB2ZXJib3NlIG91dHB1dAotVG8gY2hlY2sgY29udmVydGVkIGZpbGVzOiAkMCAtY2hlY2sgWy12ZXJib3NlXSBmaWxlcwotRU9UCi0KLXdoaWxlIChAQVJHViAmJiAkQVJHVlswXSA9fiAvXi0vKSB7Ci0gICAgJF8gPSBzaGlmdChAQVJHVik7Ci0gICAgaWYgKC9eLWFjYyQvKSAgICAgICAgICAgIHsgJHVzZV9hY2MgPSAxOyBuZXh0OyB9Ci0gICAgaWYgKC9eLWQoZWJ1Zyk/KFxkKyk/JC8pIHsgJGRlYnVnID0gJDIgfHwgc2hpZnQoQEFSR1YpOyBuZXh0OyB9Ci0gICAgaWYgKC9eLWRvY3R5cGUkLykgICAgICAgIHsgJGRvY3R5cGUgPSBzaGlmdChAQVJHVik7IG5leHQ7IH0KLSAgICBpZiAoL14tYyhoZWNrKT8kLykgICAgICAgeyAkY2hlY2sgPSAxOyBuZXh0OyB9Ci0gICAgaWYgKC9eLWUoeHBhbmRpbmZvKT8kLykgIHsgJGV4cGFuZGluZm8gPSAxOyBuZXh0OyB9Ci0gICAgaWYgKC9eLWcobG9zc2FyeSk/JC8pICAgIHsgJHVzZV9nbG9zc2FyeSA9IDE7IG5leHQ7IH0KLSAgICBpZiAoL14taShudmlzaWJsZSk/JC8pICAgeyAkaW52aXNpYmxlX21hcmsgPSBzaGlmdChAQVJHVik7IG5leHQ7IH0KLSAgICBpZiAoL14taXNvJC8pICAgICAgICAgICAgeyAkdXNlX2lzbyA9IDE7IG5leHQ7IH0KLSAgICBpZiAoL14tRCguKyk/JC8pICAgICAgICAgeyAkdmFsdWV7JDEgfHwgc2hpZnQoQEFSR1YpfSA9IDE7IG5leHQ7IH0KLSAgICBpZiAoL14tSSguKyk/JC8pICAgICAgICAgeyBwdXNoKEBpbmNsdWRlX2RpcnMsICQxIHx8IHNoaWZ0KEBBUkdWKSk7IG5leHQ7IH0KLSAgICBpZiAoL14tbShlbnUpPyQvKSAgICAgICAgeyAkc2hvd19tZW51ID0gMTsgbmV4dDsgfQotICAgIGlmICgvXi1tb25vKGxpdGhpYyk/JC8pICB7ICRtb25vbGl0aGljID0gMTsgbmV4dDsgfQotICAgIGlmICgvXi1uKHVtYmVyKT8kLykgICAgICB7ICRudW1iZXJfc2VjdGlvbnMgPSAxOyBuZXh0OyB9Ci0gICAgaWYgKC9eLXMocGxpdCk/Xz8obihvZGUpP3xjKGhhcHRlcik/KT8kLykgewotCWlmICgkMiA9fiAvXm4vKSB7Ci0JICAgICRzcGxpdF9ub2RlID0gMTsKLQl9IGVsc2UgewotCSAgICAkc3BsaXRfY2hhcHRlciA9IDE7Ci0JfQotCW5leHQ7Ci0gICAgfQotICAgIGlmICgvXi12KGVyYm9zZSk/JC8pICAgICB7ICR2ZXJib3NlID0gMTsgbmV4dDsgfQotICAgIGRpZSAkdXNhZ2U7Ci19Ci1pZiAoJGNoZWNrKSB7Ci0gICAgZGllICR1c2FnZSB1bmxlc3MgQEFSR1YgPiAwOwotICAgICZjaGVjazsKLSAgICBleGl0OwotfQotCi1pZiAoKCRzcGxpdF9ub2RlIHx8ICRzcGxpdF9jaGFwdGVyKSAmJiAkbW9ub2xpdGhpYykgewotICAgIHdhcm4gIkNhbid0IHVzZSAtbW9ub2xpdGhpYyB3aXRoIC1zcGxpdCwgLW1vbm9saXRoaWMgaWdub3JlZC5cbiI7Ci0gICAgJG1vbm9saXRoaWMgPSAwOwotfQotaWYgKCRleHBhbmRpbmZvKSB7Ci0gICAgJHRvX3NraXB7J2lmaW5mbyd9Kys7Ci0gICAgJHRvX3NraXB7J2VuZCBpZmluZm8nfSsrOwotfSBlbHNlIHsKLSAgICAkdG9fc2tpcHsnaWZ0ZXgnfSsrOwotICAgICR0b19za2lweydlbmQgaWZ0ZXgnfSsrOwotfQotJGludmlzaWJsZV9tYXJrID0gJzxJTUcgU1JDPSJpbnZpc2libGUueGJtIj4nIGlmICRpbnZpc2libGVfbWFyayBlcSAneGJtJzsKLWRpZSAkdXNhZ2UgdW5sZXNzIEBBUkdWID09IDE7Ci0kZG9jdSA9IHNoaWZ0KEBBUkdWKTsKLWlmICgkZG9jdSA9fiAvLipcLy8pIHsKLSAgICBjaG9wKCRkb2N1X2RpciA9ICQmKTsKLSAgICAkZG9jdV9uYW1lID0gJCc7Ci19IGVsc2UgewotICAgICRkb2N1X2RpciA9ICcuJzsKLSAgICAkZG9jdV9uYW1lID0gJGRvY3U7Ci19Ci11bnNoaWZ0KEBpbmNsdWRlX2RpcnMsICRkb2N1X2Rpcik7Ci0kZG9jdV9uYW1lID1+IHMvXC50ZT94KGl8aW5mbyk/JC8vOwkjIGJhc2VuYW1lIG9mIHRoZSBkb2N1bWVudAotCi0kZG9jdV9kb2MgPSAiJGRvY3VfbmFtZS5odG1sIjsJCSMgZG9jdW1lbnQncyBjb250ZW50cwotaWYgKCRtb25vbGl0aGljKSB7Ci0gICAgJGRvY3VfdG9jID0gJGRvY3VfZm9vdCA9ICRkb2N1X2RvYzsKLX0gZWxzZSB7Ci0gICAgJGRvY3VfdG9jICA9ICIke2RvY3VfbmFtZX1fdG9jLmh0bWwiOyAgIyBkb2N1bWVudCdzIHRhYmxlIG9mIGNvbnRlbnRzCi0gICAgJGRvY3VfZm9vdCA9ICIke2RvY3VfbmFtZX1fZm9vdC5odG1sIjsgIyBkb2N1bWVudCdzIGZvb3Rub3RlcwotfQotCi0jCi0jIHZhcmlhYmxlcwotIwotJHZhbHVleydodG1sJ30gPSAxOwkJCSMgcHJlZGVmaW5lIGh0bWwgKHRoZSBvdXRwdXQgZm9ybWF0KQotJHZhbHVleyd0ZXhpMmh0bWwnfSA9ICcxLjUyJzsJCSMgcHJlZGVmaW5lIHRleGkyaHRtbCAodGhlIHRyYW5zbGF0b3IpCi0jIF9mb286IGludGVybmFsIHRvIHRyYWNrIEBmb28KLWZvcmVhY2ggKCdfYXV0aG9yJywgJ190aXRsZScsICdfc3VidGl0bGUnLAotCSAnX3NldHRpdGxlJywgJ19zZXRmaWxlbmFtZScpIHsKLSAgICAkdmFsdWV7JF99ID0gJyc7CQkgICAgICAgICMgcHJldmVudCAtdyB3YXJuaW5ncwotfQotJW5vZGUyc2VjID0gKCk7CQkJCSMgbm9kZSB0byBzZWN0aW9uIG5hbWUKLSVub2RlMmhyZWYgPSAoKTsJCQkjIG5vZGUgdG8gSFJFRgotJWJpYjJocmVmID0gKCk7CQkJCSMgYmlibGlvZ3JhcGh5IHJlZmVyZW5jZSB0byBIUkVGCi0lZ2xvc3MyaHJlZiA9ICgpOwkJCSMgZ2xvc3NhcnkgdGVybSB0byBIUkVGCi1Ac2VjdGlvbnMgPSAoKTsJCQkJIyBsaXN0IG9mIHNlY3Rpb25zCi0ldGFnMnBybyA9ICgpOwkJCQkjIHByb3RlY3RlZCBzZWN0aW9ucwotCi0jCi0jIGluaXRpYWwgaW5kZXhlcwotIwotJGJpYl9udW0gPSAwOwotJGZvb3RfbnVtID0gMDsKLSRnbG9zc19udW0gPSAwOwotJGlkeF9udW0gPSAwOwotJHNlY19udW0gPSAwOwotJGRvY19udW0gPSAwOwotJGh0bWxfbnVtID0gMDsKLQotIwotIyBjYW4gSSB1c2UgSVNPODg3OSBjaGFyYWN0ZXJzPyAoSFRNTCspCi0jCi1pZiAoJHVzZV9pc28pIHsKLSAgICAkdGhpbmdzX21hcHsnYnVsbGV0J30gPSAiJmJ1bGw7IjsKLSAgICAkdGhpbmdzX21hcHsnY29weXJpZ2h0J30gPSAiJmNvcHk7IjsKLSAgICAkdGhpbmdzX21hcHsnZG90cyd9ID0gIiZoZWxsaXA7IjsKLSAgICAkdGhpbmdzX21hcHsnZXF1aXYnfSA9ICImZXF1aXY7IjsKLSAgICAkdGhpbmdzX21hcHsnZXhwYW5zaW9uJ30gPSAiJnJhcnI7IjsKLSAgICAkdGhpbmdzX21hcHsncG9pbnQnfSA9ICImbG93YXN0OyI7Ci0gICAgJHRoaW5nc19tYXB7J3Jlc3VsdCd9ID0gIiZyQXJyOyI7Ci19Ci0KLSMKLSMgcmVhZCB0ZXhpMmh0bWwgZXh0ZW5zaW9ucyAoaWYgYW55KQotIwotJGV4dGVuc2lvbnMgPSAndGV4aTJodG1sLmV4dCc7ICMgZXh0ZW5zaW9ucyBpbiB3b3JraW5nIGRpcmVjdG9yeQotaWYgKC1mICRleHRlbnNpb25zKSB7Ci0gICAgcHJpbnQgIiMgcmVhZGluZyBleHRlbnNpb25zIGZyb20gJGV4dGVuc2lvbnNcbiIgaWYgJHZlcmJvc2U7Ci0gICAgcmVxdWlyZSgkZXh0ZW5zaW9ucyk7Ci19Ci0oJHByb2dkaXIgPSAkMCkgPX4gcy9bXlwvXSskLy87Ci1pZiAoJHByb2dkaXIgJiYgKCRwcm9nZGlyIG5lICcuLycpKSB7Ci0gICAgJGV4dGVuc2lvbnMgPSAiJHtwcm9nZGlyfXRleGkyaHRtbC5leHQiOyAjIGV4dGVuc2lvbnMgaW4gdGV4aTJodG1sIGRpcmVjdG9yeQotICAgIGlmICgtZiAkZXh0ZW5zaW9ucykgewotCXByaW50ICIjIHJlYWRpbmcgZXh0ZW5zaW9ucyBmcm9tICRleHRlbnNpb25zXG4iIGlmICR2ZXJib3NlOwotCXJlcXVpcmUoJGV4dGVuc2lvbnMpOwotICAgIH0KLX0KLQotcHJpbnQgIiMgcmVhZGluZyBmcm9tICRkb2N1XG4iIGlmICR2ZXJib3NlOwotCi0jKysrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgUGFzcyAxOiByZWFkIHNvdXJjZSwgaGFuZGxlIGNvbW1hbmQsIHZhcmlhYmxlLCBzaW1wbGUgc3Vic3RpdHV0aW9uICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIy0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQGxpbmVzID0gKCk7CQkJCSMgd2hvbGUgZG9jdW1lbnQKLUB0b2NfbGluZXMgPSAoKTsJCQkjIHRhYmxlIG9mIGNvbnRlbnRzCi0kdG9wbGV2ZWwgPSAwOwkJCSAgICAgICAgIyB0b3AgbGV2ZWwgc2VlbiBpbiBoaWVyYXJjaHkKLSRjdXJsZXZlbCA9IDA7CQkJCSMgY3VycmVudCBsZXZlbCBpbiBUT0MKLSRub2RlID0gJyc7CQkJCSMgY3VycmVudCBub2RlIG5hbWUKLSRpbl90YWJsZSA9IDA7CQkJCSMgYW0gSSBpbnNpZGUgYSB0YWJsZQotJHRhYmxlX3R5cGUgPSAnJzsJCQkjIHR5cGUgb2YgdGFibGUgKCcnLCAnZicsICd2JywgJ211bHRpJykKLUB0YWJsZXMgPSAoKTsJCQkgICAgICAgICMgbmVzdGVkIHRhYmxlIHN1cHBvcnQKLSRpbl9iaWJsaW9ncmFwaHkgPSAwOwkJCSMgYW0gSSBpbnNpZGUgYSBiaWJsaW9ncmFwaHkKLSRpbl9nbG9zc2FyeSA9IDA7CQkJIyBhbSBJIGluc2lkZSBhIGdsb3NzYXJ5Ci0kaW5fdG9wID0gMDsJCQkJIyBhbSBJIGluc2lkZSB0aGUgdG9wIG5vZGUKLSRpbl9wcmUgPSAwOwkJCQkjIGFtIEkgaW5zaWRlIGEgcHJlZm9ybWF0dGVkIHNlY3Rpb24KLSRpbl9saXN0ID0gMDsJCQkJIyBhbSBJIGluc2lkZSBhIGxpc3QKLSRpbl9odG1sID0gMDsJCQkJIyBhbSBJIGluc2lkZSBhbiBIVE1MIHNlY3Rpb24KLSRmaXJzdF9saW5lID0gMTsJCSAgICAgICAgIyBpcyBpdCB0aGUgZmlyc3QgbGluZQotJGRvbnRfaHRtbCA9IDA7CQkJCSMgZG9uJ3QgcHJvdGVjdCBIVE1MIG9uIHRoaXMgbGluZQotJHNwbGl0X251bSA9IDA7CQkJCSMgc3BsaXQgaW5kZXgKLSRkZWZlcnJlZF9yZWYgPSAnJzsJCQkjIGRlZmVycmVkIHJlZmVyZW5jZSBmb3IgaW5kZXhlcwotQGh0bWxfc3RhY2sgPSAoKTsJCQkjIEhUTUwgZWxlbWVudHMgc3RhY2sKLSRodG1sX2VsZW1lbnQgPSAnJzsJCQkjIGN1cnJlbnQgSFRNTCBlbGVtZW50Ci0maHRtbF9yZXNldDsKLQotIyBidWlsZCBjb2RlIGZvciBzaW1wbGUgc3Vic3RpdHV0aW9ucwotIyB0aGUgbWFwcyB1c2VkICglc2ltcGxlX21hcCBhbmQgJXRoaW5nc19tYXApIE1VU1QgYmUgYXdhcmUgb2YgdGhpcwotIyB3YXRjaCBvdXQgZm9yIHJlZ2V4cHMsIC8gYW5kIGVzY2FwZWQgY2hhcmFjdGVycyEKLSRzdWJzdF9jb2RlID0gJyc7Ci1mb3JlYWNoIChrZXlzKCVzaW1wbGVfbWFwKSkgewotICAgICgkcmUgPSAkXykgPX4gcy8oXFcpL1xcJDEvZzsgIyBwcm90ZWN0IHJlZ2V4cCBjaGFycwotICAgICRzdWJzdF9jb2RlIC49ICJzL1xcXEAkcmUvJHNpbXBsZV9tYXB7JF99L2c7XG4iOwotfQotZm9yZWFjaCAoa2V5cygldGhpbmdzX21hcCkpIHsKLSAgICAkc3Vic3RfY29kZSAuPSAicy9cXFxAJF9cXHtcXH0vJHRoaW5nc19tYXB7JF99L2c7XG4iOwotfQotaWYgKCR1c2VfYWNjKSB7Ci0gICAgIyBhY2NlbnR1YXRlZCBjaGFyYWN0ZXJzCi0gICAgZm9yZWFjaCAoa2V5cyglYWNjZW50X21hcCkpIHsKLQlpZiAoJF8gZXEgImAiKSB7Ci0JICAgICRzdWJzdF9jb2RlIC49ICJzLyQ7MyI7Ci0JfSBlbHNpZiAoJF8gZXEgIiciKSB7Ci0JICAgICRzdWJzdF9jb2RlIC49ICJzLyQ7NCI7Ci0JfSBlbHNlIHsKLQkgICAgJHN1YnN0X2NvZGUgLj0gInMvXFxcQFxcJF8iOwotCX0KLQkkc3Vic3RfY29kZSAuPSAiKFthZWlvdV0pLyZcJHsxfSRhY2NlbnRfbWFweyRffTsvZ2k7XG4iOwotICAgIH0KLX0KLWV2YWwoInN1YiBzaW1wbGVfc3Vic3RpdHV0aW9ucyB7ICRzdWJzdF9jb2RlIH0iKTsKLQotJmluaXRfaW5wdXQ7Ci13aGlsZSAoJF8gPSAmbmV4dF9saW5lKSB7Ci0gICAgIwotICAgICMgcmVtb3ZlIFxpbnB1dCBvbiB0aGUgZmlyc3QgbGluZXMgb25seQotICAgICMKLSAgICBpZiAoJGZpcnN0X2xpbmUpIHsKLQluZXh0IGlmIC9eXFxpbnB1dC87Ci0JJGZpcnN0X2xpbmUgPSAwOwotICAgIH0KLSAgICAjCi0gICAgIyBwYXJzZSB0ZXhpbmZvIHRhZ3MKLSAgICAjCi0gICAgJHRhZyA9ICcnOwotICAgICRlbmRfdGFnID0gJyc7Ci0gICAgaWYgKC9eXEBlbmRccysoXHcrKVxiLykgewotCSRlbmRfdGFnID0gJDE7Ci0gICAgfSBlbHNpZiAoL15cQChcdyspXGIvKSB7Ci0JJHRhZyA9ICQxOwotICAgIH0KLSAgICAjCi0gICAgIyBoYW5kbGUgQGlmaHRtbCAvIEBlbmQgaWZodG1sCi0gICAgIwotICAgIGlmICgkaW5faHRtbCkgewotCWlmICgkZW5kX3RhZyBlcSAnaWZodG1sJykgewotCSAgICAkaW5faHRtbCA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgJHRhZzJwcm97JGluX2h0bWx9IC49ICRfOwotCX0KLQluZXh0OwotICAgIH0gZWxzaWYgKCR0YWcgZXEgJ2lmaHRtbCcpIHsKLQkkaW5faHRtbCA9ICRQUk9URUNUVEFHIC4gKyskaHRtbF9udW07Ci0JcHVzaChAbGluZXMsICRpbl9odG1sKTsKLQluZXh0OwotICAgIH0KLSAgICAjCi0gICAgIyB0cnkgdG8gc2tpcCB0aGUgbGluZQotICAgICMKLSAgICBpZiAoJGVuZF90YWcpIHsKLQluZXh0IGlmICR0b19za2lweyJlbmQgJGVuZF90YWcifTsKLSAgICB9IGVsc2lmICgkdGFnKSB7Ci0JbmV4dCBpZiAkdG9fc2tpcHskdGFnfTsKLQlsYXN0IGlmICR0YWcgZXEgJ2J5ZSc7Ci0gICAgfQotICAgIGlmICgkaW5fdG9wKSB7Ci0JIyBwYXJzaW5nIHRoZSB0b3Agbm9kZQotCWlmICgkdGFnIGVxICdub2RlJyB8fCAkdGFnIGVxICdpbmNsdWRlJyB8fCAkc2VjMmxldmVseyR0YWd9KSB7Ci0JICAgICMgbm8gbW9yZSBpbiB0b3AKLQkgICAgJGluX3RvcCA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgIyBza2lwIGl0Ci0JICAgIG5leHQ7Ci0JfQotICAgIH0KLSAgICAjCi0gICAgIyB0cnkgdG8gcmVtb3ZlIGlubGluZWQgY29tbWVudHMKLSAgICAjIHN5bnRheCBmcm9tIHRleC1tb2RlLmVsIGNvbW1lbnQtc3RhcnQtc2tpcAotICAgICMKLSAgICBzLygoXnxbXlxAXSkoXEBcQCkqKVxAYyhvbW1lbnQpPyAuKi8kMS87Ci0gICAgIyBub24tQCBzdWJzdGl0dXRpb25zIGNmLiB0ZXhpbmZtdC5lbAotICAgIHVubGVzcyAoJGluX3ByZSkgewotCXMvYGAvXCIvZzsKLQlzLycnL1wiL2c7Ci0Jcy8oW1x3IF0pLS0tKFtcdyBdKS8kMS0tJDIvZzsKLSAgICB9Ci0gICAgIwotICAgICMgYW5hbHl6ZSB0aGUgdGFnCi0gICAgIwotICAgIGlmICgkdGFnKSB7Ci0JIyBza2lwIGxpbmVzCi0JJnNraXBfdW50aWwoJHRhZyksIG5leHQgaWYgJHRhZyBlcSAnaWdub3JlJzsKLQlpZiAoJGV4cGFuZGluZm8pIHsKLQkgICAgJnNraXBfdW50aWwoJHRhZyksIG5leHQgaWYgJHRhZyBlcSAnaWZ0ZXgnOwotCX0gZWxzZSB7Ci0JICAgICZza2lwX3VudGlsKCR0YWcpLCBuZXh0IGlmICR0YWcgZXEgJ2lmaW5mbyc7Ci0JfQotCSZza2lwX3VudGlsKCR0YWcpLCBuZXh0IGlmICR0YWcgZXEgJ3RleCc7Ci0JIyBoYW5kbGUgc3BlY2lhbCB0YWJsZXMKLQlpZiAoJHRhZyA9fiAvXih8Znx2fG11bHRpKXRhYmxlJC8pIHsKLQkgICAgJHRhYmxlX3R5cGUgPSAkMTsKLQkgICAgJHRhZyA9ICd0YWJsZSc7Ci0JfQotCSMgc3BlY2lhbCBjYXNlcwotCWlmICgkdGFnIGVxICd0b3AnIHx8ICgkdGFnIGVxICdub2RlJyAmJiAvXlxAbm9kZVxzK3RvcFxzKiwvaSkpIHsKLQkgICAgJGluX3RvcCA9IDE7Ci0JICAgIEBsaW5lcyA9ICgpOyAjIGlnbm9yZSBhbGwgbGluZXMgYmVmb3JlIHRvcCAodGl0bGUgcGFnZSBnYXJiYWdlKQotCSAgICBuZXh0OwotCX0gZWxzaWYgKCR0YWcgZXEgJ25vZGUnKSB7Ci0JICAgICRpbl90b3AgPSAwOwotCSAgICB3YXJuICIkRVJST1IgQmFkIG5vZGUgbGluZTogJF8iIHVubGVzcyAkXyA9fiAvXlxAbm9kZVxzJE5PREVTUkUkL287Ci0JICAgICRfID0gJnByb3RlY3RfaHRtbCgkXyk7ICMgaWYgbm9kZSBjb250YWlucyAnJicgZm9yIGluc3RhbmNlCi0JICAgIHMvXlxAbm9kZVxzKy8vOwotCSAgICAoJG5vZGUpID0gc3BsaXQoLywvKTsKLQkgICAgJm5vcm1hbGlzZV9ub2RlKCRub2RlKTsKLQkgICAgaWYgKCRzcGxpdF9ub2RlKSB7Ci0JCSZuZXh0X2RvYzsKLQkJcHVzaChAbGluZXMsICRTUExJVFRBRykgaWYgJHNwbGl0X251bSsrOwotCQlwdXNoKEBzZWN0aW9ucywgJG5vZGUpOwotCSAgICB9Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJHRhZyBlcSAnaW5jbHVkZScpIHsKLQkgICAgaWYgKC9eXEBpbmNsdWRlXHMrKCRGSUxFUkUpXHMqJC9vKSB7Ci0JCSRmaWxlID0gJDE7Ci0JCXVubGVzcyAoLWUgJGZpbGUpIHsKLQkJICAgIGZvcmVhY2ggJGRpciAoQGluY2x1ZGVfZGlycykgewotCQkJJGZpbGUgPSAiJGRpci8kMSI7Ci0JCQlsYXN0IGlmIC1lICRmaWxlOwotCQkgICAgfQotCQl9Ci0JCWlmICgtZSAkZmlsZSkgewotCQkgICAgJm9wZW4oJGZpbGUpOwotCQkgICAgcHJpbnQgIiMgaW5jbHVkaW5nICRmaWxlXG4iIGlmICR2ZXJib3NlOwotCQl9IGVsc2UgewotCQkgICAgd2FybiAiJEVSUk9SIENhbid0IGZpbmQgJGZpbGUsIHNraXBwaW5nIjsKLQkJfQotCSAgICB9IGVsc2UgewotCQl3YXJuICIkRVJST1IgQmFkIGluY2x1ZGUgbGluZTogJF8iOwotCSAgICB9Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJHRhZyBlcSAnaWZjbGVhcicpIHsKLQkgICAgaWYgKC9eXEBpZmNsZWFyXHMrKCRWQVJSRSlccyokL28pIHsKLQkJbmV4dCB1bmxlc3MgZGVmaW5lZCgkdmFsdWV7JDF9KTsKLQkJJnNraXBfdW50aWwoJHRhZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBCYWQgaWZjbGVhciBsaW5lOiAkXyI7Ci0JICAgIH0KLQkgICAgbmV4dDsKLQl9IGVsc2lmICgkdGFnIGVxICdpZnNldCcpIHsKLQkgICAgaWYgKC9eXEBpZnNldFxzKygkVkFSUkUpXHMqJC9vKSB7Ci0JCW5leHQgaWYgZGVmaW5lZCgkdmFsdWV7JDF9KTsKLQkJJnNraXBfdW50aWwoJHRhZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBCYWQgaWZzZXQgbGluZTogJF8iOwotCSAgICB9Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJHRhZyBlcSAnbWVudScpIHsKLQkgICAgdW5sZXNzICgkc2hvd19tZW51KSB7Ci0JCSZza2lwX3VudGlsKCR0YWcpOwotCQluZXh0OwotCSAgICB9Ci0JICAgICZodG1sX3B1c2hfaWYoJHRhZyk7Ci0JICAgIHB1c2goQGxpbmVzLCAmaHRtbF9kZWJ1ZygiXG4iLCBfX0xJTkVfXykpOwotCX0gZWxzaWYgKCRmb3JtYXRfbWFweyR0YWd9KSB7Ci0JICAgICRpbl9wcmUgPSAxIGlmICRmb3JtYXRfbWFweyR0YWd9IGVxICdQUkUnOwotCSAgICAmaHRtbF9wdXNoX2lmKCRmb3JtYXRfbWFweyR0YWd9KTsKLQkgICAgcHVzaChAbGluZXMsICZodG1sX2RlYnVnKCJcbiIsIF9fTElORV9fKSk7Ci0JICAgICRpbl9saXN0KysgaWYgJGZvcm1hdF9tYXB7JHRhZ30gZXEgJ1VMJyB8fCAkZm9ybWF0X21hcHskdGFnfSBlcSAnT0wnIDsKLQkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiPCRmb3JtYXRfbWFweyR0YWd9PlxuIiwgX19MSU5FX18pKTsKLQkgICAgbmV4dDsKLQl9IGVsc2lmICgkdGFnIGVxICd0YWJsZScpIHsKLQkgICAgaWYgKC9eXEAofGZ8dnxtdWx0aSl0YWJsZVxzK1xAKFx3KykvKSB7Ci0JCSRpbl90YWJsZSA9ICQyOwotCQl1bnNoaWZ0KEB0YWJsZXMsIGpvaW4oJDssICR0YWJsZV90eXBlLCAkaW5fdGFibGUpKTsKLQkJaWYgKCR0YWJsZV90eXBlIGVxICJtdWx0aSIpIHsKLQkJICAgIHB1c2goQGxpbmVzLCAmZGVidWcoIjxUQUJMRSBCT1JERVI+XG4iLCBfX0xJTkVfXykpOwotCQkgICAgJmh0bWxfcHVzaF9pZignVEFCTEUnKTsKLQkJfSBlbHNlIHsKLQkJICAgIHB1c2goQGxpbmVzLCAmZGVidWcoIjxETCBDT01QQUNUPlxuIiwgX19MSU5FX18pKTsKLQkJICAgICZodG1sX3B1c2hfaWYoJ0RMJyk7Ci0JCX0KLQkJcHVzaChAbGluZXMsICZodG1sX2RlYnVnKCJcbiIsIF9fTElORV9fKSk7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBCYWQgdGFibGUgbGluZTogJF8iOwotCSAgICB9Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJHRhZyBlcSAnc3luaW5kZXgnIHx8ICR0YWcgZXEgJ3N5bmNvZGVpbmRleCcpIHsKLQkgICAgaWYgKC9eXEAkdGFnXHMrKFx3KVx3XHMrKFx3KVx3XHMqJC8pIHsKLQkJZXZhbCgiKiR7MX1pbmRleCA9ICokezJ9aW5kZXgiKTsKLQkgICAgfSBlbHNlIHsKLQkJd2FybiAiJEVSUk9SIEJhZCBzeW4qaW5kZXggbGluZTogJF8iOwotCSAgICB9Ci0JICAgIG5leHQ7Ci0JfSBlbHNpZiAoJHRhZyBlcSAnc3AnKSB7Ci0JICAgIHB1c2goQGxpbmVzLCAmZGVidWcoIjxQPlxuIiwgX19MSU5FX18pKTsKLQkgICAgbmV4dDsKLQl9IGVsc2lmICgkdGFnIGVxICdzZXRyZWYnKSB7Ci0JICAgICZwcm90ZWN0X2h0bWw7ICMgaWYgc2V0cmVmIGNvbnRhaW5zICcmJyBmb3IgaW5zdGFuY2UKLQkgICAgaWYgKC9eXEAkdGFnXHMqeygkTk9ERVJFKX1ccyokLykgewotCQkkc2V0cmVmID0gJDE7Ci0JCSRzZXRyZWYgPX4gcy9ccysvIC9nOyAjIG5vcm1hbGl6ZQotCQkkc2V0cmVmID1+IHMvICQvLzsKLQkJJG5vZGUyc2VjeyRzZXRyZWZ9ID0gJG5hbWU7Ci0JCSRub2RlMmhyZWZ7JHNldHJlZn0gPSAiJGRvY3VfZG9jIyRkb2NpZCI7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBCYWQgc2V0cmVmIGxpbmU6ICRfIjsKLQkgICAgfQotCSAgICBuZXh0OwotCX0gZWxzaWYgKCR0YWcgZXEgJ2RlZmluZGV4JyB8fCAkdGFnIGVxICdkZWZjb2RlaW5kZXgnKSB7Ci0JICAgIGlmICgvXlxAJHRhZ1xzKyhcd1x3KVxzKiQvKSB7Ci0JCSR2YWxpZF9pbmRleHskMX0gPSAxOwotCSAgICB9IGVsc2UgewotCQl3YXJuICIkRVJST1IgQmFkIGRlZmluZGV4IGxpbmU6ICRfIjsKLQkgICAgfQotCSAgICBuZXh0OwotCX0gZWxzaWYgKGRlZmluZWQoJGRlZl9tYXB7JHRhZ30pKSB7Ci0JICAgIGlmICgkZGVmX21hcHskdGFnfSkgewotCQlzL15cQCR0YWdccysvLzsKLQkJJHRhZyA9ICRkZWZfbWFweyR0YWd9OwotCQkkXyA9ICJcQCR0YWcgJF8iOwotCQkkdGFnID1+IHMvXHMuKi8vOwotCSAgICB9Ci0JfSBlbHNpZiAoZGVmaW5lZCgkdXNlcl9zdWJ7JHRhZ30pKSB7Ci0JICAgIHMvXlxAJHRhZ1xzKy8vOwotCSAgICAkc3ViID0gJHVzZXJfc3VieyR0YWd9OwotCSAgICBwcmludCAiIyB1c2VyICR0YWcgPSAkc3ViLCBhcmc6ICRfIiBpZiAkZGVidWcgJiAkREVCVUdfVVNFUjsKLQkgICAgaWYgKGRlZmluZWQoJiRzdWIpKSB7Ci0JCWNob3AoJF8pOwotCQkmJHN1YigkXyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBCYWQgdXNlciBzdWIgZm9yICR0YWc6ICRzdWJcbiI7Ci0JICAgIH0KLQkgICAgbmV4dDsKLQl9Ci0JaWYgKGRlZmluZWQoJGRlZl9tYXB7JHRhZ30pKSB7Ci0JICAgIHMvXlxAJHRhZ1xzKy8vOwotCSAgICBpZiAoJHRhZyA9fiAveCQvKSB7Ci0JCSMgZXh0cmEgZGVmaW5pdGlvbiBsaW5lCi0JCSR0YWcgPSAkYDsKLQkJJGlzX2V4dHJhID0gMTsKLQkgICAgfSBlbHNlIHsKLQkJJGlzX2V4dHJhID0gMDsKLQkgICAgfQotCSAgICB3aGlsZSAoL1x7KFteXHtcfV0qKVx9LykgewotCQkjIHRoaXMgaXMgYSB7fSBjb25zdHJ1Y3QKLQkJKCRiZWZvcmUsICRjb250ZW50cywgJGFmdGVyKSA9ICgkYCwgJDEsICQnKTsKLQkJIyBwcm90ZWN0IHNwYWNlcwotCQkkY29udGVudHMgPX4gcy9ccysvJDs5L2c7Ci0JCSMgcmVzdG9yZSAkXyBwcm90ZWN0aW5nIHt9Ci0JCSRfID0gIiRiZWZvcmUkOzckY29udGVudHMkOzgkYWZ0ZXIiOwotCSAgICB9Ci0JICAgIEBhcmdzID0gc3BsaXQoL1xzKy8sICZwcm90ZWN0X2h0bWwoJF8pKTsKLQkgICAgZm9yZWFjaCAoQGFyZ3MpIHsKLQkJcy8kOzkvIC9nOwkjIHVucHJvdGVjdCBzcGFjZXMKLQkJcy8kOzcvXHsvZzsJIyAuLi4gewotCQlzLyQ7OC9cfS9nOwkjIC4uLiB9Ci0JICAgIH0KLQkgICAgJHR5cGUgPSBzaGlmdChAYXJncyk7Ci0JICAgICR0eXBlID1+IHMvXlx7KC4qKVx9JC8kMS87Ci0JICAgIHByaW50ICIjIGRlZiAoJHRhZyk6IHskdHlwZX0gIiwgam9pbignLCAnLCBAYXJncyksICJcbiIKLQkJaWYgJGRlYnVnICYgJERFQlVHX0RFRjsKLQkgICAgJHR5cGUgLj0gJzonOyAjIGl0J3MgbmljZXIgbGlrZSB0aGlzCi0JICAgICRuYW1lID0gc2hpZnQoQGFyZ3MpOwotCSAgICAkbmFtZSA9fiBzL15ceyguKilcfSQvJDEvOwotCSAgICBpZiAoJGlzX2V4dHJhKSB7Ci0JCSRfID0gJmRlYnVnKCI8RFQ+IiwgX19MSU5FX18pOwotCSAgICB9IGVsc2UgewotCQkkXyA9ICZkZWJ1ZygiPERMPlxuPERUPiIsIF9fTElORV9fKTsKLQkgICAgfQotCSAgICBpZiAoJHRhZyBlcSAnZGVmZm4nIHx8ICR0YWcgZXEgJ2RlZnZyJyB8fCAkdGFnIGVxICdkZWZ0cCcpIHsKLQkJJF8gLj0gIjxVPiR0eXBlPC9VPiA8Qj4kbmFtZTwvQj4iOwotCQkkXyAuPSAiIDxJPkBhcmdzPC9JPiIgaWYgQGFyZ3M7Ci0JICAgIH0gZWxzaWYgKCR0YWcgZXEgJ2RlZnR5cGVmbicgfHwgJHRhZyBlcSAnZGVmdHlwZXZyJwotCQkgICAgIHx8ICR0YWcgZXEgJ2RlZmN2JyB8fCAkdGFnIGVxICdkZWZvcCcpIHsKLQkJJGZ0eXBlID0gJG5hbWU7Ci0JCSRuYW1lID0gc2hpZnQoQGFyZ3MpOwotCQkkbmFtZSA9fiBzL15ceyguKilcfSQvJDEvOwotCQkkXyAuPSAiPFU+JHR5cGU8L1U+ICRmdHlwZSA8Qj4kbmFtZTwvQj4iOwotCQkkXyAuPSAiIDxJPkBhcmdzPC9JPiIgaWYgQGFyZ3M7Ci0JICAgIH0gZWxzZSB7Ci0JCXdhcm4gIiRFUlJPUiBVbmtub3duIGRlZmluaXRpb24gdHlwZTogJHRhZ1xuIjsKLQkJJF8gLj0gIjxVPiR0eXBlPC9VPiA8Qj4kbmFtZTwvQj4iOwotCQkkXyAuPSAiIDxJPkBhcmdzPC9JPiIgaWYgQGFyZ3M7Ci0JICAgIH0KLSAJICAgICRfIC49ICZkZWJ1ZygiXG48REQ+IiwgX19MSU5FX18pOwotCSAgICAkbmFtZSA9ICZ1bnByb3RlY3RfaHRtbCgkbmFtZSk7Ci0JICAgIGlmICgkdGFnIGVxICdkZWZmbicgfHwgJHRhZyBlcSAnZGVmdHlwZWZuJykgewotCQl1bnNoaWZ0KEBpbnB1dF9zcG9vbCwgIlxAZmluZGV4ICRuYW1lXG4iKTsKLQkgICAgfSBlbHNpZiAoJHRhZyBlcSAnZGVmb3AnKSB7Ci0JCXVuc2hpZnQoQGlucHV0X3Nwb29sLCAiXEBmaW5kZXggJG5hbWUgb24gJGZ0eXBlXG4iKTsKLQkgICAgfSBlbHNpZiAoJHRhZyBlcSAnZGVmdnInIHx8ICR0YWcgZXEgJ2RlZnR5cGV2cicgfHwgJHRhZyBlcSAnZGVmY3YnKSB7Ci0JCXVuc2hpZnQoQGlucHV0X3Nwb29sLCAiXEB2aW5kZXggJG5hbWVcbiIpOwotCSAgICB9IGVsc2UgewotCQl1bnNoaWZ0KEBpbnB1dF9zcG9vbCwgIlxAdGluZGV4ICRuYW1lXG4iKTsKLQkgICAgfQotCSAgICAkZG9udF9odG1sID0gMTsKLQl9Ci0gICAgfSBlbHNpZiAoJGVuZF90YWcpIHsKLQlpZiAoJGZvcm1hdF9tYXB7JGVuZF90YWd9KSB7Ci0JICAgICRpbl9wcmUgPSAwIGlmICRmb3JtYXRfbWFweyRlbmRfdGFnfSBlcSAnUFJFJzsKLQkgICAgJGluX2xpc3QtLSBpZiAkZm9ybWF0X21hcHskZW5kX3RhZ30gZXEgJ1VMJyB8fCAkZm9ybWF0X21hcHskZW5kX3RhZ30gZXEgJ09MJyA7Ci0JICAgICZodG1sX3BvcF9pZignTEknLCAnUCcpOwotCSAgICAmaHRtbF9wb3BfaWYoKTsKLQkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiPC8kZm9ybWF0X21hcHskZW5kX3RhZ30+XG4iLCBfX0xJTkVfXykpOwotCSAgICBwdXNoKEBsaW5lcywgJmh0bWxfZGVidWcoIlxuIiwgX19MSU5FX18pKTsKLQl9IGVsc2lmICgkZW5kX3RhZyA9fiAvXih8Znx2fG11bHRpKXRhYmxlJC8pIHsKLQkgICAgdW5sZXNzIChAdGFibGVzKSB7Ci0JCXdhcm4gIiRFUlJPUiBcQGVuZCAkZW5kX3RhZyB3aXRob3V0IFxAKnRhYmxlXG4iOwotCQluZXh0OwotCSAgICB9Ci0JICAgICgkdGFibGVfdHlwZSwgJGluX3RhYmxlKSA9IHNwbGl0KCQ7LCBzaGlmdChAdGFibGVzKSk7Ci0JICAgIHVubGVzcyAoJDEgZXEgJHRhYmxlX3R5cGUpIHsKLQkJd2FybiAiJEVSUk9SIFxAZW5kICRlbmRfdGFnIHdpdGhvdXQgbWF0Y2hpbmcgXEAkZW5kX3RhZ1xuIjsKLQkJbmV4dDsKLQkgICAgfQotCSAgICBpZiAoJHRhYmxlX3R5cGUgZXEgIm11bHRpIikgewotCQlwdXNoKEBsaW5lcywgIjwvVFI+PC9UQUJMRT5cbiIpOwotCQkmaHRtbF9wb3BfaWYoJ1RSJyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXB1c2goQGxpbmVzLCAiPC9ETD5cbiIpOwotCQkmaHRtbF9wb3BfaWYoJ0REJyk7Ci0JICAgIH0KLQkgICAgJmh0bWxfcG9wX2lmKCk7Ci0JICAgIGlmIChAdGFibGVzKSB7Ci0JCSgkdGFibGVfdHlwZSwgJGluX3RhYmxlKSA9IHNwbGl0KCQ7LCAkdGFibGVzWzBdKTsKLQkgICAgfSBlbHNlIHsKLQkJJGluX3RhYmxlID0gMDsKLQkgICAgfQotCX0gZWxzaWYgKGRlZmluZWQoJGRlZl9tYXB7JGVuZF90YWd9KSkgewotIAkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiPC9ETD5cbiIsIF9fTElORV9fKSk7Ci0JfSBlbHNpZiAoJGVuZF90YWcgZXEgJ21lbnUnKSB7Ci0JICAgICZodG1sX3BvcF9pZigpOwotCSAgICBwdXNoKEBsaW5lcywgJF8pOyAjIG11c3Qga2VlcCBpdCBmb3IgcGFzcyAyCi0JfQotCW5leHQ7Ci0gICAgfQotICAgICMKLSAgICAjIG1pc2MgdGhpbmdzCi0gICAgIwotICAgICMgcHJvdGVjdCB0ZXhpIGFuZCBIVE1MIHRoaW5ncwotICAgICZwcm90ZWN0X3RleGk7Ci0gICAgJF8gPSAmcHJvdGVjdF9odG1sKCRfKSB1bmxlc3MgJGRvbnRfaHRtbDsKLSAgICAkZG9udF9odG1sID0gMDsKLSAgICAjIHN1YnN0aXR1dGlvbiAodW5zdXBwb3J0ZWQgdGhpbmdzKQotICAgIHMvXlxAY2VudGVyXHMrLy9nOwotICAgIHMvXlxAZXhkZW50XHMrLy9nOwotICAgIHMvXEBub2luZGVudFxzKy8vZzsKLSAgICBzL1xAcmVmaWxsXHMrLy9nOwotICAgICMgb3RoZXIgc3Vic3RpdHV0aW9ucwotICAgICZzaW1wbGVfc3Vic3RpdHV0aW9uczsKLSAgICBzL1xAdmFsdWV7KCRWQVJSRSl9LyR2YWx1ZXskMX0vZWc7Ci0gICAgcy9cQGZvb3Rub3RlXHsvXEBmb290bm90ZSRkb2N1X2RvY1x7L2c7ICMgbWFyayBmb290bm90ZXMsIGNmLiBwYXNzIDQKLSAgICAjCi0gICAgIyBhbmFseXplIHRoZSB0YWcgYWdhaW4KLSAgICAjCi0gICAgaWYgKCR0YWcpIHsKLQlpZiAoZGVmaW5lZCgkc2VjMmxldmVseyR0YWd9KSAmJiAkc2VjMmxldmVseyR0YWd9ID4gMCkgewotCSAgICBpZiAoL15cQCR0YWdccysoLispJC8pIHsKLQkJJG5hbWUgPSAkMTsKLQkJJG5hbWUgPX4gcy9ccyskLy87Ci0JCSRsZXZlbCA9ICRzZWMybGV2ZWx7JHRhZ307Ci0JCSRuYW1lID0gJnVwZGF0ZV9zZWNfbnVtKCR0YWcsICRsZXZlbCkgLiAiICAkbmFtZSIKLQkJICAgIGlmICRudW1iZXJfc2VjdGlvbnMgJiYgJHRhZyAhfiAvXnVubnVtYmVyZWQvOwotCQlpZiAoJHRhZyA9fiAvaGVhZGluZyQvKSB7Ci0JCSAgICBwdXNoKEBsaW5lcywgJmh0bWxfZGVidWcoIlxuIiwgX19MSU5FX18pKTsKLQkJICAgIGlmICgkaHRtbF9lbGVtZW50IG5lICdib2R5JykgewotCQkJIyBXZSBhcmUgaW4gYSBuaWNlIHBpY2tsZSBoZXJlLiBXZSBhcmUgdHJ5aW5nIHRvIGdldCBhIEg/IGhlYWRpbmcKLQkJCSMgZXZlbiB0aG91Z2ggd2UgYXJlIG5vdCBpbiB0aGUgYm9keSBsZXZlbC4gU28sIHdlIGNvbnZlcnQgaXQgdG8gYQotCQkJIyBuaWNlLCBib2xkLCBsaW5lIGJ5IGl0c2VsZi4KLQkJCSRfID0gJmRlYnVnKCJcblxuPFA+PFNUUk9ORz4kbmFtZTwvU1RST05HPjwvUD5cblxuIiwgX19MSU5FX18pOwotCQkgICAgfSBlbHNlIHsKLQkJCSRfID0gJmRlYnVnKCI8SCRsZXZlbD4kbmFtZTwvSCRsZXZlbD5cbiIsIF9fTElORV9fKTsKLQkJCSZodG1sX3B1c2hfaWYoJ2JvZHknKTsKLQkJICAgIH0KLQkJICAgIHByaW50ICIjIGhlYWRpbmcsIHNlY3Rpb24gJG5hbWUsIGxldmVsICRsZXZlbFxuIgotCQkJaWYgJGRlYnVnICYgJERFQlVHX1RPQzsKLQkJfSBlbHNlIHsKLQkJICAgIGlmICgkc3BsaXRfY2hhcHRlcikgewotCQkJdW5sZXNzICgkdG9wbGV2ZWwpIHsKLQkJCSAgICAjIGZpcnN0IHRpbWUgd2Ugc2VlIGEgInNlY3Rpb24iCi0JCQkgICAgdW5sZXNzICgkbGV2ZWwgPT0gMSkgewotCQkJCXdhcm4gIiRFUlJPUiBUaGUgZmlyc3Qgc2VjdGlvbiBmb3VuZCBpcyBub3Qgb2YgbGV2ZWwgMTogJF8iOwotCQkJCXdhcm4gIiRFUlJPUiBJJ2xsIHNwbGl0IG9uIHNlY3Rpb25zIG9mIGxldmVsICRsZXZlbC4uLlxuIjsKLQkJCSAgICB9Ci0JCQkgICAgJHRvcGxldmVsID0gJGxldmVsOwotCQkJfQotCQkJaWYgKCRsZXZlbCA9PSAkdG9wbGV2ZWwpIHsKLQkJCSAgICAmbmV4dF9kb2M7Ci0JCQkgICAgcHVzaChAbGluZXMsICRTUExJVFRBRykgaWYgJHNwbGl0X251bSsrOwotCQkJICAgIHB1c2goQHNlY3Rpb25zLCAkbmFtZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICAkc2VjX251bSsrOwotCQkgICAgJGRvY2lkID0gIlNFQyRzZWNfbnVtIjsKLQkJICAgICR0b2NpZCA9ICJUT0Mkc2VjX251bSI7Ci0JCSAgICAjIGNoZWNrIGJpYmxpbyBhbmQgZ2xvc3NhcnkKLQkJICAgICRpbl9iaWJsaW9ncmFwaHkgPSAoJG5hbWUgPX4gL14oW0EtWl18XGQrKT8oXC5cZCspKlxzKmJpYmxpb2dyYXBoeSQvaSk7Ci0JCSAgICAkaW5fZ2xvc3NhcnkgPSAoJG5hbWUgPX4gL14oW0EtWl18XGQrKT8oXC5cZCspKlxzKmdsb3NzYXJ5JC9pKTsKLQkJICAgICMgY2hlY2sgbm9kZQotCQkgICAgaWYgKCRub2RlKSB7Ci0JCQlpZiAoJG5vZGUyc2VjeyRub2RlfSkgewotCQkJICAgIHdhcm4gIiRFUlJPUiBEdXBsaWNhdGUgbm9kZSBmb3VuZDogJG5vZGVcbiI7Ci0JCQl9IGVsc2UgewotCQkJICAgICRub2RlMnNlY3skbm9kZX0gPSAkbmFtZTsKLQkJCSAgICAkbm9kZTJocmVmeyRub2RlfSA9ICIkZG9jdV9kb2MjJGRvY2lkIjsKLQkJCSAgICBwcmludCAiIyBub2RlICRub2RlLCBzZWN0aW9uICRuYW1lLCBsZXZlbCAkbGV2ZWxcbiIKLQkJCQlpZiAkZGVidWcgJiAkREVCVUdfVE9DOwotCQkJfQotCQkJJG5vZGUgPSAnJzsKLQkJICAgIH0gZWxzZSB7Ci0JCQlwcmludCAiIyBubyBub2RlLCBzZWN0aW9uICRuYW1lLCBsZXZlbCAkbGV2ZWxcbiIKLQkJCSAgICBpZiAkZGVidWcgJiAkREVCVUdfVE9DOwotCQkgICAgfQotCQkgICAgIyB1cGRhdGUgVE9DCi0JCSAgICB3aGlsZSAoJGxldmVsID4gJGN1cmxldmVsKSB7Ci0JCQkkY3VybGV2ZWwrKzsKLQkJCXB1c2goQHRvY19saW5lcywgIjxVTD5cbiIpOwotCQkgICAgfQotCQkgICAgd2hpbGUgKCRsZXZlbCA8ICRjdXJsZXZlbCkgewotCQkJJGN1cmxldmVsLS07Ci0JCQlwdXNoKEB0b2NfbGluZXMsICI8L1VMPlxuIik7Ci0JCSAgICB9Ci0JCSAgICAkXyA9ICI8TEk+IiAuICZhbmNob3IoJHRvY2lkLCAiJGRvY3VfZG9jIyRkb2NpZCIsICRuYW1lLCAxKTsKLQkJICAgIHB1c2goQHRvY19saW5lcywgJnN1YnN0aXR1dGVfc3R5bGUoJF8pKTsKLQkJICAgICMgdXBkYXRlIERPQwotCQkgICAgcHVzaChAbGluZXMsICZodG1sX2RlYnVnKCJcbiIsIF9fTElORV9fKSk7Ci0JCSAgICAmaHRtbF9yZXNldDsKLQkJICAgICRfID0gICI8SCRsZXZlbD4iLiZhbmNob3IoJGRvY2lkLCAiJGRvY3VfdG9jIyR0b2NpZCIsICRuYW1lKS4iPC9IJGxldmVsPlxuIjsKLQkJICAgICRfID0gJmRlYnVnKCRfLCBfX0xJTkVfXyk7Ci0JCSAgICBwdXNoKEBsaW5lcywgJmh0bWxfZGVidWcoIlxuIiwgX19MSU5FX18pKTsKLQkJfQotCQkjIHVwZGF0ZSBET0MKLQkJZm9yZWFjaCAkbGluZSAoc3BsaXQoL1xuKy8sICRfKSkgewotCQkgICAgcHVzaChAbGluZXMsICIkbGluZVxuIik7Ci0JCX0KLQkJbmV4dDsKLQkgICAgfSBlbHNlIHsKLQkJd2FybiAiJEVSUk9SIEJhZCBzZWN0aW9uIGxpbmU6ICRfIjsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgICMgdHJhY2sgdmFyaWFibGVzCi0JICAgICR2YWx1ZXskMX0gPSAkMiwgbmV4dCBpZiAvXlxAc2V0XHMrKCRWQVJSRSlccysoLiopJC9vOwotCSAgICBkZWxldGUgJHZhbHVleyQxfSwgbmV4dCBpZiAvXlxAY2xlYXJccysoJFZBUlJFKVxzKiQvbzsKLQkgICAgIyBzdG9yZSB0aGluZ3MKLQkgICAgJHZhbHVleydfc2V0ZmlsZW5hbWUnfSAgID0gJDEsIG5leHQgaWYgL15cQHNldGZpbGVuYW1lXHMrKC4qKSQvOwotCSAgICAkdmFsdWV7J19zZXR0aXRsZSd9ICAgICAgPSAkMSwgbmV4dCBpZiAvXlxAc2V0dGl0bGVccysoLiopJC87Ci0JICAgICR2YWx1ZXsnX2F1dGhvcid9ICAgLj0gIiQxXG4iLCBuZXh0IGlmIC9eXEBhdXRob3JccysoLiopJC87Ci0JICAgICR2YWx1ZXsnX3N1YnRpdGxlJ30gLj0gIiQxXG4iLCBuZXh0IGlmIC9eXEBzdWJ0aXRsZVxzKyguKikkLzsKLQkgICAgJHZhbHVleydfdGl0bGUnfSAgICAuPSAiJDFcbiIsIG5leHQgaWYgL15cQHRpdGxlXHMrKC4qKSQvOwotCSAgICAjIGluZGV4Ci0JICAgIGlmICgvXlxAKC4uPylpbmRleFxzKy8pIHsKLQkJdW5sZXNzICgkdmFsaWRfaW5kZXh7JDF9KSB7Ci0JCSAgICB3YXJuICIkRVJST1IgVW5kZWZpbmVkIGluZGV4IGNvbW1hbmQ6ICRfIjsKLQkJICAgIG5leHQ7Ci0JCX0KLQkJJGlkID0gJ0lEWCcgLiArKyRpZHhfbnVtOwotCQkkaW5kZXggPSAkMSAuICdpbmRleCc7Ci0JCSR3aGF0ID0gJnN1YnN0aXR1dGVfc3R5bGUoJCcpOwotCQkkd2hhdCA9fiBzL1xzKyQvLzsKLQkJcHJpbnQgIiMgZm91bmQgJGluZGV4IGZvciAnJHdoYXQnIGlkICRpZFxuIgotCQkgICAgaWYgJGRlYnVnICYgJERFQlVHX0lOREVYOwotCQlldmFsKDw8RU9DKTsKLQkJaWYgKGRlZmluZWQoXCQkaW5kZXhce1wkd2hhdFx9KSkgewotCQkgICAgXCQkaW5kZXhce1wkd2hhdFx9IC49ICIkOyRkb2N1X2RvYyMkaWQiOwotCQl9IGVsc2UgewotCQkgICAgXCQkaW5kZXhce1wkd2hhdFx9ID0gIiRkb2N1X2RvYyMkaWQiOwotCQl9Ci1FT0MKLQkJIwotCQkjIGRpcnR5IGhhY2sgdG8gc2VlIGlmIEkgY2FuIHB1dCBhbiBpbnZpc2libGUgYW5jaG9yLi4uCi0JCSMKLQkJaWYgKCRodG1sX2VsZW1lbnQgZXEgJ1AnIHx8Ci0JCSAgICAkaHRtbF9lbGVtZW50IGVxICdMSScgfHwKLQkJICAgICRodG1sX2VsZW1lbnQgZXEgJ0RUJyB8fAotCQkgICAgJGh0bWxfZWxlbWVudCBlcSAnREQnIHx8Ci0JCSAgICAkaHRtbF9lbGVtZW50IGVxICdBRERSRVNTJyB8fAotCQkgICAgJGh0bWxfZWxlbWVudCBlcSAnQicgfHwKLQkJICAgICRodG1sX2VsZW1lbnQgZXEgJ0JMT0NLUVVPVEUnIHx8Ci0JCSAgICAkaHRtbF9lbGVtZW50IGVxICdQUkUnIHx8Ci0JCSAgICAkaHRtbF9lbGVtZW50IGVxICdTQU1QJykgewotICAgICAgICAgICAgICAgICAgICBwdXNoKEBsaW5lcywgJmFuY2hvcigkaWQsICcnLCAkaW52aXNpYmxlX21hcmssICEkaW5fcHJlKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNpZiAoJGh0bWxfZWxlbWVudCBlcSAnYm9keScpIHsKLQkJICAgIHB1c2goQGxpbmVzLCAmZGVidWcoIjxQPlxuIiwgX19MSU5FX18pKTsKLSAgICAgICAgICAgICAgICAgICAgcHVzaChAbGluZXMsICZhbmNob3IoJGlkLCAnJywgJGludmlzaWJsZV9tYXJrLCAhJGluX3ByZSkpOwotCQkgICAgJmh0bWxfcHVzaCgnUCcpOwotCQl9IGVsc2lmICgkaHRtbF9lbGVtZW50IGVxICdETCcgfHwKLQkJCSAkaHRtbF9lbGVtZW50IGVxICdVTCcgfHwKLQkJCSAkaHRtbF9lbGVtZW50IGVxICdPTCcgKSB7Ci0JCSAgICAkZGVmZXJyZWRfcmVmIC49ICZhbmNob3IoJGlkLCAnJywgJGludmlzaWJsZV9tYXJrLCAhJGluX3ByZSkgLiAiICI7Ci0JCX0KLQkJbmV4dDsKLQkgICAgfQotCSAgICAjIGxpc3QgaXRlbQotCSAgICBpZiAoL15cQGl0ZW14P1xzKy8pIHsKLQkJJHdoYXQgPSAkJzsKLQkJJHdoYXQgPX4gcy9ccyskLy87Ci0JCWlmICgkaW5fYmlibGlvZ3JhcGh5ICYmICR1c2VfYmlibGlvZ3JhcGh5KSB7Ci0JCSAgICBpZiAoJHdoYXQgPX4gL14kQklCUkUkL28pIHsKLQkJCSRpZCA9ICdCSUInIC4gKyskYmliX251bTsKLQkJCSRiaWIyaHJlZnskd2hhdH0gPSAiJGRvY3VfZG9jIyRpZCI7Ci0JCQlwcmludCAiIyBmb3VuZCBiaWJsaW9ncmFwaHkgZm9yICckd2hhdCcgaWQgJGlkXG4iCi0JCQkgICAgaWYgJGRlYnVnICYgJERFQlVHX0JJQjsKLQkJCSR3aGF0ID0gJmFuY2hvcigkaWQsICcnLCAkd2hhdCk7Ci0JCSAgICB9Ci0JCX0gZWxzaWYgKCRpbl9nbG9zc2FyeSAmJiAkdXNlX2dsb3NzYXJ5KSB7Ci0JCSAgICAkaWQgPSAnR0xPU1MnIC4gKyskZ2xvc3NfbnVtOwotCQkgICAgJGVudHJ5ID0gJHdoYXQ7Ci0JCSAgICAkZW50cnkgPX4gdHIvQS1aL2Etei8gdW5sZXNzICRlbnRyeSA9fiAvXltBLVpcc10rJC87Ci0JCSAgICAkZ2xvc3MyaHJlZnskZW50cnl9ID0gIiRkb2N1X2RvYyMkaWQiOwotCQkgICAgcHJpbnQgIiMgZm91bmQgZ2xvc3NhcnkgZm9yICckZW50cnknIGlkICRpZFxuIgotCQkJaWYgJGRlYnVnICYgJERFQlVHX0dMT1NTOwotCQkgICAgJHdoYXQgPSAmYW5jaG9yKCRpZCwgJycsICR3aGF0KTsKLQkJfQotCQkmaHRtbF9wb3BfaWYoJ1AnKTsKLQkJaWYgKCRodG1sX2VsZW1lbnQgZXEgJ0RMJyB8fCAkaHRtbF9lbGVtZW50IGVxICdERCcpIHsKLQkJICAgIGlmICgkdGhpbmdzX21hcHskaW5fdGFibGV9ICYmICEkd2hhdCkgewotCQkJIyBzcGVjaWFsIGNhc2UgdG8gYWxsb3cgQHRhYmxlIEBidWxsZXQgZm9yIGluc3RhbmNlCi0JCQlwdXNoKEBsaW5lcywgJmRlYnVnKCI8RFQ+JHRoaW5nc19tYXB7JGluX3RhYmxlfVxuIiwgX19MSU5FX18pKTsKLQkJICAgIH0gZWxzZSB7Ci0JCQlwdXNoKEBsaW5lcywgJmRlYnVnKCI8RFQ+XEAkaW5fdGFibGVceyR3aGF0XH1cbiIsIF9fTElORV9fKSk7Ci0JCSAgICB9Ci0JCSAgICBwdXNoKEBsaW5lcywgIjxERD4iKTsKLQkJICAgICZodG1sX3B1c2goJ0REJykgdW5sZXNzICRodG1sX2VsZW1lbnQgZXEgJ0REJzsKLQkJICAgIGlmICgkdGFibGVfdHlwZSkgeyAjIGFkZCBhbHNvIGFuIGluZGV4Ci0JCQl1bnNoaWZ0KEBpbnB1dF9zcG9vbCwgIlxAJHt0YWJsZV90eXBlfWluZGV4ICR3aGF0XG4iKTsKLQkJICAgIH0KLQkJfSBlbHNpZiAoJGh0bWxfZWxlbWVudCBlcSAnVEFCTEUnKSB7Ci0JCSAgICBwdXNoKEBsaW5lcywgJmRlYnVnKCI8VFI+PFREPiR3aGF0PC9URD5cbiIsIF9fTElORV9fKSk7Ci0JCSAgICAmaHRtbF9wdXNoKCdUUicpOwotCQl9IGVsc2lmICgkaHRtbF9lbGVtZW50IGVxICdUUicpIHsKLQkJICAgIHB1c2goQGxpbmVzLCAmZGVidWcoIjwvVFI+XG4iLCBfX0xJTkVfXykpOwotCQkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiPFRSPjxURD4kd2hhdDwvVEQ+XG4iLCBfX0xJTkVfXykpOwotCQl9IGVsc2UgewotCQkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiPExJPiR3aGF0XG4iLCBfX0xJTkVfXykpOwotCQkgICAgJmh0bWxfcHVzaCgnTEknKSB1bmxlc3MgJGh0bWxfZWxlbWVudCBlcSAnTEknOwotCQl9Ci0JCXB1c2goQGxpbmVzLCAmaHRtbF9kZWJ1ZygiXG4iLCBfX0xJTkVfXykpOwotCQlpZiAoJGRlZmVycmVkX3JlZikgewotCQkgICAgcHVzaChAbGluZXMsICZkZWJ1ZygiJGRlZmVycmVkX3JlZlxuIiwgX19MSU5FX18pKTsKLQkJICAgICRkZWZlcnJlZF9yZWYgPSAnJzsKLQkJfQotCQluZXh0OwotCSAgICB9IGVsc2lmICgvXlxAdGFiXHMrKC4qKSQvKSB7Ci0JCXB1c2goQGxpbmVzLCAiPFREPiQxPC9URD5cbiIpOwotCQluZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgICAjIHBhcmFncmFwaCBzZXBhcmF0b3IKLSAgICBpZiAoJF8gZXEgIlxuIikgewotCW5leHQgaWYgJCNsaW5lcyA+PSAwICYmICRsaW5lc1skI2xpbmVzXSBlcSAiXG4iOwotCWlmICgkaHRtbF9lbGVtZW50IGVxICdQJykgewotCSAgICBwdXNoKEBsaW5lcywgIlxuIik7Ci0JICAgICRfID0gJmRlYnVnKCI8L1A+XG4iLCBfX0xJTkVfXyk7Ci0JICAgICZodG1sX3BvcDsKLQl9Ci0gICAgfSBlbHNpZiAoJGh0bWxfZWxlbWVudCBlcSAnYm9keScgfHwgJGh0bWxfZWxlbWVudCBlcSAnQkxPQ0tRVU9URScpIHsKLQlwdXNoKEBsaW5lcywgIjxQPlxuIik7Ci0JJmh0bWxfcHVzaCgnUCcpOwotCSRfID0gJmRlYnVnKCRfLCBfX0xJTkVfXyk7Ci0gICAgfQotICAgICMgb3RoZXJ3aXNlCi0gICAgcHVzaChAbGluZXMsICRfKTsKLX0KLQotIyBmaW5pc2ggVE9DCi0kbGV2ZWwgPSAwOwotd2hpbGUgKCRsZXZlbCA8ICRjdXJsZXZlbCkgewotICAgICRjdXJsZXZlbC0tOwotICAgIHB1c2goQHRvY19saW5lcywgIjwvVUw+XG4iKTsKLX0KLQotcHJpbnQgIiMgZW5kIG9mIHBhc3MgMVxuIiBpZiAkdmVyYm9zZTsKLQotIysrKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIFBhc3MgMi8zOiBoYW5kbGUgc3R5bGUsIG1lbnUsIGluZGV4LCBjcm9zcy1yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMtLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUBsaW5lczIgPSAoKTsJCQkJIyB3aG9sZSBkb2N1bWVudCAoMm5kIHBhc3MpCi1AbGluZXMzID0gKCk7CQkJCSMgd2hvbGUgZG9jdW1lbnQgKDNyZCBwYXNzKQotJGluX21lbnUgPSAwOwkJCQkjIGFtIEkgaW5zaWRlIGEgbWVudQotCi13aGlsZSAoQGxpbmVzKSB7Ci0gICAgJF8gPSBzaGlmdChAbGluZXMpOwotICAgICMKLSAgICAjIHNwZWNpYWwgY2FzZSAocHJvdGVjdGVkIHNlY3Rpb25zKQotICAgICMKLSAgICBpZiAoL14kUFJPVEVDVFRBRy9vKSB7Ci0JcHVzaChAbGluZXMyLCAkXyk7Ci0JbmV4dDsKLSAgICB9Ci0gICAgIwotICAgICMgbWVudQotICAgICMKLSAgICAkaW5fbWVudSA9IDEsIHB1c2goQGxpbmVzMiwgJmRlYnVnKCI8VUw+XG4iLCBfX0xJTkVfXykpLCBuZXh0IGlmIC9eXEBtZW51XGIvOwotICAgICRpbl9tZW51ID0gMCwgcHVzaChAbGluZXMyLCAmZGVidWcoIjwvVUw+XG4iLCBfX0xJTkVfXykpLCBuZXh0IGlmIC9eXEBlbmRccyttZW51XGIvOwotICAgIGlmICgkaW5fbWVudSkgewotCWlmICgvXlwqXHMrKCROT0RFUkUpOjovbykgewotCSAgICAkZGVzY3IgPSAkJzsKLQkgICAgY2hvcCgkZGVzY3IpOwotCSAgICAmbWVudV9lbnRyeSgkMSwgJDEsICRkZXNjcik7Ci0JfSBlbHNpZiAoL15cKlxzKyguKyk6XHMrKFteXHQsXC5cbl0rKVtcdCxcLlxuXS8pIHsKLQkgICAgJGRlc2NyID0gJCc7Ci0JICAgIGNob3AoJGRlc2NyKTsKLQkgICAgJm1lbnVfZW50cnkoJDEsICQyLCAkZGVzY3IpOwotCX0gZWxzaWYgKC9eXCovKSB7Ci0JICAgIHdhcm4gIiRFUlJPUiBCYWQgbWVudSBsaW5lOiAkXyI7Ci0JfSBlbHNlIHsgIyBkZXNjcmlwdGlvbiBjb250aW51ZWQ/Ci0JICAgIHB1c2goQGxpbmVzMiwgJF8pOwotCX0KLQluZXh0OwotICAgIH0KLSAgICAjCi0gICAgIyBwcmludGluZGV4Ci0gICAgIwotICAgIGlmICgvXlxAcHJpbnRpbmRleFxzKyhcd1x3KVxiLykgewotCWxvY2FsKCRpbmRleCwgKmFyeSwgQGtleXMsICRrZXksICRsZXR0ZXIsICRsYXN0X2xldHRlciwgQHJlZnMpOwotCWlmICgkcHJlZGVmaW5lZF9pbmRleHskMX0pIHsKLQkgICAgJGluZGV4ID0gJHByZWRlZmluZWRfaW5kZXh7JDF9IC4gJ2luZGV4JzsKLQl9IGVsc2UgewotCSAgICAkaW5kZXggPSAkMSAuICdpbmRleCc7Ci0JfQotCWV2YWwoIiphcnkgPSAqJGluZGV4Iik7Ci0JQGtleXMgPSBrZXlzKCVhcnkpOwotCWZvcmVhY2ggJGtleSAoQGtleXMpIHsKLQkgICAgJF8gPSAka2V5OwotCSAgICAxIHdoaWxlIHMvPChcdyspPlxgKC4qKVwnPFwvXDE+LyQyLzsgIyByZW1vdmUgSFRNTCB0YWdzIHdpdGggcXVvdGVzCi0JICAgIDEgd2hpbGUgcy88KFx3Kyk+KC4qKTxcL1wxPi8kMi87ICAgICAjIHJlbW92ZSBIVE1MIHRhZ3MKLQkgICAgJF8gPSAmdW5wcm90ZWN0X2h0bWwoJF8pOwotCSAgICAmdW5wcm90ZWN0X3RleGk7Ci0JICAgIHRyL0EtWi9hLXovOyAjIGxvd2VyY2FzZQotCSAgICAka2V5MmFscGhheyRrZXl9ID0gJF87Ci0JICAgIHByaW50ICIjIGluZGV4ICRrZXkgc29ydGVkIGFzICRfXG4iCi0JCWlmICRrZXkgbmUgJF8gJiYgJGRlYnVnICYgJERFQlVHX0lOREVYOwotCX0KLQlwdXNoKEBsaW5lczIsICJKdW1wIHRvOlxuIik7Ci0JJGxhc3RfbGV0dGVyID0gdW5kZWY7Ci0JZm9yZWFjaCAka2V5IChzb3J0IGJ5YWxwaGEgQGtleXMpIHsKLQkgICAgJGxldHRlciA9IHN1YnN0cigka2V5MmFscGhheyRrZXl9LCAwLCAxKTsKLQkgICAgJGxldHRlciA9IHN1YnN0cigka2V5MmFscGhheyRrZXl9LCAwLCAyKSBpZiAkbGV0dGVyIGVxICQ7OwotCSAgICBpZiAoIWRlZmluZWQoJGxhc3RfbGV0dGVyKSB8fCAkbGV0dGVyIG5lICRsYXN0X2xldHRlcikgewotCQlwdXNoKEBsaW5lczIsICItXG4iKSBpZiBkZWZpbmVkKCRsYXN0X2xldHRlcik7Ci0JCXB1c2goQGxpbmVzMiwgIjxBIEhSRUY9XCIjJGluZGV4XF8kbGV0dGVyXCI+IiAuICZwcm90ZWN0X2h0bWwoJGxldHRlcikgLiAiPC9BPlxuIik7Ci0JCSRsYXN0X2xldHRlciA9ICRsZXR0ZXI7Ci0JICAgIH0KLQl9Ci0JcHVzaChAbGluZXMyLCAiPFA+XG4iKTsKLQkkbGFzdF9sZXR0ZXIgPSB1bmRlZjsKLQlmb3JlYWNoICRrZXkgKHNvcnQgYnlhbHBoYSBAa2V5cykgewotCSAgICAkbGV0dGVyID0gc3Vic3RyKCRrZXkyYWxwaGF7JGtleX0sIDAsIDEpOwotCSAgICAkbGV0dGVyID0gc3Vic3RyKCRrZXkyYWxwaGF7JGtleX0sIDAsIDIpIGlmICRsZXR0ZXIgZXEgJDs7Ci0JICAgIGlmICghZGVmaW5lZCgkbGFzdF9sZXR0ZXIpIHx8ICRsZXR0ZXIgbmUgJGxhc3RfbGV0dGVyKSB7Ci0JCXB1c2goQGxpbmVzMiwgIjwvRElSPlxuIikgaWYgZGVmaW5lZCgkbGFzdF9sZXR0ZXIpOwotCQlwdXNoKEBsaW5lczIsICI8SDI+PEEgTkFNRT1cIiRpbmRleFxfJGxldHRlclwiPiIgLiAmcHJvdGVjdF9odG1sKCRsZXR0ZXIpIC4gIjwvQT48L0gyPlxuIik7Ci0JCXB1c2goQGxpbmVzMiwgIjxESVI+XG4iKTsKLQkJJGxhc3RfbGV0dGVyID0gJGxldHRlcjsKLQkgICAgfQotCSAgICBAcmVmcyA9ICgpOwotCSAgICBmb3JlYWNoIChzcGxpdCgvJDsvLCAkYXJ5eyRrZXl9KSkgewotCQlwdXNoKEByZWZzLCAmYW5jaG9yKCcnLCAkXywgJGtleSwgMCkpOwotCSAgICB9Ci0JICAgIHB1c2goQGxpbmVzMiwgIjxMST4iIC4gam9pbigiLCAiLCBAcmVmcykgLiAiXG4iKTsKLQl9Ci0JcHVzaChAbGluZXMyLCAiPC9ESVI+XG4iKSBpZiBkZWZpbmVkKCRsYXN0X2xldHRlcik7Ci0JbmV4dDsKLSAgICB9Ci0gICAgIwotICAgICMgc2ltcGxlIHN0eWxlIHN1YnN0aXR1dGlvbnMKLSAgICAjCi0gICAgJF8gPSAmc3Vic3RpdHV0ZV9zdHlsZSgkXyk7Ci0gICAgIwotICAgICMgeHJlZgotICAgICMKLSAgICB3aGlsZSAoL1xAKHh8cHh8aW5mb3wpcmVmeygkWFJFRlJFKSh9PykvbykgewotCSMgbm90ZTogVGV4aW5mbyBtYXkgYWNjZXB0IG90aGVyIGNoYXJhY3RlcnMKLQkoJHR5cGUsICRub2RlcywgJGZ1bGwpID0gKCQxLCAkMiwgJDMpOwotCSgkYmVmb3JlLCAkYWZ0ZXIpID0gKCRgLCAkJyk7Ci0JaWYgKCEgJGZ1bGwgJiYgJGFmdGVyKSB7Ci0JICAgIHdhcm4gIiRFUlJPUiBCYWQgeHJlZiAobm8gZW5kaW5nIH0gb24gbGluZSk6ICRfIjsKLQkgICAgJF8gPSAiJGJlZm9yZSQ7MCR7dHlwZX1yZWZceyRub2RlcyRhZnRlciI7Ci0JICAgIG5leHQ7ICMgd2hpbGUgeHJlZgotCX0KLQlpZiAoJHR5cGUgZXEgJ3gnKSB7Ci0JICAgICR0eXBlID0gJ1NlZSAnOwotCX0gZWxzaWYgKCR0eXBlIGVxICdweCcpIHsKLQkgICAgJHR5cGUgPSAnc2VlICc7Ci0JfSBlbHNpZiAoJHR5cGUgZXEgJ2luZm8nKSB7Ci0JICAgICR0eXBlID0gJ1NlZSBJbmZvJzsKLQl9IGVsc2UgewotCSAgICAkdHlwZSA9ICcnOwotCX0KLQl1bmxlc3MgKCRmdWxsKSB7Ci0JICAgICRuZXh0ID0gc2hpZnQoQGxpbmVzKTsKLQkgICAgJG5leHQgPSAmc3Vic3RpdHV0ZV9zdHlsZSgkbmV4dCk7Ci0JICAgIGNob3AoJG5vZGVzKTsgIyByZW1vdmUgZmluYWwgbmV3bGluZQotCSAgICBpZiAoJG5leHQgPX4gL1x9LykgeyAjIHNwbGl0IG9uIDIgbGluZXMKLQkJJG5vZGVzIC49ICIgJGAiOwotCQkkYWZ0ZXIgPSAkJzsKLQkgICAgfSBlbHNlIHsKLQkJJG5vZGVzIC49ICIgJG5leHQiOwotCQkkbmV4dCA9IHNoaWZ0KEBsaW5lcyk7Ci0JCSRuZXh0ID0gJnN1YnN0aXR1dGVfc3R5bGUoJG5leHQpOwotCQljaG9wKCRub2Rlcyk7Ci0JCWlmICgkbmV4dCA9fiAvXH0vKSB7ICMgc3BsaXQgb24gMyBsaW5lcwotCQkgICAgJG5vZGVzIC49ICIgJGAiOwotCQkgICAgJGFmdGVyID0gJCc7Ci0JCX0gZWxzZSB7Ci0JCSAgICB3YXJuICIkRVJST1IgQmFkIHhyZWYgKG5vIGVuZGluZyB9KTogJF8iOwotCQkgICAgJF8gPSAiJGJlZm9yZSQ7MHhyZWZceyRub2RlcyRhZnRlciI7Ci0JCSAgICB1bnNoaWZ0KEBsaW5lcywgJG5leHQpOwotCQkgICAgbmV4dDsgIyB3aGlsZSB4cmVmCi0JCX0KLQkgICAgfQotCX0KLQkkbm9kZXMgPX4gcy9ccysvIC9nOyAjIHJlbW92ZSB1c2VsZXNzIHNwYWNlcwotCUBhcmdzID0gc3BsaXQoL1xzKixccyovLCAkbm9kZXMpOwotCSRub2RlID0gJGFyZ3NbMF07ICMgdGhlIG5vZGUgaXMgYWx3YXlzIHRoZSBmaXJzdCBhcmcKLQkmbm9ybWFsaXNlX25vZGUoJG5vZGUpOwotCSRzZWMgPSAkbm9kZTJzZWN7JG5vZGV9OwotCWlmIChAYXJncyA9PSA1KSB7ICMgcmVmZXJlbmNlIHRvIGFub3RoZXIgbWFudWFsCi0JICAgICRzZWMgPSAkYXJnc1syXSB8fCAkbm9kZTsKLQkgICAgJG1hbiA9ICRhcmdzWzRdIHx8ICRhcmdzWzNdOwotCSAgICAkXyA9ICIke2JlZm9yZX0ke3R5cGV9c2VjdGlvbiBgJHNlYycgaW4gXEBjaXRleyRtYW59JGFmdGVyIjsKLQl9IGVsc2lmICgkdHlwZSA9fiAvSW5mby8pIHsgIyBpbmZvcmVmCi0JICAgIHdhcm4gIiRFUlJPUiBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAkXyIgdW5sZXNzIEBhcmdzID09IDM7Ci0JICAgICgkbm4sICRfLCAkaW4pID0gQGFyZ3M7Ci0JICAgICRfID0gIiR7YmVmb3JlfSR7dHlwZX0gZmlsZSBgJGluJywgbm9kZSBgJG5uJyRhZnRlciI7Ci0JfSBlbHNpZiAoJHNlYykgewotCSAgICAkaHJlZiA9ICRub2RlMmhyZWZ7JG5vZGV9OwotCSAgICAkXyA9ICIke2JlZm9yZX0ke3R5cGV9c2VjdGlvbiAiIC4gJmFuY2hvcignJywgJGhyZWYsICRzZWMpIC4gJGFmdGVyOwotCX0gZWxzZSB7Ci0JICAgIHdhcm4gIiRFUlJPUiBVbmRlZmluZWQgbm9kZSAoJG5vZGUpOiAkXyI7Ci0JICAgICRfID0gIiRiZWZvcmUkOzB4cmVmeyRub2Rlc30kYWZ0ZXIiOwotCX0KLSAgICB9Ci0gICAgIwotICAgICMgdHJ5IHRvIGd1ZXNzIGJpYmxpb2dyYXBoeSByZWZlcmVuY2VzIG9yIGdsb3NzYXJ5IHRlcm1zCi0gICAgIwotICAgIHVubGVzcyAoL148SFxkPjxBIE5BTUU9XCJTRUNcZC8pIHsKLQlpZiAoJHVzZV9iaWJsaW9ncmFwaHkpIHsKLQkgICAgJGRvbmUgPSAnJzsKLQkgICAgd2hpbGUgKC8kQklCUkUvbykgewotCQkoJHByZSwgJHdoYXQsICRwb3N0KSA9ICgkYCwgJCYsICQnKTsKLQkJJGhyZWYgPSAkYmliMmhyZWZ7JHdoYXR9OwotCQlpZiAoZGVmaW5lZCgkaHJlZikgJiYgJHBvc3QgIX4gL15bXjxdKjxcL0E+LykgewotCQkgICAgJGRvbmUgLj0gJHByZSAuICZhbmNob3IoJycsICRocmVmLCAkd2hhdCk7Ci0JCX0gZWxzZSB7Ci0JCSAgICAkZG9uZSAuPSAiJHByZSR3aGF0IjsKLQkJfQotCQkkXyA9ICRwb3N0OwotCSAgICB9Ci0JICAgICRfID0gJGRvbmUgLiAkXzsKLQl9Ci0JaWYgKCR1c2VfZ2xvc3NhcnkpIHsKLQkgICAgJGRvbmUgPSAnJzsKLQkgICAgd2hpbGUgKC9cYlx3K1xiLykgewotCQkoJHByZSwgJHdoYXQsICRwb3N0KSA9ICgkYCwgJCYsICQnKTsKLQkJJGVudHJ5ID0gJHdoYXQ7Ci0JCSRlbnRyeSA9fiB0ci9BLVovYS16LyB1bmxlc3MgJGVudHJ5ID1+IC9eW0EtWlxzXSskLzsKLQkJJGhyZWYgPSAkZ2xvc3MyaHJlZnskZW50cnl9OwotCQlpZiAoZGVmaW5lZCgkaHJlZikgJiYgJHBvc3QgIX4gL15bXjxdKjxcL0E+LykgewotCQkgICAgJGRvbmUgLj0gJHByZSAuICZhbmNob3IoJycsICRocmVmLCAkd2hhdCk7Ci0JCX0gZWxzZSB7Ci0JCSAgICAkZG9uZSAuPSAiJHByZSR3aGF0IjsKLQkJfQotCQkkXyA9ICRwb3N0OwotCSAgICB9Ci0JICAgICRfID0gJGRvbmUgLiAkXzsKLQl9Ci0gICAgfQotICAgICMgb3RoZXJ3aXNlCi0gICAgcHVzaChAbGluZXMyLCAkXyk7Ci19Ci1wcmludCAiIyBlbmQgb2YgcGFzcyAyXG4iIGlmICR2ZXJib3NlOwotCi0jCi0jIHNwbGl0IHN0eWxlIHN1YnN0aXR1dGlvbnMKLSMKLXdoaWxlIChAbGluZXMyKSB7Ci0gICAgJF8gPSBzaGlmdChAbGluZXMyKTsKLSAgICAjCi0gICAgIyBzcGVjaWFsIGNhc2UgKHByb3RlY3RlZCBzZWN0aW9ucykKLSAgICAjCi0gICAgaWYgKC9eJFBST1RFQ1RUQUcvbykgewotCXB1c2goQGxpbmVzMywgJF8pOwotCW5leHQ7Ci0gICAgfQotICAgICMKLSAgICAjIHNwbGl0IHN0eWxlIHN1YnN0aXR1dGlvbnMKLSAgICAjCi0gICAgJG9sZCA9ICcnOwotICAgIHdoaWxlICgkb2xkIG5lICRfKSB7Ci0gICAgICAgICRvbGQgPSAkXzsKLQlpZiAoL1xAKFx3Kylcey8pIHsKLQkgICAgKCRiZWZvcmUsICRzdHlsZSwgJGFmdGVyKSA9ICgkYCwgJDEsICQnKTsKLQkgICAgaWYgKGRlZmluZWQoJHN0eWxlX21hcHskc3R5bGV9KSkgewotCQkkXyA9ICRhZnRlcjsKLQkJJHRleHQgPSAnJzsKLQkJJGFmdGVyID0gJyc7Ci0JCSRmYWlsZWQgPSAxOwotCQl3aGlsZSAoQGxpbmVzMikgewotCQkgICAgaWYgKC9cfS8pIHsKLQkJCSR0ZXh0IC49ICRgOwotCQkJJGFmdGVyID0gJCc7Ci0JCQkkZmFpbGVkID0gMDsKLQkJCWxhc3Q7Ci0JCSAgICB9IGVsc2UgewotCQkJJHRleHQgLj0gJF87Ci0JCQkkXyA9IHNoaWZ0KEBsaW5lczIpOwotCQkgICAgfQotCQl9Ci0JCWlmICgkZmFpbGVkKSB7Ci0JCSAgICBkaWUgIiogQmFkIHN5bnRheCAoXEAkc3R5bGUpIGFmdGVyOiAkYmVmb3JlXG4iOwotCQl9IGVsc2UgewotCQkgICAgJHRleHQgPSAmYXBwbHlfc3R5bGUoJHN0eWxlLCAkdGV4dCk7Ci0JCSAgICAkXyA9ICIkYmVmb3JlJHRleHQkYWZ0ZXIiOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgICMgb3RoZXJ3aXNlCi0gICAgcHVzaChAbGluZXMzLCAkXyk7Ci19Ci1wcmludCAiIyBlbmQgb2YgcGFzcyAzXG4iIGlmICR2ZXJib3NlOwotCi0jKysrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgUGFzcyA0OiBmb290IG5vdGVzLCBmaW5hbCBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIy0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQGZvb3RfbGluZXMgPSAoKTsJCQkjIGZvb3Rub3RlcwotQGRvY19saW5lcyA9ICgpOwkJCSMgZmluYWwgZG9jdW1lbnQKLSRlbmRfb2ZfcGFyYSA9IDA7CQkJIyB0cnVlIGlmIGxhc3QgbGluZSBpcyA8UD4KLQotd2hpbGUgKEBsaW5lczMpIHsKLSAgICAkXyA9IHNoaWZ0KEBsaW5lczMpOwotICAgICMKLSAgICAjIHNwZWNpYWwgY2FzZSAocHJvdGVjdGVkIHNlY3Rpb25zKQotICAgICMKLSAgICBpZiAoL14kUFJPVEVDVFRBRy9vKSB7Ci0JcHVzaChAZG9jX2xpbmVzLCAkXyk7Ci0JJGVuZF9vZl9wYXJhID0gMDsKLQluZXh0OwotICAgIH0KLSAgICAjCi0gICAgIyBmb290bm90ZXMKLSAgICAjCi0gICAgd2hpbGUgKC9cQGZvb3Rub3RlKFteXHtcc10rKVx7LykgewotCSgkYmVmb3JlLCAkZCwgJGFmdGVyKSA9ICgkYCwgJDEsICQnKTsKLQkkXyA9ICRhZnRlcjsKLQkkdGV4dCA9ICcnOwotCSRhZnRlciA9ICcnOwotCSRmYWlsZWQgPSAxOwotCXdoaWxlIChAbGluZXMzKSB7Ci0JICAgIGlmICgvXH0vKSB7Ci0JCSR0ZXh0IC49ICRgOwotCQkkYWZ0ZXIgPSAkJzsKLQkJJGZhaWxlZCA9IDA7Ci0JCWxhc3Q7Ci0JICAgIH0gZWxzZSB7Ci0JCSR0ZXh0IC49ICRfOwotCQkkXyA9IHNoaWZ0KEBsaW5lczMpOwotCSAgICB9Ci0JfQotCWlmICgkZmFpbGVkKSB7Ci0JICAgIGRpZSAiKiBCYWQgc3ludGF4IChcQGZvb3Rub3RlKSBhZnRlcjogJGJlZm9yZVxuIjsKLQl9IGVsc2UgewotCSAgICAkZm9vdF9udW0rKzsKLQkgICAgJGRvY2lkICA9ICJET0NGJGZvb3RfbnVtIjsKLQkgICAgJGZvb3RpZCA9ICJGT09UJGZvb3RfbnVtIjsKLQkgICAgJGZvb3QgPSAiKCRmb290X251bSkiOwotCSAgICBwdXNoKEBmb290X2xpbmVzLCAiPEgzPiIgLiAmYW5jaG9yKCRmb290aWQsICIkZCMkZG9jaWQiLCAkZm9vdCkgLiAiPC9IMz5cbiIpOwotCSAgICAkdGV4dCA9ICI8UD4kdGV4dCIgdW5sZXNzICR0ZXh0ID1+IC9eXHMqPFA+LzsKLQkgICAgcHVzaChAZm9vdF9saW5lcywgIiR0ZXh0XG4iKTsKLQkgICAgJF8gPSAkYmVmb3JlIC4gJmFuY2hvcigkZG9jaWQsICIkZG9jdV9mb290IyRmb290aWQiLCAkZm9vdCkgLiAkYWZ0ZXI7Ci0JfQotICAgIH0KLSAgICAjCi0gICAgIyByZW1vdmUgdW5uZWNlc3NhcnkgPFA+Ci0gICAgIwotICAgIGlmICgvXlxzKjxQPlxzKiQvKSB7Ci0JbmV4dCBpZiAkZW5kX29mX3BhcmErKzsKLSAgICB9IGVsc2UgewotCSRlbmRfb2ZfcGFyYSA9IDA7Ci0gICAgfQotICAgICMgb3RoZXJ3aXNlCi0gICAgcHVzaChAZG9jX2xpbmVzLCAkXyk7Ci19Ci1wcmludCAiIyBlbmQgb2YgcGFzcyA0XG4iIGlmICR2ZXJib3NlOwotCi0jKysrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgUGFzcyA1OiBwcmludCB0aGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIy0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotJGhlYWRlciA9IDw8RU9UOwotPCEtLSBUaGlzIEhUTUwgZmlsZSBoYXMgYmVlbiBjcmVhdGVkIGJ5ICRUSElTUFJPRwotICAgICBmcm9tICRkb2N1IG9uICRUT0RBWSAtLT4KLUVPVAotCi0kZnVsbF90aXRsZSA9ICR2YWx1ZXsnX3RpdGxlJ30gfHwgJHZhbHVleydfc2V0dGl0bGUnfSB8fCAiVW50aXRsZWQgRG9jdW1lbnQiOwotJHRpdGxlID0gJHZhbHVleydfc2V0dGl0bGUnfSB8fCAkZnVsbF90aXRsZTsKLSRfID0gJnN1YnN0aXR1dGVfc3R5bGUoJGZ1bGxfdGl0bGUpOwotJnVucHJvdGVjdF90ZXhpOwotcy9cbiQvLzsgIyBybXYgbGFzdCBcbiAoaWYgYW55KQotJGZ1bGxfdGl0bGUgPSAiPEgxPiIgLiBqb2luKCI8L0gxPlxuPEgxPiIsIHNwbGl0KC9cbi8sICRfKSkgLiAiPC9IMT5cbiI7Ci0KLSMKLSMgcHJpbnQgVG9DCi0jCi1pZiAoISRtb25vbGl0aGljICYmIEB0b2NfbGluZXMpIHsKLSAgICBpZiAob3BlbihGSUxFLCAiPiAkZG9jdV90b2MiKSkgewotCXByaW50ICIjIGNyZWF0aW5nICRkb2N1X3RvYy4uLlxuIiBpZiAkdmVyYm9zZTsKLQkmcHJpbnRfdG9wbGV2ZWxfaGVhZGVyKCIkdGl0bGUgLSBUYWJsZSBvZiBDb250ZW50cyIpOwotCSZwcmludF9ydWxlcjsKLQkmcHJpbnQoKnRvY19saW5lcywgRklMRSk7Ci0JJnByaW50X3RvcGxldmVsX2Zvb3RlcjsKLQljbG9zZShGSUxFKTsKLSAgICB9IGVsc2UgewotCXdhcm4gIiRFUlJPUiBDYW4ndCB3cml0ZSB0byAkZG9jdV90b2M6ICQhXG4iOwotICAgIH0KLX0KLQotIwotIyBwcmludCBmb290bm90ZXMKLSMKLWlmICghJG1vbm9saXRoaWMgJiYgQGZvb3RfbGluZXMpIHsKLSAgICBpZiAob3BlbihGSUxFLCAiPiAkZG9jdV9mb290IikpIHsKLQlwcmludCAiIyBjcmVhdGluZyAkZG9jdV9mb290Li4uXG4iIGlmICR2ZXJib3NlOwotCSZwcmludF90b3BsZXZlbF9oZWFkZXIoIiR0aXRsZSAtIEZvb3Rub3RlcyIpOwotCSZwcmludF9ydWxlcjsKLSAgICAgICAgJnByaW50KCpmb290X2xpbmVzLCBGSUxFKTsKLQkmcHJpbnRfdG9wbGV2ZWxfZm9vdGVyOwotCWNsb3NlKEZJTEUpOwotICAgIH0gZWxzZSB7Ci0Jd2FybiAiJEVSUk9SIENhbid0IHdyaXRlIHRvICRkb2N1X2Zvb3Q6ICQhXG4iOwotICAgIH0KLX0KLQotIwotIyBwcmludCBkb2N1bWVudAotIwotaWYgKCRzcGxpdF9jaGFwdGVyIHx8ICRzcGxpdF9ub2RlKSB7ICMgc3BsaXQKLSAgICAkZG9jX251bSA9IDA7Ci0gICAgJGxhc3RfbnVtID0gc2NhbGFyKEBzZWN0aW9ucyk7Ci0gICAgJGZpcnN0X2RvYyA9ICZkb2NfbmFtZSgxKTsKLSAgICAkbGFzdF9kb2MgPSAmZG9jX25hbWUoJGxhc3RfbnVtKTsKLSAgICB3aGlsZSAoQHNlY3Rpb25zKSB7Ci0JJHNlY3Rpb24gPSBzaGlmdChAc2VjdGlvbnMpOwotCSZuZXh0X2RvYzsKLQlpZiAob3BlbihGSUxFLCAiPiAkZG9jdV9kb2MiKSkgewotCSAgICBwcmludCAiIyBjcmVhdGluZyAkZG9jdV9kb2MuLi5cbiIgaWYgJHZlcmJvc2U7Ci0JICAgICZwcmludF9oZWFkZXIoIiR0aXRsZSAtICRzZWN0aW9uIik7Ci0JICAgICRwcmV2X2RvYyA9ICgkZG9jX251bSA9PSAxID8gdW5kZWYgOiAmZG9jX25hbWUoJGRvY19udW0gLSAxKSk7Ci0JICAgICRuZXh0X2RvYyA9ICgkZG9jX251bSA9PSAkbGFzdF9udW0gPyB1bmRlZiA6ICZkb2NfbmFtZSgkZG9jX251bSArIDEpKTsKLQkgICAgJG5hdmlnYXRpb24gPSAiR28gdG8gdGhlICI7Ci0JICAgICRuYXZpZ2F0aW9uIC49ICgkcHJldl9kb2MgPyAmYW5jaG9yKCcnLCAkZmlyc3RfZG9jLCAiZmlyc3QiKSA6ICJmaXJzdCIpOwotCSAgICAkbmF2aWdhdGlvbiAuPSAiLCAiOwotCSAgICAkbmF2aWdhdGlvbiAuPSAoJHByZXZfZG9jID8gJmFuY2hvcignJywgJHByZXZfZG9jLCAicHJldmlvdXMiKSA6ICJwcmV2aW91cyIpOwotCSAgICAkbmF2aWdhdGlvbiAuPSAiLCAiOwotCSAgICAkbmF2aWdhdGlvbiAuPSAoJG5leHRfZG9jID8gJmFuY2hvcignJywgJG5leHRfZG9jLCAibmV4dCIpIDogIm5leHQiKTsKLQkgICAgJG5hdmlnYXRpb24gLj0gIiwgIjsKLQkgICAgJG5hdmlnYXRpb24gLj0gKCRuZXh0X2RvYyA/ICZhbmNob3IoJycsICRsYXN0X2RvYywgImxhc3QiKSA6ICJsYXN0Iik7Ci0JICAgICRuYXZpZ2F0aW9uIC49ICIgc2VjdGlvbiwgIiAuICZhbmNob3IoJycsICRkb2N1X3RvYywgInRhYmxlIG9mIGNvbnRlbnRzIikgLiAiLlxuIjsKLQkgICAgcHJpbnQgRklMRSAkbmF2aWdhdGlvbjsKLQkgICAgJnByaW50X3J1bGVyOwotCSAgICAjIGZpbmQgY29ycmVzcG9uZGluZyBsaW5lcwotICAgICAgICAgICAgQHRtcF9saW5lcyA9ICgpOwotICAgICAgICAgICAgd2hpbGUgKEBkb2NfbGluZXMpIHsKLQkJJF8gPSBzaGlmdChAZG9jX2xpbmVzKTsKLQkJbGFzdCBpZiAoJF8gZXEgJFNQTElUVEFHKTsKLQkJcHVzaChAdG1wX2xpbmVzLCAkXyk7Ci0JICAgIH0KLSAgICAgICAgICAgICZwcmludCgqdG1wX2xpbmVzLCBGSUxFKTsKLQkgICAgJnByaW50X3J1bGVyOwotCSAgICBwcmludCBGSUxFICRuYXZpZ2F0aW9uOwotCSAgICAmcHJpbnRfZm9vdGVyOwotCSAgICBjbG9zZShGSUxFKTsKLQl9IGVsc2UgewotCSAgICB3YXJuICIkRVJST1IgQ2FuJ3Qgd3JpdGUgdG8gJGRvY3VfZG9jOiAkIVxuIjsKLQl9Ci0gICAgfQotfSBlbHNlIHsgIyBub3Qgc3BsaXQKLSAgICBpZiAob3BlbihGSUxFLCAiPiAkZG9jdV9kb2MiKSkgewotCXByaW50ICIjIGNyZWF0aW5nICRkb2N1X2RvYy4uLlxuIiBpZiAkdmVyYm9zZTsKLQlpZiAoJG1vbm9saXRoaWMgfHwgIUB0b2NfbGluZXMpIHsKLQkgICAgJnByaW50X3RvcGxldmVsX2hlYWRlcigkdGl0bGUpOwotCX0gZWxzZSB7Ci0JICAgICZwcmludF9oZWFkZXIoJHRpdGxlKTsKLQkgICAgcHJpbnQgRklMRSAkZnVsbF90aXRsZTsKLQl9Ci0JaWYgKCRtb25vbGl0aGljICYmIEB0b2NfbGluZXMpIHsKLQkgICAgJnByaW50X3J1bGVyOwotIAkgICAgcHJpbnQgRklMRSAiPEgxPlRhYmxlIG9mIENvbnRlbnRzPC9IMT5cbiI7Ci0gCSAgICAmcHJpbnQoKnRvY19saW5lcywgRklMRSk7Ci0JfQotCSZwcmludF9ydWxlcjsKLSAgICAgICAgJnByaW50KCpkb2NfbGluZXMsIEZJTEUpOwotCWlmICgkbW9ub2xpdGhpYyAmJiBAZm9vdF9saW5lcykgewotCSAgICAmcHJpbnRfcnVsZXI7Ci0gCSAgICBwcmludCBGSUxFICI8SDE+Rm9vdG5vdGVzPC9IMT5cbiI7Ci0gCSAgICAmcHJpbnQoKmZvb3RfbGluZXMsIEZJTEUpOwotCX0KLQlpZiAoJG1vbm9saXRoaWMgfHwgIUB0b2NfbGluZXMpIHsKLQkgICAgJnByaW50X3RvcGxldmVsX2Zvb3RlcjsKLQl9IGVsc2UgewotCSAgICAmcHJpbnRfZm9vdGVyOwotCX0KLQljbG9zZShGSUxFKTsKLSAgICB9IGVsc2UgewotCXdhcm4gIiRFUlJPUiBDYW4ndCB3cml0ZSB0byAkZG9jdV9kb2M6ICQhXG4iOwotICAgIH0KLX0KLQotcHJpbnQgIiMgdGhhdCdzIGFsbCBmb2xrc1xuIiBpZiAkdmVyYm9zZTsKLQotIysrKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIExvdyBsZXZlbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMtLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXN1YiB1cGRhdGVfc2VjX251bSB7Ci0gICAgbG9jYWwoJG5hbWUsICRsZXZlbCkgPSBAXzsKLQotICAgICRsZXZlbC0tOyAjIGhlcmUgd2Ugc3RhcnQgYXQgMAotICAgIGlmICgkbmFtZSA9fiAvXmFwcGVuZGl4LykgewotCSMgYXBwZW5kaXggc3R5bGUKLQlpZiAoZGVmaW5lZChAYXBwZW5kaXhfc2VjX251bSkpIHsKLQkgICAgJmluY3Jfc2VjX251bSgkbGV2ZWwsIEBhcHBlbmRpeF9zZWNfbnVtKTsKLQl9IGVsc2UgewotCSAgICBAYXBwZW5kaXhfc2VjX251bSA9ICgnQScsIDAsIDAsIDApOwotCX0KLQlyZXR1cm4oam9pbignLicsIEBhcHBlbmRpeF9zZWNfbnVtWzAuLiRsZXZlbF0pKTsKLSAgICB9IGVsc2UgewotCSMgbm9ybWFsIHN0eWxlCi0JaWYgKGRlZmluZWQoQG5vcm1hbF9zZWNfbnVtKSkgewotCSAgICAmaW5jcl9zZWNfbnVtKCRsZXZlbCwgQG5vcm1hbF9zZWNfbnVtKTsKLQl9IGVsc2UgewotCSAgICBAbm9ybWFsX3NlY19udW0gPSAoMSwgMCwgMCwgMCk7Ci0JfQotCXJldHVybihqb2luKCcuJywgQG5vcm1hbF9zZWNfbnVtWzAuLiRsZXZlbF0pKTsKLSAgICB9Ci19Ci0KLXN1YiBpbmNyX3NlY19udW0gewotICAgIGxvY2FsKCRsZXZlbCwgJGwpOwotICAgICRsZXZlbCA9IHNoaWZ0KEBfKTsKLSAgICAkX1skbGV2ZWxdKys7Ci0gICAgZm9yZWFjaCAkbCAoJGxldmVsKzEgLi4gMykgewotCSRfWyRsXSA9IDA7Ci0gICAgfQotfQotCi1zdWIgY2hlY2sgewotICAgIGxvY2FsKCRfLCAlc2VlbiwgJWNvbnRleHQsICRiZWZvcmUsICRtYXRjaCwgJGFmdGVyKTsKLQotICAgIHdoaWxlICg8PikgewotCWlmICgvXEAoXCp8XC58XDp8XEB8XHt8XH0pLykgewotCSAgICAkc2VlbnskJn0rKzsKLQkgICAgJGNvbnRleHR7JCZ9IC49ICI+ICRfIiBpZiAkdmVyYm9zZTsKLQkgICAgJF8gPSAiJGBYWCQnIjsKLQkgICAgcmVkbzsKLQl9Ci0JaWYgKC9cQChcdyspLykgewotCSAgICAoJGJlZm9yZSwgJG1hdGNoLCAkYWZ0ZXIpID0gKCRgLCAkJiwgJCcpOwotCSAgICBpZiAoJGJlZm9yZSA9fiAvXGJbXHctXSskLyAmJiAkYWZ0ZXIgPX4gL15bXHctLl0qXGIvKSB7ICMgZS1tYWlsIGFkZHJlc3MKLQkJJHNlZW57J2UtbWFpbCBhZGRyZXNzJ30rKzsKLQkJJGNvbnRleHR7J2UtbWFpbCBhZGRyZXNzJ30gLj0gIj4gJF8iIGlmICR2ZXJib3NlOwotCSAgICB9IGVsc2UgewotCQkkc2VlbnskbWF0Y2h9Kys7Ci0JCSRjb250ZXh0eyRtYXRjaH0gLj0gIj4gJF8iIGlmICR2ZXJib3NlOwotCSAgICB9Ci0JICAgICRtYXRjaCA9fiBzL15cQC9YLzsKLQkgICAgJF8gPSAiJGJlZm9yZSRtYXRjaCRhZnRlciI7Ci0JICAgIHJlZG87Ci0JfQotICAgIH0KLSAgICAKLSAgICBmb3JlYWNoIChzb3J0KGtleXMoJXNlZW4pKSkgewotCWlmICgkdmVyYm9zZSkgewotCSAgICBwcmludCAiJF9cbiI7Ci0JICAgIHByaW50ICRjb250ZXh0eyRffTsKLQl9IGVsc2UgewotCSAgICBwcmludCAiJF8gKCRzZWVueyRffSlcbiI7Ci0JfQotICAgIH0KLX0KLQotc3ViIG9wZW4gewotICAgIGxvY2FsKCRuYW1lKSA9IEBfOwotCi0gICAgKyskZmhfbmFtZTsKLSAgICBpZiAob3BlbigkZmhfbmFtZSwgJG5hbWUpKSB7Ci0JdW5zaGlmdChAZmhzLCAkZmhfbmFtZSk7Ci0gICAgfSBlbHNlIHsKLQl3YXJuICIkRVJST1IgQ2FuJ3QgcmVhZCBmaWxlICRuYW1lOiAkIVxuIjsKLSAgICB9Ci19Ci0KLXN1YiBpbml0X2lucHV0IHsKLSAgICBAZmhzID0gKCk7CQkJIyBob2xkIHRoZSBmaWxlIGhhbmRsZXMgdG8gcmVhZAotICAgIEBpbnB1dF9zcG9vbCA9ICgpOwkJIyBzcG9vbGVkIGxpbmVzIHRvIHJlYWQKLSAgICAkZmhfbmFtZSA9ICdGSDAwMCc7Ci0gICAgJm9wZW4oJGRvY3UpOwotfQotCi1zdWIgbmV4dF9saW5lIHsKLSAgICBsb2NhbCgkZmgsICRsaW5lKTsKLQotICAgIGlmIChAaW5wdXRfc3Bvb2wpIHsKLQkkbGluZSA9IHNoaWZ0KEBpbnB1dF9zcG9vbCk7Ci0JcmV0dXJuKCRsaW5lKTsKLSAgICB9Ci0gICAgd2hpbGUgKEBmaHMpIHsKLQkkZmggPSAkZmhzWzBdOwotCSRsaW5lID0gPCRmaD47Ci0JcmV0dXJuKCRsaW5lKSBpZiAkbGluZTsKLQljbG9zZSgkZmgpOwotCXNoaWZ0KEBmaHMpOwotICAgIH0KLSAgICByZXR1cm4odW5kZWYpOwotfQotCi0jIHVzZWQgaW4gcGFzcyAxLCB1c2UgJm5leHRfbGluZQotc3ViIHNraXBfdW50aWwgewotICAgIGxvY2FsKCR0YWcpID0gQF87Ci0gICAgbG9jYWwoJF8pOwotCi0gICAgd2hpbGUgKCRfID0gJm5leHRfbGluZSkgewotCXJldHVybiBpZiAvXlxAZW5kXHMrJHRhZ1xzKiQvOwotICAgIH0KLSAgICBkaWUgIiogRmFpbGVkIHRvIGZpbmQgJyR0YWcnIGFmdGVyOiAiIC4gJGxpbmVzWyQjbGluZXNdOwotfQotCi0jCi0jIEhUTUwgc3RhY2tpbmcgdG8gaGF2ZSBhIGJldHRlciBIVE1MIG91dHB1dAotIwotCi1zdWIgaHRtbF9yZXNldCB7Ci0gICAgQGh0bWxfc3RhY2sgPSAoJ2h0bWwnKTsKLSAgICAkaHRtbF9lbGVtZW50ID0gJ2JvZHknOwotfQotCi1zdWIgaHRtbF9wdXNoIHsKLSAgICBsb2NhbCgkd2hhdCkgPSBAXzsKLSAgICBwdXNoKEBodG1sX3N0YWNrLCAkaHRtbF9lbGVtZW50KTsKLSAgICAkaHRtbF9lbGVtZW50ID0gJHdoYXQ7Ci19Ci0KLXN1YiBodG1sX3B1c2hfaWYgewotICAgIGxvY2FsKCR3aGF0KSA9IEBfOwotICAgIHB1c2goQGh0bWxfc3RhY2ssICRodG1sX2VsZW1lbnQpCi0JaWYgKCRodG1sX2VsZW1lbnQgJiYgJGh0bWxfZWxlbWVudCBuZSAnUCcpOwotICAgICRodG1sX2VsZW1lbnQgPSAkd2hhdDsKLX0KLQotc3ViIGh0bWxfcG9wIHsKLSAgICAkaHRtbF9lbGVtZW50ID0gcG9wKEBodG1sX3N0YWNrKTsKLX0KLQotc3ViIGh0bWxfcG9wX2lmIHsKLSAgICBsb2NhbCgkZWx0KTsKLQotICAgIGlmIChAXykgewotCWZvcmVhY2ggJGVsdCAoQF8pIHsKLQkgICAgaWYgKCRlbHQgZXEgJGh0bWxfZWxlbWVudCkgewotCQkkaHRtbF9lbGVtZW50ID0gcG9wKEBodG1sX3N0YWNrKSBpZiBAaHRtbF9zdGFjazsKLQkJbGFzdDsKLQkgICAgfQotCX0KLSAgICB9IGVsc2UgewotCSRodG1sX2VsZW1lbnQgPSBwb3AoQGh0bWxfc3RhY2spIGlmIEBodG1sX3N0YWNrOwotICAgIH0KLX0KLQotc3ViIGh0bWxfZGVidWcgewotICAgIGxvY2FsKCR3aGF0LCAkbGluZSkgPSBAXzsKLSAgICByZXR1cm4oIjwhLS0gJGxpbmUgQGh0bWxfc3RhY2ssICRodG1sX2VsZW1lbnQgLS0+JHdoYXQiKQotCWlmICRkZWJ1ZyAmICRERUJVR19IVE1MOwotICAgIHJldHVybigkd2hhdCk7Ci19Ci0KLSMgdG8gZGVidWcgdGhlIG91dHB1dC4uLgotc3ViIGRlYnVnIHsKLSAgICBsb2NhbCgkd2hhdCwgJGxpbmUpID0gQF87Ci0gICAgcmV0dXJuKCI8IS0tICRsaW5lIC0tPiR3aGF0IikKLQlpZiAkZGVidWcgJiAkREVCVUdfSFRNTDsKLSAgICByZXR1cm4oJHdoYXQpOwotfQotCi1zdWIgbm9ybWFsaXNlX25vZGUgewotICAgICRfWzBdID1+IHMvXHMrLyAvZzsKLSAgICAkX1swXSA9fiBzLyAkLy87Ci0gICAgJF9bMF0gPX4gcy9eIC8vOwotfQotCi1zdWIgbWVudV9lbnRyeSB7Ci0gICAgbG9jYWwoJGVudHJ5LCAkbm9kZSwgJGRlc2NyKSA9IEBfOwotICAgIGxvY2FsKCRocmVmKTsKLQotICAgICZub3JtYWxpc2Vfbm9kZSgkbm9kZSk7Ci0gICAgJGhyZWYgPSAkbm9kZTJocmVmeyRub2RlfTsKLSAgICBpZiAoJGhyZWYpIHsKLQkkZGVzY3IgPX4gcy9eXHMrLy87Ci0JJGRlc2NyID0gIjogJGRlc2NyIiBpZiAkZGVzY3I7Ci0JcHVzaChAbGluZXMyLCAiPExJPiIgLiAmYW5jaG9yKCcnLCAkaHJlZiwgJGVudHJ5KSAuICIkZGVzY3JcbiIpOwotICAgIH0gZWxzZSB7Ci0Jd2FybiAiJEVSUk9SIFVuZGVmaW5lZCBub2RlICgkbm9kZSk6ICRfIjsKLSAgICB9Ci19Ci0KLXN1YiBkb19jdHJsIHsgIl4kX1swXSIgfQotCi1zdWIgZG9fZW1haWwgewotICAgIGxvY2FsKCRhZGRyLCAkdGV4dCkgPSBzcGxpdCgvLFxzKi8sICRfWzBdKTsKLQotICAgICR0ZXh0ID0gJGFkZHIgdW5sZXNzICR0ZXh0OwotICAgICZhbmNob3IoJycsICJtYWlsdG86JGFkZHIiLCAkdGV4dCk7Ci19Ci0KLXN1YiBkb19zYyB7ICJcVSRfWzBdXEUiIH0KLQotc3ViIGRvX3VyZWYgewotICAgIGxvY2FsKCR1cmwsICR0ZXh0KSA9IHNwbGl0KC8sXHMqLywgJF9bMF0pOwotCi0gICAgJHRleHQgPSAkdXJsIHVubGVzcyAkdGV4dDsKLSAgICAmYW5jaG9yKCcnLCAkdXJsLCAkdGV4dCk7Ci19Ci0KLXN1YiBkb191cmwgeyAmYW5jaG9yKCcnLCAkX1swXSwgJF9bMF0pIH0KLQotc3ViIGFwcGx5X3N0eWxlIHsKLSAgICBsb2NhbCgkdGV4aV9zdHlsZSwgJHRleHQpID0gQF87Ci0gICAgbG9jYWwoJHN0eWxlKTsKLQotICAgICRzdHlsZSA9ICRzdHlsZV9tYXB7JHRleGlfc3R5bGV9OwotICAgIGlmIChkZWZpbmVkKCRzdHlsZSkpIHsgIyBrbm93biBzdHlsZQotCWlmICgkc3R5bGUgPX4gL15cIi8pIHsgIyBhZGQgcXVvdGVzCi0JICAgICRzdHlsZSA9ICQnOwotCSAgICAkdGV4dCA9ICJcYCR0ZXh0XCciOwotCX0KLQlpZiAoJHN0eWxlID1+IC9eXCYvKSB7ICMgY3VzdG9tCi0JICAgICRzdHlsZSA9ICQnOwotCSAgICAkdGV4dCA9ICYkc3R5bGUoJHRleHQpOwotCX0gZWxzaWYgKCRzdHlsZSkgeyAjIGdvb2Qgc3R5bGUKLQkgICAgJHRleHQgPSAiPCRzdHlsZT4kdGV4dDwvJHN0eWxlPiI7Ci0JfSBlbHNlIHsgIyBubyBzdHlsZQotCX0KLSAgICB9IGVsc2UgeyAjIHVua25vd24gc3R5bGUKLQkkdGV4dCA9IHVuZGVmOwotICAgIH0KLSAgICByZXR1cm4oJHRleHQpOwotfQotCi0jIHJlbW92ZSBUZXhpbmZvIHN0eWxlcwotc3ViIHJlbW92ZV9zdHlsZSB7Ci0gICAgbG9jYWwoJF8pID0gQF87Ci0gICAgcy9cQFx3K3soW15ce1x9XSspfS8kMS9nOwotICAgIHJldHVybigkXyk7Ci19Ci0KLXN1YiBzdWJzdGl0dXRlX3N0eWxlIHsKLSAgICBsb2NhbCgkXykgPSBAXzsKLSAgICBsb2NhbCgkY2hhbmdlZCwgJGRvbmUsICRzdHlsZSwgJHRleHQpOwotCi0gICAgJGNoYW5nZWQgPSAxOwotICAgIHdoaWxlICgkY2hhbmdlZCkgewotCSRjaGFuZ2VkID0gMDsKLQkkZG9uZSA9ICcnOwotCXdoaWxlICgvXEAoXHcrKXsoW15ce1x9XSspfS8pIHsKLQkgICAgJHRleHQgPSAmYXBwbHlfc3R5bGUoJDEsICQyKTsKLQkgICAgaWYgKCR0ZXh0KSB7Ci0JCSRfID0gIiRgJHRleHQkJyI7Ci0JCSRjaGFuZ2VkID0gMTsKLQkgICAgfSBlbHNlIHsKLQkJJGRvbmUgLj0gIiRgXEAkMSI7Ci0JCSRfID0gInskMn0kJyI7Ci0JICAgIH0KLQl9Ci0gICAgICAgICRfID0gJGRvbmUgLiAkXzsKLSAgICB9Ci0gICAgcmV0dXJuKCRfKTsKLX0KLQotc3ViIGFuY2hvciB7Ci0gICAgbG9jYWwoJG5hbWUsICRocmVmLCAkdGV4dCwgJG5ld2xpbmUpID0gQF87Ci0gICAgbG9jYWwoJHJlc3VsdCk7Ci0KLSAgICAkcmVzdWx0ID0gIjxBIjsKLSAgICAkcmVzdWx0IC49ICIgTkFNRT1cIiRuYW1lXCIiIGlmICRuYW1lOwotICAgICRyZXN1bHQgLj0gIiBIUkVGPVwiJGhyZWZcIiIgaWYgJGhyZWY7Ci0gICAgJHJlc3VsdCAuPSAiPiR0ZXh0PC9BPiI7Ci0gICAgJHJlc3VsdCAuPSAiXG4iIGlmICRuZXdsaW5lOwotICAgIHJldHVybigkcmVzdWx0KTsKLX0KLQotc3ViIHByZXR0eV9kYXRlIHsKLSAgICBsb2NhbChATW9ZLCAkc2VjLCAkbWluLCAkaG91ciwgJG1kYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXksICRpc2RzdCk7Ci0KLSAgICBATW9ZID0gKCdKYW51YXJ5JywgJ0ZlYnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLAotCSAgICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInKTsKLSAgICAoJHNlYywgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uLCAkeWVhciwgJHdkYXksICR5ZGF5LCAkaXNkc3QpID0gbG9jYWx0aW1lKHRpbWUpOwotICAgICR5ZWFyICs9ICgkeWVhciA8IDcwKSA/IDIwMDAgOiAxOTAwOwotICAgIHJldHVybigiJG1kYXkgJE1vWVskbW9uXSAkeWVhciIpOwotfQotCi1zdWIgZG9jX25hbWUgewotICAgIGxvY2FsKCRudW0pID0gQF87Ci0KLSAgICByZXR1cm4oIiR7ZG9jdV9uYW1lfV8kbnVtLmh0bWwiKTsKLX0KLQotc3ViIG5leHRfZG9jIHsKLSAgICAkZG9jdV9kb2MgPSAmZG9jX25hbWUoKyskZG9jX251bSk7Ci19Ci0KLXN1YiBwcmludCB7Ci0gICAgbG9jYWwoKmxpbmVzLCAkZmgpID0gQF87Ci0gICAgbG9jYWwoJF8pOwotCi0gICAgd2hpbGUgKEBsaW5lcykgewotCSRfID0gc2hpZnQoQGxpbmVzKTsKLQlpZiAoL14kUFJPVEVDVFRBRy9vKSB7Ci0JICAgICRfID0gJHRhZzJwcm97JF99OwotCX0gZWxzZSB7Ci0JICAgICZ1bnByb3RlY3RfdGV4aTsKLQl9Ci0JcHJpbnQgJGZoICRfOwotICAgIH0KLX0KLQotc3ViIHByaW50X3J1bGVyIHsKLSAgICBwcmludCBGSUxFICI8UD48SFI+PFA+XG4iOwotfQotCi1zdWIgcHJpbnRfaGVhZGVyIHsKLSAgICBsb2NhbCgkXyk7Ci0KLSAgICAjIGNsZWFuIHRoZSB0aXRsZQotICAgICRfID0gJnJlbW92ZV9zdHlsZSgkX1swXSk7Ci0gICAgJnVucHJvdGVjdF90ZXhpOwotICAgICMgcHJpbnQgdGhlIGhlYWRlcgotICAgIGlmICgkZG9jdHlwZSBlcSAnaHRtbDInKSB7Ci0JcHJpbnQgRklMRSAkaHRtbDJfZG9jdHlwZTsKLSAgICB9IGVsc2lmICgkZG9jdHlwZSkgewotCXByaW50IEZJTEUgJGRvY3R5cGU7Ci0gICAgfQotICAgIHByaW50IEZJTEUgPDxFT1Q7Ci08SFRNTD4KLTxIRUFEPgotJGhlYWRlcgotPFRJVExFPiRfPC9USVRMRT4KLTwvSEVBRD4KLTxCT0RZPgotRU9UCi19Ci0KLXN1YiBwcmludF90b3BsZXZlbF9oZWFkZXIgewotICAgIGxvY2FsKCRfKTsKLQotICAgICZwcmludF9oZWFkZXI7ICMgcGFzcyBnaXZlbiBhcmcuLi4KLSAgICBwcmludCBGSUxFICRmdWxsX3RpdGxlOwotICAgIGlmICgkdmFsdWV7J19zdWJ0aXRsZSd9KSB7Ci0JJHZhbHVleydfc3VidGl0bGUnfSA9fiBzL1xuKyQvLzsKLQlmb3JlYWNoIChzcGxpdCgvXG4vLCAkdmFsdWV7J19zdWJ0aXRsZSd9KSkgewotCSAgICAkXyA9ICZzdWJzdGl0dXRlX3N0eWxlKCRfKTsKLQkgICAgJnVucHJvdGVjdF90ZXhpOwotCSAgICBwcmludCBGSUxFICI8SDI+JF88L0gyPlxuIjsKLQl9Ci0gICAgfQotICAgIGlmICgkdmFsdWV7J19hdXRob3InfSkgewotCSR2YWx1ZXsnX2F1dGhvcid9ID1+IHMvXG4rJC8vOwotCWZvcmVhY2ggKHNwbGl0KC9cbi8sICR2YWx1ZXsnX2F1dGhvcid9KSkgewotCSAgICAkXyA9ICZzdWJzdGl0dXRlX3N0eWxlKCRfKTsKLQkgICAgJnVucHJvdGVjdF90ZXhpOwotCSAgICBzL1tcdy4tXStcQFtcdy4tXSsvPEEgSFJFRj0ibWFpbHRvOiQmIj4kJjxcL0E+L2c7Ci0JICAgIHByaW50IEZJTEUgIjxBRERSRVNTPiRfPC9BRERSRVNTPlxuIjsKLQl9Ci0gICAgfQotICAgIHByaW50IEZJTEUgIjxQPlxuIjsKLX0KLQotc3ViIHByaW50X2Zvb3RlciB7Ci0gICAgcHJpbnQgRklMRSA8PEVPVDsKLTwvQk9EWT4KLTwvSFRNTD4KLUVPVAotfQotCi1zdWIgcHJpbnRfdG9wbGV2ZWxfZm9vdGVyIHsKLSAgICAmcHJpbnRfcnVsZXI7Ci0gICAgcHJpbnQgRklMRSA8PEVPVDsKLVRoaXMgZG9jdW1lbnQgd2FzIGdlbmVyYXRlZCBvbiAkVE9EQVkgdXNpbmcgdGhlCi08QSBIUkVGPVwiJEhPTUVQQUdFXCI+dGV4aTJodG1sPC9BPgotdHJhbnNsYXRvciB2ZXJzaW9uIDEuNTIuPC9QPgotRU9UCi0gICAgJnByaW50X2Zvb3RlcjsKLX0KLQotc3ViIHByb3RlY3RfdGV4aSB7Ci0gICAgIyBwcm90ZWN0IEAgeyB9IGAgJwotICAgIHMvXEBcQC8kOzAvZ287Ci0gICAgcy9cQFx7LyQ7MS9nbzsKLSAgICBzL1xAXH0vJDsyL2dvOwotICAgIHMvXEBcYC8kOzMvZ287Ci0gICAgcy9cQFwnLyQ7NC9nbzsKLX0KLQotc3ViIHByb3RlY3RfaHRtbCB7Ci0gICAgbG9jYWwoJHdoYXQpID0gQF87Ci0gICAgIyBwcm90ZWN0ICYgPCA+Ci0gICAgJHdoYXQgPX4gcy9cJi9cJlwjMzg7L2c7Ci0gICAgJHdoYXQgPX4gcy9cPC9cJlwjNjA7L2c7Ci0gICAgJHdoYXQgPX4gcy9cPi9cJlwjNjI7L2c7Ci0gICAgIyBidXQgcmVjb2duaXplIHNvbWUgSFRNTCB0aGluZ3MKLSAgICAkd2hhdCA9fiBzL1wmXCM2MDtcL0FcJlwjNjI7LzxcL0E+L2c7CSAgICAgICMgPC9BPgotICAgICR3aGF0ID1+IHMvXCZcIzYwO0EgKFteXCZdKylcJlwjNjI7LzxBICQxPi9nOyAgICAgIyA8QSBbXiZdKz4KLSAgICAkd2hhdCA9fiBzL1wmXCM2MDtJTUcgKFteXCZdKylcJlwjNjI7LzxJTUcgJDE+L2c7ICMgPElNRyBbXiZdKz4KLSAgICByZXR1cm4oJHdoYXQpOwotfQotCi1zdWIgdW5wcm90ZWN0X3RleGkgewotICAgIHMvJDswL1xAL2dvOwotICAgIHMvJDsxL1x7L2dvOwotICAgIHMvJDsyL1x9L2dvOwotICAgIHMvJDszL1xgL2dvOwotICAgIHMvJDs0L1wnL2dvOwotfQotCi1zdWIgdW5wcm90ZWN0X2h0bWwgewotICAgIGxvY2FsKCR3aGF0KSA9IEBfOwotICAgICR3aGF0ID1+IHMvXCZcIzM4Oy9cJi9nOwotICAgICR3aGF0ID1+IHMvXCZcIzYwOy9cPC9nOwotICAgICR3aGF0ID1+IHMvXCZcIzYyOy9cPi9nOwotICAgIHJldHVybigkd2hhdCk7Ci19Ci0KLXN1YiBieWFscGhhIHsKLSAgICAka2V5MmFscGhheyRhfSBjbXAgJGtleTJhbHBoYXskYn07Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0JIyBUaGVzZSBuZXh0IGZldyBsaW5lcyBhcmUgbGVnYWwgaW4gYm90aCBQZXJsIGFuZCBucm9mZi4KLQotLjAwIDsJCQkjIGZpbmlzaCAuaWcKLSAKLSdkaQkJCVwiIGZpbmlzaCBkaXZlcnNpb24tLXByZXZpb3VzIGxpbmUgbXVzdCBiZSBibGFuawotLm5yIG5sIDAtMQkJXCIgZmFrZSB1cCB0cmFuc2l0aW9uIHRvIGZpcnN0IHBhZ2UgYWdhaW4KLS5uciAlIDAJCQlcIiBzdGFydCBhdCBwYWdlIDEKLSc7IF9fRU5EX18gIyMjIyMjIyMjIyMjIyBGcm9tIGhlcmUgb24gaXQncyBhIHN0YW5kYXJkIG1hbnVhbCBwYWdlICMjIyMjIyMjIyMjIwotLlRIIFRFWEkySFRNTCAxICIwMS8wNS85OCIKLS5BVCAzCi0uU0ggTkFNRQotdGV4aTJodG1sIFwtIGEgVGV4aW5mbyB0byBIVE1MIGNvbnZlcnRlcgotLlNIIFNZTk9QU0lTCi0uQiB0ZXhpMmh0bWwgW29wdGlvbnNdIGZpbGUKLS5QUAotLkIgdGV4aTJodG1sIC1jaGVjayBbLXZlcmJvc2VdIGZpbGVzCi0uU0ggREVTQ1JJUFRJT04KLS5JIFRleGkyaHRtbAotY29udmVydHMgdGhlIGdpdmVuIFRleGluZm8gZmlsZSB0byBhIHNldCBvZiBIVE1MIGZpbGVzLiBJdCB0cmllcyB0byBoYW5kbGUKLW1vc3Qgb2YgdGhlIFRleGluZm8gY29tbWFuZHMuIEl0IGNyZWF0ZXMgaHlwZXJ0ZXh0IGxpbmtzIGZvciBjcm9zcy1yZWZlcmVuY2VzLAotZm9vdG5vdGVzLi4uCi0uUFAKLUl0IGFsc28gdHJpZXMgdG8gYWRkIGxpbmtzIGZyb20gYSByZWZlcmVuY2UgdG8gaXRzIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlCi1iaWJsaW9ncmFwaHkgKGlmIGFueSkuIEl0IG1heSBhbHNvIGhhbmRsZSBhIGdsb3NzYXJ5IChzZWUgdGhlCi0uQiBcLWdsb3NzYXJ5Ci1vcHRpb24pLgotLlBQCi0uSSBUZXhpMmh0bWwKLWNyZWF0ZXMgc2V2ZXJhbCBmaWxlcyBkZXBlbmRpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBUZXhpbmZvIGZpbGUgYW5kIG9uCi10aGUgY2hvc2VuIG9wdGlvbnMgKHNlZSBGSUxFUykuCi0uUFAKLVRoZSBIVE1MIGZpbGVzIGNyZWF0ZWQgYnkKLS5JIHRleGkyaHRtbAotYXJlIGNsb3NlciB0byBUZVggdGhhbiB0byBJbmZvLCB0aGF0J3Mgd2h5Ci0uSSB0ZXhpMmh0bWwKLWNvbnZlcnRzIEBpZnRleCBzZWN0aW9ucyBhbmQgbm90IEBpZmluZm8gb25lcyBieSBkZWZhdWx0LiBZb3UgY2FuIHJldmVyc2UKLXRoaXMgd2l0aCB0aGUgXC1leHBhbmRpbmZvIG9wdGlvbi4KLS5TSCBPUFRJT05TCi0uVFAgMTIKLS5CIFwtY2hlY2sKLUNoZWNrIHRoZSBnaXZlbiBmaWxlIGFuZCBnaXZlIHRoZSBsaXN0IG9mIGFsbCB0aGluZ3MgdGhhdCBtYXkgYmUgVGV4aW5mbyBjb21tYW5kcy4KLVRoaXMgbWF5IGJlIHVzZWQgdG8gY2hlY2sgdGhlIG91dHB1dCBvZgotLkkgdGV4aTJodG1sCi10byBmaW5kIHRoZSBUZXhpbmZvIGNvbW1hbmRzIHRoYXQgaGF2ZSBiZWVuIGxlZnQgaW4gdGhlIEhUTUwgZmlsZS4KLS5UUAotLkIgXC1leHBhbmRpbmZvCi1FeHBhbmQgQGlmaW5mbyBzZWN0aW9ucywgbm90IEBpZnRleCBvbmVzLgotLlRQCi0uQiBcLWdsb3NzYXJ5Ci1Vc2UgdGhlIHNlY3Rpb24gbmFtZWQgJ0dsb3NzYXJ5JyB0byBidWlsZCBhIGxpc3Qgb2YgdGVybXMgYW5kIHB1dCBsaW5rcyBpbiB0aGUgSFRNTAotZG9jdW1lbnQgZnJvbSBlYWNoIHRlcm0gdG93YXJkIGl0cyBkZWZpbml0aW9uLgotLlRQCi0uQiBcLWludmlzaWJsZSBcZkluYW1lXGZQCi1Vc2UgXGZJbmFtZVxmUCB0byBjcmVhdGUgaW52aXNpYmxlIGRlc3RpbmF0aW9uIGFuY2hvcnMgZm9yIGluZGV4IGxpbmtzCi0oeW91IGNhbiBmb3IgaW5zdGFuY2UgdXNlIHRoZSBpbnZpc2libGUueGJtIGZpbGUgc2hpcHBlZCB3aXRoIHRoaXMgcHJvZ3JhbSkuCi1UaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBrbm93biBidWcgb2YgbWFueSBXV1cgYnJvd3NlcnMsIGluY2x1ZGluZyBuZXRzY2FwZS4KLS5UUAotLkIgXC1JIFxmSWRpclxmUAotTG9vayBhbHNvIGluIFxmSWRpclxmUCB0byBmaW5kIGluY2x1ZGVkIGZpbGVzLgotLlRQCi0uQiBcLW1lbnUKLVNob3cgdGhlIFRleGluZm8gbWVudXM7IGJ5IGRlZmF1bHQgdGhleSBhcmUgaWdub3JlZC4KLS5UUAotLkIgXC1tb25vbGl0aGljCi1PdXRwdXQgb25seSBvbmUgZmlsZSwgaW5jbHVkaW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cyBhbmQgZm9vdG5vdGVzLgotLlRQCi0uQiBcLW51bWJlcgotTnVtYmVyIHRoZSBzZWN0aW9ucy4KLS5UUAotLkIgXC1zcGxpdF9jaGFwdGVyCi1TcGxpdCB0aGUgb3V0cHV0IGludG8gc2V2ZXJhbCBIVE1MIGZpbGVzIChvbmUgcGVyIG1haW4gc2VjdGlvbjoKLWNoYXB0ZXIsIGFwcGVuZGl4Li4uKS4KLS5UUAotLkIgXC1zcGxpdF9ub2RlCi1TcGxpdCB0aGUgb3V0cHV0IGludG8gc2V2ZXJhbCBIVE1MIGZpbGVzIChvbmUgcGVyIG5vZGUpLgotLlRQCi0uQiBcLXVzYWdlCi1QcmludCB1c2FnZSBpbnN0cnVjdGlvbnMsIGxpc3RpbmcgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGNvbW1hbmQtbGluZSBvcHRpb25zLgotLlRQCi0uQiBcLXZlcmJvc2UKLUdpdmUgYSB2ZXJib3NlIG91dHB1dC4gQ2FuIGJlIHVzZWQgd2l0aCB0aGUKLS5CIFwtY2hlY2sKLW9wdGlvbi4KLS5QUAotLlNIIEZJTEVTCi1CeSBkZWZhdWx0Ci0uSSB0ZXhpMmh0bWwKLWNyZWF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcyAoZm9vIGJlaW5nIHRoZSBuYW1lIG9mIHRoZSBUZXhpbmZvIGZpbGUpOgotLlRQIDE2Ci0uQiBmb29fdG9jLmh0bWwKLVRoZSB0YWJsZSBvZiBjb250ZW50cy4KLS5UUAotLkIgZm9vLmh0bWwKLVRoZSBkb2N1bWVudCdzIGNvbnRlbnRzLgotLlRQCi0uQiBmb29fZm9vdC5odG1sCi1UaGUgZm9vdG5vdGVzIChpZiBhbnkpLgotLlBQCi1XaGVuIHVzZWQgd2l0aCB0aGUKLS5CIFwtc3BsaXQKLW9wdGlvbiwgaXQgY3JlYXRlcyBzZXZlcmFsIGZpbGVzIChvbmUgcGVyIGNoYXB0ZXIgb3Igbm9kZSksIG5hbWVkCi0uQiBmb29fbi5odG1sCi0obiBiZWluZyB0aGUgaW5kaWNlIG9mIHRoZSBjaGFwdGVyIG9yIG5vZGUpLCBpbnN0ZWFkIG9mIHRoZSBzaW5nbGUKLS5CIGZvby5odG1sCi1maWxlLgotLlBQCi1XaGVuIHVzZWQgd2l0aCB0aGUKLS5CIFwtbW9ub2xpdGhpYwotb3B0aW9uLCBpdCBjcmVhdGVzIG9ubHkgb25lIGZpbGU6Ci0uQiBmb28uaHRtbAotLlNIIFZBUklBQkxFUwotLkkgdGV4aTJodG1sCi1wcmVkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiBcZkJodG1sXGZQLCBcZkJ0ZXhpMmh0bWxcZlAuCi0uU0ggQURESVRJT05BTCBDT01NQU5EUwotLkkgdGV4aTJodG1sCi1pbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgbm9uLVRleGluZm8gY29tbWFuZHMgKG1heWJlIHRoZXkgYXJlIGluIFRleGluZm8gbm93Li4uKToKLS5UUCAxNgotLkIgQGlmaHRtbAotVGhpcyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGFuIEhUTUwgc2VjdGlvbiwgdGhpcyBzZWN0aW9uIHdpbGwgcGFzc2VkIHRocm91Z2gKLXdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4KLS5UUAotLkIgQGVuZCBpZmh0bWwKLVRoaXMgaW5kaWNhdGVzIHRoZSBlbmQgb2YgYW4gSFRNTCBzZWN0aW9uLgotLlNIIFZFUlNJT04KLVRoaXMgaXMgXGZJdGV4aTJodG1sXGZQIHZlcnNpb24gMS41MiwgMDEvMDUvOTguCi0uUFAKLVRoZSBsYXRlc3QgdmVyc2lvbiBvZiBcZkl0ZXhpMmh0bWxcZlAgY2FuIGJlIGZvdW5kIGluIFdXVywgY2YuIFVSTAotaHR0cDovL3d3d2luZm8uY2Vybi5jaC9kaXMvdGV4aTJodG1sLwotLlNIIEFVVEhPUgotVGhlIG1haW4gYXV0aG9yIGlzIExpb25lbCBDb25zLCBDRVJOIElUL0RJUy9PU0UsIExpb25lbC5Db25zQGNlcm4uY2guCi1NYW55IG90aGVyIHBlb3BsZSBhcm91bmQgdGhlIG5ldCBjb250cmlidXRlZCB0byB0aGlzIHByb2dyYW0uCi0uU0ggQ09QWVJJR0hUCi1UaGlzIHByb2dyYW0gaXMgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgRXVyb3BlYW4KLUxhYm9yYXRvcnkgZm9yIFBhcnRpY2xlIFBoeXNpY3MgKGtub3duIGFzIENFUk4pLiBObyBndWFyYW50ZWUgd2hhdHNvZXZlciBpcwotcHJvdmlkZWQgYnkgQ0VSTi4gTm8gbGlhYmlsaXR5IHdoYXRzb2V2ZXIgaXMgYWNjZXB0ZWQgZm9yIGFueSBsb3NzIG9yIGRhbWFnZQotb2YgYW55IGtpbmQgcmVzdWx0aW5nIGZyb20gYW55IGRlZmVjdCBvciBpbmFjY3VyYWN5IGluIHRoaXMgaW5mb3JtYXRpb24gb3IKLWNvZGUuCi0uUFAKLUNFUk4sIDEyMTEgR2VuZXZhIDIzLCBTd2l0emVybGFuZAotLlNIICJTRUUgQUxTTyIKLUdOVSBUZXhpbmZvIERvY3VtZW50YXRpb24gRm9ybWF0LAotSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoSFRNTCksCi1Xb3JsZCBXaWRlIFdlYiAoV1dXKS4KLS5TSCBCVUdTCi1UaGlzIHByb2dyYW0gZG9lcyBub3QgdW5kZXJzdGFuZCBhbGwgVGV4aW5mbyBjb21tYW5kcyAoeWV0KS4KLS5QUAotVGVYIHNwZWNpZmljIGNvbW1hbmRzIChub3JtYWxseSBlbmNsb3NlZCBpbiBAaWZ0ZXgpIHdpbGwgYmUKLXBhc3NlZCB1bm1vZGlmaWVkLgotLmV4CmRpZmYgLS1naXQgYS9yZWFkbGluZS9lbWFjc19rZXltYXAuYyBiL3JlYWRsaW5lL2VtYWNzX2tleW1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmEzODU4Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2VtYWNzX2tleW1hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODg1ICswLDAgQEAKLS8qIGVtYWNzX2tleW1hcC5jIC0tIHRoZSBrZXltYXAgZm9yIGVtYWNzX21vZGUgaW4gcmVhZGxpbmUgKCkuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLSNpZiAhZGVmaW5lZCAoQlVGU0laKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYgLyogIUJVRlNJWiAqLwotCi0jaW5jbHVkZSAicmVhZGxpbmUuaCIKLQotLyogQW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZSBrZXkuCi0gICBJZiB0aGUgdHlwZSBieXRlIGlzIElTS01BUCwgdGhlbiB0aGUgcG9pbnRlciBpcyB0aGUgYWRkcmVzcyBvZgotICAgYSBrZXltYXAuICovCi0KLUtFWU1BUF9FTlRSWV9BUlJBWSBlbWFjc19zdGFuZGFyZF9rZXltYXAgPSB7Ci0KLSAgLyogQ29udHJvbCBrZXlzLiAqLwotICB7IElTRlVOQywgcmxfc2V0X21hcmsgfSwJCS8qIENvbnRyb2wtQCAqLwotICB7IElTRlVOQywgcmxfYmVnX29mX2xpbmUgfSwJCS8qIENvbnRyb2wtYSAqLwotICB7IElTRlVOQywgcmxfYmFja3dhcmQgfSwJCS8qIENvbnRyb2wtYiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWMgKi8KLSAgeyBJU0ZVTkMsIHJsX2RlbGV0ZSB9LAkJLyogQ29udHJvbC1kICovCi0gIHsgSVNGVU5DLCBybF9lbmRfb2ZfbGluZSB9LAkJLyogQ29udHJvbC1lICovCi0gIHsgSVNGVU5DLCBybF9mb3J3YXJkIH0sCQkvKiBDb250cm9sLWYgKi8KLSAgeyBJU0ZVTkMsIHJsX2Fib3J0IH0sCQkJLyogQ29udHJvbC1nICovCi0gIHsgSVNGVU5DLCBybF9ydWJvdXQgfSwJCS8qIENvbnRyb2wtaCAqLwotICB7IElTRlVOQywgcmxfY29tcGxldGUgfSwJCS8qIENvbnRyb2wtaSAqLwotICB7IElTRlVOQywgcmxfbmV3bGluZSB9LAkJLyogQ29udHJvbC1qICovCi0gIHsgSVNGVU5DLCBybF9raWxsX2xpbmUgfSwJCS8qIENvbnRyb2wtayAqLwotICB7IElTRlVOQywgcmxfY2xlYXJfc2NyZWVuIH0sCQkvKiBDb250cm9sLWwgKi8KLSAgeyBJU0ZVTkMsIHJsX25ld2xpbmUgfSwJCS8qIENvbnRyb2wtbSAqLwotICB7IElTRlVOQywgcmxfZ2V0X25leHRfaGlzdG9yeSB9LAkvKiBDb250cm9sLW4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1vICovCi0gIHsgSVNGVU5DLCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSB9LAkvKiBDb250cm9sLXAgKi8KLSAgeyBJU0ZVTkMsIHJsX3F1b3RlZF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtcSAqLwotICB7IElTRlVOQywgcmxfcmV2ZXJzZV9zZWFyY2hfaGlzdG9yeSB9LCAvKiBDb250cm9sLXIgKi8KLSAgeyBJU0ZVTkMsIHJsX2ZvcndhcmRfc2VhcmNoX2hpc3RvcnkgfSwgLyogQ29udHJvbC1zICovCi0gIHsgSVNGVU5DLCBybF90cmFuc3Bvc2VfY2hhcnMgfSwJLyogQ29udHJvbC10ICovCi0gIHsgSVNGVU5DLCBybF91bml4X2xpbmVfZGlzY2FyZCB9LAkvKiBDb250cm9sLXUgKi8KLSAgeyBJU0ZVTkMsIHJsX3F1b3RlZF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtdiAqLwotICB7IElTRlVOQywgcmxfdW5peF93b3JkX3J1Ym91dCB9LAkvKiBDb250cm9sLXcgKi8KLSAgeyBJU0tNQVAsIChGdW5jdGlvbiAqKWVtYWNzX2N0bHhfa2V5bWFwIH0sCS8qIENvbnRyb2wteCAqLwotICB7IElTRlVOQywgcmxfeWFuayB9LAkJCS8qIENvbnRyb2wteSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXogKi8KLSAgeyBJU0tNQVAsIChGdW5jdGlvbiAqKWVtYWNzX21ldGFfa2V5bWFwIH0sIC8qIENvbnRyb2wtWyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLVwgKi8KLSAgeyBJU0ZVTkMsIHJsX2NoYXJfc2VhcmNoIH0sCQkvKiBDb250cm9sLV0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1eICovCi0gIHsgSVNGVU5DLCBybF91bmRvX2NvbW1hbmQgfSwJCS8qIENvbnRyb2wtXyAqLwotCi0gIC8qIFRoZSBzdGFydCBvZiBwcmludGluZyBjaGFyYWN0ZXJzLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFNQQUNFICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogISAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qICIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAjICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogJCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qICUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAmICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogJyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qICggKi8KLSNpZiBkZWZpbmVkIChQQVJFTl9NQVRDSElORykKLSAgeyBJU0ZVTkMsIHJsX2luc2VydF9jbG9zZSB9LAkvKiApICovCi0jZWxzZQotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qICkgKi8KLSNlbmRpZiAvKiAhUEFSRU5fTUFUQ0hJTkcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAqICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogKyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qICwgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAtICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIC8gKi8KLQotICAvKiBSZWd1bGFyIGRpZ2l0cy4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAwICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogMSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIDIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiAzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogNCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIDUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA2ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogNyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIDggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA5ICovCi0KLSAgLyogQSBsaXR0bGUgbW9yZSBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA6ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogOyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIDwgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA9ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBAICovCi0KLSAgLyogVXBwZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIEEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBCICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogQyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIEQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBFICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogRiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIEcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBIICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogSSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIEogKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBLICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE0gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBOICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFAgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBRICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogUiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBUICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogVSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFYgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBXICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogWCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFkgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBaICovCi0KLSAgLyogU29tZSBtb3JlIHB1bmN0dWF0aW9uLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBcICovCi0jaWYgZGVmaW5lZCAoUEFSRU5fTUFUQ0hJTkcpCi0gIHsgSVNGVU5DLCBybF9pbnNlcnRfY2xvc2UgfSwJLyogXSAqLwotI2Vsc2UKLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBdICovCi0jZW5kaWYgLyogIVBBUkVOX01BVENISU5HICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogXiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIF8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBgICovCi0KLSAgLyogTG93ZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIGEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBiICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogYyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIGQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogZiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIGcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBoICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogaSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIGogKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBrICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogbCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIG0gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBuICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogbyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIHAgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBxICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogciAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIHMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiB0ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogdSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIHYgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiB3ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogeCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIHkgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiB6ICovCi0KLSAgLyogRmluYWwgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogeyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIHwgKi8KLSNpZiBkZWZpbmVkIChQQVJFTl9NQVRDSElORykKLSAgeyBJU0ZVTkMsIHJsX2luc2VydF9jbG9zZSB9LAkvKiB9ICovCi0jZWxzZQotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIH0gKi8KLSNlbmRpZiAvKiAhUEFSRU5fTUFUQ0hJTkcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiB+ICovCi0gIHsgSVNGVU5DLCBybF9ydWJvdXQgfSwJLyogUlVCT1VUICovCi0KLSNpZiBLRVlNQVBfU0laRSA+IDEyOAotICAvKiBQdXJlIDgtYml0IGNoYXJhY3RlcnMgKDEyOCAtIDE1OSkuCi0gICAgIFRoZXNlIG1pZ2h0IGJlIHVzZWQgaW4gc29tZQotICAgICBjaGFyYWN0ZXIgc2V0cy4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotCi0gIC8qIElTTyBMYXRpbi0xIGNoYXJhY3RlcnMgKDE2MCAtIDI1NSkgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBOby1icmVhayBzcGFjZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIEludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBDZW50IHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBQb3VuZCBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogQ3VycmVuY3kgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFllbiBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogQnJva2VuIGJhciAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFNlY3Rpb24gc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIERpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIENvcHlyaWdodCBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogRmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMZWZ0IHBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE5vdCBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogU29mdCBoeXBoZW4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBSZWdpc3RlcmVkIHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBNYWNyb24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBEZWdyZWUgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFBsdXMtbWludXMgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFN1cGVyc2NyaXB0IHR3byAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFN1cGVyc2NyaXB0IHRocmVlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogQWN1dGUgYWNjZW50ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTWljcm8gc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFBpbGNyb3cgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE1pZGRsZSBkb3QgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBDZWRpbGxhICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogU3VwZXJzY3JpcHQgb25lICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogUmlnaHQgcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogVnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogVnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogVnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogSW52ZXJ0ZWQgcXVlc3Rpb25rIG1hcmsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBhIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBhIHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGFlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBlIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBlIHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBpIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBpIHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBldGggKEljZWxhbmRpYykgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBuIHdpdGggdGlsZGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBvIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBvIHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG8gd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBNdWx0aXBsaWNhdGlvbiBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIHUgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIHUgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIHRob3JuIChJY2VsYW5kaWMpICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgKEdlcm1hbikgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGV0aCAoSWNlbGFuZGljKSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIERpdmlzaW9uIHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIChJY2VsYW5kaWMpICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfQkJLyogTGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMgKi8KLSNlbmRpZiAvKiBLRVlNQVBfU0laRSA+IDEyOCAqLwotfTsKLQotS0VZTUFQX0VOVFJZX0FSUkFZIGVtYWNzX21ldGFfa2V5bWFwID0gewotCi0gIC8qIE1ldGEga2V5cy4gIEp1c3QgbGlrZSBhYm92ZSwgYnV0IHRoZSBoaWdoIGJpdCBpcyBzZXQuICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLUAgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtYSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC1iICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLWMgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtZCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC1lICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLWYgKi8KLSAgeyBJU0ZVTkMsIHJsX2Fib3J0IH0sCQkvKiBNZXRhLUNvbnRyb2wtZyAqLwotICB7IElTRlVOQywgcmxfYmFja3dhcmRfa2lsbF93b3JkIH0sCS8qIE1ldGEtQ29udHJvbC1oICovCi0gIHsgSVNGVU5DLCBybF90YWJfaW5zZXJ0IH0sCS8qIE1ldGEtQ29udHJvbC1pICovCi0gIHsgSVNGVU5DLCBybF92aV9lZGl0aW5nX21vZGUgfSwgLyogTWV0YS1Db250cm9sLWogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtayAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC1sICovCi0gIHsgSVNGVU5DLCBybF92aV9lZGl0aW5nX21vZGUgfSwgLyogTWV0YS1Db250cm9sLW0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtbiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC1vICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLXAgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtcSAqLwotICB7IElTRlVOQywgcmxfcmV2ZXJ0X2xpbmUgfSwJLyogTWV0YS1Db250cm9sLXIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtcyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC10ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLXUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtdiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC13ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLXggKi8KLSAgeyBJU0ZVTkMsIHJsX3lhbmtfbnRoX2FyZyB9LAkvKiBNZXRhLUNvbnRyb2wteSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtQ29udHJvbC16ICovCi0KLSAgeyBJU0ZVTkMsIHJsX2NvbXBsZXRlIH0sCS8qIE1ldGEtQ29udHJvbC1bICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLVwgKi8KLSAgeyBJU0ZVTkMsIHJsX2JhY2t3YXJkX2NoYXJfc2VhcmNoIH0sCS8qIE1ldGEtQ29udHJvbC1dICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1Db250cm9sLV4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLUNvbnRyb2wtXyAqLwotCi0gIC8qIFRoZSBzdGFydCBvZiBwcmludGluZyBjaGFyYWN0ZXJzLiAqLwotICB7IElTRlVOQywgcmxfc2V0X21hcmsgfSwJLyogTWV0YS1TUEFDRSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtISAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtIiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0X2NvbW1lbnQgfSwvKiBNZXRhLSMgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSQgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSUgKi8KLSAgeyBJU0ZVTkMsIHJsX3RpbGRlX2V4cGFuZCB9LAkvKiBNZXRhLSYgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLScgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSggKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSkgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydF9jb21wbGV0aW9ucyB9LAkvKiBNZXRhLSogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLSwgKi8KLSAgeyBJU0ZVTkMsIHJsX2RpZ2l0X2FyZ3VtZW50IH0sIC8qIE1ldGEtLSAqLwotICB7IElTRlVOQywgcmxfeWFua19sYXN0X2FyZ30sCS8qIE1ldGEtLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtLyAqLwotCi0gIC8qIFJlZ3VsYXIgZGlnaXRzLiAqLwotICB7IElTRlVOQywgcmxfZGlnaXRfYXJndW1lbnQgfSwgLyogTWV0YS0wICovCi0gIHsgSVNGVU5DLCBybF9kaWdpdF9hcmd1bWVudCB9LCAvKiBNZXRhLTEgKi8KLSAgeyBJU0ZVTkMsIHJsX2RpZ2l0X2FyZ3VtZW50IH0sIC8qIE1ldGEtMiAqLwotICB7IElTRlVOQywgcmxfZGlnaXRfYXJndW1lbnQgfSwgLyogTWV0YS0zICovCi0gIHsgSVNGVU5DLCBybF9kaWdpdF9hcmd1bWVudCB9LCAvKiBNZXRhLTQgKi8KLSAgeyBJU0ZVTkMsIHJsX2RpZ2l0X2FyZ3VtZW50IH0sIC8qIE1ldGEtNSAqLwotICB7IElTRlVOQywgcmxfZGlnaXRfYXJndW1lbnQgfSwgLyogTWV0YS02ICovCi0gIHsgSVNGVU5DLCBybF9kaWdpdF9hcmd1bWVudCB9LCAvKiBNZXRhLTcgKi8KLSAgeyBJU0ZVTkMsIHJsX2RpZ2l0X2FyZ3VtZW50IH0sIC8qIE1ldGEtOCAqLwotICB7IElTRlVOQywgcmxfZGlnaXRfYXJndW1lbnQgfSwgLyogTWV0YS05ICovCi0KLSAgLyogQSBsaXR0bGUgbW9yZSBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogTWV0YS06ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIE1ldGEtOyAqLwotICB7IElTRlVOQywgcmxfYmVnaW5uaW5nX29mX2hpc3RvcnkgfSwJLyogTWV0YS08ICovCi0gIHsgSVNGVU5DLCBybF9wb3NzaWJsZV9jb21wbGV0aW9ucyB9LAkvKiBNZXRhLT0gKi8KLSAgeyBJU0ZVTkMsIHJsX2VuZF9vZl9oaXN0b3J5IH0sCS8qIE1ldGEtPiAqLwotICB7IElTRlVOQywgcmxfcG9zc2libGVfY29tcGxldGlvbnMgfSwJLyogTWV0YS0/ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIE1ldGEtQCAqLwotCi0gIC8qIFVwcGVyY2FzZSBhbHBoYWJldC4gKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtQSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1CICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLUMgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtRCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1FICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLUYgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtRyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1IICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLUkgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtSiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1LICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLUwgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtTSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1OICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLU8gKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtUCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1RICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLVIgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtUyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1UICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLVUgKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtViAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1XICovCi0gIHsgSVNGVU5DLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAkvKiBNZXRhLVggKi8KLSAgeyBJU0ZVTkMsIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uIH0sCS8qIE1ldGEtWSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTWV0YS1aICovCi0KLSAgLyogU29tZSBtb3JlIHB1bmN0dWF0aW9uLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBNZXRhLVsgKi8JLyogd2FzIHJsX2Fycm93X2tleXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2RlbGV0ZV9ob3Jpem9udGFsX3NwYWNlIH0sCS8qIE1ldGEtXCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBNZXRhLV0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogTWV0YS1eICovCi0gIHsgSVNGVU5DLCBybF95YW5rX2xhc3RfYXJnIH0sCQkvKiBNZXRhLV8gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogTWV0YS1gICovCi0KLSAgLyogTG93ZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtYSAqLwotICB7IElTRlVOQywgcmxfYmFja3dhcmRfd29yZCB9LAkvKiBNZXRhLWIgKi8KLSAgeyBJU0ZVTkMsIHJsX2NhcGl0YWxpemVfd29yZCB9LCAvKiBNZXRhLWMgKi8KLSAgeyBJU0ZVTkMsIHJsX2tpbGxfd29yZCB9LAkvKiBNZXRhLWQgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWUgKi8KLSAgeyBJU0ZVTkMsIHJsX2ZvcndhcmRfd29yZCB9LAkvKiBNZXRhLWYgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWcgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWggKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWkgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLWsgKi8KLSAgeyBJU0ZVTkMsIHJsX2Rvd25jYXNlX3dvcmQgfSwJLyogTWV0YS1sICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1tICovCi0gIHsgSVNGVU5DLCBybF9ub25pbmNfZm9yd2FyZF9zZWFyY2ggfSwJLyogTWV0YS1uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1vICovCS8qIHdhcyBybF9hcnJvd19rZXlzICovCi0gIHsgSVNGVU5DLCBybF9ub25pbmNfcmV2ZXJzZV9zZWFyY2ggfSwJLyogTWV0YS1wICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS1xICovCi0gIHsgSVNGVU5DLCBybF9yZXZlcnRfbGluZSB9LAkvKiBNZXRhLXIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBNZXRhLXMgKi8KLSAgeyBJU0ZVTkMsIHJsX3RyYW5zcG9zZV93b3JkcyB9LCAvKiBNZXRhLXQgKi8KLSAgeyBJU0ZVTkMsIHJsX3VwY2FzZV93b3JkIH0sCS8qIE1ldGEtdSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtdiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEtdyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIE1ldGEteCAqLwotICB7IElTRlVOQywgcmxfeWFua19wb3AgfSwJLyogTWV0YS15ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS16ICovCi0KLSAgLyogRmluYWwgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS17ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS18ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogTWV0YS19ICovCi0gIHsgSVNGVU5DLCBybF90aWxkZV9leHBhbmQgfSwJLyogTWV0YS1+ICovCi0gIHsgSVNGVU5DLCBybF9iYWNrd2FyZF9raWxsX3dvcmQgfSwgLyogTWV0YS1ydWJvdXQgKi8KLQotI2lmIEtFWU1BUF9TSVpFID4gMTI4Ci0gIC8qIFVuZGVmaW5lZCBrZXlzLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfQotI2VuZGlmIC8qIEtFWU1BUF9TSVpFID4gMTI4ICovCi19OwotCi1LRVlNQVBfRU5UUllfQVJSQVkgZW1hY3NfY3RseF9rZXltYXAgPSB7Ci0KLSAgLyogQ29udHJvbCBrZXlzLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLUAgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1hICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtYiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWMgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1kICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtZSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWYgKi8KLSAgeyBJU0ZVTkMsIHJsX2Fib3J0IH0sCQkJLyogQ29udHJvbC1nICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtaCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWkgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1qICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtayAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWwgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1tICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtbiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLW8gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1wICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtcSAqLwotICB7IElTRlVOQywgcmxfcmVfcmVhZF9pbml0X2ZpbGUgfSwJLyogQ29udHJvbC1yICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtcyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXQgKi8KLSAgeyBJU0ZVTkMsIHJsX3VuZG9fY29tbWFuZCB9LAkJLyogQ29udHJvbC11ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtdiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXcgKi8KLSAgeyBJU0ZVTkMsIHJsX2V4Y2hhbmdlX3BvaW50X2FuZF9tYXJrIH0sLyogQ29udHJvbC14ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wteSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1bICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtXCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLV0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1eICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtXyAqLwotCi0gIC8qIFRoZSBzdGFydCBvZiBwcmludGluZyBjaGFyYWN0ZXJzLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBTUEFDRSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAhICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogIyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAkICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogJiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAnICovCi0gIHsgSVNGVU5DLCBybF9zdGFydF9rYmRfbWFjcm8gfSwJLyogKCAqLwotICB7IElTRlVOQywgcmxfZW5kX2tiZF9tYWNybyAgfSwJLyogKSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAqICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogLCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAtICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIC4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogLyAqLwotCi0gIC8qIFJlZ3VsYXIgZGlnaXRzLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAwICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIDEgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogMiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAzICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIDQgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogNSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiA2ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIDcgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogOCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiA5ICovCi0KLSAgLyogQSBsaXR0bGUgbW9yZSBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiA6ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogOyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qIDwgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiA9ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJLyogPiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkvKiBAICovCi0KLSAgLyogVXBwZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogViAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWiAqLwotCi0gIC8qIFNvbWUgbW9yZSBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogWyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBcICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIF0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogXiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBfICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGAgKi8KLQotICAvKiBMb3dlcmNhc2UgYWxwaGFiZXQuICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGEgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogYiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBjICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGQgKi8KLSAgeyBJU0ZVTkMsIHJsX2NhbGxfbGFzdF9rYmRfbWFjcm8gfSwJLyogZSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBmICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGcgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogaCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBpICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogayAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBsICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIG0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogbiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBvICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHAgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogcSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiByICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHMgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogdCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB1ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHYgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogdyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB4ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHkgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogeiAqLwotCi0gIC8qIEZpbmFsIHB1bmN0dWF0aW9uLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB7ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHwgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogfSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB+ICovCi0gIHsgSVNGVU5DLCBybF9iYWNrd2FyZF9raWxsX2xpbmUgfSwJLyogUlVCT1VUICovCi0KLSNpZiBLRVlNQVBfU0laRSA+IDEyOAotICAvKiBVbmRlZmluZWQga2V5cy4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0KLSNlbmRpZiAvKiBLRVlNQVBfU0laRSA+IDEyOCAqLwotfTsKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL0lucHV0cmMgYi9yZWFkbGluZS9leGFtcGxlcy9JbnB1dHJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjcxYmQ3Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2V4YW1wbGVzL0lucHV0cmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIE15IH4vLmlucHV0cmMgZmlsZSBpcyBpbiAtKi0gdGV4dCAtKi0gZm9yIGVhc3kgZWRpdGluZyB3aXRoIEVtYWNzLgotIwotIyBOb3RpY2UgdGhlIHZhcmlvdXMgYmluZGluZ3Mgd2hpY2ggYXJlIGNvbmRpdGlvbmFsaXplZCBkZXBlbmRpbmcKLSMgb24gd2hpY2ggcHJvZ3JhbSBpcyBydW5uaW5nLCBvciB3aGF0IHRlcm1pbmFsIGlzIGFjdGl2ZS4KLSMKLQotIyBJbiBhbGwgcHJvZ3JhbXMsIGFsbCB0ZXJtaW5hbHMsIG1ha2Ugc3VyZSB0aGlzIGlzIGJvdW5kLgotIlxDLXhcQy1yIjogcmUtcmVhZC1pbml0LWZpbGUKLQotIyBIcCB0ZXJtaW5hbHMgKGFuZCBzb21lIG90aGVycykgaGF2ZSB1Z2x5IGRlZmF1bHQgYmVoYXZpb3VyIGZvciBDLWguCi0iXEMtaCI6IGJhY2t3YXJkLWRlbGV0ZS1jaGFyCi0iXGVcQy1oIjogYmFja3dhcmQta2lsbC13b3JkCi0iXEMteGQiOiBkdW1wLWZ1bmN0aW9ucwotCi0jIEluIHh0ZXJtIHdpbmRvd3MsIG1ha2UgdGhlIGFycm93IGtleXMgZG8gdGhlIHJpZ2h0IHRoaW5nLgotJGlmIFRFUk09eHRlcm0KLSJcZVtBIjogcHJldmlvdXMtaGlzdG9yeQotIlxlW0IiOiBuZXh0LWhpc3RvcnkKLSJcZVtDIjogZm9yd2FyZC1jaGFyCi0iXGVbRCI6IGJhY2t3YXJkLWNoYXIKLQotIyBhbHRlcm5hdGUgYXJyb3cga2V5IHByZWZpeAotIlxlT0EiOiBwcmV2aW91cy1oaXN0b3J5Ci0iXGVPQiI6IG5leHQtaGlzdG9yeQotIlxlT0MiOiBmb3J3YXJkLWNoYXIKLSJcZU9EIjogYmFja3dhcmQtY2hhcgotCi0jIFVuZGVyIFh0ZXJtIGluIEJhc2gsIHdlIGJpbmQgbG9jYWwgRnVuY3Rpb24ga2V5cyB0byBkbyBzb21ldGhpbmcgdXNlZnVsLgotJGlmIEJhc2gKLSJcZVsxMX4iOiAiRnVuY3Rpb24gS2V5IDEiCi0iXGVbMTJ+IjogIkZ1bmN0aW9uIEtleSAyIgotIlxlWzEzfiI6ICJGdW5jdGlvbiBLZXkgMyIKLSJcZVsxNH4iOiAiRnVuY3Rpb24gS2V5IDQiCi0iXGVbMTV+IjogIkZ1bmN0aW9uIEtleSA1IgotCi0jIEkga25vdyB0aGUgZm9sbG93aW5nIGVzY2FwZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSAxIGdyZWF0ZXIgdGhhbgotIyB0aGUgZnVuY3Rpb24ga2V5LiAgRG9uJ3QgYXNrIG1lIHdoeSwgSSBkaWRuJ3QgZGVzaWduIHRoZSB4dGVybSB0ZXJtaW5hbC4KLSJcZVsxN34iOiAiRnVuY3Rpb24gS2V5IDYiCi0iXGVbMTh+IjogIkZ1bmN0aW9uIEtleSA3IgotIlxlWzE5fiI6ICJGdW5jdGlvbiBLZXkgOCIKLSJcZVsyMH4iOiAiRnVuY3Rpb24gS2V5IDkiCi0iXGVbMjF+IjogIkZ1bmN0aW9uIEtleSAxMCIKLSRlbmRpZgotJGVuZGlmCi0KLSMgRm9yIEJhc2gsIGFsbCB0ZXJtaW5hbHMsIGFkZCBzb21lIEJhc2ggc3BlY2lmaWMgaGFja3MuCi0kaWYgQmFzaAotIlxDLXh2Ijogc2hvdy1iYXNoLXZlcnNpb24KLSJcQy14XEMtZSI6IHNoZWxsLWV4cGFuZC1saW5lCi0KLSMgSGVyZSBpcyBvbmUgZm9yIGVkaXRpbmcgbXkgcGF0aC4KLSJcQy14cCI6ICIkUEFUSFxDLXhcQy1lXEMtZVwiXEMtYVBBVEg9XCI6XEMtYiIKLQotIyBNYWtlIEMteCByIHJlYWQgbXkgbWFpbCBpbiBlbWFjcy4KLSMgIlxDLXhyIjogImVtYWNzIC1mIHJtYWlsXEMtaiIKLSRlbmRpZgotCi0jIEZvciBGVFAsIGRpZmZlcmVudCBoYWNrczoKLSRpZiBGdHAKLSJcQy14ZyI6ICJnZXQgXE0tPyIKLSJcQy14dCI6ICJwdXQgXE0tPyIKLSJcTS0uIjogeWFuay1sYXN0LWFyZwotJGVuZGlmCi0KLSIgIjogc2VsZi1pbnNlcnQKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL01ha2VmaWxlLmluIGIvcmVhZGxpbmUvZXhhbXBsZXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWFhNDkuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZXhhbXBsZXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFRoaXMgaXMgdGhlIE1ha2VmaWxlIGZvciB0aGUgZXhhbXBsZXMgc3ViZGlyZWN0b3J5IG9mIHJlYWRsaW5lLiAtKi0gdGV4dCAtKi0KLSMKLVNIRUxMID0gQE1BS0VfU0hFTExACi1STSA9IHJtIC1mCi0KLXNyY2RpciA9IEBzcmNkaXJACi1WUEFUSCA9IC46QHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLUJVSUxEX0RJUiA9IC4KLQotREVGUyA9IEBERUZTQAotQ0MgPSBAQ0NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotTE9DQUxfQ0ZMQUdTID0gQExPQ0FMX0NGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JJChzcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKSAtSS4uCi0KLUNDRkxBR1MgID0gJChERUZTKSAkKExPQ0FMX0NGTEFHUykgJChDUFBGTEFHUykgJChJTkNMVURFUykgJChDRkxBR1MpCi1MREZMQUdTID0gLWcgLUwuLgotCi1URVJNQ0FQX0xJQiA9IEBURVJNQ0FQX0xJQkAKLQotLmMubzoKLQkke1JNfSAkQAotCSQoQ0MpICQoQ0NGTEFHUykgLWMgJDwKLQotRVhFQ1VUQUJMRVMgPSBmaWxlbWFuIHJsdGVzdCBybCBybHZlcnNpb24KLU9CSkVDVFMgPSBmaWxlbWFuLm8gcmx0ZXN0Lm8gcmwubyBybHZlcnNpb24ubwotCi1hbGw6ICQoRVhFQ1VUQUJMRVMpCi0KLXJsOiBybC5vCi0JJChDQykgJChMREZMQUdTKSAtbyAkQCBybC5vIC1scmVhZGxpbmUgJChURVJNQ0FQX0xJQikKLQotZmlsZW1hbjogZmlsZW1hbi5vCi0JJChDQykgJChMREZMQUdTKSAtbyAkQCBmaWxlbWFuLm8gLWxyZWFkbGluZSAkKFRFUk1DQVBfTElCKQotCi1ybHRlc3Q6IHJsdGVzdC5vCi0JJChDQykgJChMREZMQUdTKSAtbyAkQCBybHRlc3QubyAtbHJlYWRsaW5lICQoVEVSTUNBUF9MSUIpCi0KLXJsdmVyc2lvbjogcmx2ZXJzaW9uLm8KLQkkKENDKSAkKExERkxBR1MpIC1vICRAIHJsdmVyc2lvbi5vIC1scmVhZGxpbmUgJChURVJNQ0FQX0xJQikKLQotY2xlYW4gbW9zdGx5Y2xlYW46Ci0JJChSTSkgJChPQkpFQ1RTKQotCSQoUk0pICQoRVhFQ1VUQUJMRVMpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuOiBjbGVhbgotCSQoUk0pIE1ha2VmaWxlCi0KLWZpbGVtYW4ubzogZmlsZW1hbi5jCi1ybHRlc3Qubzogcmx0ZXN0LmMKLXJsLm86IHJsLmMKLXJsdmVyc2lvbi5vOiBybHZlcnNpb24uYwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvZmlsZW1hbi5jIGIvcmVhZGxpbmUvZXhhbXBsZXMvZmlsZW1hbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyYTViLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2V4YW1wbGVzL2ZpbGVtYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKiBmaWxlbWFuLmMgLS0gQSB0aW55IGFwcGxpY2F0aW9uIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoZQotICAgR05VIFJlYWRsaW5lIGxpYnJhcnkuICBUaGlzIGFwcGxpY2F0aW9uIGludGVyYWN0aXZlbHkgYWxsb3dzIHVzZXJzCi0gICB0byBtYW5pcHVsYXRlIGZpbGVzIGFuZCB0aGVpciBtb2Rlcy4gKi8KLS8qCi0gKiBSZW1vdmUgdGhlIG5leHQgbGluZSBpZiB5b3UncmUgY29tcGlsaW5nIHRoaXMgYWdhaW5zdCBhbiBpbnN0YWxsZWQKLSAqIGxpYnJlYWRsaW5lLmEKLSAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVFJJTkdfSCkKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UgLyogIUhBVkVfU1RSSU5HX0ggKi8KLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZiAvKiAhSEFWRV9TVFJJTkdfSCAqLwotCi0jaWZkZWYgUkVBRExJTkVfTElCUkFSWQotIyAgaW5jbHVkZSAicmVhZGxpbmUuaCIKLSMgIGluY2x1ZGUgImhpc3RvcnkuaCIKLSNlbHNlCi0jICBpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgotIyAgaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgotI2VuZGlmCi0KLWV4dGVybiBjaGFyICpnZXR3ZCAoKTsKLWV4dGVybiBjaGFyICp4bWFsbG9jICgpOwotCi0vKiBUaGUgbmFtZXMgb2YgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gdGhlIG1hbmlwdWxhdGlvbi4gKi8KLWludCBjb21fbGlzdCAoKSwgY29tX3ZpZXcgKCksIGNvbV9yZW5hbWUgKCksIGNvbV9zdGF0ICgpLCBjb21fcHdkICgpOwotaW50IGNvbV9kZWxldGUgKCksIGNvbV9oZWxwICgpLCBjb21fY2QgKCksIGNvbV9xdWl0ICgpOwotCi0vKiBBIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZHMgdGhpcyBwcm9ncmFtCi0gICBjYW4gdW5kZXJzdGFuZC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwkJCS8qIFVzZXIgcHJpbnRhYmxlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAqLwotICBGdW5jdGlvbiAqZnVuYzsJCS8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZG8gdGhlIGpvYi4gKi8KLSAgY2hhciAqZG9jOwkJCS8qIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24uICAqLwotfSBDT01NQU5EOwotCi1DT01NQU5EIGNvbW1hbmRzW10gPSB7Ci0gIHsgImNkIiwgY29tX2NkLCAiQ2hhbmdlIHRvIGRpcmVjdG9yeSBESVIiIH0sCi0gIHsgImRlbGV0ZSIsIGNvbV9kZWxldGUsICJEZWxldGUgRklMRSIgfSwKLSAgeyAiaGVscCIsIGNvbV9oZWxwLCAiRGlzcGxheSB0aGlzIHRleHQiIH0sCi0gIHsgIj8iLCBjb21faGVscCwgIlN5bm9ueW0gZm9yIGBoZWxwJyIgfSwKLSAgeyAibGlzdCIsIGNvbV9saXN0LCAiTGlzdCBmaWxlcyBpbiBESVIiIH0sCi0gIHsgImxzIiwgY29tX2xpc3QsICJTeW5vbnltIGZvciBgbGlzdCciIH0sCi0gIHsgInB3ZCIsIGNvbV9wd2QsICJQcmludCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIgfSwKLSAgeyAicXVpdCIsIGNvbV9xdWl0LCAiUXVpdCB1c2luZyBGaWxlbWFuIiB9LAotICB7ICJyZW5hbWUiLCBjb21fcmVuYW1lLCAiUmVuYW1lIEZJTEUgdG8gTkVXTkFNRSIgfSwKLSAgeyAic3RhdCIsIGNvbV9zdGF0LCAiUHJpbnQgb3V0IHN0YXRpc3RpY3Mgb24gRklMRSIgfSwKLSAgeyAidmlldyIsIGNvbV92aWV3LCAiVmlldyB0aGUgY29udGVudHMgb2YgRklMRSIgfSwKLSAgeyAoY2hhciAqKU5VTEwsIChGdW5jdGlvbiAqKU5VTEwsIChjaGFyICopTlVMTCB9Ci19OwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KLWNoYXIgKnN0cmlwd2hpdGUgKCk7Ci1DT01NQU5EICpmaW5kX2NvbW1hbmQgKCk7Ci0KLS8qIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbSwgYXMgdGFrZW4gZnJvbSBhcmd2WzBdLiAqLwotY2hhciAqcHJvZ25hbWU7Ci0KLS8qIFdoZW4gbm9uLXplcm8sIHRoaXMgZ2xvYmFsIG1lYW5zIHRoZSB1c2VyIGlzIGRvbmUgdXNpbmcgdGhpcyBwcm9ncmFtLiAqLwotaW50IGRvbmU7Ci0KLWNoYXIgKgotZHVwc3RyIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpyOwotCi0gIHIgPSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAociwgcyk7Ci0gIHJldHVybiAocik7Ci19Ci0KLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqbGluZSwgKnM7Ci0KLSAgcHJvZ25hbWUgPSBhcmd2WzBdOwotCi0gIGluaXRpYWxpemVfcmVhZGxpbmUgKCk7CS8qIEJpbmQgb3VyIGNvbXBsZXRlci4gKi8KLQotICAvKiBMb29wIHJlYWRpbmcgYW5kIGV4ZWN1dGluZyBsaW5lcyB1bnRpbCB0aGUgdXNlciBxdWl0cy4gKi8KLSAgZm9yICggOyBkb25lID09IDA7ICkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGxpbmUgKCJGaWxlTWFuOiAiKTsKLQotICAgICAgaWYgKCFsaW5lKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgbGluZS4KLSAgICAgICAgIFRoZW4sIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQsIGFkZCBpdCB0byB0aGUgaGlzdG9yeSBsaXN0Ci0gICAgICAgICBhbmQgZXhlY3V0ZSBpdC4gKi8KLSAgICAgIHMgPSBzdHJpcHdoaXRlIChsaW5lKTsKLQotICAgICAgaWYgKCpzKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkX2hpc3RvcnkgKHMpOwotICAgICAgICAgIGV4ZWN1dGVfbGluZSAocyk7Ci0gICAgICAgIH0KLQotICAgICAgZnJlZSAobGluZSk7Ci0gICAgfQotICBleGl0ICgwKTsKLX0KLQotLyogRXhlY3V0ZSBhIGNvbW1hbmQgbGluZS4gKi8KLWludAotZXhlY3V0ZV9saW5lIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgQ09NTUFORCAqY29tbWFuZDsKLSAgY2hhciAqd29yZDsKLQotICAvKiBJc29sYXRlIHRoZSBjb21tYW5kIHdvcmQuICovCi0gIGkgPSAwOwotICB3aGlsZSAobGluZVtpXSAmJiB3aGl0ZXNwYWNlIChsaW5lW2ldKSkKLSAgICBpKys7Ci0gIHdvcmQgPSBsaW5lICsgaTsKLQotICB3aGlsZSAobGluZVtpXSAmJiAhd2hpdGVzcGFjZSAobGluZVtpXSkpCi0gICAgaSsrOwotCi0gIGlmIChsaW5lW2ldKQotICAgIGxpbmVbaSsrXSA9ICdcMCc7Ci0KLSAgY29tbWFuZCA9IGZpbmRfY29tbWFuZCAod29yZCk7Ci0KLSAgaWYgKCFjb21tYW5kKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBObyBzdWNoIGNvbW1hbmQgZm9yIEZpbGVNYW4uXG4iLCB3b3JkKTsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAvKiBHZXQgYXJndW1lbnQgdG8gY29tbWFuZCwgaWYgYW55LiAqLwotICB3aGlsZSAod2hpdGVzcGFjZSAobGluZVtpXSkpCi0gICAgaSsrOwotCi0gIHdvcmQgPSBsaW5lICsgaTsKLQotICAvKiBDYWxsIHRoZSBmdW5jdGlvbi4gKi8KLSAgcmV0dXJuICgoKihjb21tYW5kLT5mdW5jKSkgKHdvcmQpKTsKLX0KLQotLyogTG9vayB1cCBOQU1FIGFzIHRoZSBuYW1lIG9mIGEgY29tbWFuZCwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhhdAotICAgY29tbWFuZC4gIFJldHVybiBhIE5VTEwgcG9pbnRlciBpZiBOQU1FIGlzbid0IGEgY29tbWFuZCBuYW1lLiAqLwotQ09NTUFORCAqCi1maW5kX2NvbW1hbmQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGNvbW1hbmRzW2ldLm5hbWU7IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBjb21tYW5kc1tpXS5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuICgmY29tbWFuZHNbaV0pOwotCi0gIHJldHVybiAoKENPTU1BTkQgKilOVUxMKTsKLX0KLQotLyogU3RyaXAgd2hpdGVzcGFjZSBmcm9tIHRoZSBzdGFydCBhbmQgZW5kIG9mIFNUUklORy4gIFJldHVybiBhIHBvaW50ZXIKLSAgIGludG8gU1RSSU5HLiAqLwotY2hhciAqCi1zdHJpcHdoaXRlIChzdHJpbmcpCi0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcywgKnQ7Ci0KLSAgZm9yIChzID0gc3RyaW5nOyB3aGl0ZXNwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gICAgCi0gIGlmICgqcyA9PSAwKQotICAgIHJldHVybiAocyk7Ci0KLSAgdCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLSAgd2hpbGUgKHQgPiBzICYmIHdoaXRlc3BhY2UgKCp0KSkKLSAgICB0LS07Ci0gICorK3QgPSAnXDAnOwotCi0gIHJldHVybiBzOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB0byBSZWFkbGluZSBDb21wbGV0aW9uICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLWNoYXIgKmNvbW1hbmRfZ2VuZXJhdG9yICgpOwotY2hhciAqKmZpbGVtYW5fY29tcGxldGlvbiAoKTsKLQotLyogVGVsbCB0aGUgR05VIFJlYWRsaW5lIGxpYnJhcnkgaG93IHRvIGNvbXBsZXRlLiAgV2Ugd2FudCB0byB0cnkgdG8gY29tcGxldGUKLSAgIG9uIGNvbW1hbmQgbmFtZXMgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgbGluZSwgb3Igb24gZmlsZW5hbWVzCi0gICBpZiBub3QuICovCi1pbml0aWFsaXplX3JlYWRsaW5lICgpCi17Ci0gIC8qIEFsbG93IGNvbmRpdGlvbmFsIHBhcnNpbmcgb2YgdGhlIH4vLmlucHV0cmMgZmlsZS4gKi8KLSAgcmxfcmVhZGxpbmVfbmFtZSA9ICJGaWxlTWFuIjsKLQotICAvKiBUZWxsIHRoZSBjb21wbGV0ZXIgdGhhdCB3ZSB3YW50IGEgY3JhY2sgZmlyc3QuICovCi0gIHJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX2Z1bmN0aW9uID0gKENQUEZ1bmN0aW9uICopZmlsZW1hbl9jb21wbGV0aW9uOwotfQotCi0vKiBBdHRlbXB0IHRvIGNvbXBsZXRlIG9uIHRoZSBjb250ZW50cyBvZiBURVhULiAgU1RBUlQgYW5kIEVORCBib3VuZCB0aGUKLSAgIHJlZ2lvbiBvZiBybF9saW5lX2J1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSB3b3JkIHRvIGNvbXBsZXRlLiAgVEVYVCBpcwotICAgdGhlIHdvcmQgdG8gY29tcGxldGUuICBXZSBjYW4gdXNlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgcmxfbGluZV9idWZmZXIKLSAgIGluIGNhc2Ugd2Ugd2FudCB0byBkbyBzb21lIHNpbXBsZSBwYXJzaW5nLiAgUmV0dXJuIHRoZSBhcnJheSBvZiBtYXRjaGVzLAotICAgb3IgTlVMTCBpZiB0aGVyZSBhcmVuJ3QgYW55LiAqLwotY2hhciAqKgotZmlsZW1hbl9jb21wbGV0aW9uICh0ZXh0LCBzdGFydCwgZW5kKQotICAgICBjaGFyICp0ZXh0OwotICAgICBpbnQgc3RhcnQsIGVuZDsKLXsKLSAgY2hhciAqKm1hdGNoZXM7Ci0KLSAgbWF0Y2hlcyA9IChjaGFyICoqKU5VTEw7Ci0KLSAgLyogSWYgdGhpcyB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwgdGhlbiBpdCBpcyBhIGNvbW1hbmQKLSAgICAgdG8gY29tcGxldGUuICBPdGhlcndpc2UgaXQgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeS4gKi8KLSAgaWYgKHN0YXJ0ID09IDApCi0gICAgbWF0Y2hlcyA9IGNvbXBsZXRpb25fbWF0Y2hlcyAodGV4dCwgY29tbWFuZF9nZW5lcmF0b3IpOwotCi0gIHJldHVybiAobWF0Y2hlcyk7Ci19Ci0KLS8qIEdlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAgU1RBVEUgbGV0cyB1cyBrbm93IHdoZXRoZXIKLSAgIHRvIHN0YXJ0IGZyb20gc2NyYXRjaDsgd2l0aG91dCBhbnkgc3RhdGUgKGkuZS4gU1RBVEUgPT0gMCksIHRoZW4gd2UKLSAgIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QuICovCi1jaGFyICoKLWNvbW1hbmRfZ2VuZXJhdG9yICh0ZXh0LCBzdGF0ZSkKLSAgICAgY2hhciAqdGV4dDsKLSAgICAgaW50IHN0YXRlOwotewotICBzdGF0aWMgaW50IGxpc3RfaW5kZXgsIGxlbjsKLSAgY2hhciAqbmFtZTsKLQotICAvKiBJZiB0aGlzIGlzIGEgbmV3IHdvcmQgdG8gY29tcGxldGUsIGluaXRpYWxpemUgbm93LiAgVGhpcyBpbmNsdWRlcwotICAgICBzYXZpbmcgdGhlIGxlbmd0aCBvZiBURVhUIGZvciBlZmZpY2llbmN5LCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBpbmRleAotICAgICB2YXJpYWJsZSB0byAwLiAqLwotICBpZiAoIXN0YXRlKQotICAgIHsKLSAgICAgIGxpc3RfaW5kZXggPSAwOwotICAgICAgbGVuID0gc3RybGVuICh0ZXh0KTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIHRoZSBuZXh0IG5hbWUgd2hpY2ggcGFydGlhbGx5IG1hdGNoZXMgZnJvbSB0aGUgY29tbWFuZCBsaXN0LiAqLwotICB3aGlsZSAobmFtZSA9IGNvbW1hbmRzW2xpc3RfaW5kZXhdLm5hbWUpCi0gICAgewotICAgICAgbGlzdF9pbmRleCsrOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgdGV4dCwgbGVuKSA9PSAwKQotICAgICAgICByZXR1cm4gKGR1cHN0cihuYW1lKSk7Ci0gICAgfQotCi0gIC8qIElmIG5vIG5hbWVzIG1hdGNoZWQsIHRoZW4gcmV0dXJuIE5VTEwuICovCi0gIHJldHVybiAoKGNoYXIgKilOVUxMKTsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgIEZpbGVNYW4gQ29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBTdHJpbmcgdG8gcGFzcyB0byBzeXN0ZW0gKCkuICBUaGlzIGlzIGZvciB0aGUgTElTVCwgVklFVyBhbmQgUkVOQU1FCi0gICBjb21tYW5kcy4gKi8KLXN0YXRpYyBjaGFyIHN5c2NvbVsxMDI0XTsKLQotLyogTGlzdCB0aGUgZmlsZShzKSBuYW1lZCBpbiBhcmcuICovCi1jb21fbGlzdCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIGlmICghYXJnKQotICAgIGFyZyA9ICIiOwotCi0gIHNwcmludGYgKHN5c2NvbSwgImxzIC1GQ2xnICVzIiwgYXJnKTsKLSAgcmV0dXJuIChzeXN0ZW0gKHN5c2NvbSkpOwotfQotCi1jb21fdmlldyAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIGlmICghdmFsaWRfYXJndW1lbnQgKCJ2aWV3IiwgYXJnKSkKLSAgICByZXR1cm4gMTsKLQotICBzcHJpbnRmIChzeXNjb20sICJtb3JlICVzIiwgYXJnKTsKLSAgcmV0dXJuIChzeXN0ZW0gKHN5c2NvbSkpOwotfQotCi1jb21fcmVuYW1lIChhcmcpCi0gICAgIGNoYXIgKmFyZzsKLXsKLSAgdG9vX2Rhbmdlcm91cyAoInJlbmFtZSIpOwotICByZXR1cm4gKDEpOwotfQotCi1jb21fc3RhdCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHN0cnVjdCBzdGF0IGZpbmZvOwotCi0gIGlmICghdmFsaWRfYXJndW1lbnQgKCJzdGF0IiwgYXJnKSkKLSAgICByZXR1cm4gKDEpOwotCi0gIGlmIChzdGF0IChhcmcsICZmaW5mbykgPT0gLTEpCi0gICAgewotICAgICAgcGVycm9yIChhcmcpOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiU3RhdGlzdGljcyBmb3IgYCVzJzpcbiIsIGFyZyk7Ci0KLSAgcHJpbnRmICgiJXMgaGFzICVkIGxpbmslcywgYW5kIGlzICVkIGJ5dGUlcyBpbiBsZW5ndGguXG4iLAotCSAgYXJnLAotICAgICAgICAgIGZpbmZvLnN0X25saW5rLAotICAgICAgICAgIChmaW5mby5zdF9ubGluayA9PSAxKSA/ICIiIDogInMiLAotICAgICAgICAgIGZpbmZvLnN0X3NpemUsCi0gICAgICAgICAgKGZpbmZvLnN0X3NpemUgPT0gMSkgPyAiIiA6ICJzIik7Ci0gIHByaW50ZiAoIklub2RlIExhc3QgQ2hhbmdlIGF0OiAlcyIsIGN0aW1lICgmZmluZm8uc3RfY3RpbWUpKTsKLSAgcHJpbnRmICgiICAgICAgTGFzdCBhY2Nlc3MgYXQ6ICVzIiwgY3RpbWUgKCZmaW5mby5zdF9hdGltZSkpOwotICBwcmludGYgKCIgICAgTGFzdCBtb2RpZmllZCBhdDogJXMiLCBjdGltZSAoJmZpbmZvLnN0X210aW1lKSk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWNvbV9kZWxldGUgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICB0b29fZGFuZ2Vyb3VzICgiZGVsZXRlIik7Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIFByaW50IG91dCBoZWxwIGZvciBBUkcsIG9yIGZvciBhbGwgb2YgdGhlIGNvbW1hbmRzIGlmIEFSRyBpcwotICAgbm90IHByZXNlbnQuICovCi1jb21faGVscCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBpbnQgcHJpbnRlZCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgY29tbWFuZHNbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghKmFyZyB8fCAoc3RyY21wIChhcmcsIGNvbW1hbmRzW2ldLm5hbWUpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgcHJpbnRmICgiJXNcdFx0JXMuXG4iLCBjb21tYW5kc1tpXS5uYW1lLCBjb21tYW5kc1tpXS5kb2MpOwotICAgICAgICAgIHByaW50ZWQrKzsKLSAgICAgICAgfQotICAgIH0KLQotICBpZiAoIXByaW50ZWQpCi0gICAgewotICAgICAgcHJpbnRmICgiTm8gY29tbWFuZHMgbWF0Y2ggYCVzJy4gIFBvc3NpYmlsdGllcyBhcmU6XG4iLCBhcmcpOwotCi0gICAgICBmb3IgKGkgPSAwOyBjb21tYW5kc1tpXS5uYW1lOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBQcmludCBpbiBzaXggY29sdW1ucy4gKi8KLSAgICAgICAgICBpZiAocHJpbnRlZCA9PSA2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwcmludGVkID0gMDsKLSAgICAgICAgICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIHByaW50ZiAoIiVzXHQiLCBjb21tYW5kc1tpXS5uYW1lKTsKLSAgICAgICAgICBwcmludGVkKys7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHByaW50ZWQpCi0gICAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBDaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSBBUkcuICovCi1jb21fY2QgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICBpZiAoY2hkaXIgKGFyZykgPT0gLTEpCi0gICAgewotICAgICAgcGVycm9yIChhcmcpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGNvbV9wd2QgKCIiKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAqLwotY29tX3B3ZCAoaWdub3JlKQotICAgICBjaGFyICppZ25vcmU7Ci17Ci0gIGNoYXIgZGlyWzEwMjRdLCAqczsKLQotICBzID0gZ2V0d2QgKGRpcik7Ci0gIGlmIChzID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiRXJyb3IgZ2V0dGluZyBwd2Q6ICVzXG4iLCBkaXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHByaW50ZiAoIkN1cnJlbnQgZGlyZWN0b3J5IGlzICVzXG4iLCBkaXIpOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIHVzZXIgd2lzaGVzIHRvIHF1aXQgdXNpbmcgdGhpcyBwcm9ncmFtLiAgSnVzdCBzZXQgRE9ORSBub24temVyby4gKi8KLWNvbV9xdWl0IChhcmcpCi0gICAgIGNoYXIgKmFyZzsKLXsKLSAgZG9uZSA9IDE7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHdoaWNoIHRlbGxzIHlvdSB0aGF0IHlvdSBjYW4ndCBkbyB0aGlzLiAqLwotdG9vX2Rhbmdlcm91cyAoY2FsbGVyKQotICAgICBjaGFyICpjYWxsZXI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgIiVzOiBUb28gZGFuZ2Vyb3VzIGZvciBtZSB0byBkaXN0cmlidXRlLiAgV3JpdGUgaXQgeW91cnNlbGYuXG4iLAotICAgICAgICAgICBjYWxsZXIpOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgQVJHIGlzIGEgdmFsaWQgYXJndW1lbnQgZm9yIENBTExFUiwgZWxzZSBwcmludAotICAgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIHplcm8uICovCi1pbnQKLXZhbGlkX2FyZ3VtZW50IChjYWxsZXIsIGFyZykKLSAgICAgY2hhciAqY2FsbGVyLCAqYXJnOwotewotICBpZiAoIWFyZyB8fCAhKmFyZykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogQXJndW1lbnQgcmVxdWlyZWQuXG4iLCBjYWxsZXIpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgxKTsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL2hpc3RleGFtcC5jIGIvcmVhZGxpbmUvZXhhbXBsZXMvaGlzdGV4YW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZWI2NmQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvZXhhbXBsZXMvaGlzdGV4YW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1tYWluICgpCi17Ci0gIGNoYXIgbGluZVsxMDI0XSwgKnQ7Ci0gIGludCBsZW4sIGRvbmUgPSAwOwotCi0gIGxpbmVbMF0gPSAwOwotCi0gIHVzaW5nX2hpc3RvcnkgKCk7Ci0gIHdoaWxlICghZG9uZSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJoaXN0b3J5JCAiKTsKLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICAgIHQgPSBmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSAtIDEsIHN0ZGluKTsKLSAgICAgIGlmICh0ICYmICp0KQotICAgICAgICB7Ci0gICAgICAgICAgbGVuID0gc3RybGVuICh0KTsKLSAgICAgICAgICBpZiAodFtsZW4gLSAxXSA9PSAnXG4nKQotICAgICAgICAgICAgdFtsZW4gLSAxXSA9ICdcMCc7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKCF0KQotICAgICAgICBzdHJjcHkgKGxpbmUsICJxdWl0Iik7Ci0KLSAgICAgIGlmIChsaW5lWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqZXhwYW5zaW9uOwotICAgICAgICAgIGludCByZXN1bHQ7Ci0KLSAgICAgICAgICB1c2luZ19oaXN0b3J5ICgpOwotCi0gICAgICAgICAgcmVzdWx0ID0gaGlzdG9yeV9leHBhbmQgKGxpbmUsICZleHBhbnNpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXhwYW5zaW9uKTsKLQotICAgICAgICAgIGlmIChyZXN1bHQgPCAwIHx8IHJlc3VsdCA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmcmVlIChleHBhbnNpb24pOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIGFkZF9oaXN0b3J5IChleHBhbnNpb24pOwotICAgICAgICAgIHN0cm5jcHkgKGxpbmUsIGV4cGFuc2lvbiwgc2l6ZW9mIChsaW5lKSAtIDEpOwotICAgICAgICAgIGZyZWUgKGV4cGFuc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcCAobGluZSwgInF1aXQiKSA9PSAwKQotICAgICAgICBkb25lID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobGluZSwgInNhdmUiKSA9PSAwKQotICAgICAgICB3cml0ZV9oaXN0b3J5ICgiaGlzdG9yeV9maWxlIik7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGxpbmUsICJyZWFkIikgPT0gMCkKLSAgICAgICAgcmVhZF9oaXN0b3J5ICgiaGlzdG9yeV9maWxlIik7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGxpbmUsICJsaXN0IikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlZ2lzdGVyIEhJU1RfRU5UUlkgKip0aGVfbGlzdDsKLSAgICAgICAgICByZWdpc3RlciBpbnQgaTsKLQotICAgICAgICAgIHRoZV9saXN0ID0gaGlzdG9yeV9saXN0ICgpOwotICAgICAgICAgIGlmICh0aGVfbGlzdCkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IHRoZV9saXN0W2ldOyBpKyspCi0gICAgICAgICAgICAgIHByaW50ZiAoIiVkOiAlc1xuIiwgaSArIGhpc3RvcnlfYmFzZSwgdGhlX2xpc3RbaV0tPmxpbmUpOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChsaW5lLCAiZGVsZXRlIiwgNikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGludCB3aGljaDsKLSAgICAgICAgICBpZiAoKHNzY2FuZiAobGluZSArIDYsICIlZCIsICZ3aGljaCkpID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEhJU1RfRU5UUlkgKmVudHJ5ID0gcmVtb3ZlX2hpc3RvcnkgKHdoaWNoKTsKLSAgICAgICAgICAgICAgaWYgKCFlbnRyeSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJObyBzdWNoIGVudHJ5ICVkXG4iLCB3aGljaCk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcmVlIChlbnRyeS0+bGluZSk7Ci0gICAgICAgICAgICAgICAgICBmcmVlIChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAibm9uLW51bWVyaWMgYXJnIGdpdmVuIHRvIGBkZWxldGUnXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2V4YW1wbGVzL21hbmV4YW1wLmMgYi9yZWFkbGluZS9leGFtcGxlcy9tYW5leGFtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk2ZWZhLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2V4YW1wbGVzL21hbmV4YW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiBtYW5leGFtcC5jIC0tIFRoZSBleGFtcGxlcyB3aGljaCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXJlIGhlcmUuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+Ci0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotKiAgIAkJCUhvdyB0byBFbXVsYXRlIGdldHMgKCkJCQkgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogQSBzdGF0aWMgdmFyaWFibGUgZm9yIGhvbGRpbmcgdGhlIGxpbmUuICovCi1zdGF0aWMgY2hhciAqbGluZV9yZWFkID0gKGNoYXIgKilOVUxMOwotCi0vKiBSZWFkIGEgc3RyaW5nLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIFJldHVybnMgTlVMTCBvbiBFT0YuICovCi1jaGFyICoKLXJsX2dldHMgKCkKLXsKLSAgLyogSWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgcmV0dXJuIHRoZSBtZW1vcnkKLSAgICAgdG8gdGhlIGZyZWUgcG9vbC4gKi8KLSAgaWYgKGxpbmVfcmVhZCkKLSAgICB7Ci0gICAgICBmcmVlIChsaW5lX3JlYWQpOwotICAgICAgbGluZV9yZWFkID0gKGNoYXIgKilOVUxMOwotICAgIH0KLQotICAvKiBHZXQgYSBsaW5lIGZyb20gdGhlIHVzZXIuICovCi0gIGxpbmVfcmVhZCA9IHJlYWRsaW5lICgiIik7Ci0KLSAgLyogSWYgdGhlIGxpbmUgaGFzIGFueSB0ZXh0IGluIGl0LCBzYXZlIGl0IG9uIHRoZSBoaXN0b3J5LiAqLwotICBpZiAobGluZV9yZWFkICYmICpsaW5lX3JlYWQpCi0gICAgYWRkX2hpc3RvcnkgKGxpbmVfcmVhZCk7Ci0KLSAgcmV0dXJuIChsaW5lX3JlYWQpOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgV3JpdGluZyBhIEZ1bmN0aW9uIHRvIGJlIENhbGxlZCBieSBSZWFkbGluZS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIEludmVydCB0aGUgY2FzZSBvZiB0aGUgQ09VTlQgZm9sbG93aW5nIGNoYXJhY3RlcnMuICovCi1pbnZlcnRfY2FzZV9saW5lIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmVnaXN0ZXIgaW50IHN0YXJ0LCBlbmQ7Ci0KLSAgc3RhcnQgPSBybF9wb2ludDsKLQotICBpZiAoY291bnQgPCAwKQotICAgIHsKLSAgICAgIGRpcmVjdGlvbiA9IC0xOwotICAgICAgY291bnQgPSAtY291bnQ7Ci0gICAgfQotICBlbHNlCi0gICAgZGlyZWN0aW9uID0gMTsKLSAgICAgIAotICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIG1vZGlmeS4gKi8KLSAgZW5kID0gc3RhcnQgKyAoY291bnQgKiBkaXJlY3Rpb24pOwotCi0gIC8qIEZvcmNlIGl0IHRvIGJlIHdpdGhpbiByYW5nZS4gKi8KLSAgaWYgKGVuZCA+IHJsX2VuZCkKLSAgICBlbmQgPSBybF9lbmQ7Ci0gIGVsc2UgaWYgKGVuZCA8IDApCi0gICAgZW5kID0gLTE7Ci0KLSAgaWYgKHN0YXJ0ID4gZW5kKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gc3RhcnQ7Ci0gICAgICBzdGFydCA9IGVuZDsKLSAgICAgIGVuZCA9IHRlbXA7Ci0gICAgfQotCi0gIGlmIChzdGFydCA9PSBlbmQpCi0gICAgcmV0dXJuOwotCi0gIC8qIFRlbGwgcmVhZGxpbmUgdGhhdCB3ZSBhcmUgbW9kaWZ5aW5nIHRoZSBsaW5lLCBzbyBzYXZlIHRoZSB1bmRvCi0gICAgIGluZm9ybWF0aW9uLiAqLwotICBybF9tb2RpZnlpbmcgKHN0YXJ0LCBlbmQpOwotCi0gIGZvciAoOyBzdGFydCAhPSBlbmQ7IHN0YXJ0ICs9IGRpcmVjdGlvbikKLSAgICB7Ci0gICAgICBpZiAodXBwZXJjYXNlX3AgKHJsX2xpbmVfYnVmZmVyW3N0YXJ0XSkpCi0JcmxfbGluZV9idWZmZXJbc3RhcnRdID0gdG9fbG93ZXIgKHJsX2xpbmVfYnVmZmVyW3N0YXJ0XSk7Ci0gICAgICBlbHNlIGlmIChsb3dlcmNhc2VfcCAocmxfbGluZV9idWZmZXJbc3RhcnRdKSkKLQlybF9saW5lX2J1ZmZlcltzdGFydF0gPSB0b191cHBlciAocmxfbGluZV9idWZmZXJbc3RhcnRdKTsKLSAgICB9Ci0KLSAgLyogTW92ZSBwb2ludCB0byBvbiB0b3Agb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGNoYW5nZWQuICovCi0gIHJsX3BvaW50ID0gZW5kIC0gZGlyZWN0aW9uOwotfQotCmRpZmYgLS1naXQgYS9yZWFkbGluZS9leGFtcGxlcy9ybC5jIGIvcmVhZGxpbmUvZXhhbXBsZXMvcmwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNjM0My4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9leGFtcGxlcy9ybC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBybCAtIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgdG8gcmVhZCBhIGxpbmUgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQKLSAqICAgICAgKG9yIGFub3RoZXIgZmQpIHVzaW5nIHJlYWRsaW5lLgotICoKLSAqIHVzYWdlOiBybCBbLXAgcHJvbXB0XSBbLXUgdW5pdF0gWy1kIGRlZmF1bHRdCi0gKi8KLQotLyoKLSAqIFJlbW92ZSB0aGUgbmV4dCBsaW5lIGlmIHlvdSdyZSBjb21waWxpbmcgdGhpcyBhZ2FpbnN0IGFuIGluc3RhbGxlZAotICogbGlicmVhZGxpbmUuYQotICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJwb3NpeHN0YXQuaCIKLSNpbmNsdWRlICJyZWFkbGluZS5oIgotI2luY2x1ZGUgImhpc3RvcnkuaCIKLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci1leHRlcm4gY2hhciAqb3B0YXJnOwotCi0jaWYgIWRlZmluZWQgKHN0cmNocikgJiYgIWRlZmluZWQgKF9fU1REQ19fKQotZXh0ZXJuIGNoYXIgKnN0cnJjaHIoKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqcHJvZ25hbWU7Ci1zdGF0aWMgY2hhciAqZGVmdGV4dDsKLQotc3RhdGljIGludAotc2V0X2RlZnRleHQgKCkKLXsKLSAgaWYgKGRlZnRleHQpCi0gICAgewotICAgICAgcmxfaW5zZXJ0X3RleHQgKGRlZnRleHQpOwotICAgICAgZGVmdGV4dCA9IChjaGFyICopTlVMTDsKLSAgICAgIHJsX3N0YXJ0dXBfaG9vayA9IChGdW5jdGlvbiAqKU5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UoKQotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogdXNhZ2U6ICVzIFstcCBwcm9tcHRdIFstdSB1bml0XSBbLWQgZGVmYXVsdF1cbiIsCi0JCXByb2duYW1lLCBwcm9nbmFtZSk7Ci19Ci0KLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqdGVtcCwgKnByb21wdDsKLSAgc3RydWN0IHN0YXQgc2I7Ci0gIGludCBvcHQsIGZkOwotICBGSUxFICppZnA7Ci0KLSAgcHJvZ25hbWUgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJyk7Ci0gIGlmIChwcm9nbmFtZSA9PSAwKQotICAgIHByb2duYW1lID0gYXJndlswXTsKLSAgZWxzZQotICAgIHByb2duYW1lKys7Ci0KLSAgLyogZGVmYXVsdHMgKi8KLSAgcHJvbXB0ID0gInJlYWRsaW5lJCAiOwotICBmZCA9IDA7Ci0gIGRlZnRleHQgPSAoY2hhciAqKTA7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInA6dTpkOiIpKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ3AnOgotCSAgcHJvbXB0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICBmZCA9IGF0b2kob3B0YXJnKTsKLQkgIGlmIChmZCA8IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogYmFkIGZpbGUgZGVzY3JpcHRvciBgJXMnXG4iLCBwcm9nbmFtZSwgb3B0YXJnKTsKLQkgICAgICBleGl0ICgyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkZWZ0ZXh0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHVzYWdlICgpOwotCSAgZXhpdCAoMik7Ci0JfQotICAgIH0KLQotICBpZiAoZmQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnN0YXQgKGZkLCAmc2IpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogJWQ6IGJhZCBmaWxlIGRlc2NyaXB0b3JcbiIsIHByb2duYW1lLCBmZCk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpZnAgPSBmZG9wZW4gKGZkLCAiciIpOwotICAgICAgcmxfaW5zdHJlYW0gPSBpZnA7Ci0gICAgfQotCi0gIGlmIChkZWZ0ZXh0ICYmICpkZWZ0ZXh0KQotICAgIHJsX3N0YXJ0dXBfaG9vayA9IHNldF9kZWZ0ZXh0OwotCi0gIHRlbXAgPSByZWFkbGluZSAocHJvbXB0KTsKLQotICAvKiBUZXN0IGZvciBFT0YuICovCi0gIGlmICh0ZW1wID09IDApCi0gICAgZXhpdCAoMSk7Ci0KLSAgcHV0cyAodGVtcCk7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmx0ZXN0LmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybHRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzZjhlYy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9leGFtcGxlcy9ybHRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJVGVzdGluZyBSZWFkbGluZQkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKgotICogUmVtb3ZlIHRoZSBuZXh0IGxpbmUgaWYgeW91J3JlIGNvbXBpbGluZyB0aGlzIGFnYWluc3QgYW4gaW5zdGFsbGVkCi0gKiBsaWJyZWFkbGluZS5hCi0gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotI2luY2x1ZGUgImhpc3RvcnkuaCIKLQotZXh0ZXJuIEhJU1RfRU5UUlkgKipoaXN0b3J5X2xpc3QgKCk7Ci0KLW1haW4gKCkKLXsKLSAgY2hhciAqdGVtcCwgKnByb21wdDsKLSAgaW50IGRvbmU7Ci0KLSAgdGVtcCA9IChjaGFyICopTlVMTDsKLSAgcHJvbXB0ID0gInJlYWRsaW5lJCAiOwotICBkb25lID0gMDsKLQotICB3aGlsZSAoIWRvbmUpCi0gICAgewotICAgICAgdGVtcCA9IHJlYWRsaW5lIChwcm9tcHQpOwotCi0gICAgICAvKiBUZXN0IGZvciBFT0YuICovCi0gICAgICBpZiAoIXRlbXApCi0JZXhpdCAoMSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIGFueXRoaW5nIG9uIHRoZSBsaW5lLCBwcmludCBpdCBhbmQgcmVtZW1iZXIgaXQuICovCi0gICAgICBpZiAoKnRlbXApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcclxuIiwgdGVtcCk7Ci0JICBhZGRfaGlzdG9yeSAodGVtcCk7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgYGNvbW1hbmQnIHRoYXQgd2UgaGFuZGxlLiAqLwotICAgICAgaWYgKHN0cmNtcCAodGVtcCwgInF1aXQiKSA9PSAwKQotCWRvbmUgPSAxOwotCi0gICAgICBpZiAoc3RyY21wICh0ZW1wLCAibGlzdCIpID09IDApCi0JewotCSAgSElTVF9FTlRSWSAqKmxpc3Q7Ci0JICByZWdpc3RlciBpbnQgaTsKLQotCSAgbGlzdCA9IGhpc3RvcnlfbGlzdCAoKTsKLQkgIGlmIChsaXN0KQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgbGlzdFtpXTsgaSsrKQotCQlmcHJpbnRmIChzdGRlcnIsICIlZDogJXNcclxuIiwgaSwgbGlzdFtpXS0+bGluZSk7Ci0JICAgIH0KLQl9Ci0gICAgICBmcmVlICh0ZW1wKTsKLSAgICB9Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZXhhbXBsZXMvcmx2ZXJzaW9uLmMgYi9yZWFkbGluZS9leGFtcGxlcy9ybHZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3M2E5Ni4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9leGFtcGxlcy9ybHZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBybHZlcnNpb24gLS0gcHJpbnQgb3V0IHJlYWRsaW5lJ3MgdmVyc2lvbiBudW1iZXIKLSAqLwotCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJwb3NpeHN0YXQuaCIKLQotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0KLW1haW4oKQotewotCXByaW50ZiAoIiVzXG4iLCBybF9saWJyYXJ5X3ZlcnNpb24gPyBybF9saWJyYXJ5X3ZlcnNpb24gOiAidW5rbm93biIpOwotCWV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvZnVubWFwLmMgYi9yZWFkbGluZS9mdW5tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiODYyOC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9mdW5tYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKiBmdW5tYXAuYyAtLSBhdHRhY2ggbmFtZXMgdG8gZnVuY3Rpb25zLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCksICp4cmVhbGxvYyAoKTsKLQotI2lmICFkZWZpbmVkIChCVUZTSVopCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZiAvKiBCVUZTSVogKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2luY2x1ZGUgInJsY29uZi5oIgotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0KLWV4dGVybiBpbnQgX3JsX3Fzb3J0X3N0cmluZ19jb21wYXJlICgpOwotCi1GVU5NQVAgKipmdW5tYXA7Ci1zdGF0aWMgaW50IGZ1bm1hcF9zaXplOwotc3RhdGljIGludCBmdW5tYXBfZW50cnk7Ci0KLS8qIEFmdGVyIGluaXRpYWxpemluZyB0aGUgZnVuY3Rpb24gbWFwLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QKLSAgIHByb2dyYW0gc3BlY2lmaWMgZnVuY3Rpb24uICovCi1pbnQgZnVubWFwX3Byb2dyYW1fc3BlY2lmaWNfZW50cnlfc3RhcnQ7Ci0KLXN0YXRpYyBGVU5NQVAgZGVmYXVsdF9mdW5tYXBbXSA9IHsKLSAgeyAiYWJvcnQiLCBybF9hYm9ydCB9LAotICB7ICJhY2NlcHQtbGluZSIsIHJsX25ld2xpbmUgfSwKLSAgeyAiYXJyb3cta2V5LXByZWZpeCIsIHJsX2Fycm93X2tleXMgfSwKLSAgeyAiYmFja3dhcmQtY2hhciIsIHJsX2JhY2t3YXJkIH0sCi0gIHsgImJhY2t3YXJkLWRlbGV0ZS1jaGFyIiwgcmxfcnVib3V0IH0sCi0gIHsgImJhY2t3YXJkLWtpbGwtbGluZSIsIHJsX2JhY2t3YXJkX2tpbGxfbGluZSB9LAotICB7ICJiYWNrd2FyZC1raWxsLXdvcmQiLCBybF9iYWNrd2FyZF9raWxsX3dvcmQgfSwKLSAgeyAiYmFja3dhcmQtd29yZCIsIHJsX2JhY2t3YXJkX3dvcmQgfSwKLSAgeyAiYmVnaW5uaW5nLW9mLWhpc3RvcnkiLCBybF9iZWdpbm5pbmdfb2ZfaGlzdG9yeSB9LAotICB7ICJiZWdpbm5pbmctb2YtbGluZSIsIHJsX2JlZ19vZl9saW5lIH0sCi0gIHsgImNhbGwtbGFzdC1rYmQtbWFjcm8iLCBybF9jYWxsX2xhc3Rfa2JkX21hY3JvIH0sCi0gIHsgImNhcGl0YWxpemUtd29yZCIsIHJsX2NhcGl0YWxpemVfd29yZCB9LAotICB7ICJjaGFyYWN0ZXItc2VhcmNoIiwgcmxfY2hhcl9zZWFyY2ggfSwKLSAgeyAiY2hhcmFjdGVyLXNlYXJjaC1iYWNrd2FyZCIsIHJsX2JhY2t3YXJkX2NoYXJfc2VhcmNoIH0sCi0gIHsgImNsZWFyLXNjcmVlbiIsIHJsX2NsZWFyX3NjcmVlbiB9LAotICB7ICJjb21wbGV0ZSIsIHJsX2NvbXBsZXRlIH0sCi0gIHsgImNvcHktYmFja3dhcmQtd29yZCIsIHJsX2NvcHlfYmFja3dhcmRfd29yZCB9LAotICB7ICJjb3B5LWZvcndhcmQtd29yZCIsIHJsX2NvcHlfZm9yd2FyZF93b3JkIH0sCi0gIHsgImNvcHktcmVnaW9uLWFzLWtpbGwiLCBybF9jb3B5X3JlZ2lvbl90b19raWxsIH0sCi0gIHsgImRlbGV0ZS1jaGFyIiwgcmxfZGVsZXRlIH0sCi0gIHsgImRlbGV0ZS1jaGFyLW9yLWxpc3QiLCBybF9kZWxldGVfb3Jfc2hvd19jb21wbGV0aW9ucyB9LAotICB7ICJkZWxldGUtaG9yaXpvbnRhbC1zcGFjZSIsIHJsX2RlbGV0ZV9ob3Jpem9udGFsX3NwYWNlIH0sCi0gIHsgImRpZ2l0LWFyZ3VtZW50IiwgcmxfZGlnaXRfYXJndW1lbnQgfSwKLSAgeyAiZG8tbG93ZXJjYXNlLXZlcnNpb24iLCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiB9LAotICB7ICJkb3duY2FzZS13b3JkIiwgcmxfZG93bmNhc2Vfd29yZCB9LAotICB7ICJkdW1wLWZ1bmN0aW9ucyIsIHJsX2R1bXBfZnVuY3Rpb25zIH0sCi0gIHsgImR1bXAtbWFjcm9zIiwgcmxfZHVtcF9tYWNyb3MgfSwKLSAgeyAiZHVtcC12YXJpYWJsZXMiLCBybF9kdW1wX3ZhcmlhYmxlcyB9LAotICB7ICJlbWFjcy1lZGl0aW5nLW1vZGUiLCBybF9lbWFjc19lZGl0aW5nX21vZGUgfSwKLSAgeyAiZW5kLWtiZC1tYWNybyIsIHJsX2VuZF9rYmRfbWFjcm8gfSwKLSAgeyAiZW5kLW9mLWhpc3RvcnkiLCBybF9lbmRfb2ZfaGlzdG9yeSB9LAotICB7ICJlbmQtb2YtbGluZSIsIHJsX2VuZF9vZl9saW5lIH0sCi0gIHsgImV4Y2hhbmdlLXBvaW50LWFuZC1tYXJrIiwgcmxfZXhjaGFuZ2VfcG9pbnRfYW5kX21hcmsgfSwKLSAgeyAiZm9yd2FyZC1iYWNrd2FyZC1kZWxldGUtY2hhciIsIHJsX3J1Ym91dF9vcl9kZWxldGUgfSwKLSAgeyAiZm9yd2FyZC1jaGFyIiwgcmxfZm9yd2FyZCB9LAotICB7ICJmb3J3YXJkLXNlYXJjaC1oaXN0b3J5IiwgcmxfZm9yd2FyZF9zZWFyY2hfaGlzdG9yeSB9LAotICB7ICJmb3J3YXJkLXdvcmQiLCBybF9mb3J3YXJkX3dvcmQgfSwKLSAgeyAiaGlzdG9yeS1zZWFyY2gtYmFja3dhcmQiLCBybF9oaXN0b3J5X3NlYXJjaF9iYWNrd2FyZCB9LAotICB7ICJoaXN0b3J5LXNlYXJjaC1mb3J3YXJkIiwgcmxfaGlzdG9yeV9zZWFyY2hfZm9yd2FyZCB9LAotICB7ICJpbnNlcnQtY29tbWVudCIsIHJsX2luc2VydF9jb21tZW50IH0sCi0gIHsgImluc2VydC1jb21wbGV0aW9ucyIsIHJsX2luc2VydF9jb21wbGV0aW9ucyB9LAotICB7ICJraWxsLXdob2xlLWxpbmUiLCBybF9raWxsX2Z1bGxfbGluZSB9LAotICB7ICJraWxsLWxpbmUiLCBybF9raWxsX2xpbmUgfSwKLSAgeyAia2lsbC1yZWdpb24iLCBybF9raWxsX3JlZ2lvbiB9LAotICB7ICJraWxsLXdvcmQiLCBybF9raWxsX3dvcmQgfSwKLSAgeyAibWVudS1jb21wbGV0ZSIsIHJsX21lbnVfY29tcGxldGUgfSwKLSAgeyAibmV4dC1oaXN0b3J5IiwgcmxfZ2V0X25leHRfaGlzdG9yeSB9LAotICB7ICJub24taW5jcmVtZW50YWwtZm9yd2FyZC1zZWFyY2gtaGlzdG9yeSIsIHJsX25vbmluY19mb3J3YXJkX3NlYXJjaCB9LAotICB7ICJub24taW5jcmVtZW50YWwtcmV2ZXJzZS1zZWFyY2gtaGlzdG9yeSIsIHJsX25vbmluY19yZXZlcnNlX3NlYXJjaCB9LAotICB7ICJub24taW5jcmVtZW50YWwtZm9yd2FyZC1zZWFyY2gtaGlzdG9yeS1hZ2FpbiIsIHJsX25vbmluY19mb3J3YXJkX3NlYXJjaF9hZ2FpbiB9LAotICB7ICJub24taW5jcmVtZW50YWwtcmV2ZXJzZS1zZWFyY2gtaGlzdG9yeS1hZ2FpbiIsIHJsX25vbmluY19yZXZlcnNlX3NlYXJjaF9hZ2FpbiB9LAotI2lmZGVmIF9fQ1lHV0lOMzJfXwotICB7ICJwYXN0ZS1mcm9tLWNsaXBib2FyZCIsIHJsX3Bhc3RlX2Zyb21fY2xpcGJvYXJkIH0sCi0jZW5kaWYKLSAgeyAicG9zc2libGUtY29tcGxldGlvbnMiLCBybF9wb3NzaWJsZV9jb21wbGV0aW9ucyB9LAotICB7ICJwcmV2aW91cy1oaXN0b3J5IiwgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkgfSwKLSAgeyAicXVvdGVkLWluc2VydCIsIHJsX3F1b3RlZF9pbnNlcnQgfSwKLSAgeyAicmUtcmVhZC1pbml0LWZpbGUiLCBybF9yZV9yZWFkX2luaXRfZmlsZSB9LAotICB7ICJyZWRyYXctY3VycmVudC1saW5lIiwgcmxfcmVmcmVzaF9saW5lfSwKLSAgeyAicmV2ZXJzZS1zZWFyY2gtaGlzdG9yeSIsIHJsX3JldmVyc2Vfc2VhcmNoX2hpc3RvcnkgfSwKLSAgeyAicmV2ZXJ0LWxpbmUiLCBybF9yZXZlcnRfbGluZSB9LAotICB7ICJzZWxmLWluc2VydCIsIHJsX2luc2VydCB9LAotICB7ICJzZXQtbWFyayIsIHJsX3NldF9tYXJrIH0sCi0gIHsgInN0YXJ0LWtiZC1tYWNybyIsIHJsX3N0YXJ0X2tiZF9tYWNybyB9LAotICB7ICJ0YWItaW5zZXJ0IiwgcmxfdGFiX2luc2VydCB9LAotICB7ICJ0aWxkZS1leHBhbmQiLCBybF90aWxkZV9leHBhbmQgfSwKLSAgeyAidHJhbnNwb3NlLWNoYXJzIiwgcmxfdHJhbnNwb3NlX2NoYXJzIH0sCi0gIHsgInRyYW5zcG9zZS13b3JkcyIsIHJsX3RyYW5zcG9zZV93b3JkcyB9LAotICB7ICJ0dHktc3RhdHVzIiwgcmxfdHR5X3N0YXR1cyB9LAotICB7ICJ1bmRvIiwgcmxfdW5kb19jb21tYW5kIH0sCi0gIHsgInVuaXZlcnNhbC1hcmd1bWVudCIsIHJsX3VuaXZlcnNhbF9hcmd1bWVudCB9LAotICB7ICJ1bml4LWxpbmUtZGlzY2FyZCIsIHJsX3VuaXhfbGluZV9kaXNjYXJkIH0sCi0gIHsgInVuaXgtd29yZC1ydWJvdXQiLCBybF91bml4X3dvcmRfcnVib3V0IH0sCi0gIHsgInVwY2FzZS13b3JkIiwgcmxfdXBjYXNlX3dvcmQgfSwKLSAgeyAieWFuayIsIHJsX3lhbmsgfSwKLSAgeyAieWFuay1sYXN0LWFyZyIsIHJsX3lhbmtfbGFzdF9hcmcgfSwKLSAgeyAieWFuay1udGgtYXJnIiwgcmxfeWFua19udGhfYXJnIH0sCi0gIHsgInlhbmstcG9wIiwgcmxfeWFua19wb3AgfSwKLQotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gIHsgInZpLWFwcGVuZC1lb2wiLCBybF92aV9hcHBlbmRfZW9sIH0sCi0gIHsgInZpLWFwcGVuZC1tb2RlIiwgcmxfdmlfYXBwZW5kX21vZGUgfSwKLSAgeyAidmktYXJnLWRpZ2l0IiwgcmxfdmlfYXJnX2RpZ2l0IH0sCi0gIHsgInZpLWJhY2stdG8taW5kZW50IiwgcmxfdmlfYmFja190b19pbmRlbnQgfSwKLSAgeyAidmktYldvcmQiLCBybF92aV9iV29yZCB9LAotICB7ICJ2aS1icmFja3R5cGUiLCBybF92aV9icmFja3R5cGUgfSwKLSAgeyAidmktYndvcmQiLCBybF92aV9id29yZCB9LAotICB7ICJ2aS1jaGFuZ2UtY2FzZSIsIHJsX3ZpX2NoYW5nZV9jYXNlIH0sCi0gIHsgInZpLWNoYW5nZS1jaGFyIiwgcmxfdmlfY2hhbmdlX2NoYXIgfSwKLSAgeyAidmktY2hhbmdlLXRvIiwgcmxfdmlfY2hhbmdlX3RvIH0sCi0gIHsgInZpLWNoYXItc2VhcmNoIiwgcmxfdmlfY2hhcl9zZWFyY2ggfSwKLSAgeyAidmktY29sdW1uIiwgcmxfdmlfY29sdW1uIH0sCi0gIHsgInZpLWNvbXBsZXRlIiwgcmxfdmlfY29tcGxldGUgfSwKLSAgeyAidmktZGVsZXRlIiwgcmxfdmlfZGVsZXRlIH0sCi0gIHsgInZpLWRlbGV0ZS10byIsIHJsX3ZpX2RlbGV0ZV90byB9LAotICB7ICJ2aS1lV29yZCIsIHJsX3ZpX2VXb3JkIH0sCi0gIHsgInZpLWVkaXRpbmctbW9kZSIsIHJsX3ZpX2VkaXRpbmdfbW9kZSB9LAotICB7ICJ2aS1lbmQtd29yZCIsIHJsX3ZpX2VuZF93b3JkIH0sCi0gIHsgInZpLWVvZi1tYXliZSIsIHJsX3ZpX2VvZl9tYXliZSB9LAotICB7ICJ2aS1ld29yZCIsIHJsX3ZpX2V3b3JkIH0sCi0gIHsgInZpLWZXb3JkIiwgcmxfdmlfZldvcmQgfSwKLSAgeyAidmktZmV0Y2gtaGlzdG9yeSIsIHJsX3ZpX2ZldGNoX2hpc3RvcnkgfSwKLSAgeyAidmktZmlyc3QtcHJpbnQiLCBybF92aV9maXJzdF9wcmludCB9LAotICB7ICJ2aS1md29yZCIsIHJsX3ZpX2Z3b3JkIH0sCi0gIHsgInZpLWdvdG8tbWFyayIsIHJsX3ZpX2dvdG9fbWFyayB9LAotICB7ICJ2aS1pbnNlcnQtYmVnIiwgcmxfdmlfaW5zZXJ0X2JlZyB9LAotICB7ICJ2aS1pbnNlcnRpb24tbW9kZSIsIHJsX3ZpX2luc2VydGlvbl9tb2RlIH0sCi0gIHsgInZpLW1hdGNoIiwgcmxfdmlfbWF0Y2ggfSwKLSAgeyAidmktbW92ZW1lbnQtbW9kZSIsIHJsX3ZpX21vdmVtZW50X21vZGUgfSwKLSAgeyAidmktbmV4dC13b3JkIiwgcmxfdmlfbmV4dF93b3JkIH0sCi0gIHsgInZpLW92ZXJzdHJpa2UiLCBybF92aV9vdmVyc3RyaWtlIH0sCi0gIHsgInZpLW92ZXJzdHJpa2UtZGVsZXRlIiwgcmxfdmlfb3ZlcnN0cmlrZV9kZWxldGUgfSwKLSAgeyAidmktcHJldi13b3JkIiwgcmxfdmlfcHJldl93b3JkIH0sCi0gIHsgInZpLXB1dCIsIHJsX3ZpX3B1dCB9LAotICB7ICJ2aS1yZWRvIiwgcmxfdmlfcmVkbyB9LAotICB7ICJ2aS1yZXBsYWNlIiwgcmxfdmlfcmVwbGFjZSB9LAotICB7ICJ2aS1zZWFyY2giLCBybF92aV9zZWFyY2ggfSwKLSAgeyAidmktc2VhcmNoLWFnYWluIiwgcmxfdmlfc2VhcmNoX2FnYWluIH0sCi0gIHsgInZpLXNldC1tYXJrIiwgcmxfdmlfc2V0X21hcmsgfSwKLSAgeyAidmktc3Vic3QiLCBybF92aV9zdWJzdCB9LAotICB7ICJ2aS10aWxkZS1leHBhbmQiLCBybF92aV90aWxkZV9leHBhbmQgfSwKLSAgeyAidmkteWFuay1hcmciLCBybF92aV95YW5rX2FyZyB9LAotICB7ICJ2aS15YW5rLXRvIiwgcmxfdmlfeWFua190byB9LAotI2VuZGlmIC8qIFZJX01PREUgKi8KLQotIHsoY2hhciAqKU5VTEwsIChGdW5jdGlvbiAqKU5VTEwgfQotfTsKLQotaW50Ci1ybF9hZGRfZnVubWFwX2VudHJ5IChuYW1lLCBmdW5jdGlvbikKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgRnVuY3Rpb24gKmZ1bmN0aW9uOwotewotICBpZiAoZnVubWFwX2VudHJ5ICsgMiA+PSBmdW5tYXBfc2l6ZSkKLSAgICB7Ci0gICAgICBmdW5tYXBfc2l6ZSArPSA2NDsKLSAgICAgIGZ1bm1hcCA9IChGVU5NQVAgKiopeHJlYWxsb2MgKGZ1bm1hcCwgZnVubWFwX3NpemUgKiBzaXplb2YgKEZVTk1BUCAqKSk7Ci0gICAgfQotICAKLSAgZnVubWFwW2Z1bm1hcF9lbnRyeV0gPSAoRlVOTUFQICopeG1hbGxvYyAoc2l6ZW9mIChGVU5NQVApKTsKLSAgZnVubWFwW2Z1bm1hcF9lbnRyeV0tPm5hbWUgPSBuYW1lOwotICBmdW5tYXBbZnVubWFwX2VudHJ5XS0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQotICBmdW5tYXBbKytmdW5tYXBfZW50cnldID0gKEZVTk1BUCAqKU5VTEw7Ci0gIHJldHVybiBmdW5tYXBfZW50cnk7Ci19Ci0KLXN0YXRpYyBpbnQgZnVubWFwX2luaXRpYWxpemVkOwotCi0vKiBNYWtlIHRoZSBmdW5tYXAgY29udGFpbiBhbGwgb2YgdGhlIGRlZmF1bHQgZW50cmllcy4gKi8KLXZvaWQKLXJsX2luaXRpYWxpemVfZnVubWFwICgpCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGlmIChmdW5tYXBfaW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoaSA9IDA7IGRlZmF1bHRfZnVubWFwW2ldLm5hbWU7IGkrKykKLSAgICBybF9hZGRfZnVubWFwX2VudHJ5IChkZWZhdWx0X2Z1bm1hcFtpXS5uYW1lLCBkZWZhdWx0X2Z1bm1hcFtpXS5mdW5jdGlvbik7Ci0KLSAgZnVubWFwX2luaXRpYWxpemVkID0gMTsKLSAgZnVubWFwX3Byb2dyYW1fc3BlY2lmaWNfZW50cnlfc3RhcnQgPSBpOwotfQotCi0vKiBQcm9kdWNlIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGtub3duIGZ1bmN0aW9uIG5hbWVzLiAgVGhlIGFycmF5Ci0gICBpcyBzb3J0ZWQuICBUaGUgYXJyYXkgaXRzZWxmIGlzIGFsbG9jYXRlZCwgYnV0IG5vdCB0aGUgc3RyaW5ncyBpbnNpZGUuCi0gICBZb3Ugc2hvdWxkIGZyZWUgKCkgdGhlIGFycmF5IHdoZW4geW91IGRvbmUsIGJ1dCBub3QgdGhlIHBvaW50cnMuICovCi1jaGFyICoqCi1ybF9mdW5tYXBfbmFtZXMgKCkKLXsKLSAgY2hhciAqKnJlc3VsdDsKLSAgaW50IHJlc3VsdF9zaXplLCByZXN1bHRfaW5kZXg7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZC4gKi8KLSAgcmxfaW5pdGlhbGl6ZV9mdW5tYXAgKCk7Ci0KLSAgZm9yIChyZXN1bHRfaW5kZXggPSByZXN1bHRfc2l6ZSA9IDAsIHJlc3VsdCA9IChjaGFyICoqKU5VTEw7IGZ1bm1hcFtyZXN1bHRfaW5kZXhdOyByZXN1bHRfaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0X2luZGV4ICsgMiA+IHJlc3VsdF9zaXplKQotCXsKLQkgIHJlc3VsdF9zaXplICs9IDIwOwotCSAgcmVzdWx0ID0gKGNoYXIgKiopeHJlYWxsb2MgKHJlc3VsdCwgcmVzdWx0X3NpemUgKiBzaXplb2YgKGNoYXIgKikpOwotCX0KLQotICAgICAgcmVzdWx0W3Jlc3VsdF9pbmRleF0gPSBmdW5tYXBbcmVzdWx0X2luZGV4XS0+bmFtZTsKLSAgICAgIHJlc3VsdFtyZXN1bHRfaW5kZXggKyAxXSA9IChjaGFyICopTlVMTDsKLSAgICB9Ci0KLSAgcXNvcnQgKHJlc3VsdCwgcmVzdWx0X2luZGV4LCBzaXplb2YgKGNoYXIgKiksIF9ybF9xc29ydF9zdHJpbmdfY29tcGFyZSk7Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogVGhpbmdzIHRoYXQgbWVhbiBgQ29udHJvbCcuICovCi1jaGFyICpwb3NzaWJsZV9jb250cm9sX3ByZWZpeGVzW10gPSB7Ci0gICJDb250cm9sLSIsICJDLSIsICJDVFJMLSIsIChjaGFyICopTlVMTAotfTsKLQotY2hhciAqcG9zc2libGVfbWV0YV9wcmVmaXhlc1tdID0gewotICAiTWV0YSIsICJNLSIsIChjaGFyICopTlVMTAotfTsKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2hpc3RleHBhbmQuYyBiL3JlYWRsaW5lL2hpc3RleHBhbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyZTZkMy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9oaXN0ZXhwYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU5ICswLDAgQEAKLS8qIGhpc3RleHBhbmQuYyAtLSBoaXN0b3J5IGV4cGFuc2lvbi4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgKHRoZSBMaWJyYXJ5KSwgYSBzZXQgb2YKLSAgIHJvdXRpbmVzIGZvciBtYW5hZ2luZyB0aGUgdGV4dCBvZiBwcmV2aW91c2x5IHR5cGVkIGxpbmVzLgotCi0gICBUaGUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpZm5kZWYgX01JTklYCi0jICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmIC8qICFIQVZFX1NUUklOR19IICovCi0KLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0jaW5jbHVkZSAiaGlzdGxpYi5oIgotCi0jZGVmaW5lIEhJU1RPUllfV09SRF9ERUxJTUlURVJTCQkiIFx0XG47JigpfDw+IgotI2RlZmluZSBISVNUT1JZX1FVT1RFX0NIQVJBQ1RFUlMJIlwiJ2AiCi0KLXN0YXRpYyBjaGFyIGVycm9yX3BvaW50ZXI7Ci0KLXN0YXRpYyBjaGFyICpzdWJzdF9saHM7Ci1zdGF0aWMgY2hhciAqc3Vic3RfcmhzOwotc3RhdGljIGludCBzdWJzdF9saHNfbGVuOwotc3RhdGljIGludCBzdWJzdF9yaHNfbGVuOwotCi1zdGF0aWMgY2hhciAqZ2V0X2hpc3Rvcnlfd29yZF9zcGVjaWZpZXIgKCk7Ci1zdGF0aWMgY2hhciAqaGlzdG9yeV9maW5kX3dvcmQgKCk7Ci0KLWV4dGVybiBpbnQgaGlzdG9yeV9vZmZzZXQ7Ci0KLWV4dGVybiBjaGFyICpzaW5nbGVfcXVvdGUgKCk7Ci1zdGF0aWMgY2hhciAqcXVvdGVfYnJlYWtzICgpOwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiBWYXJpYWJsZXMgZXhwb3J0ZWQgYnkgdGhpcyBmaWxlLiAqLwotLyogVGhlIGNoYXJhY3RlciB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgaGlzdG9yeSBleHBhbnNpb24KLSAgIHJlcXVlc3QuICBUaGlzIGlzIHVzdWFsbHkgYCEnLiAqLwotY2hhciBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyID0gJyEnOwotCi0vKiBUaGUgY2hhcmFjdGVyIHRoYXQgaW52b2tlcyB3b3JkIHN1YnN0aXR1dGlvbiBpZiBmb3VuZCBhdCB0aGUgc3RhcnQgb2YKLSAgIGEgbGluZS4gIFRoaXMgaXMgdXN1YWxseSBgXicuICovCi1jaGFyIGhpc3Rvcnlfc3Vic3RfY2hhciA9ICdeJzsKLQotLyogRHVyaW5nIHRva2VuaXphdGlvbiwgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgc2VlbiBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBvZiBhIHdvcmQsIHRoZW4gaXQsIGFuZCBhbGwgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIHVwdG8gYSBuZXdsaW5lIGFyZQotICAgaWdub3JlZC4gIEZvciBhIEJvdXJuZSBzaGVsbCwgdGhpcyBzaG91bGQgYmUgJyMnLiAgQmFzaCBzcGVjaWFsIGNhc2VzCi0gICB0aGUgaW50ZXJhY3RpdmUgY29tbWVudCBjaGFyYWN0ZXIgdG8gbm90IGJlIGEgY29tbWVudCBkZWxpbWl0ZXIuICovCi1jaGFyIGhpc3RvcnlfY29tbWVudF9jaGFyID0gJ1wwJzsKLQotLyogVGhlIGxpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBpbmhpYml0IHRoZSBleHBhbnNpb24gb2YgdGV4dCBpZiBmb3VuZAotICAgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXIuICovCi1jaGFyICpoaXN0b3J5X25vX2V4cGFuZF9jaGFycyA9ICIgXHRcblxyPSI7Ci0KLS8qIElmIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCBzaW5nbGUgcXVvdGVzIGluaGliaXQgaGlzdG9yeSBleHBhbnNpb24uCi0gICBUaGUgZGVmYXVsdCBpcyAwLiAqLwotaW50IGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uID0gMDsKLQotLyogSWYgc2V0LCB0aGlzIHBvaW50cyB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHZlcmlmeSB0aGF0IGEKLSAgIHBhcnRpY3VsYXIgaGlzdG9yeSBleHBhbnNpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gKi8KLUZ1bmN0aW9uICpoaXN0b3J5X2luaGliaXRfZXhwYW5zaW9uX2Z1bmN0aW9uOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUhpc3RvcnkgRXhwYW5zaW9uCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIEhhaXJ5IGhpc3RvcnkgZXhwYW5zaW9uIG9uIHRleHQsIG5vdCB0b2tlbnMuICBUaGlzIGlzIG9mIGdlbmVyYWwKLSAgIHVzZSwgYW5kIHRodXMgYmVsb25ncyBpbiB0aGlzIGxpYnJhcnkuICovCi0KLS8qIFRoZSBsYXN0IHN0cmluZyBzZWFyY2hlZCBmb3IgYnkgYSAhP3N0cmluZz8gc2VhcmNoLiAqLwotc3RhdGljIGNoYXIgKnNlYXJjaF9zdHJpbmc7Ci0KLS8qIFRoZSBsYXN0IHN0cmluZyBtYXRjaGVkIGJ5IGEgIT9zdHJpbmc/IHNlYXJjaC4gKi8KLXN0YXRpYyBjaGFyICpzZWFyY2hfbWF0Y2g7Ci0KLS8qIFJldHVybiB0aGUgZXZlbnQgc3BlY2lmaWVkIGF0IFRFWFQgKyBPRkZTRVQgbW9kaWZ5aW5nIE9GRlNFVCB0bwotICAgcG9pbnQgdG8gYWZ0ZXIgdGhlIGV2ZW50IHNwZWNpZmllci4gIEp1c3QgYSBwb2ludGVyIHRvIHRoZSBoaXN0b3J5Ci0gICBsaW5lIGlzIHJldHVybmVkOyBOVUxMIGlzIHJldHVybmVkIGluIHRoZSBldmVudCBvZiBhIGJhZCBzcGVjaWZpZXIuCi0gICBZb3UgcGFzcyBTVFJJTkcgd2l0aCAqSU5ERVggZXF1YWwgdG8gdGhlIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXIgdGhhdAotICAgYmVnaW5zIHRoaXMgc3BlY2lmaWNhdGlvbi4KLSAgIERFTElNSVRJTkdfUVVPVEUgaXMgYSBjaGFyYWN0ZXIgdGhhdCBpcyBhbGxvd2VkIHRvIGVuZCB0aGUgc3RyaW5nCi0gICBzcGVjaWZpY2F0aW9uIGZvciB3aGF0IHRvIHNlYXJjaCBmb3IgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbAotICAgY2hhcmFjdGVycyBgOicsIGAgJywgYFx0JywgYFxuJywgYW5kIHNvbWV0aW1lcyBgPycuCi0gICBTbyB5b3UgbWlnaHQgY2FsbCB0aGlzIGZ1bmN0aW9uIGxpa2U6Ci0gICBsaW5lID0gZ2V0X2hpc3RvcnlfZXZlbnQgKCIhZWNobzpwIiwgJmluZGV4LCAwKTsgICovCi1jaGFyICoKLWdldF9oaXN0b3J5X2V2ZW50IChzdHJpbmcsIGNhbGxlcl9pbmRleCwgZGVsaW1pdGluZ19xdW90ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgKmNhbGxlcl9pbmRleDsKLSAgICAgaW50IGRlbGltaXRpbmdfcXVvdGU7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIEhJU1RfRU5UUlkgKmVudHJ5OwotICBpbnQgd2hpY2gsIHNpZ24sIGxvY2FsX2luZGV4LCBzdWJzdHJpbmdfb2theTsKLSAgRnVuY3Rpb24gKnNlYXJjaF9mdW5jOwotICBjaGFyICp0ZW1wOwotCi0gIC8qIFRoZSBldmVudCBjYW4gYmUgc3BlY2lmaWVkIGluIGEgbnVtYmVyIG9mIHdheXMuCi0KLSAgICAgISEgICB0aGUgcHJldmlvdXMgY29tbWFuZAotICAgICAhbiAgIGNvbW1hbmQgbGluZSBOCi0gICAgICEtbiAgY3VycmVudCBjb21tYW5kLWxpbmUgbWludXMgTgotICAgICAhc3RyIHRoZSBtb3N0IHJlY2VudCBjb21tYW5kIHN0YXJ0aW5nIHdpdGggU1RSCi0gICAgICE/c3RyWz9dCi0JICB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBjb250YWluaW5nIFNUUgotCi0gICAgIEFsbCB2YWx1ZXMgTiBhcmUgZGV0ZXJtaW5lZCB2aWEgSElTVE9SWV9CQVNFLiAqLwotCi0gIGkgPSAqY2FsbGVyX2luZGV4OwotCi0gIGlmIChzdHJpbmdbaV0gIT0gaGlzdG9yeV9leHBhbnNpb25fY2hhcikKLSAgICByZXR1cm4gKChjaGFyICopTlVMTCk7Ci0KLSAgLyogTW92ZSBvbiB0byB0aGUgc3BlY2lmaWNhdGlvbi4gKi8KLSAgaSsrOwotCi0gIHNpZ24gPSAxOwotICBzdWJzdHJpbmdfb2theSA9IDA7Ci0KLSNkZWZpbmUgUkVUVVJOX0VOVFJZKGUsIHcpIFwKLQlyZXR1cm4gKChlID0gaGlzdG9yeV9nZXQgKHcpKSA/IGUtPmxpbmUgOiAoY2hhciAqKU5VTEwpCi0KLSAgLyogSGFuZGxlICEhIGNhc2UuICovCi0gIGlmIChzdHJpbmdbaV0gPT0gaGlzdG9yeV9leHBhbnNpb25fY2hhcikKLSAgICB7Ci0gICAgICBpKys7Ci0gICAgICB3aGljaCA9IGhpc3RvcnlfYmFzZSArIChoaXN0b3J5X2xlbmd0aCAtIDEpOwotICAgICAgKmNhbGxlcl9pbmRleCA9IGk7Ci0gICAgICBSRVRVUk5fRU5UUlkgKGVudHJ5LCB3aGljaCk7Ci0gICAgfQotCi0gIC8qIEhhY2sgY2FzZSBvZiBudW1lcmljIGxpbmUgc3BlY2lmaWNhdGlvbi4gKi8KLSAgaWYgKHN0cmluZ1tpXSA9PSAnLScpCi0gICAgewotICAgICAgc2lnbiA9IC0xOwotICAgICAgaSsrOwotICAgIH0KLQotICBpZiAoX3JsX2RpZ2l0X3AgKHN0cmluZ1tpXSkpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBleHRlbnQgb2YgdGhlIGRpZ2l0cyBhbmQgY29tcHV0ZSB0aGUgdmFsdWUuICovCi0gICAgICBmb3IgKHdoaWNoID0gMDsgX3JsX2RpZ2l0X3AgKHN0cmluZ1tpXSk7IGkrKykKLQl3aGljaCA9ICh3aGljaCAqIDEwKSArIF9ybF9kaWdpdF92YWx1ZSAoc3RyaW5nW2ldKTsKLQotICAgICAgKmNhbGxlcl9pbmRleCA9IGk7Ci0KLSAgICAgIGlmIChzaWduIDwgMCkKLQl3aGljaCA9IChoaXN0b3J5X2xlbmd0aCArIGhpc3RvcnlfYmFzZSkgLSB3aGljaDsKLQotICAgICAgUkVUVVJOX0VOVFJZIChlbnRyeSwgd2hpY2gpOwotICAgIH0KLQotICAvKiBUaGlzIG11c3QgYmUgc29tZXRoaW5nIHRvIHNlYXJjaCBmb3IuICBJZiB0aGUgc3BlYyBiZWdpbnMgd2l0aAotICAgICBhICc/JywgdGhlbiB0aGUgc3RyaW5nIG1heSBiZSBhbnl3aGVyZSBvbiB0aGUgbGluZS4gIE90aGVyd2lzZSwKLSAgICAgdGhlIHN0cmluZyBtdXN0IGJlIGZvdW5kIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuICovCi0gIGlmIChzdHJpbmdbaV0gPT0gJz8nKQotICAgIHsKLSAgICAgIHN1YnN0cmluZ19va2F5Kys7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gIC8qIE9ubHkgYSBjbG9zaW5nIGA/JyBvciBhIG5ld2xpbmUgZGVsaW1pdCBhIHN1YnN0cmluZyBzZWFyY2ggc3RyaW5nLiAqLwotICBmb3IgKGxvY2FsX2luZGV4ID0gaTsgYyA9IHN0cmluZ1tpXTsgaSsrKQotICAgIGlmICgoIXN1YnN0cmluZ19va2F5ICYmICh3aGl0ZXNwYWNlIChjKSB8fCBjID09ICc6JyB8fAotCShoaXN0b3J5X3NlYXJjaF9kZWxpbWl0ZXJfY2hhcnMgJiYgbWVtYmVyIChjLCBoaXN0b3J5X3NlYXJjaF9kZWxpbWl0ZXJfY2hhcnMpKSB8fAotCXN0cmluZ1tpXSA9PSBkZWxpbWl0aW5nX3F1b3RlKSkgfHwKLQlzdHJpbmdbaV0gPT0gJ1xuJyB8fAotCShzdWJzdHJpbmdfb2theSAmJiBzdHJpbmdbaV0gPT0gJz8nKSkKLSAgICAgIGJyZWFrOwotCi0gIHdoaWNoID0gaSAtIGxvY2FsX2luZGV4OwotICB0ZW1wID0geG1hbGxvYyAoMSArIHdoaWNoKTsKLSAgaWYgKHdoaWNoKQotICAgIHN0cm5jcHkgKHRlbXAsIHN0cmluZyArIGxvY2FsX2luZGV4LCB3aGljaCk7Ci0gIHRlbXBbd2hpY2hdID0gJ1wwJzsKLQotICBpZiAoc3Vic3RyaW5nX29rYXkgJiYgc3RyaW5nW2ldID09ICc/JykKLSAgICBpKys7Ci0KLSAgKmNhbGxlcl9pbmRleCA9IGk7Ci0KLSNkZWZpbmUgRkFJTF9TRUFSQ0goKSBcCi0gIGRvIHsgXAotICAgIGhpc3Rvcnlfb2Zmc2V0ID0gaGlzdG9yeV9sZW5ndGg7IGZyZWUgKHRlbXApIDsgcmV0dXJuIChjaGFyICopTlVMTDsgXAotICB9IHdoaWxlICgwKQotCi0gIC8qIElmIHRoZXJlIGlzIG5vIHNlYXJjaCBzdHJpbmcsIHRyeSB0byB1c2UgdGhlIHByZXZpb3VzIHNlYXJjaCBzdHJpbmcsCi0gICAgIGlmIG9uZSBleGlzdHMuICBJZiBub3QsIGZhaWwgaW1tZWRpYXRlbHkuICovCi0gIGlmICgqdGVtcCA9PSAnXDAnICYmIHN1YnN0cmluZ19va2F5KQotICAgIHsKLSAgICAgIGlmIChzZWFyY2hfc3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZnJlZSAodGVtcCk7Ci0gICAgICAgICAgdGVtcCA9IHNhdmVzdHJpbmcgKHNlYXJjaF9zdHJpbmcpOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIEZBSUxfU0VBUkNIICgpOwotICAgIH0KLQotICBzZWFyY2hfZnVuYyA9IHN1YnN0cmluZ19va2F5ID8gaGlzdG9yeV9zZWFyY2ggOiBoaXN0b3J5X3NlYXJjaF9wcmVmaXg7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGxvY2FsX2luZGV4ID0gKCpzZWFyY2hfZnVuYykgKHRlbXAsIC0xKTsKLQotICAgICAgaWYgKGxvY2FsX2luZGV4IDwgMCkKLQlGQUlMX1NFQVJDSCAoKTsKLQotICAgICAgaWYgKGxvY2FsX2luZGV4ID09IDAgfHwgc3Vic3RyaW5nX29rYXkpCi0JewotCSAgZW50cnkgPSBjdXJyZW50X2hpc3RvcnkgKCk7Ci0JICBoaXN0b3J5X29mZnNldCA9IGhpc3RvcnlfbGVuZ3RoOwotCQotCSAgLyogSWYgdGhpcyB3YXMgYSBzdWJzdHJpbmcgc2VhcmNoLCB0aGVuIHJlbWVtYmVyIHRoZQotCSAgICAgc3RyaW5nIHRoYXQgd2UgbWF0Y2hlZCBmb3Igd29yZCBzdWJzdGl0dXRpb24uICovCi0JICBpZiAoc3Vic3RyaW5nX29rYXkpCi0JICAgIHsKLQkgICAgICBGUkVFIChzZWFyY2hfc3RyaW5nKTsKLQkgICAgICBzZWFyY2hfc3RyaW5nID0gdGVtcDsKLQotCSAgICAgIEZSRUUgKHNlYXJjaF9tYXRjaCk7Ci0JICAgICAgc2VhcmNoX21hdGNoID0gaGlzdG9yeV9maW5kX3dvcmQgKGVudHJ5LT5saW5lLCBsb2NhbF9pbmRleCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZnJlZSAodGVtcCk7Ci0KLQkgIHJldHVybiAoZW50cnktPmxpbmUpOwotCX0KLQotICAgICAgaWYgKGhpc3Rvcnlfb2Zmc2V0KQotCWhpc3Rvcnlfb2Zmc2V0LS07Ci0gICAgICBlbHNlCi0JRkFJTF9TRUFSQ0ggKCk7Ci0gICAgfQotI3VuZGVmIEZBSUxfU0VBUkNICi0jdW5kZWYgUkVUVVJOX0VOVFJZCi19Ci0KLS8qIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHNpbmdsZS1xdW90ZWQgc3RyaW5ncy4gIFVzZWQgZm9yIGluaGliaXRpbmcKLSAgIGhpc3RvcnkgZXhwYW5zaW9uIHdpdGhpbiBzaW5nbGUgcXVvdGVzLiAqLwotCi0vKiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiBTVFJJTkcgYXMgaWYgaXQgaXMgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3Rlcy4KLSAgIFNJTkRFWCwgd2hlbiBwYXNzZWQgaW4sIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseQotICAgZm9sbG93aW5nIHRoZSBvcGVuaW5nIHNpbmdsZSBxdW90ZTsgb24gZXhpdCwgU0lOREVYIGlzIGxlZnQgcG9pbnRpbmcKLSAgIHRvIHRoZSBjbG9zaW5nIHNpbmdsZSBxdW90ZS4gKi8KLXN0YXRpYyB2b2lkCi1oaXN0X3N0cmluZ19leHRyYWN0X3NpbmdsZV9xdW90ZWQgKHN0cmluZywgc2luZGV4KQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCAqc2luZGV4OwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBmb3IgKGkgPSAqc2luZGV4OyBzdHJpbmdbaV0gJiYgc3RyaW5nW2ldICE9ICdcJyc7IGkrKykKLSAgICA7Ci0KLSAgKnNpbmRleCA9IGk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXF1b3RlX2JyZWFrcyAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcCwgKnI7Ci0gIGNoYXIgKnJldDsKLSAgaW50IGxlbiA9IDM7Ci0KLSAgZm9yIChwID0gczsgcCAmJiAqcDsgcCsrLCBsZW4rKykKLSAgICB7Ci0gICAgICBpZiAoKnAgPT0gJ1wnJykKLQlsZW4gKz0gMzsKLSAgICAgIGVsc2UgaWYgKHdoaXRlc3BhY2UgKCpwKSB8fCAqcCA9PSAnXG4nKQotCWxlbiArPSAyOwotICAgIH0KLQotICByID0gcmV0ID0geG1hbGxvYyAobGVuKTsKLSAgKnIrKyA9ICdcJyc7Ci0gIGZvciAocCA9IHM7IHAgJiYgKnA7ICkKLSAgICB7Ci0gICAgICBpZiAoKnAgPT0gJ1wnJykKLQl7Ci0JICAqcisrID0gJ1wnJzsKLQkgICpyKysgPSAnXFwnOwotCSAgKnIrKyA9ICdcJyc7Ci0JICAqcisrID0gJ1wnJzsKLQkgIHArKzsKLQl9Ci0gICAgICBlbHNlIGlmICh3aGl0ZXNwYWNlICgqcCkgfHwgKnAgPT0gJ1xuJykKLQl7Ci0JICAqcisrID0gJ1wnJzsKLQkgICpyKysgPSAqcCsrOwotCSAgKnIrKyA9ICdcJyc7Ci0JfQotICAgICAgZWxzZQotCSpyKysgPSAqcCsrOwotICAgIH0KLSAgKnIrKyA9ICdcJyc7Ci0gICpyID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNoYXIgKgotaGlzdF9lcnJvcihzLCBzdGFydCwgY3VycmVudCwgZXJydHlwZSkKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBpbnQgc3RhcnQsIGN1cnJlbnQsIGVycnR5cGU7Ci17Ci0gIGNoYXIgKnRlbXAsICplbXNnOwotICBpbnQgbGwsIGVsZW47Ci0KLSAgbGwgPSBjdXJyZW50IC0gc3RhcnQ7Ci0KLSAgc3dpdGNoIChlcnJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVWRU5UX05PVF9GT1VORDoKLSAgICAgIGVtc2cgPSAiZXZlbnQgbm90IGZvdW5kIjsKLSAgICAgIGVsZW4gPSAxNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkFEX1dPUkRfU1BFQzoKLSAgICAgIGVtc2cgPSAiYmFkIHdvcmQgc3BlY2lmaWVyIjsKLSAgICAgIGVsZW4gPSAxODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VCU1RfRkFJTEVEOgotICAgICAgZW1zZyA9ICJzdWJzdGl0dXRpb24gZmFpbGVkIjsKLSAgICAgIGVsZW4gPSAxOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkFEX01PRElGSUVSOgotICAgICAgZW1zZyA9ICJ1bnJlY29nbml6ZWQgaGlzdG9yeSBtb2RpZmllciI7Ci0gICAgICBlbGVuID0gMjk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5PX1BSRVZfU1VCU1Q6Ci0gICAgICBlbXNnID0gIm5vIHByZXZpb3VzIHN1YnN0aXR1dGlvbiI7Ci0gICAgICBlbGVuID0gMjQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZW1zZyA9ICJ1bmtub3duIGV4cGFuc2lvbiBlcnJvciI7Ci0gICAgICBlbGVuID0gMjM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgdGVtcCA9IHhtYWxsb2MgKGxsICsgZWxlbiArIDMpOwotICBzdHJuY3B5ICh0ZW1wLCBzICsgc3RhcnQsIGxsKTsKLSAgdGVtcFtsbF0gPSAnOic7Ci0gIHRlbXBbbGwgKyAxXSA9ICcgJzsKLSAgc3RyY3B5ICh0ZW1wICsgbGwgKyAyLCBlbXNnKTsKLSAgcmV0dXJuICh0ZW1wKTsKLX0KLQotLyogR2V0IGEgaGlzdG9yeSBzdWJzdGl0dXRpb24gc3RyaW5nIGZyb20gU1RSIHN0YXJ0aW5nIGF0ICpJUFRSCi0gICBhbmQgcmV0dXJuIGl0LiAgVGhlIGxlbmd0aCBpcyByZXR1cm5lZCBpbiBMRU5QVFIuCi0KLSAgIEEgYmFja3NsYXNoIGNhbiBxdW90ZSB0aGUgZGVsaW1pdGVyLiAgSWYgdGhlIHN0cmluZyBpcyB0aGUKLSAgIGVtcHR5IHN0cmluZywgdGhlIHByZXZpb3VzIHBhdHRlcm4gaXMgdXNlZC4gIElmIHRoZXJlIGlzCi0gICBubyBwcmV2aW91cyBwYXR0ZXJuIGZvciB0aGUgbGhzLCB0aGUgbGFzdCBoaXN0b3J5IHNlYXJjaAotICAgc3RyaW5nIGlzIHVzZWQuCi0KLSAgIElmIElTX1JIUyBpcyAxLCB3ZSBpZ25vcmUgZW1wdHkgc3RyaW5ncyBhbmQgc2V0IHRoZSBwYXR0ZXJuCi0gICB0byAiIiBhbnl3YXkuICBzdWJzdF9saHMgaXMgbm90IGNoYW5nZWQgaWYgdGhlIGxocyBpcyBlbXB0eTsKLSAgIHN1YnN0X3JocyBpcyBhbGxvd2VkIHRvIGJlIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nLiAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3Vic3RfcGF0dGVybiAoc3RyLCBpcHRyLCBkZWxpbWl0ZXIsIGlzX3JocywgbGVucHRyKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGludCAqaXB0ciwgZGVsaW1pdGVyLCBpc19yaHMsICpsZW5wdHI7Ci17Ci0gIHJlZ2lzdGVyIGludCBzaSwgaSwgaiwgazsKLSAgY2hhciAqcyA9IChjaGFyICopIE5VTEw7Ci0KLSAgaSA9ICppcHRyOwotCi0gIGZvciAoc2kgPSBpOyBzdHJbc2ldICYmIHN0cltzaV0gIT0gZGVsaW1pdGVyOyBzaSsrKQotICAgIGlmIChzdHJbc2ldID09ICdcXCcgJiYgc3RyW3NpICsgMV0gPT0gZGVsaW1pdGVyKQotICAgICAgc2krKzsKLQotICBpZiAoc2kgPiBpIHx8IGlzX3JocykKLSAgICB7Ci0gICAgICBzID0geG1hbGxvYyAoc2kgLSBpICsgMSk7Ci0gICAgICBmb3IgKGogPSAwLCBrID0gaTsgayA8IHNpOyBqKyssIGsrKykKLQl7Ci0JICAvKiBSZW1vdmUgYSBiYWNrc2xhc2ggcXVvdGluZyB0aGUgc2VhcmNoIHN0cmluZyBkZWxpbWl0ZXIuICovCi0JICBpZiAoc3RyW2tdID09ICdcXCcgJiYgc3RyW2sgKyAxXSA9PSBkZWxpbWl0ZXIpCi0JICAgIGsrKzsKLQkgIHNbal0gPSBzdHJba107Ci0JfQotICAgICAgc1tqXSA9ICdcMCc7Ci0gICAgICBpZiAobGVucHRyKQotCSpsZW5wdHIgPSBqOwotICAgIH0KLQotICBpID0gc2k7Ci0gIGlmIChzdHJbaV0pCi0gICAgaSsrOwotICAqaXB0ciA9IGk7Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wb3N0cHJvY19zdWJzdF9yaHMgKCkKLXsKLSAgY2hhciAqbmV3OwotICBpbnQgaSwgaiwgbmV3X3NpemU7Ci0KLSAgbmV3ID0geG1hbGxvYyAobmV3X3NpemUgPSBzdWJzdF9yaHNfbGVuICsgc3Vic3RfbGhzX2xlbik7Ci0gIGZvciAoaSA9IGogPSAwOyBpIDwgc3Vic3RfcmhzX2xlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdWJzdF9yaHNbaV0gPT0gJyYnKQotCXsKLQkgIGlmIChqICsgc3Vic3RfbGhzX2xlbiA+PSBuZXdfc2l6ZSkKLQkgICAgbmV3ID0geHJlYWxsb2MgKG5ldywgKG5ld19zaXplID0gbmV3X3NpemUgKiAyICsgc3Vic3RfbGhzX2xlbikpOwotCSAgc3RyY3B5IChuZXcgKyBqLCBzdWJzdF9saHMpOwotCSAgaiArPSBzdWJzdF9saHNfbGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBhIHNpbmdsZSBiYWNrc2xhc2ggcHJvdGVjdHMgdGhlIGAmJyBmcm9tIGxocyBpbnRlcnBvbGF0aW9uICovCi0JICBpZiAoc3Vic3RfcmhzW2ldID09ICdcXCcgJiYgc3Vic3RfcmhzW2kgKyAxXSA9PSAnJicpCi0JICAgIGkrKzsKLQkgIGlmIChqID49IG5ld19zaXplKQotCSAgICBuZXcgPSB4cmVhbGxvYyAobmV3LCBuZXdfc2l6ZSAqPSAyKTsKLQkgIG5ld1tqKytdID0gc3Vic3RfcmhzW2ldOwotCX0KLSAgICB9Ci0gIG5ld1tqXSA9ICdcMCc7Ci0gIGZyZWUgKHN1YnN0X3Jocyk7Ci0gIHN1YnN0X3JocyA9IG5ldzsKLSAgc3Vic3RfcmhzX2xlbiA9IGo7Ci19Ci0KLS8qIEV4cGFuZCB0aGUgYnVsayBvZiBhIGhpc3Rvcnkgc3BlY2lmaWVyIHN0YXJ0aW5nIGF0IFNUUklOR1tTVEFSVF0uCi0gICBSZXR1cm5zIDAgaWYgZXZlcnl0aGluZyBpcyBPSywgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuZCAxCi0gICBpZiB0aGUgYHAnIG1vZGlmaWVyIHdhcyBzdXBwbGllZCBhbmQgdGhlIGNhbGxlciBzaG91bGQganVzdCBwcmludAotICAgdGhlIHJldHVybmVkIHN0cmluZy4gIFJldHVybnMgdGhlIG5ldyBpbmRleCBpbnRvIHN0cmluZyBpbgotICAgKkVORF9JTkRFWF9QVFIsIGFuZCB0aGUgZXhwYW5kZWQgc3BlY2lmaWVyIGluICpSRVRfU1RSSU5HLiAqLwotc3RhdGljIGludAotaGlzdG9yeV9leHBhbmRfaW50ZXJuYWwgKHN0cmluZywgc3RhcnQsIGVuZF9pbmRleF9wdHIsIHJldF9zdHJpbmcsIGN1cnJlbnRfbGluZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgc3RhcnQsICplbmRfaW5kZXhfcHRyOwotICAgICBjaGFyICoqcmV0X3N0cmluZzsKLSAgICAgY2hhciAqY3VycmVudF9saW5lOwkvKiBmb3IgISMgKi8KLXsKLSAgaW50IGksIG4sIHN0YXJ0aW5nX2luZGV4OwotICBpbnQgc3Vic3RpdHV0ZV9nbG9iYWxseSwgd2FudF9xdW90ZXMsIHByaW50X29ubHk7Ci0gIGNoYXIgKmV2ZW50LCAqdGVtcCwgKnJlc3VsdCwgKnRzdHIsICp0LCBjLCAqd29yZF9zcGVjOwotICBpbnQgcmVzdWx0X2xlbjsKLQotICByZXN1bHQgPSB4bWFsbG9jIChyZXN1bHRfbGVuID0gMTI4KTsKLQotICBpID0gc3RhcnQ7Ci0KLSAgLyogSWYgaXQgaXMgZm9sbG93ZWQgYnkgc29tZXRoaW5nIHRoYXQgc3RhcnRzIGEgd29yZCBzcGVjaWZpZXIsCi0gICAgIHRoZW4gISEgaXMgaW1wbGllZCBhcyB0aGUgZXZlbnQgc3BlY2lmaWVyLiAqLwotCi0gIGlmIChtZW1iZXIgKHN0cmluZ1tpICsgMV0sICI6JColXiIpKQotICAgIHsKLSAgICAgIGNoYXIgZmFrZV9zWzNdOwotICAgICAgaW50IGZha2VfaSA9IDA7Ci0gICAgICBpKys7Ci0gICAgICBmYWtlX3NbMF0gPSBmYWtlX3NbMV0gPSBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyOwotICAgICAgZmFrZV9zWzJdID0gJ1wwJzsKLSAgICAgIGV2ZW50ID0gZ2V0X2hpc3RvcnlfZXZlbnQgKGZha2VfcywgJmZha2VfaSwgMCk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJpbmdbaSArIDFdID09ICcjJykKLSAgICB7Ci0gICAgICBpICs9IDI7Ci0gICAgICBldmVudCA9IGN1cnJlbnRfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgcXVvdGVkX3NlYXJjaF9kZWxpbWl0ZXIgPSAwOwotCi0gICAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGlzIGAhJyBpcyBhIGRvdWJsZSBvciBzaW5nbGUKLQkgcXVvdGUsIHRoZW4gdGhpcyBleHBhbnNpb24gdGFrZXMgcGxhY2UgaW5zaWRlIG9mIHRoZQotCSBxdW90ZWQgc3RyaW5nLiAgSWYgd2UgaGF2ZSB0byBzZWFyY2ggZm9yIHNvbWUgdGV4dCAoIiFmb28iKSwKLQkgYWxsb3cgdGhlIGRlbGltaXRlciB0byBlbmQgdGhlIHNlYXJjaCBzdHJpbmcuICovCi0gICAgICBpZiAoaSAmJiAoc3RyaW5nW2kgLSAxXSA9PSAnXCcnIHx8IHN0cmluZ1tpIC0gMV0gPT0gJyInKSkKLQlxdW90ZWRfc2VhcmNoX2RlbGltaXRlciA9IHN0cmluZ1tpIC0gMV07Ci0gICAgICBldmVudCA9IGdldF9oaXN0b3J5X2V2ZW50IChzdHJpbmcsICZpLCBxdW90ZWRfc2VhcmNoX2RlbGltaXRlcik7Ci0gICAgfQotCSAgCi0gIGlmIChldmVudCA9PSAwKQotICAgIHsKLSAgICAgICpyZXRfc3RyaW5nID0gaGlzdF9lcnJvciAoc3RyaW5nLCBzdGFydCwgaSwgRVZFTlRfTk9UX0ZPVU5EKTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgLyogSWYgYSB3b3JkIHNwZWNpZmllciBpcyBmb3VuZCwgdGhlbiBkbyB3aGF0IHRoYXQgcmVxdWlyZXMuICovCi0gIHN0YXJ0aW5nX2luZGV4ID0gaTsKLSAgd29yZF9zcGVjID0gZ2V0X2hpc3Rvcnlfd29yZF9zcGVjaWZpZXIgKHN0cmluZywgZXZlbnQsICZpKTsKLQotICAvKiBUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGEgYG1hbGZvcm1lZCB3b3JkIHNwZWNpZmllcicuICBIb3dldmVyLAotICAgICBpdCBpcyBwb3NzaWJsZSBmb3IgYSBzcGVjaWZpZXIgdGhhdCBoYXMgbm8gbWF0Y2guICBJbiB0aGF0IGNhc2UsCi0gICAgIHdlIGNvbXBsYWluLiAqLwotICBpZiAod29yZF9zcGVjID09IChjaGFyICopJmVycm9yX3BvaW50ZXIpCi0gICAgewotICAgICAgKnJldF9zdHJpbmcgPSBoaXN0X2Vycm9yIChzdHJpbmcsIHN0YXJ0aW5nX2luZGV4LCBpLCBCQURfV09SRF9TUEVDKTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgLyogSWYgbm8gd29yZCBzcGVjaWZpZXIsIHRoYW4gdGhlIHRoaW5nIG9mIGludGVyZXN0IHdhcyB0aGUgZXZlbnQuICovCi0gIHRlbXAgPSB3b3JkX3NwZWMgPyBzYXZlc3RyaW5nICh3b3JkX3NwZWMpIDogc2F2ZXN0cmluZyAoZXZlbnQpOwotICBGUkVFICh3b3JkX3NwZWMpOwotCi0gIC8qIFBlcmhhcHMgdGhlcmUgYXJlIG90aGVyIG1vZGlmaWVycyBpbnZvbHZlZC4gIERvIHdoYXQgdGhleSBzYXkuICovCi0gIHdhbnRfcXVvdGVzID0gc3Vic3RpdHV0ZV9nbG9iYWxseSA9IHByaW50X29ubHkgPSAwOwotICBzdGFydGluZ19pbmRleCA9IGk7Ci0KLSAgd2hpbGUgKHN0cmluZ1tpXSA9PSAnOicpCi0gICAgewotICAgICAgYyA9IHN0cmluZ1tpICsgMV07Ci0KLSAgICAgIGlmIChjID09ICdnJykKLQl7Ci0JICBzdWJzdGl0dXRlX2dsb2JhbGx5ID0gMTsKLQkgIGkrKzsKLQkgIGMgPSBzdHJpbmdbaSArIDFdOwotCX0KLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgKnJldF9zdHJpbmcgPSBoaXN0X2Vycm9yIChzdHJpbmcsIGkrMSwgaSsyLCBCQURfTU9ESUZJRVIpOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIGZyZWUgKHRlbXApOwotCSAgcmV0dXJuIC0xOwotCi0JY2FzZSAncSc6Ci0JICB3YW50X3F1b3RlcyA9ICdxJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JICB3YW50X3F1b3RlcyA9ICd4JzsKLQkgIGJyZWFrOwotCi0JICAvKiA6cCBtZWFucyBtYWtlIHRoaXMgdGhlIGxhc3QgZXhlY3V0ZWQgbGluZS4gIFNvIHdlCi0JICAgICByZXR1cm4gYW4gZXJyb3Igc3RhdGUgYWZ0ZXIgYWRkaW5nIHRoaXMgbGluZSB0byB0aGUKLQkgICAgIGhpc3RvcnkuICovCi0JY2FzZSAncCc6Ci0JICBwcmludF9vbmx5Kys7Ci0JICBicmVhazsKLQotCSAgLyogOnQgZGlzY2FyZHMgYWxsIGJ1dCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRobmFtZS4gKi8KLQljYXNlICd0JzoKLQkgIHRzdHIgPSBzdHJyY2hyICh0ZW1wLCAnLycpOwotCSAgaWYgKHRzdHIpCi0JICAgIHsKLQkgICAgICB0c3RyKys7Ci0JICAgICAgdCA9IHNhdmVzdHJpbmcgKHRzdHIpOwotCSAgICAgIGZyZWUgKHRlbXApOwotCSAgICAgIHRlbXAgPSB0OwotCSAgICB9Ci0JICBicmVhazsKLQotCSAgLyogOmggZGlzY2FyZHMgdGhlIGxhc3QgcGFydCBvZiBhIHBhdGhuYW1lLiAqLwotCWNhc2UgJ2gnOgotCSAgdHN0ciA9IHN0cnJjaHIgKHRlbXAsICcvJyk7Ci0JICBpZiAodHN0cikKLQkgICAgKnRzdHIgPSAnXDAnOwotCSAgYnJlYWs7Ci0KLQkgIC8qIDpyIGRpc2NhcmRzIHRoZSBzdWZmaXguICovCi0JY2FzZSAncic6Ci0JICB0c3RyID0gc3RycmNociAodGVtcCwgJy4nKTsKLQkgIGlmICh0c3RyKQotCSAgICAqdHN0ciA9ICdcMCc7Ci0JICBicmVhazsKLQotCSAgLyogOmUgZGlzY2FyZHMgZXZlcnl0aGluZyBidXQgdGhlIHN1ZmZpeC4gKi8KLQljYXNlICdlJzoKLQkgIHRzdHIgPSBzdHJyY2hyICh0ZW1wLCAnLicpOwotCSAgaWYgKHRzdHIpCi0JICAgIHsKLQkgICAgICB0ID0gc2F2ZXN0cmluZyAodHN0cik7Ci0JICAgICAgZnJlZSAodGVtcCk7Ci0JICAgICAgdGVtcCA9IHQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogOnMvdGhpcy90aGF0IHN1YnN0aXR1dGVzIGB0aGF0JyBmb3IgdGhlIGZpcnN0Ci0JICAgb2NjdXJyZW5jZSBvZiBgdGhpcycuICA6Z3MvdGhpcy90aGF0IHN1YnN0aXR1dGVzIGB0aGF0JwotCSAgIGZvciBlYWNoIG9jY3VycmVuY2Ugb2YgYHRoaXMnLiAgOiYgcmVwZWF0cyB0aGUgbGFzdAotCSAgIHN1YnN0aXR1dGlvbi4gIDpnJiByZXBlYXRzIHRoZSBsYXN0IHN1YnN0aXR1dGlvbgotCSAgIGdsb2JhbGx5LiAqLwotCi0JY2FzZSAnJic6Ci0JY2FzZSAncyc6Ci0JICB7Ci0JICAgIGNoYXIgKm5ld19ldmVudCwgKnQ7Ci0JICAgIGludCBkZWxpbWl0ZXIsIGZhaWxlZCwgc2ksIGxfdGVtcDsKLQotCSAgICBpZiAoYyA9PSAncycpCi0JICAgICAgewotCQlpZiAoaSArIDIgPCAoaW50KXN0cmxlbiAoc3RyaW5nKSkKLQkJICBkZWxpbWl0ZXIgPSBzdHJpbmdbaSArIDJdOwotCQllbHNlCi0JCSAgYnJlYWs7CS8qIG5vIHNlYXJjaCBkZWxpbWl0ZXIgKi8KLQotCQlpICs9IDM7Ci0KLQkJdCA9IGdldF9zdWJzdF9wYXR0ZXJuIChzdHJpbmcsICZpLCBkZWxpbWl0ZXIsIDAsICZzdWJzdF9saHNfbGVuKTsKLQkJLyogQW4gZW1wdHkgc3Vic3RpdHV0aW9uIGxocyB3aXRoIG5vIHByZXZpb3VzIHN1YnN0aXR1dGlvbgotCQkgICB1c2VzIHRoZSBsYXN0IHNlYXJjaCBzdHJpbmcgYXMgdGhlIGxocy4gKi8KLQkJaWYgKHQpCi0JCSAgewotCQkgICAgRlJFRSAoc3Vic3RfbGhzKTsKLQkJICAgIHN1YnN0X2xocyA9IHQ7Ci0JCSAgfQotCQllbHNlIGlmICghc3Vic3RfbGhzKQotCQkgIHsKLQkJICAgIGlmIChzZWFyY2hfc3RyaW5nICYmICpzZWFyY2hfc3RyaW5nKQotCQkgICAgICB7Ci0JCQlzdWJzdF9saHMgPSBzYXZlc3RyaW5nIChzZWFyY2hfc3RyaW5nKTsKLQkJCXN1YnN0X2xoc19sZW4gPSBzdHJsZW4gKHN1YnN0X2xocyk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJc3Vic3RfbGhzID0gKGNoYXIgKikgTlVMTDsKLQkJCXN1YnN0X2xoc19sZW4gPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCUZSRUUgKHN1YnN0X3Jocyk7Ci0JCXN1YnN0X3JocyA9IGdldF9zdWJzdF9wYXR0ZXJuIChzdHJpbmcsICZpLCBkZWxpbWl0ZXIsIDEsICZzdWJzdF9yaHNfbGVuKTsKLQotCQkvKiBJZiBgJicgYXBwZWFycyBpbiB0aGUgcmhzLCBpdCdzIHN1cHBvc2VkIHRvIGJlIHJlcGxhY2VkCi0JCSAgIHdpdGggdGhlIGxocy4gKi8KLQkJaWYgKG1lbWJlciAoJyYnLCBzdWJzdF9yaHMpKQotCQkgIHBvc3Rwcm9jX3N1YnN0X3JocyAoKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBpICs9IDI7Ci0KLQkgICAgLyogSWYgdGhlcmUgaXMgbm8gbGhzLCB0aGUgc3Vic3RpdHV0aW9uIGNhbid0IHN1Y2NlZWQuICovCi0JICAgIGlmIChzdWJzdF9saHNfbGVuID09IDApCi0JICAgICAgewotCQkqcmV0X3N0cmluZyA9IGhpc3RfZXJyb3IgKHN0cmluZywgc3RhcnRpbmdfaW5kZXgsIGksIE5PX1BSRVZfU1VCU1QpOwotCQlmcmVlIChyZXN1bHQpOwotCQlmcmVlICh0ZW1wKTsKLQkJcmV0dXJuIC0xOwotCSAgICAgIH0KLQotCSAgICBsX3RlbXAgPSBzdHJsZW4gKHRlbXApOwotCSAgICAvKiBJZ25vcmUgaW1wb3NzaWJsZSBjYXNlcy4gKi8KLQkgICAgaWYgKHN1YnN0X2xoc19sZW4gPiBsX3RlbXApCi0JICAgICAgewotCQkqcmV0X3N0cmluZyA9IGhpc3RfZXJyb3IgKHN0cmluZywgc3RhcnRpbmdfaW5kZXgsIGksIFNVQlNUX0ZBSUxFRCk7Ci0JCWZyZWUgKHJlc3VsdCk7Ci0JCWZyZWUgKHRlbXApOwotCQlyZXR1cm4gKC0xKTsKLQkgICAgICB9Ci0KLQkgICAgLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBUSElTIGluIFRFTVAuICovCi0JICAgIHNpID0gMDsKLQkgICAgZm9yIChmYWlsZWQgPSAxOyAoc2kgKyBzdWJzdF9saHNfbGVuKSA8PSBsX3RlbXA7IHNpKyspCi0JICAgICAgaWYgKFNUUkVRTiAodGVtcCtzaSwgc3Vic3RfbGhzLCBzdWJzdF9saHNfbGVuKSkKLQkJewotCQkgIGludCBsZW4gPSBzdWJzdF9yaHNfbGVuIC0gc3Vic3RfbGhzX2xlbiArIGxfdGVtcDsKLQkJICBuZXdfZXZlbnQgPSB4bWFsbG9jICgxICsgbGVuKTsKLQkJICBzdHJuY3B5IChuZXdfZXZlbnQsIHRlbXAsIHNpKTsKLQkJICBzdHJuY3B5IChuZXdfZXZlbnQgKyBzaSwgc3Vic3RfcmhzLCBzdWJzdF9yaHNfbGVuKTsKLQkJICBzdHJuY3B5IChuZXdfZXZlbnQgKyBzaSArIHN1YnN0X3Joc19sZW4sCi0JCQkgICB0ZW1wICsgc2kgKyBzdWJzdF9saHNfbGVuLAotCQkJICAgbF90ZW1wIC0gKHNpICsgc3Vic3RfbGhzX2xlbikpOwotCQkgIG5ld19ldmVudFtsZW5dID0gJ1wwJzsKLQkJICBmcmVlICh0ZW1wKTsKLQkJICB0ZW1wID0gbmV3X2V2ZW50OwotCi0JCSAgZmFpbGVkID0gMDsKLQotCQkgIGlmIChzdWJzdGl0dXRlX2dsb2JhbGx5KQotCQkgICAgewotCQkgICAgICBzaSArPSBzdWJzdF9yaHNfbGVuOwotCQkgICAgICBsX3RlbXAgPSBzdHJsZW4gKHRlbXApOwotCQkgICAgICBzdWJzdGl0dXRlX2dsb2JhbGx5Kys7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgaWYgKHN1YnN0aXR1dGVfZ2xvYmFsbHkgPiAxKQotCSAgICAgIHsKLQkJc3Vic3RpdHV0ZV9nbG9iYWxseSA9IDA7Ci0JCWNvbnRpbnVlOwkvKiBkb24ndCB3YW50IHRvIGluY3JlbWVudCBpICovCi0JICAgICAgfQotCi0JICAgIGlmIChmYWlsZWQgPT0gMCkKLQkgICAgICBjb250aW51ZTsJCS8qIGRvbid0IHdhbnQgdG8gaW5jcmVtZW50IGkgKi8KLQotCSAgICAqcmV0X3N0cmluZyA9IGhpc3RfZXJyb3IgKHN0cmluZywgc3RhcnRpbmdfaW5kZXgsIGksIFNVQlNUX0ZBSUxFRCk7Ci0JICAgIGZyZWUgKHJlc3VsdCk7Ci0JICAgIGZyZWUgKHRlbXApOwotCSAgICByZXR1cm4gKC0xKTsKLQkgIH0KLQl9Ci0gICAgICBpICs9IDI7Ci0gICAgfQotICAvKiBEb25lIHdpdGggbW9kZmllcnMuICovCi0gIC8qIEJlbGlldmUgaXQgb3Igbm90LCB3ZSBoYXZlIHRvIGJhY2sgdGhlIHBvaW50ZXIgdXAgYnkgb25lLiAqLwotICAtLWk7Ci0KLSAgaWYgKHdhbnRfcXVvdGVzKQotICAgIHsKLSAgICAgIGNoYXIgKng7Ci0KLSAgICAgIGlmICh3YW50X3F1b3RlcyA9PSAncScpCi0JeCA9IHNpbmdsZV9xdW90ZSAodGVtcCk7Ci0gICAgICBlbHNlIGlmICh3YW50X3F1b3RlcyA9PSAneCcpCi0JeCA9IHF1b3RlX2JyZWFrcyAodGVtcCk7Ci0gICAgICBlbHNlCi0JeCA9IHNhdmVzdHJpbmcgKHRlbXApOwotCi0gICAgICBmcmVlICh0ZW1wKTsKLSAgICAgIHRlbXAgPSB4OwotICAgIH0KLQotICBuID0gc3RybGVuICh0ZW1wKTsKLSAgaWYgKG4gPj0gcmVzdWx0X2xlbikKLSAgICByZXN1bHQgPSB4cmVhbGxvYyAocmVzdWx0LCBuICsgMik7Ci0gIHN0cmNweSAocmVzdWx0LCB0ZW1wKTsKLSAgZnJlZSAodGVtcCk7Ci0KLSAgKmVuZF9pbmRleF9wdHIgPSBpOwotICAqcmV0X3N0cmluZyA9IHJlc3VsdDsKLSAgcmV0dXJuIChwcmludF9vbmx5KTsKLX0KLQotLyogRXhwYW5kIHRoZSBzdHJpbmcgU1RSSU5HLCBwbGFjaW5nIHRoZSByZXN1bHQgaW50byBPVVRQVVQsIGEgcG9pbnRlcgotICAgdG8gYSBzdHJpbmcuICBSZXR1cm5zOgotCi0gIC0xKSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gZXhwYW5zaW9uLgotICAgMCkgSWYgbm8gZXhwYW5zaW9ucyB0b29rIHBsYWNlIChvciwgaWYgdGhlIG9ubHkgY2hhbmdlIGluCi0gICAgICB0aGUgdGV4dCB3YXMgdGhlIGRlLXNsYXNoaWZ5aW5nIG9mIHRoZSBoaXN0b3J5IGV4cGFuc2lvbgotICAgICAgY2hhcmFjdGVyKQotICAgMSkgSWYgZXhwYW5zaW9ucyBkaWQgdGFrZSBwbGFjZQotICAgMikgSWYgdGhlIGBwJyBtb2RpZmllciB3YXMgZ2l2ZW4gYW5kIHRoZSBjYWxsZXIgc2hvdWxkIHByaW50IHRoZSByZXN1bHQKLQotICBJZiBhbiBlcnJvciBvY3VycmVkIGluIGV4cGFuc2lvbiwgdGhlbiBPVVRQVVQgY29udGFpbnMgYSBkZXNjcmlwdGl2ZQotICBlcnJvciBtZXNzYWdlLiAqLwotCi0jZGVmaW5lIEFERF9TVFJJTkcocykgXAotCWRvIFwKLQkgIHsgXAotCSAgICBpbnQgc2wgPSBzdHJsZW4gKHMpOyBcCi0JICAgIGogKz0gc2w7IFwKLQkgICAgaWYgKGogPj0gcmVzdWx0X2xlbikgXAotCSAgICAgIHsgXAotCQl3aGlsZSAoaiA+PSByZXN1bHRfbGVuKSBcCi0JCSAgcmVzdWx0X2xlbiArPSAxMjg7IFwKLQkJcmVzdWx0ID0geHJlYWxsb2MgKHJlc3VsdCwgcmVzdWx0X2xlbik7IFwKLQkgICAgICB9IFwKLQkgICAgc3RyY3B5IChyZXN1bHQgKyBqIC0gc2wsIHMpOyBcCi0JICB9IFwKLQl3aGlsZSAoMCkKLQotI2RlZmluZSBBRERfQ0hBUihjKSBcCi0JZG8gXAotCSAgeyBcCi0JICAgIGlmIChqID49IHJlc3VsdF9sZW4gLSAxKSBcCi0JICAgICAgcmVzdWx0ID0geHJlYWxsb2MgKHJlc3VsdCwgcmVzdWx0X2xlbiArPSA2NCk7IFwKLQkgICAgcmVzdWx0W2orK10gPSBjOyBcCi0JICAgIHJlc3VsdFtqXSA9ICdcMCc7IFwKLQkgIH0gXAotCXdoaWxlICgwKQotCi1pbnQKLWhpc3RvcnlfZXhwYW5kIChoc3RyaW5nLCBvdXRwdXQpCi0gICAgIGNoYXIgKmhzdHJpbmc7Ci0gICAgIGNoYXIgKipvdXRwdXQ7Ci17Ci0gIHJlZ2lzdGVyIGludCBqOwotICBpbnQgaSwgciwgbCwgcGFzc2MsIGNjLCBtb2RpZmllZCwgZWluZGV4LCBvbmx5X3ByaW50aW5nOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgLyogVGhlIG91dHB1dCBzdHJpbmcsIGFuZCBpdHMgbGVuZ3RoLiAqLwotICBpbnQgcmVzdWx0X2xlbjsKLSAgY2hhciAqcmVzdWx0OwotCi0gIC8qIFVzZWQgd2hlbiBhZGRpbmcgdGhlIHN0cmluZy4gKi8KLSAgY2hhciAqdGVtcDsKLQotICAvKiBTZXR0aW5nIHRoZSBoaXN0b3J5IGV4cGFuc2lvbiBjaGFyYWN0ZXIgdG8gMCBpbmhpYml0cyBhbGwKLSAgICAgaGlzdG9yeSBleHBhbnNpb24uICovCi0gIGlmIChoaXN0b3J5X2V4cGFuc2lvbl9jaGFyID09IDApCi0gICAgewotICAgICAgKm91dHB1dCA9IHNhdmVzdHJpbmcgKGhzdHJpbmcpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgCi0gIC8qIFByZXBhcmUgdGhlIGJ1ZmZlciBmb3IgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuICovCi0gIHJlc3VsdCA9IHhtYWxsb2MgKHJlc3VsdF9sZW4gPSAyNTYpOwotICByZXN1bHRbMF0gPSAnXDAnOwotCi0gIG9ubHlfcHJpbnRpbmcgPSBtb2RpZmllZCA9IDA7Ci0gIGwgPSBzdHJsZW4gKGhzdHJpbmcpOwotCi0gIC8qIEdyb3ZlbCB0aGUgc3RyaW5nLiAgT25seSBiYWNrc2xhc2ggYW5kIHNpbmdsZSBxdW90ZXMgY2FuIHF1b3RlIHRoZQotICAgICBoaXN0b3J5IGVzY2FwZSBjaGFyYWN0ZXIuICBXZSBhbHNvIGhhbmRsZSBhcmcgc3BlY2lmaWVycy4gKi8KLQotICAvKiBCZWZvcmUgd2UgZ3JvdmVsIGZvcmV2ZXIsIHNlZSBpZiB0aGUgaGlzdG9yeV9leHBhbnNpb25fY2hhciBhcHBlYXJzCi0gICAgIGFueXdoZXJlIHdpdGhpbiB0aGUgdGV4dC4gKi8KLQotICAvKiBUaGUgcXVpY2sgc3Vic3RpdHV0aW9uIGNoYXJhY3RlciBpcyBhIGhpc3RvcnkgZXhwYW5zaW9uIGFsbCByaWdodC4gIFRoYXQKLSAgICAgaXMgdG8gc2F5LCAiXnRoaXNedGhhdF4iIGlzIGVxdWl2YWxlbnQgdG8gIiEhOnNedGhpc150aGF0XiIsIGFuZCBpbiBmYWN0LAotICAgICB0aGF0IGlzIHRoZSBzdWJzdGl0dXRpb24gdGhhdCB3ZSBkby4gKi8KLSAgaWYgKGhzdHJpbmdbMF0gPT0gaGlzdG9yeV9zdWJzdF9jaGFyKQotICAgIHsKLSAgICAgIHN0cmluZyA9IHhtYWxsb2MgKGwgKyA1KTsKLQotICAgICAgc3RyaW5nWzBdID0gc3RyaW5nWzFdID0gaGlzdG9yeV9leHBhbnNpb25fY2hhcjsKLSAgICAgIHN0cmluZ1syXSA9ICc6JzsKLSAgICAgIHN0cmluZ1szXSA9ICdzJzsKLSAgICAgIHN0cmNweSAoc3RyaW5nICsgNCwgaHN0cmluZyk7Ci0gICAgICBsICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nID0gaHN0cmluZzsKLSAgICAgIC8qIElmIG5vdCBxdWljayBzdWJzdGl0dXRpb24sIHN0aWxsIG1heWJlIGhhdmUgdG8gZG8gZXhwYW5zaW9uLiAqLwotCi0gICAgICAvKiBgIScgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGhpc3Rvcnlfbm9fZXhwYW5kX2NoYXJzCi0JIGlzIE5PVCBhbiBleHBhbnNpb24uICovCi0gICAgICBmb3IgKGkgPSAwOyBzdHJpbmdbaV07IGkrKykKLQl7Ci0JICBjYyA9IHN0cmluZ1tpICsgMV07Ci0JICAvKiBUaGUgaGlzdG9yeV9jb21tZW50X2NoYXIsIGlmIHNldCwgYXBwZWFyaW5nIHRoYXQgdGhlIGJlZ2lubmluZwotCSAgICAgb2YgYSB3b3JkIHNpZ25pZmllcyB0aGF0IHRoZSByZXN0IG9mIHRoZSBsaW5lIHNob3VsZCBub3QgaGF2ZQotCSAgICAgaGlzdG9yeSBleHBhbnNpb24gcGVyZm9ybWVkIG9uIGl0LgotCSAgICAgU2tpcCB0aGUgcmVzdCBvZiB0aGUgbGluZSBhbmQgYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAqLwotCSAgaWYgKGhpc3RvcnlfY29tbWVudF9jaGFyICYmIHN0cmluZ1tpXSA9PSBoaXN0b3J5X2NvbW1lbnRfY2hhciAmJgotCSAgICAgIChpID09IDAgfHwgbWVtYmVyIChzdHJpbmdbaSAtIDFdLCBISVNUT1JZX1dPUkRfREVMSU1JVEVSUykpKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHN0cmluZ1tpXSkKLQkJaSsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJpbmdbaV0gPT0gaGlzdG9yeV9leHBhbnNpb25fY2hhcikKLQkgICAgewotCSAgICAgIGlmICghY2MgfHwgbWVtYmVyIChjYywgaGlzdG9yeV9ub19leHBhbmRfY2hhcnMpKQotCQljb250aW51ZTsKLQkgICAgICAvKiBJZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBoYXMgc2V0Ci0JCSBoaXN0b3J5X2luaGliaXRfZXhwYW5zaW9uX2Z1bmN0aW9uIHRvIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MKLQkJIGZvciBzcGVjaWFsIGNhc2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBoaXN0b3J5IGV4cGFuZGVkLAotCQkgY2FsbCB0aGUgZnVuY3Rpb24gYW5kIHNraXAgdGhlIGV4cGFuc2lvbiBpZiBpdCByZXR1cm5zIGEKLQkJIG5vbi16ZXJvIHZhbHVlLiAqLwotCSAgICAgIGVsc2UgaWYgKGhpc3RvcnlfaW5oaWJpdF9leHBhbnNpb25fZnVuY3Rpb24gJiYKLQkJCSgqaGlzdG9yeV9pbmhpYml0X2V4cGFuc2lvbl9mdW5jdGlvbikgKHN0cmluZywgaSkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIC8qIFhYWCAtIGF0IHNvbWUgcG9pbnQsIG1pZ2h0IHdhbnQgdG8gZXh0ZW5kIHRoaXMgdG8gaGFuZGxlCi0JCSAgIGRvdWJsZSBxdW90ZXMgYXMgd2VsbC4gKi8KLQkgIGVsc2UgaWYgKGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uICYmIHN0cmluZ1tpXSA9PSAnXCcnKQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhpcyBpcyBiYXNoLCBzaW5nbGUgcXVvdGVzIGluaGliaXQgaGlzdG9yeSBleHBhbnNpb24uICovCi0JICAgICAgaSsrOwotCSAgICAgIGhpc3Rfc3RyaW5nX2V4dHJhY3Rfc2luZ2xlX3F1b3RlZCAoc3RyaW5nLCAmaSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uICYmIHN0cmluZ1tpXSA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhpcyBpcyBiYXNoLCBhbGxvdyBiYWNrc2xhc2hlcyB0byBxdW90ZSBzaW5nbGUKLQkJIHF1b3RlcyBhbmQgdGhlIGhpc3RvcnkgZXhwYW5zaW9uIGNoYXJhY3Rlci4gKi8KLQkgICAgICBpZiAoY2MgPT0gJ1wnJyB8fCBjYyA9PSBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyKQotCQlpKys7Ci0JICAgIH0KLQl9Ci0JICAKLSAgICAgIGlmIChzdHJpbmdbaV0gIT0gaGlzdG9yeV9leHBhbnNpb25fY2hhcikKLQl7Ci0JICBmcmVlIChyZXN1bHQpOwotCSAgKm91dHB1dCA9IHNhdmVzdHJpbmcgKHN0cmluZyk7Ci0JICByZXR1cm4gKDApOwotCX0KLSAgICB9Ci0KLSAgLyogRXh0cmFjdCBhbmQgcGVyZm9ybSB0aGUgc3Vic3RpdHV0aW9uLiAqLwotICBmb3IgKHBhc3NjID0gaSA9IGogPSAwOyBpIDwgbDsgaSsrKQotICAgIHsKLSAgICAgIGludCB0Y2hhciA9IHN0cmluZ1tpXTsKLQotICAgICAgaWYgKHBhc3NjKQotCXsKLQkgIHBhc3NjID0gMDsKLQkgIEFERF9DSEFSICh0Y2hhcik7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICh0Y2hhciA9PSBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyKQotCXRjaGFyID0gLTM7Ci0gICAgICBlbHNlIGlmICh0Y2hhciA9PSBoaXN0b3J5X2NvbW1lbnRfY2hhcikKLQl0Y2hhciA9IC0yOwotCi0gICAgICBzd2l0Y2ggKHRjaGFyKQotCXsKLQlkZWZhdWx0OgotCSAgQUREX0NIQVIgKHN0cmluZ1tpXSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1xcJzoKLQkgIHBhc3NjKys7Ci0JICBBRERfQ0hBUiAodGNoYXIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdcJyc6Ci0JICB7Ci0JICAgIC8qIElmIGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uIGlzIHNldCwgc2luZ2xlIHF1b3RlcwotCSAgICAgICBpbmhpYml0IGhpc3RvcnkgZXhwYW5zaW9uLiAqLwotCSAgICBpZiAoaGlzdG9yeV9xdW90ZXNfaW5oaWJpdF9leHBhbnNpb24pCi0JICAgICAgewotCQlpbnQgcXVvdGUsIHNsZW47Ci0KLQkJcXVvdGUgPSBpKys7Ci0JCWhpc3Rfc3RyaW5nX2V4dHJhY3Rfc2luZ2xlX3F1b3RlZCAoc3RyaW5nLCAmaSk7Ci0KLQkJc2xlbiA9IGkgLSBxdW90ZSArIDI7Ci0JCXRlbXAgPSB4bWFsbG9jIChzbGVuKTsKLQkJc3RybmNweSAodGVtcCwgc3RyaW5nICsgcXVvdGUsIHNsZW4pOwotCQl0ZW1wW3NsZW4gLSAxXSA9ICdcMCc7Ci0JCUFERF9TVFJJTkcgKHRlbXApOwotCQlmcmVlICh0ZW1wKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBBRERfQ0hBUiAoc3RyaW5nW2ldKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIC0yOgkJLyogaGlzdG9yeV9jb21tZW50X2NoYXIgKi8KLQkgIGlmIChpID09IDAgfHwgbWVtYmVyIChzdHJpbmdbaSAtIDFdLCBISVNUT1JZX1dPUkRfREVMSU1JVEVSUykpCi0JICAgIHsKLQkgICAgICB0ZW1wID0geG1hbGxvYyAobCAtIGkgKyAxKTsKLQkgICAgICBzdHJjcHkgKHRlbXAsIHN0cmluZyArIGkpOwotCSAgICAgIEFERF9TVFJJTkcgKHRlbXApOwotCSAgICAgIGZyZWUgKHRlbXApOwotCSAgICAgIGkgPSBsOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIEFERF9DSEFSIChzdHJpbmdbaV0pOwotCSAgYnJlYWs7Ci0KLQljYXNlIC0zOgkJLyogaGlzdG9yeV9leHBhbnNpb25fY2hhciAqLwotCSAgY2MgPSBzdHJpbmdbaSArIDFdOwotCi0JICAvKiBJZiB0aGUgaGlzdG9yeV9leHBhbnNpb25fY2hhciBpcyBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCi0JICAgICBjaGFyYWN0ZXJzIGluIGhpc3Rvcnlfbm9fZXhwYW5kX2NoYXJzLCB0aGVuIGl0IGlzIG5vdCBhCi0JICAgICBjYW5kaWRhdGUgZm9yIGV4cGFuc2lvbiBvZiBhbnkga2luZC4gKi8KLQkgIGlmIChtZW1iZXIgKGNjLCBoaXN0b3J5X25vX2V4cGFuZF9jaGFycykpCi0JICAgIHsKLQkgICAgICBBRERfQ0hBUiAoc3RyaW5nW2ldKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0jaWYgZGVmaW5lZCAoTk9fQkFOR19IQVNIX01PRElGSUVSUykKLQkgIC8qIFRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGlzIGxpc3RlZCBhcyBhIGB3b3JkIHNwZWNpZmllcicgaW4gY3NoCi0JICAgICBkb2N1bWVudGF0aW9uIHdoaWNoIG1lYW5zIGB0aGUgZXhwYW5kZWQgdGV4dCB0byB0aGlzIHBvaW50Jy4KLQkgICAgIFRoYXQgaXMgbm90IGEgd29yZCBzcGVjaWZpZXIsIGl0IGlzIGFuIGV2ZW50IHNwZWNpZmllci4gIElmIHdlCi0JICAgICBkb24ndCB3YW50IHRvIGFsbG93IG1vZGlmaWVycyB3aXRoIGAhIycsIGp1c3Qgc3RpY2sgdGhlIGN1cnJlbnQKLQkgICAgIG91dHB1dCBsaW5lIGluIGFnYWluLiAqLwotCSAgaWYgKGNjID09ICcjJykKLQkgICAgewotCSAgICAgIGlmIChyZXN1bHQpCi0JCXsKLQkJICB0ZW1wID0geG1hbGxvYyAoMSArIHN0cmxlbiAocmVzdWx0KSk7Ci0JCSAgc3RyY3B5ICh0ZW1wLCByZXN1bHQpOwotCQkgIEFERF9TVFJJTkcgKHRlbXApOwotCQkgIGZyZWUgKHRlbXApOwotCQl9Ci0JICAgICAgaSsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgciA9IGhpc3RvcnlfZXhwYW5kX2ludGVybmFsIChzdHJpbmcsIGksICZlaW5kZXgsICZ0ZW1wLCByZXN1bHQpOwotCSAgaWYgKHIgPCAwKQotCSAgICB7Ci0JICAgICAgKm91dHB1dCA9IHRlbXA7Ci0JICAgICAgZnJlZSAocmVzdWx0KTsKLQkgICAgICBpZiAoc3RyaW5nICE9IGhzdHJpbmcpCi0JCWZyZWUgKHN0cmluZyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodGVtcCkKLQkJewotCQkgIG1vZGlmaWVkKys7Ci0JCSAgaWYgKCp0ZW1wKQotCQkgICAgQUREX1NUUklORyAodGVtcCk7Ci0JCSAgZnJlZSAodGVtcCk7Ci0JCX0KLQkgICAgICBvbmx5X3ByaW50aW5nID0gciA9PSAxOwotCSAgICAgIGkgPSBlaW5kZXg7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgKm91dHB1dCA9IHJlc3VsdDsKLSAgaWYgKHN0cmluZyAhPSBoc3RyaW5nKQotICAgIGZyZWUgKHN0cmluZyk7Ci0KLSAgaWYgKG9ubHlfcHJpbnRpbmcpCi0gICAgewotICAgICAgYWRkX2hpc3RvcnkgKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gKDIpOwotICAgIH0KLQotICByZXR1cm4gKG1vZGlmaWVkICE9IDApOwotfQotCi0vKiBSZXR1cm4gYSBjb25zZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSB3b3JkIHNwZWNpZmllZCBpbiBTUEVDLCBhbmQgZm91bmQKLSAgIGluIEZST00uICBOVUxMIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIHNwZWMuICBUaGUgYWRkcmVzcyBvZgotICAgRVJST1JfUE9JTlRFUiBpcyByZXR1cm5lZCBpZiB0aGUgd29yZCBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kLgotICAgQ0FMTEVSX0lOREVYIGlzIHRoZSBvZmZzZXQgaW4gU1BFQyB0byBzdGFydCBsb29raW5nOyBpdCBpcyB1cGRhdGVkCi0gICB0byBwb2ludCB0byBqdXN0IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBwYXJzZWQuICovCi1zdGF0aWMgY2hhciAqCi1nZXRfaGlzdG9yeV93b3JkX3NwZWNpZmllciAoc3BlYywgZnJvbSwgY2FsbGVyX2luZGV4KQotICAgICBjaGFyICpzcGVjLCAqZnJvbTsKLSAgICAgaW50ICpjYWxsZXJfaW5kZXg7Ci17Ci0gIHJlZ2lzdGVyIGludCBpID0gKmNhbGxlcl9pbmRleDsKLSAgaW50IGZpcnN0LCBsYXN0OwotICBpbnQgZXhwZWN0aW5nX3dvcmRfc3BlYyA9IDA7Ci0gIGNoYXIgKnJlc3VsdDsKLQotICAvKiBUaGUgcmFuZ2Ugb2Ygd29yZHMgdG8gcmV0dXJuIGRvZXNuJ3QgZXhpc3QgeWV0LiAqLwotICBmaXJzdCA9IGxhc3QgPSAwOwotICByZXN1bHQgPSAoY2hhciAqKU5VTEw7Ci0KLSAgLyogSWYgd2UgZm91bmQgYSBjb2xvbiwgdGhlbiB0aGlzICptdXN0KiBiZSBhIHdvcmQgc3BlY2lmaWNhdGlvbi4gIElmCi0gICAgIGl0IGlzbid0LCB0aGVuIGl0IGlzIGFuIGVycm9yLiAqLwotICBpZiAoc3BlY1tpXSA9PSAnOicpCi0gICAgewotICAgICAgaSsrOwotICAgICAgZXhwZWN0aW5nX3dvcmRfc3BlYysrOwotICAgIH0KLQotICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlcyBmaXJzdC4gKi8KLQotICAvKiBgJScgaXMgdGhlIHdvcmQgbGFzdCBzZWFyY2hlZCBmb3IuICovCi0gIGlmIChzcGVjW2ldID09ICclJykKLSAgICB7Ci0gICAgICAqY2FsbGVyX2luZGV4ID0gaSArIDE7Ci0gICAgICByZXR1cm4gKHNlYXJjaF9tYXRjaCA/IHNhdmVzdHJpbmcgKHNlYXJjaF9tYXRjaCkgOiBzYXZlc3RyaW5nICgiIikpOwotICAgIH0KLQotICAvKiBgKicgbWF0Y2hlcyBhbGwgb2YgdGhlIGFyZ3VtZW50cywgYnV0IG5vdCB0aGUgY29tbWFuZC4gKi8KLSAgaWYgKHNwZWNbaV0gPT0gJyonKQotICAgIHsKLSAgICAgICpjYWxsZXJfaW5kZXggPSBpICsgMTsKLSAgICAgIHJlc3VsdCA9IGhpc3RvcnlfYXJnX2V4dHJhY3QgKDEsICckJywgZnJvbSk7Ci0gICAgICByZXR1cm4gKHJlc3VsdCA/IHJlc3VsdCA6IHNhdmVzdHJpbmcgKCIiKSk7Ci0gICAgfQotCi0gIC8qIGAkJyBpcyBsYXN0IGFyZy4gKi8KLSAgaWYgKHNwZWNbaV0gPT0gJyQnKQotICAgIHsKLSAgICAgICpjYWxsZXJfaW5kZXggPSBpICsgMTsKLSAgICAgIHJldHVybiAoaGlzdG9yeV9hcmdfZXh0cmFjdCAoJyQnLCAnJCcsIGZyb20pKTsKLSAgICB9Ci0KLSAgLyogVHJ5IHRvIGdldCBGSVJTVCBhbmQgTEFTVCBmaWd1cmVkIG91dC4gKi8KLQotICBpZiAoc3BlY1tpXSA9PSAnLScpCi0gICAgZmlyc3QgPSAwOwotICBlbHNlIGlmIChzcGVjW2ldID09ICdeJykKLSAgICBmaXJzdCA9IDE7Ci0gIGVsc2UgaWYgKF9ybF9kaWdpdF9wIChzcGVjW2ldKSAmJiBleHBlY3Rpbmdfd29yZF9zcGVjKQotICAgIHsKLSAgICAgIGZvciAoZmlyc3QgPSAwOyBfcmxfZGlnaXRfcCAoc3BlY1tpXSk7IGkrKykKLQlmaXJzdCA9IChmaXJzdCAqIDEwKSArIF9ybF9kaWdpdF92YWx1ZSAoc3BlY1tpXSk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwkvKiBubyB2YWxpZCBgZmlyc3QnIGZvciB3b3JkIHNwZWNpZmllciAqLwotCi0gIGlmIChzcGVjW2ldID09ICdeJyB8fCBzcGVjW2ldID09ICcqJykKLSAgICB7Ci0gICAgICBsYXN0ID0gKHNwZWNbaV0gPT0gJ14nKSA/IDEgOiAnJCc7CS8qIHgqIGFiYnJldmlhdGVzIHgtJCAqLwotICAgICAgaSsrOwotICAgIH0KLSAgZWxzZSBpZiAoc3BlY1tpXSAhPSAnLScpCi0gICAgbGFzdCA9IGZpcnN0OwotICBlbHNlCi0gICAgewotICAgICAgaSsrOwotCi0gICAgICBpZiAoX3JsX2RpZ2l0X3AgKHNwZWNbaV0pKQotCXsKLQkgIGZvciAobGFzdCA9IDA7IF9ybF9kaWdpdF9wIChzcGVjW2ldKTsgaSsrKQotCSAgICBsYXN0ID0gKGxhc3QgKiAxMCkgKyBfcmxfZGlnaXRfdmFsdWUgKHNwZWNbaV0pOwotCX0KLSAgICAgIGVsc2UgaWYgKHNwZWNbaV0gPT0gJyQnKQotCXsKLQkgIGkrKzsKLQkgIGxhc3QgPSAnJCc7Ci0JfQotICAgICAgZWxzZSBpZiAoIXNwZWNbaV0gfHwgc3BlY1tpXSA9PSAnOicpICAvKiBjb3VsZCBiZSBtb2RpZmllciBzZXBhcmF0b3IgKi8KLQlsYXN0ID0gLTE7CQkvKiB4LSBhYmJyZXZpYXRlcyB4LSQgb21pdHRpbmcgd29yZCBgJCcgKi8KLSAgICB9Ci0KLSAgKmNhbGxlcl9pbmRleCA9IGk7Ci0KLSAgaWYgKGxhc3QgPj0gZmlyc3QgfHwgbGFzdCA9PSAnJCcgfHwgbGFzdCA8IDApCi0gICAgcmVzdWx0ID0gaGlzdG9yeV9hcmdfZXh0cmFjdCAoZmlyc3QsIGxhc3QsIGZyb20pOwotCi0gIHJldHVybiAocmVzdWx0ID8gcmVzdWx0IDogKGNoYXIgKikmZXJyb3JfcG9pbnRlcik7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGFyZ3Mgc3BlY2lmaWVkLCBzdGFydGluZyBhdCBGSVJTVCwgYW5kIGVuZGluZyBhdCBMQVNULgotICAgVGhlIGFyZ3MgYXJlIHRha2VuIGZyb20gU1RSSU5HLiAgSWYgZWl0aGVyIEZJUlNUIG9yIExBU1QgaXMgPCAwLAotICAgdGhlbiBtYWtlIHRoYXQgYXJnIGNvdW50IGZyb20gdGhlIHJpZ2h0IChzdWJ0cmFjdCBmcm9tIHRoZSBudW1iZXIgb2YKLSAgIHRva2Vucywgc28gdGhhdCBGSVJTVCA9IC0xIG1lYW5zIHRoZSBuZXh0IHRvIGxhc3QgdG9rZW4gb24gdGhlIGxpbmUpLgotICAgSWYgTEFTVCBpcyBgJCcgdGhlIGxhc3QgYXJnIGZyb20gU1RSSU5HIGlzIHVzZWQuICovCi1jaGFyICoKLWhpc3RvcnlfYXJnX2V4dHJhY3QgKGZpcnN0LCBsYXN0LCBzdHJpbmcpCi0gICAgIGludCBmaXJzdCwgbGFzdDsKLSAgICAgY2hhciAqc3RyaW5nOwotewotICByZWdpc3RlciBpbnQgaSwgbGVuOwotICBjaGFyICpyZXN1bHQ7Ci0gIGludCBzaXplLCBvZmZzZXQ7Ci0gIGNoYXIgKipsaXN0OwotCi0gIC8qIFhYWCAtIHRoaW5rIGFib3V0IG1ha2luZyBoaXN0b3J5X3Rva2VuaXplIHJldHVybiBhIHN0cnVjdCBhcnJheSwKLSAgICAgZWFjaCBzdHJ1Y3QgaW4gYXJyYXkgYmVpbmcgYSBzdHJpbmcgYW5kIGEgbGVuZ3RoIHRvIGF2b2lkIHRoZQotICAgICBjYWxscyB0byBzdHJsZW4gYmVsb3cuICovCi0gIGlmICgobGlzdCA9IGhpc3RvcnlfdG9rZW5pemUgKHN0cmluZykpID09IE5VTEwpCi0gICAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotCi0gIGZvciAobGVuID0gMDsgbGlzdFtsZW5dOyBsZW4rKykKLSAgICA7Ci0KLSAgaWYgKGxhc3QgPCAwKQotICAgIGxhc3QgPSBsZW4gKyBsYXN0IC0gMTsKLQotICBpZiAoZmlyc3QgPCAwKQotICAgIGZpcnN0ID0gbGVuICsgZmlyc3QgLSAxOwotCi0gIGlmIChsYXN0ID09ICckJykKLSAgICBsYXN0ID0gbGVuIC0gMTsKLQotICBpZiAoZmlyc3QgPT0gJyQnKQotICAgIGZpcnN0ID0gbGVuIC0gMTsKLQotICBsYXN0Kys7Ci0KLSAgaWYgKGZpcnN0ID49IGxlbiB8fCBsYXN0ID4gbGVuIHx8IGZpcnN0IDwgMCB8fCBsYXN0IDwgMCB8fCBmaXJzdCA+IGxhc3QpCi0gICAgcmVzdWx0ID0gKChjaGFyICopTlVMTCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHNpemUgPSAwLCBpID0gZmlyc3Q7IGkgPCBsYXN0OyBpKyspCi0Jc2l6ZSArPSBzdHJsZW4gKGxpc3RbaV0pICsgMTsKLSAgICAgIHJlc3VsdCA9IHhtYWxsb2MgKHNpemUgKyAxKTsKLSAgICAgIHJlc3VsdFswXSA9ICdcMCc7Ci0KLSAgICAgIGZvciAoaSA9IGZpcnN0LCBvZmZzZXQgPSAwOyBpIDwgbGFzdDsgaSsrKQotCXsKLQkgIHN0cmNweSAocmVzdWx0ICsgb2Zmc2V0LCBsaXN0W2ldKTsKLQkgIG9mZnNldCArPSBzdHJsZW4gKGxpc3RbaV0pOwotCSAgaWYgKGkgKyAxIDwgbGFzdCkKLQkgICAgewotICAgICAgCSAgICAgIHJlc3VsdFtvZmZzZXQrK10gPSAnICc7Ci0JICAgICAgcmVzdWx0W29mZnNldF0gPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgZnJlZSAobGlzdFtpXSk7Ci0gIGZyZWUgKGxpc3QpOwotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2RlZmluZSBzbGFzaGlmeV9pbl9xdW90ZXMgIlxcYFwiJCIKLQotLyogUGFyc2UgU1RSSU5HIGludG8gdG9rZW5zIGFuZCByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncy4gIElmIFdJTkQgaXMKLSAgIG5vdCAtMSBhbmQgSU5EUCBpcyBub3QgbnVsbCwgd2UgYWxzbyB3YW50IHRoZSB3b3JkIHN1cnJvdW5kaW5nIGluZGV4Ci0gICBXSU5ELiAgVGhlIHBvc2l0aW9uIGluIHRoZSByZXR1cm5lZCBhcnJheSBvZiBzdHJpbmdzIGlzIHJldHVybmVkIGluCi0gICAqSU5EUC4gKi8KLXN0YXRpYyBjaGFyICoqCi1oaXN0b3J5X3Rva2VuaXplX2ludGVybmFsIChzdHJpbmcsIHdpbmQsIGluZHApCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHdpbmQsICppbmRwOwotewotICBjaGFyICoqcmVzdWx0OwotICByZWdpc3RlciBpbnQgaSwgc3RhcnQsIHJlc3VsdF9pbmRleCwgc2l6ZTsKLSAgaW50IGxlbiwgZGVsaW1pdGVyOwotCi0gIC8qIEdldCBhIHRva2VuLCBhbmQgc3R1ZmYgaXQgaW50byBSRVNVTFQuICBUaGUgdG9rZW5zIGFyZSBzcGxpdAotICAgICBleGFjdGx5IHdoZXJlIHRoZSBzaGVsbCB3b3VsZCBzcGxpdCB0aGVtLiAqLwotICBmb3IgKGkgPSByZXN1bHRfaW5kZXggPSBzaXplID0gMCwgcmVzdWx0ID0gKGNoYXIgKiopTlVMTDsgc3RyaW5nW2ldOyApCi0gICAgewotICAgICAgZGVsaW1pdGVyID0gMDsKLQotICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gICAgICBmb3IgKDsgc3RyaW5nW2ldICYmIHdoaXRlc3BhY2UgKHN0cmluZ1tpXSk7IGkrKykKLQk7Ci0gICAgICBpZiAoc3RyaW5nW2ldID09IDAgfHwgc3RyaW5nW2ldID09IGhpc3RvcnlfY29tbWVudF9jaGFyKQotCXJldHVybiAocmVzdWx0KTsKLQotICAgICAgc3RhcnQgPSBpOwotICAgICAgCi0gICAgICBpZiAobWVtYmVyIChzdHJpbmdbaV0sICIoKVxuIikpCi0JewotCSAgaSsrOwotCSAgZ290byBnb3RfdG9rZW47Ci0JfQotCi0gICAgICBpZiAobWVtYmVyIChzdHJpbmdbaV0sICI8PjsmfCQiKSkKLQl7Ci0JICBpbnQgcGVlayA9IHN0cmluZ1tpICsgMV07Ci0KLQkgIGlmIChwZWVrID09IHN0cmluZ1tpXSAmJiBwZWVrICE9ICckJykKLQkgICAgewotCSAgICAgIGlmIChwZWVrID09ICc8JyAmJiBzdHJpbmdbaSArIDJdID09ICctJykKLQkJaSsrOwotCSAgICAgIGkgKz0gMjsKLQkgICAgICBnb3RvIGdvdF90b2tlbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKChwZWVrID09ICcmJyAmJiAoc3RyaW5nW2ldID09ICc+JyB8fCBzdHJpbmdbaV0gPT0gJzwnKSkgfHwKLQkJICAoKHBlZWsgPT0gJz4nKSAmJiAoc3RyaW5nW2ldID09ICcmJykpIHx8Ci0JCSAgKChwZWVrID09ICcoJykgJiYgKHN0cmluZ1tpXSA9PSAnJCcpKSkKLQkJewotCQkgIGkgKz0gMjsKLQkJICBnb3RvIGdvdF90b2tlbjsKLQkJfQotCSAgICB9Ci0JICBpZiAoc3RyaW5nW2ldICE9ICckJykKLQkgICAgewotCSAgICAgIGkrKzsKLQkgICAgICBnb3RvIGdvdF90b2tlbjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHdvcmQgZnJvbSBzdHJpbmcgKyBpOyAqLwotCi0gICAgICBpZiAobWVtYmVyIChzdHJpbmdbaV0sIEhJU1RPUllfUVVPVEVfQ0hBUkFDVEVSUykpCi0JZGVsaW1pdGVyID0gc3RyaW5nW2krK107Ci0KLSAgICAgIGZvciAoOyBzdHJpbmdbaV07IGkrKykKLQl7Ci0JICBpZiAoc3RyaW5nW2ldID09ICdcXCcgJiYgc3RyaW5nW2kgKyAxXSA9PSAnXG4nKQotCSAgICB7Ci0JICAgICAgaSsrOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmIChzdHJpbmdbaV0gPT0gJ1xcJyAmJiBkZWxpbWl0ZXIgIT0gJ1wnJyAmJgotCSAgICAgIChkZWxpbWl0ZXIgIT0gJyInIHx8IG1lbWJlciAoc3RyaW5nW2ldLCBzbGFzaGlmeV9pbl9xdW90ZXMpKSkKLQkgICAgewotCSAgICAgIGkrKzsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoZGVsaW1pdGVyICYmIHN0cmluZ1tpXSA9PSBkZWxpbWl0ZXIpCi0JICAgIHsKLQkgICAgICBkZWxpbWl0ZXIgPSAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmICghZGVsaW1pdGVyICYmIChtZW1iZXIgKHN0cmluZ1tpXSwgSElTVE9SWV9XT1JEX0RFTElNSVRFUlMpKSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghZGVsaW1pdGVyICYmIG1lbWJlciAoc3RyaW5nW2ldLCBISVNUT1JZX1FVT1RFX0NIQVJBQ1RFUlMpKQotCSAgICBkZWxpbWl0ZXIgPSBzdHJpbmdbaV07Ci0JfQotCi0gICAgZ290X3Rva2VuOgotCi0gICAgICAvKiBJZiB3ZSBhcmUgbG9va2luZyBmb3IgdGhlIHdvcmQgaW4gd2hpY2ggdGhlIGNoYXJhY3RlciBhdCBhCi0JIHBhcnRpY3VsYXIgaW5kZXggZmFsbHMsIHJlbWVtYmVyIGl0LiAqLwotICAgICAgaWYgKGluZHAgJiYgd2luZCAhPSAtMSAmJiB3aW5kID49IHN0YXJ0ICYmIHdpbmQgPCBpKQotICAgICAgICAqaW5kcCA9IHJlc3VsdF9pbmRleDsKLQotICAgICAgbGVuID0gaSAtIHN0YXJ0OwotICAgICAgaWYgKHJlc3VsdF9pbmRleCArIDIgPj0gc2l6ZSkKLQlyZXN1bHQgPSAoY2hhciAqKil4cmVhbGxvYyAocmVzdWx0LCAoKHNpemUgKz0gMTApICogc2l6ZW9mIChjaGFyICopKSk7Ci0gICAgICByZXN1bHRbcmVzdWx0X2luZGV4XSA9IHhtYWxsb2MgKDEgKyBsZW4pOwotICAgICAgc3RybmNweSAocmVzdWx0W3Jlc3VsdF9pbmRleF0sIHN0cmluZyArIHN0YXJ0LCBsZW4pOwotICAgICAgcmVzdWx0W3Jlc3VsdF9pbmRleF1bbGVuXSA9ICdcMCc7Ci0gICAgICByZXN1bHRbKytyZXN1bHRfaW5kZXhdID0gKGNoYXIgKilOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLS8qIFJldHVybiBhbiBhcnJheSBvZiB0b2tlbnMsIG11Y2ggYXMgdGhlIHNoZWxsIG1pZ2h0LiAgVGhlIHRva2VucyBhcmUKLSAgIHBhcnNlZCBvdXQgb2YgU1RSSU5HLiAqLwotY2hhciAqKgotaGlzdG9yeV90b2tlbml6ZSAoc3RyaW5nKQotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIHJldHVybiAoaGlzdG9yeV90b2tlbml6ZV9pbnRlcm5hbCAoc3RyaW5nLCAtMSwgKGludCAqKU5VTEwpKTsKLX0KLQotLyogRmluZCBhbmQgcmV0dXJuIHRoZSB3b3JkIHdoaWNoIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgYXQgaW5kZXggSU5ECi0gICBpbiB0aGUgaGlzdG9yeSBsaW5lIExJTkUuICBVc2VkIHRvIHNhdmUgdGhlIHdvcmQgbWF0Y2hlZCBieSB0aGUKLSAgIGxhc3QgaGlzdG9yeSAhP3N0cmluZz8gc2VhcmNoLiAqLwotc3RhdGljIGNoYXIgKgotaGlzdG9yeV9maW5kX3dvcmQgKGxpbmUsIGluZCkKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaW50IGluZDsKLXsKLSAgY2hhciAqKndvcmRzLCAqczsKLSAgaW50IGksIHdpbmQ7Ci0KLSAgd29yZHMgPSBoaXN0b3J5X3Rva2VuaXplX2ludGVybmFsIChsaW5lLCBpbmQsICZ3aW5kKTsKLSAgaWYgKHdpbmQgPT0gLTEpCi0gICAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotICBzID0gd29yZHNbd2luZF07Ci0gIGZvciAoaSA9IDA7IGkgPCB3aW5kOyBpKyspCi0gICAgZnJlZSAod29yZHNbaV0pOwotICBmb3IgKGkgPSB3aW5kICsgMTsgd29yZHNbaV07IGkrKykKLSAgICBmcmVlICh3b3Jkc1tpXSk7Ci0gIGZyZWUgKHdvcmRzKTsKLSAgcmV0dXJuIHM7Ci19CmRpZmYgLS1naXQgYS9yZWFkbGluZS9oaXN0ZmlsZS5jIGIvcmVhZGxpbmUvaGlzdGZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzN2U5OS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9oaXN0ZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qIGhpc3RmaWxlLmMgLSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgaGlzdG9yeSBmaWxlLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgR05VIEhpc3RvcnkgTGlicmFyeSAodGhlIExpYnJhcnkpLCBhIHNldCBvZgotICAgcm91dGluZXMgZm9yIG1hbmFnaW5nIHRoZSB0ZXh0IG9mIHByZXZpb3VzbHkgdHlwZWQgbGluZXMuCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLS8qIFRoZSBnb2FsIGlzIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIHRyYW5zcGFyZW50LCBzbyB0aGF0IHlvdQotICAgZG9uJ3QgaGF2ZSB0byBrbm93IHdoYXQgZGF0YSB0eXBlcyBhcmUgdXNlZCwganVzdCB3aGF0IGZ1bmN0aW9ucwotICAgeW91IGNhbiBjYWxsLiAgSSB0aGluayBJIGhhdmUgZG9uZSB0aGF0LiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZm5kZWYgX01JTklYCi0jICBpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmIC8qICFIQVZFX1NUUklOR19IICovCi0KLSNpZiBkZWZpbmVkIChfX0VNWF9fKQotIyAgaWZuZGVmIE9fQklOQVJZCi0jICAgIGRlZmluZSBPX0JJTkFSWSAwCi0jICBlbmRpZgotI2Vsc2UgLyogIV9fRU1YX18gKi8KLSAgIC8qIElmIHdlJ3JlIG5vdCBjb21waWxpbmcgZm9yIF9fRU1YX18sIHdlIGRvbid0IHdhbnQgdGhpcyBhdCBhbGwuICBFdmVyLiAqLwotIyAgdW5kZWYgT19CSU5BUlkKLSMgIGRlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYgLyogIV9fRU1YX18gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQgKGVycm5vKQotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZiAvKiAhZXJybm8gKi8KLQotI2luY2x1ZGUgImhpc3RvcnkuaCIKLSNpbmNsdWRlICJoaXN0bGliLmgiCi0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHNoZWxsLmMgKi8KLWV4dGVybiBjaGFyICpnZXRfZW52X3ZhbHVlICgpOwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiBSZXR1cm4gdGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBwbGFjZSBvZiB0aGlzCi0gICBmaWxlbmFtZS4gIFRoaXMgb25seSBtYXR0ZXJzIHdoZW4geW91IGRvbid0IHNwZWNpZnkgdGhlCi0gICBmaWxlbmFtZSB0byByZWFkX2hpc3RvcnkgKCksIG9yIHdyaXRlX2hpc3RvcnkgKCkuICovCi1zdGF0aWMgY2hhciAqCi1oaXN0b3J5X2ZpbGVuYW1lIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGNoYXIgKnJldHVybl92YWwsICpob21lOwotICBpbnQgaG9tZV9sZW47Ci0KLSAgcmV0dXJuX3ZhbCA9IGZpbGVuYW1lID8gc2F2ZXN0cmluZyAoZmlsZW5hbWUpIDogKGNoYXIgKilOVUxMOwotCi0gIGlmIChyZXR1cm5fdmFsKQotICAgIHJldHVybiAocmV0dXJuX3ZhbCk7Ci0gIAotICBob21lID0gZ2V0X2Vudl92YWx1ZSAoIkhPTUUiKTsKLQotICBpZiAoaG9tZSA9PSAwKQotICAgIHsKLSAgICAgIGhvbWUgPSAiLiI7Ci0gICAgICBob21lX2xlbiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgaG9tZV9sZW4gPSBzdHJsZW4gKGhvbWUpOwotCi0gIHJldHVybl92YWwgPSB4bWFsbG9jICgyICsgaG9tZV9sZW4gKyA4KTsgLyogc3RybGVuKCIuaGlzdG9yeSIpID09IDggKi8KLSAgc3RyY3B5IChyZXR1cm5fdmFsLCBob21lKTsKLSAgcmV0dXJuX3ZhbFtob21lX2xlbl0gPSAnLyc7Ci0gIHN0cmNweSAocmV0dXJuX3ZhbCArIGhvbWVfbGVuICsgMSwgIi5oaXN0b3J5Iik7Ci0KLSAgcmV0dXJuIChyZXR1cm5fdmFsKTsKLX0KLQotLyogQWRkIHRoZSBjb250ZW50cyBvZiBGSUxFTkFNRSB0byB0aGUgaGlzdG9yeSBsaXN0LCBhIGxpbmUgYXQgYSB0aW1lLgotICAgSWYgRklMRU5BTUUgaXMgTlVMTCwgdGhlbiByZWFkIGZyb20gfi8uaGlzdG9yeS4gIFJldHVybnMgMCBpZgotICAgc3VjY2Vzc2Z1bCwgb3IgZXJybm8gaWYgbm90LiAqLwotaW50Ci1yZWFkX2hpc3RvcnkgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgcmV0dXJuIChyZWFkX2hpc3RvcnlfcmFuZ2UgKGZpbGVuYW1lLCAwLCAtMSkpOwotfQotCi0vKiBSZWFkIGEgcmFuZ2Ugb2YgbGluZXMgZnJvbSBGSUxFTkFNRSwgYWRkaW5nIHRoZW0gdG8gdGhlIGhpc3RvcnkgbGlzdC4KLSAgIFN0YXJ0IHJlYWRpbmcgYXQgdGhlIEZST00ndGggbGluZSBhbmQgZW5kIGF0IHRoZSBUTyd0aC4gIElmIEZST00KLSAgIGlzIHplcm8sIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuICBJZiBUTyBpcyBsZXNzIHRoYW4gRlJPTSwgcmVhZAotICAgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIEZJTEVOQU1FIGlzIE5VTEwsIHRoZW4gcmVhZCBmcm9tCi0gICB+Ly5oaXN0b3J5LiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGVycm5vIGlmIG5vdC4gKi8KLWludAotcmVhZF9oaXN0b3J5X3JhbmdlIChmaWxlbmFtZSwgZnJvbSwgdG8pCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotICAgICBpbnQgZnJvbSwgdG87Ci17Ci0gIHJlZ2lzdGVyIGludCBsaW5lX3N0YXJ0LCBsaW5lX2VuZDsKLSAgY2hhciAqaW5wdXQsICpidWZmZXI7Ci0gIGludCBmaWxlLCBjdXJyZW50X2xpbmU7Ci0gIHN0cnVjdCBzdGF0IGZpbmZvOwotICBzaXplX3QgZmlsZV9zaXplOwotCi0gIGJ1ZmZlciA9IChjaGFyICopTlVMTDsKLSAgaW5wdXQgPSBoaXN0b3J5X2ZpbGVuYW1lIChmaWxlbmFtZSk7Ci0gIGZpbGUgPSBvcGVuIChpbnB1dCwgT19SRE9OTFl8T19CSU5BUlksIDA2NjYpOwotCi0KLSNpZmRlZiBfX01TRE9TX18KLSAgLyogTVNET1MgZG9lc24ndCBhbGxvdyBsZWFkaW5nIGRvdHMgaW4gZmlsZSBuYW1lcy4gIFRyeSBhZ2FpbgotICAgICB3aXRoIHRoZSBkb3QgcmVwbGFjZWQgYnkgYW4gdW5kZXJzY29yZS4gICovCi0gIGlmIChmaWxlIDwgMCAmJiAhZmlsZW5hbWUpCi0gICAgewotICAgICAgaW5wdXRbc3RybGVuIChpbnB1dCkgLSA4XSA9ICdfJzsKLSAgICAgIGZpbGUgPSBvcGVuIChpbnB1dCwgT19SRE9OTFl8T19CSU5BUlksIDA2NjYpOwotICAgIH0KLSNlbmRpZgotICBpZiAoKGZpbGUgPCAwKSB8fCAoZnN0YXQgKGZpbGUsICZmaW5mbykgPT0gLTEpKQotICAgIGdvdG8gZXJyb3JfYW5kX2V4aXQ7Ci0KLSAgZmlsZV9zaXplID0gKHNpemVfdClmaW5mby5zdF9zaXplOwotCi0gIC8qIGNoZWNrIGZvciBvdmVyZmxvdyBvbiB2ZXJ5IGxhcmdlIGZpbGVzICovCi0gIGlmIChmaWxlX3NpemUgIT0gZmluZm8uc3Rfc2l6ZSB8fCBmaWxlX3NpemUgKyAxIDwgZmlsZV9zaXplKQotICAgIHsKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgICAgIGVycm5vID0gRUZCSUc7Ci0jZW5kaWYKLSAgICAgIGdvdG8gZXJyb3JfYW5kX2V4aXQ7Ci0gICAgfQotCi0gIGJ1ZmZlciA9IHhtYWxsb2MgKGZpbGVfc2l6ZSArIDEpOwotI2lmIDAKLSAgaWYgKHJlYWQgKGZpbGUsIGJ1ZmZlciwgZmlsZV9zaXplKSAhPSBmaWxlX3NpemUpCi0jZWxzZQotICBpZiAocmVhZCAoZmlsZSwgYnVmZmVyLCBmaWxlX3NpemUpIDwgMCkKLSNlbmRpZgotICAgIHsKLSAgZXJyb3JfYW5kX2V4aXQ6Ci0gICAgICBpZiAoZmlsZSA+PSAwKQotCWNsb3NlIChmaWxlKTsKLQotICAgICAgRlJFRSAoaW5wdXQpOwotICAgICAgRlJFRSAoYnVmZmVyKTsKLQotICAgICAgcmV0dXJuIChlcnJubyk7Ci0gICAgfQotCi0gIGNsb3NlIChmaWxlKTsKLQotICAvKiBTZXQgVE8gdG8gbGFyZ2VyIHRoYW4gZW5kIG9mIGZpbGUgaWYgbmVnYXRpdmUuICovCi0gIGlmICh0byA8IDApCi0gICAgdG8gPSBmaWxlX3NpemU7Ci0KLSAgLyogU3RhcnQgYXQgYmVnaW5uaW5nIG9mIGZpbGUsIHdvcmsgdG8gZW5kLiAqLwotICBsaW5lX3N0YXJ0ID0gbGluZV9lbmQgPSBjdXJyZW50X2xpbmUgPSAwOwotCi0gIC8qIFNraXAgbGluZXMgdW50aWwgd2UgYXJlIGF0IEZST00uICovCi0gIHdoaWxlIChsaW5lX3N0YXJ0IDwgZmlsZV9zaXplICYmIGN1cnJlbnRfbGluZSA8IGZyb20pCi0gICAgewotICAgICAgZm9yIChsaW5lX2VuZCA9IGxpbmVfc3RhcnQ7IGxpbmVfZW5kIDwgZmlsZV9zaXplOyBsaW5lX2VuZCsrKQotCWlmIChidWZmZXJbbGluZV9lbmRdID09ICdcbicpCi0JICB7Ci0JICAgIGN1cnJlbnRfbGluZSsrOwotCSAgICBsaW5lX3N0YXJ0ID0gbGluZV9lbmQgKyAxOwotCSAgICBpZiAoY3VycmVudF9saW5lID09IGZyb20pCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBsaW5lcyBsZWZ0IHRvIGdvYmJsZSwgdGhlbiBnb2JibGUgdGhlbSBub3cuICovCi0gIGZvciAobGluZV9lbmQgPSBsaW5lX3N0YXJ0OyBsaW5lX2VuZCA8IGZpbGVfc2l6ZTsgbGluZV9lbmQrKykKLSAgICBpZiAoYnVmZmVyW2xpbmVfZW5kXSA9PSAnXG4nKQotICAgICAgewotCWJ1ZmZlcltsaW5lX2VuZF0gPSAnXDAnOwotCi0JaWYgKGJ1ZmZlcltsaW5lX3N0YXJ0XSkKLQkgIGFkZF9oaXN0b3J5IChidWZmZXIgKyBsaW5lX3N0YXJ0KTsKLQotCWN1cnJlbnRfbGluZSsrOwotCi0JaWYgKGN1cnJlbnRfbGluZSA+PSB0bykKLQkgIGJyZWFrOwotCi0JbGluZV9zdGFydCA9IGxpbmVfZW5kICsgMTsKLSAgICAgIH0KLQotICBGUkVFIChpbnB1dCk7Ci0gIEZSRUUgKGJ1ZmZlcik7Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogVHJ1bmNhdGUgdGhlIGhpc3RvcnkgZmlsZSBGTkFNRSwgbGVhdmluZyBvbmx5IExJTkVTIHRyYWlsaW5nIGxpbmVzLgotICAgSWYgRk5BTUUgaXMgTlVMTCwgdGhlbiB1c2Ugfi8uaGlzdG9yeS4gKi8KLWludAotaGlzdG9yeV90cnVuY2F0ZV9maWxlIChmbmFtZSwgbGluZXMpCi0gICAgIGNoYXIgKmZuYW1lOwotICAgICBpbnQgbGluZXM7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBpbnQgZmlsZSwgY2hhcnNfcmVhZDsKLSAgY2hhciAqYnVmZmVyLCAqZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IGZpbmZvOwotICBzaXplX3QgZmlsZV9zaXplOwotCi0gIGJ1ZmZlciA9IChjaGFyICopTlVMTDsKLSAgZmlsZW5hbWUgPSBoaXN0b3J5X2ZpbGVuYW1lIChmbmFtZSk7Ci0gIGZpbGUgPSBvcGVuIChmaWxlbmFtZSwgT19SRE9OTFl8T19CSU5BUlksIDA2NjYpOwotCi0jaWZkZWYgX19NU0RPU19fCi0gIC8qIE1TRE9TIGRvZXNuJ3QgYWxsb3cgbGVhZGluZyBkb3RzIGluIGZpbGUgbmFtZXMuICBUcnkgYWdhaW4KLSAgICAgd2l0aCB0aGUgZG90IHJlcGxhY2VkIGJ5IGFuIHVuZGVyc2NvcmUuICAqLwotICBpZiAoZmlsZSA8IDAgJiYgIWZuYW1lKQotICAgIHsKLSAgICAgIGZpbGVuYW1lW3N0cmxlbiAoZmlsZW5hbWUpIC0gOF0gPSAnXyc7Ci0gICAgICBmaWxlID0gb3BlbiAoZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZLCAwNjY2KTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoZmlsZSA9PSAtMSB8fCBmc3RhdCAoZmlsZSwgJmZpbmZvKSA9PSAtMSkKLSAgICBnb3RvIHRydW5jYXRlX2V4aXQ7Ci0KLSAgZmlsZV9zaXplID0gKHNpemVfdClmaW5mby5zdF9zaXplOwotCi0gIC8qIGNoZWNrIGZvciBvdmVyZmxvdyBvbiB2ZXJ5IGxhcmdlIGZpbGVzICovCi0gIGlmIChmaWxlX3NpemUgIT0gZmluZm8uc3Rfc2l6ZSB8fCBmaWxlX3NpemUgKyAxIDwgZmlsZV9zaXplKQotICAgIHsKLSAgICAgIGNsb3NlIChmaWxlKTsKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgICAgIGVycm5vID0gRUZCSUc7Ci0jZW5kaWYKLSAgICAgIGdvdG8gdHJ1bmNhdGVfZXhpdDsKLSAgICB9Ci0KLSAgYnVmZmVyID0geG1hbGxvYyAoZmlsZV9zaXplICsgMSk7Ci0gIGNoYXJzX3JlYWQgPSByZWFkIChmaWxlLCBidWZmZXIsIGZpbGVfc2l6ZSk7Ci0gIGNsb3NlIChmaWxlKTsKLQotICBpZiAoY2hhcnNfcmVhZCA8PSAwKQotICAgIGdvdG8gdHJ1bmNhdGVfZXhpdDsKLQotICAvKiBDb3VudCBiYWNrd2FyZHMgZnJvbSB0aGUgZW5kIG9mIGJ1ZmZlciB1bnRpbCB3ZSBoYXZlIHBhc3NlZAotICAgICBMSU5FUyBsaW5lcy4gKi8KLSAgZm9yIChpID0gY2hhcnNfcmVhZCAtIDE7IGxpbmVzICYmIGk7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoYnVmZmVyW2ldID09ICdcbicpCi0JbGluZXMtLTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgbGluZSwgdGhlbiB0aGUgZmlsZSBjb250YWlucyBleGFjdGx5IHRoZQotICAgICBudW1iZXIgb2YgbGluZXMgd2Ugd2FudCB0byB0cnVuY2F0ZSB0bywgc28gd2UgZG9uJ3QgbmVlZCB0byBkbwotICAgICBhbnl0aGluZy4gIEl0J3MgdGhlIGZpcnN0IGxpbmUgaWYgd2UgZG9uJ3QgZmluZCBhIG5ld2xpbmUgYmV0d2VlbgotICAgICB0aGUgY3VycmVudCB2YWx1ZSBvZiBpIGFuZCAwLiAgT3RoZXJ3aXNlLCB3cml0ZSBmcm9tIHRoZSBzdGFydCBvZgotICAgICB0aGlzIGxpbmUgdW50aWwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotICBmb3IgKCA7IGk7IGktLSkKLSAgICBpZiAoYnVmZmVyW2ldID09ICdcbicpCi0gICAgICB7Ci0JaSsrOwotCWJyZWFrOwotICAgICAgfQotCi0gIC8qIFdyaXRlIG9ubHkgaWYgdGhlcmUgYXJlIG1vcmUgbGluZXMgaW4gdGhlIGZpbGUgdGhhbiB3ZSB3YW50IHRvCi0gICAgIHRydW5jYXRlIHRvLiAqLwotICBpZiAoaSAmJiAoKGZpbGUgPSBvcGVuIChmaWxlbmFtZSwgT19XUk9OTFl8T19UUlVOQ3xPX0JJTkFSWSwgMDYwMCkpICE9IC0xKSkKLSAgICB7Ci0gICAgICB3cml0ZSAoZmlsZSwgYnVmZmVyICsgaSwgZmlsZV9zaXplIC0gaSk7Ci0KLSNpZiBkZWZpbmVkIChfX0JFT1NfXykKLSAgICAgIC8qIEJlT1MgaWdub3JlcyBPX1RSVU5DLiAqLwotICAgICAgZnRydW5jYXRlIChmaWxlLCBmaWxlX3NpemUgLSBpKTsKLSNlbmRpZgotCi0gICAgICBjbG9zZSAoZmlsZSk7Ci0gICAgfQotCi0gdHJ1bmNhdGVfZXhpdDoKLQotICBGUkVFIChidWZmZXIpOwotCi0gIGZyZWUgKGZpbGVuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdvcmtob3JzZSBmdW5jdGlvbiBmb3Igd3JpdGluZyBoaXN0b3J5LiAgV3JpdGVzIE5FTEVNRU5UIGVudHJpZXMKLSAgIGZyb20gdGhlIGhpc3RvcnkgbGlzdCB0byBGSUxFTkFNRS4gIE9WRVJXUklURSBpcyBub24temVybyBpZiB5b3UKLSAgIHdpc2ggdG8gcmVwbGFjZSBGSUxFTkFNRSB3aXRoIHRoZSBlbnRyaWVzLiAqLwotc3RhdGljIGludAotaGlzdG9yeV9kb193cml0ZSAoZmlsZW5hbWUsIG5lbGVtZW50cywgb3ZlcndyaXRlKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IG5lbGVtZW50cywgb3ZlcndyaXRlOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgY2hhciAqb3V0cHV0OwotICBpbnQgZmlsZSwgbW9kZTsKLQotICBtb2RlID0gb3ZlcndyaXRlID8gT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DfE9fQklOQVJZIDogT19XUk9OTFl8T19BUFBFTkR8T19CSU5BUlk7Ci0gIG91dHB1dCA9IGhpc3RvcnlfZmlsZW5hbWUgKGZpbGVuYW1lKTsKLQotICBpZiAoKGZpbGUgPSBvcGVuIChvdXRwdXQsIG1vZGUsIDA2MDApKSA9PSAtMSkKLSAgICB7Ci0jaWZkZWYgX19NU0RPU19fCi0gICAgICAvKiBNU0RPUyBkb2Vzbid0IGFsbG93IGxlYWRpbmcgZG90cyBpbiBmaWxlIG5hbWVzLiAgSWYgdGhpcyBpcwotCSB0aGUgZGVmYXVsdCBmaWxlIG5hbWUsIHRyeSBhZ2FpbiB3aXRoIHRoZSBkb3QgcmVwbGFjZWQgYnkgYW4KLQkgdW5kZXJzY29yZS4gICovCi0gICAgICBpZiAoIWZpbGVuYW1lKQotCXsKLQkgIG91dHB1dFtzdHJsZW4gKG91dHB1dCkgLSA4XSA9ICdfJzsKLQkgIGlmICgoZmlsZSA9IG9wZW4gKG91dHB1dCwgbW9kZSwgMDYwMCkpID09IC0xKQotCSAgICB7Ci0JICAgICAgRlJFRSAob3V0cHV0KTsKLQkgICAgICByZXR1cm4gKGVycm5vKTsKLQkgICAgfQotCX0KLSNlbHNlCi0gICAgICBGUkVFIChvdXRwdXQpOwotICAgICAgcmV0dXJuIChlcnJubyk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKG5lbGVtZW50cyA+IGhpc3RvcnlfbGVuZ3RoKQotICAgIG5lbGVtZW50cyA9IGhpc3RvcnlfbGVuZ3RoOwotCi0gIC8qIEJ1aWxkIGEgYnVmZmVyIG9mIGFsbCB0aGUgbGluZXMgdG8gd3JpdGUsIGFuZCB3cml0ZSB0aGVtIGluIG9uZSBzeXNjYWxsLgotICAgICBTdWdnZXN0ZWQgYnkgUGV0ZXIgSG8gKHBldGVyQHJvYm9zdHMub3hmb3JkLmFjLnVrKS4gKi8KLSAgewotICAgIEhJU1RfRU5UUlkgKip0aGVfaGlzdG9yeTsJLyogbG9jYWwgKi8KLSAgICByZWdpc3RlciBpbnQgajsKLSAgICBpbnQgYnVmZmVyX3NpemU7Ci0gICAgY2hhciAqYnVmZmVyOwotCi0gICAgdGhlX2hpc3RvcnkgPSBoaXN0b3J5X2xpc3QgKCk7Ci0gICAgLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuICovCi0gICAgZm9yIChidWZmZXJfc2l6ZSA9IDAsIGkgPSBoaXN0b3J5X2xlbmd0aCAtIG5lbGVtZW50czsgaSA8IGhpc3RvcnlfbGVuZ3RoOyBpKyspCi0gICAgICBidWZmZXJfc2l6ZSArPSAxICsgc3RybGVuICh0aGVfaGlzdG9yeVtpXS0+bGluZSk7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyLCBhbmQgZmlsbCBpdC4gKi8KLSAgICBidWZmZXIgPSB4bWFsbG9jIChidWZmZXJfc2l6ZSk7Ci0KLSAgICBmb3IgKGogPSAwLCBpID0gaGlzdG9yeV9sZW5ndGggLSBuZWxlbWVudHM7IGkgPCBoaXN0b3J5X2xlbmd0aDsgaSsrKQotICAgICAgewotCXN0cmNweSAoYnVmZmVyICsgaiwgdGhlX2hpc3RvcnlbaV0tPmxpbmUpOwotCWogKz0gc3RybGVuICh0aGVfaGlzdG9yeVtpXS0+bGluZSk7Ci0JYnVmZmVyW2orK10gPSAnXG4nOwotICAgICAgfQotCi0gICAgd3JpdGUgKGZpbGUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotICAgIGZyZWUgKGJ1ZmZlcik7Ci0gIH0KLQotICBjbG9zZSAoZmlsZSk7Ci0KLSAgRlJFRSAob3V0cHV0KTsKLQotICByZXR1cm4gKDApOwotfQotCi0vKiBBcHBlbmQgTkVMRU1FTlQgZW50cmllcyB0byBGSUxFTkFNRS4gIFRoZSBlbnRyaWVzIGFwcGVuZGVkIGFyZSBmcm9tCi0gICB0aGUgZW5kIG9mIHRoZSBsaXN0IG1pbnVzIE5FTEVNRU5UcyB1cCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAqLwotaW50Ci1hcHBlbmRfaGlzdG9yeSAobmVsZW1lbnRzLCBmaWxlbmFtZSkKLSAgICAgaW50IG5lbGVtZW50czsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHJldHVybiAoaGlzdG9yeV9kb193cml0ZSAoZmlsZW5hbWUsIG5lbGVtZW50cywgSElTVE9SWV9BUFBFTkQpKTsKLX0KLQotLyogT3ZlcndyaXRlIEZJTEVOQU1FIHdpdGggdGhlIGN1cnJlbnQgaGlzdG9yeS4gIElmIEZJTEVOQU1FIGlzIE5VTEwsCi0gICB0aGVuIHdyaXRlIHRoZSBoaXN0b3J5IGxpc3QgdG8gfi8uaGlzdG9yeS4gIFZhbHVlcyByZXR1cm5lZAotICAgYXJlIGFzIGluIHJlYWRfaGlzdG9yeSAoKS4qLwotaW50Ci13cml0ZV9oaXN0b3J5IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHJldHVybiAoaGlzdG9yeV9kb193cml0ZSAoZmlsZW5hbWUsIGhpc3RvcnlfbGVuZ3RoLCBISVNUT1JZX09WRVJXUklURSkpOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvaGlzdGxpYi5oIGIvcmVhZGxpbmUvaGlzdGxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJjZjU5Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2hpc3RsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIGhpc3RsaWIuaCAtLSBpbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgdGhlIGhpc3RvcnkgbGlicmFyeS4gKi8KLS8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgbWFuYWdpbmcgdGhlIHRleHQgb2YgcHJldmlvdXNseSB0eXBlZCBsaW5lcy4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmICFkZWZpbmVkIChfSElTVExJQl9IXykKLSNkZWZpbmUgX0hJU1RMSUJfSF8KLQotLyogRnVuY3Rpb24gcG9pbnRlcnMgY2FuIGJlIGRlY2xhcmVkIGFzIChGdW5jdGlvbiAqKWZvby4gKi8KLSNpZiAhZGVmaW5lZCAoX0ZVTkNUSU9OX0RFRikKLSMgIGRlZmluZSBfRlVOQ1RJT05fREVGCi10eXBlZGVmIGludCBGdW5jdGlvbiAoKTsKLXR5cGVkZWYgdm9pZCBWRnVuY3Rpb24gKCk7Ci10eXBlZGVmIGNoYXIgKkNQRnVuY3Rpb24gKCk7Ci10eXBlZGVmIGNoYXIgKipDUFBGdW5jdGlvbiAoKTsKLSNlbmRpZiAvKiBfRlVOQ1RJT05fREVGICovCi0KLSNkZWZpbmUgU1RSRVEoYSwgYikJKCgoYSlbMF0gPT0gKGIpWzBdKSAmJiAoc3RyY21wICgoYSksIChiKSkgPT0gMCkpCi0jZGVmaW5lIFNUUkVRTihhLCBiLCBuKQkoKChhKVswXSA9PSAoYilbMF0pICYmIChzdHJuY21wICgoYSksIChiKSwgKG4pKSA9PSAwKSkKLQotI2lmbmRlZiBzYXZlc3RyaW5nCi0jICBpZm5kZWYgc3RyY3B5Ci1leHRlcm4gY2hhciAqc3RyY3B5ICgpOwotIyAgZW5kaWYKLSNkZWZpbmUgc2F2ZXN0cmluZyh4KSBzdHJjcHkgKHhtYWxsb2MgKDEgKyBzdHJsZW4gKHgpKSwgKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgd2hpdGVzcGFjZQotI2RlZmluZSB3aGl0ZXNwYWNlKGMpICgoKGMpID09ICcgJykgfHwgKChjKSA9PSAnXHQnKSkKLSNlbmRpZgotCi0jaWZuZGVmIF9ybF9kaWdpdF9wCi0jZGVmaW5lIF9ybF9kaWdpdF9wKGMpICAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQotI2VuZGlmCi0KLSNpZm5kZWYgX3JsX2RpZ2l0X3ZhbHVlCi0jZGVmaW5lIF9ybF9kaWdpdF92YWx1ZShjKSAoKGMpIC0gJzAnKQotI2VuZGlmCi0KLSNpZm5kZWYgbWVtYmVyCi0jICBpZm5kZWYgc3RyY2hyCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotIyAgZW5kaWYKLSNkZWZpbmUgbWVtYmVyKGMsIHMpICgoYykgPyAoKGNoYXIgKilzdHJjaHIgKChzKSwgKGMpKSAhPSAoY2hhciAqKU5VTEwpIDogMCkKLSNlbmRpZgotCi0jaWZuZGVmIEZSRUUKLSMgIGRlZmluZSBGUkVFKHgpCWlmICh4KSBmcmVlICh4KQotI2VuZGlmCi0KLS8qIFBvc3NpYmxlIGhpc3RvcnkgZXJyb3JzIHBhc3NlZCB0byBoaXN0X2Vycm9yLiAqLwotI2RlZmluZSBFVkVOVF9OT1RfRk9VTkQgMAotI2RlZmluZSBCQURfV09SRF9TUEVDCTEKLSNkZWZpbmUgU1VCU1RfRkFJTEVECTIKLSNkZWZpbmUgQkFEX01PRElGSUVSCTMKLSNkZWZpbmUgTk9fUFJFVl9TVUJTVAk0Ci0KLS8qIFBvc3NpYmxlIGRlZmluaXRpb25zIGZvciBoaXN0b3J5IHN0YXJ0aW5nIHBvaW50IHNwZWNpZmljYXRpb24uICovCi0jZGVmaW5lIEFOQ0hPUkVEX1NFQVJDSCAxCi0jZGVmaW5lIE5PTl9BTkNIT1JFRF9TRUFSQ0ggMAotCi0vKiBQb3NzaWJsZSBkZWZpbml0aW9ucyBmb3Igd2hhdCBzdHlsZSBvZiB3cml0aW5nIHRoZSBoaXN0b3J5IGZpbGUgd2Ugd2FudC4gKi8KLSNkZWZpbmUgSElTVE9SWV9BUFBFTkQgMAotI2RlZmluZSBISVNUT1JZX09WRVJXUklURSAxCi0KLSNlbmRpZiAvKiAhX0hJU1RMSUJfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2hpc3RvcnkuYyBiL3JlYWRsaW5lL2hpc3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ZmZhYy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9oaXN0b3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyogSGlzdG9yeS5jIC0tIHN0YW5kYWxvbmUgaGlzdG9yeSBsaWJyYXJ5ICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgbWFuYWdpbmcgdGhlIHRleHQgb2YgcHJldmlvdXNseSB0eXBlZCBsaW5lcy4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotLyogVGhlIGdvYWwgaXMgdG8gbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gdHJhbnNwYXJlbnQsIHNvIHRoYXQgeW91Ci0gICBkb24ndCBoYXZlIHRvIGtub3cgd2hhdCBkYXRhIHR5cGVzIGFyZSB1c2VkLCBqdXN0IHdoYXQgZnVuY3Rpb25zCi0gICB5b3UgY2FuIGNhbGwuICBJIHRoaW5rIEkgaGF2ZSBkb25lIHRoYXQuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpZmRlZiBfTUlOSVgKLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfU1RSSU5HX0gpCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYgLyogIUhBVkVfU1RSSU5HX0ggKi8KLQotI2luY2x1ZGUgImhpc3RvcnkuaCIKLSNpbmNsdWRlICJoaXN0bGliLmgiCi0KLWV4dGVybiBjaGFyICp4bWFsbG9jICgpLCAqeHJlYWxsb2MgKCk7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgdG8gaW5jcmVhc2UgdGhlX2hpc3RvcnkgYnkuICovCi0jZGVmaW5lIERFRkFVTFRfSElTVE9SWV9HUk9XX1NJWkUgNTAKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlIaXN0b3J5IEZ1bmN0aW9ucwkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBBbiBhcnJheSBvZiBISVNUX0VOVFJZLiAgVGhpcyBpcyB3aGVyZSB3ZSBzdG9yZSB0aGUgaGlzdG9yeS4gKi8KLXN0YXRpYyBISVNUX0VOVFJZICoqdGhlX2hpc3RvcnkgPSAoSElTVF9FTlRSWSAqKilOVUxMOwotCi0vKiBOb24temVybyBtZWFucyB0aGF0IHdlIGhhdmUgZW5mb3JjZWQgYSBsaW1pdCBvbiB0aGUgYW1vdW50IG9mCi0gICBoaXN0b3J5IHRoYXQgd2Ugc2F2ZS4gKi8KLXN0YXRpYyBpbnQgaGlzdG9yeV9zdGlmbGVkOwotCi0vKiBJZiBISVNUT1JZX1NUSUZMRUQgaXMgbm9uLXplcm8sIHRoZW4gdGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgIGVudHJpZXMgdG8gcmVtZW1iZXIuICovCi1pbnQgbWF4X2lucHV0X2hpc3Rvcnk7Ci0KLS8qIFRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbnRlcmFjdGl2ZSBoaXN0b3J5IHBvaW50ZXIuICBKdXN0IG1ha2VzCi0gICBsaWZlIGVhc2llciBmb3Igb3V0c2lkZSBjYWxsZXJzLiAqLwotaW50IGhpc3Rvcnlfb2Zmc2V0OwotCi0vKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgaGlzdG9yeSBsaXN0LiAqLwotaW50IGhpc3RvcnlfbGVuZ3RoOwotCi0vKiBUaGUgY3VycmVudCBudW1iZXIgb2Ygc2xvdHMgYWxsb2NhdGVkIHRvIHRoZSBpbnB1dF9oaXN0b3J5LiAqLwotc3RhdGljIGludCBoaXN0b3J5X3NpemU7Ci0KLS8qIFRoZSBsb2dpY2FsIGBiYXNlJyBvZiB0aGUgaGlzdG9yeSBhcnJheS4gIEl0IGRlZmF1bHRzIHRvIDEuICovCi1pbnQgaGlzdG9yeV9iYXNlID0gMTsKLQotLyogUmV0dXJuIHRoZSBjdXJyZW50IEhJU1RPUllfU1RBVEUgb2YgdGhlIGhpc3RvcnkuICovCi1ISVNUT1JZX1NUQVRFICoKLWhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUgKCkKLXsKLSAgSElTVE9SWV9TVEFURSAqc3RhdGU7Ci0KLSAgc3RhdGUgPSAoSElTVE9SWV9TVEFURSAqKXhtYWxsb2MgKHNpemVvZiAoSElTVE9SWV9TVEFURSkpOwotICBzdGF0ZS0+ZW50cmllcyA9IHRoZV9oaXN0b3J5OwotICBzdGF0ZS0+b2Zmc2V0ID0gaGlzdG9yeV9vZmZzZXQ7Ci0gIHN0YXRlLT5sZW5ndGggPSBoaXN0b3J5X2xlbmd0aDsKLSAgc3RhdGUtPnNpemUgPSBoaXN0b3J5X3NpemU7Ci0gIHN0YXRlLT5mbGFncyA9IDA7Ci0gIGlmIChoaXN0b3J5X3N0aWZsZWQpCi0gICAgc3RhdGUtPmZsYWdzIHw9IEhTX1NUSUZMRUQ7Ci0KLSAgcmV0dXJuIChzdGF0ZSk7Ci19Ci0KLS8qIFNldCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaGlzdG9yeSBhcnJheSB0byBTVEFURS4gKi8KLXZvaWQKLWhpc3Rvcnlfc2V0X2hpc3Rvcnlfc3RhdGUgKHN0YXRlKQotICAgICBISVNUT1JZX1NUQVRFICpzdGF0ZTsKLXsKLSAgdGhlX2hpc3RvcnkgPSBzdGF0ZS0+ZW50cmllczsKLSAgaGlzdG9yeV9vZmZzZXQgPSBzdGF0ZS0+b2Zmc2V0OwotICBoaXN0b3J5X2xlbmd0aCA9IHN0YXRlLT5sZW5ndGg7Ci0gIGhpc3Rvcnlfc2l6ZSA9IHN0YXRlLT5zaXplOwotICBpZiAoc3RhdGUtPmZsYWdzICYgSFNfU1RJRkxFRCkKLSAgICBoaXN0b3J5X3N0aWZsZWQgPSAxOwotfQotCi0vKiBCZWdpbiBhIHNlc3Npb24gaW4gd2hpY2ggdGhlIGhpc3RvcnkgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQuICBUaGlzCi0gICBpbml0aWFsaXplcyBpbnRlcmFjdGl2ZSB2YXJpYWJsZXMuICovCi12b2lkCi11c2luZ19oaXN0b3J5ICgpCi17Ci0gIGhpc3Rvcnlfb2Zmc2V0ID0gaGlzdG9yeV9sZW5ndGg7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHByaW1hcnkgaGlzdG9yeSBlbnRyaWVzIGFyZSB1c2luZy4KLSAgIFRoaXMganVzdCBhZGRzIHVwIHRoZSBsZW5ndGhzIG9mIHRoZV9oaXN0b3J5LT5saW5lcy4gKi8KLWludAotaGlzdG9yeV90b3RhbF9ieXRlcyAoKQotewotICByZWdpc3RlciBpbnQgaSwgcmVzdWx0OwotCi0gIHJlc3VsdCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgdGhlX2hpc3RvcnkgJiYgdGhlX2hpc3RvcnlbaV07IGkrKykKLSAgICByZXN1bHQgKz0gc3RybGVuICh0aGVfaGlzdG9yeVtpXS0+bGluZSk7Ci0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0vKiBSZXR1cm5zIHRoZSBtYWdpYyBudW1iZXIgd2hpY2ggc2F5cyB3aGF0IGhpc3RvcnkgZWxlbWVudCB3ZSBhcmUKLSAgIGxvb2tpbmcgYXQgbm93LiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaXQgcmV0dXJucyBoaXN0b3J5X29mZnNldC4gKi8KLWludAotd2hlcmVfaGlzdG9yeSAoKQotewotICByZXR1cm4gKGhpc3Rvcnlfb2Zmc2V0KTsKLX0KLQotLyogTWFrZSB0aGUgY3VycmVudCBoaXN0b3J5IGl0ZW0gYmUgdGhlIG9uZSBhdCBQT1MsIGFuIGFic29sdXRlIGluZGV4LgotICAgUmV0dXJucyB6ZXJvIGlmIFBPUyBpcyBvdXQgb2YgcmFuZ2UsIGVsc2Ugbm9uLXplcm8uICovCi1pbnQKLWhpc3Rvcnlfc2V0X3BvcyAocG9zKQotICAgICBpbnQgcG9zOwotewotICBpZiAocG9zID4gaGlzdG9yeV9sZW5ndGggfHwgcG9zIDwgMCB8fCAhdGhlX2hpc3RvcnkpCi0gICAgcmV0dXJuICgwKTsKLSAgaGlzdG9yeV9vZmZzZXQgPSBwb3M7Ci0gIHJldHVybiAoMSk7Ci19Ci0gCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgaGlzdG9yeSBhcnJheS4gIFRoZSBjYWxsZXIgaGFzIHRvIGJlIGNhcmVmdWxsLCBzaW5jZSB0aGlzCi0gICBpcyB0aGUgYWN0dWFsIGFycmF5IG9mIGRhdGEsIGFuZCBjb3VsZCBiZSBiYXNoZWQgb3IgbWFkZSBjb3JydXB0IGVhc2lseS4KLSAgIFRoZSBhcnJheSBpcyB0ZXJtaW5hdGVkIHdpdGggYSBOVUxMIHBvaW50ZXIuICovCi1ISVNUX0VOVFJZICoqCi1oaXN0b3J5X2xpc3QgKCkKLXsKLSAgcmV0dXJuICh0aGVfaGlzdG9yeSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgaGlzdG9yeSBlbnRyeSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYXMgZGV0ZXJtaW5lZCBieQotICAgaGlzdG9yeV9vZmZzZXQuICBJZiB0aGVyZSBpcyBubyBlbnRyeSB0aGVyZSwgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAqLwotSElTVF9FTlRSWSAqCi1jdXJyZW50X2hpc3RvcnkgKCkKLXsKLSAgcmV0dXJuICgoaGlzdG9yeV9vZmZzZXQgPT0gaGlzdG9yeV9sZW5ndGgpIHx8IHRoZV9oaXN0b3J5ID09IDApCi0JCT8gKEhJU1RfRU5UUlkgKilOVUxMCi0JCTogdGhlX2hpc3RvcnlbaGlzdG9yeV9vZmZzZXRdOwotfQotCi0vKiBCYWNrIHVwIGhpc3Rvcnlfb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyBoaXN0b3J5IGVudHJ5LCBhbmQgcmV0dXJuCi0gICBhIHBvaW50ZXIgdG8gdGhhdCBlbnRyeS4gIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGVudHJ5IHRoZW4gcmV0dXJuCi0gICBhIE5VTEwgcG9pbnRlci4gKi8KLUhJU1RfRU5UUlkgKgotcHJldmlvdXNfaGlzdG9yeSAoKQotewotICByZXR1cm4gaGlzdG9yeV9vZmZzZXQgPyB0aGVfaGlzdG9yeVstLWhpc3Rvcnlfb2Zmc2V0XSA6IChISVNUX0VOVFJZICopTlVMTDsKLX0KLQotLyogTW92ZSBoaXN0b3J5X29mZnNldCBmb3J3YXJkIHRvIHRoZSBuZXh0IGhpc3RvcnkgZW50cnksIGFuZCByZXR1cm4KLSAgIGEgcG9pbnRlciB0byB0aGF0IGVudHJ5LiAgSWYgdGhlcmUgaXMgbm8gbmV4dCBlbnRyeSB0aGVuIHJldHVybiBhCi0gICBOVUxMIHBvaW50ZXIuICovCi1ISVNUX0VOVFJZICoKLW5leHRfaGlzdG9yeSAoKQotewotICByZXR1cm4gKGhpc3Rvcnlfb2Zmc2V0ID09IGhpc3RvcnlfbGVuZ3RoKSA/IChISVNUX0VOVFJZICopTlVMTCA6IHRoZV9oaXN0b3J5WysraGlzdG9yeV9vZmZzZXRdOwotfQotCi0vKiBSZXR1cm4gdGhlIGhpc3RvcnkgZW50cnkgd2hpY2ggaXMgbG9naWNhbGx5IGF0IE9GRlNFVCBpbiB0aGUgaGlzdG9yeSBhcnJheS4KLSAgIE9GRlNFVCBpcyByZWxhdGl2ZSB0byBoaXN0b3J5X2Jhc2UuICovCi1ISVNUX0VOVFJZICoKLWhpc3RvcnlfZ2V0IChvZmZzZXQpCi0gICAgIGludCBvZmZzZXQ7Ci17Ci0gIGludCBsb2NhbF9pbmRleDsKLQotICBsb2NhbF9pbmRleCA9IG9mZnNldCAtIGhpc3RvcnlfYmFzZTsKLSAgcmV0dXJuIChsb2NhbF9pbmRleCA+PSBoaXN0b3J5X2xlbmd0aCB8fCBsb2NhbF9pbmRleCA8IDAgfHwgIXRoZV9oaXN0b3J5KQotCQk/IChISVNUX0VOVFJZICopTlVMTAotCQk6IHRoZV9oaXN0b3J5W2xvY2FsX2luZGV4XTsKLX0KLQotLyogUGxhY2UgU1RSSU5HIGF0IHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgbGlzdC4gIFRoZSBkYXRhIGZpZWxkCi0gICBpcyAgc2V0IHRvIE5VTEwuICovCi12b2lkCi1hZGRfaGlzdG9yeSAoc3RyaW5nKQotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIEhJU1RfRU5UUlkgKnRlbXA7Ci0KLSAgaWYgKGhpc3Rvcnlfc3RpZmxlZCAmJiAoaGlzdG9yeV9sZW5ndGggPT0gbWF4X2lucHV0X2hpc3RvcnkpKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotCi0gICAgICAvKiBJZiB0aGUgaGlzdG9yeSBpcyBzdGlmbGVkLCBhbmQgaGlzdG9yeV9sZW5ndGggaXMgemVybywKLQkgYW5kIGl0IGVxdWFscyBtYXhfaW5wdXRfaGlzdG9yeSwgd2UgZG9uJ3Qgc2F2ZSBpdGVtcy4gKi8KLSAgICAgIGlmIChoaXN0b3J5X2xlbmd0aCA9PSAwKQotCXJldHVybjsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgc29tZXRoaW5nIGluIHRoZSBzbG90LCB0aGVuIHJlbW92ZSBpdC4gKi8KLSAgICAgIGlmICh0aGVfaGlzdG9yeVswXSkKLQl7Ci0JICBmcmVlICh0aGVfaGlzdG9yeVswXS0+bGluZSk7Ci0JICBmcmVlICh0aGVfaGlzdG9yeVswXSk7Ci0JfQotCi0gICAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBlbnRyaWVzLCBtb3ZpbmcgZG93biBvbmUgc2xvdC4gKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b3J5X2xlbmd0aDsgaSsrKQotCXRoZV9oaXN0b3J5W2ldID0gdGhlX2hpc3RvcnlbaSArIDFdOwotCi0gICAgICBoaXN0b3J5X2Jhc2UrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaGlzdG9yeV9zaXplID09IDApCi0JewotCSAgaGlzdG9yeV9zaXplID0gREVGQVVMVF9ISVNUT1JZX0dST1dfU0laRTsKLQkgIHRoZV9oaXN0b3J5ID0gKEhJU1RfRU5UUlkgKiopeG1hbGxvYyAoaGlzdG9yeV9zaXplICogc2l6ZW9mIChISVNUX0VOVFJZICopKTsKLQkgIGhpc3RvcnlfbGVuZ3RoID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGhpc3RvcnlfbGVuZ3RoID09IChoaXN0b3J5X3NpemUgLSAxKSkKLQkgICAgewotCSAgICAgIGhpc3Rvcnlfc2l6ZSArPSBERUZBVUxUX0hJU1RPUllfR1JPV19TSVpFOwotCSAgICAgIHRoZV9oaXN0b3J5ID0gKEhJU1RfRU5UUlkgKiopCi0JCXhyZWFsbG9jICh0aGVfaGlzdG9yeSwgaGlzdG9yeV9zaXplICogc2l6ZW9mIChISVNUX0VOVFJZICopKTsKLQkgICAgfQotCSAgaGlzdG9yeV9sZW5ndGgrKzsKLQl9Ci0gICAgfQotCi0gIHRlbXAgPSAoSElTVF9FTlRSWSAqKXhtYWxsb2MgKHNpemVvZiAoSElTVF9FTlRSWSkpOwotICB0ZW1wLT5saW5lID0gc2F2ZXN0cmluZyAoc3RyaW5nKTsKLSAgdGVtcC0+ZGF0YSA9IChjaGFyICopTlVMTDsKLQotICB0aGVfaGlzdG9yeVtoaXN0b3J5X2xlbmd0aF0gPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0gIHRoZV9oaXN0b3J5W2hpc3RvcnlfbGVuZ3RoIC0gMV0gPSB0ZW1wOwotfQotCi0vKiBNYWtlIHRoZSBoaXN0b3J5IGVudHJ5IGF0IFdISUNIIGhhdmUgTElORSBhbmQgREFUQS4gIFRoaXMgcmV0dXJucwotICAgdGhlIG9sZCBlbnRyeSBzbyB5b3UgY2FuIGRpc3Bvc2Ugb2YgdGhlIGRhdGEuICBJbiB0aGUgY2FzZSBvZiBhbgotICAgaW52YWxpZCBXSElDSCwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQuICovCi1ISVNUX0VOVFJZICoKLXJlcGxhY2VfaGlzdG9yeV9lbnRyeSAod2hpY2gsIGxpbmUsIGRhdGEpCi0gICAgIGludCB3aGljaDsKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaGlzdGRhdGFfdCBkYXRhOwotewotICBISVNUX0VOVFJZICp0ZW1wID0gKEhJU1RfRU5UUlkgKil4bWFsbG9jIChzaXplb2YgKEhJU1RfRU5UUlkpKTsKLSAgSElTVF9FTlRSWSAqb2xkX3ZhbHVlOwotCi0gIGlmICh3aGljaCA+PSBoaXN0b3J5X2xlbmd0aCkKLSAgICByZXR1cm4gKChISVNUX0VOVFJZICopTlVMTCk7Ci0KLSAgb2xkX3ZhbHVlID0gdGhlX2hpc3Rvcnlbd2hpY2hdOwotCi0gIHRlbXAtPmxpbmUgPSBzYXZlc3RyaW5nIChsaW5lKTsKLSAgdGVtcC0+ZGF0YSA9IGRhdGE7Ci0gIHRoZV9oaXN0b3J5W3doaWNoXSA9IHRlbXA7Ci0KLSAgcmV0dXJuIChvbGRfdmFsdWUpOwotfQotCi0vKiBSZW1vdmUgaGlzdG9yeSBlbGVtZW50IFdISUNIIGZyb20gdGhlIGhpc3RvcnkuICBUaGUgcmVtb3ZlZAotICAgZWxlbWVudCBpcyByZXR1cm5lZCB0byB5b3Ugc28geW91IGNhbiBmcmVlIHRoZSBsaW5lLCBkYXRhLAotICAgYW5kIGNvbnRhaW5pbmcgc3RydWN0dXJlLiAqLwotSElTVF9FTlRSWSAqCi1yZW1vdmVfaGlzdG9yeSAod2hpY2gpCi0gICAgIGludCB3aGljaDsKLXsKLSAgSElTVF9FTlRSWSAqcmV0dXJuX3ZhbHVlOwotCi0gIGlmICh3aGljaCA+PSBoaXN0b3J5X2xlbmd0aCB8fCAhaGlzdG9yeV9sZW5ndGgpCi0gICAgcmV0dXJuX3ZhbHVlID0gKEhJU1RfRU5UUlkgKilOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0gICAgICByZXR1cm5fdmFsdWUgPSB0aGVfaGlzdG9yeVt3aGljaF07Ci0KLSAgICAgIGZvciAoaSA9IHdoaWNoOyBpIDwgaGlzdG9yeV9sZW5ndGg7IGkrKykKLQl0aGVfaGlzdG9yeVtpXSA9IHRoZV9oaXN0b3J5W2kgKyAxXTsKLQotICAgICAgaGlzdG9yeV9sZW5ndGgtLTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi0vKiBTdGlmbGUgdGhlIGhpc3RvcnkgbGlzdCwgcmVtZW1iZXJpbmcgb25seSBNQVggbnVtYmVyIG9mIGxpbmVzLiAqLwotdm9pZAotc3RpZmxlX2hpc3RvcnkgKG1heCkKLSAgICAgaW50IG1heDsKLXsKLSAgaWYgKG1heCA8IDApCi0gICAgbWF4ID0gMDsKLQotICBpZiAoaGlzdG9yeV9sZW5ndGggPiBtYXgpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGksIGo7Ci0KLSAgICAgIC8qIFRoaXMgbG9zZXMgYmVjYXVzZSB3ZSBjYW5ub3QgZnJlZSB0aGUgZGF0YS4gKi8KLSAgICAgIGZvciAoaSA9IDAsIGogPSBoaXN0b3J5X2xlbmd0aCAtIG1heDsgaSA8IGo7IGkrKykKLQl7Ci0JICBmcmVlICh0aGVfaGlzdG9yeVtpXS0+bGluZSk7Ci0JICBmcmVlICh0aGVfaGlzdG9yeVtpXSk7Ci0JfQotCi0gICAgICBoaXN0b3J5X2Jhc2UgPSBpOwotICAgICAgZm9yIChqID0gMCwgaSA9IGhpc3RvcnlfbGVuZ3RoIC0gbWF4OyBqIDwgbWF4OyBpKyssIGorKykKLQl0aGVfaGlzdG9yeVtqXSA9IHRoZV9oaXN0b3J5W2ldOwotICAgICAgdGhlX2hpc3Rvcnlbal0gPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0gICAgICBoaXN0b3J5X2xlbmd0aCA9IGo7Ci0gICAgfQotCi0gIGhpc3Rvcnlfc3RpZmxlZCA9IDE7Ci0gIG1heF9pbnB1dF9oaXN0b3J5ID0gbWF4OwotfQotCi0vKiBTdG9wIHN0aWZsaW5nIHRoZSBoaXN0b3J5LiAgVGhpcyByZXR1cm5zIHRoZSBwcmV2aW91cyBhbW91bnQgdGhlIAotICAgaGlzdG9yeSB3YXMgc3RpZmxlZCBieS4gIFRoZSB2YWx1ZSBpcyBwb3NpdGl2ZSBpZiB0aGUgaGlzdG9yeSB3YXMKLSAgIHN0aWZsZWQsICBuZWdhdGl2ZSBpZiBpdCB3YXNuJ3QuICovCi1pbnQKLXVuc3RpZmxlX2hpc3RvcnkgKCkKLXsKLSAgaWYgKGhpc3Rvcnlfc3RpZmxlZCkKLSAgICB7Ci0gICAgICBoaXN0b3J5X3N0aWZsZWQgPSAwOwotICAgICAgcmV0dXJuICgtbWF4X2lucHV0X2hpc3RvcnkpOwotICAgIH0KLQotICByZXR1cm4gKG1heF9pbnB1dF9oaXN0b3J5KTsKLX0KLQotaW50Ci1oaXN0b3J5X2lzX3N0aWZsZWQgKCkKLXsKLSAgcmV0dXJuIChoaXN0b3J5X3N0aWZsZWQpOwotfQotCi12b2lkCi1jbGVhcl9oaXN0b3J5ICgpCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIC8qIFRoaXMgbG9zZXMgYmVjYXVzZSB3ZSBjYW5ub3QgZnJlZSB0aGUgZGF0YS4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGhpc3RvcnlfbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZnJlZSAodGhlX2hpc3RvcnlbaV0tPmxpbmUpOwotICAgICAgZnJlZSAodGhlX2hpc3RvcnlbaV0pOwotICAgICAgdGhlX2hpc3RvcnlbaV0gPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0gICAgfQotCi0gIGhpc3Rvcnlfb2Zmc2V0ID0gaGlzdG9yeV9sZW5ndGggPSAwOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvaGlzdG9yeS5oIGIvcmVhZGxpbmUvaGlzdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWNjZTcyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2hpc3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKiBIaXN0b3J5LmggLS0gdGhlIG5hbWVzIG9mIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gY2FsbCBpbiBoaXN0b3J5LiAqLwotLyogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgKHRoZSBMaWJyYXJ5KSwgYSBzZXQgb2YKLSAgIHJvdXRpbmVzIGZvciBtYW5hZ2luZyB0aGUgdGV4dCBvZiBwcmV2aW91c2x5IHR5cGVkIGxpbmVzLgotCi0gICBUaGUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWZuZGVmIF9ISVNUT1JZX0hfCi0jZGVmaW5lIF9ISVNUT1JZX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgUkVBRExJTkVfTElCUkFSWQotIyAgaW5jbHVkZSAicmxzdGRjLmgiCi0jZWxzZQotIyAgaW5jbHVkZSA8cmVhZGxpbmUvcmxzdGRjLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfRlVOQ1RJT05fREVGKQotIyAgZGVmaW5lIF9GVU5DVElPTl9ERUYKLXR5cGVkZWYgaW50IEZ1bmN0aW9uICgpOwotdHlwZWRlZiB2b2lkIFZGdW5jdGlvbiAoKTsKLXR5cGVkZWYgY2hhciAqQ1BGdW5jdGlvbiAoKTsKLXR5cGVkZWYgY2hhciAqKkNQUEZ1bmN0aW9uICgpOwotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfXwotdHlwZWRlZiB2b2lkICpoaXN0ZGF0YV90OwotI2Vsc2UKLXR5cGVkZWYgY2hhciAqaGlzdGRhdGFfdDsKLSNlbmRpZgotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSBoaXN0b3J5IGVudHJ5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2hpc3RfZW50cnkgewotICBjaGFyICpsaW5lOwotICBoaXN0ZGF0YV90IGRhdGE7Ci19IEhJU1RfRU5UUlk7Ci0KLS8qIEEgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaGlzdG9yeSBzdHVmZiBhcm91bmQuICovCi10eXBlZGVmIHN0cnVjdCBfaGlzdF9zdGF0ZSB7Ci0gIEhJU1RfRU5UUlkgKiplbnRyaWVzOwkJLyogUG9pbnRlciB0byB0aGUgZW50cmllcyB0aGVtc2VsdmVzLiAqLwotICBpbnQgb2Zmc2V0OwkJCS8qIFRoZSBsb2NhdGlvbiBwb2ludGVyIHdpdGhpbiB0aGlzIGFycmF5LiAqLwotICBpbnQgbGVuZ3RoOwkJCS8qIE51bWJlciBvZiBlbGVtZW50cyB3aXRoaW4gdGhpcyBhcnJheS4gKi8KLSAgaW50IHNpemU7CQkJLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZCB0byB0aGlzIGFycmF5LiAqLwotICBpbnQgZmxhZ3M7Ci19IEhJU1RPUllfU1RBVEU7Ci0KLS8qIEZsYWcgdmFsdWVzIGZvciB0aGUgYGZsYWdzJyBtZW1iZXIgb2YgSElTVE9SWV9TVEFURS4gKi8KLSNkZWZpbmUgSFNfU1RJRkxFRAkweDAxCi0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBzdGF0ZSBtYW5hZ2VtZW50LiAqLwotCi0vKiBCZWdpbiBhIHNlc3Npb24gaW4gd2hpY2ggdGhlIGhpc3RvcnkgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQuICBUaGlzCi0gICBqdXN0IGluaXRpYWxpemVzIHRoZSBpbnRlcmFjdGl2ZSB2YXJpYWJsZXMuICovCi1leHRlcm4gdm9pZCB1c2luZ19oaXN0b3J5IF9fUCgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgSElTVE9SWV9TVEFURSBvZiB0aGUgaGlzdG9yeS4gKi8KLWV4dGVybiBISVNUT1JZX1NUQVRFICpoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlIF9fUCgodm9pZCkpOwotCi0vKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGhpc3RvcnkgYXJyYXkgdG8gU1RBVEUuICovCi1leHRlcm4gdm9pZCBoaXN0b3J5X3NldF9oaXN0b3J5X3N0YXRlIF9fUCgoSElTVE9SWV9TVEFURSAqKSk7Ci0KLS8qIE1hbmFnZSB0aGUgaGlzdG9yeSBsaXN0LiAqLwotCi0vKiBQbGFjZSBTVFJJTkcgYXQgdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsaXN0LgotICAgVGhlIGFzc29jaWF0ZWQgZGF0YSBmaWVsZCAoaWYgYW55KSBpcyBzZXQgdG8gTlVMTC4gKi8KLWV4dGVybiB2b2lkIGFkZF9oaXN0b3J5IF9fUCgoY2hhciAqKSk7Ci0KLS8qIEEgcmVhc29uYWJseSB1c2VsZXNzIGZ1bmN0aW9uLCBvbmx5IGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4gIFdISUNICi0gICBpcyB0aGUgbWFnaWMgbnVtYmVyIHRoYXQgdGVsbHMgdXMgd2hpY2ggZWxlbWVudCB0byBkZWxldGUuICBUaGUKLSAgIGVsZW1lbnRzIGFyZSBudW1iZXJlZCBmcm9tIDAuICovCi1leHRlcm4gSElTVF9FTlRSWSAqcmVtb3ZlX2hpc3RvcnkgX19QKChpbnQpKTsKLQotLyogTWFrZSB0aGUgaGlzdG9yeSBlbnRyeSBhdCBXSElDSCBoYXZlIExJTkUgYW5kIERBVEEuICBUaGlzIHJldHVybnMKLSAgIHRoZSBvbGQgZW50cnkgc28geW91IGNhbiBkaXNwb3NlIG9mIHRoZSBkYXRhLiAgSW4gdGhlIGNhc2Ugb2YgYW4KLSAgIGludmFsaWQgV0hJQ0gsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLiAqLwotZXh0ZXJuIEhJU1RfRU5UUlkgKnJlcGxhY2VfaGlzdG9yeV9lbnRyeSBfX1AoKGludCwgY2hhciAqLCBoaXN0ZGF0YV90KSk7Ci0KLS8qIENsZWFyIHRoZSBoaXN0b3J5IGxpc3QgYW5kIHN0YXJ0IG92ZXIuICovCi1leHRlcm4gdm9pZCBjbGVhcl9oaXN0b3J5IF9fUCgodm9pZCkpOwotCi0vKiBTdGlmbGUgdGhlIGhpc3RvcnkgbGlzdCwgcmVtZW1iZXJpbmcgb25seSBNQVggbnVtYmVyIG9mIGVudHJpZXMuICovCi1leHRlcm4gdm9pZCBzdGlmbGVfaGlzdG9yeSBfX1AoKGludCkpOwotCi0vKiBTdG9wIHN0aWZsaW5nIHRoZSBoaXN0b3J5LiAgVGhpcyByZXR1cm5zIHRoZSBwcmV2aW91cyBhbW91bnQgdGhlCi0gICBoaXN0b3J5IHdhcyBzdGlmbGVkIGJ5LiAgVGhlIHZhbHVlIGlzIHBvc2l0aXZlIGlmIHRoZSBoaXN0b3J5IHdhcwotICAgc3RpZmxlZCwgbmVnYXRpdmUgaWYgaXQgd2Fzbid0LiAqLwotZXh0ZXJuIGludCB1bnN0aWZsZV9oaXN0b3J5IF9fUCgodm9pZCkpOwotCi0vKiBSZXR1cm4gMSBpZiB0aGUgaGlzdG9yeSBpcyBzdGlmbGVkLCAwIGlmIGl0IGlzIG5vdC4gKi8KLWV4dGVybiBpbnQgaGlzdG9yeV9pc19zdGlmbGVkIF9fUCgodm9pZCkpOwotCi0vKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaGlzdG9yeSBsaXN0LiAqLwotCi0vKiBSZXR1cm4gYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgSElTVF9FTlRSWSB3aGljaCBpcyB0aGUgY3VycmVudCBpbnB1dAotICAgaGlzdG9yeS4gIEVsZW1lbnQgMCBvZiB0aGlzIGxpc3QgaXMgdGhlIGJlZ2lubmluZyBvZiB0aW1lLiAgSWYgdGhlcmUKLSAgIGlzIG5vIGhpc3RvcnksIHJldHVybiBOVUxMLiAqLwotZXh0ZXJuIEhJU1RfRU5UUlkgKipoaXN0b3J5X2xpc3QgX19QKCh2b2lkKSk7Ci0KLS8qIFJldHVybnMgdGhlIG51bWJlciB3aGljaCBzYXlzIHdoYXQgaGlzdG9yeSBlbGVtZW50IHdlIGFyZSBub3cKLSAgIGxvb2tpbmcgYXQuICAqLwotZXh0ZXJuIGludCB3aGVyZV9oaXN0b3J5IF9fUCgodm9pZCkpOwotICAKLS8qIFJldHVybiB0aGUgaGlzdG9yeSBlbnRyeSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYXMgZGV0ZXJtaW5lZCBieQotICAgaGlzdG9yeV9vZmZzZXQuICBJZiB0aGVyZSBpcyBubyBlbnRyeSB0aGVyZSwgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAqLwotSElTVF9FTlRSWSAqY3VycmVudF9oaXN0b3J5IF9fUCgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIGhpc3RvcnkgZW50cnkgd2hpY2ggaXMgbG9naWNhbGx5IGF0IE9GRlNFVCBpbiB0aGUgaGlzdG9yeQotICAgYXJyYXkuICBPRkZTRVQgaXMgcmVsYXRpdmUgdG8gaGlzdG9yeV9iYXNlLiAqLwotZXh0ZXJuIEhJU1RfRU5UUlkgKmhpc3RvcnlfZ2V0IF9fUCgoaW50KSk7Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHByaW1hcnkgaGlzdG9yeSBlbnRyaWVzIGFyZSB1c2luZy4KLSAgIFRoaXMganVzdCBhZGRzIHVwIHRoZSBsZW5ndGhzIG9mIHRoZV9oaXN0b3J5LT5saW5lcy4gKi8KLWV4dGVybiBpbnQgaGlzdG9yeV90b3RhbF9ieXRlcyBfX1AoKHZvaWQpKTsKLQotLyogTW92aW5nIGFyb3VuZCB0aGUgaGlzdG9yeSBsaXN0LiAqLwotCi0vKiBTZXQgdGhlIHBvc2l0aW9uIGluIHRoZSBoaXN0b3J5IGxpc3QgdG8gUE9TLiAqLwotaW50IGhpc3Rvcnlfc2V0X3BvcyBfX1AoKGludCkpOwotCi0vKiBCYWNrIHVwIGhpc3Rvcnlfb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyBoaXN0b3J5IGVudHJ5LCBhbmQgcmV0dXJuCi0gICBhIHBvaW50ZXIgdG8gdGhhdCBlbnRyeS4gIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGVudHJ5LCByZXR1cm4KLSAgIGEgTlVMTCBwb2ludGVyLiAqLwotZXh0ZXJuIEhJU1RfRU5UUlkgKnByZXZpb3VzX2hpc3RvcnkgX19QKCh2b2lkKSk7Ci0KLS8qIE1vdmUgaGlzdG9yeV9vZmZzZXQgZm9yd2FyZCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBpbnB1dF9oaXN0b3J5LAotICAgYW5kIHJldHVybiB0aGUgYSBwb2ludGVyIHRvIHRoYXQgZW50cnkuICBJZiB0aGVyZSBpcyBubyBuZXh0IGVudHJ5LAotICAgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAqLwotZXh0ZXJuIEhJU1RfRU5UUlkgKm5leHRfaGlzdG9yeSBfX1AoKHZvaWQpKTsKLQotLyogU2VhcmNoaW5nIHRoZSBoaXN0b3J5IGxpc3QuICovCi0KLS8qIFNlYXJjaCB0aGUgaGlzdG9yeSBmb3IgU1RSSU5HLCBzdGFydGluZyBhdCBoaXN0b3J5X29mZnNldC4KLSAgIElmIERJUkVDVElPTiA8IDAsIHRoZW4gdGhlIHNlYXJjaCBpcyB0aHJvdWdoIHByZXZpb3VzIGVudHJpZXMsCi0gICBlbHNlIHRocm91Z2ggc3Vic2VxdWVudC4gIElmIHRoZSBzdHJpbmcgaXMgZm91bmQsIHRoZW4KLSAgIGN1cnJlbnRfaGlzdG9yeSAoKSBpcyB0aGUgaGlzdG9yeSBlbnRyeSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uCi0gICBpcyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lIG9mIHRoYXQgaGlzdG9yeSBlbnRyeSB0aGF0IHRoZSBzdHJpbmcgd2FzCi0gICBmb3VuZCBpbi4gIE90aGVyd2lzZSwgbm90aGluZyBpcyBjaGFuZ2VkLCBhbmQgYSAtMSBpcyByZXR1cm5lZC4gKi8KLWV4dGVybiBpbnQgaGlzdG9yeV9zZWFyY2ggX19QKChjaGFyICosIGludCkpOwotCi0vKiBTZWFyY2ggdGhlIGhpc3RvcnkgZm9yIFNUUklORywgc3RhcnRpbmcgYXQgaGlzdG9yeV9vZmZzZXQuCi0gICBUaGUgc2VhcmNoIGlzIGFuY2hvcmVkOiBtYXRjaGluZyBsaW5lcyBtdXN0IGJlZ2luIHdpdGggc3RyaW5nLgotICAgRElSRUNUSU9OIGlzIGFzIGluIGhpc3Rvcnlfc2VhcmNoKCkuICovCi1leHRlcm4gaW50IGhpc3Rvcnlfc2VhcmNoX3ByZWZpeCBfX1AoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIFNlYXJjaCBmb3IgU1RSSU5HIGluIHRoZSBoaXN0b3J5IGxpc3QsIHN0YXJ0aW5nIGF0IFBPUywgYW4KLSAgIGFic29sdXRlIGluZGV4IGludG8gdGhlIGxpc3QuICBESVIsIGlmIG5lZ2F0aXZlLCBzYXlzIHRvIHNlYXJjaAotICAgYmFja3dhcmRzIGZyb20gUE9TLCBlbHNlIGZvcndhcmRzLgotICAgUmV0dXJucyB0aGUgYWJzb2x1dGUgaW5kZXggb2YgdGhlIGhpc3RvcnkgZWxlbWVudCB3aGVyZSBTVFJJTkcKLSAgIHdhcyBmb3VuZCwgb3IgLTEgb3RoZXJ3aXNlLiAqLwotZXh0ZXJuIGludCBoaXN0b3J5X3NlYXJjaF9wb3MgX19QKChjaGFyICosIGludCwgaW50KSk7Ci0KLS8qIE1hbmFnaW5nIHRoZSBoaXN0b3J5IGZpbGUuICovCi0KLS8qIEFkZCB0aGUgY29udGVudHMgb2YgRklMRU5BTUUgdG8gdGhlIGhpc3RvcnkgbGlzdCwgYSBsaW5lIGF0IGEgdGltZS4KLSAgIElmIEZJTEVOQU1FIGlzIE5VTEwsIHRoZW4gcmVhZCBmcm9tIH4vLmhpc3RvcnkuICBSZXR1cm5zIDAgaWYKLSAgIHN1Y2Nlc3NmdWwsIG9yIGVycm5vIGlmIG5vdC4gKi8KLWV4dGVybiBpbnQgcmVhZF9oaXN0b3J5IF9fUCgoY2hhciAqKSk7Ci0KLS8qIFJlYWQgYSByYW5nZSBvZiBsaW5lcyBmcm9tIEZJTEVOQU1FLCBhZGRpbmcgdGhlbSB0byB0aGUgaGlzdG9yeSBsaXN0LgotICAgU3RhcnQgcmVhZGluZyBhdCB0aGUgRlJPTSd0aCBsaW5lIGFuZCBlbmQgYXQgdGhlIFRPJ3RoLiAgSWYgRlJPTQotICAgaXMgemVybywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4gIElmIFRPIGlzIGxlc3MgdGhhbiBGUk9NLCByZWFkCi0gICB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgRklMRU5BTUUgaXMgTlVMTCwgdGhlbiByZWFkIGZyb20KLSAgIH4vLmhpc3RvcnkuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgZXJybm8gaWYgbm90LiAqLwotZXh0ZXJuIGludCByZWFkX2hpc3RvcnlfcmFuZ2UgX19QKChjaGFyICosIGludCwgaW50KSk7Ci0KLS8qIFdyaXRlIHRoZSBjdXJyZW50IGhpc3RvcnkgdG8gRklMRU5BTUUuICBJZiBGSUxFTkFNRSBpcyBOVUxMLAotICAgdGhlbiB3cml0ZSB0aGUgaGlzdG9yeSBsaXN0IHRvIH4vLmhpc3RvcnkuICBWYWx1ZXMgcmV0dXJuZWQKLSAgIGFyZSBhcyBpbiByZWFkX2hpc3RvcnkgKCkuICAqLwotZXh0ZXJuIGludCB3cml0ZV9oaXN0b3J5IF9fUCgoY2hhciAqKSk7Ci0KLS8qIEFwcGVuZCBORUxFTUVOVCBlbnRyaWVzIHRvIEZJTEVOQU1FLiAgVGhlIGVudHJpZXMgYXBwZW5kZWQgYXJlIGZyb20KLSAgIHRoZSBlbmQgb2YgdGhlIGxpc3QgbWludXMgTkVMRU1FTlRzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICovCi1pbnQgYXBwZW5kX2hpc3RvcnkgX19QKChpbnQsIGNoYXIgKikpOwotCi0vKiBUcnVuY2F0ZSB0aGUgaGlzdG9yeSBmaWxlLCBsZWF2aW5nIG9ubHkgdGhlIGxhc3QgTkxJTkVTIGxpbmVzLiAqLwotZXh0ZXJuIGludCBoaXN0b3J5X3RydW5jYXRlX2ZpbGUgX19QKChjaGFyICosIGludCkpOwotCi0vKiBIaXN0b3J5IGV4cGFuc2lvbi4gKi8KLQotLyogRXhwYW5kIHRoZSBzdHJpbmcgU1RSSU5HLCBwbGFjaW5nIHRoZSByZXN1bHQgaW50byBPVVRQVVQsIGEgcG9pbnRlcgotICAgdG8gYSBzdHJpbmcuICBSZXR1cm5zOgotCi0gICAwKSBJZiBubyBleHBhbnNpb25zIHRvb2sgcGxhY2UgKG9yLCBpZiB0aGUgb25seSBjaGFuZ2UgaW4KLSAgICAgIHRoZSB0ZXh0IHdhcyB0aGUgZGUtc2xhc2hpZnlpbmcgb2YgdGhlIGhpc3RvcnkgZXhwYW5zaW9uCi0gICAgICBjaGFyYWN0ZXIpCi0gICAxKSBJZiBleHBhbnNpb25zIGRpZCB0YWtlIHBsYWNlCi0gIC0xKSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gZXhwYW5zaW9uLgotICAgMikgSWYgdGhlIHJldHVybmVkIGxpbmUgc2hvdWxkIGp1c3QgYmUgcHJpbnRlZC4KLQotICBJZiBhbiBlcnJvciBvY3VycmVkIGluIGV4cGFuc2lvbiwgdGhlbiBPVVRQVVQgY29udGFpbnMgYSBkZXNjcmlwdGl2ZQotICBlcnJvciBtZXNzYWdlLiAqLwotZXh0ZXJuIGludCBoaXN0b3J5X2V4cGFuZCBfX1AoKGNoYXIgKiwgY2hhciAqKikpOwotCi0vKiBFeHRyYWN0IGEgc3RyaW5nIHNlZ21lbnQgY29uc2lzdGluZyBvZiB0aGUgRklSU1QgdGhyb3VnaCBMQVNUCi0gICBhcmd1bWVudHMgcHJlc2VudCBpbiBTVFJJTkcuICBBcmd1bWVudHMgYXJlIGJyb2tlbiB1cCBhcyBpbgotICAgdGhlIHNoZWxsLiAqLwotZXh0ZXJuIGNoYXIgKmhpc3RvcnlfYXJnX2V4dHJhY3QgX19QKChpbnQsIGludCwgY2hhciAqKSk7Ci0KLS8qIFJldHVybiB0aGUgdGV4dCBvZiB0aGUgaGlzdG9yeSBldmVudCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQKLSAgIG9mZnNldCBpbnRvIFNUUklORy4gIFBhc3MgU1RSSU5HIHdpdGggKklOREVYIGVxdWFsIHRvIHRoZQotICAgaGlzdG9yeV9leHBhbnNpb25fY2hhciB0aGF0IGJlZ2lucyB0aGlzIHNwZWNpZmljYXRpb24uCi0gICBERUxJTUlUSU5HX1FVT1RFIGlzIGEgY2hhcmFjdGVyIHRoYXQgaXMgYWxsb3dlZCB0byBlbmQgdGhlIHN0cmluZwotICAgc3BlY2lmaWNhdGlvbiBmb3Igd2hhdCB0byBzZWFyY2ggZm9yIGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwKLSAgIGNoYXJhY3RlcnMgYDonLCBgICcsIGBcdCcsIGBcbicsIGFuZCBzb21ldGltZXMgYD8nLiAqLwotZXh0ZXJuIGNoYXIgKmdldF9oaXN0b3J5X2V2ZW50IF9fUCgoY2hhciAqLCBpbnQgKiwgaW50KSk7Ci0KLS8qIFJldHVybiBhbiBhcnJheSBvZiB0b2tlbnMsIG11Y2ggYXMgdGhlIHNoZWxsIG1pZ2h0LiAgVGhlIHRva2VucyBhcmUKLSAgIHBhcnNlZCBvdXQgb2YgU1RSSU5HLiAqLwotZXh0ZXJuIGNoYXIgKipoaXN0b3J5X3Rva2VuaXplIF9fUCgoY2hhciAqKSk7Ci0KLS8qIEV4cG9ydGVkIGhpc3RvcnkgdmFyaWFibGVzLiAqLwotZXh0ZXJuIGludCBoaXN0b3J5X2Jhc2U7Ci1leHRlcm4gaW50IGhpc3RvcnlfbGVuZ3RoOwotZXh0ZXJuIGludCBtYXhfaW5wdXRfaGlzdG9yeTsKLWV4dGVybiBjaGFyIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXI7Ci1leHRlcm4gY2hhciBoaXN0b3J5X3N1YnN0X2NoYXI7Ci1leHRlcm4gY2hhciBoaXN0b3J5X2NvbW1lbnRfY2hhcjsKLWV4dGVybiBjaGFyICpoaXN0b3J5X25vX2V4cGFuZF9jaGFyczsKLWV4dGVybiBjaGFyICpoaXN0b3J5X3NlYXJjaF9kZWxpbWl0ZXJfY2hhcnM7Ci1leHRlcm4gaW50IGhpc3RvcnlfcXVvdGVzX2luaGliaXRfZXhwYW5zaW9uOwotCi0vKiBJZiBzZXQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBhIHBhcnRpY3VsYXIKLSAgIGhpc3RvcnkgZXhwYW5zaW9uIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgY2FsbGluZwotICAgYXBwbGljYXRpb24gYW5kIG5vdCBleHBhbmRlZC4gKi8KLWV4dGVybiBGdW5jdGlvbiAqaGlzdG9yeV9pbmhpYml0X2V4cGFuc2lvbl9mdW5jdGlvbjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfSElTVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvaGlzdHNlYXJjaC5jIGIvcmVhZGxpbmUvaGlzdHNlYXJjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk4ZTk1Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2hpc3RzZWFyY2guYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKiBoaXN0c2VhcmNoLmMgLS0gc2VhcmNoaW5nIHRoZSBoaXN0b3J5IGxpc3QuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHTlUgSGlzdG9yeSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgbWFuYWdpbmcgdGhlIHRleHQgb2YgcHJldmlvdXNseSB0eXBlZCBsaW5lcy4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLwotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpZmRlZiBfTUlOSVgKLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmIC8qICFIQVZFX1NUUklOR19IICovCi0KLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0jaW5jbHVkZSAiaGlzdGxpYi5oIgotCi0vKiBWYXJpYWJsZXMgaW1wb3J0ZWQgZnJvbSBvdGhlciBoaXN0b3J5IGxpYnJhcnkgZmlsZXMuICovCi1leHRlcm4gaW50IGhpc3Rvcnlfb2Zmc2V0OwotCi0vKiBUaGUgbGlzdCBvZiBhbHRlcm5hdGUgY2hhcmFjdGVycyB0aGF0IGNhbiBkZWxpbWl0IGEgaGlzdG9yeSBzZWFyY2gKLSAgIHN0cmluZy4gKi8KLWNoYXIgKmhpc3Rvcnlfc2VhcmNoX2RlbGltaXRlcl9jaGFycyA9IChjaGFyICopTlVMTDsKLQotLyogU2VhcmNoIHRoZSBoaXN0b3J5IGZvciBTVFJJTkcsIHN0YXJ0aW5nIGF0IGhpc3Rvcnlfb2Zmc2V0LgotICAgSWYgRElSRUNUSU9OIDwgMCwgdGhlbiB0aGUgc2VhcmNoIGlzIHRocm91Z2ggcHJldmlvdXMgZW50cmllcywgZWxzZQotICAgdGhyb3VnaCBzdWJzZXF1ZW50LiAgSWYgQU5DSE9SRUQgaXMgbm9uLXplcm8sIHRoZSBzdHJpbmcgbXVzdAotICAgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBoaXN0b3J5IGxpbmUsIG90aGVyd2lzZSwgdGhlIHN0cmluZwotICAgbWF5IGFwcGVhciBhbnl3aGVyZSBpbiB0aGUgbGluZS4gIElmIHRoZSBzdHJpbmcgaXMgZm91bmQsIHRoZW4KLSAgIGN1cnJlbnRfaGlzdG9yeSAoKSBpcyB0aGUgaGlzdG9yeSBlbnRyeSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGlzCi0gICBmdW5jdGlvbiBpcyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lIG9mIHRoYXQgaGlzdG9yeSBlbnRyeSB0aGF0IHRoZQotICAgc3RyaW5nIHdhcyBmb3VuZCBpbi4gIE90aGVyd2lzZSwgbm90aGluZyBpcyBjaGFuZ2VkLCBhbmQgYSAtMSBpcwotICAgcmV0dXJuZWQuICovCi0KLXN0YXRpYyBpbnQKLWhpc3Rvcnlfc2VhcmNoX2ludGVybmFsIChzdHJpbmcsIGRpcmVjdGlvbiwgYW5jaG9yZWQpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IGRpcmVjdGlvbiwgYW5jaG9yZWQ7Ci17Ci0gIHJlZ2lzdGVyIGludCBpLCByZXZlcnNlOwotICByZWdpc3RlciBjaGFyICpsaW5lOwotICByZWdpc3RlciBpbnQgbGluZV9pbmRleDsKLSAgaW50IHN0cmluZ19sZW47Ci0gIEhJU1RfRU5UUlkgKip0aGVfaGlzdG9yeTsgCS8qIGxvY2FsICovCi0KLSAgaSA9IGhpc3Rvcnlfb2Zmc2V0OwotICByZXZlcnNlID0gKGRpcmVjdGlvbiA8IDApOwotCi0gIC8qIFRha2UgY2FyZSBvZiB0cml2aWFsIGNhc2VzIGZpcnN0LiAqLwotICBpZiAoc3RyaW5nID09IDAgfHwgKnN0cmluZyA9PSAnXDAnKQotICAgIHJldHVybiAoLTEpOwotCi0gIGlmICghaGlzdG9yeV9sZW5ndGggfHwgKChpID09IGhpc3RvcnlfbGVuZ3RoKSAmJiAhcmV2ZXJzZSkpCi0gICAgcmV0dXJuICgtMSk7Ci0KLSAgaWYgKHJldmVyc2UgJiYgKGkgPT0gaGlzdG9yeV9sZW5ndGgpKQotICAgIGktLTsKLQotI2RlZmluZSBORVhUX0xJTkUoKSBkbyB7IGlmIChyZXZlcnNlKSBpLS07IGVsc2UgaSsrOyB9IHdoaWxlICgwKQotCi0gIHRoZV9oaXN0b3J5ID0gaGlzdG9yeV9saXN0ICgpOwotICBzdHJpbmdfbGVuID0gc3RybGVuIChzdHJpbmcpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBTZWFyY2ggZWFjaCBsaW5lIGluIHRoZSBoaXN0b3J5IGxpc3QgZm9yIFNUUklORy4gKi8KLQotICAgICAgLyogQXQgbGltaXQgZm9yIGRpcmVjdGlvbj8gKi8KLSAgICAgIGlmICgocmV2ZXJzZSAmJiBpIDwgMCkgfHwgKCFyZXZlcnNlICYmIGkgPT0gaGlzdG9yeV9sZW5ndGgpKQotCXJldHVybiAoLTEpOwotCi0gICAgICBsaW5lID0gdGhlX2hpc3RvcnlbaV0tPmxpbmU7Ci0gICAgICBsaW5lX2luZGV4ID0gc3RybGVuIChsaW5lKTsKLQotICAgICAgLyogSWYgU1RSSU5HIGlzIGxvbmdlciB0aGFuIGxpbmUsIG5vIG1hdGNoLiAqLwotICAgICAgaWYgKHN0cmluZ19sZW4gPiBsaW5lX2luZGV4KQotCXsKLQkgIE5FWFRfTElORSAoKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFuZGxlIGFuY2hvcmVkIHNlYXJjaGVzIGZpcnN0LiAqLwotICAgICAgaWYgKGFuY2hvcmVkID09IEFOQ0hPUkVEX1NFQVJDSCkKLQl7Ci0JICBpZiAoU1RSRVFOIChzdHJpbmcsIGxpbmUsIHN0cmluZ19sZW4pKQotCSAgICB7Ci0JICAgICAgaGlzdG9yeV9vZmZzZXQgPSBpOwotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQotCSAgTkVYVF9MSU5FICgpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBEbyBzdWJzdHJpbmcgc2VhcmNoLiAqLwotICAgICAgaWYgKHJldmVyc2UpCi0JewotCSAgbGluZV9pbmRleCAtPSBzdHJpbmdfbGVuOwotCi0JICB3aGlsZSAobGluZV9pbmRleCA+PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKFNUUkVRTiAoc3RyaW5nLCBsaW5lICsgbGluZV9pbmRleCwgc3RyaW5nX2xlbikpCi0JCXsKLQkJICBoaXN0b3J5X29mZnNldCA9IGk7Ci0JCSAgcmV0dXJuIChsaW5lX2luZGV4KTsKLQkJfQotCSAgICAgIGxpbmVfaW5kZXgtLTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBpbnQgbGltaXQ7Ci0KLQkgIGxpbWl0ID0gbGluZV9pbmRleCAtIHN0cmluZ19sZW4gKyAxOwotCSAgbGluZV9pbmRleCA9IDA7Ci0KLQkgIHdoaWxlIChsaW5lX2luZGV4IDwgbGltaXQpCi0JICAgIHsKLQkgICAgICBpZiAoU1RSRVFOIChzdHJpbmcsIGxpbmUgKyBsaW5lX2luZGV4LCBzdHJpbmdfbGVuKSkKLQkJewotCQkgIGhpc3Rvcnlfb2Zmc2V0ID0gaTsKLQkJICByZXR1cm4gKGxpbmVfaW5kZXgpOwotCQl9Ci0JICAgICAgbGluZV9pbmRleCsrOwotCSAgICB9Ci0JfQotICAgICAgTkVYVF9MSU5FICgpOwotICAgIH0KLX0KLQotLyogRG8gYSBub24tYW5jaG9yZWQgc2VhcmNoIGZvciBTVFJJTkcgdGhyb3VnaCB0aGUgaGlzdG9yeSBpbiBESVJFQ1RJT04uICovCi1pbnQKLWhpc3Rvcnlfc2VhcmNoIChzdHJpbmcsIGRpcmVjdGlvbikKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICByZXR1cm4gKGhpc3Rvcnlfc2VhcmNoX2ludGVybmFsIChzdHJpbmcsIGRpcmVjdGlvbiwgTk9OX0FOQ0hPUkVEX1NFQVJDSCkpOwotfQotCi0vKiBEbyBhbiBhbmNob3JlZCBzZWFyY2ggZm9yIHN0cmluZyB0aHJvdWdoIHRoZSBoaXN0b3J5IGluIERJUkVDVElPTi4gKi8KLWludAotaGlzdG9yeV9zZWFyY2hfcHJlZml4IChzdHJpbmcsIGRpcmVjdGlvbikKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICByZXR1cm4gKGhpc3Rvcnlfc2VhcmNoX2ludGVybmFsIChzdHJpbmcsIGRpcmVjdGlvbiwgQU5DSE9SRURfU0VBUkNIKSk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgU1RSSU5HIGluIHRoZSBoaXN0b3J5IGxpc3QuICBESVIgaXMgPCAwIGZvciBzZWFyY2hpbmcKLSAgIGJhY2t3YXJkcy4gIFBPUyBpcyBhbiBhYnNvbHV0ZSBpbmRleCBpbnRvIHRoZSBoaXN0b3J5IGxpc3QgYXQKLSAgIHdoaWNoIHBvaW50IHRvIGJlZ2luIHNlYXJjaGluZy4gKi8KLWludAotaGlzdG9yeV9zZWFyY2hfcG9zIChzdHJpbmcsIGRpciwgcG9zKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBkaXIsIHBvczsKLXsKLSAgaW50IHJldCwgb2xkOwotCi0gIG9sZCA9IHdoZXJlX2hpc3RvcnkgKCk7Ci0gIGhpc3Rvcnlfc2V0X3BvcyAocG9zKTsKLSAgaWYgKGhpc3Rvcnlfc2VhcmNoIChzdHJpbmcsIGRpcikgPT0gLTEpCi0gICAgewotICAgICAgaGlzdG9yeV9zZXRfcG9zIChvbGQpOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICByZXQgPSB3aGVyZV9oaXN0b3J5ICgpOwotICBoaXN0b3J5X3NldF9wb3MgKG9sZCk7Ci0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9yZWFkbGluZS9pbnB1dC5jIGIvcmVhZGxpbmUvaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiYTIzYy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9pbnB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qIGlucHV0LmMgLS0gY2hhcmFjdGVyIGlucHV0IGZ1bmN0aW9ucyBmb3IgcmVhZGxpbmUuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkIChIQVZFX1NZU19GSUxFX0gpCi0jICBpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX0ZJTEVfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU0VMRUNUKQotIyAgaWYgIWRlZmluZWQgKEhBVkVfU1lTX1NFTEVDVF9IKSB8fCAhZGVmaW5lZCAoTV9VTklYKQotIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgotIyAgZW5kaWYKLSNlbmRpZiAvKiBIQVZFX1NFTEVDVCAqLwotI2lmIGRlZmluZWQgKEhBVkVfU1lTX1NFTEVDVF9IKQotIyAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChGSU9OUkVBRF9JTl9TWVNfSU9DVEwpCi0jICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWYgIWRlZmluZWQgKGVycm5vKQotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZiAvKiAhZXJybm8gKi8KLQotLyogU3lzdGVtLXNwZWNpZmljIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgZmlsZXMuICovCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi0vKiBXaGF0IGtpbmQgb2Ygbm9uLWJsb2NraW5nIEkvTyBkbyB3ZSBoYXZlPyAqLwotI2lmICFkZWZpbmVkIChPX05ERUxBWSkgJiYgZGVmaW5lZCAoT19OT05CTE9DSykKLSMgIGRlZmluZSBPX05ERUxBWSBPX05PTkJMT0NLCS8qIFBvc2l4IHN0eWxlICovCi0jZW5kaWYKLQotLyogRnVuY3Rpb25zIGltcG9ydGVkIGZyb20gb3RoZXIgZmlsZXMgaW4gdGhlIGxpYnJhcnkuICovCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIG1hY3JvLmMuICovCi1leHRlcm4gdm9pZCBfcmxfYWRkX21hY3JvX2NoYXIgKCk7Ci1leHRlcm4gdm9pZCBfcmxfd2l0aF9tYWNyb19pbnB1dCAoKTsKLWV4dGVybiBpbnQgX3JsX25leHRfbWFjcm9fa2V5ICgpOwotZXh0ZXJuIGludCBfcmxfZGVmaW5pbmdfa2JkX21hY3JvOwotCi0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLWV4dGVybiB2b2lkIF9ybF92aV9zZXRfbGFzdCAoKTsKLWV4dGVybiBpbnQgX3JsX3ZpX3RleHRtb2RfY29tbWFuZCAoKTsKLSNlbmRpZiAvKiBWSV9NT0RFICovCi0KLWV4dGVybiBGSUxFICpybF9pbnN0cmVhbSwgKnJsX291dHN0cmVhbTsKLWV4dGVybiBGdW5jdGlvbiAqcmxfbGFzdF9mdW5jOwotZXh0ZXJuIGludCBybF9rZXlfc2VxdWVuY2VfbGVuZ3RoOwotZXh0ZXJuIGludCBybF9wZW5kaW5nX2lucHV0OwotZXh0ZXJuIGludCBybF9lZGl0aW5nX21vZGU7Ci0KLWV4dGVybiBLZXltYXAgX3JsX2tleW1hcDsKLQotZXh0ZXJuIGludCBfcmxfY29udmVydF9tZXRhX2NoYXJzX3RvX2FzY2lpOwotCi0jaWYgZGVmaW5lZCAoX19HTzMyX18pICYmICFkZWZpbmVkIChIQVZFX1NFTEVDVCkKLSMgIGluY2x1ZGUgPHBjLmg+Ci0jZW5kaWYgLyogX19HTzMyX18gKi8KLQotLyogTm9uLW51bGwgbWVhbnMgaXQgaXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gcnVuIHdoaWxlIHdhaXRpbmcgZm9yCi0gICBjaGFyYWN0ZXIgaW5wdXQuICovCi1GdW5jdGlvbiAqcmxfZXZlbnRfaG9vayA9IChGdW5jdGlvbiAqKU5VTEw7Ci0KLUZ1bmN0aW9uICpybF9nZXRjX2Z1bmN0aW9uID0gcmxfZ2V0YzsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlDaGFyYWN0ZXIgSW5wdXQgQnVmZmVyaW5nICAgICAgIAkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIGludCBwb3BfaW5kZXgsIHB1c2hfaW5kZXg7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBpYnVmZmVyWzUxMl07Ci1zdGF0aWMgaW50IGlidWZmZXJfbGVuID0gc2l6ZW9mIChpYnVmZmVyKSAtIDE7Ci0KLSNkZWZpbmUgYW55X3R5cGVpbiAocHVzaF9pbmRleCAhPSBwb3BfaW5kZXgpCi0KLWludAotX3JsX2FueV90eXBlaW4gKCkKLXsKLSAgcmV0dXJuIGFueV90eXBlaW47Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIGZvciBzdHVmZmluZwotICAgY2hhcmFjdGVycy4gKi8KLXN0YXRpYyBpbnQKLWlidWZmZXJfc3BhY2UgKCkKLXsKLSAgaWYgKHBvcF9pbmRleCA+IHB1c2hfaW5kZXgpCi0gICAgcmV0dXJuIChwb3BfaW5kZXggLSBwdXNoX2luZGV4IC0gMSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKGlidWZmZXJfbGVuIC0gKHB1c2hfaW5kZXggLSBwb3BfaW5kZXgpKTsKLX0KLQotLyogR2V0IGEga2V5IGZyb20gdGhlIGJ1ZmZlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQuCi0gICBSZXR1cm4gdGhlIGtleSBpbiBLRVkuCi0gICBSZXN1bHQgaXMgS0VZIGlmIHRoZXJlIHdhcyBhIGtleSwgb3IgMCBpZiB0aGVyZSB3YXNuJ3QuICovCi1zdGF0aWMgaW50Ci1ybF9nZXRfY2hhciAoa2V5KQotICAgICBpbnQgKmtleTsKLXsKLSAgaWYgKHB1c2hfaW5kZXggPT0gcG9wX2luZGV4KQotICAgIHJldHVybiAoMCk7Ci0KLSAgKmtleSA9IGlidWZmZXJbcG9wX2luZGV4KytdOwotCi0gIGlmIChwb3BfaW5kZXggPj0gaWJ1ZmZlcl9sZW4pCi0gICAgcG9wX2luZGV4ID0gMDsKLQotICByZXR1cm4gKDEpOwotfQotCi0vKiBTdHVmZiBLRVkgaW50byB0aGUgKmZyb250KiBvZiB0aGUgaW5wdXQgYnVmZmVyLgotICAgUmV0dXJucyBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIHRoZXJlIGlzCi0gICBubyBzcGFjZSBsZWZ0IGluIHRoZSBidWZmZXIuICovCi1zdGF0aWMgaW50Ci1ybF91bmdldF9jaGFyIChrZXkpCi0gICAgIGludCBrZXk7Ci17Ci0gIGlmIChpYnVmZmVyX3NwYWNlICgpKQotICAgIHsKLSAgICAgIHBvcF9pbmRleC0tOwotICAgICAgaWYgKHBvcF9pbmRleCA8IDApCi0JcG9wX2luZGV4ID0gaWJ1ZmZlcl9sZW4gLSAxOwotICAgICAgaWJ1ZmZlcltwb3BfaW5kZXhdID0ga2V5OwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIElmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWFkLCB0aGVuIHJlYWQgaXQKLSAgIGFuZCBzdHVmZiBpdCBpbnRvIElCVUZGRVIuICBPdGhlcndpc2UsIGp1c3QgcmV0dXJuLiAqLwotc3RhdGljIHZvaWQKLXJsX2dhdGhlcl90eWkgKCkKLXsKLSNpZiBkZWZpbmVkIChfX0dPMzJfXykgJiYgIWRlZmluZWQgKEhBVkVfU0VMRUNUKQotICBjaGFyIGlucHV0OwotCi0gIGlmIChpc2F0dHkgKDApICYmIGtiaGl0ICgpICYmIGlidWZmZXJfc3BhY2UgKCkpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpID0gKCpybF9nZXRjX2Z1bmN0aW9uKSAocmxfaW5zdHJlYW0pOwotICAgICAgcmxfc3R1ZmZfY2hhciAoaSk7Ci0gICAgfQotI2Vsc2UgLyogIV9fR08zMl9fICovCi0KLSAgaW50IHR0eTsKLSAgcmVnaXN0ZXIgaW50IHRlbSwgcmVzdWx0OwotICBpbnQgY2hhcnNfYXZhaWw7Ci0gIGNoYXIgaW5wdXQ7Ci0jaWYgZGVmaW5lZChIQVZFX1NFTEVDVCkKLSAgZmRfc2V0IHJlYWRmZHMsIGV4Y2VwdGZkczsKLSAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKLSNlbmRpZgotCi0gIHR0eSA9IGZpbGVubyAocmxfaW5zdHJlYW0pOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRUxFQ1QpCi0gIEZEX1pFUk8gKCZyZWFkZmRzKTsKLSAgRkRfWkVSTyAoJmV4Y2VwdGZkcyk7Ci0gIEZEX1NFVCAodHR5LCAmcmVhZGZkcyk7Ci0gIEZEX1NFVCAodHR5LCAmZXhjZXB0ZmRzKTsKLSAgdGltZW91dC50dl9zZWMgPSAwOwotICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CS8qIDAuMSBzZWNvbmRzICovCi0gIGlmIChzZWxlY3QgKHR0eSArIDEsICZyZWFkZmRzLCAoZmRfc2V0ICopTlVMTCwgJmV4Y2VwdGZkcywgJnRpbWVvdXQpIDw9IDApCi0gICAgcmV0dXJuOwkvKiBOb3RoaW5nIHRvIHJlYWQuICovCi0jZW5kaWYKLQotICByZXN1bHQgPSAtMTsKLSNpZiBkZWZpbmVkIChGSU9OUkVBRCkKLSAgcmVzdWx0ID0gaW9jdGwgKHR0eSwgRklPTlJFQUQsICZjaGFyc19hdmFpbCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE9fTkRFTEFZKQotICBpZiAocmVzdWx0ID09IC0xKQotICAgIHsKLSAgICAgIHRlbSA9IGZjbnRsICh0dHksIEZfR0VURkwsIDApOwotCi0gICAgICBmY250bCAodHR5LCBGX1NFVEZMLCAodGVtIHwgT19OREVMQVkpKTsKLSAgICAgIGNoYXJzX2F2YWlsID0gcmVhZCAodHR5LCAmaW5wdXQsIDEpOwotCi0gICAgICBmY250bCAodHR5LCBGX1NFVEZMLCB0ZW0pOwotICAgICAgaWYgKGNoYXJzX2F2YWlsID09IC0xICYmIGVycm5vID09IEVBR0FJTikKLQlyZXR1cm47Ci0gICAgfQotI2VuZGlmIC8qIE9fTkRFTEFZICovCi0KLSAgLyogSWYgdGhlcmUncyBub3RoaW5nIGF2YWlsYWJsZSwgZG9uJ3Qgd2FzdGUgdGltZSB0cnlpbmcgdG8gcmVhZAotICAgICBzb21ldGhpbmcuICovCi0gIGlmIChjaGFyc19hdmFpbCA8PSAwKQotICAgIHJldHVybjsKLQotICB0ZW0gPSBpYnVmZmVyX3NwYWNlICgpOwotCi0gIGlmIChjaGFyc19hdmFpbCA+IHRlbSkKLSAgICBjaGFyc19hdmFpbCA9IHRlbTsKLQotICAvKiBPbmUgY2Fubm90IHJlYWQgYWxsIG9mIHRoZSBhdmFpbGFibGUgaW5wdXQuICBJIGNhbiBvbmx5IHJlYWQgYSBzaW5nbGUKLSAgICAgY2hhcmFjdGVyIGF0IGEgdGltZSwgb3IgZWxzZSBwcm9ncmFtcyB3aGljaCByZXF1aXJlIGlucHV0IGNhbiBiZQotICAgICB0aHdhcnRlZC4gIElmIHRoZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gb25lIGNoYXJhY3RlciwgSSBsb3NlLgotICAgICBEYW1uISAqLwotICBpZiAodGVtIDwgaWJ1ZmZlcl9sZW4pCi0gICAgY2hhcnNfYXZhaWwgPSAwOwotCi0gIGlmIChyZXN1bHQgIT0gLTEpCi0gICAgewotICAgICAgd2hpbGUgKGNoYXJzX2F2YWlsLS0pCi0Jcmxfc3R1ZmZfY2hhciAoKCpybF9nZXRjX2Z1bmN0aW9uKSAocmxfaW5zdHJlYW0pKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNfYXZhaWwpCi0Jcmxfc3R1ZmZfY2hhciAoaW5wdXQpOwotICAgIH0KLSNlbmRpZiAvKiAhX19HTzMyX18gKi8KLX0KLQotLyogSXMgdGhlcmUgaW5wdXQgYXZhaWxhYmxlIHRvIGJlIHJlYWQgb24gdGhlIHJlYWRsaW5lIGlucHV0IGZpbGUKLSAgIGRlc2NyaXB0b3I/ICBPbmx5IHdvcmtzIGlmIHRoZSBzeXN0ZW0gaGFzIHNlbGVjdCgyKSBvciBGSU9OUkVBRC4gKi8KLWludAotX3JsX2lucHV0X2F2YWlsYWJsZSAoKQotewotI2lmIGRlZmluZWQoSEFWRV9TRUxFQ1QpCi0gIGZkX3NldCByZWFkZmRzLCBleGNlcHRmZHM7Ci0gIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEZJT05SRUFEKQotICBpbnQgY2hhcnNfYXZhaWw7Ci0jZW5kaWYKLSAgaW50IHR0eTsKLQotICB0dHkgPSBmaWxlbm8gKHJsX2luc3RyZWFtKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VMRUNUKQotICBGRF9aRVJPICgmcmVhZGZkcyk7Ci0gIEZEX1pFUk8gKCZleGNlcHRmZHMpOwotICBGRF9TRVQgKHR0eSwgJnJlYWRmZHMpOwotICBGRF9TRVQgKHR0eSwgJmV4Y2VwdGZkcyk7Ci0gIHRpbWVvdXQudHZfc2VjID0gMDsKLSAgdGltZW91dC50dl91c2VjID0gMTAwMDAwOwkvKiAwLjEgc2Vjb25kcyAqLwotICByZXR1cm4gKHNlbGVjdCAodHR5ICsgMSwgJnJlYWRmZHMsIChmZF9zZXQgKilOVUxMLCAmZXhjZXB0ZmRzLCAmdGltZW91dCkgPiAwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoRklPTlJFQUQpCi0gIGlmIChpb2N0bCAodHR5LCBGSU9OUkVBRCwgJmNoYXJzX2F2YWlsKSA9PSAwKQotICAgIHJldHVybiAoY2hhcnNfYXZhaWwpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLV9ybF9pbnNlcnRfdHlwZWluIChjKQotICAgICBpbnQgYzsgICAgIAoteyAgICAJCi0gIGludCBrZXksIHQsIGk7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpID0ga2V5ID0gMDsKLSAgc3RyaW5nID0geG1hbGxvYyAoaWJ1ZmZlcl9sZW4gKyAxKTsKLSAgc3RyaW5nW2krK10gPSAoY2hhcikgYzsKLQotICB3aGlsZSAoKHQgPSBybF9nZXRfY2hhciAoJmtleSkpICYmCi0JIF9ybF9rZXltYXBba2V5XS50eXBlID09IElTRlVOQyAmJgotCSBfcmxfa2V5bWFwW2tleV0uZnVuY3Rpb24gPT0gcmxfaW5zZXJ0KQotICAgIHN0cmluZ1tpKytdID0ga2V5OwotCi0gIGlmICh0KQotICAgIHJsX3VuZ2V0X2NoYXIgKGtleSk7Ci0KLSAgc3RyaW5nW2ldID0gJ1wwJzsKLSAgcmxfaW5zZXJ0X3RleHQgKHN0cmluZyk7Ci0gIGZyZWUgKHN0cmluZyk7Ci19Ci0KLS8qIEFkZCBLRVkgdG8gdGhlIGJ1ZmZlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQuICBSZXR1cm5zIDEgaWYgdGhlCi0gICBjaGFyYWN0ZXIgd2FzIHN0dWZmZWQgY29ycmVjdGx5OyAwIG90aGVyd2lzZS4gKi8KLWludAotcmxfc3R1ZmZfY2hhciAoa2V5KQotICAgICBpbnQga2V5OwotewotICBpZiAoaWJ1ZmZlcl9zcGFjZSAoKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChrZXkgPT0gRU9GKQotICAgIHsKLSAgICAgIGtleSA9IE5FV0xJTkU7Ci0gICAgICBybF9wZW5kaW5nX2lucHV0ID0gRU9GOwotICAgIH0KLSAgaWJ1ZmZlcltwdXNoX2luZGV4KytdID0ga2V5OwotICBpZiAocHVzaF9pbmRleCA+PSBpYnVmZmVyX2xlbikKLSAgICBwdXNoX2luZGV4ID0gMDsKLQotICByZXR1cm4gMTsKLX0KLQotLyogTWFrZSBDIGJlIHRoZSBuZXh0IGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuICovCi1pbnQKLXJsX2V4ZWN1dGVfbmV4dCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIHJsX3BlbmRpbmdfaW5wdXQgPSBjOwotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQkgICAgIENoYXJhY3RlciBJbnB1dAkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBSZWFkIGEga2V5LCBpbmNsdWRpbmcgcGVuZGluZyBpbnB1dC4gKi8KLWludAotcmxfcmVhZF9rZXkgKCkKLXsKLSAgaW50IGM7Ci0KLSAgcmxfa2V5X3NlcXVlbmNlX2xlbmd0aCsrOwotCi0gIGlmIChybF9wZW5kaW5nX2lucHV0KQotICAgIHsKLSAgICAgIGMgPSBybF9wZW5kaW5nX2lucHV0OwotICAgICAgcmxfcGVuZGluZ19pbnB1dCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgaW5wdXQgaXMgY29taW5nIGZyb20gYSBtYWNybywgdGhlbiB1c2UgdGhhdC4gKi8KLSAgICAgIGlmIChjID0gX3JsX25leHRfbWFjcm9fa2V5ICgpKQotCXJldHVybiAoYyk7Ci0KLSAgICAgIC8qIElmIHRoZSB1c2VyIGhhcyBhbiBldmVudCBmdW5jdGlvbiwgdGhlbiBjYWxsIGl0IHBlcmlvZGljYWxseS4gKi8KLSAgICAgIGlmIChybF9ldmVudF9ob29rKQotCXsKLQkgIHdoaWxlIChybF9ldmVudF9ob29rICYmIHJsX2dldF9jaGFyICgmYykgPT0gMCkKLQkgICAgewotCSAgICAgICgqcmxfZXZlbnRfaG9vaykgKCk7Ci0JICAgICAgcmxfZ2F0aGVyX3R5aSAoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmxfZ2V0X2NoYXIgKCZjKSA9PSAwKQotCSAgICBjID0gKCpybF9nZXRjX2Z1bmN0aW9uKSAocmxfaW5zdHJlYW0pOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChjKTsKLX0KLQotaW50Ci1ybF9nZXRjIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaW50IHJlc3VsdCwgZmxhZ3M7Ci0gIHVuc2lnbmVkIGNoYXIgYzsKLQotI2lmIGRlZmluZWQgKF9fR08zMl9fKSAmJiAhZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpCi0gIGlmIChpc2F0dHkgKDApKQotICAgIHJldHVybiAoZ2V0a2V5ICgpICYgMHg3Rik7Ci0jZW5kaWYgLyogX19HTzMyX18gKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZWFkIChmaWxlbm8gKHN0cmVhbSksICZjLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKQotCXJldHVybiAoYyk7Ci0KLSAgICAgIC8qIElmIHplcm8gY2hhcmFjdGVycyBhcmUgcmV0dXJuZWQsIHRoZW4gdGhlIGZpbGUgdGhhdCB3ZSBhcmUKLQkgcmVhZGluZyBmcm9tIGlzIGVtcHR5ISAgUmV0dXJuIEVPRiBpbiB0aGF0IGNhc2UuICovCi0gICAgICBpZiAocmVzdWx0ID09IDApCi0JcmV0dXJuIChFT0YpOwotCi0jaWYgZGVmaW5lZCAoX19CRU9TX18pCi0gICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0JY29udGludWU7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEVXT1VMREJMT0NLKQotICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLKQotCXsKLQkgIGlmICgoZmxhZ3MgPSBmY250bCAoZmlsZW5vIChzdHJlYW0pLCBGX0dFVEZMLCAwKSkgPCAwKQotCSAgICByZXR1cm4gKEVPRik7Ci0JICBpZiAoZmxhZ3MgJiBPX05ERUxBWSkKLQkgICAgewotCSAgICAgIGZsYWdzICY9IH5PX05ERUxBWTsKLQkgICAgICBmY250bCAoZmlsZW5vIChzdHJlYW0pLCBGX1NFVEZMLCBmbGFncyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLSNlbmRpZiAvKiBFV09VTERCTE9DSyAqLwotCi0jaWYgZGVmaW5lZCAoX1BPU0lYX1ZFUlNJT04pICYmIGRlZmluZWQgKEVBR0FJTikgJiYgZGVmaW5lZCAoT19OT05CTE9DSykKLSAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pCi0JewotCSAgaWYgKChmbGFncyA9IGZjbnRsIChmaWxlbm8gKHN0cmVhbSksIEZfR0VURkwsIDApKSA8IDApCi0JICAgIHJldHVybiAoRU9GKTsKLQkgIGlmIChmbGFncyAmIE9fTk9OQkxPQ0spCi0JICAgIHsKLQkgICAgICBmbGFncyAmPSB+T19OT05CTE9DSzsKLQkgICAgICBmY250bCAoZmlsZW5vIChzdHJlYW0pLCBGX1NFVEZMLCBmbGFncyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogX1BPU0lYX1ZFUlNJT04gJiYgRUFHQUlOICYmIE9fTk9OQkxPQ0sgKi8KLQotI2lmICFkZWZpbmVkIChfX0dPMzJfXykgfHwgZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpCi0gICAgICAvKiBJZiB0aGUgZXJyb3IgdGhhdCB3ZSByZWNlaXZlZCB3YXMgU0lHSU5ULCB0aGVuIHRyeSBhZ2FpbiwKLQkgdGhpcyBpcyBzaW1wbHkgYW4gaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgdG8gcmVhZCAoKS4KLQkgT3RoZXJ3aXNlLCBzb21lIGVycm9yIG9jdXJyZWQsIGFsc28gc2lnbmlmeWluZyBFT0YuICovCi0gICAgICBpZiAoZXJybm8gIT0gRUlOVFIpCi0JcmV0dXJuIChFT0YpOwotI2VuZGlmIC8qICFfX0dPMzJfXyAqLwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2lzZWFyY2guYyBiL3JlYWRsaW5lL2lzZWFyY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyNzllMS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9pc2VhcmNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlJLVNlYXJjaCBhbmQgU2VhcmNoaW5nCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NywxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFJlYWRsaW5lIExpYnJhcnkgKHRoZSBMaWJyYXJ5KSwgYSBzZXQgb2YKLSAgIHJvdXRpbmVzIGZvciBwcm92aWRpbmcgRW1hY3Mgc3R5bGUgbGluZSBpbnB1dCB0byBwcm9ncmFtcyB0aGF0IGFzawotICAgZm9yIGl0LgotCi0gICBUaGUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInJsZGVmcy5oIgotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0jaW5jbHVkZSAiaGlzdG9yeS5oIgotCi0vKiBWYXJpYWJsZXMgZXhwb3J0ZWQgdG8gb3RoZXIgZmlsZXMgaW4gdGhlIHJlYWRsaW5lIGxpYnJhcnkuICovCi11bnNpZ25lZCBjaGFyICpfcmxfaXNlYXJjaF90ZXJtaW5hdG9ycyA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKLQotLyogVmFyaWFibGVzIGltcG9ydGVkIGZyb20gb3RoZXIgZmlsZXMgaW4gdGhlIHJlYWRsaW5lIGxpYnJhcnkuICovCi1leHRlcm4gS2V5bWFwIF9ybF9rZXltYXA7Ci1leHRlcm4gSElTVF9FTlRSWSAqc2F2ZWRfbGluZV9mb3JfaGlzdG9yeTsKLWV4dGVybiBpbnQgcmxfbGluZV9idWZmZXJfbGVuOwotZXh0ZXJuIGludCBybF9wb2ludCwgcmxfZW5kOwotZXh0ZXJuIGNoYXIgKnJsX2xpbmVfYnVmZmVyOwotCi1leHRlcm4gaW50IHJsX2V4ZWN1dGVfbmV4dCAoKTsKLWV4dGVybiB2b2lkIHJsX2V4dGVuZF9saW5lX2J1ZmZlciAoKTsKLQotZXh0ZXJuIGludCBfcmxfaW5wdXRfYXZhaWxhYmxlICgpOwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi1zdGF0aWMgaW50IHJsX3NlYXJjaF9oaXN0b3J5ICgpOwotCi0vKiBMYXN0IGxpbmUgZm91bmQgYnkgdGhlIGN1cnJlbnQgaW5jcmVtZW50YWwgc2VhcmNoLCBzbyB3ZSBkb24ndCBgZmluZCcKLSAgIGlkZW50aWNhbCBsaW5lcyBtYW55IHRpbWVzIGluIGEgcm93LiAqLwotc3RhdGljIGNoYXIgKnByZXZfbGluZV9mb3VuZDsKLQotLyogU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBoaXN0b3J5IGxvb2tpbmcgZm9yIGEgc3RyaW5nIHdoaWNoIGlzIHR5cGVkCi0gICBpbnRlcmFjdGl2ZWx5LiAgU3RhcnQgd2l0aCB0aGUgY3VycmVudCBsaW5lLiAqLwotaW50Ci1ybF9yZXZlcnNlX3NlYXJjaF9oaXN0b3J5IChzaWduLCBrZXkpCi0gICAgIGludCBzaWduLCBrZXk7Ci17Ci0gIHJldHVybiAocmxfc2VhcmNoX2hpc3RvcnkgKC1zaWduLCBrZXkpKTsKLX0KLQotLyogU2VhcmNoIGZvcndhcmRzIHRocm91Z2ggdGhlIGhpc3RvcnkgbG9va2luZyBmb3IgYSBzdHJpbmcgd2hpY2ggaXMgdHlwZWQKLSAgIGludGVyYWN0aXZlbHkuICBTdGFydCB3aXRoIHRoZSBjdXJyZW50IGxpbmUuICovCi1pbnQKLXJsX2ZvcndhcmRfc2VhcmNoX2hpc3RvcnkgKHNpZ24sIGtleSkKLSAgICAgaW50IHNpZ24sIGtleTsKLXsKLSAgcmV0dXJuIChybF9zZWFyY2hfaGlzdG9yeSAoc2lnbiwga2V5KSk7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlYXJjaCBpbiB0aGUgZWNoby1hcmVhLgotICAgU0VBUkNIX1NUUklORyBjb250YWlucyB0aGUgc3RyaW5nIHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yLAotICAgRElSRUNUSU9OIGlzIHplcm8gZm9yIGZvcndhcmQsIG9yIDEgZm9yIHJldmVyc2UsCi0gICBXSEVSRSBpcyB0aGUgaGlzdG9yeSBsaXN0IG51bWJlciBvZiB0aGUgY3VycmVudCBsaW5lLiAgSWYgaXQgaXMKLSAgIC0xLCB0aGVuIHRoaXMgbGluZSBpcyB0aGUgc3RhcnRpbmcgb25lLiAqLwotc3RhdGljIHZvaWQKLXJsX2Rpc3BsYXlfc2VhcmNoIChzZWFyY2hfc3RyaW5nLCByZXZlcnNlX3AsIHdoZXJlKQotICAgICBjaGFyICpzZWFyY2hfc3RyaW5nOwotICAgICBpbnQgcmV2ZXJzZV9wLCB3aGVyZTsKLXsKLSAgY2hhciAqbWVzc2FnZTsKLSAgaW50IG1zZ2xlbiwgc2VhcmNobGVuOwotCi0gIHNlYXJjaGxlbiA9IChzZWFyY2hfc3RyaW5nICYmICpzZWFyY2hfc3RyaW5nKSA/IHN0cmxlbiAoc2VhcmNoX3N0cmluZykgOiAwOwotCi0gIG1lc3NhZ2UgPSB4bWFsbG9jIChzZWFyY2hsZW4gKyAzMyk7Ci0gIG1zZ2xlbiA9IDA7Ci0KLSNpZiBkZWZpbmVkIChOT1RERUYpCi0gIGlmICh3aGVyZSAhPSAtMSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChtZXNzYWdlLCAiWyVkXSIsIHdoZXJlICsgaGlzdG9yeV9iYXNlKTsKLSAgICAgIG1zZ2xlbiA9IHN0cmxlbiAobWVzc2FnZSk7Ci0gICAgfQotI2VuZGlmIC8qIE5PVERFRiAqLwotCi0gIG1lc3NhZ2VbbXNnbGVuKytdID0gJygnOwotCi0gIGlmIChyZXZlcnNlX3ApCi0gICAgewotICAgICAgc3RyY3B5IChtZXNzYWdlICsgbXNnbGVuLCAicmV2ZXJzZS0iKTsKLSAgICAgIG1zZ2xlbiArPSA4OwotICAgIH0KLQotICBzdHJjcHkgKG1lc3NhZ2UgKyBtc2dsZW4sICJpLXNlYXJjaClgIik7Ci0gIG1zZ2xlbiArPSAxMDsKLQotICBpZiAoc2VhcmNoX3N0cmluZykKLSAgICB7Ci0gICAgICBzdHJjcHkgKG1lc3NhZ2UgKyBtc2dsZW4sIHNlYXJjaF9zdHJpbmcpOwotICAgICAgbXNnbGVuICs9IHNlYXJjaGxlbjsKLSAgICB9Ci0KLSAgc3RyY3B5IChtZXNzYWdlICsgbXNnbGVuLCAiJzogIik7Ci0KLSAgcmxfbWVzc2FnZSAoIiVzIiwgbWVzc2FnZSwgMCk7Ci0gIGZyZWUgKG1lc3NhZ2UpOwotICAoKnJsX3JlZGlzcGxheV9mdW5jdGlvbikgKCk7Ci19Ci0KLS8qIFNlYXJjaCB0aHJvdWdoIHRoZSBoaXN0b3J5IGxvb2tpbmcgZm9yIGFuIGludGVyYWN0aXZlbHkgdHlwZWQgc3RyaW5nLgotICAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gaS1zZWFyY2guICBXZSBzdGFydCB0aGUgc2VhcmNoIGluIHRoZSBjdXJyZW50IGxpbmUuCi0gICBESVJFQ1RJT04gaXMgd2hpY2ggZGlyZWN0aW9uIHRvIHNlYXJjaDsgPj0gMCBtZWFucyBmb3J3YXJkLCA8IDAgbWVhbnMKLSAgIGJhY2t3YXJkcy4gKi8KLXN0YXRpYyBpbnQKLXJsX3NlYXJjaF9oaXN0b3J5IChkaXJlY3Rpb24sIGludm9raW5nX2tleSkKLSAgICAgaW50IGRpcmVjdGlvbiwgaW52b2tpbmdfa2V5OwotewotICAvKiBUaGUgc3RyaW5nIHRoYXQgdGhlIHVzZXIgdHlwZXMgaW4gdG8gc2VhcmNoIGZvci4gKi8KLSAgY2hhciAqc2VhcmNoX3N0cmluZzsKLQotICAvKiBUaGUgY3VycmVudCBsZW5ndGggb2YgU0VBUkNIX1NUUklORy4gKi8KLSAgaW50IHNlYXJjaF9zdHJpbmdfaW5kZXg7Ci0KLSAgLyogVGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IFNFQVJDSF9TVFJJTkcgaGFzIGFsbG9jYXRlZCB0byBpdC4gKi8KLSAgaW50IHNlYXJjaF9zdHJpbmdfc2l6ZTsKLQotICAvKiBUaGUgbGlzdCBvZiBsaW5lcyB0byBzZWFyY2ggdGhyb3VnaC4gKi8KLSAgY2hhciAqKmxpbmVzLCAqYWxsb2NhdGVkX2xpbmU7Ci0KLSAgLyogVGhlIGxlbmd0aCBvZiBMSU5FUy4gKi8KLSAgaW50IGhsZW47Ci0KLSAgLyogV2hlcmUgd2UgZ2V0IExJTkVTIGZyb20uICovCi0gIEhJU1RfRU5UUlkgKipobGlzdDsKLQotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IG9yaWdfcG9pbnQsIG9yaWdfbGluZSwgbGFzdF9mb3VuZF9saW5lOwotICBpbnQgYywgZm91bmQsIGZhaWxlZCwgc2xpbmVfbGVuOwotCi0gIC8qIFRoZSBsaW5lIGN1cnJlbnRseSBiZWluZyBzZWFyY2hlZC4gKi8KLSAgY2hhciAqc2xpbmU7Ci0KLSAgLyogT2Zmc2V0IGluIHRoYXQgbGluZS4gKi8KLSAgaW50IGxpbmVfaW5kZXg7Ci0KLSAgLyogTm9uLXplcm8gaWYgd2UgYXJlIGRvaW5nIGEgcmV2ZXJzZSBzZWFyY2guICovCi0gIGludCByZXZlcnNlOwotCi0gIC8qIFRoZSBsaXN0IG9mIGNoYXJhY3RlcnMgd2hpY2ggdGVybWluYXRlIHRoZSBzZWFyY2gsIGJ1dCBhcmUgbm90Ci0gICAgIHN1YnNlcXVlbnRseSBleGVjdXRlZC4gIElmIHRoZSB2YXJpYWJsZSBpc2VhcmNoLXRlcm1pbmF0b3JzIGhhcwotICAgICBiZWVuIHNldCwgd2UgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSB3ZSB1c2UgRVNDIGFuZCBDLUouICovCi0gIHVuc2lnbmVkIGNoYXIgKmlzZWFyY2hfdGVybWluYXRvcnM7Ci0KLSAgb3JpZ19wb2ludCA9IHJsX3BvaW50OwotICBsYXN0X2ZvdW5kX2xpbmUgPSBvcmlnX2xpbmUgPSB3aGVyZV9oaXN0b3J5ICgpOwotICByZXZlcnNlID0gZGlyZWN0aW9uIDwgMDsKLSAgaGxpc3QgPSBoaXN0b3J5X2xpc3QgKCk7Ci0gIGFsbG9jYXRlZF9saW5lID0gKGNoYXIgKilOVUxMOwotCi0gIGlzZWFyY2hfdGVybWluYXRvcnMgPSBfcmxfaXNlYXJjaF90ZXJtaW5hdG9ycyA/IF9ybF9pc2VhcmNoX3Rlcm1pbmF0b3JzCi0JCQkJCQk6ICh1bnNpZ25lZCBjaGFyICopIlwwMzNcMDEyIjsKLQotICAvKiBDcmVhdGUgYW4gYXJyYXJ5IG9mIHBvaW50ZXJzIHRvIHRoZSBsaW5lcyB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoLiAqLwotICBtYXliZV9yZXBsYWNlX2xpbmUgKCk7Ci0gIGkgPSAwOwotICBpZiAoaGxpc3QpCi0gICAgZm9yIChpID0gMDsgaGxpc3RbaV07IGkrKyk7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgbWFueSBsaW5lcywgKzEgZm9yIHRoZSBjdXJyZW50IGlucHV0IGxpbmUsCi0gICAgIGFuZCByZW1lbWJlciB0aG9zZSBsaW5lcy4gKi8KLSAgbGluZXMgPSAoY2hhciAqKil4bWFsbG9jICgoMSArIChobGVuID0gaSkpICogc2l6ZW9mIChjaGFyICopKTsKLSAgZm9yIChpID0gMDsgaSA8IGhsZW47IGkrKykKLSAgICBsaW5lc1tpXSA9IGhsaXN0W2ldLT5saW5lOwotCi0gIGlmIChzYXZlZF9saW5lX2Zvcl9oaXN0b3J5KQotICAgIGxpbmVzW2ldID0gc2F2ZWRfbGluZV9mb3JfaGlzdG9yeS0+bGluZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gZnJlZSBpdC4gKi8KLSAgICAgIGFsbG9jYXRlZF9saW5lID0geG1hbGxvYyAoMSArIHN0cmxlbiAocmxfbGluZV9idWZmZXIpKTsKLSAgICAgIHN0cmNweSAoYWxsb2NhdGVkX2xpbmUsICZybF9saW5lX2J1ZmZlclswXSk7Ci0gICAgICBsaW5lc1tpXSA9IGFsbG9jYXRlZF9saW5lOwotICAgIH0KLQotICBobGVuKys7Ci0KLSAgLyogVGhlIGxpbmUgd2hlcmUgd2Ugc3RhcnQgdGhlIHNlYXJjaC4gKi8KLSAgaSA9IG9yaWdfbGluZTsKLQotICBybF9zYXZlX3Byb21wdCAoKTsKLQotICAvKiBJbml0aWFsaXplIHNlYXJjaCBwYXJhbWV0ZXJzLiAqLwotICBzZWFyY2hfc3RyaW5nID0geG1hbGxvYyAoc2VhcmNoX3N0cmluZ19zaXplID0gMTI4KTsKLSAgKnNlYXJjaF9zdHJpbmcgPSAnXDAnOwotICBzZWFyY2hfc3RyaW5nX2luZGV4ID0gMDsKLSAgcHJldl9saW5lX2ZvdW5kID0gKGNoYXIgKikwOwkJLyogWFhYICovCi0KLSAgLyogTm9ybWFsaXplIERJUkVDVElPTiBpbnRvIDEgb3IgLTEuICovCi0gIGRpcmVjdGlvbiA9IChkaXJlY3Rpb24gPj0gMCkgPyAxIDogLTE7Ci0KLSAgcmxfZGlzcGxheV9zZWFyY2ggKHNlYXJjaF9zdHJpbmcsIHJldmVyc2UsIC0xKTsKLQotICBzbGluZSA9IHJsX2xpbmVfYnVmZmVyOwotICBzbGluZV9sZW4gPSBzdHJsZW4gKHNsaW5lKTsKLSAgbGluZV9pbmRleCA9IHJsX3BvaW50OwotCi0gIGZvdW5kID0gZmFpbGVkID0gMDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBGdW5jdGlvbiAqZiA9IChGdW5jdGlvbiAqKU5VTEw7Ci0KLSAgICAgIC8qIFJlYWQgYSBrZXkgYW5kIGRlY2lkZSBob3cgdG8gcHJvY2VlZC4gKi8KLSAgICAgIGMgPSBybF9yZWFkX2tleSAoKTsKLQotICAgICAgaWYgKF9ybF9rZXltYXBbY10udHlwZSA9PSBJU0ZVTkMpCi0JewotCSAgZiA9IF9ybF9rZXltYXBbY10uZnVuY3Rpb247Ci0KLQkgIGlmIChmID09IHJsX3JldmVyc2Vfc2VhcmNoX2hpc3RvcnkpCi0JICAgIGMgPSByZXZlcnNlID8gLTEgOiAtMjsKLQkgIGVsc2UgaWYgKGYgPT0gcmxfZm9yd2FyZF9zZWFyY2hfaGlzdG9yeSkKLQkgICAgYyA9ICAhcmV2ZXJzZSA/IC0xIDogLTI7Ci0JfQotCi0jaWYgMAotICAgICAgLyogTGV0IE5FV0xJTkUgKF5KKSB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBmb3IgcGVvcGxlIHdobyBkb24ndCBsaWtlCi0JIHVzaW5nIEVTQy4gIF5NIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHRlcm1pbmF0ZSB0aGUgc2VhcmNoIGFuZAotCSBpbW1lZGlhdGVseSBleGVjdXRlIHRoZSBjb21tYW5kLiAqLwotICAgICAgaWYgKGMgPT0gRVNDIHx8IGMgPT0gTkVXTElORSkKLSNlbHNlCi0gICAgICAvKiBUaGUgY2hhcmFjdGVycyBpbiBpc2VhcmNoX3Rlcm1pbmF0b3JzIChzZXQgZnJvbSB0aGUgdXNlci1zZXR0YWJsZQotCSB2YXJpYWJsZSBpc2VhcmNoLXRlcm1pbmF0b3JzKSBhcmUgdXNlZCB0byB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBidXQKLQkgbm90IHN1YnNlcXVlbnRseSBleGVjdXRlIHRoZSBjaGFyYWN0ZXIgYXMgYSBjb21tYW5kLiAgVGhlIGRlZmF1bHQKLQkgdmFsdWUgaXMgIlwwMzNcMDEyIiAoRVNDIGFuZCBDLUopLiAqLwotICAgICAgaWYgKHN0cmNociAoaXNlYXJjaF90ZXJtaW5hdG9ycywgYykpCi0jZW5kaWYKLQl7Ci0JICAvKiBFU0Mgc3RpbGwgdGVybWluYXRlcyB0aGUgc2VhcmNoLCBidXQgaWYgdGhlcmUgaXMgcGVuZGluZwotCSAgICAgaW5wdXQgb3IgaWYgaW5wdXQgYXJyaXZlcyB3aXRoaW4gMC4xIHNlY29uZHMgKG9uIHN5c3RlbXMKLQkgICAgIHdpdGggc2VsZWN0KDIpKSBpdCBpcyB1c2VkIGFzIGEgcHJlZml4IGNoYXJhY3RlcgotCSAgICAgd2l0aCBybF9leGVjdXRlX25leHQuICBXQVRDSCBPVVQgRk9SIFRISVMhICBUaGlzIGlzIGludGVuZGVkCi0JICAgICB0byBhbGxvdyB0aGUgYXJyb3cga2V5cyB0byBiZSB1c2VkIGxpa2UgXkYgYW5kIF5CIGFyZSB1c2VkCi0JICAgICB0byB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBhbmQgZXhlY3V0ZSB0aGUgbW92ZW1lbnQgY29tbWFuZC4gKi8KLQkgIGlmIChjID09IEVTQyAmJiBfcmxfaW5wdXRfYXZhaWxhYmxlICgpKQkvKiBYWFggKi8KLQkgICAgcmxfZXhlY3V0ZV9uZXh0IChFU0MpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoYyA+PSAwICYmIChDVFJMX0NIQVIgKGMpIHx8IE1FVEFfQ0hBUiAoYykgfHwgYyA9PSBSVUJPVVQpICYmIGMgIT0gQ1RSTCAoJ0cnKSkKLQl7Ci0JICBybF9leGVjdXRlX25leHQgKGMpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgLTE6Ci0JICBpZiAoc2VhcmNoX3N0cmluZ19pbmRleCA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIGVsc2UgaWYgKHJldmVyc2UpCi0JICAgIC0tbGluZV9pbmRleDsKLQkgIGVsc2UgaWYgKGxpbmVfaW5kZXggIT0gc2xpbmVfbGVuKQotCSAgICArK2xpbmVfaW5kZXg7Ci0JICBlbHNlCi0JICAgIGRpbmcgKCk7Ci0JICBicmVhazsKLQotCSAgLyogc3dpdGNoIGRpcmVjdGlvbnMgKi8KLQljYXNlIC0yOgotCSAgZGlyZWN0aW9uID0gLWRpcmVjdGlvbjsKLQkgIHJldmVyc2UgPSBkaXJlY3Rpb24gPCAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENUUkwgKCdHJyk6Ci0JICBzdHJjcHkgKHJsX2xpbmVfYnVmZmVyLCBsaW5lc1tvcmlnX2xpbmVdKTsKLQkgIHJsX3BvaW50ID0gb3JpZ19wb2ludDsKLQkgIHJsX2VuZCA9IHN0cmxlbiAocmxfbGluZV9idWZmZXIpOwotCSAgcmxfcmVzdG9yZV9wcm9tcHQoKTsKLQkgIHJsX2NsZWFyX21lc3NhZ2UgKCk7Ci0JICBpZiAoYWxsb2NhdGVkX2xpbmUpCi0JICAgIGZyZWUgKGFsbG9jYXRlZF9saW5lKTsKLQkgIGZyZWUgKGxpbmVzKTsKLQkgIHJldHVybiAwOwotCi0jaWYgMAotCS8qIGRlbGV0ZSBjaGFyYWN0ZXIgZnJvbSBzZWFyY2ggc3RyaW5nLiAqLwotCWNhc2UgLTM6Ci0JICBpZiAoc2VhcmNoX3N0cmluZ19pbmRleCA9PSAwKQotCSAgICBkaW5nICgpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VhcmNoX3N0cmluZ1stLXNlYXJjaF9zdHJpbmdfaW5kZXhdID0gJ1wwJzsKLQkgICAgICAvKiBUaGlzIGlzIHRyaWNreS4gIFRvIGRvIHRoaXMgcmlnaHQsIHdlIG5lZWQgdG8ga2VlcCBhCi0JCSBzdGFjayBvZiBzZWFyY2ggcG9zaXRpb25zIGZvciB0aGUgY3VycmVudCBzZWFyY2gsIHdpdGgKLQkJIHNlbnRpbmVscyBtYXJraW5nIHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4gKi8KLQkgICAgfQotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICAvKiBBZGQgY2hhcmFjdGVyIHRvIHNlYXJjaCBzdHJpbmcgYW5kIGNvbnRpbnVlIHNlYXJjaC4gKi8KLQkgIGlmIChzZWFyY2hfc3RyaW5nX2luZGV4ICsgMiA+PSBzZWFyY2hfc3RyaW5nX3NpemUpCi0JICAgIHsKLQkgICAgICBzZWFyY2hfc3RyaW5nX3NpemUgKz0gMTI4OwotCSAgICAgIHNlYXJjaF9zdHJpbmcgPSB4cmVhbGxvYyAoc2VhcmNoX3N0cmluZywgc2VhcmNoX3N0cmluZ19zaXplKTsKLQkgICAgfQotCSAgc2VhcmNoX3N0cmluZ1tzZWFyY2hfc3RyaW5nX2luZGV4KytdID0gYzsKLQkgIHNlYXJjaF9zdHJpbmdbc2VhcmNoX3N0cmluZ19pbmRleF0gPSAnXDAnOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmb3IgKGZvdW5kID0gZmFpbGVkID0gMDs7KQotCXsKLQkgIGludCBsaW1pdCA9IHNsaW5lX2xlbiAtIHNlYXJjaF9zdHJpbmdfaW5kZXggKyAxOwotCi0JICAvKiBTZWFyY2ggdGhlIGN1cnJlbnQgbGluZS4gKi8KLQkgIHdoaWxlIChyZXZlcnNlID8gKGxpbmVfaW5kZXggPj0gMCkgOiAobGluZV9pbmRleCA8IGxpbWl0KSkKLQkgICAgewotCSAgICAgIGlmIChTVFJFUU4gKHNlYXJjaF9zdHJpbmcsIHNsaW5lICsgbGluZV9pbmRleCwgc2VhcmNoX3N0cmluZ19pbmRleCkpCi0JCXsKLQkJICBmb3VuZCsrOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQlsaW5lX2luZGV4ICs9IGRpcmVjdGlvbjsKLQkgICAgfQotCSAgaWYgKGZvdW5kKQotCSAgICBicmVhazsKLQotCSAgLyogTW92ZSB0byB0aGUgbmV4dCBsaW5lLCBidXQgc2tpcCBuZXcgY29waWVzIG9mIHRoZSBsaW5lCi0JICAgICB3ZSBqdXN0IGZvdW5kIGFuZCBsaW5lcyBzaG9ydGVyIHRoYW4gdGhlIHN0cmluZyB3ZSdyZQotCSAgICAgc2VhcmNoaW5nIGZvci4gKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGxpbmUuICovCi0JICAgICAgaSArPSBkaXJlY3Rpb247Ci0KLQkgICAgICAvKiBBdCBsaW1pdCBmb3IgZGlyZWN0aW9uPyAqLwotCSAgICAgIGlmIChyZXZlcnNlID8gKGkgPCAwKSA6IChpID09IGhsZW4pKQotCQl7Ci0JCSAgZmFpbGVkKys7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHdpbGwgbmVlZCB0aGVzZSBsYXRlci4gKi8KLQkgICAgICBzbGluZSA9IGxpbmVzW2ldOwotCSAgICAgIHNsaW5lX2xlbiA9IHN0cmxlbiAoc2xpbmUpOwotCSAgICB9Ci0JICB3aGlsZSAoKHByZXZfbGluZV9mb3VuZCAmJiBTVFJFUSAocHJldl9saW5lX2ZvdW5kLCBsaW5lc1tpXSkpIHx8Ci0JCSAoc2VhcmNoX3N0cmluZ19pbmRleCA+IHNsaW5lX2xlbikpOwotCi0JICBpZiAoZmFpbGVkKQotCSAgICBicmVhazsKLQotCSAgLyogTm93IHNldCB1cCB0aGUgbGluZSBmb3Igc2VhcmNoaW5nLi4uICovCi0JICBsaW5lX2luZGV4ID0gcmV2ZXJzZSA/IHNsaW5lX2xlbiAtIHNlYXJjaF9zdHJpbmdfaW5kZXggOiAwOwotCX0KLQotICAgICAgaWYgKGZhaWxlZCkKLQl7Ci0JICAvKiBXZSBjYW5ub3QgZmluZCB0aGUgc2VhcmNoIHN0cmluZy4gIERpbmcgdGhlIGJlbGwuICovCi0JICBkaW5nICgpOwotCSAgaSA9IGxhc3RfZm91bmRfbGluZTsKLQkgIGNvbnRpbnVlOyAJCS8qIFhYWCAtIHdhcyBicmVhayAqLwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgc2VhcmNoIHN0cmluZy4gIEp1c3QgZGlzcGxheSBpdC4gIEJ1dCBkb24ndAotCSBhY3R1YWxseSBtb3ZlIHRoZXJlIGluIHRoZSBoaXN0b3J5IGxpc3QgdW50aWwgdGhlIHVzZXIgYWNjZXB0cwotCSB0aGUgbG9jYXRpb24uICovCi0gICAgICBpZiAoZm91bmQpCi0JewotCSAgaW50IGxpbmVfbGVuOwotCi0JICBwcmV2X2xpbmVfZm91bmQgPSBsaW5lc1tpXTsKLQkgIGxpbmVfbGVuID0gc3RybGVuIChsaW5lc1tpXSk7Ci0KLQkgIGlmIChsaW5lX2xlbiA+PSBybF9saW5lX2J1ZmZlcl9sZW4pCi0JICAgIHJsX2V4dGVuZF9saW5lX2J1ZmZlciAobGluZV9sZW4pOwotCi0JICBzdHJjcHkgKHJsX2xpbmVfYnVmZmVyLCBsaW5lc1tpXSk7Ci0JICBybF9wb2ludCA9IGxpbmVfaW5kZXg7Ci0JICBybF9lbmQgPSBsaW5lX2xlbjsKLQkgIGxhc3RfZm91bmRfbGluZSA9IGk7Ci0JICBybF9kaXNwbGF5X3NlYXJjaCAoc2VhcmNoX3N0cmluZywgcmV2ZXJzZSwgKGkgPT0gb3JpZ19saW5lKSA/IC0xIDogaSk7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgc2VhcmNoaW5nIGlzIG92ZXIuICBUaGUgdXNlciBtYXkgaGF2ZSBmb3VuZCB0aGUgc3RyaW5nIHRoYXQgc2hlCi0gICAgIHdhcyBsb29raW5nIGZvciwgb3IgZWxzZSBzaGUgbWF5IGhhdmUgZXhpdGVkIGEgZmFpbGluZyBzZWFyY2guICBJZgotICAgICBMSU5FX0lOREVYIGlzIC0xLCB0aGVuIHRoYXQgc2hvd3MgdGhhdCB0aGUgc3RyaW5nIHNlYXJjaGVkIGZvciB3YXMKLSAgICAgbm90IGZvdW5kLiAgV2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHBsYWNlIHJsX3BvaW50LiAqLwotCi0gIC8qIEZpcnN0IHB1dCBiYWNrIHRoZSBvcmlnaW5hbCBzdGF0ZS4gKi8KLSAgc3RyY3B5IChybF9saW5lX2J1ZmZlciwgbGluZXNbb3JpZ19saW5lXSk7Ci0KLSAgcmxfcmVzdG9yZV9wcm9tcHQgKCk7Ci0KLSAgLyogRnJlZSB0aGUgc2VhcmNoIHN0cmluZy4gKi8KLSAgZnJlZSAoc2VhcmNoX3N0cmluZyk7Ci0KLSAgaWYgKGxhc3RfZm91bmRfbGluZSA8IG9yaWdfbGluZSkKLSAgICBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSAob3JpZ19saW5lIC0gbGFzdF9mb3VuZF9saW5lLCAwKTsKLSAgZWxzZQotICAgIHJsX2dldF9uZXh0X2hpc3RvcnkgKGxhc3RfZm91bmRfbGluZSAtIG9yaWdfbGluZSwgMCk7Ci0KLSAgLyogSWYgdGhlIHN0cmluZyB3YXMgbm90IGZvdW5kLCBwdXQgcG9pbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KLSAgaWYgKGxpbmVfaW5kZXggPCAwKQotICAgIGxpbmVfaW5kZXggPSBzdHJsZW4gKHJsX2xpbmVfYnVmZmVyKTsKLSAgcmxfcG9pbnQgPSBsaW5lX2luZGV4OwotICBybF9jbGVhcl9tZXNzYWdlICgpOwotCi0gIGlmIChhbGxvY2F0ZWRfbGluZSkKLSAgICBmcmVlIChhbGxvY2F0ZWRfbGluZSk7Ci0gIGZyZWUgKGxpbmVzKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2tleW1hcHMuYyBiL3JlYWRsaW5lL2tleW1hcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczNjY2Yi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9rZXltYXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoga2V5bWFwcy5jIC0tIEZ1bmN0aW9ucyBhbmQga2V5bWFwcyBmb3IgdGhlIEdOVSBSZWFkbGluZSBsaWJyYXJ5LiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODgsMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFJlYWRsaW5lLCBhIGxpYnJhcnkgZm9yIHJlYWRpbmcgbGluZXMKLSAgIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBSZWFkbGluZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFJlYWRsaW5lIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggUmVhZGxpbmU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLwotCi0jaW5jbHVkZSAicmxjb25mLmgiCi0jaW5jbHVkZSAia2V5bWFwcy5oIgotI2luY2x1ZGUgImVtYWNzX2tleW1hcC5jIgotCi0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSNpbmNsdWRlICJ2aV9rZXltYXAuYyIKLSNlbmRpZgotCi1leHRlcm4gaW50IHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uICgpOwotZXh0ZXJuIGludCBybF9ydWJvdXQgKCksIHJsX2luc2VydCAoKTsKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCksICp4cmVhbGxvYyAoKTsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCSAgICAgIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIEtleW1hcHMuCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLS8qIFJldHVybiBhIG5ldywgZW1wdHkga2V5bWFwLgotICAgRnJlZSBpdCB3aXRoIGZyZWUoKSB3aGVuIHlvdSBhcmUgZG9uZS4gKi8KLUtleW1hcAotcmxfbWFrZV9iYXJlX2tleW1hcCAoKQotewotICByZWdpc3RlciBpbnQgaTsKLSAgS2V5bWFwIGtleW1hcCA9IChLZXltYXApeG1hbGxvYyAoS0VZTUFQX1NJWkUgKiBzaXplb2YgKEtFWU1BUF9FTlRSWSkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBLRVlNQVBfU0laRTsgaSsrKQotICAgIHsKLSAgICAgIGtleW1hcFtpXS50eXBlID0gSVNGVU5DOwotICAgICAga2V5bWFwW2ldLmZ1bmN0aW9uID0gKEZ1bmN0aW9uICopTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChpID0gJ0EnOyBpIDwgKCdaJyArIDEpOyBpKyspCi0gICAgewotICAgICAga2V5bWFwW2ldLnR5cGUgPSBJU0ZVTkM7Ci0gICAgICBrZXltYXBbaV0uZnVuY3Rpb24gPSBybF9kb19sb3dlcmNhc2VfdmVyc2lvbjsKLSAgICB9Ci0KLSAgcmV0dXJuIChrZXltYXApOwotfQotCi0vKiBSZXR1cm4gYSBuZXcga2V5bWFwIHdoaWNoIGlzIGEgY29weSBvZiBNQVAuICovCi1LZXltYXAKLXJsX2NvcHlfa2V5bWFwIChtYXApCi0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBLZXltYXAgdGVtcCA9IHJsX21ha2VfYmFyZV9rZXltYXAgKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEtFWU1BUF9TSVpFOyBpKyspCi0gICAgewotICAgICAgdGVtcFtpXS50eXBlID0gbWFwW2ldLnR5cGU7Ci0gICAgICB0ZW1wW2ldLmZ1bmN0aW9uID0gbWFwW2ldLmZ1bmN0aW9uOwotICAgIH0KLSAgcmV0dXJuICh0ZW1wKTsKLX0KLQotLyogUmV0dXJuIGEgbmV3IGtleW1hcCB3aXRoIHRoZSBwcmludGluZyBjaGFyYWN0ZXJzIGJvdW5kIHRvIHJsX2luc2VydCwKLSAgIHRoZSB1cHBlcmNhc2UgTWV0YSBjaGFyYWN0ZXJzIGJvdW5kIHRvIHJ1biB0aGVpciBsb3dlcmNhc2UgZXF1aXZhbGVudHMsCi0gICBhbmQgdGhlIE1ldGEgZGlnaXRzIGJvdW5kIHRvIHByb2R1Y2UgbnVtZXJpYyBhcmd1bWVudHMuICovCi1LZXltYXAKLXJsX21ha2Vfa2V5bWFwICgpCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBLZXltYXAgbmV3bWFwOwotCi0gIG5ld21hcCA9IHJsX21ha2VfYmFyZV9rZXltYXAgKCk7Ci0KLSAgLyogQWxsIEFTQ0lJIHByaW50aW5nIGNoYXJhY3RlcnMgYXJlIHNlbGYtaW5zZXJ0aW5nLiAqLwotICBmb3IgKGkgPSAnICc7IGkgPCAxMjc7IGkrKykKLSAgICBuZXdtYXBbaV0uZnVuY3Rpb24gPSBybF9pbnNlcnQ7Ci0KLSAgbmV3bWFwW1RBQl0uZnVuY3Rpb24gPSBybF9pbnNlcnQ7Ci0gIG5ld21hcFtSVUJPVVRdLmZ1bmN0aW9uID0gcmxfcnVib3V0OwkvKiBSVUJPVVQgPT0gMTI3ICovCi0gIG5ld21hcFtDVFJMKCdIJyldLmZ1bmN0aW9uID0gcmxfcnVib3V0OwotCi0jaWYgS0VZTUFQX1NJWkUgPiAxMjgKLSAgLyogUHJpbnRpbmcgY2hhcmFjdGVycyBpbiBzb21lIDgtYml0IGNoYXJhY3RlciBzZXRzLiAqLwotICBmb3IgKGkgPSAxMjg7IGkgPCAxNjA7IGkrKykKLSAgICBuZXdtYXBbaV0uZnVuY3Rpb24gPSBybF9pbnNlcnQ7Ci0KLSAgLyogSVNPIExhdGluLTEgcHJpbnRpbmcgY2hhcmFjdGVycyBzaG91bGQgc2VsZi1pbnNlcnQuICovCi0gIGZvciAoaSA9IDE2MDsgaSA8IDI1NjsgaSsrKQotICAgIG5ld21hcFtpXS5mdW5jdGlvbiA9IHJsX2luc2VydDsKLSNlbmRpZiAvKiBLRVlNQVBfU0laRSA+IDEyOCAqLwotCi0gIHJldHVybiAobmV3bWFwKTsKLX0KLQotLyogRnJlZSB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggTUFQLiAqLwotdm9pZAotcmxfZGlzY2FyZF9rZXltYXAgKG1hcCkKLSAgICAgS2V5bWFwIG1hcDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKCFtYXApCi0gICAgcmV0dXJuOwotCi0gIGZvciAoaSA9IDA7IGkgPCBLRVlNQVBfU0laRTsgaSsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAobWFwW2ldLnR5cGUpCi0JewotCWNhc2UgSVNGVU5DOgotCSAgYnJlYWs7Ci0KLQljYXNlIElTS01BUDoKLQkgIHJsX2Rpc2NhcmRfa2V5bWFwICgoS2V5bWFwKW1hcFtpXS5mdW5jdGlvbik7Ci0JICBicmVhazsKLQotCWNhc2UgSVNNQUNSOgotCSAgZnJlZSAoKGNoYXIgKiltYXBbaV0uZnVuY3Rpb24pOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2tleW1hcHMuaCBiL3JlYWRsaW5lL2tleW1hcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmZjQ2Zi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9rZXltYXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoga2V5bWFwcy5oIC0tIE1hbmlwdWxhdGlvbiBvZiByZWFkbGluZSBrZXltYXBzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWZuZGVmIF9LRVlNQVBTX0hfCi0jZGVmaW5lIF9LRVlNQVBTX0hfCi0KLSNpZiBkZWZpbmVkIChSRUFETElORV9MSUJSQVJZKQotIyAgaW5jbHVkZSAicmxzdGRjLmgiCi0jICBpbmNsdWRlICJjaGFyZGVmcy5oIgotI2Vsc2UKLSMgIGluY2x1ZGUgPHJlYWRsaW5lL3Jsc3RkYy5oPgotIyAgaW5jbHVkZSA8cmVhZGxpbmUvY2hhcmRlZnMuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKF9GVU5DVElPTl9ERUYpCi0jICBkZWZpbmUgX0ZVTkNUSU9OX0RFRgotdHlwZWRlZiBpbnQgRnVuY3Rpb24gKCk7Ci10eXBlZGVmIHZvaWQgVkZ1bmN0aW9uICgpOwotdHlwZWRlZiBjaGFyICpDUEZ1bmN0aW9uICgpOwotdHlwZWRlZiBjaGFyICoqQ1BQRnVuY3Rpb24gKCk7Ci0jZW5kaWYKLQotLyogQSBrZXltYXAgY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGtleSBpbiB0aGUgQVNDSUkgc2V0LgotICAgRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBhIHR5cGUgYW5kIGEgcG9pbnRlci4KLSAgIEZVTkNUSU9OIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gcnVuLCBvciB0aGUKLSAgIGFkZHJlc3Mgb2YgYSBrZXltYXAgdG8gaW5kaXJlY3QgdGhyb3VnaC4KLSAgIFRZUEUgc2F5cyB3aGljaCBraW5kIG9mIHRoaW5nIEZVTkNUSU9OIGlzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2tleW1hcF9lbnRyeSB7Ci0gIGNoYXIgdHlwZTsKLSAgRnVuY3Rpb24gKmZ1bmN0aW9uOwotfSBLRVlNQVBfRU5UUlk7Ci0KLS8qIFRoaXMgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBiaW5kaW5ncyBmb3IgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzCi0gICBpbiBhIGRlc2lyZWQgY2hhcmFjdGVyIHNldCAoZS5nLCAxMjggZm9yIEFTQ0lJLCAyNTYgZm9yIElTTyBMYXRpbi14LAotICAgYW5kIHNvIG9uKS4gKi8KLSNkZWZpbmUgS0VZTUFQX1NJWkUgMjU2Ci0KLS8qIEkgd2FudGVkIHRvIG1ha2UgdGhlIGFib3ZlIHN0cnVjdHVyZSBjb250YWluIGEgdW5pb24gb2Y6Ci0gICB1bmlvbiB7IEZ1bmN0aW9uICpmdW5jdGlvbjsgc3RydWN0IF9rZXltYXBfZW50cnkgKmtleW1hcDsgfSB2YWx1ZTsKLSAgIGJ1dCB0aGlzIG1hZGUgaXQgaW1wb3NzaWJsZSBmb3IgbWUgdG8gY3JlYXRlIGEgc3RhdGljIGFycmF5LgotICAgTWF5YmUgSSBuZWVkIEMgbGVzc29ucy4gKi8KLQotdHlwZWRlZiBLRVlNQVBfRU5UUlkgS0VZTUFQX0VOVFJZX0FSUkFZW0tFWU1BUF9TSVpFXTsKLXR5cGVkZWYgS0VZTUFQX0VOVFJZICpLZXltYXA7Ci0KLS8qIFRoZSB2YWx1ZXMgdGhhdCBUWVBFIGNhbiBoYXZlIGluIGEga2V5bWFwIGVudHJ5LiAqLwotI2RlZmluZSBJU0ZVTkMgMAotI2RlZmluZSBJU0tNQVAgMQotI2RlZmluZSBJU01BQ1IgMgotCi1leHRlcm4gS0VZTUFQX0VOVFJZX0FSUkFZIGVtYWNzX3N0YW5kYXJkX2tleW1hcCwgZW1hY3NfbWV0YV9rZXltYXAsIGVtYWNzX2N0bHhfa2V5bWFwOwotZXh0ZXJuIEtFWU1BUF9FTlRSWV9BUlJBWSB2aV9pbnNlcnRpb25fa2V5bWFwLCB2aV9tb3ZlbWVudF9rZXltYXA7Ci0KLS8qIFJldHVybiBhIG5ldywgZW1wdHkga2V5bWFwLgotICAgRnJlZSBpdCB3aXRoIGZyZWUoKSB3aGVuIHlvdSBhcmUgZG9uZS4gKi8KLWV4dGVybiBLZXltYXAgcmxfbWFrZV9iYXJlX2tleW1hcCBfX1AoKHZvaWQpKTsKLQotLyogUmV0dXJuIGEgbmV3IGtleW1hcCB3aGljaCBpcyBhIGNvcHkgb2YgTUFQLiAqLwotZXh0ZXJuIEtleW1hcCBybF9jb3B5X2tleW1hcCBfX1AoKEtleW1hcCkpOwotCi0vKiBSZXR1cm4gYSBuZXcga2V5bWFwIHdpdGggdGhlIHByaW50aW5nIGNoYXJhY3RlcnMgYm91bmQgdG8gcmxfaW5zZXJ0LAotICAgdGhlIGxvd2VyY2FzZSBNZXRhIGNoYXJhY3RlcnMgYm91bmQgdG8gcnVuIHRoZWlyIGVxdWl2YWxlbnRzLCBhbmQKLSAgIHRoZSBNZXRhIGRpZ2l0cyBib3VuZCB0byBwcm9kdWNlIG51bWVyaWMgYXJndW1lbnRzLiAqLwotZXh0ZXJuIEtleW1hcCBybF9tYWtlX2tleW1hcCBfX1AoKHZvaWQpKTsKLQotLyogRnJlZSB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggYSBrZXltYXAuICovCi1leHRlcm4gdm9pZCBybF9kaXNjYXJkX2tleW1hcCBfX1AoKEtleW1hcCkpOwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYWN0dWFsbHkgYXBwZWFyIGluIGJpbmQuYyAqLwotCi0vKiBSZXR1cm4gdGhlIGtleW1hcCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gbmFtZS4gIE5hbWVzIGxvb2sgbGlrZQotICAgYGVtYWNzJyBvciBgZW1hY3MtbWV0YScgb3IgYHZpLWluc2VydCcuICAqLwotZXh0ZXJuIEtleW1hcCBybF9nZXRfa2V5bWFwX2J5X25hbWUgX19QKChjaGFyICopKTsKLQotLyogUmV0dXJuIHRoZSBjdXJyZW50IGtleW1hcC4gKi8KLWV4dGVybiBLZXltYXAgcmxfZ2V0X2tleW1hcCBfX1AoKHZvaWQpKTsKLQotLyogU2V0IHRoZSBjdXJyZW50IGtleW1hcCB0byBNQVAuICovCi1leHRlcm4gdm9pZCBybF9zZXRfa2V5bWFwIF9fUCgoS2V5bWFwKSk7Ci0KLSNlbmRpZiAvKiBfS0VZTUFQU19IXyAqLwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUva2lsbC5jIGIvcmVhZGxpbmUva2lsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ3MTRmLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL2tpbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKiBraWxsLmMgLS0ga2lsbCByaW5nIG1hbmFnZW1lbnQuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAvKiBmb3IgX1BPU0lYX1ZFUlNJT04gKi8KLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBTeXN0ZW0tc3BlY2lmaWMgZmVhdHVyZSBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZSBmaWxlcy4gKi8KLSNpbmNsdWRlICJybGRlZnMuaCIKLQotLyogU29tZSBzdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmVzLiAqLwotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0jaW5jbHVkZSAiaGlzdG9yeS5oIgotCi1leHRlcm4gaW50IF9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGw7Ci1leHRlcm4gaW50IHJsX2VkaXRpbmdfbW9kZTsKLWV4dGVybiBpbnQgcmxfZXhwbGljaXRfYXJnOwotZXh0ZXJuIEZ1bmN0aW9uICpybF9sYXN0X2Z1bmM7Ci0KLWV4dGVybiB2b2lkIF9ybF9pbml0X2FyZ3VtZW50ICgpOwotZXh0ZXJuIGludCBfcmxfc2V0X21hcmtfYXRfcG9zICgpOwotZXh0ZXJuIHZvaWQgX3JsX2ZpeF9wb2ludCAoKTsKLWV4dGVybiB2b2lkIF9ybF9hYm9ydF9pbnRlcm5hbCAoKTsKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCksICp4cmVhbGxvYyAoKTsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlLaWxsaW5nIE1lY2hhbmlzbQkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBXaGF0IHdlIGFzc3VtZSBmb3IgYSBtYXggbnVtYmVyIG9mIGtpbGxzLiAqLwotI2RlZmluZSBERUZBVUxUX01BWF9LSUxMUyAxMAotCi0vKiBUaGUgcmVhbCB2YXJpYWJsZSB0byBsb29rIGF0IHRvIGZpbmQgb3V0IHdoZW4gdG8gZmx1c2gga2lsbHMuICovCi1zdGF0aWMgaW50IHJsX21heF9raWxscyA9ICBERUZBVUxUX01BWF9LSUxMUzsKLQotLyogV2hlcmUgdG8gc3RvcmUga2lsbGVkIHRleHQuICovCi1zdGF0aWMgY2hhciAqKnJsX2tpbGxfcmluZyA9IChjaGFyICoqKU5VTEw7Ci0KLS8qIFdoZXJlIHdlIGFyZSBpbiB0aGUga2lsbCByaW5nLiAqLwotc3RhdGljIGludCBybF9raWxsX2luZGV4OwotCi0vKiBIb3cgbWFueSBzbG90cyB3ZSBoYXZlIGluIHRoZSBraWxsIHJpbmcuICovCi1zdGF0aWMgaW50IHJsX2tpbGxfcmluZ19sZW5ndGg7Ci0KLS8qIEhvdyB0byBzYXkgdGhhdCB5b3Ugb25seSB3YW50IHRvIHNhdmUgYSBjZXJ0YWluIGFtb3VudAotICAgb2Yga2lsbCBtYXRlcmlhbC4gKi8KLWludAotcmxfc2V0X3JldGFpbmVkX2tpbGxzIChudW0pCi0gICAgIGludCBudW07Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBBZGQgVEVYVCB0byB0aGUga2lsbCByaW5nLCBhbGxvY2F0aW5nIGEgbmV3IGtpbGwgcmluZyBzbG90IGFzIG5lY2Vzc2FyeS4KLSAgIFRoaXMgdXNlcyBURVhUIGRpcmVjdGx5LCBzbyB0aGUgY2FsbGVyIG11c3Qgbm90IGZyZWUgaXQuICBJZiBBUFBFTkQgaXMKLSAgIG5vbi16ZXJvLCBhbmQgdGhlIGxhc3QgY29tbWFuZCB3YXMgYSBraWxsLCB0aGUgdGV4dCBpcyBhcHBlbmRlZCB0byB0aGUKLSAgIGN1cnJlbnQga2lsbCByaW5nIHNsb3QsIG90aGVyd2lzZSBwcmVwZW5kZWQuICovCi1zdGF0aWMgaW50Ci1fcmxfY29weV90b19raWxsX3JpbmcgKHRleHQsIGFwcGVuZCkKLSAgICAgY2hhciAqdGV4dDsKLSAgICAgaW50IGFwcGVuZDsKLXsKLSAgY2hhciAqb2xkLCAqbmV3OwotICBpbnQgc2xvdDsKLQotICAvKiBGaXJzdCwgZmluZCB0aGUgc2xvdCB0byB3b3JrIHdpdGguICovCi0gIGlmIChfcmxfbGFzdF9jb21tYW5kX3dhc19raWxsID09IDApCi0gICAgewotICAgICAgLyogR2V0IGEgbmV3IHNsb3QuICAqLwotICAgICAgaWYgKHJsX2tpbGxfcmluZyA9PSAwKQotCXsKLQkgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IGRlZmluZWQsIHRoZW4gbWFrZSBvbmUuICovCi0JICBybF9raWxsX3JpbmcgPSAoY2hhciAqKikKLQkgICAgeG1hbGxvYyAoKChybF9raWxsX3JpbmdfbGVuZ3RoID0gMSkgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICBybF9raWxsX3Jpbmdbc2xvdCA9IDBdID0gKGNoYXIgKilOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIHRvIGFkZCBhIG5ldyBzbG90IG9uIHRoZSBlbmQsIHVubGVzcyB3ZSBoYXZlCi0JICAgICBleGNlZWRlZCB0aGUgbWF4IGxpbWl0IGZvciByZW1lbWJlcmluZyBraWxscy4gKi8KLQkgIHNsb3QgPSBybF9raWxsX3JpbmdfbGVuZ3RoOwotCSAgaWYgKHNsb3QgPT0gcmxfbWF4X2tpbGxzKQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0JICAgICAgZnJlZSAocmxfa2lsbF9yaW5nWzBdKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xvdDsgaSsrKQotCQlybF9raWxsX3JpbmdbaV0gPSBybF9raWxsX3JpbmdbaSArIDFdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzbG90ID0gcmxfa2lsbF9yaW5nX2xlbmd0aCArPSAxOwotCSAgICAgIHJsX2tpbGxfcmluZyA9IChjaGFyICoqKXhyZWFsbG9jIChybF9raWxsX3JpbmcsIHNsb3QgKiBzaXplb2YgKGNoYXIgKikpOwotCSAgICB9Ci0JICBybF9raWxsX3JpbmdbLS1zbG90XSA9IChjaGFyICopTlVMTDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgc2xvdCA9IHJsX2tpbGxfcmluZ19sZW5ndGggLSAxOwotCi0gIC8qIElmIHRoZSBsYXN0IGNvbW1hbmQgd2FzIGEga2lsbCwgcHJlcGVuZCBvciBhcHBlbmQuICovCi0gIGlmIChfcmxfbGFzdF9jb21tYW5kX3dhc19raWxsICYmIHJsX2VkaXRpbmdfbW9kZSAhPSB2aV9tb2RlKQotICAgIHsKLSAgICAgIG9sZCA9IHJsX2tpbGxfcmluZ1tzbG90XTsKLSAgICAgIG5ldyA9IHhtYWxsb2MgKDEgKyBzdHJsZW4gKG9sZCkgKyBzdHJsZW4gKHRleHQpKTsKLQotICAgICAgaWYgKGFwcGVuZCkKLQl7Ci0JICBzdHJjcHkgKG5ldywgb2xkKTsKLQkgIHN0cmNhdCAobmV3LCB0ZXh0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyY3B5IChuZXcsIHRleHQpOwotCSAgc3RyY2F0IChuZXcsIG9sZCk7Ci0JfQotICAgICAgZnJlZSAob2xkKTsKLSAgICAgIGZyZWUgKHRleHQpOwotICAgICAgcmxfa2lsbF9yaW5nW3Nsb3RdID0gbmV3OwotICAgIH0KLSAgZWxzZQotICAgIHJsX2tpbGxfcmluZ1tzbG90XSA9IHRleHQ7Ci0KLSAgcmxfa2lsbF9pbmRleCA9IHNsb3Q7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgd2F5IHRvIGtpbGwgc29tZXRoaW5nLiAgVGhpcyBhcHBlbmRzIG9yIHByZXBlbmRzIHRvIHRoZSBsYXN0Ci0gICBraWxsLCBpZiB0aGUgbGFzdCBjb21tYW5kIHdhcyBhIGtpbGwgY29tbWFuZC4gIGlmIEZST00gaXMgbGVzcwotICAgdGhhbiBUTywgdGhlbiB0aGUgdGV4dCBpcyBhcHBlbmRlZCwgb3RoZXJ3aXNlIHByZXBlbmRlZC4gIElmIHRoZQotICAgbGFzdCBjb21tYW5kIHdhcyBub3QgYSBraWxsIGNvbW1hbmQsIHRoZW4gYSBuZXcgc2xvdCBpcyBtYWRlIGZvcgotICAgdGhpcyBraWxsLiAqLwotaW50Ci1ybF9raWxsX3RleHQgKGZyb20sIHRvKQotICAgICBpbnQgZnJvbSwgdG87Ci17Ci0gIGNoYXIgKnRleHQ7Ci0KLSAgLyogSXMgdGhlcmUgYW55dGhpbmcgdG8ga2lsbD8gKi8KLSAgaWYgKGZyb20gPT0gdG8pCi0gICAgewotICAgICAgX3JsX2xhc3RfY29tbWFuZF93YXNfa2lsbCsrOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHRleHQgPSBybF9jb3B5X3RleHQgKGZyb20sIHRvKTsKLQotICAvKiBEZWxldGUgdGhlIGNvcGllZCB0ZXh0IGZyb20gdGhlIGxpbmUuICovCi0gIHJsX2RlbGV0ZV90ZXh0IChmcm9tLCB0byk7Ci0KLSAgX3JsX2NvcHlfdG9fa2lsbF9yaW5nICh0ZXh0LCBmcm9tIDwgdG8pOwotCi0gIF9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGwrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vdyBSRU1FTUJFUiEgIEluIG9yZGVyIHRvIGRvIHByZXBlbmRpbmcgb3IgYXBwZW5kaW5nIGNvcnJlY3RseSwga2lsbAotICAgY29tbWFuZHMgYWx3YXlzIG1ha2UgcmxfcG9pbnQncyBvcmlnaW5hbCBwb3NpdGlvbiBiZSB0aGUgRlJPTSBhcmd1bWVudCwKLSAgIGFuZCBybF9wb2ludCdzIGV4dGVudCBiZSB0aGUgVE8gYXJndW1lbnQuICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJS2lsbGluZyBDb21tYW5kcwkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBEZWxldGUgdGhlIHdvcmQgYXQgcG9pbnQsIHNhdmluZyB0aGUgdGV4dCBpbiB0aGUga2lsbCByaW5nLiAqLwotaW50Ci1ybF9raWxsX3dvcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgb3JpZ19wb2ludCA9IHJsX3BvaW50OwotCi0gIGlmIChjb3VudCA8IDApCi0gICAgcmV0dXJuIChybF9iYWNrd2FyZF9raWxsX3dvcmQgKC1jb3VudCwga2V5KSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBybF9mb3J3YXJkX3dvcmQgKGNvdW50LCBrZXkpOwotCi0gICAgICBpZiAocmxfcG9pbnQgIT0gb3JpZ19wb2ludCkKLQlybF9raWxsX3RleHQgKG9yaWdfcG9pbnQsIHJsX3BvaW50KTsKLQotICAgICAgcmxfcG9pbnQgPSBvcmlnX3BvaW50OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJ1Ym91dCB0aGUgd29yZCBiZWZvcmUgcG9pbnQsIHBsYWNpbmcgaXQgb24gdGhlIGtpbGwgcmluZy4gKi8KLWludAotcmxfYmFja3dhcmRfa2lsbF93b3JkIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgaW50IG9yaWdfcG9pbnQgPSBybF9wb2ludDsKLQotICBpZiAoY291bnQgPCAwKQotICAgIHJldHVybiAocmxfa2lsbF93b3JkICgtY291bnQsIGlnbm9yZSkpOwotICBlbHNlCi0gICAgewotICAgICAgcmxfYmFja3dhcmRfd29yZCAoY291bnQsIGlnbm9yZSk7Ci0KLSAgICAgIGlmIChybF9wb2ludCAhPSBvcmlnX3BvaW50KQotCXJsX2tpbGxfdGV4dCAob3JpZ19wb2ludCwgcmxfcG9pbnQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEtpbGwgZnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBJZiBESVJFQ1RJT04gaXMgbmVnYXRpdmUsIGtpbGwKLSAgIGJhY2sgdG8gdGhlIGxpbmUgc3RhcnQgaW5zdGVhZC4gKi8KLWludAotcmxfa2lsbF9saW5lIChkaXJlY3Rpb24sIGlnbm9yZSkKLSAgICAgaW50IGRpcmVjdGlvbiwgaWdub3JlOwotewotICBpbnQgb3JpZ19wb2ludCA9IHJsX3BvaW50OwotCi0gIGlmIChkaXJlY3Rpb24gPCAwKQotICAgIHJldHVybiAocmxfYmFja3dhcmRfa2lsbF9saW5lICgxLCBpZ25vcmUpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJsX2VuZF9vZl9saW5lICgxLCBpZ25vcmUpOwotICAgICAgaWYgKG9yaWdfcG9pbnQgIT0gcmxfcG9pbnQpCi0Jcmxfa2lsbF90ZXh0IChvcmlnX3BvaW50LCBybF9wb2ludCk7Ci0gICAgICBybF9wb2ludCA9IG9yaWdfcG9pbnQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogS2lsbCBiYWNrd2FyZHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgSWYgRElSRUNUSU9OIGlzIG5lZ2F0aXZlLCBraWxsCi0gICBmb3J3YXJkcyB0byB0aGUgbGluZSBlbmQgaW5zdGVhZC4gKi8KLWludAotcmxfYmFja3dhcmRfa2lsbF9saW5lIChkaXJlY3Rpb24sIGlnbm9yZSkKLSAgICAgaW50IGRpcmVjdGlvbiwgaWdub3JlOwotewotICBpbnQgb3JpZ19wb2ludCA9IHJsX3BvaW50OwotCi0gIGlmIChkaXJlY3Rpb24gPCAwKQotICAgIHJldHVybiAocmxfa2lsbF9saW5lICgxLCBpZ25vcmUpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghcmxfcG9pbnQpCi0JZGluZyAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBybF9iZWdfb2ZfbGluZSAoMSwgaWdub3JlKTsKLQkgIHJsX2tpbGxfdGV4dCAob3JpZ19wb2ludCwgcmxfcG9pbnQpOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBLaWxsIHRoZSB3aG9sZSBsaW5lLCBubyBtYXR0ZXIgd2hlcmUgcG9pbnQgaXMuICovCi1pbnQKLXJsX2tpbGxfZnVsbF9saW5lIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgcmxfYmVnaW5fdW5kb19ncm91cCAoKTsKLSAgcmxfcG9pbnQgPSAwOwotICBybF9raWxsX3RleHQgKHJsX3BvaW50LCBybF9lbmQpOwotICBybF9lbmRfdW5kb19ncm91cCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgbWltaWMgdW5peCBsaW5lIGVkaXRpbmcgYmVoYXZpb3VyLCBleGNlcHQgdGhleQotICAgc2F2ZSB0aGUgZGVsZXRlZCB0ZXh0IG9uIHRoZSBraWxsIHJpbmcuICBUaGlzIGlzIHNhZmVyIHRoYW4gbm90IHNhdmluZwotICAgaXQsIGFuZCBzaW5jZSB3ZSBoYXZlIGEgcmluZywgbm9ib2R5IHNob3VsZCBnZXQgc2NyZXdlZC4gKi8KLQotLyogVGhpcyBkb2VzIHdoYXQgQy13IGRvZXMgaW4gVW5peC4gIFdlIGNhbid0IHByZXZlbnQgcGVvcGxlIGZyb20KLSAgIHVzaW5nIGJlaGF2aW91ciB0aGF0IHRoZXkgZXhwZWN0LiAqLwotaW50Ci1ybF91bml4X3dvcmRfcnVib3V0IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IG9yaWdfcG9pbnQ7Ci0KLSAgaWYgKHJsX3BvaW50ID09IDApCi0gICAgZGluZyAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG9yaWdfcG9pbnQgPSBybF9wb2ludDsKLSAgICAgIGlmIChjb3VudCA8PSAwKQotCWNvdW50ID0gMTsKLQotICAgICAgd2hpbGUgKGNvdW50LS0pCi0JewotCSAgd2hpbGUgKHJsX3BvaW50ICYmIHdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50IC0gMV0pKQotCSAgICBybF9wb2ludC0tOwotCi0JICB3aGlsZSAocmxfcG9pbnQgJiYgKHdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50IC0gMV0pID09IDApKQotCSAgICBybF9wb2ludC0tOwotCX0KLQotICAgICAgcmxfa2lsbF90ZXh0IChvcmlnX3BvaW50LCBybF9wb2ludCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogSGVyZSBpcyBDLXUgZG9pbmcgd2hhdCBVbml4IGRvZXMuICBZb3UgZG9uJ3QgKmhhdmUqIHRvIHVzZSB0aGVzZQotICAga2V5LWJpbmRpbmdzLiAgV2UgaGF2ZSBhIGNob2ljZSBvZiBraWxsaW5nIHRoZSBlbnRpcmUgbGluZSwgb3IKLSAgIGtpbGxpbmcgZnJvbSB3aGVyZSB3ZSBhcmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgV2UgY2hvb3NlIHRoZQotICAgbGF0dGVyLCBiZWNhdXNlIGlmIHlvdSBhcmUgYSBVbml4IHdlZW5pZSwgdGhlbiB5b3UgaGF2ZW4ndCBiYWNrc3BhY2VkCi0gICBpbnRvIHRoZSBsaW5lIGF0IGFsbCwgYW5kIGlmIHlvdSBhcmVuJ3QsIHRoZW4geW91IGtub3cgd2hhdCB5b3UgYXJlCi0gICBkb2luZy4gKi8KLWludAotcmxfdW5peF9saW5lX2Rpc2NhcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAocmxfcG9pbnQgPT0gMCkKLSAgICBkaW5nICgpOwotICBlbHNlCi0gICAgewotICAgICAgcmxfa2lsbF90ZXh0IChybF9wb2ludCwgMCk7Ci0gICAgICBybF9wb2ludCA9IDA7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogQ29weSB0aGUgdGV4dCBpbiB0aGUgYHJlZ2lvbicgdG8gdGhlIGtpbGwgcmluZy4gIElmIERFTEVURSBpcyBub24temVybywKLSAgIGRlbGV0ZSB0aGUgdGV4dCBmcm9tIHRoZSBsaW5lIGFzIHdlbGwuICovCi1zdGF0aWMgaW50Ci1yZWdpb25fa2lsbF9pbnRlcm5hbCAoZGVsZXRlKQotICAgICBpbnQgZGVsZXRlOwotewotICBjaGFyICp0ZXh0OwotCi0gIGlmIChybF9tYXJrID09IHJsX3BvaW50KQotICAgIHsKLSAgICAgIF9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGwrKzsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB0ZXh0ID0gcmxfY29weV90ZXh0IChybF9wb2ludCwgcmxfbWFyayk7Ci0gIGlmIChkZWxldGUpCi0gICAgcmxfZGVsZXRlX3RleHQgKHJsX3BvaW50LCBybF9tYXJrKTsKLSAgX3JsX2NvcHlfdG9fa2lsbF9yaW5nICh0ZXh0LCBybF9wb2ludCA8IHJsX21hcmspOwotCi0gIF9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGwrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvcHkgdGhlIHRleHQgaW4gdGhlIHJlZ2lvbiB0byB0aGUga2lsbCByaW5nLiAqLwotaW50Ci1ybF9jb3B5X3JlZ2lvbl90b19raWxsIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgcmV0dXJuIChyZWdpb25fa2lsbF9pbnRlcm5hbCAoMCkpOwotfQotCi0vKiBLaWxsIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHBvaW50IGFuZCBtYXJrLiAqLwotaW50Ci1ybF9raWxsX3JlZ2lvbiAoY291bnQsIGlnbm9yZSkKLSAgICAgaW50IGNvdW50LCBpZ25vcmU7Ci17Ci0gIGludCByOwotCi0gIHIgPSByZWdpb25fa2lsbF9pbnRlcm5hbCAoMSk7Ci0gIF9ybF9maXhfcG9pbnQgKDEpOwotICByZXR1cm4gcjsKLX0KLQotLyogQ29weSBDT1VOVCB3b3JkcyB0byB0aGUga2lsbCByaW5nLiAgRElSIHNheXMgd2hpY2ggZGlyZWN0aW9uIHdlIGxvb2sKLSAgIHRvIGZpbmQgdGhlIHdvcmRzLiAqLwotc3RhdGljIGludAotX3JsX2NvcHlfd29yZF9hc19raWxsIChjb3VudCwgZGlyKQotICAgICBpbnQgY291bnQsIGRpcjsKLXsKLSAgaW50IG9tLCBvcCwgcjsKLQotICBvbSA9IHJsX21hcms7Ci0gIG9wID0gcmxfcG9pbnQ7Ci0KLSAgaWYgKGRpciA+IDApCi0gICAgcmxfZm9yd2FyZF93b3JkIChjb3VudCwgMCk7Ci0gIGVsc2UKLSAgICBybF9iYWNrd2FyZF93b3JkIChjb3VudCwgMCk7Ci0KLSAgcmxfbWFyayA9IHJsX3BvaW50OwotCi0gIGlmIChkaXIgPiAwKQotICAgIHJsX2JhY2t3YXJkX3dvcmQgKGNvdW50LCAwKTsKLSAgZWxzZQotICAgIHJsX2ZvcndhcmRfd29yZCAoY291bnQsIDApOwotCi0gIHIgPSByZWdpb25fa2lsbF9pbnRlcm5hbCAoMCk7Ci0KLSAgcmxfbWFyayA9IG9tOwotICBybF9wb2ludCA9IG9wOwotCi0gIHJldHVybiByOwotfQotCi1pbnQKLXJsX2NvcHlfZm9yd2FyZF93b3JkIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKGNvdW50IDwgMCkKLSAgICByZXR1cm4gKHJsX2NvcHlfYmFja3dhcmRfd29yZCAoLWNvdW50LCBrZXkpKTsKLQotICByZXR1cm4gKF9ybF9jb3B5X3dvcmRfYXNfa2lsbCAoY291bnQsIDEpKTsKLX0KLQotaW50Ci1ybF9jb3B5X2JhY2t3YXJkX3dvcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoY291bnQgPCAwKQotICAgIHJldHVybiAocmxfY29weV9mb3J3YXJkX3dvcmQgKC1jb3VudCwga2V5KSk7Ci0KLSAgcmV0dXJuIChfcmxfY29weV93b3JkX2FzX2tpbGwgKGNvdW50LCAtMSkpOwotfQotICAKLS8qIFlhbmsgYmFjayB0aGUgbGFzdCBraWxsZWQgdGV4dC4gIFRoaXMgaWdub3JlcyBhcmd1bWVudHMuICovCi1pbnQKLXJsX3lhbmsgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICBpZiAocmxfa2lsbF9yaW5nID09IDApCi0gICAgewotICAgICAgX3JsX2Fib3J0X2ludGVybmFsICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBfcmxfc2V0X21hcmtfYXRfcG9zIChybF9wb2ludCk7Ci0gIHJsX2luc2VydF90ZXh0IChybF9raWxsX3Jpbmdbcmxfa2lsbF9pbmRleF0pOwotICByZXR1cm4gMDsKLX0KLQotLyogSWYgdGhlIGxhc3QgY29tbWFuZCB3YXMgeWFuaywgb3IgeWFua19wb3AsIGFuZCB0aGUgdGV4dCBqdXN0Ci0gICBiZWZvcmUgcG9pbnQgaXMgaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IGtpbGwgaXRlbSwgdGhlbgotICAgZGVsZXRlIHRoYXQgdGV4dCBmcm9tIHRoZSBsaW5lLCByb3RhdGUgdGhlIGluZGV4IGRvd24sIGFuZAotICAgeWFuayBiYWNrIHNvbWUgb3RoZXIgdGV4dC4gKi8KLWludAotcmxfeWFua19wb3AgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgbCwgbjsKLQotICBpZiAoKChybF9sYXN0X2Z1bmMgIT0gcmxfeWFua19wb3ApICYmIChybF9sYXN0X2Z1bmMgIT0gcmxfeWFuaykpIHx8Ci0gICAgICAhcmxfa2lsbF9yaW5nKQotICAgIHsKLSAgICAgIF9ybF9hYm9ydF9pbnRlcm5hbCAoKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbCA9IHN0cmxlbiAocmxfa2lsbF9yaW5nW3JsX2tpbGxfaW5kZXhdKTsKLSAgbiA9IHJsX3BvaW50IC0gbDsKLSAgaWYgKG4gPj0gMCAmJiBTVFJFUU4gKHJsX2xpbmVfYnVmZmVyICsgbiwgcmxfa2lsbF9yaW5nW3JsX2tpbGxfaW5kZXhdLCBsKSkKLSAgICB7Ci0gICAgICBybF9kZWxldGVfdGV4dCAobiwgcmxfcG9pbnQpOwotICAgICAgcmxfcG9pbnQgPSBuOwotICAgICAgcmxfa2lsbF9pbmRleC0tOwotICAgICAgaWYgKHJsX2tpbGxfaW5kZXggPCAwKQotCXJsX2tpbGxfaW5kZXggPSBybF9raWxsX3JpbmdfbGVuZ3RoIC0gMTsKLSAgICAgIHJsX3lhbmsgKDEsIDApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX3JsX2Fib3J0X2ludGVybmFsICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotLyogWWFuayB0aGUgQ09VTlRoIGFyZ3VtZW50IGZyb20gdGhlIHByZXZpb3VzIGhpc3RvcnkgbGluZSwgc2tpcHBpbmcKLSAgIEhJU1RPUllfU0tJUCBsaW5lcyBiZWZvcmUgbG9va2luZyBmb3IgdGhlIGBwcmV2aW91cyBsaW5lJy4gKi8KLXN0YXRpYyBpbnQKLXJsX3lhbmtfbnRoX2FyZ19pbnRlcm5hbCAoY291bnQsIGlnbm9yZSwgaGlzdG9yeV9za2lwKQotICAgICBpbnQgY291bnQsIGlnbm9yZSwgaGlzdG9yeV9za2lwOwotewotICByZWdpc3RlciBISVNUX0VOVFJZICplbnRyeTsKLSAgY2hhciAqYXJnOwotICBpbnQgaTsKLQotICBpZiAoaGlzdG9yeV9za2lwKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b3J5X3NraXA7IGkrKykKLQllbnRyeSA9IHByZXZpb3VzX2hpc3RvcnkgKCk7Ci0gICAgfQotCi0gIGVudHJ5ID0gcHJldmlvdXNfaGlzdG9yeSAoKTsKLSAgaWYgKGVudHJ5KQotICAgIHsKLSAgICAgIGlmIChoaXN0b3J5X3NraXApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IGhpc3Rvcnlfc2tpcDsgaSsrKQotCSAgICBuZXh0X2hpc3RvcnkgKCk7Ci0JfQotICAgICAgbmV4dF9oaXN0b3J5ICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGFyZyA9IGhpc3RvcnlfYXJnX2V4dHJhY3QgKGNvdW50LCBjb3VudCwgZW50cnktPmxpbmUpOwotICBpZiAoIWFyZyB8fCAhKmFyZykKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotCi0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSAgLyogVmkgbW9kZSBhbHdheXMgaW5zZXJ0cyBhIHNwYWNlIGJlZm9yZSB5YW5raW5nIHRoZSBhcmd1bWVudCwgYW5kIGl0Ci0gICAgIGluc2VydHMgaXQgcmlnaHQgKmFmdGVyKiBybF9wb2ludC4gKi8KLSAgaWYgKHJsX2VkaXRpbmdfbW9kZSA9PSB2aV9tb2RlKQotICAgIHsKLSAgICAgIHJsX3ZpX2FwcGVuZF9tb2RlICgxLCBpZ25vcmUpOwotICAgICAgcmxfaW5zZXJ0X3RleHQgKCIgIik7Ci0gICAgfQotI2VuZGlmIC8qIFZJX01PREUgKi8KLQotICBybF9pbnNlcnRfdGV4dCAoYXJnKTsKLSAgZnJlZSAoYXJnKTsKLQotICBybF9lbmRfdW5kb19ncm91cCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFlhbmsgdGhlIENPVU5UdGggYXJndW1lbnQgZnJvbSB0aGUgcHJldmlvdXMgaGlzdG9yeSBsaW5lLiAqLwotaW50Ci1ybF95YW5rX250aF9hcmcgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICByZXR1cm4gKHJsX3lhbmtfbnRoX2FyZ19pbnRlcm5hbCAoY291bnQsIGlnbm9yZSwgMCkpOwotfQotCi0vKiBZYW5rIHRoZSBsYXN0IGFyZ3VtZW50IGZyb20gdGhlIHByZXZpb3VzIGhpc3RvcnkgbGluZS4gIFRoaXMgYGtub3dzJwotICAgaG93IHJsX3lhbmtfbnRoX2FyZyB0cmVhdHMgYSBjb3VudCBvZiBgJCcuICBXaXRoIGFuIGFyZ3VtZW50LCB0aGlzCi0gICBiZWhhdmVzIHRoZSBzYW1lIGFzIHJsX3lhbmtfbnRoX2FyZy4gKi8KLWludAotcmxfeWFua19sYXN0X2FyZyAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHN0YXRpYyBpbnQgaGlzdG9yeV9za2lwID0gMDsKLSAgc3RhdGljIGludCBleHBsaWNpdF9hcmdfcCA9IDA7Ci0gIHN0YXRpYyBpbnQgY291bnRfcGFzc2VkID0gMTsKLSAgc3RhdGljIGludCBkaXJlY3Rpb24gPSAxOwotICBzdGF0aWMgaW50IHVuZG9fbmVlZGVkID0gMDsKLSAgaW50IHJldHZhbDsKLQotICBpZiAocmxfbGFzdF9mdW5jICE9IHJsX3lhbmtfbGFzdF9hcmcpCi0gICAgewotICAgICAgaGlzdG9yeV9za2lwID0gMDsKLSAgICAgIGV4cGxpY2l0X2FyZ19wID0gcmxfZXhwbGljaXRfYXJnOwotICAgICAgY291bnRfcGFzc2VkID0gY291bnQ7Ci0gICAgICBkaXJlY3Rpb24gPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh1bmRvX25lZWRlZCkKLQlybF9kb191bmRvICgpOwotICAgICAgaWYgKGNvdW50IDwgMSkKLSAgICAgICAgZGlyZWN0aW9uID0gLWRpcmVjdGlvbjsKLSAgICAgIGhpc3Rvcnlfc2tpcCArPSBkaXJlY3Rpb247Ci0gICAgICBpZiAoaGlzdG9yeV9za2lwIDwgMCkKLQloaXN0b3J5X3NraXAgPSAwOwotICAgIH0KLSAKLSAgaWYgKGV4cGxpY2l0X2FyZ19wKQotICAgIHJldHZhbCA9IHJsX3lhbmtfbnRoX2FyZ19pbnRlcm5hbCAoY291bnRfcGFzc2VkLCBrZXksIGhpc3Rvcnlfc2tpcCk7Ci0gIGVsc2UKLSAgICByZXR2YWwgPSBybF95YW5rX250aF9hcmdfaW50ZXJuYWwgKCckJywga2V5LCBoaXN0b3J5X3NraXApOwotCi0gIHVuZG9fbmVlZGVkID0gcmV0dmFsID09IDA7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIEEgc3BlY2lhbCBwYXN0ZSBjb21tYW5kIGZvciB1c2VycyBvZiBDeWdudXMncyBjeWd3aW4zMi4gKi8KLSNpZiBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1pbnQKLXJsX3Bhc3RlX2Zyb21fY2xpcGJvYXJkIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgY2hhciAqZGF0YSwgKnB0cjsKLSAgaW50IGxlbjsKLQotICBpZiAoT3BlbkNsaXBib2FyZCAoTlVMTCkgPT0gMCkKLSAgICByZXR1cm4gKDApOwotCi0gIGRhdGEgPSAoY2hhciAqKUdldENsaXBib2FyZERhdGEgKENGX1RFWFQpOwotICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICBwdHIgPSBzdHJjaHIgKGRhdGEsICdccicpOwotICAgICAgaWYgKHB0cikKLQl7Ci0JICBsZW4gPSBwdHIgLSBkYXRhOwotCSAgcHRyID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBwdHJbbGVuXSA9ICdcMCc7Ci0JICBzdHJuY3B5IChwdHIsIGRhdGEsIGxlbik7Ci0JfQotICAgICAgZWxzZQotICAgICAgICBwdHIgPSBkYXRhOwotICAgICAgcmxfaW5zZXJ0X3RleHQgKHB0cik7Ci0gICAgICBpZiAocHRyICE9IGRhdGEpCi0JZnJlZSAocHRyKTsKLSAgICAgIENsb3NlQ2xpcGJvYXJkICgpOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZiAvKiBfX0NZR1dJTjMyX18gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL21hY3JvLmMgYi9yZWFkbGluZS9tYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M0NDJiLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL21hY3JvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogbWFjcm8uYyAtLSBrZXlib2FyZCBtYWNyb3MgZm9yIHJlYWRsaW5lLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotI2RlZmluZSBSRUFETElORV9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkIChIQVZFX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgICAgLyogZm9yIF9QT1NJWF9WRVJTSU9OICovCi0jZW5kaWYgLyogSEFWRV9VTklTVERfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERMSUJfSCkKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgImFuc2lfc3RkbGliLmgiCi0jZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogU3lzdGVtLXNwZWNpZmljIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgZmlsZXMuICovCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotI2luY2x1ZGUgImhpc3RvcnkuaCIKLQotI2RlZmluZSBTV0FQKHMsIGUpICBkbyB7IGludCB0OyB0ID0gczsgcyA9IGU7IGUgPSB0OyB9IHdoaWxlICgwKQotCi0vKiBGb3J3YXJkIGRlZmluaXRpb25zLiAqLwotdm9pZCBfcmxfcHVzaF9leGVjdXRpbmdfbWFjcm8gKCksIF9ybF9wb3BfZXhlY3V0aW5nX21hY3JvICgpOwotdm9pZCBfcmxfYWRkX21hY3JvX2NoYXIgKCk7Ci0KLS8qIEV4dGVybiBkZWNsYXJhdGlvbnMuICovCi1leHRlcm4gaW50IHJsX2V4cGxpY2l0X2FyZzsKLWV4dGVybiBpbnQgcmxfa2V5X3NlcXVlbmNlX2xlbmd0aDsKLQotZXh0ZXJuIHZvaWQgX3JsX2Fib3J0X2ludGVybmFsICgpOwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUhhY2tpbmcgS2V5Ym9hcmQgTWFjcm9zIAkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIE5vbi16ZXJvIG1lYW5zIHRvIHNhdmUga2V5cyB0aGF0IHdlIGRpc3BhdGNoIG9uIGluIGEga2JkIG1hY3JvLiAqLwotaW50IF9ybF9kZWZpbmluZ19rYmRfbWFjcm8gPSAwOwotCi0vKiBUaGUgY3VycmVudGx5IGV4ZWN1dGluZyBtYWNybyBzdHJpbmcuICBJZiB0aGlzIGlzIG5vbi16ZXJvLAotICAgdGhlbiBpdCBpcyBhIG1hbGxvYyAoKSdlZCBzdHJpbmcgd2hlcmUgaW5wdXQgaXMgY29taW5nIGZyb20uICovCi1jaGFyICpfcmxfZXhlY3V0aW5nX21hY3JvID0gKGNoYXIgKilOVUxMOwotCi0vKiBUaGUgb2Zmc2V0IGluIHRoZSBhYm92ZSBzdHJpbmcgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQuICovCi1zdGF0aWMgaW50IGV4ZWN1dGluZ19tYWNyb19pbmRleDsKLQotLyogVGhlIGN1cnJlbnQgbWFjcm8gc3RyaW5nIGJlaW5nIGJ1aWx0LiAgQ2hhcmFjdGVycyBnZXQgc3R1ZmZlZAotICAgaW4gaGVyZSBieSBhZGRfbWFjcm9fY2hhciAoKS4gKi8KLXN0YXRpYyBjaGFyICpjdXJyZW50X21hY3JvID0gKGNoYXIgKilOVUxMOwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCB0byBjdXJyZW50X21hY3JvLiAqLwotc3RhdGljIGludCBjdXJyZW50X21hY3JvX3NpemU7Ci0KLS8qIFRoZSBpbmRleCBhdCB3aGljaCBjaGFyYWN0ZXJzIGFyZSBiZWluZyBhZGRlZCB0byBjdXJyZW50X21hY3JvLiAqLwotc3RhdGljIGludCBjdXJyZW50X21hY3JvX2luZGV4OwotCi0vKiBBIHN0cnVjdHVyZSB1c2VkIHRvIHNhdmUgbmVzdGVkIG1hY3JvIHN0cmluZ3MuCi0gICBJdCBpcyBhIGxpbmtlZCBsaXN0IG9mIHN0cmluZy9pbmRleCBmb3IgZWFjaCBzYXZlZCBtYWNyby4gKi8KLXN0cnVjdCBzYXZlZF9tYWNybyB7Ci0gIHN0cnVjdCBzYXZlZF9tYWNybyAqbmV4dDsKLSAgY2hhciAqc3RyaW5nOwotICBpbnQgc2luZGV4OwotfTsKLQotLyogVGhlIGxpc3Qgb2Ygc2F2ZWQgbWFjcm9zLiAqLwotc3RhdGljIHN0cnVjdCBzYXZlZF9tYWNybyAqbWFjcm9fbGlzdCA9IChzdHJ1Y3Qgc2F2ZWRfbWFjcm8gKilOVUxMOwotCi0vKiBTZXQgdXAgdG8gcmVhZCBzdWJzZXF1ZW50IGlucHV0IGZyb20gU1RSSU5HLgotICAgU1RSSU5HIGlzIGZyZWUgKCknZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGl0LiAqLwotdm9pZAotX3JsX3dpdGhfbWFjcm9faW5wdXQgKHN0cmluZykKLSAgICAgY2hhciAqc3RyaW5nOwotewotICBfcmxfcHVzaF9leGVjdXRpbmdfbWFjcm8gKCk7Ci0gIF9ybF9leGVjdXRpbmdfbWFjcm8gPSBzdHJpbmc7Ci0gIGV4ZWN1dGluZ19tYWNyb19pbmRleCA9IDA7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgYXZhaWxhYmxlIGZyb20gYSBtYWNybywgb3IgMCBpZgotICAgdGhlcmUgYXJlIG5vIG1hY3JvIGNoYXJhY3RlcnMuICovCi1pbnQKLV9ybF9uZXh0X21hY3JvX2tleSAoKQotewotICBpZiAoX3JsX2V4ZWN1dGluZ19tYWNybyA9PSAwKQotICAgIHJldHVybiAoMCk7Ci0KLSAgaWYgKF9ybF9leGVjdXRpbmdfbWFjcm9bZXhlY3V0aW5nX21hY3JvX2luZGV4XSA9PSAwKQotICAgIHsKLSAgICAgIF9ybF9wb3BfZXhlY3V0aW5nX21hY3JvICgpOwotICAgICAgcmV0dXJuIChfcmxfbmV4dF9tYWNyb19rZXkgKCkpOwotICAgIH0KLQotICByZXR1cm4gKF9ybF9leGVjdXRpbmdfbWFjcm9bZXhlY3V0aW5nX21hY3JvX2luZGV4KytdKTsKLX0KLQotLyogU2F2ZSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBtYWNybyBvbiBhIHN0YWNrIG9mIHNhdmVkIG1hY3Jvcy4gKi8KLXZvaWQKLV9ybF9wdXNoX2V4ZWN1dGluZ19tYWNybyAoKQotewotICBzdHJ1Y3Qgc2F2ZWRfbWFjcm8gKnNhdmVyOwotCi0gIHNhdmVyID0gKHN0cnVjdCBzYXZlZF9tYWNybyAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNhdmVkX21hY3JvKSk7Ci0gIHNhdmVyLT5uZXh0ID0gbWFjcm9fbGlzdDsKLSAgc2F2ZXItPnNpbmRleCA9IGV4ZWN1dGluZ19tYWNyb19pbmRleDsKLSAgc2F2ZXItPnN0cmluZyA9IF9ybF9leGVjdXRpbmdfbWFjcm87Ci0KLSAgbWFjcm9fbGlzdCA9IHNhdmVyOwotfQotCi0vKiBEaXNjYXJkIHRoZSBjdXJyZW50IG1hY3JvLCByZXBsYWNpbmcgaXQgd2l0aCB0aGUgb25lCi0gICBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayBvZiBzYXZlZCBtYWNyb3MuICovCi12b2lkCi1fcmxfcG9wX2V4ZWN1dGluZ19tYWNybyAoKQotewotICBzdHJ1Y3Qgc2F2ZWRfbWFjcm8gKm1hY3JvOwotCi0gIGlmIChfcmxfZXhlY3V0aW5nX21hY3JvKQotICAgIGZyZWUgKF9ybF9leGVjdXRpbmdfbWFjcm8pOwotCi0gIF9ybF9leGVjdXRpbmdfbWFjcm8gPSAoY2hhciAqKU5VTEw7Ci0gIGV4ZWN1dGluZ19tYWNyb19pbmRleCA9IDA7Ci0KLSAgaWYgKG1hY3JvX2xpc3QpCi0gICAgewotICAgICAgbWFjcm8gPSBtYWNyb19saXN0OwotICAgICAgX3JsX2V4ZWN1dGluZ19tYWNybyA9IG1hY3JvX2xpc3QtPnN0cmluZzsKLSAgICAgIGV4ZWN1dGluZ19tYWNyb19pbmRleCA9IG1hY3JvX2xpc3QtPnNpbmRleDsKLSAgICAgIG1hY3JvX2xpc3QgPSBtYWNyb19saXN0LT5uZXh0OwotICAgICAgZnJlZSAobWFjcm8pOwotICAgIH0KLX0KLQotLyogQWRkIGEgY2hhcmFjdGVyIHRvIHRoZSBtYWNybyBiZWluZyBidWlsdC4gKi8KLXZvaWQKLV9ybF9hZGRfbWFjcm9fY2hhciAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChjdXJyZW50X21hY3JvX2luZGV4ICsgMSA+PSBjdXJyZW50X21hY3JvX3NpemUpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfbWFjcm8gPT0gMCkKLQljdXJyZW50X21hY3JvID0geG1hbGxvYyAoY3VycmVudF9tYWNyb19zaXplID0gMjUpOwotICAgICAgZWxzZQotCWN1cnJlbnRfbWFjcm8gPSB4cmVhbGxvYyAoY3VycmVudF9tYWNybywgY3VycmVudF9tYWNyb19zaXplICs9IDI1KTsKLSAgICB9Ci0KLSAgY3VycmVudF9tYWNyb1tjdXJyZW50X21hY3JvX2luZGV4KytdID0gYzsKLSAgY3VycmVudF9tYWNyb1tjdXJyZW50X21hY3JvX2luZGV4XSA9ICdcMCc7Ci19Ci0KLXZvaWQKLV9ybF9raWxsX2tiZF9tYWNybyAoKQotewotICBpZiAoY3VycmVudF9tYWNybykKLSAgICB7Ci0gICAgICBmcmVlIChjdXJyZW50X21hY3JvKTsKLSAgICAgIGN1cnJlbnRfbWFjcm8gPSAoY2hhciAqKSBOVUxMOwotICAgIH0KLSAgY3VycmVudF9tYWNyb19zaXplID0gY3VycmVudF9tYWNyb19pbmRleCA9IDA7Ci0KLSAgaWYgKF9ybF9leGVjdXRpbmdfbWFjcm8pCi0gICAgewotICAgICAgZnJlZSAoX3JsX2V4ZWN1dGluZ19tYWNybyk7Ci0gICAgICBfcmxfZXhlY3V0aW5nX21hY3JvID0gKGNoYXIgKikgTlVMTDsKLSAgICB9Ci0gIGV4ZWN1dGluZ19tYWNyb19pbmRleCA9IDA7Ci0KLSAgX3JsX2RlZmluaW5nX2tiZF9tYWNybyA9IDA7Ci19Ci0KLS8qIEJlZ2luIGRlZmluaW5nIGEga2V5Ym9hcmQgbWFjcm8uCi0gICBLZXlzdHJva2VzIGFyZSByZWNvcmRlZCBhcyB0aGV5IGFyZSBleGVjdXRlZC4KLSAgIEVuZCB0aGUgZGVmaW5pdGlvbiB3aXRoIHJsX2VuZF9rYmRfbWFjcm8gKCkuCi0gICBJZiBhIG51bWVyaWMgYXJndW1lbnQgd2FzIGV4cGxpY2l0bHkgdHlwZWQsIHRoZW4gYXBwZW5kIHRoaXMKLSAgIGRlZmluaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgbWFjcm8sIGFuZCBzdGFydCBieQotICAgcmUtZXhlY3V0aW5nIHRoZSBleGlzdGluZyBtYWNyby4gKi8KLWludAotcmxfc3RhcnRfa2JkX21hY3JvIChpZ25vcmUxLCBpZ25vcmUyKQotICAgICBpbnQgaWdub3JlMSwgaWdub3JlMjsKLXsKLSAgaWYgKF9ybF9kZWZpbmluZ19rYmRfbWFjcm8pCi0gICAgewotICAgICAgX3JsX2Fib3J0X2ludGVybmFsICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAocmxfZXhwbGljaXRfYXJnKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X21hY3JvKQotCV9ybF93aXRoX21hY3JvX2lucHV0IChzYXZlc3RyaW5nIChjdXJyZW50X21hY3JvKSk7Ci0gICAgfQotICBlbHNlCi0gICAgY3VycmVudF9tYWNyb19pbmRleCA9IDA7Ci0KLSAgX3JsX2RlZmluaW5nX2tiZF9tYWNybyA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBTdG9wIGRlZmluaW5nIGEga2V5Ym9hcmQgbWFjcm8uCi0gICBBIG51bWVyaWMgYXJndW1lbnQgc2F5cyB0byBleGVjdXRlIHRoZSBtYWNybyByaWdodCBub3csCi0gICB0aGF0IG1hbnkgdGltZXMsIGNvdW50aW5nIHRoZSBkZWZpbml0aW9uIGFzIHRoZSBmaXJzdCB0aW1lLiAqLwotaW50Ci1ybF9lbmRfa2JkX21hY3JvIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgaWYgKF9ybF9kZWZpbmluZ19rYmRfbWFjcm8gPT0gMCkKLSAgICB7Ci0gICAgICBfcmxfYWJvcnRfaW50ZXJuYWwgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGN1cnJlbnRfbWFjcm9faW5kZXggLT0gcmxfa2V5X3NlcXVlbmNlX2xlbmd0aCAtIDE7Ci0gIGN1cnJlbnRfbWFjcm9bY3VycmVudF9tYWNyb19pbmRleF0gPSAnXDAnOwotCi0gIF9ybF9kZWZpbmluZ19rYmRfbWFjcm8gPSAwOwotCi0gIHJldHVybiAocmxfY2FsbF9sYXN0X2tiZF9tYWNybyAoLS1jb3VudCwgMCkpOwotfQotCi0vKiBFeGVjdXRlIHRoZSBtb3N0IHJlY2VudGx5IGRlZmluZWQga2V5Ym9hcmQgbWFjcm8uCi0gICBDT1VOVCBzYXlzIGhvdyBtYW55IHRpbWVzIHRvIGV4ZWN1dGUgaXQuICovCi1pbnQKLXJsX2NhbGxfbGFzdF9rYmRfbWFjcm8gKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICBpZiAoY3VycmVudF9tYWNybyA9PSAwKQotICAgIF9ybF9hYm9ydF9pbnRlcm5hbCAoKTsKLQotICBpZiAoX3JsX2RlZmluaW5nX2tiZF9tYWNybykKLSAgICB7Ci0gICAgICBkaW5nICgpOwkJLyogbm8gcmVjdXJzaXZlIG1hY3JvcyAqLwotICAgICAgY3VycmVudF9tYWNyb1stLWN1cnJlbnRfbWFjcm9faW5kZXhdID0gJ1wwJzsJLyogZXJhc2UgdGhpcyBjaGFyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgX3JsX3dpdGhfbWFjcm9faW5wdXQgKHNhdmVzdHJpbmcgKGN1cnJlbnRfbWFjcm8pKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXJsX3B1c2hfbWFjcm9faW5wdXQgKG1hY3JvKQotICAgICBjaGFyICptYWNybzsKLXsKLSAgX3JsX3dpdGhfbWFjcm9faW5wdXQgKG1hY3JvKTsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL25scy5jIGIvcmVhZGxpbmUvbmxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDQxM2QuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvbmxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyogbmxzLmMgLS0gc2tlbGV0YWwgaW50ZXJuYXRpb25hbGl6YXRpb24gY29kZS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xPQ0FMRV9IKQotIyAgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJybGRlZnMuaCIKLQotZXh0ZXJuIGludCBfcmxfY29udmVydF9tZXRhX2NoYXJzX3RvX2FzY2lpOwotZXh0ZXJuIGludCBfcmxfb3V0cHV0X21ldGFfY2hhcnM7Ci1leHRlcm4gaW50IF9ybF9tZXRhX2ZsYWc7Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHNoZWxsLmMgKi8KLWV4dGVybiBjaGFyICpnZXRfZW52X3ZhbHVlICgpOwotCi0jaWYgIWRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAgICAKLS8qIEEgbGlzdCBvZiBsZWdhbCB2YWx1ZXMgZm9yIHRoZSBMQU5HIG9yIExDX0NUWVBFIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLSAgIElmIGEgbG9jYWxlIG5hbWUgaW4gdGhpcyBsaXN0IGlzIHRoZSB2YWx1ZSBmb3IgdGhlIExDX0FMTCwgTENfQ1RZUEUsCi0gICBvciBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlICh1c2luZyB0aGUgZmlyc3Qgb2YgdGhvc2Ugd2l0aCBhIHZhbHVlKSwKLSAgIHJlYWRsaW5lIGVpZ2h0LWJpdCBtb2RlIGlzIGVuYWJsZWQuICovCi1zdGF0aWMgY2hhciAqbGVnYWxfbGFuZ192YWx1ZXNbXSA9Ci17Ci0gImlzbzg4NTkxIiwKLSAiaXNvODg1OTIiLAotICJpc284ODU5MyIsCi0gImlzbzg4NTk0IiwKLSAiaXNvODg1OTUiLAotICJpc284ODU5NiIsCi0gImlzbzg4NTk3IiwKLSAiaXNvODg1OTgiLAotICJpc284ODU5OSIsCi0gImlzbzg4NTkxMCIsCi0gImtvaThyIiwKLSAia29pOC1yIiwgCi0gIDAKLX07Ci0KLXN0YXRpYyBjaGFyICpub3JtYWxpemVfY29kZXNldCAoKTsKLXN0YXRpYyBjaGFyICpmaW5kX2NvZGVzZXQgKCk7Ci0jZW5kaWYgLyogIUhBVkVfU0VUTE9DQUxFICovCi0KLS8qIENoZWNrIGZvciBMQ19BTEwsIExDX0NUWVBFLCBhbmQgTEFORyBhbmQgdXNlIHRoZSBmaXJzdCB3aXRoIGEgdmFsdWUKLSAgIHRvIGRlY2lkZSB0aGUgZGVmYXVsdHMgZm9yIDgtYml0IGNoYXJhY3RlciBpbnB1dCBhbmQgb3V0cHV0LiAgUmV0dXJucwotICAgMSBpZiB3ZSBzZXQgZWlnaHQtYml0IG1vZGUuICovCi1pbnQKLV9ybF9pbml0X2VpZ2h0Yml0ICgpCi17Ci0vKiBJZiB3ZSBoYXZlIHNldGxvY2FsZSgzKSwganVzdCBjaGVjayB0aGUgY3VycmVudCBMQ19DVFlQRSBjYXRlZ29yeQotICAgdmFsdWUsIGFuZCBnbyBpbnRvIGVpZ2h0LWJpdCBtb2RlIGlmIGl0J3Mgbm90IEMgb3IgUE9TSVguICovCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpCi0gIGNoYXIgKnQ7Ci0KLSAgLyogU2V0IHRoZSBMQ19DVFlQRSBsb2NhbGUgY2F0ZWdvcnkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICovCi0gIHQgPSBzZXRsb2NhbGUgKExDX0NUWVBFLCAiIik7Ci0gIGlmICh0ICYmICp0ICYmICh0WzBdICE9ICdDJyB8fCB0WzFdKSAmJiAoU1RSRVEgKHQsICJQT1NJWCIpID09IDApKQotICAgIHsKLSAgICAgIF9ybF9tZXRhX2ZsYWcgPSAxOwotICAgICAgX3JsX2NvbnZlcnRfbWV0YV9jaGFyc190b19hc2NpaSA9IDA7Ci0gICAgICBfcmxfb3V0cHV0X21ldGFfY2hhcnMgPSAxOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKDApOwotCi0jZWxzZSAvKiAhSEFWRV9TRVRMT0NBTEUgKi8KLSAgY2hhciAqbHNwZWMsICp0OwotICBpbnQgaTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHNldGxvY2FsZS4gIEZpbmVzc2UgaXQuICBDaGVjayB0aGUgZW52aXJvbm1lbnQgZm9yIHRoZQotICAgICBhcHByb3ByaWF0ZSB2YXJpYWJsZXMgYW5kIHNldCBlaWdodC1iaXQgbW9kZSBpZiB0aGV5IGhhdmUgdGhlIHJpZ2h0Ci0gICAgIHZhbHVlcy4gKi8KLSAgbHNwZWMgPSBnZXRfZW52X3ZhbHVlICgiTENfQUxMIik7Ci0gIGlmIChsc3BlYyA9PSAwKSBsc3BlYyA9IGdldF9lbnZfdmFsdWUgKCJMQ19DVFlQRSIpOwotICBpZiAobHNwZWMgPT0gMCkgbHNwZWMgPSBnZXRfZW52X3ZhbHVlICgiTEFORyIpOwotICBpZiAobHNwZWMgPT0gMCB8fCAodCA9IG5vcm1hbGl6ZV9jb2Rlc2V0IChsc3BlYykpID09IDApCi0gICAgcmV0dXJuICgwKTsKLSAgZm9yIChpID0gMDsgdCAmJiBsZWdhbF9sYW5nX3ZhbHVlc1tpXTsgaSsrKQotICAgIGlmIChTVFJFUSAodCwgbGVnYWxfbGFuZ192YWx1ZXNbaV0pKQotICAgICAgewotCV9ybF9tZXRhX2ZsYWcgPSAxOwotCV9ybF9jb252ZXJ0X21ldGFfY2hhcnNfdG9fYXNjaWkgPSAwOwotCV9ybF9vdXRwdXRfbWV0YV9jaGFycyA9IDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIGZyZWUgKHQpOwotICByZXR1cm4gKGxlZ2FsX2xhbmdfdmFsdWVzW2ldID8gMSA6IDApOwotCi0jZW5kaWYgLyogIUhBVkVfU0VUTE9DQUxFICovCi19Ci0KLSNpZiAhZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpCi1zdGF0aWMgY2hhciAqCi1ub3JtYWxpemVfY29kZXNldCAoY29kZXNldCkKLSAgICAgY2hhciAqY29kZXNldDsKLXsKLSAgc2l6ZV90IG5hbWVsZW4sIGk7Ci0gIGludCBsZW4sIGFsbF9kaWdpdHM7Ci0gIGNoYXIgKndwLCAqcmV0dmFsOwotCi0gIGNvZGVzZXQgPSBmaW5kX2NvZGVzZXQgKGNvZGVzZXQsICZuYW1lbGVuKTsKLQotICBpZiAoY29kZXNldCA9PSAwKQotICAgIHJldHVybiAoY29kZXNldCk7Ci0KLSAgYWxsX2RpZ2l0cyA9IDE7Ci0gIGZvciAobGVuID0gMCwgaSA9IDA7IGkgPCBuYW1lbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGlzYWxudW0gKGNvZGVzZXRbaV0pKQotCXsKLQkgIGxlbisrOwotCSAgYWxsX2RpZ2l0cyAmPSBpc2RpZ2l0IChjb2Rlc2V0W2ldKTsKLQl9Ci0gICAgfQotCi0gIHJldHZhbCA9IChjaGFyICopbWFsbG9jICgoYWxsX2RpZ2l0cyA/IDMgOiAwKSArIGxlbiArIDEpOwotICBpZiAocmV0dmFsID09IDApCi0gICAgcmV0dXJuICgoY2hhciAqKTApOwotCi0gIHdwID0gcmV0dmFsOwotICAvKiBBZGQgYGlzbycgdG8gYmVnaW5uaW5nIG9mIGFuIGFsbC1kaWdpdCBjb2Rlc2V0ICovCi0gIGlmIChhbGxfZGlnaXRzKQotICAgIHsKLSAgICAgICp3cCsrID0gJ2knOwotICAgICAgKndwKysgPSAncyc7Ci0gICAgICAqd3ArKyA9ICdvJzsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykKLSAgICBpZiAoaXNhbHBoYSAoY29kZXNldFtpXSkpCi0gICAgICAqd3ArKyA9IChpc3VwcGVyIChjb2Rlc2V0W2ldKSkgPyB0b2xvd2VyIChjb2Rlc2V0W2ldKSA6IGNvZGVzZXRbaV07Ci0gICAgZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtpXSkpCi0gICAgICAqd3ArKyA9IGNvZGVzZXRbaV07Ci0gICp3cCA9ICdcMCc7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogSXNvbGF0ZSBjb2Rlc2V0IHBvcnRpb24gb2YgbG9jYWxlIHNwZWNpZmljYXRpb24uICovCi1zdGF0aWMgY2hhciAqCi1maW5kX2NvZGVzZXQgKG5hbWUsIGxlbnApCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIHNpemVfdCAqbGVucDsKLXsKLSAgY2hhciAqY3AsICpsYW5ndWFnZSwgKnJlc3VsdDsKLQotICBjcCA9IGxhbmd1YWdlID0gbmFtZTsKLSAgcmVzdWx0ID0gKGNoYXIgKikwOwotCi0gIHdoaWxlICgqY3AgJiYgKmNwICE9ICdfJyAmJiAqY3AgIT0gJ0AnICYmICpjcCAhPSAnKycgJiYgKmNwICE9ICcsJykKLSAgICBjcCsrOwotCi0gIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIEFzCi0gICAgIGFuIGV4Y2VwdGlvbiB3ZSBhbGxvdyB0aGUgdmFyaWFibGUgdG8gY29udGFpbiBvbmx5IHRoZSBjb2Rlc2V0Ci0gICAgIG5hbWUuICBQZXJoYXBzIHRoZXJlIGFyZSBmdW5ueSBjb2Rlc2V0IG5hbWVzLiAgKi8KLSAgaWYgKGxhbmd1YWdlID09IGNwKSAKLSAgICB7Ci0gICAgICAqbGVucCA9IHN0cmxlbiAobGFuZ3VhZ2UpOwotICAgICAgcmVzdWx0ID0gbGFuZ3VhZ2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAqLwotICAgICAgaWYgKCpjcCA9PSAnXycpCi0JZG8KLQkgICsrY3A7Ci0Jd2hpbGUgKCpjcCAmJiAqY3AgIT0gJy4nICYmICpjcCAhPSAnQCcgJiYgKmNwICE9ICcrJyAmJiAqY3AgIT0gJywnICYmICpjcCAhPSAnXycpOwotCi0gICAgICAvKiBOb3csIGZpbmFsbHksIGlzIHRoZSBjb2Rlc2V0LiAqLwotICAgICAgcmVzdWx0ID0gY3A7Ci0gICAgICBpZiAoKmNwID09ICcuJykKLQlkbwotCSAgKytjcDsKLQl3aGlsZSAoKmNwICYmICpjcCAhPSAnQCcpOwotCi0gICAgICBpZiAoY3AgLSByZXN1bHQgPiAyKQotCXsKLQkgIHJlc3VsdCsrOwotCSAgKmxlbnAgPSBjcCAtIHJlc3VsdDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmxlbnAgPSBzdHJsZW4gKGxhbmd1YWdlKTsKLQkgIHJlc3VsdCA9IGxhbmd1YWdlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZiAvKiAhSEFWRV9TRVRMT0NBTEUgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3BhcmVucy5jIGIvcmVhZGxpbmUvcGFyZW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDBjMGEuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcGFyZW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogcGFyZW5zLmMgLS0gSW1wbGVtZW50YXRpb24gb2YgbWF0Y2hpbmcgcGFyZW50aGVzZXMgZmVhdHVyZS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaW5jbHVkZSAicmxjb25mLmgiCi0KLSNpZiAhZGVmaW5lZCAoUEFSRU5fTUFUQ0hJTkcpCi1leHRlcm4gaW50IHJsX2luc2VydCAoKTsKLQotaW50Ci1ybF9pbnNlcnRfY2xvc2UgKGNvdW50LCBpbnZva2luZ19rZXkpCi0gICAgIGludCBjb3VudCwgaW52b2tpbmdfa2V5OwotewotICByZXR1cm4gKHJsX2luc2VydCAoY291bnQsIGludm9raW5nX2tleSkpOwotfQotCi0jZWxzZSAvKiBQQVJFTl9NQVRDSElORyAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZCAoRkRfU0VUKSAmJiAhZGVmaW5lZCAoSEFWRV9TRUxFQ1QpCi0jICBkZWZpbmUgSEFWRV9TRUxFQ1QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRUxFQ1QpCi0jICBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIEhBVkVfU0VMRUNUICovCi0jaWYgZGVmaW5lZCAoSEFWRV9TWVNfU0VMRUNUX0gpCi0jICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfU1RSSU5HX0gpCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlIC8qICFIQVZFX1NUUklOR19IICovCi0jICBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYgLyogIUhBVkVfU1RSSU5HX0ggKi8KLQotI2lmICFkZWZpbmVkIChzdHJjaHIpICYmICFkZWZpbmVkIChfX1NURENfXykKLWV4dGVybiBjaGFyICpzdHJjaHIgKCksICpzdHJyY2hyICgpOwotI2VuZGlmIC8qICFzdHJjaHIgJiYgIV9fU1REQ19fICovCi0KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi1leHRlcm4gaW50IHJsX2V4cGxpY2l0X2FyZzsKLQotLyogTm9uLXplcm8gbWVhbnMgdHJ5IHRvIGJsaW5rIHRoZSBtYXRjaGluZyBvcGVuIHBhcmVudGhlc2lzIHdoZW4gdGhlCi0gICBjbG9zZSBwYXJlbnRoZXNpcyBpcyBpbnNlcnRlZC4gKi8KLSNpZiBkZWZpbmVkIChIQVZFX1NFTEVDVCkKLWludCBybF9ibGlua19tYXRjaGluZ19wYXJlbiA9IDE7Ci0jZWxzZSAvKiAhSEFWRV9TRUxFQ1QgKi8KLWludCBybF9ibGlua19tYXRjaGluZ19wYXJlbiA9IDA7Ci0jZW5kaWYgLyogIUhBVkVfU0VMRUNUICovCi0KLXN0YXRpYyBpbnQgZmluZF9tYXRjaGluZ19vcGVuICgpOwotCi1pbnQKLXJsX2luc2VydF9jbG9zZSAoY291bnQsIGludm9raW5nX2tleSkKLSAgICAgaW50IGNvdW50LCBpbnZva2luZ19rZXk7Ci17Ci0gIGlmIChybF9leHBsaWNpdF9hcmcgfHwgIXJsX2JsaW5rX21hdGNoaW5nX3BhcmVuKQotICAgIHJsX2luc2VydCAoY291bnQsIGludm9raW5nX2tleSk7Ci0gIGVsc2UKLSAgICB7Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRUxFQ1QpCi0gICAgICBpbnQgb3JpZ19wb2ludCwgbWF0Y2hfcG9pbnQsIHJlYWR5OwotICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXI7Ci0gICAgICBmZF9zZXQgcmVhZGZkczsKLQotICAgICAgcmxfaW5zZXJ0ICgxLCBpbnZva2luZ19rZXkpOwotICAgICAgKCpybF9yZWRpc3BsYXlfZnVuY3Rpb24pICgpOwotICAgICAgbWF0Y2hfcG9pbnQgPQotCWZpbmRfbWF0Y2hpbmdfb3BlbiAocmxfbGluZV9idWZmZXIsIHJsX3BvaW50IC0gMiwgaW52b2tpbmdfa2V5KTsKLQotICAgICAgLyogRW1hY3MgbWlnaHQgbWVzc2FnZSBvciByaW5nIHRoZSBiZWxsIGhlcmUsIGJ1dCBJIGRvbid0LiAqLwotICAgICAgaWYgKG1hdGNoX3BvaW50IDwgMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIEZEX1pFUk8gKCZyZWFkZmRzKTsKLSAgICAgIEZEX1NFVCAoZmlsZW5vIChybF9pbnN0cmVhbSksICZyZWFkZmRzKTsKLSAgICAgIHRpbWVyLnR2X3NlYyA9IDA7Ci0gICAgICB0aW1lci50dl91c2VjID0gNTAwMDAwOwotCi0gICAgICBvcmlnX3BvaW50ID0gcmxfcG9pbnQ7Ci0gICAgICBybF9wb2ludCA9IG1hdGNoX3BvaW50OwotICAgICAgKCpybF9yZWRpc3BsYXlfZnVuY3Rpb24pICgpOwotICAgICAgcmVhZHkgPSBzZWxlY3QgKDEsICZyZWFkZmRzLCAoZmRfc2V0ICopTlVMTCwgKGZkX3NldCAqKU5VTEwsICZ0aW1lcik7Ci0gICAgICBybF9wb2ludCA9IG9yaWdfcG9pbnQ7Ci0jZWxzZSAvKiAhSEFWRV9TRUxFQ1QgKi8KLSAgICAgIHJsX2luc2VydCAoY291bnQsIGludm9raW5nX2tleSk7Ci0jZW5kaWYgLyogIUhBVkVfU0VMRUNUICovCi0gICAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZmluZF9tYXRjaGluZ19vcGVuIChzdHJpbmcsIGZyb20sIGNsb3NlcikKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZnJvbSwgY2xvc2VyOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IG9wZW5lciwgbGV2ZWwsIGRlbGltaXRlcjsKLQotICBzd2l0Y2ggKGNsb3NlcikKLSAgICB7Ci0gICAgY2FzZSAnXSc6IG9wZW5lciA9ICdbJzsgYnJlYWs7Ci0gICAgY2FzZSAnfSc6IG9wZW5lciA9ICd7JzsgYnJlYWs7Ci0gICAgY2FzZSAnKSc6IG9wZW5lciA9ICcoJzsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICBsZXZlbCA9IDE7CQkJLyogVGhlIGNsb3NlciBwYXNzZWQgaW4gY291bnRzIGFzIDEuICovCi0gIGRlbGltaXRlciA9IDA7CQkvKiBEZWxpbWl0ZWQgc3RhdGUgdW5rbm93bi4gKi8KLQotICBmb3IgKGkgPSBmcm9tOyBpID4gLTE7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoZGVsaW1pdGVyICYmIChzdHJpbmdbaV0gPT0gZGVsaW1pdGVyKSkKLQlkZWxpbWl0ZXIgPSAwOwotICAgICAgZWxzZSBpZiAocmxfYmFzaWNfcXVvdGVfY2hhcmFjdGVycyAmJiBzdHJjaHIgKHJsX2Jhc2ljX3F1b3RlX2NoYXJhY3RlcnMsIHN0cmluZ1tpXSkpCi0JZGVsaW1pdGVyID0gc3RyaW5nW2ldOwotICAgICAgZWxzZSBpZiAoIWRlbGltaXRlciAmJiAoc3RyaW5nW2ldID09IGNsb3NlcikpCi0JbGV2ZWwrKzsKLSAgICAgIGVsc2UgaWYgKCFkZWxpbWl0ZXIgJiYgKHN0cmluZ1tpXSA9PSBvcGVuZXIpKQotCWxldmVsLS07Ci0KLSAgICAgIGlmICghbGV2ZWwpCi0JYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGkpOwotfQotCi0jZW5kaWYgLyogUEFSRU5fTUFUQ0hJTkcgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3Bvc2l4ZGlyLmggYi9yZWFkbGluZS9wb3NpeGRpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgwYTkzLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3Bvc2l4ZGlyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBwb3NpeGRpci5oIC0tIFBvc2l4IGRpcmVjdG9yeSByZWFkaW5nIGluY2x1ZGVzIGFuZCBkZWZpbmVzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCi0KLSAgIEJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBCYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKLSAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggQmFzaDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotLyogVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnN0ZWFkIG9mIDxkaXJlbnQuaD4gb3IgPHN5cy9kaXIuaD4uICovCi0KLSNpZiAhZGVmaW5lZCAoX1BPU0lYRElSX0hfKQotI2RlZmluZSBfUE9TSVhESVJfSF8KLQotI2lmIGRlZmluZWQgKEhBVkVfRElSRU5UX0gpCi0jICBpbmNsdWRlIDxkaXJlbnQuaD4KLSMgIGRlZmluZSBEX05BTUxFTihkKSAgIChzdHJsZW4gKChkKS0+ZF9uYW1lKSkKLSNlbHNlCi0jICBpZiBkZWZpbmVkIChIQVZFX1NZU19ORElSX0gpCi0jICAgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jICBlbmRpZgotIyAgaWYgZGVmaW5lZCAoSEFWRV9TWVNfRElSX0gpCi0jICAgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkIChIQVZFX05ESVJfSCkKLSMgICAgaW5jbHVkZSA8bmRpci5oPgotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkIChkaXJlbnQpCi0jICAgIGRlZmluZSBkaXJlbnQgZGlyZWN0Ci0jICBlbmRpZiAvKiAhZGlyZW50ICovCi0jICBkZWZpbmUgRF9OQU1MRU4oZCkgICAoKGQpLT5kX25hbWxlbikKLSNlbmRpZiAvKiAhSEFWRV9ESVJFTlRfSCAqLwotCi0jaWYgZGVmaW5lZCAoU1RSVUNUX0RJUkVOVF9IQVNfRF9JTk8pICYmICFkZWZpbmVkIChTVFJVQ1RfRElSRU5UX0hBU19EX0ZJTEVOTykKLSMgIGRlZmluZSBkX2ZpbGVubyBkX2lubwotI2VuZGlmCi0KLSNlbmRpZiAvKiAhX1BPU0lYRElSX0hfICovCmRpZmYgLS1naXQgYS9yZWFkbGluZS9wb3NpeGptcC5oIGIvcmVhZGxpbmUvcG9zaXhqbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0N2NjMC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9wb3NpeGptcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogcG9zaXhqbXAuaCAtLSB3cmFwcGVyIGZvciBzZXRqbXAuaCB3aXRoIGNoYW5nZXMgZm9yIFBPU0lYIHN5c3RlbXMuICovCi0KLSNpZm5kZWYgX1BPU0lYSk1QX0hfCi0jZGVmaW5lIF9QT1NJWEpNUF9IXwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLS8qIFRoaXMgKm11c3QqIGJlIGluY2x1ZGVkICphZnRlciogY29uZmlnLmggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfUE9TSVhfU0lHU0VUSk1QKQotIyAgZGVmaW5lIHByb2NlbnZfdAlzaWdqbXBfYnVmCi0jICBpZiAhZGVmaW5lZCAoX19PUEVOTlQpCi0jICAgIHVuZGVmIHNldGptcAotIyAgICBkZWZpbmUgc2V0am1wKHgpCXNpZ3NldGptcCgoeCksIDEpCi0jICAgIHVuZGVmIGxvbmdqbXAKLSMgICAgZGVmaW5lIGxvbmdqbXAoeCwgbikJc2lnbG9uZ2ptcCgoeCksIChuKSkKLSMgIGVuZGlmIC8qICFfX09QRU5OVCAqLwotI2Vsc2UKLSMgIGRlZmluZSBwcm9jZW52X3QJam1wX2J1ZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfUE9TSVhKTVBfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3Bvc2l4c3RhdC5oIGIvcmVhZGxpbmUvcG9zaXhzdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2U4YzAuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcG9zaXhzdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyogcG9zaXhzdGF0LmggLS0gUG9zaXggc3RhdCgyKSBkZWZpbml0aW9ucyBmb3Igc3lzdGVtcyB0aGF0Ci0gICBkb24ndCBoYXZlIHRoZW0uICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NywxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmFzaCwgdGhlIEJvdXJuZSBBZ2FpbiBTSGVsbC4KLQotICAgQmFzaCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEJhc2ggaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQotICAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBCYXNoOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0vKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluc3RlYWQgb2YgPHN5cy9zdGF0Lmg+LgotICAgSXQgcmVsaWVzIG9uIHRoZSBsb2NhbCBzeXMvc3RhdC5oIHRvIHdvcmsgdGhvdWdoLiAqLwotI2lmICFkZWZpbmVkIChfUE9TSVhTVEFUX0hfKQotI2RlZmluZSBfUE9TSVhTVEFUX0hfCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZCAoU1RBVF9NQUNST1NfQlJPS0VOKQotIyAgdW5kZWYgU19JU0JMSwotIyAgdW5kZWYgU19JU0NIUgotIyAgdW5kZWYgU19JU0RJUgotIyAgdW5kZWYgU19JU0ZJRk8KLSMgIHVuZGVmIFNfSVNSRUcKLSMgIHVuZGVmIFNfSVNMTksKLSNlbmRpZiAvKiBTVEFUX01BQ1JPU19CUk9LRU4gKi8KLQotLyogVGhlc2UgYXJlIGd1YXJhbnRlZWQgdG8gd29yayBvbmx5IG9uIGlzYzM4NiAqLwotI2lmICFkZWZpbmVkIChTX0lGRElSKSAmJiAhZGVmaW5lZCAoU19JU0RJUikKLSMgIGRlZmluZSBTX0lGRElSIDAwNDAwMDAKLSNlbmRpZiAvKiAhU19JRkRJUiAmJiAhU19JU0RJUiAqLwotI2lmICFkZWZpbmVkIChTX0lGTVQpCi0jICBkZWZpbmUgU19JRk1UICAwMTcwMDAwCi0jZW5kaWYgLyogIVNfSUZNVCAqLwotCi0vKiBQb3NpeCAxMDAzLjEgNS42LjEuMSA8c3lzL3N0YXQuaD4gZmlsZSB0eXBlcyAqLwotCi0vKiBTb21lIFBvc2l4LXdhbm5hYmUgc3lzdGVtcyBkZWZpbmUgX1NfSUYqIG1hY3JvcyBpbnN0ZWFkIG9mIFNfSUYqLCBidXQKLSAgIGRvIG5vdCBwcm92aWRlIHRoZSBTX0lTKiBtYWNyb3MgdGhhdCBQb3NpeCByZXF1aXJlcy4gKi8KLQotI2lmIGRlZmluZWQgKF9TX0lGTVQpICYmICFkZWZpbmVkIChTX0lGTVQpCi0jZGVmaW5lIFNfSUZNVCBfU19JRk1UCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU19JRklGTykgJiYgIWRlZmluZWQgKFNfSUZJRk8pCi0jZGVmaW5lIFNfSUZJRk8gX1NfSUZJRk8KLSNlbmRpZgotI2lmIGRlZmluZWQgKF9TX0lGQ0hSKSAmJiAhZGVmaW5lZCAoU19JRkNIUikKLSNkZWZpbmUgU19JRkNIUiBfU19JRkNIUgotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX1NfSUZESVIpICYmICFkZWZpbmVkIChTX0lGRElSKQotI2RlZmluZSBTX0lGRElSIF9TX0lGRElSCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU19JRkJMSykgJiYgIWRlZmluZWQgKFNfSUZCTEspCi0jZGVmaW5lIFNfSUZCTEsgX1NfSUZCTEsKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9TX0lGUkVHKSAmJiAhZGVmaW5lZCAoU19JRlJFRykKLSNkZWZpbmUgU19JRlJFRyBfU19JRlJFRwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX1NfSUZMTkspICYmICFkZWZpbmVkIChTX0lGTE5LKQotI2RlZmluZSBTX0lGTE5LIF9TX0lGTE5LCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChfU19JRlNPQ0spICYmICFkZWZpbmVkIChTX0lGU09DSykKLSNkZWZpbmUgU19JRlNPQ0sgX1NfSUZTT0NLCi0jZW5kaWYKLQotLyogVGVzdCBmb3IgZWFjaCBzeW1ib2wgaW5kaXZpZHVhbGx5IGFuZCBkZWZpbmUgdGhlIG9uZXMgbmVjZXNzYXJ5IChzb21lCi0gICBzeXN0ZW1zIGNsYWltaW5nIFBvc2l4IGNvbXBhdGliaWxpdHkgZGVmaW5lIHNvbWUgYnV0IG5vdCBhbGwpLiAqLwotCi0jaWYgZGVmaW5lZCAoU19JRkJMSykgJiYgIWRlZmluZWQgKFNfSVNCTEspCi0jZGVmaW5lCVNfSVNCTEsobSkJKCgobSkmU19JRk1UKSA9PSBTX0lGQkxLKQkvKiBibG9jayBkZXZpY2UgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoU19JRkNIUikgJiYgIWRlZmluZWQgKFNfSVNDSFIpCi0jZGVmaW5lCVNfSVNDSFIobSkJKCgobSkmU19JRk1UKSA9PSBTX0lGQ0hSKQkvKiBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFNfSUZESVIpICYmICFkZWZpbmVkIChTX0lTRElSKQotI2RlZmluZQlTX0lTRElSKG0pCSgoKG0pJlNfSUZNVCkgPT0gU19JRkRJUikJLyogZGlyZWN0b3J5ICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFNfSUZSRUcpICYmICFkZWZpbmVkIChTX0lTUkVHKQotI2RlZmluZQlTX0lTUkVHKG0pCSgoKG0pJlNfSUZNVCkgPT0gU19JRlJFRykJLyogZmlsZSAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChTX0lGSUZPKSAmJiAhZGVmaW5lZCAoU19JU0ZJRk8pCi0jZGVmaW5lCVNfSVNGSUZPKG0pCSgoKG0pJlNfSUZNVCkgPT0gU19JRklGTykJLyogZmlmbyAtIG5hbWVkIHBpcGUgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoU19JRkxOSykgJiYgIWRlZmluZWQgKFNfSVNMTkspCi0jZGVmaW5lCVNfSVNMTksobSkJKCgobSkmU19JRk1UKSA9PSBTX0lGTE5LKQkvKiBzeW1ib2xpYyBsaW5rICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFNfSUZTT0NLKSAmJiAhZGVmaW5lZCAoU19JU1NPQ0spCi0jZGVmaW5lCVNfSVNTT0NLKG0pCSgoKG0pJlNfSUZNVCkgPT0gU19JRlNPQ0spCS8qIHNvY2tldCAqLwotI2VuZGlmCi0KLS8qCi0gKiBQT1NJWCAxMDAzLjEgNS42LjEuMiA8c3lzL3N0YXQuaD4gRmlsZSBNb2RlcwotICovCi0KLSNpZiAhZGVmaW5lZCAoU19JUldYVSkKLSMgIGlmICFkZWZpbmVkIChTX0lSRUFEKQotIyAgICBkZWZpbmUgU19JUkVBRAkwMDQwMAotIyAgICBkZWZpbmUgU19JV1JJVEUJMDAyMDAKLSMgICAgZGVmaW5lIFNfSUVYRUMJMDAxMDAKLSMgIGVuZGlmIC8qIFNfSVJFQUQgKi8KLQotIyAgaWYgIWRlZmluZWQgKFNfSVJVU1IpCi0jICAgIGRlZmluZSBTX0lSVVNSCVNfSVJFQUQJCQkvKiByZWFkLCBvd25lciAqLwotIyAgICBkZWZpbmUgU19JV1VTUglTX0lXUklURQkJLyogd3JpdGUsIG93bmVyICovCi0jICAgIGRlZmluZSBTX0lYVVNSCVNfSUVYRUMJCQkvKiBleGVjdXRlLCBvd25lciAqLwotCi0jICAgIGRlZmluZSBTX0lSR1JQCShTX0lSRUFEICA+PiAzKQkJLyogcmVhZCwgZ3JvdXAgKi8KLSMgICAgZGVmaW5lIFNfSVdHUlAJKFNfSVdSSVRFID4+IDMpCQkvKiB3cml0ZSwgZ3JvdXAgKi8KLSMgICAgZGVmaW5lIFNfSVhHUlAJKFNfSUVYRUMgID4+IDMpCQkvKiBleGVjdXRlLCBncm91cCAqLwotCi0jICAgIGRlZmluZSBTX0lST1RICShTX0lSRUFEICA+PiA2KQkJLyogcmVhZCwgb3RoZXIgKi8KLSMgICAgZGVmaW5lIFNfSVdPVEgJKFNfSVdSSVRFID4+IDYpCQkvKiB3cml0ZSwgb3RoZXIgKi8KLSMgICAgZGVmaW5lIFNfSVhPVEgJKFNfSUVYRUMgID4+IDYpCQkvKiBleGVjdXRlLCBvdGhlciAqLwotIyAgZW5kaWYgLyogIVNfSVJVU1IgKi8KLQotIyAgZGVmaW5lIFNfSVJXWFUJKFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUikKLSMgIGRlZmluZSBTX0lSV1hHCShTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVhHUlApCi0jICBkZWZpbmUgU19JUldYTwkoU19JUk9USCB8IFNfSVdPVEggfCBTX0lYT1RIKQotI2VuZGlmIC8qICFTX0lSV1hVICovCi0KLS8qIFRoZXNlIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBhcmUgdXNlZCBpbiBidWlsdGlucy5jJHN5bWJvbGljX3VtYXNrKCkgKi8KLSNkZWZpbmUgU19JUlVHTwkJKFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCkKLSNkZWZpbmUgU19JV1VHTwkJKFNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USCkKLSNkZWZpbmUgU19JWFVHTwkJKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkKLQotI2VuZGlmIC8qIF9QT1NJWFNUQVRfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3JlYWRsaW5lLmMgYi9yZWFkbGluZS9yZWFkbGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQyNWY3Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3JlYWRsaW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTU4ICswLDAgQEAKLS8qIHJlYWRsaW5lLmMgLS0gYSBnZW5lcmFsIGZhY2lsaXR5IGZvciByZWFkaW5nIGxpbmVzIG9mIGlucHV0Ci0gICB3aXRoIGVtYWNzIHN0eWxlIGVkaXRpbmcgYW5kIGNvbXBsZXRpb24uICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAicG9zaXhzdGF0LmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkIChIQVZFX1NZU19GSUxFX0gpCi0jICBpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX0ZJTEVfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfTE9DQUxFX0gpCi0jICBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwb3NpeGptcC5oIgotCi0vKiBTeXN0ZW0tc3BlY2lmaWMgZmVhdHVyZSBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZSBmaWxlcy4gKi8KLSNpbmNsdWRlICJybGRlZnMuaCIKLQotI2lmIGRlZmluZWQgKF9fRU1YX18pCi0jICBkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCi0jICBpbmNsdWRlIDxvczIuaD4KLSNlbmRpZiAvKiBfX0VNWF9fICovCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotI2luY2x1ZGUgImhpc3RvcnkuaCIKLQotI2lmbmRlZiBSTF9MSUJSQVJZX1ZFUlNJT04KLSMgIGRlZmluZSBSTF9MSUJSQVJZX1ZFUlNJT04gIjQuMCIKLSNlbmRpZgotCi0vKiBFdmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBtdWx0aXBsZSB0aW1lcy4gKi8KLSNkZWZpbmUgU1dBUChzLCBlKSAgZG8geyBpbnQgdDsgdCA9IHM7IHMgPSBlOyBlID0gdDsgfSB3aGlsZSAoMCkKLQotLyogTk9URTogRnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgcHJlZml4ZWQgd2l0aCBgX3JsXycgYXJlCi0gICBwc2V1ZG8tZ2xvYmFsOiB0aGV5IGFyZSBnbG9iYWwgc28gdGhleSBjYW4gYmUgc2hhcmVkCi0gICBiZXR3ZWVuIGZpbGVzIGluIHRoZSByZWFkbGluZSBsaWJyYXJ5LCBidXQgYXJlIG5vdCBpbnRlbmRlZAotICAgdG8gYmUgdmlzaWJsZSB0byByZWFkbGluZSBjYWxsZXJzLiAqLwotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHRlcm1pbmFsLmMgKi8KLWV4dGVybiBpbnQgX3JsX2luaXRfdGVybWluYWxfaW8gKCk7Ci1leHRlcm4gdm9pZCBfcmxfZW5hYmxlX21ldGFfa2V5ICgpOwotI2lmZGVmIF9NSU5JWAotZXh0ZXJuIHZvaWQgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24gKCk7Ci0jZWxzZQotZXh0ZXJuIGludCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbiAoKTsKLSNlbmRpZgotCi1leHRlcm4gaW50IF9ybF9lbmFibGVfbWV0YTsKLWV4dGVybiBpbnQgX3JsX3Rlcm1fYXV0b3dyYXA7Ci1leHRlcm4gaW50IHNjcmVlbndpZHRoLCBzY3JlZW5oZWlnaHQsIHNjcmVlbmNoYXJzOwotCi0vKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHJsdHR5LmMuICovCi1leHRlcm4gdm9pZCBybF9wcmVwX3Rlcm1pbmFsICgpLCBybF9kZXByZXBfdGVybWluYWwgKCk7Ci1leHRlcm4gdm9pZCBybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyAoKTsKLQotLyogRnVuY3Rpb25zIGltcG9ydGVkIGZyb20gdXRpbC5jLiAqLwotZXh0ZXJuIHZvaWQgX3JsX2Fib3J0X2ludGVybmFsICgpOwotZXh0ZXJuIHZvaWQgcmxfZXh0ZW5kX2xpbmVfYnVmZmVyICgpOwotZXh0ZXJuIGludCBhbHBoYWJldGljICgpOwotCi0vKiBGdW5jdGlvbnMgaW1wb3J0ZWQgZnJvbSBiaW5kLmMuICovCi1leHRlcm4gdm9pZCBfcmxfYmluZF9pZl91bmJvdW5kICgpOwotCi0vKiBGdW5jdGlvbnMgaW1wb3J0ZWQgZnJvbSBpbnB1dC5jLiAqLwotZXh0ZXJuIGludCBfcmxfYW55X3R5cGVpbiAoKTsKLWV4dGVybiB2b2lkIF9ybF9pbnNlcnRfdHlwZWluICgpOwotZXh0ZXJuIGludCBybF9yZWFkX2tleSAoKTsKLQotLyogRnVuY3Rpb25zIGltcG9ydGVkIGZyb20gbmxzLmMgKi8KLWV4dGVybiBpbnQgX3JsX2luaXRfZWlnaHRiaXQgKCk7Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHNoZWxsLmMgKi8KLWV4dGVybiBjaGFyICpnZXRfZW52X3ZhbHVlICgpOwotCi0vKiBFeHRlcm5hbCByZWRpc3BsYXkgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZnJvbSBkaXNwbGF5LmMgKi8KLWV4dGVybiB2b2lkIF9ybF9tb3ZlX3ZlcnQgKCk7Ci1leHRlcm4gdm9pZCBfcmxfdXBkYXRlX2ZpbmFsICgpOwotZXh0ZXJuIHZvaWQgX3JsX2NsZWFyX3RvX2VvbCAoKTsKLWV4dGVybiB2b2lkIF9ybF9jbGVhcl9zY3JlZW4gKCk7Ci1leHRlcm4gdm9pZCBfcmxfZXJhc2VfZW50aXJlX2xpbmUgKCk7Ci0KLWV4dGVybiB2b2lkIF9ybF9lcmFzZV9hdF9lbmRfb2ZfbGluZSAoKTsKLWV4dGVybiB2b2lkIF9ybF9tb3ZlX2N1cnNvcl9yZWxhdGl2ZSAoKTsKLQotZXh0ZXJuIGludCBfcmxfdmlzX2JvdGxpbjsKLWV4dGVybiBpbnQgX3JsX2xhc3RfY19wb3M7Ci1leHRlcm4gaW50IF9ybF9ob3Jpem9udGFsX3Njcm9sbF9tb2RlOwotZXh0ZXJuIGludCBybF9kaXNwbGF5X2ZpeGVkOwotZXh0ZXJuIGludCBfcmxfc3VwcHJlc3NfcmVkaXNwbGF5OwotZXh0ZXJuIGNoYXIgKnJsX2Rpc3BsYXlfcHJvbXB0OwotCi0vKiBWYXJpYWJsZXMgaW1wb3J0ZWQgZnJvbSBjb21wbGV0ZS5jLiAqLwotZXh0ZXJuIGNoYXIgKnJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnM7Ci1leHRlcm4gY2hhciAqcmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzOwotZXh0ZXJuIGludCBybF9jb21wbGV0aW9uX3F1ZXJ5X2l0ZW1zOwotZXh0ZXJuIGludCBybF9jb21wbGV0ZV93aXRoX3RpbGRlX2V4cGFuc2lvbjsKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZnJvbSBtYWNyby5jLiAqLwotZXh0ZXJuIHZvaWQgX3JsX2FkZF9tYWNyb19jaGFyICgpOwotZXh0ZXJuIHZvaWQgX3JsX3dpdGhfbWFjcm9faW5wdXQgKCk7Ci1leHRlcm4gaW50IF9ybF9uZXh0X21hY3JvX2tleSAoKTsKLWV4dGVybiBpbnQgX3JsX2RlZmluaW5nX2tiZF9tYWNybzsKLQotI2lmIGRlZmluZWQgKFZJX01PREUpCi0vKiBGdW5jdGlvbnMgaW1wb3J0ZWQgZnJvbSB2aV9tb2RlLmMuICovCi1leHRlcm4gdm9pZCBfcmxfdmlfc2V0X2xhc3QgKCk7Ci1leHRlcm4gdm9pZCBfcmxfdmlfcmVzZXRfbGFzdCAoKTsKLWV4dGVybiB2b2lkIF9ybF92aV9kb25lX2luc2VydGluZyAoKTsKLWV4dGVybiBpbnQgX3JsX3ZpX3RleHRtb2RfY29tbWFuZCAoKTsKLWV4dGVybiB2b2lkIF9ybF92aV9pbml0aWFsaXplX2xpbmUgKCk7Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotCi1leHRlcm4gVU5ET19MSVNUICpybF91bmRvX2xpc3Q7Ci1leHRlcm4gaW50IF9ybF9kb2luZ19hbl91bmRvOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyB1c2VkIGluIHRoaXMgZmlsZS4gKi8KLXZvaWQgX3JsX2ZyZWVfaGlzdG9yeV9lbnRyeSAoKTsKLQotaW50IF9ybF9kaXNwYXRjaCAoKTsKLWludCBfcmxfaW5pdF9hcmd1bWVudCAoKTsKLQotc3RhdGljIGNoYXIgKnJlYWRsaW5lX2ludGVybmFsICgpOwotc3RhdGljIHZvaWQgcmVhZGxpbmVfaW5pdGlhbGl6ZV9ldmVyeXRoaW5nICgpOwotc3RhdGljIHZvaWQgc3RhcnRfdXNpbmdfaGlzdG9yeSAoKTsKLXN0YXRpYyB2b2lkIGJpbmRfYXJyb3dfa2V5cyAoKTsKLQotI2lmICFkZWZpbmVkIChfX0dPMzJfXykgfHwgZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpCi1zdGF0aWMgdm9pZCByZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzICgpOwotI2VuZGlmIC8qICFfX0dPMzJfXyAqLwotCi0jaWYgZGVmaW5lZCAoX19HTzMyX18pCi0jICBpbmNsdWRlIDxnbzMyLmg+Ci0jICBpbmNsdWRlIDxwYy5oPgotIyAgaWYgIWRlZmluZWQgKF9fREpHUFBfXykKLSMgICAgdW5kZWYgSEFORExFX1NJR05BTFMKLSMgIGVuZGlmIC8qICFfX0RKR1BQX18gKi8KLSNlbmRpZiAvKiBfX0dPMzJfXyAqLwotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUxpbmUgZWRpdGluZyBpbnB1dCB1dGlsaXR5CQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotY2hhciAqcmxfbGlicmFyeV92ZXJzaW9uID0gUkxfTElCUkFSWV9WRVJTSU9OOwotCi0vKiBBIHBvaW50ZXIgdG8gdGhlIGtleW1hcCB0aGF0IGlzIGN1cnJlbnRseSBpbiB1c2UuCi0gICBCeSBkZWZhdWx0LCBpdCBpcyB0aGUgc3RhbmRhcmQgZW1hY3Mga2V5bWFwLiAqLwotS2V5bWFwIF9ybF9rZXltYXAgPSBlbWFjc19zdGFuZGFyZF9rZXltYXA7Ci0KLS8qIFRoZSBjdXJyZW50IHN0eWxlIG9mIGVkaXRpbmcuICovCi1pbnQgcmxfZWRpdGluZ19tb2RlID0gZW1hY3NfbW9kZTsKLQotLyogTm9uLXplcm8gaWYgd2UgY2FsbGVkIHRoaXMgZnVuY3Rpb24gZnJvbSBfcmxfZGlzcGF0Y2goKS4gIEl0J3MgcHJlc2VudAotICAgc28gZnVuY3Rpb25zIGNhbiBmaW5kIG91dCB3aGV0aGVyIHRoZXkgd2VyZSBjYWxsZWQgZnJvbSBhIGtleSBiaW5kaW5nCi0gICBvciBkaXJlY3RseSBmcm9tIGFuIGFwcGxpY2F0aW9uLiAqLwotaW50IHJsX2Rpc3BhdGNoaW5nOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCB3YXMgYSBraWxsIGNvbW1hbmQuICovCi1pbnQgX3JsX2xhc3RfY29tbWFuZF93YXNfa2lsbCA9IDA7Ci0KLS8qIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBudW1lcmljIGFyZ3VtZW50IHNwZWNpZmllZCBieSB0aGUgdXNlci4gKi8KLWludCBybF9udW1lcmljX2FyZyA9IDE7Ci0KLS8qIE5vbi16ZXJvIGlmIGFuIGFyZ3VtZW50IHdhcyB0eXBlZC4gKi8KLWludCBybF9leHBsaWNpdF9hcmcgPSAwOwotCi0vKiBUZW1wb3JhcnkgdmFsdWUgdXNlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBhcmd1bWVudC4gKi8KLWludCBybF9hcmdfc2lnbiA9IDE7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHdlIGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUuICovCi1zdGF0aWMgaW50IHJsX2luaXRpYWxpemVkOwotCi0vKiBJZiBub24temVybywgdGhpcyBwcm9ncmFtIGlzIHJ1bm5pbmcgaW4gYW4gRU1BQ1MgYnVmZmVyLiAqLwotc3RhdGljIGludCBydW5uaW5nX2luX2VtYWNzOwotCi0vKiBUaGUgY3VycmVudCBvZmZzZXQgaW4gdGhlIGN1cnJlbnQgaW5wdXQgbGluZS4gKi8KLWludCBybF9wb2ludDsKLQotLyogTWFyayBpbiB0aGUgY3VycmVudCBpbnB1dCBsaW5lLiAqLwotaW50IHJsX21hcms7Ci0KLS8qIExlbmd0aCBvZiB0aGUgY3VycmVudCBpbnB1dCBsaW5lLiAqLwotaW50IHJsX2VuZDsKLQotLyogTWFrZSB0aGlzIG5vbi16ZXJvIHRvIHJldHVybiB0aGUgY3VycmVudCBpbnB1dF9saW5lLiAqLwotaW50IHJsX2RvbmU7Ci0KLS8qIFRoZSBsYXN0IGZ1bmN0aW9uIGV4ZWN1dGVkIGJ5IHJlYWRsaW5lLiAqLwotRnVuY3Rpb24gKnJsX2xhc3RfZnVuYyA9IChGdW5jdGlvbiAqKU5VTEw7Ci0KLS8qIFRvcCBsZXZlbCBlbnZpcm9ubWVudCBmb3IgcmVhZGxpbmVfaW50ZXJuYWwgKCkuICovCi1wcm9jZW52X3QgcmVhZGxpbmVfdG9wX2xldmVsOwotCi0vKiBUaGUgc3RyZWFtcyB3ZSBpbnRlcmFjdCB3aXRoLiAqLwotRklMRSAqX3JsX2luX3N0cmVhbSwgKl9ybF9vdXRfc3RyZWFtOwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmVhbXMgdGhhdCB3ZSBkbyBpbnB1dCBhbmQgb3V0cHV0IHRvLiAqLwotRklMRSAqcmxfaW5zdHJlYW0gPSAoRklMRSAqKU5VTEw7Ci1GSUxFICpybF9vdXRzdHJlYW0gPSAoRklMRSAqKU5VTEw7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIGVjaG8gY2hhcmFjdGVycyBhcyB0aGV5IGFyZSByZWFkLiAqLwotaW50IHJlYWRsaW5lX2VjaG9pbmdfcCA9IDE7Ci0KLS8qIEN1cnJlbnQgcHJvbXB0LiAqLwotY2hhciAqcmxfcHJvbXB0OwotaW50IHJsX3Zpc2libGVfcHJvbXB0X2xlbmd0aCA9IDA7Ci0KLS8qIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGluIG9yZGVyIHRvIHR5cGUgdGhpcyBjb21wbGV0ZSBjb21tYW5kLiAqLwotaW50IHJsX2tleV9zZXF1ZW5jZV9sZW5ndGggPSAwOwotCi0vKiBJZiBub24temVybywgdGhlbiB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBqdXN0Ci0gICBiZWZvcmUgcmVhZGxpbmVfaW50ZXJuYWxfc2V0dXAgKCkgcHJpbnRzIHRoZSBmaXJzdCBwcm9tcHQuICovCi1GdW5jdGlvbiAqcmxfc3RhcnR1cF9ob29rID0gKEZ1bmN0aW9uICopTlVMTDsKLQotLyogSWYgbm9uLXplcm8sIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGp1c3QgYmVmb3JlCi0gICByZWFkbGluZV9pbnRlcm5hbF9zZXR1cCAoKSByZXR1cm5zIGFuZCByZWFkbGluZV9pbnRlcm5hbCBzdGFydHMKLSAgIHJlYWRpbmcgaW5wdXQgY2hhcmFjdGVycy4gKi8KLUZ1bmN0aW9uICpybF9wcmVfaW5wdXRfaG9vayA9IChGdW5jdGlvbiAqKU5VTEw7Ci0KLS8qIFdoYXQgd2UgdXNlIGludGVybmFsbHkuICBZb3Ugc2hvdWxkIGFsd2F5cyByZWZlciB0byBSTF9MSU5FX0JVRkZFUi4gKi8KLXN0YXRpYyBjaGFyICp0aGVfbGluZTsKLQotLyogVGhlIGNoYXJhY3RlciB0aGF0IGNhbiBnZW5lcmF0ZSBhbiBFT0YuICBSZWFsbHkgcmVhZCBmcm9tCi0gICB0aGUgdGVybWluYWwgZHJpdmVyLi4uIGp1c3QgZGVmYXVsdGVkIGhlcmUuICovCi1pbnQgX3JsX2VvZl9jaGFyID0gQ1RSTCAoJ0QnKTsKLQotLyogTm9uLXplcm8gbWFrZXMgdGhpcyB0aGUgbmV4dCBrZXlzdHJva2UgdG8gcmVhZC4gKi8KLWludCBybF9wZW5kaW5nX2lucHV0ID0gMDsKLQotLyogUG9pbnRlciB0byBhIHVzZWZ1bCB0ZXJtaW5hbCBuYW1lLiAqLwotY2hhciAqcmxfdGVybWluYWxfbmFtZSA9IChjaGFyICopTlVMTDsKLQotLyogTm9uLXplcm8gbWVhbnMgdG8gYWx3YXlzIHVzZSBob3Jpem9udGFsIHNjcm9sbGluZyBpbiBsaW5lIGRpc3BsYXkuICovCi1pbnQgX3JsX2hvcml6b250YWxfc2Nyb2xsX21vZGUgPSAwOwotCi0vKiBOb24temVybyBtZWFucyB0byBkaXNwbGF5IGFuIGFzdGVyaXNrIGF0IHRoZSBzdGFydHMgb2YgaGlzdG9yeSBsaW5lcwotICAgd2hpY2ggaGF2ZSBiZWVuIG1vZGlmaWVkLiAqLwotaW50IF9ybF9tYXJrX21vZGlmaWVkX2xpbmVzID0gMDsgIAotCi0vKiBUaGUgc3R5bGUgb2YgYGJlbGwnIG5vdGlmaWNhdGlvbiBwcmVmZXJyZWQuICBUaGlzIGNhbiBiZSBzZXQgdG8gTk9fQkVMTCwKLSAgIEFVRElCTEVfQkVMTCwgb3IgVklTSUJMRV9CRUxMLiAqLwotaW50IF9ybF9iZWxsX3ByZWZlcmVuY2UgPSBBVURJQkxFX0JFTEw7Ci0gICAgIAotLyogU3RyaW5nIGluc2VydGVkIGludG8gdGhlIGxpbmUgYnkgcmxfaW5zZXJ0X2NvbW1lbnQgKCkuICovCi1jaGFyICpfcmxfY29tbWVudF9iZWdpbjsKLQotLyogS2V5bWFwIGhvbGRpbmcgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZC4gKi8KLUtleW1hcCBybF9leGVjdXRpbmdfa2V5bWFwOwotCi0vKiBOb24temVybyBtZWFucyB0byBlcmFzZSBlbnRpcmUgbGluZSwgaW5jbHVkaW5nIHByb21wdCwgb24gZW1wdHkgaW5wdXQgbGluZXMuICovCi1pbnQgcmxfZXJhc2VfZW1wdHlfbGluZSA9IDA7Ci0KLS8qIExpbmUgYnVmZmVyIGFuZCBtYWludGVuZW5jZS4gKi8KLWNoYXIgKnJsX2xpbmVfYnVmZmVyID0gKGNoYXIgKilOVUxMOwotaW50IHJsX2xpbmVfYnVmZmVyX2xlbiA9IDA7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIHVzZWQgYnkgdGhlIGRpc3BsYXkgYW5kIHRlcm1jYXAgY29kZS4gKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlgRm9yd2FyZCcgZGVjbGFyYXRpb25zICAJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBOb24temVybyBtZWFucyBkbyBub3QgcGFyc2UgYW55IGxpbmVzIG90aGVyIHRoYW4gY29tbWVudHMgYW5kCi0gICBwYXJzZXIgZGlyZWN0aXZlcy4gKi8KLXVuc2lnbmVkIGNoYXIgX3JsX3BhcnNpbmdfY29uZGl0aW9uYWxpemVkX291dCA9IDA7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB3aXRoIHRoZSBtZXRhIGJpdCBzZXQgdG8KLSAgIGVzY2FwZS1wcmVmaXhlZCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiBpbmRpcmVjdCB0aHJvdWdoCi0gICBlbWFjc19tZXRhX2tleW1hcCBvciB2aV9lc2NhcGVfa2V5bWFwLiAqLwotaW50IF9ybF9jb252ZXJ0X21ldGFfY2hhcnNfdG9fYXNjaWkgPSAxOwotCi0vKiBOb24temVybyBtZWFucyB0byBvdXRwdXQgY2hhcmFjdGVycyB3aXRoIHRoZSBtZXRhIGJpdCBzZXQgZGlyZWN0bHkKLSAgIHJhdGhlciB0aGFuIGFzIGEgbWV0YS1wcmVmaXhlZCBlc2NhcGUgc2VxdWVuY2UuICovCi1pbnQgX3JsX291dHB1dF9tZXRhX2NoYXJzID0gMDsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlUb3AgTGV2ZWwgRnVuY3Rpb25zCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIE5vbi16ZXJvIG1lYW5zIHRyZWF0IDAyMDAgYml0IGluIHRlcm1pbmFsIGlucHV0IGFzIE1ldGEgYml0LiAqLwotaW50IF9ybF9tZXRhX2ZsYWcgPSAwOwkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi0KLS8qIFJlYWQgYSBsaW5lIG9mIGlucHV0LiAgUHJvbXB0IHdpdGggUFJPTVBULiAgQW4gZW1wdHkgUFJPTVBUIG1lYW5zCi0gICBub25lLiAgQSByZXR1cm4gdmFsdWUgb2YgTlVMTCBtZWFucyB0aGF0IEVPRiB3YXMgZW5jb3VudGVyZWQuICovCi1jaGFyICoKLXJlYWRsaW5lIChwcm9tcHQpCi0gICAgIGNoYXIgKnByb21wdDsKLXsKLSAgY2hhciAqdmFsdWU7Ci0KLSAgcmxfcHJvbXB0ID0gcHJvbXB0OwotCi0gIC8qIElmIHdlIGFyZSBhdCBFT0YgcmV0dXJuIGEgTlVMTCBzdHJpbmcuICovCi0gIGlmIChybF9wZW5kaW5nX2lucHV0ID09IEVPRikKLSAgICB7Ci0gICAgICBybF9wZW5kaW5nX2lucHV0ID0gMDsKLSAgICAgIHJldHVybiAoKGNoYXIgKilOVUxMKTsKLSAgICB9Ci0KLSAgcmxfdmlzaWJsZV9wcm9tcHRfbGVuZ3RoID0gcmxfZXhwYW5kX3Byb21wdCAocmxfcHJvbXB0KTsKLQotICBybF9pbml0aWFsaXplICgpOwotICAoKnJsX3ByZXBfdGVybV9mdW5jdGlvbikgKF9ybF9tZXRhX2ZsYWcpOwotCi0jaWYgZGVmaW5lZCAoSEFORExFX1NJR05BTFMpCi0gIHJsX3NldF9zaWduYWxzICgpOwotI2VuZGlmCi0KLSAgdmFsdWUgPSByZWFkbGluZV9pbnRlcm5hbCAoKTsKLSAgKCpybF9kZXByZXBfdGVybV9mdW5jdGlvbikgKCk7Ci0KLSNpZiBkZWZpbmVkIChIQU5ETEVfU0lHTkFMUykKLSAgcmxfY2xlYXJfc2lnbmFscyAoKTsKLSNlbmRpZgotCi0gIHJldHVybiAodmFsdWUpOwotfQotCi0jaWYgZGVmaW5lZCAoUkVBRExJTkVfQ0FMTEJBQ0tTKQotIyAgZGVmaW5lIFNUQVRJQ19DQUxMQkFDSwotI2Vsc2UKLSMgIGRlZmluZSBTVEFUSUNfQ0FMTEJBQ0sgc3RhdGljCi0jZW5kaWYKLQotU1RBVElDX0NBTExCQUNLIHZvaWQKLXJlYWRsaW5lX2ludGVybmFsX3NldHVwICgpCi17Ci0gIF9ybF9pbl9zdHJlYW0gPSBybF9pbnN0cmVhbTsKLSAgX3JsX291dF9zdHJlYW0gPSBybF9vdXRzdHJlYW07Ci0KLSAgaWYgKHJsX3N0YXJ0dXBfaG9vaykKLSAgICAoKnJsX3N0YXJ0dXBfaG9vaykgKCk7Ci0KLSAgaWYgKHJlYWRsaW5lX2VjaG9pbmdfcCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChybF9wcm9tcHQpCi0JewotCSAgZnByaW50ZiAoX3JsX291dF9zdHJlYW0sICIlcyIsIHJsX3Byb21wdCk7Ci0JICBmZmx1c2ggKF9ybF9vdXRfc3RyZWFtKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmxfb25fbmV3X2xpbmUgKCk7Ci0gICAgICAoKnJsX3JlZGlzcGxheV9mdW5jdGlvbikgKCk7Ci0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSAgICAgIGlmIChybF9lZGl0aW5nX21vZGUgPT0gdmlfbW9kZSkKLQlybF92aV9pbnNlcnRpb25fbW9kZSAoMSwgMCk7Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotICAgIH0KLQotICBpZiAocmxfcHJlX2lucHV0X2hvb2spCi0gICAgKCpybF9wcmVfaW5wdXRfaG9vaykgKCk7Ci19Ci0KLVNUQVRJQ19DQUxMQkFDSyBjaGFyICoKLXJlYWRsaW5lX2ludGVybmFsX3RlYXJkb3duIChlb2YpCi0gICAgIGludCBlb2Y7Ci17Ci0gIGNoYXIgKnRlbXA7Ci0gIEhJU1RfRU5UUlkgKmVudHJ5OwotCi0gIC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIG9mIHRoaXMgaGlzdG9yeSBsaW5lLCBpZmYgdGhlIGxpbmUgdGhhdCB3ZQotICAgICBhcmUgZWRpdGluZyB3YXMgb3JpZ2luYWxseSBpbiB0aGUgaGlzdG9yeSwgQU5EIHRoZSBsaW5lIGhhcyBjaGFuZ2VkLiAqLwotICBlbnRyeSA9IGN1cnJlbnRfaGlzdG9yeSAoKTsKLQotICBpZiAoZW50cnkgJiYgcmxfdW5kb19saXN0KQotICAgIHsKLSAgICAgIHRlbXAgPSBzYXZlc3RyaW5nICh0aGVfbGluZSk7Ci0gICAgICBybF9yZXZlcnRfbGluZSAoMSwgMCk7Ci0gICAgICBlbnRyeSA9IHJlcGxhY2VfaGlzdG9yeV9lbnRyeSAod2hlcmVfaGlzdG9yeSAoKSwgdGhlX2xpbmUsIChoaXN0ZGF0YV90KU5VTEwpOwotICAgICAgX3JsX2ZyZWVfaGlzdG9yeV9lbnRyeSAoZW50cnkpOwotCi0gICAgICBzdHJjcHkgKHRoZV9saW5lLCB0ZW1wKTsKLSAgICAgIGZyZWUgKHRlbXApOwotICAgIH0KLQotICAvKiBBdCBhbnkgcmF0ZSwgaXQgaXMgaGlnaGx5IGxpa2VseSB0aGF0IHRoaXMgbGluZSBoYXMgYW4gdW5kbyBsaXN0LiAgR2V0Ci0gICAgIHJpZCBvZiBpdCBub3cuICovCi0gIGlmIChybF91bmRvX2xpc3QpCi0gICAgZnJlZV91bmRvX2xpc3QgKCk7Ci0KLSAgcmV0dXJuIChlb2YgPyAoY2hhciAqKU5VTEwgOiBzYXZlc3RyaW5nICh0aGVfbGluZSkpOwotfQotCi1TVEFUSUNfQ0FMTEJBQ0sgaW50Ci0jaWYgZGVmaW5lZCAoUkVBRExJTkVfQ0FMTEJBQ0tTKQotcmVhZGxpbmVfaW50ZXJuYWxfY2hhciAoKQotI2Vsc2UKLXJlYWRsaW5lX2ludGVybmFsX2NoYXJsb29wICgpCi0jZW5kaWYKLXsKLSAgc3RhdGljIGludCBsYXN0YywgZW9mX2ZvdW5kOwotICBpbnQgYywgY29kZSwgbGs7Ci0KLSAgbGFzdGMgPSAtMTsKLSAgZW9mX2ZvdW5kID0gMDsKLQotI2lmICFkZWZpbmVkIChSRUFETElORV9DQUxMQkFDS1MpCi0gIHdoaWxlIChybF9kb25lID09IDApCi0gICAgewotI2VuZGlmCi0gICAgICBsayA9IF9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGw7Ci0KLSAgICAgIGNvZGUgPSBzZXRqbXAgKHJlYWRsaW5lX3RvcF9sZXZlbCk7Ci0KLSAgICAgIGlmIChjb2RlKQotCSgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLQotICAgICAgaWYgKHJsX3BlbmRpbmdfaW5wdXQgPT0gMCkKLQl7Ci0JICAvKiBUaGVuIGluaXRpYWxpemUgdGhlIGFyZ3VtZW50IGFuZCBudW1iZXIgb2Yga2V5cyByZWFkLiAqLwotCSAgX3JsX2luaXRfYXJndW1lbnQgKCk7Ci0JICBybF9rZXlfc2VxdWVuY2VfbGVuZ3RoID0gMDsKLQl9Ci0KLSAgICAgIGMgPSBybF9yZWFkX2tleSAoKTsKLQotICAgICAgLyogRU9GIHR5cGVkIHRvIGEgbm9uLWJsYW5rIGxpbmUgaXMgYSA8Tkw+LiAqLwotICAgICAgaWYgKGMgPT0gRU9GICYmIHJsX2VuZCkKLQljID0gTkVXTElORTsKLQotICAgICAgLyogVGhlIGNoYXJhY3RlciBfcmxfZW9mX2NoYXIgdHlwZWQgdG8gYmxhbmsgbGluZSwgYW5kIG5vdCBhcyB0aGUKLQkgcHJldmlvdXMgY2hhcmFjdGVyIGlzIGludGVycHJldGVkIGFzIEVPRi4gKi8KLSAgICAgIGlmICgoKGMgPT0gX3JsX2VvZl9jaGFyICYmIGxhc3RjICE9IGMpIHx8IGMgPT0gRU9GKSAmJiAhcmxfZW5kKQotCXsKLSNpZiBkZWZpbmVkIChSRUFETElORV9DQUxMQkFDS1MpCi0JICByZXR1cm4gKHJsX2RvbmUgPSAxKTsKLSNlbHNlCi0JICBlb2ZfZm91bmQgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGxhc3RjID0gYzsKLSAgICAgIF9ybF9kaXNwYXRjaCAoYywgX3JsX2tleW1hcCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gX3JsX2xhc3RfY29tbWFuZF93YXNfa2lsbCwgdGhlbiBubyBraWxsCi0JIGhhcyB0YWtlbiBwbGFjZS4gIE5vdGUgdGhhdCBpZiBpbnB1dCBpcyBwZW5kaW5nIHdlIGFyZSByZWFkaW5nCi0JIGEgcHJlZml4IGNvbW1hbmQsIHNvIG5vdGhpbmcgaGFzIGNoYW5nZWQgeWV0LiAqLwotICAgICAgaWYgKHJsX3BlbmRpbmdfaW5wdXQgPT0gMCAmJiBsayA9PSBfcmxfbGFzdF9jb21tYW5kX3dhc19raWxsKQotCV9ybF9sYXN0X2NvbW1hbmRfd2FzX2tpbGwgPSAwOwotCi0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSAgICAgIC8qIEluIHZpIG1vZGUsIHdoZW4geW91IGV4aXQgaW5zZXJ0IG1vZGUsIHRoZSBjdXJzb3IgbW92ZXMgYmFjawotCSBvdmVyIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIuICBXZSBleHBsaWNpdGx5IGNoZWNrIGZvciB0aGF0IGhlcmUuICovCi0gICAgICBpZiAocmxfZWRpdGluZ19tb2RlID09IHZpX21vZGUgJiYgX3JsX2tleW1hcCA9PSB2aV9tb3ZlbWVudF9rZXltYXApCi0JcmxfdmlfY2hlY2sgKCk7Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotCi0gICAgICBpZiAocmxfZG9uZSA9PSAwKQotCSgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLQotICAgICAgLyogSWYgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgdG9sZCB1cyB0byBlcmFzZSB0aGUgZW50aXJlIGxpbmUgaWYKLQkgIHRoZSBvbmx5IGNoYXJhY3RlciB0eXBlZCB3YXMgc29tZXRoaW5nIGJvdW5kIHRvIHJsX25ld2xpbmUsIGRvIHNvLiAqLwotICAgICAgaWYgKHJsX2VyYXNlX2VtcHR5X2xpbmUgJiYgcmxfZG9uZSAmJiBybF9sYXN0X2Z1bmMgPT0gcmxfbmV3bGluZSAmJgotCSAgcmxfcG9pbnQgPT0gMCAmJiBybF9lbmQgPT0gMCkKLQlfcmxfZXJhc2VfZW50aXJlX2xpbmUgKCk7Ci0KLSNpZiBkZWZpbmVkIChSRUFETElORV9DQUxMQkFDS1MpCi0gICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgfQotCi0gIHJldHVybiAoZW9mX2ZvdW5kKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZCAoUkVBRExJTkVfQ0FMTEJBQ0tTKQotc3RhdGljIGludAotcmVhZGxpbmVfaW50ZXJuYWxfY2hhcmxvb3AgKCkKLXsKLSAgaW50IGVvZiA9IDE7Ci0KLSAgd2hpbGUgKHJsX2RvbmUgPT0gMCkKLSAgICBlb2YgPSByZWFkbGluZV9pbnRlcm5hbF9jaGFyICgpOwotICByZXR1cm4gKGVvZik7Ci19Ci0jZW5kaWYgLyogUkVBRExJTkVfQ0FMTEJBQ0tTICovCi0KLS8qIFJlYWQgYSBsaW5lIG9mIGlucHV0IGZyb20gdGhlIGdsb2JhbCBybF9pbnN0cmVhbSwgZG9pbmcgb3V0cHV0IG9uCi0gICB0aGUgZ2xvYmFsIHJsX291dHN0cmVhbS4KLSAgIElmIHJsX3Byb21wdCBpcyBub24tbnVsbCwgdGhlbiB0aGF0IGlzIG91ciBwcm9tcHQuICovCi1zdGF0aWMgY2hhciAqCi1yZWFkbGluZV9pbnRlcm5hbCAoKQotewotICBpbnQgZW9mOwotCi0gIHJlYWRsaW5lX2ludGVybmFsX3NldHVwICgpOwotICBlb2YgPSByZWFkbGluZV9pbnRlcm5hbF9jaGFybG9vcCAoKTsKLSAgcmV0dXJuIChyZWFkbGluZV9pbnRlcm5hbF90ZWFyZG93biAoZW9mKSk7Ci19Ci0KLXZvaWQKLV9ybF9pbml0X2xpbmVfc3RhdGUgKCkKLXsKLSAgcmxfcG9pbnQgPSBybF9lbmQgPSAwOwotICB0aGVfbGluZSA9IHJsX2xpbmVfYnVmZmVyOwotICB0aGVfbGluZVswXSA9IDA7Ci19Ci0KLXZvaWQKLV9ybF9zZXRfdGhlX2xpbmUgKCkKLXsKLSAgdGhlX2xpbmUgPSBybF9saW5lX2J1ZmZlcjsKLX0KLQotLyogRG8gdGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIEtFWSBpbiBNQVAuCi0gICBJZiB0aGUgYXNzb2NpYXRlZCBjb21tYW5kIGlzIHJlYWxseSBhIGtleW1hcCwgdGhlbiByZWFkCi0gICBhbm90aGVyIGtleSwgYW5kIGRpc3BhdGNoIGludG8gdGhhdCBtYXAuICovCi1pbnQKLV9ybF9kaXNwYXRjaCAoa2V5LCBtYXApCi0gICAgIHJlZ2lzdGVyIGludCBrZXk7Ci0gICAgIEtleW1hcCBtYXA7Ci17Ci0gIGludCByLCBuZXdrZXk7Ci0gIGNoYXIgKm1hY3JvOwotICBGdW5jdGlvbiAqZnVuYzsKLQotICBpZiAoTUVUQV9DSEFSIChrZXkpICYmIF9ybF9jb252ZXJ0X21ldGFfY2hhcnNfdG9fYXNjaWkpCi0gICAgewotICAgICAgaWYgKG1hcFtFU0NdLnR5cGUgPT0gSVNLTUFQKQotCXsKLQkgIGlmIChfcmxfZGVmaW5pbmdfa2JkX21hY3JvKQotCSAgICBfcmxfYWRkX21hY3JvX2NoYXIgKEVTQyk7Ci0JICBtYXAgPSBGVU5DVElPTl9UT19LRVlNQVAgKG1hcCwgRVNDKTsKLQkgIGtleSA9IFVOTUVUQSAoa2V5KTsKLQkgIHJsX2tleV9zZXF1ZW5jZV9sZW5ndGggKz0gMjsKLQkgIHJldHVybiAoX3JsX2Rpc3BhdGNoIChrZXksIG1hcCkpOwotCX0KLSAgICAgIGVsc2UKLQlkaW5nICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChfcmxfZGVmaW5pbmdfa2JkX21hY3JvKQotICAgIF9ybF9hZGRfbWFjcm9fY2hhciAoa2V5KTsKLQotICByID0gMDsKLSAgc3dpdGNoIChtYXBba2V5XS50eXBlKQotICAgIHsKLSAgICBjYXNlIElTRlVOQzoKLSAgICAgIGZ1bmMgPSBtYXBba2V5XS5mdW5jdGlvbjsKLSAgICAgIGlmIChmdW5jICE9IChGdW5jdGlvbiAqKU5VTEwpCi0JewotCSAgLyogU3BlY2lhbCBjYXNlIHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uICgpLiAqLwotCSAgaWYgKGZ1bmMgPT0gcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24pCi0JICAgIHJldHVybiAoX3JsX2Rpc3BhdGNoIChfcmxfdG9fbG93ZXIgKGtleSksIG1hcCkpOwotCi0JICBybF9leGVjdXRpbmdfa2V5bWFwID0gbWFwOwotCi0jaWYgMAotCSAgX3JsX3N1cHByZXNzX3JlZGlzcGxheSA9IChtYXBba2V5XS5mdW5jdGlvbiA9PSBybF9pbnNlcnQpICYmIF9ybF9pbnB1dF9hdmFpbGFibGUgKCk7Ci0jZW5kaWYKLQotCSAgcmxfZGlzcGF0Y2hpbmcgPSAxOwotCSAgciA9ICgqbWFwW2tleV0uZnVuY3Rpb24pKHJsX251bWVyaWNfYXJnICogcmxfYXJnX3NpZ24sIGtleSk7Ci0JICBybF9kaXNwYXRjaGluZyA9IDA7Ci0KLQkgIC8qIElmIHdlIGhhdmUgaW5wdXQgcGVuZGluZywgdGhlbiB0aGUgbGFzdCBjb21tYW5kIHdhcyBhIHByZWZpeAotCSAgICAgY29tbWFuZC4gIERvbid0IGNoYW5nZSB0aGUgc3RhdGUgb2YgcmxfbGFzdF9mdW5jLiAgT3RoZXJ3aXNlLAotCSAgICAgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZCBleGVjdXRlZCBpbiB0aGlzIHZhcmlhYmxlLiAqLwotCSAgaWYgKCFybF9wZW5kaW5nX2lucHV0ICYmIG1hcFtrZXldLmZ1bmN0aW9uICE9IHJsX2RpZ2l0X2FyZ3VtZW50KQotCSAgICBybF9sYXN0X2Z1bmMgPSBtYXBba2V5XS5mdW5jdGlvbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgX3JsX2Fib3J0X2ludGVybmFsICgpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJU0tNQVA6Ci0gICAgICBpZiAobWFwW2tleV0uZnVuY3Rpb24gIT0gKEZ1bmN0aW9uICopTlVMTCkKLQl7Ci0JICBybF9rZXlfc2VxdWVuY2VfbGVuZ3RoKys7Ci0JICBuZXdrZXkgPSBybF9yZWFkX2tleSAoKTsKLQkgIHIgPSBfcmxfZGlzcGF0Y2ggKG5ld2tleSwgRlVOQ1RJT05fVE9fS0VZTUFQIChtYXAsIGtleSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBfcmxfYWJvcnRfaW50ZXJuYWwgKCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElTTUFDUjoKLSAgICAgIGlmIChtYXBba2V5XS5mdW5jdGlvbiAhPSAoRnVuY3Rpb24gKilOVUxMKQotCXsKLQkgIG1hY3JvID0gc2F2ZXN0cmluZyAoKGNoYXIgKiltYXBba2V5XS5mdW5jdGlvbik7Ci0JICBfcmxfd2l0aF9tYWNyb19pbnB1dCAobWFjcm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gIGlmIChybF9lZGl0aW5nX21vZGUgPT0gdmlfbW9kZSAmJiBfcmxfa2V5bWFwID09IHZpX21vdmVtZW50X2tleW1hcCAmJgotICAgICAgX3JsX3ZpX3RleHRtb2RfY29tbWFuZCAoa2V5KSkKLSAgICBfcmxfdmlfc2V0X2xhc3QgKGtleSwgcmxfbnVtZXJpY19hcmcsIHJsX2FyZ19zaWduKTsKLSNlbmRpZgotICByZXR1cm4gKHIpOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUluaXRpYWxpemF0aW9ucyAJCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogSW5pdGlhbGl6ZSByZWFkbGluZSAoYW5kIHRlcm1pbmFsIGlmIG5vdCBhbHJlYWR5KS4gKi8KLWludAotcmxfaW5pdGlhbGl6ZSAoKQotewotICAvKiBJZiB3ZSBoYXZlIG5ldmVyIGJlZW4gY2FsbGVkIGJlZm9yZSwgaW5pdGlhbGl6ZSB0aGUKLSAgICAgdGVybWluYWwgYW5kIGRhdGEgc3RydWN0dXJlcy4gKi8KLSAgaWYgKCFybF9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICByZWFkbGluZV9pbml0aWFsaXplX2V2ZXJ5dGhpbmcgKCk7Ci0gICAgICBybF9pbml0aWFsaXplZCsrOwotICAgIH0KLQotICAvKiBJbml0YWxpemUgdGhlIGN1cnJlbnQgbGluZSBpbmZvcm1hdGlvbi4gKi8KLSAgX3JsX2luaXRfbGluZV9zdGF0ZSAoKTsKLQotICAvKiBXZSBhcmVuJ3QgZG9uZSB5ZXQuICBXZSBoYXZlbid0IGV2ZW4gZ290dGVuIHN0YXJ0ZWQgeWV0ISAqLwotICBybF9kb25lID0gMDsKLQotICAvKiBUZWxsIHRoZSBoaXN0b3J5IHJvdXRpbmVzIHdoYXQgaXMgZ29pbmcgb24uICovCi0gIHN0YXJ0X3VzaW5nX2hpc3RvcnkgKCk7Ci0KLSAgLyogTWFrZSB0aGUgZGlzcGxheSBidWZmZXIgbWF0Y2ggdGhlIHN0YXRlIG9mIHRoZSBsaW5lLiAqLwotICBybF9yZXNldF9saW5lX3N0YXRlICgpOwotCi0gIC8qIE5vIHN1Y2ggZnVuY3Rpb24gdHlwZWQgeWV0LiAqLwotICBybF9sYXN0X2Z1bmMgPSAoRnVuY3Rpb24gKilOVUxMOwotCi0gIC8qIFBhcnNpbmcgb2Yga2V5LWJpbmRpbmdzIGJlZ2lucyBpbiBhbiBlbmFibGVkIHN0YXRlLiAqLwotICBfcmxfcGFyc2luZ19jb25kaXRpb25hbGl6ZWRfb3V0ID0gMDsKLQotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gIGlmIChybF9lZGl0aW5nX21vZGUgPT0gdmlfbW9kZSkKLSAgICBfcmxfdmlfaW5pdGlhbGl6ZV9saW5lICgpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkIChfX0VNWF9fKQotc3RhdGljIHZvaWQKLV9lbXhfYnVpbGRfZW52aXJvbiAoKQotewotICBUSUIgKnRpYnA7Ci0gIFBJQiAqcGlicDsKLSAgY2hhciAqdCwgKip0cDsKLSAgaW50IGM7Ci0KLSAgRG9zR2V0SW5mb0Jsb2NrcyAoJnRpYnAsICZwaWJwKTsKLSAgdCA9IHBpYnAtPnBpYl9wY2hlbnY7Ci0gIGZvciAoYyA9IDE7ICp0OyBjKyspCi0gICAgdCArPSBzdHJsZW4gKHQpICsgMTsKLSAgdHAgPSBlbnZpcm9uID0gKGNoYXIgKiopeG1hbGxvYyAoKGMgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0gIHQgPSBwaWJwLT5waWJfcGNoZW52OwotICB3aGlsZSAoKnQpCi0gICAgewotICAgICAgKnRwKysgPSB0OwotICAgICAgdCArPSBzdHJsZW4gKHQpICsgMTsKLSAgICB9Ci0gICp0cCA9IDA7Ci19Ci0jZW5kaWYgLyogX19FTVhfXyAqLwotCi0vKiBJbml0aWFsaXplIHRoZSBlbnRpcmUgc3RhdGUgb2YgdGhlIHdvcmxkLiAqLwotc3RhdGljIHZvaWQKLXJlYWRsaW5lX2luaXRpYWxpemVfZXZlcnl0aGluZyAoKQotewotI2lmIGRlZmluZWQgKF9fRU1YX18pCi0gIGlmIChlbnZpcm9uID09IDApCi0gICAgX2VteF9idWlsZF9lbnZpcm9uICgpOwotI2VuZGlmCi0KLSAgLyogRmluZCBvdXQgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gRW1hY3MuICovCi0gIHJ1bm5pbmdfaW5fZW1hY3MgPSBnZXRfZW52X3ZhbHVlICgiRU1BQ1MiKSAhPSAoY2hhciAqKTA7Ci0KLSAgLyogU2V0IHVwIGlucHV0IGFuZCBvdXRwdXQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc2V0IHVwLiAqLwotICBpZiAoIXJsX2luc3RyZWFtKQotICAgIHJsX2luc3RyZWFtID0gc3RkaW47Ci0KLSAgaWYgKCFybF9vdXRzdHJlYW0pCi0gICAgcmxfb3V0c3RyZWFtID0gc3Rkb3V0OwotCi0gIC8qIEJpbmQgX3JsX2luX3N0cmVhbSBhbmQgX3JsX291dF9zdHJlYW0gaW1tZWRpYXRlbHkuICBUaGVzZSB2YWx1ZXMKLSAgICAgbWF5IGNoYW5nZSwgYnV0IHRoZXkgbWF5IGFsc28gYmUgdXNlZCBiZWZvcmUgcmVhZGxpbmVfaW50ZXJuYWwgKCkKLSAgICAgaXMgY2FsbGVkLiAqLwotICBfcmxfaW5fc3RyZWFtID0gcmxfaW5zdHJlYW07Ci0gIF9ybF9vdXRfc3RyZWFtID0gcmxfb3V0c3RyZWFtOwotCi0gIC8qIEFsbG9jYXRlIGRhdGEgc3RydWN0dXJlcy4gKi8KLSAgaWYgKHJsX2xpbmVfYnVmZmVyID09IDApCi0gICAgcmxfbGluZV9idWZmZXIgPSB4bWFsbG9jIChybF9saW5lX2J1ZmZlcl9sZW4gPSBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSB0ZXJtaW5hbCBpbnRlcmZhY2UuICovCi0gIF9ybF9pbml0X3Rlcm1pbmFsX2lvICgoY2hhciAqKU5VTEwpOwotCi0jaWYgIWRlZmluZWQgKF9fR08zMl9fKSB8fCBkZWZpbmVkIChIQVZFX1RFUk1JT1NfSCkKLSAgLyogQmluZCB0dHkgY2hhcmFjdGVycyB0byByZWFkbGluZSBmdW5jdGlvbnMuICovCi0gIHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MgKCk7Ci0jZW5kaWYgLyogIV9fR08zMl9fIHx8IEhBVkVfVEVSTUlPU19IICovCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gbmFtZXMuICovCi0gIHJsX2luaXRpYWxpemVfZnVubWFwICgpOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGdvIGludG8gZWlnaHQtYml0IG1vZGUuICovCi0gIF9ybF9pbml0X2VpZ2h0Yml0ICgpOwotICAgICAgCi0gIC8qIFJlYWQgaW4gdGhlIGluaXQgZmlsZS4gKi8KLSAgcmxfcmVhZF9pbml0X2ZpbGUgKChjaGFyICopTlVMTCk7Ci0KLSAgLyogWFhYICovCi0gIGlmIChfcmxfaG9yaXpvbnRhbF9zY3JvbGxfbW9kZSAmJiBfcmxfdGVybV9hdXRvd3JhcCkKLSAgICB7Ci0gICAgICBzY3JlZW53aWR0aC0tOwotICAgICAgc2NyZWVuY2hhcnMgLT0gc2NyZWVuaGVpZ2h0OwotICAgIH0KLQotICAvKiBPdmVycmlkZSB0aGUgZWZmZWN0IG9mIGFueSBgc2V0IGtleW1hcCcgYXNzaWdubWVudHMgaW4gdGhlCi0gICAgIGlucHV0cmMgZmlsZS4gKi8KLSAgcmxfc2V0X2tleW1hcF9mcm9tX2VkaXRfbW9kZSAoKTsKLQotICAvKiBUcnkgdG8gYmluZCBhIGNvbW1vbiBhcnJvdyBrZXkgcHJlZml4LCBpZiBub3QgYWxyZWFkeSBib3VuZC4gKi8KLSAgYmluZF9hcnJvd19rZXlzICgpOwotCi0gIC8qIEVuYWJsZSB0aGUgbWV0YSBrZXksIGlmIHRoaXMgdGVybWluYWwgaGFzIG9uZS4gKi8KLSAgaWYgKF9ybF9lbmFibGVfbWV0YSkKLSAgICBfcmxfZW5hYmxlX21ldGFfa2V5ICgpOwotCi0gIC8qIElmIHRoZSBjb21wbGV0aW9uIHBhcnNlcidzIGRlZmF1bHQgd29yZCBicmVhayBjaGFyYWN0ZXJzIGhhdmVuJ3QKLSAgICAgYmVlbiBzZXQgeWV0LCB0aGVuIGRvIHNvIG5vdy4gKi8KLSAgaWYgKHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPT0gKGNoYXIgKilOVUxMKQotICAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSBybF9iYXNpY193b3JkX2JyZWFrX2NoYXJhY3RlcnM7Ci19Ci0KLS8qIElmIHRoaXMgc3lzdGVtIGFsbG93cyB1cyB0byBsb29rIGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHJlZ3VsYXIKLSAgIGlucHV0IGVkaXRpbmcgY2hhcmFjdGVycywgdGhlbiBiaW5kIHRoZW0gdG8gdGhlaXIgcmVhZGxpbmUKLSAgIGVxdWl2YWxlbnRzLCBpZmYgdGhlIGNoYXJhY3RlcnMgYXJlIG5vdCBib3VuZCB0byBrZXltYXBzLiAqLwotc3RhdGljIHZvaWQKLXJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MgKCkKLXsKLSAgcmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MgKF9ybF9rZXltYXApOwotfQotCi1zdGF0aWMgdm9pZAotYmluZF9hcnJvd19rZXlzX2ludGVybmFsICgpCi17Ci0gIEZ1bmN0aW9uICpmOwotCi0gIGYgPSBybF9mdW5jdGlvbl9vZl9rZXlzZXEgKCJcMDMzW0EiLCBfcmxfa2V5bWFwLCAoaW50ICopTlVMTCk7Ci0gIGlmICghZiB8fCBmID09IHJsX2RvX2xvd2VyY2FzZV92ZXJzaW9uKQotICAgIHsKLSAgICAgIF9ybF9iaW5kX2lmX3VuYm91bmQgKCJcMDMzW0EiLCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSk7Ci0gICAgICBfcmxfYmluZF9pZl91bmJvdW5kICgiXDAzM1tCIiwgcmxfZ2V0X25leHRfaGlzdG9yeSk7Ci0gICAgICBfcmxfYmluZF9pZl91bmJvdW5kICgiXDAzM1tDIiwgcmxfZm9yd2FyZCk7Ci0gICAgICBfcmxfYmluZF9pZl91bmJvdW5kICgiXDAzM1tEIiwgcmxfYmFja3dhcmQpOwotICAgIH0KLQotICBmID0gcmxfZnVuY3Rpb25fb2Zfa2V5c2VxICgiXDAzM09BIiwgX3JsX2tleW1hcCwgKGludCAqKU5VTEwpOwotICBpZiAoIWYgfHwgZiA9PSBybF9kb19sb3dlcmNhc2VfdmVyc2lvbikKLSAgICB7Ci0gICAgICBfcmxfYmluZF9pZl91bmJvdW5kICgiXDAzM09BIiwgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkpOwotICAgICAgX3JsX2JpbmRfaWZfdW5ib3VuZCAoIlwwMzNPQiIsIHJsX2dldF9uZXh0X2hpc3RvcnkpOwotICAgICAgX3JsX2JpbmRfaWZfdW5ib3VuZCAoIlwwMzNPQyIsIHJsX2ZvcndhcmQpOwotICAgICAgX3JsX2JpbmRfaWZfdW5ib3VuZCAoIlwwMzNPRCIsIHJsX2JhY2t3YXJkKTsKLSAgICB9Ci19Ci0KLS8qIFRyeSBhbmQgYmluZCB0aGUgY29tbW9uIGFycm93IGtleSBwcmVmaXggYWZ0ZXIgZ2l2aW5nIHRlcm1jYXAgYW5kCi0gICB0aGUgaW5wdXRyYyBmaWxlIGEgY2hhbmNlIHRvIGJpbmQgdGhlbSBhbmQgY3JlYXRlIGByZWFsJyBrZXltYXBzCi0gICBmb3IgdGhlIGFycm93IGtleSBwcmVmaXguICovCi1zdGF0aWMgdm9pZAotYmluZF9hcnJvd19rZXlzICgpCi17Ci0gIEtleW1hcCB4a2V5bWFwOwotCi0gIHhrZXltYXAgPSBfcmxfa2V5bWFwOwotCi0gIF9ybF9rZXltYXAgPSBlbWFjc19zdGFuZGFyZF9rZXltYXA7Ci0gIGJpbmRfYXJyb3dfa2V5c19pbnRlcm5hbCAoKTsKLQotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gIF9ybF9rZXltYXAgPSB2aV9tb3ZlbWVudF9rZXltYXA7Ci0gIGJpbmRfYXJyb3dfa2V5c19pbnRlcm5hbCAoKTsKLSNlbmRpZgotCi0gIF9ybF9rZXltYXAgPSB4a2V5bWFwOwotfQotCi0MCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCU51bWVyaWMgQXJndW1lbnRzCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIEhhbmRsZSBDLXUgc3R5bGUgbnVtZXJpYyBhcmdzLCBhcyB3ZWxsIGFzIE0tLSwgYW5kIE0tZGlnaXRzLiAqLwotc3RhdGljIGludAotcmxfZGlnaXRfbG9vcCAoKQotewotICBpbnQga2V5LCBjLCBzYXdtaW51cywgc2F3ZGlnaXRzOwotCi0gIHJsX3NhdmVfcHJvbXB0ICgpOwotCi0gIHNhd21pbnVzID0gc2F3ZGlnaXRzID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKHJsX251bWVyaWNfYXJnID4gMTAwMDAwMCkKLQl7Ci0JICBzYXdkaWdpdHMgPSBybF9leHBsaWNpdF9hcmcgPSBybF9udW1lcmljX2FyZyA9IDA7Ci0JICBkaW5nICgpOwotCSAgcmxfcmVzdG9yZV9wcm9tcHQgKCk7Ci0JICBybF9jbGVhcl9tZXNzYWdlICgpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcmxfbWVzc2FnZSAoIihhcmc6ICVkKSAiLCBybF9hcmdfc2lnbiAqIHJsX251bWVyaWNfYXJnKTsKLSAgICAgIGtleSA9IGMgPSBybF9yZWFkX2tleSAoKTsKLQotICAgICAgLyogSWYgd2Ugc2VlIGEga2V5IGJvdW5kIHRvIGB1bml2ZXJzYWwtYXJndW1lbnQnIGFmdGVyIHNlZWluZyBkaWdpdHMsCi0JIGl0IGVuZHMgdGhlIGFyZ3VtZW50IGJ1dCBpcyBvdGhlcndpc2UgaWdub3JlZC4gKi8KLSAgICAgIGlmIChfcmxfa2V5bWFwW2NdLnR5cGUgPT0gSVNGVU5DICYmCi0JICBfcmxfa2V5bWFwW2NdLmZ1bmN0aW9uID09IHJsX3VuaXZlcnNhbF9hcmd1bWVudCkKLQl7Ci0JICBpZiAoc2F3ZGlnaXRzID09IDApCi0JICAgIHsKLQkgICAgICBybF9udW1lcmljX2FyZyAqPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBrZXkgPSBybF9yZWFkX2tleSAoKTsKLQkgICAgICBybF9yZXN0b3JlX3Byb21wdCAoKTsKLQkgICAgICBybF9jbGVhcl9tZXNzYWdlICgpOwotCSAgICAgIHJldHVybiAoX3JsX2Rpc3BhdGNoIChrZXksIF9ybF9rZXltYXApKTsKLQkgICAgfQotCX0KLQotICAgICAgYyA9IFVOTUVUQSAoYyk7Ci0KLSAgICAgIGlmIChfcmxfZGlnaXRfcCAoYykpCi0JewotCSAgcmxfbnVtZXJpY19hcmcgPSBybF9leHBsaWNpdF9hcmcgPyAocmxfbnVtZXJpY19hcmcgKiAxMCkgKyBjIC0gJzAnIDogYyAtICcwJzsKLQkgIHNhd2RpZ2l0cyA9IHJsX2V4cGxpY2l0X2FyZyA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAnLScgJiYgcmxfZXhwbGljaXRfYXJnID09IDApCi0JewotCSAgcmxfbnVtZXJpY19hcmcgPSBzYXdtaW51cyA9IDE7Ci0JICBybF9hcmdfc2lnbiA9IC0xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNYWtlIE0tLSBjb21tYW5kIGVxdWl2YWxlbnQgdG8gTS0tMSBjb21tYW5kLiAqLwotCSAgaWYgKHNhd21pbnVzICYmIHJsX251bWVyaWNfYXJnID09IDEgJiYgcmxfZXhwbGljaXRfYXJnID09IDApCi0JICAgIHJsX2V4cGxpY2l0X2FyZyA9IDE7Ci0JICBybF9yZXN0b3JlX3Byb21wdCAoKTsKLQkgIHJsX2NsZWFyX21lc3NhZ2UgKCk7Ci0JICByZXR1cm4gKF9ybF9kaXNwYXRjaCAoa2V5LCBfcmxfa2V5bWFwKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogQWRkIHRoZSBjdXJyZW50IGRpZ2l0IHRvIHRoZSBhcmd1bWVudCBpbiBwcm9ncmVzcy4gKi8KLWludAotcmxfZGlnaXRfYXJndW1lbnQgKGlnbm9yZSwga2V5KQotICAgICBpbnQgaWdub3JlLCBrZXk7Ci17Ci0gIHJsX3BlbmRpbmdfaW5wdXQgPSBrZXk7Ci0gIHJldHVybiAocmxfZGlnaXRfbG9vcCAoKSk7Ci19Ci0KLS8qIFdoYXQgdG8gZG8gd2hlbiB5b3UgYWJvcnQgcmVhZGluZyBhbiBhcmd1bWVudC4gKi8KLWludAotcmxfZGlzY2FyZF9hcmd1bWVudCAoKQotewotICBkaW5nICgpOwotICBybF9jbGVhcl9tZXNzYWdlICgpOwotICBfcmxfaW5pdF9hcmd1bWVudCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENyZWF0ZSBhIGRlZmF1bHQgYXJndW1lbnQuICovCi1pbnQKLV9ybF9pbml0X2FyZ3VtZW50ICgpCi17Ci0gIHJsX251bWVyaWNfYXJnID0gcmxfYXJnX3NpZ24gPSAxOwotICBybF9leHBsaWNpdF9hcmcgPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyogQy11LCB1bml2ZXJzYWwgYXJndW1lbnQuICBNdWx0aXBseSB0aGUgY3VycmVudCBhcmd1bWVudCBieSA0LgotICAgUmVhZCBhIGtleS4gIElmIHRoZSBrZXkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBhcmd1bWVudHMsIHRoZW4KLSAgIGRpc3BhdGNoIG9uIGl0LiAgSWYgdGhlIGtleSBpcyB0aGUgYWJvcnQgY2hhcmFjdGVyIHRoZW4gYWJvcnQuICovCi1pbnQKLXJsX3VuaXZlcnNhbF9hcmd1bWVudCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJsX251bWVyaWNfYXJnICo9IDQ7Ci0gIHJldHVybiAocmxfZGlnaXRfbG9vcCAoKSk7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJSW5zZXJ0IGFuZCBEZWxldGUJCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogSW5zZXJ0IGEgc3RyaW5nIG9mIHRleHQgaW50byB0aGUgbGluZSBhdCBwb2ludC4gIFRoaXMgaXMgdGhlIG9ubHkKLSAgIHdheSB0aGF0IHlvdSBzaG91bGQgZG8gaW5zZXJ0aW9uLiAgcmxfaW5zZXJ0ICgpIGNhbGxzIHRoaXMKLSAgIGZ1bmN0aW9uLiAqLwotaW50Ci1ybF9pbnNlcnRfdGV4dCAoc3RyaW5nKQotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIHJlZ2lzdGVyIGludCBpLCBsID0gc3RybGVuIChzdHJpbmcpOwotCi0gIGlmIChybF9lbmQgKyBsID49IHJsX2xpbmVfYnVmZmVyX2xlbikKLSAgICBybF9leHRlbmRfbGluZV9idWZmZXIgKHJsX2VuZCArIGwpOwotCi0gIGZvciAoaSA9IHJsX2VuZDsgaSA+PSBybF9wb2ludDsgaS0tKQotICAgIHRoZV9saW5lW2kgKyBsXSA9IHRoZV9saW5lW2ldOwotICBzdHJuY3B5ICh0aGVfbGluZSArIHJsX3BvaW50LCBzdHJpbmcsIGwpOwotCi0gIC8qIFJlbWVtYmVyIGhvdyB0byB1bmRvIHRoaXMgaWYgd2UgYXJlbid0IHVuZG9pbmcgc29tZXRoaW5nLiAqLwotICBpZiAoIV9ybF9kb2luZ19hbl91bmRvKQotICAgIHsKLSAgICAgIC8qIElmIHBvc3NpYmxlIGFuZCBkZXNpcmFibGUsIGNvbmNhdGVuYXRlIHRoZSB1bmRvcy4gKi8KLSAgICAgIGlmICgobCA9PSAxKSAmJgotCSAgcmxfdW5kb19saXN0ICYmCi0JICAocmxfdW5kb19saXN0LT53aGF0ID09IFVORE9fSU5TRVJUKSAmJgotCSAgKHJsX3VuZG9fbGlzdC0+ZW5kID09IHJsX3BvaW50KSAmJgotCSAgKHJsX3VuZG9fbGlzdC0+ZW5kIC0gcmxfdW5kb19saXN0LT5zdGFydCA8IDIwKSkKLQlybF91bmRvX2xpc3QtPmVuZCsrOwotICAgICAgZWxzZQotCXJsX2FkZF91bmRvIChVTkRPX0lOU0VSVCwgcmxfcG9pbnQsIHJsX3BvaW50ICsgbCwgKGNoYXIgKilOVUxMKTsKLSAgICB9Ci0gIHJsX3BvaW50ICs9IGw7Ci0gIHJsX2VuZCArPSBsOwotICB0aGVfbGluZVtybF9lbmRdID0gJ1wwJzsKLSAgcmV0dXJuIGw7Ci19Ci0KLS8qIERlbGV0ZSB0aGUgc3RyaW5nIGJldHdlZW4gRlJPTSBhbmQgVE8uICBGUk9NIGlzCi0gICBpbmNsdXNpdmUsIFRPIGlzIG5vdC4gKi8KLWludAotcmxfZGVsZXRlX3RleHQgKGZyb20sIHRvKQotICAgICBpbnQgZnJvbSwgdG87Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnRleHQ7Ci0gIHJlZ2lzdGVyIGludCBkaWZmLCBpOwotCi0gIC8qIEZpeCBpdCBpZiB0aGUgY2FsbGVyIGlzIGNvbmZ1c2VkLiAqLwotICBpZiAoZnJvbSA+IHRvKQotICAgIFNXQVAgKGZyb20sIHRvKTsKLQotICAvKiBmaXggYm91bmRhcmllcyAqLwotICBpZiAodG8gPiBybF9lbmQpCi0gICAgewotICAgICAgdG8gPSBybF9lbmQ7Ci0gICAgICBpZiAoZnJvbSA+IHRvKQotICAgICAgICBmcm9tID0gdG87Ci0gICAgfQotCi0gIHRleHQgPSBybF9jb3B5X3RleHQgKGZyb20sIHRvKTsKLQotICAvKiBTb21lIHZlcnNpb25zIG9mIHN0cm5jcHkoKSBjYW4ndCBoYW5kbGUgb3ZlcmxhcHBpbmcgYXJndW1lbnRzLiAqLwotICBkaWZmID0gdG8gLSBmcm9tOwotICBmb3IgKGkgPSBmcm9tOyBpIDwgcmxfZW5kIC0gZGlmZjsgaSsrKQotICAgIHRoZV9saW5lW2ldID0gdGhlX2xpbmVbaSArIGRpZmZdOwotCi0gIC8qIFJlbWVtYmVyIGhvdyB0byB1bmRvIHRoaXMgZGVsZXRlLiAqLwotICBpZiAoX3JsX2RvaW5nX2FuX3VuZG8gPT0gMCkKLSAgICBybF9hZGRfdW5kbyAoVU5ET19ERUxFVEUsIGZyb20sIHRvLCB0ZXh0KTsKLSAgZWxzZQotICAgIGZyZWUgKHRleHQpOwotCi0gIHJsX2VuZCAtPSBkaWZmOwotICB0aGVfbGluZVtybF9lbmRdID0gJ1wwJzsKLSAgcmV0dXJuIChkaWZmKTsKLX0KLQotLyogRml4IHVwIHBvaW50IHNvIHRoYXQgaXQgaXMgd2l0aGluIHRoZSBsaW5lIGJvdW5kYXJpZXMgYWZ0ZXIga2lsbGluZwotICAgdGV4dC4gIElmIEZJWF9NQVJLX1RPTyBpcyBub24temVybywgdGhlIG1hcmsgaXMgZm9yY2VkIHdpdGhpbiBsaW5lCi0gICBib3VuZGFyaWVzIGFsc28uICovCi0KLSNkZWZpbmUgX1JMX0ZJWF9QT0lOVCh4KSBcCi0JZG8geyBcCi0JaWYgKHggPiBybF9lbmQpIFwKLQkgIHggPSBybF9lbmQ7IFwKLQllbHNlIGlmICh4IDwgMCkgXAotCSAgeCA9IDA7IFwKLQl9IHdoaWxlICgwKQotCi12b2lkCi1fcmxfZml4X3BvaW50IChmaXhfbWFya190b28pCi0gICAgIGludCBmaXhfbWFya190b287Ci17Ci0gIF9STF9GSVhfUE9JTlQgKHJsX3BvaW50KTsKLSAgaWYgKGZpeF9tYXJrX3RvbykKLSAgICBfUkxfRklYX1BPSU5UIChybF9tYXJrKTsKLX0KLSN1bmRlZiBfUkxfRklYX1BPSU5UCi0KLXZvaWQKLV9ybF9yZXBsYWNlX3RleHQgKHRleHQsIHN0YXJ0LCBlbmQpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCBzdGFydCwgZW5kOwotewotICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotICBybF9kZWxldGVfdGV4dCAoc3RhcnQsIGVuZCArIDEpOwotICBybF9wb2ludCA9IHN0YXJ0OwotICBybF9pbnNlcnRfdGV4dCAodGV4dCk7Ci0gIHJsX2VuZF91bmRvX2dyb3VwICgpOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCVJlYWRsaW5lIGNoYXJhY3RlciBmdW5jdGlvbnMJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBUaGlzIGlzIG5vdCBhIGdhcCBlZGl0b3IsIGp1c3QgYSBzdHVwaWQgbGluZSBpbnB1dCByb3V0aW5lLiAgTm8gaGFpcgotICAgaXMgaW52b2x2ZWQgaW4gd3JpdGluZyBhbnkgb2YgdGhlIGZ1bmN0aW9ucywgYW5kIG5vbmUgc2hvdWxkIGJlLiAqLwotCi0vKiBOb3RlIHRoYXQ6Ci0KLSAgIHJsX2VuZCBpcyB0aGUgcGxhY2UgaW4gdGhlIHN0cmluZyB0aGF0IHdlIHdvdWxkIHBsYWNlICdcMCc7Ci0gICBpLmUuLCBpdCBpcyBhbHdheXMgc2FmZSB0byBwbGFjZSAnXDAnIHRoZXJlLgotCi0gICBybF9wb2ludCBpcyB0aGUgcGxhY2UgaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgY3Vyc29yIGlzLiAgU29tZXRpbWVzCi0gICB0aGlzIGlzIHRoZSBzYW1lIGFzIHJsX2VuZC4KLQotICAgQW55IGNvbW1hbmQgdGhhdCBpcyBjYWxsZWQgaW50ZXJhY3RpdmVseSByZWNlaXZlcyB0d28gYXJndW1lbnRzLgotICAgVGhlIGZpcnN0IGlzIGEgY291bnQ6IHRoZSBudW1lcmljIGFyZyBwYXNlZCB0byB0aGlzIGNvbW1hbmQuCi0gICBUaGUgc2Vjb25kIGlzIHRoZSBrZXkgd2hpY2ggaW52b2tlZCB0aGlzIGNvbW1hbmQuCi0qLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCU1vdmVtZW50IENvbW1hbmRzCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIE5vdGUgdGhhdCBpZiB5b3UgYG9wdGltaXplJyB0aGUgZGlzcGxheSBmb3IgdGhlc2UgZnVuY3Rpb25zLCB5b3UgY2Fubm90Ci0gICB1c2Ugc2FpZCBmdW5jdGlvbnMgaW4gb3RoZXIgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCBkbyBvcHRpbWl6aW5nIGRpc3BsYXkuCi0gICBJLmUuLCB5b3Ugd2lsbCBoYXZlIHRvIHVwZGF0ZSB0aGUgZGF0YSBiYXNlIGZvciBybF9yZWRpc3BsYXksIGFuZCB5b3UKLSAgIG1pZ2h0IGFzIHdlbGwgbGV0IHJsX3JlZGlzcGxheSBkbyB0aGF0IGpvYi4gKi8KLQotLyogTW92ZSBmb3J3YXJkIENPVU5UIGNoYXJhY3RlcnMuICovCi1pbnQKLXJsX2ZvcndhcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoY291bnQgPCAwKQotICAgIHJsX2JhY2t3YXJkICgtY291bnQsIGtleSk7Ci0gIGVsc2UgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpbnQgZW5kID0gcmxfcG9pbnQgKyBjb3VudDsKLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICAgICAgaW50IGxlbmQgPSBybF9lbmQgLSAocmxfZWRpdGluZ19tb2RlID09IHZpX21vZGUpOwotI2Vsc2UKLSAgICAgIGludCBsZW5kID0gcmxfZW5kOwotI2VuZGlmCi0KLSAgICAgIGlmIChlbmQgPiBsZW5kKQotCXsKLQkgIHJsX3BvaW50ID0gbGVuZDsKLQkgIGRpbmcgKCk7Ci0JfQotICAgICAgZWxzZQotCXJsX3BvaW50ID0gZW5kOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1vdmUgYmFja3dhcmQgQ09VTlQgY2hhcmFjdGVycy4gKi8KLWludAotcmxfYmFja3dhcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoY291bnQgPCAwKQotICAgIHJsX2ZvcndhcmQgKC1jb3VudCwga2V5KTsKLSAgZWxzZSBpZiAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmIChybF9wb2ludCA8IGNvdW50KQotCXsKLQkgIHJsX3BvaW50ID0gMDsKLQkgIGRpbmcgKCk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICBybF9wb2ludCAtPSBjb3VudDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuICovCi1pbnQKLXJsX2JlZ19vZl9saW5lIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmxfcG9pbnQgPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLwotaW50Ci1ybF9lbmRfb2ZfbGluZSAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJsX3BvaW50ID0gcmxfZW5kOwotICByZXR1cm4gMDsKLX0KLQotLyogTW92ZSBmb3J3YXJkIGEgd29yZC4gIFdlIGRvIHdoYXQgRW1hY3MgZG9lcy4gKi8KLWludAotcmxfZm9yd2FyZF93b3JkIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGM7Ci0KLSAgaWYgKGNvdW50IDwgMCkKLSAgICB7Ci0gICAgICBybF9iYWNrd2FyZF93b3JkICgtY291bnQsIGtleSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgd2hpbGUgKGNvdW50KQotICAgIHsKLSAgICAgIGlmIChybF9wb2ludCA9PSBybF9lbmQpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBub3QgaW4gYSB3b3JkLCBtb3ZlIGZvcndhcmQgdW50aWwgd2UgYXJlIGluIG9uZS4KLQkgVGhlbiwgbW92ZSBmb3J3YXJkIHVudGlsIHdlIGhpdCBhIG5vbi1hbHBoYWJldGljIGNoYXJhY3Rlci4gKi8KLSAgICAgIGMgPSB0aGVfbGluZVtybF9wb2ludF07Ci0gICAgICBpZiAoYWxwaGFiZXRpYyAoYykgPT0gMCkKLQl7Ci0JICB3aGlsZSAoKytybF9wb2ludCA8IHJsX2VuZCkKLQkgICAgewotCSAgICAgIGMgPSB0aGVfbGluZVtybF9wb2ludF07Ci0JICAgICAgaWYgKGFscGhhYmV0aWMgKGMpKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChybF9wb2ludCA9PSBybF9lbmQpCi0JcmV0dXJuIDA7Ci0gICAgICB3aGlsZSAoKytybF9wb2ludCA8IHJsX2VuZCkKLQl7Ci0JICBjID0gdGhlX2xpbmVbcmxfcG9pbnRdOwotCSAgaWYgKGFscGhhYmV0aWMgKGMpID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC0tY291bnQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogTW92ZSBiYWNrd2FyZCBhIHdvcmQuICBXZSBkbyB3aGF0IEVtYWNzIGRvZXMuICovCi1pbnQKLXJsX2JhY2t3YXJkX3dvcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgYzsKLQotICBpZiAoY291bnQgPCAwKQotICAgIHsKLSAgICAgIHJsX2ZvcndhcmRfd29yZCAoLWNvdW50LCBrZXkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHdoaWxlIChjb3VudCkKLSAgICB7Ci0gICAgICBpZiAoIXJsX3BvaW50KQotCXJldHVybiAwOwotCi0gICAgICAvKiBMaWtlIHJsX2ZvcndhcmRfd29yZCAoKSwgZXhjZXB0IHRoYXQgd2UgbG9vayBhdCB0aGUgY2hhcmFjdGVycwotCSBqdXN0IGJlZm9yZSBwb2ludC4gKi8KLQotICAgICAgYyA9IHRoZV9saW5lW3JsX3BvaW50IC0gMV07Ci0gICAgICBpZiAoYWxwaGFiZXRpYyAoYykgPT0gMCkKLQl7Ci0JICB3aGlsZSAoLS1ybF9wb2ludCkKLQkgICAgewotCSAgICAgIGMgPSB0aGVfbGluZVtybF9wb2ludCAtIDFdOwotCSAgICAgIGlmIChhbHBoYWJldGljIChjKSkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlIChybF9wb2ludCkKLQl7Ci0JICBjID0gdGhlX2xpbmVbcmxfcG9pbnQgLSAxXTsKLQkgIGlmIChhbHBoYWJldGljIChjKSA9PSAwKQotCSAgICBicmVhazsKLQkgIGVsc2UKLQkgICAgLS1ybF9wb2ludDsKLQl9Ci0gICAgICAtLWNvdW50OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENsZWFyIHRoZSBjdXJyZW50IGxpbmUuICBOdW1lcmljIGFyZ3VtZW50IHRvIEMtbCBkb2VzIHRoaXMuICovCi1pbnQKLXJsX3JlZnJlc2hfbGluZSAoaWdub3JlMSwgaWdub3JlMikKLSAgICAgaW50IGlnbm9yZTEsIGlnbm9yZTI7Ci17Ci0gIGludCBjdXJyX2xpbmUsIG5sZWZ0OwotCi0gIC8qIEZpbmQgb3V0IHdoZXRoZXIgb3Igbm90IHRoZXJlIG1pZ2h0IGJlIGludmlzaWJsZSBjaGFyYWN0ZXJzIGluIHRoZQotICAgICBlZGl0aW5nIGJ1ZmZlci4gKi8KLSAgaWYgKHJsX2Rpc3BsYXlfcHJvbXB0ID09IHJsX3Byb21wdCkKLSAgICBubGVmdCA9IF9ybF9sYXN0X2NfcG9zIC0gc2NyZWVud2lkdGggLSBybF92aXNpYmxlX3Byb21wdF9sZW5ndGg7Ci0gIGVsc2UKLSAgICBubGVmdCA9IF9ybF9sYXN0X2NfcG9zIC0gc2NyZWVud2lkdGg7Ci0KLSAgaWYgKG5sZWZ0ID4gMCkKLSAgICBjdXJyX2xpbmUgPSAxICsgbmxlZnQgLyBzY3JlZW53aWR0aDsKLSAgZWxzZQotICAgIGN1cnJfbGluZSA9IDA7Ci0KLSAgX3JsX21vdmVfdmVydCAoY3Vycl9saW5lKTsKLSAgX3JsX21vdmVfY3Vyc29yX3JlbGF0aXZlICgwLCB0aGVfbGluZSk7ICAgLyogWFhYIGlzIHRoaXMgcmlnaHQgKi8KLQotI2lmIGRlZmluZWQgKF9fR08zMl9fKSAmJiAhZGVmaW5lZCAoX19ESkdQUF9fKQotICB7Ci0gICAgaW50IHJvdywgY29sLCB3aWR0aCwgcm93X3N0YXJ0OwotCi0gICAgU2NyZWVuR2V0Q3Vyc29yICgmcm93LCAmY29sKTsKLSAgICB3aWR0aCA9IFNjcmVlbkNvbHMgKCk7Ci0gICAgcm93X3N0YXJ0ID0gU2NyZWVuUHJpbWFyeSArIChyb3cgKiB3aWR0aCk7Ci0gICAgbWVtc2V0IChyb3dfc3RhcnQgKyBjb2wsIDAsICh3aWR0aCAtIGNvbCkgKiAyKTsKLSAgfQotI2Vsc2UgLyogIV9fR08zMl9fIHx8IF9fREpHUFBfXyAqLwotICBfcmxfY2xlYXJfdG9fZW9sICgwKTsJCS8qIGFyZyBvZiAwIG1lYW5zIHRvIG5vdCB1c2Ugc3BhY2VzICovCi0jZW5kaWYgLyogIV9fR08zMl9fIHx8IF9fREpHUFBfXyAqLwotCi0gIHJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSAoKTsKLSAgcmxfZGlzcGxheV9maXhlZCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEMtbCB0eXBlZCB0byBhIGxpbmUgd2l0aG91dCBxdW90aW5nIGNsZWFycyB0aGUgc2NyZWVuLCBhbmQgdGhlbiByZXByaW50cwotICAgdGhlIHByb21wdCBhbmQgdGhlIGN1cnJlbnQgaW5wdXQgbGluZS4gIEdpdmVuIGEgbnVtZXJpYyBhcmcsIHJlZHJhdyBvbmx5Ci0gICB0aGUgY3VycmVudCBsaW5lLiAqLwotaW50Ci1ybF9jbGVhcl9zY3JlZW4gKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAocmxfZXhwbGljaXRfYXJnKQotICAgIHsKLSAgICAgIHJsX3JlZnJlc2hfbGluZSAoY291bnQsIGtleSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgX3JsX2NsZWFyX3NjcmVlbiAoKTsJCS8qIGNhbGxzIHRlcm1jYXAgZnVuY3Rpb24gdG8gY2xlYXIgc2NyZWVuICovCi0gIHJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSAoKTsKLSAgcmxfZGlzcGxheV9maXhlZCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcmxfYXJyb3dfa2V5cyAoY291bnQsIGMpCi0gICAgIGludCBjb3VudCwgYzsKLXsKLSAgaW50IGNoOwotCi0gIGNoID0gcmxfcmVhZF9rZXkgKCk7Ci0KLSAgc3dpdGNoIChfcmxfdG9fdXBwZXIgKGNoKSkKLSAgICB7Ci0gICAgY2FzZSAnQSc6Ci0gICAgICBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSAoY291bnQsIGNoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICBybF9nZXRfbmV4dF9oaXN0b3J5IChjb3VudCwgY2gpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIHJsX2ZvcndhcmQgKGNvdW50LCBjaCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgcmxfYmFja3dhcmQgKGNvdW50LCBjaCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBkaW5nICgpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQwKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJVGV4dCBjb21tYW5kcwkJCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogSW5zZXJ0IHRoZSBjaGFyYWN0ZXIgQyBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiwgbW92aW5nIHBvaW50IGZvcndhcmQuICovCi1pbnQKLXJsX2luc2VydCAoY291bnQsIGMpCi0gICAgIGludCBjb3VudCwgYzsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoY291bnQgPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB3ZSBjYW4gb3B0aW1pemUsIHRoZW4gZG8gaXQuICBCdXQgZG9uJ3QgbGV0IHBlb3BsZSBjcmFzaAotICAgICByZWFkbGluZSBiZWNhdXNlIG9mIGV4dHJhIGxhcmdlIGFyZ3VtZW50cy4gKi8KLSAgaWYgKGNvdW50ID4gMSAmJiBjb3VudCA8PSAxMDI0KQotICAgIHsKLSAgICAgIHN0cmluZyA9IHhtYWxsb2MgKDEgKyBjb3VudCk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXN0cmluZ1tpXSA9IGM7Ci0KLSAgICAgIHN0cmluZ1tpXSA9ICdcMCc7Ci0gICAgICBybF9pbnNlcnRfdGV4dCAoc3RyaW5nKTsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoY291bnQgPiAxMDI0KQotICAgIHsKLSAgICAgIGludCBkZWNyZWFzZXI7Ci0gICAgICBjaGFyIHN0clsxMDI0KzFdOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQotCXN0cltpXSA9IGM7Ci0KLSAgICAgIHdoaWxlIChjb3VudCkKLQl7Ci0JICBkZWNyZWFzZXIgPSAoY291bnQgPiAxMDI0ID8gMTAyNCA6IGNvdW50KTsKLQkgIHN0cltkZWNyZWFzZXJdID0gJ1wwJzsKLQkgIHJsX2luc2VydF90ZXh0IChzdHIpOwotCSAgY291bnQgLT0gZGVjcmVhc2VyOwotCX0KLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBpbnNlcnRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLgotICAgICBJZiB0aGVyZSBpcyBwZW5kaW5nIGlucHV0LCB0aGVuIG1ha2UgYSBzdHJpbmcgb2YgYWxsIG9mIHRoZQotICAgICBwZW5kaW5nIGNoYXJhY3RlcnMgdGhhdCBhcmUgYm91bmQgdG8gcmxfaW5zZXJ0LCBhbmQgaW5zZXJ0Ci0gICAgIHRoZW0gYWxsLiAqLwotICBpZiAoX3JsX2FueV90eXBlaW4gKCkpCi0gICAgX3JsX2luc2VydF90eXBlaW4gKGMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogSW5zZXJ0aW5nIGEgc2luZ2xlIGNoYXJhY3Rlci4gKi8KLSAgICAgIGNoYXIgc3RyWzJdOwotCi0gICAgICBzdHJbMV0gPSAnXDAnOwotICAgICAgc3RyWzBdID0gYzsKLSAgICAgIHJsX2luc2VydF90ZXh0IChzdHIpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCB0aGUgbmV4dCB0eXBlZCBjaGFyYWN0ZXIgdmVyYmF0aW0uICovCi1pbnQKLXJsX3F1b3RlZF9pbnNlcnQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgYzsKLQotICBjID0gcmxfcmVhZF9rZXkgKCk7Ci0gIHJldHVybiAocmxfaW5zZXJ0IChjb3VudCwgYykpOyAgCi19Ci0KLS8qIEluc2VydCBhIHRhYiBjaGFyYWN0ZXIuICovCi1pbnQKLXJsX3RhYl9pbnNlcnQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICByZXR1cm4gKHJsX2luc2VydCAoY291bnQsICdcdCcpKTsKLX0KLQotLyogV2hhdCB0byBkbyB3aGVuIGEgTkVXTElORSBpcyBwcmVzc2VkLiAgV2UgYWNjZXB0IHRoZSB3aG9sZSBsaW5lLgotICAgS0VZIGlzIHRoZSBrZXkgdGhhdCBpbnZva2VkIHRoaXMgY29tbWFuZC4gIEkgZ3Vlc3MgaXQgY291bGQgaGF2ZQotICAgbWVhbmluZyBpbiB0aGUgZnV0dXJlLiAqLwotaW50Ci1ybF9uZXdsaW5lIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmxfZG9uZSA9IDE7Ci0KLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICBpZiAocmxfZWRpdGluZ19tb2RlID09IHZpX21vZGUpCi0gICAgewotICAgICAgX3JsX3ZpX2RvbmVfaW5zZXJ0aW5nICgpOwotICAgICAgX3JsX3ZpX3Jlc2V0X2xhc3QgKCk7Ci0gICAgfQotI2VuZGlmIC8qIFZJX01PREUgKi8KLQotICAvKiBJZiB3ZSd2ZSBiZWVuIGFza2VkIHRvIGVyYXNlIGVtcHR5IGxpbmVzLCBzdXBwcmVzcyB0aGUgZmluYWwgdXBkYXRlLAotICAgICBzaW5jZSBfcmxfdXBkYXRlX2ZpbmFsIGNhbGxzIGNybGYoKS4gKi8KLSAgaWYgKHJsX2VyYXNlX2VtcHR5X2xpbmUgJiYgcmxfcG9pbnQgPT0gMCAmJiBybF9lbmQgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAocmVhZGxpbmVfZWNob2luZ19wKQotICAgIF9ybF91cGRhdGVfZmluYWwgKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXaGF0IHRvIGRvIGZvciBzb21lIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLCBsaWtlIG1ldGEgY2hhcmFjdGVycywKLSAgIGFuZCBzb21lIGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIGVtYWNzX2N0bHhfa2V5bWFwLiAgVGhpcyBmdW5jdGlvbgotICAgaXMganVzdCBhIHN0dWIsIHlvdSBiaW5kIGtleXMgdG8gaXQgYW5kIHRoZSBjb2RlIGluIF9ybF9kaXNwYXRjaCAoKQotICAgaXMgc3BlY2lhbCBjYXNlZC4gKi8KLWludAotcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gKGlnbm9yZTEsIGlnbm9yZTIpCi0gICAgIGludCBpZ25vcmUxLCBpZ25vcmUyOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUnVib3V0IHRoZSBjaGFyYWN0ZXIgYmVoaW5kIHBvaW50LiAqLwotaW50Ci1ybF9ydWJvdXQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoY291bnQgPCAwKQotICAgIHsKLSAgICAgIHJsX2RlbGV0ZSAoLWNvdW50LCBrZXkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghcmxfcG9pbnQpCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGNvdW50ID4gMSB8fCBybF9leHBsaWNpdF9hcmcpCi0gICAgewotICAgICAgaW50IG9yaWdfcG9pbnQgPSBybF9wb2ludDsKLSAgICAgIHJsX2JhY2t3YXJkIChjb3VudCwga2V5KTsKLSAgICAgIHJsX2tpbGxfdGV4dCAob3JpZ19wb2ludCwgcmxfcG9pbnQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBjID0gdGhlX2xpbmVbLS1ybF9wb2ludF07Ci0gICAgICBybF9kZWxldGVfdGV4dCAocmxfcG9pbnQsIHJsX3BvaW50ICsgMSk7Ci0KLSAgICAgIGlmIChybF9wb2ludCA9PSBybF9lbmQgJiYgaXNwcmludCAoYykgJiYgX3JsX2xhc3RfY19wb3MpCi0JewotCSAgaW50IGw7Ci0JICBsID0gcmxfY2hhcmFjdGVyX2xlbiAoYywgcmxfcG9pbnQpOwotCSAgX3JsX2VyYXNlX2F0X2VuZF9vZl9saW5lIChsKTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogRGVsZXRlIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvci4gIEdpdmVuIGEgbnVtZXJpYyBhcmd1bWVudCwKLSAgIGtpbGwgdGhhdCBtYW55IGNoYXJhY3RlcnMgaW5zdGVhZC4gKi8KLWludAotcmxfZGVsZXRlIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKGNvdW50IDwgMCkKLSAgICByZXR1cm4gKHJsX3J1Ym91dCAoLWNvdW50LCBrZXkpKTsKLQotICBpZiAocmxfcG9pbnQgPT0gcmxfZW5kKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChjb3VudCA+IDEgfHwgcmxfZXhwbGljaXRfYXJnKQotICAgIHsKLSAgICAgIGludCBvcmlnX3BvaW50ID0gcmxfcG9pbnQ7Ci0gICAgICBybF9mb3J3YXJkIChjb3VudCwga2V5KTsKLSAgICAgIHJsX2tpbGxfdGV4dCAob3JpZ19wb2ludCwgcmxfcG9pbnQpOwotICAgICAgcmxfcG9pbnQgPSBvcmlnX3BvaW50OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIChybF9kZWxldGVfdGV4dCAocmxfcG9pbnQsIHJsX3BvaW50ICsgMSkpOwotfQotCi0vKiBEZWxldGUgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yLCB1bmxlc3MgdGhlIGluc2VydGlvbgotICAgcG9pbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyCi0gICBiZWhpbmQgdGhlIGN1cnNvciBpcyBkZWxldGVkLiAgQ09VTlQgaXMgb2JleWVkIGFuZCBtYXkgYmUgdXNlZAotICAgdG8gZGVsZXRlIGZvcndhcmQgb3IgYmFja3dhcmQgdGhhdCBtYW55IGNoYXJhY3RlcnMuICovICAgICAgCi1pbnQKLXJsX3J1Ym91dF9vcl9kZWxldGUgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAocmxfZW5kICE9IDAgJiYgcmxfcG9pbnQgPT0gcmxfZW5kKQotICAgIHJldHVybiAocmxfcnVib3V0IChjb3VudCwga2V5KSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKHJsX2RlbGV0ZSAoY291bnQsIGtleSkpOwotfSAgCi0KLS8qIERlbGV0ZSBhbGwgc3BhY2VzIGFuZCB0YWJzIGFyb3VuZCBwb2ludC4gKi8KLWludAotcmxfZGVsZXRlX2hvcml6b250YWxfc3BhY2UgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICBpbnQgc3RhcnQgPSBybF9wb2ludDsKLQotICB3aGlsZSAocmxfcG9pbnQgJiYgd2hpdGVzcGFjZSAodGhlX2xpbmVbcmxfcG9pbnQgLSAxXSkpCi0gICAgcmxfcG9pbnQtLTsKLQotICBzdGFydCA9IHJsX3BvaW50OwotCi0gIHdoaWxlIChybF9wb2ludCA8IHJsX2VuZCAmJiB3aGl0ZXNwYWNlICh0aGVfbGluZVtybF9wb2ludF0pKQotICAgIHJsX3BvaW50Kys7Ci0KLSAgaWYgKHN0YXJ0ICE9IHJsX3BvaW50KQotICAgIHsKLSAgICAgIHJsX2RlbGV0ZV90ZXh0IChzdGFydCwgcmxfcG9pbnQpOwotICAgICAgcmxfcG9pbnQgPSBzdGFydDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBMaWtlIHRoZSB0Y3NoIGVkaXRpbmcgZnVuY3Rpb24gZGVsZXRlLWNoYXItb3ItbGlzdC4gIFRoZSBlb2YgY2hhcmFjdGVyCi0gICBpcyBjYXVnaHQgYmVmb3JlIHRoaXMgaXMgaW52b2tlZCwgc28gdGhpcyByZWFsbHkgZG9lcyB0aGUgc2FtZSB0aGluZyBhcwotICAgZGVsZXRlLWNoYXItb3ItbGlzdC1vci1lb2YsIGFzIGxvbmcgYXMgaXQncyBib3VuZCB0byB0aGUgZW9mIGNoYXJhY3Rlci4gKi8KLWludAotcmxfZGVsZXRlX29yX3Nob3dfY29tcGxldGlvbnMgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAocmxfZW5kICE9IDAgJiYgcmxfcG9pbnQgPT0gcmxfZW5kKQotICAgIHJldHVybiAocmxfcG9zc2libGVfY29tcGxldGlvbnMgKGNvdW50LCBrZXkpKTsKLSAgZWxzZQotICAgIHJldHVybiAocmxfZGVsZXRlIChjb3VudCwga2V5KSk7Ci19Ci0KLSNpZm5kZWYgUkxfQ09NTUVOVF9CRUdJTl9ERUZBVUxUCi0jZGVmaW5lIFJMX0NPTU1FTlRfQkVHSU5fREVGQVVMVCAiIyIKLSNlbmRpZgotCi0vKiBUdXJuIHRoZSBjdXJyZW50IGxpbmUgaW50byBhIGNvbW1lbnQgaW4gc2hlbGwgaGlzdG9yeS4KLSAgIEEgSypybiBzaGVsbCBzdHlsZSBmdW5jdGlvbi4gKi8KLWludAotcmxfaW5zZXJ0X2NvbW1lbnQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBybF9iZWdfb2ZfbGluZSAoMSwga2V5KTsKLSAgcmxfaW5zZXJ0X3RleHQgKF9ybF9jb21tZW50X2JlZ2luID8gX3JsX2NvbW1lbnRfYmVnaW4KLQkJCQkgICAgOiBSTF9DT01NRU5UX0JFR0lOX0RFRkFVTFQpOwotICAoKnJsX3JlZGlzcGxheV9mdW5jdGlvbikgKCk7Ci0gIHJsX25ld2xpbmUgKDEsICdcbicpOwotICByZXR1cm4gKDApOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCUNoYW5naW5nIENhc2UJCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFRoZSB0aHJlZSBraW5kcyBvZiB0aGluZ3MgdGhhdCB3ZSBrbm93IGhvdyB0byBkby4gKi8KLSNkZWZpbmUgVXBDYXNlIDEKLSNkZWZpbmUgRG93bkNhc2UgMgotI2RlZmluZSBDYXBDYXNlIDMKLQotc3RhdGljIGludCBybF9jaGFuZ2VfY2FzZSAoKTsKLQotLyogVXBwZXJjYXNlIHRoZSB3b3JkIGF0IHBvaW50LiAqLwotaW50Ci1ybF91cGNhc2Vfd29yZCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJldHVybiAocmxfY2hhbmdlX2Nhc2UgKGNvdW50LCBVcENhc2UpKTsKLX0KLQotLyogTG93ZXJjYXNlIHRoZSB3b3JkIGF0IHBvaW50LiAqLwotaW50Ci1ybF9kb3duY2FzZV93b3JkIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmV0dXJuIChybF9jaGFuZ2VfY2FzZSAoY291bnQsIERvd25DYXNlKSk7Ci19Ci0KLS8qIFVwY2FzZSB0aGUgZmlyc3QgbGV0dGVyLCBkb3duY2FzZSB0aGUgcmVzdC4gKi8KLWludAotcmxfY2FwaXRhbGl6ZV93b3JkIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSByZXR1cm4gKHJsX2NoYW5nZV9jYXNlIChjb3VudCwgQ2FwQ2FzZSkpOwotfQotCi0vKiBUaGUgbWVhdHkgZnVuY3Rpb24uCi0gICBDaGFuZ2UgdGhlIGNhc2Ugb2YgQ09VTlQgd29yZHMsIHBlcmZvcm1pbmcgT1Agb24gdGhlbS4KLSAgIE9QIGlzIG9uZSBvZiBVcENhc2UsIERvd25DYXNlLCBvciBDYXBDYXNlLgotICAgSWYgYSBuZWdhdGl2ZSBhcmd1bWVudCBpcyBnaXZlbiwgbGVhdmUgcG9pbnQgd2hlcmUgaXQgc3RhcnRlZCwKLSAgIG90aGVyd2lzZSwgbGVhdmUgaXQgd2hlcmUgaXQgbW92ZXMgdG8uICovCi1zdGF0aWMgaW50Ci1ybF9jaGFuZ2VfY2FzZSAoY291bnQsIG9wKQotICAgICBpbnQgY291bnQsIG9wOwotewotICByZWdpc3RlciBpbnQgc3RhcnQsIGVuZDsKLSAgaW50IGlud29yZCwgYzsKLQotICBzdGFydCA9IHJsX3BvaW50OwotICBybF9mb3J3YXJkX3dvcmQgKGNvdW50LCAwKTsKLSAgZW5kID0gcmxfcG9pbnQ7Ci0KLSAgaWYgKGNvdW50IDwgMCkKLSAgICBTV0FQIChzdGFydCwgZW5kKTsKLQotICAvKiBXZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHNvbWUgdGV4dCwgc28gbGV0J3MgcHJlcGFyZSB0byB1bmRvIGl0LiAqLwotICBybF9tb2RpZnlpbmcgKHN0YXJ0LCBlbmQpOwotCi0gIGZvciAoaW53b3JkID0gMDsgc3RhcnQgPCBlbmQ7IHN0YXJ0KyspCi0gICAgewotICAgICAgYyA9IHRoZV9saW5lW3N0YXJ0XTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgVXBDYXNlOgotCSAgdGhlX2xpbmVbc3RhcnRdID0gX3JsX3RvX3VwcGVyIChjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEb3duQ2FzZToKLQkgIHRoZV9saW5lW3N0YXJ0XSA9IF9ybF90b19sb3dlciAoYyk7Ci0JICBicmVhazsKLQotCWNhc2UgQ2FwQ2FzZToKLQkgIHRoZV9saW5lW3N0YXJ0XSA9IChpbndvcmQgPT0gMCkgPyBfcmxfdG9fdXBwZXIgKGMpIDogX3JsX3RvX2xvd2VyIChjKTsKLQkgIGlud29yZCA9IGFscGhhYmV0aWMgKHRoZV9saW5lW3N0YXJ0XSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBkaW5nICgpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIHJsX3BvaW50ID0gZW5kOwotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlUcmFuc3Bvc2l0aW9uCQkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBUcmFuc3Bvc2UgdGhlIHdvcmRzIGF0IHBvaW50LiAqLwotaW50Ci1ybF90cmFuc3Bvc2Vfd29yZHMgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBjaGFyICp3b3JkMSwgKndvcmQyOwotICBpbnQgdzFfYmVnLCB3MV9lbmQsIHcyX2JlZywgdzJfZW5kOwotICBpbnQgb3JpZ19wb2ludCA9IHJsX3BvaW50OwotCi0gIGlmICghY291bnQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgdHdvIHdvcmRzLiAqLwotICBybF9mb3J3YXJkX3dvcmQgKGNvdW50LCBrZXkpOwotICB3Ml9lbmQgPSBybF9wb2ludDsKLSAgcmxfYmFja3dhcmRfd29yZCAoMSwga2V5KTsKLSAgdzJfYmVnID0gcmxfcG9pbnQ7Ci0gIHJsX2JhY2t3YXJkX3dvcmQgKGNvdW50LCBrZXkpOwotICB3MV9iZWcgPSBybF9wb2ludDsKLSAgcmxfZm9yd2FyZF93b3JkICgxLCBrZXkpOwotICB3MV9lbmQgPSBybF9wb2ludDsKLQotICAvKiBEbyBzb21lIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIHJlYWxseSBhcmUgdHdvIHdvcmRzLiAqLwotICBpZiAoKHcxX2JlZyA9PSB3Ml9iZWcpIHx8ICh3Ml9iZWcgPCB3MV9lbmQpKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICBybF9wb2ludCA9IG9yaWdfcG9pbnQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgdGV4dCBvZiB0aGUgd29yZHMuICovCi0gIHdvcmQxID0gcmxfY29weV90ZXh0ICh3MV9iZWcsIHcxX2VuZCk7Ci0gIHdvcmQyID0gcmxfY29weV90ZXh0ICh3Ml9iZWcsIHcyX2VuZCk7Ci0KLSAgLyogV2UgYXJlIGFib3V0IHRvIGRvIG1hbnkgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiAgUmVtZW1iZXIgdGhlbQotICAgICBhcyBvbmUgb3BlcmF0aW9uLiAqLwotICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotCi0gIC8qIERvIHRoZSBzdHVmZiBhdCB3b3JkMiBmaXJzdCwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0gICAgIGFib3V0IHdvcmQxIG1vdmluZy4gKi8KLSAgcmxfcG9pbnQgPSB3Ml9iZWc7Ci0gIHJsX2RlbGV0ZV90ZXh0ICh3Ml9iZWcsIHcyX2VuZCk7Ci0gIHJsX2luc2VydF90ZXh0ICh3b3JkMSk7Ci0KLSAgcmxfcG9pbnQgPSB3MV9iZWc7Ci0gIHJsX2RlbGV0ZV90ZXh0ICh3MV9iZWcsIHcxX2VuZCk7Ci0gIHJsX2luc2VydF90ZXh0ICh3b3JkMik7Ci0KLSAgLyogVGhpcyBpcyBleGFjdGx5IGNvcnJlY3Qgc2luY2UgdGhlIHRleHQgYmVmb3JlIHRoaXMgcG9pbnQgaGFzIG5vdAotICAgICBjaGFuZ2VkIGluIGxlbmd0aC4gKi8KLSAgcmxfcG9pbnQgPSB3Ml9lbmQ7Ci0KLSAgLyogSSB0aGluayB0aGF0IGRvZXMgaXQuICovCi0gIHJsX2VuZF91bmRvX2dyb3VwICgpOwotICBmcmVlICh3b3JkMSk7Ci0gIGZyZWUgKHdvcmQyKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVHJhbnNwb3NlIHRoZSBjaGFyYWN0ZXJzIGF0IHBvaW50LiAgSWYgcG9pbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwKLSAgIHRoZW4gdHJhbnNwb3NlIHRoZSBjaGFyYWN0ZXJzIGJlZm9yZSBwb2ludC4gKi8KLWludAotcmxfdHJhbnNwb3NlX2NoYXJzIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgY2hhciBkdW1teVsyXTsKLQotICBpZiAoIWNvdW50KQotICAgIHJldHVybiAwOwotCi0gIGlmICghcmxfcG9pbnQgfHwgcmxfZW5kIDwgMikKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotCi0gIGlmIChybF9wb2ludCA9PSBybF9lbmQpCi0gICAgewotICAgICAgLS1ybF9wb2ludDsKLSAgICAgIGNvdW50ID0gMTsKLSAgICB9Ci0gIHJsX3BvaW50LS07Ci0KLSAgZHVtbXlbMF0gPSB0aGVfbGluZVtybF9wb2ludF07Ci0gIGR1bW15WzFdID0gJ1wwJzsKLQotICBybF9kZWxldGVfdGV4dCAocmxfcG9pbnQsIHJsX3BvaW50ICsgMSk7Ci0KLSAgcmxfcG9pbnQgKz0gY291bnQ7Ci0gIF9ybF9maXhfcG9pbnQgKDApOwotICBybF9pbnNlcnRfdGV4dCAoZHVtbXkpOwotCi0gIHJsX2VuZF91bmRvX2dyb3VwICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlDaGFyYWN0ZXIgU2VhcmNoaW5nCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLWludAotX3JsX2NoYXJfc2VhcmNoX2ludGVybmFsIChjb3VudCwgZGlyLCBzY2hhcikKLSAgICAgaW50IGNvdW50LCBkaXIsIHNjaGFyOwotewotICBpbnQgcG9zLCBpbmM7Ci0KLSAgcG9zID0gcmxfcG9pbnQ7Ci0gIGluYyA9IChkaXIgPCAwKSA/IC0xIDogMTsKLSAgd2hpbGUgKGNvdW50KQotICAgIHsKLSAgICAgIGlmICgoZGlyIDwgMCAmJiBwb3MgPD0gMCkgfHwgKGRpciA+IDAgJiYgcG9zID49IHJsX2VuZCkpCi0JewotCSAgZGluZyAoKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIHBvcyArPSBpbmM7Ci0gICAgICBkbwotCXsKLQkgIGlmIChybF9saW5lX2J1ZmZlcltwb3NdID09IHNjaGFyKQotCSAgICB7Ci0JICAgICAgY291bnQtLTsKLQkgICAgICBpZiAoZGlyIDwgMCkKLQkgICAgICAgIHJsX3BvaW50ID0gKGRpciA9PSBCVE8pID8gcG9zICsgMSA6IHBvczsKLQkgICAgICBlbHNlCi0JCXJsX3BvaW50ID0gKGRpciA9PSBGVE8pID8gcG9zIC0gMSA6IHBvczsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgoZGlyIDwgMCkgPyBwb3MtLSA6ICsrcG9zIDwgcmxfZW5kKTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIFNlYXJjaCBDT1VOVCB0aW1lcyBmb3IgYSBjaGFyYWN0ZXIgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4KLSAgIEZESVIgaXMgdGhlIGRpcmVjdGlvbiB0byBzZWFyY2ggaWYgQ09VTlQgaXMgbm9uLW5lZ2F0aXZlOyBvdGhlcndpc2UKLSAgIHRoZSBzZWFyY2ggZ29lcyBpbiBCRElSLiAqLwotc3RhdGljIGludAotX3JsX2NoYXJfc2VhcmNoIChjb3VudCwgZmRpciwgYmRpcikKLSAgICAgaW50IGNvdW50LCBmZGlyLCBiZGlyOwotewotICBpbnQgYzsKLQotICBjID0gcmxfcmVhZF9rZXkgKCk7Ci0gIGlmIChjb3VudCA8IDApCi0gICAgcmV0dXJuIChfcmxfY2hhcl9zZWFyY2hfaW50ZXJuYWwgKC1jb3VudCwgYmRpciwgYykpOwotICBlbHNlCi0gICAgcmV0dXJuIChfcmxfY2hhcl9zZWFyY2hfaW50ZXJuYWwgKGNvdW50LCBmZGlyLCBjKSk7Ci19Ci0KLWludAotcmxfY2hhcl9zZWFyY2ggKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICByZXR1cm4gKF9ybF9jaGFyX3NlYXJjaCAoY291bnQsIEZGSU5ELCBCRklORCkpOwotfQotCi1pbnQKLXJsX2JhY2t3YXJkX2NoYXJfc2VhcmNoIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmV0dXJuIChfcmxfY2hhcl9zZWFyY2ggKGNvdW50LCBCRklORCwgRkZJTkQpKTsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlIaXN0b3J5IFV0aWxpdGllcwkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBXZSBhbHJlYWR5IGhhdmUgYSBoaXN0b3J5IGxpYnJhcnksIGFuZCB0aGF0IGlzIHdoYXQgd2UgdXNlIHRvIGNvbnRyb2wKLSAgIHRoZSBoaXN0b3J5IGZlYXR1cmVzIG9mIHJlYWRsaW5lLiAgVGhpcyBpcyBvdXIgbG9jYWwgaW50ZXJmYWNlIHRvCi0gICB0aGUgaGlzdG9yeSBtZWNoYW5pc20uICovCi0KLS8qIFdoaWxlIHdlIGFyZSBlZGl0aW5nIHRoZSBoaXN0b3J5LCB0aGlzIGlzIHRoZSBzYXZlZAotICAgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgbGluZS4gKi8KLUhJU1RfRU5UUlkgKnNhdmVkX2xpbmVfZm9yX2hpc3RvcnkgPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0KLS8qIFNldCB0aGUgaGlzdG9yeSBwb2ludGVyIGJhY2sgdG8gdGhlIGxhc3QgZW50cnkgaW4gdGhlIGhpc3RvcnkuICovCi1zdGF0aWMgdm9pZAotc3RhcnRfdXNpbmdfaGlzdG9yeSAoKQotewotICB1c2luZ19oaXN0b3J5ICgpOwotICBpZiAoc2F2ZWRfbGluZV9mb3JfaGlzdG9yeSkKLSAgICBfcmxfZnJlZV9oaXN0b3J5X2VudHJ5IChzYXZlZF9saW5lX2Zvcl9oaXN0b3J5KTsKLQotICBzYXZlZF9saW5lX2Zvcl9oaXN0b3J5ID0gKEhJU1RfRU5UUlkgKilOVUxMOwotfQotCi0vKiBGcmVlIHRoZSBjb250ZW50cyAoYW5kIGNvbnRhaW5pbmcgc3RydWN0dXJlKSBvZiBhIEhJU1RfRU5UUlkuICovCi12b2lkCi1fcmxfZnJlZV9oaXN0b3J5X2VudHJ5IChlbnRyeSkKLSAgICAgSElTVF9FTlRSWSAqZW50cnk7Ci17Ci0gIGlmIChlbnRyeSA9PSAwKQotICAgIHJldHVybjsKLSAgaWYgKGVudHJ5LT5saW5lKQotICAgIGZyZWUgKGVudHJ5LT5saW5lKTsKLSAgZnJlZSAoZW50cnkpOwotfQotCi0vKiBQZXJoYXBzIHB1dCBiYWNrIHRoZSBjdXJyZW50IGxpbmUgaWYgaXQgaGFzIGNoYW5nZWQuICovCi1pbnQKLW1heWJlX3JlcGxhY2VfbGluZSAoKQotewotICBISVNUX0VOVFJZICp0ZW1wOwotCi0gIHRlbXAgPSBjdXJyZW50X2hpc3RvcnkgKCk7Ci0gIC8qIElmIHRoZSBjdXJyZW50IGxpbmUgaGFzIGNoYW5nZWQsIHNhdmUgdGhlIGNoYW5nZXMuICovCi0gIGlmICh0ZW1wICYmICgoVU5ET19MSVNUICopKHRlbXAtPmRhdGEpICE9IHJsX3VuZG9fbGlzdCkpCi0gICAgewotICAgICAgdGVtcCA9IHJlcGxhY2VfaGlzdG9yeV9lbnRyeSAod2hlcmVfaGlzdG9yeSAoKSwgdGhlX2xpbmUsIChoaXN0ZGF0YV90KXJsX3VuZG9fbGlzdCk7Ci0gICAgICBmcmVlICh0ZW1wLT5saW5lKTsKLSAgICAgIGZyZWUgKHRlbXApOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFB1dCBiYWNrIHRoZSBzYXZlZF9saW5lX2Zvcl9oaXN0b3J5IGlmIHRoZXJlIGlzIG9uZS4gKi8KLWludAotbWF5YmVfdW5zYXZlX2xpbmUgKCkKLXsKLSAgaW50IGxpbmVfbGVuOwotCi0gIGlmIChzYXZlZF9saW5lX2Zvcl9oaXN0b3J5KQotICAgIHsKLSAgICAgIGxpbmVfbGVuID0gc3RybGVuIChzYXZlZF9saW5lX2Zvcl9oaXN0b3J5LT5saW5lKTsKLQotICAgICAgaWYgKGxpbmVfbGVuID49IHJsX2xpbmVfYnVmZmVyX2xlbikKLQlybF9leHRlbmRfbGluZV9idWZmZXIgKGxpbmVfbGVuKTsKLQotICAgICAgc3RyY3B5ICh0aGVfbGluZSwgc2F2ZWRfbGluZV9mb3JfaGlzdG9yeS0+bGluZSk7Ci0gICAgICBybF91bmRvX2xpc3QgPSAoVU5ET19MSVNUICopc2F2ZWRfbGluZV9mb3JfaGlzdG9yeS0+ZGF0YTsKLSAgICAgIF9ybF9mcmVlX2hpc3RvcnlfZW50cnkgKHNhdmVkX2xpbmVfZm9yX2hpc3RvcnkpOwotICAgICAgc2F2ZWRfbGluZV9mb3JfaGlzdG9yeSA9IChISVNUX0VOVFJZICopTlVMTDsKLSAgICAgIHJsX2VuZCA9IHJsX3BvaW50ID0gc3RybGVuICh0aGVfbGluZSk7Ci0gICAgfQotICBlbHNlCi0gICAgZGluZyAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNhdmUgdGhlIGN1cnJlbnQgbGluZSBpbiBzYXZlZF9saW5lX2Zvcl9oaXN0b3J5LiAqLwotaW50Ci1tYXliZV9zYXZlX2xpbmUgKCkKLXsKLSAgaWYgKHNhdmVkX2xpbmVfZm9yX2hpc3RvcnkgPT0gMCkKLSAgICB7Ci0gICAgICBzYXZlZF9saW5lX2Zvcl9oaXN0b3J5ID0gKEhJU1RfRU5UUlkgKil4bWFsbG9jIChzaXplb2YgKEhJU1RfRU5UUlkpKTsKLSAgICAgIHNhdmVkX2xpbmVfZm9yX2hpc3RvcnktPmxpbmUgPSBzYXZlc3RyaW5nICh0aGVfbGluZSk7Ci0gICAgICBzYXZlZF9saW5lX2Zvcl9oaXN0b3J5LT5kYXRhID0gKGNoYXIgKilybF91bmRvX2xpc3Q7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlIaXN0b3J5IENvbW1hbmRzCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIE1ldGEtPCBnb2VzIHRvIHRoZSBzdGFydCBvZiB0aGUgaGlzdG9yeS4gKi8KLWludAotcmxfYmVnaW5uaW5nX29mX2hpc3RvcnkgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICByZXR1cm4gKHJsX2dldF9wcmV2aW91c19oaXN0b3J5ICgxICsgd2hlcmVfaGlzdG9yeSAoKSwga2V5KSk7Ci19Ci0KLS8qIE1ldGEtPiBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkuICAoVGhlIGN1cnJlbnQgbGluZSkuICovCi1pbnQKLXJsX2VuZF9vZl9oaXN0b3J5IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgbWF5YmVfcmVwbGFjZV9saW5lICgpOwotICB1c2luZ19oaXN0b3J5ICgpOwotICBtYXliZV91bnNhdmVfbGluZSAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1vdmUgZG93biB0byB0aGUgbmV4dCBoaXN0b3J5IGxpbmUuICovCi1pbnQKLXJsX2dldF9uZXh0X2hpc3RvcnkgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBISVNUX0VOVFJZICp0ZW1wOwotICBpbnQgbGluZV9sZW47Ci0KLSAgaWYgKGNvdW50IDwgMCkKLSAgICByZXR1cm4gKHJsX2dldF9wcmV2aW91c19oaXN0b3J5ICgtY291bnQsIGtleSkpOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIG1heWJlX3JlcGxhY2VfbGluZSAoKTsKLQotICB0ZW1wID0gKEhJU1RfRU5UUlkgKilOVUxMOwotICB3aGlsZSAoY291bnQpCi0gICAgewotICAgICAgdGVtcCA9IG5leHRfaGlzdG9yeSAoKTsKLSAgICAgIGlmICghdGVtcCkKLQlicmVhazsKLSAgICAgIC0tY291bnQ7Ci0gICAgfQotCi0gIGlmICh0ZW1wID09IDApCi0gICAgbWF5YmVfdW5zYXZlX2xpbmUgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5lX2xlbiA9IHN0cmxlbiAodGVtcC0+bGluZSk7Ci0KLSAgICAgIGlmIChsaW5lX2xlbiA+PSBybF9saW5lX2J1ZmZlcl9sZW4pCi0JcmxfZXh0ZW5kX2xpbmVfYnVmZmVyIChsaW5lX2xlbik7Ci0KLSAgICAgIHN0cmNweSAodGhlX2xpbmUsIHRlbXAtPmxpbmUpOwotICAgICAgcmxfdW5kb19saXN0ID0gKFVORE9fTElTVCAqKXRlbXAtPmRhdGE7Ci0gICAgICBybF9lbmQgPSBybF9wb2ludCA9IHN0cmxlbiAodGhlX2xpbmUpOwotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gICAgICBpZiAocmxfZWRpdGluZ19tb2RlID09IHZpX21vZGUpCi0JcmxfcG9pbnQgPSAwOwotI2VuZGlmIC8qIFZJX01PREUgKi8KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBHZXQgdGhlIHByZXZpb3VzIGl0ZW0gb3V0IG9mIG91ciBpbnRlcmFjdGl2ZSBoaXN0b3J5LCBtYWtpbmcgaXQgdGhlIGN1cnJlbnQKLSAgIGxpbmUuICBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBoaXN0b3J5LCBqdXN0IGRpbmcuICovCi1pbnQKLXJsX2dldF9wcmV2aW91c19oaXN0b3J5IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgSElTVF9FTlRSWSAqb2xkX3RlbXAsICp0ZW1wOwotICBpbnQgbGluZV9sZW47Ci0KLSAgaWYgKGNvdW50IDwgMCkKLSAgICByZXR1cm4gKHJsX2dldF9uZXh0X2hpc3RvcnkgKC1jb3VudCwga2V5KSk7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGxpbmUgc2F2ZWQsIHRoZW4gc2F2ZSB0aGlzIG9uZS4gKi8KLSAgbWF5YmVfc2F2ZV9saW5lICgpOwotCi0gIC8qIElmIHRoZSBjdXJyZW50IGxpbmUgaGFzIGNoYW5nZWQsIHNhdmUgdGhlIGNoYW5nZXMuICovCi0gIG1heWJlX3JlcGxhY2VfbGluZSAoKTsKLQotICB0ZW1wID0gb2xkX3RlbXAgPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0gIHdoaWxlIChjb3VudCkKLSAgICB7Ci0gICAgICB0ZW1wID0gcHJldmlvdXNfaGlzdG9yeSAoKTsKLSAgICAgIGlmICh0ZW1wID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIG9sZF90ZW1wID0gdGVtcDsKLSAgICAgIC0tY291bnQ7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIHdhcyBhIGxhcmdlIGFyZ3VtZW50LCBhbmQgd2UgbW92ZWQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIGhpc3RvcnksIHRoYXQgaXMgbm90IGFuIGVycm9yLiAgU28gdXNlIHRoZSBsYXN0IHZhbHVlIGZvdW5kLiAqLwotICBpZiAoIXRlbXAgJiYgb2xkX3RlbXApCi0gICAgdGVtcCA9IG9sZF90ZW1wOwotCi0gIGlmICh0ZW1wID09IDApCi0gICAgZGluZyAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxpbmVfbGVuID0gc3RybGVuICh0ZW1wLT5saW5lKTsKLQotICAgICAgaWYgKGxpbmVfbGVuID49IHJsX2xpbmVfYnVmZmVyX2xlbikKLQlybF9leHRlbmRfbGluZV9idWZmZXIgKGxpbmVfbGVuKTsKLQotICAgICAgc3RyY3B5ICh0aGVfbGluZSwgdGVtcC0+bGluZSk7Ci0gICAgICBybF91bmRvX2xpc3QgPSAoVU5ET19MSVNUICopdGVtcC0+ZGF0YTsKLSAgICAgIHJsX2VuZCA9IHJsX3BvaW50ID0gbGluZV9sZW47Ci0KLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotICAgICAgaWYgKHJsX2VkaXRpbmdfbW9kZSA9PSB2aV9tb2RlKQotCXJsX3BvaW50ID0gMDsKLSNlbmRpZiAvKiBWSV9NT0RFICovCi0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCSAgIFRoZSBNYXJrIGFuZCB0aGUgUmVnaW9uLgkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBTZXQgdGhlIG1hcmsgYXQgUE9TSVRJT04uICovCi1pbnQKLV9ybF9zZXRfbWFya19hdF9wb3MgKHBvc2l0aW9uKQotICAgICBpbnQgcG9zaXRpb247Ci17Ci0gIGlmIChwb3NpdGlvbiA+IHJsX2VuZCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmxfbWFyayA9IHBvc2l0aW9uOwotICByZXR1cm4gMDsKLX0KLQotLyogQSBiaW5kYWJsZSBjb21tYW5kIHRvIHNldCB0aGUgbWFyay4gKi8KLWludAotcmxfc2V0X21hcmsgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICByZXR1cm4gKF9ybF9zZXRfbWFya19hdF9wb3MgKHJsX2V4cGxpY2l0X2FyZyA/IGNvdW50IDogcmxfcG9pbnQpKTsKLX0KLQotLyogRXhjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIG1hcmsgYW5kIHBvaW50LiAqLwotaW50Ci1ybF9leGNoYW5nZV9wb2ludF9hbmRfbWFyayAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChybF9tYXJrID4gcmxfZW5kKQotICAgIHJsX21hcmsgPSAtMTsKLQotICBpZiAocmxfbWFyayA9PSAtMSkKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIFNXQVAgKHJsX3BvaW50LCBybF9tYXJrKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQkgICAgRWRpdGluZyBNb2RlcwkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogSG93IHRvIHRvZ2dsZSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGVkaXRpbmcgbW9kZXMuICovCi1pbnQKLXJsX3ZpX2VkaXRpbmdfbW9kZSAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSAgcmxfZWRpdGluZ19tb2RlID0gdmlfbW9kZTsKLSAgcmxfdmlfaW5zZXJ0aW9uX21vZGUgKDEsIGtleSk7Ci0jZW5kaWYgLyogVklfTU9ERSAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ybF9lbWFjc19lZGl0aW5nX21vZGUgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBybF9lZGl0aW5nX21vZGUgPSBlbWFjc19tb2RlOwotICBfcmxfa2V5bWFwID0gZW1hY3Nfc3RhbmRhcmRfa2V5bWFwOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3JlYWRsaW5lLmggYi9yZWFkbGluZS9yZWFkbGluZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExYTBmLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3JlYWRsaW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyogUmVhZGxpbmUuaCAtLSB0aGUgbmFtZXMgb2YgZnVuY3Rpb25zIGNhbGxhYmxlIGZyb20gd2l0aGluIHJlYWRsaW5lLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWYgIWRlZmluZWQgKF9SRUFETElORV9IXykKLSNkZWZpbmUgX1JFQURMSU5FX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFJFQURMSU5FX0xJQlJBUlkpCi0jICBpbmNsdWRlICJybHN0ZGMuaCIKLSMgIGluY2x1ZGUgImtleW1hcHMuaCIKLSMgIGluY2x1ZGUgInRpbGRlLmgiCi0jZWxzZQotIyAgaW5jbHVkZSA8cmVhZGxpbmUvcmxzdGRjLmg+Ci0jICBpbmNsdWRlIDxyZWFkbGluZS9rZXltYXBzLmg+Ci0jICBpbmNsdWRlIDxyZWFkbGluZS90aWxkZS5oPgotI2VuZGlmCi0KLS8qIFJlYWRsaW5lIGRhdGEgc3RydWN0dXJlcy4gKi8KLQotLyogTWFpbnRhaW5pbmcgdGhlIHN0YXRlIG9mIHVuZG8uICBXZSByZW1lbWJlciBpbmRpdmlkdWFsIGRlbGV0ZXMgYW5kIGluc2VydHMKLSAgIG9uIGEgY2hhaW4gb2YgdGhpbmdzIHRvIGRvLiAqLwotCi0vKiBUaGUgYWN0aW9ucyB0aGF0IHVuZG8ga25vd3MgaG93IHRvIHVuZG8uICBOb3RpY2UgdGhhdCBVTkRPX0RFTEVURSBtZWFucwotICAgdG8gaW5zZXJ0IHNvbWUgdGV4dCwgYW5kIFVORE9fSU5TRVJUIG1lYW5zIHRvIGRlbGV0ZSBzb21lIHRleHQuICAgSS5lLiwKLSAgIHRoZSBjb2RlIHRlbGxzIHVuZG8gd2hhdCB0byB1bmRvLCBub3QgaG93IHRvIHVuZG8gaXQuICovCi1lbnVtIHVuZG9fY29kZSB7IFVORE9fREVMRVRFLCBVTkRPX0lOU0VSVCwgVU5ET19CRUdJTiwgVU5ET19FTkQgfTsKLQotLyogV2hhdCBhbiBlbGVtZW50IG9mIFRIRV9VTkRPX0xJU1QgbG9va3MgbGlrZS4gKi8KLXR5cGVkZWYgc3RydWN0IHVuZG9fbGlzdCB7Ci0gIHN0cnVjdCB1bmRvX2xpc3QgKm5leHQ7Ci0gIGludCBzdGFydCwgZW5kOwkJLyogV2hlcmUgdGhlIGNoYW5nZSB0b29rIHBsYWNlLiAqLwotICBjaGFyICp0ZXh0OwkJCS8qIFRoZSB0ZXh0IHRvIGluc2VydCwgaWYgdW5kb2luZyBhIGRlbGV0ZS4gKi8KLSAgZW51bSB1bmRvX2NvZGUgd2hhdDsJCS8qIERlbGV0ZSwgSW5zZXJ0LCBCZWdpbiwgRW5kLiAqLwotfSBVTkRPX0xJU1Q7Ci0KLS8qIFRoZSBjdXJyZW50IHVuZG8gbGlzdCBmb3IgUkxfTElORV9CVUZGRVIuICovCi1leHRlcm4gVU5ET19MSVNUICpybF91bmRvX2xpc3Q7Ci0KLS8qIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgbWFwcGluZyB0ZXh0dWFsIG5hbWVzIHRvIGNvZGUgYWRkcmVzc2VzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2Z1bm1hcCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIEZ1bmN0aW9uICpmdW5jdGlvbjsKLX0gRlVOTUFQOwotCi1leHRlcm4gRlVOTUFQICoqZnVubWFwOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkgICAgIEZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gYmluZCB0byBrZXkgc2VxdWVuY2VzCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3IgbnVtZXJpYyBhcmd1bWVudHMuICovCi1leHRlcm4gaW50IHJsX2RpZ2l0X2FyZ3VtZW50IF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdW5pdmVyc2FsX2FyZ3VtZW50IF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUgY29tbWFuZHMgZm9yIG1vdmluZyB0aGUgY3Vyc29yLiAqLwotZXh0ZXJuIGludCBybF9mb3J3YXJkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfYmFja3dhcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9iZWdfb2ZfbGluZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2VuZF9vZl9saW5lIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfZm9yd2FyZF93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfYmFja3dhcmRfd29yZCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3JlZnJlc2hfbGluZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2NsZWFyX3NjcmVlbiBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2Fycm93X2tleXMgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3IgaW5zZXJ0aW5nIGFuZCBkZWxldGluZyB0ZXh0LiAqLwotZXh0ZXJuIGludCBybF9pbnNlcnQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9xdW90ZWRfaW5zZXJ0IF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdGFiX2luc2VydCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX25ld2xpbmUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9kb19sb3dlcmNhc2VfdmVyc2lvbiBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3J1Ym91dCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2RlbGV0ZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3J1Ym91dF9vcl9kZWxldGUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9kZWxldGVfaG9yaXpvbnRhbF9zcGFjZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2RlbGV0ZV9vcl9zaG93X2NvbXBsZXRpb25zIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfaW5zZXJ0X2NvbW1lbnQgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3IgY2hhbmdpbmcgY2FzZS4gKi8KLWV4dGVybiBpbnQgcmxfdXBjYXNlX3dvcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9kb3duY2FzZV93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfY2FwaXRhbGl6ZV93b3JkIF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUgY29tbWFuZHMgZm9yIHRyYW5zcG9zaW5nIGNoYXJhY3RlcnMgYW5kIHdvcmRzLiAqLwotZXh0ZXJuIGludCBybF90cmFuc3Bvc2Vfd29yZHMgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF90cmFuc3Bvc2VfY2hhcnMgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3Igc2VhcmNoaW5nIHdpdGhpbiBhIGxpbmUuICovCi1leHRlcm4gaW50IHJsX2NoYXJfc2VhcmNoIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfYmFja3dhcmRfY2hhcl9zZWFyY2ggX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3IgcmVhZGxpbmUncyBpbnRlcmZhY2UgdG8gdGhlIGNvbW1hbmQgaGlzdG9yeS4gKi8KLWV4dGVybiBpbnQgcmxfYmVnaW5uaW5nX29mX2hpc3RvcnkgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9lbmRfb2ZfaGlzdG9yeSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2dldF9uZXh0X2hpc3RvcnkgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSBfX1AoKGludCwgaW50KSk7Ci0KLS8qIEJpbmRhYmxlIGNvbW1hbmRzIGZvciBtYW5hZ2luZyB0aGUgbWFyayBhbmQgcmVnaW9uLiAqLwotZXh0ZXJuIGludCBybF9zZXRfbWFyayBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2V4Y2hhbmdlX3BvaW50X2FuZF9tYXJrIF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUgY29tbWFuZHMgdG8gc2V0IHRoZSBlZGl0aW5nIG1vZGUgKGVtYWNzIG9yIHZpKS4gKi8KLWV4dGVybiBpbnQgcmxfdmlfZWRpdGluZ19tb2RlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfZW1hY3NfZWRpdGluZ19tb2RlIF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUgY29tbWFuZHMgZm9yIG1hbmFnaW5nIGtleSBiaW5kaW5ncy4gKi8KLWV4dGVybiBpbnQgcmxfcmVfcmVhZF9pbml0X2ZpbGUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9kdW1wX2Z1bmN0aW9ucyBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2R1bXBfbWFjcm9zIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfZHVtcF92YXJpYWJsZXMgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3Igd29yZCBjb21wbGV0aW9uLiAqLwotZXh0ZXJuIGludCBybF9jb21wbGV0ZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3Bvc3NpYmxlX2NvbXBsZXRpb25zIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfaW5zZXJ0X2NvbXBsZXRpb25zIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfbWVudV9jb21wbGV0ZSBfX1AoKGludCwgaW50KSk7Ci0KLS8qIEJpbmRhYmxlIGNvbW1hbmRzIGZvciBraWxsaW5nIGFuZCB5YW5raW5nIHRleHQsIGFuZCBtYW5hZ2luZyB0aGUga2lsbCByaW5nLiAqLwotZXh0ZXJuIGludCBybF9raWxsX3dvcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9iYWNrd2FyZF9raWxsX3dvcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9raWxsX2xpbmUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9iYWNrd2FyZF9raWxsX2xpbmUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9raWxsX2Z1bGxfbGluZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3VuaXhfd29yZF9ydWJvdXQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF91bml4X2xpbmVfZGlzY2FyZCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2NvcHlfcmVnaW9uX3RvX2tpbGwgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9raWxsX3JlZ2lvbiBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2NvcHlfZm9yd2FyZF93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfY29weV9iYWNrd2FyZF93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfeWFuayBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3lhbmtfcG9wIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfeWFua19udGhfYXJnIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfeWFua19sYXN0X2FyZyBfX1AoKGludCwgaW50KSk7Ci0vKiBOb3QgYXZhaWxhYmxlIHVubGVzcyBfX0NZR1dJTjMyX18gaXMgZGVmaW5lZC4gKi8KLSNpZmRlZiBfX0NZR1dJTjMyX18KLWV4dGVybiBpbnQgcmxfcGFzdGVfZnJvbV9jbGlwYm9hcmQgX19QKChpbnQsIGludCkpOwotI2VuZGlmCi0KLS8qIEJpbmRhYmxlIGNvbW1hbmRzIGZvciBpbmNyZW1lbnRhbCBzZWFyY2hpbmcuICovCi1leHRlcm4gaW50IHJsX3JldmVyc2Vfc2VhcmNoX2hpc3RvcnkgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9mb3J3YXJkX3NlYXJjaF9oaXN0b3J5IF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUga2V5Ym9hcmQgbWFjcm8gY29tbWFuZHMuICovCi1leHRlcm4gaW50IHJsX3N0YXJ0X2tiZF9tYWNybyBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2VuZF9rYmRfbWFjcm8gX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9jYWxsX2xhc3Rfa2JkX21hY3JvIF9fUCgoaW50LCBpbnQpKTsKLQotLyogQmluZGFibGUgdW5kbyBjb21tYW5kcy4gKi8KLWV4dGVybiBpbnQgcmxfcmV2ZXJ0X2xpbmUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF91bmRvX2NvbW1hbmQgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSB0aWxkZSBleHBhbnNpb24gY29tbWFuZHMuICovCi1leHRlcm4gaW50IHJsX3RpbGRlX2V4cGFuZCBfX1AoKGludCwgaW50KSk7Ci0KLS8qIEJpbmRhYmxlIHRlcm1pbmFsIGNvbnRyb2wgY29tbWFuZHMuICovCi1leHRlcm4gaW50IHJsX3Jlc3RhcnRfb3V0cHV0IF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfc3RvcF9vdXRwdXQgX19QKChpbnQsIGludCkpOwotCi0vKiBNaXNjZWxsYW5lb3VzIGJpbmRhYmxlIGNvbW1hbmRzLiAqLwotZXh0ZXJuIGludCBybF9hYm9ydCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3R0eV9zdGF0dXMgX19QKChpbnQsIGludCkpOwotCi0vKiBCaW5kYWJsZSBjb21tYW5kcyBmb3IgaW5jcmVtZW50YWwgYW5kIG5vbi1pbmNyZW1lbnRhbCBoaXN0b3J5IHNlYXJjaGluZy4gKi8KLWV4dGVybiBpbnQgcmxfaGlzdG9yeV9zZWFyY2hfZm9yd2FyZCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2hpc3Rvcnlfc2VhcmNoX2JhY2t3YXJkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfbm9uaW5jX2ZvcndhcmRfc2VhcmNoIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfbm9uaW5jX3JldmVyc2Vfc2VhcmNoIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfbm9uaW5jX2ZvcndhcmRfc2VhcmNoX2FnYWluIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfbm9uaW5jX3JldmVyc2Vfc2VhcmNoX2FnYWluIF9fUCgoaW50LCBpbnQpKTsKLQotLyogTm90IGF2YWlsYWJsZSB1bmxlc3MgcmVhZGxpbmUgaXMgY29tcGlsZWQgLURQQVJFTl9NQVRDSElORy4gKi8KLWV4dGVybiBpbnQgcmxfaW5zZXJ0X2Nsb3NlIF9fUCgoaW50LCBpbnQpKTsKLQotLyogTm90IGF2YWlsYWJsZSB1bmxlc3MgUkVBRExJTkVfQ0FMTEJBQ0tTIGlzIGRlZmluZWQuICovCi1leHRlcm4gdm9pZCBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgX19QKChjaGFyICosIFZGdW5jdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBybF9jYWxsYmFja19yZWFkX2NoYXIgX19QKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBybF9jYWxsYmFja19oYW5kbGVyX3JlbW92ZSBfX1AoKHZvaWQpKTsKLQotLyogVGhpbmdzIGZvciB2aSBtb2RlLiBOb3QgYXZhaWxhYmxlIHVubGVzcyByZWFkbGluZSBpcyBjb21waWxlZCAtRFZJX01PREUuICovCi0vKiBWSS1tb2RlIGJpbmRhYmxlIGNvbW1hbmRzLiAqLwotZXh0ZXJuIGludCBybF92aV9yZWRvIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfdW5kbyBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX3lhbmtfYXJnIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZmV0Y2hfaGlzdG9yeSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX3NlYXJjaF9hZ2FpbiBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX3NlYXJjaCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX2NvbXBsZXRlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfdGlsZGVfZXhwYW5kIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfcHJldl93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfbmV4dF93b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZW5kX3dvcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9pbnNlcnRfYmVnIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfYXBwZW5kX21vZGUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9hcHBlbmRfZW9sIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZW9mX21heWJlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfaW5zZXJ0aW9uX21vZGUgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9tb3ZlbWVudF9tb2RlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfYXJnX2RpZ2l0IF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfY2hhbmdlX2Nhc2UgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9wdXQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9jb2x1bW4gX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9kZWxldGVfdG8gX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9jaGFuZ2VfdG8gX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV95YW5rX3RvIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZGVsZXRlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfYmFja190b19pbmRlbnQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9maXJzdF9wcmludCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX2NoYXJfc2VhcmNoIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfbWF0Y2ggX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9jaGFuZ2VfY2hhciBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX3N1YnN0IF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfb3ZlcnN0cmlrZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX292ZXJzdHJpa2VfZGVsZXRlIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfcmVwbGFjZSBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX3NldF9tYXJrIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZ290b19tYXJrIF9fUCgoaW50LCBpbnQpKTsKLQotLyogVkktbW9kZSB1dGlsaXR5IGZ1bmN0aW9ucy4gKi8KLWV4dGVybiBpbnQgcmxfdmlfY2hlY2sgX19QKCh2b2lkKSk7Ci1leHRlcm4gaW50IHJsX3ZpX2RvbW92ZSBfX1AoKGludCwgaW50ICopKTsKLWV4dGVybiBpbnQgcmxfdmlfYnJhY2t0eXBlIF9fUCgoaW50KSk7Ci0KLS8qIFZJLW1vZGUgcHNldWRvLWJpbmRhYmxlIGNvbW1hbmRzLCB1c2VkIGFzIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwotZXh0ZXJuIGludCBybF92aV9mV29yZCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX2JXb3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZVdvcmQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF92aV9md29yZCBfX1AoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHJsX3ZpX2J3b3JkIF9fUCgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcmxfdmlfZXdvcmQgX19QKChpbnQsIGludCkpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCVdlbGwgUHVibGlzaGVkIEZ1bmN0aW9ucwkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFJlYWRsaW5lIGZ1bmN0aW9ucy4gKi8KLS8qIFJlYWQgYSBsaW5lIG9mIGlucHV0LiAgUHJvbXB0IHdpdGggUFJPTVBULiAgQSBOVUxMIFBST01QVCBtZWFucyBub25lLiAqLwotZXh0ZXJuIGNoYXIgKnJlYWRsaW5lIF9fUCgoY2hhciAqKSk7Ci0KLWV4dGVybiBpbnQgcmxfaW5pdGlhbGl6ZSBfX1AoKHZvaWQpKTsKLQotZXh0ZXJuIGludCBybF9kaXNjYXJkX2FyZ3VtZW50IF9fUCgodm9pZCkpOwotCi0vKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBiaW5kIGtleXMgdG8gcmVhZGxpbmUgY29tbWFuZHMuICovCi1leHRlcm4gaW50IHJsX2FkZF9kZWZ1biBfX1AoKGNoYXIgKiwgRnVuY3Rpb24gKiwgaW50KSk7Ci1leHRlcm4gaW50IHJsX2JpbmRfa2V5IF9fUCgoaW50LCBGdW5jdGlvbiAqKSk7Ci1leHRlcm4gaW50IHJsX2JpbmRfa2V5X2luX21hcCBfX1AoKGludCwgRnVuY3Rpb24gKiwgS2V5bWFwKSk7Ci1leHRlcm4gaW50IHJsX3VuYmluZF9rZXkgX19QKChpbnQpKTsKLWV4dGVybiBpbnQgcmxfdW5iaW5kX2tleV9pbl9tYXAgX19QKChpbnQsIEtleW1hcCkpOwotZXh0ZXJuIGludCBybF91bmJpbmRfZnVuY3Rpb25faW5fbWFwIF9fUCgoRnVuY3Rpb24gKiwgS2V5bWFwKSk7Ci1leHRlcm4gaW50IHJsX3VuYmluZF9jb21tYW5kX2luX21hcCBfX1AoKGNoYXIgKiwgS2V5bWFwKSk7Ci1leHRlcm4gaW50IHJsX3NldF9rZXkgX19QKChjaGFyICosIEZ1bmN0aW9uICosIEtleW1hcCkpOwotZXh0ZXJuIGludCBybF9nZW5lcmljX2JpbmQgX19QKChpbnQsIGNoYXIgKiwgY2hhciAqLCBLZXltYXApKTsKLWV4dGVybiBpbnQgcmxfdmFyaWFibGVfYmluZCBfX1AoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB1c2UgcmxfZ2VuZXJpY19iaW5kIGluc3RlYWQuICovCi1leHRlcm4gaW50IHJsX21hY3JvX2JpbmQgX19QKChjaGFyICosIGNoYXIgKiwgS2V5bWFwKSk7Ci0KLS8qIFVuZG9jdW1lbnRlZCBpbiB0aGUgdGV4aW5mbyBtYW51YWw7IG5vdCByZWFsbHkgdXNlZnVsIHRvIHByb2dyYW1zLiAqLwotZXh0ZXJuIGludCBybF90cmFuc2xhdGVfa2V5c2VxIF9fUCgoY2hhciAqLCBjaGFyICosIGludCAqKSk7Ci1leHRlcm4gY2hhciAqcmxfdW50cmFuc2xhdGVfa2V5c2VxIF9fUCgoaW50KSk7Ci0KLWV4dGVybiBGdW5jdGlvbiAqcmxfbmFtZWRfZnVuY3Rpb24gX19QKChjaGFyICopKTsKLWV4dGVybiBGdW5jdGlvbiAqcmxfZnVuY3Rpb25fb2Zfa2V5c2VxIF9fUCgoY2hhciAqLCBLZXltYXAsIGludCAqKSk7Ci0KLWV4dGVybiB2b2lkIHJsX2xpc3RfZnVubWFwX25hbWVzIF9fUCgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKipybF9pbnZva2luZ19rZXlzZXFzX2luX21hcCBfX1AoKEZ1bmN0aW9uICosIEtleW1hcCkpOwotZXh0ZXJuIGNoYXIgKipybF9pbnZva2luZ19rZXlzZXFzIF9fUCgoRnVuY3Rpb24gKikpOwotIAotZXh0ZXJuIHZvaWQgcmxfZnVuY3Rpb25fZHVtcGVyIF9fUCgoaW50KSk7Ci1leHRlcm4gdm9pZCBybF9tYWNyb19kdW1wZXIgX19QKChpbnQpKTsKLWV4dGVybiB2b2lkIHJsX3ZhcmlhYmxlX2R1bXBlciBfX1AoKGludCkpOwotCi1leHRlcm4gaW50IHJsX3JlYWRfaW5pdF9maWxlIF9fUCgoY2hhciAqKSk7Ci1leHRlcm4gaW50IHJsX3BhcnNlX2FuZF9iaW5kIF9fUCgoY2hhciAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGtleW1hcHMuICovCi1leHRlcm4gS2V5bWFwIHJsX21ha2VfYmFyZV9rZXltYXAgX19QKCh2b2lkKSk7Ci1leHRlcm4gS2V5bWFwIHJsX2NvcHlfa2V5bWFwIF9fUCgoS2V5bWFwKSk7Ci1leHRlcm4gS2V5bWFwIHJsX21ha2Vfa2V5bWFwIF9fUCgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmxfZGlzY2FyZF9rZXltYXAgX19QKChLZXltYXApKTsKLQotZXh0ZXJuIEtleW1hcCBybF9nZXRfa2V5bWFwX2J5X25hbWUgX19QKChjaGFyICopKTsKLWV4dGVybiBjaGFyICpybF9nZXRfa2V5bWFwX25hbWUgX19QKChLZXltYXApKTsKLWV4dGVybiB2b2lkIHJsX3NldF9rZXltYXAgX19QKChLZXltYXApKTsKLWV4dGVybiBLZXltYXAgcmxfZ2V0X2tleW1hcCBfX1AoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJsX3NldF9rZXltYXBfZnJvbV9lZGl0X21vZGUgX19QKCh2b2lkKSk7Ci1leHRlcm4gY2hhciAqcmxfZ2V0X2tleW1hcF9uYW1lX2Zyb21fZWRpdF9tb2RlIF9fUCgodm9pZCkpOwotCi0vKiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgZnVubWFwLCB3aGljaCBtYXBzIGNvbW1hbmQgbmFtZXMgdG8gZnVuY3Rpb25zLiAqLwotZXh0ZXJuIGludCBybF9hZGRfZnVubWFwX2VudHJ5IF9fUCgoY2hhciAqLCBGdW5jdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBybF9pbml0aWFsaXplX2Z1bm1hcCBfX1AoKHZvaWQpKTsKLWV4dGVybiBjaGFyICoqcmxfZnVubWFwX25hbWVzIF9fUCgodm9pZCkpOwotCi0vKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcga2V5Ym9hcmQgbWFjcm9zLiAqLwotZXh0ZXJuIHZvaWQgcmxfcHVzaF9tYWNyb19pbnB1dCBfX1AoKGNoYXIgKikpOwotCi0vKiBGdW5jdGlvbnMgZm9yIHVuZG9pbmcsIGZyb20gdW5kby5jICovCi1leHRlcm4gdm9pZCBybF9hZGRfdW5kbyBfX1AoKGVudW0gdW5kb19jb2RlLCBpbnQsIGludCwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBmcmVlX3VuZG9fbGlzdCBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgcmxfZG9fdW5kbyBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgcmxfYmVnaW5fdW5kb19ncm91cCBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgcmxfZW5kX3VuZG9fZ3JvdXAgX19QKCh2b2lkKSk7Ci1leHRlcm4gaW50IHJsX21vZGlmeWluZyBfX1AoKGludCwgaW50KSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgcmVkaXNwbGF5LiAqLwotZXh0ZXJuIHZvaWQgcmxfcmVkaXNwbGF5IF9fUCgodm9pZCkpOwotZXh0ZXJuIGludCBybF9vbl9uZXdfbGluZSBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgcmxfZm9yY2VkX3VwZGF0ZV9kaXNwbGF5IF9fUCgodm9pZCkpOwotZXh0ZXJuIGludCBybF9jbGVhcl9tZXNzYWdlIF9fUCgodm9pZCkpOwotZXh0ZXJuIGludCBybF9yZXNldF9saW5lX3N0YXRlIF9fUCgodm9pZCkpOwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKFVTRV9WQVJBUkdTKSAmJiBkZWZpbmVkIChQUkVGRVJfU1REQVJHKQotZXh0ZXJuIGludCBybF9tZXNzYWdlIChjb25zdCBjaGFyICosIC4uLik7Ci0jZWxzZQotZXh0ZXJuIGludCBybF9tZXNzYWdlICgpOwotI2VuZGlmCi0KLS8qIFVuZG9jdW1lbnRlZCBpbiB0ZXhpbmZvIG1hbnVhbC4gKi8KLWV4dGVybiBpbnQgcmxfc2hvd19jaGFyIF9fUCgoaW50KSk7Ci1leHRlcm4gaW50IHJsX2NoYXJhY3Rlcl9sZW4gX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBjcmxmIF9fUCgodm9pZCkpOwotCi0vKiBTYXZlIGFuZCByZXN0b3JlIGludGVybmFsIHByb21wdCByZWRpc3BsYXkgaW5mb3JtYXRpb24uICovCi1leHRlcm4gdm9pZCBybF9zYXZlX3Byb21wdCBfX1AoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJsX3Jlc3RvcmVfcHJvbXB0IF9fUCgodm9pZCkpOwotCi0vKiBNb2RpZnlpbmcgdGV4dC4gKi8KLWV4dGVybiBpbnQgcmxfaW5zZXJ0X3RleHQgX19QKChjaGFyICopKTsKLWV4dGVybiBpbnQgcmxfZGVsZXRlX3RleHQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBybF9raWxsX3RleHQgX19QKChpbnQsIGludCkpOwotZXh0ZXJuIGNoYXIgKnJsX2NvcHlfdGV4dCBfX1AoKGludCwgaW50KSk7Ci0KLS8qIFRlcm1pbmFsIGFuZCB0dHkgbW9kZSBtYW5hZ2VtZW50LiAqLwotZXh0ZXJuIHZvaWQgcmxfcHJlcF90ZXJtaW5hbCBfX1AoKGludCkpOwotZXh0ZXJuIHZvaWQgcmxfZGVwcmVwX3Rlcm1pbmFsIF9fUCgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MgX19QKChLZXltYXApKTsKLQotZXh0ZXJuIGludCBybF9yZXNldF90ZXJtaW5hbCBfX1AoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcmxfcmVzaXplX3Rlcm1pbmFsIF9fUCgodm9pZCkpOwotCi0vKiBgUHVibGljJyB1dGlsaXR5IGZ1bmN0aW9ucyAuICovCi1leHRlcm4gdm9pZCBybF9leHRlbmRfbGluZV9idWZmZXIgX19QKChpbnQpKTsKLWV4dGVybiBpbnQgZGluZyBfX1AoKHZvaWQpKTsKLQotLyogRnVuY3Rpb25zIGZvciBjaGFyYWN0ZXIgaW5wdXQuICovCi1leHRlcm4gaW50IHJsX3N0dWZmX2NoYXIgX19QKChpbnQpKTsKLWV4dGVybiBpbnQgcmxfZXhlY3V0ZV9uZXh0IF9fUCgoaW50KSk7Ci1leHRlcm4gaW50IHJsX3JlYWRfa2V5IF9fUCgodm9pZCkpOwotZXh0ZXJuIGludCBybF9nZXRjIF9fUCgoRklMRSAqKSk7Ci0KLS8qIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGluZywgZnJvbSBzaWduYWxzLmMgKi8KLWV4dGVybiBpbnQgcmxfc2V0X3NpZ25hbHMgX19QKCh2b2lkKSk7Ci1leHRlcm4gaW50IHJsX2NsZWFyX3NpZ25hbHMgX19QKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCBfX1AoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJsX3Jlc2V0X2FmdGVyX3NpZ25hbCBfX1AoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJsX2ZyZWVfbGluZV9zdGF0ZSBfX1AoKHZvaWQpKTsKLSAKLS8qIFVuZG9jdW1lbnRlZC4gKi8KLWV4dGVybiBpbnQgcmxfZXhwYW5kX3Byb21wdCBfX1AoKGNoYXIgKikpOwotCi1leHRlcm4gaW50IG1heWJlX3NhdmVfbGluZSBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgbWF5YmVfdW5zYXZlX2xpbmUgX19QKCh2b2lkKSk7Ci1leHRlcm4gaW50IG1heWJlX3JlcGxhY2VfbGluZSBfX1AoKHZvaWQpKTsKLQotLyogQ29tcGxldGlvbiBmdW5jdGlvbnMuICovCi1leHRlcm4gaW50IHJsX2NvbXBsZXRlX2ludGVybmFsIF9fUCgoaW50KSk7Ci1leHRlcm4gdm9pZCBybF9kaXNwbGF5X21hdGNoX2xpc3QgX19QKChjaGFyICoqLCBpbnQsIGludCkpOwotCi1leHRlcm4gY2hhciAqKmNvbXBsZXRpb25fbWF0Y2hlcyBfX1AoKGNoYXIgKiwgQ1BGdW5jdGlvbiAqKSk7Ci1leHRlcm4gY2hhciAqdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiBfX1AoKGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gY2hhciAqZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiBfX1AoKGNoYXIgKiwgaW50KSk7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJV2VsbCBQdWJsaXNoZWQgVmFyaWFibGVzCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogVGhlIHZlcnNpb24gb2YgdGhpcyBpbmNhcm5hdGlvbiBvZiB0aGUgcmVhZGxpbmUgbGlicmFyeS4gKi8KLWV4dGVybiBjaGFyICpybF9saWJyYXJ5X3ZlcnNpb247Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIHByb2dyYW0uICBZb3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0bwotICAgd2hhdGV2ZXIgd2FzIGluIGFyZ3ZbMF0uICBJdCBpcyB1c2VkIHdoZW4gcGFyc2luZyBjb25kaXRpb25hbHMuICovCi1leHRlcm4gY2hhciAqcmxfcmVhZGxpbmVfbmFtZTsKLQotLyogVGhlIHByb21wdCByZWFkbGluZSB1c2VzLiAgVGhpcyBpcyBzZXQgZnJvbSB0aGUgYXJndW1lbnQgdG8KLSAgIHJlYWRsaW5lICgpLCBhbmQgc2hvdWxkIG5vdCBiZSBhc3NpZ25lZCB0byBkaXJlY3RseS4gKi8KLWV4dGVybiBjaGFyICpybF9wcm9tcHQ7Ci0KLS8qIFRoZSBsaW5lIGJ1ZmZlciB0aGF0IGlzIGluIHVzZS4gKi8KLWV4dGVybiBjaGFyICpybF9saW5lX2J1ZmZlcjsKLQotLyogVGhlIGxvY2F0aW9uIG9mIHBvaW50LCBhbmQgZW5kLiAqLwotZXh0ZXJuIGludCBybF9wb2ludCwgcmxfZW5kOwotCi0vKiBUaGUgbWFyaywgb3Igc2F2ZWQgY3Vyc29yIHBvc2l0aW9uLiAqLwotZXh0ZXJuIGludCBybF9tYXJrOwotCi0vKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgcmVhZGxpbmUgaGFzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgaW5wdXQKLSAgIGxpbmUgYW5kIHNob3VsZCByZXR1cm4gaXQuICovCi1leHRlcm4gaW50IHJsX2RvbmU7Ci0KLS8qIElmIHNldCB0byBhIGNoYXJhY3RlciB2YWx1ZSwgdGhhdCB3aWxsIGJlIHRoZSBuZXh0IGtleXN0cm9rZSByZWFkLiAqLwotZXh0ZXJuIGludCBybF9wZW5kaW5nX2lucHV0OwotCi0vKiBOb24temVybyBpZiB3ZSBjYWxsZWQgdGhpcyBmdW5jdGlvbiBmcm9tIF9ybF9kaXNwYXRjaCgpLiAgSXQncyBwcmVzZW50Ci0gICBzbyBmdW5jdGlvbnMgY2FuIGZpbmQgb3V0IHdoZXRoZXIgdGhleSB3ZXJlIGNhbGxlZCBmcm9tIGEga2V5IGJpbmRpbmcKLSAgIG9yIGRpcmVjdGx5IGZyb20gYW4gYXBwbGljYXRpb24uICovCi1leHRlcm4gaW50IHJsX2Rpc3BhdGNoaW5nOwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgdGVybWluYWwgdG8gdXNlLiAqLwotZXh0ZXJuIGNoYXIgKnJsX3Rlcm1pbmFsX25hbWU7Ci0KLS8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuICovCi1leHRlcm4gRklMRSAqcmxfaW5zdHJlYW0sICpybF9vdXRzdHJlYW07Ci0KLS8qIElmIG5vbi16ZXJvLCB0aGVuIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGp1c3QKLSAgIGJlZm9yZSByZWFkbGluZV9pbnRlcm5hbCAoKSBwcmludHMgdGhlIGZpcnN0IHByb21wdC4gKi8KLWV4dGVybiBGdW5jdGlvbiAqcmxfc3RhcnR1cF9ob29rOwotCi0vKiBJZiBub24temVybywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwganVzdCBiZWZvcmUKLSAgIHJlYWRsaW5lX2ludGVybmFsX3NldHVwICgpIHJldHVybnMgYW5kIHJlYWRsaW5lX2ludGVybmFsIHN0YXJ0cwotICAgcmVhZGluZyBpbnB1dCBjaGFyYWN0ZXJzLiAqLwotZXh0ZXJuIEZ1bmN0aW9uICpybF9wcmVfaW5wdXRfaG9vazsKLSAgICAgIAotLyogVGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIHBlcmlvZGljYWxseSB3aGlsZSBSZWFkbGluZSBpcwotICAgYXdhaXRpbmcgY2hhcmFjdGVyIGlucHV0LCBvciBOVUxMLCBmb3Igbm8gZXZlbnQgaGFuZGxpbmcuICovCi1leHRlcm4gRnVuY3Rpb24gKnJsX2V2ZW50X2hvb2s7Ci0KLWV4dGVybiBGdW5jdGlvbiAqcmxfZ2V0Y19mdW5jdGlvbjsKLWV4dGVybiBWRnVuY3Rpb24gKnJsX3JlZGlzcGxheV9mdW5jdGlvbjsKLWV4dGVybiBWRnVuY3Rpb24gKnJsX3ByZXBfdGVybV9mdW5jdGlvbjsKLWV4dGVybiBWRnVuY3Rpb24gKnJsX2RlcHJlcF90ZXJtX2Z1bmN0aW9uOwotCi0vKiBEaXNwYXRjaCB2YXJpYWJsZXMuICovCi1leHRlcm4gS2V5bWFwIHJsX2V4ZWN1dGluZ19rZXltYXA7Ci1leHRlcm4gS2V5bWFwIHJsX2JpbmRpbmdfa2V5bWFwOwotCi0vKiBEaXNwbGF5IHZhcmlhYmxlcy4gKi8KLS8qIElmIG5vbi16ZXJvLCByZWFkbGluZSB3aWxsIGVyYXNlIHRoZSBlbnRpcmUgbGluZSwgaW5jbHVkaW5nIGFueSBwcm9tcHQsCi0gICBpZiB0aGUgb25seSB0aGluZyB0eXBlZCBvbiBhbiBvdGhlcndpc2UtYmxhbmsgbGluZSBpcyBzb21ldGhpbmcgYm91bmQgdG8KLSAgIHJsX25ld2xpbmUuICovCi1leHRlcm4gaW50IHJsX2VyYXNlX2VtcHR5X2xpbmU7Ci0KLS8qIFZhcmlhYmxlcyB0byBjb250cm9sIHJlYWRsaW5lIHNpZ25hbCBoYW5kbGluZy4gKi8KLS8qIElmIG5vbi16ZXJvLCByZWFkbGluZSB3aWxsIGluc3RhbGwgaXRzIG93biBzaWduYWwgaGFuZGxlcnMgZm9yCi0gICBTSUdJTlQsIFNJR1RFUk0sIFNJR1FVSVQsIFNJR0FMUk0sIFNJR1RTVFAsIFNJR1RUSU4sIGFuZCBTSUdUVE9VLiAqLwotZXh0ZXJuIGludCBybF9jYXRjaF9zaWduYWxzOwotCi0vKiBJZiBub24temVybywgcmVhZGxpbmUgd2lsbCBpbnN0YWxsIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR1dJTkNICi0gICB0aGF0IGFsc28gYXR0ZW1wdHMgdG8gY2FsbCBhbnkgY2FsbGluZyBhcHBsaWNhdGlvbidzIFNJR1dJTkNIIHNpZ25hbAotICAgaGFuZGxlci4gIE5vdGUgdGhhdCB0aGUgdGVybWluYWwgaXMgbm90IGNsZWFuZWQgdXAgYmVmb3JlIHRoZQotICAgYXBwbGljYXRpb24ncyBzaWduYWwgaGFuZGxlciBpcyBjYWxsZWQ7IHVzZSBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCgpCi0gICB0byBkbyB0aGF0LiAqLwotZXh0ZXJuIGludCBybF9jYXRjaF9zaWd3aW5jaDsKLQotLyogQ29tcGxldGlvbiB2YXJpYWJsZXMuICovCi0vKiBQb2ludGVyIHRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbXBsZXRpb25fbWF0Y2hlcyAoKS4KLSAgIE5VTEwgbWVhbnMgdG8gdXNlIGZpbGVuYW1lX2VudHJ5X2Z1bmN0aW9uICgpLCB0aGUgZGVmYXVsdCBmaWxlbmFtZQotICAgY29tcGxldGVyLiAqLwotZXh0ZXJuIEZ1bmN0aW9uICpybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9uOwotCi0vKiBJZiBybF9pZ25vcmVfc29tZV9jb21wbGV0aW9uc19mdW5jdGlvbiBpcyBub24tTlVMTCBpdCBpcyB0aGUgYWRkcmVzcwotICAgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIGFsbCBvZiB0aGUgcG9zc2libGUgbWF0Y2hlcyBoYXZlIGJlZW4KLSAgIGdlbmVyYXRlZCwgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIGNvbXBsZXRpb24gaXMgZG9uZSB0byB0aGUgaW5wdXQgbGluZS4KLSAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQ7IGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5Ci0gICBvZiAoY2hhciAqKS4gIElmIHlvdXIgZnVuY3Rpb24gcmVtb3ZlcyBhbnkgb2YgdGhlIGVsZW1lbnRzLCB0aGV5Ci0gICBtdXN0IGJlIGZyZWUoKSdlZC4gKi8KLWV4dGVybiBGdW5jdGlvbiAqcmxfaWdub3JlX3NvbWVfY29tcGxldGlvbnNfZnVuY3Rpb247Ci0KLS8qIFBvaW50ZXIgdG8gYWx0ZXJuYXRpdmUgZnVuY3Rpb24gdG8gY3JlYXRlIG1hdGNoZXMuCi0gICBGdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBURVhULCBTVEFSVCwgYW5kIEVORC4KLSAgIFNUQVJUIGFuZCBFTkQgYXJlIGluZGljZXMgaW4gUkxfTElORV9CVUZGRVIgc2F5aW5nIHdoYXQgdGhlIGJvdW5kYXJpZXMKLSAgIG9mIFRFWFQgYXJlLgotICAgSWYgdGhpcyBmdW5jdGlvbiBleGlzdHMgYW5kIHJldHVybnMgTlVMTCB0aGVuIGNhbGwgdGhlIHZhbHVlIG9mCi0gICBybF9jb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9uIHRvIHRyeSB0byBtYXRjaCwgb3RoZXJ3aXNlIHVzZSB0aGUKLSAgIGFycmF5IG9mIHN0cmluZ3MgcmV0dXJuZWQuICovCi1leHRlcm4gQ1BQRnVuY3Rpb24gKnJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX2Z1bmN0aW9uOwotCi0vKiBUaGUgYmFzaWMgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgc2lnbmFsIGEgYnJlYWsgYmV0d2VlbiB3b3JkcyBmb3IgdGhlCi0gICBjb21wbGV0ZXIgcm91dGluZS4gIFRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoaXMgdmFyaWFibGUgaXMgd2hhdAotICAgYnJlYWtzIHdvcmRzIGluIHRoZSBzaGVsbCwgaS5lLiAiblwiXFwnYEAkPiIuICovCi1leHRlcm4gY2hhciAqcmxfYmFzaWNfd29yZF9icmVha19jaGFyYWN0ZXJzOwotCi0vKiBUaGUgbGlzdCBvZiBjaGFyYWN0ZXJzIHRoYXQgc2lnbmFsIGEgYnJlYWsgYmV0d2VlbiB3b3JkcyBmb3IKLSAgIHJsX2NvbXBsZXRlX2ludGVybmFsLiAgVGhlIGRlZmF1bHQgbGlzdCBpcyB0aGUgY29udGVudHMgb2YKLSAgIHJsX2Jhc2ljX3dvcmRfYnJlYWtfY2hhcmFjdGVycy4gICovCi1leHRlcm4gY2hhciAqcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKLQotLyogTGlzdCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHF1b3RlIGEgc3Vic3RyaW5nIG9mIHRoZSBsaW5lLgotICAgQ29tcGxldGlvbiBvY2N1cnMgb24gdGhlIGVudGlyZSBzdWJzdHJpbmcsIGFuZCB3aXRoaW4gdGhlIHN1YnN0cmluZyAgIAotICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBhbnkgb3RoZXIgY2hhcmFjdGVyLAotICAgdW5sZXNzIHRoZXkgYWxzbyBhcHBlYXIgd2l0aGluIHRoaXMgbGlzdC4gKi8KLWV4dGVybiBjaGFyICpybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVyczsKLQotLyogTGlzdCBvZiBxdW90ZSBjaGFyYWN0ZXJzIHdoaWNoIGNhdXNlIGEgd29yZCBicmVhay4gKi8KLWV4dGVybiBjaGFyICpybF9iYXNpY19xdW90ZV9jaGFyYWN0ZXJzOwotCi0vKiBMaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIHF1b3RlZCBpbiBmaWxlbmFtZXMgYnkgdGhlIGNvbXBsZXRlci4gKi8KLWV4dGVybiBjaGFyICpybF9maWxlbmFtZV9xdW90ZV9jaGFyYWN0ZXJzOwotCi0vKiBMaXN0IG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgd29yZCBicmVhayBjaGFyYWN0ZXJzLCBidXQgc2hvdWxkIGJlIGxlZnQKLSAgIGluIFRFWFQgd2hlbiBpdCBpcyBwYXNzZWQgdG8gdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24uICBUaGUgc2hlbGwgdXNlcwotICAgdGhpcyB0byBoZWxwIGRldGVybWluZSB3aGF0IGtpbmQgb2YgY29tcGxldGluZyB0byBkby4gKi8KLWV4dGVybiBjaGFyICpybF9zcGVjaWFsX3ByZWZpeGVzOwotCi0vKiBJZiBub24temVybywgdGhlbiB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuCi0gICBjb21wbGV0aW5nIG9uIGEgZGlyZWN0b3J5IG5hbWUuICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGgKLSAgIHRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nICh0aGUgY3VycmVudCBkaXJlY3RvcnkgbmFtZSkgYXMgYW4gYXJnLiAqLwotZXh0ZXJuIEZ1bmN0aW9uICpybF9kaXJlY3RvcnlfY29tcGxldGlvbl9ob29rOwotCi0vKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHJlYWRsaW5lLiAqLwotI2RlZmluZSBybF9zeW1ib2xpY19saW5rX2hvb2sgcmxfZGlyZWN0b3J5X2NvbXBsZXRpb25faG9vawotCi0vKiBJZiBub24temVybywgdGhlbiB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuCi0gICBjb21wbGV0aW5nIGEgd29yZCB3b3VsZCBub3JtYWxseSBkaXNwbGF5IHRoZSBsaXN0IG9mIHBvc3NpYmxlIG1hdGNoZXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIGFjdHVhbGx5IGRvaW5nIHRoZSBkaXNwbGF5LgotICAgSXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzOiAoY2hhciAqKm1hdGNoZXMsIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpCi0gICB3aGVyZSBNQVRDSEVTIGlzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2hlZCwgTlVNX01BVENIRVMgaXMgdGhlCi0gICBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGF0IGFycmF5LCBhbmQgTUFYX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotICAgbG9uZ2VzdCBzdHJpbmcgaW4gdGhhdCBhcnJheS4gKi8KLWV4dGVybiBWRnVuY3Rpb24gKnJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2s7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhlIG1hdGNoZXMgYXJlIHRvIGJlIHRyZWF0ZWQKLSAgIGFzIGZpbGVuYW1lcy4gIFRoaXMgaXMgQUxXQVlTIHplcm8gb24gZW50cnksIGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCi0gICB3aXRoaW4gYSBjb21wbGV0aW9uIGVudHJ5IGZpbmRlciBmdW5jdGlvbi4gKi8KLWV4dGVybiBpbnQgcmxfZmlsZW5hbWVfY29tcGxldGlvbl9kZXNpcmVkOwotCi0vKiBOb24temVybyBtZWFucyB0aGF0IHRoZSByZXN1bHRzIG9mIHRoZSBtYXRjaGVzIGFyZSB0byBiZSBxdW90ZWQgdXNpbmcKLSAgIGRvdWJsZSBxdW90ZXMgKG9yIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHF1b3RpbmcgbWVjaGFuaXNtKSBpZiB0aGUKLSAgIGZpbGVuYW1lIGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzIGluIHJsX3dvcmRfYnJlYWtfY2hhcnMuICBUaGlzIGlzCi0gICBBTFdBWVMgbm9uLXplcm8gb24gZW50cnksIGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkIHdpdGhpbiBhIGNvbXBsZXRpb24KLSAgIGVudHJ5IGZpbmRlciBmdW5jdGlvbi4gKi8KLWV4dGVybiBpbnQgcmxfZmlsZW5hbWVfcXVvdGluZ19kZXNpcmVkOwotCi0vKiBTZXQgdG8gYSBmdW5jdGlvbiB0byBxdW90ZSBhIGZpbGVuYW1lIGluIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhc2hpb24uCi0gICBDYWxsZWQgd2l0aCB0aGUgdGV4dCB0byBxdW90ZSwgdGhlIHR5cGUgb2YgbWF0Y2ggZm91bmQgKHNpbmdsZSBvciBtdWx0aXBsZSkKLSAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHF1b3RpbmcgY2hhcmFjdGVyIHRvIGJlIHVzZWQsIHdoaWNoIHRoZSBmdW5jdGlvbiBjYW4KLSAgIHJlc2V0IGlmIGRlc2lyZWQuICovCi1leHRlcm4gQ1BGdW5jdGlvbiAqcmxfZmlsZW5hbWVfcXVvdGluZ19mdW5jdGlvbjsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCB0byByZW1vdmUgcXVvdGluZyBjaGFyYWN0ZXJzIGZyb20gYSBmaWxlbmFtZS4gIENhbGxlZAotICAgYmVmb3JlIGNvbXBsZXRpb24gaXMgYXR0ZW1wdGVkLCBzbyB0aGUgZW1iZWRkZWQgcXVvdGVzIGRvIG5vdCBpbnRlcmZlcmUKLSAgIHdpdGggbWF0Y2hpbmcgbmFtZXMgaW4gdGhlIGZpbGUgc3lzdGVtLiAqLwotZXh0ZXJuIENQRnVuY3Rpb24gKnJsX2ZpbGVuYW1lX2RlcXVvdGluZ19mdW5jdGlvbjsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCB0byBkZWNpZGUgd2hldGhlciBvciBub3QgYSB3b3JkIGJyZWFrIGNoYXJhY3RlciBpcwotICAgcXVvdGVkLiAgSWYgYSBjaGFyYWN0ZXIgaXMgcXVvdGVkLCBpdCBkb2VzIG5vdCBicmVhayB3b3JkcyBmb3IgdGhlCi0gICBjb21wbGV0ZXIuICovCi1leHRlcm4gRnVuY3Rpb24gKnJsX2NoYXJfaXNfcXVvdGVkX3A7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRvIHN1cHByZXNzIG5vcm1hbCBmaWxlbmFtZSBjb21wbGV0aW9uIGFmdGVyIHRoZQotICAgdXNlci1zcGVjaWZpZWQgY29tcGxldGlvbiBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQuICovCi1leHRlcm4gaW50IHJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX292ZXI7Ci0KLS8qIFNldCB0byBhIGNoYXJhY3RlciBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGNvbXBsZXRpb24gYmVpbmcgYXR0ZW1wdGVkIGJ5Ci0gICBybF9jb21wbGV0ZV9pbnRlcm5hbDsgYXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gY29tcGxldGlvbgotICAgZnVuY3Rpb25zLiAqLwotZXh0ZXJuIGludCBybF9jb21wbGV0aW9uX3R5cGU7Ci0KLS8qIENoYXJhY3RlciBhcHBlbmRlZCB0byBjb21wbGV0ZWQgd29yZHMgd2hlbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhlCi0gICBkZWZhdWx0IGlzIGEgc3BhY2UuICBOb3RoaW5nIGlzIGFkZGVkIGlmIHRoaXMgaXMgJ1wwJy4gKi8KLWV4dGVybiBpbnQgcmxfY29tcGxldGlvbl9hcHBlbmRfY2hhcmFjdGVyOwotCi0vKiBVcCB0byB0aGlzIG1hbnkgaXRlbXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcmVzcG9uc2UgdG8gYQotICAgcG9zc2libGUtY29tcGxldGlvbnMgY2FsbC4gIEFmdGVyIHRoYXQsIHdlIGFzayB0aGUgdXNlciBpZiBzaGUKLSAgIGlzIHN1cmUgc2hlIHdhbnRzIHRvIHNlZSB0aGVtIGFsbC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMC4gKi8KLWV4dGVybiBpbnQgcmxfY29tcGxldGlvbl9xdWVyeV9pdGVtczsKLQotLyogSWYgbm9uLXplcm8sIHRoZW4gZGlzYWxsb3cgZHVwbGljYXRlcyBpbiB0aGUgbWF0Y2hlcy4gKi8KLWV4dGVybiBpbnQgcmxfaWdub3JlX2NvbXBsZXRpb25fZHVwbGljYXRlczsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgY29tcGxldGlvbiBpcyAodGVtcG9yYXJpbHkpIGluaGliaXRlZCwgYW5kIHRoZQotICAgY29tcGxldGlvbiBjaGFyYWN0ZXIgd2lsbCBiZSBpbnNlcnRlZCBhcyBhbnkgb3RoZXIuICovCi1leHRlcm4gaW50IHJsX2luaGliaXRfY29tcGxldGlvbjsKLSAgIAotLyogRGVmaW5pdGlvbnMgYXZhaWxhYmxlIGZvciB1c2UgYnkgcmVhZGxpbmUgY2xpZW50cy4gKi8KLSNkZWZpbmUgUkxfUFJPTVBUX1NUQVJUX0lHTk9SRQknXDAwMScKLSNkZWZpbmUgUkxfUFJPTVBUX0VORF9JR05PUkUJJ1wwMDInCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgZG9fcmVwbGFjZSBhcmd1bWVudCB0byBybF9maWxlbmFtZV9xdW90aW5nX2Z1bmN0aW9uLAotICAgY2FsbGVkIGJ5IHJsX2NvbXBsZXRlX2ludGVybmFsLiAqLwotI2RlZmluZSBOT19NQVRDSCAgICAgICAgMAotI2RlZmluZSBTSU5HTEVfTUFUQ0ggICAgMQotI2RlZmluZSBNVUxUX01BVENIICAgICAgMgotCi0jaWYgIWRlZmluZWQgKHNhdmVzdHJpbmcpCi1leHRlcm4gY2hhciAqc2F2ZXN0cmluZyAoKTsJLyogWFhYIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9SRUFETElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvcmxjb25mLmggYi9yZWFkbGluZS9ybGNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1NmZkOC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9ybGNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIHJsY29uZi5oIC0tIHJlYWRsaW5lIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFJlYWRsaW5lIExpYnJhcnkgKHRoZSBMaWJyYXJ5KSwgYSBzZXQgb2YKLSAgIHJvdXRpbmVzIGZvciBwcm92aWRpbmcgRW1hY3Mgc3R5bGUgbGluZSBpbnB1dCB0byBwcm9ncmFtcyB0aGF0IGFzawotICAgZm9yIGl0LgotCi0gICBUaGUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWYgIWRlZmluZWQgKF9STENPTkZfSF8pCi0jZGVmaW5lIF9STENPTkZfSF8KLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdGhlIHZpLW1vZGUgZWRpdGluZyBhdmFpbGFibGUuICovCi0jZGVmaW5lIFZJX01PREUKLQotLyogRGVmaW5lIHRoaXMgdG8gZ2V0IGFuIGluZGljYXRpb24gb2YgZmlsZSB0eXBlIHdoZW4gbGlzdGluZyBjb21wbGV0aW9ucy4gKi8KLSNkZWZpbmUgVklTSUJMRV9TVEFUUwotCi0vKiBJZiBkZWZpbmVkLCByZWFkbGluZSBzaG93cyBvcGVuaW5nIHBhcmVucyBhbmQgYnJhY2VzIHdoZW4gY2xvc2luZwotICAgcGFyZW4gb3IgYnJhY2UgZW50ZXJlZC4gKi8KLS8qICNkZWZpbmUgUEFSRU5fTUFUQ0hJTkcgKi8KLQotLyogVGhpcyBkZWZpbml0aW9uIGlzIG5lZWRlZCBieSByZWFkbGluZS5jLCBybHR0eS5jLCBhbmQgc2lnbmFscy5jLiAqLwotLyogSWYgb24sIHRoZW4gcmVhZGxpbmUgaGFuZGxlcyBzaWduYWxzIGluIGEgd2F5IHRoYXQgZG9lc24ndCBzY3Jldy4gKi8KLSNkZWZpbmUgSEFORExFX1NJR05BTFMKLQotLyogVWdseSBidXQgd29ya2luZyBoYWNrIGZvciBiaW5kaW5nIHByZWZpeCBtZXRhLiAqLwotI2RlZmluZSBQUkVGSVhfTUVUQV9IQUNLCi0KLS8qIFRoZSBmaW5hbCwgbGFzdC1kaXRjaCBlZmZvcnQgZmlsZSBuYW1lIGZvciBhbiBpbml0IGZpbGUuICovCi0jZGVmaW5lIERFRkFVTFRfSU5QVVRSQyAifi8uaW5wdXRyYyIKLQotLyogSWYgZGVmaW5lZCwgZXhwYW5kIHRhYnMgdG8gc3BhY2VzLiAqLwotI2RlZmluZSBESVNQTEFZX1RBQlMKLQotLyogSWYgZGVmaW5lZCwgdXNlIHRoZSB0ZXJtaW5hbCBlc2NhcGUgc2VxdWVuY2UgdG8gbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQKLSAgIG92ZXIgYSBjaGFyYWN0ZXIgd2hlbiB1cGRhdGluZyB0aGUgbGluZSByYXRoZXIgdGhhbiByZXdyaXRpbmcgaXQuICovCi0vKiAjZGVmaW5lIEhBQ0tfVEVSTUNBUF9NT1RJT04gKi8KLQotLyogVGhlIHN0cmluZyBpbnNlcnRlZCBieSB0aGUgYGluc2VydCBjb21tZW50JyBjb21tYW5kLiAqLwotI2RlZmluZSBSTF9DT01NRU5UX0JFR0lOX0RFRkFVTFQgIiMiCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IGNvZGUgdGhhdCBhbGxvd3MgcmVhZGxpbmUgdG8gYmUgdXNlZCBpbiBhbgotICAgWCBgY2FsbGJhY2snIHN0eWxlLiAqLwotI2RlZmluZSBSRUFETElORV9DQUxMQkFDS1MKLQotI2VuZGlmIC8qIF9STENPTkZfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3JsZGVmcy5oIGIvcmVhZGxpbmUvcmxkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWNlZDQuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcmxkZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogcmxkZWZzLmggLS0gYW4gYXR0ZW1wdCB0byBpc29sYXRlIHNvbWUgb2YgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbmVzCi0gICBmb3IgcmVhZGxpbmUuICBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBhZnRlciBhbnkgZmlsZXMgdGhhdCBkZWZpbmUKLSAgIHN5c3RlbS1zcGVjaWZpYyBjb25zdGFudHMgbGlrZSBfUE9TSVhfVkVSU0lPTiBvciBVU0cuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NywxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFJlYWRsaW5lIExpYnJhcnkgKHRoZSBMaWJyYXJ5KSwgYSBzZXQgb2YKLSAgIHJvdXRpbmVzIGZvciBwcm92aWRpbmcgRW1hY3Mgc3R5bGUgbGluZSBpbnB1dCB0byBwcm9ncmFtcyB0aGF0IGFzawotICAgZm9yIGl0LgotCi0gICBUaGUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWYgIWRlZmluZWQgKF9STERFRlNfSF8pCi0jZGVmaW5lIF9STERFRlNfSF8KLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1BPU0lYX1ZFUlNJT04pICYmICFkZWZpbmVkIChURVJNSU9TX01JU1NJTkcpCi0jICBkZWZpbmUgVEVSTUlPU19UVFlfRFJJVkVSCi0jZWxzZQotIyAgaWYgZGVmaW5lZCAoSEFWRV9URVJNSU9fSCkKLSMgICAgZGVmaW5lIFRFUk1JT19UVFlfRFJJVkVSCi0jICBlbHNlCi0jICAgIGRlZmluZSBORVdfVFRZX0RSSVZFUgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBQb3NpeCBtYWNybyB0byBjaGVjayBmaWxlIGluIHN0YXRidWYgZm9yIGRpcmVjdG9yeS1uZXNzLgotICAgVGhpcyByZXF1aXJlcyB0aGF0IDxzeXMvc3RhdC5oPiBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyB0ZXN0LiAqLwotI2lmIGRlZmluZWQgKFNfSUZESVIpICYmICFkZWZpbmVkIChTX0lTRElSKQotIyAgZGVmaW5lIFNfSVNESVIobSkgKCgobSkmU19JRk1UKSA9PSBTX0lGRElSKQotI2VuZGlmCi0KLS8qIERlY2lkZSB3aGljaCBmbGF2b3Igb2YgdGhlIGhlYWRlciBmaWxlIGRlc2NyaWJpbmcgdGhlIEMgbGlicmFyeQotICAgc3RyaW5nIGZ1bmN0aW9ucyB0byBpbmNsdWRlIGFuZCBpbmNsdWRlIGl0LiAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVFJJTkdfSCkKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UgLyogIUhBVkVfU1RSSU5HX0ggKi8KLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZiAvKiAhSEFWRV9TVFJJTkdfSCAqLwotCi0jaWYgIWRlZmluZWQgKHN0cmNocikgJiYgIWRlZmluZWQgKF9fU1REQ19fKQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKSwgKnN0cnJjaHIgKCk7Ci0jZW5kaWYgLyogIXN0cmNociAmJiAhX19TVERDX18gKi8KLQotI2lmIGRlZmluZWQgKFBSRUZFUl9TVERBUkcpCi0jICBpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jICBpZiBkZWZpbmVkIChQUkVGRVJfVkFSQVJHUykKLSMgICAgaW5jbHVkZSA8dmFyYXJncy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVFJDQVNFQ01QKQotI2RlZmluZSBfcmxfc3RyaWNtcCBzdHJjYXNlY21wCi0jZGVmaW5lIF9ybF9zdHJuaWNtcCBzdHJuY2FzZWNtcAotI2Vsc2UKLWV4dGVybiBpbnQgX3JsX3N0cmljbXAgKCksIF9ybF9zdHJuaWNtcCAoKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKGVtYWNzX21vZGUpCi0jICBkZWZpbmUgbm9fbW9kZSAtMQotIyAgZGVmaW5lIHZpX21vZGUgMAotIyAgZGVmaW5lIGVtYWNzX21vZGUgMQotI2VuZGlmCi0KLS8qIElmIHlvdSBjYXN0IG1hcFtrZXldLmZ1bmN0aW9uIHRvIHR5cGUgKEtleW1hcCkgb24gYSBDcmF5LAotICAgdGhlIGNvbXBpbGVyIHRha2VzIHRoZSB2YWx1ZSBvZiBtYXBba2V5XS5mdW5jdGlvbiBhbmQKLSAgIGRpdmlkZXMgaXQgYnkgNCB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlciB0eXBlcyAocG9pbnRlcnMKLSAgIHRvIGZ1bmN0aW9ucyBhbmQgcG9pbnRlcnMgdG8gc3RydWN0cyBhcmUgZGlmZmVyZW50IHNpemVzKS4KLSAgIFRoaXMgaXMgbm90IHdoYXQgaXMgd2FudGVkLiAqLwotI2lmIGRlZmluZWQgKENSQVkpCi0jICBkZWZpbmUgRlVOQ1RJT05fVE9fS0VZTUFQKG1hcCwga2V5KQkoS2V5bWFwKSgoaW50KW1hcFtrZXldLmZ1bmN0aW9uKQotIyAgZGVmaW5lIEtFWU1BUF9UT19GVU5DVElPTihkYXRhKQkoRnVuY3Rpb24gKikoKGludCkoZGF0YSkpCi0jZWxzZQotIyAgZGVmaW5lIEZVTkNUSU9OX1RPX0tFWU1BUChtYXAsIGtleSkJKEtleW1hcCkobWFwW2tleV0uZnVuY3Rpb24pCi0jICBkZWZpbmUgS0VZTUFQX1RPX0ZVTkNUSU9OKGRhdGEpCShGdW5jdGlvbiAqKShkYXRhKQotI2VuZGlmCi0KLSNpZm5kZWYgc2F2ZXN0cmluZwotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci0jZGVmaW5lIHNhdmVzdHJpbmcoeCkgc3RyY3B5ICh4bWFsbG9jICgxICsgc3RybGVuICh4KSksICh4KSkKLSNlbmRpZgotCi0vKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIF9ybF9iZWxsX3ByZWZlcmVuY2UuICovCi0jZGVmaW5lIE5PX0JFTEwgMAotI2RlZmluZSBBVURJQkxFX0JFTEwgMQotI2RlZmluZSBWSVNJQkxFX0JFTEwgMgotCi0vKiBEZWZpbml0aW9ucyB1c2VkIHdoZW4gc2VhcmNoaW5nIHRoZSBsaW5lIGZvciBjaGFyYWN0ZXJzLiAqLwotLyogTk9URTogaXQgaXMgbmVjZXNzYXJ5IHRoYXQgb3Bwb3NpdGUgZGlyZWN0aW9ucyBhcmUgaW52ZXJzZXMgKi8KLSNkZWZpbmUJRlRPCSAxCQkvKiBmb3J3YXJkIHRvICovCi0jZGVmaW5lIEJUTwktMQkJLyogYmFja3dhcmQgdG8gKi8KLSNkZWZpbmUgRkZJTkQJIDIJCS8qIGZvcndhcmQgZmluZCAqLwotI2RlZmluZSBCRklORAktMgkJLyogYmFja3dhcmQgZmluZCAqLwotCi0vKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBmb3VuZF9xdW90ZSBmbGFncyB3b3JkIHVzZWQgYnkgdGhlIGNvbXBsZXRpb24KLSAgIGZ1bmN0aW9ucy4gIEl0IHNheXMgd2hhdCBraW5kIG9mIChzaGVsbC1saWtlKSBxdW90aW5nIHdlIGZvdW5kIGFueXdoZXJlCi0gICBpbiB0aGUgbGluZS4gKi8KLSNkZWZpbmUgUkxfUUZfU0lOR0xFX1FVT1RFCTB4MQotI2RlZmluZSBSTF9RRl9ET1VCTEVfUVVPVEUJMHgyCi0jZGVmaW5lIFJMX1FGX0JBQ0tTTEFTSAkJMHg0Ci0KLS8qIERlZmF1bHQgcmVhZGxpbmUgbGluZSBidWZmZXIgbGVuZ3RoLiAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUl9TSVpFIDI1NgotCi0jaWYgIWRlZmluZWQgKFNUUkVRKQotI2RlZmluZSBTVFJFUShhLCBiKQkoKChhKVswXSA9PSAoYilbMF0pICYmIChzdHJjbXAgKChhKSwgKGIpKSA9PSAwKSkKLSNkZWZpbmUgU1RSRVFOKGEsIGIsIG4pCSgoKGEpWzBdID09IChiKVswXSkgJiYgKHN0cm5jbXAgKChhKSwgKGIpLCAobikpID09IDApKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoRlJFRSkKLSMgIGRlZmluZSBGUkVFKHgpCWlmICh4KSBmcmVlICh4KQotI2VuZGlmCi0KLS8qIENPTkZJR1VSQVRJT04gU0VDVElPTiAqLwotI2luY2x1ZGUgInJsY29uZi5oIgotCi0jZW5kaWYgLyogIV9STERFRlNfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3Jsc3RkYy5oIGIvcmVhZGxpbmUvcmxzdGRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjBmODkuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcmxzdGRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBzdGRjLmggLS0gbWFjcm9zIHRvIG1ha2Ugc291cmNlIGNvbXBpbGUgb24gYm90aCBBTlNJIEMgYW5kIEsmUiBDCi0gICBjb21waWxlcnMuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCi0KLSAgIEJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBCYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKLSAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggQmFzaDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmICFkZWZpbmVkIChfUkxfU1REQ19IXykKLSNkZWZpbmUgX1JMX1NURENfSF8KLQotLyogQWRhcHRlZCBmcm9tIEJTRCAvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmguICovCi0KLS8qIEEgZnVuY3Rpb24gY2FuIGJlIGRlZmluZWQgdXNpbmcgcHJvdG90eXBlcyBhbmQgY29tcGlsZSBvbiBib3RoIEFOU0kgQwotICAgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGlsZXJzIHdpdGggc29tZXRoaW5nIGxpa2UgdGhpczoKLQlleHRlcm4gY2hhciAqZnVuYyBfX1AoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKQotCi0jICBpZiAhZGVmaW5lZCAoX19QKQotIyAgICBkZWZpbmUgX19QKHByb3RvcykgcHJvdG9zCi0jICBlbmRpZgotIyAgZGVmaW5lIF9fU1RSSU5HKHgpICN4Ci0KLSMgIGlmICFkZWZpbmVkIChfX0dOVUNfXykKLSMgICAgZGVmaW5lIGlubGluZQotIyAgZW5kaWYKLQotI2Vsc2UgLyogIV9fU1REQ19fICovCi0KLSMgIGlmICFkZWZpbmVkIChfX1ApCi0jICAgIGRlZmluZSBfX1AocHJvdG9zKSAoKQotIyAgZW5kaWYKLSMgIGRlZmluZSBfX1NUUklORyh4KSAieCIKLQotI2lmIGRlZmluZWQgKF9fR05VQ19fKQkJLyogZ2NjIHdpdGggLXRyYWRpdGlvbmFsICovCi0jICBpZiAhZGVmaW5lZCAoY29uc3QpCi0jICAgIGRlZmluZSBjb25zdCAgX19jb25zdAotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkIChpbmxpbmUpCi0jICAgIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKLSMgIGVuZGlmCi0jICBpZiAhZGVmaW5lZCAoc2lnbmVkKQotIyAgICBkZWZpbmUgc2lnbmVkIF9fc2lnbmVkCi0jICBlbmRpZgotIyAgaWYgIWRlZmluZWQgKHZvbGF0aWxlKQotIyAgICBkZWZpbmUgdm9sYXRpbGUgX192b2xhdGlsZQotIyAgZW5kaWYKLSNlbHNlIC8qICFfX0dOVUNfXyAqLwotIyAgaWYgIWRlZmluZWQgKGNvbnN0KQotIyAgICBkZWZpbmUgY29uc3QKLSMgIGVuZGlmCi0jICBpZiAhZGVmaW5lZCAoaW5saW5lKQotIyAgICBkZWZpbmUgaW5saW5lCi0jICBlbmRpZgotIyAgaWYgIWRlZmluZWQgKHNpZ25lZCkKLSMgICAgZGVmaW5lIHNpZ25lZAotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkICh2b2xhdGlsZSkKLSMgICAgZGVmaW5lIHZvbGF0aWxlCi0jICBlbmRpZgotI2VuZGlmIC8qICFfX0dOVUNfXyAqLwotCi0jZW5kaWYgLyogIV9fU1REQ19fICovCi0KLSNlbmRpZiAvKiAhX1JMX1NURENfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3JsdHR5LmMgYi9yZWFkbGluZS9ybHR0eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNkODViLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3JsdHR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyogcmx0dHkuYyAtLSBmdW5jdGlvbnMgdG8gcHJlcGFyZSBhbmQgcmVzdG9yZSB0aGUgdGVybWluYWwgZm9yIHJlYWRsaW5lJ3MKLSAgIHVzZS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogSEFWRV9VTklTVERfSCAqLwotCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0KLSNpZiBkZWZpbmVkIChHV0lOU1pfSU5fU1lTX0lPQ1RMKQotIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jZW5kaWYgLyogR1dJTlNaX0lOX1NZU19JT0NUTCAqLwotCi0jaW5jbHVkZSAicmx0dHkuaCIKLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi0jaWYgIWRlZmluZWQgKGVycm5vKQotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZiAvKiAhZXJybm8gKi8KLQotZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7Ci1leHRlcm4gaW50IF9ybF9lb2ZfY2hhcjsKLQotZXh0ZXJuIGludCBfcmxfZW5hYmxlX2tleXBhZCwgX3JsX2VuYWJsZV9tZXRhOwotCi1leHRlcm4gdm9pZCBfcmxfY29udHJvbF9rZXlwYWQgKCk7Ci0KLSNpZiBkZWZpbmVkIChfX0dPMzJfXykKLSMgIGluY2x1ZGUgPHBjLmg+Ci0jICBpZiAhZGVmaW5lZCAoX19ESkdQUF9fKQotIyAgICB1bmRlZiBIQU5ETEVfU0lHTkFMUwotIyAgZW5kaWYgLyogIV9fREpHUFBfXyAqLwotI2VuZGlmIC8qIF9fR08zMl9fICovCi0KLS8qIEluZGlyZWN0IGZ1bmN0aW9ucyB0byBhbGxvdyBhcHBzIGNvbnRyb2wgb3ZlciB0ZXJtaW5hbCBtYW5hZ2VtZW50LiAqLwotZXh0ZXJuIHZvaWQgcmxfcHJlcF90ZXJtaW5hbCAoKSwgcmxfZGVwcmVwX3Rlcm1pbmFsICgpOwotCi1WRnVuY3Rpb24gKnJsX3ByZXBfdGVybV9mdW5jdGlvbiA9IHJsX3ByZXBfdGVybWluYWw7Ci1WRnVuY3Rpb24gKnJsX2RlcHJlcF90ZXJtX2Z1bmN0aW9uID0gcmxfZGVwcmVwX3Rlcm1pbmFsOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCSAgIFNpZ25hbCBNYW5hZ2VtZW50CQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX1NJR05BTFMpCi1zdGF0aWMgc2lnc2V0X3Qgc2lnaW50X3NldCwgc2lnaW50X29zZXQ7Ci0jZWxzZSAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0jICBpZiBkZWZpbmVkIChIQVZFX0JTRF9TSUdOQUxTKQotc3RhdGljIGludCBzaWdpbnRfb2xkbWFzazsKLSMgIGVuZGlmIC8qIEhBVkVfQlNEX1NJR05BTFMgKi8KLSNlbmRpZiAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0KLXN0YXRpYyBpbnQgc2lnaW50X2Jsb2NrZWQ7Ci0KLS8qIENhdXNlIFNJR0lOVCB0byBub3QgYmUgZGVsaXZlcmVkIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8KLSAgIHJlbGVhc2Vfc2lnaW50KCkuICovCi1zdGF0aWMgdm9pZAotYmxvY2tfc2lnaW50ICgpCi17Ci0gIGlmIChzaWdpbnRfYmxvY2tlZCkKLSAgICByZXR1cm47Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX1NJR05BTFMpCi0gIHNpZ2VtcHR5c2V0ICgmc2lnaW50X3NldCk7Ci0gIHNpZ2VtcHR5c2V0ICgmc2lnaW50X29zZXQpOwotICBzaWdhZGRzZXQgKCZzaWdpbnRfc2V0LCBTSUdJTlQpOwotICBzaWdwcm9jbWFzayAoU0lHX0JMT0NLLCAmc2lnaW50X3NldCwgJnNpZ2ludF9vc2V0KTsKLSNlbHNlIC8qICFIQVZFX1BPU0lYX1NJR05BTFMgKi8KLSMgIGlmIGRlZmluZWQgKEhBVkVfQlNEX1NJR05BTFMpCi0gIHNpZ2ludF9vbGRtYXNrID0gc2lnYmxvY2sgKHNpZ21hc2sgKFNJR0lOVCkpOwotIyAgZWxzZSAvKiAhSEFWRV9CU0RfU0lHTkFMUyAqLwotIyAgICBpZiBkZWZpbmVkIChIQVZFX1VTR19TSUdIT0xEKQotICBzaWdob2xkIChTSUdJTlQpOwotIyAgICBlbmRpZiAvKiBIQVZFX1VTR19TSUdIT0xEICovCi0jICBlbmRpZiAvKiAhSEFWRV9CU0RfU0lHTkFMUyAqLwotI2VuZGlmIC8qICFIQVZFX1BPU0lYX1NJR05BTFMgKi8KLSAgc2lnaW50X2Jsb2NrZWQgPSAxOwotfQotCi0vKiBBbGxvdyBTSUdJTlQgdG8gYmUgZGVsaXZlcmVkLiAqLwotc3RhdGljIHZvaWQKLXJlbGVhc2Vfc2lnaW50ICgpCi17Ci0gIGlmICghc2lnaW50X2Jsb2NrZWQpCi0gICAgcmV0dXJuOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotICBzaWdwcm9jbWFzayAoU0lHX1NFVE1BU0ssICZzaWdpbnRfb3NldCwgKHNpZ3NldF90ICopTlVMTCk7Ci0jZWxzZQotIyAgaWYgZGVmaW5lZCAoSEFWRV9CU0RfU0lHTkFMUykKLSAgc2lnc2V0bWFzayAoc2lnaW50X29sZG1hc2spOwotIyAgZWxzZSAvKiAhSEFWRV9CU0RfU0lHTkFMUyAqLwotIyAgICBpZiBkZWZpbmVkIChIQVZFX1VTR19TSUdIT0xEKQotICBzaWdyZWxzZSAoU0lHSU5UKTsKLSMgICAgZW5kaWYgLyogSEFWRV9VU0dfU0lHSE9MRCAqLwotIyAgZW5kaWYgLyogIUhBVkVfQlNEX1NJR05BTFMgKi8KLSNlbmRpZiAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0KLSAgc2lnaW50X2Jsb2NrZWQgPSAwOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJICAgICAgU2F2aW5nIGFuZCBSZXN0b3JpbmcgdGhlIFRUWQkgICAgCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBOb24temVybyBtZWFucyB0aGF0IHRoZSB0ZXJtaW5hbCBpcyBpbiBhIHByZXBwZWQgc3RhdGUuICovCi1zdGF0aWMgaW50IHRlcm1pbmFsX3ByZXBwZWQ7Ci0KLS8qIElmIG5vbi16ZXJvLCBtZWFucyB0aGF0IHRoaXMgcHJvY2VzcyBoYXMgY2FsbGVkIHRjZmxvdyhmZCwgVENPT0ZGKQotICAgYW5kIG91dHB1dCBpcyBzdXNwZW5kZWQuICovCi0jaWYgZGVmaW5lZCAoX19rc3IxX18pCi1zdGF0aWMgaW50IGtzcmZsb3c7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFRJT0NHV0lOU1opCi0vKiBEdW1teSBjYWxsIHRvIGZvcmNlIGEgYmFja2dyb3VuZGVkIHJlYWRsaW5lIHRvIHN0b3AgYmVmb3JlIGl0IHRyaWVzCi0gICB0byBnZXQgdGhlIHR0eSBzZXR0aW5ncy4gKi8KLXN0YXRpYyB2b2lkCi1zZXRfd2luc2l6ZSAodHR5KQotICAgICBpbnQgdHR5OwotewotICBzdHJ1Y3Qgd2luc2l6ZSB3OwotCi0gIGlmIChpb2N0bCAodHR5LCBUSU9DR1dJTlNaLCAmdykgPT0gMCkKLSAgICAgICh2b2lkKSBpb2N0bCAodHR5LCBUSU9DU1dJTlNaLCAmdyk7Ci19Ci0jZW5kaWYgLyogVElPQ0dXSU5TWiAqLwotCi0jaWYgZGVmaW5lZCAoTkVXX1RUWV9EUklWRVIpCi0KLS8qIFZhbHVlcyBmb3IgdGhlIGBmbGFncycgZmllbGQgb2YgYSBzdHJ1Y3QgYnNkdHR5LiAgVGhpcyB0ZWxscyB3aGljaAotICAgZWxlbWVudHMgb2YgdGhlIHN0cnVjdCBic2R0dHkgaGF2ZSBiZWVuIGZldGNoZWQgZnJvbSB0aGUgc3lzdGVtIGFuZAotICAgYXJlIHZhbGlkLiAqLwotI2RlZmluZSBTR1RUWV9TRVQJMHgwMQotI2RlZmluZSBMRkxBR19TRVQJMHgwMgotI2RlZmluZSBUQ0hBUlNfU0VUCTB4MDQKLSNkZWZpbmUgTFRDSEFSU19TRVQJMHgwOAotCi1zdHJ1Y3QgYnNkdHR5IHsKLSAgc3RydWN0IHNndHR5YiBzZ3R0eWI7CS8qIEJhc2ljIEJTRCB0dHkgZHJpdmVyIGluZm9ybWF0aW9uLiAqLwotICBpbnQgbGZsYWc7CQkvKiBMb2NhbCBtb2RlIGZsYWdzLCBsaWtlIExQQVNTOC4gKi8KLSNpZiBkZWZpbmVkIChUSU9DR0VUQykKLSAgc3RydWN0IHRjaGFycyB0Y2hhcnM7CS8qIFRlcm1pbmFsIHNwZWNpYWwgY2hhcmFjdGVycywgaW5jbHVkaW5nIF5TIGFuZCBeUS4gKi8KLSNlbmRpZgotI2lmIGRlZmluZWQgKFRJT0NHTFRDKQotICBzdHJ1Y3QgbHRjaGFycyBsdGNoYXJzOyAvKiA0LjIgQlNEIGVkaXRpbmcgY2hhcmFjdGVycyAqLwotI2VuZGlmCi0gIGludCBmbGFnczsJCS8qIEJpdG1hcCBzYXlpbmcgd2hpY2ggcGFydHMgb2YgdGhlIHN0cnVjdCBhcmUgdmFsaWQuICovCi19OwotCi0jZGVmaW5lIFRJT1RZUEUgc3RydWN0IGJzZHR0eQotCi1zdGF0aWMgVElPVFlQRSBvdGlvOwotCi1zdGF0aWMgaW50Ci1nZXRfdHR5X3NldHRpbmdzICh0dHksIHRpb3ApCi0gICAgIGludCB0dHk7Ci0gICAgIFRJT1RZUEUgKnRpb3A7Ci17Ci0jaWYgZGVmaW5lZCAoVElPQ0dXSU5TWikKLSAgc2V0X3dpbnNpemUgKHR0eSk7Ci0jZW5kaWYKLQotICB0aW9wLT5mbGFncyA9IHRpb3AtPmxmbGFnID0gMDsKLQotICBpb2N0bCAodHR5LCBUSU9DR0VUUCwgJih0aW9wLT5zZ3R0eWIpKTsKLSAgdGlvcC0+ZmxhZ3MgfD0gU0dUVFlfU0VUOwotCi0jaWYgZGVmaW5lZCAoVElPQ0xHRVQpCi0gIGlvY3RsICh0dHksIFRJT0NMR0VULCAmKHRpb3AtPmxmbGFnKSk7Ci0gIHRpb3AtPmZsYWdzIHw9IExGTEFHX1NFVDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoVElPQ0dFVEMpCi0gIGlvY3RsICh0dHksIFRJT0NHRVRDLCAmKHRpb3AtPnRjaGFycykpOwotICB0aW9wLT5mbGFncyB8PSBUQ0hBUlNfU0VUOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChUSU9DR0xUQykKLSAgaW9jdGwgKHR0eSwgVElPQ0dMVEMsICYodGlvcC0+bHRjaGFycykpOwotICB0aW9wLT5mbGFncyB8PSBMVENIQVJTX1NFVDsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zZXRfdHR5X3NldHRpbmdzICh0dHksIHRpb3ApCi0gICAgIGludCB0dHk7Ci0gICAgIFRJT1RZUEUgKnRpb3A7Ci17Ci0gIGlmICh0aW9wLT5mbGFncyAmIFNHVFRZX1NFVCkKLSAgICB7Ci0gICAgICBpb2N0bCAodHR5LCBUSU9DU0VUTiwgJih0aW9wLT5zZ3R0eWIpKTsKLSAgICAgIHRpb3AtPmZsYWdzICY9IH5TR1RUWV9TRVQ7Ci0gICAgfQotICByZWFkbGluZV9lY2hvaW5nX3AgPSAxOwotCi0jaWYgZGVmaW5lZCAoVElPQ0xTRVQpCi0gIGlmICh0aW9wLT5mbGFncyAmIExGTEFHX1NFVCkKLSAgICB7Ci0gICAgICBpb2N0bCAodHR5LCBUSU9DTFNFVCwgJih0aW9wLT5sZmxhZykpOwotICAgICAgdGlvcC0+ZmxhZ3MgJj0gfkxGTEFHX1NFVDsKLSAgICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFRJT0NTRVRDKQotICBpZiAodGlvcC0+ZmxhZ3MgJiBUQ0hBUlNfU0VUKQotICAgIHsKLSAgICAgIGlvY3RsICh0dHksIFRJT0NTRVRDLCAmKHRpb3AtPnRjaGFycykpOwotICAgICAgdGlvcC0+ZmxhZ3MgJj0gflRDSEFSU19TRVQ7Ci0gICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChUSU9DU0xUQykKLSAgaWYgKHRpb3AtPmZsYWdzICYgTFRDSEFSU19TRVQpCi0gICAgewotICAgICAgaW9jdGwgKHR0eSwgVElPQ1NMVEMsICYodGlvcC0+bHRjaGFycykpOwotICAgICAgdGlvcC0+ZmxhZ3MgJj0gfkxUQ0hBUlNfU0VUOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotcHJlcGFyZV90ZXJtaW5hbF9zZXR0aW5ncyAobWV0YV9mbGFnLCBvdGlvLCB0aW9wKQotICAgICBpbnQgbWV0YV9mbGFnOwotICAgICBUSU9UWVBFIG90aW8sICp0aW9wOwotewotI2lmICFkZWZpbmVkIChfX0dPMzJfXykgfHwgZGVmaW5lZCAoSEFWRV9URVJNSU9TX0gpCi0gIHJlYWRsaW5lX2VjaG9pbmdfcCA9IChvdGlvLnNndHR5Yi5zZ19mbGFncyAmIEVDSE8pOwotCi0gIC8qIENvcHkgdGhlIG9yaWdpbmFsIHNldHRpbmdzIHRvIHRoZSBzdHJ1Y3R1cmUgd2UncmUgZ29pbmcgdG8gdXNlIGZvcgotICAgICBvdXIgc2V0dGluZ3MuICovCi0gIHRpb3AtPnNndHR5YiA9IG90aW8uc2d0dHliOwotICB0aW9wLT5sZmxhZyA9IG90aW8ubGZsYWc7Ci0jaWYgZGVmaW5lZCAoVElPQ0dFVEMpCi0gIHRpb3AtPnRjaGFycyA9IG90aW8udGNoYXJzOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoVElPQ0dMVEMpCi0gIHRpb3AtPmx0Y2hhcnMgPSBvdGlvLmx0Y2hhcnM7Ci0jZW5kaWYKLSAgdGlvcC0+ZmxhZ3MgPSBvdGlvLmZsYWdzOwotCi0gIC8qIEZpcnN0LCB0aGUgYmFzaWMgc2V0dGluZ3MgdG8gcHV0IHVzIGludG8gY2hhcmFjdGVyLWF0LWEtdGltZSwgbm8tZWNobwotICAgICBpbnB1dCBtb2RlLiAqLwotICB0aW9wLT5zZ3R0eWIuc2dfZmxhZ3MgJj0gfihFQ0hPIHwgQ1JNT0QpOwotICB0aW9wLT5zZ3R0eWIuc2dfZmxhZ3MgfD0gQ0JSRUFLOwotCi0gIC8qIElmIHRoaXMgdGVybWluYWwgZG9lc24ndCBjYXJlIGhvdyB0aGUgOHRoIGJpdCBpcyB1c2VkLCB0aGVuIHdlIGNhbgotICAgICB1c2UgaXQgZm9yIHRoZSBtZXRhLWtleS4gIElmIG9ubHkgb25lIG9mIGV2ZW4gb3Igb2RkIHBhcml0eSBpcwotICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHRlcm1pbmFsIGlzIHVzaW5nIHBhcml0eSwgYW5kIHdlIGNhbm5vdC4gKi8KLSNpZiAhZGVmaW5lZCAoQU5ZUCkKLSMgIGRlZmluZSBBTllQIChFVkVOUCB8IE9ERFApCi0jZW5kaWYKLSAgaWYgKCgob3Rpby5zZ3R0eWIuc2dfZmxhZ3MgJiBBTllQKSA9PSBBTllQKSB8fAotICAgICAgKChvdGlvLnNndHR5Yi5zZ19mbGFncyAmIEFOWVApID09IDApKQotICAgIHsKLSAgICAgIHRpb3AtPnNndHR5Yi5zZ19mbGFncyB8PSBBTllQOwotCi0gICAgICAvKiBIYWNrIG9uIGxvY2FsIG1vZGUgZmxhZ3MgaWYgd2UgY2FuLiAqLwotI2lmIGRlZmluZWQgKFRJT0NMR0VUKQotIyAgaWYgZGVmaW5lZCAoTFBBU1M4KQotICAgICAgdGlvcC0+bGZsYWcgfD0gTFBBU1M4OwotIyAgZW5kaWYgLyogTFBBU1M4ICovCi0jZW5kaWYgLyogVElPQ0xHRVQgKi8KLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChUSU9DR0VUQykKLSMgIGlmIGRlZmluZWQgKFVTRV9YT05fWE9GRikKLSAgLyogR2V0IHJpZCBvZiB0ZXJtaW5hbCBvdXRwdXQgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4gKi8KLSAgdGlvcC0+dGNoYXJzLnRfc3RvcGMgPSAtMTsgLyogQy1zICovCi0gIHRpb3AtPnRjaGFycy50X3N0YXJ0YyA9IC0xOyAvKiBDLXEgKi8KLQotICAvKiBJZiB0aGVyZSBpcyBhbiBYT04gY2hhcmFjdGVyLCBiaW5kIGl0IHRvIHJlc3RhcnQgdGhlIG91dHB1dC4gKi8KLSAgaWYgKG90aW8udGNoYXJzLnRfc3RhcnRjICE9IC0xKQotICAgIHJsX2JpbmRfa2V5IChvdGlvLnRjaGFycy50X3N0YXJ0YywgcmxfcmVzdGFydF9vdXRwdXQpOwotIyAgZW5kaWYgLyogVVNFX1hPTl9YT0ZGICovCi0KLSAgLyogSWYgdGhlcmUgaXMgYW4gRU9GIGNoYXIsIGJpbmQgX3JsX2VvZl9jaGFyIHRvIGl0LiAqLwotICBpZiAob3Rpby50Y2hhcnMudF9lb2ZjICE9IC0xKQotICAgIF9ybF9lb2ZfY2hhciA9IG90aW8udGNoYXJzLnRfZW9mYzsKLQotIyAgaWYgZGVmaW5lZCAoTk9fS0lMTF9JTlRSKQotICAvKiBHZXQgcmlkIG9mIHRlcm1pbmFsLWdlbmVyYXRlZCBTSUdRVUlUIGFuZCBTSUdJTlQuICovCi0gIHRpb3AtPnRjaGFycy50X3F1aXRjID0gLTE7IC8qIEMtXCAqLwotICB0aW9wLT50Y2hhcnMudF9pbnRyYyA9IC0xOyAvKiBDLWMgKi8KLSMgIGVuZGlmIC8qIE5PX0tJTExfSU5UUiAqLwotI2VuZGlmIC8qIFRJT0NHRVRDICovCi0KLSNpZiBkZWZpbmVkIChUSU9DR0xUQykKLSAgLyogTWFrZSB0aGUgaW50ZXJydXB0IGtleXMgZ28gYXdheS4gIEp1c3QgZW5vdWdoIHRvIG1ha2UgcGVvcGxlIGhhcHB5LiAqLwotICB0aW9wLT5sdGNoYXJzLnRfZHN1c3BjID0gLTE7CS8qIEMteSAqLwotICB0aW9wLT5sdGNoYXJzLnRfbG5leHRjID0gLTE7CS8qIEMtdiAqLwotI2VuZGlmIC8qIFRJT0NHTFRDICovCi0jZW5kaWYgLyogIV9fR08zMl9fIHx8IEhBVkVfVEVSTUlPU19IICovCi19Ci0KLSNlbHNlICAvKiAhZGVmaW5lZCAoTkVXX1RUWV9EUklWRVIpICovCi0KLSNpZiAhZGVmaW5lZCAoVk1JTikKLSMgIGRlZmluZSBWTUlOIFZFT0YKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFZUSU1FKQotIyAgZGVmaW5lIFZUSU1FIFZFT0wKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoVEVSTUlPU19UVFlfRFJJVkVSKQotIyAgZGVmaW5lIFRJT1RZUEUgc3RydWN0IHRlcm1pb3MKLSMgIGRlZmluZSBEUkFJTl9PVVRQVVQoZmQpCXRjZHJhaW4gKGZkKQotIyAgZGVmaW5lIEdFVEFUVFIodHR5LCB0aW9wKQkodGNnZXRhdHRyICh0dHksIHRpb3ApKQotIyAgaWZkZWYgTV9VTklYCi0jICAgIGRlZmluZSBTRVRBVFRSKHR0eSwgdGlvcCkJKHRjc2V0YXR0ciAodHR5LCBUQ1NBTk9XLCB0aW9wKSkKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFNFVEFUVFIodHR5LCB0aW9wKQkodGNzZXRhdHRyICh0dHksIFRDU0FEUkFJTiwgdGlvcCkpCi0jICBlbmRpZiAvKiAhTV9VTklYICovCi0jZWxzZQotIyAgZGVmaW5lIFRJT1RZUEUgc3RydWN0IHRlcm1pbwotIyAgZGVmaW5lIERSQUlOX09VVFBVVChmZCkKLSMgIGRlZmluZSBHRVRBVFRSKHR0eSwgdGlvcCkJKGlvY3RsICh0dHksIFRDR0VUQSwgdGlvcCkpCi0jICBkZWZpbmUgU0VUQVRUUih0dHksIHRpb3ApCShpb2N0bCAodHR5LCBUQ1NFVEEsIHRpb3ApKQotI2VuZGlmIC8qICFURVJNSU9TX1RUWV9EUklWRVIgKi8KLQotc3RhdGljIFRJT1RZUEUgb3RpbzsKLQotI2lmIGRlZmluZWQgKEZMVVNITykKLSMgIGRlZmluZSBPVVRQVVRfQkVJTkdfRkxVU0hFRCh0cCkgICh0cC0+Y19sZmxhZyAmIEZMVVNITykKLSNlbHNlCi0jICBkZWZpbmUgT1VUUFVUX0JFSU5HX0ZMVVNIRUQodHApICAwCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXJsdHR5X3dhcm5pbmcgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBmcHJpbnRmIChzdGRlcnIsICJyZWFkbGluZTogd2FybmluZzogJXNcbiIsIG1zZyk7Ci19Ci0KLSNpZiBkZWZpbmVkIChfQUlYKQotdm9pZAotc2V0b3Bvc3QodHApCi1USU9UWVBFICp0cDsKLXsKLSAgaWYgKCh0cC0+Y19vZmxhZyAmIE9QT1NUKSA9PSAwKQotICAgIHsKLSAgICAgIHJsdHR5X3dhcm5pbmcgKCJ0dXJuaW5nIG9uIE9QT1NUIGZvciB0ZXJtaW5hbFxyIik7Ci0gICAgICB0cC0+Y19vZmxhZyB8PSBPUE9TVHxPTkxDUjsKLSAgICB9Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotZ2V0X3R0eV9zZXR0aW5ncyAodHR5LCB0aW9wKQotICAgICBpbnQgdHR5OwotICAgICBUSU9UWVBFICp0aW9wOwotewotICBpbnQgaW9jdGxfcmV0OwotCi0jaWYgZGVmaW5lZCAoVElPQ0dXSU5TWikKLSAgc2V0X3dpbnNpemUgKHR0eSk7Ci0jZW5kaWYKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpb2N0bF9yZXQgPSBHRVRBVFRSICh0dHksIHRpb3ApOwotICAgICAgaWYgKGlvY3RsX3JldCA8IDApCi0JewotCSAgaWYgKGVycm5vICE9IEVJTlRSKQotCSAgICByZXR1cm4gLTE7Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChPVVRQVVRfQkVJTkdfRkxVU0hFRCAodGlvcCkpCi0JewotI2lmIGRlZmluZWQgKEZMVVNITykgJiYgZGVmaW5lZCAoX0FJWDQxKQotCSAgcmx0dHlfd2FybmluZyAoInR1cm5pbmcgb2ZmIG91dHB1dCBmbHVzaGluZyIpOwotCSAgdGlvcC0+Y19sZmxhZyAmPSB+RkxVU0hPOwotCSAgYnJlYWs7Ci0jZWxzZQotCSAgY29udGludWU7Ci0jZW5kaWYKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChfQUlYKQotICBzZXRvcG9zdCh0aW9wKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zZXRfdHR5X3NldHRpbmdzICh0dHksIHRpb3ApCi0gICAgIGludCB0dHk7Ci0gICAgIFRJT1RZUEUgKnRpb3A7Ci17Ci0gIHdoaWxlIChTRVRBVFRSICh0dHksIHRpb3ApIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUlOVFIpCi0JcmV0dXJuIC0xOwotICAgICAgZXJybm8gPSAwOwotICAgIH0KLQotI2lmIDAKLQotI2lmIGRlZmluZWQgKFRFUk1JT1NfVFRZX0RSSVZFUikKLSMgIGlmIGRlZmluZWQgKF9fa3NyMV9fKQotICBpZiAoa3NyZmxvdykKLSAgICB7Ci0gICAgICBrc3JmbG93ID0gMDsKLSAgICAgIHRjZmxvdyAodHR5LCBUQ09PTik7Ci0gICAgfQotIyAgZWxzZSAvKiAha3NyMSAqLwotICB0Y2Zsb3cgKHR0eSwgVENPT04pOwkJLyogU2ltdWxhdGUgYSBeUS4gKi8KLSMgIGVuZGlmIC8qICFrc3IxICovCi0jZWxzZQotICBpb2N0bCAodHR5LCBUQ1hPTkMsIDEpOwkvKiBTaW11bGF0ZSBhIF5RLiAqLwotI2VuZGlmIC8qICFURVJNSU9TX1RUWV9EUklWRVIgKi8KLQotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmVwYXJlX3Rlcm1pbmFsX3NldHRpbmdzIChtZXRhX2ZsYWcsIG90aW8sIHRpb3ApCi0gICAgIGludCBtZXRhX2ZsYWc7Ci0gICAgIFRJT1RZUEUgb3RpbywgKnRpb3A7Ci17Ci0gIHJlYWRsaW5lX2VjaG9pbmdfcCA9IChvdGlvLmNfbGZsYWcgJiBFQ0hPKTsKLQotICB0aW9wLT5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7Ci0KLSAgaWYgKCh1bnNpZ25lZCBjaGFyKSBvdGlvLmNfY2NbVkVPRl0gIT0gKHVuc2lnbmVkIGNoYXIpIF9QT1NJWF9WRElTQUJMRSkKLSAgICBfcmxfZW9mX2NoYXIgPSBvdGlvLmNfY2NbVkVPRl07Ci0KLSNpZiBkZWZpbmVkIChVU0VfWE9OX1hPRkYpCi0jaWYgZGVmaW5lZCAoSVhBTlkpCi0gIHRpb3AtPmNfaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYgfCBJWEFOWSk7Ci0jZWxzZQotICAvKiBgc3RyaWN0JyBQb3NpeCBzeXN0ZW1zIGRvIG5vdCBkZWZpbmUgSVhBTlkuICovCi0gIHRpb3AtPmNfaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYpOwotI2VuZGlmIC8qIElYQU5ZICovCi0jZW5kaWYgLyogVVNFX1hPTl9YT0ZGICovCi0KLSAgLyogT25seSB0dXJuIHRoaXMgb2ZmIGlmIHdlIGFyZSB1c2luZyBhbGwgOCBiaXRzLiAqLwotICBpZiAoKCh0aW9wLT5jX2NmbGFnICYgQ1NJWkUpID09IENTOCkgfHwgbWV0YV9mbGFnKQotICAgIHRpb3AtPmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJTlBDSyk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBDUiBhbmQgTkwgb24gaW5wdXQuICovCi0gIHRpb3AtPmNfaWZsYWcgJj0gfihJQ1JOTCB8IElOTENSKTsKLQotI2lmICFkZWZpbmVkIChIQU5ETEVfU0lHTkFMUykKLSAgdGlvcC0+Y19sZmxhZyAmPSB+SVNJRzsKLSNlbHNlCi0gIHRpb3AtPmNfbGZsYWcgfD0gSVNJRzsKLSNlbmRpZgotCi0gIHRpb3AtPmNfY2NbVk1JTl0gPSAxOwotICB0aW9wLT5jX2NjW1ZUSU1FXSA9IDA7Ci0KLSNpZiBkZWZpbmVkIChGTFVTSE8pCi0gIGlmIChPVVRQVVRfQkVJTkdfRkxVU0hFRCAodGlvcCkpCi0gICAgewotICAgICAgdGlvcC0+Y19sZmxhZyAmPSB+RkxVU0hPOwotICAgICAgb3Rpby5jX2xmbGFnICY9IH5GTFVTSE87Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogVHVybiBvZmYgY2hhcmFjdGVycyB0aGF0IHdlIG5lZWQgb24gUG9zaXggc3lzdGVtcyB3aXRoIGpvYiBjb250cm9sLAotICAgICBqdXN0IHRvIGJlIHN1cmUuICBUaGlzIGluY2x1ZGVzIF5ZIGFuZCBeVi4gIFRoaXMgc2hvdWxkIG5vdCByZWFsbHkKLSAgICAgYmUgbmVjZXNzYXJ5LiAgKi8KLSNpZiBkZWZpbmVkIChURVJNSU9TX1RUWV9EUklWRVIpICYmIGRlZmluZWQgKF9QT1NJWF9WRElTQUJMRSkKLQotI2lmIGRlZmluZWQgKFZMTkVYVCkKLSAgdGlvcC0+Y19jY1tWTE5FWFRdID0gX1BPU0lYX1ZESVNBQkxFOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChWRFNVU1ApCi0gIHRpb3AtPmNfY2NbVkRTVVNQXSA9IF9QT1NJWF9WRElTQUJMRTsKLSNlbmRpZgotCi0jZW5kaWYgLyogVEVSTUlPU19UVFlfRFJJVkVSICYmIF9QT1NJWF9WRElTQUJMRSAqLwotfQotI2VuZGlmICAvKiBORVdfVFRZX0RSSVZFUiAqLwotCi0vKiBQdXQgdGhlIHRlcm1pbmFsIGluIENCUkVBSyBtb2RlIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBrZXkgcHJlc3Nlcy4gKi8KLXZvaWQKLXJsX3ByZXBfdGVybWluYWwgKG1ldGFfZmxhZykKLSAgICAgaW50IG1ldGFfZmxhZzsKLXsKLSNpZiAhZGVmaW5lZCAoX19HTzMyX18pIHx8IGRlZmluZWQgKEhBVkVfVEVSTUlPU19IKQotICBpbnQgdHR5OwotICBUSU9UWVBFIHRpbzsKLQotICBpZiAodGVybWluYWxfcHJlcHBlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIGtlZXAgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIElOVGVycnVwdGVkLiAqLwotICBibG9ja19zaWdpbnQgKCk7Ci0KLSAgdHR5ID0gZmlsZW5vIChybF9pbnN0cmVhbSk7Ci0KLSAgaWYgKGdldF90dHlfc2V0dGluZ3MgKHR0eSwgJnRpbykgPCAwKQotICAgIHsKLSAgICAgIHJlbGVhc2Vfc2lnaW50ICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvdGlvID0gdGlvOwotCi0gIHByZXBhcmVfdGVybWluYWxfc2V0dGluZ3MgKG1ldGFfZmxhZywgb3RpbywgJnRpbyk7Ci0KLSAgaWYgKHNldF90dHlfc2V0dGluZ3MgKHR0eSwgJnRpbykgPCAwKQotICAgIHsKLSAgICAgIHJlbGVhc2Vfc2lnaW50ICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoX3JsX2VuYWJsZV9rZXlwYWQpCi0gICAgX3JsX2NvbnRyb2xfa2V5cGFkICgxKTsKLQotICBmZmx1c2ggKHJsX291dHN0cmVhbSk7Ci0gIHRlcm1pbmFsX3ByZXBwZWQgPSAxOwotCi0gIHJlbGVhc2Vfc2lnaW50ICgpOwotI2VuZGlmIC8qICFfX0dPMzJfXyB8fCBIQVZFX1RFUk1JT1NfSCAqLwotfQotCi0vKiBSZXN0b3JlIHRoZSB0ZXJtaW5hbCdzIG5vcm1hbCBzZXR0aW5ncyBhbmQgbW9kZXMuICovCi12b2lkCi1ybF9kZXByZXBfdGVybWluYWwgKCkKLXsKLSNpZiAhZGVmaW5lZCAoX19HTzMyX18pIHx8IGRlZmluZWQgKEhBVkVfVEVSTUlPU19IKQotICBpbnQgdHR5OwotCi0gIGlmICghdGVybWluYWxfcHJlcHBlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIGtlZXAgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIGludGVycnVwdGVkLiAqLwotICBibG9ja19zaWdpbnQgKCk7Ci0KLSAgdHR5ID0gZmlsZW5vIChybF9pbnN0cmVhbSk7Ci0KLSAgaWYgKF9ybF9lbmFibGVfa2V5cGFkKQotICAgIF9ybF9jb250cm9sX2tleXBhZCAoMCk7Ci0KLSAgZmZsdXNoIChybF9vdXRzdHJlYW0pOwotCi0gIGlmIChzZXRfdHR5X3NldHRpbmdzICh0dHksICZvdGlvKSA8IDApCi0gICAgewotICAgICAgcmVsZWFzZV9zaWdpbnQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHRlcm1pbmFsX3ByZXBwZWQgPSAwOwotCi0gIHJlbGVhc2Vfc2lnaW50ICgpOwotI2VuZGlmIC8qICFfX0dPMzJfXyB8fCBIQVZFX1RFUk1JT1NfSCAqLwotfQotDAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlCb2d1cyBGbG93IENvbnRyb2wgICAgICAJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1pbnQKLXJsX3Jlc3RhcnRfb3V0cHV0IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGZpbGRlcyA9IGZpbGVubyAocmxfb3V0c3RyZWFtKTsKLSNpZiBkZWZpbmVkIChUSU9DU1RBUlQpCi0jaWYgZGVmaW5lZCAoYXBvbGxvKQotICBpb2N0bCAoJmZpbGRlcywgVElPQ1NUQVJULCAwKTsKLSNlbHNlCi0gIGlvY3RsIChmaWxkZXMsIFRJT0NTVEFSVCwgMCk7Ci0jZW5kaWYgLyogYXBvbGxvICovCi0KLSNlbHNlIC8qICFUSU9DU1RBUlQgKi8KLSMgIGlmIGRlZmluZWQgKFRFUk1JT1NfVFRZX0RSSVZFUikKLSMgICAgaWYgZGVmaW5lZCAoX19rc3IxX18pCi0gIGlmIChrc3JmbG93KQotICAgIHsKLSAgICAgIGtzcmZsb3cgPSAwOwotICAgICAgdGNmbG93IChmaWxkZXMsIFRDT09OKTsKLSAgICB9Ci0jICAgIGVsc2UgLyogIWtzcjEgKi8KLSAgdGNmbG93IChmaWxkZXMsIFRDT09OKTsJCS8qIFNpbXVsYXRlIGEgXlEuICovCi0jICAgIGVuZGlmIC8qICFrc3IxICovCi0jICBlbHNlIC8qICFURVJNSU9TX1RUWV9EUklWRVIgKi8KLSMgICAgaWYgZGVmaW5lZCAoVENYT05DKQotICBpb2N0bCAoZmlsZGVzLCBUQ1hPTkMsIFRDT09OKTsKLSMgICAgZW5kaWYgLyogVENYT05DICovCi0jICBlbmRpZiAvKiAhVEVSTUlPU19UVFlfRFJJVkVSICovCi0jZW5kaWYgLyogIVRJT0NTVEFSVCAqLwotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXJsX3N0b3Bfb3V0cHV0IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGZpbGRlcyA9IGZpbGVubyAocmxfaW5zdHJlYW0pOwotCi0jaWYgZGVmaW5lZCAoVElPQ1NUT1ApCi0jIGlmIGRlZmluZWQgKGFwb2xsbykKLSAgaW9jdGwgKCZmaWxkZXMsIFRJT0NTVE9QLCAwKTsKLSMgZWxzZQotICBpb2N0bCAoZmlsZGVzLCBUSU9DU1RPUCwgMCk7Ci0jIGVuZGlmIC8qIGFwb2xsbyAqLwotI2Vsc2UgLyogIVRJT0NTVE9QICovCi0jIGlmIGRlZmluZWQgKFRFUk1JT1NfVFRZX0RSSVZFUikKLSMgIGlmIGRlZmluZWQgKF9fa3NyMV9fKQotICBrc3JmbG93ID0gMTsKLSMgIGVuZGlmIC8qIGtzcjEgKi8KLSAgdGNmbG93IChmaWxkZXMsIFRDT09GRik7Ci0jIGVsc2UKLSMgICBpZiBkZWZpbmVkIChUQ1hPTkMpCi0gIGlvY3RsIChmaWxkZXMsIFRDWE9OQywgVENPT04pOwotIyAgIGVuZGlmIC8qIFRDWE9OQyAqLwotIyBlbmRpZiAvKiAhVEVSTUlPU19UVFlfRFJJVkVSICovCi0jZW5kaWYgLyogIVRJT0NTVE9QICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJRGVmYXVsdCBLZXkgQmluZGluZ3MJCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLXJsdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzIChrbWFwKQotICAgICBLZXltYXAga21hcDsKLXsKLSAgVElPVFlQRSB0dHlidWZmOwotICBpbnQgdHR5ID0gZmlsZW5vIChybF9pbnN0cmVhbSk7Ci0KLSNpZiBkZWZpbmVkIChORVdfVFRZX0RSSVZFUikKLQotI2RlZmluZSBTRVRfU1BFQ0lBTChzYywgZnVuYykgXAotICBkbyBcCi0gICAgeyBcCi0gICAgICBpbnQgaWM7IFwKLSAgICAgIGljID0gc2M7IFwKLSAgICAgIGlmIChpYyAhPSAtMSAmJiBrbWFwW2ljXS50eXBlID09IElTRlVOQykgXAotCWttYXBbaWNdLmZ1bmN0aW9uID0gZnVuYzsgXAotICAgIH0gXAotICB3aGlsZSAoMCkKLQotICBpZiAoZ2V0X3R0eV9zZXR0aW5ncyAodHR5LCAmdHR5YnVmZikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodHR5YnVmZi5mbGFncyAmIFNHVFRZX1NFVCkKLQl7Ci0JICBTRVRfU1BFQ0lBTCAodHR5YnVmZi5zZ3R0eWIuc2dfZXJhc2UsIHJsX3J1Ym91dCk7Ci0JICBTRVRfU1BFQ0lBTCAodHR5YnVmZi5zZ3R0eWIuc2dfa2lsbCwgcmxfdW5peF9saW5lX2Rpc2NhcmQpOwotCX0KLQotIyAgaWYgZGVmaW5lZCAoVElPQ0dMVEMpCi0gICAgICBpZiAodHR5YnVmZi5mbGFncyAmIExUQ0hBUlNfU0VUKQotCXsKLQkgIFNFVF9TUEVDSUFMICh0dHlidWZmLmx0Y2hhcnMudF93ZXJhc2MsIHJsX3VuaXhfd29yZF9ydWJvdXQpOwotCSAgU0VUX1NQRUNJQUwgKHR0eWJ1ZmYubHRjaGFycy50X2xuZXh0YywgcmxfcXVvdGVkX2luc2VydCk7Ci0JfQotIyAgZW5kaWYgLyogVElPQ0dMVEMgKi8KLSAgICB9Ci0KLSNlbHNlIC8qICFORVdfVFRZX0RSSVZFUiAqLwotCi0jZGVmaW5lIFNFVF9TUEVDSUFMKHNjLCBmdW5jKSBcCi0gIGRvIFwKLSAgICB7IFwKLSAgICAgIHVuc2lnbmVkIGNoYXIgdWM7IFwKLSAgICAgIHVjID0gdHR5YnVmZi5jX2NjW3NjXTsgXAotICAgICAgaWYgKHVjICE9ICh1bnNpZ25lZCBjaGFyKV9QT1NJWF9WRElTQUJMRSAmJiBrbWFwW3VjXS50eXBlID09IElTRlVOQykgXAotCWttYXBbdWNdLmZ1bmN0aW9uID0gZnVuYzsgXAotICAgIH0gXAotICB3aGlsZSAoMCkKLQotICBpZiAoZ2V0X3R0eV9zZXR0aW5ncyAodHR5LCAmdHR5YnVmZikgPT0gMCkKLSAgICB7Ci0gICAgICBTRVRfU1BFQ0lBTCAoVkVSQVNFLCBybF9ydWJvdXQpOwotICAgICAgU0VUX1NQRUNJQUwgKFZLSUxMLCBybF91bml4X2xpbmVfZGlzY2FyZCk7Ci0KLSMgIGlmIGRlZmluZWQgKFZMTkVYVCkgJiYgZGVmaW5lZCAoVEVSTUlPU19UVFlfRFJJVkVSKQotICAgICAgU0VUX1NQRUNJQUwgKFZMTkVYVCwgcmxfcXVvdGVkX2luc2VydCk7Ci0jICBlbmRpZiAvKiBWTE5FWFQgJiYgVEVSTUlPU19UVFlfRFJJVkVSICovCi0KLSMgIGlmIGRlZmluZWQgKFZXRVJBU0UpICYmIGRlZmluZWQgKFRFUk1JT1NfVFRZX0RSSVZFUikKLSAgICAgIFNFVF9TUEVDSUFMIChWV0VSQVNFLCBybF91bml4X3dvcmRfcnVib3V0KTsKLSMgIGVuZGlmIC8qIFZXRVJBU0UgJiYgVEVSTUlPU19UVFlfRFJJVkVSICovCi0gICAgfQotI2VuZGlmIC8qICFORVdfVFRZX0RSSVZFUiAqLwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvcmx0dHkuaCBiL3JlYWRsaW5lL3JsdHR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzgzNDYuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcmx0dHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIHJsdHR5LmggLSB0dHkgZHJpdmVyLXJlbGF0ZWQgZGVmaW5pdGlvbnMgdXNlZCBieSBzb21lIGxpYnJhcnkgZmlsZXMuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBSZWFkbGluZSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgcHJvdmlkaW5nIEVtYWNzIHN0eWxlIGxpbmUgaW5wdXQgdG8gcHJvZ3JhbXMgdGhhdCBhc2sKLSAgIGZvciBpdC4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmICFkZWZpbmVkIChfUkxUVFlfSF8pCi0jZGVmaW5lIF9STFRUWV9ICi0KLS8qIFBvc2l4IHN5c3RlbXMgdXNlIHRlcm1pb3MgYW5kIHRoZSBQb3NpeCBzaWduYWwgZnVuY3Rpb25zLiAqLwotI2lmIGRlZmluZWQgKFRFUk1JT1NfVFRZX0RSSVZFUikKLSMgIGluY2x1ZGUgPHRlcm1pb3MuaD4KLSNlbmRpZiAvKiBURVJNSU9TX1RUWV9EUklWRVIgKi8KLQotLyogU3lzdGVtIFYgbWFjaGluZXMgdXNlIHRlcm1pby4gKi8KLSNpZiBkZWZpbmVkIChURVJNSU9fVFRZX0RSSVZFUikKLSMgIGluY2x1ZGUgPHRlcm1pby5oPgotIyAgaWYgIWRlZmluZWQgKFRDT09OKQotIyAgICBkZWZpbmUgVENPT04gMQotIyAgZW5kaWYKLSNlbmRpZiAvKiBURVJNSU9fVFRZX0RSSVZFUiAqLwotCi0vKiBPdGhlciAoQlNEKSBtYWNoaW5lcyB1c2Ugc2d0dHkuICovCi0jaWYgZGVmaW5lZCAoTkVXX1RUWV9EUklWRVIpCi0jICBpbmNsdWRlIDxzZ3R0eS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJybHdpbnNpemUuaCIKLQotLyogRGVmaW5lIF9QT1NJWF9WRElTQUJMRSBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBgbmV3JyB0dHkgZHJpdmVyIGFuZAotICAgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZC4gIEl0IGlzIHVzZWQgYm90aCB0byBkZXRlcm1pbmUgaWYgYQotICAgc3BlY2lhbCBjaGFyYWN0ZXIgaXMgZGlzYWJsZWQgYW5kIHRvIGRpc2FibGUgY2VydGFpbiBzcGVjaWFsCi0gICBjaGFyYWN0ZXJzLiAgUG9zaXggc3lzdGVtcyBzaG91bGQgc2V0IHRvIDAsIFVTRyBzeXN0ZW1zIHRvIC0xLiAqLwotI2lmICFkZWZpbmVkIChORVdfVFRZX0RSSVZFUikgJiYgIWRlZmluZWQgKF9QT1NJWF9WRElTQUJMRSkKLSMgIGlmIGRlZmluZWQgKF9TVlI0X1ZESVNBQkxFKQotIyAgICBkZWZpbmUgX1BPU0lYX1ZESVNBQkxFIF9TVlI0X1ZESVNBQkxFCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKF9QT1NJWF9WRVJTSU9OKQotIyAgICAgIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgMAotIyAgICBlbHNlIC8qICFfUE9TSVhfVkVSU0lPTiAqLwotIyAgICAgIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgLTEKLSMgICAgZW5kaWYgLyogIV9QT1NJWF9WRVJTSU9OICovCi0jICBlbmRpZiAvKiAhX1NWUjRfRElTQUJMRSAqLwotI2VuZGlmIC8qICFORVdfVFRZX0RSSVZFUiAmJiAhX1BPU0lYX1ZESVNBQkxFICovCi0KLSNlbmRpZiAvKiBfUkxUVFlfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3Jsd2luc2l6ZS5oIGIvcmVhZGxpbmUvcmx3aW5zaXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjNkZTEuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvcmx3aW5zaXplLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBybHdpbnNpemUuaCAtLSBhbiBhdHRlbXB0IHRvIGlzb2xhdGUgc29tZSBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIGRlZmluZXMKLSAgIGZvciBgc3RydWN0IHdpbnNpemUnIGFuZCBUSU9DR1dJTlNaLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUmVhZGxpbmUgTGlicmFyeSAodGhlIExpYnJhcnkpLCBhIHNldCBvZgotICAgcm91dGluZXMgZm9yIHByb3ZpZGluZyBFbWFjcyBzdHlsZSBsaW5lIGlucHV0IHRvIHByb2dyYW1zIHRoYXQgYXNrCi0gICBmb3IgaXQuCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLSNpZiAhZGVmaW5lZCAoX1JMV0lOU0laRV9IXykKLSNkZWZpbmUgX1JMV0lOU0laRV9IXwotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLS8qIFRyeSB0byBmaW5kIHRoZSBkZWZpbml0aW9ucyBvZiBgc3RydWN0IHdpbnNpemUnIGFuZCBUSU9HQ1dJTlNaICovCi0KLSNpZiBkZWZpbmVkIChHV0lOU1pfSU5fU1lTX0lPQ1RMKSAmJiAhZGVmaW5lZCAoVElPQ0dXSU5TWikKLSMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2VuZGlmIC8qIEdXSU5TWl9JTl9TWVNfSU9DVEwgJiYgIVRJT0NHV0lOU1ogKi8KLQotI2lmIGRlZmluZWQgKFNUUlVDVF9XSU5TSVpFX0lOX1RFUk1JT1MpICYmICFkZWZpbmVkIChTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwpCi0jICBpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jZW5kaWYgLyogU1RSVUNUX1dJTlNJWkVfSU5fVEVSTUlPUyAmJiAhU1RSVUNUX1dJTlNJWkVfSU5fU1lTX0lPQ1RMICovCi0KLS8qIE5vdCBpbiBlaXRoZXIgb2YgdGhlIHN0YW5kYXJkIHBsYWNlcywgbG9vayBhcm91bmQuICovCi0jaWYgIWRlZmluZWQgKFNUUlVDVF9XSU5TSVpFX0lOX1RFUk1JT1MpICYmICFkZWZpbmVkIChTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwpCi0jICBpZiBkZWZpbmVkIChIQVZFX1NZU19TVFJFQU1fSCkKLSMgICAgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgotIyAgZW5kaWYgLyogSEFWRV9TWVNfU1RSRUFNX0ggKi8KLSMgIGlmIGRlZmluZWQgKEhBVkVfU1lTX1BURU1fSCkgLyogU1ZSNC4yLCBhdCBsZWFzdCwgaGFzIGl0IGhlcmUgKi8KLSMgICAgaW5jbHVkZSA8c3lzL3B0ZW0uaD4KLSMgICAgZGVmaW5lIF9JT19QVEVNX0ggICAgICAgICAgLyogd29yayBhcm91bmQgU1ZSNC4yIDEuMS40IGJ1ZyAqLwotIyAgZW5kaWYgLyogSEFWRV9TWVNfUFRFTV9IICovCi0jICBpZiBkZWZpbmVkIChIQVZFX1NZU19QVEVfSCkgIC8qID8/PyAqLwotIyAgICBpbmNsdWRlIDxzeXMvcHRlLmg+Ci0jICBlbmRpZiAvKiBIQVZFX1NZU19QVEVfSCAqLwotI2VuZGlmIC8qICFTVFJVQ1RfV0lOU0laRV9JTl9URVJNSU9TICYmICFTVFJVQ1RfV0lOU0laRV9JTl9TWVNfSU9DVEwgKi8KLQotI2VuZGlmIC8qIF9STF9XSU5TSVpFX0ggKi8KLQotCmRpZmYgLS1naXQgYS9yZWFkbGluZS9zYXZlc3RyaW5nLmMgYi9yZWFkbGluZS9zYXZlc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTNhODcuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvc2F2ZXN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogc2F2ZXN0cmluZy5jICAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSwgYSBsaWJyYXJ5IGZvcgotICAgcmVhZGluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICAgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIG9mdGVuIHNoaXBwZWQgd2l0aCBHTlUgc29mdHdhcmUsIGFuZAotICAgaXMgZ2VuZXJhbGx5IGtlcHQgaW4gYSBmaWxlIGNhbGxlZCBDT1BZSU5HIG9yIExJQ0VOU0UuICBJZiB5b3UgZG8gbm90Ci0gICBoYXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi1leHRlcm4gY2hhciAqc3RyY3B5ICgpOwotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci0KLS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBub3cgdGhhdCBzYXZlc3RyaW5nIGhhcyBiZWVuIHJlbW92ZWQgZnJvbQotICAgYWxsIGBwdWJsaWMnIHJlYWRsaW5lIGhlYWRlciBmaWxlcy4gKi8KLWNoYXIgKgotc2F2ZXN0cmluZyAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmV0dXJuICgoY2hhciAqKXN0cmNweSAoeG1hbGxvYyAoMSArIChpbnQpc3RybGVuIChzKSksIChzKSkpOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc2VhcmNoLmMgYi9yZWFkbGluZS9zZWFyY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3NmUxYS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9zZWFyY2guYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKiBzZWFyY2guYyAtIGNvZGUgZm9yIG5vbi1pbmNyZW1lbnRhbCBzZWFyY2hpbmcgaW4gZW1hY3MgYW5kIHZpIG1vZGVzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZWFkbGluZSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgcHJvdmlkaW5nIEVtYWNzIHN0eWxlIGxpbmUgaW5wdXQgdG8gcHJvZ3JhbXMgdGhhdCBhc2sKLSAgIGZvciBpdC4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0jaW5jbHVkZSAicmVhZGxpbmUuaCIKLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0KLSNpZmRlZiBhYnMKLSMgIHVuZGVmIGFicwotI2VuZGlmCi0jZGVmaW5lIGFicyh4KQkJKCgoeCkgPj0gMCkgPyAoeCkgOiAtKHgpKQotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKSwgKnhyZWFsbG9jICgpOwotCi0vKiBWYXJpYWJsZXMgaW1wb3J0ZWQgZnJvbSByZWFkbGluZS5jICovCi1leHRlcm4gaW50IHJsX3BvaW50LCBybF9lbmQsIHJsX2xpbmVfYnVmZmVyX2xlbjsKLWV4dGVybiBpbnQgcmxfZWRpdGluZ19tb2RlOwotZXh0ZXJuIGNoYXIgKnJsX3Byb21wdDsKLWV4dGVybiBjaGFyICpybF9saW5lX2J1ZmZlcjsKLWV4dGVybiBISVNUX0VOVFJZICpzYXZlZF9saW5lX2Zvcl9oaXN0b3J5OwotZXh0ZXJuIEZ1bmN0aW9uICpybF9sYXN0X2Z1bmM7Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBsaWJyYXJ5LiAqLwotZXh0ZXJuIGludCBfcmxfZnJlZV9oaXN0b3J5X2VudHJ5ICgpOwotZXh0ZXJuIGNoYXIgKl9ybF9tYWtlX3Byb21wdF9mb3Jfc2VhcmNoICgpOwotZXh0ZXJuIHZvaWQgcmxfZXh0ZW5kX2xpbmVfYnVmZmVyICgpOwotCi1zdGF0aWMgY2hhciAqbm9uaW5jX3NlYXJjaF9zdHJpbmcgPSAoY2hhciAqKSBOVUxMOwotc3RhdGljIGludCBub25pbmNfaGlzdG9yeV9wb3M7Ci1zdGF0aWMgY2hhciAqcHJldl9saW5lX2ZvdW5kID0gKGNoYXIgKikgTlVMTDsKLQotLyogU2VhcmNoIHRoZSBoaXN0b3J5IGxpc3QgZm9yIFNUUklORyBzdGFydGluZyBhdCBhYnNvbHV0ZSBoaXN0b3J5IHBvc2l0aW9uCi0gICBQT1MuICBJZiBTVFJJTkcgYmVnaW5zIHdpdGggYF4nLCB0aGUgc2VhcmNoIG11c3QgbWF0Y2ggU1RSSU5HIGF0IHRoZQotICAgYmVnaW5uaW5nIG9mIGEgaGlzdG9yeSBsaW5lLCBvdGhlcndpc2UgYSBmdWxsIHN1YnN0cmluZyBtYXRjaCBpcyBwZXJmb3JtZWQKLSAgIGZvciBTVFJJTkcuICBESVIgPCAwIG1lYW5zIHRvIHNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0LAotICAgRElSID49IDAgbWVhbnMgdG8gc2VhcmNoIGZvcndhcmQuICovCi1zdGF0aWMgaW50Ci1ub25pbmNfc2VhcmNoX2Zyb21fcG9zIChzdHJpbmcsIHBvcywgZGlyKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBwb3MsIGRpcjsKLXsKLSAgaW50IHJldCwgb2xkOwotCi0gIG9sZCA9IHdoZXJlX2hpc3RvcnkgKCk7Ci0gIGhpc3Rvcnlfc2V0X3BvcyAocG9zKTsKLQotICBpZiAoKnN0cmluZyA9PSAnXicpCi0gICAgcmV0ID0gaGlzdG9yeV9zZWFyY2hfcHJlZml4IChzdHJpbmcgKyAxLCBkaXIpOwotICBlbHNlCi0gICAgcmV0ID0gaGlzdG9yeV9zZWFyY2ggKHN0cmluZywgZGlyKTsKLQotICBpZiAocmV0ICE9IC0xKQotICAgIHJldCA9IHdoZXJlX2hpc3RvcnkgKCk7Ci0KLSAgaGlzdG9yeV9zZXRfcG9zIChvbGQpOwotICByZXR1cm4gKHJldCk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBsaW5lIGluIHRoZSBoaXN0b3J5IGNvbnRhaW5pbmcgU1RSSU5HLiAgSWYgRElSIGlzIDwgMCwgdGhlCi0gICBzZWFyY2ggaXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXMgZW50cmllcywgZWxzZSB0aHJvdWdoIHN1YnNlcXVlbnQKLSAgIGVudHJpZXMuICovCi1zdGF0aWMgdm9pZAotbm9uaW5jX2Rvc2VhcmNoIChzdHJpbmcsIGRpcikKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZGlyOwotewotICBpbnQgb2xkcG9zLCBwb3MsIGxpbmVfbGVuOwotICBISVNUX0VOVFJZICplbnRyeTsKLQotICBpZiAoc3RyaW5nID09IDAgfHwgKnN0cmluZyA9PSAnXDAnIHx8IG5vbmluY19oaXN0b3J5X3BvcyA8IDApCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcG9zID0gbm9uaW5jX3NlYXJjaF9mcm9tX3BvcyAoc3RyaW5nLCBub25pbmNfaGlzdG9yeV9wb3MgKyBkaXIsIGRpcik7Ci0gIGlmIChwb3MgPT0gLTEpCi0gICAgewotICAgICAgLyogU2VhcmNoIGZhaWxlZCwgY3VycmVudCBoaXN0b3J5IHBvc2l0aW9uIHVuY2hhbmdlZC4gKi8KLSAgICAgIG1heWJlX3Vuc2F2ZV9saW5lICgpOwotICAgICAgcmxfY2xlYXJfbWVzc2FnZSAoKTsKLSAgICAgIHJsX3BvaW50ID0gMDsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5vbmluY19oaXN0b3J5X3BvcyA9IHBvczsKLQotICBvbGRwb3MgPSB3aGVyZV9oaXN0b3J5ICgpOwotICBoaXN0b3J5X3NldF9wb3MgKG5vbmluY19oaXN0b3J5X3Bvcyk7Ci0gIGVudHJ5ID0gY3VycmVudF9oaXN0b3J5ICgpOwotI2lmIGRlZmluZWQgKFZJX01PREUpCi0gIGlmIChybF9lZGl0aW5nX21vZGUgIT0gdmlfbW9kZSkKLSNlbmRpZgotICBoaXN0b3J5X3NldF9wb3MgKG9sZHBvcyk7Ci0KLSAgbGluZV9sZW4gPSBzdHJsZW4gKGVudHJ5LT5saW5lKTsKLSAgaWYgKGxpbmVfbGVuID49IHJsX2xpbmVfYnVmZmVyX2xlbikKLSAgICBybF9leHRlbmRfbGluZV9idWZmZXIgKGxpbmVfbGVuKTsKLSAgc3RyY3B5IChybF9saW5lX2J1ZmZlciwgZW50cnktPmxpbmUpOwotCi0gIHJsX3VuZG9fbGlzdCA9IChVTkRPX0xJU1QgKillbnRyeS0+ZGF0YTsKLSAgcmxfZW5kID0gc3RybGVuIChybF9saW5lX2J1ZmZlcik7Ci0gIHJsX3BvaW50ID0gMDsKLSAgcmxfY2xlYXJfbWVzc2FnZSAoKTsKLQotICBpZiAoc2F2ZWRfbGluZV9mb3JfaGlzdG9yeSkKLSAgICBfcmxfZnJlZV9oaXN0b3J5X2VudHJ5IChzYXZlZF9saW5lX2Zvcl9oaXN0b3J5KTsKLSAgc2F2ZWRfbGluZV9mb3JfaGlzdG9yeSA9IChISVNUX0VOVFJZICopTlVMTDsKLX0KLQotLyogU2VhcmNoIG5vbi1pbnRlcmFjdGl2ZWx5IHRocm91Z2ggdGhlIGhpc3RvcnkgbGlzdC4gIERJUiA8IDAgbWVhbnMgdG8KLSAgIHNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgaGlzdG9yeSBvZiBwcmV2aW91cyBjb21tYW5kczsgb3RoZXJ3aXNlCi0gICB0aGUgc2VhcmNoIGlzIGZvciBjb21tYW5kcyBzdWJzZXF1ZW50IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZQotICAgaGlzdG9yeSBsaXN0LiAgUENIQVIgaXMgdGhlIGNoYXJhY3RlciB0byB1c2UgZm9yIHByb21wdGluZyB3aGVuIHJlYWRpbmcKLSAgIHRoZSBzZWFyY2ggc3RyaW5nOyBpZiBub3Qgc3BlY2lmaWVkICgwKSwgaXQgZGVmYXVsdHMgdG8gYDonLiAqLwotc3RhdGljIHZvaWQKLW5vbmluY19zZWFyY2ggKGRpciwgcGNoYXIpCi0gICAgIGludCBkaXI7Ci0gICAgIGludCBwY2hhcjsKLXsKLSAgaW50IHNhdmVkX3BvaW50LCBjOwotICBjaGFyICpwOwotCi0gIG1heWJlX3NhdmVfbGluZSAoKTsKLSAgc2F2ZWRfcG9pbnQgPSBybF9wb2ludDsKLQotICAvKiBVc2UgdGhlIGxpbmUgYnVmZmVyIHRvIHJlYWQgdGhlIHNlYXJjaCBzdHJpbmcuICovCi0gIHJsX2xpbmVfYnVmZmVyWzBdID0gMDsKLSAgcmxfZW5kID0gcmxfcG9pbnQgPSAwOwotCi0gIHAgPSBfcmxfbWFrZV9wcm9tcHRfZm9yX3NlYXJjaCAocGNoYXIgPyBwY2hhciA6ICc6Jyk7Ci0gIHJsX21lc3NhZ2UgKHAsIDAsIDApOwotICBmcmVlIChwKTsKLQotI2RlZmluZSBTRUFSQ0hfUkVUVVJOIHJsX3Jlc3RvcmVfcHJvbXB0ICgpOyByZXR1cm4KLQotICAvKiBSZWFkIHRoZSBzZWFyY2ggc3RyaW5nLiAqLwotICB3aGlsZSAoYyA9IHJsX3JlYWRfa2V5ICgpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSBDVFJMKCdIJyk6Ci0JY2FzZSBSVUJPVVQ6Ci0JICBpZiAocmxfcG9pbnQgPT0gMCkKLQkgICAgewotCSAgICAgIG1heWJlX3Vuc2F2ZV9saW5lICgpOwotCSAgICAgIHJsX2NsZWFyX21lc3NhZ2UgKCk7Ci0JICAgICAgcmxfcG9pbnQgPSBzYXZlZF9wb2ludDsKLQkgICAgICBTRUFSQ0hfUkVUVVJOOwotCSAgICB9Ci0JICBybF9ydWJvdXQgKDEsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIENUUkwoJ1cnKToKLQkgIHJsX3VuaXhfd29yZF9ydWJvdXQgKDEsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIENUUkwoJ1UnKToKLQkgIHJsX3VuaXhfbGluZV9kaXNjYXJkICgxLCBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRVRVUk46Ci0JY2FzZSBORVdMSU5FOgotCSAgZ290byBkb3NlYXJjaDsKLQkgIC8qIE5PVFJFQUNIRUQgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDVFJMKCdDJyk6Ci0JY2FzZSBDVFJMKCdHJyk6Ci0JICBtYXliZV91bnNhdmVfbGluZSAoKTsKLQkgIHJsX2NsZWFyX21lc3NhZ2UgKCk7Ci0JICBybF9wb2ludCA9IHNhdmVkX3BvaW50OwotCSAgZGluZyAoKTsKLQkgIFNFQVJDSF9SRVRVUk47Ci0KLQlkZWZhdWx0OgotCSAgcmxfaW5zZXJ0ICgxLCBjKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICgqcmxfcmVkaXNwbGF5X2Z1bmN0aW9uKSAoKTsKLSAgICB9Ci0KLSBkb3NlYXJjaDoKLSAgLyogSWYgcmxfcG9pbnQgPT0gMCwgd2Ugd2FudCB0byByZS11c2UgdGhlIHByZXZpb3VzIHNlYXJjaCBzdHJpbmcgYW5kCi0gICAgIHN0YXJ0IGZyb20gdGhlIHNhdmVkIGhpc3RvcnkgcG9zaXRpb24uICBJZiB0aGVyZSdzIG5vIHByZXZpb3VzIHNlYXJjaAotICAgICBzdHJpbmcsIHB1bnQuICovCi0gIGlmIChybF9wb2ludCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghbm9uaW5jX3NlYXJjaF9zdHJpbmcpCi0JewotCSAgZGluZyAoKTsKLQkgIFNFQVJDSF9SRVRVUk47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHdhbnQgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tIHRoZSBjdXJyZW50IGhpc3RvcnkgcG9zaXRpb24uICovCi0gICAgICBub25pbmNfaGlzdG9yeV9wb3MgPSB3aGVyZV9oaXN0b3J5ICgpOwotICAgICAgaWYgKG5vbmluY19zZWFyY2hfc3RyaW5nKQotCWZyZWUgKG5vbmluY19zZWFyY2hfc3RyaW5nKTsKLSAgICAgIG5vbmluY19zZWFyY2hfc3RyaW5nID0gc2F2ZXN0cmluZyAocmxfbGluZV9idWZmZXIpOwotICAgIH0KLQotICBybF9yZXN0b3JlX3Byb21wdCAoKTsKLSAgbm9uaW5jX2Rvc2VhcmNoIChub25pbmNfc2VhcmNoX3N0cmluZywgZGlyKTsKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0IGZvciBhIHN0cmluZy4gIElmIHRoZSB2aS1tb2RlCi0gICBjb2RlIGNhbGxzIHRoaXMsIEtFWSB3aWxsIGJlIGA/Jy4gKi8KLWludAotcmxfbm9uaW5jX2ZvcndhcmRfc2VhcmNoIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgbm9uaW5jX3NlYXJjaCAoMSwgKGtleSA9PSAnPycpID8gJz8nIDogMCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXZlcnNlIHNlYXJjaCB0aGUgaGlzdG9yeSBsaXN0IGZvciBhIHN0cmluZy4gIElmIHRoZSB2aS1tb2RlIGNvZGUKLSAgIGNhbGxzIHRoaXMsIEtFWSB3aWxsIGJlIGAvJy4gKi8KLWludAotcmxfbm9uaW5jX3JldmVyc2Vfc2VhcmNoIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgbm9uaW5jX3NlYXJjaCAoLTEsIChrZXkgPT0gJy8nKSA/ICcvJyA6IDApOwotICByZXR1cm4gMDsKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0IGZvciB0aGUgbGFzdCBzdHJpbmcgc2VhcmNoZWQKLSAgIGZvci4gIElmIHRoZXJlIGlzIG5vIHNhdmVkIHNlYXJjaCBzdHJpbmcsIGFib3J0LiAqLwotaW50Ci1ybF9ub25pbmNfZm9yd2FyZF9zZWFyY2hfYWdhaW4gKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoIW5vbmluY19zZWFyY2hfc3RyaW5nKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0gIG5vbmluY19kb3NlYXJjaCAobm9uaW5jX3NlYXJjaF9zdHJpbmcsIDEpOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV2ZXJzZSBzZWFyY2ggaW4gdGhlIGhpc3RvcnkgbGlzdCBmb3IgdGhlIGxhc3Qgc3RyaW5nIHNlYXJjaGVkCi0gICBmb3IuICBJZiB0aGVyZSBpcyBubyBzYXZlZCBzZWFyY2ggc3RyaW5nLCBhYm9ydC4gKi8KLWludAotcmxfbm9uaW5jX3JldmVyc2Vfc2VhcmNoX2FnYWluIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKCFub25pbmNfc2VhcmNoX3N0cmluZykKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBub25pbmNfZG9zZWFyY2ggKG5vbmluY19zZWFyY2hfc3RyaW5nLCAtMSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ybF9oaXN0b3J5X3NlYXJjaF9pbnRlcm5hbCAoY291bnQsIGRpcmVjdGlvbikKLSAgICAgaW50IGNvdW50LCBkaXJlY3Rpb247Ci17Ci0gIEhJU1RfRU5UUlkgKnRlbXAsICpvbGRfdGVtcDsKLSAgaW50IGxpbmVfbGVuOwotCi0gIG1heWJlX3NhdmVfbGluZSAoKTsKLQotICB0ZW1wID0gb2xkX3RlbXAgPSAoSElTVF9FTlRSWSAqKU5VTEw7Ci0gIHdoaWxlIChjb3VudCkKLSAgICB7Ci0gICAgICB0ZW1wID0gKGRpcmVjdGlvbiA8IDApID8gcHJldmlvdXNfaGlzdG9yeSAoKSA6IG5leHRfaGlzdG9yeSAoKTsKLSAgICAgIGlmICh0ZW1wID09IDApCi0gICAgICAgIGJyZWFrOwotICAgICAgLyogT24gYW4gZW1wdHkgcHJlZml4LCBtYWtlIHRoaXMgdGhlIHNhbWUgYXMgcHJldmlvdXMtaGlzdG9yeS4gKi8KLSAgICAgIGlmIChybF9wb2ludCA9PSAwKQotCXsKLQkgIGNvdW50LS07Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoU1RSRVFOIChybF9saW5lX2J1ZmZlciwgdGVtcC0+bGluZSwgcmxfcG9pbnQpKQotCXsKLQkgIC8qIERvbid0IGZpbmQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGxpbmUuICovCi0JICBpZiAocHJldl9saW5lX2ZvdW5kICYmIFNUUkVRIChwcmV2X2xpbmVfZm91bmQsIHRlbXAtPmxpbmUpKQotCSAgICBjb250aW51ZTsKLSAgICAgICAgICBpZiAoZGlyZWN0aW9uIDwgMCkKLSAgICAgICAgICAgIG9sZF90ZW1wID0gdGVtcDsKLSAgICAgICAgICBwcmV2X2xpbmVfZm91bmQgPSB0ZW1wLT5saW5lOwotICAgICAgICAgIGNvdW50LS07Ci0JfQotICAgIH0KLQotICBpZiAodGVtcCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkaXJlY3Rpb24gPCAwICYmIG9sZF90ZW1wKQotCXRlbXAgPSBvbGRfdGVtcDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYXliZV91bnNhdmVfbGluZSAoKTsKLQkgIGRpbmcgKCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotCi0gIGxpbmVfbGVuID0gc3RybGVuICh0ZW1wLT5saW5lKTsKLSAgaWYgKGxpbmVfbGVuID49IHJsX2xpbmVfYnVmZmVyX2xlbikKLSAgICBybF9leHRlbmRfbGluZV9idWZmZXIgKGxpbmVfbGVuKTsKLSAgc3RyY3B5IChybF9saW5lX2J1ZmZlciwgdGVtcC0+bGluZSk7Ci0gIHJsX3VuZG9fbGlzdCA9IChVTkRPX0xJU1QgKil0ZW1wLT5kYXRhOwotICBybF9lbmQgPSBsaW5lX2xlbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlYXJjaCBmb3J3YXJkIGluIHRoZSBoaXN0b3J5IGZvciB0aGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMKLSAgIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRvIHJsX3BvaW50LiAgVGhpcyBpcyBhIG5vbi1pbmNyZW1lbnRhbAotICAgc2VhcmNoLiAqLwotaW50Ci1ybF9oaXN0b3J5X3NlYXJjaF9mb3J3YXJkIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuICgwKTsKLSAgaWYgKHJsX2xhc3RfZnVuYyAhPSBybF9oaXN0b3J5X3NlYXJjaF9mb3J3YXJkKQotICAgIHByZXZfbGluZV9mb3VuZCA9IChjaGFyICopTlVMTDsKLSAgcmV0dXJuIChybF9oaXN0b3J5X3NlYXJjaF9pbnRlcm5hbCAoYWJzIChjb3VudCksIChjb3VudCA+IDApID8gMSA6IC0xKSk7Ci19Ci0KLS8qIFNlYXJjaCBiYWNrd2FyZCB0aHJvdWdoIHRoZSBoaXN0b3J5IGZvciB0aGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMKLSAgIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRvIHJsX3BvaW50LiAgVGhpcyBpcyBhIG5vbi1pbmNyZW1lbnRhbAotICAgc2VhcmNoLiAqLwotaW50Ci1ybF9oaXN0b3J5X3NlYXJjaF9iYWNrd2FyZCAoY291bnQsIGlnbm9yZSkKLSAgICAgaW50IGNvdW50LCBpZ25vcmU7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiAoMCk7Ci0gIGlmIChybF9sYXN0X2Z1bmMgIT0gcmxfaGlzdG9yeV9zZWFyY2hfYmFja3dhcmQpCi0gICAgcHJldl9saW5lX2ZvdW5kID0gKGNoYXIgKilOVUxMOwotICByZXR1cm4gKHJsX2hpc3Rvcnlfc2VhcmNoX2ludGVybmFsIChhYnMgKGNvdW50KSwgKGNvdW50ID4gMCkgPyAtMSA6IDEpKTsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3NoZWxsLmMgYi9yZWFkbGluZS9zaGVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGRkYzg5Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3NoZWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogc2hlbGwuYyAtLSByZWFkbGluZSB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSBub3JtYWxseSBwcm92aWRlZCBieQotCSAgICAgIGJhc2ggd2hlbiByZWFkbGluZSBpcyBsaW5rZWQgYXMgcGFydCBvZiB0aGUgc2hlbGwuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmIC8qICFIQVZFX1NUUklOR19IICovCi0KLSNpbmNsdWRlIDxwd2QuaD4KLQotI2lmICFkZWZpbmVkIChIQVZFX0dFVFBXX0RFQ0xTKQotZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3dWlkICgpOwotI2VuZGlmIC8qICFIQVZFX0dFVFBXX0RFQ0xTICovCi0KLWV4dGVybiBjaGFyICp4bWFsbG9jICgpOwotCi0vKiBBbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSByZXNvbHZlZCBmcm9tIGJhc2ggaWYgd2UgYXJlIGxpbmtpbmcgcmVhZGxpbmUKLSAgIGFzIHBhcnQgb2YgYmFzaC4gKi8KLQotLyogRG9lcyBzaGVsbC1saWtlIHF1b3RpbmcgdXNpbmcgc2luZ2xlIHF1b3Rlcy4gKi8KLWNoYXIgKgotc2luZ2xlX3F1b3RlIChzdHJpbmcpCi0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIGNoYXIgKnJlc3VsdCwgKnIsICpzOwotCi0gIHJlc3VsdCA9IChjaGFyICopeG1hbGxvYyAoMyArICgzICogc3RybGVuIChzdHJpbmcpKSk7Ci0gIHIgPSByZXN1bHQ7Ci0gICpyKysgPSAnXCcnOwotCi0gIGZvciAocyA9IHN0cmluZzsgcyAmJiAoYyA9ICpzKTsgcysrKQotICAgIHsKLSAgICAgICpyKysgPSBjOwotCi0gICAgICBpZiAoYyA9PSAnXCcnKQotCXsKLQkgICpyKysgPSAnXFwnOwkvKiBpbnNlcnQgZXNjYXBlZCBzaW5nbGUgcXVvdGUgKi8KLQkgICpyKysgPSAnXCcnOwotCSAgKnIrKyA9ICdcJyc7CS8qIHN0YXJ0IG5ldyBxdW90ZWQgc3RyaW5nICovCi0JfQotICAgIH0KLQotICAqcisrID0gJ1wnJzsKLSAgKnIgPSAnXDAnOwotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyogU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgTElORVMgYW5kIENPTFVNTlMgdG8gbGluZXMgYW5kIGNvbHMsCi0gICByZXNwZWN0aXZlbHkuICovCi12b2lkCi1zZXRfbGluZXNfYW5kX2NvbHVtbnMgKGxpbmVzLCBjb2xzKQotICAgICBpbnQgbGluZXMsIGNvbHM7Ci17Ci0gIGNoYXIgKmI7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BVVEVOVikKLSAgYiA9IHhtYWxsb2MgKDI0KTsKLSAgc3ByaW50ZiAoYiwgIkxJTkVTPSVkIiwgbGluZXMpOwotICBwdXRlbnYgKGIpOwotICBiID0geG1hbGxvYyAoMjQpOwotICBzcHJpbnRmIChiLCAiQ09MVU1OUz0lZCIsIGNvbHMpOwotICBwdXRlbnYgKGIpOwotI2Vsc2UgLyogIUhBVkVfUFVURU5WICovCi0jICBpZiBkZWZpbmVkIChIQVZFX1NFVEVOVikKLSAgYiA9IHhtYWxsb2MgKDgpOwotICBzcHJpbnRmIChiLCAiJWQiLCBsaW5lcyk7Ci0gIHNldGVudiAoIkxJTkVTIiwgYiwgMSk7Ci0gIGIgPSB4bWFsbG9jICg4KTsKLSAgc3ByaW50ZiAoYiwgIiVkIiwgY29scyk7Ci0gIHNldGVudiAoIkNPTFVNTlMiLCBiLCAxKTsKLSMgIGVuZGlmIC8qIEhBVkVfU0VURU5WICovCi0jZW5kaWYgLyogIUhBVkVfUFVURU5WICovCi19Ci0KLWNoYXIgKgotZ2V0X2Vudl92YWx1ZSAodmFybmFtZSkKLSAgICAgY2hhciAqdmFybmFtZTsKLXsKLSAgcmV0dXJuICgoY2hhciAqKWdldGVudiAodmFybmFtZSkpOwotfQotCi1jaGFyICoKLWdldF9ob21lX2RpciAoKQotewotICBjaGFyICpob21lX2RpcjsKLSAgc3RydWN0IHBhc3N3ZCAqZW50cnk7Ci0KLSAgaG9tZV9kaXIgPSAoY2hhciAqKU5VTEw7Ci0gIGVudHJ5ID0gZ2V0cHd1aWQgKGdldHVpZCAoKSk7Ci0gIGlmIChlbnRyeSkKLSAgICBob21lX2RpciA9IGVudHJ5LT5wd19kaXI7Ci0gIHJldHVybiAoaG9tZV9kaXIpOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc2hsaWIvTWFrZWZpbGUuaW4gYi9yZWFkbGluZS9zaGxpYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmNTJmNy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9zaGxpYi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0jIyAtKi0gdGV4dCAtKi0gIyMKLSMgTWFrZWZpbGUgZm9yIHRoZSBHTlUgcmVhZGxpbmUgbGlicmFyeSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotUkxfTElCUkFSWV9WRVJTSU9OID0gQExJQlZFUlNJT05ACi1STF9MSUJSQVJZX05BTUUgPSByZWFkbGluZQotCi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSAuOkB0b3Bfc3JjZGlyQAotdG9wZGlyID0gQHRvcF9zcmNkaXJACi1CVUlMRF9ESVIgPSBAQlVJTERfRElSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQ0MgPSBAQ0NACi1SQU5MSUIgPSBAUkFOTElCQAotQVIgPSBAQVJACi1BUkZMQUdTID0gQEFSRkxBR1NACi1STSA9IHJtIC1mCi1DUCA9IGNwCi1NViA9IG12Ci0KLVNIRUxMID0gQE1BS0VfU0hFTExACi0KLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotbGliZGlyID0gQGxpYmRpckAKLQotQ0ZMQUdTID0gQENGTEFHU0AKLUxPQ0FMX0NGTEFHUyA9IEBMT0NBTF9DRkxBR1NAIC1EUkxfTElCUkFSWV9WRVJTSU9OPSciJChSTF9MSUJSQVJZX1ZFUlNJT04pIicKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQCBATE9DQUxfTERGTEFHU0AgQENGTEFHU0AKLQotREVGUyA9IEBERUZTQAotTE9DQUxfREVGUyA9IEBMT0NBTF9ERUZTQAotCi0jCi0jIFRoZXNlIHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGZvciBjb25maWd1cmUgYnkgJHt0b3BkaXJ9L3N1cHBvcnQvc2hvYmotY29uZi4KLSMgSWYgeW91ciBzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGF0IHNjcmlwdCwgYnV0IGluY2x1ZGVzIGZhY2lsaXRpZXMgZm9yCi0jIGR5bmFtaWMgbG9hZGluZyBvZiBzaGFyZWQgb2JqZWN0cywgcGxlYXNlIHVwZGF0ZSB0aGUgc2NyaXB0IGFuZCBzZW5kIHRoZQotIyBjaGFuZ2VzIHRvIGJhc2gtbWFpbnRhaW5lcnNAZ251Lm9yZy4KLSMKLVNIT0JKX0NDID0gQFNIT0JKX0NDQAotU0hPQkpfQ0ZMQUdTID0gQFNIT0JKX0NGTEFHU0AKLVNIT0JKX0xEID0gQFNIT0JKX0xEQAotCi1TSE9CSl9MREZMQUdTID0gQFNIT0JKX0xERkxBR1NACi1TSE9CSl9YTERGTEFHUyA9IEBTSE9CSl9YTERGTEFHU0AKLVNIT0JKX0xJQlMgPSBAU0hPQkpfTElCU0AKLQotU0hMSUJfWExERkxBR1MgPSBAU0hMSUJfWExERkxBR1NACi1TSExJQl9MSUJTID0gQFNITElCX0xJQlNACi1TSExJQl9MSUJTVUZGID0gQFNITElCX0xJQlNVRkZACi0KLVNITElCX0xJQlZFUlNJT04gPSBAU0hMSUJfTElCVkVSU0lPTkAKLQotU0hMSUJfU1RBVFVTID0gQFNITElCX1NUQVRVU0AKLQotIyBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uaW5nCi1TSExJQl9NQUpPUj0JCTQKLSMgc2hhcmVkIGxpYnJhcnkgc3lzdGVtcyBsaWtlIFNWUjQncyBkbyBub3QgdXNlIG1pbm9yIHZlcnNpb25zCi1TSExJQl9NSU5PUj0JCS4wCi0KLSMgRm9yIGxpYnJhcmllcyB3aGljaCBpbmNsdWRlIGhlYWRlcnMgZnJvbSBvdGhlciBsaWJyYXJpZXMuCi1JTkNMVURFUyA9IC1JLiAtSS4uIC1JJCh0b3BkaXIpIC1JJChpbmNsdWRlZGlyKQotCi1DQ0ZMQUdTID0gJChERUZTKSAkKExPQ0FMX0RFRlMpICQoQ1BQRkxBR1MpICQoSU5DTFVERVMpICQoTE9DQUxfQ0ZMQUdTKSAkKENGTEFHUykKLQotLlNVRkZJWEVTOgkuc28KLQotLmMuc286Ci0JJHtSTX0gJEAKLQkkKFNIT0JKX0NDKSAtYyAkKENDRkxBR1MpICQoU0hPQkpfQ0ZMQUdTKSAtbyAkKi5vICQ8IAotCSQoTVYpICQqLm8gJEAKLQotIyBUaGUgbmFtZSBvZiB0aGUgbWFpbiBsaWJyYXJ5IHRhcmdldC4KLQotU0hBUkVEX1JFQURMSU5FID0gbGlicmVhZGxpbmUuJChTSExJQl9MSUJWRVJTSU9OKQotU0hBUkVEX0hJU1RPUlkgPSBsaWJoaXN0b3J5LiQoU0hMSUJfTElCVkVSU0lPTikKLVNIQVJFRF9MSUJTID0gJChTSEFSRURfUkVBRExJTkUpICQoU0hBUkVEX0hJU1RPUlkpCi0KLSMgVGhlIEMgY29kZSBzb3VyY2UgZmlsZXMgZm9yIHRoaXMgbGlicmFyeS4KLUNTT1VSQ0VTID0gJCh0b3BkaXIpL3JlYWRsaW5lLmMgJCh0b3BkaXIpL2Z1bm1hcC5jICQodG9wZGlyKS9rZXltYXBzLmMgXAotCSAgICQodG9wZGlyKS92aV9tb2RlLmMgJCh0b3BkaXIpL3BhcmVucy5jICQodG9wZGlyKS9ybHR0eS5jIFwKLQkgICAkKHRvcGRpcikvY29tcGxldGUuYyAkKHRvcGRpcikvYmluZC5jICQodG9wZGlyKS9pc2VhcmNoLmMgXAotCSAgICQodG9wZGlyKS9kaXNwbGF5LmMgJCh0b3BkaXIpL3NpZ25hbHMuYyAkKHRvcGRpcikvZW1hY3Nfa2V5bWFwLmMgXAotCSAgICQodG9wZGlyKS92aV9rZXltYXAuYyAkKHRvcGRpcikvdXRpbC5jICQodG9wZGlyKS9raWxsLmMgXAotCSAgICQodG9wZGlyKS91bmRvLmMgJCh0b3BkaXIpL21hY3JvLmMgJCh0b3BkaXIpL2lucHV0LmMgXAotCSAgICQodG9wZGlyKS9jYWxsYmFjay5jICQodG9wZGlyKS90ZXJtaW5hbC5jICQodG9wZGlyKS94bWFsbG9jLmMgXAotCSAgICQodG9wZGlyKS9oaXN0b3J5LmMgJCh0b3BkaXIpL2hpc3RzZWFyY2guYyAkKHRvcGRpcikvaGlzdGV4cGFuZC5jIFwKLQkgICAkKHRvcGRpcikvaGlzdGZpbGUuYyAkKHRvcGRpcikvbmxzLmMgJCh0b3BkaXIpL3NlYXJjaC5jIFwKLQkgICAkKHRvcGRpcikvc2hlbGwuYyAkKHRvcGRpcikvc2F2ZXN0cmluZy5jICQodG9wZGlyKS90aWxkZS5jCi0KLSMgVGhlIGhlYWRlciBmaWxlcyBmb3IgdGhpcyBsaWJyYXJ5LgotSFNPVVJDRVMgPSByZWFkbGluZS5oIHJsZGVmcy5oIGNoYXJkZWZzLmgga2V5bWFwcy5oIGhpc3RvcnkuaCBoaXN0bGliLmggXAotCSAgIHBvc2l4c3RhdC5oIHBvc2l4ZGlyLmggcG9zaXhqbXAuaCB0aWxkZS5oIHJsY29uZi5oIHJsdHR5LmggXAotCSAgIGFuc2lfc3RkbGliLmggdGNhcC5oCi0KLVNIQVJFRF9ISVNUT0JKID0gaGlzdG9yeS5zbyBoaXN0ZXhwYW5kLnNvIGhpc3RmaWxlLnNvIGhpc3RzZWFyY2guc28gc2hlbGwuc28KLVNIQVJFRF9USUxERU9CSiA9IHRpbGRlLnNvCi1TSEFSRURfT0JKID0gcmVhZGxpbmUuc28gdmlfbW9kZS5zbyBmdW5tYXAuc28ga2V5bWFwcy5zbyBwYXJlbnMuc28gc2VhcmNoLnNvIFwKLQkgIHJsdHR5LnNvIGNvbXBsZXRlLnNvIGJpbmQuc28gaXNlYXJjaC5zbyBkaXNwbGF5LnNvIHNpZ25hbHMuc28gXAotCSAgdXRpbC5zbyBraWxsLnNvIHVuZG8uc28gbWFjcm8uc28gaW5wdXQuc28gY2FsbGJhY2suc28gdGVybWluYWwuc28gXAotCSAgbmxzLnNvIHhtYWxsb2Muc28gJChTSEFSRURfSElTVE9CSikgJChTSEFSRURfVElMREVPQkopCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFsbDogJChTSExJQl9TVEFUVVMpCi0KLXN1cHBvcnRlZDogJChTSEFSRURfTElCUykKLQotdW5zdXBwb3J0ZWQ6Ci0JQGVjaG8gIllvdXIgc3lzdGVtIGFuZCBjb21waWxlciAoJHtob3N0X29zfS0ke0NDfSkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIgotCUBlY2hvICIke3RvcGRpcn0vc3VwcG9ydC9zaG9iai1jb25mIHNjcmlwdC4iCi0JQGVjaG8gIklmIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBjcmVhdGluZyIKLQlAZWNobyAic2hhcmVkIGxpYnJhcmllcywgcGxlYXNlIHVwZGF0ZSB0aGUgc2NyaXB0IGFuZCByZS1ydW4gY29uZmlndXJlLgotCUBlY2hvICJQbGVhc2Ugc2VuZCB0aGUgY2hhbmdlcyB5b3UgbWFkZSB0byBiYXNoLW1haW50YWluZXJzQGdudS5vcmciCi0JQGVjaG8gImZvciBpbmNsdXNpb24gaW4gZnV0dXJlIGJhc2ggYW5kIHJlYWRsaW5lIHJlbGVhc2VzLiIKLQotJChTSEFSRURfUkVBRExJTkUpOgkkKFNIQVJFRF9PQkopCi0JJChSTSkgJEAKLQkkKFNIT0JKX0xEKSAke1NIT0JKX0xERkxBR1N9ICR7U0hMSUJfWExERkxBR1N9IC1vICRAICQoU0hBUkVEX09CSikgJChTSExJQl9MSUJTKQotCi0kKFNIQVJFRF9ISVNUT1JZKToJJChTSEFSRURfSElTVE9CSikgeG1hbGxvYy5zbwotCSQoUk0pICRACi0JJChTSE9CSl9MRCkgJHtTSE9CSl9MREZMQUdTfSAke1NITElCX1hMREZMQUdTfSAtbyAkQCAkKFNIQVJFRF9ISVNUT0JKKSB4bWFsbG9jLnNvICQoU0hMSUJfTElCUykKLQotaW5zdGFsbGRpcnM6ICQodG9wZGlyKS9zdXBwb3J0L21rZGlycwotCS0kKFNIRUxMKSAkKHRvcGRpcikvc3VwcG9ydC9ta2RpcnMgJChsaWJkaXIpCi0KLWluc3RhbGw6IGluc3RhbGxkaXJzICQoU0hMSUJfU1RBVFVTKQotCSQoU0hFTEwpICQodG9wZGlyKS9zdXBwb3J0L3NobGliLWluc3RhbGwgLU8gJChob3N0X29zKSAtZCAkKGxpYmRpcikgLWkgIiQoSU5TVEFMTF9EQVRBKSIgJChTSEFSRURfSElTVE9SWSkKLQkkKFNIRUxMKSAkKHRvcGRpcikvc3VwcG9ydC9zaGxpYi1pbnN0YWxsIC1PICQoaG9zdF9vcykgLWQgJChsaWJkaXIpIC1pICIkKElOU1RBTExfREFUQSkiICQoU0hBUkVEX1JFQURMSU5FKQotCUBlY2hvIGluc3RhbGw6IHlvdSBtYXkgbmVlZCB0byBydW4gbGRjb25maWcKLQotdW5pbnN0YWxsOgotCSQoU0hFTEwpICQodG9wZGlyKS9zdXBwb3J0L3NobGliLWluc3RhbGwgLU8gJChob3N0X29zKSAtZCAkKGxpYmRpcikgLVUgJChTSEFSRURfSElTVE9SWSkKLQkkKFNIRUxMKSAkKHRvcGRpcikvc3VwcG9ydC9zaGxpYi1pbnN0YWxsIC1PICQoaG9zdF9vcykgLWQgJChsaWJkaXIpIC1VICQoU0hBUkVEX1JFQURMSU5FKQotCUBlY2hvIHVuaW5zdGFsbDogeW91IG1heSBuZWVkIHRvIHJ1biBsZGNvbmZpZwotCi1jbGVhbiBtb3N0bHljbGVhbjoJZm9yY2UKLQkkKFJNKSAkKFNIQVJFRF9PQkopICQoU0hBUkVEX0xJQlMpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuOiBjbGVhbgotCSQoUk0pIE1ha2VmaWxlCi0KLWZvcmNlOgotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6Ci0KLSMgRGVwZW5kZW5jaWVzCi1iaW5kLnNvOiAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaCAkKHRvcGRpcikvcG9zaXhzdGF0LmgKLWJpbmQuc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi1iaW5kLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1iaW5kLnNvOiAkKHRvcGRpcikvdGlsZGUuaCAkKHRvcGRpcikvaGlzdG9yeS5oCi1jYWxsYmFjay5zbzogJCh0b3BkaXIpL3JsY29uZi5oCi1jYWxsYmFjay5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaAotY2FsbGJhY2suc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLWNhbGxiYWNrLnNvOiAkKHRvcGRpcikvdGlsZGUuaAotY29tcGxldGUuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oIHBvc2l4ZGlyLmggJCh0b3BkaXIpL3Bvc2l4c3RhdC5oCi1jb21wbGV0ZS5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvcmxjb25mLmgKLWNvbXBsZXRlLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1jb21wbGV0ZS5zbzogJCh0b3BkaXIpL3RpbGRlLmgKLWRpc3BsYXkuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oICQodG9wZGlyKS9wb3NpeHN0YXQuaAotZGlzcGxheS5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvcmxjb25mLmgKLWRpc3BsYXkuc286ICQodG9wZGlyKS90Y2FwLmgKLWRpc3BsYXkuc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLWRpc3BsYXkuc286ICQodG9wZGlyKS90aWxkZS5oICQodG9wZGlyKS9oaXN0b3J5LmgKLWZ1bm1hcC5zbzogJCh0b3BkaXIpL3JlYWRsaW5lLmggJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaAotZnVubWFwLnNvOiAkKHRvcGRpcikvcmxjb25mLmggJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmgKLWZ1bm1hcC5zbzogJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS90aWxkZS5oCi1oaXN0ZXhwYW5kLnNvOiAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaAotaGlzdGV4cGFuZC5zbzogJCh0b3BkaXIpL2hpc3RvcnkuaCBoaXN0bGliLmgKLWhpc3RleHBhbmQuc286ICR7QlVJTERfRElSfS9jb25maWcuaAotaGlzdGZpbGUuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oCi1oaXN0ZmlsZS5zbzogJCh0b3BkaXIpL2hpc3RvcnkuaCBoaXN0bGliLmgKLWhpc3RmaWxlLnNvOiAke0JVSUxEX0RJUn0vY29uZmlnLmgKLWhpc3Rvcnkuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oCi1oaXN0b3J5LnNvOiAkKHRvcGRpcikvaGlzdG9yeS5oIGhpc3RsaWIuaAotaGlzdG9yeS5zbzogJHtCVUlMRF9ESVJ9L2NvbmZpZy5oCi1oaXN0c2VhcmNoLnNvOiAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaAotaGlzdHNlYXJjaC5zbzogJCh0b3BkaXIpL2hpc3RvcnkuaCBoaXN0bGliLmgKLWhpc3RzZWFyY2guc286ICR7QlVJTERfRElSfS9jb25maWcuaAotaW5wdXQuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oCi1pbnB1dC5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvcmxjb25mLmgKLWlucHV0LnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1pbnB1dC5zbzogJCh0b3BkaXIpL3RpbGRlLmgKLWlzZWFyY2guc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi1pc2VhcmNoLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1pc2VhcmNoLnNvOiAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaCAkKHRvcGRpcikvaGlzdG9yeS5oICQodG9wZGlyKS90aWxkZS5oCi1rZXltYXBzLnNvOiBlbWFjc19rZXltYXAuYyB2aV9rZXltYXAuYwota2V5bWFwcy5zbzogJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaCAkKHRvcGRpcikvcmxjb25mLmgKLWtleW1hcHMuc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLWtleW1hcHMuc286ICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaCAkKHRvcGRpcikvdGlsZGUuaAota2lsbC5zbzogJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmgKLWtpbGwuc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi1raWxsLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1raWxsLnNvOiAkKHRvcGRpcikvdGlsZGUuaCAkKHRvcGRpcikvaGlzdG9yeS5oCi1tYWNyby5zbzogJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmgKLW1hY3JvLnNvOiAkKHRvcGRpcikvcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS9ybGNvbmYuaAotbWFjcm8uc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLW1hY3JvLnNvOiAkKHRvcGRpcikvdGlsZGUuaCAkKHRvcGRpcikvaGlzdG9yeS5oCi1ubHMuc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oCi1ubHMuc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi1wYXJlbnMuc286ICQodG9wZGlyKS9ybGNvbmYuaCAke0JVSUxEX0RJUn0vY29uZmlnLmgKLXBhcmVucy5zbzogJCh0b3BkaXIpL3JlYWRsaW5lLmggJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaAotcGFyZW5zLnNvOiAkKHRvcGRpcikvdGlsZGUuaAotcmVhZGxpbmUuc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLXJlYWRsaW5lLnNvOiAkKHRvcGRpcikvcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS9ybGNvbmYuaAotcmVhZGxpbmUuc286ICQodG9wZGlyKS9oaXN0b3J5LmggJCh0b3BkaXIpL3RpbGRlLmgKLXJlYWRsaW5lLnNvOiAkKHRvcGRpcikvcG9zaXhzdGF0LmggJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmggJCh0b3BkaXIpL3Bvc2l4am1wLmgKLXJsdHR5LnNvOiAkKHRvcGRpcikvcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS9ybGNvbmYuaAotcmx0dHkuc286ICQodG9wZGlyKS9ybHR0eS5oICQodG9wZGlyKS90aWxkZS5oCi1ybHR0eS5zbzogJCh0b3BkaXIpL3JlYWRsaW5lLmggJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaAotc2VhcmNoLnNvOiAkKHRvcGRpcikvcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS9ybGNvbmYuaAotc2VhcmNoLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1zZWFyY2guc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oICQodG9wZGlyKS9oaXN0b3J5LmggJCh0b3BkaXIpL3RpbGRlLmgKLXNpZ25hbHMuc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi1zaWduYWxzLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi1zaWduYWxzLnNvOiAkKHRvcGRpcikvaGlzdG9yeS5oICQodG9wZGlyKS90aWxkZS5oCi10ZXJtaW5hbC5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvcmxjb25mLmgKLXRlcm1pbmFsLnNvOiAkKHRvcGRpcikvdGNhcC5oCi10ZXJtaW5hbC5zbzogJCh0b3BkaXIpL3JlYWRsaW5lLmggJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaAotdGVybWluYWwuc286ICQodG9wZGlyKS90aWxkZS5oICQodG9wZGlyKS9oaXN0b3J5LmgKLXRpbGRlLnNvOiAkKHRvcGRpcikvYW5zaV9zdGRsaWIuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3RpbGRlLmgKLXVuZG8uc286ICQodG9wZGlyKS9hbnNpX3N0ZGxpYi5oCi11bmRvLnNvOiAkKHRvcGRpcikvcmxkZWZzLmggJHtCVUlMRF9ESVJ9L2NvbmZpZy5oICQodG9wZGlyKS9ybGNvbmYuaAotdW5kby5zbzogJCh0b3BkaXIpL3JlYWRsaW5lLmggJCh0b3BkaXIpL2tleW1hcHMuaCAkKHRvcGRpcikvY2hhcmRlZnMuaAotdW5kby5zbzogJCh0b3BkaXIpL3RpbGRlLmggJCh0b3BkaXIpL2hpc3RvcnkuaAotdXRpbC5zbzogJCh0b3BkaXIpL3Bvc2l4am1wLmggJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmgKLXV0aWwuc286ICQodG9wZGlyKS9ybGRlZnMuaCAke0JVSUxEX0RJUn0vY29uZmlnLmggJCh0b3BkaXIpL3JsY29uZi5oCi11dGlsLnNvOiAkKHRvcGRpcikvcmVhZGxpbmUuaCAkKHRvcGRpcikva2V5bWFwcy5oICQodG9wZGlyKS9jaGFyZGVmcy5oCi11dGlsLnNvOiAkKHRvcGRpcikvdGlsZGUuaAotdmlfbW9kZS5zbzogJCh0b3BkaXIpL3JsZGVmcy5oICR7QlVJTERfRElSfS9jb25maWcuaCAkKHRvcGRpcikvcmxjb25mLmgKLXZpX21vZGUuc286ICQodG9wZGlyKS9yZWFkbGluZS5oICQodG9wZGlyKS9rZXltYXBzLmggJCh0b3BkaXIpL2NoYXJkZWZzLmgKLXZpX21vZGUuc286ICQodG9wZGlyKS9oaXN0b3J5LmggJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmggJCh0b3BkaXIpL3RpbGRlLmgKLXhtYWxsb2Muc286ICR7QlVJTERfRElSfS9jb25maWcuaAoteG1hbGxvYy5zbzogJCh0b3BkaXIpL2Fuc2lfc3RkbGliLmgKLQotcmVhZGxpbmUuc286ICQodG9wZGlyKS9yZWFkbGluZS5jCi12aV9tb2RlLnNvOiAkKHRvcGRpcikvdmlfbW9kZS5jCi1mdW5tYXAuc286ICQodG9wZGlyKS9mdW5tYXAuYwota2V5bWFwcy5zbzogJCh0b3BkaXIpL2tleW1hcHMuYwotcGFyZW5zLnNvOiAkKHRvcGRpcikvcGFyZW5zLmMKLXNlYXJjaC5zbzogJCh0b3BkaXIpL3NlYXJjaC5jCi1ybHR0eS5zbzogJCh0b3BkaXIpL3JsdHR5LmMKLWNvbXBsZXRlLnNvOiAkKHRvcGRpcikvY29tcGxldGUuYwotYmluZC5zbzogJCh0b3BkaXIpL2JpbmQuYwotaXNlYXJjaC5zbzogJCh0b3BkaXIpL2lzZWFyY2guYwotZGlzcGxheS5zbzogJCh0b3BkaXIpL2Rpc3BsYXkuYwotc2lnbmFscy5zbzogJCh0b3BkaXIpL3NpZ25hbHMuYwotdXRpbC5zbzogJCh0b3BkaXIpL3V0aWwuYwota2lsbC5zbzogJCh0b3BkaXIpL2tpbGwuYwotdW5kby5zbzogJCh0b3BkaXIpL3VuZG8uYwotbWFjcm8uc286ICQodG9wZGlyKS9tYWNyby5jCi1pbnB1dC5zbzogJCh0b3BkaXIpL2lucHV0LmMKLWNhbGxiYWNrLnNvOiAkKHRvcGRpcikvY2FsbGJhY2suYwotdGVybWluYWwuc286ICQodG9wZGlyKS90ZXJtaW5hbC5jCi1ubHMuc286ICQodG9wZGlyKS9ubHMuYwoteG1hbGxvYy5zbzogJCh0b3BkaXIpL3htYWxsb2MuYwotaGlzdG9yeS5zbzogJCh0b3BkaXIpL2hpc3RvcnkuYwotaGlzdGV4cGFuZC5zbzogJCh0b3BkaXIpL2hpc3RleHBhbmQuYwotaGlzdGZpbGUuc286ICQodG9wZGlyKS9oaXN0ZmlsZS5jCi1oaXN0c2VhcmNoLnNvOiAkKHRvcGRpcikvaGlzdHNlYXJjaC5jCi1zYXZlc3RyaW5nLnNvOiAkKHRvcGRpcikvc2F2ZXN0cmluZy5jCi1zaGVsbC5zbzogJCh0b3BkaXIpL3NoZWxsLmMKLXRpbGRlLnNvOiAkKHRvcGRpcikvdGlsZGUuYwotCi1yZWFkbGluZS5zbzogcmVhZGxpbmUuYwotdmlfbW9kZS5zbzogdmlfbW9kZS5jCi1mdW5tYXAuc286IGZ1bm1hcC5jCi1rZXltYXBzLnNvOiBrZXltYXBzLmMKLXBhcmVucy5zbzogcGFyZW5zLmMKLXNlYXJjaC5zbzogc2VhcmNoLmMKLXJsdHR5LnNvOiBybHR0eS5jCi1jb21wbGV0ZS5zbzogY29tcGxldGUuYwotYmluZC5zbzogYmluZC5jCi1pc2VhcmNoLnNvOiBpc2VhcmNoLmMKLWRpc3BsYXkuc286IGRpc3BsYXkuYwotc2lnbmFscy5zbzogc2lnbmFscy5jCi11dGlsLnNvOiB1dGlsLmMKLWtpbGwuc286IGtpbGwuYwotdW5kby5zbzogdW5kby5jCi1tYWNyby5zbzogbWFjcm8uYwotaW5wdXQuc286IGlucHV0LmMKLWNhbGxiYWNrLnNvOiBjYWxsYmFjay5jCi10ZXJtaW5hbC5zbzogdGVybWluYWwuYwotbmxzLnNvOiBubHMuYwoteG1hbGxvYy5zbzogeG1hbGxvYy5jCi1oaXN0b3J5LnNvOiBoaXN0b3J5LmMKLWhpc3RleHBhbmQuc286IGhpc3RleHBhbmQuYwotaGlzdGZpbGUuc286IGhpc3RmaWxlLmMKLWhpc3RzZWFyY2guc286IGhpc3RzZWFyY2guYwotc2F2ZXN0cmluZy5zbzogc2F2ZXN0cmluZy5jCi1zaGVsbC5zbzogc2hlbGwuYwotdGlsZGUuc286IHRpbGRlLmMKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3NpZ25hbHMuYyBiL3JlYWRsaW5lL3NpZ25hbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMDkxMi4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9zaWduYWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyogc2lnbmFscy5jIC0tIHNpZ25hbCBoYW5kbGluZyBzdXBwb3J0IGZvciByZWFkbGluZS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogSnVzdCBmb3IgTlVMTC4gIFl1Y2suICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogSEFWRV9VTklTVERfSCAqLwotCi0vKiBTeXN0ZW0tc3BlY2lmaWMgZmVhdHVyZSBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZSBmaWxlcy4gKi8KLSNpbmNsdWRlICJybGRlZnMuaCIKLQotI2lmIGRlZmluZWQgKEdXSU5TWl9JTl9TWVNfSU9DVEwpCi0jICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZiAvKiBHV0lOU1pfSU5fU1lTX0lPQ1RMICovCi0KLSNpZiBkZWZpbmVkIChfX0dPMzJfXykgJiYgIWRlZmluZWQoX19ESkdQUF9fKQotIyAgdW5kZWYgSEFORExFX1NJR05BTFMKLSNlbmRpZiAvKiBfX0dPMzJfXyAgJiYgIV9fREpHUFBfXyAqLwotCi0jaWYgZGVmaW5lZCAoSEFORExFX1NJR05BTFMpCi0vKiBTb21lIHN0YW5kYXJkIGxpYnJhcnkgcm91dGluZXMuICovCi0jaW5jbHVkZSAicmVhZGxpbmUuaCIKLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0KLSNpZiAhZGVmaW5lZCAoUkVUU0lHVFlQRSkKLSMgIGlmIGRlZmluZWQgKFZPSURfU0lHSEFORExFUikKLSMgICAgZGVmaW5lIFJFVFNJR1RZUEUgdm9pZAotIyAgZWxzZQotIyAgICBkZWZpbmUgUkVUU0lHVFlQRSBpbnQKLSMgIGVuZGlmIC8qICFWT0lEX1NJR0hBTkRMRVIgKi8KLSNlbmRpZiAvKiAhUkVUU0lHVFlQRSAqLwotCi0jaWYgZGVmaW5lZCAoVk9JRF9TSUdIQU5ETEVSKQotIyAgZGVmaW5lIFNJR0hBTkRMRVJfUkVUVVJOIHJldHVybgotI2Vsc2UKLSMgIGRlZmluZSBTSUdIQU5ETEVSX1JFVFVSTiByZXR1cm4gKDApCi0jZW5kaWYKLQotLyogVGhpcyB0eXBlZGVmIGlzIGVxdWl2YWxhbnQgdG8gdGhlIG9uZSBmb3IgRnVuY3Rpb247IGl0IGFsbG93cyB1cwotICAgdG8gc2F5IFNpZ0hhbmRsZXIgKmZvbyA9IHNpZ25hbCAoU0lHS0lMTCwgU0lHX0lHTik7ICovCi10eXBlZGVmIFJFVFNJR1RZUEUgU2lnSGFuZGxlciAoKTsKLQotZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7Ci1leHRlcm4gaW50IHJsX3BlbmRpbmdfaW5wdXQ7Ci1leHRlcm4gaW50IF9ybF9tZXRhX2ZsYWc7Ci0KLWV4dGVybiB2b2lkIGZyZWVfdW5kb19saXN0ICgpOwotZXh0ZXJuIHZvaWQgX3JsX2dldF9zY3JlZW5fc2l6ZSAoKTsKLWV4dGVybiB2b2lkIF9ybF9yZWRpc3BsYXlfYWZ0ZXJfc2lnd2luY2ggKCk7Ci1leHRlcm4gdm9pZCBfcmxfY2xlYW5fdXBfZm9yX2V4aXQgKCk7Ci1leHRlcm4gdm9pZCBfcmxfa2lsbF9rYmRfbWFjcm8gKCk7Ci1leHRlcm4gdm9pZCBfcmxfaW5pdF9hcmd1bWVudCAoKTsKLWV4dGVybiB2b2lkIHJsX2RlcHJlcF90ZXJtaW5hbCAoKSwgcmxfcHJlcF90ZXJtaW5hbCAoKTsKLQotc3RhdGljIFNpZ0hhbmRsZXIgKnJsX3NldF9zaWdoYW5kbGVyICgpOwotCi0vKiBFeHBvcnRlZCB2YXJpYWJsZXMgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMuICovCi0KLS8qIElmIG5vbi16ZXJvLCByZWFkbGluZSB3aWxsIGluc3RhbGwgaXRzIG93biBzaWduYWwgaGFuZGxlcnMgZm9yCi0gICBTSUdJTlQsIFNJR1RFUk0sIFNJR1FVSVQsIFNJR0FMUk0sIFNJR1RTVFAsIFNJR1RUSU4sIGFuZCBTSUdUVE9VLiAqLwotaW50IHJsX2NhdGNoX3NpZ25hbHMgPSAxOwotCi0vKiBJZiBub24temVybywgcmVhZGxpbmUgd2lsbCBpbnN0YWxsIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR1dJTkNILiAqLwotI2lmZGVmIFNJR1dJTkNICi1pbnQgcmxfY2F0Y2hfc2lnd2luY2ggPSAxOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2lnbmFsc19zZXRfZmxhZzsKLSNpZmRlZiBTSUdXSU5DSAotc3RhdGljIGludCBzaWd3aW5jaF9zZXRfZmxhZzsKLSNlbmRpZgotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJICAgICAgICAJCSAgICAqLwotLyoJCQkgICBTaWduYWwgSGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX1NJR05BTFMpCi10eXBlZGVmIHN0cnVjdCBzaWdhY3Rpb24gc2lnaGFuZGxlcl9jeHQ7Ci0jICBkZWZpbmUgcmxfc2lnYWN0aW9uKHMsIG5oLCBvaCkJc2lnYWN0aW9uKHMsIG5oLCBvaCkKLSNlbHNlCi10eXBlZGVmIHN0cnVjdCB7IFNpZ0hhbmRsZXIgKnNhX2hhbmRsZXI7IGludCBzYV9tYXNrLCBzYV9mbGFnczsgfSBzaWdoYW5kbGVyX2N4dDsKLSMgIGRlZmluZSBzaWdlbXB0eXNldChtKQotI2VuZGlmIC8qICFIQVZFX1BPU0lYX1NJR05BTFMgKi8KLQotc3RhdGljIHNpZ2hhbmRsZXJfY3h0IG9sZF9pbnQsIG9sZF90ZXJtLCBvbGRfYWxybSwgb2xkX3F1aXQ7Ci0jaWYgZGVmaW5lZCAoU0lHVFNUUCkKLXN0YXRpYyBzaWdoYW5kbGVyX2N4dCBvbGRfdHN0cCwgb2xkX3R0b3UsIG9sZF90dGluOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi1zdGF0aWMgc2lnaGFuZGxlcl9jeHQgb2xkX3dpbmNoOwotI2VuZGlmCi0KLS8qIFJlYWRsaW5lIHNpZ25hbCBoYW5kbGVyIGZ1bmN0aW9ucy4gKi8KLQotc3RhdGljIFJFVFNJR1RZUEUKLXJsX3NpZ25hbF9oYW5kbGVyIChzaWcpCi0gICAgIGludCBzaWc7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotICBzaWdzZXRfdCBzZXQ7Ci0jZWxzZSAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0jICBpZiBkZWZpbmVkIChIQVZFX0JTRF9TSUdOQUxTKQotICBsb25nIG9tYXNrOwotIyAgZWxzZSAvKiAhSEFWRV9CU0RfU0lHTkFMUyAqLwotICBzaWdoYW5kbGVyX2N4dCBkdW1teV9jeHQ7CS8qIG5lZWRlZCBmb3Igcmxfc2V0X3NpZ2hhbmRsZXIgY2FsbCAqLwotIyAgZW5kaWYgLyogIUhBVkVfQlNEX1NJR05BTFMgKi8KLSNlbmRpZiAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0KLSNpZiAhZGVmaW5lZCAoSEFWRV9CU0RfU0lHTkFMUykgJiYgIWRlZmluZWQgKEhBVkVfUE9TSVhfU0lHTkFMUykKLSAgLyogU2luY2UgdGhlIHNpZ25hbCB3aWxsIG5vdCBiZSBibG9ja2VkIHdoaWxlIHdlIGFyZSBpbiB0aGUgc2lnbmFsCi0gICAgIGhhbmRsZXIsIGlnbm9yZSBpdCB1bnRpbCBybF9jbGVhcl9zaWduYWxzIHJlc2V0cyB0aGUgY2F0Y2hlci4gKi8KLSAgaWYgKHNpZyA9PSBTSUdJTlQgfHwgc2lnID09IFNJR0FMUk0pCi0gICAgcmxfc2V0X3NpZ2hhbmRsZXIgKHNpZywgU0lHX0lHTiwgJmR1bW15X2N4dCk7Ci0jZW5kaWYgLyogIUhBVkVfQlNEX1NJR05BTFMgJiYgIUhBVkVfUE9TSVhfU0lHTkFMUyAqLwotCi0gIHN3aXRjaCAoc2lnKQotICAgIHsKLSAgICBjYXNlIFNJR0lOVDoKLSAgICAgIHJsX2ZyZWVfbGluZV9zdGF0ZSAoKTsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0KLSNpZiBkZWZpbmVkIChTSUdUU1RQKQotICAgIGNhc2UgU0lHVFNUUDoKLSAgICBjYXNlIFNJR1RUT1U6Ci0gICAgY2FzZSBTSUdUVElOOgotI2VuZGlmIC8qIFNJR1RTVFAgKi8KLSAgICBjYXNlIFNJR0FMUk06Ci0gICAgY2FzZSBTSUdURVJNOgotICAgIGNhc2UgU0lHUVVJVDoKLSAgICAgIHJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsICgpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotICAgICAgc2lncHJvY21hc2sgKFNJR19CTE9DSywgKHNpZ3NldF90ICopTlVMTCwgJnNldCk7Ci0gICAgICBzaWdkZWxzZXQgKCZzZXQsIHNpZyk7Ci0jZWxzZSAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0jICBpZiBkZWZpbmVkIChIQVZFX0JTRF9TSUdOQUxTKQotICAgICAgb21hc2sgPSBzaWdibG9jayAoMCk7Ci0jICBlbmRpZiAvKiBIQVZFX0JTRF9TSUdOQUxTICovCi0jZW5kaWYgLyogIUhBVkVfUE9TSVhfU0lHTkFMUyAqLwotCi0gICAgICBraWxsIChnZXRwaWQgKCksIHNpZyk7Ci0KLSAgICAgIC8qIExldCB0aGUgc2lnbmFsIHRoYXQgd2UganVzdCBzZW50IHRocm91Z2guICAqLwotI2lmIGRlZmluZWQgKEhBVkVfUE9TSVhfU0lHTkFMUykKLSAgICAgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJnNldCwgKHNpZ3NldF90ICopTlVMTCk7Ci0jZWxzZSAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0jICBpZiBkZWZpbmVkIChIQVZFX0JTRF9TSUdOQUxTKQotICAgICAgc2lnc2V0bWFzayAob21hc2sgJiB+KHNpZ21hc2sgKHNpZykpKTsKLSMgIGVuZGlmIC8qIEhBVkVfQlNEX1NJR05BTFMgKi8KLSNlbmRpZiAvKiAhSEFWRV9QT1NJWF9TSUdOQUxTICovCi0KLSAgICAgIHJsX3Jlc2V0X2FmdGVyX3NpZ25hbCAoKTsKLSAgICB9Ci0KLSAgU0lHSEFORExFUl9SRVRVUk47Ci19Ci0KLSNpZiBkZWZpbmVkIChTSUdXSU5DSCkKLXN0YXRpYyBSRVRTSUdUWVBFCi1ybF9zaWd3aW5jaF9oYW5kbGVyIChzaWcpCi0gICAgIGludCBzaWc7Ci17Ci0gIFNpZ0hhbmRsZXIgKm9oOwotCi0jaWYgZGVmaW5lZCAoTVVTVF9SRUlOU1RBTExfU0lHSEFORExFUlMpCi0gIHNpZ2hhbmRsZXJfY3h0IGR1bW15X3dpbmNoOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIG9sZF93aW5jaCAtLSBpdCBob2xkcyB0aGUgc3RhdGUgb2YgU0lHV0lOQ0gKLSAgICAgZGlzcG9zaXRpb24gc2V0IGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgV2UgbmVlZCB0aGlzIHN0YXRlCi0gICAgIGJlY2F1c2Ugd2UgY2FsbCB0aGUgYXBwbGljYXRpb24ncyBTSUdXSU5DSCBoYW5kbGVyIGFmdGVyIHVwZGF0aW5nCi0gICAgIG91ciBvd24gaWRlYSBvZiB0aGUgc2NyZWVuIHNpemUuICovCi0gIHJsX3NldF9zaWdoYW5kbGVyIChTSUdXSU5DSCwgcmxfc2lnd2luY2hfaGFuZGxlciwgJmR1bW15X3dpbmNoKTsKLSNlbmRpZgotCi0gIHJsX3Jlc2l6ZV90ZXJtaW5hbCAoKTsKLQotICAvKiBJZiBhbm90aGVyIHNpZ3dpbmNoIGhhbmRsZXIgaGFzIGJlZW4gaW5zdGFsbGVkLCBjYWxsIGl0LiAqLwotICBvaCA9IChTaWdIYW5kbGVyICopb2xkX3dpbmNoLnNhX2hhbmRsZXI7Ci0gIGlmIChvaCAmJiAgb2ggIT0gKFNpZ0hhbmRsZXIgKilTSUdfSUdOICYmIG9oICE9IChTaWdIYW5kbGVyICopU0lHX0RGTCkKLSAgICAoKm9oKSAoc2lnKTsKLQotICBTSUdIQU5ETEVSX1JFVFVSTjsKLX0KLSNlbmRpZiAgLyogU0lHV0lOQ0ggKi8KLQotLyogRnVuY3Rpb25zIHRvIG1hbmFnZSBzaWduYWwgaGFuZGxpbmcuICovCi0KLSNpZiAhZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotc3RhdGljIGludAotcmxfc2lnYWN0aW9uIChzaWcsIG5oLCBvaCkKLSAgICAgaW50IHNpZzsKLSAgICAgc2lnaGFuZGxlcl9jeHQgKm5oLCAqb2g7Ci17Ci0gIG9oLT5zYV9oYW5kbGVyID0gc2lnbmFsIChzaWcsIG5oLT5zYV9oYW5kbGVyKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogIUhBVkVfUE9TSVhfU0lHTkFMUyAqLwotCi0vKiBTZXQgdXAgYSByZWFkbGluZS1zcGVjaWZpYyBzaWduYWwgaGFuZGxlciwgc2F2aW5nIHRoZSBvbGQgc2lnbmFsCi0gICBpbmZvcm1hdGlvbiBpbiBPSEFORExFUi4gIFJldHVybiB0aGUgb2xkIHNpZ25hbCBoYW5kbGVyLCBsaWtlCi0gICBzaWduYWwoKS4gKi8KLXN0YXRpYyBTaWdIYW5kbGVyICoKLXJsX3NldF9zaWdoYW5kbGVyIChzaWcsIGhhbmRsZXIsIG9oYW5kbGVyKQotICAgICBpbnQgc2lnOwotICAgICBTaWdIYW5kbGVyICpoYW5kbGVyOwotICAgICBzaWdoYW5kbGVyX2N4dCAqb2hhbmRsZXI7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKQotICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKLQotICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0gIGFjdC5zYV9mbGFncyA9IDA7Ci0gIHNpZ2VtcHR5c2V0ICgmYWN0LnNhX21hc2spOwotICBzaWdlbXB0eXNldCAoJm9oYW5kbGVyLT5zYV9tYXNrKTsKLSAgc2lnYWN0aW9uIChzaWcsICZhY3QsIG9oYW5kbGVyKTsKLSNlbHNlCi0gIG9oYW5kbGVyLT5zYV9oYW5kbGVyID0gKFNpZ0hhbmRsZXIgKilzaWduYWwgKHNpZywgaGFuZGxlcik7Ci0jZW5kaWYgLyogIUhBVkVfUE9TSVhfU0lHTkFMUyAqLwotICByZXR1cm4gKG9oYW5kbGVyLT5zYV9oYW5kbGVyKTsKLX0KLQotc3RhdGljIHZvaWQKLXJsX21heWJlX3NldF9zaWdoYW5kbGVyIChzaWcsIGhhbmRsZXIsIG9oYW5kbGVyKQotICAgICBpbnQgc2lnOwotICAgICBTaWdIYW5kbGVyICpoYW5kbGVyOwotICAgICBzaWdoYW5kbGVyX2N4dCAqb2hhbmRsZXI7Ci17Ci0gIHNpZ2hhbmRsZXJfY3h0IGR1bW15OwotICBTaWdIYW5kbGVyICpvaDsKLQotICBzaWdlbXB0eXNldCAoJmR1bW15LnNhX21hc2spOwotICBvaCA9IHJsX3NldF9zaWdoYW5kbGVyIChzaWcsIGhhbmRsZXIsIG9oYW5kbGVyKTsKLSAgaWYgKG9oID09IChTaWdIYW5kbGVyICopU0lHX0lHTikKLSAgICBybF9zaWdhY3Rpb24gKHNpZywgb2hhbmRsZXIsICZkdW1teSk7Ci19Ci0KLWludAotcmxfc2V0X3NpZ25hbHMgKCkKLXsKLSAgc2lnaGFuZGxlcl9jeHQgZHVtbXk7Ci0gIFNpZ0hhbmRsZXIgKm9oOwotCi0gIGlmIChybF9jYXRjaF9zaWduYWxzICYmIHNpZ25hbHNfc2V0X2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICBybF9tYXliZV9zZXRfc2lnaGFuZGxlciAoU0lHSU5ULCBybF9zaWduYWxfaGFuZGxlciwgJm9sZF9pbnQpOwotICAgICAgcmxfbWF5YmVfc2V0X3NpZ2hhbmRsZXIgKFNJR1RFUk0sIHJsX3NpZ25hbF9oYW5kbGVyLCAmb2xkX3Rlcm0pOwotICAgICAgcmxfbWF5YmVfc2V0X3NpZ2hhbmRsZXIgKFNJR1FVSVQsIHJsX3NpZ25hbF9oYW5kbGVyLCAmb2xkX3F1aXQpOwotCi0gICAgICBvaCA9IHJsX3NldF9zaWdoYW5kbGVyIChTSUdBTFJNLCBybF9zaWduYWxfaGFuZGxlciwgJm9sZF9hbHJtKTsKLSAgICAgIGlmIChvaCA9PSAoU2lnSGFuZGxlciAqKVNJR19JR04pCi0Jcmxfc2lnYWN0aW9uIChTSUdBTFJNLCAmb2xkX2Fscm0sICZkdW1teSk7Ci0jaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9TSUdOQUxTKSAmJiBkZWZpbmVkIChTQV9SRVNUQVJUKQotICAgICAgLyogSWYgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHJlYWRsaW5lIGhhcyBhbHJlYWR5IGluc3RhbGxlZCBhIHNpZ25hbAotCSBoYW5kbGVyIHdpdGggU0FfUkVTVEFSVCwgU0lHQUxSTSB3aWxsIGNhdXNlIHJlYWRzIHRvIGJlIHJlc3RhcnRlZAotCSBhdXRvbWF0aWNhbGx5LCBzbyByZWFkbGluZSBzaG91bGQganVzdCBnZXQgb3V0IG9mIHRoZSB3YXkuICBTaW5jZQotCSB3ZSB0ZXN0ZWQgZm9yIFNJR19JR04gYWJvdmUsIHdlIGNhbiBqdXN0IHRlc3QgZm9yIFNJR19ERkwgaGVyZS4gKi8KLSAgICAgIGlmIChvaCAhPSAoU2lnSGFuZGxlciAqKVNJR19ERkwgJiYgKG9sZF9hbHJtLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpCi0Jcmxfc2lnYWN0aW9uIChTSUdBTFJNLCAmb2xkX2Fscm0sICZkdW1teSk7Ci0jZW5kaWYgLyogSEFWRV9QT1NJWF9TSUdOQUxTICovCi0KLSNpZiBkZWZpbmVkIChTSUdUU1RQKQotICAgICAgcmxfbWF5YmVfc2V0X3NpZ2hhbmRsZXIgKFNJR1RTVFAsIHJsX3NpZ25hbF9oYW5kbGVyLCAmb2xkX3RzdHApOwotI2VuZGlmIC8qIFNJR1RTVFAgKi8KLQotI2lmIGRlZmluZWQgKFNJR1RUT1UpCi0gICAgICBybF9tYXliZV9zZXRfc2lnaGFuZGxlciAoU0lHVFRPVSwgcmxfc2lnbmFsX2hhbmRsZXIsICZvbGRfdHRvdSk7Ci0jZW5kaWYgLyogU0lHVFRPVSAqLwotCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgICAgIHJsX21heWJlX3NldF9zaWdoYW5kbGVyIChTSUdUVElOLCBybF9zaWduYWxfaGFuZGxlciwgJm9sZF90dGluKTsKLSNlbmRpZiAvKiBTSUdUVElOICovCi0KLSAgICAgIHNpZ25hbHNfc2V0X2ZsYWcgPSAxOwotICAgIH0KLQotI2lmIGRlZmluZWQgKFNJR1dJTkNIKQotICBpZiAocmxfY2F0Y2hfc2lnd2luY2ggJiYgc2lnd2luY2hfc2V0X2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICBybF9tYXliZV9zZXRfc2lnaGFuZGxlciAoU0lHV0lOQ0gsIHJsX3NpZ3dpbmNoX2hhbmRsZXIsICZvbGRfd2luY2gpOwotICAgICAgc2lnd2luY2hfc2V0X2ZsYWcgPSAxOwotICAgIH0KLSNlbmRpZiAvKiBTSUdXSU5DSCAqLwotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXJsX2NsZWFyX3NpZ25hbHMgKCkKLXsKLSAgc2lnaGFuZGxlcl9jeHQgZHVtbXk7Ci0KLSAgaWYgKHJsX2NhdGNoX3NpZ25hbHMgJiYgc2lnbmFsc19zZXRfZmxhZyA9PSAxKQotICAgIHsKLSAgICAgIHNpZ2VtcHR5c2V0ICgmZHVtbXkuc2FfbWFzayk7Ci0KLSAgICAgIHJsX3NpZ2FjdGlvbiAoU0lHSU5ULCAmb2xkX2ludCwgJmR1bW15KTsKLSAgICAgIHJsX3NpZ2FjdGlvbiAoU0lHVEVSTSwgJm9sZF90ZXJtLCAmZHVtbXkpOwotICAgICAgcmxfc2lnYWN0aW9uIChTSUdRVUlULCAmb2xkX3F1aXQsICZkdW1teSk7Ci0gICAgICBybF9zaWdhY3Rpb24gKFNJR0FMUk0sICZvbGRfYWxybSwgJmR1bW15KTsKLQotI2lmIGRlZmluZWQgKFNJR1RTVFApCi0gICAgICBybF9zaWdhY3Rpb24gKFNJR1RTVFAsICZvbGRfdHN0cCwgJmR1bW15KTsKLSNlbmRpZiAvKiBTSUdUU1RQICovCi0KLSNpZiBkZWZpbmVkIChTSUdUVE9VKQotICAgICAgcmxfc2lnYWN0aW9uIChTSUdUVE9VLCAmb2xkX3R0b3UsICZkdW1teSk7Ci0jZW5kaWYgLyogU0lHVFRPVSAqLwotCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgICAgIHJsX3NpZ2FjdGlvbiAoU0lHVFRJTiwgJm9sZF90dGluLCAmZHVtbXkpOwotI2VuZGlmIC8qIFNJR1RUSU4gKi8KLQotICAgICAgc2lnbmFsc19zZXRfZmxhZyA9IDA7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi0gIGlmIChybF9jYXRjaF9zaWd3aW5jaCAmJiBzaWd3aW5jaF9zZXRfZmxhZyA9PSAxKQotICAgIHsKLSAgICAgIHNpZ2VtcHR5c2V0ICgmZHVtbXkuc2FfbWFzayk7Ci0gICAgICBybF9zaWdhY3Rpb24gKFNJR1dJTkNILCAmb2xkX3dpbmNoLCAmZHVtbXkpOwotICAgICAgc2lnd2luY2hfc2V0X2ZsYWcgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0vKiBDbGVhbiB1cCB0aGUgdGVybWluYWwgYW5kIHJlYWRsaW5lIHN0YXRlIGFmdGVyIGNhdGNoaW5nIGEgc2lnbmFsLCBiZWZvcmUKLSAgIHJlc2VuZGluZyBpdCB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gKi8KLXZvaWQKLXJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsICgpCi17Ci0gIF9ybF9jbGVhbl91cF9mb3JfZXhpdCAoKTsKLSAgKCpybF9kZXByZXBfdGVybV9mdW5jdGlvbikgKCk7Ci0gIHJsX2NsZWFyX3NpZ25hbHMgKCk7Ci0gIHJsX3BlbmRpbmdfaW5wdXQgPSAwOwotfQotCi0vKiBSZXNldCB0aGUgdGVybWluYWwgYW5kIHJlYWRsaW5lIHN0YXRlIGFmdGVyIGEgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4gKi8KLXZvaWQKLXJsX3Jlc2V0X2FmdGVyX3NpZ25hbCAoKQotewotICAoKnJsX3ByZXBfdGVybV9mdW5jdGlvbikgKF9ybF9tZXRhX2ZsYWcpOwotICBybF9zZXRfc2lnbmFscyAoKTsKLX0KLQotLyogRnJlZSB1cCB0aGUgcmVhZGxpbmUgdmFyaWFibGUgbGluZSBzdGF0ZSBmb3IgdGhlIGN1cnJlbnQgbGluZSAodW5kbyBsaXN0LAotICAgYW55IHBhcnRpYWwgaGlzdG9yeSBlbnRyeSwgYW55IGtleWJvYXJkIG1hY3JvcyBpbiBwcm9ncmVzcywgYW5kIGFueQotICAgbnVtZXJpYyBhcmd1bWVudHMgaW4gcHJvY2VzcykgYWZ0ZXIgY2F0Y2hpbmcgYSBzaWduYWwsIGJlZm9yZSBjYWxsaW5nCi0gICBybF9jbGVhbnVwX2FmdGVyX3NpZ25hbCgpLiAqLyAKLXZvaWQKLXJsX2ZyZWVfbGluZV9zdGF0ZSAoKQotewotICByZWdpc3RlciBISVNUX0VOVFJZICplbnRyeTsKLQotICBmcmVlX3VuZG9fbGlzdCAoKTsKLQotICBlbnRyeSA9IGN1cnJlbnRfaGlzdG9yeSAoKTsKLSAgaWYgKGVudHJ5KQotICAgIGVudHJ5LT5kYXRhID0gKGNoYXIgKilOVUxMOwotCi0gIF9ybF9raWxsX2tiZF9tYWNybyAoKTsKLSAgcmxfY2xlYXJfbWVzc2FnZSAoKTsKLSAgX3JsX2luaXRfYXJndW1lbnQgKCk7Ci19Ci0KLSNlbmRpZiAgLyogSEFORExFX1NJR05BTFMgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3N1cHBvcnQvY29uZmlnLmd1ZXNzIGIvcmVhZGxpbmUvc3VwcG9ydC9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YTI0MjguLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvc3VwcG9ydC9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgotIyBUaGUgbWFzdGVyIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGF0IHRoZSBGU0YgaW4gL2hvbWUvZ2QvZ251L2xpYi4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHN5c3RlbSB0eXBlIChob3N0L3RhcmdldCBuYW1lKS4KLSMKLSMgT25seSBhIGZldyBzeXN0ZW1zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGxpc3Q7IHBsZWFzZSBhZGQgb3RoZXJzCi0jIChidXQgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBjbGVhbikuCi0jCi0KLSMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCi0jIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgOC8yNC85NC4pCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZWxpZiAodGVzdCAtZiAvdXNyLzViaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi91c3IvNWJpbgotZmkKLQotVU5BTUU9YCh1bmFtZSkgMj4vZGV2L251bGxgIHx8IFVOQU1FPXVua25vd24KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotUkVMRUFTRT1gZXhwciAiJFVOQU1FX1JFTEVBU0UiIDogJ1teMC05XSpcKFswLTldKlwpJ2AgIyA0Ci1jYXNlICIkUkVMRUFTRSIgaW4KLSIiKQlSRUxFQVNFPTAgOzsKLSopCVJFTEVBU0U9YGV4cHIgIiRSRUxFQVNFIiArIDBgIDs7Ci1lc2FjCi1SRUxfTEVWRUw9YGV4cHIgIiRVTkFNRV9SRUxFQVNFIiA6ICdbXjAtOV0qWzAtOV0qLlwoWzAtOV0qXCknYCAgICAjIDEKLVJFTF9TVUJMRVZFTD1gZXhwciAiJFVOQU1FX1JFTEVBU0UiIDogJ1teMC05XSpbMC05XSouWzAtOV0qLlwoWzAtOV0qXCknYCAjIDIKLQotdHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQotCi0jIFNvbWUgdmVyc2lvbnMgb2YgaTM4NiBTVlI0LjIgbWFrZSBgdW5hbWUnIGVxdWl2YWxlbnQgdG8gYHVuYW1lIC1uJywgd2hpY2gKLSMgaXMgY29udHJhcnkgdG8gYWxsIG90aGVyIHZlcnNpb25zIG9mIHVuYW1lCi1pZiBbIC1uICIkVU5BTUUiIF0gJiYgWyAiJFVOQU1FX1MiICE9ICIkVU5BTUUiIF0gJiYgWyAiJFVOQU1FX1MiID0gVU5JWF9TViBdOyB0aGVuCi0JVU5BTUU9VU5JWF9TVgotZmkKLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgIyBCZWdpbiBjYXNlcyBhZGRlZCBmb3IgQmFzaAotICAgIGFscGhhOk5ldEJTRDoqOiopCi0JZWNobyBhbHBoYS1kZWMtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFscGhhOk9wZW5CU0Q6KjoqKQotCWVjaG8gYWxwaGEtZGVjLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpOZXRCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBpPzg2Ok9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgaT84NjpGcmVlQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzcGFyYzpOZXRCU0Q6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3BhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgdmF4Ok5ldEJTRDoqOiopCi0JZWNobyB2YXgtZGVjLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICB2YXg6T3BlbkJTRDoqOiopCi0JZWNobyB2YXgtZGVjLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOm1hY2h0ZW46KjoqKQotCWVjaG8gbWFjNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgY29uY3VycmVudCo6KjoqOiopCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIGNvbmN1cnJlbnQtY29uY3VycmVudC1zeXN2MwotCWVsc2UKLQkJZWNobyBjb25jdXJyZW50LWNvbmN1cnJlbnQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwcGMqOlN1bk9TOjUuKjoqKQotCWVjaG8gcHBjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHNwYXJjOlVOSVhfU1Y6NC4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlwczpVTklYX1NWOjQuKjoqKQotCWVjaG8gbWlwcy1taXBzLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlwczpPU0YqMToqOiopCi0JZWNobyBtaXBzLW1pcHMtb3NmMQotCWV4aXQgMCA7OwotICAgIG1pcHM6NC40QlNEOio6KikKLQllY2hvIG1pcHMtbWlwcy1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBNSVNlcnZlci1TOlNNUF9EQy5PU3g6KjpkY29zeCkKLQllY2hvIG1pcHMtcHlyYW1pZC1zeXN2NAotCWV4aXQgMCA7OwotICAgIG5ld3MqOk5FV1MqOio6KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpORVhUU1RFUDoqOiopCi0JZWNobyBpMzg2LW5leHQtbmV4dHN0ZXAke1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjY4MD8wOk5FWFRTVEVQOio6KikKLQllY2hvIG02OGstbmV4dC1uZXh0c3RlcCR7UkVMRUFTRX0KLQlleGl0IDAgOzsgICAgCi0gICAgKjM3MDpBSVg6KjoqKQotCWVjaG8gaWJtMzcwLWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBrc3IxOk9TRioxOio6KikKLQllY2hvIGtzcjEta3NyLW9zZjEKLQlleGl0IDAgOzsKLSAgICBlc2E6T1NGKjE6KjoqIHwgRVNBOk9TRio6KjoqKQotCWVjaG8gZXNhLWlibS1vc2YxCi0JZXhpdCAwIDs7Ci0gICAgRE5QKjpETklYOio6KikKLQllY2hvIG02OGstZG5peC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgKjNiMio6KjoqOiopCi0JZWNobyB3ZTMyay1hdHQtc3lzdjMKLQlleGl0IDAgOzsKLSAgICAqOlFOWDoqOjQyKikKLQllY2hvIGkzODYtcXNzbC1xbnhgZWNobyAke1VOQU1FX1ZFUlNJT059YAotCWV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDAgOzsKLSAgICBCZVBDOkJlT1M6KjoqKQotCWVjaG8gaTU4Ni1wYy1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgU1gtNDpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBlbmQgY2FzZXMgYWRkZWQgZm9yIEJhc2gKLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+ZHVtbXkucwotCS5nbG9ibCBtYWluCi0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JLnByb2xvZ3VlIDAKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCWxkYSBcJDIsMjU5Ci0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0Jc3JsIFwkMSw4LFwkMgotCXNsbCBcJDIsMixcJDIKLQlzbGwgXCQwLDMsXCQwCi0JYWRkbCBcJDEsXCQwLFwkMAotCWFkZGwgXCQyLFwkMCxcJDAKLQlyZXQgXCQzMSwoXCQyNiksMQotCS5lbmQgbWFpbgotRU9GCi0JJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCS4vZHVtbXkKLQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQllc2FjCi0JZmkKLQlybSAtZiBkdW1teS5zIGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyIFtbQS1aXV0gW1thLXpdXWAKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay1jYm0tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDAgOzsKLSAgICBhcmM2NDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhrbWlwczpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIGFybTMyOk5ldEJTRDoqOiopCi0JZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQotCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwotCWVsc2UKLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIGk4NnBjOlN1bk9TOjUuKjoqKQotCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzoqOiopCi0JY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgotCSAgICBTZXJpZXMqfFM0KikKLQkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCi0JCTs7Ci0JZXNhYwotCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KLQllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjMqOlN1bk9TOio6KnxzdW46U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXRhcmktbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstYXRhcmktb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay1zdW4tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXBwbGUtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstYXBwbGUtb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyP01hY2ludG9zaDpSaGFwc29keToqOiopCi0gICAgICBlY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0gICAgICBleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLSAgICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotICAgICAgZXhpdCAwIDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgMjAyMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7Ci0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAotCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgMCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjQqOlI0KikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtODhrOio6Myo6UjMqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLQkjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotCVVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCAtbyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdIDsgdGhlbgotCWlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IFwKLQkgICAgIC1vICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXSA7IHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVsc2UgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaT84NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCQlybSAtZiBkdW1teS5jIGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6Kjo0KQotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxpZiBncmVwIGJvczQxMCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX1JFVj00LjEKLQllbGlmIGdyZXAgYm9zNDExIC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fUkVWPTQuMS4xCi0JZWxzZQotCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6KikKLQllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCAwIDs7Ci0gICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKLQllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIDkwMDAvMzE/ICkJCUhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkJSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvNzg/IHwgOTAwMC84MFsyNF0gfCA5MDAwLzhbNjddMSB8IDkwMDAvOFs3OF05IHwgOTAwMC84OTMgKQotCQkJCUhQX0FSQ0g9aHBwYTIuMCA7OwotCSAgICA5MDAwLzc/PyB8IDkwMDAvOD9bMTM2NzldIHwgOTAwMC84OTIgKQotCQkJCUhQX0FSQ0g9aHBwYTEuMSA7OwotCSAgICA5MDAwL1s2OF0/PyApCUhQX0FSQ0g9aHBwYTEuMCA7OwotCWVzYWMKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaHA4Pz86T1NGMToqOiopCi0JZWNobyBocHBhMS4wLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGk/ODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3NmMW1rCi0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlgtTVA6KjoqOiopCi0JZWNobyB4bXAtY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LwotCWV4aXQgMCA7OwotICAgIENSQVkqVFM6KjoqOiopCi0JZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgQ1JBWS0yOio6KjoqKQotCWVjaG8gY3JheTItY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciBbQS1aXSBbYS16XSB8IHNlZCAtZSAncy9cLy8vJ2AKLQlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotCWVjaG8gImYzMDAtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgMCA7OwotICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKLQllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhwM1swLTldWzA1XTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstaHAtb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RnJlZUJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk5ldEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gaTM4Ni1wYy1jeWd3aW4zMgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gaTM4Ni1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgcCo6Q1lHV0lOKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OwotICAgICo6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLgotCWxkX2hlbHBfc3RyaW5nPWBsZCAtLWhlbHAgMj4mMWAKLQlsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucz1gZWNobyAkbGRfaGVscF9zdHJpbmcgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCBlbXVsYXRpb25zOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCBlbXVsYXRpb25zOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLQljYXNlICIkbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnMiIGluCi0JICBpPzg2bGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiICAgICAgOyBleGl0IDAgOzsKLQkgIGk/ODZjb2ZmKSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIgICAgICA7IGV4aXQgMCA7OwotCSAgc3BhcmNsaW51eCkgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBtNjhrbGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIGVsZjMycHBjKSAgIGVjaG8gInBvd2VycGMtdW5rbm93bi1saW51eC1nbnUiICAgICAgICAgICAgICA7IGV4aXQgMCA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gImFscGhhIiA7IHRoZW4KLQkJc2VkICdzL14JLy8nICA8PEVPRiA+ZHVtbXkucwotCQkuZ2xvYmwgbWFpbgotCQkuZW50IG1haW4KLQltYWluOgotCQkuZnJhbWUgXCQzMCwwLFwkMjYsMAotCQkucHJvbG9ndWUgMAotCQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCQlsZGEgXCQyLDI1OQotCQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKLQkJc3JsIFwkMSw4LFwkMgotCQlzbGwgXCQyLDIsXCQyCi0JCXNsbCBcJDAsMyxcJDAKLQkJYWRkbCBcJDEsXCQwLFwkMAotCQlhZGRsIFwkMixcJDAsXCQwCi0JCXJldCBcJDMxLChcJDI2KSwxCi0JCS5lbmQgbWFpbgotRU9GCi0JCUxJQkM9IiIKLQkJJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJLi9kdW1teQotCQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQkJZXNhYwotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAotCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQotCQlybSAtZiBkdW1teS5zIGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JICBybSAtZiBkdW1teS5jIGR1bW15Ci0JZWxzZQotCSAgIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpCi0JICAjIG9yIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkgICMgR0NDIHdhbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbGludXgtZ251b2xkbGQgYW5kIGxpbnV4LWdudWFvdXQuCi0JICAjIElmIGxkIGRvZXMgbm90IHByb3ZpZGUgKmFueSogInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgICMgdGhhdCBtZWFucyBpdCBpcyBnbnVvbGRsZC4KLQkgIGVjaG8gIiRsZF9oZWxwX3N0cmluZyIgfCBncmVwID4vZGV2L251bGwgMj4mMSAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgdGVzdCAkPyAhPSAwICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiICYmIGV4aXQgMAotCi0JICBjYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgaT84NikKLQkgICAgVkVORE9SPXBjOwotCSAgICA7OwotCSAgKikKLQkgICAgVkVORE9SPXVua25vd247Ci0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZmRlZiBfX0VMRl9fCi0jIGlmZGVmIF9fR0xJQkNfXwotIyAgaWYgX19HTElCQ19fID49IDIKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSMgIGVsc2UKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyAgZW5kaWYKLSMgZWxzZQotICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgZW5kaWYKLSNlbHNlCi0gIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVhb3V0XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWZpIDs7Ci0jIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLiAgZWFybGllciB2ZXJzaW9ucwotIyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGggc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0gICAgaT84NjpEWU5JWC9wdHg6NCo6KikKLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotIyBhZGRlZCBieSBjaGV0IGZvciBiYXNoIGJhc2VkIG9uIHVzZW5ldCBwb3N0aW5nIGZyb20gPGhvcHNAc2NvLmNvbT4gYW5kCi0jIGRvY3VtZW50YXRpb24gb24gU0NPJ3Mgd2ViIHNpdGUgLS0gVW5peFdhcmUgNyAoU1ZSNSkKLSAgICBpPzg2OlVuaXhXYXJlOjUqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y1dXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpVTklYX1NWOjQuMk1QOjIuKikKLQkjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0JIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotCSMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0JIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqIHwgaT84NjpVTklYX1NWOjQuKjoqKQotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLQkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgotCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG02OCo6THlueE9TOjIuKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2Okx5bnhPUzoyLio6KikKLQllY2hvIGkzODYtcGMtbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6THlueE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqIHwgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgMCA7OwotICAgIFBFTlRJVU06Q1B1bml4OjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLQkJCSAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLQllY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgCi0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBuZXdzKjpORVdTLU9TOio6NiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgMCA7OwotICAgIFIzMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkJZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkJZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIFBFTlRJVU06Q1B1bml4OjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLQllY2hvIGk1ODYtdW5pc3lzLXN5c3Y0IAotCWV4aXQgMCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotY2F0ID5kdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDkwMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jaWYgIWRlZmluZWQgKHVsdHJpeCkKLSAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLS8qIEJlZ2luIGNhc2VzIGFkZGVkIGZvciBCYXNoICovCi0jaWYgZGVmaW5lZCAodGFob2UpCi0gIHByaW50ZiAoInRhaG9lLWNjaS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAobmVjX2V3cykKLSMgIGlmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLSAgcHJpbnRmICgiZXdzNDgwMC1uZWMtc3lzdjRcbiIpOyBleGl0IDA7Ci0jICBlbHNlCi0gIHByaW50ZiAoImV3czQ4MDAtbmVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc29ueSkKLSMgIGlmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLSAgcHJpbnRmICgibWlwcy1zb255LXN5c3Y0XG4iKTsgZXhpdCAwOwotIyAgZWxzZQotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhcmRlbnQpCi0gIHByaW50ZiAoInRpdGFuLWFyZGVudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc3RhcmRlbnQpCi0gIHByaW50ZiAoInN0YXJkZW50LXN0YXJkZW50LXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaWJtMDMyKQotICBwcmludGYgKCJpYm1ydC1pYm0tYnNkNC4zXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpICYmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAocW54KSAmJiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXBjLXFueFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChnb3VsZCkKLSAgcHJpbnRmICgiZ291bGQtZ291bGQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHVuaXhwYykKLSAgcHJpbnRmICgidW5peHBjLWF0dC1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGF0dDM4NikKLSAgcHJpbnRmICgiaTM4Ni1hdHQtc3lzdjNcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19tODhrKSAmJiBkZWZpbmVkIChfX1VNQVhWX18pCi0gIHByaW50ZiAoIm04OGstZW5jb3JlLXN5c3YzXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGRyczYwMDApCi0gIHByaW50ZiAoImRyczYwMDAtaWNsLXN5c3Y0LjJcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoY2xpcHBlcikKLSAgcHJpbnRmICgiY2xpcHBlci1vcmlvbi1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaXM2OGspCi0gIHByaW50ZiAoIm02OGstaXNpLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChsdW5hODhrKQotICBwcmludGYgKCJsdW5hODhrLW9tcm9uLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChidXR0ZXJmbHkpICYmIGRlZmluZWQgKEJGTFkxKQotICBwcmludGYgKCJidXR0ZXJmbHktYmJuLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodG93ZXIzMikKLSAgcHJpbnRmICgidG93ZXIzMi1uY3Itc3lzdjRcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTWFnaWNTdGF0aW9uKQotICBwcmludGYgKCJtYWdpY3N0YXRpb24tdW5rbm93bi1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2NzKQotICBwcmludGYgKCJzeW1tZXRyaWMtc2NzLWJzZDQuMlxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh0YW5kZW0pCi0gIHByaW50ZiAoInRhbmRlbS10YW5kZW0tc3lzdlxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChjYWRtdXMpCi0gIHByaW50ZiAoImNhZG11cy1wY3Mtc3lzdlxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChtYXNzY29tcCkKLSAgcHJpbnRmICgibWFzc2NvbXAtbWFzc2NvbXAtc3lzdjNcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaGJ1bGx4MjApCi0gIHByaW50ZiAoImhidWxseDIwLWJ1bGwtc3lzdjNcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0vKiBFbmQgY2FzZXMgYWRkZWQgZm9yIEJhc2ggKi8KLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0ke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLXJtIC1mIGR1bW15LmMgZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotIyBCZWdpbiBjYXNlcyBhZGRlZCBmb3IgQmFzaAotY2FzZSAiJFVOQU1FIiBpbgotdXRzKSBlY2hvIHV0cy1hbWRhaGwtc3lzdiR7VU5BTUVfUkVMRUFTRX07IGV4aXQgMCA7OwotZXNhYwotCi1pZiBbIC1kIC91c3IvYW1pZ2EgXTsgdGhlbgotCWVjaG8gbTY4ay1jYm0tc3lzdiR7VU5BTUVfUkVMRUFTRX07IGV4aXQgMDsKLWZpCi0KLWlmIFsgLWYgL2Jpbi9meGMuaW5mbyBdOyB0aGVuCi0JZWNobyBmeGMtYWxsaWFudC1jb25jZW50cml4Ci0JZXhpdCAwCi1maQotIyBlbmQgY2FzZXMgYWRkZWQgZm9yIEJhc2gKLQotI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCi0KLWV4aXQgMQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc3VwcG9ydC9jb25maWcuc3ViIGIvcmVhZGxpbmUvc3VwcG9ydC9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMWVjMmRmLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3N1cHBvcnQvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDk5MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1pZiBbIHgkMSA9IHggXQotdGhlbgotCWVjaG8gQ29uZmlndXJhdGlvbiBuYW1lIG1pc3NpbmcuIDE+JjIKLQllY2hvICJVc2FnZTogJDAgQ1BVLU1GUi1PUFNZUyIgMT4mMgotCWVjaG8gIm9yICAgICAkMCBBTElBUyIgMT4mMgotCWVjaG8gd2hlcmUgQUxJQVMgaXMgYSByZWNvZ25pemVkIGNvbmZpZ3VyYXRpb24gdHlwZS4gMT4mMgotCWV4aXQgMQotZmkKLQotIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi1jYXNlICQxIGluCi0JKmxvY2FsKikKLQkJZWNobyAkMQotCQlleGl0IDAKLQkJOzsKLQkqKQotCTs7Ci1lc2FjCi0KLSMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KLSMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCi1tYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKLWNhc2UgJG1heWJlX29zIGluCi0gIGxpbnV4LWdudSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNSkKLQkJb3M9LXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJtIFwKLQkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgXAotCQl8IHRyb24gfCBhMjlrIHwgNTgwIHwgaTk2MCB8IGg4MzAwIHwgaHBwYSB8IGhwcGExLjAgfCBocHBhMS4xIFwKLQkJfCBocHBhMi4wIHwgYWxwaGEgfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCBcCi0JCXwgcG93ZXJwYyB8IHBvd2VycGNsZSB8IDE3NTBhIHwgZHNwMTZ4eCB8IG1pcHM2NCB8IG1pcHNlbCBcCi0JCXwgcGRwMTEgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JCXwgc3BhcmMgfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjNjQpCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWlbMzQ1Nl04NikKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2XTg2LSogfCBpODYwLSogfCBtNjhrLSogfCBtNjgwMDAtKiB8IG04OGstKiBcCi0JICAgICAgfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFybS0qIHwgY1sxMjNdKiBcCi0JICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiB8IHBvd2VyLSogXAotCSAgICAgIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGk5NjAtKiB8IHhtcC0qIHwgeW1wLSogXAotCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIHwgaHBwYTIuMC0qIFwKLQkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2NS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTU2LSogfCBhbHBoYWV2Ni0qIFwKLQkgICAgICB8IHdlMzJrLSogfCBjeWRyYS0qIHwgbnMxNmstKiBcCi0JICAgICAgfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiB8IGNsaXBwZXItKiB8IG9yaW9uLSogfCBzcGFyY2xpdGUtKiBcCi0JICAgICAgfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIHwgc3BhcmM2NC0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCi0JICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiB8IGYzMDEtKiBcCi0JICAgICAgfCBidXR0ZXJmbHktYmJuKiBcCi0JICAgICAgfCBjYWRtdXMtKiB8IGV3cyotbmVjIHwgaWJtcnQtaWJtKiB8IG1hc3Njb21wLW1hc3Njb21wIFwKLQkgICAgICB8IHRhbmRlbS0qIHwgc3ltbWV0cmljLSogfCBkcnM2MDAwLWljbCB8ICotKmFyZGVudCB8IGdvdWxkLWdvdWxkIFwKLQkgICAgICB8IGNvbmN1cnJlbnQtKiB8IGtzcjEtKiB8IGVzYS1pYm0gfCBmeGMtYWxsaWFudCB8ICozNzAtYW1kYWhsIFwKLQkgICAgICB8ICotY29udmV4IHwgc3g0Ki1uZWMpCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAotCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCi0JM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAotCQk7OwotCTNiKikKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLSMJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1hbWlnYWRvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCB5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXkyKQotCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCVtjdGpdOTAtY3JheSkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQloYnVsbHgyMC1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCB8IG11bHRpbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs3WzAtOV1bMC05XSB8IGhwN1swLTldWzAtOV0gfCBocDlrOFswLTldNyB8IGhwOFswLTldNykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaWJtMDMyLSopCi0JCWJhc2ljX21hY2hpbmU9aWJtcnQtaWJtCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTZdODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaVszNDU2XTg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaVszNDU2XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2XTg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQlsdW5hODhrLW9tcm9uKiB8IG04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdpY3N0YXRpb24qKQotCQliYXNpY19tYWNoaW5lPW1hZ2ljc3RhdGlvbi11bmtub3duCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQltaXBzZWwqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgotCQlvcz0tbGludXgKLQkJOzsKLQltaXBzKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW5jcjMwMDApCi0JCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQlvc3I1IHwgc2NvNSkJIyBTQ08gT3BlbiBTZXJ2ZXIKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1zY28zLjJ2NQotCQk7OwotCW9kdCB8IG9kdDMgfCBvZHQ0KQkjIFNDTyBPcGVuIERlc2t0b3AKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1zY28zLjJ2NAotCQk7OwotCXBhLWhpdGFjaGkpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JcGFyYWdvbikKLQkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCi0JCW9zPS1vc2YKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0gICAgICAgIHBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBlbnRpdW0gfCBwNSkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWludGVsCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtaW50ZWwKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlrNSkKLQkJIyBXZSBkb24ndCBoYXZlIHNwZWNpZmljIHN1cHBvcnQgZm9yIEFNRCdzIEs1IHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQotCQliYXNpY19tYWNoaW5lPWk1ODYtYW1kCi0JCTs7Ci0JbmV4ZW4pCi0JCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBOZXhnZW4geWV0LCBzbyBqdXN0IGNhbGwgaXQgYSBQZW50aXVtCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1uZXhnZW4KLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXV3MiB8IHVuaXh3YXJlIHwgdW5peHdhcmUyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LXN5c3Y0LjJ1dzIuMQotCQk7OwotCXV3NyB8IHVuaXh3YXJlNykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1zeXN2NXV3NwotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0JCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0JCTs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl4bXApCi0JCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotICAgICAgICB4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQltaXBzKQotCQlpZiB0ZXN0ICJ4JG9zIiA9ICJ4LWxpbnV4IiA7IHRoZW4KLQkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCWVsc2UKLQkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCWZpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzcGFyYykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLSAgICAgICAgY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotCSMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0JIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlIHwgLXV3IHwgLXVuaXh3YXJlMiogfCAtdXcyKikKLQkJb3M9LXN5c3Y0LjJ1dzIuMQotCQk7OwotCS11bml4d2FyZTcqIHwgLXV3NyopCi0JCW9zPS1zeXN2NXV3NwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWN5Z3dpbjMyKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLWxpbnV4LWdudSogfCAtdXhwdiogfCAtcW54KiB8IC1wb3dlcnV4KiB8IC1iZW9zKiB8IC1yaGFwc29keSogXAotCSAgICAgIHwgLXN1cGVydXgqICkKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN5c3ZyNSkKLQkJb3M9LXN5c3Y1Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnJbNDVdLgotCS1zeXN2KikKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0gICAgICAgICotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0gICAgICAgICotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLSAgICAgICAgKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0gICAgICAgICotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMDEtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWx5bnhvcyopCi0JCQkJdmVuZG9yPWx5bngKLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc3VwcG9ydC9pbnN0YWxsLnNoIGIvcmVhZGxpbmUvc3VwcG9ydC9pbnN0YWxsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTg4MjEyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3N1cHBvcnQvaW5zdGFsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0jIFRoaXMgY29tZXMgZnJvbSBYMTFSNS4KLSMKLSMgJFhDb25zb3J0aXVtOiBpbnN0YWxsLnNoLHYgMS4yIDg5LzEyLzE4IDE0OjQ3OjIyIGppbSBFeHAgJAotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4KLSMKLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbmZvcm1iYXNlbmFtZT0iIgotdHJhbnNmb3JtX2FyZz0iIgotaW5zdGNtZD0iJG12cHJvZyIKLWNobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCi1jaG93bmNtZD0iIgotY2hncnBjbWQ9IiIKLXN0cmlwY21kPSIiCi1ybWNtZD0iJHJtcHJvZyAtZiIKLW12Y21kPSIkbXZwcm9nIgotc3JjPSIiCi1kc3Q9IiIKLWRpcl9hcmc9IiIKLQotd2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCi0gICAgY2FzZSAkMSBpbgotCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZCkgZGlyX2FyZz10cnVlCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQkqKSAgaWYgWyB4IiRzcmMiID0geCBdCi0JICAgIHRoZW4KLQkJc3JjPSQxCi0JICAgIGVsc2UKLQkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCi0JCToKLQkJZHN0PSQxCi0JICAgIGZpCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLSAgICBlc2FjCi1kb25lCi0KLWlmIFsgeCIkc3JjIiA9IHggXQotdGhlbgotCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgotCWV4aXQgMQotZWxzZQotCXRydWUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCi0JZHN0PSRzcmMKLQlzcmM9IiIKLQkKLQlpZiBbIC1kICRkc3QgXTsgdGhlbgotCQlpbnN0Y21kPToKLQllbHNlCi0JCWluc3RjbWQ9bWtkaXIKLQlmaQotZWxzZQotCi0jIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKLSMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCi0jIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLQotCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KLQl0aGVuCi0JCXRydWUKLQllbHNlCi0JCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgotCQlleGl0IDEKLQlmaQotCQotCWlmIFsgeCIkZHN0IiA9IHggXQotCXRoZW4KLQkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotCQlleGl0IDEKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQotIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCi0KLQlpZiBbIC1kICRkc3QgXQotCXRoZW4KLQkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKLQllbHNlCi0JCXRydWUKLQlmaQotZmkKLQotIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCi1kc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCi0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0jICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKLQotIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLWlmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgotZGVmYXVsdElGUz0nCQotJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKLQotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgotCi1wYXRoY29tcD0nJwotCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKLQotCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOwotICAgICAgICB0aGVuCi0JCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgotZG9uZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KLXRoZW4KLQkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCi1lbHNlCi0KLSMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgotCi0JaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCi0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKLQlmaQotCi0jIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKLQotCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotCi0JZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCi0KLSMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQotCi0JJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCi0KLQl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKLQotIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCi0KLSMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KLSMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0KLSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQotCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCi0JJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKLQotZmkgJiYKLQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3N1cHBvcnQvbWtkaXJzIGIvcmVhZGxpbmUvc3VwcG9ydC9ta2RpcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3OWQ5NzEuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvc3VwcG9ydC9ta2RpcnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIG1rZGlycyAtIGEgd29yay1hbGlrZSBmb3IgYG1rZGlyIC1wJwotIwotIyBDaGV0IFJhbWV5Ci0jIGNoZXRAcG8uY3dydS5lZHUKLQotZm9yIGRpcgotZG8KLQotCXRlc3QgLWQgIiRkaXIiICYmIGNvbnRpbnVlCi0KLQl0b21ha2U9JGRpcgotCXdoaWxlIHRlc3QgLW4gIiRkaXIiIDsgZG8KLQkJIyBkaXI9JHtkaXIlLyp9Ci0JCSMgZGlyPWBleHByICIkZGlyIiAnOicgJ1woLy4qXCkvW14vXSonYAotCQlpZiBkaXI9YGV4cHIgIiRkaXIiICc6JyAnXCguKlwpL1teL10qJ2A7IHRoZW4KLQkJCXRvbWFrZT0iJGRpciAkdG9tYWtlIgotCQllbHNlCi0JCQlkaXI9Ci0JCWZpCi0JZG9uZQotCi0JZm9yIGQgaW4gJHRvbWFrZQotCWRvCi0JCXRlc3QgLWQgIiRkIiAmJiBjb250aW51ZQotCQllY2hvIG1rZGlyICIkZCIKLQkJbWtkaXIgIiRkIgotCWRvbmUKLWRvbmUKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9yZWFkbGluZS9zdXBwb3J0L21rZGlzdCBiL3JlYWRsaW5lL3N1cHBvcnQvbWtkaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWU0ZWIxLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3N1cHBvcnQvbWtkaXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMhIC9iaW4vYmFzaCAtCi0jCi0jIG1rZGlzdCAtIG1ha2UgYSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IGZyb20gYSBtYXN0ZXIgbWFuaWZlc3QgZmlsZQotIwotIyB1c2FnZTogbWtkaXN0IFstbSBtYW5pZmVzdF0gWy1zIHNyY2Rpcl0gWy1yIHJvb3RuYW1lXSBbLXZdIHZlcnNpb24KLSMKLSMgU1JDRElSIGRlZmF1bHRzIHRvIHNyYwotIyBNQU5JRkVTVCBkZWZhdWx0cyB0byAkU1JDRElSL01BTklGRVNUCi0jCi0KLVNSQ0RJUj1zcmMKLVJPT1ROQU1FPWJhc2gKLQotdXNhZ2UoKQotewotCWVjaG8gdXNhZ2U6IG1rZGlzdCBbLW0gbWFuaWZlc3RdIFstcyBzcmNkaXJdIFstciByb290bmFtZV0gWy12XSB2ZXJzaW9uIDE+JjIKLQlleGl0IDIKLX0KLQotdm1zZygpCi17Ci0JaWYgWyAtbiAiJHZlcmJvc2UiIF07IHRoZW4KLQkJZWNobyBta2Rpc3Q6ICIkQCIKLQlmaQotfQotCi13aGlsZSBnZXRvcHRzIG06czpyOnYgbmFtZQotZG8KLQljYXNlICRuYW1lIGluCi0JbSkJTUFOSUZFU1Q9JE9QVEFSRyA7OwotCXMpCVNSQ0RJUj0kT1BUQVJHIDs7Ci0JcikJUk9PVE5BTUU9JE9QVEFSRyA7OwotCXYpCXZlcmJvc2U9eWVzIDs7Ci0JPykJdXNhZ2UgOzsKLQllc2FjCi1kb25lCi0KLTogJHtNQU5JRkVTVDo9JFNSQ0RJUi9NQU5JRkVTVH0KLQotdm1zZyB1c2luZyAkTUFOSUZFU1QKLQotc2hpZnQgJCgoICRPUFRJTkQgLSAxICkpCi0KLWlmIFsgJCMgLWx0IDEgXTsgdGhlbgotCXVzYWdlCi1maQotCi12ZXJzaW9uPSQxCi1uZXdkaXI9JHtST09UTkFNRX0tJHZlcnNpb24KLQotdm1zZyBjcmVhdGluZyBkaXN0cmlidXRpb24gZm9yICRST09UTkFNRSB2ZXJzaW9uICR2ZXJzaW9uIGluICRuZXdkaXIKLQotaWYgWyAhIC1kICRuZXdkaXIgXTsgdGhlbgotCW1rZGlyICRuZXdkaXIgfHwgeyBlY2hvICQwOiBjYW5ub3QgbWFrZSBkaXJlY3RvcnkgJG5ld2RpciAxPiYyIDsgZXhpdCAxOyB9Ci1maQotCi1kaXJtb2RlPTc1NQotZmlsbW9kZT02NDQKLQotd2hpbGUgcmVhZCBmbmFtZSB0eXBlIG1vZGUKLWRvCi0JWyAteiAiJGZuYW1lIiBdICYmIGNvbnRpbnVlCi0KLQljYXNlICIkZm5hbWUiIGluCi0JXCMqKQljb250aW51ZSA7OwotCWVzYWMKLQotCWNhc2UgIiR0eXBlIiBpbgotCWQpCW1rZGlyICRuZXdkaXIvJGZuYW1lIDs7Ci0JZikJY3AgLXAgJFNSQ0RJUi8kZm5hbWUgJG5ld2Rpci8kZm5hbWUgOzsKLQkqKQllY2hvICJ1bmtub3duIGZpbGUgdHlwZSAkdHlwZSIgMT4mMiA7OwotCWVzYWMKLQotCWlmIFsgLW4gIiRtb2RlIiBdOyB0aGVuCi0JCWNobW9kICRtb2RlICRuZXdkaXIvJGZuYW1lCi0JZmkKLQotZG9uZSA8ICRNQU5JRkVTVAotCi0jIGN1dCBvZmYgdGhlIGAtYWxwaGEnIGluIHNvbWV0aGluZyBsaWtlIGAyLjAtYWxwaGEnLCBsZWF2aW5nIGp1c3QgdGhlCi0jIG51bWVyaWMgdmVyc2lvbgotI3ZlcnNpb249JHt2ZXJzaW9uJSUtKn0KLQotI2Nhc2UgIiR2ZXJzaW9uIiBpbgotIyouKi4qKQl2ZXJzPSR7dmVyc2lvbiUuKn0gOzsKLSMqLiopCXZlcnM9JHt2ZXJzaW9ufSA7OwotI2VzYWMKLQotI2VjaG8gJHZlcnMgPiAkbmV3ZGlyLy5kaXN0cmlidXRpb24KLQotI2Nhc2UgIiR2ZXJzaW9uIiBpbgotIyouKi4qKQlwbGV2ZWw9JHt2ZXJzaW9uIyMqLn0gOzsKLSMqKQlwbGV2ZWw9MCA7OwotI2VzYWMKLSNbIC16ICIkcGxldmVsIiBdICYmIHBsZXZlbD0wCi0jZWNobyAke3BsZXZlbH0gPiAkbmV3ZGlyLy5wYXRjaGxldmVsCi0KLXZtc2cgJG5ld2RpciBjcmVhdGVkCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc3VwcG9ydC9zaGxpYi1pbnN0YWxsIGIvcmVhZGxpbmUvc3VwcG9ydC9zaGxpYi1pbnN0YWxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDNhN2MwLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3N1cHBvcnQvc2hsaWItaW5zdGFsbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIHNobGliLWluc3RhbGwgLSBpbnN0YWxsIGEgc2hhcmVkIGxpYnJhcnkgYW5kIGRvIGFueSBuZWNlc3NhcnkgaG9zdC1zcGVjaWZpYwotIwkJICBwb3N0LWluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uIChsaWtlIGxkY29uZmlnKQotIwotIyB1c2FnZTogc2hsaWItaW5zdGFsbCBbLURdIC1PIGhvc3Rfb3MgLWQgaW5zdGFsbGF0aW9uLWRpciAtaSBpbnN0YWxsLXByb2cgWy1VXSBsaWJyYXJ5Ci0jCi0jIENoZXQgUmFtZXkKLSMgY2hldEBwby5jd3J1LmVkdQotCi0jCi0jIGRlZmF1bHRzCi0jCi1JTlNUQUxMRElSPS91c3IvbG9jYWwvbGliCi1MRENPTkZJRz1sZGNvbmZpZwotCi1QUk9HTkFNRT1gYmFzZW5hbWUgJDBgCi1VU0FHRT0iJFBST0dOQU1FIFstRF0gLU8gaG9zdF9vcyAtZCBpbnN0YWxsYXRpb24tZGlyIC1pIGluc3RhbGwtcHJvZyBbLVVdIGxpYnJhcnkiCi0KLSMgcHJvY2VzcyBvcHRpb25zCi0KLXdoaWxlIFsgJCMgLWd0IDAgXTsgZG8KLQljYXNlICIkMSIgaW4KLQktTykJc2hpZnQ7IGhvc3Rfb3M9IiQxIjsgc2hpZnQgOzsKLQktZCkJc2hpZnQ7IElOU1RBTExESVI9IiQxIjsgc2hpZnQgOzsKLQktaSkJc2hpZnQ7IElOU1RBTExQUk9HPSIkMSIgOyBzaGlmdCA7OwotCS1EKQllY2hvPWVjaG8gOyBzaGlmdCA7OwotCS1VKQl1bmluc3RhbGw9dHJ1ZSA7IHNoaWZ0IDs7Ci0JLSopCWVjaG8gIiRVU0FHRSIgPiYyIDsgZXhpdCAyOzsKLQkqKQlicmVhayA7OwotCWVzYWMKLWRvbmUKLQotIyBzZXQgaW5zdGFsbCB0YXJnZXQgbmFtZQotTElCTkFNRT0iJDEiCi0KLWlmIFsgLXogIiRMSUJOQU1FIiBdOyB0aGVuCi0JZWNobyAiJFVTQUdFIiA+JjIKLQlleGl0IDIKLWZpCi0KLU9MRFNVRkY9b2xkCi1NVj1tdgotUk09InJtIC1mIgotTE49ImxuIC1zIgotCi0jIHByZS1pbnN0YWxsCi0KLWlmIFsgLXogIiR1bmluc3RhbGwiIF07IHRoZW4KLQkke2VjaG99ICRSTSAke0lOU1RBTExESVJ9LyR7TElCTkFNRX0uJHtPTERTVUZGfQotCWlmIFsgLWYgIiRJTlNUQUxMRElSLyRMSUJOQU1FIiBdOyB0aGVuCi0JCSR7ZWNob30gJE1WICRJTlNUQUxMRElSLyRMSUJOQU1FICR7SU5TVEFMTERJUn0vJHtMSUJOQU1FfSR7T0xEU1VGRn0KLQlmaQotZmkKLQotIyBpbnN0YWxsL3VuaW5zdGFsbAotCi1pZiBbIC16ICIkdW5pbnN0YWxsIiBdIDsgdGhlbgotCSR7ZWNob30gZXZhbCAke0lOU1RBTExQUk9HfSAkTElCTkFNRSAke0lOU1RBTExESVJ9LyR7TElCTkFNRX0KLWVsc2UKLQkke2VjaG99ICR7Uk19ICR7SU5TVEFMTERJUn0vJHtMSUJOQU1FfQotZmkKLQotIyBwb3N0LWluc3RhbGwvdW5pbnN0YWxsCi0KLWNhc2UgIiRMSUJOQU1FIiBpbgotKi4qLlswLTldLlswLTldKQkjIGxpYm5hbWUuc28uTS5OCi0JTElOSzI9YGVjaG8gJExJQk5BTUUgfCBzZWQgJ3M6XCguKlwuLipcLlswLTldXClcLlswLTldOlwxOidgCSMgbGlibmFtZS5zby5NCi0JTElOSzE9YGVjaG8gJExJQk5BTUUgfCBzZWQgJ3M6XCguKlwuLipcKVwuWzAtOV1cLlswLTldOlwxOidgCSMgbGlibmFtZS5zbwotCTs7Ci0qLiouWzAtOV0pCQkjIGxpYm5hbWUuc28uTQotCUxJTksxPWBlY2hvICRMSUJOQU1FIHwgc2VkICdzOlwoLipcLi4qXClcLlswLTldOlwxOidgCQkjIGxpYm5hbWUuc28KLQk7OwotZXNhYwotCi0jCi0jIENyZWF0ZSBzeW1saW5rcyB0byB0aGUgaW5zdGFsbGVkIGxpYnJhcnkuICBUaGlzIHNlY3Rpb24gaXMgaW5jb21wbGV0ZS4KLSMKLWNhc2UgIiRob3N0X29zIiBpbgotKmxpbnV4Knxic2RpNCopCi0JIyBsaWJuYW1lLnNvLk0gLT4gbGlibmFtZS5zby5NLk4KLQkke2VjaG99ICR7Uk19ICR7SU5TVEFMTERJUn0vJExJTksyCi0JaWYgWyAteiAiJHVuaW5zdGFsbCIgXTsgdGhlbgotCQkke2VjaG99IGxuIC1zICRJTlNUQUxMRElSLyRMSUJOQU1FICR7SU5TVEFMTERJUn0vJExJTksyCi0JZmkKLQotCSMgbGlibmFtZS5zbyAtPiBsaWJuYW1lLnNvLk0uTgotCSR7ZWNob30gJHtSTX0gJHtJTlNUQUxMRElSfS8kTElOSzEKLQlpZiBbIC16ICIkdW5pbnN0YWxsIiBdOyB0aGVuCi0JCSR7ZWNob30gbG4gLXMgJElOU1RBTExESVIvJExJQk5BTUUgJHtJTlNUQUxMRElSfS8kTElOSzEKLQlmaQotCTs7Ci0KLXNvbGFyaXMyKnxhaXg0LlsyLTldKnxocHV4MSopCi0JIyBsaWJuYW1lLnNvIC0+IGxpYm5hbWUuc28uTQotCSR7ZWNob30gJHtSTX0gJHtJTlNUQUxMRElSfS8kTElOSzEKLQlpZiBbIC16ICIkdW5pbnN0YWxsIiBdOyB0aGVuCi0JCSR7ZWNob30gbG4gLXMgJElOU1RBTExESVIvJExJQk5BTUUgJHtJTlNUQUxMRElSfS8kTElOSzEKLQlmaQotCTs7Ci0KLSopCTs7Ci1lc2FjCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvc3VwcG9ydC9zaG9iai1jb25mIGIvcmVhZGxpbmUvc3VwcG9ydC9zaG9iai1jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmY4YzMyLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3N1cHBvcnQvc2hvYmotY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIHNob2JqLWNvbmYgLS0gb3V0cHV0IGEgc2VyaWVzIG9mIHZhcmlhYmxlIGFzc2lnbm1lbnRzIHRvIGJlIHN1YnN0aXR1dGVkCi0jCQlpbnRvIGEgTWFrZWZpbGUgYnkgY29uZmlndXJlIHdoaWNoIHNwZWNpZnkgc3lzdGVtLWRlcGVuZGVudAotIwkJaW5mb3JtYXRpb24gZm9yIGNyZWF0aW5nIHNoYXJlZCBvYmplY3RzIHRoYXQgbWF5IGJlIGxvYWRlZAotIwkJaW50byBiYXNoIHdpdGggYGVuYWJsZSAtZicKLSMKLSMgdXNhZ2U6IHNob2JqLWNvbmYgWy1DIGNvbXBpbGVyXSAtYyBob3N0X2NwdSAtbyBob3N0X29zIC12IGhvc3RfdmVuZG9yCi0jCi0jIENoZXQgUmFtZXkKLSMgY2hldEBwby5jd3J1LmVkdQotCi0jCi0jIGRlZmF1bHRzCi0jCi1TSE9CSl9TVEFUVVM9c3VwcG9ydGVkCi1TSExJQl9TVEFUVVM9c3VwcG9ydGVkCi0KLVNIT0JKX0NDPWNjCi1TSE9CSl9DRkxBR1M9Ci1TSE9CSl9MRD0KLVNIT0JKX0xERkxBR1M9Ci1TSE9CSl9YTERGTEFHUz0KLVNIT0JKX0xJQlM9Ci0KLVNITElCX1hMREZMQUdTPQotU0hMSUJfTElCUz0KLVNITElCX0xJQlNVRkY9J3NvJwotCi1TSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpJwotCi1QUk9HTkFNRT1gYmFzZW5hbWUgJDBgCi1VU0FHRT0iJFBST0dOQU1FIFstQyBjb21waWxlcl0gLWMgaG9zdF9jcHUgLW8gaG9zdF9vcyAtdiBob3N0X3ZlbmRvciIKLQotd2hpbGUgWyAkIyAtZ3QgMCBdOyBkbwotCWNhc2UgIiQxIiBpbgotCS1DKQlzaGlmdDsgU0hPQkpfQ0M9IiQxIjsgc2hpZnQgOzsKLQktYykJc2hpZnQ7IGhvc3RfY3B1PSIkMSI7IHNoaWZ0IDs7Ci0JLW8pCXNoaWZ0OyBob3N0X29zPSIkMSI7IHNoaWZ0IDs7Ci0JLXYpCXNoaWZ0OyBob3N0X3ZlbmRvcj0iJDEiOyBzaGlmdCA7OwotCSopCWVjaG8gIiRVU0FHRSIgPiYyIDsgZXhpdCAyOzsKLQllc2FjCi1kb25lCi0KLWNhc2UgIiR7aG9zdF9vc30tJHtTSE9CSl9DQ30iIGluCi1zdW5vczQqLWdjYyopCi0JU0hPQkpfQ0ZMQUdTPS1mcGljCi0JU0hPQkpfTEQ9L3Vzci9iaW4vbGQKLQlTSE9CSl9MREZMQUdTPSctYXNzZXJ0IHB1cmUtdGV4dCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUikkKFNITElCX01JTk9SKScKLQk7OwotCi1zdW5vczQqKQotCVNIT0JKX0NGTEFHUz0tcGljCi0JU0hPQkpfTEQ9L3Vzci9iaW4vbGQKLQlTSE9CSl9MREZMQUdTPSctYXNzZXJ0IHB1cmUtdGV4dCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUikkKFNITElCX01JTk9SKScKLQk7OwotCi1zdW5vczUqLWdjYyp8c29sYXJpczIqLWdjYyopCi0JU0hPQkpfQ0ZMQUdTPS1mcGljCi0JU0hPQkpfTEQ9JyR7Q0N9JwotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQgLVdsLC1pJwotCi0JU0hMSUJfWExERkxBR1M9Jy1SICQobGliZGlyKScKLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJwotCTs7Ci0KLXN1bm9zNSp8c29sYXJpczIqKQotCVNIT0JKX0NGTEFHUz0nLUsgcGljJwotCVNIT0JKX0xEPS91c3IvY2NzL2Jpbi9sZAotCVNIT0JKX0xERkxBR1M9Jy1HIC1keSAteiB0ZXh0IC1pIC1oICRAJwotCi0JU0hMSUJfWExERkxBR1M9Jy1SICQobGliZGlyKScKLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJwotCTs7Ci0KLWZyZWVic2QyKiB8IG5ldGJzZCogfCBvcGVuYnNkKikKLQlTSE9CSl9DRkxBR1M9LWZwaWMKLQlTSE9CSl9MRD1sZAotCVNIT0JKX0xERkxBR1M9Jy14IC1Cc2hhcmVhYmxlJwotCi0JU0hMSUJfWExERkxBR1M9Jy1SJChsaWJkaXIpJwotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUikkKFNITElCX01JTk9SKScKLQk7OwotCi1mcmVlYnNkMyopCi0JU0hPQkpfQ0ZMQUdTPS1mcGljCi0JU0hPQkpfTEQ9JyR7Q0N9JwotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQnCi0KLQlTSExJQl9YTERGTEFHUz0nLVIkKGxpYmRpciknCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKSQoU0hMSUJfTUlOT1IpJwotCTs7Ci0KLWxpbnV4KikKLQlTSE9CSl9DRkxBR1M9LWZQSUMKLQlTSE9CSl9MRD0nJHtDQ30nCi0JU0hPQkpfTERGTEFHUz0nLXNoYXJlZCAtV2wsLXNvbmFtZSwkQCcKLQotCVNITElCX1hMREZMQUdTPSctV2wsLXJwYXRoLCQobGliZGlyKScKLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJChTSExJQl9NSU5PUiknCi0JOzsKLQotYnNkaTIqKQotCVNIT0JKX0NDPXNobGljYzIKLQlTSE9CSl9DRkxBR1M9Ci0JU0hPQkpfTEQ9bGQKLQlTSE9CSl9MREZMQUdTPS1yCi0JU0hPQkpfTElCUz0tbGNfcy4yLjEuMAotCi0JIyBCU0QvT1MgMi54IGFuZCAzLnggYHNoYXJlZCBsaWJyYXJpZXMnIGFyZSB0b28gbXVjaCBvZiBhIHBhaW4gaW4KLQkjIHRoZSBhc3MgLS0gdGhleSByZXF1aXJlIGNoYW5naW5nIHsvdXNyL2xpYixldGN9L3NobGliLm1hcCBvbgotCSMgZWFjaCBzeXN0ZW0sIGFuZCB0aGUgbGlicmFyeSBjcmVhdGlvbiBwcm9jZXNzIGlzIGJ5emFudGluZQotCVNITElCX1NUQVRVUz11bnN1cHBvcnRlZAotCTs7Ci0KLWJzZGkzKikKLQlTSE9CSl9DQz1zaGxpY2MyCi0JU0hPQkpfQ0ZMQUdTPQotCVNIT0JKX0xEPWxkCi0JU0hPQkpfTERGTEFHUz0tcgotCVNIT0JKX0xJQlM9LWxjX3MuMy4wLjAKLQotCSMgQlNEL09TIDIueCBhbmQgMy54IGBzaGFyZWQgbGlicmFyaWVzJyBhcmUgdG9vIG11Y2ggb2YgYSBwYWluIGluCi0JIyB0aGUgYXNzIC0tIHRoZXkgcmVxdWlyZSBjaGFuZ2luZyB7L3Vzci9saWIsZXRjfS9zaGxpYi5tYXAgb24KLQkjIGVhY2ggc3lzdGVtLCBhbmQgdGhlIGxpYnJhcnkgY3JlYXRpb24gcHJvY2VzcyBpcyBieXphbnRpbmUKLQlTSExJQl9TVEFUVVM9dW5zdXBwb3J0ZWQKLQk7OwotCi1ic2RpNCopCi0JIyBCU0QvT1MgNC54IG5vdyBzdXBwb3J0cyBFTEYgYW5kIFN1bk9TLXN0eWxlIGR5bmFtaWNhbGx5LWxpbmtlZAotCSMgc2hhcmVkIGxpYnJhcmllcy4gIGdjYyAyLnggaXMgdGhlIHN0YW5kYXJkIGNvbXBpbGVyLCBhbmQgdGhlCi0JIyBgbm9ybWFsJyBnY2Mgb3B0aW9ucyBzaG91bGQgd29yayBhcyB0aGV5IGRvIGluIExpbnV4LgotCi0JU0hPQkpfQ0ZMQUdTPS1mUElDCi0JU0hPQkpfTEQ9JyR7Q0N9JwotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQgLVdsLC1zb25hbWUsJEAnCi0KLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJChTSExJQl9NSU5PUiknCi0JOzsKLQotb3NmKikKLQlTSE9CSl9MRD1sZAotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQgLXNvbmFtZSAkQCAtZXhwZWN0X3VucmVzb2x2ZWQgIioiJwotCi0JU0hMSUJfWExERkxBR1M9Jy1ycGF0aCAkKGxpYmRpciknCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1haXg0LlsyLTldKi1nY2MqKQkJIyBsaWdodGx5IHRlc3RlZCBieSBqaWtAY2lzY28uY29tCi0JU0hPQkpfQ0ZMQUdTPS1mcGljCi0JU0hPQkpfTEQ9J2xkJwotCVNIT0JKX0xERkxBR1M9Jy1iZHluYW1pYyAtYm5vZW50cnkgLWJleHBhbGwnCi0JU0hPQkpfWExERkxBR1M9Jy1HJwotCi0JU0hMSUJfWExERkxBR1M9Jy1iTTpTUkUnCi0JU0hMSUJfTElCUz0nLWxjdXJzZXMgLWxjJwotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotYWl4NC5bMi05XSopCi0JU0hPQkpfQ0ZMQUdTPS1LCi0JU0hPQkpfTEQ9J2xkJwotCVNIT0JKX0xERkxBR1M9Jy1iZHluYW1pYyAtYm5vZW50cnkgLWJleHBhbGwnCi0JU0hPQkpfWExERkxBR1M9Jy1HJwotCi0JU0hMSUJfWExERkxBR1M9Jy1iTTpTUkUnCi0JU0hMSUJfTElCUz0nLWxjdXJzZXMgLWxjJwotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotIwotIyBUSEUgRk9MTE9XSU5HIEFSRSBVTlRFU1RFRCAtLSBhbmQgc29tZSBtYXkgbm90IHN1cHBvcnQgdGhlIGRsb3BlbiBpbnRlcmZhY2UKLSMKLWlyaXhbNTZdKi1nY2MqKQotCVNIT0JKX0NGTEFHUz0nLWZwaWMnCi0JU0hPQkpfTEQ9JyR7Q0N9JwotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQgLVdsLC1zb25hbWUsJEAnCi0KLQlTSExJQl9YTERGTEFHUz0nLVdsLC1ycGF0aCwkKGxpYmRpciknCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1pcml4WzU2XSopCi0JU0hPQkpfQ0ZMQUdTPSctSyBQSUMnCi0JU0hPQkpfTEQ9bGQKLQlTSE9CSl9MREZMQUdTPSctY2FsbF9zaGFyZWQgLWhpZGRlbl9zeW1ib2wgLW5vX3VucmVzb2x2ZWQgLXNvbmFtZSAkQCcKLQotCVNITElCX1hMREZMQUdTPSctcnBhdGggJChsaWJkaXIpJwotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotaHB1eDkqLWdjYyopCi0JIyBtdXN0IHVzZSBnY2M7IHRoZSBidW5kbGVkIGNjIGNhbm5vdCBjb21waWxlIFBJQyBjb2RlCi0JU0hPQkpfQ0ZMQUdTPSctZnBpYycKLQlTSE9CSl9MRD0nJHtDQ30nCi0JU0hPQkpfTERGTEFHUz0nLXNoYXJlZCAtV2wsLWIgLVdsLCtzJwotCi0JU0hMSUJfWExERkxBR1M9Jy1XbCwrYiwkKGxpYmRpciknCi0JU0hMSUJfTElCU1VGRj0nc2wnCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1ocHV4OSopCi0JU0hPQkpfU1RBVFVTPXVuc3VwcG9ydGVkCi0JU0hMSUJfU1RBVFVTPXVuc3VwcG9ydGVkCi0JOzsKLQotaHB1eDEwKi1nY2MqKQotCSMgbXVzdCB1c2UgZ2NjOyB0aGUgYnVuZGxlZCBjYyBjYW5ub3QgY29tcGlsZSBQSUMgY29kZQotCVNIT0JKX0NGTEFHUz0nLWZwaWMnCi0JU0hPQkpfTEQ9JyR7Q0N9JwotCVNIT0JKX0xERkxBR1M9Jy1zaGFyZWQgLVdsLC1iIC1XbCwrcycKLQotCVNITElCX1hMREZMQUdTPSctV2wsK2gsJEAgLVdsLCtiLCQobGliZGlyKScKLQlTSExJQl9MSUJTVUZGPSdzbCcKLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJwotCTs7Ci0KLWhwdXgxMCopCi0JU0hPQkpfU1RBVFVTPXVuc3VwcG9ydGVkCi0JU0hMSUJfU1RBVFVTPXVuc3VwcG9ydGVkCi0JOzsKLQotaHB1eDExKi1nY2MqKQotCSMgbXVzdCB1c2UgZ2NjOyB0aGUgYnVuZGxlZCBjYyBjYW5ub3QgY29tcGlsZSBQSUMgY29kZQotCVNIT0JKX0NGTEFHUz0nLWZwaWMnCi0JU0hPQkpfTEQ9JyR7Q0N9JwotIwlTSE9CSl9MREZMQUdTPSctc2hhcmVkIC1XbCwtYiAtV2wsLUIsc3ltYm9saWMgLVdsLCtzIC1XbCwrc3RkIC1XbCwraCwkQCcKLQlTSE9CSl9MREZMQUdTPSctc2hhcmVkIC1XbCwtYiAtV2wsK3MgLVdsLCtoLCRAJwotCi0JU0hMSUJfWExERkxBR1M9Jy1XbCwrYiwkKGxpYmRpciknCi0JU0hMSUJfTElCU1VGRj0nc2wnCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1ocHV4MTEqKQotCVNIT0JKX1NUQVRVUz11bnN1cHBvcnRlZAotCVNITElCX1NUQVRVUz11bnN1cHBvcnRlZAotCTs7Ci0KLXN5c3Y0Ki1nY2MqKQotCVNIT0JKX0NGTEFHUz0tc2hhcmVkCi0JU0hPQkpfTERGTEFHUz0nLXNoYXJlZCAtaCAkQCcKLQlTSE9CSl9MRD0nJHtDQ30nCi0KLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJwotCTs7Ci0KLXN5c3Y0KikKLQlTSE9CSl9DRkxBR1M9Jy1LIFBJQycKLQlTSE9CSl9MRD1sZAotCVNIT0JKX0xERkxBR1M9Jy1keSAteiB0ZXh0IC1HIC1oICRAJwotCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1zY28zLjJ2NSotZ2NjKikKLQlTSE9CSl9DRkxBR1M9Jy1mcGljJwkJIyBERUZBVUxUUyBUTyBFTEYKLQlTSE9CSl9MRD0nJHtDQ30nCi0JU0hPQkpfTERGTEFHUz0nLXNoYXJlZCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotc2NvMy4ydjUqKQotCVNIT0JKX0NGTEFHUz0nLUsgcGljIC1iIGVsZicKLQlTSE9CSl9MRD1sZAotCVNIT0JKX0xERkxBR1M9Jy1HIC1iIGVsZiAtZHkgLXogdGV4dCAtaCAkQCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotc3lzdjV1dzcqLWdjYyopCi0JU0hPQkpfQ0ZMQUdTPSctZnBpYycKLQlTSE9CSl9MRD0nJHtDQ30nCi0JU0hPQkpfTERGTEFHUz0nLXNoYXJlZCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotc3lzdjV1dzcqKQotCVNIT0JKX0NGTEFHUz0nLUsgUElDJwotCVNIT0JKX0xEPWxkCi0JU0hPQkpfTERGTEFHUz0nLUcgLWR5IC16IHRleHQgLWggJEAnCi0KLQlTSExJQl9MSUJWRVJTSU9OPSckKFNITElCX0xJQlNVRkYpLiQoU0hMSUJfTUFKT1IpJwotCTs7Ci0JCi1kZ3V4Ki1nY2MqKQotCVNIT0JKX0NGTEFHUz0tZnBpYwotCVNIT0JKX0xEPScke0NDfScKLQlTSE9CSl9MREZMQUdTPSctc2hhcmVkJwotCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi1kZ3V4KikKLQlTSE9CSl9DRkxBR1M9Jy1LIHBpYycKLQlTSE9CSl9MRD1sZAotCVNIT0JKX0xERkxBR1M9Jy1HIC1keSAtaCAkQCcKLQotCVNITElCX0xJQlZFUlNJT049JyQoU0hMSUJfTElCU1VGRikuJChTSExJQl9NQUpPUiknCi0JOzsKLQotbXNkb3NkamdwcCopCi0JU0hPQkpfU1RBVFVTPXVuc3VwcG9ydGVkCi0JU0hMSUJfU1RBVFVTPXVuc3VwcG9ydGVkCi0JOzsKLQotIwotIyBSZWx5IG9uIGNvcnJlY3QgZ2NjIGNvbmZpZ3VyYXRpb24gZm9yIGV2ZXJ5dGhpbmcgZWxzZQotIwotKi1nY2MqKQotCVNIT0JKX0NGTEFHUz0tZnBpYwotCVNIT0JKX0xEPScke0NDfScKLQlTSE9CSl9MREZMQUdTPSctc2hhcmVkJwotCi0JU0hMSUJfTElCVkVSU0lPTj0nJChTSExJQl9MSUJTVUZGKS4kKFNITElCX01BSk9SKScKLQk7OwotCi0qKQotCVNIT0JKX1NUQVRVUz11bnN1cHBvcnRlZAotCVNITElCX1NUQVRVUz11bnN1cHBvcnRlZAotCTs7Ci0KLWVzYWMKLQotZWNobyBTSE9CSl9DQz1cJyIkU0hPQkpfQ0MiXCcKLWVjaG8gU0hPQkpfQ0ZMQUdTPVwnIiRTSE9CSl9DRkxBR1MiXCcKLWVjaG8gU0hPQkpfTEQ9XCciJFNIT0JKX0xEIlwnCi1lY2hvIFNIT0JKX0xERkxBR1M9XCciJFNIT0JKX0xERkxBR1MiXCcKLWVjaG8gU0hPQkpfWExERkxBR1M9XCciJFNIT0JKX1hMREZMQUdTIlwnCi1lY2hvIFNIT0JKX0xJQlM9XCciJFNIT0JKX0xJQlMiXCcKLQotZWNobyBTSExJQl9YTERGTEFHUz1cJyIkU0hMSUJfWExERkxBR1MiXCcKLWVjaG8gU0hMSUJfTElCUz1cJyIkU0hMSUJfTElCUyJcJwotZWNobyBTSExJQl9MSUJTVUZGPVwnIiRTSExJQl9MSUJTVUZGIlwnCi1lY2hvIFNITElCX0xJQlZFUlNJT049XCciJFNITElCX0xJQlZFUlNJT04iXCcKLQotZWNobyBTSE9CSl9TVEFUVVM9XCciJFNIT0JKX1NUQVRVUyJcJwotZWNobyBTSExJQl9TVEFUVVM9XCciJFNITElCX1NUQVRVUyJcJwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3RjYXAuaCBiL3JlYWRsaW5lL3RjYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMmQ3Ni4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS90Y2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiB0Y2FwLmggLS0gdGVybWNhcCBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLiAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUmVhZGxpbmUgTGlicmFyeSAodGhlIExpYnJhcnkpLCBhIHNldCBvZgotICAgcm91dGluZXMgZm9yIHByb3ZpZGluZyBFbWFjcyBzdHlsZSBsaW5lIGlucHV0IHRvIHByb2dyYW1zIHRoYXQgYXNrCi0gICBmb3IgaXQuCi0KLSAgIFRoZSBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0KLSNpZiAhZGVmaW5lZCAoX1JMVENBUF9IXykKLSNkZWZpbmUgX1JMVENBUF9IXwotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1RFUk1DQVBfSCkKLSMgIGlmIGRlZmluZWQgKF9fbGludXhfXykgJiYgIWRlZmluZWQgKFNQRUVEX1RfSU5fU1lTX1RZUEVTKQotIyAgICBpbmNsdWRlICJybHR0eS5oIgotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHRlcm1jYXAuaD4KLSNlbHNlCi0KLS8qIE9uIFNvbGFyaXMyLCBzeXMvdHlwZXMuaCAjaW5jbHVkZXMgc3lzL3JlZy5oLCB3aGljaCAjZGVmaW5lcyBQQy4KLSAgIFVuZm9ydHVuYXRlbHksIFBDIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgYnkgdGhlIHRlcm1jYXAgbGlicmFyeS4gKi8KLSNpZmRlZiBQQwotIyAgdW5kZWYgUEMKLSNlbmRpZgotCi1leHRlcm4gY2hhciBQQzsKLWV4dGVybiBjaGFyICpVUCwgKkJDOwotCi1leHRlcm4gc2hvcnQgb3NwZWVkOwotCi1leHRlcm4gaW50IHRnZXRlbnQgKCk7Ci1leHRlcm4gaW50IHRnZXRmbGFnICgpOwotZXh0ZXJuIGludCB0Z2V0bnVtICgpOwotZXh0ZXJuIGNoYXIgKnRnZXRzdHIgKCk7Ci0KLWV4dGVybiBpbnQgdHB1dHMgKCk7Ci0KLWV4dGVybiBjaGFyICp0Z290byAoKTsKLQotI2VuZGlmIC8qIEhBVkVfVEVSTUNBUF9IICovCi0KLSNlbmRpZiAvKiAhX1JMVENBUF9IXyAqLwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvdGVybWluYWwuYyBiL3JlYWRsaW5lL3Rlcm1pbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyN2EzODUuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvdGVybWluYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKiB0ZXJtaW5hbC5jIC0tIGNvbnRyb2xsaW5nIHRoZSB0ZXJtaW5hbCB3aXRoIHRlcm1jYXAuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBSZWFkbGluZSBMaWJyYXJ5LCBhIGxpYnJhcnkgZm9yCi0gICByZWFkaW5nIGxpbmVzIG9mIHRleHQgd2l0aCBpbnRlcmFjdGl2ZSBpbnB1dCBhbmQgaGlzdG9yeSBlZGl0aW5nLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIFJlYWRsaW5lIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0gICBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgb2Z0ZW4gc2hpcHBlZCB3aXRoIEdOVSBzb2Z0d2FyZSwgYW5kCi0gICBpcyBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QKLSAgIGhhdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICovCi0jZGVmaW5lIFJFQURMSU5FX0xJQlJBUlkKLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jICBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAicG9zaXhzdGF0LmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkIChIQVZFX1NZU19GSUxFX0gpCi0jICBpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX0ZJTEVfSCAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfTE9DQUxFX0gpCi0jICBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotLyogU3lzdGVtLXNwZWNpZmljIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgZmlsZXMuICovCi0jaW5jbHVkZSAicmxkZWZzLmgiCi0KLSNpZiBkZWZpbmVkIChHV0lOU1pfSU5fU1lTX0lPQ1RMKSAmJiAhZGVmaW5lZCAoVElPQ0dXSU5TWikKLSMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2VuZGlmIC8qIEdXSU5TWl9JTl9TWVNfSU9DVEwgJiYgIVRJT0NHV0lOU1ogKi8KLQotI2lmIGRlZmluZWQgKF9fR08zMl9fKQotIyAgaW5jbHVkZSA8cGMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAicmx0dHkuaCIKLSNpbmNsdWRlICJ0Y2FwLmgiCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotI2luY2x1ZGUgImhpc3RvcnkuaCIKLQotLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW1wb3J0ZWQgZnJvbSByZWFkbGluZS5jICovCi1leHRlcm4gRklMRSAqX3JsX2luX3N0cmVhbSwgKl9ybF9vdXRfc3RyZWFtOwotZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7Ci1leHRlcm4gaW50IF9ybF9iZWxsX3ByZWZlcmVuY2U7Ci1leHRlcm4gS2V5bWFwIF9ybF9rZXltYXA7Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIGJpbmQuYyAqLwotZXh0ZXJuIHZvaWQgX3JsX2JpbmRfaWZfdW5ib3VuZCAoKTsKLQotLyogRnVuY3Rpb25zIGltcG9ydGVkIGZyb20gc2hlbGwuYyAqLwotZXh0ZXJuIHZvaWQgc2V0X2xpbmVzX2FuZF9jb2x1bW5zICgpOwotZXh0ZXJuIGNoYXIgKmdldF9lbnZfdmFsdWUgKCk7Ci0KLS8qIEZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIGRpc3BsYXkuYyAqLwotZXh0ZXJuIHZvaWQgX3JsX3JlZGlzcGxheV9hZnRlcl9zaWd3aW5jaCAoKTsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlUZXJtaW5hbCBhbmQgVGVybWNhcAkJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaWZuZGVmIF9fREpHUFBfXwotc3RhdGljIGNoYXIgKnRlcm1fYnVmZmVyID0gKGNoYXIgKilOVUxMOwotc3RhdGljIGNoYXIgKnRlcm1fc3RyaW5nX2J1ZmZlciA9IChjaGFyICopTlVMTDsKLQotLyogTm9uLXplcm8gbWVhbnMgdGhpcyB0ZXJtaW5hbCBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcuICovCi1zdGF0aWMgaW50IGR1bWJfdGVybTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHRjYXBfaW5pdGlhbGl6ZWQ7Ci0KLSNpZiAhZGVmaW5lZCAoX19saW51eF9fKQotIyAgaWYgZGVmaW5lZCAoX19FTVhfXykgfHwgZGVmaW5lZCAoTkVFRF9FWFRFUk5fUEMpCi1leHRlcm4gCi0jICBlbmRpZiAvKiBfX0VNWF9fIHx8IE5FRURfRVhURVJOX1BDICovCi1jaGFyIFBDLCAqQkMsICpVUDsKLSNlbmRpZiAvKiBfX2xpbnV4X18gKi8KLQotLyogU29tZSBzdHJpbmdzIHRvIGNvbnRyb2wgdGVybWluYWwgYWN0aW9ucy4gIFRoZXNlIGFyZSBvdXRwdXQgYnkgdHB1dHMgKCkuICovCi1jaGFyICp0ZXJtX2dvdG8sICp0ZXJtX2NscmVvbCwgKnRlcm1fY3IsICp0ZXJtX2NscnBhZywgKnRlcm1fYmFja3NwYWNlOwotY2hhciAqdGVybV9wYzsKLQotLyogTm9uLXplcm8gaWYgd2UgZGV0ZXJtaW5lIHRoYXQgdGhlIHRlcm1pbmFsIGNhbiBkbyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLiAqLwotaW50IHRlcm1pbmFsX2Nhbl9pbnNlcnQgPSAwOwotCi0vKiBIb3cgdG8gaW5zZXJ0IGNoYXJhY3RlcnMuICovCi1jaGFyICp0ZXJtX2ltLCAqdGVybV9laSwgKnRlcm1faWMsICp0ZXJtX2lwLCAqdGVybV9JQzsKLQotLyogSG93IHRvIGRlbGV0ZSBjaGFyYWN0ZXJzLiAqLwotY2hhciAqdGVybV9kYywgKnRlcm1fREM7Ci0KLSNpZiBkZWZpbmVkIChIQUNLX1RFUk1DQVBfTU9USU9OKQotY2hhciAqdGVybV9mb3J3YXJkX2NoYXI7Ci0jZW5kaWYgIC8qIEhBQ0tfVEVSTUNBUF9NT1RJT04gKi8KLQotLyogSG93IHRvIGdvIHVwIGEgbGluZS4gKi8KLWNoYXIgKnRlcm1fdXA7Ci0KLS8qIEEgdmlzaWJsZSBiZWxsLCBpZiB0aGUgdGVybWluYWwgY2FuIGJlIG1hZGUgdG8gZmxhc2ggdGhlIHNjcmVlbi4gKi8KLXN0YXRpYyBjaGFyICp2aXNpYmxlX2JlbGw7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRoZSB0ZXJtaW5hbCBjYW4gYXV0by13cmFwIGxpbmVzLiAqLwotaW50IF9ybF90ZXJtX2F1dG93cmFwOwotCi0vKiBOb24temVybyBtZWFucyB0aGF0IHRoaXMgdGVybWluYWwgaGFzIGEgbWV0YSBrZXkuICovCi1zdGF0aWMgaW50IHRlcm1faGFzX21ldGE7Ci0KLS8qIFRoZSBzZXF1ZW5jZXMgdG8gd3JpdGUgdG8gdHVybiBvbiBhbmQgb2ZmIHRoZSBtZXRhIGtleSwgaWYgdGhpcwotICAgdGVybWluYWwgICAgaGFzIG9uZS4gKi8KLXN0YXRpYyBjaGFyICp0ZXJtX21tLCAqdGVybV9tbzsKLQotLyogVGhlIGtleSBzZXF1ZW5jZXMgb3V0cHV0IGJ5IHRoZSBhcnJvdyBrZXlzLCBpZiB0aGlzIHRlcm1pbmFsIGhhcyBhbnkuICovCi1zdGF0aWMgY2hhciAqdGVybV9rdSwgKnRlcm1fa2QsICp0ZXJtX2tyLCAqdGVybV9rbDsKLQotLyogSG93IHRvIGluaXRpYWxpemUgYW5kIHJlc2V0IHRoZSBhcnJvdyBrZXlzLCBpZiB0aGlzIHRlcm1pbmFsIGhhcyBhbnkuICovCi1zdGF0aWMgY2hhciAqdGVybV9rcywgKnRlcm1fa2U7Ci0KLS8qIFRoZSBrZXkgc2VxdWVuY2VzIHNlbnQgYnkgdGhlIEhvbWUgYW5kIEVuZCBrZXlzLCBpZiBhbnkuICovCi1zdGF0aWMgY2hhciAqdGVybV9raCwgKnRlcm1fa0g7Ci0KLS8qIFZhcmlhYmxlcyB0aGF0IGhvbGQgdGhlIHNjcmVlbiBkaW1lbnNpb25zLCB1c2VkIGJ5IHRoZSBkaXNwbGF5IGNvZGUuICovCi1pbnQgc2NyZWVud2lkdGgsIHNjcmVlbmhlaWdodCwgc2NyZWVuY2hhcnM7Ci0KLS8qIE5vbi16ZXJvIG1lYW5zIHRoZSB1c2VyIHdhbnRzIHRvIGVuYWJsZSB0aGUga2V5cGFkLiAqLwotaW50IF9ybF9lbmFibGVfa2V5cGFkOwotCi0vKiBOb24temVybyBtZWFucyB0aGUgdXNlciB3YW50cyB0byBlbmFibGUgYSBtZXRhIGtleS4gKi8KLWludCBfcmxfZW5hYmxlX21ldGEgPSAxOwotCi0vKiBHZXQgcmVhZGxpbmUncyBpZGVhIG9mIHRoZSBzY3JlZW4gc2l6ZS4gIFRUWSBpcyBhIGZpbGUgZGVzY3JpcHRvciBvcGVuCi0gICB0byB0aGUgdGVybWluYWwuICBJZiBJR05PUkVfRU5WIGlzIHRydWUsIHdlIGRvIG5vdCBwYXkgYXR0ZW50aW9uIHRvIHRoZQotICAgdmFsdWVzIG9mICRMSU5FUyBhbmQgJENPTFVNTlMuICBUaGUgdGVzdHMgZm9yIFRFUk1fU1RSSU5HX0JVRkZFUiBiZWluZwotICAgbm9uLW51bGwgc2VydmUgdG8gY2hlY2sgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBpbml0aWFsaXplZCB0ZXJtY2FwLiAqLwotdm9pZAotX3JsX2dldF9zY3JlZW5fc2l6ZSAodHR5LCBpZ25vcmVfZW52KQotICAgICBpbnQgdHR5LCBpZ25vcmVfZW52OwotewotICBjaGFyICpzczsKLSNpZiBkZWZpbmVkIChUSU9DR1dJTlNaKQotICBzdHJ1Y3Qgd2luc2l6ZSB3aW5kb3dfc2l6ZTsKLSNlbmRpZiAvKiBUSU9DR1dJTlNaICovCi0jaWYgZGVmaW5lZCAoX19FTVhfXykKLSAgaW50IHN6WzJdOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChUSU9DR1dJTlNaKQotICBpZiAoaW9jdGwgKHR0eSwgVElPQ0dXSU5TWiwgJndpbmRvd19zaXplKSA9PSAwKQotICAgIHsKLSAgICAgIHNjcmVlbndpZHRoID0gKGludCkgd2luZG93X3NpemUud3NfY29sOwotICAgICAgc2NyZWVuaGVpZ2h0ID0gKGludCkgd2luZG93X3NpemUud3Nfcm93OwotICAgIH0KLSNlbmRpZiAvKiBUSU9DR1dJTlNaICovCi0KLSNpZiBkZWZpbmVkIChfX0VNWF9fKQotICBfc2Nyc2l6ZSAoc3opOwotICBzY3JlZW53aWR0aCA9IHN6WzBdOwotICBzY3JlZW5oZWlnaHQgPSBzelsxXTsKLSNlbmRpZgotCi0gIC8qIEVudmlyb25tZW50IHZhcmlhYmxlIENPTFVNTlMgb3ZlcnJpZGVzIHNldHRpbmcgb2YgImNvIiBpZiBJR05PUkVfRU5WCi0gICAgIGlzIHVuc2V0LiAqLwotICBpZiAoc2NyZWVud2lkdGggPD0gMCkKLSAgICB7Ci0gICAgICBpZiAoaWdub3JlX2VudiA9PSAwICYmIChzcyA9IGdldF9lbnZfdmFsdWUgKCJDT0xVTU5TIikpKQotCXNjcmVlbndpZHRoID0gYXRvaSAoc3MpOwotCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pCi0gICAgICB0dHkgPSB0dHk7Ci0gICAgICBpZiAoc2NyZWVud2lkdGggPD0gMCkKLQlzY3JlZW53aWR0aCA9IFNjcmVlbkNvbHMgKCk7Ci0jZWxzZQotICAgICAgaWYgKHNjcmVlbndpZHRoIDw9IDAgJiYgdGVybV9zdHJpbmdfYnVmZmVyKQotCXNjcmVlbndpZHRoID0gdGdldG51bSAoImNvIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogRW52aXJvbm1lbnQgdmFyaWFibGUgTElORVMgb3ZlcnJpZGVzIHNldHRpbmcgb2YgImxpIiBpZiBJR05PUkVfRU5WCi0gICAgIGlzIHVuc2V0LiAqLwotICBpZiAoc2NyZWVuaGVpZ2h0IDw9IDApCi0gICAgewotICAgICAgaWYgKGlnbm9yZV9lbnYgPT0gMCAmJiAoc3MgPSBnZXRfZW52X3ZhbHVlICgiTElORVMiKSkpCi0Jc2NyZWVuaGVpZ2h0ID0gYXRvaSAoc3MpOwotCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pCi0gICAgICBpZiAoc2NyZWVuaGVpZ2h0IDw9IDApCi0Jc2NyZWVuaGVpZ2h0ID0gU2NyZWVuUm93cyAoKTsKLSNlbHNlCi0gICAgICBpZiAoc2NyZWVuaGVpZ2h0IDw9IDAgJiYgdGVybV9zdHJpbmdfYnVmZmVyKQotCXNjcmVlbmhlaWdodCA9IHRnZXRudW0gKCJsaSIpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIElmIGFsbCBlbHNlIGZhaWxzLCBkZWZhdWx0IHRvIDgweDI0IHRlcm1pbmFsLiAqLwotICBpZiAoc2NyZWVud2lkdGggPD0gMSkKLSAgICBzY3JlZW53aWR0aCA9IDgwOwotCi0gIGlmIChzY3JlZW5oZWlnaHQgPD0gMCkKLSAgICBzY3JlZW5oZWlnaHQgPSAyNDsKLQotICAvKiBJZiB3ZSdyZSBiZWluZyBjb21waWxlZCBhcyBwYXJ0IG9mIGJhc2gsIHNldCB0aGUgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGVzICRMSU5FUyBhbmQgJENPTFVNTlMgdG8gbmV3IHZhbHVlcy4gIE90aGVyd2lzZSwganVzdAotICAgICBkbyBhIHBhaXIgb2YgcHV0ZW52ICgpIG9yIHNldGVudiAoKSBjYWxscy4gKi8KLSAgc2V0X2xpbmVzX2FuZF9jb2x1bW5zIChzY3JlZW5oZWlnaHQsIHNjcmVlbndpZHRoKTsKLQotICBpZiAoIV9ybF90ZXJtX2F1dG93cmFwKQotICAgIHNjcmVlbndpZHRoLS07Ci0KLSAgc2NyZWVuY2hhcnMgPSBzY3JlZW53aWR0aCAqIHNjcmVlbmhlaWdodDsKLX0KLQotdm9pZAotX3JsX3NldF9zY3JlZW5fc2l6ZSAocm93cywgY29scykKLSAgICAgaW50IHJvd3MsIGNvbHM7Ci17Ci0gIHNjcmVlbmhlaWdodCA9IHJvd3M7Ci0gIHNjcmVlbndpZHRoID0gY29sczsKLQotICBpZiAoX3JsX3Rlcm1fYXV0b3dyYXAgPT0gMCkKLSAgICBzY3JlZW53aWR0aC0tOwotCi0gIHNjcmVlbmNoYXJzID0gc2NyZWVud2lkdGggKiBzY3JlZW5oZWlnaHQ7Ci19Ci0KLXZvaWQKLXJsX3Jlc2l6ZV90ZXJtaW5hbCAoKQotewotICBpZiAocmVhZGxpbmVfZWNob2luZ19wKQotICAgIHsKLSAgICAgIF9ybF9nZXRfc2NyZWVuX3NpemUgKGZpbGVubyAocmxfaW5zdHJlYW0pLCAxKTsKLSAgICAgIF9ybF9yZWRpc3BsYXlfYWZ0ZXJfc2lnd2luY2ggKCk7Ci0gICAgfQotfQotCi1zdHJ1Y3QgX3RjX3N0cmluZyB7Ci0gICAgIGNoYXIgKnRjX3ZhcjsKLSAgICAgY2hhciAqKnRjX3ZhbHVlOwotfTsKLQotLyogVGhpcyBzaG91bGQgYmUga2VwdCBzb3J0ZWQsIGp1c3QgaW4gY2FzZSB3ZSBkZWNpZGUgdG8gY2hhbmdlIHRoZQotICAgc2VhcmNoIGFsZ29yaXRobSB0byBzb21ldGhpbmcgc21hcnRlci4gKi8KLXN0YXRpYyBzdHJ1Y3QgX3RjX3N0cmluZyB0Y19zdHJpbmdzW10gPQotewotICAiREMiLCAmdGVybV9EQywKLSAgIklDIiwgJnRlcm1fSUMsCi0gICJjZSIsICZ0ZXJtX2NscmVvbCwKLSAgImNsIiwgJnRlcm1fY2xycGFnLAotICAiY3IiLCAmdGVybV9jciwKLSAgImRjIiwgJnRlcm1fZGMsCi0gICJlaSIsICZ0ZXJtX2VpLAotICAiaWMiLCAmdGVybV9pYywKLSAgImltIiwgJnRlcm1faW0sCi0gICJrZCIsICZ0ZXJtX2tkLAotICAia2giLCAmdGVybV9raCwJLyogaG9tZSAqLwotICAia0giLCAmdGVybV9rSCwJLyogZW5kICovCi0gICJrbCIsICZ0ZXJtX2tsLAotICAia3IiLCAmdGVybV9rciwKLSAgImt1IiwgJnRlcm1fa3UsCi0gICJrcyIsICZ0ZXJtX2tzLAotICAia2UiLCAmdGVybV9rZSwKLSAgImxlIiwgJnRlcm1fYmFja3NwYWNlLAotICAibW0iLCAmdGVybV9tbSwKLSAgIm1vIiwgJnRlcm1fbW8sCi0jaWYgZGVmaW5lZCAoSEFDS19URVJNQ0FQX01PVElPTikKLSAgIm5kIiwgJnRlcm1fZm9yd2FyZF9jaGFyLAotI2VuZGlmCi0gICJwYyIsICZ0ZXJtX3BjLAotICAidXAiLCAmdGVybV91cCwKLSAgInZiIiwgJnZpc2libGVfYmVsbCwKLX07Ci0KLSNkZWZpbmUgTlVNX1RDX1NUUklOR1MgKHNpemVvZiAodGNfc3RyaW5ncykgLyBzaXplb2YgKHN0cnVjdCBfdGNfc3RyaW5nKSkKLQotLyogUmVhZCB0aGUgZGVzaXJlZCB0ZXJtaW5hbCBjYXBhYmlsaXR5IHN0cmluZ3MgaW50byBCUC4gIFRoZSBjYXBhYmlsaXRpZXMKLSAgIGFyZSBkZXNjcmliZWQgaW4gdGhlIFRDX1NUUklOR1MgdGFibGUuICovCi1zdGF0aWMgdm9pZAotZ2V0X3Rlcm1fY2FwYWJpbGl0aWVzIChicCkKLSAgICAgY2hhciAqKmJwOwotewotI2lmIGRlZmluZWQoX19ESkdQUF9fKQotICBicCA9IGJwOwotI2Vsc2UKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9UQ19TVFJJTkdTOyBpKyspCi0gICAgKih0Y19zdHJpbmdzW2ldLnRjX3ZhbHVlKSA9IHRnZXRzdHIgKHRjX3N0cmluZ3NbaV0udGNfdmFyLCBicCk7Ci0jZW5kaWYKLSAgdGNhcF9pbml0aWFsaXplZCA9IDE7Ci19Ci0KLWludAotX3JsX2luaXRfdGVybWluYWxfaW8gKHRlcm1pbmFsX25hbWUpCi0gICAgIGNoYXIgKnRlcm1pbmFsX25hbWU7Ci17Ci0jaWYgZGVmaW5lZCAoX19HTzMyX18pCi0gIHRlcm1pbmFsX25hbWUgPSB0ZXJtaW5hbF9uYW1lOwotICBzY3JlZW53aWR0aCA9IHNjcmVlbmhlaWdodCA9IDA7Ci0gIF9ybF9nZXRfc2NyZWVuX3NpemUgKHJsX2luc3RyZWFtID8gZmlsZW5vIChybF9pbnN0cmVhbSkgOiAwLCAwKTsKLQotICB0ZXJtX2NyID0gIlxyIjsKLSAgdGVybV9pbSA9IHRlcm1fZWkgPSB0ZXJtX2ljID0gdGVybV9JQyA9IChjaGFyICopTlVMTDsKLSAgdGVybV91cCA9IHRlcm1fZGMgPSB0ZXJtX0RDID0gdmlzaWJsZV9iZWxsID0gKGNoYXIgKilOVUxMOwotCi0gIC8qIERvZXMgdGhlIF9fR08zMl9fIGhhdmUgYSBtZXRhIGtleT8gIEkgZG9uJ3Qga25vdy4gKi8KLSAgdGVybV9oYXNfbWV0YSA9IDA7Ci0gIHRlcm1fbW0gPSB0ZXJtX21vID0gKGNoYXIgKilOVUxMOwotCi0gIC8qIEl0IHByb2JhYmx5IGhhcyBhcnJvdyBrZXlzLCBidXQgSSBkb24ndCBrbm93IHdoYXQgdGhleSBhcmUuICovCi0gIHRlcm1fa3UgPSB0ZXJtX2tkID0gdGVybV9rciA9IHRlcm1fa2wgPSAoY2hhciAqKU5VTEw7Ci0KLSNpZiBkZWZpbmVkIChIQUNLX1RFUk1DQVBfTU9USU9OKQotICB0ZXJtX2ZvcndhcmRfY2hhciA9IChjaGFyICopTlVMTDsKLSNlbmRpZiAvKiBIQUNLX1RFUk1DQVBfTU9USU9OICovCi0gIHRlcm1pbmFsX2Nhbl9pbnNlcnQgPSBfcmxfdGVybV9hdXRvd3JhcCA9IDA7Ci0gIHJldHVybiAwOwotI2Vsc2UgLyogIV9fR08zMl9fICovCi0KLSAgY2hhciAqdGVybSwgKmJ1ZmZlcjsKLSAgaW50IHR0eTsKLSAgS2V5bWFwIHhrZXltYXA7Ci0KLSAgdGVybSA9IHRlcm1pbmFsX25hbWUgPyB0ZXJtaW5hbF9uYW1lIDogZ2V0X2Vudl92YWx1ZSAoIlRFUk0iKTsKLQotICBpZiAodGVybV9zdHJpbmdfYnVmZmVyID09IDApCi0gICAgdGVybV9zdHJpbmdfYnVmZmVyID0geG1hbGxvYyAoMjAzMik7Ci0KLSAgaWYgKHRlcm1fYnVmZmVyID09IDApCi0gICAgdGVybV9idWZmZXIgPSB4bWFsbG9jICg0MDgwKTsKLQotICBidWZmZXIgPSB0ZXJtX3N0cmluZ19idWZmZXI7Ci0KLSAgdGVybV9jbHJwYWcgPSB0ZXJtX2NyID0gdGVybV9jbHJlb2wgPSAoY2hhciAqKU5VTEw7Ci0KLSAgaWYgKHRlcm0gPT0gMCkKLSAgICB0ZXJtID0gImR1bWIiOwotCi0gIGlmICh0Z2V0ZW50ICh0ZXJtX2J1ZmZlciwgdGVybSkgPD0gMCkKLSAgICB7Ci0gICAgICBkdW1iX3Rlcm0gPSAxOwotICAgICAgc2NyZWVud2lkdGggPSA3OTsKLSAgICAgIHNjcmVlbmhlaWdodCA9IDI0OwotICAgICAgc2NyZWVuY2hhcnMgPSA3OSAqIDI0OwotICAgICAgdGVybV9jciA9ICJcciI7Ci0gICAgICB0ZXJtX2ltID0gdGVybV9laSA9IHRlcm1faWMgPSB0ZXJtX0lDID0gKGNoYXIgKilOVUxMOwotICAgICAgdGVybV91cCA9IHRlcm1fZGMgPSB0ZXJtX0RDID0gdmlzaWJsZV9iZWxsID0gKGNoYXIgKilOVUxMOwotICAgICAgdGVybV9rdSA9IHRlcm1fa2QgPSB0ZXJtX2tsID0gdGVybV9rciA9IChjaGFyICopTlVMTDsKLSNpZiBkZWZpbmVkIChIQUNLX1RFUk1DQVBfTU9USU9OKQotICAgICAgdGVybV9mb3J3YXJkX2NoYXIgPSAoY2hhciAqKU5VTEw7Ci0jZW5kaWYKLSAgICAgIHRlcm1pbmFsX2Nhbl9pbnNlcnQgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGdldF90ZXJtX2NhcGFiaWxpdGllcyAoJmJ1ZmZlcik7Ci0KLSAgLyogU2V0IHVwIHRoZSB2YXJpYWJsZXMgdGhhdCB0aGUgdGVybWNhcCBsaWJyYXJ5IGV4cGVjdHMgdGhlIGFwcGxpY2F0aW9uCi0gICAgIHRvIHByb3ZpZGUuICovCi0gIFBDID0gdGVybV9wYyA/ICp0ZXJtX3BjIDogMDsKLSAgQkMgPSB0ZXJtX2JhY2tzcGFjZTsKLSAgVVAgPSB0ZXJtX3VwOwotCi0gIGlmICghdGVybV9jcikKLSAgICB0ZXJtX2NyID0gIlxyIjsKLQotICB0dHkgPSBybF9pbnN0cmVhbSA/IGZpbGVubyAocmxfaW5zdHJlYW0pIDogMDsKLQotICBzY3JlZW53aWR0aCA9IHNjcmVlbmhlaWdodCA9IDA7Ci0KLSAgX3JsX3Rlcm1fYXV0b3dyYXAgPSB0Z2V0ZmxhZyAoImFtIikgJiYgdGdldGZsYWcgKCJ4biIpOwotCi0gIF9ybF9nZXRfc2NyZWVuX3NpemUgKHR0eSwgMCk7Ci0KLSAgLyogIkFuIGFwcGxpY2F0aW9uIHByb2dyYW0gY2FuIGFzc3VtZSB0aGF0IHRoZSB0ZXJtaW5hbCBjYW4gZG8KLSAgICAgIGNoYXJhY3RlciBpbnNlcnRpb24gaWYgKmFueSBvbmUgb2YqIHRoZSBjYXBhYmlsaXRpZXMgYElDJywKLSAgICAgIGBpbScsIGBpYycgb3IgYGlwJyBpcyBwcm92aWRlZC4iICBCdXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcgaWYKLSAgICAgIG9ubHkgYGlwJyBpcyBwcm92aWRlZCwgc28uLi4gKi8KLSAgdGVybWluYWxfY2FuX2luc2VydCA9ICh0ZXJtX0lDIHx8IHRlcm1faW0gfHwgdGVybV9pYyk7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGVybWluYWwgaGFzIGEgbWV0YSBrZXkgYW5kIGNsZWFyIHRoZSBjYXBhYmlsaXR5Ci0gICAgIHZhcmlhYmxlcyBpZiB0aGVyZSBpcyBub25lLiAqLwotICB0ZXJtX2hhc19tZXRhID0gKHRnZXRmbGFnICgia20iKSB8fCB0Z2V0ZmxhZyAoIk1UIikpOwotICBpZiAoIXRlcm1faGFzX21ldGEpCi0gICAgdGVybV9tbSA9IHRlcm1fbW8gPSAoY2hhciAqKU5VTEw7Ci0KLSAgLyogQXR0ZW1wdCB0byBmaW5kIGFuZCBiaW5kIHRoZSBhcnJvdyBrZXlzLiAgRG8gbm90IG92ZXJyaWRlIGFscmVhZHkKLSAgICAgYm91bmQga2V5cyBpbiBhbiBvdmVyemVhbG91cyBhdHRlbXB0LCBob3dldmVyLiAqLwotICB4a2V5bWFwID0gX3JsX2tleW1hcDsKLQotICBfcmxfa2V5bWFwID0gZW1hY3Nfc3RhbmRhcmRfa2V5bWFwOwotICBfcmxfYmluZF9pZl91bmJvdW5kICh0ZXJtX2t1LCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSk7Ci0gIF9ybF9iaW5kX2lmX3VuYm91bmQgKHRlcm1fa2QsIHJsX2dldF9uZXh0X2hpc3RvcnkpOwotICBfcmxfYmluZF9pZl91bmJvdW5kICh0ZXJtX2tyLCBybF9mb3J3YXJkKTsKLSAgX3JsX2JpbmRfaWZfdW5ib3VuZCAodGVybV9rbCwgcmxfYmFja3dhcmQpOwotCi0gIF9ybF9iaW5kX2lmX3VuYm91bmQgKHRlcm1fa2gsIHJsX2JlZ19vZl9saW5lKTsJLyogSG9tZSAqLwotICBfcmxfYmluZF9pZl91bmJvdW5kICh0ZXJtX2tILCBybF9lbmRfb2ZfbGluZSk7CS8qIEVuZCAqLwotCi0jaWYgZGVmaW5lZCAoVklfTU9ERSkKLSAgX3JsX2tleW1hcCA9IHZpX21vdmVtZW50X2tleW1hcDsKLSAgX3JsX2JpbmRfaWZfdW5ib3VuZCAodGVybV9rdSwgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkpOwotICBfcmxfYmluZF9pZl91bmJvdW5kICh0ZXJtX2tkLCBybF9nZXRfbmV4dF9oaXN0b3J5KTsKLSAgX3JsX2JpbmRfaWZfdW5ib3VuZCAodGVybV9rciwgcmxfZm9yd2FyZCk7Ci0gIF9ybF9iaW5kX2lmX3VuYm91bmQgKHRlcm1fa2wsIHJsX2JhY2t3YXJkKTsKLQotICBfcmxfYmluZF9pZl91bmJvdW5kICh0ZXJtX2toLCBybF9iZWdfb2ZfbGluZSk7CS8qIEhvbWUgKi8KLSAgX3JsX2JpbmRfaWZfdW5ib3VuZCAodGVybV9rSCwgcmxfZW5kX29mX2xpbmUpOwkvKiBFbmQgKi8KLSNlbmRpZiAvKiBWSV9NT0RFICovCi0KLSAgX3JsX2tleW1hcCA9IHhrZXltYXA7Ci0KLSNlbmRpZiAvKiAhX19HTzMyX18gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotcmxfZ2V0X3Rlcm1jYXAgKGNhcCkKLSAgICAgY2hhciAqY2FwOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBpZiAodGNhcF9pbml0aWFsaXplZCA9PSAwKQotICAgIHJldHVybiAoKGNoYXIgKilOVUxMKTsKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9UQ19TVFJJTkdTOyBpKyspCi0gICAgewotICAgICAgaWYgKHRjX3N0cmluZ3NbaV0udGNfdmFyWzBdID09IGNhcFswXSAmJiBzdHJjbXAgKHRjX3N0cmluZ3NbaV0udGNfdmFyLCBjYXApID09IDApCi0gICAgICAgIHJldHVybiAqKHRjX3N0cmluZ3NbaV0udGNfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotfQotCi0vKiBSZS1pbml0aWFsaXplIHRoZSB0ZXJtaW5hbCBjb25zaWRlcmluZyB0aGF0IHRoZSBURVJNL1RFUk1DQVAgdmFyaWFibGUKLSAgIGhhcyBjaGFuZ2VkLiAqLwotaW50Ci1ybF9yZXNldF90ZXJtaW5hbCAodGVybWluYWxfbmFtZSkKLSAgICAgY2hhciAqdGVybWluYWxfbmFtZTsKLXsKLSAgX3JsX2luaXRfdGVybWluYWxfaW8gKHRlcm1pbmFsX25hbWUpOwotICByZXR1cm4gMDsKLX0KLQotLyogQSBmdW5jdGlvbiBmb3IgdGhlIHVzZSBvZiB0cHV0cyAoKSAqLwotI2lmZGVmIF9NSU5JWAotdm9pZAotX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24gKGMpCi0gICAgIGludCBjOwotewotICBwdXRjIChjLCBfcmxfb3V0X3N0cmVhbSk7Ci19Ci0jZWxzZSAvKiAhX01JTklYICovCi1pbnQKLV9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uIChjKQotICAgICBpbnQgYzsKLXsKLSAgcmV0dXJuIHB1dGMgKGMsIF9ybF9vdXRfc3RyZWFtKTsKLX0KLSNlbmRpZiAvKiAhX01JTklYICovCi0vKiBXcml0ZSBDT1VOVCBjaGFyYWN0ZXJzIGZyb20gU1RSSU5HIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLwotdm9pZAotX3JsX291dHB1dF9zb21lX2NoYXJzIChzdHJpbmcsIGNvdW50KQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgZndyaXRlIChzdHJpbmcsIDEsIGNvdW50LCBfcmxfb3V0X3N0cmVhbSk7Ci19Ci0KLS8qIE1vdmUgdGhlIGN1cnNvciBiYWNrLiAqLwotaW50Ci1fcmxfYmFja3NwYWNlIChjb3VudCkKLSAgICAgaW50IGNvdW50OwotewotICByZWdpc3RlciBpbnQgaTsKLQotI2lmICFkZWZpbmVkIChfX0dPMzJfXykKLSAgaWYgKHRlcm1fYmFja3NwYWNlKQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgdHB1dHMgKHRlcm1fYmFja3NwYWNlLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gIGVsc2UKLSNlbmRpZiAvKiAhX19HTzMyX18gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgIHB1dGMgKCdcYicsIF9ybF9vdXRfc3RyZWFtKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1vdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUuICovCi1pbnQKLWNybGYgKCkKLXsKLSNpZiBkZWZpbmVkIChORVdfVFRZX0RSSVZFUikKLSAgaWYgKHRlcm1fY3IpCi0gICAgdHB1dHMgKHRlcm1fY3IsIDEsIF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTsKLSNlbmRpZiAvKiBORVdfVFRZX0RSSVZFUiAqLwotICBwdXRjICgnXG4nLCBfcmxfb3V0X3N0cmVhbSk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSaW5nIHRoZSB0ZXJtaW5hbCBiZWxsLiAqLwotaW50Ci1kaW5nICgpCi17Ci0gIGlmIChyZWFkbGluZV9lY2hvaW5nX3ApCi0gICAgewotICAgICAgc3dpdGNoIChfcmxfYmVsbF9wcmVmZXJlbmNlKQotICAgICAgICB7Ci0JY2FzZSBOT19CRUxMOgotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQljYXNlIFZJU0lCTEVfQkVMTDoKLSNpZiBkZWZpbmVkIChfX0dPMzJfXykKLQkgIFNjcmVlblZpc3VhbEJlbGwgKCk7Ci0JICBicmVhazsKLSNlbHNlCi0JICBpZiAodmlzaWJsZV9iZWxsKQotCSAgICB7Ci0JICAgICAgdHB1dHMgKHZpc2libGVfYmVsbCwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQkgIC8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBBVURJQkxFX0JFTEw6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJcMDA3Iik7Ci0JICBmZmx1c2ggKHN0ZGVycik7Ci0JICBicmVhazsKLSAgICAgICAgfQotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIHJldHVybiAoLTEpOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkgCUNvbnRyb2xsaW5nIHRoZSBNZXRhIEtleSBhbmQgS2V5cGFkCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotdm9pZAotX3JsX2VuYWJsZV9tZXRhX2tleSAoKQotewotI2lmICFkZWZpbmVkKF9fREpHUFBfXykKLSAgaWYgKHRlcm1faGFzX21ldGEgJiYgdGVybV9tbSkKLSAgICB0cHV0cyAodGVybV9tbSwgMSwgX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOwotI2VuZGlmCi19Ci0KLXZvaWQKLV9ybF9jb250cm9sX2tleXBhZCAob24pCi0gICAgIGludCBvbjsKLXsKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykKLSAgb24gPSBvbjsKLSNlbHNlCi0gIGlmIChvbiAmJiB0ZXJtX2tzKQotICAgIHRwdXRzICh0ZXJtX2tzLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0gIGVsc2UgaWYgKCFvbiAmJiB0ZXJtX2tlKQotICAgIHRwdXRzICh0ZXJtX2tlLCAxLCBfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3RpbGRlLmMgYi9yZWFkbGluZS90aWxkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg1M2JkLi4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3RpbGRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyogdGlsZGUuYyAtLSBUaWxkZSBleHBhbnNpb24gY29kZSAofi9mb28gOj0gJEhPTUUvZm9vKS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg4LDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBSZWFkbGluZSwgYSBsaWJyYXJ5IGZvciByZWFkaW5nIGxpbmVzCi0gICBvZiB0ZXh0IHdpdGggaW50ZXJhY3RpdmUgaW5wdXQgYW5kIGhpc3RvcnkgZWRpdGluZy4KLQotICAgUmVhZGxpbmUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBSZWFkbGluZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIFJlYWRsaW5lOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAqLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotIyAgaWZkZWYgX01JTklYCi0jICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUUklOR19IKQotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZSAvKiAhSEFWRV9TVFJJTkdfSCAqLwotIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmIC8qICFIQVZFX1NUUklOR19IICovICAKLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSAidGlsZGUuaCIKLQotI2lmICFkZWZpbmVkIChIQVZFX0dFVFBXX0RFQ0xTKQotZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3dWlkICgpLCAqZ2V0cHduYW0gKCk7Ci0jZW5kaWYgLyogIUhBVkVfR0VUUFdfREVDTFMgKi8KLQotI2lmICFkZWZpbmVkIChzYXZlc3RyaW5nKQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci0jICBpZm5kZWYgc3RyY3B5Ci1leHRlcm4gY2hhciAqc3RyY3B5ICgpOwotIyAgZW5kaWYKLSNkZWZpbmUgc2F2ZXN0cmluZyh4KSBzdHJjcHkgKHhtYWxsb2MgKDEgKyBzdHJsZW4gKHgpKSwgKHgpKQotI2VuZGlmIC8qICFzYXZlc3RyaW5nICovCi0KLSNpZiAhZGVmaW5lZCAoTlVMTCkKLSMgIGlmIGRlZmluZWQgKF9fU1REQ19fKQotIyAgICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE5VTEwgMHgwCi0jICBlbmRpZiAvKiAhX19TVERDX18gKi8KLSNlbmRpZiAvKiAhTlVMTCAqLwotCi0jaWYgZGVmaW5lZCAoVEVTVCkgfHwgZGVmaW5lZCAoU1RBVElDX01BTExPQykKLXN0YXRpYyBjaGFyICp4bWFsbG9jICgpLCAqeHJlYWxsb2MgKCk7Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCksICp4cmVhbGxvYyAoKTsKLSNlbmRpZiAvKiBURVNUIHx8IFNUQVRJQ19NQUxMT0MgKi8KLQotLyogSWYgYmVpbmcgY29tcGlsZWQgYXMgcGFydCBvZiBiYXNoLCB0aGVzZSB3aWxsIGJlIHNhdGlzZmllZCBmcm9tCi0gICB2YXJpYWJsZXMuby4gIElmIGJlaW5nIGNvbXBpbGVkIGFzIHBhcnQgb2YgcmVhZGxpbmUsIHRoZXkgd2lsbAotICAgYmUgc2F0aXNmaWVkIGZyb20gc2hlbGwuby4gKi8KLWV4dGVybiBjaGFyICpnZXRfaG9tZV9kaXIgKCk7Ci1leHRlcm4gY2hhciAqZ2V0X2Vudl92YWx1ZSAoKTsKLQotLyogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGlsZGVfYWRkaXRpb25hbF9wcmVmaXhlcy4gIFRoaXMgaXMgc2V0IHRvCi0gICB3aGl0ZXNwYWNlIHByZWNlZGluZyBhIHRpbGRlIHNvIHRoYXQgc2ltcGxlIHByb2dyYW1zIHdoaWNoIGRvIG5vdAotICAgcGVyZm9ybSBhbnkgd29yZCBzZXBhcmF0aW9uIGdldCBkZXNpcmVkIGJlaGF2aW91ci4gKi8KLXN0YXRpYyBjaGFyICpkZWZhdWx0X3ByZWZpeGVzW10gPQotICB7ICIgfiIsICJcdH4iLCAoY2hhciAqKU5VTEwgfTsKLQotLyogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGlsZGVfYWRkaXRpb25hbF9zdWZmaXhlcy4gIFRoaXMgaXMgc2V0IHRvCi0gICB3aGl0ZXNwYWNlIG9yIG5ld2xpbmUgc28gdGhhdCBzaW1wbGUgcHJvZ3JhbXMgd2hpY2ggZG8gbm90Ci0gICBwZXJmb3JtIGFueSB3b3JkIHNlcGFyYXRpb24gZ2V0IGRlc2lyZWQgYmVoYXZpb3VyLiAqLwotc3RhdGljIGNoYXIgKmRlZmF1bHRfc3VmZml4ZXNbXSA9Ci0gIHsgIiAiLCAiXG4iLCAoY2hhciAqKU5VTEwgfTsKLQotLyogSWYgbm9uLW51bGwsIHRoaXMgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0aGF0IHRoZSBhcHBsaWNhdGlvbgotICAgd2FudHMgY2FsbGVkIGJlZm9yZSB0cnlpbmcgdGhlIHN0YW5kYXJkIHRpbGRlIGV4cGFuc2lvbnMuICBUaGUgZnVuY3Rpb24KLSAgIGlzIGNhbGxlZCB3aXRoIHRoZSB0ZXh0IHNhbnMgdGlsZGUsIGFuZCByZXR1cm5zIGEgbWFsbG9jKCknZWQgc3RyaW5nCi0gICB3aGljaCBpcyB0aGUgZXhwYW5zaW9uLCBvciBhIE5VTEwgcG9pbnRlciBpZiB0aGUgZXhwYW5zaW9uIGZhaWxzLiAqLwotQ1BGdW5jdGlvbiAqdGlsZGVfZXhwYW5zaW9uX3ByZWV4cGFuc2lvbl9ob29rID0gKENQRnVuY3Rpb24gKilOVUxMOwotCi0vKiBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlCi0gICBzdGFuZGFyZCBtZWFuaW5nIGZvciBleHBhbmRpbmcgYSB0aWxkZSBmYWlscy4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKLSAgIHdpdGggdGhlIHRleHQgKHNhbnMgdGlsZGUsIGFzIGluICJmb28iKSwgYW5kIHJldHVybnMgYSBtYWxsb2MoKSdlZCBzdHJpbmcKLSAgIHdoaWNoIGlzIHRoZSBleHBhbnNpb24sIG9yIGEgTlVMTCBwb2ludGVyIGlmIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4gKi8KLUNQRnVuY3Rpb24gKnRpbGRlX2V4cGFuc2lvbl9mYWlsdXJlX2hvb2sgPSAoQ1BGdW5jdGlvbiAqKU5VTEw7Ci0KLS8qIFdoZW4gbm9uLW51bGwsIHRoaXMgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncyB3aGljaAotICAgYXJlIGR1cGxpY2F0ZXMgZm9yIGEgdGlsZGUgcHJlZml4LiAgQmFzaCB1c2VzIHRoaXMgdG8gZXhwYW5kCi0gICBgPX4nIGFuZCBgOn4nLiAqLwotY2hhciAqKnRpbGRlX2FkZGl0aW9uYWxfcHJlZml4ZXMgPSBkZWZhdWx0X3ByZWZpeGVzOwotCi0vKiBXaGVuIG5vbi1udWxsLCB0aGlzIGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggbWF0Y2gKLSAgIHRoZSBlbmQgb2YgYSB1c2VybmFtZSwgaW5zdGVhZCBvZiBqdXN0ICIvIi4gIEJhc2ggc2V0cyB0aGlzIHRvCi0gICBgOicgYW5kIGA9ficuICovCi1jaGFyICoqdGlsZGVfYWRkaXRpb25hbF9zdWZmaXhlcyA9IGRlZmF1bHRfc3VmZml4ZXM7Ci0KLS8qIEZpbmQgdGhlIHN0YXJ0IG9mIGEgdGlsZGUgZXhwYW5zaW9uIGluIFNUUklORywgYW5kIHJldHVybiB0aGUgaW5kZXggb2YKLSAgIHRoZSB0aWxkZSB3aGljaCBzdGFydHMgdGhlIGV4cGFuc2lvbi4gIFBsYWNlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgIHdoaWNoIGlkZW50aWZpZWQgdGhpcyB0aWxkZSBzdGFydGVyIGluIExFTiwgZXhjbHVkaW5nIHRoZSB0aWxkZSBpdHNlbGYuICovCi1zdGF0aWMgaW50Ci10aWxkZV9maW5kX3ByZWZpeCAoc3RyaW5nLCBsZW4pCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50ICpsZW47Ci17Ci0gIHJlZ2lzdGVyIGludCBpLCBqLCBzdHJpbmdfbGVuOwotICByZWdpc3RlciBjaGFyICoqcHJlZml4ZXMgPSB0aWxkZV9hZGRpdGlvbmFsX3ByZWZpeGVzOwotCi0gIHN0cmluZ19sZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gICpsZW4gPSAwOwotCi0gIGlmICgqc3RyaW5nID09ICdcMCcgfHwgKnN0cmluZyA9PSAnficpCi0gICAgcmV0dXJuICgwKTsKLQotICBpZiAocHJlZml4ZXMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19sZW47IGkrKykKLQl7Ci0JICBmb3IgKGogPSAwOyBwcmVmaXhlc1tqXTsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZyArIGksIHByZWZpeGVzW2pdLCBzdHJsZW4gKHByZWZpeGVzW2pdKSkgPT0gMCkKLQkJewotCQkgICpsZW4gPSBzdHJsZW4gKHByZWZpeGVzW2pdKSAtIDE7Ci0JCSAgcmV0dXJuIChpICsgKmxlbik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAoc3RyaW5nX2xlbik7Ci19Ci0KLS8qIEZpbmQgdGhlIGVuZCBvZiBhIHRpbGRlIGV4cGFuc2lvbiBpbiBTVFJJTkcsIGFuZCByZXR1cm4gdGhlIGluZGV4IG9mCi0gICB0aGUgY2hhcmFjdGVyIHdoaWNoIGVuZHMgdGhlIHRpbGRlIGRlZmluaXRpb24uICAqLwotc3RhdGljIGludAotdGlsZGVfZmluZF9zdWZmaXggKHN0cmluZykKLSAgICAgY2hhciAqc3RyaW5nOwotewotICByZWdpc3RlciBpbnQgaSwgaiwgc3RyaW5nX2xlbjsKLSAgcmVnaXN0ZXIgY2hhciAqKnN1ZmZpeGVzOwotCi0gIHN1ZmZpeGVzID0gdGlsZGVfYWRkaXRpb25hbF9zdWZmaXhlczsKLSAgc3RyaW5nX2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nX2xlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdbaV0gPT0gJy8nIC8qIHx8ICFzdHJpbmdbaV0gKi8pCi0JYnJlYWs7Ci0KLSAgICAgIGZvciAoaiA9IDA7IHN1ZmZpeGVzICYmIHN1ZmZpeGVzW2pdOyBqKyspCi0JewotCSAgaWYgKHN0cm5jbXAgKHN0cmluZyArIGksIHN1ZmZpeGVzW2pdLCBzdHJsZW4gKHN1ZmZpeGVzW2pdKSkgPT0gMCkKLQkgICAgcmV0dXJuIChpKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGkpOwotfQotCi0vKiBSZXR1cm4gYSBuZXcgc3RyaW5nIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGlsZGUgZXhwYW5kaW5nIFNUUklORy4gKi8KLWNoYXIgKgotdGlsZGVfZXhwYW5kIChzdHJpbmcpCi0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgY2hhciAqcmVzdWx0OwotICBpbnQgcmVzdWx0X3NpemUsIHJlc3VsdF9pbmRleDsKLQotICByZXN1bHRfaW5kZXggPSByZXN1bHRfc2l6ZSA9IDA7Ci0gIGlmIChyZXN1bHQgPSBzdHJjaHIgKHN0cmluZywgJ34nKSkKLSAgICByZXN1bHQgPSB4bWFsbG9jIChyZXN1bHRfc2l6ZSA9IChzdHJsZW4gKHN0cmluZykgKyAxNikpOwotICBlbHNlCi0gICAgcmVzdWx0ID0geG1hbGxvYyAocmVzdWx0X3NpemUgPSAoc3RybGVuIChzdHJpbmcpICsgMSkpOwotCi0gIC8qIFNjYW4gdGhyb3VnaCBTVFJJTkcgZXhwYW5kaW5nIHRpbGRlcyBhcyB3ZSBjb21lIHRvIHRoZW0uICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBzdGFydCwgZW5kOwotICAgICAgY2hhciAqdGlsZGVfd29yZCwgKmV4cGFuc2lvbjsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIC8qIE1ha2UgU1RBUlQgcG9pbnQgdG8gdGhlIHRpbGRlIHdoaWNoIHN0YXJ0cyB0aGUgZXhwYW5zaW9uLiAqLwotICAgICAgc3RhcnQgPSB0aWxkZV9maW5kX3ByZWZpeCAoc3RyaW5nLCAmbGVuKTsKLQotICAgICAgLyogQ29weSB0aGUgc2tpcHBlZCB0ZXh0IGludG8gdGhlIHJlc3VsdC4gKi8KLSAgICAgIGlmICgocmVzdWx0X2luZGV4ICsgc3RhcnQgKyAxKSA+IHJlc3VsdF9zaXplKQotCXJlc3VsdCA9IHhyZWFsbG9jIChyZXN1bHQsIDEgKyAocmVzdWx0X3NpemUgKz0gKHN0YXJ0ICsgMjApKSk7Ci0KLSAgICAgIHN0cm5jcHkgKHJlc3VsdCArIHJlc3VsdF9pbmRleCwgc3RyaW5nLCBzdGFydCk7Ci0gICAgICByZXN1bHRfaW5kZXggKz0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFkdmFuY2UgU1RSSU5HIHRvIHRoZSBzdGFydGluZyB0aWxkZS4gKi8KLSAgICAgIHN0cmluZyArPSBzdGFydDsKLQotICAgICAgLyogTWFrZSBFTkQgYmUgdGhlIGluZGV4IG9mIG9uZSBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCi0JIHVzZXJuYW1lLiAqLwotICAgICAgZW5kID0gdGlsZGVfZmluZF9zdWZmaXggKHN0cmluZyk7Ci0KLSAgICAgIC8qIElmIGJvdGggU1RBUlQgYW5kIEVORCBhcmUgemVybywgd2UgYXJlIGFsbCBkb25lLiAqLwotICAgICAgaWYgKCFzdGFydCAmJiAhZW5kKQotCWJyZWFrOwotCi0gICAgICAvKiBFeHBhbmQgdGhlIGVudGlyZSB0aWxkZSB3b3JkLCBhbmQgY29weSBpdCBpbnRvIFJFU1VMVC4gKi8KLSAgICAgIHRpbGRlX3dvcmQgPSB4bWFsbG9jICgxICsgZW5kKTsKLSAgICAgIHN0cm5jcHkgKHRpbGRlX3dvcmQsIHN0cmluZywgZW5kKTsKLSAgICAgIHRpbGRlX3dvcmRbZW5kXSA9ICdcMCc7Ci0gICAgICBzdHJpbmcgKz0gZW5kOwotCi0gICAgICBleHBhbnNpb24gPSB0aWxkZV9leHBhbmRfd29yZCAodGlsZGVfd29yZCk7Ci0gICAgICBmcmVlICh0aWxkZV93b3JkKTsKLQotICAgICAgbGVuID0gc3RybGVuIChleHBhbnNpb24pOwotICAgICAgaWYgKChyZXN1bHRfaW5kZXggKyBsZW4gKyAxKSA+IHJlc3VsdF9zaXplKQotCXJlc3VsdCA9IHhyZWFsbG9jIChyZXN1bHQsIDEgKyAocmVzdWx0X3NpemUgKz0gKGxlbiArIDIwKSkpOwotCi0gICAgICBzdHJjcHkgKHJlc3VsdCArIHJlc3VsdF9pbmRleCwgZXhwYW5zaW9uKTsKLSAgICAgIHJlc3VsdF9pbmRleCArPSBsZW47Ci0gICAgICBmcmVlIChleHBhbnNpb24pOwotICAgIH0KLQotICByZXN1bHRbcmVzdWx0X2luZGV4XSA9ICdcMCc7Ci0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0vKiBUYWtlIEZOQU1FIGFuZCByZXR1cm4gdGhlIHRpbGRlIHByZWZpeCB3ZSB3YW50IGV4cGFuZGVkLiAgSWYgTEVOUCBpcwotICAgbm9uLW51bGwsIHRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBwcmVmaXggaW50byBGTkFNRSBpcyByZXR1cm5lZCBpbgotICAgdGhlIGxvY2F0aW9uIGl0IHBvaW50cyB0by4gKi8KLXN0YXRpYyBjaGFyICoKLWlzb2xhdGVfdGlsZGVfcHJlZml4IChmbmFtZSwgbGVucCkKLSAgICAgY2hhciAqZm5hbWU7Ci0gICAgIGludCAqbGVucDsKLXsKLSAgY2hhciAqcmV0OwotICBpbnQgaTsKLQotICByZXQgPSB4bWFsbG9jIChzdHJsZW4gKGZuYW1lKSk7Ci0gIGZvciAoaSA9IDE7IGZuYW1lW2ldICYmIGZuYW1lW2ldICE9ICcvJzsgaSsrKQotICAgIHJldFtpIC0gMV0gPSBmbmFtZVtpXTsKLSAgcmV0W2kgLSAxXSA9ICdcMCc7Ci0gIGlmIChsZW5wKQotICAgICpsZW5wID0gaTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJuIGEgc3RyaW5nIHRoYXQgaXMgUFJFRklYIGNvbmNhdGVuYXRlZCB3aXRoIFNVRkZJWCBzdGFydGluZyBhdAotICAgU1VGRklORC4gKi8KLXN0YXRpYyBjaGFyICoKLWdsdWVfcHJlZml4X2FuZF9zdWZmaXggKHByZWZpeCwgc3VmZml4LCBzdWZmaW5kKQotICAgICBjaGFyICpwcmVmaXgsICpzdWZmaXg7Ci0gICAgIGludCBzdWZmaW5kOwotewotICBjaGFyICpyZXQ7Ci0gIGludCBwbGVuLCBzbGVuOwotCi0gIHBsZW4gPSAocHJlZml4ICYmICpwcmVmaXgpID8gc3RybGVuIChwcmVmaXgpIDogMDsKLSAgc2xlbiA9IHN0cmxlbiAoc3VmZml4ICsgc3VmZmluZCk7Ci0gIHJldCA9IHhtYWxsb2MgKHBsZW4gKyBzbGVuICsgMSk7Ci0gIGlmIChwcmVmaXggJiYgKnByZWZpeCkKLSAgICBzdHJjcHkgKHJldCwgcHJlZml4KTsKLSAgc3RyY3B5IChyZXQgKyBwbGVuLCBzdWZmaXggKyBzdWZmaW5kKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgdGlsZGUgZXhwYW5zaW9uIG9uIEZJTEVOQU1FLiAgRklMRU5BTUUgc3RhcnRzIHdpdGggYQotICAgdGlsZGUuICBJZiB0aGVyZSBpcyBubyBleHBhbnNpb24sIGNhbGwgdGlsZGVfZXhwYW5zaW9uX2ZhaWx1cmVfaG9vay4KLSAgIFRoaXMgYWx3YXlzIHJldHVybnMgYSBuZXdseS1hbGxvY2F0ZWQgc3RyaW5nLCBuZXZlciBzdGF0aWMgc3RvcmFnZS4gKi8KLWNoYXIgKgotdGlsZGVfZXhwYW5kX3dvcmQgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgY2hhciAqZGlybmFtZSwgKmV4cGFuc2lvbiwgKnVzZXJuYW1lOwotICBpbnQgdXNlcl9sZW47Ci0gIHN0cnVjdCBwYXNzd2QgKnVzZXJfZW50cnk7Ci0KLSAgaWYgKGZpbGVuYW1lID09IDApCi0gICAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotCi0gIGlmICgqZmlsZW5hbWUgIT0gJ34nKQotICAgIHJldHVybiAoc2F2ZXN0cmluZyAoZmlsZW5hbWUpKTsKLQotICAvKiBBIGxlYWRpbmcgYH4vJyBvciBhIGJhcmUgYH4nIGlzICphbHdheXMqIHRyYW5zbGF0ZWQgdG8gdGhlIHZhbHVlIG9mCi0gICAgICRIT01FIG9yIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCByZWdhcmRsZXNzIG9mIGFueQotICAgICBwcmVleHBhbnNpb24gaG9vay4gKi8KLSAgaWYgKGZpbGVuYW1lWzFdID09ICdcMCcgfHwgZmlsZW5hbWVbMV0gPT0gJy8nKQotICAgIHsKLSAgICAgIC8qIFByZWZpeCAkSE9NRSB0byB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLiAqLwotICAgICAgZXhwYW5zaW9uID0gZ2V0X2Vudl92YWx1ZSAoIkhPTUUiKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm8gSE9NRSB2YXJpYWJsZSwgbG9vayB1cCB0aGUgZGlyZWN0b3J5IGluCi0JIHRoZSBwYXNzd29yZCBkYXRhYmFzZS4gKi8KLSAgICAgIGlmIChleHBhbnNpb24gPT0gMCkKLQlleHBhbnNpb24gPSBnZXRfaG9tZV9kaXIgKCk7Ci0KLSAgICAgIHJldHVybiAoZ2x1ZV9wcmVmaXhfYW5kX3N1ZmZpeCAoZXhwYW5zaW9uLCBmaWxlbmFtZSwgMSkpOwotICAgIH0KLQotICB1c2VybmFtZSA9IGlzb2xhdGVfdGlsZGVfcHJlZml4IChmaWxlbmFtZSwgJnVzZXJfbGVuKTsKLQotICBpZiAodGlsZGVfZXhwYW5zaW9uX3ByZWV4cGFuc2lvbl9ob29rKQotICAgIHsKLSAgICAgIGV4cGFuc2lvbiA9ICgqdGlsZGVfZXhwYW5zaW9uX3ByZWV4cGFuc2lvbl9ob29rKSAodXNlcm5hbWUpOwotICAgICAgaWYgKGV4cGFuc2lvbikKLQl7Ci0JICBkaXJuYW1lID0gZ2x1ZV9wcmVmaXhfYW5kX3N1ZmZpeCAoZXhwYW5zaW9uLCBmaWxlbmFtZSwgdXNlcl9sZW4pOwotCSAgZnJlZSAodXNlcm5hbWUpOwotCSAgZnJlZSAoZXhwYW5zaW9uKTsKLQkgIHJldHVybiAoZGlybmFtZSk7Ci0JfQotICAgIH0KLQotICAvKiBObyBwcmVleHBhbnNpb24gaG9vaywgb3IgdGhlIHByZWV4cGFuc2lvbiBob29rIGZhaWxlZC4gIExvb2sgaW4gdGhlCi0gICAgIHBhc3N3b3JkIGRhdGFiYXNlLiAqLwotICBkaXJuYW1lID0gKGNoYXIgKilOVUxMOwotICB1c2VyX2VudHJ5ID0gZ2V0cHduYW0gKHVzZXJuYW1lKTsKLSAgaWYgKHVzZXJfZW50cnkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgY2FsbGluZyBwcm9ncmFtIGhhcyBhIHNwZWNpYWwgc3ludGF4IGZvciBleHBhbmRpbmcgdGlsZGVzLAotCSBhbmQgd2UgY291bGRuJ3QgZmluZCBhIHN0YW5kYXJkIGV4cGFuc2lvbiwgdGhlbiBsZXQgdGhlbSB0cnkuICovCi0gICAgICBpZiAodGlsZGVfZXhwYW5zaW9uX2ZhaWx1cmVfaG9vaykKLQl7Ci0JICBleHBhbnNpb24gPSAoKnRpbGRlX2V4cGFuc2lvbl9mYWlsdXJlX2hvb2spICh1c2VybmFtZSk7Ci0JICBpZiAoZXhwYW5zaW9uKQotCSAgICB7Ci0JICAgICAgZGlybmFtZSA9IGdsdWVfcHJlZml4X2FuZF9zdWZmaXggKGV4cGFuc2lvbiwgZmlsZW5hbWUsIHVzZXJfbGVuKTsKLQkgICAgICBmcmVlIChleHBhbnNpb24pOwotCSAgICB9Ci0JfQotICAgICAgZnJlZSAodXNlcm5hbWUpOwotICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGZhaWx1cmUgaG9vaywgb3IgaWYgdGhlIGZhaWx1cmUgaG9vayBkaWQgbm90Ci0JIGV4cGFuZCB0aGUgdGlsZGUsIHJldHVybiBhIGNvcHkgb2Ygd2hhdCB3ZSB3ZXJlIHBhc3NlZC4gKi8KLSAgICAgIGlmIChkaXJuYW1lID09IDApCi0JZGlybmFtZSA9IHNhdmVzdHJpbmcgKGZpbGVuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlICh1c2VybmFtZSk7Ci0gICAgICBkaXJuYW1lID0gZ2x1ZV9wcmVmaXhfYW5kX3N1ZmZpeCAodXNlcl9lbnRyeS0+cHdfZGlyLCBmaWxlbmFtZSwgdXNlcl9sZW4pOwotICAgIH0KLQotICBlbmRwd2VudCAoKTsKLSAgcmV0dXJuIChkaXJuYW1lKTsKLX0KLQotDAotI2lmIGRlZmluZWQgKFRFU1QpCi0jdW5kZWYgTlVMTAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqcmVzdWx0LCBsaW5lWzUxMl07Ci0gIGludCBkb25lID0gMDsKLQotICB3aGlsZSAoIWRvbmUpCi0gICAgewotICAgICAgcHJpbnRmICgifmV4cGFuZDogIik7Ci0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0KLSAgICAgIGlmICghZ2V0cyAobGluZSkpCi0Jc3RyY3B5IChsaW5lLCAiZG9uZSIpOwotCi0gICAgICBpZiAoKHN0cmNtcCAobGluZSwgImRvbmUiKSA9PSAwKSB8fAotCSAgKHN0cmNtcCAobGluZSwgInF1aXQiKSA9PSAwKSB8fAotCSAgKHN0cmNtcCAobGluZSwgImV4aXQiKSA9PSAwKSkKLQl7Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgcmVzdWx0ID0gdGlsZGVfZXhwYW5kIChsaW5lKTsKLSAgICAgIHByaW50ZiAoIiAgLS0+ICVzXG4iLCByZXN1bHQpOwotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICB9Ci0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZCBtZW1vcnlfZXJyb3JfYW5kX2Fib3J0ICgpOwotCi1zdGF0aWMgY2hhciAqCi14bWFsbG9jIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBjaGFyICp0ZW1wID0gKGNoYXIgKiltYWxsb2MgKGJ5dGVzKTsKLQotICBpZiAoIXRlbXApCi0gICAgbWVtb3J5X2Vycm9yX2FuZF9hYm9ydCAoKTsKLSAgcmV0dXJuICh0ZW1wKTsKLX0KLQotc3RhdGljIGNoYXIgKgoteHJlYWxsb2MgKHBvaW50ZXIsIGJ5dGVzKQotICAgICBjaGFyICpwb2ludGVyOwotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIGNoYXIgKnRlbXA7Ci0KLSAgaWYgKCFwb2ludGVyKQotICAgIHRlbXAgPSAoY2hhciAqKW1hbGxvYyAoYnl0ZXMpOwotICBlbHNlCi0gICAgdGVtcCA9IChjaGFyICopcmVhbGxvYyAocG9pbnRlciwgYnl0ZXMpOwotCi0gIGlmICghdGVtcCkKLSAgICBtZW1vcnlfZXJyb3JfYW5kX2Fib3J0ICgpOwotCi0gIHJldHVybiAodGVtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZW1vcnlfZXJyb3JfYW5kX2Fib3J0ICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlYWRsaW5lOiBvdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIpOwotICBhYm9ydCAoKTsKLX0KLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGNvbXBpbGUtY29tbWFuZDogImdjYyAtZyAtRFRFU1QgLW8gdGlsZGUgdGlsZGUuYyIKLSAqIGVuZDoKLSAqLwotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3RpbGRlLmggYi9yZWFkbGluZS90aWxkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRiOTU0Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3RpbGRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiB0aWxkZS5oOiBFeHRlcm5hbGx5IGF2YWlsYWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uIGluIGxpYnRpbGRlLmEuICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBSZWFkbGluZSBMaWJyYXJ5ICh0aGUgTGlicmFyeSksIGEgc2V0IG9mCi0gICByb3V0aW5lcyBmb3IgcHJvdmlkaW5nIEVtYWNzIHN0eWxlIGxpbmUgaW5wdXQgdG8gcHJvZ3JhbXMgdGhhdCBhc2sKLSAgIGZvciBpdC4KLQotICAgVGhlIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmICFkZWZpbmVkIChfVElMREVfSF8pCi0jICBkZWZpbmUgX1RJTERFX0hfCi0KLS8qIEZ1bmN0aW9uIHBvaW50ZXJzIGNhbiBiZSBkZWNsYXJlZCBhcyAoRnVuY3Rpb24gKilmb28uICovCi0jaWYgIWRlZmluZWQgKF9GVU5DVElPTl9ERUYpCi0jICBkZWZpbmUgX0ZVTkNUSU9OX0RFRgotdHlwZWRlZiBpbnQgRnVuY3Rpb24gKCk7Ci10eXBlZGVmIHZvaWQgVkZ1bmN0aW9uICgpOwotdHlwZWRlZiBjaGFyICpDUEZ1bmN0aW9uICgpOwotdHlwZWRlZiBjaGFyICoqQ1BQRnVuY3Rpb24gKCk7Ci0jZW5kaWYgLyogX0ZVTkNUSU9OX0RFRiAqLwotCi0vKiBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0gICB3YW50cyBjYWxsZWQgYmVmb3JlIHRyeWluZyB0aGUgc3RhbmRhcmQgdGlsZGUgZXhwYW5zaW9ucy4gIFRoZSBmdW5jdGlvbgotICAgaXMgY2FsbGVkIHdpdGggdGhlIHRleHQgc2FucyB0aWxkZSwgYW5kIHJldHVybnMgYSBtYWxsb2MoKSdlZCBzdHJpbmcKLSAgIHdoaWNoIGlzIHRoZSBleHBhbnNpb24sIG9yIGEgTlVMTCBwb2ludGVyIGlmIHRoZSBleHBhbnNpb24gZmFpbHMuICovCi1leHRlcm4gQ1BGdW5jdGlvbiAqdGlsZGVfZXhwYW5zaW9uX3ByZWV4cGFuc2lvbl9ob29rOwotCi0vKiBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlCi0gICBzdGFuZGFyZCBtZWFuaW5nIGZvciBleHBhbmRpbmcgYSB0aWxkZSBmYWlscy4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKLSAgIHdpdGggdGhlIHRleHQgKHNhbnMgdGlsZGUsIGFzIGluICJmb28iKSwgYW5kIHJldHVybnMgYSBtYWxsb2MoKSdlZCBzdHJpbmcKLSAgIHdoaWNoIGlzIHRoZSBleHBhbnNpb24sIG9yIGEgTlVMTCBwb2ludGVyIGlmIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4gKi8KLWV4dGVybiBDUEZ1bmN0aW9uICp0aWxkZV9leHBhbnNpb25fZmFpbHVyZV9ob29rOwotCi0vKiBXaGVuIG5vbi1udWxsLCB0aGlzIGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2gKLSAgIGFyZSBkdXBsaWNhdGVzIGZvciBhIHRpbGRlIHByZWZpeC4gIEJhc2ggdXNlcyB0aGlzIHRvIGV4cGFuZAotICAgYD1+JyBhbmQgYDp+Jy4gKi8KLWV4dGVybiBjaGFyICoqdGlsZGVfYWRkaXRpb25hbF9wcmVmaXhlczsKLQotLyogV2hlbiBub24tbnVsbCwgdGhpcyBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIG1hdGNoCi0gICB0aGUgZW5kIG9mIGEgdXNlcm5hbWUsIGluc3RlYWQgb2YganVzdCAiLyIuICBCYXNoIHNldHMgdGhpcyB0bwotICAgYDonIGFuZCBgPX4nLiAqLwotZXh0ZXJuIGNoYXIgKip0aWxkZV9hZGRpdGlvbmFsX3N1ZmZpeGVzOwotCi0vKiBSZXR1cm4gYSBuZXcgc3RyaW5nIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGlsZGUgZXhwYW5kaW5nIFNUUklORy4gKi8KLWV4dGVybiBjaGFyICp0aWxkZV9leHBhbmQgKCk7Ci0KLS8qIERvIHRoZSB3b3JrIG9mIHRpbGRlIGV4cGFuc2lvbiBvbiBGSUxFTkFNRS4gIEZJTEVOQU1FIHN0YXJ0cyB3aXRoIGEKLSAgIHRpbGRlLiAgSWYgdGhlcmUgaXMgbm8gZXhwYW5zaW9uLCBjYWxsIHRpbGRlX2V4cGFuc2lvbl9mYWlsdXJlX2hvb2suICovCi1leHRlcm4gY2hhciAqdGlsZGVfZXhwYW5kX3dvcmQgKCk7Ci0KLSNlbmRpZiAvKiBfVElMREVfSF8gKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3VuZG8uYyBiL3JlYWRsaW5lL3VuZG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYmNjOC4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS91bmRvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyogcmVhZGxpbmUuYyAtLSBhIGdlbmVyYWwgZmFjaWxpdHkgZm9yIHJlYWRpbmcgbGluZXMgb2YgaW5wdXQKLSAgIHdpdGggZW1hY3Mgc3R5bGUgZWRpdGluZyBhbmQgY29tcGxldGlvbi4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAgIC8qIGZvciBfUE9TSVhfVkVSU0lPTiAqLwotI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFN5c3RlbS1zcGVjaWZpYyBmZWF0dXJlIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIGZpbGVzLiAqLwotI2luY2x1ZGUgInJsZGVmcy5oIgotCi0vKiBTb21lIHN0YW5kYXJkIGxpYnJhcnkgcm91dGluZXMuICovCi0jaW5jbHVkZSAicmVhZGxpbmUuaCIKLSNpbmNsdWRlICJoaXN0b3J5LmgiCi0KLSNkZWZpbmUgU1dBUChzLCBlKSAgZG8geyBpbnQgdDsgdCA9IHM7IHMgPSBlOyBlID0gdDsgfSB3aGlsZSAoMCkKLQotLyogTm9uLXplcm8gdGVsbHMgcmxfZGVsZXRlX3RleHQgYW5kIHJsX2luc2VydF90ZXh0IHRvIG5vdCBhZGQgdG8KLSAgIHRoZSB1bmRvIGxpc3QuICovCi1pbnQgX3JsX2RvaW5nX2FuX3VuZG8gPSAwOwotCi0vKiBIb3cgbWFueSB1bmNsb3NlZCB1bmRvIGdyb3VwcyB3ZSBjdXJyZW50bHkgaGF2ZS4gKi8KLWludCBfcmxfdW5kb19ncm91cF9sZXZlbCA9IDA7Ci0KLS8qIFRoZSBjdXJyZW50IHVuZG8gbGlzdCBmb3IgVEhFX0xJTkUuICovCi1VTkRPX0xJU1QgKnJsX3VuZG9fbGlzdCA9IChVTkRPX0xJU1QgKilOVUxMOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCVVuZG8sIGFuZCBVbmRvaW5nCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFJlbWVtYmVyIGhvdyB0byB1bmRvIHNvbWV0aGluZy4gIENvbmNhdGVuYXRlIHNvbWUgdW5kb3MgaWYgdGhhdAotICAgc2VlbXMgcmlnaHQuICovCi12b2lkCi1ybF9hZGRfdW5kbyAod2hhdCwgc3RhcnQsIGVuZCwgdGV4dCkKLSAgICAgZW51bSB1bmRvX2NvZGUgd2hhdDsKLSAgICAgaW50IHN0YXJ0LCBlbmQ7Ci0gICAgIGNoYXIgKnRleHQ7Ci17Ci0gIFVORE9fTElTVCAqdGVtcCA9IChVTkRPX0xJU1QgKil4bWFsbG9jIChzaXplb2YgKFVORE9fTElTVCkpOwotICB0ZW1wLT53aGF0ID0gd2hhdDsKLSAgdGVtcC0+c3RhcnQgPSBzdGFydDsKLSAgdGVtcC0+ZW5kID0gZW5kOwotICB0ZW1wLT50ZXh0ID0gdGV4dDsKLSAgdGVtcC0+bmV4dCA9IHJsX3VuZG9fbGlzdDsKLSAgcmxfdW5kb19saXN0ID0gdGVtcDsKLX0KLQotLyogRnJlZSB0aGUgZXhpc3RpbmcgdW5kbyBsaXN0LiAqLwotdm9pZAotZnJlZV91bmRvX2xpc3QgKCkKLXsKLSAgd2hpbGUgKHJsX3VuZG9fbGlzdCkKLSAgICB7Ci0gICAgICBVTkRPX0xJU1QgKnJlbGVhc2UgPSBybF91bmRvX2xpc3Q7Ci0gICAgICBybF91bmRvX2xpc3QgPSBybF91bmRvX2xpc3QtPm5leHQ7Ci0KLSAgICAgIGlmIChyZWxlYXNlLT53aGF0ID09IFVORE9fREVMRVRFKQotCWZyZWUgKHJlbGVhc2UtPnRleHQpOwotCi0gICAgICBmcmVlIChyZWxlYXNlKTsKLSAgICB9Ci0gIHJsX3VuZG9fbGlzdCA9IChVTkRPX0xJU1QgKilOVUxMOwotfQotCi0vKiBVbmRvIHRoZSBuZXh0IHRoaW5nIGluIHRoZSBsaXN0LiAgUmV0dXJuIDAgaWYgdGhlcmUKLSAgIGlzIG5vdGhpbmcgdG8gdW5kbywgb3Igbm9uLXplcm8gaWYgdGhlcmUgd2FzLiAqLwotaW50Ci1ybF9kb191bmRvICgpCi17Ci0gIFVORE9fTElTVCAqcmVsZWFzZTsKLSAgaW50IHdhaXRpbmdfZm9yX2JlZ2luID0gMDsKLSAgaW50IHN0YXJ0LCBlbmQ7Ci0KLSNkZWZpbmUgVFJBTlMoaSkgKChpKSA9PSAtMSA/IHJsX3BvaW50IDogKChpKSA9PSAtMiA/IHJsX2VuZCA6IChpKSkpCi0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAoIXJsX3VuZG9fbGlzdCkKLQlyZXR1cm4gKDApOwotCi0gICAgICBfcmxfZG9pbmdfYW5fdW5kbyA9IDE7Ci0KLSAgICAgIC8qIFRvIGJldHRlciBzdXBwb3J0IHZpLW1vZGUsIGEgc3RhcnQgb3IgZW5kIHZhbHVlIG9mIC0xIG1lYW5zCi0JIHJsX3BvaW50LCBhbmQgYSB2YWx1ZSBvZiAtMiBtZWFucyBybF9lbmQuICovCi0gICAgICBpZiAocmxfdW5kb19saXN0LT53aGF0ID09IFVORE9fREVMRVRFIHx8IHJsX3VuZG9fbGlzdC0+d2hhdCA9PSBVTkRPX0lOU0VSVCkKLQl7Ci0JICBzdGFydCA9IFRSQU5TIChybF91bmRvX2xpc3QtPnN0YXJ0KTsKLQkgIGVuZCA9IFRSQU5TIChybF91bmRvX2xpc3QtPmVuZCk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJsX3VuZG9fbGlzdC0+d2hhdCkKLQl7Ci0JLyogVW5kb2luZyBkZWxldGVzIG1lYW5zIGluc2VydGluZyBzb21lIHRleHQuICovCi0JY2FzZSBVTkRPX0RFTEVURToKLQkgIHJsX3BvaW50ID0gc3RhcnQ7Ci0JICBybF9pbnNlcnRfdGV4dCAocmxfdW5kb19saXN0LT50ZXh0KTsKLQkgIGZyZWUgKHJsX3VuZG9fbGlzdC0+dGV4dCk7Ci0JICBicmVhazsKLQotCS8qIFVuZG9pbmcgaW5zZXJ0cyBtZWFucyBkZWxldGluZyBzb21lIHRleHQuICovCi0JY2FzZSBVTkRPX0lOU0VSVDoKLQkgIHJsX2RlbGV0ZV90ZXh0IChzdGFydCwgZW5kKTsKLQkgIHJsX3BvaW50ID0gc3RhcnQ7Ci0JICBicmVhazsKLQotCS8qIFVuZG9pbmcgYW4gRU5EIG1lYW5zIHVuZG9pbmcgZXZlcnl0aGluZyAndGlsIHdlIGdldCB0byBhIEJFR0lOLiAqLwotCWNhc2UgVU5ET19FTkQ6Ci0JICB3YWl0aW5nX2Zvcl9iZWdpbisrOwotCSAgYnJlYWs7Ci0KLQkvKiBVbmRvaW5nIGEgQkVHSU4gbWVhbnMgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZ3JvdXAuICovCi0JY2FzZSBVTkRPX0JFR0lOOgotCSAgaWYgKHdhaXRpbmdfZm9yX2JlZ2luKQotCSAgICB3YWl0aW5nX2Zvcl9iZWdpbi0tOwotCSAgZWxzZQotCSAgICBkaW5nICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBfcmxfZG9pbmdfYW5fdW5kbyA9IDA7Ci0KLSAgICAgIHJlbGVhc2UgPSBybF91bmRvX2xpc3Q7Ci0gICAgICBybF91bmRvX2xpc3QgPSBybF91bmRvX2xpc3QtPm5leHQ7Ci0gICAgICBmcmVlIChyZWxlYXNlKTsKLSAgICB9Ci0gIHdoaWxlICh3YWl0aW5nX2Zvcl9iZWdpbik7Ci0KLSAgcmV0dXJuICgxKTsKLX0KLSN1bmRlZiBUUkFOUwotCi1pbnQKLV9ybF9maXhfbGFzdF91bmRvX29mX3R5cGUgKHR5cGUsIHN0YXJ0LCBlbmQpCi0gICAgIGludCB0eXBlLCBzdGFydCwgZW5kOwotewotICBVTkRPX0xJU1QgKnJsOwotCi0gIGZvciAocmwgPSBybF91bmRvX2xpc3Q7IHJsOyBybCA9IHJsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChybC0+d2hhdCA9PSB0eXBlKQotCXsKLQkgIHJsLT5zdGFydCA9IHN0YXJ0OwotCSAgcmwtPmVuZCA9IGVuZDsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBCZWdpbiBhIGdyb3VwLiAgU3Vic2VxdWVudCB1bmRvcyBhcmUgdW5kb25lIGFzIGFuIGF0b21pYyBvcGVyYXRpb24uICovCi1pbnQKLXJsX2JlZ2luX3VuZG9fZ3JvdXAgKCkKLXsKLSAgcmxfYWRkX3VuZG8gKFVORE9fQkVHSU4sIDAsIDAsIDApOwotICBfcmxfdW5kb19ncm91cF9sZXZlbCsrOwotICByZXR1cm4gMDsKLX0KLQotLyogRW5kIGFuIHVuZG8gZ3JvdXAgc3RhcnRlZCB3aXRoIHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCkuICovCi1pbnQKLXJsX2VuZF91bmRvX2dyb3VwICgpCi17Ci0gIHJsX2FkZF91bmRvIChVTkRPX0VORCwgMCwgMCwgMCk7Ci0gIF9ybF91bmRvX2dyb3VwX2xldmVsLS07Ci0gIHJldHVybiAwOwotfQotCi0vKiBTYXZlIGFuIHVuZG8gZW50cnkgZm9yIHRoZSB0ZXh0IGZyb20gU1RBUlQgdG8gRU5ELiAqLwotaW50Ci1ybF9tb2RpZnlpbmcgKHN0YXJ0LCBlbmQpCi0gICAgIGludCBzdGFydCwgZW5kOwotewotICBpZiAoc3RhcnQgPiBlbmQpCi0gICAgewotICAgICAgU1dBUCAoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gIGlmIChzdGFydCAhPSBlbmQpCi0gICAgewotICAgICAgY2hhciAqdGVtcCA9IHJsX2NvcHlfdGV4dCAoc3RhcnQsIGVuZCk7Ci0gICAgICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotICAgICAgcmxfYWRkX3VuZG8gKFVORE9fREVMRVRFLCBzdGFydCwgZW5kLCB0ZW1wKTsKLSAgICAgIHJsX2FkZF91bmRvIChVTkRPX0lOU0VSVCwgc3RhcnQsIGVuZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgIHJsX2VuZF91bmRvX2dyb3VwICgpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldmVydCB0aGUgY3VycmVudCBsaW5lIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS4gKi8KLWludAotcmxfcmV2ZXJ0X2xpbmUgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoIXJsX3VuZG9fbGlzdCkKLSAgICBkaW5nICgpOwotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHJsX3VuZG9fbGlzdCkKLQlybF9kb191bmRvICgpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERvIHNvbWUgdW5kb2luZyBvZiB0aGluZ3MgdGhhdCB3ZXJlIGRvbmUuICovCi1pbnQKLXJsX3VuZG9fY29tbWFuZCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChjb3VudCA8IDApCi0gICAgcmV0dXJuIDA7CS8qIE5vdGhpbmcgdG8gZG8uICovCi0KLSAgd2hpbGUgKGNvdW50KQotICAgIHsKLSAgICAgIGlmIChybF9kb191bmRvICgpKQotCWNvdW50LS07Ci0gICAgICBlbHNlCi0JewotCSAgZGluZyAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvdXRpbC5jIGIvcmVhZGxpbmUvdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMzYjY2Li4wMDAwMDAwCi0tLSBhL3JlYWRsaW5lL3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKiB1dGlsLmMgLS0gcmVhZGxpbmUgdXRpbGl0eSBmdW5jdGlvbnMgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgInBvc2l4am1wLmgiCi0KLSNpZiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAvKiBmb3IgX1BPU0lYX1ZFUlNJT04gKi8KLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIFN5c3RlbS1zcGVjaWZpYyBmZWF0dXJlIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIGZpbGVzLiAqLwotI2luY2x1ZGUgInJsZGVmcy5oIgotCi0jaWYgZGVmaW5lZCAoVElPQ1NUQVRfSU5fU1lTX0lPQ1RMKQotIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jZW5kaWYgLyogVElPQ1NUQVRfSU5fU1lTX0lPQ1RMICovCi0KLS8qIFNvbWUgc3RhbmRhcmQgbGlicmFyeSByb3V0aW5lcy4gKi8KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi0jZGVmaW5lIFNXQVAocywgZSkgIGRvIHsgaW50IHQ7IHQgPSBzOyBzID0gZTsgZSA9IHQ7IH0gd2hpbGUgKDApCi0KLS8qIFBzZXVkby1nbG9iYWxzIGltcG9ydGVkIGZyb20gcmVhZGxpbmUuYyAqLwotZXh0ZXJuIGludCByZWFkbGluZV9lY2hvaW5nX3A7Ci1leHRlcm4gcHJvY2Vudl90IHJlYWRsaW5lX3RvcF9sZXZlbDsKLWV4dGVybiBpbnQgcmxfbGluZV9idWZmZXJfbGVuOwotZXh0ZXJuIEZ1bmN0aW9uICpybF9sYXN0X2Z1bmM7Ci0KLWV4dGVybiBpbnQgX3JsX2RlZmluaW5nX2tiZF9tYWNybzsKLWV4dGVybiBjaGFyICpfcmxfZXhlY3V0aW5nX21hY3JvOwotCi0vKiBQc2V1ZG8tZ2xvYmFsIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIG90aGVyIGxpYnJhcnkgZmlsZXMuICovCi1leHRlcm4gdm9pZCBfcmxfcmVwbGFjZV90ZXh0ICgpOwotZXh0ZXJuIHZvaWQgX3JsX3BvcF9leGVjdXRpbmdfbWFjcm8gKCk7Ci1leHRlcm4gdm9pZCBfcmxfc2V0X3RoZV9saW5lICgpOwotZXh0ZXJuIHZvaWQgX3JsX2luaXRfYXJndW1lbnQgKCk7Ci0KLWV4dGVybiBjaGFyICp4bWFsbG9jICgpLCAqeHJlYWxsb2MgKCk7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkJVXRpbGl0eSBGdW5jdGlvbnMJCQkgICAgKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogUmV0dXJuIDAgaWYgQyBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIGNsYXNzIG9mIGNoYXJhY3RlcnMgdGhhdCBiZWxvbmcKLSAgIGluIHdvcmRzLCBvciAxIGlmIGl0IGlzLiAqLwotCi1pbnQgX3JsX2FsbG93X3BhdGhuYW1lX2FscGhhYmV0aWNfY2hhcnMgPSAwOwotc3RhdGljIGNoYXIgKnBhdGhuYW1lX2FscGhhYmV0aWNfY2hhcnMgPSAiLy1fPX4uIyQiOwotCi1pbnQKLWFscGhhYmV0aWMgKGMpCi0gICAgIGludCBjOwotewotICBpZiAoQUxQSEFCRVRJQyAoYykpCi0gICAgcmV0dXJuICgxKTsKLQotICByZXR1cm4gKF9ybF9hbGxvd19wYXRobmFtZV9hbHBoYWJldGljX2NoYXJzICYmCi0JICAgIHN0cmNociAocGF0aG5hbWVfYWxwaGFiZXRpY19jaGFycywgYykgIT0gTlVMTCk7Ci19Ci0KLS8qIEhvdyB0byBhYm9ydCB0aGluZ3MuICovCi1pbnQKLV9ybF9hYm9ydF9pbnRlcm5hbCAoKQotewotICBkaW5nICgpOwotICBybF9jbGVhcl9tZXNzYWdlICgpOwotICBfcmxfaW5pdF9hcmd1bWVudCAoKTsKLSAgcmxfcGVuZGluZ19pbnB1dCA9IDA7Ci0KLSAgX3JsX2RlZmluaW5nX2tiZF9tYWNybyA9IDA7Ci0gIHdoaWxlIChfcmxfZXhlY3V0aW5nX21hY3JvKQotICAgIF9ybF9wb3BfZXhlY3V0aW5nX21hY3JvICgpOwotCi0gIHJsX2xhc3RfZnVuYyA9IChGdW5jdGlvbiAqKU5VTEw7Ci0gIGxvbmdqbXAgKHJlYWRsaW5lX3RvcF9sZXZlbCwgMSk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfYWJvcnQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICByZXR1cm4gKF9ybF9hYm9ydF9pbnRlcm5hbCAoKSk7Ci19Ci0KLWludAotcmxfdHR5X3N0YXR1cyAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0jaWYgZGVmaW5lZCAoVElPQ1NUQVQpCi0gIGlvY3RsICgxLCBUSU9DU1RBVCwgKGNoYXIgKikwKTsKLSAgcmxfcmVmcmVzaF9saW5lIChjb3VudCwga2V5KTsKLSNlbHNlCi0gIGRpbmcgKCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBiZXR3ZWVuIEZST00gYW5kIFRPLgotICAgRlJPTSBpcyBpbmNsdXNpdmUsIFRPIGlzIG5vdC4gKi8KLWNoYXIgKgotcmxfY29weV90ZXh0IChmcm9tLCB0bykKLSAgICAgaW50IGZyb20sIHRvOwotewotICByZWdpc3RlciBpbnQgbGVuZ3RoOwotICBjaGFyICpjb3B5OwotCi0gIC8qIEZpeCBpdCBpZiB0aGUgY2FsbGVyIGlzIGNvbmZ1c2VkLiAqLwotICBpZiAoZnJvbSA+IHRvKQotICAgIFNXQVAgKGZyb20sIHRvKTsKLQotICBsZW5ndGggPSB0byAtIGZyb207Ci0gIGNvcHkgPSB4bWFsbG9jICgxICsgbGVuZ3RoKTsKLSAgc3RybmNweSAoY29weSwgcmxfbGluZV9idWZmZXIgKyBmcm9tLCBsZW5ndGgpOwotICBjb3B5W2xlbmd0aF0gPSAnXDAnOwotICByZXR1cm4gKGNvcHkpOwotfQotCi0vKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiBSTF9MSU5FX0JVRkZFUiB1bnRpbCBpdCBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQKLSAgIExFTiBjaGFyYWN0ZXJzLiAqLwotdm9pZAotcmxfZXh0ZW5kX2xpbmVfYnVmZmVyIChsZW4pCi0gICAgIGludCBsZW47Ci17Ci0gIHdoaWxlIChsZW4gPj0gcmxfbGluZV9idWZmZXJfbGVuKQotICAgIHsKLSAgICAgIHJsX2xpbmVfYnVmZmVyX2xlbiArPSBERUZBVUxUX0JVRkZFUl9TSVpFOwotICAgICAgcmxfbGluZV9idWZmZXIgPSB4cmVhbGxvYyAocmxfbGluZV9idWZmZXIsIHJsX2xpbmVfYnVmZmVyX2xlbik7Ci0gICAgfQotCi0gIF9ybF9zZXRfdGhlX2xpbmUgKCk7Ci19Ci0KLQotLyogQSBmdW5jdGlvbiBmb3Igc2ltcGxlIHRpbGRlIGV4cGFuc2lvbi4gKi8KLWludAotcmxfdGlsZGVfZXhwYW5kIChpZ25vcmUsIGtleSkKLSAgICAgaW50IGlnbm9yZSwga2V5OwotewotICByZWdpc3RlciBpbnQgc3RhcnQsIGVuZDsKLSAgY2hhciAqaG9tZWRpciwgKnRlbXA7Ci0gIGludCBsZW47Ci0KLSAgZW5kID0gcmxfcG9pbnQ7Ci0gIHN0YXJ0ID0gZW5kIC0gMTsKLQotICBpZiAocmxfcG9pbnQgPT0gcmxfZW5kICYmIHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSA9PSAnficpCi0gICAgewotICAgICAgaG9tZWRpciA9IHRpbGRlX2V4cGFuZCAoIn4iKTsKLSAgICAgIF9ybF9yZXBsYWNlX3RleHQgKGhvbWVkaXIsIHN0YXJ0LCBlbmQpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJsX2xpbmVfYnVmZmVyW3N0YXJ0XSAhPSAnficpCi0gICAgewotICAgICAgZm9yICg7ICF3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltzdGFydF0pICYmIHN0YXJ0ID49IDA7IHN0YXJ0LS0pCi0gICAgICAgIDsKLSAgICAgIHN0YXJ0Kys7Ci0gICAgfQotCi0gIGVuZCA9IHN0YXJ0OwotICBkbwotICAgIGVuZCsrOwotICB3aGlsZSAod2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbZW5kXSkgPT0gMCAmJiBlbmQgPCBybF9lbmQpOwotCi0gIGlmICh3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltlbmRdKSB8fCBlbmQgPj0gcmxfZW5kKQotICAgIGVuZC0tOwotCi0gIC8qIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGN1cnJlbnQgd29yZCBpcyBhIHRpbGRlLCBwZXJmb3JtCi0gICAgIHRpbGRlIGV4cGFuc2lvbiBhbmQgaW5zZXJ0IHRoZSByZXN1bHQuICBJZiBub3QgYSB0aWxkZSwgZG8KLSAgICAgbm90aGluZy4gKi8KLSAgaWYgKHJsX2xpbmVfYnVmZmVyW3N0YXJ0XSA9PSAnficpCi0gICAgewotICAgICAgbGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICAgICAgdGVtcCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RybmNweSAodGVtcCwgcmxfbGluZV9idWZmZXIgKyBzdGFydCwgbGVuKTsKLSAgICAgIHRlbXBbbGVuXSA9ICdcMCc7Ci0gICAgICBob21lZGlyID0gdGlsZGVfZXhwYW5kICh0ZW1wKTsKLSAgICAgIGZyZWUgKHRlbXApOwotCi0gICAgICBfcmxfcmVwbGFjZV90ZXh0IChob21lZGlyLCBzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyoJCQkJCQkJCSAgICAqLwotLyoJCQlTdHJpbmcgVXRpbGl0eSBGdW5jdGlvbnMJCSAgICAqLwotLyoJCQkJCQkJCSAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBEZXRlcm1pbmUgaWYgczIgb2NjdXJzIGluIHMxLiAgSWYgc28sIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCi0gICBtYXRjaCBpbiBzMS4gIFRoZSBjb21wYXJlIGlzIGNhc2UgaW5zZW5zaXRpdmUuICovCi1jaGFyICoKLV9ybF9zdHJpbmRleCAoczEsIHMyKQotICAgICByZWdpc3RlciBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBpbnQgaSwgbCwgbGVuOwotCi0gIGZvciAoaSA9IDAsIGwgPSBzdHJsZW4gKHMyKSwgbGVuID0gc3RybGVuIChzMSk7IChsZW4gLSBpKSA+PSBsOyBpKyspCi0gICAgaWYgKF9ybF9zdHJuaWNtcCAoczEgKyBpLCBzMiwgbCkgPT0gMCkKLSAgICAgIHJldHVybiAoczEgKyBpKTsKLSAgcmV0dXJuICgoY2hhciAqKU5VTEwpOwotfQotCi0jaWYgIWRlZmluZWQgKEhBVkVfU1RSQ0FTRUNNUCkKLS8qIENvbXBhcmUgYXQgbW9zdCBDT1VOVCBjaGFyYWN0ZXJzIGZyb20gc3RyaW5nMSB0byBzdHJpbmcyLiAgQ2FzZQotICAgZG9lc24ndCBtYXR0ZXIuICovCi1pbnQKLV9ybF9zdHJuaWNtcCAoc3RyaW5nMSwgc3RyaW5nMiwgY291bnQpCi0gICAgIGNoYXIgKnN0cmluZzEsICpzdHJpbmcyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgY2gxLCBjaDI7Ci0KLSAgd2hpbGUgKGNvdW50KQotICAgIHsKLSAgICAgIGNoMSA9ICpzdHJpbmcxKys7Ci0gICAgICBjaDIgPSAqc3RyaW5nMisrOwotICAgICAgaWYgKF9ybF90b191cHBlcihjaDEpID09IF9ybF90b191cHBlcihjaDIpKQotCWNvdW50LS07Ci0gICAgICBlbHNlCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChjb3VudCk7Ci19Ci0KLS8qIHN0cmNtcCAoKSwgYnV0IGNhc2VsZXNzLiAqLwotaW50Ci1fcmxfc3RyaWNtcCAoc3RyaW5nMSwgc3RyaW5nMikKLSAgICAgY2hhciAqc3RyaW5nMSwgKnN0cmluZzI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgY2gxLCBjaDI7Ci0KLSAgd2hpbGUgKCpzdHJpbmcxICYmICpzdHJpbmcyKQotICAgIHsKLSAgICAgIGNoMSA9ICpzdHJpbmcxKys7Ci0gICAgICBjaDIgPSAqc3RyaW5nMisrOwotICAgICAgaWYgKF9ybF90b191cHBlcihjaDEpICE9IF9ybF90b191cHBlcihjaDIpKQotCXJldHVybiAoMSk7Ci0gICAgfQotICByZXR1cm4gKCpzdHJpbmcxIC0gKnN0cmluZzIpOwotfQotI2VuZGlmIC8qICFIQVZFX1NUUkNBU0VDTVAgKi8KLQotLyogU3R1cGlkIGNvbXBhcmlzb24gcm91dGluZSBmb3IgcXNvcnQgKCkgaW5nIHN0cmluZ3MuICovCi1pbnQKLV9ybF9xc29ydF9zdHJpbmdfY29tcGFyZSAoczEsIHMyKQotICBjaGFyICoqczEsICoqczI7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TVFJDT0xMKQotICByZXR1cm4gKHN0cmNvbGwgKCpzMSwgKnMyKSk7Ci0jZWxzZQotICBpbnQgcmVzdWx0OwotCi0gIHJlc3VsdCA9ICoqczEgLSAqKnMyOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgcmVzdWx0ID0gc3RyY21wICgqczEsICpzMik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotfQotCi0vKiBGdW5jdGlvbiBlcXVpdmFsZW50cyBmb3IgdGhlIG1hY3JvcyBkZWZpbmVkIGluIGNoYXJ0eXBlcy5oLiAqLwotI3VuZGVmIF9ybF91cHBlcmNhc2VfcAotaW50Ci1fcmxfdXBwZXJjYXNlX3AgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzdXBwZXIgKGMpKTsKLX0KLQotI3VuZGVmIF9ybF9sb3dlcmNhc2VfcAotaW50Ci1fcmxfbG93ZXJjYXNlX3AgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzbG93ZXIgKGMpKTsKLX0KLQotI3VuZGVmIF9ybF9wdXJlX2FscGhhYmV0aWMKLWludAotX3JsX3B1cmVfYWxwaGFiZXRpYyAoYykKLSAgICAgaW50IGM7Ci17Ci0gIHJldHVybiAoaXN1cHBlciAoYykgfHwgaXNsb3dlciAoYykpOwotfQotCi0jdW5kZWYgX3JsX2RpZ2l0X3AKLWludAotX3JsX2RpZ2l0X3AgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzZGlnaXQgKGMpKTsKLX0KLQotI3VuZGVmIF9ybF90b19sb3dlcgotaW50Ci1fcmxfdG9fbG93ZXIgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzdXBwZXIgKGMpID8gdG9sb3dlciAoYykgOiBjKTsKLX0KLQotI3VuZGVmIF9ybF90b191cHBlcgotaW50Ci1fcmxfdG9fdXBwZXIgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzbG93ZXIgKGMpID8gdG91cHBlciAoYykgOiBjKTsKLX0KLQotI3VuZGVmIF9ybF9kaWdpdF92YWx1ZQotaW50Ci1fcmxfZGlnaXRfdmFsdWUgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKGlzZGlnaXQgKGMpID8gYyAtICcwJyA6IGMpOwotfQotCi0vKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgbm93IHRoYXQgc2F2ZXN0cmluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20KLSAgIGFsbCBgcHVibGljJyByZWFkbGluZSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgX3JsX3NhdmVzdHJpbmcKLWNoYXIgKgotX3JsX3NhdmVzdHJpbmcgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiAoKGNoYXIgKilzdHJjcHkgKHhtYWxsb2MgKDEgKyAoaW50KXN0cmxlbiAocykpLCAocykpKTsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3ZpX2tleW1hcC5jIGIvcmVhZGxpbmUvdmlfa2V5bWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTI5YTMuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvdmlfa2V5bWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzcgKzAsMCBAQAotLyogdmlfa2V5bWFwLmMgLS0gdGhlIGtleW1hcCBmb3IgdmlfbW9kZSBpbiByZWFkbGluZSAoKS4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmICFkZWZpbmVkIChCVUZTSVopCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZiAvKiAhQlVGU0laICovCi0KLSNpbmNsdWRlICJyZWFkbGluZS5oIgotCi0jaWYgMAotZXh0ZXJuIEtFWU1BUF9FTlRSWV9BUlJBWSB2aV9lc2NhcGVfa2V5bWFwOwotI2VuZGlmCi0KLS8qIFRoZSBrZXltYXAgYXJyYXlzIGZvciBoYW5kbGluZyB2aSBtb2RlLiAqLwotS0VZTUFQX0VOVFJZX0FSUkFZIHZpX21vdmVtZW50X2tleW1hcCA9IHsKLSAgLyogVGhlIHJlZ3VsYXIgY29udHJvbCBrZXlzIGNvbWUgZmlyc3QuICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtQCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWEgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1iICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtYyAqLwotICB7IElTRlVOQywgcmxfdmlfZW9mX21heWJlIH0sCQkvKiBDb250cm9sLWQgKi8KLSAgeyBJU0ZVTkMsIHJsX2VtYWNzX2VkaXRpbmdfbW9kZSB9LAkvKiBDb250cm9sLWUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1mICovCi0gIHsgSVNGVU5DLCBybF9hYm9ydCB9LAkJCS8qIENvbnRyb2wtZyAqLwotICB7IElTRlVOQywgcmxfYmFja3dhcmQgfSwJCS8qIENvbnRyb2wtaCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWkgKi8KLSAgeyBJU0ZVTkMsIHJsX25ld2xpbmUgfSwJCS8qIENvbnRyb2wtaiAqLwotICB7IElTRlVOQywgcmxfa2lsbF9saW5lIH0sCQkvKiBDb250cm9sLWsgKi8KLSAgeyBJU0ZVTkMsIHJsX2NsZWFyX3NjcmVlbiB9LAkJLyogQ29udHJvbC1sICovCi0gIHsgSVNGVU5DLCBybF9uZXdsaW5lIH0sCQkvKiBDb250cm9sLW0gKi8KLSAgeyBJU0ZVTkMsIHJsX2dldF9uZXh0X2hpc3RvcnkgfSwJLyogQ29udHJvbC1uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtbyAqLwotICB7IElTRlVOQywgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkgfSwJLyogQ29udHJvbC1wICovCi0gIHsgSVNGVU5DLCBybF9xdW90ZWRfaW5zZXJ0IH0sCQkvKiBDb250cm9sLXEgKi8KLSAgeyBJU0ZVTkMsIHJsX3JldmVyc2Vfc2VhcmNoX2hpc3RvcnkgfSwgLyogQ29udHJvbC1yICovCi0gIHsgSVNGVU5DLCBybF9mb3J3YXJkX3NlYXJjaF9oaXN0b3J5IH0sIC8qIENvbnRyb2wtcyAqLwotICB7IElTRlVOQywgcmxfdHJhbnNwb3NlX2NoYXJzIH0sCS8qIENvbnRyb2wtdCAqLwotICB7IElTRlVOQywgcmxfdW5peF9saW5lX2Rpc2NhcmQgfSwJLyogQ29udHJvbC11ICovCi0gIHsgSVNGVU5DLCBybF9xdW90ZWRfaW5zZXJ0IH0sCQkvKiBDb250cm9sLXYgKi8KLSAgeyBJU0ZVTkMsIHJsX3VuaXhfd29yZF9ydWJvdXQgfSwJLyogQ29udHJvbC13ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wteCAqLwotICB7IElTRlVOQywgcmxfeWFuayB9LAkJCS8qIENvbnRyb2wteSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXogKi8KLQotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLVsgKi8JLyogdmlfZXNjYXBlX2tleW1hcCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLVwgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1dICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtXiAqLwotICB7IElTRlVOQywgcmxfdmlfdW5kbyB9LAkJLyogQ29udHJvbC1fICovCi0KLSAgLyogVGhlIHN0YXJ0IG9mIHByaW50aW5nIGNoYXJhY3RlcnMuICovCi0gIHsgSVNGVU5DLCBybF9mb3J3YXJkIH0sCQkvKiBTUEFDRSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAhICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydF9jb21tZW50IH0sCS8qICMgKi8KLSAgeyBJU0ZVTkMsIHJsX2VuZF9vZl9saW5lIH0sCQkvKiAkICovCi0gIHsgSVNGVU5DLCBybF92aV9tYXRjaCB9LAkJLyogJSAqLwotICB7IElTRlVOQywgcmxfdmlfdGlsZGVfZXhwYW5kIH0sCS8qICYgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogJyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAoICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICkgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NvbXBsZXRlIH0sCQkvKiAqICovCi0gIHsgSVNGVU5DLCBybF9nZXRfbmV4dF9oaXN0b3J5fSwJLyogKyAqLwotICB7IElTRlVOQywgcmxfdmlfY2hhcl9zZWFyY2ggfSwJLyogLCAqLwotICB7IElTRlVOQywgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkgfSwJLyogLSAqLwotICB7IElTRlVOQywgcmxfdmlfcmVkbyB9LAkJLyogLiAqLwotICB7IElTRlVOQywgcmxfdmlfc2VhcmNoIH0sCQkvKiAvICovCi0KLSAgLyogUmVndWxhciBkaWdpdHMuICovCi0gIHsgSVNGVU5DLCBybF9iZWdfb2ZfbGluZSB9LAkJLyogMCAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiAxICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDIgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogMyAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiA0ICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDUgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogNiAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiA3ICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDggKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogOSAqLwotCi0gIC8qIEEgbGl0dGxlIG1vcmUgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIDogKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NoYXJfc2VhcmNoIH0sCS8qIDsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogPCAqLwotICB7IElTRlVOQywgcmxfdmlfY29tcGxldGUgfSwJCS8qID0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogPiAqLwotICB7IElTRlVOQywgcmxfdmlfc2VhcmNoIH0sCQkvKiA/ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIEAgKi8KLQotICAvKiBVcHBlcmNhc2UgYWxwaGFiZXQuICovCi0gIHsgSVNGVU5DLCBybF92aV9hcHBlbmRfZW9sIH0sCQkvKiBBICovCi0gIHsgSVNGVU5DLCBybF92aV9wcmV2X3dvcmR9LAkJLyogQiAqLwotICB7IElTRlVOQywgcmxfdmlfY2hhbmdlX3RvIH0sCQkvKiBDICovCi0gIHsgSVNGVU5DLCBybF92aV9kZWxldGVfdG8gfSwJCS8qIEQgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2VuZF93b3JkIH0sCQkvKiBFICovCi0gIHsgSVNGVU5DLCBybF92aV9jaGFyX3NlYXJjaCB9LAkvKiBGICovCi0gIHsgSVNGVU5DLCBybF92aV9mZXRjaF9oaXN0b3J5IH0sCS8qIEcgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogSCAqLwotICB7IElTRlVOQywgcmxfdmlfaW5zZXJ0X2JlZyB9LAkJLyogSSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBKICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIEsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogTCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBNICovCi0gIHsgSVNGVU5DLCBybF92aV9zZWFyY2hfYWdhaW4gfSwJLyogTiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBPICovCi0gIHsgSVNGVU5DLCBybF92aV9wdXQgfSwJCS8qIFAgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogUSAqLwotICB7IElTRlVOQywgcmxfdmlfcmVwbGFjZSB9LAkJLyogUiAqLwotICB7IElTRlVOQywgcmxfdmlfc3Vic3QgfSwJCS8qIFMgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NoYXJfc2VhcmNoIH0sCS8qIFQgKi8KLSAgeyBJU0ZVTkMsIHJsX3JldmVydF9saW5lIH0sCQkvKiBVICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIFYgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX25leHRfd29yZCB9LAkJLyogVyAqLwotICB7IElTRlVOQywgcmxfcnVib3V0IH0sCQkvKiBYICovCi0gIHsgSVNGVU5DLCBybF92aV95YW5rX3RvIH0sCQkvKiBZICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIFogKi8KLQotICAvKiBTb21lIG1vcmUgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIFsgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NvbXBsZXRlIH0sCQkvKiBcICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIF0gKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2ZpcnN0X3ByaW50IH0sCS8qIF4gKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX3lhbmtfYXJnIH0sCQkvKiBfICovCi0gIHsgSVNGVU5DLCBybF92aV9nb3RvX21hcmsgfSwJCS8qIGAgKi8KLQotICAvKiBMb3dlcmNhc2UgYWxwaGFiZXQuICovCi0gIHsgSVNGVU5DLCBybF92aV9hcHBlbmRfbW9kZSB9LAkvKiBhICovCi0gIHsgSVNGVU5DLCBybF92aV9wcmV2X3dvcmQgfSwJCS8qIGIgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NoYW5nZV90byB9LAkJLyogYyAqLwotICB7IElTRlVOQywgcmxfdmlfZGVsZXRlX3RvIH0sCQkvKiBkICovCi0gIHsgSVNGVU5DLCBybF92aV9lbmRfd29yZCB9LAkJLyogZSAqLwotICB7IElTRlVOQywgcmxfdmlfY2hhcl9zZWFyY2ggfSwJLyogZiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBnICovCi0gIHsgSVNGVU5DLCBybF9iYWNrd2FyZCB9LAkJLyogaCAqLwotICB7IElTRlVOQywgcmxfdmlfaW5zZXJ0aW9uX21vZGUgfSwJLyogaSAqLwotICB7IElTRlVOQywgcmxfZ2V0X25leHRfaGlzdG9yeSB9LAkvKiBqICovCi0gIHsgSVNGVU5DLCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSB9LAkvKiBrICovCi0gIHsgSVNGVU5DLCBybF9mb3J3YXJkIH0sCQkvKiBsICovCi0gIHsgSVNGVU5DLCBybF92aV9zZXRfbWFyayB9LAkJLyogbSAqLwotICB7IElTRlVOQywgcmxfdmlfc2VhcmNoX2FnYWluIH0sCS8qIG4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogbyAqLwotICB7IElTRlVOQywgcmxfdmlfcHV0IH0sCQkvKiBwICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHEgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NoYW5nZV9jaGFyIH0sCS8qIHIgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX3N1YnN0IH0sCQkvKiBzICovCi0gIHsgSVNGVU5DLCBybF92aV9jaGFyX3NlYXJjaCB9LAkvKiB0ICovCi0gIHsgSVNGVU5DLCBybF92aV91bmRvIH0sCQkvKiB1ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHYgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX25leHRfd29yZCB9LAkJLyogdyAqLwotICB7IElTRlVOQywgcmxfdmlfZGVsZXRlIH0sCQkvKiB4ICovCi0gIHsgSVNGVU5DLCBybF92aV95YW5rX3RvIH0sCQkvKiB5ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHogKi8KLQotICAvKiBGaW5hbCBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogeyAqLwotICB7IElTRlVOQywgcmxfdmlfY29sdW1uIH0sCQkvKiB8ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIH0gKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2NoYW5nZV9jYXNlIH0sCS8qIH4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogUlVCT1VUICovCi0KLSNpZiBLRVlNQVBfU0laRSA+IDEyOAotICAvKiBVbmRlZmluZWQga2V5cy4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0KLSNlbmRpZiAvKiBLRVlNQVBfU0laRSA+IDEyOCAqLwotfTsKLQotCi1LRVlNQVBfRU5UUllfQVJSQVkgdmlfaW5zZXJ0aW9uX2tleW1hcCA9IHsKLSAgLyogVGhlIHJlZ3VsYXIgY29udHJvbCBrZXlzIGNvbWUgZmlyc3QuICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtQCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBDb250cm9sLWEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC1iICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtYyAqLwotICB7IElTRlVOQywgcmxfdmlfZW9mX21heWJlIH0sCQkvKiBDb250cm9sLWQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC1lICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtZiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBDb250cm9sLWcgKi8KLSAgeyBJU0ZVTkMsIHJsX3J1Ym91dCB9LAkJLyogQ29udHJvbC1oICovCi0gIHsgSVNGVU5DLCBybF9jb21wbGV0ZSB9LAkJLyogQ29udHJvbC1pICovCi0gIHsgSVNGVU5DLCBybF9uZXdsaW5lIH0sCQkvKiBDb250cm9sLWogKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC1rICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtbCAqLwotICB7IElTRlVOQywgcmxfbmV3bGluZSB9LAkJLyogQ29udHJvbC1tICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBDb250cm9sLW8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC1wICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtcSAqLwotICB7IElTRlVOQywgcmxfcmV2ZXJzZV9zZWFyY2hfaGlzdG9yeSB9LCAvKiBDb250cm9sLXIgKi8KLSAgeyBJU0ZVTkMsIHJsX2ZvcndhcmRfc2VhcmNoX2hpc3RvcnkgfSwgLyogQ29udHJvbC1zICovCi0gIHsgSVNGVU5DLCBybF90cmFuc3Bvc2VfY2hhcnMgfSwJLyogQ29udHJvbC10ICovCi0gIHsgSVNGVU5DLCBybF91bml4X2xpbmVfZGlzY2FyZCB9LAkvKiBDb250cm9sLXUgKi8KLSAgeyBJU0ZVTkMsIHJsX3F1b3RlZF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtdiAqLwotICB7IElTRlVOQywgcmxfdW5peF93b3JkX3J1Ym91dCB9LAkvKiBDb250cm9sLXcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC14ICovCi0gIHsgSVNGVU5DLCBybF95YW5rIH0sCQkJLyogQ29udHJvbC15ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wteiAqLwotCi0gIHsgSVNGVU5DLCBybF92aV9tb3ZlbWVudF9tb2RlIH0sCS8qIENvbnRyb2wtWyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBDb250cm9sLVwgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQ29udHJvbC1dICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIENvbnRyb2wtXiAqLwotICB7IElTRlVOQywgcmxfdmlfdW5kbyB9LAkJLyogQ29udHJvbC1fICovCi0KLSAgLyogVGhlIHN0YXJ0IG9mIHByaW50aW5nIGNoYXJhY3RlcnMuICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFNQQUNFICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qICEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogIiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiAjICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qICQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogJSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiAmICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qICcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogKCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiApICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qICogKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogKyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiAsICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIC0gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiAvICovCi0KLSAgLyogUmVndWxhciBkaWdpdHMuICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIDAgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogMSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiAyICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIDMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogNCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiA1ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIDYgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogNyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiA4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIDkgKi8KLQotICAvKiBBIGxpdHRsZSBtb3JlIHB1bmN0dWF0aW9uLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiA6ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIDsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogPCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiA9ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qID4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBAICovCi0KLSAgLyogVXBwZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBBICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIEIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogQyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBEICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIEUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogRiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBHICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIEggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogSSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBKICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIEsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogTCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBNICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIE4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogTyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBQICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogUiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBTICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogVSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBWICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogWCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBZICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFogKi8KLQotICAvKiBTb21lIG1vcmUgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIFsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogXCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBdICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIF4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogXyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBgICovCi0KLSAgLyogTG93ZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBhICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIGIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogYyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBkICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogZiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBnICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIGggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogaSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBqICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIGsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogbCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBtICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIG4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogbyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBwICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIHEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogciAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiBzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIHQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogdSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiB2ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIHcgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogeCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiB5ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIHogKi8KLQotICAvKiBGaW5hbCBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogeyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCQkvKiB8ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJCS8qIH0gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkJLyogfiAqLwotICB7IElTRlVOQywgcmxfcnVib3V0IH0sCQkvKiBSVUJPVVQgKi8KLQotI2lmIEtFWU1BUF9TSVpFID4gMTI4Ci0gIC8qIFB1cmUgOC1iaXQgY2hhcmFjdGVycyAoMTI4IC0gMTU5KS4KLSAgICAgVGhlc2UgbWlnaHQgYmUgdXNlZCBpbiBzb21lCi0gICAgIGNoYXJhY3RlciBzZXRzLiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogPyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qID8gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiA/ICovCi0KLSAgLyogSVNPIExhdGluLTEgY2hhcmFjdGVycyAoMTYwIC0gMjU1KSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE5vLWJyZWFrIHNwYWNlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogSW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyayAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIENlbnQgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFBvdW5kIHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBDdXJyZW5jeSBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogWWVuIHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBCcm9rZW4gYmFyICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogU2VjdGlvbiBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogRGlhZXJlc2lzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogQ29weXJpZ2h0IHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBGZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExlZnQgcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTm90IHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBTb2Z0IGh5cGhlbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIFJlZ2lzdGVyZWQgc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE1hY3JvbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIERlZ3JlZSBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogUGx1cy1taW51cyBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogU3VwZXJzY3JpcHQgdHdvICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogU3VwZXJzY3JpcHQgdGhyZWUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBBY3V0ZSBhY2NlbnQgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBNaWNybyBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogUGlsY3JvdyBzaWduICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTWlkZGxlIGRvdCAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIENlZGlsbGEgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBTdXBlcnNjcmlwdCBvbmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBNYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBSaWdodCBwb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBWdWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBWdWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBWdWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBJbnZlcnRlZCBxdWVzdGlvbmsgbWFyayAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgYSB3aXRoIHRpbGRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgYWUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBjIHdpdGggY2VkaWxsYSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGUgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGUgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGkgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGkgd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIGV0aCAoSWNlbGFuZGljKSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG4gd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG8gd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG8gd2l0aCBhY3V0ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIGNhcGl0YWwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgbyB3aXRoIHRpbGRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIE11bHRpcGxpY2F0aW9uIHNpZ24gKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciBvIHdpdGggc3Ryb2tlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgdSB3aXRoIGdyYXZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgdSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBjYXBpdGFsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gY2FwaXRhbCBsZXR0ZXIgdGhvcm4gKEljZWxhbmRpYykgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyAoR2VybWFuKSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGFlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgZXRoIChJY2VsYW5kaWMpICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4ICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogRGl2aXNpb24gc2lnbiAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlICovCi0gIHsgSVNGVU5DLCBybF9pbnNlcnQgfSwJLyogTGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXggKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcyAqLwotICB7IElTRlVOQywgcmxfaW5zZXJ0IH0sCS8qIExhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9LAkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4gKEljZWxhbmRpYykgKi8KLSAgeyBJU0ZVTkMsIHJsX2luc2VydCB9CQkvKiBMYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcyAqLwotI2VuZGlmIC8qIEtFWU1BUF9TSVpFID4gMTI4ICovCi19OwotCi0vKiBVbnVzZWQgZm9yIHRoZSB0aW1lIGJlaW5nLiAqLwotI2lmIDAKLUtFWU1BUF9FTlRSWV9BUlJBWSB2aV9lc2NhcGVfa2V5bWFwID0gewotICAvKiBUaGUgcmVndWxhciBjb250cm9sIGtleXMgY29tZSBmaXJzdC4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1AICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtYSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1jICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtZCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1mICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtZyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLWggKi8KLSAgeyBJU0ZVTkMsIHJsX3RhYl9pbnNlcnR9LAkJLyogQ29udHJvbC1pICovCi0gIHsgSVNGVU5DLCBybF9lbWFjc19lZGl0aW5nX21vZGV9LAkvKiBDb250cm9sLWogKi8KLSAgeyBJU0ZVTkMsIHJsX2tpbGxfbGluZSB9LAkJLyogQ29udHJvbC1rICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtbCAqLwotICB7IElTRlVOQywgcmxfZW1hY3NfZWRpdGluZ19tb2RlfSwJLyogQ29udHJvbC1tICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtbiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLW8gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1wICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtcSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1zICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtdCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC12ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtdyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLXggKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC15ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wteiAqLwotCi0gIHsgSVNGVU5DLCBybF92aV9tb3ZlbWVudF9tb2RlIH0sCS8qIENvbnRyb2wtWyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBDb250cm9sLVwgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogQ29udHJvbC1dICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIENvbnRyb2wtXiAqLwotICB7IElTRlVOQywgcmxfdmlfdW5kbyB9LAkJLyogQ29udHJvbC1fICovCi0KLSAgLyogVGhlIHN0YXJ0IG9mIHByaW50aW5nIGNoYXJhY3RlcnMuICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIFNQQUNFICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICEgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogIiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAjICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICQgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogJSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAmICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICcgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogKCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiApICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qICogKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogKyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAsICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIC0gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiAvICovCi0KLSAgLyogUmVndWxhciBkaWdpdHMuICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDAgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogMSAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiAyICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDMgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogNCAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiA1ICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDYgKi8KLSAgeyBJU0ZVTkMsIHJsX3ZpX2FyZ19kaWdpdCB9LAkJLyogNyAqLwotICB7IElTRlVOQywgcmxfdmlfYXJnX2RpZ2l0IH0sCQkvKiA4ICovCi0gIHsgSVNGVU5DLCBybF92aV9hcmdfZGlnaXQgfSwJCS8qIDkgKi8KLQotICAvKiBBIGxpdHRsZSBtb3JlIHB1bmN0dWF0aW9uLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiA6ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIDsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogPCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiA9ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qID4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogPyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBAICovCi0KLSAgLyogVXBwZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogQyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogRyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogSyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogTyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUiAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogUyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogViAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogVyAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWCAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWSAqLwotICB7IElTRlVOQywgcmxfZG9fbG93ZXJjYXNlX3ZlcnNpb24gfSwJLyogWiAqLwotCi0gIC8qIFNvbWUgbW9yZSBwdW5jdHVhdGlvbi4gKi8KLSAgeyBJU0ZVTkMsIHJsX2Fycm93X2tleXMgfSwJCS8qIFsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogXCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBdICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIF4gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogXyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBgICovCi0KLSAgLyogTG93ZXJjYXNlIGFscGhhYmV0LiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBhICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogYyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBkICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogZiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBnICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGggKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogaSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBqICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIGsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogbCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBtICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIG4gKi8KLSAgeyBJU0ZVTkMsIHJsX2Fycm93X2tleXMgfSwJCS8qIG8gKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogcCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiBxICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHIgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogcyAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB0ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHUgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogdiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB3ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHggKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogeSAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB6ICovCi0KLSAgLyogRmluYWwgcHVuY3R1YXRpb24uICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIHsgKi8KLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAkJLyogfCAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCQkvKiB9ICovCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwJCS8qIH4gKi8KLSAgeyBJU0ZVTkMsIHJsX2JhY2t3YXJkX2tpbGxfd29yZCB9LAkvKiBSVUJPVVQgKi8KLQotI2lmIEtFWU1BUF9TSVpFID4gMTI4Ci0gIC8qIFVuZGVmaW5lZCBrZXlzLiAqLwotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfSwKLSAgeyBJU0ZVTkMsIChGdW5jdGlvbiAqKTB4MCB9LAotICB7IElTRlVOQywgKEZ1bmN0aW9uICopMHgwIH0sCi0gIHsgSVNGVU5DLCAoRnVuY3Rpb24gKikweDAgfQotI2VuZGlmIC8qIEtFWU1BUF9TSVpFID4gMTI4ICovCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9yZWFkbGluZS92aV9tb2RlLmMgYi9yZWFkbGluZS92aV9tb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODY4YmYuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvdmlfbW9kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NSArMCwwIEBACi0vKiB2aV9tb2RlLmMgLS0gQSB2aSBlbXVsYXRpb24gbW9kZSBmb3IgQmFzaC4KLSAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgSmVmZiBTcGFya2VzIChqc3Bhcmtlc0BibnIuY2EpLiAgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFJlYWRsaW5lIExpYnJhcnksIGEgbGlicmFyeSBmb3IKLSAgIHJlYWRpbmcgbGluZXMgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotICAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgUmVhZGxpbmUgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLSAgIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQKLSAgIGlzIGdlbmVyYWxseSBrZXB0IGluIGEgZmlsZSBjYWxsZWQgQ09QWUlORyBvciBMSUNFTlNFLiAgSWYgeW91IGRvIG5vdAotICAgaGF2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLSNkZWZpbmUgUkVBRExJTkVfTElCUkFSWQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKgkJCQkJCQkJICAgICovCi0vKgkJCVZJIEVtdWxhdGlvbiBNb2RlCQkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0jaW5jbHVkZSAicmxjb25mLmgiCi0KLSNpZiBkZWZpbmVkIChWSV9NT0RFKQotCi0jaWYgZGVmaW5lZCAoSEFWRV9DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgKEhBVkVfU1RETElCX0gpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jICBpbmNsdWRlICJhbnNpX3N0ZGxpYi5oIgotI2VuZGlmIC8qIEhBVkVfU1RETElCX0ggKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogU29tZSBzdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmVzLiAqLwotI2luY2x1ZGUgInJsZGVmcy5oIgotI2luY2x1ZGUgInJlYWRsaW5lLmgiCi0jaW5jbHVkZSAiaGlzdG9yeS5oIgotCi0jaWZuZGVmIF9ybF9kaWdpdF9wCi0jZGVmaW5lIF9ybF9kaWdpdF9wKGMpICAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQotI2VuZGlmCi0KLSNpZm5kZWYgX3JsX2RpZ2l0X3ZhbHVlCi0jZGVmaW5lIF9ybF9kaWdpdF92YWx1ZShjKSAoKGMpIC0gJzAnKQotI2VuZGlmCi0KLSNpZm5kZWYgbWVtYmVyCi0jZGVmaW5lIG1lbWJlcihjLCBzKSAoKGMpID8gKGNoYXIgKilzdHJjaHIgKChzKSwgKGMpKSAhPSAoY2hhciAqKU5VTEwgOiAwKQotI2VuZGlmCi0KLSNpZm5kZWYgaXNpZGVudAotI2RlZmluZSBpc2lkZW50KGMpICgoX3JsX3B1cmVfYWxwaGFiZXRpYyAoYykgfHwgX3JsX2RpZ2l0X3AgKGMpIHx8IGMgPT0gJ18nKSkKLSNlbmRpZgotCi0jaWZuZGVmIGV4Y2hhbmdlCi0jZGVmaW5lIGV4Y2hhbmdlKHgsIHkpIGRvIHtpbnQgdGVtcCA9IHg7IHggPSB5OyB5ID0gdGVtcDt9IHdoaWxlICgwKQotI2VuZGlmCi0KLWV4dGVybiBjaGFyICp4bWFsbG9jICgpLCAqeHJlYWxsb2MgKCk7Ci0KLS8qIFZhcmlhYmxlcyBpbXBvcnRlZCBmcm9tIHJlYWRsaW5lLmMgKi8KLWV4dGVybiBpbnQgcmxfcG9pbnQsIHJsX2VuZCwgcmxfbWFyazsKLWV4dGVybiBGSUxFICpybF9pbnN0cmVhbTsKLWV4dGVybiBpbnQgcmxfbGluZV9idWZmZXJfbGVuLCBybF9leHBsaWNpdF9hcmcsIHJsX251bWVyaWNfYXJnOwotZXh0ZXJuIEtleW1hcCBfcmxfa2V5bWFwOwotZXh0ZXJuIGNoYXIgKnJsX3Byb21wdDsKLWV4dGVybiBjaGFyICpybF9saW5lX2J1ZmZlcjsKLWV4dGVybiBpbnQgcmxfYXJnX3NpZ247Ci0KLWV4dGVybiBpbnQgX3JsX2RvaW5nX2FuX3VuZG87Ci1leHRlcm4gaW50IF9ybF91bmRvX2dyb3VwX2xldmVsOwotCi1leHRlcm4gdm9pZCBfcmxfZGlzcGF0Y2ggKCk7Ci1leHRlcm4gaW50IF9ybF9jaGFyX3NlYXJjaF9pbnRlcm5hbCAoKTsKLQotZXh0ZXJuIHZvaWQgcmxfZXh0ZW5kX2xpbmVfYnVmZmVyICgpOwotZXh0ZXJuIGludCBybF92aV9jaGVjayAoKTsKLQotLyogTm9uLXplcm8gbWVhbnMgZW50ZXIgaW5zZXJ0aW9uIG1vZGUuICovCi1zdGF0aWMgaW50IF9ybF92aV9kb2luZ19pbnNlcnQ7Ci0KLS8qIENvbW1hbmQga2V5cyB3aGljaCBkbyBtb3ZlbWVudCBmb3IgeHh4X3RvIGNvbW1hbmRzLiAqLwotc3RhdGljIGNoYXIgKnZpX21vdGlvbiA9ICIgaGxeJDBmdEZ0Oywld2JlV0JFfCI7Ci0KLS8qIEtleW1hcCB1c2VkIGZvciB2aSByZXBsYWNlIGNoYXJhY3RlcnMuICBDcmVhdGVkIGR5bmFtaWNhbGx5IHNpbmNlCi0gICByYXJlbHkgdXNlZC4gKi8KLXN0YXRpYyBLZXltYXAgdmlfcmVwbGFjZV9tYXA7Ci0KLS8qIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbnNlcnRlZCBpbiB0aGUgbGFzdCByZXBsYWNlIG9wZXJhdGlvbi4gKi8KLXN0YXRpYyBpbnQgdmlfcmVwbGFjZV9jb3VudDsKLQotLyogSWYgbm9uLXplcm8sIHdlIGhhdmUgdGV4dCBpbnNlcnRlZCBhZnRlciBhIGNbbW90aW9uXSBjb21tYW5kIHRoYXQgcHV0Ci0gICB1cyBpbXBsaWNpdGx5IGludG8gaW5zZXJ0IG1vZGUuICBTb21lIHBlb3BsZSB3YW50IHRoaXMgdGV4dCB0byBiZQotICAgYXR0YWNoZWQgdG8gdGhlIGNvbW1hbmQgc28gdGhhdCBpdCBpcyBgcmVkb2FibGUnIHdpdGggYC4nLiAqLwotc3RhdGljIGludCB2aV9jb250aW51ZWRfY29tbWFuZDsKLXN0YXRpYyBjaGFyICp2aV9pbnNlcnRfYnVmZmVyOwotc3RhdGljIGludCB2aV9pbnNlcnRfYnVmZmVyX3NpemU7Ci0KLXN0YXRpYyBpbnQgX3JsX3ZpX2xhc3RfY29tbWFuZCA9ICdpJzsJLyogZGVmYXVsdCBgLicgcHV0cyB5b3UgaW4gaW5zZXJ0IG1vZGUgKi8KLXN0YXRpYyBpbnQgX3JsX3ZpX2xhc3RfcmVwZWF0ID0gMTsKLXN0YXRpYyBpbnQgX3JsX3ZpX2xhc3RfYXJnX3NpZ24gPSAxOwotc3RhdGljIGludCBfcmxfdmlfbGFzdF9tb3Rpb247Ci1zdGF0aWMgaW50IF9ybF92aV9sYXN0X3NlYXJjaF9jaGFyOwotc3RhdGljIGludCBfcmxfdmlfbGFzdF9yZXBsYWNlbWVudDsKLQotc3RhdGljIGludCBfcmxfdmlfbGFzdF9rZXlfYmVmb3JlX2luc2VydDsKLQotc3RhdGljIGludCB2aV9yZWRvaW5nOwotCi0vKiBUZXh0IG1vZGlmaWNhdGlvbiBjb21tYW5kcy4gIFRoZXNlIGFyZSB0aGUgYHJlZG9hYmxlJyBjb21tYW5kcy4gKi8KLXN0YXRpYyBjaGFyICp2aV90ZXh0bW9kID0gIl8qXFxBYUlpQ2NEZFBwWXlSclNzWHh+IjsKLQotLyogQXJyYXlzIGZvciB0aGUgc2F2ZWQgbWFya3MuICovCi1zdGF0aWMgaW50IHZpX21hcmtfY2hhcnNbMjddOwotCi1zdGF0aWMgaW50IHJsX2RpZ2l0X2xvb3AxICgpOwotCi12b2lkCi1fcmxfdmlfaW5pdGlhbGl6ZV9saW5lICgpCi17Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHZpX21hcmtfY2hhcnMpIC8gc2l6ZW9mIChpbnQpOyBpKyspCi0gICAgdmlfbWFya19jaGFyc1tpXSA9IC0xOwotfQotCi12b2lkCi1fcmxfdmlfcmVzZXRfbGFzdCAoKQotewotICBfcmxfdmlfbGFzdF9jb21tYW5kID0gJ2knOwotICBfcmxfdmlfbGFzdF9yZXBlYXQgPSAxOwotICBfcmxfdmlfbGFzdF9hcmdfc2lnbiA9IDE7Ci0gIF9ybF92aV9sYXN0X21vdGlvbiA9IDA7Ci19Ci0KLXZvaWQKLV9ybF92aV9zZXRfbGFzdCAoa2V5LCByZXBlYXQsIHNpZ24pCi0gICAgIGludCBrZXksIHJlcGVhdCwgc2lnbjsKLXsKLSAgX3JsX3ZpX2xhc3RfY29tbWFuZCA9IGtleTsKLSAgX3JsX3ZpX2xhc3RfcmVwZWF0ID0gcmVwZWF0OwotICBfcmxfdmlfbGFzdF9hcmdfc2lnbiA9IHNpZ247Ci19Ci0KLS8qIElzIHRoZSBjb21tYW5kIEMgYSBWSSBtb2RlIHRleHQgbW9kaWZpY2F0aW9uIGNvbW1hbmQ/ICovCi1pbnQKLV9ybF92aV90ZXh0bW9kX2NvbW1hbmQgKGMpCi0gICAgIGludCBjOwotewotICByZXR1cm4gKG1lbWJlciAoYywgdmlfdGV4dG1vZCkpOwotfQotCi1zdGF0aWMgdm9pZAotX3JsX3ZpX3N0dWZmX2luc2VydCAoY291bnQpCi0gICAgIGludCBjb3VudDsKLXsKLSAgcmxfYmVnaW5fdW5kb19ncm91cCAoKTsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgcmxfaW5zZXJ0X3RleHQgKHZpX2luc2VydF9idWZmZXIpOwotICBybF9lbmRfdW5kb19ncm91cCAoKTsKLX0KLQotLyogQm91bmQgdG8gYC4nLiAgQ2FsbGVkIGZyb20gY29tbWFuZCBtb2RlLCBzbyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0bwotICAgcmVkbyBhIHRleHQgbW9kaWZpY2F0aW9uIGNvbW1hbmQuICBUaGUgZGVmYXVsdCBmb3IgX3JsX3ZpX2xhc3RfY29tbWFuZAotICAgcHV0cyB5b3UgYmFjayBpbnRvIGluc2VydCBtb2RlLiAqLwotaW50Ci1ybF92aV9yZWRvIChjb3VudCwgYykKLSAgICAgaW50IGNvdW50LCBjOwotewotICBpZiAoIXJsX2V4cGxpY2l0X2FyZykKLSAgICB7Ci0gICAgICBybF9udW1lcmljX2FyZyA9IF9ybF92aV9sYXN0X3JlcGVhdDsKLSAgICAgIHJsX2FyZ19zaWduID0gX3JsX3ZpX2xhc3RfYXJnX3NpZ247Ci0gICAgfQotCi0gIHZpX3JlZG9pbmcgPSAxOwotICAvKiBJZiB3ZSdyZSByZWRvaW5nIGFuIGluc2VydCB3aXRoIGBpJywgc3R1ZmYgaW4gdGhlIGluc2VydGVkIHRleHQKLSAgICAgYW5kIGRvIG5vdCBnbyBpbnRvIGluc2VydGlvbiBtb2RlLiAqLwotICBpZiAoX3JsX3ZpX2xhc3RfY29tbWFuZCA9PSAnaScgJiYgdmlfaW5zZXJ0X2J1ZmZlciAmJiAqdmlfaW5zZXJ0X2J1ZmZlcikKLSAgICB7Ci0gICAgICBfcmxfdmlfc3R1ZmZfaW5zZXJ0IChjb3VudCk7Ci0gICAgICAvKiBBbmQgYmFjayB1cCBwb2ludCBvdmVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbnNlcnRlZC4gKi8KLSAgICAgIGlmIChybF9wb2ludCA+IDApCi0JcmxfcG9pbnQtLTsKLSAgICB9Ci0gIGVsc2UKLSAgICBfcmxfZGlzcGF0Y2ggKF9ybF92aV9sYXN0X2NvbW1hbmQsIF9ybF9rZXltYXApOwotICB2aV9yZWRvaW5nID0gMDsKLQotICByZXR1cm4gKDApOwotfQotCi0vKiBBIHBsYWNlaG9sZGVyIGZvciBmdXJ0aGVyIGV4cGFuc2lvbi4gKi8KLWludAotcmxfdmlfdW5kbyAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJldHVybiAocmxfdW5kb19jb21tYW5kIChjb3VudCwga2V5KSk7Ci19Ci0gICAgCi0vKiBZYW5rIHRoZSBudGggYXJnIGZyb20gdGhlIHByZXZpb3VzIGxpbmUgaW50byB0aGlzIGxpbmUgYXQgcG9pbnQuICovCi1pbnQKLXJsX3ZpX3lhbmtfYXJnIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgLyogUmVhZGxpbmUgdGhpbmtzIHRoYXQgdGhlIGZpcnN0IHdvcmQgb24gYSBsaW5lIGlzIHRoZSAwdGgsIHdoaWxlIHZpCi0gICAgIHRoaW5rcyB0aGUgZmlyc3Qgd29yZCBvbiBhIGxpbmUgaXMgdGhlIDFzdC4gIENvbXBlbnNhdGUuICovCi0gIGlmIChybF9leHBsaWNpdF9hcmcpCi0gICAgcmxfeWFua19udGhfYXJnIChjb3VudCAtIDEsIDApOwotICBlbHNlCi0gICAgcmxfeWFua19udGhfYXJnICgnJCcsIDApOwotCi0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIFdpdGggYW4gYXJndW1lbnQsIG1vdmUgYmFjayB0aGF0IG1hbnkgaGlzdG9yeSBsaW5lcywgZWxzZSBtb3ZlIHRvIHRoZQotICAgYmVnaW5uaW5nIG9mIGhpc3RvcnkuICovCi1pbnQKLXJsX3ZpX2ZldGNoX2hpc3RvcnkgKGNvdW50LCBjKQotICAgICBpbnQgY291bnQsIGM7Ci17Ci0gIGludCB3YW50ZWQ7Ci0KLSAgLyogR2l2aW5nIGFuIGFyZ3VtZW50IG9mIG4gbWVhbnMgd2Ugd2FudCB0aGUgbnRoIGNvbW1hbmQgaW4gdGhlIGhpc3RvcnkKLSAgICAgZmlsZS4gIFRoZSBjb21tYW5kIG51bWJlciBpcyBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgYmFzaAotICAgICBgaGlzdG9yeScgY29tbWFuZCBkb2VzIGl0IC0tIHRoYXQgaXMsIGdpdmluZyBhbiBhcmd1bWVudCBjb3VudCBvZiA0NTAKLSAgICAgdG8gdGhpcyBjb21tYW5kIHdvdWxkIGdldCB0aGUgY29tbWFuZCBsaXN0ZWQgYXMgbnVtYmVyIDQ1MCBpbiB0aGUKLSAgICAgb3V0cHV0IG9mIGBoaXN0b3J5Jy4gKi8KLSAgaWYgKHJsX2V4cGxpY2l0X2FyZykKLSAgICB7Ci0gICAgICB3YW50ZWQgPSBoaXN0b3J5X2Jhc2UgKyB3aGVyZV9oaXN0b3J5ICgpIC0gY291bnQ7Ci0gICAgICBpZiAod2FudGVkIDw9IDApCi0gICAgICAgIHJsX2JlZ2lubmluZ19vZl9oaXN0b3J5ICgwLCAwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkgKHdhbnRlZCwgYyk7Ci0gICAgfQotICBlbHNlCi0gICAgcmxfYmVnaW5uaW5nX29mX2hpc3RvcnkgKGNvdW50LCAwKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogU2VhcmNoIGFnYWluIGZvciB0aGUgbGFzdCB0aGluZyBzZWFyY2hlZCBmb3IuICovCi1pbnQKLXJsX3ZpX3NlYXJjaF9hZ2FpbiAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICduJzoKLSAgICAgIHJsX25vbmluY19yZXZlcnNlX3NlYXJjaF9hZ2FpbiAoY291bnQsIGtleSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ04nOgotICAgICAgcmxfbm9uaW5jX2ZvcndhcmRfc2VhcmNoX2FnYWluIChjb3VudCwga2V5KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogRG8gYSB2aSBzdHlsZSBzZWFyY2guICovCi1pbnQKLXJsX3ZpX3NlYXJjaCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICc/JzoKLSAgICAgIHJsX25vbmluY19mb3J3YXJkX3NlYXJjaCAoY291bnQsIGtleSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy8nOgotICAgICAgcmxfbm9uaW5jX3JldmVyc2Vfc2VhcmNoIChjb3VudCwga2V5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGRpbmcgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIENvbXBsZXRpb24sIGZyb20gdmkncyBwb2ludCBvZiB2aWV3LiAqLwotaW50Ci1ybF92aV9jb21wbGV0ZSAoaWdub3JlLCBrZXkpCi0gICAgIGludCBpZ25vcmUsIGtleTsKLXsKLSAgaWYgKChybF9wb2ludCA8IHJsX2VuZCkgJiYgKCF3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKSkKLSAgICB7Ci0gICAgICBpZiAoIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50ICsgMV0pKQotCXJsX3ZpX2VuZF93b3JkICgxLCAnRScpOwotICAgICAgcmxfcG9pbnQrKzsKLSAgICB9Ci0KLSAgaWYgKGtleSA9PSAnKicpCi0gICAgcmxfY29tcGxldGVfaW50ZXJuYWwgKCcqJyk7CS8qIEV4cGFuc2lvbiBhbmQgcmVwbGFjZW1lbnQuICovCi0gIGVsc2UgaWYgKGtleSA9PSAnPScpCi0gICAgcmxfY29tcGxldGVfaW50ZXJuYWwgKCc/Jyk7CS8qIExpc3QgcG9zc2libGUgY29tcGxldGlvbnMuICovCi0gIGVsc2UgaWYgKGtleSA9PSAnXFwnKQotICAgIHJsX2NvbXBsZXRlX2ludGVybmFsIChUQUIpOwkvKiBTdGFuZGFyZCBSZWFkbGluZSBjb21wbGV0aW9uLiAqLwotICBlbHNlCi0gICAgcmxfY29tcGxldGUgKDAsIGtleSk7Ci0KLSAgaWYgKGtleSA9PSAnKicgfHwga2V5ID09ICdcXCcpCi0gICAgewotICAgICAgX3JsX3ZpX3NldF9sYXN0IChrZXksIDEsIHJsX2FyZ19zaWduKTsKLSAgICAgIHJsX3ZpX2luc2VydGlvbl9tb2RlICgxLCBrZXkpOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogVGlsZGUgZXhwYW5zaW9uIGZvciB2aSBtb2RlLiAqLwotaW50Ci1ybF92aV90aWxkZV9leHBhbmQgKGlnbm9yZSwga2V5KQotICAgICBpbnQgaWdub3JlLCBrZXk7Ci17Ci0gIHJsX3RpbGRlX2V4cGFuZCAoMCwga2V5KTsKLSAgX3JsX3ZpX3NldF9sYXN0IChrZXksIDEsIHJsX2FyZ19zaWduKTsJLyogWFhYICovCi0gIHJsX3ZpX2luc2VydGlvbl9tb2RlICgxLCBrZXkpOwotICByZXR1cm4gKDApOwotfQotCi0vKiBQcmV2aW91cyB3b3JkIGluIHZpIG1vZGUuICovCi1pbnQKLXJsX3ZpX3ByZXZfd29yZCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChjb3VudCA8IDApCi0gICAgcmV0dXJuIChybF92aV9uZXh0X3dvcmQgKC1jb3VudCwga2V5KSk7Ci0KLSAgaWYgKHJsX3BvaW50ID09IDApCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIGlmIChfcmxfdXBwZXJjYXNlX3AgKGtleSkpCi0gICAgcmxfdmlfYldvcmQgKGNvdW50LCBrZXkpOwotICBlbHNlCi0gICAgcmxfdmlfYndvcmQgKGNvdW50LCBrZXkpOwotCi0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIE5leHQgd29yZCBpbiB2aSBtb2RlLiAqLwotaW50Ci1ybF92aV9uZXh0X3dvcmQgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAoY291bnQgPCAwKQotICAgIHJldHVybiAocmxfdmlfcHJldl93b3JkICgtY291bnQsIGtleSkpOwotCi0gIGlmIChybF9wb2ludCA+PSAocmxfZW5kIC0gMSkpCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIGlmIChfcmxfdXBwZXJjYXNlX3AgKGtleSkpCi0gICAgcmxfdmlfZldvcmQgKGNvdW50LCBrZXkpOwotICBlbHNlCi0gICAgcmxfdmlfZndvcmQgKGNvdW50LCBrZXkpOwotICByZXR1cm4gKDApOwotfQotCi0vKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlID9uZXh0PyB3b3JkLiAqLwotaW50Ci1ybF92aV9lbmRfd29yZCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChjb3VudCA8IDApCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKF9ybF91cHBlcmNhc2VfcCAoa2V5KSkKLSAgICBybF92aV9lV29yZCAoY291bnQsIGtleSk7Ci0gIGVsc2UKLSAgICBybF92aV9ld29yZCAoY291bnQsIGtleSk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIE1vdmUgZm9yd2FyZCBhIHdvcmQgdGhlIHdheSB0aGF0ICdXJyBkb2VzLiAqLwotaW50Ci1ybF92aV9mV29yZCAoY291bnQsIGlnbm9yZSkKLSAgICAgaW50IGNvdW50LCBpZ25vcmU7Ci17Ci0gIHdoaWxlIChjb3VudC0tICYmIHJsX3BvaW50IDwgKHJsX2VuZCAtIDEpKQotICAgIHsKLSAgICAgIC8qIFNraXAgdW50aWwgd2hpdGVzcGFjZS4gKi8KLSAgICAgIHdoaWxlICghd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSAmJiBybF9wb2ludCA8IHJsX2VuZCkKLQlybF9wb2ludCsrOwotCi0gICAgICAvKiBOb3cgc2tpcCB3aGl0ZXNwYWNlLiAqLwotICAgICAgd2hpbGUgKHdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYgcmxfcG9pbnQgPCBybF9lbmQpCi0JcmxfcG9pbnQrKzsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfYldvcmQgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICB3aGlsZSAoY291bnQtLSAmJiBybF9wb2ludCA+IDApCi0gICAgewotICAgICAgLyogSWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIHdvcmQsIG1vdmUgYmFjayB0byB3aGl0ZXNwYWNlIHNvCi0JIHdlIHdpbGwgZ28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIHdvcmQuICovCi0gICAgICBpZiAoIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYKLQkgIHdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50IC0gMV0pKQotCXJsX3BvaW50LS07Ci0KLSAgICAgIHdoaWxlIChybF9wb2ludCA+IDAgJiYgd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQlybF9wb2ludC0tOwotCi0gICAgICBpZiAocmxfcG9pbnQgPiAwKQotCXsKLQkgIHdoaWxlICgtLXJsX3BvaW50ID49IDAgJiYgIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpOwotCSAgcmxfcG9pbnQrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2VXb3JkIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgd2hpbGUgKGNvdW50LS0gJiYgcmxfcG9pbnQgPCAocmxfZW5kIC0gMSkpCi0gICAgewotICAgICAgaWYgKCF3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKQotCXJsX3BvaW50Kys7Ci0KLSAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyICh0byB0aGUgc3RhcnQgb2YgdGhlCi0JIG5leHQgd29yZCkuICovCi0gICAgICB3aGlsZSAoKytybF9wb2ludCA8IHJsX2VuZCAmJiB3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKTsKLQotICAgICAgaWYgKHJsX3BvaW50ICYmIHJsX3BvaW50IDwgcmxfZW5kKQotCXsKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gKi8KLQkgIHdoaWxlIChybF9wb2ludCA8IHJsX2VuZCAmJiB3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKQotCSAgICBybF9wb2ludCsrOwotCi0JICAvKiBTa2lwIHVudGlsIHdoaXRlc3BhY2UuICovCi0JICB3aGlsZSAocmxfcG9pbnQgPCBybF9lbmQgJiYgIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpCi0JICAgIHJsX3BvaW50Kys7Ci0KLQkgIC8qIE1vdmUgYmFjayB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHdvcmQuICovCi0JICBybF9wb2ludC0tOwotCX0KLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfZndvcmQgKGNvdW50LCBpZ25vcmUpCi0gICAgIGludCBjb3VudCwgaWdub3JlOwotewotICB3aGlsZSAoY291bnQtLSAmJiBybF9wb2ludCA8IChybF9lbmQgLSAxKSkKLSAgICB7Ci0gICAgICAvKiBNb3ZlIHRvIHdoaXRlIHNwYWNlIChyZWFsbHkgbm9uLWlkZW50aWZlcikuICovCi0gICAgICBpZiAoaXNpZGVudCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQl7Ci0JICB3aGlsZSAoaXNpZGVudCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSAmJiBybF9wb2ludCA8IHJsX2VuZCkKLQkgICAgcmxfcG9pbnQrKzsKLQl9Ci0gICAgICBlbHNlIC8qIGlmICghd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkgKi8KLQl7Ci0JICB3aGlsZSAoIWlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYKLQkJICF3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pICYmIHJsX3BvaW50IDwgcmxfZW5kKQotCSAgICBybF9wb2ludCsrOwotCX0KLQotICAgICAgLyogTW92ZSBwYXN0IHdoaXRlc3BhY2UuICovCi0gICAgICB3aGlsZSAod2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSAmJiBybF9wb2ludCA8IHJsX2VuZCkKLQlybF9wb2ludCsrOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9id29yZCAoY291bnQsIGlnbm9yZSkKLSAgICAgaW50IGNvdW50LCBpZ25vcmU7Ci17Ci0gIHdoaWxlIChjb3VudC0tICYmIHJsX3BvaW50ID4gMCkKLSAgICB7Ci0gICAgICBpbnQgbGFzdF9pc19pZGVudDsKLQotICAgICAgLyogSWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIHdvcmQsIG1vdmUgYmFjayB0byB3aGl0ZXNwYWNlCi0JIHNvIHdlIHdpbGwgZ28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIHdvcmQuICovCi0gICAgICBpZiAoIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYKLQkgIHdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50IC0gMV0pKQotCXJsX3BvaW50LS07Ci0KLSAgICAgIC8qIElmIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGFyZSBgb3Bwb3NpdGUnLCBtb3ZlCi0JIGJhY2sgc28gd2UgZG9uJ3QgZ2V0IG1lc3NlZCB1cCBieSB0aGUgcmxfcG9pbnQrKyBkb3duIHRoZXJlIGluCi0JIHRoZSB3aGlsZSBsb29wLiAgV2l0aG91dCB0aGlzIGNvZGUsIHdvcmRzIGxpa2UgYGw7JyBzY3JldyB1cCB0aGUKLQkgZnVuY3Rpb24uICovCi0gICAgICBsYXN0X2lzX2lkZW50ID0gaXNpZGVudCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnQgLSAxXSk7Ci0gICAgICBpZiAoKGlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYgIWxhc3RfaXNfaWRlbnQpIHx8Ci0JICAoIWlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYgbGFzdF9pc19pZGVudCkpCi0JcmxfcG9pbnQtLTsKLQotICAgICAgd2hpbGUgKHJsX3BvaW50ID4gMCAmJiB3aGl0ZXNwYWNlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKQotCXJsX3BvaW50LS07Ci0KLSAgICAgIGlmIChybF9wb2ludCA+IDApCi0JewotCSAgaWYgKGlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpCi0JICAgIHdoaWxlICgtLXJsX3BvaW50ID49IDAgJiYgaXNpZGVudCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSk7Ci0JICBlbHNlCi0JICAgIHdoaWxlICgtLXJsX3BvaW50ID49IDAgJiYgIWlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkgJiYKLQkJICAgIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpOwotCSAgcmxfcG9pbnQrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2V3b3JkIChjb3VudCwgaWdub3JlKQotICAgICBpbnQgY291bnQsIGlnbm9yZTsKLXsKLSAgd2hpbGUgKGNvdW50LS0gJiYgcmxfcG9pbnQgPCBybF9lbmQgLSAxKQotICAgIHsKLSAgICAgIGlmICghd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQlybF9wb2ludCsrOwotCi0gICAgICB3aGlsZSAocmxfcG9pbnQgPCBybF9lbmQgJiYgd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQlybF9wb2ludCsrOwotCi0gICAgICBpZiAocmxfcG9pbnQgPCBybF9lbmQpCi0JewotCSAgaWYgKGlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpCi0JICAgIHdoaWxlICgrK3JsX3BvaW50IDwgcmxfZW5kICYmIGlzaWRlbnQgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpOwotCSAgZWxzZQotCSAgICB3aGlsZSAoKytybF9wb2ludCA8IHJsX2VuZCAmJiAhaXNpZGVudCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKQotCQkgICAmJiAhd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSk7Ci0JfQotICAgICAgcmxfcG9pbnQtLTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfaW5zZXJ0X2JlZyAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJsX2JlZ19vZl9saW5lICgxLCBrZXkpOwotICBybF92aV9pbnNlcnRpb25fbW9kZSAoMSwga2V5KTsKLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9hcHBlbmRfbW9kZSAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChybF9wb2ludCA8IHJsX2VuZCkKLSAgICBybF9wb2ludCsrOwotICBybF92aV9pbnNlcnRpb25fbW9kZSAoMSwga2V5KTsKLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9hcHBlbmRfZW9sIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmxfZW5kX29mX2xpbmUgKDEsIGtleSk7Ci0gIHJsX3ZpX2FwcGVuZF9tb2RlICgxLCBrZXkpOwotICByZXR1cm4gKDApOwotfQotCi0vKiBXaGF0IHRvIGRvIGluIHRoZSBjYXNlIG9mIEMtZC4gKi8KLWludAotcmxfdmlfZW9mX21heWJlIChjb3VudCwgYykKLSAgICAgaW50IGNvdW50LCBjOwotewotICByZXR1cm4gKHJsX25ld2xpbmUgKDEsICdcbicpKTsKLX0KLQotLyogSW5zZXJ0aW9uIG1vZGUgc3R1ZmYuICovCi0KLS8qIFN3aXRjaGluZyBmcm9tIG9uZSBtb2RlIHRvIHRoZSBvdGhlciByZWFsbHkganVzdCBpbnZvbHZlcwotICAgc3dpdGNoaW5nIGtleW1hcHMuICovCi1pbnQKLXJsX3ZpX2luc2VydGlvbl9tb2RlIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgX3JsX2tleW1hcCA9IHZpX2luc2VydGlvbl9rZXltYXA7Ci0gIF9ybF92aV9sYXN0X2tleV9iZWZvcmVfaW5zZXJ0ID0ga2V5OwotICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotX3JsX3ZpX3NhdmVfaW5zZXJ0ICh1cCkKLSAgICAgIFVORE9fTElTVCAqdXA7Ci17Ci0gIGludCBsZW4sIHN0YXJ0LCBlbmQ7Ci0KLSAgaWYgKHVwID09IDApCi0gICAgewotICAgICAgaWYgKHZpX2luc2VydF9idWZmZXJfc2l6ZSA+PSAxKQotCXZpX2luc2VydF9idWZmZXJbMF0gPSAnXDAnOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdGFydCA9IHVwLT5zdGFydDsKLSAgZW5kID0gdXAtPmVuZDsKLSAgbGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICBpZiAobGVuID49IHZpX2luc2VydF9idWZmZXJfc2l6ZSkKLSAgICB7Ci0gICAgICB2aV9pbnNlcnRfYnVmZmVyX3NpemUgKz0gKGxlbiArIDMyKSAtIChsZW4gJSAzMik7Ci0gICAgICB2aV9pbnNlcnRfYnVmZmVyID0geHJlYWxsb2MgKHZpX2luc2VydF9idWZmZXIsIHZpX2luc2VydF9idWZmZXJfc2l6ZSk7Ci0gICAgfQotICBzdHJuY3B5ICh2aV9pbnNlcnRfYnVmZmVyLCBybF9saW5lX2J1ZmZlciArIHN0YXJ0LCBsZW4gLSAxKTsKLSAgdmlfaW5zZXJ0X2J1ZmZlcltsZW4tMV0gPSAnXDAnOwotfQotICAgIAotdm9pZAotX3JsX3ZpX2RvbmVfaW5zZXJ0aW5nICgpCi17Ci0gIGlmIChfcmxfdmlfZG9pbmdfaW5zZXJ0KQotICAgIHsKLSAgICAgIHJsX2VuZF91bmRvX2dyb3VwICgpOwotICAgICAgLyogTm93LCB0aGUgdGV4dCBiZXR3ZWVuIHJsX3VuZG9fbGlzdC0+bmV4dC0+c3RhcnQgYW5kCi0JIHJsX3VuZG9fbGlzdC0+bmV4dC0+ZW5kIGlzIHdoYXQgd2FzIGluc2VydGVkIHdoaWxlIGluIGluc2VydAotCSBtb2RlLiAgSXQgZ2V0cyBjb3BpZWQgdG8gVklfSU5TRVJUX0JVRkZFUiBiZWNhdXNlIGl0IGRlcGVuZHMKLQkgb24gYWJzb2x1dGUgaW5kaWNlcyBpbnRvIHRoZSBsaW5lIHdoaWNoIG1heSBjaGFuZ2UgKHRob3VnaCB0aGV5Ci0JIHByb2JhYmx5IHdpbGwgbm90KS4gKi8KLSAgICAgIF9ybF92aV9kb2luZ19pbnNlcnQgPSAwOwotICAgICAgX3JsX3ZpX3NhdmVfaW5zZXJ0IChybF91bmRvX2xpc3QtPm5leHQpOwotICAgICAgdmlfY29udGludWVkX2NvbW1hbmQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChfcmxfdmlfbGFzdF9rZXlfYmVmb3JlX2luc2VydCA9PSAnaScgJiYgcmxfdW5kb19saXN0KQotICAgICAgICBfcmxfdmlfc2F2ZV9pbnNlcnQgKHJsX3VuZG9fbGlzdCk7Ci0gICAgICAvKiBYWFggLSBPdGhlciBrZXlzIHByb2JhYmx5IG5lZWQgdG8gYmUgY2hlY2tlZC4gKi8KLSAgICAgIGVsc2UgaWYgKF9ybF92aV9sYXN0X2tleV9iZWZvcmVfaW5zZXJ0ID09ICdDJykKLQlybF9lbmRfdW5kb19ncm91cCAoKTsKLSAgICAgIHdoaWxlIChfcmxfdW5kb19ncm91cF9sZXZlbCA+IDApCi0JcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0gICAgICB2aV9jb250aW51ZWRfY29tbWFuZCA9IDA7Ci0gICAgfQotfQotCi1pbnQKLXJsX3ZpX21vdmVtZW50X21vZGUgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpZiAocmxfcG9pbnQgPiAwKQotICAgIHJsX2JhY2t3YXJkICgxLCBrZXkpOwotCi0gIF9ybF9rZXltYXAgPSB2aV9tb3ZlbWVudF9rZXltYXA7Ci0gIF9ybF92aV9kb25lX2luc2VydGluZyAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9hcmdfZGlnaXQgKGNvdW50LCBjKQotICAgICBpbnQgY291bnQsIGM7Ci17Ci0gIGlmIChjID09ICcwJyAmJiBybF9udW1lcmljX2FyZyA9PSAxICYmICFybF9leHBsaWNpdF9hcmcpCi0gICAgcmV0dXJuIChybF9iZWdfb2ZfbGluZSAoMSwgYykpOwotICBlbHNlCi0gICAgcmV0dXJuIChybF9kaWdpdF9hcmd1bWVudCAoY291bnQsIGMpKTsKLX0KLQotaW50Ci1ybF92aV9jaGFuZ2VfY2FzZSAoY291bnQsIGlnbm9yZSkKLSAgICAgaW50IGNvdW50LCBpZ25vcmU7Ci17Ci0gIGNoYXIgYyA9IDA7Ci0KLSAgLyogRG9uJ3QgdHJ5IHRoaXMgb24gYW4gZW1wdHkgbGluZS4gKi8KLSAgaWYgKHJsX3BvaW50ID49IHJsX2VuZCkKLSAgICByZXR1cm4gKDApOwotCi0gIHdoaWxlIChjb3VudC0tICYmIHJsX3BvaW50IDwgcmxfZW5kKQotICAgIHsKLSAgICAgIGlmIChfcmxfdXBwZXJjYXNlX3AgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpCi0JYyA9IF9ybF90b19sb3dlciAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKTsKLSAgICAgIGVsc2UgaWYgKF9ybF9sb3dlcmNhc2VfcCAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQljID0gX3JsX3RvX3VwcGVyIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEp1c3Qgc2tpcCBvdmVyIGNoYXJhY3RlcnMgbmVpdGhlciB1cHBlciBub3IgbG93ZXIgY2FzZS4gKi8KLQkgIHJsX2ZvcndhcmQgKDEsIGMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBWaSBpcyBraW5kIG9mIHN0cmFuZ2UgaGVyZS4gKi8KLSAgICAgIGlmIChjKQotCXsKLQkgIHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCk7Ci0JICBybF9kZWxldGUgKDEsIGMpOwotCSAgcmxfaW5zZXJ0ICgxLCBjKTsKLQkgIHJsX2VuZF91bmRvX2dyb3VwICgpOwotCSAgcmxfdmlfY2hlY2sgKCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLQlybF9mb3J3YXJkICgxLCBjKTsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfcHV0IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaWYgKCFfcmxfdXBwZXJjYXNlX3AgKGtleSkgJiYgKHJsX3BvaW50ICsgMSA8PSBybF9lbmQpKQotICAgIHJsX3BvaW50Kys7Ci0KLSAgcmxfeWFuayAoMSwga2V5KTsKLSAgcmxfYmFja3dhcmQgKDEsIGtleSk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfY2hlY2sgKCkKLXsKLSAgaWYgKHJsX3BvaW50ICYmIHJsX3BvaW50ID09IHJsX2VuZCkKLSAgICBybF9wb2ludC0tOwotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2NvbHVtbiAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGlmIChjb3VudCA+IHJsX2VuZCkKLSAgICBybF9lbmRfb2ZfbGluZSAoMSwga2V5KTsKLSAgZWxzZQotICAgIHJsX3BvaW50ID0gY291bnQgLSAxOwotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2RvbW92ZSAoa2V5LCBuZXh0a2V5KQotICAgICBpbnQga2V5LCAqbmV4dGtleTsKLXsKLSAgaW50IGMsIHNhdmU7Ci0gIGludCBvbGRfZW5kOwotCi0gIHJsX21hcmsgPSBybF9wb2ludDsKLSAgYyA9IHJsX3JlYWRfa2V5ICgpOwotICAqbmV4dGtleSA9IGM7Ci0KLSAgaWYgKCFtZW1iZXIgKGMsIHZpX21vdGlvbikpCi0gICAgewotICAgICAgaWYgKF9ybF9kaWdpdF9wIChjKSkKLQl7Ci0JICBzYXZlID0gcmxfbnVtZXJpY19hcmc7Ci0JICBybF9udW1lcmljX2FyZyA9IF9ybF9kaWdpdF92YWx1ZSAoYyk7Ci0JICBybF9kaWdpdF9sb29wMSAoKTsKLQkgIHJsX251bWVyaWNfYXJnICo9IHNhdmU7Ci0JICBjID0gcmxfcmVhZF9rZXkgKCk7CS8qIHJlYWwgY29tbWFuZCAqLwotCSAgKm5leHRrZXkgPSBjOwotCX0KLSAgICAgIGVsc2UgaWYgKGtleSA9PSBjICYmIChrZXkgPT0gJ2QnIHx8IGtleSA9PSAneScgfHwga2V5ID09ICdjJykpCi0JewotCSAgcmxfbWFyayA9IHJsX2VuZDsKLQkgIHJsX2JlZ19vZl9saW5lICgxLCBjKTsKLQkgIF9ybF92aV9sYXN0X21vdGlvbiA9IGM7Ci0JICByZXR1cm4gKDApOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgX3JsX3ZpX2xhc3RfbW90aW9uID0gYzsKLQotICAvKiBBcHBlbmQgYSBibGFuayBjaGFyYWN0ZXIgdGVtcG9yYXJpbHkgc28gdGhhdCB0aGUgbW90aW9uIHJvdXRpbmVzCi0gICAgIHdvcmsgcmlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KLSAgb2xkX2VuZCA9IHJsX2VuZDsKLSAgcmxfbGluZV9idWZmZXJbcmxfZW5kKytdID0gJyAnOwotICBybF9saW5lX2J1ZmZlcltybF9lbmRdID0gJ1wwJzsKLQotICBfcmxfZGlzcGF0Y2ggKGMsIF9ybF9rZXltYXApOwotCi0gIC8qIFJlbW92ZSB0aGUgYmxhbmsgdGhhdCB3ZSBhZGRlZC4gKi8KLSAgcmxfZW5kID0gb2xkX2VuZDsKLSAgcmxfbGluZV9idWZmZXJbcmxfZW5kXSA9ICdcMCc7Ci0gIGlmIChybF9wb2ludCA+IHJsX2VuZCkKLSAgICBybF9wb2ludCA9IHJsX2VuZDsKLQotICAvKiBObyBjaGFuZ2UgaW4gcG9zaXRpb24gbWVhbnMgdGhlIGNvbW1hbmQgZmFpbGVkLiAqLwotICBpZiAocmxfbWFyayA9PSBybF9wb2ludCkKLSAgICByZXR1cm4gKC0xKTsKLQotICAvKiBybF92aV9mW3dXXW9yZCAoKSBsZWF2ZXMgdGhlIGN1cnNvciBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuZXh0Ci0gICAgIHdvcmQuICBJZiB3ZSBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCB3ZSBhcmUgb24gYQotICAgICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIG1vdmUgYmFjayBvbmUgKHByZXN1bWFibHkgdG8gd2hpdGVzcGFjZSkuICovCi0gIGlmICgoX3JsX3RvX3VwcGVyIChjKSA9PSAnVycpICYmIHJsX3BvaW50IDwgcmxfZW5kICYmIHJsX3BvaW50ID4gcmxfbWFyayAmJgotICAgICAgIXdoaXRlc3BhY2UgKHJsX2xpbmVfYnVmZmVyW3JsX3BvaW50XSkpCi0gICAgcmxfcG9pbnQtLTsKLQotICAvKiBJZiBjdyBvciBjVywgYmFjayB1cCB0byB0aGUgZW5kIG9mIGEgd29yZCwgc28gdGhlIGJlaGF2aW91ciBvZiBjZQotICAgICBvciBjRSBpcyB0aGUgYWN0dWFsIHJlc3VsdC4gIEJydXRlLWZvcmNlLCBubyBzdWJ0bGV0eS4gKi8KLSAgaWYgKGtleSA9PSAnYycgJiYgcmxfcG9pbnQgPj0gcmxfbWFyayAmJiAoX3JsX3RvX3VwcGVyIChjKSA9PSAnVycpKQotICAgIHsKLSAgICAgIC8qIERvbid0IG1vdmUgZmFydGhlciBiYWNrIHRoYW4gd2hlcmUgd2Ugc3RhcnRlZC4gKi8KLSAgICAgIHdoaWxlIChybF9wb2ludCA+IHJsX21hcmsgJiYgd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQlybF9wb2ludC0tOwotCi0gICAgICAvKiBQb3NpeC4yIHNheXMgdGhhdCBpZiBjdyBvciBjVyBtb3ZlcyB0aGUgY3Vyc29yIHRvd2FyZHMgdGhlIGVuZCBvZgotCSB0aGUgbGluZSwgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yIHNob3VsZCBiZSBkZWxldGVkLiAqLwotICAgICAgaWYgKHJsX3BvaW50ID09IHJsX21hcmspCi0gICAgICAgIHJsX3BvaW50Kys7Ci0gICAgICBlbHNlCi0JewotCSAgLyogTW92ZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHdvcmQgc28gdGhhdCB0aGUga2lsbCBkb2Vzbid0Ci0JICAgICByZW1vdmUgdGhlIGxhc3QgbGV0dGVyIG9mIHRoZSBwcmV2aW91cyB3b3JkLiAgT25seSBkbyB0aGlzCi0JICAgICBpZiB3ZSBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCi0JICBpZiAocmxfcG9pbnQgPj0gMCAmJiBybF9wb2ludCA8IChybF9lbmQgLSAxKSAmJiAhd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLQkgICAgcmxfcG9pbnQrKzsKLQl9Ci0gICAgfQotCi0gIGlmIChybF9tYXJrIDwgcmxfcG9pbnQpCi0gICAgZXhjaGFuZ2UgKHJsX3BvaW50LCBybF9tYXJrKTsKLQotICByZXR1cm4gKDApOwotfQotCi0vKiBBIHNpbXBsaWZpZWQgbG9vcCBmb3IgdmkuIERvbid0IGRpc3BhdGNoIGtleSBhdCBlbmQuCi0gICBEb24ndCByZWNvZ25pemUgbWludXMgc2lnbj8gKi8KLXN0YXRpYyBpbnQKLXJsX2RpZ2l0X2xvb3AxICgpCi17Ci0gIGludCBrZXksIGM7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgcmxfbWVzc2FnZSAoIihhcmc6ICVkKSAiLCBybF9hcmdfc2lnbiAqIHJsX251bWVyaWNfYXJnLCAwKTsKLSAgICAgIGtleSA9IGMgPSBybF9yZWFkX2tleSAoKTsKLQotICAgICAgaWYgKF9ybF9rZXltYXBbY10udHlwZSA9PSBJU0ZVTkMgJiYKLQkgIF9ybF9rZXltYXBbY10uZnVuY3Rpb24gPT0gcmxfdW5pdmVyc2FsX2FyZ3VtZW50KQotCXsKLQkgIHJsX251bWVyaWNfYXJnICo9IDQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGMgPSBVTk1FVEEgKGMpOwotICAgICAgaWYgKF9ybF9kaWdpdF9wIChjKSkKLQl7Ci0JICBpZiAocmxfZXhwbGljaXRfYXJnKQotCSAgICBybF9udW1lcmljX2FyZyA9IChybF9udW1lcmljX2FyZyAqIDEwKSArIF9ybF9kaWdpdF92YWx1ZSAoYyk7Ci0JICBlbHNlCi0JICAgIHJsX251bWVyaWNfYXJnID0gX3JsX2RpZ2l0X3ZhbHVlIChjKTsKLQkgIHJsX2V4cGxpY2l0X2FyZyA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJsX2NsZWFyX21lc3NhZ2UgKCk7Ci0JICBybF9zdHVmZl9jaGFyIChrZXkpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9kZWxldGVfdG8gKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgYzsKLQotICBpZiAoX3JsX3VwcGVyY2FzZV9wIChrZXkpKQotICAgIHJsX3N0dWZmX2NoYXIgKCckJyk7Ci0gIGVsc2UgaWYgKHZpX3JlZG9pbmcpCi0gICAgcmxfc3R1ZmZfY2hhciAoX3JsX3ZpX2xhc3RfbW90aW9uKTsKLQotICBpZiAocmxfdmlfZG9tb3ZlIChrZXksICZjKSkKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhlIG1vdGlvbiBjb21tYW5kcyB0aGF0IGRvIG5vdCByZXF1aXJlIGFkanVzdGluZyB0aGUKLSAgICAgbWFyay4gKi8KLSAgaWYgKChzdHJjaHIgKCIgbHxoXjBiQiIsIGMpID09IDApICYmIChybF9tYXJrIDwgcmxfZW5kKSkKLSAgICBybF9tYXJrKys7Ci0KLSAgcmxfa2lsbF90ZXh0IChybF9wb2ludCwgcmxfbWFyayk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfY2hhbmdlX3RvIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGMsIHN0YXJ0X3BvczsKLQotICBpZiAoX3JsX3VwcGVyY2FzZV9wIChrZXkpKQotICAgIHJsX3N0dWZmX2NoYXIgKCckJyk7Ci0gIGVsc2UgaWYgKHZpX3JlZG9pbmcpCi0gICAgcmxfc3R1ZmZfY2hhciAoX3JsX3ZpX2xhc3RfbW90aW9uKTsKLQotICBzdGFydF9wb3MgPSBybF9wb2ludDsKLQotICBpZiAocmxfdmlfZG9tb3ZlIChrZXksICZjKSkKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhlIG1vdGlvbiBjb21tYW5kcyB0aGF0IGRvIG5vdCByZXF1aXJlIGFkanVzdGluZyB0aGUKLSAgICAgbWFyay4gIGNbd1ddIGFyZSBoYW5kbGVkIGJ5IHNwZWNpYWwtY2FzZSBjb2RlIGluIHJsX3ZpX2RvbW92ZSgpLAotICAgICBhbmQgYWxyZWFkeSBsZWF2ZSB0aGUgbWFyayBhdCB0aGUgY29ycmVjdCBsb2NhdGlvbi4gKi8KLSAgaWYgKChzdHJjaHIgKCIgbHxod1deMGJCIiwgYykgPT0gMCkgJiYgKHJsX21hcmsgPCBybF9lbmQpKQotICAgIHJsX21hcmsrKzsKLQotICAvKiBUaGUgY3Vyc29yIG5ldmVyIG1vdmVzIHdpdGggY1t3V10uICovCi0gIGlmICgoX3JsX3RvX3VwcGVyIChjKSA9PSAnVycpICYmIHJsX3BvaW50IDwgc3RhcnRfcG9zKQotICAgIHJsX3BvaW50ID0gc3RhcnRfcG9zOwotCi0gIGlmICh2aV9yZWRvaW5nKQotICAgIHsKLSAgICAgIGlmICh2aV9pbnNlcnRfYnVmZmVyICYmICp2aV9pbnNlcnRfYnVmZmVyKQotCXJsX2JlZ2luX3VuZG9fZ3JvdXAgKCk7Ci0gICAgICBybF9kZWxldGVfdGV4dCAocmxfcG9pbnQsIHJsX21hcmspOwotICAgICAgaWYgKHZpX2luc2VydF9idWZmZXIgJiYgKnZpX2luc2VydF9idWZmZXIpCi0JewotCSAgcmxfaW5zZXJ0X3RleHQgKHZpX2luc2VydF9idWZmZXIpOwotCSAgcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCk7CQkvKiB0byBtYWtlIHRoZSBgdScgY29tbWFuZCB3b3JrICovCi0gICAgICBybF9raWxsX3RleHQgKHJsX3BvaW50LCBybF9tYXJrKTsKLSAgICAgIC8qIGBDJyBkb2VzIG5vdCBzYXZlIHRoZSB0ZXh0IGluc2VydGVkIGZvciB1bmRvaW5nIG9yIHJlZG9pbmcuICovCi0gICAgICBpZiAoX3JsX3VwcGVyY2FzZV9wIChrZXkpID09IDApCi0gICAgICAgIF9ybF92aV9kb2luZ19pbnNlcnQgPSAxOwotICAgICAgX3JsX3ZpX3NldF9sYXN0IChrZXksIGNvdW50LCBybF9hcmdfc2lnbik7Ci0gICAgICBybF92aV9pbnNlcnRpb25fbW9kZSAoMSwga2V5KTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV95YW5rX3RvIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGMsIHNhdmUgPSBybF9wb2ludDsKLQotICBpZiAoX3JsX3VwcGVyY2FzZV9wIChrZXkpKQotICAgIHJsX3N0dWZmX2NoYXIgKCckJyk7Ci0KLSAgaWYgKHJsX3ZpX2RvbW92ZSAoa2V5LCAmYykpCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRoZSBtb3Rpb24gY29tbWFuZHMgdGhhdCBkbyBub3QgcmVxdWlyZSBhZGp1c3RpbmcgdGhlCi0gICAgIG1hcmsuICovCi0gIGlmICgoc3RyY2hyICgiIGx8aF4wJWJCIiwgYykgPT0gMCkgJiYgKHJsX21hcmsgPCBybF9lbmQpKQotICAgIHJsX21hcmsrKzsKLQotICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotICBybF9raWxsX3RleHQgKHJsX3BvaW50LCBybF9tYXJrKTsKLSAgcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0gIHJsX2RvX3VuZG8gKCk7Ci0gIHJsX3BvaW50ID0gc2F2ZTsKLQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2RlbGV0ZSAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGludCBlbmQ7Ci0KLSAgaWYgKHJsX2VuZCA9PSAwKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGVuZCA9IHJsX3BvaW50ICsgY291bnQ7Ci0KLSAgaWYgKGVuZCA+PSBybF9lbmQpCi0gICAgZW5kID0gcmxfZW5kOwotCi0gIHJsX2tpbGxfdGV4dCAocmxfcG9pbnQsIGVuZCk7Ci0gIAotICBpZiAocmxfcG9pbnQgPiAwICYmIHJsX3BvaW50ID09IHJsX2VuZCkKLSAgICBybF9iYWNrd2FyZCAoMSwga2V5KTsKLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9iYWNrX3RvX2luZGVudCAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIHJsX2JlZ19vZl9saW5lICgxLCBrZXkpOwotICB3aGlsZSAocmxfcG9pbnQgPCBybF9lbmQgJiYgd2hpdGVzcGFjZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkKLSAgICBybF9wb2ludCsrOwotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX2ZpcnN0X3ByaW50IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmV0dXJuIChybF92aV9iYWNrX3RvX2luZGVudCAoMSwga2V5KSk7Ci19Ci0KLWludAotcmxfdmlfY2hhcl9zZWFyY2ggKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBzdGF0aWMgY2hhciB0YXJnZXQ7Ci0gIHN0YXRpYyBpbnQgb3JpZ19kaXIsIGRpcjsKLQotICBpZiAoa2V5ID09ICc7JyB8fCBrZXkgPT0gJywnKQotICAgIGRpciA9IGtleSA9PSAnOycgPyBvcmlnX2RpciA6IC1vcmlnX2RpcjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2aV9yZWRvaW5nKQotCXRhcmdldCA9IF9ybF92aV9sYXN0X3NlYXJjaF9jaGFyOwotICAgICAgZWxzZQotCV9ybF92aV9sYXN0X3NlYXJjaF9jaGFyID0gdGFyZ2V0ID0gcmxfZ2V0YyAocmxfaW5zdHJlYW0pOwotCi0gICAgICBzd2l0Y2ggKGtleSkKLSAgICAgICAgewotICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICBvcmlnX2RpciA9IGRpciA9IEZUTzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICBvcmlnX2RpciA9IGRpciA9IEJUTzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICBvcmlnX2RpciA9IGRpciA9IEZGSU5EOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0YnOgotICAgICAgICAgIG9yaWdfZGlyID0gZGlyID0gQkZJTkQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIChfcmxfY2hhcl9zZWFyY2hfaW50ZXJuYWwgKGNvdW50LCBkaXIsIHRhcmdldCkpOwotfQotCi0vKiBNYXRjaCBicmFja2V0cyAqLwotaW50Ci1ybF92aV9tYXRjaCAoaWdub3JlLCBrZXkpCi0gICAgIGludCBpZ25vcmUsIGtleTsKLXsKLSAgaW50IGNvdW50ID0gMSwgYnJhY2ssIHBvczsKLQotICBwb3MgPSBybF9wb2ludDsKLSAgaWYgKChicmFjayA9IHJsX3ZpX2JyYWNrdHlwZSAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdKSkgPT0gMCkKLSAgICB7Ci0gICAgICB3aGlsZSAoKGJyYWNrID0gcmxfdmlfYnJhY2t0eXBlIChybF9saW5lX2J1ZmZlcltybF9wb2ludF0pKSA9PSAwICYmCi0JICAgICBybF9wb2ludCA8IHJsX2VuZCAtIDEpCi0JcmxfZm9yd2FyZCAoMSwga2V5KTsKLQotICAgICAgaWYgKGJyYWNrIDw9IDApCi0JewotCSAgcmxfcG9pbnQgPSBwb3M7Ci0JICBkaW5nICgpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgcG9zID0gcmxfcG9pbnQ7Ci0KLSAgaWYgKGJyYWNrIDwgMCkKLSAgICB7Ci0gICAgICB3aGlsZSAoY291bnQpCi0JewotCSAgaWYgKC0tcG9zID49IDApCi0JICAgIHsKLQkgICAgICBpbnQgYiA9IHJsX3ZpX2JyYWNrdHlwZSAocmxfbGluZV9idWZmZXJbcG9zXSk7Ci0JICAgICAgaWYgKGIgPT0gLWJyYWNrKQotCQljb3VudC0tOwotCSAgICAgIGVsc2UgaWYgKGIgPT0gYnJhY2spCi0JCWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRpbmcgKCk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsJCQkvKiBicmFjayA+IDAgKi8KLSAgICAgIHdoaWxlIChjb3VudCkKLQl7Ci0JICBpZiAoKytwb3MgPCBybF9lbmQpCi0JICAgIHsKLQkgICAgICBpbnQgYiA9IHJsX3ZpX2JyYWNrdHlwZSAocmxfbGluZV9idWZmZXJbcG9zXSk7Ci0JICAgICAgaWYgKGIgPT0gLWJyYWNrKQotCQljb3VudC0tOwotCSAgICAgIGVsc2UgaWYgKGIgPT0gYnJhY2spCi0JCWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRpbmcgKCk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmxfcG9pbnQgPSBwb3M7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLWludAotcmxfdmlfYnJhY2t0eXBlIChjKQotICAgICBpbnQgYzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICcoJzogcmV0dXJuICAxOwotICAgIGNhc2UgJyknOiByZXR1cm4gLTE7Ci0gICAgY2FzZSAnWyc6IHJldHVybiAgMjsKLSAgICBjYXNlICddJzogcmV0dXJuIC0yOwotICAgIGNhc2UgJ3snOiByZXR1cm4gIDM7Ci0gICAgY2FzZSAnfSc6IHJldHVybiAtMzsKLSAgICBkZWZhdWx0OiAgcmV0dXJuICAwOwotICAgIH0KLX0KLQotaW50Ci1ybF92aV9jaGFuZ2VfY2hhciAoY291bnQsIGtleSkKLSAgICAgaW50IGNvdW50LCBrZXk7Ci17Ci0gIGludCBjOwotCi0gIGlmICh2aV9yZWRvaW5nKQotICAgIGMgPSBfcmxfdmlfbGFzdF9yZXBsYWNlbWVudDsKLSAgZWxzZQotICAgIF9ybF92aV9sYXN0X3JlcGxhY2VtZW50ID0gYyA9IHJsX2dldGMgKHJsX2luc3RyZWFtKTsKLQotICBpZiAoYyA9PSAnXDAzMycgfHwgYyA9PSBDVFJMICgnQycpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoY291bnQtLSAmJiBybF9wb2ludCA8IHJsX2VuZCkKLSAgICB7Ci0gICAgICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotCi0gICAgICBybF9kZWxldGUgKDEsIGMpOwotICAgICAgcmxfaW5zZXJ0ICgxLCBjKTsKLSAgICAgIGlmIChjb3VudCA9PSAwKQotCXJsX2JhY2t3YXJkICgxLCBjKTsKLQotICAgICAgcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX3N1YnN0IChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgcmxfYmVnaW5fdW5kb19ncm91cCAoKTsKLQotICBpZiAoX3JsX3VwcGVyY2FzZV9wIChrZXkpKQotICAgIHsKLSAgICAgIHJsX2JlZ19vZl9saW5lICgxLCBrZXkpOwotICAgICAgcmxfa2lsbF9saW5lICgxLCBrZXkpOwotICAgIH0KLSAgZWxzZQotICAgIHJsX2RlbGV0ZV90ZXh0IChybF9wb2ludCwgcmxfcG9pbnQrY291bnQpOwotCi0gIHJsX2VuZF91bmRvX2dyb3VwICgpOwotCi0gIF9ybF92aV9zZXRfbGFzdCAoa2V5LCBjb3VudCwgcmxfYXJnX3NpZ24pOwotCi0gIGlmICh2aV9yZWRvaW5nKQotICAgIHsKLSAgICAgIGludCBvID0gX3JsX2RvaW5nX2FuX3VuZG87Ci0KLSAgICAgIF9ybF9kb2luZ19hbl91bmRvID0gMTsKLSAgICAgIGlmICh2aV9pbnNlcnRfYnVmZmVyICYmICp2aV9pbnNlcnRfYnVmZmVyKQotCXJsX2luc2VydF90ZXh0ICh2aV9pbnNlcnRfYnVmZmVyKTsKLSAgICAgIF9ybF9kb2luZ19hbl91bmRvID0gbzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBybF9iZWdpbl91bmRvX2dyb3VwICgpOwotICAgICAgX3JsX3ZpX2RvaW5nX2luc2VydCA9IDE7Ci0gICAgICBybF92aV9pbnNlcnRpb25fbW9kZSAoMSwga2V5KTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotaW50Ci1ybF92aV9vdmVyc3RyaWtlIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKF9ybF92aV9kb2luZ19pbnNlcnQgPT0gMCkKLSAgICB7Ci0gICAgICBfcmxfdmlfZG9pbmdfaW5zZXJ0ID0gMTsKLSAgICAgIHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHZpX3JlcGxhY2VfY291bnQrKzsKLSAgICAgIHJsX2JlZ2luX3VuZG9fZ3JvdXAgKCk7Ci0KLSAgICAgIGlmIChybF9wb2ludCA8IHJsX2VuZCkKLQl7Ci0JICBybF9kZWxldGUgKDEsIGtleSk7Ci0JICBybF9pbnNlcnQgKDEsIGtleSk7Ci0JfQotICAgICAgZWxzZQotCXJsX2luc2VydCAoMSwga2V5KTsKLQotICAgICAgcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX292ZXJzdHJpa2VfZGVsZXRlIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGksIHM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKHZpX3JlcGxhY2VfY291bnQgPT0gMCkKLQl7Ci0JICBkaW5nICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcyA9IHJsX3BvaW50OwotCi0gICAgICBpZiAocmxfZG9fdW5kbyAoKSkKLQl2aV9yZXBsYWNlX2NvdW50LS07Ci0KLSAgICAgIGlmIChybF9wb2ludCA9PSBzKQotCXJsX2JhY2t3YXJkICgxLCBrZXkpOwotICAgIH0KLQotICBpZiAodmlfcmVwbGFjZV9jb3VudCA9PSAwICYmIF9ybF92aV9kb2luZ19pbnNlcnQpCi0gICAgewotICAgICAgcmxfZW5kX3VuZG9fZ3JvdXAgKCk7Ci0gICAgICBybF9kb191bmRvICgpOwotICAgICAgX3JsX3ZpX2RvaW5nX2luc2VydCA9IDA7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi1pbnQKLXJsX3ZpX3JlcGxhY2UgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgaTsKLQotICB2aV9yZXBsYWNlX2NvdW50ID0gMDsKLQotICBpZiAoIXZpX3JlcGxhY2VfbWFwKQotICAgIHsKLSAgICAgIHZpX3JlcGxhY2VfbWFwID0gcmxfbWFrZV9iYXJlX2tleW1hcCAoKTsKLQotICAgICAgZm9yIChpID0gJyAnOyBpIDwgS0VZTUFQX1NJWkU7IGkrKykKLQl2aV9yZXBsYWNlX21hcFtpXS5mdW5jdGlvbiA9IHJsX3ZpX292ZXJzdHJpa2U7Ci0KLSAgICAgIHZpX3JlcGxhY2VfbWFwW1JVQk9VVF0uZnVuY3Rpb24gPSBybF92aV9vdmVyc3RyaWtlX2RlbGV0ZTsKLSAgICAgIHZpX3JlcGxhY2VfbWFwW0VTQ10uZnVuY3Rpb24gPSBybF92aV9tb3ZlbWVudF9tb2RlOwotICAgICAgdmlfcmVwbGFjZV9tYXBbUkVUVVJOXS5mdW5jdGlvbiA9IHJsX25ld2xpbmU7Ci0gICAgICB2aV9yZXBsYWNlX21hcFtORVdMSU5FXS5mdW5jdGlvbiA9IHJsX25ld2xpbmU7Ci0KLSAgICAgIC8qIElmIHRoZSBub3JtYWwgdmkgaW5zZXJ0aW9uIGtleW1hcCBoYXMgXkggYm91bmQgdG8gZXJhc2UsIGRvIHRoZQotICAgICAgICAgc2FtZSBoZXJlLiAgUHJvYmFibHkgc2hvdWxkIHJlbW92ZSB0aGUgYXNzaWdubWVudCB0byBSVUJPVVQgdXAKLSAgICAgICAgIHRoZXJlLCBidXQgSSBkb24ndCB0aGluayBpdCB3aWxsIG1ha2UgYSBkaWZmZXJlbmNlIGluIHJlYWwgbGlmZS4gKi8KLSAgICAgIGlmICh2aV9pbnNlcnRpb25fa2V5bWFwW0NUUkwgKCdIJyldLnR5cGUgPT0gSVNGVU5DICYmCi0JICB2aV9pbnNlcnRpb25fa2V5bWFwW0NUUkwgKCdIJyldLmZ1bmN0aW9uID09IHJsX3J1Ym91dCkKLQl2aV9yZXBsYWNlX21hcFtDVFJMICgnSCcpXS5mdW5jdGlvbiA9IHJsX3ZpX292ZXJzdHJpa2VfZGVsZXRlOwotCi0gICAgfQotICBfcmxfa2V5bWFwID0gdmlfcmVwbGFjZV9tYXA7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLSNpZiAwCi0vKiBUcnkgdG8gY29tcGxldGUgdGhlIHdvcmQgd2UgYXJlIHN0YW5kaW5nIG9uIG9yIHRoZSB3b3JkIHRoYXQgZW5kcyB3aXRoCi0gICB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLiAgQSBzcGFjZSBtYXRjaGVzIGV2ZXJ5dGhpbmcuICBXb3JkIGRlbGltaXRlcnMgYXJlCi0gICBzcGFjZSBhbmQgOy4gKi8KLWludAotcmxfdmlfcG9zc2libGVfY29tcGxldGlvbnMoKQotewotICBpbnQgc2F2ZV9wb3MgPSBybF9wb2ludDsKLQotICBpZiAocmxfbGluZV9idWZmZXJbcmxfcG9pbnRdICE9ICcgJyAmJiBybF9saW5lX2J1ZmZlcltybF9wb2ludF0gIT0gJzsnKQotICAgIHsKLSAgICAgIHdoaWxlIChybF9wb2ludCA8IHJsX2VuZCAmJiBybF9saW5lX2J1ZmZlcltybF9wb2ludF0gIT0gJyAnICYmCi0JICAgICBybF9saW5lX2J1ZmZlcltybF9wb2ludF0gIT0gJzsnKQotCXJsX3BvaW50Kys7Ci0gICAgfQotICBlbHNlIGlmIChybF9saW5lX2J1ZmZlcltybF9wb2ludCAtIDFdID09ICc7JykKLSAgICB7Ci0gICAgICBkaW5nICgpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgcmxfcG9zc2libGVfY29tcGxldGlvbnMgKCk7Ci0gIHJsX3BvaW50ID0gc2F2ZV9wb3M7Ci0KLSAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi0vKiBGdW5jdGlvbnMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBtYXJrcy4gKi8KLWludAotcmxfdmlfc2V0X21hcmsgKGNvdW50LCBrZXkpCi0gICAgIGludCBjb3VudCwga2V5OwotewotICBpbnQgY2g7Ci0KLSAgY2ggPSBybF9yZWFkX2tleSAoKTsKLSAgaWYgKF9ybF9sb3dlcmNhc2VfcCAoY2gpID09IDApCi0gICAgewotICAgICAgZGluZyAoKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGNoIC09ICdhJzsKLSAgdmlfbWFya19jaGFyc1tjaF0gPSBybF9wb2ludDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcmxfdmlfZ290b19tYXJrIChjb3VudCwga2V5KQotICAgICBpbnQgY291bnQsIGtleTsKLXsKLSAgaW50IGNoOwotCi0gIGNoID0gcmxfcmVhZF9rZXkgKCk7Ci0gIGlmIChjaCA9PSAnYCcpCi0gICAgewotICAgICAgcmxfcG9pbnQgPSBybF9tYXJrOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmIChfcmxfbG93ZXJjYXNlX3AgKGNoKSA9PSAwKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGNoIC09ICdhJzsKLSAgaWYgKHZpX21hcmtfY2hhcnNbY2hdID09IC0xKQotICAgIHsKLSAgICAgIGRpbmcgKCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBybF9wb2ludCA9IHZpX21hcmtfY2hhcnNbY2hdOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIFZJX01PREUgKi8KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL3htYWxsb2MuYyBiL3JlYWRsaW5lL3htYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2MDY1MS4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS94bWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiB4bWFsbG9jLmMgLS0gc2FmZSB2ZXJzaW9ucyBvZiBtYWxsb2MgYW5kIHJlYWxsb2MgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgUmVhZGxpbmUsIGEgbGlicmFyeSBmb3IgcmVhZGluZyBsaW5lcwotICAgb2YgdGV4dCB3aXRoIGludGVyYWN0aXZlIGlucHV0IGFuZCBoaXN0b3J5IGVkaXRpbmcuCi0KLSAgIFJlYWRsaW5lIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgUmVhZGxpbmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBSZWFkbGluZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfQ09ORklHX0gpCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NURExJQl9IKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiYW5zaV9zdGRsaWIuaCIKLSNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCi0KLXN0YXRpYyB2b2lkIG1lbW9yeV9lcnJvcl9hbmRfYWJvcnQgKCk7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCQkJCQkJCQkgICAgKi8KLS8qCQkgICBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgRGVhbGxvY2F0aW9uLgkJICAgICovCi0vKgkJCQkJCQkJICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gZnJlZSgpYWJsZSBibG9jayBvZiBtZW1vcnkgbGFyZ2UgZW5vdWdoCi0gICB0byBob2xkIEJZVEVTIG51bWJlciBvZiBieXRlcy4gIElmIHRoZSBtZW1vcnkgY2Fubm90IGJlIGFsbG9jYXRlZCwKLSAgIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGFib3J0LiAqLwotY2hhciAqCi14bWFsbG9jIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBjaGFyICp0ZW1wOwotCi0gIHRlbXAgPSAoY2hhciAqKW1hbGxvYyAoYnl0ZXMpOwotICBpZiAodGVtcCA9PSAwKQotICAgIG1lbW9yeV9lcnJvcl9hbmRfYWJvcnQgKCJ4bWFsbG9jIik7Ci0gIHJldHVybiAodGVtcCk7Ci19Ci0KLWNoYXIgKgoteHJlYWxsb2MgKHBvaW50ZXIsIGJ5dGVzKQotICAgICBjaGFyICpwb2ludGVyOwotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIGNoYXIgKnRlbXA7Ci0KLSAgdGVtcCA9IHBvaW50ZXIgPyAoY2hhciAqKXJlYWxsb2MgKHBvaW50ZXIsIGJ5dGVzKSA6IChjaGFyICopbWFsbG9jIChieXRlcyk7Ci0KLSAgaWYgKHRlbXAgPT0gMCkKLSAgICBtZW1vcnlfZXJyb3JfYW5kX2Fib3J0ICgieHJlYWxsb2MiKTsKLSAgcmV0dXJuICh0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLW1lbW9yeV9lcnJvcl9hbmRfYWJvcnQgKGZuYW1lKQotICAgICBjaGFyICpmbmFtZTsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IG91dCBvZiB2aXJ0dWFsIG1lbW9yeVxuIiwgZm5hbWUpOwotICBleGl0ICgyKTsKLX0KLQotLyogVXNlIHRoaXMgYXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhZGRpbmcgdW53aW5kIHByb3RlY3RzIHNvIHdlCi0gICBkb24ndCBuZWVkIHRvIGtub3cgd2hhdCBmcmVlKCkgcmV0dXJucy4gKi8KLXZvaWQKLXhmcmVlIChzdHJpbmcpCi0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmluZykKLSAgICBmcmVlIChzdHJpbmcpOwotfQpkaWZmIC0tZ2l0IGEvc2V0dXAuY29tIGIvc2V0dXAuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNhZmQ1Li4wMDAwMDAwCi0tLSBhL3NldHVwLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotJCEgc2V0dXAgZmlsZXMgZm9yIG9wZW5WTVMvQWxwaGEKLSQhCi0kIGRlZmluZSBhb3V0IFstLklOQ0xVREUuQU9VVF0KLSQgZGVmaW5lIGNvZmYgWy0uSU5DTFVERS5DT0ZGXQotJCBkZWZpbmUgZWxmIFstLklOQ0xVREUuRUxGXQotJCBkZWZpbmUgbXB3IFstLklOQ0xVREUuTVBXXQotJCBkZWZpbmUgbmxtIFstLklOQ0xVREUuTkxNXQotJCBkZWZpbmUgb3Bjb2RlIFstLklOQ0xVREUuT1BDT0RFXQpkaWZmIC0tZ2l0IGEvc2ltL0NoYW5nZUxvZyBiL3NpbS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTkzZjUuLjAwMDAwMDAKLS0tIGEvc2ltL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi1TYXQgTWFyICA0IDE2OjQ4OjU0IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTUFJTlRBSU5FUlM6IE5ldyBmaWxlLiAgQmxhbmsuCi0KLTE5OTktMTEtMTggIEJlbiBFbGxpc3RvbiAgPGJqZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMyBhbmQgcmVtb3ZlIG9ic29sZXRlCi0JaW52b2NhdGlvbiBvZiBBQ19DX0NST1NTLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTI5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIHRoZSB0ZXN0c3VpdGUgZGlyZWN0b3J5IGZvciB0aHVtYi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNy0xNiAgQmVuIEVsbGlzdG9uICA8YmplQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIHRoZSB0ZXN0c3VpdGUgZGlyZWN0b3J5IGZvciBhcm0uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMy0xNCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUywgVEFSR0VUX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUKLSAJUlVOVEVTVCBpbnN0ZWFkIG9mIGNvbW1lbnRpbmcgb3V0LCBmaXhlcyBwb3J0YWJpbGl0eSBwcm9ibGVtLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi0xOTk4LTEyLTA4ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpOTYwLSotKik6IEFkZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE5vdiAgNCAxOToxMTo0MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY2FzZSBmb3IgZnIzMC0qLSouCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1GcmkgU2VwIDI1IDEwOjEyOjE5IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIHBwYy9NYWtlZmlsZS5pbjogQWRkIEVYRUVYVCB0byBpbnN0YWxsZWQgcG93ZXJwYy1lYWJpLXJ1biBwcm9ncmFtCi0JdG8gYWxsb3cgc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb24gV2luZG93cy4KLQotVGh1IE1heSAyOCAxNDo1OTo0NiAxOTk4IEppbGxpYW4gWWUgPGppbGxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFRha2UgUlVOVEVTVCBvdXQgb2YgRkxBR1NfVE9fUEFTUyBzbyB0aGF0IG1ha2UKLQljaGVjayBjYW4gYmUgaW52b2tlZCByZWN1cnNpdmVseS4KLQotV2VkIEFwciAyOSAxMjozODo1MyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgc2ltdWxhdG9yIG9uIHNwYXJjbGl0ZSBhbmQgc3BhcmM4NnggdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotU3VuIEFwciAyNiAxNToyMTowMSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhdXRvY29uZi1jb21tb24gYXV0b2hlYWRlci1jb21tb24pOiBEb24ndCBwYXNzIC1sCi0JdG8gYXV0b2NvbmYgYW5kIGF1dG9oZWFkZXIuCi0KLUZyaSBBcHIgMjQgMTE6MTQ6MTMgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYXV0b2NvbmYtY29tbW9uIGF1dG9oZWFkZXItY29tbW9uKTogUGFzcyBgLWwKLQkuLi9jb21tb24nIHRvIGF1dG9jb25mIGFuZCBhdXRvaGVhZGVyLiAgVW5jb25kaXRpb25hbGx5IHJ1bgotCWF1dG9jb25mIGluIGV2ZXJ5IHN1YmRpci4KLQkoYXV0b2NvbmYtY2hhbmdlbG9nIGF1dG9oZWFkZXItY2hhbmdlbG9nKTogVW5jb25kaXRpb25hbGx5IHJ1bgotCWNvbW1hbmRzIGluIGV2ZXJ5IHN1YmRpci4KLQkoYXV0b2NvbmYtaW5zdGFsbCBhdXRvaGVhZGVyLWluc3RhbGwpOiBMaWtld2lzZS4KLQotVHVlIE1hciAyNCAxNzoxMjo0MyAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIE1ha2VmaWxlLmluOiAgR2V0IFNIRUxMIGZyb20gY29uZmlndXJlLgotCSogKEZMQUdTX1RPX1BBU1MpOiAgUGFzcyBkb3duIFNIRUxMLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzIGZvcgotCU5UIG5hdGl2ZSBidWlsZHMuCi0KLVR1ZSBNYXIgMjQgMTE6OjE4OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IEVuYWJsZSBpZ2VuIGZvciBtbjEwMzAwLgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotVHVlIERlYyAgMiAxMDoxMDo0MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBBZGQgc3VwcG9ydCBmb3IgdGh1bWIgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUgKGV4dHJhX3N1YmRpcnMpOiBBZGQgc3VwcG9ydCBmb3IgdGh1bWIgdGFyZ2V0LgotCi1XZWQgT2N0ICA4IDEyOjM4OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogQWRkIElHRU4gZGlyZWN0b3J5IHdoZW4gTUlQUwotIAl0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JCi1GcmkgU2VwIDEyIDEzOjEwOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogdjg1MGVhIG5lZWRzIGlnZW4uCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotTW9uIFNlcCAgMSAxNjo0ODoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGVzdGRpcik6IFdoZW4gYSB0ZXN0c3VpdGUgZGlyZWN0b3J5LCBhZGQgdGhhdCB0bwotIAl0aGUgbGlzdCBvZiBjb25mZGlycy4KLQotVHVlIEF1ZyAxOSAxMToxNzo0NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IEVuYWJsZSBpZ2VuIHJlYWR5IGZvciBWODUwLgotCi1UdWUgQXVnIDI2IDE1OjE0OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh3NjUtKi0qLCBvbmx5X2lmX2VuYWJsZWQpOiBTZXQuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotTW9uIEF1ZyAyNSAxNjoyNjo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotKiwgb25seV9pZl9lbmFibGVkKTogU2V0Ci0gCW9ubHlfaWZfZW5hYmxlZD15ZXMuICBDaGVjayBvbmx5X2lmX2VuYWJsZWQgYmVmb3JlIGVuYWJsaW5nIGEKLSAJc2ltdWxhdG9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCQotTW9uIEF1ZyAxOCAxMDo1Njo1OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBBZGQgdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDEwOjU2OjU5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IEFkZCB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgSnVsIDI1IDExOjQwOjQ3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotKik6IERvbid0IGJ1aWxkIGVyYzMyLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgQXByIDI0IDAwOjQ3OjIwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTMyci0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoYXV0b2NvbmYtY29tbW9uLCBhdXRvY29uZi1jaGFuZ2Vsb2cpOiBDaGFuZ2UgJCogdG8gJEAuCi0KLU1vbiBBcHIgMjEgMjI6NTc6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLk5PRVhQT1JULCBNQUtFT1ZFUlJJREVTKTogTW92ZWQgdG8gZW5kLCBCU0QgbWFrZQotIAl0aG91Z2h0IHRoYXQgLk5PRVhQT1JUIHdhcyB0aGUgZGVmYXVsdCB0YXJnZXQuCi0KLUZyaSBBcHIgMTEgMTc6MTg6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4gbW9zdGx5Y2xlYW4pOiBSZXN0b3JlIHRhcmdldHMgYWNjaWRlbnRhbGx5Ci0JZGVsZXRlZCBpbiBlYXJsaWVyIGNoYW5nZS4KLQotVGh1IEFwciAgMyAxMjoyMDozMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGF1dG9oZWFkZXItY29tbW9uLCBhdXRvaGVhZGVyLWNoYW5nZWxvZywKLSAJYXV0b2hlYWRlci1pbnN0YWxsKTogUGVyZm9ybSBhdXRvaGVhZGVyIGluIGFkZGl0aW9uIHRvIGF1dG9jb25mLgotCi1XZWQgQXByICAyIDE1OjA5OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhdXRvY29uZi1pbnN0YWxsKTogTmV3IHRhcmdldC4KLQkoYXV0b2NvbmYtY2hhbmdlbG9nKTogVHJ5IGRpZmZlcmVudCB3YXkgdG8gb2J0YWluIHVzZXIgbmFtZS4KLQotV2VkIEFwciAgMiAxNDoyNTo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGF1dG9jb25mLWNoYW5nZWxvZyk6IE5ldyB0YXJnZXQsIHVwZGF0ZQotIAlDaGFuZ2VMb2cgZm9yIGFsbCBzdWJkaXJlY3RvcmllcyAtIG5vcm1hbGx5IHVzZWQgYWZ0ZXIKLSAJYXV0b2NvbmYtY29tbW9uIHRhcmdldC4KLQotV2VkIE1hciAxOSAxNDoyNjoyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogSW5jbHVkZSB0ZXN0c3VpdGUgZm9yIGQzMHYuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCwgUlVOVEVTVEZMQUdTKTogQm9ycm93IHRlc3QgcnVsZXMgZnJvbQotIAkuLi9nZGIvTWFrZWZpbGUuaW4KLQkoY2hlY2spOiBOZXcgcnVsZXMgLSBkcml2ZSB0aGUgdGVzdHN1aXRlLgotCi1Nb24gTWFyICAzIDEzOjAxOjAwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbW4xMDIwMCBjb25maWd1cmUgbGluZXMgYWNjaWRlbnRhbGx5Ci0JcmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVdlZCBGZWIgMTkgMTA6MzQ6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBHZW5lcmFsaXplIGNvbW1vbiBzdWIgZGlyZWN0b3J5Ci0gCWludG8gYSBsaXN0LgotCShleHRyYV9zdWJkaXJzKTogRm9yIGQzMHYgYWRkIGlnZW4gdG8gdGhlIGxpc3QgdG8gYmUgYnVpbHQuCi0KLVN1biBGZWIgMTYgMTY6Mzc6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkKLVdlZCBGZWIgMTkgMjM6MTc6MTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHJlcXVpcmUgR0NDIHRvIGJ1aWxkIHRoZSBtbjEwMjAwCi0Jc2ltdWxhdG9yIGFueW1vcmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBGZWIgIDUgMTM6Mjg6MTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgYW55IHN1YmRpcnMgaWYgbm8gc2ltdWxhdG9yCi0JaXMgYmVpbmcgYnVpbHQuICBEb24ndCB1c2UgZXJjMzIgZm9yIHNwYXJjNjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRmViICA0IDEzOjE5OjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhdXRvY29uZi1jb21tb24pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBEbyBjb25maWd1cmUgY29tbW9uLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEphbiAyMyAxMzo1OTo1MiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluOiAgRG9uJ3QgY29uZmlndXJlIGNvbW1vbiBhbnltb3JlLiAgRmlsZXMKLQlmcm9tIGNvbW1vbiBhcmUgbm93IGJ1aWx0IGluIHRoZSBpbmRpdmlkdWFsIHNpbXVhbHRvciBkaXJlY3Rvcmllcy4KLQlUaGlzIGZpeGVzIHByb2JsZW1zIHdpdGggdGhlIFdpbkdEQiBidWlsZCBwcm9jZWR1cmUuCi0KLU1vbiBKYW4gMTMgMTM6MTY6NDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEVuYWJsZSB0aGUgbW4xMDIwMCBzaW11bGF0b3IuCi0KLVdlZCBOb3YgMjAgMDE6MDA6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogQWRkIGNvbW1vbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBOb3YgIDEgMDg6MDM6MzAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotbGludXgqKTogVHJlYXQgbGlrZSB0aGUgb3RoZXIgcG93ZXJwYwotCXN5c3RlbSBWIGJhc2VkIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBPY3QgMTcgMTI6NTA6MDggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tcG93ZXJwYyk6IERlbGV0ZS4KLQkoLS1lbmFibGUtc2ltKTogQWRkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIE9jdCAxMSAyMToxMzo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBidWlsZCB0aGUgVjg1MCBzaW11bGF0b3IgaWYKLQl3ZSBhcmUgdXNpbmcgZ2NjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TdW4gU2VwICA4IDE3OjIyOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBlcmMzMiBmb3IgRE9TIGFuZCBXaW5kb3dzIGhvc3RzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwICA0IDE4OjExOjI3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIGVyYzMyL01ha2VmaWxlLmluOiAgRG9uJ3Qgc2V0IHNyY3Jvb3QuICBUaGlzIHNob3VsZAotCWJlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQuICBSZW1vdmUgSU5TVEFMTF9YRk9STSBhbmQKLQlJTlNUQUxMX1hGT1JNMS4gIE1ha2UgSU5TVEFMTCBiZSBzZXQgZnJvbSBjb25maWd1cmUuCi0KLVdlZCBTZXAgIDQgMTU6NDk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE9ubHkgYnVpbGQgdGhlIE1JUFMgc2ltdWxhdG9yIGlmIHdlIGFyZSB1c2luZwotCWdjYy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAyOCAxOTowNToyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLSopOiBBZGRlZCBWODUwIHNpbXVsYXRvci4KLQotVGh1IEF1ZyAgMSAxNzowODo0MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IEFkZGVkIEQxMFYgc2ltdWxhdG9yLgotCi1XZWQgSnVuIDI2IDEyOjMzOjU3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDE0OjE4OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBPbmx5IGNvbmZpZ3VyZSBlcmMzMiBpZiB1c2luZyBnY2MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBKdW4gIDQgMDk6MjQ6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNpbV90YXJnZXQpOiBCdWlsZCBQb3dlclBDIHNpbXVsYXRvciBmb3IgcG93ZXJwYwotCVN5c3RlbSBWLjQsIFNvbGFyaXMsIGFuZCBFbGYgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLVdlZCBNYXkgMjIgMTI6MTA6NDkgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGw+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBidWlsdCBlcmMzMiBzaW11bGF0b3Igb24gVW5peCBob3N0cyBhcyBpdAotCXVzZXMgcHNldWRvIHR0eXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi44LgotCi1TdW4gTWF5IDE5IDIwOjIwOjQwIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGVyYzMyOiBTcGFyYyBzaW11bGF0b3IgZnJvbSB0aGUgRVNBLgotCi1TdW4gQXByICA3IDIxOjAwOjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBBUiAmIFJBTkxJQi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB1c2luZyBhdXRvY29uZi4KLQotVGh1IEZlYiAyMiAxMTozMTo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHR5cG8uCi0KLVdlZCBGZWIgMjEgMTE6NTk6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBTaW1wbGlmeS4KLQkoY2xlYW4sIG1vc3RseWNsZWFuKTogU1VCRElSUyBtYXkgY29udGFpbiB3aGl0ZXNwYWNlOyBmaXggdGhlIGxvb3AKLQlhcyBpbiB0aGUgYWxsIHRhcmdldC4KLQkoZGlzdGNsZWFuLCBtYWludGFpbmVyLWNsZWFuLCByZWFsY2xlYW4pOiBMaWtld2lzZS4KLQkoaW5zdGFsbCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDE1IDE4OjM3OjAwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogUmVtb3ZlIGV4dHJhICdcJyBjaGFyIGZyb20gc2hlbGwgc2NyaXB0LgotCi1XZWQgRmViIDE0IDE2OjQzOjU5IDE5OTYgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IEF2b2lkIGEgZm9yIGxvb3Agd2l0aCB6ZXJvIGVsZW1lbnRzLCBldmVuIGlmCi0JdGhlIGxvb3Agd2lsbCBub3QgYmUgZXhlY3V0ZWQgYmVjYXVzZSBvZiBhbiBpZiBzdGF0ZW1lbnQuCi0KLVdlZCBKYW4gMzEgMjE6NDg6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogQWRkIG1pc3Npbmcgc2VtaWNvbG9uIGluICJmaSBcIi4KLQotVGh1IE5vdiAgOSAxNjoxMDo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBUiwgQ0MsIENGTEFHUywgQ0NfRk9SX0JVSUxELCBSQU5MSUIpOiBQaWNrIHVwCi0JZGVmYXVsdHMgZnJvbSBjb25maWd1cmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUGljayB1cCBBUiwgQ0MsIENGTEFHUywgQ0NfRk9SX0JVSUxELCBSQU5MSUIgdXNpbmcKLQljb25maWd1cmUgZGVmYXVsdHMuCi0JKHBvd2VycGMqLSotZWFiaSopOiBCdWlsZCBzaW11bGF0b3IgZm9yIGFsbCBwb3dlcnBjIGVhYmkgdGFyZ2V0cwotCWlmIGVpdGhlciAtLWVuYWJsZS1zaW0tcG93ZXJwYyBpcyB1c2VkLCBvciB0aGUgaG9zdCBjb21waWxlciBpcwotCUdDQy4KLQotV2VkIE5vdiAgOCAxNTo0Njo0OSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi0qLSopOiBBZGRlZCAibWlwcyIgc2ltdWxhdG9yIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGVkLgotCi1UdWUgT2N0IDEwIDExOjA4OjIwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0JKEZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgQklTT04uCi0KLVN1biBPY3QgIDggMDQ6MjY6MjcgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBFeHBsaWNpdGx5IGBleGl0IDAnIGZvciBicm9rZW4gc2hlbGxzLgotCSogY29uZmlndXJlOiAgUmVidWlsdC4KLQotRnJpIE9jdCAgNiAxMjowMzoyNyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi9ydW4uYyAobWFpbik6IEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcy4KLQotV2VkIFNlcCAyMCAxMzozNDo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotRnJpIEF1ZyAyNSAxMTo1Mzo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IE9ubHkgYnVpbGQgdGhlIHNpbXVsYXRvciBpZgotCXRoZSB0YXJnZXQgaXMgcG93ZXJwYyotKi1lYWJpc2ltKiwgc2luY2UgaXQgcmVxdWlyZXMgR0NDIHRvIGJ1aWxkLgotCi1Nb24gQXVnIDIxIDE3OjUzOjQ4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjeyxsZX0tKi0qKTogQWRkIHBzaW0gZnJvbSBBbmRyZXcgQ2FnbmV5Ci0JPGNhZ25leUBoaWdobGFuZC5jb20uYXU+LgotCSogY29uZmlndXJlOiBSZWduZXJhdGUgZnJvbSBjb25maWd1cmUuaW4uCi0KLVRodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMuCi0KLVRodSBKdWwgMjAgMTU6MTc6MjkgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiAgRGVmaW5lIGRlZmF1bHQgYW5kIGFycmFuZ2UgdG8gcGFzcwotCXN1Ym1ha2VzIGVpdGhlciBkZWZhdWx0IG9yIHBhc3NlZCBpbiB2YWx1ZS4KLQotV2VkIEp1bCAgNSAxNDozMjo1NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwsIGNsZWFuLCBkaXN0Y2xlYW4sIG1vc3RseWNsZWFuLCByZWFsY2xlYW4sCi0JICBpbnN0YWxsKTogQ2hhbmdlZCB0YXJnZXRzIHNvIHRoYXQgdGhleSBkZXNjZW5kIGFsbAotCSAgc3ViZGlyZWN0b3JpZXMgaW4gJChTVUJESVJTKS4KLQkgICgqLWFsbCwgKi1jbGVhbiwgKi1pbnN0YWxsKTogUmVtb3ZlZCB0YXJnZXRzLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB3aXRoIHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudHMsIHRoZXkKLQkgIGFyZSBubyBsb25nZXIgbmVlZGVkLgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlZC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogY29udmVydGVkIHRvIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0Y29uZiAyLjQuCi0KLVdlZCBNYXkgMjQgMTQ6NDg6NDYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFN1cHBvcnQgQVJNLgotCSogY29uZmlndXJlLmluOiBEaXR0by4KLQotU3VuIEphbiAxNSAxNjo1Mzo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogTWFrZWZpbGUuaW46IFN1cHBvcnQgVzY1LgotCSogY29uZmlndXJlLmluOiBEaXR0by4KLQotU3VuIE1hciAxMyAwOToyNzo1MCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBUQUdTIHRhcmdldC4KLQotTW9uIFNlcCAxMyAxMjo0NzoxNSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtejhrLCBpbnN0YWxsLXo4aywgY2xlYW4tejhrLCBhbGwtaDgzMDAsCi0JICBpbnN0YWxsLWg4MzAwLCBjbGVhbi1oODMwMCwgYWxsLWg4NTAwLCBpbnN0YWxsLWg4NTAwLAotCSAgY2xlYW4taDg1MDAsIGFsbC1zaCwgaW5zdGFsbC1zaCwgY2xlYW4tc2gpOiBkbyBub3QgZWNobwotCSAgcmVjdXJzaW9uIGxpbmVzLgotCi1XZWQgSnVuIDMwIDE0OjEyOjA1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGVuZGlhbi5oIHRyYWNlIGZyb20gaDg1MDAKLQotU3VuIEp1biAxMyAxMzowODo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBkaXN0Y2xlYW4sIHJlYWxjbGVhbiwgYW5kIG1vc3RseWNsZWFuIHRhcmdldHMuCi0KLUZyaSBNYXkgMjEgMTE6MjE6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBhbGwgb2YgdGhlIGFsbC0qIHRhcmdldCAoZXhjZXB0IGFsbC1ub3RoaW5nKQotCWRlcGVuZCBvbiBlbmRpYW4uaCwgc28gdGhhdCBpZiB3ZSdyZSBub3QgYnVpbGRpbmcgYSBzaW11bGF0b3IsIHdlCi0JZG9uJ3QgYnVpbHQgZW5kaWFuCi0KLUZyaSBNYXkgMjEgMTA6NTU6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2ssIGluc3RhbGxjaGVjayk6IEFkZGVkIGR1bW15IHRhcmdldHMuCi0KLU1vbiBNYXkgIDMgMjE6Mzk6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbmRpYW4pOiBGaW5kIGVuZGlhbi5jIGluICQoc3JjZGlyKSwgYW5kIGFsc28KLQlleHBsaWNpdGx5IG1ha2UgaXQsIHNpbmNlIHNvbWUgbWFrZXMgYXBwYXJlbnRseSBkb24ndCB3b3JrIHdpdGgKLQlWUEFUSCBhbmQgLmMgdG8gZXhlY3V0YWJsZSBydWxlcyAoU3VuT1MgbWFrZSBmb3IgZXhhbXBsZSkuCi0KLU1vbiBNYXkgIDMgMDg6Mjk6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbmRpYW4pOiBBZGQgZXhwbGljaXQgcnVsZSBmb3IgYnJva2VuIG1ha2VzLgotCi1Nb24gTWFyIDE1IDE1OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluZm8sIGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXRzLgotCShET19JTlNUQUxMKTogUmVuYW1lZCBmcm9tIElOU1RBTEwsIHdoaWNoIGlzIG92ZXJyaWRkZW4gYnkgdGhlIHRvcAotCWxldmVsIE1ha2VmaWxlLgotCi1XZWQgRmViIDEwIDIwOjEyOjI3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBvay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW5kaWFuLmgpOiBidWlsZCBlbmRpYW4uaCB2aWEgYSB0ZW1wb3JhcnkgZmlsZSBzbwotCSAgdGhhdCB3ZSBkb24ndCBsZWF2ZSBhbiBpbmNvbXBsZXRlIGZpbGUgbHlpbmcgYXJvdW5kIG9uCi0JICBpbnRlcnJ1cHRlZCBidWlsZHMuCi0JICAoY2xlYW4pOiByZW1vdmUgZW5kaWFuLCBlLmgsIGFuZCBlbmRpYW4uaC4KLQotTW9uIEZlYiAgOCAxMTo0NjowNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogaWYgdGFyZ2V0IGlzbid0IHN1cHBvcnRlZCwgYnVpbGQgYQotCWhhcm1sZXNzIG1ha2VmaWxlLgotCi0KZGlmZiAtLWdpdCBhL3NpbS9NQUlOVEFJTkVSUyBiL3NpbS9NQUlOVEFJTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwNjllYy4uMDAwMDAwMAotLS0gYS9zaW0vTUFJTlRBSU5FUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgpkaWZmIC0tZ2l0IGEvc2ltL01ha2VmaWxlLmluIGIvc2ltL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUzNzgwLi4wMDAwMDAwCi0tLSBhL3NpbS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotIyAKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1WUEFUSCA9IEBzcmNkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1iaW5kaXIgPSBAYmluZGlyQAotbGliZGlyID0gQGxpYmRpckAKLXRvb2xkaXIgPSAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpCi0KLWRhdGFkaXIgPSBAZGF0YWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLW1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgotbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCi1tYW40ZGlyID0gJChtYW5kaXIpL21hbjQKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotbWFuNmRpciA9ICQobWFuZGlyKS9tYW42Ci1tYW43ZGlyID0gJChtYW5kaXIpL21hbjcKLW1hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAotbWFuOWRpciA9ICQobWFuZGlyKS9tYW45Ci1pbmZvZGlyID0gQGluZm9kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi0KLVNIRUxMID0gQFNIRUxMQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQVIgPSBAQVJACi1BUl9GTEFHUyA9IHJjCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotTUFLRUlORk8gPSBtYWtlaW5mbwotUkFOTElCID0gQFJBTkxJQkAKLQotU1VCRElSUyA9IEBzdWJkaXJzQAotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotREVQID0gbWtkZXAKLQotIyBjb21waWxlcnMgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBtdXN0IGJlIHJ1biBpbiB0aGUgYnVpbGQKLSMgZW52aXJvbm1lbnQuCi1DQ19GT1JfQlVJTEQgPSAkKENDKQotCi0jIyMjIE1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0jIEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0AKLSMjIwotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLVJVTlRFU1RGTEFHUz0KLQotRkxBR1NfVE9fUEFTUyA9IFwKLQkicHJlZml4PSQocHJlZml4KSIgXAotCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAotCSJhZ2FpbnN0PSQoYWdhaW5zdCkiIFwKLQkiQVI9JChBUikiIFwKLQkiQVJfRkxBR1M9JChBUl9GTEFHUykiIFwKLQkiQ0M9JChDQykiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIlJBTkxJQj0kKFJBTkxJQikiIFwKLQkiTUFLRUlORk89JChNQUtFSU5GTykiIFwKLQkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCi0JIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKLQkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAotCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIgotCi0jIFRoZSB1c2Ugb2YgJCQoeF9GT1JfVEFSR0VUKSByZWR1Y2VzIHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIGJ5IG5vdAotIyBkdXBsaWNhdGluZyB0aGUgbGVuZ3RoeSBkZWZpbml0aW9uLgotVEFSR0VUX0ZMQUdTX1RPX1BBU1MgPSBcCi0JInByZWZpeD0kKHByZWZpeCkiIFwKLQkiZXhlY19wcmVmaXg9JChleGVjX3ByZWZpeCkiIFwKLQkiYWdhaW5zdD0kKGFnYWluc3QpIiBcCi0JJ0NDPSQkKENDX0ZPUl9UQVJHRVQpJyBcCi0JIkNDX0ZPUl9UQVJHRVQ9JChDQ19GT1JfVEFSR0VUKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIkNISUxMRkxBR1M9JChDSElMTEZMQUdTKSIgXAotCSdDSElMTD0kJChDSElMTF9GT1JfVEFSR0VUKScgXAotCSJDSElMTF9GT1JfVEFSR0VUPSQoQ0hJTExfRk9SX1RBUkdFVCkiIFwKLQkiQ0hJTExfTElCPSQoQ0hJTExfTElCKSIgXAotCSdDWFg9JCQoQ1hYX0ZPUl9UQVJHRVQpJyBcCi0JIkNYWF9GT1JfVEFSR0VUPSQoQ1hYX0ZPUl9UQVJHRVQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCi0JIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKLQkiTUFLRUlORk89JChNQUtFSU5GTykiIFwKLQkiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIKLQotCi1hbGw6Ci0JQHJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCi0JZm9yIGRpciBpbiAuIGBlY2hvICR7U1VCRElSU30gfCBzZWQgJ3MvdGVzdHN1aXRlLy8nYCA7IGRvIFwKLQkJaWYgWyAiJCRkaXIiID0gIi4iIF07IHRoZW4gXAotCQkJdHJ1ZTsgXAotCQllbGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCi0JCQkoY2QgJCRkaXI7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSk7IFwKLQkJZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotY2xlYW4gbW9zdGx5Y2xlYW46Ci0JQHJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCi0JZm9yIGRpciBpbiAuICR7U1VCRElSU307IGRvIFwKLQkJaWYgWyAiJCRkaXIiID0gIi4iIF07IHRoZW4gXAotCQkJdHJ1ZTsgXAotCQllbGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCi0JCQkoY2QgJCRkaXI7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkQCk7IFwKLQkJZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOgotCUByb290bWU9YHB3ZGAgOyBleHBvcnQgcm9vdG1lIDsgXAotCWZvciBkaXIgaW4gLiAke1NVQkRJUlN9OyBkbyBcCi0JCWlmIFsgIiQkZGlyIiA9ICIuIiBdOyB0aGVuIFwKLQkJCXRydWU7IFwKLQkJZWxpZiBbIC1kICQkZGlyIF07IHRoZW4gXAotCQkJKGNkICQkZGlyOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJEApOyBcCi0JCWVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cwotCi1pbnN0YWxsOgotCUByb290bWU9YHB3ZGAgOyBleHBvcnQgcm9vdG1lIDsgXAotCWZvciBkaXIgaW4gLiAke1NVQkRJUlN9OyBkbyBcCi0JCWlmIFsgIiQkZGlyIiA9ICIuIiBdOyB0aGVuIFwKLQkJCXRydWU7IFwKLQkJZWxpZiBbIC1kICQkZGlyIF07IHRoZW4gXAotCQkJKGNkICQkZGlyOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQkJZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotaW5zdGFsbGNoZWNrOgotCUBlY2hvIE5vIGluc3RhbGxjaGVjayB0YXJnZXQgaXMgYXZhaWxhYmxlIHlldCBmb3IgdGhlIEdOVSBzaW11bGF0b3JzLgotCi1pbnN0YWxsY2hlY2s6Ci0KLSMgVGhlIGNoZWNrIHRhcmdldCBjYW4gbm90IHVzZSBzdWJkaXJfZG8sIGJlY2F1c2Ugc3ViZGlyX2RvIGRvZXMgbm90Ci0jIHVzZSBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLWNoZWNrOiBmb3JjZQotCUBpZiBbIC1mIHRlc3RzdWl0ZS9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgIHJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCSAgcm9vdHNyYz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgcm9vdHNyYzsgXAotCSAgY2QgdGVzdHN1aXRlOyBcCi0JICAkKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrOyBcCi0JZWxzZSB0cnVlOyBmaQotCi0KLQotaW5mbzoKLWluc3RhbGwtaW5mbzoKLWR2aToKLQotIyMjIAotIyMjIAotCi0uTk9FWFBPUlQ6Ci1NQUtFT1ZFUlJJREVTPQotCi0uUEhPTlk6IGNoZWNrIGluc3RhbGxjaGVjawotY2hlY2s6Ci1pbnN0YWxsY2hlY2s6Ci0KLVRBR1M6Ci0KLWZvcmNlOgotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiBjb25maWd1cmUKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSMgVXRpbGl0eSB0byBydW4gYXV0b2NvbmYgaW4gZWFjaCBkaXJlY3RvcnkgdGhhdCB1c2VzIHRoZSBjb21tb24gZnJhbWV3b3JrLgotIyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgaW4gJHNyY2RpciBhcwotIyAibWFrZSAtZiBNYWtlZmlsZS5pbiBhdXRvY29uZi1jb21tb24iLgotLlBIT05ZOiBhdXRvY29uZi1jb21tb24KLWF1dG9jb25mLWNvbW1vbiBhdXRvaGVhZGVyLWNvbW1vbjoKLQlmb3IgZCBpbiAqIDsgXAotCWRvIFwKLQkgICAgaWYgWyAtZCAkJGQgLWEgLWYgJCRkL2NvbmZpZ3VyZS5pbiBdIDsgXAotCSAgICB0aGVuIFwKLQkJIGVjaG8gIlJ1bm5pbmcgYXV0b2NvbmYgaW4gJCRkIC4uLiIgOyBcCi0JCSAoY2QgJCRkICYmIGF1dG9jb25mKSA7IFwKLQkJIGlmIFsgJEAgPSBhdXRvaGVhZGVyLWNvbW1vbiBdIDsgXAotCQkgdGhlbiBcCi0JCSAgIGVjaG8gIlJ1bm5pbmcgYXV0b2hlYWRlciBpbiAkJGQgLi4uIiA7IFwKLQkJICAgKGNkICQkZCAmJiBhdXRvaGVhZGVyKSA7IFwKLQkJIGZpIDsgXAotCSAgICBmaSA7IFwKLQlkb25lCi0KLWF1dG9jb25mLWNoYW5nZWxvZyBhdXRvaGVhZGVyLWNoYW5nZWxvZzoKLQlpZD0iYGlkIHwgc2VkIC1lICdzL15bXihdKihcKFteKV0qXCkuKiQkL1wxLydgIiA7IFwKLQluYW1lPWBncmVwICJeJCRpZDoiIC9ldGMvcGFzc3dkIHwgY3V0IC1mIDUgLWQgJzonYCA7IFwKLQlob3N0PSJgaG9zdG5hbWVgIiA7IFwKLQlkYXRlPSJgZGF0ZSB8IHNlZCAncy8gW14gXSogXChbMC05XSpcKSQkLyBcMS8nYCIgOyBcCi0JZWNobyAiJCRkYXRlICQkbmFtZSAkJGlkQCQkaG9zdCIgOyBcCi0JZm9yIGQgaW4gKiA7IFwKLQlkbyBcCi0JICAgIGlmIFsgLWQgJCRkIC1hIC1mICQkZC9jb25maWd1cmUuaW4gXSA7IFwKLQkgICAgdGhlbiBcCi0JCSBlY2hvICJDcmVhdGluZyBuZXctQ2hhbmdlTG9nIGluICQkZCAuLi4iIDsgXAotCQkgKCBlY2hvICIkJGRhdGUgICQkbmFtZSAgPCQkaWRAJCRob3N0PiIgOyBcCi0JCSAgIGVjaG8gIiIgOyBcCi0JCSAgIGVjaG8gIgkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4iIDsgXAotCQkgICBpZiBbICRAID0gYXV0b2hlYWRlci1jaGFuZ2Vsb2cgXSA7IFwKLQkJICAgdGhlbiBcCi0JCSAgICAgZWNobyAiCSogY29uZmlnLmluOiBEaXR0by4iIDsgXAotCQkgICBmaSA7IFwKLQkJICAgZWNobyAiIiA7IFwKLQkJICAgY2F0ICQkZC9DaGFuZ2VMb2cgXAotCQkgKSA+ICQkZC9uZXctQ2hhbmdlTG9nIDsgXAotCSAgICBmaSA7IFwKLQlkb25lCi0KLWF1dG9jb25mLWluc3RhbGwgYXV0b2hlYWRlci1pbnN0YWxsOgotCWZvciBkIGluICogOyBcCi0JZG8gXAotCSAgICBpZiBbIC1kICQkZCAtYSAtZiAkJGQvY29uZmlndXJlLmluIF0gOyBcCi0JICAgIHRoZW4gXAotCQkgZWNobyAiTW92aW5nICQkZC9uZXctQ2hhbmdlTG9nIHRvICQkZC9DaGFuZ2VMb2cgLi4uIiA7IFwKLQkJIG12ICQkZC9uZXctQ2hhbmdlTG9nICQkZC9DaGFuZ2VMb2cgOyBcCi0JICAgIGZpIDsgXAotCWRvbmUKZGlmZiAtLWdpdCBhL3NpbS9SRUFETUUtSEFDS0lORyBiL3NpbS9SRUFETUUtSEFDS0lORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlZmViMS4uMDAwMDAwMAotLS0gYS9zaW0vUkVBRE1FLUhBQ0tJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotVGhpcyBpcyBhIGxvb3NlIGNvbGxlY3Rpb24gb2Ygbm90ZXMgZm9yIHBlb3BsZSBoYWNraW5nIG9uIHNpbXVsYXRvcnMuCi1JZiB0aGlzIGRvY3VtZW50IGdldHMgYmlnIGVub3VnaCBpdCBjYW4gYmUgcHJldHRpZWQgdXAgdGhlbi4KLQotQ29udGVudHMKLQotLSBUaGUgImNvbW1vbiIgZGlyZWN0b3J5Ci0tIENvbW1vbiBNYWtlZmlsZSBTdXBwb3J0Ci0tIFRBR1Mgc3VwcG9ydAotLSBHZW5lcmF0aW5nICJjb25maWd1cmUiIGZpbGVzCi0tIHRjb25maWcuaW4KLS0gQyBMYW5ndWFnZSBBc3N1bXB0aW9ucwotLSAiZHVtcCIgY29tbWFuZHMgdW5kZXIgZ2RiCi0MCi1UaGUgImNvbW1vbiIgZGlyZWN0b3J5Ci09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBjb21tb24gZGlyZWN0b3J5IGNvbnRhaW5zOgotCi0tIGNvbW1vbiBkb2N1bWVudGF0aW9uIGZpbGVzIChlLmcuIHJ1bi4xLCBhbmQgbWF5YmUgaW4gdGltZSAudGV4aSBmaWxlcykKLS0gY29tbW9uIHNvdXJjZSBmaWxlcyAoZS5nLiBydW4uYykKLS0gY29tbW9uIE1ha2VmaWxlIGZyYWdtZW50IGFuZCBjb25maWd1cnkgKGUuZy4gTWFrZS1jb21tb24uaW4sIGFjbG9jYWwubTQpLgotCi1JbiBhZGRpdGlvbiAiY29tbW9uIiBjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgc3lzdGVtIGNhbGwgc3VwcG9ydAotKGUuZy4gY2FsbGJhY2suYywgbmx0dmFscy5kZWYpLgotCi1FdmVuIHRob3VnaCBubyBmaWxlcyBhcmUgYnVpbHQgaW4gdGhpcyBkaXJlY3RvcnksIGl0IGlzIHN0aWxsIGNvbmZpZ3VyZWQKLXNvIHN1cHBvcnQgZm9yIHJlZ2VuZXJhdGluZyBubHR2YWxzLmRlZiBpcyBwcmVzZW50LgotDAotQ29tbW9uIE1ha2VmaWxlIFN1cHBvcnQKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUEgY29tbW9uIGNvbmZpZ3VyYXRpb24gZnJhbWV3b3JrIGlzIGF2YWlsYWJsZSBmb3Igc2ltdWxhdG9ycyB0aGF0IHdhbnQKLXRvIHVzZSBpdC4gIFRoZSBjb21tb24gZnJhbWV3b3JrIGV4aXN0cyB0byByZW1vdmUgYSBsb3Qgb2YgZHVwbGljYXRpb24KLWluIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4sIGFuZCBpdCBhbHNvIHByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IKLWVuaGFuY2luZyB0aGUgc2ltdWxhdG9ycyB1bmlmb3JtbHkgKGUuZy4gdGhlIG1vcmUgdGhleSBzaGFyZSBpbiBjb21tb24KLXRoZSBlYXNpZXIgYSBmZWF0dXJlIGFkZGVkIHRvIG9uZSBpcyBhZGRlZCB0byBhbGwpLgotCi1UaGUgY29uZmlndXJlLmluIG9mIGEgc2ltdWxhdG9yIHVzaW5nIHRoZSBjb21tb24gZnJhbWV3b3JrIHNob3VsZCBsb29rIGxpa2U6Ci0KLS0tLSBzbmlwIC0tLQotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLS4uLiB0YXJnZXQgc3BlY2lmaWMgYWRkaXRpb25zIC4uLgotCi1TSU1fQUNfT1VUUFVUCi0tLS0gc25pcCAtLS0KLQotU0lNX0FDX0NPTU1PTjoKLQotLSBpbnZva2VzIHRoZSBhdXRvY29uZiBtYWNyb3MgbW9zdCBvZnRlbiB1c2VkIGJ5IHRoZSBzaW11bGF0b3JzCi0tIGRlZmluZXMgLS1lbmFibGUvLS13aXRoIG9wdGlvbnMgdXNhYmxlIGJ5IGFsbCBzaW11bGF0b3JzCi0tIGluaXRpYWxpemVzIHNpbV9saW5rX2ZpbGVzL3NpbV9saW5rX2xpbmtzIGFzIHRoZSBzZXQgb2Ygc3ltYm9saWMgbGlua3MKLSAgdG8gc2V0IHVwCi0KLVNJTV9BQ19PVVRQVVQ6Ci0KLS0gY3JlYXRlcyB0aGUgc3ltYm9saWMgbGlua3MgZGVmaW5lZCBpbiBzaW1fbGlua197ZmlsZXMsbGlua3N9Ci0tIGNyZWF0ZXMgY29uZmlnLmgKLS0gY3JlYXRlcyB0aGUgTWFrZWZpbGUKLQotVGhlIE1ha2VmaWxlLmluIG9mIGEgc2ltdWxhdG9yIHVzaW5nIHRoZSBjb21tb24gZnJhbWV3b3JrIHNob3VsZCBsb29rIGxpa2U6Ci0KLS0tLSBzbmlwIC0tLQotIyBNYWtlZmlsZSBmb3IgYmxhaCAuLi4KLSMgQ29weXJpZ2h0IGJsYWggLi4uCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGdpdmVuIGRlZmF1bHQgdmFsdWVzIGluIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcuCi0jIFdlIG92ZXJyaWRlIHRoZSBvbmVzIHdlIG5lZWQgdG8gaGVyZS4KLSMgTm90IGFsbCBvZiB0aGVzZSBuZWVkIHRvIGJlIG1lbnRpb25lZCwgb25seSB0aGUgbmVjZXNzYXJ5IG9uZXMuCi0jIEluIGZhY3QgaXQgaXMgYmV0dGVyIHRvICpub3QqIG1lbnRpb24gb25lcyBpZiB0aGUgdmFsdWUgaXMgdGhlIGRlZmF1bHQuCi0KLSMgTGlzdCBvZiBvYmplY3QgZmlsZXMsIGxlc3MgY29tbW9uIHBhcnRzLgotU0lNX09CSlMgPQotIyBMaXN0IG9mIGV4dHJhIGRlcGVuZGVuY2llcy4KLSMgR2VuZXJhbGx5IHRoaXMgY29uc2lzdHMgb2Ygc2ltdWxhdG9yIHNwZWNpZmljIGZpbGVzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCi1TSU1fRVhUUkFfREVQUyA9Ci0jIExpc3Qgb2YgZmxhZ3MgdG8gYWx3YXlzIHBhc3MgdG8gJChDQykuCi1TSU1fRVhUUkFfQ0ZMQUdTID0KLSMgTGlzdCBvZiBleHRyYSBsaWJyYXJpZXMgdG8gbGluayB3aXRoLgotU0lNX0VYVFJBX0xJQlMgPQotIyBMaXN0IG9mIGV4dHJhIHByb2dyYW0gZGVwZW5kZW5jaWVzLgotU0lNX0VYVFJBX0xJQkRFUFMgPQotIyBMaXN0IG9mIG1haW4gb2JqZWN0IGZpbGVzIGZvciBgcnVuJy4KLVNJTV9SVU5fT0JKUyA9IHJ1bi5vCi0jIERlcGVuZGVuY3kgb2YgYGFsbCcgdG8gYnVpbGQgYW55IGV4dHJhIGZpbGVzLgotU0lNX0VYVFJBX0FMTCA9Ci0jIERlcGVuZGVuY3kgb2YgYGluc3RhbGwnIHRvIGluc3RhbGwgYW55IGV4dHJhIGZpbGVzLgotU0lNX0VYVFJBX0lOU1RBTEwgPQotIyBEZXBlbmRlbmN5IG9mIGBjbGVhbicgdG8gY2xlYW4gYW55IGV4dHJhIGZpbGVzLgotU0lNX0VYVFJBX0NMRUFOID0KLQotIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKLQotIyBSdWxlcyBuZWVkIHRvIGJ1aWxkICQoU0lNX09CSlMpLCBwbHVzIHdoYXRldmVyIGVsc2UgdGhlIHRhcmdldCB3YW50cy4KLQotLi4uIHRhcmdldCBzcGVjaWZpYyBydWxlcyAuLi4KLS0tLSBzbmlwIC0tLQotCi1DT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBhcmUgbWFya2VycyBmb3IgU0lNX0FDX09VVFBVVCB0byB0ZWxsIGl0Ci13aGVyZSB0byBpbnNlcnQgdGhlIHR3byBwaWVjZXMgb2YgY29tbW9uL01ha2UtY29tbW9uLmluLgotVGhlIHJlc3VsdGluZyBNYWtlZmlsZSBpcyBjcmVhdGVkIGJ5IGRvaW5nIGF1dG9jb25mIHN1YnN0aXRpb25zIG9uCi1ib3RoIHRoZSB0YXJnZXQncyBNYWtlZmlsZS5pbiBhbmQgTWFrZS1jb21tb24uaW4sIGFuZCBpbnNlcnRpbmcKLXRoZSB0d28gcGllY2VzIG9mIE1ha2UtY29tbW9uLmluIGludG8gdGhlIHRhcmdldCdzIE1ha2VmaWxlLmluIGF0Ci1DT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRy4KLQotTm90ZSB0aGF0IFNJTV9FWFRSQV97SU5TVEFMTCxDTEVBTn0gY291bGQgYmUgcmVtb3ZlZCBhbmQgIjo6IiB0YXJnZXRzCi1jb3VsZCBiZSB1c2VkIGluc3RlYWQuICBIb3dldmVyLCBpdCdzIG5vdCBjbGVhciB5ZXQgd2hldGhlciAiOjoiIHRhcmdldHMKLWFyZSBwb3J0YWJsZSBlbm91Z2guCi0MCi1UQUdTIHN1cHBvcnQKLT09PT09PT09PT09PQotCi1NYW55IGZpbGVzIGdlbmVyYXRlIHByb2dyYW0gc3ltYm9scyBhdCBjb21waWxlIHRpbWUuCi1TdWNoIHN5bWJvbHMgY2FuJ3QgYmUgZm91bmQgd2l0aCBncmVwIG5vciBkbyB0aGV5IG5vcm1hbGx5IGFwcGVhciBpbgotdGhlIFRBR1MgZmlsZS4gIFRvIGdldCBhcm91bmQgdGhpcywgc291cmNlIGZpbGVzIGNhbiBhZGQgdGhlIGNvbW1lbnQKLQotLyogVEFHUzogZm9vMSBmb28yICovCi0KLXdoZXJlIGZvbzEsIGZvbzIgYXJlIHByb2dyYW0gc3ltYm9scy4gIFN5bWJvbHMgZm91bmQgaW4gc3VjaCBjb21tZW50cwotYXJlIGdyZXBwYWJsZSBhbmQgYXBwZWFyIGluIHRoZSBUQUdTIGZpbGUuCi0MCi1HZW5lcmF0aW5nICJjb25maWd1cmUiIGZpbGVzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZvciB0YXJnZXRzIHVzaW5nIHRoZSBjb21tb24gZnJhbWV3b3JrLCAiY29uZmlndXJlIiBjYW4gYmUgZ2VuZXJhdGVkCi1ieSBydW5uaW5nIGBhdXRvY29uZicuCi0KLVRvIHJlZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBmaWxlcyBmb3IgYWxsIHRhcmdldHMgdXNpbmcgdGhlIGNvbW1vbiBmcmFtZXdvcms6Ci0KLQkkICBjZCBkZXZvL3NpbQotCSQgIG1ha2UgLWYgTWFrZWZpbGUuaW4gU0hFTEw9L2Jpbi9zaCBhdXRvY29uZi1jb21tb24KLQotVG8gYWRkIGEgY2hhbmdlLWxvZyBlbnRyeSB0byB0aGUgQ2hhbmdlTG9nIGZpbGUgZm9yIGVhY2ggdXBkYXRlZAotZGlyZWN0b3J5IChXQVJOSU5HIC0gY2hlY2sgdGhlIG1vZGlmaWVkIG5ldy1DaGFuZ2VMb2cgZmlsZXMgYmVmb3JlCi1yZW5hbWluZyk6Ci0KLQkkICBtYWtlIC1mIE1ha2VmaWxlLmluIFNIRUxMPS9iaW4vc2ggYXV0b2NvbmYtY2hhbmdlbG9nCi0JJCAgbW9yZSAqL25ldy1DaGFuZ2VMb2cKLQkkICBtYWtlIC1mIE1ha2VmaWxlLmluIFNIRUxMPS9iaW4vc2ggYXV0b2NvbmYtaW5zdGFsbAotCi1JbiBhIHNpbWlsYXIgdmVpbiwgYm90aCB0aGUgY29uZmlndXJlIGFuZCBjb25maWcuaW4gZmlsZXMgY2FuIGJlCi11cGRhdGVkIHVzaW5nIHRoZSBzZXF1ZW5jZToKLQotCSQgIGNkIGRldm8vc2ltCi0JJCAgbWFrZSAtZiBNYWtlZmlsZS5pbiBTSEVMTD0vYmluL3NoIGF1dG9oZWFkZXItY29tbW9uCi0JJCAgbWFrZSAtZiBNYWtlZmlsZS5pbiBTSEVMTD0vYmluL3NoIGF1dG9oZWFkZXItY2hhbmdlbG9nCi0JJCAgbW9yZSAqL25ldy1DaGFuZ2VMb2cKLQkkICBtYWtlIC1mIE1ha2VmaWxlLmluIFNIRUxMPS9iaW4vc2ggYXV0b2hlYWRlci1pbnN0YWxsCi0MCi10Y29uZmlnLmluCi09PT09PT09PT09Ci0KLUZpbGUgdGNvbmZpZy5pbiBkZWZpbmVzIG9uZSBvciBtb3JlIHRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcwotKGUuZy4gYSB0bS5oIGZpbGUpLiAgVGhlcmUgYXJlIHZlcnkgZmV3IHRoYXQgbmVlZCBkZWZpbmluZy4KLUZvciBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0sIHNlZSBjb21tb24vdGNvbmZpZy5pbi4KLUl0IGNvbnRhaW5zIHRoZW0gYWxsLCBjb21tZW50ZWQgb3V0LgotVGhlIGludGVudCBpcyB0aGF0IGEgbmV3IHBvcnQgY2FuIGp1c3QgY29weSB0aGlzIGZpbGUgYW5kCi1kZWZpbmUgdGhlIG9uZXMgaXQgbmVlZHMuCi0MCi1DIExhbmd1YWdlIEFzc3VtcHRpb25zCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBwcm9ncmFtbWVyIG1heSBhc3N1bWUgdGhhdCB0aGUgc2ltdWxhdG9yIGlzIGJlaW5nIGJ1aWx0IHVzaW5nIGFuCi1BTlNJIEMgY29tcGlsZXIgdGhhdCBzdXBwb3J0cyBhIDY0IGJpdCBkYXRhIHR5cGUuICBDb25zZXF1ZW50bHk6Ci0KLQlvCXByb3RvdHlwZXMgY2FuIGJlIHVzZWQgKGFsdGhvdWdoIHVzaW5nCi0JCVBBUkFNUygpIGFuZCBLJlIgZGVjbGFyYXRpb25zIHdvdWxkbid0Ci0JCWdvIGFzdHJheSkuCi0KLQlvCUlmIHNpbS10eXBlcy5oIGlzIGluY2x1ZGVkLCB0aGUgdHdvCi0JCXR5cGVzIHNpZ25lZDY0IGFuZCB1bnNpZ25lZDY0IGFyZQotCQlhdmFpbGFibGUuCi0KLQlvCVRoZSB0eXBlIGB1bnNpZ25lZCcgaXMgdmFsaWQuCi0KLUhvd2V2ZXIsIHRoZSB1c2VyIHNob3VsZCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JbwlHQ0MncyBgPG51bWJlcj5MTCcgaXMgTk9UIGFjY2VwdGFibGUuCi0JCU1pY3Jvc29mdC1DIGRvZXNuJ3QgcmVjb25pemUgaXQuCi0KLQlvCU1TQydzIGA8bnVtYmVyPmk2NCcgaXMgTk9UIGFjY2VwdGFibGUuCi0JCUdDQyBkb2Vzbid0IHJlY29uaXplIGl0LgotCi0JbwlHQ0MncyBgbG9uZyBsb25nJyBNU0MncyBgX2ludDY0JyBjYW4KLQkJTk9UIGJlIHVzZWQgdG8gZGVmaW5lIDY0IGJpdCBpbnRlZ2VyIGRhdGEKLQkJdHlwZXMuCi0KLQlvCUFuIGVtcHR5IGFycmF5IChlZyBpbnQgYVswXSkgaXMgbm90IHZhbGlkLgotCi1XaGVuIGJ1aWxkaW5nIHdpdGggR0NDIGl0IGlzIGVmZmVjdGl2bHkgYSByZXF1aXJlbWVudCB0aGF0Ci0tLWVuYWJsZS1idWlsZC13YXJuaW5ncz0sLVdlcnJvciBiZSBzcGVjaWZpZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24uCi0MCi0iZHVtcCIgY29tbWFuZHMgdW5kZXIgZ2RiCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWdkYmluaXQuaW4gY29udGFpbnMgdGhlIGZvbGxvd2luZwotCi1kZWZpbmUgZHVtcAotc2V0IHNpbV9kZWJ1Z19kdW1wICgpCi1lbmQKLQotU2ltdWxhdG9ycyB0aGF0IGRlZmluZSB0aGUgc2ltX2RlYnVnX2R1bXAgZnVuY3Rpb24gY2FuIHRoZW4gaGF2ZSB0aGVpcgotaW50ZXJuYWwgc3RhdGUgcHJldHR5IHByaW50ZWQgZnJvbSBnZGIuCi0KLUZJWE1FOiBUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIGVsYWJvcmF0ZS4gIEFzIG5lZWRlZCBpdCB3aWxsIGJlLgotDAotUmVidWlsZGluZyBubHR2YWxzLmRlZgotPT09PT09PT09PT09PT09PT09PT09PQotCi1DaGVja291dCBhIGNvcHkgb2YgdGhlIFNJTSBhbmQgTElCR0xPU1MgbW9kdWxlcyAoVW5sZXNzIHlvdSd2ZSBhbHJlYWR5Ci1nb3Qgb25lIHRvIGhhbmQpOgotCi0JJCAgbWtkaXIgL3RtcC8kJAotCSQgIGNkIC90bXAvJCQKLQkkICBjdnMgY2hlY2tvdXQgc2ltLW5vLXRlc3RzdWl0ZSBsaWJnbG9zcy1uby10ZXN0c3VpdGUgbmV3bGliLW5vLXRlc3RzdWl0ZQotCi1Db25maWd1cmUgdGhpbmdzIGZvciBhbiBhcmJpdHJhcnkgc2ltdWxhdG9yIHRhcmdldCAoSSd2ZSBkMTB2IGZvcgotY29udmVuaWVuY2UpOgotCi0JJCAgbWtkaXIgL3RtcC8kJC9idWlsZAotCSQgIGNkIC90bXAvJCQvYnVpbGQKLQkkICAvdG1wLyQkL2Rldm8vY29uZmlndXJlIC0tdGFyZ2V0PWQxMHYtZWxmCi0KLUluIHRoZSBzaW0vY29tbW9uIGRpcmVjdG9yeSByZWJ1aWxkIHRoZSBoZWFkZXJzOgotCi0JJCAgY2Qgc2ltL2NvbW1vbgotCSQgIG1ha2UgaGVhZGVycwotCi1UbyBhZGQgYSBuZXcgdGFyZ2V0OgotCi0JZGV2by9zaW0vY29tbW9uL2dlbm5sdHZhbHMuc2gKLQotCQlBZGQgeW91ciBuZXcgcHJvY2Vzc29yIHRhcmdldCAoeW91J2xsIG5lZWQgdG8gZ3J1YgotCQlhcm91bmQgdG8gZmluZCB3aGVyZSB5b3VyIHN5c2NhbGwuaCBsaXZlcykuCi0KLQlkZXZvL3NpbS88cHJvY2Vzc29yPi9NYWtlZmlsZS5pbgotCi0JCUFkZCB0aGUgZGVmaW5pdGlvbjoKLQotCQkJYGBOTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9kMTB2JycKLQotCQlqdXN0IGJlZm9yZSB0aGUgbGluZSBDT01NT05fUE9TVF9DT05GSUdfRlJBRy4KLQotCWRldm8vc2ltLzxwcm9jZXNzb3I+LyouW2NoXQotCi0JCUluY2x1ZGUgdGFyZy12YWxzLmggaW5zdGVhZCBvZiBzeXNjYWxsLmguCi0KZGlmZiAtLWdpdCBhL3NpbS9hcm0vQ09QWUlORyBiL3NpbS9hcm0vQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zaW0vYXJtL0NoYW5nZUxvZyBiL3NpbS9hcm0vQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I3ODk1Li4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLTIwMDAtMDUtMjUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybWNvcHJvLmMgKE1NVU1DUik6IE9ubHkgaW5kaWNhdGUgbW9kZSBjaGFuZ2UgaWYgYSBzaW5nYWwgaGFzCi0JcmVhbGx5IGNoYW5nZWQuCi0JKE1NVVdyaXRlKTogT25seSBpbmRpY2F0ZSBtb2RlIGNoYW5nZSBpZiBhIHNpbmdhbCBoYXMgcmVhbGx5Ci0JY2hhbmdlZC4KLQotCSogYXJtZGVmcy5oIChTWVNURU1NT0RFKTogRGVmaW5lLgotCShCQU5LX0NBTl9BQ0VFU1NfU1BTUik6IERlZmluZS4KLQotCSogYXJtZW11LmMgKEFSTV9FbXVsYXRlMjYpOiBJZiB0aGUgbW9kZSBoYXMgY2hhbmdlZCBhbGxvdyB0aGUgUEMKLQl0byBhZHZhbmNlIGJlZm9yZSBzdG9wcGluZyB0aGUgZW11bGF0aW9uLgotCi0JKiBhcm1pbml0LmMgKEFSTXVsX1Jlc2V0KTogRW5zdXJlIE1vZGUgZmllbGQgb2YgU3RhdGUgaXMgc2V0Ci0JY29ycmVjdGx5LgotCi0JKiBhcm1vcy5jIChBUk11bF9PU0luaXQpOiBDcmVhdGUgYSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgZm9yCi0JU3lzdGVtIG1vZGUuCi0KLQkqIGFybXN1cHAuYyAoTW9kZVRvQmFuayk6IFJlbW92ZSB1bnVzZWQgZmlyc3QgcGFyYW1ldGVyLgotCUFkZCBzdXBwb3J0IGZvciBTeXN0ZW0gTW9kZS4KLQkoQVJNdWxfR2V0U1BTUik6IFVzZSBCQU5LX0NBTl9BQ0NFU1NfU1BTUiBtYWNyby4KLQkoQVJNdWxfU2V0U1BTUik6IFVzZSBCQU5LX0NBTl9BQ0NFU1NfU1BTUiBtYWNyby4KLQkoQVJNdWxfRml4U1BTUik6IFVzZSBCQU5LX0NBTl9BQ0NFU1NfU1BTUiBtYWNyby4KLQkoQVJNdWxTd2l0Y2hNb2RlKTogQWRkIHN1cHBvcnQgZm9yIFN5c3RlbSBNb2RlLgotCi1XZWQgTWF5IDI0IDE0OjQwOjM0IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0yMDAwLTA1LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB3cmFwcGVyLmMgKHNpbV9zdG9yZV9yZWdpc3Rlcik6IFNwZWNpYWwgaGFuZGxpbmcgZm9yIENQU1IKLQlyZWdpc3Rlci4KLQotMjAwMC0wMy0xMSAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogYXJtZW11LmMgKExvYWRTTXVsdCwgTG9hZE11bHQpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGFib3J0cy4KLQlQYXRjaCBmcm9tIEFsbGFuIFNraWxsbWFuIDxBbGxhbi5Ta2lsbG1hbkBhcm0uY29tPi4KLQotV2VkIE1hciAyMiAxNToyNDoyMSAyMDAwICBnbGVuIG1jY3JlYWR5ICA8Z2ttQHBvYm94LmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fb3BlbixzaW1fY2xvc2UpOiBDb3B5IGludG8gbXluYW1lLCBmcmVlIG15bmFtZS4KLQotMjAwMC0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0JKiBhcm1jb3Byby5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0JKiBhcm1kZWZzLmg6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZyBtZXNzYWdlcy4KLQkqIGFybWVtdS5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0JKiBhcm1lbXUuaDogRml4IGNvbXBpbGUgdGltZSB3YXJuaW5nIG1lc3NhZ2VzLgotCSogYXJtb3MuYzogRml4IGNvbXBpbGUgdGltZSB3YXJuaW5nIG1lc3NhZ2VzLgotCSogYXJtc3VwcC5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0JKiBhcm12aXJ0LmM6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZyBtZXNzYWdlcy4KLQkqIGJhZy5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0JCi0yMDAwLTAyLTAyICBCZXJuZCBTY2htaWR0ICA8YmVybmRzQGN5Z251cy5jby51az4KLQotCSogKi5bY2hdOiBVc2UgaW5kZW50IHRvIG1ha2UgcmVhZGFibGUuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybW9zLmMgKFNXSXJlYWQpOiBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgaHVnZSByZWFkIGlzCi0JcGVyZm9ybWVkLgotCShTV0l3cml0ZSk6IEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYgYSBodWdlIHdyaXRlIGlzCi0JcGVyZm9ybWVkLgotCi0xOTk5LTEwLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0aHVtYmVtdS5jIChBUk11bF9UaHVtYkRlY29kZSk6IEFjY2VwdCAweGJlYmUgYXMgYSB0aHVtYgotCWJyZWFrcG9pbnQuIAotCi0xOTk5LTEwLTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoU1dJb3Blbik6IEFsd2F5cyBwYXNzIHRoaXJkIHBhcmFtZXRlciB3aXRoIDA2NjYgc2luY2UKLQlvdGhlcndpc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgZ2V0cyBhY2Nlc3MgaWYgdGhlIE9fQ1JFQVQgYml0IGlzCi0Jc2V0IGFuZCBzbyB3ZSBwb3NzaWJseSBjYW5ub3QgYWNjZXNzIHRoZSBmaWxlIGFmdGVyd2FyZHMuCi0KLTE5OTktMDktMjkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoU1dJV3JpdGUwKTogU2VuZCBvdXRwdXQgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLgotCShBUk11bF9PU0hhbmRsZVNXSSwgY2FzZSBTV0lfV3JpdGVDLEFuZ2VsU1dJX1JlYXNvbl9Xcml0ZUMpOiBEaXR0by4KLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLTE5OTktMDQtMDYgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+Ci0KLQkqIHdyYXBwZXIuYyAoc3RvcF9zaW11bGF0b3IpOiBOZXcgZ2xvYmFsLgotCShzaW1fc3RvcCk6IFNldCBzaW0gc3RhdGUgdG8gU1RPUCBhbmQgc2V0Ci0Jc3RvcF9zaW11bGF0b3IuCi0JKHNpbV9yZXN1bWUpOiBSZXNldCBzdG9wX3NpbXVsYXRvci4KLQkoc2ltX3N0b3BfcmVhc29uKTogSWYgc3RvcF9zaW11bGF0b3IgaXMgc2V0LCB0ZWxsIGdkYgotCXRoYXQgdGhlIHdlIHRvb2sgU0lHSU5ULgotCSogYXJtZW11LmMgKEFSTXVsX0VtdWxhdGUyNik6IERvbid0IGxvb3AgZm9yZXZlci4gU3RvcCBpZgotCXN0b3Bfc2ltdWxhdG9yIGlzIHNldC4KLQotMTk5OS0wNC0wMiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogYXJtZW11LmMgKEFSTXVsX0VtdWxhdGUyNik6IElmIE5FRURfVUlfTE9PUF9IT09LLCBjYWxsIHVpX2xvb3BfaG9vawotCXdoZW5ldmVyIHRoZSBjb3VudGVyIGV4cGlyZXMuCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0NGTEFHUyk6IEluY2x1ZGUgZGVmaW5lIE5FRURfVUlfTE9PUF9IT09LLgotCi0xOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm1lbXUuYyAoQVJNdWxfRW11bGF0ZTI2KTogSGFuZGxlIG5ldyBicmVha3BvaW50IHZhbHVlLgotCSogdGh1bWJlbXUuYyAoQVJNdWxfVGh1bWJEZWNvZGUpOiBIYW5kbGUgbmV3IGJyZWFrcG9pbnQgdmFsdWUuCi0KLU1vbiBTZXAgMTQgMDk6MDA6MDUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fb3Blbik6IFNldCBlbmRpYW5uZXNzIGFjY29yZGluZyB0byBCRkQgb3IgY29tbWFuZAotCWxpbmUgc3dpdGNoLgotCi0JKiB0Y29uZmlnLmluOiBEZWZpbmUgU0lNX0hBVkVfQklFTkRJQU4uCi0KLVRodSBBdWcgMjcgMTE6MDA6MDUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtZW11LmMgKE11bHRpcGx5NjQpOiBUZXN0IGZvciBSbSAocmF0aGVyIHRoYW4gUnMpIG5vdCBiZWluZwotCXRoZSBzYW1lIGFzIGVpdGhlciBSZEhpIG9yIFJkTG8uCi0KLVRodSBKdWwgIDIgMTA6MjQ6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0k6IEFuZ2VsU1dJX1JlYXNvbl9SZXBvcnRFeGNlcHRpb24pOgotCVNldCBSZWdbMF0gYmFzZWQgb24gcmVhc29uIGZvciBmb3IgdGhlIGV4Y2VwdGlvbi4KLQotVGh1IEp1biAgNCAxNToyMjowMyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogYXJtb3MuYyAoU1dJd3JpdGUwKTogTmV3IGZ1bmN0aW9uLgotCShXcml0ZUNvbW1hbmRMaW5lVG8pOiBOZXcgZnVuY3Rpb24uCi0JKFNXSW9wZW4pOiBOZXcgZnVuY3Rpb24uCi0JKFNXSXJlYWQpOiBOZXcgZnVuY3Rpb24uCi0JKFNXSXdyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShTV0lmbGVuKTogTmV3IGZ1bmN0aW9uLgotCShBUk11bF9PU0hhbmRsZVNXSSk6IENhbGwgbmV3IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGhhbmRsaW5nCQotCXRoZXNlIGhlcmUuCi0JKEFSTXVsX09TSGFuZGxlU1dJKTogSGFuZGxlIEFuZ2VsIFNXSXMgY29ycmVjdGx5LgotCSgqKTogUmVmb3JtYXQgc3BhY2luZyB0byBiZSBhIGJpdCBtb3JlIEdOVWx5LgotCU1vc3QgY29kZSB0YWtlbiBmcm9tIGEgcGF0Y2ggYnkgQW50aG9ueSBUaG9tcHNvbiAKLQkoYXRob21wc29AY2FtYnJpZGdlLmFybS5jb20pCi0KLVR1ZSBKdW4gIDIgMTU6MjI6MjIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuaDogQWRkIEFuZ2VsIFNXSSBhbmQgaXRzIHJlYXNvbiBjb2Rlcy4KLQkqIGFybW9zLmMgKEFSTXVsX09TSGFuZGxlU1dJKTogSWdub3JlIEFuZ2VsIFNXSXMgKGZvciBub3cpLgotCi1Nb24gSnVuICAxIDE3OjE0OjE5IDE5OTggIEFudGhvbnkgVGhvbXBzb24gKGF0aG9tcHNvQGNhbWJyaWRnZS5hcm0uY29tKQotCi0JKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSTo6U1dJX09wZW4pOiBIYW5kbGUgc3BlY2lhbCBjYXNlCi0Jb2YgIjp0dCIgdG8gY2F0Y2ggc3RkaW4gaW4gYWRkaXRpb24gdG8gc3Rkb3V0LgotCShBUk11bF9PU0hhbmRsZVNXSTo6U1dJX1NlZWspOiBSZXR1cm4gMCBvciAxIHRvIGluZGljYXRlIGZhaWx1cmUKLQlvciBzdWNjZXNzIG9mIGxzZWVrKCkuCi0KLVdlZCBNYXkgMjAgMTc6MzY6MjUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0kpOiBTcGVjaWFsIGNhc2UgY29kZSB0byBjYXRjaCBhdHRlbXB0cwotCXRvIG9wZW4gc3Rkb3V0LgotCi1XZWQgQXByIDI5IDE1OjI5OjU1IDE5OTggIEplZmYgSm9obnN0b24gIDxqam9obnN0bkBjeWdudXMuY29tPgotCi0JKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSSk6IEFkZGVkIGNvZGUgZm9yIFNXSV9DbG9jaywKLQlTV0lfRmxlbiwgYW5kIFNXSV9UaW1lLiAgQWxzbyBmaXhlZCBTV0lfU2VlayBjb2RlIHRvIG9ubHkKLQlzZWVrIGZyb20gb2Zmc2V0IDAgYW5kIG5vdCB0byB1c2UgUjIgZm9yIHdoZW5jZSBzaW5jZSBpdCBpcwotCW5vdCBwYXNzZWQgYXMgcGFydCBvZiB0aGUgU1dJIGNhbGwuCi0KLVR1ZSBBcHIgMjggMTg6MzM6MzEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjI2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToyMDoxOSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIE1hciAxMCAwOToyNjozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm1vcHRzLmg6IFJlbW92ZSBkZWZpbml0aW9uIG9mIExJVFRMRU5EIC0gaXQgaXMgbm90IHVzZWQuCi0KLVR1ZSBGZWIgMTcgMTI6MzU6NTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB3cmFwcGVyLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgotIAlsZW5ndGggcGFyYW1ldGVyLiBSZXR1cm4gLTEuCi0KLVN1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVNhdCBKYW4gMzEgMTg6MTU6NDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBKYW4gMTkgMjI6MjY6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBEZWMgMTUgMjM6MTc6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1UdWUgRGVjICA5IDExOjMwOjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHdpdGggY2hhbmdlcyBmcm9tIGJyYW5jaC4KLQkqIGFybWRlZnMuaDogICBkaXR0bwotCSogYXJtZW11LmM6ICAgIGRpdHRvICAgdGhlc2UgY2hhbmdlcwotCSogYXJtZW11Lmg6ICAgIGRpdHRvICAgYWRkIHN1cHBvcnQgZm9yCi0JKiBhcm1vcy5jOiAgICAgZGl0dG8gICB0aGUgVGh1bWIgaW5zdHJ1Y3Rpb24KLQkqIGFybXN1cHAuYzogICBkaXR0byAgIHNldCBhbmQgdGhlIG5ldyB2NAotCSogYXJtdmlydC5jOiAgIGRpdHRvICAgYXJjaGl0ZWN0dXJlLgotCSogd3JhcHBlci5jOiAgIGRpdHRvCi0JKiB0aHVtYmVtdS5jOiAgTmV3IGZpbGUgZnJvbSBicmFuY2guCi0KLQotVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBPY3QgMzAgMTM6NTQ6MDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0kpOiBBZGQgc3VwcG9ydCBmb3IgR2V0RW52IFNXSS4gIFBhdGNoCi0JZnJvbSBUb255IFRob21wc29uIGF0IEFSTTogYXRob21wc29AYXJtLmNvbSAKLQotCSogd3JhcHBlci5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIGNvZGUgdG8gY3JlYXRlIGFuIGV4ZWN1dGlvbgotCWVudmlyb25tZW50LiAgUGF0Y2ggZnJvbSBUb255IFRob21wc29uIGF0IEFSTTogYXRob21wc29AYXJtLmNvbQotCi1XZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCi0gCXNpbV9sb2FkX2ZpbGUuCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1UdWUgQXVnIDI2IDEwOjM3OjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fa2lsbCk6IERlbGV0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgotCi1Nb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotTW9uIEF1ZyAyNSAxNTozNTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHdyYXBwZXIuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotVHVlIE1heSAyMCAxMDoxMzoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHdyYXBwZXIuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRHJvcCBTSU1fREVTQyBhcmd1bWVudC4KLQotVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBBcHIgMTggMTM6MzI6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB3cmFwcGVyLmMgKHNpbV9zdG9wKTogU3R1YiBzaW1fc3RvcCBmdW5jdGlvbi4KLQotVGh1IEFwciAxNyAxODozMzowMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXJtaW5pdC5jIChBUk11bF9OZXdTdGF0ZSk6IFByZWluaXRpYWxpemUgdGhlIHN0YXRlIHRvCi0JYWxsIHplcm8vTlVMTC4KLQotVGh1IEFwciAxNyAwMjozOTowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWxvYWQuby4KLQkqIHdyYXBwZXIuYyAoc2ltX2tpbmQsbXluYW1lKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuCi0JKHNpbV9sb2FkKTogQ2FsbCBzaW1fbG9hZF9maWxlIHRvIGRvIHdvcmsuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgc3RhcnRfYWRkcmVzcyBhcmcuCi0KLVRodSBBcHIgMTcgMTE6NDg6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB3cmFwcGVyLmMgKHNpbV90cmFjZSk6IFVwZGF0ZSBzbyB0aGF0IGl0IG1hdGNoZXMgcHJvdG90eXBlLgotCi1Nb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1Nb24gQXByICA3IDEyOjAxOjE3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYXJtZW11MzIubyk6IFJlcGxhY2UgJDwgd2l0aCBhdXRvY29uZiByZWNvbW1lbmRlZAotIAkkKHNyY2RpcikvLi4uLgotCShhcm1lbXUyNi5vKTogRGl0dG8uCi0KLVdlZCBBcHIgIDIgMTU6MDY6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgIDIgMTQ6NTA6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLVdlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBNYXIgMTMgMTI6Mzg6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JhcHBlci5jIChzaW1fb3Blbik6IEhhcyByZXN1bHQgbm93LgotCShzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KLQotVHVlIEZlYiAgNCAxMzoyMjoyMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHQCk6IFVzZQotCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEphbiAyMyAxMTo0NjoyMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKLQlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgotCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KLQltYWtlZmlsZSBmcmFnbWVudC4KLQotV2VkIE5vdiAyMCAwMTowNToxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBydW4uYzogRGVsZXRlZCwgdXNlIG9uZSBpbiAuLi9jb21tb24gbm93LgotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBldmVyeXRoaW5nIHRoYXQncyBiZWVuIG1vdmVkIHRvCi0JLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fT0JKUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUuCi0JKiBhcm1vcy5jOiAjaW5jbHVkZSBjb25maWcuaC4KLQkqIHdyYXBwZXIuYyAobWVtX3NpemUpOiBWYWx1ZSBpcyBpbiBieXRlcyBub3cuCi0JKHNpbV9jYWxsYmFjayk6IE5ldyBnbG9iYWwuCi0JKGFybV9zaW1fc2V0X3Byb2ZpbGV7LF9zaXplfSk6IERlbGV0ZS4KLQkoYXJtX3NpbV9zZXRfbWVtX3NpemUpOiBSZW5hbWUgdG8gc2ltX3NpemUuCi0JKHNpbV9kb19jb21tYW5kKTogQ2FsbCBwcmludGZfZmlsdGVyZWQgdmlhIGNhbGxiYWNrLgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IFJlY29yZCBjYWxsYmFjay4KLQotVGh1IE9jdCAgMyAxNjoxMDoyNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQotV2VkIEp1biAyNiAxMjoxNzoyNCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIEZlYiAyMSAxMjoxNDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotRnJpIERlYyAxNSAxNjoyNzozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotTW9uIE5vdiAyMCAxNzo0MDozOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBydW4uYzogSW5jbHVkZSAiZ2V0b3B0LmgiLgotCSh2ZXJib3NlKTogRGVsZXRlLgotCSh1c2FnZSk6IE1ha2Ugc3RhdGljLgotCShtYWluKTogQ2FsbCBhcm1fc2ltX3NldF92ZXJib3NpdHkuCi0JT25seSBsb2FkIHNlY3Rpb25zIG1hcmtlZCBTRUNfTE9BRC4KLQkqIHdyYXBwZXIuYyAobWVtX3NpemUsIHZlcmJvc2l0eSk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShhcm1fc2ltX3NldF9tZW1fc2l6ZSk6IFJlbmFtZWQgZnJvbSBzaW1fc2l6ZS4JQ2FsbGVycyB1cGRhdGVkLgotCShhcm1fc2ltX3NldF9wcm9maWxleyxfc2l6ZX0pOiBSZW5hbWVkIGZyb20gc2ltX2Zvby4gIENhbGxlcnMgdXBkYXRlZC4KLQkKLUZyaSBOb3YgMTcgMTk6MzU6MTEgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJtZGVmcy5oIChBUk11bF9TdGF0ZSk6IE5ldyBtZW1iZXIgYHZlcmJvc2UnLgotCSogYXJtcmRpLmMgKEFSTXVsX0NvbnNvbGVQcmludCk6IEFkZCBtaXNzaW5nIHZhX2VuZC4KLQkqIHJ1bi5jICh2ZXJib3NlKTogTWFrZSBnbG9iYWwuCi0JKiB3cmFwcGVyLmMgKGluaXQpOiBTZXQgc3RhdGUtPnZlcmJvc2UuCi0JKEFSTXVsX0NvbnNvbGVQcmludCk6IERvbid0IHByaW50IGFueXRoaW5nIGlmICF2ZXJib3NlLgotCi1GcmkgT2N0IDEzIDE1OjMwOjMwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFybW9zLmM6ICNpbmNsdWRlIGRiZ19yZGkuaC4KLQkoQVJNdWxfT1NIYW5kbGVTV0kpOiBIYW5kbGUgU1dJX0JyZWFrcG9pbnQuCi0JKiBhcm1vcy5oIChTV0lfQnJlYWtwb2ludCk6IERlZmluZS4KLQkqIHdyYXBwZXIuYzogI2luY2x1ZGUgYXJtZW11LmgsIGRiZ19yZGkuaC4KLQkocmMpOiBEZWxldGUuCi0JKHNpbV9yZXN1bWUpOiBVc2Ugc3RhdGUtPkVuZENvbmRpdGlvbiB0byByZWNvcmQgc3RvcCBzdGF0ZS4KLQlDYWxsIEZMVVNIUElQRSBiZWZvcmUgcmV0dXJuaW5nLgotCShzaW1fc3RvcF9yZWFzb24pOiBEZXRlcm1pbmUgcmVhc29uIGZyb20gc3RhdGUtPkVuZENvbmRpdGlvbi4KLQotRnJpIE9jdCAxMyAxNTowNDowNSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cmFwcGVyLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogTmV3LgotCi1UaHUgU2VwIDI4IDE5OjQ1OjU2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0kpOiBSZXN1bHQgb2YgcmVhZC93cml0ZSBjYWxscyBpcwotCW51bWJlciBvZiBieXRlcyBub3QgcmVhZC93cml0dGVuIChvciAtMSkuCi0KLVdlZCBTZXAgMjAgMTM6MzU6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLUZyaSBTZXAgIDggMTQ6Mjc6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBBQ19QUk9HX0lOU1RBTEwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFJldmVydCB0byB1c2luZyBpbnN0YWxsLnNoLgotCShJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFNldCB0byAkKElOU1RBTEwpLgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlc3RvcmUuCi0JKG1vc3RseWNsZWFuKTogTWFrZSB0aGUgc2FtZSBhcyBjbGVhbiwgbm90IGRpc3RjbGVhbi4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotVGh1IFNlcCAgNyAxMjowMDoxNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKFRyeSB0bykgVXBkYXRlIHRvIG5ldyBiZmQgYXV0b2NvbmYgc2NoZW1lLgotCSogcnVuLmM6IERvbid0IGluY2x1ZGUgc3lzZGVwLmguCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTHssX1BST0dSQU0sX0RBVEF9KTogVXNlIGF1dG9jb25mIGNvbXB1dGVkIHZhbHVlLgotCShDQywgQ0ZMQUdTLCBBUiwgUkFOTElCKTogTGlrZXdpc2UuCi0JKEhERUZJTkVTLCBUREVGSU5FUyk6IERlZmluZS4KLQkoQ0NfRk9SX0JVSUxEKTogRGVsZXRlLgotCShob3N0X21ha2VmaWxlX2ZyYWcpOiBEZWxldGUuCi0JKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIG9uIGZyYWdzLgotCSogY29uZmlndXJlLmluIChzeXNkZXAuaCk6IERvbid0IGNyZWF0ZSBzeW1saW5rLgotCShob3N0X21ha2VmaWxlX2ZyYWcsIGZyYWdzKTogRGVsZXRlZC4KLQkoQ0MsIENGTEFHUywgQVIsIFJBTkxJQiwgSU5TVEFMTCk6IENvbXB1dGUgdmFsdWVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KLQotV2VkIEp1bCAgNSAxNjoxNTo1NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBydW4sIGxpYnNpbS5hLgotCi0gCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogY29udmVydGVkIHRvIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0Y29uZiAyLjQuCi0KLQkqIGFybS5tdDogUmVtb3ZlZC4KLQotRnJpIEp1biAzMCAxNjo0OTo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIHdyYXBwZXIuYyAoc2ltX2RvX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBKdW4gMTMgMTA6NTc6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0kpOiBOZXcgdmVyc2lvbiB0byB3b3JrIHdpdGgKLQluZXdsaWIgc2ltcGx5LgotCi1UaHUgSnVuICA4IDE0OjM3OjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogR3JhYiByZXR1cm4gdmFsdWUgZnJvbSByaWdodCByZWdpc3Rlci4KLQotV2VkIE1heSAyNCAxNDozNzozMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBOZXcuCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9NYWtlZmlsZS5pbiBiL3NpbS9hcm0vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTliY2EuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIGFybSBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLVNJTV9FWFRSQV9DRkxBR1MgPSAtRE1PREVUIC1ETkVFRF9VSV9MT09QX0hPT0sKLQotQ09QUk89QENPUFJPQAotCi1TSU1fT0JKUyA9IGFybWVtdTI2Lm8gYXJtZW11MzIubyBhcm1pbml0Lm8gYXJtb3MubyBhcm1zdXBwLm8gXAotCWFybXZpcnQubyBiYWcubyB0aHVtYmVtdS5vIHdyYXBwZXIubyBzaW0tbG9hZC5vICQoQ09QUk8pIAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi0KLWFybW9zLm86IGFybW9zLmMgYXJtZGVmcy5oIGFybW9zLmggYXJtZnBlLmgKLQotYXJtY29wcm8ubzogYXJtY29wcm8uYyBhcm1kZWZzLmgKLQotYXJtZW11MjYubzogYXJtZW11LmMgYXJtZGVmcy5oIGFybWVtdS5oIAotCSQoQ0MpIC1jICQ8IC1vIGFybWVtdTI2Lm8gJChBTExfQ0ZMQUdTKQotCi1hcm1lbXUzMi5vOiBhcm1lbXUuYyBhcm1kZWZzLmggYXJtZW11LmgKLQkkKENDKSAtYyAkPCAtbyBhcm1lbXUzMi5vIC1ETU9ERTMyICQoQUxMX0NGTEFHUykKLQotYXJtaW5pdC5vOiBhcm1pbml0LmMgYXJtZGVmcy5oIGFybWVtdS5oCi0KLWFybXJkaS5vOiBhcm1yZGkuYyBhcm1kZWZzLmggYXJtZW11LmggYXJtb3MuaCBkYmdfY3AuaCBkYmdfY29uZi5oIGRiZ19yZGkuaCBcCi0JZGJnX2hpZi5oIGNvbW11bmljYXRlLmgKLQotYXJtc3VwcC5vOiBhcm1zdXBwLmMgYXJtZGVmcy5oIGFybWVtdS5oCi0KLXRodW1iZW11Lm86IHRodW1iZW11LmMgYXJtZGVmcy5oIGFybWVtdS5oCi0KLWJhZy5vOiBiYWcuYyBiYWcuaApkaWZmIC0tZ2l0IGEvc2ltL2FybS9SRUFETUUuQ3lnbnVzIGIvc2ltL2FybS9SRUFETUUuQ3lnbnVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGZiNzY2Li4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vUkVBRE1FLkN5Z251cworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHN0YW5kYXJkIHJlbGVhc2Ugb2YgdGhlIEFSTXVsYXRvciBmcm9tCi1BZHZhbmNlZCBSSVNDIE1hY2hpbmVzLCBhbmQgd2FzIGZ0cCdkIGZyb20uCi0KLWZ0cC5jbC5jYW0uYWMudWs6L2FybS9nbnUKLQotSXQgbGlrZXMgdG8gdXNlIFRDUC9JUCBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgYW5kIHRoZSBob3N0LCB3aGljaCBpcwotbmljZSwgYnV0IGlzIGEgcGFpbiB0byB1c2UgdW5kZXIgYW55dGhpbmcgbm9uLXVuaXguCi0KLUkndmUgYWRkZWQgY3JlYXRlZCBhIG5ldyBNYWtlZmlsZS5pbiAodGhlIG9yaWdpbmFsIGluIE1ha2VmaWxlLm9yaWcpCi10byBidWlsZCBhIHZlcnNpb24gb2YgdGhlIHNpbXVsYXRvciB3aXRob3V0IHRoZSBUQ1AvSVAgc3R1ZmYsIGFuZCBhCi13cmFwcGVyLmMgdG8gbGluayBkaXJlY3RseSBpbnRvIGdkYiBhbmQgdGhlIHJ1biBjb21tYW5kLgotCi1JdCBzaG91bGQgYmUgcG9zc2libGUgKGJhcnJpbmcgbWFqb3IgY2hhbmdlcyBpbiB0aGUgbGF5b3V0IG9mCi10aGUgYXJtdWxhdG9yKSB0byB1cGdyYWRlIHRoZSBzaW11bGF0b3IgYnkgY29weWluZyBhbGwgdGhlIGZpbGVzCi1vdXQgb2YgYSByZWxlYXNlIGludG8gdGhpcyBkaXJlY3RvcnkgYW5kIHJlbmFtaW5nIHRoZSBNYWtlZmlsZS4KLQotKEV4Y2VwdCB0aGF0IEkgY2hhbmdlZCBhcm1vcy5jIHRvIHdvcmsgbW9yZSBzaW1wbHkgd2l0aCBvdXIKLXNpbXVsYXRvciByaWdzKQotCi1TdGV2ZQotCi1zYWNAY3lnbnVzLmNvbQotCi1Nb24gTWF5IDE1IDEyOjAzOjI4IFBEVCAxOTk1Ci0KLQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hY2NvbmZpZy5oIGIvc2ltL2FybS9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1jb3Byby5jIGIvc2ltL2FybS9hcm1jb3Byby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJlNjgwLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vYXJtY29wcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKiAgYXJtY29wcm8uYyAtLSBjby1wcm9jZXNzb3IgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDIwMDAgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXJtZGVmcy5oIgotI2luY2x1ZGUgImFybWVtdS5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLWV4dGVybiB1bnNpZ25lZCBBUk11bF9Db1Byb0luaXQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9FeGl0IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiB2b2lkIEFSTXVsX0NvUHJvQXR0YWNoIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBudW1iZXIsCi0JCQkgICAgICAgQVJNdWxfQ1BJbml0cyAqIGluaXQsIEFSTXVsX0NQRXhpdHMgKiBleGl0LAotCQkJICAgICAgIEFSTXVsX0xEQ3MgKiBsZGMsIEFSTXVsX1NUQ3MgKiBzdGMsCi0JCQkgICAgICAgQVJNdWxfTVJDcyAqIG1yYywgQVJNdWxfTUNScyAqIG1jciwKLQkJCSAgICAgICBBUk11bF9DRFBzICogY2RwLAotCQkJICAgICAgIEFSTXVsX0NQUmVhZHMgKiByZWFkLCBBUk11bF9DUFdyaXRlcyAqIHdyaXRlKTsKLWV4dGVybiB2b2lkIEFSTXVsX0NvUHJvRGV0YWNoIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBudW1iZXIpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bW15IENvLXByb2Nlc3NvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuc2lnbmVkIE5vQ29Qcm8zUiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQsIEFSTXdvcmQpOwotc3RhdGljIHVuc2lnbmVkIE5vQ29Qcm80UiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQsIEFSTXdvcmQsIEFSTXdvcmQpOwotc3RhdGljIHVuc2lnbmVkIE5vQ29Qcm80VyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQsIEFSTXdvcmQsIEFSTXdvcmQgKik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgIERlZmluZSBDby1Qcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gaGFuZGxlcnMgaGVyZSAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSGVyZSdzIEFSTXVsYXRvcidzIE1NVSBkZWZpbml0aW9uLiAgQSBmZXcgdGhpbmdzIHRvIG5vdGU6Ci0xKSBpdCBoYXMgZWlnaHQgcmVnaXN0ZXJzLCBidXQgb25seSB0d28gYXJlIGRlZmluZWQuCi0yKSB5b3UgY2FuIG9ubHkgYWNjZXNzIGl0cyByZWdpc3RlcnMgd2l0aCBNQ1IgYW5kIE1SQy4KLTMpIE1NVSBSZWdpc3RlciAwIChJRCkgcmV0dXJucyAweDQxNDQwMTEwCi00KSBSZWdpc3RlciAxIG9ubHkgaGFzIDQgYml0cyBkZWZpbmVkLiAgQml0cyAwIHRvIDMgYXJlIHVudXNlZCwgYml0IDQKLWNvbnRyb2xzIDMyLzI2IGJpdCBwcm9ncmFtIHNwYWNlLCBiaXQgNSBjb250cm9scyAzMi8yNiBiaXQgZGF0YSBzcGFjZSwKLWJpdCA2IGNvbnRyb2xzIGxhdGUgYWJvcnQgdGltaW1nIGFuZCBiaXQgNyBjb250cm9scyBiaWcvbGl0dGxlIGVuZGlhbi4KLSovCi0KLXN0YXRpYyBBUk13b3JkIE1NVVJlZ1s4XTsKLQotc3RhdGljIHVuc2lnbmVkCi1NTVVJbml0IChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBNTVVSZWdbMV0gPSBzdGF0ZS0+cHJvZzMyU2lnIDw8IDQgfAotICAgIHN0YXRlLT5kYXRhMzJTaWcgPDwgNSB8IHN0YXRlLT5sYXRlYWJ0U2lnIDw8IDYgfCBzdGF0ZS0+YmlnZW5kU2lnIDw8IDc7Ci0gIEFSTXVsX0NvbnNvbGVQcmludCAoc3RhdGUsICIsIE1NVSBwcmVzZW50Iik7Ci0gIHJldHVybiAoVFJVRSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotTU1VTVJDIChBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIHR5cGUgQVRUUklCVVRFX1VOVVNFRCwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCAqIHZhbHVlKQotewotICBpbnQgcmVnID0gQklUUyAoMTYsIDE5KSAmIDc7Ci0KLSAgaWYgKHJlZyA9PSAwKQotICAgICp2YWx1ZSA9IDB4NDE0NDAxMTA7Ci0gIGVsc2UKLSAgICAqdmFsdWUgPSBNTVVSZWdbcmVnXTsKLSAgcmV0dXJuIChBUk11bF9ET05FKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1NTVVNQ1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIHR5cGUgQVRUUklCVVRFX1VOVVNFRCwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCB2YWx1ZSkKLXsKLSAgaW50IHJlZyA9IEJJVFMgKDE2LCAxOSkgJiA3OwotCi0gIE1NVVJlZ1tyZWddID0gdmFsdWU7Ci0gIAotICBpZiAocmVnID09IDEpCi0gICAgewotICAgICAgQVJNd29yZCBwLGQsbCxiOwotCi0gICAgICBwID0gc3RhdGUtPnByb2czMlNpZzsKLSAgICAgIGQgPSBzdGF0ZS0+ZGF0YTMyU2lnOwotICAgICAgbCA9IHN0YXRlLT5sYXRlYWJ0U2lnOwotICAgICAgYiA9IHN0YXRlLT5iaWdlbmRTaWc7Ci0gICAgICAKLSAgICAgIHN0YXRlLT5wcm9nMzJTaWcgPSB2YWx1ZSA+PiA0ICYgMTsKLSAgICAgIHN0YXRlLT5kYXRhMzJTaWcgPSB2YWx1ZSA+PiA1ICYgMTsKLSAgICAgIHN0YXRlLT5sYXRlYWJ0U2lnID0gdmFsdWUgPj4gNiAmIDE7Ci0gICAgICBzdGF0ZS0+YmlnZW5kU2lnID0gdmFsdWUgPj4gNyAmIDE7Ci0KLSAgICAgIGlmIChwICE9IHN0YXRlLT5wcm9nMzJTaWcKLQkgIHx8IGQgIT0gc3RhdGUtPmRhdGEzMlNpZwotCSAgfHwgbCAhPSBzdGF0ZS0+bGF0ZWFidFNpZwotCSAgfHwgYiAhPSBzdGF0ZS0+YmlnZW5kU2lnKQotCXN0YXRlLT5FbXVsYXRlID0gQ0hBTkdFTU9ERTsJLyogRm9yY2UgQVJNdWxhdG9yIHRvIG5vdGljZSB0aGVzZSBub3cuICAqLwotICAgIH0KLSAgCi0gIHJldHVybiBBUk11bF9ET05FOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotTU1VUmVhZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSBBVFRSSUJVVEVfVU5VU0VELCB1bnNpZ25lZCByZWcsIEFSTXdvcmQgKiB2YWx1ZSkKLXsKLSAgaWYgKHJlZyA9PSAwKQotICAgICp2YWx1ZSA9IDB4NDE0NDAxMTA7Ci0gIGVsc2UgaWYgKHJlZyA8IDgpCi0gICAgKnZhbHVlID0gTU1VUmVnW3JlZ107Ci0gIHJldHVybiAoVFJVRSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotTU1VV3JpdGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIHJlZywgQVJNd29yZCB2YWx1ZSkKLXsKLSAgaWYgKHJlZyA8IDgpCi0gICAgTU1VUmVnW3JlZ10gPSB2YWx1ZTsKLSAgCi0gIGlmIChyZWcgPT0gMSkKLSAgICB7Ci0gICAgICBBUk13b3JkIHAsZCxsLGI7Ci0KLSAgICAgIHAgPSBzdGF0ZS0+cHJvZzMyU2lnOwotICAgICAgZCA9IHN0YXRlLT5kYXRhMzJTaWc7Ci0gICAgICBsID0gc3RhdGUtPmxhdGVhYnRTaWc7Ci0gICAgICBiID0gc3RhdGUtPmJpZ2VuZFNpZzsKLSAgICAgIAotICAgICAgc3RhdGUtPnByb2czMlNpZyA9IHZhbHVlID4+IDQgJiAxOwotICAgICAgc3RhdGUtPmRhdGEzMlNpZyA9IHZhbHVlID4+IDUgJiAxOwotICAgICAgc3RhdGUtPmxhdGVhYnRTaWcgPSB2YWx1ZSA+PiA2ICYgMTsKLSAgICAgIHN0YXRlLT5iaWdlbmRTaWcgPSB2YWx1ZSA+PiA3ICYgMTsKLQotICAgICAgCi0gICAgICBpZiAocCAhPSBzdGF0ZS0+cHJvZzMyU2lnCi0JICB8fCBkICE9IHN0YXRlLT5kYXRhMzJTaWcKLQkgIHx8IGwgIT0gc3RhdGUtPmxhdGVhYnRTaWcKLQkgIHx8IGIgIT0gc3RhdGUtPmJpZ2VuZFNpZykKLQlzdGF0ZS0+RW11bGF0ZSA9IENIQU5HRU1PREU7CS8qIEZvcmNlIEFSTXVsYXRvciB0byBub3RpY2UgdGhlc2Ugbm93LiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKiBXaGF0IGZvbGxvd3MgaXMgdGhlIFZhbGlkYXRpb24gU3VpdGUgQ29wcm9jZXNzb3IuICBJdCB1c2VzIHR3bwotY28tcHJvY2Vzc29yIG51bWJlcnMgKDQgYW5kIDUpIGFuZCBoYXMgdGhlIGZvbGx3aW5nIGZ1bmN0aW9uYWxpdHkuCi1TaXh0ZWVuIHJlZ2lzdGVycy4gIEJvdGggY28tcHJvY2Vzc29yIG51aW1iZXJzIGNhbiBiZSB1c2VkIGluIGFuIE1DUiBhbmQKLU1SQyB0byBhY2Nlc3MgdGhlc2UgcmVnaXN0ZXJzLiAgQ1AgNCBjYW4gTERDIGFuZCBTVEMgdG8gYW5kIGZyb20gdGhlCi1yZWdpc3RlcnMuICBDUCA0IGFuZCBDUCA1IENEUCAwIHdpbGwgYnVzeSB3YWl0IGZvciB0aGUgbnVtYmVyIG9mIGN5Y2xlcwotc3BlY2lmaWVkIGJ5IGEgQ1AgcmVnaXN0ZXIuICBDUCA1IENEUCAxIGlzc3VlcyBhIEZJUSBhZnRlciBhIG51bWJlciBvZgotY3ljbGVzIChzcGVjaWZpZWQgaW4gYSBDUCByZWdpc3RlciksIENEUCAyIGlzc3VlcyBhbiBJUlFXIGluIHRoZSBzYW1lCi13YXksIENEUCAzIGFuZCA0IHR1cm4gb2YgdGhlIEZJUSBhbmQgSVJRIHNvdXJjZSwgYW5kIENEUCA1IHN0b3JlcyBhIDMyCi1iaXQgdGltZSB2YWx1ZSBpbiBhIENQIHJlZ2lzdGVyIChhY3R1YWxseSBpdCdzIHRoZSB0b3RhbCBudW1iZXIgb2YgTiwgUywKLUksIEMgYW5kIEYgY3lsZXMpICovCi0KLXN0YXRpYyBBUk13b3JkIFZhbFJlZ1sxNl07Ci0KLXN0YXRpYyB1bnNpZ25lZAotVmFsTERDIChBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgZGF0YSkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIHdvcmRzOwotCi0gIGlmICh0eXBlICE9IEFSTXVsX0RBVEEpCi0gICAgewotICAgICAgd29yZHMgPSAwOwotICAgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICB9Ci0gIGlmIChCSVQgKDIyKSkKLSAgICB7CQkJCS8qIGl0J3MgYSBsb25nIGFjY2VzcywgZ2V0IHR3byB3b3JkcyAqLwotICAgICAgVmFsUmVnW0JJVFMgKDEyLCAxNSldID0gZGF0YTsKLSAgICAgIGlmICh3b3JkcysrID09IDQpCi0JcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKEFSTXVsX0lOQyk7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBnZXQganVzdCBvbmUgd29yZCAqLwotICAgICAgVmFsUmVnW0JJVFMgKDEyLCAxNSldID0gZGF0YTsKLSAgICAgIHJldHVybiAoQVJNdWxfRE9ORSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQKLVZhbFNUQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSBBVFRSSUJVVEVfVU5VU0VELCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkICogZGF0YSkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIHdvcmRzOwotCi0gIGlmICh0eXBlICE9IEFSTXVsX0RBVEEpCi0gICAgewotICAgICAgd29yZHMgPSAwOwotICAgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICB9Ci0gIGlmIChCSVQgKDIyKSkKLSAgICB7CQkJCS8qIGl0J3MgYSBsb25nIGFjY2VzcywgZ2V0IHR3byB3b3JkcyAqLwotICAgICAgKmRhdGEgPSBWYWxSZWdbQklUUyAoMTIsIDE1KV07Ci0gICAgICBpZiAod29yZHMrKyA9PSA0KQotCXJldHVybiAoQVJNdWxfRE9ORSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIChBUk11bF9JTkMpOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogZ2V0IGp1c3Qgb25lIHdvcmQgKi8KLSAgICAgICpkYXRhID0gVmFsUmVnW0JJVFMgKDEyLCAxNSldOwotICAgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotVmFsTVJDIChBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIHR5cGUgQVRUUklCVVRFX1VOVVNFRCwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCAqIHZhbHVlKQotewotICAqdmFsdWUgPSBWYWxSZWdbQklUUyAoMTYsIDE5KV07Ci0gIHJldHVybiAoQVJNdWxfRE9ORSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotVmFsTUNSIChBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIHR5cGUgQVRUUklCVVRFX1VOVVNFRCwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCB2YWx1ZSkKLXsKLSAgVmFsUmVnW0JJVFMgKDE2LCAxOSldID0gdmFsdWU7Ci0gIHJldHVybiAoQVJNdWxfRE9ORSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotVmFsQ0RQIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGluc3RyKQotewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5pc2ggPSAwOwotICBBUk13b3JkIGhvd2xvbmc7Ci0KLSAgaG93bG9uZyA9IFZhbFJlZ1tCSVRTICgwLCAzKV07Ci0gIGlmIChCSVRTICgyMCwgMjMpID09IDApCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gQVJNdWxfRklSU1QpCi0JewkJCS8qIEZpcnN0IGN5Y2xlIG9mIGEgYnVzeSB3YWl0ICovCi0JICBmaW5pc2ggPSBBUk11bF9UaW1lIChzdGF0ZSkgKyBob3dsb25nOwotCSAgaWYgKGhvd2xvbmcgPT0gMCkKLQkgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIChBUk11bF9CVVNZKTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlID09IEFSTXVsX0JVU1kpCi0JewotCSAgaWYgKEFSTXVsX1RpbWUgKHN0YXRlKSA+PSBmaW5pc2gpCi0JICAgIHJldHVybiAoQVJNdWxfRE9ORSk7Ci0JICBlbHNlCi0JICAgIHJldHVybiAoQVJNdWxfQlVTWSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChBUk11bF9DQU5UKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1Eb0FGSVEgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIHN0YXRlLT5OZmlxU2lnID0gTE9XOwotICBzdGF0ZS0+RXhjZXB0aW9uKys7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotRG9BSVJRIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBzdGF0ZS0+TmlycVNpZyA9IExPVzsKLSAgc3RhdGUtPkV4Y2VwdGlvbisrOwotICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdW5zaWduZWQKLUludENEUCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBpbnN0cikKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluaXNoOwotICBBUk13b3JkIGhvd2xvbmc7Ci0KLSAgaG93bG9uZyA9IFZhbFJlZ1tCSVRTICgwLCAzKV07Ci0gIHN3aXRjaCAoKGludCkgQklUUyAoMjAsIDIzKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgaWYgKHR5cGUgPT0gQVJNdWxfRklSU1QpCi0JewkJCS8qIEZpcnN0IGN5Y2xlIG9mIGEgYnVzeSB3YWl0ICovCi0JICBmaW5pc2ggPSBBUk11bF9UaW1lIChzdGF0ZSkgKyBob3dsb25nOwotCSAgaWYgKGhvd2xvbmcgPT0gMCkKLQkgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIChBUk11bF9CVVNZKTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlID09IEFSTXVsX0JVU1kpCi0JewotCSAgaWYgKEFSTXVsX1RpbWUgKHN0YXRlKSA+PSBmaW5pc2gpCi0JICAgIHJldHVybiAoQVJNdWxfRE9ORSk7Ci0JICBlbHNlCi0JICAgIHJldHVybiAoQVJNdWxfQlVTWSk7Ci0JfQotICAgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoaG93bG9uZyA9PSAwKQotCUFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfRklRVik7Ci0gICAgICBlbHNlCi0JQVJNdWxfU2NoZWR1bGVFdmVudCAoc3RhdGUsIGhvd2xvbmcsIERvQUZJUSk7Ci0gICAgICByZXR1cm4gKEFSTXVsX0RPTkUpOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChob3dsb25nID09IDApCi0JQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9JUlFWKTsKLSAgICAgIGVsc2UKLQlBUk11bF9TY2hlZHVsZUV2ZW50IChzdGF0ZSwgaG93bG9uZywgRG9BSVJRKTsKLSAgICAgIHJldHVybiAoQVJNdWxfRE9ORSk7Ci0gICAgY2FzZSAzOgotICAgICAgc3RhdGUtPk5maXFTaWcgPSBISUdIOwotICAgICAgc3RhdGUtPkV4Y2VwdGlvbi0tOwotICAgICAgcmV0dXJuIChBUk11bF9ET05FKTsKLSAgICBjYXNlIDQ6Ci0gICAgICBzdGF0ZS0+TmlycVNpZyA9IEhJR0g7Ci0gICAgICBzdGF0ZS0+RXhjZXB0aW9uLS07Ci0gICAgICByZXR1cm4gKEFSTXVsX0RPTkUpOwotICAgIGNhc2UgNToKLSAgICAgIFZhbFJlZ1tCSVRTICgwLCAzKV0gPSBBUk11bF9UaW1lIChzdGF0ZSk7Ci0gICAgICByZXR1cm4gKEFSTXVsX0RPTkUpOwotICAgIH0KLSAgcmV0dXJuIChBUk11bF9DQU5UKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICBJbnN0YWxsIGNvLXByb2Nlc3NvciBpbnN0cnVjdGlvbiBoYW5kbGVycyBpbiB0aGlzIHJvdXRpbmUgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bnNpZ25lZAotQVJNdWxfQ29Qcm9Jbml0IChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICByZWdpc3RlciB1bnNpZ25lZCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQkvKiBpbml0aWFsaXNlIHRoYW0gYWxsIGZpcnN0ICovCi0gICAgQVJNdWxfQ29Qcm9EZXRhY2ggKHN0YXRlLCBpKTsKLQotICAvKiBJbnN0YWxsIENvUHJvIEluc3RydWN0aW9uIGhhbmRsZXJzIGhlcmUKLSAgICAgVGhlIGZvcm1hdCBpcwotICAgICBBUk11bF9Db1Byb0F0dGFjaChzdGF0ZSwgQ1AgTnVtYmVyLCBJbml0IHJvdXRpbmUsIEV4aXQgcm91dGluZQotICAgICBMREMgcm91dGluZSwgU1RDIHJvdXRpbmUsIE1SQyByb3V0aW5lLCBNQ1Igcm91dGluZSwKLSAgICAgQ0RQIHJvdXRpbmUsIFJlYWQgUmVnIHJvdXRpbmUsIFdyaXRlIFJlZyByb3V0aW5lKSA7Ci0gICAqLwotCi0gIEFSTXVsX0NvUHJvQXR0YWNoIChzdGF0ZSwgNCwgTlVMTCwgTlVMTCwKLQkJICAgICBWYWxMREMsIFZhbFNUQywgVmFsTVJDLCBWYWxNQ1IsIFZhbENEUCwgTlVMTCwgTlVMTCk7Ci0KLSAgQVJNdWxfQ29Qcm9BdHRhY2ggKHN0YXRlLCA1LCBOVUxMLCBOVUxMLAotCQkgICAgIE5VTEwsIE5VTEwsIFZhbE1SQywgVmFsTUNSLCBJbnRDRFAsIE5VTEwsIE5VTEwpOwotCi0gIEFSTXVsX0NvUHJvQXR0YWNoIChzdGF0ZSwgMTUsIE1NVUluaXQsIE5VTEwsCi0JCSAgICAgTlVMTCwgTlVMTCwgTU1VTVJDLCBNTVVNQ1IsIE5VTEwsIE1NVVJlYWQsIE1NVVdyaXRlKTsKLQotCi0gIC8qIE5vIGhhbmRsZXJzIGJlbG93IGhlcmUgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykJLyogQ2FsbCBhbGwgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmVzICovCi0gICAgaWYgKHN0YXRlLT5DUEluaXRbaV0pCi0gICAgICAoc3RhdGUtPkNQSW5pdFtpXSkgKHN0YXRlKTsKLSAgcmV0dXJuIChUUlVFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICBJbnN0YWxsIGNvLXByb2Nlc3NvciBmaW5hbGlzYXRpb24gcm91dGluZXMgaW4gdGhpcyByb3V0aW5lICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9Db1Byb0V4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgaWYgKHN0YXRlLT5DUEV4aXRbaV0pCi0gICAgICAoc3RhdGUtPkNQRXhpdFtpXSkgKHN0YXRlKTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCS8qIERldGFjaCBhbGwgaGFuZGxlcnMgKi8KLSAgICBBUk11bF9Db1Byb0RldGFjaCAoc3RhdGUsIGkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgUm91dGluZXMgdG8gaG9vayBDby1wcm9jZXNzb3JzIGludG8gQVJNdWxhdG9yICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9Db1Byb0F0dGFjaCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbnVtYmVyLAotCQkgICBBUk11bF9DUEluaXRzICogaW5pdCwgQVJNdWxfQ1BFeGl0cyAqIGV4aXQsCi0JCSAgIEFSTXVsX0xEQ3MgKiBsZGMsIEFSTXVsX1NUQ3MgKiBzdGMsCi0JCSAgIEFSTXVsX01SQ3MgKiBtcmMsIEFSTXVsX01DUnMgKiBtY3IsIEFSTXVsX0NEUHMgKiBjZHAsCi0JCSAgIEFSTXVsX0NQUmVhZHMgKiByZWFkLCBBUk11bF9DUFdyaXRlcyAqIHdyaXRlKQotewotICBpZiAoaW5pdCAhPSBOVUxMKQotICAgIHN0YXRlLT5DUEluaXRbbnVtYmVyXSA9IGluaXQ7Ci0gIGlmIChleGl0ICE9IE5VTEwpCi0gICAgc3RhdGUtPkNQRXhpdFtudW1iZXJdID0gZXhpdDsKLSAgaWYgKGxkYyAhPSBOVUxMKQotICAgIHN0YXRlLT5MRENbbnVtYmVyXSA9IGxkYzsKLSAgaWYgKHN0YyAhPSBOVUxMKQotICAgIHN0YXRlLT5TVENbbnVtYmVyXSA9IHN0YzsKLSAgaWYgKG1yYyAhPSBOVUxMKQotICAgIHN0YXRlLT5NUkNbbnVtYmVyXSA9IG1yYzsKLSAgaWYgKG1jciAhPSBOVUxMKQotICAgIHN0YXRlLT5NQ1JbbnVtYmVyXSA9IG1jcjsKLSAgaWYgKGNkcCAhPSBOVUxMKQotICAgIHN0YXRlLT5DRFBbbnVtYmVyXSA9IGNkcDsKLSAgaWYgKHJlYWQgIT0gTlVMTCkKLSAgICBzdGF0ZS0+Q1BSZWFkW251bWJlcl0gPSByZWFkOwotICBpZiAod3JpdGUgIT0gTlVMTCkKLSAgICBzdGF0ZS0+Q1BXcml0ZVtudW1iZXJdID0gd3JpdGU7Ci19Ci0KLXZvaWQKLUFSTXVsX0NvUHJvRGV0YWNoIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBudW1iZXIpCi17Ci0gIEFSTXVsX0NvUHJvQXR0YWNoIChzdGF0ZSwgbnVtYmVyLCBOVUxMLCBOVUxMLAotCQkgICAgIE5vQ29Qcm80UiwgTm9Db1BybzRXLCBOb0NvUHJvNFcsIE5vQ29Qcm80UiwKLQkJICAgICBOb0NvUHJvM1IsIE5VTEwsIE5VTEwpOwotICBzdGF0ZS0+Q1BJbml0W251bWJlcl0gPSBOVUxMOwotICBzdGF0ZS0+Q1BFeGl0W251bWJlcl0gPSBOVUxMOwotICBzdGF0ZS0+Q1BSZWFkW251bWJlcl0gPSBOVUxMOwotICBzdGF0ZS0+Q1BXcml0ZVtudW1iZXJdID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICBUaGVyZSBpcyBubyBDb1BybyBhcm91bmQsIHNvIFVuZGVmaW5lZCBJbnN0cnVjdGlvbiB0cmFwICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLU5vQ29Qcm8zUiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSBBVFRSSUJVVEVfVU5VU0VELAotCSAgIHVuc2lnbmVkIGEgQVRUUklCVVRFX1VOVVNFRCwKLQkgICBBUk13b3JkIGIgQVRUUklCVVRFX1VOVVNFRCkKLXsKLSAgcmV0dXJuIChBUk11bF9DQU5UKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1Ob0NvUHJvNFIgKAotCSAgIEFSTXVsX1N0YXRlICogc3RhdGUgQVRUUklCVVRFX1VOVVNFRCwKLQkgICB1bnNpZ25lZCBhIEFUVFJJQlVURV9VTlVTRUQsCi0JICAgQVJNd29yZCBiIEFUVFJJQlVURV9VTlVTRUQsCi0JICAgQVJNd29yZCBjIEFUVFJJQlVURV9VTlVTRUQpCi17Ci0gIHJldHVybiAoQVJNdWxfQ0FOVCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotTm9Db1BybzRXICgKLQkgICBBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsCi0JICAgdW5zaWduZWQgYSBBVFRSSUJVVEVfVU5VU0VELAotCSAgIEFSTXdvcmQgYiBBVFRSSUJVVEVfVU5VU0VELAotCSAgIEFSTXdvcmQgKiBjIEFUVFJJQlVURV9VTlVTRUQpCi17Ci0gIHJldHVybiAoQVJNdWxfQ0FOVCk7Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL2FybWRlZnMuaCBiL3NpbS9hcm0vYXJtZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNmMjZmLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vYXJtZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qICBhcm1kZWZzLmggLS0gQVJNdWxhdG9yIGNvbW1vbiBkZWZpbml0aW9uczogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFIDEKLSNkZWZpbmUgTE9XIDAKLSNkZWZpbmUgSElHSCAxCi0jZGVmaW5lIExPV0hJR0ggMQotI2RlZmluZSBISUdITE9XIDIKLQotI2lmbmRlZiBfX1NURENfXwotdHlwZWRlZiBjaGFyICpWb2lkU3RhcjsKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgQVJNd29yZDsJLyogbXVzdCBiZSAzMiBiaXRzIHdpZGUgKi8KLXR5cGVkZWYgc3RydWN0IEFSTXVsX1N0YXRlIEFSTXVsX1N0YXRlOwotCi10eXBlZGVmIHVuc2lnbmVkIEFSTXVsX0NQSW5pdHMgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotdHlwZWRlZiB1bnNpZ25lZCBBUk11bF9DUEV4aXRzIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLXR5cGVkZWYgdW5zaWduZWQgQVJNdWxfTERDcyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgdHlwZSwKLQkJCSAgICAgQVJNd29yZCBpbnN0ciwgQVJNd29yZCB2YWx1ZSk7Ci10eXBlZGVmIHVuc2lnbmVkIEFSTXVsX1NUQ3MgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIHR5cGUsCi0JCQkgICAgIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgKiB2YWx1ZSk7Ci10eXBlZGVmIHVuc2lnbmVkIEFSTXVsX01SQ3MgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIHR5cGUsCi0JCQkgICAgIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgKiB2YWx1ZSk7Ci10eXBlZGVmIHVuc2lnbmVkIEFSTXVsX01DUnMgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIHR5cGUsCi0JCQkgICAgIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgdmFsdWUpOwotdHlwZWRlZiB1bnNpZ25lZCBBUk11bF9DRFBzIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCB0eXBlLAotCQkJICAgICBBUk13b3JkIGluc3RyKTsKLXR5cGVkZWYgdW5zaWduZWQgQVJNdWxfQ1BSZWFkcyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgcmVnLAotCQkJCUFSTXdvcmQgKiB2YWx1ZSk7Ci10eXBlZGVmIHVuc2lnbmVkIEFSTXVsX0NQV3JpdGVzIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCByZWcsCi0JCQkJIEFSTXdvcmQgdmFsdWUpOwotCi1zdHJ1Y3QgQVJNdWxfU3RhdGUKLXsKLSAgQVJNd29yZCBFbXVsYXRlOwkJLyogdG8gc3RhcnQgYW5kIHN0b3AgZW11bGF0aW9uICovCi0gIHVuc2lnbmVkIEVuZENvbmRpdGlvbjsJLyogcmVhc29uIGZvciBzdG9wcGluZyAqLwotICB1bnNpZ25lZCBFcnJvckNvZGU7CQkvKiB0eXBlIG9mIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLSAgQVJNd29yZCBSZWdbMTZdOwkJLyogdGhlIGN1cnJlbnQgcmVnaXN0ZXIgZmlsZSAqLwotICBBUk13b3JkIFJlZ0JhbmtbN11bMTZdOwkvKiBhbGwgdGhlIHJlZ2lzdGVycyAqLwotICBBUk13b3JkIENwc3I7CQkJLyogdGhlIGN1cnJlbnQgcHNyICovCi0gIEFSTXdvcmQgU3Bzcls3XTsJCS8qIHRoZSBleGNlcHRpb24gcHNyJ3MgKi8KLSAgQVJNd29yZCBORmxhZywgWkZsYWcsIENGbGFnLCBWRmxhZywgSUZGbGFnczsJLyogZHVtbXkgZmxhZ3MgZm9yIHNwZWVkICovCi0jaWZkZWYgTU9ERVQKLSAgQVJNd29yZCBURmxhZzsJCS8qIFRodW1iIHN0YXRlICovCi0jZW5kaWYKLSAgQVJNd29yZCBCYW5rOwkJCS8qIHRoZSBjdXJyZW50IHJlZ2lzdGVyIGJhbmsgKi8KLSAgQVJNd29yZCBNb2RlOwkJCS8qIHRoZSBjdXJyZW50IG1vZGUgKi8KLSAgQVJNd29yZCBpbnN0ciwgcGMsIHRlbXA7CS8qIHNhdmVkIHJlZ2lzdGVyIHN0YXRlICovCi0gIEFSTXdvcmQgbG9hZGVkLCBkZWNvZGVkOwkvKiBzYXZlZCBwaXBlbGluZSBzdGF0ZSAqLwotICB1bnNpZ25lZCBsb25nIE51bVNjeWNsZXMsIE51bU5jeWNsZXMsIE51bUljeWNsZXMsIE51bUNjeWNsZXMsIE51bUZjeWNsZXM7CS8qIGVtdWxhdGVkIGN5Y2xlcyB1c2VkICovCi0gIHVuc2lnbmVkIGxvbmcgTnVtSW5zdHJzOwkvKiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZCAqLwotICB1bnNpZ25lZCBOZXh0SW5zdHI7Ci0gIHVuc2lnbmVkIFZlY3RvckNhdGNoOwkJLyogY2F1Z2h0IGV4Y2VwdGlvbiBtYXNrICovCi0gIHVuc2lnbmVkIENhbGxEZWJ1ZzsJCS8qIHNldCB0byBjYWxsIHRoZSBkZWJ1Z2dlciAqLwotICB1bnNpZ25lZCBDYW5XYXRjaDsJCS8qIHNldCBieSBtZW1vcnkgaW50ZXJmYWNlIGlmIGl0cyB3aWxsaW5nIHRvIHN1ZmZlciB0aGUKLQkJCQkgICBvdmVyaGVhZCBvZiBjaGVja2luZyBmb3Igd2F0Y2hwb2ludHMgb24gZWFjaCBtZW1vcnkKLQkJCQkgICBhY2Nlc3MgKi8KLSAgdW5zaWduZWQgTWVtUmVhZERlYnVnLCBNZW1Xcml0ZURlYnVnOwotICB1bnNpZ25lZCBsb25nIFN0b3BIYW5kbGU7Ci0KLSAgdW5zaWduZWQgY2hhciAqTWVtRGF0YVB0cjsJLyogYWRtaW4gZGF0YSAqLwotICB1bnNpZ25lZCBjaGFyICpNZW1JblB0cjsJLyogdGhlIERhdGEgSW4gYnVzICovCi0gIHVuc2lnbmVkIGNoYXIgKk1lbU91dFB0cjsJLyogdGhlIERhdGEgT3V0IGJ1cyAod2hpY2ggeW91IG1heSBub3QgbmVlZCAqLwotICB1bnNpZ25lZCBjaGFyICpNZW1TcGFyZVB0cjsJLyogZXh0cmEgc3BhY2UgKi8KLSAgQVJNd29yZCBNZW1TaXplOwotCi0gIHVuc2lnbmVkIGNoYXIgKk9TcHRyOwkJLyogT1MgSGFuZGxlICovCi0gIGNoYXIgKkNvbW1hbmRMaW5lOwkJLyogQ29tbWFuZCBMaW5lIGZyb20gQVJNc2QgKi8KLQotICBBUk11bF9DUEluaXRzICpDUEluaXRbMTZdOwkvKiBjb3Byb2Nlc3NvciBpbml0aWFsaXNlcnMgKi8KLSAgQVJNdWxfQ1BFeGl0cyAqQ1BFeGl0WzE2XTsJLyogY29wcm9jZXNzb3IgZmluYWxpc2VycyAqLwotICBBUk11bF9MRENzICpMRENbMTZdOwkJLyogTERDIGluc3RydWN0aW9uICovCi0gIEFSTXVsX1NUQ3MgKlNUQ1sxNl07CQkvKiBTVEMgaW5zdHJ1Y3Rpb24gKi8KLSAgQVJNdWxfTVJDcyAqTVJDWzE2XTsJCS8qIE1SQyBpbnN0cnVjdGlvbiAqLwotICBBUk11bF9NQ1JzICpNQ1JbMTZdOwkJLyogTUNSIGluc3RydWN0aW9uICovCi0gIEFSTXVsX0NEUHMgKkNEUFsxNl07CQkvKiBDRFAgaW5zdHJ1Y3Rpb24gKi8KLSAgQVJNdWxfQ1BSZWFkcyAqQ1BSZWFkWzE2XTsJLyogUmVhZCBDUCByZWdpc3RlciAqLwotICBBUk11bF9DUFdyaXRlcyAqQ1BXcml0ZVsxNl07CS8qIFdyaXRlIENQIHJlZ2lzdGVyICovCi0gIHVuc2lnbmVkIGNoYXIgKkNQRGF0YVsxNl07CS8qIENvcHJvY2Vzc29yIGRhdGEgKi8KLSAgdW5zaWduZWQgY2hhciBjb25zdCAqQ1BSZWdXb3Jkc1sxNl07CS8qIG1hcCBvZiBjb3Byb2Nlc3NvciByZWdpc3RlciBzaXplcyAqLwotCi0gIHVuc2lnbmVkIEV2ZW50U2V0OwkJLyogdGhlIG51bWJlciBvZiBldmVudHMgaW4gdGhlIHF1ZXVlICovCi0gIHVuc2lnbmVkIGxvbmcgTm93OwkJLyogdGltZSB0byB0aGUgbmVhcmVzdCBjeWNsZSAqLwotICBzdHJ1Y3QgRXZlbnROb2RlICoqRXZlbnRQdHI7CS8qIHRoZSBldmVudCBsaXN0ICovCi0KLSAgdW5zaWduZWQgRXhjZXB0aW9uOwkJLyogZW5hYmxlIHRoZSBuZXh0IGZvdXIgdmFsdWVzICovCi0gIHVuc2lnbmVkIERlYnVnOwkJLyogc2hvdyBpbnN0cnVjdGlvbnMgYXMgdGhleSBhcmUgZXhlY3V0ZWQgKi8KLSAgdW5zaWduZWQgTnJlc2V0U2lnOwkJLyogcmVzZXQgdGhlIHByb2Nlc3NvciAqLwotICB1bnNpZ25lZCBOZmlxU2lnOwotICB1bnNpZ25lZCBOaXJxU2lnOwotCi0gIHVuc2lnbmVkIGFib3J0U2lnOwotICB1bnNpZ25lZCBOdHJhbnNTaWc7Ci0gIHVuc2lnbmVkIGJpZ2VuZFNpZzsKLSAgdW5zaWduZWQgcHJvZzMyU2lnOwotICB1bnNpZ25lZCBkYXRhMzJTaWc7Ci0gIHVuc2lnbmVkIGxhdGVhYnRTaWc7Ci0gIEFSTXdvcmQgVmVjdG9yOwkJLyogc3ludGhlc2l6ZSBhYm9ydHMgaW4gY3ljbGUgbW9kZXMgKi8KLSAgQVJNd29yZCBBYm9ydGVkOwkJLyogc3RpY2t5IGZsYWcgZm9yIGFib3J0cyAqLwotICBBUk13b3JkIFJlc2V0ZWQ7CQkvKiBzdGlja3kgZmxhZyBmb3IgUmVzZXQgKi8KLSAgQVJNd29yZCBJbnRlZCwgTGFzdEludGVkOwkvKiBzdGlja3kgZmxhZ3MgZm9yIGludGVycnVwdHMgKi8KLSAgQVJNd29yZCBCYXNlOwkJCS8qIGV4dHJhIGhhbmQgZm9yIGJhc2Ugd3JpdGViYWNrICovCi0gIEFSTXdvcmQgQWJvcnRBZGRyOwkJLyogdG8ga2VlcCB0cmFjayBvZiBQcmVmZXRjaCBhYm9ydHMgKi8KLQotICBjb25zdCBzdHJ1Y3QgRGJnX0hvc3Rvc0ludGVyZmFjZSAqaG9zdGlmOwotCi0gIGludCB2ZXJib3NlOwkJCS8qIG5vbi16ZXJvIG1lYW5zIHByaW50IHZhcmlvdXMgbWVzc2FnZXMgbGlrZSB0aGUgYmFubmVyICovCi19OwotCi0jZGVmaW5lIFJlc2V0UGluIE5yZXNldFNpZwotI2RlZmluZSBGSVFQaW4gTmZpcVNpZwotI2RlZmluZSBJUlFQaW4gTmlycVNpZwotI2RlZmluZSBBYm9ydFBpbiBhYm9ydFNpZwotI2RlZmluZSBUcmFuc1BpbiBOdHJhbnNTaWcKLSNkZWZpbmUgQmlnRW5kUGluIGJpZ2VuZFNpZwotI2RlZmluZSBQcm9nMzJQaW4gcHJvZzMyU2lnCi0jZGVmaW5lIERhdGEzMlBpbiBkYXRhMzJTaWcKLSNkZWZpbmUgTGF0ZUFib3J0UGluIGxhdGVhYnRTaWcKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyBvZiBBUk0gd2Uga25vdyBhYm91dCAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgYml0ZmxhZ3MgKi8KLSNkZWZpbmUgQVJNX0ZpeDI2X1Byb3AgICAweDAxCi0jZGVmaW5lIEFSTV9OZXhlY19Qcm9wICAgMHgwMgotI2RlZmluZSBBUk1fRGVidWdfUHJvcCAgIDB4MTAKLSNkZWZpbmUgQVJNX0lzeW5jX1Byb3AgICBBUk1fRGVidWdfUHJvcAotI2RlZmluZSBBUk1fTG9ja19Qcm9wICAgIDB4MjAKLQotLyogQVJNMiBmYW1pbHkgKi8KLSNkZWZpbmUgQVJNMiAgICAoQVJNX0ZpeDI2X1Byb3ApCi0jZGVmaW5lIEFSTTJhcyAgQVJNMgotI2RlZmluZSBBUk02MSAgIEFSTTIKLSNkZWZpbmUgQVJNMyAgICBBUk0yCi0KLSNpZmRlZiBBUk02MAkJCS8qIHByZXZpb3VzIGRlZmluaXRpb24gaW4gYXJtb3B0cy5oICovCi0jdW5kZWYgQVJNNjAKLSNlbmRpZgotCi0vKiBBUk02IGZhbWlseSAqLwotI2RlZmluZSBBUk02ICAgIChBUk1fTG9ja19Qcm9wKQotI2RlZmluZSBBUk02MCAgIEFSTTYKLSNkZWZpbmUgQVJNNjAwICBBUk02Ci0jZGVmaW5lIEFSTTYxMCAgQVJNNgotI2RlZmluZSBBUk02MjAgIEFSTTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICBNYWNyb3MgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQklUKG4pICggKEFSTXdvcmQpKGluc3RyPj4obikpJjEpCS8qIGJpdCBuIG9mIGluc3RydWN0aW9uICovCi0jZGVmaW5lIEJJVFMobSxuKSAoIChBUk13b3JkKShpbnN0cjw8KDMxLShuKSkpID4+ICgoMzEtKG4pKSsobSkpICkJLyogYml0cyBtIHRvIG4gb2YgaW5zdHIgKi8KLSNkZWZpbmUgVE9QQklUUyhuKSAoaW5zdHIgPj4gKG4pKQkvKiBiaXRzIDMxIHRvIG4gb2YgaW5zdHIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgVGhlIGhhcmR3YXJlIHZlY3RvciBhZGRyZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFSTVJlc2V0ViAwTAotI2RlZmluZSBBUk1VbmRlZmluZWRJbnN0clYgNEwKLSNkZWZpbmUgQVJNU1dJViA4TAotI2RlZmluZSBBUk1QcmVmZXRjaEFib3J0ViAxMkwKLSNkZWZpbmUgQVJNRGF0YUFib3J0ViAxNkwKLSNkZWZpbmUgQVJNQWRkckV4Y2VwdG5WIDIwTAotI2RlZmluZSBBUk1JUlFWIDI0TAotI2RlZmluZSBBUk1GSVFWIDI4TAotI2RlZmluZSBBUk1FcnJvclYgMzJMCQkvKiBUaGlzIGlzIGFuIG9mZnNldCwgbm90IGFuIGFkZHJlc3MgISAqLwotCi0jZGVmaW5lIEFSTXVsX1Jlc2V0ViBBUk1SZXNldFYKLSNkZWZpbmUgQVJNdWxfVW5kZWZpbmVkSW5zdHJWIEFSTVVuZGVmaW5lZEluc3RyVgotI2RlZmluZSBBUk11bF9TV0lWIEFSTVNXSVYKLSNkZWZpbmUgQVJNdWxfUHJlZmV0Y2hBYm9ydFYgQVJNUHJlZmV0Y2hBYm9ydFYKLSNkZWZpbmUgQVJNdWxfRGF0YUFib3J0ViBBUk1EYXRhQWJvcnRWCi0jZGVmaW5lIEFSTXVsX0FkZHJFeGNlcHRuViBBUk1BZGRyRXhjZXB0blYKLSNkZWZpbmUgQVJNdWxfSVJRViBBUk1JUlFWCi0jZGVmaW5lIEFSTXVsX0ZJUVYgQVJNRklRVgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSBhbmQgQmFuayBDb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVVNFUjI2TU9ERSAgIDBMCi0jZGVmaW5lIEZJUTI2TU9ERSAgICAxTAotI2RlZmluZSBJUlEyNk1PREUgICAgMkwKLSNkZWZpbmUgU1ZDMjZNT0RFICAgIDNMCi0jZGVmaW5lIFVTRVIzMk1PREUgIDE2TAotI2RlZmluZSBGSVEzMk1PREUgICAxN0wKLSNkZWZpbmUgSVJRMzJNT0RFICAgMThMCi0jZGVmaW5lIFNWQzMyTU9ERSAgIDE5TAotI2RlZmluZSBBQk9SVDMyTU9ERSAyM0wKLSNkZWZpbmUgVU5ERUYzMk1PREUgMjdMCi0jZGVmaW5lIFNZU1RFTU1PREUgIDMxTAotCi0jZGVmaW5lIEFSTTMyQklUTU9ERSAoc3RhdGUtPk1vZGUgPiAzKQotI2RlZmluZSBBUk0yNkJJVE1PREUgKHN0YXRlLT5Nb2RlIDw9IDMpCi0jZGVmaW5lIEFSTU1PREUgKHN0YXRlLT5Nb2RlKQotI2RlZmluZSBBUk11bF9NT0RFQklUUyAweDFmTAotI2RlZmluZSBBUk11bF9NT0RFMzJCSVQgQVJNMzJCSVRNT0RFCi0jZGVmaW5lIEFSTXVsX01PREUyNkJJVCBBUk0yNkJJVE1PREUKLQotI2RlZmluZSBVU0VSQkFOSyAwCi0jZGVmaW5lIEZJUUJBTksgMQotI2RlZmluZSBJUlFCQU5LIDIKLSNkZWZpbmUgU1ZDQkFOSyAzCi0jZGVmaW5lIEFCT1JUQkFOSyA0Ci0jZGVmaW5lIFVOREVGQkFOSyA1Ci0jZGVmaW5lIERVTU1ZQkFOSyA2Ci0jZGVmaW5lIFNZU1RFTUJBTksgNwotCi0jZGVmaW5lIEJBTktfQ0FOX0FDQ0VTU19TUFNSKGJhbmspICBcCi0gICgoYmFuaykgIT0gVVNFUkJBTksgJiYgKGJhbmspICE9IFNZU1RFTUJBTksgJiYgKGJhbmspICE9IERVTU1ZQkFOSykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICBEZWZpbml0b25zIG9mIHRoaW5ncyBpbiB0aGUgZW11bGF0b3IgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gdm9pZCBBUk11bF9FbXVsYXRlSW5pdCAodm9pZCk7Ci1leHRlcm4gQVJNdWxfU3RhdGUgKkFSTXVsX05ld1N0YXRlICh2b2lkKTsKLWV4dGVybiB2b2lkIEFSTXVsX1Jlc2V0IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0RvUHJvZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gQVJNd29yZCBBUk11bF9Eb0luc3RyIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgZm9yIGV2ZW50IGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gdm9pZCBBUk11bF9TY2hlZHVsZUV2ZW50IChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBsb25nIGRlbGF5LAotCQkJCSB1bnNpZ25lZCAoKmZ1bmMpICgpKTsKLWV4dGVybiB2b2lkIEFSTXVsX0Vudm9rZUV2ZW50IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIEFSTXVsX1RpbWUgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHN1cHBvcnQgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBBUk13b3JkIEFSTXVsX0dldFJlZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbW9kZSwKLQkJCSAgICAgdW5zaWduZWQgcmVnKTsKLWV4dGVybiB2b2lkIEFSTXVsX1NldFJlZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgcmVnLAotCQkJICBBUk13b3JkIHZhbHVlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0dldFBDIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0dldE5leHRQQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9TZXRQQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCB2YWx1ZSk7Ci1leHRlcm4gQVJNd29yZCBBUk11bF9HZXRSMTUgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIHZvaWQgQVJNdWxfU2V0UjE1IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHZhbHVlKTsKLQotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfR2V0Q1BTUiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9TZXRDUFNSIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHZhbHVlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0dldFNQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbW9kZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9TZXRTUFNSIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIG1vZGUsIEFSTXdvcmQgdmFsdWUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgIERlZmluaXRvbnMgb2YgdGhpbmdzIHRvIGhhbmRsZSBhYm9ydHMgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiB2b2lkIEFSTXVsX0Fib3J0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotI2RlZmluZSBBUk11bF9BQk9SVFdPUkQgMHhlZmZmZmZmZgkvKiBTV0kgLTEgKi8KLSNkZWZpbmUgQVJNdWxfUFJFRkVUQ0hBQk9SVChhZGRyZXNzKSBpZiAoc3RhdGUtPkFib3J0QWRkciA9PSAxKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkFib3J0QWRkciA9IChhZGRyZXNzICYgfjNMKQotI2RlZmluZSBBUk11bF9EQVRBQUJPUlQoYWRkcmVzcykgc3RhdGUtPmFib3J0U2lnID0gSElHSCA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7Ci0jZGVmaW5lIEFSTXVsX0NMRUFSQUJPUlQgc3RhdGUtPmFib3J0U2lnID0gTE9XCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICBEZWZpbml0b25zIG9mIHRoaW5ncyBpbiB0aGUgbWVtb3J5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX01lbW9yeUluaXQgKEFSTXVsX1N0YXRlICogc3RhdGUsCi0JCQkJICB1bnNpZ25lZCBsb25nIGluaXRtZW1zaXplKTsKLWV4dGVybiB2b2lkIEFSTXVsX01lbW9yeUV4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotCi1leHRlcm4gQVJNd29yZCBBUk11bF9Mb2FkSW5zdHJTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkJIEFSTXdvcmQgaXNpemUpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZEluc3RyTiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLAotCQkJCSBBUk13b3JkIGlzaXplKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX1JlTG9hZEluc3RyIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkJICBBUk13b3JkIGlzaXplKTsKLQotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZFdvcmRTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZFdvcmROIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZEhhbGZXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcyk7Ci0KLWV4dGVybiB2b2lkIEFSTXVsX1N0b3JlV29yZFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywKLQkJCSAgICAgIEFSTXdvcmQgZGF0YSk7Ci1leHRlcm4gdm9pZCBBUk11bF9TdG9yZVdvcmROIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkgICAgICBBUk13b3JkIGRhdGEpOwotZXh0ZXJuIHZvaWQgQVJNdWxfU3RvcmVIYWxmV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLAotCQkJCSBBUk13b3JkIGRhdGEpOwotZXh0ZXJuIHZvaWQgQVJNdWxfU3RvcmVCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkgICAgIEFSTXdvcmQgZGF0YSk7Ci0KLWV4dGVybiBBUk13b3JkIEFSTXVsX1N3YXBXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkgICAgICAgQVJNd29yZCBkYXRhKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX1N3YXBCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsCi0JCQkgICAgICAgQVJNd29yZCBkYXRhKTsKLQotZXh0ZXJuIHZvaWQgQVJNdWxfSWN5Y2xlcyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbnVtYmVyLAotCQkJICAgQVJNd29yZCBhZGRyZXNzKTsKLWV4dGVybiB2b2lkIEFSTXVsX0NjeWNsZXMgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIG51bWJlciwKLQkJCSAgIEFSTXdvcmQgYWRkcmVzcyk7Ci0KLWV4dGVybiBBUk13b3JkIEFSTXVsX1JlYWRXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfUmVhZEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcyk7Ci1leHRlcm4gdm9pZCBBUk11bF9Xcml0ZVdvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywKLQkJCSAgICAgQVJNd29yZCBkYXRhKTsKLWV4dGVybiB2b2lkIEFSTXVsX1dyaXRlQnl0ZSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLAotCQkJICAgICBBUk13b3JkIGRhdGEpOwotCi1leHRlcm4gQVJNd29yZCBBUk11bF9NZW1BY2Nlc3MgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQsIEFSTXdvcmQsCi0JCQkJQVJNd29yZCwgQVJNd29yZCwgQVJNd29yZCwgQVJNd29yZCwgQVJNd29yZCwKLQkJCQlBUk13b3JkLCBBUk13b3JkLCBBUk13b3JkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICBEZWZpbml0b25zIG9mIHRoaW5ncyBpbiB0aGUgY28tcHJvY2Vzc29yIGludGVyZmFjZSAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFSTXVsX0ZJUlNUIDAKLSNkZWZpbmUgQVJNdWxfVFJBTlNGRVIgMQotI2RlZmluZSBBUk11bF9CVVNZIDIKLSNkZWZpbmUgQVJNdWxfREFUQSAzCi0jZGVmaW5lIEFSTXVsX0lOVEVSUlVQVCA0Ci0jZGVmaW5lIEFSTXVsX0RPTkUgMAotI2RlZmluZSBBUk11bF9DQU5UIDEKLSNkZWZpbmUgQVJNdWxfSU5DIDMKLQotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX0NvUHJvSW5pdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9Db1Byb0V4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9BdHRhY2ggKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIG51bWJlciwKLQkJCSAgICAgICBBUk11bF9DUEluaXRzICogaW5pdCwgQVJNdWxfQ1BFeGl0cyAqIGV4aXQsCi0JCQkgICAgICAgQVJNdWxfTERDcyAqIGxkYywgQVJNdWxfU1RDcyAqIHN0YywKLQkJCSAgICAgICBBUk11bF9NUkNzICogbXJjLCBBUk11bF9NQ1JzICogbWNyLAotCQkJICAgICAgIEFSTXVsX0NEUHMgKiBjZHAsCi0JCQkgICAgICAgQVJNdWxfQ1BSZWFkcyAqIHJlYWQsIEFSTXVsX0NQV3JpdGVzICogd3JpdGUpOwotZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9EZXRhY2ggKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIG51bWJlcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSW5pdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9PU0V4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSGFuZGxlU1dJIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIG51bWJlcik7Ci1leHRlcm4gQVJNd29yZCBBUk11bF9PU0xhc3RFcnJvclAgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotCi1leHRlcm4gQVJNd29yZCBBUk11bF9EZWJ1ZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBwYywgQVJNd29yZCBpbnN0cik7Ci1leHRlcm4gdW5zaWduZWQgQVJNdWxfT1NFeGNlcHRpb24gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgdmVjdG9yLAotCQkJCSAgIEFSTXdvcmQgcGMpOwotZXh0ZXJuIGludCByZGlfbG9nOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0LWRlcGVuZGVudCBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBtYWNpbnRvc2gKLXBhc2NhbCB2b2lkIFNwaW5DdXJzb3IgKHNob3J0IGluY3JlbWVudCk7CS8qIGNvcGllZCBmcm9tIEN1cnNvckN0bC5oICovCi0jIGRlZmluZSBIT1VSR0xBU1MgICAgICAgICAgIFNwaW5DdXJzb3IoIDEgKQotIyBkZWZpbmUgSE9VUkdMQVNTX1JBVEUgICAgICAxMDIzCS8qIDJebiAtIDEgKi8KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBBUk11bF9VbmRlZkluc3RyICAgICAgKEFSTXVsX1N0YXRlICosIEFSTXdvcmQpOwotZXh0ZXJuIHZvaWQgQVJNdWxfRml4Q1BTUiAgICAgICAgIChBUk11bF9TdGF0ZSAqLCBBUk13b3JkLCBBUk13b3JkKTsKLWV4dGVybiB2b2lkIEFSTXVsX0ZpeFNQU1IgICAgICAgICAoQVJNdWxfU3RhdGUgKiwgQVJNd29yZCwgQVJNd29yZCk7Ci1leHRlcm4gdm9pZCBBUk11bF9Db25zb2xlUHJpbnQgICAgKEFSTXVsX1N0YXRlICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWV4dGVybiB2b2lkIEFSTXVsX1NlbGVjdFByb2Nlc3NvciAoQVJNdWxfU3RhdGUgKiwgdW5zaWduZWQpOwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1lbXUuYyBiL3NpbS9hcm0vYXJtZW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmNiNzUuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9hcm1lbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ODEgKzAsMCBAQAotLyogIGFybWVtdS5jIC0tIE1haW4gaW5zdHJ1Y3Rpb24gZW11bGF0aW9uOiAgQVJNNyBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gICAgTW9kaWZpY2F0aW9ucyB0byBhZGQgYXJjaC4gdjQgc3VwcG9ydCBieSA8anNtaXRoQGN5Z251cy5jb20+LgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJhcm1lbXUuaCIKLSNpbmNsdWRlICJhcm1vcy5oIgotCi1zdGF0aWMgQVJNd29yZCBHZXREUFJlZ1JIUyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0cik7Ci1zdGF0aWMgQVJNd29yZCBHZXREUFNSZWdSSFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpOwotc3RhdGljIHZvaWQgV3JpdGVSMTUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgc3JjKTsKLXN0YXRpYyB2b2lkIFdyaXRlU1IxNSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBzcmMpOwotc3RhdGljIEFSTXdvcmQgR2V0TFNSZWdSSFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpOwotc3RhdGljIEFSTXdvcmQgR2V0TFM3UkhTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyKTsKLXN0YXRpYyB1bnNpZ25lZCBMb2FkV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwKLQkJCSAgQVJNd29yZCBhZGRyZXNzKTsKLXN0YXRpYyB1bnNpZ25lZCBMb2FkSGFsZldvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsCi0JCQkgICAgICBBUk13b3JkIGFkZHJlc3MsIGludCBzaWduZXh0ZW5kKTsKLXN0YXRpYyB1bnNpZ25lZCBMb2FkQnl0ZSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzLAotCQkJICBpbnQgc2lnbmV4dGVuZCk7Ci1zdGF0aWMgdW5zaWduZWQgU3RvcmVXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLAotCQkJICAgQVJNd29yZCBhZGRyZXNzKTsKLXN0YXRpYyB1bnNpZ25lZCBTdG9yZUhhbGZXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLAotCQkJICAgICAgIEFSTXdvcmQgYWRkcmVzcyk7Ci1zdGF0aWMgdW5zaWduZWQgU3RvcmVCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLAotCQkJICAgQVJNd29yZCBhZGRyZXNzKTsKLXN0YXRpYyB2b2lkIExvYWRNdWx0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaW5zdHIsCi0JCSAgICAgIEFSTXdvcmQgV0JCYXNlKTsKLXN0YXRpYyB2b2lkIFN0b3JlTXVsdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGluc3RyLAotCQkgICAgICAgQVJNd29yZCBXQkJhc2UpOwotc3RhdGljIHZvaWQgTG9hZFNNdWx0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaW5zdHIsCi0JCSAgICAgICBBUk13b3JkIFdCQmFzZSk7Ci1zdGF0aWMgdm9pZCBTdG9yZVNNdWx0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaW5zdHIsCi0JCQlBUk13b3JkIFdCQmFzZSk7Ci1zdGF0aWMgdW5zaWduZWQgTXVsdGlwbHk2NCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwKLQkJCSAgICBpbnQgc2lnbmV4dGVuZCwgaW50IHNjYyk7Ci1zdGF0aWMgdW5zaWduZWQgTXVsdGlwbHlBZGQ2NCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwKLQkJCSAgICAgICBpbnQgc2lnbmV4dGVuZCwgaW50IHNjYyk7Ci0KLSNkZWZpbmUgTFVOU0lHTkVEICgwKQkJLyogdW5zaWduZWQgb3BlcmF0aW9uICovCi0jZGVmaW5lIExTSUdORUQgICAoMSkJCS8qIHNpZ25lZCBvcGVyYXRpb24gKi8KLSNkZWZpbmUgTERFRkFVTFQgICgwKQkJLyogZGVmYXVsdCA6IGRvIG5vdGhpbmcgKi8KLSNkZWZpbmUgTFNDQyAgICAgICgxKQkJLyogc2V0IGNvbmRpdGlvbiBjb2RlcyBvbiByZXN1bHQgKi8KLQotI2lmZGVmIE5FRURfVUlfTE9PUF9IT09LCi0vKiBIb3cgb2Z0ZW4gdG8gcnVuIHRoZSB1aV9sb29wIHVwZGF0ZSwgd2hlbiBpbiB1c2UgKi8KLSNkZWZpbmUgVUlfTE9PUF9QT0xMX0lOVEVSVkFMIDB4MzIwMDAKLQotLyogQ291bnRlciBmb3IgdGhlIHVpX2xvb3BfaG9vayB1cGRhdGUgKi8KLXN0YXRpYyBsb25nIHVpX2xvb3BfaG9va19jb3VudGVyID0gVUlfTE9PUF9QT0xMX0lOVEVSVkFMOwotCi0vKiBBY3R1YWwgaG9vayB0byBjYWxsIHRvIHJ1biB0aHJvdWdoIGdkYidzIGd1aSBldmVudCBsb29wICovCi1leHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSAoaW50KTsKLSNlbmRpZiAvKiBORUVEX1VJX0xPT1BfSE9PSyAqLwotCi1leHRlcm4gaW50IHN0b3Bfc2ltdWxhdG9yOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgIHNob3J0LWhhbmQgbWFjcm9zIGZvciBMRFIvU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHN0b3JlIHBvc3QgZGVjcmVtZW50IHdyaXRlYmFjayAqLwotI2RlZmluZSBTSERPV05XQigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKFN0b3JlSGFsZldvcmQoc3RhdGUsIGluc3RyLCBsaHMpKSAgICAgICAgICAgICAgICAgXAotICAgICBMU0Jhc2UgPSBsaHMgLSBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7Ci0KLS8qIHN0b3JlIHBvc3QgaW5jcmVtZW50IHdyaXRlYmFjayAqLwotI2RlZmluZSBTSFVQV0IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKFN0b3JlSGFsZldvcmQoc3RhdGUsIGluc3RyLCBsaHMpKSAgICAgICAgICAgICAgICAgXAotICAgICBMU0Jhc2UgPSBsaHMgKyBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7Ci0KLS8qIHN0b3JlIHByZSBkZWNyZW1lbnQgKi8KLSNkZWZpbmUgU0hQUkVET1dOKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAodm9pZClTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgTEhTIC0gR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikpIDsKLQotLyogc3RvcmUgcHJlIGRlY3JlbWVudCB3cml0ZWJhY2sgKi8KLSNkZWZpbmUgU0hQUkVET1dOV0IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wID0gTEhTIC0gR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikgOyAgICAgICAgICAgICAgICBcCi0gIGlmIChTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgdGVtcCkpICAgICAgICAgICAgICAgIFwKLSAgICAgTFNCYXNlID0gdGVtcCA7Ci0KLS8qIHN0b3JlIHByZSBpbmNyZW1lbnQgKi8KLSNkZWZpbmUgU0hQUkVVUCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAodm9pZClTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgTEhTICsgR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikpIDsKLQotLyogc3RvcmUgcHJlIGluY3JlbWVudCB3cml0ZWJhY2sgKi8KLSNkZWZpbmUgU0hQUkVVUFdCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wID0gTEhTICsgR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikgOyAgICAgICAgICAgICAgICBcCi0gIGlmIChTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgdGVtcCkpICAgICAgICAgICAgICAgIFwKLSAgICAgTFNCYXNlID0gdGVtcCA7Ci0KLS8qIGxvYWQgcG9zdCBkZWNyZW1lbnQgd3JpdGViYWNrICovCi0jZGVmaW5lIExIUE9TVERPV04oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKSAgICAgIFwKLSAgICAgICAgIExTQmFzZSA9IGxocyAtIEdldExTN1JIUyhzdGF0ZSxpbnN0cikgOyAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICAgICAgXAotICAgICAgICAgTFNCYXNlID0gbGhzIC0gR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICBcCi0gICAgICAgICBMU0Jhc2UgPSBsaHMgLSBHZXRMUzdSSFMoc3RhdGUsaW5zdHIpIDsgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIGxvYWQgcG9zdCBpbmNyZW1lbnQgd3JpdGViYWNrICovCi0jZGVmaW5lIExIUE9TVFVQKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKSAgICAgIFwKLSAgICAgICAgIExTQmFzZSA9IGxocyArIEdldExTN1JIUyhzdGF0ZSxpbnN0cikgOyAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICAgICAgXAotICAgICAgICAgTFNCYXNlID0gbGhzICsgR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICBcCi0gICAgICAgICBMU0Jhc2UgPSBsaHMgKyBHZXRMUzdSSFMoc3RhdGUsaW5zdHIpIDsgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIGxvYWQgcHJlIGRlY3JlbWVudCAqLwotI2RlZmluZSBMSFBSRURPV04oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IGRvbmUgPSAxIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wID0gTEhTIC0gR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICAgICAgICAgICBcCi0gIHN3aXRjaCAoQklUUyg1LDYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDE6IC8qIEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSA7ICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDI6IC8qIFNCICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMU0lHTkVEKSA7ICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFNJR05FRCkgOyAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDA6IC8qIFNXUCBoYW5kbGVkIGVsc2V3aGVyZSAqLyAgICAgICAgICAgICAgICAgXAotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkb25lID0gMCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChkb25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBsb2FkIHByZSBkZWNyZW1lbnQgd3JpdGViYWNrICovCi0jZGVmaW5lIExIUFJFRE9XTldCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXAgPSBMSFMgLSBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7ICAgICAgICAgICAgICAgIFwKLSAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSkgICAgIFwKLSAgICAgICAgIExTQmFzZSA9IHRlbXAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICAgICAgXAotICAgICAgICAgTFNCYXNlID0gdGVtcCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICBcCi0gICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIGxvYWQgcHJlIGluY3JlbWVudCAqLwotI2RlZmluZSBMSFBSRVVQKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IGRvbmUgPSAxIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wID0gTEhTICsgR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICAgICAgICAgICBcCi0gIHN3aXRjaCAoQklUUyg1LDYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDE6IC8qIEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSA7ICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDI6IC8qIFNCICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMU0lHTkVEKSA7ICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFNJR05FRCkgOyAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDA6IC8qIFNXUCBoYW5kbGVkIGVsc2V3aGVyZSAqLyAgICAgICAgICAgICAgICAgXAotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkb25lID0gMCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChkb25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBsb2FkIHByZSBpbmNyZW1lbnQgd3JpdGViYWNrICovCi0jZGVmaW5lIExIUFJFVVBXQigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXAgPSBMSFMgKyBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7ICAgICAgICAgICAgICAgIFwKLSAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSkgICAgIFwKLSAgICAgICAgIExTQmFzZSA9IHRlbXAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICAgICAgXAotICAgICAgICAgTFNCYXNlID0gdGVtcCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICBcCi0gICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTVVMQVRJT04gb2YgQVJNNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIFBDIHBpcGVsaW5lIHZhbHVlIGRlcGVuZHMgb24gd2hldGhlciBBUk0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb25zCi0gICBhcmUgYmVpbmcgZXhlY3V0ZWQ6ICovCi1BUk13b3JkIGlzaXplOwotCi0jaWZkZWYgTU9ERTMyCi1BUk13b3JkCi1BUk11bF9FbXVsYXRlMzIgKHJlZ2lzdGVyIEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0jZWxzZQotQVJNd29yZAotQVJNdWxfRW11bGF0ZTI2IChyZWdpc3RlciBBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotI2VuZGlmCi0gIHJlZ2lzdGVyIEFSTXdvcmQgaW5zdHIsCS8qIHRoZSBjdXJyZW50IGluc3RydWN0aW9uICovCi0gICAgZGVzdCA9IDAsCQkJLyogYWxtb3N0IHRoZSBEZXN0QnVzICovCi0gICAgdGVtcCwJCQkvKiB1YmlxdWl0b3VzIHRoaXJkIGhhbmQgKi8KLSAgICBwYyA9IDA7CQkJLyogdGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KLSAgQVJNd29yZCBsaHMsIHJoczsJCS8qIGFsbW9zdCB0aGUgQUJ1cyBhbmQgQkJ1cyAqLwotICBBUk13b3JkIGRlY29kZWQgPSAwLCBsb2FkZWQgPSAwOwkvKiBpbnN0cnVjdGlvbiBwaXBlbGluZSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgaWYgKHN0YXRlLT5OZXh0SW5zdHIgPCBQUklNRVBJUEUpCi0gICAgewotICAgICAgZGVjb2RlZCA9IHN0YXRlLT5kZWNvZGVkOwotICAgICAgbG9hZGVkID0gc3RhdGUtPmxvYWRlZDsKLSAgICAgIHBjID0gc3RhdGUtPnBjOwotICAgIH0KLQotICBkbwotICAgIHsJCQkJLyoganVzdCBrZWVwIGdvaW5nICovCi0jaWZkZWYgTU9ERVQKLSAgICAgIGlmIChURkxBRykKLQl7Ci0JICBpc2l6ZSA9IDI7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0JaXNpemUgPSA0OwotICAgICAgc3dpdGNoIChzdGF0ZS0+TmV4dEluc3RyKQotCXsKLQljYXNlIFNFUToKLQkgIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplOwkvKiBBZHZhbmNlIHRoZSBwaXBlbGluZSwgYW5kIGFuIFMgY3ljbGUgKi8KLQkgIHBjICs9IGlzaXplOwotCSAgaW5zdHIgPSBkZWNvZGVkOwotCSAgZGVjb2RlZCA9IGxvYWRlZDsKLQkgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0clMgKHN0YXRlLCBwYyArIChpc2l6ZSAqIDIpLCBpc2l6ZSk7Ci0JICBicmVhazsKLQotCWNhc2UgTk9OU0VROgotCSAgc3RhdGUtPlJlZ1sxNV0gKz0gaXNpemU7CS8qIEFkdmFuY2UgdGhlIHBpcGVsaW5lLCBhbmQgYW4gTiBjeWNsZSAqLwotCSAgcGMgKz0gaXNpemU7Ci0JICBpbnN0ciA9IGRlY29kZWQ7Ci0JICBkZWNvZGVkID0gbG9hZGVkOwotCSAgbG9hZGVkID0gQVJNdWxfTG9hZEluc3RyTiAoc3RhdGUsIHBjICsgKGlzaXplICogMiksIGlzaXplKTsKLQkgIE5PUk1BTENZQ0xFOwotCSAgYnJlYWs7Ci0KLQljYXNlIFBDSU5DRURTRVE6Ci0JICBwYyArPSBpc2l6ZTsJCS8qIFByb2dyYW0gY291bnRlciBhZHZhbmNlZCwgYW5kIGFuIFMgY3ljbGUgKi8KLQkgIGluc3RyID0gZGVjb2RlZDsKLQkgIGRlY29kZWQgPSBsb2FkZWQ7Ci0JICBsb2FkZWQgPSBBUk11bF9Mb2FkSW5zdHJTIChzdGF0ZSwgcGMgKyAoaXNpemUgKiAyKSwgaXNpemUpOwotCSAgTk9STUFMQ1lDTEU7Ci0JICBicmVhazsKLQotCWNhc2UgUENJTkNFRE5PTlNFUToKLQkgIHBjICs9IGlzaXplOwkJLyogUHJvZ3JhbSBjb3VudGVyIGFkdmFuY2VkLCBhbmQgYW4gTiBjeWNsZSAqLwotCSAgaW5zdHIgPSBkZWNvZGVkOwotCSAgZGVjb2RlZCA9IGxvYWRlZDsKLQkgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0ck4gKHN0YXRlLCBwYyArIChpc2l6ZSAqIDIpLCBpc2l6ZSk7Ci0JICBOT1JNQUxDWUNMRTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRVNVTUU6CQkvKiBUaGUgcHJvZ3JhbSBjb3VudGVyIGhhcyBiZWVuIGNoYW5nZWQgKi8KLQkgIHBjID0gc3RhdGUtPlJlZ1sxNV07Ci0jaWZuZGVmIE1PREUzMgotCSAgcGMgPSBwYyAmIFIxNVBDQklUUzsKLSNlbmRpZgotCSAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIChpc2l6ZSAqIDIpOwotCSAgc3RhdGUtPkFib3J0ZWQgPSAwOwotCSAgaW5zdHIgPSBBUk11bF9SZUxvYWRJbnN0ciAoc3RhdGUsIHBjLCBpc2l6ZSk7Ci0JICBkZWNvZGVkID0gQVJNdWxfUmVMb2FkSW5zdHIgKHN0YXRlLCBwYyArIGlzaXplLCBpc2l6ZSk7Ci0JICBsb2FkZWQgPSBBUk11bF9SZUxvYWRJbnN0ciAoc3RhdGUsIHBjICsgaXNpemUgKiAyLCBpc2l6ZSk7Ci0JICBOT1JNQUxDWUNMRTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoJCS8qIFRoZSBwcm9ncmFtIGNvdW50ZXIgaGFzIGJlZW4gY2hhbmdlZCAqLwotCSAgcGMgPSBzdGF0ZS0+UmVnWzE1XTsKLSNpZm5kZWYgTU9ERTMyCi0JICBwYyA9IHBjICYgUjE1UENCSVRTOwotI2VuZGlmCi0JICBzdGF0ZS0+UmVnWzE1XSA9IHBjICsgKGlzaXplICogMik7Ci0JICBzdGF0ZS0+QWJvcnRlZCA9IDA7Ci0JICBpbnN0ciA9IEFSTXVsX0xvYWRJbnN0ck4gKHN0YXRlLCBwYywgaXNpemUpOwotCSAgZGVjb2RlZCA9IEFSTXVsX0xvYWRJbnN0clMgKHN0YXRlLCBwYyArIChpc2l6ZSksIGlzaXplKTsKLQkgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0clMgKHN0YXRlLCBwYyArIChpc2l6ZSAqIDIpLCBpc2l6ZSk7Ci0JICBOT1JNQUxDWUNMRTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdGF0ZS0+RXZlbnRTZXQpCi0JQVJNdWxfRW52b2tlRXZlbnQgKHN0YXRlKTsKLQotI2lmIDAKLSAgICAgIC8qIEVuYWJsZSB0aGlzIGZvciBhIGhlbHBmdWwgYml0IG9mIGRlYnVnZ2luZyB3aGVuIHRyYWNpbmcgaXMgbmVlZGVkLiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBjOiAleCwgaW5zdHI6ICV4XG4iLCBwYyAmIH4xLCBpbnN0cik7Ci0gICAgICBpZiAoaW5zdHIgPT0gMCkKLQlhYm9ydCAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAoc3RhdGUtPkV4Y2VwdGlvbikKLQl7CQkJLyogQW55IGV4Y2VwdGlvbnMgKi8KLQkgIGlmIChzdGF0ZS0+TnJlc2V0U2lnID09IExPVykKLQkgICAgewotCSAgICAgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfUmVzZXRWKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZSBpZiAoIXN0YXRlLT5OZmlxU2lnICYmICFGRkxBRykKLQkgICAgewotCSAgICAgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfRklRVik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFzdGF0ZS0+TmlycVNpZyAmJiAhSUZMQUcpCi0JICAgIHsKLQkgICAgICBBUk11bF9BYm9ydCAoc3RhdGUsIEFSTXVsX0lSUVYpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3RhdGUtPkNhbGxEZWJ1ZyA+IDApCi0JewotCSAgaW5zdHIgPSBBUk11bF9EZWJ1ZyAoc3RhdGUsIHBjLCBpbnN0cik7Ci0JICBpZiAoc3RhdGUtPkVtdWxhdGUgPCBPTkNFKQotCSAgICB7Ci0JICAgICAgc3RhdGUtPk5leHRJbnN0ciA9IFJFU1VNRTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHN0YXRlLT5EZWJ1ZykKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkF0ICUwOGx4IEluc3RyICUwOGx4IE1vZGUgJTAybHhcbiIsIHBjLCBpbnN0ciwKLQkJICAgICAgIHN0YXRlLT5Nb2RlKTsKLQkgICAgICAodm9pZCkgZmdldGMgKHN0ZGluKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0YXRlLT5FbXVsYXRlIDwgT05DRSkKLQl7Ci0JICBzdGF0ZS0+TmV4dEluc3RyID0gUkVTVU1FOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzdGF0ZS0+TnVtSW5zdHJzKys7Ci0KLSNpZmRlZiBNT0RFVAotICAgICAgLyogUHJvdmlkZSBUaHVtYiBpbnN0cnVjdGlvbiBkZWNvZGluZy4gSWYgdGhlIHByb2Nlc3NvciBpcyBpbiBUaHVtYgotICAgICAgICAgbW9kZSwgdGhlbiB3ZSBjYW4gc2ltcGx5IGRlY29kZSB0aGUgVGh1bWIgaW5zdHJ1Y3Rpb24sIGFuZCBtYXAgaXQKLSAgICAgICAgIHRvIHRoZSBjb3JyZXNwb25kaW5nIEFSTSBpbnN0cnVjdGlvbiAoYnkgZGlyZWN0bHkgbG9hZGluZyB0aGUKLSAgICAgICAgIGluc3RyIHZhcmlhYmxlLCBhbmQgbGV0dGluZyB0aGUgbm9ybWFsIEFSTSBzaW11bGF0b3IKLSAgICAgICAgIGV4ZWN1dGUpLiBUaGVyZSBhcmUgc29tZSBjYXZlYXRzIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0Ci0gICAgICAgICBwaXBlbGluZWQgUEMgdmFsdWUgaXMgdXNlZCB3aGVuIGV4ZWN1dGluZyBUaHVtYiBjb2RlLCBhbmQgYWxzbyBmb3IKLSAgICAgICAgIGRlYWxpbmcgd2l0aCB0aGUgQkwgaW5zdHJ1Y3Rpb24uICovCi0gICAgICBpZiAoVEZMQUcpCi0JewkJCS8qIGNoZWNrIGlmIGluIFRodW1iIG1vZGUgKi8KLQkgIEFSTXdvcmQgbmV3OwotCSAgc3dpdGNoIChBUk11bF9UaHVtYkRlY29kZSAoc3RhdGUsIHBjLCBpbnN0ciwgJm5ldykpCi0JICAgIHsKLQkgICAgY2FzZSB0X3VuZGVmaW5lZDoKLQkgICAgICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwkvKiBUaGlzIGlzIGEgVGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRfYnJhbmNoOgkvKiBhbHJlYWR5IHByb2Nlc3NlZCAqLwotCSAgICAgIGdvdG8gZG9uZXh0OwotCi0JICAgIGNhc2UgdF9kZWNvZGVkOgkvKiBBUk0gaW5zdHJ1Y3Rpb24gYXZhaWxhYmxlICovCi0JICAgICAgaW5zdHIgPSBuZXc7CS8qIHNvIGNvbnRpbnVlIGluc3RydWN0aW9uIGRlY29kaW5nICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSBjb25kaXRpb24gY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgaWYgKCh0ZW1wID0gVE9QQklUUyAoMjgpKSA9PSBBTCkKLQlnb3RvIG1haW5zd2l0Y2g7CS8qIHZpbGUgZGVlZCBpbiB0aGUgbmVlZCBmb3Igc3BlZWQgKi8KLQotICAgICAgc3dpdGNoICgoaW50KSBUT1BCSVRTICgyOCkpCi0JewkJCS8qIGNoZWNrIHRoZSBjb25kaXRpb24gY29kZSAqLwotCWNhc2UgQUw6Ci0JICB0ZW1wID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgTlY6Ci0JICB0ZW1wID0gRkFMU0U7Ci0JICBicmVhazsKLQljYXNlIEVROgotCSAgdGVtcCA9IFpGTEFHOwotCSAgYnJlYWs7Ci0JY2FzZSBORToKLQkgIHRlbXAgPSAhWkZMQUc7Ci0JICBicmVhazsKLQljYXNlIFZTOgotCSAgdGVtcCA9IFZGTEFHOwotCSAgYnJlYWs7Ci0JY2FzZSBWQzoKLQkgIHRlbXAgPSAhVkZMQUc7Ci0JICBicmVhazsKLQljYXNlIE1JOgotCSAgdGVtcCA9IE5GTEFHOwotCSAgYnJlYWs7Ci0JY2FzZSBQTDoKLQkgIHRlbXAgPSAhTkZMQUc7Ci0JICBicmVhazsKLQljYXNlIENTOgotCSAgdGVtcCA9IENGTEFHOwotCSAgYnJlYWs7Ci0JY2FzZSBDQzoKLQkgIHRlbXAgPSAhQ0ZMQUc7Ci0JICBicmVhazsKLQljYXNlIEhJOgotCSAgdGVtcCA9IChDRkxBRyAmJiAhWkZMQUcpOwotCSAgYnJlYWs7Ci0JY2FzZSBMUzoKLQkgIHRlbXAgPSAoIUNGTEFHIHx8IFpGTEFHKTsKLQkgIGJyZWFrOwotCWNhc2UgR0U6Ci0JICB0ZW1wID0gKCghTkZMQUcgJiYgIVZGTEFHKSB8fCAoTkZMQUcgJiYgVkZMQUcpKTsKLQkgIGJyZWFrOwotCWNhc2UgTFQ6Ci0JICB0ZW1wID0gKChORkxBRyAmJiAhVkZMQUcpIHx8ICghTkZMQUcgJiYgVkZMQUcpKTsKLQkgIGJyZWFrOwotCWNhc2UgR1Q6Ci0JICB0ZW1wID0gKCghTkZMQUcgJiYgIVZGTEFHICYmICFaRkxBRykgfHwgKE5GTEFHICYmIFZGTEFHICYmICFaRkxBRykpOwotCSAgYnJlYWs7Ci0JY2FzZSBMRToKLQkgIHRlbXAgPSAoKE5GTEFHICYmICFWRkxBRykgfHwgKCFORkxBRyAmJiBWRkxBRykpIHx8IFpGTEFHOwotCSAgYnJlYWs7Ci0JfQkJCS8qIGNjIGNoZWNrICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgQWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0cnVjdGlvbnMgYmVnaW5zIGhlcmUgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgaWYgKHRlbXApCi0JewkJCS8qIGlmIHRoZSBjb25kaXRpb24gY29kZXMgZG9uJ3QgbWF0Y2gsIHN0b3AgaGVyZSAqLwotCW1haW5zd2l0Y2g6Ci0KLQotCSAgc3dpdGNoICgoaW50KSBCSVRTICgyMCwgMjcpKQotCSAgICB7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICBEYXRhIFByb2Nlc3NpbmcgUmVnaXN0ZXIgUkhTIEluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCSAgICBjYXNlIDB4MDA6CQkvKiBBTkQgcmVnIGFuZCBNVUwgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCAxMSkgPT0gMHhCKQotCQl7Ci0JCSAgLyogU1RSSCByZWdpc3RlciBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIGRvd24sIHBvc3QgaW5kZXhlZCAqLwotCQkgIFNIRE9XTldCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogVE9ETzogQ0hFQ0s6IHNob3VsZCAweEQgYW5kIDB4RiBnZW5lcmF0ZSB1bmRlZmluZWQgaW50cnVjdGlvbiBhYm9ydHM/ICovCi0jZW5kaWYKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gOSkKLQkJewkJLyogTVVMICovCi0JCSAgcmhzID0gc3RhdGUtPlJlZ1tNVUxSSFNSZWddOwotCQkgIGlmIChNVUxMSFNSZWcgPT0gTVVMREVTVFJlZykKLQkJICAgIHsKLQkJICAgICAgVU5ERUZfTVVMRGVzdEVRT3AxOwotCQkgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChNVUxERVNUUmVnICE9IDE1KQotCQkgICAgc3RhdGUtPlJlZ1tNVUxERVNUUmVnXSA9IHN0YXRlLT5SZWdbTVVMTEhTUmVnXSAqIHJoczsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIFVOREVGX01VTFBDRGVzdDsKLQkJICAgIH0KLQkJICBmb3IgKGRlc3QgPSAwLCB0ZW1wID0gMDsgZGVzdCA8IDMyOyBkZXN0KyspCi0JCSAgICBpZiAocmhzICYgKDFMIDw8IGRlc3QpKQotCQkgICAgICB0ZW1wID0gZGVzdDsJLyogbXVsdCB0YWtlcyB0aGlzIG1hbnkvMiBJIGN5Y2xlcyAqLwotCQkgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCBBUk11bF9NdWx0VGFibGVbdGVtcF0sIDBMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogQU5EIHJlZyAqLwotCQkgIHJocyA9IERQUmVnUkhTOwotCQkgIGRlc3QgPSBMSFMgJiByaHM7Ci0JCSAgV1JJVEVERVNUIChkZXN0KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgwMToJCS8qIEFORFMgcmVnIGFuZCBNVUxTICovCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoKEJJVFMgKDQsIDExKSAmIDB4RjkpID09IDB4OSkKLQkJewotCQkgIC8qIExEUiByZWdpc3RlciBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIGRvd24sIHBvc3QgaW5kZXhlZCAqLwotCQkgIExIUE9TVERPV04gKCk7Ci0JCSAgLyogZmFsbCB0aHJvdWdoIHRvIHJlc3Qgb2YgZGVjb2RpbmcgKi8KLQkJfQotI2VuZGlmCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDkpCi0JCXsJCS8qIE1VTFMgKi8KLQkJICByaHMgPSBzdGF0ZS0+UmVnW01VTFJIU1JlZ107Ci0JCSAgaWYgKE1VTExIU1JlZyA9PSBNVUxERVNUUmVnKQotCQkgICAgewotCQkgICAgICBVTkRFRl9NVUxEZXN0RVFPcDE7Ci0JCSAgICAgIHN0YXRlLT5SZWdbTVVMREVTVFJlZ10gPSAwOwotCQkgICAgICBDTEVBUk47Ci0JCSAgICAgIFNFVFo7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoTVVMREVTVFJlZyAhPSAxNSkKLQkJICAgIHsKLQkJICAgICAgZGVzdCA9IHN0YXRlLT5SZWdbTVVMTEhTUmVnXSAqIHJoczsKLQkJICAgICAgQVJNdWxfTmVnWmVybyAoc3RhdGUsIGRlc3QpOwotCQkgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gZGVzdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIFVOREVGX01VTFBDRGVzdDsKLQkJICAgIH0KLQkJICBmb3IgKGRlc3QgPSAwLCB0ZW1wID0gMDsgZGVzdCA8IDMyOyBkZXN0KyspCi0JCSAgICBpZiAocmhzICYgKDFMIDw8IGRlc3QpKQotCQkgICAgICB0ZW1wID0gZGVzdDsJLyogbXVsdCB0YWtlcyB0aGlzIG1hbnkvMiBJIGN5Y2xlcyAqLwotCQkgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCBBUk11bF9NdWx0VGFibGVbdGVtcF0sIDBMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogQU5EUyByZWcgKi8KLQkJICByaHMgPSBEUFNSZWdSSFM7Ci0JCSAgZGVzdCA9IExIUyAmIHJoczsKLQkJICBXUklURVNERVNUIChkZXN0KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgwMjoJCS8qIEVPUiByZWcgYW5kIE1MQSAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDExKSA9PSAweEIpCi0JCXsKLQkJICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCi0JCSAgU0hET1dOV0IgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGlmIChCSVRTICg0LCA3KSA9PSA5KQotCQl7CQkvKiBNTEEgKi8KLQkJICByaHMgPSBzdGF0ZS0+UmVnW01VTFJIU1JlZ107Ci0JCSAgaWYgKE1VTExIU1JlZyA9PSBNVUxERVNUUmVnKQotCQkgICAgewotCQkgICAgICBVTkRFRl9NVUxEZXN0RVFPcDE7Ci0JCSAgICAgIHN0YXRlLT5SZWdbTVVMREVTVFJlZ10gPSBzdGF0ZS0+UmVnW01VTEFDQ1JlZ107Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoTVVMREVTVFJlZyAhPSAxNSkKLQkJICAgIHN0YXRlLT5SZWdbTVVMREVTVFJlZ10gPQotCQkgICAgICBzdGF0ZS0+UmVnW01VTExIU1JlZ10gKiByaHMgKyBzdGF0ZS0+UmVnW01VTEFDQ1JlZ107Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBVTkRFRl9NVUxQQ0Rlc3Q7Ci0JCSAgICB9Ci0JCSAgZm9yIChkZXN0ID0gMCwgdGVtcCA9IDA7IGRlc3QgPCAzMjsgZGVzdCsrKQotCQkgICAgaWYgKHJocyAmICgxTCA8PCBkZXN0KSkKLQkJICAgICAgdGVtcCA9IGRlc3Q7CS8qIG11bHQgdGFrZXMgdGhpcyBtYW55LzIgSSBjeWNsZXMgKi8KLQkJICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgQVJNdWxfTXVsdFRhYmxlW3RlbXBdLCAwTCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByaHMgPSBEUFJlZ1JIUzsKLQkJICBkZXN0ID0gTEhTIF4gcmhzOwotCQkgIFdSSVRFREVTVCAoZGVzdCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MDM6CQkvKiBFT1JTIHJlZyBhbmQgTUxBUyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCAxMSkgJiAweEY5KSA9PSAweDkpCi0JCXsKLQkJICAvKiBMRFIgcmVnaXN0ZXIgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwb3N0LWluZGV4ZWQgKi8KLQkJICBMSFBPU1RET1dOICgpOwotCQkgIC8qIGZhbGwgdGhyb3VnaCB0byByZXN0IG9mIHRoZSBkZWNvZGluZyAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gOSkKLQkJewkJLyogTUxBUyAqLwotCQkgIHJocyA9IHN0YXRlLT5SZWdbTVVMUkhTUmVnXTsKLQkJICBpZiAoTVVMTEhTUmVnID09IE1VTERFU1RSZWcpCi0JCSAgICB7Ci0JCSAgICAgIFVOREVGX01VTERlc3RFUU9wMTsKLQkJICAgICAgZGVzdCA9IHN0YXRlLT5SZWdbTVVMQUNDUmVnXTsKLQkJICAgICAgQVJNdWxfTmVnWmVybyAoc3RhdGUsIGRlc3QpOwotCQkgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gZGVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChNVUxERVNUUmVnICE9IDE1KQotCQkgICAgewotCQkgICAgICBkZXN0ID0KLQkJCXN0YXRlLT5SZWdbTVVMTEhTUmVnXSAqIHJocyArIHN0YXRlLT5SZWdbTVVMQUNDUmVnXTsKLQkJICAgICAgQVJNdWxfTmVnWmVybyAoc3RhdGUsIGRlc3QpOwotCQkgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gZGVzdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIFVOREVGX01VTFBDRGVzdDsKLQkJICAgIH0KLQkJICBmb3IgKGRlc3QgPSAwLCB0ZW1wID0gMDsgZGVzdCA8IDMyOyBkZXN0KyspCi0JCSAgICBpZiAocmhzICYgKDFMIDw8IGRlc3QpKQotCQkgICAgICB0ZW1wID0gZGVzdDsJLyogbXVsdCB0YWtlcyB0aGlzIG1hbnkvMiBJIGN5Y2xlcyAqLwotCQkgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCBBUk11bF9NdWx0VGFibGVbdGVtcF0sIDBMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogRU9SUyBSZWcgKi8KLQkJICByaHMgPSBEUFNSZWdSSFM7Ci0JCSAgZGVzdCA9IExIUyBeIHJoczsKLQkJICBXUklURVNERVNUIChkZXN0KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgwNDoJCS8qIFNVQiByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCA3KSA9PSAweEIpCi0JCXsKLQkJICAvKiBTVFJIIGltbWVkaWF0ZSBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIGRvd24sIHBvc3QgaW5kZXhlZCAqLwotCQkgIFNIRE9XTldCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLQkgICAgICByaHMgPSBEUFJlZ1JIUzsKLQkgICAgICBkZXN0ID0gTEhTIC0gcmhzOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDA1OgkJLyogU1VCUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgNykgJiAweDkpID09IDB4OSkKLQkJewotCQkgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwb3N0IGluZGV4ZWQgKi8KLQkJICBMSFBPU1RET1dOICgpOwotCQkgIC8qIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KLQkJfQotI2VuZGlmCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSBsaHMgLSByaHM7Ci0JICAgICAgaWYgKChsaHMgPj0gcmhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKQotCQl7Ci0JCSAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgQVJNdWxfU3ViT3ZlcmZsb3cgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDA2OgkJLyogUlNCIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCi0JCSAgU0hET1dOV0IgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSByaHMgLSBMSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MDc6CQkvKiBSU0JTIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCA3KSAmIDB4OSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIGltbWVkaWF0ZSBvZmZzZXQsIHdyaXRlLWJhY2ssIGRvd24sIHBvc3QgaW5kZXhlZCAqLwotCQkgIExIUE9TVERPV04gKCk7Ci0JCSAgLyogZmFsbCB0aHJvdWdoIHRvIHJlbWFpbmRlciBvZiBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgcmhzID0gRFBSZWdSSFM7Ci0JICAgICAgZGVzdCA9IHJocyAtIGxoczsKLQkgICAgICBpZiAoKHJocyA+PSBsaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpCi0JCXsKLQkJICBBUk11bF9TdWJDYXJyeSAoc3RhdGUsIHJocywgbGhzLCBkZXN0KTsKLQkJICBBUk11bF9TdWJPdmVyZmxvdyAoc3RhdGUsIHJocywgbGhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSQzsKLQkJICBDTEVBUlY7Ci0JCX0KLQkgICAgICBXUklURVNERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MDg6CQkvKiBBREQgcmVnICovCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgMTEpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCB1cCwgcG9zdCBpbmRleGVkICovCi0JCSAgU0hVUFdCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCA3KSA9PSAweDkpCi0JCXsJCS8qIE1VTEwgKi8KLQkJICAvKiAzMngzMiA9IDY0ICovCi0JCSAgQVJNdWxfSWN5Y2xlcyAoc3RhdGUsCi0JCQkJIE11bHRpcGx5NjQgKHN0YXRlLCBpbnN0ciwgTFVOU0lHTkVELAotCQkJCQkgICAgIExERUZBVUxUKSwgMEwpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLQkgICAgICByaHMgPSBEUFJlZ1JIUzsKLQkgICAgICBkZXN0ID0gTEhTICsgcmhzOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDA5OgkJLyogQUREUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgMTEpICYgMHhGOSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLwotCQkgIExIUE9TVFVQICgpOwotCQkgIC8qIGZhbGwgdGhyb3VnaCB0byByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KLQkJfQotI2VuZGlmCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gMHg5KQotCQl7CQkvKiBNVUxMICovCi0JCSAgLyogMzJ4MzI9NjQgKi8KLQkJICBBUk11bF9JY3ljbGVzIChzdGF0ZSwKLQkJCQkgTXVsdGlwbHk2NCAoc3RhdGUsIGluc3RyLCBMVU5TSUdORUQsIExTQ0MpLAotCQkJCSAwTCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICByaHMgPSBEUFJlZ1JIUzsKLQkgICAgICBkZXN0ID0gbGhzICsgcmhzOwotCSAgICAgIEFTU0lHTlogKGRlc3QgPT0gMCk7Ci0JICAgICAgaWYgKChsaHMgfCByaHMpID4+IDMwKQotCQl7CQkvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KLQkJICBBU1NJR05OIChORUcgKGRlc3QpKTsKLQkJICBBUk11bF9BZGRDYXJyeSAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICBBUk11bF9BZGRPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSTjsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDBhOgkJLyogQURDIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDExKSA9PSAweEIpCi0JCXsKLQkJICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QtaW5kZXhlZCAqLwotCQkgIFNIVVBXQiAoKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gMHg5KQotCQl7CQkvKiBNVUxMICovCi0JCSAgLyogMzJ4MzI9NjQgKi8KLQkJICBBUk11bF9JY3ljbGVzIChzdGF0ZSwKLQkJCQkgTXVsdGlwbHlBZGQ2NCAoc3RhdGUsIGluc3RyLCBMVU5TSUdORUQsCi0JCQkJCQlMREVGQVVMVCksIDBMKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgcmhzID0gRFBSZWdSSFM7Ci0JICAgICAgZGVzdCA9IExIUyArIHJocyArIENGTEFHOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDBiOgkJLyogQURDUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgMTEpICYgMHhGOSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLwotCQkgIExIUE9TVFVQICgpOwotCQkgIC8qIGZhbGwgdGhyb3VnaCB0byByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KLQkJfQotI2VuZGlmCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gMHg5KQotCQl7CQkvKiBNVUxMICovCi0JCSAgLyogMzJ4MzI9NjQgKi8KLQkJICBBUk11bF9JY3ljbGVzIChzdGF0ZSwKLQkJCQkgTXVsdGlwbHlBZGQ2NCAoc3RhdGUsIGluc3RyLCBMVU5TSUdORUQsCi0JCQkJCQlMU0NDKSwgMEwpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgcmhzID0gRFBSZWdSSFM7Ci0JICAgICAgZGVzdCA9IGxocyArIHJocyArIENGTEFHOwotCSAgICAgIEFTU0lHTlogKGRlc3QgPT0gMCk7Ci0JICAgICAgaWYgKChsaHMgfCByaHMpID4+IDMwKQotCQl7CQkvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KLQkJICBBU1NJR05OIChORUcgKGRlc3QpKTsKLQkJICBBUk11bF9BZGRDYXJyeSAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICBBUk11bF9BZGRPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSTjsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDBjOgkJLyogU0JDIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAgcG9zdCBpbmRleGVkICovCi0JCSAgU0hVUFdCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCA3KSA9PSAweDkpCi0JCXsJCS8qIE1VTEwgKi8KLQkJICAvKiAzMngzMj02NCAqLwotCQkgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLAotCQkJCSBNdWx0aXBseTY0IChzdGF0ZSwgaW5zdHIsIExTSUdORUQsIExERUZBVUxUKSwKLQkJCQkgMEwpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLQkgICAgICByaHMgPSBEUFJlZ1JIUzsKLQkgICAgICBkZXN0ID0gTEhTIC0gcmhzIC0gIUNGTEFHOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDBkOgkJLyogU0JDUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgNykgJiAweDkpID09IDB4OSkKLQkJewotCQkgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCB1cCwgcG9zdCBpbmRleGVkICovCi0JCSAgTEhQT1NUVVAgKCk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4OSkKLQkJewkJLyogTVVMTCAqLwotCQkgIC8qIDMyeDMyPTY0ICovCi0JCSAgQVJNdWxfSWN5Y2xlcyAoc3RhdGUsCi0JCQkJIE11bHRpcGx5NjQgKHN0YXRlLCBpbnN0ciwgTFNJR05FRCwgTFNDQyksCi0JCQkJIDBMKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSBsaHMgLSByaHMgLSAhQ0ZMQUc7Ci0JICAgICAgaWYgKChsaHMgPj0gcmhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKQotCQl7Ci0JCSAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgQVJNdWxfU3ViT3ZlcmZsb3cgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDBlOgkJLyogUlNDIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLwotCQkgIFNIVVBXQiAoKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgNykgPT0gMHg5KQotCQl7CQkvKiBNVUxMICovCi0JCSAgLyogMzJ4MzI9NjQgKi8KLQkJICBBUk11bF9JY3ljbGVzIChzdGF0ZSwKLQkJCQkgTXVsdGlwbHlBZGQ2NCAoc3RhdGUsIGluc3RyLCBMU0lHTkVELAotCQkJCQkJTERFRkFVTFQpLCAwTCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSByaHMgLSBMSFMgLSAhQ0ZMQUc7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MGY6CQkvKiBSU0NTIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCA3KSAmIDB4OSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIGltbWVkaWF0ZSBvZmZzZXQsIHdyaXRlLWJhY2ssIHVwLCBwb3N0IGluZGV4ZWQgKi8KLQkJICBMSFBPU1RVUCAoKTsKLQkJICAvKiBmYWxsIHRocm91Z2ggdG8gcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kaW5nICovCi0JCX0KLSNlbmRpZgotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4OSkKLQkJewkJLyogTVVMTCAqLwotCQkgIC8qIDMyeDMyPTY0ICovCi0JCSAgQVJNdWxfSWN5Y2xlcyAoc3RhdGUsCi0JCQkJIE11bHRpcGx5QWRkNjQgKHN0YXRlLCBpbnN0ciwgTFNJR05FRCwgTFNDQyksCi0JCQkJIDBMKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSByaHMgLSBsaHMgLSAhQ0ZMQUc7Ci0JICAgICAgaWYgKChyaHMgPj0gbGhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKQotCQl7Ci0JCSAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCSAgQVJNdWxfU3ViT3ZlcmZsb3cgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDEwOgkJLyogVFNUIHJlZyBhbmQgTVJTIENQU1IgYW5kIFNXUCB3b3JkICovCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgMTEpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLwotCQkgIFNIUFJFRE9XTiAoKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgaWYgKEJJVFMgKDQsIDExKSA9PSA5KQotCQl7CQkvKiBTV1AgKi8KLQkJICBVTkRFRl9TV1BQQzsKLQkJICB0ZW1wID0gTEhTOwotCQkgIEJVU1VTRURJTkNQQ1M7Ci0jaWZuZGVmIE1PREUzMgotCQkgIGlmIChWRUNUT1JBQ0NFU1MgKHRlbXApIHx8IEFERFJFWENFUFQgKHRlbXApKQotCQkgICAgewotCQkgICAgICBJTlRFUk5BTEFCT1JUICh0ZW1wKTsKLQkJICAgICAgKHZvaWQpIEFSTXVsX0xvYWRXb3JkTiAoc3RhdGUsIHRlbXApOwotCQkgICAgICAodm9pZCkgQVJNdWxfTG9hZFdvcmROIChzdGF0ZSwgdGVtcCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotI2VuZGlmCi0JCSAgICBkZXN0ID0gQVJNdWxfU3dhcFdvcmQgKHN0YXRlLCB0ZW1wLCBzdGF0ZS0+UmVnW1JIU1JlZ10pOwotCQkgIGlmICh0ZW1wICYgMykKLQkJICAgIERFU1QgPSBBUk11bF9BbGlnbiAoc3RhdGUsIHRlbXAsIGRlc3QpOwotCQkgIGVsc2UKLQkJICAgIERFU1QgPSBkZXN0OwotCQkgIGlmIChzdGF0ZS0+YWJvcnRTaWcgfHwgc3RhdGUtPkFib3J0ZWQpCi0JCSAgICB7Ci0JCSAgICAgIFRBS0VBQk9SVDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChCSVRTICgwLCAxMSkgPT0gMCkgJiYgKExIU1JlZyA9PSAxNSkpCi0JCXsJCS8qIE1SUyBDUFNSICovCi0JCSAgVU5ERUZfTVJTUEM7Ci0JCSAgREVTVCA9IEVDQyB8IEVJTlQgfCBFTU9ERTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFVOREVGX1Rlc3Q7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MTE6CQkvKiBUU1RQIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCAxMSkgJiAweEY5KSA9PSAweDkpCi0JCXsKLQkJICAvKiBMRFIgcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLwotCQkgIExIUFJFRE9XTiAoKTsKLQkJICAvKiBjb250aW51ZSB3aXRoIHJlbWFpbmluZyBpbnN0cnVjdGlvbiBkZWNvZGUgKi8KLQkJfQotI2VuZGlmCi0JICAgICAgaWYgKERFU1RSZWcgPT0gMTUpCi0JCXsJCS8qIFRTVFAgcmVnICovCi0jaWZkZWYgTU9ERTMyCi0JCSAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSIChzdGF0ZS0+QmFuayk7Ci0JCSAgQVJNdWxfQ1BTUkFsdGVyZWQgKHN0YXRlKTsKLSNlbHNlCi0JCSAgcmhzID0gRFBSZWdSSFM7Ci0JCSAgdGVtcCA9IExIUyAmIHJoczsKLQkJICBTRVRSMTVQU1IgKHRlbXApOwotI2VuZGlmCi0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIFRTVCByZWcgKi8KLQkJICByaHMgPSBEUFNSZWdSSFM7Ci0JCSAgZGVzdCA9IExIUyAmIHJoczsKLQkJICBBUk11bF9OZWdaZXJvIChzdGF0ZSwgZGVzdCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MTI6CQkvKiBURVEgcmVnIGFuZCBNU1IgcmVnIHRvIENQU1IgKEFSTTYpICovCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoQklUUyAoNCwgMTEpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggcmVnaXN0ZXIgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLwotCQkgIFNIUFJFRE9XTldCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCAyNykgPT0gMHgxMkZGRjEpCi0JCXsJCS8qIEJYICovCi0JCSAgLyogQnJhbmNoIHRvIHRoZSBhZGRyZXNzIGluIFJIU1JlZy4gSWYgYml0MCBvZgotCQkgICAgIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgMSB0aGVuIHN3aXRjaCB0byBUaHVtYiBtb2RlOiAqLwotCQkgIEFSTXdvcmQgYWRkciA9IHN0YXRlLT5SZWdbUkhTUmVnXTsKLQotCQkgIC8qIElmIHdlIHJlYWQgdGhlIFBDIHRoZW4gdGhlIGJvdHRvbSBiaXQgaXMgY2xlYXIgKi8KLQkJICBpZiAoUkhTUmVnID09IDE1KQotCQkgICAgYWRkciAmPSB+MTsKLQotCQkgIC8qIEVuYWJsZSB0aGlzIGZvciBhIGhlbHBmdWwgYml0IG9mIGRlYnVnZ2luZyB3aGVuCi0JCSAgICAgR0RCIGlzIG5vdCB5ZXQgZnVsbHkgd29ya2luZy4uLiAKLQkJICAgICBmcHJpbnRmIChzdGRlcnIsICJCWCBhdCAleCB0byAleCAoZ28gJXMpXG4iLAotCQkgICAgIHN0YXRlLT5SZWdbMTVdLCBhZGRyLCAoYWRkciAmIDEpID8gInRodW1iIjogImFybSIgKTsgKi8KLQotCQkgIGlmIChhZGRyICYgKDEgPDwgMCkpCi0JCSAgICB7CQkvKiBUaHVtYiBiaXQgKi8KLQkJICAgICAgU0VUVDsKLQkJICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBhZGRyICYgMHhmZmZmZmZmZTsKLQkJICAgICAgLyogTk9URTogVGhlIG90aGVyIENQU1IgZmxhZyBzZXR0aW5nIGJsb2NrcyBkbyBub3QKLQkJICAgICAgICAgc2VlbSB0byB1cGRhdGUgdGhlIHN0YXRlLT5DcHNyIHN0YXRlLCBidXQganVzdCBkbwotCQkgICAgICAgICB0aGUgZXhwbGljaXQgZmxhZy4gVGhlIGNvcHkgZnJvbSB0aGUgc2VwZXJhdGUKLQkJICAgICAgICAgZmxhZ3MgdG8gdGhlIHJlZ2lzdGVyIG11c3QgaGFwcGVuIGxhdGVyLiAqLwotCQkgICAgICBGTFVTSFBJUEU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBDTEVBUlQ7Ci0JCSAgICAgIHN0YXRlLT5SZWdbMTVdID0gYWRkciAmIDB4ZmZmZmZmZmM7Ci0JCSAgICAgIEZMVVNIUElQRTsKLQkJICAgIH0KLQkJfQotI2VuZGlmCi0JICAgICAgaWYgKERFU1RSZWcgPT0gMTUgJiYgQklUUyAoMTcsIDE4KSA9PSAwKQotCQl7CQkvKiBNU1IgcmVnIHRvIENQU1IgKi8KLQkJICBVTkRFRl9NU1JQQzsKLQkJICB0ZW1wID0gRFBSZWdSSFM7Ci0JCSAgQVJNdWxfRml4Q1BTUiAoc3RhdGUsIGluc3RyLCB0ZW1wKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFVOREVGX1Rlc3Q7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MTM6CQkvKiBURVFQIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCAxMSkgJiAweEY5KSA9PSAweDkpCi0JCXsKLQkJICAvKiBMRFIgcmVnaXN0ZXIgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLwotCQkgIExIUFJFRE9XTldCICgpOwotCQkgIC8qIGNvbnRpbnVlIHdpdGggcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kZSAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICBpZiAoREVTVFJlZyA9PSAxNSkKLQkJewkJLyogVEVRUCByZWcgKi8KLSNpZmRlZiBNT0RFMzIKLQkJICBzdGF0ZS0+Q3BzciA9IEdFVFNQU1IgKHN0YXRlLT5CYW5rKTsKLQkJICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotI2Vsc2UKLQkJICByaHMgPSBEUFJlZ1JIUzsKLQkJICB0ZW1wID0gTEhTIF4gcmhzOwotCQkgIFNFVFIxNVBTUiAodGVtcCk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogVEVRIFJlZyAqLwotCQkgIHJocyA9IERQU1JlZ1JIUzsKLQkJICBkZXN0ID0gTEhTIF4gcmhzOwotCQkgIEFSTXVsX05lZ1plcm8gKHN0YXRlLCBkZXN0KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgxNDoJCS8qIENNUCByZWcgYW5kIE1SUyBTUFNSIGFuZCBTV1AgYnl0ZSAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KLQkJICBTSFBSRURPV04gKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGlmIChCSVRTICg0LCAxMSkgPT0gOSkKLQkJewkJLyogU1dQICovCi0JCSAgVU5ERUZfU1dQUEM7Ci0JCSAgdGVtcCA9IExIUzsKLQkJICBCVVNVU0VESU5DUENTOwotI2lmbmRlZiBNT0RFMzIKLQkJICBpZiAoVkVDVE9SQUNDRVNTICh0ZW1wKSB8fCBBRERSRVhDRVBUICh0ZW1wKSkKLQkJICAgIHsKLQkJICAgICAgSU5URVJOQUxBQk9SVCAodGVtcCk7Ci0JCSAgICAgICh2b2lkKSBBUk11bF9Mb2FkQnl0ZSAoc3RhdGUsIHRlbXApOwotCQkgICAgICAodm9pZCkgQVJNdWxfTG9hZEJ5dGUgKHN0YXRlLCB0ZW1wKTsKLQkJICAgIH0KLQkJICBlbHNlCi0jZW5kaWYKLQkJICAgIERFU1QgPSBBUk11bF9Td2FwQnl0ZSAoc3RhdGUsIHRlbXAsIHN0YXRlLT5SZWdbUkhTUmVnXSk7Ci0JCSAgaWYgKHN0YXRlLT5hYm9ydFNpZyB8fCBzdGF0ZS0+QWJvcnRlZCkKLQkJICAgIHsKLQkJICAgICAgVEFLRUFCT1JUOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKEJJVFMgKDAsIDExKSA9PSAwKSAmJiAoTEhTUmVnID09IDE1KSkKLQkJewkJLyogTVJTIFNQU1IgKi8KLQkJICBVTkRFRl9NUlNQQzsKLQkJICBERVNUID0gR0VUU1BTUiAoc3RhdGUtPkJhbmspOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgVU5ERUZfVGVzdDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgxNToJCS8qIENNUFAgcmVnICovCi0jaWZkZWYgTU9ERVQKLQkgICAgICBpZiAoKEJJVFMgKDQsIDcpICYgMHg5KSA9PSAweDkpCi0JCXsKLQkJICAvKiBMRFIgaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KLQkJICBMSFBSRURPV04gKCk7Ci0JCSAgLyogY29udGludWUgd2l0aCByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RlICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGlmIChERVNUUmVnID09IDE1KQotCQl7CQkvKiBDTVBQIHJlZyAqLwotI2lmZGVmIE1PREUzMgotCQkgIHN0YXRlLT5DcHNyID0gR0VUU1BTUiAoc3RhdGUtPkJhbmspOwotCQkgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0jZWxzZQotCQkgIHJocyA9IERQUmVnUkhTOwotCQkgIHRlbXAgPSBMSFMgLSByaHM7Ci0JCSAgU0VUUjE1UFNSICh0ZW1wKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBDTVAgcmVnICovCi0JCSAgbGhzID0gTEhTOwotCQkgIHJocyA9IERQUmVnUkhTOwotCQkgIGRlc3QgPSBsaHMgLSByaHM7Ci0JCSAgQVJNdWxfTmVnWmVybyAoc3RhdGUsIGRlc3QpOwotCQkgIGlmICgobGhzID49IHJocykgfHwgKChyaHMgfCBsaHMpID4+IDMxKSkKLQkJICAgIHsKLQkJICAgICAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgICAgIEFSTXVsX1N1Yk92ZXJmbG93IChzdGF0ZSwgbGhzLCByaHMsIGRlc3QpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQ0xFQVJDOwotCQkgICAgICBDTEVBUlY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MTY6CQkvKiBDTU4gcmVnIGFuZCBNU1IgcmVnIHRvIFNQU1IgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCA3KSA9PSAweEIpCi0JCXsKLQkJICAvKiBTVFJIIGltbWVkaWF0ZSBvZmZzZXQsIHdyaXRlLWJhY2ssIGRvd24sIHByZSBpbmRleGVkICovCi0JCSAgU0hQUkVET1dOV0IgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGlmIChERVNUUmVnID09IDE1ICYmIEJJVFMgKDE3LCAxOCkgPT0gMCkKLQkJewkJLyogTVNSICovCi0JCSAgVU5ERUZfTVNSUEM7Ci0JCSAgQVJNdWxfRml4U1BTUiAoc3RhdGUsIGluc3RyLCBEUFJlZ1JIUyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBVTkRFRl9UZXN0OwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDE3OgkJLyogQ01OUCByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgNykgJiAweDkpID09IDB4OSkKLQkJewotCQkgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLwotCQkgIExIUFJFRE9XTldCICgpOwotCQkgIC8qIGNvbnRpbnVlIHdpdGggcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kaW5nICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGlmIChERVNUUmVnID09IDE1KQotCQl7Ci0jaWZkZWYgTU9ERTMyCi0JCSAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSIChzdGF0ZS0+QmFuayk7Ci0JCSAgQVJNdWxfQ1BTUkFsdGVyZWQgKHN0YXRlKTsKLSNlbHNlCi0JCSAgcmhzID0gRFBSZWdSSFM7Ci0JCSAgdGVtcCA9IExIUyArIHJoczsKLQkJICBTRVRSMTVQU1IgKHRlbXApOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIENNTiByZWcgKi8KLQkJICBsaHMgPSBMSFM7Ci0JCSAgcmhzID0gRFBSZWdSSFM7Ci0JCSAgZGVzdCA9IGxocyArIHJoczsKLQkJICBBU1NJR05aIChkZXN0ID09IDApOwotCQkgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkKLQkJICAgIHsJCS8qIHBvc3NpYmxlIEMsVixOIHRvIHNldCAqLwotCQkgICAgICBBU1NJR05OIChORUcgKGRlc3QpKTsKLQkJICAgICAgQVJNdWxfQWRkQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgICAgIEFSTXVsX0FkZE92ZXJmbG93IChzdGF0ZSwgbGhzLCByaHMsIGRlc3QpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQ0xFQVJOOwotCQkgICAgICBDTEVBUkM7Ci0JCSAgICAgIENMRUFSVjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgxODoJCS8qIE9SUiByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCAxMSkgPT0gMHhCKQotCQl7Ci0JCSAgLyogU1RSSCByZWdpc3RlciBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIHVwLCBwcmUgaW5kZXhlZCAqLwotCQkgIFNIUFJFVVAgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLSNlbmRpZgotCSAgICAgIHJocyA9IERQUmVnUkhTOwotCSAgICAgIGRlc3QgPSBMSFMgfCByaHM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MTk6CQkvKiBPUlJTIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCAxMSkgJiAweEY5KSA9PSAweDkpCi0JCXsKLQkJICAvKiBMRFIgcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCB1cCwgcHJlIGluZGV4ZWQgKi8KLQkJICBMSFBSRVVQICgpOwotCQkgIC8qIGNvbnRpbnVlIHdpdGggcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kaW5nICovCi0JCX0KLSNlbmRpZgotCSAgICAgIHJocyA9IERQU1JlZ1JIUzsKLQkgICAgICBkZXN0ID0gTEhTIHwgcmhzOwotCSAgICAgIFdSSVRFU0RFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgxYToJCS8qIE1PViByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmIChCSVRTICg0LCAxMSkgPT0gMHhCKQotCQl7Ci0JCSAgLyogU1RSSCByZWdpc3RlciBvZmZzZXQsIHdyaXRlLWJhY2ssIHVwLCBwcmUgaW5kZXhlZCAqLwotCQkgIFNIUFJFVVBXQiAoKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgZGVzdCA9IERQUmVnUkhTOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDFiOgkJLyogTU9WUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgMTEpICYgMHhGOSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCi0JCSAgTEhQUkVVUFdCICgpOwotCQkgIC8qIGNvbnRpbnVlIHdpdGggcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kaW5nICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGRlc3QgPSBEUFNSZWdSSFM7Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDFjOgkJLyogQklDIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCi0JCSAgU0hQUkVVUCAoKTsKLQkJICBicmVhazsKLQkJfQotI2VuZGlmCi0JICAgICAgcmhzID0gRFBSZWdSSFM7Ci0JICAgICAgZGVzdCA9IExIUyAmIH5yaHM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MWQ6CQkvKiBCSUNTIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKChCSVRTICg0LCA3KSAmIDB4OSkgPT0gMHg5KQotCQl7Ci0JCSAgLyogTERSIGltbWVkaWF0ZSBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIHVwLCBwcmUgaW5kZXhlZCAqLwotCQkgIExIUFJFVVAgKCk7Ci0JCSAgLyogY29udGludWUgd2l0aCBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICByaHMgPSBEUFNSZWdSSFM7Ci0JICAgICAgZGVzdCA9IExIUyAmIH5yaHM7Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDFlOgkJLyogTVZOIHJlZyAqLwotI2lmZGVmIE1PREVUCi0JICAgICAgaWYgKEJJVFMgKDQsIDcpID09IDB4QikKLQkJewotCQkgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCi0JCSAgU0hQUkVVUFdCICgpOwotCQkgIGJyZWFrOwotCQl9Ci0jZW5kaWYKLQkgICAgICBkZXN0ID0gfkRQUmVnUkhTOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDFmOgkJLyogTVZOUyByZWcgKi8KLSNpZmRlZiBNT0RFVAotCSAgICAgIGlmICgoQklUUyAoNCwgNykgJiAweDkpID09IDB4OSkKLQkJewotCQkgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCB3cml0ZS1iYWNrLCB1cCwgcHJlIGluZGV4ZWQgKi8KLQkJICBMSFBSRVVQV0IgKCk7Ci0JCSAgLyogY29udGludWUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KLQkJfQotI2VuZGlmCi0JICAgICAgZGVzdCA9IH5EUFNSZWdSSFM7Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgIERhdGEgUHJvY2Vzc2luZyBJbW1lZGlhdGUgUkhTIEluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCSAgICBjYXNlIDB4MjA6CQkvKiBBTkQgaW1tZWQgKi8KLQkgICAgICBkZXN0ID0gTEhTICYgRFBJbW1SSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MjE6CQkvKiBBTkRTIGltbWVkICovCi0JICAgICAgRFBTSW1tUkhTOwotCSAgICAgIGRlc3QgPSBMSFMgJiByaHM7Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDIyOgkJLyogRU9SIGltbWVkICovCi0JICAgICAgZGVzdCA9IExIUyBeIERQSW1tUkhTOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDIzOgkJLyogRU9SUyBpbW1lZCAqLwotCSAgICAgIERQU0ltbVJIUzsKLQkgICAgICBkZXN0ID0gTEhTIF4gcmhzOwotCSAgICAgIFdSSVRFU0RFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgyNDoJCS8qIFNVQiBpbW1lZCAqLwotCSAgICAgIGRlc3QgPSBMSFMgLSBEUEltbVJIUzsKLQkgICAgICBXUklURURFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgyNToJCS8qIFNVQlMgaW1tZWQgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgcmhzID0gRFBJbW1SSFM7Ci0JICAgICAgZGVzdCA9IGxocyAtIHJoczsKLQkgICAgICBpZiAoKGxocyA+PSByaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpCi0JCXsKLQkJICBBUk11bF9TdWJDYXJyeSAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICBBUk11bF9TdWJPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSQzsKLQkJICBDTEVBUlY7Ci0JCX0KLQkgICAgICBXUklURVNERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MjY6CQkvKiBSU0IgaW1tZWQgKi8KLQkgICAgICBkZXN0ID0gRFBJbW1SSFMgLSBMSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Mjc6CQkvKiBSU0JTIGltbWVkICovCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQSW1tUkhTOwotCSAgICAgIGRlc3QgPSByaHMgLSBsaHM7Ci0JICAgICAgaWYgKChyaHMgPj0gbGhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKQotCQl7Ci0JCSAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCSAgQVJNdWxfU3ViT3ZlcmZsb3cgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDI4OgkJLyogQUREIGltbWVkICovCi0JICAgICAgZGVzdCA9IExIUyArIERQSW1tUkhTOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDI5OgkJLyogQUREUyBpbW1lZCAqLwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICByaHMgPSBEUEltbVJIUzsKLQkgICAgICBkZXN0ID0gbGhzICsgcmhzOwotCSAgICAgIEFTU0lHTlogKGRlc3QgPT0gMCk7Ci0JICAgICAgaWYgKChsaHMgfCByaHMpID4+IDMwKQotCQl7CQkvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KLQkJICBBU1NJR05OIChORUcgKGRlc3QpKTsKLQkJICBBUk11bF9BZGRDYXJyeSAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICBBUk11bF9BZGRPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSTjsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDJhOgkJLyogQURDIGltbWVkICovCi0JICAgICAgZGVzdCA9IExIUyArIERQSW1tUkhTICsgQ0ZMQUc7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MmI6CQkvKiBBRENTIGltbWVkICovCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQSW1tUkhTOwotCSAgICAgIGRlc3QgPSBsaHMgKyByaHMgKyBDRkxBRzsKLQkgICAgICBBU1NJR05aIChkZXN0ID09IDApOwotCSAgICAgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkKLQkJewkJLyogcG9zc2libGUgQyxWLE4gdG8gc2V0ICovCi0JCSAgQVNTSUdOTiAoTkVHIChkZXN0KSk7Ci0JCSAgQVJNdWxfQWRkQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgQVJNdWxfQWRkT3ZlcmZsb3cgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUk47Ci0JCSAgQ0xFQVJDOwotCQkgIENMRUFSVjsKLQkJfQotCSAgICAgIFdSSVRFU0RFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgyYzoJCS8qIFNCQyBpbW1lZCAqLwotCSAgICAgIGRlc3QgPSBMSFMgLSBEUEltbVJIUyAtICFDRkxBRzsKLQkgICAgICBXUklURURFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgyZDoJCS8qIFNCQ1MgaW1tZWQgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgcmhzID0gRFBJbW1SSFM7Ci0JICAgICAgZGVzdCA9IGxocyAtIHJocyAtICFDRkxBRzsKLQkgICAgICBpZiAoKGxocyA+PSByaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpCi0JCXsKLQkJICBBUk11bF9TdWJDYXJyeSAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICBBUk11bF9TdWJPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENMRUFSQzsKLQkJICBDTEVBUlY7Ci0JCX0KLQkgICAgICBXUklURVNERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MmU6CQkvKiBSU0MgaW1tZWQgKi8KLQkgICAgICBkZXN0ID0gRFBJbW1SSFMgLSBMSFMgLSAhQ0ZMQUc7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MmY6CQkvKiBSU0NTIGltbWVkICovCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHJocyA9IERQSW1tUkhTOwotCSAgICAgIGRlc3QgPSByaHMgLSBsaHMgLSAhQ0ZMQUc7Ci0JICAgICAgaWYgKChyaHMgPj0gbGhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKQotCQl7Ci0JCSAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCSAgQVJNdWxfU3ViT3ZlcmZsb3cgKHN0YXRlLCByaHMsIGxocywgZGVzdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBDTEVBUkM7Ci0JCSAgQ0xFQVJWOwotCQl9Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDMwOgkJLyogVFNUIGltbWVkICovCi0JICAgICAgVU5ERUZfVGVzdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MzE6CQkvKiBUU1RQIGltbWVkICovCi0JICAgICAgaWYgKERFU1RSZWcgPT0gMTUpCi0JCXsJCS8qIFRTVFAgaW1tZWQgKi8KLSNpZmRlZiBNT0RFMzIKLQkJICBzdGF0ZS0+Q3BzciA9IEdFVFNQU1IgKHN0YXRlLT5CYW5rKTsKLQkJICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotI2Vsc2UKLQkJICB0ZW1wID0gTEhTICYgRFBJbW1SSFM7Ci0JCSAgU0VUUjE1UFNSICh0ZW1wKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRFBTSW1tUkhTOwkvKiBUU1QgaW1tZWQgKi8KLQkJICBkZXN0ID0gTEhTICYgcmhzOwotCQkgIEFSTXVsX05lZ1plcm8gKHN0YXRlLCBkZXN0KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgzMjoJCS8qIFRFUSBpbW1lZCBhbmQgTVNSIGltbWVkIHRvIENQU1IgKi8KLQkgICAgICBpZiAoREVTVFJlZyA9PSAxNSAmJiBCSVRTICgxNywgMTgpID09IDApCi0JCXsJCS8qIE1TUiBpbW1lZCB0byBDUFNSICovCi0JCSAgQVJNdWxfRml4Q1BTUiAoc3RhdGUsIGluc3RyLCBEUEltbVJIUyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBVTkRFRl9UZXN0OwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDMzOgkJLyogVEVRUCBpbW1lZCAqLwotCSAgICAgIGlmIChERVNUUmVnID09IDE1KQotCQl7CQkvKiBURVFQIGltbWVkICovCi0jaWZkZWYgTU9ERTMyCi0JCSAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSIChzdGF0ZS0+QmFuayk7Ci0JCSAgQVJNdWxfQ1BTUkFsdGVyZWQgKHN0YXRlKTsKLSNlbHNlCi0JCSAgdGVtcCA9IExIUyBeIERQSW1tUkhTOwotCQkgIFNFVFIxNVBTUiAodGVtcCk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIERQU0ltbVJIUzsJLyogVEVRIGltbWVkICovCi0JCSAgZGVzdCA9IExIUyBeIHJoczsKLQkJICBBUk11bF9OZWdaZXJvIChzdGF0ZSwgZGVzdCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MzQ6CQkvKiBDTVAgaW1tZWQgKi8KLQkgICAgICBVTkRFRl9UZXN0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgzNToJCS8qIENNUFAgaW1tZWQgKi8KLQkgICAgICBpZiAoREVTVFJlZyA9PSAxNSkKLQkJewkJLyogQ01QUCBpbW1lZCAqLwotI2lmZGVmIE1PREUzMgotCQkgIHN0YXRlLT5DcHNyID0gR0VUU1BTUiAoc3RhdGUtPkJhbmspOwotCQkgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0jZWxzZQotCQkgIHRlbXAgPSBMSFMgLSBEUEltbVJIUzsKLQkJICBTRVRSMTVQU1IgKHRlbXApOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsaHMgPSBMSFM7CS8qIENNUCBpbW1lZCAqLwotCQkgIHJocyA9IERQSW1tUkhTOwotCQkgIGRlc3QgPSBsaHMgLSByaHM7Ci0JCSAgQVJNdWxfTmVnWmVybyAoc3RhdGUsIGRlc3QpOwotCQkgIGlmICgobGhzID49IHJocykgfHwgKChyaHMgfCBsaHMpID4+IDMxKSkKLQkJICAgIHsKLQkJICAgICAgQVJNdWxfU3ViQ2FycnkgKHN0YXRlLCBsaHMsIHJocywgZGVzdCk7Ci0JCSAgICAgIEFSTXVsX1N1Yk92ZXJmbG93IChzdGF0ZSwgbGhzLCByaHMsIGRlc3QpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQ0xFQVJDOwotCQkgICAgICBDTEVBUlY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4MzY6CQkvKiBDTU4gaW1tZWQgYW5kIE1TUiBpbW1lZCB0byBTUFNSICovCi0JICAgICAgaWYgKERFU1RSZWcgPT0gMTUgJiYgQklUUyAoMTcsIDE4KSA9PSAwKQkvKiBNU1IgKi8KLQkJQVJNdWxfRml4U1BTUiAoc3RhdGUsIGluc3RyLCBEUEltbVJIUyk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgVU5ERUZfVGVzdDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgzNzoJCS8qIENNTlAgaW1tZWQgKi8KLQkgICAgICBpZiAoREVTVFJlZyA9PSAxNSkKLQkJewkJLyogQ01OUCBpbW1lZCAqLwotI2lmZGVmIE1PREUzMgotCQkgIHN0YXRlLT5DcHNyID0gR0VUU1BTUiAoc3RhdGUtPkJhbmspOwotCQkgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0jZWxzZQotCQkgIHRlbXAgPSBMSFMgKyBEUEltbVJIUzsKLQkJICBTRVRSMTVQU1IgKHRlbXApOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsaHMgPSBMSFM7CS8qIENNTiBpbW1lZCAqLwotCQkgIHJocyA9IERQSW1tUkhTOwotCQkgIGRlc3QgPSBsaHMgKyByaHM7Ci0JCSAgQVNTSUdOWiAoZGVzdCA9PSAwKTsKLQkJICBpZiAoKGxocyB8IHJocykgPj4gMzApCi0JCSAgICB7CQkvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KLQkJICAgICAgQVNTSUdOTiAoTkVHIChkZXN0KSk7Ci0JCSAgICAgIEFSTXVsX0FkZENhcnJ5IChzdGF0ZSwgbGhzLCByaHMsIGRlc3QpOwotCQkgICAgICBBUk11bF9BZGRPdmVyZmxvdyAoc3RhdGUsIGxocywgcmhzLCBkZXN0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIENMRUFSTjsKLQkJICAgICAgQ0xFQVJDOwotCQkgICAgICBDTEVBUlY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Mzg6CQkvKiBPUlIgaW1tZWQgKi8KLQkgICAgICBkZXN0ID0gTEhTIHwgRFBJbW1SSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Mzk6CQkvKiBPUlJTIGltbWVkICovCi0JICAgICAgRFBTSW1tUkhTOwotCSAgICAgIGRlc3QgPSBMSFMgfCByaHM7Ci0JICAgICAgV1JJVEVTREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDNhOgkJLyogTU9WIGltbWVkICovCi0JICAgICAgZGVzdCA9IERQSW1tUkhTOwotCSAgICAgIFdSSVRFREVTVCAoZGVzdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDNiOgkJLyogTU9WUyBpbW1lZCAqLwotCSAgICAgIERQU0ltbVJIUzsKLQkgICAgICBXUklURVNERVNUIChyaHMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgzYzoJCS8qIEJJQyBpbW1lZCAqLwotCSAgICAgIGRlc3QgPSBMSFMgJiB+RFBJbW1SSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4M2Q6CQkvKiBCSUNTIGltbWVkICovCi0JICAgICAgRFBTSW1tUkhTOwotCSAgICAgIGRlc3QgPSBMSFMgJiB+cmhzOwotCSAgICAgIFdSSVRFU0RFU1QgKGRlc3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHgzZToJCS8qIE1WTiBpbW1lZCAqLwotCSAgICAgIGRlc3QgPSB+RFBJbW1SSFM7Ci0JICAgICAgV1JJVEVERVNUIChkZXN0KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4M2Y6CQkvKiBNVk5TIGltbWVkICovCi0JICAgICAgRFBTSW1tUkhTOwotCSAgICAgIFdSSVRFU0RFU1QgKH5yaHMpOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgU2luZ2xlIERhdGEgVHJhbnNmZXIgSW1tZWRpYXRlIFJIUyBJbnN0cnVjdGlvbnMgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweDQwOgkJLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgaWYgKFN0b3JlV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NDE6CQkvKiBMb2FkIFdvcmQsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMsIEltbWVkICovCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChMb2FkV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NDI6CQkvKiBTdG9yZSBXb3JkLCBXcml0ZUJhY2ssIFBvc3QgRGVjLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgdGVtcCA9IGxocyAtIExTSW1tUkhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1c7Ci0JICAgICAgaWYgKFN0b3JlV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSB0ZW1wOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKSA/IEhJR0ggOiBMT1c7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDQzOgkJLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFBvc3QgRGVjLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVzsKLQkgICAgICBpZiAoTG9hZFdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNJbW1SSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NDQ6CQkvKiBTdG9yZSBCeXRlLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjLCBJbW1lZCAqLwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBpZiAoU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyAtIExTSW1tUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg0NToJCS8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgaWYgKExvYWRCeXRlIChzdGF0ZSwgaW5zdHIsIGxocywgTFVOU0lHTkVEKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNJbW1SSFM7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDQ2OgkJLyogU3RvcmUgQnl0ZSwgV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1c7Ci0JICAgICAgaWYgKFN0b3JlQnl0ZSAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg0NzoJCS8qIExvYWQgQnl0ZSwgV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1c7Ci0JICAgICAgaWYgKExvYWRCeXRlIChzdGF0ZSwgaW5zdHIsIGxocywgTFVOU0lHTkVEKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNJbW1SSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NDg6CQkvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBpZiAoU3RvcmVXb3JkIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyArIExTSW1tUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg0OToJCS8qIExvYWQgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYywgSW1tZWQgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgaWYgKExvYWRXb3JkIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyArIExTSW1tUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg0YToJCS8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIEltbWVkICovCi0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzICsgTFNJbW1SSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NGI6CQkvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIEltbWVkICovCi0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChMb2FkV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg0YzoJCS8qIFN0b3JlIEJ5dGUsIE5vIFdyaXRlQmFjaywgUG9zdCBJbmMsIEltbWVkICovCi0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzICsgTFNJbW1SSFM7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDRkOgkJLyogTG9hZCBCeXRlLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBpZiAoTG9hZEJ5dGUgKHN0YXRlLCBpbnN0ciwgbGhzLCBMVU5TSUdORUQpKQotCQlMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NGU6CQkvKiBTdG9yZSBCeXRlLCBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVzsKLQkgICAgICBpZiAoU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyArIExTSW1tUkhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKSA/IEhJR0ggOiBMT1c7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDRmOgkJLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVzsKLQkgICAgICBpZiAoTG9hZEJ5dGUgKHN0YXRlLCBpbnN0ciwgbGhzLCBMVU5TSUdORUQpKQotCQlMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotCSAgICAgIGJyZWFrOwotCi0KLQkgICAgY2FzZSAweDUwOgkJLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBJbW1lZCAqLwotCSAgICAgICh2b2lkKSBTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgTEhTIC0gTFNJbW1SSFMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg1MToJCS8qIExvYWQgV29yZCwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBJbW1lZCAqLwotCSAgICAgICh2b2lkKSBMb2FkV29yZCAoc3RhdGUsIGluc3RyLCBMSFMgLSBMU0ltbVJIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDUyOgkJLyogU3RvcmUgV29yZCwgV3JpdGVCYWNrLCBQcmUgRGVjLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICB0ZW1wID0gTEhTIC0gTFNJbW1SSFM7Ci0JICAgICAgaWYgKFN0b3JlV29yZCAoc3RhdGUsIGluc3RyLCB0ZW1wKSkKLQkJTFNCYXNlID0gdGVtcDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NTM6CQkvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgdGVtcCA9IExIUyAtIExTSW1tUkhTOwotCSAgICAgIGlmIChMb2FkV29yZCAoc3RhdGUsIGluc3RyLCB0ZW1wKSkKLQkJTFNCYXNlID0gdGVtcDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NTQ6CQkvKiBTdG9yZSBCeXRlLCBObyBXcml0ZUJhY2ssIFByZSBEZWMsIEltbWVkICovCi0JICAgICAgKHZvaWQpIFN0b3JlQnl0ZSAoc3RhdGUsIGluc3RyLCBMSFMgLSBMU0ltbVJIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDU1OgkJLyogTG9hZCBCeXRlLCBObyBXcml0ZUJhY2ssIFByZSBEZWMsIEltbWVkICovCi0JICAgICAgKHZvaWQpIExvYWRCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyAtIExTSW1tUkhTLCBMVU5TSUdORUQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg1NjoJCS8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgdGVtcCA9IExIUyAtIExTSW1tUkhTOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDU3OgkJLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBEZWMsIEltbWVkICovCi0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIHRlbXAgPSBMSFMgLSBMU0ltbVJIUzsKLQkgICAgICBpZiAoTG9hZEJ5dGUgKHN0YXRlLCBpbnN0ciwgdGVtcCwgTFVOU0lHTkVEKSkKLQkJTFNCYXNlID0gdGVtcDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NTg6CQkvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBJbmMsIEltbWVkICovCi0JICAgICAgKHZvaWQpIFN0b3JlV29yZCAoc3RhdGUsIGluc3RyLCBMSFMgKyBMU0ltbVJIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDU5OgkJLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBJbmMsIEltbWVkICovCi0JICAgICAgKHZvaWQpIExvYWRXb3JkIChzdGF0ZSwgaW5zdHIsIExIUyArIExTSW1tUkhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NWE6CQkvKiBTdG9yZSBXb3JkLCBXcml0ZUJhY2ssIFByZSBJbmMsIEltbWVkICovCi0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIHRlbXAgPSBMSFMgKyBMU0ltbVJIUzsKLQkgICAgICBpZiAoU3RvcmVXb3JkIChzdGF0ZSwgaW5zdHIsIHRlbXApKQotCQlMU0Jhc2UgPSB0ZW1wOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg1YjoJCS8qIExvYWQgV29yZCwgV3JpdGVCYWNrLCBQcmUgSW5jLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICB0ZW1wID0gTEhTICsgTFNJbW1SSFM7Ci0JICAgICAgaWYgKExvYWRXb3JkIChzdGF0ZSwgaW5zdHIsIHRlbXApKQotCQlMU0Jhc2UgPSB0ZW1wOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg1YzoJCS8qIFN0b3JlIEJ5dGUsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KLQkgICAgICAodm9pZCkgU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyArIExTSW1tUkhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NWQ6CQkvKiBMb2FkIEJ5dGUsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KLQkgICAgICAodm9pZCkgTG9hZEJ5dGUgKHN0YXRlLCBpbnN0ciwgTEhTICsgTFNJbW1SSFMsIExVTlNJR05FRCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDVlOgkJLyogU3RvcmUgQnl0ZSwgV3JpdGVCYWNrLCBQcmUgSW5jLCBJbW1lZCAqLwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICB0ZW1wID0gTEhTICsgTFNJbW1SSFM7Ci0JICAgICAgaWYgKFN0b3JlQnl0ZSAoc3RhdGUsIGluc3RyLCB0ZW1wKSkKLQkJTFNCYXNlID0gdGVtcDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NWY6CQkvKiBMb2FkIEJ5dGUsIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgdGVtcCA9IExIUyArIExTSW1tUkhTOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCB0ZW1wLCBMVU5TSUdORUQpKQotCQlMU0Jhc2UgPSB0ZW1wOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgU2luZ2xlIERhdGEgVHJhbnNmZXIgUmVnaXN0ZXIgUkhTIEluc3RydWN0aW9ucyAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweDYwOgkJLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNSZWdSSFM7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDYxOgkJLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYjsKLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgVU5ERUZfTFNSUENPZmZXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgaWYgKExvYWRXb3JkIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyAtIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2MjoJCS8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNSZWdSSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NjM6CQkvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChMb2FkV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgLSBMU1JlZ1JIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2NDoJCS8qIFN0b3JlIEJ5dGUsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBpZiAoU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyAtIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2NToJCS8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCBsaHMsIExVTlNJR05FRCkpCi0JCUxTQmFzZSA9IGxocyAtIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2NjoJCS8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzIC0gTFNSZWdSSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Njc6CQkvKiBMb2FkIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCBsaHMsIExVTlNJR05FRCkpCi0JCUxTQmFzZSA9IGxocyAtIExTUmVnUkhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKSA/IEhJR0ggOiBMT1c7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDY4OgkJLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzICsgTFNSZWdSSFM7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDY5OgkJLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYjsKLQkgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2I7Ci0JICAgICAgVU5ERUZfTFNSUENCYXNlV2I7Ci0JICAgICAgVU5ERUZfTFNSUENPZmZXYjsKLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgaWYgKExvYWRXb3JkIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyArIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2YToJCS8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzICsgTFNSZWdSSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NmI6CQkvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChMb2FkV29yZCAoc3RhdGUsIGluc3RyLCBsaHMpKQotCQlMU0Jhc2UgPSBsaHMgKyBMU1JlZ1JIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2YzoJCS8qIFN0b3JlIEJ5dGUsIE5vIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBpZiAoU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIGxocykpCi0JCUxTQmFzZSA9IGxocyArIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2ZDoJCS8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgbGhzID0gTEhTOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCBsaHMsIExVTlNJR05FRCkpCi0JCUxTQmFzZSA9IGxocyArIExTUmVnUkhTOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg2ZToJCS8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgbGhzKSkKLQkJTFNCYXNlID0gbGhzICsgTFNSZWdSSFM7Ci0JICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpID8gSElHSCA6IExPVzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NmY6CQkvKiBMb2FkIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIGxocyA9IExIUzsKLQkgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCBsaHMsIExVTlNJR05FRCkpCi0JCUxTQmFzZSA9IGxocyArIExTUmVnUkhTOwotCSAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKSA/IEhJR0ggOiBMT1c7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIDB4NzA6CQkvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICh2b2lkKSBTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgTEhTIC0gTFNSZWdSSFMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3MToJCS8qIExvYWQgV29yZCwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAodm9pZCkgTG9hZFdvcmQgKHN0YXRlLCBpbnN0ciwgTEhTIC0gTFNSZWdSSFMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3MjoJCS8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUHJlIERlYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgdGVtcCA9IExIUyAtIExTUmVnUkhTOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDczOgkJLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIHRlbXAgPSBMSFMgLSBMU1JlZ1JIUzsKLQkgICAgICBpZiAoTG9hZFdvcmQgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDc0OgkJLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAodm9pZCkgU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyAtIExTUmVnUkhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4NzU6CQkvKiBMb2FkIEJ5dGUsIE5vIFdyaXRlQmFjaywgUHJlIERlYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKHZvaWQpIExvYWRCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyAtIExTUmVnUkhTLCBMVU5TSUdORUQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3NjoJCS8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIERlYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgdGVtcCA9IExIUyAtIExTUmVnUkhTOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDc3OgkJLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIHRlbXAgPSBMSFMgLSBMU1JlZ1JIUzsKLQkgICAgICBpZiAoTG9hZEJ5dGUgKHN0YXRlLCBpbnN0ciwgdGVtcCwgTFVOU0lHTkVEKSkKLQkJTFNCYXNlID0gdGVtcDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Nzg6CQkvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICh2b2lkKSBTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgTEhTICsgTFNSZWdSSFMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3OToJCS8qIExvYWQgV29yZCwgTm8gV3JpdGVCYWNrLCBQcmUgSW5jLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAodm9pZCkgTG9hZFdvcmQgKHN0YXRlLCBpbnN0ciwgTEhTICsgTFNSZWdSSFMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3YToJCS8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgdGVtcCA9IExIUyArIExTUmVnUkhTOwotCSAgICAgIGlmIChTdG9yZVdvcmQgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDdiOgkJLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgQVJNdWxfVW5kZWZJbnN0ciAoc3RhdGUsIGluc3RyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiOwotCSAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYjsKLQkgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYjsKLQkgICAgICBVTkRFRl9MU1JQQ09mZldiOwotCSAgICAgIHRlbXAgPSBMSFMgKyBMU1JlZ1JIUzsKLQkgICAgICBpZiAoTG9hZFdvcmQgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDdjOgkJLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgSW5jLCBSZWcgKi8KLQkgICAgICBpZiAoQklUICg0KSkKLQkJewotCQkgIEFSTXVsX1VuZGVmSW5zdHIgKHN0YXRlLCBpbnN0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAodm9pZCkgU3RvcmVCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyArIExTUmVnUkhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4N2Q6CQkvKiBMb2FkIEJ5dGUsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKHZvaWQpIExvYWRCeXRlIChzdGF0ZSwgaW5zdHIsIExIUyArIExTUmVnUkhTLCBMVU5TSUdORUQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg3ZToJCS8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCi0JICAgICAgaWYgKEJJVCAoNCkpCi0JCXsKLQkJICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgdGVtcCA9IExIUyArIExTUmVnUkhTOwotCSAgICAgIGlmIChTdG9yZUJ5dGUgKHN0YXRlLCBpbnN0ciwgdGVtcCkpCi0JCUxTQmFzZSA9IHRlbXA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDdmOgkJLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLwotCSAgICAgIGlmIChCSVQgKDQpKQotCQl7Ci0JCSAgLyogQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIGJyZWFrcG9pbnQgb3Bjb2RlLgotCQkgICAgIFRoaXMgdmFsdWUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlIGRlZmluZWQKLQkJICAgICBhcyBBUk1fQkVfQlJFQUtQT0lOVCBpbiBnZGIvYXJtLXRkZXAuYy4gICovCi0JCSAgaWYgKEJJVFMgKDAsIDE5KSA9PSAweGZkZWZlKQotCQkgICAgewotCQkgICAgICBpZiAoIUFSTXVsX09TSGFuZGxlU1dJIChzdGF0ZSwgU1dJX0JyZWFrcG9pbnQpKQotCQkJQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9TV0lWKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBBUk11bF9VbmRlZkluc3RyIChzdGF0ZSwgaW5zdHIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2I7Ci0JICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiOwotCSAgICAgIFVOREVGX0xTUlBDQmFzZVdiOwotCSAgICAgIFVOREVGX0xTUlBDT2ZmV2I7Ci0JICAgICAgdGVtcCA9IExIUyArIExTUmVnUkhTOwotCSAgICAgIGlmIChMb2FkQnl0ZSAoc3RhdGUsIGluc3RyLCB0ZW1wLCBMVU5TSUdORUQpKQotCQlMU0Jhc2UgPSB0ZW1wOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBEYXRhIFRyYW5zZmVyIEluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweDgwOgkJLyogU3RvcmUsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KLQkgICAgICBTVE9SRU1VTFQgKGluc3RyLCBMU0Jhc2UgLSBMU01OdW1SZWdzICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ODE6CQkvKiBMb2FkLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjICovCi0JICAgICAgTE9BRE1VTFQgKGluc3RyLCBMU0Jhc2UgLSBMU01OdW1SZWdzICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ODI6CQkvKiBTdG9yZSwgV3JpdGVCYWNrLCBQb3N0IERlYyAqLwotCSAgICAgIHRlbXAgPSBMU0Jhc2UgLSBMU01OdW1SZWdzOwotCSAgICAgIFNUT1JFTVVMVCAoaW5zdHIsIHRlbXAgKyA0TCwgdGVtcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDgzOgkJLyogTG9hZCwgV3JpdGVCYWNrLCBQb3N0IERlYyAqLwotCSAgICAgIHRlbXAgPSBMU0Jhc2UgLSBMU01OdW1SZWdzOwotCSAgICAgIExPQURNVUxUIChpbnN0ciwgdGVtcCArIDRMLCB0ZW1wKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ODQ6CQkvKiBTdG9yZSwgRmxhZ3MsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KLQkgICAgICBTVE9SRVNNVUxUIChpbnN0ciwgTFNCYXNlIC0gTFNNTnVtUmVncyArIDRMLCAwTCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDg1OgkJLyogTG9hZCwgRmxhZ3MsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KLQkgICAgICBMT0FEU01VTFQgKGluc3RyLCBMU0Jhc2UgLSBMU01OdW1SZWdzICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ODY6CQkvKiBTdG9yZSwgRmxhZ3MsIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVnczsKLQkgICAgICBTVE9SRVNNVUxUIChpbnN0ciwgdGVtcCArIDRMLCB0ZW1wKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ODc6CQkvKiBMb2FkLCBGbGFncywgV3JpdGVCYWNrLCBQb3N0IERlYyAqLwotCSAgICAgIHRlbXAgPSBMU0Jhc2UgLSBMU01OdW1SZWdzOwotCSAgICAgIExPQURTTVVMVCAoaW5zdHIsIHRlbXAgKyA0TCwgdGVtcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIDB4ODg6CQkvKiBTdG9yZSwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYyAqLwotCSAgICAgIFNUT1JFTVVMVCAoaW5zdHIsIExTQmFzZSwgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg4OToJCS8qIExvYWQsIE5vIFdyaXRlQmFjaywgUG9zdCBJbmMgKi8KLQkgICAgICBMT0FETVVMVCAoaW5zdHIsIExTQmFzZSwgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg4YToJCS8qIFN0b3JlLCBXcml0ZUJhY2ssIFBvc3QgSW5jICovCi0JICAgICAgdGVtcCA9IExTQmFzZTsKLQkgICAgICBTVE9SRU1VTFQgKGluc3RyLCB0ZW1wLCB0ZW1wICsgTFNNTnVtUmVncyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDhiOgkJLyogTG9hZCwgV3JpdGVCYWNrLCBQb3N0IEluYyAqLwotCSAgICAgIHRlbXAgPSBMU0Jhc2U7Ci0JICAgICAgTE9BRE1VTFQgKGluc3RyLCB0ZW1wLCB0ZW1wICsgTFNNTnVtUmVncyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDhjOgkJLyogU3RvcmUsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jICovCi0JICAgICAgU1RPUkVTTVVMVCAoaW5zdHIsIExTQmFzZSwgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg4ZDoJCS8qIExvYWQsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jICovCi0JICAgICAgTE9BRFNNVUxUIChpbnN0ciwgTFNCYXNlLCAwTCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDhlOgkJLyogU3RvcmUsIEZsYWdzLCBXcml0ZUJhY2ssIFBvc3QgSW5jICovCi0JICAgICAgdGVtcCA9IExTQmFzZTsKLQkgICAgICBTVE9SRVNNVUxUIChpbnN0ciwgdGVtcCwgdGVtcCArIExTTU51bVJlZ3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg4ZjoJCS8qIExvYWQsIEZsYWdzLCBXcml0ZUJhY2ssIFBvc3QgSW5jICovCi0JICAgICAgdGVtcCA9IExTQmFzZTsKLQkgICAgICBMT0FEU01VTFQgKGluc3RyLCB0ZW1wLCB0ZW1wICsgTFNNTnVtUmVncyk7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIDB4OTA6CQkvKiBTdG9yZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjICovCi0JICAgICAgU1RPUkVNVUxUIChpbnN0ciwgTFNCYXNlIC0gTFNNTnVtUmVncywgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5MToJCS8qIExvYWQsIE5vIFdyaXRlQmFjaywgUHJlIERlYyAqLwotCSAgICAgIExPQURNVUxUIChpbnN0ciwgTFNCYXNlIC0gTFNNTnVtUmVncywgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5MjoJCS8qIFN0b3JlLCBXcml0ZUJhY2ssIFByZSBEZWMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVnczsKLQkgICAgICBTVE9SRU1VTFQgKGluc3RyLCB0ZW1wLCB0ZW1wKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OTM6CQkvKiBMb2FkLCBXcml0ZUJhY2ssIFByZSBEZWMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVnczsKLQkgICAgICBMT0FETVVMVCAoaW5zdHIsIHRlbXAsIHRlbXApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5NDoJCS8qIFN0b3JlLCBGbGFncywgTm8gV3JpdGVCYWNrLCBQcmUgRGVjICovCi0JICAgICAgU1RPUkVTTVVMVCAoaW5zdHIsIExTQmFzZSAtIExTTU51bVJlZ3MsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OTU6CQkvKiBMb2FkLCBGbGFncywgTm8gV3JpdGVCYWNrLCBQcmUgRGVjICovCi0JICAgICAgTE9BRFNNVUxUIChpbnN0ciwgTFNCYXNlIC0gTFNNTnVtUmVncywgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5NjoJCS8qIFN0b3JlLCBGbGFncywgV3JpdGVCYWNrLCBQcmUgRGVjICovCi0JICAgICAgdGVtcCA9IExTQmFzZSAtIExTTU51bVJlZ3M7Ci0JICAgICAgU1RPUkVTTVVMVCAoaW5zdHIsIHRlbXAsIHRlbXApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5NzoJCS8qIExvYWQsIEZsYWdzLCBXcml0ZUJhY2ssIFByZSBEZWMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVnczsKLQkgICAgICBMT0FEU01VTFQgKGluc3RyLCB0ZW1wLCB0ZW1wKTsKLQkgICAgICBicmVhazsKLQotCi0JICAgIGNhc2UgMHg5ODoJCS8qIFN0b3JlLCBObyBXcml0ZUJhY2ssIFByZSBJbmMgKi8KLQkgICAgICBTVE9SRU1VTFQgKGluc3RyLCBMU0Jhc2UgKyA0TCwgMEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5OToJCS8qIExvYWQsIE5vIFdyaXRlQmFjaywgUHJlIEluYyAqLwotCSAgICAgIExPQURNVUxUIChpbnN0ciwgTFNCYXNlICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OWE6CQkvKiBTdG9yZSwgV3JpdGVCYWNrLCBQcmUgSW5jICovCi0JICAgICAgdGVtcCA9IExTQmFzZTsKLQkgICAgICBTVE9SRU1VTFQgKGluc3RyLCB0ZW1wICsgNEwsIHRlbXAgKyBMU01OdW1SZWdzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OWI6CQkvKiBMb2FkLCBXcml0ZUJhY2ssIFByZSBJbmMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlOwotCSAgICAgIExPQURNVUxUIChpbnN0ciwgdGVtcCArIDRMLCB0ZW1wICsgTFNNTnVtUmVncyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDljOgkJLyogU3RvcmUsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFByZSBJbmMgKi8KLQkgICAgICBTVE9SRVNNVUxUIChpbnN0ciwgTFNCYXNlICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OWQ6CQkvKiBMb2FkLCBGbGFncywgTm8gV3JpdGVCYWNrLCBQcmUgSW5jICovCi0JICAgICAgTE9BRFNNVUxUIChpbnN0ciwgTFNCYXNlICsgNEwsIDBMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4OWU6CQkvKiBTdG9yZSwgRmxhZ3MsIFdyaXRlQmFjaywgUHJlIEluYyAqLwotCSAgICAgIHRlbXAgPSBMU0Jhc2U7Ci0JICAgICAgU1RPUkVTTVVMVCAoaW5zdHIsIHRlbXAgKyA0TCwgdGVtcCArIExTTU51bVJlZ3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHg5ZjoJCS8qIExvYWQsIEZsYWdzLCBXcml0ZUJhY2ssIFByZSBJbmMgKi8KLQkgICAgICB0ZW1wID0gTFNCYXNlOwotCSAgICAgIExPQURTTVVMVCAoaW5zdHIsIHRlbXAgKyA0TCwgdGVtcCArIExTTU51bVJlZ3MpOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2ggZm9yd2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGEwOgotCSAgICBjYXNlIDB4YTE6Ci0JICAgIGNhc2UgMHhhMjoKLQkgICAgY2FzZSAweGEzOgotCSAgICBjYXNlIDB4YTQ6Ci0JICAgIGNhc2UgMHhhNToKLQkgICAgY2FzZSAweGE2OgotCSAgICBjYXNlIDB4YTc6Ci0JICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIDggKyBQT1NCUkFOQ0g7Ci0JICAgICAgRkxVU0hQSVBFOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaCBiYWNrd2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGE4OgotCSAgICBjYXNlIDB4YTk6Ci0JICAgIGNhc2UgMHhhYToKLQkgICAgY2FzZSAweGFiOgotCSAgICBjYXNlIDB4YWM6Ci0JICAgIGNhc2UgMHhhZDoKLQkgICAgY2FzZSAweGFlOgotCSAgICBjYXNlIDB4YWY6Ci0JICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIDggKyBORUdCUkFOQ0g7Ci0JICAgICAgRkxVU0hQSVBFOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoIGFuZCBMaW5rIGZvcndhcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGIwOgotCSAgICBjYXNlIDB4YjE6Ci0JICAgIGNhc2UgMHhiMjoKLQkgICAgY2FzZSAweGIzOgotCSAgICBjYXNlIDB4YjQ6Ci0JICAgIGNhc2UgMHhiNToKLQkgICAgY2FzZSAweGI2OgotCSAgICBjYXNlIDB4Yjc6Ci0jaWZkZWYgTU9ERTMyCi0JICAgICAgc3RhdGUtPlJlZ1sxNF0gPSBwYyArIDQ7CS8qIHB1dCBQQyBpbnRvIExpbmsgKi8KLSNlbHNlCi0JICAgICAgc3RhdGUtPlJlZ1sxNF0gPSAocGMgKyA0KSB8IEVDQyB8IEVSMTVJTlQgfCBFTU9ERTsJLyogcHV0IFBDIGludG8gTGluayAqLwotI2VuZGlmCi0JICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIDggKyBQT1NCUkFOQ0g7Ci0JICAgICAgRkxVU0hQSVBFOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoIGFuZCBMaW5rIGJhY2t3YXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGI4OgotCSAgICBjYXNlIDB4Yjk6Ci0JICAgIGNhc2UgMHhiYToKLQkgICAgY2FzZSAweGJiOgotCSAgICBjYXNlIDB4YmM6Ci0JICAgIGNhc2UgMHhiZDoKLQkgICAgY2FzZSAweGJlOgotCSAgICBjYXNlIDB4YmY6Ci0jaWZkZWYgTU9ERTMyCi0JICAgICAgc3RhdGUtPlJlZ1sxNF0gPSBwYyArIDQ7CS8qIHB1dCBQQyBpbnRvIExpbmsgKi8KLSNlbHNlCi0JICAgICAgc3RhdGUtPlJlZ1sxNF0gPSAocGMgKyA0KSB8IEVDQyB8IEVSMTVJTlQgfCBFTU9ERTsJLyogcHV0IFBDIGludG8gTGluayAqLwotI2VuZGlmCi0JICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIDggKyBORUdCUkFOQ0g7Ci0JICAgICAgRkxVU0hQSVBFOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgIENvLVByb2Nlc3NvciBEYXRhIFRyYW5zZmVycyAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGM0OgotCSAgICBjYXNlIDB4YzA6CQkvKiBTdG9yZSAsIE5vIFdyaXRlQmFjayAsIFBvc3QgRGVjICovCi0JICAgICAgQVJNdWxfU1RDIChzdGF0ZSwgaW5zdHIsIExIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGM1OgotCSAgICBjYXNlIDB4YzE6CQkvKiBMb2FkICwgTm8gV3JpdGVCYWNrICwgUG9zdCBEZWMgKi8KLQkgICAgICBBUk11bF9MREMgKHN0YXRlLCBpbnN0ciwgTEhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4YzI6Ci0JICAgIGNhc2UgMHhjNjoJCS8qIFN0b3JlICwgV3JpdGVCYWNrICwgUG9zdCBEZWMgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPkJhc2UgPSBsaHMgLSBMU0NPZmY7Ci0JICAgICAgQVJNdWxfU1RDIChzdGF0ZSwgaW5zdHIsIGxocyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGMzOgotCSAgICBjYXNlIDB4Yzc6CQkvKiBMb2FkICwgV3JpdGVCYWNrICwgUG9zdCBEZWMgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPkJhc2UgPSBsaHMgLSBMU0NPZmY7Ci0JICAgICAgQVJNdWxfTERDIChzdGF0ZSwgaW5zdHIsIGxocyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGM4OgotCSAgICBjYXNlIDB4Y2M6CQkvKiBTdG9yZSAsIE5vIFdyaXRlQmFjayAsIFBvc3QgSW5jICovCi0JICAgICAgQVJNdWxfU1RDIChzdGF0ZSwgaW5zdHIsIExIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGM5OgotCSAgICBjYXNlIDB4Y2Q6CQkvKiBMb2FkICwgTm8gV3JpdGVCYWNrICwgUG9zdCBJbmMgKi8KLQkgICAgICBBUk11bF9MREMgKHN0YXRlLCBpbnN0ciwgTEhTKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4Y2E6Ci0JICAgIGNhc2UgMHhjZToJCS8qIFN0b3JlICwgV3JpdGVCYWNrICwgUG9zdCBJbmMgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPkJhc2UgPSBsaHMgKyBMU0NPZmY7Ci0JICAgICAgQVJNdWxfU1RDIChzdGF0ZSwgaW5zdHIsIExIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGNiOgotCSAgICBjYXNlIDB4Y2Y6CQkvKiBMb2FkICwgV3JpdGVCYWNrICwgUG9zdCBJbmMgKi8KLQkgICAgICBsaHMgPSBMSFM7Ci0JICAgICAgc3RhdGUtPkJhc2UgPSBsaHMgKyBMU0NPZmY7Ci0JICAgICAgQVJNdWxfTERDIChzdGF0ZSwgaW5zdHIsIExIUyk7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIDB4ZDA6Ci0JICAgIGNhc2UgMHhkNDoJCS8qIFN0b3JlICwgTm8gV3JpdGVCYWNrICwgUHJlIERlYyAqLwotCSAgICAgIEFSTXVsX1NUQyAoc3RhdGUsIGluc3RyLCBMSFMgLSBMU0NPZmYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHhkMToKLQkgICAgY2FzZSAweGQ1OgkJLyogTG9hZCAsIE5vIFdyaXRlQmFjayAsIFByZSBEZWMgKi8KLQkgICAgICBBUk11bF9MREMgKHN0YXRlLCBpbnN0ciwgTEhTIC0gTFNDT2ZmKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ZDI6Ci0JICAgIGNhc2UgMHhkNjoJCS8qIFN0b3JlICwgV3JpdGVCYWNrICwgUHJlIERlYyAqLwotCSAgICAgIGxocyA9IExIUyAtIExTQ09mZjsKLQkgICAgICBzdGF0ZS0+QmFzZSA9IGxoczsKLQkgICAgICBBUk11bF9TVEMgKHN0YXRlLCBpbnN0ciwgbGhzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDB4ZDM6Ci0JICAgIGNhc2UgMHhkNzoJCS8qIExvYWQgLCBXcml0ZUJhY2sgLCBQcmUgRGVjICovCi0JICAgICAgbGhzID0gTEhTIC0gTFNDT2ZmOwotCSAgICAgIHN0YXRlLT5CYXNlID0gbGhzOwotCSAgICAgIEFSTXVsX0xEQyAoc3RhdGUsIGluc3RyLCBsaHMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHhkODoKLQkgICAgY2FzZSAweGRjOgkJLyogU3RvcmUgLCBObyBXcml0ZUJhY2sgLCBQcmUgSW5jICovCi0JICAgICAgQVJNdWxfU1RDIChzdGF0ZSwgaW5zdHIsIExIUyArIExTQ09mZik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweGQ5OgotCSAgICBjYXNlIDB4ZGQ6CQkvKiBMb2FkICwgTm8gV3JpdGVCYWNrICwgUHJlIEluYyAqLwotCSAgICAgIEFSTXVsX0xEQyAoc3RhdGUsIGluc3RyLCBMSFMgKyBMU0NPZmYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHhkYToKLQkgICAgY2FzZSAweGRlOgkJLyogU3RvcmUgLCBXcml0ZUJhY2sgLCBQcmUgSW5jICovCi0JICAgICAgbGhzID0gTEhTICsgTFNDT2ZmOwotCSAgICAgIHN0YXRlLT5CYXNlID0gbGhzOwotCSAgICAgIEFSTXVsX1NUQyAoc3RhdGUsIGluc3RyLCBsaHMpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMHhkYjoKLQkgICAgY2FzZSAweGRmOgkJLyogTG9hZCAsIFdyaXRlQmFjayAsIFByZSBJbmMgKi8KLQkgICAgICBsaHMgPSBMSFMgKyBMU0NPZmY7Ci0JICAgICAgc3RhdGUtPkJhc2UgPSBsaHM7Ci0JICAgICAgQVJNdWxfTERDIChzdGF0ZSwgaW5zdHIsIGxocyk7Ci0JICAgICAgYnJlYWs7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgQ28tUHJvY2Vzc29yIFJlZ2lzdGVyIFRyYW5zZmVycyAoTUNSKSBhbmQgRGF0YSBPcHMgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCSAgICBjYXNlIDB4ZTI6Ci0JICAgIGNhc2UgMHhlMDoKLQkgICAgY2FzZSAweGU0OgotCSAgICBjYXNlIDB4ZTY6Ci0JICAgIGNhc2UgMHhlODoKLQkgICAgY2FzZSAweGVhOgotCSAgICBjYXNlIDB4ZWM6Ci0JICAgIGNhc2UgMHhlZToKLQkgICAgICBpZiAoQklUICg0KSkKLQkJewkJLyogTUNSICovCi0JCSAgaWYgKERFU1RSZWcgPT0gMTUpCi0JCSAgICB7Ci0JCSAgICAgIFVOREVGX01DUlBDOwotI2lmZGVmIE1PREUzMgotCQkgICAgICBBUk11bF9NQ1IgKHN0YXRlLCBpbnN0ciwgc3RhdGUtPlJlZ1sxNV0gKyBpc2l6ZSk7Ci0jZWxzZQotCQkgICAgICBBUk11bF9NQ1IgKHN0YXRlLCBpbnN0ciwgRUNDIHwgRVIxNUlOVCB8IEVNT0RFIHwKLQkJCQkgKChzdGF0ZS0+UmVnWzE1XSArIGlzaXplKSAmIFIxNVBDQklUUykpOwotI2VuZGlmCi0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgQVJNdWxfTUNSIChzdGF0ZSwgaW5zdHIsIERFU1QpOwotCQl9Ci0JICAgICAgZWxzZQkJLyogQ0RQIFBhcnQgMSAqLwotCQlBUk11bF9DRFAgKHN0YXRlLCBpbnN0cik7Ci0JICAgICAgYnJlYWs7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgQ28tUHJvY2Vzc29yIFJlZ2lzdGVyIFRyYW5zZmVycyAoTVJDKSBhbmQgRGF0YSBPcHMgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCSAgICBjYXNlIDB4ZTE6Ci0JICAgIGNhc2UgMHhlMzoKLQkgICAgY2FzZSAweGU1OgotCSAgICBjYXNlIDB4ZTc6Ci0JICAgIGNhc2UgMHhlOToKLQkgICAgY2FzZSAweGViOgotCSAgICBjYXNlIDB4ZWQ6Ci0JICAgIGNhc2UgMHhlZjoKLQkgICAgICBpZiAoQklUICg0KSkKLQkJewkJLyogTVJDICovCi0JCSAgdGVtcCA9IEFSTXVsX01SQyAoc3RhdGUsIGluc3RyKTsKLQkJICBpZiAoREVTVFJlZyA9PSAxNSkKLQkJICAgIHsKLQkJICAgICAgQVNTSUdOTiAoKHRlbXAgJiBOQklUKSAhPSAwKTsKLQkJICAgICAgQVNTSUdOWiAoKHRlbXAgJiBaQklUKSAhPSAwKTsKLQkJICAgICAgQVNTSUdOQyAoKHRlbXAgJiBDQklUKSAhPSAwKTsKLQkJICAgICAgQVNTSUdOViAoKHRlbXAgJiBWQklUKSAhPSAwKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBERVNUID0gdGVtcDsKLQkJfQotCSAgICAgIGVsc2UJCS8qIENEUCBQYXJ0IDIgKi8KLQkJQVJNdWxfQ0RQIChzdGF0ZSwgaW5zdHIpOwotCSAgICAgIGJyZWFrOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkgICAgY2FzZSAweGYwOgotCSAgICBjYXNlIDB4ZjE6Ci0JICAgIGNhc2UgMHhmMjoKLQkgICAgY2FzZSAweGYzOgotCSAgICBjYXNlIDB4ZjQ6Ci0JICAgIGNhc2UgMHhmNToKLQkgICAgY2FzZSAweGY2OgotCSAgICBjYXNlIDB4Zjc6Ci0JICAgIGNhc2UgMHhmODoKLQkgICAgY2FzZSAweGY5OgotCSAgICBjYXNlIDB4ZmE6Ci0JICAgIGNhc2UgMHhmYjoKLQkgICAgY2FzZSAweGZjOgotCSAgICBjYXNlIDB4ZmQ6Ci0JICAgIGNhc2UgMHhmZToKLQkgICAgY2FzZSAweGZmOgotCSAgICAgIGlmIChpbnN0ciA9PSBBUk11bF9BQk9SVFdPUkQgJiYgc3RhdGUtPkFib3J0QWRkciA9PSBwYykKLQkJewkJLyogYSBwcmVmZXRjaCBhYm9ydCAqLwotCQkgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfUHJlZmV0Y2hBYm9ydFYpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoIUFSTXVsX09TSGFuZGxlU1dJIChzdGF0ZSwgQklUUyAoMCwgMjMpKSkKLQkJewotCQkgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfU1dJVik7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIDI1NiB3YXkgbWFpbiBzd2l0Y2ggKi8KLQl9CQkJLyogaWYgdGVtcCAqLwotCi0jaWZkZWYgTU9ERVQKLSAgICBkb25leHQ6Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfVUlfTE9PUF9IT09LCi0gICAgICBpZiAodWlfbG9vcF9ob29rICE9IE5VTEwgJiYgdWlfbG9vcF9ob29rX2NvdW50ZXItLSA8IDApCi0JewotCSAgdWlfbG9vcF9ob29rX2NvdW50ZXIgPSBVSV9MT09QX1BPTExfSU5URVJWQUw7Ci0JICB1aV9sb29wX2hvb2sgKDApOwotCX0KLSNlbmRpZiAvKiBORUVEX1VJX0xPT1BfSE9PSyAqLwotCi0gICAgICBpZiAoc3RhdGUtPkVtdWxhdGUgPT0gT05DRSkKLQlzdGF0ZS0+RW11bGF0ZSA9IFNUT1A7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGNoYW5nZWQgbW9kZSwgYWxsb3cgdGhlIFBDIHRvIGFkdmFuY2UgYmVmb3JlIHN0b3BwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0YXRlLT5FbXVsYXRlID09IENIQU5HRU1PREUpCi0JY29udGludWU7Ci0gICAgICBlbHNlIGlmIChzdGF0ZS0+RW11bGF0ZSAhPSBSVU4pCi0JYnJlYWs7Ci0gICAgfQotICB3aGlsZSAoIXN0b3Bfc2ltdWxhdG9yKTsJLyogZG8gbG9vcCAqLwotCi0gIHN0YXRlLT5kZWNvZGVkID0gZGVjb2RlZDsKLSAgc3RhdGUtPmxvYWRlZCA9IGxvYWRlZDsKLSAgc3RhdGUtPnBjID0gcGM7Ci0KLSAgcmV0dXJuIHBjOwotfQkJCQkvKiBFbXVsYXRlIDI2LzMyIGluIGluc3RydWN0aW9uIGJhc2VkIG1vZGUgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIG1vc3QgRGF0YSBQcm9jZXNzaW5nIHJlZ2lzdGVyIFJIUydzIHdpdGggdGhlIFMgICAgICoKLSogYml0IGNsZWFyLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG1hY3JvIERQUmVnUkhTLCB3aGljaCAgICAqCi0qIGZpbHRlcnMgdGhlIGNvbW1vbiBjYXNlIG9mIGFuIHVuc2hpZnRlZCByZWdpc3RlciB3aXRoIGluIGxpbmUgY29kZSAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIEFSTXdvcmQKLUdldERQUmVnUkhTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyKQotewotICBBUk13b3JkIHNoYW10LCBiYXNlOwotCi0gIGJhc2UgPSBSSFNSZWc7Ci0gIGlmIChCSVQgKDQpKQotICAgIHsJCQkJLyogc2hpZnQgYW1vdW50IGluIGEgcmVnaXN0ZXIgKi8KLSAgICAgIFVOREVGX1NoaWZ0OwotICAgICAgSU5DUEM7Ci0jaWZuZGVmIE1PREUzMgotICAgICAgaWYgKGJhc2UgPT0gMTUpCi0JYmFzZSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFOwotICAgICAgZWxzZQotI2VuZGlmCi0JYmFzZSA9IHN0YXRlLT5SZWdbYmFzZV07Ci0gICAgICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMEwpOwotICAgICAgc2hhbXQgPSBzdGF0ZS0+UmVnW0JJVFMgKDgsIDExKV0gJiAweGZmOwotICAgICAgc3dpdGNoICgoaW50KSBCSVRTICg1LCA2KSkKLQl7Ci0JY2FzZSBMU0w6Ci0JICBpZiAoc2hhbXQgPT0gMCkKLQkgICAgcmV0dXJuIChiYXNlKTsKLQkgIGVsc2UgaWYgKHNoYW10ID49IDMyKQotCSAgICByZXR1cm4gKDApOwotCSAgZWxzZQotCSAgICByZXR1cm4gKGJhc2UgPDwgc2hhbXQpOwotCWNhc2UgTFNSOgotCSAgaWYgKHNoYW10ID09IDApCi0JICAgIHJldHVybiAoYmFzZSk7Ci0JICBlbHNlIGlmIChzaGFtdCA+PSAzMikKLQkgICAgcmV0dXJuICgwKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIChiYXNlID4+IHNoYW10KTsKLQljYXNlIEFTUjoKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICByZXR1cm4gKGJhc2UpOwotCSAgZWxzZSBpZiAoc2hhbXQgPj0gMzIpCi0JICAgIHJldHVybiAoKEFSTXdvcmQpICgobG9uZyBpbnQpIGJhc2UgPj4gMzFMKSk7Ci0JICBlbHNlCi0JICAgIHJldHVybiAoKEFSTXdvcmQpICgobG9uZyBpbnQpIGJhc2UgPj4gKGludCkgc2hhbXQpKTsKLQljYXNlIFJPUjoKLQkgIHNoYW10ICY9IDB4MWY7Ci0JICBpZiAoc2hhbXQgPT0gMCkKLQkgICAgcmV0dXJuIChiYXNlKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuICgoYmFzZSA8PCAoMzIgLSBzaGFtdCkpIHwgKGJhc2UgPj4gc2hhbXQpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBzaGlmdCBhbW91bnQgaXMgYSBjb25zdGFudCAqLwotI2lmbmRlZiBNT0RFMzIKLSAgICAgIGlmIChiYXNlID09IDE1KQotCWJhc2UgPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWJhc2UgPSBzdGF0ZS0+UmVnW2Jhc2VdOwotICAgICAgc2hhbXQgPSBCSVRTICg3LCAxMSk7Ci0gICAgICBzd2l0Y2ggKChpbnQpIEJJVFMgKDUsIDYpKQotCXsKLQljYXNlIExTTDoKLQkgIHJldHVybiAoYmFzZSA8PCBzaGFtdCk7Ci0JY2FzZSBMU1I6Ci0JICBpZiAoc2hhbXQgPT0gMCkKLQkgICAgcmV0dXJuICgwKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIChiYXNlID4+IHNoYW10KTsKLQljYXNlIEFTUjoKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICByZXR1cm4gKChBUk13b3JkKSAoKGxvbmcgaW50KSBiYXNlID4+IDMxTCkpOwotCSAgZWxzZQotCSAgICByZXR1cm4gKChBUk13b3JkKSAoKGxvbmcgaW50KSBiYXNlID4+IChpbnQpIHNoYW10KSk7Ci0JY2FzZSBST1I6Ci0JICBpZiAoc2hhbXQgPT0gMCkJLyogaXRzIGFuIFJSWCAqLwotCSAgICByZXR1cm4gKChiYXNlID4+IDEpIHwgKENGTEFHIDw8IDMxKSk7Ci0JICBlbHNlCi0JICAgIHJldHVybiAoKGJhc2UgPDwgKDMyIC0gc2hhbXQpKSB8IChiYXNlID4+IHNoYW10KSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsJCQkvKiBqdXN0IHRvIHNodXQgdXAgbGludCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIG1vc3QgTG9naWNhbCBEYXRhIFByb2Nlc3NpbmcgcmVnaXN0ZXIgUkhTJ3MgICAgICAgICoKLSogd2l0aCB0aGUgUyBiaXQgc2V0LiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG1hY3JvICAgICAgICAgICAqCi0qIERQU1JlZ1JIUywgd2hpY2ggZmlsdGVycyB0aGUgY29tbW9uIGNhc2Ugb2YgYW4gdW5zaGlmdGVkIHJlZ2lzdGVyICAgICAgICAgKgotKiB3aXRoIGluIGxpbmUgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBBUk13b3JkCi1HZXREUFNSZWdSSFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpCi17Ci0gIEFSTXdvcmQgc2hhbXQsIGJhc2U7Ci0KLSAgYmFzZSA9IFJIU1JlZzsKLSAgaWYgKEJJVCAoNCkpCi0gICAgewkJCQkvKiBzaGlmdCBhbW91bnQgaW4gYSByZWdpc3RlciAqLwotICAgICAgVU5ERUZfU2hpZnQ7Ci0gICAgICBJTkNQQzsKLSNpZm5kZWYgTU9ERTMyCi0gICAgICBpZiAoYmFzZSA9PSAxNSkKLQliYXNlID0gRUNDIHwgRVIxNUlOVCB8IFIxNVBDIHwgRU1PREU7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQliYXNlID0gc3RhdGUtPlJlZ1tiYXNlXTsKLSAgICAgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCAxLCAwTCk7Ci0gICAgICBzaGFtdCA9IHN0YXRlLT5SZWdbQklUUyAoOCwgMTEpXSAmIDB4ZmY7Ci0gICAgICBzd2l0Y2ggKChpbnQpIEJJVFMgKDUsIDYpKQotCXsKLQljYXNlIExTTDoKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICByZXR1cm4gKGJhc2UpOwotCSAgZWxzZSBpZiAoc2hhbXQgPT0gMzIpCi0JICAgIHsKLQkgICAgICBBU1NJR05DIChiYXNlICYgMSk7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2hhbXQgPiAzMikKLQkgICAgewotCSAgICAgIENMRUFSQzsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBBU1NJR05DICgoYmFzZSA+PiAoMzIgLSBzaGFtdCkpICYgMSk7Ci0JICAgICAgcmV0dXJuIChiYXNlIDw8IHNoYW10KTsKLQkgICAgfQotCWNhc2UgTFNSOgotCSAgaWYgKHNoYW10ID09IDApCi0JICAgIHJldHVybiAoYmFzZSk7Ci0JICBlbHNlIGlmIChzaGFtdCA9PSAzMikKLQkgICAgewotCSAgICAgIEFTU0lHTkMgKGJhc2UgPj4gMzEpOwotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNoYW10ID4gMzIpCi0JICAgIHsKLQkgICAgICBDTEVBUkM7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoKGJhc2UgPj4gKHNoYW10IC0gMSkpICYgMSk7Ci0JICAgICAgcmV0dXJuIChiYXNlID4+IHNoYW10KTsKLQkgICAgfQotCWNhc2UgQVNSOgotCSAgaWYgKHNoYW10ID09IDApCi0JICAgIHJldHVybiAoYmFzZSk7Ci0JICBlbHNlIGlmIChzaGFtdCA+PSAzMikKLQkgICAgewotCSAgICAgIEFTU0lHTkMgKGJhc2UgPj4gMzFMKTsKLQkgICAgICByZXR1cm4gKChBUk13b3JkKSAoKGxvbmcgaW50KSBiYXNlID4+IDMxTCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBBU1NJR05DICgoQVJNd29yZCkgKChsb25nIGludCkgYmFzZSA+PiAoaW50KSAoc2hhbXQgLSAxKSkgJiAxKTsKLQkgICAgICByZXR1cm4gKChBUk13b3JkKSAoKGxvbmcgaW50KSBiYXNlID4+IChpbnQpIHNoYW10KSk7Ci0JICAgIH0KLQljYXNlIFJPUjoKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICByZXR1cm4gKGJhc2UpOwotCSAgc2hhbXQgJj0gMHgxZjsKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoYmFzZSA+PiAzMSk7Ci0JICAgICAgcmV0dXJuIChiYXNlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoKGJhc2UgPj4gKHNoYW10IC0gMSkpICYgMSk7Ci0JICAgICAgcmV0dXJuICgoYmFzZSA8PCAoMzIgLSBzaGFtdCkpIHwgKGJhc2UgPj4gc2hhbXQpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHNoaWZ0IGFtb3VudCBpcyBhIGNvbnN0YW50ICovCi0jaWZuZGVmIE1PREUzMgotICAgICAgaWYgKGJhc2UgPT0gMTUpCi0JYmFzZSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFOwotICAgICAgZWxzZQotI2VuZGlmCi0JYmFzZSA9IHN0YXRlLT5SZWdbYmFzZV07Ci0gICAgICBzaGFtdCA9IEJJVFMgKDcsIDExKTsKLSAgICAgIHN3aXRjaCAoKGludCkgQklUUyAoNSwgNikpCi0JewotCWNhc2UgTFNMOgotCSAgQVNTSUdOQyAoKGJhc2UgPj4gKDMyIC0gc2hhbXQpKSAmIDEpOwotCSAgcmV0dXJuIChiYXNlIDw8IHNoYW10KTsKLQljYXNlIExTUjoKLQkgIGlmIChzaGFtdCA9PSAwKQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoYmFzZSA+PiAzMSk7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoKGJhc2UgPj4gKHNoYW10IC0gMSkpICYgMSk7Ci0JICAgICAgcmV0dXJuIChiYXNlID4+IHNoYW10KTsKLQkgICAgfQotCWNhc2UgQVNSOgotCSAgaWYgKHNoYW10ID09IDApCi0JICAgIHsKLQkgICAgICBBU1NJR05DIChiYXNlID4+IDMxTCk7Ci0JICAgICAgcmV0dXJuICgoQVJNd29yZCkgKChsb25nIGludCkgYmFzZSA+PiAzMUwpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQVNTSUdOQyAoKEFSTXdvcmQpICgobG9uZyBpbnQpIGJhc2UgPj4gKGludCkgKHNoYW10IC0gMSkpICYgMSk7Ci0JICAgICAgcmV0dXJuICgoQVJNd29yZCkgKChsb25nIGludCkgYmFzZSA+PiAoaW50KSBzaGFtdCkpOwotCSAgICB9Ci0JY2FzZSBST1I6Ci0JICBpZiAoc2hhbXQgPT0gMCkKLQkgICAgewkJCS8qIGl0cyBhbiBSUlggKi8KLQkgICAgICBzaGFtdCA9IENGTEFHOwotCSAgICAgIEFTU0lHTkMgKGJhc2UgJiAxKTsKLQkgICAgICByZXR1cm4gKChiYXNlID4+IDEpIHwgKHNoYW10IDw8IDMxKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEFTU0lHTkMgKChiYXNlID4+IChzaGFtdCAtIDEpKSAmIDEpOwotCSAgICAgIHJldHVybiAoKGJhc2UgPDwgKDMyIC0gc2hhbXQpKSB8IChiYXNlID4+IHNoYW10KSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwkJCS8qIGp1c3QgdG8gc2h1dCB1cCBsaW50ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoaXMgcm91dGluZSBoYW5kbGVzIHdyaXRlcyB0byByZWdpc3RlciAxNSB3aGVuIHRoZSBTIGJpdCBpcyBub3Qgc2V0LiAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLVdyaXRlUjE1IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHNyYykKLXsKLSAgLyogVGhlIEFSTSBkb2N1bWVudGF0aW9uIGltcGxpZXMgKGJ1dCBkb2Ugc25vdCBzdGF0ZSkgdGhhdCB0aGUgYm90dG9tIGJpdCBvZiB0aGUgUEMgaXMgbmV2ZXIgc2V0ICovCi0jaWZkZWYgTU9ERTMyCi0gIHN0YXRlLT5SZWdbMTVdID0gc3JjICYgUENCSVRTICYgfjB4MTsKLSNlbHNlCi0gIHN0YXRlLT5SZWdbMTVdID0gKHNyYyAmIFIxNVBDQklUUyAmIH4weDEpIHwgRUNDIHwgRVIxNUlOVCB8IEVNT0RFOwotICBBUk11bF9SMTVBbHRlcmVkIChzdGF0ZSk7Ci0jZW5kaWYKLSAgRkxVU0hQSVBFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyB3cml0ZXMgdG8gcmVnaXN0ZXIgMTUgd2hlbiB0aGUgUyBiaXQgaXMgc2V0LiAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZVNSMTUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgc3JjKQotewotI2lmZGVmIE1PREUzMgotICBzdGF0ZS0+UmVnWzE1XSA9IHNyYyAmIFBDQklUUzsKLSAgaWYgKHN0YXRlLT5CYW5rID4gMCkKLSAgICB7Ci0gICAgICBzdGF0ZS0+Q3BzciA9IHN0YXRlLT5TcHNyW3N0YXRlLT5CYW5rXTsKLSAgICAgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKHN0YXRlLT5CYW5rID09IFVTRVJCQU5LKQotICAgIHN0YXRlLT5SZWdbMTVdID0gKHNyYyAmIChDQ0JJVFMgfCBSMTVQQ0JJVFMpKSB8IEVSMTVJTlQgfCBFTU9ERTsKLSAgZWxzZQotICAgIHN0YXRlLT5SZWdbMTVdID0gc3JjOwotICBBUk11bF9SMTVBbHRlcmVkIChzdGF0ZSk7Ci0jZW5kaWYKLSAgRkxVU0hQSVBFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIG1vc3QgTG9hZCBhbmQgU3RvcmUgcmVnaXN0ZXIgUkhTJ3MuICBJdCBpcyAgICAgICAgICoKLSogaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG1hY3JvIExTUmVnUkhTLCB3aGljaCBmaWx0ZXJzIHRoZSAgICAgICAgICAqCi0qIGNvbW1vbiBjYXNlIG9mIGFuIHVuc2hpZnRlZCByZWdpc3RlciB3aXRoIGluIGxpbmUgY29kZSAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIEFSTXdvcmQKLUdldExTUmVnUkhTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyKQotewotICBBUk13b3JkIHNoYW10LCBiYXNlOwotCi0gIGJhc2UgPSBSSFNSZWc7Ci0jaWZuZGVmIE1PREUzMgotICBpZiAoYmFzZSA9PSAxNSkKLSAgICBiYXNlID0gRUNDIHwgRVIxNUlOVCB8IFIxNVBDIHwgRU1PREU7CS8qIE5vdyBmb3JiaWRkZW4sIGJ1dCAuLi4uICovCi0gIGVsc2UKLSNlbmRpZgotICAgIGJhc2UgPSBzdGF0ZS0+UmVnW2Jhc2VdOwotCi0gIHNoYW10ID0gQklUUyAoNywgMTEpOwotICBzd2l0Y2ggKChpbnQpIEJJVFMgKDUsIDYpKQotICAgIHsKLSAgICBjYXNlIExTTDoKLSAgICAgIHJldHVybiAoYmFzZSA8PCBzaGFtdCk7Ci0gICAgY2FzZSBMU1I6Ci0gICAgICBpZiAoc2hhbXQgPT0gMCkKLQlyZXR1cm4gKDApOwotICAgICAgZWxzZQotCXJldHVybiAoYmFzZSA+PiBzaGFtdCk7Ci0gICAgY2FzZSBBU1I6Ci0gICAgICBpZiAoc2hhbXQgPT0gMCkKLQlyZXR1cm4gKChBUk13b3JkKSAoKGxvbmcgaW50KSBiYXNlID4+IDMxTCkpOwotICAgICAgZWxzZQotCXJldHVybiAoKEFSTXdvcmQpICgobG9uZyBpbnQpIGJhc2UgPj4gKGludCkgc2hhbXQpKTsKLSAgICBjYXNlIFJPUjoKLSAgICAgIGlmIChzaGFtdCA9PSAwKQkJLyogaXRzIGFuIFJSWCAqLwotCXJldHVybiAoKGJhc2UgPj4gMSkgfCAoQ0ZMQUcgPDwgMzEpKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKChiYXNlIDw8ICgzMiAtIHNoYW10KSkgfCAoYmFzZSA+PiBzaGFtdCkpOwotICAgIH0KLSAgcmV0dXJuICgwKTsJCQkvKiBqdXN0IHRvIHNodXQgdXAgbGludCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIHRoZSBBUk03VCBoYWxmd29yZCBhbmQgc2lnbmVkIHRyYW5zZmVyIFJIUydzLiAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBBUk13b3JkCi1HZXRMUzdSSFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpCi17Ci0gIGlmIChCSVQgKDIyKSA9PSAwKQotICAgIHsJCQkJLyogcmVnaXN0ZXIgKi8KLSNpZm5kZWYgTU9ERTMyCi0gICAgICBpZiAoUkhTUmVnID09IDE1KQotCXJldHVybiBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERTsJLyogTm93IGZvcmJpZGRlbiwgYnV0IC4uLiAqLwotI2VuZGlmCi0gICAgICByZXR1cm4gc3RhdGUtPlJlZ1tSSFNSZWddOwotICAgIH0KLQotICAvKiBlbHNlIGltbWVkaWF0ZSAqLwotICByZXR1cm4gQklUUyAoMCwgMykgfCAoQklUUyAoOCwgMTEpIDw8IDQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbG9hZGluZyBhIHdvcmQgZm9yIGEgTERSIGluc3RydWN0aW9uLiAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1bnNpZ25lZAotTG9hZFdvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKLXsKLSAgQVJNd29yZCBkZXN0OwotCi0gIEJVU1VTRURJTkNQQ1M7Ci0jaWZuZGVmIE1PREUzMgotICBpZiAoQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotI2VuZGlmCi0gIGRlc3QgPSBBUk11bF9Mb2FkV29yZE4gKHN0YXRlLCBhZGRyZXNzKTsKLSAgaWYgKHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICAgIHJldHVybiAoc3RhdGUtPmxhdGVhYnRTaWcpOwotICAgIH0KLSAgaWYgKGFkZHJlc3MgJiAzKQotICAgIGRlc3QgPSBBUk11bF9BbGlnbiAoc3RhdGUsIGFkZHJlc3MsIGRlc3QpOwotICBXUklURURFU1QgKGRlc3QpOwotICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMEwpOwotCi0gIHJldHVybiAoREVTVFJlZyAhPSBMSFNSZWcpOwotfQotCi0jaWZkZWYgTU9ERVQKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBsb2FkaW5nIGEgaGFsZndvcmQuICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuc2lnbmVkCi1Mb2FkSGFsZldvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcywKLQkgICAgICBpbnQgc2lnbmV4dGVuZCkKLXsKLSAgQVJNd29yZCBkZXN0OwotCi0gIEJVU1VTRURJTkNQQ1M7Ci0jaWZuZGVmIE1PREUzMgotICBpZiAoQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotI2VuZGlmCi0gIGRlc3QgPSBBUk11bF9Mb2FkSGFsZldvcmQgKHN0YXRlLCBhZGRyZXNzKTsKLSAgaWYgKHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICAgIHJldHVybiAoc3RhdGUtPmxhdGVhYnRTaWcpOwotICAgIH0KLSAgVU5ERUZfTFNSQlBDOwotICBpZiAoc2lnbmV4dGVuZCkKLSAgICB7Ci0gICAgICBpZiAoZGVzdCAmIDEgPDwgKDE2IC0gMSkpCi0JZGVzdCA9IChkZXN0ICYgKCgxIDw8IDE2KSAtIDEpKSAtICgxIDw8IDE2KTsKLSAgICB9Ci0gIFdSSVRFREVTVCAoZGVzdCk7Ci0gIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCAxLCAwTCk7Ci0gIHJldHVybiAoREVTVFJlZyAhPSBMSFNSZWcpOwotfQotCi0jZW5kaWYgLyogTU9ERVQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGxvYWRpbmcgYSBieXRlIGZvciBhIExEUkIgaW5zdHJ1Y3Rpb24uICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLUxvYWRCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIGFkZHJlc3MsIGludCBzaWduZXh0ZW5kKQotewotICBBUk13b3JkIGRlc3Q7Ci0KLSAgQlVTVVNFRElOQ1BDUzsKLSNpZm5kZWYgTU9ERTMyCi0gIGlmIChBRERSRVhDRVBUIChhZGRyZXNzKSkKLSAgICB7Ci0gICAgICBJTlRFUk5BTEFCT1JUIChhZGRyZXNzKTsKLSAgICB9Ci0jZW5kaWYKLSAgZGVzdCA9IEFSTXVsX0xvYWRCeXRlIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICBUQUtFQUJPUlQ7Ci0gICAgICByZXR1cm4gKHN0YXRlLT5sYXRlYWJ0U2lnKTsKLSAgICB9Ci0gIFVOREVGX0xTUkJQQzsKLSAgaWYgKHNpZ25leHRlbmQpCi0gICAgewotICAgICAgaWYgKGRlc3QgJiAxIDw8ICg4IC0gMSkpCi0JZGVzdCA9IChkZXN0ICYgKCgxIDw8IDgpIC0gMSkpIC0gKDEgPDwgOCk7Ci0gICAgfQotICBXUklURURFU1QgKGRlc3QpOwotICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMEwpOwotICByZXR1cm4gKERFU1RSZWcgIT0gTEhTUmVnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIHN0b3JpbmcgYSB3b3JkIGZyb20gYSBTVFIgaW5zdHJ1Y3Rpb24uICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLVN0b3JlV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKQotewotICBCVVNVU0VESU5DUENOOwotI2lmbmRlZiBNT0RFMzIKLSAgaWYgKERFU1RSZWcgPT0gMTUpCi0gICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERTsKLSNlbmRpZgotI2lmZGVmIE1PREUzMgotICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgREVTVCk7Ci0jZWxzZQotICBpZiAoVkVDVE9SQUNDRVNTIChhZGRyZXNzKSB8fCBBRERSRVhDRVBUIChhZGRyZXNzKSkKLSAgICB7Ci0gICAgICBJTlRFUk5BTEFCT1JUIChhZGRyZXNzKTsKLSAgICAgICh2b2lkKSBBUk11bF9Mb2FkV29yZE4gKHN0YXRlLCBhZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgREVTVCk7Ci0jZW5kaWYKLSAgaWYgKHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICAgIHJldHVybiAoc3RhdGUtPmxhdGVhYnRTaWcpOwotICAgIH0KLSAgcmV0dXJuIChUUlVFKTsKLX0KLQotI2lmZGVmIE1PREVUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2Ygc3RvcmluZyBhIGJ5dGUgZm9yIGEgU1RSSCBpbnN0cnVjdGlvbi4gICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1bnNpZ25lZAotU3RvcmVIYWxmV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKQotewotICBCVVNVU0VESU5DUENOOwotCi0jaWZuZGVmIE1PREUzMgotICBpZiAoREVTVFJlZyA9PSAxNSkKLSAgICBzdGF0ZS0+UmVnWzE1XSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFOwotI2VuZGlmCi0KLSNpZmRlZiBNT0RFMzIKLSAgQVJNdWxfU3RvcmVIYWxmV29yZCAoc3RhdGUsIGFkZHJlc3MsIERFU1QpOwotI2Vsc2UKLSAgaWYgKFZFQ1RPUkFDQ0VTUyAoYWRkcmVzcykgfHwgQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgICAodm9pZCkgQVJNdWxfTG9hZEhhbGZXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgQVJNdWxfU3RvcmVIYWxmV29yZCAoc3RhdGUsIGFkZHJlc3MsIERFU1QpOwotI2VuZGlmCi0KLSAgaWYgKHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICAgIHJldHVybiAoc3RhdGUtPmxhdGVhYnRTaWcpOwotICAgIH0KLQotICByZXR1cm4gKFRSVUUpOwotfQotCi0jZW5kaWYgLyogTU9ERVQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIHN0b3JpbmcgYSBieXRlIGZvciBhIFNUUkIgaW5zdHJ1Y3Rpb24uICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLVN0b3JlQnl0ZSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKQotewotICBCVVNVU0VESU5DUENOOwotI2lmbmRlZiBNT0RFMzIKLSAgaWYgKERFU1RSZWcgPT0gMTUpCi0gICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERTsKLSNlbmRpZgotI2lmZGVmIE1PREUzMgotICBBUk11bF9TdG9yZUJ5dGUgKHN0YXRlLCBhZGRyZXNzLCBERVNUKTsKLSNlbHNlCi0gIGlmIChWRUNUT1JBQ0NFU1MgKGFkZHJlc3MpIHx8IEFERFJFWENFUFQgKGFkZHJlc3MpKQotICAgIHsKLSAgICAgIElOVEVSTkFMQUJPUlQgKGFkZHJlc3MpOwotICAgICAgKHZvaWQpIEFSTXVsX0xvYWRCeXRlIChzdGF0ZSwgYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgQVJNdWxfU3RvcmVCeXRlIChzdGF0ZSwgYWRkcmVzcywgREVTVCk7Ci0jZW5kaWYKLSAgaWYgKHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICAgIHJldHVybiAoc3RhdGUtPmxhdGVhYnRTaWcpOwotICAgIH0KLSAgVU5ERUZfTFNSQlBDOwotICByZXR1cm4gKFRSVUUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbG9hZGluZyB0aGUgcmVnaXN0ZXJzIGxpc3RlZCBpbiBhbiBMRE0gICAgICoKLSogaW5zdHJ1Y3Rpb24sIHdoZW4gdGhlIFMgYml0IGlzIGNsZWFyLiAgVGhlIGNvZGUgaGVyZSBpcyBhbHdheXMgaW5jcmVtZW50ICAqCi0qIGFmdGVyLCBpdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZ2V0IHRoZSBpbnB1dCBhZGRyZXNzIGNvcnJlY3QgYW5kIHRvICAgICAgKgotKiBoYW5kbGUgYmFzZSByZWdpc3RlciBtb2RpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1Mb2FkTXVsdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIFdCQmFzZSkKLXsKLSAgQVJNd29yZCBkZXN0LCB0ZW1wOwotCi0gIFVOREVGX0xTTU5vUmVnczsKLSAgVU5ERUZfTFNNUENCYXNlOwotICBVTkRFRl9MU01CYXNlSW5MaXN0V2I7Ci0gIEJVU1VTRURJTkNQQ1M7Ci0jaWZuZGVmIE1PREUzMgotICBpZiAoQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChCSVQgKDIxKSAmJiBMSFNSZWcgIT0gMTUpCi0gICAgTFNCYXNlID0gV0JCYXNlOwotCi0gIGZvciAodGVtcCA9IDA7ICFCSVQgKHRlbXApOyB0ZW1wKyspOwkvKiBOIGN5Y2xlIGZpcnN0ICovCi0gIGRlc3QgPSBBUk11bF9Mb2FkV29yZE4gKHN0YXRlLCBhZGRyZXNzKTsKLSAgaWYgKCFzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQotICAgIHN0YXRlLT5SZWdbdGVtcCsrXSA9IGRlc3Q7Ci0gIGVsc2UgaWYgKCFzdGF0ZS0+QWJvcnRlZCkKLSAgICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFY7Ci0KLSAgZm9yICg7IHRlbXAgPCAxNjsgdGVtcCsrKQkvKiBTIGN5Y2xlcyBmcm9tIGhlcmUgb24gKi8KLSAgICBpZiAoQklUICh0ZW1wKSkKLSAgICAgIHsJCQkJLyogbG9hZCB0aGlzIHJlZ2lzdGVyICovCi0JYWRkcmVzcyArPSA0OwotCWRlc3QgPSBBUk11bF9Mb2FkV29yZFMgKHN0YXRlLCBhZGRyZXNzKTsKLQlpZiAoIXN0YXRlLT5hYm9ydFNpZyAmJiAhc3RhdGUtPkFib3J0ZWQpCi0JICBzdGF0ZS0+UmVnW3RlbXBdID0gZGVzdDsKLQllbHNlIGlmICghc3RhdGUtPkFib3J0ZWQpCi0JICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFY7Ci0gICAgICB9Ci0KLSAgaWYgKEJJVCAoMTUpICYmICFzdGF0ZS0+QWJvcnRlZCkKLSAgICB7CQkJCS8qIFBDIGlzIGluIHRoZSByZWcgbGlzdCAqLwotI2lmZGVmIE1PREUzMgotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBQQzsKLSNlbmRpZgotICAgICAgRkxVU0hQSVBFOwotICAgIH0KLQotICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMEwpOwkvKiB0byB3cml0ZSBiYWNrIHRoZSBmaW5hbCByZWdpc3RlciAqLwotCi0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICBpZiAoQklUICgyMSkgJiYgTEhTUmVnICE9IDE1KQotCUxTQmFzZSA9IFdCQmFzZTsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBsb2FkaW5nIHRoZSByZWdpc3RlcnMgbGlzdGVkIGluIGFuIExETSAgICAgKgotKiBpbnN0cnVjdGlvbiwgd2hlbiB0aGUgUyBiaXQgaXMgc2V0LiBUaGUgY29kZSBoZXJlIGlzIGFsd2F5cyBpbmNyZW1lbnQgICAgICoKLSogYWZ0ZXIsIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBnZXQgdGhlIGlucHV0IGFkZHJlc3MgY29ycmVjdCBhbmQgdG8gICAgICAqCi0qIGhhbmRsZSBiYXNlIHJlZ2lzdGVyIG1vZGlmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLUxvYWRTTXVsdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwKLQkgICBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgV0JCYXNlKQotewotICBBUk13b3JkIGRlc3QsIHRlbXA7Ci0KLSAgVU5ERUZfTFNNTm9SZWdzOwotICBVTkRFRl9MU01QQ0Jhc2U7Ci0gIFVOREVGX0xTTUJhc2VJbkxpc3RXYjsKLSAgQlVTVVNFRElOQ1BDUzsKLSNpZm5kZWYgTU9ERTMyCi0gIGlmIChBRERSRVhDRVBUIChhZGRyZXNzKSkKLSAgICB7Ci0gICAgICBJTlRFUk5BTEFCT1JUIChhZGRyZXNzKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoIUJJVCAoMTUpICYmIHN0YXRlLT5CYW5rICE9IFVTRVJCQU5LKQotICAgIHsKLSAgICAgICh2b2lkKSBBUk11bF9Td2l0Y2hNb2RlIChzdGF0ZSwgc3RhdGUtPk1vZGUsIFVTRVIyNk1PREUpOwkvKiB0ZW1wb3JhcnkgcmVnIGJhbmsgc3dpdGNoICovCi0gICAgICBVTkRFRl9MU01Vc2VyQmFua1diOwotICAgIH0KLQotICBpZiAoQklUICgyMSkgJiYgTEhTUmVnICE9IDE1KQotICAgIExTQmFzZSA9IFdCQmFzZTsKLQotICBmb3IgKHRlbXAgPSAwOyAhQklUICh0ZW1wKTsgdGVtcCsrKTsJLyogTiBjeWNsZSBmaXJzdCAqLwotICBkZXN0ID0gQVJNdWxfTG9hZFdvcmROIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIGlmICghc3RhdGUtPmFib3J0U2lnKQotICAgIHN0YXRlLT5SZWdbdGVtcCsrXSA9IGRlc3Q7Ci0gIGVsc2UgaWYgKCFzdGF0ZS0+QWJvcnRlZCkKLSAgICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFY7Ci0KLSAgZm9yICg7IHRlbXAgPCAxNjsgdGVtcCsrKQkvKiBTIGN5Y2xlcyBmcm9tIGhlcmUgb24gKi8KLSAgICBpZiAoQklUICh0ZW1wKSkKLSAgICAgIHsJCQkJLyogbG9hZCB0aGlzIHJlZ2lzdGVyICovCi0JYWRkcmVzcyArPSA0OwotCWRlc3QgPSBBUk11bF9Mb2FkV29yZFMgKHN0YXRlLCBhZGRyZXNzKTsKLQlpZiAoIXN0YXRlLT5hYm9ydFNpZyAmJiAhc3RhdGUtPkFib3J0ZWQpCi0JICBzdGF0ZS0+UmVnW3RlbXBdID0gZGVzdDsKLQllbHNlIGlmICghc3RhdGUtPkFib3J0ZWQpCi0JICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFY7Ci0gICAgICB9Ci0KLSAgaWYgKEJJVCAoMTUpICYmICFzdGF0ZS0+QWJvcnRlZCkKLSAgICB7CQkJCS8qIFBDIGlzIGluIHRoZSByZWcgbGlzdCAqLwotI2lmZGVmIE1PREUzMgotICAgICAgaWYgKHN0YXRlLT5Nb2RlICE9IFVTRVIyNk1PREUgJiYgc3RhdGUtPk1vZGUgIT0gVVNFUjMyTU9ERSkKLQl7Ci0JICBzdGF0ZS0+Q3BzciA9IEdFVFNQU1IgKHN0YXRlLT5CYW5rKTsKLQkgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0JfQotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBQQzsKLSNlbHNlCi0gICAgICBpZiAoc3RhdGUtPk1vZGUgPT0gVVNFUjI2TU9ERSB8fCBzdGF0ZS0+TW9kZSA9PSBVU0VSMzJNT0RFKQotCXsJCQkvKiBwcm90ZWN0IGJpdHMgaW4gdXNlciBtb2RlICovCi0JICBBU1NJR05OICgoc3RhdGUtPlJlZ1sxNV0gJiBOQklUKSAhPSAwKTsKLQkgIEFTU0lHTlogKChzdGF0ZS0+UmVnWzE1XSAmIFpCSVQpICE9IDApOwotCSAgQVNTSUdOQyAoKHN0YXRlLT5SZWdbMTVdICYgQ0JJVCkgIT0gMCk7Ci0JICBBU1NJR05WICgoc3RhdGUtPlJlZ1sxNV0gJiBWQklUKSAhPSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JQVJNdWxfUjE1QWx0ZXJlZCAoc3RhdGUpOwotI2VuZGlmCi0gICAgICBGTFVTSFBJUEU7Ci0gICAgfQotCi0gIGlmICghQklUICgxNSkgJiYgc3RhdGUtPk1vZGUgIT0gVVNFUjI2TU9ERSAmJiBzdGF0ZS0+TW9kZSAhPSBVU0VSMzJNT0RFKQotICAgICh2b2lkKSBBUk11bF9Td2l0Y2hNb2RlIChzdGF0ZSwgVVNFUjI2TU9ERSwgc3RhdGUtPk1vZGUpOwkvKiByZXN0b3JlIHRoZSBjb3JyZWN0IGJhbmsgKi8KLQotICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMEwpOwkvKiB0byB3cml0ZSBiYWNrIHRoZSBmaW5hbCByZWdpc3RlciAqLwotCi0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICBpZiAoQklUICgyMSkgJiYgTEhTUmVnICE9IDE1KQotCUxTQmFzZSA9IFdCQmFzZTsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIHN0b3JpbmcgdGhlIHJlZ2lzdGVycyBsaXN0ZWQgaW4gYW4gU1RNICAgICAqCi0qIGluc3RydWN0aW9uLCB3aGVuIHRoZSBTIGJpdCBpcyBjbGVhci4gIFRoZSBjb2RlIGhlcmUgaXMgYWx3YXlzIGluY3JlbWVudCAgKgotKiBhZnRlciwgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGdldCB0aGUgaW5wdXQgYWRkcmVzcyBjb3JyZWN0IGFuZCB0byAgICAgICoKLSogaGFuZGxlIGJhc2UgcmVnaXN0ZXIgbW9kaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotU3RvcmVNdWx0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLAotCSAgIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBXQkJhc2UpCi17Ci0gIEFSTXdvcmQgdGVtcDsKLQotICBVTkRFRl9MU01Ob1JlZ3M7Ci0gIFVOREVGX0xTTVBDQmFzZTsKLSAgVU5ERUZfTFNNQmFzZUluTGlzdFdiOwotICBpZiAoIVRGTEFHKQotICAgIHsKLSAgICAgIEJVU1VTRURJTkNQQ047CQkvKiBOLWN5Y2xlLCBpbmNyZW1lbnQgdGhlIFBDIGFuZCB1cGRhdGUgdGhlIE5leHRJbnN0ciBzdGF0ZSAqLwotICAgIH0KLQotI2lmbmRlZiBNT0RFMzIKLSAgaWYgKFZFQ1RPUkFDQ0VTUyAoYWRkcmVzcykgfHwgQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotICBpZiAoQklUICgxNSkpCi0gICAgUEFUQ0hSMTU7Ci0jZW5kaWYKLQotICBmb3IgKHRlbXAgPSAwOyAhQklUICh0ZW1wKTsgdGVtcCsrKTsJLyogTiBjeWNsZSBmaXJzdCAqLwotI2lmZGVmIE1PREUzMgotICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgc3RhdGUtPlJlZ1t0ZW1wKytdKTsKLSNlbHNlCi0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICAodm9pZCkgQVJNdWxfTG9hZFdvcmROIChzdGF0ZSwgYWRkcmVzcyk7Ci0gICAgICBmb3IgKDsgdGVtcCA8IDE2OyB0ZW1wKyspCS8qIEZha2UgdGhlIFN0b3JlcyBhcyBMb2FkcyAqLwotCWlmIChCSVQgKHRlbXApKQotCSAgewkJCS8qIHNhdmUgdGhpcyByZWdpc3RlciAqLwotCSAgICBhZGRyZXNzICs9IDQ7Ci0JICAgICh2b2lkKSBBUk11bF9Mb2FkV29yZFMgKHN0YXRlLCBhZGRyZXNzKTsKLQkgIH0KLSAgICAgIGlmIChCSVQgKDIxKSAmJiBMSFNSZWcgIT0gMTUpCi0JTFNCYXNlID0gV0JCYXNlOwotICAgICAgVEFLRUFCT1JUOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIEFSTXVsX1N0b3JlV29yZE4gKHN0YXRlLCBhZGRyZXNzLCBzdGF0ZS0+UmVnW3RlbXArK10pOwotI2VuZGlmCi0gIGlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQotICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0VjsKLQotICBpZiAoQklUICgyMSkgJiYgTEhTUmVnICE9IDE1KQotICAgIExTQmFzZSA9IFdCQmFzZTsKLQotICBmb3IgKDsgdGVtcCA8IDE2OyB0ZW1wKyspCS8qIFMgY3ljbGVzIGZyb20gaGVyZSBvbiAqLwotICAgIGlmIChCSVQgKHRlbXApKQotICAgICAgewkJCQkvKiBzYXZlIHRoaXMgcmVnaXN0ZXIgKi8KLQlhZGRyZXNzICs9IDQ7Ci0JQVJNdWxfU3RvcmVXb3JkUyAoc3RhdGUsIGFkZHJlc3MsIHN0YXRlLT5SZWdbdGVtcF0pOwotCWlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQotCSAgc3RhdGUtPkFib3J0ZWQgPSBBUk11bF9EYXRhQWJvcnRWOwotICAgICAgfQotICBpZiAoc3RhdGUtPkFib3J0ZWQpCi0gICAgewotICAgICAgVEFLRUFCT1JUOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIHN0b3JpbmcgdGhlIHJlZ2lzdGVycyBsaXN0ZWQgaW4gYW4gU1RNICAgICAqCi0qIGluc3RydWN0aW9uIHdoZW4gdGhlIFMgYml0IGlzIHNldC4gIFRoZSBjb2RlIGhlcmUgaXMgYWx3YXlzIGluY3JlbWVudCAgICAgKgotKiBhZnRlciwgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGdldCB0aGUgaW5wdXQgYWRkcmVzcyBjb3JyZWN0IGFuZCB0byAgICAgICoKLSogaGFuZGxlIGJhc2UgcmVnaXN0ZXIgbW9kaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotU3RvcmVTTXVsdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwKLQkgICAgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIFdCQmFzZSkKLXsKLSAgQVJNd29yZCB0ZW1wOwotCi0gIFVOREVGX0xTTU5vUmVnczsKLSAgVU5ERUZfTFNNUENCYXNlOwotICBVTkRFRl9MU01CYXNlSW5MaXN0V2I7Ci0gIEJVU1VTRURJTkNQQ047Ci0jaWZuZGVmIE1PREUzMgotICBpZiAoVkVDVE9SQUNDRVNTIChhZGRyZXNzKSB8fCBBRERSRVhDRVBUIChhZGRyZXNzKSkKLSAgICB7Ci0gICAgICBJTlRFUk5BTEFCT1JUIChhZGRyZXNzKTsKLSAgICB9Ci0gIGlmIChCSVQgKDE1KSkKLSAgICBQQVRDSFIxNTsKLSNlbmRpZgotCi0gIGlmIChzdGF0ZS0+QmFuayAhPSBVU0VSQkFOSykKLSAgICB7Ci0gICAgICAodm9pZCkgQVJNdWxfU3dpdGNoTW9kZSAoc3RhdGUsIHN0YXRlLT5Nb2RlLCBVU0VSMjZNT0RFKTsJLyogRm9yY2UgVXNlciBCYW5rICovCi0gICAgICBVTkRFRl9MU01Vc2VyQmFua1diOwotICAgIH0KLQotICBmb3IgKHRlbXAgPSAwOyAhQklUICh0ZW1wKTsgdGVtcCsrKTsJLyogTiBjeWNsZSBmaXJzdCAqLwotI2lmZGVmIE1PREUzMgotICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgc3RhdGUtPlJlZ1t0ZW1wKytdKTsKLSNlbHNlCi0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICAodm9pZCkgQVJNdWxfTG9hZFdvcmROIChzdGF0ZSwgYWRkcmVzcyk7Ci0gICAgICBmb3IgKDsgdGVtcCA8IDE2OyB0ZW1wKyspCS8qIEZha2UgdGhlIFN0b3JlcyBhcyBMb2FkcyAqLwotCWlmIChCSVQgKHRlbXApKQotCSAgewkJCS8qIHNhdmUgdGhpcyByZWdpc3RlciAqLwotCSAgICBhZGRyZXNzICs9IDQ7Ci0JICAgICh2b2lkKSBBUk11bF9Mb2FkV29yZFMgKHN0YXRlLCBhZGRyZXNzKTsKLQkgIH0KLSAgICAgIGlmIChCSVQgKDIxKSAmJiBMSFNSZWcgIT0gMTUpCi0JTFNCYXNlID0gV0JCYXNlOwotICAgICAgVEFLRUFCT1JUOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIEFSTXVsX1N0b3JlV29yZE4gKHN0YXRlLCBhZGRyZXNzLCBzdGF0ZS0+UmVnW3RlbXArK10pOwotI2VuZGlmCi0gIGlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQotICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0VjsKLQotICBpZiAoQklUICgyMSkgJiYgTEhTUmVnICE9IDE1KQotICAgIExTQmFzZSA9IFdCQmFzZTsKLQotICBmb3IgKDsgdGVtcCA8IDE2OyB0ZW1wKyspCS8qIFMgY3ljbGVzIGZyb20gaGVyZSBvbiAqLwotICAgIGlmIChCSVQgKHRlbXApKQotICAgICAgewkJCQkvKiBzYXZlIHRoaXMgcmVnaXN0ZXIgKi8KLQlhZGRyZXNzICs9IDQ7Ci0JQVJNdWxfU3RvcmVXb3JkUyAoc3RhdGUsIGFkZHJlc3MsIHN0YXRlLT5SZWdbdGVtcF0pOwotCWlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQotCSAgc3RhdGUtPkFib3J0ZWQgPSBBUk11bF9EYXRhQWJvcnRWOwotICAgICAgfQotCi0gIGlmIChzdGF0ZS0+TW9kZSAhPSBVU0VSMjZNT0RFICYmIHN0YXRlLT5Nb2RlICE9IFVTRVIzMk1PREUpCi0gICAgKHZvaWQpIEFSTXVsX1N3aXRjaE1vZGUgKHN0YXRlLCBVU0VSMjZNT0RFLCBzdGF0ZS0+TW9kZSk7CS8qIHJlc3RvcmUgdGhlIGNvcnJlY3QgYmFuayAqLwotCi0gIGlmIChzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICBUQUtFQUJPUlQ7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgYWRkaW5nIHR3byAzMmJpdCB2YWx1ZXMgdG9nZXRoZXIsIGFuZCAgICAgICoKLSogY2FsY3VsYXRpbmcgaWYgYSBjYXJyeSBoYXMgb2NjdXJyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgQVJNd29yZAotQWRkMzIgKEFSTXdvcmQgYTEsIEFSTXdvcmQgYTIsIGludCAqY2FycnkpCi17Ci0gIEFSTXdvcmQgcmVzdWx0ID0gKGExICsgYTIpOwotICB1bnNpZ25lZCBpbnQgdXJlc3VsdCA9ICh1bnNpZ25lZCBpbnQpIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50IHVhMSA9ICh1bnNpZ25lZCBpbnQpIGExOwotCi0gIC8qIElmIChyZXN1bHQgPT0gUmRMbykgYW5kIChzdGF0ZS0+UmVnW25SZExvXSA9PSAwKSwKLSAgICAgb3IgKHJlc3VsdCA+IFJkTG8pIHRoZW4gd2UgaGF2ZSBubyBjYXJyeTogKi8KLSAgaWYgKCh1cmVzdWx0ID09IHVhMSkgPyAoYTIgIT0gMCkgOiAodXJlc3VsdCA8IHVhMSkpCi0gICAgKmNhcnJ5ID0gMTsKLSAgZWxzZQotICAgICpjYXJyeSA9IDA7Ci0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbXVsdGlwbHlpbmcgdHdvIDMyYml0IHZhbHVlcyB0byBnaXZlIGEgICAgICoKLSogNjRiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLU11bHRpcGx5NjQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIGludCBtc2lnbmVkLCBpbnQgc2NjKQotewotICBpbnQgblJkSGksIG5SZExvLCBuUnMsIG5SbTsJLyogb3BlcmFuZCByZWdpc3RlciBudW1iZXJzICovCi0gIEFSTXdvcmQgUmRIaSA9IDAsIFJkTG8gPSAwLCBSbTsKLSAgaW50IHNjb3VudDsJCQkvKiBjeWNsZSBjb3VudCAqLwotCi0gIG5SZEhpID0gQklUUyAoMTYsIDE5KTsKLSAgblJkTG8gPSBCSVRTICgxMiwgMTUpOwotICBuUnMgPSBCSVRTICg4LCAxMSk7Ci0gIG5SbSA9IEJJVFMgKDAsIDMpOwotCi0gIC8qIE5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGN5Y2xlIGNvdW50OiAqLwotICBSbSA9IHN0YXRlLT5SZWdbblJtXTsKLQotICAvKiBDaGVjayBmb3IgaWxsZWdhbCBvcGVyYW5kIGNvbWJpbmF0aW9ucyBmaXJzdDogKi8KLSAgaWYgKG5SZEhpICE9IDE1Ci0gICAgICAmJiBuUmRMbyAhPSAxNQotICAgICAgJiYgblJzICE9IDE1Ci0gICAgICAmJiBuUm0gIT0gMTUgJiYgblJkSGkgIT0gblJkTG8gJiYgblJkSGkgIT0gblJtICYmIG5SZExvICE9IG5SbSkKLSAgICB7Ci0gICAgICBBUk13b3JkIGxvLCBtaWQxLCBtaWQyLCBoaTsJLyogaW50ZXJtZWRpYXRlIHJlc3VsdHMgKi8KLSAgICAgIGludCBjYXJyeTsKLSAgICAgIEFSTXdvcmQgUnMgPSBzdGF0ZS0+UmVnW25Sc107Ci0gICAgICBpbnQgc2lnbiA9IDA7Ci0KLSAgICAgIGlmIChtc2lnbmVkKQotCXsKLQkgIC8qIENvbXB1dGUgc2lnbiBvZiByZXN1bHQgYW5kIGFkanVzdCBvcGVyYW5kcyBpZiBuZWNlc3NhcnkuICAqLwotCi0JICBzaWduID0gKFJtIF4gUnMpICYgMHg4MDAwMDAwMDsKLQotCSAgaWYgKCgoc2lnbmVkIGxvbmcpIFJtKSA8IDApCi0JICAgIFJtID0gLVJtOwotCi0JICBpZiAoKChzaWduZWQgbG9uZykgUnMpIDwgMCkKLQkgICAgUnMgPSAtUnM7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gc3BsaXQgdGhlIDMyeDMyIGludG8gZm91ciAxNngxNiBvcGVyYXRpb25zLiBUaGlzIGVuc3VyZXMKLSAgICAgICAgIHRoYXQgd2UgZG8gbm90IGxvc2UgcHJlY2lzaW9uIG9uIDMyYml0IG9ubHkgaG9zdHM6ICovCi0gICAgICBsbyA9ICgoUnMgJiAweEZGRkYpICogKFJtICYgMHhGRkZGKSk7Ci0gICAgICBtaWQxID0gKChScyAmIDB4RkZGRikgKiAoKFJtID4+IDE2KSAmIDB4RkZGRikpOwotICAgICAgbWlkMiA9ICgoKFJzID4+IDE2KSAmIDB4RkZGRikgKiAoUm0gJiAweEZGRkYpKTsKLSAgICAgIGhpID0gKCgoUnMgPj4gMTYpICYgMHhGRkZGKSAqICgoUm0gPj4gMTYpICYgMHhGRkZGKSk7Ci0KLSAgICAgIC8qIFdlIG5vdyBuZWVkIHRvIGFkZCBhbGwgb2YgdGhlc2UgcmVzdWx0cyB0b2dldGhlciwgdGFraW5nIGNhcmUKLSAgICAgICAgIHRvIHByb3BvZ2F0ZSB0aGUgY2FycmllcyBmcm9tIHRoZSBhZGRpdGlvbnM6ICovCi0gICAgICBSZExvID0gQWRkMzIgKGxvLCAobWlkMSA8PCAxNiksICZjYXJyeSk7Ci0gICAgICBSZEhpID0gY2Fycnk7Ci0gICAgICBSZExvID0gQWRkMzIgKFJkTG8sIChtaWQyIDw8IDE2KSwgJmNhcnJ5KTsKLSAgICAgIFJkSGkgKz0KLQkoY2FycnkgKyAoKG1pZDEgPj4gMTYpICYgMHhGRkZGKSArICgobWlkMiA+PiAxNikgJiAweEZGRkYpICsgaGkpOwotCi0gICAgICBpZiAoc2lnbikKLQl7Ci0JICAvKiBOZWdhdGUgcmVzdWx0IGlmIG5lY2Vzc2FyeS4gICovCi0KLQkgIFJkTG8gPSB+UmRMbzsKLQkgIFJkSGkgPSB+UmRIaTsKLQkgIGlmIChSZExvID09IDB4RkZGRkZGRkYpCi0JICAgIHsKLQkgICAgICBSZExvID0gMDsKLQkgICAgICBSZEhpICs9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgUmRMbyArPSAxOwotCX0KLQotICAgICAgc3RhdGUtPlJlZ1tuUmRMb10gPSBSZExvOwotICAgICAgc3RhdGUtPlJlZ1tuUmRIaV0gPSBSZEhpOwotICAgIH0JCQkJLyogZWxzZSB1bmRlZmluZWQgcmVzdWx0ICovCi0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJNVUxUSVBMWTY0IC0gSU5WQUxJRCBBUkdVTUVOVFNcbiIpOwotCi0gIGlmIChzY2MpCi0gICAgewotICAgICAgaWYgKChSZEhpID09IDApICYmIChSZExvID09IDApKQotCUFSTXVsX05lZ1plcm8gKHN0YXRlLCBSZEhpKTsJLyogemVybyB2YWx1ZSAqLwotICAgICAgZWxzZQotCUFSTXVsX05lZ1plcm8gKHN0YXRlLCBzY2MpOwkvKiBub24temVybyB2YWx1ZSAqLwotICAgIH0KLQotICAvKiBUaGUgY3ljbGUgY291bnQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBhIHNpZ25lZCBvcgotICAgICB1bnNpZ25lZCBtdWx0aXBseSwgYW5kIHdoYXQgYml0cyBhcmUgY2xlYXIgaW4gdGhlIG11bHRpcGxpZXI6ICovCi0gIGlmIChtc2lnbmVkICYmIChSbSAmICgodW5zaWduZWQpIDEgPDwgMzEpKSkKLSAgICBSbSA9IH5SbTsJCQkvKiBpbnZlcnQgdGhlIGJpdHMgdG8gbWFrZSB0aGUgY2hlY2sgYWdhaW5zdCB6ZXJvICovCi0KLSAgaWYgKChSbSAmIDB4RkZGRkZGMDApID09IDApCi0gICAgc2NvdW50ID0gMTsKLSAgZWxzZSBpZiAoKFJtICYgMHhGRkZGMDAwMCkgPT0gMCkKLSAgICBzY291bnQgPSAyOwotICBlbHNlIGlmICgoUm0gJiAweEZGMDAwMDAwKSA9PSAwKQotICAgIHNjb3VudCA9IDM7Ci0gIGVsc2UKLSAgICBzY291bnQgPSA0OwotCi0gIHJldHVybiAyICsgc2NvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbXVsdGlwbHlpbmcgdHdvIDMyYml0IHZhbHVlcyBhbmQgYWRkaW5nICAgICoKLSogYSA2NGJpdCB2YWx1ZSB0byBnaXZlIGEgNjRiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQKLU11bHRpcGx5QWRkNjQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIGludCBtc2lnbmVkLCBpbnQgc2NjKQotewotICB1bnNpZ25lZCBzY291bnQ7Ci0gIEFSTXdvcmQgUmRMbywgUmRIaTsKLSAgaW50IG5SZEhpLCBuUmRMbzsKLSAgaW50IGNhcnJ5ID0gMDsKLQotICBuUmRIaSA9IEJJVFMgKDE2LCAxOSk7Ci0gIG5SZExvID0gQklUUyAoMTIsIDE1KTsKLQotICBSZEhpID0gc3RhdGUtPlJlZ1tuUmRIaV07Ci0gIFJkTG8gPSBzdGF0ZS0+UmVnW25SZExvXTsKLQotICBzY291bnQgPSBNdWx0aXBseTY0IChzdGF0ZSwgaW5zdHIsIG1zaWduZWQsIExERUZBVUxUKTsKLQotICBSZExvID0gQWRkMzIgKFJkTG8sIHN0YXRlLT5SZWdbblJkTG9dLCAmY2FycnkpOwotICBSZEhpID0gKFJkSGkgKyBzdGF0ZS0+UmVnW25SZEhpXSkgKyBjYXJyeTsKLQotICBzdGF0ZS0+UmVnW25SZExvXSA9IFJkTG87Ci0gIHN0YXRlLT5SZWdbblJkSGldID0gUmRIaTsKLQotICBpZiAoc2NjKQotICAgIHsKLSAgICAgIGlmICgoUmRIaSA9PSAwKSAmJiAoUmRMbyA9PSAwKSkKLQlBUk11bF9OZWdaZXJvIChzdGF0ZSwgUmRIaSk7CS8qIHplcm8gdmFsdWUgKi8KLSAgICAgIGVsc2UKLQlBUk11bF9OZWdaZXJvIChzdGF0ZSwgc2NjKTsJLyogbm9uLXplcm8gdmFsdWUgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHNjb3VudCArIDE7CQkvKiBleHRyYSBjeWNsZSBmb3IgYWRkaXRpb24gKi8KLX0KZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtZW11LmggYi9zaW0vYXJtL2FybWVtdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBjNGVmLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vYXJtZW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyogIGFybWVtdS5oIC0tIEFSTXVsYXRvciBlbXVsYXRpb24gbWFjcm9zOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi1leHRlcm4gQVJNd29yZCBpc2l6ZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gY29kZSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVRIDAKLSNkZWZpbmUgTkUgMQotI2RlZmluZSBDUyAyCi0jZGVmaW5lIENDIDMKLSNkZWZpbmUgTUkgNAotI2RlZmluZSBQTCA1Ci0jZGVmaW5lIFZTIDYKLSNkZWZpbmUgVkMgNwotI2RlZmluZSBISSA4Ci0jZGVmaW5lIExTIDkKLSNkZWZpbmUgR0UgMTAKLSNkZWZpbmUgTFQgMTEKLSNkZWZpbmUgR1QgMTIKLSNkZWZpbmUgTEUgMTMKLSNkZWZpbmUgQUwgMTQKLSNkZWZpbmUgTlYgMTUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQgT3Bjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExTTCAwCi0jZGVmaW5lIExTUiAxCi0jZGVmaW5lIEFTUiAyCi0jZGVmaW5lIFJPUiAzCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgTWFjcm9zIHRvIHR3aWRkbGUgdGhlIHN0YXR1cyBmbGFncyBhbmQgbW9kZSAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBOQklUICgodW5zaWduZWQpMUwgPDwgMzEpCi0jZGVmaW5lIFpCSVQgKDFMIDw8IDMwKQotI2RlZmluZSBDQklUICgxTCA8PCAyOSkKLSNkZWZpbmUgVkJJVCAoMUwgPDwgMjgpCi0jZGVmaW5lIElCSVQgKDFMIDw8IDcpCi0jZGVmaW5lIEZCSVQgKDFMIDw8IDYpCi0jZGVmaW5lIElGQklUUyAoM0wgPDwgNikKLSNkZWZpbmUgUjE1SUJJVCAoMUwgPDwgMjcpCi0jZGVmaW5lIFIxNUZCSVQgKDFMIDw8IDI2KQotI2RlZmluZSBSMTVJRkJJVFMgKDNMIDw8IDI2KQotCi0jZGVmaW5lIFBPUyhpKSAoICh+KGkpKSA+PiAzMSApCi0jZGVmaW5lIE5FRyhpKSAoIChpKSA+PiAzMSApCi0KLSNpZmRlZiBNT0RFVAkJCS8qIFRodW1iIHN1cHBvcnQgKi8KLS8qID8/PyBUaGlzIGJpdCBpcyBhY3R1YWxseSBpbiB0aGUgbG93IG9yZGVyIGJpdCBvZiB0aGUgUEMgaW4gdGhlIGhhcmR3YXJlLgotICAgSXQgaXNuJ3QgY2xlYXIgaWYgdGhlIHNpbXVsYXRvciBuZWVkcyB0byBtb2RlbCB0aGF0IG9yIG5vdC4gICovCi0jZGVmaW5lIFRCSVQgKDFMIDw8IDUpCi0jZGVmaW5lIFRGTEFHIHN0YXRlLT5URmxhZwotI2RlZmluZSBTRVRUIHN0YXRlLT5URmxhZyA9IDEKLSNkZWZpbmUgQ0xFQVJUIHN0YXRlLT5URmxhZyA9IDAKLSNkZWZpbmUgQVNTSUdOVChyZXMpIHN0YXRlLT5URmxhZyA9IHJlcwotI2VuZGlmCi0KLSNkZWZpbmUgTkZMQUcgc3RhdGUtPk5GbGFnCi0jZGVmaW5lIFNFVE4gc3RhdGUtPk5GbGFnID0gMQotI2RlZmluZSBDTEVBUk4gc3RhdGUtPk5GbGFnID0gMAotI2RlZmluZSBBU1NJR05OKHJlcykgc3RhdGUtPk5GbGFnID0gcmVzCi0KLSNkZWZpbmUgWkZMQUcgc3RhdGUtPlpGbGFnCi0jZGVmaW5lIFNFVFogc3RhdGUtPlpGbGFnID0gMQotI2RlZmluZSBDTEVBUlogc3RhdGUtPlpGbGFnID0gMAotI2RlZmluZSBBU1NJR05aKHJlcykgc3RhdGUtPlpGbGFnID0gcmVzCi0KLSNkZWZpbmUgQ0ZMQUcgc3RhdGUtPkNGbGFnCi0jZGVmaW5lIFNFVEMgc3RhdGUtPkNGbGFnID0gMQotI2RlZmluZSBDTEVBUkMgc3RhdGUtPkNGbGFnID0gMAotI2RlZmluZSBBU1NJR05DKHJlcykgc3RhdGUtPkNGbGFnID0gcmVzCi0KLSNkZWZpbmUgVkZMQUcgc3RhdGUtPlZGbGFnCi0jZGVmaW5lIFNFVFYgc3RhdGUtPlZGbGFnID0gMQotI2RlZmluZSBDTEVBUlYgc3RhdGUtPlZGbGFnID0gMAotI2RlZmluZSBBU1NJR05WKHJlcykgc3RhdGUtPlZGbGFnID0gcmVzCi0KLQotI2RlZmluZSBJRkxBRyAoc3RhdGUtPklGRmxhZ3MgPj4gMSkKLSNkZWZpbmUgRkZMQUcgKHN0YXRlLT5JRkZsYWdzICYgMSkKLSNkZWZpbmUgSUZGTEFHUyBzdGF0ZS0+SUZGbGFncwotI2RlZmluZSBBU1NJR05JTlQocmVzKSBzdGF0ZS0+SUZGbGFncyA9ICgoKHJlcykgPj4gNikgJiAzKQotI2RlZmluZSBBU1NJR05SMTVJTlQocmVzKSBzdGF0ZS0+SUZGbGFncyA9ICgoKHJlcykgPj4gMjYpICYgMykgOwotCi0jZGVmaW5lIENDQklUUyAoMHhmMDAwMDAwMEwpCi0jZGVmaW5lIElOVEJJVFMgKDB4YzBMKQotCi0jaWYgZGVmaW5lZCBNT0RFVCAmJiBkZWZpbmVkIE1PREUzMgotI2RlZmluZSBQQ0JJVFMgKDB4ZmZmZmZmZmZMKQotI2Vsc2UKLSNkZWZpbmUgUENCSVRTICgweGZmZmZmZmZjTCkKLSNlbmRpZgotCi0jZGVmaW5lIE1PREVCSVRTICgweDFmTCkKLSNkZWZpbmUgUjE1SU5UQklUUyAoM0wgPDwgMjYpCi0KLSNpZiBkZWZpbmVkIE1PREVUICYmIGRlZmluZWQgTU9ERTMyCi0jZGVmaW5lIFIxNVBDQklUUyAoMHgwM2ZmZmZmZkwpCi0jZWxzZQotI2RlZmluZSBSMTVQQ0JJVFMgKDB4MDNmZmZmZmNMKQotI2VuZGlmCi0KLSNkZWZpbmUgUjE1UENNT0RFQklUUyAoMHgwM2ZmZmZmZkwpCi0jZGVmaW5lIFIxNU1PREVCSVRTICgweDNMKQotCi0jaWZkZWYgTU9ERTMyCi0jZGVmaW5lIFBDTUFTSyBQQ0JJVFMKLSNkZWZpbmUgUENXUkFQKHBjKSAocGMpCi0jZWxzZQotI2RlZmluZSBQQ01BU0sgUjE1UENCSVRTCi0jZGVmaW5lIFBDV1JBUChwYykgKChwYykgJiBSMTVQQ0JJVFMpCi0jZW5kaWYKLQotI2RlZmluZSBQQyAoc3RhdGUtPlJlZ1sxNV0gJiBQQ01BU0spCi0jZGVmaW5lIFIxNUNDSU5UTU9ERSAoc3RhdGUtPlJlZ1sxNV0gJiAoQ0NCSVRTIHwgUjE1SU5UQklUUyB8IFIxNU1PREVCSVRTKSkKLSNkZWZpbmUgUjE1SU5UIChzdGF0ZS0+UmVnWzE1XSAmIFIxNUlOVEJJVFMpCi0jZGVmaW5lIFIxNUlOVFBDIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1UENCSVRTKSkKLSNkZWZpbmUgUjE1SU5UUENNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1UENCSVRTIHwgUjE1TU9ERUJJVFMpKQotI2RlZmluZSBSMTVJTlRNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1TU9ERUJJVFMpKQotI2RlZmluZSBSMTVQQyAoc3RhdGUtPlJlZ1sxNV0gJiBSMTVQQ0JJVFMpCi0jZGVmaW5lIFIxNVBDTU9ERSAoc3RhdGUtPlJlZ1sxNV0gJiAoUjE1UENCSVRTIHwgUjE1TU9ERUJJVFMpKQotI2RlZmluZSBSMTVNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIFIxNU1PREVCSVRTKQotCi0jZGVmaW5lIEVDQyAoKE5GTEFHIDw8IDMxKSB8IChaRkxBRyA8PCAzMCkgfCAoQ0ZMQUcgPDwgMjkpIHwgKFZGTEFHIDw8IDI4KSkKLSNkZWZpbmUgRUlOVCAoSUZGTEFHUyA8PCA2KQotI2RlZmluZSBFUjE1SU5UIChJRkZMQUdTIDw8IDI2KQotI2RlZmluZSBFTU9ERSAoc3RhdGUtPk1vZGUpCi0KLSNpZmRlZiBNT0RFVAotI2RlZmluZSBDUFNSIChFQ0MgfCBFSU5UIHwgRU1PREUgfCAoVEZMQUcgPDwgNSkpCi0jZWxzZQotI2RlZmluZSBDUFNSIChFQ0MgfCBFSU5UIHwgRU1PREUpCi0jZW5kaWYKLQotI2lmZGVmIE1PREUzMgotI2RlZmluZSBQQVRDSFIxNQotI2Vsc2UKLSNkZWZpbmUgUEFUQ0hSMTUgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgfCBSMTVQQwotI2VuZGlmCi0KLSNkZWZpbmUgR0VUU1BTUihiYW5rKSBiYW5rPjA/c3RhdGUtPlNwc3JbYmFua106RUNDIHwgRUlOVCB8IEVNT0RFIDsKLSNkZWZpbmUgU0VUUFNSKGQscykgZCA9IChzKSAmIChBUk13b3JkKShDQ0JJVFMgfCBJTlRCSVRTIHwgTU9ERUJJVFMpCi0jZGVmaW5lIFNFVElOVE1PREUoZCxzKSBkID0gKChkKSAmIENDQklUUykgfCAoKHMpICYgKElOVEJJVFMgfCBNT0RFQklUUykpCi0jZGVmaW5lIFNFVENDKGQscykgZCA9ICgoZCkgJiAoSU5UQklUUyB8IE1PREVCSVRTKSkgfCAoKHMpICYgQ0NCSVRTKQotI2RlZmluZSBTRVRSMTVQU1IocykgaWYgKHN0YXRlLT5Nb2RlID09IFVTRVIyNk1PREUpIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1sxNV0gPSAoKHMpICYgQ0NCSVRTKSB8IFIxNVBDIHwgRVIxNUlOVCB8IEVNT0RFIDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgQVNTSUdOTigoc3RhdGUtPlJlZ1sxNV0gJiBOQklUKSAhPSAwKSA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTU0lHTlooKHN0YXRlLT5SZWdbMTVdICYgWkJJVCkgIT0gMCkgOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKChzdGF0ZS0+UmVnWzE1XSAmIENCSVQpICE9IDApIDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgQVNTSUdOVigoc3RhdGUtPlJlZ1sxNV0gJiBWQklUKSAhPSAwKSA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gUjE1UEMgfCAoKHMpICYgKENDQklUUyB8IFIxNUlOVEJJVFMgfCBSMTVNT0RFQklUUykpIDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfUjE1QWx0ZXJlZCAoc3RhdGUpIDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2RlZmluZSBTRVRBQk9SVChpLG0pIHN0YXRlLT5DcHNyID0gRUNDIHwgRUlOVCB8IChpKSB8IChtKQotCi0jaWZuZGVmIE1PREUzMgotI2RlZmluZSBWRUNUT1JTIDB4MjAKLSNkZWZpbmUgTEVHQUxBRERSIDB4MDNmZmZmZmYKLSNkZWZpbmUgVkVDVE9SQUNDRVNTKGFkZHJlc3MpIChhZGRyZXNzIDwgVkVDVE9SUyAmJiBBUk11bF9NT0RFMjZCSVQgJiYgc3RhdGUtPnByb2czMlNpZykKLSNkZWZpbmUgQUREUkVYQ0VQVChhZGRyZXNzKSAoYWRkcmVzcyA+IExFR0FMQUREUiAmJiAhc3RhdGUtPmRhdGEzMlNpZykKLSNlbmRpZgotCi0jZGVmaW5lIElOVEVSTkFMQUJPUlQoYWRkcmVzcykgaWYgKGFkZHJlc3MgPCBWRUNUT1JTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkFib3J0ZWQgPSBBUk11bF9EYXRhQWJvcnRWIDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfQWRkckV4Y2VwdG5WIDsKLQotI2lmZGVmIE1PREUzMgotI2RlZmluZSBUQUtFQUJPUlQgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfRGF0YUFib3J0VikKLSNlbHNlCi0jZGVmaW5lIFRBS0VBQk9SVCBpZiAoc3RhdGUtPkFib3J0ZWQgPT0gQVJNdWxfQWRkckV4Y2VwdG5WKSBcCi0gICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9BZGRyRXhjZXB0blYpIDsgXAotICAgICAgICAgICAgICAgICAgZWxzZSBcCi0gICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9EYXRhQWJvcnRWKQotI2VuZGlmCi0jZGVmaW5lIENQVEFLRUFCT1JUIGlmICghc3RhdGUtPkFib3J0ZWQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfVW5kZWZpbmVkSW5zdHJWKSA7IFwKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPkFib3J0ZWQgPT0gQVJNdWxfQWRkckV4Y2VwdG5WKSBcCi0gICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX0FkZHJFeGNlcHRuVikgOyBcCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9EYXRhQWJvcnRWKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgRGlmZmVyZW50IHdheXMgdG8gc3RhcnQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBTRVEgMAotI2RlZmluZSBOT05TRVEgMQotI2RlZmluZSBQQ0lOQ0VEU0VRIDIKLSNkZWZpbmUgUENJTkNFRE5PTlNFUSAzCi0jZGVmaW5lIFBSSU1FUElQRSA0Ci0jZGVmaW5lIFJFU1VNRSA4Ci0KLSNkZWZpbmUgTk9STUFMQ1lDTEUgc3RhdGUtPk5leHRJbnN0ciA9IDAKLSNkZWZpbmUgQlVTVVNFRE4gc3RhdGUtPk5leHRJbnN0ciB8PSAxCS8qIHRoZSBuZXh0IGZldGNoIHdpbGwgYmUgYW4gTiBjeWNsZSAqLwotI2RlZmluZSBCVVNVU0VESU5DUENTIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplIDsgLyogYSBzdGFuZGFyZCBQQyBpbmMgYW5kIGFuIFMgY3ljbGUgKi8gXAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5OZXh0SW5zdHIgPSAoc3RhdGUtPk5leHRJbnN0ciAmIDB4ZmYpIHwgMgotI2RlZmluZSBCVVNVU0VESU5DUENOIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplIDsgLyogYSBzdGFuZGFyZCBQQyBpbmMgYW5kIGFuIE4gY3ljbGUgKi8gXAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5OZXh0SW5zdHIgfD0gMwotI2RlZmluZSBJTkNQQyBzdGF0ZS0+UmVnWzE1XSArPSBpc2l6ZSA7IC8qIGEgc3RhbmRhcmQgUEMgaW5jICovIFwKLSAgICAgICAgICAgICAgc3RhdGUtPk5leHRJbnN0ciB8PSAyCi0jZGVmaW5lIEZMVVNIUElQRSBzdGF0ZS0+TmV4dEluc3RyIHw9IFBSSU1FUElQRQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ljbGUgYmFzZWQgZW11bGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgT1VUUFVUQ1AoaSxhLGIpCi0jZGVmaW5lIE5DWUNMRQotI2RlZmluZSBTQ1lDTEUKLSNkZWZpbmUgSUNZQ0xFCi0jZGVmaW5lIENDWUNMRQotI2RlZmluZSBORVhUQ1lDTEUoYykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgIFN0YXRlcyBvZiB0aGUgY3ljbGUgYmFzZWQgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICBNYWNyb3MgdG8gZXh0cmFjdCBwYXJ0cyBvZiBpbnN0cnVjdGlvbnMgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBERVNUUmVnIChCSVRTKDEyLDE1KSkKLSNkZWZpbmUgTEhTUmVnIChCSVRTKDE2LDE5KSkKLSNkZWZpbmUgUkhTUmVnIChCSVRTKDAsMykpCi0KLSNkZWZpbmUgREVTVCAoc3RhdGUtPlJlZ1tERVNUUmVnXSkKLQotI2lmZGVmIE1PREUzMgotI2lmZGVmIE1PREVUCi0jZGVmaW5lIExIUyAoKExIU1JlZyA9PSAxNSkgPyAoc3RhdGUtPlJlZ1sxNV0gJiAweEZGRkZGRkZDKTogKHN0YXRlLT5SZWdbTEhTUmVnXSkpCi0jZWxzZQotI2RlZmluZSBMSFMgKHN0YXRlLT5SZWdbTEhTUmVnXSkKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTEhTICgoTEhTUmVnID09IDE1KSA/IFIxNVBDIDogKHN0YXRlLT5SZWdbTEhTUmVnXSkgKQotI2VuZGlmCi0KLSNkZWZpbmUgTVVMREVTVFJlZyAoQklUUygxNiwxOSkpCi0jZGVmaW5lIE1VTExIU1JlZyAoQklUUygwLDMpKQotI2RlZmluZSBNVUxSSFNSZWcgKEJJVFMoOCwxMSkpCi0jZGVmaW5lIE1VTEFDQ1JlZyAoQklUUygxMiwxNSkpCi0KLSNkZWZpbmUgRFBJbW1SSFMgKEFSTXVsX0ltbWVkVGFibGVbQklUUygwLDExKV0pCi0jZGVmaW5lIERQU0ltbVJIUyB0ZW1wID0gQklUUygwLDExKSA7IFwKLSAgICAgICAgICAgICAgICAgIHJocyA9IEFSTXVsX0ltbWVkVGFibGVbdGVtcF0gOyBcCi0gICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IDI1NSkgLyogdGhlcmUgd2FzIGEgc2hpZnQgKi8gXAotICAgICAgICAgICAgICAgICAgICAgQVNTSUdOQyhyaHMgPj4gMzEpIDsKLQotI2lmZGVmIE1PREUzMgotI2RlZmluZSBEUFJlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldERQUmVnUkhTKHN0YXRlLCBpbnN0cikpCi0jZGVmaW5lIERQU1JlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXREUFNSZWdSSFMoc3RhdGUsIGluc3RyKSkKLSNlbHNlCi0jZGVmaW5lIERQUmVnUkhTICgoQklUUygwLDExKTwxNSkgPyBzdGF0ZS0+UmVnW1JIU1JlZ10gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2V0RFBSZWdSSFMoc3RhdGUsIGluc3RyKSkKLSNkZWZpbmUgRFBTUmVnUkhTICgoQklUUygwLDExKTwxNSkgPyBzdGF0ZS0+UmVnW1JIU1JlZ10gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldERQU1JlZ1JIUyhzdGF0ZSwgaW5zdHIpKQotI2VuZGlmCi0KLSNkZWZpbmUgTFNCYXNlIHN0YXRlLT5SZWdbTEhTUmVnXQotI2RlZmluZSBMU0ltbVJIUyAoQklUUygwLDExKSkKLQotI2lmZGVmIE1PREUzMgotI2RlZmluZSBMU1JlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldExTUmVnUkhTKHN0YXRlLCBpbnN0cikpCi0jZWxzZQotI2RlZmluZSBMU1JlZ1JIUyAoKEJJVFMoMCwxMSk8MTUpID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldExTUmVnUkhTKHN0YXRlLCBpbnN0cikpCi0jZW5kaWYKLQotI2RlZmluZSBMU01OdW1SZWdzICgoQVJNd29yZClBUk11bF9CaXRMaXN0W0JJVFMoMCw3KV0gKyBcCi0gICAgICAgICAgICAgICAgICAgIChBUk13b3JkKUFSTXVsX0JpdExpc3RbQklUUyg4LDE1KV0gKQotI2RlZmluZSBMU01CYXNlRmlyc3QgKChMSFNSZWcgPT0gMCAmJiBCSVQoMCkpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAoQklUKExIU1JlZykgJiYgQklUUygwLExIU1JlZy0xKSA9PSAwKSkKLQotI2RlZmluZSBTV0FQU1JDIChzdGF0ZS0+UmVnW1JIU1JlZ10pCi0KLSNkZWZpbmUgTFNDT2ZmIChCSVRTKDAsNykgPDwgMikKLSNkZWZpbmUgQ1BOdW0gQklUUyg4LDExKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgTWFjcm8gdG8gcm90YXRlIG4gcmlnaHQgYnkgYiBiaXRzICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUk9UQVRFUihuLGIpICgoKG4pPj4oYikpfCgobik8PCgzMi0oYikpKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgIE1hY3JvcyB0byBzdG9yZSByZXN1bHRzIG9mIGluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFdSSVRFREVTVChkKSBpZiAoREVTVFJlZz09MTUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlUjE1KHN0YXRlLCBkKSA7IFwKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUID0gZAotCi0jZGVmaW5lIFdSSVRFU0RFU1QoZCkgaWYgKERFU1RSZWcgPT0gMTUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVNSMTUoc3RhdGUsIGQpIDsgXAotICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgREVTVCA9IGQgOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSwgZCkgOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZGVmaW5lIEJZVEVUT0JVUyhkYXRhKSAoKGRhdGEgJiAweGZmKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoZGF0YSAmIDB4ZmYpIDw8IDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgKChkYXRhICYgMHhmZikgPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgKChkYXRhICYgMHhmZikgPDwgMjQpKQotI2RlZmluZSBCVVNUT0JZVEUoYWRkcmVzcyxkYXRhKSBcCi0gICAgICAgICAgIGlmIChzdGF0ZS0+YmlnZW5kU2lnKSBcCi0gICAgICAgICAgICAgIHRlbXAgPSAoZGF0YSA+PiAoKChhZGRyZXNzIF4gMykgJiAzKSA8PCAzKSkgJiAweGZmIDsgXAotICAgICAgICAgICBlbHNlIFwKLSAgICAgICAgICAgICAgdGVtcCA9IChkYXRhID4+ICgoYWRkcmVzcyAmIDMpIDw8IDMpKSAmIDB4ZmYKLQotI2RlZmluZSBMT0FETVVMVChpbnN0cixhZGRyZXNzLHdiKSBMb2FkTXVsdChzdGF0ZSxpbnN0cixhZGRyZXNzLHdiKQotI2RlZmluZSBMT0FEU01VTFQoaW5zdHIsYWRkcmVzcyx3YikgTG9hZFNNdWx0KHN0YXRlLGluc3RyLGFkZHJlc3Msd2IpCi0jZGVmaW5lIFNUT1JFTVVMVChpbnN0cixhZGRyZXNzLHdiKSBTdG9yZU11bHQoc3RhdGUsaW5zdHIsYWRkcmVzcyx3YikKLSNkZWZpbmUgU1RPUkVTTVVMVChpbnN0cixhZGRyZXNzLHdiKSBTdG9yZVNNdWx0KHN0YXRlLGluc3RyLGFkZHJlc3Msd2IpCi0KLSNkZWZpbmUgUE9TQlJBTkNIICgoaW5zdHIgJiAweDdmZmZmZikgPDwgMikKLSNkZWZpbmUgTkVHQlJBTkNIICgweGZmMDAwMDAwIHwgKChpbnN0ciAmIDB4ZmZmZmZmKSA8PCAyKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBmb3IgRW11bGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNUT1AgICAgICAgICAgICAwCS8qIHN0b3AgKi8KLSNkZWZpbmUgQ0hBTkdFTU9ERSAgICAgIDEJLyogY2hhbmdlIG1vZGUgKi8KLSNkZWZpbmUgT05DRSAgICAgICAgICAgIDIJLyogZXhlY3V0ZSBqdXN0IG9uZSBpbnRlcmF0aW9uICovCi0jZGVmaW5lIFJVTiAgICAgICAgICAgICAzCS8qIGNvbnRpbnVvdXMgZXhlY3V0aW9uICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgIFN0dWZmIHRoYXQgaXMgc2hhcmVkIGFjcm9zcyBtb2RlcyAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfRW11bGF0ZTI2IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0VtdWxhdGUzMiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdW5zaWduZWQgQVJNdWxfTXVsdFRhYmxlW107CS8qIE51bWJlciBvZiBJIGN5Y2xlcyBmb3IgYSBtdWx0ICovCi1leHRlcm4gQVJNd29yZCBBUk11bF9JbW1lZFRhYmxlW107CS8qIGltbWVkaWF0ZSBEUCBMSFMgdmFsdWVzICovCi1leHRlcm4gY2hhciBBUk11bF9CaXRMaXN0W107CS8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSB0YWJsZSAqLwotZXh0ZXJuIHZvaWQgQVJNdWxfQWJvcnQyNiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCk7Ci1leHRlcm4gdm9pZCBBUk11bF9BYm9ydDMyIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkKTsKLWV4dGVybiB1bnNpZ25lZCBBUk11bF9OdGhSZWcgKEFSTXdvcmQgaW5zdHIsIHVuc2lnbmVkIG51bWJlcik7Ci1leHRlcm4gdm9pZCBBUk11bF9NU1JDcHNyIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHJocyk7Ci1leHRlcm4gdm9pZCBBUk11bF9OZWdaZXJvIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHJlc3VsdCk7Ci1leHRlcm4gdm9pZCBBUk11bF9BZGRDYXJyeSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsCi0JCQkgICAgQVJNd29yZCByZXN1bHQpOwotZXh0ZXJuIGludCBBZGRPdmVyZmxvdyAoQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KTsKLWV4dGVybiBpbnQgU3ViT3ZlcmZsb3cgKEFSTXdvcmQgYSwgQVJNd29yZCBiLCBBUk13b3JkIHJlc3VsdCk7Ci1leHRlcm4gdm9pZCBBUk11bF9BZGRPdmVyZmxvdyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsCi0JCQkgICAgICAgQVJNd29yZCByZXN1bHQpOwotZXh0ZXJuIHZvaWQgQVJNdWxfU3ViQ2FycnkgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYSwgQVJNd29yZCBiLAotCQkJICAgIEFSTXdvcmQgcmVzdWx0KTsKLWV4dGVybiB2b2lkIEFSTXVsX1N1Yk92ZXJmbG93IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwKLQkJCSAgICAgICBBUk13b3JkIHJlc3VsdCk7Ci1leHRlcm4gdm9pZCBBUk11bF9DUFNSQWx0ZXJlZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9SMTVBbHRlcmVkIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX1N3aXRjaE1vZGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgb2xkbW9kZSwKLQkJCQkgQVJNd29yZCBuZXdtb2RlKTsKLWV4dGVybiB1bnNpZ25lZCBBUk11bF9OdGhSZWcgKEFSTXdvcmQgaW5zdHIsIHVuc2lnbmVkIG51bWJlcik7Ci1leHRlcm4gdm9pZCBBUk11bF9MREMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcyk7Ci1leHRlcm4gdm9pZCBBUk11bF9TVEMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcyk7Ci1leHRlcm4gdm9pZCBBUk11bF9NQ1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgc291cmNlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX01SQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0cik7Ci1leHRlcm4gdm9pZCBBUk11bF9DRFAgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpOwotZXh0ZXJuIHVuc2lnbmVkIEludFBlbmRpbmcgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfQWxpZ24gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywKLQkJCSAgICBBUk13b3JkIGRhdGEpOwotI2RlZmluZSBFVkVOVExJU1RTSVpFIDEwMjRMCi0KLS8qIFRodW1iIHN1cHBvcnQ6ICovCi0KLXR5cGVkZWYgZW51bQotewotICB0X3VuZGVmaW5lZCwJCQkvKiB1bmRlZmluZWQgVGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLSAgdF9kZWNvZGVkLAkJCS8qIGluc3RydWN0aW9uIGRlY29kZWQgdG8gQVJNIGVxdWl2YWxlbnQgKi8KLSAgdF9icmFuY2gJCQkvKiBUaHVtYiBicmFuY2ggKGFscmVhZHkgcHJvY2Vzc2VkKSAqLwotfQotdGRzdGF0ZTsKLQotZXh0ZXJuIHRkc3RhdGUgQVJNdWxfVGh1bWJEZWNvZGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgcGMsCi0JCQkJICBBUk13b3JkIHRpbnN0ciwgQVJNd29yZCAqIGFpbnN0cik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgIE1hY3JvcyB0byBzY3J1dGluaXplIGluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIFVOREVGX1Rlc3QKLSNkZWZpbmUgVU5ERUZfU2hpZnQKLSNkZWZpbmUgVU5ERUZfTVNSUEMKLSNkZWZpbmUgVU5ERUZfTVJTUEMKLSNkZWZpbmUgVU5ERUZfTVVMUENEZXN0Ci0jZGVmaW5lIFVOREVGX01VTERlc3RFUU9wMQotI2RlZmluZSBVTkRFRl9MU1JCUEMKLSNkZWZpbmUgVU5ERUZfTFNSQmFzZUVRT2ZmV2IKLSNkZWZpbmUgVU5ERUZfTFNSQmFzZUVRRGVzdFdiCi0jZGVmaW5lIFVOREVGX0xTUlBDQmFzZVdiCi0jZGVmaW5lIFVOREVGX0xTUlBDT2ZmV2IKLSNkZWZpbmUgVU5ERUZfTFNNTm9SZWdzCi0jZGVmaW5lIFVOREVGX0xTTVBDQmFzZQotI2RlZmluZSBVTkRFRl9MU01Vc2VyQmFua1diCi0jZGVmaW5lIFVOREVGX0xTTUJhc2VJbkxpc3RXYgotI2RlZmluZSBVTkRFRl9TV1BQQwotI2RlZmluZSBVTkRFRl9Db1Byb0hTCi0jZGVmaW5lIFVOREVGX01DUlBDCi0jZGVmaW5lIFVOREVGX0xTQ1BDQmFzZVdiCi0jZGVmaW5lIFVOREVGX1VuZGVmTm90Qm91bmNlZAotI2RlZmluZSBVTkRFRl9TaG9ydEludAotI2RlZmluZSBVTkRFRl9JbGxlZ2FsTW9kZQotI2RlZmluZSBVTkRFRl9Qcm9nMzJTaWdDaGFuZ2UKLSNkZWZpbmUgVU5ERUZfRGF0YTMyU2lnQ2hhbmdlCmRpZmYgLS1naXQgYS9zaW0vYXJtL2FybWZwZS5oIGIvc2ltL2FybS9hcm1mcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5MzA5Ni4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2FybWZwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1MiArMCwwIEBACi0vKiAgYXJtZnBlLmggLS0gQVJNdWxhdG9yIHByZS1jb21waWxlZCBGUEU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIEFycmF5IGNvbnRhaW5pbmcgdGhlIEZsb2F0aW5nIFBvaW50IEVtdWFsdG9yIChGUEUpLiAqLwotCi0KLXVuc2lnbmVkIGxvbmcgZnBlY29kZVtdID0gewotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDcwMDAwLCAweDAwMDAwMDAwLCAweGU5MmQ0MDBlLCAweGViMDAxM2VmLAotICAweGUyOGYwMGQ0LCAweGUxYTAwMTIwLCAweGUzODAwNGVhLCAweGUzYTAxMDA0LAotICAweGU1OTEyMDAwLCAweGUyNGYzMDI4LCAweGUxNTAwMDAyLCAweDE1ODMyMDAwLAotICAweDE1ODEwMDAwLCAweGUzYTAwMDAxLCAweGU4YmQ4MDBlLCAweGUyOGQ5MDQwLAotICAweGUxYTBhMDBlLCAweGUyNGY3MDQ4LCAweGU1OTdiMDAwLCAweGUyMGI3NGVlLAotICAweGUxNGY4MDAwLCAweGUyMDg4MDQwLCAweGUzODg4MDliLCAweGUxMjFmMDA4LAotICAweGUzNTcwNGVhLCAweDAwNGJiMDA3LCAweDAxYTBiMTBiLCAweDAyOGJmMDBjLAotICAweGUyMGI3MzNiLCAweGUzNTcwMzM5LCAweDAxYTBiYTBiLCAweDAxYTBiYTJiLAotICAweDA1OWJiMDBjLCAweDAyNDk4MDBjLCAweDA4ODgwZTAwLCAweDA5MTlmZjgwLAotICAweGUyNGY3MDk0LCAweGUxYTBmMDA3LCAweGUxNGY4MDAwLCAweGUyMDg4MDQwLAotICAweGUzODg4MDkzLCAweGUxMjFmMDA4LCAweGU4ZGQ3ZmZmLCAweGUxYTAwMDAwLAotICAweGUyOGRkMDNjLCAweGU4ZmQ4MDAwLCAweGUxNGY4MDAwLCAweGUyMDg4MDQwLAotICAweGUzODg4MDkzLCAweGUxMjFmMDA4LCAweGU4YmQxZmZmLCAweGUyOGRkMDBjLAotICAweGUxYjBmMDBlLCAweGUxNGY4MDAwLCAweGUyMDg4MDQwLCAweGUzODg4MDkzLAotICAweGUxMjFmMDA4LCAweGUyOGRkMDFjLCAweGU4YmQxZjgwLCAweGUyOGRkMDBjLAotICAweGUxYjBmMDBlLCAweDAwMDAyMTAwLCAweGU5MGQ0MDA3LCAweGUxNGYwMDAwLAotICAweGUyNGQxMDEwLCAweGUxMGYyMDAwLCAweGUyMDIyMGMwLCAweGUzODIyMDAzLAotICAweGUxMjFmMDAyLCAweGUxNjlmMDAwLCAweGU4OTE0MDA3LCAweGUyNGRkMDQwLAotICAweGU4Y2Q3ZmZmLCAweGUyNGZjZjZiLCAweGU1OGRlMDNjLCAweGUyNGVhMDA0LAotICAweGUxNGY5MDAwLCAweGUyMDk5MGMwLCAweGUzODk5MDAzLCAweGUxMjFmMDA5LAotICAweGU0YmE5MDA4LCAweGUyMDk4N2ZlLCAweGUyMTk3MDEwLCAweGUwMDc3YWE5LAotICAweGUwMjg4YTA3LCAweDAyMDk3NDAyLCAweDAwMDc3NTA5LCAweDAwODg4MDA3LAotICAweGUyMDk3YzBmLCAweGUzMzcwYzAxLCAweDAyMDk3MzNlLCAweDAzMzcwMzNhLAotICAweDAwOGZmOGE4LCAweGVhMDAwMDlmLCAweGVhMDAwM2I3LCAweGVhMDAwM2I2LAotICAweGVhMDAwMzA3LCAweGVhMDAwMzA2LCAweGVhMDAwM2IzLCAweGVhMDAwM2IyLAotICAweGVhMDAwMzAzLCAweGVhMDAwMzAyLCAweGVhMDAwM2MzLCAweGVhMDAwM2MyLAotICAweGVhMDAwMzBkLCAweGVhMDAwMzBjLCAweGVhMDAwM2JmLCAweGVhMDAwM2JlLAotICAweGVhMDAwMzA5LCAweGVhMDAwMzA4LCAweGVhMDAwM2NmLCAweGVhMDAwM2NlLAotICAweGVhMDAwMzE0LCAweGVhMDAwMzEzLCAweGVhMDAwM2NiLCAweGVhMDAwM2NhLAotICAweGVhMDAwMzEwLCAweGVhMDAwMzBmLCAweGVhMDAwM2RiLCAweGVhMDAwM2RhLAotICAweGVhMDAwMzFhLCAweGVhMDAwMzE5LCAweGVhMDAwM2Q3LCAweGVhMDAwM2Q2LAotICAweGVhMDAwMzE2LCAweGVhMDAwMzE1LCAweGVhMDAwM2U3LCAweGVhMDAwM2U2LAotICAweGVhMDAwMzIxLCAweGVhMDAwMzIwLCAweGVhMDAwM2Y3LCAweGVhMDAwM2Y2LAotICAweGVhMDAwMzJiLCAweGVhMDAwMzJhLCAweGVhMDAwNDQ5LCAweGVhMDAwNDQ4LAotICAweGVhMDAwMzM1LCAweGVhMDAwMzM0LCAweGVhMDAwNDU5LCAweGVhMDAwNDU4LAotICAweGVhMDAwMzQwLCAweGVhMDAwMzNmLCAweGVhMDAwNDY5LCAweGVhMDAwNDY4LAotICAweGVhMDAwMzRiLCAweGVhMDAwMzRhLCAweGVhMDAwNDc5LCAweGVhMDAwNDc4LAotICAweGVhMDAwMzU1LCAweGVhMDAwMzU0LCAweGVhMDAwNDg5LCAweGVhMDAwNDg4LAotICAweGVhMDAwMzVmLCAweGVhMDAwMzVlLCAweGVhMDAwNDk5LCAweGVhMDAwNDk4LAotICAweGVhMDAwMzZhLCAweGVhMDAwMzY5LCAweGVhMDAwYWM4LCAweGVhMDAwYWM1LAotICAweGVhMDAwYzNkLCAweGVhMDAwYzNhLCAweGVhMDAwYjdiLCAweGVhMDAwYjc4LAotICAweGVhMDAwYjc5LCAweGVhMDAwYjc2LCAweGVhMDAwZDM0LCAweGVhMDAwZDMxLAotICAweGVhMDAwZDA4LCAweGVhMDAwZDA1LCAweGVhMDAwZTM0LCAweGVhMDAwZTMxLAotICAweGVhMDAwZTFjLCAweGVhMDAwZTE5LCAweGVhMDAwZWNmLCAweGVhMDAwZWNjLAotICAweGVhMDAwYzJkLCAweGVhMDAwYzJhLCAweGVhMDAwZDI4LCAweGVhMDAwZDI1LAotICAweGVhMDAwY2ZjLCAweGVhMDAwY2Y5LCAweGVhMDAxMjNkLCAweGVhMDAxMjNhLAotICAweGVhZmZmZjU1LCAweGVhZmZmZjU0LCAweGVhZmZmZjUzLCAweGVhZmZmZjUyLAotICAweGVhZmZmZjUxLCAweGVhZmZmZjUwLCAweGVhMDAwN2I4LCAweGVhMDAwN2VjLAotICAweGVhMDAwNzNjLCAweGVhMDAwNzNiLCAweGVhMDAwODA2LCAweGVhMDAwODA1LAotICAweGVhMDAwODBmLCAweGVhMDAwODBlLCAweGVhZmZmZjQ3LCAweGVhZmZmZjQ2LAotICAweGVhZmZmZjQ1LCAweGVhZmZmZjQ0LCAweGVhZmZmZjQzLCAweGVhZmZmZjQyLAotICAweGVhZmZmZjQxLCAweGVhZmZmZjQwLCAweGVhZmZmZjNmLCAweGVhZmZmZjNlLAotICAweGVhMDAwODZmLCAweGVhMDAwODZlLCAweGVhZmZmZjNiLCAweGVhZmZmZjNhLAotICAweGVhMDAwODZiLCAweGVhMDAwODZhLCAweGVhZmZmZjM3LCAweGVhZmZmZjM2LAotICAweGVhMDAwN2ZmLCAweGVhMDAwN2ZlLCAweGVhZmZmZjMzLCAweGVhZmZmZjMyLAotICAweGVhMDAwN2ZiLCAweGVhMDAwN2ZhLCAweGVhMDAwOTE0LCAweGVhMDAwOGYzLAotICAweGVhMDAwOTFmLCAweGVhMDAwOGZiLCAweGVhMDAwOTJiLCAweGVhMDAwOTA0LAotICAweGVhMDAwOWRjLCAweGVhMDAwOWQ5LCAweGVhMDAwOWZkLCAweGVhMDAwOWZhLAotICAweGVhMDAwZWY4LCAweGVhMDAwZWY1LCAweGVhMDAwZWY2LCAweGVhMDAwZWYzLAotICAweGVhMDAwZjlkLCAweGVhMDAwZjlhLCAweGVhMDAxMTFlLCAweGVhMDAxMTFiLAotICAweGVhMDAxMTFjLCAweGVhMDAxMTE5LCAweGVhMDAxMDRlLCAweGVhMDAxMDRiLAotICAweGVhMDAxMTQ3LCAweGVhMDAxMTQ0LCAweGVhMDAxMTQ1LCAweGVhMDAxMTQyLAotICAweGVhMDAxMjVhLCAweGVhMDAxMjU3LCAweGVhZmZmZjEzLCAweGVhZmZmZjEyLAotICAweGVhZmZmZjExLCAweGVhZmZmZjEwLCAweGUzMTkwYzBlLCAweDFhZmZmZjBlLAotICAweGUzMTkwYzAxLCAweDEzMTkwMzAyLCAweDBhZmZmZjBiLCAweGUyOGZiMDE2LAotICAweGU3OWI3ZDI3LCAweGUxNGZiMDAwLCAweGUxYTBiZTJiLCAweGUyOGJiMDEwLAotICAweGUxMTcwYjM3LCAweDBhZmZmZjUxLCAweGVhZmZmZjI5LCAweDgwMDBmMGYwLAotICAweDgwMDAwZjBmLCAweDgwMDBjY2NjLCAweDgwMDAzMzMzLCAweDgwMDBmZjAwLAotICAweDgwMDAwMGZmLCAweDgwMDBhYWFhLCAweDgwMDA1NTU1LCAweDgwMDBjZmNmLAotICAweDgwMDAzMDMwLCAweDgwMDA1NWFhLCAweDgwMDBhYTU1LCAweDgwMDA1ZmFmLAotICAweDgwMDBhMDUwLCAweDgwMDAwMDAwLCAweDgwMDBmZmZmLCAweGUxMzAwMDA3LAotICAweDVhMDAwMDAyLCAweGVhMDAwMDRhLCAweGUzMTAwMTAyLCAweDFhMDAwMDQ4LAotICAweGUwNTM0MDBiLCAweDRhMDAwMDJkLCAweGUyNzQ1MDIwLCAweGRhMDAwMDFiLAotICAweGUwOTIyNDNhLCAweDIwODIyNTE4LCAweDMwOTIyNTE4LCAweGUwYjExNDM4LAotICAweGUxYTA0NTFhLCAweDJhMDAwMDA2LCAweGUwOTIyZmE0LCAweGUyYjExMDAwLAotICAweDMxYjBmMDBlLCAweGUzYTAxMTAyLCAweGUyODMzMDAxLCAweGUxYTA0MGE0LAotICAweGUxYjBmMDBlLCAweGUyODMzMDAxLCAweGUxYTA0MGE0LCAweGUxODQ0ZjgyLAotICAweGUxYTAyMGEyLCAweGUxODIyZjgxLCAweGUxYTAxMDYxLCAweGUwOTIyZmE0LAotICAweGUyYTExMDAwLCAweGUxYjBmMDBlLCAweGUxYTA0NTM4LCAweGUwOTIyZmE0LAotICAweGUyYjExMDAwLCAweDIzYTAxMTAyLCAweDIyODMzMDAxLCAweGUxYjBmMDBlLAotICAweGUyNTQ1MDQwLCAweGFhZmZmZmY3LCAweGUyNDQ0MDIwLCAweGUyNjQ1MDIwLAotICAweGUwOTIyNDM4LCAweGUyYjExMDAwLCAweGUxYTA0NTE4LCAweGUxODQ0NDNhLAotICAweDJhZmZmZmU3LCAweGUwOTIyZmE0LCAweGUyYjExMDAwLCAweDMxYjBmMDBlLAotICAweGUzYTAxMTAyLCAweGUyODMzMDAxLCAweGUxYTA0MGE0LCAweGUxYjBmMDBlLAotICAweGUyNjQ0MDAwLCAweGUxYTAzMDBiLCAweGUxYTA1MDAxLCAweGUxYTAxMDA4LAotICAweGUxYTA4MDA1LCAweGUxYTA1MDAyLCAweGUxYTAyMDBhLCAweGUxYTBhMDA1LAotICAweGUyNzQ1MDIwLCAweGRhZmZmZmU1LCAweGUwOTIyNDNhLCAweDIwODIyNTE4LAotICAweDMwOTIyNTE4LCAweGUwYjExNDM4LCAweGUxYTA0NTFhLCAweDJhZmZmZmQwLAotICAweGUwOTIyZmE0LCAweGUyYjExMDAwLCAweDMxYjBmMDBlLCAweGUzYTAxMTAyLAotICAweGUyODMzMDAxLCAweGUxYTA0MGE0LCAweGUxYjBmMDBlLCAweGUzMTAwMTAyLAotICAweDFhZmZmZmI2LCAweGUwNTM2MDBiLCAweDRhMDAwMDNkLCAweDAxNTEwMDA4LAotICAweDAxNTIwMDBhLCAweDBhMDAwMDRmLCAweDNhMDAwMDM5LCAweGUzYTA0MDAwLAotICAweGUyNzY1MDIwLCAweGRhMDAwMDFhLCAweGUwNTQ0NTFhLCAweGUwZDIyNjNhLAotICAweDMwNDIyNTE4LCAweDIwNTIyNTE4LCAweGUwZDExNjM4LCAweDVhMDAwMDAyLAotICAweGUwOTIyZmE0LCAweGUyYTExMDAwLCAweGUxYjBmMDBlLCAweGUwOTQ0MDA0LAotICAweGUwYjIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZhLAotICAweGUwOTIyZmE0LCAweGUyYjExMDAwLCAweDMxYjBmMDBlLCAweGUzYTAxMTAyLAotICAweGUyODMzMDAxLCAweGUxYTA0MGE0LCAweGUxYjBmMDBlLCAweGUwNTQ0NTM4LAotICAweDQxYjBmMDBlLCAweGUyZDIyMDAwLCAweGUyZDExMDAwLCAweDQxYjBmMDBlLAotICAweGVhZmZmZmVkLCAweGUzYTA0MDAwLCAweGUyNTY1MDQwLCAweGFhZmZmZmY2LAotICAweGUyNDY2MDIwLCAweGUyNjY1MDIwLCAweGUwNTQ3NTFhLCAweGUwZDQ0NjNhLAotICAweDMwNDQ0NTE4LCAweDIwNTQ0NTE4LCAweGUwZDIyNjM4LCAweGUyZDExMDAwLAotICAweDVhMDAwMDAyLCAweGUwOTIyZmE0LCAweGUyYTExMDAwLCAweGUxYjBmMDBlLAotICAweGUwOTc3MDA3LCAweGUwYjQ0MDA0LCAweGUwYjIyMDAyLCAweGUwYjExMDAxLAotICAweGUyNDMzMDAxLCAweDVhZmZmZmY5LCAweGUwOTIyZmE0LCAweGUyYjExMDAwLAotICAweDMxYjBmMDBlLCAweGUzYTAxMTAyLCAweGUyODMzMDAxLCAweGUxYTA0MGE0LAotICAweGUxYjBmMDBlLCAweGUyNjY2MDAwLCAweGUyMjAwMTAyLCAweGUxYTAzMDBiLAotICAweGUxYTA1MDAxLCAweGUxYTAxMDA4LCAweGUxYTA4MDA1LCAweGUxYTA1MDAyLAotICAweGUxYTAyMDBhLCAweGUxYTBhMDA1LCAweGUzYTA0MDAwLCAweGUyNzY1MDIwLAotICAweGRhZmZmZmQ3LCAweGUwNTQ0NTFhLCAweGUwZDIyNjNhLCAweDMwNDIyNTE4LAotICAweDIwNTIyNTE4LCAweGUwZDExNjM4LCAweDVhZmZmZmJmLCAweGUwOTIyZmE0LAotICAweGUyYTExMDAwLCAweGUxYjBmMDBlLCAweGUzYTAzMDAwLCAweGUzYTAyMDAwLAotICAweGUzYTAxMDAwLCAweGUzYTA0MDAwLCAweGUxYjBmMDBlLCAweGUxYTA3MDAwLAotICAweGUxYTA4MDAxLCAweGUxYTBhMDAyLCAweGUxYTBiMDAzLCAweGUwMjAwMDA3LAotICAweGUxOTE0MDAyLCAweDExOTg0MDBhLCAweDBhZmZmZmYyLCAweGUzYjA1NGZmLAotICAweGUwYTMzMDBiLCAweGUxODViNDI1LCAweGUwNDMzOTJiLCAweGU5MmM0MjA5LAotICAweGUxYTA0ODIxLCAweGUxYzE1MDBiLCAweGUxYTA2ODIyLCAweGUxYzI3MDBiLAotICAweGUxYzg5MDBiLCAweGUxYTA4ODI4LCAweGUxY2FiMDBiLCAweGUxYTBhODJhLAotICAweGUwMDMwYjk2LCAweGUwMDIwYjk0LCAweGUwMDEwOTk0LCAweGUwMDAwYTk3LAotICAweGUwOTMzMDAwLCAweGUwMDAwYTk1LCAweGUwYjIyMDAwLCAweGUwMDAwODk1LAotICAweGUwYjExMDAwLCAweDMzYTBlMDAwLCAweDIzYTBlMDAxLCAweGUwMDAwOTk2LAotICAweGUwOTIyMDAwLCAweGUyYjExMDAwLCAweGUyYWVlMDAwLCAweGUwMDAwODk3LAotICAweGUwOTIyMDAwLCAweGUyYjExMDAwLCAweGUyYWVlMDAwLCAweGUxOGVlODAzLAotICAweGUxYTAzODIzLCAweGUxODMzODAyLCAweGUxYTAyODIyLCAweGUxODIyODAxLAotICAweGUxYTAxODIxLCAweGUxODExODBlLCAweGUzY2VlMGZmLCAweGUwMDAwYjk1LAotICAweGUwMGIwYjk3LCAweGUwOWViMDBiLCAweGUwYjMzMDAwLCAweGUwMDAwODk2LAotICAweGUwYjIyMDAwLCAweGUwMDAwODk0LCAweGUwYTExMDAwLCAweGUwMDAwYTk0LAotICAweGUwMGEwYTk2LCAweGUwOWFhMDAzLCAweGUwYjIyMDAwLCAweGUyYTExMDAwLAotICAweGUwMDAwOTk3LCAweGUwOWE0MDAwLCAweGUwMDAwOTk1LCAweGUwYjIyMDAwLAotICAweGUyYjExMDAwLCAweGU4YmM0MjA5LCAweDRhMDAwMDA1LCAweGUwOWJiMDBiLAotICAweGUwYjQ0MDA0LCAweGUwYjIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLAotICAweDVhZmZmZmY5LCAweGUwOTIyZmE0LCAweGUyYjExMDAwLCAweDMxYjBmMDBlLAotICAweGUzYTAxMTAyLCAweGUyODMzMDAxLCAweGUxYTA0MGE0LCAweGUxYjBmMDBlLAotICAweGUxYTA3MDAwLCAweGUxYTA4MDAxLCAweGUxYTBhMDAyLCAweGUxYTBiMDAzLAotICAweGUzYTAwMDAwLCAweGUzYTAxMTAyLCAweGUzYjAyMTAwLCAweGUyZTIzOTAxLAotICAweGUwMjAwMDA3LCAweGUxOTE0MDAyLCAweDExOTg0MDBhLCAweDBhZmZmZjlkLAotICAweGUwNDMzMDBiLCAweGUyODMzOTAxLCAweGUyNDMzMDAxLCAweGUzYTBiMDAwLAotICAweGUwNTI1MDBhLCAweGUwZDE0MDA4LCAweDIzYTAxMDAzLCAweDJhMDAwMDBjLAotICAweGUxYTA1MDAyLCAweGUxYTA0MDAxLCAweGUzYTAxMDAxLCAweGUyNDMzMDAxLAotICAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLAotICAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LAotICAweGUwYTExMDAxLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLAotICAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LAotICAweDIxYTA0MDA2LCAweGUwYTExMDAxLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LAotICAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLAotICAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYTExMDAxLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LAotICAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYjExMDAxLAotICAweDNhZmZmZmRhLCAweGUxOTQyMDA1LCAweDAxYjBmMDBlLCAweGUzYTAyMDAxLAotICAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLAotICAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LAotICAweGUwYTIyMDAyLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLAotICAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LAotICAweDIxYTA0MDA2LCAweGUwYTIyMDAyLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LAotICAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLAotICAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYTIyMDAyLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LAotICAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYjIyMDAyLAotICAweDNhZmZmZmRhLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweDJhMDAwMDAxLAotICAweGUxNTQwMDA4LCAweDAxNTUwMDBhLCAweGUyYjIyMDAwLCAweGUyYjExMDAwLAotICAweDMxYjBmMDBlLCAweGUyYTMzMDAwLCAweGUzYTAxMTAyLCAweGUxYjBmMDBlLAotICAweGUxYjA0ODgzLCAweDBhZmZmZjM3LCAweGUyODMzOTAxLCAweGUyNDMzMDAxLAotICAweGUxYjAzMGEzLCAweGUxYTA1MDAyLCAweDMyNDE0MTAyLCAweDIyNDE0MTAxLAotICAweDMzYTA3MjAxLCAweDIzYTA3MjAyLCAweGUzYTAxMTAyLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUwMjE2MDA3LCAweDMxNTQwMDA2LCAweDIwNDQ0MDA2LAotICAweDIwMjExMDg3LCAweGUxYjA3MGU3LCAweDVhZmZmZmY3LCAweGUxOTQyMDA1LAotICAweDAxYjBmMDBlLCAweGUzYTAyMDAwLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LAotICAweGUwYTAwMDAwLCAweGUwMjI2MDA3LCAweGUwNTVhMDA2LCAweGUwZDQ4MDAxLAotICAweDMxYjAwMGEwLCAweDIxYTA1MDBhLCAweDIxYTA0MDA4LCAweDIwMjIyMDg3LAotICAweDIwMjExZmE3LCAweGUxYjA3MGE3LCAweDFhZmZmZmYyLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUwYjcwMDA3LCAweGUwZDVhMDAyLCAweGUwZDQ4MDAxLAotICAweDMxYjAwMGEwLCAweDIxYTA1MDBhLCAweDIxYTA0MDA4LCAweDIyMjIyMDAxLAotICAweDIzYTA3MTAyLCAweGUzYTAwMDAwLCAweGUwOTc3MDA3LCAweGUwYjU1MDA1LAotICAweGUwYjQ0MDA0LCAweDJhMDAwMDAyLCAweGUxNTQwMDAxLCAweDAxNTUwMDAyLAotICAweDAzNTcwMTAxLCAweGUyYjIyMDAwLCAweGUyYjExMDAwLCAweGUyYTMzMDAwLAotICAweDIzYTAxMTAyLCAweGUxYjBmMDBlLCAweGUxYjA3MDA0LCAweDQyNjQ0MDAwLAotICAweGUzYTBiOTAxLCAweGUzYTBhMDAwLCAweGUxYTA4MDA0LCAweGUxYjA0ODI4LAotICAweDAxYTA4ODA4LCAweDEyOGJiMDEwLCAweGUxYjA0YzI4LCAweDAxYTA4NDA4LAotICAweDEyOGJiMDA4LCAweGUxYjA0ZTI4LCAweDAxYTA4MjA4LCAweDEyOGJiMDA0LAotICAweGUxYjA0ZjI4LCAweDAxYTA4MTA4LCAweDEyOGJiMDAyLCAweGUxYjA0ZmE4LAotICAweDAxYTA4MDg4LCAweDAyNGJiMDAxLCAweGUxYjBmMDBlLCAweGUxYTA3MDAwLAotICAweGUxYTBiMDAzLCAweGUyNGI0MGZlLCAweGUyNTQ0YzNmLCAweGRhMDAwMDExLAotICAweGUyNzQ1MDIwLCAweDRhMDAwMDAzLCAweGUzYTBhMDAwLCAweGUxYTA4NTMxLAotICAweGUxYTA4NTE4LCAweGUxYjBmMDBlLCAweGUxYTA4MDAxLCAweGUxYTBhMDAyLAotICAweGUyNzQ1MDQwLCAweDQxYjBmMDBlLCAweGUxYTBhNTNhLCAweGUxYTBhNTFhLAotICAweGUxYjBmMDBlLCAweDAzYTA0MDAxLCAweDAzYTA4MTAyLCAweGUzYTBhMDAwLAotICAweDAyOGJiMDAxLCAweDAxYjBmMDBlLCAweGUzYTA0MDAwLCAweGUzYTA4MDAwLAotICAweGUzYTBhMDAwLCAweGUzYTBiMDAwLCAweGUxYjBmMDBlLCAweGUxYTA3MDAwLAotICAweGUxYTBiMDAzLCAweGUyNGI0MGZlLCAweGUyNTQ0YzNmLCAweGRhZmZmZmYwLAotICAweGUyNzQ1MDIwLCAweDRhMDAwMDA3LCAweGUzYTBhMDAwLCAweGUxYjA0NTMxLAotICAweGUyYTQ0MDAwLCAweGUxYjA4NTE0LCAweDMxYjBmMDBlLCAweGUxYTA4MDY4LAotICAweGUyOGJiMDAxLCAweGUxYjBmMDBlLCAweGUxYTA4MDAxLCAweGUxYTBhMDAyLAotICAweGUyNzQ1MDQwLCAweGUzZTA0MDAwLCAweDQxYjBmMDBlLCAweGUxYjBhNTNhLAotICAweGUyYWFhMDAwLCAweGUxYjBhNTFhLCAweGUyYjg4MDAwLCAweDMxYjBmMDBlLAotICAweGUxYTBhMGFhLCAweGUxOGFhZjg4LCAweGUxYTA4MDY4LCAweGUyOGJiMDAxLAotICAweGUxYjBmMDBlLCAweGUzOGVlMTAxLCAweGUyNDM0MGZlLCAweGUyNTQ0YzNmLAotICAweGRhMDAwMDMyLCAweGUyNzQ1MDIwLCAweDRhMDAwMDE4LCAweGUxYTA4NDExLAotICAweDAxYTA4MDAyLCAweDExYTBhMDAyLCAweDAzYTBhMDAwLCAweGUzYTAyMDAwLAotICAweGUxYTAxNTMxLCAweGUyMTk0MDYwLCAweDFhMDAwMDA3LCAweGUxOWFhMDg4LAotICAweDAwMDg4ZjgxLCAweGUwOTExZmE4LCAweDMxYjAxNTExLCAweDMxYjBmMDBlLAotICAweGUxYTAxMDYxLCAweGUyODMzMDAxLCAweGUxYjBmMDBlLCAweGUzNTQwMDYwLAotICAweDExOThhMDBhLCAweDBhMDAwMDAzLCAweGUwMzA0ZDA0LCAweDVhMDAwMDAxLAotICAweGUyOTExMDAxLCAweGVhZmZmZmYzLCAweGUxYTAxNTExLCAweGUxYjBmMDBlLAotICAweGUyNzQ1MDQwLCAweGQxYjBmMDBlLCAweGUyNDQ0MDIwLCAweGUxYTA4NDEyLAotICAweGUxYjAyNTMyLCAweGUyMTk0MDYwLCAweDFhMDAwMDBhLCAweGUxYjBhMDg4LAotICAweDAwMDg4ZjgyLCAweGUwODIyZmE4LCAweGUxYjAyNTEyLCAweGUyYjExMDAwLAotICAweDMxYjBmMDBlLCAweGUxYTAyMGEyLCAweGUxODIyZjgxLCAweGUxYTAxMDYxLAotICAweGUyODMzMDAxLCAweGUxYjBmMDBlLCAweGUzNTQwMDYwLCAweDEzNTgwMDAwLAotICAweDBhZmZmZmY0LCAweGUwMzA0ZDA0LCAweDQyODIyMDAxLCAweGVhZmZmZmYxLAotICAweDBhMDAwMDExLCAweGUyMTk0MDYwLCAweDFhMDAwMDA2LCAweGUxOTE4MDAyLAotICAweDAxYjBmMDBlLCAweGUzYTAxMDAwLCAweGUzYTAyMDAwLCAweGUzYTAzMDAwLAotICAweGUzYTA0MDA4LCAweGUxYTBmMDBlLCAweGUxOTE4MDAyLCAweDEzNTQwMDYwLAotICAweDBhZmZmZmY1LCAweGUwMzA0ZDA0LCAweDVhZmZmZmYzLCAweGUzYTAxMTAyLAotICAweGUzYjAyMTAwLCAweGUyZTIzOTAxLCAweGUxYjBmMDBlLCAweGUyMTk0MDYwLAotICAweDFhZmZmZmY0LCAweGUxOTI0MDgxLCAweDFhZmZmZmY3LCAweGVhZmZmZmVhLAotICAweGUxYTA0MDAwLCAweGUxYTAwMDA3LCAweGUxYTA3MDA0LCAweGUxYTA0MDAxLAotICAweGUxYTAxMDA4LCAweGUxYTA4MDA0LCAweGUxYTA0MDAyLCAweGUxYTAyMDBhLAotICAweGUxYTBhMDA0LCAweGUxYTA0MDAzLCAweGUxYTAzMDBiLCAweGUxYTBiMDA0LAotICAweGUxYjBmMDBlLCAweGUyMDliYTA3LCAweGUwOGM1NDJiLCAweGUyMDk3ODBmLAotICAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwNGE4MTA4LCAweDE3OGQ4NzI3LAotICAweGUyMTk5OTAyLCAweGUzODk5OTAxLCAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LAotICAweDE0YmE3MDA0LCAweGU4ODUwM2MwLCAweGVhZmZmY2FlLCAweGUyMDliYTA3LAotICAweGUwOGM1NDJiLCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLAotICAweGUwNGE4MTA4LCAweDE3OGQ4NzI3LCAweGUyMTk5OTAyLCAweGUzODk5OTA1LAotICAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LCAweGU0YmE3MDA0LCAweGU0YmE4MDAwLAotICAweGU4ODUwM2MwLCAweGVhZmZmYzlmLCAweGUyMDliYTA3LCAweGUwOGM1NDJiLAotICAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwOGE4MTA4LAotICAweDE3OGQ4NzI3LCAweGUyMTk5OTAyLCAweGUzODk5OTAxLCAweGUxYTA5Nzg5LAotICAweGU0YmE2MDA0LCAweDE0YmE3MDA0LCAweGU4ODUwM2MwLCAweGVhZmZmYzkxLAotICAweGUyMDliYTA3LCAweGUwOGM1NDJiLCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwOGE4MTA4LCAweDE3OGQ4NzI3LCAweGUyMTk5OTAyLAotICAweGUzODk5OTA1LCAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LCAweGU0YmE3MDA0LAotICAweGU0YmE4MDAwLCAweGU4ODUwM2MwLCAweGVhZmZmYzgyLCAweGUyMDliYTA3LAotICAweGUwOGNjNDJiLCAweGUyMDk3ODBmLCAweGUzMzcwODBmLCAweDE3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwNGFhMTA4LCAweGUyMTk5OTAyLCAweGUzODk5OTAxLAotICAweGUxYTBiNzg5LCAweGU0YmE4MDA0LCAweDE0YmE5MDA0LCAweGU4OGMwZjAwLAotICAweGVhZmZmYzgzLCAweGUyMDliYTA3LCAweGUwOGM1NDJiLCAweGUyMDk3ODBmLAotICAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwNGFhMTA4LCAweDE3OGRhNzI3LAotICAweGUyMTk5OTAyLCAweGUzODk5OTAxLCAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LAotICAweDE0YmE3MDA0LCAweGU4ODUwM2MwLCAweGVhZmZmYzY2LCAweGUyMDliYTA3LAotICAweGUwOGNjNDJiLCAweGUyMDk3ODBmLCAweGUzMzcwODBmLCAweDE3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwNGFhMTA4LCAweGUyMTk5OTAyLCAweGUzODk5OTA1LAotICAweGUxYTBiNzg5LCAweGU0YmE4MDA0LCAweGU0YmE5MDA0LCAweGU0YmFhMDAwLAotICAweGU4OGMwZjAwLCAweGVhZmZmYzY2LCAweGUyMDliYTA3LCAweGUwOGM1NDJiLAotICAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwNGFhMTA4LAotICAweDE3OGRhNzI3LCAweGUyMTk5OTAyLCAweGUzODk5OTA1LCAweGUxYTA5Nzg5LAotICAweGU0YmE2MDA0LCAweGU0YmE3MDA0LCAweGU0YmE4MDAwLCAweGU4ODUwM2MwLAotICAweGVhZmZmYzQ4LCAweGUyMDliYTA3LCAweGUwOGNjNDJiLCAweGUyMDk3ODBmLAotICAweGUzMzcwODBmLCAweDE3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwOGFhMTA4LAotICAweGUyMTk5OTAyLCAweGUzODk5OTAxLCAweGUxYTBiNzg5LCAweGU0YmE4MDA0LAotICAweDE0YmE5MDA0LCAweGU4OGMwZjAwLCAweGVhZmZmYzQ5LCAweGUyMDliYTA3LAotICAweGUwOGM1NDJiLCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLAotICAweGUwOGFhMTA4LCAweDE3OGRhNzI3LCAweGUyMTk5OTAyLCAweGUzODk5OTAxLAotICAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LCAweDE0YmE3MDA0LCAweGU4ODUwM2MwLAotICAweGVhZmZmYzJjLCAweGUyMDliYTA3LCAweGUwOGNjNDJiLCAweGUyMDk3ODBmLAotICAweGUzMzcwODBmLCAweDE3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwOGFhMTA4LAotICAweGUyMTk5OTAyLCAweGUzODk5OTA1LCAweGUxYTBiNzg5LCAweGU0YmE4MDA0LAotICAweGU0YmE5MDA0LCAweGU0YmFhMDAwLCAweGU4OGMwZjAwLCAweGVhZmZmYzJjLAotICAweGUyMDliYTA3LCAweGUwOGM1NDJiLCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwOGFhMTA4LCAweDE3OGRhNzI3LCAweGUyMTk5OTAyLAotICAweGUzODk5OTA1LCAweGUxYTA5Nzg5LCAweGU0YmE2MDA0LCAweGU0YmE3MDA0LAotICAweGU0YmE4MDAwLCAweGU4ODUwM2MwLCAweGVhZmZmYzBlLCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDAxLCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1ZjZmLCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwNGE4MTA4LCAweDE3OGQ4NzI3LCAweGU0YWEwMDA0LAotICAweGUzMTMwMTAxLCAweDE0YWExMDAwLCAweGVhZmZmYmZhLCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDA1LCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1ZjViLCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwNGE4MTA4LCAweDE3OGQ4NzI3LCAweGU0YWEwMDA0LAotICAweGU0YWExMDA0LCAweGU0YWEyMDAwLCAweGVhZmZmYmU2LCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDAxLCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1ZjQ3LCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwOGE4MTA4LCAweDE3OGQ4NzI3LCAweGU0YWEwMDA0LAotICAweGUzMTMwMTAxLCAweDE0YWExMDAwLCAweGVhZmZmYmQyLCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDA1LCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1MGNjLCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwOGE4MTA4LCAweDE3OGQ4NzI3LCAweGU0YWEwMDA0LAotICAweGU0YWExMDA0LCAweGU0YWEyMDAwLCAweGVhZmZmYmJlLCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDAxLCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1MDdjLCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGUzMzcwODBmLAotICAweDE3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwNGFhMTA4LCAweGU0YWEwMDA0LAotICAweGUzMTMwMTAxLCAweDE0YWExMDAwLCAweGVhZmZmYmIyLCAweGUyMDk1YTA3LAotICAweGUwOGM1NDI1LCAweGU4OTUwMDBmLCAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LAotICAweGUzODQ0MDAxLCAweGUxMzQwZWEzLCAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LAotICAweGUyOGY1MDJjLCAweDEwODVmMTA0LCAweGUyMDk3ODBmLCAweGU3OWRhNzI3LAotICAweGUyMTk4MGZmLCAweGUwNGFhMTA4LCAweDE3OGRhNzI3LCAweGU0YWEwMDA0LAotICAweGUzMTMwMTAxLCAweDE0YWExMDAwLCAweGVhZmZmYjk2LCAweGUwOGZmMTA0LAotICAweGViMDAwMzZiLCAweGUxYTBmMDA3LCAweGVhMDAwMGI2LCAweGViMDAwMzY4LAotICAweGVhMDAwMGVhLCAweGViMDAwMzY2LCAweGVhMDAwMTIzLCAweGViMDAwMzY0LAotICAweGVhMDAwMWNhLCAweGVhMDAwMTI0LCAweGUxYTBmMDA3LCAweGViMDAwMzYwLAotICAweGVhMDAwMTM0LCAweGViMDAwMzVlLCAweGVhMDAwMTRiLCAweGViMDAwMzVjLAotICAweGVhMDAwMWJkLCAweGViMDAwMzVhLCAweGViMDAwMzU5LCAweGViMDAwMzU4LAotICAweGViMDAwMzU3LCAweGViMDAwMzU2LCAweGViMDAwMzU1LCAweGViMDAwMzU0LAotICAweGViMDAwMzUzLCAweGVhMDAwMTU2LCAweGVhMDAwMTZmLCAweGViMDAwMzUwLAotICAweGUxYTBmMDA3LCAweGViMDAwMzRlLCAweGVhMDAwMThjLCAweGViMDAwMzRjLAotICAweGVhMDAwMWFkLCAweGViMDAwMzRhLCAweGViMDAwMzQ5LCAweGViMDAwMzQ4LAotICAweGViMDAwMzQ3LCAweGViMDAwMzQ2LCAweGViMDAwMzQ1LCAweGViMDAwMzQ0LAotICAweGViMDAwMzQzLCAweGVhMDAwMTlmLCAweGVhMDAwMDhkLCAweGViMDAwMzQwLAotICAweGVhMDAwMGMxLCAweGViMDAwMzNlLCAweGUxYTBmMDA3LCAweGViMDAwMzNjLAotICAweGVhMDAwMTlkLCAweGViMDAwMzNhLCAweGViMDAwMzM5LCAweGViMDAwMzM4LAotICAweGViMDAwMzM3LCAweGViMDAwMzM2LCAweGViMDAwMzM1LCAweGViMDAwMzM0LAotICAweGViMDAwMzMzLCAweGVhMDAwMjRmLCAweGVhMDAwMjRlLCAweGViMDAwMzMwLAotICAweGVhMDAwMjRjLCAweGViMDAwMzJlLCAweGVhMDAwMjRhLCAweGViMDAwMzJjLAotICAweGUxYTBmMDA3LCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDA1LCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1ZjRiLCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGUzMzcwODBmLCAweDE3OWRhNzI3LCAweGUyMTk4MGZmLAotICAweGUwNGFhMTA4LCAweGU0YWEwMDA0LCAweGU0YWExMDA0LCAweGU0YWEyMDA0LAotICAweGVhZmZmYjQ4LCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDA1LCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1ZjVmLCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwNGFhMTA4LAotICAweDE3OGRhNzI3LCAweGU0YWEwMDA0LCAweGU0YWExMDA0LCAweGU0YWEyMDAwLAotICAweGVhZmZmYjJjLCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDAxLCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1ZjczLCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGUzMzcwODBmLCAweDE3OWRhNzI3LCAweGUyMTk4MGZmLAotICAweGUwOGFhMTA4LCAweGU0YWEwMDA0LCAweGUzMTMwMTAxLCAweDE0YWExMDAwLAotICAweGVhZmZmYjIwLCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDAxLCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1Zjg3LCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwOGFhMTA4LAotICAweDE3OGRhNzI3LCAweGU0YWEwMDA0LCAweGUzMTMwMTAxLCAweDE0YWExMDAwLAotICAweGVhZmZmYjA0LCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDA1LCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1ZjliLCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGUzMzcwODBmLCAweDE3OWRhNzI3LCAweGUyMTk4MGZmLAotICAweGUwOGFhMTA4LCAweGU0YWEwMDA0LCAweGU0YWExMDA0LCAweGU0YWEyMDA0LAotICAweGVhZmZmYWY4LCAweGUyMDk1YTA3LCAweGUwOGM1NDI1LCAweGU4OTUwMDBmLAotICAweGUzYTA0MDAyLCAweGUwMDQ0NzI5LCAweGUzODQ0MDA1LCAweGUxMzQwZWEzLAotICAweGUxODQ0ZDIzLCAweGUyOGY3MDA0LCAweGUyNGY1ZmFmLCAweDEwODVmMTA0LAotICAweGUyMDk3ODBmLCAweGU3OWRhNzI3LCAweGUyMTk4MGZmLCAweGUwOGFhMTA4LAotICAweDE3OGRhNzI3LCAweGU0YWEwMDA0LCAweGU0YWExMDA0LCAweGU0YWEyMDAwLAotICAweGVhZmZmYWRjLCAweGUzYzAzMTAyLCAweGUyMDAwMTAyLCAweGUxYjA1ODgzLAotICAweDEyOTU1ODAyLCAweDBhMDAwMDBlLCAweGUzMzIwMDAwLCAweDAxOTIyYzgxLAotICAweGUyMDEyMDgwLCAweDAwMDIyMGExLCAweGUwOTExMDAyLCAweDMxYTAxMDgxLAotICAweGUyYTMzMDAwLCAweGUyNTMzZGZlLCAweDlhMDAwMDFjLCAweGUzNTMwMGZmLAotICAweDMxODAwYjgzLCAweDMxODAwNGExLCAweDMzYTAzMjAyLCAweDMxYTBmMDA3LAotICAweGVhMDAwMDA4LCAweGUxYjA0YzAzLCAweGUxODAwMGE0LCAweGUzYTAzMjAyLAotICAweDEzYzExMTAyLCAweDExODAwNDIxLCAweDExYTBmMDA3LCAweGUxOTIyMDAxLAotICAweDAxYTBmMDA3LCAweGVhMDAwMDE1LCAweGUzODAwNDdmLCAweGUzODAwNTAyLAotICAweGUzYTAzMjAyLCAweGUzYTA0MDA0LCAweGU1OWM1MDgwLCAweGUxODU1MDA0LAotICAweGU1OGM1MDgwLCAweGUxMTQwODI1LCAweDExYTAwMDA0LCAweDFhMDAwZThhLAotICAweGUzNTQwMDA0LCAweDExYTBmMDA3LCAweGUzYTA0MDEwLCAweGVhZmZmZmY1LAotICAweGUzNzMwMDE3LCAweGRhMDAwMDA1LCAweGUxYTAxNTIxLCAweGUzODExNTAxLAotICAweGUyNjMzMDAwLCAweGUxODAwMzMxLCAweGUzYTAzMjAyLCAweGUxYTBmMDA3LAotICAweGUzYTAzMjAyLCAweGUzYTA0MDA4LCAweGVhZmZmZmVhLCAweGUzYzAzMTAyLAotICAweGUyMDAwMTAyLCAweGUxYjA1ODgzLCAweDEyOTU1ODAyLCAweDBhMDAwMDEyLAotICAweGUxYjA0YjAyLCAweGUyMDI0YjAxLCAweDAwMDQ0MGEyLCAweGUwOTIyMDA0LAotICAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweGUwOTIyMDAyLCAweGUwYTExMDAxLAotICAweGUyNTMzYjBmLCAweDlhMDAwMDE5LCAweGUyODM0MDAxLCAweGUzNTQwYjAyLAotICAweDMxODAwYTAzLCAweDMxODAwNjIxLCAweDMxYTAxYTAxLCAweDMxODExNjIyLAotICAweDMzYTAzMjA2LCAweDMxYTBmMDA3LCAweGVhMDAwMDBhLCAweGUxYjA0YTgzLAotICAweGUxODAwMGE0LCAweGUzYTAzMjA2LCAweDEzYzExMTAyLCAweDExODAwNWExLAotICAweDExYTAxYTgxLCAweDExODExNWEyLCAweDExYTBmMDA3LCAweGUxOTIyMDAxLAotICAweDAxYTBmMDA3LCAweGVhMDAwMDE0LCAweGUzODAwNDdmLCAweGUzODAwNjBmLAotICAweGUzYTAxMDAwLCAweGUzYTAzMjA2LCAweGUzYTA0MDA0LCAweGVhZmZmZmMxLAotICAweGUzNzMwMDM0LCAweGRhMDAwMDBjLCAweGUxYTAyNmEyLCAweGUxODIyOTgxLAotICAweGUxYTAxNmExLCAweGUzODExNzAyLCAweGUyNjMzMDAwLCAweGUyNTM0MDIwLAotICAweDIxYTAxNDMxLCAweDMyNjM0MDIwLCAweDMxODAwMzMxLCAweDMxYTAxNDExLAotICAweDMxODExMzMyLCAweGUzYTAzMjA2LCAweGUxYTBmMDA3LCAweGUzYTAxMDAwLAotICAweGUzYTAzMjA2LCAweGUzYTA0MDA4LCAweGVhZmZmZmFlLCAweGUyMDAwMTAyLAotICAweGUxODAwMDAzLCAweGUzYTAzMjBhLCAweGUxYTBmMDA3LCAweGUzYTAyMDAwLAotICAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweDExYTAxNDAwLAotICAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDExYTBmMDA3LCAweGUxOTMzMzgzLAotICAweDExYTAxNDAwLCAweDEzYzExMTAyLCAweDExYTBmMDA3LCAweGUxYjAxNDgwLAotICAweDAxYTBmMDA3LCAweGUzYTAzZGZlLCAweDUyNDMzMDAxLCAweDUxYjAxMDgxLAotICAweDVhZmZmZmZjLCAweGUxYTBmMDA3LCAweGUxYTAxZTgwLCAweGUzYzAzMTAyLAotICAweGUyMDAwMTAyLCAweGUxODAwMWEzLCAweGUzYTAzMjA2LCAweGUyMTAyNmZmLAotICAweDEzMzIwNmZmLCAweDEyODAwMzBlLCAweDExYTBmMDA3LCAweGUxODAwMTgyLAotICAweGUzMzIwMDAwLCAweDExYTBmMDA3LCAweGUxOTEyNjAwLCAweDAxYTBmMDA3LAotICAweGUxYTAxYTIxLCAweGUxOTExNjAwLCAweGUyMDAwMTAyLCAweGUzODAwMzBlLAotICAweDUyNDAwNjAxLCAweDUxYjAxMDgxLCAweDVhZmZmZmZjLCAweGUxYTAxMDgxLAotICAweGUxODAwNjIxLCAweGUxYTAxYTAxLCAweGUxYTBmMDA3LCAweGUzYTAyMDAwLAotICAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweGUxYTAxNDAwLAotICAweDEzODExMTAyLCAweDEyODMzZGZlLCAweGUyMDAwMTAyLCAweGUxODAwMDAzLAotICAweGUzYTAzMjBhLCAweDExYTBmMDA3LCAweGUxODAwMzgwLCAweGUzMTAwMGZmLAotICAweDEzYzExMTAyLCAweDExYTBmMDA3LCAweGUxYjAxMDgxLCAweDAxYTBmMDA3LAotICAweGUzODAwZGZlLCAweDUyNDAwMDAxLCAweDUxYjAxMDgxLCAweDVhZmZmZmZjLAotICAweGUxYTBmMDA3LCAweGUxYTAzMDgwLCAweGUxYjAzYWEzLCAweDEyODM0MDAxLAotICAweDEzMzQwYjAyLCAweGUxYTAyNTgxLCAweGUxYTAxYWExLCAweGUxODExNTgwLAotICAweDEzODExMTAyLCAweDEyODMzYjBmLCAweDExYTBmMDA3LCAweGUxOTMzMjAzLAotICAweDExYTBmMDA3LCAweGUwOTIyMDAyLCAweGUwYTExMDAxLCAweGUxOTI0MDAxLAotICAweDAxYTBmMDA3LCAweGUzYTAzYjBmLCAweGUxYjAxMDAxLCAweDUyNDMzMDAxLAotICAweGUzYTA0MDAwLCAweDUxODQ0ZmEyLCAweDUxODQ0MDgxLCAweDUxYTAyMDgyLAotICAweDUxYjAxMDA0LCAweDVhZmZmZmY4LCAweGUxYTBmMDA3LCAweGUxYTAzMDgwLAotICAweGUxYjAzYWEzLCAweDEyODM0MDAxLCAweDEzMzQwYjAyLCAweDBhMDAwMDBmLAotICAweGUxYjA0MjAxLCAweGUxYTAxYTIxLCAweGUxODExNjAwLCAweGUyMDE0YzAxLAotICAweDAwMDQ0MGExLCAweGUwOTExMDA0LCAweGUyYTMzMDAwLCAweGUyMDAwMTAyLAotICAweGUyNTMzZDBlLCAweDlhZmZmZjQ5LCAweGUzNTMwMGZmLCAweDMxODAwYjgzLAotICAweDMxODAwNGExLCAweDMzYTAzMjAyLCAweDMxYTBmMDA3LCAweGVhZmZmZjM1LAotICAweGUxODEyNjAwLCAweGUxYTAxYTIxLCAweGUxODExNjAwLCAweGUyMDAwMTAyLAotICAweGUxYjA0YzAzLCAweGUxODAwMGE0LCAweGUzYTAzMjAyLCAweDExODAwNGExLAotICAweDExYTBmMDA3LCAweGUzMzIwMDAwLCAweDAxYTBmMDA3LCAweGVhZmZmZjNmLAotICAweGUxYTAzMDgwLCAweGUxYjAzYWEzLCAweDEyODM0MDAxLCAweDEzMzQwYjAyLAotICAweGUxYTAyNTgxLCAweGUxYTAxYWExLCAweGUxODExNTgwLCAweDEzODExMTAyLAotICAweDEyODMzYjBmLCAweGUyMDAwMTAyLCAweGUxODAwMDAzLCAweGUzYTAzMjBhLAotICAweDExYTBmMDA3LCAweGUxODAwMjAwLCAweGUzMTAwMGZmLCAweDExYTBmMDA3LAotICAweGUwOTIyMDAyLCAweGUwYTExMDAxLCAweGUxOTI0MDAxLCAweDAxYTBmMDA3LAotICAweGUzODAwYjBmLCAweGUxYjAxMDAxLCAweDUyNDAwMDAxLCAweGUzYTA0MDAwLAotICAweDUxODQ0ZmEyLCAweDUxODQ0MDgxLCAweDUxYTAyMDgyLCAweDUxYjAxMDA0LAotICAweDVhZmZmZmY4LCAweGUxYTBmMDA3LCAweGUzYzAzMTAyLCAweGUxYTBmMDA3LAotICAweDlhMjA5YTg0LCAweGZiY2ZmNzk5LCAweDAwMDAzZmZkLCAweGU5MmMwMDgwLAotICAweGUyOGY3MDA0LCAweGUzYzQ0MDA3LCAweGVhZmZmZTJiLCAweGU4YmMwMDgwLAotICAweGUxYjA1ODgzLCAweDEyOTU1ODAyLCAweDBhMDAwMDk5LCAweGUzYTA1OTAxLAotICAweGUyNDU1MDAxLCAweGUxNTMwMDA1LCAweDNhMDAwMDA2LCAweGUyODU1MDAzLAotICAweGUxNTMwMDA1LCAweDAzNTEwMjBhLCAweDMzYTA0MDAwLCAweDMzYTA1MDAwLAotICAweDM5MmM0ZmYwLCAweDNhMDAwMDIxLCAweGU5MmM0ZmNmLCAweGUzYTAwOTAyLAotICAweGUyNDA0MDAzLCAweGUwNjQ0MDgzLCAweGViZmZmYzQ2LCAweGUyNGJiMDAxLAotICAweGUyNGY0MDc4LCAweGU4OTQwMDBlLCAweGViZmZmYjRiLCAweGUzYTA0OTAxLAotICAweGUyNDQ0MDAyLCAweGUwNDM0MDA0LCAweGUyNjQ0MDIwLCAweGUxYTA5NDMxLAotICAweGUxNTEwNDE5LCAweDAzNTIwMDAwLCAweDEyMTBiMTAyLCAweDEyODk5MDAxLAotICAweGUyMDBiMTAyLCAweGU4YmMwMDBmLCAweGU5MmMwYTAwLCAweGViMDAwMGJmLAotICAweGU1OWM0MDA0LCAweGUxYjA0MDA0LCAweDViZmZmYjkwLCAweDRiZmZmYjNhLAotICAweGUzYTA1OTAxLCAweGUyNDU1MDAxLCAweGUxNTMwMDA1LCAweDNhMDAwMDUxLAotICAweGUyODU1MDAzLCAweGUxNTMwMDA1LCAweDAzNTEwMjBhLCAweDJhMDAwMDQwLAotICAweGUzYTA0OTAxLCAweGUyODQ0MDAyLCAweGUwNTQ0MDAzLCAweGUyNjQ1MDIwLAotICAweGUxYTAzNTEyLCAweDExYTAyNDMyLCAweDExODIyNTExLCAweDExYTAxNDMxLAotICAweGUxYTA0ZTIxLCAweGUzYTA3MDAzLCAweGUzYzExMjBmLCAweGUwOTMzMDAzLAotICAweGUwYjIyMDAyLCAweGUwYTExMDAxLCAweGUxYTA4MTAxLCAweGUxODg4ZjIyLAotICAweGUxYTBhMTAyLCAweGUxOGFhZjIzLCAweGUwOTIyMDBhLCAweGUwYTExMDA4LAotICAweGUyNTc3MDAxLCAweDExYTA0MjA0LCAweDExODQ0ZTIxLCAweDFhZmZmZmYxLAotICAweGUxOTE1MDAyLCAweDAzYTA2MDAwLCAweDBhMDAwMDE5LCAweGUzYTA3MDBmLAotICAweGUxYTA1MjA1LCAweGUxODU1ZTI2LCAweGUxYTA2MjA2LCAweGUxODY2ZTIxLAotICAweGUzYzExMjBmLCAweGUwOTIyMDAyLCAweGUwYTExMDAxLCAweGUxYTA4MTAxLAotICAweGUxODg4ZjIyLCAweGUwOTIyMTAyLCAweGUwYTExMDA4LCAweGUyNTc3MDAxLAotICAweDFhZmZmZmYyLCAweGUxYTA1MjA1LCAweGUxODU1ZTI2LCAweGUxYTA2MjA2LAotICAweGUxODY2ZTIxLCAweGUxYjAxMjgxLCAweDNhMDAwMDA1LCAweGUyODY2MDAxLAotICAweGUxOTExMDAyLCAweDAzYzY2MDAxLCAweGUyMDYxMDBmLCAweGUzNTEwMDBhLAotICAweDAyNDY2MDAxLCAweGU4YmMwMDA4LCAweGViMDAwMDIzLCAweGUyMDAwMTAyLAotICAweGUxODAwMjIxLCAweGU4YmMwMDgwLCAweGUxODAwMGE3LCAweGUxODAwMDA0LAotICAweGUxYTAxMDA1LCAweGUxYTAyMDA2LCAweGUzYTAzMjBlLCAweGU4YmM0ZmMwLAotICAweGUxYTBmMDA3LCAweGU4YmMwMDMwLCAweGUzMTUwMTAyLCAweDEyNjQ0MDAwLAotICAweGUyODQ0MDAxLCAweGUyMTQ1MTAyLCAweDEyNjQ0MDAwLCAweGU5MmMwMDMwLAotICAweGUzYTA3OTAxLCAweGUzYTA4MjBhLCAweGUzYTBhMDAwLCAweGUyODdiMDAyLAotICAweGViZmZmYjNhLCAweGVhZmZmZmIxLCAweGU4YmMwMDMwLCAweGUzMTUwMTAyLAotICAweDEyNjQ0MDAwLCAweGUyNDQ0MDAxLCAweGUyMTQ1MTAyLCAweDEyNjQ0MDAwLAotICAweGU5MmMwMDMwLCAweGUzYTA3OTAxLCAweGUzYTA4MjBhLCAweGUzYTBhMDAwLAotICAweGUyODdiMDAyLCAweGViZmZmYWQ4LCAweGVhZmZmZmE0LCAweGUxYTAyMDAzLAotICAweGUzYTAzMDEwLCAweGUwOTIyMDAyLCAweDMzNTIwMjBhLCAweDIyNDIyMjBhLAotICAweGUwYjMzMDAzLCAweDNhZmZmZmZhLCAweGUxYTAxNjIyLCAweGUzNTMwMDY0LAotICAweGEyNDMzMDY0LCAweGEyODExMjAxLCAweGFhZmZmZmZiLCAweGUzNTMwMDBhLAotICAweGEyNDMzMDBhLCAweGEyODExNDAxLCAweGFhZmZmZmZiLCAweGUxODExYTAzLAotICAweGUxYjBmMDBlLCAweGUzNTMwMDAwLCAweDFhMDAwMDBhLCAweGUxOTE1MDAyLAotICAweDAzYTAzMjBlLCAweDAzYTAwMDAwLCAweDAxYTBmMDA3LCAweGUzMTEwMTAyLAotICAweDFhZmZmZjVkLCAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLAotICAweDVhZmZmZmZiLCAweGVhZmZmZjU4LCAweGUyMDAwMTAyLCAweGUxODAwNjAzLAotICAweGUzODAwMzAyLCAweGUxODAwOWExLCAweGUxYTAxNjgxLCAweGUxODExOWEyLAotICAweGUxYTAyNjgyLCAweGUzYTAzMjBlLCAweGUxYTBmMDA3LCAweDkzOTJlZThlLAotICAweDkyMWQ1ZDA3LCAweDAwMDAzZmMzLCAweGUxOTE1MDAyLCAweDAxYjA1YTAwLAotICAweDEyMDA1NDBmLCAweDEzNTUwNDBmLCAweDBhMDAwMGFjLCAweGU5MmM0ZmQwLAotICAweGUzYTA3MDAwLCAweGUzYTA2MDAwLCAweGUxYTA0YTAwLCAweGUzYTA1MDAzLAotICAweGViMDAwMDlhLCAweGUxYTA0MDAxLCAweGUzYTA1MDA4LCAweGViMDAwMDk3LAotICAweGUxYTA0MDAyLCAweGUzYTA1MDA4LCAweGViMDAwMDk0LCAweGUxYTAyMDA3LAotICAweGUxYjAxMDA2LCAweGUzYTAzMDNlLCAweGUyODMzOTAxLCAweDRhMDAwMDAzLAotICAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLAotICAweGUzYTA2MDAwLCAweGUzYTA3MDAwLCAweGUxYTA0MjAwLCAweGUzYTA1MDA0LAotICAweGViMDAwMDg2LCAweGUxYTA5MDA3LCAweGViMDAwMDBjLCAweGUzMTAwMTAxLAotICAweDFiZmZmYWRlLCAweDBiZmZmYTg4LCAweGUyNGY3MGE0LCAweGU4OTcwZDAwLAotICAweGViZmZmYTg1LCAweGU4YmM0ZmQwLCAweGUyOTM1MDAxLCAweGRhMDAwMDkwLAotICAweGUxYjA1N2E1LCAweDFhMDAwMGE3LCAweGUyMDQ0MDA3LCAweGVhZmZmZDQ2LAotICAweGUzNTkwMDE0LCAweGQyOGY4MDg0LCAweGQwODg5MjA5LCAweGQ4OTkwZDgwLAotICAweGQxYjBmMDBlLCAweGU5MmM0MDBmLCAweGUzYTAxMTAyLCAweGUzYTAyMDAwLAotICAweGUzYTAwOTAxLCAweGUyNDAzMDAxLCAweGUzNTkwMDAwLCAweDBhMDAwMDExLAotICAweGU5MmMwMDBmLCAweGUyODMzMDAzLCAweGUzYjAxMjBhLCAweDNiZmZmYTZhLAotICAweGUxYjA5MGE5LCAweDNhZmZmZmZjLCAweGU4YmMwZDgwLCAweDE5MmMwMDBmLAotICAweGViZmZmYTY5LCAweDBhMDAwMDA3LCAweGU4YmMwZDgwLCAweGU5MmMwMDBmLAotICAweGUxYTAwMDA3LCAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAzMDBiLAotICAweGViZmZmYTYxLCAweGVhZmZmZmYxLCAweGUxYTA3MDAwLCAweGUxYTA4MDAxLAotICAweGUxYTBhMDAyLCAweGUxYTBiMDAzLCAweGU4YmM0MDBmLCAweGUxYjBmMDBlLAotICAweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZmLAotICAweDAwMDAwMDAwLCAweGEwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDAyLAotICAweDAwMDAwMDAwLCAweGM4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDA1LAotICAweDAwMDAwMDAwLCAweGZhMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDA4LAotICAweDAwMDAwMDAwLCAweDljNDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDBjLAotICAweDAwMDAwMDAwLCAweGMzNTAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDBmLAotICAweDAwMDAwMDAwLCAweGY0MjQwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDEyLAotICAweDAwMDAwMDAwLCAweDk4OTY4MDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDE2LAotICAweDAwMDAwMDAwLCAweGJlYmMyMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDE5LAotICAweDAwMDAwMDAwLCAweGVlNmIyODAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDFjLAotICAweDAwMDAwMDAwLCAweDk1MDJmOTAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDIwLAotICAweDAwMDAwMDAwLCAweGJhNDNiNzQwLCAweDAwMDAwMDAwLCAweDAwMDA0MDIzLAotICAweDAwMDAwMDAwLCAweGU4ZDRhNTEwLCAweDAwMDAwMDAwLCAweDAwMDA0MDI2LAotICAweDAwMDAwMDAwLCAweDkxODRlNzJhLCAweDAwMDAwMDAwLCAweDAwMDA0MDJhLAotICAweDAwMDAwMDAwLCAweGI1ZTYyMGY0LCAweDgwMDAwMDAwLCAweDAwMDA0MDJkLAotICAweDAwMDAwMDAwLCAweGUzNWZhOTMxLCAweGEwMDAwMDAwLCAweDAwMDA0MDMwLAotICAweDAwMDAwMDAwLCAweDhlMWJjOWJmLCAweDA0MDAwMDAwLCAweDAwMDA0MDM0LAotICAweDAwMDAwMDAwLCAweGIxYTJiYzJlLCAweGM1MDAwMDAwLCAweDAwMDA0MDM3LAotICAweDAwMDAwMDAwLCAweGRlMGI2YjNhLCAweDc2NDAwMDAwLCAweDAwMDA0MDNhLAotICAweDAwMDAwMDAwLCAweDhhYzcyMzA0LCAweDg5ZTgwMDAwLCAweDAwMDA0MDNlLAotICAweDAwMDAwMDAwLCAweGFkNzhlYmM1LCAweGFjNjIwMDAwLCAweDAwMDA0MDQxLAotICAweGUwOTc3MDA3LCAweGUwYTY2MDA2LCAweGUwOTc4MTA3LCAweGUwYTZhZjI3LAotICAweGUwOGE2MTA2LCAweGUxYTA3MDA4LCAweGUwOTc3ZTI0LCAweGUyYTY2MDAwLAotICAweGUxYTA0MjA0LCAweGUyNTU1MDAxLCAweDFhZmZmZmY0LCAweGUxYjBmMDBlLAotICAweGUxYTAzMjgwLCAweGUxYTAzOGEzLCAweGUxYTAyNmEyLCAweGUxODIyOTgxLAotICAweGUxYTAxNmExLCAweGUxODExOTgwLCAweGUzYzExMTAyLCAweGUyMDQ0MDA3LAotICAweGVhZmZmY2I5LCAweGUyMTQ0MDA3LCAweDEzNTQwMDA1LCAweDBhMDAwMDAzLAotICAweGUyMDAwMTAyLCAweGUzNTQwMDAxLCAweDBhZmZmZGEwLCAweGVhZmZmZGRhLAotICAweGUyNjMzMDAwLCAweGUzNTMwMDQwLCAweGFhMDAwMDA4LCAweGUyNzM1MDIwLAotICAweDQyNDM1MDIwLCAweDQxYTAyNTMxLCAweDUxYTAyMzMyLCAweDUxODIyNTExLAotICAweGUxYTAxMzMxLCAweGUzYTAzMDAwLCAweGUyMDQ0MDA3LCAweGVhZmZmY2E2LAotICAweGUyMDAwMTAyLCAweGUzYTAxMDAwLCAweGUzYTAyMDAwLCAweGUxYTAzZTg0LAotICAweGUzYTA0MDA4LCAweGVhZmZmZDdiLCAweGUyMTQ0MDA3LCAweDBhMDAwMDAzLAotICAweGUzYTAwMDAwLCAweGUzNTQwMDAzLCAweDBhZmZmZGFlLCAweGJhZmZmZDcxLAotICAweGUzYTAxMDAwLCAweGUzYjAyMTAwLCAweGUyZTIzOTAyLCAweGUyMDAwMTAyLAotICAweGUxODAwMDAzLCAweGUzNTQwMDAwLCAweDEzYTAzMjBhLCAweGUzYTA0MDA0LAotICAweGVhZmZmZDZjLCAweGVhZmZmZmZlLCAweGUyMDlhYTBmLCAweGUzMTkwMDA4LAotICAweDFhMDAwMDY5LCAweGUyMDk1MDA3LCAweGUwOGM1MjA1LCAweGU4OTUwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmYzg3LCAweGUxYjA0ODgzLAotICAweDEyOTQ0ODAyLCAweDBhMDAwMDJiLCAweDVhMDAwMDM5LCAweGUzNTQwODNlLAotICAweGUyMDQ0OGZmLCAweDRhMDAwMDQ5LCAweGUxYTA0OGE0LCAweGUyMTk5MDYwLAotICAweDFhMDAwMDBlLCAweGUyODQ2MDAyLCAweGUxOTIyNjExLCAweGUzYTAyMTAxLAotICAweGUwMDEyNDMyLCAweDAwMDIyMGExLCAweGUyNjQ0MDFmLCAweGUxYTAxNDMxLAotICAweGUzMzIwMDAwLCAweDEyODExMDAxLCAweGUzMTAwMTAyLCAweDEyNjExMDAwLAotICAweGUwMzEyMDAwLCAweDRhMDAwMDQ5LCAweGU3OGQxNTJhLCAweGVhZmZmODA1LAotICAweGUzNTkwMDYwLCAweDFhMDAwMDA1LCAweGUyNjQ0MDFmLCAweGUxYTAxNDMxLAotICAweGUzMTAwMTAyLCAweDEyNjExMDAwLCAweGU3OGQxNTJhLCAweGVhZmZmN2ZkLAotICAweGUwMzA3ZDA5LCAweDVhZmZmZmY3LCAweGUyODQ2MDAxLCAweGUxOTIyNjExLAotICAweDBhZmZmZmY0LCAweGUyNjQ0MDFmLCAweGUxYTAxNDMxLCAweGUyODExMDAxLAotICAweGUzMTAwMTAyLCAweDEyNjExMDAwLCAweGUwMzEyMDAwLCAweDRhMDAwMDMzLAotICAweGU3OGQxNTJhLCAweGVhZmZmN2VmLCAweGUzMTMwMGZmLCAweDFhMDAwMDAzLAotICAweGUxOTIxMDAxLCAweDFhMDAwMDA2LCAweGU3OGQxNTJhLCAweGVhZmZmN2U5LAotICAweGUxOTIxMDAxLCAweDBhMDAwMDI5LCAweGUyOGY3MGJjLCAweGUzYTA0MDAxLAotICAweGVhZmZmZDI4LCAweGUwMjk3MGE5LCAweGUzMTcwMDIwLCAweDBhMDAwMDEwLAotICAweGVhMDAwMDAzLCAweGUyMTk5MDYwLCAweDBhMDAwMDA4LCAweGUzNTkwMDYwLAotICAweDBhMDAwMDBiLCAweGUwMzA3ZDA5LCAweDVhMDAwMDA5LCAweGUzYTAxMDAxLAotICAweGUzMTAwMTAyLCAweDEyNjExMDAwLCAweGU3OGQxNTJhLCAweGVhZmZmN2Q1LAotICAweGUyOTQ3ODAyLCAweDVhMDAwMDAyLCAweGUzNTEwMTAyLCAweDAzNTIwMDAwLAotICAweDhhZmZmZmY1LCAweGUzYTAxMDAwLCAweGU3OGQxNTJhLCAweGVhMDAwMDE2LAotICAweGUzNTQwODNlLCAweDAzNTEwMTAyLCAweGUyMDAwMTAyLCAweDAzNTAwMTAyLAotICAweDFhMDAwMDBhLCAweGUzNTIwMDAwLCAweDBhZmZmZmFlLCAweGUyMTk5MDYwLAotICAweDBhMDAwMDA0LCAweGUzNTkwMDYwLCAweDBhZmZmZmFhLCAweGUwMzA3ZDA5LAotICAweDVhZmZmZmE4LCAweGVhMDAwMDAxLCAweGUzNTIwMTAyLCAweDlhZmZmZmE1LAotICAweGUyOGY3MDE0LCAweGUzYTA0MDAxLCAweGVhZmZmY2ZlLCAweGUyMDkxMDA3LAotICAweGUzNTEwMDA2LCAweGFhMDAwMDAxLCAweGU3OGQxNTJhLCAweGVhZmZmN2I1LAotICAweGUyODExMDAzLCAweGUzNTEwMDBhLCAweDEzYTAxMDAxLCAweGUyMDk5MDYwLAotICAweDEzNTkwMDIwLCAweDFhZmZmZmRlLCAweGU3OGQxNTJhLCAweGVhZmZmN2FkLAotICAweGUzMTkwMDgwLCAweDFhMDAwMDM0LCAweGUyMDk3YTBmLCAweGU3OWQ4NTI3LAotICAweGUyMDliODA3LCAweGUwOGNiNjJiLCAweGUxYjA3MDA4LCAweDQyNjg4MDAwLAotICAweGUzYTBhMDllLCAweGUyOGFhZGZlLCAweDAzYTBhMDFmLCAweGUxYjBjODI4LAotICAweDAxYTA4ODA4LCAweDAyNGFhMDEwLCAweGUxYjBjYzI4LCAweDAxYTA4NDA4LAotICAweDAyNGFhMDA4LCAweGUxYjBjZTI4LCAweDAxYTA4MjA4LCAweDAyNGFhMDA0LAotICAweGUxYjBjZjI4LCAweDAxYTA4MTA4LCAweDAyNGFhMDAyLCAweGUxYjBjZmE4LAotICAweDAxYTA4MDg4LCAweDAyNGFhMDAxLCAweGUxYjBjYzA4LCAweDFhMDAwMDAyLAotICAweGUzYTA5MDAwLCAweGU4OGIwNzgwLCAweGVhZmZmNzlkLCAweGUyMTk5MDYwLAotICAweDFhMDAwMDA4LCAweGUxYjBjMDhjLCAweGUyMDhjMDgwLCAweDAwMGNjMGE4LAotICAweGUwOTg4MDBjLCAweGUyYWFhMDAwLCAweDIzYTA4MTAyLCAweGUzYzg4MGZmLAotICAweGU4OGIwNzgwLCAweGVhZmZmNzkyLCAweGUyMzk5MDYwLCAweDBhZmZmZmZhLAotICAweGUwMjdjYzg5LCAweGUyMGNjMTAyLCAweGUwOTg4YmFjLCAweGUyYWFhMDAwLAotICAweDIzYTA4MTAyLCAweGUzYTA5MDAwLCAweGUzYzg4MGZmLCAweGU4OGIwNzgwLAotICAweGVhZmZmNzg3LCAweGUzMTkwMDgwLCAweDFhZmZmNzVmLCAweGUyMDk3YTBmLAotICAweGU3OWQ4NTI3LCAweGUyMDliODA3LCAweGUwOGNiNjJiLCAweGUxYjA3MDA4LAotICAweDQyNjg4MDAwLCAweGUzYTBhMDllLCAweGUyOGFhZGZlLCAweDAzYTBhMDFmLAotICAweGUxYjA5ODI4LCAweDAxYTA4ODA4LCAweDAyNGFhMDEwLCAweGUxYjA5YzI4LAotICAweDAxYTA4NDA4LCAweDAyNGFhMDA4LCAweGUxYjA5ZTI4LCAweDAxYTA4MjA4LAotICAweDAyNGFhMDA0LCAweGUxYjA5ZjI4LCAweDAxYTA4MTA4LCAweDAyNGFhMDAyLAotICAweGUxYjA5ZmE4LCAweDAxYTA4MDg4LCAweDAyNGFhMDAxLCAweGUzYTA5MDAwLAotICAweGU4OGIwNzgwLCAweGVhZmZmNzZhLCAweGUyMDk3YTBmLCAweGU3OWRhNTI3LAotICAweGUzY2E4MDFmLCAweGUzZDg4ODFmLCAweDFhMDAwMDAyLCAweGUzOGFhMDAwLAotICAweGU1OGNhMDgwLCAweGVhZmZmNzYyLCAweGUyNGY3MDBjLCAweGUzYTA0MDAxLAotICAweGVhZmZmYzk0LCAweGUyMDk3YTBmLCAweGU1OWNhMDgwLCAweGU3OGRhNTI3LAotICAweGVhZmZmNzRjLCAweGUxYjA4ZTA5LCAweDRhMDAwMDM3LCAweGUwOGM4YzI4LAotICAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmYmFlLAotICAweGUyMDk3ODA3LCAweGUxYTBiMDAzLCAweGUxYTBhMDAyLCAweGUwMjA4NTA5LAotICAweGUxYTA5MDAxLCAweGUwOGNjNjI3LCAweGU4OWMwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmYmE0LCAweDE4OGMwMDBmLCAweGUzYTA0ODAzLAotICAweGUwOTQ1ODgzLCAweDMwOTQ1ODhiLCAweDJhMDAwMDE1LCAweGUwMzA1MDA4LAotICAweDRhMDAwMDA5LCAweGUxNTMwMDBiLCAweDAxNTEwMDA5LCAweDAxNTIwMDBhLAotICAweGUxMGY3MDAwLCAweGUyMDc3MjA2LCAweDMzODc3MTAyLCAweDEzMTAwMTAyLAotICAweDEyMjc3MjBhLCAweGUxNjhmMDA3LCAweGVhZmZmNzJhLCAweGUxOWI0MDAzLAotICAweDAxOWE0MDAyLCAweDAxOTk0MDAxLCAweDBhMDAwMDAzLCAweGUzMTAwMTAyLAotICAweDEzNjhmMTAyLCAweDAzNjhmMjAyLCAweGVhZmZmNzIyLCAweGUzNjhmMjA2LAotICAweGVhZmZmNzIwLCAweGUwOTQ1ODgzLCAweDNhMDAwMDAxLCAweGUxOTE1MDAyLAotICAweDFhMDAwMDAzLCAweGUwOTQ1ODhiLCAweDNhZmZmZmUzLCAweGUxOTk1MDBhLAotICAweDBhZmZmZmUxLCAweGUzNjhmMjAxLCAweGUyNGZjMGMwLCAweGUyNGNjYzI0LAotICAweGUyNGY3MDM4LCAweGUzYTA0MDAxLCAweGVhZmZmYzU2LCAweGUyMDk3ODA3LAotICAweGUyMDk1NjAyLCAweGUyNGY2MDc0LCAweGUwODY2YzI4LCAweGU4OTYwZjAwLAotICAweGUwMjg4NTA1LCAweGVhZmZmZmNhLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAzZmZmLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDA0MDAwLCAweDAwMDAwMDAwLCAweGMwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDA0MDAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDA0MDAxLCAweDAwMDAwMDAwLCAweGEwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDA0MDAxLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAzZmZlLCAweDAwMDAwMDAwLCAweGEwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDA0MDAyLCAweGUyMDk3ODA3LCAweGUyMDk1NjAyLAotICAweGUyNGY2ZTExLCAweGUwODY2YzI4LCAweGU4OTYwZjAwLCAweGUwMjg4NTA1LAotICAweGVhMDAwMDBiLCAweGUxYjA4ZTA5LCAweDRhZmZmZmY2LCAweGUwOGM4YzI4LAotICAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmYjQ2LAotICAweGUyMDk3ODA3LCAweGUxYTBiMDAzLCAweGUxYTBhMDAyLCAweGUwMjA4NTA5LAotICAweGUxYTA5MDAxLCAweGUwOGNjNjI3LCAweGU4OWMwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmYjNjLCAweDE4OGMwMDBmLCAweGUzYTA0ODAzLAotICAweGUwOTQ1ODgzLCAweDMwOTQ1ODhiLCAweDJhMDAwMDBiLCAweGUwMzA1MDA4LAotICAweDRhZmZmZmExLCAweGUxNTMwMDBiLCAweDAxNTEwMDA5LCAweDAxNTIwMDBhLAotICAweGUxMGY3MDAwLCAweGUyMDc3MjA2LCAweDMzODc3MTAyLCAweDEzMTAwMTAyLAotICAweDEyMjc3MjBhLCAweGUxNjhmMDA3LCAweGVhZmZmNmMyLCAweGUwOTQ1ODgzLAotICAweDNhMDAwMDAxLCAweGUxOTE1MDAyLCAweDFhMDAwMDAzLCAweGUwOTQ1ODhiLAotICAweDNhZmZmZmVkLCAweGUxOTk1MDBhLCAweDBhZmZmZmViLCAweGUzNjhmMjAxLAotICAweGVhZmZmNmI4LCAweGUyMDk5MDYwLCAweGUzNTkwMDIwLCAweDAzYTA3MjA5LAotICAweDBhMDAwMDA2LCAweGUzYTAwMDAwLCAweGUwOGNiNDJhLCAweGUyOGY3MDhjLAotICAweGUyODc3YzA1LCAweGVhMDAwMGRlLCAweGUzNTcwMjBlLCAweDBhZmZmZmY0LAotICAweGUyNGY4YzAyLCAweGUwODg3YzI3LCAweGUwOGNiNDJhLCAweGU4OTcwNzgwLAotICAweGU4OGIwNzgwLCAweGVhZmZmNmI2LCAweGUyNGY4Zjg1LCAweGUwODg3YzI3LAotICAweGUwOGNiNDJhLCAweGU4OTcwNzAwLCAweGUzYTA3MTAyLCAweGU4OGIwNzgwLAotICAweGVhZmZmNmFmLCAweGUyNGY3ZTIzLCAweGUwODc4YzI4LCAweGU4OTgwZDAwLAotICAweGUzYTA0MDAwLCAweGVhMDAwMWYzLCAweGUyNGY3ZjkxLCAweGUwODc4YzI4LAotICAweGU4OTgwZDAwLCAweGUzYTA0MDAwLCAweGVhMDAwMmE1LCAweGUzNTgwMTAyLAotICAweDBhMDAwNDBmLCAweGUyNGY3ZTI2LCAweGUwODc4YzI4LCAweGU4OTgwZDAwLAotICAweGVhMDAwMzVmLCAweGUzNTgwMTAyLCAweDBhMDAwNTBmLCAweGUyNGY3ZjllLAotICAweGUwODc4YzI4LCAweGU4OTgwZDAwLCAweGVhMDAwNDU2LCAweGUyNGY3ZmEzLAotICAweGUwODc2YzI2LCAweGU4OTYwMDBmLCAweGVhMDAwNDYzLCAweGUzNTgwMTAyLAotICAweDBhMDAwNWIzLCAweGUyNGY3ZTJhLCAweGUwODc4YzI4LCAweGU4OTgwZDAwLAotICAweGVhMDAwNTQ2LCAweGUyNGY3ZmFkLCAweGUwODc2YzI2LCAweGU4OTYwMDBmLAotICAweGVhMDAwNTQ5LCAweGUyNGY4ZmIxLCAweGUwODg4YzI3LCAweGUwOGNiNDJhLAotICAweGU4OTgwMDBmLCAweGUzNTcwMjA5LCAweDlhMDAwMThlLCAweGVhMDAwMTQzLAotICAweGUyNGY4ZTJlLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwNjNhLAotICAweGUyNGY4ZTJmLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwNmRkLAotICAweGUyNGY4YzAzLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwNzkwLAotICAweGUyNGY4ZTMxLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwODU4LAotICAweGUzNTcwMTAyLCAweDEzNTcwMjA5LCAweDEzNTcwMjBlLCAweDFhMDAwOGZlLAotICAweGUyNGY4ZTMzLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwODgwLAotICAweGUyNGY4ZDBkLCAweGUwODg4YzI3LCAweGU4OTgwMDBmLCAweGVhMDAwOTkyLAotICAweGUyNGY3ZTM1LCAweGUwODc2YzI2LCAweGU4OTYwMDBmLCAweGVhMDAwOTM3LAotICAweGUyNGY3ZmQ3LCAweGUwODc4YzI4LCAweGU4OTgwZDAwLCAweGVhMDAwNWI2LAotICAweGUzMTkwMDgwLCAweDFhZmZmNjM4LCAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LAotICAweDRhZmZmZjllLCAweGUwOGM3YzI3LCAweGUwOGNiNDJhLCAweGU4OTcwNzgwLAotICAweGU4OGIwNzgwLCAweGVhZmZmNjU2LCAweGUzMTkwMDgwLCAweDFhZmZmNjJlLAotICAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LCAweDRhZmZmZjlhLCAweGUwOGM3YzI3LAotICAweGUwOGNiNDJhLCAweGU4OTcwNzgwLCAweGUyMjc3MTAyLCAweGU4OGIwNzgwLAotICAweGVhZmZmNjRiLCAweGUzMTkwMDgwLCAweDFhZmZmNjIzLCAweGUxYjA3ZTA5LAotICAweGUyMDlhYTA3LCAweDRhZmZmZjg5LCAweGUwOGM3YzI3LCAweGUwOGNiNDJhLAotICAweGU4OTcwNzgwLCAweGUzYzc3MTAyLCAweGU4OGIwNzgwLCAweGVhZmZmNjQwLAotICAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LCAweDRhZmZmZjgwLCAweGUwOGM3YzI3LAotICAweGUwOGNhNDJhLCAweGU4OTcwMDBmLCAweGUyMDk4MDgwLCAweGUzODg4MDQwLAotICAweGUxNTgwYmEzLCAweDIxYjA0MTgzLCAweDNhMDAwMDFkLCAweGU4OGEwMDBmLAotICAweGVhZmZmNjJjLCAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LCAweDRhZmZmZjc5LAotICAweGUwOGM3YzI3LCAweGUwOGNhNDJhLCAweGU4OTcwMDBmLCAweGUyMjAwMTAyLAotICAweGUyMDk4MDgwLCAweGUzODg4MDQwLCAweGUxNTgwYmEzLCAweDIxYjA0MTgzLAotICAweDNhMDAwMDBmLCAweGU4OGEwMDBmLCAweGVhZmZmNjFlLCAweGUxYjA3ZTA5LAotICAweGUyMDlhYTA3LCAweDRhZmZmZjY1LCAweGUwOGM3YzI3LCAweGUwOGNhNDJhLAotICAweGU4OTcwMDBmLCAweGUzYzAwMTAyLCAweGUyMDk4MDgwLCAweGUzODg4MDQwLAotICAweGUxNTgwYmEzLCAweDIxYjA0MTgzLCAweDNhMDAwMDAxLCAweGU4OGEwMDBmLAotICAweGVhZmZmNjEwLCAweGUxYTA0MzI4LCAweGUxODQ0ZDIzLCAweGUyNGY3MDE4LAotICAweGUzNTQwMDE5LCAweDBhMDAwMDZiLCAweGMzYzAzMTAyLCAweGUzMTQwMDAyLAotICAweDFhMDAwMDM0LCAweGUxYjA1ODgzLCAweDEyOTU1ODAyLCAweDBhMDAwMDFjLAotICAweGUyMTk1MDYwLCAweDFhMDAwMDBjLCAweGUxOTI1YzgxLCAweGUyMDEyMDgwLAotICAweDAwMDIyMGExLCAweGUwOTExMDAyLCAweDIzYTAxMTAyLCAweGUyYTMzMDAwLAotICAweGUzYTAyMDAwLCAweGUzYzExMGZmLCAweGUyNTM1ZGZlLCAweDlhMDAwMDFhLAotICAweGUzNTUwMGZmLCAweDMxYTBmMDA3LCAweGVhMDAwMDEyLCAweGUzNTUwMDYwLAotICAweDExOTIyYzAxLCAweDEwMzA1ZDA1LCAweDVhZmZmZmY0LCAweGUyOTExYzAxLAotICAweDIzYTAxMTAyLCAweGUyYTMzMDAwLCAweGUzYTAyMDAwLCAweGUzYzExMGZmLAotICAweGUyNTM1ZGZlLCAweDlhMDAwMDBjLCAweGUzNTUwMGZmLCAweDMxYTBmMDA3LAotICAweGVhMDAwMDA0LCAweGUzMTMwMGZmLCAweDExYTBmMDA3LCAweGUxOTIyMDAxLAotICAweDAxYTBmMDA3LCAweGVhMDAwMDBhLCAweGUzYTAzMGZmLCAweGUzODMzYzdmLAotICAweGUzYTAxMDAwLCAweGUzYTA0MDA0LCAweGVhZmZmYjFhLCAweGUzNzUwMDE3LAotICAweGRhMDAwMDAzLCAweGUyNjU1MDA5LCAweGUxYTAxNTMxLCAweGUxYTAxNTExLAotICAweGUxYTBmMDA3LCAweGUzYTAzMDAwLCAweGUzYTAyMDAwLCAweGUzYTAxMDAwLAotICAweGUzYTA0MDA4LCAweGVhZmZmYjBmLCAweGUxYjA1ODgzLCAweDEyOTU1ODAyLAotICAweDBhMDAwMDIyLCAweGUyMTk1MDYwLCAweDFhMDAwMDBmLCAweGUxYjA0YjAyLAotICAweGUyMDI0YjAxLCAweDAwMDQ0MGEyLCAweGUwOTIyMDA0LCAweGUyYjExMDAwLAotICAweGUyYTMzMDAwLCAweDIzYTAxMTAyLCAweGUxYTAyNWEyLCAweGUxYTAyNTgyLAotICAweGUyNTM1YjBmLCAweDlhMDAwMDFhLCAweGUyODU0MDAxLCAweGUzNTQwYjAyLAotICAweDMxYTBmMDA3LCAweGUzYTAyMDAwLCAweGVhZmZmZmRhLCAweGUzNTUwMDYwLAotICAweDExYjA0YTgyLCAweDEwMzA1ZDA1LCAweDVhZmZmZmYyLCAweGUyOTIyYjAyLAotICAweGUyYjExMDAwLCAweDIzYTAxMTAyLCAweGUyYTMzMDAwLCAweGUxYTAyNWEyLAotICAweGUxYTAyNTgyLCAweGUyNTM1YjBmLCAweDlhMDAwMDA5LCAweGUyODU0MDAxLAotICAweGUzNTQwYjAyLCAweDMxYTBmMDA3LCAweGUzYTAyMDAwLCAweGVhZmZmZmM5LAotICAweGUzMTMwMGZmLCAweDExYTBmMDA3LCAweGUxOTIyMDAxLCAweDAxYTBmMDA3LAotICAweGVhZmZmZmNmLCAweGUzNzUwMDM0LCAweGRhZmZmZmNkLCAweGUyNjU1MDBjLAotICAweGUyNTU0MDIwLCAweDIxYTAyNDMxLCAweDMxYTAyNTMyLCAweDIxYTAxNDEyLAotICAweGUxYTAyNTEyLCAweGUxYTBmMDA3LCAweGUxYTAzMDgwLCAweGUxYjAzYWEzLAotICAweDEyODM0MDAxLCAweDEzMzQwYjAyLCAweDBhMDAwMDIzLCAweGUyODMzYjBmLAotICAweGUyMTk1MDYwLCAweDFhMDAwMDBmLCAweGUxYjA0MjAxLCAweGUxYTAxYWExLAotICAweGUxODExNTgwLCAweGUzODExMTAyLCAweGUyMDE0MDgwLCAweDAwMDQ0MGExLAotICAweGUwOTExMDA0LCAweDIzYTAxMTAyLCAweGUyYTMzMDAwLCAweGUzYzExMGZmLAotICAweGUzYTAyMDAwLCAweGUyNTM1ZGZlLCAweDlhZmZmZmFiLCAweGUzNTUwMGZmLAotICAweDMxYTBmMDA3LCAweGVhZmZmZmEzLCAweGUxYjA0MTgxLCAweGUxYTAxYWExLAotICAweGUxODExNTgwLCAweGUzODExMTAyLCAweDEzNTUwMDYwLCAweDEwMzA1ZDA1LAotICAweDVhZmZmZmYxLCAweGUyOTExYzAxLCAweDIzYTAxMTAyLCAweGUyYTMzMDAwLAotICAweGUzYTAyMDAwLCAweGUzYzExMGZmLCAweGUyNTM1ZGZlLCAweDlhZmZmZjlhLAotICAweGUzNTUwMGZmLCAweDMxYTBmMDA3LCAweGVhZmZmZjkyLCAweGUxODMzMjAzLAotICAweGUxOTEyNjAwLCAweDAxYTBmMDA3LCAweGUxYTAyNTgxLCAweGUxYTAxYWExLAotICAweGUxODExNTgwLCAweGUzMTMwMGZmLCAweDExYTBmMDA3LCAweGVhZmZmZjk0LAotICAweGUzMTkwMDgwLCAweDFhZmZmNTRjLCAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LAotICAweDRhZmZmZWIwLCAweGUwOGM3YzI3LCAweGUwOGNiNDJhLCAweGU4OTcwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmOWMzLCAweGUxYTA0ODgzLAotICAweGUyOTQ0ODAyLCAweDBhMDAwMDBiLCAweGU5MmM0MDAwLCAweGViZmZmODNjLAotICAweGU4YmM0MDAwLCAweGUyOGY3MDE0LCAweDFhZmZmYTk2LCAweGUxODk4NjI5LAotICAweGUzMTgwMDgwLCAweDBhZmZmZjRlLCAweGUzMTkwMDgwLCAweDFhZmZmZjgxLAotICAweGU4OGIwMDBmLCAweGVhZmZmNTUzLCAweGUxOTI4MDAxLCAweDBhMDAwMDAzLAotICAweGUzODExMTAxLCAweGUyNGY3MDFjLCAweGUzYTA0MDAxLCAweGVhZmZmYTg5LAotICAweGUzYTAyMDAwLCAweGUyNGY3MDJjLCAweGVhZmZmZjY2LCAweGUzMTkwMDgwLAotICAweDFhZmZmNTI5LCAweGUxYjA3ZTA5LCAweGUyMDlhYTA3LCAweDRhZmZmZWMwLAotICAweGUwOGM4YzI3LCAweGUwOGNiNDJhLCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmOWEwLCAweDE4ODgwMDBmLCAweGUxYjA0ODgzLAotICAweDEyOTQ0ODAyLCAweDBhMDAwMDYzLCAweGUzMTAwMTAyLCAweDFhMDAwMDU5LAotICAweGUyODMzOTAxLCAweGUyNDMzMDAxLCAweGUxYjAzMGEzLCAweGUxYTA1MDAyLAotICAweDMyNDE0MTAyLCAweDIyNDE0MTAxLCAweDMzYTA3MjAxLCAweDIzYTA3MjAyLAotICAweGUzYTAxMTAyLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUwMjE2MDA3LAotICAweDMxNTQwMDA2LCAweDIwNDQ0MDA2LCAweDIwMjExMDg3LCAweGUxYjA3MGU3LAotICAweDVhZmZmZmY3LCAweGUxOTQyMDA1LCAweDExODkyNjI5LCAweDEyMTIyMDgwLAotICAweDAzYTA3MDAwLCAweDBhMDAwMDE4LCAweGUzYTAyMDAwLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUwYTAwMDAwLCAweGUwMjI2MDA3LCAweGUwNTVhMDA2LAotICAweGUwZDQ4MDAxLCAweDMxYjAwMGEwLCAweDIxYTA1MDBhLCAweDIxYTA0MDA4LAotICAweDIwMjIyMDg3LCAweDIwMjExZmE3LCAweGUxYjA3MGE3LCAweDFhZmZmZmYyLAotICAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUwYjcwMDA3LCAweGUwZDVhMDAyLAotICAweGUwZDQ4MDAxLCAweDMxYjAwMGEwLCAweDIxYTA1MDBhLCAweDIxYTA0MDA4LAotICAweDIyMjIyMDAxLCAweDIzYTA3MTAyLCAweGUzYTAwMDAwLCAweGUzMTkwNzAyLAotICAweDFhMDAwMDA4LCAweGUxOTU0MDA0LCAweDAxOTQ0MDA3LCAweDEzODIyMDAxLAotICAweGUyOGY3MDQ0LCAweGUzNTMwMDAwLCAweGRhZmZmZjI5LCAweGUzMTkwMDgwLAotICAweDBhZmZmZWY3LCAweGVhZmZmZjJiLCAweGUyMTk2MDYwLCAweDFhMDAwMDE1LAotICAweGUwOTc3MDA3LCAweGUwYjU1MDA1LCAweGUwYjQ0MDA0LCAweDJhMDAwMDAyLAotICAweGUxNTQwMDAxLCAweDAxNTUwMDAyLCAweDAzNTcwMTAxLCAweGUyYjIyMDAwLAotICAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweDIzYTAxMTAyLCAweGU1OWM1MDgwLAotICAweGUzMTUwMDEwLCAweDBhMDAwMDAxLCAweGU4OGIwMDBmLCAweGVhZmZmNGVkLAotICAweGUzODU1MDEwLCAweGU1OGM1MDgwLCAweGUzMTUwNjAxLCAweDBhZmZmZmY5LAotICAweGUzYTAwMDEwLCAweGVhMDAwOGI0LCAweGUxOTQ1MDA1LCAweDAxOTU1MDA3LAotICAweDEzNTYwMDYwLCAweDBhZmZmZmYwLCAweGUxMzAwYzg2LCAweDRhZmZmZmVlLAotICAweGUyOTIyMDAxLCAweGVhZmZmZmU5LCAweGUzYTAxNGM1LCAweGUzYTAyMDAwLAotICAweGUzYTAzMGZmLCAweGUxODMzMzgzLCAweGUzODExMTAxLCAweGUyNGY3MDVjLAotICAweGUzYTA0MDAxLCAweGVhZmZmYTEzLCAweGUzNTMwMDAwLCAweDFhMDAwMDA4LAotICAweGUxOTE0MDAyLCAweDBhZmZmZmUzLCAweGUxYjAxMDAxLCAweDRhZmZmZjk1LAotICAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLAotICAweGVhZmZmZjkwLCAweGUxOTE0MDAyLCAweDFhZmZmZmVlLCAweGUzMTAwMTAyLAotICAweDBhZmZmZmQ1LCAweGVhZmZmZmU3LCAweGUzMTkwMDgwLCAweDFhZmZmNGE2LAotICAweGUxYjA4ZTA5LCAweDRhZmZmZTFhLCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLAotICAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LAotICAweDFhZmZmOTFkLCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLAotICAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLAotICAweDBhZmZmYTRkLCAweGU4ODgwMDBmLCAweGUxYTBiMDAzLCAweGUxYTBhMDAyLAotICAweGUxYTA4MDAxLCAweGUyMDA0MTAyLCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LAotICAweGU4OTYwMDBmLCAweGUxMzQwMDAwLCAweDRhMDAwMGI2LCAweGUxYjA0ZDIzLAotICAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LCAweDFhZmZmOTA2LAotICAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLAotICAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDBhZmZmYTM2LAotICAweGU4ODYwMDBmLCAweGUzYTA2ODAyLCAweGUwOTY1ODgzLCAweDMwOTY1ODhiLAotICAweDJhMDAwMDYxLCAweGUwNTM0MDBiLCAweDRhMDAwMDQ2LCAweGUyNzQ1MDIwLAotICAweGRhMDAwMDBlLCAweGUwOTIyNDNhLCAweDIwODIyNTE4LCAweDMwOTIyNTE4LAotICAweGUwYjExNDM4LCAweGUxYTA4NTFhLCAweGUxYTBhMDg4LCAweDJhMDAwMDExLAotICAweGUzMTkwNzAyLCAweDFhMDAwMDFkLCAweGUxOWFhMDA4LCAweDEzODIyMDAxLAotICAweGUyOGY3MDkwLCAweGUzMTkwMDgwLCAweDBhZmZmZTdkLCAweGVhZmZmZWIxLAotICAweGUzNTQwMDQwLCAweGMxOGFhMDA4LCAweGMzYTA4MDAwLCAweGFhMDAwMDBiLAotICAweGUyNDQ0MDIwLCAweGUyNjQ1MDIwLCAweGUwOTIyNDM4LCAweGUyYjExMDAwLAotICAweGUxYTA4NTE4LCAweGUxOGFhMDg4LCAweGUyYTMzMDAwLCAweDIxOGFhMDA4LAotICAweDIxYTA4ZjgyLCAweDIxYTAyMGEyLCAweDIxODIyZjgxLCAweDIxYTAxMDYxLAotICAweGUzMTkwNzAyLCAweDFhMDAwMDA1LCAweGUxOWFhMDA4LCAweDEzODIyMDAxLAotICAweGUyOGY3MDMwLCAweGUzMTkwMDgwLCAweDBhZmZmZTY1LCAweGVhZmZmZTk5LAotICAweGUyMTk3MDYwLCAweDFhMDAwMDE0LCAweGUxOWFhMDg4LCAweDAwMDg4ZjgyLAotICAweGUwOTIyZmE4LCAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweDIzYTAxMTAyLAotICAweGUwOTY1ODgzLCAweDBhMDAwMDNiLCAweGU1OWM1MDgwLCAweGUzMTUwMDEwLAotICAweDBhMDAwMDAzLCAweGUyMDk5YTA3LCAweGUwOGM5NDI5LCAweGU4ODkwMDBmLAotICAweGVhZmZmNDVjLCAweGUzODU1MDEwLCAweGU1OGM1MDgwLCAweGUzMTUwNjAxLAotICAweDBhZmZmZmY3LCAweGUzYTAwMDEwLCAweGVhMDAwODIzLCAweGUxOWFhMDA4LAotICAweDEzNTcwMDYwLCAweDBhZmZmZmVmLCAweGUxMzAwYzg3LCAweDRhZmZmZmVkLAotICAweGUyOTIyMDAxLCAweGVhZmZmZmU2LCAweGUyNjQ0MDAwLCAweGUxYTAzMDBiLAotICAweGUxYTA1MDAxLCAweGUxYTAxMDA4LCAweGUxYTA4MDA1LCAweGUxYTA1MDAyLAotICAweGUxYTAyMDBhLCAweGUxYTBhMDA1LCAweGUyNzQ1MDIwLCAweGRhZmZmZmJmLAotICAweGUwOTIyNDNhLCAweDIwODIyNTE4LCAweDMwOTIyNTE4LCAweGUwYjExNDM4LAotICAweGUxYTA4NTFhLCAweGUxYTBhMDg4LCAweDJhZmZmZmMyLCAweGUzMTkwNzAyLAotICAweDFhZmZmZmNlLCAweGUxOWFhMDA4LCAweDEzODIyMDAxLCAweGUyNGY3MGFjLAotICAweGUzMTkwMDgwLCAweDBhZmZmZTJlLCAweGVhZmZmZTYyLCAweGUwOTY1ODgzLAotICAweDFhMDAwMDAxLCAweGUxOTI1MDAxLCAweDFhMDAwMDA2LCAweGUwOTY1ODhiLAotICAweDFhZmZmZmNjLCAweGUxYTAzMDBiLCAweGUxYTAxMDA4LCAweGUxYTAyMDBhLAotICAweGUxOTE1MDAyLCAweDBhZmZmZmM3LCAweGUzODExMTAxLCAweGUyNGY3MGVjLAotICAweGUzYTA0MDAxLCAweGVhZmZmOTYzLCAweGUzYTAzMGZmLCAweGUxODMzMzgzLAotICAweGUzYTAyMDAwLCAweGUzYTAxMDAwLCAweGUyNGY3ZjQyLCAweGUzYTA0MDA0LAotICAweGVhZmZmOTVjLCAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LAotICAweGUzNTQwMDA4LCAweDFhZmZmODdjLCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLAotICAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLAotICAweDEyODMzZGZlLCAweDBhZmZmOWFjLCAweGU4ODYwMDBmLCAweGUwMjAwNTg5LAotICAweGVhZmZmZjczLCAweGUzMTkwMDgwLCAweDFhZmZmM2VmLCAweGUxYjA4ZTA5LAotICAweDRhZmZmZDY4LCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLAotICAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LCAweDFhZmZmODY2LAotICAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLAotICAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDBhZmZmOTk2LAotICAweGU4ODgwMDBmLCAweGUxYTBiMDAzLCAweGUxYTBhMDAyLCAweGUxYTA4MDAxLAotICAweGUyMDA0MTAyLCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LCAweGU4OTYwMDBmLAotICAweGUxMzQwMDAwLCAweDRhZmZmZmQyLCAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLAotICAweGUyOGY3MDI0LCAweGUzNTQwMDA4LCAweDFhZmZmODRmLCAweGUzYTAyMDAwLAotICAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweDExYTAxNDAwLAotICAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDBhZmZmOTdmLCAweGU4ODYwMDBmLAotICAweGUwMjAwNTg5LCAweGUzYTA2ODAyLCAweGUwOTY1ODgzLCAweDMwOTY1ODhiLAotICAweDJhMDAwMDZiLCAweGUwNTM0MDBiLCAweDAxNTEwMDA4LCAweDAxNTIwMDBhLAotICAweDBhMDAwMDc4LCAweDNhMDAwMDRjLCAweGUzYTA3MDAwLCAweGUyNzQ1MDIwLAotICAweGRhMDAwMDE1LCAweGUwNTc2NTFhLCAweGUwZDIyNDNhLCAweDMwNDIyNTE4LAotICAweDIwNTIyNTE4LCAweGUwZDExNDM4LCAweDVhMDAwMDFiLCAweGUzMTkwNzAyLAotICAweDFhMDAwMDI5LCAweGUxOTc3MDA2LCAweDEzODIyMDAxLCAweGUyOGY3MGMwLAotICAweGUzMTkwMDgwLCAweDBhZmZmZGMyLCAweGVhZmZmZGY2LCAweDEzYTA2MTAyLAotICAweGUzYTA3MDAxLCAweGUxOTg1MDBhLCAweDBhMDAwMDI5LCAweGUyNTIyMDAxLAotICAweGUyZDExMDAwLCAweDVhMDAwMDBjLCAweGVhMDAwMDExLCAweGUzYTA2MDAwLAotICAweGUzNTQwMDQwLCAweGFhZmZmZmY0LCAweGUyNDQ0MDIwLCAweGUyNjQ1MDIwLAotICAweGUwNTc3NTFhLCAweGUwZDY2NDNhLCAweDMwNDY2NTE4LCAweDIwNTY2NTE4LAotICAweGUwZDIyNDM4LCAweGUyZDExMDAwLCAweDRhMDAwMDA1LCAweGUwOTc3MDA3LAotICAweGUwYjY2MDA2LCAweGUwYjIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLAotICAweDVhZmZmZmY5LCAweGUzMTkwNzAyLCAweDFhMDAwMDA3LCAweGUzNTMwMDAwLAotICAweGRhMDAwMDRjLCAweGUxOTc3MDA2LCAweDEzODIyMDAxLCAweGUyOGY3MDMwLAotICAweGUzMTkwMDgwLCAweDBhZmZmZDllLCAweGVhZmZmZGQyLCAweGUyMTk1MDYwLAotICAweDFhMDAwMDBlLCAweGUxOTc3MDg2LCAweDAwMDY2ZjgyLCAweGUwOTIyZmE2LAotICAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweDIzYTAxMTAyLCAweGUxYjAzMDAzLAotICAweDRhMDAwMDQyLCAweGU1OWM1MDgwLCAweGUzMTUwMDEwLCAweDBhZmZmZjNjLAotICAweGUyMDk5YTA3LCAweGUwOGM5NDI5LCAweGU4ODkwMDBmLCAweGVhZmZmMzk1LAotICAweGUxOTc3MDA2LCAweDEzNTUwMDYwLCAweDBhZmZmZmYzLCAweGUxMzAwYzg1LAotICAweDRhZmZmZmYxLCAweGUyOTIyMDAxLCAweGVhZmZmZmVjLCAweGUyNjQ0MDAwLAotICAweGUyMjAwMTAyLCAweGUxYTAzMDBiLCAweGUxYTA1MDAxLCAweGUxYTAxMDA4LAotICAweGUxYTA4MDA1LCAweGUxYTA1MDAyLCAweGUxYTAyMDBhLCAweGUxYTBhMDA1LAotICAweGUzYTA3MDAwLCAweGUyNzQ1MDIwLCAweGRhZmZmZmJmLCAweGUwNTc2NTFhLAotICAweGUwZDIyNDNhLCAweDMwNDIyNTE4LCAweDIwNTIyNTE4LCAweGUwZDExNDM4LAotICAweDVhZmZmZmM1LCAweGUzMTkwNzAyLCAweDFhZmZmZmQzLCAweGUxOTc3MDA2LAotICAweDEzODIyMDAxLCAweGUyNGY3MDk4LCAweGUzMTkwMDgwLCAweDBhZmZmZDZjLAotICAweGVhZmZmZGEwLCAweGUwOTY1ODgzLCAweDFhMDAwMDA1LCAweGUxOTI1MDAxLAotICAweDFhZmZmZjQ0LCAweGUxNTMwMDBiLCAweDAxOTg1MDBhLCAweDAzYTAxNGMxLAotICAweDBhZmZmZjQwLCAweGUwOTY1ODhiLCAweDFhZmZmZmNkLCAweGUyMjAwMTAyLAotICAweGUxYTAzMDBiLCAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxOTE1MDAyLAotICAweDBhZmZmZmM3LCAweGVhZmZmZjM3LCAweGUzYTAzMDAwLCAweGUzYTAyMDAwLAotICAweGUzYTAxMDAwLCAweGVhZmZmZmMyLCAweGUzYTAzMDAwLCAweGUzYTAyMDAwLAotICAweGUzYTAxMDAwLCAweGUyNGY3ZjQyLCAweGUzYTA0MDA4LCAweGVhZmZmODk1LAotICAweGUyNjMzMDAwLCAweGUyNzM0MDIwLCAweDQyNDM1MDIwLCAweDQxYTAyNTMxLAotICAweDUxYTAyMzMyLCAweDUxODIyNDExLCAweGUxYTAxMzMxLCAweGUzYTAzMDAwLAotICAweGVhZmZmZmIzLCAweGUzMTkwMDgwLCAweDFhZmZmMzJmLCAweGUxYjA4ZTA5LAotICAweDRhZmZmY2FkLCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLAotICAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LCAweDFhZmZmN2E2LAotICAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLAotICAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDBhZmZmOGQ2LAotICAweGU4ODgwMDBmLCAweGUyMDAwMTAyLCAweGUxODNiMDAwLCAweGUxYTBhMDAyLAotICAweGUxYTA4MDAxLCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LCAweGU4OTYwMDBmLAotICAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LAotICAweDFhZmZmNzkxLCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLAotICAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLAotICAweDBhZmZmOGMxLCAweGU4ODYwMDBmLCAweGUwMjAwMDBiLCAweGUzY2JiMTAyLAotICAweGUzYTA2ODAyLCAweGUzNTMwMDAwLCAweDEzNWIwMDAwLCAweDBhMDAwMDhjLAotICAweGUwOTY1ODgzLCAweDMwOTY1ODhiLCAweDJhZmZmZWU3LCAweGUzYjA1NGZmLAotICAweGUwYTMzMDBiLCAweGUxODViNDI1LCAweGUwNDMzOTJiLCAweGUxOWE0MDg4LAotICAweDExOTI0MDgxLCAweDBhMDAwMDY0LCAweGU5MmM0MjA5LCAweGUxYTA0ODIxLAotICAweGUxYzE1MDBiLCAweGUxYTA2ODIyLCAweGUxYzI3MDBiLCAweGUxYzg5MDBiLAotICAweGUxYTA4ODI4LCAweGUxY2FiMDBiLCAweGUxYTBhODJhLCAweGUwMDMwYjk2LAotICAweGUwMDIwYjk0LCAweGUwMDEwOTk0LCAweGUwMDAwYTk3LCAweGUwOTMzMDAwLAotICAweGUwMDAwYTk1LCAweGUwYjIyMDAwLCAweGUwMDAwODk1LCAweGUwYjExMDAwLAotICAweDMzYTBlMDAwLCAweDIzYTBlMDAxLCAweGUwMDAwOTk2LCAweGUwOTIyMDAwLAotICAweGUyYjExMDAwLCAweGUyYWVlMDAwLCAweGUwMDAwODk3LCAweGUwOTIyMDAwLAotICAweGUyYjExMDAwLCAweGUyYWVlMDAwLCAweGUxOGVlODAzLCAweGUxYTAzODIzLAotICAweGUxODMzODAyLCAweGUxYTAyODIyLCAweGUxODIyODAxLCAweGUxYTAxODIxLAotICAweGUxODExODBlLCAweGUzY2VlMGZmLCAweGUwMDAwYjk1LCAweGUwMGIwYjk3LAotICAweGUwOWViMDBiLCAweGUwYjMzMDAwLCAweGUwMDAwODk2LCAweGUwYjIyMDAwLAotICAweGUwMDAwODk0LCAweGUwYTExMDAwLCAweGUwMDAwYTk0LCAweGUwMGEwYTk2LAotICAweGUwOWFhMDAzLCAweGUwYjIyMDAwLCAweGUyYTExMDAwLCAweGUwMDAwOTk3LAotICAweGUwOWFhMDAwLCAweGUwMDAwOTk1LCAweGUwYjIyMDAwLCAweGUyYjExMDAwLAotICAweGU4YmM0MjA5LCAweDVhMDAwMDA5LCAweGUzMTkwNzAyLCAweDFhMDAwMDE3LAotICAweGUxOWJiMDBhLCAweDEzODIyMDAxLCAweGUzNTMwMDAwLCAweGRhZmZmZjc5LAotICAweGUyOGY3MDc4LCAweGUzMTkwMDgwLCAweDBhZmZmY2NkLCAweGVhZmZmZDAxLAotICAweGUwOWJiMDBiLCAweGUwYmFhMDBhLCAweGUwYjIyMDAyLCAweGUwYjExMDAxLAotICAweGUyNDMzMDAxLCAweDVhZmZmZmY5LCAweGUzMTkwNzAyLCAweDFhMDAwMDA3LAotICAweGUzNTMwMDAwLCAweGRhZmZmZjZiLCAweGUxOWJiMDBhLCAweDEzODIyMDAxLAotICAweGUyOGY3MDM4LCAweGUzMTkwMDgwLCAweDBhZmZmY2JkLCAweGVhZmZmY2YxLAotICAweGUyMTk1MDYwLCAweDFhMDAwMDFjLCAweGUxOWJiMDhhLCAweDAwMGFhZjgyLAotICAweGUwOTIyZmFhLCAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweDIzYTAxMTAyLAotICAweGUyOTM0MDAxLCAweGRhMDAwMDFiLCAweGUxYjA0N2E0LCAweDFhZmZmZTkxLAotICAweGU1OWM1MDgwLCAweGUzMTUwMDEwLCAweDBhZmZmZTU5LCAweGUyMDk5YTA3LAotICAweGUwOGM5NDI5LCAweGU4ODkwMDBmLCAweGVhZmZmMmIyLCAweGUxOWE0MDg4LAotICAweDExYTAyMDBhLCAweDExYTAxMDA4LCAweGUyNDMzMDAxLCAweGUzMTkwNzAyLAotICAweDFhZmZmZmVlLCAweGUzNTMwMDAwLCAweGRhZmZmZjRhLCAweGUyNGY3MDQ0LAotICAweGUzMTkwMDgwLCAweDBhZmZmYzllLCAweGVhZmZmY2QyLCAweGUxOWJiMDBhLAotICAweDEzNTUwMDYwLCAweDBhZmZmZmU1LCAweGUxMzAwYzg1LCAweDRhZmZmZmUzLAotICAweGUyOTIyMDAxLCAweGVhZmZmZmRlLCAweGUyNjMzMDAwLCAweGUzNTMwMDQwLAotICAweGFhZmZmZjNjLCAweGUyNzM0MDIwLCAweDQyNDM1MDIwLCAweDQxYTAyNTMxLAotICAweDUxYTAyMzMyLCAweDUxODIyNDExLCAweGUxYTAxMzMxLCAweGUzYTAzMDAwLAotICAweGVhZmZmZmRhLCAweGUzNTMwMDAwLCAweDFhMDAwMDAzLCAweGUxOTE1MDAyLAotICAweDBhMDAwMDBjLCAweGUzNWIwMDAwLCAweDFhZmZmZjZjLCAweGUxOTg1MDBhLAotICAweDFhZmZmZjZhLCAweGUwOTY1ODgzLCAweDMzYTAzMDAwLCAweDMzYTAyMDAwLAotICAweDMzYTAxMDAwLCAweDNhZmZmZmNkLCAweGUxOTE1MDAyLCAweDFhZmZmZTU5LAotICAweGUzYTAxNGMyLCAweGVhZmZmZTU3LCAweGUwOTY1ODhiLCAweDNhZmZmZmM3LAotICAweGUxOTg1MDBhLCAweDFhZmZmZTQ4LCAweGUxYTAzMDBiLCAweGVhZmZmZmY3LAotICAweGUzMTkwMDgwLCAweDFhZmZmMjVjLCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LAotICAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LAotICAweGUzNTQwMDA4LCAweDFhZmZmNmQ0LCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLAotICAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLAotICAweDEyODMzZGZlLCAweDBhZmZmODA0LCAweGU4ODYwMDBmLCAweGUyMDAwMTAyLAotICAweGUxODNiMDAwLCAweGUxYTBhMDAyLCAweGUxYTA4MDAxLCAweGUxYjA2ZTA5LAotICAweDRhZmZmYmQxLCAweGUwOGM2YzI2LCAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLAotICAweDBhMDAwMDM1LCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LCAweDFhZmZmNmJlLAotICAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLCAweDEzMzMwMGZmLAotICAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLCAweDBhZmZmN2VlLAotICAweGU4ODYwMDBmLCAweGVhMDAwMDI4LCAweGUzMTkwMDgwLCAweDFhZmZmMjMyLAotICAweGUxYjA4ZTA5LCAweDRhZmZmYmI2LCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLAotICAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LCAweGUzNTQwMDA4LAotICAweDFhZmZmNmE5LCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLCAweGUxYjAzYzIzLAotICAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLCAweDEyODMzZGZlLAotICAweDBhZmZmN2Q5LCAweGU4ODgwMDBmLCAweGUyMDAwMTAyLCAweGUxODNiMDAwLAotICAweGUxYTBhMDAyLCAweGUxYTA4MDAxLCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LAotICAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLCAweDBhMDAwMDBiLCAweGUyOGY3MDI0LAotICAweGUzNTQwMDA4LCAweDFhZmZmNjk0LCAweGUzYTAyMDAwLCAweGUxYTAzMDgwLAotICAweGUxYjAzYzIzLCAweDEzMzMwMGZmLCAweDExYTAxNDAwLCAweDEzODExMTAyLAotICAweDEyODMzZGZlLCAweDBhZmZmN2M0LCAweGU4ODYwMDBmLCAweGUwMjAwMDBiLAotICAweGUzY2JiMTAyLCAweGUxYjA0ODgzLCAweDExYjA1ODhiLCAweDEyOTQ0ODAyLAotICAweDEyOTU1ODAyLCAweDBhMDAwMDgyLCAweGUwNDMzMDBiLCAweGUyODMzOTAxLAotICAweGUyNDMzMDAxLCAweGUzYTBiMDAwLCAweGUwNTI1MDBhLCAweGUwZDE0MDA4LAotICAweDIzYTAxMDAzLCAweDJhMDAwMDBjLCAweGUxYTA1MDAyLCAweGUxYTA0MDAxLAotICAweGUzYTAxMDAxLCAweGUyNDMzMDAxLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LAotICAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLAotICAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYTExMDAxLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LAotICAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYTExMDAxLAotICAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLAotICAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LAotICAweGUwYTExMDAxLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLAotICAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LAotICAweDIxYTA0MDA2LCAweGUwYjExMDAxLCAweDNhZmZmZmRhLCAweGUxOTQyMDA1LAotICAweDExODkyNjI5LCAweDEyMTIyMDgwLCAweDBhMDAwMDI1LCAweGUzYTAyMDAxLAotICAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLAotICAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LAotICAweGUwYTIyMDAyLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLAotICAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLCAweDIxYTA1MDA3LAotICAweDIxYTA0MDA2LCAweGUwYTIyMDAyLCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LAotICAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LCAweDMxYjBiMGFiLAotICAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYTIyMDAyLCAweGUwOTU1MDA1LAotICAweGUwYjQ0MDA0LCAweGUyYWJiMDAwLCAweGUwNTU3MDBhLCAweGUwZDQ2MDA4LAotICAweDMxYjBiMGFiLCAweDIxYTA1MDA3LCAweDIxYTA0MDA2LCAweGUwYjIyMDAyLAotICAweDNhZmZmZmRhLCAweGUzMTkwNzAyLCAweDFhMDAwMDA3LCAweGUxOTU0MDA0LAotICAweDEzODIyMDAxLCAweGUzNTMwMDAwLCAweGRhZmZmZTYyLCAweGUyOGY3MDQ4LAotICAweGUzMTkwMDgwLCAweDBhZmZmYmI2LCAweGVhZmZmYmVhLCAweGUyMTk3MDYwLAotICAweDFhMDAwMDE0LCAweGUwOTU1MDA1LCAweGUwYjQ0MDA0LCAweDJhMDAwMDAyLAotICAweGUxNTQwMDA4LCAweDAxNTUwMDBhLCAweDAxMTUwMGEyLCAweGUyYjIyMDAwLAotICAweGUyYjExMDAwLCAweGUyYTMzMDAwLCAweDIzYTAxMTAyLCAweGUyOTM0MDAxLAotICAweGRhZmZmZjEwLCAweGUxYjA0N2E0LCAweDFhZmZmZDg2LCAweGU1OWM1MDgwLAotICAweGUzMTUwMDEwLCAweDBhZmZmZDRlLCAweGUyMDk5YTA3LCAweGUwOGM5NDI5LAotICAweGU4ODkwMDBmLCAweGVhZmZmMWE3LCAweGUxOTQ1MDA1LCAweDEzNTcwMDYwLAotICAweDBhZmZmZmYxLCAweGUxMzAwYzg3LCAweDRhZmZmZmVmLCAweGUyOTIyMDAxLAotICAweGVhZmZmZmVhLCAweGUxYjA0ODgzLCAweDFhMDAwMDEzLCAweGUxOTE1MDAyLAotICAweDFhMDAwMDBkLCAweGUxYjA1ODhiLCAweDAxOTg2MDBhLCAweDAzYTAxNGMzLAotICAweDAzYTAzMGZmLCAweDAxODMzMzgzLCAweDBhZmZmZDZhLCAweGUyOTU1ODAyLAotICAweDFhZmZmZmU4LCAweGUxOTg2MDBhLCAweDBhZmZmZmU2LCAweGUxYTAxMDA4LAotICAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmZDYyLCAweGUwOTIyMDAyLAotICAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLCAweGUxYjA1ODhiLAotICAweDFhMDAwMDEwLCAweGUxOTg2MDBhLCAweDFhMDAwMDBhLCAweGUyOTQ0ODAyLAotICAweDFhMDAwMDAxLCAweGUxOTE2MDAyLCAweDFhZmZmZDU2LCAweGUzYTAxMDAwLAotICAweGUzYTAyMDAwLCAweGUzYTAzMGZmLCAweGUxODMzMzgzLCAweGUyNGY3MGJjLAotICAweGUzYTA0MDAyLCAweGVhZmZmNmI3LCAweGUwOWFhMDBhLCAweGUwYjg4MDA4LAotICAweGUyNGJiMDAxLCAweDVhZmZmZmZiLCAweGUyOTU2ODAyLCAweDEyOTQ2ODAyLAotICAweDFhZmZmZjUwLCAweGUyOTQ2ODAyLCAweDFhMDAwMDA2LCAweGUxOTE2MDAyLAotICAweDFhZmZmZDQ0LCAweGUyOTU2ODAyLCAweDFhZmZmZmJmLCAweGUxOTg2MDBhLAotICAweDAzYTAxMzMxLCAweDBhZmZmZDNmLCAweGUxOTg2MDBhLCAweDBhZmZmZTA5LAotICAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmZDM5LAotICAweGUzMTkwMDgwLCAweDFhZmZmMTQ0LCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LAotICAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmNWJlLAotICAweDE4ODYwMDBmLCAweGUyMDAwMTAyLCAweGUxODNiMDAwLCAweGUxYTBhMDAyLAotICAweGUxYTA4MDAxLCAweGUxYjA2ZTA5LCAweDRhZmZmYWNkLCAweGUwOGM2YzI2LAotICAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmNWIyLAotICAweDE4ODYwMDBmLCAweGVhMDAwMDE0LCAweGUzMTkwMDgwLCAweDFhZmZmMTJlLAotICAweGUxYjA4ZTA5LCAweDRhZmZmYWJjLCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmNWE3LCAweDE4ODgwMDBmLAotICAweGUyMDAwMTAyLCAweGUxODNiMDAwLCAweGUxYTBhMDAyLCAweGUxYTA4MDAxLAotICAweGUyMDk2ODA3LCAweGUwOGM2NjI2LCAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmNTljLCAweDE4ODYwMDBmLCAweGUxYTA3MDBiLAotICAweGUzY2JiMTAyLCAweGUxYjA0ODgzLCAweDEyOTQ0ODAyLCAweDExYjA1ODhiLAotICAweDEyOTU1ODAyLCAweDBhMDAwMDRlLCAweGU5MmM0MjAwLCAweDVhMDAwMDM1LAotICAweGUyNGI0YzNmLCAweGUyNDQ0MGZlLCAweGUzNTQwMDEwLCAweGNhMDAwMDJhLAotICAweGUxOWE1NDE4LCAweDFhMDAwMDJmLCAweGUyNjQ5MDIwLCAweGUxYTA5OTM4LAotICAweGUwMDAwZjg5LCAweGU5MmMwMDgwLCAweGUzYTA4MTAyLCAweGUzYTBhMDAwLAotICAweGUzYTA3OTAxLCAweGUyNTdiMDAxLCAweGU5MmMwZDgwLCAweDNiZmZmMmI2LAotICAweGUxYjA5MGE5LCAweDNhZmZmZmZjLCAweGU4YmMwZDgwLCAweDE5MmMwMDBmLAotICAweGViZmZmMmI1LCAweGUyODM0MDAxLCAweDBhMDAwMDA5LCAweGUzNTQwOTAyLAotICAweGFhMDAwMDEwLCAweGU4YmMwZDgwLCAweGU5MmMwMDBmLCAweGUxYTAwMDA3LAotICAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGViZmZmMmFhLAotICAweGVhZmZmZmVlLCAweGU4YmMwMDgwLCAweGUzMTcwMTAyLCAweDFiZmZmMmYzLAotICAweGU4YmM0MjAwLCAweGUyOTM0MDAxLCAweGRhZmZmZTZhLCAweGUxYjA0N2E0LAotICAweDFhZmZmY2UwLCAweGVhMDAwMGNiLCAweGUyOGNjMDEwLCAweGU4YmM0MjgwLAotICAweGUzMTcwMTAyLCAweDFhZmZmZGEzLCAweGVhZmZmY2RhLCAweGUzNTQwMDQwLAotICAweDJhMDAwMDEyLCAweGUyNTQ1MDIwLCAweDIxYjA2NTFhLCAweDBhMDAwMDEwLAotICAweGUxOWE2NDE4LCAweDBhMDAwMDBlLCAweGUzMTAwMTAyLCAweDFhMDAwMDBlLAotICAweGU5MmMwMDAxLCAweGUzYTAwMDAwLCAweGU5MmMwZDgwLCAweGUzYzk5NjAxLAotICAweGViMDAwMGUxLCAweGU4YmMwZDgwLCAweGViZmZmMjhiLCAweGViMDAwMTY2LAotICAweGU4YmM0MjAxLCAweDBhMDAwMGIzLCAweGUyOGY3ZTJmLCAweGVhZmZmNjI5LAotICAweDEzYjA1MTAwLCAweDMzYTAwMDAwLCAweGVhZmZmZmYwLCAweGU4YmM0MjAwLAotICAweGUzYTAxNGM3LCAweGUzYTAyMDAwLCAweGUzYTAzMGZmLCAweGUxODMzMzgzLAotICAweGVhZmZmY2I4LCAweGUzNTQwMDAwLCAweDFhMDAwMDFlLCAweGUzNTMwMDAwLAotICAweDBhMDAwMDAyLCAweGUxOTE2MDAyLCAweDFhZmZmY2IyLCAweGVhMDAwMDAxLAotICAweGUxOTE2MDAyLCAweDFhMDAwMDEwLCAweGUxYjA1ODhiLCAweDFhMDAwMDA2LAotICAweGUxOTg2MDBhLCAweDAzYTAxMTAyLCAweDAzYTAyMDAwLCAweDAzYTAwMDAwLAotICAweDAzYTAzOTAxLCAweDAyNDMzMDAxLCAweGVhMDAwMDk2LCAweGUyOTU1ODAyLAotICAweDFhMDAwMDk0LCAweGUxOTg2MDBhLCAweDBhMDAwMDkyLCAweGUxYTAxMDA4LAotICAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmYzllLCAweGUwOTIyMDAyLAotICAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLCAweGUxYjA1ODhiLAotICAweDEyOTU1ODAyLCAweDFhZmZmZjhmLCAweGUzNWIwMDAwLCAweDBhMDAwMDA4LAotICAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAwMDA3LCAweGUxYTAzMDBiLAotICAweGUxOTg2MDBhLCAweDFhZmZmYzhmLCAweGUzMTAwMTAyLCAweDEzYTAzMDAwLAotICAweGVhMDAwMDdjLCAweGUxOTg2MDBhLCAweDBhZmZmZmRkLCAweGUwOWFhMDBhLAotICAweGUwYjg4MDA4LCAweGUyNGJiMDAxLCAweDVhZmZmZmZiLCAweGU5MmM0MjAwLAotICAweGVhZmZmZmI0LCAweGUzMTkwMDgwLCAweDFhZmZmMDhmLCAweGUxYjA4ZTA5LAotICAweDRhZmZmYTRlLCAweGUwOGM4YzI4LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmNTA4LCAweDE4ODgwMDBmLCAweGUyMDAwMTAyLAotICAweGUxODNiMDAwLCAweGUxYTBhMDAyLCAweGUxYTA4MDAxLCAweGUyMDk2ODA3LAotICAweGUwOGM2NjI2LCAweGU4OTYwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLAotICAweDFhZmZmNGZkLCAweDE4ODYwMDBmLCAweGUxYTA3MDBiLCAweGUzY2JiMTAyLAotICAweGUxYjA0ODgzLCAweDEyOTQ0ODAyLCAweDExYjA1ODhiLCAweDEyOTU1ODAyLAotICAweDBhMDAwMDBhLCAweGU5MmM0MDBmLCAweGU5MmMwZDgwLCAweGViZmZmMjdmLAotICAweGViZmZmMzZmLCAweGU4YmMwZDgwLCAweGViZmZmMjI3LCAweGUyMjAwMTAyLAotICAweGU4YmMwZDgwLCAweGViZmZmMTc4LCAweGU4YmM0MDAwLCAweGVhMDAwMDRkLAotICAweGUxYjA0ODgzLCAweDFhMDAwMDEwLCAweGUxOTE1MDAyLCAweDFhMDAwMDBhLAotICAweGUxYjA1ODhiLCAweDAxOTg2MDBhLCAweDBhMDAwMDEzLCAweGUyOTU1ODAyLAotICAweDFhMDAwMDE1LCAweGUxOTg2MDBhLCAweDBhMDAwMDEzLCAweGUxYTAxMDA4LAotICAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmYzRlLCAweGUwOTIyMDAyLAotICAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLCAweGUxYjA1ODhiLAotICAweDFhMDAwMDEyLCAweGUxOTg2MDBhLCAweDFhMDAwMDBjLCAweGUyOTQ0ODAyLAotICAweDFhMDAwMDAxLCAweGUxOTE2MDAyLCAweDFhZmZmYzQyLCAweGUzYTAxMzMzLAotICAweGUzYjAyMTAwLCAweGUyZTIzOTAyLCAweGVhZmZmYzNlLCAweGUzYTAwMDAwLAotICAweGUzYTAxMDAwLCAweGUzYTAyMDAwLCAweGUzYTAzMDAwLCAweGVhMDAwMDI5LAotICAweGUwOWFhMDBhLCAweGUwYjg4MDA4LCAweGUyNGJiMDAxLCAweDVhZmZmZmZiLAotICAweGUyOTU2ODAyLCAweDEyOTQ2ODAyLCAweDFhZmZmZmM5LCAweGUyOTQ2ODAyLAotICAweDFhMDAwMDA4LCAweGUxOTE2MDAyLCAweDFhZmZmYzJlLCAweDAzYTAxMzMzLAotICAweGUyOTU2ODAyLCAweDFhZmZmYzJiLCAweGUxOTg2MDBhLCAweDExYTAxMDA4LAotICAweDExYTAyMDBhLCAweGVhZmZmYzI3LCAweGUxOTg2MDBhLCAweDBhMDAwMDE1LAotICAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmYzIxLAotICAweGUzMTkwMDgwLCAweDFhZmZmMDJjLCAweGUxYjA3ZTA5LCAweDRhZmZmOWNiLAotICAweGUwOGM4YzI3LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLAotICAweDFhZmZmNGE1LCAweDE4ODgwMDBmLCAweGUxYjA0ODgzLCAweDEyOTQ0ODAyLAotICAweDBhMDAwMDFkLCAweGUzMTAwMTAyLCAweDFhMDAwMDE2LCAweGU5MmM0MDAwLAotICAweGViMDAwMDI5LCAweGU4YmM0MDAwLCAweGUzMTkwNzAyLCAweDFhMDAwMDA1LAotICAweGUyOGY3MDE4LCAweGUzNTMwMDAwLCAweGRhZmZmYTVkLCAweGUzMTkwMDgwLAotICAweDBhZmZmYTJiLCAweGVhZmZmYTVmLCAweGUzNTMwMDAwLCAweGJhMDAwMDA2LAotICAweGU1OWM1MDgwLCAweGUzMTUwMDEwLCAweDBhZmZmYmQxLCAweGUyMDk5YTA3LAotICAweGUwOGM5NDI5LCAweGU4ODkwMDBmLCAweGVhZmZmMDJhLCAweGUzNzMwMDQwLAotICAweGNhZmZmY2NlLCAweGVhZmZmYTRlLCAweGUzYTAxNGM2LCAweGUzYTAyMDAwLAotICAweGUzYTAzMGZmLCAweGUxODMzMzgzLCAweGVhZmZmYmY2LCAweGUzNTMwMDAwLAotICAweDFhMDAwMDA4LCAweGUxOTE0MDAyLCAweDBhZmZmZmY2LCAweGUxYjAxMDAxLAotICAweDRhZmZmZmRiLCAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLAotICAweDVhZmZmZmZiLCAweGVhZmZmZmQ2LCAweGUxOTE0MDAyLCAweDFhZmZmYmU5LAotICAweGUzMTAwMTAyLCAweDBhZmZmZmUxLCAweGVhZmZmZmVhLCAweGUyOGY0ZjUyLAotICAweGU4OTQwNTAwLCAweGUxNTEwMDA4LCAweDAxNTIwMDBhLCAweGUxYTBhMGEyLAotICAweGUxOGFhZjgxLCAweGUxYTA4MGExLCAweGUzODg4MTAyLCAweGUzYTBiMGZlLAotICAweGUxOGJiMzBiLCAweGUwNDM0MDBiLCAweDkyNDQ0MDAxLCAweGU5MmM0MjEwLAotICAweGUxYTAzMDBiLCAweDhhMDAwMDA1LCAweGUzYzg4MTAxLCAweGUwOTIyMDAyLAotICAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhMDAwMDAzLCAweGVhMDAwMDA4LAotICAweGUzYTAwMTAyLCAweGUyNzIyMDAwLCAweGUyZjExMDAwLCAweDAzNTIwMDAwLAotICAweDBhMDAwMDM1LCAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLAotICAweDVhZmZmZmY5LCAweGUzYTA3MDAwLCAweGViZmZmMWUwLCAweGU5MmMwMDBmLAotICAweGViZmZmMTg1LCAweGU5MmMwMDBmLCAweGUyOGY5MGM0LCAweGU4YjkwZDAwLAotICAweGViZmZmMTI1LCAweGU4OWMwZDgwLCAweGViZmZmMTgzLCAweGU4YjkwZDAwLAotICAweGViZmZmMGQ4LCAweGU4OWMwZDgwLCAweGViZmZmMTdmLCAweGU4YjkwZDAwLAotICAweGViZmZmMTFkLCAweGU4OWMwZDgwLCAweGU5MmMwMDBmLCAweGUzYTAwMTAyLAotICAweGU4YjkwMDBlLCAweGViZmZmMTc4LCAweGU4YjkwZDAwLCAweGViZmZmMGNkLAotICAweGUyOGM0MDEwLCAweGU4OTQwZDgwLCAweGViZmZmMTczLCAweGU4YjkwZDAwLAotICAweGViZmZmMTExLCAweGU4YmMwZDgwLCAweGViZmZmMWM0LCAweGU4YmMwZDgwLAotICAweGViZmZmMTZkLCAweGU4OWMwZDgwLCAweGViZmZmMTZiLCAweGU4YmMwZDgwLAotICAweGViZmZmMGJkLCAweGU4YmMwMDEwLCAweGViZmZmMjVlLCAweGU5MmMwMDBmLAotICAweGUzYTAwMDAwLCAweGU4YjkwMDBlLCAweGViZmZmMTYzLCAweGU4YmMwZDgwLAotICAweGViZmZmMGI1LCAweGU4YmMwMjAwLCAweGUzMTkwNjAxLCAweGUyOGY3MDc0LAotICAweDE4OTcwZDAwLCAweDFiZmZmMTVjLCAweGU4YmM4MDAwLCAweGUzYTAwMDAwLAotICAweGUzYTAzMDAwLCAweGUyOGY5MDUwLCAweGVhZmZmZmVkLCAweGI1MDRmMzMzLAotICAweGY5ZGU2NDg0LCAweDhlYWMwMjViLCAweDNlNzA3NmJiLCAweDAwMDA0MDA0LAotICAweDljMDQxZmQwLCAweGE5MzNlZjYwLCAweDAwMDA0MDA3LCAweGMwNWZmNGUwLAotICAweDZjODNiYjk2LCAweDAwMDA0MDA4LCAweGNhMjBhZDlhLCAweGI1ZTk0NmU5LAotICAweDAwMDAzZmZlLCAweDgzMTI1MTAwLCAweGI1N2Y2NTA5LCAweDAwMDA0MDAzLAotICAweDgwM2ZmODk1LCAweDlkYWNkMjI4LCAweDAwMDA0MDA1LCAweGIxNzIxN2Y3LAotICAweGQxY2Y3OWFjLCAweDAwMDAzZmZlLCAweGRlNWJkOGE5LCAweDM3Mjg3MTk1LAotICAweDAwMDAzZmZkLCAweGUzMTkwMDgwLCAweDFhZmZlZjgzLCAweGUxYjA3ZTA5LAotICAweDRhZmZmOTI2LCAweGUwOGM4YzI3LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLAotICAweGUyOGY3MDAwLCAweDFhZmZmM2ZjLCAweDE4ODgwMDBmLCAweGUxYTA0ODgzLAotICAweGUyOTQ0ODAyLCAweDBhMDAwMDA1LCAweGU5MmM0MDAwLCAweGViMDAwMDBhLAotICAweGU4YmM0MDAwLCAweDBhZmZmZjU3LCAweGUyNGY3ZDBhLCAweGVhZmZmNGNkLAotICAweGUxOTE0MDAyLCAweDFhZmZmYjYzLCAweGUzMTAwMTAyLCAweDBhZmZmZjViLAotICAweGUzYTAwMDAwLCAweGUzYTAzMDAwLCAweGVhZmZmZjU4LCAweGUyOGY0ZjZlLAotICAweGUzMTAwMTAyLCAweDEyOGY0ZjcyLCAweGU4YjQwZDAwLCAweGUxNTMwMDBiLAotICAweDAxNTEwMDA4LCAweDAxNTIwMDBhLCAweDhhMDAwMDVkLCAweGU4OTQwZDAwLAotICAweGUxNTMwMDBiLCAweDAxNTEwMDA4LCAweDAxNTIwMDBhLCAweDNhMDAwMDUyLAotICAweGU5MmM0MjFmLCAweGUyOGY5ZTFiLCAweGUzYTA3MDAwLCAweGU4YjkwZDAwLAotICAweGViZmZmMTExLCAweGViZmZmMjM4LCAweGUzMTcwMTAyLCAweDEyNjQ0MDAwLAotICAweGU1OGM0MDEwLCAweGU5MmMwZDgwLCAweGUzYTAwMDAwLCAweGU4YjkwMDBlLAotICAweGViZmZmMTA5LCAweGU4YmMwZDgwLCAweGU5MmMwMDBmLCAweGU4YjkwMDBlLAotICAweGUzYTAwMTAyLCAweGViZmZmMTA0LCAweGU5MmMwMDBmLCAweGUyOGM0MDIwLAotICAweGU4OTQwMDBmLCAweGViZmZmMjBjLCAweGUzMTcwMTAyLCAweDBiZmZmMDllLAotICAweDFiZmZmMDU0LCAweGUxYTA0MDBjLCAweGU5MmMwMDBmLCAweGU4OTQwMDBmLAotICAweGViZmZmMDRkLCAweGU4YmMwZDgwLCAweGViZmZmMDRiLCAweGUyOGNjMDEwLAotICAweGU4YmMwZDgwLCAweGViZmZmMDQ4LCAweGU4OGMwMDBmLCAweGViZmZmMGVlLAotICAweGU5MmMwMDBmLCAweGUzYTA3MDAwLCAweGU4YjkwZDAwLCAweGViZmZmMGVlLAotICAweGU4YjkwZDAwLCAweGViZmZmMDQzLCAweGU4OWMwZDgwLCAweGViZmZmMGVhLAotICAweGU4YjkwZDAwLCAweGViZmZmMDNmLCAweGU4OWMwZDgwLCAweGViZmZmMGU2LAotICAweGU4YjkwZDAwLCAweGViZmZmMDNiLCAweGU4OWMwZDgwLCAweGU5MmMwMDBmLAotICAweGUzYTAwMDAwLCAweGU4YjkwMDBlLCAweGViZmZmMGRmLCAweGU4YjkwZDAwLAotICAweGViZmZmMDM0LCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZmMGRhLAotICAweGU4YjkwZDAwLCAweGViZmZmMDJmLCAweGUyOGM3MDIwLCAweGU4OTcwZDgwLAotICAweGViZmZmMGQ1LCAweGU4YmMwZDgwLCAweGU5MmMwMDBmLCAweGUyMjAwMTAyLAotICAweGViZmZmMDI1LCAweGUxYTA3MDAwLCAweGUxYTA4MDAxLCAweGUxYTBhMDAyLAotICAweGUxYTBiMDAzLCAweGU4YmMwMDBmLCAweGViZmZmMTIwLCAweGU4YjkwZDAwLAotICAweGViZmZmMDIwLCAweGUyOGNjMDIwLCAweGU4YmM0MjEwLCAweGUyODQ0MDAxLAotICAweGUwODMzMDA0LCAweGUzYjA0MDAwLCAweGUxYTBmMDBlLCAweGUzYjAwMDAwLAotICAweGUzYTAxMTAyLCAweGUzYTAyMDAwLCAweGUzYTAzOTAxLCAweGUyNDMzMDAxLAotICAweGUxYTBmMDBlLCAweGUzMTAwMTAyLCAweGUzYTAwMDAwLCAweGUzYTAxMDAwLAotICAweGUzYTAyMDAwLCAweDEzYTAzMDAwLCAweDEzYTA0MDA4LCAweDAzYTAzMGZmLAotICAweDAxODMzMzgzLCAweDAzYjA0MDA0LCAweGUxYTBmMDBlLCAweGIxNzIxN2Y3LAotICAweGQxY2Y3OWFiLCAweDAwMDA0MDBjLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAzZmJlLCAweGIyMWRmZTdmLCAweDA5ZTJiYWE5LCAweDAwMDA0MDBjLAotICAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmJlLCAweGI4YWEzYjI5LAotICAweDVjMTdmMGJjLCAweDAwMDAzZmZmLCAweGRlODA4MmUzLCAweDA4NjU0MzYyLAotICAweDAwMDAzZmYyLCAweGIxODAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZlLAotICAweGM5OWIxODY3LCAweDI4MjJhOTNlLCAweDAwMDAzZmVhLCAweGE1Nzg2MmUxLAotICAweDQ2YTZmYjM5LCAweDAwMDAzZmY0LCAweGU4Yjk0MjhlLCAweGZlY2ZmNTkyLAotICAweDAwMDAzZmZhLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZlLAotICAweDg0NWEyMTU3LCAweDM0OTBmMTA2LCAweDAwMDAzZmYwLCAweGY4M2E1ZjkxLAotICAweDUwOTUyYzk5LCAweDAwMDAzZmY3LCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAzZmZkLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZlLAotICAweGUzMTkwMDgwLCAweDFhZmZlZWNjLCAweGUxYjA3ZTA5LCAweDRhZmZmODczLAotICAweGUwOGM4YzI3LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLAotICAweDFhZmZmMzQ1LCAweDE4ODgwMDBmLCAweGUxYTA0ODgzLCAweGUyOTQ0ODAyLAotICAweDBhMDAwMDA2LCAweGU5MmM0MDAwLCAweGViMDAwMDA3LCAweGU4YmM0MDAwLAotICAweDBhZmZmZWEwLCAweGUyNGY3MDVjLCAweGUyNDc3YzA1LCAweGVhZmZmNDE1LAotICAweGUxOTE0MDAyLCAweDAzYTAxMzMyLCAweGVhZmZmYWFhLCAweGUyOGY0ZjhmLAotICAweGU4YjQwZDAwLCAweGUxNTMwMDBiLCAweDAxNTEwMDA4LCAweDAxNTIwMDBhLAotICAweDhhMDAwMDZjLCAweGUxYjAxMDAxLCAweDVhMDAwMDYzLCAweGU5MmM0MjFmLAotICAweGUzMTkwNjAxLCAweGUyOGY5ZTIyLCAweGUzYTA3MDAwLCAweGU4YjkwZDAwLAotICAweGViZmZmMDYxLCAweGViZmZmMTg4LCAweDFiMDAwMDZkLCAweGU1OGM0MDEwLAotICAweGU5MmMwZDgwLCAweGUzYTAwMDAwLCAweGU4YjkwMDBlLCAweGViZmZmMDVhLAotICAweGU4YmMwZDgwLCAweGU5MmMwMDBmLCAweGU4YjkwMDBlLCAweGUzYTAwMTAyLAotICAweGViZmZmMDU1LCAweGU5MmMwMDBmLCAweGUyOGM0MDIwLCAweGU4OTQwMDBmLAotICAweGViZmZmMTVkLCAweGUzMTcwMTAyLCAweDBiZmZlZmVmLCAweDFiZmZlZmE1LAotICAweGUxYTA0MDBjLCAweGU5MmMwMDBmLCAweGU4OTQwMDBmLCAweGViZmZlZjllLAotICAweGU4YmMwZDgwLCAweGViZmZlZjljLCAweGUyOGNjMDEwLCAweGU4YmMwZDgwLAotICAweGViZmZlZjk5LCAweGUzYTA0YzNmLCAweGUzODQ0MGRmLCAweGUxNTMwMDA0LAotICAweGJhMDAwMDM3LCAweGU4OGMwMDBmLCAweGViZmZmMDNiLCAweGU5MmMwMDBmLAotICAweGUzYTA3MDAwLCAweGU4YjkwZDAwLCAweGViZmZmMDNiLCAweGU4YjkwZDAwLAotICAweGViZmZlZmQ5LCAweGU4OWMwZDgwLCAweGViZmZmMDM3LCAweGU4YjkwZDAwLAotICAweGViZmZlZjhjLCAweGU4OWMwZDgwLCAweGViZmZmMDMzLCAweGU4YjkwZDAwLAotICAweGViZmZlZmQxLCAweGU4OWMwZDgwLCAweGViZmZmMDJmLCAweGU4YjkwZDAwLAotICAweGViZmZlZjg0LCAweGU4OWMwZDgwLCAweGU5MmMwMDBmLCAweGUzYTAwMTAyLAotICAweGU4YjkwMDBlLCAweGViZmZmMDI4LCAweGU4YjkwZDAwLCAweGViZmZlZjdkLAotICAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZmMDIzLCAweGU4YjkwZDAwLAotICAweGViZmZlZmMxLCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZmMDFlLAotICAweGUyOGM3MDIwLCAweGU4OTcwZDgwLCAweGViZmZmMDFiLCAweGUyOGM3MDIwLAotICAweGU4OTcwZDgwLCAweGViZmZlZjZjLCAweGU4YmMwZDgwLCAweGUyOGNjMDIwLAotICAweGU4YmMwMDEwLCAweGUzMTQwMDAxLCAweDEyMjAwMTAyLCAweDFiZmZmMWE3LAotICAweGUyOWI0OTAyLCAweDRhMDAwMDE4LCAweGUzNWIwMDAwLCAweDAxOTg0MDBhLAotICAweDBhMDAwMDE1LCAweGViZmZmMDYxLCAweGU4YmM0MjAwLCAweGUzYjA0MDAwLAotICAweGUxYTBmMDBlLCAweGUyNGNjMDEwLCAweGUzYTA3MDAwLCAweGUzYTA4MTAyLAotICAweGUzYjBhMTAwLCAweGUyZWFiOTAxLCAweGVhZmZmZmViLCAweGUxOTE0MDAyLAotICAweDBhZmZmZjk5LCAweGUyNDMzMDAxLCAweGUwOTIyMDAyLCAweGUwYjExMDAxLAotICAweDVhZmZmZmZiLCAweGVhZmZmZjk0LCAweGUzYTAxMzMyLCAweGUzYjAyMTAwLAotICAweGUyZjIzOTAyLCAweGUzYTA0MDAxLCAweGUxYTBmMDBlLCAweGUzYTAxMDAwLAotICAweGUzYjAyMTAwLCAweGUyZjMzOTAyLCAweGUzYTA0MDA0LCAweGU4YmM0MjAwLAotICAweGUxYTBmMDBlLCAweGUyODQ0MDAxLCAweGUzNWIwMDAwLCAweDAzYTA4MTAyLAotICAweGUzYTA2OTAxLCAweDAyNDZiMDAyLCAweDAxYTBmMDBlLCAweGUyNDY2MDAyLAotICAweGUwNGI2MDA2LCAweGUzYTA1MTAyLCAweGUxNTMwMDBiLCAweDAxNTEwMDA4LAotICAweDAxNTIwMDBhLCAweDIwODg4NjM1LCAweDIxYTBmMDBlLCAweGUwNTg4NjM1LAotICAweDUxYTA4MDg4LCAweDUyNGJiMDAxLCAweGUyNDQ0MDAxLCAweGUxYTBmMDBlLAotICAweGM5MGZkYWEyLCAweDAwMDAwMDAwLCAweDAwMDA0MDFkLCAweGEyZjk4MzZlLAotICAweDRlNDQxNTJhLCAweDAwMDAzZmZlLCAweDk1Nzc3YTVjLCAweGY3MmNlY2U2LAotICAweDAwMDAzZmVkLCAweGM5MTAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZmLAotICAweDg1YmJhNzgzLCAweGIzYzc0OGE5LCAweDAwMDAzZmVhLCAweGEzN2IyNGM4LAotICAweDRhNDIwOTJlLCAweDAwMDAzZmYzLCAweGQyM2NmNTBiLCAweGYxMGFjYTg0LAotICAweDAwMDAzZmY5LCAweGVlZjU4MjNmLCAweGRlY2VhOTY5LCAweDAwMDAzZmZkLAotICAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAzZmZmLCAweDk1ZDViOTc1LAotICAweDE2MzkxZGE4LCAweDAwMDAzZmVmLCAweGUwNzQxNTMxLCAweGRkNTZmNjUwLAotICAweDAwMDAzZmY2LCAweDg4OTVhZjJhLCAweDY4NDdmY2Q1LCAweDAwMDAzZmZjLAotICAweGUzMTkwMDgwLCAweDFhZmZlZTAwLCAweGUxYjA3ZTA5LCAweDRhZmZmN2FiLAotICAweGUwOGM4YzI3LCAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLAotICAweDFhZmZmMjc5LCAweDE4ODgwMDBmLCAweGUxYTA0ODgzLCAweGUyOTQ0ODAyLAotICAweDBhMDAwMDE1LCAweGUxYzAwNTg5LCAweGU5MmM0MDAwLCAweGUxOTE0MDAyLAotICAweDEyNDMzMDAxLCAweGViZmZmZjM4LCAweDFhMDAwMDEyLCAweGU5MmMwMDBmLAotICAweGViZmZlZmExLCAweGUzYTA4MTAyLCAweGUzYjBhMTAwLCAweGUyZWFiOTAxLAotICAweGViZmZlZWY4LCAweGUxYTA3MDAwLCAweGUxYTA4MDAxLCAweGUxYTBhMDAyLAotICAweGUxYTBiMDAzLCAweGU4YmMwMDBmLCAweGViZmZlZmYwLCAweGUxOTE0MDAyLAotICAweDEyODMzMDAxLCAweGU4YmM0MDAwLCAweGVhZmZmZGMyLCAweGUxOTE0MDAyLAotICAweDAzYTAxNGM5LCAweGVhZmZmOWNmLCAweGU4YmM0MDAwLCAweGUzNTQwMDA0LAotICAweDAzYTAzMDAwLCAweDAzYTAwMDAwLCAweDBhZmZmZGJhLCAweGUzYTAxNGM5LAotICAweGUzYjAyMTAwLCAweGUyZTIzOTAyLCAweGVhZmZmOWM2LCAweGUzMTkwMDgwLAotICAweDFhZmZlZGQxLCAweGUxYjA3ZTA5LCAweDRhZmZmNzgwLCAweGUwOGM4YzI3LAotICAweGU4OTgwMDBmLCAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmMjRhLAotICAweDE4ODgwMDBmLCAweGUxYjA0ODgzLCAweDBhMDAwMDZiLCAweDUyOTQ0ODAyLAotICAweDRhMDAwMDcyLCAweGU5MmM0MjAxLCAweGUzYTAwMDAwLCAweGUzYTA1OTAxLAotICAweGUyNDU1MDAyLCAweGUxNTMwMDA1LCAweGFhMDAwMDA5LCAweGUyMDk0NTAxLAotICAweGU5MmMwMDEwLCAweGUzYTA0OTAxLCAweGUyNDQ0MDIxLCAweGUxNTMwMDA0LAotICAweGJhMDAwMDQ5LCAweGU5MmMwMDBmLCAweGViZmZlZjZiLCAweGU5MmMwMDBmLAotICAweGVhMDAwMDEyLCAweGUyMDk0NTAxLCAweGUyMjQ0NTAxLCAweGU5MmMwMDEwLAotICAweGUzYTAwMTAyLCAweGUzYTA4MTAyLCAweGUzYjBhMTAwLCAweGUyZWFiOTAxLAotICAweGViZmZlZWJjLCAweGUxOTE0MDAyLCAweDBhMDAwMDNiLCAweGUyNDMzMDAxLAotICAweGUyNGNjMDEwLCAweGU5MmMwMDBmLCAweGViZmZmMDFjLCAweGUyMjAwMTAyLAotICAweGUyODMzMDAxLCAweGUyOGM0MDEwLCAweGU4ODQwMDBmLCAweGU4OWMwMDBmLAotICAweGUyOGY5ZjU5LCAweGU4YjkwZDAwLCAweGViZmZlZWY3LCAweGU4OWMwZDgwLAotICAweGViZmZlZjU1LCAweGU4YjkwZDAwLCAweGViZmZlZWFhLCAweGU4OWMwZDgwLAotICAweGViZmZlZjUxLCAweGU4YjkwZDAwLCAweGViZmZlZWVmLCAweGU4OWMwZDgwLAotICAweGViZmZlZjRkLCAweGU4YjkwZDAwLCAweGViZmZlZWEyLCAweGU4OWMwZDgwLAotICAweGViZmZlZjQ5LCAweGU4YjkwZDAwLCAweGViZmZlZWU3LCAweGU4OWMwZDgwLAotICAweGU5MmMwMDBmLCAweGUzYTAwMTAyLCAweGU4YjkwMDBlLCAweGViZmZlZjQyLAotICAweGU4YjkwZDAwLCAweGViZmZlZTk3LCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLAotICAweGViZmZlZjNkLCAweGU4YjkwZDAwLCAweGViZmZlZWRiLCAweGUyOGM3MDEwLAotICAweGU4OTcwZDgwLCAweGViZmZlZjM4LCAweGU4YjkwZDAwLCAweGViZmZlZThkLAotICAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZlZjMzLCAweGU4YjkwZDAwLAotICAweGViZmZlZWQxLCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZlZjJlLAotICAweGU4YmMwZDgwLCAweGUyOGNjMDEwLCAweGViZmZlZjgwLCAweGU4OWMwZDgwLAotICAweGViZmZlZjI5LCAweGU4YmMwZDgwLCAweGViZmZlZTdiLCAweGU4YmMwMjMwLAotICAweGUzMTkwNTAxLCAweDBhMDAwMDA4LCAweGUzMTUwMTAyLCAweDAyOGY1YzAxLAotICAweDEyOGY1ZjQ2LCAweGUwODU1OTI0LCAweDAyMjAwMTAyLCAweGU4OTUwZDAwLAotICAweGViZmZlZTc0LCAweGU4YmM0MDAwLCAweGVhZmZmZDQ2LCAweGUzMTUwMTAyLAotICAweGUyOGY1MGRjLCAweGUwODU1OTI0LCAweGU4OTUwZDAwLCAweGViZmZlZTZkLAotICAweDEyMjAwMTAyLCAweGU4YmM0MDAwLCAweGVhZmZmZDNlLCAweGUxOTE1MDAyLAotICAweDBhZmZmZjkzLCAweGUxYjAxMDAxLCAweDRhZmZmZjkxLCAweGUyNDMzMDAxLAotICAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweDVhZmZmZmZiLCAweGVhZmZmZjhjLAotICAweGUyZjM1OTAxLCAweDAxOTI1MDgxLCAweDBhZmZmZjg5LCAweGUyOTQ0ODAyLAotICAweDFhMDAwMDAxLCAweGUxOTE0MDAyLCAweDFhZmZmOTNlLCAweGUzYTAxNGNhLAotICAweGUzYjAyMTAwLCAweGUyZTIzOTAyLCAweGVhZmZmOTNhLCAweGJlOTc0Mzc3LAotICAweGNjMzBmOWU2LCAweDAwMDA0MDAzLCAweDk2ZjNlNGIyLCAweGM4ZTM3Y2JjLAotICAweDAwMDA0MDA2LCAweGJlZWU3N2UyLCAweGI1NDIzY2YzLCAweDAwMDA0MDA3LAotICAweGQwOTI3ODgwLCAweGY1YzIxNzBiLCAweDAwMDA0MDA3LCAweGE0MzYwMWYxLAotICAweDVjM2U2MTk2LCAweDAwMDA0MDA2LCAweGIyNWRlZGFmLCAweDMwZjMyNDJjLAotICAweDAwMDAzZmZlLCAweGEyNzBiYjI3LCAweDYxYzkzOTU3LCAweDAwMDA0MDAyLAotICAweDllYzE2NTRkLCAweDM2ZDRmODIwLCAweDAwMDA0MDA0LCAweGU0ZDUzOWIwLAotICAweDU2YTQ1MWFkLCAweDAwMDA0MDA0LCAweGRhZjJhZDQxLCAweGQwNTMxMWM0LAotICAweDAwMDA0MDAzLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweGM5MGZkYWEyLCAweDIxNjhjMjM1LCAweDAwMDAzZmZmLAotICAweGM5MGZkYWEyLCAweDIxNjhjMjM1LCAweDAwMDA0MDAwLCAweDAwMDAwMDAwLAotICAweGM5MGZkYWEyLCAweDIxNjhjMjM1LCAweDAwMDAzZmZmLCAweGUzMTkwMDgwLAotICAweDFhZmZlZDE5LCAweGUyMDk2ODA3LCAweGUwOGM2NjI2LCAweGU4OTYwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmMTkzLCAweDE4ODYwMDBmLAotICAweGUyMDAwMTAyLCAweGUxODNiMDAwLCAweGUxYTBhMDAyLCAweGUxYTA4MDAxLAotICAweGUxYjA2ZTA5LCAweDRhZmZmNmM5LCAweGUwOGM2YzI2LCAweGU4OTYwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmMTg3LCAweDE4ODYwMDBmLAotICAweGUxYTA3MDBiLCAweGUzY2JiMTAyLCAweGUxYjA0ODgzLCAweDEyOTQ0ODAyLAotICAweDExYjA1ODhiLCAweDEyOTU1ODAyLCAweDE5MmM0MjgxLCAweDFiZmZlZjBiLAotICAweDFhMDAwMDRlLCAweGUxYjA0ODgzLCAweDFhMDAwMDEwLCAweGUxOTE1MDAyLAotICAweDFhMDAwMDBhLCAweGUxYjA1ODhiLCAweDAxOTg2MDBhLCAweDBhMDAwMDFmLAotICAweGUyOTU1ODAyLCAweDFhMDAwMDE2LCAweGUxOTg2MDBhLCAweDBhMDAwMDE0LAotICAweGUxYTAxMDA4LCAweGUxYTAyMDBhLCAweGUxYTAzMDBiLCAweGVhZmZmOGUxLAotICAweGUwOTIyMDAyLCAweGUwYjExMDAxLCAweGUyNDMzMDAxLCAweDVhZmZmZmZiLAotICAweGUxYjA1ODhiLCAweDFhMDAwMDE5LCAweGUxOTg2MDBhLCAweDFhMDAwMDEzLAotICAweGUyOTQ0ODAyLCAweDFhMDAwMDAxLCAweGUxOTE2MDAyLCAweDFhZmZmOGQ1LAotICAweGUxYTA0MDAwLCAweGUxYTA1MDA3LCAweGUyOGYwZmJkLCAweGU4OTAwMDBlLAotICAweGVhMDAwMDhjLCAweGUxYTA0MDAwLCAweGUxYTA1MDA3LCAweGUzYTAwMDAwLAotICAweGUzYTAxMDAwLCAweGUzYTAyMDAwLCAweGUzYTAzMDAwLCAweGVhMDAwMDdkLAotICAweGUzYTAxNGNiLCAweGUzYjAyMTAwLCAweGUyZTIzOTAyLCAweGVhZmZmOGM1LAotICAweGUwOWFhMDBhLCAweGUwYjg4MDA4LCAweGUyNGJiMDAxLCAweDVhZmZmZmZiLAotICAweGUyOTU2ODAyLCAweDEyOTQ2ODAyLCAweDFhZmZmZmNhLCAweGUyOTQ2ODAyLAotICAweDFhMDAwMDA2LCAweGUxOTE2MDAyLCAweDFhZmZmOGJhLCAweGUyOTU2ODAyLAotICAweDFhZmZmZmUyLCAweGUxOTg2MDBhLCAweDAzYTAxNGNiLCAweDBhZmZmOGI1LAotICAweGUxOTg2MDBhLCAweDBhZmZmZmUyLCAweGUxYTAxMDA4LCAweGUxYTAyMDBhLAotICAweGUxYTAzMDBiLCAweGVhZmZmOGFmLCAweGUzMTkwMDgwLCAweDFhZmZlY2JhLAotICAweGUxYjA3ZTA5LCAweDRhZmZmNjcxLCAweGUwOGM4YzI3LCAweGU4OTgwMDBmLAotICAweGUxYjA0ZDIzLCAweGUyOGY3MDAwLCAweDFhZmZmMTMzLCAweDE4ODgwMDBmLAotICAweGUxYjA0ODgzLCAweDEyOTQ0ODAyLCAweDBhMDAwMDYwLCAweGU5MmM0MjgxLAotICAweGUzYjAwMTAwLCAweGUyZjM0OTAxLCAweGRiZmZlZWIwLCAweGQzYTA0MDAyLAotICAweGMzYTA0MDAwLCAweGUyOGY5ZDA2LCAweGU4YjkwZDAwLCAweGUxNTMwMDBiLAotICAweDAxNTEwMDA4LCAweDAxNTIwMDBhLCAweGMyODQ0MDAxLCAweGU5MmMwMDEwLAotICAweGRhMDAwMDBkLCAweGU5MmMwMDBmLCAweGU4OTkwZDAwLCAweGViZmZlZGFkLAotICAweGU4YmMwZDgwLCAweGU5MmMwMDBmLCAweGUzYTAwMDAwLCAweGU4YjkwMDBlLAotICAweGViZmZlZTUxLCAweGUzYTA4MTAyLCAweGUzYjBhMTAwLCAweGUyZWFiOTAxLAotICAweGViZmZlZGVkLCAweGU4YmMwZDgwLCAweGViZmZlZWEwLCAweGUzYTA0OTAxLAotICAweGUyNDQ0MDIxLCAweGUxNTMwMDA0LCAweGJhMDAwMDJjLCAweGU5MmMwMDBmLAotICAweGViZmZlZTQxLCAweGU5MmMwMDBmLCAweGUyOGY5ZjQ5LCAweGU4YjkwZDAwLAotICAweGViZmZlZDk4LCAweGU4OWMwZDgwLCAweGViZmZlZTNmLCAweGU4YjkwZDAwLAotICAweGViZmZlZDk0LCAweGU4OWMwZDgwLCAweGViZmZlZTNiLCAweGU4YjkwZDAwLAotICAweGViZmZlZDkwLCAweGU4OWMwZDgwLCAweGViZmZlZTM3LCAweGU4YjkwZDAwLAotICAweGViZmZlZDhjLCAweGU4OWMwZDgwLCAweGU5MmMwMDBmLCAweGUzYTAwMTAyLAotICAweGU4YjkwMDBlLCAweGViZmZlZTMwLCAweGU4YjkwZDAwLCAweGViZmZlZGNlLAotICAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZlZTJiLCAweGU4YjkwZDAwLAotICAweGViZmZlZGM5LCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLCAweGViZmZlZTI2LAotICAweGU4YjkwZDAwLCAweGViZmZlZGM0LCAweGUyOGM3MDEwLCAweGU4OTcwZDgwLAotICAweGViZmZlZTIxLCAweGU4YmMwZDgwLCAweGUyOGNjMDEwLCAweGViZmZlZTczLAotICAweGU4OWMwZDgwLCAweGViZmZlZTFjLCAweGU4YmMwZDgwLCAweGViZmZlZDZlLAotICAweGUyOGY5MGRjLCAweGU4YmMwMDEwLCAweGUwMjAwZjA0LCAweGUwODk5MjA0LAotICAweGU4OTkwZDAwLCAweGViZmZlZDZiLCAweGU4YmM0MjMwLCAweGUzMTkwNjAxLAotICAweDEwMjAwMDA0LCAweDFhZmZmYzNiLCAweGUzMTUwMTAyLCAweDBhMDAwMDA1LAotICAweGU5MmM0MDEwLCAweGUyMjAwMTAyLCAweGUyNGY3ZDBkLCAweGU4OTcwZDAwLAotICAweGViZmZlZDYwLCAweGU4YmM0MDEwLCAweGUwMjAwMDA0LCAweGVhZmZmYzMxLAotICAweGUzNTMwMDAwLCAweDBhZmZmYzJmLCAweGUxOTE0MDAyLCAweDFhZmZmODNkLAotICAweGUyOGYwMDljLCAweGU4OTAwMDBlLCAweGVhZmZmYzJhLCAweDg5MzBhMmY0LAotICAweGY2NmFiMThhLCAweDAwMDAzZmZkLCAweGRkYjNkNzQyLCAweGMyNjU1MzllLAotICAweDAwMDAzZmZmLCAweGYwNjI0ZjBhLCAweDU2Mzg4MzEwLCAweDAwMDA0MDAyLAotICAweGVlNTA1MTkwLCAweDZkMWViNGU4LCAweDAwMDA0MDA0LCAweGFjNTA5MDIwLAotICAweDViNmQyNDNiLCAweDAwMDA0MDA1LCAweGE0NDNlNWU2LCAweDI0YWQ0YjkwLAotICAweDAwMDA0MDA0LCAweGQ2NmJkNmNkLCAweDhjM2RlOTM0LCAweDAwMDAzZmZlLAotICAweDg3ZTlmYWU0LCAweDZiNTMxYTI5LCAweDAwMDA0MDAyLCAweGE0MGJmZGNmLAotICAweDE1ZTY1NjkxLCAweDAwMDA0MDAzLCAweGRiMDUzMjg4LCAweDMwZTcwZWI0LAotICAweDAwMDA0MDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDg2MGE5MWMxLCAweDZiOWIyYzIzLCAweDAwMDAzZmZlLAotICAweDAwMDAwMDAwLCAweGM5MGZkYWEyLCAweDIxNjhjMjM1LCAweDAwMDAzZmZmLAotICAweDAwMDAwMDAwLCAweDg2MGE5MWMxLCAweDZiOWIyYzIzLCAweDAwMDAzZmZmLAotICAweGU5MmQ1MDAxLCAweGUyNGZjMDVjLCAweGUyNGNjYzUwLCAweGUzYTAwODA3LAotICAweGU1OGMwMDgwLCAweGU4YmQ5MDAxLCAweGUxYTAwMDAwLCAweGUzMTAwMDAxLAotICAweDEyOGYwZTE1LCAweDFhMDAwMDBhLCAweGUzMTAwMDA0LCAweDEyOGYwZjQ3LAotICAweDFhMDAwMDA3LCAweGUzMTAwMDAyLCAweDEyOGYwMGUwLCAweDFhMDAwMDA0LAotICAweGUzMTAwMDA4LCAweDEyOGYwMGE4LCAweDFhMDAwMDAxLCAweGUyOGYwMDcwLAotICAweGVhZmZmZmZmLCAweGUyOGYxMDFjLCAweGUxNGZiMDAwLCAweGU4YmQwN2Y4LAotICAweGU4YTEwN2Y4LCAweGU4YmQwN2Y4LCAweGUyNGFhMDA0LCAweGU4YTEwZmY4LAotICAweGUyOGYxMDAwLCAweGVmMDAwMDcxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAyMjc4LAotICAweGZmZmZmZmZmLCAweDgwMDAwMjA0LCAweDYxNmY2YzQ2LCAweDY3NmU2OTc0LAotICAweDY5NmY1MDIwLCAweDQ1MjA3NDZlLCAweDcwNjU2Mzc4LCAweDZlNmY2OTc0LAotICAweDQ5MjAzYTIwLCAweDYxNzg2NTZlLCAweDUyMjA3NDYzLCAweDZjNzU3MzY1LAotICAweDAwMDAwMDc0LCAweDgwMDAwMjAzLCAweDYxNmY2YzQ2LCAweDY3NmU2OTc0LAotICAweDY5NmY1MDIwLCAweDQ1MjA3NDZlLCAweDcwNjU2Mzc4LCAweDZlNmY2OTc0LAotICAweDU1MjAzYTIwLCAweDcyNjU2NDZlLCAweDc3NmY2YzY2LCAweDAwMDAwMDAwLAotICAweDgwMDAwMjAyLCAweDYxNmY2YzQ2LCAweDY3NmU2OTc0LCAweDY5NmY1MDIwLAotICAweDQ1MjA3NDZlLCAweDcwNjU2Mzc4LCAweDZlNmY2OTc0LCAweDQ0MjAzYTIwLAotICAweDY0Njk3NjY5LCAweDc5NDIyMDY1LCAweDcyNjU1YTIwLCAweDAwMDAwMDZmLAotICAweDgwMDAwMjAxLCAweDYxNmY2YzQ2LCAweDY3NmU2OTc0LCAweDY5NmY1MDIwLAotICAweDQ1MjA3NDZlLCAweDcwNjU2Mzc4LCAweDZlNmY2OTc0LCAweDRmMjAzYTIwLAotICAweDY2NzI2NTc2LCAweDAwNzc2ZjZjLCAweDgwMDAwMjAwLCAweDYxNmY2YzQ2LAotICAweDY3NmU2OTc0LCAweDY5NmY1MDIwLCAweDQ1MjA3NDZlLCAweDcwNjU2Mzc4LAotICAweDZlNmY2OTc0LCAweDQ5MjAzYTIwLCAweDZjNjE3NjZlLCAweDRmMjA2NDY5LAotICAweDYxNzI2NTcwLCAweDZlNmY2OTc0LCAweDAwMDAwMDAwLCAweGZlZmVmZWZmLCAwCi19OwotCi11bnNpZ25lZCBsb25nIGZwZXNpemUgPSAweDAwMDA1MzAwOwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1pbml0LmMgYi9zaW0vYXJtL2FybWluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwNWMxNy4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2FybWluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKiAgYXJtaW5pdC5jIC0tIEFSTXVsYXRvciBpbml0aWFsaXphdGlvbjogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJhcm1lbXUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgIERlZmluaXRpb25zIGZvciB0aGUgZW11bGF0b3IgYXJjaGl0ZWN0dXJlICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEFSTXVsX0VtdWxhdGVJbml0ICh2b2lkKTsKLUFSTXVsX1N0YXRlICpBUk11bF9OZXdTdGF0ZSAodm9pZCk7Ci12b2lkIEFSTXVsX1Jlc2V0IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLUFSTXdvcmQgQVJNdWxfRG9DeWNsZSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci11bnNpZ25lZCBBUk11bF9Eb0NvUHJvIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLUFSTXdvcmQgQVJNdWxfRG9Qcm9nIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLUFSTXdvcmQgQVJNdWxfRG9JbnN0ciAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci12b2lkIEFSTXVsX0Fib3J0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpOwotCi11bnNpZ25lZCBBUk11bF9NdWx0VGFibGVbMzJdID0KLSAgeyAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LAotICAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2Ci19OwotQVJNd29yZCBBUk11bF9JbW1lZFRhYmxlWzQwOTZdOwkvKiBpbW1lZGlhdGUgRFAgTEhTIHZhbHVlcyAqLwotY2hhciBBUk11bF9CaXRMaXN0WzI1Nl07CS8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSB0YWJsZSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgIENhbGwgdGhpcyByb3V0aW5lIG9uY2UgdG8gc2V0IHVwIHRoZSBlbXVsYXRvcidzIHRhYmxlcy4gICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX0VtdWxhdGVJbml0ICh2b2lkKQotewotICB1bnNpZ25lZCBsb25nIGksIGo7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICB7CQkJCS8qIHRoZSB2YWx1ZXMgb2YgMTIgYml0IGRwIHJocydzICovCi0gICAgICBBUk11bF9JbW1lZFRhYmxlW2ldID0gUk9UQVRFUiAoaSAmIDB4ZmZMLCAoaSA+PiA3TCkgJiAweDFlTCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IEFSTXVsX0JpdExpc3RbaSsrXSA9IDApOwkvKiBob3cgbWFueSBiaXRzIGluIExTTSAqLwotICBmb3IgKGogPSAxOyBqIDwgMjU2OyBqIDw8PSAxKQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgIGlmICgoaSAmIGopID4gMCkKLQlBUk11bF9CaXRMaXN0W2ldKys7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgIEFSTXVsX0JpdExpc3RbaV0gKj0gNDsJLyogeW91IGFsd2F5cyBuZWVkIDQgdGltZXMgdGhlc2UgdmFsdWVzICovCi0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICBSZXR1cm5zIGEgbmV3IGluc3RhbnRpYXRpb24gb2YgdGhlIEFSTXVsYXRvcidzIHN0YXRlICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk11bF9TdGF0ZSAqCi1BUk11bF9OZXdTdGF0ZSAodm9pZCkKLXsKLSAgQVJNdWxfU3RhdGUgKnN0YXRlOwotICB1bnNpZ25lZCBpLCBqOwotCi0gIHN0YXRlID0gKEFSTXVsX1N0YXRlICopIG1hbGxvYyAoc2l6ZW9mIChBUk11bF9TdGF0ZSkpOwotICBtZW1zZXQgKHN0YXRlLCAwLCBzaXplb2YgKEFSTXVsX1N0YXRlKSk7Ci0KLSAgc3RhdGUtPkVtdWxhdGUgPSBSVU47Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHN0YXRlLT5SZWdbaV0gPSAwOwotICAgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykKLQlzdGF0ZS0+UmVnQmFua1tqXVtpXSA9IDA7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotICAgIHN0YXRlLT5TcHNyW2ldID0gMDsKLSAgCi0gIHN0YXRlLT5Nb2RlID0gVVNFUjI2TU9ERTsKLQotICBzdGF0ZS0+Q2FsbERlYnVnID0gRkFMU0U7Ci0gIHN0YXRlLT5EZWJ1ZyA9IEZBTFNFOwotICBzdGF0ZS0+VmVjdG9yQ2F0Y2ggPSAwOwotICBzdGF0ZS0+QWJvcnRlZCA9IEZBTFNFOwotICBzdGF0ZS0+UmVzZXRlZCA9IEZBTFNFOwotICBzdGF0ZS0+SW50ZWQgPSAzOwotICBzdGF0ZS0+TGFzdEludGVkID0gMzsKLQotICBzdGF0ZS0+TWVtRGF0YVB0ciA9IE5VTEw7Ci0gIHN0YXRlLT5NZW1JblB0ciA9IE5VTEw7Ci0gIHN0YXRlLT5NZW1PdXRQdHIgPSBOVUxMOwotICBzdGF0ZS0+TWVtU3BhcmVQdHIgPSBOVUxMOwotICBzdGF0ZS0+TWVtU2l6ZSA9IDA7Ci0KLSAgc3RhdGUtPk9TcHRyID0gTlVMTDsKLSAgc3RhdGUtPkNvbW1hbmRMaW5lID0gTlVMTDsKLQotICBzdGF0ZS0+RXZlbnRTZXQgPSAwOwotICBzdGF0ZS0+Tm93ID0gMDsKLSAgc3RhdGUtPkV2ZW50UHRyID0gKHN0cnVjdCBFdmVudE5vZGUgKiopIG1hbGxvYyAoKHVuc2lnbmVkKSBFVkVOVExJU1RTSVpFICoKLQkJCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgRXZlbnROb2RlCi0JCQkJCQkJICAqKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBFVkVOVExJU1RTSVpFOyBpKyspCi0gICAgKihzdGF0ZS0+RXZlbnRQdHIgKyBpKSA9IE5VTEw7Ci0KLSNpZmRlZiBBUk02MQotICBzdGF0ZS0+cHJvZzMyU2lnID0gTE9XOwotICBzdGF0ZS0+ZGF0YTMyU2lnID0gTE9XOwotI2Vsc2UKLSAgc3RhdGUtPnByb2czMlNpZyA9IEhJR0g7Ci0gIHN0YXRlLT5kYXRhMzJTaWcgPSBISUdIOwotI2VuZGlmCi0KLSAgc3RhdGUtPmxhdGVhYnRTaWcgPSBMT1c7Ci0gIHN0YXRlLT5iaWdlbmRTaWcgPSBMT1c7Ci0KLSAgQVJNdWxfUmVzZXQgKHN0YXRlKTsKLSAgcmV0dXJuIChzdGF0ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgIENhbGwgdGhpcyByb3V0aW5lIHRvIHNldCBBUk11bGF0b3IgdG8gbW9kZWwgYSBjZXJ0YWluIHByb2Nlc3NvciAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfU2VsZWN0UHJvY2Vzc29yIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBwcm9jZXNzb3IpCi17Ci0gIGlmIChwcm9jZXNzb3IgJiBBUk1fRml4MjZfUHJvcCkKLSAgICB7Ci0gICAgICBzdGF0ZS0+cHJvZzMyU2lnID0gTE9XOwotICAgICAgc3RhdGUtPmRhdGEzMlNpZyA9IExPVzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0ZS0+cHJvZzMyU2lnID0gSElHSDsKLSAgICAgIHN0YXRlLT5kYXRhMzJTaWcgPSBISUdIOwotICAgIH0KLQotICBzdGF0ZS0+bGF0ZWFidFNpZyA9IExPVzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogQ2FsbCB0aGlzIHJvdXRpbmUgdG8gc2V0IHVwIHRoZSBpbml0aWFsIG1hY2hpbmUgc3RhdGUgKG9yIHBlcmZvcm0gYSBSRVNFVCAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9SZXNldCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSkKLXsKLSAgc3RhdGUtPk5leHRJbnN0ciA9IDA7Ci0KLSAgaWYgKHN0YXRlLT5wcm9nMzJTaWcpCi0gICAgewotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSAwOwotICAgICAgc3RhdGUtPkNwc3IgPSBJTlRCSVRTIHwgU1ZDMzJNT0RFOwotICAgICAgc3RhdGUtPk1vZGUgPSBTVkMzMk1PREU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBSMTVJTlRCSVRTIHwgU1ZDMjZNT0RFOwotICAgICAgc3RhdGUtPkNwc3IgPSBJTlRCSVRTIHwgU1ZDMjZNT0RFOwotICAgICAgc3RhdGUtPk1vZGUgPSBTVkMyNk1PREU7Ci0gICAgfQotCi0gIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0gIHN0YXRlLT5CYW5rID0gU1ZDQkFOSzsKLQotICBGTFVTSFBJUEU7Ci0KLSAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IDA7Ci0gIHN0YXRlLT5FcnJvckNvZGUgPSAwOwotCi0gIHN0YXRlLT5FeGNlcHRpb24gPSBGQUxTRTsKLSAgc3RhdGUtPk5yZXNldFNpZyA9IEhJR0g7Ci0gIHN0YXRlLT5OZmlxU2lnID0gSElHSDsKLSAgc3RhdGUtPk5pcnFTaWcgPSBISUdIOwotICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotICBzdGF0ZS0+YWJvcnRTaWcgPSBMT1c7Ci0gIHN0YXRlLT5BYm9ydEFkZHIgPSAxOwotCi0gIHN0YXRlLT5OdW1JbnN0cnMgPSAwOwotICBzdGF0ZS0+TnVtTmN5Y2xlcyA9IDA7Ci0gIHN0YXRlLT5OdW1TY3ljbGVzID0gMDsKLSAgc3RhdGUtPk51bUljeWNsZXMgPSAwOwotICBzdGF0ZS0+TnVtQ2N5Y2xlcyA9IDA7Ci0gIHN0YXRlLT5OdW1GY3ljbGVzID0gMDsKLSNpZmRlZiBBU0lNCi0gICh2b2lkKSBBUk11bF9NZW1vcnlJbml0ICgpOwotICBBUk11bF9PU0luaXQgKHN0YXRlKTsKLSNlbmRpZgotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIEVtdWxhdGUgdGhlIGV4ZWN1dGlvbiBvZiBhbiBlbnRpcmUgcHJvZ3JhbS4gIFN0YXJ0IHRoZSBjb3JyZWN0IGVtdWxhdG9yICAgKgotKiAoRW11bGF0ZTI2IGZvciBhIDI2IGJpdCBBUk0gYW5kIEVtdWxhdGUzMiBmb3IgYSAzMiBiaXQgQVJNKSwgcmV0dXJuIHRoZSAgICoKLSogYWRkcmVzcyBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9Eb1Byb2cgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIEFSTXdvcmQgcGMgPSAwOwotCi0gIHN0YXRlLT5FbXVsYXRlID0gUlVOOwotICB3aGlsZSAoc3RhdGUtPkVtdWxhdGUgIT0gU1RPUCkKLSAgICB7Ci0gICAgICBzdGF0ZS0+RW11bGF0ZSA9IFJVTjsKLSAgICAgIGlmIChzdGF0ZS0+cHJvZzMyU2lnICYmIEFSTXVsX01PREUzMkJJVCkKLQlwYyA9IEFSTXVsX0VtdWxhdGUzMiAoc3RhdGUpOwotICAgICAgZWxzZQotCXBjID0gQVJNdWxfRW11bGF0ZTI2IChzdGF0ZSk7Ci0gICAgfQotICByZXR1cm4gKHBjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogRW11bGF0ZSB0aGUgZXhlY3V0aW9uIG9mIG9uZSBpbnN0cnVjdGlvbi4gIFN0YXJ0IHRoZSBjb3JyZWN0IGVtdWxhdG9yICAgICAqCi0qIChFbXVsYXRlMjYgZm9yIGEgMjYgYml0IEFSTSBhbmQgRW11bGF0ZTMyIGZvciBhIDMyIGJpdCBBUk0pLCByZXR1cm4gdGhlICAgKgotKiBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQKLUFSTXVsX0RvSW5zdHIgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIEFSTXdvcmQgcGMgPSAwOwotCi0gIHN0YXRlLT5FbXVsYXRlID0gT05DRTsKLSAgaWYgKHN0YXRlLT5wcm9nMzJTaWcgJiYgQVJNdWxfTU9ERTMyQklUKQotICAgIHBjID0gQVJNdWxfRW11bGF0ZTMyIChzdGF0ZSk7Ci0gIGVsc2UKLSAgICBwYyA9IEFSTXVsX0VtdWxhdGUyNiAoc3RhdGUpOwotCi0gIHJldHVybiAocGMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgY2F1c2VzIGFuIEFib3J0IHRvIG9jY3VyLCBpbmNsdWRpbmcgc2VsZWN0aW5nIHRoZSBjb3JyZWN0ICAgICoKLSogbW9kZSwgcmVnaXN0ZXIgYmFuaywgYW5kIHRoZSBzYXZpbmcgb2YgcmVnaXN0ZXJzLiAgQ2FsbCB3aXRoIHRoZSAgICAgICAgICAqCi0qIGFwcHJvcHJpYXRlIHZlY3RvcidzIG1lbW9yeSBhZGRyZXNzICgwLDQsOCAuLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfQWJvcnQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgdmVjdG9yKQotewotICBBUk13b3JkIHRlbXA7Ci0KLSAgc3RhdGUtPkFib3J0ZWQgPSBGQUxTRTsKLQotICBpZiAoQVJNdWxfT1NFeGNlcHRpb24gKHN0YXRlLCB2ZWN0b3IsIEFSTXVsX0dldFBDIChzdGF0ZSkpKQotICAgIHJldHVybjsKLQotICBpZiAoc3RhdGUtPnByb2czMlNpZykKLSAgICBpZiAoQVJNdWxfTU9ERTI2QklUKQotICAgICAgdGVtcCA9IFIxNVBDOwotICAgIGVsc2UKLSAgICAgIHRlbXAgPSBzdGF0ZS0+UmVnWzE1XTsKLSAgZWxzZQotICAgIHRlbXAgPSBSMTVQQyB8IEVDQyB8IEVSMTVJTlQgfCBFTU9ERTsKLQotICBzd2l0Y2ggKHZlY3RvcikKLSAgICB7Ci0gICAgY2FzZSBBUk11bF9SZXNldFY6CQkvKiBSRVNFVCAqLwotICAgICAgc3RhdGUtPlNwc3JbU1ZDQkFOS10gPSBDUFNSOwotICAgICAgU0VUQUJPUlQgKElOVEJJVFMsIHN0YXRlLT5wcm9nMzJTaWcgPyBTVkMzMk1PREUgOiBTVkMyNk1PREUpOwotICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQgKHN0YXRlKTsKLSAgICAgIHN0YXRlLT5SZWdbMTRdID0gdGVtcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNdWxfVW5kZWZpbmVkSW5zdHJWOgkvKiBVbmRlZmluZWQgSW5zdHJ1Y3Rpb24gKi8KLSAgICAgIHN0YXRlLT5TcHNyW3N0YXRlLT5wcm9nMzJTaWcgPyBVTkRFRkJBTksgOiBTVkNCQU5LXSA9IENQU1I7Ci0gICAgICBTRVRBQk9SVCAoSUJJVCwgc3RhdGUtPnByb2czMlNpZyA/IFVOREVGMzJNT0RFIDogU1ZDMjZNT0RFKTsKLSAgICAgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0gICAgICBzdGF0ZS0+UmVnWzE0XSA9IHRlbXAgLSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk11bF9TV0lWOgkJLyogU29mdHdhcmUgSW50ZXJydXB0ICovCi0gICAgICBzdGF0ZS0+U3BzcltTVkNCQU5LXSA9IENQU1I7Ci0gICAgICBTRVRBQk9SVCAoSUJJVCwgc3RhdGUtPnByb2czMlNpZyA/IFNWQzMyTU9ERSA6IFNWQzI2TU9ERSk7Ci0gICAgICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIC0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNdWxfUHJlZmV0Y2hBYm9ydFY6CS8qIFByZWZldGNoIEFib3J0ICovCi0gICAgICBzdGF0ZS0+QWJvcnRBZGRyID0gMTsKLSAgICAgIHN0YXRlLT5TcHNyW3N0YXRlLT5wcm9nMzJTaWcgPyBBQk9SVEJBTksgOiBTVkNCQU5LXSA9IENQU1I7Ci0gICAgICBTRVRBQk9SVCAoSUJJVCwgc3RhdGUtPnByb2czMlNpZyA/IEFCT1JUMzJNT0RFIDogU1ZDMjZNT0RFKTsKLSAgICAgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0gICAgICBzdGF0ZS0+UmVnWzE0XSA9IHRlbXAgLSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk11bF9EYXRhQWJvcnRWOgkvKiBEYXRhIEFib3J0ICovCi0gICAgICBzdGF0ZS0+U3BzcltzdGF0ZS0+cHJvZzMyU2lnID8gQUJPUlRCQU5LIDogU1ZDQkFOS10gPSBDUFNSOwotICAgICAgU0VUQUJPUlQgKElCSVQsIHN0YXRlLT5wcm9nMzJTaWcgPyBBQk9SVDMyTU9ERSA6IFNWQzI2TU9ERSk7Ci0gICAgICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIC0gNDsJLyogdGhlIFBDIG11c3QgaGF2ZSBiZWVuIGluY3JlbWVudGVkICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIEFSTXVsX0FkZHJFeGNlcHRuVjoJLyogQWRkcmVzcyBFeGNlcHRpb24gKi8KLSAgICAgIHN0YXRlLT5TcHNyW1NWQ0JBTktdID0gQ1BTUjsKLSAgICAgIFNFVEFCT1JUIChJQklULCBTVkMyNk1PREUpOwotICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQgKHN0YXRlKTsKLSAgICAgIHN0YXRlLT5SZWdbMTRdID0gdGVtcCAtIDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFSTXVsX0lSUVY6CQkvKiBJUlEgKi8KLSAgICAgIHN0YXRlLT5TcHNyW0lSUUJBTktdID0gQ1BTUjsKLSAgICAgIFNFVEFCT1JUIChJQklULCBzdGF0ZS0+cHJvZzMyU2lnID8gSVJRMzJNT0RFIDogSVJRMjZNT0RFKTsKLSAgICAgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7Ci0gICAgICBzdGF0ZS0+UmVnWzE0XSA9IHRlbXAgLSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk11bF9GSVFWOgkJLyogRklRICovCi0gICAgICBzdGF0ZS0+U3BzcltGSVFCQU5LXSA9IENQU1I7Ci0gICAgICBTRVRBQk9SVCAoSU5UQklUUywgc3RhdGUtPnByb2czMlNpZyA/IEZJUTMyTU9ERSA6IEZJUTI2TU9ERSk7Ci0gICAgICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIC0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaWYgKEFSTXVsX01PREUzMkJJVCkKLSAgICBBUk11bF9TZXRSMTUgKHN0YXRlLCB2ZWN0b3IpOwotICBlbHNlCi0gICAgQVJNdWxfU2V0UjE1IChzdGF0ZSwgUjE1Q0NJTlRNT0RFIHwgdmVjdG9yKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtb3B0cy5oIGIvc2ltL2FybS9hcm1vcHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjVjYjcuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9hcm1vcHRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiAgYXJtb3B0cy5oIC0tIEFSTXVsYXRvciBjb25maWd1cmF0aW9uIG9wdGlvbnM6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIERlZmluZSBvbmUgb2YgQVJNNjAgb3IgQVJNNjEgKi8KLSNpZm5kZWYgQVJNNjAKLSNpZm5kZWYgQVJNNjEKLSNkZWZpbmUgQVJNNjAKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vYXJtL2FybW9zLmMgYi9zaW0vYXJtL2FybW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGQ0Y2QuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9hcm1vcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qICBhcm1vcy5jIC0tIEFSTXVsYXRvciBPUyBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBhIG1vZGVsIG9mIERlbW9uLCBBUk0gTHRkJ3MgRGVidWcgTW9uaXRvciwKLWluY2x1ZGluZyBhbGwgdGhlIFNXSSdzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIEMgbGlicmFyeS4gVGhlIGNvZGUgaW4KLWl0IGlzIG5vdCByZWFsbHkgZm9yIHRoZSBmYWludC1oZWFydGVkIChlc3BlY2lhbGx5IHRoZSBhYm9ydCBoYW5kbGluZwotY29kZSksIGJ1dCBpdCBpcyBhIGNvbXBsZXRlIGV4YW1wbGUuIERlZmluaW5nIE5PT1Mgd2lsbCBkaXNhYmxlIGFsbCB0aGUKLWZ1biwgYW5kIGRlZmluaWduIFZBSUxEQVRFIHdpbGwgZGVmaW5lIFNXSSAxIHRvIGVudGVyIFNWQyBtb2RlLCBhbmQgU1dJCi0weDExIHRvIGhhbHQgdGhlIGVtdWxhdG9yLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZm5kZWYgT19SRE9OTFkKLSNkZWZpbmUgT19SRE9OTFkgMAotI2VuZGlmCi0jaWZuZGVmIE9fV1JPTkxZCi0jZGVmaW5lIE9fV1JPTkxZIDEKLSNlbmRpZgotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSICAgMgotI2VuZGlmCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgdW5saW5rKHMpIHJlbW92ZShzKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBGb3IgU0VFS19TRVQgZXRjICovCi0jZW5kaWYKLQotI2lmZGVmIF9fcmlzY29zCi1leHRlcm4gaW50IF9maXNhdHR5IChGSUxFICopOwotI2RlZmluZSBpc2F0dHlfKGYpIF9maXNhdHR5KGYpCi0jZWxzZQotI2lmZGVmIF9fWlRDX18KLSNpbmNsdWRlIDxpby5oPgotI2RlZmluZSBpc2F0dHlfKGYpIGlzYXR0eSgoZiktPl9maWxlKQotI2Vsc2UKLSNpZmRlZiBtYWNpbnRvc2gKLSNpbmNsdWRlIDxpb2N0bC5oPgotI2RlZmluZSBpc2F0dHlfKGYpICh+aW9jdGwgKChmKS0+X2ZpbGUsIEZJT0lOVEVSQUNUSVZFLCBOVUxMKSkKLSNlbHNlCi0jZGVmaW5lIGlzYXR0eV8oZikgaXNhdHR5IChmaWxlbm8gKGYpKQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXJtZGVmcy5oIgotI2luY2x1ZGUgImFybW9zLmgiCi0jaWZuZGVmIE5PT1MKLSNpZm5kZWYgVkFMSURBVEUKLS8qICNpZm5kZWYgQVNJTSAqLwotI2luY2x1ZGUgImFybWZwZS5oIgotLyogI2VuZGlmICovCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBGb3IgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQuICAqLwotI2luY2x1ZGUgImRiZ19yZGkuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSW5pdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBBUk11bF9PU0V4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSGFuZGxlU1dJIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIG51bWJlcik7Ci1leHRlcm4gdW5zaWduZWQgQVJNdWxfT1NFeGNlcHRpb24gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgdmVjdG9yLAotCQkJCSAgIEFSTXdvcmQgcGMpOwotZXh0ZXJuIEFSTXdvcmQgQVJNdWxfT1NMYXN0RXJyb3JQIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLWV4dGVybiBBUk13b3JkIEFSTXVsX0RlYnVnIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHBjLCBBUk13b3JkIGluc3RyKTsKLQotI2RlZmluZSBCVUZGRVJTSVpFIDQwOTYKLSNpZm5kZWYgRk9QRU5fTUFYCi0jZGVmaW5lIEZPUEVOX01BWCA2NAotI2VuZGlmCi0jZGVmaW5lIFVOSVFVRVRFTVBTIDI1NgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgT1MgcHJpdmF0ZSBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBPU2Jsb2NrCi17Ci0gIEFSTXdvcmQgVGltZTA7Ci0gIEFSTXdvcmQgRXJyb3JQOwotICBBUk13b3JkIEVycm9yTm87Ci0gIEZJTEUgKkZpbGVUYWJsZVtGT1BFTl9NQVhdOwotICBjaGFyIEZpbGVGbGFnc1tGT1BFTl9NQVhdOwotICBjaGFyICp0ZW1wbmFtZXNbVU5JUVVFVEVNUFNdOwotfTsKLQotI2RlZmluZSBOT09QIDAKLSNkZWZpbmUgQklOQVJZIDEKLSNkZWZpbmUgUkVBRE9QIDIKLSNkZWZpbmUgV1JJVEVPUCA0Ci0KLSNpZmRlZiBtYWNpbnRvc2gKLSNkZWZpbmUgRklYQ1JMRih0LGMpICgodCAmIEJJTkFSWSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgYyA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJ1xuJyB8fCBjID09ICdccicgKSA/IChjIF4gNykgOiBjKSBcCi0gICAgICAgICAgICAgICAgICAgICApCi0jZWxzZQotI2RlZmluZSBGSVhDUkxGKHQsYykgYwotI2VuZGlmCi0KLXN0YXRpYyBBUk13b3JkIHNvZnR2ZWN0b3Jjb2RlW10gPQotewkvKiBiYXNpYzogc3dpIHRpZHlleGNlcHRpb24gKyBldmVudDsgbW92IHBjLCBscjsKLQkgICBsZG1pYSByMTEse3IxMSxwY307IHN3aSBnZW5lcmF0ZWV4Y2VwdGlvbiAgKyBldmVudC4gICovCi0gIDB4ZWYwMDAwOTAsIDB4ZTFhMGUwMGYsIDB4ZTg5Yjg4MDAsIDB4ZWYwMDAwODAsCS8qUmVzZXQgKi8KLSAgMHhlZjAwMDA5MSwgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4MSwJLypVbmRlZiAqLwotICAweGVmMDAwMDkyLCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDgyLAkvKlNXSSAgKi8KLSAgMHhlZjAwMDA5MywgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4MywJLypQcmVmZXRjaCBhYm9ydCAqLwotICAweGVmMDAwMDk0LCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDg0LAkvKkRhdGEgYWJvcnQgKi8KLSAgMHhlZjAwMDA5NSwgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4NSwJLypBZGRyZXNzIGV4Y2VwdGlvbiAqLwotICAweGVmMDAwMDk2LCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDg2LCAvKklSUSovCi0gIDB4ZWYwMDAwOTcsIDB4ZTFhMGUwMGYsIDB4ZTg5Yjg4MDAsIDB4ZWYwMDAwODcsIC8qRklRKi8KLSAgMHhlZjAwMDA5OCwgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4OCwJLypFcnJvciAqLwotICAweGUxYTBmMDBlCQkJLyogZGVmYXVsdCBoYW5kbGVyICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgIFRpbWUgZm9yIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHRvIGluaXRpYWxpc2UgaXRzZWxmLiAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuc2lnbmVkCi1BUk11bF9PU0luaXQgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0jaWZuZGVmIE5PT1MKLSNpZm5kZWYgVkFMSURBVEUKLSAgQVJNd29yZCBpbnN0ciwgaSwgajsKLSAgc3RydWN0IE9TYmxvY2sgKk9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrICopIHN0YXRlLT5PU3B0cjsKLQotICBpZiAoc3RhdGUtPk9TcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3RhdGUtPk9TcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBPU2Jsb2NrKSk7Ci0gICAgICBpZiAoc3RhdGUtPk9TcHRyID09IE5VTEwpCi0JewotCSAgcGVycm9yICgiT1MgTWVtb3J5Iik7Ci0JICBleGl0ICgxNSk7Ci0JfQotICAgIH0KLSAgT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sgKikgc3RhdGUtPk9TcHRyOwotICBPU3B0ci0+RXJyb3JQID0gMDsKLSAgc3RhdGUtPlJlZ1sxM10gPSBBRERSU1VQRVJTVEFDSzsJLyogc2V0IHVwIGEgc3RhY2sgZm9yIHRoZSBjdXJyZW50IG1vZGUgKi8KLSAgQVJNdWxfU2V0UmVnIChzdGF0ZSwgU1ZDMzJNT0RFLCAxMywgQUREUlNVUEVSU1RBQ0spOwkvKiBhbmQgZm9yIHN1cGVydmlzb3IgbW9kZSAqLwotICBBUk11bF9TZXRSZWcgKHN0YXRlLCBBQk9SVDMyTU9ERSwgMTMsIEFERFJTVVBFUlNUQUNLKTsJLyogYW5kIGZvciBhYm9ydCAzMiBtb2RlICovCi0gIEFSTXVsX1NldFJlZyAoc3RhdGUsIFVOREVGMzJNT0RFLCAxMywgQUREUlNVUEVSU1RBQ0spOwkvKiBhbmQgZm9yIHVuZGVmIDMyIG1vZGUgKi8KLSAgQVJNdWxfU2V0UmVnIChzdGF0ZSwgU1lTVEVNTU9ERSwgMTMsIEFERFJTVVBFUlNUQUNLKTsJLyogYW5kIGZvciBzeXN0ZW0gbW9kZSAqLwotICBpbnN0ciA9IDB4ZTU5ZmYwMDAgfCAoQUREUlNPRlRWRUNUT1JTIC0gOCk7CS8qIGxvYWQgcGMgZnJvbSBzb2Z0IHZlY3RvciAqLwotICBmb3IgKGkgPSBBUk11bF9SZXNldFY7IGkgPD0gQVJNRklRVjsgaSArPSA0KQotICAgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGksIGluc3RyKTsJLyogd3JpdGUgaGFyZHdhcmUgdmVjdG9ycyAqLwotICBmb3IgKGkgPSBBUk11bF9SZXNldFY7IGkgPD0gQVJNRklRViArIDQ7IGkgKz0gNCkKLSAgICB7Ci0gICAgICBBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBBRERSU09GVFZFQ1RPUlMgKyBpLCBTT0ZUVkVDVE9SQ09ERSArIGkgKiA0KTsKLSAgICAgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIEFERFJTT0ZIQU5ETEVSUyArIDIgKiBpICsgNEwsCi0JCSAgICAgICBTT0ZUVkVDVE9SQ09ERSArIHNpemVvZiAoc29mdHZlY3RvcmNvZGUpIC0gNEwpOwotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc29mdHZlY3RvcmNvZGUpOyBpICs9IDQpCi0gICAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgU09GVFZFQ1RPUkNPREUgKyBpLCBzb2Z0dmVjdG9yY29kZVtpIC8gNF0pOwotICBmb3IgKGkgPSAwOyBpIDwgRk9QRU5fTUFYOyBpKyspCi0gICAgT1NwdHItPkZpbGVUYWJsZVtpXSA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPCBVTklRVUVURU1QUzsgaSsrKQotICAgIE9TcHRyLT50ZW1wbmFtZXNbaV0gPSBOVUxMOwotICBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiLCBEZW1vbiAxLjAxIik7Ci0KLS8qICNpZm5kZWYgQVNJTSAqLwotCi0gIC8qIGluc3RhbGwgZnBlICovCi0gIGZvciAoaSA9IDA7IGkgPCBmcGVzaXplOyBpICs9IDQpCS8qIGNvcHkgdGhlIGNvZGUgKi8KLSAgICBBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBGUEVTVEFSVCArIGksIGZwZWNvZGVbaSA+PiAyXSk7Ci0gIGZvciAoaSA9IEZQRVNUQVJUICsgZnBlc2l6ZTs7IGkgLT0gNCkKLSAgICB7CQkJCS8qIHJldmVyc2UgdGhlIGVycm9yIHN0cmluZ3MgKi8KLSAgICAgIGlmICgoaiA9IEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgaSkpID09IDB4ZmZmZmZmZmYpCi0JYnJlYWs7Ci0gICAgICBpZiAoc3RhdGUtPmJpZ2VuZFNpZyAmJiBqIDwgMHg4MDAwMDAwMCkKLQl7CQkJLyogaXQncyBwYXJ0IG9mIHRoZSBzdHJpbmcgc28gc3dhcCBpdCAqLwotCSAgaiA9ICgoaiA+PiAweDE4KSAmIDB4MDAwMDAwZmYpIHwKLQkgICAgKChqID4+IDB4MDgpICYgMHgwMDAwZmYwMCkgfAotCSAgICAoKGogPDwgMHgwOCkgJiAweDAwZmYwMDAwKSB8ICgoaiA8PCAweDE4KSAmIDB4ZmYwMDAwMDApOwotCSAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgaSwgaik7Ci0JfQotICAgIH0KLSAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgRlBFT0xEVkVDVCwgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCA0KSk7CS8qIGNvcHkgb2xkIGlsbGVnYWwgaW5zdHIgdmVjdG9yICovCi0gIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIDQsIEZQRU5FV1ZFQ1QgKEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgaSAtIDQpKSk7CS8qIGluc3RhbGwgbmV3IHZlY3RvciAqLwotICBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiLCBGUEUiKTsKLQotLyogI2VuZGlmICBBU0lNICovCi0jZW5kaWYgLyogVkFMSURBVEUgKi8KLSNlbmRpZiAvKiBOT09TICovCi0KLSAgcmV0dXJuIChUUlVFKTsKLX0KLQotdm9pZAotQVJNdWxfT1NFeGl0IChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBmcmVlICgoY2hhciAqKSBzdGF0ZS0+T1NwdHIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgUmV0dXJuIHRoZSBsYXN0IE9wZXJhdGluZyBTeXN0ZW0gRXJyb3IuICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQVJNd29yZCBBUk11bF9PU0xhc3RFcnJvclAgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIHJldHVybiAoKHN0cnVjdCBPU2Jsb2NrICopIHN0YXRlLT5PU3B0ciktPkVycm9yUDsKLX0KLQotc3RhdGljIGludCB0cmFuc2xhdGVfb3Blbl9tb2RlW10gPSB7Ci0gIE9fUkRPTkxZLAkJCS8qICJyIiAgICovCi0gIE9fUkRPTkxZICsgT19CSU5BUlksCQkvKiAicmIiICAqLwotICBPX1JEV1IsCQkJLyogInIrIiAgKi8KLSAgT19SRFdSICsgT19CSU5BUlksCQkvKiAicitiIiAqLwotICBPX1dST05MWSArIE9fQ1JFQVQgKyBPX1RSVU5DLAkvKiAidyIgICAqLwotICBPX1dST05MWSArIE9fQklOQVJZICsgT19DUkVBVCArIE9fVFJVTkMsCS8qICJ3YiIgICovCi0gIE9fUkRXUiArIE9fQ1JFQVQgKyBPX1RSVU5DLAkvKiAidysiICAqLwotICBPX1JEV1IgKyBPX0JJTkFSWSArIE9fQ1JFQVQgKyBPX1RSVU5DLAkvKiAidytiIiAqLwotICBPX1dST05MWSArIE9fQVBQRU5EICsgT19DUkVBVCwJLyogImEiICAgKi8KLSAgT19XUk9OTFkgKyBPX0JJTkFSWSArIE9fQVBQRU5EICsgT19DUkVBVCwJLyogImFiIiAgKi8KLSAgT19SRFdSICsgT19BUFBFTkQgKyBPX0NSRUFULAkvKiAiYSsiICAqLwotICBPX1JEV1IgKyBPX0JJTkFSWSArIE9fQVBQRU5EICsgT19DUkVBVAkvKiAiYStiIiAqLwotfTsKLQotc3RhdGljIHZvaWQKLVNXSVdyaXRlMCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyKQotewotICBBUk13b3JkIHRlbXA7Ci0gIHN0cnVjdCBPU2Jsb2NrICpPU3B0ciA9IChzdHJ1Y3QgT1NibG9jayAqKSBzdGF0ZS0+T1NwdHI7Ci0KLSAgd2hpbGUgKCh0ZW1wID0gQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLCBhZGRyKyspKSAhPSAwKQotICAgICh2b2lkKSBmcHV0YyAoKGNoYXIpIHRlbXAsIHN0ZG91dCk7Ci0KLSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLX0KLQotc3RhdGljIHZvaWQKLVdyaXRlQ29tbWFuZExpbmVUbyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyKQotewotICBBUk13b3JkIHRlbXA7Ci0gIGNoYXIgKmNwdHIgPSBzdGF0ZS0+Q29tbWFuZExpbmU7Ci0gIGlmIChjcHRyID09IE5VTEwpCi0gICAgY3B0ciA9ICJcMCI7Ci0gIGRvCi0gICAgewotICAgICAgdGVtcCA9IChBUk13b3JkKSAqIGNwdHIrKzsKLSAgICAgIEFSTXVsX1dyaXRlQnl0ZSAoc3RhdGUsIGFkZHIrKywgdGVtcCk7Ci0gICAgfQotICB3aGlsZSAodGVtcCAhPSAwKTsKLX0KLQotc3RhdGljIHZvaWQKLVNXSW9wZW4gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbmFtZSwgQVJNd29yZCBTV0lmbGFncykKLXsKLSAgc3RydWN0IE9TYmxvY2sgKk9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrICopIHN0YXRlLT5PU3B0cjsKLSAgY2hhciBkdW1teVsyMDAwXTsKLSAgaW50IGZsYWdzOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyAoZHVtbXlbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIG5hbWUgKyBpKSk7IGkrKykKLSAgICA7Ci0KLSAgLyogTm93IHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBEZW1vbiBvcGVuIG1vZGUgKi8KLSAgZmxhZ3MgPSB0cmFuc2xhdGVfb3Blbl9tb2RlW1NXSWZsYWdzXTsKLQotICAvKiBGaWxlbmFtZSAiOnR0IiBpcyBzcGVjaWFsOiBpdCBkZW5vdGVzIHN0ZGluL291dCAqLwotICBpZiAoc3RyY21wIChkdW1teSwgIjp0dCIpID09IDApCi0gICAgewotICAgICAgaWYgKGZsYWdzID09IE9fUkRPTkxZKQkvKiBvcGVuaW5nIHR0eSAiciIgKi8KLQlzdGF0ZS0+UmVnWzBdID0gMDsJLyogc3RkaW4gKi8KLSAgICAgIGVsc2UKLQlzdGF0ZS0+UmVnWzBdID0gMTsJLyogc3Rkb3V0ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhdGUtPlJlZ1swXSA9IChpbnQpIG9wZW4gKGR1bW15LCBmbGFncywgMDY2Nik7Ci0gICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLVNXSXJlYWQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgZiwgQVJNd29yZCBwdHIsIEFSTXdvcmQgbGVuKQotewotICBzdHJ1Y3QgT1NibG9jayAqT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sgKikgc3RhdGUtPk9TcHRyOwotICBpbnQgcmVzOwotICBpbnQgaTsKLSAgY2hhciAqbG9jYWwgPSBtYWxsb2MgKGxlbik7Ci0KLSAgaWYgKGxvY2FsID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2ltOiBVbmFibGUgdG8gcmVhZCAweCV1bHggYnl0ZXMgLSBvdXQgb2YgbWVtb3J5XG4iLAotCSAgICAgICBsZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICByZXMgPSByZWFkIChmLCBsb2NhbCwgbGVuKTsKLSAgaWYgKHJlcyA+IDApCi0gICAgZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKQotICAgICAgQVJNdWxfV3JpdGVCeXRlIChzdGF0ZSwgcHRyICsgaSwgbG9jYWxbaV0pOwotICBmcmVlIChsb2NhbCk7Ci0gIHN0YXRlLT5SZWdbMF0gPSByZXMgPT0gLTEgPyAtMSA6IGxlbiAtIHJlczsKLSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLX0KLQotc3RhdGljIHZvaWQKLVNXSXdyaXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGYsIEFSTXdvcmQgcHRyLCBBUk13b3JkIGxlbikKLXsKLSAgc3RydWN0IE9TYmxvY2sgKk9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrICopIHN0YXRlLT5PU3B0cjsKLSAgaW50IHJlczsKLSAgQVJNd29yZCBpOwotICBjaGFyICpsb2NhbCA9IG1hbGxvYyAobGVuKTsKLQotICBpZiAobG9jYWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJzaW06IFVuYWJsZSB0byB3cml0ZSAweCVseCBieXRlcyAtIG91dCBvZiBtZW1vcnlcbiIsCi0JICAgICAgIChsb25nKSBsZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgbG9jYWxbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIHB0ciArIGkpOwotCi0gIHJlcyA9IHdyaXRlIChmLCBsb2NhbCwgbGVuKTsKLSAgc3RhdGUtPlJlZ1swXSA9IHJlcyA9PSAtMSA/IC0xIDogbGVuIC0gcmVzOwotICBmcmVlIChsb2NhbCk7Ci0gIE9TcHRyLT5FcnJvck5vID0gZXJybm87Ci19Ci0KLXN0YXRpYyB2b2lkCi1TV0lmbGVuIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGZoKQotewotICBzdHJ1Y3QgT1NibG9jayAqT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sgKikgc3RhdGUtPk9TcHRyOwotICBBUk13b3JkIGFkZHI7Ci0KLSAgaWYgKGZoID09IDAgfHwgZmggPiBGT1BFTl9NQVgpCi0gICAgewotICAgICAgT1NwdHItPkVycm9yTm8gPSBFQkFERjsKLSAgICAgIHN0YXRlLT5SZWdbMF0gPSAtMUw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFkZHIgPSBsc2VlayAoZmgsIDAsIFNFRUtfQ1VSKTsKLQotICBzdGF0ZS0+UmVnWzBdID0gbHNlZWsgKGZoLCAwTCwgU0VFS19FTkQpOwotICAodm9pZCkgbHNlZWsgKGZoLCBhZGRyLCBTRUVLX1NFVCk7Ci0KLSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhlIGVtdWxhdG9yIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIGEgU1dJIGluc3RydWN0aW9uIGlzIGVuY3VudGVyZWQuIFRoZSAqCi0qIHBhcmFtZXRlciBwYXNzZWQgaXMgdGhlIFNXSSBudW1iZXIgKGxvd2VyIDI0IGJpdHMgb2YgdGhlIGluc3RydWN0aW9uKS4gICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5zaWduZWQKLUFSTXVsX09TSGFuZGxlU1dJIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIG51bWJlcikKLXsKLSAgQVJNd29yZCBhZGRyLCB0ZW1wOwotICBzdHJ1Y3QgT1NibG9jayAqT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sgKikgc3RhdGUtPk9TcHRyOwotCi0gIHN3aXRjaCAobnVtYmVyKQotICAgIHsKLSAgICBjYXNlIFNXSV9SZWFkOgotICAgICAgU1dJcmVhZCAoc3RhdGUsIHN0YXRlLT5SZWdbMF0sIHN0YXRlLT5SZWdbMV0sIHN0YXRlLT5SZWdbMl0pOwotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIFNXSV9Xcml0ZToKLSAgICAgIFNXSXdyaXRlIChzdGF0ZSwgc3RhdGUtPlJlZ1swXSwgc3RhdGUtPlJlZ1sxXSwgc3RhdGUtPlJlZ1syXSk7Ci0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIGNhc2UgU1dJX09wZW46Ci0gICAgICBTV0lvcGVuIChzdGF0ZSwgc3RhdGUtPlJlZ1swXSwgc3RhdGUtPlJlZ1sxXSk7Ci0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIGNhc2UgU1dJX0Nsb2NrOgotICAgICAgLyogcmV0dXJuIG51bWJlciBvZiBjZW50aS1zZWNvbmRzLi4uICovCi0gICAgICBzdGF0ZS0+UmVnWzBdID0KLSNpZmRlZiBDTE9DS1NfUEVSX1NFQwotCShDTE9DS1NfUEVSX1NFQyA+PSAxMDApCi0JPyAoQVJNd29yZCkgKGNsb2NrICgpIC8gKENMT0NLU19QRVJfU0VDIC8gMTAwKSkKLQk6IChBUk13b3JkKSAoKGNsb2NrICgpICogMTAwKSAvIENMT0NLU19QRVJfU0VDKTsKLSNlbHNlCi0JLyogcHJlc3VtZSB1bml4Li4uIGNsb2NrKCkgcmV0dXJucyBtaWNyb3NlY29uZHMgKi8KLQkoQVJNd29yZCkgKGNsb2NrICgpIC8gMTAwMDApOwotI2VuZGlmCi0gICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOwotICAgICAgcmV0dXJuIChUUlVFKTsKLQotICAgIGNhc2UgU1dJX1RpbWU6Ci0gICAgICBzdGF0ZS0+UmVnWzBdID0gKEFSTXdvcmQpIHRpbWUgKE5VTEwpOwotICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLSAgICAgIHJldHVybiAoVFJVRSk7Ci0KLSAgICBjYXNlIFNXSV9DbG9zZToKLSAgICAgIHN0YXRlLT5SZWdbMF0gPSBjbG9zZSAoc3RhdGUtPlJlZ1swXSk7Ci0gICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOwotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIFNXSV9GbGVuOgotICAgICAgU1dJZmxlbiAoc3RhdGUsIHN0YXRlLT5SZWdbMF0pOwotICAgICAgcmV0dXJuIChUUlVFKTsKLQotICAgIGNhc2UgU1dJX0V4aXQ6Ci0gICAgICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFOwotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIFNXSV9TZWVrOgotICAgICAgewotCS8qIFdlIG11c3QgcmV0dXJuIG5vbi16ZXJvIGZvciBmYWlsdXJlICovCi0Jc3RhdGUtPlJlZ1swXSA9IC0xID49IGxzZWVrIChzdGF0ZS0+UmVnWzBdLCBzdGF0ZS0+UmVnWzFdLCBTRUVLX1NFVCk7Ci0JT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLQlyZXR1cm4gVFJVRTsKLSAgICAgIH0KLQotICAgIGNhc2UgU1dJX1dyaXRlQzoKLSAgICAgICh2b2lkKSBmcHV0YyAoKGludCkgc3RhdGUtPlJlZ1swXSwgc3Rkb3V0KTsKLSAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm87Ci0gICAgICByZXR1cm4gKFRSVUUpOwotCi0gICAgY2FzZSBTV0lfV3JpdGUwOgotICAgICAgU1dJV3JpdGUwIChzdGF0ZSwgc3RhdGUtPlJlZ1swXSk7Ci0gICAgICByZXR1cm4gKFRSVUUpOwotCi0gICAgY2FzZSBTV0lfR2V0RXJybm86Ci0gICAgICBzdGF0ZS0+UmVnWzBdID0gT1NwdHItPkVycm9yTm87Ci0gICAgICByZXR1cm4gKFRSVUUpOwotCi0gICAgY2FzZSBTV0lfQnJlYWtwb2ludDoKLSAgICAgIHN0YXRlLT5FbmRDb25kaXRpb24gPSBSRElFcnJvcl9CcmVha3BvaW50UmVhY2hlZDsKLSAgICAgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0gICAgICByZXR1cm4gKFRSVUUpOwotCi0gICAgY2FzZSBTV0lfR2V0RW52OgotICAgICAgc3RhdGUtPlJlZ1swXSA9IEFERFJDTURMSU5FOwotICAgICAgaWYgKHN0YXRlLT5NZW1TaXplKQotCXN0YXRlLT5SZWdbMV0gPSBzdGF0ZS0+TWVtU2l6ZTsKLSAgICAgIGVsc2UKLQlzdGF0ZS0+UmVnWzFdID0gQUREUlVTRVJTVEFDSzsKLQotICAgICAgV3JpdGVDb21tYW5kTGluZVRvIChzdGF0ZSwgc3RhdGUtPlJlZ1swXSk7Ci0gICAgICByZXR1cm4gKFRSVUUpOwotCi0gICAgICAvKiBIYW5kbGUgQW5nZWwgU1dJcyBhcyB3ZWxsIGFzIERlbW9uIG9uZXMgKi8KLSAgICBjYXNlIEFuZ2VsU1dJX0FSTToKLSAgICBjYXNlIEFuZ2VsU1dJX1RodW1iOgotICAgICAgLyogUjEgaXMgYWxtb3N0IGFsd2F5cyBhIHBhcmFtZXRlciBibG9jayAqLwotICAgICAgYWRkciA9IHN0YXRlLT5SZWdbMV07Ci0gICAgICAvKiBSMCBpcyBhIHJlYXNvbiBjb2RlICovCi0gICAgICBzd2l0Y2ggKHN0YXRlLT5SZWdbMF0pCi0JewotCSAgLyogVW5pbXBsZW1lbnRlZCByZWFzb24gY29kZXMgKi8KLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9SZWFkQzoKLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9Jc1RUWToKLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9UbXBOYW06Ci0JY2FzZSBBbmdlbFNXSV9SZWFzb25fUmVtb3ZlOgotCWNhc2UgQW5nZWxTV0lfUmVhc29uX1JlbmFtZToKLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9TeXN0ZW06Ci0JY2FzZSBBbmdlbFNXSV9SZWFzb25fRW50ZXJTVkM6Ci0JZGVmYXVsdDoKLQkgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0JICByZXR1cm4gKEZBTFNFKTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX0Nsb2NrOgotCSAgLyogcmV0dXJuIG51bWJlciBvZiBjZW50aS1zZWNvbmRzLi4uICovCi0JICBzdGF0ZS0+UmVnWzBdID0KLSNpZmRlZiBDTE9DS1NfUEVSX1NFQwotCSAgICAoQ0xPQ0tTX1BFUl9TRUMgPj0gMTAwKQotCSAgICA/IChBUk13b3JkKSAoY2xvY2sgKCkgLyAoQ0xPQ0tTX1BFUl9TRUMgLyAxMDApKQotCSAgICA6IChBUk13b3JkKSAoKGNsb2NrICgpICogMTAwKSAvIENMT0NLU19QRVJfU0VDKTsKLSNlbHNlCi0JICAgIC8qIHByZXN1bWUgdW5peC4uLiBjbG9jaygpIHJldHVybnMgbWljcm9zZWNvbmRzICovCi0JICAgIChBUk13b3JkKSAoY2xvY2sgKCkgLyAxMDAwMCk7Ci0jZW5kaWYKLQkgIE9TcHRyLT5FcnJvck5vID0gZXJybm87Ci0JICByZXR1cm4gKFRSVUUpOwotCi0JY2FzZSBBbmdlbFNXSV9SZWFzb25fVGltZToKLQkgIHN0YXRlLT5SZWdbMF0gPSAoQVJNd29yZCkgdGltZSAoTlVMTCk7Ci0JICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOwotCSAgcmV0dXJuIChUUlVFKTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX1dyaXRlQzoKLQkgICh2b2lkKSBmcHV0YyAoKGludCkgQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLCBhZGRyKSwgc3Rkb3V0KTsKLQkgIE9TcHRyLT5FcnJvck5vID0gZXJybm87Ci0JICByZXR1cm4gKFRSVUUpOwotCi0JY2FzZSBBbmdlbFNXSV9SZWFzb25fV3JpdGUwOgotCSAgU1dJV3JpdGUwIChzdGF0ZSwgYWRkcik7Ci0JICByZXR1cm4gKFRSVUUpOwotCi0JY2FzZSBBbmdlbFNXSV9SZWFzb25fQ2xvc2U6Ci0JICBzdGF0ZS0+UmVnWzBdID0gY2xvc2UgKEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcikpOwotCSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLQkgIHJldHVybiAoVFJVRSk7Ci0KLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9TZWVrOgotCSAgc3RhdGUtPlJlZ1swXSA9IC0xID49IGxzZWVrIChBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHIpLAotCQkJCSAgICAgICBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHIgKyA0KSwKLQkJCQkgICAgICAgU0VFS19TRVQpOwotCSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKLQkgIHJldHVybiAoVFJVRSk7Ci0KLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9GTGVuOgotCSAgU1dJZmxlbiAoc3RhdGUsIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcikpOwotCSAgcmV0dXJuIChUUlVFKTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX0dldENtZExpbmU6Ci0JICBXcml0ZUNvbW1hbmRMaW5lVG8gKHN0YXRlLCBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHIpKTsKLQkgIHJldHVybiAoVFJVRSk7Ci0KLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9IZWFwSW5mbzoKLQkgIC8qIFIxIGlzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgKi8KLQkgIGFkZHIgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHIpOwotCi0JICAvKiBQaWNrIHVwIHRoZSByaWdodCBtZW1vcnkgbGltaXQgKi8KLQkgIGlmIChzdGF0ZS0+TWVtU2l6ZSkKLQkgICAgdGVtcCA9IHN0YXRlLT5NZW1TaXplOwotCSAgZWxzZQotCSAgICB0ZW1wID0gQUREUlVTRVJTVEFDSzsKLQotCSAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgYWRkciwgMCk7CS8qIEhlYXAgYmFzZSAqLwotCSAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgYWRkciArIDQsIHRlbXApOwkvKiBIZWFwIGxpbWl0ICovCi0JICBBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBhZGRyICsgOCwgdGVtcCk7CS8qIFN0YWNrIGJhc2UgKi8KLQkgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHIgKyAxMiwgdGVtcCk7CS8qIFN0YWNrIGxpbWl0ICovCi0JICByZXR1cm4gKFRSVUUpOwotCi0JY2FzZSBBbmdlbFNXSV9SZWFzb25fUmVwb3J0RXhjZXB0aW9uOgotCSAgaWYgKHN0YXRlLT5SZWdbMV0gPT0gQURQX1N0b3BwZWRfQXBwbGljYXRpb25FeGl0KQotCSAgICBzdGF0ZS0+UmVnWzBdID0gMDsKLQkgIGVsc2UKLQkgICAgc3RhdGUtPlJlZ1swXSA9IC0xOwotCSAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRTsKLQkgIHJldHVybiBUUlVFOwotCi0JY2FzZSBBRFBfU3RvcHBlZF9BcHBsaWNhdGlvbkV4aXQ6Ci0JICBzdGF0ZS0+UmVnWzBdID0gMDsKLQkgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0JICByZXR1cm4gKFRSVUUpOwotCi0JY2FzZSBBRFBfU3RvcHBlZF9SdW5UaW1lRXJyb3I6Ci0JICBzdGF0ZS0+UmVnWzBdID0gLTE7Ci0JICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFOwotCSAgcmV0dXJuIChUUlVFKTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX0Vycm5vOgotCSAgc3RhdGUtPlJlZ1swXSA9IE9TcHRyLT5FcnJvck5vOwotCSAgcmV0dXJuIChUUlVFKTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX09wZW46Ci0JICBTV0lvcGVuIChzdGF0ZSwKLQkJICAgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKSwKLQkJICAgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyICsgNCkpOwotCSAgcmV0dXJuIFRSVUU7Ci0KLQljYXNlIEFuZ2VsU1dJX1JlYXNvbl9SZWFkOgotCSAgU1dJcmVhZCAoc3RhdGUsCi0JCSAgIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkciksCi0JCSAgIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkciArIDQpLAotCQkgICBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHIgKyA4KSk7Ci0JICByZXR1cm4gVFJVRTsKLQotCWNhc2UgQW5nZWxTV0lfUmVhc29uX1dyaXRlOgotCSAgU1dJd3JpdGUgKHN0YXRlLAotCQkgICAgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKSwKLQkJICAgIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkciArIDQpLAotCQkgICAgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyICsgOCkpOwotCSAgcmV0dXJuIFRSVUU7Ci0JfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0gICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgTk9PUwotI2lmbmRlZiBBU0lNCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoZSBlbXVsYXRvciBjYWxscyB0aGlzIHJvdXRpbmUgd2hlbiBhbiBFeGNlcHRpb24gb2NjdXJzLiAgVGhlIHNlY29uZCAgICAgKgotKiBwYXJhbWV0ZXIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbGV2YW50IGV4Y2VwdGlvbiB2ZWN0b3IuICBSZXR1cm5pbmcgICAgICoKLSogRkFMU0UgZnJvbSB0aGlzIHJvdXRpbmUgY2F1c2VzIHRoZSB0cmFwIHRvIGJlIHRha2VuLCBUUlVFIGNhdXNlcyBpdCB0byAgICAqCi0qIGJlIGlnbm9yZWQgKHNvIHNldCBzdGF0ZS0+RW11bGF0ZSB0byBGQUxTRSEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5zaWduZWQKLUFSTXVsX09TRXhjZXB0aW9uIChBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQsIEFSTXdvcmQgdmVjdG9yIEFUVFJJQlVURV9VTlVTRUQsIEFSTXdvcmQgcGMgQVRUUklCVVRFX1VOVVNFRCkKLXsJCQkJLyogZG9uJ3QgdXNlIHRoaXMgaGVyZSAqLwotICByZXR1cm4gKEZBTFNFKTsKLX0KLQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIE5PT1MgKi8KZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtb3MuaCBiL3NpbS9hcm0vYXJtb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxMGI0Zi4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2FybW9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiAgYXJtb3MuaCAtLSBBUk11bGF0b3IgT1MgZGVmaW5pdGlvbnM6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgaW5pdGlhbCBsYXlvdXQgb2YgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBRERSU1VQRVJTVEFDSyAgICAgICAgICAweDgwMEwJLyogc3VwZXJ2aXNvciBzdGFjayBzcGFjZSAqLwotI2RlZmluZSBBRERSVVNFUlNUQUNLICAgICAgICAgICAweDgwMDAwTAkvKiBkZWZhdWx0IHVzZXIgc3RhY2sgc3RhcnQgKi8KLSNkZWZpbmUgQUREUlNPRlRWRUNUT1JTICAgICAgICAgMHg4NDBMCS8qIHNvZnQgdmVjdG9ycyBhcmUgaGVyZSAqLwotI2RlZmluZSBBRERSQ01ETElORSAgICAgICAgICAgICAweGYwMEwJLyogY29tbWFuZCBsaW5lIGlzIGhlcmUgYWZ0ZXIgYSBTV0kgR2V0RW52ICovCi0jZGVmaW5lIEFERFJTT0ZIQU5ETEVSUyAgICAgICAgIDB4YWQwTAkvKiBhZGRyZXNzIGFuZCB3b3Jrc3BhY2UgZm9yIGluc3RhbGxlZCBoYW5kbGVycyAqLwotI2RlZmluZSBTT0ZUVkVDVE9SQ09ERSAgICAgICAgICAweGI4MEwJLyogZGVmYXVsdCBoYW5kbGVycyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0kgbnVtYmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1dJX1dyaXRlQyAgICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIFNXSV9Xcml0ZTAgICAgICAgICAgICAgICAgIDB4MgotI2RlZmluZSBTV0lfUmVhZEMgICAgICAgICAgICAgICAgICAweDQKLSNkZWZpbmUgU1dJX0NMSSAgICAgICAgICAgICAgICAgICAgMHg1Ci0jZGVmaW5lIFNXSV9HZXRFbnYgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgU1dJX0V4aXQgICAgICAgICAgICAgICAgICAgMHgxMQotI2RlZmluZSBTV0lfRW50ZXJPUyAgICAgICAgICAgICAgICAweDE2Ci0KLSNkZWZpbmUgU1dJX0dldEVycm5vICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBTV0lfQ2xvY2sgICAgICAgICAgICAgICAgICAweDYxCi0jZGVmaW5lIFNXSV9UaW1lICAgICAgICAgICAgICAgICAgIDB4NjMKLSNkZWZpbmUgU1dJX1JlbW92ZSAgICAgICAgICAgICAgICAgMHg2NAotI2RlZmluZSBTV0lfUmVuYW1lICAgICAgICAgICAgICAgICAweDY1Ci0jZGVmaW5lIFNXSV9PcGVuICAgICAgICAgICAgICAgICAgIDB4NjYKLQotI2RlZmluZSBTV0lfQ2xvc2UgICAgICAgICAgICAgICAgICAweDY4Ci0jZGVmaW5lIFNXSV9Xcml0ZSAgICAgICAgICAgICAgICAgIDB4NjkKLSNkZWZpbmUgU1dJX1JlYWQgICAgICAgICAgICAgICAgICAgMHg2YQotI2RlZmluZSBTV0lfU2VlayAgICAgICAgICAgICAgICAgICAweDZiCi0jZGVmaW5lIFNXSV9GbGVuICAgICAgICAgICAgICAgICAgIDB4NmMKLQotI2RlZmluZSBTV0lfSXNUVFkgICAgICAgICAgICAgICAgICAweDZlCi0jZGVmaW5lIFNXSV9UbXBOYW0gICAgICAgICAgICAgICAgIDB4NmYKLSNkZWZpbmUgU1dJX0luc3RhbGxIYW5kbGVyICAgICAgICAgMHg3MAotI2RlZmluZSBTV0lfR2VuZXJhdGVFcnJvciAgICAgICAgICAweDcxCi0KLSNkZWZpbmUgU1dJX0JyZWFrcG9pbnQgICAgICAgICAgICAgMHgxODAwMDAJLyogc2VlIGdkYidzIHRtLWFybS5oICovCi0KLSNkZWZpbmUgQW5nZWxTV0lfQVJNCQkgICAweDEyMzQ1NgotI2RlZmluZSBBbmdlbFNXSV9UaHVtYgkJICAgMHhBQgotCi0vKiBUaGUgcmVhc29uIGNvZGVzOiAqLwotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fT3BlbgkJKDB4MDEpCi0jZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9DbG9zZQkJKDB4MDIpCi0jZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9Xcml0ZUMJCSgweDAzKQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fV3JpdGUwCQkoMHgwNCkKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1dyaXRlCQkoMHgwNSkKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1JlYWQJCSgweDA2KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fUmVhZEMJCSgweDA3KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fSXNUVFkJCSgweDA5KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fU2VlawkJKDB4MEEpCi0jZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9GTGVuCQkoMHgwQykKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1RtcE5hbQkJKDB4MEQpCi0jZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9SZW1vdmUJCSgweDBFKQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fUmVuYW1lCQkoMHgwRikKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX0Nsb2NrCQkoMHgxMCkKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1RpbWUJCSgweDExKQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fU3lzdGVtCQkoMHgxMikKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX0Vycm5vCQkoMHgxMykKLSNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX0dldENtZExpbmUgCSgweDE1KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fSGVhcEluZm8gCSgweDE2KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fRW50ZXJTVkMgCSgweDE3KQotI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fUmVwb3J0RXhjZXB0aW9uICgweDE4KQotI2RlZmluZSBBRFBfU3RvcHBlZF9BcHBsaWNhdGlvbkV4aXQgCSgoMiA8PCAxNikgKyAzOCkKLSNkZWZpbmUgQURQX1N0b3BwZWRfUnVuVGltZUVycm9yIAkoKDIgPDwgMTYpICsgMzQpCi0KLSNkZWZpbmUgRlBFU1RBUlQgMHgyMDAwTAotI2RlZmluZSBGUEVFTkQgMHg4MDAwTAotI2RlZmluZSBGUEVPTERWRUNUIEZQRVNUQVJUICsgMHgxMDBMICsgOEwgKiAxNkwgKyA0TAkvKiBzdGFjayArIDggcmVncyArIGZwc3IgKi8KLSNkZWZpbmUgRlBFTkVXVkVDVChhZGRyKSAweGVhMDAwMDAwTCArICgoYWRkcikgPj4gMikgLSAzTAkvKiBicmFuY2ggZnJvbSA0IHRvIDB4MjQwMCAqLwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBmcGVjb2RlW107Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBmcGVzaXplOwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1yZGkuYyBiL3NpbS9hcm0vYXJtcmRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmIzMTAuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9hcm1yZGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNDYgKzAsMCBAQAotLyogIGFybXJkaS5jIC0tIEFSTXVsYXRvciBSREkgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0jaW5jbHVkZSAiYXJtZW11LmgiCi0jaW5jbHVkZSAiYXJtb3MuaCIKLSNpbmNsdWRlICJkYmdfY3AuaCIKLSNpbmNsdWRlICJkYmdfY29uZi5oIgotI2luY2x1ZGUgImRiZ19yZGkuaCIKLSNpbmNsdWRlICJkYmdfaGlmLmgiCi0jaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFdhdGNoX0FueVJlYWQgKFJESVdhdGNoX0J5dGVSZWFkK1JESVdhdGNoX0hhbGZSZWFkK1JESVdhdGNoX1dvcmRSZWFkKQotI2RlZmluZSBXYXRjaF9BbnlXcml0ZSAoUkRJV2F0Y2hfQnl0ZVdyaXRlK1JESVdhdGNoX0hhbGZXcml0ZStSRElXYXRjaF9Xb3JkV3JpdGUpCi0KLXN0YXRpYyB1bnNpZ25lZCBGUFJlZ3NBZGRyOwkvKiBsYXN0IGtub3duIGFkZHJlc3Mgb2YgRlBFIHJlZ3MgKi8KLSNkZWZpbmUgRlBFU1RBUlQgMHgyMDAwTAotI2RlZmluZSBGUEVFTkQgICAweDgwMDBMCi0KLSNkZWZpbmUgSUdOT1JFKGQpIChkID0gZCkKLSNpZmRlZiBSRElfVkVSQk9TRQotI2RlZmluZSBUcmFjZVByaW50KHMpIFwKLSBpZiAocmRpX2xvZyAmIDEpIEFSTXVsX0RlYnVnUHJpbnQgcwotI2Vsc2UKLSNkZWZpbmUgVHJhY2VQcmludChzKQotI2VuZGlmCi0KLXN0YXRpYyBBUk11bF9TdGF0ZSAqc3RhdGUgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIEJyZWFrc1NldDsJLyogVGhlIG51bWJlciBvZiBicmVha3BvaW50cyBzZXQgKi8KLQotc3RhdGljIGludCByZGlfbG9nID0gMDsJCS8qIGRlYnVnZ2luZyAgPyAqLwotCi0jZGVmaW5lIExPV0VTVF9SRElfTEVWRUwgMAotI2RlZmluZSBISUdIRVNUX1JESV9MRVZFTCAxCi1zdGF0aWMgaW50IE1ZcmRpX2xldmVsID0gTE9XRVNUX1JESV9MRVZFTDsKLQotdHlwZWRlZiBzdHJ1Y3QgQnJlYWtOb2RlIEJyZWFrTm9kZTsKLXR5cGVkZWYgc3RydWN0IFdhdGNoTm9kZSBXYXRjaE5vZGU7Ci0KLXN0cnVjdCBCcmVha05vZGUKLXsJCQkJLyogQSBicmVha3BvaW50IGxpc3Qgbm9kZSAqLwotICBCcmVha05vZGUgKm5leHQ7Ci0gIEFSTXdvcmQgYWRkcmVzczsJCS8qIFRoZSBhZGRyZXNzIG9mIHRoaXMgYnJlYWtwb2ludCAqLwotICB1bnNpZ25lZCB0eXBlOwkJLyogVGhlIHR5cGUgb2YgY29tcGFyaXNvbiAqLwotICBBUk13b3JkIGJvdW5kOwkJLyogVGhlIG90aGVyIGFkZHJlc3MgZm9yIGEgcmFuZ2UgKi8KLSAgQVJNd29yZCBpbnN0OwotfTsKLQotc3RydWN0IFdhdGNoTm9kZQotewkJCQkvKiBBIHdhdGNocG9pbnQgbGlzdCBub2RlICovCi0gIFdhdGNoTm9kZSAqbmV4dDsKLSAgQVJNd29yZCBhZGRyZXNzOwkJLyogVGhlIGFkZHJlc3Mgb2YgdGhpcyB3YXRjaHBvaW50ICovCi0gIHVuc2lnbmVkIHR5cGU7CQkvKiBUaGUgdHlwZSBvZiBjb21wYXJpc29uICovCi0gIHVuc2lnbmVkIGRhdGF0eXBlOwkJLyogVGhlIHR5cGUgb2YgYWNjZXNzIHRvIHdhdGNoIGZvciAqLwotICBBUk13b3JkIGJvdW5kOwkJLyogVGhlIG90aGVyIGFkZHJlc3MgZm9yIGEgcmFuZ2UgKi8KLX07Ci0KLUJyZWFrTm9kZSAqQnJlYWtMaXN0ID0gTlVMTDsKLVdhdGNoTm9kZSAqV2F0Y2hMaXN0ID0gTlVMTDsKLQotdm9pZAotQVJNdWxfRGVidWdQcmludF9pIChjb25zdCBEYmdfSG9zdG9zSW50ZXJmYWNlICogaG9zdGlmLCBjb25zdCBjaGFyICpmb3JtYXQsCi0JCSAgICAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgZm9ybWF0KTsKLSAgaG9zdGlmLT5kYmdwcmludCAoaG9zdGlmLT5kYmdhcmcsIGZvcm1hdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotdm9pZAotQVJNdWxfRGVidWdQcmludCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgZm9ybWF0KTsKLSAgaWYgKCEocmRpX2xvZyAmIDgpKQotICAgIHN0YXRlLT5ob3N0aWYtPmRiZ3ByaW50IChzdGF0ZS0+aG9zdGlmLT5kYmdhcmcsIGZvcm1hdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotI2RlZmluZSBDT05TT0xFX1BSSU5UX01BWF9MRU4gMTI4Ci0KLXZvaWQKLUFSTXVsX0NvbnNvbGVQcmludCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIGludCBjaDsKLSAgY2hhciAqc3RyLCBidWZbQ09OU09MRV9QUklOVF9NQVhfTEVOXTsKLSAgaW50IGksIGo7Ci0gIEFSTXdvcmQganVuazsKLQotICB2YV9zdGFydCAoYXAsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmIChidWYsIGZvcm1hdCwgYXApOwotCi0gIGZvciAoaSA9IDA7IGJ1ZltpXTsgaSsrKTsJLyogVGhlIHN0cmluZyBpcyBpIGNoYXJzIGxvbmcgKi8KLQotICBzdHIgPSBidWY7Ci0gIHdoaWxlIChpID49IDMyKQotICAgIHsKLSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfT1NPcCk7Ci0gICAgICBNWXdyaXRlX3dvcmQgKGtpZG11bVsxXSwgU1dJX1dyaXRlMCk7Ci0gICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgT1NfU2VuZFN0cmluZyk7Ci0gICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgMzIpOwkvKiBTZW5kIHN0cmluZyAzMmJ5dGVzIGF0IGEgdGltZSAqLwotICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyssIHN0cisrKQotCU1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAqc3RyKTsKLSAgICAgIHdhaXRfZm9yX29zcmVwbHkgKCZqdW5rKTsKLSAgICAgIGkgLT0gMzI7Ci0gICAgfQotCi0gIGlmIChpID4gMCkKLSAgICB7Ci0gICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX09TT3ApOwotICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIFNXSV9Xcml0ZTApOwotICAgICAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIE9TX1NlbmRTdHJpbmcpOwotICAgICAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsJLyogU2VuZCByZW1haW5kZXIgb2Ygc3RyaW5nICAqLwotICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKywgc3RyKyspCi0JTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICpzdHIpOwotICAgICAgd2FpdF9mb3Jfb3NyZXBseSAoJmp1bmspOwotICAgIH0KLQotICB2YV9lbmQgKGFwKTsKLSAgcmV0dXJuOwotCi0vKiAgIHN0ciA9IGJ1ZjsgKi8KLS8qICAgd2hpbGUgKChjaD0qc3RyKyspICE9IDApICovCi0vKiAgICAgc3RhdGUtPmhvc3RpZi0+d3JpdGVjKHN0YXRlLT5ob3N0aWYtPmhvc3Rvc2FyZywgY2gpOyAqLwotfQotCi12b2lkCi1BUk11bF9EZWJ1Z1BhdXNlIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBpZiAoIShyZGlfbG9nICYgOCkpCi0gICAgc3RhdGUtPmhvc3RpZi0+ZGJncGF1c2UgKHN0YXRlLT5ob3N0aWYtPmRiZ2FyZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX29wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLUluaXRGYWlsIChpbnQgZXhpdGNvZGUsIGNoYXIgY29uc3QgKndoaWNoKQotewotICBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiJXMgaW50ZXJmYWNlIGZhaWxlZCB0byBpbml0aWFsaXNlLiBFeGl0aW5nXG4iLAotCQkgICAgICB3aGljaCk7Ci0gIGV4aXQgKGV4aXRjb2RlKTsKLX0KLQotc3RhdGljIHZvaWQKLVJESUluaXQgKHVuc2lnbmVkIHR5cGUpCi17Ci0gIGlmICh0eXBlID09IDApCi0gICAgewkJCQkvKiBjb2xkIHN0YXJ0ICovCi0gICAgICBzdGF0ZS0+Q2FsbERlYnVnID0gc3RhdGUtPk1lbVJlYWREZWJ1ZyA9IHN0YXRlLT5NZW1Xcml0ZURlYnVnID0gMDsKLSAgICAgIEJyZWFrc1NldCA9IDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIFVOS05PV05QUk9DIDAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciBuYW1lWzE2XTsKLSAgdW5zaWduZWQgdmFsOwotfQotUHJvY2Vzc29yOwotCi1Qcm9jZXNzb3IgY29uc3QgcF9hcm0yID0geyAiQVJNMiIsIEFSTTIgfTsKLVByb2Nlc3NvciBjb25zdCBwX2FybTJhcyA9IHsgIkFSTTJBUyIsIEFSTTJhcyB9OwotUHJvY2Vzc29yIGNvbnN0IHBfYXJtNjEgPSB7ICJBUk02MSIsIEFSTTYxIH07Ci1Qcm9jZXNzb3IgY29uc3QgcF9hcm0zID0geyAiQVJNMyIsIEFSTTMgfTsKLVByb2Nlc3NvciBjb25zdCBwX2FybTYgPSB7ICJBUk02IiwgQVJNNiB9OwotUHJvY2Vzc29yIGNvbnN0IHBfYXJtNjAgPSB7ICJBUk02MCIsIEFSTTYwIH07Ci1Qcm9jZXNzb3IgY29uc3QgcF9hcm02MDAgPSB7ICJBUk02MDAiLCBBUk02MDAgfTsKLVByb2Nlc3NvciBjb25zdCBwX2FybTYxMCA9IHsgIkFSTTYxMCIsIEFSTTYxMCB9OwotUHJvY2Vzc29yIGNvbnN0IHBfYXJtNjIwID0geyAiQVJNNjIwIiwgQVJNNjIwIH07Ci1Qcm9jZXNzb3IgY29uc3QgcF91bmtub3duID0geyAiIiwgVU5LTk9XTlBST0MgfTsKLQotUHJvY2Vzc29yIGNvbnN0ICpjb25zdCBwcm9jZXNzb3JzW10gPSB7Ci0gICZwX2FybTYsCQkJLyogZGVmYXVsdDogbXVzdCBjb21lIGZpcnN0ICovCi0gICZwX2FybTIsCi0gICZwX2FybTJhcywKLSAgJnBfYXJtNjEsCi0gICZwX2FybTMsCi0gICZwX2FybTYwLAotICAmcF9hcm02MDAsCi0gICZwX2FybTYxMCwKLSAgJnBfYXJtNjIwLAotICAmcF91bmtub3duCi19OwotCi10eXBlZGVmIHN0cnVjdCBQcm9jZXNzb3JDb25maWcgUHJvY2Vzc29yQ29uZmlnOwotc3RydWN0IFByb2Nlc3NvckNvbmZpZwotewotICBsb25nIGlkWzJdOwotICBQcm9jZXNzb3JDb25maWcgY29uc3QgKnNlbGY7Ci0gIGxvbmcgY291bnQ7Ci0gIFByb2Nlc3NvciBjb25zdCAqY29uc3QgKnByb2Nlc3NvcnM7Ci19OwotCi1Qcm9jZXNzb3JDb25maWcgY29uc3QgcHJvY2Vzc29yY29uZmlnID0gewotICB7KCgoKCgobG9uZykgJ3gnIDw8IDgpIHwgJyAnKSA8PCA4KSB8ICdjJykgPDwgOCkgfCAncCcsCi0gICAoKCgoKChsb25nKSAndScgPDwgOCkgfCAncycpIDw8IDgpIHwgJyAnKSA8PCA4KSB8ICd4J30sCi0gICZwcm9jZXNzb3Jjb25maWcsCi0gIDE2LAotICBwcm9jZXNzb3JzCi19OwotCi1zdGF0aWMgaW50Ci1SRElfb3BlbiAodW5zaWduZWQgdHlwZSwgY29uc3QgRGJnX0NvbmZpZ0Jsb2NrICogY29uZmlnLAotCSAgY29uc3QgRGJnX0hvc3Rvc0ludGVyZmFjZSAqIGhvc3RpZiwgc3RydWN0IERiZ19NQ1N0YXRlICpkYmdfc3RhdGUpCi0vKiBJbml0aWFsaXNlIGV2ZXJ5dGhpbmcgKi8KLXsKLSAgaW50IHZpcmdpbiA9IChzdGF0ZSA9PSBOVUxMKTsKLSAgSUdOT1JFIChkYmdfc3RhdGUpOwotCi0jaWZkZWYgUkRJX1ZFUkJPU0UKLSAgaWYgKHJkaV9sb2cgJiAxKQotICAgIHsKLSAgICAgIGlmICh2aXJnaW4pCi0JQVJNdWxfRGVidWdQcmludF9pIChob3N0aWYsICJSRElfb3BlbjogdHlwZSA9ICVkXG4iLCB0eXBlKTsKLSAgICAgIGVsc2UKLQlBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIlJESV9vcGVuOiB0eXBlID0gJWRcbiIsIHR5cGUpOwotICAgIH0KLSNlbmRpZgotCi0gIGlmICh0eXBlICYgMSkKLSAgICB7CQkJCS8qIFdhcm0gc3RhcnQgKi8KLSAgICAgIEFSTXVsX1Jlc2V0IChzdGF0ZSk7Ci0gICAgICBSRElJbml0ICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodmlyZ2luKQotCXsKLQkgIEFSTXVsX0VtdWxhdGVJbml0ICgpOwotCSAgc3RhdGUgPSBBUk11bF9OZXdTdGF0ZSAoKTsKLQkgIHN0YXRlLT5ob3N0aWYgPSBob3N0aWY7Ci0JICB7Ci0JICAgIGludCByZXEgPSBjb25maWctPnByb2Nlc3NvcjsKLQkgICAgdW5zaWduZWQgcHJvY2Vzc29yID0gcHJvY2Vzc29yc1tyZXFdLT52YWw7Ci0JICAgIEFSTXVsX1NlbGVjdFByb2Nlc3NvciAoc3RhdGUsIHByb2Nlc3Nvcik7Ci0JICAgIEFSTXVsX1Jlc2V0IChzdGF0ZSk7Ci0JICAgIEFSTXVsX0NvbnNvbGVQcmludCAoc3RhdGUsICJBUk11bGF0b3IgVjEuNTAsICVzIiwKLQkJCQlwcm9jZXNzb3JzW3JlcV0tPm5hbWUpOwotCSAgfQotCSAgaWYgKEFSTXVsX01lbW9yeUluaXQgKHN0YXRlLCBjb25maWctPm1lbW9yeXNpemUpID09IEZBTFNFKQotCSAgICBJbml0RmFpbCAoMSwgIk1lbW9yeSIpOwotCSAgaWYgKGNvbmZpZy0+Ynl0ZXNleCAhPSBSRElTZXhfRG9udENhcmUpCi0JICAgIHN0YXRlLT5iaWdlbmRTaWcgPSBjb25maWctPmJ5dGVzZXg7Ci0JICBpZiAoQVJNdWxfQ29Qcm9Jbml0IChzdGF0ZSkgPT0gRkFMU0UpCi0JICAgIEluaXRGYWlsICgyLCAiQ28tUHJvY2Vzc29yIik7Ci0JICBpZiAoQVJNdWxfT1NJbml0IChzdGF0ZSkgPT0gRkFMU0UpCi0JICAgIEluaXRGYWlsICgzLCAiT3BlcmF0aW5nIFN5c3RlbSIpOwotCX0KLSAgICAgIEFSTXVsX1Jlc2V0IChzdGF0ZSk7Ci0gICAgICBSRElJbml0ICgwKTsKLSAgICB9Ci0gIGlmICh0eXBlICYgMikKLSAgICB7CQkJCS8qIFJlc2V0IHRoZSBjb21tcyBsaW5rICovCi0gICAgICAvKiB3aGF0IGNvbW1zIGxpbmsgPyAqLwotICAgIH0KLSAgaWYgKHZpcmdpbiAmJiAodHlwZSAmIDEpID09IDApCS8qIENvbGQgc3RhcnQgKi8KLSAgICBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiLCAlcyBlbmRpYW4uXG4iLAotCQkJc3RhdGUtPmJpZ2VuZFNpZyA/ICJCaWciIDogIkxpdHRsZSIpOwotCi0gIGlmIChjb25maWctPmJ5dGVzZXggPT0gUkRJU2V4X0RvbnRDYXJlKQotICAgIHJldHVybiAoc3RhdGUtPmJpZ2VuZFNpZyA/IFJESUVycm9yX0JpZ0VuZGlhbiA6IFJESUVycm9yX0xpdHRsZUVuZGlhbik7Ci0gIGVsc2UKLSAgICByZXR1cm4gKFJESUVycm9yX05vRXJyb3IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9jbG9zZSAodm9pZCkKLXsKLSAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX2Nsb3NlXG4iKSk7Ci0gIEFSTXVsX09TRXhpdCAoc3RhdGUpOwotICBBUk11bF9Db1Byb0V4aXQgKHN0YXRlKTsKLSAgQVJNdWxfTWVtb3J5RXhpdCAoc3RhdGUpOwotICByZXR1cm4gKFJESUVycm9yX05vRXJyb3IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9yZWFkIChBUk13b3JkIHNvdXJjZSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgKm5ieXRlcykKLXsKLSAgdW5zaWduZWQgaTsKLSAgY2hhciAqbWVtcHRyID0gKGNoYXIgKikgZGVzdDsKLQotICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElfcmVhZDogc291cmNlPSUuOGx4IGRlc3Q9JXAgbmJ5dGVzPSUuOHhcbiIsCi0JICAgICAgIHNvdXJjZSwgZGVzdCwgKm5ieXRlcykpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAqbmJ5dGVzOyBpKyspCi0gICAgKm1lbXB0cisrID0gKGNoYXIpIEFSTXVsX1JlYWRCeXRlIChzdGF0ZSwgc291cmNlKyspOwotICBpZiAoc3RhdGUtPmFib3J0U2lnKQotICAgIHsKLSAgICAgIHN0YXRlLT5hYm9ydFNpZyA9IExPVzsKLSAgICAgIHJldHVybiAoUkRJRXJyb3JfRGF0YUFib3J0KTsKLSAgICB9Ci0gIHJldHVybiAoUkRJRXJyb3JfTm9FcnJvcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotUkRJX3dyaXRlIChjb25zdCB2b2lkICpzb3VyY2UsIEFSTXdvcmQgZGVzdCwgdW5zaWduZWQgKm5ieXRlcykKLXsKLSAgdW5zaWduZWQgaTsKLSAgY2hhciAqbWVtcHRyID0gKGNoYXIgKikgc291cmNlOwotCi0gIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV93cml0ZTogc291cmNlPSVwIGRlc3Q9JS44bHggbmJ5dGVzPSUuOHhcbiIsCi0JICAgICAgIHNvdXJjZSwgZGVzdCwgKm5ieXRlcykpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAqbmJ5dGVzOyBpKyspCi0gICAgQVJNdWxfV3JpdGVCeXRlIChzdGF0ZSwgKEFSTXdvcmQpIGRlc3QrKywgKEFSTXdvcmQpICogbWVtcHRyKyspOwotCi0gIGlmIChzdGF0ZS0+YWJvcnRTaWcpCi0gICAgewotICAgICAgc3RhdGUtPmFib3J0U2lnID0gTE9XOwotICAgICAgcmV0dXJuIChSRElFcnJvcl9EYXRhQWJvcnQpOwotICAgIH0KLSAgcmV0dXJuIChSRElFcnJvcl9Ob0Vycm9yKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9DUFVyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1SRElfQ1BVcmVhZCAodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGJ1ZmZlcltdKQotewotICB1bnNpZ25lZCBpLCB1cHRvOwotCi0gIGlmIChtb2RlID09IFJESU1vZGVfQ3VycikKLSAgICBtb2RlID0gKHVuc2lnbmVkKSAoQVJNdWxfR2V0Q1BTUiAoc3RhdGUpICYgTU9ERUJJVFMpOwotCi0gIGZvciAodXB0byA9IDAsIGkgPSAwOyBpIDwgMTU7IGkrKykKLSAgICBpZiAobWFzayAmICgxTCA8PCBpKSkKLSAgICAgIHsKLQlidWZmZXJbdXB0bysrXSA9IEFSTXVsX0dldFJlZyAoc3RhdGUsIG1vZGUsIGkpOwotICAgICAgfQotCi0gIGlmIChtYXNrICYgUkRJUmVnX1IxNSkKLSAgICB7Ci0gICAgICBidWZmZXJbdXB0bysrXSA9IEFSTXVsX0dldFIxNSAoc3RhdGUpOwotICAgIH0KLQotICBpZiAobWFzayAmIFJESVJlZ19QQykKLSAgICB7Ci0gICAgICBidWZmZXJbdXB0bysrXSA9IEFSTXVsX0dldFBDIChzdGF0ZSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgUkRJUmVnX0NQU1IpCi0gICAgYnVmZmVyW3VwdG8rK10gPSBBUk11bF9HZXRDUFNSIChzdGF0ZSk7Ci0KLSAgaWYgKG1hc2sgJiBSRElSZWdfU1BTUikKLSAgICBidWZmZXJbdXB0bysrXSA9IEFSTXVsX0dldFNQU1IgKHN0YXRlLCBtb2RlKTsKLQotICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElfQ1BVcmVhZDogbW9kZT0lLjh4IG1hc2s9JS44bHgiLCBtb2RlLCBtYXNrKSk7Ci0jaWZkZWYgUkRJX1ZFUkJPU0UKLSAgaWYgKHJkaV9sb2cgJiAxKQotICAgIHsKLSAgICAgIGZvciAodXB0byA9IDAsIGkgPSAwOyBpIDw9IDIwOyBpKyspCi0JaWYgKG1hc2sgJiAoMUwgPDwgaSkpCi0JICB7Ci0JICAgIEFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiJWMlLjhseCIsIHVwdG8gJSA0ID09IDAgPyAnXG4nIDogJyAnLAotCQkJICAgICAgYnVmZmVyW3VwdG9dKTsKLQkgICAgdXB0bysrOwotCSAgfQotICAgICAgQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAoUkRJRXJyb3JfTm9FcnJvcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9DUFV3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotUkRJX0NQVXdyaXRlICh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBsb25nIG1hc2ssIEFSTXdvcmQgY29uc3QgYnVmZmVyW10pCi17Ci0gIGludCBpLCB1cHRvOwotCi0KLSAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX0NQVXdyaXRlOiBtb2RlPSUuOHggbWFzaz0lLjhseCIsIG1vZGUsIG1hc2spKTsKLSNpZmRlZiBSRElfVkVSQk9TRQotICBpZiAocmRpX2xvZyAmIDEpCi0gICAgewotICAgICAgZm9yICh1cHRvID0gMCwgaSA9IDA7IGkgPD0gMjA7IGkrKykKLQlpZiAobWFzayAmICgxTCA8PCBpKSkKLQkgIHsKLQkgICAgQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIlYyUuOGx4IiwgdXB0byAlIDQgPT0gMCA/ICdcbicgOiAnICcsCi0JCQkgICAgICBidWZmZXJbdXB0b10pOwotCSAgICB1cHRvKys7Ci0JICB9Ci0gICAgICBBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG1vZGUgPT0gUkRJTW9kZV9DdXJyKQotICAgIG1vZGUgPSAodW5zaWduZWQpIChBUk11bF9HZXRDUFNSIChzdGF0ZSkgJiBNT0RFQklUUyk7Ci0KLSAgZm9yICh1cHRvID0gMCwgaSA9IDA7IGkgPCAxNTsgaSsrKQotICAgIGlmIChtYXNrICYgKDFMIDw8IGkpKQotICAgICAgQVJNdWxfU2V0UmVnIChzdGF0ZSwgbW9kZSwgaSwgYnVmZmVyW3VwdG8rK10pOwotCi0gIGlmIChtYXNrICYgUkRJUmVnX1IxNSkKLSAgICBBUk11bF9TZXRSMTUgKHN0YXRlLCBidWZmZXJbdXB0bysrXSk7Ci0KLSAgaWYgKG1hc2sgJiBSRElSZWdfUEMpCi0gICAgewotCi0gICAgICBBUk11bF9TZXRQQyAoc3RhdGUsIGJ1ZmZlclt1cHRvKytdKTsKLSAgICB9Ci0gIGlmIChtYXNrICYgUkRJUmVnX0NQU1IpCi0gICAgQVJNdWxfU2V0Q1BTUiAoc3RhdGUsIGJ1ZmZlclt1cHRvKytdKTsKLQotICBpZiAobWFzayAmIFJESVJlZ19TUFNSKQotICAgIEFSTXVsX1NldFNQU1IgKHN0YXRlLCBtb2RlLCBidWZmZXJbdXB0bysrXSk7Ci0KLSAgcmV0dXJuIChSRElFcnJvcl9Ob0Vycm9yKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9DUHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1SRElfQ1ByZWFkICh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGJ1ZmZlcltdKQotewotICBBUk13b3JkIGZwcmVnc2FkZHIsIHdvcmRbNF07Ci0KLSAgdW5zaWduZWQgciwgdzsKLSAgdW5zaWduZWQgdXB0bzsKLQotICBpZiAoQ1BudW0gIT0gMSAmJiBDUG51bSAhPSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKnJtYXAgPSBzdGF0ZS0+Q1BSZWdXb3Jkc1tDUG51bV07Ci0gICAgICBpZiAocm1hcCA9PSBOVUxMKQotCXJldHVybiAoUkRJRXJyb3JfVW5rbm93bkNvUHJvKTsKLSAgICAgIGZvciAodXB0byA9IDAsIHIgPSAwOyByIDwgcm1hcFstMV07IHIrKykKLQlpZiAobWFzayAmICgxTCA8PCByKSkKLQkgIHsKLQkgICAgKHZvaWQpIHN0YXRlLT5DUFJlYWRbQ1BudW1dIChzdGF0ZSwgciwgJmJ1ZmZlclt1cHRvXSk7Ci0JICAgIHVwdG8gKz0gcm1hcFtyXTsKLQkgIH0KLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9DUHJlYWQ6IENQbnVtPSVkIG1hc2s9JS44bHgiLCBDUG51bSwgbWFzaykpOwotI2lmZGVmIFJESV9WRVJCT1NFCi0gICAgICBpZiAocmRpX2xvZyAmIDEpCi0JewotCSAgdyA9IDA7Ci0JICBmb3IgKHVwdG8gPSAwLCByID0gMDsgciA8IHJtYXBbLTFdOyByKyspCi0JICAgIGlmIChtYXNrICYgKDFMIDw8IHIpKQotCSAgICAgIHsKLQkJaW50IHdvcmRzID0gcm1hcFtyXTsKLQkJQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIlYyUyZCIsCi0JCQkJICAodyA+PSA0ID8gKHcgPSAwLCAnXG4nKSA6ICcgJyksIHIpOwotCQl3aGlsZSAoLS13b3JkcyA+PSAwKQotCQkgIHsKLQkJICAgIEFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiICUuOGx4IiwgYnVmZmVyW3VwdG8rK10pOwotCQkgICAgdysrOwotCQkgIH0KLQkgICAgICB9Ci0JICBBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIlxuIik7Ci0JfQotI2VuZGlmCi0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLSAgICB9Ci0KLSNpZmRlZiBOT0ZQRQotICByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOwotCi0jZWxzZQotICBpZiAoRlBSZWdzQWRkciA9PSAwKQotICAgIHsKLSAgICAgIGZwcmVnc2FkZHIgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIDRMKTsKLSAgICAgIGlmICgoZnByZWdzYWRkciAmIDB4ZmY4MDAwMDApICE9IDB4ZWEwMDAwMDApCS8qIE11c3QgYmUgYSBmb3J3YXJkIGJyYW5jaCAqLwotCXJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87Ci0gICAgICBmcHJlZ3NhZGRyID0gKChmcHJlZ3NhZGRyICYgMHhmZmZmZmYpIDw8IDIpICsgODsJLyogYWRkcmVzcyBpbiBfX2ZwX2RlY29kZSAtIDQgKi8KLSAgICAgIGlmICgoZnByZWdzYWRkciA8IEZQRVNUQVJUKSB8fCAoZnByZWdzYWRkciA+PSBGUEVFTkQpKQotCXJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87Ci0gICAgICBmcHJlZ3NhZGRyID0gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBmcHJlZ3NhZGRyKTsJLyogcG9pbnRlciB0byBmcCByZWdpc3RlcnMgKi8KLSAgICAgIEZQUmVnc0FkZHIgPSBmcHJlZ3NhZGRyOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmVnc2FkZHIgPSBGUFJlZ3NBZGRyOwotCi0gIGlmIChmcHJlZ3NhZGRyID09IDApCi0gICAgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKLSAgZm9yICh1cHRvID0gMCwgciA9IDA7IHIgPCA4OyByKyspCi0gICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpCi0gICAgICB7Ci0JZm9yICh3ID0gMDsgdyA8IDQ7IHcrKykKLQkgIHdvcmRbd10gPQotCSAgICBBUk11bF9SZWFkV29yZCAoc3RhdGUsCi0JCQkgICAgZnByZWdzYWRkciArIChBUk13b3JkKSByICogMTYgKyAoQVJNd29yZCkgdyAqIDQpOwotCXN3aXRjaCAoKGludCkgKHdvcmRbM10gPj4gMjkpKQotCSAgewotCSAgY2FzZSAwOgotCSAgY2FzZSAyOgotCSAgY2FzZSA0OgotCSAgY2FzZSA2OgkJLyogaXRzIHVucGFja2VkLCBjb252ZXJ0IHRvIGV4dGVuZGVkICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gMjsJLyogbWFyayBhcyBleHRlbmRlZCAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9ICh3b3JkWzNdICYgMHg3ZmZmKSB8ICh3b3JkWzBdICYgMHg4MDAwMDAwMCk7CS8qIGV4cCBhbmQgc2lnbiAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMV07CS8qIG1hbnRpc3NhIDEgKi8KLQkgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzJdOwkvKiBtYW50aXNzYSAyICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgkJLyogcGFja2VkIHNpbmdsZSAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IDA7CS8qIG1hcmsgYXMgc2luZ2xlICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFswXTsJLyogc2lnbiwgZXhwIGFuZCBtYW50aXNzYSAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMV07CS8qIHBhZGRpbmcgKi8KLQkgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzJdOwkvKiBwYWRkaW5nICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgkJLyogcGFja2VkIGRvdWJsZSAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IDE7CS8qIG1hcmsgYXMgZG91YmxlICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFswXTsJLyogc2lnbiwgZXhwIGFuZCBtYW50aXNzYTEgKi8KLQkgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzFdOwkvKiBtYW50aXNzYSAyICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsyXTsJLyogcGFkZGluZyAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNToJCS8qIHBhY2tlZCBleHRlbmRlZCAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IDI7CS8qIG1hcmsgYXMgZXh0ZW5kZWQgKi8KLQkgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzBdOwkvKiBzaWduIGFuZCBleHAgKi8KLQkgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzFdOwkvKiBtYW50aXNzYSAxICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsyXTsJLyogbWFudGlzc2EgMiAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoJCS8qIHBhY2tlZCBkZWNpbWFsICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gMzsJLyogbWFyayBhcyBwYWNrZWQgZGVjaW1hbCAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMF07CS8qIHNpZ24sIGV4cCBhbmQgbWFudGlzc2ExICovCi0JICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsxXTsJLyogbWFudGlzc2EgMiAqLwotCSAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMl07CS8qIG1hbnRpc3NhIDMgKi8KLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gIGlmIChtYXNrICYgKDFMIDw8IHIpKQotICAgIGJ1ZmZlclt1cHRvKytdID0gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBmcHJlZ3NhZGRyICsgMTI4KTsJLyogZnBzciAqLwotICBpZiAobWFzayAmICgxTCA8PCAociArIDEpKSkKLSAgICBidWZmZXJbdXB0bysrXSA9IDA7CQkvKiBmcGNyICovCi0KLSAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX0NQcmVhZDogQ1BudW09JWQgbWFzaz0lLjhseFxuIiwgQ1BudW0sIG1hc2spKTsKLSNpZmRlZiBSRElfVkVSQk9TRQotICBpZiAocmRpX2xvZyAmIDEpCi0gICAgewotICAgICAgZm9yICh1cHRvID0gMCwgciA9IDA7IHIgPCA5OyByKyspCi0JaWYgKG1hc2sgJiAoMUwgPDwgcikpCi0JICB7Ci0JICAgIGlmIChyICE9IDgpCi0JICAgICAgewotCQlBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIiUwOGx4ICIsIGJ1ZmZlclt1cHRvKytdKTsKLQkJQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIlMDhseCAiLCBidWZmZXJbdXB0bysrXSk7Ci0JCUFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiJTA4bHggIiwgYnVmZmVyW3VwdG8rK10pOwotCSAgICAgIH0KLQkgICAgQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIlMDhseFxuIiwgYnVmZmVyW3VwdG8rK10pOwotCSAgfQotICAgICAgQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICJcbiIpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gKFJESUVycm9yX05vRXJyb3IpOwotI2VuZGlmIC8qIE5PRlBFICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9DUHdyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotUkRJX0NQd3JpdGUgKHVuc2lnbmVkIENQbnVtLCB1bnNpZ25lZCBsb25nIG1hc2ssIEFSTXdvcmQgY29uc3QgYnVmZmVyW10pCi17Ci0gIHVuc2lnbmVkIHI7Ci0gIHVuc2lnbmVkIHVwdG87Ci0gIEFSTXdvcmQgZnByZWdzYWRkcjsKLQotICBpZiAoQ1BudW0gIT0gMSAmJiBDUG51bSAhPSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKnJtYXAgPSBzdGF0ZS0+Q1BSZWdXb3Jkc1tDUG51bV07Ci0gICAgICBpZiAocm1hcCA9PSBOVUxMKQotCXJldHVybiAoUkRJRXJyb3JfVW5rbm93bkNvUHJvKTsKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9DUHdyaXRlOiBDUG51bT0lZCBtYXNrPSUuOGx4IiwgQ1BudW0sIG1hc2spKTsKLSNpZmRlZiBSRElfVkVSQk9TRQotICAgICAgaWYgKHJkaV9sb2cgJiAxKQotCXsKLQkgIGludCB3ID0gMDsKLQkgIGZvciAodXB0byA9IDAsIHIgPSAwOyByIDwgcm1hcFstMV07IHIrKykKLQkgICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpCi0JICAgICAgewotCQlpbnQgd29yZHMgPSBybWFwW3JdOwotCQlBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIiVjJTJkIiwKLQkJCQkgICh3ID49IDQgPyAodyA9IDAsICdcbicpIDogJyAnKSwgcik7Ci0JCXdoaWxlICgtLXdvcmRzID49IDApCi0JCSAgewotCQkgICAgQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIgJS44bHgiLCBidWZmZXJbdXB0bysrXSk7Ci0JCSAgICB3Kys7Ci0JCSAgfQotCSAgICAgIH0KLQkgIEFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiXG4iKTsKLQl9Ci0jZW5kaWYKLSAgICAgIGZvciAodXB0byA9IDAsIHIgPSAwOyByIDwgcm1hcFstMV07IHIrKykKLQlpZiAobWFzayAmICgxTCA8PCByKSkKLQkgIHsKLQkgICAgKHZvaWQpIHN0YXRlLT5DUFdyaXRlW0NQbnVtXSAoc3RhdGUsIHIsICZidWZmZXJbdXB0b10pOwotCSAgICB1cHRvICs9IHJtYXBbcl07Ci0JICB9Ci0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLSAgICB9Ci0KLSNpZmRlZiBOT0ZQRQotICByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOwotCi0jZWxzZQotICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElfQ1B3cml0ZTogQ1BudW09JWQgbWFzaz0lLjhseCIsIENQbnVtLCBtYXNrKSk7Ci0jaWZkZWYgUkRJX1ZFUkJPU0UKLSAgaWYgKHJkaV9sb2cgJiAxKQotICAgIHsKLSAgICAgIGZvciAodXB0byA9IDAsIHIgPSAwOyByIDwgOTsgcisrKQotCWlmIChtYXNrICYgKDFMIDw8IHIpKQotCSAgewotCSAgICBpZiAociAhPSA4KQotCSAgICAgIHsKLQkJQVJNdWxfRGVidWdQcmludCAoc3RhdGUsICIlMDhseCAiLCBidWZmZXJbdXB0bysrXSk7Ci0JCUFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiJTA4bHggIiwgYnVmZmVyW3VwdG8rK10pOwotCQlBUk11bF9EZWJ1Z1ByaW50IChzdGF0ZSwgIiUwOGx4ICIsIGJ1ZmZlclt1cHRvKytdKTsKLQkgICAgICB9Ci0JICAgIEFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiJTA4bHhcbiIsIGJ1ZmZlclt1cHRvKytdKTsKLQkgIH0KLSAgICAgIEFSTXVsX0RlYnVnUHJpbnQgKHN0YXRlLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoRlBSZWdzQWRkciA9PSAwKQotICAgIHsKLSAgICAgIGZwcmVnc2FkZHIgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIDRMKTsKLSAgICAgIGlmICgoZnByZWdzYWRkciAmIDB4ZmY4MDAwMDApICE9IDB4ZWEwMDAwMDApCS8qIE11c3QgYmUgYSBmb3J3YXJkIGJyYW5jaCAqLwotCXJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87Ci0gICAgICBmcHJlZ3NhZGRyID0gKChmcHJlZ3NhZGRyICYgMHhmZmZmZmYpIDw8IDIpICsgODsJLyogYWRkcmVzcyBpbiBfX2ZwX2RlY29kZSAtIDQgKi8KLSAgICAgIGlmICgoZnByZWdzYWRkciA8IEZQRVNUQVJUKSB8fCAoZnByZWdzYWRkciA+PSBGUEVFTkQpKQotCXJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87Ci0gICAgICBmcHJlZ3NhZGRyID0gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBmcHJlZ3NhZGRyKTsJLyogcG9pbnRlciB0byBmcCByZWdpc3RlcnMgKi8KLSAgICAgIEZQUmVnc0FkZHIgPSBmcHJlZ3NhZGRyOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmVnc2FkZHIgPSBGUFJlZ3NBZGRyOwotCi0gIGlmIChmcHJlZ3NhZGRyID09IDApCi0gICAgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKLSAgZm9yICh1cHRvID0gMCwgciA9IDA7IHIgPCA4OyByKyspCi0gICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpCi0gICAgICB7Ci0JQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgZnByZWdzYWRkciArIChBUk13b3JkKSByICogMTYsCi0JCQkgYnVmZmVyW3VwdG8gKyAxXSk7Ci0JQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgZnByZWdzYWRkciArIChBUk13b3JkKSByICogMTYgKyA0LAotCQkJIGJ1ZmZlclt1cHRvICsgMl0pOwotCUFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGZwcmVnc2FkZHIgKyAoQVJNd29yZCkgciAqIDE2ICsgOCwKLQkJCSBidWZmZXJbdXB0byArIDNdKTsKLQlBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBmcHJlZ3NhZGRyICsgKEFSTXdvcmQpIHIgKiAxNiArIDEyLAotCQkJIChidWZmZXJbdXB0b10gKiAyICsgMSkgPDwgMjkpOwkvKiBtYXJrIHR5cGUgKi8KLQl1cHRvICs9IDQ7Ci0gICAgICB9Ci0gIGlmIChtYXNrICYgKDFMIDw8IHIpKQotICAgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGZwcmVnc2FkZHIgKyAxMjgsIGJ1ZmZlclt1cHRvKytdKTsJLyogZnBzciAqLwotICByZXR1cm4gKFJESUVycm9yX05vRXJyb3IpOwotI2VuZGlmIC8qIE5PRlBFICovCi19Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVicmVha25vZGUgKEJyZWFrTm9kZSAqKiBwcmV2cCkKLXsKLSAgQnJlYWtOb2RlICpwID0gKnByZXZwOwotICAqcHJldnAgPSBwLT5uZXh0OwotICBBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBwLT5hZGRyZXNzLCBwLT5pbnN0KTsKLSAgZnJlZSAoKGNoYXIgKikgcCk7Ci0gIEJyZWFrc1NldC0tOwotICBzdGF0ZS0+Q2FsbERlYnVnLS07Ci19Ci0KLXN0YXRpYyBpbnQKLXJlbW92ZWJyZWFrIChBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUpCi17Ci0gIEJyZWFrTm9kZSAqcCwgKipwcmV2cCA9ICZCcmVha0xpc3Q7Ci0gIGZvciAoOyAocCA9ICpwcmV2cCkgIT0gTlVMTDsgcHJldnAgPSAmcC0+bmV4dCkKLSAgICBpZiAocC0+YWRkcmVzcyA9PSBhZGRyZXNzICYmIHAtPnR5cGUgPT0gdHlwZSkKLSAgICAgIHsKLQlkZWxldGVicmVha25vZGUgKHByZXZwKTsKLQlyZXR1cm4gVFJVRTsKLSAgICAgIH0KLSAgcmV0dXJuIEZBTFNFOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaW5zdGFsbHMgYSBicmVha3BvaW50IGludG8gdGhlIGJyZWFrcG9pbnQgdGFibGUgKi8KLQotc3RhdGljIEJyZWFrTm9kZSAqCi1pbnN0YWxsYnJlYWsgKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBib3VuZCkKLXsKLSAgQnJlYWtOb2RlICpwID0gKEJyZWFrTm9kZSAqKSBtYWxsb2MgKHNpemVvZiAoQnJlYWtOb2RlKSk7Ci0gIHAtPm5leHQgPSBCcmVha0xpc3Q7Ci0gIEJyZWFrTGlzdCA9IHA7Ci0gIHAtPmFkZHJlc3MgPSBhZGRyZXNzOwotICBwLT50eXBlID0gdHlwZTsKLSAgcC0+Ym91bmQgPSBib3VuZDsKLSAgcC0+aW5zdCA9IEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHJlc3MsIDB4ZWUwMDAwMDBMKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9zZXRicmVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotUkRJX3NldGJyZWFrIChBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgYm91bmQsCi0JICAgICAgUG9pbnRIYW5kbGUgKiBoYW5kbGUpCi17Ci0gIEJyZWFrTm9kZSAqcDsKLSAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX3NldGJyZWFrOiBhZGRyZXNzPSUuOGx4IHR5cGU9JWQgYm91bmQ9JS44bHhcbiIsCi0JICAgICAgIGFkZHJlc3MsIHR5cGUsIGJvdW5kKSk7Ci0KLSAgcmVtb3ZlYnJlYWsgKGFkZHJlc3MsIHR5cGUpOwotICBwID0gaW5zdGFsbGJyZWFrIChhZGRyZXNzLCB0eXBlLCBib3VuZCk7Ci0gIEJyZWFrc1NldCsrOwotICBzdGF0ZS0+Q2FsbERlYnVnKys7Ci0gICpoYW5kbGUgPSAoUG9pbnRIYW5kbGUpIHA7Ci0gIFRyYWNlUHJpbnQgKChzdGF0ZSwgIiByZXR1cm5zICUuOGx4XG4iLCAqaGFuZGxlKSk7Ci0gIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfY2xlYXJicmVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9jbGVhcmJyZWFrIChQb2ludEhhbmRsZSBoYW5kbGUpCi17Ci0gIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9jbGVhcmJyZWFrOiBhZGRyZXNzPSUuOGx4XG4iLCBoYW5kbGUpKTsKLSAgewotICAgIEJyZWFrTm9kZSAqcCwgKipwcmV2cCA9ICZCcmVha0xpc3Q7Ci0gICAgZm9yICg7IChwID0gKnByZXZwKSAhPSBOVUxMOyBwcmV2cCA9ICZwLT5uZXh0KQotICAgICAgaWYgKHAgPT0gKEJyZWFrTm9kZSAqKSBoYW5kbGUpCi0JYnJlYWs7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob1N1Y2hQb2ludDsKLSAgICBkZWxldGVicmVha25vZGUgKHByZXZwKTsKLSAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgIEludGVybmFsIGZ1bmN0aW9ucyBmb3IgYnJlYWtwb2ludCB0YWJsZSBtYW5pcHVsYXRpb24gICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1kZWxldGV3YXRjaG5vZGUgKFdhdGNoTm9kZSAqKiBwcmV2cCkKLXsKLSAgV2F0Y2hOb2RlICpwID0gKnByZXZwOwotICBpZiAocC0+ZGF0YXR5cGUgJiBXYXRjaF9BbnlSZWFkKQotICAgIHN0YXRlLT5NZW1SZWFkRGVidWctLTsKLSAgaWYgKHAtPmRhdGF0eXBlICYgV2F0Y2hfQW55V3JpdGUpCi0gICAgc3RhdGUtPk1lbVdyaXRlRGVidWctLTsKLSAgKnByZXZwID0gcC0+bmV4dDsKLSAgZnJlZSAoKGNoYXIgKikgcCk7Ci19Ci0KLWludAotcmVtb3Zld2F0Y2ggKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSkKLXsKLSAgV2F0Y2hOb2RlICpwLCAqKnByZXZwID0gJldhdGNoTGlzdDsKLSAgZm9yICg7IChwID0gKnByZXZwKSAhPSBOVUxMOyBwcmV2cCA9ICZwLT5uZXh0KQotICAgIGlmIChwLT5hZGRyZXNzID09IGFkZHJlc3MgJiYgcC0+dHlwZSA9PSB0eXBlKQotICAgICAgewkJCQkvKiBmb3VuZCBhIG1hdGNoICovCi0JZGVsZXRld2F0Y2hub2RlIChwcmV2cCk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgICB9Ci0gIHJldHVybiBGQUxTRTsJCQkvKiBuZXZlciBmb3VuZCBhIG1hdGNoICovCi19Ci0KLXN0YXRpYyBXYXRjaE5vZGUgKgotaW5zdGFsbHdhdGNoIChBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIGRhdGF0eXBlLAotCSAgICAgIEFSTXdvcmQgYm91bmQpCi17Ci0gIFdhdGNoTm9kZSAqcCA9IChXYXRjaE5vZGUgKikgbWFsbG9jIChzaXplb2YgKFdhdGNoTm9kZSkpOwotICBwLT5uZXh0ID0gV2F0Y2hMaXN0OwotICBXYXRjaExpc3QgPSBwOwotICBwLT5hZGRyZXNzID0gYWRkcmVzczsKLSAgcC0+dHlwZSA9IHR5cGU7Ci0gIHAtPmRhdGF0eXBlID0gZGF0YXR5cGU7Ci0gIHAtPmJvdW5kID0gYm91bmQ7Ci0gIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfc2V0d2F0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9zZXR3YXRjaCAoQVJNd29yZCBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBkYXRhdHlwZSwKLQkgICAgICBBUk13b3JkIGJvdW5kLCBQb2ludEhhbmRsZSAqIGhhbmRsZSkKLXsKLSAgV2F0Y2hOb2RlICpwOwotICBUcmFjZVByaW50ICgKLQkgICAgICAoc3RhdGUsCi0JICAgICAgICJSRElfc2V0d2F0Y2g6IGFkZHJlc3M9JS44bHggdHlwZT0lZCBkYXRhdHlwZT0lZCBib3VuZD0lLjhseCIsCi0JICAgICAgIGFkZHJlc3MsIHR5cGUsIGRhdGF0eXBlLCBib3VuZCkpOwotCi0gIGlmICghc3RhdGUtPkNhbldhdGNoKQotICAgIHJldHVybiBSRElFcnJvcl9VbmltcGxlbWVudGVkTWVzc2FnZTsKLQotICByZW1vdmV3YXRjaCAoYWRkcmVzcywgdHlwZSk7Ci0gIHAgPSBpbnN0YWxsd2F0Y2ggKGFkZHJlc3MsIHR5cGUsIGRhdGF0eXBlLCBib3VuZCk7Ci0gIGlmIChkYXRhdHlwZSAmIFdhdGNoX0FueVJlYWQpCi0gICAgc3RhdGUtPk1lbVJlYWREZWJ1ZysrOwotICBpZiAoZGF0YXR5cGUgJiBXYXRjaF9BbnlXcml0ZSkKLSAgICBzdGF0ZS0+TWVtV3JpdGVEZWJ1ZysrOwotICAqaGFuZGxlID0gKFBvaW50SGFuZGxlKSBwOwotICBUcmFjZVByaW50ICgoc3RhdGUsICIgcmV0dXJucyAlLjhseFxuIiwgKmhhbmRsZSkpOwotICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX2NsZWFyd2F0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1SRElfY2xlYXJ3YXRjaCAoUG9pbnRIYW5kbGUgaGFuZGxlKQotewotICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElfY2xlYXJ3YXRjaDogYWRkcmVzcz0lLjhseFxuIiwgaGFuZGxlKSk7Ci0gIHsKLSAgICBXYXRjaE5vZGUgKnAsICoqcHJldnAgPSAmV2F0Y2hMaXN0OwotICAgIGZvciAoOyAocCA9ICpwcmV2cCkgIT0gTlVMTDsgcHJldnAgPSAmcC0+bmV4dCkKLSAgICAgIGlmIChwID09IChXYXRjaE5vZGUgKikgaGFuZGxlKQotCWJyZWFrOwotICAgIGlmIChwID09IE5VTEwpCi0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9TdWNoUG9pbnQ7Ci0gICAgZGVsZXRld2F0Y2hub2RlIChwcmV2cCk7Ci0gICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX2V4ZWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1SRElfZXhlY3V0ZSAoUG9pbnRIYW5kbGUgKiBoYW5kbGUpCi17Ci0gIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9leGVjdXRlXG4iKSk7Ci0gIGlmIChyZGlfbG9nICYgNCkKLSAgICB7Ci0gICAgICBzdGF0ZS0+Q2FsbERlYnVnKys7Ci0gICAgICBzdGF0ZS0+RGVidWcgPSBUUlVFOwotICAgIH0KLSAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IFJESUVycm9yX05vRXJyb3I7Ci0gIHN0YXRlLT5TdG9wSGFuZGxlID0gMDsKLQotICBBUk11bF9Eb1Byb2cgKHN0YXRlKTsKLQotICAqaGFuZGxlID0gc3RhdGUtPlN0b3BIYW5kbGU7Ci0gIHN0YXRlLT5SZWdbMTVdIC09IDg7CQkvKiB1bmRvIHRoZSBwaXBlbGluZSAqLwotICBpZiAocmRpX2xvZyAmIDQpCi0gICAgewotICAgICAgc3RhdGUtPkNhbGxEZWJ1Zy0tOwotICAgICAgc3RhdGUtPkRlYnVnID0gRkFMU0U7Ci0gICAgfQotICByZXR1cm4gKHN0YXRlLT5FbmRDb25kaXRpb24pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX3N0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9zdGVwICh1bnNpZ25lZCBuaW5zdHIsIFBvaW50SGFuZGxlICogaGFuZGxlKQotewotCi0gIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9zdGVwXG4iKSk7Ci0gIGlmIChuaW5zdHIgIT0gMSkKLSAgICByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7Ci0gIGlmIChyZGlfbG9nICYgNCkKLSAgICB7Ci0gICAgICBzdGF0ZS0+Q2FsbERlYnVnKys7Ci0gICAgICBzdGF0ZS0+RGVidWcgPSBUUlVFOwotICAgIH0KLSAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IFJESUVycm9yX05vRXJyb3I7Ci0gIHN0YXRlLT5TdG9wSGFuZGxlID0gMDsKLSAgQVJNdWxfRG9JbnN0ciAoc3RhdGUpOwotICAqaGFuZGxlID0gc3RhdGUtPlN0b3BIYW5kbGU7Ci0gIHN0YXRlLT5SZWdbMTVdIC09IDg7CQkvKiB1bmRvIHRoZSBwaXBlbGluZSAqLwotICBpZiAocmRpX2xvZyAmIDQpCi0gICAgewotICAgICAgc3RhdGUtPkNhbGxEZWJ1Zy0tOwotICAgICAgc3RhdGUtPkRlYnVnID0gRkFMU0U7Ci0gICAgfQotICByZXR1cm4gKHN0YXRlLT5FbmRDb25kaXRpb24pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLVJESV9pbmZvICh1bnNpZ25lZCB0eXBlLCBBUk13b3JkICogYXJnMSwgQVJNd29yZCAqIGFyZzIpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRElJbmZvX1RhcmdldDoKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9JbmZvX1RhcmdldFxuIikpOwotICAgICAgLyogRW11bGF0b3IsIHNwZWVkIDEwKio1IElQUyAqLwotICAgICAgKmFyZzEgPSA1IHwgSElHSEVTVF9SRElfTEVWRUwgPDwgNSB8IExPV0VTVF9SRElfTEVWRUwgPDwgODsKLSAgICAgICphcmcyID0gMTI5ODIyNDQzNDsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElJbmZvX1BvaW50czoKLSAgICAgIHsKLQlBUk13b3JkIG4gPSBSRElQb2ludENhcGFiaWxpdHlfQ29tcGFyaXNvbiB8IFJESVBvaW50Q2FwYWJpbGl0eV9SYW5nZSB8Ci0JICBSRElQb2ludENhcGFiaWxpdHlfTWFzayB8IFJESVBvaW50Q2FwYWJpbGl0eV9TdGF0dXM7Ci0JVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX0luZm9fUG9pbnRzXG4iKSk7Ci0JaWYgKHN0YXRlLT5DYW5XYXRjaCkKLQkgIG4gfD0gKFdhdGNoX0FueVJlYWQgKyBXYXRjaF9BbnlXcml0ZSkgPDwgMjsKLQkqYXJnMSA9IG47Ci0JcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJESUluZm9fU3RlcDoKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9JbmZvX1N0ZXBcbiIpKTsKLSAgICAgICphcmcxID0gUkRJU3RlcF9TaW5nbGU7Ci0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLQotICAgIGNhc2UgUkRJSW5mb19NTVU6Ci0gICAgICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElfSW5mb19NTVVcbiIpKTsKLSAgICAgICphcmcxID0gMTMxMzgyMDIyOTsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElTaWduYWxfU3RvcDoKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESVNpZ25hbF9TdG9wXG4iKSk7Ci0gICAgICBzdGF0ZS0+Q2FsbERlYnVnKys7Ci0gICAgICBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gUkRJRXJyb3JfVXNlckludGVycnVwdDsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElWZWN0b3JfQ2F0Y2g6Ci0gICAgICBUcmFjZVByaW50ICgoc3RhdGUsICJSRElWZWN0b3JfQ2F0Y2ggJS44bHhcbiIsICphcmcxKSk7Ci0gICAgICBzdGF0ZS0+VmVjdG9yQ2F0Y2ggPSAodW5zaWduZWQpICphcmcxOwotICAgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Ci0KLSAgICBjYXNlIFJESVNldF9DbWRsaW5lOgotICAgICAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX1NldF9DbWRsaW5lICVzXG4iLCAoY2hhciAqKSBhcmcxKSk7Ci0gICAgICBzdGF0ZS0+Q29tbWFuZExpbmUgPQotCShjaGFyICopIG1hbGxvYyAoKHVuc2lnbmVkKSBzdHJsZW4gKChjaGFyICopIGFyZzEpICsgMSk7Ci0gICAgICAodm9pZCkgc3RyY3B5IChzdGF0ZS0+Q29tbWFuZExpbmUsIChjaGFyICopIGFyZzEpOwotICAgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Ci0KLSAgICBjYXNlIFJESUN5Y2xlczoKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlJESV9JbmZvX0N5Y2xlc1xuIikpOwotICAgICAgYXJnMVswXSA9IDA7Ci0gICAgICBhcmcxWzFdID0gc3RhdGUtPk51bUluc3RyczsKLSAgICAgIGFyZzFbMl0gPSAwOwotICAgICAgYXJnMVszXSA9IHN0YXRlLT5OdW1TY3ljbGVzOwotICAgICAgYXJnMVs0XSA9IDA7Ci0gICAgICBhcmcxWzVdID0gc3RhdGUtPk51bU5jeWNsZXM7Ci0gICAgICBhcmcxWzZdID0gMDsKLSAgICAgIGFyZzFbN10gPSBzdGF0ZS0+TnVtSWN5Y2xlczsKLSAgICAgIGFyZzFbOF0gPSAwOwotICAgICAgYXJnMVs5XSA9IHN0YXRlLT5OdW1DY3ljbGVzOwotICAgICAgYXJnMVsxMF0gPSAwOwotICAgICAgYXJnMVsxMV0gPSBzdGF0ZS0+TnVtRmN5Y2xlczsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElFcnJvclA6Ci0gICAgICAqYXJnMSA9IEFSTXVsX09TTGFzdEVycm9yUCAoc3RhdGUpOwotICAgICAgVHJhY2VQcmludCAoKHN0YXRlLCAiUkRJX0Vycm9yUCByZXR1cm5zICVsZFxuIiwgKmFyZzEpKTsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElJbmZvX0Rlc2NyaWJlQ29Qcm86Ci0gICAgICB7Ci0JaW50IGNwbnVtID0gKihpbnQgKikgYXJnMTsKLQlzdHJ1Y3QgRGJnX0NvUHJvRGVzYyAqY3BkID0gKHN0cnVjdCBEYmdfQ29Qcm9EZXNjICopIGFyZzI7Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBjb25zdCAqbWFwID0gc3RhdGUtPkNQUmVnV29yZHNbY3BudW1dOwotCWlmIChtYXAgPT0gTlVMTCkKLQkgIHJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87Ci0JZm9yIChpID0gMDsgaSA8IGNwZC0+ZW50cmllczsgaSsrKQotCSAgewotCSAgICB1bnNpZ25lZCByLCB3ID0gY3BkLT5yZWdkZXNjW2ldLm5ieXRlcyAvIHNpemVvZiAoQVJNd29yZCk7Ci0JICAgIGZvciAociA9IGNwZC0+cmVnZGVzY1tpXS5ybWluOyByIDw9IGNwZC0+cmVnZGVzY1tpXS5ybWF4OyByKyspCi0JICAgICAgaWYgKG1hcFtyXSAhPSB3KQotCQlyZXR1cm4gUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZTsKLQkgIH0KLQlyZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLSAgICAgIH0KLQotICAgIGNhc2UgUkRJSW5mb19SZXF1ZXN0Q29Qcm9EZXNjOgotICAgICAgewotCWludCBjcG51bSA9ICooaW50ICopIGFyZzE7Ci0Jc3RydWN0IERiZ19Db1Byb0Rlc2MgKmNwZCA9IChzdHJ1Y3QgRGJnX0NvUHJvRGVzYyAqKSBhcmcyOwotCWludCBpID0gLTEsIGxhc3R3ID0gLTEsIHI7Ci0JdW5zaWduZWQgY2hhciBjb25zdCAqbWFwOwotCWlmICgodW5zaWduZWQpIGNwbnVtID49IDE2KQotCSAgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKLQltYXAgPSBzdGF0ZS0+Q1BSZWdXb3Jkc1tjcG51bV07Ci0JaWYgKG1hcCA9PSBOVUxMKQotCSAgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKLQlmb3IgKHIgPSAwOyByIDwgbWFwWy0xXTsgcisrKQotCSAgewotCSAgICBpbnQgd29yZHMgPSBtYXBbcl07Ci0JICAgIGlmICh3b3JkcyA9PSBsYXN0dykKLQkgICAgICBjcGQtPnJlZ2Rlc2NbaV0ucm1heCA9IHI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmICgrK2kgPj0gY3BkLT5lbnRyaWVzKQotCQkgIHJldHVybiBSRElFcnJvcl9CdWZmZXJGdWxsOwotCQljcGQtPnJlZ2Rlc2NbaV0ucm1heCA9IGNwZC0+cmVnZGVzY1tpXS5ybWluID0gcjsKLQkJY3BkLT5yZWdkZXNjW2ldLm5ieXRlcyA9IHdvcmRzICogc2l6ZW9mIChBUk13b3JkKTsKLQkJY3BkLT5yZWdkZXNjW2ldLmFjY2VzcyA9Ci0JCSAgRGJnX0FjY2Vzc19SZWFkYWJsZSArIERiZ19BY2Nlc3NfV3JpdGFibGU7Ci0JICAgICAgfQotCSAgfQotCWNwZC0+ZW50cmllcyA9IGkgKyAxOwotCXJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotICAgICAgfQotCi0gICAgY2FzZSBSRElJbmZvX0xvZzoKLSAgICAgICphcmcxID0gKEFSTXdvcmQpIHJkaV9sb2c7Ci0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLQotICAgIGNhc2UgUkRJSW5mb19TZXRMb2c6Ci0gICAgICByZGlfbG9nID0gKGludCkgKmFyZzE7Ci0gICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLQotICAgIGNhc2UgUkRJSW5mb19Db1BybzoKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgY2FzZSBSRElQb2ludFN0YXR1c19XYXRjaDoKLSAgICAgIHsKLQlXYXRjaE5vZGUgKnAsICpoYW5kbGUgPSAoV2F0Y2hOb2RlICopICogYXJnMTsKLQlmb3IgKHAgPSBXYXRjaExpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JICBpZiAocCA9PSBoYW5kbGUpCi0JICAgIHsKLQkgICAgICAqYXJnMSA9IC0xOwotCSAgICAgICphcmcyID0gMTsKLQkgICAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKLQkgICAgfQotCXJldHVybiBSRElFcnJvcl9Ob1N1Y2hQb2ludDsKLSAgICAgIH0KLQotICAgIGNhc2UgUkRJUG9pbnRTdGF0dXNfQnJlYWs6Ci0gICAgICB7Ci0JQnJlYWtOb2RlICpwLCAqaGFuZGxlID0gKEJyZWFrTm9kZSAqKSAqIGFyZzE7Ci0JZm9yIChwID0gQnJlYWtMaXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgaWYgKHAgPT0gaGFuZGxlKQotCSAgICB7Ci0JICAgICAgKmFyZzEgPSAtMTsKLQkgICAgICAqYXJnMiA9IDE7Ci0JICAgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Ci0JICAgIH0KLQlyZXR1cm4gUkRJRXJyb3JfTm9TdWNoUG9pbnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJESVNldF9SRElMZXZlbDoKLSAgICAgIGlmICgqYXJnMSA8IExPV0VTVF9SRElfTEVWRUwgfHwgKmFyZzEgPiBISUdIRVNUX1JESV9MRVZFTCkKLQlyZXR1cm4gUkRJRXJyb3JfSW5jb21wYXRpYmxlUkRJTGV2ZWxzOwotICAgICAgTVlyZGlfbGV2ZWwgPSAqYXJnMTsKLSAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBSRElFcnJvcl9VbmltcGxlbWVudGVkTWVzc2FnZTsKLQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhlIGVtdWxhdG9yIGNhbGxzIHRoaXMgcm91dGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGN5Y2xlIHdoZW4gdGhlICAqCi0qIENhbGxEZWJ1ZyBmbGFnIGlzIHNldC4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHBhc3NlZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgKgotKiBjdXJyZW50bHkgZXhlY3V0aW5nIGluc3RydWN0aW9uIChpLmUgUHJvZ3JhbSBDb3VudGVyIC0gOCksIHRoZSB0aGlyZCAgICAgICoKLSogcGFyYW1ldGVyIGlzIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBleGVjdXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9EZWJ1ZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBwYywgQVJNd29yZCBpbnN0cikKLXsKLQotICBpZiAoc3RhdGUtPkVuZENvbmRpdGlvbiA9PSBSRElFcnJvcl9Vc2VySW50ZXJydXB0KQotICAgIHsKLSAgICAgIFRyYWNlUHJpbnQgKChzdGF0ZSwgIlVzZXIgaW50ZXJydXB0IGF0ICUuOGx4XG4iLCBwYykpOwotICAgICAgc3RhdGUtPkNhbGxEZWJ1Zy0tOwotICAgICAgc3RhdGUtPkVtdWxhdGUgPSBTVE9QOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEJyZWFrTm9kZSAqcCA9IEJyZWFrTGlzdDsKLSAgICAgIGZvciAoOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIHN3aXRjaCAocC0+dHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJESVBvaW50X0VROgotCSAgICAgIGlmIChwYyA9PSBwLT5hZGRyZXNzKQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBSRElQb2ludF9HVDoKLQkgICAgICBpZiAocGMgPiBwLT5hZGRyZXNzKQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBSRElQb2ludF9HRToKLQkgICAgICBpZiAocGMgPj0gcC0+YWRkcmVzcykKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0JICAgIGNhc2UgUkRJUG9pbnRfTFQ6Ci0JICAgICAgaWYgKHBjIDwgcC0+YWRkcmVzcykKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0JICAgIGNhc2UgUkRJUG9pbnRfTEU6Ci0JICAgICAgaWYgKHBjIDw9IHAtPmFkZHJlc3MpCi0JCWJyZWFrOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIFJESVBvaW50X0lOOgotCSAgICAgIGlmIChwLT5hZGRyZXNzIDw9IHBjICYmIHBjIDwgcC0+YWRkcmVzcyArIHAtPmJvdW5kKQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBSRElQb2ludF9PVVQ6Ci0JICAgICAgaWYgKHAtPmFkZHJlc3MgPiBwYyB8fCBwYyA+PSBwLT5hZGRyZXNzICsgcC0+Ym91bmQpCi0JCWJyZWFrOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIFJESVBvaW50X01BU0s6Ci0JICAgICAgaWYgKChwYyAmIHAtPmJvdW5kKSA9PSBwLT5hZGRyZXNzKQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgLyogZm91bmQgYSBtYXRjaCAqLwotCSAgVHJhY2VQcmludCAoKHN0YXRlLCAiQnJlYWtwb2ludCByZWFjaGVkIGF0ICUuOGx4XG4iLCBwYykpOwotCSAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IFJESUVycm9yX0JyZWFrcG9pbnRSZWFjaGVkOwotCSAgc3RhdGUtPkVtdWxhdGUgPSBTVE9QOwotCSAgc3RhdGUtPlN0b3BIYW5kbGUgPSAoQVJNd29yZCkgcDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBpbnN0cjsKLX0KLQotdm9pZAotQVJNdWxfQ2hlY2tXYXRjaCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyLCBpbnQgYWNjZXNzKQotewotICBXYXRjaE5vZGUgKnA7Ci0gIGZvciAocCA9IFdhdGNoTGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICBpZiAocC0+ZGF0YXR5cGUgJiBhY2Nlc3MpCi0gICAgICB7Ci0Jc3dpdGNoIChwLT50eXBlKQotCSAgewotCSAgY2FzZSBSRElQb2ludF9FUToKLQkgICAgaWYgKGFkZHIgPT0gcC0+YWRkcmVzcykKLQkgICAgICBicmVhazsKLQkgICAgY29udGludWU7Ci0JICBjYXNlIFJESVBvaW50X0dUOgotCSAgICBpZiAoYWRkciA+IHAtPmFkZHJlc3MpCi0JICAgICAgYnJlYWs7Ci0JICAgIGNvbnRpbnVlOwotCSAgY2FzZSBSRElQb2ludF9HRToKLQkgICAgaWYgKGFkZHIgPj0gcC0+YWRkcmVzcykKLQkgICAgICBicmVhazsKLQkgICAgY29udGludWU7Ci0JICBjYXNlIFJESVBvaW50X0xUOgotCSAgICBpZiAoYWRkciA8IHAtPmFkZHJlc3MpCi0JICAgICAgYnJlYWs7Ci0JICAgIGNvbnRpbnVlOwotCSAgY2FzZSBSRElQb2ludF9MRToKLQkgICAgaWYgKGFkZHIgPD0gcC0+YWRkcmVzcykKLQkgICAgICBicmVhazsKLQkgICAgY29udGludWU7Ci0JICBjYXNlIFJESVBvaW50X0lOOgotCSAgICBpZiAocC0+YWRkcmVzcyA8PSBhZGRyICYmIGFkZHIgPCBwLT5hZGRyZXNzICsgcC0+Ym91bmQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGNvbnRpbnVlOwotCSAgY2FzZSBSRElQb2ludF9PVVQ6Ci0JICAgIGlmIChwLT5hZGRyZXNzID4gYWRkciB8fCBhZGRyID49IHAtPmFkZHJlc3MgKyBwLT5ib3VuZCkKLQkgICAgICBicmVhazsKLQkgICAgY29udGludWU7Ci0JICBjYXNlIFJESVBvaW50X01BU0s6Ci0JICAgIGlmICgoYWRkciAmIHAtPmJvdW5kKSA9PSBwLT5hZGRyZXNzKQotCSAgICAgIGJyZWFrOwotCSAgICBjb250aW51ZTsKLQkgIH0KLQkvKiBmb3VuZCBhIG1hdGNoICovCi0JVHJhY2VQcmludCAoKHN0YXRlLCAiV2F0Y2hwb2ludCBhdCAlLjhseCBhY2Nlc3NlZFxuIiwgYWRkcikpOwotCXN0YXRlLT5FbmRDb25kaXRpb24gPSBSRElFcnJvcl9XYXRjaHBvaW50QWNjZXNzZWQ7Ci0Jc3RhdGUtPkVtdWxhdGUgPSBTVE9QOwotCXN0YXRlLT5TdG9wSGFuZGxlID0gKEFSTXdvcmQpIHA7Ci0JcmV0dXJuOwotICAgICAgfQotfQotCi1zdGF0aWMgUkRJX05hbWVMaXN0IGNvbnN0ICoKLVJESV9jcHVuYW1lcyAoKQotewotICByZXR1cm4gKFJESV9OYW1lTGlzdCBjb25zdCAqKSAmcHJvY2Vzc29yY29uZmlnLmNvdW50OwotfQotCi1jb25zdCBzdHJ1Y3QgUkRJUHJvY1ZlYyBhcm11bF9yZGkgPSB7Ci0gICJBUk1VTCIsCi0gIFJESV9vcGVuLAotICBSRElfY2xvc2UsCi0gIFJESV9yZWFkLAotICBSRElfd3JpdGUsCi0gIFJESV9DUFVyZWFkLAotICBSRElfQ1BVd3JpdGUsCi0gIFJESV9DUHJlYWQsCi0gIFJESV9DUHdyaXRlLAotICBSRElfc2V0YnJlYWssCi0gIFJESV9jbGVhcmJyZWFrLAotICBSRElfc2V0d2F0Y2gsCi0gIFJESV9jbGVhcndhdGNoLAotICBSRElfZXhlY3V0ZSwKLSAgUkRJX3N0ZXAsCi0gIFJESV9pbmZvLAotCi0gIDAsCQkJCS8qcG9pbnRpbnEgKi8KLSAgMCwJCQkJLyphZGRjb25maWcgKi8KLSAgMCwJCQkJLypsb2FkY29uZmlnZGF0YSAqLwotICAwLAkJCQkvKnNlbGVjdGNvbmZpZyAqLwotICAwLAkJCQkvKmRyaXZlcm5hbWVzICovCi0KLSAgUkRJX2NwdW5hbWVzCi19OwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1zdXBwLmMgYi9zaW0vYXJtL2FybXN1cHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxOGRkZC4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2FybXN1cHAuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OCArMCwwIEBACi0vKiAgYXJtc3VwcC5jIC0tIEFSTXVsYXRvciBzdXBwb3J0IGNvZGU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0jaW5jbHVkZSAiYXJtZW11LmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25zIGZvciB0aGUgc3VwcG9ydCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkIEFSTXVsX0dldFJlZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgcmVnKTsKLXZvaWQgQVJNdWxfU2V0UmVnIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCByZWcsCi0JCSAgIEFSTXdvcmQgdmFsdWUpOwotQVJNd29yZCBBUk11bF9HZXRQQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci1BUk13b3JkIEFSTXVsX0dldE5leHRQQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci12b2lkIEFSTXVsX1NldFBDIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHZhbHVlKTsKLUFSTXdvcmQgQVJNdWxfR2V0UjE1IChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLXZvaWQgQVJNdWxfU2V0UjE1IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHZhbHVlKTsKLQotQVJNd29yZCBBUk11bF9HZXRDUFNSIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLXZvaWQgQVJNdWxfU2V0Q1BTUiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCB2YWx1ZSk7Ci1BUk13b3JkIEFSTXVsX0dldFNQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbW9kZSk7Ci12b2lkIEFSTXVsX1NldFNQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbW9kZSwgQVJNd29yZCB2YWx1ZSk7Ci0KLXZvaWQgQVJNdWxfQ1BTUkFsdGVyZWQgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotdm9pZCBBUk11bF9SMTVBbHRlcmVkIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLQotQVJNd29yZCBBUk11bF9Td2l0Y2hNb2RlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIG9sZG1vZGUsCi0JCQkgIEFSTXdvcmQgbmV3bW9kZSk7Ci1zdGF0aWMgQVJNd29yZCBNb2RlVG9CYW5rIChBUk13b3JkIG1vZGUpOwotCi11bnNpZ25lZCBBUk11bF9OdGhSZWcgKEFSTXdvcmQgaW5zdHIsIHVuc2lnbmVkIG51bWJlcik7Ci0KLXZvaWQgQVJNdWxfTmVnWmVybyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCByZXN1bHQpOwotdm9pZCBBUk11bF9BZGRDYXJyeSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsCi0JCSAgICAgQVJNd29yZCByZXN1bHQpOwotdm9pZCBBUk11bF9BZGRPdmVyZmxvdyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsCi0JCQlBUk13b3JkIHJlc3VsdCk7Ci12b2lkIEFSTXVsX1N1YkNhcnJ5IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwKLQkJICAgICBBUk13b3JkIHJlc3VsdCk7Ci12b2lkIEFSTXVsX1N1Yk92ZXJmbG93IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwKLQkJCUFSTXdvcmQgcmVzdWx0KTsKLQotdm9pZCBBUk11bF9MREMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcyk7Ci12b2lkIEFSTXVsX1NUQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKTsKLXZvaWQgQVJNdWxfTUNSIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHNvdXJjZSk7Ci1BUk13b3JkIEFSTXVsX01SQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0cik7Ci12b2lkIEFSTXVsX0NEUCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0cik7Ci11bnNpZ25lZCBJbnRQZW5kaW5nIChBUk11bF9TdGF0ZSAqIHN0YXRlKTsKLQotQVJNd29yZCBBUk11bF9BbGlnbiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpOwotCi12b2lkIEFSTXVsX1NjaGVkdWxlRXZlbnQgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGxvbmcgZGVsYXksCi0JCQkgIHVuc2lnbmVkICgqd2hhdCkgKCkpOwotdm9pZCBBUk11bF9FbnZva2VFdmVudCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSk7Ci11bnNpZ25lZCBsb25nIEFSTXVsX1RpbWUgKEFSTXVsX1N0YXRlICogc3RhdGUpOwotc3RhdGljIHZvaWQgRW52b2tlTGlzdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tLAotCQkJdW5zaWduZWQgbG9uZyB0byk7Ci0KLXN0cnVjdCBFdmVudE5vZGUKLXsJCQkJLyogQW4gZXZlbnQgbGlzdCBub2RlICovCi0gIHVuc2lnbmVkICgqZnVuYykgKCk7CQkvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCAqLwotICBzdHJ1Y3QgRXZlbnROb2RlICpuZXh0OwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHZhbHVlIG9mIGEgcmVnaXN0ZXIgZnJvbSBhIG1vZGUuICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9HZXRSZWcgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIHJlZykKLXsKLSAgbW9kZSAmPSBNT0RFQklUUzsKLSAgaWYgKG1vZGUgIT0gc3RhdGUtPk1vZGUpCi0gICAgcmV0dXJuIChzdGF0ZS0+UmVnQmFua1tNb2RlVG9CYW5rICgoQVJNd29yZCkgbW9kZSldW3JlZ10pOwotICBlbHNlCi0gICAgcmV0dXJuIChzdGF0ZS0+UmVnW3JlZ10pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgb2YgYSByZWdpc3RlciBmb3IgYSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NldFJlZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgcmVnLCBBUk13b3JkIHZhbHVlKQotewotICBtb2RlICY9IE1PREVCSVRTOwotICBpZiAobW9kZSAhPSBzdGF0ZS0+TW9kZSkKLSAgICBzdGF0ZS0+UmVnQmFua1tNb2RlVG9CYW5rICgoQVJNd29yZCkgbW9kZSldW3JlZ10gPSB2YWx1ZTsKLSAgZWxzZQotICAgIHN0YXRlLT5SZWdbcmVnXSA9IHZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFBDLCBtb2RlIGluZGVwZW5kZW50bHkuICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQKLUFSTXVsX0dldFBDIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBpZiAoc3RhdGUtPk1vZGUgPiBTVkMyNk1PREUpCi0gICAgcmV0dXJuIChzdGF0ZS0+UmVnWzE1XSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKFIxNVBDKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBQQywgbW9kZSBpbmRlcGVuZGVudGx5LiAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9HZXROZXh0UEMgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIGlmIChzdGF0ZS0+TW9kZSA+IFNWQzI2TU9ERSkKLSAgICByZXR1cm4gKHN0YXRlLT5SZWdbMTVdICsgaXNpemUpOwotICBlbHNlCi0gICAgcmV0dXJuICgoc3RhdGUtPlJlZ1sxNV0gKyBpc2l6ZSkgJiBSMTVQQ0JJVFMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIFBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NldFBDIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHZhbHVlKQotewotICBpZiAoQVJNdWxfTU9ERTMyQklUKQotICAgIHN0YXRlLT5SZWdbMTVdID0gdmFsdWUgJiBQQ0JJVFM7Ci0gIGVsc2UKLSAgICBzdGF0ZS0+UmVnWzE1XSA9IFIxNUNDSU5UTU9ERSB8ICh2YWx1ZSAmIFIxNVBDQklUUyk7Ci0gIEZMVVNIUElQRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHZhbHVlIG9mIHJlZ2lzdGVyIDE1LCBtb2RlIGluZGVwZW5kZW50bHkuICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9HZXRSMTUgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIGlmIChzdGF0ZS0+TW9kZSA+IFNWQzI2TU9ERSkKLSAgICByZXR1cm4gKHN0YXRlLT5SZWdbMTVdKTsKLSAgZWxzZQotICAgIHJldHVybiAoUjE1UEMgfCBFQ0MgfCBFUjE1SU5UIHwgRU1PREUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgb2YgUmVnaXN0ZXIgMTUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NldFIxNSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCB2YWx1ZSkKLXsKLSAgaWYgKEFSTXVsX01PREUzMkJJVCkKLSAgICBzdGF0ZS0+UmVnWzE1XSA9IHZhbHVlICYgUENCSVRTOwotICBlbHNlCi0gICAgewotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSB2YWx1ZTsKLSAgICAgIEFSTXVsX1IxNUFsdGVyZWQgKHN0YXRlKTsKLSAgICB9Ci0gIEZMVVNIUElQRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBDUFNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkCi1BUk11bF9HZXRDUFNSIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICByZXR1cm4gKENQU1IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIENQU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NldENQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgdmFsdWUpCi17Ci0gIHN0YXRlLT5DcHNyID0gQ1BTUjsKLSAgU0VUUFNSIChzdGF0ZS0+Q3BzciwgdmFsdWUpOwotICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZG9lcyBhbGwgdGhlIG5hc3R5IGJpdHMgaW52b2x2ZWQgaW4gYSB3cml0ZSB0byB0aGUgQ1BTUiwgICAgICoKLSogaW5jbHVkaW5nIHVwZGF0aW5nIHRoZSByZWdpc3RlciBiYW5rLCBnaXZlbiBhIE1TUiBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX0ZpeENQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgcmhzKQotewotICBzdGF0ZS0+Q3BzciA9IENQU1I7Ci0gIGlmIChzdGF0ZS0+QmFuayA9PSBVU0VSQkFOSykKLSAgICB7CQkJCS8qIE9ubHkgd3JpdGUgZmxhZ3MgaW4gdXNlciBtb2RlICovCi0gICAgICBpZiAoQklUICgxOSkpCi0JewotCSAgU0VUQ0MgKHN0YXRlLT5DcHNyLCByaHMpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIE5vdCBhIHVzZXIgbW9kZSAqLwotICAgICAgaWYgKEJJVFMgKDE2LCAxOSkgPT0gOSkKLQlTRVRQU1IgKHN0YXRlLT5DcHNyLCByaHMpOwotICAgICAgZWxzZSBpZiAoQklUICgxNikpCi0JU0VUSU5UTU9ERSAoc3RhdGUtPkNwc3IsIHJocyk7Ci0gICAgICBlbHNlIGlmIChCSVQgKDE5KSkKLQlTRVRDQyAoc3RhdGUtPkNwc3IsIHJocyk7Ci0gICAgfQotICBBUk11bF9DUFNSQWx0ZXJlZCAoc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBHZXQgYW4gU1BTUiBmcm9tIHRoZSBzcGVjaWZpZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQKLUFSTXVsX0dldFNQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbW9kZSkKLXsKLSAgQVJNd29yZCBiYW5rID0gTW9kZVRvQmFuayAobW9kZSAmIE1PREVCSVRTKTsKLQotICBpZiAoISBCQU5LX0NBTl9BQ0NFU1NfU1BTUiAoYmFuaykpCi0gICAgcmV0dXJuIENQU1I7Ci0KLSAgcmV0dXJuIHN0YXRlLT5TcHNyW2JhbmtdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgZG9lcyBhIHdyaXRlIHRvIGFuIFNQU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NldFNQU1IgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgbW9kZSwgQVJNd29yZCB2YWx1ZSkKLXsKLSAgQVJNd29yZCBiYW5rID0gTW9kZVRvQmFuayAobW9kZSAmIE1PREVCSVRTKTsKLSAgCi0gIGlmIChCQU5LX0NBTl9BQ0NFU1NfU1BTUiAoYmFuaykpCi0gICAgc3RhdGUtPlNwc3JbYmFua10gPSB2YWx1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIGRvZXMgYSB3cml0ZSB0byB0aGUgY3VycmVudCBTUFNSLCBnaXZlbiBhbiBNU1IgaW5zdHJ1Y3Rpb24gICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9GaXhTUFNSIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHJocykKLXsKLSAgaWYgKEJBTktfQ0FOX0FDQ0VTU19TUFNSIChzdGF0ZS0+QmFuaykpCi0gICAgewotICAgICAgaWYgKEJJVFMgKDE2LCAxOSkgPT0gOSkKLQlTRVRQU1IgKHN0YXRlLT5TcHNyW3N0YXRlLT5CYW5rXSwgcmhzKTsKLSAgICAgIGVsc2UgaWYgKEJJVCAoMTYpKQotCVNFVElOVE1PREUgKHN0YXRlLT5TcHNyW3N0YXRlLT5CYW5rXSwgcmhzKTsKLSAgICAgIGVsc2UgaWYgKEJJVCAoMTkpKQotCVNFVENDIChzdGF0ZS0+U3BzcltzdGF0ZS0+QmFua10sIHJocyk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgdXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGVtdWxhdG9yIGFmdGVyIHRoZSBDcHNyIGhhcyBiZWVuICAgICoKLSogY2hhbmdlZC4gIEJvdGggdGhlIHByb2Nlc3NvciBmbGFncyBhbmQgcmVnaXN0ZXIgYmFuayBhcmUgdXBkYXRlZC4gICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9DUFNSQWx0ZXJlZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSkKLXsKLSAgQVJNd29yZCBvbGRtb2RlOwotCi0gIGlmIChzdGF0ZS0+cHJvZzMyU2lnID09IExPVykKLSAgICBzdGF0ZS0+Q3BzciAmPSAoQ0NCSVRTIHwgSU5UQklUUyB8IFIxNU1PREVCSVRTKTsKLQotICBvbGRtb2RlID0gc3RhdGUtPk1vZGU7Ci0gIAotICBpZiAoc3RhdGUtPk1vZGUgIT0gKHN0YXRlLT5DcHNyICYgTU9ERUJJVFMpKQotICAgIHsKLSAgICAgIHN0YXRlLT5Nb2RlID0KLQlBUk11bF9Td2l0Y2hNb2RlIChzdGF0ZSwgc3RhdGUtPk1vZGUsIHN0YXRlLT5DcHNyICYgTU9ERUJJVFMpOwotICAgICAgCi0gICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotICAgIH0KLQotICBBU1NJR05JTlQgKHN0YXRlLT5DcHNyICYgSU5UQklUUyk7Ci0gIEFTU0lHTk4gKChzdGF0ZS0+Q3BzciAmIE5CSVQpICE9IDApOwotICBBU1NJR05aICgoc3RhdGUtPkNwc3IgJiBaQklUKSAhPSAwKTsKLSAgQVNTSUdOQyAoKHN0YXRlLT5DcHNyICYgQ0JJVCkgIT0gMCk7Ci0gIEFTU0lHTlYgKChzdGF0ZS0+Q3BzciAmIFZCSVQpICE9IDApOwotI2lmZGVmIE1PREVUCi0gIEFTU0lHTlQgKChzdGF0ZS0+Q3BzciAmIFRCSVQpICE9IDApOwotI2VuZGlmCi0KLSAgaWYgKG9sZG1vZGUgPiBTVkMyNk1PREUpCi0gICAgewotICAgICAgaWYgKHN0YXRlLT5Nb2RlIDw9IFNWQzI2TU9ERSkKLQl7Ci0JICBzdGF0ZS0+RW11bGF0ZSA9IENIQU5HRU1PREU7Ci0JICBzdGF0ZS0+UmVnWzE1XSA9IEVDQyB8IEVSMTVJTlQgfCBFTU9ERSB8IFIxNVBDOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3RhdGUtPk1vZGUgPiBTVkMyNk1PREUpCi0JewotCSAgc3RhdGUtPkVtdWxhdGUgPSBDSEFOR0VNT0RFOwotCSAgc3RhdGUtPlJlZ1sxNV0gPSBSMTVQQzsKLQl9Ci0gICAgICBlbHNlCi0Jc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgfCBSMTVQQzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoaXMgcm91dGluZSB1cGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgZW11bGF0b3IgYWZ0ZXIgcmVnaXN0ZXIgMTUgaGFzICAgICAgKgotKiBiZWVuIGNoYW5nZWQuICBCb3RoIHRoZSBwcm9jZXNzb3IgZmxhZ3MgYW5kIHJlZ2lzdGVyIGJhbmsgYXJlIHVwZGF0ZWQuICAgICoKLSogVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGEgMjYgYml0IG1vZGUuICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9SMTVBbHRlcmVkIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBpZiAoc3RhdGUtPk1vZGUgIT0gUjE1TU9ERSkKLSAgICB7Ci0gICAgICBzdGF0ZS0+TW9kZSA9IEFSTXVsX1N3aXRjaE1vZGUgKHN0YXRlLCBzdGF0ZS0+TW9kZSwgUjE1TU9ERSk7Ci0gICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMykgPyBISUdIIDogTE9XOwotICAgIH0KLSAgaWYgKHN0YXRlLT5Nb2RlID4gU1ZDMjZNT0RFKQotICAgIHN0YXRlLT5FbXVsYXRlID0gQ0hBTkdFTU9ERTsKLSAgQVNTSUdOUjE1SU5UIChSMTVJTlQpOwotICBBU1NJR05OICgoc3RhdGUtPlJlZ1sxNV0gJiBOQklUKSAhPSAwKTsKLSAgQVNTSUdOWiAoKHN0YXRlLT5SZWdbMTVdICYgWkJJVCkgIT0gMCk7Ci0gIEFTU0lHTkMgKChzdGF0ZS0+UmVnWzE1XSAmIENCSVQpICE9IDApOwotICBBU1NJR05WICgoc3RhdGUtPlJlZ1sxNV0gJiBWQklUKSAhPSAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIGNvbnRyb2xzIHRoZSBzYXZpbmcgYW5kIHJlc3RvcmluZyBvZiByZWdpc3RlcnMgYWNyb3NzIG1vZGUgICAqCi0qIGNoYW5nZXMuICBUaGUgcmVnYmFuayBtYXRyaXggaXMgbGFyZ2VseSB1bnVzZWQsIG9ubHkgcm93cyAxMyBhbmQgMTQgYXJlICAgKgotKiB1c2VkIGFjcm9zcyBhbGwgbW9kZXMsIDggdG8gMTQgYXJlIHVzZWQgZm9yIEZJUSwgYWxsIG90aGVycyB1c2UgdGhlIFVTRVIgICoKLSogY29sdW1uLiAgSXQncyBlYXNpZXIgdGhpcyB3YXkuICBvbGQgYW5kIG5ldyBwYXJhbWV0ZXIgYXJlIG1vZGVzIG51bWJlcnMuICAqCi0qIE5vdGljZSB0aGUgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcgdGhlIEJhbmsgdmFyaWFibGUuICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQVJNd29yZAotQVJNdWxfU3dpdGNoTW9kZSAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBvbGRtb2RlLCBBUk13b3JkIG5ld21vZGUpCi17Ci0gIHVuc2lnbmVkIGk7Ci0gIEFSTXdvcmQgIG9sZGJhbms7Ci0gIEFSTXdvcmQgIG5ld2Jhbms7Ci0gIAotICBvbGRiYW5rID0gTW9kZVRvQmFuayAob2xkbW9kZSk7Ci0gIG5ld2JhbmsgPSBzdGF0ZS0+QmFuayA9IE1vZGVUb0JhbmsgKG5ld21vZGUpOwotICAKLSAgaWYgKG9sZGJhbmsgIT0gbmV3YmFuaykKLSAgICB7CQkJCS8qIHJlYWxseSBuZWVkIHRvIGRvIGl0ICovCi0gICAgICBzd2l0Y2ggKG9sZGJhbmspCi0JewkJCS8qIHNhdmUgYXdheSB0aGUgb2xkIHJlZ2lzdGVycyAqLwotCWNhc2UgU1lTVEVNQkFOSzoKLQkgIC8qIFRoZSBTeXN0ZW0gbW9kZSB1c2VzIHRoZSBVU0VSIGJhbmsuICAqLwotCSAgb2xkYmFuayA9IFVTRVJCQU5LOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFVTRVJCQU5LOgotCWNhc2UgSVJRQkFOSzoKLQljYXNlIFNWQ0JBTks6Ci0JY2FzZSBBQk9SVEJBTks6Ci0JY2FzZSBVTkRFRkJBTks6Ci0JICBpZiAobmV3YmFuayA9PSBGSVFCQU5LKQotCSAgICBmb3IgKGkgPSA4OyBpIDwgMTM7IGkrKykKLQkgICAgICBzdGF0ZS0+UmVnQmFua1tVU0VSQkFOS11baV0gPSBzdGF0ZS0+UmVnW2ldOwotCSAgc3RhdGUtPlJlZ0Jhbmtbb2xkYmFua11bMTNdID0gc3RhdGUtPlJlZ1sxM107Ci0JICBzdGF0ZS0+UmVnQmFua1tvbGRiYW5rXVsxNF0gPSBzdGF0ZS0+UmVnWzE0XTsKLQkgIGJyZWFrOwotCWNhc2UgRklRQkFOSzoKLQkgIGZvciAoaSA9IDg7IGkgPCAxNTsgaSsrKQotCSAgICBzdGF0ZS0+UmVnQmFua1tGSVFCQU5LXVtpXSA9IHN0YXRlLT5SZWdbaV07Ci0JICBicmVhazsKLQljYXNlIERVTU1ZQkFOSzoKLQkgIGZvciAoaSA9IDg7IGkgPCAxNTsgaSsrKQotCSAgICBzdGF0ZS0+UmVnQmFua1tEVU1NWUJBTktdW2ldID0gMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICAKLSAgICAgIHN3aXRjaCAobmV3YmFuaykKLQl7CQkJLyogcmVzdG9yZSB0aGUgbmV3IHJlZ2lzdGVycyAqLwotCWNhc2UgU1lTVEVNQkFOSzoKLQkgIG5ld2JhbmsgPSBVU0VSQkFOSzsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBVU0VSQkFOSzoKLQljYXNlIElSUUJBTks6Ci0JY2FzZSBTVkNCQU5LOgotCWNhc2UgQUJPUlRCQU5LOgotCWNhc2UgVU5ERUZCQU5LOgotCSAgaWYgKG9sZGJhbmsgPT0gRklRQkFOSykKLQkgICAgZm9yIChpID0gODsgaSA8IDEzOyBpKyspCi0JICAgICAgc3RhdGUtPlJlZ1tpXSA9IHN0YXRlLT5SZWdCYW5rW1VTRVJCQU5LXVtpXTsKLQkgIHN0YXRlLT5SZWdbMTNdID0gc3RhdGUtPlJlZ0JhbmtbbmV3YmFua11bMTNdOwotCSAgc3RhdGUtPlJlZ1sxNF0gPSBzdGF0ZS0+UmVnQmFua1tuZXdiYW5rXVsxNF07Ci0JICBicmVhazsKLQljYXNlIEZJUUJBTks6Ci0JICBmb3IgKGkgPSA4OyBpIDwgMTU7IGkrKykKLQkgICAgc3RhdGUtPlJlZ1tpXSA9IHN0YXRlLT5SZWdCYW5rW0ZJUUJBTktdW2ldOwotCSAgYnJlYWs7Ci0JY2FzZSBEVU1NWUJBTks6Ci0JICBmb3IgKGkgPSA4OyBpIDwgMTU7IGkrKykKLQkgICAgc3RhdGUtPlJlZ1tpXSA9IDA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQkJCS8qIHN3aXRjaCAqLwotICAgIH0JCQkJLyogaWYgKi8KLSAgCi0gIHJldHVybiBuZXdtb2RlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBHaXZlbiBhIHByb2Nlc3NvciBtb2RlLCB0aGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgcmVnaXN0ZXIgYmFuayB0aGF0ICAgICAgICoKLSogd2lsbCBiZSBhY2Nlc3NlZCBpbiB0aGF0IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgQVJNd29yZAotTW9kZVRvQmFuayAoQVJNd29yZCBtb2RlKQotewotICBzdGF0aWMgQVJNd29yZCBiYW5rb2Ztb2RlW10gPQotICB7Ci0gICAgVVNFUkJBTkssICBGSVFCQU5LLCAgIElSUUJBTkssICAgU1ZDQkFOSywKLSAgICBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssCi0gICAgRFVNTVlCQU5LLCBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLAotICAgIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssIERVTU1ZQkFOSywKLSAgICBVU0VSQkFOSywgIEZJUUJBTkssICAgSVJRQkFOSywgICBTVkNCQU5LLAotICAgIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssIEFCT1JUQkFOSywKLSAgICBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBVTkRFRkJBTkssCi0gICAgRFVNTVlCQU5LLCBEVU1NWUJBTkssIERVTU1ZQkFOSywgU1lTVEVNQkFOSwotICB9OwotCi0gIGlmIChtb2RlID49IChzaXplb2YgKGJhbmtvZm1vZGUpIC8gc2l6ZW9mIChiYW5rb2Ztb2RlWzBdKSkpCi0gICAgcmV0dXJuIERVTU1ZQkFOSzsKLQotICByZXR1cm4gYmFua29mbW9kZVttb2RlXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogUmV0dXJucyB0aGUgcmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBudGggcmVnaXN0ZXIgaW4gYSByZWcgbGlzdC4gICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bnNpZ25lZAotQVJNdWxfTnRoUmVnIChBUk13b3JkIGluc3RyLCB1bnNpZ25lZCBudW1iZXIpCi17Ci0gIHVuc2lnbmVkIGJpdCwgdXB0bzsKLQotICBmb3IgKGJpdCA9IDAsIHVwdG8gPSAwOyB1cHRvIDw9IG51bWJlcjsgYml0KyspCi0gICAgaWYgKEJJVCAoYml0KSkKLSAgICAgIHVwdG8rKzsKLSAgcmV0dXJuIChiaXQgLSAxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogQXNzaWducyB0aGUgTiBhbmQgWiBmbGFncyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHJlc3VsdCAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9OZWdaZXJvIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHJlc3VsdCkKLXsKLSAgaWYgKE5FRyAocmVzdWx0KSkKLSAgICB7Ci0gICAgICBTRVROOwotICAgICAgQ0xFQVJaOwotICAgIH0KLSAgZWxzZSBpZiAocmVzdWx0ID09IDApCi0gICAgewotICAgICAgQ0xFQVJOOwotICAgICAgU0VUWjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDTEVBUk47Ci0gICAgICBDTEVBUlo7Ci0gICAgfTsKLX0KLQotLyogQ29tcHV0ZSB3aGV0aGVyIGFuIGFkZGl0aW9uIG9mIEEgYW5kIEIsIGdpdmluZyBSRVNVTFQsIG92ZXJmbG93ZWQuICAqLwotaW50Ci1BZGRPdmVyZmxvdyAoQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KQotewotICByZXR1cm4gKChORUcgKGEpICYmIE5FRyAoYikgJiYgUE9TIChyZXN1bHQpKQotCSAgfHwgKFBPUyAoYSkgJiYgUE9TIChiKSAmJiBORUcgKHJlc3VsdCkpKTsKLX0KLQotLyogQ29tcHV0ZSB3aGV0aGVyIGEgc3VidHJhY3Rpb24gb2YgQSBhbmQgQiwgZ2l2aW5nIFJFU1VMVCwgb3ZlcmZsb3dlZC4gICovCi1pbnQKLVN1Yk92ZXJmbG93IChBUk13b3JkIGEsIEFSTXdvcmQgYiwgQVJNd29yZCByZXN1bHQpCi17Ci0gIHJldHVybiAoKE5FRyAoYSkgJiYgUE9TIChiKSAmJiBQT1MgKHJlc3VsdCkpCi0JICB8fCAoUE9TIChhKSAmJiBORUcgKGIpICYmIE5FRyAocmVzdWx0KSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBBc3NpZ25zIHRoZSBDIGZsYWcgYWZ0ZXIgYW4gYWRkaXRpb24gb2YgYSBhbmQgYiB0byBnaXZlIHJlc3VsdCAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX0FkZENhcnJ5IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwgQVJNd29yZCByZXN1bHQpCi17Ci0gIEFTU0lHTkMgKChORUcgKGEpICYmIE5FRyAoYikpIHx8Ci0JICAgKE5FRyAoYSkgJiYgUE9TIChyZXN1bHQpKSB8fCAoTkVHIChiKSAmJiBQT1MgKHJlc3VsdCkpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogQXNzaWducyB0aGUgViBmbGFnIGFmdGVyIGFuIGFkZGl0aW9uIG9mIGEgYW5kIGIgdG8gZ2l2ZSByZXN1bHQgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9BZGRPdmVyZmxvdyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KQotewotICBBU1NJR05WIChBZGRPdmVyZmxvdyAoYSwgYiwgcmVzdWx0KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIEFzc2lnbnMgdGhlIEMgZmxhZyBhZnRlciBhbiBzdWJ0cmFjdGlvbiBvZiBhIGFuZCBiIHRvIGdpdmUgcmVzdWx0ICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfU3ViQ2FycnkgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYSwgQVJNd29yZCBiLCBBUk13b3JkIHJlc3VsdCkKLXsKLSAgQVNTSUdOQyAoKE5FRyAoYSkgJiYgUE9TIChiKSkgfHwKLQkgICAoTkVHIChhKSAmJiBQT1MgKHJlc3VsdCkpIHx8IChQT1MgKGIpICYmIFBPUyAocmVzdWx0KSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBBc3NpZ25zIHRoZSBWIGZsYWcgYWZ0ZXIgYW4gc3VidHJhY3Rpb24gb2YgYSBhbmQgYiB0byBnaXZlIHJlc3VsdCAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1N1Yk92ZXJmbG93IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwgQVJNd29yZCByZXN1bHQpCi17Ci0gIEFTU0lHTlYgKFN1Yk92ZXJmbG93IChhLCBiLCByZXN1bHQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3NlcyB1c2VkIGluIGFuICAgICAgICAqCi0qIExEQyBpbnN0cnVjdGlvbi4gIFRoZSBjb2RlIGhlcmUgaXMgYWx3YXlzIHBvc3QtaW5kZXhlZCwgaXQncyB1cCB0byB0aGUgICAgKgotKiBjYWxsZXIgdG8gZ2V0IHRoZSBpbnB1dCBhZGRyZXNzIGNvcnJlY3QgYW5kIHRvIGhhbmRsZSBiYXNlIHJlZ2lzdGVyICAgICAgICoKLSogbW9kaWZpY2F0aW9uLiBJdCBhbHNvIGhhbmRsZXMgdGhlIEJ1c3ktV2FpdGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9MREMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKLXsKLSAgdW5zaWduZWQgY3BhYjsKLSAgQVJNd29yZCBkYXRhOwotCi0gIFVOREVGX0xTQ1BDQmFzZVdiOwotICBpZiAoQUREUkVYQ0VQVCAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotICBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0ZJUlNULCBpbnN0ciwgMCk7Ci0gIHdoaWxlIChjcGFiID09IEFSTXVsX0JVU1kpCi0gICAgewotICAgICAgQVJNdWxfSWN5Y2xlcyAoc3RhdGUsIDEsIDApOwotICAgICAgaWYgKEludFBlbmRpbmcgKHN0YXRlKSkKLQl7Ci0JICBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0lOVEVSUlVQVCwgaW5zdHIsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQljcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0JVU1ksIGluc3RyLCAwKTsKLSAgICB9Ci0gIGlmIChjcGFiID09IEFSTXVsX0NBTlQpCi0gICAgewotICAgICAgQ1BUQUtFQUJPUlQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX1RSQU5TRkVSLCBpbnN0ciwgMCk7Ci0gIGRhdGEgPSBBUk11bF9Mb2FkV29yZE4gKHN0YXRlLCBhZGRyZXNzKTsKLSAgQlVTVVNFRElOQ1BDTjsKLSAgaWYgKEJJVCAoMjEpKQotICAgIExTQmFzZSA9IHN0YXRlLT5CYXNlOwotICBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0RBVEEsIGluc3RyLCBkYXRhKTsKLSAgd2hpbGUgKGNwYWIgPT0gQVJNdWxfSU5DKQotICAgIHsKLSAgICAgIGFkZHJlc3MgKz0gNDsKLSAgICAgIGRhdGEgPSBBUk11bF9Mb2FkV29yZE4gKHN0YXRlLCBhZGRyZXNzKTsKLSAgICAgIGNwYWIgPSAoc3RhdGUtPkxEQ1tDUE51bV0pIChzdGF0ZSwgQVJNdWxfREFUQSwgaW5zdHIsIGRhdGEpOwotICAgIH0KLSAgaWYgKHN0YXRlLT5hYm9ydFNpZyB8fCBzdGF0ZS0+QWJvcnRlZCkKLSAgICB7Ci0gICAgICBUQUtFQUJPUlQ7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgZ2VuZXJhdGluZyB0aGUgYWRkcmVzc2VzIHVzZWQgaW4gYW4gICAgICAgICoKLSogU1RDIGluc3RydWN0aW9uLiAgVGhlIGNvZGUgaGVyZSBpcyBhbHdheXMgcG9zdC1pbmRleGVkLCBpdCdzIHVwIHRvIHRoZSAgICAqCi0qIGNhbGxlciB0byBnZXQgdGhlIGlucHV0IGFkZHJlc3MgY29ycmVjdCBhbmQgdG8gaGFuZGxlIGJhc2UgcmVnaXN0ZXIgICAgICAgKgotKiBtb2RpZmljYXRpb24uIEl0IGFsc28gaGFuZGxlcyB0aGUgQnVzeS1XYWl0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1NUQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKQotewotICB1bnNpZ25lZCBjcGFiOwotICBBUk13b3JkIGRhdGE7Ci0KLSAgVU5ERUZfTFNDUENCYXNlV2I7Ci0gIGlmIChBRERSRVhDRVBUIChhZGRyZXNzKSB8fCBWRUNUT1JBQ0NFU1MgKGFkZHJlc3MpKQotICAgIHsKLSAgICAgIElOVEVSTkFMQUJPUlQgKGFkZHJlc3MpOwotICAgIH0KLSAgY3BhYiA9IChzdGF0ZS0+U1RDW0NQTnVtXSkgKHN0YXRlLCBBUk11bF9GSVJTVCwgaW5zdHIsICZkYXRhKTsKLSAgd2hpbGUgKGNwYWIgPT0gQVJNdWxfQlVTWSkKLSAgICB7Ci0gICAgICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMCk7Ci0gICAgICBpZiAoSW50UGVuZGluZyAoc3RhdGUpKQotCXsKLQkgIGNwYWIgPSAoc3RhdGUtPlNUQ1tDUE51bV0pIChzdGF0ZSwgQVJNdWxfSU5URVJSVVBULCBpbnN0ciwgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCWNwYWIgPSAoc3RhdGUtPlNUQ1tDUE51bV0pIChzdGF0ZSwgQVJNdWxfQlVTWSwgaW5zdHIsICZkYXRhKTsKLSAgICB9Ci0gIGlmIChjcGFiID09IEFSTXVsX0NBTlQpCi0gICAgewotICAgICAgQ1BUQUtFQUJPUlQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2lmbmRlZiBNT0RFMzIKLSAgaWYgKEFERFJFWENFUFQgKGFkZHJlc3MpIHx8IFZFQ1RPUkFDQ0VTUyAoYWRkcmVzcykpCi0gICAgewotICAgICAgSU5URVJOQUxBQk9SVCAoYWRkcmVzcyk7Ci0gICAgfQotI2VuZGlmCi0gIEJVU1VTRURJTkNQQ047Ci0gIGlmIChCSVQgKDIxKSkKLSAgICBMU0Jhc2UgPSBzdGF0ZS0+QmFzZTsKLSAgY3BhYiA9IChzdGF0ZS0+U1RDW0NQTnVtXSkgKHN0YXRlLCBBUk11bF9EQVRBLCBpbnN0ciwgJmRhdGEpOwotICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Ci0gIHdoaWxlIChjcGFiID09IEFSTXVsX0lOQykKLSAgICB7Ci0gICAgICBhZGRyZXNzICs9IDQ7Ci0gICAgICBjcGFiID0gKHN0YXRlLT5TVENbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0RBVEEsIGluc3RyLCAmZGF0YSk7Ci0gICAgICBBUk11bF9TdG9yZVdvcmROIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Ci0gICAgfQotICBpZiAoc3RhdGUtPmFib3J0U2lnIHx8IHN0YXRlLT5BYm9ydGVkKQotICAgIHsKLSAgICAgIFRBS0VBQk9SVDsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIEJ1c3ktV2FpdGluZyBmb3IgYW4gTUNSIGluc3RydWN0aW9uLiAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfTUNSIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHNvdXJjZSkKLXsKLSAgdW5zaWduZWQgY3BhYjsKLQotICBjcGFiID0gKHN0YXRlLT5NQ1JbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0ZJUlNULCBpbnN0ciwgc291cmNlKTsKLQotICB3aGlsZSAoY3BhYiA9PSBBUk11bF9CVVNZKQotICAgIHsKLSAgICAgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCAxLCAwKTsKLQotICAgICAgaWYgKEludFBlbmRpbmcgKHN0YXRlKSkKLQl7Ci0JICBjcGFiID0gKHN0YXRlLT5NQ1JbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0lOVEVSUlVQVCwgaW5zdHIsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQljcGFiID0gKHN0YXRlLT5NQ1JbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0JVU1ksIGluc3RyLCBzb3VyY2UpOwotICAgIH0KLQotICBpZiAoY3BhYiA9PSBBUk11bF9DQU5UKQotICAgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfVW5kZWZpbmVkSW5zdHJWKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJVU1VTRURJTkNQQ047Ci0gICAgICBBUk11bF9DY3ljbGVzIChzdGF0ZSwgMSwgMCk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBCdXN5LVdhaXRpbmcgZm9yIGFuIE1SQyBpbnN0cnVjdGlvbi4gICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQKLUFSTXVsX01SQyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBpbnN0cikKLXsKLSAgdW5zaWduZWQgY3BhYjsKLSAgQVJNd29yZCByZXN1bHQgPSAwOwotCi0gIGNwYWIgPSAoc3RhdGUtPk1SQ1tDUE51bV0pIChzdGF0ZSwgQVJNdWxfRklSU1QsIGluc3RyLCAmcmVzdWx0KTsKLSAgd2hpbGUgKGNwYWIgPT0gQVJNdWxfQlVTWSkKLSAgICB7Ci0gICAgICBBUk11bF9JY3ljbGVzIChzdGF0ZSwgMSwgMCk7Ci0gICAgICBpZiAoSW50UGVuZGluZyAoc3RhdGUpKQotCXsKLQkgIGNwYWIgPSAoc3RhdGUtPk1SQ1tDUE51bV0pIChzdGF0ZSwgQVJNdWxfSU5URVJSVVBULCBpbnN0ciwgMCk7Ci0JICByZXR1cm4gKDApOwotCX0KLSAgICAgIGVsc2UKLQljcGFiID0gKHN0YXRlLT5NUkNbQ1BOdW1dKSAoc3RhdGUsIEFSTXVsX0JVU1ksIGluc3RyLCAmcmVzdWx0KTsKLSAgICB9Ci0gIGlmIChjcGFiID09IEFSTXVsX0NBTlQpCi0gICAgewotICAgICAgQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9VbmRlZmluZWRJbnN0clYpOwotICAgICAgcmVzdWx0ID0gRUNDOwkJLyogUGFyZW50IHdpbGwgZGVzdHJveSB0aGUgZmxhZ3Mgb3RoZXJ3aXNlICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQlVTVVNFRElOQ1BDTjsKLSAgICAgIEFSTXVsX0NjeWNsZXMgKHN0YXRlLCAxLCAwKTsKLSAgICAgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCAxLCAwKTsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgQnVzeS1XYWl0aW5nIGZvciBhbiBDRFAgaW5zdHJ1Y3Rpb24uICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9DRFAgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIpCi17Ci0gIHVuc2lnbmVkIGNwYWI7Ci0KLSAgY3BhYiA9IChzdGF0ZS0+Q0RQW0NQTnVtXSkgKHN0YXRlLCBBUk11bF9GSVJTVCwgaW5zdHIpOwotICB3aGlsZSAoY3BhYiA9PSBBUk11bF9CVVNZKQotICAgIHsKLSAgICAgIEFSTXVsX0ljeWNsZXMgKHN0YXRlLCAxLCAwKTsKLSAgICAgIGlmIChJbnRQZW5kaW5nIChzdGF0ZSkpCi0JewotCSAgY3BhYiA9IChzdGF0ZS0+Q0RQW0NQTnVtXSkgKHN0YXRlLCBBUk11bF9JTlRFUlJVUFQsIGluc3RyKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JY3BhYiA9IChzdGF0ZS0+Q0RQW0NQTnVtXSkgKHN0YXRlLCBBUk11bF9CVVNZLCBpbnN0cik7Ci0gICAgfQotICBpZiAoY3BhYiA9PSBBUk11bF9DQU5UKQotICAgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfVW5kZWZpbmVkSW5zdHJWKTsKLSAgZWxzZQotICAgIEJVU1VTRUROOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBVbmRlZmluZWQgaW5zdHJ1Y3Rpb25zLCBhcyBDUCBpc250cnVjdGlvbiAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1VuZGVmSW5zdHIgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgaW5zdHIgQVRUUklCVVRFX1VOVVNFRCkKLXsKLSAgQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9VbmRlZmluZWRJbnN0clYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgUmV0dXJuIFRSVUUgaWYgYW4gaW50ZXJydXB0IGlzIHBlbmRpbmcsIEZBTFNFIG90aGVyd2lzZS4gICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuc2lnbmVkCi1JbnRQZW5kaW5nIChBUk11bF9TdGF0ZSAqIHN0YXRlKQotewotICBpZiAoc3RhdGUtPkV4Y2VwdGlvbikKLSAgICB7CQkJCS8qIEFueSBleGNlcHRpb25zICovCi0gICAgICBpZiAoc3RhdGUtPk5yZXNldFNpZyA9PSBMT1cpCi0JewotCSAgQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9SZXNldFYpOwotCSAgcmV0dXJuIChUUlVFKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RhdGUtPk5maXFTaWcgJiYgIUZGTEFHKQotCXsKLQkgIEFSTXVsX0Fib3J0IChzdGF0ZSwgQVJNdWxfRklRVik7Ci0JICByZXR1cm4gKFRSVUUpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdGF0ZS0+TmlycVNpZyAmJiAhSUZMQUcpCi0JewotCSAgQVJNdWxfQWJvcnQgKHN0YXRlLCBBUk11bF9JUlFWKTsKLQkgIHJldHVybiAoVFJVRSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChGQUxTRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgQWxpZ24gYSB3b3JkIGFjY2VzcyB0byBhIG5vbiB3b3JkIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQVJNd29yZAotQVJNdWxfQWxpZ24gKHN0YXRlLCBhZGRyZXNzLCBkYXRhKQotICAgICBBUk11bF9TdGF0ZSAqIHN0YXRlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEFSTXdvcmQgYWRkcmVzczsKLSAgICAgQVJNd29yZCBkYXRhOwotewotICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGUgYWRkcmVzcyBpcyByZWFsbHkgdW5hbGlnbmVkLAotICAgICBhcyBhIHNoaWZ0IGJ5IDMyIGlzIHVuZGVmaW5lZCBpbiBDLiAgKi8KLQotICBhZGRyZXNzID0gKGFkZHJlc3MgJiAzKSA8PCAzOwkvKiBnZXQgdGhlIHdvcmQgYWRkcmVzcyAqLwotICByZXR1cm4gKChkYXRhID4+IGFkZHJlc3MpIHwgKGRhdGEgPDwgKDMyIC0gYWRkcmVzcykpKTsJLyogcm90IHJpZ2h0ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNhbGwgYW5vdGhlciByb3V0aW5lIGFmdGVyIGEgY2VydGFpbiBudW1iZXIgb2YgICAgKgotKiBjeWNsZXMgaGF2ZSBiZWVuIGV4ZWN1dGVkLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgY3ljbGVzICAgICoKLSogZGVsYXkgYmVmb3JlIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBwb2ludGVyICAgICAqCi0qIHRvIHRoZSBmdW5jdGlvbi4gQSBkZWxheSBvZiB6ZXJvIGRvZXNuJ3Qgd29yaywganVzdCBjYWxsIHRoZSBmdW5jdGlvbi4gICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfU2NoZWR1bGVFdmVudCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbG9uZyBkZWxheSwKLQkJICAgICB1bnNpZ25lZCAoKndoYXQpICgpKQotewotICB1bnNpZ25lZCBsb25nIHdoZW47Ci0gIHN0cnVjdCBFdmVudE5vZGUgKmV2ZW50OwotCi0gIGlmIChzdGF0ZS0+RXZlbnRTZXQrKyA9PSAwKQotICAgIHN0YXRlLT5Ob3cgPSBBUk11bF9UaW1lIChzdGF0ZSk7Ci0gIHdoZW4gPSAoc3RhdGUtPk5vdyArIGRlbGF5KSAlIEVWRU5UTElTVFNJWkU7Ci0gIGV2ZW50ID0gKHN0cnVjdCBFdmVudE5vZGUgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBFdmVudE5vZGUpKTsKLSAgZXZlbnQtPmZ1bmMgPSB3aGF0OwotICBldmVudC0+bmV4dCA9ICooc3RhdGUtPkV2ZW50UHRyICsgd2hlbik7Ci0gICooc3RhdGUtPkV2ZW50UHRyICsgd2hlbikgPSBldmVudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGN5Y2xlLCB0byBlbnZva2UgICAgICAgICAqCi0qIHNjaGVkdWxlZCBldmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfRW52b2tlRXZlbnQgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRoZW47Ci0KLSAgdGhlbiA9IHN0YXRlLT5Ob3c7Ci0gIHN0YXRlLT5Ob3cgPSBBUk11bF9UaW1lIChzdGF0ZSkgJSBFVkVOVExJU1RTSVpFOwotICBpZiAodGhlbiA8IHN0YXRlLT5Ob3cpCS8qIHNjaGVkdWxlIGV2ZW50cyAqLwotICAgIEVudm9rZUxpc3QgKHN0YXRlLCB0aGVuLCBzdGF0ZS0+Tm93KTsKLSAgZWxzZSBpZiAodGhlbiA+IHN0YXRlLT5Ob3cpCi0gICAgewkJCQkvKiBuZWVkIHRvIHdyYXAgYXJvdW5kIHRoZSBsaXN0ICovCi0gICAgICBFbnZva2VMaXN0IChzdGF0ZSwgdGhlbiwgRVZFTlRMSVNUU0laRSAtIDFMKTsKLSAgICAgIEVudm9rZUxpc3QgKHN0YXRlLCAwTCwgc3RhdGUtPk5vdyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotRW52b2tlTGlzdCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvKQotLyogZW52b2tlcyBhbGwgdGhlIGVudHJpZXMgaW4gYSByYW5nZSAqLwotewotICBzdHJ1Y3QgRXZlbnROb2RlICphbmV2ZW50OwotCi0gIGZvciAoOyBmcm9tIDw9IHRvOyBmcm9tKyspCi0gICAgewotICAgICAgYW5ldmVudCA9ICooc3RhdGUtPkV2ZW50UHRyICsgZnJvbSk7Ci0gICAgICB3aGlsZSAoYW5ldmVudCkKLQl7Ci0JICAoYW5ldmVudC0+ZnVuYykgKHN0YXRlKTsKLQkgIHN0YXRlLT5FdmVudFNldC0tOwotCSAgYW5ldmVudCA9IGFuZXZlbnQtPm5leHQ7Ci0JfQotICAgICAgKihzdGF0ZS0+RXZlbnRQdHIgKyBmcm9tKSA9IE5VTEw7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBUaGlzIHJvdXRpbmUgaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNsb2NrIHRpY2tzIHNpbmNlIHRoZSBsYXN0IHJlc2V0LiAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuc2lnbmVkIGxvbmcKLUFSTXVsX1RpbWUgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIHJldHVybiAoc3RhdGUtPk51bVNjeWNsZXMgKyBzdGF0ZS0+TnVtTmN5Y2xlcyArCi0JICBzdGF0ZS0+TnVtSWN5Y2xlcyArIHN0YXRlLT5OdW1DY3ljbGVzICsgc3RhdGUtPk51bUZjeWNsZXMpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm12aXJ0LmMgYi9zaW0vYXJtL2FybXZpcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMDA4My4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2FybXZpcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKiAgYXJtdmlydC5jIC0tIEFSTXVsYXRvciB2aXJ0dWFsIG1lbW9yeSBpbnRlcmFjZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tcGxldGUgQVJNdWxhdG9yIG1lbW9yeSBtb2RlbCwgbW9kZWxsaW5nIGEKLSJ2aXJ0dWFsIG1lbW9yeSIgc3lzdGVtLiBBIG11Y2ggc2ltcGxlciBtb2RlbCBjYW4gYmUgZm91bmQgaW4gYXJtZmFzdC5jLAotYW5kIHRoYXQgbW9kZWwgZ29lcyBmYXN0ZXIgdG9vLCBidXQgaGFzIGEgZml4ZWQgYW1vdW50IG9mIG1lbW9yeS4gVGhpcwotbW9kZWwncyBtZW1vcnkgaGFzIDY0SyBwYWdlcywgYWxsb2NhdGVkIG9uIGRlbWFuZCBmcm9tIGEgNjRLIGVudHJ5IHBhZ2UKLXRhYmxlLiBUaGUgcm91dGluZXMgUHV0V29yZCBhbmQgR2V0V29yZCBpbXBsZW1lbnQgdGhpcy4gUGFnZXMgYXJlIG5ldmVyCi1mcmVlZCBhcyB0aGV5IG1pZ2h0IGJlIG5lZWRlZCBhZ2Fpbi4gQSBzaW5nbGUgYXJlYSBvZiBtZW1vcnkgbWF5IGJlCi1kZWZpbmVkIHRvIGdlbmVyYXRlIGFib3J0cy4gKi8KLQotI2luY2x1ZGUgImFybW9wdHMuaCIKLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2lmZGVmIFZBTElEQVRFCQkJLyogZm9yIHJ1bm5pbmcgdGhlIHZhbGlkYXRlIHN1aXRlICovCi0jZGVmaW5lIFRVQkUgNDggKiAxMDI0ICogMTAyNAkvKiB3cml0ZSBhIGNoYXIgb24gdGhlIHNjcmVlbiAqLwotI2RlZmluZSBBQk9SVFMgMQotI2VuZGlmCi0KLSNkZWZpbmUgQUJPUlRTCi0KLSNpZmRlZiBBQk9SVFMJCQkvKiB0aGUgbWVtb3J5IHN5c3RlbSB3aWxsIGFib3J0ICovCi0vKiBGb3IgdGhlIG9sZCB0ZXN0IHN1aXRlIEFib3J0IGJldHdlZW4gMzIgS2J5dGVzIGFuZCAzMiBNYnl0ZXMKLSAgIEZvciB0aGUgbmV3IHRlc3Qgc3VpdGUgQWJvcnQgYmV0d2VlbiA4IE1ieXRlcyBhbmQgMjYgTWJ5dGVzICovCi0vKiAjZGVmaW5lIExPV0FCT1JUIDMyICogMTAyNAotI2RlZmluZSBISUdIQUJPUlQgMzIgKiAxMDI0ICogMTAyNCAqLwotI2RlZmluZSBMT1dBQk9SVCA4ICogMTAyNCAqIDEwMjQKLSNkZWZpbmUgSElHSEFCT1JUIDI2ICogMTAyNCAqIDEwMjQKLQotI2VuZGlmCi0KLSNkZWZpbmUgTlVNUEFHRVMgNjQgKiAxMDI0Ci0jZGVmaW5lIFBBR0VTSVpFIDY0ICogMTAyNAotI2RlZmluZSBQQUdFQklUUyAxNgotI2RlZmluZSBPRkZTRVRCSVRTIDB4ZmZmZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgR2V0IGEgV29yZCBmcm9tIFZpcnR1YWwgTWVtb3J5LCBtYXliZSBhbGxvY2F0aW5nIHRoZSBwYWdlICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBBUk13b3JkCi1HZXRXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCi17Ci0gIEFSTXdvcmQgcGFnZTsKLSAgQVJNd29yZCBvZmZzZXQ7Ci0gIEFSTXdvcmQgKipwYWdldGFibGU7Ci0gIEFSTXdvcmQgKnBhZ2VwdHI7Ci0KLSAgcGFnZSA9IGFkZHJlc3MgPj4gUEFHRUJJVFM7Ci0gIG9mZnNldCA9IChhZGRyZXNzICYgT0ZGU0VUQklUUykgPj4gMjsKLSAgcGFnZXRhYmxlID0gKEFSTXdvcmQgKiopIHN0YXRlLT5NZW1EYXRhUHRyOwotICBwYWdlcHRyID0gKihwYWdldGFibGUgKyBwYWdlKTsKLQotICBpZiAocGFnZXB0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBhZ2VwdHIgPSAoQVJNd29yZCAqKSBtYWxsb2MgKFBBR0VTSVpFKTsKLQotICAgICAgaWYgKHBhZ2VwdHIgPT0gTlVMTCkKLQl7Ci0JICBwZXJyb3IgKCJBUk11bGF0b3IgY2FuJ3QgYWxsb2NhdGUgVk0gcGFnZSIpOwotCSAgZXhpdCAoMTIpOwotCX0KLQotICAgICAgKihwYWdldGFibGUgKyBwYWdlKSA9IHBhZ2VwdHI7Ci0gICAgfQotCi0gIHJldHVybiAqKHBhZ2VwdHIgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgUHV0IGEgV29yZCBpbnRvIFZpcnR1YWwgTWVtb3J5LCBtYXliZSBhbGxvY2F0aW5nIHRoZSBwYWdlICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1QdXRXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKLXsKLSAgQVJNd29yZCBwYWdlOwotICBBUk13b3JkIG9mZnNldDsKLSAgQVJNd29yZCAqKnBhZ2V0YWJsZTsKLSAgQVJNd29yZCAqcGFnZXB0cjsKLQotICBwYWdlID0gYWRkcmVzcyA+PiBQQUdFQklUUzsKLSAgb2Zmc2V0ID0gKGFkZHJlc3MgJiBPRkZTRVRCSVRTKSA+PiAyOwotICBwYWdldGFibGUgPSAoQVJNd29yZCAqKikgc3RhdGUtPk1lbURhdGFQdHI7Ci0gIHBhZ2VwdHIgPSAqKHBhZ2V0YWJsZSArIHBhZ2UpOwotCi0gIGlmIChwYWdlcHRyID09IE5VTEwpCi0gICAgewotICAgICAgcGFnZXB0ciA9IChBUk13b3JkICopIG1hbGxvYyAoUEFHRVNJWkUpOwotICAgICAgaWYgKHBhZ2VwdHIgPT0gTlVMTCkKLQl7Ci0JICBwZXJyb3IgKCJBUk11bGF0b3IgY2FuJ3QgYWxsb2NhdGUgVk0gcGFnZSIpOwotCSAgZXhpdCAoMTMpOwotCX0KLQotICAgICAgKihwYWdldGFibGUgKyBwYWdlKSA9IHBhZ2VwdHI7Ci0gICAgfQotCi0gICoocGFnZXB0ciArIG9mZnNldCkgPSBkYXRhOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXNlIHRoZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuc2lnbmVkCi1BUk11bF9NZW1vcnlJbml0IChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBsb25nIGluaXRtZW1zaXplKQotewotICBBUk13b3JkICoqcGFnZXRhYmxlOwotICB1bnNpZ25lZCBwYWdlOwotCi0gIGlmIChpbml0bWVtc2l6ZSkKLSAgICBzdGF0ZS0+TWVtU2l6ZSA9IGluaXRtZW1zaXplOwotCi0gIHBhZ2V0YWJsZSA9IChBUk13b3JkICoqKSBtYWxsb2MgKHNpemVvZiAoQVJNd29yZCkgKiBOVU1QQUdFUyk7Ci0KLSAgaWYgKHBhZ2V0YWJsZSA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICBmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgTlVNUEFHRVM7IHBhZ2UrKykKLSAgICAqKHBhZ2V0YWJsZSArIHBhZ2UpID0gTlVMTDsKLQotICBzdGF0ZS0+TWVtRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2V0YWJsZTsKLQotICBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiLCA0IEdiIG1lbW9yeSIpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdGhlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX01lbW9yeUV4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpCi17Ci0gIEFSTXdvcmQgcGFnZTsKLSAgQVJNd29yZCAqKnBhZ2V0YWJsZTsKLSAgQVJNd29yZCAqcGFnZXB0cjsKLQotICBwYWdldGFibGUgPSAoQVJNd29yZCAqKikgc3RhdGUtPk1lbURhdGFQdHI7Ci0gIGZvciAocGFnZSA9IDA7IHBhZ2UgPCBOVU1QQUdFUzsgcGFnZSsrKQotICAgIHsKLSAgICAgIHBhZ2VwdHIgPSAqKHBhZ2V0YWJsZSArIHBhZ2UpOwotICAgICAgaWYgKHBhZ2VwdHIgIT0gTlVMTCkKLQlmcmVlICgoY2hhciAqKSBwYWdlcHRyKTsKLSAgICB9Ci0gIGZyZWUgKChjaGFyICopIHBhZ2V0YWJsZSk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgUmVMb2FkIEluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQKLUFSTXVsX1JlTG9hZEluc3RyIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaXNpemUpCi17Ci0jaWZkZWYgQUJPUlRTCi0gIGlmIChhZGRyZXNzID49IExPV0FCT1JUICYmIGFkZHJlc3MgPCBISUdIQUJPUlQpCi0gICAgewotICAgICAgQVJNdWxfUFJFRkVUQ0hBQk9SVCAoYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gQVJNdWxfQUJPUlRXT1JEOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEFSTXVsX0NMRUFSQUJPUlQ7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKChpc2l6ZSA9PSAyKSAmJiAoYWRkcmVzcyAmIDB4MikpCi0gICAgewotICAgICAgLyogV2UgcmV0dXJuIHRoZSBuZXh0IHR3byBoYWxmd29yZHM6ICovCi0gICAgICBBUk13b3JkIGxvID0gR2V0V29yZCAoc3RhdGUsIGFkZHJlc3MpOwotICAgICAgQVJNd29yZCBoaSA9IEdldFdvcmQgKHN0YXRlLCBhZGRyZXNzICsgNCk7Ci0KLSAgICAgIGlmIChzdGF0ZS0+YmlnZW5kU2lnID09IEhJR0gpCi0JcmV0dXJuIChsbyA8PCAxNikgfCAoaGkgPj4gMTYpOwotICAgICAgZWxzZQotCXJldHVybiAoKGhpICYgMHhGRkZGKSA8PCAxNikgfCAobG8gPj4gMTYpOwotICAgIH0KLQotICByZXR1cm4gR2V0V29yZCAoc3RhdGUsIGFkZHJlc3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICBMb2FkIEluc3RydWN0aW9uLCBTZXF1ZW50aWFsIEN5Y2xlICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQgQVJNdWxfTG9hZEluc3RyUyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGlzaXplKQotewotICBzdGF0ZS0+TnVtU2N5Y2xlcysrOwotCi0jaWZkZWYgSE9VUkdMQVNTCi0gIGlmICgoc3RhdGUtPk51bVNjeWNsZXMgJiBIT1VSR0xBU1NfUkFURSkgPT0gMCkKLSAgICB7Ci0gICAgICBIT1VSR0xBU1M7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIEFSTXVsX1JlTG9hZEluc3RyIChzdGF0ZSwgYWRkcmVzcywgaXNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgTG9hZCBJbnN0cnVjdGlvbiwgTm9uIFNlcXVlbnRpYWwgQ3ljbGUgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQgQVJNdWxfTG9hZEluc3RyTiAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGlzaXplKQotewotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0gIHJldHVybiBBUk11bF9SZUxvYWRJbnN0ciAoc3RhdGUsIGFkZHJlc3MsIGlzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgUmVhZCBXb3JkIChidXQgZG9uJ3QgdGVsbCBhbnlvbmUhKSAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkIEFSTXVsX1JlYWRXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCi17Ci0jaWZkZWYgQUJPUlRTCi0gIGlmIChhZGRyZXNzID49IExPV0FCT1JUICYmIGFkZHJlc3MgPCBISUdIQUJPUlQpCi0gICAgewotICAgICAgQVJNdWxfREFUQUFCT1JUIChhZGRyZXNzKTsKLSAgICAgIHJldHVybiBBUk11bF9BQk9SVFdPUkQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQVJNdWxfQ0xFQVJBQk9SVDsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gR2V0V29yZCAoc3RhdGUsIGFkZHJlc3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgV29yZCwgU2VxdWVudGlhbCBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQgQVJNdWxfTG9hZFdvcmRTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCi17Ci0gIHN0YXRlLT5OdW1TY3ljbGVzKys7Ci0KLSAgcmV0dXJuIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgIExvYWQgV29yZCwgTm9uIFNlcXVlbnRpYWwgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQVJNd29yZCBBUk11bF9Mb2FkV29yZE4gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcykKLXsKLSAgc3RhdGUtPk51bU5jeWNsZXMrKzsKLQotICByZXR1cm4gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyZXNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICBMb2FkIEhhbGZ3b3JkLCAoTm9uIFNlcXVlbnRpYWwgQ3ljbGUpICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkIEFSTXVsX0xvYWRIYWxmV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzKQotewotICBBUk13b3JkIHRlbXAsIG9mZnNldDsKLQotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0gIHRlbXAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOwotICBvZmZzZXQgPSAoKChBUk13b3JkKSBzdGF0ZS0+YmlnZW5kU2lnICogMikgXiAoYWRkcmVzcyAmIDIpKSA8PCAzOwkvKiBiaXQgb2Zmc2V0IGludG8gdGhlIHdvcmQgKi8KLQotICByZXR1cm4gKHRlbXAgPj4gb2Zmc2V0KSAmIDB4ZmZmZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgUmVhZCBCeXRlIChidXQgZG9uJ3QgdGVsbCBhbnlvbmUhKSAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1BUk13b3JkIEFSTXVsX1JlYWRCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCi17Ci0gIEFSTXdvcmQgdGVtcCwgb2Zmc2V0OwotCi0gIHRlbXAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOwotICBvZmZzZXQgPSAoKChBUk13b3JkKSBzdGF0ZS0+YmlnZW5kU2lnICogMykgXiAoYWRkcmVzcyAmIDMpKSA8PCAzOwkvKiBiaXQgb2Zmc2V0IGludG8gdGhlIHdvcmQgKi8KLQotICByZXR1cm4gKHRlbXAgPj4gb2Zmc2V0ICYgMHhmZkwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgIExvYWQgQnl0ZSwgKE5vbiBTZXF1ZW50aWFsIEN5Y2xlKSAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQgQVJNdWxfTG9hZEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcykKLXsKLSAgc3RhdGUtPk51bU5jeWNsZXMrKzsKLQotICByZXR1cm4gQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLCBhZGRyZXNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICBXcml0ZSBXb3JkIChidXQgZG9uJ3QgdGVsbCBhbnlvbmUhKSAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9Xcml0ZVdvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQotewotI2lmZGVmIEFCT1JUUwotICBpZiAoYWRkcmVzcyA+PSBMT1dBQk9SVCAmJiBhZGRyZXNzIDwgSElHSEFCT1JUKQotICAgIHsKLSAgICAgIEFSTXVsX0RBVEFBQk9SVCAoYWRkcmVzcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQVJNdWxfQ0xFQVJBQk9SVDsKLSAgICB9Ci0jZW5kaWYKLQotICBQdXRXb3JkIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSBXb3JkLCBTZXF1ZW50aWFsIEN5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfU3RvcmVXb3JkUyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpCi17Ci0gIHN0YXRlLT5OdW1TY3ljbGVzKys7Ci0KLSAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSBXb3JkLCBOb24gU2VxdWVudGlhbCBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1N0b3JlV29yZE4gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQotewotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0gIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHJlc3MsIGRhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgU3RvcmUgSGFsZldvcmQsIChOb24gU2VxdWVudGlhbCBDeWNsZSkgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX1N0b3JlSGFsZldvcmQgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQotewotICBBUk13b3JkIHRlbXAsIG9mZnNldDsKLQotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0jaWZkZWYgVkFMSURBVEUKLSAgaWYgKGFkZHJlc3MgPT0gVFVCRSkKLSAgICB7Ci0gICAgICBpZiAoZGF0YSA9PSA0KQotCXN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0gICAgICBlbHNlCi0JKHZvaWQpIHB1dGMgKChjaGFyKSBkYXRhLCBzdGRlcnIpOwkvKiBXcml0ZSBDaGFyICovCi0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgdGVtcCA9IEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIG9mZnNldCA9ICgoKEFSTXdvcmQpIHN0YXRlLT5iaWdlbmRTaWcgKiAyKSBeIChhZGRyZXNzICYgMikpIDw8IDM7CS8qIGJpdCBvZmZzZXQgaW50byB0aGUgd29yZCAqLwotCi0gIFB1dFdvcmQgKHN0YXRlLCBhZGRyZXNzLAotCSAgICh0ZW1wICYgfigweGZmZmZMIDw8IG9mZnNldCkpIHwgKChkYXRhICYgMHhmZmZmTCkgPDwgb2Zmc2V0KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgV3JpdGUgQnl0ZSAoYnV0IGRvbid0IHRlbGwgYW55b25lISkgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotQVJNdWxfV3JpdGVCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKLXsKLSAgQVJNd29yZCB0ZW1wLCBvZmZzZXQ7Ci0KLSAgdGVtcCA9IEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIG9mZnNldCA9ICgoKEFSTXdvcmQpIHN0YXRlLT5iaWdlbmRTaWcgKiAzKSBeIChhZGRyZXNzICYgMykpIDw8IDM7CS8qIGJpdCBvZmZzZXQgaW50byB0aGUgd29yZCAqLwotCi0gIFB1dFdvcmQgKHN0YXRlLCBhZGRyZXNzLAotCSAgICh0ZW1wICYgfigweGZmTCA8PCBvZmZzZXQpKSB8ICgoZGF0YSAmIDB4ZmZMKSA8PCBvZmZzZXQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgIFN0b3JlIEJ5dGUsIChOb24gU2VxdWVudGlhbCBDeWNsZSkgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9TdG9yZUJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQotewotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0jaWZkZWYgVkFMSURBVEUKLSAgaWYgKGFkZHJlc3MgPT0gVFVCRSkKLSAgICB7Ci0gICAgICBpZiAoZGF0YSA9PSA0KQotCXN0YXRlLT5FbXVsYXRlID0gRkFMU0U7Ci0gICAgICBlbHNlCi0JKHZvaWQpIHB1dGMgKChjaGFyKSBkYXRhLCBzdGRlcnIpOwkvKiBXcml0ZSBDaGFyICovCi0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgQVJNdWxfV3JpdGVCeXRlIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgIFN3YXAgV29yZCwgKFR3byBOb24gU2VxdWVudGlhbCBDeWNsZXMpICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQVJNd29yZCBBUk11bF9Td2FwV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpCi17Ci0gIEFSTXdvcmQgdGVtcDsKLQotICBzdGF0ZS0+TnVtTmN5Y2xlcysrOwotCi0gIHRlbXAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOwotCi0gIHN0YXRlLT5OdW1OY3ljbGVzKys7Ci0KLSAgUHV0V29yZCAoc3RhdGUsIGFkZHJlc3MsIGRhdGEpOwotCi0gIHJldHVybiB0ZW1wOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICBTd2FwIEJ5dGUsIChUd28gTm9uIFNlcXVlbnRpYWwgQ3ljbGVzKSAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUFSTXdvcmQgQVJNdWxfU3dhcEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQotewotICBBUk13b3JkIHRlbXA7Ci0KLSAgdGVtcCA9IEFSTXVsX0xvYWRCeXRlIChzdGF0ZSwgYWRkcmVzcyk7Ci0gIEFSTXVsX1N0b3JlQnl0ZSAoc3RhdGUsIGFkZHJlc3MsIGRhdGEpOwotCi0gIHJldHVybiB0ZW1wOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgSSBDeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLUFSTXVsX0ljeWNsZXMgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIG51bWJlciwgQVJNd29yZCBhZGRyZXNzIEFUVFJJQlVURV9VTlVTRUQpCi17Ci0gIHN0YXRlLT5OdW1JY3ljbGVzICs9IG51bWJlcjsKLSAgQVJNdWxfQ0xFQVJBQk9SVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50IEMgQ3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1BUk11bF9DY3ljbGVzIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBudW1iZXIsIEFSTXdvcmQgYWRkcmVzcyBBVFRSSUJVVEVfVU5VU0VEKQotewotICBzdGF0ZS0+TnVtQ2N5Y2xlcyArPSBudW1iZXI7Ci0gIEFSTXVsX0NMRUFSQUJPUlQ7Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL2JhZy5jIGIvc2ltL2FybS9iYWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZDc0OS4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2JhZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qICBiYWcuYyAtLSBBUk11bGF0b3Igc3VwcG9ydCBjb2RlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiYWcuYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPZmZlcnMgYSBkYXRhIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBhbmQgZ2V0dGluZyBwYWlycyBvZiBudW1iZXIuICovCi0vKiBUaGUgbnVtYmVycyBhcmUgc3RvcmVkIHRvZ2V0aGVyLCBwdXQgb25lIGNhbiBiZSBsb29rZWQgdXAgYnkgICAgICovCi0vKiBxdW90aW5nIHRoZSBvdGhlci4gIElmIGEgbmV3IHBhaXIgaXMgZW50ZXJlZCBhbmQgb25lIG9mIHRoZSAgICAgICovCi0vKiBudW1iZXJzIGlzIGEgcmVwZWF0IG9mIGEgcHJldmlvdXMgcGFpciwgdGhlbiB0aGUgcHJldmlvcyBwYWlyICAgICovCi0vKiBpcyBkZWxldGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYWcuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2RlZmluZSBIQVNIX1RBQkxFX1NJWkUgMjU2Ci0jZGVmaW5lIGhhc2goeCkgKCgoeCkmMHhmZileKCgoeCk+PjgpJjB4ZmYpXigoKHgpPj4xNikmMHhmZileKCgoeCk+PjI0KSYweGZmKSkKLQotdHlwZWRlZiBzdHJ1Y3QgaGFzaGVudHJ5Ci17Ci0gIHN0cnVjdCBoYXNoZW50cnkgKm5leHQ7Ci0gIGludCBmaXJzdDsKLSAgaW50IHNlY29uZDsKLX0KLUhhc2hlbnRyeTsKLQotSGFzaGVudHJ5ICpsb29rdXBieWZpcnN0W0hBU0hfVEFCTEVfU0laRV07Ci1IYXNoZW50cnkgKmxvb2t1cGJ5c2Vjb25kW0hBU0hfVEFCTEVfU0laRV07Ci0KLXZvaWQKLWFkZHRvbGlzdCAoSGFzaGVudHJ5ICoqIGFkZCwgbG9uZyBmaXJzdCwgbG9uZyBzZWNvbmQpCi17Ci0gIHdoaWxlICgqYWRkKQotICAgIGFkZCA9ICYoKCphZGQpLT5uZXh0KTsKLSAgLyogTWFsbG9jIHdpbGwgbmV2ZXIgZmFpbD8gOm8oICovCi0gICgqYWRkKSA9IChIYXNoZW50cnkgKikgbWFsbG9jIChzaXplb2YgKEhhc2hlbnRyeSkpOwotICAoKmFkZCktPm5leHQgPSAoSGFzaGVudHJ5ICopIDA7Ci0gICgqYWRkKS0+Zmlyc3QgPSBmaXJzdDsKLSAgKCphZGQpLT5zZWNvbmQgPSBzZWNvbmQ7Ci19Ci0KLXZvaWQKLWtpbGx3aG9sZWxpc3QgKEhhc2hlbnRyeSAqIHApCi17Ci0gIEhhc2hlbnRyeSAqcTsKLQotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICBxID0gcDsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgZnJlZSAocSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlZnJvbWxpc3QgKEhhc2hlbnRyeSAqKiBwLCBsb25nIGZpcnN0KQotewotICBIYXNoZW50cnkgKnE7Ci0KLSAgd2hpbGUgKCpwKQotICAgIHsKLSAgICAgIGlmICgoKnApLT5maXJzdCA9PSBmaXJzdCkKLQl7Ci0JICBxID0gKCpwKS0+bmV4dDsKLQkgIGZyZWUgKCpwKTsKLQkgICpwID0gcTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBwID0gJigoKnApLT5uZXh0KTsKLSAgICB9Ci19Ci0KLXZvaWQKLUJBR19wdXRwYWlyIChsb25nIGZpcnN0LCBsb25nIHNlY29uZCkKLXsKLSAgbG9uZyBqdW5rOwotCi0gIGlmIChCQUdfZ2V0Zmlyc3QgKCZqdW5rLCBzZWNvbmQpICE9IE5PX1NVQ0hfUEFJUikKLSAgICBCQUdfa2lsbHBhaXJfYnlzZWNvbmQgKHNlY29uZCk7Ci0gIGFkZHRvbGlzdCAoJmxvb2t1cGJ5Zmlyc3RbaGFzaCAoZmlyc3QpXSwgZmlyc3QsIHNlY29uZCk7Ci0gIGFkZHRvbGlzdCAoJmxvb2t1cGJ5c2Vjb25kW2hhc2ggKHNlY29uZCldLCBmaXJzdCwgc2Vjb25kKTsKLX0KLQotQmFnX2Vycm9yCi1CQUdfZ2V0Zmlyc3QgKGxvbmcgKmZpcnN0LCBsb25nIHNlY29uZCkKLXsKLSAgSGFzaGVudHJ5ICpsb29rOwotCi0gIGxvb2sgPSBsb29rdXBieXNlY29uZFtoYXNoIChzZWNvbmQpXTsKLSAgd2hpbGUgKGxvb2spCi0gICAgaWYgKGxvb2stPnNlY29uZCA9PSBzZWNvbmQpCi0gICAgICB7Ci0JKmZpcnN0ID0gbG9vay0+Zmlyc3Q7Ci0JcmV0dXJuIE5PX0VSUk9SOwotICAgICAgfQotICByZXR1cm4gTk9fU1VDSF9QQUlSOwotfQotCi1CYWdfZXJyb3IKLUJBR19nZXRzZWNvbmQgKGxvbmcgZmlyc3QsIGxvbmcgKnNlY29uZCkKLXsKLSAgSGFzaGVudHJ5ICpsb29rOwotCi0gIGxvb2sgPSBsb29rdXBieWZpcnN0W2hhc2ggKGZpcnN0KV07Ci0gIHdoaWxlIChsb29rKQotICAgIHsKLSAgICAgIGlmIChsb29rLT5maXJzdCA9PSBmaXJzdCkKLQl7Ci0JICAqc2Vjb25kID0gbG9vay0+c2Vjb25kOwotCSAgcmV0dXJuIE5PX0VSUk9SOwotCX0KLSAgICAgIGxvb2sgPSBsb29rLT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIE5PX1NVQ0hfUEFJUjsKLX0KLQotQmFnX2Vycm9yCi1CQUdfa2lsbHBhaXJfYnlmaXJzdCAobG9uZyBmaXJzdCkKLXsKLSAgbG9uZyBzZWNvbmQ7Ci0KLSAgaWYgKEJBR19nZXRzZWNvbmQgKGZpcnN0LCAmc2Vjb25kKSA9PSBOT19TVUNIX1BBSVIpCi0gICAgcmV0dXJuIE5PX1NVQ0hfUEFJUjsKLSAgcmVtb3ZlZnJvbWxpc3QgKCZsb29rdXBieWZpcnN0W2hhc2ggKGZpcnN0KV0sIGZpcnN0KTsKLSAgcmVtb3ZlZnJvbWxpc3QgKCZsb29rdXBieXNlY29uZFtoYXNoIChzZWNvbmQpXSwgZmlyc3QpOwotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUJhZ19lcnJvcgotQkFHX2tpbGxwYWlyX2J5c2Vjb25kIChsb25nIHNlY29uZCkKLXsKLSAgbG9uZyBmaXJzdDsKLQotICBpZiAoQkFHX2dldGZpcnN0ICgmZmlyc3QsIHNlY29uZCkgPT0gTk9fU1VDSF9QQUlSKQotICAgIHJldHVybiBOT19TVUNIX1BBSVI7Ci0gIHJlbW92ZWZyb21saXN0ICgmbG9va3VwYnlmaXJzdFtoYXNoIChmaXJzdCldLCBmaXJzdCk7Ci0gIHJlbW92ZWZyb21saXN0ICgmbG9va3VwYnlzZWNvbmRbaGFzaCAoc2Vjb25kKV0sIGZpcnN0KTsKLSAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkCi1CQUdfbmV3YmFnICgpCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICB7Ci0gICAgICBraWxsd2hvbGVsaXN0IChsb29rdXBieWZpcnN0W2ldKTsKLSAgICAgIGtpbGx3aG9sZWxpc3QgKGxvb2t1cGJ5c2Vjb25kW2ldKTsKLSAgICAgIGxvb2t1cGJ5Zmlyc3RbaV0gPSBsb29rdXBieXNlY29uZFtpXSA9IChIYXNoZW50cnkgKikgMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL2JhZy5oIGIvc2ltL2FybS9iYWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczODE5NS4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2JhZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogIGJhZy5oIC0tIEFSTXVsYXRvciBzdXBwb3J0IGNvZGU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGJhZy5oOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEhlYWRlciBmaWxlIGZvciBiYWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9mZmVycyBhIGRhdGEgc3RydWN0dXJlIGZvciBzdG9yaW5nIGFuZCBnZXR0aW5nIHBhaXJzIG9mIG51bWJlci4gKi8KLS8qIFRoZSBudW1iZXJzIGFyZSBzdG9yZWQgdG9nZXRoZXIsIHB1dCBvbmUgY2FuIGJlIGxvb2tlZCB1cCBieSAgICAgKi8KLS8qIHF1b3RpbmcgdGhlIG90aGVyLiAgSWYgYSBuZXcgcGFpciBpcyBlbnRlcmVkIGFuZCBvbmUgb2YgdGhlICAgICAgKi8KLS8qIG51bWJlcnMgaXMgYSByZXBlYXQgb2YgYSBwcmV2aW91cyBwYWlyLCB0aGVuIHRoZSBwcmV2aW9zIHBhaXIgICAgKi8KLS8qIGlzIGRlbGV0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIE5PX0VSUk9SLAotICBERUxFVEVEX09MRF9QQUlSLAotICBOT19TVUNIX1BBSVIsCi19Ci1CYWdfZXJyb3I7Ci0KLXZvaWQgQkFHX3B1dHBhaXIgKGxvbmcgZmlyc3QsIGxvbmcgc2Vjb25kKTsKLQotdm9pZCBCQUdfbmV3YmFnICh2b2lkKTsKLUJhZ19lcnJvciBCQUdfa2lsbHBhaXJfYnlmaXJzdCAobG9uZyBmaXJzdCk7Ci1CYWdfZXJyb3IgQkFHX2tpbGxwYWlyX2J5c2Vjb25kIChsb25nIHNlY29uZCk7Ci0KLUJhZ19lcnJvciBCQUdfZ2V0Zmlyc3QgKGxvbmcgKmZpcnN0LCBsb25nIHNlY29uZCk7Ci1CYWdfZXJyb3IgQkFHX2dldHNlY29uZCAobG9uZyBmaXJzdCwgbG9uZyAqc2Vjb25kKTsKZGlmZiAtLWdpdCBhL3NpbS9hcm0vY29tbXVuaWNhdGUuYyBiL3NpbS9hcm0vY29tbXVuaWNhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2ZDc4NS4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2NvbW11bmljYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyogIGNvbW11bmljYXRlLmMgLS0gQVJNdWxhdG9yIFJEUCBjb21tcyBjb2RlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgY2hhcmFjdGVycyBvciBncm91cHMgb2YgY2hhcmFjdGVycyAgICAgICAgICovCi0vKiBkb3duIHNvY2tldHMgb3IgcGlwZXMuICBUaG9zZSB0aGF0IHJldHVybiBhIHZhbHVlIHJldHVybiAtMSBvbiBmYWlsdXJlICovCi0vKiBhbmQgMCBvbiBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0KLS8qIFRoZSBzb2NrZXQgdG8gdGhlIGRlYnVnZ2VyICovCi1pbnQgZGVidWdzb2NrOwotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLwotZXh0ZXJuIGludCBuZmRzOwotCi0vKiBUaGUgc29ja2V0IGhhbmRsZSAqLwotZXh0ZXJuIGludCBzb2NrZXRoYW5kbGU7Ci0KLS8qIFJlYWQgYW5kIFdyaXRlIHJvdXRpbmVzIGRvd24gYSBwaXBlIG9yIHNvY2tldCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlYWQgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQWxsIG90aGVyIHJlYWQgZnVuY3Rpb25zIHJlbHkgb24gdGhpcyBvbmUuICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCB3YWl0cyAxNSBzZWNvbmRzIHVudGlsIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGF2YWlsYWJsZTogaWYgKi8KLS8qIG5vIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIHRoZW4gaXQgdGltZW91dHMgYW5kIHJldHVybnMgLTEuICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLU1ZcmVhZF9jaGFyIChpbnQgc29jaywgdW5zaWduZWQgY2hhciAqYykKLXsKLSAgaW50IGk7Ci0gIGZkX3NldCByZWFkZmRzOwotICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0geyAxNSwgMCB9OwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXNhOwotCi1yZXRyeToKLQotICBGRF9aRVJPICgmcmVhZGZkcyk7Ci0gIEZEX1NFVCAoc29jaywgJnJlYWRmZHMpOwotCi0gIGkgPSBzZWxlY3QgKG5mZHMsICZyZWFkZmRzLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgJnRpbWVvdXQpOwotCi0gIGlmIChpIDwgMCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJzZWxlY3QiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoIWkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVhZDogVGltZW91dFxuIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICgoaSA9IHJlYWQgKHNvY2ssIGMsIDEpKSA8IDEpCi0gICAgewotICAgICAgaWYgKCFpICYmIHNvY2sgPT0gZGVidWdzb2NrKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIkNvbm5lY3Rpb24gd2l0aCBkZWJ1Z2dlciBzZXZlcmVkLlxuIik7Ci0JICAvKiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgZm9yIGEgZGV0YWNoZWQgYXJtdWxhdG9yLCBidXQKLQkgICAgIHRoZSBhcm11bGF0b3IgY2Fubm90IGJlIGNvbGQgc3RhcnRlZCBhIHNlY29uZCB0aW1lLCBzbwotCSAgICAgdGhpcyBpcyBwcm9iYWJseSBwcmVmZXJhYmxlIHRvIGxvY2tpbmcgdXAuICAqLwotCSAgcmV0dXJuIC0xOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiV2FpdGluZyBmb3IgY29ubmVjdGlvbiBmcm9tIGRlYnVnZ2VyLi4uIik7Ci0JICBkZWJ1Z3NvY2sgPSBhY2NlcHQgKHNvY2tldGhhbmRsZSwgJmlzYSwgJmkpOwotCSAgaWYgKGRlYnVnc29jayA8IDApCi0JICAgIHsJCQkvKiBOb3cgd2UgYXJlIGluIHNlcmlvdXMgdHJvdWJsZS4uLiAqLwotCSAgICAgIHBlcnJvciAoImFjY2VwdCIpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgZnByaW50ZiAoc3RkZXJyLCAiIGRvbmUuXG5Db25uZWN0aW9uIEVzdGFibGlzaGVkLlxuIik7Ci0JICBzb2NrID0gZGVidWdzb2NrOwotCSAgZ290byByZXRyeTsKLQl9Ci0gICAgICBwZXJyb3IgKCJyZWFkIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgaWYgKHNvY2sgPT0gZGVidWdzb2NrKQotICAgIGZwcmludGYgKHN0ZGVyciwgIjwlMDJ4ICIsICpjKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlYWQgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgd2FpdHMgdW50aWwgdGhlcmUgaXMgYSBjaGFyYWN0ZXIgYXZhaWxhYmxlLiBSZXR1cm5zIC0xIGlmICovCi0vKiBhbiBlcnJvciBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1NWXJlYWRfY2hhcndhaXQgKGludCBzb2NrLCB1bnNpZ25lZCBjaGFyICpjKQotewotICBpbnQgaTsKLSAgZmRfc2V0IHJlYWRmZHM7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBpc2E7Ci0KLXJldHJ5OgotCi0gIEZEX1pFUk8gKCZyZWFkZmRzKTsKLSAgRkRfU0VUIChzb2NrLCAmcmVhZGZkcyk7Ci0KLSAgaSA9IHNlbGVjdCAobmZkcywgJnJlYWRmZHMsCi0JICAgICAgKGZkX3NldCAqKSAwLCAoZmRfc2V0ICopIDAsIChzdHJ1Y3QgdGltZXZhbCAqKSAwKTsKLQotICBpZiAoaSA8IDApCi0gICAgewotICAgICAgcGVycm9yICgic2VsZWN0Iik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotCi0gIGlmICgoaSA9IHJlYWQgKHNvY2ssIGMsIDEpKSA8IDEpCi0gICAgewotICAgICAgaWYgKCFpICYmIHNvY2sgPT0gZGVidWdzb2NrKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIkNvbm5lY3Rpb24gd2l0aCBkZWJ1Z2dlciBzZXZlcmVkLlxuIik7Ci0JICByZXR1cm4gLTE7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJXYWl0aW5nIGZvciBjb25uZWN0aW9uIGZyb20gZGVidWdnZXIuLi4iKTsKLQkgIGRlYnVnc29jayA9IGFjY2VwdCAoc29ja2V0aGFuZGxlLCAmaXNhLCAmaSk7Ci0JICBpZiAoZGVidWdzb2NrIDwgMCkKLQkgICAgewkJCS8qIE5vdyB3ZSBhcmUgaW4gc2VyaW91cyB0cm91YmxlLi4uICovCi0JICAgICAgcGVycm9yICgiYWNjZXB0Iik7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBmcHJpbnRmIChzdGRlcnIsICIgZG9uZS5cbkNvbm5lY3Rpb24gRXN0YWJsaXNoZWQuXG4iKTsKLQkgIHNvY2sgPSBkZWJ1Z3NvY2s7Ci0JICBnb3RvIHJldHJ5OwotCX0KLSAgICAgIHBlcnJvciAoInJlYWQiKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBpZiAoc29jayA9PSBkZWJ1Z3NvY2spCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiPCUwMnggIiwgKmMpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLU1Zd3JpdGVfY2hhciAoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgYykKLXsKLQotICBpZiAod3JpdGUgKHNvY2ssICZjLCAxKSA8IDEpCi0gICAgcGVycm9yICgid3JpdGUiKTsKLSNpZmRlZiBERUJVRwotICBpZiAoc29jayA9PSBkZWJ1Z3NvY2spCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiPiUwMnggIiwgYyk7Ci0jZW5kaWYKLX0KLQotaW50Ci1NWXJlYWRfd29yZCAoaW50IHNvY2ssIEFSTXdvcmQgKiBoZXJlKQotewotICB1bnNpZ25lZCBjaGFyIGEsIGIsIGMsIGQ7Ci0KLSAgaWYgKE1ZcmVhZF9jaGFyIChzb2NrLCAmYSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKE1ZcmVhZF9jaGFyIChzb2NrLCAmYikgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKE1ZcmVhZF9jaGFyIChzb2NrLCAmYykgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKE1ZcmVhZF9jaGFyIChzb2NrLCAmZCkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgKmhlcmUgPSBhIHwgYiA8PCA4IHwgYyA8PCAxNiB8IGQgPDwgMjQ7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1NWXdyaXRlX3dvcmQgKGludCBzb2NrLCBBUk13b3JkIGkpCi17Ci0gIE1Zd3JpdGVfY2hhciAoc29jaywgaSAmIDB4ZmYpOwotICBNWXdyaXRlX2NoYXIgKHNvY2ssIChpICYgMHhmZjAwKSA+PiA4KTsKLSAgTVl3cml0ZV9jaGFyIChzb2NrLCAoaSAmIDB4ZmYwMDAwKSA+PiAxNik7Ci0gIE1Zd3JpdGVfY2hhciAoc29jaywgKGkgJiAweGZmMDAwMDAwKSA+PiAyNCk7Ci19Ci0KLXZvaWQKLU1Zd3JpdGVfc3RyaW5nIChpbnQgc29jaywgY2hhciAqcykKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IE1Zd3JpdGVfY2hhciAoc29jaywgc1tpXSksIHNbaV07IGkrKyk7Ci19Ci0KLWludAotTVlyZWFkX0ZQd29yZCAoaW50IHNvY2ssIGNoYXIgKnB1dGluaGVyZSkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIGlmIChNWXJlYWRfY2hhciAoc29jaywgJnB1dGluaGVyZVtpXSkgPCAwKQotICAgICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotTVl3cml0ZV9GUHdvcmQgKGludCBzb2NrLCBjaGFyICpmcm9taGVyZSkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIE1Zd3JpdGVfY2hhciAoc29jaywgZnJvbWhlcmVbaV0pOwotfQotCi0vKiBUYWtlcyBuIGJ5dGVzIGZyb20gc291cmNlIGFuZCB0aG9zZSBuIGJ5dGVzICovCi0vKiBkb3duIHRvIGRlc3QgKi8KLWludAotcGFzc29uIChpbnQgc291cmNlLCBpbnQgZGVzdCwgaW50IG4pCi17Ci0gIGNoYXIgKnA7Ci0gIGludCBpOwotCi0gIHAgPSAoY2hhciAqKSBtYWxsb2MgKG4pOwotICBpZiAoIXApCi0gICAgewotICAgICAgcGVycm9yICgiT3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGlmIChuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JaWYgKE1ZcmVhZF9jaGFyIChzb3VyY2UsICZwW2ldKSA8IDApCi0JICByZXR1cm4gLTE7Ci0KLSNpZmRlZiBERUJVRwotICAgICAgaWYgKGRlc3QgPT0gZGVidWdzb2NrKQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JICBmcHJpbnRmIChzdGRlcnIsICIpJTAyeCAiLCAodW5zaWduZWQgY2hhcikgcFtpXSk7Ci0jZW5kaWYKLQotICAgICAgd3JpdGUgKGRlc3QsIHAsIG4pOwotICAgIH0KLSAgZnJlZSAocCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9jb21tdW5pY2F0ZS5oIGIvc2ltL2FybS9jb21tdW5pY2F0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUwM2VjLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vY29tbXVuaWNhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qICBjb21tdW5pY2F0ZS5oIC0tIEFSTXVsYXRvciBjb21tcyBzdXBwb3J0IGRlZm5zOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi1pbnQgTVlyZWFkX2NoYXIgKGludCBzb2NrLCB1bnNpZ25lZCBjaGFyICpjKTsKLXZvaWQgTVl3cml0ZV9jaGFyIChpbnQgc29jaywgdW5zaWduZWQgY2hhciBjKTsKLWludCBNWXJlYWRfd29yZCAoaW50IHNvY2ssIEFSTXdvcmQgKiBoZXJlKTsKLXZvaWQgTVl3cml0ZV93b3JkIChpbnQgc29jaywgQVJNd29yZCBpKTsKLXZvaWQgTVl3cml0ZV9zdHJpbmcgKGludCBzb2NrLCBjaGFyICpzKTsKLWludCBNWXJlYWRfRlB3b3JkIChpbnQgc29jaywgY2hhciAqcHV0aW5oZXJlKTsKLXZvaWQgTVl3cml0ZV9GUHdvcmQgKGludCBzb2NrLCBjaGFyICpmcm9taGVyZSk7Ci1pbnQgcGFzc29uIChpbnQgc291cmNlLCBpbnQgZGVzdCwgaW50IG4pOwotCi1pbnQgd2FpdF9mb3Jfb3NyZXBseSAoQVJNd29yZCAqIHJlcGx5KTsJLyogZnJvbSBraWQuYyAqLwotCi0jZGVmaW5lIE9TX1NlbmROb3RoaW5nIDB4MAotI2RlZmluZSBPU19TZW5kQ2hhciAweDEKLSNkZWZpbmUgT1NfU2VuZFdvcmQgMHgyCi0jZGVmaW5lIE9TX1NlbmRTdHJpbmcgMHgzCi0KLS8qIFRoZSBwaXBlcyBiZXR3ZWVuIHRoZSB0d28gcHJvY2Vzc2VzICovCi1leHRlcm4gaW50IG11bWtpZFsyXTsKLWV4dGVybiBpbnQga2lkbXVtWzJdOwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9jb25maWcuaW4gYi9zaW0vYXJtL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4N2EyYi4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fU0VURlBVQ1cKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0lHQUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmcHVfY29udHJvbC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GUFVfQ09OVFJPTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL2FybS9jb25maWd1cmUgYi9zaW0vYXJtL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM1NzRlNC4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQwMjYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1zaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi0KLQotCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLQotCi0KLQotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODY6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA1OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMjI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjc3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1OTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTc1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMTg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjE4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4MDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMTM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzUyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwNzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTcxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODM5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Nzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTYwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLUNPUFJPPWFybWNvcHJvLm8KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZwotcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZwotcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZwotcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ09QUk9AJSRDT1BSTyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9jb25maWd1cmUuaW4gYi9zaW0vYXJtL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmYWM0NC4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1BQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQotCi1DT1BSTz1hcm1jb3Byby5vCi1BQ19TVUJTVChDT1BSTykKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfY29uZi5oIGIvc2ltL2FybS9kYmdfY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTQ5ZGRkLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vZGJnX2NvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qICBkYmdfY29uZi5oIC0tIEFSTXVsYXRvciBkZWJ1ZyBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgRGJnX0NvbmZfX2gKLQotI2RlZmluZSBEYmdfQ29uZl9faAotCi10eXBlZGVmIHN0cnVjdCBEYmdfQ29uZmlnQmxvY2sKLXsKLSAgaW50IGJ5dGVzZXg7Ci0gIGxvbmcgbWVtb3J5c2l6ZTsKLSAgaW50IHNlcmlhbHBvcnQ7CQkvKikgcmVtb3RlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyAqLwotICBpbnQgc2VyaWFsbGluZXNwZWVkOwkJLyopIChzZXJpYWwgY29ubmVjdGlvbikgKi8KLSAgaW50IHBhcmFsbGVscG9ydDsJCS8qKSBkaXR0byAqLwotICBpbnQgcGFyYWxsZWxsaW5lc3BlZWQ7CS8qKSAocGFyYWxsZWwgY29ubmVjdGlvbikgKi8KLSAgaW50IHByb2Nlc3NvcjsJCS8qIHByb2Nlc3NvciB0aGUgYXJtdWxhdG9yIGlzIHRvIGVtdWxhdGUgKGVnIEFSTTYwKSAqLwotICBpbnQgcmRpdHlwZTsJCQkvKiBhcm11bGF0b3IgLyByZW1vdGUgcHJvY2Vzc29yICovCi0gIGludCBkcml2ZXJ0eXBlOwkJLyogcGFyYWxsZWwgLyBzZXJpYWwgLyBldGMgKi8KLSAgY2hhciBjb25zdCAqY29uZmlndG9sb2FkOwotICBpbnQgZmxhZ3M7Ci19Ci1EYmdfQ29uZmlnQmxvY2s7Ci0KLSNkZWZpbmUgRGJnX0NvbmZpZ0ZsYWdfUmVzZXQgMQotCi10eXBlZGVmIHN0cnVjdCBEYmdfSG9zdG9zSW50ZXJmYWNlIERiZ19Ib3N0b3NJbnRlcmZhY2U7Ci0vKiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgYWNjZXNzIGJ5IHRoZSAoaG9zdC1pbmRlcGVuZGVudCkgQy1saWJyYXJ5IHN1cHBvcnQKLSAgIG1vZHVsZSBvZiBhcm11bGF0b3Igb3IgcGlzZCAoYXJtb3MuYykgdG8gaG9zdC1kZXBlbmRlbnQgZnVuY3Rpb25zIGZvcgotICAgd2hpY2ggdGhlcmUgaXMgbm8gaG9zdC1pbmRlcGVuZGVudCBpbnRlcmZhY2UuICBJdHMgY29udGVudHMgYXJlIHVua25vd24KLSAgIHRvIHRoZSBkZWJ1Z2dlciB0b29sYm94LgotICAgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCwgaW4gYSB3aW5kb3dlZCBzeXN0ZW0sIGZwdXRjKHN0ZGVycikgZm9yIGV4YW1wbGUKLSAgIG1heSBub3QgYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3Qgb2YgdGhlIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gc29tZQotICAgd2luZG93LgotICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfY3AuaCBiL3NpbS9hcm0vZGJnX2NwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OWMwZWMuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9kYmdfY3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qICBkYmdfY3AuaCAtLSBBUk11bGF0b3IgZGVidWcgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIERiZ19DUF9faAotCi0jZGVmaW5lIERiZ19DUF9faAotCi0jZGVmaW5lIERiZ19BY2Nlc3NfUmVhZGFibGUgIDEKLSNkZWZpbmUgRGJnX0FjY2Vzc19Xcml0YWJsZSAgMgotI2RlZmluZSBEYmdfQWNjZXNzX0NQRFQgICAgICA0CS8qIGVsc2UgQ1BSVCAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBzaG9ydCBybWluLCBybWF4OwotICAvKiBhIHNpbmdsZSBkZXNjcmlwdGlvbiBjYW4gYmUgdXNlZCBmb3IgYSByYW5nZSBvZiByZWdpc3RlcnMgd2l0aAotICAgICB0aGUgc2FtZSBwcm9wZXJ0aWVzICphY2Nlc3NlZCB2aWEgQ1BEVCBpbnN0cnVjdGlvbnMqCi0gICAqLwotICB1bnNpZ25lZCBjaGFyIG5ieXRlczsJCS8qIHNpemUgb2YgcmVnaXN0ZXIgKi8KLSAgdW5zaWduZWQgY2hhciBhY2Nlc3M7CQkvKiBzZWUgYWJvdmUgKEFjY2Vzc194eHgpICovCi0gIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBDUERUIGluc3RydWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGNvcHJvY2Vzc29yIG11Y2ggZnJlZWRvbToKLQkgb25seSBiaXQgMjIgKCdOJykgYW5kIDEyLTE1ICgnQ1JkJykgYXJlIGZyZWUgZm9yIHRoZQotCSBjb3Byb2Nlc3NvciB0byB1c2UgYXMgaXQgc2VlcyBmaXQuICAqLwotICAgICAgdW5zaWduZWQgY2hhciBuYml0OwotICAgICAgdW5zaWduZWQgY2hhciByZGJpdHM7Ci0gICAgfQotICAgIGNwZHQ7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogQ1BSVCBpbnN0cnVjdGlvbnMgaGF2ZSBtdWNoIG1vcmUgbGF0aXR1ZGUuICBUaGUgYml0cyBmaXhlZAotCSBieSB0aGUgQVJNIGFyZSAgMjQuLjMxIChjb25kaXRpb24gbWFzayAmIG9wY29kZSkKLQkgMjAgKGRpcmVjdGlvbikKLQkgOC4uMTUgKGNwbnVtLCBhcm0gcmVnaXN0ZXIpCi0JIDQgKENQUlQgbm90IENQRE8pCi0JIGxlYXZpbmcgMTQgYml0cyBmcmVlIHRvIHRoZSBjb3Byb2Nlc3NvciAoZm9ydHVuYXRlbHkKLQkgZmFsbGluZyB3aXRoaW4gdHdvIGJ5dGVzKS4gICovCi0gICAgICB1bnNpZ25lZCBjaGFyIHJlYWRfYjAsIHJlYWRfYjEsIHdyaXRlX2IwLCB3cml0ZV9iMTsKLSAgICB9Ci0gICAgY3BydDsKLSAgfQotICBhY2Nlc3NpbnN0OwotfQotRGJnX0NvUHJvUmVnRGVzYzsKLQotc3RydWN0IERiZ19Db1Byb0Rlc2MKLXsKLSAgaW50IGVudHJpZXM7Ci0gIERiZ19Db1Byb1JlZ0Rlc2MgcmVnZGVzY1sxIC8qIHJlYWxseSBuZW50cmllcyAqLyBdOwotfTsKLQotI2RlZmluZSBEYmdfQ29Qcm9EZXNjX1NpemUobikgKHNpemVvZihzdHJ1Y3QgRGJnX0NvUHJvRGVzYykgKyAobi0xKSpzaXplb2YoRGJnX0NvUHJvUmVnRGVzYykpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfaGlmLmggYi9zaW0vYXJtL2RiZ19oaWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1NTUxYy4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL2RiZ19oaWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qICBkYmdfaGlmLmggLS0gQVJNdWxhdG9yIGRlYnVnIGludGVyZmFjZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jICBpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiB2b2lkIEhpZl9EYmdQcmludCAodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOwotdHlwZWRlZiB2b2lkIEhpZl9EYmdQYXVzZSAodm9pZCAqYXJnKTsKLQotdHlwZWRlZiB2b2lkIEhpZl9Xcml0ZUMgKHZvaWQgKmFyZywgaW50IGMpOwotdHlwZWRlZiBpbnQgSGlmX1JlYWRDICh2b2lkICphcmcpOwotdHlwZWRlZiBpbnQgSGlmX1dyaXRlICh2b2lkICphcmcsIGNoYXIgY29uc3QgKmJ1ZmZlciwgaW50IGxlbik7Ci10eXBlZGVmIGNoYXIgKkhpZl9HZXRTICh2b2lkICphcmcsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7Ci0KLXR5cGVkZWYgdm9pZCBIaWZfUkRJUmVzZXRQcm9jICh2b2lkICphcmcpOwotCi1zdHJ1Y3QgRGJnX0hvc3Rvc0ludGVyZmFjZQotewotICBIaWZfRGJnUHJpbnQgKmRiZ3ByaW50OwotICBIaWZfRGJnUGF1c2UgKmRiZ3BhdXNlOwotICB2b2lkICpkYmdhcmc7Ci0KLSAgSGlmX1dyaXRlQyAqd3JpdGVjOwotICBIaWZfUmVhZEMgKnJlYWRjOwotICBIaWZfV3JpdGUgKndyaXRlOwotICBIaWZfR2V0UyAqZ2V0czsKLSAgdm9pZCAqaG9zdG9zYXJnOwotCi0gIEhpZl9SRElSZXNldFByb2MgKnJlc2V0OwotICB2b2lkICpyZXNldGFyZzsKLX07CmRpZmYgLS1naXQgYS9zaW0vYXJtL2RiZ19yZGkuaCBiL3NpbS9hcm0vZGJnX3JkaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTkyNGVjLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vZGJnX3JkaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qICBkYmdfcmRpLmggLS0gQVJNdWxhdG9yIFJESSBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgZGJnX3JkaV9faAotI2RlZmluZSBkYmdfcmRpX19oCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBSRElFcnJvcl9Ob0Vycm9yICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBSRElFcnJvcl9SZXNldCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkSW5zdHJ1Y3Rpb24gICAyCi0jZGVmaW5lIFJESUVycm9yX1NvZnR3YXJlSW50ZXJydXB0ICAgICAgMwotI2RlZmluZSBSRElFcnJvcl9QcmVmZXRjaEFib3J0ICAgICAgICAgIDQKLSNkZWZpbmUgUkRJRXJyb3JfRGF0YUFib3J0ICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFJESUVycm9yX0FkZHJlc3NFeGNlcHRpb24gICAgICAgNgotI2RlZmluZSBSRElFcnJvcl9JUlEgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgUkRJRXJyb3JfRklRICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFJESUVycm9yX0Vycm9yICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBSRElFcnJvcl9CcmFuY2hUaHJvdWdoMCAgICAgICAgIDEwCi0KLSNkZWZpbmUgUkRJRXJyb3JfTm90SW5pdGlhbGlzZWQgICAgICAgICAxMjgKLSNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9Jbml0aWFsaXNlICAgICAxMjkKLSNkZWZpbmUgUkRJRXJyb3JfV3JvbmdCeXRlU2V4ICAgICAgICAgICAxMzAKLSNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9UZXJtaW5hdGUgICAgICAxMzEKLSNkZWZpbmUgUkRJRXJyb3JfQmFkSW5zdHJ1Y3Rpb24gICAgICAgICAxMzIKLSNkZWZpbmUgUkRJRXJyb3JfSWxsZWdhbEluc3RydWN0aW9uICAgICAxMzMKLSNkZWZpbmUgUkRJRXJyb3JfQmFkQ1BVU3RhdGVTZXR0aW5nICAgICAxMzQKLSNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvICAgICAgICAgICAxMzUKLSNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvU3RhdGUgICAgICAxMzYKLSNkZWZpbmUgUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZSAgICAgICAgICAxMzcKLSNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRUeXBlICAgICAgICAgICAxMzgKLSNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFR5cGUgICAgICAxMzkKLSNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRTaXplICAgICAgICAgICAxNDAKLSNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFNpemUgICAgICAxNDEKLSNkZWZpbmUgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzICAgICAgICAgICAxNDIKLSNkZWZpbmUgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQgICAgICAxNDMKLSNkZWZpbmUgUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkICAgICAxNDQKLSNkZWZpbmUgUkRJRXJyb3JfTm9TdWNoUG9pbnQgICAgICAgICAgICAxNDUKLSNkZWZpbmUgUkRJRXJyb3JfUHJvZ3JhbUZpbmlzaGVkSW5TdGVwICAxNDYKLSNkZWZpbmUgUkRJRXJyb3JfVXNlckludGVycnVwdCAgICAgICAgICAxNDcKLSNkZWZpbmUgUkRJRXJyb3JfQ2FudFNldFBvaW50ICAgICAgICAgICAxNDgKLSNkZWZpbmUgUkRJRXJyb3JfSW5jb21wYXRpYmxlUkRJTGV2ZWxzICAxNDkKLQotI2RlZmluZSBSRElFcnJvcl9DYW50TG9hZENvbmZpZyAgICAgICAgIDE1MAotI2RlZmluZSBSRElFcnJvcl9CYWRDb25maWdEYXRhICAgICAgICAgIDE1MQotI2RlZmluZSBSRElFcnJvcl9Ob1N1Y2hDb25maWcgICAgICAgICAgIDE1MgotI2RlZmluZSBSRElFcnJvcl9CdWZmZXJGdWxsICAgICAgICAgICAgIDE1MwotI2RlZmluZSBSRElFcnJvcl9PdXRPZlN0b3JlICAgICAgICAgICAgIDE1NAotI2RlZmluZSBSRElFcnJvcl9Ob3RJbkRvd25sb2FkICAgICAgICAgIDE1NQotI2RlZmluZSBSRElFcnJvcl9Qb2ludEluVXNlICAgICAgICAgICAgIDE1NgotI2RlZmluZSBSRElFcnJvcl9CYWRJbWFnZUZvcm1hdCAgICAgICAgIDE1NwotI2RlZmluZSBSRElFcnJvcl9UYXJnZXRSdW5uaW5nICAgICAgICAgIDE1OAotCi0jZGVmaW5lIFJESUVycm9yX0xpdHRsZUVuZGlhbiAgICAgICAgICAgMjQwCi0jZGVmaW5lIFJESUVycm9yX0JpZ0VuZGlhbiAgICAgICAgICAgICAgMjQxCi0jZGVmaW5lIFJESUVycm9yX1NvZnRJbml0aWFsaXNlRXJyb3IgICAgMjQyCi0KLSNkZWZpbmUgUkRJRXJyb3JfSW5zdWZmaWNpZW50UHJpdmlsZWdlICAyNTMKLSNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2UgICAyNTQKLSNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkTWVzc2FnZSAgICAgICAyNTUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSogICAgICAgICAgICAgICAgICAgICAgICAgIFJEUCBNZXNzYWdlIE51bWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFJEUF9TdGFydCAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MAotI2RlZmluZSBSRFBfRW5kICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDEKLSNkZWZpbmUgUkRQX1JlYWQgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgyCi0jZGVmaW5lIFJEUF9Xcml0ZSAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MwotI2RlZmluZSBSRFBfQ1BVcmVhZCAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDQKLSNkZWZpbmUgUkRQX0NQVXdyaXRlICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHg1Ci0jZGVmaW5lIFJEUF9DUHJlYWQgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4NgotI2RlZmluZSBSRFBfQ1B3cml0ZSAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDcKLSNkZWZpbmUgUkRQX1NldEJyZWFrICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHhhCi0jZGVmaW5lIFJEUF9DbGVhckJyZWFrICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4YgotI2RlZmluZSBSRFBfU2V0V2F0Y2ggICAgICAgICAgICAodW5zaWduZWQgY2hhcikweGMKLSNkZWZpbmUgUkRQX0NsZWFyV2F0Y2ggICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHhkCi0jZGVmaW5lIFJEUF9FeGVjdXRlICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTAKLSNkZWZpbmUgUkRQX1N0ZXAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgxMQotI2RlZmluZSBSRFBfSW5mbyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDEyCi0jZGVmaW5lIFJEUF9PU09wUmVwbHkgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTMKLQotI2RlZmluZSBSRFBfQWRkQ29uZmlnICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDE0Ci0jZGVmaW5lIFJEUF9Mb2FkQ29uZmlnRGF0YSAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTUKLSNkZWZpbmUgUkRQX1NlbGVjdENvbmZpZyAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgxNgotI2RlZmluZSBSRFBfTG9hZEFnZW50ICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDE3Ci0KLSNkZWZpbmUgUkRQX1N0b3BwZWQgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgyMAotI2RlZmluZSBSRFBfT1NPcCAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDIxCi0jZGVmaW5lIFJEUF9GYXRhbCAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4NWUKLSNkZWZpbmUgUkRQX1JldHVybiAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHg1ZgotI2RlZmluZSBSRFBfUmVzZXQgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDdmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIFJESSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBSRElTZXhfTGl0dGxlICAgICAgICAgICAwCS8qIHRoZSBieXRlIHNleCBvZiB0aGUgZGVidWdnZWUgKi8KLSNkZWZpbmUgUkRJU2V4X0JpZyAgICAgICAgICAgICAgMQotI2RlZmluZSBSRElTZXhfRG9udENhcmUgICAgICAgICAyCi0KLSNkZWZpbmUgUkRJUG9pbnRfRVEgICAgICAgICAgICAgMAkvKiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGJyZWFrL3dhdGNocG9pbnRzICovCi0jZGVmaW5lIFJESVBvaW50X0dUICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkRJUG9pbnRfR0UgICAgICAgICAgICAgMgotI2RlZmluZSBSRElQb2ludF9MVCAgICAgICAgICAgICAzCi0jZGVmaW5lIFJESVBvaW50X0xFICAgICAgICAgICAgIDQKLSNkZWZpbmUgUkRJUG9pbnRfSU4gICAgICAgICAgICAgNQotI2RlZmluZSBSRElQb2ludF9PVVQgICAgICAgICAgICA2Ci0jZGVmaW5lIFJESVBvaW50X01BU0sgICAgICAgICAgIDcKLQotI2RlZmluZSBSRElQb2ludF9JbnF1aXJ5ICAgICAgICA2NAkvKiBPUlJlZCB3aXRoIHBvaW50IHR5cGUgaW4gZXh0ZW5kZWQgUkRQICovCi0jZGVmaW5lIFJESVBvaW50X0hhbmRsZSAgICAgICAgIDEyOAkvKiBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgUkRJV2F0Y2hfQnl0ZVJlYWQgICAgICAgMQkvKiB0eXBlcyBvZiBkYXRhIGFjY2Vzc2VzIHRvIHdhdGNoIGZvciAqLwotI2RlZmluZSBSRElXYXRjaF9IYWxmUmVhZCAgICAgICAyCi0jZGVmaW5lIFJESVdhdGNoX1dvcmRSZWFkICAgICAgIDQKLSNkZWZpbmUgUkRJV2F0Y2hfQnl0ZVdyaXRlICAgICAgOAotI2RlZmluZSBSRElXYXRjaF9IYWxmV3JpdGUgICAgICAxNgotI2RlZmluZSBSRElXYXRjaF9Xb3JkV3JpdGUgICAgICAzMgotCi0jZGVmaW5lIFJESVJlZ19SMTUgICAgICAgICAgICAgICgxTCA8PCAxNSkJLyogbWFzayB2YWx1ZXMgZm9yIENQVSAqLwotI2RlZmluZSBSRElSZWdfUEMgICAgICAgICAgICAgICAoMUwgPDwgMTYpCi0jZGVmaW5lIFJESVJlZ19DUFNSICAgICAgICAgICAgICgxTCA8PCAxNykKLSNkZWZpbmUgUkRJUmVnX1NQU1IgICAgICAgICAgICAgKDFMIDw8IDE4KQotI2RlZmluZSBSRElOdW1DUFVSZWdzICAgICAgICAgICAxOQotCi0jZGVmaW5lIFJESU51bUNQUmVncyAgICAgICAgICAgIDEwCS8qIGN1cnJlbnQgbWF4aW11bSAqLwotCi0jZGVmaW5lIFJESU1vZGVfQ3VyciAgICAgICAgICAgIDI1NQotCi0vKiBCaXRzIHNldCBpbiByZXR1cm4gdmFsdWUgZnJvbSBSRElJbmZvX1RhcmdldCAqLwotI2RlZmluZSBSRElUYXJnZXRfTG9nU3BlZWQgICAgICAgICAgICAgIDB4MGYKLSNkZWZpbmUgUkRJVGFyZ2V0X0hXICAgICAgICAgICAgICAgICAgICAweDEwCS8qIGVsc2UgZW11bGF0b3IgKi8KLSNkZWZpbmUgUkRJVGFyZ2V0X0FnZW50TWF4TGV2ZWwgICAgICAgICAweGUwCi0jZGVmaW5lIFJESVRhcmdldF9BZ2VudExldmVsU2hpZnQgICAgICAgNQotI2RlZmluZSBSRElUYXJnZXRfRGVidWdnZXJNaW5MZXZlbCAgICAgIDB4NzAwCi0jZGVmaW5lIFJESVRhcmdldF9EZWJ1Z2dlckxldmVsU2hpZnQgICAgOAotI2RlZmluZSBSRElUYXJnZXRfQ2FuUmVsb2FkQWdlbnQgICAgICAgIDB4ODAwCi0jZGVmaW5lIFJESVRhcmdldF9DYW5JbnF1aXJlTG9hZFNpemUgICAgMHgxMDAwCi0KLS8qIEJpdHMgc2V0IGluIHJldHVybiB2YWx1ZSBmcm9tIFJESUluZm9fU3RlcCAqLwotI2RlZmluZSBSRElTdGVwX011bHRpcGxlICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkRJU3RlcF9QQ0NoYW5nZSAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFJESVN0ZXBfU2luZ2xlICAgICAgICAgICAgICAgICAgNAotCi0vKiBCaXRzIHNldCBpbiByZXR1cm4gdmFsdWUgZnJvbSBSRElJbmZvX1BvaW50cyAqLwotI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfQ29tcGFyaXNvbiAgIDEKLSNkZWZpbmUgUkRJUG9pbnRDYXBhYmlsaXR5X1JhbmdlICAgICAgICAyCi0vKiA0IHRvIDEyOCBhcmUgUkRJV2F0Y2hfeHh7UmVhZCxXcml0ZX0gbGVmdC1zaGlmdGVkIGJ5IHR3byAqLwotI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfTWFzayAgICAgICAgIDI1NgotI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfU3RhdHVzICAgICAgIDUxMgkvKiBQb2ludCBzdGF0dXMgZW5xdWlyaWVzIGF2YWlsYWJsZSAqLwotCi0vKiBSRElfSW5mbyBzdWJjb2RlcyAqLwotI2RlZmluZSBSRElJbmZvX1RhcmdldCAgICAgICAgICAwCi0jZGVmaW5lIFJESUluZm9fUG9pbnRzICAgICAgICAgIDEKLSNkZWZpbmUgUkRJSW5mb19TdGVwICAgICAgICAgICAgMgotI2RlZmluZSBSRElJbmZvX01NVSAgICAgICAgICAgICAzCi0jZGVmaW5lIFJESUluZm9fRG93bkxvYWQgICAgICAgIDQJLyogSW5xdWlyZXMgd2hldGhlciBjb25maWd1cmF0aW9uIGRvd25sb2FkCi0JCQkJCSAgIGFuZCBzZWxlY3Rpb24gaXMgYXZhaWxhYmxlLgotCQkJCQkgKi8KLSNkZWZpbmUgUkRJSW5mb19TZW1pSG9zdGluZyAgICAgNQkvKiBJbnF1aXJlcyB3aGV0aGVyIFJESVNlbWlIb3N0aW5nXyogUkRJX0luZm8KLQkJCQkJICAgY2FsbHMgYXJlIGF2YWlsYWJsZS4KLQkJCQkJICovCi0jZGVmaW5lIFJESUluZm9fQ29Qcm8gICAgICAgICAgIDYJLyogSW5xdWlyZXMgd2hldGhlciBDb1BybyBSRElfSW5mbyBjYWxscyBhcmUKLQkJCQkJICAgYXZhaWxhYmxlLgotCQkJCQkgKi8KLSNkZWZpbmUgUkRJSW5mb19JY2VicmVha2VyICAgICAgNwotCi0vKiBUaGUgbmV4dCB0d28gYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgUkRJSW5mb19Qb2ludHMgKi8KLS8qIGhhcyBSRElQb2ludENhcGFiaWxpdHlfU3RhdHVzIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSRElQb2ludFN0YXR1c19XYXRjaCAgICAweDgwCi0jZGVmaW5lIFJESVBvaW50U3RhdHVzX0JyZWFrICAgIDB4ODEKLQotI2RlZmluZSBSRElTaWduYWxfU3RvcCAgICAgICAgICAweDEwMAotCi0jZGVmaW5lIFJESVZlY3Rvcl9DYXRjaCAgICAgICAgIDB4MTgwCi0KLS8qIFRoZSBuZXh0IGZvdXIgYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiBSRElJbmZvX1NlbWlob3N0aW5nIHJldHVybmVkIG5vIGVycm9yICovCi0jZGVmaW5lIFJESVNlbWlIb3N0aW5nX1NldFN0YXRlIDB4MTgxCi0jZGVmaW5lIFJESVNlbWlIb3N0aW5nX0dldFN0YXRlIDB4MTgyCi0jZGVmaW5lIFJESVNlbWlIb3N0aW5nX1NldFZlY3RvciAweDE4MwotI2RlZmluZSBSRElTZW1pSG9zdGluZ19HZXRWZWN0b3IgMHgxODQKLQotLyogVGhlIG5leHQgdHdvIGFyZSBvbmx5IHRvIGJlIHVzZWQgaWYgUkRJSW5mb19JY2VicmVha2VyIHJldHVybmVkIG5vIGVycm9yICovCi0jZGVmaW5lIFJESUljZWJyZWFrZXJfR2V0TG9ja3MgIDB4MTg1Ci0jZGVmaW5lIFJESUljZWJyZWFrZXJfU2V0TG9ja3MgIDB4MTg2Ci0KLS8qIE9ubHkgaWYgUkRJSW5mb19UYXJnZXQgcmV0dXJuZWQgUkRJVGFyZ2V0X0NhbklucXVpcmVMb2FkU2l6ZSAqLwotI2RlZmluZSBSRElJbmZvX0dldExvYWRTaXplICAgICAweDE4NwotCi0jZGVmaW5lIFJESUN5Y2xlcyAgICAgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIFJESUN5Y2xlc19TaXplICAgICAgICAgIDQ4Ci0jZGVmaW5lIFJESUVycm9yUCAgICAgICAgICAgICAgIDB4MjAxCi0KLSNkZWZpbmUgUkRJU2V0X0NtZGxpbmUgICAgICAgICAgMHgzMDAKLSNkZWZpbmUgUkRJU2V0X1JESUxldmVsICAgICAgICAgMHgzMDEKLSNkZWZpbmUgUkRJU2V0X1RocmVhZCAgICAgICAgICAgMHgzMDIKLQotLyogVGhlIG5leHQgdHdvIGFyZSBvbmx5IHRvIGJlIHVzZWQgaWYgUkRJSW5mb19Db1BybyByZXR1cm5lZCBubyBlcnJvciAqLwotI2RlZmluZSBSRElJbmZvX0Rlc2NyaWJlQ29Qcm8gICAweDQwMAotI2RlZmluZSBSRElJbmZvX1JlcXVlc3RDb1Byb0Rlc2MgMHg0MDEKLQotI2RlZmluZSBSRElJbmZvX0xvZyAgICAgICAgICAgICAweDgwMAotI2RlZmluZSBSRElJbmZvX1NldExvZyAgICAgICAgICAweDgwMQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgUG9pbnRIYW5kbGU7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVGhyZWFkSGFuZGxlOwotI2RlZmluZSBSRElOb1BvaW50SGFuZGxlICAgICAgICAoKFBvaW50SGFuZGxlKS0xTCkKLSNkZWZpbmUgUkRJTm9IYW5kbGUgICAgICAgICAgICAgKChUaHJlYWRIYW5kbGUpLTFMKQotCi1zdHJ1Y3QgRGJnX0NvbmZpZ0Jsb2NrOwotc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2U7Ci1zdHJ1Y3QgRGJnX01DU3RhdGU7Ci10eXBlZGVmIGludCByZGlfb3Blbl9wcm9jICh1bnNpZ25lZCB0eXBlLAotCQkJICAgc3RydWN0IERiZ19Db25maWdCbG9jayBjb25zdCAqY29uZmlnLAotCQkJICAgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgY29uc3QgKmksCi0JCQkgICBzdHJ1Y3QgRGJnX01DU3RhdGUgKmRiZ19zdGF0ZSk7Ci10eXBlZGVmIGludCByZGlfY2xvc2VfcHJvYyAodm9pZCk7Ci10eXBlZGVmIGludCByZGlfcmVhZF9wcm9jIChBUk13b3JkIHNvdXJjZSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgKm5ieXRlcyk7Ci10eXBlZGVmIGludCByZGlfd3JpdGVfcHJvYyAoY29uc3Qgdm9pZCAqc291cmNlLCBBUk13b3JkIGRlc3QsCi0JCQkgICAgdW5zaWduZWQgKm5ieXRlcyk7Ci10eXBlZGVmIGludCByZGlfQ1BVcmVhZF9wcm9jICh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBsb25nIG1hc2ssCi0JCQkgICAgICBBUk13b3JkICogc3RhdGUpOwotdHlwZWRlZiBpbnQgcmRpX0NQVXdyaXRlX3Byb2MgKHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIGxvbmcgbWFzaywKLQkJCSAgICAgICBBUk13b3JkIGNvbnN0ICpzdGF0ZSk7Ci10eXBlZGVmIGludCByZGlfQ1ByZWFkX3Byb2MgKHVuc2lnbmVkIENQbnVtLCB1bnNpZ25lZCBsb25nIG1hc2ssCi0JCQkgICAgIEFSTXdvcmQgKiBzdGF0ZSk7Ci10eXBlZGVmIGludCByZGlfQ1B3cml0ZV9wcm9jICh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQgbG9uZyBtYXNrLAotCQkJICAgICAgQVJNd29yZCBjb25zdCAqc3RhdGUpOwotdHlwZWRlZiBpbnQgcmRpX3NldGJyZWFrX3Byb2MgKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBib3VuZCwKLQkJCSAgICAgICBQb2ludEhhbmRsZSAqIGhhbmRsZSk7Ci10eXBlZGVmIGludCByZGlfY2xlYXJicmVha19wcm9jIChQb2ludEhhbmRsZSBoYW5kbGUpOwotdHlwZWRlZiBpbnQgcmRpX3NldHdhdGNoX3Byb2MgKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwKLQkJCSAgICAgICB1bnNpZ25lZCBkYXRhdHlwZSwgQVJNd29yZCBib3VuZCwKLQkJCSAgICAgICBQb2ludEhhbmRsZSAqIGhhbmRsZSk7Ci10eXBlZGVmIGludCByZGlfY2xlYXJ3YXRjaF9wcm9jIChQb2ludEhhbmRsZSBoYW5kbGUpOwotdHlwZWRlZiBpbnQgcmRpX2V4ZWN1dGVfcHJvYyAoUG9pbnRIYW5kbGUgKiBoYW5kbGUpOwotdHlwZWRlZiBpbnQgcmRpX3N0ZXBfcHJvYyAodW5zaWduZWQgbmluc3RyLCBQb2ludEhhbmRsZSAqIGhhbmRsZSk7Ci10eXBlZGVmIGludCByZGlfaW5mb19wcm9jICh1bnNpZ25lZCB0eXBlLCBBUk13b3JkICogYXJnMSwgQVJNd29yZCAqIGFyZzIpOwotdHlwZWRlZiBpbnQgcmRpX3BvaW50aW5xX3Byb2MgKEFSTXdvcmQgKiBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlLAotCQkJICAgICAgIHVuc2lnbmVkIGRhdGF0eXBlLCBBUk13b3JkICogYm91bmQpOwotCi10eXBlZGVmIGVudW0KLXsKLSAgUkRJX0NvbmZpZ0NQVSwKLSAgUkRJX0NvbmZpZ1N5c3RlbQotfQotUkRJX0NvbmZpZ0FzcGVjdDsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFJESV9NYXRjaEFueSwKLSAgUkRJX01hdGNoRXhhY3RseSwKLSAgUkRJX01hdGNoTm9FYXJsaWVyCi19Ci1SRElfQ29uZmlnTWF0Y2hUeXBlOwotCi10eXBlZGVmIGludCByZGlfYWRkY29uZmlnX3Byb2MgKHVuc2lnbmVkIGxvbmcgbmJ5dGVzKTsKLXR5cGVkZWYgaW50IHJkaV9sb2FkY29uZmlnZGF0YV9wcm9jICh1bnNpZ25lZCBsb25nIG5ieXRlcywgY2hhciBjb25zdCAqZGF0YSk7Ci10eXBlZGVmIGludCByZGlfc2VsZWN0Y29uZmlnX3Byb2MgKFJESV9Db25maWdBc3BlY3QgYXNwZWN0LCBjaGFyIGNvbnN0ICpuYW1lLAotCQkJCSAgIFJESV9Db25maWdNYXRjaFR5cGUgbWF0Y2h0eXBlLAotCQkJCSAgIHVuc2lnbmVkIHZlcnNpb25yZXEsIHVuc2lnbmVkICp2ZXJzaW9ucCk7Ci0KLXR5cGVkZWYgY2hhciAqZ2V0YnVmZmVycHJvYyAodm9pZCAqZ2V0YmFyZywgdW5zaWduZWQgbG9uZyAqc2l6ZXApOwotdHlwZWRlZiBpbnQgcmRpX2xvYWRhZ2VudHByb2MgKEFSTXdvcmQgZGVzdCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJICAgICAgIGdldGJ1ZmZlcnByb2MgKiBnZXRiLCB2b2lkICpnZXRiYXJnKTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IGl0ZW1tYXg7Ci0gIGNoYXIgY29uc3QgKmNvbnN0ICpuYW1lczsKLX0KLVJESV9OYW1lTGlzdDsKLQotdHlwZWRlZiBSRElfTmFtZUxpc3QgY29uc3QgKnJkaV9uYW1lbGlzdHByb2MgKHZvaWQpOwotCi10eXBlZGVmIGludCByZGlfZXJybWVzc3Byb2MgKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGVycm5vKTsKLQotc3RydWN0IFJESVByb2NWZWMKLXsKLSAgY2hhciByZGl0eXBlbmFtZVsxMl07Ci0KLSAgcmRpX29wZW5fcHJvYyAqb3BlbjsKLSAgcmRpX2Nsb3NlX3Byb2MgKmNsb3NlOwotICByZGlfcmVhZF9wcm9jICpyZWFkOwotICByZGlfd3JpdGVfcHJvYyAqd3JpdGU7Ci0gIHJkaV9DUFVyZWFkX3Byb2MgKkNQVXJlYWQ7Ci0gIHJkaV9DUFV3cml0ZV9wcm9jICpDUFV3cml0ZTsKLSAgcmRpX0NQcmVhZF9wcm9jICpDUHJlYWQ7Ci0gIHJkaV9DUHdyaXRlX3Byb2MgKkNQd3JpdGU7Ci0gIHJkaV9zZXRicmVha19wcm9jICpzZXRicmVhazsKLSAgcmRpX2NsZWFyYnJlYWtfcHJvYyAqY2xlYXJicmVhazsKLSAgcmRpX3NldHdhdGNoX3Byb2MgKnNldHdhdGNoOwotICByZGlfY2xlYXJ3YXRjaF9wcm9jICpjbGVhcndhdGNoOwotICByZGlfZXhlY3V0ZV9wcm9jICpleGVjdXRlOwotICByZGlfc3RlcF9wcm9jICpzdGVwOwotICByZGlfaW5mb19wcm9jICppbmZvOwotICAvKiBWMiBSREkgKi8KLSAgcmRpX3BvaW50aW5xX3Byb2MgKnBvaW50aW5xdWlyeTsKLQotICAvKiBUaGVzZSB0aHJlZSB1c2VhYmxlIG9ubHkgaWYgUkRJSW5mb19Eb3duTG9hZCByZXR1cm5zIG5vIGVycm9yICovCi0gIHJkaV9hZGRjb25maWdfcHJvYyAqYWRkY29uZmlnOwotICByZGlfbG9hZGNvbmZpZ2RhdGFfcHJvYyAqbG9hZGNvbmZpZ2RhdGE7Ci0gIHJkaV9zZWxlY3Rjb25maWdfcHJvYyAqc2VsZWN0Y29uZmlnOwotCi0gIHJkaV9uYW1lbGlzdHByb2MgKmRyaXZlcm5hbWVzOwotICByZGlfbmFtZWxpc3Rwcm9jICpjcHVuYW1lczsKLQotICByZGlfZXJybWVzc3Byb2MgKmVycm1lc3M7Ci0KLSAgLyogT25seSBpZiBSRElJbmZvX1RhcmdldCByZXR1cm5zIGEgdmFsdWUgd2l0aCBSRElUYXJnZXRfTG9hZEFnZW50IHNldCAqLwotICByZGlfbG9hZGFnZW50cHJvYyAqbG9hZGFnZW50OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vYXJtL2dkYmhvc3QuYyBiL3NpbS9hcm0vZ2RiaG9zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEyNTc0Li4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vZ2RiaG9zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qICBnZGJob3N0LmMgLS0gQVJNdWxhdG9yIFJEUCB0byBnZGIgY29tbXMgY29kZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRnVuY3Rpb25zIHRoYXQgY29tbXVuaWNhdGUgaW5mbyBiYWNrIHRvIHRoZSBkZWJ1Z2dlci4uLiAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0jaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKLSNpbmNsdWRlICJkYmdfcmRpLmgiCi0jaW5jbHVkZSAiYXJtb3MuaCIKLQotI2RlZmluZSBPU19TZW5kTm90aGluZyAweDAKLSNkZWZpbmUgT1NfU2VuZENoYXIgMHgxCi0jZGVmaW5lIE9TX1NlbmRXb3JkIDB4MgotI2RlZmluZSBPU19TZW5kU3RyaW5nIDB4MwotCi0vKiBEZWZpbmVkIGluIGtpZC5jICovCi1leHRlcm4gaW50IHdhaXRfZm9yX29zcmVwbHkgKEFSTXdvcmQgKiByZXBseSk7Ci0KLS8qIEEgcGlwZSBmb3IgaGFuZGxpbmcgU1dJIHJldHVybiB2YWx1ZXMgdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gdGhlICovCi0vKiBwYXJlbnQgdG8gdGhlIEFSTXVsYXRvciBob3N0IGludGVyZmFjZSwgYnlwYXNzaW5nIHRoZSBjaGlsZHMgUkRQICovCi0vKiB0byBSREkgaW50ZXJwcmV0ZXIgKi8KLWludCBEZWJ1Z2dlckFSTXVsWzJdOwotCi0vKiBUaGUgcGlwZXMgYmV0d2VlbiB0aGUgdHdvIHByb2Nlc3NlcyAqLwotaW50IG11bWtpZFsyXTsKLWludCBraWRtdW1bMl07Ci0KLXZvaWQKLW15cHJpbnQgKHZvaWQgKmFyZywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQotewotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkhvc3Q6IG15cHJpbnRcbiIpOwotI2VuZGlmCi0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXApOwotfQotCi0KLS8qIFdhaXRzIGZvciBhIGtleXByZXNzIG9uIHRoZSBkZWJ1Z2dlcnMnIGtleWJvYXJkICovCi12b2lkCi1teXBhdXNlICh2b2lkICphcmcpCi17Ci0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiSG9zdDogbXlwYXVzZVxuIik7Ci0jZW5kaWYKLX0JCQkJLyogSSBkbyBsb3ZlIGV4Y2l0aW5nIGZ1bmN0aW9ucyAqLwotCi12b2lkCi1teXdyaXRlYyAodm9pZCAqYXJnLCBpbnQgYykKLXsKLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJNeXdyaXRlIDogJWNcbiIsIGMpOwotI2VuZGlmCi0gIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfT1NPcCk7CS8qIE9TIE9wZXJhdGlvbiBSZXF1ZXN0IE1lc3NhZ2UgKi8KLSAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIFNXSV9Xcml0ZUMpOwkvKiBQcmludC4uLiAqLwotICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgT1NfU2VuZENoYXIpOwkvKiAgLi4uYSBzaW5nbGUgY2hhcmFjdGVyICovCi0gIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgYyk7Ci0KLSAgd2FpdF9mb3Jfb3NyZXBseSAoKEFSTXdvcmQgKikgMCk7Ci19Ci0KLWludAotbXlyZWFkYyAodm9pZCAqYXJnKQotewotICBjaGFyIGM7Ci0gIEFSTXdvcmQgeDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkhvc3Q6IG15cmVhZGNcbiIpOwotI2VuZGlmCi0gIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfT1NPcCk7CS8qIE9TIE9wZXJhdGlvbiBSZXF1ZXN0IE1lc3NhZ2UgKi8KLSAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIFNXSV9SZWFkQyk7CS8qIFJlYWQuLi4gKi8KLSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIE9TX1NlbmROb3RoaW5nKTsKLQotICBjID0gd2FpdF9mb3Jfb3NyZXBseSAoJngpOwotICByZXR1cm4gKHgpOwotfQotCi0KLWludAotbXl3cml0ZSAodm9pZCAqYXJnLCBjaGFyIGNvbnN0ICpidWZmZXIsIGludCBsZW4pCi17Ci0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiSG9zdDogbXl3cml0ZVxuIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotbXlnZXRzICh2b2lkICphcmcsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKLXsKLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJIb3N0OiBteWdldHNcbiIpOwotI2VuZGlmCi0gIHJldHVybiBidWZmZXI7Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL2dkYmhvc3QuaCBiL3NpbS9hcm0vZ2RiaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjRkNzcxLi4wMDAwMDAwCi0tLSBhL3NpbS9hcm0vZ2RiaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogIGdkYmhvc3QuaCAtLSBBUk11bGF0b3IgdG8gZ2RiIGludGVyZmFjZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotdm9pZCBteXByaW50ICh2b2lkICphcmcsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7Ci12b2lkIG15cGF1c2UgKHZvaWQgKmFyZyk7Ci12b2lkIG15d3JpdGVjICh2b2lkICphcmcsIGludCBjKTsKLWludCBteXJlYWRjICh2b2lkICphcmcpOwotaW50IG15d3JpdGUgKHZvaWQgKmFyZywgY2hhciBjb25zdCAqYnVmZmVyLCBpbnQgbGVuKTsKLWNoYXIgKm15Z2V0cyAodm9pZCAqYXJnLCBjaGFyICpidWZmZXIsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9raWQuYyBiL3NpbS9hcm0va2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2Q0ZGQuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS9raWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKiAga2lkLmMgLS0gQVJNdWxhdG9yIFJEUC9SREkgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCi0gCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgY2hpbGQgcHJvY2VzcyBjb250aW51ZXMgaGVyZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCB3YWl0cyBvbiBhIHBpcGUgZnJvbSB0aGUgcGFyZW50IGFuZCB0cmFuc2xhdGVzIHRoZSBSRFAgICAgICovCi0vKiBtZXNzYWdlcyBpbnRvIFJESSBjYWxscyB0byB0aGUgQVJNdWxhdG9yIHBhc3NpbmcgUkRQIHJlcGxpZXMgICovCi0vKiBiYWNrIHVwIGEgcGlwZSB0byB0aGUgcGFyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJkYmdfY29uZi5oIgotI2luY2x1ZGUgImRiZ19oaWYuaCIKLSNpbmNsdWRlICJkYmdfcmRpLmgiCi0jaW5jbHVkZSAiZ2RiaG9zdC5oIgotI2luY2x1ZGUgImNvbW11bmljYXRlLmgiCi0KLS8qIFRoZSBwaXBlcyBiZXR3ZWVuIHRoZSB0d28gcHJvY2Vzc2VzICovCi1leHRlcm4gaW50IG11bWtpZFsyXTsKLWV4dGVybiBpbnQga2lkbXVtWzJdOwotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLwotZXh0ZXJuIGludCBuZmRzOwotCi0vKiBUaGUgbWFjaGluZSBuYW1lICovCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOR1RIIDY0Ci1leHRlcm4gY2hhciBsb2NhbGhvc3RbTUFYSE9TVE5BTUVMRU5HVEggKyAxXTsKLQotLyogVGhlIHNvY2tldCBudW1iZXIgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgc29ja2V0bnVtYmVyOwotCi0vKiBSREkgaW50ZXJmYWNlICovCi1leHRlcm4gY29uc3Qgc3RydWN0IFJESVByb2NWZWMgYXJtdWxfcmRpOwotCi1zdGF0aWMgaW50IE1ZcmRwX2xldmVsID0gMDsKLQotc3RhdGljIGludCByZGlfc3RhdGUgPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTaWduYWwgaGFuZGxlciB0aGF0IHRlcm1pbmF0ZXMgZXhjZWN1dGlvbiBpbiB0aGUgQVJNdWxhdG9yICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1raWRfaGFuZGxlc2lnbmFsIChpbnQgc2lnKQotewotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlRlcm1pbmF0ZSBBUk11bGF0b3IgZXhjZWN1dGlvblxuIik7Ci0jZW5kaWYKLSAgaWYgKHNpZyAhPSBTSUdVU1IxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVuc3VwcG9ydGVkIHNpZ25hbC5cbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXJtdWxfcmRpLmluZm8gKFJESVNpZ25hbF9TdG9wLCAodW5zaWduZWQgbG9uZyAqKSAwLCAodW5zaWduZWQgbG9uZyAqKSAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogV2FpdHMgb24gYSBwaXBlIGZyb20gdGhlIHNvY2tldCBkZW1vbiBmb3IgUkRQIGFuZCAgICAgICAgICAgICAgICAqLwotLyogYWN0cyBhcyBhbiBSRFAgdG8gUkRJIGludGVycHJldGVyIG9uIHRoZSBmcm9udCBvZiB0aGUgQVJNdWxhdG9yLiAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAota2lkICgpCi17Ci0gIGNoYXIgKnAsICpxOwotICBpbnQgaSwgaiwgazsKLSAgbG9uZyBvdXRvZnRoZWJhZzsKLSAgdW5zaWduZWQgY2hhciBjLCBkLCBtZXNzYWdlOwotICBBUk13b3JkIHgsIHksIHo7Ci0gIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotICBQb2ludEhhbmRsZSBwb2ludDsKLSAgRGJnX0NvbmZpZ0Jsb2NrIGNvbmZpZzsKLSAgRGJnX0hvc3Rvc0ludGVyZmFjZSBob3N0aWY7Ci0gIHN0cnVjdCBEYmdfTUNTdGF0ZSAqTUNTdGF0ZTsKLSAgY2hhciBjb21tYW5kX2xpbmVbMjU2XTsKLSAgc3RydWN0IGZkX3NldCByZWFkZmRzOwotCi0gIC8qIFNldHVwIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR1VTUjEgKi8KLSAgYWN0aW9uLnNhX2hhbmRsZXIgPSBraWRfaGFuZGxlc2lnbmFsOwotICBhY3Rpb24uc2FfbWFzayA9IDA7Ci0gIGFjdGlvbi5zYV9mbGFncyA9IDA7Ci0KLSAgc2lnYWN0aW9uIChTSUdVU1IxLCAmYWN0aW9uLCAoc3RydWN0IHNpZ2FjdGlvbiAqKSAwKTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBXYWl0IGZvciBldmVyICovCi0gICAgICBGRF9aRVJPICgmcmVhZGZkcyk7Ci0gICAgICBGRF9TRVQgKG11bWtpZFswXSwgJnJlYWRmZHMpOwotCi0gICAgICBpID0gc2VsZWN0IChuZmRzLCAmcmVhZGZkcywKLQkJICAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgKHN0cnVjdCB0aW1ldmFsICopIDApOwotCi0gICAgICBpZiAoaSA8IDApCi0JewotCSAgcGVycm9yICgic2VsZWN0Iik7Ci0JfQotCi0gICAgICBpZiAocmVhZCAobXVta2lkWzBdLCAmbWVzc2FnZSwgMSkgPCAxKQotCXsKLQkgIHBlcnJvciAoInJlYWQiKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobWVzc2FnZSkKLQl7Ci0JY2FzZSBSRFBfU3RhcnQ6Ci0JICAvKiBPcGVuIGFuZC9vciBJbml0aWFsaXNlICovCi0JICBCQUdfbmV3YmFnICgpOwotCi0JICBNWXJlYWRfY2hhciAobXVta2lkWzBdLCAmYyk7CS8qIHR5cGUgKi8KLQkgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sICZ4KTsJLyogbWVtb3J5c2l6ZSAqLwotCSAgaWYgKGMgJiAweDIpCi0JICAgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sICZkKTsJLyogc3BlZWQgKi8KLQkgIGNvbmZpZy5wcm9jZXNzb3IgPSAwOwotCSAgY29uZmlnLm1lbW9yeXNpemUgPSB4OwotCSAgY29uZmlnLmJ5dGVzZXggPSAoYyAmIDB4NCkgPyBSRElTZXhfQmlnIDogUkRJU2V4X0xpdHRsZTsKLQkgIGlmIChjICYgMHg4KQotCSAgICBjb25maWcuYnl0ZXNleCA9IFJESVNleF9Eb250Q2FyZTsKLQotCSAgaG9zdGlmLmRiZ3ByaW50ID0gbXlwcmludDsKLQkgIGhvc3RpZi5kYmdwYXVzZSA9IG15cGF1c2U7Ci0JICBob3N0aWYuZGJnYXJnID0gc3Rkb3V0OwotCSAgaG9zdGlmLndyaXRlYyA9IG15d3JpdGVjOwotCSAgaG9zdGlmLnJlYWRjID0gbXlyZWFkYzsKLQkgIGhvc3RpZi53cml0ZSA9IG15d3JpdGU7Ci0JICBob3N0aWYuZ2V0cyA9IG15Z2V0czsKLQkgIGhvc3RpZi5yZXNldCA9IG15cGF1c2U7CS8qIGRvIG5vdGhpbmcgKi8KLQkgIGhvc3RpZi5yZXNldGFyZyA9ICJEbyBJIGxvdmUgcmVzZXR0aW5nIG9yIHdoYXQhXG4iOwotCi0JICBpZiAocmRpX3N0YXRlKQotCSAgICB7Ci0JICAgICAgLyogd2UgaGF2ZSByZXN0YXJ0ZWQsIHNvIGtpbGwgb2ZmIHRoZSBleGlzdGluZyBydW4uICAqLwotCSAgICAgIC8qIGFybXVsX3JkaS5jbG9zZSgpOyAqLwotCSAgICB9Ci0JICBpID0gYXJtdWxfcmRpLm9wZW4gKGMgJiAweDMsICZjb25maWcsICZob3N0aWYsIE1DU3RhdGUpOwotCSAgcmRpX3N0YXRlID0gMTsKLQotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKLQotCSAgeCA9IH4weDQ7Ci0JICBhcm11bF9yZGkuaW5mbyAoUkRJVmVjdG9yX0NhdGNoLCAmeCwgMCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSRFBfRW5kOgotCSAgLyogQ2xvc2UgYW5kIEZpbmFsaXNlICovCi0JICBpID0gYXJtdWxfcmRpLmNsb3NlICgpOwotCSAgcmRpX3N0YXRlID0gMDsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX1JlYWQ6Ci0JICAvKiBSZWFkIE1lbW9yeSBBZGRyZXNzICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7CS8qIGFkZHJlc3MgKi8KLQkgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sICZ5KTsJLyogbmJ5dGVzICovCi0JICBwID0gKGNoYXIgKikgbWFsbG9jICh5KTsKLQkgIGkgPSBhcm11bF9yZGkucmVhZCAoeCwgcCwgKHVuc2lnbmVkICopICZ5KTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgIGZvciAoayA9IDA7IGsgPCB5OyBrKyspCi0JICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBwW2tdKTsKLQkgIGZyZWUgKHApOwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKLQkgIGlmIChpKQotCSAgICBNWXdyaXRlX3dvcmQgKGtpZG11bVsxXSwgeSk7CS8qIG51bWJlciBvZiBieXRlcyBzZW50IHdpdGhvdXQgZXJyb3IgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBSRFBfV3JpdGU6Ci0JICAvKiBXcml0ZSBNZW1vcnkgQWRkcmVzcyAqLwotCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwkvKiBhZGRyZXNzICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeSk7CS8qIG5ieXRlcyAqLwotCSAgcCA9IChjaGFyICopIG1hbGxvYyAoeSk7Ci0JICBmb3IgKGsgPSAwOyBrIDwgeTsgaysrKQotCSAgICBNWXJlYWRfY2hhciAobXVta2lkWzBdLCAmcFtrXSk7Ci0JICBpID0gYXJtdWxfcmRpLndyaXRlIChwLCB4LCAodW5zaWduZWQgKikgJnkpOwotCSAgZnJlZSAocCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgaWYgKGkpCi0JICAgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCB5KTsJLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgd2l0aG91dCBlcnJvciAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9DUFVyZWFkOgotCSAgLyogUmVhZCBDUFUgU3RhdGUgKi8KLQkgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sICZjKTsJLyogbW9kZSAqLwotCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwkvKiBtYXNrICovCi0JICBwID0gKGNoYXIgKikgbWFsbG9jICg0ICogUkRJTnVtQ1BVUmVncyk7Ci0JICBpID0gYXJtdWxfcmRpLkNQVXJlYWQgKGMsIHgsIChBUk13b3JkICopIHApOwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOwotCSAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyKQotCSAgICBpZiAoayAmIHgpCi0JICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sICgoQVJNd29yZCAqKSBwKVtqKytdKTsKLQkgIGZyZWUgKHApOwotCSAgaWYgKGkpCi0JICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9DUFV3cml0ZToKLQkgIC8qIFdyaXRlIENQVSBTdGF0ZSAqLwotCSAgTVlyZWFkX2NoYXIgKG11bWtpZFswXSwgJmMpOwkvKiBtb2RlICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7CS8qIG1hc2sgKi8KLQotCSAgcCA9IChjaGFyICopIG1hbGxvYyAoNCAqIFJESU51bUNQVVJlZ3MpOwotCSAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyKQotCSAgICBpZiAoayAmIHgpCi0JICAgICAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJigoKEFSTXdvcmQgKikgcClbaisrXSkpOwotCSAgaSA9IGFybXVsX3JkaS5DUFV3cml0ZSAoYywgeCwgKEFSTXdvcmQgKikgcCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgZnJlZSAocCk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX0NQcmVhZDoKLQkgIC8qIFJlYWQgQ28tUHJvY2Vzc29yIFN0YXRlICovCi0JICBNWXJlYWRfY2hhciAobXVta2lkWzBdLCAmYyk7CS8qIENQbnVtICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7CS8qIG1hc2sgKi8KLQkgIHAgPSBxID0gKGNoYXIgKikgbWFsbG9jICgxNiAqIFJESU51bUNQUmVncyk7Ci0JICBpID0gYXJtdWxfcmRpLkNQcmVhZCAoYywgeCwgKEFSTXdvcmQgKikgcCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBmb3IgKGsgPSAxLCBqID0gMDsgayAhPSAweDgwMDAwMDAwOyBrICo9IDIsIGorKykKLQkgICAgaWYgKGsgJiB4KQotCSAgICAgIHsKLQkJaWYgKChjID09IDEgfHwgYyA9PSAyKSAmJiBrIDw9IDEyOCkKLQkJICB7Ci0JCSAgICBNWXdyaXRlX0ZQd29yZCAoa2lkbXVtWzFdLCBxKTsKLQkJICAgIHEgKz0gMTY7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sICpxKTsKLQkJICAgIHEgKz0gNDsKLQkJICB9Ci0JICAgICAgfQotCSAgZnJlZSAocCk7Ci0JICBpZiAoaSkKLQkgICAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBqKTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX0NQd3JpdGU6Ci0JICAvKiBXcml0ZSBDby1Qcm9jZXNzb3IgU3RhdGUgKi8KLQkgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sICZjKTsJLyogQ1BudW0gKi8KLQkgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sICZ4KTsJLyogbWFzayAqLwotCSAgcCA9IHEgPSAoY2hhciAqKSBtYWxsb2MgKDE2ICogUkRJTnVtQ1BVUmVncyk7Ci0JICBmb3IgKGsgPSAxLCBqID0gMDsgayAhPSAweDgwMDAwMDAwOyBrICo9IDIsIGorKykKLQkgICAgaWYgKGsgJiB4KQotCSAgICAgIHsKLQkJaWYgKChjID09IDEgfHwgYyA9PSAyKSAmJiBrIDw9IDEyOCkKLQkJICB7Ci0JCSAgICBNWXJlYWRfRlB3b3JkIChraWRtdW1bMV0sIHEpOwotCQkgICAgcSArPSAxNjsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAoQVJNd29yZCAqKSBxKTsKLQkJICAgIHEgKz0gNDsKLQkJICB9Ci0JICAgICAgfQotCSAgaSA9IGFybXVsX3JkaS5DUHdyaXRlIChjLCB4LCAoQVJNd29yZCAqKSBwKTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICBmcmVlIChwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRFBfU2V0QnJlYWs6Ci0JICAvKiBTZXQgQnJlYWtwb2ludCAqLwotCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwkvKiBhZGRyZXNzICovCi0JICBNWXJlYWRfY2hhciAobXVta2lkWzBdLCAmYyk7CS8qIHR5cGUgKi8KLQkgIGlmICgoYyAmIDB4ZikgPj0gNSkKLQkgICAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJnkpOwkvKiBib3VuZCAqLwotCSAgaSA9IGFybXVsX3JkaS5zZXRicmVhayAoeCwgYywgeSwgJnBvaW50KTsKLQkgIGlmICghTVlyZHBfbGV2ZWwpCi0JICAgIEJBR19wdXRwYWlyICgobG9uZykgeCwgKGxvbmcpIHBvaW50KTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgIGlmIChNWXJkcF9sZXZlbCkKLQkgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHBvaW50KTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX0NsZWFyQnJlYWs6Ci0JICAvKiBDbGVhciBCcmVha3BvaW50ICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmcG9pbnQpOwkvKiBQb2ludEhhbmRsZSAqLwotCSAgaWYgKCFNWXJkcF9sZXZlbCkKLQkgICAgewotCSAgICAgIEJBR19nZXRzZWNvbmQgKChsb25nKSBwb2ludCwgJm91dG9mdGhlYmFnKTsJLyogc3dhcCBwb2ludGhhbmRsZSBmb3IgYWRkcmVzcyAqLwotCSAgICAgIEJBR19raWxscGFpcl9ieWZpcnN0IChvdXRvZnRoZWJhZyk7Ci0JICAgICAgcG9pbnQgPSBvdXRvZnRoZWJhZzsKLQkgICAgfQotCSAgaSA9IGFybXVsX3JkaS5jbGVhcmJyZWFrIChwb2ludCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9TZXRXYXRjaDoKLQkgIC8qIFNldCBXYXRjaHBvaW50ICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7CS8qIGFkZHJlc3MgKi8KLQkgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sICZjKTsJLyogdHlwZSAqLwotCSAgTVlyZWFkX2NoYXIgKG11bWtpZFswXSwgJmQpOwkvKiBkYXRhdHlwZSAqLwotCSAgaWYgKChjICYgMHhmKSA+PSA1KQotCSAgICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeSk7CS8qIGJvdW5kICovCi0JICBpID0gYXJtdWxfcmRpLnNldHdhdGNoICh4LCBjLCBkLCB5LCAmcG9pbnQpOwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOwotCSAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHBvaW50KTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX0NsZWFyV2F0Y2g6Ci0JICAvKiBDbGVhciBXYXRjaHBvaW50ICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmcG9pbnQpOwkvKiBQb2ludEhhbmRsZSAqLwotCSAgaSA9IGFybXVsX3JkaS5jbGVhcndhdGNoIChwb2ludCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9FeGVjdXRlOgotCSAgLyogRXhjZWN1dGUgKi8KLQotCSAgTVlyZWFkX2NoYXIgKG11bWtpZFswXSwgJmMpOwkvKiByZXR1cm4gKi8KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJTdGFydGluZyBleGVjdXRpb25cbiIpOwotI2VuZGlmCi0JICBpID0gYXJtdWxfcmRpLmV4ZWN1dGUgKCZwb2ludCk7Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIkNvbXBsZXRlZCBleGVjdXRpb25cbiIpOwotI2VuZGlmCi0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBpZiAoYyAmIDB4ODApCi0JICAgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCBwb2ludCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9TdGVwOgotCSAgLyogU3RlcCAqLwotCSAgTVlyZWFkX2NoYXIgKG11bWtpZFswXSwgJmMpOwkvKiByZXR1cm4gKi8KLQkgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sICZ4KTsJLyogbmluc3RyICovCi0JICBwb2ludCA9IDB4ODc2NTQzMjE7Ci0JICBpID0gYXJtdWxfcmRpLnN0ZXAgKHgsICZwb2ludCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBpZiAoYyAmIDB4ODApCi0JICAgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCBwb2ludCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9JbmZvOgotCSAgLyogSW5mbyAqLwotCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwotCSAgc3dpdGNoICh4KQotCSAgICB7Ci0JICAgIGNhc2UgUkRJSW5mb19UYXJnZXQ6Ci0JICAgICAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElJbmZvX1RhcmdldCwgJnksICZ6KTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHkpOwkvKiBMb2FkcyBvZiBpbmZvLi4uICovCi0JICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHopOwkvKiBNb2RlbCAqLwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRElTZXRfUkRJTGV2ZWw6Ci0JICAgICAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwkvKiBhcmcxLCBkZWJ1ZyBsZXZlbCAqLwotCSAgICAgIGkgPSBhcm11bF9yZGkuaW5mbyAoUkRJU2V0X1JESUxldmVsLCAmeCwgMCk7Ci0JICAgICAgaWYgKGkgPT0gUkRJRXJyb3JfTm9FcnJvcikKLQkJTVlyZHBfbGV2ZWwgPSB4OwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRJU2V0X0NtZGxpbmU6Ci0JICAgICAgZm9yIChwID0gY29tbWFuZF9saW5lOyBNWXJlYWRfY2hhciAobXVta2lkWzBdLCBwKSwgKnA7IHArKykKLQkJOwkJLyogU3RyaW5nICovCi0JICAgICAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElTZXRfQ21kbGluZSwKLQkJCQkgICh1bnNpZ25lZCBsb25nICopIGNvbW1hbmRfbGluZSwgMCk7Ci0JICAgICAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRElJbmZvX1N0ZXA6Ci0JICAgICAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElJbmZvX1N0ZXAsICZ4LCAwKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHgpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRElWZWN0b3JfQ2F0Y2g6Ci0JICAgICAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwotCSAgICAgIGkgPSBhcm11bF9yZGkuaW5mbyAoUkRJVmVjdG9yX0NhdGNoLCAmeCwgMCk7Ci0JICAgICAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJESUluZm9fUG9pbnRzOgotCSAgICAgIGkgPSBhcm11bF9yZGkuaW5mbyAoUkRJSW5mb19Qb2ludHMsICZ4LCAwKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICAgICAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHgpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbnN1cHBvcnRlZCBpbmZvIGNvZGUgJWRcbiIsIHgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX09TT3BSZXBseToKLQkgIC8qIE9TIE9wZXJhdGlvbiBSZXBseSAqLwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9GYXRhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgUkRQX1Jlc2V0OgotCSAgLyogUmVzZXQgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKQotCSAgICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1Jlc2V0KTsKLQkgIHAgPSAoY2hhciAqKSBtYWxsb2MgKE1BWEhPU1ROQU1FTEVOR1RIICsgNSArIDIwKTsKLQkgIHNwcmludGYgKHAsICJSdW5uaW5nIG9uICVzOiVkXG4iLCBsb2NhbGhvc3QsIHNvY2tldG51bWJlcik7Ci0JICBNWXdyaXRlX3N0cmluZyAoa2lkbXVtWzFdLCBwKTsKLQkgIGZyZWUgKHApOwotCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZnByaW50ZiAoc3RkZXJyLCAiT2ggZGVhcjogU29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyA6LShcbiIpOwotCSAgLyogSG1tLi4gYmFkIFJEUCBvcGVyYXRpb24gKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotLyogSGFuZGxlcyBtZW1vcnkgcmVhZCBvcGVyYXRpb25zIHVudGlsIGFuIE9TIE9wZXJhdGlvbiBSZXBseSBNZXNzYWdlIGlzICovCi0vKiBlbmNvdW50ZXJkLiBJdCB0aGVuIHJldHVybnMgdGhlIGJ5dGUgaW5mbyB2YWx1ZSAoMCwgMSwgb3IgMikgYW5kIGZpbGxzICAqLwotLyogaW4gJ3B1dGlucjAnIHdpdGggdGhlIGRhdGEgaWYgYXBwcm9wcmlhdGUuICovCi1pbnQKLXdhaXRfZm9yX29zcmVwbHkgKEFSTXdvcmQgKiByZXBseSkKLXsKLSAgY2hhciAqcCwgKnE7Ci0gIGludCBpLCBqLCBrOwotICB1bnNpZ25lZCBjaGFyIGMsIGQsIG1lc3NhZ2U7Ci0gIEFSTXdvcmQgeCwgeSwgejsKLSAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247Ci0gIFBvaW50SGFuZGxlIHBvaW50OwotICBEYmdfQ29uZmlnQmxvY2sgY29uZmlnOwotICBEYmdfSG9zdG9zSW50ZXJmYWNlIGhvc3RpZjsKLSAgc3RydWN0IERiZ19NQ1N0YXRlICpNQ1N0YXRlOwotICBjaGFyIGNvbW1hbmRfbGluZVsyNTZdOwotICBzdHJ1Y3QgZmRfc2V0IHJlYWRmZHM7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJ3YWl0X2Zvcl9vc3JlcGx5ICgpLlxuIik7Ci0jZW5kaWYKLQotICAvKiBTZXR1cCBhIHNpZ25hbCBoYW5kbGVyIGZvciBTSUdVU1IxICovCi0gIGFjdGlvbi5zYV9oYW5kbGVyID0ga2lkX2hhbmRsZXNpZ25hbDsKLSAgYWN0aW9uLnNhX21hc2sgPSAwOwotICBhY3Rpb24uc2FfZmxhZ3MgPSAwOwotCi0gIHNpZ2FjdGlvbiAoU0lHVVNSMSwgJmFjdGlvbiwgKHN0cnVjdCBzaWdhY3Rpb24gKikgMCk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogV2FpdCBmb3IgZXZlciAqLwotICAgICAgRkRfWkVSTyAoJnJlYWRmZHMpOwotICAgICAgRkRfU0VUIChtdW1raWRbMF0sICZyZWFkZmRzKTsKLQotICAgICAgaSA9IHNlbGVjdCAobmZkcywgJnJlYWRmZHMsCi0JCSAgKGZkX3NldCAqKSAwLCAoZmRfc2V0ICopIDAsIChzdHJ1Y3QgdGltZXZhbCAqKSAwKTsKLQotICAgICAgaWYgKGkgPCAwKQotCXsKLQkgIHBlcnJvciAoInNlbGVjdCIpOwotCX0KLQotICAgICAgaWYgKHJlYWQgKG11bWtpZFswXSwgJm1lc3NhZ2UsIDEpIDwgMSkKLQl7Ci0JICBwZXJyb3IgKCJyZWFkIik7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0JewotCWNhc2UgUkRQX1JlYWQ6Ci0JICAvKiBSZWFkIE1lbW9yeSBBZGRyZXNzICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7CS8qIGFkZHJlc3MgKi8KLQkgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sICZ5KTsJLyogbmJ5dGVzICovCi0JICBwID0gKGNoYXIgKikgbWFsbG9jICh5KTsKLQkgIGkgPSBhcm11bF9yZGkucmVhZCAoeCwgcCwgKHVuc2lnbmVkICopICZ5KTsKLQkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKLQkgIGZvciAoayA9IDA7IGsgPCB5OyBrKyspCi0JICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBwW2tdKTsKLQkgIGZyZWUgKHApOwotCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKLQkgIGlmIChpKQotCSAgICBNWXdyaXRlX3dvcmQgKGtpZG11bVsxXSwgeSk7CS8qIG51bWJlciBvZiBieXRlcyBzZW50IHdpdGhvdXQgZXJyb3IgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBSRFBfV3JpdGU6Ci0JICAvKiBXcml0ZSBNZW1vcnkgQWRkcmVzcyAqLwotCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOwkvKiBhZGRyZXNzICovCi0JICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeSk7CS8qIG5ieXRlcyAqLwotCSAgcCA9IChjaGFyICopIG1hbGxvYyAoeSk7Ci0JICBmb3IgKGsgPSAwOyBrIDwgeTsgaysrKQotCSAgICBNWXJlYWRfY2hhciAobXVta2lkWzBdLCAmcFtrXSk7Ci0JICBpID0gYXJtdWxfcmRpLndyaXRlIChwLCB4LCAodW5zaWduZWQgKikgJnkpOwotCSAgZnJlZSAocCk7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX1JldHVybik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOwotCSAgaWYgKGkpCi0JICAgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCB5KTsJLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgd2l0aG91dCBlcnJvciAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIFJEUF9PU09wUmVwbHk6Ci0JICAvKiBPUyBPcGVyYXRpb24gUmVwbHkgKi8KLQkgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sICZjKTsKLQkgIGlmIChjID09IDEpCi0JICAgIE1ZcmVhZF9jaGFyIChtdW1raWRbMF0sIChjaGFyICopIHJlcGx5KTsKLQkgIGlmIChjID09IDIpCi0JICAgIE1ZcmVhZF93b3JkIChtdW1raWRbMF0sIHJlcGx5KTsKLQkgIHJldHVybiBjOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiSEVMUCEgVW5hY2NvdW50ZWQtZm9yIG1lc3NhZ2UgZHVyaW5nIE9TIHJlcXVlc3QuIFxuIik7Ci0JICBNWXdyaXRlX2NoYXIgKGtpZG11bVsxXSwgUkRQX0ZhdGFsKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9tYWluLmMgYi9zaW0vYXJtL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5OTI5MC4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKiAgbWFpbi5jIC0tIHRvcCBsZXZlbCBvZiBBUk11bGF0b3I6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRm9ya3MgdGhlIEFSTXVsYXRvciBhbmQgaGFuZ3Mgb24gYSBzb2NrZXQgcGFzc2luZyBvbiBSRFAgbWVzc2FnZXMgICovCi0vKiBkb3duIGEgcGlwZSB0byB0aGUgQVJNdWxhdG9yIHdoaWNoIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIFJESSBjYWxscy4gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJhcm1kZWZzLmgiCi0jaW5jbHVkZSAiZGJnX3JkaS5oIgotI2luY2x1ZGUgImRiZ19jb25mLmgiCi0KLSNkZWZpbmUgTUFYSE9TVE5BTUVMRU5HVEggNjQKLQotLyogUmVhZCBhbmQgd3JpdGUgcm91dGluZXMgZG93biBzb2NrZXRzIGFuZCBwaXBlcyAqLwotCi12b2lkIE1ZcmVhZF9jaGFycyAoaW50IHNvY2ssIHZvaWQgKnAsIGludCBuKTsKLXVuc2lnbmVkIGNoYXIgTVlyZWFkX2NoYXIgKGludCBzb2NrKTsKLUFSTXdvcmQgTVlyZWFkX3dvcmQgKGludCBzb2NrKTsKLXZvaWQgTVlyZWFkX0ZQd29yZCAoaW50IHNvY2ssIGNoYXIgKnB1dGluaGVyZSk7Ci0KLXZvaWQgTVl3cml0ZV93b3JkIChpbnQgc29jaywgQVJNd29yZCBpKTsKLXZvaWQgTVl3cml0ZV9zdHJpbmcgKGludCBzb2NrLCBjaGFyICpzKTsKLXZvaWQgTVl3cml0ZV9GUHdvcmQgKGludCBzb2NrLCBjaGFyICpmcm9taGVyZSk7Ci12b2lkIE1Zd3JpdGVfY2hhciAoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgYyk7Ci0KLXZvaWQgcGFzc29uIChpbnQgc291cmNlLCBpbnQgZGVzdCwgaW50IG4pOwotCi0KLS8qIE1vdGhlciBhbmQgY2hpbGQgcHJvY2Vzc2VzICovCi12b2lkIHBhcmVudCAodm9pZCk7Ci12b2lkIGtpZCAodm9pZCk7Ci0KLS8qIFRoZSBjaGlsZCBwcm9jZXNzIGlkLiAqLwotcGlkX3QgY2hpbGQ7Ci0KLS8qIFRoZSBzb2NrZXQgdG8gdGhlIGRlYnVnZ2VyICovCi1pbnQgZGVidWdzb2NrOwotCi0vKiBUaGUgcGlwZXMgYmV0d2VlbiB0aGUgdHdvIHByb2Nlc3NlcyAqLwotaW50IG11bWtpZFsyXTsKLWludCBraWRtdW1bMl07Ci0KLS8qIEEgcGlwZSBmb3IgaGFuZGxpbmcgU1dJIHJldHVybiB2YWx1ZXMgdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gdGhlICovCi0vKiBwYXJlbnQgdG8gdGhlIEFSTXVsYXRvciBob3N0IGludGVyZmFjZSwgYnlwYXNzaW5nIHRoZSBjaGlsZHMgUkRQICovCi0vKiB0byBSREkgaW50ZXJwcmV0ZXIgKi8KLWludCBEZWJ1Z2dlckFSTXVsWzJdOwotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLwotaW50IG5mZHM7Ci0KLS8qIFRoZSBzb2NrZXQgaGFuZGxlICovCi1pbnQgc29ja2V0aGFuZGxlOwotCi0vKiBUaGUgbWFjaGluZSBuYW1lICovCi1jaGFyIGxvY2FsaG9zdFtNQVhIT1NUTkFNRUxFTkdUSCArIDFdOwotCi0vKiBUaGUgc29ja2V0IG51bWJlciAqLwotdW5zaWduZWQgaW50IHNvY2tldG51bWJlcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGFrZXMgb25lIGFyZ3VtZW50OiB0aGUgc29ja2V0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbnMgYSBzb2NrZXQgdG8gdGhlIGRlYnVnZ2VyLCBhbmQgb25jZSBvcGVuZWQgc3Bhd25zIHRoZSAqLwotLyogQVJNdWxhdG9yIGFuZCBzZXRzIHVwIGEgY291cGxlIG9mIHBpcGVzLiAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgaTsKLSAgc3RydWN0IHNvY2thZGRyX2luIGRldmlsLCBpc2E7Ci0gIHN0cnVjdCBob3N0ZW50ICpocDsKLQotCi0gIGlmIChhcmdjID09IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm8gc29ja2V0IG51bWJlclxuIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgc3NjYW5mIChhcmd2WzFdLCAiJWQiLCAmc29ja2V0bnVtYmVyKTsKLSAgaWYgKCFzb2NrZXRudW1iZXIgfHwgc29ja2V0bnVtYmVyID4gMHhmZmZmKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgc29ja2V0IG51bWJlcjogJWRcbiIsIHNvY2tldG51bWJlcik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgZ2V0aG9zdG5hbWUgKGxvY2FsaG9zdCwgTUFYSE9TVE5BTUVMRU5HVEgpOwotICBocCA9IGdldGhvc3RieW5hbWUgKGxvY2FsaG9zdCk7Ci0gIGlmICghaHApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2Fubm90IGdldCBsb2NhbCBob3N0IGluZm9cbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIE9wZW4gYSBzb2NrZXQgKi8KLSAgc29ja2V0aGFuZGxlID0gc29ja2V0IChocC0+aF9hZGRydHlwZSwgU09DS19TVFJFQU0sIDApOwotICBpZiAoc29ja2V0aGFuZGxlIDwgMCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJzb2NrZXQiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBkZXZpbC5zaW5fZmFtaWx5ID0gaHAtPmhfYWRkcnR5cGU7Ci0gIGRldmlsLnNpbl9wb3J0ID0gaHRvbnMgKHNvY2tldG51bWJlcik7Ci0gIGRldmlsLnNpbl9hZGRyLnNfYWRkciA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRldmlsLnNpbl96ZXJvKTsgaSsrKQotICAgIGRldmlsLnNpbl96ZXJvW2ldID0gJ1wwMDAnOwotICBtZW1jcHkgKCZkZXZpbC5zaW5fYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCBocC0+aF9sZW5ndGgpOwotCi0gIGlmIChiaW5kIChzb2NrZXRoYW5kbGUsICZkZXZpbCwgc2l6ZW9mIChkZXZpbCkpIDwgMCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJiaW5kIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogTWF5IG9ubHkgYWNjZXB0IG9uZSBkZWJ1Z2dlciBhdCBvbmNlICovCi0KLSAgaWYgKGxpc3RlbiAoc29ja2V0aGFuZGxlLCAwKSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJsaXN0ZW4iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBmcHJpbnRmIChzdGRlcnIsICJXYWl0aW5nIGZvciBjb25uZWN0aW9uIGZyb20gZGVidWdnZXIuLi4iKTsKLQotICBkZWJ1Z3NvY2sgPSBhY2NlcHQgKHNvY2tldGhhbmRsZSwgJmlzYSwgJmkpOwotICBpZiAoZGVidWdzb2NrIDwgMCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJhY2NlcHQiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBmcHJpbnRmIChzdGRlcnIsICIgZG9uZS5cbkNvbm5lY3Rpb24gRXN0YWJsaXNoZWQuXG4iKTsKLQotICBuZmRzID0gZ2V0ZHRhYmxlc2l6ZSAoKTsKLQotICBpZiAocGlwZSAobXVta2lkKSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJwaXBlIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChwaXBlIChraWRtdW0pKQotICAgIHsKLSAgICAgIHBlcnJvciAoInBpcGUiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAocGlwZSAoRGVidWdnZXJBUk11bCkpCi0gICAgewotICAgICAgcGVycm9yICgicGlwZSIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRlZCBwaXBlcyBva1xuIik7Ci0jZW5kaWYKLQotICBjaGlsZCA9IGZvcmsgKCk7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJmb3JrKCkgb2tcbiIpOwotI2VuZGlmCi0KLSAgaWYgKGNoaWxkID09IDApCi0gICAga2lkICgpOwotICBpZiAoY2hpbGQgIT0gLTEpCi0gICAgcGFyZW50ICgpOwotCi0gIHBlcnJvciAoImZvcmsiKTsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL3BhcmVudC5jIGIvc2ltL2FybS9wYXJlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0YWY4NC4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL3BhcmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qICBwYXJlbnQuYyAtLSBBUk11bGF0b3IgUkRQIGNvbW1zIGNvZGU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgotICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KLSAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBQYXJlbnQgcHJvY2VzcyBjb250aW51ZXMgaGVyZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IHdhaXRzIG9uIHRoZSBzb2NrZXQgYW5kIHBhc3NlcyBvbiBSRFAgbWVzc2FnZXMgZG93biBhIHBpcGUgKi8KLS8qIHRvIHRoZSBBUk11bGF0b3IgUkRQIHRvIFJESSBpbnRlcnByZXRlci4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAidGltZS5oIgotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJkYmdfcmRpLmgiCi0jaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKLQotLyogVGhlIHNvY2tldCB0byB0aGUgZGVidWdnZXIgKi8KLWV4dGVybiBpbnQgZGVidWdzb2NrOwotCi0vKiBUaGUgcGlwZXMgYmV0d2VlbiB0aGUgdHdvIHByb2Nlc3NlcyAqLwotZXh0ZXJuIGludCBtdW1raWRbMl07Ci1leHRlcm4gaW50IGtpZG11bVsyXTsKLQotLyogQSBwaXBlIGZvciBoYW5kbGluZyBTV0kgcmV0dXJuIHZhbHVlcyB0aGF0IGdvZXMgc3RyYWlnaHQgZnJvbSB0aGUgKi8KLS8qIHBhcmVudCB0byB0aGUgQVJNdWxhdG9yIGhvc3QgaW50ZXJmYWNlLCBieXBhc3NpbmcgdGhlIGNoaWxkJ3MgUkRQICovCi0vKiB0byBSREkgaW50ZXJwcmV0ZXIgKi8KLWV4dGVybiBpbnQgRGVidWdnZXJBUk11bFsyXTsKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KLWV4dGVybiBpbnQgbmZkczsKLQotLyogVGhlIGNoaWxkIHByb2Nlc3MgaWQuICovCi1leHRlcm4gcGlkX3QgY2hpbGQ7Ci0KLXZvaWQKLXBhcmVudCAoKQotewotICBpbnQgaSwgaiwgazsKLSAgdW5zaWduZWQgY2hhciBtZXNzYWdlLCBDUG51bSwgZXhyZXR1cm47Ci0gIEFSTXdvcmQgbWFzaywgbmJ5dGVzLCBtZXNzYWdldHlwZTsKLSAgdW5zaWduZWQgY2hhciBjLCBkOwotICBBUk13b3JkIHgsIHk7Ci0gIGludCB2aXJnaW4gPSAxOwotICBzdHJ1Y3QgZmRfc2V0IHJlYWRmZHM7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwYXJlbnQgKCkuLi5cbiIpOwotI2VuZGlmCi0KLXBhbmljX2Vycm9yOgotCi0gIGlmICghdmlyZ2luKQotICAgIHsKLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQXJnaGghIFdoYXQgaXMgZ29pbmcgb24/XG4iKTsKLSNlbmRpZgotICAgICAga2lsbCAoY2hpbGQsIFNJR0hVUCk7Ci0gICAgICBNWXdyaXRlX2NoYXIgKGRlYnVnc29jaywgUkRQX1Jlc2V0KTsKLSAgICB9Ci0KLSAgdmlyZ2luID0gMDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0KLSAgICAgIC8qIFdhaXQgZWl0aGVyIGZvciB0aGUgQVJNdWxhdG9yIG9yIHRoZSBkZWJ1Z2dlciAqLwotCi0gICAgICBGRF9aRVJPICgmcmVhZGZkcyk7Ci0gICAgICBGRF9TRVQgKGtpZG11bVswXSwgJnJlYWRmZHMpOwkvKiBXYWl0IGZvciBtZXNzYWdlcyBmcm9tIEFSTXVsYXRvciAqLwotICAgICAgRkRfU0VUIChkZWJ1Z3NvY2ssICZyZWFkZmRzKTsJLyogV2FpdCBmb3IgbWVzc2FnZXMgZnJvbSBkZWJ1Z2dlciAqLwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhaXRpbmcgZm9yIEFSTXVsYXRvciBvciBkZWJ1Z2dlci4uLiAiKTsKLSNlbmRpZgotCi0gICAgICB3aGlsZSAoKGkgPSBzZWxlY3QgKG5mZHMsICZyZWFkZmRzLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgMCkpIDwgMCkKLQl7Ci0JICBwZXJyb3IgKCJzZWxlY3QiKTsKLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKCVkLzIpIiwgaSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKEZEX0lTU0VUIChkZWJ1Z3NvY2ssICZyZWFkZmRzKSkKLQl7Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIi0+ZGVidWdnZXJcbiIpOwotI2VuZGlmCi0KLQkgIC8qIEluc2lkZSB0aGlzIHJhdGhlciBsYXJnZSBpZiBzdGF0ZW1lbnQgd2l0aCBzaW1wbHkgcGFzcyBvbiBhIGNvbXBsZXRlIAotCSAgICAgbWVzc2FnZSB0byB0aGUgQVJNdWxhdG9yLiAgVGhlIHJlYXNvbiB3ZSBuZWVkIHRvIHBhc3MgbWVzc2FnZXMgb24gb25lCi0JICAgICBhdCBhIHRpbWUgaXMgdGhhdCB3ZSBoYXZlIHRvIGtub3cgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBPU09wUmVwbHkKLQkgICAgIG9yIGFuIGluZm8oc3RvcCksIHNvIHRoYXQgd2UgY2FuIHRha2UgZGlmZmVyZW50IGFjdGlvbiBpbiB0aG9zZQotCSAgICAgY2FzZXMuICovCi0KLQkgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmbWVzc2FnZSkpCi0JICAgIGdvdG8gcGFuaWNfZXJyb3I7Ci0KLQkgIHN3aXRjaCAobWVzc2FnZSkKLQkgICAgewotCSAgICBjYXNlIFJEUF9TdGFydDoKLQkgICAgICAvKiBPcGVuIGFuZC9vciBJbml0aWFsaXNlICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgT3BlblxuIik7Ci0jZW5kaWYKLQkgICAgICBpZiAoTVlyZWFkX2NoYXIgKGRlYnVnc29jaywgJmMpKQkvKiB0eXBlICovCi0JCWdvdG8gcGFuaWNfZXJyb3I7Ci0KLQkgICAgICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJngpKQkvKiBtZW1vcnkgc2l6ZSAqLwotCQlnb3RvIHBhbmljX2Vycm9yOwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKLQkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgeCk7Ci0JICAgICAgaWYgKGMgJiAweDIpCi0JCXsKLQkJICBwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCAxKTsJLyogc3BlZWQgKi8KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX0VuZDoKLQkgICAgICAvKiBDbG9zZSBhbmQgRmluYWxpc2UgKi8KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBDbG9zZVxuIik7Ci0jZW5kaWYKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfUmVhZDoKLQkgICAgICAvKiBSZWFkIE1lbW9yeSBBZGRyZXNzICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgUmVhZCBNZW1vcnlcbiIpOwotI2VuZGlmCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIGlmIChwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCA0KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogYWRkcmVzcyAqLwotCSAgICAgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmbmJ5dGVzKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogbmJ5dGVzICovCi0JICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIG5ieXRlcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfV3JpdGU6Ci0JICAgICAgLyogV3JpdGUgTWVtb3J5IEFkZHJlc3MgKi8KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBXcml0ZSBNZW1vcnlcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ4KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogYWRkcmVzcyAqLwotCi0JICAgICAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ5KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogbmJ5dGVzICovCi0KLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7Ci0JICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOwotCSAgICAgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCB5KTsKLQkgICAgICBwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCB5KTsJLyogYWN0dWFsIGRhdGEgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJEUF9DUFVyZWFkOgotCSAgICAgIC8qIFJlYWQgQ1BVIFN0YXRlICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgUmVhZCBDUFVcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogbW9kZSAqLwotCi0JICAgICAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZtYXNrKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogbWFzayAqLwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKLQkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWFzayk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfQ1BVd3JpdGU6Ci0JICAgICAgLyogV3JpdGUgQ1BVIFN0YXRlICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgV3JpdGUgQ1BVXG4iKTsKLSNlbmRpZgotCSAgICAgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmYykpCi0JCWdvdG8gcGFuaWNfZXJyb3I7CS8qIG1vZGUgKi8KLQotCSAgICAgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmeCkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7CS8qIG1hc2sgKi8KLQotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgYyk7Ci0JICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOwotCSAgICAgIGZvciAoayA9IDEsIGogPSAwOyBrICE9IDB4ODAwMDAwMDA7IGsgKj0gMiwgaisrKQotCQlpZiAoKGsgJiB4KSAmJiBwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCA0KSkKLQkJICBnb3RvIHBhbmljX2Vycm9yOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX0NQcmVhZDoKLQkgICAgICAvKiBSZWFkIENvLVByb2Nlc3NvciBTdGF0ZSAqLwotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIFJlYWQgQ1Agc3RhdGVcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZDUG51bSkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7Ci0KLQkgICAgICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJm1hc2spKQotCQlnb3RvIHBhbmljX2Vycm9yOwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBDUG51bSk7Ci0JICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIG1hc2spOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX0NQd3JpdGU6Ci0JICAgICAgLyogV3JpdGUgQ28tUHJvY2Vzc29yIFN0YXRlICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgV3JpdGUgQ1Agc3RhdGVcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZDUG51bSkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7Ci0KLQkgICAgICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJm1hc2spKQotCQlnb3RvIHBhbmljX2Vycm9yOwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgeCk7Ci0JICAgICAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyLCBqKyspCi0JCWlmIChrICYgeCkKLQkJICB7Ci0JCSAgICBpZiAoKGMgPT0gMSB8fCBjID09IDIpICYmIGsgPD0gMTI4KQotCQkgICAgICB7Ci0JCQkvKiBGUCByZWdpc3RlciA9IDEyIGJ5dGVzICsgNCBieXRlcyBmb3JtYXQgKi8KLQkJCWlmIChwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCAxNikpCi0JCQkgIGdvdG8gcGFuaWNfZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogTm9ybWFsIHJlZ2lzdGVyID0gNCBieXRlcyAqLwotCQkJaWYgKHBhc3NvbiAoZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQotCQkJICBnb3RvIHBhbmljX2Vycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX1NldEJyZWFrOgotCSAgICAgIC8qIFNldCBCcmVha3BvaW50ICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgU2V0IEJyZWFrcG9pbnRcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ4KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogYWRkcmVzcyAqLwotCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogdHlwZSAqLwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCB4KTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgYyk7Ci0JICAgICAgaWYgKCgoYyAmIDB4ZikgPj0gNSkgJiYgcGFzc29uIChkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgNCkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7CS8qIGJvdW5kICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfQ2xlYXJCcmVhazoKLQkgICAgICAvKiBDbGVhciBCcmVha3BvaW50ICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgQ2xlYXIgQnJlYWtwb2ludFxuIik7Ci0jZW5kaWYKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7Ci0JICAgICAgaWYgKHBhc3NvbiAoZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQotCQlnb3RvIHBhbmljX2Vycm9yOwkvKiBwb2ludCAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX1NldFdhdGNoOgotCSAgICAgIC8qIFNldCBXYXRjaHBvaW50ICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgU2V0IFdhdGNocG9pbnRcbiIpOwotI2VuZGlmCi0JICAgICAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ4KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogYWRkcmVzcyAqLwotCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogdHlwZSAqLwotCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZkKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogZGF0YXR5cGUgKi8KLQotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgeCk7Ci0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGMpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBkKTsKLQkgICAgICBpZiAoKChjICYgMHhmKSA+PSA1KSAmJiBwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCA0KSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogYm91bmQgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJEUF9DbGVhcldhdGNoOgotCSAgICAgIC8qIENsZWFyIFdhdGNocG9pbnQgKi8KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBDbGVhciBXYXRjaHBvaW50XG4iKTsKLSNlbmRpZgotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkgICAgICBpZiAocGFzc29uIChkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgNCkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7CS8qIHBvaW50ICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfRXhlY3V0ZToKLQkgICAgICAvKiBFeGNlY3V0ZSAqLwotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIEV4ZWN1dGVcbiIpOwotI2VuZGlmCi0KLQkgICAgICAvKiBMRUFWRSBUSElTIE9ORSAnVElMIExBVEVSLi4uICovCi0JICAgICAgLyogTkVFRCBUTyBXT1JLIFRISU5HUyBPVVQgKi8KLQotCSAgICAgIC8qIE5PIEFTQ1lOQ0hST1VTIFJVTk5JTkcgKi8KLQotCSAgICAgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmYykpCi0JCWdvdG8gcGFuaWNfZXJyb3I7CS8qIHJldHVybiAqLwotCi0JICAgICAgLyogUmVtZW1iZXIgaW5jYXNlIGJpdCA3IGlzIHNldCBhbmQgd2UgaGF2ZSB0byBzZW5kIGJhY2sgYSB3b3JkICovCi0JICAgICAgZXhyZXR1cm4gPSBjOwotCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJEUF9TdGVwOgotCSAgICAgIC8qIFN0ZXAgKi8KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBTdGVwXG4iKTsKLSNlbmRpZgotCi0JICAgICAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogcmV0dXJuICovCi0KLQkgICAgICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJngpKQotCQlnb3RvIHBhbmljX2Vycm9yOwkvKiBuaW5zdHIgKi8KLQotCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgYyk7Ci0JICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUkRQX0luZm86Ci0JICAgICAgLyogSW5mbyAqLwotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIEluZm9cbiIpOwotI2VuZGlmCi0JICAgICAgLyogSU5GTyBUQVJHRVQsIFNFVCBSREkgTEVWRUwgKi8KLQkgICAgICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJm1lc3NhZ2V0eXBlKSkKLQkJZ290byBwYW5pY19lcnJvcjsJLyogaW5mbyAqLwotCi0JICAgICAgc3dpdGNoIChtZXNzYWdldHlwZSkKLQkJewotCQljYXNlIFJESUluZm9fVGFyZ2V0OgotCQkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkJICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUkRJU2V0X1JESUxldmVsOgotCQkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkJICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOwotCQkgIGlmIChwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCAxKSkKLQkJICAgIGdvdG8gcGFuaWNfZXJyb3I7CS8qIGFyZ3VtZW50ICovCi0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSRElTZXRfQ21kbGluZToKLQkJICAvKiBHb3QgdG8gcGFzcyBvbiBhIHN0cmluZyBhcmd1bWVudCAqLwotCQkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkJICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmYykpCi0JCQlnb3RvIHBhbmljX2Vycm9yOwotCi0JCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKLQkJICAgIH0KLQkJICB3aGlsZSAoYyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSRElTaWduYWxfU3RvcDoKLQkJICBraWxsIChjaGlsZCwgU0lHVVNSMSk7Ci0JCSAgTVl3cml0ZV9jaGFyIChkZWJ1Z3NvY2ssIFJEUF9SZXR1cm4pOwotCQkgIE1Zd3JpdGVfY2hhciAoZGVidWdzb2NrLCBSRElFcnJvcl9Vc2VySW50ZXJydXB0KTsKLQkJICBicmVhazsKLQotCQljYXNlIFJESVZlY3Rvcl9DYXRjaDoKLQkJICBNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmeCk7Ci0JCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCQkgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCBtZXNzYWdldHlwZSk7Ci0JCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUkRJSW5mb19TdGVwOgotCQkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKLQkJICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUkRJSW5mb19Qb2ludHM6Ci0JCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCQkgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCBtZXNzYWdldHlwZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmIChzdGRlcnIsICJVbnJlY29nbml6ZWQgUkRJSW5mbyByZXF1ZXN0ICVkXG4iLAotCQkJICAgbWVzc2FnZXR5cGUpOwotCQkgIGdvdG8gcGFuaWNfZXJyb3I7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJEUF9PU09wUmVwbHk6Ci0JICAgICAgLyogT1MgT3BlcmF0aW9uIFJlcGx5ICovCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJSRFAgT1MgUmVwbHlcbiIpOwotI2VuZGlmCi0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmbWVzc2FnZSkpCi0JCWdvdG8gcGFuaWNfZXJyb3I7Ci0JICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOwotCSAgICAgIHN3aXRjaCAobWVzc2FnZSkKLQkJewotCQljYXNlIDA6CS8qIHJldHVybiB2YWx1ZSBpLmUuIG5vdGhpbmcgZWxzZS4gKi8KLQkJICBicmVhazsKLQotCQljYXNlIDE6CS8qIHJldHVybnMgYSBieXRlLi4uICovCi0JCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKLQkJICAgIGdvdG8gcGFuaWNfZXJyb3I7Ci0KLQkJICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgYyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAyOgkvKiByZXR1cm5zIGEgd29yZC4uLiAqLwotCQkgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmeCkpCi0JCSAgICBnb3RvIHBhbmljX2Vycm9yOwotCi0JCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSRFBfUmVzZXQ6Ci0JICAgICAgLyogUmVzZXQgKi8KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBSZXNldFxuIik7Ci0jZW5kaWYKLQkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBIbW0uLiBiYWQgUkRQIG9wZXJhdGlvbiAqLwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBCYWQgUkRQIHJlcXVlc3QgKCVkKVxuIiwgbWVzc2FnZSk7Ci0JICAgICAgTVl3cml0ZV9jaGFyIChkZWJ1Z3NvY2ssIFJEUF9SZXR1cm4pOwotCSAgICAgIE1Zd3JpdGVfY2hhciAoZGVidWdzb2NrLCBSRElFcnJvcl9VbmltcGxlbWVudGVkTWVzc2FnZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChGRF9JU1NFVCAoa2lkbXVtWzBdLCAmcmVhZGZkcykpCi0JewotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICItPkFSTXVsYXRvclxuIik7Ci0jZW5kaWYKLQkgIC8qIEFueXRoaW5nIHdlIGdldCBmcm9tIHRoZSBBUk11bGF0b3IgaGFzIHRvIGdvIHRvIHRoZSBkZWJ1Z2dlci4uLiAqLwotCSAgLyogSXQgaXMgdGhhdCBzaW1wbGUhICovCi0KLQkgIHBhc3NvbiAoa2lkbXVtWzBdLCBkZWJ1Z3NvY2ssIDEpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vYXJtL3Rjb25maWcuaW4gYi9zaW0vYXJtL3Rjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjcwMmQuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS90Y29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogQVJNIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KLSAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgotICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLwotLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgdGFyZ2V0IGNwdSBpcyBiaS1lbmRpYW4KLSAgIGFuZCB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIGl0LiAgKi8KLSNkZWZpbmUgU0lNX0hBVkVfQklFTkRJQU4KZGlmZiAtLWdpdCBhL3NpbS9hcm0vdGh1bWJlbXUuYyBiL3NpbS9hcm0vdGh1bWJlbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5MGRkNy4uMDAwMDAwMAotLS0gYS9zaW0vYXJtL3RodW1iZW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyogIHRodW1iZW11LmMgLS0gVGh1bWIgaW5zdHJ1Y3Rpb24gZW11bGF0aW9uLgotICAgIENvcHlyaWdodCAoQykgMTk5NiwgQ3lnbnVzIFNvZnR3YXJlIFRlY2hub2xvZ2llcyBMdGQuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFdlIGNhbiBwcm92aWRlIHNpbXBsZSBUaHVtYiBzaW11bGF0aW9uIGJ5IGRlY29kaW5nIHRoZSBUaHVtYgotaW5zdHJ1Y3Rpb24gaW50byBpdHMgY29ycmVzcG9uZGluZyBBUk0gaW5zdHJ1Y3Rpb24sIGFuZCB1c2luZyB0aGUKLWV4aXN0aW5nIEFSTSBzaW11bGF0b3IuICAqLwotCi0jaWZuZGVmIE1PREVUCQkJLyogcmVxdWlyZWQgZm9yIHRoZSBUaHVtYiBpbnN0cnVjdGlvbiBzdXBwb3J0ICovCi0jaWYgMQotI2Vycm9yICJNT0RFVCBuZWVkcyB0byBiZSBkZWZpbmVkIGZvciB0aGUgVGh1bWIgd29ybGQgdG8gd29yayIKLSNlbHNlCi0jZGVmaW5lIE1PREVUICgxKQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJhcm1lbXUuaCIKLSNpbmNsdWRlICJhcm1vcy5oIgotCi0vKiBEZWNvZGUgYSAxNmJpdCBUaHVtYiBpbnN0cnVjdGlvbi4gIFRoZSBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgbG93Ci0gICAxNi1iaXRzIG9mIHRoZSB0aW5zdHIgZmllbGQsIHdpdGggdGhlIGZvbGxvd2luZyBUaHVtYiBpbnN0cnVjdGlvbgotICAgaGVsZCBpbiB0aGUgaGlnaCAxNi1iaXRzLiAgUGFzc2luZyBpbiB0d28gVGh1bWIgaW5zdHJ1Y3Rpb25zIGFsbG93cwotICAgZWFzaWVyIHNpbXVsYXRpb24gb2YgdGhlIHNwZWNpYWwgZHVhbCBCTCBpbnN0cnVjdGlvbi4gICovCi0KLXRkc3RhdGUgQVJNdWxfVGh1bWJEZWNvZGUgKHN0YXRlLCBwYywgdGluc3RyLCBhaW5zdHIpCi0gICAgIEFSTXVsX1N0YXRlICoKLSAgICAgICBzdGF0ZTsKLSAgICAgQVJNd29yZAotICAgICAgIHBjOwotICAgICBBUk13b3JkCi0gICAgICAgdGluc3RyOwotICAgICBBUk13b3JkICoKLSAgICAgICBhaW5zdHI7Ci17Ci0gIHRkc3RhdGUgdmFsaWQgPSB0X2RlY29kZWQ7CS8qIGRlZmF1bHQgYXNzdW1lcyBhIHZhbGlkIGluc3RydWN0aW9uICovCi0gIEFSTXdvcmQgbmV4dF9pbnN0cjsKLQotICBpZiAoc3RhdGUtPmJpZ2VuZFNpZykKLSAgICB7Ci0gICAgICBuZXh0X2luc3RyID0gdGluc3RyICYgMHhGRkZGOwotICAgICAgdGluc3RyID4+PSAxNjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXh0X2luc3RyID0gdGluc3RyID4+IDE2OwotICAgICAgdGluc3RyICY9IDB4RkZGRjsKLSAgICB9Ci0KLSNpZiAxCQkJCS8qIGRlYnVnZ2luZyB0byBjYXRjaCBub24gdXBkYXRlcyAqLwotICAqYWluc3RyID0gMHhERUFEQzBERTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKHRpbnN0ciAmIDB4RjgwMCkgPj4gMTEpCi0gICAgewotICAgIGNhc2UgMDoJCQkvKiBMU0wgKi8KLSAgICBjYXNlIDE6CQkJLyogTFNSICovCi0gICAgY2FzZSAyOgkJCS8qIEFTUiAqLwotICAgICAgLyogRm9ybWF0IDEgKi8KLSAgICAgICphaW5zdHIgPSAweEUxQjAwMDAwCS8qIGJhc2Ugb3Bjb2RlICovCi0JfCAoKHRpbnN0ciAmIDB4MTgwMCkgPj4gKDExIC0gNSkpCS8qIHNoaWZ0IHR5cGUgKi8KLQl8ICgodGluc3RyICYgMHgwN0MwKSA8PCAoNyAtIDYpKQkvKiBpbW01ICovCi0JfCAoKHRpbnN0ciAmIDB4MDAzOCkgPj4gMykJLyogUnMgKi8KLQl8ICgodGluc3RyICYgMHgwMDA3KSA8PCAxMik7CS8qIFJkICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDM6CQkJLyogQUREL1NVQiAqLwotICAgICAgLyogRm9ybWF0IDIgKi8KLSAgICAgIHsKLQlBUk13b3JkIHN1YnNldFs0XSA9IHsKLQkgIDB4RTA5MDAwMDAsCQkvKiBBRERTIFJkLFJzLFJuICAgICovCi0JICAweEUwNTAwMDAwLAkJLyogU1VCUyBSZCxScyxSbiAgICAqLwotCSAgMHhFMjkwMDAwMCwJCS8qIEFERFMgUmQsUnMsI2ltbTMgKi8KLQkgIDB4RTI1MDAwMDAJCS8qIFNVQlMgUmQsUnMsI2ltbTMgKi8KLQl9OwotCS8qIEl0IGlzIHF1aWNrZXIgaW5kZXhpbmcgaW50byBhIHRhYmxlLCB0aGFuIHBlcmZvcm1pbmcgc3dpdGNoCi0JICAgb3IgY29uZGl0aW9uYWxzOiAqLwotCSphaW5zdHIgPSBzdWJzZXRbKHRpbnN0ciAmIDB4MDYwMCkgPj4gOV0JLyogYmFzZSBvcGNvZGUgKi8KLQkgIHwgKCh0aW5zdHIgJiAweDAxQzApID4+IDYpCS8qIFJuIG9yIGltbTMgKi8KLQkgIHwgKCh0aW5zdHIgJiAweDAwMzgpIDw8ICgxNiAtIDMpKQkvKiBScyAqLwotCSAgfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgKDEyIC0gMCkpOwkvKiBSZCAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgkJCS8qIE1PViAqLwotICAgIGNhc2UgNToJCQkvKiBDTVAgKi8KLSAgICBjYXNlIDY6CQkJLyogQUREICovCi0gICAgY2FzZSA3OgkJCS8qIFNVQiAqLwotICAgICAgLyogRm9ybWF0IDMgKi8KLSAgICAgIHsKLQlBUk13b3JkIHN1YnNldFs0XSA9IHsKLQkgIDB4RTNCMDAwMDAsCQkvKiBNT1ZTIFJkLCNpbW04ICAgICovCi0JICAweEUzNTAwMDAwLAkJLyogQ01QICBSZCwjaW1tOCAgICAqLwotCSAgMHhFMjkwMDAwMCwJCS8qIEFERFMgUmQsUmQsI2ltbTggKi8KLQkgIDB4RTI1MDAwMDAsCQkvKiBTVUJTIFJkLFJkLCNpbW04ICovCi0JfTsKLQkqYWluc3RyID0gc3Vic2V0Wyh0aW5zdHIgJiAweDE4MDApID4+IDExXQkvKiBiYXNlIG9wY29kZSAqLwotCSAgfCAoKHRpbnN0ciAmIDB4MDBGRikgPj4gMCkJLyogaW1tOCAqLwotCSAgfCAoKHRpbnN0ciAmIDB4MDcwMCkgPDwgKDE2IC0gOCkpCS8qIFJuICovCi0JICB8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTIgLSA4KSk7CS8qIFJkICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6CQkJLyogQXJpdGhtZXRpYyBhbmQgaGlnaCByZWdpc3RlciB0cmFuc2ZlcnMgKi8KLSAgICAgIC8qIFRPRE86IFNpbmNlIHRoZSBzdWJzZXRzIGZvciBib3RoIEZvcm1hdCA0IGFuZCBGb3JtYXQgNQotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFyZSBtYWRlIHVwIG9mIGRpZmZlcmVudCBBUk0gZW5jb2RpbmdzLCB3ZSBjb3VsZAotICAgICAgICAgc2F2ZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbmFsLCBhbmQganVzdCBoYXZlIG9uZSBsYXJnZQotICAgICAgICAgc3Vic2V0LiAqLwotICAgICAgaWYgKCh0aW5zdHIgJiAoMSA8PCAxMCkpID09IDApCi0JewotCSAgLyogRm9ybWF0IDQgKi8KLQkgIHN0cnVjdAotCSAgewotCSAgICBBUk13b3JkIG9wY29kZTsKLQkgICAgZW51bQotCSAgICB7IHRfbm9ybSwgdF9zaGlmdCwgdF9uZWcsIHRfbXVsIH0KLQkgICAgb3R5cGU7Ci0JICB9Ci0JICBzdWJzZXRbMTZdID0KLQkgIHsKLQkgICAgeyAweEUwMTAwMDAwLCB0X25vcm19LAkJCS8qIEFORFMgUmQsUmQsUnMgICAgICovCi0JICAgIHsgMHhFMDMwMDAwMCwgdF9ub3JtfSwJCQkvKiBFT1JTIFJkLFJkLFJzICAgICAqLwotCSAgICB7IDB4RTFCMDAwMTAsIHRfc2hpZnR9LAkJCS8qIE1PVlMgUmQsUmQsTFNMIFJzICovCi0JICAgIHsgMHhFMUIwMDAzMCwgdF9zaGlmdH0sCQkJLyogTU9WUyBSZCxSZCxMU1IgUnMgKi8KLQkgICAgeyAweEUxQjAwMDUwLCB0X3NoaWZ0fSwJCQkvKiBNT1ZTIFJkLFJkLEFTUiBScyAqLwotCSAgICB7IDB4RTBCMDAwMDAsIHRfbm9ybX0sCQkJLyogQURDUyBSZCxSZCxScyAgICAgKi8KLQkgICAgeyAweEUwRDAwMDAwLCB0X25vcm19LAkJCS8qIFNCQ1MgUmQsUmQsUnMgICAgICovCi0JICAgIHsgMHhFMUIwMDA3MCwgdF9zaGlmdH0sCQkJLyogTU9WUyBSZCxSZCxST1IgUnMgKi8KLQkgICAgeyAweEUxMTAwMDAwLCB0X25vcm19LAkJCS8qIFRTVCAgUmQsUnMgICAgICAgICovCi0JICAgIHsgMHhFMjcwMDAwMCwgdF9uZWd9LAkJCS8qIFJTQlMgUmQsUnMsIzAgICAgICovCi0JICAgIHsgMHhFMTUwMDAwMCwgdF9ub3JtfSwJCQkvKiBDTVAgIFJkLFJzICAgICAgICAqLwotCSAgICB7IDB4RTE3MDAwMDAsIHRfbm9ybX0sCQkJLyogQ01OICBSZCxScyAgICAgICAgKi8KLQkgICAgeyAweEUxOTAwMDAwLCB0X25vcm19LAkJCS8qIE9SUlMgUmQsUmQsUnMgICAgICovCi0JICAgIHsgMHhFMDEwMDA5MCwgdF9tdWx9ICwJCQkvKiBNVUxTIFJkLFJkLFJzICAgICAqLwotCSAgICB7IDB4RTFEMDAwMDAsIHRfbm9ybX0sCQkJLyogQklDUyBSZCxSZCxScyAgICAgKi8KLQkgICAgeyAweEUxRjAwMDAwLCB0X25vcm19CS8qIE1WTlMgUmQsUnMgICAgICAgICovCi0JICB9OwotCSAgKmFpbnN0ciA9IHN1YnNldFsodGluc3RyICYgMHgwM0MwKSA+PiA2XS5vcGNvZGU7CS8qIGJhc2UgKi8KLQkgIHN3aXRjaCAoc3Vic2V0Wyh0aW5zdHIgJiAweDAzQzApID4+IDZdLm90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgdF9ub3JtOgotCSAgICAgICphaW5zdHIgfD0gKCh0aW5zdHIgJiAweDAwMDcpIDw8IDE2KQkvKiBSbiAqLwotCQl8ICgodGluc3RyICYgMHgwMDA3KSA8PCAxMikJLyogUmQgKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDAzOCkgPj4gMyk7CS8qIFJzICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgdF9zaGlmdDoKLQkgICAgICAqYWluc3RyIHw9ICgodGluc3RyICYgMHgwMDA3KSA8PCAxMikJLyogUmQgKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDAwNykgPj4gMCkJLyogUm0gKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDggLSAzKSk7CS8qIFJzICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgdF9uZWc6Ci0JICAgICAgKmFpbnN0ciB8PSAoKHRpbnN0ciAmIDB4MDAwNykgPDwgMTIpCS8qIFJkICovCi0JCXwgKCh0aW5zdHIgJiAweDAwMzgpIDw8ICgxNiAtIDMpKTsJLyogUm4gKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSB0X211bDoKLQkgICAgICAqYWluc3RyIHw9ICgodGluc3RyICYgMHgwMDA3KSA8PCAxNikJLyogUmQgKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgOCkJLyogUnMgKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDAzOCkgPj4gMyk7CS8qIFJtICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRm9ybWF0IDUgKi8KLQkgIEFSTXdvcmQgUmQgPSAoKHRpbnN0ciAmIDB4MDAwNykgPj4gMCk7Ci0JICBBUk13b3JkIFJzID0gKCh0aW5zdHIgJiAweDAwMzgpID4+IDMpOwotCSAgaWYgKHRpbnN0ciAmICgxIDw8IDcpKQotCSAgICBSZCArPSA4OwotCSAgaWYgKHRpbnN0ciAmICgxIDw8IDYpKQotCSAgICBScyArPSA4OwotCSAgc3dpdGNoICgodGluc3RyICYgMHgwM0MwKSA+PiA2KQotCSAgICB7Ci0JICAgIGNhc2UgMHgxOgkJLyogQUREIFJkLFJkLEhzICovCi0JICAgIGNhc2UgMHgyOgkJLyogQUREIEhkLEhkLFJzICovCi0JICAgIGNhc2UgMHgzOgkJLyogQUREIEhkLEhkLEhzICovCi0JICAgICAgKmFpbnN0ciA9IDB4RTA4MDAwMDAJLyogYmFzZSAqLwotCQl8IChSZCA8PCAxNikJLyogUm4gKi8KLQkJfCAoUmQgPDwgMTIpCS8qIFJkICovCi0JCXwgKFJzIDw8IDApOwkvKiBSbSAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4NToJCS8qIENNUCBSZCxIcyAqLwotCSAgICBjYXNlIDB4NjoJCS8qIENNUCBIZCxScyAqLwotCSAgICBjYXNlIDB4NzoJCS8qIENNUCBIZCxIcyAqLwotCSAgICAgICphaW5zdHIgPSAweEUxNTAwMDAwCS8qIGJhc2UgKi8KLQkJfCAoUmQgPDwgMTYpCS8qIFJuICovCi0JCXwgKFJkIDw8IDEyKQkvKiBSZCAqLwotCQl8IChScyA8PCAwKTsJLyogUm0gKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDk6CQkvKiBNT1YgUmQsSHMgKi8KLQkgICAgY2FzZSAweEE6CQkvKiBNT1YgSGQsUnMgKi8KLQkgICAgY2FzZSAweEI6CQkvKiBNT1YgSGQsSHMgKi8KLQkgICAgICAqYWluc3RyID0gMHhFMUEwMDAwMAkvKiBiYXNlICovCi0JCXwgKFJkIDw8IDE2KQkvKiBSbiAqLwotCQl8IChSZCA8PCAxMikJLyogUmQgKi8KLQkJfCAoUnMgPDwgMCk7CS8qIFJtICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHhDOgkJLyogQlggUnMgKi8KLQkgICAgY2FzZSAweEQ6CQkvKiBCWCBIcyAqLwotCSAgICAgICphaW5zdHIgPSAweEUxMkZGRjEwCS8qIGJhc2UgKi8KLQkJfCAoKHRpbnN0ciAmIDB4MDA3OCkgPj4gMyk7CS8qIFJkICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwOgkJLyogVU5ERUZJTkVEICovCi0JICAgIGNhc2UgMHg0OgkJLyogVU5ERUZJTkVEICovCi0JICAgIGNhc2UgMHg4OgkJLyogVU5ERUZJTkVEICovCi0JICAgIGNhc2UgMHhFOgkJLyogVU5ERUZJTkVEICovCi0JICAgIGNhc2UgMHhGOgkJLyogVU5ERUZJTkVEICovCi0JICAgICAgdmFsaWQgPSB0X3VuZGVmaW5lZDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOToJCQkvKiBMRFIgUmQsW1BDLCNpbW04XSAqLwotICAgICAgLyogRm9ybWF0IDYgKi8KLSAgICAgICphaW5zdHIgPSAweEU1OUYwMDAwCS8qIGJhc2UgKi8KLQl8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTIgLSA4KSkJLyogUmQgKi8KLQl8ICgodGluc3RyICYgMHgwMEZGKSA8PCAoMiAtIDApKTsJLyogb2ZmOCAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMDoKLSAgICBjYXNlIDExOgotICAgICAgLyogVE9ETzogRm9ybWF0IDcgYW5kIEZvcm1hdCA4IHBlcmZvcm0gdGhlIHNhbWUgQVJNIGVuY29kaW5nLCBzbwotICAgICAgICAgdGhlIGZvbGxvd2luZyBjb3VsZCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBzdWJzZXQsIHNhdmluZyBvbgotICAgICAgICAgdGhlIGZvbGxvd2luZyBib29sZWFuOiAqLwotICAgICAgaWYgKCh0aW5zdHIgJiAoMSA8PCA5KSkgPT0gMCkKLQl7Ci0JICAvKiBGb3JtYXQgNyAqLwotCSAgQVJNd29yZCBzdWJzZXRbNF0gPSB7Ci0JICAgIDB4RTc4MDAwMDAsCQkvKiBTVFIgIFJkLFtSYixSb10gKi8KLQkgICAgMHhFN0MwMDAwMCwJCS8qIFNUUkIgUmQsW1JiLFJvXSAqLwotCSAgICAweEU3OTAwMDAwLAkJLyogTERSICBSZCxbUmIsUm9dICovCi0JICAgIDB4RTdEMDAwMDAJCS8qIExEUkIgUmQsW1JiLFJvXSAqLwotCSAgfTsKLQkgICphaW5zdHIgPSBzdWJzZXRbKHRpbnN0ciAmIDB4MEMwMCkgPj4gMTBdCS8qIGJhc2UgKi8KLQkgICAgfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgKDEyIC0gMCkpCS8qIFJkICovCi0JICAgIHwgKCh0aW5zdHIgJiAweDAwMzgpIDw8ICgxNiAtIDMpKQkvKiBSYiAqLwotCSAgICB8ICgodGluc3RyICYgMHgwMUMwKSA+PiA2KTsJLyogUm8gKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRm9ybWF0IDggKi8KLQkgIEFSTXdvcmQgc3Vic2V0WzRdID0gewotCSAgICAweEUxODAwMEIwLAkJLyogU1RSSCAgUmQsW1JiLFJvXSAqLwotCSAgICAweEUxOTAwMEQwLAkJLyogTERSU0IgUmQsW1JiLFJvXSAqLwotCSAgICAweEUxOTAwMEIwLAkJLyogTERSSCAgUmQsW1JiLFJvXSAqLwotCSAgICAweEUxOTAwMEYwCQkvKiBMRFJTSCBSZCxbUmIsUm9dICovCi0JICB9OwotCSAgKmFpbnN0ciA9IHN1YnNldFsodGluc3RyICYgMHgwQzAwKSA+PiAxMF0JLyogYmFzZSAqLwotCSAgICB8ICgodGluc3RyICYgMHgwMDA3KSA8PCAoMTIgLSAwKSkJLyogUmQgKi8KLQkgICAgfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDE2IC0gMykpCS8qIFJiICovCi0JICAgIHwgKCh0aW5zdHIgJiAweDAxQzApID4+IDYpOwkvKiBSbyAqLwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6CQkJLyogU1RSIFJkLFtSYiwjaW1tNV0gKi8KLSAgICBjYXNlIDEzOgkJCS8qIExEUiBSZCxbUmIsI2ltbTVdICovCi0gICAgY2FzZSAxNDoJCQkvKiBTVFJCIFJkLFtSYiwjaW1tNV0gKi8KLSAgICBjYXNlIDE1OgkJCS8qIExEUkIgUmQsW1JiLCNpbW01XSAqLwotICAgICAgLyogRm9ybWF0IDkgKi8KLSAgICAgIHsKLQlBUk13b3JkIHN1YnNldFs0XSA9IHsKLQkgIDB4RTU4MDAwMDAsCQkvKiBTVFIgIFJkLFtSYiwjaW1tNV0gKi8KLQkgIDB4RTU5MDAwMDAsCQkvKiBMRFIgIFJkLFtSYiwjaW1tNV0gKi8KLQkgIDB4RTVDMDAwMDAsCQkvKiBTVFJCIFJkLFtSYiwjaW1tNV0gKi8KLQkgIDB4RTVEMDAwMDAJCS8qIExEUkIgUmQsW1JiLCNpbW01XSAqLwotCX07Ci0JLyogVGhlIG9mZnNldCByYW5nZSBkZWZlbmRzIG9uIHdoZXRoZXIgd2UgYXJlIHRyYW5zZmVycmluZyBhCi0JICAgYnl0ZSBvciB3b3JkIHZhbHVlOiAqLwotCSphaW5zdHIgPSBzdWJzZXRbKHRpbnN0ciAmIDB4MTgwMCkgPj4gMTFdCS8qIGJhc2UgKi8KLQkgIHwgKCh0aW5zdHIgJiAweDAwMDcpIDw8ICgxMiAtIDApKQkvKiBSZCAqLwotCSAgfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDE2IC0gMykpCS8qIFJiICovCi0JICB8ICgodGluc3RyICYgMHgwN0MwKSA+PiAoNiAtICgodGluc3RyICYgKDEgPDwgMTIpKSA/IDAgOiAyKSkpOwkvKiBvZmY1ICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgkJCS8qIFNUUkggUmQsW1JiLCNpbW01XSAqLwotICAgIGNhc2UgMTc6CQkJLyogTERSSCBSZCxbUmIsI2ltbTVdICovCi0gICAgICAvKiBGb3JtYXQgMTAgKi8KLSAgICAgICphaW5zdHIgPSAoKHRpbnN0ciAmICgxIDw8IDExKSkJLyogYmFzZSAqLwotCQkgPyAweEUxRDAwMEIwCS8qIExEUkggKi8KLQkJIDogMHhFMUMwMDBCMCkJLyogU1RSSCAqLwotCXwgKCh0aW5zdHIgJiAweDAwMDcpIDw8ICgxMiAtIDApKQkvKiBSZCAqLwotCXwgKCh0aW5zdHIgJiAweDAwMzgpIDw8ICgxNiAtIDMpKQkvKiBSYiAqLwotCXwgKCh0aW5zdHIgJiAweDAxQzApID4+ICg2IC0gMSkpCS8qIG9mZjUsIGxvdyBuaWJibGUgKi8KLQl8ICgodGluc3RyICYgMHgwNjAwKSA+PiAoOSAtIDgpKTsJLyogb2ZmNSwgaGlnaCBuaWJibGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTg6CQkJLyogU1RSIFJkLFtTUCwjaW1tOF0gKi8KLSAgICBjYXNlIDE5OgkJCS8qIExEUiBSZCxbU1AsI2ltbThdICovCi0gICAgICAvKiBGb3JtYXQgMTEgKi8KLSAgICAgICphaW5zdHIgPSAoKHRpbnN0ciAmICgxIDw8IDExKSkJLyogYmFzZSAqLwotCQkgPyAweEU1OUQwMDAwCS8qIExEUiAqLwotCQkgOiAweEU1OEQwMDAwKQkvKiBTVFIgKi8KLQl8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTIgLSA4KSkJLyogUmQgKi8KLQl8ICgodGluc3RyICYgMHgwMEZGKSA8PCAyKTsJLyogb2ZmOCAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMDoJCQkvKiBBREQgUmQsUEMsI2ltbTggKi8KLSAgICBjYXNlIDIxOgkJCS8qIEFERCBSZCxTUCwjaW1tOCAqLwotICAgICAgLyogRm9ybWF0IDEyICovCi0gICAgICBpZiAoKHRpbnN0ciAmICgxIDw8IDExKSkgPT0gMCkKLQl7Ci0JICAvKiBOT1RFOiBUaGUgUEMgdmFsdWUgdXNlZCBoZXJlIHNob3VsZCBieSB3b3JkIGFsaWduZWQgKi8KLQkgIC8qIFdlIGVuY29kZSBzaGlmdC1sZWZ0LWJ5LTIgaW4gdGhlIHJvdGF0ZSBpbW1lZGlhdGUgZmllbGQsCi0JICAgICBzbyBubyBzaGlmdCBvZiBvZmY4IGlzIG5lZWRlZC4gICovCi0JICAqYWluc3RyID0gMHhFMjhGMEYwMAkvKiBiYXNlICovCi0JICAgIHwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxMiAtIDgpKQkvKiBSZCAqLwotCSAgICB8ICh0aW5zdHIgJiAweDAwRkYpOwkvKiBvZmY4ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGVuY29kZSBzaGlmdC1sZWZ0LWJ5LTIgaW4gdGhlIHJvdGF0ZSBpbW1lZGlhdGUgZmllbGQsCi0JICAgICBzbyBubyBzaGlmdCBvZiBvZmY4IGlzIG5lZWRlZC4gICovCi0JICAqYWluc3RyID0gMHhFMjhEMEYwMAkvKiBiYXNlICovCi0JICAgIHwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxMiAtIDgpKQkvKiBSZCAqLwotCSAgICB8ICh0aW5zdHIgJiAweDAwRkYpOwkvKiBvZmY4ICovCi0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjoKLSAgICBjYXNlIDIzOgotICAgICAgaWYgKCh0aW5zdHIgJiAweDBGMDApID09IDB4MDAwMCkKLQl7Ci0JICAvKiBGb3JtYXQgMTMgKi8KLQkgIC8qIE5PVEU6IFRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhIHNoaWZ0IGxlZnQgb2YgMgotCSAgICAgZXF1aXZhbGVudCAoaW1wbGVtZW50ZWQgYXMgUk9SICMzMCk6ICovCi0JICAqYWluc3RyID0gKCh0aW5zdHIgJiAoMSA8PCA3KSkJLyogYmFzZSAqLwotCQkgICAgID8gMHhFMjREREYwMAkvKiBTVUIgKi8KLQkJICAgICA6IDB4RTI4RERGMDApCS8qIEFERCAqLwotCSAgICB8ICh0aW5zdHIgJiAweDAwN0YpOwkvKiBvZmY3ICovCi0JfQotICAgICAgZWxzZSBpZiAoKHRpbnN0ciAmIDB4MEYwMCkgPT0gMHgwZTAwKQotCSphaW5zdHIgPSAweEVGMDAwMDAwIHwgU1dJX0JyZWFrcG9pbnQ7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRm9ybWF0IDE0ICovCi0JICBBUk13b3JkIHN1YnNldFs0XSA9IHsKLQkgICAgMHhFOTJEMDAwMCwJCS8qIFNUTURCIHNwISx7cmxpc3R9ICAgICovCi0JICAgIDB4RTkyRDQwMDAsCQkvKiBTVE1EQiBzcCEse3JsaXN0LGxyfSAqLwotCSAgICAweEU4QkQwMDAwLAkJLyogTERNSUEgc3AhLHtybGlzdH0gICAgKi8KLQkgICAgMHhFOEJEODAwMAkJLyogTERNSUEgc3AhLHtybGlzdCxwY30gKi8KLQkgIH07Ci0JICAqYWluc3RyID0gc3Vic2V0WygodGluc3RyICYgKDEgPDwgMTEpKSA+PiAxMCkKLQkJCSAgIHwgKCh0aW5zdHIgJiAoMSA8PCA4KSkgPj4gOCldCS8qIGJhc2UgKi8KLQkgICAgfCAodGluc3RyICYgMHgwMEZGKTsJLyogbWFzazggKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgkJCS8qIFNUTUlBICovCi0gICAgY2FzZSAyNToJCQkvKiBMRE1JQSAqLwotICAgICAgLyogRm9ybWF0IDE1ICovCi0gICAgICAqYWluc3RyID0gKCh0aW5zdHIgJiAoMSA8PCAxMSkpCS8qIGJhc2UgKi8KLQkJID8gMHhFOEIwMDAwMAkvKiBMRE1JQSAqLwotCQkgOiAweEU4QTAwMDAwKQkvKiBTVE1JQSAqLwotCXwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxNiAtIDgpKQkvKiBSYiAqLwotCXwgKHRpbnN0ciAmIDB4MDBGRik7CS8qIG1hc2s4ICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI2OgkJCS8qIEJjYyAqLwotICAgIGNhc2UgMjc6CQkJLyogQmNjL1NXSSAqLwotICAgICAgaWYgKCh0aW5zdHIgJiAweDBGMDApID09IDB4MEYwMCkKLQl7Ci0JICAvKiBGb3JtYXQgMTcgOiBTV0kgKi8KLQkgICphaW5zdHIgPSAweEVGMDAwMDAwOwotCSAgLyogQnJlYWtwb2ludCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KLQkgIGlmICgodGluc3RyICYgMHgwMEZGKSA9PSAweDE4KQotCSAgICAqYWluc3RyIHw9ICgodGluc3RyICYgMHgwMEZGKSA8PCAxNik7Ci0JICAvKiBOZXcgYnJlYWtwb2ludCB2YWx1ZS4gIFNlZSBnZGIvYXJtLXRkZXAuYyAgKi8KLQkgIGVsc2UgaWYgKCh0aW5zdHIgJiAweDAwRkYpID09IDB4RkUpCi0JICAgICphaW5zdHIgfD0gU1dJX0JyZWFrcG9pbnQ7Ci0JICBlbHNlCi0JICAgICphaW5zdHIgfD0gKHRpbnN0ciAmIDB4MDBGRik7Ci0JfQotICAgICAgZWxzZSBpZiAoKHRpbnN0ciAmIDB4MEYwMCkgIT0gMHgwRTAwKQotCXsKLQkgIC8qIEZvcm1hdCAxNiAqLwotCSAgaW50IGRvaXQgPSBGQUxTRTsKLQkgIC8qIFRPRE86IFNpbmNlIHdlIGFyZSBkb2luZyBhIHN3aXRjaCBoZXJlLCB3ZSBjb3VsZCBqdXN0IGFkZAotCSAgICAgdGhlIFNXSSBhbmQgdW5kZWZpbmVkIGluc3RydWN0aW9uIGNoZWNrcyBpbnRvIHRoaXMKLQkgICAgIHN3aXRjaCB0byBzYW1lIG9uIGEgY291cGxlIG9mIGNvbmRpdGlvbmFsczogKi8KLQkgIHN3aXRjaCAoKHRpbnN0ciAmIDB4MEYwMCkgPj4gOCkKLQkgICAgewotCSAgICBjYXNlIEVROgotCSAgICAgIGRvaXQgPSBaRkxBRzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBORToKLQkgICAgICBkb2l0ID0gIVpGTEFHOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZTOgotCSAgICAgIGRvaXQgPSBWRkxBRzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWQzoKLQkgICAgICBkb2l0ID0gIVZGTEFHOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1JOgotCSAgICAgIGRvaXQgPSBORkxBRzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQTDoKLQkgICAgICBkb2l0ID0gIU5GTEFHOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENTOgotCSAgICAgIGRvaXQgPSBDRkxBRzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQzoKLQkgICAgICBkb2l0ID0gIUNGTEFHOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEhJOgotCSAgICAgIGRvaXQgPSAoQ0ZMQUcgJiYgIVpGTEFHKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMUzoKLQkgICAgICBkb2l0ID0gKCFDRkxBRyB8fCBaRkxBRyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgR0U6Ci0JICAgICAgZG9pdCA9ICgoIU5GTEFHICYmICFWRkxBRykgfHwgKE5GTEFHICYmIFZGTEFHKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTFQ6Ci0JICAgICAgZG9pdCA9ICgoTkZMQUcgJiYgIVZGTEFHKSB8fCAoIU5GTEFHICYmIFZGTEFHKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgR1Q6Ci0JICAgICAgZG9pdCA9ICgoIU5GTEFHICYmICFWRkxBRyAmJiAhWkZMQUcpCi0JCSAgICAgIHx8IChORkxBRyAmJiBWRkxBRyAmJiAhWkZMQUcpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMRToKLQkgICAgICBkb2l0ID0gKChORkxBRyAmJiAhVkZMQUcpIHx8ICghTkZMQUcgJiYgVkZMQUcpKSB8fCBaRkxBRzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKGRvaXQpCi0JICAgIHsKLQkgICAgICBzdGF0ZS0+UmVnWzE1XSA9IChwYyArIDQKLQkJCQkrICgoKHRpbnN0ciAmIDB4N0YpIDw8IDEpCi0JCQkJICAgfCAoKHRpbnN0ciAmICgxIDw8IDcpKSA/IDB4RkZGRkZGMDAgOiAwKSkpOwotCSAgICAgIEZMVVNIUElQRTsKLQkgICAgfQotCSAgdmFsaWQgPSB0X2JyYW5jaDsKLQl9Ci0gICAgICBlbHNlCQkJLyogVU5ERUZJTkVEIDogY2M9MTExMChBTCkgdXNlcyBkaWZmZXJlbnQgZm9ybWF0ICovCi0JdmFsaWQgPSB0X3VuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6CQkJLyogQiAqLwotICAgICAgLyogRm9ybWF0IDE4ICovCi0gICAgICBzdGF0ZS0+UmVnWzE1XSA9IChwYyArIDQKLQkJCSsgKCgodGluc3RyICYgMHgzRkYpIDw8IDEpCi0JCQkgICB8ICgodGluc3RyICYgKDEgPDwgMTApKSA/IDB4RkZGRkY4MDAgOiAwKSkpOwotICAgICAgRkxVU0hQSVBFOwotICAgICAgdmFsaWQgPSB0X2JyYW5jaDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjk6CQkJLyogVU5ERUZJTkVEICovCi0gICAgICB2YWxpZCA9IHRfdW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDoJCQkvKiBCTCBpbnN0cnVjdGlvbiAxICovCi0gICAgICAvKiBGb3JtYXQgMTkgKi8KLSAgICAgIC8qIFRoZXJlIGlzIG5vIHNpbmdsZSBBUk0gaW5zdHJ1Y3Rpb24gZXF1aXZhbGVudCBmb3IgdGhpcyBUaHVtYgotICAgICAgICAgaW5zdHJ1Y3Rpb24uIFRvIGtlZXAgdGhlIHNpbXVsYXRpb24gc2ltcGxlIChmcm9tIHRoZSB1c2VyCi0gICAgICAgICBwZXJzcGVjdGl2ZSkgd2UgY2hlY2sgaWYgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBpcyB0aGUKLSAgICAgICAgIHNlY29uZCBoYWxmIG9mIHRoaXMgQkwsIGFuZCBpZiBpdCBpcyB3ZSBzaW11bGF0ZSBpdAotICAgICAgICAgaW1tZWRpYXRlbHkuICAqLwotICAgICAgc3RhdGUtPlJlZ1sxNF0gPSBzdGF0ZS0+UmVnWzE1XSBcCi0JKygoKHRpbnN0ciAmIDB4MDdGRikgPDwgMTIpIFwKLQkgIHwoKHRpbnN0ciAmICgxIDw8IDEwKSkgPyAweEZGODAwMDAwIDogMCkpOwotICAgICAgdmFsaWQgPSB0X2JyYW5jaDsJCS8qIGluLWNhc2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgMm5kIGhhbGYgKi8KLSAgICAgIHRpbnN0ciA9IG5leHRfaW5zdHI7CS8qIG1vdmUgdGhlIGluc3RydWN0aW9uIGRvd24gKi8KLSAgICAgIGlmICgoKHRpbnN0ciAmIDB4RjgwMCkgPj4gMTEpICE9IDMxKQotCWJyZWFrOwkJCS8qIGV4aXQsIHNpbmNlIG5vdCBjb3JyZWN0IGluc3RydWN0aW9uICovCi0gICAgICAvKiBlbHNlIHdlIGZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgQkwgKi8KLSAgICAgIHBjICs9IDI7CQkJLyogcG9pbnQgdGhlIHBjIGF0IHRoZSAybmQgaGFsZiAqLwotICAgIGNhc2UgMzE6CQkJLyogQkwgaW5zdHJ1Y3Rpb24gMiAqLwotICAgICAgLyogRm9ybWF0IDE5ICovCi0gICAgICAvKiBUaGVyZSBpcyBubyBzaW5nbGUgQVJNIGluc3RydWN0aW9uIGVxdWl2YWxlbnQgZm9yIHRoaXMKLSAgICAgICAgIGluc3RydWN0aW9uLiBBbHNvLCBpdCBzaG91bGQgb25seSBldmVyIGJlIG1hdGNoZWQgd2l0aCB0aGUKLSAgICAgICAgIGZtdDE5ICJCTCBpbnN0cnVjdGlvbiAxIiBpbnN0cnVjdGlvbi4gSG93ZXZlciwgd2UgZG8gYWxsb3cKLSAgICAgICAgIHRoZSBzaW11bGF0aW9uIG9mIGl0IG9uIGl0cyBvd24sIHdpdGggdW5kZWZpbmVkIHJlc3VsdHMgaWYKLSAgICAgICAgIHIxNCBpcyBub3Qgc3VpdGFibHkgaW5pdGlhbGlzZWQuICAqLwotICAgICAgewotCUFSTXdvcmQgdG1wID0gKHBjICsgMik7Ci0Jc3RhdGUtPlJlZ1sxNV0gPSAoc3RhdGUtPlJlZ1sxNF0gKyAoKHRpbnN0ciAmIDB4MDdGRikgPDwgMSkpOwotCXN0YXRlLT5SZWdbMTRdID0gKHRtcCB8IDEpOwotCXZhbGlkID0gdF9icmFuY2g7Ci0JRkxVU0hQSVBFOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB2YWxpZDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9hcm0vd3JhcHBlci5jIGIvc2ltL2FybS93cmFwcGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2E4NWQuLjAwMDAwMDAKLS0tIGEvc2ltL2FybS93cmFwcGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyogcnVuIGZyb250IGVuZCBzdXBwb3J0IGZvciBhcm0KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQVJNIFNJTS4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCBydW4uYyBhbmQgZ2RiCi0gICAod2hlbiB0aGUgc2ltdWxhdG9yIGlzIGxpbmtlZCB3aXRoIGdkYikuCi0gICBBbGwgc2ltdWxhdG9yIGludGVyYWN0aW9uIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMgZmlsZS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAicmVtb3RlLXNpbS5oIgotI2luY2x1ZGUgImFybWRlZnMuaCIKLSNpbmNsdWRlICJhcm1lbXUuaCIKLSNpbmNsdWRlICJkYmdfcmRpLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotaG9zdF9jYWxsYmFjayAqc2ltX2NhbGxiYWNrOwotCi1zdGF0aWMgc3RydWN0IEFSTXVsX1N0YXRlICpzdGF0ZTsKLQotLyogV2hvIGlzIHVzaW5nIHRoZSBzaW11bGF0b3IuICAqLwotc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7Ci0KLS8qIGFyZ3ZbMF0gKi8KLXN0YXRpYyBjaGFyICpteW5hbWU7Ci0KLS8qIE1lbW9yeSBzaXplIGluIGJ5dGVzLiAgKi8KLXN0YXRpYyBpbnQgbWVtX3NpemUgPSAoMSA8PCAyMSk7Ci0KLS8qIE5vbi16ZXJvIHRvIGRpc3BsYXkgc3RhcnQgdXAgYmFubmVyLCBhbmQgbWF5YmUgb3RoZXIgdGhpbmdzLiAgKi8KLXN0YXRpYyBpbnQgdmVyYm9zaXR5OwotCi0vKiBOb24temVybyB0byBzZXQgYmlnIGVuZGlhbiBtb2RlLiAgKi8KLXN0YXRpYyBpbnQgYmlnX2VuZGlhbjsKLQotaW50IHN0b3Bfc2ltdWxhdG9yOwotCi1zdGF0aWMgdm9pZAotaW5pdCAoKQotewotICBzdGF0aWMgaW50IGRvbmU7Ci0KLSAgaWYgKCFkb25lKQotICAgIHsKLSAgICAgIEFSTXVsX0VtdWxhdGVJbml0ICgpOwotICAgICAgc3RhdGUgPSBBUk11bF9OZXdTdGF0ZSAoKTsKLSAgICAgIHN0YXRlLT5iaWdlbmRTaWcgPSAoYmlnX2VuZGlhbiA/IEhJR0ggOiBMT1cpOwotICAgICAgQVJNdWxfTWVtb3J5SW5pdCAoc3RhdGUsIG1lbV9zaXplKTsKLSAgICAgIEFSTXVsX09TSW5pdCAoc3RhdGUpOwotICAgICAgQVJNdWxfQ29Qcm9Jbml0IChzdGF0ZSk7Ci0gICAgICBzdGF0ZS0+dmVyYm9zZSA9IHZlcmJvc2l0eTsKLSAgICAgIGRvbmUgPSAxOwotICAgIH0KLX0KLQotLyogU2V0IHZlcmJvc2l0eSBsZXZlbCBvZiBzaW11bGF0b3IuCi0gICBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBwcm9kdWNlIGRldGFpbGVkIHRyYWNpbmcgb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgSnVzdCBzdW1tYXJpZXMuICAqLwotLyogRklYTUU6IGNvbW1vbi9ydW4uYyBkb2Vzbid0IGRvIHRoaXMgeWV0LiAgKi8KLQotdm9pZAotc2ltX3NldF92ZXJib3NlICh2KQotICAgICBpbnQgdjsKLXsKLSAgdmVyYm9zaXR5ID0gdjsKLX0KLQotLyogU2V0IHRoZSBtZW1vcnkgc2l6ZSB0byBTSVpFIGJ5dGVzLgotICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBzaW11bGF0b3IuICAqLwotLyogRklYTUU6IFJlbmFtZSB0byBzaW1fc2V0X21lbV9zaXplLiAgKi8KLQotdm9pZAotc2ltX3NpemUgKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBtZW1fc2l6ZSA9IHNpemU7Ci19Ci0KLXZvaWQKLUFSTXVsX0NvbnNvbGVQcmludCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKHN0YXRlLT52ZXJib3NlKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcCwgZm9ybWF0KTsKLSAgICAgIHZwcmludGYgKGZvcm1hdCwgYXApOwotICAgICAgdmFfZW5kIChhcCk7Ci0gICAgfQotfQotCi1BUk13b3JkCi1BUk11bF9EZWJ1ZyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSBBVFRSSUJVVEVfVU5VU0VELCBBUk13b3JkIHBjIEFUVFJJQlVURV9VTlVTRUQsIEFSTXdvcmQgaW5zdHIgQVRUUklCVVRFX1VOVVNFRCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotc2ltX3dyaXRlIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW5pdCAoKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBBUk11bF9Xcml0ZUJ5dGUgKHN0YXRlLCBhZGRyICsgaSwgYnVmZmVyW2ldKTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW5pdCAoKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBidWZmZXJbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIGFkZHIgKyBpKTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpbV90cmFjZSAoc2QpCi0gICAgIFNJTV9ERVNDIHNkIEFUVFJJQlVURV9VTlVTRUQ7Ci17ICAKLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIlRoaXMgc2ltdWxhdG9yIGRvZXMgbm90IHN1cHBvcnQgdHJhY2luZ1xuIik7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXNpbV9zdG9wIChzZCkKLSAgICAgU0lNX0RFU0Mgc2QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RhdGUtPkVtdWxhdGUgPSBTVE9QOwotICBzdG9wX3NpbXVsYXRvciA9IDE7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKLSAgICAgU0lNX0RFU0Mgc2QgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHN0ZXA7Ci0gICAgIGludCBzaWdnbmFsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0YXRlLT5FbmRDb25kaXRpb24gPSAwOwotICBzdG9wX3NpbXVsYXRvciA9IDA7Ci0KLSAgaWYgKHN0ZXApCi0gICAgewotICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBBUk11bF9Eb0luc3RyIChzdGF0ZSk7Ci0gICAgICBpZiAoc3RhdGUtPkVuZENvbmRpdGlvbiA9PSAwKQotCXN0YXRlLT5FbmRDb25kaXRpb24gPSBSRElFcnJvcl9CcmVha3BvaW50UmVhY2hlZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgMQkJCQkvKiBKR1MgKi8KLSAgICAgIHN0YXRlLT5OZXh0SW5zdHIgPSBSRVNVTUU7CS8qIHRyZWF0IGFzIFBDIGNoYW5nZSAqLwotI2VuZGlmCi0gICAgICBzdGF0ZS0+UmVnWzE1XSA9IEFSTXVsX0RvUHJvZyAoc3RhdGUpOwotICAgIH0KLQotICBGTFVTSFBJUEU7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2QgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52OwotewotICBpbnQgYXJndmxlbiA9IDA7Ci0gIGNoYXIgKiphcmc7Ci0KLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBBUk11bF9TZXRQQyAoc3RhdGUsIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwotICBlbHNlCi0gICAgQVJNdWxfU2V0UEMgKHN0YXRlLCAwKTsJLyogPz8/ICovCi0KLSAgLyogV2UgZXhwbGljaXRseSBzZWxlY3QgYSBwcm9jZXNzb3IgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBBUk0KLSAgICAgMzJiaXQgbW9kZS4gIEpHUyAgKi8KLSAgQVJNdWxfU2VsZWN0UHJvY2Vzc29yIChzdGF0ZSwgQVJNNjAwKTsKLSAgLyogQW5kIHRoZW4gd2UgZm9yY2UgdGhlIHNpbXVsYXRlZCBDUFUgaW50byB0aGUgMzJiaXQgVXNlciBtb2RlLiAgKi8KLSAgQVJNdWxfU2V0Q1BTUiAoc3RhdGUsIFVTRVIzMk1PREUpOwotCi0gIGlmIChhcmd2ICE9IE5VTEwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAgICoqIFNldCB1cCB0aGUgY29tbWFuZCBsaW5lIChieSBsYWJvcmlvdXNseSBzdHJpbmdpbmcgdG9nZXRoZXIgdGhlCi0gICAgICAgICAqKiBlbnZpcm9ubWVudCBjYXJlZnVsbHkgcGlja2VkIGFwYXJ0IGJ5IG91ciBjYWxsZXIuLi4pCi0gICAgICAgKi8KLSAgICAgIC8qIEZyZWUgYW55IG9sZCBzdHVmZiAqLwotICAgICAgaWYgKHN0YXRlLT5Db21tYW5kTGluZSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHN0YXRlLT5Db21tYW5kTGluZSk7Ci0JICBzdGF0ZS0+Q29tbWFuZExpbmUgPSBOVUxMOwotCX0KLQotICAgICAgLyogU2VlIGhvdyBtdWNoIHdlIG5lZWQgKi8KLSAgICAgIGZvciAoYXJnID0gYXJndjsgKmFyZyAhPSBOVUxMOyBhcmcrKykKLQlhcmd2bGVuICs9IHN0cmxlbiAoKmFyZykgKyAxOwotCi0gICAgICAvKiBhbGxvY2F0ZSBpdC4uLiAqLwotICAgICAgc3RhdGUtPkNvbW1hbmRMaW5lID0gbWFsbG9jIChhcmd2bGVuICsgMSk7Ci0gICAgICBpZiAoc3RhdGUtPkNvbW1hbmRMaW5lICE9IE5VTEwpCi0JewotCSAgYXJnID0gYXJndjsKLQkgIHN0YXRlLT5Db21tYW5kTGluZVswXSA9ICdcMCc7Ci0JICBmb3IgKGFyZyA9IGFyZ3Y7ICphcmcgIT0gTlVMTDsgYXJnKyspCi0JICAgIHsKLQkgICAgICBzdHJjYXQgKHN0YXRlLT5Db21tYW5kTGluZSwgKmFyZyk7Ci0JICAgICAgc3RyY2F0IChzdGF0ZS0+Q29tbWFuZExpbmUsICIgIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChlbnYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb3cgc2VlIGlmIHRoZXJlJ3MgYSBNRU1TSVpFIHNwZWMgaW4gdGhlIGVudmlyb25tZW50ICovCi0gICAgICB3aGlsZSAoKmVudikKLQl7Ci0JICBpZiAoc3RybmNtcCAoKmVudiwgIk1FTVNJWkU9Iiwgc2l6ZW9mICgiTUVNU0laRT0iKSAtIDEpID09IDApCi0JICAgIHsKLQkgICAgICBjaGFyICplbmRfb2ZfbnVtOwotCi0JICAgICAgLyogU2V0IHVwIG1lbW9yeSBsaW1pdCAqLwotCSAgICAgIHN0YXRlLT5NZW1TaXplID0KLQkJc3RydG91bCAoKmVudiArIHNpemVvZiAoIk1FTVNJWkU9IikgLSAxLCAmZW5kX29mX251bSwgMCk7Ci0JICAgIH0KLQkgIGVudisrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotdm9pZAotc2ltX2luZm8gKHNkLCB2ZXJib3NlKQotICAgICBTSU1fREVTQyBzZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgdmVyYm9zZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotCi0KLXN0YXRpYyBpbnQKLWZyb21tZW0gKHN0YXRlLCBtZW1vcnkpCi0gICAgIHN0cnVjdCBBUk11bF9TdGF0ZSAqc3RhdGU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLXsKLSAgaWYgKHN0YXRlLT5iaWdlbmRTaWcgPT0gSElHSCkKLSAgICB7Ci0gICAgICByZXR1cm4gKG1lbW9yeVswXSA8PCAyNCkKLQl8IChtZW1vcnlbMV0gPDwgMTYpIHwgKG1lbW9yeVsyXSA8PCA4KSB8IChtZW1vcnlbM10gPDwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIChtZW1vcnlbM10gPDwgMjQpCi0JfCAobWVtb3J5WzJdIDw8IDE2KSB8IChtZW1vcnlbMV0gPDwgOCkgfCAobWVtb3J5WzBdIDw8IDApOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotdG9tZW0gKHN0YXRlLCBtZW1vcnksIHZhbCkKLSAgICAgc3RydWN0IEFSTXVsX1N0YXRlICpzdGF0ZTsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgdmFsOwotewotICBpZiAoc3RhdGUtPmJpZ2VuZFNpZyA9PSBISUdIKQotICAgIHsKLSAgICAgIG1lbW9yeVswXSA9IHZhbCA+PiAyNDsKLSAgICAgIG1lbW9yeVsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIG1lbW9yeVsyXSA9IHZhbCA+PiA4OwotICAgICAgbWVtb3J5WzNdID0gdmFsID4+IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWVtb3J5WzNdID0gdmFsID4+IDI0OwotICAgICAgbWVtb3J5WzJdID0gdmFsID4+IDE2OwotICAgICAgbWVtb3J5WzFdID0gdmFsID4+IDg7Ci0gICAgICBtZW1vcnlbMF0gPSB2YWwgPj4gMDsKLSAgICB9Ci19Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbml0ICgpOwotICBpZiAocm4gPT0gMjUpCi0gICAgewotICAgICAgc3RhdGUtPkNwc3IgPSBmcm9tbWVtIChzdGF0ZSwgbWVtb3J5KTsKLSAgICAgIEFSTXVsX0NQU1JBbHRlcmVkIChzdGF0ZSk7CSAgICAgCi0gICAgfQotICBlbHNlCi0gICAgQVJNdWxfU2V0UmVnIChzdGF0ZSwgc3RhdGUtPk1vZGUsIHJuLCBmcm9tbWVtIChzdGF0ZSwgbWVtb3J5KSk7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgbGVuZ3RoIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEFSTXdvcmQgcmVndmFsOwotCi0gIGluaXQgKCk7Ci0gIGlmIChybiA8IDE2KQotICAgIHJlZ3ZhbCA9IEFSTXVsX0dldFJlZyAoc3RhdGUsIHN0YXRlLT5Nb2RlLCBybik7Ci0gIGVsc2UgaWYgKHJuID09IDI1KQkJLyogRklYTUU6IHVzZSBQU19SRUdOVU0gZnJvbSBnZGIvY29uZmlnL2FybS90bS1hcm0uaCAqLwotICAgIHJlZ3ZhbCA9IEFSTXVsX0dldENQU1IgKHN0YXRlKTsKLSAgZWxzZQotICAgIHJlZ3ZhbCA9IDA7CQkJLyogRklYTUU6IHNob3VsZCByZXBvcnQgYW4gZXJyb3IgKi8KLSAgdG9tZW0gKHN0YXRlLCBtZW1vcnksIHJlZ3ZhbCk7Ci0gIHJldHVybiAtMTsKLX0KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBwdHIsIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqcHRyOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIHNpbV9raW5kID0ga2luZDsKLSAgaWYgKG15bmFtZSkgZnJlZSAobXluYW1lKTsKLSAgbXluYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYXJndlswXSk7Ci0gIHNpbV9jYWxsYmFjayA9IHB0cjsKLQotICAvKiBEZWNpZGUgdXBvbiB0aGUgZW5kaWFuLW5lc3Mgb2YgdGhlIHByb2Nlc3Nvci4KLSAgICAgSWYgd2UgY2FuLCBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJmZCBpdHNlbGYuCi0gICAgIE90aGVyd2lzZSBsb29rIHRvIHNlZSBpZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYSBjb21tYW5kCi0gICAgIGxpbmUgc3dpdGNoIHRoYXQgdGVsbHMgdXMuICBPdGhlcndpc2UgZGVmYXVsdCB0byBsaXR0bGUgZW5kaWFuLiAgKi8KLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBiaWdfZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotICBlbHNlIGlmIChhcmd2WzFdICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIFNjYW4gZm9yIGVuZGlhbi1uZXNzIHN3aXRjaC4gICovCi0gICAgICBmb3IgKGkgPSAwOyAoYXJndltpXSAhPSBOVUxMKSAmJiAoYXJndltpXVswXSAhPSAwKTsgaSsrKQotCWlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdFJykKLQkgIHsKLQkgICAgY2hhciBjOwotCi0JICAgIGlmICgoYyA9IGFyZ3ZbaV1bMl0pID09IDApCi0JICAgICAgewotCQkrK2k7Ci0JCWMgPSBhcmd2W2ldWzBdOwotCSAgICAgIH0KLQotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQKLQkJICAoc2ltX2NhbGxiYWNrLCAiTm8gYXJndW1lbnQgdG8gLUUgb3B0aW9uIHByb3ZpZGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICdiJzoKLQkgICAgICBjYXNlICdCJzoKLQkJYmlnX2VuZGlhbiA9IDE7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnbCc6Ci0JICAgICAgY2FzZSAnTCc6Ci0JCWJpZ19lbmRpYW4gPSAwOwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6Ci0JCXNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkCi0JCSAgKHNpbV9jYWxsYmFjaywgIlVucmVjb2duaXNlZCBhcmd1bWVudCB0byAtRSBvcHRpb25cbiIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0gICAgfQotCi0gIHJldHVybiAoU0lNX0RFU0MpIDE7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgcXVpdHRpbmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG15bmFtZSkgZnJlZSAobXluYW1lKTsKLSAgbXluYW1lID0gTlVMTDsKLX0KLQotU0lNX1JDCi1zaW1fbG9hZCAoc2QsIHByb2csIGFiZmQsIGZyb21fdHR5KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqcHJvZzsKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgZnJvbV90dHkgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsJLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCi0gIGJmZCAqcHJvZ19iZmQ7Ci0KLSAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBzaW1fY2FsbGJhY2ssIHByb2csIGFiZmQsCi0JCQkgICAgc2ltX2tpbmQgPT0gU0lNX09QRU5fREVCVUcsIDAsIHNpbV93cml0ZSk7Ci0gIGlmIChwcm9nX2JmZCA9PSBOVUxMKQotICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgQVJNdWxfU2V0UEMgKHN0YXRlLCBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKHByb2dfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKLSAgICAgaW50ICpzaWdyYzsKLXsKLSAgaWYgKHN0b3Bfc2ltdWxhdG9yKQotICAgIHsKLSAgICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKLSAgICAgICpzaWdyYyA9IFNJR0lOVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0YXRlLT5FbmRDb25kaXRpb24gPT0gMCkKLSAgICB7Ci0gICAgICAqcmVhc29uID0gc2ltX2V4aXRlZDsKLSAgICAgICpzaWdyYyA9IHN0YXRlLT5SZWdbMF0gJiAyNTU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOwotICAgICAgaWYgKHN0YXRlLT5FbmRDb25kaXRpb24gPT0gUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQpCi0JKnNpZ3JjID0gU0lHVFJBUDsKLSAgICAgIGVsc2UKLQkqc2lncmMgPSAwOwotICAgIH0KLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmNtZCBBVFRSSUJVVEVfVU5VU0VEOwoteyAgCi0gICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCi0JCQkJICAgICJUaGlzIHNpbXVsYXRvciBkb2VzIG5vdCBhY2NlcHQgYW55IGNvbW1hbmRzLlxuIik7Ci19Ci0KLQotdm9pZAotc2ltX3NldF9jYWxsYmFja3MgKHB0cikKLSAgICAgaG9zdF9jYWxsYmFjayAqcHRyOwotewotICBzaW1fY2FsbGJhY2sgPSBwdHI7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL0NoYW5nZUxvZyBiL3NpbS9jb21tb24vQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTY1NWY3Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNDM5NyArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgTWF5IDIzIDIxOjM1OjUzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoc2ltLXByb2ZpbGUpOiBFbmFibGUgdGhlIHByb2ZpbGVyIGJ5IGRlZmF1bHQuCi0KLVR1ZSBNYXkgMjMgMjA6MzA6MTIgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogcnVuLmMgKG1haW4pOiBJbml0aWFsaXplIHNpZ3JjLgotCi1XZWQgQXByIDI2IDE2OjE4OjQ0IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jICh1cGRhdGVfdGltZV9mcm9tX2V2ZW50KTogQWRkIG1vcmUgZGV0YWlsZWQgZXZlbnQKLSAJdHJhY2luZy4KLQotMjAwMC0wMy0zMCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUByZWRoYXQuY29tPgotCi0JKiBhY2xvY2FsLm00IChjZ2VuKTogVXNlIGd1aWxlIHRvIHJ1biBjZ2VuLgotCi0yMDAwLTAzLTIzICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QHJlZGhhdC5jb20+Ci0KLQkqIGNnZW4tZnB1Lmg6IFJlbmFtZSBleHRzZmRmIHRvIGZleHRzZmRmLiBSZW5hbWUgdHJ1bmNkZnNmIHRvCi0JZnRydW5jZGZzZi4KLQkqIGNnZW4tYWNjZnAuYyAoZmV4dHNmZGYpOiBOZXcgZnVuY3Rpb24uCi0JKGZ0cnVuY2Rmc2YpOiBOZXcgZnVuY3Rpb24uCi0JKGNnZW5faW5pdF9hY2N1cmF0ZV9mcHUpOiBJbml0aWFsaXplIGZleHRzZmRmIGFuZCBmdHJ1bmNkZnNmLgotCi0yMDAwLTAzLTEzICBKZWZmIEpvaG5zdG9uIDxqam9obnN0bkBjeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wcy5oOiBBZGRlZCBUUlVOQ1NJU0kuCi0KLTIwMDAtMDMtMDggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAcmVkaGF0LmNvbT4KLQotCSogY2dlbi1wYXIuaCAoY2dlbl93cml0ZV9xdWV1ZV9raW5kKTogQWRkIENHRU5fRk5fU0ZfV1JJVEUuCi0JKENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCk6IEFkZCBmbl9zZl93cml0ZS4KLQkoc2ltX3F1ZXVlX2ZuX3NpX3dyaXRlKTogTGFzdCBhcmd1bWVudCBpcyBoYXMgdHlwZSBVU0kuCi0JKHNpbV9xdWV1ZV9mbl9zZl93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNnZW4tcGFyLmMgKHNpbV9xdWV1ZV9mbl9zaV93cml0ZSk6IERlY2xhcmUgJ3ZhbHVlJyBhcyBVU0kuCi0JKHNpbV9xdWV1ZV9mbl9zZl93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2dlbl93cml0ZV9xdWV1ZV9lbGVtZW50X2V4ZWN1dGUpOiBIYW5kbGUgQ0dFTl9GTl9TRl9XUklURS4KLQotVHVlIEZlYiAyMiAxNjo0NTowOSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogV2hlbiBTSU1fSEFWRV9FTlZJUk9OTUVOVCBlbmFibGUgdHJhY2luZyB3aXRoCi0gCXNpbV9zZXRfdHJhY2UgYW5kIHJ1biBzaW11bGF0b3IgdXNpbmcgc2ltX3Jlc3VtZS4KLQkobWFpbik6IEFkZCBvcHRpb24gYGAtbycnIC0gb3BlcmF0aW5nIGVudmlyb25tZW50LiAgT25seSBjb250aW51ZQotIAlhZnRlciBhIHNpZ25hbCB3aGVuIG9wZXJhdGluZyBlbnZpcm9ubWVudC4KLQkobWFpbik6IEFsd2F5cyBzZXQgUkVBU09OIGFuZCBTSUdSQyB1c2luZyBzaW1fc3RvcF9yZWFzb24uCi0JKHNpbV90cmFjZSk6IERlbGV0ZSBleHRlcm4gZGVjbGFyYXRpb24uCi0KLTIwMDAtMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmM6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZyBtZXNzYWdlcy4KLQkqIHJ1bi5jOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAgIAotMTk5OS0xMi0xNyAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBzaW0tcHJvZmlsZS5oOiAoc2V0X3Byb2ZpbGVfb3B0aW9uX21hc2spOiBBZGQgcHJvdG90eXBlLgotCSogc2ltLXByb2ZpbGUuYyAoc2V0X3Byb2ZpbGVfb3B0aW9uX21hc2spOiBObyBsb25nZXIgc3RhdGljLgotCi1XZWQgRGVjICA4IDIxOjQ3OjEzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWFyYW5nZS5jOiBJbmNsdWRlIDxzdHJpbmcuaD4KLQotMTk5OS0xMi0wNyAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5jIChwcmludF9oZWxwKTogJz0nIHJlcXVpcmVkIGJlZm9yZSBvcHRpb25hbCBhcmd1bWVudC4KLQkqIGNnZW4tcGFyLmggKENHRU5fRk5fTUVNX1FJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKENHRU5fRk5fTUVNX0hJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKENHRU5fRk5fTUVNX1NJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKENHRU5fRk5fTUVNX0RJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKENHRU5fRk5fTUVNX0RGX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKENHRU5fRk5fTUVNX1hJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKGZuX21lbV9xaV93cml0ZSk6IE5ldyB1bmlvbiBtZW1iZXJzLgotCShmbl9tZW1faGlfd3JpdGUpOiBOZXcgdW5pb24gbWVtYmVycy4KLQkoZm5fbWVtX3NpX3dyaXRlKTogTmV3IHVuaW9uIG1lbWJlcnMuCi0JKGZuX21lbV9kaV93cml0ZSk6IE5ldyB1bmlvbiBtZW1iZXJzLgotCShmbl9tZW1fZGZfd3JpdGUpOiBOZXcgdW5pb24gbWVtYmVycy4KLQkoZm5fbWVtX3hpX3dyaXRlKTogTmV3IHVuaW9uIG1lbWJlcnMuCi0JKHNpbV9xdWV1ZV9mbl9tZW1fcWlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9mbl9tZW1faGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9mbl9tZW1fc2lfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9mbl9tZW1fZGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9mbl9tZW1fZGZfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9mbl9tZW1feGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLXBhci5jIChzaW1fcXVldWVfZm5fbWVtX3FpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfZm5fbWVtX2hpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfZm5fbWVtX3NpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfZm5fbWVtX2RpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfZm5fbWVtX2RmX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfZm5fbWVtX3hpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShjZ2VuX3dyaXRlX3F1ZXVlX2VsZW1lbnRfZXhlY3V0ZSk6IEhhbmRsZSBDR0VOX0ZOX01FTV9RSV9XUklURSwKLQlDR0VOX0ZOX01FTV9ISV9XUklURSwgQ0dFTl9GTl9NRU1fU0lfV1JJVEUsIENHRU5fRk5fTUVNX0RJX1dSSVRFLAotCUNHRU5fRk5fTUVNX0RGX1dSSVRFLCBDR0VOX0ZOX01FTV9YSV9XUklURS4KLQotMTk5OS0xMi0wMSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjZ2VuLWFjY2ZwLmMgKHN1YnNmKTogQ2hlY2sgc3RhdHVzIGNvZGUuCi0JKG11bHNmKTogRGl0dG8uCi0JKG5lZ3NmKTogRGl0dG8uCi0JKGFic3NmKTogRGl0dG8uCi0JKHNxcnRzZik6IERpdHRvLgotCShpbnZzZik6IERpdHRvLgotCShtaW5zZik6IERpdHRvLgotCShtYXhzZik6IERpdHRvLgotCShzdWJkZik6IERpdHRvLgotCShtdWxkZik6IERpdHRvLgotCShkaXZkZik6IERpdHRvLgotCShuZWdkZik6IERpdHRvLgotCShhYnNkZik6IERpdHRvLgotCShzcXJ0ZGYpOiBEaXR0by4KLQkoaW52ZGYpOiBEaXR0by4KLQkobWluZGYpOiBEaXR0by4KLQkobWF4ZGYpOiBEaXR0by4KLQotMTk5OS0xMS0yNiAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjZ2VuLXBhci5oIChmbl9kZl93cml0ZSk6IE1vZGUgb2YgZGF0YSBpcyBERi4KLQkoc2ltX3F1ZXVlX2ZuX2RmX3dyaXRlKTogTW9kZSBvZiBkYXRhIGlzIERGLgotCSogY2dlbi1wYXIuYyAoc2ltX3F1ZXVlX2ZuX2RmX3dyaXRlKTogTW9kZSBvZiBkYXRhIGlzIERGLgotCi0xOTk5LTExLTIyICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdHJhY2UuYyAoU0laRV9UUkFDRV9CVUYpOiBJbnhyZWFzZSBzaXplIG9mIHRyYWNlIGJ1ZmZlci4KLQkqIGNnZW4tcGFyLmggKENHRU5fV1JJVEVfUVVFVUVfU0laRSk6IEluY3JlYXNlIHNpemUgb2YgcXVldWUuCi0KLTE5OTktMTEtMDQgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1wYXIuaCAoY2dlbl93cml0ZV9xdWV1ZV9raW5kKTogQWRkIENHRU5fRk5fWElfV1JJVEUgYW5kCi0JQ0dFTl9NRU1fWElfV1JJVEUgbWVtYmVycy4KLQkoQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UKTogQWRkIGZuX3hpX3dyaXRlIGFuZCBtZW1feGlfd3JpdGUgbWVtYmVycy4KLQkoc2ltX3F1ZXVlX2ZuX3hpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcXVldWVfbWVtX3hpX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjZ2VuLXBhci5jIChzaW1fcXVldWVfZm5feGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9xdWV1ZV9tZW1feGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGNnZW5fd3JpdGVfcXVldWVfZWxlbWVudF9leGVjdXRlKTogSGFuZGxlIENHRU5fRk5fWElfV1JJVEUgYW5kCi0JQ0dFTl9NRU1fWElfV1JJVEUuCi0KLTE5OTktMTAtMjIgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1wYXIuaCAoaW5zbl9hZGRyZXNzKTogTmV3IGZpZWxkIGluIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVC4KLQkoQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UX0lBRERSKTogTmV3IG1hY3JvLgotCSogY2dlbi1wYXIuYzogU2V0IGluc25fYWRkcmVzcyBmb3IgZWFjaCBxdWV1ZWQgd3JpdGUuIEdldCBwYyBmcm9tCi0JY3B1IHdoZW4gZXhlY3V0aW5nIHF1ZXVlZCB3cml0ZXMuCi0KLTE5OTktMTAtMTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1wYXIuaCAoc2ltX3F1ZXVlX2ZuX3BjX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShDR0VOX0ZOX1BDX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKGZuX3BjX3dyaXRlKTogTmV3IHVuaW9uIG1lbWJlci4KLQkqIGNnZW4tcGFyLmMgKHNpbV9xdWV1ZV9mbl9wY193cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2dlbl93cml0ZV9xdWV1ZV9lbGVtZW50X2V4ZWN1dGUpOiBIYW5kbGUgQ0dFTl9GTl9QQ19XUklURS4KLQotMTk5OS0xMC0xOCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjZ2VuLXBhci5oIChDR0VOX01FTV9ESV9XUklURSk6IE5ldyBlbnVtZXJhdG9yLgotCShDR0VOX01FTV9ERl9XUklURSk6IE5ldyBlbnVtZXJhdG9yLgotCShtZW1fZGlfd3JpdGUpOiBOZXcgdW5pb24gbWVtYmVyLgotCShtZW1fZGZfd3JpdGUpOiBOZXcgdW5pb24gbWVtYmVyLgotCSogY2dlbi1wYXIuYyAoc2ltX3F1ZXVlX21lbV9kaV93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX3F1ZXVlX21lbV9kZl93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2dlbl93cml0ZV9xdWV1ZV9lbGVtZW50X2V4ZWN1dGUpOiBIYW5kbGUgQ0dFTl9NRU1fRElfV1JJVEUgYW5kCi0JQ0dFTl9NRU1fREZfV1JJVEUuCi0JKiBjZ2VuLWFjY2ZwLmMgKGRpdnNmKTogQ2hlY2sgZm9yIGRpdmlzaW9uIGVycm9ycy4KLQotMTk5OS0xMC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWVuZ2luZS5oIChFWFRSQUNUX0lOVCxFWFRSQUNUX1VJTlQpOiBEZWxldGUuCi0KLTE5OTktMTAtMDcgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1wYXIuaCAoQ0dFTl9GTl9ISV9XUklURSk6IE5ldyBlbnVtZXJhdG9yLiAKLQkoZm5faGlfd3JpdGUpOiBOZXcgdW5pb24gbWVtYmVyLgotCShzaW1fcXVldWVfZm5faGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLXBhci5jIChzaW1fcXVldWVfZm5faGlfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGNnZW5fd3JpdGVfcXVldWVfZWxlbWVudF9leGVjdXRlKTogSGFuZGxlIENHRU5fRk5fSElfV1JJVEUuCi0KLTE5OTktMDktMjkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kZWZzLmggKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogTmV3IGFyZyBgdnBjJy4KLQlDaGFuZ2UgdHlwZSBvZiByZXN1bHQgdG8gU0VNX1BDLgotCi1XZWQgU2VwIDI5IDE0OjQzOjU3IDE5OTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kZWZzLmggKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogTm93IHJldHVybnMgUEMuCi0KLTE5OTktMDktMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcHMuaCAoU1VCV09SRCopOiBEZWxldGUgY3B1IGFyZy4KLQkoSk9JTiopOiBEZWxldGUgY3B1IGFyZy4KLQotVHVlIFNlcCAyMSAxNzoxNDoxNiAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdlbm1sb29wLnNoIChAY3B1QF9zY2FjaGVfbG9va3VwKTogTm8gbG9uZ2VyIHRha2VzIGxhc3RfaW5zbl9wCi0JcGFyYW1ldGVyLgotCShTRVRfTEFTVF9JTlNOX1ApOiBTZXQgbGFzdF9pbnNuX3AgZmxhZyBpbiB0aGUgc2NhY2hlIGVsZW1lbnQuCi0KLU1vbiBTZXAgMjAgMjE6NDQ6MDYgMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0gICAgICAgICogc2ltLWZwdS5jIChpMmZwdSk6IEtlZXAgdGhlIGd1YXJkIGJpdHMgc3RpY2t5IHdoZW4gY29udmVydGluZwotICAgICAgICBsYXJnZSB2YWx1ZXMuCi0KLVR1ZSBGZWIgIDggMTY6MzM6NDggMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBydW4uYyAobWFpbik6IENoZWNrIHRoZSBzaW1fc3RvcF9yZWFzb24gYW5kIG9ubHkgaGFsdCBzaW11bGF0aW9uCi0gCXdoZW4gYSB2YWxpZCBzdG9wIGNvbmRpdGlvbiBpcyBpZGVudGlmaWVkLgotCi1XZWQgU2VwIDE1IDE0OjEyOjM3IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctdHJlZS5jLCBody1wcm9wZXJ0aWVzLmMsIGh3LWluc3RhbmNlcy5jOiBJbmNsdWRlICJzaW0taW8uaCIuCi0KLVR1ZSBTZXAgMTQgMTQ6MTU6NDcgMTk5OSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjZ2VuLXBhci5oIChDR0VOX0JJX1dSSVRFKTogTmV3IGVudW1lcmF0b3IuCi0JKGJpX3dyaXRlKTogTmV3IHVuaW9uIGVsZW1lbnQuCi0JKHNpbV9xdWV1ZV9iaV93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNnZW4tcGFyLmMgKHNpbV9xdWV1ZV9iaV93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2dlbl93cml0ZV9xdWV1ZV9lbGVtZW50X2V4ZWN1dGUpOiBIYW5kbGUgQ0dFTl9CSV9XUklURS4KLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotCSogYWNsb2NhbC5tNCAoV0VSUk9SX0NGTEFHUywgV0FSTl9DRkxBR1MpOiBNZXJnZSBmcm9tCi0gCS4uL2dkYi9jb25maWd1cmUuaW4uCi0JKiBNYWtlLWNvbW1vbi5pbiAoV0VSUk9SX0NGTEFHUywgV0FSTl9DRkxBR1MpOiBEZWZpbmUuCi0JKFNJTV9XRVJST1JfQ0ZMQUdTLCBTSU1fV0FSTl9DRkxBR1MpOiBEZWZpbmUuCi0JKFNJTV9XQVJOSU5HUyk6IERlbGV0ZQotCShDT05GSUdfQ0ZMQUdTKTogVXBkYXRlLgotCi1UdWUgQXVnIDMxIDE2OjAxOjQyIDE5OTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1wYXIuYzogTmV3IGZpbGUuCi0JKiBjZ2VuLXBhci5oOiBOZXcgZmlsZS4KLQkqIGNnZW4tc2ltLmggKGNnZW4tcGFyLmgpOiAjaW5jbHVkZSBpdC4KLQkqIGNnZW4tY3B1LmggKHdyaXRlX3F1ZXVlKTogTmV3IGZpZWxkLgotCShDUFVfV1JJVEVfUVVFVUUpOiBOZXcgYWNjZXNzIG1hY3JvLgotCSogTWFrZS1jb21tb24uaW4gKENHRU5fTUFJTl9DUFVfREVQUyk6IEFkZCBjZ2VuLXBhci5oLgotCShjZ2VuLXBhci5vKTogTmV3IHRhcmdldC4KLQotMTk5OS0wOC0yOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXR5cGVzLmggKG1vZGVfdHlwZSxNT0RFX1ZPSUQpOiBSZW5hbWVkIGZyb20gTU9ERV9WTS4KLQkqIGNnZW4tdXRpbHMuYyAobW9kZV9uYW1lcyk6IFVwZGF0ZS4KLQotMTk5OS0wOC0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBnZW5tbG9vcC5zaDogTmV3IGFyZ3MgLXBhcmFsbGVsLWdlbmVyaWMtd3JpdGUsIC1wYXJhbGxlbC1vbmx5LgotCSogY2dlbi1lbmdpbmUuaCAoU0VNQU5USUNfRk4pOiBEb24ndCB1c2UgdmVyc2lvbiB3aXRoIFBBUkVYRUMKLQlidWZmZXIgYXJnIGlmIFdJVEhfUEFSQUxMRUxfR0VOV1JJVEUuCi0JKHN0cnVjdCBpbnNuX3NlbSk6IEhhbmRsZSBXSVRIX1BBUkFMTEVMX0dFTldSSVRFLgotCShzdHJ1Y3QgaWRlc2MpOiBEaXR0by4KLQotV2VkIEF1ZyAxOCAxODoxNzoyOCAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tbW9kZWwuYyAobW9kZWxfb3B0aW9uX2hhbmRsZXIpOiBBZGQgXG4gdG8gZXJyb3IgbWVzc2FnZS4KLQotMTk5OS0wOC0wOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWVuZ2luZS5oIChTRU1fRk5fTkFNRSxTRU1GX0ZOX05BTUUpOiBEZWxldGUuCi0JKGluc25fc2VtKTogUmV3cml0ZS4KLQkoc2VtX2ZuX2Rlc2MpOiBOZXcgc3RydWN0LgotCShpZGVzYyk6IFJld3JpdGUuCi0JKiBnZW5tbG9vcC5zaCAoc2NhY2hlIGNhc2UsQGNwdUBfc2NhY2hlX2xvb2t1cCk6IFByb2ZpbGUgc2NhY2hlIGhpdCwKLQltaXNzZXMgaWYgISBGQVNUX1AuCi0JKHNjYWNoZSBjYXNlKTogU3BsaXQgaW50byBub24tcGFyYWxsZWwvcGFyYWxsZWwgdmVyc2lvbnMuCi0JKEBjcHVAX2VuZ2luZV9ydW5fe2Z1bGwsZmFzdH0pOiBDYWxsIEBjcHVAX3tzZW0sc2VtZn1faW5pdF9pZGVzY190YWJsZQotCWlmIG5vdCB1c2Ugc2VtYW50aWMgc3dpdGNoIHZlcnNpb24uCi0KLTE5OTktMDgtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kZWZzLmggKFNFTV9CUkFOQ0hfVFlQRSk6IE5ldyBlbnVtLgotCSogY2dlbi1lbmdpbmUuaCAoU0VNX0JSQU5DSF9VTlRBS0VOLFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEUpOiBEZWxldGUuCi0JKFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUKTogRGVsZXRlLgotCShTRU1fQlJBTkNIX0lOSVQpOiBSZXBsYWNlIG5wY19wdHIgd2l0aCBicl90eXBlLgotCShTRU1fQlJBTkNIX0ZJTkkpOiBEaXR0by4KLQkoU0VNX0JSQU5DSF9WSUFfQUREUik6IERpdHRvLgotCShTRU1fQlJBTkNIX1ZJQV9DQUNIRSk6IERpdHRvLiAgRGVsZXRlIGNhY2h2YXJwdHIgYXJnLgotCShTRU1fQlJBTkNIX0FERFJfQ0FDSEUpOiBEZWxldGUuCi0JKFNFTV9TS0lQX0NPTVBJTEUsU0VNX1NLSVBfSU5TTik6IE5ldyBtYWNyb3MuCi0JKiBjZ2VuLXNjYWNoZS5oIChjcHVfc2NhY2hlKTogUmVwbGFjZSBtZW1iZXIgcGJiX3ByX25wY19wdHIgd2l0aAotCXBiYl9icl90eXBlLgotCSogZ2VubWxvb3Auc2ggKGVuZy5oaW4pOiBVcGRhdGUgcHJvdG90eXBlIG9mICR7Y3B1fV9wYmJfY3RpX2NoYWluLgotCShAY3B1QF9wYmJfYmVnaW4pOiBJbml0aWFsaXplIGJyYW5jaF90YXJnZXQuCi0JKEBjcHVAX3BiYl9jdGlfY2hhaW4pOiBSZXBsYWNlIGFyZyBuZXdfdnBjX3B0ciB3aXRoIGJyX3R5cGUuCi0JKEBjcHVAX2VuZ2luZV9ydW5fZnVsbCk6IFJlcGxhY2UgbG9jYWwgcGJiX2JyX25wY19wdHIgd2l0aAotCXBiYl9icl90eXBlLgotCShAY3B1QF9lbmdpbmVfcnVuX2Zhc3QpOiBEaXR0by4KLQotRnJpIEp1bCAxNiAxNDo0Nzo1MyAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdXRpbHMuYyAoUk9SU0kpOiBOZXcgZnVuY3Rpb24uCi0JKFJPTFNJKTogTmV3IGZ1bmN0aW9uLgotCi0xOTk5LTA3LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogVHdlYWsgVEFHUyByZWdleC4KLQkqIGNnZW4tbWVtLmggKCopOiBBZGQgVEFHUyBtYXJrZXJzLgotCi1TdW4gSnVsIDExIDIzOjQ3OjIwIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXJlc3VtZS5jIChzaW1fcmVzdW1lKTogRW5zdXJlIHRoYXQgdGhlIHNpZ2duYWwgW3NpY10gaXMgb25seQotIAlwYXNzZWQgaW4gd2hlbiBzaW1fcmVzdW1lIGlzIGZpcnN0IGVudGVyZWQgLSBkb24ndCByZS1wYXNzIGl0Ci0gCWFmdGVyIGEgcmVzdGFydC4KLQkKLVN1biBKdWwgMTEgMjM6MzQ6NDQgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IEFkZCBPUFRJT05fTE9BRF9WTUEgYW5kCi0gCU9QVElPTl9MT0FEX0xNQSBidXQgb25seSB3aGVuIGlzIGRlZmluZWQuCi0JKHN0YW5kYXJkX29wdGlvbnMpOiBXaGVuIFNJTV9IQU5ETEVTX0xNQSBpcyBkZWZpbmVkIGluY2x1ZGUKLSAJb3B0aW9ucyAtLWxvYWQtbG1hIGFuZCAtLWxvYWQtdm1hLgotCShzdGFuZGFyZF9pbnN0YWxsKTogSW5pdGlhbGl6ZSBTVEFURV9MT0FEX0FUX0xNQV9QLgotCi0JKiBzaW0tYmFzZS5oIChTVEFURV9MT0FEX0FUX0xNQV9QKTogRGVmaW5lLgotCShzdHJ1Y3Qgc2ltX3N0YXRlX2Jhc2UpOiBBZGQgbG9hZF9hdF9sbWFfcC4KLQkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFJlcGxhY2UgU0lNX0hBTkRMRVNfTE1BIHdpdGgKLSAJU1RBVEVfTE9BRF9BVF9MTUFfUC4KLQotU3VuIEp1bCAxMSAxMjowMzozNiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG5ydW4uYyAobWFpbik6IFJlLWZvcm1hdCBsb29wIGdudSBzdHlsZS4KLQotV2VkIEp1bCAgNyAxOTo1NjowMyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LXNvY2tzZXIuYyAoY29ubmVjdGVkX3ApOiBJbml0aWFsaXplIGFkZHJsZW4uCi0KLTE5OTktMDctMDYgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hY2NmcC5jIChmbG9hdHNpZGYpOiBOZXcgZnVuY3Rpb24uCi0JKGZpeGRmc2kpOiBOZXcgZnVuY3Rpb24uCi0KLTE5OTktMDctMDYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1vZGVsLmMgKHNpbV9tb2RlbF9pbml0KTogSXNzdWUgZXJyb3IgaWYgbWFjaGluZSBpcyB1bnN1cHBvcnRlZC4KLQotMTk5OS0wNy0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoQ0dFTl9NQUlOX0NQVV9ERVBTKTogQWRkIGNnZW4tZnB1LmguCi0JKGNnZW4tZnB1Lm8sY2dlbi1hY2NmcC5vKTogQWRkIHJ1bGVzIGZvci4KLQkqIGNnZW4tZnB1LmM6IE5ldyBmaWxlLgotCSogY2dlbi1mcHUuaDogTmV3IGZpbGUuCi0JKiBjZ2VuLWFjY2ZwLmM6IE5ldyBmaWxlLgotCSogY2dlbi1jcHUuaCAoQ0dFTl9DUFUpOiBOZXcgbWVtYmVyIGZwdS4KLQkqIGNnZW4tbWVtLmg6IFJlZG8gZnAgc3VwcG9ydC4KLQkqIGNnZW4tb3BzLmg6IERlbGV0ZSBrJnIgc3VwcG9ydC4gIFJlZG8gZnAgc3VwcG9ydC4KLQkqIGNnZW4tc2ltLmg6IEluY2x1ZGUgY2dlbi1mcHUuaC4KLQkqIGNnZW4tdHlwZXMuaCAoU0YsREYsWEYsVEYpOiBNb3ZlZCB0byBjZ2VuLWZwdS5oLgotCi0xOTk5LTA2LTIzICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZW5naW5lLmggKFRBUkdFVF9TRU1fQlJBTkNIX0ZJTkkpOiBSZW1vdmUgY3J1ZnQgYXQgZW5kIG9mCi0JaWZuZGVmLgotCSogZ2VubWxvb3Auc2ggKEBjcHVAX3NjYWNoZV9sb29rdXApOiBEZWxldGUgdW51c2VkIGxvY2FsIHZhci4KLQkoQGNwdUBfcGJiX2N0aV9jaGFpbik6IE1pbm9yIGNsZWFuIHVwLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhY2xvY2FsLm00OiBVc2UgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhULiAgRGVsZXRlIGRlZm4gb2YKLSAgICAgICAgQU1fQ1lHV0lOMzIgYW5kIEFNX0VYRUVYVC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkKLUZyaSBBcHIgMTYgMTY6NDM6MjIgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKGRldmljZV9lcnJvcixkZXZpY2VfaW9fcmVhZF9idWZmZXIsCi0JZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcik6IERlbGV0ZSBkZWNscy4KLQkqIHNpbS1jb3JlLmg6IFB1dCB0aGVtIGhlcmUuCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3JlYWRfYnVmZmVyKTogUGFzcyBzZCB0byBkZXZpY2VfaW9fcmVhZF9idWZmZXIuCi0JKHNpbV9jb3JlX3dyaXRlX2J1ZmZlcik6IFBhc3Mgc2QgdG8gZGV2aWNlX2lvX3dyaXRlX2J1ZmZlci4KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04pOiBEaXR0by4KLQkoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKTogRGl0dG8uCi0KLTE5OTktMDQtMTQgIFN0ZXBoYW5lIENhcnJleiAgPHN0Y2FycmV6QHdvcmxkbmV0LmZyPgotCi0JKiBzaW0tbWVtb3B0LmMgKHNpbV9tZW1vcnlfdW5pbnN0YWxsKTogRG9uJ3QgbG9vayBpbnRvCi0JZnJlZSgpZCBtZW1vcnkuCi0KLTE5OTktMDQtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi11dGlscy5zY20gKHZpcnR1YWxfaW5zbl9lbnRyaWVzKTogVXBkYXRlIGF0dHJpYnV0ZSBkZWZpbml0aW9uLgotCi0xOTk5LTA0LTEzICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3JlYWRfYnVmZmVyKTogSGFuZGxlIE5VTEwgY3B1IHdoZW4gV0lUSF9ERVZJQ0VTLgotCShzaW1fY29yZV93cml0ZV9idWZmZXIpOiBEaXR0by4KLQotMTk5OS0wNC0wMiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogc2ltLWlvLmMgKHNpbV9pb19wb2xsX3F1aXQpOiBPbmx5IGNhbGwgdGhlIHBvbGxfcXVpdCBjYWxsYmFjawotCWFmdGVyIHRoZSBpbnRlcnZhbCBjb3VudGVyIGhhcyBleHBpcmVkLgotCShQT0xMX1FVSVRfSU5URVJWQUwpOiBEZWZpbmUuIFVzZWQgdG8gdHdlYWsgdGhlIGZyZXF1ZW5jeSBvZgotCXBvbGxfcXVpdCBjYWxsYmFja3MuIE1heSBiZSBvdmVycmlkZGVuIGJ5IE1ha2VmaWxlLgotCShwb2xsX3F1aXRfY291bnRlcik6IE5ldyBnbG9iYWwuCi0JKiBzaW0tZXZlbnRzLmM6IFJlbW92ZSBhbGwgbWVudGlvbnMgb2YgdWlfbG9vcF9ob29rLiBUaGUKLQlob3N0IGNhbGxiYWNrICJwb2xsX3F1aXQiIHdpbGwgc2VydmUgdGhlIHB1cnBvc2UuCi0JKiBydW4uYzogQWRkIGRlZmluaXRpb24gb2YgdWlfbG9vcF9ob29rIHdoZW4gTkVFRF9VSV9MT09QX0hPT0sKLQlpcyBkZWZpbmVkLgotCSogbnJ1bi5jOiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgdWlfbG9vcF9ob29rLgotCi1XZWQgTWFyIDMxIDE4OjU1OjQxIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tcnVuLmMgKHNpbV9yZXN1bWUpOiBEb24ndCB0ZWxsIG1haW4gbG9vcCB0byBydW4gImZvcmV2ZXIiCi0JaWYgYmVpbmcgdXNlZCBieSBnZGIuCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi10eXBlcy5oIChYRixURik6IFR3ZWFrLgotCSogY2dlbi1vcHMuaDogUmVkbyBpbmxpbmUgc3VwcG9ydC4gIERlbGV0ZSBESV9GTl9TVVBQT1JULAotCWluIGNnZW4tdHlwZXMuaC4KLQkoU1VCV09SRCosSk9JTiopOiBEZWZpbmUuCi0JKiBjZ2VuLXRyYWNlLmMgKHNpbV9jZ2VuX2Rpc2Fzc2VtYmxlX2luc24pOiBVcGRhdGUsIGJhc2VfaW5zbl9iaXRzaXplCi0JbW92ZWQgaW50byBjcHUgZGVzY3JpcHRvci4KLQkqIHNpbS1tb2RlbC5oIChNQUNIKTogTmV3IG1lbWJlciBgbnVtJy4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWNwdS5oIChDR0VOX0RJU0FTU0VNQkxFUik6IE5ldyB0eXBlLgotCShDR0VOX0NQVSk6IE1lbWJlciBvcGNvZGUgcmVuYW1lZCB0byBjcHVfZGVzYy4KLQlOZXcgbWVtYmVycyBnZXRfaWRhdGEsZGlzYXNzZW1ibGVyLgotCSogY2dlbi1kZWZzLmggKENHRU5fSU5TTl9WSVJUVUFMX1ApOiBDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvCi0JQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JKENHRU5fU1RBVEUpOiBEZWxldGUgbWVtYmVyIG9wY29kZV90YWJsZS4KLQkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBEZWxldGUgZGVjbC4KLQkqIGNnZW4tZW5naW5lLmggKHN0cnVjdCBpbnNuX3NlbSk6IE1vdmVkIHRvIGhlcmUgZnJvbSA8Y3B1Pi1kZWNvZGUuYy4KLQkoc3RydWN0IGlkZXNjKTogTW92ZWQgdG8gaGVyZSBmcm9tIDxjcHU+LWRlY29kZS5oLgotCSogY2dlbi1ydW4uYyAocHJpbWVfY3B1KTogQ2FsbCBwcmVwYXJlX3J1biBjYWxsYmFjay4KLQkqIGNnZW4tdHJhY2UuaCAoU0ZJTEUpOiBOZXcgdHlwZS4KLQkoc2ltX2Rpc2FzbV9zcHJpbnRmKTogRGVjbGFyZS4KLQkoc2ltX2Rpc2FzbV9yZWFkX21lbW9yeSxzaW1fZGlzYXNtX3BlcnJvcl9tZW1vcnkpOiBEZWNsYXJlLgotCShzaW1fY2dlbl9kaXNhc3NlbWJsZV9pbnNuKTogRGVjbGFyZS4KLQkqIGNnZW4tdHJhY2UuYzogSW5jbHVkZSBlcnJuby5oLGRpcy1hc20uaC4gIERvbid0IGluY2x1ZGUgY3B1LW9wYy5oLgotCShpbnNuX2ZpZWxkcyk6IERlbGV0ZS4KLQkodHJhY2VfaW5zbl9maW5pKTogU1RBVEVfT1BDT0RFX1RBQkxFIChzZCkgcmVwbGFjZWQgd2l0aAotCUNQVV9DUFVfREVTQyAoY3B1KS4KLQkodHJhY2VfaW5zbik6IENhbGwgQ1BVX0RJU0FTU0VNQkxFUiBob29rLgotCShzaW1fZGlzYXNtX3NwcmludGYpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9kaXNhc21fcmVhZF9tZW1vcnkpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9kaXNhc21fcGVycm9yX21lbW9yeSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNnZW4tdXRpbHMuYzogRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmguCi0JKHZpcnR1YWxfaW5zbl9lbnRyaWVzKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2dlbl92aXJ0dWFsX2luc25fdGFibGUpOiBSZW5hbWVkIGZyb20gY2dlbl92aXJ0dWFsX29wY29kZV90YWJsZS4KLQkoY2dlbl9pbnNuX25hbWUpOiBSZXdyaXRlLgotCShkaXNhc21fc3ByaW50ZixzaW1fZGlzYXNzZW1ibGVfaW5zbik6IE1vdmVkIHRvIGNnZW4tdHJhY2UuYy4KLQkqIGNnZW4uc2ggKGRlc2MpOiBOZXcgZmlsZSBnZW5lcmF0b3IgaGFuZGxlci4KLQkqIGdlbm1sb29wLnNoOiAtcGFyYWxsZWwgY2hhbmdlZCB0byAtcGFyYWxsZWwtcmVhZC8tcGFyYWxsZWwtd3JpdGUuCi0JRGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRC9XSVRIX1BBUkFMTEVMX1dSSVRFIGFwcHJvcHJpYXRlbHkuCi0JRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsY3B1LXNpbS5oLgotCSogc2ltLW1vZGVsLmMgKG1vZGVsX3NldCk6IERlbGV0ZSBTSU1fREVTQyBhcmcuCi0JKHNpbV9tb2RlbF9zZXQpOiBVcGRhdGUuCi0JKiBzaW0tbW9kZWwuaCAoTUFDSCk6IE5ldyBtZW1iZXIgcHJlcGFyZV9ydW4uCi0KLTE5OTktMDEtMjggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogQXZvaWQgbWVtc2V0KCkgY2FsbHMKLQlpZiByZWR1bmRhbnQgd2l0aCBhbGxvY2F0b3IgZnVuY3Rpb25zLgotCi1XZWQgSmFuIDI3IDE3OjE5OjA5IDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZW5naW5lLmggKEVYVFJBQ1RfTFNCMF97SU5ULFVJTlR9KTogRml4LgotCi0JKiBzaW0tcHJvZmlsZS5oOiBNYWtlIGxpa2Ugc2ltLXRyYWNlLmguCi0JKFBST0ZJTEVfVVNFRlVMX01BU0spOiBOZXcgbWFjcm8uCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX29wdGlvbnMpOiBNYWtlIGxpa2UgdHJhY2Vfb3B0aW9ucywgYWxsb3cKLQlvcHRpb25hbCBvbnxvZmYgYXJnIHdoZXJlIGFwcGxpY2FibGUuCi0JKHNldF9wcm9maWxlX29wdGlvbl9tYXNrKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcHJvZmlsZV9zZXRfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwcm9maWxlX29wdGlvbl9oYW5kbGVyKTogU2ltcGxpZnkuCi0JSGF2ZSAtcCBvbmx5IGVuYWJsZSBzZWxlY3RlZCB0aGluZ3MsIG5vdCBldmVyeXRoaW5nLgotCUFkZCBtaXNzaW5nIGJyZWFrIHRvIE9QVElPTl9QUk9GSUxFX1BDX1JBTkdFLgotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX29wdGlvbnMpOiBBbGxvdyBvcHRpb25hbCBvbnxvZmYgYXJnIHRvCi0JLS1wcm9maWxlLXNjYWNoZS4KLQkoc2NhY2hlX29wdGlvbl9oYW5kbGVyKTogVXNlIHNpbV9wcm9maWxlX3NldF9vcHRpb24uCi0KLTE5OTktMDEtMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbnMpOiBBZGQgTUVNT1JZX0ZJTEwgb3B0aW9uLgotCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBJbXBsZW1lbnQgTUVNT1JZX0ZJTEwgb3B0aW9uLiAgTWFrZQotIAlNRU1PUllfQ0xFQVIgYW4gYWxpYXMgZm9yIE1FTU9SWV9GSUxMPTAuCi0JKHBhcnNlX3Vsb25nX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShkb19tZW1vcHRfYWRkKTogQWxsb2NhdGUgYWxsIGJ1ZmZlcnMuICBPcHRpb25hbGx5IGZpbGwgdGhlbS4KLQotMTk5OS0wMS0xNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaHctZXZlbnRzLmMgKGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlKTogX3Z0cmFjZWYgdGFrZXMgYQotCXZhX2xpc3QsIG5vdCBhbiBpbnRlZ2VyLgotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3NjaGVkdWxlKTogTGlrZXdpc2UuCi0KLQkqIHNpbS10eXBlcy5oIChVTlNJR05FRDMyLCBVTlNJR05FRDY0KTogUHJvcGVybHkgY2FzdCB0byAKLQl0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLQotMTk5OS0wMS0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWRlZnMuaCAoUENBRERSLENJQSk6IERlZmluZSBpbiB0ZXJtcyBvZiBJQUREUi4KLQkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgotCShzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IERpdHRvLgotCSogY2dlbi1lbmdpbmUuaCAoU0VNQU5USUNfRk4pOiBBZGQgIVdJVEhfU0NBQ0hFIHZlcnNpb24uCi0JKFNFTV9CUkFOQ0hfSU5JVCk6IFBDQUREUi0+SUFERFIuCi0JKFNFTV9OQlJBTkNIX0ZJTkkpOiBOZXcgbWFjcm8gZm9yICFXSVRIX1NDQUNIRSBjYXNlLgotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX2xvb2t1cCxzY2FjaGVfbG9va3VwX29yX2FsbG9jKTogUENBRERSLT5JQUREUi4KLQkqIGNnZW4tc2NhY2hlLmggKCopOiBEaXR0by4KLQkqIGNnZW4tdHJhY2UuYyAoKik6IERpdHRvLgotCSogY2dlbi10cmFjZS5oICgqKTogRGl0dG8uCi0JKiBjZ2VuLXV0aWxzLmMgKCopOiBEaXR0by4KLQkqIGNnZW4tdHlwZXMuaCAoaW50ZWdlciBtb2Rlcyk6IFVzZSBzaWduZWROTi91bnNpZ25lZE5OIHR5cGVzLgotCShpbnNuX3QpOiBEZWxldGUuCi0JKiBnZW5tbG9vcC5zaCAoQGNwdUBfZmlsbF9hcmdidWYpOiBBZGQgIVdJVEhfU0NBQ0hFIHN1cHBvcnQuCi0JKHNpbXBsZSBlbmdpbmUgZnJhbWV3b3JrKTogUmV3cml0ZS4KLQkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IEluc3RhbGwgbW9kZWwgbW9kdWxlIHNvb25lciAoYW5kIGluCi0JcGFydGljdWxhciBiZWZvcmUgdGhlIHByb2ZpbGUgbW9kdWxlKS4KLQotMTk5OS0wMS0xMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBzaW0tbW9kZWwuaCAoc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lKTogQWRkIHByb3RvdHlwZS4KLQkqIHNpbS1tb2RlbC5jIChzaW1fbWFjaF9sb29rdXBfYmZkX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9tb2RlbF9pbml0KTogQ2FsbCBpdC4KLQotCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuKTogUGFzcyBwYyB0byB0cmFjZV9wcmVmaXggZm9yIHZpcnR1YWwgaW5zbnMuCi0KLTE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKENHRU5fSU5DTFVERV9ERVBTKTogQWRkIGNnZW4tZGVmcy5oLCBjZ2VuLWVuZ2luZS5oLgotCSogY2dlbi1lbmdpbmUuaCAoU0VNX0JSQU5DSF9GSU5JKTogTmV3IGFyZyBwY3ZhciwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QpOiBOZXcgbWFjcm8uCi0JKFNFTV9CUkFOQ0hfSU5JVCk6IEFkZCB0YWtlbl9wLgotCShUQVJHRVRfU0VNX0JSQU5DSF9GSU5JKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKFNFTV9CUkFOQ0hfRklOSSk6IFVzZSBpdC4KLQkoU0VNX0lOU04pOiBVcGRhdGUuCi0JKiBjZ2VuLXJ1bi5jIChzaW1fcmVzdW1lKTogSGFuZGxlIHRyYWNpbmcgb2YgbGFzdCBpbnNuLgotCSogY2dlbi1zY2FjaGUuaCAoV0lUSF9TQ0FDSEUpOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KLQkqIGNnZW4tdHJhY2UuYyAoY3VycmVudF9hYnVmKTogTmV3IHN0YXRpYyBnbG9iYWwuCi0JKHRyYWNlX2luc25faW5pdCk6IEluaXRpYWxpemUgaXQuCi0JKHRyYWNlX2luc25fZmluaSk6IFVzZSBpdC4KLQkodHJhY2VfaW5zbik6IFNldCBpdC4KLQkqIGNnZW4uc2ggKGFyY2ggY2FzZSk6IFBhc3MgLW0gJHttYWNofSB0byBjZ2VuLgotCSogZ2VubWxvb3Auc2ggKEBjcHVAX2VtaXRfYmVmb3JlKTogT25seSBkZWZpbmUgaWYgV0lUSF9TQ0FDSEVfUEJCLgotCShAY3B1QF9lbWl0X2FmdGVyKTogRGl0dG8uCi0JKHNpbXBsZSBAY3B1QF9lbmdpbmVfcnVuX2Z1bGwpOiBOZXcgbG9jYWwgYHBjJy4gIEluaXRpYWxpemUgc2VtYW50aWMKLQlsYWJlbHMgaWYgV0lUSF9TRU1fU1dJVENIX0ZVTEwuCi0JKiBzaW0tbW9kZWwuYzogSW5jbHVkZSBiZmQuaC4KLQkoc2ltX21vZGVsX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9tb2RlbF9pbnN0YWxsKTogUmVjb3JkIGluaXQgZm4uCi0JKiBzaW0tbW9kZWwuaCAoTUFDSCk6IE5ldyBtZW1iZXIgYmZkX25hbWUuCi0JKiBzaW0tbW9kdWxlLmMgKG1vZHVsZXMpOiBJbml0aWFsaXplIG1vZGVsIGJlZm9yZSBzY2FjaGUuCi0KLTE5OTgtMTItMjQgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGR2LXNvY2tzZXIuYyAoREVGQVVMVF9USU1FT1VUKTogSW5jcmVhc2UgdG8gMSBtcy4KLQkKLQkqIG5ydW4uYyAobWFpbik6IFJlbWFpbiBpbiBzaW11bGF0aW9uIGxvb3AgZm9yIHRyYXBzIGFuZAotIAlleGNlcHRpb25zIHdoZW4gaW4gb3BlcmF0aW5nIGVudmlyb25tZW50IG1vZGUuCi0JKHVpX2xvb3BfaG9vayk6IE5ldyBzdHViIGhvb2sgZm9yIHN0YW5kYWxvbmUgdXNlLgotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBDYWxsIHVpX2xvb3BfaG9vawotCXBlcmlvZGljYWxseSBvbiBDWUdXSU4gaG9zdC4KLQotCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBSZXR1cm4gaG9zdCBzaWduYWwgbnVtYmVycwotCXRvIGdkYiBvbiBzaW1fc3RvcHBlZCBhbmQgc2ltX3NpZ25hbGxlZCBjYXNlcy4KLQkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9oYWx0KTogQ2FsbCBTSU1fQ1BVX0VYQ0VQVElPTl9TVVNQRU5ECi0gCWhvb2sganVzdCBiZWZvcmUgbG9uZ2ptcC4KLQkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IENhbGwgU0lNX0NQVV9FWENFUFRJT05fUkVTVU1FCi0gCWhvb2sganVzdCBiZWZvcmUgc2ltX2VuZ2luZV9ydW4uCi0KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfdHJhY2VfTSk6IEFsbGF5IGNvbnN0IHdhcm5pbmcuCi0JKiBzaW0tdHJhY2UuaCAodHJhY2VfZ2VuZXJpYyk6IERpdHRvLgotCSogc2ltLXRyYWNlLmMgKHRyYWNlX2dlbmVyaWMpOiBEaXR0by4KLQkKLTE5OTgtMTItMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKFNJTV9NQUlOX0RFUFMpOiBOZXcgdmFyLgotCShDR0VOX01BSU5fQ1BVX0RFUFMpOiBOZXcgdmFyLgotCSogYWNsb2NhbC5tNDogQWRkIC0tZW5hYmxlLWNnZW4tbWFpbnQgb3B0aW9uLgotCSogY2dlbi1tZW0uaCAoR0VUTUVNKik6IE5ldyBhcmcgYHBjJy4gIFBhc3MgdG8gc2ltX2NvcmUgcm91dGluZS4KLQkoU0VUTUVNKik6IERpdHRvLgotCShHRVRJTUVNKik6IFBhc3MgcGMgdmFsdWUgdG8gc2ltX2NvcmUgcm91dGluZS4KLQotRnJpIERlYyAxMSAxNjo1ODozNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LWhhbmRsZXMuYyAoaHdfaGFuZGxlX2FkZF9paGFuZGxlLCBod19oYW5kbGVfYWRkX3BoYW5kbGUpOgotIAlDb21wYXJlIHdpdGggWkVSTyBub3QgTlVMTC4KLQotVGh1IERlYyAxMCAxNDoxNDozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LXByb3BlcnRpZXMuYywgaHctaW5zdGFuY2VzLmMsIGh3LXRyZWUuYzogSW5jbHVkZQotIAkic2ltLWFzc2VydC5oIi4KLQotMTk5OC0xMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBzaW0tYXJhbmdlLmM6IEluY2x1ZGUgbGliaWJlcnR5LmgsIGFuZCBzdGRsaWIuaCBpZiBwcmVzZW50LgotCSogc2ltLXRyYWNlLmM6IEluY2x1ZGUgc3RkbGliLmggaWYgcHJlc2VudC4KLQkqIGR2LXNvY2tzZXIuYzogSW5jbHVkZSB1bmlzdGQuaCBpZiBwcmVzZW50LgotCShkdl9zb2Nrc2VyX2luaXQpOiBBZGQgbWlzc2luZyBhcmcgdG8gY2FsbCB0byBzaW1faW9fZXByaW50Zi4KLQkqIGNnZW4tc2NhY2hlLmMgKHNjYWNoZV9mbHVzaCk6IERlbGV0ZSB1bnVzZWQgbG9jYWxzIGksc2MuCi0KLTE5OTgtMTItMDggIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgotCi0JKiBnZW5ubHR2YWxzLnNoOiBBZGQgaTk2MC4KLQkqIG5sdHZhbHMuZGVmOiBSZWJ1aWxkLgotCi0xOTk4LTEyLTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZGVmcy5oOiBOZXcgZmlsZSwgb2xkIGNnZW4tc2ltLmguCi0JKiBjZ2VuLXNpbS5oOiBTaW1wbGUgaGVhZGVyIHRoYXQgaW5jbHVkZXMgb3RoZXJzLgotCSogc2ltLWFyYW5nZS5jOiBOZXcgZmlsZS4KLQkqIHNpbS1hcmFuZ2UuaDogTmV3IGZpbGUuCi0JKiBzaW0tYmFzaWNzLmg6IEluY2x1ZGUgaXQuCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX05FV19DT01NT05fT0JKUyk6IEFkZCBzaW0tYXJhbmdlLm8uCi0JKHNpbS1hcmFuZ2Uubyk6IEFkZCBydWxlIGZvci4KLQkqIHNpbS1jcHUuaCAoc2ltX2NwdV9tc2dfcHJlZml4KTogQWRkIHByb3RvdHlwZS4KLQkoc2ltX2lvX2VwcmludGZfY3B1KTogQWRkIHByb3RvdHlwZS4KLQkqIHNpbS1pbmxpbmUuaCAoSEFWRV9JTkxJTkUpOiBEZWZpbmUgaWYgR05VQy4KLQkoSU5MSU5FMik6IE5ldyBtYWNyby4KLQkoRVhURVJOX0lOTElORSk6IE5ldyBtYWNyby4KLQkqIHNpbS1tb2R1bGUuYyAoc2ltX3Bvc3RfYXJndl9pbml0KTogSW5pdGlhbGl6ZSBjcHUgYmFja2xpbmsKLQliZWZvcmUgY2FsbGluZyBtb2R1bGUgaW5pdCBmbnMuCi0JKiBzaW0tcHJvZmlsZS5jIChPUFRJT05fUFJPRklMRV8qKTogTW92ZSBpbnRvIGVudW0uCi0JKHByb2ZpbGVfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvZmlsZV9vcHRpb25zKTogTmV3IG9wdGlvbiAtLXByb2ZpbGUtcmFuZ2UuCi0JKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgLS1wcm9maWxlLXJhbmdlLgotCShwcm9maWxlX3ByaW50X2luc24pOiBRdWFsaWZ5IGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWMgc2VjdGlvbiB0aXRsZXMuCi0JKHByb2ZpbGVfcHJpbnRfYWRkcl9yYW5nZXMpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2ZpbGVfaW5mbyk6IFByaW50IGFkZHJlc3MgcmFuZ2VzIGlmIHNwZWNpZmllZC4KLQkocHJvZmlsZV9pbnN0YWxsKTogU2V0IHByb2ZpbGVfaW5pdCBpbml0IGZuLgotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogTmV3IG1lbWJlciBgcmFuZ2UnLgotCSogc2ltLXRyYWNlLmMgKHRyYWNlX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHRyYWNlX29wdGlvbnMpOiBOZXcgb3B0aW9uIC0tdHJhY2UtcmFuZ2UuCi0JKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogSGFuZGxlIC0tdHJhY2UtcmFuZ2UuCi0JKHRyYWNlX2luc3RhbGwpOiBTZXQgdHJhY2VfaW5pdCBpbml0IGZuLgotCSogc2ltLXRyYWNlLmggKFRSQUNFX0RBVEEpOiBOZXcgbWVtYmVyIGByYW5nZScuCi0JKiBzaW0tdXRpbHMuYyAoc2ltX2NwdV9tc2dfcHJlZml4KTogTmV3IGZ1bmN0aW9uLgotCShzaW1faW9fZXByaW50Zl9jcHUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLWVuZ2luZS5oIChQQ19JTl9UUkFDRV9SQU5HRV9QKTogTmV3IG1hY3JvLgotCShQQ19JTl9QUk9GSUxFX1JBTkdFX1ApOiBOZXcgbWFjcm8uCi0JKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2luc25faW5pdCk6IFNldCBjdXJyZW50X2luc24gdG8gTlVMTC4KLQkodHJhY2VfaW5zbl9maW5pKTogTmV3IGFyZyBhYnVmLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQlFeGl0IGVhcmx5IGlmIHRyYWNlX2luc24gbm90IGNhbGxlZC4gIENoZWNrIEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlCi0JcHJpbnRpbmcgY3ljbGUgY291bnRzLgotCSogY2dlbi10cmFjZS5oICh0cmFjZV9pbnNuX2ZpbmkpOiBVcGRhdGUgcHJvdG90eXBlLgotCShUUkFDRV9SRVNVTFRfUCk6IE5ldyBtYWNyby4KLQkoVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSSk6IE5ldyBhcmcgYWJ1Zi4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKFRSQUNFX0lOU04pOiBDaGVjayBBUkdCVUZfVFJBQ0VfUC4KLQkoVFJBQ0VfRVhUUkFDVCxUUkFDRV9SRVNVTFQpOiBOZXcgYXJnIGFidWYuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCSogY2dlbi10eXBlcy5oIChTSU1fSU5MSU5FKTogRGVsZXRlLgotCShTSU1fSEFWRV9NT0RFTCxTSU1fSEFWRV9BRERSX1JBTkdFKTogRGVmaW5lLgotCSogY2dlbi11dGlscy5jOiBEb24ndCBpbmNsdWRlIGNnZW4tZW5naW5lLmgKLQkqIGdlbm1sb29wLnNoIChAY3B1QF9maWxsX2FyZ2J1Zik6IE5ldyBmdW5jdGlvbi4KLQkoQGNwdUBfZmlsbF9hcmdidWZfdHApOiBOZXcgZnVuY3Rpb24uCi0JKEBjcHVAX2VtaXRfYmVmb3JlLEBjcHVAX2VtaXRfYWZ0ZXIpOiBOZXcgZnVuY3Rpb25zLgotCShAY3B1QF9wYmJfYmVnaW4pOiBQcmVmaXggY3RpX3NjLGluc25fY291bnQgd2l0aCAnXycuCi0JKFNFVF9DVElfVlBDLFNFVF9JTlNOX0NPVU5UKTogVXBkYXRlLgotCShAY3B1QF9wYmJfYmVmb3JlKTogQ2hlY2sgQVJHQlVGX1BST0ZJTEVfUCBiZWZvcmUgY2FsbGluZwotCWRvaW5nIHByb2ZpbGluZy4gIFVwZGF0ZSBjYWxsIHRvIFRSQUNFX0lOU05fSU5JVCxUUkFDRV9JTlNOX0ZJTkkuCi0JKEBjcHVAX3BiYl9hZnRlcik6IENoZWNrIEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlIGNhbGxpbmcKLQlkb2luZyBwcm9maWxpbmcuIFVwZGF0ZSBjYWxsIHRvIFRSQUNFX0lOU05fRklOSS4KLQotCSogc2ltLW1lbW9wdC5jIChzaW1fbWVtb3J5X3VuaW5zdGFsbCk6IFJlc3VsdCB0eXBlIGlzIGB2b2lkJy4KLQotMTk5OC0xMi0wMyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogc2ltLW1lbW9wdC5jIChzaW1fbWVtb3J5X3VuaW5zdGFsbCk6IERlYWxsb2NhdGUgYWxsIG1lbW9yeQotIAlyZWdpb25zLgotCi0xOTk4LTEyLTAxICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pbmxpbmUuYyAoU0lNX0lOTElORV9QKTogRml4IHR5cG8uCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi11dGlscy5jIChjZ2VuX3ZpcnR1YWxfb3Bjb2RlX3RhYmxlKTogVXBkYXRlLgotCi1UdWUgTm92IDI0IDE4OjQwOjAzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2Vubmx0dmFscy5zaDogQWRkIHY4NTAgYW5kIGQxMHYuIFNvcnQgYWxwaGFiZXRpY2FsbHkuCi0JKiBubHR2YWxzLmRlZjogUmUtZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMjMgMTM6Mjg6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5jIChyZXZlcnNlX24sIHNpbV9jb3JlX3VuaW5zdGFsbCwgc2ltX2NvcmVfaW5pdCwKLSAJc2ltX2NvcmVfbWFwX2F0dGFjaCwgc2ltX2NvcmVfbWFwX2RldGFjaCwgbmV4dF9ldmVudF9xdWV1ZSwKLSAJbmV3X3NpbV9jb3JlX21hcHBpbmcpOiBPbmx5IGRlZmluZSB3aGVuIEVYVEVSTl9TSU1fQ09SRV9QLCBwYWNpZnkKLSAJR0NDLgotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3VuaW5zdGFsbCwgc2ltX2V2ZW50c19zdXNwZW5kLAotIAlzaW1fZXZlbnRzX3Jlc3VtZSwgc2ltX2V2ZW50c196YWxsb2MsIGluc2VydF9zaW1fZXZlbnQpOiBEaXR0by4KLQotMTk5OC0xMS0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBnZW5tbG9vcC5zaCAoJHtjcHV9X3BiYl9jaGFpbik6IFdhdGNoIGZvciBDdHJsLUMncy4KLQkoJHtjcHV9X3BiYl9jdGlfY2hhaW4pOiBEaXR0by4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoY2dlbi11dGlscy5vKTogRGVwZW5kIG9uIGNnZW4tZW5naW5lLmguCi0JKiBjZ2VuLWVuZ2luZS5oIChFWFRSQUNUX1tNTF1TQjBfe0lOVCxVSU5UfSk6IE5ldyBtYWNyb3MuCi0JKEVYVFJBQ1RfSU5ULEVYVFJBQ1RfVUlOVCk6IE5ldyBtYWNyb3MuCi0JKFNFTV9TRU1fQVJHKTogTmV3IG1hY3JvLgotCShTRU1fTkVYVF9WUEMpOiBOZXcgYXJnIGBwYycuCi0JKiBjZ2VuLXNpbS5oIChFWFRSQUNUX1NJR05FRCxFWFRSQUNUX1VOU0lHTkVEKTogRGVsZXRlLgotCShzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBjZ2VuLXRyYWNlLmMgKGN1cnJlbnRfaW5zbixpbnNuX2ZpZWxkcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCSh0cmFjZV9pbnNuKTogU2V0IHRoZW0uCi0JKiBjZ2VuLXV0aWxzLmM6ICNpbmNsdWRlIGNnZW4tZW5naW5lLmguCi0JKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBpbnNuX2ZpZWxkcy4KLQlIYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotCSogZ2VubWxvb3Auc2g6IE9ubHkgZW1pdCBwYmIgZGVjbHMgaWYgLXBiYi4KLQkoJHtjcHV9X3NjYWNoZV9sb29rdXApOiBOZXcgYXJnIGB2cGMnLgotCShzY2FjaGUgc3VwcG9ydCk6IEZldGNoIHBjIGJlZm9yZSBlbnRlcmluZyBsb29wLgotCi0JKiBnZW5ubHR2YWxzLnNoOiBBZGQgZnIzMCBzdXBwb3J0LgotCSogbmx0dmFscy5kZWY6IFJlYnVpbGQuCi0KLVdlZCBOb3YgMTggMTA6MjI6MjIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHlwZXMuaDogUmUtZG8gdHlwZSBzeXN0ZW0gc28gdGhhdCBHQ0MncyBhdHRyaWJ1dGUgYW5kIG1vZGUKLSAJYXJlIHVzZWQgdG8gc3BlY2lmeSB0eXBlcy4gIEhhbmRsZSBjYXNlIG9mIEFMUEhBLgotCi0xOTk4LTExLTEzICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBlbGFzdGljLm9yZz4KLQkKLQkqIGFjbG9jYWwubTQ6IEFkZCB0ZXN0cyBmb3IgZGxvcGVuIGZhbWlseS4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0JCi1XZWQgTm92IDExIDE0OjAyOjI1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFBhc3MgYHByb2dfbmFtZScgdG8gc2ltX2xvYWRfZmlsZSwgbm90IE5VTEwuCi0KLVdlZCBOb3YgIDQgMjM6NTE6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGdlbm1sb29wLnNoIChlbmcuaGluKTogUmVuYW1lIEhBVkVfUEFSQUxMRUxfRVhFQyB0bwotCUhBVkVfUEFSQUxMRUxfSU5TTlMsIGRlZmluZSBhcyAwIG9yIDEuICBFbWl0IGRlY2xzIG9mIGZucyBpbiBtbG9vcC5jaW4uCi0JKiBjZ2VuLWVuZ2luZS5oOiBUeXBlZGVmcyBvZiBJQUREUixDSUEsU0VNX0FSRyxTRU1fUEMgbW92ZWQgLi4uCi0JKiBjZ2VuLXNpbS5oOiAuLi4gdG8gaGVyZS4KLQotV2VkIE9jdCAyOCAxMjowMDo1NyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKGVuYWJsZS1idWlsZC13YXJuaW5ncyk6IFJlcGxhY2UKLSAJZW5hYmxlLXNpbS13YXJuaW5ncy4gRXh0ZW5kID1MSVNUIHN5bnRheCBzbyB0aGF0IHByZXBlbmQgYW5kCi0gCWFwcGVuZCBvZiBvcHRpb25zIGlzIHBvc3NpYmxlLiAgRHJvcCAtV2Vycm9yLCBhZGQKLSAJLVdzdHJpY3QtcHJvdG90eXBlcyBmb3IgR0RCIGNvbXBhdGliaWxpdHkuCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX1dBUk5JTkdTKTogVXBkYXRlLgotCi1Nb24gT2N0IDE5IDEzOjU2OjMyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoQ0dFTl9JTkNMVURFX0RFUFMpOiBEZWZpbmUuCi0JKHNpbS1jb3JlLm8pOiBEZWxldGUgZHVwbGljYXRlIGRlcGVuZGVuY2Ugb24gJChTSU1fRVhUUkFfREVQUykuCi0JKHNpbS1jcHUubyxzaW0tZW5kaWFuLm8sc2ltLWh3Lm8pOiBEaXR0by4KLQkoY2dlbi1ydW4ubyxjZ2VuLXNjYWNoZS5vLGNnZW4tdHJhY2UubyxjZ2VuLXV0aWxzLm8pOiBEZWxldGUKLQlleHBsaWNpdCBjZ2VuIGhlYWRlciBkZXBlbmRlbmNpZXMsIHJlcXVpcmUgU0lNX0VYVFJBX0RFUFMgdG8gaW5jbHVkZQotCUNHRU5fSU5DTFVERV9ERVBTLgotCSogY2dlbi1jcHUuaDogTmV3IGZpbGUuCi0JKiBjZ2VuLWVuZ2luZS5oOiBOZXcgZmlsZS4KLQkqIGNnZW4tc2NhY2hlLmg6IE5ldyBmaWxlLgotCSogY2dlbi1zaW0uaDogRGVsZXRlIHBvcnRpb25zIG1vdmVkIHRvIG5ldyBmaWxlcy4KLQkqIGdlbm1sb29wLnNoOiBHZW5lcmF0ZSB0d28gZmlsZXMgZW5nLmhpbixtbG9vcC5jaW4gZXhwbGljaXRseSwKLQlyYXRoZXIgdGhhbiBzZW5kaW5nIHJlc3VsdCB0byBzdGRvdXQuCi0KLUZyaSBPY3QgIDkgMTQ6MjA6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChzaW0tcmVnLm8pOiBOZXcgcnVsZS4KLQkoY2dlbi1ydW4ubyk6IE5ldyBydWxlLgotCSogY2dlbi1vcHMuaDogRGVsZXRlIG1hbnkgQkkgbWFjcm9zLiAgQ2hhbmdlIGFsbCBVQkkgLT4gQkkuCi0JKiBjZ2VuLXJ1bi5jIChwcmltZV9jcHUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLXNjYWNoZS5jOiBBZGQgcHNldWRvLWJhc2ljLWJsb2NrIChwYmIpIHNjYWNoaW5nIHN1cHBvcnQuCi0JKHNjYWNoZV9vcHRpb25faGFuZGxlciwgY2FzZSBPUFRJT05fUFJPRklMRV9TQ0FDSEUpOiBIYW5kbGUgZXhwbGljaXRseQotCW1lbnRpb25lZCBjcHUuCi0JKHNjYWNoZV9mbHVzaF9jcHUsc2NhY2hlX2xvb2t1cCxzY2FjaGVfbG9va3VwX29yX2FsbG9jKTogTmV3IGZucy4KLQkqIGNnZW4tc2ltLmggKENHRU5fSU5TTl9WSVJUVUFMX1RZUEUpOiBOZXcgZW51bS4KLQkoQ0dFTl9JTlNOX1ZJUlRVQUxfUCk6IE5ldyBtYWNyby4KLQkoU0VNX1BDKTogTmV3IHR5cGVkZWYuCi0JKFNFTUFOVElDX0ZOKTogQ2hhbmdlIHR5cGUgb2YgcmVzdWx0IHRvIFNFTV9QQy4KLQkoU0VNX1NFVF9GVUxMX0NPREUsU0VNX1NFVF9GQVNUX0NPREUsU0VNX1NFVF9DT0RFKTogTmV3IG1hY3Jvcy4KLQkoSURFU0NfQ1RJX1AsSURFU0NfU0tJUF9QKTogTmV3IG1hY3Jvcy4KLQkoU0NBQ0hFX01BUCk6IE5ldyB0eXBlZGVmLgotCShDUFVfU0NBQ0hFKTogQWRkIHBiYiBzdXBwb3J0LgotCShzY2FjZV9sb29rdXAsc2NhY2hlX2xvb2t1cF9vcl9hbGxvYyxzY2FjaGVfZmx1c2hfY3B1KTogRGVjbGFyZS4KLQkoU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QsU0VNX0JSQU5DSF9JTklULFNFTV9CUkFOQ0hfRklOSSk6IE5ldyBtYWNyb3MuCi0JKENHRU5fQ1BVKTogTmV3IG1lbWJlcnMgcnVubmluZ19wLGluc25fY291bnQse2Zhc3QsZnVsbH1fZW5naW5lX2ZuLAotCW1heF9zbGljZV9pbnNucy4KLQkoSU5TTl9OQU1FKTogRGVsZXRlLgotCShjZ2VuX2luc25fbmFtZSk6IERlY2xhcmUuCi0JKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUmVuYW1lZCBmcm9tIHNpbV9lbmdpbmVfaWxsZWdhbF9pbnNuLgotCSogY2dlbi10cmFjZS5jICh0cmFjZV9idWYpOiBTaHJpbmsgZnJvbSAxMDI0IHRvIDI1NiBieXRlcy4KLQkoZmlyc3RfaW5zbl9wKTogTWFrZSBzdGF0aWMuCi0JKHRyYWNlX2luc24pOiBIYW5kbGUgdmlydHVhbCBpbnNucyBzcGVjaWFsbHkuCi0JKGNnZW5fdHJhY2VfcHJpbnRmKTogRW5zdXJlIHdlIGhhdmVuJ3Qgb3ZlcmZsb3dlZCB0aGUgYnVmZmVyLgotCSogY2dlbi10eXBlcy5oIChVQkkpOiBEZWxldGUuCi0JKE1PREVfVFlQRSk6IE5ldyBlbnVtLgotCShIT1NUSU5ULEhPU1RVSU5ULEhPU1RQVFIpOiBEZWxldGUuCi0JKiBjZ2VuLXV0aWxzLmMgKG1vZGVfbmFtZXMpOiBEZWxldGUgVUJJLiAgQWRkIElOVCxVSU5ULFBUUi4KLQkoY2dlbl92aXJ0dWFsX29wY29kZV90YWJsZSk6IE5ldyBnbG9iYWwuCi0JKGNnZW5faW5zbl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fZGlzYXNzZW1ibGVfaW5zbik6IElnbm9yZSB2aXJ0dWFsIGluc25zLgotCSogZ2VubWxvb3Auc2g6IERlbGV0ZSB0b3AgbGV2ZWwgbG9vcCBnZW5lcmF0aW9uLiAgQWRkIHBiYiBzdXBwb3J0LgotCSogc2ltLWNwdS5oIChDUFVfSU5TTl9OQU1FX0ZOKTogTmV3IHR5cGVkZWYuCi0JKHNpbV9jcHVfYmFzZSk6IE5ldyBtZW1iZXJzIG1heF9pbnNucyxpbnNuX25hbWUsbW9kZWxfZGF0YS4KLQkoQ1BVX1BDX0dFVCxDUFVfUENfU0VUKTogTmV3IG1hY3Jvcy4KLQkoc2ltX3BjX2dldCxzaW1fcGNfc2V0KTogRGVjbGFyZS4KLQkqIHNpbS1tb2RlbC5jIChtb2RlbF9zZXQpOiBDYWxsIG1vZGVsIGluaXQgZm4uCi0JKiBzaW0tbW9kZWwuaCAoTU9ERUxfRk4pOiBOZXcgdHlwZWRlZi4KLQkoSU5TTl9USU1JTkcpOiBOZXcgbWVtYmVyIG1vZGVsX2ZuLgotCShNT0RFTCk6IE5ldyBtZW1iZXJzIG51bSxpbml0LgotCSogc2ltLXByb2ZpbGUuYyAoc2ltX3Byb2ZpbGVfcHJpbnRfYmFyKTogUmVuYW1lZCBmcm9tIHByaW50X2Jhci4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLgotCShwcm9maWxlX2luc25faW5pdCk6IE5ldyBmbi4KLQkocHJvZmlsZV9wcmludF9pbnNuKTogVXBkYXRlLCBJTlNOX05BTUUgLT4gQ1BVX0lOU05fTkFNRS4KLQlFeGl0IGVhcmx5IGlmIGluc24gcHJvZmlsaW5nIG5vdCBzdXBwb3J0ZWQuCi0JKHByb2ZpbGVfcHJpbnRfbWVtb3J5KTogVXBkYXRlLCBNQVhfTU9ERVMgLT4gTU9ERV9UQVJHRVRfTUFYLgotCShwcm9maWxlX2luc3RhbGwpOiBSZWNvcmQgcHJvZmlsZV9pbnNuX2luaXQgYXMgaW5pdCBmbi4KLQkocHJvZmlsZV91bmluc3RhbGwpOiBGcmVlIFBST0ZJTEVfSU5TTl9DT1VOVCBpZiBub24tbnVsbC4KLQkqIHNpbS1wcm9maWxlLmg6IFVwZGF0ZSwgTUFYX01PREVTIC0+IE1PREVfVEFSR0VUX01BWC4KLQkoUFJPRklMRV9EQVRBKTogRGVsZXRlIG1lbWJlciBleGVjX3RpbWUuCi0JQ2hhbmdlIGluc25fY291bnQgdG8gcG9pbnRlciB0byBhcnJheSwgcmF0aGVyIHRoYW4gdGhlIGFycmF5LgotCShzaW1fcHJvZmlsZV9wcmludF9iYXIpOiBEZWNsYXJlLgotCi1XZWQgT2N0ICA3IDE2OjU2OjQyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXJ1bi5jOiBOZXcgZmlsZS4KLQkqIHNpbS1yZWcuYzogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTQgMTA6NTg6MTkgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogQWRkIGNoZWNrcyBmb3IgLWxzb2NrZXQgYW5kIC1sbnNsLgotCi0JKiBkdi1zb2Nrc2VyLmMgKGR2X3NvY2tzZXJfaW5pdCk6IFVzZSBTT19SRVVTRUFERFIgdG8KLQlhbGxvdyBsb2NhbCBwb3J0IHJldXNlIG9uIGxpc3RlbmluZyBzb2NrZXQuCi0KLVR1ZSBTZXAgIDEgMTU6MzY6NTIgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5oOiBSZW1vdmUgcmVmZXJlbmNlIHRvIGxpbnV4IGtlcm5lbCBoZWFkZXIuCi0KLVR1ZSBBdWcgMjUgMTI6NDU6MjcgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZHYtc29ja3Nlci5jIChzb2Nrc2VyX2FkZHIpOiBNYWtlIHZhcmlhYmxlIG5vbi1zdGF0aWMuCi0KLU1vbiBBdWcgMjQgMTE6NDc6MzcgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQotCSogc2ltLWh3LntjLGh9IChzaW1faHdfcGFyc2UpOiBSZXR1cm4gc3RydWN0IGh3IHBvaW50ZXIuCi0KLVR1ZSBBdWcgMTEgMTg6MTI6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX2VsYXBzZWRfdGltZSk6IEZpeCBjYWxjdWxhdGlvbi4KLQotVHVlIEF1ZyAgNCAyMDozNjo0NiAxOTk4ICBKZWZmIEhvbGNvbWIgIDxqZWZmaEBjeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoaW5zdGFsbC1jb21tb24pOiBBZGQgJChFWEVFWFQpIHdoZW4gaW5zdGFsbGluZwotCXJ1bi4KLQotTW9uIEF1ZyAgMyAxMTo0NjowMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1zaW0uaCAoY2dlbl9zdGF0ZSk6IE5ldyBtZW1iZXIgb3Bjb2RlX3RhYmxlLgotCSogY2dlbi11dGlscy5jIChzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVzZSBpdC4KLQotRnJpIEp1bCAyNCAxMDoxNDoxOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW1lbS5oIChERUNMQVJFX1NFVFQpOiBGaXggcmV0dXJuIHR5cGUuCi0JKiBjZ2VuLXNpbS5oIChzaW1fZW5naW5lX2lsbGVnYWxfaW5zbik6IERlY2xhcmUuCi0JKiBjZ2VuLXNjYWNoZS5jOiBJbmNsdWRlIHN0ZGxpYi5oLgotCSogY2dlbi10cmFjZS5jICh0cmFjZV9leHRyYWN0KTogVXNlICVseCBmb3IgUENBRERSLgotCSogc2ltLW1vZGVsLmMgKG1vZGVsX29wdGlvbl9oYW5kbGVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgbicuCi0KLVR1ZSBKdWwgMjEgMTY6Mjc6NDMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdXRpbHMuYzogSW5jbHVkZSBiZmQuaC4KLQkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBVcGRhdGUgY2FsbCB0byBDR0VOX0VYVFJBQ1RfRk4uCi0KLVdlZCBKdWwgIDggMTg6MjQ6MTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW0tYml0cy5oIChFWFRFTkQyNCk6IEZpeCB0eXBvLgotCi1XZWQgSnVsICA4IDE3OjQxOjQ3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChFVFJBQ0VfUCk6IE5ldyBtYWNyby4KLQkoc3RydWN0IF9zaW1fZXZlbnQpOiBBZGQgbWVtYmVyIHRyYWNlLgotCShzaW1fZXZlbnRzX2ZyZWUpOiBSZWNsYWltIHRyYWNlIG1lc3NhZ2UuCi0KLQkqIHNpbS1ldmVudHMuYywgc2ltLWV2ZW50cy5oIChzaW1fZXZlbnRzX3NjaGVkdWxlX3Z0cmFjZWYsCi0gCXNpbV9ldmVudHNfc2NoZWR1bGVfdHJhY2VmKTogTmV3IGZ1bmN0aW9ucywgaW5jbHVkZSBwcmludGYgdHJhY2UKLSAJaW5mb3JtYXRpb24gaW4gYXJndW1lbnQgbGlzdC4gIElmIHRyYWNpbmcsIHN0b3JlIGFzcHJpbnRmJ2QgdHJhY2UKLSAJbWVzc2FnZSBpbiBzaW1fZXZlbnQuCi0KLQkqIGh3LWV2ZW50cy5jLCBody1ldmVudHMuaCAoaHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdHJhY2VmLAotIAlod19ldmVudF9xdWV1ZV9zY2hlZHVsZV92dHJhY2VmKTogTmV3IGZ1bmN0aW9ucywgbWltaWMKLSAJc2ltX2V2ZW50X3RyYWNlZi4KLQotTW9uIEp1bCAgNiAxNTo1MToxNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbS1iaXRzLmggKEVYVEVORDI0KTogRGVmaW5lLgotCi1UaHUgSnVsICAyIDE3OjEzOjI1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXNpbS5oIChDUFVfU0NBQ0hFKTogTWFrZSBzaXplIHVuc2lnbmVkLgotCShDUFVfU0NBQ0hFX0hBU0hfTUFTSyk6IE5ldyBtYWNyby4KLQkoU0NBQ0hFX0hBU0hfUEMpOiBSZXdyaXRlLgotCSogZ2VubWxvb3Auc2ggKGVuZ2luZV9yZXN1bWVfe2Z1bGwsZmFzdH0pOiBNb3ZlIHNvbWUgb2YgaGFzaAotCWNvbXB1dGF0aW9uIG91dCBvZiBtYWluIGxvb3AuCi0KLVdlZCBKdWwgIDEgMTY6NDQ6MTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tc2ltLmggKFJFQ09SRF9JQUREUik6IERlbGV0ZS4KLQkqIGNnZW4tdHlwZXMuaCAoSE9TVElOVCxIT1NUVUlOVCxIT1NUUFRSKTogTmV3IHR5cGVzLgotCSogZ2VubWxvb3Auc2ggKGVuZ2luZV9yZXN1bWVfe2Z1bGwsZmFzdH0pOiBEZWxldGUgaWNvdW50LgotCi1XZWQgSnVuIDE3IDEyOjI1OjA4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZ2Vubmx0dmFscy5kZWYgKG1uMTAyMDApOiBBZGQgZW50cnkuCi0JKiBubHR2YWxzLmRlZjogUmVnZW5lcmF0ZSB3aXRoIE1OMTAyMDAgYWRkaXRpb25zLgotCi1XZWQgSnVuIDE3IDEzOjE4OjI4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlubGluZS5oIChFWFRFUk5fKik6IFJlcGxhY2Ugd2l0aCBFWFRFUk5fKl9QLiBDb3JyZWN0Ci0gCWRvY3VtZW50YXRpb24gb24gaG93IGl0IHdvcmtzLgotCi0JKiBzaW0tY29yZS5oLCBzaW0tY29yZS5jIChzaW1fY29yZV9pbnN0YWxsLCBzaW1fY29yZV9hdHRhY2gsCi0gCXNpbV9jb3JlX2RldGFjaCwgc2ltX2NvcmVfcmVhZF9idWZmZXIsIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciwKLSAJc2ltX2NvcmVfc2V0X3hvciwgc2ltX2NvcmVfeG9yX3JlYWRfYnVmZmVyLAotIAlzaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyKTogVXBkYXRlLgotCi0JKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19pbnN0YWxsLAotIAlzaW1fZXZlbnRzX3dhdGNoX2Nsb2NrLCBzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCwKLSAJc2ltX2V2ZW50c19zY2hlZHVsZSwgc2ltX2V2ZW50c193YXRjaF9zaW0sIHNpbV9ldmVudHNfd2F0Y2hfY29yZSwKLSAJc2ltX2V2ZW50c19kZXNjaGVkdWxlKTogVXBkYXRlLgotCi0JKiBzaW0tZnB1LmgsIHNpbS1mcHUuYyAoc2ltX2ZwdV96ZXJvLCBzaW1fZnB1X29uZSwgc2ltX2ZwdV90d28sCi0gCXNpbV9mcHVfbWF4MzIsIHNpbV9mcHVfbWF4NjQpOiBVcGRhdGUuCi0KLVNhdCBKdW4gMTMgMDc6NDU6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BmYWxsaXMuY3lnbnVzLmNvbT4KLQotCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2ZpbmkpOiBSZWRvIGN5Y2xlIGhhbmRsaW5nLgotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogUmVuYW1lIGN5Y2xlIGhhbmRsaW5nIG1lbWJlcnMuCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X21vZGVsKTogVXBkYXRlLgotCi1GcmkgSnVuIDEyIDE4OjM1OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBnZW5ubHR2YWxzLmRlZiAobTMycik6IFVzZSBjb21tb24gc3lzY2FsbC5oIG5vdy4KLQkobW4xMDMwMCk6IEFkZCBlbnRyeS4KLQkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlLgotCi0JKiBzaW0tZW5naW5lLmMgKHNpbV9lbmdpbmVfZ2V0X3J1bl9zdGF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNpbS1lbmdpbmUuaCAoc2ltX2VuZ2luZV9nZXRfcnVuX3N0YXRlKTogRGVjbGFyZSBpdC4KLQotVGh1IEp1biAxMSAwMDo1MDowMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuaCAoU0lNX0NPUkVfU0lHTkFMX0ZOKTogTmV3IHR5cGVkZWYuCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9zaWduYWwpOiBNYWtlIGV4dGVybiwgYWx3YXlzIGRlZmluZS4KLQotV2VkIEp1biAxMCAxNjowMjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKENHRU5fRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZS4KLQkqIGNnZW4tb3BzLmggKEFORElGKTogTmV3IG1hY3JvLgotCShBTkRJRltCUUhTRF1JKTogRGVsZXRlLgotCi1UaHUgSnVuICA0IDEzOjUzOjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctZXZlbnRzLmMgKGNyZWF0ZV9od19ldmVudCwgZGVsZXRlX2h3X2V2ZW50KTogRGVsZXRlLgotCShod19ldmVudF9xdWV1ZV9zY2hlZHVsZSwgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSwKLSAJYm91bmNlX2h3X2V2ZW50KTogRml4IGh3LWV2ZW50IG1lbW9yeSBjb3JydXB0aW9ucyBmb3VuZCBieSBKb3ljZQotIAlKYW5jenluLgotCi0JKiBody1hbGxvYy5oIChIV19OWkFMTE9DKTogRGVmaW5lLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAodGVzdC1ody1ldmVudHMpOiBBZGQgdGFyZ2V0IGZvciB0ZXN0aW5nIHRoZQotIAlody1ldmVudCBjb2RlLgotCi1Nb24gTWF5IDI1IDIxOjExOjI2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKFNJTV9DT01NT05fSFdfT0JKUyk6IEFkZCBody1oYW5kbGVzLm8gYW5kCi0gCWh3LWluc3RhbmNlcy5vLgotCWh3LWhhbmRsZXMuYywgaHctaW5zdGFuY2VzLmMsIGh3LWhhbmRsZXMuaCwgaHctaW5zdGFuY2VzLmg6IE5ldwotIAlmaWxlcy4KLQkqIGh3LW1haW4uaDogSW5jbHVkZSBody1oYW5kbGVzLmgsIGh3LWluc3RhbmNlcy5oLgotCSogaHctYmFzZS5oICh7Y3JlYXRlLGRlbGV0ZX1faHdfe2hhbmRsZXMsaW5zdGFuY2VzfV9kYXRhKTogRGVjbGFyZQotCSogaHctYmFzZS5jIChod19jcmVhdGUsIGh3X2RlbGV0ZSk6IENhbGwgc2FtZS4KLQkKLU1vbiBNYXkgMjUgMTg6NTU6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkdi1jb3JlLmM6IEluY2x1ZGUgaHctbWFpbi5oIGFuZCBzaW0tbWFpbi5oLgotCSogZHYtcGFsLmM6IEluY2x1ZGUgaHctbWFpbi5oIGFuZCBzaW0taW8uaC4KLQkqIGR2LWdsdWUuYzogSW5jbHVkZSBody1tYWluLmguCi0KLQkqIGh3LW1haW4uaDogTmV3IGZpbGUuICBNb3ZlIGxpc3Qgb2YgaW5jbHVkZXMgdG8gaGVyZS4KLQkqIGh3LWJhc2UuaDogRnJvbSBoZXJlLgotCSogTWFrZS1jb21tb24uaW4gKGh3X2Jhc2VfaGVhZGVycyk6IFJlbmFtZSB0byBod19tYWluX2hlYWRlcnMuCi0JKGh3LSoubywgZHYtKi5vKTogVXBkYXRlLgotCSogaHctdHJlZS5jLCBody1iYXNlLmMsIGh3LXByb3BlcnRpZXMuYywgaHctcG9ydHMuYywgaHctZGV2aWNlLmMsCi0gCWh3LWV2ZW50cy5jLCBody1hbGxvYy5jLCBzaW0taHcuYzogSW5jbHVkZSBody1tYWluLmggaW5zdGVhZCBvZgotIAlzaW0tbWFpbi5oLgotCi0JKiBody1iYXNlLmggKGRvX2h3X2F0dGFjaF9yZWdzLCBkb19od19wb2xsX3JlYWRfbWV0aG9kLAotIAlkb19od19wb2xsX3JlYWQpOiBNb3ZlIGRlY2xhcmF0aW9ucyBmcm9tIGhlcmUuCi0JKiBody1tYWluLmg6IFRvIGhlcmUuCi0JCi0JKiBody1iYXNlLmggKHN0cnVjdCBod19kZXZpY2VfZGVzY3JpcHRvciwgaHdfZmluaXNoX2NhbGxiYWNrKToKLSAJTW92ZSBmcm9tIGhlcmUuCi0JKiBody1tYWluLmggKHN0cnVjdCBod19kZXNjcmlwdG9yLCBod19maW5pc2hfbWV0aG9kKTogVG8gaGVyZSwKLSAJcmVuYW1lLgotCSogTWFrZS1jb21tb24uaW4gKGh3LWNvbmZpZy5oKTogVXBkYXRlCi0JKiBody1iYXNlLmMsIGR2LXBhbC5jLCBkdi1nbHVlLmM6IFVwZGF0ZQotCi0JKiBkdi1nbHVlLmMsIGh3LWRldmljZS5oLCBody1iYXNlLmgsIGh3LXBvcnRzLmM6IFJlbmFtZQotIAlgKl9jYWxsYmFjaycgdG8gYCpfbWV0aG9kLgotCi1Nb24gTWF5IDI1IDE4OjQxOjE4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctYmFzZS5oIChzZXRfKik6IE1vdmUgc2V0IG1ldGhvZCBtYWNyb3MgZnJvbSBoZXJlLgotCSogaHctZGV2aWNlLmg6IFRvIGhlcmUuCi0KLU1vbiBNYXkgMjUgMTg6MjE6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBody1iYXNlLmggKGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhLCBkZWxldGVfaHdfcHJvcGVydHlfZGF0YSk6Ci0gCURlY2xhcmUuCi0KLQkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlLCBod19kZWxldGUpOiBDYWxsCi0JKiBody1wcm9wZXJ0aWVzLmMgKGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhLAotIAlkZWxldGVfaHdfcHJvcGVydHlfZGF0YSk6IERlZmluZS4KLQkKLU1vbiBNYXkgMjUgMTc6NDA6NDYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBody1kZXZpY2UuYywgaHctcHJvcGVydGllcy5jOiBJbmNsdWRlIGh3LWJhc2UuaAotCi0JKiBody1hbGxvYy5oLCBody1hbGxvYy5jOiBOZXcgZmlsZXMuIE1vdmUgYWxsb2MgY29kZSB0byBoZXJlLgotCSogaHctZGV2aWNlLmM6IEZyb20gaGVyZS4KLQkqIGh3LWJhc2UuaDogSW5jbHVkZSAiaHctZXZlbnRzLmgiLgotCi0JKiBody1iYXNlLmggKGNyZWF0ZV9od19hbGxvY19kYXRhLCBkZWxldGVfaHdfYWxsb2NfZGF0YSk6IERlY2xhcmUuCi0JKiBody1iYXNlLmMgKGh3X2NyZWF0ZSwgaHdfZGVsZXRlKTogQ2FsbC4KLQkqIGh3LWFsbG9jLmMgKGNyZWF0ZV9od19hbGxvY19kYXRhLCBkZWxldGVfaHdfYWxsb2NfZGF0YSk6IERlZmluZS4KLQotCSogTWFrZS1jb21tb24uaW4gKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgaHctYWxsb2Muby4KLQkoaHctYWxsb2Mubyk6IE5ldyB0YXJnZXQuCi0JCi1Nb24gTWF5IDI1IDE3OjE0OjI3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctZXZlbnRzLmgsIGh3LWV2ZW50cy5jOiBOZXcgZmlsZXMuICBNb3ZlIGV2ZW50IGNvZGUgdG8gaGVyZS4KLSAgCSogc2ltLWh3LmM6IEZyb20gaGVyZS4KLQkqIGh3LWJhc2UuaDogSW5jbHVkZSAiaHctZXZlbnRzLmgiLgotCSogTWFrZS1jb21tb24uaW4gKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgaHctZXZlbnRzLm8uCi0JKGh3LWV2ZW50cy5vKTogTmV3IHRhcmdldC4KLQotCSogaHctZGV2aWNlLmggKHN0cnVjdCBodyk6IEFkZCBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSBldmVudHNfb2ZfaHcuCi0JKiBody1ldmVudHMuaCAoc3RydWN0IGh3X2V2ZW50KTogUmVwbGFjZSB0eXBlZGVmIGh3X2V2ZW50LgotCQotCSogaHctYmFzZS5oIChjcmVhdGVfaHdfZXZlbnRfZGF0YSwgZGVsZXRlX2h3X2V2ZW50X2RhdGEpOiBEZWNsYXJlLgotCSogaHctYmFzZS5jIChod19jcmVhdGUsIGh3X2RlbGV0ZSk6IENhbGwuCi0JKiBody1ldmVudHMuYyAoY3JlYXRlX2h3X2V2ZW50X2RhdGEsIGRlbGV0ZV9od19ldmVudF9kYXRhKTogRGVmaW5lLgotCi0JKiBkdi1wYWwuYzogVXBkYXRlLgotCi1Nb24gTWF5IDI1IDE2OjU1OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctYmFzZS5jIChwYW5pY19od19wb3J0X2V2ZW50LCBlbXB0eV9od19wb3J0cyk6IE1vdmUgZnJvbSBoZXJlLgotICAJKiBody1wb3J0cy5jOiBUbyBoZXJlLgotCQotCSogaHctYmFzZS5oLCBody1wb3J0cy5jIChjcmVhdGVfaHdfcG9ydF9kYXRhLAotIAlkZWxldGVfaHdfcG9ydF9kYXRhKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGh3LWJhc2UuYyAoaHdfZGVsZXRlLCBod19jcmVhdGUpOiBDYWxsIHNhbWUuCi0JCi0JKiBody1iYXNlLmggKHNldF9od19wb3J0cywgc2V0X2h3X3BvcnRfZXZlbnQpOiBNb3ZlIHNldCBmdW5jdGlvbnMKLSAJZnJvbSBoZXJlLgotICAJKiBody1wb3J0cy5oOiBUbyBoZXJlLgotCi1Nb24gTWF5IDI1IDE2OjQyOjQ4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctZGV2aWNlLmMgKGh3X2lvY3RsKSwgaHctZGV2aWNlLmggKGh3X2lvY3RsX2NhbGxiYWNrKTogRHJvcAotIAlQUk9DRVNTT1IgYW5kIENJQSBhcmd1bWVudHMuCi0KLUZyaSBNYXkgMjIgMTI6MTY6MjcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hXKTogQWRkIGVuYWJsZSAvIGRpc2FibGUgYXJndW1lbnQuCi0gIAlNb3ZlIGNvbW1vbiBvYmplY3QgZmlsZXMgZnJvbSBoZXJlLgotCSogTWFrZS1jb21tb24uaW4gKFNJTV9DT01NT05fSFdfT0JKUyk6IFRvIGhlcmUuCi0JCi1UaHUgTWF5IDIxIDE3OjU3OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWh3LmM6IEluY2x1ZGUgY3R5cGUuaC4KLQkoZG9faHdfcG9sbF9yZWFkKTogRG8gbm90IGFzc3VtZSBFQUdBSU4uCi0KLVdlZCBNYXkgMjAgMDQ6Mzc6NTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdHJhY2UuYyAoZmlyc3RfaW5zbl9wKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkodHJhY2VfaW5zbl9pbml0KTogU2V0IGl0LgotCSh0cmFjZV9pbnNuX2ZpbmkpOiBVc2UgVFJBQ0VfUFJFRklYLgotCSh0cmFjZV9pbnNuKTogUmV3cml0ZSB0byB1c2UgdHJhY2VfcHJlZml4LgotCSogc2ltLXRyYWNlLmMgKHRyYWNlX3ByZWZpeCk6IERvbid0IHByaW50IGZpbGVuYW1lIGFyZyBpZiBOVUxMLgotCUFkanVzdCB3aWR0aCBhY2NvcmRpbmdseS4KLQotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogTmV3IG1lbWJlciBwcm9maWxlX2FueV9wLgotCShQUk9GSUxFX0FOWV9QLFBST0ZJTEVfSU5TTl9QLFBST0ZJTEVfTUVNT1JZKTogTmV3IG1hY3Jvcy4KLQkoUFJPRklMRV9TQ0FDSEVfUCxQUk9GSUxFX1BDX1AsUFJPRklMRV9DT1JFX1ApOiBOZXcgbWFjcm9zLgotCShQUk9GSUxFX0NPVU5UX0lOU04sUFJPRklMRV9DT1VOVF9SRUFELFBST0ZJTEVfQ09VTlRfV1JJVEUpOiBTaW1wbGlmeS4KLQkoUFJPRklMRV9DT1VOVF9DT1JFKTogU2ltcGxpZnkuCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX29wdGlvbl9oYW5kbGVyKTogQ29tcHV0ZSBwcm9maWxlX2FueV9wLgotCi1UdWUgTWF5IDE5IDIzOjU1OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wcy5oIChBRERDRlNJKTogRml4IHR5cG8uCi0KLVNhdCBNYXkgMTYgMTI6NDQ6NTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tc2ltLmggKENHRU5fQ1BVKTogTmV3IG1lbWJlcnMgaWRlc2Nfe3JlYWQsc2VtfV9pbml0X3AuCi0JKiBnZW5tbG9vcC5zaDogVXNlIHRoZW0gcmF0aGVyIHRoYW4gc3RhdGljIGxvY2Fscy4KLQotCSogc2ltLWVuZ2luZS5jIChzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBzaW0tZW5naW5lLmggKHNpbV9lbmdpbmVfc2V0X3J1bl9zdGF0ZSk6IERlY2xhcmUuCi0JKiBnZW5tbG9vcC5zaCAocGVuZGluZ19yZWFzb24scGVuZGluZ19zaWdyYyk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShAY3B1QF9lbmdpbmVfc3RvcCk6IE5ldyBhcmdzIHJlYXNvbixzaWdyYy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKGVuZ2luZV9yZXN1bWUpOiBSZW9yZ2FuaXplLiAgQWxsb3cgc3luY2hyb25vdXMgZXhpdCBmcm9tIG1haW4gbG9vcC4KLQotRnJpIE1heSAxNSAxNjowNjowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2luaXQpOiBOZXcgYXJnIGZpcnN0X3AuIAotCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKHRyYWNlX2luc25fZmluaSk6IE5ldyBhcmcgbGFzdF9wLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIGNnZW4tdHJhY2UuaCAodHJhY2VfaW5zbl9pbml0LHRyYWNlX2luc25fZmluaSk6IFVwZGF0ZS4KLQkoVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSSk6IFVwZGF0ZS4KLQkqIGdlbm1sb29wLnNoIChlbmdpbmVfcmVzdW1lKTogVXBkYXRlLgotCi1GcmkgTWF5IDE1IDE1OjU5OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChpbnN0YWxsLWNvbW1vbik6IFJ1biByYW5saWIgb24gaW5zdGFsbGVkIGNvcHkgb2YKLQlsaWJzaW0uYS4KLQotRnJpIE1heSAxNSAxNTowMzowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoaW5zdGFsbC1jb21tb24pOiBSZW5hbWUgYW5kIGluc3RhbGwgbGlic2ltLmEuCi0KLVR1ZSBNYXkgMTIgMTU6MjM6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0taW8uYyAodW5pc3RkLmgpOiBJbmNsdWRlLgotCi1XZWQgTWF5ICA2IDE2OjA0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbiAoc2ltX21haW5faGVhZGVycyk6IFNvcnQuCi0JKGNnZW4tKi5vKTogQWRkIGNnZW4tc2ltLmggZGVwZW5kZW5jeS4KLQotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX2luaXQpOiBPbmx5IGFsbG9jYXRlIHNwYWNlIGlmIHNjYWNoZSBlbGVtZW50Ci0Jc2l6ZSBpcyBub24temVyby4KLQkoc2NhY2hlX2ZsdXNoLHNjYWNoZV9wcmludF9wcm9maWxlKTogQ2hlY2sgaWYgc2NhY2hlIGluIHVzZSBmaXJzdC4KLQotCSogY2dlbi1zaW0uaCAoSURFU0MpOiBQcm92aWRlIGZvcndhcmQgZGVjbGFyYXRpb24uCi0JKERFQ09ERSk6IERlbGV0ZS4KLQkoQ0dFTl9DUFUpOiBBbHdheXMgZGVmaW5lIHNjYWNoZSBtZW1iZXIuICBOZXcgbWVtYmVycyBpZGVzYyxvcGNvZGUuCi0JKGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyk6IERlY2xhcmUuCi0JKiBjZ2VuLXV0aWxzLmMgKGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyk6IE5ldyBmdW5jdGlvbi4KLQotCSogc2ltLWNwdS5oOiBOZXcgZmlsZS4gIHNpbV9jcHVfYmFzZSBtb3ZlZCBoZXJlLgotCU1vdmUgc2ltX2NwdV9sb29rdXAgZGVjbCBoZXJlLgotCSogc2ltLWJhc2UuaDogI2luY2x1ZGUgInNpbS1jcHUuaCIuCi0JKiBzaW0tY3B1LmM6IE5ldyBmaWxlLgotCSogTWFrZS1jb21tb24gKHNpbV9tYWluX2hlYWRlcnMpOiBBZGQgc2ltLWNwdS5oLgotCShzaW0tY3B1Lm8pOiBBZGQgcnVsZSBmb3IuCi0KLQkqIHNpbS1tb2RlbC5jIChzZXRfbW9kZWwpOiBEZWxldGUuCi0JKHNpbV9tb2RlbF9zZXQsbW9kZWxfc2V0KTogTmV3IGZ1bmN0aW9ucy4KLQkoc2ltX21vZGVsX2luc3RhbGwpOiBSZW5hbWVkIGZyb20gbW9kZWxfaW5zdGFsbC4KLQlEb24ndCBzZXQgZGVmYXVsdCBtb2RlbCBoZXJlLgotCShtb2RlbF9vcHRpb25faGFuZGxlcik6IFJld3JpdGUgLS1tb2RlbCBwcm9jZXNzaW5nLgotCShzaW1fbW9kZWxfbG9va3VwLHNpbV9tYWNoX2xvb2t1cCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzaW0tbW9kZWwuaCAoTUFYX01PREVMUyxNQVhfSU5TTlMpOiBEZWxldGUuCi0JKGluc25fdGltaW5nKTogRGVsZXRlLgotCShJTlNOX1RJTUlORyk6IE5ldyBtZW1iZXIgYG51bScuCi0JKElNUF9QUk9QRVJUSUVTKTogQWx3YXlzIGRlZmluZSBzY2FjaGVfZWxtX3NpemUgbWVtYmVyLgotCShNQUNIKTogTmV3IG1lbWJlciBpbml0X2NwdS4KLQkoc2ltX21hY2hzKTogUmVuYW1lZCBmcm9tIG1hY2hzLgotCShzaW1fbW9kZWxfaW5zdGFsbCk6IFJlbmFtZWQgZnJvbSBtb2RlbF9pbnN0YWxsLgotCShzaW1fbW9kZWxfc2V0LHNpbV9tb2RlbF9sb29rdXAsc2ltX21hY2hfbG9va3VwKTogRGVjbGFyZS4KLQkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IFVwZGF0ZS4KLQotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9pbnNuKTogQWRkIGNwdSBhcmcgdG8gSU5TTl9OQU1FIG1hY3JvLgotCi0JKiBzaW0taW8uYzogI2luY2x1ZGUgPGVycm5vLmg+LgotCi1XZWQgTWF5ICA2IDEyOjM5OjE1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZHYtcGFsLmMgKHN0cnVjdCBod19wYWxfZGV2aWNlKTogQWRkIHJlYWRlci4KLSAJKGh3X3BhbF9maW5pc2gpOiBJbml0aWFsaXplIHJlYWRlci4KLQkoc2Nhbl9od19wYWwpOiBVc2UgcmVhZGVyLgotCi0JKiBody1iYXNlLmgsIHNpbS1ody5jIChkb19od19wb2xsX3JlYWQpOiBOZXcgZnVuY3Rpb24uCi0JKEhXX0lPX0VPRiwgSFdfSU9fTk9UX1JFQURZKTogRGVmaW5lLgotCSogZHYtcGFsLmM6IFVzZS4KLQotCSogc2ltLWlvLmgsIHNpbS1pby5jIChzaW1faW9fcG9sbF9yZWFkKTogTmV3IGZ1bmN0aW9uLiAgQ29weSBmcm9tCi0gCS4uL3BwYy9tYWluLmMgc2ltX2lvX3JlYWRfc3RkaW4uCi0KLUZyaSBNYXkgIDEgMTI6MTE6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBody10cmVlLmggKGh3X3RyZWVfcHJpbnQpOiBQYXJhbWF0ZXJpemUgd2l0aCBwcmludCBhbmQgZmlsZQotIAlhcmd1bWVudHMuCi0JKiBody10cmVlLmM6IFVwZGF0ZS4KLQkKLQkqIGh3LWJhc2UuaCAoaHdfcG9ydF9ldmVudF9jYWxsYmFjayk6IERlbGV0ZSBDUFUvQ0lBIGFyZ3MuCi0JKiBody1kZXZpY2UuaCAoaHdfaW9fcmVhZF9idWZmZXIsIGh3X2lvX3dyaXRlX2J1ZmZlcik6IERlbGV0ZQotIAlDUFUvQ0lBIGFyZ3MuCi0JKiBody1wb3J0cy5oIChod19wb3J0X2V2ZW50KTogRGl0dG8uCi0JKiBody1wb3J0cy5jIChod19wb3J0X2V2ZW50KTogVXBkYXRlLgotCSogaHctYmFzZS5jIChwYW5pY19od19pb19yZWFkX2J1ZmZlciwgcGFuaWNfaHdfaW9fd3JpdGVfYnVmZmVyKToKLSAJVXBkYXRlLgotCSogZHYtcGFsLmMgKGh3X3BhbF9pb19yZWFkX2J1ZmZlciwgaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik6Ci0gCVVwZGF0ZS4KLQkoaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik6IENhbGwgaHdfaGFsdCBub3Qgc2ltX2VuZ2luZV9oYWx0LgotCShkb19jb3VudGVyX2V2ZW50KTogVXBkYXRlLgotCSogZHYtZ2x1ZS5jIChod19nbHVlX2lvX3JlYWRfYnVmZmVyKTogVXBkYXRlLgotCShod19nbHVlX3BvcnRfZXZlbnQpOiBVcGRhdGUuCi0KLQkqIGh3LWRldmljZS5oIChTSU1fREVTQyk6IFJlcGxhY2Ugd2l0aCBzdHJ1Y3Qgc2ltX3N0YXRlLgotCSogaHctYmFzZS5oIChod19jcmVhdGUpOiBEaXR0by4KLQkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlKTogRGl0dG8uCi0JCi0JKiBody1kZXZpY2UuYyAoaHdfYWJvcnQsIGh3X3RyYWNlLCBod19od19ldmVudF9xdWV1ZV9zY2hlZHVsZSwKLSAJaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSwgaHdfZXZlbnRfcXVldWVfdGltZSk6IERlbGV0ZSwgbW92ZWQKLSAJZnJvbSBoZXJlIHRvLgotCSogc2ltLWh3LmM6IEhlcmUuCi0JKiBody1kZXZpY2UuaCAoaHdfc3lzdGVtX2NwdSk6IERlY2xhcmUuCi0JKiBzaW0taHcuYyAoaHdfc3lzdGVtX2NwdSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfbWFwX2F0dGFjaCwgc2ltX2NvcmVfYXR0YWNoKTogQ2FsbAotIAlzaW1faHdfYWJvcnQgbm90IGh3X2Fib3J0LgotCShzaW0taHcuaCk6IEluY2x1ZGUuCi0JKHNpbV9jb3JlX3JlYWRfYnVmZmVyLCBzaW1fY29yZV93cml0ZV9idWZmZXIpOiBDYWxsCi0gCXNpbV9od19pb19yZWFkX2J1ZmZlciBhbmQgc2ltX2h3X2lvX3dyaXRlX2J1ZmZlci4gRG8gbm90IHBhc3MgQ1BVCi0gCWFyZ3VtZW50LgotCShzaW1fY29yZV9zZXRfeG9yKTogRG8gbm90IHBhc3MgQ1BVIHdoZW4gYWJvcnRpbmcuCi0KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sCi0gCXNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IENhbGwgc2ltX2h3X2Fib3J0IG5vdCBod19hYm9ydC4KLQkoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IENhbGwKLSAJc2ltX2NwdV9od19pb19yZWFkX2J1ZmZlciBhbmQgc2ltX2NwdV9od19pb193cml0ZV9idWZmZXIuIERvZXMgbm90Ci0gCXJldHVybiBsZW5ndGguCi0KLQkqIHNpbS1ody5oOiBEZWNsYXJlIHNpbV9od19pb197cmVhZCx3cml0ZX1fYnVmZmVyLiBEZWNsYXJlCi0gCXNpbV9od19wcmludC4KLQkqIHNpbS1ody5jIChzaW1faHdfaW9fcmVhZF9idWZmZXIsIHNpbV9od19pb193cml0ZV9idWZmZXIsCi0gCXNpbV9jcHVfaHdfaW9fcmVhZF9idWZmZXIsIHNpbV9jcHVfaHdfaW9fd3JpdGVfYnVmZmVyKTogTmV3Ci0gCWZ1bmN0aW9ucy4KLQkoc2ltX2h3X3ByaW50KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzaW0tZW5naW5lLmggKHNpbV9lbmdpbmVfdmFib3J0KTogRGVjbGFyZS4KLQkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV92YWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBBcHIgMjkgMjM6NTg6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHJhY2UuYyAocHJpbnRfZGF0YSk6IEZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIHRyYWNlIHJhdwotIAloZXggdmFsdWUuCi0JKHRyYWNlX3Jlc3VsdF9mcDIpOiBOZXcgZnVuY3Rpb24uCi0JKiBzaW0tdHJhY2UuaCAodHJhY2VfcmVzdWx0X2ZwMik6IE5ldyBkZWNsYXJhdGlvbi4KLQkoVFJBQ0VfRlBfUkVTVUxUMik6IE5ldyBtYWNyby4KLQotVHVlIEFwciAyOCAxODoyODo1OCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29tbW9uL2FjbG9jYWwubTQ6IGNhbGwgQU1fRVhFRVhUIGluIFNJTV9BQ19DT01NT04sIGRlZmluZQotICAgICAgICBBTV9DWUdXSU4zMiBhbmQgQU1fRVhFRVhULgotICAgICAgICAqIGNvbW1vbi9NYWtlLWNvbW1vbi5pbjogc2V0IEVYRUVYVCwgYWRkIG1pc3NpbmcgRVhFRVhUcwotICAgICAgICB0byBydW4gYW5kIGluc3RhbGwtY29tbW9uIHJ1bGVzLgotICAgICAgICAqIGNvbW1vbi9jb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotU2F0IEFwciAyNSAxNzo0NTowMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS10eXBlcy5oIChjZWxsX3dvcmQpOiBOZXcgdHlwZS4KLQkobmF0dXJhbF9jZWxsKTogRGVsZXRlIHR5cGUuCi0KLVN1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVN1biBBcHIgMjYgMTU6MjU6MDcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1BSSU5URik6IFJlbW92ZWQuCi0KLUZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLUZyaSBBcHIgMjQgMTE6Mzg6MDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIE1ha2UtY29tbW9uLmluICh0b3BfYnVpbGRkaXIpOiBOZXcgbWFjcm8uCi0JKElOVExfTElCKTogUmVtb3ZlZC4KLQkoSU5UTExJQlMpOiBOZXcgbWFjcm8uCi0JKElOVExERVBTKTogTGlrZXdpc2UuCi0JKExJQkRFUFMpOiBVc2UgSU5UTERFUFMuCi0JKEVYVFJBX0xJQlMpOiBVc2UgSU5UTExJQlMuCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogQ2FsbCBDWV9HTlVfR0VUVEVYVC4KLQkoQ1lfV0lUSF9OTFMsIENZX0dOVV9HRVRURVhULCBBTV9QQVRIX1BST0dfV0lUSF9URVNULAotCUFNX0xDX01FU1NBR0VTKTogTmV3IG1hY3JvcyBmcm9tIEdOVSBnZXR0ZXh0LgotCi1GcmkgQXByIDI0IDE5OjU3OjU5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5oOiBEaXNjYXJkIGxlYWRpbmcgXyBmcm9tIG1hY3Jvcy4KLQkqIHNpbS10eXBlcy5oOiBEaXR0by4KLQotV2VkIEFwciAyMiAxNDoxNDoxOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKENTRUFSQ0gpOiBBZGQgLUkgdG8gaW50bCBkaXJlY3Rvcmllcy4KLQkoSU5UTF9MSUIpOiBQb2ludCB0byBsaWJpbnRsLmEuCi0JKExJQkRFUFMpOiBBZGQgJChJTlRMX0xJQikuCi0JKEVYVFJBX0xJQlMpOiBEaXR0by4KLQotVHVlIEFwciAyMSAxMjo0NDoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXR5cGVzLmggKEdFVEhJREksTUFLRURJKTogVHdlYWsuCi0KLQkqIGNnZW4tb3BzLmggKEFERENGU0kpOiBGaXguCi0JKFNVQkNGU0kpOiBUd2Vhay4KLQotVHVlIEFwciAyMSAxMzoxODo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS10eXBlcy5oIChzaWduZWRfYWRkcmVzcywgdW5zaWduZWRfYWRkcmVzcyk6IERlZmluZS4KLQotTW9uIEFwciAyMCAyMTo0Nzo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuYyAoc2ltX2ZwdV8yZCk6IERvbid0IHJldHVybiBhbiBTTmFOLCBjb252ZXJ0IGl0IGludG8gYQotIAlRTmFOLgotCi1UaHUgQXByIDE2IDEwOjMwOjE0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWZwdS5jLCBzaW0tZnB1LmggKHNpbV9mcHVfZnJhY3Rpb250bywgc2ltX2ZwdV90b2ZyYWN0aW9uKToKLSAJTmV3IGZ1bmN0aW9ucywgcGFjayAvIHVucGFjayBzaW1fZnB1IHN0cnVjdCB1c2luZyByYXcgdmFsdWVzLgotCShzaW1fZnB1X2lzKTogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZQotIAlpbmZpbml0eS4KLQotVHVlIEFwciAxNCAxODo0OTozMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iaXRzLmggKEVYVEVORDQpOiBEZWZpbmUuCi0JKEVYVEVORDQsIEVYVEVORDE1LCBFWFRFTkQxMSk6IERpdHRvLgotCQotVHVlIEFwciAxNCAxNjozMTozNSAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgotCi0JKiBzaW0tbWVtb3B0LmMgKHBhcnNlX2FkZHIpOiBTdW5vcyA0LjUgZG9lcyBub3QgaGF2ZSBzdHJ0b2wKLSAJZGVjbGFyZWQgc28gd2UgbmVlZCB0aGlzIGNhc3QgdG8gcHJldmVudCBsb25nIGxvbmcgYWRkcmVzc2VzCi0JZnJvbSBiZWluZyBtaXNjb25maWd1cmVzLiBSZXN1bHRzIGluIGFjY2VzcyB0byB1bm1hcHBlZCBtZW1vcnkuCi0KLVR1ZSBBcHIgMTQgMTM6MTk6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKFJVTlRFU1RGTEFHUyk6IERlZmluZS4KLQkoY2hlY2spOiBQYXNzIFJVTlRFU1RGTEFHUyB0byByZWN1cnNpdmUgbWFrZS4KLQotVHVlIEFwciAxNCAxNTowOToxOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pbmZvLmMgKHNpbV9pbmZvKTogQmUgdmVyYm9zZSB3aGVuIGVpdGhlciBWRVJCT1NFIG9yCi0gCVNUQVRFX1ZFUkJPU0VfUC4KLQotU2F0IEFwciAgNCAyMzoyNDoxNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKHNpbS1pbmxpbmUpOiBCeSBkZWZhdWx0LCBkaXNhYmxlIHNpbS1pbmxpbmUgd2hlbgotIAljcm9zcyBjb21waWxpbmcuCi0KLVNhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChzaW0tY2ZsYWdzKTogQWRkIC1mb21pdC1mcmFtZS1wb2ludGVyIHRvIGRlZmF1bHRzLgotCShzaW0taW5saW5lKTogVXBkYXRlIHRvIG1hdGNoIHNpbS1pbmxpbmUuW2hjXQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0taW5saW5lLmgKLQotCSogc2ltLWJpdHMuaCAoc2ltLWJpdHMuYyk6IEluY2x1ZGUgd2hlbiBIX1JFVkVBTFNfTU9EVUxFX1AuCi0gCXNlbGVjdGVkLgotCSogc2ltLWVuZGlhbi5oIChzaW0tZW5kaWFuLmMpOiBEaXR0by4KLQkKLQkqIHNpbS1ldmVudHMuaCAoX1NJTV9FVkVOVFNfSF8pOiBSZXBsYWNlIHdpdGggU0lNX0VWRU5UU19ILgotCShzaW1fZXZlbnRzX3NldF90cmFjZSk6IERlbGV0ZSB1bnVzZWQgcHJvdG90eXBlLgotCQotCSogc2ltLWNvcmUuaCAoX1NJTV9DT1JFX0hfKTogUmVwbGFjZSB3aXRoIFNJTV9DT1JFX0guCi0JKiBzaW0tY29yZS5jIChfU0lNX0NPUkVfQ18pOiBEaXR0byBmb3IgU0lNX0NPUkVfQy4KLQotCSogc2ltLWZwdS5oIChzaW0tZnB1LmMpOiBJbmNsdWRlIHdoZW4gSF9SRVZFQUxTX01PRFVMRV9QLgotCShzaW1fZnB1X3RvMjMyaSwgc2ltX2ZwdV90bzIzMnUsIHNpbV9mcHVfaTIzMnRvLCBzaW1fZnB1X3UyMzJ0byk6Ci0gCUNvbW1lbnQgb3V0LCBub3QgeWV0IGltcGxlbWVudGVkIGluIHNpbS1mcHUuYy4KLQkoc2ltX2ZwdV96ZXJvLCBzaW1fZnB1X29uZSwgc2ltX2ZwdV90d28sIHNpbV9mcHVfcW5hbiwKLSAJc2ltX2ZwdV9tYXgzMiwgc2ltX2ZwdV9tYXg2NCk6IE1hcmsgYXMgRVhURVJOX1NJTV9GUFUuCi0JCi0JKiBzaW0taW5saW5lLmg6IFJld3JpdGUgZGVzY3JpcHRpb24uCi0JKEhfUkVWRUFMU19NT0RVTEVfUCwgQ19SRVZFQUxTX01PRFVMRV9QKTogRGVmaW5lLgotCShTSU1fTUFJTl9JTkxJTkUpOiBBZGQgaW5saW5lIG9wdGlvbi4KLQkKLQkqIHNpbS1pbmxpbmUuYyAoc2VtYW50aWNzLmMsIGlkZWNvZGUuYywgZW5naW5lLmMsIC4uLik6IERvIG5vdAotIAlpbmNsdWRlIGdlbmVyYXRlZCBmaWxlcy4gSGFuZGxlZCBieSBnZW5lcmF0b3IgZGlyZWN0bHkuCi0JCi1TYXQgQXByICA0IDAxOjA3OjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXRyYWNlLmMgKHNldF90cmFjZV9vcHRpb25fbWFzayk6IEtlZXAgVFJBQ0VfQU5ZX1AKLQl1cC10by1kYXRlLgotCi0JKiBzaW0tdHJhY2UuaCAoVFJBQ0VfQU5ZX1ApOiBEZWZpbmUuCi0JKHN0cnVjdCBfdHJhY2VfZGF0YSk6IEFkZCB0cmFjZV9hbnlfcC4KLQotTW9uIE1hciAzMCAxNzoxMTo1NSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogSGFuZGxlIGFsbCBhbHRlcm5hdGl2ZXMgb2YgZW51bSBzaW1fc3RvcC4KLQkobWFpbik6IERlbGV0ZSB1bnVzZWQgYGFzZWN0aW9uICpzJy4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LXRyZWUuaCwgaHctdHJlZS5jIChod190cmVlX3ZwYXJzZSk6IE5ldyBmdW5jdGlvbgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLQkqIHNpbS1ody5jOiBOZXcgZmlsZS4KLQkqIHNpbS1ody5oIChzaW1faHdfcGFyc2UpOiBEZWNsYXJlIGZ1bmN0aW9uLgotCShody10cmVlLmgpOiBEbyBub3QgaW5jbHVkZS4KLQkKLQkqIHNpbS1iYXNlLmggKFNUQVRFX0hXKTogRGVmaW5lLgotCShzdHJ1Y3Qgc2ltX3N0YXRlX2Jhc2UpOiBBZGQgbWVtYmVyIHN0cnVjdCAqaHcuCi0KLQkqIHNpbS1tb2R1bGUuYyAoc2ltLWh3LmgpOiBJbmNsdWRlLgotCShtb2R1bGVzKTogQWRkIHNpbV9od19pbnN0YWxsLgotCQotCSogYWNsb2NhbC5tNCAoc2ltX2h3X29iaik6IEFkZCBzaW0taHcubwotCi1GcmkgTWFyIDI3IDE0OjU1OjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWJhc2UuaCAoQ1BVX0lOREVYKTogRGVmaW5lLgotCi0JKiBzaW0tdXRpbHMuYyAoc2ltX3N0YXRlX2FsbG9jKTogSW5pdGlhbGl6ZS4KLQkqIHNpbS1tb2R1bGUuYyAoc2ltX3Bvc3RfYXJndl9pbml0KTogRGl0dG8uCi0KLVRodSBNYXIgMjYgMTA6MDc6NTcgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgotCi0JKiBhY2xvY2FsLm00IChzaW1faHdfb2JqKTogIEZpeCBzZWQgZXhwcmVzc2lvbiB0byBnZW5lcmF0ZQotCXByb3Blcmx5IGZvcm1hdHRlZCBsaXN0cy4KLQotVGh1IE1hciAyNiAxMDozNzoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LXBhbC5jIChlbnVtIGh3X3BhbF9hZGRyZXNzX21hc2spOiBGcm9tIFN0dSBHcm9zc21hbiwgd2FzCi0gCTB4MmYgbmVlZHMgdG8gYmUgMHgzZi4KLQotVGh1IE1hciAyNiAwOToxMDo1NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LXRyZWUuYyAoaHdfdHJlZV9maW5kX3Byb3BlcnR5KTogUmV0dXJuIE5VTEwgd2hlbiBkZXZpY2UgaXMKLSAJbm90IGZvdW5kLgotCShod190cmVlX2ZpbmRfKl9wcm9wZXJ0eSk6IENsZWFuIHVwIGVycm9yIG1lc3NhZ2Ugd2hlbiBwcm9wZXJ0eSBpcwotIAlub3QgZm91bmQuCi0KLQkqIGR2LXBhbC5jIChod19wYWxfaW9fcmVhZF9idWZmZXIpOiBDaGVjayB0aGUgc21wIHByb3BlcnR5IGlzCi0gCXByZXNlbnQgYmVmb3JlIGxvb2tpbmcgZm9yIGl0LgotCi1XZWQgTWFyIDI1IDE2OjE3OjM4IDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChBQ19DSEVDS19IRUFERVJTKTogQWRkIGNoZWNrIGZvciBmcHVfY29udHJvbC5oLiAgCi0JKEFDX0NIRUNLX0ZVTkNTKTogQWRkIGNoZWNrIGZvciBfX3NldGZwdWN3LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotV2VkIE1hciAyNSAwOToxODozNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LXBhbC5jIChod19wYWxfY291bnRkb3duLCBod19wYWxfY291bnRkb3duX3ZhbHVlLAotIAlod19wYWxfdGltZXIsIGh3X3BhbF90aW1lcl92YWx1ZSk6IERlZmluZS4KLQkoaHdfcGFsX2lvX3JlYWRfYnVmZmVyLCBod19wYWxfaW9fd3JpdGVfYnVmZmVyKTogQWRkIHRpbWVyIHN1cHBvcnQKLQkoZG9fY291bnRlcl9ldmVudCwgZG9fY291bnRlcl9yZWFkLCBkb19jb3VudGVyX3ZhbHVlLAotIAlkb19jb3VudGVyX3dyaXRlKTogbmV3IGZ1bmN0aW9ucy4KLQotVHVlIE1hciAyNCAxMjoyNDoyNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LXRyZWUuYyAoaHdfcHJpbnRmKTogU2VuZCB0cmVlIGR1bXAgdG8gc3RkZXJyLCBzYW1lIGFzIG90aGVyCi0gCXRyYWNlIG91dHB1dC4KLQotCSogaHctYmFzZS5jIChod19jcmVhdGUpOiBTdG9wIHNlYXJjaGluZyBmb3IgYSBkZXZpY2Ugd2hlbiBvbmUgaXMKLSAJZm91bmQuCi0KLVdlZCBNYXIgMjUgMTI6MzU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBNYXIgMjMgMTA6MjU6MDggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogQWRkIHNlY29uZCBhcmd1bWVudCwKLSAJYXBwZW5kcyBleHRyYSBkZXZpY2VzLgotCShTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogU3Vic3R1dGUgc2ltX2h3LCBhIG5vbi1kdXBsaWNhdGUgbGlzdCBvZgotIAl0aGUgZGV2aWNlIG5hbWVzLgotCQotCSogTWFrZS1jb21tb24uaW4gKGh3LWNvbmZpZy5oKTogTmV3IHRhcmdldCwgY3JlYXRlIGh3LWNvbmZpZy5oCi0gCWZpbGUuCi0JKFNJTV9IVyk6IERlZmluaXRpb24gZnJvbSBAc2ltX2h3QC4KLQkoaHctYmFzZS5vKTogRGVwZW5kIG9uIGh3LWNvbmZpZy5oCi0KLVR1ZSBNYXIgMjQgMTc6NDE6MzUgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgotCi0JKiBNYWtlLWNvbW1vbi5pbjogIEdldCBTSEVMTCBmcm9tIGNvbmZpZ3VyZS4KLQkqIChzdGFtcC10dmFscyBzaW0taW5saW5lLmMpOiAgVXNlICQoU0hFTEwpIHdoZW4gaW52b2tpbmcKLQltb3ZlLWlmLWNoYW5nZS4gIEZpeGVzIE5UIG5hdGl2ZSBidWlsZCBwcm9ibGVtLgotCSogTWFrZWZpbGUuaW4gKG5sdHZhbHMuZGVmKTogICBVc2UgJChTSEVMTCkgd2hlbiBpbnZva2luZwotCW1vdmUtaWYtY2hhbmdlLiAgRml4ZXMgTlQgbmF0aXZlIGJ1aWxkIHByb2JsZW0uCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xIHRvIGZpeCBzaGVsbCBpc3N1ZXMgZm9yCi0JTlQgbmF0aXZlIGJ1aWxkcy4KLQkKLVN1biBNYXIgMjIgMTY6NTQ6NDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBody1kZXZpY2UuaCwgaHctZGV2aWNlLmMgKGh3X3N0cmR1cCk6IE5ldyBmdW5jdGlvbi4KLQotCSogaHctYmFzZS5jIChod19jcmVhdGUpOiBVc2UgaHdfc3RyZHVwIHdoZW4gc2F2aW5nIGEgY29weSBvZiB0aGUKLSAJc3RyaW5ncyBuYW1lLCBmYW1pbHkgYW5kIGFyZ3MuCi0JKGZ1bGxfbmFtZV9vZl9odyk6IFVzZSBod19zdHJkdXAgd2hlbiByZXR1cm5pbmcgdGhlIGZ1bGwgcGF0aC4KLQotCSogaHctcHJvcGVydGllcy5jOiBDbGVhbiB1cCBwcm9wZXJ0eSBub3QgZm91bmQgLyB3cm9uZyB0eXBlIGVycm9yCi0gCW1lc3NhZ2VzLgotCQotCSogaHctdHJlZS5jIChod190cmVlX3BhcnNlKTogRmluaXNoIGEgZGV2aWNlcyBpbml0aWFsaXphdGlvbgotIAliZWZvcmUgYXR0YWNoaW5nIGFueSBwb3J0cy4KLQotCSogaHctYmFzZS5jIChody1jb25maWcuKTogSW5jbHVkZS4gIFJlcGxhY2UgaGFyZHdpcmVkIHRhYmxlLgotCi0JKiBkdi1nbHVlLmM6IENvcHkgb3ZlciAuLi9wcGMvaHdfZ2x1ZS5jLiAgVXBkYXRlIHRvIG5ldyBmcmFtZXdvcmsuCi0KLQkqIE1ha2UtY29tbW9uLmluOiBBZGQgcnVsZSBmb3IgZHYtZ2x1ZS5vLgotCi1TdW4gTWFyIDIyIDE2OjQ1OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctYmFzZS5jIChod19maW5pc2gpOiBNb3ZlIHNldHRpbmcgb2YgdHJhY2UgbGV2ZWwgdG8gaGVyZS4KLQkoaHdfY3JlYXRlKTogRnJvbSBoZXJlLgotCi0JKiBody1iYXNlLmgsIGh3LWJhc2UuYyAoZG9faHdfYXR0YWNoX3JlZ3MpOiBDb3B5IGZ1bmN0aW9uIGZyb20KLSAJLi4vcHBjL2RldmljZV90YWJsZS5jLgotCi0JKiBkdi1wYWwuYyAoaHdfcGFsX2ZpbmlzaCk6IEF0dGFjaCBQQUwgZGV2aWNlIHRvIHBhcmVudCBidXMuCi0KLQkqIGh3LXRyZWUuYyAocHJpbnRfcHJvcGVydGllcyk6IFN1cHJlc3MgcGF0aCB3aGVuIHByaW50aW5nCi0gCXByb3BlcnRpZXMgb2Ygcm9vdCBub2RlLgotCi1TdW4gTWFyIDIyIDE2OjIxOjE1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaHctZGV2aWNlLmggKEhXX1RSQUNFKTogRGVmaW5lLgotCShod190cmFjZSk6IERlY2xhcmUuCi0JKiBody1kZXZpY2UuYyAoaHdfdHJhY2UpOiBJbXBsZW1lbnQgZnVuY3Rpb24uCi0KLQkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlKTogU2V0IGh3IHRyYWNlIGxldmVsIGZyb20gInRyYWNlPyIKLSAJcHJvcGVydHkuCi0KLQkqIGR2LWNvcmUuYyAoZHZfY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk6IEFkZCB0cmFjZS4KLQotCSogZHYtcGFsLmM6IFJlcGxhY2UgRFRSQUNFIHdpdGggSFdfVFJBQ0UuCi0KLVN1biBNYXIgMjIgMTU6MjM6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBody1kZXZpY2UuaCAoSFdfWkFMTE9DLCBIV19NQUxMT0MpOiBOZXcgbWFjcm9zLgotCShod19hbGxvY19kYXRhKTogRGVsY2FyZS4KLQkoc3RydWN0IGh3KTogQWRkIG1lbWJlciBhbGxvY19vZl9ody4KLQkKLQkqIGh3LWRldmljZS5jIChod196YWxsb2MsIGh3X21hbGxvYywgaHdfZnJlZSwgaHdfZnJlZV9hbGwpOiBOZXcKLSAJZnVuY3Rpb25zLiBBc3NvY2F0ZSBtZW1vcnkgd2l0aCBhIGRldmljZS4KLQkoc3RkbGliLmgpOiBJbmNsdWRlLgotCQotCSogaHctYmFzZS5oIChzZXRfaHdfZGVsZXRlKTogRGVmaW5lLgotCShod19kZWxldGVfY2FsbGJhY2spOiBEZWNsYXJlLgotCShod19kZWxldGUpOiBEZWNsYXJlLgotCi0JKiBody1iYXNlLmMgKGh3X2RlbGV0ZSk6IEltcGxlbWVudCBmdW5jdGlvbi4KLQkoc3RydWN0IGh3X2Jhc2VfZGF0YSk6IEFkZCBtZW1iZXIgdG9fZGVsZXRlLgotCShpZ25vcmVfaHdfZGVsZXRlKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG5vdGhpbmcuCi0JKGh3X2NyZWF0ZSk6IFNldCB0aGUgaHdfZGVsZXRlIG1ldGhvZC4KLQkoaHdfY3JlYXRlKTogQWxsb2NhdGUgdGhlIGJhc2UgdHlwZSB1c2luZyBIV19aQUxMT0MgYmVmb3JlIHNldHRpbmcKLSAJYW55IG1ldGhvZHMuCi0KLQkqIGh3LXRyZWUuaCwgaHctdHJlZS5jIChod190cmVlX2RlbGV0ZSk6IE5ldyBmdW5jdGlvbi4KLQkKLQkqIGh3LXByb3BlcnRpZXMuYzogUmVwbGFjZSB6YWxsb2MvemZyZWUgd2l0aCBod196YWxsb2MvaHdfZnJlZS4KLQkKLQkqIGh3LXBvcnRzLmM6IFJlcGxhY2UgemFsbG9jL3pmcmVlIHdpdGggaHdfemFsbG9jL2h3X2ZyZWUuCi0JKGF0dGFjaF9od19wb3J0X2VkZ2UpOiBBZGQgc3RydWN0IGh3IGFyZ3VtZW50Ci0KLQkqIGR2LXBhbC5jIChod19wYWxfZmluaXNoKTogUmVwbGFjZSB6YWxsb2MvemZyZWUgd2l0aAotIAlod196YWxsb2MvaHdfZnJlZS4KLQotU3VuIE1hciAyMiAxNTowOTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGh3LWRldmljZS5oIChod19hdHRhY2hfYWRkcmVzc19jYWxsYmFjaywKLSAJaHdfZGV0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBBdHRhY2ggdG8gYSBzaW5nbGUgc3BhY2Ugbm90IGEgc3BhY2UKLSAJbWFzay4gQ2xhcmlmeSBpbnRlcnByZXRhdGlvbiBvZiBTUEFDRTpBRERSIHBhcmFtZXRlcnMuCi0KLQkqIGh3LWJhc2UuYyAocGFzc3Rocm91Z2hfaHdfYXR0YWNoX2FkZHJlc3MsCi0gCXBhc3N0aHJvdWdoX2h3X2RldGFjaF9hZGRyZXNzKTogVXBkYXRlLgotCSogZHYtY29yZS5jIChkdl9jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKTogRGl0dG8uCi0JKiBkdi1wYWwuYyAoaHdfcGFsX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCi0KLVRodSBNYXIgMTkgMDA6NDE6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5oOiBEb2N1bWVudCBhZGRpdGlvbmFsIENQVSBhcmcgdG8gT1BUSU9OX0hBTkRMRVIuCi0KLVdlZCBNYXIgMTggMTQ6MTM6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0hXX09CSlMsIFNJTV9IV19TUkMsIFNJTV9EVl9PQkpTKTogRGVmaW5lLgotCShody1iYXNlX2gsIGh3LWRldmljZV9oLCBody1oYW5kbGVzX2gsIGh3LWluc3RhbmNlc19oLCBod19wb3J0c19oLAotIAlody1wcm9wZXJ0aWVzX2gsIGh3LXRyZWVfaCk6IERlZmluZSwgcG9pbnQgYXQgY29ycmVzcG9uZGluZwotIAloZWFkZXIuCi0JKGh3X2Jhc2VfaGVhZGVycyk6IERlZmluZSBsaXN0IG9mIGhlYWRlcnMgaW5jbHVkZWQgYnkgaHctYmFzZS5oCi0JKGh3LWJhc2UubywgaHctZGV2aWNlLm8sIGh3LWluc3RhbmNlcy5vLCBody1oYW5kbGVzLm8sIGh3LXBvcnRzLm8sCi0gCWh3LXByb3BlcnRpZXMubywgaHctdHJlZS5vKTogU3BlY2lmeSBkZXBlbmRlbmNpZXMuCi0JKGR2LWNvcmUubywgZHYtcGFsLm8pOiBEaXR0by4KLQotCSogc2ltLWh3Lmg6IE5ldyBmaWxlLgotCi0JKiBody1kZXZpY2UuaCwgaHctZGV2aWNlLmMsIGh3LXByb3BlcnRpZXMuaCwgaHctcHJvcGVydGllcy5jLAotIAlody1wb3J0cy5oLCBody1wb3J0cy5jOiBOZXcgZmlsZXMuIENvcGllZCBmcm9tIC4uL3BwYy9kZXZpY2UuW2NoXS4KLQkKLQkqIGh3LXRyZWUuaCwgaHctdHJlZS5jOiBOZXcgZmlsZXMuIENvcGllZCBmcm9tIC4uL3BwYy90cmVlLltoY10uCi0KLQkqIGh3LWJhc2UuaCwgaHctYmFzZS5jOiBuZXcgZmlsZXMuICBDb3BpZWQgZnJvbQotIAkuLi9wcGMvZGV2aWNlX3RhYmxlLltoY10uCi0KLQkqIGR2LWNvcmUuYywgZHYtcGFsLmM6IE5ldyBmaWxlcy4gQ29waWVkIGZyb20KLSAJLi4vcHBjL2h3X3tjb3JlLHBhbH0uYwotCQotCSogc2ltLWJhc2ljcy5oIChzdHJ1Y3QgaHcpOiBEZWNsYXJlLgotCShlbnVtIHBvcnRfZGlyZWN0aW9uLCBlbnVtIG9iamVjdF9kaXNwb3NpdGlvbik6IERlY2xhcmUuCi0KLVdlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogU2V0IHNpbV9od19vYmosIHNpbV9kdl9vYmosCi0gCXNpbV9kdl9zcmMgaW4gTWFrZWZpbGUuIFRha2UgbGlzdCBvZiBkZXZpY2VzIGFzIHBhcmFtZXRlciB0byBtNAotIAltYWNyby4uCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNiAxMjozNzozMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS10cmFjZS5oLCBzaW0tdHJhY2UuYyAodHJhY2VfcHJlZml4KTogUGFzcyBpbiBzaW1fY2lhIHNvIHRoYXQKLSAJdHJhY2VfcHJlZml4IGNhbiBhYm9ydCBjbGVhbmx5LgotCi1TYXQgTWFyIDE0IDE4OjM2OjEyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBkdi1zb2Nrc2VyLmMsIGR2LXNvY2tzZXIuaDogTmV3IGZpbGVzLgotCSogTWFrZS1jb21tb24uaW4gKGR2LXNvY2tzZXIubyk6IEFkZCBydWxlIGZvci4KLQkqIGFjbG9jYWwubTQ6IENoZWNrIGZvciBmY250bC5oLgotCSogY29uZmlnLmg6IEFkZCBIQVZFX0ZDTlRMX0guCi0KLQkqIHNpbS1icmVhay5jIChyZW1vdmVfYnJlYWtwb2ludCk6IEZpeCB0aGlua28uCi0KLQkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFByb3ZpZGUgZGVmYXVsdCB2YWx1ZSBvZiBTSU1fSEFORExFU19MTUEuCi0JVXNlIFNJTV9IQU5ETEVTX0xNQSBmb3IgbG1hX3AgYXJnIHRvIHNpbV9sb2FkX2ZpbGUuCi0KLTE5OTgtMDMtMTMgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzaW0tYmFzZS5oIChzdHJ1Y3Qgc2ltX3N0YXRlX2Jhc2UpOiBBZGQgcHJvZ19zeW1zIGFuZAotCWRlZmluZSBtYWNybyBTVEFURV9QUk9HX1NZTVMuCi0JKiBzaW0tdHJhY2UuYyAodHJhY2VfcHJlZml4KTogQWRkIHZhcmlhYmxlcyBhYmZkLCBzeW1zaXplLAotCXN5bWJvbF9jb3VudCwgYW5kIGFzeW1ib2xzLiAgQ2FsbCBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotCWFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwgdG8gZ2V0IHN5bWJvbCB0YWJsZSBvbiBmaXJzdCB1c2UKLQlhbmQgcHJlc2VydmUgaXQgdmlhIFNUQVRFX1BST0dfU1lNUyBmb3IgZnV0dXJlIGNhbGxzIHRvCi0JYmZkX2ZpbmRfbmVhcmVzdF9saW5lLgotCi1XZWQgTWFyIDExIDE0OjAyOjQ3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYyAoc2ltX2NvcmVfbWFwX3RvX3N0cik6IERlbGV0ZS4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfYXR0YWNoKTogSGFuZGxlIGEgZ2VuZXJpYyBudW1iZXIgb2YgbWFwcyAtCi0gCXVwIHRvIG5yX21hcHMsIG5vdCBqdXN0IGFjY2Vzc18qIG1hcHMuCi0KLQkqIHNpbS1wcm9maWxlLmggKHN0cnVjdCBQUk9GSUxFX0RBVEEpOiBUcmFjayBucl9tYXBzIGRpZmZlcmVudAotIAltYXBzLgotCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X2NvcmUpOiBNYWtlIG1hcCB1bnNpZ25lZC4gIEl0ZXJhdGUKLSAJb3ZlciBucl9tYXBzIG5vdCBzaW1fY29yZV9ucl9tYXBzLgotCi0JKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c193YXRjaF9jb3JlKTogQ2hhbmdlCi0gCWNvcmVfbWFwIGFyZ3VtZW50IHRvIHVuc2lnbmVkLgotCShzdHJ1Y3QgX3NpbV9jb3JlKTogRGl0dG8gZm9yIHN0cnVjdCBtZW1iZXIgY29yZV9tYXAuCi0KLQkqIHNpbS1jb3JlLmggKG5yX3NpbV9jb3JlX21hcHMsIHNpbV9jb3JlXypfbWFwKTogRGVsZXRlCi0KLQkqIHNpbS1iYXNpY3MuaCAoYWNjZXNzX2lvLCBhY2Nlc3NfKl9pbyk6IERlZmluZS4KLQkobWFwX3JlYWQsIG1hcF93cml0ZSwgbWFwX2V4ZWMsIG1hcF9pbyk6IERlZmluZS4KLQotCSogc2ltLWNvcmUuYywgc2ltLWNvcmUuaCAoc2ltX2NvcmVfYXR0YWNoKTogUmVwbGFjZSBhcmd1bWVudAotIAlhdHRhY2ggd2l0aCBtb3JlIGdlbmVyaWMgbWFwbWFzay4KLQkoc2ltX2NvcmVfe3JlYWQsd3JpdGV9XyopOiBDaGFuZ2UgbWFwIGFyZ3VtZW50IHRvIHVuc2lnbmVkLgotCQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfdW5pbnN0YWxsLCBzaW1fY29yZV9hdHRhY2gsCi0gCXNpbV9jb3JlX2RldGFjaCk6IEl0ZXJhdGUgb3ZlciBucl9tYXBzIGluc3RlYWQgb2YKLSAJc2ltX2NvcmVfbnJfbWFwcy4KLQotCSogc2ltLWJyZWFrLmMgKGluc2VydF9icmVha3BvaW50KTogV3JpdGUgYnJlYWtwb2ludHMgdG8gZXhlY19tYXAKLSAJaW5zdGVhZCBvZiB0aGUgd3JpdGVfbWFwLgotCShyZW1vdmVfYnJlYWtwb2ludCk6IERpdHRvLgotCi0JKiBnZW5tbG9vcC5zaCAoZW5naW5lX3Jlc3VtZV9mdWxsKTogUmVwbGFjZSBzaW1fY29yZV8qX21hcAotIAl3aXRoIHJlYWRfbWFwLCB3cml0ZV9tYXAsIGV4ZWNfbWFwIHJlc3AuCi0KLQkqIGNnZW4tbWVtLmggKERFQ0xBUkVfR0VUTUVNLCBERUNMQVJFX1NFVE1FTSwgREVDTEFSRV9HRVRJTUVNKToKLSAJRGl0dG8uCi0KLQkqIGNnZW4tdXRpbHMuYyAoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBEaXR0by4KLQotCSogc2ltLWhydy5jIChzaW1fd3JpdGUsIHNpbV93cml0ZSk6IERpdHRvLgotCi0JKiBzaW0tdXRpbHMuaCwgc2ltLXV0aWxzLmMgKGFjY2Vzc190b19zdHIsIG1hcF90b19zdHIsCi0gCXRyYW5zZmVyX3RvX3N0cik6IE5ldyBmdW5jdGlvbnMuCi0KLU1vbiBNYXIgIDkgMTI6NTA6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogTmV3IG1lbWJlciBlbnZpcm9ubWVudC4KLQkoU1RBVEVfRU5WSVJPTk1FTlQpOiBOZXcgbWFjcm8uCi0JKiBzaW0tY29uZmlnLmMgKGN1cnJlbnRfZW52aXJvbm1lbnQpOiBEZWxldGUuCi0JKHNpbV9jb25maWdfZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2NvbmZpZyk6IFNldCBTVEFURV9FTlZJUk9OTUVOVCwgbm90IGN1cnJlbnRfZW52aXJvbm1lbnQuCi0JKiBzaW0tY29uZmlnLmggKGN1cnJlbnRfZW52aXJvbm1lbnQsQ1VSUkVOVF9FTlZJUk9OTUVOVCk6IERlbGV0ZS4KLQkoc2ltX2NvbmZpZ19kZWZhdWx0KTogQWRkIHByb3RvdHlwZS4KLQkqIHNpbS1tb2R1bGUuYyAoc2ltX3ByZV9hcmd2X2luaXQpOiBDYWxsIHNpbV9jb25maWdfZGVmYXVsdC4KLQkqIHNpbS1vcHRpb25zLmMgKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyLCBjYXNlIE9QVElPTl9FTlZJUk9OTUVOVCk6Ci0JU2V0IFNUQVRFX0VOVklST05NRU5ULCBub3QgY3VycmVudF9lbnZpcm9ubWVudC4KLQotTW9uIE1hciAgOSAxMTo1OTowMyAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuYyAoTlJfR1VBUkRTNjQpOiBDaGFuZ2UgTlJfUEFEMzIgdG8gTlJfUEFENjQuCi0KLVR1ZSBNYXIgIDMgMTA6NTM6MDUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHlwZXMuaCAoU0lHTkVEMzIsIFNJR05FRDY0KTogUGFjaWZ5IEdDQy4KLQotCSogc2ltLWFsdS5oIChBTFU2NF9CRUdJTik6IE1ha2UgYWx1NjRfciB1bnNpZ25lZC4KLQotTW9uIE1hciAgMiAxMDoyMDowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKFRBR1MpOiBNYWtlIHNtYXJ0ZXIuCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IERpdHRvLgotCi1GcmkgRmViIDI3IDE5OjA5OjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tb2R1bGUuYyAoKik6IEZpeCB0eXBvcyBpbiBhc3NlcnRpb24gdGVzdHMuCi0KLVNhdCBGZWIgMjggMTM6NTQ6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbW9kdWxlLmMgKHNpbV9wcmVfYXJndl9pbml0KTogU3RyaW5nIHBhc3NlZCB0byBhc3ByaW50ZgotIAljYW4ndCBiZSBjb25zdGFudC4KLSAgCQotCSogc2ltLW9wdGlvbnMuYyAoc2ltX3BhcnNlX2FyZ3MpOiBEaXR0by4KLQkoc2ltX2FyZ3NfY29tbWFuZCk6IFJldHVybiBPSywgaW5zdGVhZCBvZiBub3RoaW5nLCBmb3IgYW4gZW1wdHkKLSAJY29tbWFuZC4KLQotRnJpIEZlYiAyNyAxMzoyOToxMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfaW5mbyk6IFJlbmFtZSBmcm9tIHByb2ZpbGVfcHJpbnQuIERyb3AKLSAJbWlzYyBhbmQgbWlzY19jcHUgY2FsbGJhY2sgYXJndW1lbnRzLiAgVXNlCi0gCVBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0sgYW5kIFNUQVRFX1BST0ZJTEVfSU5GT19DQUxMQkFDSyBpbnN0ZWFkLgotCShwcm9maWxlX2luc3RhbGwpOiBJbnN0YWxsIHByb2ZpbGVfaW5mbyBmdW5jdGlvbi4KLQotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDSywKLSAJU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLKTogRGVmaW5lLgotCShzdHJ1Y3QgUFJPRklMRV9EQVRBKTogQWRkIGZpZWxkIGluZm9fY3B1X2NhbGxiYWNrLgotCShwcm9maWxlX3ByaW50KTogRGVsZXRlIGZ1bmN0aW9uLgotCi0JKiBzaW0tYmFzZS5oIChTVEFURV9NT0RVTEVTKTogRGVmaW5lLiAgUmVwbGFjZSBpbmRpdmlkdWFsCi0gCVNUQVRFXypfTElTVCB3aXRoIHNpbmdsZSBzdHJ1Y3QgbW9kdWxlX2xpc3QuCi0KLQkqIHNpbS1tb2R1bGUuaCAoTU9EVUxFX0lORk9fRk4sIE1PRFVMRV9JTkZPX0xJU1QpOiBEZWNsYXJlLgotCShzdHJ1Y3QgbW9kdWxlX2xpc3QpOiBEZWNsYXJlLgotCQotCSogc2ltLW1vZHVsZS5oLCBzaW0tbW9kdWxlLmMgKHNpbV9tb2R1bGVfYWRkX2luZm9fZm4sCi0gCXNpbV9tb2R1bGVfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNpbV9tb2R1bGVfaW5zdGFsbCk6IENsZWFuIHVwIG1vZHVsZSBkYXRhIHN0cnVjdHVyZXMuCi0KLQkqIHNpbS1pbmZvLmMgKHNpbV9pbmZvKTogTmV3IGZpbGUuIE5ldyBmdW5jdGlvbi4gQ2FsbAotIAlzaW1fbW9kdWxlX2luZm8uCi0KLQkqIE1ha2UtY29tbW9uLmluIChzaW0taW5mby5vKTogRGVmaW5lIHJ1bGUuCi0JKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgc2ltLWluZm8uby4KLQotCi1GcmkgRmViIDI3IDE4OjI2OjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iYXNlLmggKHNpbV9jcHVfYmFzZSk6IE5ldyBtZW1iZXJzIG5hbWUsIG9wdGlvbnMuCi0JKHNpbV9jcHVfbG9va3VwKTogQWRkIHByb3RvdHlwZS4KLQkqIHNpbS1tb2R1bGUuYyAoc2ltX3ByZV9hcmd2X2luaXQpOiBQcm92aWRlIGRlZmF1bHQgbmFtZXMgZm9yIGNwdXMuCi0JKiBzaW0tb3B0aW9ucy5oIChERUNMQVJFX09QVElPTl9IQU5ETEVSKTogTmV3IGFyZ3VtZW50IGBjcHUnLgotCShzaW1fYWRkX29wdGlvbl90YWJsZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBzaW0tb3B0aW9ucy5jIChzaW1fYWRkX29wdGlvbl90YWJsZSk6IE5ldyBhcmd1bWVudCBgY3B1Jy4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIsc3RhbmRhcmRfaW5zdGFsbCk6IFVwZGF0ZS4KLQkoc2ltX3BhcnNlX2FyZ3MpOiBIYW5kbGUgY3B1IHNwZWNpZmljIG9wdGlvbnMuCi0JKHByaW50X2hlbHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaW1fcHJpbnRfaGVscCk6IENhbGwgaXQuICBQcmludCBjcHUgc3BlY2lmaWMgb3B0aW9ucy4KLQkoZmluZF9tYXRjaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNpbV9hcmdzX2NvbW1hbmQpOiBDYWxsIGl0LiAgSGFuZGxlIGNwdSBzcGVjaWZpYyBvcHRpb25zLgotCSogc2ltLXV0aWxzLmMgKHNpbV9jcHVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCSogc2ltLW1lbW9wdC5jIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCi0JKHNpbV9tZW1vcHRfaW5zdGFsbCk6IFVwZGF0ZS4KLQkqIHNpbS1tb2RlbC5jIChtb2RlbF9vcHRpb25faGFuZGxlcik6IFVwZGF0ZS4KLQkobW9kZWxfaW5zdGFsbCk6IFVwZGF0ZS4KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCi0JKHByb2ZpbGVfaW5zdGFsbCk6IFVwZGF0ZS4KLQkqIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IFVwZGF0ZS4KLQkodHJhY2VfaW5zdGFsbCk6IFVwZGF0ZS4KLQkqIHNpbS13YXRjaC5jICh3YXRjaHBvaW50X29wdGlvbl9oYW5kbGVyKTogVXBkYXRlLgotCShzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogVXBkYXRlLgotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX29wdGlvbl9oYW5kbGVyKTogVXBkYXRlLgotCShzY2FjaGVfaW5zdGFsbCk6IFVwZGF0ZS4KLQotV2VkIEZlYiAyNSAxMTowMDoyNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoY2hlY2spOiBSdW4gYG1ha2UgY2hlY2snIGluIHRlc3RzdWl0ZSBkaXIuCi0KLVdlZCBGZWIgMjUgMTQ6NDA6MjQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHJhY2UuYyAodHJhY2VfcmVzdWx0MCk6IE5ldyBmdW5jdGlvbi4KLQotCSogc2ltLXRyYWNlLmggKFRSQUNFX0ZQXyosIFRSQUNFX0ZQVV8qKTogUmVuYW1lIFRSQUNFX0ZQVV8qCi0gCW1hY3JvJ3MgdG8gVFJBQ0VfRlBfKi4gVFJBQ0VfRlBVXyogc2hvdWxkIGJlIGRlZmluZWQgYW5kIHVzZWQgd2hlbgotIAl0cmFjaW5nIHNpbV9mcHUgdmFyaWFibGVzLgotCShUUkFDRV9BTFVfUkVTVUxUMCk6IERlZmluZS4KLQkoVFJBQ0VfRlBfUkVTVUxUX1dPUkQpOiBEZWZpbmUuCi0JKFRSQUNFX0ZQX0lOUFVUX1dPUkQxKTogRGVmaW5lLgotCi0JKiBzaW0tZnB1LmMsIHNpbS1mcHUuaCAoc2ltX2ZwdV9tYXgzMiwgc2ltX2ZwdV9tYXg2NCwgc2ltX2ZwdV9vbmUsCi0gCXNpbV9mcHVfdHdvKTogTmV3IGNvbnN0YW50cy4KLQkoc2ltX2ZwdV9vcDEsIHNpbV9mcHVfb3AyKTogTmV3IHR5cGVzLgotCShzdHJ1Y3QgX3NpbV9mcHUpOiBEZWxldGUgbWVtYmVyIHJlc3VsdC4gIFJlLW9yZGVyIG90aGVyIG1lbWJlcnMuCi0JKHNpbV9mcHVfc2lnbiwgc2ltX2ZwdV9leHApOiBOZXcgZnVuY3Rpb25zLgotCShzaW1fZnB1X21heCwgc2ltX2ZwdV9taW4pOiBuZXcgZnVuY3Rpb25zLgotCShFWFBNQVgzMiwgRVhQTUFYNjQsIE5SX1BBRDMyLCBOUl9QQUQ2NCwgTlJfR1VBUkRTMzIsIE5SX0dVQVJEUzY0LAotIAlOT1JNQUxfRVhQTUFYMzIsIE5PUk1BTF9FWFBNQVg2NCk6IERlZmluZS4KLQkKLVR1ZSBGZWIgMjQgMjI6NDU6MzkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnQpOiBEZWxldGUgZHVwbGljYXRlIHRlc3Qgb2YKLQlQUk9GSUxFX0lOU05fSURYLgotCShwcm9maWxlX3ByaW50X3BjKTogRXhpdCBlYXJseSBpZiBkYXRhIGNvbGxlY3Rpb24gbm90IHNldCB1cC4KLQkocHJvZmlsZV9wcmludF9jb3JlKTogU2ltcGxpZnkgYnkgY2FsbGluZyBzaW1fY29yZV9tYXBfdG9fc3RyLgotCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfbWFwX3RvX3N0cik6IERlY2xhcmUuCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfdG9fc3RyKTogTWFrZSBub24tc3RhdGljLgotCi0JKiBnZW5tbG9vcC5zaCAoZW5naW5lX3Jlc3VtZSk6IFVwZGF0ZSBpbnNuX2NvdW50IGJlZm9yZSBleGl0aW5nLgotCShlbmdpbmVfcmVzdW1lX2Z1bGwpOiBLZWVwIGFjY3VyYXRlIGNvcmUgcHJvZmlsZSBkYXRhLgotCi0JKiBjZ2VuLXV0aWxzLmMgKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogRG9uJ3QgdXNlCi0Jc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sIGl0IG1lc3NlcyB1cCBwcm9maWxpbmcgcmVzdWx0cy4KLQotTW9uIEZlYiAyMyAyMDo0NTo1NyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlIHdpdGggTU4xMDMwMCBhZGRpdGlvbnMuCi0KLVR1ZSBGZWIgMjQgMTM6MTg6NDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHJhY2UuaCAoVFJBQ0VfQUxVX1JFU1VMVDIpOiBEZWZpbmUuCi0JCi0JKiBzaW0tdHJhY2UuaCwgc2ltLXRyYWNlLmMgKHRyYWNlX3Jlc3VsdF93b3JkMiwKLSAJdHJhY2VfaW5wdXRfd29yZDQsIHRyYWNlX3Jlc3VsdF93b3JkNCk6IE5ldyBmdW5jdGlvbi4KLQotTW9uIEZlYiAyMyAxMzowODozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXNpbS5oIChTRU1fTkVYVF9QQyk6IE5ldyBhcmcgYGxlbicuCi0KLQkqIHNpbS14Y2F0Lmg6IERlbGV0ZS4KLQkqIGNnZW4tbWVtLmg6IERlbGV0ZSBpbmNsdXNpb24gb2Ygc2ltLXhjYXQuaC4KLQkqIGNnZW4tc2ltLmg6IERpdHRvLgotCSogc2ltLWFsdS5oOiBSZXBsYWNlIHNpbS14Y2F0Lmggd2l0aCBzeW1jYXQuaC4KLQkqIHNpbS1uLWJpdHMuaDogRGl0dG8uCi0JKiBzaW0tbi1jb3JlLmg6IERpdHRvLgotCSogc2ltLW4tZW5kaWFuLmg6IERpdHRvLgotCi1Nb24gRmViIDIzIDEzOjE5OjU4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzeXNjYWxsLmMgKGNiX3N5c2NhbGwpOiBIYW5kbGUgc2hvcnQgcmVhZHMsIGFuZCBFT0YuCi0KLVR1ZSBGZWIgMjQgMDA6Mjk6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdHJhY2UuYyAocHJpbnRfZGF0YSk6IGNhc2UgdHJhY2VfZm10X2ZwIG1pc3NpbmcgYnJlYWsuICBVc2UKLSAJc2ltX2ZwdSB0byBzYWZlbHkgcHJpbnQgZnBfd29yZCB2YWx1ZXMuCi0JKHByaW50X2RhdGEpOiBBZGQgdHJhY2VfZm10X2Jvb2wgYW5kIHRyYWNlX2ZtdF9hZGRyLgotCSh0cmFjZV9yZXN1bHRfYm9vbDEsIHRyYWNlX3Jlc3VsdF9hZGRyMSk6IE5ldyBmdW5jdGlvbnMuCi0JKHRyYWNlX2lucHV0X2Jvb2wxLCB0cmFjZV9pbnB1dF9hZGRyMSk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIHNpbS10cmFjZS5oIChUUkFDRV9GUFVfKik6IERlZmluZS4KLQotTW9uIEZlYiAyMyAxMzoyNDo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuaCAoZW51bSBzaW1fZnB1X2NsYXNzKTogQWRkIHNpbV9mcHVfY2xhc3NfZGVub3JtLgotCShzaW1fZnB1X2ZwdG8sIHNpbV9mcHVfdG9mcCk6IERlZmluZS4KLQotRnJpIEZlYiAyMCAxODowODo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuYyAoc2ltX2ZwdV9jbXApOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBGZWIgMTggMTY6Mjk6MjEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi11dGlscy5oIChzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVzZSBDR0VOX0lOU05fQklUU0laRQotCWluc3RlYWQgb2YgYWJ1Zi0+bGVuZ3RoLgotCSogc2ltLXRyYWNlLmMgKHRyYWNlX29wdGlvbnMpOiBIYXZlIC10IG9ubHkgdHJhY2UgYSBmZXcgdXNlZnVsIHRoaW5ncy4KLQkoc2V0X3RyYWNlX29wdGlvbl9tYXNrKTogUmVuYW1lZCBmcm9tIHNldF90cmFjZV9vcHRpb25zLgotCShzZXRfdHJhY2Vfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSh0cmFjZV9vcHRpb25faGFuZGxlcik6IFVwZGF0ZSBjYWxscyB0byBzZXRfdHJhY2Vfb3B0aW9ueyxfbWFza30uCi0JKiBzaW0tdHJhY2UuaCAoVFJBQ0VfVVNFRlVMX01BU0spOiBOZXcgbWFjcm8uCi0KLVdlZCBGZWIgMTggMTI6NDI6MTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tYmFzaWNzLmg6IERlY2xhcmUgc3RydWN0IF9zaW1fZnB1LgotCi1UdWUgRmViIDE3IDE2OjI3OjQ2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXRyYWNlLmggKFRSQUNFX0FMVV9JTlBVVCosIFRSQUNFX0FMVV9SRVNVTFQpOiBEZWZpbmUuCi0JKHRyYWNlX3ByZWZpeCwgdHJhY2VfaW5wdXQqLCB0cmFjZV9yZXN1bHQqKTogRGVjbGFyZS4KLQkodHJhY2Vfb25lX2luc24pOiBDaGFuZ2UgZGVjbGFyYXRpb24sIGFzc3VtZSB0cmFjZV9wcmVmaXggY2FsbGVkLgotCSh0cmFjZV9nZW5lcmljKTogTGlrZSB0cmFjZV9vbmVfaW5zbi4KLQkoVFJBQ0VfQUxVX0lEWCwgVFJBQ0VfKl9JRFgpOiBDaGFuZ2UgI2RlZmluZSdzIHRvIGVudW0uCi0JKFRSQUNFX2FsdSwgVFJBQ0VfW2Etel0qKTogVXBkYXRlLgotCQotCSogc2ltLXRyYWNlLmMgKHRyYWNlX3ByZWZpeCwgdHJhY2VfaW5wdXQqLCB0cmFjZV9yZXN1bHQqLAotIAl0cmFjZV9pbnNuLCBzYXZlX2RhdGEsIHRyYWNlX2lkeF90b19zdHIsIHByaW50X2RhdGEpOiBOZXcKLSAJZnVuY3Rpb25zLgotCSh0cmFjZV9vbmVfaW5zbik6IFJld3JpdGUuCi0JKHRyYWNlX2dlbmVyaWMpOiBOZXcgZnVuY3Rpb24uCi0JCi1UdWUgRmViIDE3IDE3OjI3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChVU0VfTUFJTlRBSU5FUl9NT0RFKTogTmV3IHZhcmlhYmxlLgotCi0JKiBjZ2VuLXNpbS5oIChTRU1BTlRJQ19DQUNIRV9GTik6IERlbGV0ZS4KLQkoU0VNQU5USUNfRk4pOiBSZXdyaXRlIGRlY2xhcmF0aW9uLgotCShERUNPREUpOiBVcGRhdGUgdHlwZSBvZiBzZW1hbnRpY19mYXN0IG1lbWJlci4KLQkoe0VYLFNFTX1fRk5fTkFNRSk6IEhhdmUgb25seSBvbmUgdmVyc2lvbi4KLQkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogRGVsZXRlIGNvbmRpdGlvbmFscyBzdXJyb3VuZGluZwotCW1lbWJlciBzY2FjaGVfc2l6ZS4KLQotVHVlIEZlYiAxMCAxODozMTo0OSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1sb2FkLmMgKHNpbV9sb2FkX2ZpbGUpOiBQcmludCBMTUEvVk1BIGFjY29yZGluZyB0byB2YWx1ZQotIAl1c2VkLgotCi1UdWUgRmViIDEwIDE0OjU2OjIzIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5jOiBBZGQgbWlzc2luZyBwcm90b3R5cGVzIGZvciBXSVRIX0RFVklDRVMuCi0JQWRkIG1pc3NpbmcgcGFyYW1ldGVycyB0byBkZXZpY2VfaW8gY2FsbHMuCi0JKiBzaW0tY29yZS5oOiBBZGQgbWlzc2luZyBwYXJhbWV0ZXJzIHRvIGRldmljZV9pbyBjYWxscy4KLQotTW9uIEZlYiAgOSAxNDo0ODozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLXNpbS5oIChERUNPREUpOiBBbHdheXMgdXNlIHN3aXRjaCBmb3IgYHJlYWQnIGZvciBub3cuCi0JKFBBUkVYRUMpOiBSZW5hbWVkIGZyb20gUEFSQUxMRUxfRVhFQy4gIEFsbCB1c2VzIHVwZGF0ZWQuCi0JKFNFTUFOVElDeyxfQ0FDSEV9X0ZOKTogRml4IHJldHVybiB0eXBlLgotCSogZ2VubWxvb3Auc2ggKEBjcHVAX2VuZ2luZV9ydW4pOiBEZWxldGUgYGN1cnJlbnRfc3RhdGUnLgotCShlbmdpbmVfcmVzdW1lKTogTGlrZXdpc2UuICBNYWtlIGBlbmdpbmUnIHZvbGF0aWxlLiAgU2F2ZSBjb3B5Ci0Jb2YgY3B1IHBvaW50ZXIgaW4gdm9sYXRpbGUgb2JqZWN0LiAgSW5pdGlhbGl6ZSByZWFkIHN3aXRjaCBpZgotCS1wYXJhbGxlbC4KLQotVGh1IEZlYiAgNSAxMzoyNzowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1zaW0uaCAoRVhfRk5fTkFNRSk6IF9leGNfIC0+IF9leF8uCi0JKFNFTV9JTlNOKTogTmV3IG1hY3JvLgotCi1UdWUgRmViICAzIDE2OjMxOjU2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXJ1bi5jIChzaW1fZW5naW5lX3J1bik6IEFzc3VtZSBJTUVNIGlzIDMyIGJpdC4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU3VuIEZlYiAgMSAxNjoxNjo1NyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS10eXBlcy5oIChmcF93b3JkKTogTmV3IHR5cGUsIGRlZmluZSBhY2NvcmRpbmcgdG8KLSAJV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRS4KLQotCSogYWNsb2NhbC5tNCAoZGVmYXVsdF9zaW1fZmxvYXRpbmdfcG9pbnRfYml0c2l6ZSk6IEFkZAotIAljb25maWd1cmF0aW9uIG9mIHNpemUgb2YgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLgotCi1TdW4gRmViICAxIDE0OjAyOjMxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludCk6IE9ubHkgcHJpbnQgQ1BVIDxOPiBpZiBvdGhlcgotIAlvdXRwdXQgaXMgZ29pbmcgdG8gYXBwZWFyLgotCi1TYXQgSmFuIDMxIDE4OjE1OjQxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TYXQgSmFuIDMxIDE4OjAzOjU1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXR5cGVzLmggKGFkZHJlc3Nfd29yZCk6IFR5cGVkZWYgYWNjb3JkaW5nIHRvCi0gCVdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRS4KLQkoc2lnbmVkX2NlbGwsIHVuc2lnbmVkX2NlbGwsIG5hdHVyYWxfY2VsbCk6IERpdHRvIHVzaW5nCi0gCVdJVEhfVEFSR0VUX0NFTExfQklUU0laRS4KLQkKLQkqIHNpbS1jb25maWcuaCAoV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFKTogRGVmaW5lLgotCShXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUpOiBEZWZpbmUuCi0JKFdJVEhfSE9TVF9XT1JEX0JJVFNJWkUpOiBEZWxldGUuCi0KLQkqIHNpbS1jb25maWcuYyAocHJpbnRfc2ltX2NvbmZpZyk6IFVwZGF0ZS4KLQotCSogYWNsb2NhbC5tNCAoU0lNX0FDX09QVElPTl9CSVRTSVpFKTogQWRkIHN1cHBvcnQgZm9yCi0gCWNvbmZpZ3VyYXRpb24gb2YgYWRkcmVzcyBhbmQgT3BlbkZpcm13YXJlIGNlbGwgc2l6ZXMuCi0KLUZyaSBKYW4gMzAgMDk6MzY6MzMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZW5naW5lLmggKHNpbV9lbmdpbmVfcnVuKTogQWRkIGFyZ3VtZW50IG5yX2NwdXMuCi0JKiBzaW0tcnVuLmMgKHNpbV9lbmdpbmVfcnVuKTogVXBkYXRlLgotCQotCSogc2ltLWVuZ2luZS5oIChTSU1fRU5HSU5FX0hBTFRfSE9PSyk6IFVzZSBTRVRfQ1BVX0NJQSBpbnN0ZWFkIG9mCi0gCUNQVV9DSUEuCi0gIAkqIHNpbS1ydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBEaXR0by4KLQotCSogc2ltLXJlc3VtZS5jIChzaW1fcmVzdW1lKTogT2J0YWluIG5yX2NwdXMgZnJvbSBzaW1fZW5naW5lLgotCShzaW1fcmVzdW1lKTogUGFzcyBucl9jcHVzIHRvIHNpbV9lbmdpbmVfcnVuLgotCi0JKiBzaW0tZW5naW5lLmggKHN0cnVjdCBfc2ltX2VuZ2luZSk6IEFkZCBtZW1iZXIgbnJfY3B1cy4KLQkKLQkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9pbml0KTogSGFyZHdpcmUgbnJfY3B1cyB0bwotIAlNQVhfTlJfUFJPQ0VTU09SUy4KLQkoc2ltX2VuZ2luZV9ucl9jcHVzKSBzaW0tZW5naW5lLmMsIHNpbS1lbmdpbmUuaDogTmV3IGZ1bmN0aW9uCi0JCi1GcmkgSmFuIDIzIDE0OjIwOjU0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc3RhbXAtdHZhbHMpOiBOZXcgcnVsZS4KLQkodGFyZy12YWxzLmgsdGFyZy1tYXAuYyk6IERlcGVuZCBvbiBpdC4KLQkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtdHZhbHMuCi0KLVR1ZSBKYW4gMjAgMjE6MzU6MTMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpbS11dGlscy5jIChzaW1fc3RhdGVfYWxsb2MpOiAjaWYgMCB2YXJpYWJsZSB0aGF0IGlzIG9ubHkgdXNlZAotCWluIGNvZGUgYWxzbyAjaWYgMCdlZC4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGFjbG9jYWwubTQ6IFJlY29nbml6ZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi0KLU1vbiBKYW4gMTkgMTI6NDU6NDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tc2NhY2hlLmg6IERlbGV0ZWQuCi0JKiBNYWtlLWNvbW1vbi5pbiAoY2dlbi1ydW4ubyxjZ2VuLXNjYWNoZS5vKTogRGVsZXRlIGNnZW4tc2NhY2hlLmggZGVwLgotCSogY2dlbi1zY2FjaGUuYzogT25seSBjb21waWxlIGNvbnRlbnRzIGlmIFdJVEhfU0NBQ0hFLgotCShzY2FjaGVfaW5pdCk6IFVzZSBydW50aW1lIGNvbXB1dGVkIHNpemUgb2YgU0NBQ0hFLgotCShzY2FjaGVfZmx1c2gpOiBMaWtld2lzZS4KLQkqIGNnZW4tbWVtLmggKEdFVElNRU1VW1FIU0RdSSk6IERlY2xhcmUuCi0JKFtHU11FVFR7UUksVVFJLEhJLFVISSxTSSxVU0ksREksVURJfSk6IERlY2xhcmUuCi0JKiBjZ2VuLXNpbS5oOiBTY2FjaGUgc3VwcG9ydCBtb3ZlZCBoZXJlLgotCShQQyk6IFJlZG8gZGVmaW5pdGlvbi4KLQkoQVJHQlVGLFNDQUNIRSxQQVJBTExFTF9FWEVDKTogUHJvdmlkZSBmb3J3YXJkIGRlY2xzLgotCShERUNPREUpOiBBZGQgcGFyYWxsZWwgZXhlY3V0aW9uIHN1cHBvcnQuCi0JT25seSBpbmNsdWRlIHNlbWFudGljIGxhYmVsIG1lbWJlcnMgaWYgdXNpbmcgc3dpdGNoLgotCShTV0lUQ0gsQ0FTRSxCUkVBSyxERUZBVUxULEVORFNXSVRDSCk6IFBvcnRhYmxlIGNvbXB1dGVkIGdvdG8gc3VwcG9ydC4KLQkoQ0dFTl9DUFUpOiBEZWxldGUgbWVtYmVycyBleGVjX3N0YXRlLCBoYWx0X3NpZ3JjLCBoYWx0X2ptcF9idWYuCi0JKElBRERSLENJQSxTRU1fQVJHLEVYX0ZOX05BTUUsU0VNX0ZOX05BTUUsUkVDT1JEX0lBRERSLFNFTV9BUkdCVUYsCi0JU0VNX05FWFRfUEMsU0VNX0JSQU5DSF9WSUFfe0NBQ0hFLEFERFJ9LFNFTV9ORVdfUENfQUREUik6IE1vdmVkIGhlcmUKLQlmcm9tIGNnZW4tdHlwZXMuaC4KLQkoZW5naW5lX3tzdG9wLHJ1bixyZXN1bWUsaGFsdCxzaWduYWx9KTogRGVsZXRlIGRlY2xzLgotCSogY2dlbi10eXBlcy5oIChDR0VOX3tYQ0FUMyxDQVQzfSk6IERlbGV0ZS4KLQkoYXJnYnVmLHNjYWNoZSk6IERlbGV0ZSBmb3J3YXJkIGRlY2xzLgotCShTVEFURSk6IERlbGV0ZSBkZWNsLgotCSogY2dlbi11dGlscy5jOiBEb24ndCBpbmNsdWRlIGRlY29kZS5oLCBtZW0tb3BzLmgsIHNlbS1vcHMuaC4KLQlJbmNsdWRlIGNnZW4tbWVtLmgsIGNnZW4tb3BzLmguCi0JKGVuZ2luZV9oYWx0LGVuZ2luZV9zaWduYWwpOiBEZWxldGUuCi0JKHtleCxleGMsc2VtLHNlbWN9X2lsbGVnYWwpOiBEZWxldGUuCi0JKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogUmVzdWx0IG9mIGV4dHJhY3QgZm4gaXMgaW4gYml0cy4KLQkqIGdlbm1sb29wLnNoOiBSZXdyaXRlLgotCi0JKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2luc24pOiBTZXQgcHJpbnRlZF9yZXN1bHRfcD0wIGlmIG5vdCB0cmFjaW5nCi0JbGluZSBudW1iZXJzLgotCi0JKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IERlbGV0ZSBtZW1iZXIgYG1vZGVsJy4KLQkoc2ltX2NwdV9iYXNlKTogQWRkIG1lbWJlciBgbW9kZWwnLgotCSogc2ltLW1vZGVsLmggKElNUF9QUk9QRVJUSUVTKTogTmV3IHR5cGUuCi0JKE1BQ0gpOiBOZXcgbWVtYmVycyBpbXBfcHJvcHMsIG1vZGVscy4KLQkobW9kZWxzKTogRGVsZXRlIGRlY2wuCi0JKiBzaW0tbW9kZWwuYyAoc2V0X21vZGVsKTogVXBkYXRlLgotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9tb2RlbCk6IFVwZGF0ZS4KLQotCSogc2ltLXV0aWxzLmMgKHNpbV9zdGF0ZV9hbGxvYyk6IERlbGV0ZSBzZXR0aW5nIG9mIGNwdSBiYWNrbGluayBoZXJlLgotCi1GcmkgSmFuIDE2IDEyOjMzOjA5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdHJhY2UuYyAodHJhY2VfaW5zbik6IENhbGwgQ0dFTl9JTlNOX01ORU1PTklDKCkgcmF0aGVyIHRoYW4KLQlDR0VOX0lOU05fU1lOVEFYKCkuCi0KLU1vbiBEZWMgMTUgMjM6MTc6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1Nb24gRGVjIDE1IDIzOjE2OjAzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQVIpOiBDaGVjayBmb3Igc2lnYWN0aW9uLgotCi1UaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChzaW0tY29yZS5vKTogRGVwZW5kIG9uICQoc2ltX21haW5faGVhZGVycykuCi0KLQkqIHNpbS1jb25maWcuaCAoV0lUSF9UUkVFX1BST1BFUlRJRVMpOiBEZWZpbmUgYXMgMC4KLQkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IFJlcGxhY2UgV0lUSF9ERVZJQ0VTIHdpdGgKLQlXSVRIX1RSRUVfUFJPUEVSVElFUy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgRGVjICAzIDE3OjU2OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChTSU1fRU5WSVJPTk1FTlQpOiBOZXcgdmFyaWFibGUuCi0JKENPTkZJR19DRkxBR1MpOiBBZGQgaXQuCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0VOVklST05NRU5UKTogSGFuZGxlCi0JLS1lbmFibGUtc2ltLWVudmlyb25tZW50IG9wdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBzaW0tY29uZmlnLmggKGVudmlyb25tZW50IHN1cHBvcnQpOiBSZXdyaXRlLgotCSogc2ltLWNvbmZpZy5jIChjdXJyZW50X2Vudmlyb25tZW50KTogRGVmaW5lIGFzIGVudW0sIHVuY29uZGl0aW9uYWxseS4KLQkoY3VycmVudF9hbGlnbm1lbnQpOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCShjb25maWdfZW52aXJvbm1lbnRfdG9fYSk6IFVwZGF0ZS4KLQkoY29uZmlnX2FsaWdubWVudF90b19hKTogRml4IHR5cGUgb2YgYXJndW1lbnQuICBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCShzaW1fY29uZmlnKTogSGFuZGxlIGVudmlyb25tZW50IGFuZCBhbGlnbm1lbnQgZGV0ZXJtaW5hdGlvbgotCXVuY29uZGl0aW9uYWxseS4gIERlbGV0ZSBzYW5pdHkgY2hlY2tzIG9mIGN1cnJlbnRfZW52aXJvbm1lbnQsCi0JdW5uZWNlc3NhcnkuCi0JKHByaW50X3NpbV9jb25maWcpOiBVcGRhdGUuCi0JKiBzaW0tb3B0aW9ucy5jIChTVEFOREFSRF9PUFRJT05TIGVudW0pOiBBZGQgT1BUSU9OX0VOVklST05NRU5ULgotCShzdGFuZGFyZF9vcHRpb25zKTogQWRkIC0tZW52aXJvbm1lbnQuCi0JKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyKTogTGlrZXdpc2UuCi0KLUZyaSBOb3YgMjggMTI6MjE6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tYWx1Lmg6IEFkZCBub3RlcyBvbiBjYXJyeSB2cyBib3Jyb3cgZm9yIHN1YnRyYWN0aW9uLgotCShBTFV7LDgsMTYsMzIsNjR9QUREKTogUmVkZWZpbmUgQUREIG1hY3JvIGFzIGFkZCBvdmVyZmxvd2luZy4KLQkoQUxVeyw4LDE2LDMyLDY0fUFEREMpOiBEZWZpbmUgLSBhZGQgY2FycnlpbmcuCi0JKEFMVXssOCwxNiwzMiw2NH1TVUIpOiBSZWRlZmluZSBTVUIgbWFjcm8gYXMgc3VidHJhY3Qgb3ZlcmZsb3dpbmcuCi0JKEFMVXssOCwxNiwzMiw2NH1TVUJCKTogRGVmaW5lIC0gc3VidHJhY3QgYm9ycm93aW5nLgotCShBTFV7LDgsMTYsMzIsNjR9U1VCQyk6IERlZmluZSAtIHRyYWN0IGNhcnJ5aW5nLgotCShBTFV7LDgsMTYsMzIsNjR9QUREX0NBLCBBTFV7LDgsMTYsMzIsNjR9QUREQ19DKTogUmVwbGFjZSBzaW5nbGUKLSAJYXJndW1lbnQgQUREX0NBIG1hY3JvIHdpdGggdHdvIGFyZ3VtZW50IEFERENfQyAtIGFkZCBjYXJyeWluZyB3aXRoCi0gCWNhcnJ5IGluLgotCShBTFV7LDgsMTYsMzIsNjR9U1VCX0NBLCBBTFV7LDgsMTYsMzIsNjR9U1VCQ19YKTogUmVwbGFjZSBzaW5nbGUKLSAJYXJndW1lbnQgU1VCX0NBIG1hY3JvIHdpdGggdHdvIGFyZ3VtZW50IFNVQkNfWCAtIHN1YnRyYWN0Ci0gCWNhcnJ5aW5nLCBleHRlbmRlZC4KLQkoQUxVeyw4LDE2LDMyLDY0fVNVQkJfQik6IERlZmluZSAtIHN1YnRyYWN0IGJvcnJvd2luZyB3aXRoCi0gCWJvcnJvdy1pbi4KLQkoQUxVeyw4LDE2LDMyLDY0fU5FR0MsIEFMVXssOCwxNiwzMiw2NH1ORUdCKTogRGVmaW5lLgotCi1TdW4gTm92IDMwIDE3OjQwOjU3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW0taW8uYyAoc2ltX2lvX3tzeXNjYWxscyxnZXRzdHJpbmd9KTogRGVsZXRlLiAgTm8gbG9uZ2VyIHVzZWQuCi0JKiBzaW0taW8uaCAoc2ltX2lvX3N5c2NhbGxzKTogRGVsZXRlLgotCi1GcmkgTm92IDI4IDIwOjEwOjA5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzeXNjYWxsLmMgKGNiX3N5c2NhbGwpOiBBZGQgbWlzc2luZyBlbHNlLCBzbyB3cml0ZSB0byBzdGRvdXQKLQlpc24ndCBkb3VibGVkLgotCi0JKiBzaW0tYWx1LmggKEFMVXssOCwxNiwzMiw2NH1fU0VUX0NBUlJZKTogUHJvdmlkZSBtYWNyb3MgdG8gaW1wb3J0Ci0JdGhlIGNhcnJ5IGJpdCBmcm9tIHRoZSBDUFUncyBwc3cuCi0KLUZyaSBOb3YgMjggMTE6MTU6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2Vubmx0dmFscy5zaDogUmVkbyBzeXNjYWxsIHN1cHBvcnQuCi0JKiBubHR2YWxzLmRlZjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBOb3YgMjYgMTY6NDk6MzggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHN5c2NhbGwuYyAoY2Jfc3lzY2FsbCk6IElmIHdyaXRpbmcgdG8gc3Rkb3V0IG9yIHN0ZGVyciwgZmx1c2gKLQl0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgotCi1XZWQgTm92IDI2IDEyOjMyOjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlvLmMgKHNpbV9pb19nZXRzdHJpbmcpOiBEZWxldGUgdW51c2VkIGxlbjIuCi0JKHNpbV9pb19zeXNjYWxscyk6IERpdHRvIGZvciBzeXNfZXJybm8uCi0KLVdlZCBOb3YgMjYgMTE6MTg6NDAgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3lzY2FsbC5jIChjYl9zeXNjYWxsKTogVGVzdCBDQl9TWVNDQUxMIHN0cnVjdCBtYWdpYyBudW1iZXIuCi0KLQkqIE1ha2UtY29tbW9uLmluIChydW4ubyk6IERlcGVuZCBvbiByZW1vdGUtc2ltLmguCi0JKG5ydW4ubyxzaW0taGxvYWQubyxzaW0taHJ3Lm8pOiBMaWtld2lzZS4KLQkoc2ltLWlvLm8sc2ltLXJlYXNvbi5vLHNpbS1yZXN1bWUubyk6IExpa2V3aXNlLgotCi1UdWUgTm92IDI1IDIwOjEyOjQ2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW0taW8uYyAoc2ltX2lvX3N5c2NhbGxzKTogRGlzYWJsZSBsc2Vlay4KLQotVHVlIE5vdiAyNSAwMDoxMjozOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZ2Vubmx0dmFscy5zaDogR2VuZXJhdGUgc3lzY2FsbCB2YWx1ZXMgZm9yIGQzMHYuCi0KLQkqIGdlbm5sdHZhbHMuc2g6IFVzZSBsaWJnbG9zcy9zeXNjYWxsLmggZm9yIHNwYXJjLgotCSogbmx0dmFscy5kZWY6IFJlZ2VuZXJhdGUuCi0KLQkqIGNhbGxiYWNrLmMgKG9zX3N0YXQpOiBNYWtlIDNyZCBhcmcgYSBob3N0IHN0cnVjdCBzdGF0IHB0ci4KLQkob3NfZnN0YXQpOiBMaWtld2lzZS4gIFZhbGlkYXRlIGZkIGFyZ3VtZW50LgotCShjYl9ob3N0X3RvX3RhcmdldF9zdGF0KTogRGVsZXRlIGJpZ19wIGFyZy4gIElmIEhTIGFyZyBpcyBOVUxMLAotCWp1c3QgY29tcHV0ZSB0YXJnZXQgc3RhdCBzdHJ1Y3QgbGVuZ3RoLgotCSogc3lzY2FsbC5jOiAjaW5jbHVkZSAibGliaWJlcnR5LmgiLCA8c3lzL3R5cGVzLmg+LCA8c3lzL3N0YXQuaD4uCi0JKEVOT1NZUyxFTkFNRVRPT0xPTkcpOiBQcm92aWRlIGRlZmluaXRpb25zIGlmIG1pc3NpbmcuCi0JKGdldF9zdHJpbmcpOiBSZXR1cm4gaG9zdCBlcnJubyB2YWx1ZXMgc28gdGhleSBjYW4gYmUgcHJvcGVybHkKLQl0cmFuc2xhdGVkIGxhdGVyLgotCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCi0JKGNiX3N5c2NhbGwsIGNhc2VzIG9wZW4sdW5saW5rKTogVXNlIGdldF9wYXRoIGluc3RlYWQgb2YgZ2V0X3N0cmluZy4KLQkoY2Jfc3lzY2FsbCwgY2FzZSByZWFkKTogVXNlIHJlYWRfc3RkaW4gZm9yIGZpbGUgZGVzY3JpcHRvciAwLgotCShjYl9zeXNjYWxsLCBjYXNlIHdyaXRlKTogVXNlIHdyaXRlX3N0ZGVyciBmb3IgZmlsZSBkZXNjcmlwdG9yIDIuCi0JKGNiX3N5c2NhbGwpOiBBZGQgY2FzZXMgZm9yIGxzZWVrLCB1bmxpbmssIHN0YXQsIGZzdGF0LCB0aW1lLgotCShnZXRfcGF0aCk6IE5ldyBmdW5jdGlvbi4KLQotTW9uIE5vdiAyNCAxODo1NjowNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2ltLWlvLmMgKHNpbV9pb19zeXNjYWxscyk6IE5ldyBmdW5jdGlvbiB0byBwcm92aWRlIHN5c3RlbSBjYWxsCi0JZW11bGF0aW9uLiAgUHJvdmlkZSBleGl0LCBvcGVuLCBjbG9zZSwgcmVhZCwgd3JpdGUsIGxzZWVrLCBhbmQKLQl1bmxpbmsuCi0JKHNpbV9pb19nZXRzdHJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIGEgc3RyaW5nIGZyb20gYQotCXNpbXVsYXRlZCBtZW1vcnkgbG9jYXRpb24uCi0KLQkqIHNpbS1pby5oIChzaW1faW9fc3lzY2FsbHMpOiBBZGQgZGVjbGFyYXRpb24uCi0KLU1vbiBOb3YgMjQgMTI6MDk6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IEZpeCBzcGVsbGluZyBlcnJvciBpbiBtZXNzYWdlLgotCi0JKiBzaW0taHJ3LmMgKHNpbV9yZWFkKTogVXNlIHJlYWQgbWFwLCBub3Qgd3JpdGUgbWFwLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoYWxsKTogQWRkIC5nZGJpbml0LgotCSogZ2RiaW5pdC5pbjogQWRkIGR1bXAgY29tbWFuZC4KLQotCSogc2ltLW1vZGVsLmMgKG1vZGVsX29wdGlvbnMpOiBVc2UgJ1wwJyBmb3IgYHNob3J0b3B0Jy4KLQotCSogc2ltLXRyYWNlLmMgKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogU2V0IHN0YXRlIHRyYWNlIGZpbGUKLQlmb3IgLS10cmFjZS1maWxlIGluIGFkZGl0aW9uIHRvIGNwdSdzIHZhbHVlcy4KLQkodHJhY2VfdnByaW50Zik6IElmIGNwdSA9PSBOVUxMLCB0cnkgc3RhdGUncyB0cmFjZSBmaWxlLgotCSh0cmFjZV9vcHRpb25zKTogUmVvcmdhbml6ZSB0YWJsZSwgcmV3b3JkIHNvbWUgZGVzY3JpcHRpb25zLgotCi1TdW4gTm92IDIzIDEwOjU3OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWZwdS5jIChzaW1fZnB1X2Ficywgc2ltX2ZwdV9uZWcsIHNpbV9mcHVfaW52KSwgc2ltLWZwdS5oOgotIAlOZXcgZnVuY3Rpb25zLgotCi1TYXQgTm92IDIyIDE5OjE2OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBGb3Igc2ltX3NpZ25hbGxlZCwgcmV0dXJuIHRoZQotIAlzaWduYWwgdW50cmFuc2xhdGVkLCBkb2N1bWVudCBwcm9ibGVtIHdpdGggdGhpcy4KLQotCSogbnJ1bi5jIChtYWluKTogQ2hlY2sgZm9yIGEgcHJvZyBuYW1lIG9mIGAqc3RlcCcuICBJZiBwcmVzZW50LAotIAlzdGVwIHRoZSBzaW11bGF0b3IgaW5zdGVhZCBvZiBhbGxvd2luZyBpdCB0byBydW4gZnJlZS4KLQotCSogc2ltLXNpZ25hbC5jIChTSUdRVUlUKTogRGVmaW5lIG9uIF9NU0NfVkVSIGhvc3RzLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tc2lnbmFsLmguCi0KLUZyaSBOb3YgMjEgMDk6MzI6MzIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tc2lnbmFsLmMgKHNpbV9zaWduYWxfdG9faG9zdCk6IFJldHVybiAwIGZvciBTSU1fU0lHTk9ORS4KLQotVGh1IE5vdiAyMCAyMDozNToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1zaWduYWwuaDogU3RhcnQgc2ltdWxhdG9yIHNpZ25hbHMgYXQgNjQgc28gdGhhdCBob3N0IHNpZ25hbAotIAludW1iZXJzIGNhbiBiZSBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQuCi0KLQkqIHNpbS1zaWduYWwuaCAoU0lNX1NJR0ZQRSksIHNpbS1zaWduYWwuaDogQWRkIHNpZ25hbC4KLQotV2VkIE5vdiAxOSAxMjowMjo0MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYyAoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IEZpeCByZXR1cm4gdmFsdWVzLgotCi0JKiBjZ2VuLXNpbS5oIChlbnVtX3NpZ25hbF90eXBlKTogRGVsZXRlLgotCShlbmdpbmVfc2lnbmFsKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGNnZW4tdXRpbHMuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgotCShzaW1fc2lnbmFsX3RvX2hvc3QpOiBEZWxldGUsIGxpdmVzIGluIHNpbS1zaWduYWwuYyBub3cuCi0JKGVuZ2luZV9zaWduYWwpOiBVcGRhdGUuCi0KLQkqIHNpbS11dGlscy5jIChzaW1fc3RhdGVfYWxsb2MpOiBDYWxsIFNJTV9TVEFURV9BTExPQyBpZiBkZWZpbmVkLgotCShzaW1fc3RhdGVfZnJlZSk6IENhbGwgU0lNX1NUQVRFX0ZSRUUgaWYgZGVmaW5lZC4KLQotCSogc2ltLW1vZHVsZS5jIChzaW1fbW9kdWxlX2luc3RhbGwpOiBEb24ndCBsZWF2ZSBhbnkgbW9kdWxlcwotCWluc3RhbGxlZCBpZiBvbmUgZmFpbHMgdG8gaW5zdGFsbC4KLQotV2VkIE5vdiAxOSAxMzoyNTo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2ltLW9wdGlvbnMuYzogRG9uJ3QgaW5jbHVkZSAuLi9saWJpYmVydHkvYWxsb2NhLWNvbmYuaCBhbnkKLQltb3JlLCBzaW5jZSBhbGxvY2EgaXMgbm90IHVzZWQgaW4gdGhpcyBmaWxlLgotCi0JKiBzaW0tYWx1LmggKEFMVXszMiw2NH1fKik6IFJld3JpdGUgMzIgYW5kIDY0IGJpdCBBTFUgc3VwcG9ydCB0bwotCWNvcnJlY3RseSBzZXQgdGhlIGNhcnJ5IGFuZCBvdmVyZmxvdyBiaXRzIGZvciB0aG9zZSB0eXBlcy4KLQkoQUxVezgsMTYsMzIsNjR9X3tBREQsU1VCfV9DQSk6IFRha2UgVkFMIGFyZ3VtZW50IHRvIGFkZCBhbG9uZwotCXdpdGggY2FycnksIHNvIGNhcnJ5IGlzIGNvcnJlY3QgYWZ0ZXIgZG9pbmcgYm90aCBhZGRzLgotCShBTFUqKTogU3BhY2Ugb3V0ICdcJyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkLgotCi1UdWUgTm92IDE4IDE1OjUzOjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFVzZSBzaW1fc3RvcHBlZCBpbnN0ZWFkIG9mCi0Jc2ltX3NpZ25hbGxlZC4KLQotCSogc2ltLXNpZ25hbC5jLCBzaW0tc2lnbmFsLmg6IE5ldyBmaWxlcy4KLQkqIE1ha2UtY29tbW9uLmluIChzaW0tc2lnbmFsLm8pOiBBZGQgcnVsZSBmb3IuCi0JKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgc2ltLXNpZ25hbC5vLgotCSogc2ltLWFib3J0LmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KLQkqIHNpbS1iYXNpY3MuaDogI2luY2x1ZGUgInNpbS1zaWduYWwuaCIuCi0JKiBzaW0tYnJlYWsuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgotCShzaW1faGFuZGxlX2JyZWFrcG9pbnQpOiBSZXBsYWNlIFNJR1RSQVAgd2l0aCBTSU1fU0lHVFJBUC4KLQkqIHNpbS1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KLQkoU0lHQlVTKTogRGVsZXRlIGRlZmluaXRpb24uCi0JKHNpbV9jb3JlX3NpZ25hbCk6IFJlcGxhY2UgU0lHU0VHVixTSUdCVVMgd2l0aCBTSU1fU0lHU0VHVixTSU1fU0lHQlVTLgotCSogc2ltLWVuZ2luZS5jOiBEb24ndCBpbmNsdWRlIDxzaWduYWwuaD4uCi0JKHNpbV9lbmdpbmVfYWJvcnQpOiBSZXBsYWNlIFNJR0FCUlQgd2l0aCBTSU1fU0lHQUJSVC4KLQkqIHNpbS1yZWFzb24uYyAoc2ltX3N0b3BfcmVhc29uKTogQ2FsbCBzaW1fc2lnbmFsX3RvX2hvc3QuCi0JKiBzaW0tcmVzdW1lLmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KLQkoU0lHVFJBUCk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShoYXNfc3RlcHBlZCk6IFJlcGxhY2UgU0lHVFJBUCB3aXRoIFNJTV9TSUdUUkFQLgotCSogc2ltLXN0b3AuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgotCShjb250cm9sX2Nfc2ltdWxhdGlvbik6IFJlcGxhY2UgU0lHSU5UIHdpdGggU0lNX1NJR0lOVC4KLQkqIHNpbS13YXRjaC5jOiBEb24ndCBpbmNsdWRlIDxzaWduYWwuaD4uCi0JKGhhbmRsZV93YXRjaHBvaW50KTogUmVwbGFjZSBTSUdJTlQgd2l0aCBTSU1fU0lHSU5ULgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX05FV19DT01NT05fT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQotCSogc2ltLWJhc2UuaCAoQ0lBX0FERFIpOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFVzZSBDSUFfQUREUiB0byBmZXRjaCB2YWx1ZS4KLQkqIHNpbS1icmVhay5jIChzaW1faGFuZGxlX2JyZWFrcG9pbnQpOiBMaWtld2lzZS4KLQotTW9uIE5vdiAxNyAxNDoxNTozMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKHNyY2NvbSk6IE5ldyB2YXJpYWJsZS4KLQotCSogTWFrZS1jb21tb24uaW4gKERFUCwgQ09NTU9OX0RFUF9DRkxBR1MpOiBEZWZpbmUuCi0JKExJQl9PQkpTKTogQWRkIHN5c2NhbGwuby4KLQkoZ2VudG1hcCk6IFBhc3MgJChOTF9UQVJHRVQpIHRvICQoQ0MpLgotCShzeXNjYWxsLm8pOiBBZGQgcnVsZSBmb3IuCi0JKHNpbV9tYWluX2hlYWRlcnMpOiBBZGQgJChTSU1fRVhUUkFfREVQUykuCi0JKHNpbS1iaXRzLm8pOiBEZXBlbmQgb24gJChzaW0tbi1iaXRzX2gpLgotCShzaW0tbG9hZC5vKTogRGVwZW5kIG9uIGNhbGxiYWNrLmguCi0KLQkqIE1ha2UtY29tbW9uLmluIChjZ2VuLSoubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMsIG1lbS1vcHMuaCByZW5hbWVkIHRvCi0JY2dlbi1tZW0uaCwgc2VtLW9wcy5oIHJlbmFtZWQgdG8gY2dlbi1vcHMuaC4KLQkqIGNnZW4tbWVtLmgsIGNnZW4tb3BzLmg6IE5ldyBmaWxlcy4KLQotCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLXNjYWNoZSk6IFBhc3MgLURXSVRIX1NDQUNIRT0wIGZvciAiPW5vIi4KLQotCSogTWFrZWZpbGUuaW4gKG5sdHZhbHMuZGVmKTogRGVwZW5kIG9uIGdlbm5sdHZhbHMuc2guCi0JUmV3cml0ZSBidWlsZCBydWxlLgotCSogY2FsbGJhY2suYzogI2luY2x1ZGUgc3RyaW5nLmggb3Igc3RyaW5ncy5oLgotCSNpbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvc3RhdC5oLgotCShjYl9pbml0X3N5c2NhbGxfbWFwLGNiX2luaXRfZXJybm9fbWFwLGNiX2luaXRfb3Blbl9tYXApOiBEZWNsYXJlLgotCShvc19nZXRfZXJybm8sb3Nfb3Blbik6IFVwZGF0ZS4KLQkob3Nfc3RhdCxvc19mc3RhdCk6IE5ldyBmdW5jdGlvbnMuCi0JKG9zX2luaXQpOiBJbml0aWFsaXplIHN5c2NhbGxfbWFwLCBlcnJub19tYXAsIG9wZW5fbWFwLgotCShkZWZhdWx0X2NhbGxiYWNrKTogQWRkIGVudHJpZXMgZm9yIG9zX3N0YXQsIG9zX2ZzdGF0LCBzeXNjYWxsX21hcCwKLQllcnJub19tYXAsIG9wZW5fbWFwLCBzaWduYWxfbWFwLCBzdGF0X21hcC4KLQkoY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzKTogTmV3IGZ1bmN0aW9uLgotCShjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsKTogTmV3IGZ1bmN0aW9uLgotCShjYl9ob3N0X3RvX3RhcmdldF9lcnJubyk6IFJlbmFtZWQgZnJvbSBob3N0X3RvX3RhcmdldF9lcnJuby4KLQkoY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbSB0YXJnZXRfdG9faG9zdF9vcGVuLgotCShzdG9yZSk6IE5ldyBmdW5jdGlvbi4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHN5c2NhbGwuYzogTmV3IGZpbGUuCi0JKiBnZW50bWFwLmMgKHN5c190ZGVmcyk6IE5ldyBnbG9iYWwuCi0JKGdlbl90YXJnX3ZhbHNfaCk6IE91dHB1dCB0YXJnZXQgc3lzY2FsbCBudW1iZXJzLgotCShnZW5fdGFyZ19tYXBfYyk6IFVwZGF0ZS4gIE91dHB1dCB0YXJnZXQgc3lzY2FsbCB0cmFuc2xhdGlvbiBtYXAuCi0JKiBnZW50dmFscy5zaDogTmV3IGZpcnN0IGFyZ3VtZW50IGB0YXJnZXQnLiAgUHJlZmFjZSB0YWJsZSB3aXRoCi0JI2lmZGVmIE5MX1RBUkdFVF8kdGFyZ2V0IGlmIG5vbi1udWxsIHRhcmdldCBwYXNzZWQuCi0JKiBnZW5ubHR2YWxzLnNoOiBOZXcgZmlsZS4KLQkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlZC4KLQotRnJpIE5vdiAxNCAxMTozMzozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IFJldHVybiBzdGF0aWMKLSAJc2ltX2NvcmVfZHVtbXlfTS4KLQkoc2ltX2NvcmVfZHVtbXlfTSk6IERlY2xhcmUuCi0JCi1XZWQgTm92IDEyIDE4OjE2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfc2lnbmFsKTogUHJpbnQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gCWluc3RydWN0aW9uLgotCi1UaHUgTm92IDEzIDExOjQ5OjQxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IE1vdmUgYG1hZ2ljJyB0byBlbmQgb2Ygc3RydWN0LgotCi0JKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IEFkZCBtZW1iZXIgdHJhY2VfZGF0YS4KLQkoU1RBVEVfVFJBQ0VfREFUQSk6IE5ldyBtYWNyby4KLQkqIHNpbS10cmFjZS5oIChUUkFDRV9ERUJVR19JRFgsVFJBQ0VfZGVidWcpOiBOZXcgbWFjcm9zLgotCSh7V0lUSF8sfVRSQUNFX0RFQlVHX1ApOiBOZXcgbWFjcm9zLgotCShTVEFURV9UUkFDRV9GTEFHUyxTVFJBQ0VfUCxTVFJBQ0VfREVCVUdfUCk6IE5ldyBtYWNyb3MuCi0JKF9zaW1fY3B1KTogRGVsZXRlIGZvcndhcmQgcmVmZXJlbmNlLgotCShkZWJ1Z19wcmludGYpOiBVcGRhdGUuCi0JKiBzaW0tdHJhY2UuYyAoT1BUSU9OX1RSQUNFX0RFQlVHKTogRGVmaW5lLgotCSh0cmFjZV9vcHRpb25zKTogQWRkIC0tdHJhY2UtZGVidWcuCi0JKHNldF90cmFjZV9vcHRpb25zKTogSGFuZGxlIGl0LgotCSh0cmFjZV9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgotCSh0cmFjZV9pbnN0YWxsKTogSW5pdCBzdGF0ZSB0cmFjZV9kYXRhIHN0cnVjdC4KLQkodHJhY2VfdW5pbnN0YWxsKTogQ2xvc2Ugc3RhdGUgdHJhY2UgZmlsZS4KLQkqIHNpbS1ldmVudHMuYyAoRVRSQUNFKTogT25seSBwcmludCBzb3VyY2UgZmlsZSBhbmQgbGluZSBudW1iZXIgaWYKLQktLXRyYWNlLWRlYnVnLgotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9NKTogTGlrZXdpc2UuCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IEFkZCBtaXNzaW5nICJcbiIgaW4gbWVzc2FnZS4KLQotMTk5Ny0xMS0xMyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04pOiBpbGxlZ2FsIGVtcHR5Ci0JaW5pdGlhbGl6ZXIuCi0JKiBzaW0tdHlwZXMuaCAodW5zaWduZWQxMjgsc2lnbmVkMTI4KTogZml4IHR5cG8gZm9yIE1TVkMuCi0KLVdlZCBOb3YgMTIgMTI6MTg6MDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoU0lNX0FDX09QVElPTl9TQ0FDSEUpOiBGaXggdHlwby4KLQotCSogTWFrZS1jb21tb24uaW4gKEJVSUxUX1NSQ19GUk9NX0NPTU1PTik6IFJlbW92ZSBmaWxlcyBubyBsb25nZXIKLQlidWlsdCB0aGlzIHdheS4KLQkoc2ltLWNvbmZpZy5vKTogUmVtb3ZlIG5vbi1leGlzdGVudCAkKHNpbS1uY29uZmlnX2gpIGRlcGVuZGVuY3kuCi0JKGNsZWFuKTogRG9uJ3QgZGVsZXRlICQoQlVJTFRfU1JDX0ZST01fQ09NTU9OKSBpZiBidWlsZGluZyBpbgotCXNvdXJjZSB0cmVlLgotCi1UdWUgTm92IDExIDEzOjI4OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBSZS1jb21wdXRlIHRoZSB0aW1lIC0KLSAJdXBkYXRlX3RpbWVfZnJvbV9ldmVudCAtIGFzIGVhY2ggZXZlbnQgaXMgcHJvY2Vzc2VkLiBSZXZlcnNlcwotIAlwcmV2aW91cyBjaGFuZ2UuCi0KLUZyaSBOb3YgIDcgMDA6Mzc6MzYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5jIChvc19wb2xsX3F1aXQpOiBSZXBsYWNlIF9XSU4zMiB3aXRoIF9NU0NfVkVSLgotCi1GcmkgTm92ICA3IDAwOjM3OjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBEZWxldGUgcmVkdW5kYW50IGNhbGwgdG8KLSAJdXBkYXRlX3RpbWVfZnJvbV9ldmVudC4KLQkoc2ltX2V2ZW50c19zbGlwKTogQWx3YXlzIGRlY3JlbWVudCB0aW1lX2Zyb21fZXZlbnQuCi0JKHNpbV9ldmVudHNfdGljaywgc2ltX2V2ZW50c19kZXNjaGVkdWxlLCB1cGRhdGVfdGltZV9mcm9tX2V2ZW50KToKLSAJRGVsZXRlIGFzc2VydGlvbiB0aGF0IHRpbWVfZnJvbV9ldmVudCA+PTAgd2hlbiB3b3JrIGluIHF1ZXVlLCBubwotIAlsb25nZXIgYXBwbGljYWJsZS4KLQotVGh1IE5vdiAgNiAxMjowNjo0NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1vcHRpb25zLmMgKFNUQU5EQVJEX09QVElPTlMpOiBDaGFuZ2UgT1BUSU9OXyogdG8gYW4gZW51bS4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCi0KLQkqIHNpbS1vcHRpb25zLmg6IENsYXJpZnkgZG9jdW1lbnRhdGlvbi4KLSAJKE9QVElPTl9MT05HX09OTFlfUCk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShPUFRJT05fVkFMSURfUCk6IERlZmluZS4KLQkKLQkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogQWxsb3cgc2hvcnQgb25seSBvcHRpb25zLgotCShzaW1fcGFyc2VfYXJncyk6IERpdHRvLgotCShzaW1fYXJnc19jb21tYW5kKTogU2tpcCBzaG9ydCBvbmx5IG9wdGlvbnMuCi0JKHNpbV9wYXJzZV9hcmdzKTogQWxsb2NhdGUgc3BhY2UgZm9yIE5VTV9PUFRTIG5vdCBqdXN0IDI1Ni4gTWFrZQotIAlzZXBhcmF0ZSBlbnRyaWVzIGZvciBzaG9ydCBhbmQgbG9uZyBvcHRpb25zIGluIHRoZSBIQU5ETEVSUyBhbmQKLSAJT1JJR19WQUwgdGFibGVzLgotCShzaW1fcGFyc2VfYXJncyk6IERpc2FibGUgYXJndW1lbnQgcGVybXV0YXRpb24uCi0KLVdlZCBOb3YgIDUgMTM6NDA6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5oIChERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04uIERFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKToKLSAJQWRkIGFyZ3VtZW50IE0sIHNpemUgb2YgZGF0YSB0eXBlLgotCShzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMywgc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF8zKToKLSAJRGVjbGFyZSwgZGl0dG8gZm9yIDUsIDYgJiA3IGJ5dGUgdHJhbnNmZXJzLgotCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMSwgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzEpOiBEZWZpbmUKLSAJYXMgYWxpZ25lZCB2YXJpYW50LgotCQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9NKTogUmVuYW1lIGZyb20KLSAJc2ltX2NvcmVfdHJhY2VfTi4gQWRkIG5yX2J5dGVzIGFyZ3VtZW50LiBSZXBsYWNlIHRyYW5zZmVyIGFyZ3VtZW50Ci0gCXdpdGggdHJhbnNmZXIgdHlwZS4gUHJpbnQgdHJhbnNmZXIgZGlyZWN0aW9uLiAgSGFuZGxlIDEgYW5kIDIgYnl0ZQotIAl0cmFuc2ZlcnMuCi0JKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogVHJhY2UKLSAJdW5hbGlnbmVkIGFjY2Vzc2VzLgotCSh1bnNpZ25lZF9NLCBUMkhfTSwgSDJUX00pOiBSZW5hbWUgZnJvbSB1bnNpZ25lZF9OLCBUMkhfTiwgSDJUX04uCi0gIAlVcGRhdGUgYWxsIGZ1bmN0aW9ucy4KLQotCSogc2ltLWNvcmUuYzogR2VuZXJhdGUgZnVuY3Rpb25zIHN0YXJ0aW5nIHdpdGggMTYgbm90IDEuCi0JKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzMpOiBHZW5lcmF0ZS4gRGl0dG8gZm9yIDMgYnl0ZSB3cml0ZSBhbmQKLSAJYWxsIDUsIDYgJiA3IGJ5dGUgdHJhbnNmZXJzLgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF9OLAotIAlzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkX04pOiBJbXBsZW1lbnQuCi0KLU1vbiBOb3YgIDMgMTU6MDM6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZW5kaWFuLmggKFUxNl84KTogSW1wbGVtZW50Ci0KLQkqIHNpbS1lbmRpYW4uYyAoc2ltX2VuZGlhbl9zcGxpdF8xNiwgc2ltX2VuZGlhbl9qb2luXzE2KTogTmV3IGZ1bmN0aW9ucwotCi0JKiBzaW0tZW5kaWFuLmggKFZMOF8xNiwgVkg4XzE2KTogSW1wbGVtZW50LgotCi0JKiBzaW0tbWVtb3B0LmMgKG1lbW9yeV9vcHRpb25faGFuZGxlcik6IFR5cGVjYXN0IDY0Yml0IHZhbHVlIHRvCi0gCWxvbmcgaW4gcHJpbnRmLgotCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBPbmx5IHphbGxvYyBtb2R1bG8gYnl0ZXMgd2hlbiBub24temVyby4KLQkobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogU2tpcCBjb21tYSBpbiBhbGlhcyBhZGRyZXNzIGxpc3QKLQotRnJpIE9jdCAzMSAxMzowMzozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tZW1vcHQuYyAoZG9fbWVtb3B0X2FkZCwgZG9fbWVtb3B0X2RlbGV0ZSk6IEFkZCBsZXZlbCBhbmQKLSAJc3BhY2UgcGFyYW1zLgotCShwYXJzZV9zaXplLCBwYXJzZV9hZGRyKTogTmV3IGZ1bmN0aW9ucwotCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIsIG1lbW9yeV9vcHRpb25zKTogUGFyc2UgYWRkcmVzcyAmIHNpemUKLSAJdXNpbmcgbmV3IGZ1bmN0aW9ucy4gUGFzcyBsZXZlbCwgc3BhY2UsIG1vZHVsbyB0byBkb19tZW1vcHRfYWRkICYKLSAJZG9fbWVtb3B0X2RlbC4KLQotCSogc2ltLW1lbW9wdC5oIChzdHJ1Y3QgX3NpbV9tZW1vcHQpOiBBZGQgbGV2ZWwgJiBzcGFjZSBmaWVsZHMuCi0KLQkqIHNpbS1jb3JlLmggKHNpbV9jb3JlX2FycmFjaCwgc2ltX2NvcmVfZGV0YWNoKTogUmVwbGFjZQotIAlgYXR0YWNoX3R5cGUgYXR0YWNoJyBhcmd1bWVudCB3aXRoIGB1bnNpZ25lZCBsZXZlbCcgYXJndW1lbnQuCi0gIAlEb2N1bWVudC4KLQotCSogc2ltLWNvcmUuYyAobmV3X3NpbV9jb3JlX21hcHBpbmcsIHNpbV9jb3JlX21hcF9hdHRhY2gsCi0gCXNpbV9jb3JlX2F0dGFjaCk6IFJlcGxhY2UgYXJndW1lbnQgYXR0YWNoIHdpdGggbGV2ZWwuICBVcGRhdGUKLSAJdmVyaWZpY2F0aW9uIG9mIGFyZ3VtZW50cy4KLQkoc2ltX2NvcmVfbWFwX2RldGFjaCwgc2ltX2NvcmVfZGV0YWNoKTogUmVwbGFjZSBhcmd1bWVudCBhdHRhY2gKLSAJd2l0aCBsZXZlbC4KLQotCSogc2ltLWJhc2ljcy5oIChlbnVtIF9hdHRhY2hfdHlwZSk6IERlbGV0ZS4KLQotVGh1IE9jdCAzMCAxMzo0NTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfd3JpdGVfOCk6IERlZmluZS4KLQotVHVlIE9jdCAyOCAxMjoyOToyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iaXRzLmg6IERvY3VtZW50IFJPVG4gbWFjcm8uCi0KLQkqIHNpbS1lbmRpYW4uaCAoSDJUKTogSGFuZGxlIDE2IGJ5dGUgdmFyaWFibGVzLgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04pOiBSZXR1cm4gYSBkdW1teSB3aGVuIGFuCi0gCWVycm9yLgotCi0JKiBzaW0tY29yZS5jOiBEbyBub3QgZ2VuZXJhdGUgc2ltX2NvcmVfKl93b3JkLgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3RyYWNlX04pOiBBZGQgbGluZV9uciBhcmd1bWVudC4KLQkoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OLCBzaW1fY29yZV9yZWFkX2FsaWduZWRfTik6IFVwZGF0ZS4KLQotCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfd29yZCwKLSAJc2ltX2NvcmVfcmVhZF9hbGlnbmVkX3dvcmQsIHNpbV9jb3JlX3JlYWRfd29yZCwKLSAJc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkX3dvcmQsIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfd29yZCwKLSAJc2ltX2NvcmVfd3JpdGVfd29yZCk6IENoYW5nZSB0byBtYWNyb3MgdGhhdCBtYXAgb250byBzaW1fY29yZV8qX04uCi0KLU1vbiBPY3QgMjcgMTE6MjU6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLW4tZW5kaWFuLmg6IEFkZCBUQUdTIGVudHJ5cyBmb3IgMTYgYnl0ZSB2ZXJzaW9ucy4KLQotCSogc2ltLWVuZGlhbi5oOiBEaXNhYmxlIDE2IGJ5dGUgc3VwcG9ydC4KLQotTW9uIE9jdCAyNyAxMjowMDo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1lbmRpYW4uYyAoX1NXQVBfMTYpOiBEZWZpbmUuICBHZW5lcmF0ZSAxMjYgYml0IHN3YXAgY29kZS4KLQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9OKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fY29yZV9yZWFkX2FsaWduZWRfTiwgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKTogVXNlLAotCShzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRG8gbm90IHJldHlybiBib2d1cyB2YWx1ZSB3ZGVuIGVycm9yLgotCi0JKiBzaW0tZW5kaWFuLmg6ICBBZGQgMTI4IGJpdCB2YXJpYW50LgotCi0JKiBzaW0tY29yZS5oLCBzaW0tY29yZS5jOiBBZGQgMTI4IGJpdCB2YXJpYW50LgotCi0JKiBzaW0tdHlwZXMuaDogQWRkIHNpZ25lZDEyOCBhbmQgdW5zaWduZWQxMjggdHlwZXMgdXNpbmcgYSBzdHJ1Y3QuCi0KLUZyaSBPY3QgMjQgMTE6MzM6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfcHJvY2Vzcyk6IENsZWFyIGV2ZW50cy0+d29ya19wZW5kaW5nLgotCShzaW1fZXZlbnRzX3RpY2tuLCBzaW1fZXZlbnRzX3RpY2spOiBBY2N1bXVsYXRlLCBpbnN0ZWFkIG9mCi0gCXNldHRpbmcsIG5yX3RpY2tzX3RvX3Byb2Nlc3MuCi0JKHNpbV9ldmVudHNfcHJlcHJvY2Vzcyk6IEFsbG93IG5yX3RpY2tzX3RvX3Byb2Nlc3MgdG8gYmUgbm9uLXplcm8KLSAJd2hlbiB0aGUgZXZlbnQgcXVldWUgaXNuJ3QgbmV4dC4KLQotCSogc2ltLWV2ZW50cy5oLCBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfc2xpcCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE9jdCAyMiAxNDoxODozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3A9PTAgYW5kIGRvX2xvYWQ9c2ltX2xvYWQuCi0KLQkqIHNpbS11dGlscy5oLCBzaW0tbG9hZC5jIChzaW1fbG9hZF9maWxlKTogQWRkIGxtYV9wIGFuZCBkb19sb2FkCi0gCWFyZ3VtZW50cy4KLQotVHVlIE9jdCAyMSAxODozNzo1NyAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBucnVuLmMgKG1haW4pOiBSZW1vdmUgdXNlbGVzcyB0ZXN0IG9mIG5hbWUgIT0gTlVMTC4KLQlFeGl0IGlmIGJmZF9vcGVuciBmYWlscy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCBhZnRlciBiZmRfb3BlbnIuCi0KLVR1ZSBPY3QgMjEgMTA6NDI6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tZnB1LmMgKEVYUE1BWCk6IFR5cGUgaXMgdW5zaWduZWQuCi0JKE1JTl9JTlQsIE1BWF9JTlQpOiBUeXBlIGlzIHNpZ25lZDY0LgotCShpMmZwdSk6IFR5cGUgb2YgdmFsIGlzIHNpZ25lZDY0LgotCi1UdWUgT2N0IDIxIDEwOjQyOjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9QQ19CVUNLRVRfU0laRSk6IFRyZWF0IGEgc2hpZnQgb2YgemVybyBhcwotIAlhIGJ1Y2tldCBzaXplIG9mIHplcm8uCi0KLQkqIHNpbS1wcm9maWxlLmMgKE9QVElPTl9QUk9GSUxFX1BDX0dSQU5VTEFSSVRZLAotIAlPUFRJT05fUFJPRklMRV9QQyk6IERlZmluZS4KLQkocHJvZmlsZV9vcHRpb25faGFuZGxlcik6IEFkZCBzdXBwb3J0IGZvciAtLXByb2ZpbGUtcGMgYW5kCi0gCS0tcHJvZmlsZS1wYy1ncmFudWxhcml0eSBvcHRpb25zLgotCShwcm9maWxlX3BjX2luaXQpOiBXaGVuIHBvc3NpYmxlLCBjb21wdXRlIG5yIGJ1Y2tldHMgZnJvbSBidWNrZXQKLSAJc2l6ZS4KLQotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wY19pbml0KTogQWxpZ24gdGhlIHByb2ZpbGUtcGMgZW5kCi0gCWFkZHJlc3Mgd2l0aCB0aGUgcHJvZmlsZS1wYyBidWNrZXQgc2l6ZS4KLQotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9QQ19OUl9CVUNLRVRTKTogUmVuYW1lIFBST0ZJTEVfUENfU0laRSB0bwotIAlzb21ldGhpbmcgbGVzcyBhbWJpZ3VvdXMuCi0JKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUpOiBEaXR0byBmb3IgUFJPRklMRV9QQ19TQU1QTEVfU0laRS4KLQotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wY19jbGVhbnVwKTogTmV3IGZ1bmN0aW9uLiBNb3ZlCi0gCXByb2ZpbGVfcGNfdW5pbnN0YWxsIGNvZGUgdG8gaGVyZS4KLQkocHJvZmlsZV9wY191bmluc3RhbGwpOiBDYWxsLgotCShwcm9maWxlX3BjX2luaXQpOiBDYWxsLgotCi1Nb24gT2N0IDIwIDE3OjIzOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9wYyk6IER1bXAgcGMgcHJvZmlsZSB0byBkbW9uLm91dAotIAlmaWxlIHVzaW5nIEJTRCBncHJvZiBmb3JtYXQuCi0KLQkqIHNpbS1iaXRzLmggKExTQklULCBNU0JJVCwgQklUKTogRm9yY2UgcmVzdWx0IHRvIHR5cGUKLSAJdW5zaWduZWRfd29yZC4KLQkoTFNCSVQ4LCBMU0JJVDE2LCBMU0JJVDMyLCBMU0JJVDY0LCBNU0JJVDgsIE1TQklUMTYsIE1TQklUMzIsCi0gCU1TQklUNjQpOiBGb3JjZSByZXN1bHQgdG8gdW5zaWduZWROLgotCi1UaHUgT2N0IDE2IDExOjM4OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWFsdS5oIChBTFUxNl9CRUdJTiwgQUxVMzJfQkVHSU4sIEFMVTY0X0JFR0lOKTogRHJvcCBvcGVuaW5nCi0gCWJyYWNlIGZyb20gbWFjcm8uCi0JKEFMVThfQkVHSU4sIEFMVThfU0VULCBBTFU4X0FERCwgQUxVOF9TVUIsIEFMVThfTkVHQVRFKTogRGVmaW5lLgotCShBTFUxNl9BREQsIEFMVTE2X1NVQiwgQUxVMTZfTkVHQVRFKTogU2ltcGxpZnkgYXJyaXRobWV0aWMuCi0JKEFMVTMyX0FERCwgQUxVMzJfU1VCLCBBTFUzMl9ORUdBVEUpOiBTaW1wbGlmeSBhcnJpdGhtZXRpYy4KLQkoQUxVNjRfQURELCBBTFU2NF9TVUIsIEFMVTY0X05FR0FURSk6IFNpbXBsaWZ5IGFycml0aG1ldGljLgotCi1XZWQgT2N0IDE1IDA5OjI0OjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuaCAoc3RydWN0IF9zaW1fY29yZV9tYXBwaW5nKTogQ2hhbmdlIGZyZWVfYnVmZmVyIHRvCi0gCXR5cGUgdm9pZCouCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3VuaW5zdGFsbCwgbmV3X3NpbV9jb3JlX21hcHBpbmcsCi0gCXNpbV9jb3JlX21hcF9hdHRhY2gsIHNpbV9jb3JlX21hcF9kZXRhY2gpOiBDaGFuZ2UgZnJlZV9idWZmZXIgdG8KLSAJdHlwZSB2b2lkKi4KLQkoc2ltX2NvcmVfYXR0YWNoKTogUmVuYW1lIGJ1ZmZlcl9mcmVlZCB0byBmcmVlX2J1ZmZlciwgdHlwZQotIAl2b2lkKi4gRW5zdXJlIHRoYXQgYWxsb2NhdGVkIGJ1ZmZlciBpcyBhbGxpZ25lZCBhY2NvcmRpbmcgdG8KLSAJcmVnaW9uJ3MgYWRkcmVzcy4KLQotTW9uIE9jdCAxMyAxMTozNDo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1hbHUuaCAoQUxVNjRfSEFEX09WRVJGTE9XKTogRGVmaW5lLgotCShBTFU2NF9TVUIpOiBEZWZpbmUuCi0KLQkqIE1ha2UtY29tbW9uLmluIChhbGwpOiBCdWlsZCBTSU1fRVhUUkFfQUxMIGZpcnN0LgotCSguZ2RiaW5pdCk6IFJlbW92ZSBkZXBlbmRlbmNpZXMsIGdlbmVyYXRlIG9uY2UgcGVyIGJ1aWxkLgotCi1UdWUgT2N0IDE0IDE5OjIwOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX2FsaWduZWRfTiwKLSAJc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKTogTWFrZSB4YWRkciBwYXJhbSB0eXBlIGFkZHJlc3Nfd29yZCBub3QKLSAJdW5zaWduZWRfd29yZC4KLQotRnJpIE9jdCAgMyAwOTo0OToxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuaCwgc2ltLWZwdS5jOiBSZXdyaXRlLiAgQ2hhbmdlIHNpbV9mcHUgb2JqZWN0IHRvIGFuCi0gCXVucGFja2VkIGZsb2F0aW5nIHBvaW50IHN0cnVjdC4gIFBhc3Mgc2ltX2ZwdSBvYmplY3QgYnkgcmVmZXJlbmNlLgotCUFkZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciByb3VuZGluZyBtb2Rlcy4KLQkKLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBPY3QgIDIgMTk6NDM6NTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChzaW0tYml0c2l6ZSk6IEZpeCB0eXBvLCBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgbm90Ci0gCVdJVEhfVEFSR0VUX0JJVFNJWkUuCi0KLVRodSBTZXAgMjUgMjM6MjA6MjAgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUB5aW4uY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfY29yZSk6IGxhYmVsIG5lZWRzIGVtcHR5IHN0YXRlbWVudC4KLQotVGh1IFNlcCAyNSAxMToyMDo0NyAxOTk3ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KLQotCSogc2ltLWJyZWFrLmMgKHNpbV9zZXRfYnJlYWtwb2ludCBzaW1fY2xlYXJfYnJlYWtwb2ludCk6ICBVc2UgWkFMTE9DCi0JYW5kIHpmcmVlIGluc3RlYWQgb2YgeG1hbGxvYyBhbmQgZnJlZS4gIFByZXZlbnRzIHdhcm5pbmdzLgotCi1XZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgU2VwIDI0IDE3OjIzOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZS1jb21tb24uaW4gKFNJTV9CSVRTSVpFKTogQXNzaWduIGZyb20gY29uZmlndXJlZCB2YWx1ZS4KLQkoQ09ORklHX0NGTEFHUyk6IEFkZCBTSU1fQklUU0laRS4KLQotCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLWJpdHNpemUpOiBEZXZlbG9wZXIgb3B0aW9uIGZvcgotIAljb250cm9saW5nIHRoZSBiaXRzaXplL21zYiBvZiB0aGUgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE3OjQxOjQwIDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbjogIE5ldyBmaWxlcyBzaW0tYnJlYWsuYywgc2ltLWJyZWFrLmguCi0JKiBzaW0tYmFzZS5oOiAgQWRkIHBvaW50IHRvIGJyZWFrcG9pbnQgbGlzdCB0byBzaW1fc3RhdGVfYmFzZS4KLQkqIHNpbS1icmVhay5jIHNpbS1icmVhay5oOiAgTmV3IG1vZHVsZXMgdGhhdCBpbXBsZW1lbnQgaW50cmluc2ljCi0JYnJlYWtwb2ludCBzdXBwb3J0LgotCSogc2ltLW1vZHVsZS5jOiAgQWRkIGJyZWFrcG9pbnQgbW9kdWxlLgotCQotVHVlIFNlcCAyMyAwMDoyNjozOSAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgotCi0JKiBzaW0tZXZlbnRzLmMgKFNJTV9FVkVOVFNfUE9MTF9SQVRFKTogcG9sbCBtb3JlIG9mdGVuIHRoYW4gb25jZQotIAlhbiBob3VyLgotCSogc2ltLW4tY29yZS5oIChXSVRIX1hPUl9FTkRJQU4pOiBNU1ZDIGJhcmZzIG9uCi0JaWYgKDApIHsgMSAlIDA7IH0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3hvcl93cml0ZV9idWZmZXIpOiBXSVRIX1hPUl9FTkRJQU4gKyAxLgotCShTSUdCVVMpIGRlZmluZSBmb3IgV2luZG93cy4KLQkqIHNpbS10cmFjZS5jICh0cmFjZV9wcmludGYsZGVidWdfcHJpbnRmKTogYWRkZWQgQUxNT1NUX1NUREMuCi0JKiBzaW0tcmVzdW1lLmM6IGRlZmluZSBTSUdUUkFQIGZvciB3aW5kb3dzLgotCSogc2ltLXhjYXQuaDogdXNlIHRva2VuIHBhc3RpbmcgaWYgQUxNT1NUX1NUREMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX1NDQUNIRSwgU0lNX0RFRkFVTFRfTU9ERUwpOiBBc3NpZ24KLSAJY29uZmlndXJlZCB2YWx1ZXMuCi0gCShDT05GSUdfQ0ZMQUdTKTogQWRkIHNhbWUuCi0JCi1Nb24gU2VwIDIyIDE3OjIwOjI3IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogc2ltLXR5cGVzLmggKFNJR05FRDY0KTogIyNpNjQgd2hlbiBfTVNDX1ZFUiwgbm90IF9XSU4zMi4KLQkoU0lHTkVEMzIpOiB1c2UgIyNpMzIuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTA6MDc6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChzaW0tZW5kaWFuKTogU2ltcGxpZnkgbG9naWMgZGV0ZXJtaW5pbmcgW2RlZmF1bHRdCi0gCWVuZGlhbiBvZiB0YXJnZXQuCi0KLQkqIE1ha2UtY29tbW9uLmluIChTSU1fV0FSTklOR1MsIFNJTV9BTElHTk1FTlQsIFNJTV9FTkRJQU4sCi0gCVNJTV9IT1NURU5ESUFOLCBTSU1fUkVTRVJWRURfQklUUywgU0lNX0FTU0VSVCwgU0lNX0ZMT0FULAotIAlTSU1fSEFSRFdBUkUsIFNJTV9JTkxJTkUsIFNJTV9QQUNLQUdFUywgU0lNX1JFR1BBUk0sIFNJTV9TTVAsCi0gCVNJTV9TVERDQUxMLCBTSU1fWE9SX0VORElBTik6IEFzc2lnbiBjb25maWd1cmVkIHZhbHVlcy4KLQkoQ09ORklHX0NGTEFHUyk6IEFkZCBzYW1lLgotCi0JKiBhY2xvY2FsLm00OiBQZXJmb3JtIEFDX1NVQlNUIG9uIG9wdGlvbmFsIG9wdGlvbnMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY29uZmlnLmggKFdJVEhfREVGQVVMVF9BTElHTk1FTlQpOiBEb24ndCBoYXJkd2lyZSBhbnkgYWxpZ25tZW50LgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IFR5cG8gaW4gd2FybmluZyBtZXNzYWdlLgotCi0JKiBzaW0tYmFzZS5oIChTVEFURV9NT0RFTCk6IE1ha2UgY29uZGl0aW9uYWwgb24gU0lNX0hBVkVfTU9ERUwuCi0KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfaW5zbik6IENoZWNrIDAgLi4gTUFYX0lOU04gZm9yIGFueQotIAlpbnNuIGNvdW50LiAgTWFrZSBjb3VudCBjb25kaXRpb25hbCBvbiB0aGVyZSBiZWluZyBhIHZhbGlkCi0gCUlOU05fTkFNRS4KLQkocHJvZmlsZV9wY19pbml0KTogTWFrZSBkZWZhdWx0IFBDIHByb2ZpbGUgZnJlcXVlbmN5IGFuIGFyYml0cmFyeQotIAkyNTYuCi0KLQkqIHNpbS1iYXNlLmg6IERpdHRvLgotCi0JKiBzaW0tcHJvZmlsZS5oIChXSVRIX1BST0ZJTEVfTU9ERUxfUCk6IE9ubHkgZW5hYmxlIG1vZGVsaW5nIHdoZW4KLSAJU0lNX0hBVkVfTU9ERUwuCi0KLQkqIHNpbS1tb2RlbC5oIChzdHJ1Y3QgTUFDSCk6IERlcHJlY2lhdGUsIHRvIGJlIHJlcGxhY2VkIGJ5IGJmZAotCWFyY2h1cmUgc3RydWN0LgotCi1Nb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gU2VwIDIyIDExOjQ1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoc2ltX2FsaWdubWVudCk6IFNpbXBsaWZ5IGxvZ2ljIGZvciBzZWxlY3RpbmcgdGhlCi0gCWNvbmZpZ3VyZWQgYWxpZ25tZW50LgotCi1GcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgU2VwIDE5IDE3OjI2OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5jIChzaW1fY29uZmlnKTogQ2hlY2sgZm9yIGRlZmF1bHQgYWxpZ25tZW50LgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IEFkZCBhbGlnbm1lbnQgb3B0aW9uLgotCi0JKiBhY2xvY2FsLm00IChzaW1fYWxpZ25tZW50KTogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBoYXJkd2lyZWQgYW5kCi0gCWRlZmF1bHQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvbiBtZW1vcnkgYWNjZXNzZXMuCi0JCi1GcmkgU2VwIDE5IDExOjUxOjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltLWxvYWQuYyAoc2ltX2xvYWRfZmlsZSk6IFJldHVybiBmYWlsdXJlIGlmIHRoZSBleGVjdXRhYmxlCi0JaGFkIG5vIGxvYWRhYmxlIHNlY3Rpb25zLgotCi1XZWQgU2VwIDE3IDEzOjMzOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChFVFJBQ0UpOiBVc2UgdHJhY2VfcHJpbnRmIG5vdCBzaW1faW9fcHJpbnRmIGZvcgotIAl0cmFjZSBvdXRwdXQuCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFdoZW4gYmFkIGFjY2VzcyBoYWx0IHNpbXVsYXRvcgotIAlTSUdTRUdWIC8gU0lHQlVTIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0JKHNpZ25hbC5oKTogSW5jbHVkZS4KLQkKLQkqIHNpbS13YXRjaC5jIChzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogSGFuZGxlciBmb3Igd2F0Y2hwb2ludAotIAlvcHRpb25zIHdhcyBtaXNzaW5nLgotCi0JKiBzaW0tYml0cy5oIChNT1ZFRCk6IERlZmluZQotCi1XZWQgU2VwIDE3IDEwOjMzOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWFsdS5oIChBTFUzMl9IQURfT1ZFUkZMT1cpOiBQYWNpZnkgR0NDLCBVc2UgTVNCSVQgaW5zdGVhZCBvZgotIAlCSVQuCi0KLQkqIHNpbS1iaXRzLmggKExTQklULCBNU0JJVCk6IENoZWNrIGZvciBvdmVyZmxvdyBvZiBzaGlmdCB2YWx1ZS4KLQotCSogc2ltLWJpdHMuYzogQWRkIDggYml0IHZlcnNpb25zIG9mIGJpdCBtYWNyb3MuCi0KLQkqIHNpbS1iaXRzLmg6IERpdHRvLgotCi1UdWUgU2VwIDE2IDE2OjE1OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWJpdHMuYyAoTFNTRVhULCBNU1NFWFQpOiBSZXBsYWNlIFNFWFQuCi0JKExTSU5TRVJURUQsIE1TSU5TRVJURUQpOiBEaXR0byBmb3IgSU5TRVJURUQuCi0JCi0JKiBzaW0tbi1iaXRzLmggKE1TU0VYVG4sIExTU0VYVG4pOiBSZXBsYWNlIFNFWFRuLgotCShMU0lOU0VSVERuLCBNU0lOU0VSVEVETik6IERpdHRvIGZvciBJTlNFUlRFRG4uCi0JCi0JKiBzaW0tYml0cy5oIChTRVhUKik6IERlZmluZSBhcyBNU0VYVC9MU0VYVC4KLQkoSU5TRVJURUQqKTogRGl0dG8gZm9yIExTSU5TRVJURUQvTVNJTlNFUlRFRC4KLQkKLU1vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogQWRkIG9wdGlvbmFsIGNvbmZpZy5oIGZpbGUgYXJndW1lbnQuCi0JY29uZmlndXJlLmluOiBPdXRwdXQgdG8gY2NvbmZpZy5oIGluc3RlYWQgb2YgY29uZmlnLmguCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAxNSAxNTozOToyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS11dGlscy5jIChzaW1fYW5hbHl6ZV9wcm9ncmFtKTogU2V0IFNUQVRFX0FSQ0hJVEVDVFVSRSBmcm9tCi0gCUJGRCBpZiBrbm93bi4KLQotVHVlIFNlcCAgOSAyMTo0Njo0NiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmMgKG9zX3dyaXRlKTogZGl2ZXJ0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZWlyCi0gCXJlc3BlY3RpdmUgaG9va3MuCi0KLVRodSBTZXAgMTEgMTA6MDg6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X3NwZWVkKTogQ2FsbAotIAlzaW1fZXZlbnRzX2VsYXBzZWRfdGltZSBpbnN0ZWFkIG9mIFBST0ZJTEVfRVhFQ19USU1FIGZvciBtb21lbnQuCi0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19lbGFwc2VkX3RpbWUpOiBOZXcgZnVuY3Rpb24gcmV0dXJuIG5yCi0gCWhvc3QgTVMgY29uc3VtZWQgYnkgdGhlIHNpbXVsYXRvci4KLQkoc2ltX3dhdGNoX3ZhbGlkKTogVXNlLgotCi0JKiBzaW0tbW9kdWxlLmMgKG1vZHVsZXMpOiBJbnN0YWxsIHNpbV9ldmVudHMgdmVyeSB2ZXJ5IGVhcmx5LgotCi0JKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50KTogQ2FsbCBwcm9maWxlX3ByaW50X3BjLgotCShwcmludF9iYXIpOgotCShwcm9maWxlX3BjX2luaXQpOiBOZXcgZnVuY3Rpb24sIHNldCB1cCBwcm9jZXNzb3IgZm9yIFBDCi0gCXByb2ZpbGluZy4KLQkocHJvZmlsZV9wcmludF9wYyk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgYSBQQyBwcm9maWxlLgotCShwcm9maWxlX3BjX2V2ZW50KTogTmV3IGZ1bmN0aW9uLCBzYW1wbGUgUEMuCi0KLQkqIHNpbS1wcm9maWxlLmggKFBST0ZJTEVfUENfQ09VTlQsIFBST0ZJTEVfUENfU1RBUlQsCi0gCVBST0ZJTEVfUENfRU5ELCBQUk9GSUxFX1BDX1NISUZULCBQUk9GSUxFX1BDX1NBTVBMRV9TSVpFKTogQWRkIHRvCi0gCXByb2ZpbGUgc3RydWN0LgotCi0JKiBzaW0tb3B0aW9ucy5jIChzaW1fcHJpbnRfaGVscCk6IFBhY2lmeSBHQ0MuCi0KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sCi0gCXNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IEFkZCB1bi1jb25kaXRpb25hbCBwcm9maWxlIGNhbGwuCi0JKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogQWRkCi0gCXByb2ZpbGUgY2FsbCB3aGVuIGFsaWduZWQgcmVhZC93cml0ZSBpc24ndCB1c2VkLgotCi0JKiBzaW0tYmFzZS5oOiBJbmNsdWRlIHNpbS1wcm9maWxlLCBzaW0tbW9kZWwgYWZ0ZXIgc2ltLWNvcmUgJgotIAlzaW0tZXZlbnRzIGFsbG93IHNpbS1jb3JlIHRvIGRlZmluZSB1c2VmdWwgdmFsdWVzLgotCi0JKiBzaW0tcHJvZmlsZS5jIChPUFRJT05fUFJPRklMRV9DT1JFKTogRGVmaW5lLgotCShwcm9maWxlX29wdGlvbl9oYW5kbGVyLCBwcm9maWxlX29wdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IKLSAJLS1wcm9maWxlLWNvcmUgb3B0aW9uLgotCShwcmludF9iYXIpOiBJbmNsdWRlIHdoZW4gY29yZSBwcm9maWxpbmcuCi0JKHByb2ZpbGVfcHJpbnRfY29yZSk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgY29yZSBwcm9maWxlLgotCi0JKiBzaW0tY29uZmlnLmMgKHByaW50X3NpbV9jb25maWcpOiBQcmludCBwcm9maWxlIHN0YXR1cy4KLQotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9ORVhUX0lEWCwgUFJPRklMRV9jb3JlLAotIAlXSVRIX1BST0ZJTEVfUENfUCk6IERlZmluZS4KLQkoUFJPRklMRV9DT1JFX0NPVU5UKTogQ291bnQgZWFjaCBjb3JlLW1hcC9zaXplIHNlcGFyYXRseS4KLQkoUFJPRklMRV9DT1VOVF9DT1JFKTogRGVmaW5lLgotCi1UaHUgU2VwIDExIDA4OjQ0OjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXdhdGNoLmMgKGhhbmRsZV93YXRjaHBvaW50KTogUGFzcyBhIGNoYXIqKiBpbmRleCBpbnRvIHRoZQotIAlpbnRlcnJ1cHRfbmFtZXMgYXJyYXkgYXMgdGhlIGRhdGEuCi0JKHNpbS13YXRjaC5oKTogRG9jdW1lbnQuCi0KLVdlZCBTZXAgMTAgMTY6MTU6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5jIChzaW1fcHJpbnRfaGVscCk6IFdoZW4gdGhlIGRvYyBzdHJpbmcgaXMgdG8gbG9uZwotIAl3b3JkIHdyYXAgaXQuCi0KLQkqIHNpbS13YXRjaC5jIChzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogVXNlIG9wdGlvbi5kb2NfbmFtZSBzbwotIAl0aGF0IG9ubHkgdGhlIGZpcnN0IGZldyB0aGUgd2F0Y2ggb3B0aW9ucyBhcmUgbGlzdGVkLiAgR2VuZXJhdGUKLSAJbWVhbmdpbmZ1bCB1c2FnZSBtZXNzYWdlcy4KLQotCSogc2ltLW9wdGlvbnMuaCAoc3RydWN0IE9QVElPTik6IENsYXJpZnkgdXNlIG9mIGRvY19uYW1lIGZpZWxkCi0JCi1XZWQgU2VwIDEwIDEzOjIzOjI0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW9wdGlvbnMuYyAoT1BUSU9OX0FSQ0hJVEVDVFVSRV9JTkZPKTogTmV3IG9wdGlvbi4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgLS1hcmNoaXRlY3R1cmUtaW5mby4KLQotVHVlIFNlcCAgOSAyMTo0Njo0NiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmggKHNpbV9jcHVfY29yZSk6IFtXSVRIX1hPUl9FTkRJQU4gKyAxXSwgdG8gYXZvaWQKLQlpbGxlZ2FsIHplcm8tc2l6ZWQgYXJyYXkuCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV94b3JfcmVhZF9idWZmZXIpOiBzYW1lLgotCi1UdWUgU2VwICA5IDExOjIwOjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlLgotCi1UdWUgU2VwICA5IDAyOjEwOjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWZwdS5jIChEUF9GUkFDSElHSDIpOiBEZWZpbmUgTEwgdXNpbmcgU0lHTkVENjQuCi0KLU1vbiBTZXAgIDggMTI6MjI6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tYml0cy5jIChNQVNLRUQpOiBEZWxldGUuCi0JKEVYVFJBQ1RFRCk6IERlbGV0ZS4KLQkoTFNFWFRSQUNURUQsIE1TRVhUUkFDVEVEKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogc2ltLW4tYml0cy5oIChNQVNLRURuKTogRGVsZXRlLCBkZWZpbmUgYXMgTVNNQVNLRUQgb3IgTFNNQVNLRUQuCi0JKE1TTUFTS0VEbiwgTFNNQVNLRURuKTogQWRkIGxhc3QgYXJndW1lbnQuCi0JKE1TTUFTSyopOiBEaXR0by4KLQkKLQkqIHNpbS1iaXRzLmggKEVYVEVORDgsIEVYVEVORDE2KTogRGVmaW5lLgotCShFWFRSQUNURUQ2NCk6IERlZmluZSBhcyA2NCBiaXQgZXh0cmFjdCwgbm90IDMyIGJpdC4KLQotCSogc2ltLXJ1bi5jIChzaW1fZW5naW5lX3J1bik6IFVzZSBDUFVfQ0lBIG1hY3JvLgotCi0JKiBzaW0tZW5naW5lLmggKFNJTV9FTkdJTkVfSEFMVF9IT09LKTogVXNlIENQVV9DSUEgdG8gZ2V0IGF0Ci0gCWN1cnJlbnQgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KLQotCSogc2ltLWlubGluZS5oICgqX0VOR0lORSk6IERlZmluZS4KLQotRnJpIFNlcCAgNSAwODozOTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2F0dGFjaCk6IEZpeCBjaGVja3Mgb2YgbW9kdWxvL21hc2suCi0KLQkqIHNpbS13YXRjaC5jIChkZWxldGVfd2F0Y2hwb2ludCk6IERlbGV0ZSBieSBpZGVudCBhbmQgdHlwZS4KLQkod2F0Y2hfb3B0aW9uX2hhbmRsZXIpOiBDYWxsIGRlbGV0ZV93YXRjaHBvaW50IHdpdGggaWRlbnQgb3IgdHlwZS4KLQkoc2ltX3dhdGNocG9pbnRfaW5zdGFsbCk6IENyZWF0ZSBpbnRlcnJ1cHQgc3BlY2lmaWMgd2F0Y2hwb2ludAotIAljb21tYW5kcyBvbiB0aGUgZmx5LgotCShkb193YXRjaHBvaW50X2NyZWF0ZSk6IE5ldyBmdW5jdGlvbiwgY3JlYXRlIGEgd2F0Y2ggcG9pbnQgdXNpbmcKLSAJdHlwZS9pbnQtbnIgaW5mbyBlbmNvZGVkIGluIHRoZSBvcHRpb24gbnIuCi0JKGRvX3dhdGNocG9pbnRfaW5mbyk6IE5ldyBmdW5jdGlvbi4gIExpc3QgYWN0aXZlIHdhdGNocG9pbnRzLgotCi0JKiBzaW0td2F0Y2guaDogQ2hhbmdlIGRhdGEgc3RydWN0dXJlIHRvIGEgbGlzdC4KLQotCSogc2ltLW1lbW9wdC5jIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBSZXF1aXJlIGV4cGxpY2l0ICJhbGwiCi0gCWJlZm9yZSBkZWxldGluZyBhbGwgbWVtb3J5IHJlZ2lvbnMuCi0KLQkqIHNpbS11dGlscy5jIChzaW1fZG9fY29tbWFuZGYpOiBOZXcgZnVuY3Rpb24sIHByaW50ZiB2ZXJzaW9uIG9mCi0gCXNpbV9kb19jb21tYW5kLgotCi0JKiBzaW0tYmFzaWNzLmggKGFzcHJpbnRmLCB2YXNwcmludGYpOiBIYWNrLCBkZWZpbmUgZm9yIENZR1dJTjMyLiAKLQkKLQkqIHNpbS1hbHUuaCAoQUxVNjRfQUREKTogVXNlIGV4cGxpY2l0IE1TRVhUUkFDVEVENjQsIGRvIG5vdCBhc3N1bWUKLSAJYml0IGVuZGlhbm5lc3MuCi0JKFNJR05FRDY0LCBVTlNJR05FRDY0KTogRGVsZXRlLgotCShBTFU2NF9BREQpOiBEb24ndCByZWx5IG9uIGJpdCBlbmRpYW5uZXNzLgotCShBTFU2NF9CRUdJTik6IERlZmluZS4KLQotCSogc2ltLW4tYml0cy5oIChNU0VYVFJBQ1RFRG4sIExTRVhUUkFDVEVEKTogTmV3IGZ1bmN0aW9ucy4KLQkoRVhUUkFDVEVEbik6IERlbGV0ZSwgZGVmaW5lIGFzIGVpdGhlciBMU0VYVFJBQ1RFRCBvciBNU0VYVFJBQ1RFRC4KLQotCSogc2ltLXR5cGVzLmggKFNJR05FRDY0LCBVTlNJR05FRDY0KTogTmV3IG1hY3JvcywgYXR0YWNoIHJlbGV2YW50Ci0gCXN1ZmZpeCAtIHU2NCwgTEwgLSB0byA2NCBiaXQgY29uc3RhbnRzLgotCi1UaHUgU2VwICA0IDA5OjI3OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5jIChzaW1fY29uZmlnKTogQWRkIGFzc2VydCBmb3IgU0lNX01BR0lDX05VTUJFUi4KLQotCSogc2ltLXV0aWxzLmggKE5aQUxMT0MpOiBEZWZpbmUgLSB6YWxsb2MgKiBOLgotCi0JKiBzaW0taHJ3LmMgKHNpbV9yZWFkLCBzaW1fd3JpdGUpOiBOZXcgZmlsZS4gIFByb3ZpZGUgZ2VuZXJpYwotIAlpbXBsZW1lbnRhdGlvbiBvZiByZWFkL3dyaXRlIGZ1bmN0aW9ucy4KLQotCSogTWFrZS1jb21tb24uaW4gKHNpbS1ocncubyk6IE5ldyB0YXJnZXQuCi0KLQkqIHNpbS1iYXNlLmggKFNUQVRFX01FTU9QVF9QKTogRGVsZXRlLCBzaW11bGF0b3JzIF9hbHdheXNfIGFkZAotIAltZW1vcnkuCi0KLQkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogSW1wbGVtZW50IG1lbW9yeS1zaXplCi0gCWNvbW1hbmQuIEltcGxlbWVudCBtZW1vcnktYWxpYXMgY29tbWFuZC4gIExldCBtZW1vcnktZGVsZXRlIGRlbGV0ZQotIAlhbGwgbWVtb3J5IHJlZ2lvbnMuCi0JKGFkZF9tZW1vcHQpOiBOZXcgZnVuY3Rpb24uICBBZGQgYSBtZW1vcnkgcmVnaW9uLgotCShkb19tZW1vcHRfZGVsZXRlKTogTmV3IGZ1bmN0aW9uLiBEZWxldGUgYSBtZW1vcnkgcmVnaW9uLgotCi0JKiBzaW0tdXRpbHMuYyAoc2ltX2VsYXBzZWRfdGltZV9nZXQpOiBOZXZlciByZXR1cm4gemVyby4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZGV0YWNoKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fY29yZV9tYXBfZGV0YWNoKTogTmV3IGZ1bmN0aW9uLiBQZXJmb3JtIHRoZSBhY3R1YWwgZGV0YWNoLgotCShzaW1fY29yZV9pbml0KTogTW92ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZyb20gaGVyZS4KLQkoc2ltX2NvcmVfaW5zdGFsbCk6IFRvIGhlcmUuCi0JKHNpbV9jb3JlX3VuaW5zdGFsbCk6IEFuZCBoZXJlLgotCi0JKiBzaW0tbW9kdWxlLmM6IEFkZCBtZW1vcHQgbW9kdWxlLgotCi0JKiBzaW0tYmFzZS5oIChTVEFURV9NRU1PUFQsIFNUQVRFX01FTU9QVF9QKTogQWRkIG1lbW9wdCB0bwotIAlzaW11bGF0b3IgYmFzZSB0eXBlLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tbWVtb3B0LmgKLQkoc2ltLW1lbW9wdC5vKTogTmV3IHRhcmdldC4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfaW5zdGFsbCk6IEFkZCBjb3JlX29wdGlvbnMgdG8gdGhlIG9wdGlvbgotIAl0YWJsZS4KLQotCSogc2ltLXdhdGNoLmMgKHdhdGNoX29wdGlvbnMpOiBNYWtlIC0tZGVsZXRlLXdhdGNoIGEgc3lub255bSBmb3IKLSAJLS13YXRjaC1kZWxldGUuCi0KLQkqIHNpbS1jb25maWcuaCAoV0lUSF9NT0RVTE9fTUVNT1JZKTogRGVmaW5lIGFzIDAuICBVcGRhdGUKLSAJY29tbWVudHMuCi0KLQkqIHNpbS1jb3JlLmggKHN0cnVjdCBfc2ltX2NvcmVfbWFwcGluZyk6IENoYW5nZSBucl9ieXRlcyB0byB0eXBlCi0gCWFkZHJlc3Nfd29yZCwgYWRkIG1hc2sgbWVtYmVyLgotCQotCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYyAoc2ltX2NvcmVfYXR0YWNoKTogTWFrZSBucl9ieXRlcyBvZiB0eXBlCi0gCWFkZHJlc3Nfd29yZCwgYWxsb3cgZm9yIDY0Yml0IHRhcmdldHMgaW4gMzJiaXQgaG9zdC4gQWRkIG1vZHVsbwotIAlhcmd1bWVudC4KLQkoc2ltX2NvcmVfbWFwX2F0dGFjaCk6IERpdHRvLgotCShuZXdfc2ltX2NvcmVfbWFwcGluZyk6IERpdHRvLgotCShzaW1fY29yZV90cmFuc2xhdGUpOiBNYXNrIGFkZHJlc3Mgd2hlbiBtb2R1bG8gbWVtb3J5LgotCi1XZWQgU2VwICAzIDE3OjMyOjU0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0taGxvYWQuYyAoc2ltX2xvYWQpOiBBZGQgYXNzZXJ0IGZvciBTSU1fTUFHSUNfTlVNQkVSLgotCi0JKiBnZGJpbml0LmluOiBOZXcgZmlsZS4KLQkqIGFjbG9jYWwubTQgKFNJTV9BQ19PVVRQVVQpOiBCdWlsZCAuZ2RiaW5pdC4KLQkqIE1ha2UtY29tbW9uLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgLmdkYmluaXQuCi0JKC5nZGJpbml0KTogQWRkIHJ1bGUgZm9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoY2dlbi1ydW4ubyk6IEFkZCBydWxlIGZvci4KLQotV2VkIFNlcCAgMyAxMDowODoyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IFN1c3BlbmQvcmVzdW1lIHRoZSBzaW11bGF0b3IuCi0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX3dhdGNoX3ZhbGlkKTogQ29tcHV0ZSB0b3RhbCBlbGFwc2VkIHRpbWUgZnJvbQotIAlib3RoIHJlc3VtZWQgYW5kIHByZXZpb3VzIGVsYXBzZWQgdGltZS4KLQkoc2ltX2V2ZW50c19pbml0KTogU2V0IGluaXRpYWxfd2FsbGNsb2NrIGFuZCBjdXJyZW50X3dhbGxjbG9jayB0bwotIAl6ZXJvLgotCShzaW1fZXZlbnRzX2luc3RhbGwpOiBJbnN0YWxsIHNpbV9ldmVudHNfc3VzcGVuZCBhbmQKLSAJc2ltX2V2ZW50c19yZXN1bWUuCi0JKHNpbV9ldmVudHNfd2F0Y2hfY2xvY2spOiBBbGxvdyBmb3Igc3VzcGVuZGVkIHNpbXVsYXRvciB3aGVuCi0gCWNvbXB1dGluZyB0aGUgdGltZSBvZiB0aGUgY2xvY2sgZXZlbnQuCi0KLQkqIHNpbS1ldmVudHMuaCAoc3RydWN0IF9zaW1fZXZlbnQpOiBBZGQgcmVzdW1lX3dhbGxjbG9jaywgcmVuYW1lCi0gCWluaXRpYWxfd2FsbGNsb2NrIHRvIGVsYXBzZWRfd2FsbGNsb2NrLCBzZXQgYm90aCB0byB6ZXJvLgotCShzaW1fZXZlbnRzX2luaXQsIHNpbV9ldmVudHNfdW5pbnN0YWxsKTogRGVsZXRlIHByb3RvdHlwZXMuCi0KLQkqIHNpbS1tb2R1bGUuaCAoTU9EVUxFX1NVU1BFTkRfRk4sIE1PRFVMRV9SRVNVTUVfRk4pOiBEZWZpbmUgdHlwZXMuCi0JCi0JKiBzaW0tbW9kdWxlLmMoc2ltX21vZHVsZV9yZXN1bWUsIHNpbV9tb2R1bGVfc3VzcGVuZCk6IE5ldwotIAlmdW5jdGlvbnMuCi0KLVdlZCBTZXAgIDMgMTA6MDg6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfYXR0YWNoKTogQ2xhcmlmeSBtZW1vcnkgb3ZlcmxhcCBlcnJvcgotIAltZXNzYWdlLgotCi1UdWUgU2VwICAyIDE0OjU3OjA2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogQWRkIHN1cHBvcnQgZm9yICIvKiBUQUdTOiBmb28gKi8iIG1hcmtlci4KLQkqIE1ha2UtY29tbW9uLmluIChUQUdTKTogTGlrZXdpc2UuCi0JKiBzaW0tbi1iaXRzLmg6IEFkZCBUQUdTIGNvbW1lbnRzIGZvciBhbGwgZnVuY3Rpb25zLgotCSogc2ltLW4tY29yZS5oOiBMaWtld2lzZS4KLQkqIHNpbS1uLWVuZGlhbi5oOiBMaWtld2lzZS4KLQotTW9uIFNlcCAgMSAxMDo1MDoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS11dGlscy5jIChzaW1fc3RhdGVfYWxsb2MpOiBTZXQgQ1BVIGJhY2tsaW5rcywgY2FsbGJhY2sgYW5kCi0gCWtpbmQuCi0gIAkKLQkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9hbGxvYyk6IEFkZCBjYWxsYmFjayBhbmQga2luZCBhcmd1bWVudHMuCi0JCi0JKiBzaW0tYmFzZS5oIChJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpOiBBZGQgZGVmYXVsdAotIAlkZWZpbml0aW9uLgotCi1TYXQgQXVnIDMwIDA5OjQ3OjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWZwdS5jIChEUF9HQVJETVNCLCAuLi4pOiBNYWtlIHVuc2lnbmVkLgotCShEUF9GUkFDSElHSCwgRFBfRlJBQ0hJR0gyLCAuLik6IFVzZSBNU01BU0sgdG8gYXZvaWQgTEwuCi0KLUZyaSBBdWcgMjkgMTM6Mzc6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfYXR0YWNoKTogQ2FzdCBhdHRhY2ggZW51bSB0byBpbnQuCi0JKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlciwgc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlcik6IE1ha2UKLSAJbnJfdHJhbnNmZXJlZCBhbmQgbnJfdGhpc190cmFuc2ZlciB1bnNpZ25lZC4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3RpY2tuKTogTiBpcyBzaWduZWQsIGFzIGxpbWl0ZWQgdG8KLSAJTUFYSU5ULgotCi0JKiBzaW0tbi1lbmRpYW4uaCAob2Zmc2V0X04pOiBDaGFuZ2Ugc2l6ZSB0byB1bnNpZ25lZC4KLQotCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogQWRkIHByb3RvdHlwZXMgZm9yIGtiaGl0IGFuZCBnZXRrZXkuCi0KLUZyaSBBdWcgMjkgMTA6MTA6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdXRpbHMuYyAoc2ltX2NvcHlfYXJndik6IERlbGV0ZSwgcmVwbGFjZWQgYnkgZHVwYXJndi4KLQotCSogc2ltLW9wdGlvbnMuYyAoc2ltX3BhcnNlX2FyZ3MpOiBVc2UgZHVwYXJndi4KLQotVGh1IEF1ZyAyOCAxMDozNjozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IFVzZSB4c3RyZHVwLCBub3Qgc3RyZHVwLgotCi1UaHUgQXVnIDI4IDEyOjA5OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWJhc2UuaCAoU1RBVEVfQVJDSElURUNUVVJFLCBTVEFURV9UQVJHRVQpOiBBZGQgdG8gc2ltdWxhdG9yCi0gCWJhc2UgdHlwZS4KLQotCSogc2ltLW9wdGlvbnMuYyAoc3RhbmRhcmRfb3B0aW9ucyk6IEFkZCAtLWFyY2hpdGVjdHVyZT1NQUNISU5FIGFuZAotIAktLXRhcmdldD1UQVJHRVQgb3B0aW9ucy4KLQkoT1BUSU9OX0FSQ0hJVEVDVFVSRSwgT1BUSU9OX1RBUkdFVCk6IERlZmluZS4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgYXJjaGl0ZWN0dXJlIGFuZCB0YXJnZXQgb3B0aW9ucy4KLQkoYmZkLmgpOiBJbmNsdWRlLgotCQotCSogc2ltLXV0aWxzLmMgKHNpbV9hbmFseXplX3Byb2dyYW0pOiBQYXNzIFNUQVRFX1RBUkdFVCB0bwotIAliZmRfb3BlbnIuCi0JKHNpbV9hbmFseXplX3Byb2dyYW0pOiBTZXQgcHJvZ19iZmQgYXJjaGl0ZWN0dXJlIGZyb20KLSAJU1RBVEVfQVJDSElURUNUVVJFIGlmIGtub3duLgotCi1XZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEF1ZyAyNyAxODoxMTozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKGVuYWJsZS1zaW0td2FybmluZ3MpOiBSZW1vdmUgY29tbWVudCBzdGF0aW5nCi0gCXRoYXQgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGNlcnRhaW4gZmlsZXMuCi0KLVdlZCBBdWcgMjcgMTU6MTM6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tYml0cy5oIChMU0JJVDgsIExTQklUMTYsIExTQklUMzIsIExTQklUNjQsIExTQklULCBNU0JJVDgsCi0gCU1TQklUMTYsIE1TQklUMzIsIE1TQklUNjQsIE1TQklUKTogTmV3IG1hY3JvcyAtIHNpbmdsZSBiaXQgYXMKLSAJb2Zmc2V0IGZyb20gTVNCL0xTQi4KLQotCSogc2ltLWVuZGlhbi5oIChBMV84LCBBMl84LCBBNF84LCBBMV80LCBBMl80LCBBMV8yKTogTmV3IG1hY3JvLAotIAlhY2Nlc3MgYWRkcmVzcyBvZiBzdWIgd29yZCBxdWFudGl0eSBvZiBhIGhvc3RzIDE2LCAzMiwgNjQgYml0IHdvcmQKLSAJdHlwZS4KLQkoVjFfMiwgVjFfNCwgVjJfNCwgVjFfOCwgVjJfOCwgVjRfOCk6IERpdHRvIGZvciB2YWx1ZXMuCi0JKFU4XzEsIFU4XzIsIFU4XzQsIFU0XzEsIFU0XzIsIFUyXzEpOiBEaXR0byBmb3Igc2V0IG9mIHZhbHVlcy4KLQkoVjJfSDEsIFYyX0wxLCBWNF9IMiwgVjRfTDIsIFY4X0w0LCBWOF9INCk6IEdpdmVuIE4gYnl0ZSBhcmd1bWVudCwKLSAJcmV0dXJuIE4qMiBieXRlIHZhbHVlIHdpdGggYXJndW1lbnQgaW4gSGkvTG8gd29yZC4gIFJlbmFtZWQgZnJvbQotIAlWMV9IMiwgVjFfTDIsIFYyX0g0LCBWMl9MNCwgVjRfSDgsIFY0X0w4LgotIAkKLQkqIHNpbS1hbHUuaCAoQUxVMzJfSEFEX09WRVJGTE9XKTogVXNlIDY0IGJpdCBtYXNrIG5vdCAzMmJpdC4KLQkoQUxVMTZfSEFEX0NBUlJZLCBBTFUzMl9IQURfQ0FSUlksIEFMVTE2X0hBRF9PVkVSRkxPVyk6IFVzZSBNU0JJVAotIAlzbyB0aGF0IGJpdCBvZmZzZXQgaXMgZXhwbGljaXQuCi0KLVdlZCBBdWcgMjcgMTE6NTU6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tdXRpbHMuYyAoc2ltX2FuYWx5emVfcHJvZ3JhbSk6IEFkZCBwcm9nX25hbWUgYXJndW1lbnQuCi0gIAlVcGRhdGUgU1RBVEVfUFJPR19CRkQgd2hlbiBuZWVkZWQgd2l0aCBhIGR1cCdkIGNvcHkgb2YgdGhlCi0gCXByb2dyYW0uCi0KLQkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IERlbGV0ZSBBQkZEIGFyZ3VtZW50LCB1c2UKLSAJU1RBVEVfUFJPR19CRkQgZGlyZWN0bHkuCi0KLVR1ZSBBdWcgMjYgMTI6NTU6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBydW4uYyAobWFpbik6IFBhc3MgdGhlIG9wZW4gQUJGRCB0byBzaW1fY3JlYXRlX2luZmVyaW9yLgotCQotCSogbnJ1bi5jIChtYWluKTogRGV0ZXJtaW5lIHByb2dfYmZkLiAgUGFzcyB0byBzaW1fY3JlYXRlX2luZmVyaW9yCi0gCWFuZCBzaW1fbG9hZC4KLQkoYmZkLmgpOiBJbmNsdWRlLgotCQotCSogc2ltLWhsb2FkLmMgKHNpbV9sb2FkKTogTmV3IGZpbGUuIEltcGxlbWVudCBnZW5lcmljIHNpbV9sb2FkIGZvcgotIAloYXJkd2FyZSBvbmx5IHNpbXVsYXRvciB0YXJnZXRzLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWhsb2FkLm8pOiBBZGQgcnVsZS4KLQotV2VkIEF1ZyAyNyAwOTo1MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS11dGlscy5jIChzaW1fY29weV9hcmd2KTogUmV3cml0ZSB0byBtYXRjaCBtYWxsb2Mgc3RyYXRlZ3kKLSAJdXNlZCBieSBjb3B5YXJndiBhbmQgZnJlZWFyZ3YuCi0KLQkqIHNpbS1vcHRpb25zLmMgKHNpbV9wYXJzZV9hcmdzKTogU2F2ZSBhIGNvcHkgb2YgUFJPRy1BUkdTIGluCi0gCVNUQVRFX1BST0dfQVJHViwgbm90IGp1c3QgYSBwb2ludGVyLgotCi1Nb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotTW9uIEF1ZyAyNSAxMjoxMTowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKHNpbS1lbmRpYW4pOiBBZGQgc2Vjb25kIGFyZ3VtZW50IHRvCi0gCVNJTV9BQ19PUFRJT05fRU5ESUFOLiAgRmlyc3QgaXMgaGFyZHdpcmVkIGVuZGlhbiwgc2Vjb25kIGlzCi0gCWRlZmF1bHQgZW5kaWFuIHdoZW4gbm90IGhhcmR3aXJlZC4KLQotCSogc2ltLWNvbmZpZy5oIChXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVIpOiBOZXcgbWFjcm8sIGlmIGFsbAotIAllbHNlIGZhaWxlcyB2YWx1ZSBmb3IgdGFyZ2V0IGJ5dGUgb3JkZXIuCi0KLQkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IEFkZCBhYmZkIGFyZ3VtZW50cy4gU2V0Ci0gCVNUQVRFX1BST0dfQkZEIGFjY29yZGluZ2x5LiAgRGV0ZXJtaW5lIHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyCi0gCWZyb20gc2FtZS4KLQkoc2ltX2NvbmZpZyk6IFJldHVybiBTSU1fUkMsIGRvbid0IGFib3J0LgotCShiZmQuaCk6IEluY2x1ZGUuCi0JCi0JKiBydW4uYyAobWFpbik6IFVwZGF0ZSBjYWxsIHRvIHNpbV9vcGVuIC0gYWRkIEFCRkQgYXJndW1lbnQuCi0gIAkqIG5ydW4uYyAobWFpbik6IEFkZCBOVUxMIEFCRkQgYXJndW1lbnQuCi0KLVRodSBBdWcgMTQgMTI6NDg6NTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogTWFrZSBzdGF0aWMuCi0JQ2FsbCBzaW1fY2JfZXByaW50Ziwgbm90IHAtPmVwcmludGYuCi0JKHNpbV9jYl9wcmludGYsIHNpbV9jYl9lcHJpbnRmKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNpbS11dGlscy5oIChzaW1fY2JfcHJpbnRmLCBzaW1fY2JfZXByaW50Zik6IERlY2xhcmUuCi0KLQkqIHNpbS1iYXNpY3MuaCAoemFsbG9jLHpmcmVlLHNpbV9hZGRfY29tbWFzLFNJTV9FTEFQU0VEX1RJTUUsCi0Jc2ltX2VsYXBzZWRfdGltZV9nZXQsc2ltX2VsYXBzZWRfdGltZV9zaW5jZSk6IE1vdmUgZGVjbHMgdG8KLQlzaW0tdXRpbHMuaC4gI2luY2x1ZGUgc2ltLXV0aWxzLmguCi0JKiBzaW0tdXRpbHMuaDogQWJvdmUgZGVjbHMgbW92ZWQgaGVyZS4KLQkoc2ltX2FuYWx5emVfcHJvZ3JhbSxzaW1fbG9hZF9maWxlKTogVXNlIGBzdHJ1Y3QgX2JmZCcsIG5vdCBgYmZkJy4KLQotCSogc2ltLXdhdGNoLmMgKGFjdGlvbl93YXRjaHBvaW50KTogRml4IHRoaW5rb3MuCi0KLVRodSBKdWwgMjQgMDg6NDg6MDUgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogc2ltLXR5cGVzLmg6ICBGaXggZGVmcyBvZiA2NCBiaXQgZGF0YSB0eXBlcyBmb3IgTVNWQy4KLQotVHVlIEp1bCAyMiAxMDozNTozNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogQWRkIG1pc3NpbmcgYnJlYWsKLQl0byBGT1JDRURfQUxJR05NRU5UIGNhc2UuCi0KLVRodSBKdW4gIDUgMTM6NDg6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5jICh0YXJnZXRfdG9faG9zdF9vcGVuKTogSGFuZGxlIGhvc3RzIHdpdGggT19CSU5BUlkuCi0KLVRodSBKdW4gIDUgMDg6NDc6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlLWNvbW1vbi5pbiAobGlic2ltLmEpOiBGaXggdHlwby4KLQotVGh1IEp1biAgNSAxMzo0ODozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG5ydW4uYyAobWFpbik6IFZlcmlmeSB0aGUgc3RydWN0dXJlIHJldHVybmVkIGJlZm9yZSB1c2luZyBpdC4KLQotV2VkIEp1biAgNCAxMTo0NDowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb25maWcuaCAoV0lUSF9FTkdJTkUpOiBFbmFibGUgdGhlIHNpbS1lbmdpbmUgbW9kdWxlIGJ5Ci0gCWRlZmF1bHQuCi0KLQkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9pbnN0YWxsKTogTmV3IGZ1bmN0aW9uLiAgSW5zdGFsbCB0aGUKLSAJZW5naW5lIGluaXQgZnVuY3Rpb25zLgotCShzaW1fZW5naW5lX2luaXQpOiBbUmVdaW5pdGlhbGl6ZSB0aGUgc2ltdWxhdG9yIGVuZ2luZS4KLQkKLQkqIHNpbS1tb2R1bGUuYzogQWRkIHNpbV9lbmdpbmUgdG8gbGlzdCBvZiBtb2R1bGVzIHRoYXQgYWx3YXlzCi0gCWluc3RhbGwuCi0KLVR1ZSBKdW4gIDMgMDQ6NTI6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0td2F0Y2guYyAoc2NoZWR1bGVfd2F0Y2hwb2ludCk6IFVzZSBzaW1fdW5zY2hlZHVsZV93YXRjaHBvaW50Ci0gCXRvIHJlbW92ZSB0aGUgb2xkIHdhdGNocG9pbnQsIG5vdCBkZWxldGVfd2F0Y2hwb2ludC4KLQkod2F0Y2hfb3B0aW9uX2hhbmRsZXIpOiBBY3Rpb24gdGhlIGNvcnJlY3Qgd2F0Y2hwb2ludCwgbm90IGp1c3QKLSAJY3ljbGVzLgotCi1XZWQgTWF5IDI4IDE0OjQ3OjQxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBGb3IgOGJ5dGUgcmVhZHMsIG91dHB1dAotIAlib3RoIGxvdyBhbmQgaGlnaCB3b3JkLgotCShzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBEaXR0by4KLQkKLQkqIHNpbS10cmFjZS5jIChzZXRfdHJhY2Vfb3B0aW9ucyk6IERlbGV0ZSBjb2RlIGV4cGxpY2l0bHkgc2V0dGluZwotIAljb3JlLT50cmFjZS4KLQotCSogc2ltLW9wdGlvbnMuYyAoc2ltX3ByaW50X2hlbHApOiBDYWxsIHRoZSBsaXN0IGNvbW1hbmRzIGlmIG5vdCBhCi0gCXN0YW5kYWxvbmUgc2ltdWxhdG9yLgotCShzaW1fcHJpbnRfaGVscCk6IEFkdmlzZSB0aGF0IHNvbWUgb3B0aW9ucyBtYXkgbm90IGJlIGFwcGxpY2FibGUuCi0JCi0JKiBzaW0tdHJhY2UuYyAoc2V0X3RyYWNlX29wdGlvbnMpOiBBc3N1bWUgY29yZSBwcmVzZW50LgotCi0JKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKTogT3ZlcmZsb3cgc2lnbmFsCi0gCWJ1ZmZlciB3aGVuIGZ1bGwgbm90IGFsbW9zdCBmdWxsLgotCi1UdWUgTWF5IDI3IDE0OjMyOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBEb24ndCBibGF0IHRoZSBldmVudCBxdWV1ZQotIAl3aGVuIHByb2Nlc3Npbmcgd2F0Y2hwb2ludHMuCi0KLQkqIHNpbS13YXRjaC5oOiBNYWtlIGFyZyB1bnNpZ25lZCBsb25nIC0gc3RvcCBzaWduIGV4dGVuc2lvbi4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fd2F0Y2hfdmFsaWQpOiByZXdyaXRlIHNvIGRlYnVnYWJsZS4KLQotCSogc2ltLWNvbmZpZy5oIChXSVRIX1hPUl9FTkRJQU4pOiBEZWZhdWx0IHRvIHplcm8uCi0KLQkqIHNpbS13YXRjaC5jIChzY2hlZHVsZV93YXRjaHBvaW50KTogQWRkIGlzX3dpdGhpbiBvcHRpb24gc28gdGhhdAotIAlpbmVxdWFsaXR5IHRlc3QgaXMgcG9zc2libGUuCi0JKGhhbmRsZV93YXRjaHBvaW50KTogUmUtcGFzcyBpc193aXRoaW4gYXJnLgotCSh3YXRjaF9vcHRpb25faGFuZGxlcik6IFdoZW4gYCEnIHByZWZpeCB0byBwYy13YXRjaHBvaW50IGFyZyBwYXNzCi0gCTAgdG8gc2NoZWR1bGVfd2F0Y2hwb2ludCdzIGlzX3dpdGhpbiBhcmcuCi0JKHNpbV93YXRjaHBvaW50X2luaXQpOiBSZS1wYXNzIGlzX3dpdGhpbiBhcmcuCi0KLQkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogQWRkIGlzX2NvbW1hbmQgYXJndW1lbnQuICBEb24ndAotIAlpbmNsdWRlIC0tIHByZWZpeCB3aGVuIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIuCi0KLQkqIHNpbS13YXRjaC5jIChzY2hlZHVsZV93YXRjaHBvaW50KTogUGFzcyB0cnVlIGlzX3dpdGhpbiBhcmd1bWVudC4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3dhdGNoX3NpbSk6IEFkZCBpc193aXRoaW4gYXJndW1lbnQsCi0gCXplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIHJldmVyc2VkLgotCShzaW1fZXZlbnRzX3dhdGNoX2NvcmUpOiBEaXR0by4KLQkoV0FUQ0hfQ09SRSk6IENvbXBhcmUgcmFuZ2UgYWdhaW5zdCBpc193aXRoaW4uCi0JKFdBVENIX1NJTSk6IERpdHRvLgotCi1UdWUgTWF5IDI3IDEyOjQ4OjAzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChXQVRDSF9DT1JFKTogUGFzcyBOVUxMIGNwdSBhcmd1bWVudCB0bwotIAlzaW1fY29yZV9yZWFkX2J1ZmZlci4gIENoZWNrIG5yLWJ5dGVzIHRyYW5zZmVyZWQuCi0KLQkqIHNpbS1jb3JlLmggKHNpbV9jb3JlX2NvbW1vbik6IERlZmluZSBhIG5ldyBzdHJ1Y3QgdGhhdCBjb250YWlucwotIAl0aGUgY29tbW9uIGRhdGEuICB0byBzZCBhbmQgY3B1IHN0cnVjdHVyZXMuCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9hdHRhY2gpOiBVcGRhdGUuCi0JKHNpbV9jb3JlX2luaXQpOiBVcGRhdGUuIFJlbWVtYmVyIHRvIGNvcHkgaW5pdGlhbGl6ZWQgZGF0YSB0byBlYWNoCi0gCWNwdS4KLQkoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogRGl0dG8uCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3JlYWRfYnVmZmVyKTogQWRkIGNwdSBhcmd1bWVudC4KLQkoc2ltX2NvcmVfd3JpdGVfYnVmZmVyKTogRGl0dG8uCi0KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IFdoZW4gbWlzLWFsaWduZWQKLSAJdHJhbnNmZXIgdXNlIHhvciB2ZXJzaW9uIG9mIHJlYWQgYnVmZmVyLgotCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IERpdHRvIGZvciB3cml0ZS4KLQkKLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlcik6IE5ldyBmdW5jdGlvbiBpbXBsZW1lbnQKLSAJeG9yLWVuZGlhbiBkYXRhIHJlYWQgYnJlYWtpbmcgdHJhbnNmZXIgdXAgaW50byB4b3ItZW5kaWFuIHNpemVkCi0gCWJsb2Nrcy4KLQkoc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlcik6IERpdHRvIGZvciB3cml0ZS4KLQkocmV2ZXJzZV9uKTogUmV2ZXJzZSBvcmRlciBvZiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlcgotIAktIG5lZWRlZCBmb3IgeG9yLWVuZGlhbiB0cmFuc2ZlcnMuCi0KLUZyaSBNYXkgMjMgMTQ6MjQ6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0taW5saW5lLmg6IFJldmlldyBkZXNjcmlwdGlvbi4KLQkKLQkqIHNpbS1jb3JlLmgsIHNpbS1jb3JlLmM6IFJlZHVjZSBudW1iZXIgb2YgZnVuY3Rpb25zIGJlaW5nIGlubGluZWQKLSAJdG8ganVzdCB0aG9zZSBpbnZvbHZlZCBpbiBkYXRhIHRyYW5zZmVycyBhbmQgY29uZmlndXJhdGlvbi4KLQkKLQkqIHNpbS14Y2F0LmggKFhTVFJJTkcpOiBOZXcgbWFjcm8sIG1hcCBtYWNybyBkZWZpbml0aW9uIG9udG8KLSAJc3RyaW5nLgotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX2FsaWduZWRfTik6IFVzZS4KLQkoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IERpdHRvLgotCShzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRGl0dG8uLgotCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IERpdHRvLgotCQotCSogc2ltLWNvcmUuaDogQWRkIHhvciBlbmRpYW4gYml0bWFwIHRvIG1haW4gc3RydWN0dXJlLiAgKgotCQotIAlzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IEFkZCBzdXBvcnQgZm9yIHhvcgotIAllbmRpYW4uCi0JKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OKTogRGl0dG8uCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NldF94b3JfZW5kaWFuKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fY29yZV9hdHRhY2gpOiBEb24ndCBvdmVyd3JpdGUgdGhlIHBlci1jcHUgeG9yIG1hcCB3aGVuCi0gCWNsb25pbmcgdGhlIGdsb2JhbCBjb3JlLgotCi1GcmkgTWF5IDIzIDEwOjUzOjEzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWVuZ2luZS5oOiBVcGRhdGUgYmVsb3cgc28gdGhhdCBpdCBpcyB1c2luZyBhbiBlbnVtZXJhdGVkCi0gCXR5cGUuCi0KLVRodSBNYXkgMjIgMDk6MTI6MTYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9yZXN0YXJ0KTogCi0JKiBzaW0tcmVzdW1lLmMgKHNpbV9yZXN1bWUpOiBDaGFuZ2UgbG9uZ2ptcCBwYXJhbS9zZXRqbXAgCi0gCXJldHVybiB2YWx1ZSB1c2VkIGZvciBzaW11bGF0b3IgcmVzdGFydCBmcm9tIDAgdG8gMi4KLQotV2VkIE1heSAyMSAwODo0NzozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tc2NhY2hlLmMgKHNjYWNoZV9vcHRpb25faGFuZGxlcik6IEFkZCBpc19jb21tYW5kIGFyZy4KLQotCSogc2ltLW1vZGVsLmMgKG1vZGVsX29wdGlvbl9oYW5kbGVyKTogQWRkIGlzX2NvbW1hbmQgYXJndW1lbnQuCi0KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBBZGQgaXNfY29tbWFuZCBhcmcuCi0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX3dhdGNoX3ZhbGlkKTogVXNlIHViNjQsIGxiNjQgd2hlbiA2NGJpdCB2YWx1ZQotIAlpbnZvbHZlZC4KLQotCSogc2ltLW1vZHVsZS5jIChzaW1fbW9kdWxlX2FkZF9pbml0X2ZuKTogQ2FsbCBpbml0IGZuIGluIHRoZSBzYW1lCi0gCW9yZGVyIHRoYXQgdGhleSBhcmUgcmVnaXN0ZXJlZC4KLQotCSogc2ltLW9wdGlvbnMuaCAoT1BUSU9OX0hBTkRMRVIpOiBBZGQgYXJndW1lbnQgdG8gZGlmZmVyZW50aWF0ZQotIAliZXR3ZWVuIG9wdGlvbiBhbmQgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcuCi0KLQkqIHNpbS1vcHRpb25zLmM6IEluY2x1ZGUgc3RkbGliLmgsIGN0eXBlLmguCi0KLQkqIE1ha2UtY29tbW9uLmluIChzaW0td2F0Y2gubyk6IEFkZCBydWxlLgotCShzaW1fbWFpbl9oZWFkZXJzKTogQXNzdW1lIHNpbS1hc3NlcnQuaCBpbmNsdWRlZC4KLQkoc2ltLSoubyk6IFNpbXBsaWZ5IG1ha2UgcnVsZS4KLQkKLQkqIHNpbS1tb2R1bGUuYzogQWRkIHNpbV93YXRjaF9pbnN0YWxsIHRvIG1vZHVsZSBsaXN0LgotCi1UdWUgTWF5IDIwIDE0OjE1OjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWJhc2UuaCAoU1RBVEVfTE9BREVEX1ApOiBOZXcgcHJlZGljYXRlLiBTZXQgb25jZSBldmVyeXRoaW5nCi0gCWhhcyBiZWVuIGxvYWRlZC4KLQotCSogc2ltLXRyYWNlLmMgKHRyYWNlX2luc3RhbGwpOiBDaGVjayBtYWdpYy4gSW5jbHVkZSBzaW0tYXNzZXJ0LmguCi0JKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfaW5zdGFsbCk6IERpdHRvLgotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfaW5zdGFsbCk6IERpdHRvLgotCSogc2ltLW1vZGVsLmMgKG1vZGVsX2luc3RhbGwpOiBEaXR0by4KLQkqIHNpbS1vcHRpb25zLmMgKHN0YW5kYXJkX2luc3RhbGwpOiBEaXR0by4KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfaW5zdGFsbCk6IERpdHRvLgotCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBEaXR0by4KLQkqIHNpbS1ydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBEaXR0by4KLQkqIHNpbS11dGlscy5jIChzaW1fYW5hbHl6ZV9wcm9ncmFtKTogRGl0dG8uCi0KLQkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IE1ha2UgcHJvZmlsZV9pbnN0YWxsIGFuZCB0cmFjZV9pbnN0YWxsCi0gCW9wdGlvbmFsLgotCi0JKiBzaW0tYmFzZS5oIChTVEFURV9NRU1fQkFTRSk6IERlZmluZSBmb3IgZmxhdCBtZW1vcnkgc3lzdGVtcy4KLQotCSogc2ltLW9wdGlvbnMuYyAoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBTZXQgdGhlIGJ5dGUgb3JkZXIuCi0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19wcm9jZXNzKTogQWxsb3cgbXVsdGkgdGljayBwcm9jZXNzaW5nLgotCShzaW1fZXZlbnRzX3RpY2tuKTogTmV3IGZ1bmN0aW9uIC0gbXVsdGkgY3ljbGUgdGljay4KLQkKLQkqIHNpbS1ldmVudHMuaCAoc2ltX2V2ZW50c190aWNrbiwgc2ltX2V2ZW50c190aW1ld2FycCk6IEFkZAotIAlwcm90b3R5cGVzLiAgVW5kZXIgZGV2ZWxvcG1lbnQuCi0JKHNpbV9ldmVudHMpOiBSZXBsYWNlIHByb2Nlc3Npbmcgd2l0aCBucl90aWNrc190b19wcm9jZXNzLgotCi1UdWUgTWF5IDIwIDA5OjM5OjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbnJ1bi5jIChtYWluKTogUGFzcyBjYWxsYmFja3MgdG8gc2ltX29wZW4gaW5zdGVhZCBvZiB1c2luZwotIAlzaW1fc2V0X2NhbGxiYWNrcy4KLQotCSogcnVuLmMgKG1haW4pOiBEaXR0by4KLQotTW9uIE1heSAxOSAxMjowNzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c196YWxsb2MpOiBTaWduYWwgc2F2ZSBtZW1vcnkgYWxsb2NhdG9yIC0KLSAJc3RvcCB0ayBpbnRlcnJ1cHRpbmcgbWFsbG9jIGNhbGxzLgotCShzaW1fZXZlbnRzX3phbGxvYyk6IENvbnZlcnNlLgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tZXZlbnRzLmguCi0KLQkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19zY2hlZHVsZV9hZnRlcl9zaWduYWwpOiBDaGFuZ2UgcmV0dXJuCi0gCXR5cGUgdG8gdm9pZCAtIHNpZ25hbCBldmVudHMgYXJlIHN0cmljdGx5IGludGVybmFsLgotCShzaW1fZXZlbnRzX2luaXQpOiBBbGxvY2F0ZSBhIGZpbml0ZSBidWZmZXIgZm9yIHNpZ25hbCBldmVudHMuCi0JKHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKTogRW50ZXIgc2lnbmFsIGV2ZW50cyBpbnRvIHRoZQotIAlzaWduYWwgYnVmZmVyLgotCi0JKiBzaW0tZW5naW5lLmMgKHNpbV9lbmdpbmVfaGFsdCk6IENoZWNrIFNJTV9ERVNDIG1hZ2ljLgotCShzaW1fZW5naW5lX3Jlc3RhcnQpOiBEaXR0by4KLQkoc2ltX2VuZ2luZV9hYm9ydCk6IERpdHRvLgotCSogc2ltLXN0b3AuYyAoc2ltX3N0b3ApOiBEaXR0by4KLQkoY29udHJvbF9jX3NpbXVsYXRpb24pOiBEaXR0by4KLQkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IERpdHRvLgotCShoYXNfc3RlcHBlZCk6IERpdHRvLgotCSogc2ltLWFib3J0LmMgKHNpbV9lbmdpbmVfYWJvcnQpOiBEaXR0by4KLQotCSogc2ltLWJhc2ljcy5oICh0cmFuc2Zlcl90eXBlKTogTmV3IHR5cGUuCi0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IE5ldyBmdW5jdGlvbi4gUHJpbnQgY29yZSBzaWduYWwKLSAJaW5mb3JtYXRpb24uCi0JKHNpbV9jb3JlX2ZpbmRfbWFwcGluZyk6IEFkZCB0cmFuc2ZlciBhcmd1bWVudC4KLQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV97d3JpdGUsd3JpdGV9X3VuYWxpZ25lZF9OKTogQ2FsbAotIAlTSU1fQ09SRV9TSUdOQUwgaWYgYSByZWNvdmVyYWJsZSBhYm9ydC4KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2ZpbmRfbWFwcGluZyk6IERpdHRvLgotCi1GcmkgTWF5IDE2IDE1OjEzOjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogUmVwbGFjZSBjYWxscyB0bwotIAlzaW1faW9fZXJyb3IgdG8gbW9yZSByZXNpbGlhbnQgc2ltX2VuZ2luZV9hYm9ydC4KLQotCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRGl0dG8uCi0JKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogRGl0dG8uCi0KLVR1ZSBNYXkgMTMgMTM6NTA6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbW9kdWxlLmM6IEFkZCBzaW1fZXZlbnRzX2luc3RhbGwgdG8gbGlzdC4KLQkKLQkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19pbnN0YWxsLCBzaW1fZXZlbnRzX3VuaW5zdGFsbCk6IENsb25zZQotIAlmcm9tIHNpbV9jb3JlXyouCi0JKHNpbV9ldmVudHNfaW5pdCk6IE5vdyByZXR1cm5zIFNJR19SQy4KLQotCSogc2ltLXJ1bi5jOiBOZXcgZmlsZS4gR2VuZXJpYyBzaW1fZW5naW5lX3J1bi4KLQkqIHNpbS1yZWFzb24uYzogTmV3IGZpbGUuIEdlbmVyaWMgc2ltX3N0b3BfcmVhc29uLgotCSogc2ltLXN0b3AuYzogTmV3IGZpbGUuIEdlbmVyaWMgc2ltX3N0b3AuCi0JKiBzaW0tcmVzdW1lLmM6IE5ldyBmaWxlLiBHZW5lcmljIHNpbV9yZXN1bWUuCi0JCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWVuZ2luZS5vKTogQWRkIHJ1bGUuCi0JKHNpbS1ydW4ubywgc2ltLXJlYXNvbi5vLCBzaW0tc3RvcC5vLCBzaW0tcmVzdW1lLm8pOiBEaXR0by4KLQkKLQkqIHNpbS1lbmdpbmUuaCwgc2ltLWVuZ2luZS5jOiBOZXcgZmlsZS4gUHJvdmlkZSBnZW5lcmljCi0gCWltcGxlbWVudGF0aW9uIG9mIHNpbV9lbmdpbmVfaGFsdCwgc2ltX2VuZ2luZV9lcnJvci4gZXQuYWwuCi0KLQkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogQWRkIG1lbWJlciBoYWx0LgotCShzaW0tZW5naW5lLmgpOiBJbmNsdWRlLgotCi0JKiBzaW0tZXZlbnRzLmggKHNpbV9ldmVudF9oYW5kbGVyKTogQWx3YXlzIHBhc3MgU0lNX0RFU0MgdG8gZXZlbnQKLSAJaGFuZGxlcnMuCi0JKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfcG9sbCk6IFVwZGF0ZSBldmVudCBoYW5kbGVyLgotCi1UdWUgTWF5IDEzIDA5OjU3OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5oLCBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfd2F0Y2hfY2xvY2spOiBOZXcKLSAJZnVuY3Rpb24uCi0JKHNpbV9ldmVudHNfd2F0Y2hfc2ltKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fZXZlbnRzX3dhdGNoX2NvcmUpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV93YXRjaF92YWxpZCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2V2ZW50c19wcmVwcm9jZXNzKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fZXZlbnRzX3Byb2Nlc3MpOiBQcm9jZXNzIHRoZSB3YXRjaHBvaW50cyBhcyB3ZWxsIGFzIHRoZSB0aW1lcgotIAlxdWV1ZS4KLQkoc2ltX2V2ZW50c190aWNrKTogQ2hlY2sgV09SS19QRU5ESU5HIGluc3RlYWQgb2YgdGhlIGhvbGQgcXVldWUuCi0JKHNpbV9ldmVudHNfZGVzY2hlZHVsZSk6IENoZWNrIGFsbCB0aGUgcXVldWVzIHdoZW4gcmVtb3ZpbmcgYW4KLSAJZXZlbnQuCi0JKHNpbV9ldmVudHNfaW5pdCk6IERpdHRvIGZvciBjbGVhbmluZy4KLQotTW9uIE1heSAxOSAxMjowNzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuYyAoaXNfdWZwdV9udW1iZXIpOiBDb21tZW50IG91dCAtIGN1cnJlbnRseSB1bnVzZWQuCi0KLU1vbiBNYXkgMTkgMTE6MjM6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5jIChvc19vcGVuKTogVHlwZSBvZiBhcmcgZmxhZ3MgaXMgaW50LgotCi1GcmkgTWF5IDE2IDIyOjI2OjQzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW0tZnB1LmMgKHNpbV9mcHVfaXNfe2VxLG5lLGx0LGxlLGd0LGdlfSk6IENvbXBhcmUgSW5maW5pdGllcwotCWp1c3QgbGlrZSBub3JtYWwgbnVtYmVycyBhcyBwZXIgSUVFRSBydWxlcy4KLQotV2VkIE1heSAxNCAyMToyMDozOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYyAob3NfY2xvc2UpOiBNYXJrIHRoZSBkZXNjcmlwdG9yIGFzIGJlaW5nCi0JYXZhaWxhYmxlIGlmIHRoZSBjbG9zZSBzdWNjZWVkZWQuCi0JKG9zX29wZW4pOiBQYXNzIDA2NDQgYXMgdGhlIG1vZGUgb2YgdGhlIGZpbGUgYmVpbmcgY3JlYXRlZC4KLQotVGh1IE1heSAxNSAxMDo1ODo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1mcHUuYyAocGFja19mcHUsIHVucGFja19mcHUpOiBOZXcgZnVuY3Rpb25zIC0gZGVjb2RlIGEKLSAJZmxvYXQuCi0KLQkqIHNpbS1pbmxpbmUuYyAoU0lNX0lOTElORV9DKTogUmVuYW1lIGZyb20gX1NJTV9JTkxJTkVfQ18uCi0JKiBzaW0tbG5saW5lLmg6IFVwZGF0ZS4KLQotCSogc2ltLWZwdS5oLCBzaW0tZnB1LmMgKHNpbV9mcHVfW2l1XXszMiw2NH10byk6IE5ldyBpbnQyZnAKLSAJY29udmVyc2lvbiBmdW5jdGlvbnMuCi0JKHNpbV9mcHVfdG97MzIsNjR9W2l1XSk6IE5ldyBmcDJpbnQgZnVuY3Rpb25zLgotCQotCSogc2ltLWZwdS5oLCBzaW0tZnB1LmMgKHNpbV9mcHVfaXNfe2x0LGxlLGVxLG5lLGdlLGd0fSk6IE5ldyBmcAotIAljb21wYXJlIGZ1bmN0aW9ucy4gIFJlcGxhY2luZy4KLQkoc2ltX2ZwdV9jbXApOiBUaGlzLiBEZWxldGUuCi0JCi1Nb24gTWF5IDEyIDE0OjQ5OjA1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogQ2FsbCBlbmdpbmVfZXJyb3Igbm90Ci0gCXNpbV9pb19lcnJvciB3aGVuIHBvc3NpYmxlLgotCi1Nb24gTWF5IDEyIDA4OjU1OjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KLQotCSogc2ltLWVuZGlhbi5oIChWMV9IMik6IEFkZCBtYWNybydzIHRvIGluc2VydCBhIHdvcmQgaW50byBhCi0gCWhpZ2gvbG93IGRvdWJsZSB3b3JkLgotCi0JKiBzaW0tdHJhY2UuaDogUmVtb3ZlIGRlZmluaXRpb24gb2YgYXR0cmlidXRlIC0gZGVmaW5lZCBpbgotIAlzaW1fYmFzaWNzLmguCi0KLU1vbiBNYXkgMTIgMDg6NTU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5oIChzdHJ1Y3QgT1BUSU9OKTogQWRkIGRvY19vcHQgYXMgdGhlIGRvY3VtZW50aW5nCi0gCW5hbWUgb2YgdGhlIG9wdGlvbiAtIG9yIGZhbWlseSBvZiBvcHRpb25zLgotCi0JKiBzaW0tb3B0aW9ucy5jIChzaW1fYXJnc19jb21tYW5kKTogTWF0Y2ggY29tbWFuZCBgYS1iIGMnIHdpdGgKLSAJb3B0aW9uIGAtLWEtYi1jJyBmcm9tIG9wdGlvbiB0YWJsZS4KLQotVGh1IE1heSAgOCAxMjo0MDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogRm9yIG9wdGlvbmFsIGFyZ3VtZW50cywgd3JhcAotIAl0aGVtIGluIFtdLgotCi0JKiBzaW0tdHJhY2UuYyAoc2V0X3RyYWNlX29wdGlvbnMpOiBOZXcgZnVuY3Rpb24sIGhhbmRsZSBvcHRpb25hbAotIAlhcmd1bWVudCBhbmQgbXVsdGlwbGUgYXNzaWdubWVudC4KLQkodHJhY2Vfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCi0KLQkqIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IFRyYWNlIGJyYW5jaCBhbmQgbm90IGZwdQotIAl3aGVuIGJyYW5jaCB0cmFjaW5nIHNlbGVjdGVkLgotCi1XZWQgTWF5ICA3IDE1OjE5OjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXRyYWNlLmMgKHRyYWNlX29uZV9pbnNuKTogTWFrZSBhIHZhLWFyZ3MgZnVuY3Rpb24uCi0KLQkqIHNpbS10cmFjZS5jICh0cmFjZV92cHJpbnRmKTogTmV3IGZ1bmN0aW9uLCB2YS1hcmcgdmVyc2lvbiBvZgotIAl0cmFjZV9wcmludGYuCi0KLVR1ZSBNYXkgIDYgMTY6Mzg6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLXRyYWNlLmMgKHRyYWNlX3VuaW5zdGFsbCk6IERvbid0IGNsb3NlIGEgZmlsZSB0d2ljZS4KLQkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfdW5pbnN0YWxsKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgIDYgMDY6MTQ6MDEgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpbS10cmFjZS5jICh0b3BsZXZlbCk6IEluY2x1ZGUgYmZkLmguCi0JKHRyYWNlX29wdGlvbnMpOiBOb3RlIHRoYXQgLS10cmFjZS1saW5lbnVtIGFsc28gdHVybnMgb24KLQktLXRyYWNlLWluc24uICBBZGQgLS10cmFjZS17YnJhbmNoLHNlbWFudGljc30uCi0JKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogSWYgLS10cmFjZS1saW5lbnVtLCBhbHNvIHR1cm4gb24KLQktLXRyYWNlLWluc24uICBBZGQgLS10cmFjZS1icmFuY2ggc3VwcG9ydC4gIElmIC0tdHJhY2Utc2VtYW50aWNzLAotCXR1cm4gb24gQUxVLCBGUFUsIGJyYW5jaCwgYW5kIG1lbW9yeSB0cmFjaW5nLgotCSh0cmFjZV9vbmVfaW5zbik6IE5ldyBmdW5jdGlvbiB0byB0cmFjZSBhbiBpbnN0cnVjdGlvbi4gIFN1cHBvcnQKLQktLXRyYWNlLWxpbmVudW0uCi0JKE9QVElPTl9UUkFDRV8qKTogVXNlIGFuIGVudW0sIHJhdGhlciB0aGFuIGxvdHMgb2YgZGVmaW5lcy4KLQotCSogc2ltLXRyYWNlLmggKFRSQUNFX3tTRU1BTlRJQ1MsQlJBTkNIfV9JRFgpOiBBZGQgbmV3IG1hY3Jvcy4KLQkoTUFYX1RSQUNFX1ZBTFVFUyk6IFVzZSAzMiwgbm90IDEyIGJ5IGRlZmF1bHQuCi0JKFRSQUNFX2JyYW5jaCk6IEFkZCBuZXcgbWFzay4KLQkoVFJBQ0VfKl9QKTogRGVmaW5lIGFsbCBwb3NzaWJsZSB0cmFjZV9wIG1hY3Jvcy4KLQkodHJhY2Vfb25lX2luc24pOiBEZWNsYXJlIGZ1bmN0aW9uLgotCi1Nb24gTWF5ICA1IDE0OjA4OjM0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW0tdHJhY2UuaCAoX19hdHRyaWJ1dGVfXyk6IERlZmluZSBhcyBub3RoaW5nIGlmIG5vdCBHTlUgQyBvcgotCUdOVSBDIGRvZXNuJ3Qgc3VwcG9ydCBfX2F0dHJpYnV0ZXNfXy4KLQkoe3RyYWNlLGRlYnVnfV9wcmludGYpOiBBZGQgYXR0cmlidXRlJ3Mgc28gLVdmb3JtYXQgY2FuIGNoZWNrIHRoZQotCWZvcm1hdCBzdHJpbmdzLgotCi1Nb24gTWF5ICA1IDExOjE2OjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5oIChGT1JDRURfQUxJR05NRU5UKTogTmV3IGFsaWdubWVudCBvcHRpb24gLQotIAlhZGRyZXNzZXMgYXJlIG1hc2tlZCBmb3JjaW5nIHRoZW0gdG8gYmUgY29ycmVjdGx5IGFsaWduZWQuCi0JKFdJVEhfQUxJR05NRU5UKTogTWFrZSBOT05TVFJJQ1RfQUxJR05NRU5UIHRoZSBkZWZhdWx0LgotCSogc2ltLWNvbmZpZy5jIChjb25maWdfYWxpZ25tZW50X3RvX2EpOiBVcGRhdGUuCi0KLQkqIHNpbS1jb3JlLmggKHNpbV9jcHVfY29yZSk6IE5ldyBkYXRhIHR5cGUgY29udGFpbnMgY3B1IHNwZWNpZmljCi0gCWNvcmUgZGF0YS4KLQkqIHNpbS1iYXNlLmggKENQVV9DT1JFKTogQWRkIGNwdSBzcGVjaWZpYyBjb3JlIGRhdGEgdG8gY3B1IGJhc2UKLSAJdHlwZS4KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2F0dGFjaCk6IEFkZCBDUFUgYXJndW1lbnQuICBSZWFkeSBmb3IKLSAJcHJvY2Vzc29yIHNwZWNpZmljIGNvcmUgbWFwcy4KLQkoc2ltX2NvcmVfbWFwX2F0dGFjaCk6IENvcHkgdGhlIGNvcmUgbWFwIGRhdGEgdG8gZWFjaCBvZiB0aGUKLSAJcHJvY2Vzc29yIHNwZWNpZmljIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzLgotCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogVXBkYXRlLgotCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfTiwgc2ltX2NvcmVfd3JpdGVfTik6IFJlbmFtZS4KLQkoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OLCBzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBOZXcgbmFtZXMuCi0JKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OLCBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IE5ldwotIAlhbHRlcm5hdGl2ZXMgdGhhdCBoYW5kbGUgdW5hbGlnbmVkIGFkZHJlc3Nlcy4KLQkoc2ltX2NvcmVfe3JlYWQsd3JpdGV9X3ssdW59YWxpZ25lZF9OKTogRHJvcCBTSU1fREVTQyBhcmcsIHJlcGxhY2UKLSAJd2l0aCBqdXN0IENQVSBhcmcuCi0JKiBjZ2VuLXV0aWxzLmMgKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogVXBkYXRlLgotCi1Nb24gTWF5ICA1IDEzOjE5OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLXRyYWNlLmggKFRSQUNFX0ZQVV9JRFgpOiBBZGQgRmxvYXRpbmctcG9pbnQgc3BlY2lmaWMKLSAJdHJhY2luZy4KLQotCSogc2ltLWZwdS5oLCBzaW0tZnB1LmM6IE5ldyBmaWxlcyAtIHByb3RvdHlwZSBmb3IgZ2VuZXJpYyB0YXJnZXQKLSAJZnB1IHN1cHBvcnQuCi0KLQkqIHNpbS1pbmxpbmUuaCwgc2ltLWlubGluZS5jOiBBZGQgc3VwcG9ydCBmb3IgU0lNX0ZQVS4KLQotRnJpIE1heSAgMiAxNzo1OTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX21hcF90b19zdHIpOiBOZXcgZnVuY3Rpb24gYXNjaWkgZXF1aXZhbGVudAotIAl0byBtYXAgdHlwZS4KLQkKLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9OLCBzaW1fY29yZV93cml0ZV9OKTogVXNlIGluIHRyYWNlCi0gCXN0YXRlbWVudC4KLQotRnJpIE1heSAgMiAxNzoyODowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIyLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdHJhY2UuYzogUHJlcGVuZCBhZGRpdGlvbmFsIHRyYWNlX3ByaW50ZiBhcmd1bWVudC4KLQotCSogY2dlbi11dGlscy5jIChzaW1fZGlzYXNzZW1ibGVfaW5zbik6IEFkZCBhZGRpdGlvbmFsIGNvcmUKLSAJYXJndW1lbnRzLgotCi1GcmkgTWF5ICAyIDExOjQwOjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbnJ1bi5jIChtYWluKTogQ2F0Y2gvcmVwb3J0IGVycm9yZW5vdXMgc2ltdWxhdG9yIHN0YXRlcy4KLQotCSogc2ltLW1vZHVsZS5jOiAjaW5jbHVkZSAibGliaWJlcnR5LmgiIHNvIHRoYXQgeG1hbGxvYyBpcyBkZWZpbmVkLgotICAJKiBzaW0tdHJhY2UuYzogI2luY2x1ZGUgc3RyaW5nLmgvc3RyaW5ncy5oIHNvIHRoYXQgbWVtc2V0IGlzCi0gCWRlZmluZWQuCi0JKiBzaW0tdXRpbHMuYzogRGl0dG8uCi0JKiBzaW0tcHJvZmlsZS5jOiBEaXR0by4gQW5kIHN0ZGxpYi5oLgotCShwcmludF9iYXIpOiBPbmx5IGRlZmluZSB3aGVuIHVzZWQgYnkgaW5zdHJ1Y3Rpb24gb3IgbWVtb3J5IHByb2ZpbGVyLgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IE1ha2UgdWwgbW9yZSBsb2NhbC4KLQkKLQkqIHNpbS1sb2FkLmMgKHNpbV9sb2FkX2ZpbGUpOiBNYWtlIHRoZSBuYW1lIGNvbnN0YW50LgotCShzaW1fbG9hZF9maWxlKTogUGFzc2lmeSBnY2MuCi0KLQkqIHNpbS11dGlscy5oOiBOZXcgZmlsZSwgcHJlLWRlY2xhcmUgdXRpbGl0ZXMgaW4gY29ycmVzcG9uZGluZyAuYwotIAlmaWxlLgotCSogc2ltLXV0aWxzLmMsIHNpbS1sb2FkLmM6IEluY2x1ZGUgc2ltLXV0aWxzLmguCi0JCi0JKiBzaW0tYmFzZS5oIChzaW1fY3B1KTogUHJlIGRlZmluZSBoZXJlIHNvIGF2YWlsYWJsZSB0byBhbGwuCi0KLQkqIHNpbS1jb3JlLmggKERFQ0xBUkVfU0lNX0NPUkVfV1JJVEVfTiwgREVDTEFSRV9TSU1fQ09SRV9SRUFEX04pOgotIAlSZXN0b3JlIHRoZSBzaW1fY3B1IGFuZCBpbnN0cnVjdGlvbl9hZGRyZXNzIGFyZ3VtZW50cyBzbyB0aGF0IGZ1bGwKLSAJaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBhYm9ydCBmdW5jdGlvbi4KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2ZpbmRfbWFwcGluZywgc2ltX2NvcmVfd3JpdGVfYnVmZmVyKTogRGl0dG8uCi0JKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX04sIHNpbV9jb3JlX3JlYWRfTik6IFVwZGF0ZS4KLQotCSogc2ltLXRyYWNlLmgsIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IEFkZCBpbnRlcmltCi0gCXRyYWNpbmcgc3VwcG9ydCBmb3Igc2ltLWV2ZW50cyBhbmQgc2ltLWNvcmUuCi0JKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogQ29udmVydCAjaWYgdG8gaWYgd2hlcmUgcG9zc2libGUgc28gYWx3YXlzCi0gCWNvbXBpbGVkL2NoZWNrZWQgYnkgQyBjb21waWxlci4KLQkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfd3JpdGVfTiwgc2ltX2NvcmVfcmVhZF9OKTogVXBkYXRlLgotCQotCSogc2ltLWJhc2UuaDogQWRqdXN0IGNvbW1lbnQgZG9jdW1lbnRpbmcgaG93IHRvIGRlZmluZSB0aGUgY3B1Ci0gCXN0cnVjdHVyZS4KLQkoc2ltX3N0YXRlX2Jhc2UpOiBBZGQgc2ltX2NvcmUgYW5kIHNpbV9ldmVudHMgdG8gc2ltdWxhdG9yIGJhc2UKLSAJb2JqZWN0LgotCi0JKiBzaW0tdHJhY2UuaCwgc2ltLXRyYWNlLmMgKHRyYWNlX3ByaW50Zik6IEFkZCBTSU1fREVTQyBhcmd1bWVudC4KLQkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2luaXQsIHNpbV9jb3JlX2F0dGFjaCwKLSAJc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogVXBkYXRlLgotCSogc2ltLWV2ZW50cy5jIChFVFJBQ0UsIHNpbV9ldmVudHNfaW5pdCwgc2ltX2V2ZW50c190aW1lLAotIAl1cGRhdGVfdGltZV9mcm9tX2V2ZW50LCBpbnNlcnRfc2ltX2V2ZW50LAotIAlzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCwgc2ltX2V2ZW50c19kZXNjaGVkdWxlLAotIAlzaW1fZXZlbnRzX3RpY2spOiBEaXR0by4KLQkKLQkqIHNpbS1iYXNpY3MuaCAoc2ltLW1vZHVsZS5oLCBzaW0tdHJhY2UuaCwgc2ltLXByb2ZpbGUuaCwKLSAJc2ltLW1vZGVsLmgpOiBNb3ZlICNpbmNsdWRlcyBmcm9tIGhlcmUuCi0JKiBzaW0tYmFzZS5oOiBUbyBoZXJlLgotCShzaW0tY29yZS5oLCBzaW0tZXZlbnRzLmgsIHNpbS1pby5oKTogSW5jbHVkZSBhbHNvCi0JCi1XZWQgQXByIDMwIDE1OjM3OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYyAoZGVmYXVsdF9jYWxsYmFjayk6IE1pc3NpbmcgaW5pdGlhbGlzZXJzLgotCi1UaHUgTWF5ICAxIDEwOjQwOjQ3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS11dGlscy5jIChzaW1fYWRkX2NvbW1hcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHNpbS1iYXNpY3MuaCAoc2ltX2FkZF9jb21tYXMpOiBBZGQgcHJvdG90eXBlLgotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX3ByaW50X3Byb2ZpbGUpOiBQcmludCBjb21tYXMgaW4gbnVtYmVycy4KLQkqIHNpbS1wcm9maWxlLmMgKENPTU1BUyk6IE5ldyBtYWNyby4KLQkocHJpbnRfKik6IFVzZSBpdCB0byBwcmludCBjb21tYXMgaW4gbnVtYmVycy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogY2dlbi1zaW0uaCAoc2ltX3NpZ25hbF90eXBlKTogQWRkIFNJTV9TSUdJTlQuCi0JKGNnZW5fc3RhdGUpOiBOZXcgbWVtYmVyIHJ1bl9mYXN0X3AuCi0JKGNnZW5faW5pdCk6IEFkZCBwcm90b3R5cGUuCi0JKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBgY3B1Jy4KLQkqIGNnZW4tdHJhY2UuYyAodHJhY2VfaW5zbik6IFVwZGF0ZSBjYWxsIHRvIHNpbV9kaXNhc3NlbWJsZV9pbnNuLgotCSogY2dlbi11dGlscy5jIChjZ2VuX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBgY3B1Jy4gIFJld3JpdGUgZmV0Y2hpbmcgb2YgaW5zbi4KLQkqIGdlbm1sb29wLnNoOiBDYWxsIGVuZ2luZV9oYWx0IGlmIGxvb3AgZXhpdHMuCi0KLQkqIE1ha2VmaWxlLmluIChzaW0tb3B0aW9uc19oKTogRGVmaW5lLgotCShzaW0te21vZHVsZSxvcHRpb25zLHRyYWNlLHByb2ZpbGUsdXRpbHN9Lm8pOiBDbGVhbiB1cCBkZXBlbmRlbmNpZXMuCi0JKHNpbS1tb2RlbC5vKTogQWRkIG5ldyBydWxlLgotCShjZ2VuLXtzY2FjaGUsdHJhY2UsdXRpbHN9Lm8pOiBBZGQgbmV3IHJ1bGVzLgotCSogYWNsb2NhbC5tNCAoU0lNX0FDX09QVElPTl97U0NBQ0hFLERFRkFVTFRfTU9ERUx9KTogQWRkLgotCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX3ByaW50X3Byb2ZpbGUpOiBDaGFuZ2UgYHNkJyBhcmcgdG8gYGNwdScuCi0JSW5kZW50IG91dHB1dCBieSAyIHNwYWNlcy4KLQkqIGNnZW4tc2NhY2hlLmggKHNjYWNoZV9wcmludF9wcm9maWxlKTogVXBkYXRlLgotCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2ZpbmkpOiBJbmRlbnQgb3V0cHV0IGJ5IDIgc3BhY2VzLgotCVVzZSB0cmFjZV9wcmludGYsIG5vdCBmcHJpbnRmLgotCSh0cmFjZV9leHRyYWN0KTogVXNlIHRyYWNlX3ByaW50Ziwgbm90IGNnZW5fdHJhY2VfcHJpbnRmLgotCSogZ2VubWxvb3Auc2ggKCFGQVNUIGNhc2UpOiBJbmNyZW1lbnQgYGluc25fY291bnQnLgotCSogc2ltLWJhc2UuaCAoc2ltX3N0YXRlX2Jhc2UpOiBPbmx5IGluY2x1ZGUgc2NhY2hlX3NpemUgaWYgV0lUSF9TQ0FDSEUuCi0JKHNpbV9jcHVfYmFzZSk6IFJlbmFtZSBtZW1iZXIgYHNkJyB0byBgc3RhdGUnIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAotCWFjY2VzcyBtYWNybydzIG5hbWUuCi0JKiBzaW0tY29yZS5jIChzaW1fY29yZV9pbml0KTogVXNlIEVYVEVSTl9TSU1fQ09SRSB0byBkZWZpbmUgaXQuCi0JQ2hhbmdlIHJldHVybiB0eXBlIHRvIFNJTV9SQy4KLQkoc2ltX2NvcmVfe2luc3RhbGwsdW5pbnN0YWxsfSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzaW0tY29yZS5oIChzaW1fY29yZV97aW5zdGFsbCx1bmluc3RhbGx9KTogRGVjbGFyZS4KLQkoc2ltX2NvcmVfaW5pdCk6IFVzZSBFWFRFUk5fU0lNX0NPUkUgdG8gZGVmaW5lIGl0LgotCUNoYW5nZSByZXR1cm4gdHlwZSB0byBTSU1fUkMuCi0JKiBzaW0tbW9kZWwuaCAobW9kZWxzLG1hY2hzLG1vZGVsX2luc3RhbGwpOiBEZWNsYXJlLgotCSogc2ltLW1vZHVsZS5jIChtb2R1bGVzKTogQWRkIHNjYWNoZV9pbnN0YWxsLCBtb2RlbF9pbnN0YWxsLgotCShzaW1fcG9zdF9hcmd2X2luaXQpOiBTZXQgY3B1LT5zdGF0ZSBiYWNrbGlua3MuCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25zKTogRGVsZXRlIC0tc2ltY2FjaGUtc2l6ZSwtLW1heC1pbnNucy4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KLQkqIHNpbS1wcm9maWxlLmMgKFBST0ZJTEVfe0hJU1RPR1JBTSxMQUJFTH1fV0lEVEgpOiBNb3ZlIHRvCi0Jc2ltLXByb2ZpbGUuaC4KLQkoKik6IEFzc3VtZSBBTlNJIEMuCi0JKHByb2ZpbGVfb3B0aW9ucyk6IERlbGV0ZSAtLXByb2ZpbGUtc2ltY2FjaGUuCi0JKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KLQkocHJvZmlsZV9wcmludF9pbnNuKTogQ2hhbmdlIGBzZCcgYXJnIHRvIGBjcHUnLiAgSW5kZW50IG91dHB1dCAyCi0Jc3BhY2VzLgotCShwcm9maWxlX3ByaW50X3ttZW1vcnksbW9kZWx9KTogTGlrZXdpc2UuCi0JKHByb2ZpbGVfcHJpbnRfc2ltY2FjaGUpOiBEZWxldGUuCi0JKHByb2ZpbGVfcHJpbnRfc3BlZWQpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2ZpbGVfcHJpbnQpOiBSZXdyaXRlLgotCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9zY2FjaGUpOiBSZW5hbWVkIGZyb20gUFJPRklMRV9zaW1jYWNoZS4KLQkoV0lUSF9QUk9GSUxFX1NDQUNIRV9QKTogUmVuYW1lZCBmcm9tIFdJVEhfUFJPRklMRV9TSU1DQUNIRV9QLgotCShQUk9GSUxFX0RBVEEpOiBEZWxldGUgbWVtYmVycyBzaW1jYWNoZV97aGl0cyxtaXNzZXN9LgotCShQUk9GSUxFX0NPVU5UX1NJTUNBQ0hFX3tISVQsTUlTU30pOiBEZWxldGUuCi0JKFBST0ZJTEVfe0NBTExCQUNLLENQVV9DQUxMQkFDS30pOiBOZXcgdHlwZXMuCi0JKHByb2ZpbGVfcHJpbnQpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1XZWQgQXByIDMwIDExOjM0OjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tc2NhY2hlLltjaF0sIGNnZW4tc2ltLmg6IE5ldyBmaWxlcy4KLQkqIGNnZW4tdHJhY2UuW2NoXSwgY2dlbi10eXBlcy5oLCBjZ2VuLXV0aWxzLmMsIGdlbm1sb29wLnNoOiBOZXcgZmlsZXMuCi0JKiBzaW0tbW9kZWwuYzogTmV3IGZpbGUuCi0KLQkqIE1ha2UtY29tbW9uLmluIChjbGVhbiB0YXJnZXRzKTogVW5kbyBwYXRjaCBvZiBBcHIuIDIyLgotCi1GcmkgQXByIDI1IDE1OjI4OjMyIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW0tbi1iaXRzLmggKHNpZ25lZCk6IElmIHdlIGhhdmUgYSBzdGFuZGFyZCBjb21waWxlciwgdW5kZWYKLQlzaWduZWQsIHNvIHRoYXQgc2lnbmVkTiBpcyBkZWZpbmVkIGNvcnJlY3RseS4KLQotVGh1IEFwciAyNCAwMDowMDowNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tbW9kdWxlLmgsIHNpbS1tb2RlbC5oLCBzaW0tcHJvZmlsZS5oOiBOZXcgZmlsZXMuCi0JKiBzaW0tbW9kdWxlLmMsIHNpbS1wcm9maWxlLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2UtY29tbW9uLmluIChTSU1fUFJPRklMRSk6IERlZmluZQotCShDT05GSUdfQ0ZMQUdTKTogQWRkICQoU0lNX1BST0ZJTEUpLgotCShzaW1fbWFpbl9oZWFkZXJzKTogQWRkIHNpbS1tb2R1bGUuaCwgc2ltLW1vZGVsLmgsIHNpbS1wcm9maWxlLmguCi0JKHNpbV9tb2R1bGUubyxzaW0tcHJvZmlsZS5vKTogQWRkIHJ1bGVzIGZvci4KLQkqIGFjbG9jYWwubTQgKC0tZW5hYmxlLXNpbS10cmFjZSk6IEFsbG93IHN5bWJvbGljIGFyZ3VtZW50cy4KLQkoLS1lbmFibGUtc2ltLXByb2ZpbGUpOiBBZGQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogc2ltLWJhc2UuaCAoc2ltX3N0YXRlX2Jhc2UpOiBOZXcgbWVtYmVycyBpbml0X2xpc3QsIHVuaW5zdGFsbF9saXN0LAotCW1vZGVsLiAgTW92ZSB0cmFjZSBhbmQgcHJvZmlsZSBzdXBwb3J0IHRvIHNpbS17dHJhY2UscHJvZmlsZX0uaC4KLSAJTmV3IG1lbWJlcnMgdHJhY2VfZGF0YSwgcHJvZmlsZV9kYXRhLgotCSogc2ltLWJhc2ljcy5oOiAjaW5jbHVkZSBzaW0tbW9kdWxlLmgsIHNpbS1tb2RlbC5oLCBzaW0tcHJvZmlsZS5oLgotCSogc2ltLWNvbmZpZy5oOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBXSVRIX1BST0ZJTEUuCi0JKFdJVEhfVFJBQ0UpOiBDaGFuZ2UgZGVmYXVsdCB0byAtMS4KLQkoTUFYX05SX1BST0NFU1NPUlMpOiBBbHdheXMgZGVmaW5lLgotCSogc2ltLW9wdGlvbnMuYzogTW92ZSB0cmFjZSBhbmQgcHJvZmlsZSBzdXBwb3J0IHRvCi0Jc2ltLXt0cmFjZSxwcm9maWxlfS5oLgotCShzaW1fcHJlX2FyZ3ZfaW5pdCk6IE1vdmVkIHRvIHNpbS1tb2RlbC5jLgotCShzdGFuZGFyZF9pbnN0YWxsKTogTmV3IGZ1bmN0aW9uLgotCSogc2ltLW9wdGlvbnMuaCAoc2ltX3ByZV9hcmd2X2luaXQpOiBNb3ZlIGRlY2wgdG8gc2ltLW1vZGVsLmMuCi0JKHN0YW5kYXJkX2luc3RhbGwpOiBEZWNsYXJlLgotCSogc2ltLXRyYWNlLmM6IFRyYWNpbmcgb3B0aW9uIGhhbmRsaW5nIG1vdmVkIGhlcmUgZnJvbSBzaW0tb3B0aW9ucy5jLgotCSh0cmFjZV9pbnN0YWxsLCB0cmFjZV91bmluc3RhbGwpOiBOZXcgZnVuY3Rpb25zLgotCSh0cmFjZV9wcmludGYpOiBVcGRhdGUgcmVmZXJlbmNlIHRvIFRSQUNFX0ZJTEUuCi0JKiBzaW0tdHJhY2UuaCAoVFJBQ0VfRk9PX0lEWCk6IE1vdmVkIGhlcmUgZnJvbSBzaW0tYmFzZS5oLgotCShUUkFDRV9mb28pOiBCaXQgbWFza3MgZm9yIHN5bWJvbGljIGFyZ3VtZW50cyB0byAtLWVuYWJsZS1zaW0tdHJhY2UuCi0JKFdJVEhfVFJBQ0VfRk9PX1ApOiBEZWZpbmUuCi0JKHRyYWNlX2luc3RhbGwpOiBEZWNsYXJlLgotCShUUkFDRV9EQVRBKTogTmV3IHN0cnVjdC4KLQotV2VkIEFwciAyMyAxNzoyMzoxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBydW4uYzogVW5kbyBsYXN0IGV4ZWNfYmZkIHBhdGNoLgotCShtYWluKTogT25seSBwYXNzIC1FIGlmZGVmIFNJTV9IQVZFX0JJRU5ESUFOLgotCi1XZWQgQXByIDIzIDE3OjU0OjI3IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBydW4uYyAoZXhlY19iZmQpOiBBZGQgYmFjayBpbi4KLQkobWFpbik6IFNldCBleGVjX2JmZC4KLQotVHVlIEFwciAyMiAxNDo0Mzo0NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tbG9hZC5jIChzaW1fbG9hZF9maWxlKTogI2luY2x1ZGUgPHN0ZGlvLmg+IGZvciBOVUxMLgotCi1XZWQgQXByIDIzIDAyOjU1OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWV2ZW50cy5jIChpbnNlcnRfc2ltX2V2ZW50KTogQ2FsbCBzaW1faW9fZXJyb3IgaW5zdGVhZCBvZgotIAlsZXNzIHdlbGwgZGVmaW5lZCBlbmdpbmVfZXJyb3IuCi0JKiBzaW0tY29yZS5jOiBEaXR0by4KLQotVHVlIEFwciAyMiAwODo0ODoxNiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlLWNvbW1vbi5pbjogIENoYW5nZSBjbGVhbiB0YXJnZXRzIHRvIHVzZSA6OiBzbyB0aGF0IG90aGVyCi0JTWFrZWZpbGVzIGNhbiBoYXZlIHRoZWlyIG93biBjbGVhbiB0YXJnZXRzLgotCSogc2ltLWxvYWQuYyAoeHByaW50ZiBlcHJpbnRmKTogIFVzZSBBTlNJX1BST1RPVFlQRVMgaW5zdGVhZCBvZgotCV9fU1REQ19fIHRvIGNvbnRyb2wgdXNlIG9mIHN0ZGFyZyB2cy4gdmFyYXJncyBzeW50YXguICBTb21lCi0Jc3lzdGVtcyBjYW4ndCB1c2UgX19TVERDX18sIGJ1dCByZXF1aXJlIHN0ZGFyZy4KLQotRnJpIEFwciAxOCAxMToxNDo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25zKTogQWRkIC0tZW5kaWFuLgotCShzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgotCi0JKiBucnVuLmM6ICNpbmNsdWRlIDxzaWduYWwuaD4uCi0gCShtYWluLCBjbnRybF9jKTogV3JhcCBjYWxscyB0byBzaW1fcmVzdW1lIGluIGEgU0lHSU5UCi0gCWhhbmRsZXIgdGhhdCBjYWxscyBzaW1fc3RvcCAoKS4KLQotRnJpIEFwciAxOCAxMzoxMTozNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluLCBjbnRybF9jKTogV3JhcCBjYWxscyB0byBzaW1fcmVzdW1lIGluIGEgU0lHSU5UCi0gCWhhbmRsZXIgdGhhdCBjYWxscyBzaW1fc3RvcCAoKS4gIFNpbXVsYXRvcnMgbWF5IHN0aWxsIGJlCi0gCWVzdGFibGlzaGluZyB0aGVpciBvd24gaGFuZGxlci4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3BvbGwpOiBSZW5hbWUgZnJvbQotIAlzaW1fZXZlbnRzX2F0X2xhcmdlX2ludC4gIFBvbGwgSU8uCi0KLQkqIHNpbS1pby5jIChzaW1faW9fcG9sbF9xdWl0KTogTmV3IGZ1bmN0aW9uIC0gcGFzcyBvbiBhIHBvbGxpbmcKLSAJcmVxdWVzdC4KLQotCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogTmV3IGZ1bmN0aW9uIHBvbGwgZm9yIHF1aXQgc2lnbmFsCi0Jd2hlcmUgbmVlZGVkLgotCShkZWZhdWx0X2NhbGxiYWNrKTogSW5jbHVkZSBtYWdpYyBudW1iZXIuCi0KLVRodSBBcHIgMTcgMDI6MjU6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogQ2hlY2sgZm9yIGhlYWRlcnMgdGltZS5oLCBzeXMvdGltZS5oLCBzeXMvcmVzb3VyY2UuaC4KLQlDaGVjayBmb3IgZnVuY3Rpb25zIGdldHJ1c2FnZSwgdGltZS4KLQkqIHNpbS1iYXNpY3MuaCAoU0lNX0VMQVBTRURfVElNRSk6IE5ldyB0eXBlZGVmLgotCShzaW1fZWxhcHNlZF90aW1lX2dldCwgc2ltX2VsYXBzZWRfdGltZV9zaW5jZSk6IEFkZCBwcm90b3R5cGVzLgotCSogc2ltLXV0aWxzLmM6ICNpbmNsdWRlIHRpbWUuaCwgc3lzL3RpbWUuaCwgc3lzL3Jlc291cmNlLmggaWYgYWJsZS4KLQkoc2ltX2VsYXBzZWRfdGltZV9nZXQsIHNpbV9lbGFwc2VkX3RpbWVfc2luY2UpOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBzaW0tdXRpbHMuYyAoc2ltX2NvcHlfYXJndiwgc2ltX2FuYWx5emVfcHJvZ3JhbSk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIHNpbS1vcHRpb25zLmMsIHNpbS1vcHRpb25zLmg6IE5ldyBmaWxlcy4KLQkqIHNpbS1jb25maWcuaCAoV0lUSF9ERUJVRyk6IFByb3ZpZGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvLgotCSogTWFrZS1jb21tb24uaW4gKG5ydW4ubyk6IEFkZCBydWxlcyBmb3IuCi0JKiBucnVuLmM6IE5ldyBmaWxlLgotCi0JKiBydW4uYyAobWFpbik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBzaW1fb3Blbi4KLQotCSogTWFrZS1jb21tb24uaW4gKHNpbS1vcHRpb25zLm8sIHNpbS1sb2FkLm8sIHNpbS10cmFjZS5vKTogQWRkIHJ1bGVzLgotCShzaW1fbWFpbl9oZWFkZXJzKTogQWRkIHNpbS10cmFjZS5oLgotCSogcnVuLmMgKGV4ZWNfYmZkLCB0YXJnZXRfYnl0ZV9vcmRlcik6IERlbGV0ZS4KLQkobWFpbik6IFBhc3MgLUUgPGVuZGlhbj4gdG8gc2ltX29wZW4uICBEZWxldGUgY29kZSB0byBsb2FkIHNlY3Rpb25zLAotCWNhbGwgc2ltX2xvYWQgaW5zdGVhZC4gIENoZWNrIHJldHVybiBjb2RlIG9mIHNpbV9jcmVhdGVfaW5mZXJpb3IuCi0JKiBzaW0tYmFzZS5oIChDVVJSRU5UX1NUQVRFKTogRGVmaW5lLgotCShzaW1fc3RhdGVfYmFzZSk6IE1ha2UgdHlwZWRlZi4gIE5ldyBtZW1iZXJzIG9wdGlvbnMsIHByb2dfYXJndiwKLQlwcm9nX2JmZCwgdGV4dF97c2VjdGlvbixzdGFydCxlbmR9LCBzdGFydF9hZGRyLCBzaW1jYWNoZV9zaXplLAotCW1lbV9zaXplLCBtZW1vcnkgWysgY29ycmVzcG9uZGluZyBhY2Nlc3MgbWFjcm9zXS4KLQkoc2ltX2NwdV9iYXNlKTogTmV3IHR5cGVkZWYuCi0JKiBzaW0tdHJhY2UuaDogTmV3IGZpbGUuCi0JKiBzaW0tdHJhY2UuYzogTmV3IGZpbGUuCi0JKiBzaW0tYmFzaWNzLmg6ICNpbmNsdWRlIGl0LgotCSogc2ltLWxvYWQuYzogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMTUgMTU6MTA6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsLWNvbW1vbik6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsLW1hbik6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBBcHIgMTUgMTU6MDg6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tYXNzZXJ0LmggKFNJTV9BU1NFUlQsIEFTU0VSVCk6IEFsbG93IHRoZXNlIG1hY3JvcyB0bwotCWJlIG92ZXJyaWRlbi4KLQotV2VkIEFwciAgOSAxNjowNjo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWJhc2ljcy5oOiBPbmx5IGJyaW5nIGluIGNvbmZpZy5oIGFuZCB0Y29uZmlnLmggaWYKLSAJSEFWRV9DT05GSUdfSC4KLQotTW9uIEFwciAgNyAxMTozOTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5oIChXSVRIX1RBUkdFVF9XT1JEX01TQik6IE5ldyBNYWNyby4gRGVmaW5lIHRoZSBiaXQKLSAJbnVtYmVyaW5nIGNvbnZlbnRpb24gb2YgdGhlIHRhcmdldC4KLQkqIHNpbS1jb25maWcuYyAocHJpbnRfc2ltX2NvbmZpZyk6IFByaW50IFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRQotIAlhbmQgV0lUSF9UQVJHRVRfV09SRF9NU0IuCi0JKHNpbV9jb25maWcpOiBXaGVuIHBvc3NpYmxlLCBjaGVjayBmb3IgY29uc2lzdGVuY3kgd2l0aCBiaXRzaXplCi0gCWFuZCBtc2IuCi0KLQkqIHNpbS1iaXRzLmg6IEFsbG93IE1TQiB0byBiZSBvdGhlciB0aGFuIHplcm8uCi0JKiBzaW0tYml0cy5jOiBEaXR0by4KLQkqIHNpbS1uLWJpdHMuaDogRGl0dG8uCi0JCi0JKiBzaW0tYml0cy5oIChNU01BU0sqKTogTmV3IG1hY3JvcyAtIGNvbnZlcmNlIHRvIExTTUFTSyouCi0JKiBzaW0tbi1iaXRzLmggKE1TTUFTS0VEbik6IERpdHRvLgotCi1Nb24gQXByIDE0IDE2OjI5OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi1Nb24gQXByICA3IDEwOjQ2OjM4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogTW92ZSBgbWFnaWMnIHRvIGVuZCBvZiBzdHJ1Y3QuCi0KLU1vbiBBcHIgIDcgMTU6NTM6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogQ2hlY2sgdGhhdCBhIHByb2dyYW0gdG8gcnVuIHdhcyBzcGVjaWZpZWQuCi0KLU1vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1RZUEVfU0lHTkFMKTogQWRkIGNoZWNrLgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1XZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1lbmRpYW4uaDogTW92ZSBob3N0IHtMSVRUTEUsQklHfV9FTkRJQU4gc3VwcG9ydCBmcm9tIGhlcmUsCi0JKiBzaW0tY29uZmlnLmg6IFRvIGhlcmUuCi0KLQkqIE1ha2UtY29tbW9uLmluIChTSU1fRVhUUkFfREVQUyk6IE5ldyBjb25maWcgdmFyLgotCShzaW1fbWFpbl9oZWFkZXJzKTogRGVmaW5lLgotCShzaW0tKi5vKTogRGVwZW5kIG9uICQoU0lNX0VYVFJBX0RFUFMpLgotCShCVUlMVF9TUkNfRlJPTV9DT01NT04pOiBNb3ZlIGhlcmUgZnJvbSAuLi9kMzB2L01ha2VmaWxlLmluLgotCShjbGVhbik6IFVzZSBpdC4KLQkoc2ltLXV0aWxzLm8pOiBBZGQgcnVsZSBmb3IuCi0JKiBzaW0tdXRpbHMubzogTmV3IGZpbGUuCi0JKiBzaW0tYmFzaWNzLmg6ICNpbmNsdWRlIHNpbS1iYXNlLmguCi0JKHphbGxvYyk6IE1ha2UgYXJndW1lbnQgdW5zaWduZWQgbG9uZy4KLQkqIHNpbS1iYXNlLmg6IE5ldyBmaWxlLgotCSogc2ltLWlubGluZS5oIChTSU1fSU8gc3VwcG9ydCk6IERlbGV0ZS4KLQkqIHNpbS1pby5oOiBEZWxldGUgaW5saW5lIHN1cHBvcnQuCi0JKiBzaW0taW8uYzogTGlrZXdpc2UuICBzaW0tc3RhdGUuaCByZW5hbWVkIHRvIHNpbS1tYWluLmguCi0JKiBzaW0tY29uZmlnLmM6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KLQkqIHNpbS1jb3JlLmM6IExpa2V3aXNlLgotCSogc2ltLWV2ZW50cy5jOiBMaWtld2lzZS4KLQotCSogcnVuLmMgKG1haW4pOiBQYXNzIFNJTV9PUEVOX1NUQU5EQUxPTkUgdG8gc2ltX29wZW4uCi0KLQkqIGFjbG9jYWwubTQ6IENoZWNrIGZvciBzdGRsaWIuaCwgc3RyaW5nLmgsIHN0cmluZ3MuaCwgdW5pc3RkLmguCi0JKHNpbS1kZWJ1Zyk6IEFsbG93IGFyZ3VtZW50cy4gIERlZmluZSBXSVRIX0RFQlVHIGluIGFkZGl0aW9uIHRvCi0JLURERUJVRy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAgMiAxMTowODoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWNvbmZpZy5oIChXSVRIX0FMSUdOTUVOVCwgV0lUSF9GTE9BVElOR19QT0lOVCwKLSAJV0lUSF9YT1JfRU5ESUFOLCBXSVRIX1NNUCwgV0lUSF9SRVNFUlZFRF9CSVRTKTogQXNzdW1lIHRoYXQgdGhlc2UKLSAJYXJlIGRlZmluZWQgYnkgdGhlIGNvbmZpZ3VyZS4KLQotCSogYWNsb2NhbC5tNCAoc2ltLXN0ZGlvKTogQWRkIG9wdGlvbiBzdGRpbyBmcm9tIC4uL3BwYyBjb25maWd1cmUuCi0JCi0JKiBhY2xvY2FsLm00IChmbG9hdGluZy1wb2ludCwgeG9yLWVuZGlhbiwgYWxpZ25tZW50LCBzbXAsCi0gCXJlc2VydmVkLWJpdHMpOiBBbHdheXMgZGVmaW5lLgotCQotCSogc2ltLWNvbmZpZy5oLCBzaW0tY29uZmlnLmMgKHNpbV9jb25maWcpOiBOZXcgZnVuY3Rpb24gLSBhbmQgbmV3Ci0gCWZpbGUgLSBjby1vcmRpbmF0ZSB0aGUgc2V0dGluZy9jaGVja2luZyBvZiB0aGUgY29tbW9uIHNpbXVsYXRvcgotIAljb25maWd1cmF0aW9uIG9wdGlvbnMuCi0KLQkqIE1ha2UtY29tbW9uLmluIChzaW0tY29uZmlnLm8pOiBBZGQgcnVsZS4KLQotRnJpIE1hciAyOCAxNTozMjowMCAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYyAob3NfeyxlfXZwcmludGZfZmlsdGVyZWQpOiBDaGFuZ2Ugc3RkYXJnIHR5cGUgdG8KLQl2YV9saXN0IGZyb20gdm9pZCAqLCBzaW5jZSB2YV9saXN0IG1pZ2h0IG5vdCBiZSBhIHBvaW50ZXIgdHlwZS4KLQotTW9uIE1hciAyNCAxNToyNzoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLW4tZW5kaWFuLmggKG9mZnNldF9OKTogQ29ycmVjdCBhc3NlcnRpb24gLSB3b3JkIGFuZCBzdWIgd29yZAotIAlpbiB3cm9uZyBvcmRlci4KLQkob2Zmc2V0X04pOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIExFIG9mZnNldC4KLQotCSogc2ltLWlvLmMgKHNpbV9pb19lcnJvcik6IEluY2x1ZGUgYSBuZXcgbGluZSB3aGVuIHJlcG9ydGluZwotIAllcnJvcnMuCi0KLQkqIHNpbS1hc3NlcnQuaCAoU0lNX0ZJTFRFUl9QQVRIKTogT3V0IGJ5IG9uZSB3aGVuIGxvY2F0aW5nIGxhc3QKLSAJYC8nLgotCi1UaHUgTWFyIDIwIDIyOjMxOjA2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcnVuLmM6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaC4KLQotCSogY2FsbGJhY2suYyAob3NfZXZwcmludGZfZmlsdGVyZWQpOiBGaXggdHlwby4KLQotRnJpIE1hciAyMSAxMzozNjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogcnVuLmMgKHN0cmluZy5oLCBzdHJpbmdzLmgsIHN0ZGxpYi5oKTogSW5jbHVkZS4KLQotCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3RpY2spOiBSZWNlbnQgY2xlYW51cCBmYWlsZWQgdG8gcmV0dXJuCi0gCTAgd2hlbiBub3RoaW5nIHBlbmRpbmcuCi0KLQkqIHJ1bi5jIChzaW1fc2l6ZSwgc2ltX3RyYWNlKTogUGxpY2F0ZSBHQ0MgLSB0aGVzZSB0d28gZnVuY3Rpb25zCi0gCXdpbGwgc29vbiBiZSBnb2luZyBhd2F5LgotCShnZXRvcHQpOiBQbGljYXRlIEdDQy4KLQotCSogc2ltLWVuZGlhbi5jIChzaW0taW8uaCk6IFBsaWNhdGUgR0NDLgotCSogc2ltLWJpdHMuYyAoc2ltLWlvLmgpOiBEaXR0by4KLQkqIHNpbS1uLWJpdHMuaCAoUk9Ubik6IERpdHRvLgotCi0JKiBzaW0taW8uYyAoc2ltX2lvX2Vycm9yKTogQ29ycmVjdCBjaGVjayBmb3IgTlVMTC4KLQotCSogc2ltLWFzc2VydC5oIChTSU1fRklMVEVSX1BBVEgpOiBTZXBhcmF0ZSBvdXQgdGhlIGNvZGUgZmlsdGVyaW5nCi0gCXRoZSBfX0ZJTEVfXy4KLQkqIHNpbS1ldmVudHMuYzogVXNlIFNJTV9GSUxURVJfUEFUSCB0byBmaWx0ZXIgb3V0IHRoZSBmaWxlbmFtZQotIAlwYXRoLgotCi1XZWQgTWFyIDE5IDAxOjEyOjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OXyo6IE1vdmUgc28gdGhhdCB0aGV5IGFyZSBvdXRzaWRlIG9mCi0gCVNJTV9BQ19DT01NT04gLSBTSU1fQUNfQ09NTU9OIHdhcyBnb2JsaW5nIGFyZ3VtZW50cy4KLQotVHVlIE1hciAxOCAyMDo0ODoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWFsdS5oOiBJbmNsdWRlIHNpbS14Y2F0LmguCi0JCi1UdWUgTWFyIDE4IDEzOjU4OjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWJpdHMuYywgc2ltLWNvcmUuYywgc2ltLWVuZGlhbi5jLAotIAlzaW0tZXZlbnRzLmMsIHNpbS1pbmxpbmUuYywgc2ltLWlvLmMpOiBEZWZpbmUgcnVsZXMgZm9yIGJ1aWxkaW5nCi0gCXRoZXNlLgotCi0JKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfYXRfbGFyZ2VfaW50KTogTmV3IGZ1bmN0aW9uLiAgSnVzdAotIAlzY2hlZHVsZXMgYW4gZXZlbnQgZXZlcnkgbGFyZ2UtaW50IHRpY2tzLgotCShzaW1fZXZlbnRzX2luaXQpOiBDYWxsLgotCShzaW1fZXZlbnRzX3RpY2ssIHNpbV9ldmVudHNfcHJvY2Vzcyk6IE1vdmUgYXN5bmMgaGFuZGluZyB0bwotIAlzaW1fZXZlbnRzX3Byb2Nlc3MuICBNb3ZlIHRpbWVyIGRlY3JlbWVudCBzbyB0aGF0IGl0IG9jY3VyZXMgYWZ0ZXIKLSAJZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0JCi0JKiBzaW0tYmFzaWNzLmggKHN0cnVjdCBfZW5naW5lKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCi0JKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYzogUmVuYW1lIHR5cGUgdG8gc2ltX2V2ZW50cy4gIFByZWZpeAotIAlldmVyeXRoaW5nIHdpdGggc2FtZS4gIFJlbmFtZSBnbG9iYWwgc3RydWN0IHRvIFNJTV9ERVNDLgotCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYywgc2ltLW4tY29yZS5jOiBEaXR0byBmb3Igc2ltX2NvcmUuCi0JKiBzaW0taW8uaCwgc2ltLWlvLmM6IERpdHRvLgotCQotCSogc2ltLWFzc2VydC5oOiBOZXcgZmlsZS4gT3B0aW9uYWwgYXNzZXJ0aW9uIGNoZWNraW5nIG1hY3Jvcy4KLQkqIHNpbS1pby5jIChzaW1faW9fZXJyb3IpOiBNYWtlIGp1c3QgdGhpcyBmdW5jdGlvbiB0b2xlcmFudCB0bwotIAludWxsIHBvaW50ZXJzLgotCQotCSogc2ltLXhjYXQuaDogTmV3IGZpbGUuIERlZmluZSBjb25jYXRlbmF0ZSBtYWNyb3MuCi0JKiBzaW0tYmFzaWNzLmggKFhDT05DQVQqKTogTW92ZSB0byBzaW0teGNhdC5oLgotCSogc2ltLW4tY29yZS5oLCBzaW0tbi1iaXRzLmgsIHNpbS1uLWVuZGlhbi5oOiBFeHBsaWNpdGx5IGluY2x1ZGUKLSAJY29uY2F0IG1hY3Jvcy4KLQkKLQotVHVlIE1hciAxOCAxMjo0NDo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWJpdHMuaCAoTFNNQVNLKTogTmV3IG1hY3JvLiBDcmVhdGUgbWFzayBvZiBMUyBiaXRzLgotCi1Nb24gTWFyIDE3IDE4OjEwOjA1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBzaW0taW5saW5lLmg6IEFkZCBkZWZpbml0aW9ucyBmb3Igc2ltLXR5cGVzLgotCShBTExfQllfTU9EVUxFKTogTmV3IG1hY3JvLCBlbmNhcHN1bGF0ZSBmdWxsIGlubGluaW5nIGJ5IHRoZQotIAltb2R1bGUuCi0KLU1vbiBNYXIgMTcgMTU6Mzg6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0JCi0JKiBzaW0tZXZlbnRzLmg6IFJlbW92ZSBkZWZ1bmN0IHJlZmVyZW5jZSB0byBjYWxsYmFjayBzdHJ1Y3QuCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLU1vbiBNYXIgMTcgMTU6MDQ6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChDU0VBUkNIKTogRG8gbm90IGluY2x1ZGUgdGhlIGdkYiBkaXJlY3RvcnkgaW4KLSAJdGhlIHNlYXJjaCBwYXRoLgotCi1Nb24gTWFyIDE3IDEzOjE2OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0VORElBTiwgU0lNX0hPU1RFTkRJQU4sIFNJTV9JTkxJTkUsCi0gCVNJTV9XQVJOSU5HKTogRHJvcCwgcmVxdWlyaW5nIHRoZSBzaW11bGF0b3Igc3BlY2lmaWMgTWFrZWZpbGUuaW4KLSAJdG8gZXhwbGljaXRseSBpbmNvcnBvcmF0ZSB0aGVzZS4KLQotCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLWFsaWdubWVudCk7IE5ldyBvcHRpb24uIFN0cm9uZ2x5Ci0gCXNwZWNpZnkgdGhlIGFsaWdubWVudCByZXN0cmljdGlvbnMgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgLQotIAl3aXRob3V0IHRoaXMgb3B0aW9uIGFsbCBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSBhY2NvbW9kYXRlZC4KLSAJKC0tZW5hYmxlLXNpbS1hc3NlcnQpOiBOZXcgb3B0aW9uLiAgQ29uZGl0aW9uYWxseSBjb21waWxlIGluCi0gCWFzc2VydGlvbiBzdGF0ZW1lbnRzLgotCSgtLWVuYWJsZS1zaW0tZmxvYXQpOiBOZXcgb3B0aW9uLiBTdHJvbmdseSBzcGVjaWZ5IHRoZSB0YXJnZXQncwotIAlmbG9hdGluZyBwb2ludCBzdXBwb3J0LgotCSgtLWVuYWJsZS1zaW0taGFyZHdhcmUpOiBOZXcgb3B0aW9uLiAgU3BlY2lmeSB0aGUgaGFyZHdhcmUgZGV2aWNlcwotIAlpbmNsdWRlZCBpbiB0aGUgc2ltdWxhdGlvbi4KLQkoLS1lbmFibGUtc2ltLXBhY2thZ2VzKTogTmV3IG9wdGlvbi4gIFNwZWNpZnkgdGhlIGhhcmR3YXJlCi0gCXBhY2thZ2VzIGluY2x1ZGVkIGluIHRoZSBzaW11bGF0aW9uLgotCSgtLWVuYWJsZS1zaW0tcmVncGFybSk6IE5ldyBvcHRpb24uICBTcGVjaWZ5IHRoYXQgcGFyYW1ldGVycyBiZQotIAlwYXNzZWQgaW4gcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb24gdGhlIHN0YWNrLgotCSgtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyk6IE5ldyBvcHRpb24uIFNwZWNpZnkgdGhhdCByZXNlcnZlZAotIAliaXRzIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiBhcmUgYXJlIGNvcnJlY3RseSBzZXQuCi0JKC0tZW5hYmxlLXNpbS1zbXApOiBOZXcgb3B0aW9uLiBTcGVjaWZ5IHRoZSBsZXZlbCBvZiBTTVAgc3VwcG9ydAotIAl0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2ltdWxhdG9yLgotCSgtLWVuYWJsZS1zaW0tc3RkY2FsbCk6IE5ldyBvcHRpb24uICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlCi0gCWZ1bmN0aW9uIGNhbGwgY29udmVudGlvbi4KLQkoLS1lbmFibGUtc2ltLXhvci1lbmRpYW4pOiBOZXcgb3B0aW9uLiAgQ29uZmlndXJlIHhvci1lbmRpYW4KLSAJc3VwcG9ydCB1c2VkIGJ5IHNvbWUgdGFyZ2V0cyB0byBpbXBsZW1lbnQgYmktZW5kaWFuIHN1cHBvcnQuCi0JCi1GcmkgTWFyIDE0IDE5OjUxOjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00ICgtLWVuYWJsZS1zaW0taG9zdGVuZGlhbik6IE5ldyBvcHRpb24uICBBbGxvdyB0aGUKLSAJaG9zdCBlbmRpYW5uZXNzIHRvIGJlIG92ZXJyaWRkZW4uCi0JKC0tZW5hYmxlLXNpbS1lbmRpYW4pOiBBbGxvdyB0aGUgdGFyZ2V0IHBsYXRmb3JtJ3MgYnl0ZSBvcmRlcgotCXRvIGJlIG92ZXJyaWRkZW4uCi0JKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBDb250cm9sIHRoZSBpbmxpbmluZyBvZiBjb21tb24gY29tcG9uZW50cy4KLQkoLS1lbmFibGUtc2ltLWJzd2FwKTogRm9yIGNvbXBhdGliaWxpdHksIGFsc28gZGVmaW5lIFdJVEhfQlNXQVAuCi0JKC0tZW5hYmxlLXNpbS13YXJuaW5ncyk6IEVuYWJsZSBhZGRpdGlvbmFsIEdDQyBjb21waWxlciBjaGVja3MuCi0JKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0VORElBTiwgU0lNX0hPU1RFTkRJQU4sIFNJTV9JTkxJTkUsCi0JU0lNX1dBUk5JTkdTKTogQWRkLgotCQotCSogc2ltLW4tY29yZS5oLCBzaW0tbi1iaXRzLmgsIHNpbS1uLWVuZGlhbi5oOiBSZW5hbWUgZnJvbQotIAlzaW0tKi1uLmggc28gdGhhdCB0aGUgbmFtZXMgYXJlIHVuaXEgb24gZG9zIG1hY2hpbmVzCi0JKiBzaW0tY29yZS5jLCBzaW0tYml0cy5jLCBzaW0tZW5kaWFuLmM6IFVwZGF0ZS4KLQkKLVRodSBNYXIgMTMgMTI6MzI6NDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcnVuLmM6ICNpbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKG1haW4pOiBOZXcgbG9jYWxzIHNkLG5vX2FyZ3Msc2ltX2FyZ3YuCi0JUnVuIGJ1aWxkYXJndiBvbiAtYSBvcHRpb24uICBQYXNzIGFyZ3YgdG8gc2ltX29wZW4sIGFyZ3ZbMF0KLQlpcyBwcm9ncmFtIG5hbWUuICBVcGRhdGUgY2FsbCB0byBzaW1fc2V0X2NhbGxiYWNrcy4KLQlSZWNvcmQgcmVzdWx0IG9mIHNpbV9vcGVuLCBwYXNzIHRvIG90aGVyIHNpbV9mb28gcm91dGluZXMuCi0KLVRodSBNYXIgMTMgMTA6MjQ6MDUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmMgKG9zX3ByaW50Zl9maWx0ZXJlZCk6IERvIG5vdCBjYWxsIGV4aXQoMSkgb3IgcHJpbnQgYQotCWZpbmFsIG5ld2xpbmUuCi0KLVRodSBNYXIgIDYgMTU6NTA6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmM6IEFkZCBvc19mbHVzaF9zdGRvdXQgYW5kIHZwcmludGZfZmlsdGVyZWQgY2FsbGJhY2tzLgotICAJUm91dGUgc3Rkb3V0IHRocm91Z2ggYnVmZmVyZWQgSU8uCi0KLQkqIGNhbGxiYWNrLmM6IEFkZCBvc19mbHVzaF9zdGRlcnIsIG9zX3dyaXRlX3N0ZGVyciwKLSAJb3NfZXZwcmludGZfZmlsdGVyZWQgZnVuY3Rpb25zIHRvIHJvdXRlIGVycm9yIG91dHB1dCB0aHJvdWdoCi0gCXN0ZGVyci4KLQkKLQkqIHNpbS1pby5oLCBzaW0taW8uYyAoc2ltX2lvX2ZsdXNoX3N0ZGVyciwgc2ltX2lvX2ZsdXNoX3N0ZG91dCk6Ci0gCUNvcnJlY3QgcmV0dXJuIHR5cGUgLSBzaG91bGQgYmUgdm9pZC4KLQotRnJpIE1hciAgNyAyMDoxNDozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWJhc2ljcy5oOiBDbGVhbiB1cC4gIE1hbnkgbWFjcm8ncyBtb3ZlZCB0byBzaW0taW5saW5lLmguCi0KLQkqIHNpbS1jb25maWcuaDogRGl0dG8uICBGb3Igc29tZSBvcHRpb25zIC0gZWcgV0lUSF9ERVZJQ0VTIC0gZG8KLSAJbm90IHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlIGFzIHVuZGVmaW5lZCBpbmRpY2F0ZXMgZGlzYWJsZSBjb2RlLgotCi1UaHUgTWFyICA2IDE1OjUwOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBzaW0tY29yZS5oLCBzaW0tY29yZS1uLmgsIHNpbS1jb3JlLmM6IEJvcnJvdyBjb2RlIGZyb20gcHBjCi0gCWRpcmVjdG9yeS4KLQkqIHNpbS1ldmVudHMuaCwgc2ltLWV2ZW50cy5jOiBEaXR0by4KLQkqIHNpbS1pby5oLCBzaW0taW8uYzogRGl0dG8uCi0JCi1UdWUgTWFyICA0IDA5OjM1OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCQotCSogc2ltLWFsdS5oIChBTFVfU1VCX0NBLCBBTFUqX1NVQl9DQSk6IE5ldyBhbHUgb3BlcmF0aW9uLgotCi0JKiBzaW0tYml0cy5oLCBzaW0tYml0cy1uLmgsIHNpbS1iaXRzLmMgKExTTUFTS0VEKik6IE5ldyBtYWNybydzCi0gCWV4dHJhY3QgdGhlIHRhaWwgb3IgbGVhc3Qgc2lnbmlmaWFudCBiaXRzIGZyb20gYW4gaW50ZWdlciBvZiB0aGUKLSAJc3BlY2lmaWVkIHNpemUuCi0JCi0JKiBzaW0tYml0cy5oLCBzaW0tYml0cy5jOiBDbGVhbiB1cCBjb25kaXRpb25hbGx5IGNvbXBpbGVkICNpZgotIAlXSVRIX1RBUkdFVF9CSVRTSVpFIHNvIHRoYXQgdGhlIGNvbXBpbGF0aW9uIHdpbGwgZmFpbCB3aGVuIGFuCi0gCXVuc3VwcG9ydGVkIGJpdHNpemUgdmFsdWUgaXMgZGVmaW5lZC4KLQotCShJTlNFUlRFRCopOiBDb252ZXJ0IHRvIGZ1bmN0aW9ucy4KLQkoRVhUUkFDVEVEKik6IERpdHRvLgotCQotCShTSUdOX0VYVEVORCwgU0VYVCk6IENoYW5nZSB0byBtb3JlIHRlcnNlIG5hbWUuCi0JCi1UdWUgTWFyICA0IDA5OjM1OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBzaW0taW5saW5lLmg6IEFsbG93IGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB3aGljaCAuYyBmaWxlcyB3aWxsIGJlCi0gCWluY2x1ZGVkIGJ5IHRoZWlyIGhlYWRlci4KLQotCSogc2ltLWlubGluZS5oOiBBbGxvdyBleHBsaWNpdCBjb250cm9sIG92ZXIgd2hpY2ggLmMgZmlsZXMgdXNlIHRoZQotIAlhbHRlcm5hdGl2ZSAtIFJFR1BBUk0gLSBwYXJhbWV0ZXIgcGFzc2luZyBtZWNoYW5pc20uCi0JCi0JKiBzaW0taW5saW5lLmgsIHNpbS1pbmxpbmUuYzogRG9uJ3QgYXR0ZW1wdCB0byBpbmNsdWRlIGFueSBvZgotIAlpY2FjaGUuYywgaWRlY29kZS5jLCBzZW1hbnRpY3MuYyBvciBzdXBwb3J0LmMuICBUaG9zZSBuYW1lcyBhcmUKLSAJbm90IGdlbmVyYWxseSBhcHBsaWNhYmxlLgotCQotVGh1IEZlYiAyNyAxMDoxNzoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWJpdHMuYywgc2ltLWJpdHMtbi5oIChuZXcpOiBTcGxpdCBzaW0tYml0cy5jIGludG8gdHdvIHBhcnRzCi0gCWluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIHNpbS1lbmRpYW4tbi4KLQotCSogc2ltLWVuZGlhbi5oOiAoSF93b3JkLCBMX3dvcmQsIEFMXyosIFZMXyopOiBFeHRlbmQgdG8gaW5jbHVkZQotIAlib3RoIHZhbHVlIGFuZCBhZGRyZXNzIG1hY3JvJ3MuCi0KLVR1ZSBGZWIgMjUgMTg6NTE6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHNpbS1hbHUuaCAoQUxVMTZfQkVHSU4sIEFMVTE2X1NFVCwgLi4uKTogRmlsbCBpbi4KLQotCSogc2ltLWVuZGlhbi5oIChMX3dvcmQsIEhfd29yZCk6IFJlcGxhY2UgTVMyV180LCBMUzJXXzQgd2l0aCBtb3JlCi0gCWdlbmVyaWMgTF93b3JkLCBIX3dvcmQgbWFjcm8ncy4KLQotVGh1IEZlYiAyMCAxODozNjo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1iYXNpY3MuaDogQm9ycm93IGNvZGUgZnJvbSBwcGMgZGlyZWN0b3J5LgotCSogc2ltLWJpdHMuYzogRGl0dG8uCi0JKiBzaW0tYml0cy5oOiBEaXR0by4KLQkqIHNpbS1jb25maWcuaDogRGl0dG8uCi0JKiBzaW0tZW5kaWFuLW4uaDogRGl0dG8uCi0JKiBzaW0tZW5kaWFuLmM6IERpdHRvLgotCSogc2ltLWVuZGlhbi5oOiBEaXR0by4KLQkqIHNpbS1pbmxpbmUuYzogRGl0dG8uCi0JKiBzaW0taW5saW5lLmg6IERpdHRvLgotCSogc2ltLXR5cGVzLmg6IERpdHRvLgotCi1XZWQgRmViIDE5IDEyOjQwOjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogc2ltLWFsdS5oIChBTFVfU0VUMTYsIEFMVV9TRVQzMiwgQUxVX1NFVDY0LCBldGMpOiBNYWtlIGF2YWlsYWJsZQotIAlhbGwgdGhlIEFMVSBzaXplIGFsdGVybmF0aXZlcyBhbmQgdGhlbiBhdXRvLWNvbmZpZ3VyZSBhIGRlZmF1bHQuCi0JCi0JKiBzaW0tYWx1Lmg6IENvcHkgcHBjL2lkZWNvZGVfZXhwcmVzc2lvbi5oLgotCi1Nb24gRmViIDE3IDEwOjQ0OjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogYml0cy5oLCBiaXRzLmMgKFNJR05fRVhURU5EMzIsIFNJR05fRVhURU5ENjQpOiBOZXcgZnVuY3Rpb25zLAotIAlzaWduIGV4dGVuZCBhIGJpdCB3aXRoaW4gYSB2YWx1ZS4KLQotCSogc2ltLWVuZGlhbi5oLCBzaW0tZW5kaWFuLW4uaCAob2Zmc2V0X04pOiBOZXcgZnVuY3Rpb25zIC0gcmV0dXJuCi0gCWEgcG9pbnRlciBpbnRvIHRoZSBtaWRkbGUgb2YgYSBob3N0IHdvcmQuCi0JKiBzaW0tZW5kaWFuLmggKE1TMldfNCwgTFMyV180KTogVXNlIHRoaXMgZnVuY3Rpb24uCi0JCi1UdWUgRmViIDExIDEzOjQ2OjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suYzogSWYgSEFWRV9DT05GSUdfSCBpcyBkZWZpbmVkLCBpbmNsdWRlIGNvbmZpZy5oIGZyb20KLQlhdXRvY29uZi4gIElmIEhBVkVfVU5JU1REX0ggaXMgZGVmaW5lZCwgaW5jbHVkZSB1bmlzdGQuaCB0byBnZXQKLQlhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiByZWFkLCB3cml0ZSwgZXRjLiAgQWRkIHByb3RvdHlwZSBmb3IKLQlzeXN0ZW0uCi0KLVR1ZSBGZWIgIDQgMTM6MjQ6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxpYmNvbW1vbi5hKTogRGVsZXRlLgotCShjYWxsYmFjay5vLHRhcmctbWFwLm8pOiBEZWxldGUsIG1vdmVkIHRvIE1ha2UtY29tbW9uLmluLgotCShnZW50bWFwLHRhcmctdmFscy5oLHRhcmctbWFwLmMpOiBMaWtld2lzZS4KLQkocnVuLWF1dG9jb25mKTogRGVsZXRlLgotCSogYWNsb2NhbC5tNCAoU0lNX0FDX09VVFBVVCk6IFJlZG8gY3JlYXRpb24gb2YgTWFrZWZpbGUuCi0JKGNvbW1vbiBtYWtlZmlsZSBmcmFnbWVudCk6IE1vdmVkIGJhY2sgaW50byAuLi4KLQkqIE1ha2UtY29tbW9uLmluOiBSZXN1cnJlY3QuCi0JKiBjb25maWd1cmUuaW4gKEFDX0xJTktfRklMRVMpOiBEZWxldGUsIHVubmVjZXNzYXJ5IG5vdy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMzEgMDc6MTY6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoU0lNX0FDX0NPTU1PTik6IE1vdmUgQ09NTU9OX01BS0VGSUxFX0ZSQUcgZnJvbSBoZXJlLgotCShTSU1fQUNfT1VUUFVUKTogVG8gaGVyZS4KLQotRnJpIEphbiAyNCAxMDozNzoxNyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00IChDT01NT05fTUFLRUZJTEVfRlJBRyk6ICBRdW90ZSBhIGNvdXBsZSBvZiAkJ3MgaW4KLQljb21tZW50cyBhbmQgc2luZ2xlIHF1b3Rlcy4gIEZpeGVzIGEgcHJvYmxlbSBmb3VuZCBvbiBocHV4LgotCi1UaHUgSmFuIDIzIDEzOjM1OjAzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQ6ICBSZW1vdmUgTWFrZS1jb21tb24uaW4gZnJvbSBkZXBlbmRlbmNpZXMuCi0JKiAoZGlzdGNsZWFuKTogIFJlbW92ZSB0YXJnLXZhbHMuZGVmLgotCi0JKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogIE1vdmUgY29udGVudHMgb2YgTWFrZS1jb21tb24uaW4KLQlpbnRvIGhlcmUuICBNYWtlcyBpbnNlcnRpb24gaW50byBtYWtlZmlsZXMgZWFzaWVyLiAgQWxzbywgY2hhbmdlCi0JdGhlIHdheSB0aGF0IGNhbGxiYWNrLm8sIGdlbnRtYXAsIHRhcmctdmFscy5oLCB0YXJnLW1hcC5jLAotCXRhcmctbWFwLm8sIGFuZCBydW4gYXJlIGJ1aWx0LiAgVGhleSBhcmUgbm93IGJ1aWx0IGluIHRoZQotCWluZGl2aWR1YWwgc2ltdWxhdG9yIGRpcmVjdG9yaWVzLCB0YWtpbmcgc291cmNlcyBmcm9tIC4uL2NvbW1vbiBhcwotCW5lY2Vzc2FyeS4gIFRoaXMgcmVwbGFjZXMgdGhlIG1lcmdpbmcgb2YgbGliY29tbW9uLmEgaW50bwotCWxpbnNpbS5hLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgZm9yIHRoZSBXaW5HREIgYnVpbGQgcHJvY2Vzcy4KLQkqIHJ1bi5jOiAgSW5jbHVkZSBjb25maWcuaCBmcm9tIC4gaW5zdGVhZCBvZiAuLi9jb21tb24uCi0JKiBNYWtlLWNvbW1vbi5pbjogIFJlbW92ZS4gIEl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KLQotTW9uIERlYyAxNiAxNTowMjozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChBTExfQ0xBR1MpOiBQdXQgQ0ZMQUdTIGF0IHRoZSBlbmQuCi0JKC5jLm8pOiBQdXQgJChBTExfQ0ZMQUdTKSBiZWZvcmUgdGhlIGZpbGUgYmVpbmcgY29tcGlsZWQuCi0KLVdlZCBEZWMgMTEgMTE6MzA6NTggMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBydW4uYyAobWFpbik6IFNldCB0YXJnZXRfYnl0ZV9vcmRlciBiZWZvcmUgY2FsbCB0byBzaW1fb3Blbi4KLQotU3VuIERlYyAgOCAxODoyMjowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5jOiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0JKG9zX2Vycm9yKTogTmV3IGZ1bmN0aW9uLgotCShkZWZhdWx0X2NhbGxiYWNrKTogQWRkIG9zX2Vycm9yLgotCi1Nb24gTm92IDI1IDE5OjQ0OjM1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2UtY29tbW9uLmluIChNYWtlZmlsZSk6IFNldCBDT05GSUdfSEVBREVSUz0iIi4KLQkqIGFjbG9jYWwubTQ6IE1hcmsgdGhlIGZhY3QgdGhhdCAtLWVuYWJsZS1zaW0tYnN3YXAgaXNuJ3QgaG9zdAotCXNwZWNpZmljLgotCShTSU1fQUNfT1VUUFVUKTogRG9uJ3QgYnVpbGQgTWFrZWZpbGUgaWYgQ09ORklHX0ZJTEVTPSIiLgotCi1XZWQgTm92IDIwIDAxOjExOjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jOiAjaW5jbHVkZSAuLi9jb21tb24vY29uZmlnLmgsIHRjb25maWcuaC4KLQkobXluYW1lKTogTmV3IHN0YXRpYyBnbG9iYWwuCi0JKG1haW4pOiBSZWNvZ25pemUgbmV3IG9wdGlvbnMgLWEsIC1jLiAgQWxzbyByZWNvZ25pemUgLWggaWYgaDgvMzAwLgotCU9ubHkgcHJvY2VzcyAtYyBpZmRlZiBTSU1fSEFWRV9TSU1DQUNIRS4KLQlPbmx5IHByb2Nlc3MgLXAvLXMgaWZkZWYgU0lNX0hBVkVfUFJPRklMRS4KLQlQYXJzZSBwcm9ncmFtIG5hbWUgZnJvbSBhcmd2WzBdIGFuZCB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCi0JUGFzcyBzaW1fYXJncyB0byBzaW1fb3Blbi4gIFBhc3MgcHJvZ19hcmdzIHRvIHNpbV9jcmVhdGVfaW5mZXJpb3IuCi0JQWRkIHN1cHBvcnQgZm9yIGluY29tcGxldGUgaDgvMzAwIHRlcm1pbmF0aW9uIGluZGljYXRvcnMuCi0JKHVzYWdlKTogTWFrZSBtb3JlIHZlcmJvc2UuCi0JKiBhY2xvY2FsLm00LGNvbmZpZy5pbix0Y29uZmlnLmluLGNvbmZpZ3VyZS5pbixjb25maWd1cmU6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluLE1ha2UtY29tbW9uLmluLGNhbGxiYWNrLmM6IE5ldyBmaWxlcy4KLQkqIG5sdHZhbHMuZGVmLGdlbnRtYXAuYyxnZW50dmFscy5zaDogTmV3IGZpbGVzLgotCi1UdWUgTm92IDEyIDEzOjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4gICAKLQotCSogcnVuLmM6IEluY2x1ZGUgc3RkYXJnLmggaWYgX19TVERDX18uCi0KLVR1ZSBPY3QgMTUgMTE6MTY6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBydW4uYyAobWFpbik6IERvbid0IHByaW50IG91dCBhbnl0aGluZyBpZiB0aGUgc2lnbmFsCi0JbnVtYmVyIGlzIHplcm8gKGllIG5vIHNpZ25hbCkuCi0KLVR1ZSBPY3QgMTUgMTE6MjA6NDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBydW4uYyAobWFpbik6IFByaW50IG91dCBpZiB0aGUgcHJvZ3JhbSByYWlzZWQgYSBzaWduYWwuCi0KLVdlZCBTZXAgMTggMDk6NTI6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBydW4uYyAoZXhlY19iZmQpOiBSZW5hbWUgZnJvbSBzaW1fYmZkLCB0byB1c2UgdGhlIGdkYiBuYW1lLgotCShtYWluKTogRGl0dG8uCi0KLVR1ZSBTZXAgMTcgMTE6MDQ6NTAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBydW4uYyAobWFpbik6IEV4cGxpY2l0bHkgY2FzdCBtYWxsb2MoKSBwYXJhbWV0ZXIuCi0KLVRodSBTZXAgMTIgMTE6Mjc6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBydW4uYyAoc2ltX2JmZCk6IE5ldyBnbG9iYWwgdG8gaG9sZCB0aGUgYmZkIHBvaW50ZXIgZm9yIHRoZQotCWV4ZWN1dGFibGUuCi0JKG1haW4pOiBJbml0aWFsaXplIHNpbV9iZmQuCi0KLUZyaSBEZWMgMTUgMTY6Mjc6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBydW4uYyAobWFpbik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLVdlZCBOb3YgIDggMTU6NDk6NDkgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIHJ1bi5jIChtYWluKTogUmVtb3ZlZCBTSCBzcGVjaWZpYyBjb21tZW50cywgc28gc291cmNlIGlzCi0gCWdlbmVyaWMuIEFsc28gdXBkYXRlZCB0byBvbmx5IGxvYWQgcmVsZXZhbnQgc2VjdGlvbnMuIE1vdmVkCi0gCXNpbV9vcGVuKCkgdG8gYWZ0ZXIgY2FsbGJhY2sgYXR0YWNoICh0byBtYXRjaCBHREIpLgotCi0gIAkqIHJ1bi4xOiBSZW1vdmVkIFNIIHNwZWNpZmljIGNvbW1lbnRzLgotCi1TYXQgT2N0IDIxIDEyOjMxOjAxIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogcnVuLmMgKG1haW4pOiBBbHdheXMgcmV0dXJuIHNpZ3JjIGF0IGVuZC4KLQotVHVlIE9jdCAxMCAxMjowMzoxMyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jIChtYWluKTogUHJpbnQgZXJyb3IgZGlhZ25vc3RpYyBhbmQgZXhpdCBpZiBiZmRfb3BlbnIoKSBvcgotCWJmZF9jaGVja19mb3JtYXQoKSBmYWlscy4KLQotVGh1IFNlcCAyOCAxNTo0MDozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBydW4uYywgcnVuLjE6IEZyb20gc2ggZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiBiL3NpbS9jb21tb24vTWFrZS1jb21tb24uaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjVkNmMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9NYWtlLWNvbW1vbi5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY1NyArMCwwIEBACi0jIE1ha2VmaWxlIGZyYWdtZW50IGZvciBjb21tb24gcGFydHMgb2YgYWxsIHNpbXVsYXRvcnMuCi0jIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFRoaXMgTWFrZWZpbGUgZnJhZ21lbnQgY29uc2lzdHMgb2YgdHdvIHNlcGFyYXRlIHBhcnRzLgotIyBUaGV5IGFyZSBtZXJnZWQgaW50byB0aGUgZmluYWwgTWFrZWZpbGUgYXQgcG9pbnRzIGRlbm90ZWQgYnkKLSMgIiMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUciIGFuZCAiIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUciLgotIwotIyBUaGUgdGFyZ2V0IE1ha2VmaWxlIHNob3VsZCBsb29rIGxpa2U6Ci0jCi0jPiMgQ29weXJpZ2h0IGJsYWggYmxhaAotIz4KLSM+IyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotIz4KLSM+IyBBbnkgb3ZlcnJpZGVzIG5lY2Vzc2FyeSBmb3IgdGhlIFNJTV9GT08gY29uZmlnIHZhcnMuCi0jPlNJTV9GT08gPSAuLi4KLSM+Ci0jPiMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0jPgotIz4jIFJ1bGVzIHRvIGJ1aWxkIHRhcmdldCBzcGVjaWZpYyAubydzLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLVZQQVRIID0gQHNyY2RpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zcmNjb20gPSAkKHNyY2RpcikvLi4vY29tbW9uCi1zcmNyb290ID0gJChzcmNkaXIpLy4uLy4uCi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWJpbmRpciA9IEBiaW5kaXJACi0KLWxpYmRpciA9IEBsaWJkaXJACi10b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQotCi1kYXRhZGlyID0gQGRhdGFkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1pbmZvZGlyID0gQGluZm9kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi0KLSMgVGhpcyBjYW4gYmUgcmVmZXJlbmNlZCBieSB0aGUgZ2V0dGV4dCBjb25maWd1cmF0aW9uIGNvZGUuCi10b3BfYnVpbGRkaXIgPSAuLgotCi1FWEVFWFQgPSBARVhFRVhUQAotU0hFTEwgPSBAU0hFTExACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotCi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DRkxBR1MgPSBAQ0ZMQUdTQAotU0lNX0JTV0FQID0gQHNpbV9ic3dhcEAKLVNJTV9DRkxBR1MgPSBAc2ltX2NmbGFnc0AKLVNJTV9ERUJVRyA9IEBzaW1fZGVidWdACi1TSU1fVFJBQ0UgPSBAc2ltX3RyYWNlQAotU0lNX1BST0ZJTEUgPSBAc2ltX3Byb2ZpbGVACi0KLVNJTV9BU1NFUlQgPSBAc2ltX2Fzc2VydEAKLVNJTV9BTElHTk1FTlQgPSBAc2ltX2FsaWdubWVudEAKLVNJTV9CSVRTSVpFID0gQHNpbV9iaXRzaXplQAotU0lNX0RFRkFVTFRfTU9ERUwgPSBAc2ltX2RlZmF1bHRfbW9kZWxACi1TSU1fRU5ESUFOID0gQHNpbV9lbmRpYW5ACi1TSU1fRU5WSVJPTk1FTlQgPSBAc2ltX2Vudmlyb25tZW50QAotU0lNX0ZMT0FUID0gQHNpbV9mbG9hdEAKLVNJTV9IV19DRkxBR1MgPSBAc2ltX2h3X2NmbGFnc0AKLVNJTV9IV19PQkpTID0gQHNpbV9od19vYmpzQAotU0lNX0hXID0gQHNpbV9od0AKLVNJTV9IT1NURU5ESUFOID0gQHNpbV9ob3N0ZW5kaWFuQAotU0lNX0lOTElORSA9IEBzaW1faW5saW5lQAotU0lNX1BBQ0tBR0VTID0gQHNpbV9wYWNrYWdlc0AKLVNJTV9SRUdQQVJNID0gQHNpbV9yZWdwYXJtQAotU0lNX1JFU0VSVkVEX0JJVFMgPSBAc2ltX3Jlc2VydmVkX2JpdHNACi1TSU1fU0NBQ0hFID0gQHNpbV9zY2FjaGVACi1TSU1fU01QID0gQHNpbV9zbXBACi1TSU1fU1REQ0FMTCA9IEBzaW1fc3RkY2FsbEAKLVNJTV9YT1JfRU5ESUFOID0gQHNpbV94b3JfZW5kaWFuQAotV0FSTl9DRkxBR1MgPSBAV0FSTl9DRkxBR1NACi1XRVJST1JfQ0ZMQUdTID0gQFdFUlJPUl9DRkxBR1NACi1TSU1fV0FSTl9DRkxBR1MgPSAkKFdBUk5fQ0ZMQUdTKQotU0lNX1dFUlJPUl9DRkxBR1MgPSAkKFdFUlJPUl9DRkxBR1MpCi0KLUhERUZJTkVTID0gQEhERUZJTkVTQAotVERFRklORVMgPQotCi1BUiA9IEBBUkAKLUFSX0ZMQUdTID0gcmMKLVJBTkxJQiA9IEBSQU5MSUJACi1NQUtFSU5GTyA9IG1ha2VpbmZvCi0KLURFUCA9ICQoc3Jjcm9vdCkvbWtkZXAKLQotIyBFYWNoIHNpbXVsYXRvcidzIE1ha2VmaWxlLmluIGRlZmluZXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgdmFyaWFibGVzCi0jIHRvIG92ZXJyaWRlIG91ciBzZXR0aW5ncyBhcyBuZWNlc3NhcnkuICBUaGVyZSBpcyBubyBuZWVkIHRvIGRlZmluZSB0aGVzZQotIyBpbiB0aGUgc2ltdWxhdG9yJ3MgTWFrZWZpbGUuaW4gaWYgb25lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgSW4gZmFjdAotIyBpdCdzIHByZWZlcmFibGUgbm90IHRvLgotCi0jIExpc3Qgb2Ygb2JqZWN0IGZpbGVzLCBsZXNzIGNvbW1vbiBwYXJ0cy4KLVNJTV9PQkpTID0KLSMgTGlzdCBvZiBleHRyYSBkZXBlbmRlbmNpZXMuCi0jIEdlbmVyYWxseSB0aGlzIGNvbnNpc3RzIG9mIHNpbXVsYXRvciBzcGVjaWZpYyBmaWxlcyBpbmNsdWRlZCBieSBzaW0tbWFpbi5oLgotU0lNX0VYVFJBX0RFUFMgPQotIyBMaXN0IG9mIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpLgotU0lNX0VYVFJBX0NGTEFHUyA9Ci0jIExpc3Qgb2YgZXh0cmEgbGlicmFyaWVzIHRvIGxpbmsgd2l0aC4KLVNJTV9FWFRSQV9MSUJTID0KLSMgTGlzdCBvZiBleHRyYSBwcm9ncmFtIGRlcGVuZGVuY2llcy4KLVNJTV9FWFRSQV9MSUJERVBTID0KLSMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCi1TSU1fUlVOX09CSlMgPSBydW4ubwotIyBEZXBlbmRlbmN5IG9mIGBhbGwnIHRvIGJ1aWxkIGFueSBleHRyYSBmaWxlcy4KLVNJTV9FWFRSQV9BTEwgPQotIyBEZXBlbmRlbmN5IG9mIGBpbnN0YWxsJyB0byBpbnN0YWxsIGFueSBleHRyYSBmaWxlcy4KLVNJTV9FWFRSQV9JTlNUQUxMID0KLSMgRGVwZW5kZW5jeSBvZiBgY2xlYW4nIHRvIGNsZWFuIGFueSBleHRyYSBmaWxlcy4KLVNJTV9FWFRSQV9DTEVBTiA9Ci0KLSMgRXZlcnkgdGltZSBhIG5ldyBnZW5lcmFsIHB1cnBvc2Ugc291cmNlIGZpbGUgd2FzIGFkZGVkIGV2ZXJ5IHRhcmdldCdzCi0jIE1ha2VmaWxlLmluIG5lZWRlZCB0byBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIGZpbGUgaW4gU0lNX09CSlMuCi0jIFRoaXMgZG9lc24ndCBzY2FsZS4KLSMgVGhpcyB2YXJpYWJsZSBzcGVjaWZpZXMgYWxsIHRoZSBnZW5lcmljIHN0dWZmIGNvbW1vbiB0byB0aGUgbmV3ZXIgc2ltdWxhdG9ycy4KLSMgVGhpbmdzIGxpa2Ugc2ltLXJlYXNvbi5vIGNhbid0IGdvIGhlcmUgYXMgdGhlIGNwdSBtYXkgcHJvdmlkZSBpdHMgb3duCi0jICh0aG91Z2ggaG9wZWZ1bGx5IGluIHRpbWUgdGhhdCB3b24ndCBiZSBzbykuICBUaGluZ3MgbGlrZSBzaW0tYml0cy5vIGNhbiBnbwotIyBoZXJlLiAgU29tZSBmaWxlcyBhcmUgdXNlZCBieSBhbGwgc2ltdWxhdG9ycyAoZS5nLiBjYWxsYmFjay5vKS4KLSMgVGhvc2UgZmlsZXMgYXJlIHNwZWNpZmllZCBpbiBMSUJfT0JKUyBiZWxvdy4KLQotU0lNX0NPTU1PTl9IV19PQkpTID0gXAotCWh3LWFsbG9jLm8gXAotCWh3LWJhc2UubyBcCi0JaHctZGV2aWNlLm8gXAotCWh3LWV2ZW50cy5vIFwKLQlody1oYW5kbGVzLm8gXAotCWh3LWluc3RhbmNlcy5vIFwKLQlody1wb3J0cy5vIFwKLQlody1wcm9wZXJ0aWVzLm8gXAotCWh3LXRyZWUubyBcCi0Jc2ltLWh3Lm8gXAotCi1TSU1fTkVXX0NPTU1PTl9PQkpTID0gXAotCXNpbS1hcmFuZ2UubyBcCi0Jc2ltLWJpdHMubyBcCi0Jc2ltLWJyZWFrLm8gXAotCXNpbS1jb25maWcubyBcCi0Jc2ltLWNvcmUubyBcCi0Jc2ltLWVuZGlhbi5vIFwKLQlzaW0tZXZlbnRzLm8gXAotCXNpbS1mcHUubyBcCi0Jc2ltLWlvLm8gXAotCXNpbS1pbmZvLm8gXAotCXNpbS1sb2FkLm8gXAotCXNpbS1tZW1vcHQubyBcCi0Jc2ltLW1vZHVsZS5vIFwKLQlzaW0tb3B0aW9ucy5vIFwKLQlzaW0tcHJvZmlsZS5vIFwKLQlzaW0tc2lnbmFsLm8gXAotCXNpbS10cmFjZS5vIFwKLQlzaW0tdXRpbHMubyBcCi0Jc2ltLXdhdGNoLm8gXAotCVwKLQkkKFNJTV9IV19PQkpTKSBcCi0KLSMgQWRkIHRoaXMgdG8gU0lNX0VYVFJBX0RFUFMuCi1DR0VOX0lOQ0xVREVfREVQUyA9IFwKLQkkKHNyY2NvbSkvY2dlbi1jcHUuaCBcCi0JJChzcmNjb20pL2NnZW4tZGVmcy5oIFwKLQkkKHNyY2NvbSkvY2dlbi1lbmdpbmUuaCBcCi0JJChzcmNjb20pL2NnZW4tc2NhY2hlLmggXAotCSQoc3JjY29tKS9jZ2VuLXNpbS5oIFwKLQkkKHNyY2NvbSkvY2dlbi10cmFjZS5oIFwKLQkkKHNyY2NvbSkvY2dlbi10eXBlcy5oIFwKLQkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZS9vcGNvZGUvY2dlbi5oCi0KLSMjIEVuZCBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLUNPTkZJR19DRkxBR1MgPSBcCi0JQERFRlNAIFwKLQkkKFNJTV9DRkxBR1MpIFwKLQkkKFNJTV9ERUJVRykgXAotCSQoU0lNX0RFRkFVTFRfTU9ERUwpIFwKLQkkKFNJTV9UUkFDRSkgXAotCSQoU0lNX1BST0ZJTEUpIFwKLQkkKFNJTV9CU1dBUCkgXAotCSQoU0lNX0FTU0VSVCkgXAotCSQoU0lNX0FMSUdOTUVOVCkgXAotCSQoU0lNX0JJVFNJWkUpIFwKLQkkKFNJTV9FTkRJQU4pIFwKLQkkKFNJTV9FTlZJUk9OTUVOVCkgXAotCSQoU0lNX0ZMT0FUKSBcCi0JJChTSU1fSFdfQ0ZMQUdTKSBcCi0JJChTSU1fSE9TVEVORElBTikgXAotCSQoU0lNX0lOTElORSkgXAotCSQoU0lNX1BBQ0tBR0VTKSBcCi0JJChTSU1fUkVHUEFSTSkgXAotCSQoU0lNX1JFU0VSVkVEX0JJVFMpIFwKLQkkKFNJTV9TQ0FDSEUpIFwKLQkkKFNJTV9TTVApIFwKLQkkKFNJTV9TVERDQUxMKSBcCi0JJChTSU1fV0FSTl9DRkxBR1MpIFwKLQkkKFNJTV9XRVJST1JfQ0ZMQUdTKSBcCi0JJChTSU1fWE9SX0VORElBTikgXAotCSQoU0lNX0hBUkRXQVJFKSBcCi0JJChTSU1fRVhUUkFfQ0ZMQUdTKSBcCi0JJChIREVGSU5FUykgJChUREVGSU5FUykKLUNTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkuLi9jb21tb24gLUkkKHNyY2NvbSkgXAotICAtSS4uLy4uL2luY2x1ZGUgLUkkKHNyY3Jvb3QpL2luY2x1ZGUgXAotICAtSS4uLy4uL2JmZCAtSSQoc3Jjcm9vdCkvYmZkIFwKLSAgLUkuLi8uLi9vcGNvZGVzIC1JJChzcmNyb290KS9vcGNvZGVzIFwKLSAgLUkuLi8uLi9pbnRsIC1JJChzcmNyb290KS9pbnRsCi1BTExfQ0ZMQUdTID0gJChDT05GSUdfQ0ZMQUdTKSAkKENTRUFSQ0gpICQoQ0ZMQUdTKQotQlVJTERfQ0ZMQUdTID0gLWcgLU8gJChDU0VBUkNIKQotCi1DT01NT05fREVQX0NGTEFHUyA9ICQoQ09ORklHX0NGTEFHUykgJChDU0VBUkNIKQotCi1MSUJJQkVSVFlfTElCID0gLi4vLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1CRkRfTElCID0gLi4vLi4vYmZkL2xpYmJmZC5hCi1PUENPREVTX0xJQiA9IC4uLy4uL29wY29kZXMvbGlib3Bjb2Rlcy5hCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExERVBTID0gQElOVExERVBTQAotQ09ORklHX0xJQlMgPSBATElCU0AKLUxJQkRFUFMgPSAkKEJGRF9MSUIpICQoT1BDT0RFU19MSUIpICQoSU5UTExJQlMpICQoTElCSUJFUlRZX0xJQikgXAotCSQoU0lNX0VYVFJBX0xJQkRFUFMpCi1FWFRSQV9MSUJTID0gJChCRkRfTElCKSAkKE9QQ09ERVNfTElCKSAkKElOVExMSUJTKSAkKExJQklCRVJUWV9MSUIpIFwKLQkkKENPTkZJR19MSUJTKSAkKFNJTV9FWFRSQV9MSUJTKQotCi1MSUJfT0JKUyA9IGNhbGxiYWNrLm8gc3lzY2FsbC5vIHRhcmctbWFwLm8gJChTSU1fT0JKUykKLQotUlVOVEVTVEZMQUdTID0KLQotYWxsOiAkKFNJTV9FWFRSQV9BTEwpIGxpYnNpbS5hIHJ1biAuZ2RiaW5pdAotCi1saWJzaW0uYTogJChMSUJfT0JKUykKLQlybSAtZiBsaWJzaW0uYQotCSQoQVIpICQoQVJfRkxBR1MpIGxpYnNpbS5hICQoTElCX09CSlMpCi0JJChSQU5MSUIpIGxpYnNpbS5hCi0KLXJ1bjogJChTSU1fUlVOX09CSlMpIGxpYnNpbS5hICQoTElCREVQUykKLQkkKENDKSAkKEFMTF9DRkxBR1MpIC1vIHJ1biQoRVhFRVhUKSBcCi0JICAkKFNJTV9SVU5fT0JKUykgbGlic2ltLmEgJChFWFRSQV9MSUJTKQotCi1ydW4ubzogJChzcmNjb20pL3J1bi5jIGNvbmZpZy5oIHRjb25maWcuaCBcCi0JICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oICQoc3Jjcm9vdCkvaW5jbHVkZS9jYWxsYmFjay5oCi0JJChDQykgLWMgJChzcmNjb20pL3J1bi5jICQoQUxMX0NGTEFHUykKLQotIyBGSVhNRTogSWRlYWxseSwgY2FsbGJhY2subyBhbmQgZnJpZW5kcyBsaXZlIGluIGEgbGlicmFyeSBvdXRzaWRlIG9mCi0jIGJvdGggdGhlIGdkYiBhbmQgc2ltdWxhdG9yIHNvdXJjZSB0cmVlcyAoZS5nLiBkZXZvL3JlbW90ZS4gIE5vdAotIyBkZXZvL2xpYnJlbW90ZSBiZWNhdXNlIHRoaXMgZGlyZWN0b3J5IHdvdWxkIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QKLSMgYSBsaWJyYXJ5KS4KLQotY2FsbGJhY2subzogJChzcmNjb20pL2NhbGxiYWNrLmMgY29uZmlnLmggdGNvbmZpZy5oIFwKLQkgICQoc3Jjcm9vdCkvaW5jbHVkZS9jYWxsYmFjay5oIHRhcmctdmFscy5oCi0JJChDQykgLWMgJChzcmNjb20pL2NhbGxiYWNrLmMgJChBTExfQ0ZMQUdTKQotCi1zeXNjYWxsLm86ICQoc3JjY29tKS9zeXNjYWxsLmMgY29uZmlnLmggdGNvbmZpZy5oIFwKLQkgICQoc3Jjcm9vdCkvaW5jbHVkZS9jYWxsYmFjay5oIHRhcmctdmFscy5oCi0JJChDQykgLWMgJChzcmNjb20pL3N5c2NhbGwuYyAkKEFMTF9DRkxBR1MpCi0KLXRhcmctbWFwLm86IHRhcmctbWFwLmMgdGFyZy12YWxzLmgKLQotZ2VudG1hcDogTWFrZWZpbGUgJChzcmNjb20pL2dlbnRtYXAuYyB0YXJnLXZhbHMuZGVmCi0JJChDQ19GT1JfQlVJTEQpICQoc3JjY29tKS9nZW50bWFwLmMgLW8gZ2VudG1hcCAkKEJVSUxEX0NGTEFHUykgJChOTF9UQVJHRVQpCi0KLXRhcmctdmFscy5oIHRhcmctbWFwLmM6IHN0YW1wLXR2YWxzCi1zdGFtcC10dmFsczogZ2VudG1hcAotCXJtIC1mIHRtcC10dmFscy5oIHRtcC10bWFwLmMKLQkuL2dlbnRtYXAgLWggPnRtcC10dmFscy5oCi0JJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSB0bXAtdHZhbHMuaCB0YXJnLXZhbHMuaAotCS4vZ2VudG1hcCAtYyA+dG1wLXRtYXAuYwotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgdG1wLXRtYXAuYyB0YXJnLW1hcC5jCi0JdG91Y2ggc3RhbXAtdHZhbHMKLQotIwotIyBSdWxlcyBmb3IgYnVpbGRpbmcgc2ltLSogY29tcG9uZW50cy4gIFRyaWdnZXJlZCBieSBsaXN0aW5nIHRoZSBjb3JyZXNwb25kaW5nCi0jIC5vIGZpbGUgaW4gdGhlIGxpc3Qgb2Ygc2ltdWxhdG9yIHRhcmdldHMuCi0jCi0KLXNpbV9tYWluX2hlYWRlcnMgPSBcCi0Jc2ltLW1haW4uaCBcCi0JJChzcmNjb20pL3NpbS1hc3NlcnQuaCBcCi0JJChzcmNjb20pL3NpbS1iYXNlLmggXAotCSQoc3JjY29tKS9zaW0tYmFzaWNzLmggXAotCSQoc3JjY29tKS9zaW0tY29uZmlnLmggXAotCSQoc3JjY29tKS9zaW0tY3B1LmggXAotCSQoc3JjY29tKS9zaW0tZW5naW5lLmggXAotCSQoc3JjY29tKS9zaW0tZXZlbnRzLmggXAotCSQoc3JjY29tKS9zaW0taW5saW5lLmggXAotCSQoc3JjY29tKS9zaW0tbWVtb3B0LmggXAotCSQoc3JjY29tKS9zaW0tbW9kZWwuaCBcCi0JJChzcmNjb20pL3NpbS1tb2R1bGUuaCBcCi0JJChzcmNjb20pL3NpbS1wcm9maWxlLmggXAotCSQoc3JjY29tKS9zaW0tc2lnbmFsLmggXAotCSQoc3JjY29tKS9zaW0tdHJhY2UuaCBcCi0JJChzcmNjb20pL3NpbS13YXRjaC5oIFwKLQl0Y29uZmlnLmggXAotCSQoU0lNX0VYVFJBX0RFUFMpCi0KLSMgRXhwb3J0ZWQgdmVyc2lvbiBvZiBzaW1fbWFpbl9oZWFkZXJzLgotU0lNX01BSU5fREVQUyA9IFwKLQkkKHNpbV9tYWluX2hlYWRlcnMpCi0KLXNpbS1hc3NlcnRfaCA9ICQoc3JjY29tKS9zaW0tYXNzZXJ0LmgKLXNpbS1lbmRpYW5faCA9ICQoc3JjY29tKS9zaW0tZW5kaWFuLmgKLXNpbS1uLWVuZGlhbl9oID0gJChzcmNjb20pL3NpbS1uLWVuZGlhbi5oCi1zaW0tYXJhbmdlX2ggPSAkKHNyY2NvbSkvc2ltLWFyYW5nZS5oCi1zaW0tYml0c19oID0gJChzcmNjb20pL3NpbS1iaXRzLmgKLXNpbS1jb25maWdfaCA9ICQoc3JjY29tKS9zaW0tY29uZmlnLmgKLXNpbS1uLWJpdHNfaCA9ICQoc3JjY29tKS9zaW0tbi1iaXRzLmgKLXNpbS1jb3JlX2ggPSAkKHNyY2NvbSkvc2ltLWNvcmUuaAotc2ltLW4tY29yZV9oID0gJChzcmNjb20pL3NpbS1uLWNvcmUuaAotc2ltLWVuZ2luZV9oID0gJChzcmNjb20pL3NpbS1lbmdpbmUuaAotc2ltLWV2ZW50c19oID0gJChzcmNjb20pL3NpbS1ldmVudHMuaAotc2ltLWZwdV9oID0gJChzcmNjb20pL3NpbS1mcHUuaAotc2ltLWlvX2ggPSAkKHNyY2NvbSkvc2ltLWlvLmgKLXNpbS1vcHRpb25zX2ggPSAkKHNyY2NvbSkvc2ltLW9wdGlvbnMuaAotc2ltLWJyZWFrX2ggPSAkKHNyY2NvbSkvc2ltLWJyZWFrLmgKLXNpbS1zaWduYWxfaCA9ICQoc3JjY29tKS9zaW0tc2lnbmFsLmgKLQotaHctYWxsb2NfaCA9ICQoc3JjY29tKS9ody1hbGxvYy5oCi1ody1iYXNlX2ggPSAkKHNyY2NvbSkvaHctYmFzZS5oCi1ody1kZXZpY2VfaCA9ICQoc3JjY29tKS9ody1kZXZpY2UuaAotaHctZXZlbnRzX2ggPSAkKHNyY2NvbSkvaHctZXZlbnRzLmgKLWh3LWhhbmRsZXNfaCA9ICQoc3JjY29tKS9ody1oYW5kbGVzLmgKLWh3LWluc3RhbmNlc19oID0gJChzcmNjb20pL2h3LWluc3RhbmNlcy5oCi1ody1wb3J0c19oID0gJChzcmNjb20pL2h3LXBvcnRzLmgKLWh3LXByb3BlcnRpZXNfaCA9ICQoc3JjY29tKS9ody1wcm9wZXJ0aWVzLmgKLWh3LXRyZWVfaCA9ICQoc3JjY29tKS9ody10cmVlLmgKLQotaHdfbWFpbl9oZWFkZXJzID0gXAotCSQoc3JjY29tKS9ody1tYWluLmggXAotCSQoaHctYWxsb2NfaCkgXAotCSQoaHctYmFzZV9oKSBcCi0JJChody1kZXZpY2VfaCkgXAotCSQoaHctZXZlbnRzX2gpIFwKLQkkKGh3LWluc3RhbmNlc19oKSBcCi0JJChody1oYW5kbGVzX2gpIFwKLQkkKGh3LXBvcnRzX2gpIFwKLQkkKGh3LXByb3BlcnRpZXNfaCkgXAotCi0jIEZJWE1FOiBJZiB0aGlzIGNvbXBsaWNhdGVkIHdheSBvZiBidWlsZGluZyAubyBmaWxlcyBmcm9tIC4uL2NvbW1vbiBpcwotIyBuZWNlc3NhcnksIHRoZSByZWFzb24gc2hvdWxkIGJlIGRvY3VtZW50ZWQgaGVyZS4KLQotQlVJTFRfU1JDX0ZST01fQ09NTU9OPSBcCi0Jc2ltLWlubGluZS5jCi0KLXNpbS1hYm9ydC5vOiAkKHNyY2NvbSkvc2ltLWFib3J0LmMgXAotCSAgJChTSU1fRVhUUkFfREVQUykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWFib3J0LmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tYXJhbmdlLm86ICQoc3JjY29tKS9zaW0tYXJhbmdlLmMgJChzaW0tYXJhbmdlX2gpICQoU0lNX0VYVFJBX0RFUFMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1hcmFuZ2UuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1iaXRzLm86ICQoc3JjY29tKS9zaW0tYml0cy5jICQoc2ltLWJpdHNfaCkgJChzaW0tbi1iaXRzX2gpIFwKLQkgICQoU0lNX0VYVFJBX0RFUFMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1iaXRzLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tY29uZmlnLm86ICQoc3JjY29tKS9zaW0tY29uZmlnLmMgJChzaW0tY29uZmlnX2gpIFwKLQkgICQoU0lNX0VYVFJBX0RFUFMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1jb25maWcuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1jb3JlLm86ICQoc3JjY29tKS9zaW0tY29yZS5jICQoc2ltX21haW5faGVhZGVycykgXAotCSAgJChzaW0tY29yZV9oKSAkKHNpbS1uLWNvcmVfaCkKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWNvcmUuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1jcHUubzogJChzcmNjb20pL3NpbS1jcHUuYyAkKHNpbV9tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1jcHUuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1lbmRpYW4ubzogJChzcmNjb20pL3NpbS1lbmRpYW4uYyAkKHNpbS1lbmRpYW5faCkgJChzaW0tbi1lbmRpYW5faCkKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWVuZGlhbi5jICQoQUxMX0NGTEFHUykKLQotc2ltLWVuZ2luZS5vOiAkKHNyY2NvbSkvc2ltLWVuZ2luZS5jICQoc2ltX21haW5faGVhZGVycykgJChzaW0tZW5naW5lX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1lbmdpbmUuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1ldmVudHMubzogJChzcmNjb20pL3NpbS1ldmVudHMuYyAkKHNpbS1ldmVudHNfaCkgXAotCSAgJChTSU1fRVhUUkFfREVQUykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWV2ZW50cy5jICQoQUxMX0NGTEFHUykKLQotc2ltLWZwdS5vOiAkKHNyY2NvbSkvc2ltLWZwdS5jICQoc2ltLWZwdV9oKSBcCi0JICAkKFNJTV9FWFRSQV9ERVBTKQotCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tZnB1LmMgJChBTExfQ0ZMQUdTKQotCi1zaW0taGxvYWQubzogJChzcmNjb20pL3NpbS1obG9hZC5jICQoc2ltLWFzc2VydF9oKSBcCi0JICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIFwKLQkgICQoU0lNX0VYVFJBX0RFUFMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1obG9hZC5jICQoQUxMX0NGTEFHUykKLQotc2ltLWhydy5vOiAkKHNyY2NvbSkvc2ltLWhydy5jICQoc2ltLWFzc2VydF9oKSAkKHNpbV9jb3JlX2gpIFwKLQkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmggXAotCSAgJChTSU1fRVhUUkFfREVQUykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWhydy5jICQoQUxMX0NGTEFHUykKLQotc2ltLWh3Lm86ICQoc3JjY29tKS9zaW0taHcuYyAkKHNpbV9tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1ody5jICQoQUxMX0NGTEFHUykKLQotc2ltLWluZm8ubzogJChzcmNjb20pL3NpbS1pbmZvLmMgJChzaW0tYXNzZXJ0X2gpIFwKLQkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmggXAotCSAgJChTSU1fRVhUUkFfREVQUykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWluZm8uYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1pbmxpbmUuYzogJChzcmNjb20pL3NpbS1pbmxpbmUuYwotCXJtIC1mICRAIHRtcC0kQAotCWVjaG8gIiMgMSBcIiQoc3JjY29tKS8kQFwiIiA+IHRtcC0kQAotCWNhdCAkKHNyY2NvbSkvJEAgPj4gdG1wLSRACi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC0kQCAkQAotCi1zaW0taW8ubzogJChzcmNjb20pL3NpbS1pby5jICQoc2ltX21haW5faGVhZGVycykgJChzaW0taW9faCkgXAotCSAgJChzcmNyb290KS9pbmNsdWRlL3JlbW90ZS1zaW0uaAotCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0taW8uYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1tZW1vcHQubzogJChzcmNjb20pL3NpbS1tZW1vcHQuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKLQkgICQoc2ltLWlvX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1tZW1vcHQuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1tb2R1bGUubzogJChzcmNjb20pL3NpbS1tb2R1bGUuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKLQkgICQoc2ltLWlvX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1tb2R1bGUuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1vcHRpb25zLm86ICQoc3JjY29tKS9zaW0tb3B0aW9ucy5jICQoc2ltX21haW5faGVhZGVycykgXAotCSAgJChzaW0tb3B0aW9uc19oKSAkKHNpbS1pb19oKQotCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tb3B0aW9ucy5jICQoQUxMX0NGTEFHUykKLQotc2ltLXJlYXNvbi5vOiAkKHNyY2NvbSkvc2ltLXJlYXNvbi5jICQoc2ltX21haW5faGVhZGVycykgXAotCSAgJChzcmNyb290KS9pbmNsdWRlL3JlbW90ZS1zaW0uaAotCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tcmVhc29uLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tcmVnLm86ICQoc3JjY29tKS9zaW0tcmVnLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCi0JICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1yZWcuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1yZXN1bWUubzogJChzcmNjb20pL3NpbS1yZXN1bWUuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKLQkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmgKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXJlc3VtZS5jICQoQUxMX0NGTEFHUykKLQotc2ltLXJ1bi5vOiAkKHNyY2NvbSkvc2ltLXJ1bi5jICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXJ1bi5jICQoQUxMX0NGTEFHUykKLQotc2ltLXNpZ25hbC5vOiAkKHNyY2NvbSkvc2ltLXNpZ25hbC5jICQoc2ltX21haW5faGVhZGVycykgJChzaW0tc2lnbmFsX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1zaWduYWwuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS1zdG9wLm86ICQoc3JjY29tKS9zaW0tc3RvcC5jICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXN0b3AuYyAkKEFMTF9DRkxBR1MpCi0KLXNpbS10cmFjZS5vOiAkKHNyY2NvbSkvc2ltLXRyYWNlLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCi0JICAkKHNpbS1vcHRpb25zX2gpICQoc2ltLWlvX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS10cmFjZS5jICQoQUxMX0NGTEFHUykKLQotc2ltLXByb2ZpbGUubzogJChzcmNjb20pL3NpbS1wcm9maWxlLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCi0JICAkKHNpbS1vcHRpb25zX2gpICQoc2ltLWlvX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1wcm9maWxlLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tbW9kZWwubzogJChzcmNjb20pL3NpbS1tb2RlbC5jICQoc2ltX21haW5faGVhZGVycykgXAotCSAgJChzaW0taW9faCkKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLW1vZGVsLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tdXRpbHMubzogJChzcmNjb20pL3NpbS11dGlscy5jICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXV0aWxzLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0td2F0Y2gubzogJChzcmNjb20pL3NpbS13YXRjaC5jICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXdhdGNoLmMgJChBTExfQ0ZMQUdTKQotCi1zaW0tbG9hZC5vOiAkKHNyY2NvbSkvc2ltLWxvYWQuYyAkKHNyY3Jvb3QpL2luY2x1ZGUvY2FsbGJhY2suaAotCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tbG9hZC5jICQoQUxMX0NGTEFHUykKLQotc2ltLWJyZWFrLm86ICQoc3JjY29tKS9zaW0tYnJlYWsuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKLQkgICQoc2ltX2JyZWFrX2gpCi0JJChDQykgLWMgJChzcmNjb20pL3NpbS1icmVhay5jICQoQUxMX0NGTEFHUykKLQotCi0jIEZJWE1FIFRoaXMgaXMgb25lIHZlcnkgc2ltcGxlLW1pbmRlZCB3YXkgb2YgZ2VuZXJhdGluZyB0aGUgZmlsZSBody1jb25maWcuaAotaHctY29uZmlnLmg6IE1ha2VmaWxlLmluICQoc3JjY29tKS9NYWtlLWNvbW1vbi5pbiBjb25maWcuc3RhdHVzIE1ha2VmaWxlCi0Jcm0gLWYgdG1wLWh3LmgKLQllY2hvICIvKiBnZW5lcmF0ZWQgYnkgTWFrZWZpbGUgKi8iID4gdG1wLWh3LmgKLQlmb3IgaHcgaW4gJChTSU1fSFcpIDsgZG8gXAotCSAgZWNobyAiZXh0ZXJuIGNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2XyQke2h3fV9kZXNjcmlwdG9yW107IiA7IFwKLQlkb25lID4+IHRtcC1ody5oCi0JZWNobyAiY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgKmh3X2Rlc2NyaXB0b3JzW10gPSB7IiA+PiB0bXAtaHcuaAotCWZvciBodyBpbiAkKFNJTV9IVykgOyBkbyBcCi0JICBlY2hvICIgIGR2XyQke2h3fV9kZXNjcmlwdG9yLCIgOyBcCi0JZG9uZSA+PiB0bXAtaHcuaAotCWVjaG8gIiAgTlVMTCwiID4+IHRtcC1ody5oCi0JZWNobyAifTsiID4+IHRtcC1ody5oCi0JbXYgdG1wLWh3LmggaHctY29uZmlnLmgKLQotaHctYWxsb2MubzogJChzcmNjb20pL2h3LWFsbG9jLmMgJChod19tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL2h3LWFsbG9jLmMgJChBTExfQ0ZMQUdTKQotCi1ody1iYXNlLm86ICQoc3JjY29tKS9ody1iYXNlLmMgJChod19tYWluX2hlYWRlcnMpIGh3LWNvbmZpZy5oCi0JJChDQykgLWMgJChzcmNjb20pL2h3LWJhc2UuYyAkKEFMTF9DRkxBR1MpCi0KLWh3LWRldmljZS5vOiAkKHNyY2NvbSkvaHctZGV2aWNlLmMgJChod19tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL2h3LWRldmljZS5jICQoQUxMX0NGTEFHUykKLQotaHctZXZlbnRzLm86ICQoc3JjY29tKS9ody1ldmVudHMuYyAkKGh3X21haW5faGVhZGVycykgJChzaW1fbWFpbl9oZWFkZXJzKQotCSQoQ0MpIC1jICQoc3JjY29tKS9ody1ldmVudHMuYyAkKEFMTF9DRkxBR1MpCi0KLXRlc3QtaHctZXZlbnRzOiAkKHNyY2NvbSkvaHctZXZlbnRzLmMgbGlic2ltLmEKLQkkKENDKSAkKEFMTF9DRkxBR1MpIC1ETUFJTiAtbyB0ZXN0LWh3LWV2ZW50cyQoRVhFRVhUKSBcCi0JCSQoc3JjY29tKS9ody1ldmVudHMuYyBsaWJzaW0uYSAkKEVYVFJBX0xJQlMpCi0KLWh3LWluc3RhbmNlcy5vOiAkKHNyY2NvbSkvaHctaW5zdGFuY2VzLmMgJChod19tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL2h3LWluc3RhbmNlcy5jICQoQUxMX0NGTEFHUykKLQotaHctaGFuZGxlcy5vOiAkKHNyY2NvbSkvaHctaGFuZGxlcy5jICQoaHdfbWFpbl9oZWFkZXJzKQotCSQoQ0MpIC1jICQoc3JjY29tKS9ody1oYW5kbGVzLmMgJChBTExfQ0ZMQUdTKQotCi1ody1wb3J0cy5vOiAkKHNyY2NvbSkvaHctcG9ydHMuYyAkKGh3X21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvaHctcG9ydHMuYyAkKEFMTF9DRkxBR1MpCi0KLWh3LXByb3BlcnRpZXMubzogJChzcmNjb20pL2h3LXByb3BlcnRpZXMuYyAkKGh3X21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvaHctcHJvcGVydGllcy5jICQoQUxMX0NGTEFHUykKLQotaHctdHJlZS5vOiAkKHNyY2NvbSkvaHctdHJlZS5jICQoaHdfbWFpbl9oZWFkZXJzKSAkKGh3LXRyZWVfaCkKLQkkKENDKSAtYyAkKHNyY2NvbSkvaHctdHJlZS5jICQoQUxMX0NGTEFHUykKLQotIyBEZXZpY2VzLgotCi1kdi1jb3JlLm86ICQoc3JjY29tKS9kdi1jb3JlLmMgJChod19tYWluX2hlYWRlcnMpICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvZHYtY29yZS5jICQoQUxMX0NGTEFHUykKLQotZHYtZ2x1ZS5vOiAkKHNyY2NvbSkvZHYtZ2x1ZS5jICQoaHdfbWFpbl9oZWFkZXJzKSAkKHNpbV9tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL2R2LWdsdWUuYyAkKEFMTF9DRkxBR1MpCi0KLWR2LXBhbC5vOiAkKHNyY2NvbSkvZHYtcGFsLmMgJChod19tYWluX2hlYWRlcnMpICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvZHYtcGFsLmMgJChBTExfQ0ZMQUdTKQotCi1kdi1zb2Nrc2VyLm86ICQoc3JjY29tKS9kdi1zb2Nrc2VyLmggJChzaW1fbWFpbl9oZWFkZXJzKQotCSQoQ0MpIC1jICQoc3JjY29tKS9kdi1zb2Nrc2VyLmMgJChBTExfQ0ZMQUdTKQotCi0KLW5ydW4ubzogJChzcmNjb20pL25ydW4uYyBjb25maWcuaCB0Y29uZmlnLmggXAotCSAgJChzcmNyb290KS9pbmNsdWRlL3JlbW90ZS1zaW0uaCAkKHNyY3Jvb3QpL2luY2x1ZGUvY2FsbGJhY2suaCBcCi0JICAkKHNpbV9tYWluX2hlYWRlcnMpCi0JJChDQykgLWMgJChzcmNjb20pL25ydW4uYyAkKEFMTF9DRkxBR1MpCi0KLSMgQ0dFTiBzdXBwb3J0LgotCi0jIEZvciB1c2UgaW4gTWFrZWZpbGUuaW4gZm9yIGNwdS1zcGVjaWZpYyBmaWxlcy4KLUNHRU5fTUFJTl9DUFVfREVQUyA9IFwKLQkkKFNJTV9NQUlOX0RFUFMpIFwKLQkkKENHRU5fSU5DTFVERV9ERVBTKSBcCi0JJChzcmNjb20pL2NnZW4tb3BzLmggXAotCSQoc3JjY29tKS9jZ2VuLW1lbS5oIFwKLQkkKHNyY2NvbSkvY2dlbi1wYXIuaCBcCi0JJChzcmNjb20pL2NnZW4tZnB1LmgKLQotY2dlbi1ydW4ubzogJChzcmNjb20pL2NnZW4tcnVuLmMgJChzaW1fbWFpbl9oZWFkZXJzKQotCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLXJ1bi5jICQoQUxMX0NGTEFHUykKLQotY2dlbi1zY2FjaGUubzogJChzcmNjb20pL2NnZW4tc2NhY2hlLmMgJChzaW1fbWFpbl9oZWFkZXJzKQotCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLXNjYWNoZS5jICQoQUxMX0NGTEFHUykKLQotY2dlbi10cmFjZS5vOiAkKHNyY2NvbSkvY2dlbi10cmFjZS5jICQoc2ltX21haW5faGVhZGVycykKLQkkKENDKSAtYyAkKHNyY2NvbSkvY2dlbi10cmFjZS5jICQoQUxMX0NGTEFHUykKLQotY2dlbi1mcHUubzogJChzcmNjb20pL2NnZW4tZnB1LmMgJChzaW1fbWFpbl9oZWFkZXJzKSAkKHNpbS1mcHVfaCkKLQkkKENDKSAtYyAkKHNyY2NvbSkvY2dlbi1mcHUuYyAkKEFMTF9DRkxBR1MpCi0KLWNnZW4tYWNjZnAubzogJChzcmNjb20pL2NnZW4tYWNjZnAuYyAkKHNpbV9tYWluX2hlYWRlcnMpICQoc2ltLWZwdV9oKQotCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLWFjY2ZwLmMgJChBTExfQ0ZMQUdTKQotCi1jZ2VuLXV0aWxzLm86ICQoc3JjY29tKS9jZ2VuLXV0aWxzLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCi0JICAkKHNyY2NvbSkvY2dlbi1tZW0uaCAkKHNyY2NvbSkvY2dlbi1vcHMuaCAkKHNyY2NvbSkvY2dlbi1lbmdpbmUuaAotCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLXV0aWxzLmMgJChBTExfQ0ZMQUdTKQotCi1jZ2VuLXBhci5vOiAkKHNyY2NvbSkvY2dlbi1wYXIuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKLQkgICQoc3JjY29tKS9jZ2VuLW1lbS5oICQoc3JjY29tKS9jZ2VuLXBhci5oCi0JJChDQykgLWMgJChzcmNjb20pL2NnZW4tcGFyLmMgJChBTExfQ0ZMQUdTKQotCi0jIFN1cHBvcnQgdGFyZ2V0cy4KLQotaW5zdGFsbDogaW5zdGFsbC1jb21tb24gJChTSU1fRVhUUkFfSU5TVEFMTCkKLQotaW5zdGFsbC1jb21tb246IGluc3RhbGxkaXJzCi0Jbj1gZWNobyBydW4gfCBzZWQgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknYDsgXAotCSQoSU5TVEFMTF9QUk9HUkFNKSBydW4kKEVYRUVYVCkgJChiaW5kaXIpLyQkbiQoRVhFRVhUKQotCW49YGVjaG8gbGlic2ltLmEgfCBzZWQgcy9saWJzaW0uYS9saWIkKHRhcmdldF9hbGlhcyktc2ltLmEvYDsgXAotCSQoSU5TVEFMTF9EQVRBKSBsaWJzaW0uYSAkKGxpYmRpcikvJCRuIDsgXAotCSggY2QgJChsaWJkaXIpIDsgJChSQU5MSUIpICQkbiApCi0KLWluc3RhbGxkaXJzOgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzICQoYmluZGlyKQotCi1jaGVjazoKLQljZCAuLi90ZXN0c3VpdGUgJiYgJChNQUtFKSBjaGVjayBSVU5URVNURkxBR1M9IiQoUlVOVEVTVEZMQUdTKSIKLQotaW5mbzoKLWNsZWFuLWluZm86Ci1pbnN0YWxsLWluZm86Ci0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLXRhZ3MgZXRhZ3M6IFRBR1MKLQotIyBNYWNyb3MgbGlrZSBFWFRFUk5fU0lNX0NPUkUgY29uZnVzZSB0YWdzLgotIyBBbmQgdGhlIHNpbS1uLWZvby5oIGZpbGVzIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4ndCBiZSBmb3VuZCBlaXRoZXIuCi1UQUdTOiBmb3JjZQotCWNkICQoc3JjZGlyKSAmJiBcCi0JZXRhZ3MgLS1yZWdleCAnL15cKFthLXpfXStcKSAoL1wxLycgLS1yZWdleCAnL15cL1sqXSBUQUdTOiAuKi8nIFwKLQkJKi5bY2hdIC4uL2NvbW1vbi8qLltjaF0KLQotY2xlYW46ICQoU0lNX0VYVFJBX0NMRUFOKQotCXJtIC1mICouW29hXSAqfiBjb3JlCi0Jcm0gLWYgcnVuIGxpYnNpbS5hCi0Jcm0gLWYgZ2VudG1hcCB0YXJnLW1hcC5jIHRhcmctdmFscy5oIHN0YW1wLXR2YWxzCi0JaWYgWyAhIC1mIE1ha2UtY29tbW9uLmluIF0gOyB0aGVuIFwKLQkJcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9DT01NT04pIDsgXAotCWZpCi0Jcm0gLWYgdG1wLW1sb29wLmhpbiB0bXAtbWxvb3AuaCB0bXAtbWxvb3AuY2luIHRtcC1tbG9vcC5jCi0KLWRpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQlybSAtZiBUQUdTCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cyAuZ2RiaW5pdAotCXJtIC1mIHRjb25maWcuaCBjb25maWcuaCBzdGFtcC1oCi0Jcm0gLWYgdGFyZy12YWxzLmRlZgotCi0uYy5vOgotCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgJDwKLQotIyBEdW1teSB0YXJnZXQgdG8gZm9yY2UgZXhlY3V0aW9uIG9mIGRlcGVuZGVudCB0YXJnZXRzLgotZm9yY2U6Ci0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiAkKHNyY2NvbSkvTWFrZS1jb21tb24uaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1jb25maWcuaDogc3RhbXAtaCA7IEB0cnVlCi1zdGFtcC1oOiBjb25maWcuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0uZ2RiaW5pdDogIyBjb25maWcuc3RhdHVzICQoc3JjY29tKS9nZGJpbml0LmluCi0JQ09ORklHX0ZJTEVTPSRAOi4uL2NvbW1vbi9nZGJpbml0LmluIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotCi0jIyBFbmQgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vTWFrZWZpbGUuaW4gYi9zaW0vY29tbW9uL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI4MDgyLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciBzaW11bGF0b3IgY29tbW9uIGRpcmVjdG9yeQotIyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWRlZmF1bHQ6IGFsbAotCi1WUEFUSCA9IEBzcmNkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3Jjcm9vdCA9ICQoc3JjZGlyKS8uLi8uLgotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1iaW5kaXIgPSBAYmluZGlyQAotCi1saWJkaXIgPSBAbGliZGlyQAotdG9vbGRpciA9ICQobGliZGlyKS8kKHRhcmdldF9hbGlhcykKLQotZGF0YWRpciA9IEBkYXRhZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLUNGTEFHUyA9IEBDRkxBR1NACi1TSU1fQ0ZMQUdTID0gQHNpbV9jZmxhZ3NACi0KLSMgVGhlc2UgYXJlIHVzZWQgdG8gcmVidWlsZCBubHR2YWxzLmRlZi4KLUNQUF9GT1JfVEFSR0VUID0gQENQUF9GT1JfVEFSR0VUQAotVEFSR0VUX1NVQkRJUiA9IEBUQVJHRVRfU1VCRElSQAotCi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLVRERUZJTkVTID0KLQotQ09ORklHX0NGTEFHUyA9IEBERUZTQCAkKFNJTV9DRkxBR1MpICQoSERFRklORVMpICQoVERFRklORVMpCi1DU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChzcmNyb290KS9pbmNsdWRlCi1BTExfQ0ZMQUdTID0gJChDRkxBR1MpICQoQ09ORklHX0NGTEFHUykgJChDU0VBUkNIKQotQlVJTERfQ0ZMQUdTID0gLWcgLU8gJChDU0VBUkNIKQotCi1BUiA9IEBBUkAKLUFSX0ZMQUdTID0gcmMKLVJBTkxJQiA9IEBSQU5MSUJACi1NQUtFSU5GTyA9IG1ha2VpbmZvCi0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLWFsbDoKLQotIyBHZW5lcmF0ZSBUQVJHX1ZBTFNfSCBmb3IgbmV3bGliL2xpYmdsb3NzIHVzaW5nIGRldm8gYW5kIGJ1aWxkIHRyZWUuCi0jIFRoaXMgZmlsZSBpcyBzaGlwcGVkIHdpdGggZGlzdHJpYnV0aW9ucyBzbyB3ZSBidWlsZCBpbiB0aGUgc291cmNlIGRpci4KLSMgVGhpcyBpcyBidWlsdCBpbiBzcmNkaXIgc28gcHV0dGluZyBkZXBlbmRlbmNpZXMgaGVyZSBpcyByaXNreS4KLSMgVXNlIGBtYWtlIGhlYWRlcnMnIHRvIHJlYnVpbGQuCi1oZWFkZXJzOiBubHR2YWxzLmRlZgotLlBIT05ZOiBoZWFkZXJzCi0KLSMgTm90ZTogSWYgZ2RiIHJlbGVhc2VzIGJlZ2luIHRvIGNvbnRhaW4gdGFyZ2V0IGhlYWRlciBmaWxlcywgZ2VuZXJhdGUKLSMgdGFyZy12YWxzLmRlZiBhdCBidWlsZCB0aW1lLgotCi1ubHR2YWxzLmRlZjogTWFrZWZpbGUgZ2Vubmx0dmFscy5zaCBnZW50dmFscy5zaAotCXJvb3RtZT1gcHdkYCA7IFwKLQljZCAkKHNyY2RpcikgOyBcCi0Jcm0gLWYgbmx0dmFscy5uZXcgOyBcCi0JJChTSEVMTCkgJChzcmNkaXIpL2dlbm5sdHZhbHMuc2ggJChTSEVMTCkgJChzcmNyb290KSAiJChDUFBfRk9SX1RBUkdFVCkiID4gbmx0dmFscy5uZXcgOyBcCi0JJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSBubHR2YWxzLm5ldyBubHR2YWxzLmRlZgotCi0uYy5vOgotCSQoQ0MpIC1jICQ8ICQoQUxMX0NGTEFHUykKLQotY2hlY2s6Ci0KLWluZm86Ci1jbGVhbi1pbmZvOgotaW5zdGFsbC1pbmZvOgotCi10YWdzIGV0YWdzOiBUQUdTCi0KLSMgTWFjcm9zIGxpa2UgRVhURVJOX1NJTV9DT1JFIGNvbmZ1c2UgdGFncy4KLSMgQW5kIHRoZSBzaW0tbi1mb28uaCBmaWxlcyBjcmVhdGUgZnVuY3Rpb25zIHRoYXQgY2FuJ3QgYmUgZm91bmQgZWl0aGVyLgotVEFHUzogZm9yY2UKLQljZCAkKHNyY2RpcikgJiYgXAotCWV0YWdzIC0tcmVnZXggJy9eXChbYS16X10rXCkgKC9cMS8nIC0tcmVnZXggJy9eLipcL1sqXSBUQUdTOiAuKi8nIFwKLQkJKi5jICouaAotCi1jbGVhbjoKLQlybSAtZiAqLltvYV0gKn4gY29yZQotCXJtIC1mICQoQUxMKQotCi1kaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuCi0Jcm0gLWYgVEFHUwotCXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMKLQlybSAtZiBjb25maWcuaCBzdGFtcC1oCi0KLSMgRHVtbXkgdGFyZ2V0IHRvIGZvcmNlIGV4ZWN1dGlvbiBvZiBkZXBlbmRlbnQgdGFyZ2V0cy4KLWZvcmNlOgotCi0jIENvcHkgdGhlIGZpbGVzIGludG8gZGlyZWN0b3JpZXMgd2hlcmUgdGhleSB3aWxsIGJlIHJ1bi4KLWluc3RhbGw6Ci0KLWluc3RhbGwtbWFuOiBpbnN0YWxsZGlycwotCW49YGVjaG8gcnVuIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3J1bi4xICQobWFuMWRpcikvJCRuLjEKLQotaW5zdGFsbGRpcnM6Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMgJChtYW4xZGlyKQotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiBjb25maWd1cmUKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2FjY29uZmlnLmggYi9zaW0vY29tbW9uL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg3YTEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2FjbG9jYWwubTQgYi9zaW0vY29tbW9uL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTM0YjIuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0jIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gY29kZSB1c2VkIGJ5IGFsbCBzaW11bGF0b3JzLgotIwotIyBTSU1fQUNfQ09NTU9OIGludm9rZXMgQUMgbWFjcm9zIHVzZWQgYnkgYWxsIHNpbXVsYXRvcnMgYW5kIGJ5IHRoZSBjb21tb24KLSMgZGlyZWN0b3J5LiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgYW55IHRhcmdldCBzcGVjaWZpYyBzdHVmZi4KLSMgU0lNX0FDX09VVFBVVCBpcyBhIGNvdmVyIGZ1bmN0aW9uIHRvIEFDX09VVFBVVCB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuCi0jIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgbGFzdC4KLSMKLSMgVGhlIHNpbXVsYXRvcidzIGNvbmZpZ3VyZS5pbiBzaG91bGQgbG9vayBsaWtlOgotIwotIyBkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLSMgc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi0jIEFDX1BSRVJFUSgyLjUpZG5sCi0jIEFDX0lOSVQoTWFrZWZpbGUuaW4pCi0jCi0jIFNJTV9BQ19DT01NT04KLSMKLSMgLi4uIHRhcmdldCBzcGVjaWZpYyBzdHVmZiAuLi4KLSMKLSMgU0lNX0FDX09VVFBVVAotCi1BQ19ERUZVTihTSU1fQUNfQ09NTU9OLAotWwotIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCi1BQ19DT05GSUdfSEVBREVSKGlmZWxzZShbJDFdLCxjb25maWcuaCxbJDFdKTpjb25maWcuaW4pCi0KLUFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4pCi1BQ19DQU5PTklDQUxfU1lTVEVNCi1BQ19BUkdfUFJPR1JBTQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi0KLUFDX1NVQlNUKENGTEFHUykKLUFDX1NVQlNUKEhERUZJTkVTKQotQVI9JHtBUi1hcn0KLUFDX1NVQlNUKEFSKQotQUNfUFJPR19SQU5MSUIKLQotZG5sIFdlIGRvbid0IHVzZSBnZXR0ZXh0LCBidXQgYmZkIGRvZXMuICBTbyB3ZSBkbyB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzCi1kbmwgdG8gc2VlIGlmIHRoZXJlIGFyZSBpbnRsIGxpYnJhcmllcyB3ZSBzaG91bGQgbGluayBhZ2FpbnN0LgotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oKQotQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oKQotQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIGZwdV9jb250cm9sLmgpCi1BQ19DSEVDS19IRUFERVJTKGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oKQotQUNfQ0hFQ0tfRlVOQ1MoZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cpCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLUFDX0NIRUNLX0xJQihzb2NrZXQsIGJpbmQpCi1BQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lKQotCi0uICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotZG5sIFN0YW5kYXJkIChhbmQgb3B0aW9uYWwpIHNpbXVsYXRvciBvcHRpb25zLgotZG5sIEV2ZW50dWFsbHkgYWxsIHNpbXVsYXRvcnMgd2lsbCBzdXBwb3J0IHRoZXNlLgotZG5sIERvIG5vdCBhZGQgYW55IGhlcmUgdGhhdCBjYW5ub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBzaW11bGF0b3JzLgotZG5sIERvIG5vdCBhZGQgc2ltaWxhciBidXQgZGlmZmVyZW50IG9wdGlvbnMgdG8gYSBwYXJ0aWN1bGFyIHNpbXVsYXRvciwKLWRubCBhbGwgc2hhbGwgZXZlbnR1YWxseSBiZWhhdmUgdGhlIHNhbWUgd2F5LgotCi0KLWRubCBXZSBkb24ndCB1c2UgYXV0b21ha2UsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnQKLWRubCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1BQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5Ll0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7Ci0gIG5vKQlNQUlOVD0iIyIgOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmldLFtNQUlOVD0iIyJdKWRubAotQUNfU1VCU1QoTUFJTlQpCi0KLQotZG5sIFRoaXMgaXMgYSBnZW5lcmljIG9wdGlvbiB0byBlbmFibGUgc3BlY2lhbCBieXRlIHN3YXBwaW5nCi1kbmwgaW5zbnMgb24gKmFueSogY3B1LgotQUNfQVJHX0VOQUJMRShzaW0tYnN3YXAsCi1bICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKLSAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpXSxbc2ltX2Jzd2FwPSIiXSlkbmwKLUFDX1NVQlNUKHNpbV9ic3dhcCkKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1jZmxhZ3MsCi1bICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvcl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKLSAgdHJhY2UpIEFDX01TR19FUlJPUigiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iKTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmldLFtzaW1fY2ZsYWdzPSIiXSlkbmwKLUFDX1NVQlNUKHNpbV9jZmxhZ3MpCi0KLQotZG5sIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpcyBmb3IgZGV2ZWxvcGVycyBvZiB0aGUgc2ltdWxhdG9yCi1kbmwgdGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIHdvcmstaW4tcHJvZ3Jlc3MKLUFDX0FSR19FTkFCTEUoc2ltLWRlYnVnLAotWyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3NdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpXSxbc2ltX2RlYnVnPSIiXSlkbmwKLUFDX1NVQlNUKHNpbV9kZWJ1ZykKLQotCi1kbmwgLS1lbmFibGUtc2ltLXN0ZGlvIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yCi1kbmwgSXQgZGV0ZXJtaW5lcyBpZiBJTyBmcm9tIHRoZSBwcm9ncmFtIGlzIHJvdXRlZCB0aHJvdWdoIFNURElPIChidWZmZXJlZCkKLUFDX0FSR19FTkFCTEUoc2ltLXN0ZGlvLAotWyAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIik7IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpXSxbc2ltX3N0ZGlvPSIiXSlkbmwKLUFDX1NVQlNUKHNpbV9zdGRpbykKLQotCi1kbmwgLS1lbmFibGUtc2ltLXRyYWNlIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yCi1kbmwgVGhlIGFyZ3VtZW50IGlzIGVpdGhlciBhIGJpdG1hc2sgb2YgdGhpbmdzIHRvIGVuYWJsZSBbZXhhY3RseSB3aGF0IGlzCi1kbmwgdXAgdG8gdGhlIHNpbXVsYXRvcl0sIG9yIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdHJhY2luZwotZG5sIGVsZW1lbnRzIHRvIGVuYWJsZS4gIFRoZSBsYXR0ZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gc2ltdWxhdG9ycyB0aGF0Ci1kbmwgdXNlIFdJVEhfVFJBQ0UuCi1BQ19BUkdfRU5BQkxFKHNpbS10cmFjZSwKLVsgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFnc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgW1stMC05XV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFtbYS16XV0qKQotCXNpbV90cmFjZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgotCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQotZmldLFtzaW1fdHJhY2U9IiJdKWRubAotQUNfU1VCU1Qoc2ltX3RyYWNlKQotCi0KLWRubCAtLWVuYWJsZS1zaW0tcHJvZmlsZQotZG5sIFRoZSBhcmd1bWVudCBpcyBlaXRoZXIgYSBiaXRtYXNrIG9mIHRoaW5ncyB0byBlbmFibGUgW2V4YWN0bHkgd2hhdCBpcwotZG5sIHVwIHRvIHRoZSBzaW11bGF0b3JdLCBvciBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIHByb2ZpbGluZwotZG5sIGVsZW1lbnRzIHRvIGVuYWJsZS4gIFRoZSBsYXR0ZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gc2ltdWxhdG9ycyB0aGF0Ci1kbmwgdXNlIFdJVEhfUFJPRklMRS4KLUFDX0FSR19FTkFCTEUoc2ltLXByb2ZpbGUsCi1bICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbWy0wLTldXSopCi0Jc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKLSAgW1thLXpdXSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpXSxbc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIl0pZG5sCi1BQ19TVUJTVChzaW1fcHJvZmlsZSkKLQotCi1kbmwgVHlwZXMgdXNlZCBieSBjb21tb24gY29kZQotQUNfVFlQRV9TSUdOQUwKLQotZG5sIERldGVjdCBleGUgZXh0ZW5zaW9uCi1BQ19FWEVFWFQKLQotZG5sIFRoZXNlIGFyZSBhdmFpbGFibGUgdG8gYXBwZW5kIHRvIGFzIGRlc2lyZWQuCi1zaW1fbGlua19maWxlcz0KLXNpbV9saW5rX2xpbmtzPQotCi1kbmwgQ3JlYXRlIHRjb25maWcuaCBlaXRoZXIgZnJvbSBzaW11bGF0b3IncyB0Y29uZmlnLmluIG9yIGRlZmF1bHQgb25lCi1kbmwgaW4gY29tbW9uLgotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotXSkgZG5sIEVuZCBvZiBTSU1fQUNfQ09NTU9OCi0KLQotZG5sIEFkZGl0aW9uYWwgU0lNIG9wdGlvbnMgdGhhdCBjYW4gKG9wdGlvbmFsbHkpIGJlIGNvbmZpZ3VyZWQKLWRubCBGb3Igb3B0aW9uYWwgc2ltdWxhdG9yIG9wdGlvbnMsIGEgbWFjcm8gU0lNX0FDX09QVElPTl8qIGlzIGRlZmluZWQuCi1kbmwgU2ltdWxhdG9ycyB0aGF0IHdpc2ggdG8gdXNlIHRoZSByZWxldmFudCBvcHRpb24gc3BlY2lmeSB0aGUgbWFjcm8KLWRubCBpbiB0aGUgc2ltdWxhdG9yIHNwZWNpZmljIGNvbmZpZ3VyZS5pbiBmaWxlIGJldHdlZW4gdGhlIFNJTV9BQ19DT01NT04KLWRubCBhbmQgU0lNX0FDX09VVFBVVCBsaW5lcy4KLQotCi1kbmwgU3BlY2lmeSB0aGUgcnVubmluZyBlbnZpcm9ubWVudC4KLWRubCBJZiB0aGUgc2ltdWxhdG9yIGludm9rZXMgdGhpcyBpbiBpdHMgY29uZmlndXJlLmluIHRoZW4gd2l0aG91dCB0aGlzIG9wdGlvbgotZG5sIHRoZSBkZWZhdWx0IGlzIHRoZSB1c2VyIGVudmlyb25tZW50IGFuZCBhbGwgYXJlIHJ1bnRpbWUgc2VsZWN0YWJsZS4KLWRubCBJZiB0aGUgc2ltdWxhdG9yIGRvZXNuJ3QgaW52b2tlIHRoaXMsIG9ubHkgdGhlIHVzZXIgZW52aXJvbm1lbnQgaXMKLWRubCBzdXBwb3J0ZWQuCi1kbmwgPz8/IFVudGlsIHRoZXJlIGlzIGRlbW9uc3RyYWJsZSB2YWx1ZSBpbiBkb2luZyBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCwKLWRubCBsZXQncyBub3QuCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX0VOVklST05NRU5ULAotWwotQUNfQVJHX0VOQUJMRShzaW0tZW52aXJvbm1lbnQsCi1bICAtLWVuYWJsZS1zaW0tZW52aXJvbm1lbnQ9ZW52aXJvbm1lbnQJU3BlY2lmeSBtaXhlZCwgdXNlciwgdmlydHVhbCBvciBvcGVyYXRpbmcgZW52aXJvbm1lbnQuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIGFsbCB8IEFMTCkgICAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIjs7Ci0gIHVzZXIgfCBVU0VSKSAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VVNFUl9FTlZJUk9OTUVOVCI7OwotICB2aXJ0dWFsIHwgVklSVFVBTCkgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPVZJUlRVQUxfRU5WSVJPTk1FTlQiOzsKLSAgb3BlcmF0aW5nIHwgT1BFUkFUSU5HKSBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1PUEVSQVRJTkdfRU5WSVJPTk1FTlQiOzsKLSAgKikgICBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWVudmlyb25tZW50Iik7Ci0gICAgICAgc2ltX2Vudmlyb25tZW50PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW52aXJvbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBlbnZpcm9ubWVudCA9ICRzaW1fZW52aXJvbm1lbnQiIDY+JjEKLWZpXSwKLVtzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiXSlkbmwKLV0pCi1BQ19TVUJTVChzaW1fZW52aXJvbm1lbnQpCi0KLQotZG5sIFNwZWNpZnkgdGhlIGFsaWdubWVudCByZXN0cmljdGlvbnMgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCi1kbmwgV2l0aG91dCB0aGlzIG9wdGlvbiBhbGwgcG9zc2libGUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgYWNjb21tb2RhdGVkLgotZG5sIGFyZ1sxXSBpcyBoYXJkd2lyZWQgdGFyZ2V0IGFsaWdubWVudAotZG5sIGFyZ1syXSBpcyBkZWZhdWx0IHRhcmdldCBhbGlnbm1lbnQKLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fQUxJR05NRU5ULAotd2lyZV9hbGlnbm1lbnQ9IlskMV0iCi1kZWZhdWx0X2FsaWdubWVudD0iWyQyXSIKLVsKLUFDX0FSR19FTkFCTEUoc2ltLWFsaWdubWVudCwKLVsgIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQ9YWxpZ24JCVNwZWNpZnkgc3RyaWN0LCAgbm9uc3RyaWN0IG9yIGZvcmNlZCBhbGlnbm1lbnQgb2YgbWVtb3J5IGFjY2Vzc2VzLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OwotICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OwotICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OwotICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLQkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgICBlbHNlCi0JICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgZWxzZQotICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiKTsgc2ltX2FsaWdubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKLWZpXSwKLVtpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmldKWRubAotXSlkbmwKLUFDX1NVQlNUKHNpbV9hbGlnbm1lbnQpCi0KLQotZG5sIENvbmRpdGlvbmFsbHkgY29tcGlsZSBpbiBhc3NlcnRpb24gc3RhdGVtZW50cy4KLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fQVNTRVJULAotWwotQUNfQVJHX0VOQUJMRShzaW0tYXNzZXJ0LAotWyAgLS1lbmFibGUtc2ltLWFzc2VydAkJCVNwZWNpZnkgd2hldGhlciB0byBwZXJmb3JtIHJhbmRvbSBhc3NlcnRpb25zLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9hc3NlcnQ9Ii1EV0lUSF9BU1NFUlQ9MSI7OwotICBubykJc2ltX2Fzc2VydD0iLURXSVRIX0FTU0VSVD0wIjs7Ci0gICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWFzc2VydCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX2Fzc2VydD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Fzc2VydCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYXNzZXJ0IGZsYWdzID0gJHNpbV9hc3NlcnQiIDY+JjEKLWZpXSxbc2ltX2Fzc2VydD0iIl0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX2Fzc2VydCkKLQotCi0KLWRubCAtLWVuYWJsZS1zaW0tYml0c2l6ZSBpcyBmb3IgZGV2ZWxvcGVycyBvZiB0aGUgc2ltdWxhdG9yCi1kbmwgSXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgQklUUyBpbiB0aGUgdGFyZ2V0LgotZG5sIGFyZ1sxXSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkCi1kbmwgYXJnWzJdIGlzIHRoZSBudW1iZXIgYXNzaWduZWQgdG8gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0Ci1kbmwgYXJnWzNdIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBhZGRyZXNzCi1kbmwgYXJnWzRdIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBPcGVuRmlybXdhcmUgY2VsbC4KLWRubCBGSVhNRTogdGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgb2J0YWluZWQgZnJvbSBiZmQvYXJjaHVyZQotQUNfREVGVU4oU0lNX0FDX09QVElPTl9CSVRTSVpFLAotd2lyZV93b3JkX2JpdHNpemU9IlskMV0iCi13aXJlX3dvcmRfbXNiPSJbJDJdIgotd2lyZV9hZGRyZXNzX2JpdHNpemU9IlskM10iCi13aXJlX2NlbGxfYml0c2l6ZT0iWyQ0XSIKLVtBQ19BUkdfRU5BQkxFKHNpbS1iaXRzaXplLAotWyAgLS1lbmFibGUtc2ltLWJpdHNpemU9TgkJU3BlY2lmeSB0YXJnZXQgYml0c2l6ZSAoMzIgb3IgNjQpLl0sCi1bc2ltX2JpdHNpemU9Ci1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIDY0LDYzIHwgNjQsNjMsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTYzIjs7Ci0gIDMyLDMxIHwgMzIsMzEsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTMxIjs7Ci0gIDY0LDAgfCA2NCwwLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIjs7Ci0gIDMyLDAgfCA2NCwwLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIjs7Ci0gIDMyKSBpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHggLWEgeCIkd2lyZV93b3JkX21zYiIgIT0geDA7IHRoZW4KLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MzEiCi0gICAgICBlbHNlCi0gICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiCi0gICAgICBmaSA7OwotICA2NCkgaWYgdGVzdCB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4IC1hIHgiJHdpcmVfd29yZF9tc2IiICE9IHgwOyB0aGVuCi0gICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTYzIgotICAgICAgZWxzZQotICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIgotICAgICAgZmkgOzsKLSAgKikgIEFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIpIDs7Ci1lc2FjCi0jIGFkZHJlc3MgYml0c2l6ZQotdG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bWzAtOV1dKiwqW1swLTldXSosKi8vImAKLWNhc2UgeCIke3RtcH0iIGluCi0gIHggKSA7OwotICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0zMiIgOzsKLSAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9NjQiIDs7Ci0gICogKSBBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiBhZGRyZXNzIHNpemUgJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IikgOzsKLWVzYWMKLSMgY2VsbCBiaXRzaXplCi10bXA9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvXltbMC05XV0qLCpbWzAtOSpdXSosKltbMC05XV0qLCovLyJgCi1jYXNlIHgiJHt0bXB9IiBpbgotICB4ICkgOzsKLSAgeDMyIHwgeDMyLCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9MzIiIDs7Ci0gIHg2NCB8IHg2NCwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPTY0IiA7OwotICAqICkgQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gY2VsbCBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIpIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2JpdHNpemUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGJpdHNpemUgZmxhZ3MgPSAkc2ltX2JpdHNpemUiIDY+JjEKLWZpXSwKLVtzaW1fYml0c2l6ZT0iIgotaWYgdGVzdCB4IiR3aXJlX3dvcmRfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSR3aXJlX3dvcmRfYml0c2l6ZSIKLWZpCi1pZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPSR3aXJlX3dvcmRfbXNiIgotZmkKLWlmIHRlc3QgeCIkd2lyZV9hZGRyZXNzX2JpdHNpemUiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0kd2lyZV9hZGRyZXNzX2JpdHNpemUiCi1maQotaWYgdGVzdCB4IiR3aXJlX2NlbGxfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPSR3aXJlX2NlbGxfYml0c2l6ZSIKLWZpXSlkbmwKLV0pCi1BQ19TVUJTVChzaW1fYml0c2l6ZSkKLQotCi0KLWRubCAtLWVuYWJsZS1zaW0tZW5kaWFuPXt5ZXMsbm8sYmlnLGxpdHRsZX0gaXMgZm9yIHNpbXVsYXRvcnMKLWRubCB0aGF0IHN1cHBvcnQgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLWRubCBhcmdbMV0gaXMgaGFyZHdpcmVkIHRhcmdldCBlbmRpYW5uZXNzLgotZG5sIGFyZ1syXSBpcyBkZWZhdWx0IHRhcmdldCBlbmRpYW5uZXNzLgotQUNfREVGVU4oU0lNX0FDX09QVElPTl9FTkRJQU4sCi1bCi13aXJlX2VuZGlhbj0iWyQxXSIKLWRlZmF1bHRfZW5kaWFuPSJbJDJdIgotQUNfQVJHX0VOQUJMRShzaW0tZW5kaWFuLAotWyAgLS1lbmFibGUtc2ltLWVuZGlhbj1lbmRpYW4JCVNwZWNpZnkgdGFyZ2V0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKLSAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gIHllcykJIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0JIGVsc2UKLSAgICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgotCSAgIGVsc2UKLQkgICAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICBubykJIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgZWxzZQotCSAgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSAgIGVsc2UKLQkgICAgIGVjaG8gIk5vIGRlZmF1bHQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9MCIKLQkgICBmaQotCSBmaTs7Ci0gICopCSBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIpOyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmldLAotW2lmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLSAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi1lbHNlCi0gIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLSAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0gIGVsc2UKLSAgICBzaW1fZW5kaWFuPQotICBmaQotZmldKWRubAotXSkKLUFDX1NVQlNUKHNpbV9lbmRpYW4pCi0KLQotZG5sIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yIHdoZW4KLWRubCB0aGV5IGZpbmQgdGhhdCBBQ19DX0JJR0VORElBTiBkb2VzIG5vdCBmdW5jdGlvbiBjb3JyZWN0bHkKLWRubCAoZm9yIGluc3RhbmNlIGluIGEgY2FuYWRpYW4gY3Jvc3MpCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX0hPU1RFTkRJQU4sCi1bCi1BQ19BUkdfRU5BQkxFKHNpbS1ob3N0ZW5kaWFuLAotWyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OwotICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICAqKQkgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIik7IHNpbV9ob3N0ZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQotZmldLFsKLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEFDX0NfQklHRU5ESUFOCi0gIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKLSAgZWxzZQotICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCi0gIGZpCi1lbHNlCi0gIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCi1maV0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX2hvc3RlbmRpYW4pCi0KLQotZG5sIC0tZW5hYmxlLXNpbS1mbG9hdCBpcyBmb3IgZGV2ZWxvcGVycyBvZiB0aGUgc2ltdWxhdG9yCi1kbmwgSXQgc3BlY2lmaWVzIHRoZSBwcmVzZW5jZSBvZiBoYXJkd2FyZSBmbG9hdGluZyBwb2ludAotZG5sIEFuZCBvcHRpb25hbGx5IHRoZSBiaXRzaXplIG9mIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLWRubCBhcmdbMV0gc3BlY2lmaWVzIHRoZSBwcmVzZW5jZSAob3IgYWJzZW5jZSkgb2YgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKLWRubCBhcmdbMl0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX0ZMT0FULAotWwotZGVmYXVsdF9zaW1fZmxvYXQ9IlskMV0iCi1kZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplPSJbJDJdIgotQUNfQVJHX0VOQUJMRShzaW0tZmxvYXQsCi1bICAtLWVuYWJsZS1zaW0tZmxvYXQJCQlTcGVjaWZ5IHRoYXQgdGhlIHRhcmdldCBwcm9jZXNzb3IgaGFzIGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCBoYXJkKQlzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1IQVJEX0ZMT0FUSU5HX1BPSU5UIjs7Ci0gIG5vIHwgc29mdCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9U09GVF9GTE9BVElOR19QT0lOVCI7OwotICAzMikgICAgICAgICAgIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPUhBUkRfRkxPQVRJTkdfUE9JTlQgLURXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFPTMyIjs7Ci0gIDY0KSAgICAgICAgICAgc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCAtRFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkU9NjQiOzsKLSAgKikJCUFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tZmxvYXQiKTsgc2ltX2Zsb2F0PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZmxvYXQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGZsb2F0IGZsYWdzID0gJHNpbV9mbG9hdCIgNj4mMQotZmldLFsKLXNpbV9mbG9hdD0KLWlmIHRlc3QgeCIke2RlZmF1bHRfc2ltX2Zsb2F0fSIgIT0geCIiOyB0aGVuCi0gIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPSR7ZGVmYXVsdF9zaW1fZmxvYXR9IgotZmkKLWlmIHRlc3QgeCIke2RlZmF1bHRfc2ltX2Zsb2F0X2JpdHNpemV9IiAhPSB4IiI7IHRoZW4KLSAgc2ltX2Zsb2F0PSIkc2ltX2Zsb2F0IC1EV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRT0ke2RlZmF1bHRfc2ltX2Zsb2F0X2JpdHNpemV9IgotZmkKLV0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX2Zsb2F0KQotCi0KLWRubCBUaGUgYXJndW1lbnQgaXMgdGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSBpZiBub25lIGlzIHNwZWNpZmllZC4KLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fU0NBQ0hFLAotWwotZGVmYXVsdF9zaW1fc2NhY2hlPSJpZmVsc2UoWyQxXSwsMCxbJDFdKSIKLUFDX0FSR19FTkFCTEUoc2ltLXNjYWNoZSwKLVsgIC0tZW5hYmxlLXNpbS1zY2FjaGU9c2l6ZQkJU3BlY2lmeSBzaW11bGF0b3IgZXhlY3V0aW9uIGNhY2hlIHNpemUuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iOzsKLSAgbm8pCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9MCIgOzsKLSAgW1swLTldXSopIHNpbV9jYWNoZT0ke2VuYWJsZXZhbH07OwotICAqKQlBQ19NU0dfRVJST1IoIkJhZCB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc2NhY2hlIik7Ci0Jc2ltX3NjYWNoZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NjYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2NhY2hlIHNpemUgPSAkc2ltX3NjYWNoZSIgNj4mMQotZmldLFtzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPSR7ZGVmYXVsdF9zaW1fc2NhY2hlfSJdKQotXSkKLUFDX1NVQlNUKHNpbV9zY2FjaGUpCi0KLQotZG5sIFRoZSBhcmd1bWVudCBpcyB0aGUgZGVmYXVsdCBtb2RlbCBpZiBub25lIGlzIHNwZWNpZmllZC4KLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fREVGQVVMVF9NT0RFTCwKLVsKLWRlZmF1bHRfc2ltX2RlZmF1bHRfbW9kZWw9ImlmZWxzZShbJDFdLCwwLFskMV0pIgotQUNfQVJHX0VOQUJMRShzaW0tZGVmYXVsdC1tb2RlbCwKLVsgIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPW1vZGVsCVNwZWNpZnkgZGVmYXVsdCBtb2RlbCB0byBzaW11bGF0ZS5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKSBBQ19NU0dfRVJST1IoIk1pc3NpbmcgYXJndW1lbnQgdG8gLS1lbmFibGUtc2ltLWRlZmF1bHQtbW9kZWwiKTs7Ci0gICopCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0nXCIke2VuYWJsZXZhbH1cIiciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZGVmYXVsdCBtb2RlbCA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQotZmldLFtzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsfVwiJyJdKQotXSkKLUFDX1NVQlNUKHNpbV9kZWZhdWx0X21vZGVsKQotCi0KLWRubCAtLWVuYWJsZS1zaW0taGFyZHdhcmUgaXMgZm9yIHVzZXJzIG9mIHRoZSBzaW11bGF0b3IKLWRubCBhcmdbMV0gRW5hYmxlIHNpbS1odyBieSBkZWZhdWx0PyAoInllcyIgb3IgIm5vIikKLWRubCBhcmdbMl0gaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBkZXZpY2VzIHRoYXQgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCi1kbmwgYXJnWzNdIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXh0cmEgdGFyZ2V0IHNwZWNpZmljIGRldmljZXMuCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX0hBUkRXQVJFLAotWwotaWYgdGVzdCB4IlskMV0iID0geCJ5ZXMiOyB0aGVuCi0gIHNpbV9od19wPXllcwotZWxzZQotICBzaW1faHdfcD1ubwotZmkKLWlmIHRlc3QgIlskMl0iOyB0aGVuCi0gIGhhcmR3YXJlPSJjb3JlIHBhbCBnbHVlIgotZWxzZQotICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSBbJDNdIgotZmkKLXNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgotc2ltX2h3PSIkaGFyZHdhcmUiCi1zaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSBgZWNobyAkc2ltX2h3IHwgc2VkIC1lICdzL1woW1teIF1dW1teIF1dKlwpL2R2LVwxLm8vZydgIgotQUNfQVJHX0VOQUJMRShzaW0taGFyZHdhcmUsCi1bICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9TElTVAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLl0sCi1bCi1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2h3X3A9eWVzOzsKLSAgbm8pCXNpbV9od19wPW5vOzsKLSAgLCopICAgc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iJHtoYXJkd2FyZX0gYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCI7OwotICAqLCkgICBzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSJgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgICR7aGFyZHdhcmV9Ijs7Ci0gICopCXNpbV9od19wPXllczsgaGFyZHdhcmU9ImBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AiJyc7OwotZXNhYwotaWYgdGVzdCAiJHNpbV9od19wIiAhPSB5ZXM7IHRoZW4KLSAgc2ltX2h3X29ianM9Ci0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0wIgotICBzaW1faHc9Ci1lbHNlCi0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgotICAjIHJlbW92ZSBkdXBsaWNhdGVzCi0gIHNpbV9odz0iIgotICBzaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSIKLSAgZm9yIGkgaW4geCAkaGFyZHdhcmUgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgICB4KSA7OwotICAgICAgKiIgJGkgIiopIDs7Ci0gICAgICAqKSBzaW1faHc9IiRzaW1faHcgJGkiIDsgc2ltX2h3X29ianM9IiRzaW1faHdfb2JqcyBkdi0kaS5vIjs7Ci0gICAgZXNhYwotICBkb25lCi1maQotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0ICIkc2ltX2h3X3AiID0gInllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgotZmldLFsKLWlmIHRlc3QgIiRzaW1faHdfcCIgIT0geWVzOyB0aGVuCi0gIHNpbV9od19vYmpzPQotICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MCIKLSAgc2ltX2h3PQotZmkKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgotZmldKWRubAotXSkKLUFDX1NVQlNUKHNpbV9od19jZmxhZ3MpCi1BQ19TVUJTVChzaW1faHdfb2JqcykKLUFDX1NVQlNUKHNpbV9odykKLQotCi1kbmwgLS1lbmFibGUtc2ltLWlubGluZSBpcyBmb3IgdXNlcnMgdGhhdCB3aXNoIHRvIHJhbXAgdXAgdGhlIHNpbXVsYXRvcidzCi1kbmwgcGVyZm9ybWFuY2UgYnkgaW5saW5pbmcgZnVuY3Rpb25zLgotZG5sIEd1YXJhbnRlZSB0aGF0IHVuY29uZmlndXJlZCBzaW11bGF0b3JzIGRvIG5vdCBkbyBhbnkgaW5saW5pbmcKLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fSU5MSU5FLAotWwotZGVmYXVsdF9zaW1faW5saW5lPSJpZmVsc2UoWyQxXSwsLC1EREVGQVVMVF9JTkxJTkU9WyQxXSkiCi1BQ19BUkdfRU5BQkxFKHNpbS1pbmxpbmUsCi1bICAtLWVuYWJsZS1zaW0taW5saW5lPWlubGluZXMJCVNwZWNpZnkgd2hpY2ggZnVuY3Rpb25zIHNob3VsZCBiZSBpbmxpbmVkLl0sCi1bc2ltX2lubGluZT0iIgotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLSAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKLSAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9DX0lOTElORSI7OwotICAxKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1JTkxJTkVfTE9DQUxTIjs7Ci0gICopIGZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotICAgICAgIG5ld19mbGFnPSIiCi0gICAgICAgY2FzZSAiJHgiIGluCi0JICpfSU5MSU5FPSopCW5ld19mbGFnPSItRCR4Ijs7Ci0JICo9KikJCW5ld19mbGFnPWBlY2hvICIkeCIgfCBzZWQgLWUgInMvPS9fSU5MSU5FPS8iIC1lICJzL14vLUQvImA7OwotCSAqX0lOTElORSkJbmV3X2ZsYWc9Ii1EJHg9QUxMX0NfSU5MSU5FIjs7Ci0JICopCQluZXdfZmxhZz0iLUQkeCIiX0lOTElORT1BTExfQ19JTkxJTkUiOzsKLSAgICAgICBlc2FjCi0gICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgotCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCi0gICAgICAgZWxzZQotCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCi0gICAgICAgZmkKLSAgICAgZG9uZTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLWZpXSxbCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCi0gICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgotICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLSAgICBmaQotICBlbHNlCi0gICAgc2ltX2lubGluZT0iIgotICBmaQotZWxzZQotICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi1maV0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX2lubGluZSkKLQotCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX1BBQ0tBR0VTLAotWwotQUNfQVJHX0VOQUJMRShzaW0tcGFja2FnZXMsCi1bICAtLWVuYWJsZS1zaW0tcGFja2FnZXM9bGlzdAkJU3BlY2lmeSB0aGUgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLl0sCi1bcGFja2FnZXM9ZGlza2xhYmVsCi1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJOzsKLSAgbm8pCUFDX01TR19FUlJPUigiTGlzdCBvZiBwYWNrYWdlcyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgLS1lbmFibGUtc2ltLXBhY2thZ2VzIik7IHBhY2thZ2VzPSIiOzsKLSAgLCopICAgcGFja2FnZXM9IiR7cGFja2FnZXN9JHtlbmFibGV2YWx9Ijs7Ci0gICosKSAgIHBhY2thZ2VzPSIke2VuYWJsZXZhbH0ke3BhY2thZ2VzfSI7OwotICAqKQlwYWNrYWdlcz0iJHtlbmFibGV2YWx9IicnOzsKLWVzYWMKLXNpbV9wa19zcmM9YGVjaG8gJHBhY2thZ2VzIHwgc2VkIC1lICdzLywvLmMgcGtfL2cnIC1lICdzL14vcGtfLycgLWUgJ3MvJC8uYy8nYAotc2ltX3BrX29iaj1gZWNobyAkc2ltX3BrX3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkcGFja2FnZXMiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHBhY2thZ2VzIHRvICRzaW1fcGtfc3JjLCAkc2ltX3BrX29iaiIKLWZpXSxbcGFja2FnZXM9ZGlza2xhYmVsCi1zaW1fcGtfc3JjPWBlY2hvICRwYWNrYWdlcyB8IHNlZCAtZSAncy8sLy5jIHBrXy9nJyAtZSAncy9eL3BrXy8nIC1lICdzLyQvLmMvJ2AKLXNpbV9wa19vYmo9YGVjaG8gJHNpbV9wa19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHBhY2thZ2VzIHRvICRzaW1fcGtfc3JjLCAkc2ltX3BrX29iaiIKLWZpXSlkbmwKLV0pCi1BQ19TVUJTVChzaW1fcGFja2FnZXMpCi0KLQotQUNfREVGVU4oU0lNX0FDX09QVElPTl9SRUdQQVJNLAotWwotQUNfQVJHX0VOQUJMRShzaW0tcmVncGFybSwKLVsgIC0tZW5hYmxlLXNpbS1yZWdwYXJtPW5yLXBhcm0JCVBhc3MgcGFyYW1ldGVycyBpbiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbiB0aGUgc3RhY2sgLSB4ODYvR0NDIHNwZWNpZmljLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAwKnwxKnwyKnwzKnw0Knw1Knw2Knw3Knw4Knw5Kikgc2ltX3JlZ3Bhcm09Ii1EV0lUSF9SRUdQQVJNPSR7ZW5hYmxldmFsfSI7OwotICBubykgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltX3JlZ3Bhcm09IiIgOzsKLSAgeWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0zIjs7Ci0gICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1yZWdwYXJtIik7IHNpbV9yZWdwYXJtPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVncGFybSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcmVncGFybSBmbGFncyA9ICRzaW1fcmVncGFybSIgNj4mMQotZmldLFtzaW1fcmVncGFybT0iIl0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX3JlZ3Bhcm0pCi0KLQotQUNfREVGVU4oU0lNX0FDX09QVElPTl9SRVNFUlZFRF9CSVRTLAotWwotZGVmYXVsdF9zaW1fcmVzZXJ2ZWRfYml0cz0iaWZlbHNlKFskMV0sLDEsWyQxXSkiCi1BQ19BUkdfRU5BQkxFKHNpbS1yZXNlcnZlZC1iaXRzLAotWyAgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMJCVNwZWNpZnkgd2hldGhlciB0byBjaGVjayByZXNlcnZlZCBiaXRzIGluIGluc3RydWN0aW9uLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0xIjs7Ci0gIG5vKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OwotICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fcmVzZXJ2ZWRfYml0cz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Jlc2VydmVkX2JpdHMiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHJlc2VydmVkIGZsYWdzID0gJHNpbV9yZXNlcnZlZF9iaXRzIiA2PiYxCi1maV0sW3NpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0ke2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHN9Il0pZG5sCi1dKQotQUNfU1VCU1Qoc2ltX3Jlc2VydmVkX2JpdHMpCi0KLQotQUNfREVGVU4oU0lNX0FDX09QVElPTl9TTVAsCi1bCi1kZWZhdWx0X3NpbV9zbXA9ImlmZWxzZShbJDFdLCw1LFskMV0pIgotQUNfQVJHX0VOQUJMRShzaW0tc21wLAotWyAgLS1lbmFibGUtc2ltLXNtcD1uCQkJU3BlY2lmeSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0byBjb25maWd1cmUgZm9yIChkZWZhdWx0ICR7ZGVmYXVsdF9zaW1fc21wfSkuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NtcD0iLURXSVRIX1NNUD01IiA7IHNpbV9pZ2VuX3NtcD0iLU4gNSI7OwotICBubykJc2ltX3NtcD0iLURXSVRIX1NNUD0wIiA7IHNpbV9pZ2VuX3NtcD0iLU4gMCI7OwotICAqKQlzaW1fc21wPSItRFdJVEhfU01QPSRlbmFibGV2YWwiIDsgc2ltX2lnZW5fc21wPSItTiAkZW5hYmxldmFsIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NtcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKLWZpXSxbc2ltX3NtcD0iLURXSVRIX1NNUD0ke2RlZmF1bHRfc2ltX3NtcH0iIDsgc2ltX2lnZW5fc21wPSItTiAke2RlZmF1bHRfc2ltX3NtcH0iCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKLWZpXSlkbmwKLV0pCi1BQ19TVUJTVChzaW1fc21wKQotCi0KLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fU1REQ0FMTCwKLVsKLUFDX0FSR19FTkFCTEUoc2ltLXN0ZGNhbGwsCi1bICAtLWVuYWJsZS1zaW0tc3RkY2FsbD10eXBlCQlVc2UgYW4gYWx0ZXJuYXRpdmUgZnVuY3Rpb24gY2FsbC9yZXR1cm4gbWVjaGFuaXNtIC0geDg2L0dDQyBzcGVjaWZpYy5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCQlzaW1fc3RkY2FsbD0iIiA7OwotICBzdGQqKQkJc2ltX3N0ZGNhbGw9Ii1EV0lUSF9TVERDQUxMPTEiOzsKLSAgeWVzKQkJc2ltX3N0ZGNhbGw9Ii1EV0lUSF9TVERDQUxMPTEiOzsKLSAgKikgICBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLXN0ZGNhbGwiKTsgc2ltX3N0ZGNhbGw9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRjYWxsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBmdW5jdGlvbiBjYWxsIGZsYWdzID0gJHNpbV9zdGRjYWxsIiA2PiYxCi1maV0sW3NpbV9zdGRjYWxsPSIiXSlkbmwKLV0pCi1BQ19TVUJTVChzaW1fc3RkY2FsbCkKLQotCi1BQ19ERUZVTihTSU1fQUNfT1BUSU9OX1hPUl9FTkRJQU4sCi1bCi1kZWZhdWx0X3NpbV94b3JfZW5kaWFuPSJpZmVsc2UoWyQxXSwsOCxbJDFdKSIKLUFDX0FSR19FTkFCTEUoc2ltLXhvci1lbmRpYW4sCi1bICAtLWVuYWJsZS1zaW0teG9yLWVuZGlhbj1uCQlTcGVjaWZ5IG51bWJlciBieXRlcyBpbnZvbHZlZCBpbiBYT1IgYmktZW5kaWFuIG1vZGUgKGRlZmF1bHQgJHtkZWZhdWx0X3NpbV94b3JfZW5kaWFufSkuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3hvcl9lbmRpYW49Ii1EV0lUSF9YT1JfRU5ESUFOPTgiOzsKLSAgbm8pCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj0wIjs7Ci0gICopCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj0kZW5hYmxldmFsIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3hvcl9lbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHhvci1lbmRpYW4gZmxhZyA9ICRzaW1feG9yX2VuZGlhbiIgNj4mMQotZmldLFtzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49JHtkZWZhdWx0X3NpbV94b3JfZW5kaWFufSJdKWRubAotXSkKLUFDX1NVQlNUKHNpbV94b3JfZW5kaWFuKQotCi0KLWRubCAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBpcyBmb3IgZGV2ZWxvcGVycyBvZiB0aGUgc2ltdWxhdG9yLgotZG5sIGl0IGVuYWJsZXMgZXh0cmEgR0NDIHNwZWNpZmljIHdhcm5pbmdzLgotQUNfREVGVU4oU0lNX0FDX09QVElPTl9XQVJOSU5HUywKLVsKLUFDX0FSR19FTkFCTEUoYnVpbGQtd2FybmluZ3MsCi1bICAtLWVuYWJsZS1idWlsZC13YXJuaW5nc1s9TElTVF0JCUVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzXSwKLVtidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7Ci0gICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7Ci0gICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCi1maQotV0FSTl9DRkxBR1M9IiIKLVdFUlJPUl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotdGhlbgotICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKLSAgIyBjb21waWxlZCB3aXRoIGl0IGVuYWJsZWQuCi0gIGZvciB3IGluICR7YnVpbGRfd2FybmluZ3N9OyBkbwotICAgIGNhc2UgJHcgaW4KLSAgICAtV2VyciopIFdFUlJPUl9DRkxBR1M9LVdlcnJvciA7OwotICAgICopIFdBUk5fQ0ZMQUdTPSIke1dBUk5fQ0ZMQUdTfSAkdyIKLSAgICBlc2FjCi0gIGRvbmUKLWZpXSxbYnVpbGRfd2FybmluZ3M9IiJdKWRubAotXSkKLUFDX1NVQlNUKFdBUk5fQ0ZMQUdTKQotQUNfU1VCU1QoV0VSUk9SX0NGTEFHUykKLQotCi1kbmwgR2VuZXJhdGUgdGhlIE1ha2VmaWxlIGluIGEgdGFyZ2V0IHNwZWNpZmljIGRpcmVjdG9yeS4KLWRubCBTdWJzdGl0dXRpb25zIGFyZW4ndCBwZXJmb3JtZWQgb24gdGhlIGZpbGUgaW4gQUNfU1VCU1RfRklMRSwKLWRubCBzbyB0aGlzIGlzIGEgY292ZXIgbWFjcm8gdG8gdHVjayB0aGUgZGV0YWlscyBhd2F5IG9mIGhvdyB3ZSBjb3BlLgotZG5sIFdlIGNvcGUgYnkgaGF2aW5nIGF1dG9jb25mIGdlbmVyYXRlIHR3byBmaWxlcyBhbmQgdGhlbiBtZXJnZSB0aGVtIGludG8KLWRubCBvbmUgYWZ0ZXJ3YXJkcy4gIFRoZSB0d28gcGllY2VzIG9mIHRoZSBjb21tb24gZnJhZ21lbnQgYXJlIGluc2VydGVkIGludG8KLWRubCB0aGUgdGFyZ2V0J3MgZnJhZ21lbnQgYXQgdGhlIGFwcHJvcHJpYXRlIHBvaW50cy4KLQotQUNfREVGVU4oU0lNX0FDX09VVFBVVCwKLVsKLUFDX0xJTktfRklMRVMoJHNpbV9saW5rX2ZpbGVzLCAkc2ltX2xpbmtfbGlua3MpCi1BQ19PVVRQVVQoTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4sCi1bY2FzZSAieCRDT05GSUdfRklMRVMiIGluCi0geE1ha2VmaWxlKikKLSAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKLSAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKLSAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKLQktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCi0JPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKLSAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAotICAgOzsKLSBlc2FjCi0gY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotXSkKLV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMpCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFkpCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMpCi0gICAgZmkKLSAgZmldKQotCi0KLWRubCAtLWVuYWJsZS1jZ2VuLW1haW50IHN1cHBvcnQKLUFDX0RFRlVOKFNJTV9BQ19PUFRJT05fQ0dFTl9NQUlOVCwKLVsKLWNnZW5fbWFpbnQ9bm8KLWRubCBEZWZhdWx0IGlzIHRvIHVzZSBvbmUgaW4gYnVpbGQgdHJlZS4KLWNnZW49Z3VpbGUKLWNnZW5kaXI9JyQoc3JjZGlyKS8uLi8uLi9jZ2VuJwotZG5sIEhhdmluZyAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgdGFrZSBhcmd1bWVudHMgaXMgYW5vdGhlciB3YXkgdG8gZ28uCi1kbmwgPz8/IE9uZSBjYW4gYXJndWUgLS13aXRoIGlzIG1vcmUgYXBwcm9wcmlhdGUgaWYgb25lIHdhbnRzIHRvIHNwZWNpZnkKLWRubCBhIGRpcmVjdG9yeSBuYW1lLCBidXQgd2hhdCB3ZSdyZSBkb2luZyBoZXJlIGlzIGFuIGVuYWJsZS9kaXNhYmxlIGtpbmQKLWRubCBvZiB0aGluZyBhbmQgc3BlY2lmeWluZyBib3RoIC0tZW5hYmxlIGFuZCAtLXdpdGggaXMga2x1bmt5LgotZG5sIElmIHlvdSByZWVlbHkgd2FudCB0aGlzIHRvIGJlIC0td2l0aCwgZ28gYWhlYWQgYW5kIGNoYW5nZSBpdC4KLUFDX0FSR19FTkFCTEUoY2dlbi1tYWludCwKLVsgIC0tZW5hYmxlLWNnZW4tbWFpbnRbPURJUl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQljZ2VuX21haW50PXllcyA7OwotICBubykJY2dlbl9tYWludD1ubyA7OwotICAqKQotCSMgYXJndW1lbnQgaXMgY2dlbiBpbnN0YWxsIGRpcmVjdG9yeSAobm90IGltcGxlbWVudGVkIHlldCkuCi0JIyBIYXZpbmcgYSBgc2hhcmUnIGRpcmVjdG9yeSBtaWdodCBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgLnNjbSwKLQkjIC5jcHUsIGV0Yy4gZmlsZXMuCi0JY2dlbmRpcj0ke2NnZW5fbWFpbnR9L2xpYi9jZ2VuCi0JY2dlbj1ndWlsZQotCTs7Ci1lc2FjXSlkbmwKLWRubCBBTV9DT05ESVRJT05BTChDR0VOX01BSU5ULCB0ZXN0IHgke2NnZW5fbWFpbnR9ICE9IHhubykKLWlmIHRlc3QgeCR7Y2dlbl9tYWludH0gIT0geG5vIDsgdGhlbgotICBDR0VOX01BSU5UPScnCi1lbHNlCi0gIENHRU5fTUFJTlQ9JyMnCi1maQotQUNfU1VCU1QoQ0dFTl9NQUlOVCkKLUFDX1NVQlNUKGNnZW5kaXIpCi1BQ19TVUJTVChjZ2VuKQotXSkKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2FsbGJhY2suYyBiL3NpbS9jb21tb24vY2FsbGJhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhY2NhMC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NhbGxiYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTAgKzAsMCBAQAotLyogUmVtb3RlIHRhcmdldCBjYWxsYmFjayByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSBmb3IgdGFyZ2V0cyB0byB0YWxrIHRvIHRoZSBob3N0IE9TCi0gICBsZXZlbC4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInRhcmctdmFscy5oIgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qID8/PyBzaW1fY2JfcHJpbnRmIHNob3VsZCBiZSBjYl9wcmludGYsIGJ1dCB1bnRpbCB0aGUgY2FsbGJhY2sgc3VwcG9ydCBpcwotICAgYnJva2VuIG91dCBvZiB0aGUgc2ltdWxhdG9yIGRpcmVjdG9yeSwgdGhlc2UgYXJlIGhlcmUgdG8gbm90IHJlcXVpcmUKLSAgIHNpbS11dGlscy5oLiAgKi8KLXZvaWQgc2ltX2NiX3ByaW50ZiBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci12b2lkIHNpbV9jYl9lcHJpbnRmIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotZXh0ZXJuIENCX1RBUkdFVF9ERUZTX01BUCBjYl9pbml0X3N5c2NhbGxfbWFwW107Ci1leHRlcm4gQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfZXJybm9fbWFwW107Ci1leHRlcm4gQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfb3Blbl9tYXBbXTsKLQotZXh0ZXJuIGludCBzeXN0ZW0gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQgb3NfaW5pdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLXN0YXRpYyBpbnQgb3Nfc2h1dGRvd24gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci1zdGF0aWMgaW50IG9zX3VubGluayBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGxvbmcgb3NfdGltZSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOwotc3RhdGljIGludCBvc19zeXN0ZW0gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgb3NfcmVuYW1lIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgb3Nfd3JpdGVfc3Rkb3V0IFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9zX2ZsdXNoX3N0ZG91dCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLXN0YXRpYyBpbnQgb3Nfd3JpdGVfc3RkZXJyIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9zX2ZsdXNoX3N0ZGVyciBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLXN0YXRpYyBpbnQgb3Nfd3JpdGUgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IG9zX3JlYWRfc3RkaW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBvc19yZWFkIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBvc19vcGVuIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgb3NfbHNlZWsgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcsIGludCkpOwotc3RhdGljIGludCBvc19pc2F0dHkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgb3NfZ2V0X2Vycm5vIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotc3RhdGljIGludCBvc19jbG9zZSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotc3RhdGljIHZvaWQgb3NfdnByaW50Zl9maWx0ZXJlZCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgb3NfZXZwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIG9zX2Vycm9yIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLXN0YXRpYyBpbnQgZmRtYXAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZmRiYWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgd3JhcCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBTZXQgdGhlIGNhbGxiYWNrIGNvcHkgb2YgZXJybm8gZnJvbSB3aGF0IHdlIHNlZSBub3cuICAqLwotCi1zdGF0aWMgaW50IAotd3JhcCAocCwgdmFsKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICBpbnQgdmFsOwotewotICBwLT5sYXN0X2Vycm5vID0gZXJybm87Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgRkQgcHJvdmlkZWQgaXMgb2suICBJZiBub3QsIHJldHVybiBub24temVybwotICAgYW5kIHNldCBlcnJuby4gKi8KLQotc3RhdGljIGludCAKLWZkYmFkIChwLCBmZCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgaW50IGZkOwotewotICBpZiAoZmQgPCAwIHx8IGZkID4gTUFYX0NBTExCQUNLX0ZEUyB8fCAhcC0+ZmRvcGVuW2ZkXSkKLSAgICB7Ci0gICAgICBwLT5sYXN0X2Vycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgCi1mZG1hcCAocCwgZmQpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIGludCBmZDsKLXsKLSAgcmV0dXJuIHAtPmZkbWFwW2ZkXTsKLX0KLQotc3RhdGljIGludCAKLW9zX2Nsb3NlIChwLCBmZCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgaW50IGZkOwotewotICBpbnQgcmVzdWx0OwotCi0gIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgcmVzdWx0ID0gd3JhcCAocCwgY2xvc2UgKGZkbWFwIChwLCBmZCkpKTsKLSAgaWYgKHJlc3VsdCA9PSAwICYmICFwLT5hbHdheXNvcGVuW2ZkXSkKLSAgICBwLT5mZG9wZW5bZmRdID0gMDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHRha2VuIGZyb20gZ2RiL3V0aWwuYzpub3RpY2VfcXVpdCgpIC0gc2hvdWxkIGJlIGluIGEgbGlicmFyeSAqLwotCi0KLSNpZiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkIChfTVNDX1ZFUikKLXN0YXRpYyBpbnQKLW9zX3BvbGxfcXVpdCAocCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLXsKLSNpZiBkZWZpbmVkKF9fR08zMl9fKQotICBpbnQga2JoaXQgKCk7Ci0gIGludCBnZXRrZXkgKCk7Ci0gIGlmIChrYmhpdCAoKSkKLSAgICB7Ci0gICAgICBpbnQgayA9IGdldGtleSAoKTsKLSAgICAgIGlmIChrID09IDEpCi0JewotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAoayA9PSAyKQotCXsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgc2ltX2NiX2VwcmludGYgKHAsICJDVFJMLUEgdG8gcXVpdCwgQ1RSTC1CIHRvIHF1aXQgaGFyZGVyXG4iKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX01TQ19WRVIpCi0gIC8qIE5CIC0gdGhpcyB3aWxsIG5vdCBjb21waWxlISAqLwotICBpbnQgayA9IHdpbjMycG9sbHF1aXQoKTsKLSAgaWYgKGsgPT0gMSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoayA9PSAyKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgb3NfcG9sbF9xdWl0IDAKLSNlbmRpZiAvKiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSAqLwotCi1zdGF0aWMgaW50IAotb3NfZ2V0X2Vycm5vIChwKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotewotICByZXR1cm4gY2JfaG9zdF90b190YXJnZXRfZXJybm8gKHAsIHAtPmxhc3RfZXJybm8pOwotfQotCi0KLXN0YXRpYyBpbnQgCi1vc19pc2F0dHkgKHAsIGZkKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICBpbnQgZmQ7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZmRiYWQgKHAsIGZkKTsKLSAgaWYgKHJlc3VsdCkKLSAgICByZXR1cm4gcmVzdWx0OwotICByZXN1bHQgPSB3cmFwIChwLCBpc2F0dHkgKGZkbWFwIChwLCBmZCkpKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IAotb3NfbHNlZWsgKHAsIGZkLCBvZmYsIHdheSkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgaW50IGZkOwotICAgICBsb25nIG9mZjsKLSAgICAgaW50IHdheTsKLXsKLSAgaW50IHJlc3VsdDsKLQotICByZXN1bHQgPSBmZGJhZCAocCwgZmQpOwotICBpZiAocmVzdWx0KQotICAgIHJldHVybiByZXN1bHQ7Ci0gIHJlc3VsdCA9IGxzZWVrIChmZG1hcCAocCwgZmQpLCBvZmYsIHdheSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgCi1vc19vcGVuIChwLCBuYW1lLCBmbGFncykKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9DQUxMQkFDS19GRFM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXAtPmZkb3BlbltpXSkKLQl7Ci0JICBpbnQgZiA9IG9wZW4gKG5hbWUsIGNiX3RhcmdldF90b19ob3N0X29wZW4gKHAsIGZsYWdzKSwgMDY0NCk7Ci0JICBpZiAoZiA8IDApCi0JICAgIHsKLQkgICAgICBwLT5sYXN0X2Vycm5vID0gZXJybm87Ci0JICAgICAgcmV0dXJuIGY7Ci0JICAgIH0KLQkgIHAtPmZkb3BlbltpXSA9IDE7Ci0JICBwLT5mZG1hcFtpXSA9IGY7Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgfQotICBwLT5sYXN0X2Vycm5vID0gRU1GSUxFOwotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgCi1vc19yZWFkIChwLCBmZCwgYnVmLCBsZW4pCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIGludCBmZDsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgbGVuOwotewotICBpbnQgcmVzdWx0OwotCi0gIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgcmVzdWx0ID0gd3JhcCAocCwgcmVhZCAoZmRtYXAgKHAsIGZkKSwgYnVmLCBsZW4pKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCAKLW9zX3JlYWRfc3RkaW4gKHAsIGJ1ZiwgbGVuKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBsZW47Ci17Ci0gIHJldHVybiB3cmFwIChwLCByZWFkICgwLCBidWYsIGxlbikpOwotfQotCi1zdGF0aWMgaW50IAotb3Nfd3JpdGUgKHAsIGZkLCBidWYsIGxlbikKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgaW50IGZkOwotICAgICBjb25zdCBjaGFyICpidWY7Ci0gICAgIGludCBsZW47Ci17Ci0gIGludCByZXN1bHQ7Ci0gIGludCByZWFsX2ZkOwotCi0gIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgcmVhbF9mZCA9IGZkbWFwIChwLCBmZCk7Ci0gIHN3aXRjaCAocmVhbF9mZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJlc3VsdCA9IHdyYXAgKHAsIHdyaXRlIChyZWFsX2ZkLCBidWYsIGxlbikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgcmVzdWx0ID0gcC0+d3JpdGVfc3Rkb3V0IChwLCBidWYsIGxlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICByZXN1bHQgPSBwLT53cml0ZV9zdGRlcnIgKHAsIGJ1ZiwgbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCAKLW9zX3dyaXRlX3N0ZG91dCAocCwgYnVmLCBsZW4pCi0gICAgIGhvc3RfY2FsbGJhY2sgKnAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqYnVmOwotICAgICBpbnQgbGVuOwotewotICByZXR1cm4gZndyaXRlIChidWYsIDEsIGxlbiwgc3Rkb3V0KTsKLX0KLQotc3RhdGljIHZvaWQKLW9zX2ZsdXNoX3N0ZG91dCAocCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQgCi1vc193cml0ZV9zdGRlcnIgKHAsIGJ1ZiwgbGVuKQotICAgICBob3N0X2NhbGxiYWNrICpwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbjsKLXsKLSAgcmV0dXJuIGZ3cml0ZSAoYnVmLCAxLCBsZW4sIHN0ZGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vc19mbHVzaF9zdGRlcnIgKHApCi0gICAgIGhvc3RfY2FsbGJhY2sgKnAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotCi1zdGF0aWMgaW50IAotb3NfcmVuYW1lIChwLCBmMSwgZjIpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKmYxOwotICAgICBjb25zdCBjaGFyICpmMjsKLXsKLSAgcmV0dXJuIHdyYXAgKHAsIHJlbmFtZSAoZjEsIGYyKSk7Ci19Ci0KLQotc3RhdGljIGludAotb3Nfc3lzdGVtIChwLCBzKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICByZXR1cm4gd3JhcCAocCwgc3lzdGVtIChzKSk7Ci19Ci0KLXN0YXRpYyBsb25nIAotb3NfdGltZSAocCwgdCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgbG9uZyAqdDsKLXsKLSAgcmV0dXJuIHdyYXAgKHAsIHRpbWUgKHQpKTsKLX0KLQotCi1zdGF0aWMgaW50IAotb3NfdW5saW5rIChwLCBmMSkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgY29uc3QgY2hhciAqZjE7Ci17Ci0gIHJldHVybiB3cmFwIChwLCB1bmxpbmsgKGYxKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW9zX3N0YXQgKHAsIGZpbGUsIGJ1ZikKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgLyogPz8/IFRoZXJlIGlzIGFuIGlzc3VlIG9mIHdoZW4gdG8gdHJhbnNsYXRlIHRvIHRoZSB0YXJnZXQgbGF5b3V0LgotICAgICBPbmUgY291bGQgZG8gdGhhdCBpbnNpZGUgdGhpcyBmdW5jdGlvbiwgb3Igb25lIGNvdWxkIGhhdmUgdGhlCi0gICAgIGNhbGxlciBkbyBpdC4gIEl0J3MgbW9yZSBmbGV4aWJsZSB0byBsZXQgdGhlIGNhbGxlciBkbyBpdCwgdGhvdWdoCi0gICAgIEknbSBub3Qgc3VyZSB0aGUgZmxleGliaWxpdHkgd2lsbCBldmVyIGJlIHVzZWZ1bC4gICovCi0gIHJldHVybiB3cmFwIChwLCBzdGF0IChmaWxlLCBidWYpKTsKLX0KLQotc3RhdGljIGludAotb3NfZnN0YXQgKHAsIGZkLCBidWYpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIGludCBmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgaWYgKGZkYmFkIChwLCBmZCkpCi0gICAgcmV0dXJuIC0xOwotICAvKiA/Pz8gVGhlcmUgaXMgYW4gaXNzdWUgb2Ygd2hlbiB0byB0cmFuc2xhdGUgdG8gdGhlIHRhcmdldCBsYXlvdXQuCi0gICAgIE9uZSBjb3VsZCBkbyB0aGF0IGluc2lkZSB0aGlzIGZ1bmN0aW9uLCBvciBvbmUgY291bGQgaGF2ZSB0aGUKLSAgICAgY2FsbGVyIGRvIGl0LiAgSXQncyBtb3JlIGZsZXhpYmxlIHRvIGxldCB0aGUgY2FsbGVyIGRvIGl0LCB0aG91Z2gKLSAgICAgSSdtIG5vdCBzdXJlIHRoZSBmbGV4aWJpbGl0eSB3aWxsIGV2ZXIgYmUgdXNlZnVsLiAgKi8KLSAgcmV0dXJuIHdyYXAgKHAsIGZzdGF0IChmZG1hcCAocCwgZmQpLCBidWYpKTsKLX0KLQotc3RhdGljIGludAotb3Nfc2h1dGRvd24gKHApCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NBTExCQUNLX0ZEUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwLT5mZG9wZW5baV0gJiYgIXAtPmFsd2F5c29wZW5baV0pIHsKLQljbG9zZSAocC0+ZmRtYXBbaV0pOwotCXAtPmZkb3BlbltpXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotb3NfaW5pdCAocCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLXsKLSAgaW50IGk7Ci0KLSAgb3Nfc2h1dGRvd24gKHApOwotICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotICAgIHsKLSAgICAgIHAtPmZkbWFwW2ldID0gaTsKLSAgICAgIHAtPmZkb3BlbltpXSA9IDE7Ci0gICAgICBwLT5hbHdheXNvcGVuW2ldID0gMTsKLSAgICB9Ci0KLSAgcC0+c3lzY2FsbF9tYXAgPSBjYl9pbml0X3N5c2NhbGxfbWFwOwotICBwLT5lcnJub19tYXAgPSBjYl9pbml0X2Vycm5vX21hcDsKLSAgcC0+b3Blbl9tYXAgPSBjYl9pbml0X29wZW5fbWFwOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBERVBSRUNJQVRFRCAqLwotCi0vKiBWQVJBUkdTICovCi1zdGF0aWMgdm9pZAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotb3NfcHJpbnRmX2ZpbHRlcmVkIChob3N0X2NhbGxiYWNrICpwIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotI2Vsc2UKLW9zX3ByaW50Zl9maWx0ZXJlZCAocCwgdmFfYWxpc3QpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICBjaGFyICpmb3JtYXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0jZW5kaWYKLQotICB2ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotfQotCi0vKiBWQVJBUkdTICovCi1zdGF0aWMgdm9pZAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotb3NfdnByaW50Zl9maWx0ZXJlZCAoaG9zdF9jYWxsYmFjayAqcCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLSNlbHNlCi1vc192cHJpbnRmX2ZpbHRlcmVkIChwLCBmb3JtYXQsIGFyZ3MpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcmdzOwotI2VuZGlmCi17Ci0gIHZwcmludGYgKGZvcm1hdCwgYXJncyk7Ci19Ci0KLS8qIFZBUkFSR1MgKi8KLXN0YXRpYyB2b2lkCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1vc19ldnByaW50Zl9maWx0ZXJlZCAoaG9zdF9jYWxsYmFjayAqcCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLSNlbHNlCi1vc19ldnByaW50Zl9maWx0ZXJlZCAocCwgZm9ybWF0LCBhcmdzKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXJnczsKLSNlbmRpZgotewotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotfQotCi0vKiBWQVJBUkdTICovCi1zdGF0aWMgdm9pZAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotb3NfZXJyb3IgKGhvc3RfY2FsbGJhY2sgKnAgQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0jZWxzZQotb3NfZXJyb3IgKHAsIHZhX2FsaXN0KQotICAgICBob3N0X2NhbGxiYWNrICpwOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotI2Vsc2UKLSAgY2hhciAqZm9ybWF0OwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0KLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLQotICB2YV9lbmQgKGFyZ3MpOwotICBleGl0ICgxKTsKLX0KLQotaG9zdF9jYWxsYmFjayBkZWZhdWx0X2NhbGxiYWNrID0KLXsKLSAgb3NfY2xvc2UsCi0gIG9zX2dldF9lcnJubywKLSAgb3NfaXNhdHR5LAotICBvc19sc2VlaywKLSAgb3Nfb3BlbiwKLSAgb3NfcmVhZCwKLSAgb3NfcmVhZF9zdGRpbiwKLSAgb3NfcmVuYW1lLAotICBvc19zeXN0ZW0sCi0gIG9zX3RpbWUsCi0gIG9zX3VubGluaywKLSAgb3Nfd3JpdGUsCi0gIG9zX3dyaXRlX3N0ZG91dCwKLSAgb3NfZmx1c2hfc3Rkb3V0LAotICBvc193cml0ZV9zdGRlcnIsCi0gIG9zX2ZsdXNoX3N0ZGVyciwKLQotICBvc19zdGF0LAotICBvc19mc3RhdCwKLQotICBvc19wb2xsX3F1aXQsCi0KLSAgb3Nfc2h1dGRvd24sCi0gIG9zX2luaXQsCi0KLSAgb3NfcHJpbnRmX2ZpbHRlcmVkLCAgLyogZGVwcmVjYXRlZCAqLwotCi0gIG9zX3ZwcmludGZfZmlsdGVyZWQsCi0gIG9zX2V2cHJpbnRmX2ZpbHRlcmVkLAotICBvc19lcnJvciwKLQotICAwLCAJCS8qIGxhc3QgZXJybm8gKi8KLQotICB7IDAsIH0sCS8qIGZkbWFwICovCi0gIHsgMCwgfSwJLyogZmRvcGVuICovCi0gIHsgMCwgfSwJLyogYWx3YXlzb3BlbiAqLwotCi0gIDAsIC8qIHN5c2NhbGxfbWFwICovCi0gIDAsIC8qIGVycm5vX21hcCAqLwotICAwLCAvKiBvcGVuX21hcCAqLwotICAwLCAvKiBzaWduYWxfbWFwICovCi0gIDAsIC8qIHN0YXRfbWFwICovCi0JCi0gIEhPU1RfQ0FMTEJBQ0tfTUFHSUMsCi19OwotDAotLyogUmVhZCBpbiBhIGZpbGUgZGVzY3JpYmluZyB0aGUgdGFyZ2V0J3Mgc3lzdGVtIGNhbGwgdmFsdWVzLgotICAgRS5nLiBtYXliZSBzb21lb25lIHdpbGwgd2FudCB0byB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gbmV3bGliLgotICAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGJhc2ljIHN5c3RlbSBjYWxsIHJlY29nbml0aW9uIGFuZCB2YWx1ZSBwYXNzaW5nLwotICAgcmV0dXJuaW5nIGlzIHN1cHBvcnRlZC4gIFNvIG1heWJlIHNvbWUgY29kaW5nL3JlY29tcGlsYXRpb24gd2lsbCBiZQotICAgbmVjZXNzYXJ5LCBidXQgbm90IGFzIG11Y2guCi0KLSAgIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGV4aXN0aW5nIG1hcHBpbmcgaXMgbm90IGNoYW5nZWQuICAqLwotCi1DQl9SQwotY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzIChjYiwgZmlsZSkKLSAgICAgaG9zdF9jYWxsYmFjayAqY2I7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIENCX1RBUkdFVF9ERUZTX01BUCAqc3lzY2FsbF9tYXAsICplcnJub19tYXAsICpvcGVuX21hcCwgKnNpZ25hbF9tYXA7Ci0gIGNvbnN0IGNoYXIgKnN0YXRfbWFwOwotICBGSUxFICpmOwotCi0gIGlmICgoZiA9IGZvcGVuIChmaWxlLCAiciIpKSA9PSBOVUxMKQotICAgIHJldHVybiBDQl9SQ19BQ0NFU1M7Ci0KLSAgLyogLi4uIHJlYWQgaW4gYW5kIHBhcnNlIGZpbGUgLi4uICovCi0KLSAgZmNsb3NlIChmKTsKLSAgcmV0dXJuIENCX1JDX05PX01FTTsgLyogRklYTUU6d2lwICovCi0KLSAgLyogRnJlZSBzdG9yYWdlIGFsbG9jYXRlZCBmb3IgYW55IGV4aXN0aW5nIG1hcHMuICAqLwotICBpZiAoY2ItPnN5c2NhbGxfbWFwKQotICAgIGZyZWUgKGNiLT5zeXNjYWxsX21hcCk7Ci0gIGlmIChjYi0+ZXJybm9fbWFwKQotICAgIGZyZWUgKGNiLT5lcnJub19tYXApOwotICBpZiAoY2ItPm9wZW5fbWFwKQotICAgIGZyZWUgKGNiLT5vcGVuX21hcCk7Ci0gIGlmIChjYi0+c2lnbmFsX21hcCkKLSAgICBmcmVlIChjYi0+c2lnbmFsX21hcCk7Ci0gIGlmIChjYi0+c3RhdF9tYXApCi0gICAgZnJlZSAoKFBUUikgY2ItPnN0YXRfbWFwKTsKLQotICBjYi0+c3lzY2FsbF9tYXAgPSBzeXNjYWxsX21hcDsKLSAgY2ItPmVycm5vX21hcCA9IGVycm5vX21hcDsKLSAgY2ItPm9wZW5fbWFwID0gb3Blbl9tYXA7Ci0gIGNiLT5zaWduYWxfbWFwID0gc2lnbmFsX21hcDsKLSAgY2ItPnN0YXRfbWFwID0gc3RhdF9tYXA7Ci0KLSAgcmV0dXJuIENCX1JDX09LOwotfQotCi0vKiBUcmFuc2xhdGUgdGhlIHRhcmdldCdzIHZlcnNpb24gb2YgYSBzeXNjYWxsIG51bWJlciB0byB0aGUgaG9zdCdzLgotICAgVGhpcyBpc24ndCBhY3R1YWxseSB0aGUgaG9zdCdzIHZlcnNpb24sIHJhdGhlciBhIGNhbm9uaWNhbCBmb3JtLgotICAgPz8/IFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgcmVuYW1lZCB0byAuLi5fY2Fub25fc3lzY2FsbC4gICovCi0KLWludAotY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCAoY2IsIHRhcmdldF92YWwpCi0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBpbnQgdGFyZ2V0X3ZhbDsKLXsKLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICptOwotCi0gIGZvciAobSA9ICZjYi0+c3lzY2FsbF9tYXBbMF07IG0tPnRhcmdldF92YWwgIT0gLTE7ICsrbSkKLSAgICBpZiAobS0+dGFyZ2V0X3ZhbCA9PSB0YXJnZXRfdmFsKQotICAgICAgcmV0dXJuIG0tPmhvc3RfdmFsOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyogRklYTUU6IHNvcnQgdGFibGVzIGlmIGxhcmdlLgotICAgQWx0ZXJuYXRpdmVseSwgYW4gb2J2aW91cyBpbXByb3ZlbWVudCBmb3IgZXJybm8gY29udmVyc2lvbiBpcwotICAgdG8gbWFjaGluZSBnZW5lcmF0ZSBhIGZ1bmN0aW9uIHdpdGggYSBsYXJnZSBzd2l0Y2goKS4gICovCi0KLS8qIFRyYW5zbGF0ZSB0aGUgaG9zdCdzIHZlcnNpb24gb2YgZXJybm8gdG8gdGhlIHRhcmdldCdzLiAgKi8KLQotaW50Ci1jYl9ob3N0X3RvX3RhcmdldF9lcnJubyAoY2IsIGhvc3RfdmFsKQotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgaW50IGhvc3RfdmFsOwotewotICBDQl9UQVJHRVRfREVGU19NQVAgKm07Ci0KLSAgZm9yIChtID0gJmNiLT5lcnJub19tYXBbMF07IG0tPmhvc3RfdmFsOyArK20pCi0gICAgaWYgKG0tPmhvc3RfdmFsID09IGhvc3RfdmFsKQotICAgICAgcmV0dXJuIG0tPnRhcmdldF92YWw7Ci0KLSAgLyogPz8/IFdoaWNoIGVycm9yIHRvIHJldHVybiBpbiB0aGlzIGNhc2UgaXMgdXAgZm9yIGdyYWJzLgotICAgICBOb3RlIHRoYXQgc29tZSBtaXNzaW5nIHZhbHVlcyBtYXkgaGF2ZSBzdGFuZGFyZCBhbHRlcm5hdGl2ZXMuCi0gICAgIEZvciBub3cgcmV0dXJuIDAgYW5kIHJlcXVpcmUgY2FsbGVyIHRvIGRlYWwgd2l0aCBpdC4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhIHNldCBvZiB0YXJnZXQgYml0bWFza3MgZm9yIHRoZSBvcGVuIHN5c3RlbSBjYWxsLAotICAgcmV0dXJuIHRoZSBob3N0IGVxdWl2YWxlbnQuCi0gICBNYXBwaW5nIG9wZW4gZmxhZyB2YWx1ZXMgaXMgYmVzdCBkb25lIGJ5IGxvb3Bpbmcgc28gdGhlcmUncyBubyBuZWVkCi0gICB0byBtYWNoaW5lIGdlbmVyYXRlIHRoaXMgZnVuY3Rpb24uICAqLwotCi1pbnQKLWNiX3RhcmdldF90b19ob3N0X29wZW4gKGNiLCB0YXJnZXRfdmFsKQotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgaW50IHRhcmdldF92YWw7Ci17Ci0gIGludCBob3N0X3ZhbCA9IDA7Ci0gIENCX1RBUkdFVF9ERUZTX01BUCAqbTsKLQotICBmb3IgKG0gPSAmY2ItPm9wZW5fbWFwWzBdOyBtLT5ob3N0X3ZhbCAhPSAtMTsgKyttKQotICAgIHsKLSAgICAgIHN3aXRjaCAobS0+dGFyZ2V0X3ZhbCkKLQl7Ci0JICAvKiBPX1JET05MWSBjYW4gYmUgKGFuZCB1c3VhbGx5IGlzKSAwIHdoaWNoIG5lZWRzIHRvIGJlIHRyZWF0ZWQKLQkgICAgIHNwZWNpYWxseS4gICovCi0JY2FzZSBUQVJHRVRfT19SRE9OTFkgOgotCWNhc2UgVEFSR0VUX09fV1JPTkxZIDoKLQljYXNlIFRBUkdFVF9PX1JEV1IgOgotCSAgaWYgKCh0YXJnZXRfdmFsICYgKFRBUkdFVF9PX1JET05MWSB8IFRBUkdFVF9PX1dST05MWSB8IFRBUkdFVF9PX1JEV1IpKQotCSAgICAgID09IG0tPnRhcmdldF92YWwpCi0JICAgIGhvc3RfdmFsIHw9IG0tPmhvc3RfdmFsOwotCSAgLyogSGFuZGxlIHRoZSBob3N0L3RhcmdldCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBiaW5hcnkgYW5kCi0gICAgICAgICAgICAgdGV4dCBtb2RlLiAgT25seSBvbmUgY2FzZSBpcyBvZiBpbXBvcnRhbmNlICovCi0jaWYgISBkZWZpbmVkIChUQVJHRVRfT19CSU5BUlkpICYmIGRlZmluZWQgKE9fQklOQVJZKQotCSAgaG9zdF92YWwgfD0gT19CSU5BUlk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCWRlZmF1bHQgOgotCSAgaWYgKChtLT50YXJnZXRfdmFsICYgdGFyZ2V0X3ZhbCkgPT0gbS0+dGFyZ2V0X3ZhbCkKLQkgICAgaG9zdF92YWwgfD0gbS0+aG9zdF92YWw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBob3N0X3ZhbDsKLX0KLQotLyogVXRpbGl0eSBmb3IgY2JfaG9zdF90b190YXJnZXRfc3RhdCB0byBzdG9yZSB2YWx1ZXMgaW4gdGhlIHRhcmdldCdzCi0gICBzdGF0IHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zdG9yZSAocCwgc2l6ZSwgdmFsLCBiaWdfcCkKLSAgICAgY2hhciAqcDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGxvbmcgdmFsOyAvKiA/Pz8gbXVzdCBiZSBhcyBiaWcgYXMgdGFyZ2V0IHdvcmQgc2l6ZSAqLwotICAgICBpbnQgYmlnX3A7Ci17Ci0gIGlmIChiaWdfcCkKLSAgICB7Ci0gICAgICBwICs9IHNpemU7Ci0gICAgICB3aGlsZSAoc2l6ZS0tID4gMCkKLQl7Ci0JICAqLS1wID0gdmFsOwotCSAgdmFsID4+PSA4OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoc2l6ZS0tID4gMCkKLQl7Ci0JICAqcCsrID0gdmFsOwotCSAgdmFsID4+PSA4OwotCX0KLSAgICB9Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhIGhvc3QncyBzdGF0IHN0cnVjdCBpbnRvIGEgdGFyZ2V0J3MuCi0gICBJZiBIUyBpcyBOVUxMLCBqdXN0IGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLAotICAgVFMgaXMgaWdub3JlZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0J3Mgc3RhdCBzdHJ1Y3QsCi0gICBvciB6ZXJvIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSB0cmFuc2xhdGlvbi4gICovCi0KLWludAotY2JfaG9zdF90b190YXJnZXRfc3RhdCAoY2IsIGhzLCB0cykKLSAgICAgaG9zdF9jYWxsYmFjayAqY2I7Ci0gICAgIGNvbnN0IHN0cnVjdCBzdGF0ICpoczsKLSAgICAgUFRSIHRzOwotewotICBjb25zdCBjaGFyICptID0gY2ItPnN0YXRfbWFwOwotICBjaGFyICpwOwotICBpbnQgYmlnX3AgPSAwOwotCi0gIGlmIChocyA9PSBOVUxMKQotICAgIHRzID0gTlVMTDsKLSAgcCA9IHRzOwotCi0gIHdoaWxlIChtKQotICAgIHsKLSAgICAgIGNoYXIgKnEgPSBzdHJjaHIgKG0sICcsJyk7Ci0gICAgICBpbnQgc2l6ZTsKLQotICAgICAgLyogRklYTUU6IFVzZSBzc2NhbmY/ICovCi0gICAgICBpZiAocSA9PSBOVUxMKQotCXsKLQkgIC8qIEZJWE1FOiBwcmludCBlcnJvciBtZXNzYWdlICovCi0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBzaXplID0gYXRvaSAocSArIDEpOwotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICAvKiBGSVhNRTogcHJpbnQgZXJyb3IgbWVzc2FnZSAqLwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoaHMgIT0gTlVMTCkKLQl7Ci0JICBpZiAoc3RybmNtcCAobSwgInN0X2RldiIsIHEgLSBtKSA9PSAwKQotCSAgICBzdG9yZSAocCwgc2l6ZSwgaHMtPnN0X2RldiwgYmlnX3ApOwotCSAgZWxzZSBpZiAoc3RybmNtcCAobSwgInN0X2lubyIsIHEgLSBtKSA9PSAwKQotCSAgICBzdG9yZSAocCwgc2l6ZSwgaHMtPnN0X2lubywgYmlnX3ApOwotCSAgLyogRklYTUU6d2lwICovCi0JICBlbHNlCi0JICAgIHN0b3JlIChwLCBzaXplLCAwLCBiaWdfcCk7IC8qIHVuc3VwcG9ydGVkIGZpZWxkLCBzdG9yZSAwICovCi0JfQotCi0gICAgICBwICs9IHNpemU7Ci0gICAgICBtID0gc3RyY2hyIChxLCAnOicpOwotICAgICAgaWYgKG0pCi0JKyttOwotICAgIH0KLQotICByZXR1cm4gcCAtIChjaGFyICopIHRzOwotfQotDAotLyogQ292ZXIgZnVuY3Rpb25zIHRvIHRoZSB2ZnByaW50ZiBjYWxsYmFja3MuCi0KLSAgID8/PyBJZiBvbmUgdGhpbmtzIG9mIHRoZSBjYWxsYmFja3MgYXMgYSBzdWJzeXN0ZW0gb250byBpdHNlbGYgW29yIHBhcnQgb2YKLSAgIGEgbGFyZ2VyICJyZW1vdGUgdGFyZ2V0IHN1YnN5c3RlbSJdIHdpdGggYSB3ZWxsIGRlZmluZWQgaW50ZXJmYWNlLCB0aGVuCi0gICBvbmUgd291bGQgdGhpbmsgdGhhdCB0aGUgc3Vic3lzdGVtIHdvdWxkIHByb3ZpZGUgdGhlc2UuICBIb3dldmVyLCB1bnRpbAotICAgb25lIGlzIGFsbG93ZWQgdG8gY3JlYXRlIHN1Y2ggYSBzdWJzeXN0ZW0gKHdpdGggaXRzIG93biBzb3VyY2UgdHJlZQotICAgaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpY3VsYXIgdXNlciksIHN1Y2ggYSBjcml0dGVyIGNhbid0IGV4aXN0LiAgVGh1cwotICAgdGhlc2UgZnVuY3Rpb25zIGFyZSBoZXJlIGZvciB0aGUgdGltZSBiZWluZy4gICovCi0KLXZvaWQKLXNpbV9jYl9wcmludGYgKGhvc3RfY2FsbGJhY2sgKnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgcC0+dnByaW50Zl9maWx0ZXJlZCAocCwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotCi12b2lkCi1zaW1fY2JfZXByaW50ZiAoaG9zdF9jYWxsYmFjayAqcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICBwLT5ldnByaW50Zl9maWx0ZXJlZCAocCwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLWFjY2ZwLmMgYi9zaW0vY29tbW9uL2NnZW4tYWNjZnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZGQyMi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tYWNjZnAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwNiArMCwwIEBACi0vKiBBY2N1cmF0ZSBmcCBzdXBwb3J0IGZvciBDR0VOLWJhc2VkIHNpbXVsYXRvcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotICAgVGhpcyBpbXBsZW1lbnRpb24gYXNzdW1lczoKLSAgIHR5cGVkZWYgVVNJIFNGOwotICAgdHlwZWRlZiBVREkgREY7Ci0KLSAgIFRPRE86Ci0gICAtIGxhenkgZW5jb2RpbmcvZGVjb2RpbmcKLSAgIC0gY2hlY2tpbmcgcmV0dXJuIGNvZGUgKHNheSBieSBjYWxsYmFjaykKLSAgIC0gcHJvcGVyIHJvdW5kaW5nCi0qLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tZnB1LmgiCi0KLS8qIFNGIG1vZGUgc3VwcG9ydCAqLwotCi1zdGF0aWMgU0YKLWFkZHNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDMyIHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfMzJ0byAoJm9wMSwgeCk7Ci0gIHNpbV9mcHVfMzJ0byAoJm9wMiwgeSk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfYWRkICgmYW5zLCAmb3AxLCAmb3AyKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBTRgotc3Vic2YgKENHRU5fRlBVKiBmcHUsIFNGIHgsIFNGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkMzIgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9zdWIgKCZhbnMsICZvcDEsICZvcDIpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNGCi1tdWxzZiAoQ0dFTl9GUFUqIGZwdSwgU0YgeCwgU0YgeSkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgb3AyOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzMydG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzMydG8gKCZvcDIsIHkpOwotICBzdGF0dXMgPSBzaW1fZnB1X211bCAoJmFucywgJm9wMSwgJm9wMik7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgU0YKLWRpdnNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDMyIHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfMzJ0byAoJm9wMSwgeCk7Ci0gIHNpbV9mcHVfMzJ0byAoJm9wMiwgeSk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfZGl2ICgmYW5zLCAmb3AxLCAmb3AyKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBTRgotbmVnc2YgKENHRU5fRlBVKiBmcHUsIFNGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzMydG8gKCZvcDEsIHgpOwotICBzdGF0dXMgPSBzaW1fZnB1X25lZyAoJmFucywgJm9wMSk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgU0YKLWFic3NmIChDR0VOX0ZQVSogZnB1LCBTRiB4KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkMzIgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9hYnMgKCZhbnMsICZvcDEpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNGCi1zcXJ0c2YgKENHRU5fRlBVKiBmcHUsIFNGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzMydG8gKCZvcDEsIHgpOwotICBzdGF0dXMgPSBzaW1fZnB1X3NxcnQgKCZhbnMsICZvcDEpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNGCi1pbnZzZiAoQ0dFTl9GUFUqIGZwdSwgU0YgeCkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDMyIHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfMzJ0byAoJm9wMSwgeCk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfaW52ICgmYW5zLCAmb3AxKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBTRgotbWluc2YgKENHRU5fRlBVKiBmcHUsIFNGIHgsIFNGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkMzIgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9taW4gKCZhbnMsICZvcDEsICZvcDIpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNGCi1tYXhzZiAoQ0dFTl9GUFUqIGZwdSwgU0YgeCwgU0YgeSkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgb3AyOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzMydG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzMydG8gKCZvcDIsIHkpOwotICBzdGF0dXMgPSBzaW1fZnB1X21heCAoJmFucywgJm9wMSwgJm9wMik7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgQ0dFTl9GUF9DTVAKLWNtcHNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLQotICBpZiAoc2ltX2ZwdV9pc19uYW4gKCZvcDEpCi0gICAgICB8fCBzaW1fZnB1X2lzX25hbiAoJm9wMikpCi0gICAgcmV0dXJuIEZQX0NNUF9OQU47Ci0KLSAgaWYgKHggPCB5KQotICAgIHJldHVybiBGUF9DTVBfTFQ7Ci0gIGlmICh4ID4geSkKLSAgICByZXR1cm4gRlBfQ01QX0dUOwotICByZXR1cm4gRlBfQ01QX0VROwotfQotCi1zdGF0aWMgaW50Ci1lcXNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfZXEgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgaW50Ci1uZXNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfbmUgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgaW50Ci1sdHNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfbHQgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgaW50Ci1sZXNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfbGUgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgaW50Ci1ndHNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfZ3QgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgaW50Ci1nZXNmIChDR0VOX0ZQVSogZnB1LCBTRiB4LCBTRiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV8zMnRvICgmb3AyLCB5KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfZ2UgKCZvcDEsICZvcDIpOwotfQotCi1zdGF0aWMgREYKLWZleHRzZmRmIChDR0VOX0ZQVSogZnB1LCBTRiB4KQotewotICBzaW1fZnB1IG9wMTsKLSAgdW5zaWduZWQ2NCByZXM7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmb3AxKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgU0YKLWZ0cnVuY2Rmc2YgKENHRU5fRlBVKiBmcHUsIERGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotICB1bnNpZ25lZDMyIHJlczsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1X3RvMzIgKCZyZXMsICZvcDEpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBTRgotZmxvYXRzaXNmIChDR0VOX0ZQVSogZnB1LCBTSSB4KQotewotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0KLSAgc2ltX2ZwdV9pMzJ0byAoJmFucywgeCwgc2ltX2ZwdV9yb3VuZF9uZWFyKTsKLSAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIERGCi1mbG9hdHNpZGYgKENHRU5fRlBVKiBmcHUsIFNJIHgpCi17Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDY0IHJlczsKLQotICBzaW1fZnB1X2kzMnRvICgmYW5zLCB4LCBzaW1fZnB1X3JvdW5kX25lYXIpOwotICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgU0YKLXVmbG9hdHNpc2YgKENHRU5fRlBVKiBmcHUsIFVTSSB4KQotewotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQzMiByZXM7Ci0KLSAgc2ltX2ZwdV91MzJ0byAoJmFucywgeCwgc2ltX2ZwdV9yb3VuZF9uZWFyKTsKLSAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNJCi1maXhzZnNpIChDR0VOX0ZQVSogZnB1LCBTRiB4KQotewotICBzaW1fZnB1IG9wMTsKLSAgdW5zaWduZWQzMiByZXM7Ci0KLSAgc2ltX2ZwdV8zMnRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV90bzMyaSAoJnJlcywgJm9wMSwgc2ltX2ZwdV9yb3VuZF9uZWFyKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFNJCi1maXhkZnNpIChDR0VOX0ZQVSogZnB1LCBERiB4KQotewotICBzaW1fZnB1IG9wMTsKLSAgdW5zaWduZWQzMiByZXM7Ci0KLSAgc2ltX2ZwdV82NHRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV90bzMyaSAoJnJlcywgJm9wMSwgc2ltX2ZwdV9yb3VuZF9uZWFyKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIFVTSQotdWZpeHNmc2kgKENHRU5fRlBVKiBmcHUsIFNGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotICB1bnNpZ25lZDMyIHJlczsKLQotICBzaW1fZnB1XzMydG8gKCZvcDEsIHgpOwotICBzaW1fZnB1X3RvMzJ1ICgmcmVzLCAmb3AxLCBzaW1fZnB1X3JvdW5kX25lYXIpOwotICByZXR1cm4gcmVzOwotfQotDAotLyogREYgbW9kZSBzdXBwb3J0ICovCi0KLXN0YXRpYyBERgotYWRkZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkNjQgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV82NHRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV82NHRvICgmb3AyLCB5KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9hZGQgKCZhbnMsICZvcDEsICZvcDIpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIERGCi1zdWJkZiAoQ0dFTl9GUFUqIGZwdSwgREYgeCwgREYgeSkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgb3AyOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQ2NCByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICBzdGF0dXMgPSBzaW1fZnB1X3N1YiAoJmFucywgJm9wMSwgJm9wMik7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgREYKLW11bGRmIChDR0VOX0ZQVSogZnB1LCBERiB4LCBERiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDY0IHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfNjR0byAoJm9wMSwgeCk7Ci0gIHNpbV9mcHVfNjR0byAoJm9wMiwgeSk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfbXVsICgmYW5zLCAmb3AxLCAmb3AyKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBERgotZGl2ZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkNjQgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV82NHRvICgmb3AxLCB4KTsKLSAgc2ltX2ZwdV82NHRvICgmb3AyLCB5KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9kaXYgKCZhbnMsICZvcDEsICZvcDIpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIERGCi1uZWdkZiAoQ0dFTl9GUFUqIGZwdSwgREYgeCkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDY0IHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfNjR0byAoJm9wMSwgeCk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfbmVnICgmYW5zLCAmb3AxKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBERgotYWJzZGYgKENHRU5fRlBVKiBmcHUsIERGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQ2NCByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzdGF0dXMgPSBzaW1fZnB1X2FicyAoJmFucywgJm9wMSk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgREYKLXNxcnRkZiAoQ0dFTl9GUFUqIGZwdSwgREYgeCkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDY0IHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfNjR0byAoJm9wMSwgeCk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfc3FydCAoJmFucywgJm9wMSk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgREYKLWludmRmIChDR0VOX0ZQVSogZnB1LCBERiB4KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHVuc2lnbmVkNjQgcmVzOwotICBzaW1fZnB1X3N0YXR1cyBzdGF0dXM7Ci0KLSAgc2ltX2ZwdV82NHRvICgmb3AxLCB4KTsKLSAgc3RhdHVzID0gc2ltX2ZwdV9pbnYgKCZhbnMsICZvcDEpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgKCpmcHUtPm9wcy0+ZXJyb3IpIChmcHUsIHN0YXR1cyk7Ci0gIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIERGCi1taW5kZiAoQ0dFTl9GUFUqIGZwdSwgREYgeCwgREYgeSkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0gIHNpbV9mcHUgb3AyOwotICBzaW1fZnB1IGFuczsKLSAgdW5zaWduZWQ2NCByZXM7Ci0gIHNpbV9mcHVfc3RhdHVzIHN0YXR1czsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICBzdGF0dXMgPSBzaW1fZnB1X21pbiAoJmFucywgJm9wMSwgJm9wMik7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICAoKmZwdS0+b3BzLT5lcnJvcikgKGZwdSwgc3RhdHVzKTsKLSAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgREYKLW1heGRmIChDR0VOX0ZQVSogZnB1LCBERiB4LCBERiB5KQotewotICBzaW1fZnB1IG9wMTsKLSAgc2ltX2ZwdSBvcDI7Ci0gIHNpbV9mcHUgYW5zOwotICB1bnNpZ25lZDY0IHJlczsKLSAgc2ltX2ZwdV9zdGF0dXMgc3RhdHVzOwotCi0gIHNpbV9mcHVfNjR0byAoJm9wMSwgeCk7Ci0gIHNpbV9mcHVfNjR0byAoJm9wMiwgeSk7Ci0gIHN0YXR1cyA9IHNpbV9mcHVfbWF4ICgmYW5zLCAmb3AxLCAmb3AyKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgICgqZnB1LT5vcHMtPmVycm9yKSAoZnB1LCBzdGF0dXMpOwotICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBDR0VOX0ZQX0NNUAotY21wZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotCi0gIGlmIChzaW1fZnB1X2lzX25hbiAoJm9wMSkKLSAgICAgIHx8IHNpbV9mcHVfaXNfbmFuICgmb3AyKSkKLSAgICByZXR1cm4gRlBfQ01QX05BTjsKLQotICBpZiAoeCA8IHkpCi0gICAgcmV0dXJuIEZQX0NNUF9MVDsKLSAgaWYgKHggPiB5KQotICAgIHJldHVybiBGUF9DTVBfR1Q7Ci0gIHJldHVybiBGUF9DTVBfRVE7Ci19Ci0KLXN0YXRpYyBpbnQKLWVxZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19lcSAoJm9wMSwgJm9wMik7Ci19Ci0KLXN0YXRpYyBpbnQKLW5lZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19uZSAoJm9wMSwgJm9wMik7Ci19Ci0KLXN0YXRpYyBpbnQKLWx0ZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19sdCAoJm9wMSwgJm9wMik7Ci19Ci0KLXN0YXRpYyBpbnQKLWxlZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19sZSAoJm9wMSwgJm9wMik7Ci19Ci0KLXN0YXRpYyBpbnQKLWd0ZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19ndCAoJm9wMSwgJm9wMik7Ci19Ci0KLXN0YXRpYyBpbnQKLWdlZGYgKENHRU5fRlBVKiBmcHUsIERGIHgsIERGIHkpCi17Ci0gIHNpbV9mcHUgb3AxOwotICBzaW1fZnB1IG9wMjsKLQotICBzaW1fZnB1XzY0dG8gKCZvcDEsIHgpOwotICBzaW1fZnB1XzY0dG8gKCZvcDIsIHkpOwotICByZXR1cm4gc2ltX2ZwdV9pc19nZSAoJm9wMSwgJm9wMik7Ci19Ci0MCi0vKiBJbml0aWFsaXplIEZQX09QUyB0byB1c2UgYWNjdXJhdGUgbGlicmFyeS4gICovCi0KLXZvaWQKLWNnZW5faW5pdF9hY2N1cmF0ZV9mcHUgKFNJTV9DUFUqIGNwdSwgQ0dFTl9GUFUqIGZwdSwgQ0dFTl9GUFVfRVJST1JfRk4qIGVycm9yKQotewotICBDR0VOX0ZQX09QUyogbzsKLQotICBmcHUtPm93bmVyID0gY3B1OwotICAvKiA/Pz8gc21hbGwgbWVtb3J5IGxlYWssIG5vdCBmcmVlZCBieSBzaW1fY2xvc2UgKi8KLSAgZnB1LT5vcHMgPSAoQ0dFTl9GUF9PUFMqKSB4bWFsbG9jIChzaXplb2YgKENHRU5fRlBfT1BTKSk7Ci0KLSAgbyA9IGZwdS0+b3BzOwotICBtZW1zZXQgKG8sIDAsIHNpemVvZiAoKm8pKTsKLQotICBvLT5lcnJvciA9IGVycm9yOwotCi0gIG8tPmFkZHNmID0gYWRkc2Y7Ci0gIG8tPnN1YnNmID0gc3Vic2Y7Ci0gIG8tPm11bHNmID0gbXVsc2Y7Ci0gIG8tPmRpdnNmID0gZGl2c2Y7Ci0gIG8tPm5lZ3NmID0gbmVnc2Y7Ci0gIG8tPmFic3NmID0gYWJzc2Y7Ci0gIG8tPnNxcnRzZiA9IHNxcnRzZjsKLSAgby0+aW52c2YgPSBpbnZzZjsKLSAgby0+bWluc2YgPSBtaW5zZjsKLSAgby0+bWF4c2YgPSBtYXhzZjsKLSAgby0+Y21wc2YgPSBjbXBzZjsKLSAgby0+ZXFzZiA9IGVxc2Y7Ci0gIG8tPm5lc2YgPSBuZXNmOwotICBvLT5sdHNmID0gbHRzZjsKLSAgby0+bGVzZiA9IGxlc2Y7Ci0gIG8tPmd0c2YgPSBndHNmOwotICBvLT5nZXNmID0gZ2VzZjsKLQotICBvLT5hZGRkZiA9IGFkZGRmOwotICBvLT5zdWJkZiA9IHN1YmRmOwotICBvLT5tdWxkZiA9IG11bGRmOwotICBvLT5kaXZkZiA9IGRpdmRmOwotICBvLT5uZWdkZiA9IG5lZ2RmOwotICBvLT5hYnNkZiA9IGFic2RmOwotICBvLT5zcXJ0ZGYgPSBzcXJ0ZGY7Ci0gIG8tPmludmRmID0gaW52ZGY7Ci0gIG8tPm1pbmRmID0gbWluZGY7Ci0gIG8tPm1heGRmID0gbWF4ZGY7Ci0gIG8tPmNtcGRmID0gY21wZGY7Ci0gIG8tPmVxZGYgPSBlcWRmOwotICBvLT5uZWRmID0gbmVkZjsKLSAgby0+bHRkZiA9IGx0ZGY7Ci0gIG8tPmxlZGYgPSBsZWRmOwotICBvLT5ndGRmID0gZ3RkZjsKLSAgby0+Z2VkZiA9IGdlZGY7Ci0gIG8tPmZleHRzZmRmID0gZmV4dHNmZGY7Ci0gIG8tPmZ0cnVuY2Rmc2YgPSBmdHJ1bmNkZnNmOwotICBvLT5mbG9hdHNpc2YgPSBmbG9hdHNpc2Y7Ci0gIG8tPmZsb2F0c2lkZiA9IGZsb2F0c2lkZjsKLSAgby0+dWZsb2F0c2lzZiA9IHVmbG9hdHNpc2Y7Ci0gIG8tPmZpeHNmc2kgPSBmaXhzZnNpOwotICBvLT5maXhkZnNpID0gZml4ZGZzaTsKLSAgby0+dWZpeHNmc2kgPSB1Zml4c2ZzaTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1jcHUuaCBiL3NpbS9jb21tb24vY2dlbi1jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ZTk4Zi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tY3B1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogU2ltdWxhdG9yIGhlYWRlciBmb3IgY2dlbiBjcHVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBDR0VOX0NQVV9ICi0jZGVmaW5lIENHRU5fQ1BVX0gKLQotLyogVHlwZSBvZiBmdW5jdGlvbiB0aGF0IGlzIHVsdGltYXRlbHkgY2FsbGVkIGJ5IHNpbV9yZXN1bWUuICAqLwotdHlwZWRlZiB2b2lkIChFTkdJTkVfRk4pIChTSU1fQ1BVICopOwotCi0vKiBUeXBlIG9mIGZ1bmN0aW9uIHRvIGRvIGRpc2Fzc2VtYmx5LiAgKi8KLXR5cGVkZWYgdm9pZCAoQ0dFTl9ESVNBU1NFTUJMRVIpIChTSU1fQ1BVICosIGNvbnN0IENHRU5fSU5TTiAqLAotCQkJCSAgY29uc3QgQVJHQlVGICosIElBRERSIHBjXywgY2hhciAqYnVmXyk7Ci0KLS8qIEFkZGl0aW9uYWwgbm9uLW1hY2hpbmUgZ2VuZXJhdGVkIHBlci1jcHUgZGF0YSB0byBnbyBpbiBTSU1fQ1BVLgotICAgVGhlIG1lbWJlcidzIG5hbWUgbXVzdCBiZSBgY2dlbl9jcHUnLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBOb24temVybyB3aGlsZSBjcHUgc2ltdWxhdGlvbiBpcyBydW5uaW5nLiAgKi8KLSAgaW50IHJ1bm5pbmdfcDsKLSNkZWZpbmUgQ1BVX1JVTk5JTkdfUChjcHUpICgoY3B1KS0+Y2dlbl9jcHUucnVubmluZ19wKQotCi0gIC8qIEluc3RydWN0aW9uIGNvdW50LiAgVGhpcyBpcyBtYWludGFpbmVkIGV2ZW4gaW4gZmFzdCBtb2RlIHRvIGtlZXAgdHJhY2sKLSAgICAgb2Ygc2ltdWxhdG9yIHNwZWVkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpbnNuX2NvdW50OwotI2RlZmluZSBDUFVfSU5TTl9DT1VOVChjcHUpICgoY3B1KS0+Y2dlbl9jcHUuaW5zbl9jb3VudCkKLQotICAvKiBzaW1fcmVzdW1lIGhhbmRsZXJzICovCi0gIEVOR0lORV9GTiAqZmFzdF9lbmdpbmVfZm47Ci0jZGVmaW5lIENQVV9GQVNUX0VOR0lORV9GTihjcHUpICgoY3B1KS0+Y2dlbl9jcHUuZmFzdF9lbmdpbmVfZm4pCi0gIEVOR0lORV9GTiAqZnVsbF9lbmdpbmVfZm47Ci0jZGVmaW5lIENQVV9GVUxMX0VOR0lORV9GTihjcHUpICgoY3B1KS0+Y2dlbl9jcHUuZnVsbF9lbmdpbmVfZm4pCi0KLSAgLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHBlciB0aW1lIHNsaWNlLgotICAgICBXaGVuIHNpbmdsZSBzdGVwcGluZyB0aGlzIGlzIDEuICBJZiB1c2luZyB0aGUgcGJiIG1vZGVsLCB0aGlzIGNhbiBiZQotICAgICBtb3JlIHRoYW4gMS4gIDAgbWVhbnMgImFzIGxvbmcgYXMgeW91IHdhbnQiLiAgKi8KLSAgdW5zaWduZWQgaW50IG1heF9zbGljZV9pbnNuczsKLSNkZWZpbmUgQ1BVX01BWF9TTElDRV9JTlNOUyhjcHUpICgoY3B1KS0+Y2dlbl9jcHUubWF4X3NsaWNlX2luc25zKQotCi0gIC8qIFNpbXVsYXRvcidzIGV4ZWN1dGlvbiBjYWNoZS4KLSAgICAgQWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgZXZlbiBpZiBub3QgdXNlZCBhcyBzb21lIHNpbXVsYXRvcnMgbWF5IGhhdmUKLSAgICAgb25lIG1hY2hpbmUgdmFyaWFudCB0aGF0IHVzZXMgdGhlIHNjYWNoZSBhbmQgYW5vdGhlciB0aGF0IGRvZXNuJ3QgYW5kCi0gICAgIHdlIGRvbid0IHdhbnQgbWVtYmVycyBpbiB0aGlzIHN0cnVjdCB0byBtb3ZlIGFib3V0LiAgKi8KLSAgQ1BVX1NDQUNIRSBzY2FjaGU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciB0YWJsZS4gICovCi0gIElERVNDICppZGVzYzsKLSNkZWZpbmUgQ1BVX0lERVNDKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5pZGVzYykKLQotICAvKiBXaGV0aGVyIHRoZSByZWFkLHdyaXRlLHNlbWFudGljIGVudHJpZXMgKGZ1bmN0aW9uIHBvaW50ZXJzIG9yIGNvbXB1dGVkCi0gICAgIGdvdG8gbGFiZWxzKSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90LiAgKi8KLSAgaW50IGlkZXNjX3JlYWRfaW5pdF9wOwotI2RlZmluZSBDUFVfSURFU0NfUkVBRF9JTklUX1AoY3B1KSAoKGNwdSktPmNnZW5fY3B1LmlkZXNjX3JlYWRfaW5pdF9wKQotICBpbnQgaWRlc2Nfd3JpdGVfaW5pdF9wOwotI2RlZmluZSBDUFVfSURFU0NfV1JJVEVfSU5JVF9QKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5pZGVzY193cml0ZV9pbml0X3ApCi0gIGludCBpZGVzY19zZW1faW5pdF9wOwotI2RlZmluZSBDUFVfSURFU0NfU0VNX0lOSVRfUChjcHUpICgoY3B1KS0+Y2dlbl9jcHUuaWRlc2Nfc2VtX2luaXRfcCkKLQotICAvKiBDcHUgZGVzY3JpcHRvciB0YWJsZS4KLSAgICAgVGhpcyBpcyBhIENHRU4gY3JlYXRlZCBlbnRpdHkgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24gZmlsZQotICAgICB0dXJuZWQgaW50byBDIGNvZGUgYW5kIHRhYmxlcyBmb3Igb3VyIHVzZS4gICovCi0gIENHRU5fQ1BVX0RFU0MgY3B1X2Rlc2M7Ci0jZGVmaW5lIENQVV9DUFVfREVTQyhjcHUpICgoY3B1KS0+Y2dlbl9jcHUuY3B1X2Rlc2MpCi0KLSAgLyogRnVuY3Rpb24gdG8gZmV0Y2ggdGhlIGluc24gZGF0YSBlbnRyeSBpbiB0aGUgSURFU0MuICAqLwotICBjb25zdCBDR0VOX0lOU04gKiAoKmdldF9pZGF0YSkgKFNJTV9DUFUgKiwgaW50KTsKLSNkZWZpbmUgQ1BVX0dFVF9JREFUQShjcHUpICgoY3B1KS0+Y2dlbl9jcHUuZ2V0X2lkYXRhKQotCi0gIC8qIEZsb2F0aW5nIHBvaW50IHN1cHBvcnQuICAqLwotICBDR0VOX0ZQVSBmcHU7Ci0jZGVmaW5lIENHRU5fQ1BVX0ZQVShjcHUpICgmIChjcHUpLT5jZ2VuX2NwdS5mcHUpCi0KLSAgLyogRGlzYXNzZW1ibGVyLiAgKi8KLSAgQ0dFTl9ESVNBU1NFTUJMRVIgKmRpc2Fzc2VtYmxlcjsKLSNkZWZpbmUgQ1BVX0RJU0FTU0VNQkxFUihjcHUpICgoY3B1KS0+Y2dlbl9jcHUuZGlzYXNzZW1ibGVyKQotCi0gIC8qIFF1ZXVlZCB3cml0ZXMgZm9yIHBhcmFsbGVsIHdyaXRlLWFmdGVyIHN1cHBvcnQuICAqLwotICBDR0VOX1dSSVRFX1FVRVVFIHdyaXRlX3F1ZXVlOwotI2RlZmluZSBDUFVfV1JJVEVfUVVFVUUoY3B1KSAoJiAoY3B1KS0+Y2dlbl9jcHUud3JpdGVfcXVldWUpCi0KLSAgLyogQWxsb3cgc2xvcCBpbiBzaXplIGNhbGNzIGZvciBjYXNlIHdoZXJlIG11bHRpcGxlIGNwdSB0eXBlcyBhcmUgc3VwcG9ydGVkCi0gICAgIGFuZCBzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCBjcHUgaXMgbWFsbG9jJ2QgYXQgcnVuIHRpbWUuICAqLwotICBkb3VibGUgc2xvcDsKLX0gQ0dFTl9DUFU7Ci0KLS8qIFNob3J0aGFuZCBtYWNybyBmb3IgZmV0Y2hpbmcgcmVnaXN0ZXJzLgotICAgQ1BVX0NHRU5fSFcgaXMgZGVmaW5lZCBpbiBjcHUuaC4gICovCi0jZGVmaW5lIENQVSh4KSAoQ1BVX0NHRU5fSFcgKGN1cnJlbnRfY3B1KS0+eCkKLQotI2VuZGlmIC8qIENHRU5fQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1kZWZzLmggYi9zaW0vY29tbW9uL2NnZW4tZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmRmYjlhLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi1kZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogR2VuZXJhbCBDcHUgdG9vbHMgR0VOZXJhdGVkIHNpbXVsYXRvciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RFRlNfSAotI2RlZmluZSBDR0VOX0RFRlNfSAotCi0vKiBDb21wdXRlIG51bWJlciBvZiBsb25ncyByZXF1aXJlZCB0byBob2xkIE4gYml0cy4gICovCi0jZGVmaW5lIEhPU1RfTE9OR1NfRk9SX0JJVFMobikgXAotICAoKChuKSArIHNpemVvZiAobG9uZykgKiA4IC0gMSkgLyBzaXplb2YgKGxvbmcpICogOCkKLQwKLS8qIEZvcndhcmQgZGVjbHMuICBEZWZpbmVkIGluIHRoZSBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcy4gICovCi0KLS8qIFRoaXMgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHRyYWN0ZWQgaW5zbi4KLSAgIFRoZXJlIGFyZSBhIGZldyBjb21tb24gZW50cmllcyAoZS5nLiBwYyBhZGRyZXNzKSwgYW5kIHRoZW4gb25lIGJpZwotICAgdW5pb24gd2l0aCBhbiBlbnRyeSBmb3IgZWFjaCBvZiB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi10eXBlZGVmIHN0cnVjdCBhcmdidWYgQVJHQlVGOwotCi0vKiBBUkdCVUYgYWNjZXNzb3JzLiAgKi8KLSNkZWZpbmUgQVJHQlVGX0FERFIoYWJ1ZikgKChhYnVmKS0+YWRkcikKLSNkZWZpbmUgQVJHQlVGX0lERVNDKGFidWYpICgoYWJ1ZiktPmlkZXNjKQotI2RlZmluZSBBUkdCVUZfVFJBQ0VfUChhYnVmKSAoKGFidWYpLT50cmFjZV9wKQotI2RlZmluZSBBUkdCVUZfUFJPRklMRV9QKGFidWYpICgoYWJ1ZiktPnByb2ZpbGVfcCkKLQotLyogVGhpcyBpcyBvbmUgQVJHQlVGIHBsdXMgd2hhdGV2ZXIgZWxzZSBpcyBuZWVkZWQgZm9yIFdJVEhfU0NBQ0hFIHN1cHBvcnQuCi0gICBBdCBwcmVzZW50IHRoZXJlIGlzIG5vdGhpbmcgZWxzZSwgYnV0IGl0IGFsc28gcHJvdmlkZXMgYSBsZXZlbCBvZgotICAgYWJzdHJhY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NhY2hlIFNDQUNIRTsKLQotLyogVGhpcyBpcyBhIHVuaW9uIHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGluc3RydWN0aW9uIGZvcm1hdC4KLSAgIEVhY2ggZW50cnkgY29udGFpbnMgYWxsIG9mIHRoZSBub24tY29uc3RhbnQgaW5wdXRzIG9mIHRoZSBpbnN0cnVjdGlvbgotICAgaW4gdGhlIGNhc2Ugb2YgcmVhZC1iZWZvcmUtZXhlYyBzdXBwb3J0LCBvciBhbGwgb3V0cHV0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGluIHRoZSBjYXNlIG9mIHdyaXRlLWFmdGVyLWV4ZWMgc3VwcG9ydC4gICovCi10eXBlZGVmIHN0cnVjdCBwYXJleGVjIFBBUkVYRUM7Ci0KLS8qIEFuICJJbnN0cnVjdGlvbiBERVNDcmlwdG9yIi4KLSAgIFRoaXMgaXMgdGhlIG1haW4gaGFuZGxlIG9uIGFuIGluc3RydWN0aW9uIGZvciB0aGUgc2ltdWxhdG9yLiAgKi8KLXR5cGVkZWYgc3RydWN0IGlkZXNjIElERVNDOwotDAotLyogRW5naW5lIHN1cHBvcnQuCi0gICA/Pz8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgaXQncyBuZWVkZWQgYmVmb3JlIGVuZy5oIChidWlsdCBieSBnZW5tbG9vcC5zaCkKLSAgIHdoaWNoIGlzIG5lZWRlZCBiZWZvcmUgY2dlbi1lbmdpbmUuaCBhbmQgY3B1LmguCi0gICA/Pz8gVGhpcyBkZXBlbmRzIG9uIGEgY3B1IGZhbWlseSBzcGVjaWZpYyB0eXBlLCBJQUREUiwgYnV0IG5vIG1hY2hpbmUKLSAgIGdlbmVyYXRlZCBoZWFkZXJzIHdpbGwgaGF2ZSBiZWVuIGluY2x1ZGVkIHlldC4gIHNpbS9jb21tb24gY3VycmVudGx5Ci0gICByZXF1aXJlcyB0aGUgdHlwZWRlZiBvZiBzaW1fY2lhIGluIHNpbS1tYWluLmggYmV0d2VlbiB0aGUgaW5jbHVzaW9uIG9mCi0gICBzaW0tYmFzaWNzLmggYW5kIHNpbS1iYXNlLmggc28gdGhpcyBpcyBubyBkaWZmZXJlbnQuICAqLwotCi0vKiBTRU1fQVJHIGlzIGludGVuZGVkIHRvIGhpZGUgd2hldGhlciBvciBub3QgdGhlIHNjYWNoZSBpcyBpbiB1c2UgZnJvbSB0aGUKLSAgIHNlbWFudGljIHJvdXRpbmVzLiAgSW4gcmVhbGl0eSBmb3IgdGhlIHdpdGgtZXh0cmFjdGlvbiBjYXNlIGl0IGlzIGFsd2F5cwotICAgYW4gU0NBQ0hFICogZXZlbiB3aGVuIG5vdCB1c2luZyB0aGUgU0NBQ0hFIHNpbmNlIHRoZXJlJ3Mgbm8gY3VycmVudCB3aW4gdG8KLSAgIG1ha2luZyBpdCBzb21ldGhpbmcgZWxzZSAoIm5vdCB1c2luZyB0aGUgU0NBQ0hFIiBpcyBsaWtlIGhhdmluZyBhIGNhY2hlCi0gICBzaXplIG9mIDEpLgotICAgVGhlIHdpdGhvdXQtZXh0cmFjdGlvbiBjYXNlIHN0aWxsIHVzZXMgYW4gQVJHQlVGOgotICAgLSBjb25zaXN0ZW5jeSB3aXRoIHNjYWNoZSB2ZXJzaW9uCi0gICAtIHN0aWxsIG5lZWQgdG8gcmVjb3JkIHdoaWNoIG9wZXJhbmRzIGFyZSB3cml0dGVuCi0gICAgIFRoaXMgd291bGRuJ3QgYmUgbmVlZGVkIGlmIG1vZGVsaW5nIHdhcyBkb25lIGluIHRoZSBzZW1hbnRpYyByb3V0aW5lcwotICAgICBidXQgdGhpcyBpc24ndCBhcyBnZW5lcmFsIGFzIGhhbmRsaW5nIGl0IG91dHNpZGUgb2YgdGhlIHNlbWFudGljIHJvdXRpbmVzLgotICAgICBGb3IgZXhhbXBsZSBTaGFkZSBhbGxvd3MgY2FsbGluZyB1c2VyLXN1cHBsaWVkIGNvZGUgYmVmb3JlL2FmdGVyIGVhY2gKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgaXMgYmVpbmcgcGxhbm5lZC4KLSAgID8/PyBUaGVyZSBpcyBzdGlsbCBzb21lIGNsdW1zaW5lc3MgaW4gaG93IG11Y2ggb2YgQVJHQlVGIHRvIHVzZS4gICovCi10eXBlZGVmIFNDQUNIRSAqU0VNX0FSRzsKLQotLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcwotICAgPz8/IFRoaXMgd2FzIGludGVuZGVkIHRvIGJlIGEgc3RydWN0IG9mIHR3byBlbGVtZW50cyBpbiB0aGUgV0lUSF9TQ0FDSEVfUEJCCi0gICBjYXNlLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIElBRERSLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIFNDQUNIRSAqLgotICAgSGF2ZW4ndCBmb3VuZCB0aGUgdGltZSB5ZXQgdG8gbWFrZSB0aGlzIHdvcmssIGJ1dCBpdCBzZWVtZWQgYSBuaWNlciBhcHByb2FjaAotICAgdGhhbiB0aGUgY3VycmVudCBicl9jYWNoZSBzdHVmZi4gICovCi10eXBlZGVmIElBRERSIFBDQUREUjsKLQotLyogQ3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzLCB1c2VkIGJ5IGNvbW1vbi4gKi8KLXR5cGVkZWYgSUFERFIgQ0lBOwotCi0vKiBTZW1hbnRpYyByb3V0aW5lcycgdmVyc2lvbiBvZiB0aGUgUEMuICAqLwotI2lmIFdJVEhfU0NBQ0hFX1BCQgotdHlwZWRlZiBTQ0FDSEUgKlNFTV9QQzsKLSNlbHNlCi10eXBlZGVmIElBRERSIFNFTV9QQzsKLSNlbmRpZgotCi0vKiBLaW5kcyBvZiBicmFuY2hlcy4gICovCi10eXBlZGVmIGVudW0gewotICBTRU1fQlJBTkNIX1VOVEFLRU4sCi0gIC8qIEJyYW5jaCB0byBhbiB1bmNhY2hlYWJsZSBhZGRyZXNzIChlLmcuIGogcmVnKS4gICovCi0gIFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEUsCi0gIC8qIEJyYW5jaCB0byBhIGNhY2hlYWJsZSAoZml4ZWQpIGFkZHJlc3MuICAqLwotICBTRU1fQlJBTkNIX0NBQ0hFQUJMRQotfSBTRU1fQlJBTkNIX1RZUEU7Ci0MCi0vKiBWaXJ0dWFsIGluc24gc3VwcG9ydC4gICovCi0KLS8qIE9wY29kZSB0YWJsZSBmb3IgdmlydHVhbCBpbnNucyAob25seSB1c2VkIGJ5IHRoZSBzaW11bGF0b3IpLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gY2dlbl92aXJ0dWFsX2luc25fdGFibGVbXTsKLQotLyogLXZlIG9mIGluZGljZXMgb2YgdmlydHVhbCBpbnNucyBpbiBjZ2VuX3ZpcnR1YWxfaW5zbl90YWJsZS4gICovCi10eXBlZGVmIGVudW0gewotICBWSVJUVUFMX0lOU05fWF9JTlZBTElEID0gMCwKLSAgVklSVFVBTF9JTlNOX1hfQkVGT1JFID0gLTEsIFZJUlRVQUxfSU5TTl9YX0FGVEVSID0gLTIsCi0gIFZJUlRVQUxfSU5TTl9YX0JFR0lOID0gLTMsCi0gIFZJUlRVQUxfSU5TTl9YX0NIQUlOPSAtNCwgVklSVFVBTF9JTlNOX1hfQ1RJX0NIQUlOID0gLTUKLX0gQ0dFTl9JTlNOX1ZJUlRVQUxfVFlQRTsKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIENHRU5fSU5TTiogSU5TTiBpcyBhIHZpcnR1YWwgaW5zbi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9WSVJUVUFMX1AoaW5zbikgXAotICBDR0VOX0lOU05fQVRUUl9WQUxVRSAoKGluc24pLCBDR0VOX0lOU05fVklSVFVBTCkKLQwKLS8qIEdOVSBDJ3MgImNvbXB1dGVkIGdvdG8iIGZhY2lsaXR5IGlzIHVzZWQgdG8gc3BlZWQgdGhpbmdzIHVwIHdoZXJlCi0gICBwb3NzaWJsZS4gIFRoZXNlIG1hY3JvcyBwcm92aWRlIGEgcG9ydGFibGUgd2F5IHRvIHVzZSB0aGVtLgotICAgTmVzdGluZyBvZiB0aGVzZSBzd2l0Y2ggc3RhdGVtZW50cyBpcyBkb25lIGJ5IHByb3ZpZGluZyBhbiBleHRyYSBhcmd1bWVudAotICAgdGhhdCBkaXN0aW5ndWlzaGVzIHRoZW0uICBgTicgY2FuIGJlIGEgbnVtYmVyIG9yIHN5bWJvbC4KLSAgIFZhcmlhYmxlIGBsYWJlbHNfIyNOJyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGxhYmVscyBvZiBlYWNoIGNhc2UuICAqLwotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgU1dJVENIKE4sIFgpIGdvdG8gKlg7Ci0jZGVmaW5lIENBU0UoTiwgWCkgY2FzZV8jI04jI18jI1gKLSNkZWZpbmUgQlJFQUsoTikgZ290byBlbmRfc3dpdGNoXyMjTgotI2RlZmluZSBERUZBVUxUKE4pIGRlZmF1bHRfIyNOCi0jZGVmaW5lIEVORFNXSVRDSChOKSBlbmRfc3dpdGNoXyMjTjoKLSNlbHNlCi0jZGVmaW5lIFNXSVRDSChOLCBYKSBzd2l0Y2ggKFgpCi0jZGVmaW5lIENBU0UoTiwgWCkgY2FzZSBYIC8qIEZJWE1FOiBvbGQgc2VtLXN3aXRjaCBoYWQgKEBhcmNoQF8sWCkgaGVyZSAqLwotI2RlZmluZSBCUkVBSyhOKSBicmVhawotI2RlZmluZSBERUZBVUxUKE4pIGRlZmF1bHQKLSNkZWZpbmUgRU5EU1dJVENIKE4pCi0jZW5kaWYKLQwKLS8qIFNpbXVsYXRvciBzdGF0ZS4gICovCi0KLS8qIFJlY29yZHMgc2ltdWxhdG9yIGRlc2NyaXB0b3Igc28gdXRpbGl0aWVzIGxpa2UgQGNwdUBfZHVtcF9yZWdzIGNhbiBiZQotICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KLWV4dGVybiBTSU1fREVTQyBjdXJyZW50X3N0YXRlOwotCi0vKiBTaW11bGF0b3Igc3RhdGUuICAqLwotCi0vKiBDR0VOX1NUQVRFIGNvbnRhaW5zIGFkZGl0aW9uYWwgc3RhdGUgaW5mb3JtYXRpb24gbm90IHByZXNlbnQgaW4KLSAgIHNpbV9zdGF0ZV9iYXNlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9zdGF0ZSB7Ci0gIC8qIEZJWE1FOiBNb3ZlZCB0byBzaW1fc3RhdGVfYmFzZS4gICovCi0gIC8qIGFyZ3YsIGVudiAqLwotICBjaGFyICoqYXJndjsKLSNkZWZpbmUgU1RBVEVfQVJHVihzKSAoKHMpIC0+IGNnZW5fc3RhdGUuYXJndikKLSAgLyogRklYTUU6IE1vdmUgdG8gc2ltX3N0YXRlX2Jhc2UuICAqLwotICBjaGFyICoqZW52cDsKLSNkZWZpbmUgU1RBVEVfRU5WUChzKSAoKHMpIC0+IGNnZW5fc3RhdGUuZW52cCkKLQotICAvKiBOb24temVybyBpZiBubyB0cmFjaW5nIG9yIHByb2ZpbGluZyBpcyBzZWxlY3RlZC4gICovCi0gIGludCBydW5fZmFzdF9wOwotI2RlZmluZSBTVEFURV9SVU5fRkFTVF9QKHNkKSAoKHNkKSAtPiBjZ2VuX3N0YXRlLnJ1bl9mYXN0X3ApCi19IENHRU5fU1RBVEU7Ci0MCi0vKiBWYXJpb3VzIHV0aWxpdGllcy4gICovCi0KLS8qIENhbGxlZCBhZnRlciBzaW1fcG9zdF9hcmd2X2luaXQgdG8gZG8gYW55IGNnZW4gaW5pdGlhbGl6YXRpb24uICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9pbml0IChTSU1fREVTQyk7Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhbiBpbnNuLiAgKi8KLWV4dGVybiBDUFVfSU5TTl9OQU1FX0ZOIGNnZW5faW5zbl9uYW1lOwotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dHJhIGJ5dGVzIHJlcXVpcmVkIGZvciBhIHNpbV9jcHUgc3RydWN0LiAgKi8KLS8qID8/PyBPaywgeWVzLCB0aGlzIGlzIGxlc3MgcHJldHR5IHRoYW4gaXQgc2hvdWxkIGJlLiAgR2l2ZSBtZSBhIGJldHRlcgotICAgbGFuZ3VhZ2UgW29yIHN1Z2dlc3QgYSBiZXR0ZXIgd2F5XS4gICovCi1leHRlcm4gaW50IGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyAodm9pZCk7Ci0KLS8qIFRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHByb2Nlc3MgYW4gaW52YWxpZCBpbnN0cnVjdGlvbi4gICovCi1leHRlcm4gU0VNX1BDIHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChTSU1fQ1BVICosIElBRERSLCBTRU1fUEMpOwotCi0jZW5kaWYgLyogQ0dFTl9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1lbmdpbmUuaCBiL3NpbS9jb21tb24vY2dlbi1lbmdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkYWY4MC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tZW5naW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogRW5naW5lIGhlYWRlciBmb3IgQ3B1IHRvb2xzIEdFTmVyYXRlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgZW5nLmggYW5kIGJlZm9yZSAke2NwdX0uaC4KLSAgID8/PyBBIGxvdCBvZiB0aGlzIGNvdWxkIGJlIG1vdmVkIHRvIGdlbm1sb29wLnNoIHRvIGJlIHB1dCBpbiBlbmcuaAotICAgYW5kIHRodXMgcmVtb3ZlIHNvbWUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uICBXb3J0aCBpdD8gICovCi0KLS8qIFNlbWFudGljIGZ1bmN0aW9ucyBjb21lIGluIHNpeCB2ZXJzaW9ucyBvbiB0d28gYXhlczoKLSAgIGZhc3QvZnVsbC1mZWF0dXJlZCwgYW5kIHVzaW5nIG9uZSBvZiB0aGUgc2ltcGxlL3NjYWNoZS9jb21waWxhdGlvbiBlbmdpbmVzLgotICAgQSBmdWxsIGZlYXR1cmVkIHNpbXVsYXRvciBpcyBhbHdheXMgcHJvdmlkZWQuICAtLWVuYWJsZS1zaW0tZmFzdCBpbmNsdWRlcwotICAgc3VwcG9ydCBmb3IgZmFzdCBleGVjdXRpb24gYnkgZHVwbGljYXRpbmcgdGhlIHNlbWFudGljIGNvZGUgYnV0IGxlYXZpbmcKLSAgIG91dCBhbGwgZmVhdHVyZXMgbGlrZSB0cmFjaW5nIGFuZCBwcm9maWxpbmcuCi0gICBVc2luZyB0aGUgc2NhY2hlIGlzIHNlbGVjdGVkIHdpdGggLS1lbmFibGUtc2ltLXNjYWNoZS4gICovCi0vKiBGSVhNRTogLS1lbmFibGUtc2ltLWZhc3Qgbm90IGltcGxlbWVudGVkIHlldC4gICovCi0vKiBGSVhNRTogdW5kZWNpZGVkIGhvdyB0byBoYW5kbGUgV0lUSF9TQ0FDSEVfUEJCLiAgKi8KLQotLyogVGhlcmUgYXJlIHNldmVyYWwgc3R5bGVzIG9mIGVuZ2luZXMsIGFsbCBnZW5lcmFsbHkgc3VwcG9ydGVkIGJ5IHRoZQotICAgc2FtZSBjb2RlOgotCi0gICBXSVRIX1NDQUNIRSAmJiBXSVRIX1NDQUNIRV9QQkIgLSBwc2V1ZG8tYmFzaWMtYmxvY2sgc2NhY2hpbmcKLSAgIFdJVEhfU0NBQ0hFICYmICFXSVRIX1NDQUNIRV9QQkIgLSBzY2FjaGluZyBvbiBhbiBpbnNuIGJ5IGluc24gYmFzaXMKLSAgICFXSVRIX1NDQUNIRSAtIHNpbXBsZSBlbmdpbmU6IGZldGNoIGFuIGluc24sIGV4ZWN1dGUgYW4gaW5zbgotCi0gICBUaGUgIVdJVEhfU0NBQ0hFIGNhc2UgY2FuIGFsc28gYmUgYnJva2VuIHVwIGludG8gdHdvIGZsYXZvdXJzOgotICAgZXh0cmFjdCB0aGUgZmllbGRzIG9mIHRoZSBpbnNuIGludG8gYW4gQVJHQlVGIHN0cnVjdCwgb3IgZGVmZXIgdGhlCi0gICBleHRyYWN0aW9uIHRvIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgVGhlIGZvcm1lciBjYW4gYmUgdmlld2VkIGFzIHRoZQotICAgV0lUSF9TQ0FDSEUgY2FzZSB3aXRoIGEgY2FjaGUgc2l6ZSBvZiAxICh0aHVzIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYQotICAgV0lUSF9FWFRSQUNUSU9OIG1hY3JvKS4gIFRoZSBXSVRIX1NDQUNIRSBjYXNlIGFsd2F5cyBleHRyYWN0cyB0aGUgZmllbGRzCi0gICBpbnRvIGFuIEFSR0JVRiBzdHJ1Y3QuICAqLwotCi0jaWZuZGVmIENHRU5fRU5HSU5FX0gKLSNkZWZpbmUgQ0dFTl9FTkdJTkVfSAotCi0vKiBJbnN0cnVjdGlvbiBmaWVsZCBzdXBwb3J0IG1hY3Jvcy4gICovCi0KLSNkZWZpbmUgRVhUUkFDVF9NU0IwX0lOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCi0oKChJTlQpICh2YWwpIDw8ICgoc2l6ZW9mIChJTlQpICogOCkgLSAodG90YWwpICsgKHN0YXJ0KSkpIFwKLSA+PiAoKHNpemVvZiAoSU5UKSAqIDgpIC0gKGxlbmd0aCkpKQotI2RlZmluZSBFWFRSQUNUX01TQjBfVUlOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCi0oKChVSU5UKSAodmFsKSA8PCAoKHNpemVvZiAoVUlOVCkgKiA4KSAtICh0b3RhbCkgKyAoc3RhcnQpKSkgXAotID4+ICgoc2l6ZW9mIChVSU5UKSAqIDgpIC0gKGxlbmd0aCkpKQotCi0jZGVmaW5lIEVYVFJBQ1RfTFNCMF9JTlQodmFsLCB0b3RhbCwgc3RhcnQsIGxlbmd0aCkgXAotKCgoSU5UKSAodmFsKSA8PCAoKHNpemVvZiAoSU5UKSAqIDgpIC0gKHN0YXJ0KSAtIDEpKSBcCi0gPj4gKChzaXplb2YgKElOVCkgKiA4KSAtIChsZW5ndGgpKSkKLSNkZWZpbmUgRVhUUkFDVF9MU0IwX1VJTlQodmFsLCB0b3RhbCwgc3RhcnQsIGxlbmd0aCkgXAotKCgoVUlOVCkgKHZhbCkgPDwgKChzaXplb2YgKFVJTlQpICogOCkgLSAoc3RhcnQpIC0gMSkpIFwKLSA+PiAoKHNpemVvZiAoVUlOVCkgKiA4KSAtIChsZW5ndGgpKSkKLQwKLS8qIFNlbWFudGljIHJvdXRpbmVzLiAgKi8KLQotLyogVHlwZSBvZiB0aGUgbWFjaGluZSBnZW5lcmF0ZWQgZXh0cmFjdGlvbiBmbnMuICAqLwotLyogPz8/IE5vIGxvbmdlciB1c2VkLiAgKi8KLXR5cGVkZWYgdm9pZCAoRVhUUkFDVF9GTikgKFNJTV9DUFUgKiwgSUFERFIsIENHRU5fSU5TTl9JTlQsIEFSR0JVRiAqKTsKLQotLyogVHlwZSBvZiB0aGUgbWFjaGluZSBnZW5lcmF0ZWQgc2VtYW50aWMgZm5zLiAgKi8KLQotI2lmIFdJVEhfU0NBQ0hFCi0KLS8qIEluc3RydWN0aW9uIGZpZWxkcyBhcmUgZXh0cmFjdGVkIGludG8gQVJHQlVGIGJlZm9yZSBjYWxsaW5nIHRoZQotICAgc2VtYW50aWMgcm91dGluZS4gICovCi0jaWYgSEFWRV9QQVJBTExFTF9JTlNOUyAmJiAhIFdJVEhfUEFSQUxMRUxfR0VOV1JJVEUKLXR5cGVkZWYgU0VNX1BDIChTRU1BTlRJQ19GTikgKFNJTV9DUFUgKiwgU0VNX0FSRywgUEFSRVhFQyAqKTsKLSNlbHNlCi10eXBlZGVmIFNFTV9QQyAoU0VNQU5USUNfRk4pIChTSU1fQ1BVICosIFNFTV9BUkcpOwotI2VuZGlmCi0KLSNlbHNlCi0KLS8qIFJlc3VsdCBvZiBzZW1hbnRpYyByb3V0aW5lcyBpcyBhIHN0YXR1cyBpbmRpY2F0b3IgKHdpcCkuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0VNX1NUQVRVUzsKLQotLyogSW5zdHJ1Y3Rpb24gZmllbGRzIGFyZSBleHRyYWN0ZWQgYnkgdGhlIHNlbWFudGljIHJvdXRpbmUuCi0gICA/Pz8gVE9ETzogbXVsdGkgd29yZCBpbnNucy4gICovCi0jaWYgSEFWRV9QQVJBTExFTF9JTlNOUyAmJiAhIFdJVEhfUEFSQUxMRUxfR0VOV1JJVEUKLXR5cGVkZWYgU0VNX1NUQVRVUyAoU0VNQU5USUNfRk4pIChTSU1fQ1BVICosIFNFTV9BUkcsIFBBUkVYRUMgKiwgQ0dFTl9JTlNOX0lOVCk7Ci0jZWxzZQotdHlwZWRlZiBTRU1fU1RBVFVTIChTRU1BTlRJQ19GTikgKFNJTV9DUFUgKiwgU0VNX0FSRywgQ0dFTl9JTlNOX0lOVCk7Ci0jZW5kaWYKLQotI2VuZGlmCi0KLS8qIEluIHRoZSBBUkdCVUYgc3RydWN0LCBhIHBvaW50ZXIgdG8gdGhlIHNlbWFudGljIHJvdXRpbmUgZm9yIHRoZSBpbnNuLiAgKi8KLQotdW5pb24gc2VtIHsKLSNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCi0gIFNFTUFOVElDX0ZOICpzZW1fZnVsbDsKLSNlbmRpZgotI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZBU1QKLSAgU0VNQU5USUNfRk4gKnNlbV9mYXN0OwotI2VuZGlmCi0jaWYgV0lUSF9TRU1fU1dJVENIX0ZVTEwgfHwgV0lUSF9TRU1fU1dJVENIX0ZBU1QKLSNpZmRlZiBfX0dOVUNfXwotICB2b2lkICpzZW1fY2FzZTsKLSNlbHNlCi0gIGludCBzZW1fY2FzZTsKLSNlbmRpZgotI2VuZGlmCi19OwotCi0vKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHNlbWFudGljIGhhbmRsZXIgaW4gQUJVRi4gICovCi0KLSNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTAotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFNFTV9TRVRfRlVMTF9DT0RFKGFidWYsIGlkZXNjKSBcCi0gIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fY2FzZSA9IChpZGVzYyktPnNlbV9mdWxsX2xhYjsgfSB3aGlsZSAoMCkKLSNlbHNlIAotI2RlZmluZSBTRU1fU0VUX0ZVTExfQ09ERShhYnVmLCBpZGVzYykgXAotICBkbyB7IChhYnVmKS0+c2VtYW50aWMuc2VtX2Nhc2UgPSAoaWRlc2MpLT5udW07IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIFNFTV9TRVRfRlVMTF9DT0RFKGFidWYsIGlkZXNjKSBcCi0gIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fZnVsbCA9IChpZGVzYyktPnNlbV9mdWxsOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBXSVRIX1NFTV9TV0lUQ0hfRkFTVAotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFNFTV9TRVRfRkFTVF9DT0RFKGFidWYsIGlkZXNjKSBcCi0gIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fY2FzZSA9IChpZGVzYyktPnNlbV9mYXN0X2xhYjsgfSB3aGlsZSAoMCkKLSNlbHNlIAotI2RlZmluZSBTRU1fU0VUX0ZBU1RfQ09ERShhYnVmLCBpZGVzYykgXAotICBkbyB7IChhYnVmKS0+c2VtYW50aWMuc2VtX2Nhc2UgPSAoaWRlc2MpLT5udW07IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIFNFTV9TRVRfRkFTVF9DT0RFKGFidWYsIGlkZXNjKSBcCi0gIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fZmFzdCA9IChpZGVzYyktPnNlbV9mYXN0OyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgU0VNX1NFVF9DT0RFKGFidWYsIGlkZXNjLCBmYXN0X3ApIFwKLWRvIHsgXAotICBpZiAoZmFzdF9wKSBcCi0gICAgU0VNX1NFVF9GQVNUX0NPREUgKChhYnVmKSwgKGlkZXNjKSk7IFwKLSAgZWxzZSBcCi0gICAgU0VNX1NFVF9GVUxMX0NPREUgKChhYnVmKSwgKGlkZXNjKSk7IFwKLX0gd2hpbGUgKDApCi0MCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgSURFU0MgaXMgYSBjb25kaXRpb25hbCBvciB1bmNvbmRpdGlvbmFsIENUSS4gICovCi0KLSNkZWZpbmUgSURFU0NfQ1RJX1AoaWRlc2MpIFwKLSAgICAgKChDR0VOX0FUVFJfQk9PTFMgKENHRU5fSU5TTl9BVFRSUyAoKGlkZXNjKS0+aWRhdGEpKSBcCi0gICAgICAgJiAoQ0dFTl9BVFRSX01BU0sgKENHRU5fSU5TTl9DT05EX0NUSSkgXAotCSAgfCBDR0VOX0FUVFJfTUFTSyAoQ0dFTl9JTlNOX1VOQ09ORF9DVEkpKSkgXAotICAgICAgIT0gMCkKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElERVNDIGlzIGEgc2tpcCBpbnNuLiAgKi8KLQotI2RlZmluZSBJREVTQ19TS0lQX1AoaWRlc2MpIFwKLSAgICAgKChDR0VOX0FUVFJfQk9PTFMgKENHRU5fSU5TTl9BVFRSUyAoKGlkZXNjKS0+aWRhdGEpKSBcCi0gICAgICAgJiBDR0VOX0FUVFJfTUFTSyAoQ0dFTl9JTlNOX1NLSVBfQ1RJKSkgXAotICAgICAgIT0gMCkKLQotLyogUmV0dXJuIHBvaW50ZXIgdG8gQVJHQlVGIGdpdmVuIHB0ciB0byBTQ0FDSEUuICAqLwotI2RlZmluZSBTRU1fQVJHQlVGKHNlbV9hcmcpICgmIChzZW1fYXJnKSAtPiBhcmdidWYpCi0KLS8qIFRoZXJlIGFyZSBzZXZlcmFsIHN0eWxlcyBvZiBlbmdpbmVzLCBhbGwgZ2VuZXJhbGx5IHN1cHBvcnRlZCBieSB0aGUKLSAgIHNhbWUgY29kZToKLQotICAgV0lUSF9TQ0FDSEUgJiYgV0lUSF9TQ0FDSEVfUEJCIC0gcHNldWRvLWJhc2ljLWJsb2NrIHNjYWNoaW5nCi0gICBXSVRIX1NDQUNIRSAmJiAhV0lUSF9TQ0FDSEVfUEJCIC0gc2NhY2hpbmcgb24gYW4gaW5zbiBieSBpbnNuIGJhc2lzCi0gICAhV0lUSF9TQ0FDSEUgLSBzaW1wbGUgZW5naW5lOiBmZXRjaCBhbiBpbnNuLCBleGVjdXRlIGFuIGluc24KLQotICAgPz8/IFRoZSAhV0lUSF9TQ0FDSEUgY2FzZSBjYW4gYWxzbyBiZSBicm9rZW4gdXAgaW50byB0d28gZmxhdm91cnM6Ci0gICBleHRyYWN0IHRoZSBmaWVsZHMgb2YgdGhlIGluc24gaW50byBhbiBBUkdCVUYgc3RydWN0LCBvciBkZWZlciB0aGUKLSAgIGV4dHJhY3Rpb24gdG8gdGhlIHNlbWFudGljIGhhbmRsZXIuICBUaGUgV0lUSF9TQ0FDSEUgY2FzZSBhbHdheXMKLSAgIGV4dHJhY3RzIHRoZSBmaWVsZHMgaW50byBhbiBBUkdCVUYgc3RydWN0LiAgKi8KLQotI2lmIFdJVEhfU0NBQ0hFCi0KLSNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoY2lhKQotCi0jaWYgV0lUSF9TQ0FDSEVfUEJCCi0KLS8qIFJldHVybiB0aGUgc2NhY2hlIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgaW5zbi4gICovCi0jZGVmaW5lIFNFTV9TRU1fQVJHKHZwYywgc2MpICh2cGMpCi0KLS8qIFJldHVybiB0aGUgdmlydHVhbCBwYyBvZiB0aGUgbmV4dCBpbnNuIHRvIGV4ZWN1dGUKLSAgIChhc3N1bWluZyB0aGlzIGlzbid0IGEgY3RpIG9yIHRoZSBicmFuY2ggaXNuJ3QgdGFrZW4pLiAgKi8KLSNkZWZpbmUgU0VNX05FWFRfVlBDKHNlbV9hcmcsIHBjLCBsZW4pICgoc2VtX2FyZykgKyAxKQotCi0vKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIGNvdW50ZXIuICAqLwotI2RlZmluZSBQQkJfVVBEQVRFX0lOU05fQ09VTlQoY3B1LHNjKSBcCi0gIChDUFVfSU5TTl9DT1VOVCAoY3B1KSArPSBTRU1fQVJHQlVGIChzYykgLT4gZmllbGRzLmNoYWluLmluc25fY291bnQpCi0KLS8qIERvIG5vdCBhcHBlbmQgYSBgOycgdG8gaW52b2NhdGlvbnMgb2YgdGhpcy4KLSAgIG5wYyxicl90eXBlIGFyZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBjdGkgaW5zbiBhbmQgY3RpLWNoYWluLiAgKi8KLSNkZWZpbmUgU0VNX0JSQU5DSF9JTklUIFwKLSAgSUFERFIgbnBjID0gMDsgLyogYXNzaWduIGEgdmFsdWUgZm9yIC1XYWxsICovIFwKLSAgU0VNX0JSQU5DSF9UWVBFIGJyX3R5cGUgPSBTRU1fQlJBTkNIX1VOVEFLRU47Ci0KLS8qIFNFTV9JTl9TV0lUQ0ggaXMgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBtYWlubG9vcC5jIGZpbGVzCi0gICBnZW5lcmF0ZWQgYnkgZ2VubWxvb3Auc2guICBJdCBleGlzdHMgc28gZ2VuZXJhdGVkIHNlbWFudGljIGNvZGUgbmVlZG4ndAotICAgY2FyZSB3aGV0aGVyIGl0J3MgYmVpbmcgcHV0IGluIGEgc3dpdGNoIG9yIGluIGEgZnVuY3Rpb24uICAqLwotI2lmZGVmIFNFTV9JTl9TV0lUQ0gKLSNkZWZpbmUgU0VNX0JSQU5DSF9GSU5JKHBjdmFyKSBcCi1kbyB7IFwKLSAgcGJiX2JyX25wYyA9IG5wYzsgXAotICBwYmJfYnJfdHlwZSA9IGJyX3R5cGU7IFwKLX0gd2hpbGUgKDApCi0jZWxzZSAvKiAxIHNlbWFudGljIGZ1bmN0aW9uIHBlciBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBTRU1fQlJBTkNIX0ZJTkkocGN2YXIpIFwKLWRvIHsgXAotICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpID0gbnBjOyBcCi0gIENQVV9QQkJfQlJfVFlQRSAoY3VycmVudF9jcHUpID0gYnJfdHlwZTsgXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0NBQ0hFKGNwdSwgc2MsIG5ld3ZhbCwgcGN2YXIpIFwKLWRvIHsgXAotICBucGMgPSAobmV3dmFsKTsgXAotICBicl90eXBlID0gU0VNX0JSQU5DSF9DQUNIRUFCTEU7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VNX0JSQU5DSF9WSUFfQUREUihjcHUsIHNjLCBuZXd2YWwsIHBjdmFyKSBcCi1kbyB7IFwKLSAgbnBjID0gKG5ld3ZhbCk7IFwKLSAgYnJfdHlwZSA9IFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEU7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VNX1NLSVBfQ09NUElMRShjcHUsIHNjLCBza2lwKSBcCi1kbyB7IFwKLSAgU0VNX0FSR0JVRiAoc2MpIC0+IHNraXBfY291bnQgPSAoc2tpcCk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VNX1NLSVBfSU5TTihjcHUsIHNjLCB2cGN2YXIpIFwKLWRvIHsgXAotICAodnBjdmFyKSArPSBTRU1fQVJHQlVGIChzYykgLT4gc2tpcF9jb3VudDsgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UgLyogISBXSVRIX1NDQUNIRV9QQkIgKi8KLQotI2RlZmluZSBTRU1fU0VNX0FSRyh2cGMsIHNjKSAoc2MpCi0KLSNkZWZpbmUgU0VNX05FWFRfVlBDKHNlbV9hcmcsIHBjLCBsZW4pICgocGMpICsgKGxlbikpCi0KLS8qID8/PyBNYXkgd2lzaCB0byBtb3ZlIHRha2VuX3Agb3V0IG9mIGhlcmUgYW5kIG1ha2UgaXQgZXhwbGljaXQuICAqLwotI2RlZmluZSBTRU1fQlJBTkNIX0lOSVQgXAotICBpbnQgdGFrZW5fcCA9IDA7Ci0KLSNpZm5kZWYgVEFSR0VUX1NFTV9CUkFOQ0hfRklOSQotI2RlZmluZSBUQVJHRVRfU0VNX0JSQU5DSF9GSU5JKHBjdmFyLCB0YWtlbl9wKQotI2VuZGlmCi0jZGVmaW5lIFNFTV9CUkFOQ0hfRklOSShwY3ZhcikgXAotICBkbyB7IFRBUkdFVF9TRU1fQlJBTkNIX0ZJTkkgKHBjdmFyLCB0YWtlbl9wKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTRU1fQlJBTkNIX1ZJQV9DQUNIRShjcHUsIHNjLCBuZXd2YWwsIHBjdmFyKSBcCi1kbyB7IFwKLSAgKHBjdmFyKSA9IChuZXd2YWwpOyBcCi0gIHRha2VuX3AgPSAxOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0FERFIoY3B1LCBzYywgbmV3dmFsLCBwY3ZhcikgXAotZG8geyBcCi0gIChwY3ZhcikgPSAobmV3dmFsKTsgXAotICB0YWtlbl9wID0gMTsgXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCi0KLSNlbHNlIC8qICEgV0lUSF9TQ0FDSEUgKi8KLQotLyogVGhpcyBpcyB0aGUgInNpbXBsZSIgZW5naW5lIGNhc2UuICAqLwotCi0jZGVmaW5lIENJQV9BRERSKGNpYSkgKGNpYSkKLQotI2RlZmluZSBTRU1fU0VNX0FSRyh2cGMsIHNjKSAoc2MpCi0KLSNkZWZpbmUgU0VNX05FWFRfVlBDKHNlbV9hcmcsIHBjLCBsZW4pICgocGMpICsgKGxlbikpCi0KLSNkZWZpbmUgU0VNX0JSQU5DSF9JTklUIFwKLSAgaW50IHRha2VuX3AgPSAwOwotCi0jZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0NBQ0hFKGNwdSwgYWJ1ZiwgbmV3dmFsLCBwY3ZhcikgXAotZG8geyBcCi0gIChwY3ZhcikgPSAobmV3dmFsKTsgXAotICB0YWtlbl9wID0gMTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTRU1fQlJBTkNIX1ZJQV9BRERSKGNwdSwgYWJ1ZiwgbmV3dmFsLCBwY3ZhcikgXAotZG8geyBcCi0gIChwY3ZhcikgPSAobmV3dmFsKTsgXAotICB0YWtlbl9wID0gMTsgXAotfSB3aGlsZSAoMCkKLQotLyogRmluaXNoIG9mZiBicmFuY2ggaW5zbnMuCi0gICBUaGUgdGFyZ2V0IG11c3QgZGVmaW5lIFRBUkdFVF9TRU1fQlJBTkNIX0ZJTkkuCi0gICA/Pz8gVGhpcyBjYW4gcHJvYmFibHkgZ28gYXdheSB3aGVuIGRlZmluZS1leGVjdXRlIGlzIGZpbmlzaGVkLiAgKi8KLSNkZWZpbmUgU0VNX0JSQU5DSF9GSU5JKHBjdmFyLCBib29sX2F0dHJzKSBcCi0gIGRvIHsgVEFSR0VUX1NFTV9CUkFOQ0hfRklOSSAoKHBjdmFyKSwgKGJvb2xfYXR0cnMpLCB0YWtlbl9wKTsgfSB3aGlsZSAoMCkKLQotLyogRmluaXNoIG9mZiBub24tYnJhbmNoIGluc25zLgotICAgVGhlIHRhcmdldCBtdXN0IGRlZmluZSBUQVJHRVRfU0VNX05CUkFOQ0hfRklOSS4KLSAgID8/PyBUaGlzIGNhbiBwcm9iYWJseSBnbyBhd2F5IHdoZW4gZGVmaW5lLWV4ZWN1dGUgaXMgZmluaXNoZWQuICAqLwotI2RlZmluZSBTRU1fTkJSQU5DSF9GSU5JKHBjdmFyLCBib29sX2F0dHJzKSBcCi0gIGRvIHsgVEFSR0VUX1NFTV9OQlJBTkNIX0ZJTkkgKChwY3ZhciksIChib29sX2F0dHJzKSk7IH0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFICovCi0MCi0vKiBJbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0KLS8qIFNhbml0eSBjaGVjaywgYXQgbW9zdCBvbmUgb2YgdGhlc2UgbWF5IGJlIHRydWUuICAqLwotI2lmIFdJVEhfUEFSQUxMRUxfUkVBRCArIFdJVEhfUEFSQUxMRUxfV1JJVEUgKyBXSVRIX1BBUkFMTEVMX0dFTldSSVRFID4gMQotI2Vycm9yICJBdCBtb3N0IG9uZSBvZiBXSVRIX1BBUkFMTEVMX3tSRUFELFdSSVRFLEdFTldSSVRFfSBjYW4gYmUgdHJ1ZS4iCi0jZW5kaWYKLQotLyogQ29tcGlsZSB0aW1lIGNvbXB1dGFibGUgaW5zdHJ1Y3Rpb24gZGF0YS4gICovCi0KLXN0cnVjdCBpbnNuX3NlbSB7Ci0gIC8qIFRoZSBpbnN0cnVjdGlvbiB0eXBlIChhIG51bWJlciB0aGF0IGlkZW50aWZpZXMgZWFjaCBpbnNuIG92ZXIgdGhlCi0gICAgIGVudGlyZSBhcmNoaXRlY3R1cmUpLiAgKi8KLSAgQ0dFTl9JTlNOX1RZUEUgdHlwZTsKLQotICAvKiBJbmRleCBpbiBJREVTQyB0YWJsZS4gICovCi0gIGludCBpbmRleDsKLQotICAvKiBTZW1hbnRpYyBmb3JtYXQgbnVtYmVyLiAgKi8KLSAgaW50IHNmbXQ7Ci0KLSNpZiBIQVZFX1BBUkFMTEVMX0lOU05TICYmICEgV0lUSF9QQVJBTExFTF9PTkxZCi0gIC8qIEluZGV4IGluIElERVNDIHRhYmxlIG9mIHBhcmFsbGVsIGhhbmRsZXIuICAqLwotICBpbnQgcGFyX2luZGV4OwotI2VuZGlmCi0KLSNpZiBXSVRIX1BBUkFMTEVMX1JFQUQKLSAgLyogSW5kZXggaW4gSURFU0MgdGFibGUgb2YgcmVhZCBoYW5kbGVyLiAgKi8KLSAgaW50IHJlYWRfaW5kZXg7Ci0jZW5kaWYKLQotI2lmIFdJVEhfUEFSQUxMRUxfV1JJVEUKLSAgLyogSW5kZXggaW4gSURFU0MgdGFibGUgb2Ygd3JpdGViYWNrIGhhbmRsZXIuICAqLwotICBpbnQgd3JpdGVfaW5kZXg7Ci0jZW5kaWYKLX07Ci0KLS8qIEVudHJ5IGluIHNlbWFudGljIGZ1bmN0aW9uIHRhYmxlLgotICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgdG8gdGhlIGluc24gZGVzY3JpcHRvciB0YWJsZSBhdCBydW4tdGltZS4gICovCi0KLXN0cnVjdCBzZW1fZm5fZGVzYyB7Ci0gIC8qIEluZGV4IGluIElERVNDIHRhYmxlLiAgKi8KLSAgaW50IGluZGV4OwotCi0gIC8qIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zbi4gICovCi0gIFNFTUFOVElDX0ZOICpmbjsKLX07Ci0KLS8qIFJ1bi10aW1lIGNvbXB1dGVkIGluc3RydWN0aW9uIGRlc2NyaXB0b3IuICAqLwotCi1zdHJ1Y3QgaWRlc2MgewotI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCi0jaWZkZWYgX19HTlVDX18KLSAgdm9pZCAqc2VtX2Zhc3RfbGFiOwotI2Vsc2UKLSAgLyogbm90aGluZyBuZWVkZWQsIHN3aXRjaCdzIG9uIGBudW0nIG1lbWJlciAqLwotI2VuZGlmCi0jZWxzZQotICBTRU1BTlRJQ19GTiAqc2VtX2Zhc3Q7Ci0jZW5kaWYKLQotI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMCi0jaWZkZWYgX19HTlVDX18KLSAgdm9pZCAqc2VtX2Z1bGxfbGFiOwotI2Vsc2UKLSAgLyogbm90aGluZyBuZWVkZWQsIHN3aXRjaCdzIG9uIGBudW0nIG1lbWJlciAqLwotI2VuZGlmCi0jZWxzZQotICBTRU1BTlRJQ19GTiAqc2VtX2Z1bGw7Ci0jZW5kaWYKLQotICAvKiBQYXJhbGxlbCBzdXBwb3J0LiAgKi8KLSNpZiBIQVZFX1BBUkFMTEVMX0lOU05TICYmICghIFdJVEhfUEFSQUxMRUxfT05MWSB8fCAoV0lUSF9QQVJBTExFTF9PTkxZICYmICEgV0lUSF9QQVJBTExFTF9HRU5XUklURSkpCi0gIC8qIFBvaW50ZXIgdG8gcGFyYWxsZWwgaGFuZGxlciBpZiBzZXJpYWwgaW5zbi4KLSAgICAgUG9pbnRlciB0byByZWFkYWhlYWQvd3JpdGViYWNrIGhhbmRsZXIgaWYgcGFyYWxsZWwgaW5zbi4gICovCi0gIHN0cnVjdCBpZGVzYyAqcGFyX2lkZXNjOwotI2VuZGlmCi0KLSAgLyogSW5zdHJ1Y3Rpb24gbnVtYmVyIChpbmRleCBpbiBJREVTQyB0YWJsZSwgcHJvZmlsZSB0YWJsZSkuCi0gICAgIEFsc28gdXNlZCB0byBzd2l0Y2ggb24gaW4gbm9uLWdjYyBzZW1hbnRpYyBzd2l0Y2hlcy4gICovCi0gIGludCBudW07Ci0KLSAgLyogU2VtYW50aWMgZm9ybWF0IGlkLiAgKi8KLSAgaW50IHNmbXQ7Ci0KLSAgLyogaW5zdHJ1Y3Rpb24gZGF0YSAobmFtZSwgYXR0cmlidXRlcywgc2l6ZSwgZXRjLikgKi8KLSAgY29uc3QgQ0dFTl9JTlNOICppZGF0YTsKLQotICAvKiBpbnN0cnVjdGlvbiBhdHRyaWJ1dGVzLCBjb3BpZWQgZnJvbSBgaWRhdGEnIGZvciBzcGVlZCAqLwotICBjb25zdCBDR0VOX0lOU05fQVRUUl9UWVBFICphdHRyczsKLQotICAvKiBpbnN0cnVjdGlvbiBsZW5ndGggaW4gYnl0ZXMsIGNvcGllZCBmcm9tIGBpZGF0YScgZm9yIHNwZWVkICovCi0gIGludCBsZW5ndGg7Ci0KLSAgLyogcHJvZmlsaW5nL21vZGVsbGluZyBzdXBwb3J0ICovCi0gIGNvbnN0IElOU05fVElNSU5HICp0aW1pbmc7Ci19OwotDAotLyogVHJhY2luZy9wcm9maWxpbmcuICAqLwotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgYSBiZWZvcmUvYWZ0ZXIgaGFuZGxlciBpcyBuZWVkZWQuCi0gICBXaGVuIHRyYWNpbmcvcHJvZmlsaW5nIGEgc2VsZWN0ZWQgcmFuZ2UgdGhlcmUncyBubyBuZWVkIHRvIHNsb3cKLSAgIGRvd24gc2ltdWxhdGlvbiBvZiB0aGUgb3RoZXIgaW5zbnMgKGV4Y2VwdCB0byBnZXQgbW9yZSBhY2N1cmF0ZSBkYXRhISkuCi0KLSAgID8/PyBNYXkgd2lzaCB0byBwcm9maWxlIGFsbCBpbnNucyBpZiBkb2luZyBpbnNuIHRyYWNpbmcsIG9yIHRvCi0gICBnZXQgbW9yZSBhY2N1cmF0ZSBjeWNsZSBkYXRhLgotCi0gICBGaXJzdCB0ZXN0IEFOWV9QIHNvIHdlIGF2b2lkIGEgcG90ZW50aWFsbHkgZXhwZW5zaXZlIEhJVF9QIGNhbGwKLSAgIFtpZiB0aGVyZSBhcmUgbG90cyBvZiBhZGRyZXNzIHJhbmdlc10uICAqLwotCi0jZGVmaW5lIFBDX0lOX1RSQUNFX1JBTkdFX1AoY3B1LCBwYykgXAotICAoVFJBQ0VfQU5ZX1AgKGNwdSkgXAotICAgJiYgQUREUl9SQU5HRV9ISVRfUCAoVFJBQ0VfUkFOR0UgKENQVV9UUkFDRV9EQVRBIChjcHUpKSwgKHBjKSkpCi0jZGVmaW5lIFBDX0lOX1BST0ZJTEVfUkFOR0VfUChjcHUsIHBjKSBcCi0gIChQUk9GSUxFX0FOWV9QIChjcHUpIFwKLSAgICYmIEFERFJfUkFOR0VfSElUX1AgKFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLCAocGMpKSkKLQotI2VuZGlmIC8qIENHRU5fRU5HSU5FX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1mcHUuYyBiL3NpbS9jb21tb24vY2dlbi1mcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZDUxOS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tZnB1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBDR0VOIGZwdSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTkgQ3lnbnVzIFNvbHV0aW9ucy4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1mcHUuaCIKLQotLyogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBYIGlzIGFuIHNuYW4uICAqLwotCi1CSQotY2dlbl9zZl9zbmFuX3AgKENHRU5fRlBVKiBmcHUsIFNGIHgpCi17Ci0gIHNpbV9mcHUgb3AxOwotCi0gIHNpbV9mcHVfMzJ0byAoJm9wMSwgeCk7Ci0gIHJldHVybiBzaW1fZnB1X2lzX25hbiAoJm9wMSk7Ci19Ci0KLUJJCi1jZ2VuX2RmX3NuYW5fcCAoQ0dFTl9GUFUqIGZwdSwgREYgeCkKLXsKLSAgc2ltX2ZwdSBvcDE7Ci0KLSAgc2ltX2ZwdV82NHRvICgmb3AxLCB4KTsKLSAgcmV0dXJuIHNpbV9mcHVfaXNfbmFuICgmb3AxKTsKLX0KLQotLyogTm8tb3AgZnB1IGVycm9yIGhhbmRsZXIuICAqLwotCi12b2lkCi1jZ2VuX2ZwdV9pZ25vcmVfZXJyb3JzIChDR0VOX0ZQVSogZnB1LCBpbnQgc3RhdHVzKQotewotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLWZwdS5oIGIvc2ltL2NvbW1vbi9jZ2VuLWZwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzMzNjRlLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi1mcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiBDR0VOIGZwdSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTkgQ3lnbnVzIFNvbHV0aW9ucy4gICovCi0KLSNpZm5kZWYgQ0dFTl9GUFVfSAotI2RlZmluZSBDR0VOX0ZQVV9ICi0KLS8qIEZsb2F0aW5nIHBvaW50IHN1cHBvcnQgaXMgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZC4KLSAgIFdlIHdhbnQgdG8gc3VwcG9ydCB1c2luZyBlaXRoZXIgaG9zdCBmcCBpbnNucyBvciBhbiBhY2N1cmF0ZSBmcCBsaWJyYXJ5LgotICAgV2UgYWxzbyB3YW50IHRvIHN1cHBvcnQgZWFzaWx5IGFkZGVkIHZhcmlhbnRzIChlLmcuIG1vZGlmaWVkIGllZWUpLgotICAgVGhpcyBpcyBkb25lIGJ5IHZlY3RvcmluZyBhbGwgY2FsbHMgdGhyb3VnaCBhIHRhYmxlLiAgKi8KLQotdHlwZWRlZiBVU0kgU0Y7Ci10eXBlZGVmIFVESSBERjsKLXR5cGVkZWYgc3RydWN0IHsgU0kgcGFydHNbM107IH0gWEY7Ci10eXBlZGVmIHN0cnVjdCB7IFNJIHBhcnRzWzRdOyB9IFRGOwotCi0jaWZuZGVmIFRBUkdFVF9FWFRfRlBfV09SRFMKLSNkZWZpbmUgVEFSR0VUX0VYVF9GUF9XT1JEUyA0Ci0jZW5kaWYKLQotLyogZm9yd2FyZCBkZWNsICovCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2ZwX29wcyBDR0VOX0ZQX09QUzsKLQotLyogSW5zdGFuY2Ugb2YgYW4gZnB1LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBVc3VhbGx5IGEgcG9pbnRlciBiYWNrIHRvIHRoZSBTSU1fQ1BVIHN0cnVjdC4gICovCi0gIHZvaWQqIG93bmVyOwotICAvKiBQb2ludGVyIHRvIG9wcyBzdHJ1Y3QsIHJhdGhlciB0aGFuIGNvcHkgb2YgaXQsIHRvIGF2b2lkIGJsb2F0aW5nCi0gICAgIFNJTV9DUFUgc3RydWN0LiAgKi8KLSAgQ0dFTl9GUF9PUFMqIG9wczsKLX0gQ0dFTl9GUFU7Ci0KLS8qIHJlc3VsdCBvZiBjbXAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgLyogPz8/IE1heSB3aXNoIHRvIGRpc3Rpbmd1aXNoIHFuYW4vc25hbiBoZXJlLiAgKi8KLSAgRlBfQ01QX0VRLCBGUF9DTVBfTFQsIEZQX0NNUF9HVCwgRlBfQ01QX05BTgotfSBDR0VOX0ZQX0NNUDsKLQotLyogZXJyb3IgaGFuZGxlciAqLwotCi10eXBlZGVmIHZvaWQgKENHRU5fRlBVX0VSUk9SX0ZOKSAoQ0dFTl9GUFUqLCBpbnQpOwotCi0vKiBmcHUgb3BlcmF0aW9uIHRhYmxlICovCi0KLXN0cnVjdCBjZ2VuX2ZwX29wcyB7Ci0KLSAgLyogZXJyb3IgKGUuZy4gc2lnbmFsbGluZyBuYW4pIGhhbmRsZXIsIHN1cHBsaWVkIGJ5IG93bmVyICovCi0KLSAgQ0dFTl9GUFVfRVJST1JfRk4gKmVycm9yOwotCi0gIC8qIGJhc2ljIFNGIG9wcyAqLwotCi0gIFNGICgqYWRkc2YpIChDR0VOX0ZQVSosIFNGLCBTRik7Ci0gIFNGICgqc3Vic2YpIChDR0VOX0ZQVSosIFNGLCBTRik7Ci0gIFNGICgqbXVsc2YpIChDR0VOX0ZQVSosIFNGLCBTRik7Ci0gIFNGICgqZGl2c2YpIChDR0VOX0ZQVSosIFNGLCBTRik7Ci0gIFNGICgqbmVnc2YpIChDR0VOX0ZQVSosIFNGKTsKLSAgU0YgKCphYnNzZikgKENHRU5fRlBVKiwgU0YpOwotICBTRiAoKnNxcnRzZikgKENHRU5fRlBVKiwgU0YpOwotICBTRiAoKmludnNmKSAoQ0dFTl9GUFUqLCBTRik7Ci0gIFNGICgqY29zc2YpIChDR0VOX0ZQVSosIFNGKTsKLSAgU0YgKCpzaW5zZikgKENHRU5fRlBVKiwgU0YpOwotICBTRiAoKm1pbnNmKSAoQ0dFTl9GUFUqLCBTRiwgU0YpOwotICBTRiAoKm1heHNmKSAoQ0dFTl9GUFUqLCBTRiwgU0YpOwotCi0gIC8qID8/PyB0byBiZSByZXZpc2l0ZWQgKi8KLSAgQ0dFTl9GUF9DTVAgKCpjbXBzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqZXFzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqbmVzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqbHRzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqbGVzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqZ3RzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLSAgaW50ICgqZ2VzZikgKENHRU5fRlBVKiwgU0YsIFNGKTsKLQotICAvKiBiYXNpYyBERiBvcHMgKi8KLQotICBERiAoKmFkZGRmKSAoQ0dFTl9GUFUqLCBERiwgREYpOwotICBERiAoKnN1YmRmKSAoQ0dFTl9GUFUqLCBERiwgREYpOwotICBERiAoKm11bGRmKSAoQ0dFTl9GUFUqLCBERiwgREYpOwotICBERiAoKmRpdmRmKSAoQ0dFTl9GUFUqLCBERiwgREYpOwotICBERiAoKm5lZ2RmKSAoQ0dFTl9GUFUqLCBERik7Ci0gIERGICgqYWJzZGYpIChDR0VOX0ZQVSosIERGKTsKLSAgREYgKCpzcXJ0ZGYpIChDR0VOX0ZQVSosIERGKTsKLSAgREYgKCppbnZkZikgKENHRU5fRlBVKiwgREYpOwotICBERiAoKmNvc2RmKSAoQ0dFTl9GUFUqLCBERik7Ci0gIERGICgqc2luZGYpIChDR0VOX0ZQVSosIERGKTsKLSAgREYgKCptaW5kZikgKENHRU5fRlBVKiwgREYsIERGKTsKLSAgREYgKCptYXhkZikgKENHRU5fRlBVKiwgREYsIERGKTsKLQotICAvKiA/Pz8gdG8gYmUgcmV2aXNpdGVkICovCi0gIENHRU5fRlBfQ01QICgqY21wZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKmVxZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKm5lZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKmx0ZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKmxlZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKmd0ZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0gIGludCAoKmdlZGYpIChDR0VOX0ZQVSosIERGLCBERik7Ci0KLSAgLyogU0YvREYgY29udmVyc2lvbiBvcHMgKi8KLQotICBERiAoKmZleHRzZmRmKSAoQ0dFTl9GUFUqLCBTRik7Ci0gIFNGICgqZnRydW5jZGZzZikgKENHRU5fRlBVKiwgREYpOwotCi0gIFNGICgqZmxvYXRzaXNmKSAoQ0dFTl9GUFUqLCBTSSk7Ci0gIFNGICgqZmxvYXRkaXNmKSAoQ0dFTl9GUFUqLCBESSk7Ci0gIFNGICgqdWZsb2F0c2lzZikgKENHRU5fRlBVKiwgVVNJKTsKLSAgU0YgKCp1ZmxvYXRkaXNmKSAoQ0dFTl9GUFUqLCBVREkpOwotCi0gIFNJICgqZml4c2ZzaSkgKENHRU5fRlBVKiwgU0YpOwotICBESSAoKmZpeHNmZGkpIChDR0VOX0ZQVSosIFNGKTsKLSAgVVNJICgqdWZpeHNmc2kpIChDR0VOX0ZQVSosIFNGKTsKLSAgVURJICgqdWZpeHNmZGkpIChDR0VOX0ZQVSosIFNGKTsKLQotICBERiAoKmZsb2F0c2lkZikgKENHRU5fRlBVKiwgU0kpOwotICBERiAoKmZsb2F0ZGlkZikgKENHRU5fRlBVKiwgREkpOwotICBERiAoKnVmbG9hdHNpZGYpIChDR0VOX0ZQVSosIFVTSSk7Ci0gIERGICgqdWZsb2F0ZGlkZikgKENHRU5fRlBVKiwgVURJKTsKLQotICBTSSAoKmZpeGRmc2kpIChDR0VOX0ZQVSosIERGKTsKLSAgREkgKCpmaXhkZmRpKSAoQ0dFTl9GUFUqLCBERik7Ci0gIFVTSSAoKnVmaXhkZnNpKSAoQ0dFTl9GUFUqLCBERik7Ci0gIFVESSAoKnVmaXhkZmRpKSAoQ0dFTl9GUFUqLCBERik7Ci0KLSAgLyogWEYgbW9kZSBzdXBwb3J0IChrZXB0IHNlcGFyYXRlICdjdXMgbm90IGFsd2F5cyBwcmVzZW50KSAqLwotCi0gIFhGICgqYWRkeGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIFhGICgqc3VieGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIFhGICgqbXVseGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIFhGICgqZGl2eGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIFhGICgqbmVneGYpIChDR0VOX0ZQVSosIFhGKTsKLSAgWEYgKCphYnN4ZikgKENHRU5fRlBVKiwgWEYpOwotICBYRiAoKnNxcnR4ZikgKENHRU5fRlBVKiwgWEYpOwotICBYRiAoKmludnhmKSAoQ0dFTl9GUFUqLCBYRik7Ci0gIFhGICgqY29zeGYpIChDR0VOX0ZQVSosIFhGKTsKLSAgWEYgKCpzaW54ZikgKENHRU5fRlBVKiwgWEYpOwotICBYRiAoKm1pbnhmKSAoQ0dFTl9GUFUqLCBYRiwgWEYpOwotICBYRiAoKm1heHhmKSAoQ0dFTl9GUFUqLCBYRiwgWEYpOwotCi0gIENHRU5fRlBfQ01QICgqY21weGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKmVxeGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKm5leGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKmx0eGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKmxleGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKmd0eGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0gIGludCAoKmdleGYpIChDR0VOX0ZQVSosIFhGLCBYRik7Ci0KLSAgWEYgKCpleHRzZnhmKSAoQ0dFTl9GUFUqLCBTRik7Ci0gIFhGICgqZXh0ZGZ4ZikgKENHRU5fRlBVKiwgREYpOwotICBTRiAoKnRydW5jeGZzZikgKENHRU5fRlBVKiwgWEYpOwotICBERiAoKnRydW5jeGZkZikgKENHRU5fRlBVKiwgWEYpOwotCi0gIFhGICgqZmxvYXRzaXhmKSAoQ0dFTl9GUFUqLCBTSSk7Ci0gIFhGICgqZmxvYXRkaXhmKSAoQ0dFTl9GUFUqLCBESSk7Ci0gIFhGICgqdWZsb2F0c2l4ZikgKENHRU5fRlBVKiwgVVNJKTsKLSAgWEYgKCp1ZmxvYXRkaXhmKSAoQ0dFTl9GUFUqLCBVREkpOwotCi0gIFNJICgqZml4eGZzaSkgKENHRU5fRlBVKiwgWEYpOwotICBESSAoKmZpeHhmZGkpIChDR0VOX0ZQVSosIFhGKTsKLSAgVVNJICgqdWZpeHhmc2kpIChDR0VOX0ZQVSosIFhGKTsKLSAgVURJICgqdWZpeHhmZGkpIChDR0VOX0ZQVSosIFhGKTsKLQotICAvKiBURiBtb2RlIHN1cHBvcnQgKGtlcHQgc2VwYXJhdGUgJ2N1cyBub3QgYWx3YXlzIHByZXNlbnQpICovCi0KLSAgVEYgKCphZGR0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgVEYgKCpzdWJ0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgVEYgKCptdWx0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgVEYgKCpkaXZ0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgVEYgKCpuZWd0ZikgKENHRU5fRlBVKiwgVEYpOwotICBURiAoKmFic3RmKSAoQ0dFTl9GUFUqLCBURik7Ci0gIFRGICgqc3FydHRmKSAoQ0dFTl9GUFUqLCBURik7Ci0gIFRGICgqaW52dGYpIChDR0VOX0ZQVSosIFRGKTsKLSAgVEYgKCpjb3N0ZikgKENHRU5fRlBVKiwgVEYpOwotICBURiAoKnNpbnRmKSAoQ0dFTl9GUFUqLCBURik7Ci0gIFRGICgqbWludGYpIChDR0VOX0ZQVSosIFRGLCBURik7Ci0gIFRGICgqbWF4dGYpIChDR0VOX0ZQVSosIFRGLCBURik7Ci0KLSAgQ0dFTl9GUF9DTVAgKCpjbXB0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqZXF0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqbmV0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqbHR0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqbGV0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqZ3R0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLSAgaW50ICgqZ2V0ZikgKENHRU5fRlBVKiwgVEYsIFRGKTsKLQotICBURiAoKmV4dHNmdGYpIChDR0VOX0ZQVSosIFNGKTsKLSAgVEYgKCpleHRkZnRmKSAoQ0dFTl9GUFUqLCBERik7Ci0gIFNGICgqdHJ1bmN0ZnNmKSAoQ0dFTl9GUFUqLCBURik7Ci0gIERGICgqdHJ1bmN0ZmRmKSAoQ0dFTl9GUFUqLCBURik7Ci0KLSAgVEYgKCpmbG9hdHNpdGYpIChDR0VOX0ZQVSosIFNJKTsKLSAgVEYgKCpmbG9hdGRpdGYpIChDR0VOX0ZQVSosIERJKTsKLSAgVEYgKCp1ZmxvYXRzaXRmKSAoQ0dFTl9GUFUqLCBVU0kpOwotICBURiAoKnVmbG9hdGRpdGYpIChDR0VOX0ZQVSosIFVESSk7Ci0KLSAgU0kgKCpmaXh0ZnNpKSAoQ0dFTl9GUFUqLCBURik7Ci0gIERJICgqZml4dGZkaSkgKENHRU5fRlBVKiwgVEYpOwotICBVU0kgKCp1Zml4dGZzaSkgKENHRU5fRlBVKiwgVEYpOwotICBVREkgKCp1Zml4dGZkaSkgKENHRU5fRlBVKiwgVEYpOwotCi19OwotCi1leHRlcm4gdm9pZCBjZ2VuX2luaXRfYWNjdXJhdGVfZnB1IChTSU1fQ1BVKiwgQ0dFTl9GUFUqLCBDR0VOX0ZQVV9FUlJPUl9GTiopOwotCi1CSSBjZ2VuX3NmX3NuYW5fcCAoQ0dFTl9GUFUqLCBTRik7Ci1CSSBjZ2VuX2RmX3NuYW5fcCAoQ0dFTl9GUFUqLCBERik7Ci0KLS8qIG5vLW9wIGZwIGVycm9yIGhhbmRsZXIgKi8KLWV4dGVybiBDR0VOX0ZQVV9FUlJPUl9GTiBjZ2VuX2ZwdV9pZ25vcmVfZXJyb3JzOwotCi0jZW5kaWYgLyogQ0dFTl9GUFVfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLW1lbS5oIGIvc2ltL2NvbW1vbi9jZ2VuLW1lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZhZGM2Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi1tZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiBNZW1vcnkgb3BzIGhlYWRlciBmb3IgQ0dFTi1iYXNlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fTUVNX0gKLSNkZWZpbmUgQ0dFTl9NRU1fSAotCi0jaWZkZWYgTUVNT1BTX0RFRklORV9JTkxJTkUKLSNkZWZpbmUgTUVNT1BTX0lOTElORQotI2Vsc2UKLSNkZWZpbmUgTUVNT1BTX0lOTElORSBleHRlcm4gaW5saW5lCi0jZW5kaWYKLQotLyogSW50ZWdlciBtZW1vcnkgcmVhZCBzdXBwb3J0LgotCi0gICBUaGVyZSBpcyBubyBmbG9hdGluZyBwb2ludCBzdXBwb3J0LiAgSW4gdGhpcyBjb250ZXh0IHRoZXJlIGFyZSBubwotICAgZmxvYXRpbmcgcG9pbnQgbW9kZXMsIG9ubHkgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyAod2hvc2UgYXJndW1lbnRzCi0gICBhbmQgcmVzdWx0cyBhcmUgYXJyYXlzIG9mIGJpdHMgdGhhdCB3ZSB0cmVhdCBhcyBpbnRlZ2VyIG1vZGVzKS4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgfHwgZGVmaW5lZCAoTUVNT1BTX0RFRklORV9JTkxJTkUpCi0jZGVmaW5lIERFQ0xBUkVfR0VUTUVNKG1vZGUsIHNpemUpIFwKLU1FTU9QU19JTkxJTkUgbW9kZSBcCi1YQ09OQ0FUMiAoR0VUTUVNLG1vZGUpIChTSU1fQ1BVICpjcHUsIElBRERSIHBjLCBBRERSIGEpIFwKLXsgXAotICBQUk9GSUxFX0NPVU5UX1JFQUQgKGNwdSwgYSwgWENPTkNBVDIgKE1PREVfLG1vZGUpKTsgXAotICAvKiBEb24ndCByZWFkIGFueXRoaW5nIGludG8gInVuYWxpZ25lZCIgaGVyZS4gIEJhZCBuYW1lIGNob2ljZS4gICovXAotICByZXR1cm4gWENPTkNBVDIgKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyxzaXplKSAoY3B1LCBwYywgcmVhZF9tYXAsIGEpOyBcCi19Ci0jZWxzZQotI2RlZmluZSBERUNMQVJFX0dFVE1FTShtb2RlLCBzaXplKSBcCi1leHRlcm4gbW9kZSBYQ09OQ0FUMiAoR0VUTUVNLG1vZGUpIChTSU1fQ1BVICosIElBRERSLCBBRERSKTsKLSNlbmRpZgotCi1ERUNMQVJFX0dFVE1FTSAoUUksIDEpICAvKiBUQUdTOiBHRVRNRU1RSSAqLwotREVDTEFSRV9HRVRNRU0gKFVRSSwgMSkgLyogVEFHUzogR0VUTUVNVVFJICovCi1ERUNMQVJFX0dFVE1FTSAoSEksIDIpICAvKiBUQUdTOiBHRVRNRU1ISSAqLwotREVDTEFSRV9HRVRNRU0gKFVISSwgMikgLyogVEFHUzogR0VUTUVNVUhJICovCi1ERUNMQVJFX0dFVE1FTSAoU0ksIDQpICAvKiBUQUdTOiBHRVRNRU1TSSAqLwotREVDTEFSRV9HRVRNRU0gKFVTSSwgNCkgLyogVEFHUzogR0VUTUVNVVNJICovCi1ERUNMQVJFX0dFVE1FTSAoREksIDgpICAvKiBUQUdTOiBHRVRNRU1ESSAqLwotREVDTEFSRV9HRVRNRU0gKFVESSwgOCkgLyogVEFHUzogR0VUTUVNVURJICovCi0KLSN1bmRlZiBERUNMQVJFX0dFVE1FTQotDAotLyogSW50ZWdlciBtZW1vcnkgd3JpdGUgc3VwcG9ydC4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgfHwgZGVmaW5lZCAoTUVNT1BTX0RFRklORV9JTkxJTkUpCi0jZGVmaW5lIERFQ0xBUkVfU0VUTUVNKG1vZGUsIHNpemUpIFwKLU1FTU9QU19JTkxJTkUgdm9pZCBcCi1YQ09OQ0FUMiAoU0VUTUVNLG1vZGUpIChTSU1fQ1BVICpjcHUsIElBRERSIHBjLCBBRERSIGEsIG1vZGUgdmFsKSBcCi17IFwKLSAgUFJPRklMRV9DT1VOVF9XUklURSAoY3B1LCBhLCBYQ09OQ0FUMiAoTU9ERV8sbW9kZSkpOyBcCi0gIC8qIERvbid0IHJlYWQgYW55dGhpbmcgaW50byAidW5hbGlnbmVkIiBoZXJlLiAgQmFkIG5hbWUgY2hvaWNlLiAgKi8gXAotICBYQ09OQ0FUMiAoc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXyxzaXplKSAoY3B1LCBwYywgd3JpdGVfbWFwLCBhLCB2YWwpOyBcCi19Ci0jZWxzZQotI2RlZmluZSBERUNMQVJFX1NFVE1FTShtb2RlLCBzaXplKSBcCi1leHRlcm4gdm9pZCBYQ09OQ0FUMiAoU0VUTUVNLG1vZGUpIChTSU1fQ1BVICosIElBRERSLCBBRERSLCBtb2RlKTsKLSNlbmRpZgotCi1ERUNMQVJFX1NFVE1FTSAoUUksIDEpICAvKiBUQUdTOiBTRVRNRU1RSSAqLwotREVDTEFSRV9TRVRNRU0gKFVRSSwgMSkgLyogVEFHUzogU0VUTUVNVVFJICovCi1ERUNMQVJFX1NFVE1FTSAoSEksIDIpICAvKiBUQUdTOiBTRVRNRU1ISSAqLwotREVDTEFSRV9TRVRNRU0gKFVISSwgMikgLyogVEFHUzogU0VUTUVNVUhJICovCi1ERUNMQVJFX1NFVE1FTSAoU0ksIDQpICAvKiBUQUdTOiBTRVRNRU1TSSAqLwotREVDTEFSRV9TRVRNRU0gKFVTSSwgNCkgLyogVEFHUzogU0VUTUVNVVNJICovCi1ERUNMQVJFX1NFVE1FTSAoREksIDgpICAvKiBUQUdTOiBTRVRNRU1ESSAqLwotREVDTEFSRV9TRVRNRU0gKFVESSwgOCkgLyogVEFHUzogU0VUTUVNVURJICovCi0KLSN1bmRlZiBERUNMQVJFX1NFVE1FTQotDAotLyogSW5zdHJ1Y3Rpb24gcmVhZCBzdXBwb3J0LiAgKi8KLQotI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChNRU1PUFNfREVGSU5FX0lOTElORSkKLSNkZWZpbmUgREVDTEFSRV9HRVRJTUVNKG1vZGUsIHNpemUpIFwKLU1FTU9QU19JTkxJTkUgbW9kZSBcCi1YQ09OQ0FUMiAoR0VUSU1FTSxtb2RlKSAoU0lNX0NQVSAqY3B1LCBJQUREUiBhKSBcCi17IFwKLSAgLypQUk9GSUxFX0NPVU5UX1JFQUQgKGNwdSwgYSwgWENPTkNBVDIgKE1PREVfLG1vZGUpKTsqLyBcCi0gIC8qIERvbid0IHJlYWQgYW55dGhpbmcgaW50byAidW5hbGlnbmVkIiBoZXJlLiAgQmFkIG5hbWUgY2hvaWNlLiAgKi9cCi0gIHJldHVybiBYQ09OQ0FUMiAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfLHNpemUpIChjcHUsIGEsIGV4ZWNfbWFwLCBhKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgREVDTEFSRV9HRVRJTUVNKG1vZGUsIHNpemUpIFwKLWV4dGVybiBtb2RlIFhDT05DQVQyIChHRVRJTUVNLG1vZGUpIChTSU1fQ1BVICosIEFERFIpOwotI2VuZGlmCi0KLURFQ0xBUkVfR0VUSU1FTSAoVVFJLCAxKSAvKiBUQUdTOiBHRVRJTUVNVVFJICovCi1ERUNMQVJFX0dFVElNRU0gKFVISSwgMikgLyogVEFHUzogR0VUSU1FTVVISSAqLwotREVDTEFSRV9HRVRJTUVNIChVU0ksIDQpIC8qIFRBR1M6IEdFVElNRU1VU0kgKi8KLURFQ0xBUkVfR0VUSU1FTSAoVURJLCA4KSAvKiBUQUdTOiBHRVRJTUVNVURJICovCi0KLSN1bmRlZiBERUNMQVJFX0dFVElNRU0KLQwKLS8qIEZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCi0KLSAgID8/PyBPbmUgY2FuIHNwZWNpZnkgdGhhdCB0aGUgaW50ZWdlciBtZW1vcnkgb3BzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQsCi0gICBhbmQgdHJlYXQgZnAgdmFsdWVzIGFzIGp1c3QgYSBzZXJpZXMgb2YgYml0cy4gIE9uZSBtaWdodCBldmVuIGJ1YmJsZQotICAgdGhhdCBub3Rpb24gdXAgaW50byB0aGUgZGVzY3JpcHRpb24gbGFuZ3VhZ2UuICBIb3dldmVyLCB0aGF0IGRlcGFydHMgZnJvbQotICAgZ2NjLiAgT25lIGNvdWxkIGNyb3NzIG92ZXIgZnJvbSBnY2MncyBub3Rpb24gYW5kIGEgInNlcmllcyBvZiBiaXRzIiBub3Rpb24KLSAgIGJldHdlZW4gdGhlcmUgYW5kIGhlcmUsIGFuZCB0aHVzIHN0aWxsIG5vdCByZXF1aXJlIHRoZXNlIHJvdXRpbmVzLiAgSG93ZXZlciwKLSAgIHRoYXQncyBhIGNvbXBsaWNhdGlvbiBvZiBpdHMgb3duIChub3QgdGhhdCBoYXZpbmcgdGhlc2UgZm5zIGlzbid0KS4KLSAgIEJ1dCBmb3Igbm93LCB3ZSBkbyB0aGluZ3MgdGhpcyB3YXkuICAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKE1FTU9QU19ERUZJTkVfSU5MSU5FKQotI2RlZmluZSBERUNMQVJFX0dFVE1FTShtb2RlLCBzaXplKSBcCi1NRU1PUFNfSU5MSU5FIG1vZGUgXAotWENPTkNBVDIgKEdFVE1FTSxtb2RlKSAoU0lNX0NQVSAqY3B1LCBJQUREUiBwYywgQUREUiBhKSBcCi17IFwKLSAgUFJPRklMRV9DT1VOVF9SRUFEIChjcHUsIGEsIFhDT05DQVQyIChNT0RFXyxtb2RlKSk7IFwKLSAgLyogRG9uJ3QgcmVhZCBhbnl0aGluZyBpbnRvICJ1bmFsaWduZWQiIGhlcmUuICBCYWQgbmFtZSBjaG9pY2UuICAqL1wKLSAgcmV0dXJuIFhDT05DQVQyIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8sc2l6ZSkgKGNwdSwgcGMsIHJlYWRfbWFwLCBhKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgREVDTEFSRV9HRVRNRU0obW9kZSwgc2l6ZSkgXAotZXh0ZXJuIG1vZGUgWENPTkNBVDIgKEdFVE1FTSxtb2RlKSAoU0lNX0NQVSAqLCBJQUREUiwgQUREUik7Ci0jZW5kaWYKLQotREVDTEFSRV9HRVRNRU0gKFNGLCA0KSAvKiBUQUdTOiBHRVRNRU1TRiAqLwotREVDTEFSRV9HRVRNRU0gKERGLCA4KSAvKiBUQUdTOiBHRVRNRU1ERiAqLwotCi0jdW5kZWYgREVDTEFSRV9HRVRNRU0KLQotI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChNRU1PUFNfREVGSU5FX0lOTElORSkKLSNkZWZpbmUgREVDTEFSRV9TRVRNRU0obW9kZSwgc2l6ZSkgXAotTUVNT1BTX0lOTElORSB2b2lkIFwKLVhDT05DQVQyIChTRVRNRU0sbW9kZSkgKFNJTV9DUFUgKmNwdSwgSUFERFIgcGMsIEFERFIgYSwgbW9kZSB2YWwpIFwKLXsgXAotICBQUk9GSUxFX0NPVU5UX1dSSVRFIChjcHUsIGEsIFhDT05DQVQyIChNT0RFXyxtb2RlKSk7IFwKLSAgLyogRG9uJ3QgcmVhZCBhbnl0aGluZyBpbnRvICJ1bmFsaWduZWQiIGhlcmUuICBCYWQgbmFtZSBjaG9pY2UuICAqLyBcCi0gIFhDT05DQVQyIChzaW1fY29yZV93cml0ZV91bmFsaWduZWRfLHNpemUpIChjcHUsIHBjLCB3cml0ZV9tYXAsIGEsIHZhbCk7IFwKLX0KLSNlbHNlCi0jZGVmaW5lIERFQ0xBUkVfU0VUTUVNKG1vZGUsIHNpemUpIFwKLWV4dGVybiB2b2lkIFhDT05DQVQyIChTRVRNRU0sbW9kZSkgKFNJTV9DUFUgKiwgSUFERFIsIEFERFIsIG1vZGUpOwotI2VuZGlmCi0KLURFQ0xBUkVfU0VUTUVNIChTRiwgNCkgLyogVEFHUzogU0VUTUVNU0YgKi8KLURFQ0xBUkVfU0VUTUVNIChERiwgOCkgLyogVEFHUzogU0VUTUVNREYgKi8KLQotI3VuZGVmIERFQ0xBUkVfU0VUTUVNCi0MCi0vKiBHRVRUPG1vZGU+OiB0cmFuc2xhdGUgdGFyZ2V0IHZhbHVlIGF0IFAgdG8gaG9zdCB2YWx1ZS4KLSAgIFRoaXMgbmVlZG4ndCBiZSB2ZXJ5IGVmZmljaWVudCAoaS5lLiBjYW4gY2FsbCBtZW1jcHkpIGFzIHRoaXMgaXMKLSAgIG9ubHkgdXNlZCB3aGVuIGludGVyZmFjaW5nIHdpdGggdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gZ2RiKS4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgfHwgZGVmaW5lZCAoTUVNT1BTX0RFRklORV9JTkxJTkUpCi0jZGVmaW5lIERFQ0xBUkVfR0VUVChtb2RlLCBzaXplKSBcCi1NRU1PUFNfSU5MSU5FIG1vZGUgXAotWENPTkNBVDIgKEdFVFQsbW9kZSkgKHVuc2lnbmVkIGNoYXIgKnApIFwKLXsgXAotICBtb2RlIHRtcDsgXAotICBtZW1jcHkgKCZ0bXAsIHAsIHNpemVvZiAobW9kZSkpOyBcCi0gIHJldHVybiBYQ09OQ0FUMiAoVDJIXyxzaXplKSAodG1wKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgREVDTEFSRV9HRVRUKG1vZGUsIHNpemUpIFwKLWV4dGVybiBtb2RlIFhDT05DQVQyIChHRVRULG1vZGUpICh1bnNpZ25lZCBjaGFyICopOwotI2VuZGlmCi0KLURFQ0xBUkVfR0VUVCAoUUksIDEpICAvKiBUQUdTOiBHRVRUUUkgKi8KLURFQ0xBUkVfR0VUVCAoVVFJLCAxKSAvKiBUQUdTOiBHRVRUVVFJICovCi1ERUNMQVJFX0dFVFQgKEhJLCAyKSAgLyogVEFHUzogR0VUVEhJICovCi1ERUNMQVJFX0dFVFQgKFVISSwgMikgLyogVEFHUzogR0VUVFVISSAqLwotREVDTEFSRV9HRVRUIChTSSwgNCkgIC8qIFRBR1M6IEdFVFRTSSAqLwotREVDTEFSRV9HRVRUIChVU0ksIDQpIC8qIFRBR1M6IEdFVFRVU0kgKi8KLURFQ0xBUkVfR0VUVCAoREksIDgpICAvKiBUQUdTOiBHRVRUREkgKi8KLURFQ0xBUkVfR0VUVCAoVURJLCA4KSAvKiBUQUdTOiBHRVRUVURJICovCi0KLSNpZiAwIC8qID8/PyBkZWZlcmVkIHVudGlsIG5lY2Vzc2FyeSAqLwotREVDTEFSRV9HRVRUIChTRiwgNCkgIC8qIFRBR1M6IEdFVFRTRiAqLwotREVDTEFSRV9HRVRUIChERiwgOCkgIC8qIFRBR1M6IEdFVFRERiAqLwotREVDTEFSRV9HRVRUIChURiwgMTYpIC8qIFRBR1M6IEdFVFRURiAqLwotI2VuZGlmCi0KLSN1bmRlZiBERUNMQVJFX0dFVFQKLQwKLS8qIFNFVFQ8bW9kZT46IHRyYW5zbGF0ZSBob3N0IHZhbHVlIHRvIHRhcmdldCB2YWx1ZSBhbmQgc3RvcmUgYXQgUC4KLSAgIFRoaXMgbmVlZG4ndCBiZSB2ZXJ5IGVmZmljaWVudCAoaS5lLiBjYW4gY2FsbCBtZW1jcHkpIGFzIHRoaXMgaXMKLSAgIG9ubHkgdXNlZCB3aGVuIGludGVyZmFjaW5nIHdpdGggdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gZ2RiKS4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgfHwgZGVmaW5lZCAoTUVNT1BTX0RFRklORV9JTkxJTkUpCi0jZGVmaW5lIERFQ0xBUkVfU0VUVChtb2RlLCBzaXplKSBcCi1NRU1PUFNfSU5MSU5FIHZvaWQgXAotWENPTkNBVDIgKFNFVFQsbW9kZSkgKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbW9kZSB2YWwpIFwKLXsgXAotICBtb2RlIHRtcDsgXAotICB0bXAgPSBYQ09OQ0FUMiAoSDJUXyxzaXplKSAodmFsKTsgXAotICBtZW1jcHkgKGJ1ZiwgJnRtcCwgc2l6ZW9mIChtb2RlKSk7IFwKLX0KLSNlbHNlCi0jZGVmaW5lIERFQ0xBUkVfU0VUVChtb2RlLCBzaXplKSBcCi1leHRlcm4gbW9kZSBYQ09OQ0FUMiAoR0VUVCxtb2RlKSAodW5zaWduZWQgY2hhciAqLCBtb2RlKTsKLSNlbmRpZgotCi1ERUNMQVJFX1NFVFQgKFFJLCAxKSAgLyogVEFHUzogU0VUVFFJICovCi1ERUNMQVJFX1NFVFQgKFVRSSwgMSkgLyogVEFHUzogU0VUVFVRSSAqLwotREVDTEFSRV9TRVRUIChISSwgMikgIC8qIFRBR1M6IFNFVFRISSAqLwotREVDTEFSRV9TRVRUIChVSEksIDIpIC8qIFRBR1M6IFNFVFRVSEkgKi8KLURFQ0xBUkVfU0VUVCAoU0ksIDQpICAvKiBUQUdTOiBTRVRUU0kgKi8KLURFQ0xBUkVfU0VUVCAoVVNJLCA0KSAvKiBUQUdTOiBTRVRUVVNJICovCi1ERUNMQVJFX1NFVFQgKERJLCA4KSAgLyogVEFHUzogU0VUVERJICovCi1ERUNMQVJFX1NFVFQgKFVESSwgOCkgLyogVEFHUzogU0VUVFVESSAqLwotCi0jaWYgMCAvKiA/Pz8gZGVmZXJlZCB1bnRpbCBuZWNlc3NhcnkgKi8KLURFQ0xBUkVfU0VUVCAoU0YsIDQpICAvKiBUQUdTOiBTRVRUU0YgKi8KLURFQ0xBUkVfU0VUVCAoREYsIDgpICAvKiBUQUdTOiBTRVRUREYgKi8KLURFQ0xBUkVfU0VUVCAoVEYsIDE2KSAvKiBUQUdTOiBTRVRUVEYgKi8KLSNlbmRpZgotCi0jdW5kZWYgREVDTEFSRV9TRVRUCi0KLSNlbmRpZiAvKiBDR0VOX01FTV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tb3BzLmggYi9zaW0vY29tbW9uL2NnZW4tb3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzIxNzcuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9jZ2VuLW9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qIFNlbWFudGljcyBvcHMgc3VwcG9ydCBmb3IgQ0dFTi1iYXNlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgQ0dFTl9TRU1fT1BTX0gKLSNkZWZpbmUgQ0dFTl9TRU1fT1BTX0gKLQotI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKFNFTU9QU19ERUZJTkVfSU5MSU5FKQotI2RlZmluZSBTRU1PUFNfREVGSU5FX0lOTElORQotI2RlZmluZSBTRU1PUFNfSU5MSU5FIGV4dGVybiBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIFNFTU9QU19JTkxJTkUKLSNlbmRpZgotCi0vKiBTZW1hbnRpYyBvcGVyYXRpb25zLgotICAgQXQgb25lIHBvaW50IHRoaXMgZmlsZSB3YXMgbWFjaGluZSBnZW5lcmF0ZWQuICBNYXliZSBpdCB3aWxsIGJlIGFnYWluLiAgKi8KLQotLyogVE9ETzogTGF6eSBlbmNvZGluZy9kZWNvZGluZyBvZiBmcCB2YWx1ZXMuICAqLwotCi0vKiBUaGVzZSBkb24ndCByZWFsbHkgaGF2ZSBhIG1vZGUuICAqLwotI2RlZmluZSBBTkRJRih4LCB5KSAoKHgpICYmICh5KSkKLSNkZWZpbmUgT1JJRih4LCB5KSAoKHgpIHx8ICh5KSkKLQotI2RlZmluZSBBTkRCSSh4LCB5KSAoKHgpICYgKHkpKQotI2RlZmluZSBPUkJJKHgsIHkpICgoeCkgfCAoeSkpCi0jZGVmaW5lIFhPUkJJKHgsIHkpICgoeCkgXiAoeSkpCi0jZGVmaW5lIE5FR0JJKHgpICgtICh4KSkKLSNkZWZpbmUgTk9UQkkoeCkgKCEgKEJJKSAoeCkpCi0jZGVmaW5lIElOVkJJKHgpICh+ICh4KSkKLSNkZWZpbmUgRVFCSSh4LCB5KSAoKEJJKSAoeCkgPT0gKEJJKSAoeSkpCi0jZGVmaW5lIE5FQkkoeCwgeSkgKChCSSkgKHgpICE9IChCSSkgKHkpKQotI2RlZmluZSBMVEJJKHgsIHkpICgoQkkpICh4KSA8IChCSSkgKHkpKQotI2RlZmluZSBMRUJJKHgsIHkpICgoQkkpICh4KSA8PSAoQkkpICh5KSkKLSNkZWZpbmUgR1RCSSh4LCB5KSAoKEJJKSAoeCkgPiAoQkkpICh5KSkKLSNkZWZpbmUgR0VCSSh4LCB5KSAoKEJJKSAoeCkgPj0gKEJJKSAoeSkpCi0jZGVmaW5lIExUVUJJKHgsIHkpICgoQkkpICh4KSA8IChCSSkgKHkpKQotI2RlZmluZSBMRVVCSSh4LCB5KSAoKEJJKSAoeCkgPD0gKEJJKSAoeSkpCi0jZGVmaW5lIEdUVUJJKHgsIHkpICgoQkkpICh4KSA+IChCSSkgKHkpKQotI2RlZmluZSBHRVVCSSh4LCB5KSAoKEJJKSAoeCkgPj0gKEJJKSAoeSkpCi0MCi0jZGVmaW5lIEFERFFJKHgsIHkpICgoeCkgKyAoeSkpCi0jZGVmaW5lIFNVQlFJKHgsIHkpICgoeCkgLSAoeSkpCi0jZGVmaW5lIE1VTFFJKHgsIHkpICgoeCkgKiAoeSkpCi0jZGVmaW5lIERJVlFJKHgsIHkpICgoUUkpICh4KSAvIChRSSkgKHkpKQotI2RlZmluZSBVRElWUUkoeCwgeSkgKChVUUkpICh4KSAvIChVUUkpICh5KSkKLSNkZWZpbmUgTU9EUUkoeCwgeSkgKChRSSkgKHgpICUgKFFJKSAoeSkpCi0jZGVmaW5lIFVNT0RRSSh4LCB5KSAoKFVRSSkgKHgpICUgKFVRSSkgKHkpKQotI2RlZmluZSBTUkFRSSh4LCB5KSAoKFFJKSAoeCkgPj4gKHkpKQotI2RlZmluZSBTUkxRSSh4LCB5KSAoKFVRSSkgKHgpID4+ICh5KSkKLSNkZWZpbmUgU0xMUUkoeCwgeSkgKChVUUkpICh4KSA8PCAoeSkpCi1leHRlcm4gUUkgUk9SUUkgKFFJLCBpbnQpOwotZXh0ZXJuIFFJIFJPTFFJIChRSSwgaW50KTsKLSNkZWZpbmUgQU5EUUkoeCwgeSkgKCh4KSAmICh5KSkKLSNkZWZpbmUgT1JRSSh4LCB5KSAoKHgpIHwgKHkpKQotI2RlZmluZSBYT1JRSSh4LCB5KSAoKHgpIF4gKHkpKQotI2RlZmluZSBORUdRSSh4KSAoLSAoeCkpCi0jZGVmaW5lIE5PVFFJKHgpICghIChRSSkgKHgpKQotI2RlZmluZSBJTlZRSSh4KSAofiAoeCkpCi0jZGVmaW5lIEFCU1FJKHgpICgoeCkgPCAwID8gLSh4KSA6ICh4KSkKLSNkZWZpbmUgRVFRSSh4LCB5KSAoKFFJKSAoeCkgPT0gKFFJKSAoeSkpCi0jZGVmaW5lIE5FUUkoeCwgeSkgKChRSSkgKHgpICE9IChRSSkgKHkpKQotI2RlZmluZSBMVFFJKHgsIHkpICgoUUkpICh4KSA8IChRSSkgKHkpKQotI2RlZmluZSBMRVFJKHgsIHkpICgoUUkpICh4KSA8PSAoUUkpICh5KSkKLSNkZWZpbmUgR1RRSSh4LCB5KSAoKFFJKSAoeCkgPiAoUUkpICh5KSkKLSNkZWZpbmUgR0VRSSh4LCB5KSAoKFFJKSAoeCkgPj0gKFFJKSAoeSkpCi0jZGVmaW5lIExUVVFJKHgsIHkpICgoVVFJKSAoeCkgPCAoVVFJKSAoeSkpCi0jZGVmaW5lIExFVVFJKHgsIHkpICgoVVFJKSAoeCkgPD0gKFVRSSkgKHkpKQotI2RlZmluZSBHVFVRSSh4LCB5KSAoKFVRSSkgKHgpID4gKFVRSSkgKHkpKQotI2RlZmluZSBHRVVRSSh4LCB5KSAoKFVRSSkgKHgpID49IChVUUkpICh5KSkKLQwKLSNkZWZpbmUgQURESEkoeCwgeSkgKCh4KSArICh5KSkKLSNkZWZpbmUgU1VCSEkoeCwgeSkgKCh4KSAtICh5KSkKLSNkZWZpbmUgTVVMSEkoeCwgeSkgKCh4KSAqICh5KSkKLSNkZWZpbmUgRElWSEkoeCwgeSkgKChISSkgKHgpIC8gKEhJKSAoeSkpCi0jZGVmaW5lIFVESVZISSh4LCB5KSAoKFVISSkgKHgpIC8gKFVISSkgKHkpKQotI2RlZmluZSBNT0RISSh4LCB5KSAoKEhJKSAoeCkgJSAoSEkpICh5KSkKLSNkZWZpbmUgVU1PREhJKHgsIHkpICgoVUhJKSAoeCkgJSAoVUhJKSAoeSkpCi0jZGVmaW5lIFNSQUhJKHgsIHkpICgoSEkpICh4KSA+PiAoeSkpCi0jZGVmaW5lIFNSTEhJKHgsIHkpICgoVUhJKSAoeCkgPj4gKHkpKQotI2RlZmluZSBTTExISSh4LCB5KSAoKFVISSkgKHgpIDw8ICh5KSkKLWV4dGVybiBISSBST1JISSAoSEksIGludCk7Ci1leHRlcm4gSEkgUk9MSEkgKEhJLCBpbnQpOwotI2RlZmluZSBBTkRISSh4LCB5KSAoKHgpICYgKHkpKQotI2RlZmluZSBPUkhJKHgsIHkpICgoeCkgfCAoeSkpCi0jZGVmaW5lIFhPUkhJKHgsIHkpICgoeCkgXiAoeSkpCi0jZGVmaW5lIE5FR0hJKHgpICgtICh4KSkKLSNkZWZpbmUgTk9USEkoeCkgKCEgKEhJKSAoeCkpCi0jZGVmaW5lIElOVkhJKHgpICh+ICh4KSkKLSNkZWZpbmUgQUJTSEkoeCkgKCh4KSA8IDAgPyAtKHgpIDogKHgpKQotI2RlZmluZSBFUUhJKHgsIHkpICgoSEkpICh4KSA9PSAoSEkpICh5KSkKLSNkZWZpbmUgTkVISSh4LCB5KSAoKEhJKSAoeCkgIT0gKEhJKSAoeSkpCi0jZGVmaW5lIExUSEkoeCwgeSkgKChISSkgKHgpIDwgKEhJKSAoeSkpCi0jZGVmaW5lIExFSEkoeCwgeSkgKChISSkgKHgpIDw9IChISSkgKHkpKQotI2RlZmluZSBHVEhJKHgsIHkpICgoSEkpICh4KSA+IChISSkgKHkpKQotI2RlZmluZSBHRUhJKHgsIHkpICgoSEkpICh4KSA+PSAoSEkpICh5KSkKLSNkZWZpbmUgTFRVSEkoeCwgeSkgKChVSEkpICh4KSA8IChVSEkpICh5KSkKLSNkZWZpbmUgTEVVSEkoeCwgeSkgKChVSEkpICh4KSA8PSAoVUhJKSAoeSkpCi0jZGVmaW5lIEdUVUhJKHgsIHkpICgoVUhJKSAoeCkgPiAoVUhJKSAoeSkpCi0jZGVmaW5lIEdFVUhJKHgsIHkpICgoVUhJKSAoeCkgPj0gKFVISSkgKHkpKQotDAotI2RlZmluZSBBRERTSSh4LCB5KSAoKHgpICsgKHkpKQotI2RlZmluZSBTVUJTSSh4LCB5KSAoKHgpIC0gKHkpKQotI2RlZmluZSBNVUxTSSh4LCB5KSAoKHgpICogKHkpKQotI2RlZmluZSBESVZTSSh4LCB5KSAoKFNJKSAoeCkgLyAoU0kpICh5KSkKLSNkZWZpbmUgVURJVlNJKHgsIHkpICgoVVNJKSAoeCkgLyAoVVNJKSAoeSkpCi0jZGVmaW5lIE1PRFNJKHgsIHkpICgoU0kpICh4KSAlIChTSSkgKHkpKQotI2RlZmluZSBVTU9EU0koeCwgeSkgKChVU0kpICh4KSAlIChVU0kpICh5KSkKLSNkZWZpbmUgU1JBU0koeCwgeSkgKChTSSkgKHgpID4+ICh5KSkKLSNkZWZpbmUgU1JMU0koeCwgeSkgKChVU0kpICh4KSA+PiAoeSkpCi0jZGVmaW5lIFNMTFNJKHgsIHkpICgoVVNJKSAoeCkgPDwgKHkpKQotZXh0ZXJuIFNJIFJPUlNJIChTSSwgaW50KTsKLWV4dGVybiBTSSBST0xTSSAoU0ksIGludCk7Ci0jZGVmaW5lIEFORFNJKHgsIHkpICgoeCkgJiAoeSkpCi0jZGVmaW5lIE9SU0koeCwgeSkgKCh4KSB8ICh5KSkKLSNkZWZpbmUgWE9SU0koeCwgeSkgKCh4KSBeICh5KSkKLSNkZWZpbmUgTkVHU0koeCkgKC0gKHgpKQotI2RlZmluZSBOT1RTSSh4KSAoISAoU0kpICh4KSkKLSNkZWZpbmUgSU5WU0koeCkgKH4gKHgpKQotI2RlZmluZSBBQlNTSSh4KSAoKHgpIDwgMCA/IC0oeCkgOiAoeCkpCi0jZGVmaW5lIEVRU0koeCwgeSkgKChTSSkgKHgpID09IChTSSkgKHkpKQotI2RlZmluZSBORVNJKHgsIHkpICgoU0kpICh4KSAhPSAoU0kpICh5KSkKLSNkZWZpbmUgTFRTSSh4LCB5KSAoKFNJKSAoeCkgPCAoU0kpICh5KSkKLSNkZWZpbmUgTEVTSSh4LCB5KSAoKFNJKSAoeCkgPD0gKFNJKSAoeSkpCi0jZGVmaW5lIEdUU0koeCwgeSkgKChTSSkgKHgpID4gKFNJKSAoeSkpCi0jZGVmaW5lIEdFU0koeCwgeSkgKChTSSkgKHgpID49IChTSSkgKHkpKQotI2RlZmluZSBMVFVTSSh4LCB5KSAoKFVTSSkgKHgpIDwgKFVTSSkgKHkpKQotI2RlZmluZSBMRVVTSSh4LCB5KSAoKFVTSSkgKHgpIDw9IChVU0kpICh5KSkKLSNkZWZpbmUgR1RVU0koeCwgeSkgKChVU0kpICh4KSA+IChVU0kpICh5KSkKLSNkZWZpbmUgR0VVU0koeCwgeSkgKChVU0kpICh4KSA+PSAoVVNJKSAoeSkpCi0MCi0jaWZkZWYgRElfRk5fU1VQUE9SVAotZXh0ZXJuIERJIEFERERJIChESSwgREkpOwotZXh0ZXJuIERJIFNVQkRJIChESSwgREkpOwotZXh0ZXJuIERJIE1VTERJIChESSwgREkpOwotZXh0ZXJuIERJIERJVkRJIChESSwgREkpOwotZXh0ZXJuIERJIFVESVZESSAoREksIERJKTsKLWV4dGVybiBESSBNT0RESSAoREksIERJKTsKLWV4dGVybiBESSBVTU9EREkgKERJLCBESSk7Ci1leHRlcm4gREkgU1JBREkgKERJLCBpbnQpOwotZXh0ZXJuIFVESSBTUkxESSAoVURJLCBpbnQpOwotZXh0ZXJuIFVESSBTTExESSAoVURJLCBpbnQpOwotZXh0ZXJuIERJIFJPUkRJIChESSwgaW50KTsKLWV4dGVybiBESSBST0xESSAoREksIGludCk7Ci1leHRlcm4gREkgQU5EREkgKERJLCBESSk7Ci1leHRlcm4gREkgT1JESSAoREksIERJKTsKLWV4dGVybiBESSBYT1JESSAoREksIERJKTsKLWV4dGVybiBESSBORUdESSAoREkpOwotZXh0ZXJuIGludCBOT1RESSAoREkpOwotZXh0ZXJuIERJIElOVkRJIChESSk7Ci1leHRlcm4gaW50IEVRREkgKERJLCBESSk7Ci1leHRlcm4gaW50IE5FREkgKERJLCBESSk7Ci1leHRlcm4gaW50IExUREkgKERJLCBESSk7Ci1leHRlcm4gaW50IExFREkgKERJLCBESSk7Ci1leHRlcm4gaW50IEdUREkgKERJLCBESSk7Ci1leHRlcm4gaW50IEdFREkgKERJLCBESSk7Ci1leHRlcm4gaW50IExUVURJIChVREksIFVESSk7Ci1leHRlcm4gaW50IExFVURJIChVREksIFVESSk7Ci1leHRlcm4gaW50IEdUVURJIChVREksIFVESSk7Ci1leHRlcm4gaW50IEdFVURJIChVREksIFVESSk7Ci0jZWxzZSAvKiAhIERJX0ZOX1NVUFBPUlQgKi8KLSNkZWZpbmUgQUREREkoeCwgeSkgKCh4KSArICh5KSkKLSNkZWZpbmUgU1VCREkoeCwgeSkgKCh4KSAtICh5KSkKLSNkZWZpbmUgTVVMREkoeCwgeSkgKCh4KSAqICh5KSkKLSNkZWZpbmUgRElWREkoeCwgeSkgKChESSkgKHgpIC8gKERJKSAoeSkpCi0jZGVmaW5lIFVESVZESSh4LCB5KSAoKFVESSkgKHgpIC8gKFVESSkgKHkpKQotI2RlZmluZSBNT0RESSh4LCB5KSAoKERJKSAoeCkgJSAoREkpICh5KSkKLSNkZWZpbmUgVU1PRERJKHgsIHkpICgoVURJKSAoeCkgJSAoVURJKSAoeSkpCi0jZGVmaW5lIFNSQURJKHgsIHkpICgoREkpICh4KSA+PiAoeSkpCi0jZGVmaW5lIFNSTERJKHgsIHkpICgoVURJKSAoeCkgPj4gKHkpKQotI2RlZmluZSBTTExESSh4LCB5KSAoKFVESSkgKHgpIDw8ICh5KSkKLWV4dGVybiBESSBST1JESSAoREksIGludCk7Ci1leHRlcm4gREkgUk9MREkgKERJLCBpbnQpOwotI2RlZmluZSBBTkRESSh4LCB5KSAoKHgpICYgKHkpKQotI2RlZmluZSBPUkRJKHgsIHkpICgoeCkgfCAoeSkpCi0jZGVmaW5lIFhPUkRJKHgsIHkpICgoeCkgXiAoeSkpCi0jZGVmaW5lIE5FR0RJKHgpICgtICh4KSkKLSNkZWZpbmUgTk9UREkoeCkgKCEgKERJKSAoeCkpCi0jZGVmaW5lIElOVkRJKHgpICh+ICh4KSkKLSNkZWZpbmUgQUJTREkoeCkgKCh4KSA8IDAgPyAtKHgpIDogKHgpKQotI2RlZmluZSBFUURJKHgsIHkpICgoREkpICh4KSA9PSAoREkpICh5KSkKLSNkZWZpbmUgTkVESSh4LCB5KSAoKERJKSAoeCkgIT0gKERJKSAoeSkpCi0jZGVmaW5lIExUREkoeCwgeSkgKChESSkgKHgpIDwgKERJKSAoeSkpCi0jZGVmaW5lIExFREkoeCwgeSkgKChESSkgKHgpIDw9IChESSkgKHkpKQotI2RlZmluZSBHVERJKHgsIHkpICgoREkpICh4KSA+IChESSkgKHkpKQotI2RlZmluZSBHRURJKHgsIHkpICgoREkpICh4KSA+PSAoREkpICh5KSkKLSNkZWZpbmUgTFRVREkoeCwgeSkgKChVREkpICh4KSA8IChVREkpICh5KSkKLSNkZWZpbmUgTEVVREkoeCwgeSkgKChVREkpICh4KSA8PSAoVURJKSAoeSkpCi0jZGVmaW5lIEdUVURJKHgsIHkpICgoVURJKSAoeCkgPiAoVURJKSAoeSkpCi0jZGVmaW5lIEdFVURJKHgsIHkpICgoVURJKSAoeCkgPj0gKFVESSkgKHkpKQotI2VuZGlmIC8qIERJX0ZOX1NVUFBPUlQgKi8KLQwKLSNkZWZpbmUgRVhUQklRSSh4KSAoKFFJKSAoQkkpICh4KSkKLSNkZWZpbmUgRVhUQklISSh4KSAoKEhJKSAoQkkpICh4KSkKLSNkZWZpbmUgRVhUQklTSSh4KSAoKFNJKSAoQkkpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIEVYVEJJREkgKEJJKTsKLSNlbHNlCi0jZGVmaW5lIEVYVEJJREkoeCkgKChESSkgKEJJKSAoeCkpCi0jZW5kaWYKLSNkZWZpbmUgRVhUUUlISSh4KSAoKEhJKSAoUUkpICh4KSkKLSNkZWZpbmUgRVhUUUlTSSh4KSAoKFNJKSAoUUkpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIEVYVFFJREkgKFFJKTsKLSNlbHNlCi0jZGVmaW5lIEVYVFFJREkoeCkgKChESSkgKFFJKSAoeCkpCi0jZW5kaWYKLSNkZWZpbmUgRVhUSElISSh4KSAoKEhJKSAoSEkpICh4KSkKLSNkZWZpbmUgRVhUSElTSSh4KSAoKFNJKSAoSEkpICh4KSkKLSNkZWZpbmUgRVhUU0lTSSh4KSAoKFNJKSAoU0kpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIEVYVEhJREkgKEhJKTsKLSNlbHNlCi0jZGVmaW5lIEVYVEhJREkoeCkgKChESSkgKEhJKSAoeCkpCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIEVYVFNJREkgKFNJKTsKLSNlbHNlCi0jZGVmaW5lIEVYVFNJREkoeCkgKChESSkgKFNJKSAoeCkpCi0jZW5kaWYKLQwKLSNkZWZpbmUgWkVYVEJJUUkoeCkgKChRSSkgKEJJKSAoeCkpCi0jZGVmaW5lIFpFWFRCSUhJKHgpICgoSEkpIChCSSkgKHgpKQotI2RlZmluZSBaRVhUQklTSSh4KSAoKFNJKSAoQkkpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIFpFWFRCSURJIChCSSk7Ci0jZWxzZQotI2RlZmluZSBaRVhUQklESSh4KSAoKERJKSAoQkkpICh4KSkKLSNlbmRpZgotI2RlZmluZSBaRVhUUUlISSh4KSAoKEhJKSAoVVFJKSAoeCkpCi0jZGVmaW5lIFpFWFRRSVNJKHgpICgoU0kpIChVUUkpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIFpFWFRRSURJIChRSSk7Ci0jZWxzZQotI2RlZmluZSBaRVhUUUlESSh4KSAoKERJKSAoVVFJKSAoeCkpCi0jZW5kaWYKLSNkZWZpbmUgWkVYVEhJU0koeCkgKChTSSkgKFVISSkgKHgpKQotI2RlZmluZSBaRVhUSElISSh4KSAoKEhJKSAoVUhJKSAoeCkpCi0jZGVmaW5lIFpFWFRTSVNJKHgpICgoU0kpIChVU0kpICh4KSkKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIFpFWFRISURJIChISSk7Ci0jZWxzZQotI2RlZmluZSBaRVhUSElESSh4KSAoKERJKSAoVUhJKSAoeCkpCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIERJIFpFWFRTSURJIChTSSk7Ci0jZWxzZQotI2RlZmluZSBaRVhUU0lESSh4KSAoKERJKSAoVVNJKSAoeCkpCi0jZW5kaWYKLQwKLSNkZWZpbmUgVFJVTkNRSUJJKHgpICgoQkkpIChRSSkgKHgpKQotI2RlZmluZSBUUlVOQ0hJQkkoeCkgKChCSSkgKEhJKSAoeCkpCi0jZGVmaW5lIFRSVU5DSElRSSh4KSAoKFFJKSAoSEkpICh4KSkKLSNkZWZpbmUgVFJVTkNTSUJJKHgpICgoQkkpIChTSSkgKHgpKQotI2RlZmluZSBUUlVOQ1NJUUkoeCkgKChRSSkgKFNJKSAoeCkpCi0jZGVmaW5lIFRSVU5DU0lISSh4KSAoKEhJKSAoU0kpICh4KSkKLSNkZWZpbmUgVFJVTkNTSVNJKHgpICgoU0kpIChTSSkgKHgpKQotI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpCi1leHRlcm4gQkkgVFJVTkNESUJJIChESSk7Ci0jZWxzZQotI2RlZmluZSBUUlVOQ0RJQkkoeCkgKChCSSkgKERJKSAoeCkpCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQotZXh0ZXJuIFFJIFRSVU5DRElRSSAoREkpOwotI2Vsc2UKLSNkZWZpbmUgVFJVTkNESVFJKHgpICgoUUkpIChESSkgKHgpKQotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKLWV4dGVybiBISSBUUlVOQ0RJSEkgKERJKTsKLSNlbHNlCi0jZGVmaW5lIFRSVU5DRElISSh4KSAoKEhJKSAoREkpICh4KSkKLSNlbmRpZgotI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpCi1leHRlcm4gU0kgVFJVTkNESVNJIChESSk7Ci0jZWxzZQotI2RlZmluZSBUUlVOQ0RJU0koeCkgKChTSSkgKERJKSAoeCkpCi0jZW5kaWYKLQwKLS8qIENvbXBvc2luZy9kZWNvbXBvc2luZyB0aGUgdmFyaW91cyB0eXBlcy4KLSAgIFdvcmQgb3JkZXJpbmcgaXMgZW5kaWFuLWluZGVwZW5kZW50LiAgV29yZHMgYXJlIHNwZWNpZmllZCBtb3N0IHRvIGxlYXN0Ci0gICBzaWduaWZpY2FudCBhbmQgd29yZCBudW1iZXIgMCBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkLgotICAgPz8/IE1heSBhbHNvIHdpc2ggYW4gZW5kaWFuLWRlcGVuZGVudCB2ZXJzaW9uLiAgTGF0ZXIuICAqLwotCi0jaWZkZWYgU0VNT1BTX0RFRklORV9JTkxJTkUKLQotU0VNT1BTX0lOTElORSBTRgotU1VCV09SRFNJU0YgKFNJIGluKQotewotICB1bmlvbiB7IFNJIGluOyBTRiBvdXQ7IH0geDsKLSAgeC5pbiA9IGluOwotICByZXR1cm4geC5vdXQ7Ci19Ci0KLVNFTU9QU19JTkxJTkUgU0kKLVNVQldPUkRTRlNJIChTRiBpbikKLXsKLSAgdW5pb24geyBTRiBpbjsgU0kgb3V0OyB9IHg7Ci0gIHguaW4gPSBpbjsKLSAgcmV0dXJuIHgub3V0OwotfQotCi1TRU1PUFNfSU5MSU5FIFNJCi1TVUJXT1JERElTSSAoREkgaW4sIGludCB3b3JkKQotewotICBpZiAod29yZCA9PSAwKQotICAgIHJldHVybiAoVURJKSBpbiA+PiAzMjsKLSAgZWxzZQotICAgIHJldHVybiBpbjsKLX0KLQotU0VNT1BTX0lOTElORSBTSQotU1VCV09SRERGU0kgKERGIGluLCBpbnQgd29yZCkKLXsKLSAgLyogTm90ZTogdHlwZWRlZiBVREkgREY7ICovCi0gIGlmICh3b3JkID09IDApCi0gICAgcmV0dXJuIChVREkpIGluID4+IDMyOwotICBlbHNlCi0gICAgcmV0dXJuIGluOwotfQotCi1TRU1PUFNfSU5MSU5FIFNJCi1TVUJXT1JEWEZTSSAoWEYgaW4sIGludCB3b3JkKQotewotICAvKiBOb3RlOiB0eXBlZGVmIHN0cnVjdCB7IFNJIHBhcnRzWzNdOyB9IFhGOyAqLwotICB1bmlvbiB7IFhGIGluOyBTSSBvdXRbM107IH0geDsKLSAgeC5pbiA9IGluOwotICByZXR1cm4geC5vdXRbd29yZF07Ci19Ci0KLVNFTU9QU19JTkxJTkUgU0kKLVNVQldPUkRURlNJIChURiBpbiwgaW50IHdvcmQpCi17Ci0gIC8qIE5vdGU6IHR5cGVkZWYgc3RydWN0IHsgU0kgcGFydHNbNF07IH0gVEY7ICovCi0gIHVuaW9uIHsgVEYgaW47IFNJIG91dFs0XTsgfSB4OwotICB4LmluID0gaW47Ci0gIHJldHVybiB4Lm91dFt3b3JkXTsKLX0KLQotU0VNT1BTX0lOTElORSBESQotSk9JTlNJREkgKFNJIHgwLCBTSSB4MSkKLXsKLSAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKLSAgICByZXR1cm4gTUFLRURJICh4MCwgeDEpOwotICBlbHNlCi0gICAgcmV0dXJuIE1BS0VESSAoeDEsIHgwKTsKLX0KLQotU0VNT1BTX0lOTElORSBERgotSk9JTlNJREYgKFNJIHgwLCBTSSB4MSkKLXsKLSAgdW5pb24geyBTSSBpblsyXTsgREYgb3V0OyB9IHg7Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCi0gICAgeC5pblswXSA9IHgwLCB4LmluWzFdID0geDE7Ci0gIGVsc2UKLSAgICB4LmluWzFdID0geDAsIHguaW5bMF0gPSB4MTsKLSAgcmV0dXJuIHgub3V0OwotfQotCi1TRU1PUFNfSU5MSU5FIFhGCi1KT0lOU0lYRiAoU0kgeDAsIFNJIHgxLCBTSSB4MikKLXsKLSAgdW5pb24geyBTSSBpblszXTsgWEYgb3V0OyB9IHg7Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCi0gICAgeC5pblswXSA9IHgwLCB4LmluWzFdID0geDEsIHguaW5bMl0gPSB4MjsKLSAgZWxzZQotICAgIHguaW5bMl0gPSB4MCwgeC5pblsxXSA9IHgxLCB4LmluWzBdID0geDI7Ci0gIHJldHVybiB4Lm91dDsKLX0KLQotU0VNT1BTX0lOTElORSBURgotSk9JTlNJVEYgKFNJIHgwLCBTSSB4MSwgU0kgeDIsIFNJIHgzKQotewotICB1bmlvbiB7IFNJIGluWzRdOyBURiBvdXQ7IH0geDsKLSAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKLSAgICB4LmluWzBdID0geDAsIHguaW5bMV0gPSB4MSwgeC5pblsyXSA9IHgyLCB4LmluWzNdID0geDM7Ci0gIGVsc2UKLSAgICB4LmluWzNdID0geDAsIHguaW5bMl0gPSB4MSwgeC5pblsxXSA9IHgyLCB4LmluWzBdID0geDM7Ci0gIHJldHVybiB4Lm91dDsKLX0KLQotI2Vsc2UKLQotU0YgU1VCV09SRFNJU0YgKFNJKTsKLVNJIFNVQldPUkRTRlNJIChTRik7Ci1TSSBTVUJXT1JERElTSSAoREksIGludCk7Ci1TSSBTVUJXT1JEREZTSSAoREYsIGludCk7Ci1TSSBTVUJXT1JEWEZTSSAoWEYsIGludCk7Ci1TSSBTVUJXT1JEVEZTSSAoVEYsIGludCk7Ci0KLURJIEpPSU5TSURJIChTSSwgU0kpOwotREYgSk9JTlNJREYgKFNJLCBTSSk7Ci1YRiBKT0lOU0lYRiAoU0ksIFNJLCBTSSk7Ci1URiBKT0lOU0lURiAoU0ksIFNJLCBTSSwgU0kpOwotCi0jZW5kaWYgLyogU1VCV09SRCxKT0lOICovCi0MCi0vKiBTZW1hbnRpYyBzdXBwb3J0IHV0aWxpdGllcy4gICovCi0KLSNpZmRlZiBTRU1PUFNfREVGSU5FX0lOTElORQotCi1TRU1PUFNfSU5MSU5FIFNJCi1BRERDU0kgKFNJIGEsIFNJIGIsIEJJIGMpCi17Ci0gIFNJIHJlcyA9IEFERFNJIChhLCBBRERTSSAoYiwgYykpOwotICByZXR1cm4gcmVzOwotfQotCi1TRU1PUFNfSU5MSU5FIEJJCi1BRERDRlNJIChTSSBhLCBTSSBiLCBCSSBjKQotewotICBTSSB0bXAgPSBBRERTSSAoYSwgQUREU0kgKGIsIGMpKTsKLSAgQkkgcmVzID0gKChVU0kpIHRtcCA8IChVU0kpIGEpIHx8IChjICYmIHRtcCA9PSBhKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBCSQotQURET0ZTSSAoU0kgYSwgU0kgYiwgQkkgYykKLXsKLSAgU0kgdG1wID0gQUREU0kgKGEsIEFERFNJIChiLCBjKSk7Ci0gIEJJIHJlcyA9ICgoKGEgPCAwKSA9PSAoYiA8IDApKQotCSAgICAmJiAoKGEgPCAwKSAhPSAodG1wIDwgMCkpKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBTSQotU1VCQ1NJIChTSSBhLCBTSSBiLCBCSSBjKQotewotICBTSSByZXMgPSBTVUJTSSAoYSwgQUREU0kgKGIsIGMpKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBCSQotU1VCQ0ZTSSAoU0kgYSwgU0kgYiwgQkkgYykKLXsKLSAgQkkgcmVzID0gKChVU0kpIGEgPCAoVVNJKSBiKSB8fCAoYyAmJiBhID09IGIpOwotICByZXR1cm4gcmVzOwotfQotCi1TRU1PUFNfSU5MSU5FIEJJCi1TVUJPRlNJIChTSSBhLCBTSSBiLCBCSSBjKQotewotICBTSSB0bXAgPSBTVUJTSSAoYSwgQUREU0kgKGIsIGMpKTsKLSAgQkkgcmVzID0gKCgoYSA8IDApICE9IChiIDwgMCkpCi0JICAgICYmICgoYSA8IDApICE9ICh0bXAgPCAwKSkpOwotICByZXR1cm4gcmVzOwotfQotCi1TRU1PUFNfSU5MSU5FIEhJCi1BRERDSEkgKEhJIGEsIEhJIGIsIEJJIGMpCi17Ci0gIEhJIHJlcyA9IEFEREhJIChhLCBBRERISSAoYiwgYykpOwotICByZXR1cm4gcmVzOwotfQotCi1TRU1PUFNfSU5MSU5FIEJJCi1BRERDRkhJIChISSBhLCBISSBiLCBCSSBjKQotewotICBISSB0bXAgPSBBRERISSAoYSwgQURESEkgKGIsIGMpKTsKLSAgQkkgcmVzID0gKChVSEkpIHRtcCA8IChVSEkpIGEpIHx8IChjICYmIHRtcCA9PSBhKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBCSQotQURET0ZISSAoSEkgYSwgSEkgYiwgQkkgYykKLXsKLSAgSEkgdG1wID0gQURESEkgKGEsIEFEREhJIChiLCBjKSk7Ci0gIEJJIHJlcyA9ICgoKGEgPCAwKSA9PSAoYiA8IDApKQotCSAgICAmJiAoKGEgPCAwKSAhPSAodG1wIDwgMCkpKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBISQotU1VCQ0hJIChISSBhLCBISSBiLCBCSSBjKQotewotICBISSByZXMgPSBTVUJISSAoYSwgQURESEkgKGIsIGMpKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotU0VNT1BTX0lOTElORSBCSQotU1VCQ0ZISSAoSEkgYSwgSEkgYiwgQkkgYykKLXsKLSAgQkkgcmVzID0gKChVSEkpIGEgPCAoVUhJKSBiKSB8fCAoYyAmJiBhID09IGIpOwotICByZXR1cm4gcmVzOwotfQotCi1TRU1PUFNfSU5MSU5FIEJJCi1TVUJPRkhJIChISSBhLCBISSBiLCBCSSBjKQotewotICBISSB0bXAgPSBTVUJISSAoYSwgQURESEkgKGIsIGMpKTsKLSAgQkkgcmVzID0gKCgoYSA8IDApICE9IChiIDwgMCkpCi0JICAgICYmICgoYSA8IDApICE9ICh0bXAgPCAwKSkpOwotICByZXR1cm4gcmVzOwotfQotCi0jZWxzZQotCi1TSSBBRERDU0kgKFNJLCBTSSwgQkkpOwotVUJJIEFERENGU0kgKFNJLCBTSSwgQkkpOwotVUJJIEFERE9GU0kgKFNJLCBTSSwgQkkpOwotU0kgU1VCQ1NJIChTSSwgU0ksIEJJKTsKLVVCSSBTVUJDRlNJIChTSSwgU0ksIEJJKTsKLVVCSSBTVUJPRlNJIChTSSwgU0ksIEJJKTsKLUhJIEFERENISSAoSEksIEhJLCBCSSk7Ci1VQkkgQUREQ0ZISSAoSEksIEhJLCBCSSk7Ci1VQkkgQURET0ZISSAoSEksIEhJLCBCSSk7Ci1ISSBTVUJDSEkgKEhJLCBISSwgQkkpOwotVUJJIFNVQkNGSEkgKEhJLCBISSwgQkkpOwotVUJJIFNVQk9GSEkgKEhJLCBISSwgQkkpOwotCi0jZW5kaWYKLQotI2VuZGlmIC8qIENHRU5fU0VNX09QU19IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tcGFyLmMgYi9zaW0vY29tbW9uL2NnZW4tcGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2QyNmMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9jZ2VuLXBhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qIFNpbXVsYXRvciBwYXJhbGxlbCByb3V0aW5lcyBmb3IgQ0dFTiBzaW11bGF0b3JzIChhbmQgbWF5YmUgb3RoZXJzKS4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgaW5zdHJ1Y3Rpb24gc2V0IHNpbXVsYXRvci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiY2dlbi1tZW0uaCIKLSNpbmNsdWRlICJjZ2VuLXBhci5oIgotCi0vKiBGdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGNnZW4gaW50ZXJmYWNlLiAgVGhlc2UgZnVuY3Rpb25zIGFkZCB2YXJpb3VzCi0gICBraW5kcyBvZiB3cml0ZXMgdG8gdGhlIHdyaXRlIHF1ZXVlLiAgKi8KLXZvaWQgc2ltX3F1ZXVlX2JpX3dyaXRlIChTSU1fQ1BVICpjcHUsIEJJICp0YXJnZXQsIEJJIHZhbHVlKQotewotICBDR0VOX1dSSVRFX1FVRVVFICpxID0gQ1BVX1dSSVRFX1FVRVVFIChjcHUpOwotICBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmVsZW1lbnQgPSBDR0VOX1dSSVRFX1FVRVVFX05FWFQgKHEpOwotICBlbGVtZW50LT5raW5kID0gQ0dFTl9CSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuYmlfd3JpdGUudGFyZ2V0ID0gdGFyZ2V0OwotICBlbGVtZW50LT5raW5kcy5iaV93cml0ZS52YWx1ZSAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfcWlfd3JpdGUgKFNJTV9DUFUgKmNwdSwgVVFJICp0YXJnZXQsIFVRSSB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fUUlfV1JJVEU7Ci0gIGVsZW1lbnQtPmluc25fYWRkcmVzcyA9IENQVV9QQ19HRVQgKGNwdSk7Ci0gIGVsZW1lbnQtPmtpbmRzLnFpX3dyaXRlLnRhcmdldCA9IHRhcmdldDsKLSAgZWxlbWVudC0+a2luZHMucWlfd3JpdGUudmFsdWUgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX3NpX3dyaXRlIChTSU1fQ1BVICpjcHUsIFNJICp0YXJnZXQsIFNJIHZhbHVlKQotewotICBDR0VOX1dSSVRFX1FVRVVFICpxID0gQ1BVX1dSSVRFX1FVRVVFIChjcHUpOwotICBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmVsZW1lbnQgPSBDR0VOX1dSSVRFX1FVRVVFX05FWFQgKHEpOwotICBlbGVtZW50LT5raW5kID0gQ0dFTl9TSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuc2lfd3JpdGUudGFyZ2V0ID0gdGFyZ2V0OwotICBlbGVtZW50LT5raW5kcy5zaV93cml0ZS52YWx1ZSAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfc2Zfd3JpdGUgKFNJTV9DUFUgKmNwdSwgU0kgKnRhcmdldCwgU0YgdmFsdWUpCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX1NGX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5zZl93cml0ZS50YXJnZXQgPSB0YXJnZXQ7Ci0gIGVsZW1lbnQtPmtpbmRzLnNmX3dyaXRlLnZhbHVlICA9IHZhbHVlOwotfQotCi12b2lkIHNpbV9xdWV1ZV9wY193cml0ZSAoU0lNX0NQVSAqY3B1LCBVU0kgdmFsdWUpCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX1BDX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5wY193cml0ZS52YWx1ZSA9IHZhbHVlOwotfQotCi12b2lkIHNpbV9xdWV1ZV9mbl9oaV93cml0ZSAoCi0gIFNJTV9DUFUgKmNwdSwKLSAgdm9pZCAoKndyaXRlX2Z1bmN0aW9uKShTSU1fQ1BVICpjcHUsIFVJTlQsIFVISSksCi0gIFVJTlQgcmVnbm8sCi0gIFVISSB2YWx1ZQotKQotewotICBDR0VOX1dSSVRFX1FVRVVFICpxID0gQ1BVX1dSSVRFX1FVRVVFIChjcHUpOwotICBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmVsZW1lbnQgPSBDR0VOX1dSSVRFX1FVRVVFX05FWFQgKHEpOwotICBlbGVtZW50LT5raW5kID0gQ0dFTl9GTl9ISV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5faGlfd3JpdGUuZnVuY3Rpb24gPSB3cml0ZV9mdW5jdGlvbjsKLSAgZWxlbWVudC0+a2luZHMuZm5faGlfd3JpdGUucmVnbm8gPSByZWdubzsKLSAgZWxlbWVudC0+a2luZHMuZm5faGlfd3JpdGUudmFsdWUgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fc2lfd3JpdGUgKAotICBTSU1fQ1BVICpjcHUsCi0gIHZvaWQgKCp3cml0ZV9mdW5jdGlvbikoU0lNX0NQVSAqY3B1LCBVSU5ULCBVU0kpLAotICBVSU5UIHJlZ25vLAotICBVU0kgdmFsdWUKLSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fRk5fU0lfV1JJVEU7Ci0gIGVsZW1lbnQtPmluc25fYWRkcmVzcyA9IENQVV9QQ19HRVQgKGNwdSk7Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3NpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3NpX3dyaXRlLnJlZ25vID0gcmVnbm87Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3NpX3dyaXRlLnZhbHVlID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX2ZuX3NmX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgVUlOVCwgU0YpLAotICBVSU5UIHJlZ25vLAotICBTRiB2YWx1ZQotKQotewotICBDR0VOX1dSSVRFX1FVRVVFICpxID0gQ1BVX1dSSVRFX1FVRVVFIChjcHUpOwotICBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmVsZW1lbnQgPSBDR0VOX1dSSVRFX1FVRVVFX05FWFQgKHEpOwotICBlbGVtZW50LT5raW5kID0gQ0dFTl9GTl9TRl9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fc2Zfd3JpdGUuZnVuY3Rpb24gPSB3cml0ZV9mdW5jdGlvbjsKLSAgZWxlbWVudC0+a2luZHMuZm5fc2Zfd3JpdGUucmVnbm8gPSByZWdubzsKLSAgZWxlbWVudC0+a2luZHMuZm5fc2Zfd3JpdGUudmFsdWUgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fZGlfd3JpdGUgKAotICBTSU1fQ1BVICpjcHUsCi0gIHZvaWQgKCp3cml0ZV9mdW5jdGlvbikoU0lNX0NQVSAqY3B1LCBVSU5ULCBESSksCi0gIFVJTlQgcmVnbm8sCi0gIERJIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX0RJX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5mbl9kaV93cml0ZS5mdW5jdGlvbiA9IHdyaXRlX2Z1bmN0aW9uOwotICBlbGVtZW50LT5raW5kcy5mbl9kaV93cml0ZS5yZWdubyA9IHJlZ25vOwotICBlbGVtZW50LT5raW5kcy5mbl9kaV93cml0ZS52YWx1ZSA9IHZhbHVlOwotfQotCi12b2lkIHNpbV9xdWV1ZV9mbl94aV93cml0ZSAoCi0gIFNJTV9DUFUgKmNwdSwKLSAgdm9pZCAoKndyaXRlX2Z1bmN0aW9uKShTSU1fQ1BVICpjcHUsIFVJTlQsIFNJICopLAotICBVSU5UIHJlZ25vLAotICBTSSAqdmFsdWUKLSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fRk5fWElfV1JJVEU7Ci0gIGVsZW1lbnQtPmluc25fYWRkcmVzcyA9IENQVV9QQ19HRVQgKGNwdSk7Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLnJlZ25vID0gcmVnbm87Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLnZhbHVlWzBdID0gdmFsdWVbMF07Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLnZhbHVlWzFdID0gdmFsdWVbMV07Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLnZhbHVlWzJdID0gdmFsdWVbMl07Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3hpX3dyaXRlLnZhbHVlWzNdID0gdmFsdWVbM107Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX2ZuX2RmX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgVUlOVCwgREYpLAotICBVSU5UIHJlZ25vLAotICBERiB2YWx1ZQotKQotewotICBDR0VOX1dSSVRFX1FVRVVFICpxID0gQ1BVX1dSSVRFX1FVRVVFIChjcHUpOwotICBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmVsZW1lbnQgPSBDR0VOX1dSSVRFX1FVRVVFX05FWFQgKHEpOwotICBlbGVtZW50LT5raW5kID0gQ0dFTl9GTl9ERl9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fZGZfd3JpdGUuZnVuY3Rpb24gPSB3cml0ZV9mdW5jdGlvbjsKLSAgZWxlbWVudC0+a2luZHMuZm5fZGZfd3JpdGUucmVnbm8gPSByZWdubzsKLSAgZWxlbWVudC0+a2luZHMuZm5fZGZfd3JpdGUudmFsdWUgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fcGNfd3JpdGUgKAotICBTSU1fQ1BVICpjcHUsCi0gIHZvaWQgKCp3cml0ZV9mdW5jdGlvbikoU0lNX0NQVSAqY3B1LCBVU0kpLAotICBVU0kgdmFsdWUKLSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fRk5fUENfV1JJVEU7Ci0gIGVsZW1lbnQtPmluc25fYWRkcmVzcyA9IENQVV9QQ19HRVQgKGNwdSk7Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3BjX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX3BjX3dyaXRlLnZhbHVlID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV9xaV93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBRSSB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fTUVNX1FJX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5tZW1fcWlfd3JpdGUuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV9xaV93cml0ZS52YWx1ZSAgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV9oaV93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBISSB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fTUVNX0hJX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5tZW1faGlfd3JpdGUuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV9oaV93cml0ZS52YWx1ZSAgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV9zaV93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBTSSB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fTUVNX1NJX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5tZW1fc2lfd3JpdGUuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV9zaV93cml0ZS52YWx1ZSAgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV9kaV93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBESSB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fTUVNX0RJX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5tZW1fZGlfd3JpdGUuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV9kaV93cml0ZS52YWx1ZSAgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV9kZl93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBERiB2YWx1ZSkKLXsKLSAgQ0dFTl9XUklURV9RVUVVRSAqcSA9IENQVV9XUklURV9RVUVVRSAoY3B1KTsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UICplbGVtZW50ID0gQ0dFTl9XUklURV9RVUVVRV9ORVhUIChxKTsKLSAgZWxlbWVudC0+a2luZCA9IENHRU5fTUVNX0RGX1dSSVRFOwotICBlbGVtZW50LT5pbnNuX2FkZHJlc3MgPSBDUFVfUENfR0VUIChjcHUpOwotICBlbGVtZW50LT5raW5kcy5tZW1fZGZfd3JpdGUuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV9kZl93cml0ZS52YWx1ZSAgID0gdmFsdWU7Ci19Ci0KLXZvaWQgc2ltX3F1ZXVlX21lbV94aV93cml0ZSAoU0lNX0NQVSAqY3B1LCBTSSBhZGRyZXNzLCBTSSAqdmFsdWUpCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX01FTV9YSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMubWVtX3hpX3dyaXRlLmFkZHJlc3MgPSBhZGRyZXNzOwotICBlbGVtZW50LT5raW5kcy5tZW1feGlfd3JpdGUudmFsdWVbMF0gPSB2YWx1ZVswXTsKLSAgZWxlbWVudC0+a2luZHMubWVtX3hpX3dyaXRlLnZhbHVlWzFdID0gdmFsdWVbMV07Ci0gIGVsZW1lbnQtPmtpbmRzLm1lbV94aV93cml0ZS52YWx1ZVsyXSA9IHZhbHVlWzJdOwotICBlbGVtZW50LT5raW5kcy5tZW1feGlfd3JpdGUudmFsdWVbM10gPSB2YWx1ZVszXTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX3FpX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBRSSksCi0gIFNJIGFkZHJlc3MsCi0gIFFJIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9RSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3FpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV9xaV93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3FpX3dyaXRlLnZhbHVlICAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX2hpX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBISSksCi0gIFNJIGFkZHJlc3MsCi0gIEhJIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9ISV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2hpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV9oaV93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2hpX3dyaXRlLnZhbHVlICAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX3NpX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBTSSksCi0gIFNJIGFkZHJlc3MsCi0gIFNJIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9TSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3NpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV9zaV93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3NpX3dyaXRlLnZhbHVlICAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX2RpX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBESSksCi0gIFNJIGFkZHJlc3MsCi0gIERJIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9ESV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2RpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV9kaV93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2RpX3dyaXRlLnZhbHVlICAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX2RmX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBERiksCi0gIFNJIGFkZHJlc3MsCi0gIERGIHZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9ERl9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2RmX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV9kZl93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX2RmX3dyaXRlLnZhbHVlICAgPSB2YWx1ZTsKLX0KLQotdm9pZCBzaW1fcXVldWVfZm5fbWVtX3hpX3dyaXRlICgKLSAgU0lNX0NQVSAqY3B1LAotICB2b2lkICgqd3JpdGVfZnVuY3Rpb24pKFNJTV9DUFUgKmNwdSwgSUFERFIsIFNJLCBTSSAqKSwKLSAgU0kgYWRkcmVzcywKLSAgU0kgKnZhbHVlCi0pCi17Ci0gIENHRU5fV1JJVEVfUVVFVUUgKnEgPSBDUFVfV1JJVEVfUVVFVUUgKGNwdSk7Ci0gIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqZWxlbWVudCA9IENHRU5fV1JJVEVfUVVFVUVfTkVYVCAocSk7Ci0gIGVsZW1lbnQtPmtpbmQgPSBDR0VOX0ZOX01FTV9YSV9XUklURTsKLSAgZWxlbWVudC0+aW5zbl9hZGRyZXNzID0gQ1BVX1BDX0dFVCAoY3B1KTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3hpX3dyaXRlLmZ1bmN0aW9uID0gd3JpdGVfZnVuY3Rpb247Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV94aV93cml0ZS5hZGRyZXNzID0gYWRkcmVzczsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3hpX3dyaXRlLnZhbHVlWzBdID0gdmFsdWVbMF07Ci0gIGVsZW1lbnQtPmtpbmRzLmZuX21lbV94aV93cml0ZS52YWx1ZVsxXSA9IHZhbHVlWzFdOwotICBlbGVtZW50LT5raW5kcy5mbl9tZW1feGlfd3JpdGUudmFsdWVbMl0gPSB2YWx1ZVsyXTsKLSAgZWxlbWVudC0+a2luZHMuZm5fbWVtX3hpX3dyaXRlLnZhbHVlWzNdID0gdmFsdWVbM107Ci19Ci0KLS8qIEV4ZWN1dGUgYSB3cml0ZSBzdG9yZWQgb24gdGhlIHdyaXRlIHF1ZXVlLiAgKi8KLXZvaWQKLWNnZW5fd3JpdGVfcXVldWVfZWxlbWVudF9leGVjdXRlIChTSU1fQ1BVICpjcHUsIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVCAqaXRlbSkKLXsKLSAgSUFERFIgcGM7Ci0gIHN3aXRjaCAoQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UX0tJTkQgKGl0ZW0pKQotICAgIHsKLSAgICBjYXNlIENHRU5fQklfV1JJVEU6Ci0gICAgICAqaXRlbS0+a2luZHMuYmlfd3JpdGUudGFyZ2V0ID0gaXRlbS0+a2luZHMuYmlfd3JpdGUudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fUUlfV1JJVEU6Ci0gICAgICAqaXRlbS0+a2luZHMucWlfd3JpdGUudGFyZ2V0ID0gaXRlbS0+a2luZHMucWlfd3JpdGUudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fU0lfV1JJVEU6Ci0gICAgICAqaXRlbS0+a2luZHMuc2lfd3JpdGUudGFyZ2V0ID0gaXRlbS0+a2luZHMuc2lfd3JpdGUudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fU0ZfV1JJVEU6Ci0gICAgICAqaXRlbS0+a2luZHMuc2Zfd3JpdGUudGFyZ2V0ID0gaXRlbS0+a2luZHMuc2Zfd3JpdGUudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fUENfV1JJVEU6Ci0gICAgICBDUFVfUENfU0VUIChjcHUsIGl0ZW0tPmtpbmRzLnBjX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9GTl9ISV9XUklURToKLSAgICAgIGl0ZW0tPmtpbmRzLmZuX2hpX3dyaXRlLmZ1bmN0aW9uIChjcHUsCi0JCQkJCWl0ZW0tPmtpbmRzLmZuX2hpX3dyaXRlLnJlZ25vLAotCQkJCQlpdGVtLT5raW5kcy5mbl9oaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fU0lfV1JJVEU6Ci0gICAgICBpdGVtLT5raW5kcy5mbl9zaV93cml0ZS5mdW5jdGlvbiAoY3B1LAotCQkJCQlpdGVtLT5raW5kcy5mbl9zaV93cml0ZS5yZWdubywKLQkJCQkJaXRlbS0+a2luZHMuZm5fc2lfd3JpdGUudmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDR0VOX0ZOX1NGX1dSSVRFOgotICAgICAgaXRlbS0+a2luZHMuZm5fc2Zfd3JpdGUuZnVuY3Rpb24gKGNwdSwKLQkJCQkJaXRlbS0+a2luZHMuZm5fc2Zfd3JpdGUucmVnbm8sCi0JCQkJCWl0ZW0tPmtpbmRzLmZuX3NmX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9GTl9ESV9XUklURToKLSAgICAgIGl0ZW0tPmtpbmRzLmZuX2RpX3dyaXRlLmZ1bmN0aW9uIChjcHUsCi0JCQkJCWl0ZW0tPmtpbmRzLmZuX2RpX3dyaXRlLnJlZ25vLAotCQkJCQlpdGVtLT5raW5kcy5mbl9kaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fREZfV1JJVEU6Ci0gICAgICBpdGVtLT5raW5kcy5mbl9kZl93cml0ZS5mdW5jdGlvbiAoY3B1LAotCQkJCQlpdGVtLT5raW5kcy5mbl9kZl93cml0ZS5yZWdubywKLQkJCQkJaXRlbS0+a2luZHMuZm5fZGZfd3JpdGUudmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDR0VOX0ZOX1hJX1dSSVRFOgotICAgICAgaXRlbS0+a2luZHMuZm5feGlfd3JpdGUuZnVuY3Rpb24gKGNwdSwKLQkJCQkJaXRlbS0+a2luZHMuZm5feGlfd3JpdGUucmVnbm8sCi0JCQkJCWl0ZW0tPmtpbmRzLmZuX3hpX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9GTl9QQ19XUklURToKLSAgICAgIGl0ZW0tPmtpbmRzLmZuX3BjX3dyaXRlLmZ1bmN0aW9uIChjcHUsIGl0ZW0tPmtpbmRzLmZuX3BjX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fUUlfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTVFJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1fcWlfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX3FpX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fSElfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTUhJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1faGlfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX2hpX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fU0lfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTVNJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1fc2lfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX3NpX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fRElfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTURJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1fZGlfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX2RpX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fREZfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTURGIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1fZGZfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX2RmX3dyaXRlLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0dFTl9NRU1fWElfV1JJVEU6Ci0gICAgICBwYyA9IGl0ZW0tPmluc25fYWRkcmVzczsKLSAgICAgIFNFVE1FTVNJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1feGlfd3JpdGUuYWRkcmVzcywKLQkJaXRlbS0+a2luZHMubWVtX3hpX3dyaXRlLnZhbHVlWzBdKTsKLSAgICAgIFNFVE1FTVNJIChjcHUsIHBjLCBpdGVtLT5raW5kcy5tZW1feGlfd3JpdGUuYWRkcmVzcyArIDQsCi0JCWl0ZW0tPmtpbmRzLm1lbV94aV93cml0ZS52YWx1ZVsxXSk7Ci0gICAgICBTRVRNRU1TSSAoY3B1LCBwYywgaXRlbS0+a2luZHMubWVtX3hpX3dyaXRlLmFkZHJlc3MgKyA4LAotCQlpdGVtLT5raW5kcy5tZW1feGlfd3JpdGUudmFsdWVbMl0pOwotICAgICAgU0VUTUVNU0kgKGNwdSwgcGMsIGl0ZW0tPmtpbmRzLm1lbV94aV93cml0ZS5hZGRyZXNzICsgMTIsCi0JCWl0ZW0tPmtpbmRzLm1lbV94aV93cml0ZS52YWx1ZVszXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX1FJX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1fcWlfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1fcWlfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV9xaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX0hJX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1faGlfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1faGlfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV9oaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX1NJX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1fc2lfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1fc2lfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV9zaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX0RJX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1fZGlfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1fZGlfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV9kaV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX0RGX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1fZGZfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1fZGZfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV9kZl93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENHRU5fRk5fTUVNX1hJX1dSSVRFOgotICAgICAgcGMgPSBpdGVtLT5pbnNuX2FkZHJlc3M7Ci0gICAgICBpdGVtLT5raW5kcy5mbl9tZW1feGlfd3JpdGUuZnVuY3Rpb24gKGNwdSwgcGMsCi0JCQkJCSAgICBpdGVtLT5raW5kcy5mbl9tZW1feGlfd3JpdGUuYWRkcmVzcywKLQkJCQkJICAgIGl0ZW0tPmtpbmRzLmZuX21lbV94aV93cml0ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsgLyogRklYTUU6IGZvciBub3cuLi4ucHJpbnQgbWVzc2FnZSBsYXRlci4gICovCi0gICAgfQotfQotCi0vKiBVdGlsaXRpZXMgZm9yIHRoZSB3cml0ZSBxdWV1ZS4gICovCi1DR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKgotY2dlbl93cml0ZV9xdWV1ZV9vdmVyZmxvdyAoQ0dFTl9XUklURV9RVUVVRSAqcSkKLXsKLSAgYWJvcnQgKCk7IC8qIEZJWE1FOiBmb3Igbm93Li4uLnByaW50IG1lc3NhZ2UgbGF0ZXIuICAqLwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1wYXIuaCBiL3NpbS9jb21tb24vY2dlbi1wYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4YTMyMS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tcGFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyogU2ltdWxhdG9yIGhlYWRlciBmb3IgY2dlbiBwYXJhbGxlbCBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBpbnN0cnVjdGlvbiBzZXQgc2ltdWxhdG9yLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fUEFSX0gKLSNkZWZpbmUgQ0dFTl9QQVJfSAotCi0vKiBLaW5kcyBvZiB3cml0ZXMgc3RvcmVkIG9uIHRoZSB3cml0ZSBxdWV1ZS4gICovCi1lbnVtIGNnZW5fd3JpdGVfcXVldWVfa2luZCB7Ci0gIENHRU5fQklfV1JJVEUsIENHRU5fUUlfV1JJVEUsIENHRU5fU0lfV1JJVEUsIENHRU5fU0ZfV1JJVEUsCi0gIENHRU5fUENfV1JJVEUsCi0gIENHRU5fRk5fSElfV1JJVEUsIENHRU5fRk5fU0lfV1JJVEUsIENHRU5fRk5fU0ZfV1JJVEUsCi0gIENHRU5fRk5fRElfV1JJVEUsIENHRU5fRk5fREZfV1JJVEUsCi0gIENHRU5fRk5fWElfV1JJVEUsIENHRU5fRk5fUENfV1JJVEUsCi0gIENHRU5fTUVNX1FJX1dSSVRFLCBDR0VOX01FTV9ISV9XUklURSwgQ0dFTl9NRU1fU0lfV1JJVEUsIENHRU5fTUVNX0RJX1dSSVRFLAotICBDR0VOX01FTV9ERl9XUklURSwgQ0dFTl9NRU1fWElfV1JJVEUsCi0gIENHRU5fRk5fTUVNX1FJX1dSSVRFLCBDR0VOX0ZOX01FTV9ISV9XUklURSwgQ0dFTl9GTl9NRU1fU0lfV1JJVEUsCi0gIENHRU5fRk5fTUVNX0RJX1dSSVRFLCBDR0VOX0ZOX01FTV9ERl9XUklURSwgQ0dFTl9GTl9NRU1fWElfV1JJVEUsCi0gIENHRU5fTlVNX1dSSVRFX0tJTkRTCi19OwotCi0vKiBFbGVtZW50IG9mIHRoZSB3cml0ZSBxdWV1ZS4gICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGVudW0gY2dlbl93cml0ZV9xdWV1ZV9raW5kIGtpbmQ7IC8qIFVzZWQgdG8gc2VsZWN0IHVuaW9uIG1lbWJlciBiZWxvdy4gICovCi0gIElBRERSIGluc25fYWRkcmVzczsgICAgICAgLyogQWRkcmVzcyBvZiB0aGUgaW5zbiBwZXJmb3JtaW5nIHRoZSB3cml0ZS4gICovCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgQkkgICp0YXJnZXQ7Ci0gICAgICBCSSAgIHZhbHVlOwotICAgIH0gYmlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFVRSSAqdGFyZ2V0OwotICAgICAgUUkgICB2YWx1ZTsKLSAgICB9IHFpX3dyaXRlOwotICAgIHN0cnVjdCB7Ci0gICAgICBTSSAqdGFyZ2V0OwotICAgICAgU0kgIHZhbHVlOwotICAgIH0gc2lfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICp0YXJnZXQ7Ci0gICAgICBTRiAgdmFsdWU7Ci0gICAgfSBzZl93cml0ZTsKLSAgICBzdHJ1Y3QgewotICAgICAgVVNJIHZhbHVlOwotICAgIH0gcGNfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFVJTlQgcmVnbm87Ci0gICAgICBVSEkgICB2YWx1ZTsKLSAgICAgIHZvaWQgKCpmdW5jdGlvbikoU0lNX0NQVSAqLCBVSU5ULCBVSEkpOwotICAgIH0gZm5faGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFVJTlQgcmVnbm87Ci0gICAgICBTSSAgIHZhbHVlOwotICAgICAgdm9pZCAoKmZ1bmN0aW9uKShTSU1fQ1BVICosIFVJTlQsIFVTSSk7Ci0gICAgfSBmbl9zaV93cml0ZTsKLSAgICBzdHJ1Y3QgewotICAgICAgVUlOVCByZWdubzsKLSAgICAgIFNGICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgVUlOVCwgU0YpOwotICAgIH0gZm5fc2Zfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFVJTlQgcmVnbm87Ci0gICAgICBESSAgIHZhbHVlOwotICAgICAgdm9pZCAoKmZ1bmN0aW9uKShTSU1fQ1BVICosIFVJTlQsIERJKTsKLSAgICB9IGZuX2RpX3dyaXRlOwotICAgIHN0cnVjdCB7Ci0gICAgICBVSU5UIHJlZ25vOwotICAgICAgREYgICB2YWx1ZTsKLSAgICAgIHZvaWQgKCpmdW5jdGlvbikoU0lNX0NQVSAqLCBVSU5ULCBERik7Ci0gICAgfSBmbl9kZl93cml0ZTsKLSAgICBzdHJ1Y3QgewotICAgICAgVUlOVCByZWdubzsKLSAgICAgIFNJICAgdmFsdWVbNF07Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgVUlOVCwgU0kgKik7Ci0gICAgfSBmbl94aV93cml0ZTsKLSAgICBzdHJ1Y3QgewotICAgICAgVVNJICB2YWx1ZTsKLSAgICAgIHZvaWQgKCpmdW5jdGlvbikoU0lNX0NQVSAqLCBVU0kpOwotICAgIH0gZm5fcGNfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFFJICAgdmFsdWU7Ci0gICAgfSBtZW1fcWlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIEhJICAgdmFsdWU7Ci0gICAgfSBtZW1faGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFNJICAgdmFsdWU7Ci0gICAgfSBtZW1fc2lfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIERJICAgdmFsdWU7Ci0gICAgfSBtZW1fZGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIERGICAgdmFsdWU7Ci0gICAgfSBtZW1fZGZfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFNJICAgdmFsdWVbNF07Ci0gICAgfSBtZW1feGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFFJICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBRSSk7Ci0gICAgfSBmbl9tZW1fcWlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIEhJICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBISSk7Ci0gICAgfSBmbl9tZW1faGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFNJICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBTSSk7Ci0gICAgfSBmbl9tZW1fc2lfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIERJICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBESSk7Ci0gICAgfSBmbl9tZW1fZGlfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIERGICAgdmFsdWU7Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBERik7Ci0gICAgfSBmbl9tZW1fZGZfd3JpdGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIFNJICAgYWRkcmVzczsKLSAgICAgIFNJICAgdmFsdWVbNF07Ci0gICAgICB2b2lkICgqZnVuY3Rpb24pKFNJTV9DUFUgKiwgSUFERFIsIFNJLCBTSSAqKTsKLSAgICB9IGZuX21lbV94aV93cml0ZTsKLSAgfSBraW5kczsKLX0gQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UOwotCi0jZGVmaW5lIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVF9LSU5EKGVsZW1lbnQpICgoZWxlbWVudCktPmtpbmQpCi0jZGVmaW5lIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVF9JQUREUihlbGVtZW50KSAoKGVsZW1lbnQpLT5pbnNuX2FkZHJlc3MpCi0KLWV4dGVybiB2b2lkIGNnZW5fd3JpdGVfcXVldWVfZWxlbWVudF9leGVjdXRlICgKLSAgU0lNX0NQVSAqLCBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKgotKTsKLQotLyogSW5zdGFuY2Ugb2YgdGhlIHF1ZXVlIGZvciBwYXJhbGxlbCB3cml0ZS1hZnRlciBzdXBwb3J0LiAgKi8KLS8qIEZJWE1FOiBTaG91bGQgYmUgZHluYW1pYz8gICovCi0jZGVmaW5lIENHRU5fV1JJVEVfUVVFVUVfU0laRSAoNjQgKiA0KSAvKiA2NCB3cml0ZXMgeCA0IGluc25zIC0tIGZvciBub3cuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBpbmRleDsKLSAgQ0dFTl9XUklURV9RVUVVRV9FTEVNRU5UIHFbQ0dFTl9XUklURV9RVUVVRV9TSVpFXTsKLX0gQ0dFTl9XUklURV9RVUVVRTsKLQotI2RlZmluZSBDR0VOX1dSSVRFX1FVRVVFX0NMRUFSKHF1ZXVlKSAgICAgICAoKHF1ZXVlKS0+aW5kZXggPSAwKQotI2RlZmluZSBDR0VOX1dSSVRFX1FVRVVFX0lOREVYKHF1ZXVlKSAgICAgICAoKHF1ZXVlKS0+aW5kZXgpCi0jZGVmaW5lIENHRU5fV1JJVEVfUVVFVUVfRUxFTUVOVChxdWV1ZSwgaXgpICgmKHF1ZXVlKS0+cVsoaXgpXSkKLQotI2RlZmluZSBDR0VOX1dSSVRFX1FVRVVFX05FWFQocXVldWUpICggICBcCi0gIChxdWV1ZSktPmluZGV4IDwgQ0dFTl9XUklURV9RVUVVRV9TSVpFIFwKLSAgICA/ICYocXVldWUpLT5xWyhxdWV1ZSktPmluZGV4KytdICAgICAgXAotICAgIDogY2dlbl93cml0ZV9xdWV1ZV9vdmVyZmxvdyAocXVldWUpICBcCi0pCi0KLWV4dGVybiBDR0VOX1dSSVRFX1FVRVVFX0VMRU1FTlQgKmNnZW5fd3JpdGVfcXVldWVfb3ZlcmZsb3cgKENHRU5fV1JJVEVfUVVFVUUgKik7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgcXVldWluZyB3cml0ZXMuICBVc2VkIGJ5IHNlbWFudGljIGNvZGUuICAqLwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2JpX3dyaXRlIChTSU1fQ1BVICosIEJJICosIEJJKTsKLWV4dGVybiB2b2lkIHNpbV9xdWV1ZV9xaV93cml0ZSAoU0lNX0NQVSAqLCBVUUkgKiwgVVFJKTsKLWV4dGVybiB2b2lkIHNpbV9xdWV1ZV9zaV93cml0ZSAoU0lNX0NQVSAqLCBTSSAqLCBTSSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfc2Zfd3JpdGUgKFNJTV9DUFUgKiwgU0kgKiwgU0YpOwotCi1leHRlcm4gdm9pZCBzaW1fcXVldWVfcGNfd3JpdGUgKFNJTV9DUFUgKiwgVVNJKTsKLQotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX2hpX3dyaXRlIChTSU1fQ1BVICosIHZvaWQgKCopKFNJTV9DUFUgKiwgVUlOVCwgVUhJKSwgVUlOVCwgVUhJKTsKLWV4dGVybiB2b2lkIHNpbV9xdWV1ZV9mbl9zaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIFVJTlQsIFVTSSksIFVJTlQsIFVTSSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfZm5fc2Zfd3JpdGUgKFNJTV9DUFUgKiwgdm9pZCAoKikoU0lNX0NQVSAqLCBVSU5ULCBTRiksIFVJTlQsIFNGKTsKLWV4dGVybiB2b2lkIHNpbV9xdWV1ZV9mbl9kaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIFVJTlQsIERJKSwgVUlOVCwgREkpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX2RmX3dyaXRlIChTSU1fQ1BVICosIHZvaWQgKCopKFNJTV9DUFUgKiwgVUlOVCwgREYpLCBVSU5ULCBERik7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfZm5feGlfd3JpdGUgKFNJTV9DUFUgKiwgdm9pZCAoKikoU0lNX0NQVSAqLCBVSU5ULCBTSSAqKSwgVUlOVCwgU0kgKik7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfZm5fcGNfd3JpdGUgKFNJTV9DUFUgKiwgdm9pZCAoKikoU0lNX0NQVSAqLCBVU0kpLCBVU0kpOwotCi1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX3FpX3dyaXRlIChTSU1fQ1BVICosIFNJLCBRSSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX2hpX3dyaXRlIChTSU1fQ1BVICosIFNJLCBISSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX3NpX3dyaXRlIChTSU1fQ1BVICosIFNJLCBTSSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX2RpX3dyaXRlIChTSU1fQ1BVICosIFNJLCBESSk7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX2RmX3dyaXRlIChTSU1fQ1BVICosIFNJLCBERik7Ci1leHRlcm4gdm9pZCBzaW1fcXVldWVfbWVtX3hpX3dyaXRlIChTSU1fQ1BVICosIFNJLCBTSSAqKTsKLQotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV9xaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgUUkpLCBTSSwgUUkpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV9oaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgSEkpLCBTSSwgSEkpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV9zaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgU0kpLCBTSSwgU0kpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV9kaV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgREkpLCBTSSwgREkpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV9kZl93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgREYpLCBTSSwgREYpOwotZXh0ZXJuIHZvaWQgc2ltX3F1ZXVlX2ZuX21lbV94aV93cml0ZSAoU0lNX0NQVSAqLCB2b2lkICgqKShTSU1fQ1BVICosIElBRERSLCBTSSwgU0kgKiksIFNJLCBTSSAqKTsKLQotI2VuZGlmIC8qIENHRU5fUEFSX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1ydW4uYyBiL3NpbS9jb21tb24vY2dlbi1ydW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxYmMxYy4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tcnVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyogTWFpbiBzaW11bGF0b3IgbG9vcCBmb3IgQ0dFTi1iYXNlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gVGhlc2UgYXJlIG9sZCBub3Rlcywga2VwdCBhcm91bmQgZm9yIG5vdy4KLSAgIENvbGxlY3RpbmcgcHJvZmlsZSBkYXRhIGFuZCB0cmFjaW5nIHNsb3cgdXMgZG93biBzbyB3ZSBkb24ndCBkbyB0aGVtIGluCi0gICAiZmFzdCBtb2RlIi4KLSAgIFRoZXJlIGFyZSA2IHBvc3NpYmlsaXRpZXMgb24gMiBheGVzOgotICAgLSBuby1zY2FjaGluZywgaW5zbi1zY2FjaGluZywgYmFzaWMtYmxvY2stc2NhY2hpbmcKLSAgIC0gcnVuIHdpdGggZnVsbCBmZWF0dXJlcyBvciBydW4gZmFzdAotICAgU3VwcG9ydGluZyBhbGwgc2l4IHBvc3NpYmlsaXRpZXMgaW4gb25lIGV4ZWN1dGFibGUgaXMgYSBiaXQgbXVjaCBidXQKLSAgIHN1cHBvcnRpbmcgZnVsbC9mYXN0IHNlZW1zIHJlYXNvbmFibGUuCi0gICBJZiB0aGUgc2NhY2hlIGlzIGNvbmZpZ3VyZWQgaW4gaXQgaXMgYWx3YXlzIHVzZWQuCi0gICBJZiBwYmItc2NhY2hpbmcgaXMgY29uZmlndXJlZCBpbiBpdCBpcyBhbHdheXMgdXNlZC4KLSAgID8/PyBTb21ldGltZXMgc3VwcG9ydGluZyBtb3JlIHRoYW4gb25lIHNldCBvZiBzZW1hbnRpYyBmdW5jdGlvbnMgd2lsbCBtYWtlCi0gICB0aGUgc2ltdWxhdG9yIHRvbyBsYXJnZSAtIHRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZS4gIEJsYWggYmxhaCBibGFoLgotICAgPz8/IFN1cHBvcnRpbmcgZnVsbC9mYXN0IGNhbiBiZSBtb3JlIG1vZHVsYXIsIGJsYWggYmxhaCBibGFoLgotICAgV2hlbiB0aGUgZnJhbWV3b3JrIGlzIG1vcmUgbW9kdWxhciwgdGhpcyBjYW4gYmUuCi0qLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLSNpZm5kZWYgU0lNX0VOR0lORV9QUkVGSVhfSE9PSwotI2RlZmluZSBTSU1fRU5HSU5FX1BSRUZJWF9IT09LKHNkKQotI2VuZGlmCi0jaWZuZGVmIFNJTV9FTkdJTkVfUE9TVEZJWF9IT09LCi0jZGVmaW5lIFNJTV9FTkdJTkVfUE9TVEZJWF9IT09LKHNkKQotI2VuZGlmCi0KLXN0YXRpYyBzaW1fZXZlbnRfaGFuZGxlciBoYXNfc3RlcHBlZDsKLXN0YXRpYyB2b2lkIHByaW1lX2NwdSAoU0lNX0NQVSAqLCBpbnQpOwotc3RhdGljIHZvaWQgZW5naW5lX3J1bl8xIChTSU1fREVTQywgaW50LCBpbnQpOwotc3RhdGljIHZvaWQgZW5naW5lX3J1bl9uIChTSU1fREVTQywgaW50LCBpbnQsIGludCwgaW50KTsKLQotLyogc2ltX3Jlc3VtZSBmb3IgY2dlbiAqLwotCi12b2lkCi1zaW1fcmVzdW1lIChTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgam1wX2J1ZiBidWY7Ci0gIGludCBqbXB2YWw7Ci0KLSAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotCi0gIC8qIHdlIG9ubHkgd2FudCB0byBiZSBzaW5nbGUgc3RlcHBpbmcgdGhlIHNpbXVsYXRvciBvbmNlICovCi0gIGlmIChlbmdpbmUtPnN0ZXBwZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKHNkLCBlbmdpbmUtPnN0ZXBwZXIpOwotICAgICAgZW5naW5lLT5zdGVwcGVyID0gTlVMTDsKLSAgICB9Ci0gIGlmIChzdGVwKQotICAgIGVuZ2luZS0+c3RlcHBlciA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLCBoYXNfc3RlcHBlZCwgc2QpOwotCi0gIHNpbV9tb2R1bGVfcmVzdW1lIChzZCk7Ci0KLSNpZiBXSVRIX1NDQUNIRQotICBpZiAoVVNJTkdfU0NBQ0hFX1AgKHNkKSkKLSAgICBzY2FjaGVfZmx1c2ggKHNkKTsKLSNlbmRpZgotCi0gIC8qIHJ1bi9yZXN1bWUgdGhlIHNpbXVsYXRvciAqLwotCi0gIHNpbV9lbmdpbmVfc2V0X3J1bl9zdGF0ZSAoc2QsIHNpbV9ydW5uaW5nLCAwKTsKLQotICBlbmdpbmUtPmptcGJ1ZiA9ICZidWY7Ci0gIGptcHZhbCA9IHNldGptcCAoYnVmKTsKLSAgaWYgKGptcHZhbCA9PSBzaW1fZW5naW5lX3N0YXJ0X2ptcHZhbAotICAgICAgfHwgam1wdmFsID09IHNpbV9lbmdpbmVfcmVzdGFydF9qbXB2YWwpCi0gICAgewotICAgICAgaW50IGxhc3RfY3B1X25yID0gc2ltX2VuZ2luZV9sYXN0X2NwdV9uciAoc2QpOwotICAgICAgaW50IG5leHRfY3B1X25yID0gc2ltX2VuZ2luZV9uZXh0X2NwdV9uciAoc2QpOwotICAgICAgaW50IG5yX2NwdXMgPSBzaW1fZW5naW5lX25yX2NwdXMgKHNkKTsKLSAgICAgIC8qID8/PyBTZXR0aW5nIG1heF9pbnNucyB0byAwIGFsbG93cyBwYmIvaml0IGNvZGUgdG8gcnVuIHdpbGQgYW5kIGlzCi0JIHVzZWZ1bCBpZiBhbGwgb25lIHdhbnRzIHRvIGRvIGlzIHJ1biBhIGJlbmNobWFyay4gIE5lZWQgc29tZSBiZXR0ZXIKLQkgd2F5IHRvIGlkZW50aWZ5IHRoaXMgY2FzZS4gICovCi0gICAgICBpbnQgbWF4X2luc25zID0gKHN0ZXAKLQkJICAgICAgID8gMQotCQkgICAgICAgOiAobnJfY3B1cyA9PSAxCi0JCQkgIC8qJiYgd2lwOm5vLWV2ZW50cyovCi0JCQkgIC8qIERvbid0IGRvIHRoaXMgaWYgcnVubmluZyB1bmRlciBnZGIsIG5lZWQgdG8KLQkJCSAgICAgcG9sbCB1aSBmb3IgZXZlbnRzLiAgKi8KLQkJCSAgJiYgU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSkKLQkJICAgICAgID8gMAotCQkgICAgICAgOiA4KTsgLypGSVhNRTogbWFnaWMgbnVtYmVyKi8KLSAgICAgIGludCBmYXN0X3AgPSBTVEFURV9SVU5fRkFTVF9QIChzZCk7Ci0KLSAgICAgIHNpbV9ldmVudHNfcHJlcHJvY2VzcyAoc2QsIGxhc3RfY3B1X25yID49IG5yX2NwdXMsIG5leHRfY3B1X25yID49IG5yX2NwdXMpOwotICAgICAgaWYgKG5leHRfY3B1X25yID49IG5yX2NwdXMpCi0JbmV4dF9jcHVfbnIgPSAwOwotICAgICAgaWYgKG5yX2NwdXMgPT0gMSkKLQllbmdpbmVfcnVuXzEgKHNkLCBtYXhfaW5zbnMsIGZhc3RfcCk7Ci0gICAgICBlbHNlCi0JZW5naW5lX3J1bl9uIChzZCwgbmV4dF9jcHVfbnIsIG5yX2NwdXMsIG1heF9pbnNucywgZmFzdF9wKTsKLSAgICB9Ci0jaWYgMSAvKndpcCovCi0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBY2NvdW50IGZvciB0aGUgbGFzdCBpbnNuIGV4ZWN1dGVkLiAgKi8KLSAgICAgIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIHNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKHNkKSk7Ci0gICAgICArKyBDUFVfSU5TTl9DT1VOVCAoY3B1KTsKLSAgICAgIFRSQUNFX0lOU05fRklOSSAoY3B1LCBOVUxMLCAxKTsKLSAgICB9Ci0jZW5kaWYKLQotICBlbmdpbmUtPmptcGJ1ZiA9IE5VTEw7Ci0KLSAgewotICAgIGludCBpOwotICAgIGludCBucl9jcHVzID0gc2ltX2VuZ2luZV9ucl9jcHVzIChzZCk7Ci0KLSNpZiAwIC8qd2lwLGlnbm9yZSovCi0gICAgLyogSWYgdGhlIGxvb3AgZXhpdHMsIGVpdGhlciB3ZSBzaW5nbGUtc3RlcHBlZCBvciBAY3B1QF9lbmdpbmVfc3RvcAotICAgICAgIHdhcyBjYWxsZWQuICAqLwotICAgIGlmIChzdGVwKQotICAgICAgc2ltX2VuZ2luZV9zZXRfcnVuX3N0YXRlIChzZCwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKLSAgICBlbHNlCi0gICAgICBzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKHNkLCBwZW5kaW5nX3JlYXNvbiwgcGVuZGluZ19zaWdyYyk7Ci0jZW5kaWYKLQotICAgIGZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyArK2kpCi0gICAgICB7Ci0JU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgaSk7Ci0KLQlQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpICs9IENQVV9JTlNOX0NPVU5UIChjcHUpOwotICAgICAgfQotICB9Ci0KLSAgc2ltX21vZHVsZV9zdXNwZW5kIChzZCk7Ci19Ci0KLS8qIEhhbHQgdGhlIHNpbXVsYXRvciBhZnRlciBqdXN0IG9uZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1oYXNfc3RlcHBlZCAoU0lNX0RFU0Mgc2QsIHZvaWQgKmRhdGEpCi17Ci0gIEFTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgc2ltX2VuZ2luZV9oYWx0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHVFJBUCk7Ci19Ci0KLS8qIFByZXBhcmUgYSBjcHUgZm9yIHJ1bm5pbmcuCi0gICBNQVhfSU5TTlMgaXMgdGhlIG51bWJlciBvZiBpbnNucyB0byBleGVjdXRlIHBlciB0aW1lIHNsaWNlLgotICAgSWYgMCBpdCBtZWFucyB0aGUgY3B1IGNhbiBydW4gYXMgbG9uZyBhcyBpdCB3YW50cyAoZS5nLiB1bnRpbCB0aGUKLSAgIHByb2dyYW0gY29tcGxldGVzKS4KLSAgID8/PyBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGFuIGFyZ3VtZW50IHRvIHRoZSBlbmdpbmVfZm4uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbWVfY3B1IChTSU1fQ1BVICpjcHUsIGludCBtYXhfaW5zbnMpCi17Ci0gIENQVV9NQVhfU0xJQ0VfSU5TTlMgKGNwdSkgPSBtYXhfaW5zbnM7Ci0gIENQVV9JTlNOX0NPVU5UIChjcHUpID0gMDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBpbnNuIGRlc2NyaXB0b3IgdGFibGUuCi0gICAgIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uIHNvIHdlIGp1c3QgZGVmZXIgaXQgdG8KLSAgICAgaGVyZS4gICovCi0KLSAgaWYgKE1BQ0hfUFJFUEFSRV9SVU4gKENQVV9NQUNIIChjcHUpKSkKLSAgICAoKiBNQUNIX1BSRVBBUkVfUlVOIChDUFVfTUFDSCAoY3B1KSkpIChjcHUpOwotfQotCi0vKiBNYWluIGxvb3AsIGZvciAxIGNwdS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbmdpbmVfcnVuXzEgKFNJTV9ERVNDIHNkLCBpbnQgbWF4X2luc25zLCBpbnQgZmFzdF9wKQotewotICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLSAgRU5HSU5FX0ZOICpmbiA9IGZhc3RfcCA/IENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA6IENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KTsKLQotICBwcmltZV9jcHUgKGNwdSwgbWF4X2luc25zKTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBTSU1fRU5HSU5FX1BSRUZJWF9IT09LIChzZCk7Ci0KLSAgICAgICgqZm4pIChjcHUpOwotCi0gICAgICBTSU1fRU5HSU5FX1BPU1RGSVhfSE9PSyAoc2QpOwotCi0gICAgICAvKiBwcm9jZXNzIGFueSBldmVudHMgKi8KLSAgICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSkKLQlzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKLSAgICB9Ci19Ci0KLS8qIE1haW4gbG9vcCwgZm9yIG11bHRpcGxlIGNwdXMuICAqLwotCi1zdGF0aWMgdm9pZAotZW5naW5lX3J1bl9uIChTSU1fREVTQyBzZCwgaW50IG5leHRfY3B1X25yLCBpbnQgbnJfY3B1cywgaW50IG1heF9pbnNucywgaW50IGZhc3RfcCkKLXsKLSAgaW50IGk7Ci0gIEVOR0lORV9GTiAqZW5naW5lX2Zuc1tNQVhfTlJfUFJPQ0VTU09SU107Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7ICsraSkKLSAgICB7Ci0gICAgICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKLQotICAgICAgZW5naW5lX2Zuc1tpXSA9IGZhc3RfcCA/IENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA6IENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KTsKLSAgICAgIHByaW1lX2NwdSAoY3B1LCBtYXhfaW5zbnMpOwotICAgIH0KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBTSU1fRU5HSU5FX1BSRUZJWF9IT09LIChzZCk7Ci0KLSAgICAgIC8qIEZJWE1FOiBwcm9wZXIgY3ljbGluZyBvZiBhbGwgb2YgdGhlbSwgYmxhaCBibGFoIGJsYWguICAqLwotICAgICAgd2hpbGUgKG5leHRfY3B1X25yICE9IG5yX2NwdXMpCi0JewotCSAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgbmV4dF9jcHVfbnIpOwotCi0JICAoKiBlbmdpbmVfZm5zW25leHRfY3B1X25yXSkgKGNwdSk7Ci0JICArK25leHRfY3B1X25yOwotCX0KLQotICAgICAgU0lNX0VOR0lORV9QT1NURklYX0hPT0sgKHNkKTsKLQotICAgICAgLyogcHJvY2VzcyBhbnkgZXZlbnRzICovCi0gICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCi0Jc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5jIGIvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBhZmM4Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi1zY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKiBTaW11bGF0b3IgY2FjaGUgcm91dGluZXMgZm9yIENHRU4gc2ltdWxhdG9ycyAoYW5kIG1heWJlIG90aGVycykuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFNDQUNIRV9ERUZJTkVfSU5MSU5FCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0KLSNkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVW51c2VkIGFkZHJlc3MuICAqLwotI2RlZmluZSBVTlVTRURfQUREUiAweGZmZmZmZmZmCi0KLS8qIFNjYWNoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCi0gICA/Pz8gRXhwZXJpbWVudHMgdG8gZGV0ZXJtaW5lIHJlYXNvbmFibGUgdmFsdWVzIGlzIHdpcC4KLSAgIFRoZXNlIGFyZSBqdXN0IGd1ZXNzZXMuICAqLwotCi0vKiBEZWZhdWx0IG51bWJlciBvZiBzY2FjaGUgZWxlbWVudHMuCi0gICBUaGUgc2l6ZSBvZiBhbiBlbGVtZW50IGlzIHR5cGljYWxseSAzMi02NCBieXRlcywgc28gdGhlIHNpemUgb2YgdGhlCi0gICBkZWZhdWx0IHNjYWNoZSB3aWxsIGJlIGJldHdlZW4gNTEySyBhbmQgMU0gYnl0ZXMuICAqLwotI2lmZGVmIENPTkZJR19TSU1fQ0FDSEVfU0laRQotI2RlZmluZSBTQ0FDSEVfREVGQVVMVF9DQUNIRV9TSVpFIENPTkZJR19TSU1fQ0FDSEVfU0laRQotI2Vsc2UKLSNkZWZpbmUgU0NBQ0hFX0RFRkFVTFRfQ0FDSEVfU0laRSAxNjM4NAotI2VuZGlmCi0KLS8qIE1pbmltdW0gY2FjaGUgc2l6ZS4KLSAgIFRoZSBtMzJyIHBvcnQgYXNzdW1lcyBhIGNhY2hlIHNpemUgb2YgYXQgbGVhc3QgMiBzbyBpdCBjYW4gZGVjb2RlIGJvdGggMTYKLSAgIGJpdCBpbnNucy4gIFdoZW4gY29tcGlsaW5nIHdlIG5lZWQgYW4gZXh0cmEgZm9yIHRoZSBjaGFpbiBlbnRyeS4gIEFuZCB0aGlzCi0gICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4gIEhlbmNlIDQgaXMgdGhlIG1pbmltdW0gKHRob3VnaCwgZm9yIHRob3NlIHdpdGgKLSAgIGZlYXR1cml0aXMgb3IgaXRjaHkgcGVkYW50aWMgYml0cywgd2UgY291bGQgbWFrZSB0aGlzIGNvbmRpdGlvbmFsIG9uCi0gICBXSVRIX1NDQUNIRV9QQkIpLiAgKi8KLSNkZWZpbmUgTUlOX1NDQUNIRV9TSVpFIDQKLQotLyogUmF0aW8gb2Ygc2l6ZSBvZiB0ZXh0IHNlY3Rpb24gdG8gc2l6ZSBvZiBzY2FjaGUuCi0gICBXaGVuIGNvbXBpbGluZywgd2UgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgc2NhY2hlIG1vcmUgdGhhbiB3ZSBoYXZlIHRvCi0gICBidXQgd2UgYWxzbyBkb24ndCB3YW50IGl0IHRvIGJlIGV4b3JiaXRhbnRseShzcD8pIGxhcmdlLiAgU28gd2UgcGljayBhIGhpZ2gKLSAgIGRlZmF1bHQgdmFsdWUsIHRoZW4gcmVkdWNlIGl0IGJ5IHRoZSBzaXplIG9mIHRoZSBwcm9ncmFtIGJlaW5nIHNpbXVsYXRlZCwKLSAgIGJ1dCB3ZSBkb24ndCBvdmVycmlkZSBhbnkgdmFsdWUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBzaXplIHRvIHVzZSBpcyBjb21wdXRlZCBhcwotICAgbWF4IChNSU5fU0NBQ0hFX1NJWkUsCi0gICAgICAgIG1pbiAoREVGQVVMVF9TQ0FDSEVfU0laRSwKLSAgICAgICAgICAgICB0ZXh0X3NpemUgLyAoYmFzZV9pbnNuX3NpemUgKiBJTlNOX1NDQUNIRV9SQVRJTykpKS4gICovCi0vKiA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLSNkZWZpbmUgSU5TTl9TQ0FDSEVfUkFUSU8gNAotCi0vKiBEZWZhdWx0IG1heGltdW0gaW5zbiBjaGFpbiBsZW5ndGguCi0gICBUaGUgb25seSByZWFzb24gZm9yIGEgbWF4aW11bSBpcyBzbyB3ZSBjYW4gcGxhY2UgYSBtYXhpbXVtIHNpemUgb24gdGhlCi0gICBwcm9maWxpbmcgdGFibGUuICBDaGFpbiBsZW5ndGhzIGFyZSBkZXRlcm1pbmVkIGJ5IGN0aSdzLgotICAgMzIgaXMgYSBtb3JlIHJlYXNvbmFibGUgbnVtYmVyLCBidXQgd2hlbiBwcm9maWxpbmcsIHRoZSBiZWZvcmUvYWZ0ZXIKLSAgIGhhbmRsZXJzIHRha2UgdXAgdGhhdCBtdWNoIG1vcmUgc3BhY2UuICBUaGUgc2NhY2hlIGlzIGZpbGxlZCBmcm9tIGZyb250IHRvCi0gICBiYWNrIHNvIGFsbCB0aGlzIGRldGVybWluZXMgaXMgd2hlbiB0aGUgc2NhY2hlIG5lZWRzIHRvIGJlIGZsdXNoZWQuICAqLwotI2RlZmluZSBNQVhfQ0hBSU5fTEVOR1RIIDY0Ci0KLS8qIERlZmF1bHQgbWF4aW11bSBoYXNoIGxpc3QgbGVuZ3RoLiAgKi8KLSNkZWZpbmUgTUFYX0hBU0hfQ0hBSU5fTEVOR1RIIDQKLQotLyogTWluaW11bSBoYXNoIHRhYmxlIHNpemUuICAqLwotI2RlZmluZSBNSU5fSEFTSF9DSEFJTlMgMzIKLQotLyogUmF0aW8gb2YgbnVtYmVyIG9mIHNjYWNoZSBlbGVtZW50cyB0byBudW1iZXIgb2YgaGFzaCBsaXN0cy4KLSAgIFNpbmNlIHRoZSB1c2VyIGNhbiBvbmx5IHNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIHNjYWNoZSwgd2UgY29tcHV0ZSB0aGUKLSAgIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgYXMKLSAgIG1heCAoTUlOX0hBU0hfQ0hBSU5TLCBzY2FjaGVfc2l6ZSAvIFNDQUNIRV9IQVNIX1JBVElPKS4gICovCi0jZGVmaW5lIFNDQUNIRV9IQVNIX1JBVElPIDgKLQotLyogSGFzaCBhIFBDIHZhbHVlLgotICAgRklYTUU6IE1heSB3aXNoIHRvIG1ha2UgdGhlIGhhc2hpbmcgYXJjaGl0ZWN0dXJlIHNwZWNpZmljLgotICAgRklYTUU6IHJldmlzaXQgKi8KLSNkZWZpbmUgSEFTSF9QQyhwYykgKCgocGMpID4+IDIpICsgKChwYykgPj4gNSkpCi0KLXN0YXRpYyBNT0RVTEVfSU5JVF9GTiBzY2FjaGVfaW5pdDsKLXN0YXRpYyBNT0RVTEVfVU5JTlNUQUxMX0ZOIHNjYWNoZV91bmluc3RhbGw7Ci0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChzY2FjaGVfb3B0aW9uX2hhbmRsZXIpOwotCi0jZGVmaW5lIE9QVElPTl9QUk9GSUxFX1NDQUNIRQkoT1BUSU9OX1NUQVJUICsgMCkKLQotc3RhdGljIGNvbnN0IE9QVElPTiBzY2FjaGVfb3B0aW9uc1tdID0gewotICB7IHsic2NhY2hlLXNpemUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgICAgICdjJywgIltTSVpFXSIsICJTcGVjaWZ5IHNpemUgb2Ygc2ltdWxhdG9yIGV4ZWN1dGlvbiBjYWNoZSIsCi0gICAgICBzY2FjaGVfb3B0aW9uX2hhbmRsZXIgfSwKLSNpZiBXSVRIX1NDQUNIRV9QQkIKLSAgLyogPz8/IEl0IG1pZ2h0IGJlIG5pY2UgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgaGFzaAotICAgICB0YWJsZSwgdGhlIG1heGltdW0gaGFzaCBsaXN0IGxlbmd0aCwgYW5kIHRoZSBtYXhpbXVtIGNoYWluIGxlbmd0aCwgYnV0Ci0gICAgIGZvciBub3cgdGhhdCBtaWdodCBiZSBtb3JlIGFraW4gdG8gZmVhdHVyaXRpcy4gICovCi0jZW5kaWYKLSAgeyB7InByb2ZpbGUtc2NhY2hlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX1NDQUNIRX0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gc2ltdWxhdG9yIGV4ZWN1dGlvbiBjYWNoZSBwcm9maWxpbmciLAotICAgICAgc2NhY2hlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgU0lNX1JDCi1zY2FjaGVfb3B0aW9uX2hhbmRsZXIgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGludCBvcHQsCi0JCSAgICAgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQotewotICBpbnQgbjsKLQotICBzd2l0Y2ggKG9wdCkKLSAgICB7Ci0gICAgY2FzZSAnYycgOgotICAgICAgaWYgKFdJVEhfU0NBQ0hFKQotCXsKLQkgIGlmIChhcmcgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBuID0gc3RydG9sIChhcmcsIE5VTEwsIDApOwotCSAgICAgIGlmIChuIDwgTUlOX1NDQUNIRV9TSVpFKQotCQl7Ci0JCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiaW52YWxpZCBzY2FjaGUgc2l6ZSBgJWQnLCBtdXN0IGJlIGF0IGxlYXN0IDQiLCBuKTsKLQkJICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JCX0KLQkgICAgICAvKiBFbnN1cmUgaXQncyBhIG11bHRpcGxlIG9mIDIuICAqLwotCSAgICAgIGlmICgobiAmIChuIC0gMSkpICE9IDApCi0JCXsKLQkJICBzaW1faW9fZXByaW50ZiAoc2QsICJzY2FjaGUgc2l6ZSBgJWQnIG5vdCBhIG11bHRpcGxlIG9mIDJcbiIsIG4pOwotCQkgIHsKLQkJICAgIC8qIHJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMiAqLwotCQkgICAgaW50IGk7Ci0JCSAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSA8PD0gMSkKLQkJICAgICAgY29udGludWU7Ci0JCSAgICBuID0gaTsKLQkJICB9Ci0JCSAgc2ltX2lvX2VwcmludGYgKHNkLCAicm91bmRpbmcgc2NhY2hlIHNpemUgdXAgdG8gJWRcbiIsIG4pOwotCQl9Ci0JICAgICAgaWYgKGNwdSA9PSBOVUxMKQotCQlTVEFURV9TQ0FDSEVfU0laRSAoc2QpID0gbjsKLQkgICAgICBlbHNlCi0JCUNQVV9TQ0FDSEVfU0laRSAoY3B1KSA9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjcHUgPT0gTlVMTCkKLQkJU1RBVEVfU0NBQ0hFX1NJWkUgKHNkKSA9IFNDQUNIRV9ERUZBVUxUX0NBQ0hFX1NJWkU7Ci0JICAgICAgZWxzZQotCQlDUFVfU0NBQ0hFX1NJWkUgKGNwdSkgPSBTQ0FDSEVfREVGQVVMVF9DQUNIRV9TSVpFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgbm90IGVuYWJsZWQsIGAtLXNjYWNoZS1zaXplJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9TQ0FDSEUgOgotICAgICAgaWYgKFdJVEhfU0NBQ0hFICYmIFdJVEhfUFJPRklMRV9TQ0FDSEVfUCkKLQl7Ci0JICAvKiBGSVhNRTogaGFuZGxlIGNwdSAhPSBOVUxMLiAgKi8KLQkgIHJldHVybiBzaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChzZCwgIi1zY2FjaGUiLCBQUk9GSUxFX1NDQUNIRV9JRFgsCi0JCQkJCSBhcmcpOwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJTaW11bGF0b3IgY2FjaGUgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1zY2FjaGUnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2NhY2hlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHNjYWNoZV9vcHRpb25zKTsKLSAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIHNjYWNoZV9pbml0KTsKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgc2NhY2hlX3VuaW5zdGFsbCk7Ci0KLSAgLyogVGhpcyBpcyB0aGUgZGVmYXVsdCwgaXQgbWF5IGJlIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIFNUQVRFX1NDQUNIRV9TSVpFIChzZCkgPSBXSVRIX1NDQUNIRTsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1zdGF0aWMgU0lNX1JDCi1zY2FjaGVfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIGludCBjOwotCi0gIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQotICAgIHsKLSAgICAgIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGMpOwotICAgICAgaW50IGVsbV9zaXplID0gSU1QX1BST1BTX1NDQUNIRV9FTE1fU0laRSAoTUFDSF9JTVBfUFJPUFMgKENQVV9NQUNIIChjcHUpKSk7Ci0KLSAgICAgIC8qIGVsbV9zaXplIGlzIDAgaWYgdGhlIGNwdSBkb2Vzbid0IG5vdCBoYXZlIHNjYWNoZSBzdXBwb3J0ICovCi0gICAgICBpZiAoZWxtX3NpemUgPT0gMCkKLQl7Ci0JICBDUFVfU0NBQ0hFX1NJWkUgKGNwdSkgPSAwOwotCSAgQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChDUFVfU0NBQ0hFX1NJWkUgKGNwdSkgPT0gMCkKLQkgICAgQ1BVX1NDQUNIRV9TSVpFIChjcHUpID0gU1RBVEVfU0NBQ0hFX1NJWkUgKHNkKTsKLQkgIENQVV9TQ0FDSEVfQ0FDSEUgKGNwdSkgPQotCSAgICAoU0NBQ0hFICopIHhtYWxsb2MgKENQVV9TQ0FDSEVfU0laRSAoY3B1KSAqIGVsbV9zaXplKTsKLSNpZiBXSVRIX1NDQUNIRV9QQkIKLQkgIENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KSA9IE1BWF9DSEFJTl9MRU5HVEg7Ci0JICBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSkgPSBNQVhfSEFTSF9DSEFJTl9MRU5HVEg7Ci0JICBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOUyAoY3B1KSA9IE1BWCAoTUlOX0hBU0hfQ0hBSU5TLAotCQkJCQkJICBDUFVfU0NBQ0hFX1NJWkUgKGNwdSkKLQkJCQkJCSAgLyBTQ0FDSEVfSEFTSF9SQVRJTyk7Ci0JICBDUFVfU0NBQ0hFX0hBU0hfVEFCTEUgKGNwdSkgPQotCSAgICAoU0NBQ0hFX01BUCAqKSB4bWFsbG9jIChDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOUyAoY3B1KQotCQkJCSAgICAqIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5fRU5UUklFUyAoY3B1KQotCQkJCSAgICAqIHNpemVvZiAoU0NBQ0hFX01BUCkpOwotCSAgQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGNwdSkgPSAoU0NBQ0hFICopIHphbGxvYyAoZWxtX3NpemUpOwotCSAgQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTIChjcHUpID0KLQkgICAgKHVuc2lnbmVkIGxvbmcgKikgemFsbG9jICgoQ1BVX1NDQUNIRV9NQVhfQ0hBSU5fTEVOR1RIIChjcHUpICsgMSkKLQkJCQkgICAgICAqIHNpemVvZiAobG9uZykpOwotI2VuZGlmCi0JfQotICAgIH0KLQotICBzY2FjaGVfZmx1c2ggKHNkKTsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1zdGF0aWMgdm9pZAotc2NhY2hlX3VuaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCi17Ci0gIGludCBjOwotCi0gIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQotICAgIHsKLSAgICAgIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGMpOwotCi0gICAgICBpZiAoQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSAhPSBOVUxMKQotCWZyZWUgKENQVV9TQ0FDSEVfQ0FDSEUgKGNwdSkpOwotI2lmIFdJVEhfU0NBQ0hFX1BCQgotICAgICAgaWYgKENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSAhPSBOVUxMKQotCWZyZWUgKENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSk7Ci0gICAgICBpZiAoQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGNwdSkgIT0gTlVMTCkKLQlmcmVlIChDUFVfU0NBQ0hFX1BCQl9CRUdJTiAoY3B1KSk7Ci0gICAgICBpZiAoQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTIChjcHUpICE9IE5VTEwpCi0JZnJlZSAoQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTIChjcHUpKTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZAotc2NhY2hlX2ZsdXNoIChTSU1fREVTQyBzZCkKLXsKLSAgaW50IGM7Ci0KLSAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCi0gICAgewotICAgICAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7Ci0gICAgICBzY2FjaGVfZmx1c2hfY3B1IChjcHUpOwotICAgIH0KLX0KLQotdm9pZAotc2NhY2hlX2ZsdXNoX2NwdSAoU0lNX0NQVSAqY3B1KQotewotICBpbnQgaSxuOwotCi0gIC8qIERvbid0IGJvdGhlciBpZiBjYWNoZSBub3QgaW4gdXNlLiAgKi8KLSAgaWYgKENQVV9TQ0FDSEVfU0laRSAoY3B1KSA9PSAwKQotICAgIHJldHVybjsKLQotI2lmIFdJVEhfU0NBQ0hFX1BCQgotICAvKiBJdCdzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgcmVhc29uYWJseSBmYXN0IGFzIHRoaXMgY2FuIGJlIGRvbmUgd2hlbgotICAgICB0aGUgc2ltdWxhdGlvbiBpcyBydW5uaW5nLiAgKi8KLSAgQ1BVX1NDQUNIRV9ORVhUX0ZSRUUgKGNwdSkgPSBDUFVfU0NBQ0hFX0NBQ0hFIChjcHUpOwotICBuID0gQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTlMgKGNwdSkgKiBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSk7Ci0gIC8qID8/PyBNaWdodCBiZSBmYXN0ZXIgdG8ganVzdCBzZXQgdGhlIGZpcnN0IGVudHJ5LCB0aGVuIHVwZGF0ZSB0aGUKLSAgICAgImxhc3QgZW50cnkiIG1hcmtlciBkdXJpbmcgYWxsb2NhdGlvbi4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0gICAgQ1BVX1NDQUNIRV9IQVNIX1RBQkxFIChjcHUpIFtpXSAuIHBjID0gVU5VU0VEX0FERFI7Ci0jZWxzZQotICB7Ci0gICAgaW50IGVsbV9zaXplID0gSU1QX1BST1BTX1NDQUNIRV9FTE1fU0laRSAoTUFDSF9JTVBfUFJPUFMgKENQVV9NQUNIIChjcHUpKSk7Ci0gICAgU0NBQ0hFICpzYzsKLQotICAgIC8qIFRlY2huaWNhbGx5LCB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBidXQgaXQgaGVscHMgZGVidWdnaW5nLiAgKi8KLSAgICBtZW1zZXQgKENQVV9TQ0FDSEVfQ0FDSEUgKGNwdSksIDAsCi0JICAgIENQVV9TQ0FDSEVfU0laRSAoY3B1KSAqIGVsbV9zaXplKTsKLQotICAgIGZvciAoaSA9IDAsIHNjID0gQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KTsgaSA8IENQVV9TQ0FDSEVfU0laRSAoY3B1KTsKLQkgKytpLCBzYyA9IChTQ0FDSEUgKikgKChjaGFyICopIHNjICsgZWxtX3NpemUpKQotICAgICAgewotCXNjLT5hcmdidWYuYWRkciA9IFVOVVNFRF9BRERSOwotICAgICAgfQotICB9Ci0jZW5kaWYKLX0KLQotI2lmIFdJVEhfU0NBQ0hFX1BCQgotCi0vKiBMb29rIHVwIFBDIGluIHRoZSBoYXNoIHRhYmxlIG9mIHNjYWNoZSBlbnRyeSBwb2ludHMuCi0gICBSZXR1cm5zIHRoZSBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLVNDQUNIRSAqCi1zY2FjaGVfbG9va3VwIChTSU1fQ1BVICpjcHUsIElBRERSIHBjKQotewotICAvKiBGSVhNRTogaGFzaCBjb21wdXRhdGlvbiBpcyB3cm9uZywgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudAotICAgICBOVU1fSEFTSF9DSEFJTl9FTlRSSUVTLiAgQSBsb3Qgb2YgdGhlIGhhc2ggdGFibGUgd2lsbCBiZSB1bnVzZWQhICAqLwotICB1bnNpZ25lZCBpbnQgc2xvdCA9IEhBU0hfUEMgKHBjKSAmIChDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOUyAoY3B1KSAtIDEpOwotICBpbnQgaSwgbWF4X2kgPSBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSk7Ci0gIFNDQUNIRV9NQVAgKnNjbTsKLQotICAvKiBXZSBkb24ndCB1cGRhdGUgaGl0L21pc3Mgc3RhdGlzdGljcyBhcyB0aGlzIGlzIG9ubHkgdXNlZCB3aGVuIHJlY29yZGluZwotICAgICBicmFuY2ggdGFyZ2V0IGFkZHJlc3Nlcy4gICovCi0KLSAgc2NtID0gJiBDUFVfU0NBQ0hFX0hBU0hfVEFCTEUgKGNwdSkgW3Nsb3RdOwotICBmb3IgKGkgPSAwOyBpIDwgbWF4X2kgJiYgc2NtLT5wYyAhPSBVTlVTRURfQUREUjsgKytpLCArK3NjbSkKLSAgICB7Ci0gICAgICBpZiAoc2NtLT5wYyA9PSBwYykKLQlyZXR1cm4gc2NtLT5zYzsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBMb29rIHVwIFBDIGFuZCBpZiBub3QgZm91bmQgY3JlYXRlIGFuIGVudHJ5IGZvciBpdC4KLSAgIElmIGZvdW5kIHRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBTQ0FDSEUgZW50cnkuCi0gICBJZiBub3QgZm91bmQgdGhlIHJlc3VsdCBpcyBOVUxMLCBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBidWZmZXIgb2YgYXQgbGVhc3QKLSAgIE4gZW50cmllcyBpcyBzdG9yZWQgaW4gQlVGUC4KLSAgIEl0J3MgZG9uZSB0aGlzIHdheSBzbyB0aGUgY2FsbGVyIGNhbiBzdGlsbCBkaXN0aW5ndWlzaCBmb3VuZC9ub3QtZm91bmQuCi0gICBJZiB0aGUgdGFibGUgaXMgZnVsbCwgaXQgaXMgZW1wdGllZCB0byBtYWtlIHJvb20uCi0gICBJZiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBoYXNoIGxpc3QgaXMgcmVhY2hlZCBhIHJhbmRvbSBlbnRyeSBpcyB0aHJvd24gb3V0Ci0gICB0byBtYWtlIHJvb20uCi0gICA/Pz8gT25lIG1pZ2h0IHdhbnQgdG8gdHJ5IHRvIG1ha2UgdGhpcyBzbWFydGVyLCBidXQgbGV0J3Mgc2VlIHNvbWUKLSAgIG1lYXN1cmFibGUgYmVuZWZpdCBmaXJzdC4gICovCi0KLVNDQUNIRSAqCi1zY2FjaGVfbG9va3VwX29yX2FsbG9jIChTSU1fQ1BVICpjcHUsIElBRERSIHBjLCBpbnQgbiwgU0NBQ0hFICoqYnVmcCkKLXsKLSAgLyogRklYTUU6IGhhc2ggY29tcHV0YXRpb24gaXMgd3JvbmcsIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQKLSAgICAgTlVNX0hBU0hfQ0hBSU5fRU5UUklFUy4gIEEgbG90IG9mIHRoZSBoYXNoIHRhYmxlIHdpbGwgYmUgdW51c2VkISAgKi8KLSAgdW5zaWduZWQgaW50IHNsb3QgPSBIQVNIX1BDIChwYykgJiAoQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTlMgKGNwdSkgLSAxKTsKLSAgaW50IGksIG1heF9pID0gQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTl9FTlRSSUVTIChjcHUpOwotICBTQ0FDSEVfTUFQICpzY207Ci0gIFNDQUNIRSAqc2M7Ci0KLSAgc2NtID0gJiBDUFVfU0NBQ0hFX0hBU0hfVEFCTEUgKGNwdSkgW3Nsb3RdOwotICBmb3IgKGkgPSAwOyBpIDwgbWF4X2kgJiYgc2NtLT5wYyAhPSBVTlVTRURfQUREUjsgKytpLCArK3NjbSkKLSAgICB7Ci0gICAgICBpZiAoc2NtLT5wYyA9PSBwYykKLQl7Ci0JICBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQgKGNwdSk7Ci0JICByZXR1cm4gc2NtLT5zYzsKLQl9Ci0gICAgfQotICBQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTIChjcHUpOwotCi0gIC8qIFRoZSBhZGRyZXNzIHdlIHdhbnQgaXNuJ3QgY2FjaGVkLiAgQnVtbWVyLgotICAgICBJZiB0aGUgaGFzaCBjaGFpbiB3ZSBoYXZlIGZvciB0aGlzIGFkZHJlc3MgaXMgZnVsbCwgdGhyb3cgb3V0IGFuIGVudHJ5Ci0gICAgIHRvIG1ha2Ugcm9vbS4gICovCi0KLSAgaWYgKGkgPT0gbWF4X2kpCi0gICAgewotICAgICAgLyogUmF0aGVyIHRoYW4gZG8gc29tZXRoaW5nIHNvcGhpc3RpY2F0ZWQgbGlrZSBMUlUsIHdlIGp1c3QgdGhyb3cgb3V0Ci0JIGEgc2VtaS1yYW5kb20gZW50cnkuICBMZXQgc29tZW9uZSBlbHNlIGhhdmUgdGhlIGpveSBvZiBzYXlpbmcgaG93Ci0JIHdyb25nIHRoaXMgaXMuICBORVhUX0ZSRUUgaXMgdGhlIGVudHJ5IHRvIHRocm93IG91dCBhbmQgY3ljbGVzCi0JIHRocm91Z2ggYWxsIHBvc3NpYmlsaXRpZXMuICAqLwotICAgICAgc3RhdGljIGludCBuZXh0X2ZyZWUgPSAwOwotCi0gICAgICBzY20gPSAmIENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSBbc2xvdF07Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzZWVtcyByYXRoZXIgY2x1bXN5LiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuZXh0X2ZyZWU7ICsraSwgKytzY20pCi0JY29udGludWU7Ci0gICAgICArK25leHRfZnJlZTsKLSAgICAgIGlmIChuZXh0X2ZyZWUgPT0gQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTl9FTlRSSUVTIChjcHUpKQotCW5leHRfZnJlZSA9IDA7Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQgU0NNIHBvaW50cyB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byB1c2UuCi0gICAgIE5vdyBtYWtlIHN1cmUgdGhlcmUncyByb29tIGluIHRoZSBjYWNoZS4gICovCi0gIC8qIEZJWE1FOiBLaW5kYSB3ZWlyZCB0byB1c2UgYSBuZXh0X2ZyZWUgYWRqdXN0ZWQgc2NtIHdoZW4gY2FjaGUgaXMKLSAgICAgZmx1c2hlZC4gICovCi0KLSAgewotICAgIGludCBlbG1fc2l6ZSA9IElNUF9QUk9QU19TQ0FDSEVfRUxNX1NJWkUgKE1BQ0hfSU1QX1BST1BTIChDUFVfTUFDSCAoY3B1KSkpOwotICAgIGludCBlbG1zX3VzZWQgPSAoKChjaGFyICopIENQVV9TQ0FDSEVfTkVYVF9GUkVFIChjcHUpCi0JCSAgICAgIC0gKGNoYXIgKikgQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSkKLQkJICAgICAvIGVsbV9zaXplKTsKLSAgICBpbnQgZWxtc19sZWZ0ID0gQ1BVX1NDQUNIRV9TSVpFIChjcHUpIC0gZWxtc191c2VkOwotCi0gICAgaWYgKGVsbXNfbGVmdCA8IG4pCi0gICAgICB7Ci0JUFJPRklMRV9DT1VOVF9TQ0FDSEVfRlVMTF9GTFVTSCAoY3B1KTsKLQlzY2FjaGVfZmx1c2hfY3B1IChjcHUpOwotICAgICAgfQotICB9Ci0KLSAgc2MgPSBDUFVfU0NBQ0hFX05FWFRfRlJFRSAoY3B1KTsKLSAgc2NtLT5wYyA9IHBjOwotICBzY20tPnNjID0gc2M7Ci0KLSAgKmJ1ZnAgPSBzYzsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZiAvKiBXSVRIX1NDQUNIRV9QQkIgKi8KLQotLyogUHJpbnQgY2FjaGUgYWNjZXNzIHN0YXRpY3MgZm9yIENQVS4gICovCi0KLXZvaWQKLXNjYWNoZV9wcmludF9wcm9maWxlIChTSU1fQ1BVICpjcHUsIGludCB2ZXJib3NlKQotewotICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKLSAgdW5zaWduZWQgbG9uZyBoaXRzID0gQ1BVX1NDQUNIRV9ISVRTIChjcHUpOwotICB1bnNpZ25lZCBsb25nIG1pc3NlcyA9IENQVV9TQ0FDSEVfTUlTU0VTIChjcHUpOwotICBjaGFyIGJ1ZlsyMF07Ci0gIHVuc2lnbmVkIGxvbmcgbWF4X3ZhbDsKLSAgdW5zaWduZWQgbG9uZyAqbGVuZ3RoczsKLSAgaW50IGk7Ci0KLSAgaWYgKENQVV9TQ0FDSEVfU0laRSAoY3B1KSA9PSAwKQotICAgIHJldHVybjsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIlNpbXVsYXRvciBDYWNoZSBTdGF0aXN0aWNzXG5cbiIpOwotCi0gIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgQ2FjaGUgc2l6ZTogJXNcbiIsCi0JCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfU0laRSAoY3B1KSkpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgSGl0czogICAgICAgJXNcbiIsCi0JCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIGhpdHMpKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIE1pc3NlczogICAgICVzXG4iLAotCQkgc2ltX2FkZF9jb21tYXMgKGJ1Ziwgc2l6ZW9mIChidWYpLCBtaXNzZXMpKTsKLSAgaWYgKGhpdHMgKyBtaXNzZXMgIT0gMCkKLSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgSGl0IHJhdGU6ICAgJS4yZiUlXG4iLAotCQkgICAoKGRvdWJsZSkgaGl0cyAvICgoZG91YmxlKSBoaXRzICsgKGRvdWJsZSkgbWlzc2VzKSkgKiAxMDApOwotCi0jaWYgV0lUSF9TQ0FDSEVfUEJCCi0gIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIEhhc2ggdGFibGUgc2l6ZTogICAgICAgJXNcbiIsCi0JCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TIChjcHUpKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICBNYXggaGFzaCBsaXN0IGxlbmd0aDogICVzXG4iLAotCQkgc2ltX2FkZF9jb21tYXMgKGJ1Ziwgc2l6ZW9mIChidWYpLCBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSkpKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIE1heCBpbnNuIGNoYWluIGxlbmd0aDogJXNcbiIsCi0JCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KSkpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgQ2FjaGUgZnVsbCBmbHVzaGVzOiAgICAlc1xuIiwKLQkJIHNpbV9hZGRfY29tbWFzIChidWYsIHNpemVvZiAoYnVmKSwgQ1BVX1NDQUNIRV9GVUxMX0ZMVVNIRVMgKGNwdSkpKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBJbnNuIGNoYWluIGxlbmd0aHM6XG5cbiIpOwotICAgICAgbWF4X3ZhbCA9IDA7Ci0gICAgICBsZW5ndGhzID0gQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTIChjcHUpOwotICAgICAgZm9yIChpID0gMTsgaSA8IENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KTsgKytpKQotCWlmIChsZW5ndGhzW2ldID4gbWF4X3ZhbCkKLQkgIG1heF92YWwgPSBsZW5ndGhzW2ldOwotICAgICAgZm9yIChpID0gMTsgaSA8IENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KTsgKytpKQotCXsKLQkgIHNpbV9pb19wcmludGYgKHNkLCAiICAlMmQ6ICUqczogIiwKLQkJCSBpLAotCQkJIG1heF92YWwgPCAxMDAwMCA/IDUgOiAxMCwKLQkJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIGxlbmd0aHNbaV0pKTsKLQkgIHNpbV9wcm9maWxlX3ByaW50X2JhciAoc2QsIFBST0ZJTEVfSElTVE9HUkFNX1dJRFRILAotCQkJCSBsZW5ndGhzW2ldLCBtYXhfdmFsKTsKLQkgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLQl9Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0gICAgfQotI2VuZGlmIC8qIFdJVEhfU0NBQ0hFX1BCQiAqLwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5oIGIvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2EyMGRlLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi1zY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKiBTaW11bGF0b3IgaGVhZGVyIGZvciBjZ2VuIHNjYWNoZSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fU0NBQ0hFX0gKLSNkZWZpbmUgQ0dFTl9TQ0FDSEVfSAotCi0jaWZuZGVmIFdJVEhfU0NBQ0hFCi0jZGVmaW5lIFdJVEhfU0NBQ0hFIDAKLSNlbmRpZgotCi0vKiBXaGVuIGNhY2hpbmcgYmIncywgaW5zdHJ1Y3Rpb25zIGFyZSBleHRyYWN0ZWQgaW50byAiY2hhaW5zIi4KLSAgIFNDQUNIRV9NQVAgaXMgYSBoYXNoIHRhYmxlIGludG8gdGhlc2UgY2hhaW5zLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBJQUREUiBwYzsKLSAgU0NBQ0hFICpzYzsKLX0gU0NBQ0hFX01BUDsKLQotdHlwZWRlZiBzdHJ1Y3QgY3B1X3NjYWNoZSB7Ci0gIC8qIFNpbXVsYXRvciBjYWNoZSBzaXplLiAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0gICAgIFRoaXMgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYGNhY2hlJyBtZW1iZXIuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSNkZWZpbmUgQ1BVX1NDQUNIRV9TSVpFKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5zaXplKQotICAvKiBUaGUgY2FjaGUuICAqLwotICBTQ0FDSEUgKmNhY2hlOwotI2RlZmluZSBDUFVfU0NBQ0hFX0NBQ0hFKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5jYWNoZSkKLQotI2lmIFdJVEhfU0NBQ0hFX1BCQgotICAvKiBOdW1iZXIgb2YgaGFzaCBjaGFpbnMuICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4gICovCi0gIHVuc2lnbmVkIGludCBudW1faGFzaF9jaGFpbnM7Ci0jZGVmaW5lIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5udW1faGFzaF9jaGFpbnMpCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGVhY2ggaGFzaCBjaGFpbi4KLSAgICAgVGhlIGhhc2ggdGFibGUgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBOeE0gYXJyYXkgd2hlcmUKLSAgICAgTiA9IG51bV9oYXNoX2NoYWlucwotICAgICBNID0gbnVtX2hhc2hfY2hhaW5fZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBudW1faGFzaF9jaGFpbl9lbnRyaWVzOwotI2RlZmluZSBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLm51bV9oYXNoX2NoYWluX2VudHJpZXMpCi0gIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGNoYWluLgotICAgICA/Pz8gVGhpcyBqdXN0IGxldCdzIHVzIHNldCBhIHN0YXRpYyBzaXplIG9mIGNoYWluX2xlbmd0aHMgdGFibGUuCi0gICAgIEluIGEgc2ltdWxhdGlvbiB0aGF0IGhhbmRsZXMgbW9yZSB0aGFuIGp1c3QgdGhlIGNwdSwgdGhpcyBtaWdodCBhbHNvIGJlCi0gICAgIHVzZWQgdG8ga2VlcCB0b28gbWFueSBpbnN0cnVjdGlvbnMgZnJvbSBiZWluZyBleGVjdXRlZCBiZWZvcmUgY2hlY2tpbmcKLSAgICAgZm9yIGV2ZW50cyAob3Igc29tZSBzdWNoKS4gICovCi0gIHVuc2lnbmVkIGludCBtYXhfY2hhaW5fbGVuZ3RoOwotI2RlZmluZSBDUFVfU0NBQ0hFX01BWF9DSEFJTl9MRU5HVEgoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLm1heF9jaGFpbl9sZW5ndGgpCi0gIC8qIFNwZWNpYWwgc2NhY2hlIGVudHJ5IGZvciAocmUpc3RhcnRpbmcgYmIgZXh0cmFjdGlvbi4gICovCi0gIFNDQUNIRSAqcGJiX2JlZ2luOwotI2RlZmluZSBDUFVfU0NBQ0hFX1BCQl9CRUdJTihjcHUpICgoY3B1KSAtPiBjZ2VuX2NwdS5zY2FjaGUucGJiX2JlZ2luKQotICAvKiBIYXNoIHRhYmxlIGludG8gY2FjaGVkIGNoYWlucy4gICovCi0gIFNDQUNIRV9NQVAgKmhhc2hfdGFibGU7Ci0jZGVmaW5lIENQVV9TQ0FDSEVfSEFTSF9UQUJMRShjcHUpICgoY3B1KSAtPiBjZ2VuX2NwdS5zY2FjaGUuaGFzaF90YWJsZSkKLSAgLyogTmV4dCBmcmVlIGVudHJ5IGluIGNhY2hlLiAgKi8KLSAgU0NBQ0hFICpuZXh0X2ZyZWU7Ci0jZGVmaW5lIENQVV9TQ0FDSEVfTkVYVF9GUkVFKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5uZXh0X2ZyZWUpCi0KLSAgLyogS2luZCBvZiBicmFuY2ggYmVpbmcgdGFrZW4uCi0gICAgIE9ubHkgdXNlZCBieSBmdW5jdGlvbmFsIHNlbWFudGljcywgbm90IHN3aXRjaCBmb3JtLiAgKi8KLSAgU0VNX0JSQU5DSF9UWVBFIHBiYl9icl90eXBlOwotI2RlZmluZSBDUFVfUEJCX0JSX1RZUEUoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLnBiYl9icl90eXBlKQotICAvKiBUYXJnZXQncyBicmFuY2ggYWRkcmVzcy4gICovCi0gIElBRERSIHBiYl9icl9ucGM7Ci0jZGVmaW5lIENQVV9QQkJfQlJfTlBDKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5wYmJfYnJfbnBjKQotI2VuZGlmIC8qIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0jaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QCi0gIC8qIENhY2hlIGhpdHMsIG1pc3Nlcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGl0cywgbWlzc2VzOwotI2RlZmluZSBDUFVfU0NBQ0hFX0hJVFMoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLmhpdHMpCi0jZGVmaW5lIENQVV9TQ0FDSEVfTUlTU0VTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5taXNzZXMpCi0KLSNpZiBXSVRIX1NDQUNIRV9QQkIKLSAgLyogQ2hhaW4gbGVuZ3RoIGNvdW50cy4KLSAgICAgRWFjaCBlbGVtZW50IGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjaGFpbnMgY3JlYXRlZCB3aXRoIHRoYXQKLSAgICAgbGVuZ3RoLiAgKi8KLSAgdW5zaWduZWQgbG9uZyAqY2hhaW5fbGVuZ3RoczsKLSNkZWZpbmUgQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5jaGFpbl9sZW5ndGhzKQotICAvKiBOdW1iZXIgb2YgdGltZXMgY2FjaGUgd2FzIGZsdXNoZWQgZHVlIHRvIGl0cyBiZWluZyBmdWxsLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdWxsX2ZsdXNoZXM7Ci0jZGVmaW5lIENQVV9TQ0FDSEVfRlVMTF9GTFVTSEVTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5mdWxsX2ZsdXNoZXMpCi0jZW5kaWYKLSNlbmRpZgotfSBDUFVfU0NBQ0hFOwotCi0vKiBIYXNoIGEgUEMgdmFsdWUuCi0gICBUaGlzIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzIHRvIGhlbHAgd2l0aCBtb3ZpbmcgYXMgbXVjaCBvZiB0aGUKLSAgIGNvbXB1dGF0aW9uIG91dCBvZiB0aGUgbWFpbiBsb29wLiAgKi8KLSNkZWZpbmUgQ1BVX1NDQUNIRV9IQVNIX01BU0soY3B1KSAoQ1BVX1NDQUNIRV9TSVpFIChjcHUpIC0gMSkKLSNkZWZpbmUgU0NBQ0hFX0hBU0hfUEMocGMsIG1hc2spIFwKLSgoQ0dFTl9NSU5fSU5TTl9TSVpFID09IDIgPyAoKHBjKSA+PiAxKSBcCi0gIDogQ0dFTl9NSU5fSU5TTl9TSVpFID09IDQgPyAoKHBjKSA+PiAyKSBcCi0gIDogKHBjKSkgXAotICYgKG1hc2spKQotCi0vKiBOb24temVybyBpZiBjYWNoZSBpcyBpbiB1c2UuICAqLwotI2RlZmluZSBVU0lOR19TQ0FDSEVfUChzZCkgKFNUQVRFX1NDQUNIRV9TSVpFIChzZCkgPiAwKQotCi0vKiBJbnN0YWxsIHRoZSBzaW11bGF0b3IgY2FjaGUgaW50byB0aGUgc2ltdWxhdG9yLiAgKi8KLU1PRFVMRV9JTlNUQUxMX0ZOIHNjYWNoZV9pbnN0YWxsOwotCi0vKiBMb29rdXAgYSBQQyB2YWx1ZSBpbiB0aGUgc2NhY2hlIFtjb21waWxhdGlvbiBvbmx5XS4gICovCi1leHRlcm4gU0NBQ0hFICogc2NhY2hlX2xvb2t1cCAoU0lNX0NQVSAqLCBJQUREUik7Ci0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGF0IGxlYXN0IE4gYnVmZmVycy4gICovCi1leHRlcm4gU0NBQ0hFICpzY2FjaGVfbG9va3VwX29yX2FsbG9jIChTSU1fQ1BVICosIElBRERSLCBpbnQsIFNDQUNIRSAqKik7Ci0vKiBGbHVzaCBhbGwgY3B1J3Mgc2NhY2hlcy4gICovCi1leHRlcm4gdm9pZCBzY2FjaGVfZmx1c2ggKFNJTV9ERVNDKTsKLS8qIEZsdXNoIGEgY3B1J3Mgc2NhY2hlLiAgKi8KLWV4dGVybiB2b2lkIHNjYWNoZV9mbHVzaF9jcHUgKFNJTV9DUFUgKik7Ci0MCi0vKiBTY2FjaGUgcHJvZmlsaW5nIHN1cHBvcnQuICAqLwotCi0vKiBQcmludCBzdW1tYXJ5IHNjYWNoZSB1c2FnZSBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gdm9pZCBzY2FjaGVfcHJpbnRfcHJvZmlsZSAoU0lNX0NQVSAqY3B1LCBpbnQgdmVyYm9zZSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfU0NBQ0hFX1AKLQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQoY3B1KSBcCi1kbyB7IFwKLSAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChjcHUpIFtQUk9GSUxFX1NDQUNIRV9JRFhdKSBcCi0gICAgKysgQ1BVX1NDQUNIRV9ISVRTIChjcHUpOyBcCi19IHdoaWxlICgwKQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTKGNwdSkgXAotZG8geyBcCi0gIGlmIChDUFVfUFJPRklMRV9GTEFHUyAoY3B1KSBbUFJPRklMRV9TQ0FDSEVfSURYXSkgXAotICAgICsrIENQVV9TQ0FDSEVfTUlTU0VTIChjcHUpOyBcCi19IHdoaWxlICgwKQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9DSEFJTl9MRU5HVEgoY3B1LGxlbmd0aCkgXAotZG8geyBcCi0gIGlmIChDUFVfUFJPRklMRV9GTEFHUyAoY3B1KSBbUFJPRklMRV9TQ0FDSEVfSURYXSkgXAotICAgICsrIENQVV9TQ0FDSEVfQ0hBSU5fTEVOR1RIUyAoY3B1KSBbbGVuZ3RoXTsgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9TQ0FDSEVfRlVMTF9GTFVTSChjcHUpIFwKLWRvIHsgXAotICBpZiAoQ1BVX1BST0ZJTEVfRkxBR1MgKGNwdSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0pIFwKLSAgICArKyBDUFVfU0NBQ0hFX0ZVTExfRkxVU0hFUyAoY3B1KTsgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UKLQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQoY3B1KQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTKGNwdSkKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9TQ0FDSEVfQ0hBSU5fTEVOR1RIKGNwdSxsZW5ndGgpCi0jZGVmaW5lIFBST0ZJTEVfQ09VTlRfU0NBQ0hFX0ZVTExfRkxVU0goY3B1KQotCi0jZW5kaWYKLQotI2VuZGlmIC8qIENHRU5fU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1zaW0uaCBiL3NpbS9jb21tb24vY2dlbi1zaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiOGU1YS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NnZW4tc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciBDcHUgdG9vbHMgR0VOZXJhdGVkIHNpbXVsYXRvcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCBhZnRlciBzaW0tYmFzZS5oLiAgKi8KLQotI2lmbmRlZiBDR0VOX1NJTV9ICi0jZGVmaW5lIENHRU5fU0lNX0gKLQotI2luY2x1ZGUgImNnZW4tZGVmcy5oIgotI2luY2x1ZGUgImNnZW4tc2NhY2hlLmgiCi0jaW5jbHVkZSAiY2dlbi1mcHUuaCIKLSNpbmNsdWRlICJjZ2VuLXBhci5oIgotI2luY2x1ZGUgImNnZW4tY3B1LmgiCi0jaW5jbHVkZSAiY2dlbi10cmFjZS5oIgotCi0vKiBUaGlzIGlzIGEgbWFjaGluZSBnZW5lcmF0ZWQgZmlsZS4gICovCi0jaW5jbHVkZSAiY3B1YWxsLmgiCi0KLSNlbmRpZiAvKiBDR0VOX1NJTV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tdHJhY2UuYyBiL3NpbS9jb21tb24vY2dlbi10cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTM4MmQ0Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi10cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qIFRyYWNpbmcgc3VwcG9ydCBmb3IgQ0dFTi1iYXNlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLQotI2lmbmRlZiBTSVpFX0lOU1RSVUNUSU9OCi0jZGVmaW5lIFNJWkVfSU5TVFJVQ1RJT04gMTYKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfTE9DQVRJT04KLSNkZWZpbmUgU0laRV9MT0NBVElPTiAyMAotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9QQwotI2RlZmluZSBTSVpFX1BDIDYKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfTElORV9OVU1CRVIKLSNkZWZpbmUgU0laRV9MSU5FX05VTUJFUiA0Ci0jZW5kaWYKLQotI2lmbmRlZiBTSVpFX0NZQ0xFX0NPVU5UCi0jZGVmaW5lIFNJWkVfQ1lDTEVfQ09VTlQgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9UT1RBTF9DWUNMRV9DT1VOVAotI2RlZmluZSBTSVpFX1RPVEFMX0NZQ0xFX0NPVU5UIDkKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfVFJBQ0VfQlVGCi0jZGVmaW5lIFNJWkVfVFJBQ0VfQlVGIDEwMjQKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfaW5zbiAoU0lNX0NQVSAqLCBjb25zdCBDR0VOX0lOU04gKiwKLQkJICBjb25zdCBzdHJ1Y3QgYXJnYnVmICosIElBRERSLCBjaGFyICopOwotCi0vKiBUZXh0IGlzIHF1ZXVlZCBpbiBUUkFDRV9CVUYgYmVjYXVzZSB3ZSB3YW50IHRvIG91dHB1dCB0aGUgaW5zbidzIGN5Y2xlCi0gICBjb3VudCBmaXJzdCBidXQgdGhhdCBpc24ndCBrbm93biB1bnRpbCBhZnRlciB0aGUgaW5zbiBoYXMgZXhlY3V0ZWQuCi0gICBUaGlzIGFsc28gaGFuZGxlcyB0aGUgcXVldWVpbmcgb2YgdHJhY2UgcmVzdWx0cywgVFJBQ0VfUkVTVUxUIG1heSBiZQotICAgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBvbmUgaW5zbi4gICovCi1zdGF0aWMgY2hhciB0cmFjZV9idWZbU0laRV9UUkFDRV9CVUZdOwotLyogSWYgTlVMTCwgb3V0cHV0IHRvIHN0ZG91dCBkaXJlY3RseS4gICovCi1zdGF0aWMgY2hhciAqYnVmcHRyOwotCi0vKiBOb24temVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsIGluc25zLiAgKi8KLXN0YXRpYyBpbnQgZmlyc3RfaW5zbl9wOwotCi0vKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRyYWNlX2luc24gYW5kIHRyYWNlX3Jlc3VsdC4gICovCi1zdGF0aWMgaW50IHByaW50ZWRfcmVzdWx0X3A7Ci0KLS8qIEluc24gYW5kIGl0cyBleHRyYWN0ZWQgZmllbGRzLgotICAgU2V0IGJ5IHRyYWNlX2luc24sIHVzZWQgYnkgdHJhY2VfaW5zbl9maW5pLgotICAgPz8/IE1vdmUgdG8gU0lNX0NQVSB0byBzdXBwb3J0IGhldGVyb2dlbmVvdXMgbXVsdGktY3B1IGNhc2UuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKmN1cnJlbnRfaW5zbjsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJnYnVmICpjdXJyZW50X2FidWY7Ci0KLXZvaWQKLXRyYWNlX2luc25faW5pdCAoU0lNX0NQVSAqY3B1LCBpbnQgZmlyc3RfcCkKLXsKLSAgYnVmcHRyID0gdHJhY2VfYnVmOwotICAqYnVmcHRyID0gMDsKLSAgZmlyc3RfaW5zbl9wID0gZmlyc3RfcDsKLQotICAvKiBTZXQgdG8gTlVMTCBzbyB0cmFjZV9pbnNuX2ZpbmkgY2FuIGtub3cgaWYgdHJhY2VfaW5zbiB3YXMgY2FsbGVkLiAgKi8KLSAgY3VycmVudF9pbnNuID0gTlVMTDsKLSAgY3VycmVudF9hYnVmID0gTlVMTDsKLX0KLQotdm9pZAotdHJhY2VfaW5zbl9maW5pIChTSU1fQ1BVICpjcHUsIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWYsIGludCBsYXN0X3ApCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotCi0gIC8qIFdhcyBpbnNuIHRyYWNlZD8gIEl0IG1pZ2h0IG5vdCBiZSBpZiB0cmFjZSByYW5nZXMgYXJlIGluIGVmZmVjdC4gICovCi0gIGlmIChjdXJyZW50X2luc24gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGZpcnN0IHRoaW5nIHByaW50ZWQgaXMgY3VycmVudCBhbmQgdG90YWwgY3ljbGUgY291bnRzLiAgKi8KLQotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjcHUpCi0gICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChjdXJyZW50X2FidWYpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdG90YWwgPSBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfaW5zbiA9IFBST0ZJTEVfTU9ERUxfQ1VSX0lOU05fQ1lDTEVTIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKTsKLQotICAgICAgaWYgKGxhc3RfcCkKLQl7Ci0JICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlLSpsZCAlLSpsZCAiLAotCQkJU0laRV9DWUNMRV9DT1VOVCwgdGhpc19pbnNuLAotCQkJU0laRV9UT1RBTF9DWUNMRV9DT1VOVCwgdG90YWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlLSpsZCAlLSpzICIsCi0JCQlTSVpFX0NZQ0xFX0NPVU5ULCB0aGlzX2luc24sCi0JCQlTSVpFX1RPVEFMX0NZQ0xFX0NPVU5ULCAiLS0tIik7Ci0JfQotICAgIH0KLQotICAvKiBQcmludCB0aGUgZGlzYXNzZW1ibGVkIGluc24uICAqLwotCi0gIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiVzIiwgVFJBQ0VfUFJFRklYIChDUFVfVFJBQ0VfREFUQSAoY3B1KSkpOwotCi0jaWYgMAotICAvKiBQcmludCBpbnNuIHJlc3VsdHMuICAqLwotICB7Ci0gICAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdCA9IENHRU5fSU5TTl9PUEVSQU5EUyAoY3VycmVudF9pbnNuKTsKLQotICAgIGlmIChvcGluc3QpCi0gICAgICB7Ci0JaW50IGk7Ci0JaW50IGluZGljZXNbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLQotCS8qIEZldGNoIHRoZSBvcGVyYW5kcyB1c2VkIGJ5IHRoZSBpbnNuLiAgKi8KLQkvKiBGSVhNRTogQWRkIGZuIHB0ciB0byBDR0VOX0NQVV9ERVNDLiAgKi8KLQlDR0VOX1NZTSAoZ2V0X2luc25fb3BlcmFuZHMpIChDUFVfQ1BVX0RFU0MgKGNwdSksIGN1cnJlbnRfaW5zbiwKLQkJCQkgICAgICAwLCBDR0VOX0ZJRUxEU19CSVRTSVpFICgmaW5zbl9maWVsZHMpLAotCQkJCSAgICAgIGluZGljZXMpOwotCi0JZm9yIChpID0gMDsKLQkgICAgIENHRU5fT1BJTlNUX1RZUEUgKG9waW5zdCkgIT0gQ0dFTl9PUElOU1RfRU5EOwotCSAgICAgKytpLCArK29waW5zdCkKLQkgIHsKLQkgICAgaWYgKENHRU5fT1BJTlNUX1RZUEUgKG9waW5zdCkgPT0gQ0dFTl9PUElOU1RfT1VUUFVUKQotCSAgICAgIHRyYWNlX3Jlc3VsdCAoY3B1LCBjdXJyZW50X2luc24sIG9waW5zdCwgaW5kaWNlc1tpXSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIC8qIFByaW50IGFueXRoaW5nIGVsc2UgcmVxdWVzdGVkLiAgKi8KLQotICBpZiAoKnRyYWNlX2J1ZikKLSAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgJXNcbiIsIHRyYWNlX2J1Zik7Ci0gIGVsc2UKLSAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICJcbiIpOwotfQotCi12b2lkCi10cmFjZV9pbnNuIChTSU1fQ1BVICpjcHUsIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKm9wY29kZSwKLQkgICAgY29uc3Qgc3RydWN0IGFyZ2J1ZiAqYWJ1ZiwgSUFERFIgcGMpCi17Ci0gIGNoYXIgZGlzYXNtX2J1Zls1MF07Ci0KLSAgcHJpbnRlZF9yZXN1bHRfcCA9IDA7Ci0gIGN1cnJlbnRfaW5zbiA9IG9wY29kZTsKLSAgY3VycmVudF9hYnVmID0gYWJ1ZjsKLQotICBpZiAoQ0dFTl9JTlNOX1ZJUlRVQUxfUCAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICB0cmFjZV9wcmVmaXggKENQVV9TVEFURSAoY3B1KSwgY3B1LCBOVUxMX0NJQSwgcGMsIDAsCi0JCSAgICBOVUxMLCAwLCBDR0VOX0lOU05fTkFNRSAob3Bjb2RlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIENQVV9ESVNBU1NFTUJMRVIgKGNwdSkgKGNwdSwgb3Bjb2RlLCBhYnVmLCBwYywgZGlzYXNtX2J1Zik7Ci0gIHRyYWNlX3ByZWZpeCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIE5VTExfQ0lBLCBwYywgVFJBQ0VfTElORU5VTV9QIChjcHUpLAotCQlOVUxMLCAwLAotCQkiJXMlLSpzIiwKLQkJZmlyc3RfaW5zbl9wID8gIiAiIDogInwiLAotCQlTSVpFX0lOU1RSVUNUSU9OLCBkaXNhc21fYnVmKTsKLX0KLQotdm9pZAotdHJhY2VfZXh0cmFjdCAoU0lNX0NQVSAqY3B1LCBJQUREUiBwYywgY2hhciAqbmFtZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCBwcmludGVkX29uZV9wID0gMDsKLSAgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmdzLCBuYW1lKTsKLQotICB0cmFjZV9wcmludGYgKENQVV9TVEFURSAoY3B1KSwgY3B1LCAiRXh0cmFjdDogMHglLipseDogJXMgIiwKLQkJU0laRV9QQywgcGMsIG5hbWUpOwotCi0gIGRvIHsKLSAgICBpbnQgdHlwZSxpdmFsOwotCi0gICAgZm10ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotCi0gICAgaWYgKGZtdCkKLSAgICAgIHsKLQlpZiAocHJpbnRlZF9vbmVfcCkKLQkgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsICIsICIpOwotCXByaW50ZWRfb25lX3AgPSAxOwotCXR5cGUgPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0Jc3dpdGNoICh0eXBlKQotCSAgewotCSAgY2FzZSAneCcgOgotCSAgICBpdmFsID0gdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgICB0cmFjZV9wcmludGYgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBmbXQsIGl2YWwpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQgOgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLSAgfSB3aGlsZSAoZm10KTsKLQotICB2YV9lbmQgKGFyZ3MpOwotICB0cmFjZV9wcmludGYgKENQVV9TVEFURSAoY3B1KSwgY3B1LCAiXG4iKTsKLX0KLQotdm9pZAotdHJhY2VfcmVzdWx0IChTSU1fQ1BVICpjcHUsIGNoYXIgKm5hbWUsIGludCB0eXBlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgdHlwZSk7Ci0gIGlmIChwcmludGVkX3Jlc3VsdF9wKQotICAgIGNnZW5fdHJhY2VfcHJpbnRmIChjcHUsICIsICIpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAneCcgOgotICAgIGRlZmF1bHQgOgotICAgICAgY2dlbl90cmFjZV9wcmludGYgKGNwdSwgIiVzIDwtIDB4JXgiLCBuYW1lLCB2YV9hcmcgKGFyZ3MsIGludCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRCcgOgotICAgICAgewotCURJIGRpOwotCS8qIHRoaXMgaXMgc2VwYXJhdGVkIGZyb20gcHJldmlvdXMgbGluZSBmb3Igc3Vub3MgY2MgKi8KLQlkaSA9IHZhX2FyZyAoYXJncywgREkpOwotCWNnZW5fdHJhY2VfcHJpbnRmIChjcHUsICIlcyA8LSAweCV4JTA4eCIsIG5hbWUsCi0JCQkgICBHRVRISURJKGRpKSwgR0VUTE9ESSAoZGkpKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgcHJpbnRlZF9yZXN1bHRfcCA9IDE7Ci0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLS8qIFByaW50IHRyYWNlIG91dHB1dCB0byBCVUZQVFIgaWYgYWN0aXZlLCBvdGhlcndpc2UgcHJpbnQgbm9ybWFsbHkuCi0gICBUaGlzIGlzIG9ubHkgZm9yIHRyYWNpbmcgc2VtYW50aWMgY29kZS4gICovCi0KLXZvaWQKLWNnZW5fdHJhY2VfcHJpbnRmIChTSU1fQ1BVICpjcHUsIGNoYXIgKmZtdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0KLSAgaWYgKGJ1ZnB0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChUUkFDRV9GSUxFIChDUFVfVFJBQ0VfREFUQSAoY3B1KSkgPT0gTlVMTCkKLQkoKiBTVEFURV9DQUxMQkFDSyAoQ1BVX1NUQVRFIChjcHUpKS0+ZXZwcmludGZfZmlsdGVyZWQpCi0JICAoU1RBVEVfQ0FMTEJBQ0sgKENQVV9TVEFURSAoY3B1KSksIGZtdCwgYXJncyk7Ci0gICAgICBlbHNlCi0JdmZwcmludGYgKFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChjcHUpKSwgZm10LCBhcmdzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2c3ByaW50ZiAoYnVmcHRyLCBmbXQsIGFyZ3MpOwotICAgICAgYnVmcHRyICs9IHN0cmxlbiAoYnVmcHRyKTsKLSAgICAgIC8qID8/PyBOZWVkIHZlcnNpb24gb2YgU0lNX0FTU0VSVCB0aGF0IGlzIGFsd2F5cyBlbmFibGVkLiAgKi8KLSAgICAgIGlmIChidWZwdHIgLSB0cmFjZV9idWYgPiBTSVpFX1RSQUNFX0JVRikKLQlhYm9ydCAoKTsKLSAgICB9Ci0KLSAgdmFfZW5kIChhcmdzKTsKLX0KLQwKLS8qIERpc2Fzc2VtYmx5IHN1cHBvcnQuICAqLwotCi0vKiBzcHJpbnRmIHRvIGEgInN0cmVhbSIgKi8KLQotaW50Ci1zaW1fZGlzYXNtX3NwcmludGYgVlBBUkFNUyAoKFNGSUxFICpmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi17Ci0jaWZuZGVmIF9fU1REQ19fCi0gIFNGSUxFICpmOwotICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jZW5kaWYKLSAgaW50IG47Ci0gIHZhX2xpc3QgYXJnczsKLQotICBWQV9TVEFSVCAoYXJncywgZm9ybWF0KTsKLSNpZm5kZWYgX19TVERDX18KLSAgZiA9IHZhX2FyZyAoYXJncywgU0ZJTEUgKik7Ci0gIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSNlbmRpZgotICB2c3ByaW50ZiAoZi0+Y3VycmVudCwgZm9ybWF0LCBhcmdzKTsKLSAgZi0+Y3VycmVudCArPSBuID0gc3RybGVuIChmLT5jdXJyZW50KTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIE1lbW9yeSByZWFkIHN1cHBvcnQgZm9yIGFuIG9wY29kZXMgZGlzYXNzZW1ibGVyLiAgKi8KLQotaW50Ci1zaW1fZGlzYXNtX3JlYWRfbWVtb3J5IChiZmRfdm1hIG1lbWFkZHIsIGJmZF9ieXRlICpteWFkZHIsIGludCBsZW5ndGgsCi0JCQlzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKLXsKLSAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIGludCBsZW5ndGhfcmVhZDsKLQotICBsZW5ndGhfcmVhZCA9IHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCByZWFkX21hcCwgbXlhZGRyLCBtZW1hZGRyLAotCQkJCSAgICAgIGxlbmd0aCk7Ci0gIGlmIChsZW5ndGhfcmVhZCAhPSBsZW5ndGgpCi0gICAgcmV0dXJuIEVJTzsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1lbW9yeSBlcnJvciBzdXBwb3J0IGZvciBhbiBvcGNvZGVzIGRpc2Fzc2VtYmxlci4gICovCi0KLXZvaWQKLXNpbV9kaXNhc21fcGVycm9yX21lbW9yeSAoaW50IHN0YXR1cywgYmZkX3ZtYSBtZW1hZGRyLAotCQkJICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKLXsKLSAgaWYgKHN0YXR1cyAhPSBFSU8pCi0gICAgLyogQ2FuJ3QgaGFwcGVuLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlVua25vd24gZXJyb3IgJWQuIiwgc3RhdHVzKTsKLSAgZWxzZQotICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKLSAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKLQkJCSJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy4iLAotCQkJKGludCkgbWVtYWRkcik7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIHVzaW5nIHRoZSBDR0VOIG9wY29kZSB0YWJsZS4KLSAgID8/PyBXaGlsZSBleGVjdXRpbmcgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBpbnNuIGhhcyBiZWVuIGRlY29kZWQgYW5kIGFsbCBpdHMKLSAgIGZpZWxkcyBoYXZlIGJlZW4gZXh0cmFjdGVkLiAgSXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIHRvIGRvIHRoZSBkaXNhc3NlbWJseQotICAgd2l0aCB0aGF0IGRhdGEuICBUaGlzIHNlZW1zIHNpbXBsZXIsIGJ1dCBtYXliZSBpbiB0aGUgZnV0dXJlIHRoZSBhbHJlYWR5Ci0gICBleHRyYWN0ZWQgZmllbGRzIHdpbGwgYmUgdXNlZC4gICovCi0KLXZvaWQKLXNpbV9jZ2VuX2Rpc2Fzc2VtYmxlX2luc24gKFNJTV9DUFUgKmNwdSwgY29uc3QgQ0dFTl9JTlNOICppbnNuLAotCQkJICAgY29uc3QgQVJHQlVGICphYnVmLCBJQUREUiBwYywgY2hhciAqYnVmKQotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIGRpc2FzbV9pbmZvOwotICBTRklMRSBzZmlsZTsKLSAgdW5pb24gewotICAgIHVuc2lnbmVkOCBieXRlc1tDR0VOX01BWF9JTlNOX1NJWkVdOwotICAgIHVuc2lnbmVkMTYgc2hvcnRzWzhdOwotICAgIHVuc2lnbmVkMzIgd29yZHNbNF07Ci0gIH0gaW5zbl9idWY7Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBDR0VOX0NQVV9ERVNDIGNkID0gQ1BVX0NQVV9ERVNDIChjcHUpOwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotICBDR0VOX0ZJRUxEUyAqZmllbGRzID0gYWxsb2NhIChDR0VOX0NQVV9TSVpFT0ZfRklFTERTIChjZCkpOwotICBpbnQgaW5zbl9iaXRfbGVuZ3RoID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotICBpbnQgaW5zbl9sZW5ndGggPSBpbnNuX2JpdF9sZW5ndGggLyA4OwotCi0gIHNmaWxlLmJ1ZmZlciA9IHNmaWxlLmN1cnJlbnQgPSBidWY7Ci0gIElOSVRfRElTQVNTRU1CTEVfSU5GTyAoZGlzYXNtX2luZm8sIChGSUxFICopICZzZmlsZSwKLQkJCSAoZnByaW50Zl9mdHlwZSkgc2ltX2Rpc2FzbV9zcHJpbnRmKTsKLSAgZGlzYXNtX2luZm8uZW5kaWFuID0KLSAgICAoYmZkX2JpZ19lbmRpYW4gKFNUQVRFX1BST0dfQkZEIChzZCkpID8gQkZEX0VORElBTl9CSUcKLSAgICAgOiBiZmRfbGl0dGxlX2VuZGlhbiAoU1RBVEVfUFJPR19CRkQgKHNkKSkgPyBCRkRfRU5ESUFOX0xJVFRMRQotICAgICA6IEJGRF9FTkRJQU5fVU5LTk9XTik7Ci0KLSAgbGVuZ3RoID0gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCAmaW5zbl9idWYsIHBjLAotCQkJCSBpbnNuX2xlbmd0aCk7Ci0KLSAgc3dpdGNoIChtaW4gKGNkLT5iYXNlX2luc25fYml0c2l6ZSwgaW5zbl9iaXRfbGVuZ3RoKSkKLSAgICB7Ci0gICAgY2FzZSAwIDogcmV0dXJuOyAvKiBmYWtlIGluc24sIHR5cGljYWxseSAiY29tcGlsZSIgKGFrYSAiaW52YWxpZCIpICovCi0gICAgY2FzZSA4IDogaW5zbl92YWx1ZSA9IGluc25fYnVmLmJ5dGVzWzBdOyBicmVhazsKLSAgICBjYXNlIDE2IDogaW5zbl92YWx1ZSA9IFQySF8yIChpbnNuX2J1Zi5zaG9ydHNbMF0pOyBicmVhazsKLSAgICBjYXNlIDMyIDogaW5zbl92YWx1ZSA9IFQySF80IChpbnNuX2J1Zi53b3Jkc1swXSk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLQotICBkaXNhc21faW5mby5idWZmZXJfdm1hID0gcGM7Ci0gIGRpc2FzbV9pbmZvLmJ1ZmZlciA9IGluc25fYnVmLmJ5dGVzOwotICBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoID0gbGVuZ3RoOwotCi0gIGV4X2luZm8uZGlzX2luZm8gPSAoUFRSKSAmZGlzYXNtX2luZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCBsZW5ndGgpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gaW5zbl9idWYuYnl0ZXM7Ci0KLSAgbGVuZ3RoID0gKCpDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKSkgKGNkLCBpbnNuLCAmZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7Ci0gIC8qIFJlc3VsdCBvZiBleHRyYWN0IGZuIGlzIGluIGJpdHMuICAqLwotICAvKiA/Pz8gVGhpcyBhc3N1bWVzIHRoYXQgZWFjaCBpbnN0cnVjdGlvbiBoYXMgYSBmaXhlZCBsZW5ndGggKGFuZCB0aHVzCi0gICAgIGZvciBpbnNucyB3aXRoIG11bHRpcGxlIHZlcnNpb25zIG9mIHZhcmlhYmxlIGxlbmd0aHMgdGhleSB3b3VsZCBlYWNoCi0gICAgIGhhdmUgdGhlaXIgb3duIHRhYmxlIGVudHJ5KS4gICovCi0gIGlmIChsZW5ndGggPT0gaW5zbl9iaXRfbGVuZ3RoKQotICAgIHsKLSAgICAgICgqQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pKSAoY2QsICZkaXNhc21faW5mbywgaW5zbiwgZmllbGRzLCBwYywgbGVuZ3RoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBhYm9ydGluZyBpcyB0b28gZHJhc3RpYy4gICovCi0gICAgICBzdHJjcHkgKGJ1ZiwgIioqKnVua25vd24qKioiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tdHJhY2UuaCBiL3NpbS9jb21tb24vY2dlbi10cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc5NmZiLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY2dlbi10cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogU2ltdWxhdG9yIHRyYWNpbmcgc3VwcG9ydCBmb3IgQ3B1IHRvb2xzIEdFTmVyYXRlZCBzaW11bGF0b3JzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBDR0VOX1RSQUNFX0gKLSNkZWZpbmUgQ0dFTl9UUkFDRV9ICi0KLXZvaWQgdHJhY2VfaW5zbl9pbml0IChTSU1fQ1BVICosIGludCk7Ci12b2lkIHRyYWNlX2luc25fZmluaSAoU0lNX0NQVSAqLCBjb25zdCBzdHJ1Y3QgYXJnYnVmICosIGludCk7Ci12b2lkIHRyYWNlX2luc24gKFNJTV9DUFUgKiwgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqLAotCQkgY29uc3Qgc3RydWN0IGFyZ2J1ZiAqLCBJQUREUik7Ci12b2lkIHRyYWNlX2V4dHJhY3QgKFNJTV9DUFUgKiwgSUFERFIsIGNoYXIgKiwgLi4uKTsKLXZvaWQgdHJhY2VfcmVzdWx0IChTSU1fQ1BVICosIGNoYXIgKiwgaW50LCAuLi4pOwotdm9pZCBjZ2VuX3RyYWNlX3ByaW50ZiAoU0lNX0NQVSAqLCBjaGFyICpmbXQsIC4uLik7Ci0KLS8qIFRyYWNlIGluc3RydWN0aW9uIHJlc3VsdHMuICAqLwotI2RlZmluZSBUUkFDRV9SRVNVTFRfUChjcHUsIGFidWYpIChUUkFDRV9JTlNOX1AgKGNwdSkgJiYgQVJHQlVGX1RSQUNFX1AgKGFidWYpKQotCi0jZGVmaW5lIFRSQUNFX0lOU05fSU5JVChjcHUsIGFidWYsIGZpcnN0X3ApIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfSU5TTl9QIChjcHUpKSBcCi0gICAgdHJhY2VfaW5zbl9pbml0ICgoY3B1KSwgKGZpcnN0X3ApKTsgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgVFJBQ0VfSU5TTl9GSU5JKGNwdSwgYWJ1ZiwgbGFzdF9wKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0lOU05fUCAoY3B1KSkgXAotICAgIHRyYWNlX2luc25fZmluaSAoKGNwdSksIChhYnVmKSwgKGxhc3RfcCkpOyBcCi19IHdoaWxlICgwKQotI2RlZmluZSBUUkFDRV9QUklOVEYoY3B1LCB3aGF0LCBhcmdzKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX1AgKChjcHUpLCAod2hhdCkpKSBcCi0gICAgY2dlbl90cmFjZV9wcmludGYgYXJncyA7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFRSQUNFX0lOU04oY3B1LCBpbnNuLCBhYnVmLCBwYykgXAotZG8geyBcCi0gIGlmIChUUkFDRV9JTlNOX1AgKGNwdSkgJiYgQVJHQlVGX1RSQUNFX1AgKGFidWYpKSBcCi0gICAgdHJhY2VfaW5zbiAoKGNwdSksIChpbnNuKSwgKGFidWYpLCAocGMpKSA7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFRSQUNFX0VYVFJBQ1QoY3B1LCBhYnVmLCBhcmdzKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0VYVFJBQ1RfUCAoY3B1KSkgXAotICAgIHRyYWNlX2V4dHJhY3QgYXJncyA7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9SRVNVTFRfUCAoKGNwdSksIChhYnVmKSkpIFwKLSAgICB0cmFjZV9yZXN1bHQgKChjcHUpLCAobmFtZSksICh0eXBlKSwgKHZhbCkpIDsgXAotfSB3aGlsZSAoMCkKLQwKLS8qIERpc2Fzc2VtYmx5IHN1cHBvcnQuICAqLwotCi0vKiBGdW5jdGlvbiB0byB1c2UgZm9yIGNnZW4tYmFzZWQgZGlzYXNzZW1ibGVycy4gICovCi1leHRlcm4gQ0dFTl9ESVNBU1NFTUJMRVIgc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbjsKLQotLyogUHNldWRvIEZJTEUgb2JqZWN0IGZvciBzdHJpbmdzLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqYnVmZmVyOwotICBjaGFyICpjdXJyZW50OwotfSBTRklMRTsKLQotLyogU3RyaW5nIHByaW50ZXIgZm9yIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotZXh0ZXJuIGludCBzaW1fZGlzYXNtX3NwcmludGYgKFNGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLQotLyogRm9yIG9wY29kZXMgYmFzZWQgZGlzYXNzZW1ibGVycy4gICovCi0jaWZkZWYgQkZEX1ZFUlNJT04KLXN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvOwotZXh0ZXJuIGludAotc2ltX2Rpc2FzbV9yZWFkX21lbW9yeSAoYmZkX3ZtYSBtZW1hZGRyXywgYmZkX2J5dGUgKm15YWRkcl8sIGludCBsZW5ndGhfLAotCQkJc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm9fKTsKLWV4dGVybiB2b2lkCi1zaW1fZGlzYXNtX3BlcnJvcl9tZW1vcnkgKGludCBzdGF0dXNfLCBiZmRfdm1hIG1lbWFkZHJfLAotCQkJICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb18pOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBDR0VOX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi10eXBlcy5oIGIvc2ltL2NvbW1vbi9jZ2VuLXR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDhlZGYuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9jZ2VuLXR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVHlwZXMgZm9yIENwdSB0b29scyBHRU5lcmF0ZWQgc2ltdWxhdG9ycy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBub3QgaW5jbHVkZWQgd2l0aCBjZ2VuLXNpbS5oIGFzIGl0IGRlZmluZXMgdHlwZXMKLSAgIG5lZWRlZCBieSBzaW0tYmFzZS5oLiAgKi8KLQotI2lmbmRlZiBDR0VOX1RZUEVTX0gKLSNkZWZpbmUgQ0dFTl9UWVBFU19ICi0KLS8qIE1pc2NlbGxhbmVvdXMgY2dlbiBjb25maWd1cnkgZGVmaW5lZCBoZXJlIGFzIHRoaXMgZmlsZSBnZXRzCi0gICBpbmNsdWRlZCBzb29uIGVub3VnaC4gICovCi0KLS8qIEluZGljYXRlIHdlIHN1cHBvcnQgLS1wcm9maWxlLW1vZGVsLiAgKi8KLSN1bmRlZiBTSU1fSEFWRV9NT0RFTAotI2RlZmluZSBTSU1fSEFWRV9NT0RFTAotCi0vKiBJbmRpY2F0ZSB3ZSBzdXBwb3J0IC0te3Byb2ZpbGUsdHJhY2V9LXtyYW5nZSxmdW5jdGlvbn0uICAqLwotI3VuZGVmIFNJTV9IQVZFX0FERFJfUkFOR0UKLSNkZWZpbmUgU0lNX0hBVkVfQUREUl9SQU5HRQotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSEFWRV9MT05HTE9ORwotI3VuZGVmIERJX0ZOX1NVUFBPUlQKLSNlbHNlCi0jdW5kZWYgSEFWRV9MT05HTE9ORwotI2RlZmluZSBESV9GTl9TVVBQT1JUCi0jZW5kaWYKLQwKLS8qIE1vZGUgc3VwcG9ydC4gICovCi0KLS8qIENvbW1vbiBtb2RlIHR5cGVzLiAgKi8KLS8qID8/PyBUYXJnZXQgc3BlY2lmaWMgbW9kZXMuICAqLwotdHlwZWRlZiBlbnVtIG1vZGVfdHlwZSB7Ci0gIE1PREVfVk9JRCwgTU9ERV9CSSwKLSAgTU9ERV9RSSwgTU9ERV9ISSwgTU9ERV9TSSwgTU9ERV9ESSwKLSAgTU9ERV9VUUksIE1PREVfVUhJLCBNT0RFX1VTSSwgTU9ERV9VREksCi0gIE1PREVfU0YsIE1PREVfREYsIE1PREVfWEYsIE1PREVfVEYsCi0gIE1PREVfVEFSR0VUX01BWCAvKiA9IE1PREVfVEY/ICovLAotICAvKiBUaGVzZSBhcmUgaG9zdCBtb2Rlcy4gICovCi0gIE1PREVfSU5ULCBNT0RFX1VJTlQsIE1PREVfUFRSLCAvKj8/PyBNT0RFX0FERFIsIE1PREVfSUFERFIsKi8KLSAgTU9ERV9NQVgKLX0gTU9ERV9UWVBFOwotCi0jZGVmaW5lIE1BWF9UQVJHRVRfTU9ERVMgKChpbnQpIE1PREVfVEFSR0VUX01BWCkKLSNkZWZpbmUgTUFYX01PREVTICgoaW50KSBNT0RFX01BWCkKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKm1vZGVfbmFtZXNbXTsKLSNkZWZpbmUgTU9ERV9OQU1FKG0pIChtb2RlX25hbWVzW21dKQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQkk7Ci10eXBlZGVmIHNpZ25lZDggUUk7Ci10eXBlZGVmIHNpZ25lZDE2IEhJOwotdHlwZWRlZiBzaWduZWQzMiBTSTsKLXR5cGVkZWYgdW5zaWduZWQ4IFVRSTsKLXR5cGVkZWYgdW5zaWduZWQxNiBVSEk7Ci10eXBlZGVmIHVuc2lnbmVkMzIgVVNJOwotCi0jaWZkZWYgSEFWRV9MT05HTE9ORwotdHlwZWRlZiBzaWduZWQ2NCBESTsKLXR5cGVkZWYgdW5zaWduZWQ2NCBVREk7Ci0jZGVmaW5lIEdFVExPREkoZGkpICgoU0kpIChkaSkpCi0jZGVmaW5lIEdFVEhJREkoZGkpICgoU0kpICgoVURJKSAoZGkpID4+IDMyKSkKLSNkZWZpbmUgU0VUTE9ESShkaSwgdmFsKSAoKGRpKSA9ICgoKGRpKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSB8ICh2YWwpKSkKLSNkZWZpbmUgU0VUSElESShkaSwgdmFsKSAoKGRpKSA9ICgoKGRpKSAmIDB4ZmZmZmZmZmZMTCkgfCAoKChESSkgKHZhbCkpIDw8IDMyKSkpCi0jZGVmaW5lIFNFVERJKGRpLCBoaSwgbG8pICgoZGkpID0gTUFLRURJIChoaSwgbG8pKQotI2RlZmluZSBNQUtFREkoaGksIGxvKSAoKCgoREkpIChTSSkgKGhpKSkgPDwgMzIpIHwgKChVREkpIChVU0kpIChsbykpKQotI2Vsc2UKLS8qIERJIG1vZGUgc3VwcG9ydCBpZiAibG9uZyBsb25nIiBkb2Vzbid0IGV4aXN0LgotICAgQXQgb25lIHBvaW50IENHRU4gc3VwcG9ydGVkIEsmUiBDIGNvbXBpbGVycywgYW5kIEFOU0kgQyBjb21waWxlcnMgd2l0aG91dAotICAgImxvbmcgbG9uZyIuICBPbmUgY2FuIGFyZ3VlIHRoZSB2YXJpb3VzIG1lcml0cyBvZiBrZWVwaW5nIHRoaXMgaW4gb3IKLSAgIHRocm93aW5nIGl0IG91dC4gIEkgd2VudCB0byB0aGUgdHJvdWJsZSBvZiBhZGRpbmcgaXQgc28gZm9yIHRoZSB0aW1lIGJlaW5nCi0gICBJJ20gbGVhdmluZyBpdCBpbi4gICovCi10eXBlZGVmIHN0cnVjdCB7IFNJIGhpLGxvOyB9IERJOwotdHlwZWRlZiBESSBVREk7Ci0jZGVmaW5lIEdFVExPREkoZGkpICgoZGkpLmxvKQotI2RlZmluZSBHRVRISURJKGRpKSAoKGRpKS5oaSkKLSNkZWZpbmUgU0VUTE9ESShkaSwgdmFsKSAoKGRpKS5sbyA9ICh2YWwpKQotI2RlZmluZSBTRVRISURJKGRpLCB2YWwpICgoZGkpLmhpID0gKHZhbCkpCi0jZGVmaW5lIFNFVERJKGRpLCBoaSwgbG8pICgoZGkpID0gTUFLRURJIChoaSwgbG8pKQotZXh0ZXJuIERJIG1ha2Vfc3RydWN0X2RpIChTSSwgU0kpOwotI2RlZmluZSBNQUtFREkoaGksIGxvKSAobWFrZV9zdHJ1Y3RfZGkgKChoaSksIChsbykpKQotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSB1c2VkIHRvIHJlY29yZCBleHRyYWN0ZWQgcmF3IGRhdGEgZnJvbSBhbiBpbnN0cnVjdGlvbiwgYW1vbmcgb3RoZXIKLSAgIHRoaW5ncy4gIEl0IG11c3QgYmUgYSBob3N0IGRhdGEgdHlwZSwgYW5kIG5vdCBhIHRhcmdldCBvbmUuICAqLwotdHlwZWRlZiBpbnQgSU5UOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKLQotdHlwZWRlZiB1bnNpZ25lZF9hZGRyZXNzIEFERFI7ICAvKiBGSVhNRTogd2lwKi8KLXR5cGVkZWYgdW5zaWduZWRfYWRkcmVzcyBJQUREUjsgLyogRklYTUU6IHdpcCovCi0KLS8qIGZwIHR5cGVzIGFyZSBpbiBjZ2VuLWZwdS5oICovCi0KLSNlbmRpZiAvKiBDR0VOX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi11dGlscy5jIGIvc2ltL2NvbW1vbi9jZ2VuLXV0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDA3ZWQuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9jZ2VuLXV0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyogU3VwcG9ydCBjb2RlIGZvciB2YXJpb3VzIHBpZWNlcyBvZiBDR0VOIHNpbXVsYXRvcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNkZWZpbmUgTUVNT1BTX0RFRklORV9JTkxJTkUKLSNpbmNsdWRlICJjZ2VuLW1lbS5oIgotCi0jZGVmaW5lIFNFTU9QU19ERUZJTkVfSU5MSU5FCi0jaW5jbHVkZSAiY2dlbi1vcHMuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi1jb25zdCBjaGFyICptb2RlX25hbWVzW10gPSB7Ci0gICJWT0lEIiwKLSAgIkJJIiwKLSAgIlFJIiwKLSAgIkhJIiwKLSAgIlNJIiwKLSAgIkRJIiwKLSAgIlVRSSIsCi0gICJVSEkiLAotICAiVVNJIiwKLSAgIlVESSIsCi0gICJTRiIsCi0gICJERiIsCi0gICJYRiIsCi0gICJURiIsCi0gIDAsIC8qIE1PREVfVEFSR0VUX01BWCAqLwotICAiSU5UIiwKLSAgIlVJTlQiLAotICAiUFRSIgotfTsKLQotLyogT3Bjb2RlIHRhYmxlIGZvciB2aXJ0dWFsIGluc25zIHVzZWQgYnkgdGhlIHNpbXVsYXRvci4gICovCi0KLSNkZWZpbmUgViBDR0VOX0FUVFJfTUFTSyAoQ0dFTl9JTlNOX1ZJUlRVQUwpCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIHZpcnR1YWxfaW5zbl9lbnRyaWVzW10gPQotewotICB7Ci0gICAgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCwgIi0taW52YWxpZC0tIiwgTlVMTCwgMCwgeyBWLCB7IDAgfSB9Ci0gIH0sCi0gIHsKLSAgICBWSVJUVUFMX0lOU05fWF9CRUZPUkUsICItLWJlZm9yZS0tIiwgTlVMTCwgMCwgeyBWLCB7IDAgfSB9Ci0gIH0sCi0gIHsKLSAgICBWSVJUVUFMX0lOU05fWF9BRlRFUiwgIi0tYWZ0ZXItLSIsIE5VTEwsIDAsIHsgViwgeyAwIH0gfQotICB9LAotICB7Ci0gICAgVklSVFVBTF9JTlNOX1hfQkVHSU4sICItLWJlZ2luLS0iLCBOVUxMLCAwLCB7IFYsIHsgMCB9IH0KLSAgfSwKLSAgewotICAgIFZJUlRVQUxfSU5TTl9YX0NIQUlOLCAiLS1jaGFpbi0tIiwgTlVMTCwgMCwgeyBWLCB7IDAgfSB9Ci0gIH0sCi0gIHsKLSAgICBWSVJUVUFMX0lOU05fWF9DVElfQ0hBSU4sICItLWN0aS1jaGFpbi0tIiwgTlVMTCwgMCwgeyBWLCB7IDAgfSB9Ci0gIH0KLX07Ci0KLSN1bmRlZiBWCi0KLWNvbnN0IENHRU5fSU5TTiBjZ2VuX3ZpcnR1YWxfaW5zbl90YWJsZVtdID0KLXsKLSAgeyAmIHZpcnR1YWxfaW5zbl9lbnRyaWVzWzBdIH0sCi0gIHsgJiB2aXJ0dWFsX2luc25fZW50cmllc1sxXSB9LAotICB7ICYgdmlydHVhbF9pbnNuX2VudHJpZXNbMl0gfSwKLSAgeyAmIHZpcnR1YWxfaW5zbl9lbnRyaWVzWzNdIH0sCi0gIHsgJiB2aXJ0dWFsX2luc25fZW50cmllc1s0XSB9LAotICB7ICYgdmlydHVhbF9pbnNuX2VudHJpZXNbNV0gfQotfTsKLQotLyogSW5pdGlhbGl6ZSBjZ2VuIHRoaW5ncy4KLSAgIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNpbV9wb3N0X2FyZ3ZfaW5pdC4gICovCi0KLXZvaWQKLWNnZW5faW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIGludCBpLCBjOwotCi0gIC8qIElmIG5vIHByb2ZpbGluZyBvciB0cmFjaW5nIGhhcyBiZWVuIGVuYWJsZWQsIHJ1biBpbiBmYXN0IG1vZGUuICAqLwotICB7Ci0gICAgaW50IHJ1bl9mYXN0X3AgPSAxOwotCi0gICAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCi0gICAgICB7Ci0JU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BST0ZJTEVfVkFMVUVTOyArK2kpCi0JICBpZiAoQ1BVX1BST0ZJTEVfRkxBR1MgKGNwdSkgW2ldKQotCSAgICB7Ci0JICAgICAgcnVuX2Zhc3RfcCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RSQUNFX1ZBTFVFUzsgKytpKQotCSAgaWYgKENQVV9UUkFDRV9GTEFHUyAoY3B1KSBbaV0pCi0JICAgIHsKLQkgICAgICBydW5fZmFzdF9wID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWlmICghIHJ1bl9mYXN0X3ApCi0JICBicmVhazsKLSAgICAgIH0KLSAgICBTVEFURV9SVU5fRkFTVF9QIChzZCkgPSBydW5fZmFzdF9wOwotICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBpbnNuIG51bWJlciBJLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX2luc25fbmFtZSAoU0lNX0NQVSAqY3B1LCBpbnQgaSkKLXsKLSAgcmV0dXJuIENHRU5fSU5TTl9OQU1FICgoKiBDUFVfR0VUX0lEQVRBIChjcHUpKSAoKGNwdSksIChpKSkpOwotfQotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dHJhIGJ5dGVzIHJlcXVpcmVkIGZvciBhIFNJTV9DUFUgc3RydWN0LiAgKi8KLQotaW50Ci1jZ2VuX2NwdV9tYXhfZXh0cmFfYnl0ZXMgKHZvaWQpCi17Ci0gIGludCBpOwotICBpbnQgZXh0cmEgPSAwOwotCi0gIGZvciAoaSA9IDA7IHNpbV9tYWNoc1tpXSAhPSAwOyArK2kpCi0gICAgewotICAgICAgaW50IHNpemUgPSBJTVBfUFJPUFNfU0lNX0NQVV9TSVpFIChNQUNIX0lNUF9QUk9QUyAoc2ltX21hY2hzW2ldKSk7Ci0gICAgICBpZiAoc2l6ZSA+IGV4dHJhKQotCWV4dHJhID0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiBleHRyYTsKLX0KLQwKLSNpZmRlZiBESV9GTl9TVVBQT1JUCi0KLURJCi1tYWtlX3N0cnVjdF9kaSAoaGksIGxvKQotICAgICBTSSBoaSwgbG87Ci17Ci0gIERJIHJlc3VsdDsKLQotICByZXN1bHQuaGkgPSBoaTsKLSAgcmVzdWx0LmxvID0gbG87Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLURJCi1BTkRESSAoYSwgYikKLSAgICAgREkgYSwgYjsKLXsKLSAgU0kgYWhpID0gR0VUSElESSAoYSk7Ci0gIFNJIGFsbyA9IEdFVExPREkgKGEpOwotICBTSSBiaGkgPSBHRVRISURJIChiKTsKLSAgU0kgYmxvID0gR0VUTE9ESSAoYik7Ci0gIHJldHVybiBNQUtFREkgKGFoaSAmIGJoaSwgYWxvICYgYmxvKTsKLX0KLQotREkKLU9SREkgKGEsIGIpCi0gICAgIERJIGEsIGI7Ci17Ci0gIFNJIGFoaSA9IEdFVEhJREkgKGEpOwotICBTSSBhbG8gPSBHRVRMT0RJIChhKTsKLSAgU0kgYmhpID0gR0VUSElESSAoYik7Ci0gIFNJIGJsbyA9IEdFVExPREkgKGIpOwotICByZXR1cm4gTUFLRURJIChhaGkgfCBiaGksIGFsbyB8IGJsbyk7Ci19Ci0KLURJCi1BRERESSAoYSwgYikKLSAgICAgREkgYSwgYjsKLXsKLSAgVVNJIGFoaSA9IEdFVEhJREkgKGEpOwotICBVU0kgYWxvID0gR0VUTE9ESSAoYSk7Ci0gIFVTSSBiaGkgPSBHRVRISURJIChiKTsKLSAgVVNJIGJsbyA9IEdFVExPREkgKGIpOwotICBVU0kgeCA9IGFsbyArIGJsbzsKLSAgcmV0dXJuIE1BS0VESSAoYWhpICsgYmhpICsgKHggPCBhbG8pLCB4KTsKLX0KLQotREkKLU1VTERJIChhLCBiKQotICAgICBESSBhLCBiOwotewotICBVU0kgYWhpID0gR0VUSElESSAoYSk7Ci0gIFVTSSBhbG8gPSBHRVRMT0RJIChhKTsKLSAgVVNJIGJoaSA9IEdFVEhJREkgKGIpOwotICBVU0kgYmxvID0gR0VUTE9ESSAoYik7Ci0gIFVTSSByaGkscmxvOwotICBVU0kgeDAsIHgxLCB4MiwgeDM7Ci0KLSAgeDAgPSBhbG8gKiBibG87Ci0gIHgxID0gYWxvICogYmhpOwotICB4MiA9IGFoaSAqIGJsbzsKLSAgeDMgPSBhaGkgKiBiaGk7Ci0KLSNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCi0jZGVmaW5lIEJJVFM0IChTSV9UWVBFX1NJWkUgLyA0KQotI2RlZmluZSBsbF9CICgxTCA8PCAoU0lfVFlQRV9TSVpFIC8gMikpCi0jZGVmaW5lIGxsX2xvd3BhcnQodCkgKChVU0kpICh0KSAlIGxsX0IpCi0jZGVmaW5lIGxsX2hpZ2hwYXJ0KHQpICgoVVNJKSAodCkgLyBsbF9CKQotICB4MSArPSBsbF9oaWdocGFydCAoeDApOwkvKiB0aGlzIGNhbid0IGdpdmUgY2FycnkgKi8KLSAgeDEgKz0geDI7CQkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwotICBpZiAoeDEgPCB4MikJCQkvKiBkaWQgd2UgZ2V0IGl0PyAqLwotICAgIHgzICs9IGxsX0I7CQkJLyogeWVzLCBhZGQgaXQgaW4gdGhlIHByb3BlciBwb3MuICovCi0KLSAgcmhpID0geDMgKyBsbF9oaWdocGFydCAoeDEpOwotICBybG8gPSBsbF9sb3dwYXJ0ICh4MSkgKiBsbF9CICsgbGxfbG93cGFydCAoeDApOwotICByZXR1cm4gTUFLRURJIChyaGkgKyAoYWxvICogYmhpKSArIChhaGkgKiBibG8pLCBybG8pOwotfQotCi1ESQotU0hMREkgKHZhbCwgc2hpZnQpCi0gICAgIERJIHZhbDsKLSAgICAgU0kgc2hpZnQ7Ci17Ci0gIFVTSSBoaSA9IEdFVEhJREkgKHZhbCk7Ci0gIFVTSSBsbyA9IEdFVExPREkgKHZhbCk7Ci0gIC8qIEZJWE1FOiBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoaWZ0IDwgMCB8fCBzaGlmdCA+PSAzMi4gICovCi0gIHJldHVybiBNQUtFREkgKChoaSA8PCBzaGlmdCkgfCAobG8gPj4gKDMyIC0gc2hpZnQpKSwgbG8gPDwgc2hpZnQpOwotfQotCi1ESQotU0xBREkgKHZhbCwgc2hpZnQpCi0gICAgIERJIHZhbDsKLSAgICAgU0kgc2hpZnQ7Ci17Ci0gIFNJIGhpID0gR0VUSElESSAodmFsKTsKLSAgVVNJIGxvID0gR0VUTE9ESSAodmFsKTsKLSAgLyogRklYTUU6IE5lZWQgdG8gd29ycnkgYWJvdXQgc2hpZnQgPCAwIHx8IHNoaWZ0ID49IDMyLiAgKi8KLSAgcmV0dXJuIE1BS0VESSAoKGhpIDw8IHNoaWZ0KSB8IChsbyA+PiAoMzIgLSBzaGlmdCkpLCBsbyA8PCBzaGlmdCk7Ci19Ci0KLURJCi1TUkFESSAodmFsLCBzaGlmdCkKLSAgICAgREkgdmFsOwotICAgICBTSSBzaGlmdDsKLXsKLSAgU0kgaGkgPSBHRVRISURJICh2YWwpOwotICBVU0kgbG8gPSBHRVRMT0RJICh2YWwpOwotICAvKiBXZSB1c2UgU1JBU0kgYmVjYXVzZSB0aGUgcmVzdWx0IGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgaWYgaGkgPCAwLiAgKi8KLSAgLyogRklYTUU6IE5lZWQgdG8gd29ycnkgYWJvdXQgc2hpZnQgPCAwIHx8IHNoaWZ0ID49IDMyLiAgKi8KLSAgcmV0dXJuIE1BS0VESSAoU1JBU0kgKGhpLCBzaGlmdCksIChoaSA8PCAoMzIgLSBzaGlmdCkpIHwgKGxvID4+IHNoaWZ0KSk7Ci19Ci0KLWludAotR0VESSAoYSwgYikKLSAgICAgREkgYSwgYjsKLXsKLSAgU0kgYWhpID0gR0VUSElESSAoYSk7Ci0gIFVTSSBhbG8gPSBHRVRMT0RJIChhKTsKLSAgU0kgYmhpID0gR0VUSElESSAoYik7Ci0gIFVTSSBibG8gPSBHRVRMT0RJIChiKTsKLSAgaWYgKGFoaSA+IGJoaSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGFoaSA9PSBiaGkpCi0gICAgcmV0dXJuIGFsbyA+PSBibG87Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLUxFREkgKGEsIGIpCi0gICAgIERJIGEsIGI7Ci17Ci0gIFNJIGFoaSA9IEdFVEhJREkgKGEpOwotICBVU0kgYWxvID0gR0VUTE9ESSAoYSk7Ci0gIFNJIGJoaSA9IEdFVEhJREkgKGIpOwotICBVU0kgYmxvID0gR0VUTE9ESSAoYik7Ci0gIGlmIChhaGkgPCBiaGkpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChhaGkgPT0gYmhpKQotICAgIHJldHVybiBhbG8gPD0gYmxvOwotICByZXR1cm4gMDsKLX0KLQotREkKLUNPTlZISURJICh2YWwpCi0gICAgIEhJIHZhbDsKLXsKLSAgaWYgKHZhbCA8IDApCi0gICAgcmV0dXJuIE1BS0VESSAoLTEsIHZhbCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gTUFLRURJICgwLCB2YWwpOwotfQotCi1ESQotQ09OVlNJREkgKHZhbCkKLSAgICAgU0kgdmFsOwotewotICBpZiAodmFsIDwgMCkKLSAgICByZXR1cm4gTUFLRURJICgtMSwgdmFsKTsKLSAgZWxzZQotICAgIHJldHVybiBNQUtFREkgKDAsIHZhbCk7Ci19Ci0KLVNJCi1DT05WRElTSSAodmFsKQotICAgICBESSB2YWw7Ci17Ci0gIHJldHVybiBHRVRMT0RJICh2YWwpOwotfQotCi0jZW5kaWYgLyogRElfRk5fU1VQUE9SVCAqLwotDAotU0kKLVJPUlNJICh2YWwsIHNoaWZ0KQotICAgICBTSSAgdmFsOwotICAgICBpbnQgc2hpZnQ7Ci17Ci0gIGlmIChzaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGludCByZW1haW4gPSAzMiAtIHNoaWZ0OwotICAgICAgaW50IG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOwotICAgICAgU0kgcmVzdWx0ID0gKHZhbCAmIG1hc2spIDw8IHJlbWFpbjsKLSAgICAgIG1hc2sgPSAoMSA8PCByZW1haW4pIC0gMTsKLSAgICAgIHJlc3VsdCB8PSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotU0kKLVJPTFNJICh2YWwsIHNoaWZ0KQotICAgICBTSSAgdmFsOwotICAgICBpbnQgc2hpZnQ7Ci17Ci0gIGlmIChzaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGludCByZW1haW4gPSAzMiAtIHNoaWZ0OwotICAgICAgaW50IG1hc2sgPSAoMSA8PCByZW1haW4pIC0gMTsKLSAgICAgIFNJIHJlc3VsdCA9ICh2YWwgJiBtYXNrKSA8PCBzaGlmdDsKLSAgICAgIG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOwotICAgICAgcmVzdWx0IHw9ICh2YWwgPj4gcmVtYWluKSAmIG1hc2s7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICByZXR1cm4gdmFsOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jb25maWcuaW4gYi9zaW0vY29tbW9uL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmOTU2MC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fU0VURlBVQ1cKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0lHQUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRExGQ05fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NvbmZpZ3VyZSBiL3NpbS9jb21tb24vY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmM5ZDA0Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMzk5NCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotIyBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHRhcmdldCBzcGVjaWZpYyBkaXJlY3RvcmllcywgYW5kIGJ5IHVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODY6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA1OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMjI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjc3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1OTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTc1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMTg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjE4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4MDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMTM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzUyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwNzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTcxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODM5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Nzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTYwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi0jIFB1dCBhIHVzZWZ1bCBjb3B5IG9mIENQUF9GT1JfVEFSR0VUIGluIE1ha2VmaWxlLgotIyBUaGlzIGlzIG9ubHkgdXNlZCB0byBidWlsZCB0aGUgdGFyZ2V0IHZhbHVlcyBoZWFkZXIgZmlsZXMuICBUaGVzZSBmaWxlcyBhcmUKLSMgc2hpcHBlZCB3aXRoIGRpc3RyaWJ1dGlvbnMgc28gQ1BQX0ZPUl9UQVJHRVQgb25seSBuZWVkcyB0byB3b3JrIGluCi0jIGRldmVsb3BlcidzIHRyZWVzLiAgVGhpcyB2YWx1ZSBpcyBib3Jyb3dlZCBmcm9tIC4uLy4uL01ha2VmaWxlLmluLgotQ1BQX0ZPUl9UQVJHRVQ9IlxgIFwKLSAgaWYgdGVzdCAtZiBcJFwke3Jvb3RtZX0vLi4vLi4vZ2NjL01ha2VmaWxlIDsgdGhlbiBcCi0gICAgaWYgdGVzdCAtZiBcJFwke3Jvb3RtZX0vLi4vLi4vXCQoVEFSR0VUX1NVQkRJUikvbmV3bGliL01ha2VmaWxlIDsgdGhlbiBcCi0gICAgICBlY2hvIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MveGdjYyAtQlwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvIC1pZGlyYWZ0ZXIgXCRcJHtyb290bWV9Ly4uLy4uL1wkKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciBcJChzcmNyb290KS9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBcJFwke3Jvb3RtZX0vLi4vLi4vZ2NjL3hnY2MgLUJcJFwke3Jvb3RtZX0vLi4vLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIHRlc3QgJ1wkKGhvc3RfY2Fub25pY2FsKScgPSAnXCQodGFyZ2V0X2Nhbm9uaWNhbCknIDsgdGhlbiBcCi0gICAgICBlY2hvIFwkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nXCQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGdjYyB8IHNlZCAtZSAncy94L3gvJyBcJFwkdDsgXAotICAgIGZpOyBcCi0gIGZpXGAgLUUiCi0KLQotIyBTZXQgVEFSR0VUX1NVQkRJUiwgbmVlZGVkIGJ5IENQUF9GT1JfVEFSR0VULgotaWYgdGVzdCB4IiR7aG9zdH0iID0geCIke3RhcmdldH0iIDsgdGhlbgotCVRBUkdFVF9TVUJESVI9Ii4iCi1lbHNlCi0JVEFSR0VUX1NVQkRJUj0ke3RhcmdldF9hbGlhc30KLWZpCi0KLQotIyBUaGVzZSBhcmVuJ3QgYWxsIG5lZWRlZCB5ZXQsIGJ1dCB3aWxsIGJlIGV2ZW50dWFsbHkuCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB0aW1lLmggc3lzL3RpbWVzLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTMwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU0MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBfRk9SX1RBUkdFVEAlJENQUF9GT1JfVEFSR0VUJWcKLXMlQFRBUkdFVF9TVUJESVJAJSRUQVJHRVRfU1VCRElSJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlIHgkQ09ORklHX0hFQURFUlMgaW4geGNjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NvbmZpZ3VyZS5pbiBiL3NpbS9jb21tb24vY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVhNTM4Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotIyBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHRhcmdldCBzcGVjaWZpYyBkaXJlY3RvcmllcywgYW5kIGJ5IHVzLgotU0lNX0FDX0NPTU1PTihjY29uZmlnLmgpCi0KLSMgUHV0IGEgdXNlZnVsIGNvcHkgb2YgQ1BQX0ZPUl9UQVJHRVQgaW4gTWFrZWZpbGUuCi0jIFRoaXMgaXMgb25seSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgdmFsdWVzIGhlYWRlciBmaWxlcy4gIFRoZXNlIGZpbGVzIGFyZQotIyBzaGlwcGVkIHdpdGggZGlzdHJpYnV0aW9ucyBzbyBDUFBfRk9SX1RBUkdFVCBvbmx5IG5lZWRzIHRvIHdvcmsgaW4KLSMgZGV2ZWxvcGVyJ3MgdHJlZXMuICBUaGlzIHZhbHVlIGlzIGJvcnJvd2VkIGZyb20gLi4vLi4vTWFrZWZpbGUuaW4uCi1DUFBfRk9SX1RBUkdFVD0iXGAgXAotICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvTWFrZWZpbGUgOyB0aGVuIFwKLSAgICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9cJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgOyB0aGVuIFwKLSAgICAgIGVjaG8gXCRcJHtyb290bWV9Ly4uLy4uL2djYy94Z2NjIC1CXCRcJHtyb290bWV9Ly4uLy4uL2djYy8gLWlkaXJhZnRlciBcJFwke3Jvb3RtZX0vLi4vLi4vXCQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyIFwkKHNyY3Jvb3QpL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MveGdjYyAtQlwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgdGVzdCAnXCQoaG9zdF9jYW5vbmljYWwpJyA9ICdcJCh0YXJnZXRfY2Fub25pY2FsKScgOyB0aGVuIFwKLSAgICAgIGVjaG8gXCQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSdcJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nIFwkXCR0OyBcCi0gICAgZmk7IFwKLSAgZmlcYCAtRSIKLUFDX1NVQlNUKENQUF9GT1JfVEFSR0VUKQotCi0jIFNldCBUQVJHRVRfU1VCRElSLCBuZWVkZWQgYnkgQ1BQX0ZPUl9UQVJHRVQuCi1pZiB0ZXN0IHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgOyB0aGVuCi0JVEFSR0VUX1NVQkRJUj0iLiIKLWVsc2UKLQlUQVJHRVRfU1VCRElSPSR7dGFyZ2V0X2FsaWFzfQotZmkKLUFDX1NVQlNUKFRBUkdFVF9TVUJESVIpCi0KLSMgVGhlc2UgYXJlbid0IGFsbCBuZWVkZWQgeWV0LCBidXQgd2lsbCBiZSBldmVudHVhbGx5LgotQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdGltZS5oIHN5cy90aW1lcy5oKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUsCi1bY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjY29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjXSkKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZHYtY29yZS5jIGIvc2ltL2NvbW1vbi9kdi1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZjRmNjguLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9kdi1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiaHctbWFpbi5oIgotCi0vKiBERVZJQ0UKLSAgIAotICAgY29yZSAtIHJvb3Qgb2YgdGhlIGRldmljZSB0cmVlCi0gICAKLSAgIERFU0NSSVBUSU9OCi0gICAKLSAgIFRoZSBjb3JlIGRldmljZSwgcG9zaXRpb25lZCBhdCB0aGUgcm9vdCBvZiB0aGUgZGV2aWNlIHRyZWUgYXBwZWFycwotICAgdG8gaXRzIGNoaWxkIGRldmljZXMgYXMgYSBub3JtYWwgZGV2aWNlIGp1c3QgbGlrZSBldmVyeSBvdGhlcgotICAgZGV2aWNlIGluIHRoZSB0cmVlLgotCi0gICBJbnRlcm5hbGx5IGl0IGlzIGltcGxlbWVudGVkIHVzaW5nIGEgY29yZSBvYmplY3QuICBSZXF1ZXN0cyB0bwotICAgYXR0YWNoIChvciBkZXRhY2gpIGFkZHJlc3Mgc3BhY2VzIGFyZSBwYXNzZWQgdG8gdGhhdCBjb3JlIG9iamVjdC4KLSAgIFJlcXVlc3RzIHRvIHRyYW5zZmVyIChETUEpIGRhdGEgYXJlIHJlZmxlY3RlZCBiYWNrIGRvd24gdGhlIGRldmljZQotICAgdHJlZSB1c2luZyB0aGUgY29yZV9tYXAgZGF0YSB0cmFuc2ZlciBtZXRob2RzLgotCi0gICBQUk9QRVJUSUVTCi0KLSAgIE5vbmUuCi0KLSAgICovCi0KLQotc3RhdGljIHZvaWQKLWR2X2NvcmVfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2sgKHN0cnVjdCBodyAqbWUsCi0JCQkJIGludCBsZXZlbCwKLQkJCQkgaW50IHNwYWNlLAotCQkJCSBhZGRyZXNzX3dvcmQgYWRkciwKLQkJCQkgYWRkcmVzc193b3JkIG5yX2J5dGVzLAotCQkJCSBzdHJ1Y3QgaHcgKmNsaWVudCkKLXsKLSAgSFdfVFJBQ0UgKChtZSwgImF0dGFjaCAtIGxldmVsPSVkLCBzcGFjZT0lZCwgYWRkcj0weCVseCwgbnJfYnl0ZXM9JWxkLCBjbGllbnQ9JXMiLAotCSAgICAgbGV2ZWwsIHNwYWNlLCAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIG5yX2J5dGVzLCBod19wYXRoIChjbGllbnQpKSk7Ci0gIC8qIE5PVEU6IEF0IHByZXNldCB0aGUgc3BhY2UgaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgUGVyaGFwaHMgdGhlCi0gICAgIHNwYWNlIHNob3VsZCBiZSBtYXBwZWQgb250byBzb21ldGhpbmcgZm9yIGluc3RhbmNlOiBzcGFjZTAgLQotICAgICB1bmlmaWVkIG1lbW9yeTsgc3BhY2UxIC0gSU8gbWVtb3J5OyAuLi4gKi8KLSAgaWYgKHNwYWNlICE9IDApCi0gICAgaHdfYWJvcnQgKG1lLCAiSGV5ISBVbmtub3duIHNwYWNlICVkIiwgc3BhY2UpOwotICBzaW1fY29yZV9hdHRhY2ggKGh3X3N5c3RlbSAobWUpLAotCQkgICBOVUxMLCAvKmNwdSovCi0JCSAgIGxldmVsLAotCQkgICBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLAotCQkgICBzcGFjZSwgYWRkciwKLQkJICAgbnJfYnl0ZXMsCi0JCSAgIDAsIC8qIG1vZHVsbyAqLwotCQkgICBjbGllbnQsCi0JCSAgIE5VTEwpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotZHZfY29yZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2sgKHN0cnVjdCBodyAqbWUsCi0JCQkJICB2b2lkICpkZXN0LAotCQkJCSAgaW50IHNwYWNlLAotCQkJCSAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHJldHVybiBzaW1fY29yZV9yZWFkX2J1ZmZlciAoaHdfc3lzdGVtIChtZSksCi0JCQkgICAgICAgTlVMTCwgLypDUFUqLwotCQkJICAgICAgIHNwYWNlLCAvKj8/PyovCi0JCQkgICAgICAgZGVzdCwKLQkJCSAgICAgICBhZGRyLAotCQkJICAgICAgIG5yX2J5dGVzKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWR2X2NvcmVfZG1hX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayAoc3RydWN0IGh3ICptZSwKLQkJCQkgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkJICAgaW50IHNwYWNlLAotCQkJCSAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQkgICB1bnNpZ25lZCBucl9ieXRlcywKLQkJCQkgICBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbikKLXsKLSAgcmV0dXJuIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoaHdfc3lzdGVtIChtZSksCi0JCQkJTlVMTCwgLypjcHUqLwotCQkJCXNwYWNlLCAvKj8/PyovCi0JCQkJc291cmNlLAotCQkJCWFkZHIsCi0JCQkJbnJfYnl0ZXMpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kdl9jb3JlX2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKLXsKLSAgc2V0X2h3X2F0dGFjaF9hZGRyZXNzIChtZSwgZHZfY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk7Ci0gIHNldF9od19kbWFfd3JpdGVfYnVmZmVyIChtZSwgZHZfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrKTsKLSAgc2V0X2h3X2RtYV9yZWFkX2J1ZmZlciAobWUsIGR2X2NvcmVfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrKTsKLX0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfY29yZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgImNvcmUiLCBkdl9jb3JlX2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9kdi1nbHVlLmMgYi9zaW0vY29tbW9uL2R2LWdsdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNTUzMS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2R2LWdsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwxOTk4IEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBERVZJQ0UKLSAgIAotCi0gICBnbHVlIC0gZ2x1ZSB0byBpbnRlcmNvbm5lY3QgYW5kIHRlc3QgaGFyZHdhcmUgcG9ydHMKLSAgIAotCi0gICBERVNDUklQVElPTgotICAgCi0KLSAgIFRoZSBnbHVlIGRldmljZSBwcm92aWRlcyB0d28gZnVuY3Rpb25zLiAgRmlyc3RseSwgaXQgcHJvdmlkZXMgYQotICAgbWVjaGFuaXNtIGZvciBpbnNwZWN0aW5nIGFuZCBkcml2aW5nIHRoZSBwb3J0IG5ldHdvcmsuICBTZWNvbmRseSwKLSAgIGl0IHByb3ZpZGVzIGEgc2V0IG9mIGJvb2xlYW4gcHJpbWl0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFwcGx5Ci0gICBjb21iaW5hdG9yaWFsIG9wZXJhdGlvbnMgdG8gdGhlIHBvcnQgbmV0d29yay4KLQotICAgR2x1ZSBkZXZpY2VzIGhhdmUgYSB2YXJpYWJsZSBudW1iZXIgb2YgYmlnIGVuZGlhbiA8PG91dHB1dD4+Ci0gICByZWdpc3RlcnMuICBFYWNoIHJlZ2lzdGVyIGlzIHRhcmdldC13b3JkIHNpemVkLiAgVGhlIHJlZ2lzdGVycyBjYW4KLSAgIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0KLSAgIFdyaXRpbmcgdG8gYW4gb3V0cHV0IHJlZ2lzdGVyIHJlc3VsdHMgaW4gYW4gZXZlbnQgYmVpbmcgZHJpdmVuCi0gICAobGV2ZWwgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUgd3JpdHRlbikgb24gdGhlIGRldmljZXMKLSAgIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHBvcnQuCi0KLSAgIFJlYWRpbmcgYW4gPDxvdXRwdXQ+PiByZWdpc3RlciByZXR1cm5zIGVpdGhlciB0aGUgbGFzdCB2YWx1ZQotICAgd3JpdHRlbiBvciB0aGUgbW9zdCByZWNlbnRseSBjb21wdXRlZCB2YWx1ZSAoZm9yIHRoYXQgcmVnaXN0ZXIpIGFzCi0gICBhIHJlc3VsdCBvZiBhbiBldmVudCBhcml2aW5nIG9uIHRoYXQgcG9ydCAod2hpY2ggZXZlciB3YXMgY29tcHV0ZWQKLSAgIGxhc3QpLgotCi0gICBBdCBwcmVzZW50IHRoZSBmb2xsb3dpbmcgc3ViIGRldmljZSB0eXBlcyBhcmUgYXZhaWxhYmxlOgotCi0gICA8PGdsdWU+PjogSW4gYWRkaXRpb24gdG8gZHJpdmluZyBpdHMgb3V0cHV0IGludGVycnVwdCBwb3J0IHdpdGggYW55Ci0gICB2YWx1ZSB3cml0dGVuIHRvIGFuIGludGVycnVwdCBpbnB1dCBwb3J0IGlzIHN0b3JlZCBpbiB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgPDxvdXRwdXQ+PiByZWdpc3Rlci4gIFN1Y2ggaW5wdXQgaW50ZXJydXB0cywgaG93ZXZlciwKLSAgIGFyZSBub3QgcHJvcG9nYXRlZCB0byBhbiBvdXRwdXQgaW50ZXJydXB0IHBvcnQuCi0KLSAgIDw8Z2x1ZS1hbmQ+PjogVGhlIGJpdC13aXNlIEFORCBvZiB0aGUgaW50ZXJydXB0IGlucHV0cyBpcyBjb21wdXRlZAotICAgYW5kIHRoZW4gYm90aCBzdG9yZWQgaW4gPDxvdXRwdXQ+PiByZWdpc3RlciB6ZXJvIGFuZCBwcm9wb2dhdGVkIHRvCi0gICBvdXRwdXQgaW50ZXJydXB0IG91dHB1dCBwb3J0IHplcm8uCi0KLQotICAgUFJPUEVSVElFUwotICAgCi0KLSAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gKHJlcXVpcmVkKQotCi0gICBTcGVjaWZ5IHRoZSBhZGRyZXNzICh3aXRoaW4gdGhlIHBhcmVudCBidXMpIHRoYXQgdGhpcyBkZXZpY2UgaXMgdG8KLSAgIGxpdmUuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDIwNDggKiBzaXplb2YgKHdvcmQpICg4ayBpbiBhIDMyYml0Ci0gICBzaW11bGF0aW9uKSBhbGlnbmVkLgotCi0KLSAgIGludGVycnVwdC1yYW5nZXMgPSA8aW50LW51bWJlcj4gPHJhbmdlPiAob3B0aW9uYWwpCi0KLSAgIElmIHByZXNlbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW50ZXJydXB0IGlucHV0cyAodXAKLSAgIHRvIHRoZSBtYXhpbXVtIG9mIDIwNDgpLiAgQnkgZGVmYXVsdCwgPDxpbnQtbnVtYmVyPj4gaXMgemVybyBhbmQKLSAgIHJhbmdlIGlzIGRldGVybWluZWQgYnkgdGhlIDw8cmVnPj4gc2l6ZS4KLQotCi0gICBQT1JUUwotCi0gICAKLSAgIGludFswLi5dIChpbnB1dCwgb3V0cHV0KQotCi0gICBCb3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQgcG9ydC4KLQotCi0gICBFWEFNUExFUwotCi0KLSAgIEVuYWJsZSB0cmFjaW5nIG9mIHRoZSBkZXZpY2U6Ci0KLSAgIHwgLXQgZ2x1ZS1kZXZpY2UgXAotCi0KLSAgIENyZWF0ZSBzb3VyY2UsIGJpdHdpemUtYW5kLCBhbmQgc2luayBnbHVlIGRldmljZXMuICBTaW5jZSB0aGUKLSAgIGRldmljZSBhdCBhZGRyZXNzIDw8MHgxMDAwMD4+IGlzIG9mIHNpemUgPDw4Pj4gaXQgd2lsbCBoYXZlIHR3bwotICAgb3V0cHV0IGludGVycnVwdCBwb3J0cy4KLQotICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwL3JlZyAweDEwMDAwIDgnIFwKLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kQDB4MjAwMDAvcmVnIDB4MjAwMDAgNCcgXAotICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZS1hbmQvaW50ZXJydXB0LXJhbmdlcyAwIDInIFwKLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWVAMHgzMDAwMC9yZWcgMHgzMDAwMCA0JyBcCi0KLQotICAgV2lyZSB0aGUgdHdvIHNvdXJjZSBpbnRlcnJ1cHRzIHRvIHRoZSBBTkQgZGV2aWNlOgotCi0gICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MTAwMDAgPiAwIDAgL2lvYnVzL2dsdWUtYW5kJyBcCi0gICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MTAwMDAgPiAxIDEgL2lvYnVzL2dsdWUtYW5kJyBcCi0KLQotICAgV2lyZSB0aGUgQU5EIGRldmljZSB1cCB0byB0aGUgc2luayBzbyB0aGF0IHRoZSBhbmQncyBvdXRwdXQgaXMgbm90Ci0gICBsZWZ0IG9wZW4uCi0KLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kID4gMCAwIC9pb2J1cy9nbHVlQDB4MzAwMDAnIFwKLQotCi0gICBXaXRoIHRoZSBhYm92ZSBjb25maWd1cmF0aW9uLiAgVGhlIGNsaWVudCBwcm9ncmFtIGlzIGFibGUgdG8KLSAgIGNvbXB1dGUgYSB0d28gYml0IEFORC4gIEZvciBpbnN0YW5jZSB0aGUgPDxDPj4gc3R1YiBiZWxvdyBwcmludHMgMQotICAgQU5EIDAuCi0KLSAgIHwgIHVuc2lnbmVkICppbnB1dCA9ICh2b2lkKikweGYwMDEwMDAwOwotICAgfCAgdW5zaWduZWQgKm91dHB1dCA9ICh2b2lkKikweGYwMDMwMDAwOwotICAgfCAgdW5zaWduZWQgYW5zOwotICAgfCAgaW5wdXRbMF0gPSBodG9ubCgxKTsKLSAgIHwgIGlucHV0WzFdID0gaHRvbmwoMCk7Ci0gICB8ICBhbnMgPSBudG9obCgqb3V0cHV0KTsKLSAgIHwgIHdyaXRlX3N0cmluZygiQU5EIGlzICIpOwotICAgfCAgd3JpdGVfaW50KGFucyk7Ci0gICB8ICB3cml0ZV9saW5lKCk7Ci0gICAKLQotICAgQlVHUwotCi0gICAKLSAgIEEgZnV0dXJlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZGV2aWNlIG1heSBzdXBwb3J0IG11bHRpcGxlCi0gICBpbnRlcnJ1cHQgcmFuZ2VzLgotCi0gICBTb21lIG9mIHRoZSBkZXZpY2VzIGxpc3RlZCBtYXkgbm90IHlldCBiZSBmdWxseSBpbXBsZW1lbnRlZC4KLQotICAgQWRkaXRpb25hbCBkZXZpY2VzIHN1Y2ggYXMgYSBEIGZsaXAtZmxvcCAoREZGKSwgYW4gaW52ZXJ0ZXIgKElOVikKLSAgIG9yIGEgbGF0Y2ggKExBVCkgbWF5IHByb3ZlIHVzZWZ1bC4KLQotICAgKi8KLQotCi1lbnVtIHsKLSAgbWF4X25yX3BvcnRzID0gMjA0OCwKLX07Ci0KLWVudW0gaHdfZ2x1ZV90eXBlIHsKLSAgZ2x1ZV91bmRlZmluZWQgPSAwLAotICBnbHVlX2lvLAotICBnbHVlX2FuZCwKLSAgZ2x1ZV9uYW5kLAotICBnbHVlX29yLAotICBnbHVlX3hvciwKLSAgZ2x1ZV9ub3IsCi0gIGdsdWVfbm90LAotfTsKLQotc3RydWN0IGh3X2dsdWUgewotICBlbnVtIGh3X2dsdWVfdHlwZSB0eXBlOwotICBpbnQgaW50X251bWJlcjsKLSAgaW50ICppbnB1dDsKLSAgaW50IG5yX2lucHV0czsKLSAgdW5zaWduZWQgc2l6ZW9mX2lucHV0OwotICAvKiBvdXIgb3V0cHV0IHJlZ2lzdGVycyAqLwotICBpbnQgc3BhY2U7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgdW5zaWduZWQgc2l6ZW9mX291dHB1dDsKLSAgaW50ICpvdXRwdXQ7Ci0gIGludCBucl9vdXRwdXRzOwotfTsKLQotCi1zdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIGh3X2dsdWVfaW9fcmVhZF9idWZmZXI7Ci1zdGF0aWMgaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCBod19nbHVlX2lvX3dyaXRlX2J1ZmZlcjsKLXN0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCBod19nbHVlX3BvcnRfZXZlbnQ7Ci1jb25zdCBzdGF0aWMgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBod19nbHVlX3BvcnRzW107Ci0KLXN0YXRpYyB2b2lkCi1od19nbHVlX2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKLXsKLSAgc3RydWN0IGh3X2dsdWUgKmdsdWUgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfZ2x1ZSk7Ci0gIAotICAvKiBlc3RhYmxpc2ggb3VyIG93biBtZXRob2RzICovCi0gIHNldF9od19kYXRhIChtZSwgZ2x1ZSk7Ci0gIHNldF9od19pb19yZWFkX2J1ZmZlciAobWUsIGh3X2dsdWVfaW9fcmVhZF9idWZmZXIpOwotICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgaHdfZ2x1ZV9pb193cml0ZV9idWZmZXIpOwotICBzZXRfaHdfcG9ydHMgKG1lLCBod19nbHVlX3BvcnRzKTsKLSAgc2V0X2h3X3BvcnRfZXZlbnQgKG1lLCBod19nbHVlX3BvcnRfZXZlbnQpOwotCi0gIC8qIGF0dGFjaCB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBkb19od19hdHRhY2hfcmVncyAobWUpOwotICAKLSAgLyogZXN0YWJsaXNoIHRoZSBvdXRwdXQgcmVnaXN0ZXJzICovCi0gIHsKLSAgICByZWdfcHJvcGVydHlfc3BlYyB1bml0OwotICAgIGludCByZWdfbnI7Ci0gICAgLyogZmluZCBhIHJlbGV2YW50IHJlZyBlbnRyeSAqLwotICAgIHJlZ19uciA9IDA7Ci0gICAgd2hpbGUgKGh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIHJlZ19uciwgJnVuaXQpCi0JICAgJiYgIWh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCi0JCQkJCSAgICAmdW5pdC5zaXplLAotCQkJCQkgICAgJmdsdWUtPnNpemVvZl9vdXRwdXQsCi0JCQkJCSAgICBtZSkpCi0gICAgICByZWdfbnIrKzsKLSAgICAvKiBjaGVjayBvdXQgdGhlIHNpemUgKi8KLSAgICBpZiAoZ2x1ZS0+c2l6ZW9mX291dHB1dCA9PSAwKQotICAgICAgaHdfYWJvcnQgKG1lLCAiYXQgbGVhc3Qgb25lIHJlZyBwcm9wZXJ0eSBzaXplIG11c3QgYmUgbm9uemVybyIpOwotICAgIGlmIChnbHVlLT5zaXplb2Zfb3V0cHV0ICUgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSAhPSAwKQotICAgICAgaHdfYWJvcnQgKG1lLCAicmVnIHByb3BlcnR5IHNpemUgbXVzdCBiZSAlZCBhbGlnbmVkIiwKLQkJc2l6ZW9mICh1bnNpZ25lZF93b3JkKSk7Ci0gICAgLyogYW5kIHRoZSBhZGRyZXNzICovCi0gICAgaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKLQkJCQkgICAgICAgJnVuaXQuYWRkcmVzcywKLQkJCQkgICAgICAgJmdsdWUtPnNwYWNlLAotCQkJCSAgICAgICAmZ2x1ZS0+YWRkcmVzcywKLQkJCQkgICAgICAgbWUpOwotICAgIGlmIChnbHVlLT5hZGRyZXNzICUgKHNpemVvZiAodW5zaWduZWRfd29yZCkgKiBtYXhfbnJfcG9ydHMpICE9IDApCi0gICAgICBod19hYm9ydCAobWUsICJyZWcgcHJvcGVydHkgYWRkcmVzcyBtdXN0IGJlICVkIGFsaWduZWQiLAotCQlzaXplb2YgKHVuc2lnbmVkX3dvcmQpICogbWF4X25yX3BvcnRzKTsKLSAgICBnbHVlLT5ucl9vdXRwdXRzID0gZ2x1ZS0+c2l6ZW9mX291dHB1dCAvIHNpemVvZiAodW5zaWduZWRfd29yZCk7Ci0gICAgZ2x1ZS0+b3V0cHV0ID0gaHdfemFsbG9jIChtZSwgZ2x1ZS0+c2l6ZW9mX291dHB1dCk7Ci0gIH0KLSAgCi0gIC8qIGVzdGFibGlzaCB0aGUgaW5wdXQgcG9ydHMgKi8KLSAgewotICAgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqcmFuZ2VzOwotICAgIHJhbmdlcyA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAiaW50ZXJydXB0LXJhbmdlcyIpOwotICAgIGlmIChyYW5nZXMgPT0gTlVMTCkKLSAgICAgIHsKLQlnbHVlLT5pbnRfbnVtYmVyID0gMDsKLQlnbHVlLT5ucl9pbnB1dHMgPSBnbHVlLT5ucl9vdXRwdXRzOwotICAgICAgfQotICAgIGVsc2UgaWYgKHJhbmdlcy0+c2l6ZW9mX2FycmF5ICE9IHNpemVvZiAodW5zaWduZWRfY2VsbCkgKiAyKQotICAgICAgewotCWh3X2Fib3J0IChtZSwgImludmFsaWQgaW50ZXJydXB0LXJhbmdlcyBwcm9wZXJ0eSAoaW5jb3JyZWN0IHNpemUpIik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWNvbnN0IHVuc2lnbmVkX2NlbGwgKmludF9yYW5nZSA9IHJhbmdlcy0+YXJyYXk7Ci0JZ2x1ZS0+aW50X251bWJlciA9IEJFMkhfY2VsbCAoaW50X3JhbmdlWzBdKTsKLQlnbHVlLT5ucl9pbnB1dHMgPSBCRTJIX2NlbGwgKGludF9yYW5nZVsxXSk7Ci0gICAgICB9Ci0gICAgZ2x1ZS0+c2l6ZW9mX2lucHV0ID0gZ2x1ZS0+bnJfaW5wdXRzICogc2l6ZW9mICh1bnNpZ25lZCk7Ci0gICAgZ2x1ZS0+aW5wdXQgPSBod196YWxsb2MgKG1lLCBnbHVlLT5zaXplb2ZfaW5wdXQpOwotICB9Ci0gIAotICAvKiBkZXRlcm1pbmUgb3VyIHR5cGUgKi8KLSAgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBod19uYW1lKG1lKTsKLSAgICBpZiAoc3RyY21wIChuYW1lLCAiZ2x1ZSIpID09IDApCi0gICAgICBnbHVlLT50eXBlID0gZ2x1ZV9pbzsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJnbHVlLWFuZCIpID09IDApCi0gICAgICBnbHVlLT50eXBlID0gZ2x1ZV9hbmQ7Ci0gICAgZWxzZQotICAgICAgaHdfYWJvcnQgKG1lLCAidW5pbXBsZW1lbnRlZCBnbHVlIHR5cGUiKTsKLSAgfQotICAKLSAgSFdfVFJBQ0UgKChtZSwgImludC1udW1iZXIgJWQsIG5yX2lucHV0cyAlZCwgbnJfb3V0cHV0cyAlZCIsCi0JICAgICBnbHVlLT5pbnRfbnVtYmVyLCBnbHVlLT5ucl9pbnB1dHMsIGdsdWUtPm5yX291dHB1dHMpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1od19nbHVlX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJdm9pZCAqZGVzdCwKLQkJCWludCBzcGFjZSwKLQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXVuc2lnbmVkIG5yX2J5dGVzKQotewotICBzdHJ1Y3QgaHdfZ2x1ZSAqZ2x1ZSA9IChzdHJ1Y3QgaHdfZ2x1ZSAqKSBod19kYXRhIChtZSk7Ci0gIGludCByZWcgPSAoKGFkZHIgLSBnbHVlLT5hZGRyZXNzKSAvIHNpemVvZiAodW5zaWduZWRfd29yZCkpICUgZ2x1ZS0+bnJfb3V0cHV0czsKLSAgaWYgKG5yX2J5dGVzICE9IHNpemVvZiAodW5zaWduZWRfd29yZCkKLSAgICAgIHx8IChhZGRyICUgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSkgIT0gMCkKLSAgICBod19hYm9ydCAobWUsICJtaXNzYWxpZ25lZCByZWFkIGFjY2VzcyAoJWQ6MHglbHg6JWQpIG5vdCBzdXBwb3J0ZWQiLAotCSAgICAgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBucl9ieXRlcyk7Ci0gICoodW5zaWduZWRfd29yZCopZGVzdCA9IEgyQkVfNChnbHVlLT5vdXRwdXRbcmVnXSk7Ci0gIEhXX1RSQUNFICgobWUsICJyZWFkIC0gcG9ydCAlZCAoMHglbHgpLCBsZXZlbCAlZCIsCi0JICAgICByZWcsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBnbHVlLT5vdXRwdXRbcmVnXSkpOwotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1od19nbHVlX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgaW50IHNwYWNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IGh3X2dsdWUgKmdsdWUgPSAoc3RydWN0IGh3X2dsdWUgKikgaHdfZGF0YSAobWUpOwotICBpbnQgcmVnID0gKChhZGRyIC0gZ2x1ZS0+YWRkcmVzcykgLyBzaXplb2YgKHVuc2lnbmVkX3dvcmQpKSAlIG1heF9ucl9wb3J0czsKLSAgaWYgKG5yX2J5dGVzICE9IHNpemVvZiAodW5zaWduZWRfd29yZCkKLSAgICAgIHx8IChhZGRyICUgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSkgIT0gMCkKLSAgICBod19hYm9ydCAobWUsICJtaXNzYWxpZ25lZCB3cml0ZSBhY2Nlc3MgKCVkOjB4JWx4OiVkKSBub3Qgc3VwcG9ydGVkIiwKLQkgICAgICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIG5yX2J5dGVzKTsKLSAgZ2x1ZS0+b3V0cHV0W3JlZ10gPSBIMkJFXzQgKCoodW5zaWduZWRfd29yZCopc291cmNlKTsKLSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gcG9ydCAlZCAoMHglbHgpLCBsZXZlbCAlZCIsCi0JICAgICByZWcsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBnbHVlLT5vdXRwdXRbcmVnXSkpOwotICBod19wb3J0X2V2ZW50IChtZSwgcmVnLCBnbHVlLT5vdXRwdXRbcmVnXSk7Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotc3RhdGljIHZvaWQKLWh3X2dsdWVfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICAgIGludCBteV9wb3J0LAotCQkgICAgc3RydWN0IGh3ICpzb3VyY2UsCi0JCSAgICBpbnQgc291cmNlX3BvcnQsCi0JCSAgICBpbnQgbGV2ZWwpCi17Ci0gIHN0cnVjdCBod19nbHVlICpnbHVlID0gKHN0cnVjdCBod19nbHVlICopIGh3X2RhdGEgKG1lKTsKLSAgaW50IGk7Ci0gIGlmIChteV9wb3J0IDwgZ2x1ZS0+aW50X251bWJlcgotICAgICAgfHwgbXlfcG9ydCA+PSBnbHVlLT5pbnRfbnVtYmVyICsgZ2x1ZS0+bnJfaW5wdXRzKQotICAgIGh3X2Fib3J0IChtZSwgInBvcnQgJWQgb3V0c2lkZSBvZiB2YWxpZCByYW5nZSIsIG15X3BvcnQpOwotICBnbHVlLT5pbnB1dFtteV9wb3J0IC0gZ2x1ZS0+aW50X251bWJlcl0gPSBsZXZlbDsKLSAgc3dpdGNoIChnbHVlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGdsdWVfaW86Ci0gICAgICB7Ci0JaW50IHBvcnQgPSBteV9wb3J0ICUgZ2x1ZS0+bnJfb3V0cHV0czsKLQlnbHVlLT5vdXRwdXRbcG9ydF0gPSBsZXZlbDsKLQlIV19UUkFDRSAoKG1lLCAiaW5wdXQgLSBwb3J0ICVkICgweCVseCksIGxldmVsICVkIiwKLQkJICAgbXlfcG9ydCwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIGdsdWUtPmFkZHJlc3MgKyBwb3J0ICogc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwKLQkJICAgbGV2ZWwpKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIGdsdWVfYW5kOgotICAgICAgewotCWdsdWUtPm91dHB1dFswXSA9IGdsdWUtPmlucHV0WzBdOwotCWZvciAoaSA9IDE7IGkgPCBnbHVlLT5ucl9pbnB1dHM7IGkrKykKLQkgIGdsdWUtPm91dHB1dFswXSAmPSBnbHVlLT5pbnB1dFtpXTsKLQlIV19UUkFDRSAoKG1lLCAiYW5kIC0gcG9ydCAlZCwgbGV2ZWwgJWQgYXJyaXZlZCAtIG91dHB1dCAlZCIsCi0JCSAgIG15X3BvcnQsIGxldmVsLCBnbHVlLT5vdXRwdXRbMF0pKTsKLQlod19wb3J0X2V2ZW50IChtZSwgMCwgZ2x1ZS0+b3V0cHV0WzBdKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgewotCWh3X2Fib3J0IChtZSwgIm9wZXJhdG9yIG5vdCBpbXBsZW1lbnRlZCIpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBod19nbHVlX3BvcnRzW10gPSB7Ci0gIHsgImludCIsIDAsIG1heF9ucl9wb3J0cyB9LAotICB7IE5VTEwgfQotfTsKLQotCi1jb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl9nbHVlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAiZ2x1ZSIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7ICJnbHVlLWFuZCIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7ICJnbHVlLW5hbmQiLCBod19nbHVlX2ZpbmlzaCwgfSwKLSAgeyAiZ2x1ZS1vciIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7ICJnbHVlLXhvciIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7ICJnbHVlLW5vciIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7ICJnbHVlLW5vdCIsIGh3X2dsdWVfZmluaXNoLCB9LAotICB7IE5VTEwgfSwKLX07CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2R2LXBhbC5jIGIvc2ltL2NvbW1vbi9kdi1wYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxYmRlNy4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2R2LXBhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LDE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJzaW0taW8uaCIKLQotLyogTk9URTogcGFsIGlzIG5hdWdodHkgYW5kIGdydWJzIGFyb3VuZCBsb29raW5nIGF0IHRoaW5ncyBvdXRzaWRlIG9mCi0gICBpdHMgaW1tZWRpYXRlIGRvbWFpbiAqLwotI2luY2x1ZGUgImh3LXRyZWUuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLS8qIERFVklDRQotCi0gICAKLSAgIHBhbCAtIGdsdWUgbG9naWMgZGV2aWNlIGNvbnRhaW5pbmcgYXNzb3J0ZWQganVuawotCi0gICAKLSAgIERFU0NSSVBUSU9OCi0KLSAgIAotICAgVHlwaWNhbCBoYXJkd2FyZSBkZXBlbmRhbnQgaGFjay4gIFRoaXMgZGV2aWNlIGFsbG93cyB0aGUgZmlybXdhcmUKLSAgIHRvIGdhaW4gYWNjZXNzIHRvIGFsbCB0aGUgdGhpbmdzIHRoZSBmaXJtd2FyZSBuZWVkcyAoYnV0IHRoZSBPUwotICAgZG9lc24ndCkuCi0KLSAgIFRoZSBwYWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyByZWdpc3RlcnM6Ci0KLSAgIHwwCXJlc2V0IHJlZ2lzdGVyICh3cml0ZSwgOGJpdCkKLSAgIHw0CXByb2Nlc3NvciBpZCByZWdpc3RlciAocmVhZCwgOGJpdCkKLSAgIHw4CWludGVycnVwdCByZWdpc3RlciAoOCAtIHBvcnQsIDkgLSBsZXZlbCkgKHdyaXRlLCAxNmJpdCkKLSAgIHwxMglwcm9jZXNzb3IgY291bnQgcmVnaXN0ZXIgKHJlYWQsIDhiaXQpCi0KLSAgIHwxNgl0dHkgaW5wdXQgZmlmbyByZWdpc3RlciAocmVhZCwgOGJpdCkKLSAgIHwyMAl0dHkgaW5wdXQgc3RhdHVzIHJlZ2lzdGVyIChyZWFkLCA4Yml0KQotICAgfDI0CXR0eSBvdXRwdXQgZmlmbyByZWdpc3RlciAod3JpdGUsIDhiaXQpCi0gICB8MjgJdHR5IG91dHB1dCBzdGF0dXMgcmVnaXN0ZXIgKHJlYWQsIDhiaXQpCi0KLSAgIHwzMiAgY291bnRkb3duIHJlZ2lzdGVyIChyZWFkL3dyaXRlLCAzMmJpdCwgYmlnLWVuZGlhbikKLSAgIHwzNiAgY291bnRkb3duIHZhbHVlIHJlZ2lzdGVyIChyZWFkLCAzMmJpdCwgYmlnLWVuZGlhbikKLSAgIHw0MCAgdGltZXIgcmVnaXN0ZXIgKHJlYWQvd3JpdGUsIDMyYml0LCBiaWctZW5kaWFuKQotICAgfDQ0ICB0aW1lciB2YWx1ZSByZWdpc3RlciAocmVhZCwgMzJiaXQsIGJpZy1lbmRpYW4pCi0KLSAgIFJFU0VUICh3cml0ZSk6IGhhbHRzIHRoZSBzaW11bGF0b3IuICBUaGUgdmFsdWUgd3JpdHRlbiB0byB0aGUKLSAgIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYW4gZXhpdCBzdGF0dXMuCi0gICAKLSAgIFBST0NFU1NPUiBJRCAocmVhZCk6IHJldHVybnMgdGhlIHByb2Nlc3NvciBpZGVudGlmaWVyICgwIC4uIE4tMSkgb2YKLSAgIHRoZSBwcm9jZXNzb3IgcGVyZm9ybWluZyB0aGUgcmVhZC4KLSAgIAotICAgSU5URVJSVVBUICh3cml0ZSk6IFRoaXMgcmVnaXN0ZXIgbXVzdCBiZSB3cml0dGVuIHVzaW5nIGEgdHdvIGJ5dGUKLSAgIHN0b3JlLiAgVGhlIGxvdyBieXRlIHNwZWNpZmllcyBhIHBvcnQgYW5kIHRoZSB1cHBlciBieXRlIHNwZWNpZmllcwotICAgdGhlIGEgbGV2ZWwuICBMRVZFTCBpcyBkcml2ZW4gb24gdGhlIHNwZWNpZmllZCBwb3J0LiAgQnkKLSAgIGNvbnZlbnRpb24sIHRoZSBwYWwncyBpbnRlcnJ1cHQgcG9ydHMgKGludDAsIGludDEsIC4uLikgYXJlIHdpcmVkCi0gICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9jZXNzb3IncyBsZXZlbCBzZW5zYXRpdmUgZXh0ZXJuYWwKLSAgIGludGVycnVwdCBwaW4uICBFZzogQSB0d28gYnl0ZSB3cml0ZSB0byBhZGRyZXNzIDggb2YgMHgwMTAyCi0gICAoYmlnLWVuZGlhbikgd2lsbCByZXN1bHQgaW4gcHJvY2Vzc29yIDIncyBleHRlcm5hbCBpbnRlcnJ1cHQgcGluCi0gICBiZWluZyBhc3NlcnRlZC4KLQotICAgUFJPQ0VTU09SIENPVU5UIChyZWFkKTogcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHByb2Nlc3NvcnMKLSAgIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzaW11bGF0aW9uLgotCi0gICBUVFkgSU5QVVQgRklGTyAocmVhZCk6IGlmIHRoZSBUVFkgaW5wdXQgc3RhdHVzIHJlZ2lzdGVyIGluZGljYXRlcyBhCi0gICBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlIGJ5IGJlaW5nIG5vbnplcm8sIHJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlCi0gICBjaGFyYWN0ZXIgZnJvbSB0aGUgcGFsJ3MgdHR5IGlucHV0IHBvcnQuCi0KLSAgIFRUWSBPVVRQVVQgRklGTyAod3JpdGUpOiBpZiB0aGUgVFRZIG91dHB1dCBzdGF0dXMgcmVnaXN0ZXIKLSAgIGluZGljYXRlcyB0aGUgb3V0cHV0IGZpZm8gaXMgbm90IGZ1bGwgYnkgYmVpbmcgbm9uemVybywgb3V0cHV0cyB0aGUKLSAgIGNoYXJhY3RlciB3cml0dGVuIHRvIHRoZSB0dHkncyBvdXRwdXQgcG9ydC4KLQotICAgQ09VTkRPV04gKHJlYWQvd3JpdGUpOiBUaGUgY291bnRkb3duIHJlZ2lzdGVycyBwcm92aWRlIGEKLSAgIG5vbi1yZXBlYXRpbmcgdGltZWQgaW50ZXJydXB0IHNvdXJjZS4gIFdyaXRpbmcgYSAzMiBiaXQgYmlnLWVuZGlhbgotICAgemVybyB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIGNsZWFycyB0aGUgY291bnRkb3duIHRpbWVyLiAgV3JpdGluZyBhCi0gICBub24temVybyAzMiBiaXQgYmlnLWVuZGlhbiB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIHNldHMgdGhlCi0gICBjb3VudGRvd24gdGltZXIgdG8gZXhwaXJlIGluIFZBTFVFIHRpY2tzICh0aWNrcyBpcyB0YXJnZXQKLSAgIGRlcGVuZGFudCkuICBSZWFkaW5nIHRoZSBjb3VudGRvd24gcmVnaXN0ZXIgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZQotICAgd3JpdGVuLgotCi0gICBDT1VOVERPV04gVkFMVUUgKHJlYWQpOiBSZWFkaW5nIHRoaXMgMzIgYml0IGJpZy1lbmRpYW4gcmVnaXN0ZXIKLSAgIHJldHVybnMgdGhlIG51bWJlciBvZiB0aWNrcyByZW1haW5pbmcgdW50aWwgdGhlIGNvdW50ZG93biB0aW1lcgotICAgZXhwaXJlcy4KLQotICAgVElNRVIgKHJlYWQvd3JpdGUpOiBUaGUgdGltZXIgcmVnaXN0ZXJzIHByb3ZpZGUgYSBwZXJpb2RpYyB0aW1lZAotICAgaW50ZXJydXB0IHNvdXJjZS4gIFdyaXRpbmcgYSAzMiBiaXQgYmlnLWVuZGlhbiB6ZXJvIHZhbHVlIHRvIHRoaXMKLSAgIHJlZ2lzdGVyIGNsZWFycyB0aGUgcGVyaW9kaWMgdGltZXIuICBXcml0aW5nIGEgMzIgYml0IG5vbi16ZXJvCi0gICB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIHNldHMgdGhlIHBlcmlvZGljIHRpbWVyIHRvIHRyaWdlciBldmVyeQotICAgVkFMVUUgdGlja3MgKHRpY2tzIGlzIHRhcmdldCBkZXBlbmRhbnQpLiAgUmVhZGluZyB0aGUgdGltZXIKLSAgIHJlZ2lzdGVyIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbi4KLQotICAgVElNRVIgVkFMVUUgKHJlYWQpOiBSZWFkaW5nIHRoaXMgMzIgYml0IGJpZy1lbmRpYW4gcmVnaXN0ZXIgcmV0dXJucwotICAgdGhlIG51bWJlciBvZiB0aWNrcyB1bnRpbCB0aGUgbmV4dCBwZXJpb2RpYyBpbnRlcnJ1cHQuCi0KLQotICAgUFJPUEVSVElFUwotICAgCi0KLSAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gKHJlcXVpcmVkKQotCi0gICBTcGVjaWZ5IHRoZSBhZGRyZXNzICh3aXRoaW4gdGhlIHBhcmVudCBidXMpIHRoYXQgdGhpcyBkZXZpY2UgaXMgdG8KLSAgIGJlIGxvY2F0ZWQuCi0KLSAgIHBvbGw/ID0gPGJvb2xlYW4+Ci0KLSAgIElmIHByZXNlbnQgYW5kIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkIHBvbGwgaXRzCi0gICBpbnB1dC4KLQotCi0gICBQT1JUUwotCi0KLSAgIGludFswLi5OUl9QUk9DRVNTT1JTXSAob3V0cHV0KQotCi0gICBEcml2ZW4gYXMgYSByZXN1bHQgb2YgYSB3cml0ZSB0byB0aGUgaW50ZXJydXB0LXBvcnQgLwotICAgaW50ZXJydXB0LWxldmVsIHJlZ2lzdGVyIHBhaXIuCi0KLQotICAgY291bnRkb3duCi0KLSAgIERyaXZlbiB3aGVuZXZlciB0aGUgY291bnRkb3duIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLgotCi0KLSAgIHRpbWVyCi0KLSAgIERyaXZlbiB3aGVuZXZlciB0aGUgdGltZXIgY291bnRlciByZWFjaGVzIHplcm8uCi0KLQotICAgQlVHUwotCi0KLSAgIEF0IHByZXNlbnQgdGhlIGNvbW1vbiBzaW11bGF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IHN1cHBvcnQgaW5wdXQKLSAgIHBvbGxpbmcuCi0KLSAgICovCi0KLQotZW51bSB7Ci0gIGh3X3BhbF9yZXNldF9yZWdpc3RlciA9IDB4MCwKLSAgaHdfcGFsX2NwdV9ucl9yZWdpc3RlciA9IDB4NCwKLSAgaHdfcGFsX2ludF9yZWdpc3RlciA9IDB4OCwKLSAgaHdfcGFsX25yX2NwdV9yZWdpc3RlciA9IDB4YSwKLSAgaHdfcGFsX3JlYWRfZmlmbyA9IDB4MTAsCi0gIGh3X3BhbF9yZWFkX3N0YXR1cyA9IDB4MTQsCi0gIGh3X3BhbF93cml0ZV9maWZvID0gMHgxOCwKLSAgaHdfcGFsX3dyaXRlX3N0YXR1cyA9IDB4MWEsCi0gIGh3X3BhbF9jb3VudGRvd24gPSAweDIwLAotICBod19wYWxfY291bnRkb3duX3ZhbHVlID0gMHgyNCwKLSAgaHdfcGFsX3RpbWVyID0gMHgyOCwKLSAgaHdfcGFsX3RpbWVyX3ZhbHVlID0gMHgyYywKLSAgaHdfcGFsX2FkZHJlc3NfbWFzayA9IDB4M2YsCi19OwotCi0KLXR5cGVkZWYgc3RydWN0IF9od19wYWxfY29uc29sZV9idWZmZXIgewotICBjaGFyIGJ1ZmZlcjsKLSAgaW50IHN0YXR1czsKLX0gaHdfcGFsX2NvbnNvbGVfYnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdCBfaHdfcGFsX2NvdW50ZXIgewotICBzdHJ1Y3QgaHdfZXZlbnQgKmhhbmRsZXI7Ci0gIHNpZ25lZDY0IHN0YXJ0OwotICB1bnNpZ25lZDMyIGRlbHRhOwotICBpbnQgcGVyaW9kaWNfcDsKLX0gaHdfcGFsX2NvdW50ZXI7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X3BhbF9kZXZpY2UgewotICBod19wYWxfY29uc29sZV9idWZmZXIgaW5wdXQ7Ci0gIGh3X3BhbF9jb25zb2xlX2J1ZmZlciBvdXRwdXQ7Ci0gIGh3X3BhbF9jb3VudGVyIGNvdW50ZG93bjsKLSAgaHdfcGFsX2NvdW50ZXIgdGltZXI7Ci0gIHN0cnVjdCBodyAqZGlzazsKLSAgZG9faHdfcG9sbF9yZWFkX21ldGhvZCAqcmVhZGVyOwotfSBod19wYWxfZGV2aWNlOwotCi1lbnVtIHsKLSAgQ09VTlRET1dOX1BPUlQsCi0gIFRJTUVSX1BPUlQsCi0gIElOVF9QT1JULAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgaHdfcGFsX3BvcnRzW10gPSB7Ci0gIHsgImNvdW50ZG93biIsIENPVU5URE9XTl9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAidGltZXIiLCBUSU1FUl9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAiaW50IiwgSU5UX1BPUlQsIE1BWF9OUl9QUk9DRVNTT1JTLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyBOVUxMIH0KLX07Ci0KLQotLyogY291bnRkb3duIGFuZCBzaW1wbGUgdGltZXIgKi8KLQotc3RhdGljIHZvaWQKLWRvX2NvdW50ZXJfZXZlbnQgKHN0cnVjdCBodyAqbWUsCi0JCSAgdm9pZCAqZGF0YSkKLXsKLSAgaHdfcGFsX2NvdW50ZXIgKmNvdW50ZXIgPSAoaHdfcGFsX2NvdW50ZXIgKikgZGF0YTsKLSAgaWYgKGNvdW50ZXItPnBlcmlvZGljX3ApCi0gICAgewotICAgICAgSFdfVFJBQ0UgKChtZSwgInRpbWVyIGV4cGlyZWQiKSk7Ci0gICAgICBjb3VudGVyLT5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKTsKLSAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCBUSU1FUl9QT1JULCAxKTsKLSAgICAgIGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgY291bnRlci0+ZGVsdGEsIGRvX2NvdW50ZXJfZXZlbnQsIGNvdW50ZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEhXX1RSQUNFICgobWUsICJjb3VudGRvd24gZXhwaXJlZCIpKTsKLSAgICAgIGNvdW50ZXItPmRlbHRhID0gMDsKLSAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCBDT1VOVERPV05fUE9SVCwgMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fY291bnRlcl9yZWFkIChzdHJ1Y3QgaHcgKm1lLAotCQkgaHdfcGFsX2RldmljZSAqcGFsLAotCQkgY29uc3QgY2hhciAqcmVnLAotCQkgaHdfcGFsX2NvdW50ZXIgKmNvdW50ZXIsCi0JCSB1bnNpZ25lZDMyICp3b3JkLAotCQkgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMzIgdmFsOwotICBpZiAobnJfYnl0ZXMgIT0gNCkKLSAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCByZWFkIHNpemUgbXVzdCBiZSA0IGJ5dGVzIiwgcmVnKTsKLSAgdmFsID0gY291bnRlci0+ZGVsdGE7Ci0gIEhXX1RSQUNFICgobWUsICJyZWFkIC0gJXMgJWxkIiwgcmVnLCAobG9uZykgdmFsKSk7Ci0gICp3b3JkID0gSDJCRV80ICh2YWwpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY291bnRlcl92YWx1ZSAoc3RydWN0IGh3ICptZSwKLQkJICBod19wYWxfZGV2aWNlICpwYWwsCi0JCSAgY29uc3QgY2hhciAqcmVnLAotCQkgIGh3X3BhbF9jb3VudGVyICpjb3VudGVyLAotCQkgIHVuc2lnbmVkMzIgKndvcmQsCi0JCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMzIgdmFsOwotICBpZiAobnJfYnl0ZXMgIT0gNCkKLSAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCByZWFkIHNpemUgbXVzdCBiZSA0IGJ5dGVzIiwgcmVnKTsKLSAgaWYgKGNvdW50ZXItPmRlbHRhICE9IDApCi0gICAgdmFsID0gKGNvdW50ZXItPnN0YXJ0ICsgY291bnRlci0+ZGVsdGEKLQkgICAtIGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKSk7Ci0gIGVsc2UKLSAgICB2YWwgPSAwOwotICBIV19UUkFDRSAoKG1lLCAicmVhZCAtICVzICVsZCIsIHJlZywgKGxvbmcpIHZhbCkpOwotICAqd29yZCA9IEgyQkVfNCAodmFsKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NvdW50ZXJfd3JpdGUgKHN0cnVjdCBodyAqbWUsCi0JCSAgaHdfcGFsX2RldmljZSAqcGFsLAotCQkgIGNvbnN0IGNoYXIgKnJlZywKLQkJICBod19wYWxfY291bnRlciAqY291bnRlciwKLQkJICBjb25zdCB1bnNpZ25lZDMyICp3b3JkLAotCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBpZiAobnJfYnl0ZXMgIT0gNCkKLSAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCB3cml0ZSBzaXplIG11c3QgYmUgNCBieXRlcyIsIHJlZyk7Ci0gIGlmIChjb3VudGVyLT5oYW5kbGVyICE9IE5VTEwpCi0gICAgewotICAgICAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIGNvdW50ZXItPmhhbmRsZXIpOwotICAgICAgY291bnRlci0+aGFuZGxlciA9IE5VTEw7Ci0gICAgfQotICBjb3VudGVyLT5kZWx0YSA9IEJFMkhfNCAoKndvcmQpOwotICBjb3VudGVyLT5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKTsKLSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gJXMgJWxkIiwgcmVnLCAobG9uZykgY291bnRlci0+ZGVsdGEpKTsKLSAgaWYgKGNvdW50ZXItPmRlbHRhID4gMCkKLSAgICBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIGNvdW50ZXItPmRlbHRhLCBkb19jb3VudGVyX2V2ZW50LCBjb3VudGVyKTsKLX0KLQotCi0KLQotLyogY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGFuIGF2YWlsYWJsZSBjaGFyYWN0ZXIgKi8KLXN0YXRpYyB2b2lkCi1zY2FuX2h3X3BhbCAoc3RydWN0IGh3ICptZSkKLXsKLSAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UgKilod19kYXRhIChtZSk7Ci0gIGNoYXIgYzsKLSAgaW50IGNvdW50OwotICBjb3VudCA9IGRvX2h3X3BvbGxfcmVhZCAobWUsIGh3X3BhbC0+cmVhZGVyLCAwLypTVERJTiovLCAmYywgc2l6ZW9mKGMpKTsKLSAgc3dpdGNoIChjb3VudCkKLSAgICB7Ci0gICAgY2FzZSBIV19JT19OT1RfUkVBRFk6Ci0gICAgY2FzZSBIV19JT19FT0Y6Ci0gICAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IDA7Ci0gICAgICBod19wYWwtPmlucHV0LnN0YXR1cyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaHdfcGFsLT5pbnB1dC5idWZmZXIgPSBjOwotICAgICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSAxOwotICAgIH0KLX0KLQotLyogd3JpdGUgdGhlIGNoYXJhY3RlciB0byB0aGUgaHdfcGFsICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9od19wYWwgKHN0cnVjdCBodyAqbWUsCi0JICAgICAgY2hhciB2YWwpCi17Ci0gIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IChod19wYWxfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKLSAgc2ltX2lvX3dyaXRlX3N0ZG91dCAoaHdfc3lzdGVtIChtZSksICZ2YWwsIDEpOwotICBod19wYWwtPm91dHB1dC5idWZmZXIgPSB2YWw7Ci0gIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IDE7Ci19Ci0KLQotLyogUmVhZHMvd3JpdGVzICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfcGFsX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgICAgdm9pZCAqZGVzdCwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBod19wYWxfZGV2aWNlICpod19wYWwgPSAoaHdfcGFsX2RldmljZSAqKSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkXzEgKmJ5dGUgPSAodW5zaWduZWRfMSAqKSBkZXN0OwotICBtZW1zZXQgKGRlc3QsIDAsIG5yX2J5dGVzKTsKLSAgc3dpdGNoIChhZGRyICYgaHdfcGFsX2FkZHJlc3NfbWFzaykKLSAgICB7Ci0KLSAgICBjYXNlIGh3X3BhbF9jcHVfbnJfcmVnaXN0ZXI6Ci0jaWZkZWYgQ1BVX0lOREVYCi0gICAgICAqYnl0ZSA9IENQVV9JTkRFWCAoaHdfc3lzdGVtX2NwdSAobWUpKTsKLSNlbHNlCi0gICAgICAqYnl0ZSA9IDA7Ci0jZW5kaWYKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gY3B1LW5yICVkXG4iLCAqYnl0ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF9ucl9jcHVfcmVnaXN0ZXI6Ci0gICAgICBpZiAoaHdfdHJlZV9maW5kX3Byb3BlcnR5IChtZSwgIi9vcGVucHJvbS9vcHRpb25zL3NtcCIpID09IE5VTEwpCi0JewotCSAgKmJ5dGUgPSAxOwotCSAgSFdfVFJBQ0UgKChtZSwgInJlYWQgLSBuci1jcHUgJWQgKG5vdCBkZWZpbmVkKVxuIiwgKmJ5dGUpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmJ5dGUgPSBod190cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eSAobWUsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKLQkgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gbnItY3B1ICVkXG4iLCAqYnl0ZSkpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBod19wYWxfcmVhZF9maWZvOgotICAgICAgKmJ5dGUgPSBod19wYWwtPmlucHV0LmJ1ZmZlcjsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gaW5wdXQtZmlmbyAlZFxuIiwgKmJ5dGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBod19wYWxfcmVhZF9zdGF0dXM6Ci0gICAgICBzY2FuX2h3X3BhbCAobWUpOwotICAgICAgKmJ5dGUgPSBod19wYWwtPmlucHV0LnN0YXR1czsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gaW5wdXQtc3RhdHVzICVkXG4iLCAqYnl0ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF93cml0ZV9maWZvOgotICAgICAgKmJ5dGUgPSBod19wYWwtPm91dHB1dC5idWZmZXI7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIG91dHB1dC1maWZvICVkXG4iLCAqYnl0ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF93cml0ZV9zdGF0dXM6Ci0gICAgICAqYnl0ZSA9IGh3X3BhbC0+b3V0cHV0LnN0YXR1czsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gb3V0cHV0LXN0YXR1cyAlZFxuIiwgKmJ5dGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBod19wYWxfY291bnRkb3duOgotICAgICAgZG9fY291bnRlcl9yZWFkIChtZSwgaHdfcGFsLCAiY291bnRkb3duIiwKLQkJICAgICAgICZod19wYWwtPmNvdW50ZG93biwgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF9jb3VudGRvd25fdmFsdWU6Ci0gICAgICBkb19jb3VudGVyX3ZhbHVlIChtZSwgaHdfcGFsLCAiY291bnRkb3duLXZhbHVlIiwKLQkJCSZod19wYWwtPmNvdW50ZG93biwgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF90aW1lcjoKLSAgICAgIGRvX2NvdW50ZXJfcmVhZCAobWUsIGh3X3BhbCwgInRpbWVyIiwKLQkJICAgICAgICZod19wYWwtPnRpbWVyLCBkZXN0LCBucl9ieXRlcyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaHdfcGFsX3RpbWVyX3ZhbHVlOgotICAgICAgZG9fY291bnRlcl92YWx1ZSAobWUsIGh3X3BhbCwgInRpbWVyLXZhbHVlIiwKLQkJCSZod19wYWwtPnRpbWVyLCBkZXN0LCBucl9ieXRlcyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtID8/P1xuIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X3BhbF9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCi0JCQljb25zdCB2b2lkICpzb3VyY2UsCi0JCQlpbnQgc3BhY2UsCi0JCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQl1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UqKSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkXzEgKmJ5dGUgPSAodW5zaWduZWRfMSAqKSBzb3VyY2U7Ci0gIAotICBzd2l0Y2ggKGFkZHIgJiBod19wYWxfYWRkcmVzc19tYXNrKQotICAgIHsKLQotICAgIGNhc2UgaHdfcGFsX3Jlc2V0X3JlZ2lzdGVyOgotICAgICAgaHdfaGFsdCAobWUsIHNpbV9leGl0ZWQsIGJ5dGVbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF9pbnRfcmVnaXN0ZXI6Ci0gICAgICBod19wb3J0X2V2ZW50IChtZSwKLQkJICAgICBJTlRfUE9SVCArIGJ5dGVbMF0sIC8qcG9ydCovCi0JCSAgICAgKG5yX2J5dGVzID4gMSA/IGJ5dGVbMV0gOiAwKSk7IC8qIHZhbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGh3X3BhbF9yZWFkX2ZpZm86Ci0gICAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IGJ5dGVbMF07Ci0gICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBpbnB1dC1maWZvICVkXG4iLCBieXRlWzBdKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaHdfcGFsX3JlYWRfc3RhdHVzOgotICAgICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSBieXRlWzBdOwotICAgICAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gaW5wdXQtc3RhdHVzICVkXG4iLCBieXRlWzBdKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaHdfcGFsX3dyaXRlX2ZpZm86Ci0gICAgICB3cml0ZV9od19wYWwgKG1lLCBieXRlWzBdKTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIG91dHB1dC1maWZvICVkXG4iLCBieXRlWzBdKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaHdfcGFsX3dyaXRlX3N0YXR1czoKLSAgICAgIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IGJ5dGVbMF07Ci0gICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBvdXRwdXQtc3RhdHVzICVkXG4iLCBieXRlWzBdKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaHdfcGFsX2NvdW50ZG93bjoKLSAgICAgIGRvX2NvdW50ZXJfd3JpdGUgKG1lLCBod19wYWwsICJjb3VudGRvd24iLAotCQkJJmh3X3BhbC0+Y291bnRkb3duLCBzb3VyY2UsIG5yX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBod19wYWxfdGltZXI6Ci0gICAgICBkb19jb3VudGVyX3dyaXRlIChtZSwgaHdfcGFsLCAidGltZXIiLAotCQkJJmh3X3BhbC0+dGltZXIsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICB9Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi0vKiBpbnN0YW5jZXMgb2YgdGhlIGh3X3BhbCBzdHJ1Y3QgaHcgKi8KLQotI2lmIE5PVF9ZRVQKLXN0YXRpYyB2b2lkCi1od19wYWxfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrKGh3X2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgLyogbm90aGluZyB0byBkZWxldGUsIHRoZSBod19wYWwgaXMgYXR0YWNoZWQgdG8gdGhlIHN0cnVjdCBodyAqLwotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2lmIE5PVF9ZRVQKLXN0YXRpYyBpbnQKLWh3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrIChod19pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkgICAgICB2b2lkICpidWYsCi0JCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgRElUUkFDRSAocGFsLCAoInJlYWQgLSAlcyAoJWxkKSIsIChjb25zdCBjaGFyKikgYnVmLCAobG9uZyBpbnQpIGxlbikpOwotICByZXR1cm4gc2ltX2lvX3JlYWRfc3RkaW4gKGJ1ZiwgbGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgTk9UX1lFVAotc3RhdGljIGludAotaHdfcGFsX2luc3RhbmNlX3dyaXRlX2NhbGxiYWNrIChod19pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkJY29uc3Qgdm9pZCAqYnVmLAotCQkJCXVuc2lnbmVkX3dvcmQgbGVuKQotewotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqY2hwID0gYnVmOwotICBod19wYWxfZGV2aWNlICpod19wYWwgPSBod19pbnN0YW5jZV9kYXRhIChpbnN0YW5jZSk7Ci0gIERJVFJBQ0UgKHBhbCwgKCJ3cml0ZSAtICVzICglbGQpIiwgKGNvbnN0IGNoYXIqKSBidWYsIChsb25nIGludCkgbGVuKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICB3cml0ZV9od19wYWwgKGh3X3BhbCwgY2hwW2ldKTsKLSAgc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dCAoKTsKLSAgcmV0dXJuIGk7Ci19Ci0jZW5kaWYKLQotI2lmIE5PVF9ZRVQKLXN0YXRpYyBjb25zdCBod19pbnN0YW5jZV9jYWxsYmFja3MgaHdfcGFsX2luc3RhbmNlX2NhbGxiYWNrcyA9IHsKLSAgaHdfcGFsX2luc3RhbmNlX2RlbGV0ZV9jYWxsYmFjaywKLSAgaHdfcGFsX2luc3RhbmNlX3JlYWRfY2FsbGJhY2ssCi0gIGh3X3BhbF9pbnN0YW5jZV93cml0ZV9jYWxsYmFjaywKLX07Ci0jZW5kaWYKLQotI2lmIDAKLXN0YXRpYyBod19pbnN0YW5jZSAqCi1od19wYWxfY3JlYXRlX2luc3RhbmNlIChzdHJ1Y3QgaHcgKm1lLAotCQkJY29uc3QgY2hhciAqcGF0aCwKLQkJCWNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIHJldHVybiBod19jcmVhdGVfaW5zdGFuY2VfZnJvbSAobWUsIE5VTEwsCi0JCQkJICAgICAgaHdfZGF0YSAobWUpLAotCQkJCSAgICAgIHBhdGgsIGFyZ3MsCi0JCQkJICAgICAgJmh3X3BhbF9pbnN0YW5jZV9jYWxsYmFja3MpOwotfQotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWh3X3BhbF9hdHRhY2hfYWRkcmVzcyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgIGludCBsZXZlbCwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAotCQkgICAgICAgYWRkcmVzc193b3JkIG5yX2J5dGVzLAotCQkgICAgICAgc3RydWN0IGh3ICpjbGllbnQpCi17Ci0gIGh3X3BhbF9kZXZpY2UgKnBhbCA9IChod19wYWxfZGV2aWNlKikgaHdfZGF0YSAobWUpOwotICBwYWwtPmRpc2sgPSBjbGllbnQ7Ci19Ci0KLQotI2lmIDAKLXN0YXRpYyBod19jYWxsYmFja3MgY29uc3QgaHdfcGFsX2NhbGxiYWNrcyA9IHsKLSAgeyBnZW5lcmljX2h3X2luaXRfYWRkcmVzcywgfSwKLSAgeyBod19wYWxfYXR0YWNoX2FkZHJlc3MsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19wYWxfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssCi0gICAgICBod19wYWxfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIE5VTEwsIGh3X3BhbF9pbnRlcnJ1cHRfcG9ydHMgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgZ2VuZXJpY19od191bml0X2RlY29kZSwKLSAgICBnZW5lcmljX2h3X3VuaXRfZW5jb2RlLAotICAgIGdlbmVyaWNfaHdfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcywKLSAgICBnZW5lcmljX2h3X3NpemVfdG9fYXR0YWNoX3NpemUgfSwKLSAgaHdfcGFsX2NyZWF0ZV9pbnN0YW5jZSwKLX07Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotaHdfcGFsX2ZpbmlzaCAoc3RydWN0IGh3ICpodykKLXsKLSAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCi0gIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IEhXX1pBTExPQyAoaHcsIGh3X3BhbF9kZXZpY2UpOwotICBod19wYWwtPm91dHB1dC5zdGF0dXMgPSAxOwotICBod19wYWwtPm91dHB1dC5idWZmZXIgPSAnXDAnOwotICBod19wYWwtPmlucHV0LnN0YXR1cyA9IDA7Ci0gIGh3X3BhbC0+aW5wdXQuYnVmZmVyID0gJ1wwJzsKLSAgc2V0X2h3X2RhdGEgKGh3LCBod19wYWwpOwotICBzZXRfaHdfYXR0YWNoX2FkZHJlc3MgKGh3LCBod19wYWxfYXR0YWNoX2FkZHJlc3MpOwotICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKGh3LCBod19wYWxfaW9fcmVhZF9idWZmZXIpOwotICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChodywgaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od19wb3J0cyAoaHcsIGh3X3BhbF9wb3J0cyk7Ci0gIC8qIGF0dGFjaCBvdXJzZWx2ZXMgKi8KLSAgZG9faHdfYXR0YWNoX3JlZ3MgKGh3KTsKLSAgLyogSWYgc28gY29uZmlndXJlZCwgZW5hYmxlIHBvbGxlZCBpbnB1dCAqLwotICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAoaHcsICJwb2xsPyIpICE9IE5VTEwKLSAgICAgICYmIGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAoaHcsICJwb2xsPyIpKQotICAgIHsKLSAgICAgIGh3X3BhbC0+cmVhZGVyID0gc2ltX2lvX3BvbGxfcmVhZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBod19wYWwtPnJlYWRlciA9IHNpbV9pb19yZWFkOwotICAgIH0KLSAgLyogdGFnIHRoZSBwZXJpb2RpYyB0aW1lciAqLwotICBod19wYWwtPnRpbWVyLnBlcmlvZGljX3AgPSAxOwotfQotCi0KLWNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X3BhbF9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgInBhbCIsIGh3X3BhbF9maW5pc2gsIH0sCi0gIHsgTlVMTCB9LAotfTsKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZHYtc29ja3Nlci5jIGIvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDU3ZDQuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyogU2VyaWFsIHBvcnQgZW11bGF0aW9uIHVzaW5nIHNvY2tldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGSVhNRTogd2lsbCBvYnZpb3VzbHkgbmVlZCB0byBldm9sdmUuCi0gICAtIGNvbm5lY3Rpb25sZXNzIHNvY2tldHMgbWlnaHQgYmUgbW9yZSBhcHByb3ByaWF0ZS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2lmbmRlZiBfX0NZR1dJTjMyX18KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0jaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKLQotI2luY2x1ZGUgImR2LXNvY2tzZXIuaCIKLQwKLS8qIEdldCBkZWZpbml0aW9ucyBmb3IgYm90aCBPX05PTkJMT0NLIGFuZCBPX05ERUxBWS4gICovCi0KLSNpZm5kZWYgT19OREVMQVkKLSNpZmRlZiBGTkRFTEFZCi0jZGVmaW5lIE9fTkRFTEFZIEZOREVMQVkKLSNlbHNlIC8qICEgZGVmaW5lZCAoRk5ERUxBWSkgKi8KLSNkZWZpbmUgT19OREVMQVkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoRk5ERUxBWSkgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9fTkRFTEFZKSAqLwotCi0jaWZuZGVmIE9fTk9OQkxPQ0sKLSNpZmRlZiBGTkJMT0NLCi0jZGVmaW5lIE9fTk9OQkxPQ0sgRk5CTE9DSwotI2Vsc2UgLyogISBkZWZpbmVkIChGTkJMT0NLKSAqLwotI2RlZmluZSBPX05PTkJMT0NLIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEZOQkxPQ0spICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChPX05PTkJMT0NLKSAqLwotDAotI2RlZmluZSBNSU4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi0vKiBDb21wcm9taXNlIGJldHdlZW4gZWF0aW5nIGNwdSBhbmQgcHJvcGVybHkgYnVzeS13YWl0aW5nLgotICAgT25lIGNvdWxkIGhhdmUgYW4gb3B0aW9uIHRvIHNldCB0aGlzIGJ1dCBmb3Igbm93IHRoYXQgc2VlbXMKLSAgIGxpa2UgZmVhdHVyaXRpcy4gICovCi0jZGVmaW5lIERFRkFVTFRfVElNRU9VVCAxMDAwIC8qIG1pY3Jvc2Vjb25kcyAqLwotCi0vKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGFsbG9jYXRlZCBhdCBydW4gdGltZSBhbmQga2VwdCB3aXRoIG90aGVyIHNpbXVsYXRvcgotICAgc3RhdGUgKGR1aC4uLikuICBMYXRlci4gICovCi1jb25zdCBjaGFyICogc29ja3Nlcl9hZGRyID0gTlVMTDsKLS8qIFRpbWVvdXQgaW4gbWljcm9zZWNvbmRzIGR1cmluZyBzdGF0dXMgZmxhZyBjb21wdXRhdGlvbi4KLSAgIFNldHRpbmcgdGhpcyB0byB6ZXJvIGFjaGlldmVzIHByb3BlciBidXN5IHdhaXQgc2VtYW50aWNzIGJ1dCBlYXRzIGNwdS4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNvY2tzZXJfdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKLXN0YXRpYyBpbnQgc29ja3Nlcl9saXN0ZW5fZmQgPSAtMTsKLXN0YXRpYyBpbnQgc29ja3Nlcl9mZCA9IC0xOwotDAotLyogRklYTUU6IHVzZSB0cmVlIHByb3BlcnRpZXMgd2hlbiB0aGV5J3JlIHJlYWR5LiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgT1BUSU9OX0FERFIgPSBPUFRJT05fU1RBUlQKLX0gU09DS1NFUl9PUFRJT05TOwotCi1zdGF0aWMgREVDTEFSRV9PUFRJT05fSEFORExFUiAoc29ja3Nlcl9vcHRpb25faGFuZGxlcik7Ci0KLXN0YXRpYyBjb25zdCBPUFRJT04gc29ja3Nlcl9vcHRpb25zW10gPQotewotICB7IHsgInNvY2tzZXItYWRkciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQUREUiB9LAotICAgICAgJ1wwJywgIlNPQ0tFVCBBRERSRVNTIiwgIlNldCBzZXJpYWwgZW11bGF0aW9uIHNvY2tldCBhZGRyZXNzIiwKLSAgICAgIHNvY2tzZXJfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotc3RhdGljIFNJTV9SQwotc29ja3Nlcl9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKLQkJCWNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCi17Ci0gIHN3aXRjaCAob3B0KQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9BRERSIDoKLSAgICAgIHNvY2tzZXJfYWRkciA9IGFyZzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1zdGF0aWMgU0lNX1JDCi1kdl9zb2Nrc2VyX2luaXQgKFNJTV9ERVNDIHNkKQotewotICBzdHJ1Y3QgaG9zdGVudCAqaG9zdGVudDsKLSAgc3RydWN0IHNvY2thZGRyX2luIHNvY2thZGRyOwotICBjaGFyIGhvc3RuYW1lWzEwMF07Ci0gIGNvbnN0IGNoYXIgKnBvcnRfc3RyOwotICBpbnQgdG1wLHBvcnQ7Ci0KLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UCi0gICAgICB8fCBzb2Nrc2VyX2FkZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX09LOwotCi0gIGlmICgqc29ja3Nlcl9hZGRyID09ICcvJykKLSAgICB7Ci0gICAgICAvKiBzdXBwb3J0IGZvciB0aGVzZSBjYW4gY29tZSBsYXRlciAqLwotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAic29ja3NlciBpbml0OiB1bml4IGRvbWFpbiBzb2NrZXRzIG5vdCBzdXBwb3J0ZWQ6IGAlcydcbiIsCi0JCSAgICAgIHNvY2tzZXJfYWRkcik7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotCi0gIHBvcnRfc3RyID0gc3RyY2hyIChzb2Nrc2VyX2FkZHIsICc6Jyk7Ci0gIGlmICghcG9ydF9zdHIpCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAic29ja3NlciBpbml0OiBtaXNzaW5nIHBvcnQgbnVtYmVyOiBgJXMnXG4iLAotCQkgICAgICBzb2Nrc2VyX2FkZHIpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgdG1wID0gTUlOIChwb3J0X3N0ciAtIHNvY2tzZXJfYWRkciwgKGludCkgc2l6ZW9mIGhvc3RuYW1lIC0gMSk7Ci0gIHN0cm5jcHkgKGhvc3RuYW1lLCBzb2Nrc2VyX2FkZHIsIHRtcCk7Ci0gIGhvc3RuYW1lW3RtcF0gPSAnXDAwMCc7Ci0gIHBvcnQgPSBhdG9pIChwb3J0X3N0ciArIDEpOwotCi0gIGhvc3RlbnQgPSBnZXRob3N0YnluYW1lIChob3N0bmFtZSk7Ci0gIGlmICghIGhvc3RlbnQpCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAic29ja3NlciBpbml0OiB1bmtub3duIGhvc3Q6ICVzXG4iLAotCQkgICAgICBob3N0bmFtZSk7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotCi0gIHNvY2tzZXJfbGlzdGVuX2ZkID0gc29ja2V0IChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gIGlmIChzb2Nrc2VyX2xpc3Rlbl9mZCA8IDApCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAic29ja3NlciBpbml0OiB1bmFibGUgdG8gZ2V0IHNvY2tldDogJXNcbiIsCi0JCSAgICAgIHN0cmVycm9yIChlcnJubykpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLQotICBzb2NrYWRkci5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKLSAgc29ja2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgbWVtY3B5ICgmc29ja2FkZHIuc2luX2FkZHIuc19hZGRyLCBob3N0ZW50LT5oX2FkZHIsCi0JICBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSk7Ci0KLSAgdG1wID0gMTsKLSAgaWYgKHNldHNvY2tvcHQgKHNvY2tzZXJfbGlzdGVuX2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkKikmIHRtcCwgc2l6ZW9mKHRtcCkpIDwgMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IHVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSOiAlc1xuIiwKLQkJICAgICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotICBpZiAoYmluZCAoc29ja3Nlcl9saXN0ZW5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2thZGRyLCBzaXplb2YgKHNvY2thZGRyKSkgPCAwKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInNvY2tzZXIgaW5pdDogdW5hYmxlIHRvIGJpbmQgc29ja2V0IGFkZHJlc3M6ICVzXG4iLAotCQkgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGNsb3NlIChzb2Nrc2VyX2xpc3Rlbl9mZCk7Ci0gICAgICBzb2Nrc2VyX2xpc3Rlbl9mZCA9IC0xOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgaWYgKGxpc3RlbiAoc29ja3Nlcl9saXN0ZW5fZmQsIDEpIDwgMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IHVuYWJsZSB0byBzZXQgdXAgbGlzdGVuZXI6ICVzXG4iLAotCQkgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGNsb3NlIChzb2Nrc2VyX2xpc3Rlbl9mZCk7Ci0gICAgICBzb2Nrc2VyX2xpc3Rlbl9mZCA9IC0xOwotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHdyaXRlcyB0byBtaXNzaW5nIGNsaWVudCAtPiBTSUdQSVBFLgotICAgICA/Pz8gTmVlZCBhIGNlbnRyYWwgc2lnbmFsIG1hbmFnZW1lbnQgbW9kdWxlLiAgKi8KLSAgewotICAgIFJFVFNJR1RZUEUgKCpvcmlnKSAoKTsKLSAgICBvcmlnID0gc2lnbmFsIChTSUdQSVBFLCBTSUdfSUdOKTsKLSAgICAvKiBJZiBhIGhhbmRsZXIgaXMgYWxyZWFkeSBzZXQgdXAsIGRvbid0IG1lc3Mgd2l0aCBpdC4gICovCi0gICAgaWYgKG9yaWcgIT0gU0lHX0RGTCAmJiBvcmlnICE9IFNJR19JR04pCi0gICAgICBzaWduYWwgKFNJR1BJUEUsIG9yaWcpOwotICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotc3RhdGljIHZvaWQKLWR2X3NvY2tzZXJfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgaWYgKHNvY2tzZXJfbGlzdGVuX2ZkICE9IC0xKQotICAgIHsKLSAgICAgIGNsb3NlIChzb2Nrc2VyX2xpc3Rlbl9mZCk7Ci0gICAgICBzb2Nrc2VyX2xpc3Rlbl9mZCA9IC0xOwotICAgIH0KLSAgaWYgKHNvY2tzZXJfZmQgIT0gLTEpCi0gICAgewotICAgICAgY2xvc2UgKHNvY2tzZXJfZmQpOwotICAgICAgc29ja3Nlcl9mZCA9IC0xOwotICAgIH0KLX0KLQotU0lNX1JDCi1kdl9zb2Nrc2VyX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBpZiAoc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBzb2Nrc2VyX29wdGlvbnMpICE9IFNJTV9SQ19PSykKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBkdl9zb2Nrc2VyX2luaXQpOwotICBzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKHNkLCBkdl9zb2Nrc2VyX3VuaW5zdGFsbCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbm5lY3RlZF9wIChTSU1fREVTQyBzZCkKLXsKLSAgaW50IG51bWZkcyxmbGFnczsKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gIGZkX3NldCByZWFkZmRzOwotICBzdHJ1Y3Qgc29ja2FkZHIgc29ja2FkZHI7Ci0gIGludCBhZGRybGVuOwotCi0gIGlmIChzb2Nrc2VyX2xpc3Rlbl9mZCA9PSAtMSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoc29ja3Nlcl9mZCA+PSAwKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBoYXMgY2xpZW50IGdvbmUgYXdheT8gKi8KLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBOb3QgY29ubmVjdGVkLiAgQ29ubmVjdCB3aXRoIGEgY2xpZW50IGlmIHRoZXJlIGlzIG9uZS4gICovCi0KLSAgRkRfWkVSTyAoJnJlYWRmZHMpOwotICBGRF9TRVQgKHNvY2tzZXJfbGlzdGVuX2ZkLCAmcmVhZGZkcyk7Ci0KLSAgLyogPz8/IE9uZSBjYW4gY2VydGFpbmx5IGFyZ3VlIHRoaXMgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHksCi0gICAgIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3VmZmljaWVudC4gICovCi0gIHR2LnR2X3NlYyA9IDA7Ci0gIHR2LnR2X3VzZWMgPSBzb2Nrc2VyX3RpbWVvdXQ7Ci0KLSAgbnVtZmRzID0gc2VsZWN0IChzb2Nrc2VyX2xpc3Rlbl9mZCArIDEsICZyZWFkZmRzLCAwLCAwLCAmdHYpOwotICBpZiAobnVtZmRzIDw9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgYWRkcmxlbiA9IHNpemVvZiAoc29ja2FkZHIpOwotICBzb2Nrc2VyX2ZkID0gYWNjZXB0IChzb2Nrc2VyX2xpc3Rlbl9mZCwgJnNvY2thZGRyLCAmYWRkcmxlbik7Ci0gIGlmIChzb2Nrc2VyX2ZkIDwgMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgbm9uLWJsb2NraW5nIGkvby4gICovCi0gIGZsYWdzID0gZmNudGwgKHNvY2tzZXJfZmQsIEZfR0VURkwpOwotICBmbGFncyB8PSBPX05PTkJMT0NLIHwgT19OREVMQVk7Ci0gIGlmIChmY250bCAoc29ja3Nlcl9mZCwgRl9TRVRGTCwgZmxhZ3MpID09IC0xKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInVuYWJsZSB0byBzZXQgbm9uYmxvY2tpbmcgaS9vIik7Ci0gICAgICBjbG9zZSAoc29ja3Nlcl9mZCk7Ci0gICAgICBzb2Nrc2VyX2ZkID0gLTE7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWR2X3NvY2tzZXJfc3RhdHVzIChTSU1fREVTQyBzZCkKLXsKLSAgaW50IG51bXJmZHMsbnVtd2ZkcyxzdGF0dXM7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICBmZF9zZXQgcmVhZGZkcyx3cml0ZWZkczsKLQotICAvKiBzdGF0dXMgdG8gcmV0dXJuIGlmIHRoZSBzb2NrZXQgaXNuJ3Qgc2V0IHVwLCBvciBzZWxlY3QgZmFpbHMgKi8KLSAgc3RhdHVzID0gRFZfU09DS1NFUl9JTlBVVF9FTVBUWSB8IERWX1NPQ0tTRVJfT1VUUFVUX0VNUFRZOwotCi0gIGlmICghIGNvbm5lY3RlZF9wIChzZCkpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBGRF9aRVJPICgmcmVhZGZkcyk7Ci0gIEZEX1pFUk8gKCZ3cml0ZWZkcyk7Ci0gIEZEX1NFVCAoc29ja3Nlcl9mZCwgJnJlYWRmZHMpOwotICBGRF9TRVQgKHNvY2tzZXJfZmQsICZ3cml0ZWZkcyk7Ci0KLSAgLyogPz8/IE9uZSBjYW4gY2VydGFpbmx5IGFyZ3VlIHRoaXMgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHksCi0gICAgIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3VmZmljaWVudC4gIFRoZSByZWFkIGlzIGRvbmUgc2VwYXJhdGVseQotICAgICBmcm9tIHRoZSB3cml0ZSB0byBlbmZvcmNlIHRoZSBkZWxheSB3aGljaCB3ZSBoZXVyaXN0aWNhbGx5IHNldCB0bwotICAgICBvbmNlIGV2ZXJ5IFNPQ0tTRVJfVElNRU9VVF9GUkVRIHRyaWVzLgotICAgICBObywgdGhpcyBpc24ndCBncmVhdCBmb3IgU01QIHNpdHVhdGlvbnMsIGJsYWggYmxhaCBibGFoLiAgKi8KLQotICB7Ci0gICAgc3RhdGljIGludCBuOwotI2RlZmluZSBTT0NLU0VSX1RJTUVPVVRfRlJFUSA0MgotICAgIGlmICgrK24gPT0gU09DS1NFUl9USU1FT1VUX0ZSRVEpCi0gICAgICBuID0gMDsKLSAgICBpZiAobiA9PSAwKQotICAgICAgewotCXR2LnR2X3NlYyA9IDA7Ci0JdHYudHZfdXNlYyA9IHNvY2tzZXJfdGltZW91dDsKLQludW1yZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgJnJlYWRmZHMsIDAsIDAsICZ0dik7Ci0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQludW13ZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgMCwgJndyaXRlZmRzLCAwLCAmdHYpOwotICAgICAgfQotICAgIGVsc2UgLyogZG8gYm90aCBzZWxlY3RzIGF0IG9uY2UgKi8KLSAgICAgIHsKLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCW51bXJmZHMgPSBudW13ZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgMCwgJnR2KTsKLSAgICAgIH0KLSAgfQotCi0gIHN0YXR1cyA9IDA7Ci0gIGlmIChudW1yZmRzIDw9IDAgfHwgISBGRF9JU1NFVCAoc29ja3Nlcl9mZCwgJnJlYWRmZHMpKQotICAgIHN0YXR1cyB8PSBEVl9TT0NLU0VSX0lOUFVUX0VNUFRZOwotICBpZiAobnVtd2ZkcyA8PSAwIHx8IEZEX0lTU0VUIChzb2Nrc2VyX2ZkLCAmd3JpdGVmZHMpKQotICAgIHN0YXR1cyB8PSBEVl9TT0NLU0VSX09VVFBVVF9FTVBUWTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotaW50Ci1kdl9zb2Nrc2VyX3dyaXRlIChTSU1fREVTQyBzZCwgdW5zaWduZWQgY2hhciBjKQotewotICBpbnQgbjsKLQotICBpZiAoISBjb25uZWN0ZWRfcCAoc2QpKQotICAgIHJldHVybiAtMTsKLSAgbiA9IHdyaXRlIChzb2Nrc2VyX2ZkLCAmYywgMSk7Ci0gIGlmIChuID09IC0xKQotICAgIHsKLSAgICAgIGlmIChlcnJubyA9PSBFUElQRSkKLQl7Ci0JICBjbG9zZSAoc29ja3Nlcl9mZCk7Ci0JICBzb2Nrc2VyX2ZkID0gLTE7Ci0JfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKG4gIT0gMSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWR2X3NvY2tzZXJfcmVhZCAoU0lNX0RFU0Mgc2QpCi17Ci0gIHVuc2lnbmVkIGNoYXIgYzsKLSAgaW50IG47Ci0KLSAgaWYgKCEgY29ubmVjdGVkX3AgKHNkKSkKLSAgICByZXR1cm4gLTE7Ci0gIG4gPSByZWFkIChzb2Nrc2VyX2ZkLCAmYywgMSk7Ci0gIC8qID8/PyBXZSdyZSBhc3N1bWluZyBzZW1hbnRpY3MgdGhhdCBtYXkgbm90IGJlIGNvcnJlY3QgZm9yIGFsbCBob3N0cy4KLSAgICAgSW4gcGFydGljdWxhciAoZnJvbSBjdnNzcmMvc3JjL3NlcnZlci5jKSwgdGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIEJTRCBvciBQT1NJWCBub25ibG9ja2luZyBJL08uICBTeXN0ZW0gViBub25ibG9ja2luZyBJL08gcmV0dXJucyB6ZXJvIGlmCi0gICAgIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVhZC4gICovCi0gIGlmIChuID09IDApCi0gICAgewotICAgICAgY2xvc2UgKHNvY2tzZXJfZmQpOwotICAgICAgc29ja3Nlcl9mZCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKG4gIT0gMSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiBjOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmggYi9zaW0vY29tbW9uL2R2LXNvY2tzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYTdhOS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2R2LXNvY2tzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIFNlcmlhbCBwb3J0IGVtdWxhdGlvbiB2aWEgc29ja2V0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBEVl9TT0NLU0VSX0gKLSNkZWZpbmUgRFZfU09DS1NFUl9ICi0KLS8qIGJpdHMgaW4gcmVzdWx0IG9mIGRldl9zb2Nrc2VyX3N0YXR1cyAqLwotI2RlZmluZSBEVl9TT0NLU0VSX0lOUFVUX0VNUFRZICAxCi0jZGVmaW5lIERWX1NPQ0tTRVJfT1VUUFVUX0VNUFRZIDIKLQotLyogRklYTUU6IGxhdGVyIGFkZCBhIGRldmljZSBwdHIgYXJnICovCi1leHRlcm4gaW50IGR2X3NvY2tzZXJfc3RhdHVzIChTSU1fREVTQyk7Ci1pbnQgZHZfc29ja3Nlcl93cml0ZSAoU0lNX0RFU0MsIHVuc2lnbmVkIGNoYXIpOwotaW50IGR2X3NvY2tzZXJfcmVhZCAoU0lNX0RFU0MpOwotCi0jZW5kaWYgLyogRFZfU09DS1NFUl9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2dkYmluaXQuaW4gYi9zaW0vY29tbW9uL2dkYmluaXQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZGEzNDQuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9nZGJpbml0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYnJlYWsgc2ltX2lvX2Vycm9yCi0KLWRlZmluZSBkdW1wCi1zZXQgc2ltX2RlYnVnX2R1bXAgKCkKLWVuZAotCi1kb2N1bWVudCBkdW1wCi1EdW1wIGNwdSBhbmQgc2ltdWxhdG9yIHJlZ2lzdGVycyBmb3IgZGVidWdnaW5nIHRoZSBzaW11bGF0b3IuCi1SZXF1aXJlcyB0aGUgc2ltdWxhdG9yIHRvIHByb3ZpZGUgZnVuY3Rpb24gc2ltX2RlYnVnX2R1bXAuCi1lbmQKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZ2VubWxvb3Auc2ggYi9zaW0vY29tbW9uL2dlbm1sb29wLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2UxN2IwLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vZ2VubWxvb3Auc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE1ICswLDAgQEAKLSMgR2VuZXJhdGUgdGhlIG1haW4gbG9vcCBvZiB0aGUgc2ltdWxhdG9yLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFRoaXMgZmlsZSBjcmVhdGVzIHR3byBmaWxlczogZW5nLmhpbiBhbmQgbWxvb3AuY2luLgotIyBlbmcuaGluIGRlZmluZXMgYSBmZXcgbWFjcm9zIHRoYXQgc3BlY2lmeSB3aGF0IGtpbmQgb2YgZW5naW5lIHdhcyBzZWxlY3RlZAotIyBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIHRvIHRoaXMgc2NyaXB0LgotIyBtbG9vcC5jaW4gY29udGFpbnMgdGhlIGVuZ2luZS4KLSMKLSMgPz8/IFJlbmFtZSBtbG9vcC5jIHRvIGVuZy5jPwotIyA/Pz8gUmVuYW1lIG1haW5sb29wLmluIHRvIGVuZ2luZS5pbj8KLSMgPz8/IEFkZCBvcHRpb25zIHRvIHNwZWNpZnkgb3V0cHV0IGZpbGUgbmFtZXM/Ci0jID8/PyBSZW5hbWUgdGhpcyBmaWxlIHRvIGdlbmVuZ2luZS5zaD8KLSMKLSMgU3ludGF4OiBnZW5tbG9vcC5zaCBbb3B0aW9uc10KLSMKLSMgT3B0aW9uczoKLSMKLSMgLW1vbm8gfCAtbXVsdGkKLSMgICAgLSBzcGVjaWZ5IHNpbmdsZSBjcHUgb3IgbXVsdGlwbGUgY3B1cyAobnVtYmVyIHNwZWNpZnlhYmxlIGF0IHJ1bnRpbWUpLAotIyAgICAgIG1heGltdW0gbnVtYmVyIGlzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKLSMgICAgLSAtbXVsdGkgd2lwCi0jCi0jIC1mYXN0OiBpbmNsdWRlIHN1cHBvcnQgZm9yIGZhc3QgZXhlY3V0aW9uIGluIGFkZGl0aW9uIHRvIGZ1bGwgZmVhdHVyZWQgbW9kZQotIwotIwlGdWxsIGZlYXR1cmVkIG1vZGUgaXMgZm9yIHRyYWNpbmcsIHByb2ZpbGluZywgZXRjLiBhbmQgaXMgYWx3YXlzCi0jCXByb3ZpZGVkLiAgRmFzdCBtb2RlIGNvbnRhaW5zIG5vIGZyaWxscywgZXhjZXB0IHNwZWVkLgotIwlBIHRhcmdldCBuZWVkIG9ubHkgcHJvdmlkZSBhICJmdWxsIiB2ZXJzaW9uIG9mIG9uZSBvZgotIwlzaW1wbGUsc2NhY2hlLHBiYi4gIElmIHRoZSB0YXJnZXQgd2FudHMgaXQgY2FuIGFsc28gcHJvdmlkZSBhIGZhc3QKLSMJdmVyc2lvbiBvZiBzYW1lLiAgSXQgY2FuJ3QgcHJvdmlkZSBtb3JlIHRoYW4gdGhpcy4KLSMJPz8/IExhdGVyIGFkZCBhYmlsaXR5IHRvIGhhdmUgYW5vdGhlciBzZXQgb2YgZnVsbC9mYXN0IHNlbWFudGljcwotIwlmb3IgdXNlIGluIHdpdGgtZGV2aWNlcy93aXRoLXNtcCBzaXR1YXRpb25zIChwYmIgY2FuIGJlIGluYXBwcm9wcmlhdGUKLSMJaGVyZSkuCi0jCi0jIC1mdWxsLXN3aXRjaDogc2FtZSBhcyAtZmFzdCBidXQgZm9yIGZ1bGwgZmVhdHVyZWQgdmVyc2lvbiBvZiAtc3dpdGNoCi0jCU9ubHkgbmVlZGVkIGlmIC1mYXN0IHByZXNlbnQuCi0jCi0jIC1zaW1wbGU6IHNpbXBsZSBleGVjdXRpb24gZW5naW5lICh0aGUgZGVmYXVsdCkKLSMKLSMJVGhpcyBlbmdpbmUgZmV0Y2hlcyBhbmQgZXhlY3V0ZXMgb25lIGluc3RydWN0aW9uIGF0IGEgdGltZS4KLSMJRmllbGQgZXh0cmFjdGlvbiBpcyBkb25lIGluIHRoZSBzZW1hbnRpYyByb3V0aW5lcy4KLSMKLSMJPz8/IFRoZXJlIGFyZSB0d28gcG9zc2libGUgZmxhdm91cnMgb2YgLXNpbXBsZS4gIE9uZSB0aGF0IGV4dHJhY3RzCi0jCWZpZWxkcyBpbiB0aGUgc2VtYW50aWMgcm91dGluZSAod2hpY2ggaXMgd2hhdCBpcyBpbXBsZW1lbnRlZCBoZXJlKSwKLSMJYW5kIG9uZSB0aGF0IHN0b3JlcyB0aGUgZXh0cmFjdGVkIGZpZWxkcyBpbiBBUkdCVUYgYmVmb3JlIGNhbGxpbmcgdGhlCi0jCXNlbWFudGljIHJvdXRpbmUuICBUaGUgbGF0dGVyIGlzIGVzc2VudGlhbGx5IHRoZSAtc2NhY2hlIGNhc2Ugd2l0aCBhCi0jCWNhY2hlIHNpemUgb2Ygb25lIChhbmQgdGhlIHNjYWNoZSBsb29rdXAgY29kZSByZW1vdmVkKS4gIFRoZXJlIGFyZSBubwotIwljdXJyZW50IHVzZXMgb2YgdGhpcyBhbmQgaXQncyBub3QgY2xlYXIgd2hlbiBkb2luZyB0aGlzIHdvdWxkIGJlIGEgd2luLgotIwlNb3JlIGNvbXBsaWNhdGVkIElTQSdzIHRoYXQgd2FudCB0byB1c2UgLXNpbXBsZSBtYXkgZmluZCB0aGlzIGEgd2luLgotIwlTaG91bGQgdGhpcyBldmVyIGJlIGRlc2lyYWJsZSwgaW1wbGVtZW50IGEgbmV3IGVuZ2luZSBzdHlsZSBoZXJlIGFuZAotIwljYWxsIGl0IC1leHRyYWN0IChvciBzb21lIHN1Y2gpLiAgSXQncyBiZWxpZXZlZCB0aGF0IHRoZSBDR0VOLWdlbmVyYXRlZAotIwljb2RlIGZvciB0aGUgLXNjYWNoZSBjYXNlIHdvdWxkIGJlIHVzYWJsZSBoZXJlLCBzbyBubyBuZXcgY29kZQotIwlnZW5lcmF0aW9uIG9wdGlvbiB3b3VsZCBiZSBuZWVkZWQgZm9yIENHRU4uCi0jCi0jIC1zY2FjaGU6IHVzZSB0aGUgc2NhY2hlIHRvIHNwZWVkIHRoaW5ncyB1cCAobm90IGFsd2F5cyBhIHdpbikKLSMKLSMJVGhpcyBlbmdpbmUgY2FjaGVzIHRoZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb24gYmVmb3JlIGV4ZWN1dGluZyBpdC4KLSMJV2hlbiBleGVjdXRpbmcgaW5zdHJ1Y3Rpb25zIHRoZXkgYXJlIGZpcnN0IGxvb2tlZCB1cCBpbiB0aGUgc2NhY2hlLgotIwotIyAtcGJiOiBzYW1lIGFzIC1zY2FjaGUgYnV0IGV4dHJhY3QgYSAocHNldWRvLSkgYmFzaWMgYmxvY2sgYXQgYSB0aW1lCi0jCi0jCVRoaXMgZW5naW5lIGlzIGJhc2ljYWxseSBpZGVudGljYWwgdG8gdGhlIHNjYWNoZSB2ZXJzaW9uIGV4Y2VwdCB0aGF0Ci0jCWV4dHJhY3Rpb24gaXMgZG9uZSBhIHBzZXVkby1iYXNpYy1ibG9jayBhdCBhIHRpbWUgYW5kIHRoZSBhZGRyZXNzIG9mCi0jCXRoZSBzY2FjaGUgZW50cnkgb2YgYSBicmFuY2ggdGFyZ2V0IGlzIHJlY29yZGVkIGFzIHdlbGwuCi0jCUFkZGl0aW9uYWwgc3BlZWR1cHMgYXJlIHRoZW4gcG9zc2libGUgYnkgZGVmZXJpbmcgQ3RybC1DIGNoZWNraW5nCi0jCXRvIHRoZSBlbmQgb2YgYmFzaWMgYmxvY2tzIGFuZCBieSB0aHJlYWRpbmcgdGhlIGluc25zIHRvZ2V0aGVyLgotIwlXZSBjYWxsIHRoZW0gcHNldWRvLWJhc2ljLWJsb2NrJ3MgaW5zdGVhZCBvZiBqdXN0IGJhc2ljLWJsb2NrcyBiZWNhdXNlCi0jCXRoZXkncmUgbm90IG5lY2Vzc2FyaWx5IGJhc2ljLWJsb2NrcywgdGhvdWdoIG5vcm1hbGx5IGFyZS4KLSMKLSMgLXBhcmFsbGVsLXJlYWQ6IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggcmVhZC1iZWZvcmUtZXhlYyBzdXBwb3J0LgotIyAtcGFyYWxsZWwtd3JpdGU6IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggd3JpdGUtYWZ0ZXItZXhlYyBzdXBwb3J0LgotIyAtcGFyYWxsZWwtZ2VuZXJpYy13cml0ZTogc3VwcG9ydCBwYXJhbGxlbCBleGVjdXRpb24gd2l0aCBnZW5lcmljIHF1ZXVlZAotIyAgICAgICB3cml0ZXMuCi0jCi0jCU9uZSBvZiB0aGVzZSBvcHRpb25zIGlzIHNwZWNpZmllZCBpbiBhZGRpdGlvbiB0byAtc2ltcGxlLCAtc2NhY2hlLAotIwktcGJiLiAgTm90ZSB0aGF0IHdoaWxlIHRoZSBjb2RlIGNhbiBkZXRlcm1pbmUgaWYgdGhlIGNwdSBzdXBwb3J0cwotIwlwYXJhbGxlbCBleGVjdXRpb24gd2l0aCBIQVZFX1BBUkFMTEVMX0lOU05TIFthbmQgdGh1cyB0aGlzIG9wdGlvbiBpcwotIwl0ZWNobmljYWxseSB1bm5lY2Vzc2FyeV0sIGhhdmluZyB0aGlzIG9wdGlvbiBjdXRzIGRvd24gb24gdGhlIGNsdXR0ZXIKLSMJaW4gdGhlIHJlc3VsdC4KLSMKLSMgLXBhcmFsbGVsLW9ubHk6IHNlbWFudGljIGNvZGUgb25seSBzdXBwb3J0cyBwYXJhbGxlbCB2ZXJzaW9uIG9mIGluc24KLSMKLSMJU2VtYW50aWMgY29kZSBvbmx5IHN1cHBvcnRzIHBhcmFsbGVsIHZlcnNpb25zIG9mIGVhY2ggaW5zbi4KLSMJVGhpbmdzIGNhbiBiZSBzcGVkIHVwIGJ5IGdlbmVyYXRpbmcgYm90aCBzZXJpYWwgYW5kIHBhcmFsbGVsIHZlcnNpb25zCi0jCWFuZCBpcyBiZXR0ZXIgc3VpdGVkIHRvIG1peGVkIHBhcmFsbGVsIGFyY2hpdGVjdHVyZXMgbGlrZSB0aGUgbTMyci4KLSMKLSMgLXN3aXRjaCBmaWxlOiBzcGVjaWZ5IGZpbGUgY29udGFpbmluZyBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgYXMgYSBzd2l0Y2goKQotIwotIyAtY3B1IDxjcHUtZmFtaWx5PgotIwotIwlTcGVjaWZ5IHRoZSBjcHUgZmFtaWx5IG5hbWUuCi0jCi0jIC1pbmZpbGUgPGlucHV0LWZpbGU+Ci0jCi0jCVNwZWNpZnkgdGhlIG1haW5sb29wLmluIGlucHV0IGZpbGUuCi0jCi0jIE9ubHkgb25lIG9mIC1zY2FjaGUvLXBiYiBtYXkgYmUgc2VsZWN0ZWQuCi0jIC1zaW1wbGUgaXMgdGhlIGRlZmF1bHQuCi0jCi0jIyMjCi0jCi0jIFRPRE8KLSMgLSBidWlsZCBtYWlubG9vcC5pbiBmcm9tIC5jcHUgZmlsZQotCi10eXBlPW1vbm8KLSNzY2FjaGU9Ci0jZmFzdD0KLSNmdWxsX3N3aXRjaD0KLSNwYmI9Ci1wYXJhbGxlbD1ubwotcGFyYWxsZWxfb25seT1ubwotc3dpdGNoPQotY3B1PSJ1bmtub3duIgotaW5maWxlPSIiCi0KLXdoaWxlIHRlc3QgJCMgLWd0IDAKLWRvCi0JY2FzZSAkMSBpbgotCS1tb25vKSB0eXBlPW1vbm8gOzsKLQktbXVsdGkpIHR5cGU9bXVsdGkgOzsKLQktbm8tZmFzdCkgOzsKLQktZmFzdCkgZmFzdD15ZXMgOzsKLQktZnVsbC1zd2l0Y2gpIGZ1bGxfc3dpdGNoPXllcyA7OwotCS1zaW1wbGUpIDs7Ci0JLXNjYWNoZSkgc2NhY2hlPXllcyA7OwotCS1wYmIpIHBiYj15ZXMgOzsKLQktbm8tcGFyYWxsZWwpIDs7Ci0JLXBhcmFsbGVsLXJlYWQpIHBhcmFsbGVsPXJlYWQgOzsKLQktcGFyYWxsZWwtd3JpdGUpIHBhcmFsbGVsPXdyaXRlIDs7Ci0JLXBhcmFsbGVsLWdlbmVyaWMtd3JpdGUpIHBhcmFsbGVsPWdlbndyaXRlIDs7Ci0JLXBhcmFsbGVsLW9ubHkpIHBhcmFsbGVsX29ubHk9eWVzIDs7Ci0JLXN3aXRjaCkgc2hpZnQgOyBzd2l0Y2g9JDEgOzsKLQktY3B1KSBzaGlmdCA7IGNwdT0kMSA7OwotCS1pbmZpbGUpIHNoaWZ0IDsgaW5maWxlPSQxIDs7Ci0JKikgZWNobyAidW5rbm93biBvcHRpb246ICQxIiA+JjIgOyBleGl0IDEgOzsKLQllc2FjCi0Jc2hpZnQKLWRvbmUKLQotIyBBcmd1bWVudCB2YWxpZGF0aW9uLgotCi1pZiBbIHgkc2NhY2hlID0geHllcyAtYSB4JHBiYiA9IHh5ZXMgXSA7IHRoZW4KLSAgICBlY2hvICJvbmx5IG9uZSBvZiAtc2NhY2hlIGFuZCAtcGJiIG1heSBiZSBzZWxlY3RlZCIgPiYyCi0gICAgZXhpdCAxCi1maQotCi1pZiBbICJ4JGNwdSIgPSB4dW5rbm93biBdIDsgdGhlbgotICAgIGVjaG8gImNwdSBmYW1pbHkgbm90IHNwZWNpZmllZCIgPiYyCi0gICAgZXhpdCAxCi1maQotCi1pZiBbICJ4JGluZmlsZSIgPSB4IF0gOyB0aGVuCi0gICAgZWNobyAibWFpbmxvb3AuaW4gbm90IHNwZWNpZmllZCIgPiYyCi0gICAgZXhpdCAxCi1maQotCi1sb3dlcmNhc2U9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotdXBwZXJjYXNlPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLUNQVT1gZWNobyAke2NwdX0gfCB0ciAiJHtsb3dlcmNhc2V9IiAiJHt1cHBlcmNhc2V9ImAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcm0gLWYgZW5nLmhpbgotZXhlYyAxPmVuZy5oaW4KLQotZWNobyAiLyogZW5naW5lIGNvbmZpZ3VyYXRpb24gZm9yICR7Y3B1fSAqLyIKLWVjaG8gIiIKLQotZWNobyAiLyogV0lUSF9GQVNUOiBub24temVybyBpZiBhIGZhc3QgdmVyc2lvbiBvZiB0aGUgZW5naW5lIGlzIGF2YWlsYWJsZSIKLWVjaG8gIiAgIGluIGFkZGl0aW9uIHRvIHRoZSBmdWxsLWZlYXR1cmVkIHZlcnNpb24uICAqLyIKLWlmIFsgeCRmYXN0ID0geHllcyBdIDsgdGhlbgotCWVjaG8gIiNkZWZpbmUgV0lUSF9GQVNUIDEiCi1lbHNlCi0JZWNobyAiI2RlZmluZSBXSVRIX0ZBU1QgMCIKLWZpCi0KLWVjaG8gIiIKLWVjaG8gIi8qIFdJVEhfU0NBQ0hFX1BCQl8ke0NQVX06IG5vbi16ZXJvIGlmIHRoZSBwYmIgZW5naW5lIHdhcyBzZWxlY3RlZC4gICovIgotaWYgWyB4JHBiYiA9IHh5ZXMgXSA7IHRoZW4KLQllY2hvICIjZGVmaW5lIFdJVEhfU0NBQ0hFX1BCQl8ke0NQVX0gMSIKLWVsc2UKLQllY2hvICIjZGVmaW5lIFdJVEhfU0NBQ0hFX1BCQl8ke0NQVX0gMCIKLWZpCi0KLWVjaG8gIiIKLWVjaG8gIi8qIEhBVkVfUEFSQUxMRUxfSU5TTlM6IG5vbi16ZXJvIGlmIGNwdSBjYW4gcGFyYWxsZWxseSBleGVjdXRlID4gMSBpbnNuLiAgKi8iCi0jIGJsYWggYmxhaCBibGFoLCBvdGhlciB3YXlzIHRvIGRvIHRoaXMsIGJsYWggYmxhaCBibGFoCi1jYXNlIHgkcGFyYWxsZWwgaW4KLXhubykKLSAgICBlY2hvICIjZGVmaW5lIEhBVkVfUEFSQUxMRUxfSU5TTlMgMCIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRCAwIgotICAgIGVjaG8gIiNkZWZpbmUgV0lUSF9QQVJBTExFTF9XUklURSAwIgotICAgIGVjaG8gIiNkZWZpbmUgV0lUSF9QQVJBTExFTF9HRU5XUklURSAwIgotICAgIDs7Ci14cmVhZCkKLSAgICBlY2hvICIjZGVmaW5lIEhBVkVfUEFSQUxMRUxfSU5TTlMgMSIKLSAgICBlY2hvICIvKiBQYXJhbGxlbCBleGVjdXRpb24gaXMgc3VwcG9ydGVkIGJ5IHJlYWQtYmVmb3JlLWV4ZWMuICAqLyIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRCAxIgotICAgIGVjaG8gIiNkZWZpbmUgV0lUSF9QQVJBTExFTF9XUklURSAwIgotICAgIGVjaG8gIiNkZWZpbmUgV0lUSF9QQVJBTExFTF9HRU5XUklURSAwIgotICAgIDs7Ci14d3JpdGUpCi0gICAgZWNobyAiI2RlZmluZSBIQVZFX1BBUkFMTEVMX0lOU05TIDEiCi0gICAgZWNobyAiLyogUGFyYWxsZWwgZXhlY3V0aW9uIGlzIHN1cHBvcnRlZCBieSB3cml0ZS1hZnRlci1leGVjLiAgKi8iCi0gICAgZWNobyAiI2RlZmluZSBXSVRIX1BBUkFMTEVMX1JFQUQgMCIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfV1JJVEUgMSIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfR0VOV1JJVEUgMCIKLSAgICA7OwoteGdlbndyaXRlKQotICAgIGVjaG8gIiNkZWZpbmUgSEFWRV9QQVJBTExFTF9JTlNOUyAxIgotICAgIGVjaG8gIi8qIFBhcmFsbGVsIGV4ZWN1dGlvbiBpcyBzdXBwb3J0ZWQgYnkgZ2VuZXJpYyB3cml0ZS1hZnRlci1leGVjLiAgKi8iCi0gICAgZWNobyAiI2RlZmluZSBXSVRIX1BBUkFMTEVMX1JFQUQgMCIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfV1JJVEUgMCIKLSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfR0VOV1JJVEUgMSIKLSAgICA7OwotZXNhYwotCi1pZiBbICJ4JHN3aXRjaCIgIT0geCBdIDsgdGhlbgotCWVjaG8gIiIKLQllY2hvICIvKiBXSVRIX1NFTV9TV0lUQ0hfRlVMTDogbm9uLXplcm8gaWYgZnVsbC1mZWF0dXJlZCBlbmdpbmUgaXMiCi0JZWNobyAiICAgaW1wbGVtZW50ZWQgYXMgYSBzd2l0Y2goKS4gICovIgotCWlmIFsgeCRmYXN0ICE9IHh5ZXMgLW8geCRmdWxsX3N3aXRjaCA9IHh5ZXMgXSA7IHRoZW4KLQkJZWNobyAiI2RlZmluZSBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAxIgotCWVsc2UKLQkJZWNobyAiI2RlZmluZSBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAwIgotCWZpCi0JZWNobyAiIgotCWVjaG8gIi8qIFdJVEhfU0VNX1NXSVRDSF9GQVNUOiBub24temVybyBpZiBmYXN0IGVuZ2luZSBpcyIKLQllY2hvICIgICBpbXBsZW1lbnRlZCBhcyBhIHN3aXRjaCgpLiAgKi8iCi0JaWYgWyB4JGZhc3QgPSB4eWVzIF0gOyB0aGVuCi0JCWVjaG8gIiNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMSIKLQllbHNlCi0JCWVjaG8gIiNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMCIKLQlmaQotZmkKLQotIyBEZWNscyBvZiBmdW5jdGlvbnMgd2UgZGVmaW5lLgotCi1lY2hvICIiCi1lY2hvICIvKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIG1haW5sb29wLmMgZmlsZSIKLWVjaG8gIiAgICh3aGljaCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdGhhdCBmaWxlIG5hbWUpLiAgKi8iCi1lY2hvICIiCi1lY2hvICJleHRlcm4gRU5HSU5FX0ZOICR7Y3B1fV9lbmdpbmVfcnVuX2Z1bGw7IgotZWNobyAiZXh0ZXJuIEVOR0lORV9GTiAke2NwdX1fZW5naW5lX3J1bl9mYXN0OyIKLQotaWYgWyB4JHBiYiA9IHh5ZXMgXSA7IHRoZW4KLQllY2hvICIiCi0JZWNobyAiZXh0ZXJuIFNFTV9QQyAke2NwdX1fcGJiX2JlZ2luIChTSU1fQ1BVICosIGludCk7IgotCWVjaG8gImV4dGVybiBTRU1fUEMgJHtjcHV9X3BiYl9jaGFpbiAoU0lNX0NQVSAqLCBTRU1fQVJHKTsiCi0JZWNobyAiZXh0ZXJuIFNFTV9QQyAke2NwdX1fcGJiX2N0aV9jaGFpbiAoU0lNX0NQVSAqLCBTRU1fQVJHLCBTRU1fQlJBTkNIX1RZUEUsIFBDQUREUik7IgotCWVjaG8gImV4dGVybiB2b2lkICR7Y3B1fV9wYmJfYmVmb3JlIChTSU1fQ1BVICosIFNDQUNIRSAqKTsiCi0JZWNobyAiZXh0ZXJuIHZvaWQgJHtjcHV9X3BiYl9hZnRlciAoU0lNX0NQVSAqLCBTQ0FDSEUgKik7IgotZmkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcm0gLWYgdG1wLW1sb29wLmNpbiBtbG9vcC5jaW4KLWV4ZWMgMT50bXAtbWxvb3AuY2luCi0KLSMgV2UgdXNlIEBjcHVAIGluc3RlYWQgb2YgJHtjcHV9IGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0byBydW4gc2VkIHRvIGhhbmRsZQotIyB0cmFuc2Zvcm1hdGlvbiBvZiBAY3B1QCBmb3IgbWFpbmxvb3AuaW4sIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byB1c2UgJHtjcHV9Ci0jIGhlcmUuCi0KLWNhdCA8PCBFT0YKLS8qIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGdlbm1sb29wIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBFbmFibGUgc3dpdGNoKCkgc3VwcG9ydCBpbiBjZ2VuIGhlYWRlcnMuICAqLwotI2RlZmluZSBTRU1fSU5fU1dJVENICi0KLSNkZWZpbmUgV0FOVF9DUFUgQGNwdUAKLSNkZWZpbmUgV0FOVF9DUFVfQENQVUAKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY2dlbi1tZW0uaCIKLSNpbmNsdWRlICJjZ2VuLW9wcy5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotLyogRmlsbCBpbiB0aGUgYWRtaW5pc3RyYXRpdmUgQVJHQlVGIGZpZWxkcyByZXF1aXJlZCBieSBhbGwgaW5zbnMsCi0gICB2aXJ0dWFsIGFuZCByZWFsLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1AY3B1QF9maWxsX2FyZ2J1ZiAoY29uc3QgU0lNX0NQVSAqY3B1LCBBUkdCVUYgKmFidWYsIGNvbnN0IElERVNDICppZGVzYywKLQkJICAgIFBDQUREUiBwYywgaW50IGZhc3RfcCkKLXsKLSNpZiBXSVRIX1NDQUNIRQotICBTRU1fU0VUX0NPREUgKGFidWYsIGlkZXNjLCBmYXN0X3ApOwotICBBUkdCVUZfQUREUiAoYWJ1ZikgPSBwYzsKLSNlbmRpZgotICBBUkdCVUZfSURFU0MgKGFidWYpID0gaWRlc2M7Ci19Ci0KLS8qIEZpbGwgaW4gdHJhY2luZy9wcm9maWxpbmcgZmllbGRzIG9mIGFuIEFSR0JVRi4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotQGNwdUBfZmlsbF9hcmdidWZfdHAgKGNvbnN0IFNJTV9DUFUgKmNwdSwgQVJHQlVGICphYnVmLAotCQkgICAgICAgaW50IHRyYWNlX3AsIGludCBwcm9maWxlX3ApCi17Ci0gIEFSR0JVRl9UUkFDRV9QIChhYnVmKSA9IHRyYWNlX3A7Ci0gIEFSR0JVRl9QUk9GSUxFX1AgKGFidWYpID0gcHJvZmlsZV9wOwotfQotCi0jaWYgV0lUSF9TQ0FDSEVfUEJCCi0KLS8qIEVtaXQgdGhlICJ4LWJlZm9yZSIgaGFuZGxlci4KLSAgIHgtYmVmb3JlIGlzIGVtaXR0ZWQgYmVmb3JlIGVhY2ggaW5zbiAoc2VyaWFsIG9yIHBhcmFsbGVsKS4KLSAgIFRoaXMgaXMgYXMgb3Bwb3NlZCB0byB4LWFmdGVyIHdoaWNoIGlzIG9ubHkgZW1pdHRlZCBhdCB0aGUgZW5kIG9mIGEgZ3JvdXAKLSAgIG9mIHBhcmFsbGVsIGluc25zLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1AY3B1QF9lbWl0X2JlZm9yZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNDQUNIRSAqc2MsIFBDQUREUiBwYywgaW50IGZpcnN0X3ApCi17Ci0gIEFSR0JVRiAqYWJ1ZiA9ICZzY1swXS5hcmdidWY7Ci0gIGNvbnN0IElERVNDICppZCA9ICYgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW0BDUFVAX0lOU05fWF9CRUZPUkVdOwotCi0gIGFidWYtPmZpZWxkcy5iZWZvcmUuZmlyc3RfcCA9IGZpcnN0X3A7Ci0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCAwKTsKLSAgLyogbm8gbmVlZCB0byBzZXQgdHJhY2VfcCxwcm9maWxlX3AgKi8KLX0KLQotLyogRW1pdCB0aGUgIngtYWZ0ZXIiIGhhbmRsZXIuCi0gICB4LWFmdGVyIGlzIGVtaXR0ZWQgYWZ0ZXIgYSBzZXJpYWwgaW5zbiBvciBhdCB0aGUgZW5kIG9mIGEgZ3JvdXAgb2YKLSAgIHBhcmFsbGVsIGluc25zLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1AY3B1QF9lbWl0X2FmdGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYywgUENBRERSIHBjKQotewotICBBUkdCVUYgKmFidWYgPSAmc2NbMF0uYXJnYnVmOwotICBjb25zdCBJREVTQyAqaWQgPSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQUZURVJdOwotCi0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCAwKTsKLSAgLyogbm8gbmVlZCB0byBzZXQgdHJhY2VfcCxwcm9maWxlX3AgKi8KLX0KLQotI2VuZGlmIC8qIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi1FT0YKLQotJHtTSEVMTH0gJGluZmlsZSBzdXBwb3J0Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgU2ltcGxlIGVuZ2luZTogZmV0Y2ggYW4gaW5zdHJ1Y3Rpb24sIGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uLgotIwotIyBJbnN0cnVjdGlvbiBmaWVsZHMgYXJlIG5vdCBleHRyYWN0ZWQgaW50byBBUkdCVUYsIHRoZXkgYXJlIGV4dHJhY3RlZCBpbgotIyB0aGUgc2VtYW50aWMgcm91dGluZXMgdGhlbXNlbHZlcy4gIEhvd2V2ZXIsIHRoZXJlIGlzIHN0aWxsIGEgbmVlZCB0byBwYXNzCi0jIGFuZCByZXR1cm4gbWlzYy4gaW5mb3JtYXRpb24gdG8gdGhlIHNlbWFudGljIHJvdXRpbmVzIHNvIHdlIHN0aWxsIHVzZSBBUkdCVUYuCi0jIFtPbmUgY291bGQgY2VydGFpbmx5IGltcGxlbWVudCB0aGluZ3MgZGlmZmVyZW50bHkgYW5kIHJlbW92ZSBBUkdCVUYuCi0jIEl0J3Mgbm90IGNsZWFyIHRoaXMgaXMgbmVjZXNzYXJpbHkgYWx3YXlzIGEgd2luLl0KLSMgPz8/IFRoZSB1c2Ugb2YgdGhlIFNDQUNIRSBzdHJ1Y3QgaXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHdpdGgtc2NhY2hlCi0jIGNhc2UgdGhvdWdoIGl0IG1pZ2h0IGJlIGEgc291cmNlIG9mIGNvbmZ1c2lvbi4KLQotaWYgWyB4JHNjYWNoZSAhPSB4eWVzIC1hIHgkcGJiICE9IHh5ZXMgXSA7IHRoZW4KLQotICAgIGNhdCA8PCBFT0YKLQotI2RlZmluZSBGQVNUX1AgMAotCi12b2lkCi1AY3B1QF9lbmdpbmVfcnVuX2Z1bGwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotI2RlZmluZSBGQVNUX1AgMAotICBTSU1fREVTQyBjdXJyZW50X3N0YXRlID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0gIC8qID8/PyBVc2Ugb2YgU0NBQ0hFIGlzIGEgYml0IG9mIGEgaGFjayBhcyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlIHNjYWNoZS4KLSAgICAgV2UgZG8gaG93ZXZlciB1c2UgQVJHQlVGIHNvIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBlbmdpbmUgZmxhdm91cnMKLSAgICAgdGhlIFNDQUNIRSB0eXBlIGlzIHVzZWQuICAqLwotICBTQ0FDSEUgY2FjaGVbTUFYX0xJV19JTlNOU107Ci0gIFNDQUNIRSAqc2MgPSAmY2FjaGVbMF07Ci0KLUVPRgotCi1jYXNlIHgkcGFyYWxsZWwgaW4KLXhyZWFkIHwgeHdyaXRlKQotICAgIGNhdCA8PCBFT0YKLSAgUEFSRVhFQyBwYnVmc1tNQVhfUEFSQUxMRUxfSU5TTlNdOwotICBQQVJFWEVDICpwYXJfZXhlYzsKLQotRU9GCi0gICAgOzsKLWVzYWMKLQotIyBBbnkgaW5pdGlhbGl6YXRpb24gY29kZSBiZWZvcmUgbG9vcGluZyBzdGFydHMuCi0jIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGRlY2xhcmUgc29tZSBsb2NhbHMuCi0ke1NIRUxMfSAkaW5maWxlIGluaXQKLQotaWYgWyB4JHBhcmFsbGVsID0geHJlYWQgXSA7IHRoZW4KLSAgY2F0IDw8IEVPRgotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pCi0gIHsKLSAgICBpZiAoISBDUFVfSURFU0NfUkVBRF9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICAgIHsKLS8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSByZWFkLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KLSNkZWZpbmUgREVGSU5FX0xBQkVMUwotI2luY2x1ZGUgInJlYWR4LmMiCi0JQ1BVX0lERVNDX1JFQURfSU5JVF9QIChjdXJyZW50X2NwdSkgPSAxOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotRU9GCi1maQotCi1jYXQgPDwgRU9GCi0KLSAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0jaWYgV0lUSF9TRU1fU1dJVENIX0ZVTEwKLSNpZiBkZWZpbmVkIChfX0dOVUNfXykKLS8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSBzZW0tc3dpdGNoLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KLSNkZWZpbmUgREVGSU5FX0xBQkVMUwotI2luY2x1ZGUgIiRzd2l0Y2giCi0jZW5kaWYKLSNlbHNlCi0gICAgICBAY3B1QF9zZW1faW5pdF9pZGVzY190YWJsZSAoY3VycmVudF9jcHUpOwotI2VuZGlmCi0gICAgICBDUFVfSURFU0NfU0VNX0lOSVRfUCAoY3VycmVudF9jcHUpID0gMTsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0vKiBiZWdpbiBmdWxsLWV4ZWMtc2ltcGxlICovCi1FT0YKLQotJHtTSEVMTH0gJGluZmlsZSBmdWxsLWV4ZWMtc2ltcGxlCi0KLWNhdCA8PCBFT0YKLS8qIGVuZCBmdWxsLWV4ZWMtc2ltcGxlICovCi0KLSAgICAgICsrIENQVV9JTlNOX0NPVU5UIChjdXJyZW50X2NwdSk7Ci0gICAgfQotICB3aGlsZSAoMCAvKkNQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSovKTsKLX0KLQotI3VuZGVmIEZBU1RfUAotCi1FT0YKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgU2ltcGxlIGVuZ2luZTogZmFzdCB2ZXJzaW9uLgotIyA/Pz8gQSBzb21ld2hhdCBkdWJpb3VzIGVmZm9ydCwgYnV0IGZvciBjb21wbGV0ZW5lc3MnIHNha2UuCi0KLWlmIFsgeCRmYXN0ID0geHllcyBdIDsgdGhlbgotCi0gICAgY2F0IDw8IEVPRgotCi0jZGVmaW5lIEZBU1RfUCAxCi0KLUZJWE1FOiAiZmFzdCBzaW1wbGUgdmVyc2lvbiB1bmltcGxlbWVudGVkLCBkZWxldGUgLWZhc3QgYXJnIHRvIGdlbm1sb29wLnNoLiIKLQotI3VuZGVmIEZBU1RfUAotCi1FT0YKLQotZmkgIyAtZmFzdAotCi1maSAjIHNpbXBsZSBlbmdpbmUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOb24tcGFyYWxsZWwgc2NhY2hlIGVuZ2luZTogbG9va3VwIGluc24gaW4gc2NhY2hlLCBmZXRjaCBpZiBtaXNzaW5nLAotIyB0aGVuIGV4ZWN1dGUgaXQuCi0KLWlmIFsgeCRzY2FjaGUgPSB4eWVzIC1hIHgkcGFyYWxsZWwgPSB4bm8gXSA7IHRoZW4KLQotICAgIGNhdCA8PCBFT0YKLQotc3RhdGljIElOTElORSBTQ0FDSEUgKgotQGNwdUBfc2NhY2hlX2xvb2t1cCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiB2cGMsIFNDQUNIRSAqc2NhY2hlLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhhc2hfbWFzaywgaW50IEZBU1RfUCkKLXsKLSAgLyogRmlyc3Qgc3RlcDogbG9vayB1cCBjdXJyZW50IGluc24gaW4gaGFzaCB0YWJsZS4gICovCi0gIFNDQUNIRSAqc2MgPSBzY2FjaGUgKyBTQ0FDSEVfSEFTSF9QQyAodnBjLCBoYXNoX21hc2spOwotCi0gIC8qIElmIHRoZSBlbnRyeSBpc24ndCB0aGUgb25lIHdlIHdhbnQgKGNhY2hlIG1pc3MpLAotICAgICBmZXRjaCBhbmQgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChzYy0+YXJnYnVmLmFkZHIgIT0gdnBjKQotICAgIHsKLSAgICAgIGlmICghIEZBU1RfUCkKLQlQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTIChjdXJyZW50X2NwdSk7Ci0KLS8qIGJlZ2luIGV4dHJhY3Qtc2NhY2hlICovCi1FT0YKLQotJHtTSEVMTH0gJGluZmlsZSBleHRyYWN0LXNjYWNoZQotCi1jYXQgPDwgRU9GCi0vKiBlbmQgZXh0cmFjdC1zY2FjaGUgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKCEgRkFTVF9QKQotICAgIHsKLSAgICAgIFBST0ZJTEVfQ09VTlRfU0NBQ0hFX0hJVCAoY3VycmVudF9jcHUpOwotICAgICAgLyogTWFrZSBjb3JlIGFjY2VzcyBzdGF0aXN0aWNzIGNvbWUgb3V0IHJpZ2h0LgotCSBUaGUgc2l6ZSBpcyBhIGd1ZXNzLCBidXQgaXQncyBjdXJyZW50bHkgbm90IHVzZWQgZWl0aGVyLiAgKi8KLSAgICAgIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3VycmVudF9jcHUsIHZwYywgMiwgZXhlY19tYXApOwotICAgIH0KLQotICByZXR1cm4gc2M7Ci19Ci0KLSNkZWZpbmUgRkFTVF9QIDAKLQotdm9pZAotQGNwdUBfZW5naW5lX3J1bl9mdWxsIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgU0lNX0RFU0MgY3VycmVudF9zdGF0ZSA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOwotICBTQ0FDSEUgKnNjYWNoZSA9IENQVV9TQ0FDSEVfQ0FDSEUgKGN1cnJlbnRfY3B1KTsKLSAgdW5zaWduZWQgaW50IGhhc2hfbWFzayA9IENQVV9TQ0FDSEVfSEFTSF9NQVNLIChjdXJyZW50X2NwdSk7Ci0gIFNFTV9QQyB2cGM7Ci0KLUVPRgotCi0jIEFueSBpbml0aWFsaXphdGlvbiBjb2RlIGJlZm9yZSBsb29waW5nIHN0YXJ0cy4KLSMgTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgZGVjbGFyZSBzb21lIGxvY2Fscy4KLSR7U0hFTEx9ICRpbmZpbGUgaW5pdAotCi1jYXQgPDwgRU9GCi0KLSAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0jaWYgISBXSVRIX1NFTV9TV0lUQ0hfRlVMTAotICAgICAgQGNwdUBfc2VtX2luaXRfaWRlc2NfdGFibGUgKGN1cnJlbnRfY3B1KTsKLSNlbmRpZgotICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gICAgfQotCi0gIHZwYyA9IEdFVF9IX1BDICgpOwotCi0gIGRvCi0gICAgewotICAgICAgU0NBQ0hFICpzYzsKLQotICAgICAgc2MgPSBAY3B1QF9zY2FjaGVfbG9va3VwIChjdXJyZW50X2NwdSwgdnBjLCBzY2FjaGUsIGhhc2hfbWFzaywgRkFTVF9QKTsKLQotLyogYmVnaW4gZnVsbC1leGVjLXNjYWNoZSAqLwotRU9GCi0KLSR7U0hFTEx9ICRpbmZpbGUgZnVsbC1leGVjLXNjYWNoZQotCi1jYXQgPDwgRU9GCi0vKiBlbmQgZnVsbC1leGVjLXNjYWNoZSAqLwotCi0gICAgICBTRVRfSF9QQyAodnBjKTsKLQotICAgICAgKysgQ1BVX0lOU05fQ09VTlQgKGN1cnJlbnRfY3B1KTsKLSAgICB9Ci0gIHdoaWxlICgwIC8qQ1BVX1JVTk5JTkdfUCAoY3VycmVudF9jcHUpKi8pOwotfQotCi0jdW5kZWYgRkFTVF9QCi0KLUVPRgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOb24tcGFyYWxsZWwgc2NhY2hlIGVuZ2luZTogZmFzdCB2ZXJzaW9uLgotCi1pZiBbIHgkZmFzdCA9IHh5ZXMgXSA7IHRoZW4KLQotICAgIGNhdCA8PCBFT0YKLQotI2RlZmluZSBGQVNUX1AgMQotCi12b2lkCi1AY3B1QF9lbmdpbmVfcnVuX2Zhc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICBTSU1fREVTQyBjdXJyZW50X3N0YXRlID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0gIFNDQUNIRSAqc2NhY2hlID0gQ1BVX1NDQUNIRV9DQUNIRSAoY3VycmVudF9jcHUpOwotICB1bnNpZ25lZCBpbnQgaGFzaF9tYXNrID0gQ1BVX1NDQUNIRV9IQVNIX01BU0sgKGN1cnJlbnRfY3B1KTsKLSAgU0VNX1BDIHZwYzsKLQotRU9GCi0KLSMgQW55IGluaXRpYWxpemF0aW9uIGNvZGUgYmVmb3JlIGxvb3Bpbmcgc3RhcnRzLgotIyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBkZWNsYXJlIHNvbWUgbG9jYWxzLgotJHtTSEVMTH0gJGluZmlsZSBpbml0Ci0KLWNhdCA8PCBFT0YKLQotICBpZiAoISBDUFVfSURFU0NfU0VNX0lOSVRfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSNpZiBXSVRIX1NFTV9TV0lUQ0hfRkFTVAotI2lmIGRlZmluZWQgKF9fR05VQ19fKQotLyogPz8/IExhdGVyIG1heWJlIHBhc3RlIHNlbS1zd2l0Y2guYyBpbiB3aGVuIGJ1aWxkaW5nIG1haW5sb29wLmMuICAqLwotI2RlZmluZSBERUZJTkVfTEFCRUxTCi0jaW5jbHVkZSAiJHN3aXRjaCIKLSNlbmRpZgotI2Vsc2UKLSAgICAgIEBjcHVAX3NlbWZfaW5pdF9pZGVzY190YWJsZSAoY3VycmVudF9jcHUpOwotI2VuZGlmCi0gICAgICBDUFVfSURFU0NfU0VNX0lOSVRfUCAoY3VycmVudF9jcHUpID0gMTsKLSAgICB9Ci0KLSAgdnBjID0gR0VUX0hfUEMgKCk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBTQ0FDSEUgKnNjOwotCi0gICAgICBzYyA9IEBjcHVAX3NjYWNoZV9sb29rdXAgKGN1cnJlbnRfY3B1LCB2cGMsIHNjYWNoZSwgaGFzaF9tYXNrLCBGQVNUX1ApOwotCi0vKiBiZWdpbiBmYXN0LWV4ZWMtc2NhY2hlICovCi1FT0YKLQotJHtTSEVMTH0gJGluZmlsZSBmYXN0LWV4ZWMtc2NhY2hlCi0KLWNhdCA8PCBFT0YKLS8qIGVuZCBmYXN0LWV4ZWMtc2NhY2hlICovCi0KLSAgICAgIFNFVF9IX1BDICh2cGMpOwotCi0gICAgICArKyBDUFVfSU5TTl9DT1VOVCAoY3VycmVudF9jcHUpOwotICAgIH0KLSAgd2hpbGUgKDAgLypDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkqLyk7Ci19Ci0KLSN1bmRlZiBGQVNUX1AKLQotRU9GCi0KLWZpICMgLWZhc3QKLQotZmkgIyAtc2NhY2hlICYmICEgcGFyYWxsZWwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBQYXJhbGxlbCBzY2FjaGUgZW5naW5lOiBsb29rdXAgaW5zbiBpbiBzY2FjaGUsIGZldGNoIGlmIG1pc3NpbmcsCi0jIHRoZW4gZXhlY3V0ZSBpdC4KLSMgRm9yIHRoZSBwYXJhbGxlbCBjYXNlIHdlIGdpdmUgdGhlIHRhcmdldCBtb3JlIGZsZXhpYmlsaXR5LgotCi1pZiBbIHgkc2NhY2hlID0geHllcyAtYSB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgotCi0gICAgY2F0IDw8IEVPRgotCi1zdGF0aWMgSU5MSU5FIFNDQUNIRSAqCi1AY3B1QF9zY2FjaGVfbG9va3VwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHZwYywgU0NBQ0hFICpzY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaGFzaF9tYXNrLCBpbnQgRkFTVF9QKQotewotICAvKiBGaXJzdCBzdGVwOiBsb29rIHVwIGN1cnJlbnQgaW5zbiBpbiBoYXNoIHRhYmxlLiAgKi8KLSAgU0NBQ0hFICpzYyA9IHNjYWNoZSArIFNDQUNIRV9IQVNIX1BDICh2cGMsIGhhc2hfbWFzayk7Ci0KLSAgLyogSWYgdGhlIGVudHJ5IGlzbid0IHRoZSBvbmUgd2Ugd2FudCAoY2FjaGUgbWlzcyksCi0gICAgIGZldGNoIGFuZCBkZWNvZGUgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKHNjLT5hcmdidWYuYWRkciAhPSB2cGMpCi0gICAgewotICAgICAgaWYgKCEgRkFTVF9QKQotCVBST0ZJTEVfQ09VTlRfU0NBQ0hFX01JU1MgKGN1cnJlbnRfY3B1KTsKLQotI2RlZmluZSBTRVRfTEFTVF9JTlNOX1AobGFzdF9wKSBkbyB7IHNjLT5sYXN0X2luc25fcCA9IChsYXN0X3ApOyB9IHdoaWxlICgwKQotLyogYmVnaW4gZXh0cmFjdC1zY2FjaGUgKi8KLUVPRgotCi0ke1NIRUxMfSAkaW5maWxlIGV4dHJhY3Qtc2NhY2hlCi0KLWNhdCA8PCBFT0YKLS8qIGVuZCBleHRyYWN0LXNjYWNoZSAqLwotI3VuZGVmIFNFVF9MQVNUX0lOU05fUAotICAgIH0KLSAgZWxzZSBpZiAoISBGQVNUX1ApCi0gICAgewotICAgICAgUFJPRklMRV9DT1VOVF9TQ0FDSEVfSElUIChjdXJyZW50X2NwdSk7Ci0gICAgICAvKiBNYWtlIGNvcmUgYWNjZXNzIHN0YXRpc3RpY3MgY29tZSBvdXQgcmlnaHQuCi0JIFRoZSBzaXplIGlzIGEgZ3Vlc3MsIGJ1dCBpdCdzIGN1cnJlbnRseSBub3QgdXNlZCBlaXRoZXIuICAqLwotICAgICAgUFJPRklMRV9DT1VOVF9DT1JFIChjdXJyZW50X2NwdSwgdnBjLCAyLCBleGVjX21hcCk7Ci0gICAgfQotCi0gIHJldHVybiBzYzsKLX0KLQotI2RlZmluZSBGQVNUX1AgMAotCi12b2lkCi1AY3B1QF9lbmdpbmVfcnVuX2Z1bGwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICBTSU1fREVTQyBjdXJyZW50X3N0YXRlID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0gIFNDQUNIRSAqc2NhY2hlID0gQ1BVX1NDQUNIRV9DQUNIRSAoY3VycmVudF9jcHUpOwotICB1bnNpZ25lZCBpbnQgaGFzaF9tYXNrID0gQ1BVX1NDQUNIRV9IQVNIX01BU0sgKGN1cnJlbnRfY3B1KTsKLSAgU0VNX1BDIHZwYzsKLQotRU9GCi0KLSMgQW55IGluaXRpYWxpemF0aW9uIGNvZGUgYmVmb3JlIGxvb3Bpbmcgc3RhcnRzLgotIyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBkZWNsYXJlIHNvbWUgbG9jYWxzLgotJHtTSEVMTH0gJGluZmlsZSBpbml0Ci0KLWlmIFsgeCRwYXJhbGxlbCA9IHhyZWFkIF0gOyB0aGVuCi1jYXQgPDwgRU9GCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pCi0gIHsKLSAgICBpZiAoISBDUFVfSURFU0NfUkVBRF9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICAgIHsKLS8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSByZWFkLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KLSNkZWZpbmUgREVGSU5FX0xBQkVMUwotI2luY2x1ZGUgInJlYWR4LmMiCi0JQ1BVX0lERVNDX1JFQURfSU5JVF9QIChjdXJyZW50X2NwdSkgPSAxOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotRU9GCi1maQotCi1jYXQgPDwgRU9GCi0KLSAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0jaWYgISBXSVRIX1NFTV9TV0lUQ0hfRlVMTAotICAgICAgQGNwdUBfc2VtX2luaXRfaWRlc2NfdGFibGUgKGN1cnJlbnRfY3B1KTsKLSNlbmRpZgotICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gICAgfQotCi0gIHZwYyA9IEdFVF9IX1BDICgpOwotCi0gIGRvCi0gICAgewotLyogYmVnaW4gZnVsbC1leGVjLXNjYWNoZSAqLwotRU9GCi0KLSR7U0hFTEx9ICRpbmZpbGUgZnVsbC1leGVjLXNjYWNoZQotCi1jYXQgPDwgRU9GCi0vKiBlbmQgZnVsbC1leGVjLXNjYWNoZSAqLwotICAgIH0KLSAgd2hpbGUgKDAgLypDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkqLyk7Ci19Ci0KLSN1bmRlZiBGQVNUX1AKLQotRU9GCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFBhcmFsbGVsIHNjYWNoZSBlbmdpbmU6IGZhc3QgdmVyc2lvbi4KLQotaWYgWyB4JGZhc3QgPSB4eWVzIF0gOyB0aGVuCi0KLSAgICBjYXQgPDwgRU9GCi0KLSNkZWZpbmUgRkFTVF9QIDEKLQotdm9pZAotQGNwdUBfZW5naW5lX3J1bl9mYXN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgU0lNX0RFU0MgY3VycmVudF9zdGF0ZSA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOwotICBTQ0FDSEUgKnNjYWNoZSA9IENQVV9TQ0FDSEVfQ0FDSEUgKGN1cnJlbnRfY3B1KTsKLSAgdW5zaWduZWQgaW50IGhhc2hfbWFzayA9IENQVV9TQ0FDSEVfSEFTSF9NQVNLIChjdXJyZW50X2NwdSk7Ci0gIFNFTV9QQyB2cGM7Ci0gIFBBUkVYRUMgcGJ1ZnNbTUFYX1BBUkFMTEVMX0lOU05TXTsKLSAgUEFSRVhFQyAqcGFyX2V4ZWM7Ci0KLUVPRgotCi0jIEFueSBpbml0aWFsaXphdGlvbiBjb2RlIGJlZm9yZSBsb29waW5nIHN0YXJ0cy4KLSMgTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgZGVjbGFyZSBzb21lIGxvY2Fscy4KLSR7U0hFTEx9ICRpbmZpbGUgaW5pdAotCi1pZiBbIHgkcGFyYWxsZWwgPSB4cmVhZCBdIDsgdGhlbgotY2F0IDw8IEVPRgotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pCi0gIHsKLSAgICBpZiAoISBDUFVfSURFU0NfUkVBRF9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICAgIHsKLS8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSByZWFkLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KLSNkZWZpbmUgREVGSU5FX0xBQkVMUwotI2luY2x1ZGUgInJlYWR4LmMiCi0JQ1BVX0lERVNDX1JFQURfSU5JVF9QIChjdXJyZW50X2NwdSkgPSAxOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotRU9GCi1maQotCi1jYXQgPDwgRU9GCi0KLSAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0jaWYgV0lUSF9TRU1fU1dJVENIX0ZBU1QKLSNpZiBkZWZpbmVkIChfX0dOVUNfXykKLS8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSBzZW0tc3dpdGNoLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KLSNkZWZpbmUgREVGSU5FX0xBQkVMUwotI2luY2x1ZGUgIiRzd2l0Y2giCi0jZW5kaWYKLSNlbHNlCi0gICAgICBAY3B1QF9zZW1mX2luaXRfaWRlc2NfdGFibGUgKGN1cnJlbnRfY3B1KTsKLSNlbmRpZgotICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gICAgfQotCi0gIHZwYyA9IEdFVF9IX1BDICgpOwotCi0gIGRvCi0gICAgewotLyogYmVnaW4gZmFzdC1leGVjLXNjYWNoZSAqLwotRU9GCi0KLSR7U0hFTEx9ICRpbmZpbGUgZmFzdC1leGVjLXNjYWNoZQotCi1jYXQgPDwgRU9GCi0vKiBlbmQgZmFzdC1leGVjLXNjYWNoZSAqLwotICAgIH0KLSAgd2hpbGUgKDAgLypDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkqLyk7Ci19Ci0KLSN1bmRlZiBGQVNUX1AKLQotRU9GCi0KLWZpICMgLWZhc3QKLQotZmkgIyAtc2NhY2hlICYmIHBhcmFsbGVsCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29tcGlsYXRpb24gZW5naW5lOiBsb29rdXAgaW5zbiBpbiBzY2FjaGUsIGV4dHJhY3QgYSBwYmIKLSMgKHBzZXVkby1iYXNpYy1ibG9jaykgaWYgbWlzc2luZywgdGhlbiBleGVjdXRlIHRoZSBwYmIuCi0jIEEgInBiYiIgaXMgYSBzZXF1ZW5jZSBvZiBpbnNucyB1cCB0byB0aGUgbmV4dCBjdGkgaW5zbiBvciB1bnRpbAotIyBzb21lIHByZXNwZWNpZmllZCBtYXhpbXVtLgotIyBDVEk6IGNvbnRyb2wgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24uCi0KLWlmIFsgeCRwYmIgPSB4eWVzIF0gOyB0aGVuCi0KLSAgICBjYXQgPDwgRU9GCi0KLS8qIFJlY29yZCBhZGRyZXNzIG9mIGN0aSB0ZXJtaW5hdGluZyBhIHBiYi4gICovCi0jZGVmaW5lIFNFVF9DVElfVlBDKHNjKSBkbyB7IF9jdGlfc2MgPSAoc2MpOyB9IHdoaWxlICgwKQotLyogUmVjb3JkIG51bWJlciBvZiBbcmVhbF0gaW5zbnMgaW4gcGJiLiAgKi8KLSNkZWZpbmUgU0VUX0lOU05fQ09VTlQobikgZG8geyBfaW5zbl9jb3VudCA9IChuKTsgfSB3aGlsZSAoMCkKLQotLyogRmV0Y2ggYW5kIGV4dHJhY3QgYSBwc2V1ZG8tYmFzaWMtYmxvY2suCi0gICBGQVNUX1AgaXMgbm9uLXplcm8gaWYgbm8gdHJhY2luZy9wcm9maWxpbmcvZXRjLiBpcyB3YW50ZWQuICAqLwotCi1JTkxJTkUgU0VNX1BDCi1AY3B1QF9wYmJfYmVnaW4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBpbnQgRkFTVF9QKQotewotICBTRU1fUEMgbmV3X3ZwYzsKLSAgUENBRERSIHBjOwotICBTQ0FDSEUgKnNjOwotICBpbnQgbWF4X2luc25zID0gQ1BVX1NDQUNIRV9NQVhfQ0hBSU5fTEVOR1RIIChjdXJyZW50X2NwdSk7Ci0KLSAgcGMgPSBHRVRfSF9QQyAoKTsKLQotICBuZXdfdnBjID0gc2NhY2hlX2xvb2t1cF9vcl9hbGxvYyAoY3VycmVudF9jcHUsIHBjLCBtYXhfaW5zbnMsICZzYyk7Ci0gIGlmICghIG5ld192cGMpCi0gICAgewotICAgICAgLyogTGVhZGluZyAnXycgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbWFpbmxvb3AuaW4uICAqLwotICAgICAgaW50IF9pbnNuX2NvdW50ID0gMDsKLSAgICAgIFNDQUNIRSAqb3JpZ19zYyA9IHNjOwotICAgICAgU0NBQ0hFICpfY3RpX3NjID0gTlVMTDsKLSAgICAgIGludCBzbGljZV9pbnNucyA9IENQVV9NQVhfU0xJQ0VfSU5TTlMgKGN1cnJlbnRfY3B1KTsKLQotICAgICAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgbWFueSBpbnN0cnVjdGlvbnMgdG8gY29tcGlsZS4KLQkgTUFYX0lOU05TIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCB3aGljaCBpbmNsdWRlcyBzcGFjZQotCSBmb3IgYmVmb3JlL2FmdGVyIGhhbmRsZXJzIGlmIHRoZXkncmUgYmVpbmcgdXNlZC4KLQkgU0xJQ0VfSU5TTlMgaXMgdGhlIG1heGludW0gbnVtYmVyIG9mIHJlYWwgaW5zbnMgdGhhdCBjYW4gYmUKLQkgZXhlY3V0ZWQuICBaZXJvIG1lYW5zICJhcyBtYW55IGFzIHdlIHdhbnQiLiAgKi8KLSAgICAgIC8qID8/PyBtYXhfaW5zbnMgaXMgc2VydmluZyB0d28gaW5jb21wYXRpYmxlIHJvbGVzLgotCSAxKSBOdW1iZXIgb2Ygc2xvdHMgYXZhaWxhYmxlIGluIHNjYWNoZSBidWZmZXIuCi0JIDIpIE51bWJlciBvZiByZWFsIGluc25zIHRvIGV4ZWN1dGUuCi0JIFRoZXkncmUgaW5jb21wYXRpYmxlIGJlY2F1c2UgdGhlcmUgYXJlIHZpcnR1YWwgaW5zbnMgZW1pdHRlZCB0b28KLQkgKGNoYWluLGN0aS1jaGFpbixiZWZvcmUsYWZ0ZXIgaGFuZGxlcnMpLiAgKi8KLQotICAgICAgaWYgKHNsaWNlX2luc25zID09IDEpCi0JewotCSAgLyogTm8gbmVlZCB0byB3b3JyeSBhYm91dCBleHRyYSBzbG90cyByZXF1aXJlZCBmb3IgdmlydHVhbCBpbnNucwotCSAgICAgYW5kIHBhcmFsbGVsIGV4ZWMgc3VwcG9ydCBiZWNhdXNlIE1BWF9DSEFJTl9MRU5HVEggaXMKLQkgICAgIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBleGVjdXRlIGF0IGxlYXN0IDEgaW5zbiEgICovCi0JICBtYXhfaW5zbnMgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGxvdyBlbm91Z2ggc2xvcCBzbyB0aGF0IHdoaWxlIGNvbXBpbGluZyBpbnNucywgaWYgbWF4X2luc25zID4gMAotCSAgICAgdGhlbiB0aGVyZSdzIGd1YXJhbnRlZWQgdG8gYmUgZW5vdWdoIHNwYWNlIHRvIGVtaXQgb25lIHJlYWwgaW5zbi4KLQkgICAgIE1BWF9DSEFJTl9MRU5HVEggaXMgdHlwaWNhbGx5IG11Y2ggbG9uZ2VyIHRoYW4KLQkgICAgIHRoZSBub3JtYWwgbnVtYmVyIG9mIGluc25zIGJldHdlZW4gY3RpJ3MgYW55d2F5LiAgKi8KLQkgIG1heF9pbnNucyAtPSAoMSAvKiBvbmUgZm9yIHRoZSB0cmFpbGluZyBjaGFpbiBpbnNuICovCi0JCQkrIChGQVNUX1AKLQkJCSAgID8gMAotCQkJICAgOiAoMSArIE1BWF9QQVJBTExFTF9JTlNOUykgLyogYmVmb3JlK2FmdGVyICovKQotCQkJKyAoTUFYX1BBUkFMTEVMX0lOU05TID4gMQotCQkJICAgPyAoTUFYX1BBUkFMTEVMX0lOU05TICogMikKLQkJCSAgIDogMCkpOwotCi0JICAvKiBBY2NvdW50IGZvciBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMuICAqLwotCSAgaWYgKCEgRkFTVF9QKQotCSAgICBzbGljZV9pbnNucyAqPSAzOwotCi0JICBpZiAoc2xpY2VfaW5zbnMgPiAwCi0JICAgICAgJiYgc2xpY2VfaW5zbnMgPCBtYXhfaW5zbnMpCi0JICAgIG1heF9pbnNucyA9IHNsaWNlX2luc25zOwotCX0KLQotICAgICAgbmV3X3ZwYyA9IHNjOwotCi0gICAgICAvKiBTQyxQQyBtdXN0IGJlIHVwZGF0ZWQgdG8gcG9pbnQgcGFzc2VkIHRoZSBsYXN0IGVudHJ5IHVzZWQuCi0JIFNFVF9DVElfVlBDIG11c3QgYmUgY2FsbGVkIGlmIHBiYiBpcyB0ZXJtaW5hdGVkIGJ5IGEgY3RpLgotCSBTRVRfSU5TTl9DT1VOVCBtdXN0IGJlIGNhbGxlZCB0byByZWNvcmQgbnVtYmVyIG9mIHJlYWwgaW5zbnMgaW4KLQkgcGJiIFtjb3VsZCBiZSBjb21wdXRlZCBieSB1cyBvZiBjb3Vyc2UsIGV4dHJhIGNwdSBidXQgcGVyaGFwcwotCSBuZWdsaWdpYmxlIGVub3VnaF0uICAqLwotCi0vKiBiZWdpbiBleHRyYWN0LXBiYiAqLwotRU9GCi0KLSR7U0hFTEx9ICRpbmZpbGUgZXh0cmFjdC1wYmIKLQotY2F0IDw8IEVPRgotLyogZW5kIGV4dHJhY3QtcGJiICovCi0KLSAgICAgIC8qIFRoZSBsYXN0IG9uZSBpcyBhIHBzZXVkby1pbnNuIHRvIGxpbmsgdG8gdGhlIG5leHQgY2hhaW4uCi0JIEl0IGlzIGFsc28gdXNlZCB0byByZWNvcmQgdGhlIGluc24gY291bnQgZm9yIHRoaXMgY2hhaW4uICAqLwotICAgICAgewotCWNvbnN0IElERVNDICppZDsKLQotCS8qIFdhcyBwYmIgdGVybWluYXRlZCBieSBhIGN0aT8gICovCi0JaWYgKF9jdGlfc2MpCi0JICB7Ci0JICAgIGlkID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0NUSV9DSEFJTl07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZCA9ICYgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW0BDUFVAX0lOU05fWF9DSEFJTl07Ci0JICB9Ci0JU0VNX1NFVF9DT0RFICgmc2MtPmFyZ2J1ZiwgaWQsIEZBU1RfUCk7Ci0Jc2MtPmFyZ2J1Zi5pZGVzYyA9IGlkOwotCXNjLT5hcmdidWYuYWRkciA9IHBjOwotCXNjLT5hcmdidWYuZmllbGRzLmNoYWluLmluc25fY291bnQgPSBfaW5zbl9jb3VudDsKLQlzYy0+YXJnYnVmLmZpZWxkcy5jaGFpbi5uZXh0ID0gMDsKLQlzYy0+YXJnYnVmLmZpZWxkcy5jaGFpbi5icmFuY2hfdGFyZ2V0ID0gMDsKLQkrK3NjOwotICAgICAgfQotCi0gICAgICAvKiBVcGRhdGUgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgZnJlZSBlbnRyeSwgbWF5IG5vdCBoYXZlIHVzZWQgYXMKLQkgbWFueSBlbnRyaWVzIGFzIHdhcyBhc2tlZCBmb3IuICAqLwotICAgICAgQ1BVX1NDQUNIRV9ORVhUX0ZSRUUgKGN1cnJlbnRfY3B1KSA9IHNjOwotICAgICAgLyogUmVjb3JkIGxlbmd0aCBvZiBjaGFpbiBpZiBwcm9maWxpbmcuCi0JIFRoaXMgaW5jbHVkZXMgdmlydHVhbCBpbnNucyBzaW5jZSB0aGV5IGNvdW50IGFnYWluc3QKLQkgbWF4X2luc25zIHRvby4gICovCi0gICAgICBpZiAoISBGQVNUX1ApCi0JUFJPRklMRV9DT1VOVF9TQ0FDSEVfQ0hBSU5fTEVOR1RIIChjdXJyZW50X2NwdSwgc2MgLSBvcmlnX3NjKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5ld192cGM7Ci19Ci0KLS8qIENoYWluIHRvIHRoZSBuZXh0IGJsb2NrIGZyb20gYSBub24tY3RpIHRlcm1pbmF0ZWQgcHJldmlvdXMgYmxvY2suICAqLwotCi1JTkxJTkUgU0VNX1BDCi1AY3B1QF9wYmJfY2hhaW4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotCi0gIFBCQl9VUERBVEVfSU5TTl9DT1VOVCAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotCi0gIFNFVF9IX1BDIChhYnVmLT5hZGRyKTsKLQotICAvKiBJZiBub3QgcnVubmluZyBmb3JldmVyLCBleGl0IGJhY2sgdG8gbWFpbiBsb29wLiAgKi8KLSAgaWYgKENQVV9NQVhfU0xJQ0VfSU5TTlMgKGN1cnJlbnRfY3B1KSAhPSAwCi0gICAgICAvKiBBbHNvIGV4aXQgYmFjayB0byBtYWluIGxvb3AgaWYgdGhlcmUncyBhbiBldmVudC4KLSAgICAgICAgIE5vdGUgdGhhdCBpZiBDUFVfTUFYX1NMSUNFX0lOU05TICE9IDEsIGV2ZW50cyB3b24ndCBnZXQgcHJvY2Vzc2VkCi0JIGF0IHRoZSAicmlnaHQiIHRpbWUsIGJ1dCB0aGVuIHRoYXQgd2FzIHdoYXQgd2FzIGFza2VkIGZvci4KLQkgVGhlcmUgaXMgbm8gc2lsdmVyIGJ1bGxldCBmb3Igc2ltdWxhdG9yIGVuZ2luZXMuCi0gICAgICAgICA/Pz8gQ2xlYXJseSB0aGlzIG5lZWRzIGEgY2xlYW5lciBpbnRlcmZhY2UuCi0JIEF0IHByZXNlbnQgaXQncyBqdXN0IHNvIEN0cmwtQyB3b3Jrcy4gICovCi0gICAgICB8fCBTVEFURV9FVkVOVFMgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+d29ya19wZW5kaW5nKQotICAgIENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSA9IDA7Ci0KLSAgLyogSWYgY2hhaW5lZCB0byBuZXh0IGJsb2NrLCBnbyBzdHJhaWdodCB0byBpdC4gICovCi0gIGlmIChhYnVmLT5maWVsZHMuY2hhaW4ubmV4dCkKLSAgICByZXR1cm4gYWJ1Zi0+ZmllbGRzLmNoYWluLm5leHQ7Ci0gIC8qIFNlZSBpZiBuZXh0IGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQuICAqLwotICBhYnVmLT5maWVsZHMuY2hhaW4ubmV4dCA9IHNjYWNoZV9sb29rdXAgKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyKTsKLSAgaWYgKGFidWYtPmZpZWxkcy5jaGFpbi5uZXh0KQotICAgIHJldHVybiBhYnVmLT5maWVsZHMuY2hhaW4ubmV4dDsKLSAgLyogTm9wZSwgc28gbmV4dCBpbnNuIGlzIGEgdmlydHVhbCBpbnNuIHRvIGludm9rZSB0aGUgY29tcGlsZXIKLSAgICAgKGJlZ2luIGEgcGJiKS4gICovCi0gIHJldHVybiBDUFVfU0NBQ0hFX1BCQl9CRUdJTiAoY3VycmVudF9jcHUpOwotfQotCi0vKiBDaGFpbiB0byB0aGUgbmV4dCBibG9jayBmcm9tIGEgY3RpIHRlcm1pbmF0ZWQgcHJldmlvdXMgYmxvY2suCi0gICBCUl9UWVBFIGluZGljYXRlcyB3aGV0aGVyIHRoZSBicmFuY2ggd2FzIHRha2VuIGFuZCB3aGV0aGVyIHdlIGNhbiBjYWNoZQotICAgdGhlIHZwYyBvZiB0aGUgYnJhbmNoIHRhcmdldC4KLSAgIE5FV19QQyBpcyB0aGUgdGFyZ2V0J3MgYnJhbmNoIGFkZHJlc3MsIGFuZCBpcyBvbmx5IHZhbGlkIGlmCi0gICBCUl9UWVBFICE9IFNFTV9CUkFOQ0hfVU5UQUtFTi4gICovCi0KLUlOTElORSBTRU1fUEMKLUBjcHVAX3BiYl9jdGlfY2hhaW4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcsCi0JCSAgICAgU0VNX0JSQU5DSF9UWVBFIGJyX3R5cGUsIFBDQUREUiBuZXdfcGMpCi17Ci0gIFNFTV9QQyAqbmV3X3ZwY19wdHI7Ci0KLSAgUEJCX1VQREFURV9JTlNOX0NPVU5UIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0KLSAgLyogSWYgbm90IHJ1bm5pbmcgZm9yZXZlciwgZXhpdCBiYWNrIHRvIG1haW4gbG9vcC4gICovCi0gIGlmIChDUFVfTUFYX1NMSUNFX0lOU05TIChjdXJyZW50X2NwdSkgIT0gMAotICAgICAgLyogQWxzbyBleGl0IGJhY2sgdG8gbWFpbiBsb29wIGlmIHRoZXJlJ3MgYW4gZXZlbnQuCi0gICAgICAgICBOb3RlIHRoYXQgaWYgQ1BVX01BWF9TTElDRV9JTlNOUyAhPSAxLCBldmVudHMgd29uJ3QgZ2V0IHByb2Nlc3NlZAotCSBhdCB0aGUgInJpZ2h0IiB0aW1lLCBidXQgdGhlbiB0aGF0IHdhcyB3aGF0IHdhcyBhc2tlZCBmb3IuCi0JIFRoZXJlIGlzIG5vIHNpbHZlciBidWxsZXQgZm9yIHNpbXVsYXRvciBlbmdpbmVzLgotICAgICAgICAgPz8/IENsZWFybHkgdGhpcyBuZWVkcyBhIGNsZWFuZXIgaW50ZXJmYWNlLgotCSBBdCBwcmVzZW50IGl0J3MganVzdCBzbyBDdHJsLUMgd29ya3MuICAqLwotICAgICAgfHwgU1RBVEVfRVZFTlRTIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPndvcmtfcGVuZGluZykKLSAgICBDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkgPSAwOwotCi0gIC8qIFJlc3RhcnQgY29tcGlsZXIgaWYgd2UgYnJhbmNoZWQgdG8gYW4gdW5jYWNoZWFibGUgYWRkcmVzcwotICAgICAoZS5nLiAiaiByZWciKS4gICovCi0gIGlmIChicl90eXBlID09IFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEUpCi0gICAgewotICAgICAgU0VUX0hfUEMgKG5ld19wYyk7Ci0gICAgICByZXR1cm4gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKLSAgICB9Ci0KLSAgLyogSWYgYnJhbmNoIHdhc24ndCB0YWtlbiwgdXBkYXRlIHRoZSBwYyBhbmQgc2V0IEJSX0FERFJfUFRSIHRvIG91cgotICAgICBuZXh0IGNoYWluIHB0ci4gICovCi0gIGlmIChicl90eXBlID09IFNFTV9CUkFOQ0hfVU5UQUtFTikKLSAgICB7Ci0gICAgICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgICAgIG5ld19wYyA9IGFidWYtPmFkZHI7Ci0gICAgICBTRVRfSF9QQyAobmV3X3BjKTsKLSAgICAgIG5ld192cGNfcHRyID0gJmFidWYtPmZpZWxkcy5jaGFpbi5uZXh0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICAgICAgU0VUX0hfUEMgKG5ld19wYyk7Ci0gICAgICBuZXdfdnBjX3B0ciA9ICZhYnVmLT5maWVsZHMuY2hhaW4uYnJhbmNoX3RhcmdldDsKLSAgICB9Ci0KLSAgLyogSWYgY2hhaW5lZCB0byBuZXh0IGJsb2NrLCBnbyBzdHJhaWdodCB0byBpdC4gICovCi0gIGlmICgqbmV3X3ZwY19wdHIpCi0gICAgcmV0dXJuICpuZXdfdnBjX3B0cjsKLSAgLyogU2VlIGlmIG5leHQgYmxvY2sgaGFzIGFscmVhZHkgYmVlbiBjb21waWxlZC4gICovCi0gICpuZXdfdnBjX3B0ciA9IHNjYWNoZV9sb29rdXAgKGN1cnJlbnRfY3B1LCBuZXdfcGMpOwotICBpZiAoKm5ld192cGNfcHRyKQotICAgIHJldHVybiAqbmV3X3ZwY19wdHI7Ci0gIC8qIE5vcGUsIHNvIG5leHQgaW5zbiBpcyBhIHZpcnR1YWwgaW5zbiB0byBpbnZva2UgdGhlIGNvbXBpbGVyCi0gICAgIChiZWdpbiBhIHBiYikuICAqLwotICByZXR1cm4gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKLX0KLQotLyogeC1iZWZvcmUgaGFuZGxlci4KLSAgIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBlYWNoIGluc24uICAqLwotCi12b2lkCi1AY3B1QF9wYmJfYmVmb3JlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYykKLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gc2M7Ci0gIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgZmlyc3RfcCA9IGFidWYtPmZpZWxkcy5iZWZvcmUuZmlyc3RfcDsKLSAgY29uc3QgQVJHQlVGICpjdXJfYWJ1ZiA9IFNFTV9BUkdCVUYgKHNjICsgMSk7Ci0gIGNvbnN0IElERVNDICpjdXJfaWRlc2MgPSBjdXJfYWJ1Zi0+aWRlc2M7Ci0gIFBDQUREUiBwYyA9IGN1cl9hYnVmLT5hZGRyOwotCi0gIGlmIChBUkdCVUZfUFJPRklMRV9QIChjdXJfYWJ1ZikpCi0gICAgUFJPRklMRV9DT1VOVF9JTlNOIChjdXJyZW50X2NwdSwgcGMsIGN1cl9pZGVzYy0+bnVtKTsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBpbnNuLCBmaW5pc2ggdXAgdGhlIHByZXZpb3VzIG9uZS4gICovCi0KLSAgaWYgKCEgZmlyc3RfcCkKLSAgICB7Ci0gICAgICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0JewotCSAgY29uc3QgU0VNX0FSRyBwcmV2X3NlbV9hcmcgPSBzYyAtIDE7Ci0JICBjb25zdCBBUkdCVUYgKnByZXZfYWJ1ZiA9IFNFTV9BUkdCVUYgKHByZXZfc2VtX2FyZyk7Ci0JICBjb25zdCBJREVTQyAqcHJldl9pZGVzYyA9IHByZXZfYWJ1Zi0+aWRlc2M7Ci0JICBpbnQgY3ljbGVzOwotCi0JICAvKiA/Pz8gTWF5IHdhbnQgdG8gbWVhc3VyZSBhbGwgaW5zbnMgaWYgZG9pbmcgaW5zbiB0cmFjaW5nLiAgKi8KLQkgIGlmIChBUkdCVUZfUFJPRklMRV9QIChwcmV2X2FidWYpKQotCSAgICB7Ci0JICAgICAgY3ljbGVzID0gKCpwcmV2X2lkZXNjLT50aW1pbmctPm1vZGVsX2ZuKSAoY3VycmVudF9jcHUsIHByZXZfc2VtX2FyZyk7Ci0JICAgICAgQGNwdUBfbW9kZWxfaW5zbl9hZnRlciAoY3VycmVudF9jcHUsIDAgLypsYXN0X3AqLywgY3ljbGVzKTsKLQkgICAgfQotCX0KLQotICAgICAgVFJBQ0VfSU5TTl9GSU5JIChjdXJyZW50X2NwdSwgY3VyX2FidWYsIDAgLypsYXN0X3AqLyk7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBMYXRlciBtYWtlIGNvdmVyIG1hY3JvczogUFJPRklMRV9JTlNOX3tJTklULEZJTkl9LiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpCi0gICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChjdXJfYWJ1ZikpCi0gICAgQGNwdUBfbW9kZWxfaW5zbl9iZWZvcmUgKGN1cnJlbnRfY3B1LCBmaXJzdF9wKTsKLQotICBUUkFDRV9JTlNOX0lOSVQgKGN1cnJlbnRfY3B1LCBjdXJfYWJ1ZiwgZmlyc3RfcCk7Ci0gIFRSQUNFX0lOU04gKGN1cnJlbnRfY3B1LCBjdXJfaWRlc2MtPmlkYXRhLCBjdXJfYWJ1ZiwgcGMpOwotfQotCi0vKiB4LWFmdGVyIGhhbmRsZXIuCi0gICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhIHNlcmlhbCBpbnNuIG9yIGF0IHRoZSBlbmQgb2YgYSBncm91cCBvZiBwYXJhbGxlbAotICAgaW5zbnMuICAqLwotCi12b2lkCi1AY3B1QF9wYmJfYWZ0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTQ0FDSEUgKnNjKQotewotICBTRU1fQVJHIHNlbV9hcmcgPSBzYzsKLSAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGNvbnN0IFNFTV9BUkcgcHJldl9zZW1fYXJnID0gc2MgLSAxOwotICBjb25zdCBBUkdCVUYgKnByZXZfYWJ1ZiA9IFNFTV9BUkdCVUYgKHByZXZfc2VtX2FyZyk7Ci0KLSAgLyogPz8/IE1heSB3YW50IHRvIG1lYXN1cmUgYWxsIGluc25zIGlmIGRvaW5nIGluc24gdHJhY2luZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KQotICAgICAgJiYgQVJHQlVGX1BST0ZJTEVfUCAocHJldl9hYnVmKSkKLSAgICB7Ci0gICAgICBjb25zdCBJREVTQyAqcHJldl9pZGVzYyA9IHByZXZfYWJ1Zi0+aWRlc2M7Ci0gICAgICBpbnQgY3ljbGVzOwotCi0gICAgICBjeWNsZXMgPSAoKnByZXZfaWRlc2MtPnRpbWluZy0+bW9kZWxfZm4pIChjdXJyZW50X2NwdSwgcHJldl9zZW1fYXJnKTsKLSAgICAgIEBjcHVAX21vZGVsX2luc25fYWZ0ZXIgKGN1cnJlbnRfY3B1LCAxIC8qbGFzdF9wKi8sIGN5Y2xlcyk7Ci0gICAgfQotICBUUkFDRV9JTlNOX0ZJTkkgKGN1cnJlbnRfY3B1LCBwcmV2X2FidWYsIDEgLypsYXN0X3AqLyk7Ci19Ci0KLSNkZWZpbmUgRkFTVF9QIDAKLQotdm9pZAotQGNwdUBfZW5naW5lX3J1bl9mdWxsIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgU0lNX0RFU0MgY3VycmVudF9zdGF0ZSA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOwotICBTQ0FDSEUgKnNjYWNoZSA9IENQVV9TQ0FDSEVfQ0FDSEUgKGN1cnJlbnRfY3B1KTsKLSAgLyogdmlydHVhbCBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgU0VNX1BDIHZwYzsKLSNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTAotICAvKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGN0aSdzIGFuZCBjdGktY2hhaW4uICAqLwotICBTRU1fQlJBTkNIX1RZUEUgcGJiX2JyX3R5cGU7Ci0gIFBDQUREUiBwYmJfYnJfbnBjOwotI2VuZGlmCi0KLUVPRgotCi1jYXNlIHgkcGFyYWxsZWwgaW4KLXhyZWFkIHwgeHdyaXRlKQotICAgIGNhdCA8PCBFT0YKLSAgUEFSRVhFQyBwYnVmc1tNQVhfUEFSQUxMRUxfSU5TTlNdOwotICBQQVJFWEVDICpwYXJfZXhlYyA9ICZwYnVmc1swXTsKLQotRU9GCi0gICAgOzsKLWVzYWMKLQotIyBBbnkgaW5pdGlhbGl6YXRpb24gY29kZSBiZWZvcmUgbG9vcGluZyBzdGFydHMuCi0jIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGRlY2xhcmUgc29tZSBsb2NhbHMuCi0ke1NIRUxMfSAkaW5maWxlIGluaXQKLQotY2F0IDw8IEVPRgotCi0gIGlmICghIENQVV9JREVTQ19TRU1fSU5JVF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgLyogPz8/ICd0d291bGQgYmUgbmljZSB0byBtb3ZlIHRoaXMgdXAgYSBsZXZlbCBhbmQgb25seSBjYWxsIGl0IG9uY2UuCi0JIE9uIHRoZSBvdGhlciBoYW5kLCBpbiB0aGUgImxldCdzIGdvIGZhc3QiIGNhc2UgdGhlIHRlc3QgaXMgb25seSBkb25lCi0JIG9uY2UgcGVyIHBiYiAoc2luY2Ugd2Ugb25seSByZXR1cm4gdG8gdGhlIG1haW4gbG9vcCBhdCB0aGUgZW5kIG9mCi0JIGEgcGJiKS4gIEFuZCBpbiB0aGUgImxldCdzIHJ1biB1bnRpbCB3ZSdyZSBkb25lIiBjYXNlIHdlIGRvbid0IHJldHVybgotCSB1bnRpbCB0aGUgcHJvZ3JhbSBleGl0cy4gICovCi0KLSNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTAotI2lmIGRlZmluZWQgKF9fR05VQ19fKQotLyogPz8/IExhdGVyIG1heWJlIHBhc3RlIHNlbS1zd2l0Y2guYyBpbiB3aGVuIGJ1aWxkaW5nIG1haW5sb29wLmMuICAqLwotI2RlZmluZSBERUZJTkVfTEFCRUxTCi0jaW5jbHVkZSAiJHN3aXRjaCIKLSNlbmRpZgotI2Vsc2UKLSAgICAgIEBjcHVAX3NlbV9pbml0X2lkZXNjX3RhYmxlIChjdXJyZW50X2NwdSk7Ci0jZW5kaWYKLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgImJlZ2luIChjb21waWxlKSBhIHBiYiIgdmlydHVhbCBpbnNuLiAgKi8KLSAgICAgIHZwYyA9IENQVV9TQ0FDSEVfUEJCX0JFR0lOIChjdXJyZW50X2NwdSk7Ci0gICAgICBTRU1fU0VUX0ZVTExfQ09ERSAoU0VNX0FSR0JVRiAodnBjKSwKLQkJCSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQkVHSU5dKTsKLSAgICAgIHZwYy0+YXJnYnVmLmlkZXNjID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0JFR0lOXTsKLQotICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gICAgfQotCi0gIENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gIC8qID8/PyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSdyZSByZXR1cm5pbmcgdG8gdGhlIG1haW4gbG9vcCBhZnRlciBldmVyeQotICAgICBwYmIgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHBiYl9iZWdpbiBlYWNoIHRpbWUgKHdoaWNoIGhhc2hlcyBvbiB0aGUgcGMKLSAgICAgYW5kIGRvZXMgYSB0YWJsZSBsb29rdXApLiAgQSB3YXkgdG8gc3BlZWQgdGhpcyB1cCBpcyB0byBzYXZlIHZwYwotICAgICBiZXR3ZWVuIGNhbGxzLiAgKi8KLSAgdnBjID0gQGNwdUBfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgRkFTVF9QKTsKLQotICBkbwotICAgIHsKLS8qIGJlZ2luIGZ1bGwtZXhlYy1wYmIgKi8KLUVPRgotCi0ke1NIRUxMfSAkaW5maWxlIGZ1bGwtZXhlYy1wYmIKLQotY2F0IDw8IEVPRgotLyogZW5kIGZ1bGwtZXhlYy1wYmIgKi8KLSAgICB9Ci0gIHdoaWxlIChDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkpOwotfQotCi0jdW5kZWYgRkFTVF9QCi0KLUVPRgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb21waWxlIGVuZ2luZTogZmFzdCB2ZXJzaW9uLgotCi1pZiBbIHgkZmFzdCA9IHh5ZXMgXSA7IHRoZW4KLQotICAgIGNhdCA8PCBFT0YKLQotI2RlZmluZSBGQVNUX1AgMQotCi12b2lkCi1AY3B1QF9lbmdpbmVfcnVuX2Zhc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICBTSU1fREVTQyBjdXJyZW50X3N0YXRlID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0gIFNDQUNIRSAqc2NhY2hlID0gQ1BVX1NDQUNIRV9DQUNIRSAoY3VycmVudF9jcHUpOwotICAvKiB2aXJ0dWFsIHByb2dyYW0gY291bnRlciAqLwotICBTRU1fUEMgdnBjOwotI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCi0gIC8qIEZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gY3RpJ3MgYW5kIGN0aS1jaGFpbi4gICovCi0gIFNFTV9CUkFOQ0hfVFlQRSBwYmJfYnJfdHlwZTsKLSAgUENBRERSIHBiYl9icl9ucGM7Ci0jZW5kaWYKLQotRU9GCi0KLWNhc2UgeCRwYXJhbGxlbCBpbgoteHJlYWQgfCB4d3JpdGUpCi0gICAgY2F0IDw8IEVPRgotICBQQVJFWEVDIHBidWZzW01BWF9QQVJBTExFTF9JTlNOU107Ci0gIFBBUkVYRUMgKnBhcl9leGVjID0gJnBidWZzWzBdOwotCi1FT0YKLSAgICA7OwotZXNhYwotCi0jIEFueSBpbml0aWFsaXphdGlvbiBjb2RlIGJlZm9yZSBsb29waW5nIHN0YXJ0cy4KLSMgTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgZGVjbGFyZSBzb21lIGxvY2Fscy4KLSR7U0hFTEx9ICRpbmZpbGUgaW5pdAotCi1jYXQgPDwgRU9GCi0KLSAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICAvKiA/Pz8gJ3R3b3VsZCBiZSBuaWNlIHRvIG1vdmUgdGhpcyB1cCBhIGxldmVsIGFuZCBvbmx5IGNhbGwgaXQgb25jZS4KLQkgT24gdGhlIG90aGVyIGhhbmQsIGluIHRoZSAibGV0J3MgZ28gZmFzdCIgY2FzZSB0aGUgdGVzdCBpcyBvbmx5IGRvbmUKLQkgb25jZSBwZXIgcGJiIChzaW5jZSB3ZSBvbmx5IHJldHVybiB0byB0aGUgbWFpbiBsb29wIGF0IHRoZSBlbmQgb2YKLQkgYSBwYmIpLiAgQW5kIGluIHRoZSAibGV0J3MgcnVuIHVudGlsIHdlJ3JlIGRvbmUiIGNhc2Ugd2UgZG9uJ3QgcmV0dXJuCi0JIHVudGlsIHRoZSBwcm9ncmFtIGV4aXRzLiAgKi8KLQotI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pCi0vKiA/Pz8gTGF0ZXIgbWF5YmUgcGFzdGUgc2VtLXN3aXRjaC5jIGluIHdoZW4gYnVpbGRpbmcgbWFpbmxvb3AuYy4gICovCi0jZGVmaW5lIERFRklORV9MQUJFTFMKLSNpbmNsdWRlICIkc3dpdGNoIgotI2VuZGlmCi0jZWxzZQotICAgICAgQGNwdUBfc2VtZl9pbml0X2lkZXNjX3RhYmxlIChjdXJyZW50X2NwdSk7Ci0jZW5kaWYKLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgImJlZ2luIChjb21waWxlKSBhIHBiYiIgdmlydHVhbCBpbnNuLiAgKi8KLSAgICAgIHZwYyA9IENQVV9TQ0FDSEVfUEJCX0JFR0lOIChjdXJyZW50X2NwdSk7Ci0gICAgICBTRU1fU0VUX0ZBU1RfQ09ERSAoU0VNX0FSR0JVRiAodnBjKSwKLQkJCSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQkVHSU5dKTsKLSAgICAgIHZwYy0+YXJnYnVmLmlkZXNjID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0JFR0lOXTsKLQotICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gICAgfQotCi0gIENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSA9IDE7Ci0gIC8qID8/PyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSdyZSByZXR1cm5pbmcgdG8gdGhlIG1haW4gbG9vcCBhZnRlciBldmVyeQotICAgICBwYmIgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHBiYl9iZWdpbiBlYWNoIHRpbWUgKHdoaWNoIGhhc2hlcyBvbiB0aGUgcGMKLSAgICAgYW5kIGRvZXMgYSB0YWJsZSBsb29rdXApLiAgQSB3YXkgdG8gc3BlZWQgdGhpcyB1cCBpcyB0byBzYXZlIHZwYwotICAgICBiZXR3ZWVuIGNhbGxzLiAgKi8KLSAgdnBjID0gQGNwdUBfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgRkFTVF9QKTsKLQotICBkbwotICAgIHsKLS8qIGJlZ2luIGZhc3QtZXhlYy1wYmIgKi8KLUVPRgotCi0ke1NIRUxMfSAkaW5maWxlIGZhc3QtZXhlYy1wYmIKLQotY2F0IDw8IEVPRgotLyogZW5kIGZhc3QtZXhlYy1wYmIgKi8KLSAgICB9Ci0gIHdoaWxlIChDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkpOwotfQotCi0jdW5kZWYgRkFTVF9QCi0KLUVPRgotZmkgIyAtZmFzdAotCi1maSAjIC1wYmIKLQotIyBQcm9jZXNzIEBjcHVALEBDUFVAIGFwcGVhcmluZyBpbiBtYWlubG9vcC5pbi4KLXNlZCAtZSAicy9AY3B1QC8kY3B1L2ciIC1lICJzL0BDUFVALyRDUFUvZyIgPCB0bXAtbWxvb3AuY2luID4gbWxvb3AuY2luCi1yYz0kPwotcm0gLWYgdG1wLW1sb29wLmNpbgotCi1leGl0ICRyYwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9nZW5ubHR2YWxzLnNoIGIvc2ltL2NvbW1vbi9nZW5ubHR2YWxzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNWM3Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vZ2Vubmx0dmFscy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGUgbmx0dmFscy5kZWYsIGEgZmlsZSB0aGF0IGRlc2NyaWJlcyB2YXJpb3VzIG5ld2xpYi9saWJnbG9zcwotIyB0YXJnZXQgdmFsdWVzIHVzZWQgYnkgdGhlIGhvc3QvdGFyZ2V0IGludGVyZmFjZS4KLSMKLSMgU3ludGF4OiAvYmluL3NoIGdlbm5sdHZhbHMuc2ggc2hlbGwgc3Jjcm9vdCBjcHAKLQotc2hlbGw9JDEKLXNyY3Jvb3Q9JDIKLWNwcD0kMwotCi1zcmNjb209JHNyY3Jvb3Qvc2ltL2NvbW1vbgotCi1lY2hvICcvKiBOZXdsaWIvbGliZ2xvc3MgbWFjcm8gdmFsdWVzIG5lZWRlZCBieSByZW1vdGUgdGFyZ2V0IHN1cHBvcnQuICAqLycKLWVjaG8gJy8qIFRoaXMgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCBieSBnZW5ubHR2YWxzLnNoLiAgKi8nCi0KLSRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggIiIgZXJybm8gJHtzcmNyb290fS9uZXdsaWIvbGliYy9pbmNsdWRlIFwKLQkiZXJybm8uaCBzeXMvZXJybm8uaCIgJ0VbQS1aMC05XSonICIke2NwcH0iCi0KLSRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggIiIgc2lnbmFsICR7c3Jjcm9vdH0vbmV3bGliL2xpYmMvaW5jbHVkZSBcCi0JInNpZ25hbC5oIHN5cy9zaWduYWwuaCIgJ1NJR1tBLVowLTldKicgIiR7Y3BwfSIKLQotJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAiIiBvcGVuICR7c3Jjcm9vdH0vbmV3bGliL2xpYmMvaW5jbHVkZSBcCi0JImZjbnRsLmggc3lzL2ZjbnRsLmgiICdPX1tBLVowLTldKicgIiR7Y3BwfSIKLQotIyBVbmZvcnR1bmF0ZWx5LCBlYWNoIG5ld2xpYi9saWJnbG9zcyBwb3J0IGhhcyBzZWVuIGZpdCB0byBkZWZpbmUgdGhlaXIgb3duCi0jIHN5c2NhbGwuaCBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHN5c3RlbSBjYWxsIG51bWJlcnMgY2FuIHZhcnkgZm9yIGVhY2ggcG9ydC4KLSMgU3VwcG9ydCBmb3IgYWxsIHRoaXMgY3J1ZCBpcyBrZXB0IGhlcmUsIHJhdGhlciB0aGFuIHRyeWluZyB0byBnZXQgdG9vIGZhbmN5LgotIyBJZiB5b3Ugd2FudCB0byB0cnkgdG8gaW1wcm92ZSB0aGlzLCBwbGVhc2UgZG8sIGJ1dCBkb24ndCBicmVhayBhbnl0aGluZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc3RhbmRhcmQgc3lzY2FsbC5oIGZpbGUgKGxpYmdsb3NzL3N5c2NhbGwuaCkgbm93IHdoaWNoCi0jIGhvcGVmdWxseSBtb3JlIHRhcmdldHMgY2FuIHVzZS4KLQotZGlyPW5ld2xpYi9saWJjL3N5cy9kMTB2L3N5cyB0YXJnZXQ9ZDEwdgotJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAotCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKLQotZGlyPWxpYmdsb3NzIHRhcmdldD1kMzB2Ci0kc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCi0JInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgotCi1kaXI9bGliZ2xvc3MgdGFyZ2V0PWZyMzAKLSRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggJHRhcmdldCBzeXMgJHtzcmNyb290fS8kZGlyIFwKLQkic3lzY2FsbC5oIiAnU1lTX1tfQS1aYS16MC05XSonICIke2NwcH0iCi0KLWRpcj1saWJnbG9zcy9pOTYwIHRhcmdldD1pOTYwCi0kc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCi0JInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgotCi1kaXI9bGliZ2xvc3MgdGFyZ2V0PW0zMnIKLSRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggJHRhcmdldCBzeXMgJHtzcmNyb290fS8kZGlyIFwKLQkic3lzY2FsbC5oIiAnU1lTX1tfQS1aYS16MC05XSonICIke2NwcH0iCi0KLWRpcj1saWJnbG9zcyB0YXJnZXQ9bW4xMDIwMAotJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAotCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKLQotZGlyPWxpYmdsb3NzIHRhcmdldD1tbjEwMzAwCi0kc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCi0JInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgotCi1kaXI9bGliZ2xvc3MgdGFyZ2V0PXNwYXJjCi0kc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCi0JInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgotCi1kaXI9bGliZ2xvc3Mvdjg1MC9zeXMgdGFyZ2V0PXY4NTAKLSRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggJHRhcmdldCBzeXMgJHtzcmNyb290fS8kZGlyIFwKLQkic3lzY2FsbC5oIiAnU1lTX1tfQS1aYS16MC05XSonICIke2NwcH0iCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2dlbnRtYXAuYyBiL3NpbS9jb21tb24vZ2VudG1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY1ZDBkLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vZ2VudG1hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIEdlbmVyYXRlIHRhcmctdmFscy5oIGFuZCB0YXJnLW1hcC5jLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXN0cnVjdCB0ZGVmcyB7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IHZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCB0ZGVmcyBzeXNfdGRlZnNbXSA9IHsKLSNkZWZpbmUgc3lzX2RlZnMKLSNpbmNsdWRlICJ0YXJnLXZhbHMuZGVmIgotI3VuZGVmIHN5c19kZWZzCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRkZWZzIGVycm5vX3RkZWZzW10gPSAgewotI2RlZmluZSBlcnJub19kZWZzCi0jaW5jbHVkZSAidGFyZy12YWxzLmRlZiIKLSN1bmRlZiBlcnJub19kZWZzCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRkZWZzIG9wZW5fdGRlZnNbXSA9IHsKLSNkZWZpbmUgb3Blbl9kZWZzCi0jaW5jbHVkZSAidGFyZy12YWxzLmRlZiIKLSN1bmRlZiBvcGVuX2RlZnMKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nZW5fdGFyZ192YWxzX2ggKCkKLXsKLSAgc3RydWN0IHRkZWZzICp0OwotCi0gIHByaW50ZiAoIi8qIFRhcmdldCBoZWFkZXIgdmFsdWVzIG5lZWRlZCBieSB0aGUgc2ltdWxhdG9yIGFuZCBnZGIuICAqL1xuIik7Ci0gIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCBieSBnZW50bWFwLmMuICAqL1xuXG4iKTsKLQotICBwcmludGYgKCIjaWZuZGVmIFRBUkdfVkFMU19IXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBUQVJHX1ZBTFNfSFxuXG4iKTsKLQotICBwcmludGYgKCIvKiBzeXNjYWxsIHZhbHVlcyAqL1xuIik7Ci0gIGZvciAodCA9ICZzeXNfdGRlZnNbMF07IHQtPnN5bWJvbDsgKyt0KQotICAgIHByaW50ZiAoIiNkZWZpbmUgVEFSR0VUXyVzICVkXG4iLCB0LT5zeW1ib2wsIHQtPnZhbHVlKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICBwcmludGYgKCIvKiBlcnJubyB2YWx1ZXMgKi9cbiIpOwotICBmb3IgKHQgPSAmZXJybm9fdGRlZnNbMF07IHQtPnN5bWJvbDsgKyt0KQotICAgIHByaW50ZiAoIiNkZWZpbmUgVEFSR0VUXyVzICVkXG4iLCB0LT5zeW1ib2wsIHQtPnZhbHVlKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICBwcmludGYgKCIvKiBvcGVuIGZsYWcgdmFsdWVzICovXG4iKTsKLSAgZm9yICh0ID0gJm9wZW5fdGRlZnNbMF07IHQtPnN5bWJvbDsgKyt0KQotICAgIHByaW50ZiAoIiNkZWZpbmUgVEFSR0VUXyVzIDB4JXhcbiIsIHQtPnN5bWJvbCwgdC0+dmFsdWUpOwotICBwcmludGYgKCJcbiIpOwotCi0gIHByaW50ZiAoIiNlbmRpZiAvKiBUQVJHX1ZBTFNfSCAqL1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fdGFyZ19tYXBfYyAoKQotewotICBzdHJ1Y3QgdGRlZnMgKnQ7Ci0KLSAgcHJpbnRmICgiLyogVGFyZ2V0IHZhbHVlIG1hcHBpbmcgdXRpbGl0aWVzIG5lZWRlZCBieSB0aGUgc2ltdWxhdG9yIGFuZCBnZGIuICAqL1xuIik7Ci0gIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCBieSBnZW50bWFwLmMuICAqL1xuXG4iKTsKLQotICBwcmludGYgKCIjaW5jbHVkZSA8ZXJybm8uaD5cbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSA8ZmNudGwuaD5cbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSBcImFuc2lkZWNsLmhcIlxuIik7Ci0gIHByaW50ZiAoIiNpbmNsdWRlIFwiY2FsbGJhY2suaFwiXG4iKTsKLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJ0YXJnLXZhbHMuaFwiXG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICBwcmludGYgKCIvKiBzeXNjYWxsIG1hcHBpbmcgdGFibGUgKi9cbiIpOwotICBwcmludGYgKCJDQl9UQVJHRVRfREVGU19NQVAgY2JfaW5pdF9zeXNjYWxsX21hcFtdID0ge1xuIik7Ci0gIGZvciAodCA9ICZzeXNfdGRlZnNbMF07IHQtPnN5bWJvbDsgKyt0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiNpZmRlZiBDQl8lc1xuIiwgdC0+c3ltYm9sKTsKLSAgICAgIHByaW50ZiAoIiAgeyBDQl8lcywgVEFSR0VUXyVzIH0sXG4iLCB0LT5zeW1ib2wsIHQtPnN5bWJvbCk7Ci0gICAgICBwcmludGYgKCIjZW5kaWZcbiIpOwotICAgIH0KLSAgcHJpbnRmICgiICB7IC0xLCAtMSB9XG4iKTsKLSAgcHJpbnRmICgifTtcblxuIik7Ci0KLSAgcHJpbnRmICgiLyogZXJybm8gbWFwcGluZyB0YWJsZSAqL1xuIik7Ci0gIHByaW50ZiAoIkNCX1RBUkdFVF9ERUZTX01BUCBjYl9pbml0X2Vycm5vX21hcFtdID0ge1xuIik7Ci0gIGZvciAodCA9ICZlcnJub190ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCi0gICAgewotICAgICAgcHJpbnRmICgiI2lmZGVmICVzXG4iLCB0LT5zeW1ib2wpOwotICAgICAgcHJpbnRmICgiICB7ICVzLCBUQVJHRVRfJXMgfSxcbiIsIHQtPnN5bWJvbCwgdC0+c3ltYm9sKTsKLSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0gICAgfQotICBwcmludGYgKCIgIHsgMCwgMCB9XG4iKTsKLSAgcHJpbnRmICgifTtcblxuIik7Ci0KLSAgcHJpbnRmICgiLyogb3BlbiBmbGFncyBtYXBwaW5nIHRhYmxlICovXG4iKTsKLSAgcHJpbnRmICgiQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfb3Blbl9tYXBbXSA9IHtcbiIpOwotICBmb3IgKHQgPSAmb3Blbl90ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCi0gICAgewotICAgICAgcHJpbnRmICgiI2lmZGVmICVzXG4iLCB0LT5zeW1ib2wpOwotICAgICAgcHJpbnRmICgiICB7ICVzLCBUQVJHRVRfJXMgfSxcbiIsIHQtPnN5bWJvbCwgdC0+c3ltYm9sKTsKLSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0gICAgfQotICBwcmludGYgKCIgIHsgLTEsIC0xIH1cbiIpOwotICBwcmludGYgKCJ9O1xuXG4iKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotICBpZiAoYXJnYyAhPSAyKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItaCIpID09IDApCi0gICAgZ2VuX3RhcmdfdmFsc19oICgpOwotICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItYyIpID09IDApCi0gICAgZ2VuX3RhcmdfbWFwX2MgKCk7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZ2VudHZhbHMuc2ggYi9zaW0vY29tbW9uL2dlbnR2YWxzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ3MzE1Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vZ2VudHZhbHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIS9iaW4vc2gKLSMgVXNhZ2U6IGdlbnR2YWxzLnNoIHRhcmdldCB0eXBlIGRpciBmaWxlcyBwYXR0ZXJuIGNwcAotCi10YXJnZXQ9JDEKLXR5cGU9JDIKLWRpcj0kMwotIyBGSVhNRTogV291bGQgYmUgbmljZSB0byBwcm9jZXNzICNpbmNsdWRlJ3MgaW4gdGhlc2UgZmlsZXMuCi1maWxlcz0kNAotcGF0dGVybj0kNQotY3BwPSQ2Ci0KLSMgRklYTUU6IG5lZWQgdHJhcCB0byByZW1vdmUgdG1wIGZpbGVzLgotCi1ybSAtZiB0bXB2YWxzLmxpc3QgdG1wdmFscy51bmlxCi1mb3IgZiBpbiAkZmlsZXMKLWRvCi0JaWYgdGVzdCAtZiAkZGlyLyRmIDsgdGhlbgotCQlncmVwICIjZGVmaW5lWyAJXSRwYXR0ZXJuIiAkZGlyLyRmIHwgc2VkIC1lICJzL14uKiNkZWZpbmVbIAldXCgkcGF0dGVyblwpWyAJXSpcKFteIAldW14gCV0qXCkuKiQvXDEvIiA+PiB0bXB2YWxzLmxpc3QKLQlmaQotZG9uZQotCi1zb3J0IDx0bXB2YWxzLmxpc3QgfCB1bmlxID50bXB2YWxzLnVuaXEKLQotcm0gLWYgdG1wdmFscy5oCi1mb3IgZiBpbiAkZmlsZXMKLWRvCi0JaWYgdGVzdCAtZiAkZGlyLyRmIDsgdGhlbgotCQllY2hvICIjaW5jbHVkZSA8JGY+IiA+PnRtcHZhbHMuaAotCWZpCi1kb25lCi0KLWNhdCB0bXB2YWxzLnVuaXEgfAotd2hpbGUgcmVhZCBzeW0KLWRvCi0JZWNobyAiI2lmZGVmICRzeW0iID4+dG1wdmFscy5oCi0JZWNobyAnREVGVkFMIHsgIickc3ltJyIsICckc3ltICcgfSwnID4+dG1wdmFscy5oCi0JZWNobyAiI2VuZGlmIiA+PnRtcHZhbHMuaAotZG9uZQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IgotdGhlbgotCWVjaG8gIiNpZmRlZiAke3R5cGV9X2RlZnMiCi1lbHNlCi0JZWNobyAiI2lmZGVmIE5MX1RBUkdFVF8kdGFyZ2V0IgotCWVjaG8gIiNpZmRlZiAke3R5cGV9X2RlZnMiCi1maQotCi1mb3IgZiBpbiAkZmlsZXMKLWRvCi0JaWYgdGVzdCAtZiAkZGlyLyRmIDsgdGhlbgotCQllY2hvICIvKiBmcm9tICRmICovIgotCWZpCi1kb25lCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiCi10aGVuCi0JZWNobyAiLyogYmVnaW4gJHR5cGUgdGFyZ2V0IG1hY3JvcyAqLyIKLWVsc2UKLQllY2hvICIvKiBiZWdpbiAkdGFyZ2V0ICR0eXBlIHRhcmdldCBtYWNyb3MgKi8iCi1maQotCi0kY3BwIC1JJGRpciB0bXB2YWxzLmggfCBncmVwIERFRlZBTCB8IHNlZCAtZSAncy9ERUZWQUwvLycgLWUgJ3MvICAvIC8nCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiCi10aGVuCi0JZWNobyAiLyogZW5kICR0eXBlIHRhcmdldCBtYWNyb3MgKi8iCi0JZWNobyAiI2VuZGlmIgotZWxzZQotCWVjaG8gIi8qIGVuZCAkdGFyZ2V0ICR0eXBlIHRhcmdldCBtYWNyb3MgKi8iCi0JZWNobyAiI2VuZGlmIgotCWVjaG8gIiNlbmRpZiIKLWZpCi0KLXJtIC1mIHRtcHZhbHMubGlzdCB0bXB2YWxzLnVuaXEgdG1wdmFscy5oCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWFsbG9jLmMgYi9zaW0vY29tbW9uL2h3LWFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NGFlODIuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogSGFyZHdhcmUgbWVtb3J5IGFsbG9jYXRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJody1iYXNlLmgiCi0KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi1zdHJ1Y3QgaHdfYWxsb2NfZGF0YSB7Ci0gIHZvaWQgKmFsbG9jOwotICBpbnQgemFsbG9jX3A7Ci0gIHN0cnVjdCBod19hbGxvY19kYXRhICpuZXh0OwotfTsKLQotdm9pZAotY3JlYXRlX2h3X2FsbG9jX2RhdGEgKHN0cnVjdCBodyAqbWUpCi17Ci0gIC8qIE5VTEwgKi8KLX0KLQotdm9pZAotZGVsZXRlX2h3X2FsbG9jX2RhdGEgKHN0cnVjdCBodyAqbWUpCi17Ci0gIGlmIChtZS0+YWxsb2Nfb2ZfaHcgIT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJody1hbGxvYyBib3RjaCIpOwotICB3aGlsZSAobWUtPmFsbG9jX29mX2h3ICE9IE5VTEwpCi0gICAgewotICAgICAgaHdfZnJlZSAobWUsIG1lLT5hbGxvY19vZl9ody0+YWxsb2MpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgKgotaHdfemFsbG9jIChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gIHN0cnVjdCBod19hbGxvY19kYXRhICptZW1vcnkgPSBaQUxMT0MgKHN0cnVjdCBod19hbGxvY19kYXRhKTsKLSAgbWVtb3J5LT5hbGxvYyA9IHphbGxvYyAoc2l6ZSk7Ci0gIG1lbW9yeS0+emFsbG9jX3AgPSAxOwotICBtZW1vcnktPm5leHQgPSBtZS0+YWxsb2Nfb2ZfaHc7Ci0gIG1lLT5hbGxvY19vZl9odyA9IG1lbW9yeTsKLSAgcmV0dXJuIG1lbW9yeS0+YWxsb2M7Ci19Ci0KLXZvaWQgKgotaHdfbWFsbG9jIChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gIHN0cnVjdCBod19hbGxvY19kYXRhICptZW1vcnkgPSBaQUxMT0MgKHN0cnVjdCBod19hbGxvY19kYXRhKTsKLSAgbWVtb3J5LT5hbGxvYyA9IHphbGxvYyAoc2l6ZSk7Ci0gIG1lbW9yeS0+emFsbG9jX3AgPSAwOwotICBtZW1vcnktPm5leHQgPSBtZS0+YWxsb2Nfb2ZfaHc7Ci0gIG1lLT5hbGxvY19vZl9odyA9IG1lbW9yeTsKLSAgcmV0dXJuIG1lbW9yeS0+YWxsb2M7Ci19Ci0KLXZvaWQKLWh3X2ZyZWUgKHN0cnVjdCBodyAqbWUsCi0JIHZvaWQgKmFsbG9jKQotewotICBzdHJ1Y3QgaHdfYWxsb2NfZGF0YSAqKm1lbW9yeTsKLSAgZm9yIChtZW1vcnkgPSAmbWUtPmFsbG9jX29mX2h3OwotICAgICAgICptZW1vcnkgIT0gTlVMTDsKLSAgICAgICBtZW1vcnkgPSAmKCptZW1vcnkpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoKm1lbW9yeSktPmFsbG9jID09IGFsbG9jKQotCXsKLQkgIHN0cnVjdCBod19hbGxvY19kYXRhICpkaWUgPSAoKm1lbW9yeSk7Ci0JICAoKm1lbW9yeSkgPSBkaWUtPm5leHQ7Ci0JICBpZiAoZGllLT56YWxsb2NfcCkKLQkgICAgemZyZWUgKGRpZS0+YWxsb2MpOwotCSAgZWxzZQotCSAgICBmcmVlIChkaWUtPmFsbG9jKTsKLQkgIHpmcmVlIChkaWUpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGh3X2Fib3J0IChtZSwgImZyZWUgb2YgbWVtb3J5IG5vdCBiZWxvbmdpbmcgdG8gYSBkZXZpY2UiKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctYWxsb2MuaCBiL3NpbS9jb21tb24vaHctYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiMDNmMi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LWFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBIYXJkd2FyZSBtZW1vcnkgYWxsb2NhdG9yLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWZuZGVmIEhXX0FMTE9DX0gKLSNkZWZpbmUgSFdfQUxMT0NfSAotCi0vKiBNZWNoYW5pc20gZm9yIGFzc29jaWF0aW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBkZXZpY2UgdG8gdGhhdAotICAgZGV2aWNlLgotCi0gICBXaGVuIGEgZGV2aWNlIGlzIGRlbGV0ZWQgYW55IHJlbWFpbmluZyBtZW1vcnkgcmVnaW9ucyBhc3NvY2lhdGVkIHRvCi0gICBpdCBhcmUgcmVjbGFpbWVkLgotCi0gICBGSVhNRTogUGVyaGFwaHMgdGhpcyBjYW4gYmUgZ2VuZXJhbGl6ZWQuIFBlcmhhcGhzIGl0IHNob3VsZCBub3QKLSAgIGJlLiAqLwotCi0KLSNkZWZpbmUgSFdfWkFMTE9DKG1lLHR5cGUpICh0eXBlKikgaHdfemFsbG9jIChtZSwgc2l6ZW9mICh0eXBlKSkKLSNkZWZpbmUgSFdfTUFMTE9DKG1lLHR5cGUpICh0eXBlKikgaHdfbWFsbG9jIChtZSwgc2l6ZW9mICh0eXBlKSkKLSNkZWZpbmUgSFdfTlpBTExPQyhNRSxUWVBFLE4pIChUWVBFKikgaHdfemFsbG9jIChtZSwgc2l6ZW9mIChUWVBFKSAqIChOKSkKLQotZXh0ZXJuIHZvaWQgKmh3X3phbGxvYyAoc3RydWN0IGh3ICptZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiB2b2lkICpod19tYWxsb2MgKHN0cnVjdCBodyAqbWUsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB2b2lkIGh3X2ZyZWUgKHN0cnVjdCBodyAqbWUsIHZvaWQgKik7Ci0KLQotLyogRHVwbGljYXRlIGEgc3RyaW5nIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIHRoZSBwZXItZGV2aWNlIGhlYXAgKi8KLQotZXh0ZXJuIGNoYXIgKmh3X3N0cmR1cCAoc3RydWN0IGh3ICptZSwgY29uc3QgY2hhciAqc3RyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWJhc2UuYyBiL3NpbS9jb21tb24vaHctYmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNhYzY0Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vaHctYmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIDE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJody1tYWluLmgiCi0jaW5jbHVkZSAiaHctYmFzZS5oIgotCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImh3LWNvbmZpZy5oIgotCi1zdHJ1Y3QgaHdfYmFzZV9kYXRhIHsKLSAgaW50IGZpbmlzaGVkX3A7Ci0gIGNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yICpkZXNjcmlwdG9yOwotICBod19kZWxldGVfY2FsbGJhY2sgKnRvX2RlbGV0ZTsKLX07Ci0KLXN0YXRpYyBpbnQKLWdlbmVyaWNfaHdfdW5pdF9kZWNvZGUgKHN0cnVjdCBodyAqYnVzLAotCQkJY29uc3QgY2hhciAqdW5pdCwKLQkJCWh3X3VuaXQgKnBoeXMpCi17Ci0gIG1lbXNldCAocGh5cywgMCwgc2l6ZW9mICgqcGh5cykpOwotICBpZiAodW5pdCA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgewotICAgICAgaW50IG5yX2NlbGxzID0gMDsKLSAgICAgIGNvbnN0IGludCBtYXhfbnJfY2VsbHMgPSBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKGJ1cyk7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjaGFyICplbmQgPSBOVUxMOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB2YWwgPSBzdHJ0b3VsICh1bml0LCAmZW5kLCAwKTsKLQkgIC8qIHBhcnNlIGVycm9yPyAqLwotCSAgaWYgKHVuaXQgPT0gZW5kKQotCSAgICByZXR1cm4gLTE7Ci0JICAvKiB0d28gbWFueSBjZWxscz8gKi8KLQkgIGlmIChucl9jZWxscyA+PSBtYXhfbnJfY2VsbHMpCi0JICAgIHJldHVybiAtMTsKLQkgIC8qIHNhdmUgaXQgKi8KLQkgIHBoeXMtPmNlbGxzW25yX2NlbGxzXSA9IHZhbDsKLQkgIG5yX2NlbGxzKys7Ci0JICB1bml0ID0gZW5kOwotCSAgLyogbW9yZSB0byBmb2xsb3c/ICovCi0JICBpZiAoaXNzcGFjZSAoKnVuaXQpIHx8ICp1bml0ID09ICdcMCcpCi0JICAgIGJyZWFrOwotCSAgaWYgKCp1bml0ICE9ICcsJykKLQkgICAgcmV0dXJuIC0xOwotCSAgdW5pdCsrOwotCX0KLSAgICAgIGlmIChucl9jZWxscyA8IG1heF9ucl9jZWxscykgewotCS8qIHNoaWZ0IGV2ZXJ5dGhpbmcgdG8gY29ycmVjdCBwb3NpdGlvbiAqLwotCWludCBpOwotCWZvciAoaSA9IDE7IGkgPD0gbnJfY2VsbHM7IGkrKykKLQkgIHBoeXMtPmNlbGxzW21heF9ucl9jZWxscyAtIGldID0gcGh5cy0+Y2VsbHNbbnJfY2VsbHMgLSBpXTsKLQlmb3IgKGkgPSAwOyBpIDwgKG1heF9ucl9jZWxscyAtIG5yX2NlbGxzKTsgaSsrKQotCSAgcGh5cy0+Y2VsbHNbaV0gPSAwOwotICAgICAgfQotICAgICAgcGh5cy0+bnJfY2VsbHMgPSBtYXhfbnJfY2VsbHM7Ci0gICAgICByZXR1cm4gbWF4X25yX2NlbGxzOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdlbmVyaWNfaHdfdW5pdF9lbmNvZGUgKHN0cnVjdCBodyAqYnVzLAotCQkJY29uc3QgaHdfdW5pdCAqcGh5cywKLQkJCWNoYXIgKmJ1ZiwKLQkJCWludCBzaXplb2ZfYnVmKQotewotICBpbnQgaTsKLSAgaW50IGxlbjsKLSAgY2hhciAqcG9zID0gYnVmOwotICAvKiBza2lwIGxlYWRpbmcgemVybydzICovCi0gIGZvciAoaSA9IDA7IGkgPCBwaHlzLT5ucl9jZWxsczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwaHlzLT5jZWxsc1tpXSAhPSAwKQotCWJyZWFrOwotICAgIH0KLSAgLyogZG9uJ3Qgb3V0cHV0IGFueXRoaW5nIGlmIGVtcHR5ICovCi0gIGlmIChwaHlzLT5ucl9jZWxscyA9PSAwKQotICAgIHsKLSAgICAgIHN0cmNweShwb3MsICIiKTsKLSAgICAgIGxlbiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChpID09IHBoeXMtPm5yX2NlbGxzKQotICAgIHsKLSAgICAgIC8qIGFsbCB6ZXJvICovCi0gICAgICBzdHJjcHkocG9zLCAiMCIpOwotICAgICAgbGVuID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKDsgaSA8IHBoeXMtPm5yX2NlbGxzOyBpKyspCi0JewotCSAgaWYgKHBvcyAhPSBidWYpIHsKLQkgICAgc3RyY2F0KHBvcywgIiwiKTsKLQkgICAgcG9zID0gc3RyY2hyKHBvcywgJ1wwJyk7Ci0JICB9Ci0JICBpZiAocGh5cy0+Y2VsbHNbaV0gPCAxMCkKLQkgICAgc3ByaW50ZiAocG9zLCAiJWxkIiwgKHVuc2lnbmVkIGxvbmcpcGh5cy0+Y2VsbHNbaV0pOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChwb3MsICIweCVseCIsICh1bnNpZ25lZCBsb25nKXBoeXMtPmNlbGxzW2ldKTsKLQkgIHBvcyA9IHN0cmNocihwb3MsICdcMCcpOwotCX0KLSAgICAgIGxlbiA9IHBvcyAtIGJ1ZjsKLSAgICB9Ci0gIGlmIChsZW4gPj0gc2l6ZW9mX2J1ZikKLSAgICBod19hYm9ydCAoTlVMTCwgImdlbmVyaWNfdW5pdF9lbmNvZGUgLSBidWZmZXIgb3ZlcmZsb3dcbiIpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50Ci1nZW5lcmljX2h3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoc3RydWN0IGh3ICptZSwKLQkJCQkJICAgY29uc3QgaHdfdW5pdCAqYWRkcmVzcywKLQkJCQkJICAgaW50ICphdHRhY2hfc3BhY2UsCi0JCQkJCSAgIHVuc2lnbmVkX3dvcmQgKmF0dGFjaF9hZGRyZXNzLAotCQkJCQkgICBzdHJ1Y3QgaHcgKmNsaWVudCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhZGRyZXNzLT5ucl9jZWxscyAtIDI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzcy0+Y2VsbHNbaV0gIT0gMCkKLQlod19hYm9ydCAobWUsICJPbmx5IDMyYml0IGFkZHJlc3NlcyBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gIGlmIChhZGRyZXNzLT5ucl9jZWxscyA+PSAyKQotICAgICphdHRhY2hfc3BhY2UgPSBhZGRyZXNzLT5jZWxsc1thZGRyZXNzLT5ucl9jZWxscyAtIDJdOwotICBlbHNlCi0gICAgKmF0dGFjaF9zcGFjZSA9IDA7Ci0gICphdHRhY2hfYWRkcmVzcyA9IGFkZHJlc3MtPmNlbGxzW2FkZHJlc3MtPm5yX2NlbGxzIC0gMV07Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZW5lcmljX2h3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoc3RydWN0IGh3ICptZSwKLQkJCQkgICAgIGNvbnN0IGh3X3VuaXQgKnNpemUsCi0JCQkJICAgICB1bnNpZ25lZCAqbnJfYnl0ZXMsCi0JCQkJICAgICBzdHJ1Y3QgaHcgKmNsaWVudCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplLT5ucl9jZWxscyAtIDE7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2l6ZS0+Y2VsbHNbaV0gIT0gMCkKLQlod19hYm9ydCAobWUsICJPbmx5IDMyYml0IHNpemVzIHN1cHBvcnRlZCIpOwotICAgIH0KLSAgKm5yX2J5dGVzID0gc2l6ZS0+Y2VsbHNbMF07Ci0gIHJldHVybiAqbnJfYnl0ZXM7Ci19Ci0KLQotLyogaWdub3JlL3Bhc3N0aHJvdWdoIHZlcnNpb25zIG9mIGVhY2ggZnVuY3Rpb24gKi8KLQotc3RhdGljIHZvaWQKLXBhc3N0aHJvdWdoX2h3X2F0dGFjaF9hZGRyZXNzIChzdHJ1Y3QgaHcgKm1lLAotCQkJICAgICAgIGludCBsZXZlbCwKLQkJCSAgICAgICBpbnQgc3BhY2UsCi0JCQkgICAgICAgYWRkcmVzc193b3JkIGFkZHIsCi0JCQkgICAgICAgYWRkcmVzc193b3JkIG5yX2J5dGVzLAotCQkJICAgICAgIHN0cnVjdCBodyAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLwotewotICBpZiAoaHdfcGFyZW50IChtZSkgPT0gTlVMTCkKLSAgICBod19hYm9ydCAoY2xpZW50LCAiaHdfYXR0YWNoX2FkZHJlc3M6IG5vIHBhcmVudCBhdHRhY2ggbWV0aG9kIik7Ci0gIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwgbGV2ZWwsCi0JCSAgICAgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAotCQkgICAgIGNsaWVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXNzdGhyb3VnaF9od19kZXRhY2hfYWRkcmVzcyAoc3RydWN0IGh3ICptZSwKLQkJCSAgICAgICBpbnQgbGV2ZWwsCi0JCQkgICAgICAgaW50IHNwYWNlLAotCQkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAotCQkJICAgICAgIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKLQkJCSAgICAgICBzdHJ1Y3QgaHcgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KLXsKLSAgaWYgKGh3X3BhcmVudCAobWUpID09IE5VTEwpCi0gICAgaHdfYWJvcnQgKGNsaWVudCwgImh3X2F0dGFjaF9hZGRyZXNzOiBubyBwYXJlbnQgYXR0YWNoIG1ldGhvZCIpOwotICBod19kZXRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksIGxldmVsLAotCQkgICAgIHNwYWNlLCBhZGRyLCBucl9ieXRlcywKLQkJICAgICBjbGllbnQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQKLXBhbmljX2h3X2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHZvaWQgKmRlc3QsCi0JCQkgaW50IHNwYWNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgaHdfYWJvcnQgKG1lLCAibm8gaW8tcmVhZCBtZXRob2QiKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotcGFuaWNfaHdfaW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgIGludCBzcGFjZSwKLQkJCSAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgaHdfYWJvcnQgKG1lLCAibm8gaW8td3JpdGUgbWV0aG9kIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQKLXBhc3N0aHJvdWdoX2h3X2RtYV9yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCQl2b2lkICpkZXN0LAotCQkJCWludCBzcGFjZSwKLQkJCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkJdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIGlmIChod19wYXJlbnQgKG1lKSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgIm5vIHBhcmVudCBkbWEtcmVhZCBtZXRob2QiKTsKLSAgcmV0dXJuIGh3X2RtYV9yZWFkX2J1ZmZlciAoaHdfcGFyZW50IChtZSksIGRlc3QsCi0JCQkgICAgIHNwYWNlLCBhZGRyLCBucl9ieXRlcyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotcGFzc3Rocm91Z2hfaHdfZG1hX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCQkgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJCSBpbnQgc3BhY2UsCi0JCQkJIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQkgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkJIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQotewotICBpZiAoaHdfcGFyZW50IChtZSkgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJubyBwYXJlbnQgZG1hLXdyaXRlIG1ldGhvZCIpOwotICByZXR1cm4gaHdfZG1hX3dyaXRlX2J1ZmZlciAoaHdfcGFyZW50IChtZSksIHNvdXJjZSwKLQkJCSAgICAgIHNwYWNlLCBhZGRyLAotCQkJICAgICAgbnJfYnl0ZXMsCi0JCQkgICAgICB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQKLWlnbm9yZV9od19kZWxldGUgKHN0cnVjdCBodyAqbWUpCi17Ci0gIC8qIE5PUCAqLwotfQotCi0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1mdWxsX25hbWVfb2ZfaHcgKHN0cnVjdCBodyAqbGVhZiwKLQkJIGNoYXIgKmJ1ZiwKLQkJIHVuc2lnbmVkIHNpemVvZl9idWYpCi17Ci0gIC8qIGdldCBhIGJ1ZmZlciAqLwotICBjaGFyIGZ1bGxfbmFtZVsxMDI0XTsKLSAgaWYgKGJ1ZiA9PSAoY2hhciopMCkKLSAgICB7Ci0gICAgICBidWYgPSBmdWxsX25hbWU7Ci0gICAgICBzaXplb2ZfYnVmID0gc2l6ZW9mIChmdWxsX25hbWUpOwotICAgIH0KLQotICAvKiB1c2UgaGVhZCByZWN1cnNpb24gdG8gY29uc3RydWN0IHRoZSBwYXRoICovCi0KLSAgaWYgKGh3X3BhcmVudCAobGVhZikgPT0gTlVMTCkKLSAgICAvKiByb290ICovCi0gICAgewotICAgICAgaWYgKHNpemVvZl9idWYgPCAxKQotCWh3X2Fib3J0IChsZWFmLCAiYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgICAqYnVmID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBzdWIgbm9kZSAqLwotICAgIHsKLSAgICAgIGNoYXIgdW5pdFsxMDI0XTsKLSAgICAgIGZ1bGxfbmFtZV9vZl9odyAoaHdfcGFyZW50IChsZWFmKSwgYnVmLCBzaXplb2ZfYnVmKTsKLSAgICAgIGlmIChod191bml0X2VuY29kZSAoaHdfcGFyZW50IChsZWFmKSwKLQkJCSAgaHdfdW5pdF9hZGRyZXNzIChsZWFmKSwKLQkJCSAgdW5pdCArIDEsCi0JCQkgIHNpemVvZiAodW5pdCkgLSAxKQotCSAgPiAwKQotCXVuaXRbMF0gPSAnQCc7Ci0gICAgICBlbHNlCi0JdW5pdFswXSA9ICdcMCc7Ci0gICAgICBpZiAoc3RybGVuIChidWYpICsgc3RybGVuICgiLyIpICsgc3RybGVuIChod19uYW1lIChsZWFmKSkgKyBzdHJsZW4gKHVuaXQpCi0JICA+PSBzaXplb2ZfYnVmKQotCWh3X2Fib3J0IChsZWFmLCAiYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgIi8iKTsKLSAgICAgIHN0cmNhdCAoYnVmLCBod19uYW1lIChsZWFmKSk7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgdW5pdCk7Ci0gICAgfQotICAKLSAgLyogcmV0dXJuIGl0IHVzZWZ1bGx5ICovCi0gIGlmIChidWYgPT0gZnVsbF9uYW1lKQotICAgIGJ1ZiA9IGh3X3N0cmR1cCAobGVhZiwgZnVsbF9uYW1lKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RydWN0IGh3ICoKLWh3X2NyZWF0ZSAoc3RydWN0IHNpbV9zdGF0ZSAqc2QsCi0JICAgc3RydWN0IGh3ICpwYXJlbnQsCi0JICAgY29uc3QgY2hhciAqZmFtaWx5LAotCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgY29uc3QgY2hhciAqdW5pdCwKLQkgICBjb25zdCBjaGFyICphcmdzKQotewotIC8qIE5PVEU6IEhXIG11c3QgYmUgYWxsb2NhdGVkIHVzaW5nIFpBTExPQywgb3RoZXJzIHVzZSBIV19aQUxMT0MgKi8KLSAgc3RydWN0IGh3ICpodyA9IFpBTExPQyAoc3RydWN0IGh3KTsKLQotICAvKiBvdXIgaWRlbnRpdHkgKi8KLSAgaHctPmZhbWlseV9vZl9odyA9IGh3X3N0cmR1cCAoaHcsIGZhbWlseSk7Ci0gIGh3LT5uYW1lX29mX2h3ID0gaHdfc3RyZHVwIChodywgbmFtZSk7Ci0gIGh3LT5hcmdzX29mX2h3ID0gaHdfc3RyZHVwIChodywgYXJncyk7Ci0KLSAgLyogYSBob29rIGludG8gdGhlIHN5c3RlbSAqLwotICBpZiAoc2QgIT0gTlVMTCkKLSAgICBody0+c3lzdGVtX29mX2h3ID0gc2Q7Ci0gIGVsc2UgaWYgKHBhcmVudCAhPSBOVUxMKQotICAgIGh3LT5zeXN0ZW1fb2ZfaHcgPSBod19zeXN0ZW0gKHBhcmVudCk7Ci0gIGVsc2UKLSAgICBod19hYm9ydCAocGFyZW50LCAiTm8gc3lzdGVtIGZvdW5kIik7Ci0KLSAgLyogaW4gYSB0cmVlICovCi0gIGlmIChwYXJlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaHcgKipzaWJsaW5nID0gJnBhcmVudC0+Y2hpbGRfb2ZfaHc7Ci0gICAgICB3aGlsZSAoKCpzaWJsaW5nKSAhPSBOVUxMKQotCXNpYmxpbmcgPSAmKCpzaWJsaW5nKS0+c2libGluZ19vZl9odzsKLSAgICAgICpzaWJsaW5nID0gaHc7Ci0gICAgICBody0+cGFyZW50X29mX2h3ID0gcGFyZW50OwotICAgIH0KLQotICAvKiB0b3Agb2YgdHJlZSAqLwotICBpZiAocGFyZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGh3ICpyb290ID0gcGFyZW50OwotICAgICAgd2hpbGUgKHJvb3QtPnBhcmVudF9vZl9odyAhPSBOVUxMKQotCXJvb3QgPSByb290LT5wYXJlbnRfb2ZfaHc7Ci0gICAgICBody0+cm9vdF9vZl9odyA9IHJvb3Q7Ci0gICAgfQotICAKLSAgLyogYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRldmljZSBvbiB0aGUgcGFyZW50cyBidXMgKi8KLSAgaWYgKHBhcmVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGh3X3VuaXRfZGVjb2RlIChwYXJlbnQsIHVuaXQsICZody0+dW5pdF9hZGRyZXNzX29mX2h3KTsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIG91ciBwYXRoICovCi0gIGlmIChwYXJlbnQgIT0gTlVMTCkKLSAgICBody0+cGF0aF9vZl9odyA9IGZ1bGxfbmFtZV9vZl9odyAoaHcsIE5VTEwsIDApOwotICBlbHNlCi0gICAgaHctPnBhdGhfb2ZfaHcgPSAiLyI7Ci0KLSAgLyogY3JlYXRlIG91ciBiYXNlIHR5cGUgKi8KLSAgaHctPmJhc2Vfb2ZfaHcgPSBIV19aQUxMT0MgKGh3LCBzdHJ1Y3QgaHdfYmFzZV9kYXRhKTsKLSAgaHctPmJhc2Vfb2ZfaHctPmZpbmlzaGVkX3AgPSAwOwotCi0gIC8qIG91ciBjYWxsYmFja3MgKi8KLSAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChodywgcGFuaWNfaHdfaW9fcmVhZF9idWZmZXIpOwotICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChodywgcGFuaWNfaHdfaW9fd3JpdGVfYnVmZmVyKTsKLSAgc2V0X2h3X2RtYV9yZWFkX2J1ZmZlciAoaHcsIHBhc3N0aHJvdWdoX2h3X2RtYV9yZWFkX2J1ZmZlcik7Ci0gIHNldF9od19kbWFfd3JpdGVfYnVmZmVyIChodywgcGFzc3Rocm91Z2hfaHdfZG1hX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od191bml0X2RlY29kZSAoaHcsIGdlbmVyaWNfaHdfdW5pdF9kZWNvZGUpOwotICBzZXRfaHdfdW5pdF9lbmNvZGUgKGh3LCBnZW5lcmljX2h3X3VuaXRfZW5jb2RlKTsKLSAgc2V0X2h3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHcsIGdlbmVyaWNfaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKTsKLSAgc2V0X2h3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHcsIGdlbmVyaWNfaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplKTsKLSAgc2V0X2h3X2F0dGFjaF9hZGRyZXNzIChodywgcGFzc3Rocm91Z2hfaHdfYXR0YWNoX2FkZHJlc3MpOwotICBzZXRfaHdfZGV0YWNoX2FkZHJlc3MgKGh3LCBwYXNzdGhyb3VnaF9od19kZXRhY2hfYWRkcmVzcyk7Ci0gIHNldF9od19kZWxldGUgKGh3LCBpZ25vcmVfaHdfZGVsZXRlKTsKLQotICAvKiBsb2NhdGUgYSBkZXNjcmlwdG9yICovCi0gIHsKLSAgICBjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciAqKnRhYmxlOwotICAgIGZvciAodGFibGUgPSBod19kZXNjcmlwdG9yczsKLQkgKnRhYmxlICE9IE5VTEw7Ci0JIHRhYmxlKyspCi0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgKmVudHJ5OwotCWZvciAoZW50cnkgPSAqdGFibGU7Ci0JICAgICBlbnRyeS0+ZmFtaWx5ICE9IE5VTEw7Ci0JICAgICBlbnRyeSsrKQotCSAgewotCSAgICBpZiAoc3RyY21wIChmYW1pbHksIGVudHJ5LT5mYW1pbHkpID09IDApCi0JICAgICAgewotCQlody0+YmFzZV9vZl9ody0+ZGVzY3JpcHRvciA9IGVudHJ5OwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKGh3LT5iYXNlX29mX2h3LT5kZXNjcmlwdG9yID09IE5VTEwpCi0gICAgICB7Ci0JaHdfYWJvcnQgKHBhcmVudCwgIlVua25vd24gZGV2aWNlIGAlcyciLCBmYW1pbHkpOwotICAgICAgfQotICB9Ci0KLSAgLyogQXR0YWNoIGR1bW15IHBvcnRzICovCi0gIGNyZWF0ZV9od19hbGxvY19kYXRhIChodyk7Ci0gIGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhIChodyk7Ci0gIGNyZWF0ZV9od19wb3J0X2RhdGEgKGh3KTsKLSAgY3JlYXRlX2h3X2V2ZW50X2RhdGEgKGh3KTsKLSAgY3JlYXRlX2h3X2hhbmRsZV9kYXRhIChodyk7Ci0gIGNyZWF0ZV9od19pbnN0YW5jZV9kYXRhIChodyk7Ci0gIAotICByZXR1cm4gaHc7Ci19Ci0KLQotaW50Ci1od19maW5pc2hlZF9wIChzdHJ1Y3QgaHcgKm1lKQotewotICByZXR1cm4gKG1lLT5iYXNlX29mX2h3LT5maW5pc2hlZF9wKTsKLX0KLQotdm9pZAotaHdfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQotewotICBpZiAoaHdfZmluaXNoZWRfcCAobWUpKQotICAgIGh3X2Fib3J0IChtZSwgIkF0dGVtcHQgdG8gZmluaXNoIGZpbmlzaGVkIGRldmljZSIpOwotCi0gIC8qIEZpbGwgaW4gdGhlIChob3BlZnVsbHkpIGRlZmluZWQgYWRkcmVzcy9zaXplIGNlbGxzIHZhbHVlcyAqLwotICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICIjYWRkcmVzcy1jZWxscyIpICE9IE5VTEwpCi0gICAgbWUtPm5yX2FkZHJlc3NfY2VsbHNfb2ZfaHdfdW5pdCA9Ci0gICAgICBod19maW5kX2ludGVnZXJfcHJvcGVydHkgKG1lLCAiI2FkZHJlc3MtY2VsbHMiKTsKLSAgZWxzZQotICAgIG1lLT5ucl9hZGRyZXNzX2NlbGxzX29mX2h3X3VuaXQgPSAyOwotICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICIjc2l6ZS1jZWxscyIpICE9IE5VTEwpCi0gICAgbWUtPm5yX3NpemVfY2VsbHNfb2ZfaHdfdW5pdCA9Ci0gICAgICBod19maW5kX2ludGVnZXJfcHJvcGVydHkgKG1lLCAiI3NpemUtY2VsbHMiKTsKLSAgZWxzZQotICAgIG1lLT5ucl9zaXplX2NlbGxzX29mX2h3X3VuaXQgPSAxOwotCi0gIC8qIEZpbGwgaW4gdGhlIChob3BlZnVsbHkpIGRlZmluZWQgdHJhY2UgdmFyaWFibGUgKi8KLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAidHJhY2U/IikgIT0gTlVMTCkKLSAgICBtZS0+dHJhY2Vfb2ZfaHdfcCA9IGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAobWUsICJ0cmFjZT8iKTsKLSAgLyogYWxsb3cgZ2xvYmFsIHZhcmlhYmxlIHRvIGRlZmluZSBkZWZhdWx0IHRyYWNpbmcgKi8KLSAgZWxzZSBpZiAoISBod190cmFjZV9wIChtZSkKLQkgICAmJiBod19maW5kX3Byb3BlcnR5IChod19yb290IChtZSksICJnbG9iYWwtdHJhY2U/IikgIT0gTlVMTAotCSAgICYmIGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAoaHdfcm9vdCAobWUpLCAiZ2xvYmFsLXRyYWNlPyIpKQotICAgIG1lLT50cmFjZV9vZl9od19wID0gMTsKLSAgICAKLQotICAvKiBBbGxvdyB0aGUgcmVhbCBkZXZpY2UgdG8gb3ZlcnJpZGUgYW55IG1ldGhvZHMgKi8KLSAgbWUtPmJhc2Vfb2ZfaHctPmRlc2NyaXB0b3ItPnRvX2ZpbmlzaCAobWUpOwotICBtZS0+YmFzZV9vZl9ody0+ZmluaXNoZWRfcCA9IDE7Ci19Ci0KLQotdm9pZAotaHdfZGVsZXRlIChzdHJ1Y3QgaHcgKm1lKQotewotICAvKiBnaXZlIHRoZSBvYmplY3QgYSBjaGFuY2UgdG8gdGlkeSB1cCAqLwotICBtZS0+YmFzZV9vZl9ody0+dG9fZGVsZXRlIChtZSk7Ci0KLSAgZGVsZXRlX2h3X2luc3RhbmNlX2RhdGEgKG1lKTsKLSAgZGVsZXRlX2h3X2hhbmRsZV9kYXRhIChtZSk7Ci0gIGRlbGV0ZV9od19ldmVudF9kYXRhIChtZSk7Ci0gIGRlbGV0ZV9od19wb3J0X2RhdGEgKG1lKTsKLSAgZGVsZXRlX2h3X3Byb3BlcnR5X2RhdGEgKG1lKTsKLQotICAvKiBub3cgdW5saW5rIHVzIGZyb20gdGhlIHRyZWUgKi8KLSAgaWYgKGh3X3BhcmVudCAobWUpKQotICAgIHsKLSAgICAgIHN0cnVjdCBodyAqKnNpYmxpbmcgPSAmaHdfcGFyZW50IChtZSktPmNoaWxkX29mX2h3OwotICAgICAgd2hpbGUgKCpzaWJsaW5nICE9IE5VTEwpCi0JewotCSAgaWYgKCpzaWJsaW5nID09IG1lKQotCSAgICB7Ci0JICAgICAgKnNpYmxpbmcgPSBtZS0+c2libGluZ19vZl9odzsKLQkgICAgICBtZS0+c2libGluZ19vZl9odyA9IE5VTEw7Ci0JICAgICAgbWUtPnBhcmVudF9vZl9odyA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLwotICBpZiAoaHdfY2hpbGQgKG1lKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImF0dGVtcHQgdG8gZGVsZXRlIGRldmljZSB3aXRoIGNoaWxkcmVuIik7Ci0gICAgfQotICBpZiAoaHdfc2libGluZyAobWUpICE9IE5VTEwpCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYXR0ZW1wdCB0byBkZWxldGUgZGV2aWNlIHdpdGggc2libGluZ3MiKTsKLSAgICB9Ci0KLSAgLyogYmxvdyBhd2F5IGFsbCBtZW1vcnkgYmVsb25naW5nIHRvIHRoZSBkZXZpY2UgKi8KLSAgZGVsZXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKLQotICAvKiBmaW5hbGx5ICovCi0gIHpmcmVlIChtZS0+YmFzZV9vZl9odyk7Ci0gIHpmcmVlIChtZSk7Ci19Ci0KLQotLyogR28gdGhyb3VnaCB0aGUgZGV2aWNlcyB2YXJpb3VzIHJlZyBwcm9wZXJ0aWVzIGZvciB0aG9zZSB0aGF0Ci0gICBzcGVjaWZ5IGF0dGFjaCBhZGRyZXNzZXMgKi8KLQotCi12b2lkCi1kb19od19hdHRhY2hfcmVncyAoc3RydWN0IGh3ICpodykKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKihyZWdfcHJvcGVydHlfbmFtZXNbXSkgPSB7Ci0gICAgImF0dGFjaC1hZGRyZXNzZXMiLAotICAgICJhc3NpZ25lZC1hZGRyZXNzZXMiLAotICAgICJyZWciLAotICAgICJhbHRlcm5hdGUtcmVnIiAsCi0gICAgTlVMTAotICB9OwotICBjb25zdCBjaGFyICoqcmVnX3Byb3BlcnR5X25hbWU7Ci0gIGludCBucl92YWxpZF9yZWdfcHJvcGVydGllcyA9IDA7Ci0gIGZvciAocmVnX3Byb3BlcnR5X25hbWUgPSByZWdfcHJvcGVydHlfbmFtZXM7Ci0gICAgICAgKnJlZ19wcm9wZXJ0eV9uYW1lICE9IE5VTEw7Ci0gICAgICAgcmVnX3Byb3BlcnR5X25hbWUrKykKLSAgICB7Ci0gICAgICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAoaHcsICpyZWdfcHJvcGVydHlfbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0JICBpbnQgcmVnX2VudHJ5OwotCSAgZm9yIChyZWdfZW50cnkgPSAwOwotCSAgICAgICBod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAoaHcsICpyZWdfcHJvcGVydHlfbmFtZSwgcmVnX2VudHJ5LAotCQkJCQkgICAmcmVnKTsKLQkgICAgICAgcmVnX2VudHJ5KyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOwotCSAgICAgIGludCBhdHRhY2hfc3BhY2U7Ci0JICAgICAgdW5zaWduZWQgYXR0YWNoX3NpemU7Ci0JICAgICAgaWYgKCFod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAoaHcpLAotCQkJCQkJICAgICAgJnJlZy5hZGRyZXNzLAotCQkJCQkJICAgICAgJmF0dGFjaF9zcGFjZSwKLQkJCQkJCSAgICAgICZhdHRhY2hfYWRkcmVzcywKLQkJCQkJCSAgICAgIGh3KSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKCFod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAoaHcpLAotCQkJCQkJJnJlZy5zaXplLAotCQkJCQkJJmF0dGFjaF9zaXplLCBodykpCi0JCWNvbnRpbnVlOwotCSAgICAgIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKGh3KSwKLQkJCQkgMCwKLQkJCQkgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCi0JCQkJIGh3KTsKLQkgICAgICBucl92YWxpZF9yZWdfcHJvcGVydGllcysrOwotCSAgICB9Ci0JICAvKiBpZiBmaXJzdCBvcHRpb24gbWF0Y2hlcyBkb24ndCB0cnkgZm9yIGFueSBvdGhlcnMgKi8KLQkgIGlmIChyZWdfcHJvcGVydHlfbmFtZSA9PSByZWdfcHJvcGVydHlfbmFtZXMpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWJhc2UuaCBiL3NpbS9jb21tb24vaHctYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1MmQxLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vaHctYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgSFdfQkFTRQotI2RlZmluZSBIV19CQVNFCi0KLS8qIENyZWF0ZSBhIHByaW1hdGl2ZSBkZXZpY2UgKi8KLQotc3RydWN0IGh3ICpod19jcmVhdGUKLShzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLSBzdHJ1Y3QgaHcgKnBhcmVudCwKLSBjb25zdCBjaGFyICpmYW1pbHksCi0gY29uc3QgY2hhciAqbmFtZSwKLSBjb25zdCBjaGFyICp1bml0LAotIGNvbnN0IGNoYXIgKmFyZ3MpOwotCi0KLS8qIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiB0aGF0IGRldmljZSAoZmluaXNoIG92ZXJyaWRlcyBtZXRob2RzCi0gICB1c2luZyB0aGUgc2V0X2h3Xyogb3BlcmF0aW9ucyBiZWxvdykgKi8KLQotdm9pZCBod19maW5pc2gKLShzdHJ1Y3QgaHcgKm1lKTsKLQotaW50IGh3X2ZpbmlzaGVkX3AKLShzdHJ1Y3QgaHcgKm1lKTsKLQotCi0vKiBEZWxldGUgdGhlIGVudGlyZSBkZXZpY2UgKi8KLQotdm9pZCBod19kZWxldGUKLShzdHJ1Y3QgaHcgKm1lKTsKLQotCi0vKiBPdmVycmlkZSBkZXZpY2UgbWV0aG9kcyAqLwotCi10eXBlZGVmIHZvaWQgKGh3X2RlbGV0ZV9jYWxsYmFjaykKLSAgICAgKHN0cnVjdCBodyAqbWUpOwotCi0jZGVmaW5lIHNldF9od19kZWxldGUoaHcsIG1ldGhvZCkgXAotKChodyktPmJhc2Vfb2ZfaHctPnRvX2RlbGV0ZSA9IChtZXRob2QpKQotCi0KLS8qIEFMTE9DICovCi0KLWV4dGVybiB2b2lkIGNyZWF0ZV9od19hbGxvY19kYXRhCi0oc3RydWN0IGh3ICpodyk7Ci1leHRlcm4gdm9pZCBkZWxldGVfaHdfYWxsb2NfZGF0YQotKHN0cnVjdCBodyAqaHcpOwotCi0KLS8qIFBPUlRTICovCi0KLWV4dGVybiB2b2lkIGNyZWF0ZV9od19wb3J0X2RhdGEKLShzdHJ1Y3QgaHcgKmh3KTsKLWV4dGVybiB2b2lkIGRlbGV0ZV9od19wb3J0X2RhdGEKLShzdHJ1Y3QgaHcgKmh3KTsKLQotCi0vKiBQUk9QRVJUSUVTICovCi0KLWV4dGVybiB2b2lkIGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhCi0oc3RydWN0IGh3ICpodyk7Ci1leHRlcm4gdm9pZCBkZWxldGVfaHdfcHJvcGVydHlfZGF0YQotKHN0cnVjdCBodyAqaHcpOwotCi0KLS8qIEVWRU5UUyAqLwotCi1leHRlcm4gdm9pZCBjcmVhdGVfaHdfZXZlbnRfZGF0YQotKHN0cnVjdCBodyAqaHcpOwotZXh0ZXJuIHZvaWQgZGVsZXRlX2h3X2V2ZW50X2RhdGEKLShzdHJ1Y3QgaHcgKmh3KTsKLQotCi0vKiBIQU5ETEVTICovCi0KLWV4dGVybiB2b2lkIGNyZWF0ZV9od19oYW5kbGVfZGF0YQotKHN0cnVjdCBodyAqaHcpOwotZXh0ZXJuIHZvaWQgZGVsZXRlX2h3X2hhbmRsZV9kYXRhCi0oc3RydWN0IGh3ICpodyk7Ci0KLQotLyogSU5TVEFOQ0VTICovCi0KLWV4dGVybiB2b2lkIGNyZWF0ZV9od19pbnN0YW5jZV9kYXRhCi0oc3RydWN0IGh3ICpodyk7Ci1leHRlcm4gdm9pZCBkZWxldGVfaHdfaW5zdGFuY2VfZGF0YQotKHN0cnVjdCBodyAqaHcpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1kZXZpY2UuYyBiL3NpbS9jb21tb24vaHctZGV2aWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjUwZTMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1kZXZpY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJody1tYWluLmgiCi0jaW5jbHVkZSAiaHctYmFzZS5oIgotCi0jaWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLS8qIEFkZHJlc3MgbWV0aG9kcyAqLwotCi1jb25zdCBod191bml0ICoKLWh3X3VuaXRfYWRkcmVzcyAoc3RydWN0IGh3ICptZSkKLXsKLSAgcmV0dXJuICZtZS0+dW5pdF9hZGRyZXNzX29mX2h3OwotfQotCi0KLS8qIElPQ1RMOiAqLwotCi1pbnQKLWh3X2lvY3RsIChzdHJ1Y3QgaHcgKm1lLAotCSAgaHdfaW9jdGxfcmVxdWVzdCByZXF1ZXN0LAotCSAgLi4uKQotewotICBpbnQgc3RhdHVzOwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgcmVxdWVzdCk7Ci0gIHN0YXR1cyA9IG1lLT50b19pb2N0bCAobWUsIHJlcXVlc3QsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLSAgICAgIAotY2hhciAqCi1od19zdHJkdXAgKHN0cnVjdCBodyAqbWUsIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgaWYgKHN0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKmR1cCA9IGh3X3phbGxvYyAobWUsIHN0cmxlbiAoc3RyKSArIDEpOwotICAgICAgc3RyY3B5IChkdXAsIHN0cik7Ci0gICAgICByZXR1cm4gZHVwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctZGV2aWNlLmggYi9zaW0vY29tbW9uL2h3LWRldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2JkYzVhLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vaHctZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBIV19ERVZJQ0VfSAotI2RlZmluZSBIV19ERVZJQ0VfSAotCi0vKiBkZWNsYXJlZCBpbiBzaW0tYmFzaWNzLmgsIHRoaXMgb2JqZWN0IGlzIHVzZWQgZXZlcnl3aGVyZSAqLwotLyogdHlwZWRlZiBzdHJ1Y3QgX2RldmljZSBkZXZpY2U7ICovCi0KLQotLyogSW50cm9kdWN0aW9uOgotCi0gICBBcyBleHBsYWluZWQgaW4gZWFybGllciBzZWN0aW9ucywgdGhlIGRldmljZSwgZGV2aWNlIGluc3RhbmNlLAotICAgcHJvcGVydHkgYW5kIHBvcnRzIGxpZSBhdCB0aGUgaGVhcnQgb2YgUFNJTSdzIGRldmljZSBtb2RlbC4KLQotICAgSW4gdGhlIGJlbG93IGEgc3lub3BzaXMgb2YgdGhlIGRldmljZSBvYmplY3QgYW5kIHRoZSBvcGVyYXRpb25zIGl0Ci0gICBzdXBwb3J0cyBhcmUgZ2l2ZW4uCi0gICAqLwotCi0KLS8qIENyZWF0aW9uOgotCi0gICBUaGUgZGV2aWNlcyBhcmUgY3JlYXRlZCB1c2luZyBhIHNlcXVlbmNlIG9mIHN0ZXBzLiAgSW4gcGFydGljdWxhcjoKLQotCW8JQSB0cmVlIGZyYW1ld29yayBpcyBjcmVhdGVkLgotCi0JCUF0IHRoaXMgcG9pbnQsIHByb3BlcnRpZXMgY2FuIGJlIG1vZGlmaWVkIGFuZCBleHRyYQotCQlkZXZpY2VzIGluc2VydGVkIChvciByZW1vdmVkPykuCi0KLSNpZiBMQVRFUgotCi0JCUFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhIHJ1bi10aW1lIHZhbHVlIChlZyBpaGFuZGxlCi0JCW9yIGRldmljZSBpbnN0YW5jZSBwb2ludGVyIHByb3BlcnRpZXMpIGFyZSBlbnRlcmVkCi0JCWludG8gdGhlIGRldmljZSB0cmVlIHVzaW5nIGEgbmFtZWQgcmVmZXJlbmNlIHRvIHRoZQotCQljb3JyZXNwb25kaW5nIHJ1bnRpbWUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgY3JlYXRlZC4KLQotI2VuZGlmCi0KLQlvCVJlYWwgZGV2aWNlcyBhcmUgY3JlYXRlZCBmb3IgYWxsIHRoZSBkdW1teSBkZXZpY2VzLgotCi0JCUEgZGV2aWNlIGNhbiBhc3N1bWUgdGhhdCBhbGwgb2YgaXRzIHBhcmVudHMgaGF2ZSBiZWVuCi0JCWluaXRpYWxpemVkLgotCi0JCUEgZGV2aWNlIGNhbiBhc3N1bWUgdGhhdCBhbGwgbm9uIHJ1bi10aW1lIHByb3BlcnRpZXMKLQkJaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotCi0JCUFzIHBhcnQgb2YgYmVpbmcgY3JlYXRlZCwgdGhlIGRldmljZSBub3JtYWxseSBhdHRhY2hlcwotCQlpdHNlbGYgdG8gaXRzIHBhcmVudCBidXMuCi0KLSNpZiBMQVRFUgotCi0JCURldmljZSBpbnN0YW5jZSBkYXRhIGlzIGluaXRpYWxpemVkLgotCi0jZW5kaWYKLQotI2lmIExBVEVSCi0KLQlvCUFueSBydW4tdGltZSBwcm9wZXJ0aWVzIGFyZSBjcmVhdGVkLgotCi0jZW5kaWYKLQotI2lmIE1VQ0hfTVVDSF9MQVRFUgotCi0JbwlTb21lIGRldmljZXMsIGFzIHBhcnQgb2YgdGhlaXIgaW5pdGlhbGl6YXRpb24KLQkJbWlnaHQgd2FudCB0byByZWZlciB0byBpaGFuZGxlIHByb3BlcnRpZXMKLQkJaW4gdGhlIGRldmljZSB0cmVlLgotCi0jZW5kaWYKLQotICAgTk9URVM6Ci0KLQlvCUl0IGlzIGltcG9ydGFudCB0byBzZXBhcmF0ZSB0aGUgY3JlYXRpb24KLQkJb2YgYW4gYWN0dWFsIGRldmljZSBmcm9tIHRoZSBjcmVhdGlvbgotCQlvZiB0aGUgdHJlZS4gIFRoZSBhbHRlcm5hdGl2ZSBjcmVhdGluZwotCQl0aGUgZGV2aWNlIGluIHR3byBzdGFnZXM6IEFzIGEgc2VwYXJhdGUKLQkJZW50aXR5IGFuZCB0aGVuIGFzIGEgcGFydCBvZiB0aGUgdHJlZS4KLQotI2lmIExBVEVSCi0JbwlSdW4tdGltZSBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgY3JlYXRlZAotCQl1bnRpbCBhZnRlciB0aGUgZGV2aWNlcyBpbiB0aGUgdHJlZQotCQloYXZlIGJlZW4gY3JlYXRlZC4gIEhlbmNlIGFuIGV4dHJhIHBhc3MKLQkJZm9yIGhhbmRsaW5nIHRoZW0uCi0jZW5kaWYKLQotICAgKi8KLQotLyogUmVsYXRpb25zaGlwczoKLQotICAgQSBkZXZpY2UgaXMgYWJsZSB0byBkZXRlcm1pbmUgaXRzIHJlbGF0aW9uc2hpcCB0byBvdGhlciBkZXZpY2VzCi0gICB3aXRoaW4gdGhlIHRyZWUuICBPcGVyYXRpb25zIGluY2x1ZGUgcXVlcnlpbmcgZm9yIGEgZGV2aWNlcyBwYXJlbnQsCi0gICBzaWJsaW5nLCBjaGlsZCwgbmFtZSwgYW5kIHBhdGggKGZyb20gdGhlIHJvb3QpLgotCi0gICAqLwotCi0KLSNkZWZpbmUgaHdfcGFyZW50KGh3KSAoKGh3KS0+cGFyZW50X29mX2h3ICsgMCkKLQotI2RlZmluZSBod19zaWJsaW5nKGh3KSAoKGh3KS0+c2libGluZ19vZl9odyArIDApCi0KLSNkZWZpbmUgaHdfY2hpbGQoaHcpICgoaHcpLT5jaGlsZF9vZl9odyArIDApCi0KLQotCi0vKiBIZXJyaXRhZ2U6Ci0KLSAqLwotCi0jZGVmaW5lIGh3X2ZhbWlseShodykgKChodyktPmZhbWlseV9vZl9odyArIDApCi0KLSNkZWZpbmUgaHdfbmFtZShodykgKChodyktPm5hbWVfb2ZfaHcgKyAwKQotCi0jZGVmaW5lIGh3X2FyZ3MoaHcpICgoaHcpLT5hcmdzX29mX2h3ICsgMCkKLQotI2RlZmluZSBod19wYXRoKGh3KSAoKGh3KS0+cGF0aF9vZl9odyArIDApCi0KLQotCi0vKiBTaG9ydCBjdXQgdG8gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZSAqLwotCi0jZGVmaW5lIGh3X3Jvb3QoaHcpICgoaHcpLT5yb290X29mX2h3ICsgMCkKLQotLyogU2hvcnQgY3V0IGJhY2sgdG8gdGhlIHNpbXVsYXRvciBvYmplY3QgKi8KLQotI2RlZmluZSBod19zeXN0ZW0oaHcpICgoaHcpLT5zeXN0ZW1fb2ZfaHcpCi0KLS8qIEZvciByZXF1ZXN0cyBpbml0aWF0ZWQgYnkgYSBDUFUgdGhlIGNwdSB0aGF0IGluaXRpYXRlZCB0aGUgcmVxdWVzdCAqLwotCi1zdHJ1Y3QgX3NpbV9jcHUgKmh3X3N5c3RlbV9jcHUgKHN0cnVjdCBodyAqaHcpOwotCi0KLS8qIERldmljZSBwcml2YXRlIGRhdGEgKi8KLQotI2RlZmluZSBod19kYXRhKGh3KSAoKGh3KS0+ZGF0YV9vZl9odykKLQotI2RlZmluZSBzZXRfaHdfZGF0YShodywgdmFsdWUpIFwKLSgoaHcpLT5kYXRhX29mX2h3ID0gKHZhbHVlKSkKLQotCi0MCi0vKiBQZXJmb3JtIGEgc29mdCByZXNldCBvZiB0aGUgZGV2aWNlICovCi0KLXR5cGVkZWYgdW5zaWduZWQgKGh3X3Jlc2V0X21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqbWUpOwotCi0jZGVmaW5lIGh3X3Jlc2V0KGh3KSAoKGh3KS0+dG9fcmVzZXQgKGh3KSkKLQotI2RlZmluZSBzZXRfaHdfcmVzZXQoaHcsIG1ldGhvZCkgXAotKChodyktPnRvX3Jlc2V0ID0gbWV0aG9kKQotCi0MCi0vKiBIYXJkd2FyZSBvcGVyYXRpb25zOgotCi0gICBDb25uZWN0aW5nIGEgcGFyZW50IHRvIGl0cyBjaGlsZHJlbiBpcyBhIGNvbW1vbiBidXMuIFRoZSBwYXJlbnQKLSAgIG5vZGUgaXMgZGVzY3JpYmVkIGFzIHRoZSBidXMgb3duZXIgYW5kIGlzIHJlc3BvbmlzYmxlIGZvcgotICAgY28tb3JkaW5hdGluZyBidXMgb3BlcmF0aW9ucy4gT24gdGhlIGJ1cywgYSBTUEFDRTpBRERSIHBhaXIgaXMgdXNlZAotICAgdG8gc3BlY2lmeSBhbiBhZGRyZXNzLiAgQSBkZXZpY2UgdGhhdCBpcyBib3RoIGEgYnVzIG93bmVyIChwYXJlbnQpCi0gICBhbmQgYnVzIGNsaWVudCAoY2hpbGQpIGFyZSByZWZlcmVkIHRvIGFzIGEgYnJpZGdpbmcgZGV2aWNlLgotCi0gICBBIGNoaWxkIHBlcmZvcm1pbmcgYSBkYXRhIChETUEpIHRyYW5zZmVyIHdpbGwgcGFzcyBpdHMgcmVxdWVzdCB0bwotICAgdGhlIGJ1cyBvd25lciAodGhlIGRldmljZXMgcGFyZW50KS4gIFRoZSBidXMgb3duZXIgd2lsbCB0aGVuIGVpdGhlcgotICAgcmVmbGVjdCB0aGUgcmVxdWVzdCB0byBvbmUgb2YgdGhlIG90aGVyIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIGJ1cwotICAgKGEgY2hpbGQgb2YgdGhlIGJ1cyBvd25lcikgb3IgYnJpZGdlIHRoZSByZXF1ZXN0IHVwIHRoZSB0cmVlIHRvIHRoZQotICAgbmV4dCBidXMuICovCi0KLQotLyogQ2hpbGRyZW4gYXR0YWNoZWQgdG8gYSBidXMgY2FuIHJlZ2lzdGVyIChhdHRhY2gpIHRoZW1zZWx2ZXMgdG8KLSAgIHNwZWNpZmljIGFkZHJlc3NlcyBvbiB0aGVpciBhdHRhY2hlZCBidXMuCi0KLSAgIChBIGRldmljZSBtYXkgYWxzbyBiZSBpbXBsaWNpdGx5IGF0dGFjaGVkIHRvIGNlcnRhaW4gYnVzCi0gICBhZGRyZXNzZXMpLgotCi0gICBUaGUgU1BBQ0U6QUREUiBwYWlyIHNwZWNpZnkgYW4gYWRkcmVzcyBvbiB0aGUgY29tbW9uIGJ1cyB0aGF0Ci0gICBjb25uZWN0cyB0aGUgcGFyZW50IGFuZCBjaGlsZCBkZXZpY2VzLiAqLwotCi10eXBlZGVmIHZvaWQgKGh3X2F0dGFjaF9hZGRyZXNzX21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqbWUsCi0gICAgICBpbnQgbGV2ZWwsCi0gICAgICBpbnQgc3BhY2UsCi0gICAgICBhZGRyZXNzX3dvcmQgYWRkciwKLSAgICAgIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKLSAgICAgIHN0cnVjdCBodyAqY2xpZW50KTsgLypjYWxsYmFjay9kZWZhdWx0Ki8KLQotI2RlZmluZSBod19hdHRhY2hfYWRkcmVzcyhtZSwgbGV2ZWwsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgY2xpZW50KSBcCi0oKG1lKS0+dG9fYXR0YWNoX2FkZHJlc3MgKG1lLCBsZXZlbCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCBjbGllbnQpKQotCi0jZGVmaW5lIHNldF9od19hdHRhY2hfYWRkcmVzcyhodywgbWV0aG9kKSBcCi0oKGh3KS0+dG9fYXR0YWNoX2FkZHJlc3MgPSAobWV0aG9kKSkKLQotdHlwZWRlZiB2b2lkIChod19kZXRhY2hfYWRkcmVzc19tZXRob2QpCi0gICAgIChzdHJ1Y3QgaHcgKm1lLAotICAgICAgaW50IGxldmVsLAotICAgICAgaW50IHNwYWNlLAotICAgICAgYWRkcmVzc193b3JkIGFkZHIsCi0gICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCi0gICAgICBzdHJ1Y3QgaHcgKmNsaWVudCk7IC8qY2FsbGJhY2svZGVmYXVsdCovCi0KLSNkZWZpbmUgaHdfZGV0YWNoX2FkZHJlc3MobWUsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIGNsaWVudCkgXAotKChtZSktPnRvX2RldGFjaF9hZGRyZXNzIChtZSwgbGV2ZWwsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgY2xpZW50KSkKLQotI2RlZmluZSBzZXRfaHdfZGV0YWNoX2FkZHJlc3MoaHcsIG1ldGhvZCkgXAotKChodyktPnRvX2RldGFjaF9hZGRyZXNzID0gKG1ldGhvZCkpCi0KLQotLyogQW4gSU8gb3BlcmF0aW9uIGZyb20gYSBwYXJlbnQgdG8gYSBjaGlsZCB2aWEgdGhlIGNvbmVjdGluZyBidXMuCi0KLSAgIFRoZSBTUEFDRTpBRERSIHBhaXIgc3BlY2lmeSBhbiBhZGRyZXNzIG9uIHRoZSBidXMgc2hhcmVkIGJldHdlZW4KLSAgIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGRldmljZXMuICovCi0KLXR5cGVkZWYgdW5zaWduZWQgKGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqbWUsCi0gICAgICB2b2lkICpkZXN0LAotICAgICAgaW50IHNwYWNlLAotICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotICAgICAgdW5zaWduZWQgbnJfYnl0ZXMpOwotCi0jZGVmaW5lIGh3X2lvX3JlYWRfYnVmZmVyKGh3LCBkZXN0LCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpIFwKLSgoaHcpLT50b19pb19yZWFkX2J1ZmZlciAoaHcsIGRlc3QsIHNwYWNlLCBhZGRyLCBucl9ieXRlcykpCi0KLSNkZWZpbmUgc2V0X2h3X2lvX3JlYWRfYnVmZmVyKGh3LCBtZXRob2QpIFwKLSgoaHcpLT50b19pb19yZWFkX2J1ZmZlciA9IChtZXRob2QpKQotCi10eXBlZGVmIHVuc2lnbmVkIChod19pb193cml0ZV9idWZmZXJfbWV0aG9kKQotICAgICAoc3RydWN0IGh3ICptZSwKLSAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLSAgICAgIGludCBzcGFjZSwKLSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKTsKLQotI2RlZmluZSBod19pb193cml0ZV9idWZmZXIoaHcsIHNyYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSBcCi0oKGh3KS0+dG9faW9fd3JpdGVfYnVmZmVyIChodywgc3JjLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpKQotCi0jZGVmaW5lIHNldF9od19pb193cml0ZV9idWZmZXIoaHcsIG1ldGhvZCkgXAotKChodyktPnRvX2lvX3dyaXRlX2J1ZmZlciA9IChtZXRob2QpKQotCi0KLS8qIENvbnZlcnNseSwgdGhlIGRldmljZSBwY2kxMDAwLDFAMSBtYXkgbmVlZCB0byBwZXJmb3JtIGEgZG1hIHRyYW5zZmVyCi0gICBpbnRvIHRoZSBjcHUvbWVtb3J5IGNvcmUuICBKdXN0IGFzIEkvTyBtb3ZlcyB0b3dhcmRzIHRoZSBsZWF2ZXMsCi0gICBkbWEgdHJhbnNmZXJzIG1vdmUgdG93YXJkcyB0aGUgY29yZSB2aWEgdGhlIGluaXRpYXRpbmcgZGV2aWNlcwotICAgcGFyZW50IG5vZGVzLiAgVGhlIHJvb3QgZGV2aWNlIChzcGVjaWFsKSBjb252ZXJ0cyB0aGUgRE1BIHRyYW5zZmVyCi0gICBpbnRvIHJlYWRzL3dyaXRlcyB0byBtZW1vcnkuCi0KLSAgIFRoZSBTUEFDRTpBRERSIHBhaXIgc3BlY2lmeSBhbiBhZGRyZXNzIG9uIHRoZSBjb21tb24gYnVzIGNvbm5lY3RpbmcKLSAgIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGRldmljZXMuICovCi0KLXR5cGVkZWYgdW5zaWduZWQgKGh3X2RtYV9yZWFkX2J1ZmZlcl9tZXRob2QpCi0gICAgIChzdHJ1Y3QgaHcgKmJ1cywKLSAgICAgIHZvaWQgKmRlc3QsCi0gICAgICBpbnQgc3BhY2UsCi0gICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0gICAgICB1bnNpZ25lZCBucl9ieXRlcyk7Ci0KLSNkZWZpbmUgaHdfZG1hX3JlYWRfYnVmZmVyKGJ1cywgZGVzdCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSBcCi0oKGJ1cyktPnRvX2RtYV9yZWFkX2J1ZmZlciAoYnVzLCBkZXN0LCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpKQotCi0jZGVmaW5lIHNldF9od19kbWFfcmVhZF9idWZmZXIobWUsIG1ldGhvZCkgXAotKChtZSktPnRvX2RtYV9yZWFkX2J1ZmZlciA9IChtZXRob2QpKQotCi10eXBlZGVmIHVuc2lnbmVkIChod19kbWFfd3JpdGVfYnVmZmVyX21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqYnVzLAotICAgICAgY29uc3Qgdm9pZCAqc291cmNlLAotICAgICAgaW50IHNwYWNlLAotICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0gICAgICBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Ci0KLSNkZWZpbmUgaHdfZG1hX3dyaXRlX2J1ZmZlcihidXMsIHNyYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCB2aW9sYXRlX3JvKSBcCi0oKGJ1cyktPnRvX2RtYV93cml0ZV9idWZmZXIgKGJ1cywgc3JjLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIHZpb2xhdGVfcm8pKQotCi0jZGVmaW5lIHNldF9od19kbWFfd3JpdGVfYnVmZmVyKG1lLCBtZXRob2QpIFwKLSgobWUpLT50b19kbWFfd3JpdGVfYnVmZmVyID0gKG1ldGhvZCkpCi0MCi0vKiBBZGRyZXNzL3NpemUgc3BlY3MgZm9yIGRldmljZXMgYXJlIGVuY29kZWQgZm9sbG93aW5nIGEgY29udmVudGlvbgotICAgc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgT3BlbkZpcm13YXJlLiAgSW4gcGFydGljdWxhciwgYW4KLSAgIGFkZHJlc3Mvc2l6ZSBpcyBwYWNrZWQgaW50byBhIHNlcXVlbmNlIG9mIHVwIHRvIGZvdXIgY2VsbCB3b3Jkcy4KLSAgIFRoZSBudW1iZXIgb2Ygd29yZHMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIHthZGRyZXNzLHNpemV9Ci0gICBjZWxscyBhdHRyaWJ1dGVzIG9mIHRoZSBkZXZpY2UuICovCi0KLXR5cGVkZWYgc3RydWN0IF9od191bml0IHsKLSAgaW50IG5yX2NlbGxzOwotICB1bnNpZ25lZF9jZWxsIGNlbGxzWzRdOyAvKiB1bnVzZWQgY2VsbHMgYXJlIHplcm8gKi8KLX0gaHdfdW5pdDsKLQotCi0vKiBGb3IgdGhlIGdpdmVuIGJ1cywgdGhlIG51bWJlciBvZiBhZGRyZXNzIGFuZCBzaXplIGNlbGxzIHVzZWQgaW4gYQotICAgaHdfdW5pdC4gKi8KLQotI2RlZmluZSBod191bml0X25yX2FkZHJlc3NfY2VsbHMoYnVzKSAoKGJ1cyktPm5yX2FkZHJlc3NfY2VsbHNfb2ZfaHdfdW5pdCArIDApCi0KLSNkZWZpbmUgaHdfdW5pdF9ucl9zaXplX2NlbGxzKGJ1cykgKChidXMpLT5ucl9zaXplX2NlbGxzX29mX2h3X3VuaXQgKyAwKQotCi0KLS8qIEZvciB0aGUgZ2l2ZW4gZGV2aWNlLCBpdHMgaWRlbnRpZnlpbmcgaHdfdW5pdCBhZGRyZXNzLgotCi0gICBFYWNoIGRldmljZSBoYXMgYW4gaWRlbnRpZnlpbmcgaHdfdW5pdCBhZGRyZXNzLiAgVGhhdCBhZGRyZXNzIGlzCi0gICB1c2VkIHdoZW4gaWRlbnRpZnlpbmcgb25lIG9mIGEgbnVtYmVyIG9mIGlkZW50aWNhbCBkZXZpY2VzIG9uIGEKLSAgIGNvbW1vbiBjb250cm9sbGVyIGJ1cy4gZXggZmQwJmZkMS4gKi8KLQotY29uc3QgaHdfdW5pdCAqaHdfdW5pdF9hZGRyZXNzCi0oc3RydWN0IGh3ICptZSk7Ci0KLQotLyogQ29udmVydCBiZXR3ZWVuIGEgdGV4dHVhbCBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgIGh3X3VuaXQgYWRkcmVzcy9zaXplLgotCi0gICBOT1RFOiBBIGRldmljZSBhc2tzIGl0cyBwYXJlbnQgdG8gdHJhbnNsYXRlIGJldHdlZW4gYSBod191bml0IGFuZAotICAgdGV4dHVhbCByZXByZXNlbnRhdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgdGV4dHVhbCBhZGRyZXNzIG9mIGEKLSAgIGRldmljZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIHBhcmVudCBidXNzZXMgbm90YXRpb24uICovCi0KLXR5cGVkZWYgaW50IChod191bml0X2RlY29kZV9tZXRob2QpCi0gICAgIChzdHJ1Y3QgaHcgKmJ1cywKLSAgICAgIGNvbnN0IGNoYXIgKmVuY29kZWQsCi0gICAgICBod191bml0ICp1bml0KTsKLQotI2RlZmluZSBod191bml0X2RlY29kZShidXMsIGVuY29kZWQsIHVuaXQpIFwKLSgoYnVzKS0+dG9fdW5pdF9kZWNvZGUgKGJ1cywgZW5jb2RlZCwgdW5pdCkpCi0KLSNkZWZpbmUgc2V0X2h3X3VuaXRfZGVjb2RlKGh3LCBtZXRob2QpIFwKLSgoaHcpLT50b191bml0X2RlY29kZSA9IChtZXRob2QpKQotCi10eXBlZGVmIGludCAoaHdfdW5pdF9lbmNvZGVfbWV0aG9kKQotICAgICAoc3RydWN0IGh3ICpidXMsCi0gICAgICBjb25zdCBod191bml0ICp1bml0LAotICAgICAgY2hhciAqZW5jb2RlZCwKLSAgICAgIGludCBzaXplb2ZfYnVmKTsKLSAgICAgCi0jZGVmaW5lIGh3X3VuaXRfZW5jb2RlKGJ1cywgdW5pdCwgZW5jb2RlZCwgc2l6ZW9mX2VuY29kZWQpIFwKLSgoYnVzKS0+dG9fdW5pdF9lbmNvZGUgKGJ1cywgdW5pdCwgZW5jb2RlZCwgc2l6ZW9mX2VuY29kZWQpKQotCi0jZGVmaW5lIHNldF9od191bml0X2VuY29kZShodywgbWV0aG9kKSBcCi0oKGh3KS0+dG9fdW5pdF9lbmNvZGUgPSAobWV0aG9kKSkKLQotCi0vKiBBcyB0aGUgYnVzIHRoYXQgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0b28sIHRvIHRyYW5zbGF0ZSBhIGRldmljZXMKLSAgIGh3X3VuaXQgYWRkcmVzcy9zaXplIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciBhbiBhdHRhY2ggYWRkcmVzcwotICAgY2FsbC4KLQotICAgUmV0dXJuIGEgemVybyByZXN1bHQgaWYgdGhlIGFkZHJlc3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBsb29raW5nCi0gICBmb3IgYXR0YWNoIGFkZHJlc3Nlcy4gKi8KLQotdHlwZWRlZiBpbnQgKGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzc19tZXRob2QpCi0gICAgIChzdHJ1Y3QgaHcgKmJ1cywKLSAgICAgIGNvbnN0IGh3X3VuaXQgKnVuaXRfYWRkciwKLSAgICAgIGludCAqYXR0YWNoX3NwYWNlLAotICAgICAgdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHIsCi0gICAgICBzdHJ1Y3QgaHcgKmNsaWVudCk7Ci0KLSNkZWZpbmUgaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGJ1cywgdW5pdF9hZGRyLCBhdHRhY2hfc3BhY2UsIGF0dGFjaF9hZGRyLCBjbGllbnQpIFwKLSgoYnVzKS0+dG9fdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIChidXMsIHVuaXRfYWRkciwgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkciwgY2xpZW50KSkKLQotI2RlZmluZSBzZXRfaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGh3LCBtZXRob2QpIFwKLSgoaHcpLT50b191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgPSAobWV0aG9kKSkKLQotdHlwZWRlZiBpbnQgKGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZV9tZXRob2QpCi0gICAgIChzdHJ1Y3QgaHcgKmJ1cywKLSAgICAgIGNvbnN0IGh3X3VuaXQgKnVuaXRfc2l6ZSwKLSAgICAgIHVuc2lnbmVkICphdHRhY2hfc2l6ZSwKLSAgICAgIHN0cnVjdCBodyAqY2xpZW50KTsKLQotI2RlZmluZSBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUoYnVzLCB1bml0X3NpemUsIGF0dGFjaF9zaXplLCBjbGllbnQpIFwKLSgoYnVzKS0+dG9fdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChidXMsIHVuaXRfc2l6ZSwgYXR0YWNoX3NpemUsIGNsaWVudCkpCi0KLSNkZWZpbmUgc2V0X2h3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZShodywgbWV0aG9kKSBcCi0oKGh3KS0+dG9fdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplID0gKG1ldGhvZCkpCi0KLQwKLWV4dGVybiBjaGFyICpod19zdHJkdXAgKHN0cnVjdCBodyAqbWUsIGNvbnN0IGNoYXIgKnN0cik7Ci0KLQwKLS8qIFV0aWxpdGllczoKLQotICAgKi8KLQotLyogSU9DVEw6OgotCi0gICBPZnRlbiBkZXZpY2VzIHJlcXVpcmUgYG91dCBvZiBiYW5kJyBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4KLSAgIEZvciBpbnN0YW5jZSBhIHBhbCBkZXZpY2UgbWF5IG5lZWQgdG8gbm90aWZ5IGEgUENJIGJyaWRnZSBkZXZpY2UKLSAgIHRoYXQgYW4gaW50ZXJydXB0IGFjayBjeWNsZSBuZWVkcyB0byBiZSBwZXJmb3JtZWQgb24gdGhlIFBDSSBidXMuCi0gICBXaXRoaW4gUFNJTSBzdWNoIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBieSB1c2luZyB0aGUgZ2VuZXJpYwotICAgaW9jdGwgY2FsbCA8PGh3X2lvY3RsKCk+Pi4KLQotICAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgaHdfaW9jdGxfYnJlYWssIC8qIHVuc2lnbmVkX3dvcmQgcmVxdWVzdGVkX2JyZWFrICovCi0gIGh3X2lvY3RsX3NldF90cmFjZSwgLyogdm9pZCAqLwotICBod19pb2N0bF9jcmVhdGVfc3RhY2ssIC8qIHVuc2lnbmVkX3dvcmQgKnNwLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnAgKi8KLSAgaHdfaW9jdGxfY2hhbmdlX21lZGlhLCAvKiBjb25zdCBjaGFyICpuZXdfaW1hZ2UgKHBvc3NpYmx5IE5VTEwpICovCi0gIG5yX2h3X2lvY3RsX3JlcXVlc3RzLAotfSBod19pb2N0bF9yZXF1ZXN0OwotCi10eXBlZGVmIGludCAoaHdfaW9jdGxfbWV0aG9kKQotICAgICAoc3RydWN0IGh3ICptZSwKLSAgICAgIGh3X2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKLSAgICAgIHZhX2xpc3QgYXApOwotCi1pbnQgaHdfaW9jdGwKLShzdHJ1Y3QgaHcgKm1lLAotIGh3X2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKLSAuLi4pOwotCi0KLS8qIEVycm9yIHJlcG9ydGluZzo6Ci0KLSAgIFNvIHRoYXQgZXJyb3JzIG9yaWdpbmF0aW5nIGZyb20gZGV2aWNlcyBhcHBlYXIgaW4gYSBjb25zaXN0ZW50Ci0gICBmb3JtYXQsIHRoZSA8PGh3X2Fib3J0KCk+PiBmdW5jdGlvbiBjYW4gYmUgdXNlZC4gIEZvcm1hdHMgYW5kCi0gICBvdXRwdXRzIHRoZSBlcnJvciBtZXNzYWdlIGJlZm9yZSBhYm9ydGluZyB0aGUgc2ltdWxhdGlvbgotCi0gICBEZXZpY2VzIHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB0byBhYm9ydCB0aGUgc2ltdWxhdGlvbiBleGNlcHQKLSAgIHdoZW4gdGhlIGFib3J0IHJlYXNvbiBsZWF2ZXMgdGhlIHNpbXVsYXRpb24gaW4gYSBoYXphcmRvdXMKLSAgIGNvbmRpdGlvbiAoZm9yIGluc3RhbmNlIGEgZmFpbGVkIG1hbGxvYykuCi0KLSAgICovCi0KLXZvaWQgaHdfYWJvcnQKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLQotdm9pZCBod192YWJvcnQKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKmZtdCwKLSB2YV9saXN0IGFwKTsKLQotdm9pZCBod19oYWx0Ci0oc3RydWN0IGh3ICptZSwKLSBpbnQgcmVhc29uLAotIGludCBzdGF0dXMpOwotCi0KLSNkZWZpbmUgaHdfdHJhY2VfcChodykgKChodyktPnRyYWNlX29mX2h3X3AgKyAwKQotCi12b2lkIGh3X3RyYWNlCi0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpmbXQsCi0gLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0KLSNkZWZpbmUgSFdfVFJBQ0UoQVJHUykgXAotZG8geyBcCi0gIGlmIChod190cmFjZV9wIChtZSkpIFwKLSAgICB7IFwKLSAgICAgIGh3X3RyYWNlIEFSR1M7IFwKLSAgICB9IFwKLX0gd2hpbGUgKDApCi0KLQotLyogU29tZSBvZiB0aGUgcmVsYXRlZCBmdW5jdGlvbnMgcmVxdWlyZSBzcGVjaWZpYyB0eXBlcyAqLwotCi1zdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YTsKLXN0cnVjdCBod19wb3J0X2RhdGE7Ci1zdHJ1Y3QgaHdfYmFzZV9kYXRhOwotc3RydWN0IGh3X2FsbG9jX2RhdGE7Ci1zdHJ1Y3QgaHdfZXZlbnRfZGF0YTsKLXN0cnVjdCBod19oYW5kbGVfZGF0YTsKLXN0cnVjdCBod19pbnN0YW5jZV9kYXRhOwotCi0vKiBGaW5hbGx5IHRoZSBoYXJkd2FyZSBkZXZpY2UgLSBrZWVwIHlvdXIgZ3J1YmJ5IGxpdHRsZSBtaXRzIG9mZiBvZgotICAgdGhlc2UgaW50ZXJuYWxzISA6LSkgKi8KLQotc3RydWN0IGh3IHsKLQotICAvKiBvdXIgcmVsYXRpdmVzICovCi0gIHN0cnVjdCBodyAqcGFyZW50X29mX2h3OwotICBzdHJ1Y3QgaHcgKnNpYmxpbmdfb2ZfaHc7Ci0gIHN0cnVjdCBodyAqY2hpbGRfb2ZfaHc7Ci0KLSAgLyogb3VyIGlkZW50aXR5ICovCi0gIGNvbnN0IGNoYXIgKm5hbWVfb2ZfaHc7Ci0gIGNvbnN0IGNoYXIgKmZhbWlseV9vZl9odzsKLSAgY29uc3QgY2hhciAqYXJnc19vZl9odzsKLSAgY29uc3QgY2hhciAqcGF0aF9vZl9odzsKLQotICAvKiBvdXIgZGF0YSAqLwotICB2b2lkICpkYXRhX29mX2h3OwotCi0gIC8qIGhvdCBsaW5rcyAqLwotICBzdHJ1Y3QgaHcgKnJvb3Rfb2ZfaHc7Ci0gIHN0cnVjdCBzaW1fc3RhdGUgKnN5c3RlbV9vZl9odzsKLQotICAvKiBpZGVudGlmeWluZyBkYXRhICovCi0gIGh3X3VuaXQgdW5pdF9hZGRyZXNzX29mX2h3OwotICBpbnQgbnJfYWRkcmVzc19jZWxsc19vZl9od191bml0OwotICBpbnQgbnJfc2l6ZV9jZWxsc19vZl9od191bml0OwotCi0gIC8qIFNvZnQgcmVzZXQgKi8KLSAgaHdfcmVzZXRfbWV0aG9kICp0b19yZXNldDsKLQotICAvKiBCYXNpYyBjYWxsYmFja3MgKi8KLSAgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kICp0b19pb19yZWFkX2J1ZmZlcjsKLSAgaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCAqdG9faW9fd3JpdGVfYnVmZmVyOwotICBod19kbWFfcmVhZF9idWZmZXJfbWV0aG9kICp0b19kbWFfcmVhZF9idWZmZXI7Ci0gIGh3X2RtYV93cml0ZV9idWZmZXJfbWV0aG9kICp0b19kbWFfd3JpdGVfYnVmZmVyOwotICBod19hdHRhY2hfYWRkcmVzc19tZXRob2QgKnRvX2F0dGFjaF9hZGRyZXNzOwotICBod19kZXRhY2hfYWRkcmVzc19tZXRob2QgKnRvX2RldGFjaF9hZGRyZXNzOwotCi0gIC8qIE1vcmUgY29tcGxpY2F0ZWQgY2FsbGJhY2tzICovCi0gIGh3X2lvY3RsX21ldGhvZCAqdG9faW9jdGw7Ci0gIGludCB0cmFjZV9vZl9od19wOwotCi0gIC8qIGFkZHJlc3MgY2FsbGJhY2tzICovCi0gIGh3X3VuaXRfZGVjb2RlX21ldGhvZCAqdG9fdW5pdF9kZWNvZGU7Ci0gIGh3X3VuaXRfZW5jb2RlX21ldGhvZCAqdG9fdW5pdF9lbmNvZGU7Ci0gIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzc19tZXRob2QgKnRvX3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzczsKLSAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplX21ldGhvZCAqdG9fdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplOwotCi0gIC8qIHJlbGF0ZWQgZGF0YSAqLwotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqcHJvcGVydGllc19vZl9odzsKLSAgc3RydWN0IGh3X3BvcnRfZGF0YSAqcG9ydHNfb2ZfaHc7Ci0gIHN0cnVjdCBod19iYXNlX2RhdGEgKmJhc2Vfb2ZfaHc7Ci0gIHN0cnVjdCBod19hbGxvY19kYXRhICphbGxvY19vZl9odzsKLSAgc3RydWN0IGh3X2V2ZW50X2RhdGEgKmV2ZW50c19vZl9odzsKLSAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpoYW5kbGVzX29mX2h3OwotICBzdHJ1Y3QgaHdfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2VzX29mX2h3OwotCi19OwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1ldmVudHMuYyBiL3NpbS9jb21tb24vaHctZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzVhNDAuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1ldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKiBIYXJkd2FyZSBldmVudCBtYW5hZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiaHctbWFpbi5oIgotI2luY2x1ZGUgImh3LWJhc2UuaCIKLQotI2luY2x1ZGUgInNpbS1ldmVudHMuaCIKLQotCi0vKiBUaGUgaHctZXZlbnRzIG9iamVjdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBzaW0tZXZlbnRzICovCi0KLXN0cnVjdCBod19ldmVudCB7Ci0gIHZvaWQgKmRhdGE7Ci0gIHN0cnVjdCBodyAqbWU7Ci0gIGh3X2V2ZW50X2NhbGxiYWNrICpjYWxsYmFjazsKLSAgc2ltX2V2ZW50ICpyZWFsOwotICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqZW50cnk7Ci19OwotCi1zdHJ1Y3QgaHdfZXZlbnRfZGF0YSB7Ci0gIHN0cnVjdCBod19ldmVudCBldmVudDsKLSAgc3RydWN0IGh3X2V2ZW50X2RhdGEgKm5leHQ7Ci19OwotCi12b2lkCi1jcmVhdGVfaHdfZXZlbnRfZGF0YSAoc3RydWN0IGh3ICptZSkKLXsKLSAgaWYgKG1lLT5ldmVudHNfb2ZfaHcgIT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJzdHJheSBldmVudHMiKTsKLSAgLyogTk9QICovCi19Ci0KLXZvaWQKLWRlbGV0ZV9od19ldmVudF9kYXRhIChzdHJ1Y3QgaHcgKm1lKQotewotICBpZiAobWUtPmV2ZW50c19vZl9odyAhPSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInN0cmF5IGV2ZW50cyIpOwotfQotCi0KLS8qIFBhc3MgdGhlIEgvVyBldmVudCBvbnRvIHRoZSByZWFsIGNhbGxiYWNrICovCi0KLXN0YXRpYyB2b2lkCi1ib3VuY2VfaHdfZXZlbnQgKFNJTV9ERVNDIHNkLAotCQkgdm9pZCAqZGF0YSkKLXsKLSAgLyogc2F2ZSB0aGUgZGF0YSAqLwotICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqZW50cnkgPSAoc3RydWN0IGh3X2V2ZW50X2RhdGEgKikgZGF0YTsKLSAgc3RydWN0IGh3ICptZSA9IGVudHJ5LT5ldmVudC5tZTsKLSAgdm9pZCAqZXZlbnRfZGF0YSA9IGVudHJ5LT5ldmVudC5kYXRhOwotICBod19ldmVudF9jYWxsYmFjayAqY2FsbGJhY2sgPSBlbnRyeS0+ZXZlbnQuY2FsbGJhY2s7Ci0gIHN0cnVjdCBod19ldmVudF9kYXRhICoqcHJldiA9ICZtZS0+ZXZlbnRzX29mX2h3OwotICB3aGlsZSAoKCpwcmV2KSAhPSBlbnRyeSkKLSAgICBwcmV2ID0gJigqcHJldiktPm5leHQ7Ci0gICgqcHJldikgPSBlbnRyeS0+bmV4dDsKLSAgaHdfZnJlZSAobWUsIGVudHJ5KTsKLSAgY2FsbGJhY2sgKG1lLCBldmVudF9kYXRhKTsgLyogbWF5IG5vdCByZXR1cm4gKi8KLX0KLQotCi0KLS8qIE1hcCBvbnRvIHRoZSBldmVudCBmdW5jdGlvbnMgKi8KLQotc3RydWN0IGh3X2V2ZW50ICoKLWh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0JCQkgaHdfZXZlbnRfY2FsbGJhY2sgKmNhbGxiYWNrLAotCQkJIHZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7Ci0gIHZhX2xpc3QgZHVtbXk7Ci0gIGV2ZW50ID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdnRyYWNlZiAobWUsIGRlbHRhX3RpbWUsIGNhbGxiYWNrLCBkYXRhLAotCQkJCQkgICBOVUxMLCBkdW1teSk7Ci0gIHJldHVybiBldmVudDsKLX0KLQotc3RydWN0IGh3X2V2ZW50ICoKLWh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlX3RyYWNlZiAoc3RydWN0IGh3ICptZSwKLQkJCQlzaWduZWQ2NCBkZWx0YV90aW1lLAotCQkJCWh3X2V2ZW50X2NhbGxiYWNrICpjYWxsYmFjaywKLQkJCQl2b2lkICpkYXRhLAotCQkJCWNvbnN0IGNoYXIgKmZtdCwKLQkJCQkuLi4pCi17Ci0gIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgZXZlbnQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZV92dHJhY2VmIChtZSwgZGVsdGFfdGltZSwgY2FsbGJhY2ssIGRhdGEsIGZtdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLSAgcmV0dXJuIGV2ZW50OwotfQotCi1zdHJ1Y3QgaHdfZXZlbnQgKgotaHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdnRyYWNlZiAoc3RydWN0IGh3ICptZSwKLQkJCQkgc2lnbmVkNjQgZGVsdGFfdGltZSwKLQkJCQkgaHdfZXZlbnRfY2FsbGJhY2sgKmNhbGxiYWNrLAotCQkJCSB2b2lkICpkYXRhLAotCQkJCSBjb25zdCBjaGFyICpmbXQsCi0JCQkJIHZhX2xpc3QgYXApCi17Ci0gIHN0cnVjdCBod19ldmVudF9kYXRhICplbnRyeSA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBod19ldmVudF9kYXRhKTsKLSAgZW50cnktPm5leHQgPSBtZS0+ZXZlbnRzX29mX2h3OwotICBtZS0+ZXZlbnRzX29mX2h3ID0gZW50cnk7Ci0gIC8qIGZpbGwgaXQgaW4gKi8KLSAgZW50cnktPmV2ZW50LmVudHJ5ID0gZW50cnk7Ci0gIGVudHJ5LT5ldmVudC5kYXRhID0gZGF0YTsKLSAgZW50cnktPmV2ZW50LmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gIGVudHJ5LT5ldmVudC5tZSA9IG1lOwotICBlbnRyeS0+ZXZlbnQucmVhbCA9IHNpbV9ldmVudHNfc2NoZWR1bGVfdnRyYWNlZiAoaHdfc3lzdGVtIChtZSksCi0JCQkJCQkgICBkZWx0YV90aW1lLAotCQkJCQkJICAgYm91bmNlX2h3X2V2ZW50LAotCQkJCQkJICAgZW50cnksCi0JCQkJCQkgICBmbXQsIGFwKTsKLSAgcmV0dXJuICZlbnRyeS0+ZXZlbnQ7Ci19Ci0KLQotdm9pZAotaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAoc3RydWN0IGh3ICptZSwKLQkJCSAgIHN0cnVjdCBod19ldmVudCAqZXZlbnRfdG9fcmVtb3ZlKQotewotLyogWkFQIHRoZSBldmVudCBidXQgb25seSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgZXZlbnQgcXVldWUuICBOb3RlCi0gICB0aGF0IGV2ZW50X3RvX3JlbW92ZSBpcyBvbmx5IGRlLXJlZmVyZW5jZWQgYWZ0ZXIgaXRzIHZhbGlkaXR5IGhhcwotICAgYmVlbiBjb25maXJtZWQuICAqLwotICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqKnByZXY7Ci0gIGZvciAocHJldiA9ICZtZS0+ZXZlbnRzX29mX2h3OwotICAgICAgICgqcHJldikgIT0gTlVMTDsKLSAgICAgICBwcmV2ID0gJigqcHJldiktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGh3X2V2ZW50X2RhdGEgKmVudHJ5ID0gKCpwcmV2KTsKLSAgICAgIGlmICgmZW50cnktPmV2ZW50ID09IGV2ZW50X3RvX3JlbW92ZSkKLQl7Ci0JICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKGh3X3N5c3RlbSAobWUpLAotCQkJCSBlbnRyeS0+ZXZlbnQucmVhbCk7Ci0JICAoKnByZXYpID0gZW50cnktPm5leHQ7Ci0JICBod19mcmVlIChtZSwgZW50cnkpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLQotc2lnbmVkNjQKLWh3X2V2ZW50X3F1ZXVlX3RpbWUgKHN0cnVjdCBodyAqbWUpCi17Ci0gIHJldHVybiBzaW1fZXZlbnRzX3RpbWUgKGh3X3N5c3RlbSAobWUpKTsKLX0KLQotCi0vKiBPbmx5IHdvcnJ5IGFib3V0IHRoaXMgY29tcGxpbmcgb24gQU5TSSBzeXN0ZW1zLgotICAgQnVpbGQgd2l0aCBgbWFrZSB0ZXN0LWh3LWV2ZW50cycgaW4gc2ltLzxjcHU+IGRpcmVjdG9yeSovCi0KLSNpZiBkZWZpbmVkIChNQUlOKQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotc3RhdGljIHZvaWQKLXRlc3RfaGFuZGxlciAoc3RydWN0IGh3ICptZSwKLQkgICAgICB2b2lkICpkYXRhKQotewotICBpbnQgKm4gPSBkYXRhOwotICBpZiAoKm4gIT0gaHdfZXZlbnRfcXVldWVfdGltZSAobWUpKQotICAgIGFib3J0ICgpOwotICAqbiA9IC0oKm4pOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjLAotICAgICAgY2hhciAqKmFyZ3YpCi17Ci0gIGhvc3RfY2FsbGJhY2sgKmNiID0gWkFMTE9DIChob3N0X2NhbGxiYWNrKTsKLSAgc3RydWN0IHNpbV9zdGF0ZSAqc2QgPSBzaW1fc3RhdGVfYWxsb2MgKDAsIGNiKTsKLSAgc3RydWN0IGh3ICptZSA9IFpBTExPQyAoc3RydWN0IGh3KTsKLSAgc2ltX3ByZV9hcmd2X2luaXQgKHNkLCAidGVzdC1ody1ldmVudHMiKTsKLSAgc2ltX3Bvc3RfYXJndl9pbml0IChzZCk7Ci0gIG1lLT5zeXN0ZW1fb2ZfaHcgPSBzZDsKLQotICBwcmludGYgKCJDcmVhdGUgaHctZXZlbnQtZGF0YVxuIik7Ci0gIHsKLSAgICBjcmVhdGVfaHdfYWxsb2NfZGF0YSAobWUpOwotICAgIGNyZWF0ZV9od19ldmVudF9kYXRhIChtZSk7Ci0gICAgZGVsZXRlX2h3X2V2ZW50X2RhdGEgKG1lKTsKLSAgICBkZWxldGVfaHdfYWxsb2NfZGF0YSAobWUpOwotICB9Ci0KLSAgcHJpbnRmICgiQ3JlYXRlIGh3LWV2ZW50c1xuIik7Ci0gIHsKLSAgICBzdHJ1Y3QgaHdfZXZlbnQgKmE7Ci0gICAgc3RydWN0IGh3X2V2ZW50ICpiOwotICAgIHN0cnVjdCBod19ldmVudCAqYzsKLSAgICBzdHJ1Y3QgaHdfZXZlbnQgKmQ7Ci0gICAgY3JlYXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKLSAgICBjcmVhdGVfaHdfZXZlbnRfZGF0YSAobWUpOwotICAgIGEgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDAsIE5VTEwsIE5VTEwpOwotICAgIGIgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIE5VTEwsIE5VTEwpOwotICAgIGMgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDIsIE5VTEwsIE5VTEwpOwotICAgIGQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIE5VTEwsIE5VTEwpOwotICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBjKTsKLSAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgYik7Ci0gICAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIGEpOwotICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBkKTsKLSAgICBjID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X2V2ZW50KTsKLSAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgYik7IC8qIE9PUFMhICovCi0gICAgaHdfZnJlZSAobWUsIGMpOwotICAgIGRlbGV0ZV9od19ldmVudF9kYXRhIChtZSk7Ci0gICAgZGVsZXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKLSAgfQotCi0gIHByaW50ZiAoIlNjaGVkdWxlIGh3LWV2ZW50c1xuIik7Ci0gIHsKLSAgICBzdHJ1Y3QgaHdfZXZlbnQgKiplOwotICAgIGludCAqbjsKLSAgICBpbnQgaTsKLSAgICBpbnQgbnIgPSA0OwotICAgIGUgPSBIV19OWkFMTE9DIChtZSwgc3RydWN0IGh3X2V2ZW50ICosIG5yKTsKLSAgICBuID0gSFdfTlpBTExPQyAobWUsIGludCwgbnIpOwotICAgIGNyZWF0ZV9od19hbGxvY19kYXRhIChtZSk7Ci0gICAgY3JlYXRlX2h3X2V2ZW50X2RhdGEgKG1lKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKLSAgICAgIHsKLQluW2ldID0gaTsKLQllW2ldID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCBpLCB0ZXN0X2hhbmRsZXIsICZuW2ldKTsKLSAgICAgIH0KLSAgICBzaW1fZXZlbnRzX3ByZXByb2Nlc3MgKHNkLCAxLCAxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKLSAgICAgIHsKLQlpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCi0JICBzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKLSAgICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKLSAgICAgIHsKLQlpZiAobltpXSAhPSAtaSkKLQkgIGFib3J0ICgpOwotCWh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBlW2ldKTsKLSAgICAgIH0KLSAgICBod19mcmVlIChtZSwgbik7Ci0gICAgaHdfZnJlZSAobWUsIGUpOwotICAgIGRlbGV0ZV9od19ldmVudF9kYXRhIChtZSk7Ci0gICAgZGVsZXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWV2ZW50cy5oIGIvc2ltL2NvbW1vbi9ody1ldmVudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliNmY4Yi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LWV2ZW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogSGFyZHdhcmUgZXZlbnQgbWFuYWdlci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSFdfRVZFTlRTX0gKLSNkZWZpbmUgSFdfRVZFTlRTX0gKLQotLyogRXZlbnQgbWFuYWdlciBjdXN0b21pemVkIGZvciBoYXJkd2FyZSBtb2RlbHMuCi0KLSAgIFRoaXMgaW50ZXJmYWNlIGlzIGRpc2N1c3NlZCBmdXJ0aGVyIGluIHNpbS1ldmVudHMuaC4gKi8KLQotc3RydWN0IGh3X2V2ZW50OwotdHlwZWRlZiB2b2lkIChod19ldmVudF9jYWxsYmFjaykgKHN0cnVjdCBodyAqbWUsIHZvaWQgKmRhdGEpOwotCi1zdHJ1Y3QgaHdfZXZlbnQgKmh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlCi0oc3RydWN0IGh3ICptZSwKLSBzaWduZWQ2NCBkZWx0YV90aW1lLAotIGh3X2V2ZW50X2NhbGxiYWNrICpoYW5kbGVyLAotIHZvaWQgKmRhdGEpOwotCi1zdHJ1Y3QgaHdfZXZlbnQgKmh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlX3RyYWNlZgotKHN0cnVjdCBodyAqbWUsCi0gc2lnbmVkNjQgZGVsdGFfdGltZSwKLSBod19ldmVudF9jYWxsYmFjayAqaGFuZGxlciwKLSB2b2lkICpkYXRhLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNSwgNikpKTsKLQotc3RydWN0IGh3X2V2ZW50ICpod19ldmVudF9xdWV1ZV9zY2hlZHVsZV92dHJhY2VmCi0oc3RydWN0IGh3ICptZSwKLSBzaWduZWQ2NCBkZWx0YV90aW1lLAotIGh3X2V2ZW50X2NhbGxiYWNrICpoYW5kbGVyLAotIHZvaWQgKmRhdGEsCi0gY29uc3QgY2hhciAqZm10LAotIHZhX2xpc3QgYXApOwotCi0KLXZvaWQgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZQotKHN0cnVjdCBodyAqbWUsCi0gc3RydWN0IGh3X2V2ZW50ICpldmVudF90b19yZW1vdmUpOwotCi1zaWduZWQ2NCBod19ldmVudF9xdWV1ZV90aW1lCi0oc3RydWN0IGh3ICptZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1oYW5kbGVzLmMgYi9zaW0vY29tbW9uL2h3LWhhbmRsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwMGNhOC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LWhhbmRsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LDE5OTctMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJody1iYXNlLmgiCi0KLQotc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nIHsKLSAgY2VsbF93b3JkIGV4dGVybmFsOwotICBzdHJ1Y3QgaHcgKnBoYW5kbGU7Ci0gIHN0cnVjdCBod19pbnN0YW5jZSAqaWhhbmRsZTsKLSAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpuZXh0OwotfTsKLQotCi1zdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgewotICBpbnQgbnJfbWFwcGluZ3M7Ci0gIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqbWFwcGluZ3M7Ci19OwotCi12b2lkCi1jcmVhdGVfaHdfaGFuZGxlX2RhdGEgKHN0cnVjdCBodyAqaHcpCi17Ci0gIGlmIChod19wYXJlbnQgKGh3KSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGh3LT5oYW5kbGVzX29mX2h3ID0gSFdfWkFMTE9DIChodywgc3RydWN0IGh3X2hhbmRsZV9kYXRhKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBody0+aGFuZGxlc19vZl9odyA9IGh3X3Jvb3QgKGh3KS0+aGFuZGxlc19vZl9odzsKLSAgICB9Ci19Ci0KLXZvaWQKLWRlbGV0ZV9od19oYW5kbGVfZGF0YSAoc3RydWN0IGh3ICpodykKLXsKLSAgLyogTlVMTCAqLwotfQotCi0KLQotI2lmIDAKLXZvaWQKLWh3X2hhbmRsZV9pbml0IChzdHJ1Y3QgaHcgKmh3KQotewotICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmN1cnJlbnRfbWFwID0gZGItPm1hcHBpbmdzOwotICBpZiAoY3VycmVudF9tYXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkYi0+bnJfbWFwcGluZ3MgPSBkYi0+bWFwcGluZ3MtPmV4dGVybmFsOwotICAgICAgLyogdmVyaWZ5IHRoYXQgdGhlIG1hcHBpbmdzIHRoYXQgd2VyZSBub3QgcmVtb3ZlZCBhcmUgaW4KLQkgc2VxdWVuY2UgZG93biB0byBuciAxICovCi0gICAgICB3aGlsZSAoY3VycmVudF9tYXAtPm5leHQgIT0gTlVMTCkKLQl7Ci0JICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsICE9IGN1cnJlbnRfbWFwLT5uZXh0LT5leHRlcm5hbCArIDEpCi0JICAgIGVycm9yICgiaHdfaGFuZGxlOiBod19oYW5kbGUgZGF0YWJhc2UgcG9zc2libHkgY29ycnVwdCIpOwotCSAgY3VycmVudF9tYXAgPSBjdXJyZW50X21hcC0+bmV4dDsKLQl9Ci0gICAgICBBU1NFUlQgKGN1cnJlbnRfbWFwLT5uZXh0ID09IE5VTEwpOwotICAgICAgaWYgKGN1cnJlbnRfbWFwLT5leHRlcm5hbCAhPSAxKQotCWVycm9yICgiaHdfaGFuZGxlOiBod19oYW5kbGUgZGF0YWJhc2UgcG9zc2libHkgY29ycnVwdCIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRiLT5ucl9tYXBwaW5ncyA9IDA7Ci0gICAgfQotfQotI2VuZGlmCi0KLQotc3RydWN0IGh3X2luc3RhbmNlICoKLWh3X2hhbmRsZV9paGFuZGxlMiAoc3RydWN0IGh3ICpodywKLQkJICAgIGNlbGxfd29yZCBleHRlcm5hbCkKLXsKLSAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OwotICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmN1cnJlbnRfbWFwID0gZGItPm1hcHBpbmdzOwotICB3aGlsZSAoY3VycmVudF9tYXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsID09IGV4dGVybmFsKQotCXJldHVybiBjdXJyZW50X21hcC0+aWhhbmRsZTsKLSAgICAgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gKHZvaWQqKTA7Ci19Ci0KLQotc3RydWN0IGh3ICoKLWh3X2hhbmRsZV9waGFuZGxlMiAoc3RydWN0IGh3ICpodywKLQkJICAgIGNlbGxfd29yZCBleHRlcm5hbCkKLXsKLSAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OwotICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmN1cnJlbnRfbWFwID0gZGItPm1hcHBpbmdzOwotICB3aGlsZSAoY3VycmVudF9tYXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsID09IGV4dGVybmFsKQotCXJldHVybiBjdXJyZW50X21hcC0+cGhhbmRsZTsKLSAgICAgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gKHZvaWQqKTA7Ci19Ci0KLQotY2VsbF93b3JkCi1od19oYW5kbGVfMmloYW5kbGUgKHN0cnVjdCBodyAqaHcsCi0JCSAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmludGVybmFsKQotewotICBzdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgKmRiID0gaHctPmhhbmRsZXNfb2ZfaHc7Ci0gIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqY3VycmVudF9tYXAgPSBkYi0+bWFwcGluZ3M7Ci0gIHdoaWxlIChjdXJyZW50X21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X21hcC0+aWhhbmRsZSA9PSBpbnRlcm5hbCkKLQlyZXR1cm4gY3VycmVudF9tYXAtPmV4dGVybmFsOwotICAgICAgY3VycmVudF9tYXAgPSBjdXJyZW50X21hcC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLWNlbGxfd29yZAotaHdfaGFuZGxlXzJwaGFuZGxlIChzdHJ1Y3QgaHcgKmh3LAotCQkgICAgc3RydWN0IGh3ICppbnRlcm5hbCkKLXsKLSAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OwotICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmN1cnJlbnRfbWFwID0gZGItPm1hcHBpbmdzOwotICB3aGlsZSAoY3VycmVudF9tYXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9tYXAtPnBoYW5kbGUgPT0gaW50ZXJuYWwpCi0JcmV0dXJuIGN1cnJlbnRfbWFwLT5leHRlcm5hbDsKLSAgICAgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi12b2lkCi1od19oYW5kbGVfYWRkX2loYW5kbGUgKHN0cnVjdCBodyAqaHcsCi0JCSAgICAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmludGVybmFsKQotewotICBzdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgKmRiID0gaHctPmhhbmRsZXNfb2ZfaHc7Ci0gIGlmIChod19oYW5kbGVfMmloYW5kbGUgKGh3LCBpbnRlcm5hbCkgIT0gMCkgCi0gICAgewotICAgICAgaHdfYWJvcnQgKGh3LCAiYXR0ZW1wdGluZyB0byBhZGQgYW4gaWhhbmRsZSBhbHJlYWR5IGluIHRoZSBkYXRhIGJhc2UiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBpbnNlcnQgYXQgdGhlIGZyb250IG1ha2luZyB0aGluZ3MgaW4gZGVjZW5kaW5nIG9yZGVyICovCi0gICAgICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKm5ld19tYXAgPSBaQUxMT0MgKHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyk7Ci0gICAgICBuZXdfbWFwLT5uZXh0ID0gZGItPm1hcHBpbmdzOwotICAgICAgbmV3X21hcC0+aWhhbmRsZSA9IGludGVybmFsOwotICAgICAgZGItPm5yX21hcHBpbmdzICs9IDE7Ci0gICAgICBuZXdfbWFwLT5leHRlcm5hbCA9IGRiLT5ucl9tYXBwaW5nczsKLSAgICAgIGRiLT5tYXBwaW5ncyA9IG5ld19tYXA7Ci0gICAgfQotfQotCi0KLXZvaWQKLWh3X2hhbmRsZV9hZGRfcGhhbmRsZSAoc3RydWN0IGh3ICpodywKLQkJICAgICAgIHN0cnVjdCBodyAqaW50ZXJuYWwpCi17Ci0gIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqZGIgPSBody0+aGFuZGxlc19vZl9odzsKLSAgaWYgKGh3X2hhbmRsZV8ycGhhbmRsZSAoaHcsIGludGVybmFsKSAhPSAwKSAKLSAgICB7Ci0gICAgICBod19hYm9ydCAoaHcsICJhdHRlbXB0aW5nIHRvIGFkZCBhIHBoYW5kbGUgYWxyZWFkeSBpbiB0aGUgZGF0YSBiYXNlIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogaW5zZXJ0IGF0IHRoZSBmcm9udCBtYWtpbmcgdGhpbmdzIGluIGRlY2VuZGluZyBvcmRlciAqLwotICAgICAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpuZXdfbWFwID0gWkFMTE9DIChzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcpOwotICAgICAgbmV3X21hcC0+bmV4dCA9IGRiLT5tYXBwaW5nczsKLSAgICAgIG5ld19tYXAtPnBoYW5kbGUgPSBpbnRlcm5hbDsKLSAgICAgIGRiLT5ucl9tYXBwaW5ncyArPSAxOwotICAgICAgbmV3X21hcC0+ZXh0ZXJuYWwgPSBkYi0+bnJfbWFwcGluZ3M7Ci0gICAgICBkYi0+bWFwcGluZ3MgPSBuZXdfbWFwOwotICAgIH0KLX0KLQotCi12b2lkCi1od19oYW5kbGVfcmVtb3ZlX2loYW5kbGUgKHN0cnVjdCBodyAqaHcsCi0JCQkgIHN0cnVjdCBod19pbnN0YW5jZSAqaW50ZXJuYWwpCi17Ci0gIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqZGIgPSBody0+aGFuZGxlc19vZl9odzsKLSAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICoqY3VycmVudF9tYXAgPSAmZGItPm1hcHBpbmdzOwotICB3aGlsZSAoKmN1cnJlbnRfbWFwICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCgqY3VycmVudF9tYXApLT5paGFuZGxlID09IGludGVybmFsKQotCXsKLQkgIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqZGVsZXRlID0gKmN1cnJlbnRfbWFwOwotCSAgKmN1cnJlbnRfbWFwID0gZGVsZXRlLT5uZXh0OwotCSAgemZyZWUgKGRlbGV0ZSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgY3VycmVudF9tYXAgPSAmKCpjdXJyZW50X21hcCktPm5leHQ7Ci0gICAgfQotICBod19hYm9ydCAoaHcsICJhdHRlbXB0IHRvIHJlbW92ZSBub25leGlzdGFudCBpaGFuZGxlIik7Ci19Ci0KLQotdm9pZAotaHdfaGFuZGxlX3JlbW92ZV9waGFuZGxlIChzdHJ1Y3QgaHcgKmh3LAotCQkJICBzdHJ1Y3QgaHcgKmludGVybmFsKQotewotICBzdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgKmRiID0gaHctPmhhbmRsZXNfb2ZfaHc7Ci0gIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqKmN1cnJlbnRfbWFwID0gJmRiLT5tYXBwaW5nczsKLSAgd2hpbGUgKCpjdXJyZW50X21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoKmN1cnJlbnRfbWFwKS0+cGhhbmRsZSA9PSBpbnRlcm5hbCkKLQl7Ci0JICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmRlbGV0ZSA9ICpjdXJyZW50X21hcDsKLQkgICpjdXJyZW50X21hcCA9IGRlbGV0ZS0+bmV4dDsKLQkgIHpmcmVlIChkZWxldGUpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGN1cnJlbnRfbWFwID0gJigqY3VycmVudF9tYXApLT5uZXh0OwotICAgIH0KLSAgaHdfYWJvcnQgKGh3LCAiYXR0ZW1wdCB0byByZW1vdmUgbm9uZXhpc3RhbnQgcGhhbmRsZSIpOwotfQotCi0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctaGFuZGxlcy5oIGIvc2ltL2NvbW1vbi9ody1oYW5kbGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2M5ZDAyLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vaHctaGFuZGxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwxOTk3LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgSFdfSEFORExFU19ICi0jZGVmaW5lIEhXX0hBTkRMRVNfSAotCi0KLS8qIEV4cG9ydCBhIGNhcGFiaWxpdHkgKGhhbmRsZSkgZGF0YSBiYXNlIHRoYXQgbWFwcyBiZXR3ZWVuIGludGVybmFsCi0gICBkYXRhIHZhbHVlcyBhbmQgdGhvc2UgZ2l2ZW4gdG8gYSBzaW11bGF0aW9uLiAqLwotCi0KLWNlbGxfd29yZCBod19oYW5kbGVfMmloYW5kbGUKLShzdHJ1Y3QgaHcgKmRiLAotIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpOwotCi1zdHJ1Y3QgaHdfaW5zdGFuY2UgKmh3X2hhbmRsZV9paGFuZGxlMgotKHN0cnVjdCBodyAqZGIsCi0gY2VsbF93b3JkIGV4dGVybmFsKTsKLQotdm9pZCBod19oYW5kbGVfYWRkX2loYW5kbGUKLShzdHJ1Y3QgaHcgKmRiLAotIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpOwotCi12b2lkIGh3X2hhbmRsZV9yZW1vdmVfaWhhbmRsZQotKHN0cnVjdCBodyAqZGIsCi0gc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSk7Ci0KLQotY2VsbF93b3JkIGh3X2hhbmRsZV8ycGhhbmRsZQotKHN0cnVjdCBodyAqZGIsCi0gc3RydWN0IGh3ICpodyk7Ci0KLXN0cnVjdCBodyAqaHdfaGFuZGxlX3BoYW5kbGUyCi0oc3RydWN0IGh3ICpkYiwKLSBjZWxsX3dvcmQgZXh0ZXJuYWwpOwotCi12b2lkIGh3X2hhbmRsZV9hZGRfcGhhbmRsZQotKHN0cnVjdCBodyAqZGIsCi0gc3RydWN0IGh3ICpodyk7Ci0KLXZvaWQgaHdfaGFuZGxlX3JlbW92ZV9waGFuZGxlCi0oc3RydWN0IGh3ICpkYiwKLSBzdHJ1Y3QgaHcgKmh3KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWluc3RhbmNlcy5jIGIvc2ltL2NvbW1vbi9ody1pbnN0YW5jZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjMWNkOS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LWluc3RhbmNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJody1tYWluLmgiCi0jaW5jbHVkZSAiaHctYmFzZS5oIgotCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi1zdHJ1Y3QgaHdfaW5zdGFuY2VfZGF0YSB7Ci0gIGh3X2ZpbmlzaF9pbnN0YW5jZV9tZXRob2QgKnRvX2ZpbmlzaDsKLSAgc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZXM7Ci19OwotCi1zdGF0aWMgaHdfZmluaXNoX2luc3RhbmNlX21ldGhvZCBhYm9ydF9od19maW5pc2hfaW5zdGFuY2U7Ci0KLXZvaWQKLWNyZWF0ZV9od19pbnN0YW5jZV9kYXRhIChzdHJ1Y3QgaHcgKm1lKQotewotICBtZS0+aW5zdGFuY2VzX29mX2h3ID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X2luc3RhbmNlX2RhdGEpOwotICBzZXRfaHdfZmluaXNoX2luc3RhbmNlIChtZSwgYWJvcnRfaHdfZmluaXNoX2luc3RhbmNlKTsKLX0KLQotdm9pZAotZGVsZXRlX2h3X2luc3RhbmNlX2RhdGEgKHN0cnVjdCBodyAqbWUpCi17Ci0gIC8qIE5PUCAqLwotfQotCi0KLXN0YXRpYyB2b2lkCi1hYm9ydF9od19maW5pc2hfaW5zdGFuY2UgKHN0cnVjdCBodyAqaHcsCi0JCQkgIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpCi17Ci0gIGh3X2Fib3J0IChodywgIm5vIGluc3RhbmNlIGZpbmlzaCBtZXRob2QiKTsKLX0KLQotdm9pZAotc2V0X2h3X2ZpbmlzaF9pbnN0YW5jZSAoc3RydWN0IGh3ICptZSwKLQkJCWh3X2ZpbmlzaF9pbnN0YW5jZV9tZXRob2QgKmZpbmlzaCkKLXsKLSAgbWUtPmluc3RhbmNlc19vZl9ody0+dG9fZmluaXNoID0gZmluaXNoOwotfQotCi0KLSNpZiAwCi12b2lkCi1jbGVhbl9od19pbnN0YW5jZXMgKHN0cnVjdCBodyAqbWUpCi17Ci0gIHN0cnVjdCBod19pbnN0YW5jZSAqKmluc3RhbmNlID0gJm1lLT5pbnN0YW5jZXM7Ci0gIHdoaWxlICgqaW5zdGFuY2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKm9sZF9pbnN0YW5jZSA9ICppbnN0YW5jZTsKLSAgICAgIGh3X2luc3RhbmNlX2RlbGV0ZSAob2xkX2luc3RhbmNlKTsKLSAgICAgIGluc3RhbmNlID0gJm1lLT5pbnN0YW5jZXM7Ci0gICAgfQotfQotI2VuZGlmCi0KLQotdm9pZAotaHdfaW5zdGFuY2VfZGVsZXRlIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlKQotewotI2lmIDEKLSAgaHdfYWJvcnQgKGh3X2luc3RhbmNlX2h3IChpbnN0YW5jZSksICJub3QgaW1wbGVtZW50ZWQiKTsKLSNlbHNlCi0gIHN0cnVjdCBodyAqbWUgPSBod19pbnN0YW5jZV9odyAoaW5zdGFuY2UpOwotICBpZiAoaW5zdGFuY2UtPnRvX2luc3RhbmNlX2RlbGV0ZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgIm5vIGRlbGV0ZSBtZXRob2QiKTsKLSAgaW5zdGFuY2UtPm1ldGhvZC0+ZGVsZXRlKGluc3RhbmNlKTsKLSAgaWYgKGluc3RhbmNlLT5hcmdzICE9IE5VTEwpCi0gICAgemZyZWUgKGluc3RhbmNlLT5hcmdzKTsKLSAgaWYgKGluc3RhbmNlLT5wYXRoICE9IE5VTEwpCi0gICAgemZyZWUgKGluc3RhbmNlLT5wYXRoKTsKLSAgaWYgKGluc3RhbmNlLT5jaGlsZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIG9ubHkgcmVtb3ZlIGxlYWYgbm9kZXMgKi8KLSAgICAgIHN0cnVjdCBod19pbnN0YW5jZSAqKmN1cnIgPSAmbWUtPmluc3RhbmNlczsKLSAgICAgIHdoaWxlICgqY3VyciAhPSBpbnN0YW5jZSkKLQl7Ci0JICBBU1NFUlQgKCpjdXJyICE9IE5VTEwpOwotCSAgY3VyciA9ICYoKmN1cnIpLT5uZXh0OwotCX0KLSAgICAgICpjdXJyID0gaW5zdGFuY2UtPm5leHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogY2hlY2sgaXQgaXNuJ3QgaW4gdGhlIGluc3RhbmNlIGxpc3QgKi8KLSAgICAgIHN0cnVjdCBod19pbnN0YW5jZSAqY3VyciA9IG1lLT5pbnN0YW5jZXM7Ci0gICAgICB3aGlsZSAoY3VyciAhPSBOVUxMKQotCXsKLQkgIEFTU0VSVChjdXJyICE9IGluc3RhbmNlKTsKLQkgIGN1cnIgPSBjdXJyLT5uZXh0OwotCX0KLSAgICAgIC8qIHVubGluayB0aGUgY2hpbGQgKi8KLSAgICAgIEFTU0VSVCAoaW5zdGFuY2UtPmNoaWxkLT5wYXJlbnQgPT0gaW5zdGFuY2UpOwotICAgICAgaW5zdGFuY2UtPmNoaWxkLT5wYXJlbnQgPSBOVUxMOwotICAgIH0KLSAgY2FwX3JlbW92ZSAobWUtPmloYW5kbGVzLCBpbnN0YW5jZSk7Ci0gIHpmcmVlIChpbnN0YW5jZSk7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgaW50Ci1wYW5pY19od19pbnN0YW5jZV9yZWFkIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJdm9pZCAqYWRkciwKLQkJCXVuc2lnbmVkX3dvcmQgbGVuKQotewotICBod19hYm9ydCAoaHdfaW5zdGFuY2VfaHcgKGluc3RhbmNlKSwgIm5vIHJlYWQgbWV0aG9kIik7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLXBhbmljX2h3X2luc3RhbmNlX3dyaXRlIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJIGNvbnN0IHZvaWQgKmFkZHIsCi0JCQkgdW5zaWduZWRfd29yZCBsZW4pCi17Ci0gIGh3X2Fib3J0IChod19pbnN0YW5jZV9odyAoaW5zdGFuY2UpLCAibm8gd3JpdGUgbWV0aG9kIik7Ci0gIHJldHVybiAtMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1wYW5pY19od19pbnN0YW5jZV9zZWVrIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJdW5zaWduZWRfd29yZCBwb3NfaGksCi0JCQl1bnNpZ25lZF93b3JkIHBvc19sbykKLXsKLSAgaHdfYWJvcnQgKGh3X2luc3RhbmNlX2h3IChpbnN0YW5jZSksICJubyBzZWVrIG1ldGhvZCIpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotaW50Ci1od19pbnN0YW5jZV9jYWxsX21ldGhvZCAoc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSwKLQkJCSBjb25zdCBjaGFyICptZXRob2RfbmFtZSwKLQkJCSBpbnQgbl9zdGFja19hcmdzLAotCQkJIHVuc2lnbmVkX2NlbGwgc3RhY2tfYXJnc1svKm5fc3RhY2tfYXJncyovXSwJCi0JCQkgaW50IG5fc3RhY2tfcmV0dXJucywKLQkJCSB1bnNpZ25lZF9jZWxsIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX2FyZ3MqL10pCi17Ci0jaWYgMQotICBod19hYm9ydCAoaHdfaW5zdGFuY2VfaHcgKGluc3RhbmNlKSwgIm5vdCBpbXBsZW1lbnRlZCIpOwotICByZXR1cm4gLTE7Ci0jZWxzZQotICBzdHJ1Y3QgaHcgKm1lID0gaW5zdGFuY2UtPm93bmVyOwotICBjb25zdCBod19pbnN0YW5jZV9tZXRob2RzICptZXRob2QgPSBpbnN0YW5jZS0+bWV0aG9kLT5tZXRob2RzOwotICBpZiAobWV0aG9kID09IE5VTEwpCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAibm8gbWV0aG9kcyAod2FudCAlcykiLCBtZXRob2RfbmFtZSk7Ci0gICAgfQotICB3aGlsZSAobWV0aG9kLT5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcChtZXRob2QtPm5hbWUsIG1ldGhvZF9uYW1lKSA9PSAwKQotCXsKLQkgIHJldHVybiBtZXRob2QtPm1ldGhvZCAoaW5zdGFuY2UsCi0JCQkJIG5fc3RhY2tfYXJncywgc3RhY2tfYXJncywKLQkJCQkgbl9zdGFja19yZXR1cm5zLCBzdGFja19yZXR1cm5zKTsKLQl9Ci0gICAgICBtZXRob2QrKzsKLSAgICB9Ci0gIGh3X2Fib3J0IChtZSwgIm5vICVzIG1ldGhvZCIsIG1ldGhvZF9uYW1lKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotCi0jZGVmaW5lIHNldF9od19pbnN0YW5jZV9yZWFkKGluc3RhbmNlLCBtZXRob2QpXAotKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3JlYWQgPSAobWV0aG9kKSkKLQotI2RlZmluZSBzZXRfaHdfaW5zdGFuY2Vfd3JpdGUoaW5zdGFuY2UsIG1ldGhvZClcCi0oKGluc3RhbmNlKS0+dG9faW5zdGFuY2Vfd3JpdGUgPSAobWV0aG9kKSkKLQotI2RlZmluZSBzZXRfaHdfaW5zdGFuY2Vfc2VlayhpbnN0YW5jZSwgbWV0aG9kKVwKLSgoaW5zdGFuY2UpLT50b19pbnN0YW5jZV9zZWVrID0gKG1ldGhvZCkpCi0KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1zZXRfaHdfaW5zdGFuY2VfZmluaXNoIChzdHJ1Y3QgaHcgKm1lLAotCQkJaHdfaW5zdGFuY2VfZmluaXNoX21ldGhvZCAqbWV0aG9kKQotewotICBpZiAobWUtPmluc3RhbmNlc19vZl9odyA9PSBOVUxMKQotICAgIG1lLT5pbnN0YW5jZXNfb2ZfaHcgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfaW5zdGFuY2VfZGF0YSk7Ci0gIG1lLT5pbnN0YW5jZXNfb2ZfaHctPnRvX2ZpbmlzaCA9IG1ldGhvZDsKLX0KLSNlbmRpZgotCi0KLXN0cnVjdCBod19pbnN0YW5jZSAqCi1od19pbnN0YW5jZV9jcmVhdGUgKHN0cnVjdCBodyAqbWUsCi0JCSAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKnBhcmVudCwKLQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsCi0JCSAgICBjb25zdCBjaGFyICphcmdzKQotewotICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlID0gWkFMTE9DIChzdHJ1Y3QgaHdfaW5zdGFuY2UpOwotICAvKmluc3RhbmNlLT51bml0Ki8KLSAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGRldmljZXMgbGlzdCAqLwotICBpbnN0YW5jZS0+aHdfb2ZfaW5zdGFuY2UgPSBtZTsKLSAgaW5zdGFuY2UtPnBhcmVudF9vZl9pbnN0YW5jZSA9IE5VTEw7Ci0gIC8qIGxpbmsgdGhpcyBpbnN0YW5jZSBpbnRvIHRoZSBmcm9udCBvZiB0aGUgZGV2aWNlcyBpbnN0YW5jZSBsaXN0ICovCi0gIGluc3RhbmNlLT5zaWJsaW5nX29mX2luc3RhbmNlID0gbWUtPmluc3RhbmNlc19vZl9ody0+aW5zdGFuY2VzOwotICBtZS0+aW5zdGFuY2VzX29mX2h3LT5pbnN0YW5jZXMgPSBpbnN0YW5jZTsKLSAgaWYgKHBhcmVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIEFTU0VSVCAocGFyZW50LT5jaGlsZF9vZl9pbnN0YW5jZSA9PSBOVUxMKTsKLSAgICAgIHBhcmVudC0+Y2hpbGRfb2ZfaW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgIGluc3RhbmNlLT5wYXJlbnRfb2ZfaW5zdGFuY2UgPSBwYXJlbnQ7Ci0gICAgfQotICBpbnN0YW5jZS0+YXJnc19vZl9pbnN0YW5jZSA9IGh3X3N0cmR1cCAobWUsIGFyZ3MpOwotICBpbnN0YW5jZS0+cGF0aF9vZl9pbnN0YW5jZSA9IGh3X3N0cmR1cCAobWUsIHBhdGgpOwotICBzZXRfaHdfaW5zdGFuY2VfcmVhZCAoaW5zdGFuY2UsIHBhbmljX2h3X2luc3RhbmNlX3JlYWQpOwotICBzZXRfaHdfaW5zdGFuY2Vfd3JpdGUgKGluc3RhbmNlLCBwYW5pY19od19pbnN0YW5jZV93cml0ZSk7Ci0gIHNldF9od19pbnN0YW5jZV9zZWVrIChpbnN0YW5jZSwgcGFuaWNfaHdfaW5zdGFuY2Vfc2Vlayk7Ci0gIGh3X2hhbmRsZV9hZGRfaWhhbmRsZSAobWUsIGluc3RhbmNlKTsKLSAgbWUtPmluc3RhbmNlc19vZl9ody0+dG9fZmluaXNoIChtZSwgaW5zdGFuY2UpOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLQotc3RydWN0IGh3X2luc3RhbmNlICoKLWh3X2luc3RhbmNlX2ludGVyY2VlZCAoc3RydWN0IGh3X2luc3RhbmNlICpwYXJlbnQsCi0JCSAgICAgICBjb25zdCBjaGFyICpwYXRoLAotCQkgICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSNpZiAxCi0gIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSA9IFpBTExPQyAoc3RydWN0IGh3X2luc3RhbmNlKTsKLSAgLyppbnN0YW5jZS0+dW5pdCovCi0gIC8qIGxpbmsgdGhpcyBpbnN0YW5jZSBpbnRvIHRoZSBkZXZpY2VzIGxpc3QgKi8KLSAgaWYgKG1lICE9IE5VTEwpCi0gICAgewotICAgICAgQVNTRVJUIChwYXJlbnQgPT0gTlVMTCk7Ci0gICAgICBpbnN0YW5jZS0+aHdfb2ZfaW5zdGFuY2UgPSBtZTsKLSAgICAgIGluc3RhbmNlLT5wYXJlbnRfb2ZfaW5zdGFuY2UgPSBOVUxMOwotICAgICAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGZyb250IG9mIHRoZSBkZXZpY2VzIGluc3RhbmNlIGxpc3QgKi8KLSAgICAgIGluc3RhbmNlLT5zaWJsaW5nX29mX2luc3RhbmNlID0gbWUtPmluc3RhbmNlc19vZl9ody0+aW5zdGFuY2VzOwotICAgICAgbWUtPmluc3RhbmNlc19vZl9ody0+aW5zdGFuY2VzID0gaW5zdGFuY2U7Ci0gICAgfQotICBpZiAocGFyZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGh3X2luc3RhbmNlICoqcHJldmlvdXM7Ci0gICAgICBBU1NFUlQgKHBhcmVudC0+Y2hpbGRfb2ZfaW5zdGFuY2UgPT0gTlVMTCk7Ci0gICAgICBwYXJlbnQtPmNoaWxkX29mX2luc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICBpbnN0YW5jZS0+b3duZXIgPSBwYXJlbnQtPm93bmVyOwotICAgICAgaW5zdGFuY2UtPnBhcmVudF9vZl9pbnN0YW5jZSA9IHBhcmVudDsKLSAgICAgIC8qIGluIHRoZSBkZXZpY2VzIGluc3RhbmNlIGxpc3QgcmVwbGFjZSB0aGUgcGFyZW50IGluc3RhbmNlIHdpdGgKLQkgdGhpcyBvbmUgKi8KLSAgICAgIGluc3RhbmNlLT5uZXh0ID0gcGFyZW50LT5uZXh0OwotICAgICAgLyogcmVwbGFjZSBwYXJlbnQgd2l0aCB0aGlzIG5ldyBub2RlICovCi0gICAgICBwcmV2aW91cyA9ICZpbnN0YW5jZS0+b3duZXItPmluc3RhbmNlczsKLSAgICAgIHdoaWxlICgqcHJldmlvdXMgIT0gcGFyZW50KQotCXsKLQkgIEFTU0VSVCAoKnByZXZpb3VzICE9IE5VTEwpOwotCSAgcHJldmlvdXMgPSAmKCpwcmV2aW91cyktPm5leHQ7Ci0JfQotICAgICAgKnByZXZpb3VzID0gaW5zdGFuY2U7Ci0gICAgfQotICBpbnN0YW5jZS0+ZGF0YSA9IGRhdGE7Ci0gIGluc3RhbmNlLT5hcmdzID0gKGFyZ3MgPT0gTlVMTCA/IE5VTEwgOiAoY2hhciAqKSBzdHJkdXAoYXJncykpOwotICBpbnN0YW5jZS0+cGF0aCA9IChwYXRoID09IE5VTEwgPyBOVUxMIDogKGNoYXIgKikgc3RyZHVwKHBhdGgpKTsKLSAgY2FwX2FkZCAoaW5zdGFuY2UtPm93bmVyLT5paGFuZGxlcywgaW5zdGFuY2UpOwotICByZXR1cm4gaW5zdGFuY2U7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctaW5zdGFuY2VzLmggYi9zaW0vY29tbW9uL2h3LWluc3RhbmNlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI3YjExLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vaHctaW5zdGFuY2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBIV19JTlNUQU5DRVNfSAotI2RlZmluZSBIV19JTlNUQU5DRVNfSAotCi0vKiBJbnN0YW5jZXM6Ci0KLSAgIEFzIHdpdGggSUVFRTEyNzUsIGEgZGV2aWNlIGNhbiBiZSBvcGVuZWQsIGNyZWF0aW5nIGFuIGluc3RhbmNlLgotICAgSW5zdGFuY2VzIHByb3ZpZGUgbW9yZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHRvIHRoZSB1bmRlcmx5aW5nCi0gICBoYXJkd2FyZS4gIEZvciBleGFtcGxlLCB0aGUgaW5zdGFuY2UgbWV0aG9kcyBmb3IgYSBkaXNrIG1heSBpbmNsdWRlCi0gICBjb2RlIHRoYXQgaXMgYWJsZSB0byBpbnRlcnByZXQgZmlsZSBzeXN0ZW1zIGZvdW5kIG9uIGRpc2tzLiAgU3VjaAotICAgbWV0aG9kcyB3b3VsZCB0aGVyZSBmb3IgYWxsb3cgdGhlIG1hbmlwdWxhdGlvbiBvZiBmaWxlcyBvbiB0aGUKLSAgIGRpc2tzIGZpbGUgc3lzdGVtLiAgVGhlIG9wZXJhdGlvbnMgd291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCi0gICBiYXNpYyBibG9jayBJL08gbW9kZWwgcHJvdmlkZWQgYnkgdGhlIGRpc2suCi0KLSAgIFRoaXMgbW9kZWwgaW5jbHVkZXMgbWV0aG9kcyB0aGF0IGZhY2lsaWF0ZSB0aGUgY3JlYXRpb24gb2YgZGV2aWNlCi0gICBpbnN0YW5jZSBhbmQgKHNob3VsZCBhIGdpdmVuIGRldmljZSBzdXBwb3J0IGl0KSBzdGFuZGFyZCBvcGVyYXRpb25zCi0gICBvbiB0aG9zZSBpbnN0YW5jZXMuCi0KLSAgICovCi0KLQotc3RydWN0IGh3X2luc3RhbmNlOwotCi0KLXR5cGVkZWYgdm9pZCAoaHdfZmluaXNoX2luc3RhbmNlX21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqaHcsCi0gICAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKik7Ci0KLWV4dGVybiB2b2lkIHNldF9od19maW5pc2hfaW5zdGFuY2UKLShzdHJ1Y3QgaHcgKmh3LAotIGh3X2ZpbmlzaF9pbnN0YW5jZV9tZXRob2QgKm1ldGhvZCk7Ci0KLQotLyogY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSBoYXJkd2FyZSAqLwotCi1zdHJ1Y3QgaHdfaW5zdGFuY2UgKmh3X2luc3RhbmNlX2NyZWF0ZQotKHN0cnVjdCBodyAqaHcsCi0gc3RydWN0IGh3X2luc3RhbmNlICpwYXJlbnQsCi0gY29uc3QgY2hhciAqcGF0aCwKLSBjb25zdCBjaGFyICphcmdzKTsKLQotc3RydWN0IGh3X2luc3RhbmNlICpod19pbnN0YW5jZV9pbnRlcmNlZWQKLShzdHJ1Y3QgaHdfaW5zdGFuY2UgKnBhcmVudCwKLSBjb25zdCBjaGFyICpwYXRoLAotIGNvbnN0IGNoYXIgKmFyZ3MpOwotCi12b2lkIGh3X2luc3RhbmNlX2RlbGV0ZQotKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpOwotCi0KLS8qIG1ldGhvZHMgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiB0aGUgaHcgKi8KLQotdHlwZWRlZiBpbnQgKGh3X2luc3RhbmNlX3JlYWRfbWV0aG9kKQotICAgICAoc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSwKLSAgICAgIHZvaWQgKmFkZHIsCi0gICAgICB1bnNpZ25lZF9jZWxsIGxlbik7Ci0KLSNkZWZpbmUgaHdfaW5zdGFuY2VfcmVhZChpbnN0YW5jZSwgYWRkciwgbGVuKSBcCi0oKGluc3RhbmNlKS0+dG9faW5zdGFuY2VfcmVhZCAoKGluc3RhbmNlKSwgKGFkZHIpLCAobGVuKSkpCi0KLSNkZWZpbmUgc2V0X2h3X2luc3RhbmNlX3JlYWQoaW5zdGFuY2UsIG1ldGhvZCkgXAotKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3JlYWQgPSAobWV0aG9kKSkKLQotCi10eXBlZGVmIGludCAoaHdfaW5zdGFuY2Vfd3JpdGVfbWV0aG9kKQotICAgICAoc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSwKLSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCi0gICAgICB1bnNpZ25lZF9jZWxsIGxlbik7Ci0KLSNkZWZpbmUgaHdfaW5zdGFuY2Vfd3JpdGUoaW5zdGFuY2UsIGFkZHIsIGxlbikgXAotKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3dyaXRlICgoaW5zdGFuY2UpLCAoYWRkciksIChsZW4pKSkKLQotI2RlZmluZSBzZXRfaHdfaW5zdGFuY2Vfd3JpdGUoaW5zdGFuY2UsIG1ldGhvZCkgXAotKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3dyaXRlID0gKG1ldGhvZCkpCi0KLQotdHlwZWRlZiBpbnQgKGh3X2luc3RhbmNlX3NlZWtfbWV0aG9kKQotICAgICAoc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSwKLSAgICAgIHVuc2lnbmVkX2NlbGwgcG9zX2hpLAotICAgICAgdW5zaWduZWRfY2VsbCBwb3NfbG8pOwotCi0jZGVmaW5lIGh3X2luc3RhbmNlX3NlZWsoaW5zdGFuY2UsIHBvc19oaSwgcG9zX2xvKSBcCi0oKGluc3RhbmNlKS0+dG9faW5zdGFuY2Vfc2VlayAoKGluc3RhbmNlKSwgKHBvc19oaSksIChwb3NfbG8pKSk7Ci0KLSNkZWZpbmUgc2V0X2h3X2luc3RhbmNlX3NlZWsoaW5zdGFuY2UsIG1ldGhvZCkgXAotKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3NlZWsgPSAobWV0aG9kKSkKLQotCi1pbnQgaHdfaW5zdGFuY2VfY2FsbF9tZXRob2QKLShzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlLAotIGNvbnN0IGNoYXIgKm1ldGhvZCwKLSBpbnQgbl9zdGFja19hcmdzLAotIHVuc2lnbmVkX2NlbGwgc3RhY2tfYXJnc1svKm5fc3RhY2tfYXJncyArIDEoTlVMTCkqL10sCi0gaW50IG5fc3RhY2tfcmV0dXJucywKLSB1bnNpZ25lZF9jZWxsIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMgKyAxKE5VTEwpKi9dKTsKLQotCi0KLS8qIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBpbnN0YW5jZSAqLwotCi0jZGVmaW5lIGh3X2luc3RhbmNlX2h3KGluc3RhbmNlKSAoKGluc3RhbmNlKS0+aHdfb2ZfaW5zdGFuY2UgKyAwKQotCi0jZGVmaW5lIGh3X2luc3RhbmNlX3BhdGgoaW5zdGFuY2UpICgoaW5zdGFuY2UpLT5wYXRoX29mX2luc3RhbmNlICsgMCkKLQotI2RlZmluZSBod19pbnN0YW5jZV9hcmdzKGluc3RhbmNlKSAoKGluc3RhbmNlKS0+YXJnc19vZl9pbnN0YW5jZSkKLQotI2RlZmluZSBod19pbnN0YW5jZV9kYXRhKGluc3RhbmNlKSAoKGluc3RhbmNlKS0+ZGF0YV9vZl9pbnN0YW5jZSkKLQotI2RlZmluZSBod19pbnN0YW5jZV9zeXN0ZW0oaW5zdGFuY2UpIChod19zeXN0ZW0gKGh3X2luc3RhbmNlX2h3IChpbnN0YW5jZSkpKQotCi0KLQotLyogRmluYWxseSBhbiBpbnN0YW5jZSBvZiBhIGhhcmR3YXJlIGRldmljZSAtIGtlZXAgeW91ciBncnViYnkgbGl0dGxlCi0gICBtaXRzIG9mZiBvZiB0aGVzZSBpbnRlcm5hbHMhIDotKSAqLwotCi1zdHJ1Y3QgaHdfaW5zdGFuY2UgewotCi0gIHZvaWQgKmRhdGFfb2ZfaW5zdGFuY2U7Ci0gIGNoYXIgKmFyZ3Nfb2ZfaW5zdGFuY2U7Ci0gIGNoYXIgKnBhdGhfb2ZfaW5zdGFuY2U7Ci0KLSAgLyogdGhlIGRldmljZSB0aGF0IG93bnMgdGhlIGluc3RhbmNlICovCi0gIHN0cnVjdCBodyAqaHdfb2ZfaW5zdGFuY2U7Ci0gIHN0cnVjdCBod19pbnN0YW5jZSAqc2libGluZ19vZl9pbnN0YW5jZTsKLQotICAvKiBpbnRlcnBvc2VkIGluc3RhbmNlICovCi0gIHN0cnVjdCBod19pbnN0YW5jZSAqcGFyZW50X29mX2luc3RhbmNlOwotICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmNoaWxkX29mX2luc3RhbmNlOwotCi0gIC8qIG1ldGhvZHMgKi8KLSAgaHdfaW5zdGFuY2VfcmVhZF9tZXRob2QgKnRvX2luc3RhbmNlX3JlYWQ7Ci0gIGh3X2luc3RhbmNlX3dyaXRlX21ldGhvZCAqdG9faW5zdGFuY2Vfd3JpdGU7Ci0gIGh3X2luc3RhbmNlX3NlZWtfbWV0aG9kICp0b19pbnN0YW5jZV9zZWVrOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctbWFpbi5oIGIvc2ltL2NvbW1vbi9ody1tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDg2YzEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBDb21tb24gaGFyZHdhcmUgaGVhZGVyIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBBbmRyZXcgQ2FnbmV5IGFuZCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZm5kZWYgSFdfTUFJTgotI2RlZmluZSBIV19NQUlOCi0KLS8qIGVzdGFibGlzaCBhIHR5cGUgc3lzdGVtICovCi0jaW5jbHVkZSAic2ltLWJhc2ljcy5oIgotCi0vKiBjb25zdHJ1Y3QgYSBodyBkZXZpY2UgKi8KLSNpbmNsdWRlICJody1kZXZpY2UuaCIKLSNpbmNsdWRlICJody1wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiaHctZXZlbnRzLmgiCi0jaW5jbHVkZSAiaHctYWxsb2MuaCIKLSNpbmNsdWRlICJody1pbnN0YW5jZXMuaCIKLSNpbmNsdWRlICJody1oYW5kbGVzLmgiCi0jaW5jbHVkZSAiaHctcG9ydHMuaCIKLQotLyogRGVzY3JpcHRpb24gb2YgYSBoYXJkd2FyZSBkZXZpY2UgKi8KLQotdHlwZWRlZiB2b2lkIChod19maW5pc2hfbWV0aG9kKQotICAgICAoc3RydWN0IGh3ICptZSk7Ci0KLXN0cnVjdCBod19kZXNjcmlwdG9yIHsKLSAgY29uc3QgY2hhciAqZmFtaWx5OwotICBod19maW5pc2hfbWV0aG9kICp0b19maW5pc2g7Ci19OwotCi0vKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgZGV2aWNlIGVhc2llciAqLwotCi0vKiBHbyB0aHJvdWdoIHRoZSBkZXZpY2VzIHJlZyBwcm9wZXJ0aWVzIGFuZCBsb29rIGZvciB0aG9zZSBzcGVjaWZ5aW5nCi0gICBhbiBhZGRyZXNzIHRvIGF0dGFjaCB2YXJpb3VzIHJlZ2lzdGVycyB0byAqLwotCi12b2lkIGRvX2h3X2F0dGFjaF9yZWdzIChzdHJ1Y3QgaHcgKm1lKTsKLQotLyogUGVyZm9ybSBhIHBvbGxpbmcgcmVhZCBvbiBGRCByZXR1cm5pbmcgZWl0aGVyIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgIG9yIGEgaHdfaW8gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgdGhlIHJlYWQKLSAgIGZhaWx1cmUgKi8KLQotZW51bSB7Ci0gIEhXX0lPX0VPRiA9IC0xLCBIV19JT19OT1RfUkVBRFkgPSAtMiwgLyogU2VlOiBJRUVFIDEyNzUgKi8KLX07Ci0KLXR5cGVkZWYgaW50IChkb19od19wb2xsX3JlYWRfbWV0aG9kKQotICAgICAoU0lNX0RFU0Mgc2QsIGludCwgY2hhciAqLCBpbnQpOwotCi1pbnQgZG9faHdfcG9sbF9yZWFkCi0oc3RydWN0IGh3ICptZSwKLSBkb19od19wb2xsX3JlYWRfbWV0aG9kICpyZWFkLAotIGludCBzaW1faW9fZmQsCi0gdm9pZCAqYnVmLAotIHVuc2lnbmVkIHNpemVfb2ZfYnVmKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcG9ydHMuYyBiL3NpbS9jb21tb24vaHctcG9ydHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkYzk4NS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LXBvcnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyogSGFyZHdhcmUgcG9ydHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBBbmRyZXcgQ2FnbmV5IGFuZCBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJody1iYXNlLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2RlZmluZSBUUkFDRSh4LHkpCi0KLQotc3RydWN0IGh3X3BvcnRfZWRnZSB7Ci0gIGludCBteV9wb3J0OwotICBzdHJ1Y3QgaHcgKmRlc3Q7Ci0gIGludCBkZXN0X3BvcnQ7Ci0gIHN0cnVjdCBod19wb3J0X2VkZ2UgKm5leHQ7Ci0gIG9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbjsKLX07Ci0KLXN0cnVjdCBod19wb3J0X2RhdGEgewotICBod19wb3J0X2V2ZW50X21ldGhvZCAqdG9fcG9ydF9ldmVudDsKLSAgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciAqcG9ydHM7Ci0gIHN0cnVjdCBod19wb3J0X2VkZ2UgKmVkZ2VzOwotfTsKLQotY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBlbXB0eV9od19wb3J0c1tdID0gewotICB7IE5VTEwsIH0sCi19OwotCi1zdGF0aWMgdm9pZAotcGFuaWNfaHdfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICAgICBpbnQgbXlfcG9ydCwKLQkJICAgICBzdHJ1Y3QgaHcgKnNvdXJjZSwKLQkJICAgICBpbnQgc291cmNlX3BvcnQsCi0JCSAgICAgaW50IGxldmVsKQotewotICBod19hYm9ydCAobWUsICJubyBwb3J0IG1ldGhvZCIpOwotfQotCi12b2lkCi1jcmVhdGVfaHdfcG9ydF9kYXRhIChzdHJ1Y3QgaHcgKm1lKQotewotICBtZS0+cG9ydHNfb2ZfaHcgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfcG9ydF9kYXRhKTsKLSAgc2V0X2h3X3BvcnRfZXZlbnQgKG1lLCBwYW5pY19od19wb3J0X2V2ZW50KTsKLSAgc2V0X2h3X3BvcnRzIChtZSwgZW1wdHlfaHdfcG9ydHMpOwotfQotCi12b2lkCi1kZWxldGVfaHdfcG9ydF9kYXRhIChzdHJ1Y3QgaHcgKm1lKQotewotICBod19mcmVlIChtZSwgbWUtPnBvcnRzX29mX2h3KTsKLSAgbWUtPnBvcnRzX29mX2h3ID0gTlVMTDsKLX0KLQotdm9pZAotc2V0X2h3X3BvcnRzIChzdHJ1Y3QgaHcgKm1lLAotCSAgICAgIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgcG9ydHNbXSkKLXsKLSAgbWUtPnBvcnRzX29mX2h3LT5wb3J0cyA9IHBvcnRzOwotfQotCi12b2lkCi1zZXRfaHdfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICAgaHdfcG9ydF9ldmVudF9tZXRob2QgKnBvcnRfZXZlbnQpCi17Ci0gIG1lLT5wb3J0c19vZl9ody0+dG9fcG9ydF9ldmVudCA9IHBvcnRfZXZlbnQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWF0dGFjaF9od19wb3J0X2VkZ2UgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgc3RydWN0IGh3X3BvcnRfZWRnZSAqKmxpc3QsCi0JCSAgICAgaW50IG15X3BvcnQsCi0JCSAgICAgc3RydWN0IGh3ICpkZXN0LAotCQkgICAgIGludCBkZXN0X3BvcnQsCi0JCSAgICAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKQotewotICBzdHJ1Y3QgaHdfcG9ydF9lZGdlICpuZXdfZWRnZSA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBod19wb3J0X2VkZ2UpOwotICBuZXdfZWRnZS0+bXlfcG9ydCA9IG15X3BvcnQ7Ci0gIG5ld19lZGdlLT5kZXN0ID0gZGVzdDsKLSAgbmV3X2VkZ2UtPmRlc3RfcG9ydCA9IGRlc3RfcG9ydDsKLSAgbmV3X2VkZ2UtPm5leHQgPSAqbGlzdDsKLSAgbmV3X2VkZ2UtPmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb247Ci0gICpsaXN0ID0gbmV3X2VkZ2U7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRldGFjaF9od19wb3J0X2VkZ2UgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgc3RydWN0IGh3X3BvcnRfZWRnZSAqKmxpc3QsCi0JCSAgICAgaW50IG15X3BvcnQsCi0JCSAgICAgc3RydWN0IGh3ICpkZXN0LAotCQkgICAgIGludCBkZXN0X3BvcnQpCi17Ci0gIHdoaWxlICgqbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBod19wb3J0X2VkZ2UgKm9sZF9lZGdlID0gKmxpc3Q7Ci0gICAgICBpZiAob2xkX2VkZ2UtPmRlc3QgPT0gZGVzdAotCSAgJiYgb2xkX2VkZ2UtPmRlc3RfcG9ydCA9PSBkZXN0X3BvcnQKLQkgICYmIG9sZF9lZGdlLT5teV9wb3J0ID09IG15X3BvcnQpCi0JewotCSAgaWYgKG9sZF9lZGdlLT5kaXNwb3NpdGlvbiA9PSBwZXJtZW5hbnRfb2JqZWN0KQotCSAgICBod19hYm9ydCAobWUsICJhdHRlbXB0IHRvIGRlbGV0ZSBwZXJtZW5hbnQgcG9ydCBlZGdlIik7Ci0JICAqbGlzdCA9IG9sZF9lZGdlLT5uZXh0OwotCSAgaHdfZnJlZSAobWUsIG9sZF9lZGdlKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBod19hYm9ydCAobWUsICJhdHRlbXB0IHRvIGRlbGV0ZSB1bmF0dGFjaGVkIHBvcnQiKTsKLX0KLQotCi0jaWYgMAotc3RhdGljIHZvaWQKLWNsZWFuX2h3X3BvcnRfZWRnZXMgKHN0cnVjdCBod19wb3J0X2VkZ2UgKipsaXN0KQotewotICB3aGlsZSAoKmxpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaHdfcG9ydF9lZGdlICpvbGRfZWRnZSA9ICpsaXN0OwotICAgICAgc3dpdGNoIChvbGRfZWRnZS0+ZGlzcG9zaXRpb24pCi0JewotCWNhc2UgcGVybWVuYW50X29iamVjdDoKLQkgIGxpc3QgPSAmb2xkX2VkZ2UtPm5leHQ7Ci0JICBicmVhazsKLQljYXNlIHRlbXBvcmFyeV9vYmplY3Q6Ci0JICAqbGlzdCA9IG9sZF9lZGdlLT5uZXh0OwotCSAgaHdfZnJlZSAobWUsIG9sZF9lZGdlKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotCi0vKiBQb3J0czogKi8KLQotdm9pZAotaHdfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkgICAgICAgaW50IG15X3BvcnQsCi0JICAgICAgIGludCBsZXZlbCkKLXsKLSAgaW50IGZvdW5kX2FuX2VkZ2UgPSAwOwotICBzdHJ1Y3QgaHdfcG9ydF9lZGdlICplZGdlOwotICAvKiBkZXZpY2UncyBsaW5lcyBkaXJlY3RseSBjb25uZWN0ZWQgKi8KLSAgZm9yIChlZGdlID0gbWUtPnBvcnRzX29mX2h3LT5lZGdlczsKLSAgICAgICBlZGdlICE9IE5VTEw7Ci0gICAgICAgZWRnZSA9IGVkZ2UtPm5leHQpCi0gICAgewotICAgICAgaWYgKGVkZ2UtPm15X3BvcnQgPT0gbXlfcG9ydCkKLQl7Ci0JICBlZGdlLT5kZXN0LT5wb3J0c19vZl9ody0+dG9fcG9ydF9ldmVudCAoZWRnZS0+ZGVzdCwKLQkJCQkJCSAgZWRnZS0+ZGVzdF9wb3J0LAotCQkJCQkJICBtZSwKLQkJCQkJCSAgbXlfcG9ydCwKLQkJCQkJCSAgbGV2ZWwpOwotCSAgZm91bmRfYW5fZWRnZSA9IDE7Ci0JfQotICAgIH0KLSAgaWYgKCFmb3VuZF9hbl9lZGdlKQotICAgIGh3X2Fib3J0IChtZSwgIk5vIGVkZ2UgZm9yIHBvcnQgJWQiLCBteV9wb3J0KTsKLX0KLQotCi12b2lkCi1od19wb3J0X2F0dGFjaCAoc3RydWN0IGh3ICptZSwKLQkJaW50IG15X3BvcnQsCi0JCXN0cnVjdCBodyAqZGVzdCwKLQkJaW50IGRlc3RfcG9ydCwKLQkJb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKQotewotICBhdHRhY2hfaHdfcG9ydF9lZGdlIChtZSwKLQkJICAgICAgICZtZS0+cG9ydHNfb2ZfaHctPmVkZ2VzLAotCQkgICAgICAgbXlfcG9ydCwKLQkJICAgICAgIGRlc3QsCi0JCSAgICAgICBkZXN0X3BvcnQsCi0JCSAgICAgICBkaXNwb3NpdGlvbik7Ci19Ci0KLQotdm9pZAotaHdfcG9ydF9kZXRhY2ggKHN0cnVjdCBodyAqbWUsCi0JCWludCBteV9wb3J0LAotCQlzdHJ1Y3QgaHcgKmRlc3QsCi0JCWludCBkZXN0X3BvcnQpCi17Ci0gIGRldGFjaF9od19wb3J0X2VkZ2UgKG1lLAotCQkgICAgICAgJm1lLT5wb3J0c19vZl9ody0+ZWRnZXMsCi0JCSAgICAgICBteV9wb3J0LAotCQkgICAgICAgZGVzdCwKLQkJICAgICAgIGRlc3RfcG9ydCk7Ci19Ci0KLQotdm9pZAotaHdfcG9ydF90cmF2ZXJzZSAoc3RydWN0IGh3ICptZSwKLQkJICBod19wb3J0X3RyYXZlcnNlX2Z1bmN0aW9uICpoYW5kbGVyLAotCQkgIHZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCBod19wb3J0X2VkZ2UgKnBvcnRfZWRnZTsKLSAgZm9yIChwb3J0X2VkZ2UgPSBtZS0+cG9ydHNfb2ZfaHctPmVkZ2VzOwotICAgICAgIHBvcnRfZWRnZSAhPSBOVUxMOwotICAgICAgIHBvcnRfZWRnZSA9IHBvcnRfZWRnZS0+bmV4dCkKLSAgICB7Ci0gICAgICBoYW5kbGVyIChtZSwgcG9ydF9lZGdlLT5teV9wb3J0LAotCSAgICAgICBwb3J0X2VkZ2UtPmRlc3QsIHBvcnRfZWRnZS0+ZGVzdF9wb3J0LAotCSAgICAgICBkYXRhKTsKLSAgICB9Ci19Ci0KLQotaW50Ci1od19wb3J0X2RlY29kZSAoc3RydWN0IGh3ICptZSwKLQkJY29uc3QgY2hhciAqcG9ydF9uYW1lLAotCQlwb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gIGlmIChwb3J0X25hbWUgPT0gTlVMTCB8fCBwb3J0X25hbWVbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLSAgaWYgKGlzZGlnaXQocG9ydF9uYW1lWzBdKSkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RydG91bCAocG9ydF9uYW1lLCBOVUxMLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yICpwb3J0cyA9Ci0JbWUtPnBvcnRzX29mX2h3LT5wb3J0czsKLSAgICAgIGlmIChwb3J0cyAhPSBOVUxMKSAKLQl7Ci0JICB3aGlsZSAocG9ydHMtPm5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChwb3J0cy0+ZGlyZWN0aW9uID09IGJpZGlyZWN0X3BvcnQKLQkJICB8fCBwb3J0cy0+ZGlyZWN0aW9uID09IGRpcmVjdGlvbikKLQkJewotCQkgIGlmIChwb3J0cy0+bnJfcG9ydHMgPiAwKQotCQkgICAgewotCQkgICAgICBpbnQgbGVuID0gc3RybGVuIChwb3J0cy0+bmFtZSk7Ci0JCSAgICAgIGlmIChzdHJuY21wIChwb3J0X25hbWUsIHBvcnRzLT5uYW1lLCBsZW4pID09IDApCi0JCQl7Ci0JCQkgIGlmIChwb3J0X25hbWVbbGVuXSA9PSAnXDAnKQotCQkJICAgIHJldHVybiBwb3J0cy0+bnVtYmVyOwotCQkJICBlbHNlIGlmKGlzZGlnaXQgKHBvcnRfbmFtZVtsZW5dKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgcG9ydCA9IChwb3J0cy0+bnVtYmVyCi0JCQkJCSAgKyBzdHJ0b3VsICgmcG9ydF9uYW1lW2xlbl0sIE5VTEwsIDApKTsKLQkJCSAgICAgIGlmIChwb3J0ID49IHBvcnRzLT5udW1iZXIgKyBwb3J0cy0+bnJfcG9ydHMpCi0JCQkJaHdfYWJvcnQgKG1lLAotCQkJCQkgICJQb3J0ICVzIG91dCBvZiByYW5nZSIsCi0JCQkJCSAgcG9ydF9uYW1lKTsKLQkJCSAgICAgIHJldHVybiBwb3J0OwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKHBvcnRfbmFtZSwgcG9ydHMtPm5hbWUpID09IDApCi0JCSAgICByZXR1cm4gcG9ydHMtPm51bWJlcjsKLQkJfQotCSAgICAgIHBvcnRzKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBod19hYm9ydCAobWUsICJVbnJlY29uaXplZCBwb3J0ICVzIiwgcG9ydF9uYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1od19wb3J0X2VuY29kZSAoc3RydWN0IGh3ICptZSwKLQkJaW50IHBvcnRfbnVtYmVyLAotCQljaGFyICpidWYsCi0JCWludCBzaXplb2ZfYnVmLAotCQlwb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgKnBvcnRzID0gTlVMTDsKLSAgcG9ydHMgPSBtZS0+cG9ydHNfb2ZfaHctPnBvcnRzOwotICBpZiAocG9ydHMgIT0gTlVMTCkgewotICAgIHdoaWxlIChwb3J0cy0+bmFtZSAhPSBOVUxMKQotICAgICAgewotCWlmIChwb3J0cy0+ZGlyZWN0aW9uID09IGJpZGlyZWN0X3BvcnQKLQkgICAgfHwgcG9ydHMtPmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pCi0JICB7Ci0JICAgIGlmIChwb3J0cy0+bnJfcG9ydHMgPiAwKQotCSAgICAgIHsKLQkJaWYgKHBvcnRfbnVtYmVyID49IHBvcnRzLT5udW1iZXIKLQkJICAgICYmIHBvcnRfbnVtYmVyIDwgcG9ydHMtPm51bWJlciArIHBvcnRzLT5ucl9wb3J0cykKLQkJICB7Ci0JCSAgICBzdHJjcHkgKGJ1ZiwgcG9ydHMtPm5hbWUpOwotCQkgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuKGJ1ZiksICIlZCIsIHBvcnRfbnVtYmVyIC0gcG9ydHMtPm51bWJlcik7Ci0JCSAgICBpZiAoc3RybGVuIChidWYpID49IHNpemVvZl9idWYpCi0JCSAgICAgIGh3X2Fib3J0IChtZSwgImh3X3BvcnRfZW5jb2RlOiBidWZmZXIgb3ZlcmZsb3ciKTsKLQkJICAgIHJldHVybiBzdHJsZW4gKGJ1Zik7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHBvcnRzLT5udW1iZXIgPT0gcG9ydF9udW1iZXIpCi0JCSAgewotCQkgICAgaWYgKHN0cmxlbihwb3J0cy0+bmFtZSkgPj0gc2l6ZW9mX2J1ZikKLQkJICAgICAgaHdfYWJvcnQgKG1lLCAiaHdfcG9ydF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOwotCQkgICAgc3RyY3B5KGJ1ZiwgcG9ydHMtPm5hbWUpOwotCQkgICAgcmV0dXJuIHN0cmxlbihidWYpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JcG9ydHMrKzsKLSAgICAgIH0KLSAgfQotICBzcHJpbnRmIChidWYsICIlZCIsIHBvcnRfbnVtYmVyKTsKLSAgaWYgKHN0cmxlbihidWYpID49IHNpemVvZl9idWYpCi0gICAgaHdfYWJvcnQgKG1lLCAiaHdfcG9ydF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOwotICByZXR1cm4gc3RybGVuKGJ1Zik7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LXBvcnRzLmggYi9zaW0vY29tbW9uL2h3LXBvcnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Njg5NWEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1wb3J0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIEhhcmR3YXJlIHBvcnRzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQW5kcmV3IENhZ25leSBhbmQgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZm5kZWYgSFdfUE9SVFNfSAotI2RlZmluZSBIV19QT1JUU19ICi0KLS8qIEluaXRpYWxpemUgYSBwb3J0ICovCi0KLXN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgbnVtYmVyOyAKLSAgaW50IG5yX3BvcnRzOwotICBwb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb247Ci19OwotCi12b2lkIHNldF9od19wb3J0cyAoc3RydWN0IGh3ICpodywgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBwb3J0c1tdKTsKLQotdHlwZWRlZiB2b2lkIChod19wb3J0X2V2ZW50X21ldGhvZCkKLSAgICAgKHN0cnVjdCBodyAqbWUsCi0gICAgICBpbnQgbXlfcG9ydCwKLSAgICAgIHN0cnVjdCBodyAqc291cmNlLAotICAgICAgaW50IHNvdXJjZV9wb3J0LAotICAgICAgaW50IGxldmVsKTsKLQotdm9pZCBzZXRfaHdfcG9ydF9ldmVudCAoc3RydWN0IGh3ICpodywgaHdfcG9ydF9ldmVudF9tZXRob2QgKnRvX3BvcnRfZXZlbnQpOwotCi0KLS8qIFBvcnQgc291cmNlCi0KLSAgIEEgZGV2aWNlIGRyaXZlcyBpdHMgb3V0cHV0IHBvcnRzIHVzaW5nIHRoZSBjYWxsCi0KLSAgICovCi0KLXZvaWQgaHdfcG9ydF9ldmVudAotKHN0cnVjdCBodyAqbWUsCi0gaW50IG15X3BvcnQsCi0gaW50IHZhbHVlKTsKLQotLyogVGhpcyBwb3J0IGV2ZW50IHdpbGwgdGhlbiBiZSBwcm9wb2dhdGVkIHRvIGFueSBhdHRhY2hlZAotICAgZGVzdGluYXRpb24gcG9ydHMuCi0KLSAgIEFueSBpbnRlcnByZXRhdGlvbiBvZiBQT1JUIGFuZCBWQUxVRSBpcyBtb2RlbCBkZXBlbmRhbnQuICBBcyBhCi0gICBndWlkZWxpbmUgdGhlIGZvbGxvd2luZyBhcmUgcmVjb21tZW5kZWQ6IFBDSSBpbnRlcnJ1cHRzIEEtRCBzaG91bGQKLSAgIGNvcnJlc3BvbmQgdG8gcG9ydHMgMC0zOyBsZXZlbCBzZW5zYXRpdmUgaW50ZXJydXB0cyBiZSByZXF1ZXN0ZWQKLSAgIHdpdGggYSB2YWx1ZSBvZiBvbmUgYW5kIHdpdGhkcmF3biB3aXRoIGEgdmFsdWUgb2YgMDsgZWRnZSBzZW5zYXRpdmUKLSAgIGludGVycnVwdHMgYWx3YXlzIGhhdmUgYSB2YWx1ZSBvZiAxLCB0aGUgZXZlbnQgaXRzIHNlbGYgaXMgdHJlYXRlZAotICAgYXMgdGhlIGludGVycnVwdC4KLQotCi0gICBQb3J0IGRlc3RpbmF0aW9ucwotCi0gICBBdHRhY2hlZCB0byBlYWNoIHBvcnQgb2YgYSBkZXZpY2UgY2FuIGJlIHplcm8gb3IgbW9yZQotICAgZGVzaXRpbmF0aW9ucy4gIFRoZXNlIGRlc3RpbmF0aW9ucyBjb25zaXN0IG9mIGEgZGV2aWNlL3BvcnQgcGFpci4KLSAgIEEgZGVzdGluYXRpb24gaXMgYXR0YWNoZWQvZGV0YWNoZWQgdG8gYSBkZXZpY2UgbGluZSB1c2luZyB0aGUKLSAgIGF0dGFjaCBhbmQgZGV0YWNoIGNhbGxzLiAqLwotCi12b2lkIGh3X3BvcnRfYXR0YWNoCi0oc3RydWN0IGh3ICptZSwKLSBpbnQgbXlfcG9ydCwKLSBzdHJ1Y3QgaHcgKmRlc3QsCi0gaW50IGRlc3RfcG9ydCwKLSBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pOwotCi12b2lkIGh3X3BvcnRfZGV0YWNoCi0oc3RydWN0IGh3ICptZSwKLSBpbnQgbXlfcG9ydCwKLSBzdHJ1Y3QgaHcgKmRlc3QsCi0gaW50IGRlc3RfcG9ydCk7Ci0KLQotLyogSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHBvcnRzIGF0dGFjaGVkIHRvIGEgZGV2aWNlICovCi0KLXR5cGVkZWYgdm9pZCAoaHdfcG9ydF90cmF2ZXJzZV9mdW5jdGlvbikKLSAgICAgKHN0cnVjdCBodyAqbWUsCi0gICAgICBpbnQgbXlfcG9ydCwKLSAgICAgIHN0cnVjdCBodyAqZGVzdCwKLSAgICAgIGludCBkZXN0X3BvcnQsCi0gICAgICB2b2lkICpkYXRhKTsKLQotdm9pZCBod19wb3J0X3RyYXZlcnNlCi0oc3RydWN0IGh3ICptZSwKLSBod19wb3J0X3RyYXZlcnNlX2Z1bmN0aW9uICpoYW5kbGVyLAotIHZvaWQgKmRhdGEpOwotIAotCi0vKiBERVNUSU5BVElPTiBpcyBhdHRhY2hlZCAoZGV0YWNoZWQpIHRvIExJTkUgb2YgdGhlIGRldmljZSBNRQotCi0KLSAgIFBvcnQgY29udmVyc2lvbgotCi0gICBVc2VycyByZWZlciB0byBwb3J0IG51bWJlcnMgc3ltYm9saWNhbGx5LiAgRm9yIGluc3RhbmNlIGEgZGV2aWNlCi0gICBtYXkgcmVmZXIgdG8gaXRzIGBJTlQnIHNpZ25hbCB3aGljaCBpcyBpbnRlcm5hbGx5IHJlcHJlc2VudGVkIGJ5Ci0gICBwb3J0IDMuCi0KLSAgIFRvIGNvbnZlcnQgdG8vZnJvbSB0aGUgc3ltYm9saWMgYW5kIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgIHBvcnQgbmFtZS9udW1iZXIuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqLwotCi1pbnQgaHdfcG9ydF9kZWNvZGUKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnN5bWJvbGljX25hbWUsCi0gcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLQotaW50IGh3X3BvcnRfZW5jb2RlCi0oc3RydWN0IGh3ICptZSwKLSBpbnQgcG9ydF9udW1iZXIsCi0gY2hhciAqYnVmLAotIGludCBzaXplb2ZfYnVmLAotIHBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0gCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1wcm9wZXJ0aWVzLmMgYi9zaW0vY29tbW9uL2h3LXByb3BlcnRpZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZDc2ZC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LXByb3BlcnRpZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJody1iYXNlLmgiCi0KLSNpbmNsdWRlICJzaW0taW8uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBUUkFDRShBLEIpCi0KLS8qIHByb3BlcnR5IGVudHJpZXMgKi8KLQotc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgewotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqbmV4dDsKLSAgc3RydWN0IGh3X3Byb3BlcnR5ICpwcm9wZXJ0eTsKLSAgY29uc3Qgdm9pZCAqaW5pdF9hcnJheTsKLSAgdW5zaWduZWQgc2l6ZW9mX2luaXRfYXJyYXk7Ci19OwotCi12b2lkCi1jcmVhdGVfaHdfcHJvcGVydHlfZGF0YSAoc3RydWN0IGh3ICptZSkKLXsKLX0KLQotdm9pZAotZGVsZXRlX2h3X3Byb3BlcnR5X2RhdGEgKHN0cnVjdCBodyAqbWUpCi17Ci19Ci0KLQotLyogRGV2aWNlIFByb3BlcnRpZXM6ICovCi0KLXN0YXRpYyBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqCi1maW5kX3Byb3BlcnR5X2RhdGEgKHN0cnVjdCBodyAqbWUsCi0JCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmVudHJ5OwotICBBU1NFUlQgKHByb3BlcnR5ICE9IE5VTEwpOwotICBlbnRyeSA9IG1lLT5wcm9wZXJ0aWVzX29mX2h3OwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChlbnRyeS0+cHJvcGVydHktPm5hbWUsIHByb3BlcnR5KSA9PSAwKQotCXJldHVybiBlbnRyeTsKLSAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgdm9pZAotaHdfYWRkX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCSBod19wcm9wZXJ0eV90eXBlIHR5cGUsCi0JCSBjb25zdCB2b2lkICppbml0X2FycmF5LAotCQkgdW5zaWduZWQgc2l6ZW9mX2luaXRfYXJyYXksCi0JCSBjb25zdCB2b2lkICphcnJheSwKLQkJIHVuc2lnbmVkIHNpemVvZl9hcnJheSwKLQkJIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqb3JpZ2luYWwsCi0JCSBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pCi17Ci0gIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICpuZXdfZW50cnkgPSBOVUxMOwotICBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5ld192YWx1ZSA9IE5VTEw7Ci0gIAotICAvKiBmaW5kIHRoZSBsaXN0IGVuZCAqLwotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqKmluc2VydGlvbl9wb2ludCA9ICZtZS0+cHJvcGVydGllc19vZl9odzsKLSAgd2hpbGUgKCppbnNlcnRpb25fcG9pbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgoKmluc2VydGlvbl9wb2ludCktPnByb3BlcnR5LT5uYW1lLCBwcm9wZXJ0eSkgPT0gMCkKLQlyZXR1cm47Ci0gICAgICBpbnNlcnRpb25fcG9pbnQgPSAmKCppbnNlcnRpb25fcG9pbnQpLT5uZXh0OwotICAgIH0KLSAgCi0gIC8qIGNyZWF0ZSBhIG5ldyB2YWx1ZSAqLwotICBuZXdfdmFsdWUgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfcHJvcGVydHkpOwotICBuZXdfdmFsdWUtPm5hbWUgPSAoY2hhciAqKSBzdHJkdXAgKHByb3BlcnR5KTsKLSAgbmV3X3ZhbHVlLT50eXBlID0gdHlwZTsKLSAgaWYgKHNpemVvZl9hcnJheSA+IDApCi0gICAgewotICAgICAgdm9pZCAqbmV3X2FycmF5ID0gaHdfemFsbG9jIChtZSwgc2l6ZW9mX2FycmF5KTsKLSAgICAgIG1lbWNweSAobmV3X2FycmF5LCBhcnJheSwgc2l6ZW9mX2FycmF5KTsKLSAgICAgIG5ld192YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7Ci0gICAgICBuZXdfdmFsdWUtPnNpemVvZl9hcnJheSA9IHNpemVvZl9hcnJheTsKLSAgICB9Ci0gIG5ld192YWx1ZS0+b3duZXIgPSBtZTsKLSAgbmV3X3ZhbHVlLT5vcmlnaW5hbCA9IG9yaWdpbmFsOwotICBuZXdfdmFsdWUtPmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb247Ci0gIAotICAvKiBpbnNlcnQgdGhlIHZhbHVlIGludG8gdGhlIGxpc3QgKi8KLSAgbmV3X2VudHJ5ID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEpOwotICAqaW5zZXJ0aW9uX3BvaW50ID0gbmV3X2VudHJ5OwotICBpZiAoc2l6ZW9mX2luaXRfYXJyYXkgPiAwKQotICAgIHsKLSAgICAgIHZvaWQgKm5ld19pbml0X2FycmF5ID0gaHdfemFsbG9jIChtZSwgc2l6ZW9mX2luaXRfYXJyYXkpOwotICAgICAgbWVtY3B5IChuZXdfaW5pdF9hcnJheSwgaW5pdF9hcnJheSwgc2l6ZW9mX2luaXRfYXJyYXkpOwotICAgICAgbmV3X2VudHJ5LT5pbml0X2FycmF5ID0gbmV3X2luaXRfYXJyYXk7Ci0gICAgICBuZXdfZW50cnktPnNpemVvZl9pbml0X2FycmF5ID0gc2l6ZW9mX2luaXRfYXJyYXk7Ci0gICAgfQotICBuZXdfZW50cnktPnByb3BlcnR5ID0gbmV3X3ZhbHVlOwotfQotCi0KLXN0YXRpYyB2b2lkCi1od19zZXRfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJIGh3X3Byb3BlcnR5X3R5cGUgdHlwZSwKLQkJIGNvbnN0IHZvaWQgKmFycmF5LAotCQkgaW50IHNpemVvZl9hcnJheSkKLXsKLSAgLyogZmluZCB0aGUgcHJvcGVydHkgKi8KLSAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmVudHJ5ID0gZmluZF9wcm9wZXJ0eV9kYXRhIChtZSwgcHJvcGVydHkpOwotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBleGlzdGluZyBwcm9wZXJ0eSAtIHVwZGF0ZSBpdCAqLwotICAgICAgdm9pZCAqbmV3X2FycmF5ID0gMDsKLSAgICAgIHN0cnVjdCBod19wcm9wZXJ0eSAqdmFsdWUgPSBlbnRyeS0+cHJvcGVydHk7Ci0gICAgICAvKiBjaGVjayB0aGUgdHlwZSBtYXRjaGVzICovCi0gICAgICBpZiAodmFsdWUtPnR5cGUgIT0gdHlwZSkKLQlod19hYm9ydCAobWUsICJjb25mbGljdCBiZXR3ZWVuIHR5cGUgb2YgbmV3IGFuZCBvbGQgdmFsdWUgZm9yIHByb3BlcnR5ICVzIiwgcHJvcGVydHkpOwotICAgICAgLyogcmVwbGFjZSBpdHMgdmFsdWUgKi8KLSAgICAgIGlmICh2YWx1ZS0+YXJyYXkgIT0gTlVMTCkKLQlod19mcmVlIChtZSwgKHZvaWQqKXZhbHVlLT5hcnJheSk7Ci0gICAgICBuZXdfYXJyYXkgPSAoc2l6ZW9mX2FycmF5ID4gMAotCQkgICA/IGh3X3phbGxvYyAobWUsIHNpemVvZl9hcnJheSkKLQkJICAgOiAodm9pZCopMCk7Ci0gICAgICB2YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7Ci0gICAgICB2YWx1ZS0+c2l6ZW9mX2FycmF5ID0gc2l6ZW9mX2FycmF5OwotICAgICAgaWYgKHNpemVvZl9hcnJheSA+IDApCi0JbWVtY3B5IChuZXdfYXJyYXksIGFycmF5LCBzaXplb2ZfYXJyYXkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIG5ldyBwcm9wZXJ0eSAtIGNyZWF0ZSBpdCAqLwotICAgICAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHR5cGUsCi0JCSAgICAgICBOVUxMLCAwLCBhcnJheSwgc2l6ZW9mX2FycmF5LAotCQkgICAgICAgTlVMTCwgdGVtcG9yYXJ5X29iamVjdCk7Ci0gICAgfQotfQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotY2xlYW5faHdfcHJvcGVydGllcyAoc3RydWN0IGh3ICptZSkKLXsKLSAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKipkZWxldGVfcG9pbnQgPSAmbWUtPnByb3BlcnRpZXNfb2ZfaHc7Ci0gIHdoaWxlICgqZGVsZXRlX3BvaW50ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmN1cnJlbnQgPSAqZGVsZXRlX3BvaW50OwotICAgICAgc3dpdGNoIChjdXJyZW50LT5wcm9wZXJ0eS0+ZGlzcG9zaXRpb24pCi0JewotCWNhc2UgcGVybWVuYW50X29iamVjdDoKLQkgIC8qIHphcCB0aGUgY3VycmVudCB2YWx1ZSwgd2lsbCBiZSBpbml0aWFsaXplZCBsYXRlciAqLwotCSAgQVNTRVJUIChjdXJyZW50LT5pbml0X2FycmF5ICE9IE5VTEwpOwotCSAgaWYgKGN1cnJlbnQtPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaHdfZnJlZSAobWUsICh2b2lkKiljdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkpOwotCSAgICAgIGN1cnJlbnQtPnByb3BlcnR5LT5hcnJheSA9IE5VTEw7Ci0JICAgIH0KLQkgIGRlbGV0ZV9wb2ludCA9ICYoKmRlbGV0ZV9wb2ludCktPm5leHQ7Ci0JICBicmVhazsKLQljYXNlIHRlbXBvcmFyeV9vYmplY3Q6Ci0JICAvKiB6YXAgdGhlIGFjdHVhbCBwcm9wZXJ0eSwgd2FzIGNyZWF0ZWQgZHVyaW5nIHNpbXVsYXRpb24gcnVuICovCi0JICBBU1NFUlQgKGN1cnJlbnQtPmluaXRfYXJyYXkgPT0gTlVMTCk7Ci0JICAqZGVsZXRlX3BvaW50ID0gY3VycmVudC0+bmV4dDsKLQkgIGlmIChjdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkgIT0gTlVMTCkKLQkgICAgaHdfZnJlZSAobWUsICh2b2lkKiljdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkpOwotCSAgaHdfZnJlZSAobWUsIGN1cnJlbnQtPnByb3BlcnR5KTsKLQkgIGh3X2ZyZWUgKG1lLCBjdXJyZW50KTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIDAKLXZvaWQKLWh3X2luaXRfc3RhdGljX3Byb3BlcnRpZXMgKFNJTV9ERVNDIHNkLAotCQkJICAgc3RydWN0IGh3ICptZSwKLQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICpwcm9wZXJ0eTsKLSAgZm9yIChwcm9wZXJ0eSA9IG1lLT5wcm9wZXJ0aWVzX29mX2h3OwotICAgICAgIHByb3BlcnR5ICE9IE5VTEw7Ci0gICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS0+bmV4dCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOwotICAgICAgQVNTRVJUIChwcm9wZXJ0eS0+cHJvcGVydHktPmFycmF5ID09IE5VTEwpOwotICAgICAgQVNTRVJUKHByb3BlcnR5LT5wcm9wZXJ0eS0+ZGlzcG9zaXRpb24gPT0gcGVybWVuYW50X29iamVjdCk7Ci0gICAgICBzd2l0Y2ggKHByb3BlcnR5LT5wcm9wZXJ0eS0+dHlwZSkKLQl7Ci0JY2FzZSBhcnJheV9wcm9wZXJ0eToKLQljYXNlIGJvb2xlYW5fcHJvcGVydHk6Ci0JY2FzZSByYW5nZV9hcnJheV9wcm9wZXJ0eToKLQljYXNlIHJlZ19hcnJheV9wcm9wZXJ0eToKLQljYXNlIHN0cmluZ19wcm9wZXJ0eToKLQljYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKLQljYXNlIGludGVnZXJfcHJvcGVydHk6Ci0JICAvKiBkZWxldGUgdGhlIHByb3BlcnR5LCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBvcmlnaW5hbCAqLwotCSAgaHdfc2V0X3Byb3BlcnR5IChtZSwgcHJvcGVydHktPnByb3BlcnR5LT5uYW1lLAotCQkJICAgcHJvcGVydHktPnByb3BlcnR5LT50eXBlLAotCQkJICAgcHJvcGVydHktPmluaXRfYXJyYXksCi0JCQkgICBwcm9wZXJ0eS0+c2l6ZW9mX2luaXRfYXJyYXkpOwotCSAgYnJlYWs7Ci0jaWYgMAotCWNhc2UgaWhhbmRsZV9wcm9wZXJ0eToKLQkgIGJyZWFrOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLSNlbmRpZgotCi0KLSNpZiAwCi12b2lkCi1od19pbml0X3J1bnRpbWVfcHJvcGVydGllcyAoU0lNX0RFU0Mgc2QsCi0JCQkgICAgc3RydWN0IGh3ICptZSwKLQkJCSAgICB2b2lkICpkYXRhKQotewotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqcHJvcGVydHk7Ci0gIGZvciAocHJvcGVydHkgPSBtZS0+cHJvcGVydGllc19vZl9odzsKLSAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOwotICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHktPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChwcm9wZXJ0eS0+cHJvcGVydHktPmRpc3Bvc2l0aW9uKQotCXsKLQljYXNlIHBlcm1lbmFudF9vYmplY3Q6Ci0JICBzd2l0Y2ggKHByb3BlcnR5LT5wcm9wZXJ0eS0+dHlwZSkKLQkgICAgewotI2lmIDAKLQkgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgotCSAgICAgIHsKLQkJc3RydWN0IGh3X2luc3RhbmNlICppaGFuZGxlOwotCQlpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBzcGVjOwotCQlBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOwotCQlBU1NFUlQgKHByb3BlcnR5LT5wcm9wZXJ0eS0+YXJyYXkgPT0gTlVMTCk7Ci0JCWh3X2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChtZSwgcHJvcGVydHktPnByb3BlcnR5LT5uYW1lLCAmc3BlYyk7Ci0JCWloYW5kbGUgPSB0cmVlX2luc3RhbmNlIChtZSwgc3BlYy5mdWxsX3BhdGgpOwotCQlod19zZXRfaWhhbmRsZV9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5wcm9wZXJ0eS0+bmFtZSwgaWhhbmRsZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLSNlbmRpZgotCSAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgotCSAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6Ci0JICAgIGNhc2UgcmFuZ2VfYXJyYXlfcHJvcGVydHk6Ci0JICAgIGNhc2UgaW50ZWdlcl9wcm9wZXJ0eToKLQkgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6Ci0JICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgotCSAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKLQkgICAgICBBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOwotCSAgICAgIEFTU0VSVCAocHJvcGVydHktPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSB0ZW1wb3Jhcnlfb2JqZWN0OgotCSAgQVNTRVJUIChwcm9wZXJ0eS0+aW5pdF9hcnJheSA9PSBOVUxMKTsKLQkgIEFTU0VSVCAocHJvcGVydHktPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotCi0KLWNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqCi1od19uZXh0X3Byb3BlcnR5IChjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5KQotewotICAvKiBmaW5kIHRoZSBwcm9wZXJ0eSBpbiB0aGUgbGlzdCAqLwotICBzdHJ1Y3QgaHcgKm93bmVyID0gcHJvcGVydHktPm93bmVyOwotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqZW50cnkgPSBvd25lci0+cHJvcGVydGllc19vZl9odzsKLSAgd2hpbGUgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPnByb3BlcnR5ICE9IHByb3BlcnR5KQotICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0gIC8qIG5vdyByZXR1cm4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSAqLwotICBBU1NFUlQgKGVudHJ5ICE9IE5VTEwpOyAvKiBtdXN0IGJlIGEgbWVtYmVyISAqLwotICBpZiAoZW50cnktPm5leHQgIT0gTlVMTCkKLSAgICByZXR1cm4gZW50cnktPm5leHQtPnByb3BlcnR5OwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICoKLWh3X2ZpbmRfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCSAgY29uc3QgY2hhciAqcHJvcGVydHkpCi17Ci0gIGlmIChtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAocHJvcGVydHkgPT0gTlVMTCB8fCBzdHJjbXAgKHByb3BlcnR5LCAiIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWUtPnByb3BlcnRpZXNfb2ZfaHcgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gbWUtPnByb3BlcnRpZXNfb2ZfaHctPnByb3BlcnR5OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICplbnRyeSA9IGZpbmRfcHJvcGVydHlfZGF0YSAobWUsIHByb3BlcnR5KTsKLSAgICAgIGlmIChlbnRyeSAhPSBOVUxMKQotCXJldHVybiBlbnRyeS0+cHJvcGVydHk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkCi1od19hZGRfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKmFycmF5LAotCQkgICAgICAgaW50IHNpemVvZl9hcnJheSkKLXsKLSAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIGFycmF5X3Byb3BlcnR5LAotCQkgICBhcnJheSwgc2l6ZW9mX2FycmF5LCBhcnJheSwgc2l6ZW9mX2FycmF5LAotCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKLX0KLQotdm9pZAotaHdfc2V0X2FycmF5X3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCSAgICAgICBjb25zdCB2b2lkICphcnJheSwKLQkJICAgICAgIGludCBzaXplb2ZfYXJyYXkpCi17Ci0gIGh3X3NldF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBhcnJheV9wcm9wZXJ0eSwgYXJyYXksIHNpemVvZl9hcnJheSk7Ci19Ci0KLWNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqCi1od19maW5kX2FycmF5X3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkJY29uc3QgY2hhciAqcHJvcGVydHkpCi17Ci0gIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqbm9kZTsKLSAgbm9kZSA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IE5VTEwpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKLSAgaWYgKG5vZGUtPnR5cGUgIT0gYXJyYXlfcHJvcGVydHkpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGFycmF5KSIsIHByb3BlcnR5KTsKLSAgcmV0dXJuIG5vZGU7Ci19Ci0KLQotCi12b2lkCi1od19hZGRfYm9vbGVhbl9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCSBpbnQgYm9vbGVhbikKLXsKLSAgc2lnbmVkMzIgbmV3X2Jvb2xlYW4gPSAoYm9vbGVhbiA/IC0xIDogMCk7Ci0gIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBib29sZWFuX3Byb3BlcnR5LAotCQkgICAmbmV3X2Jvb2xlYW4sIHNpemVvZihuZXdfYm9vbGVhbiksCi0JCSAgICZuZXdfYm9vbGVhbiwgc2l6ZW9mKG5ld19ib29sZWFuKSwKLQkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLWludAotaHdfZmluZF9ib29sZWFuX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkJICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOwotICB1bnNpZ25lZF9jZWxsIGJvb2xlYW47Ci0gIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT50eXBlICE9IGJvb2xlYW5fcHJvcGVydHkpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGJvb2xlYW4pIiwgcHJvcGVydHkpOwotICBBU1NFUlQgKHNpemVvZiAoYm9vbGVhbikgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKLSAgbWVtY3B5ICgmYm9vbGVhbiwgbm9kZS0+YXJyYXksIHNpemVvZiAoYm9vbGVhbikpOwotICByZXR1cm4gYm9vbGVhbjsKLX0KLQotCi0KLSNpZiAwCi12b2lkCi1od19hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQkgY29uc3QgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgKmloYW5kbGUpCi17Ci0gIC8qIGVudGVyIHRoZSBmdWxsIHBhdGggYXMgdGhlIGluaXQgYXJyYXkgKi8KLSAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIGloYW5kbGVfcHJvcGVydHksCi0JCSAgIGloYW5kbGUtPmZ1bGxfcGF0aCwgc3RybGVuKGloYW5kbGUtPmZ1bGxfcGF0aCkgKyAxLAotCQkgICBOVUxMLCAwLAotCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKLX0KLSNlbmRpZgotCi0jaWYgMAotdm9pZAotaHdfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkJICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQkgIGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjICppaGFuZGxlKQotewotICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqZW50cnkgPSBmaW5kX3Byb3BlcnR5X2RhdGEgKG1lLCBwcm9wZXJ0eSk7Ci0gIFRSQUNFICh0cmFjZV9kZXZpY2VzLAotCSAoImh3X2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KG1lPTB4JWx4LCBwcm9wZXJ0eT0lcylcbiIsCi0JICAobG9uZyltZSwgcHJvcGVydHkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKLSAgaWYgKGVudHJ5LT5wcm9wZXJ0eS0+dHlwZSAhPSBpaGFuZGxlX3Byb3BlcnR5Ci0gICAgICB8fCBlbnRyeS0+cHJvcGVydHktPmRpc3Bvc2l0aW9uICE9IHBlcm1lbmFudF9vYmplY3QpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7Ci0gIEFTU0VSVCAoZW50cnktPmluaXRfYXJyYXkgIT0gTlVMTCk7Ci0gIC8qIHRoZSBmdWxsIHBhdGggKi8KLSAgaWhhbmRsZS0+ZnVsbF9wYXRoID0gZW50cnktPmluaXRfYXJyYXk7Ci19Ci0jZW5kaWYKLQotCi0KLSNpZiAwCi12b2lkCi1od19zZXRfaWhhbmRsZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCSBod19pbnN0YW5jZSAqaWhhbmRsZSkKLXsKLSAgdW5zaWduZWRfY2VsbCBjZWxsczsKLSAgY2VsbHMgPSBIMkJFX2NlbGwgKGh3X2luc3RhbmNlX3RvX2V4dGVybmFsIChpaGFuZGxlKSk7Ci0gIGh3X3NldF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBpaGFuZGxlX3Byb3BlcnR5LAotCQkgICAmY2VsbHMsIHNpemVvZiAoY2VsbHMpKTsKLQkJICAgICAgCi19Ci0jZW5kaWYKLQotI2lmIDAKLWh3X2luc3RhbmNlICoKLWh3X2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3QgY2hhciAqcHJvcGVydHkpCi17Ci0gIGNvbnN0IGh3X3Byb3BlcnR5X2RhdGEgKm5vZGU7Ci0gIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKLSAgaHdfaW5zdGFuY2UgKmluc3RhbmNlOwotCi0gIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT50eXBlICE9IGloYW5kbGVfcHJvcGVydHkpCi0gICAgaHdfYWJvcnQobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSAoaWhhbmRsZSkiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT5hcnJheSA9PSBOVUxMKQotICAgIGh3X2Fib3J0KG1lLCAicnVudGltZSBwcm9wZXJ0eSBcIiVzXCIgbm90IHlldCBpbml0aWFsaXplZCIsIHByb3BlcnR5KTsKLQotICBBU1NFUlQgKHNpemVvZihpaGFuZGxlKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOwotICBtZW1jcHkgKCZpaGFuZGxlLCBub2RlLT5hcnJheSwgc2l6ZW9mKGloYW5kbGUpKTsKLSAgaW5zdGFuY2UgPSBleHRlcm5hbF90b19od19pbnN0YW5jZSAobWUsIEJFMkhfY2VsbChpaGFuZGxlKSk7Ci0gIEFTU0VSVCAoaW5zdGFuY2UgIT0gTlVMTCk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLSNlbmRpZgotCi0KLXZvaWQKLWh3X2FkZF9pbnRlZ2VyX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkJIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJIHNpZ25lZF9jZWxsIGludGVnZXIpCi17Ci0gIEgyQkUgKGludGVnZXIpOwotICBod19hZGRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgaW50ZWdlcl9wcm9wZXJ0eSwKLQkJICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKLQkJICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKLQkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLXNpZ25lZF9jZWxsCi1od19maW5kX2ludGVnZXJfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkgIGNvbnN0IGNoYXIgKnByb3BlcnR5KQotewotICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7Ci0gIHNpZ25lZF9jZWxsIGludGVnZXI7Ci0gIFRSQUNFICh0cmFjZV9kZXZpY2VzLAotCSAoImh3X2ZpbmRfaW50ZWdlcihtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAotCSAgKGxvbmcpbWUsIHByb3BlcnR5KSk7Ci0gIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT50eXBlICE9IGludGVnZXJfcHJvcGVydHkpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGludGVnZXIpIiwgcHJvcGVydHkpOwotICBBU1NFUlQgKHNpemVvZihpbnRlZ2VyKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOwotICBtZW1jcHkgKCZpbnRlZ2VyLCBub2RlLT5hcnJheSwgc2l6ZW9mIChpbnRlZ2VyKSk7Ci0gIHJldHVybiBCRTJIX2NlbGwgKGludGVnZXIpOwotfQotCi1pbnQKLWh3X2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCQljb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQl1bnNpZ25lZCBpbmRleCwKLQkJCQlzaWduZWRfY2VsbCAqaW50ZWdlcikKLXsKLSAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOwotICBpbnQgc2l6ZW9mX2ludGVnZXIgPSBzaXplb2YgKCppbnRlZ2VyKTsKLSAgc2lnbmVkX2NlbGwgKmNlbGw7Ci0gIFRSQUNFICh0cmFjZV9kZXZpY2VzLAotCSAoImh3X2ZpbmRfaW50ZWdlcihtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAotCSAgKGxvbmcpbWUsIHByb3BlcnR5KSk7Ci0gIAotICAvKiBjaGVjayB0aGluZ3Mgc2FuZSAqLwotICBub2RlID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5KTsKLSAgaWYgKG5vZGUgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgbm90IGZvdW5kIiwgcHJvcGVydHkpOwotICBpZiAobm9kZS0+dHlwZSAhPSBpbnRlZ2VyX3Byb3BlcnR5Ci0gICAgICAmJiBub2RlLT50eXBlICE9IGFycmF5X3Byb3BlcnR5KQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChpbnRlZ2VyIG9yIGFycmF5KSIsIHByb3BlcnR5KTsKLSAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfaW50ZWdlcikgIT0gMCkKLSAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgY29udGFpbnMgYW4gaW5jb21wbGV0ZSBudW1iZXIgb2YgY2VsbHMiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT5zaXplb2ZfYXJyYXkgPD0gc2l6ZW9mX2ludGVnZXIgKiBpbmRleCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIEZpbmQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCi0gIGNlbGwgPSAoKHNpZ25lZF9jZWxsKilub2RlLT5hcnJheSkgKyBpbmRleDsKLSAgKmludGVnZXIgPSBCRTJIX2NlbGwgKCpjZWxsKTsKLSAgCi0gIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfaW50ZWdlcjsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWRfY2VsbCAqCi11bml0X2FkZHJlc3NfdG9fY2VsbHMgKGNvbnN0IGh3X3VuaXQgKnVuaXQsCi0JCSAgICAgICB1bnNpZ25lZF9jZWxsICpjZWxsLAotCQkgICAgICAgaW50IG5yX2NlbGxzKQotewotICBpbnQgaTsKLSAgQVNTRVJUKG5yX2NlbGxzID09IHVuaXQtPm5yX2NlbGxzKTsKLSAgZm9yIChpID0gMDsgaSA8IHVuaXQtPm5yX2NlbGxzOyBpKyspCi0gICAgewotICAgICAgKmNlbGwgPSBIMkJFX2NlbGwgKHVuaXQtPmNlbGxzW2ldKTsKLSAgICAgIGNlbGwgKz0gMTsKLSAgICB9Ci0gIHJldHVybiBjZWxsOwotfQotCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZF9jZWxsICoKLWNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbCwKLQkJICAgICAgIGh3X3VuaXQgKnVuaXQsCi0JCSAgICAgICBpbnQgbnJfY2VsbHMpCi17Ci0gIGludCBpOwotICBtZW1zZXQodW5pdCwgMCwgc2l6ZW9mKCp1bml0KSk7Ci0gIHVuaXQtPm5yX2NlbGxzID0gbnJfY2VsbHM7Ci0gIGZvciAoaSA9IDA7IGkgPCB1bml0LT5ucl9jZWxsczsgaSsrKQotICAgIHsKLSAgICAgIHVuaXQtPmNlbGxzW2ldID0gQkUySF9jZWxsICgqY2VsbCk7Ci0gICAgICBjZWxsICs9IDE7Ci0gICAgfQotICByZXR1cm4gY2VsbDsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLW5yX3JhbmdlX3Byb3BlcnR5X2NlbGxzIChzdHJ1Y3QgaHcgKm1lLAotCQkJIGludCBucl9yYW5nZXMpCi17Ci0gIHJldHVybiAoKGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAobWUpCi0JICAgKyBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKGh3X3BhcmVudCAobWUpKQotCSAgICsgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChtZSkpCi0JICApICogbnJfcmFuZ2VzOwotfQotCi12b2lkCi1od19hZGRfcmFuZ2VfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgICBjb25zdCByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZXMsCi0JCQkgICAgIHVuc2lnbmVkIG5yX3JhbmdlcykKLXsKLSAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JhbmdlX3Byb3BlcnR5X2NlbGxzIChtZSwgbnJfcmFuZ2VzKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKLSAgdW5zaWduZWRfY2VsbCAqY2VsbHMgPSBod196YWxsb2MgKG1lLCBzaXplb2ZfY2VsbHMpOwotICB1bnNpZ25lZF9jZWxsICpjZWxsOwotICBpbnQgaTsKLSAgCi0gIC8qIGNvcHkgdGhlIHByb3BlcnR5IGVsZW1lbnRzIG92ZXIgKi8KLSAgY2VsbCA9IGNlbGxzOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfcmFuZ2VzOyBpKyspCi0gICAgewotICAgICAgY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2UgPSAmcmFuZ2VzW2ldOwotICAgICAgLyogY29weSB0aGUgY2hpbGQgYWRkcmVzcyAqLwotICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJhbmdlLT5jaGlsZF9hZGRyZXNzLCBjZWxsLAotCQkJCSAgICBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKG1lKSk7Ci0gICAgICAvKiBjb3B5IHRoZSBwYXJlbnQgYWRkcmVzcyAqLwotICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJhbmdlLT5wYXJlbnRfYWRkcmVzcywgY2VsbCwgCi0JCQkJICAgIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKLSAgICAgIC8qIGNvcHkgdGhlIHNpemUgKi8KLSAgICAgIGNlbGwgPSB1bml0X2FkZHJlc3NfdG9fY2VsbHMgKCZyYW5nZS0+c2l6ZSwgY2VsbCwgCi0JCQkJICAgIGh3X3VuaXRfbnJfc2l6ZV9jZWxscyAobWUpKTsKLSAgICB9Ci0gIEFTU0VSVCAoY2VsbCA9PSAmY2VsbHNbbnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMgKG1lLCBucl9yYW5nZXMpXSk7Ci0gIAotICAvKiBhZGQgaXQgKi8KLSAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHJhbmdlX2FycmF5X3Byb3BlcnR5LAotCQkgICBjZWxscywgc2l6ZW9mX2NlbGxzLAotCQkgICBjZWxscywgc2l6ZW9mX2NlbGxzLAotCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKLSAgCi0gIGh3X2ZyZWUgKG1lLCBjZWxscyk7Ci19Ci0KLWludAotaHdfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgICAgdW5zaWduZWQgaW5kZXgsCi0JCQkgICAgICByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZSkKLXsKLSAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOwotICB1bnNpZ25lZCBzaXplb2ZfZW50cnkgPSAobnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMgKG1lLCAxKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKLSAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7Ci0gIAotICAvKiBsb2NhdGUgdGhlIHByb3BlcnR5ICovCi0gIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT50eXBlICE9IHJhbmdlX2FycmF5X3Byb3BlcnR5KQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChyYW5nZSBhcnJheSkiLCBwcm9wZXJ0eSk7Ci0gIAotICAvKiBhbGlnbmVkID8gKi8KLSAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfZW50cnkpICE9IDApCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIGNvbnRhaW5zIGFuIGluY29tcGxldGUgbnVtYmVyIG9mIGVudHJpZXMiLAotCSAgICAgIHByb3BlcnR5KTsKLSAgCi0gIC8qIHdpdGhpbiBib3VuZHM/ICovCi0gIGlmIChub2RlLT5zaXplb2ZfYXJyYXkgPCBzaXplb2ZfZW50cnkgKiAoaW5kZXggKyAxKSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIGZpbmQgdGhlIHJhbmdlIG9mIGludGVyZXN0ICovCi0gIGNlbGxzID0gKHVuc2lnbmVkX2NlbGwqKSgoY2hhciopbm9kZS0+YXJyYXkgKyBzaXplb2ZfZW50cnkgKiBpbmRleCk7Ci0gIAotICAvKiBjb3B5IHRoZSBjaGlsZCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KLSAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MgKGNlbGxzLCAmcmFuZ2UtPmNoaWxkX2FkZHJlc3MsCi0JCQkJIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAobWUpKTsKLSAgCi0gIC8qIGNvcHkgdGhlIHBhcmVudCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KLSAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MgKGNlbGxzLCAmcmFuZ2UtPnBhcmVudF9hZGRyZXNzLAotCQkJCSBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKGh3X3BhcmVudCAobWUpKSk7Ci0gIAotICAvKiBjb3B5IHRoZSBzaXplIC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyYW5nZS0+c2l6ZSwKLQkJCQkgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChtZSkpOwotICAKLSAgcmV0dXJuIG5vZGUtPnNpemVvZl9hcnJheSAvIHNpemVvZl9lbnRyeTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLW5yX3JlZ19wcm9wZXJ0eV9jZWxscyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgIGludCBucl9yZWdzKQotewotICByZXR1cm4gKGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50KG1lKSkKLQkgICsgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChod19wYXJlbnQobWUpKQotCSAgKSAqIG5yX3JlZ3M7Ci19Ci0KLXZvaWQKLWh3X2FkZF9yZWdfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCSAgIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzLAotCQkJICAgdW5zaWduZWQgbnJfcmVncykKLXsKLSAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JlZ19wcm9wZXJ0eV9jZWxscyAobWUsIG5yX3JlZ3MpCi0JCQkgICAqIHNpemVvZiAodW5zaWduZWRfY2VsbCkpOwotICB1bnNpZ25lZF9jZWxsICpjZWxscyA9IGh3X3phbGxvYyAobWUsIHNpemVvZl9jZWxscyk7Ci0gIHVuc2lnbmVkX2NlbGwgKmNlbGw7Ci0gIGludCBpOwotICAKLSAgLyogY29weSB0aGUgcHJvcGVydHkgZWxlbWVudHMgb3ZlciAqLwotICBjZWxsID0gY2VsbHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9yZWdzOyBpKyspCi0gICAgewotICAgICAgY29uc3QgcmVnX3Byb3BlcnR5X3NwZWMgKnJlZyA9ICZyZWdzW2ldOwotICAgICAgLyogY29weSB0aGUgYWRkcmVzcyAqLwotICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJlZy0+YWRkcmVzcywgY2VsbCwKLQkJCQkgICAgaHdfdW5pdF9ucl9hZGRyZXNzX2NlbGxzIChod19wYXJlbnQgKG1lKSkpOwotICAgICAgLyogY29weSB0aGUgc2l6ZSAqLwotICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJlZy0+c2l6ZSwgY2VsbCwKLQkJCQkgICAgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChod19wYXJlbnQgKG1lKSkpOwotICAgIH0KLSAgQVNTRVJUIChjZWxsID09ICZjZWxsc1tucl9yZWdfcHJvcGVydHlfY2VsbHMgKG1lLCBucl9yZWdzKV0pOwotICAKLSAgLyogYWRkIGl0ICovCi0gIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCByZWdfYXJyYXlfcHJvcGVydHksCi0JCSAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCi0JCSAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCi0JCSAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOwotICAKLSAgaHdfZnJlZSAobWUsIGNlbGxzKTsKLX0KLQotaW50Ci1od19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCSAgICB1bnNpZ25lZCBpbmRleCwKLQkJCSAgICByZWdfcHJvcGVydHlfc3BlYyAqcmVnKQotewotICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7Ci0gIHVuc2lnbmVkIHNpemVvZl9lbnRyeSA9IChucl9yZWdfcHJvcGVydHlfY2VsbHMgKG1lLCAxKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKLSAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7Ci0gIAotICAvKiBsb2NhdGUgdGhlIHByb3BlcnR5ICovCi0gIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlLT50eXBlICE9IHJlZ19hcnJheV9wcm9wZXJ0eSkKLSAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSAocmVnIGFycmF5KSIsIHByb3BlcnR5KTsKLSAgCi0gIC8qIGFsaWduZWQgPyAqLwotICBpZiAoKG5vZGUtPnNpemVvZl9hcnJheSAlIHNpemVvZl9lbnRyeSkgIT0gMCkKLSAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgY29udGFpbnMgYW4gaW5jb21wbGV0ZSBudW1iZXIgb2YgZW50cmllcyIsCi0JICAgICAgcHJvcGVydHkpOwotICAKLSAgLyogd2l0aGluIGJvdW5kcz8gKi8KLSAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA8IHNpemVvZl9lbnRyeSAqIChpbmRleCArIDEpKQotICAgIHJldHVybiAwOwotICAKLSAgLyogZmluZCB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QgKi8KLSAgY2VsbHMgPSAodW5zaWduZWRfY2VsbCopKChjaGFyKilub2RlLT5hcnJheSArIHNpemVvZl9lbnRyeSAqIGluZGV4KTsKLSAgCi0gIC8qIGNvcHkgdGhlIGFkZHJlc3Mgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyZWctPmFkZHJlc3MsCi0JCQkJIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKLSAgCi0gIC8qIGNvcHkgdGhlIHNpemUgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyZWctPnNpemUsCi0JCQkJIGh3X3VuaXRfbnJfc2l6ZV9jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKLSAgCi0gIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfZW50cnk7Ci19Ci0KLQotdm9pZAotaHdfYWRkX3N0cmluZ19wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCWNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJY29uc3QgY2hhciAqc3RyaW5nKQotewotICBod19hZGRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgc3RyaW5nX3Byb3BlcnR5LAotCQkgICBzdHJpbmcsIHN0cmxlbihzdHJpbmcpICsgMSwKLQkJICAgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSArIDEsCi0JCSAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOwotfQotCi1jb25zdCBjaGFyICoKLWh3X2ZpbmRfc3RyaW5nX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkJIGNvbnN0IGNoYXIgKnByb3BlcnR5KQotewotICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgbm9kZSA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IE5VTEwpCi0gICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKLSAgaWYgKG5vZGUtPnR5cGUgIT0gc3RyaW5nX3Byb3BlcnR5KQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChzdHJpbmcpIiwgcHJvcGVydHkpOwotICBzdHJpbmcgPSBub2RlLT5hcnJheTsKLSAgQVNTRVJUIChzdHJsZW4oc3RyaW5nKSArIDEgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotdm9pZAotaHdfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgICAgY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCi0JCQkgICAgICB1bnNpZ25lZCBucl9zdHJpbmdzKQotewotICBpbnQgc2l6ZW9mX2FycmF5OwotICBpbnQgc3RyaW5nX25yOwotICBjaGFyICphcnJheTsKLSAgY2hhciAqY2hwOwotICBpZiAobnJfc3RyaW5ncyA9PSAwKQotICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBtdXN0IGJlIG5vbi1udWxsIiwgcHJvcGVydHkpOwotICAvKiB0b3RhbCB1cCB0aGUgc2l6ZSBvZiB0aGUgbmVlZGVkIGFycmF5ICovCi0gIGZvciAoc2l6ZW9mX2FycmF5ID0gMCwgc3RyaW5nX25yID0gMDsKLSAgICAgICBzdHJpbmdfbnIgPCBucl9zdHJpbmdzOwotICAgICAgIHN0cmluZ19uciArKykKLSAgICB7Ci0gICAgICBzaXplb2ZfYXJyYXkgKz0gc3RybGVuIChzdHJpbmdzW3N0cmluZ19ucl0pICsgMTsKLSAgICB9Ci0gIC8qIGNyZWF0ZSB0aGUgYXJyYXkgKi8KLSAgYXJyYXkgPSAoY2hhciopIGh3X3phbGxvYyAobWUsIHNpemVvZl9hcnJheSk7Ci0gIGNocCA9IGFycmF5OwotICBmb3IgKHN0cmluZ19uciA9IDA7Ci0gICAgICAgc3RyaW5nX25yIDwgbnJfc3RyaW5nczsKLSAgICAgICBzdHJpbmdfbnIrKykKLSAgICB7Ci0gICAgICBzdHJjcHkgKGNocCwgc3RyaW5nc1tzdHJpbmdfbnJdKTsKLSAgICAgIGNocCArPSBzdHJsZW4gKGNocCkgKyAxOwotICAgIH0KLSAgQVNTRVJUIChjaHAgPT0gYXJyYXkgKyBzaXplb2ZfYXJyYXkpOwotICAvKiBub3cgZW50ZXIgaXQgKi8KLSAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHN0cmluZ19hcnJheV9wcm9wZXJ0eSwKLQkJICAgYXJyYXksIHNpemVvZl9hcnJheSwKLQkJICAgYXJyYXksIHNpemVvZl9hcnJheSwKLQkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLWludAotaHdfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkgICAgICAgdW5zaWduZWQgaW5kZXgsCi0JCQkgICAgICAgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZykKLXsKLSAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOwotICBub2RlID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5KTsKLSAgaWYgKG5vZGUgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgbm90IGZvdW5kIiwgcHJvcGVydHkpOwotICBzd2l0Y2ggKG5vZGUtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgotICAgICAgaWYgKGluZGV4ID09IDApCi0JewotCSAgKnN0cmluZyA9IG5vZGUtPmFycmF5OwotCSAgQVNTRVJUIChzdHJsZW4oKnN0cmluZykgKyAxID09IG5vZGUtPnNpemVvZl9hcnJheSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgotICAgICAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA9PSAwCi0JICB8fCAoKGNoYXIqKW5vZGUtPmFycmF5KVtub2RlLT5zaXplb2ZfYXJyYXkgLSAxXSAhPSAnXDAnKQotCWh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBpbnZhbGlkIGZvciBzdHJpbmcgYXJyYXkiLCBwcm9wZXJ0eSk7Ci0gICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLSAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKLSAgICAgIEFTU0VSVCAobm9kZS0+c2l6ZW9mX2FycmF5ID4gMCk7Ci0gICAgICBBU1NFUlQgKCgoY2hhciopbm9kZS0+YXJyYXkpW25vZGUtPnNpemVvZl9hcnJheSAtIDFdID09ICdcMCcpOwotICAgICAgewotCWNvbnN0IGNoYXIgKmNocCA9IG5vZGUtPmFycmF5OwotCWludCBucl9lbnRyaWVzID0gMDsKLQkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHN0cmluZ3MsIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgdGhlIG9uZQotCSAgIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0JKnN0cmluZyA9IGNocDsKLQlkbwotCSAgewotCSAgICBpZiAoKmNocCA9PSAnXDAnKQotCSAgICAgIHsKLQkJLyogbmV4dCBzdHJpbmcgKi8KLQkJbnJfZW50cmllcysrOwotCQljaHArKzsKLQkJaWYgKG5yX2VudHJpZXMgPT0gaW5kZXgpCi0JCSAgKnN0cmluZyA9IGNocDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNocCsrOwotCSAgICAgIH0KLQkgIH0gd2hpbGUgKGNocCA8IChjaGFyKilub2RlLT5hcnJheSArIG5vZGUtPnNpemVvZl9hcnJheSk7Ci0JaWYgKGluZGV4IDwgbnJfZW50cmllcykKLQkgIHJldHVybiBucl9lbnRyaWVzOwotCWVsc2UKLQkgIHsKLQkgICAgKnN0cmluZyA9IE5VTEw7Ci0JICAgIHJldHVybiAwOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotaHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJCSAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpvcmlnaW5hbCkKLXsKLSAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKm1hc3RlcjsKLSAgVFJBQ0UgKHRyYWNlX2RldmljZXMsCi0JICgiaHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShtZT0weCVseCwgcHJvcGVydHk9JXMsIC4uLilcbiIsCi0JICAobG9uZyltZSwgcHJvcGVydHkpKTsKLSAgaWYgKG9yaWdpbmFsLT5kaXNwb3NpdGlvbiAhPSBwZXJtZW5hbnRfb2JqZWN0KQotICAgIGh3X2Fib3J0IChtZSwgIkNhbiBvbmx5IGR1cGxpY2F0ZSBwZXJtZW5hbnQgb2JqZWN0cyIpOwotICAvKiBmaW5kIHRoZSBvcmlnaW5hbCdzIG1hc3RlciAqLwotICBtYXN0ZXIgPSBvcmlnaW5hbC0+b3duZXItPnByb3BlcnRpZXNfb2ZfaHc7Ci0gIHdoaWxlIChtYXN0ZXItPnByb3BlcnR5ICE9IG9yaWdpbmFsKQotICAgIHsKLSAgICAgIG1hc3RlciA9IG1hc3Rlci0+bmV4dDsKLSAgICAgIEFTU0VSVChtYXN0ZXIgIT0gTlVMTCk7Ci0gICAgfQotICAvKiBub3cgZHVwbGljYXRlIGl0ICovCi0gIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LAotCQkgICBvcmlnaW5hbC0+dHlwZSwKLQkJICAgbWFzdGVyLT5pbml0X2FycmF5LCBtYXN0ZXItPnNpemVvZl9pbml0X2FycmF5LAotCQkgICBvcmlnaW5hbC0+YXJyYXksIG9yaWdpbmFsLT5zaXplb2ZfYXJyYXksCi0JCSAgIG9yaWdpbmFsLCBwZXJtZW5hbnRfb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcHJvcGVydGllcy5oIGIvc2ltL2NvbW1vbi9ody1wcm9wZXJ0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWZiYTMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody1wcm9wZXJ0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBIV19QUk9QRVJUSUVTX0gKLSNkZWZpbmUgSFdfUFJPUEVSVElFU19ICi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIHByb3BlcnR5IHR5cGVzLiAgVGhlIHByb3BlcnR5IGBhcnJheScgaXMKLSAgIGZvciBnZW5lcmljIHVudHlwZWQgZGF0YS4gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgYXJyYXlfcHJvcGVydHksCi0gIGJvb2xlYW5fcHJvcGVydHksCi0jaWYgMAotICBpaGFuZGxlX3Byb3BlcnR5LCAvKnJ1bnRpbWUqLwotI2VuZGlmCi0gIGludGVnZXJfcHJvcGVydHksCi0gIHJhbmdlX2FycmF5X3Byb3BlcnR5LAotICByZWdfYXJyYXlfcHJvcGVydHksCi0gIHN0cmluZ19wcm9wZXJ0eSwKLSAgc3RyaW5nX2FycmF5X3Byb3BlcnR5LAotfSBod19wcm9wZXJ0eV90eXBlOwotCi1zdHJ1Y3QgaHdfcHJvcGVydHkgewotICBzdHJ1Y3QgaHcgKm93bmVyOwotICBjb25zdCBjaGFyICpuYW1lOwotICBod19wcm9wZXJ0eV90eXBlIHR5cGU7Ci0gIHVuc2lnbmVkIHNpemVvZl9hcnJheTsKLSAgY29uc3Qgdm9pZCAqYXJyYXk7Ci0gIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqb3JpZ2luYWw7Ci0gIG9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbjsKLX07Ci0KLSNkZWZpbmUgaHdfcHJvcGVydHlfb3duZXIocCkgKChwKS0+b3duZXIgKyAwKQotI2RlZmluZSBod19wcm9wZXJ0eV9uYW1lKHApICgocCktPm5hbWUgKyAwKQotI2RlZmluZSBod19wcm9wZXJ0eV90eXBlKHApICgocCktPnR5cGUgKyAwKQotI2RlZmluZSBod19wcm9wZXJ0eV9hcnJheShwKSAoKHApLT5hcnJheSArIDApCi0jZGVmaW5lIGh3X3Byb3BlcnR5X3NpemVvZl9hcnJheShwKSAoKHApLT5zaXplb2ZfYXJyYXkgKyAwKQotI2RlZmluZSBod19wcm9wZXJ0eV9vcmlnaW5hbChwKSAoKHApLT5vcmlnaW5hbCArIDApCi0jZGVmaW5lIGh3X3Byb3BlcnR5X2Rpc3Bvc2l0aW9uKHApICgocCktPmRpc3Bvc2l0aW9uICsgMCkKLQotCi0vKiBGaW5kL2l0ZXJhdGUgb3ZlciBwcm9wZXJpdGVzIGF0dGFjaGVkIHRvIGEgZGV2aWNlLgotCi0gICBUbyBpdGVyYXRlIG92ZXIgYWxsIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8gYSBkZXZpY2UsIGNhbGwKLSAgIGh3X2ZpbmRfcHJvcGVydHkgKC4uLCBOVUxMKSBhbmQgdGhlbiBod19wcm9wZXJ0eV9uZXh0LiAqLwotCi1jb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKmh3X2ZpbmRfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKLQotY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpod19uZXh0X3Byb3BlcnR5Ci0oY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpwcmV2aW91cyk7Ci0KLQotLyogTWFuaXB1bGF0ZSB0aGUgcHJvcGVydGllcyBiZWxvbmdpbmcgdG8gYSBnaXZlbiBkZXZpY2UuCi0KLSAgIEhXX0FERF8qIHdpbGwsIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYWxyZWFkeSBwcmVzZW50LCBhZGQgYQotICAgcHJvcGVydHkgdG8gdGhlIGRldmljZS4gIEFkZGluZyBhIHByb3BlcnR5IHRvIGEgZGV2aWNlIGFmdGVyIGl0IGhhcwotICAgYmVlbiBjcmVhdGVkIGlzIGEgY2hlY2tlZCBydW4tdGltZSBlcnJvciAodXNlIEhXX1NFVF8qKS4KLQotICAgSFdfU0VUXyogd2lsbCBhbHdheXMgdXBkYXRlIChvciBjcmVhdGUpIHRoZSBwcm9wZXJ0eSBzbyB0aGF0IGl0IGhhcwotICAgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIENoYW5naW5nIHRoZSB0eXBlIG9mIGEgcHJvcGVydHkgaXMgYSBjaGVja2VkCi0gICBydW4tdGltZSBlcnJvci4KLQotICAgRklORCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyB2YWx1ZS4gIEl0IGlzIGEgY2hlY2tlZAotICAgcnVudGltZSBlcnJvciB0byBlaXRoZXIgcmVxdWVzdCBhIG5vbmV4aXN0YW50IHByb3BlcnR5IG9yIHRvCi0gICByZXF1ZXN0IGEgcHJvcGVydHkgdXNpbmcgdGhlIHdyb25nIHR5cGUuIENvZGUgbG9jYXRpbmcgYSBwcm9wZXJ0eQotICAgc2hvdWxkIGZpcnN0IGNoZWNrIGl0cyB0eXBlICh1c2luZyBod19maW5kX3Byb3BlcnR5IGFib3ZlKSBhbmQgdGhlbgotICAgb2J0YWluIGl0cyB2YWx1ZSB1c2luZyB0aGUgYmVsb3cuCi0KLSAgIE5hbWluZyBjb252ZW50aW9uOgotCi0gICB2b2lkIGh3X2FkZF88dHlwZT5fcHJvcGVydHkoc3RydWN0IGh3ICosIGNvbnN0IGNoYXIgKiwgPHR5cGU+KQotICAgdm9pZCBod19hZGRfKl9hcnJheV9wcm9wZXJ0eShzdHJ1Y3QgaHcgKiwgY29uc3QgY2hhciAqLCBjb25zdCA8dHlwZT4qLCBpbnQpCi0gICB2b2lkIGh3X3NldF8qX3Byb3BlcnR5KHN0cnVjdCBodyAqLCBjb25zdCBjaGFyICosIDx0eXBlPikKLSAgIHZvaWQgaHdfc2V0XypfYXJyYXlfcHJvcGVydHkoc3RydWN0IGh3ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgPHR5cGU+KiwgaW50KQotICAgPHR5cGU+IGh3X2ZpbmRfKl9wcm9wZXJ0eShzdHJ1Y3QgaHcgKiwgY29uc3QgY2hhciAqKQotICAgaW50IGh3X2ZpbmRfKl9hcnJheV9wcm9wZXJ0eShzdHJ1Y3QgaHcgKiwgY29uc3QgY2hhciAqLCBpbnQsIDx0eXBlPiopCi0KLSAgICovCi0KLQotdm9pZCBod19hZGRfYXJyYXlfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIGNvbnN0IHZvaWQgKmFycmF5LAotIGludCBzaXplb2ZfYXJyYXkpOwotCi12b2lkIGh3X3NldF9hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3Qgdm9pZCAqYXJyYXksCi0gaW50IHNpemVvZl9hcnJheSk7Ci0KLWNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqaHdfZmluZF9hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHkpOwotCi0KLQotdm9pZCBod19hZGRfYm9vbGVhbl9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gaW50IGJvb2wpOwotCi1pbnQgaHdfZmluZF9ib29sZWFuX3Byb3BlcnR5Ci0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSk7Ci0KLQotCi0jaWYgMAotdHlwZWRlZiBzdHJ1Y3QgX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjIHsKLSAgY29uc3QgY2hhciAqZnVsbF9wYXRoOwotfSBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYzsKLQotdm9pZCBod19hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5Ci0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBjb25zdCBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSk7Ci0KLXZvaWQgaHdfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjICppaGFuZGxlKTsKLQotdm9pZCBod19zZXRfaWhhbmRsZV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gaHdfaW5zdGFuY2UgKmloYW5kbGUpOwotCi1od19pbnN0YW5jZSAqIGh3X2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHkpOwotI2VuZGlmCi0KLQotdm9pZCBod19hZGRfaW50ZWdlcl9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gc2lnbmVkX2NlbGwgaW50ZWdlcik7Ci0KLXNpZ25lZF9jZWxsIGh3X2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHkpOwotCi1pbnQgaHdfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5Ci0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSB1bnNpZ25lZCBpbmRleCwKLSBzaWduZWRfd29yZCAqaW50ZWdlcik7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCBfcmFuZ2VfcHJvcGVydHlfc3BlYyB7Ci0gIGh3X3VuaXQgY2hpbGRfYWRkcmVzczsKLSAgaHdfdW5pdCBwYXJlbnRfYWRkcmVzczsKLSAgaHdfdW5pdCBzaXplOwotfSByYW5nZV9wcm9wZXJ0eV9zcGVjOwotCi12b2lkIGh3X2FkZF9yYW5nZV9hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2VzLAotIHVuc2lnbmVkIG5yX3Jhbmdlcyk7Ci0KLWludCBod19maW5kX3JhbmdlX2FycmF5X3Byb3BlcnR5Ci0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSB1bnNpZ25lZCBpbmRleCwKLSByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZSk7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCBfcmVnX3Byb3BlcnR5X3NwZWMgewotICBod191bml0IGFkZHJlc3M7Ci0gIGh3X3VuaXQgc2l6ZTsKLX0gcmVnX3Byb3BlcnR5X3NwZWM7Ci0KLXZvaWQgaHdfYWRkX3JlZ19hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgcmVnX3Byb3BlcnR5X3NwZWMgKnJlZywKLSB1bnNpZ25lZCBucl9yZWdzKTsKLQotaW50IGh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5Ci0oc3RydWN0IGh3ICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSB1bnNpZ25lZCBpbmRleCwKLSByZWdfcHJvcGVydHlfc3BlYyAqcmVnKTsKLQotCi0KLXZvaWQgaHdfYWRkX3N0cmluZ19wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgY2hhciAqc3RyaW5nKTsKLQotY29uc3QgY2hhciAqaHdfZmluZF9zdHJpbmdfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKLQotCi0KLXR5cGVkZWYgY29uc3QgY2hhciAqc3RyaW5nX3Byb3BlcnR5X3NwZWM7Ci0KLXZvaWQgaHdfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCi0gdW5zaWduZWQgbnJfc3RyaW5ncyk7Ci0KLWludCBod19maW5kX3N0cmluZ19hcnJheV9wcm9wZXJ0eQotKHN0cnVjdCBodyAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gdW5zaWduZWQgaW5kZXgsCi0gc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZyk7Ci0KLQotCi12b2lkIGh3X2FkZF9kdXBsaWNhdGVfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqb3JpZ2luYWwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctdHJlZS5jIGIvc2ltL2NvbW1vbi9ody10cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzFiM2IuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ody10cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaW5jbHVkZSAiaHctbWFpbi5oIgotI2luY2x1ZGUgImh3LWJhc2UuaCIKLSNpbmNsdWRlICJody10cmVlLmgiCi0KLSNpbmNsdWRlICJzaW0taW8uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogbWFuaXB1bGF0ZS9sb29rdXAgZGV2aWNlIG5hbWVzICovCi0KLXR5cGVkZWYgc3RydWN0IF9uYW1lX3NwZWNpZmllciB7Ci0gIAotICAvKiBjb21wb25lbnRzIGluIHRoZSBmdWxsIGxlbmd0aCBuYW1lICovCi0gIGNoYXIgKnBhdGg7Ci0gIGNoYXIgKnByb3BlcnR5OwotICBjaGFyICp2YWx1ZTsKLSAgCi0gIC8qIGN1cnJlbnQgZGV2aWNlICovCi0gIGNoYXIgKmZhbWlseTsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqdW5pdDsKLSAgY2hhciAqYXJnczsKLSAgCi0gIC8qIHByZXZpb3VzIGRldmljZSAqLwotICBjaGFyICpsYXN0X25hbWU7Ci0gIGNoYXIgKmxhc3RfZmFtaWx5OwotICBjaGFyICpsYXN0X3VuaXQ7Ci0gIGNoYXIgKmxhc3RfYXJnczsKLSAgCi0gIC8qIHdvcmsgYXJlYSAqLwotICBjaGFyIGJ1ZlsxMDI0XTsKLSAgCi19IG5hbWVfc3BlY2lmaWVyOwotCi0KLQotLyogR2l2ZW4gYSBkZXZpY2Ugc3BlY2lmaWVyLCBicmVhayBpdCB1cCBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHM6Ci0gICBwYXRoIChhbmQgaWYgcHJlc2VudCkgcHJvcGVydHkgbmFtZSBhbmQgcHJvcGVydHkgdmFsdWUuICovCi0KLXN0YXRpYyBpbnQKLXNwbGl0X2RldmljZV9zcGVjaWZpZXIgKHN0cnVjdCBodyAqY3VycmVudCwKLQkJCWNvbnN0IGNoYXIgKmRldmljZV9zcGVjaWZpZXIsCi0JCQluYW1lX3NwZWNpZmllciAqc3BlYykKLXsKLSAgY2hhciAqY2hwID0gTlVMTDsKLSAgCi0gIC8qIGV4cGFuZCBhbnkgbGVhZGluZyBhbGlhcyBpZiBwcmVzZW50ICovCi0gIGlmIChjdXJyZW50ICE9IE5VTEwKLSAgICAgICYmICpkZXZpY2Vfc3BlY2lmaWVyICE9ICdcMCcKLSAgICAgICYmICpkZXZpY2Vfc3BlY2lmaWVyICE9ICcuJwotICAgICAgJiYgKmRldmljZV9zcGVjaWZpZXIgIT0gJy8nKQotICAgIHsKLSAgICAgIHN0cnVjdCBodyAqYWxpYXNlcyA9IGh3X3RyZWVfZmluZF9kZXZpY2UgKGN1cnJlbnQsICIvYWxpYXNlcyIpOwotICAgICAgY2hhciBhbGlhc1szMl07Ci0gICAgICBpbnQgbGVuID0gMDsKLSAgICAgIHdoaWxlIChkZXZpY2Vfc3BlY2lmaWVyW2xlbl0gIT0gJ1wwJwotCSAgICAgJiYgZGV2aWNlX3NwZWNpZmllcltsZW5dICE9ICcvJwotCSAgICAgJiYgZGV2aWNlX3NwZWNpZmllcltsZW5dICE9ICc6JwotCSAgICAgJiYgIWlzc3BhY2UgKGRldmljZV9zcGVjaWZpZXJbbGVuXSkpCi0JewotCSAgYWxpYXNbbGVuXSA9IGRldmljZV9zcGVjaWZpZXJbbGVuXTsKLQkgIGxlbisrOwotCSAgaWYgKGxlbiA+PSBzaXplb2YoYWxpYXMpKQotCSAgICBod19hYm9ydCAoTlVMTCwgInNwbGl0X2RldmljZV9zcGVjaWZpZXI6IGJ1ZmZlciBvdmVyZmxvdyIpOwotCX0KLSAgICAgIGFsaWFzW2xlbl0gPSAnXDAnOwotICAgICAgaWYgKGFsaWFzZXMgIT0gTlVMTAotCSAgJiYgaHdfZmluZF9wcm9wZXJ0eSAoYWxpYXNlcywgYWxpYXMpKQotCXsKLQkgIHN0cmNweSAoc3BlYy0+YnVmLCBod19maW5kX3N0cmluZ19wcm9wZXJ0eShhbGlhc2VzLCBhbGlhcykpOwotCSAgc3RyY2F0IChzcGVjLT5idWYsIGRldmljZV9zcGVjaWZpZXIgKyBsZW4pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjcHkgKHNwZWMtPmJ1ZiwgZGV2aWNlX3NwZWNpZmllcik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmNweShzcGVjLT5idWYsIGRldmljZV9zcGVjaWZpZXIpOwotICAgIH0KLSAgCi0gIC8qIGNoZWNrIG5vIG92ZXJmbG93ICovCi0gIGlmIChzdHJsZW4oc3BlYy0+YnVmKSA+PSBzaXplb2Yoc3BlYy0+YnVmKSkKLSAgICBod19hYm9ydCAoTlVMTCwgInNwbGl0X2RldmljZV9zcGVjaWZpZXI6IGJ1ZmZlciBvdmVyZmxvd1xuIik7Ci0gIAotICAvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcyAqLwotICBjaHAgPSBzcGVjLT5idWY7Ci0gIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgaXNzcGFjZSgqY2hwKSkKLSAgICBjaHArKzsKLSAgaWYgKCpjaHAgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIGZpbmQgdGhlIHBhdGggYW5kIHRlcm1pbmF0ZSBpdCB3aXRoIG51bGwgKi8KLSAgc3BlYy0+cGF0aCA9IGNocDsKLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiAhaXNzcGFjZSgqY2hwKSkKLSAgICBjaHArKzsKLSAgaWYgKCpjaHAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAqY2hwID0gJ1wwJzsKLSAgICAgIGNocCsrOwotICAgIH0KLSAgCi0gIC8qIGFuZCBhbnkgdmFsdWUgKi8KLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiBpc3NwYWNlKCpjaHApKQotICAgIGNocCsrOwotICBzcGVjLT52YWx1ZSA9IGNocDsKLSAgCi0gIC8qIG5vdyBnbyBiYWNrIGFuZCBjaG9wIHRoZSBwcm9wZXJ0eSBvZmYgb2YgdGhlIHBhdGggKi8KLSAgaWYgKHNwZWMtPnZhbHVlWzBdID09ICdcMCcpCi0gICAgewotICAgICAgc3BlYy0+cHJvcGVydHkgPSBOVUxMOyAvKm5vdCBhIHByb3BlcnR5Ki8KLSAgICAgIHNwZWMtPnZhbHVlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNwZWMtPnZhbHVlWzBdID09ICc+JwotCSAgIHx8IHNwZWMtPnZhbHVlWzBdID09ICc8JykKLSAgICB7Ci0gICAgICAvKiBhbiBpbnRlcnJ1cHQgc3BlYyAqLwotICAgICAgc3BlYy0+cHJvcGVydHkgPSBOVUxMOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgY2hwID0gc3RycmNocihzcGVjLT5wYXRoLCAnLycpOwotICAgIGlmIChjaHAgPT0gTlVMTCkKLSAgICAgIHsKLQlzcGVjLT5wcm9wZXJ0eSA9IHNwZWMtPnBhdGg7Ci0Jc3BlYy0+cGF0aCA9IHN0cmNocihzcGVjLT5wcm9wZXJ0eSwgJ1wwJyk7Ci0gICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAqY2hwID0gJ1wwJzsKLSAgICAgIHNwZWMtPnByb3BlcnR5ID0gY2hwKzE7Ci0gICAgfQotICB9Ci0gIAotICAvKiBhbmQgbWFyayB0aGUgcmVzdCBhcyBpbnZhbGlkICovCi0gIHNwZWMtPm5hbWUgPSBOVUxMOwotICBzcGVjLT5mYW1pbHkgPSBOVUxMOwotICBzcGVjLT51bml0ID0gTlVMTDsKLSAgc3BlYy0+YXJncyA9IE5VTEw7Ci0gIHNwZWMtPmxhc3RfbmFtZSA9IE5VTEw7Ci0gIHNwZWMtPmxhc3RfZmFtaWx5ID0gTlVMTDsKLSAgc3BlYy0+bGFzdF91bml0ID0gTlVMTDsKLSAgc3BlYy0+bGFzdF9hcmdzID0gTlVMTDsKLSAgCi0gIHJldHVybiAxOwotfQotCi0KLS8qIGdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciBicmVhayBpdCB1cCBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHMgLQotICAgcGF0aCBhbmQgcHJvcGVydHkgbmFtZSAtIGFzc3VtaW5nIHRoYXQgdGhlIGxhc3QgYGRldmljZScgaXMgYQotICAgcHJvcGVydHkgbmFtZS4gKi8KLQotc3RhdGljIGludAotc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyIChzdHJ1Y3QgaHcgKmN1cnJlbnQsCi0JCQkgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3NwZWNpZmllciwKLQkJCSAgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGlmIChzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyIChjdXJyZW50LCBwcm9wZXJ0eV9zcGVjaWZpZXIsIHNwZWMpKQotICAgIHsKLSAgICAgIGlmIChzcGVjLT5wcm9wZXJ0eSA9PSBOVUxMKQotCXsKLQkgIC8qIGZvcmNlIHRoZSBsYXN0IG5hbWUgdG8gYmUgYSBwcm9wZXJ0eSBuYW1lICovCi0JICBjaGFyICpjaHAgPSBzdHJyY2hyIChzcGVjLT5wYXRoLCAnLycpOwotCSAgaWYgKGNocCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BlYy0+cHJvcGVydHkgPSBzcGVjLT5wYXRoOwotCSAgICAgIHNwZWMtPnBhdGggPSBzdHJyY2hyIChzcGVjLT5wcm9wZXJ0eSwgJ1wwJyk7OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqY2hwID0gJ1wwJzsKLQkgICAgICBzcGVjLT5wcm9wZXJ0eSA9IGNocCArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBkZXZpY2UgdGhlIG5leHQgZGV2aWNlIG5hbWUgYW5kIHNwbGl0IGl0IHVwLCByZXR1cm4gMCB3aGVuIG5vIG1vcmUKLSAgIG5hbWVzIHRvIHN0cnVjdCBodyAqLwotCi1zdGF0aWMgaW50Ci1zcGxpdF9kZXZpY2VfbmFtZSAobmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGNoYXIgKmNocDsKLSAgLyogcmVtZW1iZXIgd2hhdCBjYW1lIGJlZm9yZSAqLwotICBzcGVjLT5sYXN0X25hbWUgPSBzcGVjLT5uYW1lOwotICBzcGVjLT5sYXN0X2ZhbWlseSA9IHNwZWMtPmZhbWlseTsKLSAgc3BlYy0+bGFzdF91bml0ID0gc3BlYy0+dW5pdDsKLSAgc3BlYy0+bGFzdF9hcmdzID0gc3BlYy0+YXJnczsKLSAgLyogZmluaXNoZWQ/ICovCi0gIGlmIChzcGVjLT5wYXRoWzBdID09ICdcMCcpCi0gICAgewotICAgICAgc3BlYy0+bmFtZSA9IE5VTEw7Ci0gICAgICBzcGVjLT5mYW1pbHkgPSBOVUxMOwotICAgICAgc3BlYy0+dW5pdCA9IE5VTEw7Ci0gICAgICBzcGVjLT5hcmdzID0gTlVMTDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogYnJlYWsgdGhlIGN1cnJlbnQgZGV2aWNlIHNwZWMgZnJvbSB0aGUgcGF0aCAqLwotICBzcGVjLT5uYW1lID0gc3BlYy0+cGF0aDsKLSAgY2hwID0gc3RyY2hyIChzcGVjLT5uYW1lLCAnLycpOwotICBpZiAoY2hwID09IE5VTEwpCi0gICAgc3BlYy0+cGF0aCA9IHN0cmNociAoc3BlYy0+bmFtZSwgJ1wwJyk7Ci0gIGVsc2UgCi0gICAgewotICAgICAgc3BlYy0+cGF0aCA9IGNocCsxOwotICAgICAgKmNocCA9ICdcMCc7Ci0gICAgfQotICAvKiBicmVhayBvdXQgdGhlIGJhc2UgKi8KLSAgaWYgKHNwZWMtPm5hbWVbMF0gPT0gJygnKQotICAgIHsKLSAgICAgIGNocCA9IHN0cmNocihzcGVjLT5uYW1lLCAnKScpOwotICAgICAgaWYgKGNocCA9PSBOVUxMKQotCXsKLQkgIHNwZWMtPmZhbWlseSA9IHNwZWMtPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpjaHAgPSAnXDAnOwotCSAgc3BlYy0+ZmFtaWx5ID0gc3BlYy0+bmFtZSArIDE7Ci0JICBzcGVjLT5uYW1lID0gY2hwICsgMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3BlYy0+ZmFtaWx5ID0gc3BlYy0+bmFtZTsKLSAgICB9Ci0gIC8qIG5vdyBicmVhayBvdXQgdGhlIHVuaXQgKi8KLSAgY2hwID0gc3RyY2hyKHNwZWMtPm5hbWUsICdAJyk7Ci0gIGlmIChjaHAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzcGVjLT51bml0ID0gTlVMTDsKLSAgICAgIGNocCA9IHNwZWMtPm5hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmNocCA9ICdcMCc7Ci0gICAgICBjaHAgKz0gMTsKLSAgICAgIHNwZWMtPnVuaXQgPSBjaHA7Ci0gICAgfQotICAvKiBmaW5hbGx5IGFueSBhcmdzICovCi0gIGNocCA9IHN0cmNocihjaHAsICc6Jyk7Ci0gIGlmIChjaHAgPT0gTlVMTCkKLSAgICBzcGVjLT5hcmdzID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgICpjaHAgPSAnXDAnOwotICAgICAgc3BlYy0+YXJncyA9IGNocCsxOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogZGV2aWNlIHRoZSB2YWx1ZSwgcmV0dXJuaW5nIHRoZSBuZXh0IG5vbi1zcGFjZSB0b2tlbiAqLwotCi1zdGF0aWMgY2hhciAqCi1zcGxpdF92YWx1ZSAobmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGNoYXIgKnRva2VuOwotICBpZiAoc3BlYy0+dmFsdWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCi0gIHdoaWxlIChpc3NwYWNlIChzcGVjLT52YWx1ZVswXSkpCi0gICAgc3BlYy0+dmFsdWUrKzsKLSAgaWYgKHNwZWMtPnZhbHVlWzBdID09ICdcMCcpCi0gICAgewotICAgICAgc3BlYy0+dmFsdWUgPSBOVUxMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB0b2tlbiA9IHNwZWMtPnZhbHVlOwotICAvKiBmaW5kIHRyYWlsaW5nIHNwYWNlICovCi0gIHdoaWxlIChzcGVjLT52YWx1ZVswXSAhPSAnXDAnICYmICFpc3NwYWNlIChzcGVjLT52YWx1ZVswXSkpCi0gICAgc3BlYy0+dmFsdWUrKzsKLSAgLyogY2hvcCB0aGlzIHZhbHVlIG91dCAqLwotICBpZiAoc3BlYy0+dmFsdWVbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzcGVjLT52YWx1ZVswXSA9ICdcMCc7Ci0gICAgICBzcGVjLT52YWx1ZSsrOwotICAgIH0KLSAgcmV0dXJuIHRva2VuOwotfQotCi0KLQotLyogdHJhdmVyc2UgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHNwZWMgc3RhcnRpbmcgYXQgY3VycmVudCAqLwotCi1zdGF0aWMgc3RydWN0IGh3ICoKLXNwbGl0X2ZpbmRfZGV2aWNlIChzdHJ1Y3QgaHcgKmN1cnJlbnQsCi0JCSAgIG5hbWVfc3BlY2lmaWVyICpzcGVjKQotewotICAvKiBzdHJpcCBvZmYgKGFuZCBwcm9jZXNzKSBhbnkgbGVhZGluZyAuLCAuLiwgLi8gYW5kIC8gKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHNwZWMtPnBhdGgsICIvIiwgc3RybGVuICgiLyIpKSA9PSAwKQotCXsKLQkgIC8qIGNkIC8uLi4gKi8KLQkgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgaHdfcGFyZW50IChjdXJyZW50KSAhPSBOVUxMKQotCSAgICBjdXJyZW50ID0gaHdfcGFyZW50IChjdXJyZW50KTsKLQkgIHNwZWMtPnBhdGggKz0gc3RybGVuICgiLyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNwZWMtPnBhdGgsICIuLyIsIHN0cmxlbiAoIi4vIikpID09IDApCi0JewotCSAgLyogY2QgLi8uLi4gKi8KLQkgIGN1cnJlbnQgPSBjdXJyZW50OwotCSAgc3BlYy0+cGF0aCArPSBzdHJsZW4gKCIuLyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNwZWMtPnBhdGgsICIuLi8iLCBzdHJsZW4gKCIuLi8iKSkgPT0gMCkKLQl7Ci0JICAvKiBjZCAuLi8uLi4gKi8KLQkgIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgaHdfcGFyZW50IChjdXJyZW50KSAhPSBOVUxMKQotCSAgICBjdXJyZW50ID0gaHdfcGFyZW50IChjdXJyZW50KTsKLQkgIHNwZWMtPnBhdGggKz0gc3RybGVuICgiLi4vIik7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChzcGVjLT5wYXRoLCAiLiIpID09IDApCi0JewotCSAgLyogY2QgLiAqLwotCSAgY3VycmVudCA9IGN1cnJlbnQ7Ci0JICBzcGVjLT5wYXRoICs9IHN0cmxlbiAoIi4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNwZWMtPnBhdGgsICIuLiIpID09IDApCi0JewotCSAgLyogY2QgLi4gKi8KLQkgIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgaHdfcGFyZW50IChjdXJyZW50KSAhPSBOVUxMKQotCSAgICBjdXJyZW50ID0gaHdfcGFyZW50IChjdXJyZW50KTsKLQkgIHNwZWMtPnBhdGggKz0gc3RybGVuICgiLi4iKTsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotICAKLSAgLyogbm93IGdvIHRocm91Z2ggdGhlIHBhdGggcHJvcGVyICovCi0gIAotICBpZiAoY3VycmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNwbGl0X2RldmljZV9uYW1lIChzcGVjKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIHdoaWxlIChzcGxpdF9kZXZpY2VfbmFtZSAoc3BlYykpCi0gICAgewotICAgICAgc3RydWN0IGh3ICpjaGlsZDsKLSAgICAgIGZvciAoY2hpbGQgPSBod19jaGlsZCAoY3VycmVudCk7Ci0JICAgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBod19zaWJsaW5nIChjaGlsZCkpCi0JewotCSAgaWYgKHN0cmNtcCAoc3BlYy0+bmFtZSwgaHdfbmFtZSAoY2hpbGQpKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwZWMtPnVuaXQgPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHdfdW5pdCBwaHlzOwotCQkgIGh3X3VuaXRfZGVjb2RlIChjdXJyZW50LCBzcGVjLT51bml0LCAmcGh5cyk7Ci0JCSAgaWYgKG1lbWNtcCAoJnBoeXMsIGh3X3VuaXRfYWRkcmVzcyAoY2hpbGQpLAotCQkJICAgICAgc2l6ZW9mIChod191bml0KSkgPT0gMCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY2hpbGQgPT0gTlVMTCkKLQlyZXR1cm4gY3VycmVudDsgLyogc2VhcmNoIGZhaWxlZCAqLwotICAgICAgY3VycmVudCA9IGNoaWxkOwotICAgIH0KLSAgCi0gIHJldHVybiBjdXJyZW50OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgaHcgKgotc3BsaXRfZmlsbF9wYXRoIChzdHJ1Y3QgaHcgKmN1cnJlbnQsCi0JCSBjb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAotCQkgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIC8qIGJyZWFrIGl0IHVwICovCi0gIGlmICghc3BsaXRfZGV2aWNlX3NwZWNpZmllciAoY3VycmVudCwgZGV2aWNlX3NwZWNpZmllciwgc3BlYykpCi0gICAgaHdfYWJvcnQgKGN1cnJlbnQsICJlcnJvciBwYXJzaW5nICVzXG4iLCBkZXZpY2Vfc3BlY2lmaWVyKTsKLSAgCi0gIC8qIGZpbGwgb3VyIHRyZWUgd2l0aCBpdHMgY29udGVudHMgKi8KLSAgY3VycmVudCA9IHNwbGl0X2ZpbmRfZGV2aWNlIChjdXJyZW50LCBzcGVjKTsKLSAgCi0gIC8qIGFkZCBhbnkgYWRkaXRpb25hbCBkZXZpY2VzIGFzIG5lZWRlZCAqLwotICBpZiAoc3BlYy0+bmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgaWYgKGN1cnJlbnQgIT0gTlVMTCAmJiAhaHdfZmluaXNoZWRfcCAoY3VycmVudCkpCi0JICAgIGh3X2ZpbmlzaCAoY3VycmVudCk7Ci0JICBjdXJyZW50ID0gaHdfY3JlYXRlIChOVUxMLAotCQkJICAgICAgIGN1cnJlbnQsCi0JCQkgICAgICAgc3BlYy0+ZmFtaWx5LAotCQkJICAgICAgIHNwZWMtPm5hbWUsCi0JCQkgICAgICAgc3BlYy0+dW5pdCwKLQkJCSAgICAgICBzcGVjLT5hcmdzKTsKLQl9Ci0gICAgICB3aGlsZSAoc3BsaXRfZGV2aWNlX25hbWUgKHNwZWMpKTsKLSAgICB9Ci0gIAotICByZXR1cm4gY3VycmVudDsKLX0KLQotDAotLyogPG5vbi13aGl0ZS1zcGFjZT4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2tpcF90b2tlbihjb25zdCBjaGFyICpjaHApCi17Ci0gIHdoaWxlICghaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCi0gICAgY2hwKys7Ci0gIHdoaWxlIChpc3NwYWNlKCpjaHApICYmICpjaHAgIT0gJ1wwJykKLSAgICBjaHArKzsKLSAgcmV0dXJuIGNocDsKLX0KLQotCi0vKiBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgKi8KLQotc3RhdGljIGludAotY291bnRfZW50cmllcyAoc3RydWN0IGh3ICpjdXJyZW50LAotCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAotCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSwKLQkgICAgICAgaW50IG1vZHVsbykKLXsKLSAgY29uc3QgY2hhciAqY2hwID0gcHJvcGVydHlfdmFsdWU7Ci0gIGludCBucl9lbnRyaWVzID0gMDsKLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBucl9lbnRyaWVzICs9IDE7Ci0gICAgICBjaHAgPSBza2lwX3Rva2VuIChjaHApOwotICAgIH0KLSAgaWYgKChucl9lbnRyaWVzICUgbW9kdWxvKSAhPSAwKQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChjdXJyZW50LCAiaW5jb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzIGZvciAlcyBwcm9wZXJ0eSAlcywgc2hvdWxkIGJlIG11bHRpcGxlIG9mICVkIiwKLQkJcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUsIG1vZHVsbyk7Ci0gICAgfQotICByZXR1cm4gbnJfZW50cmllcyAvIG1vZHVsbzsKLX0KLQotCi0KLS8qIHBhcnNlOiA8YWRkcmVzcz4gOjo9IDx0b2tlbj4gOyBkZXZpY2UgZGVwZW5kYW50ICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2FkZHJlc3MgKHN0cnVjdCBodyAqY3VycmVudCwKLQkgICAgICAgc3RydWN0IGh3ICpidXMsCi0JICAgICAgIGNvbnN0IGNoYXIgKmNocCwKLQkgICAgICAgaHdfdW5pdCAqYWRkcmVzcykKLXsKLSAgaWYgKGh3X3VuaXRfZGVjb2RlIChidXMsIGNocCwgYWRkcmVzcykgPCAwKQotICAgIGh3X2Fib3J0IChjdXJyZW50LCAiaW52YWxpZCB1bml0IGFkZHJlc3MgaW4gJXMiLCBjaHApOwotICByZXR1cm4gc2tpcF90b2tlbiAoY2hwKTsKLX0KLQotCi0vKiBwYXJzZTogPHNpemU+IDo6PSA8bnVtYmVyPiB7ICIsIiA8bnVtYmVyPiB9IDsgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2Vfc2l6ZSAoc3RydWN0IGh3ICpjdXJyZW50LAotCSAgICBzdHJ1Y3QgaHcgKmJ1cywKLQkgICAgY29uc3QgY2hhciAqY2hwLAotCSAgICBod191bml0ICpzaXplKQotewotICBpbnQgaTsKLSAgaW50IG5yOwotICBjb25zdCBjaGFyICpjdXJyID0gY2hwOwotICBtZW1zZXQoc2l6ZSwgMCwgc2l6ZW9mKCpzaXplKSk7Ci0gIC8qIHBhcnNlIHRoZSBudW1lcmljIGxpc3QgKi8KLSAgc2l6ZS0+bnJfY2VsbHMgPSBod191bml0X25yX3NpemVfY2VsbHMgKGJ1cyk7Ci0gIG5yID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqbmV4dDsKLSAgICAgIHNpemUtPmNlbGxzW25yXSA9IHN0cnRvdWwgKGN1cnIsICZuZXh0LCAwKTsKLSAgICAgIGlmIChjdXJyID09IG5leHQpCi0JaHdfYWJvcnQgKGN1cnJlbnQsICJQcm9ibGVtIHBhcnNpbmcgPHNpemU+ICVzIiwgY2hwKTsKLSAgICAgIG5yICs9IDE7Ci0gICAgICBpZiAobmV4dFswXSAhPSAnLCcpCi0JYnJlYWs7Ci0gICAgICBpZiAobnIgPT0gc2l6ZS0+bnJfY2VsbHMpCi0JaHdfYWJvcnQgKGN1cnJlbnQsICJUb28gbWFueSB2YWx1ZXMgaW4gPHNpemU+ICVzIiwgY2hwKTsKLSAgICAgIGN1cnIgPSBuZXh0ICsgMTsKLSAgICB9Ci0gIEFTU0VSVCAobnIgPiAwICYmIG5yIDw9IHNpemUtPm5yX2NlbGxzKTsKLSAgLyogcmlnaHQgYWxpZ24gdGhlIG51bWJlcnMgKi8KLSAgZm9yIChpID0gMTsgaSA8PSBzaXplLT5ucl9jZWxsczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpIDw9IG5yKQotCXNpemUtPmNlbGxzW3NpemUtPm5yX2NlbGxzIC0gaV0gPSBzaXplLT5jZWxsc1tuciAtIGldOwotICAgICAgZWxzZQotCXNpemUtPmNlbGxzW3NpemUtPm5yX2NlbGxzIC0gaV0gPSAwOwotICAgIH0KLSAgcmV0dXJuIHNraXBfdG9rZW4gKGNocCk7Ci19Ci0KLQotLyogcGFyc2U6IDxyZWc+IDo6PSB7IDxhZGRyZXNzPiA8c2l6ZT4gfSA7ICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9yZWdfcHJvcGVydHkgKHN0cnVjdCBodyAqY3VycmVudCwKLQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKLXsKLSAgaW50IG5yX3JlZ3M7Ci0gIGludCByZWdfbnI7Ci0gIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzOwotICBjb25zdCBjaGFyICpjaHA7Ci0gIAotICAvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByZWcgZW50cmllcyBieSBjb3VudGluZyB0b2tlbnMgKi8KLSAgbnJfcmVncyA9IGNvdW50X2VudHJpZXMgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCAyKTsKLSAgCi0gIC8qIGNyZWF0ZSB3b3JraW5nIHNwYWNlICovCi0gIHJlZ3MgPSB6YWxsb2MgKG5yX3JlZ3MgKiBzaXplb2YgKCpyZWdzKSk7Ci0gIAotICAvKiBmaWxsIGl0IGluICovCi0gIGNocCA9IHByb3BlcnR5X3ZhbHVlOwotICBmb3IgKHJlZ19uciA9IDA7IHJlZ19uciA8IG5yX3JlZ3M7IHJlZ19ucisrKQotICAgIHsKLSAgICAgIGNocCA9IHBhcnNlX2FkZHJlc3MgKGN1cnJlbnQsIGh3X3BhcmVudChjdXJyZW50KSwKLQkJCSAgIGNocCwgJnJlZ3NbcmVnX25yXS5hZGRyZXNzKTsKLSAgICAgIGNocCA9IHBhcnNlX3NpemUgKGN1cnJlbnQsIGh3X3BhcmVudChjdXJyZW50KSwKLQkJCWNocCwgJnJlZ3NbcmVnX25yXS5zaXplKTsKLSAgICB9Ci0gIAotICAvKiBjcmVhdGUgaXQgKi8KLSAgaHdfYWRkX3JlZ19hcnJheV9wcm9wZXJ0eSAoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKLQkJCSAgICAgcmVncywgbnJfcmVncyk7Ci0gIAotICB6ZnJlZSAocmVncyk7Ci19Ci0KLQotLyogeyA8Y2hpbGQtYWRkcmVzcz4gPHBhcmVudC1hZGRyZXNzPiA8Y2hpbGQtc2l6ZT4gfSogKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX3Jhbmdlc19wcm9wZXJ0eSAoc3RydWN0IGh3ICpjdXJyZW50LAotCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQotewotICBpbnQgbnJfcmFuZ2VzOwotICBpbnQgcmFuZ2VfbnI7Ci0gIHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlczsKLSAgY29uc3QgY2hhciAqY2hwOwotICAKLSAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHNwZWNpZmllZCAqLwotICBucl9yYW5nZXMgPSBjb3VudF9lbnRyaWVzIChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCBwcm9wZXJ0eV92YWx1ZSwgMyk7Ci0gIAotICAvKiBjcmVhdGUgYSBwcm9wZXJ0eSBvZiB0aGF0IHNpemUgKi8KLSAgcmFuZ2VzID0gemFsbG9jIChucl9yYW5nZXMgKiBzaXplb2YoKnJhbmdlcykpOwotICAKLSAgLyogZmlsbCBpdCBpbiAqLwotICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKLSAgZm9yIChyYW5nZV9uciA9IDA7IHJhbmdlX25yIDwgbnJfcmFuZ2VzOyByYW5nZV9ucisrKQotICAgIHsKLSAgICAgIGNocCA9IHBhcnNlX2FkZHJlc3MgKGN1cnJlbnQsIGN1cnJlbnQsCi0JCQkgICBjaHAsICZyYW5nZXNbcmFuZ2VfbnJdLmNoaWxkX2FkZHJlc3MpOwotICAgICAgY2hwID0gcGFyc2VfYWRkcmVzcyAoY3VycmVudCwgaHdfcGFyZW50KGN1cnJlbnQpLAotCQkJICAgY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5wYXJlbnRfYWRkcmVzcyk7Ci0gICAgICBjaHAgPSBwYXJzZV9zaXplIChjdXJyZW50LCBjdXJyZW50LAotCQkJY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5zaXplKTsKLSAgICB9Ci0gIAotICAvKiBjcmVhdGUgaXQgKi8KLSAgaHdfYWRkX3JhbmdlX2FycmF5X3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCByYW5nZXMsIG5yX3Jhbmdlcyk7Ci0gIAotICB6ZnJlZSAocmFuZ2VzKTsKLX0KLQotCi0vKiA8aW50ZWdlcj4gLi4uICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9pbnRlZ2VyX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKmN1cnJlbnQsCi0JCQljb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAotCQkJY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUpCi17Ci0gIGludCBucl9lbnRyaWVzOwotICB1bnNpZ25lZF9jZWxsIHdvcmRzWzEwMjRdOwotICAvKiBpbnRlZ2VyIG9yIGludGVnZXIgYXJyYXk/ICovCi0gIG5yX2VudHJpZXMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICplbmQ7Ci0gICAgICB3b3Jkc1tucl9lbnRyaWVzXSA9IHN0cnRvdWwgKHByb3BlcnR5X3ZhbHVlLCAmZW5kLCAwKTsKLSAgICAgIGlmIChwcm9wZXJ0eV92YWx1ZSA9PSBlbmQpCi0JYnJlYWs7Ci0gICAgICBucl9lbnRyaWVzICs9IDE7Ci0gICAgICBpZiAobnJfZW50cmllcyAqIHNpemVvZiAod29yZHNbMF0pID49IHNpemVvZiAod29yZHMpKQotCWh3X2Fib3J0IChjdXJyZW50LCAiYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgICBwcm9wZXJ0eV92YWx1ZSA9IGVuZDsKLSAgICB9Ci0gIGlmIChucl9lbnRyaWVzID09IDApCi0gICAgaHdfYWJvcnQgKGN1cnJlbnQsICJlcnJvciBwYXJzaW5nIGludGVnZXIgcHJvcGVydHkgJXMgKCVzKSIsCi0JICAgICAgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUpOwotICBlbHNlIGlmIChucl9lbnRyaWVzID09IDEpCi0gICAgaHdfYWRkX2ludGVnZXJfcHJvcGVydHkgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHdvcmRzWzBdKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKykKLQl7Ci0JICBIMkJFICh3b3Jkc1tpXSk7Ci0JfQotICAgICAgLyogcGVyaGFwaHMgaW50ZWdlciBhcnJheSBwcm9wZXJ0eSBpcyBiZXR0ZXIgKi8KLSAgICAgIGh3X2FkZF9hcnJheV9wcm9wZXJ0eSAoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgd29yZHMsCi0JCQkgICAgIHNpemVvZih3b3Jkc1swXSkgKiBucl9lbnRyaWVzKTsKLSAgICB9Ci19Ci0KLQotLyogPHN0cmluZz4gLi4uICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9zdHJpbmdfcHJvcGVydHkgKHN0cnVjdCBodyAqY3VycmVudCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKLXsKLSAgY2hhciAqKnN0cmluZ3M7Ci0gIGNvbnN0IGNoYXIgKmNocDsKLSAgaW50IG5yX3N0cmluZ3M7Ci0gIGludCBhcHByb3hfbnJfc3RyaW5nczsKLSAgCi0gIC8qIGdldCBhbiBlc3RpbWF0ZSBhcyB0byB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgYnkgY291bnRpbmcgZG91YmxlCi0gICAgIHF1b3RlcyAqLwotICBhcHByb3hfbnJfc3RyaW5ncyA9IDI7Ci0gIGZvciAoY2hwID0gcHJvcGVydHlfdmFsdWU7ICpjaHA7IGNocCsrKQotICAgIHsKLSAgICAgIGlmICgqY2hwID09ICciJykKLQlhcHByb3hfbnJfc3RyaW5ncysrOwotICAgIH0KLSAgYXBwcm94X25yX3N0cmluZ3MgPSAoYXBwcm94X25yX3N0cmluZ3MpIC8gMjsKLSAgCi0gIC8qIGNyZWF0ZSBhIHN0cmluZyBidWZmZXIgZm9yIHRoYXQgbWFueSAocGx1cyBhIG51bGwpICovCi0gIHN0cmluZ3MgPSAoY2hhcioqKSB6YWxsb2MgKChhcHByb3hfbnJfc3RyaW5ncyArIDEpICogc2l6ZW9mKGNoYXIqKSk7Ci0gIAotICAvKiBub3cgZmluZCBhbGwgdGhlIHN0cmluZ3MgKi8KLSAgY2hwID0gcHJvcGVydHlfdmFsdWU7Ci0gIG5yX3N0cmluZ3MgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAKLSAgICAgIC8qIHNraXAgbGVhZGluZyBzcGFjZSAqLwotICAgICAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiBpc3NwYWNlICgqY2hwKSkKLQljaHAgKz0gMTsKLSAgICAgIGlmICgqY2hwID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICAKLSAgICAgIC8qIGNvcHkgaXQgaW4gKi8KLSAgICAgIGlmICgqY2hwID09ICciJykKLQl7Ci0JICAvKiBhIHF1b3RlZCBzdHJpbmcgLSB3YXRjaCBmb3IgJ1wnIGV0LmFsLiAqLwotCSAgLyogZXN0aW1hdGUgdGhlIHNpemUgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciBpdCAqLwotCSAgaW50IHBvczsKLQkgIGNocCsrOwotCSAgcG9zID0gMDsKLQkgIHdoaWxlIChjaHBbcG9zXSAhPSAnXDAnICYmIGNocFtwb3NdICE9ICciJykKLQkgICAgewotCSAgICAgIGlmIChjaHBbcG9zXSA9PSAnXFwnICYmIGNocFtwb3MrMV0gIT0gJ1wwJykKLQkJcG9zICs9IDI7Ci0JICAgICAgZWxzZQotCQlwb3MgKz0gMTsKLQkgICAgfQotCSAgc3RyaW5nc1tucl9zdHJpbmdzXSA9IHphbGxvYyAocG9zICsgMSk7Ci0JICAvKiBjb3B5IHRoZSBzdHJpbmcgb3ZlciAqLwotCSAgcG9zID0gMDsKLQkgIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgKmNocCAhPSAnIicpCi0JICAgIHsKLQkgICAgICBpZiAoKmNocCA9PSAnXFwnICYmICooY2hwKzEpICE9ICdcMCcpIHsKLQkJc3RyaW5nc1tucl9zdHJpbmdzXVtwb3NdID0gKihjaHArMSk7Ci0JCWNocCArPSAyOwotCQlwb3MrKzsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RyaW5nc1tucl9zdHJpbmdzXVtwb3NdID0gKmNocDsKLQkJICBjaHAgKz0gMTsKLQkJICBwb3MrKzsKLQkJfQotCSAgICB9Ci0JICBpZiAoKmNocCAhPSAnXDAnKQotCSAgICBjaHArKzsKLQkgIHN0cmluZ3NbbnJfc3RyaW5nc11bcG9zXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIGNvcHkgb3ZlciBhIHNpbmdsZSB1bnF1b3RlZCB0b2tlbiAqLwotCSAgaW50IGxlbiA9IDA7Ci0JICB3aGlsZSAoY2hwW2xlbl0gIT0gJ1wwJyAmJiAhaXNzcGFjZShjaHBbbGVuXSkpCi0JICAgIGxlbisrOwotCSAgc3RyaW5nc1tucl9zdHJpbmdzXSA9IHphbGxvYyhsZW4gKyAxKTsKLQkgIHN0cm5jcHkoc3RyaW5nc1tucl9zdHJpbmdzXSwgY2hwLCBsZW4pOwotCSAgc3RyaW5nc1tucl9zdHJpbmdzXVtsZW5dID0gJ1wwJzsKLQkgIGNocCArPSBsZW47Ci0JfQotICAgICAgbnJfc3RyaW5ncysrOwotICAgICAgaWYgKG5yX3N0cmluZ3MgPiBhcHByb3hfbnJfc3RyaW5ncykKLQlod19hYm9ydCAoY3VycmVudCwgIlN0cmluZyBwcm9wZXJ0eSAlcyBiYWRseSBmb3JtYXR0ZWQiLAotCQkgIHByb3BlcnR5X25hbWUpOwotICAgIH0KLSAgQVNTRVJUIChzdHJpbmdzW25yX3N0cmluZ3NdID09IE5VTEwpOyAvKiBmcm9tIHphbGxvYyAqLwotICAKLSAgLyogaW5zdGFsbCBpdCAqLwotICBpZiAobnJfc3RyaW5ncyA9PSAwKQotICAgIGh3X2FkZF9zdHJpbmdfcHJvcGVydHkgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsICIiKTsKLSAgZWxzZSBpZiAobnJfc3RyaW5ncyA9PSAxKQotICAgIGh3X2FkZF9zdHJpbmdfcHJvcGVydHkgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHN0cmluZ3NbMF0pOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqKnNwZWNzID0gKGNvbnN0IGNoYXIqKikgc3RyaW5nczsgLyogc3RvcCBhIGJvZ3VzIGVycm9yICovCi0gICAgICBod19hZGRfc3RyaW5nX2FycmF5X3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLAotCQkJCSAgICBzcGVjcywgbnJfc3RyaW5ncyk7Ci0gICAgfQotICAKLSAgLyogZmx1c2ggdGhlIGNyZWF0ZWQgc3RyaW5nICovCi0gIHdoaWxlIChucl9zdHJpbmdzID4gMCkKLSAgICB7Ci0gICAgICBucl9zdHJpbmdzLS07Ci0gICAgICB6ZnJlZSAoc3RyaW5nc1tucl9zdHJpbmdzXSk7Ci0gICAgfQotICB6ZnJlZShzdHJpbmdzKTsKLX0KLQotCi0vKiA8cGF0aC10by1paGFuZGxlLWRldmljZT4gKi8KLQotI2lmIE5PVF9ZRVQKLXN0YXRpYyB2b2lkCi1wYXJzZV9paGFuZGxlX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKmN1cnJlbnQsCi0JCQljb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCWNvbnN0IGNoYXIgKnZhbHVlKQotewotICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBpaGFuZGxlOwotICAKLSAgLyogcGFzcyB0aGUgZnVsbCBwYXRoICovCi0gIGloYW5kbGUuZnVsbF9wYXRoID0gdmFsdWU7Ci0gIAotICAvKiBzYXZlIHRoaXMgcmVhZHkgZm9yIHRoZSBpaGFuZGxlIGNyZWF0ZSAqLwotICBod19hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eSwKLQkJCQkgICAmaWhhbmRsZSk7Ci19Ci0jZW5kaWYKLQotCi1zdHJ1Y3QgaHcgKgotaHdfdHJlZV9jcmVhdGUgKFNJTV9ERVNDIHNkLAotCQljb25zdCBjaGFyICpmYW1pbHkpCi17Ci0gIHJldHVybiBod19jcmVhdGUgKHNkLCBOVUxMLCBmYW1pbHksIGZhbWlseSwgTlVMTCwgTlVMTCk7Ci19Ci0KLXZvaWQKLWh3X3RyZWVfZGVsZXRlIChzdHJ1Y3QgaHcgKm1lKQotewotICAvKiBOZWVkIHRvIGFsbG93IGRldmljZXMgdG8gZGlzYXBlYXIgdW5kZXIgb3VyIGZlZXQgKi8KLSAgd2hpbGUgKGh3X2NoaWxkIChtZSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBod190cmVlX2RlbGV0ZSAoaHdfY2hpbGQgKG1lKSk7Ci0gICAgfQotICBod19kZWxldGUgKG1lKTsKLX0KLQotCi1zdHJ1Y3QgaHcgKgotaHdfdHJlZV9wYXJzZSAoc3RydWN0IGh3ICpjdXJyZW50LAotCSAgICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAgIC4uLikKLXsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgICBjdXJyZW50ID0gaHdfdHJlZV92cGFyc2UgKGN1cnJlbnQsIGZtdCwgYXApOwotICAgIHZhX2VuZCAoYXApOwotICAgIHJldHVybiBjdXJyZW50OwotfQotICAKLXN0cnVjdCBodyAqCi1od190cmVlX3ZwYXJzZSAoc3RydWN0IGh3ICpjdXJyZW50LAotCQljb25zdCBjaGFyICpmbXQsCi0JCXZhX2xpc3QgYXApCi17Ci0gIGNoYXIgZGV2aWNlX3NwZWNpZmllclsxMDI0XTsKLSAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKLSAgCi0gIC8qIGZvcm1hdCB0aGUgcGF0aCAqLwotICB2c3ByaW50ZiAoZGV2aWNlX3NwZWNpZmllciwgZm10LCBhcCk7Ci0gIGlmIChzdHJsZW4gKGRldmljZV9zcGVjaWZpZXIpID49IHNpemVvZiAoZGV2aWNlX3NwZWNpZmllcikpCi0gICAgaHdfYWJvcnQgKE5VTEwsICJkZXZpY2VfdHJlZV9hZGRfZGV2aWNlZDogYnVmZmVyIG92ZXJmbG93XG4iKTsKLSAgCi0gIC8qIGNvbnN0cnVjdCB0aGUgdHJlZSBkb3duIHRvIHRoZSBmaW5hbCBzdHJ1Y3QgaHcgKi8KLSAgY3VycmVudCA9IHNwbGl0X2ZpbGxfcGF0aCAoY3VycmVudCwgZGV2aWNlX3NwZWNpZmllciwgJnNwZWMpOwotICAKLSAgLyogaXMgdGhlcmUgYW4gaW50ZXJydXB0IHNwZWMgKi8KLSAgaWYgKHNwZWMucHJvcGVydHkgPT0gTlVMTAotICAgICAgJiYgc3BlYy52YWx1ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm9wID0gc3BsaXRfdmFsdWUgKCZzcGVjKTsKLSAgICAgIHN3aXRjaCAob3BbMF0pCi0JewotCWNhc2UgJz4nOgotCSAgewotCSAgICBjaGFyICpteV9wb3J0X25hbWUgPSBzcGxpdF92YWx1ZSAoJnNwZWMpOwotCSAgICBpbnQgbXlfcG9ydDsKLQkgICAgY2hhciAqZGVzdF9wb3J0X25hbWUgPSBzcGxpdF92YWx1ZSAoJnNwZWMpOwotCSAgICBpbnQgZGVzdF9wb3J0OwotCSAgICBuYW1lX3NwZWNpZmllciBkZXN0X3NwZWM7Ci0JICAgIGNoYXIgKmRlc3RfaHdfbmFtZSA9IHNwbGl0X3ZhbHVlICgmc3BlYyk7Ci0JICAgIHN0cnVjdCBodyAqZGVzdDsKLQkgICAgLyogZmluZCBteSBuYW1lICovCi0JICAgIGlmICghaHdfZmluaXNoZWRfcCAoY3VycmVudCkpCi0JICAgICAgaHdfZmluaXNoIChjdXJyZW50KTsKLQkgICAgbXlfcG9ydCA9IGh3X3BvcnRfZGVjb2RlIChjdXJyZW50LCBteV9wb3J0X25hbWUsIG91dHB1dF9wb3J0KTsKLQkgICAgLyogZmluZCB0aGUgZGVzdCBkZXZpY2UgYW5kIHBvcnQgKi8KLQkgICAgZGVzdCA9IHNwbGl0X2ZpbGxfcGF0aCAoY3VycmVudCwgZGVzdF9od19uYW1lLCAmZGVzdF9zcGVjKTsKLQkgICAgaWYgKCFod19maW5pc2hlZF9wIChkZXN0KSkKLQkgICAgICBod19maW5pc2ggKGRlc3QpOwotCSAgICBkZXN0X3BvcnQgPSBod19wb3J0X2RlY29kZSAoZGVzdCwgZGVzdF9wb3J0X25hbWUsCi0JCQkJCWlucHV0X3BvcnQpOwotCSAgICAvKiBjb25uZWN0IHRoZSB0d28gKi8KLQkgICAgaHdfcG9ydF9hdHRhY2ggKGN1cnJlbnQsCi0JCQkgICAgbXlfcG9ydCwKLQkJCSAgICBkZXN0LAotCQkJICAgIGRlc3RfcG9ydCwKLQkJCSAgICBwZXJtZW5hbnRfb2JqZWN0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZGVmYXVsdDoKLQkgIGh3X2Fib3J0IChjdXJyZW50LCAidW5yZWNvbmlzZWQgaW50ZXJydXB0IHNwZWMgJXNcbiIsIHNwZWMudmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgCi0gIC8qIGlzIHRoZXJlIGEgcHJvcGVydHkgKi8KLSAgaWYgKHNwZWMucHJvcGVydHkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChzcGVjLnZhbHVlLCAidHJ1ZSIpID09IDApCi0JaHdfYWRkX2Jvb2xlYW5fcHJvcGVydHkgKGN1cnJlbnQsIHNwZWMucHJvcGVydHksIDEpOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzcGVjLnZhbHVlLCAiZmFsc2UiKSA9PSAwKQotCWh3X2FkZF9ib29sZWFuX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCAwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5OwotCSAgc3dpdGNoIChzcGVjLnZhbHVlWzBdKQotCSAgICB7Ci0jaWYgTk9UX1lFVAotCSAgICBjYXNlICcqJzoKLQkgICAgICB7Ci0JCXBhcnNlX2loYW5kbGVfcHJvcGVydHkgKGN1cnJlbnQsIHNwZWMucHJvcGVydHksIHNwZWMudmFsdWUgKyAxKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotI2VuZGlmCi0JICAgIGNhc2UgJ1snOgotCSAgICAgIHsKLQkJdW5zaWduZWQ4IHdvcmRzWzEwMjRdOwotCQljaGFyICpjdXJyID0gc3BlYy52YWx1ZSArIDE7Ci0JCWludCBucl93b3JkcyA9IDA7Ci0JCXdoaWxlICgxKQotCQkgIHsKLQkJICAgIGNoYXIgKm5leHQ7Ci0JCSAgICB3b3Jkc1tucl93b3Jkc10gPSBIMkJFXzEgKHN0cnRvdWwgKGN1cnIsICZuZXh0LCAwKSk7Ci0JCSAgICBpZiAoY3VyciA9PSBuZXh0KQotCQkgICAgICBicmVhazsKLQkJICAgIGN1cnIgPSBuZXh0OwotCQkgICAgbnJfd29yZHMgKz0gMTsKLQkJICB9Ci0JCWh3X2FkZF9hcnJheV9wcm9wZXJ0eSAoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwKLQkJCQkgICAgICAgd29yZHMsIHNpemVvZih3b3Jkc1swXSkgKiBucl93b3Jkcyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSAnIic6Ci0JICAgICAgewotCQlwYXJzZV9zdHJpbmdfcHJvcGVydHkgKGN1cnJlbnQsIHNwZWMucHJvcGVydHksIHNwZWMudmFsdWUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgJyEnOgotCSAgICAgIHsKLQkJc3BlYy52YWx1ZSsrOwotCQlwcm9wZXJ0eSA9IGh3X3RyZWVfZmluZF9wcm9wZXJ0eSAoY3VycmVudCwgc3BlYy52YWx1ZSk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBOVUxMKQotCQkgIGh3X2Fib3J0IChjdXJyZW50LCAicHJvcGVydHkgJXMgbm90IGZvdW5kXG4iLCBzcGVjLnZhbHVlKTsKLQkJaHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eSAoY3VycmVudCwKLQkJCQkJICAgc3BlYy5wcm9wZXJ0eSwKLQkJCQkJICAgcHJvcGVydHkpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgewotCQlpZiAoc3RyY21wIChzcGVjLnByb3BlcnR5LCAicmVnIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChzcGVjLnByb3BlcnR5LCAiYXNzaWduZWQtYWRkcmVzc2VzIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChzcGVjLnByb3BlcnR5LCAiYWx0ZXJuYXRlLXJlZyIpID09IDApCi0JCSAgewotCQkgICAgcGFyc2VfcmVnX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKLQkJICB9Ci0JCWVsc2UgaWYgKHN0cmNtcCAoc3BlYy5wcm9wZXJ0eSwgInJhbmdlcyIpID09IDApCi0JCSAgewotCQkgICAgcGFyc2VfcmFuZ2VzX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKLQkJICB9Ci0JCWVsc2UgaWYgKGlzZGlnaXQoc3BlYy52YWx1ZVswXSkKLQkJCSB8fCAoc3BlYy52YWx1ZVswXSA9PSAnLScgJiYgaXNkaWdpdChzcGVjLnZhbHVlWzFdKSkKLQkJCSB8fCAoc3BlYy52YWx1ZVswXSA9PSAnKycgJiYgaXNkaWdpdChzcGVjLnZhbHVlWzFdKSkpCi0JCSAgewotCQkgICAgcGFyc2VfaW50ZWdlcl9wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBwYXJzZV9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBjdXJyZW50OwotfQotCi0KLXN0YXRpYyB2b2lkCi1maW5pc2hfaHdfdHJlZSAoc3RydWN0IGh3ICptZSwKLQkJdm9pZCAqZGF0YSkKLXsKLSAgaWYgKCFod19maW5pc2hlZF9wIChtZSkpCi0gICAgaHdfZmluaXNoIChtZSk7Ci19Ci0KLXZvaWQKLWh3X3RyZWVfZmluaXNoIChzdHJ1Y3QgaHcgKnJvb3QpCi17Ci0gIGh3X3RyZWVfdHJhdmVyc2UgKHJvb3QsIGZpbmlzaF9od190cmVlLCBOVUxMLCBOVUxMKTsKLX0KLQotCi0KLXZvaWQKLWh3X3RyZWVfdHJhdmVyc2UgKHN0cnVjdCBodyAqcm9vdCwKLQkJICBod190cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwcmVmaXgsCi0JCSAgaHdfdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcG9zdGZpeCwKLQkJICB2b2lkICpkYXRhKQotewotICBzdHJ1Y3QgaHcgKmNoaWxkOwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgcHJlZml4IChyb290LCBkYXRhKTsKLSAgZm9yIChjaGlsZCA9IGh3X2NoaWxkIChyb290KTsKLSAgICAgICBjaGlsZCAhPSBOVUxMOwotICAgICAgIGNoaWxkID0gaHdfc2libGluZyAoY2hpbGQpKQotICAgIHsKLSAgICAgIGh3X3RyZWVfdHJhdmVyc2UgKGNoaWxkLCBwcmVmaXgsIHBvc3RmaXgsIGRhdGEpOwotICAgIH0KLSAgaWYgKHBvc3RmaXggIT0gTlVMTCkKLSAgICBwb3N0Zml4IChyb290LCBkYXRhKTsKLX0KLQotCi0MCi1zdHJ1Y3QgcHJpbnRlciB7Ci0gIGh3X3RyZWVfcHJpbnRfY2FsbGJhY2sgKnByaW50OwotICB2b2lkICpmaWxlOwotfTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKHN0cnVjdCBodyAqYnVzLAotCSAgICAgICBjb25zdCBod191bml0ICpwaHlzLAotCSAgICAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKLXsKLSAgY2hhciB1bml0WzMyXTsKLSAgaHdfdW5pdF9lbmNvZGUgKGJ1cywgcGh5cywgdW5pdCwgc2l6ZW9mKHVuaXQpKTsKLSAgcC0+cHJpbnQgKHAtPmZpbGUsICIgJXMiLCB1bml0KTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NpemUgKHN0cnVjdCBodyAqYnVzLAotCSAgICBjb25zdCBod191bml0ICpzaXplLAotCSAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplLT5ucl9jZWxsczsgaSsrKQotICAgIGlmIChzaXplLT5jZWxsc1tpXSAhPSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChpIDwgc2l6ZS0+bnJfY2VsbHMpIHsKLSAgICBwLT5wcmludCAocC0+ZmlsZSwgIiAweCVseCIsICh1bnNpZ25lZCBsb25nKSBzaXplLT5jZWxsc1tpXSk7Ci0gICAgaSsrOwotICAgIGZvciAoOyBpIDwgc2l6ZS0+bnJfY2VsbHM7IGkrKykKLSAgICAgIHAtPnByaW50IChwLT5maWxlLCAiLDB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHNpemUtPmNlbGxzW2ldKTsKLSAgfQotICBlbHNlCi0gICAgcC0+cHJpbnQgKHAtPmZpbGUsICIgMCIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVnX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpwcm9wZXJ0eSwKLQkJICAgIHN0cnVjdCBwcmludGVyICpwKQotewotICBpbnQgcmVnX25yOwotICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0gIGZvciAocmVnX25yID0gMDsKLSAgICAgICBod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5uYW1lLCByZWdfbnIsICZyZWcpOwotICAgICAgIHJlZ19ucisrKSB7Ci0gICAgcHJpbnRfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksICZyZWcuYWRkcmVzcywgcCk7Ci0gICAgcHJpbnRfc2l6ZSAobWUsICZyZWcuc2l6ZSwgcCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3Jhbmdlc19wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqcHJvcGVydHksCi0JCSAgICAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKLXsKLSAgaW50IHJhbmdlX25yOwotICByYW5nZV9wcm9wZXJ0eV9zcGVjIHJhbmdlOwotICBmb3IgKHJhbmdlX25yID0gMDsKLSAgICAgICBod19maW5kX3JhbmdlX2FycmF5X3Byb3BlcnR5IChtZSwgcHJvcGVydHktPm5hbWUsIHJhbmdlX25yLCAmcmFuZ2UpOwotICAgICAgIHJhbmdlX25yKyspCi0gICAgewotICAgICAgcHJpbnRfYWRkcmVzcyAobWUsICZyYW5nZS5jaGlsZF9hZGRyZXNzLCBwKTsKLSAgICAgIHByaW50X2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLCAmcmFuZ2UucGFyZW50X2FkZHJlc3MsIHApOwotICAgICAgcHJpbnRfc2l6ZSAobWUsICZyYW5nZS5zaXplLCBwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdHJpbmcgKHN0cnVjdCBodyAqbWUsCi0JICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotCSAgICAgIHN0cnVjdCBwcmludGVyICpwKQotewotICBwLT5wcmludCAocC0+ZmlsZSwgIiBcIiIpOwotICB3aGlsZSAoKnN0cmluZyAhPSAnXDAnKSB7Ci0gICAgc3dpdGNoICgqc3RyaW5nKSB7Ci0gICAgY2FzZSAnIic6Ci0gICAgICBwLT5wcmludCAocC0+ZmlsZSwgIlxcXCIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1xcJzoKLSAgICAgIHAtPnByaW50IChwLT5maWxlLCAiXFxcXCIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHAtPnByaW50IChwLT5maWxlLCAiJWMiLCAqc3RyaW5nKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzdHJpbmcrKzsKLSAgfQotICBwLT5wcmludCAocC0+ZmlsZSwgIlwiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdHJpbmdfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqcHJvcGVydHksCi0JCQkgICAgIHN0cnVjdCBwcmludGVyICpwKQotewotICBpbnQgbnI7Ci0gIHN0cmluZ19wcm9wZXJ0eV9zcGVjIHN0cmluZzsKLSAgZm9yIChuciA9IDA7Ci0gICAgICAgaHdfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eS0+bmFtZSwgbnIsICZzdHJpbmcpOwotICAgICAgIG5yKyspCi0gICAgewotICAgICAgcHJpbnRfc3RyaW5nIChtZSwgc3RyaW5nLCBwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9wcm9wZXJ0aWVzIChzdHJ1Y3QgaHcgKm1lLAotCQkgIHN0cnVjdCBwcmludGVyICpwKQotewotICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5OwotICBmb3IgKHByb3BlcnR5ID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsIE5VTEwpOwotICAgICAgIHByb3BlcnR5ICE9IE5VTEw7Ci0gICAgICAgcHJvcGVydHkgPSBod19uZXh0X3Byb3BlcnR5IChwcm9wZXJ0eSkpCi0gICAgewotICAgICAgaWYgKGh3X3BhcmVudCAobWUpID09IE5VTEwpCi0JcC0+cHJpbnQgKHAtPmZpbGUsICIvJXMiLCBwcm9wZXJ0eS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JcC0+cHJpbnQgKHAtPmZpbGUsICIlcy8lcyIsIGh3X3BhdGggKG1lKSwgcHJvcGVydHktPm5hbWUpOwotICAgICAgaWYgKHByb3BlcnR5LT5vcmlnaW5hbCAhPSBOVUxMKQotCXsKLQkgIHAtPnByaW50IChwLT5maWxlLCAiICEiKTsKLQkgIHAtPnByaW50IChwLT5maWxlLCAiJXMvJXMiLCAKLQkJICAgICBod19wYXRoIChwcm9wZXJ0eS0+b3JpZ2luYWwtPm93bmVyKSwKLQkJICAgICBwcm9wZXJ0eS0+b3JpZ2luYWwtPm5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKHByb3BlcnR5LT50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYXJyYXlfcHJvcGVydHk6Ci0JICAgICAgewotCQlpZiAoKHByb3BlcnR5LT5zaXplb2ZfYXJyYXkgJSBzaXplb2YgKHNpZ25lZF9jZWxsKSkgPT0gMCkKLQkJICB7Ci0JCSAgICB1bnNpZ25lZF9jZWxsICp3ID0gKHVuc2lnbmVkX2NlbGwqKSBwcm9wZXJ0eS0+YXJyYXk7Ci0JCSAgICBpbnQgY2VsbF9ucjsKLQkJICAgIGZvciAoY2VsbF9uciA9IDA7Ci0JCQkgY2VsbF9uciA8IChwcm9wZXJ0eS0+c2l6ZW9mX2FycmF5IC8gc2l6ZW9mICh1bnNpZ25lZF9jZWxsKSk7Ci0JCQkgY2VsbF9ucisrKQotCQkgICAgICB7Ci0JCQlwLT5wcmludCAocC0+ZmlsZSwgIiAweCVseCIsICh1bnNpZ25lZCBsb25nKSBCRTJIX2NlbGwgKHdbY2VsbF9ucl0pKTsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHVuc2lnbmVkOCAqdyA9ICh1bnNpZ25lZDgqKXByb3BlcnR5LT5hcnJheTsKLQkJICAgIHAtPnByaW50IChwLT5maWxlLCAiIFsiKTsKLQkJICAgIHdoaWxlICgoY2hhciopdyAtIChjaGFyKilwcm9wZXJ0eS0+YXJyYXkgPCBwcm9wZXJ0eS0+c2l6ZW9mX2FycmF5KSB7Ci0JCSAgICAgIHAtPnByaW50IChwLT5maWxlLCAiIDB4JTJ4IiwgQkUySF8xICgqdykpOwotCQkgICAgICB3Kys7Ci0JCSAgICB9Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgYm9vbGVhbl9wcm9wZXJ0eToKLQkgICAgICB7Ci0JCWludCBiID0gaHdfZmluZF9ib29sZWFuX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSk7Ci0JCXAtPnByaW50IChwLT5maWxlLCAiICVzIiwgYiA/ICJ0cnVlIiAgOiAiZmFsc2UiKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotI2lmIE5PVF9ZRVQKLQkgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgotCSAgICAgIHsKLQkJaWYgKHByb3BlcnR5LT5hcnJheSAhPSBOVUxMKQotCQkgIHsKLQkJICAgIGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UgPSBod19maW5kX2loYW5kbGVfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eS0+bmFtZSk7Ci0JCSAgICBwLT5wcmludCAocC0+ZmlsZSwgIiAqJXMiLCBkZXZpY2VfaW5zdGFuY2VfcGF0aChpbnN0YW5jZSkpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIGFzayB0aGUgZGV2aWNlIGZvciB0aGUgcGF0aCAqLwotCQkgICAgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgc3BlYzsKLQkJICAgIGh3X2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChtZSwgcHJvcGVydHktPm5hbWUsICZzcGVjKTsKLQkJICAgIHAtPnByaW50IChwLT5maWxlLCAiIColcyIsIHNwZWMuZnVsbF9wYXRoKTsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLSNlbmRpZgotCSAgICBjYXNlIGludGVnZXJfcHJvcGVydHk6Ci0JICAgICAgewotCQl1bnNpZ25lZF93b3JkIHcgPSBod19maW5kX2ludGVnZXJfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eS0+bmFtZSk7Ci0JCXAtPnByaW50IChwLT5maWxlLCAiIDB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpdyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSByYW5nZV9hcnJheV9wcm9wZXJ0eToKLQkgICAgICB7Ci0JCXByaW50X3Jhbmdlc19wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBjYXNlIHJlZ19hcnJheV9wcm9wZXJ0eToKLQkgICAgICB7Ci0JCXByaW50X3JlZ19wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKnMgPSBod19maW5kX3N0cmluZ19wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5uYW1lKTsKLQkJcHJpbnRfc3RyaW5nIChtZSwgcywgcCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBzdHJpbmdfYXJyYXlfcHJvcGVydHk6Ci0JICAgICAgewotCQlwcmludF9zdHJpbmdfYXJyYXlfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgcCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICAgIHAtPnByaW50IChwLT5maWxlLCAiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnRlcnJ1cHRzIChzdHJ1Y3QgaHcgKm1lLAotICAgICAgICAgICAgICAgICAgaW50IG15X3BvcnQsCi0JCSAgc3RydWN0IGh3ICpkZXN0LAotCQkgIGludCBkZXN0X3BvcnQsCi0JCSAgdm9pZCAqZGF0YSkKLXsKLSAgc3RydWN0IHByaW50ZXIgKnAgPSBkYXRhOwotICBjaGFyIHNyY1szMl07Ci0gIGNoYXIgZHN0WzMyXTsKLSAgaHdfcG9ydF9lbmNvZGUgKG1lLCBteV9wb3J0LCBzcmMsIHNpemVvZihzcmMpLCBvdXRwdXRfcG9ydCk7Ci0gIGh3X3BvcnRfZW5jb2RlIChkZXN0LCBkZXN0X3BvcnQsIGRzdCwgc2l6ZW9mKGRzdCksIGlucHV0X3BvcnQpOwotICBwLT5wcmludCAocC0+ZmlsZSwKLQkgICAgIiVzID4gJXMgJXMgJXNcbiIsCi0JICAgIGh3X3BhdGggKG1lKSwKLQkgICAgc3JjLCBkc3QsCi0JICAgIGh3X3BhdGggKGRlc3QpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2RldmljZSAoc3RydWN0IGh3ICptZSwKLQkgICAgICB2b2lkICpkYXRhKQotewotICBzdHJ1Y3QgcHJpbnRlciAqcCA9IGRhdGE7Ci0gIHAtPnByaW50IChwLT5maWxlLCAiJXNcbiIsIGh3X3BhdGggKG1lKSk7Ci0gIHByaW50X3Byb3BlcnRpZXMgKG1lLCBwKTsKLSAgaHdfcG9ydF90cmF2ZXJzZSAobWUsIHByaW50X2ludGVycnVwdHMsIGRhdGEpOwotfQotCi12b2lkCi1od190cmVlX3ByaW50IChzdHJ1Y3QgaHcgKnJvb3QsCi0JICAgICAgIGh3X3RyZWVfcHJpbnRfY2FsbGJhY2sgKnByaW50LAotCSAgICAgICB2b2lkICpmaWxlKQotewotICBzdHJ1Y3QgcHJpbnRlciBwOwotICBwLnByaW50ID0gcHJpbnQ7Ci0gIHAuZmlsZSA9IGZpbGU7Ci0gIGh3X3RyZWVfdHJhdmVyc2UgKHJvb3QsCi0JCSAgICBwcmludF9kZXZpY2UsIE5VTEwsCi0JCSAgICAmcCk7Ci19Ci0KLQotDAotI2lmIE5PVF9ZRVQKLWRldmljZV9pbnN0YW5jZSAqCi10cmVlX2luc3RhbmNlKHN0cnVjdCBodyAqcm9vdCwKLQkgICAgICBjb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyKQotewotICAvKiBmaW5kIHRoZSBkZXZpY2Ugbm9kZSAqLwotICBzdHJ1Y3QgaHcgKm1lOwotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICBpZiAoIXNwbGl0X2RldmljZV9zcGVjaWZpZXIocm9vdCwgZGV2aWNlX3NwZWNpZmllciwgJnNwZWMpKQotICAgIHJldHVybiBOVUxMOwotICBtZSA9IHNwbGl0X2ZpbmRfZGV2aWNlKHJvb3QsICZzcGVjKTsKLSAgaWYgKHNwZWMubmFtZSAhPSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAvKiBjcmVhdGUgdGhlIGluc3RhbmNlICovCi0gIHJldHVybiBkZXZpY2VfY3JlYXRlX2luc3RhbmNlKG1lLCBkZXZpY2Vfc3BlY2lmaWVyLCBzcGVjLmxhc3RfYXJncyk7Ci19Ci0jZW5kaWYKLQotc3RydWN0IGh3ICoKLWh3X3RyZWVfZmluZF9kZXZpY2UgKHN0cnVjdCBodyAqcm9vdCwKLQkJICAgICBjb25zdCBjaGFyICpwYXRoX3RvX2RldmljZSkKLXsKLSAgc3RydWN0IGh3ICpub2RlOwotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICAKLSAgLyogcGFyc2UgdGhlIHBhdGggKi8KLSAgc3BsaXRfZGV2aWNlX3NwZWNpZmllciAocm9vdCwgcGF0aF90b19kZXZpY2UsICZzcGVjKTsKLSAgaWYgKHNwZWMudmFsdWUgIT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsgLyogc29tZXRoaW5nIHdpZXJkICovCi0gIAotICAvKiBub3cgZmluZCBpdCAqLwotICBub2RlID0gc3BsaXRfZmluZF9kZXZpY2UgKHJvb3QsICZzcGVjKTsKLSAgaWYgKHNwZWMubmFtZSAhPSBOVUxMKQotICAgIHJldHVybiBOVUxMOyAvKiBub3QgYSBsZWFmICovCi0gIAotICByZXR1cm4gbm9kZTsKLX0KLQotCi1jb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKgotaHdfdHJlZV9maW5kX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKnJvb3QsCi0JCSAgICAgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQotewotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllciAocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQotICAgIGh3X2Fib3J0IChyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7Ci0gIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZSAocm9vdCwgJnNwZWMpOwotICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7IC8qIG5vdCBhIGxlYWYgKi8KLSAgcmV0dXJuIGh3X2ZpbmRfcHJvcGVydHkgKHJvb3QsIHNwZWMucHJvcGVydHkpOwotfQotCi1pbnQKLWh3X3RyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKnJvb3QsCi0JCQkgICAgICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKLXsKLSAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKLSAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIgKHJvb3QsIHBhdGhfdG9fcHJvcGVydHksICZzcGVjKSkKLSAgICBod19hYm9ydCAocm9vdCwgIkludmFsaWQgcHJvcGVydHkgcGF0aCAlcyIsIHBhdGhfdG9fcHJvcGVydHkpOwotICByb290ID0gc3BsaXRfZmluZF9kZXZpY2UgKHJvb3QsICZzcGVjKTsKLSAgaWYgKHNwZWMubmFtZSAhPSBOVUxMKQotICAgIGh3X2Fib3J0IChyb290LCAiZGV2aWNlIFwiJXNcIiBub3QgZm91bmQgKHByb3BlcnR5IFwiJXNcIikiLAotCSAgICAgIHNwZWMubmFtZSwgcGF0aF90b19wcm9wZXJ0eSk7Ci0gIHJldHVybiBod19maW5kX2Jvb2xlYW5fcHJvcGVydHkgKHJvb3QsIHNwZWMucHJvcGVydHkpOwotfQotCi1zaWduZWRfY2VsbAotaHdfdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkgKHN0cnVjdCBodyAqcm9vdCwKLQkJCSAgICAgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQotewotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllciAocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQotICAgIGh3X2Fib3J0IChyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7Ci0gIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZSAocm9vdCwgJnNwZWMpOwotICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCi0gICAgaHdfYWJvcnQgKHJvb3QsICJkZXZpY2UgXCIlc1wiIG5vdCBmb3VuZCAocHJvcGVydHkgXCIlc1wiKSIsCi0JICAgICAgc3BlYy5uYW1lLCBwYXRoX3RvX3Byb3BlcnR5KTsKLSAgcmV0dXJuIGh3X2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eSAocm9vdCwgc3BlYy5wcm9wZXJ0eSk7Ci19Ci0KLSNpZiBOT1RfWUVUCi1kZXZpY2VfaW5zdGFuY2UgKgotaHdfdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkgKHN0cnVjdCBodyAqcm9vdCwKLQkJCSAgICAgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQotewotICBzdHJ1Y3QgaHcgKnJvb3Q7Ci0gIG5hbWVfc3BlY2lmaWVyIHNwZWM7Ci0gIGlmICghc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyIChyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCi0gICAgaHdfYWJvcnQgKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKLSAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlIChyb290LCAmc3BlYyk7Ci0gIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKLSAgICBod19hYm9ydCAocm9vdCwgImRldmljZSBcIiVzXCIgbm90IGZvdW5kIChwcm9wZXJ0eSBcIiVzXCIpIiwKLQkgICAgICBzcGVjLm5hbWUsIHBhdGhfdG9fcHJvcGVydHkpOwotICByZXR1cm4gaHdfZmluZF9paGFuZGxlX3Byb3BlcnR5IChyb290LCBzcGVjLnByb3BlcnR5KTsKLX0KLSNlbmRpZgotCi1jb25zdCBjaGFyICoKLWh3X3RyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkgKHN0cnVjdCBodyAqcm9vdCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpCi17Ci0gIG5hbWVfc3BlY2lmaWVyIHNwZWM7Ci0gIGlmICghc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyIChyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCi0gICAgaHdfYWJvcnQgKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKLSAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlIChyb290LCAmc3BlYyk7Ci0gIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKLSAgICBod19hYm9ydCAocm9vdCwgImRldmljZSBcIiVzXCIgbm90IGZvdW5kIChwcm9wZXJ0eSBcIiVzXCIpIiwKLQkgICAgICBzcGVjLm5hbWUsIHBhdGhfdG9fcHJvcGVydHkpOwotICByZXR1cm4gaHdfZmluZF9zdHJpbmdfcHJvcGVydHkgKHJvb3QsIHNwZWMucHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody10cmVlLmggYi9zaW0vY29tbW9uL2h3LXRyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNTY4MS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL2h3LXRyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIEhXX1RSRUUKLSNkZWZpbmUgSFdfVFJFRQotCi0KLXN0cnVjdCBodyAqaHdfdHJlZV9jcmVhdGUKLShTSU1fREVTQyBzZCwKLSBjb25zdCBjaGFyICpkZXZpY2UpOwotCi12b2lkIGh3X3RyZWVfZGVsZXRlCi0oc3RydWN0IGh3ICpyb290KTsKLQotc3RydWN0IGh3ICpod190cmVlX3BhcnNlCi0oc3RydWN0IGh3ICpyb290LAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLQotc3RydWN0IGh3ICpod190cmVlX3ZwYXJzZQotKHN0cnVjdCBodyAqcm9vdCwKLSBjb25zdCBjaGFyICpmbXQsCi0gdmFfbGlzdCBhcCk7Ci0KLQotdm9pZCBod190cmVlX2ZpbmlzaAotKHN0cnVjdCBodyAqcm9vdCk7Ci0KLXR5cGVkZWYgdm9pZCAoaHdfdHJlZV9wcmludF9jYWxsYmFjaykKLSAgICAgKHZvaWQgKiwKLSAgICAgIGNvbnN0IGNoYXIgKmZtdCwKLSAgICAgIC4uLik7Ci0KLXZvaWQgaHdfdHJlZV9wcmludAotKHN0cnVjdCBodyAqcm9vdCwKLSBod190cmVlX3ByaW50X2NhbGxiYWNrICpwcmludCwKLSB2b2lkICpmaWxlKTsKLQotCi0vKiBUcmVlIHRyYXZlcnNhbDo6Ci0KLSAgIFRoZSBlbnRpcmUgZGV2aWNlIHRyZWUgY2FuIGJlIHRyYXZlcnNlZCB1c2luZyB0aGUKLSAgIDw8ZGV2aWNlX3RyZWVfdHJhdmVyc2UoKT4+IGZ1bmN0aW9uLiAgVGhlIHRyYXZlcnNhbCBjYW4gYmUgaW4KLSAgIGVpdGhlciBwcmVmaXggb3IgcG9zdGZpeCBvcmRlci4KLQotICAgKi8KLQotdHlwZWRlZiB2b2lkIChod190cmVlX3RyYXZlcnNlX2Z1bmN0aW9uKQotICAgICAoc3RydWN0IGh3ICpkZXZpY2UsCi0gICAgICB2b2lkICpkYXRhKTsKLQotdm9pZCBod190cmVlX3RyYXZlcnNlCi0oc3RydWN0IGh3ICpyb290LAotIGh3X3RyZWVfdHJhdmVyc2VfZnVuY3Rpb24gKnByZWZpeCwKLSBod190cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwb3N0Zml4LAotIHZvaWQgKmRhdGEpOwotCi0KLS8qIFRyZWUgbG9va3VwOjoKLQotICAgVGhlIGZ1bmN0aW9uIDw8aHdfdHJlZV9maW5kX2RldmljZSgpPj4gd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUKLSAgIHNwZWNpZmllZCBkZXZpY2Ugd2l0aGluIHRoZSB0cmVlLiAgSWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQgYQotICAgTlVMTCBkZXZpY2UgaXMgcmV0dXJuZWQuCi0KLSAgICovCi0KLXN0cnVjdCBodyAqIGh3X3RyZWVfZmluZF9kZXZpY2UKLShzdHJ1Y3QgaHcgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aCk7Ci0KLQotY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpod190cmVlX2ZpbmRfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7Ci0KLWludCBod190cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eQotKHN0cnVjdCBodyAqcm9vdCwKLSBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKLQotc2lnbmVkX2NlbGwgaHdfdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7Ci0KLSNpZiBOT1RfWUVUCi1kZXZpY2VfaW5zdGFuY2UgKmh3X3RyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5Ci0oc3RydWN0IGh3ICpyb290LAotIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKmh3X3RyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkKLShzdHJ1Y3QgaHcgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7Ci0KLQotLyogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb24gdGhlIGNyZWF0ZWQgdHJlZS4gKi8KLQotdm9pZCBod190cmVlX3Jlc2V0Ci0oc3RydWN0IGh3ICpyb290KTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vbmx0dmFscy5kZWYgYi9zaW0vY29tbW9uL25sdHZhbHMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4MmZjLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vbmx0dmFscy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyogTmV3bGliL2xpYmdsb3NzIG1hY3JvIHZhbHVlcyBuZWVkZWQgYnkgcmVtb3RlIHRhcmdldCBzdXBwb3J0LiAgKi8KLS8qIFRoaXMgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCBieSBnZW5ubHR2YWxzLnNoLiAgKi8KLSNpZmRlZiBlcnJub19kZWZzCi0vKiBmcm9tIGVycm5vLmggKi8KLS8qIGZyb20gc3lzL2Vycm5vLmggKi8KLS8qIGJlZ2luIGVycm5vIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJFMkJJRyIsIDcgIH0sCi0geyAiRUFDQ0VTIiwgMTMgIH0sCi0geyAiRUFERFJJTlVTRSIsIDExMiAgfSwKLSB7ICJFQUREUk5PVEFWQUlMIiwgMTI1ICB9LAotIHsgIkVBRFYiLCA2OCAgfSwKLSB7ICJFQUZOT1NVUFBPUlQiLCAxMDYgIH0sCi0geyAiRUFHQUlOIiwgMTEgIH0sCi0geyAiRUFMUkVBRFkiLCAxMjAgIH0sCi0geyAiRUJBREUiLCA1MCAgfSwKLSB7ICJFQkFERiIsIDkgIH0sCi0geyAiRUJBREZEIiwgODEgIH0sCi0geyAiRUJBRE1TRyIsIDc3ICB9LAotIHsgIkVCQURSIiwgNTEgIH0sCi0geyAiRUJBRFJRQyIsIDU0ICB9LAotIHsgIkVCQURTTFQiLCA1NSAgfSwKLSB7ICJFQkZPTlQiLCA1NyAgfSwKLSB7ICJFQlVTWSIsIDE2ICB9LAotIHsgIkVDSElMRCIsIDEwICB9LAotIHsgIkVDSFJORyIsIDM3ICB9LAotIHsgIkVDT01NIiwgNzAgIH0sCi0geyAiRUNPTk5BQk9SVEVEIiwgMTEzICB9LAotIHsgIkVDT05OUkVGVVNFRCIsIDExMSAgfSwKLSB7ICJFQ09OTlJFU0VUIiwgMTA0ICB9LAotIHsgIkVERUFETEsiLCA0NSAgfSwKLSB7ICJFREVBRExPQ0siLCA1NiAgfSwKLSB7ICJFREVTVEFERFJSRVEiLCAxMjEgIH0sCi0geyAiRURPTSIsIDMzICB9LAotIHsgIkVET1RET1QiLCA3NiAgfSwKLSB7ICJFRFFVT1QiLCAxMzIgIH0sCi0geyAiRUVYSVNUIiwgMTcgIH0sCi0geyAiRUZBVUxUIiwgMTQgIH0sCi0geyAiRUZCSUciLCAyNyAgfSwKLSB7ICJFSE9TVERPV04iLCAxMTcgIH0sCi0geyAiRUhPU1RVTlJFQUNIIiwgMTE4ICB9LAotIHsgIkVJRFJNIiwgMzYgIH0sCi0geyAiRUlOUFJPR1JFU1MiLCAxMTkgIH0sCi0geyAiRUlOVFIiLCA0ICB9LAotIHsgIkVJTlZBTCIsIDIyICB9LAotIHsgIkVJTyIsIDUgIH0sCi0geyAiRUlTQ09OTiIsIDEyNyAgfSwKLSB7ICJFSVNESVIiLCAyMSAgfSwKLSB7ICJFTDJITFQiLCA0NCAgfSwKLSB7ICJFTDJOU1lOQyIsIDM4ICB9LAotIHsgIkVMM0hMVCIsIDM5ICB9LAotIHsgIkVMM1JTVCIsIDQwICB9LAotIHsgIkVMQklOIiwgNzUgIH0sCi0geyAiRUxJQkFDQyIsIDgzICB9LAotIHsgIkVMSUJCQUQiLCA4NCAgfSwKLSB7ICJFTElCRVhFQyIsIDg3ICB9LAotIHsgIkVMSUJNQVgiLCA4NiAgfSwKLSB7ICJFTElCU0NOIiwgODUgIH0sCi0geyAiRUxOUk5HIiwgNDEgIH0sCi0geyAiRUxPT1AiLCA5MiAgfSwKLSB7ICJFTUZJTEUiLCAyNCAgfSwKLSB7ICJFTUxJTksiLCAzMSAgfSwKLSB7ICJFTVNHU0laRSIsIDEyMiAgfSwKLSB7ICJFTVVMVElIT1AiLCA3NCAgfSwKLSB7ICJFTkFNRVRPT0xPTkciLCA5MSAgfSwKLSB7ICJFTkVURE9XTiIsIDExNSAgfSwKLSB7ICJFTkVUUkVTRVQiLCAxMjYgIH0sCi0geyAiRU5FVFVOUkVBQ0giLCAxMTQgIH0sCi0geyAiRU5GSUxFIiwgMjMgIH0sCi0geyAiRU5NRklMRSIsIDg5ICB9LAotIHsgIkVOT0FOTyIsIDUzICB9LAotIHsgIkVOT0JVRlMiLCAxMDUgIH0sCi0geyAiRU5PQ1NJIiwgNDMgIH0sCi0geyAiRU5PREFUQSIsIDYxICB9LAotIHsgIkVOT0RFViIsIDE5ICB9LAotIHsgIkVOT0VOVCIsIDIgIH0sCi0geyAiRU5PRVhFQyIsIDggIH0sCi0geyAiRU5PTENLIiwgNDYgIH0sCi0geyAiRU5PTElOSyIsIDY3ICB9LAotIHsgIkVOT01FTSIsIDEyICB9LAotIHsgIkVOT01TRyIsIDM1ICB9LAotIHsgIkVOT05FVCIsIDY0ICB9LAotIHsgIkVOT1BLRyIsIDY1ICB9LAotIHsgIkVOT1BST1RPT1BUIiwgMTA5ICB9LAotIHsgIkVOT1NQQyIsIDI4ICB9LAotIHsgIkVOT1NSIiwgNjMgIH0sCi0geyAiRU5PU1RSIiwgNjAgIH0sCi0geyAiRU5PU1lTIiwgODggIH0sCi0geyAiRU5PVEJMSyIsIDE1ICB9LAotIHsgIkVOT1RDT05OIiwgMTI4ICB9LAotIHsgIkVOT1RESVIiLCAyMCAgfSwKLSB7ICJFTk9URU1QVFkiLCA5MCAgfSwKLSB7ICJFTk9UU09DSyIsIDEwOCAgfSwKLSB7ICJFTk9UU1VQIiwgMTM0ICB9LAotIHsgIkVOT1RUWSIsIDI1ICB9LAotIHsgIkVOT1RVTklRIiwgODAgIH0sCi0geyAiRU5YSU8iLCA2ICB9LAotIHsgIkVPUE5PVFNVUFAiLCA5NSAgfSwKLSB7ICJFUEVSTSIsIDEgIH0sCi0geyAiRVBGTk9TVVBQT1JUIiwgOTYgIH0sCi0geyAiRVBJUEUiLCAzMiAgfSwKLSB7ICJFUFJPQ0xJTSIsIDEzMCAgfSwKLSB7ICJFUFJPVE8iLCA3MSAgfSwKLSB7ICJFUFJPVE9OT1NVUFBPUlQiLCAxMjMgIH0sCi0geyAiRVBST1RPVFlQRSIsIDEwNyAgfSwKLSB7ICJFUkFOR0UiLCAzNCAgfSwKLSB7ICJFUkVNQ0hHIiwgODIgIH0sCi0geyAiRVJFTU9URSIsIDY2ICB9LAotIHsgIkVST0ZTIiwgMzAgIH0sCi0geyAiRVNIVVRET1dOIiwgMTEwICB9LAotIHsgIkVTT0NLVE5PU1VQUE9SVCIsIDEyNCAgfSwKLSB7ICJFU1BJUEUiLCAyOSAgfSwKLSB7ICJFU1JDSCIsIDMgIH0sCi0geyAiRVNSTU5UIiwgNjkgIH0sCi0geyAiRVNUQUxFIiwgMTMzICB9LAotIHsgIkVUSU1FIiwgNjIgIH0sCi0geyAiRVRJTUVET1VUIiwgMTE2ICB9LAotIHsgIkVUT09NQU5ZUkVGUyIsIDEyOSAgfSwKLSB7ICJFVFhUQlNZIiwgMjYgIH0sCi0geyAiRVVOQVRDSCIsIDQyICB9LAotIHsgIkVVU0VSUyIsIDEzMSAgfSwKLSB7ICJFV09VTERCTE9DSyIsIDExICAgfSwKLSB7ICJFWERFViIsIDE4ICB9LAotIHsgIkVYRlVMTCIsIDUyICB9LAotLyogZW5kIGVycm5vIHRhcmdldCBtYWNyb3MgKi8KLSNlbmRpZgotI2lmZGVmIHNpZ25hbF9kZWZzCi0vKiBmcm9tIHNpZ25hbC5oICovCi0vKiBmcm9tIHN5cy9zaWduYWwuaCAqLwotLyogYmVnaW4gc2lnbmFsIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJTSUdBQlJUIiwgNiAgfSwKLSB7ICJTSUdBTFJNIiwgMTQgIH0sCi0geyAiU0lHQlVTIiwgMTAgIH0sCi0geyAiU0lHQ0hMRCIsIDIwICB9LAotIHsgIlNJR0NMRCIsIDIwICB9LAotIHsgIlNJR0NPTlQiLCAxOSAgfSwKLSB7ICJTSUdFTVQiLCA3ICB9LAotIHsgIlNJR0ZQRSIsIDggIH0sCi0geyAiU0lHSFVQIiwgMSAgfSwKLSB7ICJTSUdJTEwiLCA0ICB9LAotIHsgIlNJR0lOVCIsIDIgIH0sCi0geyAiU0lHSU8iLCAyMyAgfSwKLSB7ICJTSUdJT1QiLCA2ICB9LAotIHsgIlNJR0tJTEwiLCA5ICB9LAotIHsgIlNJR0xPU1QiLCAyOSAgfSwKLSB7ICJTSUdQSVBFIiwgMTMgIH0sCi0geyAiU0lHUE9MTCIsIDIzICAgfSwKLSB7ICJTSUdQUk9GIiwgMjcgIH0sCi0geyAiU0lHUVVJVCIsIDMgIH0sCi0geyAiU0lHU0VHViIsIDExICB9LAotIHsgIlNJR1NUT1AiLCAxNyAgfSwKLSB7ICJTSUdTWVMiLCAxMiAgfSwKLSB7ICJTSUdURVJNIiwgMTUgIH0sCi0geyAiU0lHVFJBUCIsIDUgIH0sCi0geyAiU0lHVFNUUCIsIDE4ICB9LAotIHsgIlNJR1RUSU4iLCAyMSAgfSwKLSB7ICJTSUdUVE9VIiwgMjIgIH0sCi0geyAiU0lHVVJHIiwgMTYgIH0sCi0geyAiU0lHVVNSMSIsIDMwICB9LAotIHsgIlNJR1VTUjIiLCAzMSAgfSwKLSB7ICJTSUdWVEFMUk0iLCAyNiAgfSwKLSB7ICJTSUdXSU5DSCIsIDI4ICB9LAotIHsgIlNJR1hDUFUiLCAyNCAgfSwKLSB7ICJTSUdYRlNaIiwgMjUgIH0sCi0vKiBlbmQgc2lnbmFsIHRhcmdldCBtYWNyb3MgKi8KLSNlbmRpZgotI2lmZGVmIG9wZW5fZGVmcwotLyogZnJvbSBmY250bC5oICovCi0vKiBmcm9tIHN5cy9mY250bC5oICovCi0vKiBiZWdpbiBvcGVuIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJPX0FDQ01PREUiLCAoMCB8IDEgfCAyICkgIH0sCi0geyAiT19BUFBFTkQiLCAweDAwMDggICB9LAotIHsgIk9fQ1JFQVQiLCAweDAyMDAgICB9LAotIHsgIk9fRVhDTCIsIDB4MDgwMCAgIH0sCi0geyAiT19OT0NUVFkiLCAweDgwMDAgICB9LAotIHsgIk9fTk9OQkxPQ0siLCAweDQwMDAgICB9LAotIHsgIk9fUkRPTkxZIiwgMCAgfSwKLSB7ICJPX1JEV1IiLCAyICB9LAotIHsgIk9fU1lOQyIsIDB4MjAwMCAgIH0sCi0geyAiT19UUlVOQyIsIDB4MDQwMCAgIH0sCi0geyAiT19XUk9OTFkiLCAxICB9LAotLyogZW5kIG9wZW4gdGFyZ2V0IG1hY3JvcyAqLwotI2VuZGlmCi0jaWZkZWYgTkxfVEFSR0VUX2QxMHYKLSNpZmRlZiBzeXNfZGVmcwotLyogZnJvbSBzeXNjYWxsLmggKi8KLS8qIGJlZ2luIGQxMHYgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJTWVNfQVJHIiwgMjQgIH0sCi0geyAiU1lTX2NoZGlyIiwgMTIgIH0sCi0geyAiU1lTX2NobW9kIiwgMTUgIH0sCi0geyAiU1lTX2Nob3duIiwgMTYgIH0sCi0geyAiU1lTX2Nsb3NlIiwgNiAgfSwKLSB7ICJTWVNfY3JlYXQiLCA4ICB9LAotIHsgIlNZU19leGVjdiIsIDExICB9LAotIHsgIlNZU19leGVjdmUiLCA1OSAgfSwKLSB7ICJTWVNfZXhpdCIsIDEgIH0sCi0geyAiU1lTX2ZvcmsiLCAyICB9LAotIHsgIlNZU19mc3RhdCIsIDIyICB9LAotIHsgIlNZU19nZXRwaWQiLCAyMCAgfSwKLSB7ICJTWVNfaXNhdHR5IiwgMjEgIH0sCi0geyAiU1lTX2tpbGwiLCA2MCAgfSwKLSB7ICJTWVNfbGluayIsIDkgIH0sCi0geyAiU1lTX2xzZWVrIiwgMTkgIH0sCi0geyAiU1lTX21rbm9kIiwgMTQgIH0sCi0geyAiU1lTX29wZW4iLCA1ICB9LAotIHsgIlNZU19waXBlIiwgNDIgIH0sCi0geyAiU1lTX3JlYWQiLCAzICB9LAotIHsgIlNZU19zdGF0IiwgMzggIH0sCi0geyAiU1lTX3RpbWUiLCAyMyAgfSwKLSB7ICJTWVNfdW5saW5rIiwgMTAgIH0sCi0geyAiU1lTX3V0aW1lIiwgMjAxICB9LAotIHsgIlNZU193YWl0IiwgMjAyICB9LAotIHsgIlNZU193YWl0NCIsIDcgIH0sCi0geyAiU1lTX3dyaXRlIiwgNCAgfSwKLS8qIGVuZCBkMTB2IHN5cyB0YXJnZXQgbWFjcm9zICovCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE5MX1RBUkdFVF9kMzB2Ci0jaWZkZWYgc3lzX2RlZnMKLS8qIGZyb20gc3lzY2FsbC5oICovCi0vKiBiZWdpbiBkMzB2IHN5cyB0YXJnZXQgbWFjcm9zICovCi0geyAiU1lTX2FyZ3YiLCAxMyAgfSwKLSB7ICJTWVNfYXJndmxlbiIsIDEyICB9LAotIHsgIlNZU19jaGRpciIsIDE0ICB9LAotIHsgIlNZU19jaG1vZCIsIDE2ICB9LAotIHsgIlNZU19jbG9zZSIsIDMgIH0sCi0geyAiU1lTX2V4aXQiLCAxICB9LAotIHsgIlNZU19mc3RhdCIsIDEwICB9LAotIHsgIlNZU19nZXRwaWQiLCA4ICB9LAotIHsgIlNZU19raWxsIiwgOSAgfSwKLSB7ICJTWVNfbHNlZWsiLCA2ICB9LAotIHsgIlNZU19vcGVuIiwgMiAgfSwKLSB7ICJTWVNfcmVhZCIsIDQgIH0sCi0geyAiU1lTX3N0YXQiLCAxNSAgfSwKLSB7ICJTWVNfdGltZSIsIDE4ICB9LAotIHsgIlNZU191bmxpbmsiLCA3ICB9LAotIHsgIlNZU191dGltZSIsIDE3ICB9LAotIHsgIlNZU193cml0ZSIsIDUgIH0sCi0vKiBlbmQgZDMwdiBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBOTF9UQVJHRVRfZnIzMAotI2lmZGVmIHN5c19kZWZzCi0vKiBmcm9tIHN5c2NhbGwuaCAqLwotLyogYmVnaW4gZnIzMCBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotIHsgIlNZU19hcmd2IiwgMTMgIH0sCi0geyAiU1lTX2FyZ3ZsZW4iLCAxMiAgfSwKLSB7ICJTWVNfY2hkaXIiLCAxNCAgfSwKLSB7ICJTWVNfY2htb2QiLCAxNiAgfSwKLSB7ICJTWVNfY2xvc2UiLCAzICB9LAotIHsgIlNZU19leGl0IiwgMSAgfSwKLSB7ICJTWVNfZnN0YXQiLCAxMCAgfSwKLSB7ICJTWVNfZ2V0cGlkIiwgOCAgfSwKLSB7ICJTWVNfa2lsbCIsIDkgIH0sCi0geyAiU1lTX2xzZWVrIiwgNiAgfSwKLSB7ICJTWVNfb3BlbiIsIDIgIH0sCi0geyAiU1lTX3JlYWQiLCA0ICB9LAotIHsgIlNZU19zdGF0IiwgMTUgIH0sCi0geyAiU1lTX3RpbWUiLCAxOCAgfSwKLSB7ICJTWVNfdW5saW5rIiwgNyAgfSwKLSB7ICJTWVNfdXRpbWUiLCAxNyAgfSwKLSB7ICJTWVNfd3JpdGUiLCA1ICB9LAotLyogZW5kIGZyMzAgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgTkxfVEFSR0VUX2k5NjAKLSNpZmRlZiBzeXNfZGVmcwotLyogZnJvbSBzeXNjYWxsLmggKi8KLS8qIGJlZ2luIGk5NjAgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJTWVNfYXJndiIsIDEzICB9LAotIHsgIlNZU19hcmd2bGVuIiwgMTIgIH0sCi0geyAiU1lTX2NoZGlyIiwgMTQgIH0sCi0geyAiU1lTX2NobW9kIiwgMTYgIH0sCi0geyAiU1lTX2Nsb3NlIiwgMjM0ICB9LAotIHsgIlNZU19leGl0IiwgMjU3ICB9LAotIHsgIlNZU19mc3RhdCIsIDEwICB9LAotIHsgIlNZU19nZXRwaWQiLCA4ICB9LAotIHsgIlNZU19raWxsIiwgOSAgfSwKLSB7ICJTWVNfbHNlZWsiLCAyMzMgIH0sCi0geyAiU1lTX29wZW4iLCAyMzAgIH0sCi0geyAiU1lTX3JlYWQiLCAyMzEgIH0sCi0geyAiU1lTX3N0YXQiLCAxNSAgfSwKLSB7ICJTWVNfdGltZSIsIDE4ICB9LAotIHsgIlNZU191bmxpbmsiLCA3ICB9LAotIHsgIlNZU191dGltZSIsIDE3ICB9LAotIHsgIlNZU193cml0ZSIsIDIzMiAgfSwKLS8qIGVuZCBpOTYwIHN5cyB0YXJnZXQgbWFjcm9zICovCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE5MX1RBUkdFVF9tMzJyCi0jaWZkZWYgc3lzX2RlZnMKLS8qIGZyb20gc3lzY2FsbC5oICovCi0vKiBiZWdpbiBtMzJyIHN5cyB0YXJnZXQgbWFjcm9zICovCi0geyAiU1lTX2FyZ3YiLCAxMyAgfSwKLSB7ICJTWVNfYXJndmxlbiIsIDEyICB9LAotIHsgIlNZU19jaGRpciIsIDE0ICB9LAotIHsgIlNZU19jaG1vZCIsIDE2ICB9LAotIHsgIlNZU19jbG9zZSIsIDMgIH0sCi0geyAiU1lTX2V4aXQiLCAxICB9LAotIHsgIlNZU19mc3RhdCIsIDEwICB9LAotIHsgIlNZU19nZXRwaWQiLCA4ICB9LAotIHsgIlNZU19raWxsIiwgOSAgfSwKLSB7ICJTWVNfbHNlZWsiLCA2ICB9LAotIHsgIlNZU19vcGVuIiwgMiAgfSwKLSB7ICJTWVNfcmVhZCIsIDQgIH0sCi0geyAiU1lTX3N0YXQiLCAxNSAgfSwKLSB7ICJTWVNfdGltZSIsIDE4ICB9LAotIHsgIlNZU191bmxpbmsiLCA3ICB9LAotIHsgIlNZU191dGltZSIsIDE3ICB9LAotIHsgIlNZU193cml0ZSIsIDUgIH0sCi0vKiBlbmQgbTMyciBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBOTF9UQVJHRVRfbW4xMDIwMAotI2lmZGVmIHN5c19kZWZzCi0vKiBmcm9tIHN5c2NhbGwuaCAqLwotLyogYmVnaW4gbW4xMDIwMCBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotIHsgIlNZU19hcmd2IiwgMTMgIH0sCi0geyAiU1lTX2FyZ3ZsZW4iLCAxMiAgfSwKLSB7ICJTWVNfY2hkaXIiLCAxNCAgfSwKLSB7ICJTWVNfY2htb2QiLCAxNiAgfSwKLSB7ICJTWVNfY2xvc2UiLCAzICB9LAotIHsgIlNZU19leGl0IiwgMSAgfSwKLSB7ICJTWVNfZnN0YXQiLCAxMCAgfSwKLSB7ICJTWVNfZ2V0cGlkIiwgOCAgfSwKLSB7ICJTWVNfa2lsbCIsIDkgIH0sCi0geyAiU1lTX2xzZWVrIiwgNiAgfSwKLSB7ICJTWVNfb3BlbiIsIDIgIH0sCi0geyAiU1lTX3JlYWQiLCA0ICB9LAotIHsgIlNZU19zdGF0IiwgMTUgIH0sCi0geyAiU1lTX3RpbWUiLCAxOCAgfSwKLSB7ICJTWVNfdW5saW5rIiwgNyAgfSwKLSB7ICJTWVNfdXRpbWUiLCAxNyAgfSwKLSB7ICJTWVNfd3JpdGUiLCA1ICB9LAotLyogZW5kIG1uMTAyMDAgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgTkxfVEFSR0VUX21uMTAzMDAKLSNpZmRlZiBzeXNfZGVmcwotLyogZnJvbSBzeXNjYWxsLmggKi8KLS8qIGJlZ2luIG1uMTAzMDAgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJTWVNfYXJndiIsIDEzICB9LAotIHsgIlNZU19hcmd2bGVuIiwgMTIgIH0sCi0geyAiU1lTX2NoZGlyIiwgMTQgIH0sCi0geyAiU1lTX2NobW9kIiwgMTYgIH0sCi0geyAiU1lTX2Nsb3NlIiwgMyAgfSwKLSB7ICJTWVNfZXhpdCIsIDEgIH0sCi0geyAiU1lTX2ZzdGF0IiwgMTAgIH0sCi0geyAiU1lTX2dldHBpZCIsIDggIH0sCi0geyAiU1lTX2tpbGwiLCA5ICB9LAotIHsgIlNZU19sc2VlayIsIDYgIH0sCi0geyAiU1lTX29wZW4iLCAyICB9LAotIHsgIlNZU19yZWFkIiwgNCAgfSwKLSB7ICJTWVNfc3RhdCIsIDE1ICB9LAotIHsgIlNZU190aW1lIiwgMTggIH0sCi0geyAiU1lTX3VubGluayIsIDcgIH0sCi0geyAiU1lTX3V0aW1lIiwgMTcgIH0sCi0geyAiU1lTX3dyaXRlIiwgNSAgfSwKLS8qIGVuZCBtbjEwMzAwIHN5cyB0YXJnZXQgbWFjcm9zICovCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE5MX1RBUkdFVF9zcGFyYwotI2lmZGVmIHN5c19kZWZzCi0vKiBmcm9tIHN5c2NhbGwuaCAqLwotLyogYmVnaW4gc3BhcmMgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSB7ICJTWVNfYXJndiIsIDEzICB9LAotIHsgIlNZU19hcmd2bGVuIiwgMTIgIH0sCi0geyAiU1lTX2NoZGlyIiwgMTQgIH0sCi0geyAiU1lTX2NobW9kIiwgMTYgIH0sCi0geyAiU1lTX2Nsb3NlIiwgMyAgfSwKLSB7ICJTWVNfZXhpdCIsIDEgIH0sCi0geyAiU1lTX2ZzdGF0IiwgMTAgIH0sCi0geyAiU1lTX2dldHBpZCIsIDggIH0sCi0geyAiU1lTX2tpbGwiLCA5ICB9LAotIHsgIlNZU19sc2VlayIsIDYgIH0sCi0geyAiU1lTX29wZW4iLCAyICB9LAotIHsgIlNZU19yZWFkIiwgNCAgfSwKLSB7ICJTWVNfc3RhdCIsIDE1ICB9LAotIHsgIlNZU190aW1lIiwgMTggIH0sCi0geyAiU1lTX3VubGluayIsIDcgIH0sCi0geyAiU1lTX3V0aW1lIiwgMTcgIH0sCi0geyAiU1lTX3dyaXRlIiwgNSAgfSwKLS8qIGVuZCBzcGFyYyBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBOTF9UQVJHRVRfdjg1MAotI2lmZGVmIHN5c19kZWZzCi0vKiBmcm9tIHN5c2NhbGwuaCAqLwotLyogYmVnaW4gdjg1MCBzeXMgdGFyZ2V0IG1hY3JvcyAqLwotIHsgIlNZU19BUkciLCAyNCAgfSwKLSB7ICJTWVNfY2hkaXIiLCAxMiAgfSwKLSB7ICJTWVNfY2htb2QiLCAxNSAgfSwKLSB7ICJTWVNfY2hvd24iLCAxNiAgfSwKLSB7ICJTWVNfY2xvc2UiLCA2ICB9LAotIHsgIlNZU19jcmVhdCIsIDggIH0sCi0geyAiU1lTX2V4ZWN2IiwgMTEgIH0sCi0geyAiU1lTX2V4ZWN2ZSIsIDU5ICB9LAotIHsgIlNZU19leGl0IiwgMSAgfSwKLSB7ICJTWVNfZm9yayIsIDIgIH0sCi0geyAiU1lTX2ZzdGF0IiwgMjIgIH0sCi0geyAiU1lTX2dldHBpZCIsIDIwICB9LAotIHsgIlNZU19nZXR0aW1lb2ZkYXkiLCAxMTYgIH0sCi0geyAiU1lTX2lzYXR0eSIsIDIxICB9LAotIHsgIlNZU19saW5rIiwgOSAgfSwKLSB7ICJTWVNfbHNlZWsiLCAxOSAgfSwKLSB7ICJTWVNfbWtub2QiLCAxNCAgfSwKLSB7ICJTWVNfb3BlbiIsIDUgIH0sCi0geyAiU1lTX3BpcGUiLCA0MiAgfSwKLSB7ICJTWVNfcmVhZCIsIDMgIH0sCi0geyAiU1lTX3N0YXQiLCAzOCAgfSwKLSB7ICJTWVNfdGltZSIsIDIzICB9LAotIHsgIlNZU191bmxpbmsiLCAxMCAgfSwKLSB7ICJTWVNfdXRpbWUiLCAyMDEgIH0sCi0geyAiU1lTX3dhaXQiLCAyMDIgIH0sCi0geyAiU1lTX3dhaXQ0IiwgNyAgfSwKLSB7ICJTWVNfd3JpdGUiLCA0ICB9LAotLyogZW5kIHY4NTAgc3lzIHRhcmdldCBtYWNyb3MgKi8KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL25ydW4uYyBiL3NpbS9jb21tb24vbnJ1bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWI0M2EyLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vbnJ1bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qIE5ldyB2ZXJzaW9uIG9mIHJ1biBmcm9udCBlbmQgc3VwcG9ydCBmb3Igc2ltdWxhdG9ycy4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2lmZGVmIEhBVkVfRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHVzYWdlICh2b2lkKTsKLQotZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKLQotc3RhdGljIGNoYXIgKm15bmFtZTsKLQotc3RhdGljIFNJTV9ERVNDIHNkOwotCi1zdGF0aWMgUkVUU0lHVFlQRQotY250cmxfYyAoaW50IHNpZykKLXsKLSAgaWYgKCEgc2ltX3N0b3AgKHNkKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJRdWl0IVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBjaGFyICpuYW1lOwotICBjaGFyICoqcHJvZ19hcmd2ID0gTlVMTDsKLSAgc3RydWN0IF9iZmQgKnByb2dfYmZkOwotICBlbnVtIHNpbV9zdG9wIHJlYXNvbjsKLSAgaW50IHNpZ3JjID0gMDsKLSAgaW50IHNpbmdsZV9zdGVwID0gMDsKLSAgUkVUU0lHVFlQRSAoKnByZXZfc2lnaW50KSAoKTsKLQotICBteW5hbWUgPSBhcmd2WzBdICsgc3RybGVuIChhcmd2WzBdKTsKLSAgd2hpbGUgKG15bmFtZSA+IGFyZ3ZbMF0gJiYgbXluYW1lWy0xXSAhPSAnLycpCi0gICAgLS1teW5hbWU7Ci0KLSAgLyogSU5URVJOQUw6IFdoZW4gTVlOQU1FIGlzIGBzdGVwJywgc2luZ2xlIHN0ZXAgdGhlIHNpbXVsYXRvcgotICAgICBpbnN0ZWFkIG9mIGFsbG93aW5nIGl0IHRvIHJ1biBmcmVlLiAgVGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzCi0gICAgIEhBQ0sgaXMgdG8gYWxsb3cgdGhlIHNpbV9yZXN1bWUgaW50ZXJmYWNlJ3Mgc3RlcCBhcmd1bWVudCB0byBiZQotICAgICB0ZXN0ZWQgd2l0aG91dCBoYXZpbmcgdG8gYnVpbGQvcnVuIGdkYi4gKi8KLSAgaWYgKHN0cmxlbiAobXluYW1lKSA+IDQgJiYgc3RyY21wIChteW5hbWUgLSA0LCAic3RlcCIpID09IDApCi0gICAgewotICAgICAgc2luZ2xlX3N0ZXAgPSAxOwotICAgIH0KLQotICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbXVsYXRvci4gICovCi0gIGRlZmF1bHRfY2FsbGJhY2suaW5pdCAoJmRlZmF1bHRfY2FsbGJhY2spOwotICBzZCA9IHNpbV9vcGVuIChTSU1fT1BFTl9TVEFOREFMT05FLCAmZGVmYXVsdF9jYWxsYmFjaywgTlVMTCwgYXJndik7Ci0gIGlmIChzZCA9PSAwKQotICAgIGV4aXQgKDEpOwotICBpZiAoU1RBVEVfTUFHSUMgKHNkKSAhPSBTSU1fTUFHSUNfTlVNQkVSKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludGVybmFsIGVycm9yIC0gYmFkIG1hZ2ljIG51bWJlciBpbiBzaW11bGF0b3Igc3RydWN0XG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXYXMgdGhlcmUgYSBwcm9ncmFtIHRvIHJ1bj8gICovCi0gIHByb2dfYXJndiA9IFNUQVRFX1BST0dfQVJHViAoc2QpOwotICBwcm9nX2JmZCA9IFNUQVRFX1BST0dfQkZEIChzZCk7Ci0gIGlmIChwcm9nX2FyZ3YgPT0gTlVMTCB8fCAqcHJvZ19hcmd2ID09IE5VTEwpCi0gICAgdXNhZ2UgKCk7Ci0KLSAgbmFtZSA9ICpwcm9nX2FyZ3Y7Ci0KLSAgLyogRm9yIHNpbXVsYXRvcnMgdGhhdCBkb24ndCBvcGVuIHByb2cgZHVyaW5nIHNpbV9vcGVuKCkgKi8KLSAgaWYgKHByb2dfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgcHJvZ19iZmQgPSBiZmRfb3BlbnIgKG5hbWUsIDApOwotICAgICAgaWYgKHByb2dfYmZkID09IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gXCIlc1wiOiAlc1xuIiwgCi0JCSAgIG15bmFtZSwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgICAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChwcm9nX2JmZCwgYmZkX29iamVjdCkpIAotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlc1xuIiwKLQkJICAgbXluYW1lLCBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChTVEFURV9WRVJCT1NFX1AgKHNkKSkKLSAgICBwcmludGYgKCIlcyAlc1xuIiwgbXluYW1lLCBuYW1lKTsKLQotICAvKiBMb2FkIHRoZSBwcm9ncmFtIGludG8gdGhlIHNpbXVsYXRvci4gICovCi0gIGlmIChzaW1fbG9hZCAoc2QsIG5hbWUsIHByb2dfYmZkLCAwKSA9PSBTSU1fUkNfRkFJTCkKLSAgICBleGl0ICgxKTsKLQotICAvKiBQcmVwYXJlIHRoZSBwcm9ncmFtIGZvciBleGVjdXRpb24uICAqLwotI2lmZGVmIEhBVkVfRU5WSVJPTgotICBzaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgcHJvZ19iZmQsIHByb2dfYXJndiwgZW52aXJvbik7Ci0jZWxzZQotICBzaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgcHJvZ19iZmQsIHByb2dfYXJndiwgTlVMTCk7Ci0jZW5kaWYKLQotICAvKiBSdW4vU3RlcCB0aGUgcHJvZ3JhbS4gICovCi0gIGlmIChzaW5nbGVfc3RlcCkKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIHByZXZfc2lnaW50ID0gc2lnbmFsIChTSUdJTlQsIGNudHJsX2MpOwotCSAgc2ltX3Jlc3VtZSAoc2QsIDEvKnN0ZXAqLywgMCk7Ci0JICBzaWduYWwgKFNJR0lOVCwgcHJldl9zaWdpbnQpOwotCSAgc2ltX3N0b3BfcmVhc29uIChzZCwgJnJlYXNvbiwgJnNpZ3JjKTsKLQotCSAgaWYgKChyZWFzb24gPT0gc2ltX3N0b3BwZWQpICYmCi0JICAgICAgKHNpZ3JjID09IHNpbV9zaWduYWxfdG9faG9zdCAoc2QsIFNJTV9TSUdJTlQpKSkKLQkgICAgYnJlYWs7IC8qIGV4aXQgb24gY29udHJvbC1DICovCi0JfQotICAgICAgLyogcmVtYWluIG9uIGJyZWFrcG9pbnQgb3Igc2lnbmFscyBpbiBvZSBtb2RlKi8KLSAgICAgIHdoaWxlICgoKHJlYXNvbiA9PSBzaW1fc2lnbmFsbGVkKSAmJgotCSAgICAgIChzaWdyYyA9PSBzaW1fc2lnbmFsX3RvX2hvc3QgKHNkLCBTSU1fU0lHVFJBUCkpKSB8fAotCSAgICAgKChyZWFzb24gPT0gc2ltX3N0b3BwZWQpICYmIAotCSAgICAgIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkpKTsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgZG8KLQl7Ci0jaWYgZGVmaW5lZCAoSEFWRV9TSUdBQ1RJT04pICYmIGRlZmluZWQgKFNBX1JFU1RBUlQpCi0JICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvc2E7Ci0JICBzYS5zYV9oYW5kbGVyID0gY250cmxfYzsKLQkgIHNpZ2VtcHR5c2V0ICgmc2Euc2FfbWFzayk7Ci0JICBzYS5zYV9mbGFncyA9IDA7Ci0JICBzaWdhY3Rpb24gKFNJR0lOVCwgJnNhLCAmb3NhKTsKLQkgIHByZXZfc2lnaW50ID0gb3NhLnNhX2hhbmRsZXI7Ci0jZWxzZQotCSAgcHJldl9zaWdpbnQgPSBzaWduYWwgKFNJR0lOVCwgY250cmxfYyk7Ci0jZW5kaWYKLQkgIHNpbV9yZXN1bWUgKHNkLCAwLCBzaWdyYyk7Ci0JICBzaWduYWwgKFNJR0lOVCwgcHJldl9zaWdpbnQpOwotCSAgc2ltX3N0b3BfcmVhc29uIChzZCwgJnJlYXNvbiwgJnNpZ3JjKTsKLQkgIAotCSAgaWYgKChyZWFzb24gPT0gc2ltX3N0b3BwZWQpICYmCi0JICAgICAgKHNpZ3JjID09IHNpbV9zaWduYWxfdG9faG9zdCAoc2QsIFNJTV9TSUdJTlQpKSkKLQkgICAgYnJlYWs7IC8qIGV4aXQgb24gY29udHJvbC1DICovCi0JICAKLQkgIC8qIHJlbWFpbiBvbiBzaWduYWxzIGluIG9lIG1vZGUgKi8KLQl9IHdoaWxlICgocmVhc29uID09IHNpbV9zdG9wcGVkKSAmJgotCQkgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKSk7Ci0gICAgICAKLSAgICB9Ci0gIC8qIFByaW50IGFueSBzdGF0cyB0aGUgc2ltdWxhdG9yIGNvbGxlY3RlZC4gICovCi0gIHNpbV9pbmZvIChzZCwgMCk7Ci0gIAotICAvKiBTaHV0ZG93biB0aGUgc2ltdWxhdG9yLiAgKi8KLSAgc2ltX2Nsb3NlIChzZCwgMCk7Ci0gIAotICAvKiBJZiByZWFzb24gaXMgc2ltX2V4aXRlZCwgdGhlbiBzaWdyYyBob2xkcyB0aGUgZXhpdCBjb2RlIHdoaWNoIHdlIHdhbnQKLSAgICAgdG8gcmV0dXJuLiAgSWYgcmVhc29uIGlzIHNpbV9zdG9wcGVkIG9yIHNpbV9zaWduYWxsZWQsIHRoZW4gc2lncmMgaG9sZHMKLSAgICAgdGhlIHNpZ25hbCB0aGF0IHRoZSBzaW11bGF0b3IgcmVjZWl2ZWQ7IHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgdG8KLSAgICAgaW5kaWNhdGUgZmFpbHVyZS4gICovCi0gIAotI2lmZGVmIFNJTV9IODMwMCAvKiBGSVhNRTogVWdoLiAgZ3JlcCBmb3IgU0xFRVAgaW4gY29tcGlsZS5jICAqLwotICBpZiAoc2lncmMgPT0gU0lHSUxMKQotICAgIGFib3J0ICgpOwotICBzaWdyYyA9IDA7Ci0jZWxzZQotICAvKiBXaHkgZGlkIHdlIHN0b3A/ICovCi0gIHN3aXRjaCAocmVhc29uKQotICAgIHsKLSAgICBjYXNlIHNpbV9zaWduYWxsZWQ6Ci0gICAgY2FzZSBzaW1fc3RvcHBlZDoKLSAgICAgIGlmIChzaWdyYyAhPSAwKQotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcm9ncmFtIHN0b3BwZWQgd2l0aCBzaWduYWwgJWQuXG4iLCBzaWdyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc2ltX2V4aXRlZDoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInByb2dyYW0gaW4gdW5kZWZpbmVkIHN0YXRlICglZDolZClcbiIsIHJlYXNvbiwgc2lncmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gc2lncmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHByb2dyYW0gW3Byb2dyYW0gYXJnc11cbiIsIG15bmFtZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlJ1biBgJXMgLS1oZWxwJyBmb3IgZnVsbCBsaXN0IG9mIG9wdGlvbnMuXG4iLCBteW5hbWUpOwotICBleGl0ICgxKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vcnVuLjEgYi9zaW0vY29tbW9uL3J1bi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODZlMjBiLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vcnVuLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJ1biAxICIxM29jdDE5OTMiICJHTlUgVG9vbHMiICJHTlUgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1ydW5cKGVtXCZTaW11bGF0b3IgZnJvbnQtZW5kCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBydW4KLS5SQiAiW1x8IiBcLXYgIlx8XSIKLS4iIC5SQiAiW1x8IiBcLXQgIlx8XSIKLS5SQiAiW1x8IiBcLXAKLS5JUiBmcmVxICJcfF0iCi0uUkIgIltcfCIgXC1tCi0uSVIgbWVtb3J5ICJcfF0iCi0uSSBwcm9ncmFtCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotCi1Vc2UgYFx8XGMKLS5CSSBydW4gIiBwcm9ncmFtIlxjCi1cJlx8JyB0byBleGVjdXRlIGEgYmluYXJ5IGJ5IGludGVycHJldGluZyBtYWNoaW5lIGluc3RydWN0aW9ucyBvbiB5b3VyCi1ob3N0IGNvbXB1dGVyLgotCi0uQiBydW4KLWlzIHRoZSBzYW1lIGVtdWxhdG9yIHVzZWQgYnkgR0RCJ3MgYFx8XGMKLS5CIHRhcmdldCBzaW1cYwotXCZcfCcgY29tbWFuZC4gIFlvdSBjYW4gcnVuIGl0IGRpcmVjdGx5IGJ5IGV4ZWN1dGluZwotLkIgcnVuCi1pZiB5b3UganVzdCB3YW50IHRvIHNlZSB5b3VyIHByb2dyYW0gZXhlY3V0ZSwgYW5kIGRvIG5vdCBuZWVkIGFueQotZGVidWdnZXIgZnVuY3Rpb25hbGl0eS4gIFlvdSBjYW4gYWxzbyB1c2UKLS5CIHJ1bgotdG8gZ2VuZXJhdGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvciBhbmFseXNpcyB3aXRoCi0uQlIgZ3Byb2YgLgotCi0uU0ggT1BUSU9OUwotCi0uVFAKLS5CIFwtdgotVmVyYm9zZSBvdXRwdXQuICBEaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biBiZWZvcmUKLWV4ZWN1dGlvbjsgYWZ0ZXIgZXhlY3V0aW9uLCBkaXNwbGF5IHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCi1leGVjdXRlZCwgdGhlIG51bWJlciBvZiBtYWNoaW5lIGN5Y2xlcyBlbXVsYXRlZCwgdGhlIG51bWJlciBvZgotcGlwZWxpbmUgc3RhbGxzLCB0aGUgcmVhbCB0aW1lIHRha2VuLCB0aGUgZW11bGF0ZWQgZXhlY3V0aW9uIHRpbWUKLXRha2VuLCBhbmQgYSBzdW1tYXJ5IG9mIGhvdyBtdWNoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3YXMgZ2VuZXJhdGVkLgotLiIKLS4iIC5UUAotLiIgLkIgXC10Ci0uIiBgdHJhY2UnLCBjYWxscyBhIHNpbV90cmFjZSByb3V0aW5lIHRoYXQgZG9lcyBub3RoaW5nLgotCi0uVFAKLS5CSSBcLXAgIiBmcmVxIgotR2VuZXJhdGUgcHJvZmlsZSBpbmZvcm1hdGlvbiAoZm9yIHVzZSB3aXRoCi0uQiBncHJvZlxjCi1cJikuCi0uSSBmcmVxCi1pcyB0aGUgcHJvZmlsaW5nIGZyZXF1ZW5jeS4gIFdyaXRlIHRoZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gYSBmaWxlIGNhbGxlZAotLkJSIGdtb24ub3V0IC4KLQotLlRQCi0uQkkgXC1tICIgbWVtb3J5IgotU2V0IHRoZSBtZW1vcnkgc2l6ZSBmb3IgdGhlIGVtdWxhdGVkIG1hY2hpbmUgdG8gdHdvIHRvIHRoZSBwb3dlcgotLklSIG1lbW9yeSAuCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyAxOSwgZW11bGF0aW5nIGEgYm9hcmQgd2l0aCA1MjQyODggYnl0ZXMgb2YgbWVtb3J5LgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBncHJvZiAiXHwnIgotZW50cnkgaW4KLS5CIGluZm9cYwotXCY7Ci0uUkIgImBcfCIgZ2RiICJcfCciCi1lbnRyeSBpbgotLkIgaW5mb1xjCi1cJjsKLS5JIAotVXNpbmcgR0RCOiBBIEd1aWRlIHRvIHRoZSBHTlUgU291cmNlLUxldmVsIERlYnVnZ2VyXGMKLSwgUmljaGFyZCBNLiBTdGFsbG1hbiBhbmQgUm9sYW5kIEguIFBlc2NoLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ydW4uYyBiL3NpbS9jb21tb24vcnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOThkZjguLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9ydW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKiBydW4gZnJvbnQgZW5kIHN1cHBvcnQgZm9yIGFsbCB0aGUgc2ltdWxhdG9ycy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMtOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tLAotICAgYW5kIG90aGVycyBhdCBDeWdudXMuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAidGNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaW5jbHVkZSAiLi4vbGliaWJlcnR5L2FsbG9jYS1jb25mLmgiCi0KLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgb3B0aW5kOwotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQotZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKLQotc3RhdGljIGNoYXIgKm15bmFtZTsKLQotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci0KLSNpZmRlZiBORUVEX1VJX0xPT1BfSE9PSwotLyogR2RiIGZvb2xlcnkuIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGdkYiB1c2luZyBhIGd1aS4gKi8KLWludCAoKnVpX2xvb3BfaG9vaykgUEFSQU1TICgoaW50IHNpZ25vKSk7Ci0jZW5kaWYKLQotc3RhdGljIFNJTV9ERVNDIHNkOwotCi1zdGF0aWMgUkVUU0lHVFlQRQotY250cmxfYyAoaW50IHNpZyBBVFRSSUJVVEVfVU5VU0VEKQotewotICBpZiAoISBzaW1fc3RvcCAoc2QpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlF1aXQhXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqKmF2OwotewotICBSRVRTSUdUWVBFICgqcHJldl9zaWdpbnQpICgpOwotICBiZmQgKmFiZmQ7Ci0gIGludCBpOwotICBpbnQgdmVyYm9zZSA9IDA7Ci0gIGludCB0cmFjZSA9IDA7Ci0jaWZkZWYgU0lNX0hBVkVfRU5WSVJPTk1FTlQKLSAgaW50IG9wZXJhdGluZ19wID0gMDsKLSNlbmRpZgotICBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciAqbm9fYXJnc1s0XTsKLSAgY2hhciAqKnNpbV9hcmd2ID0gJm5vX2FyZ3NbMF07Ci0gIGNoYXIgKipwcm9nX2FyZ3M7Ci0gIGVudW0gc2ltX3N0b3AgcmVhc29uOwotICBpbnQgc2lncmM7Ci0KLSAgbXluYW1lID0gYXZbMF0gKyBzdHJsZW4gKGF2WzBdKTsKLSAgd2hpbGUgKG15bmFtZSA+IGF2WzBdICYmIG15bmFtZVstMV0gIT0gJy8nKQotICAgIC0tbXluYW1lOwotCi0gIC8qIFRoZSBmaXJzdCBlbGVtZW50IG9mIHNpbV9vcGVuJ3MgYXJndiBpcyB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KLSAgbm9fYXJnc1swXSA9IGF2WzBdOwotI2lmZGVmIFNJTV9IQVZFX0JJRU5ESUFOCi0gIG5vX2FyZ3NbMV0gPSAiLUUiOwotICBub19hcmdzWzJdID0gInNldC1sYXRlciI7Ci0jZW5kaWYKLQotICAvKiBGSVhNRTogVGhpcyBpcyBjdXJyZW50bHkgYmVpbmcgbWlncmF0ZWQgaW50byBzaW1fb3Blbi4KLSAgICAgU2ltdWxhdG9ycyB0aGF0IHVzZSBmdW5jdGlvbnMgc3VjaCBhcyBzaW1fc2l6ZSgpIHN0aWxsIHJlcXVpcmUKLSAgICAgdGhpcy4gKi8KLSAgZGVmYXVsdF9jYWxsYmFjay5pbml0ICgmZGVmYXVsdF9jYWxsYmFjayk7Ci0gIHNpbV9zZXRfY2FsbGJhY2tzICgmZGVmYXVsdF9jYWxsYmFjayk7Ci0KLSAgLyogRklYTUU6IFRoaXMgaXMgY3VycmVudGx5IGJlaW5nIHJld3JpdHRlbiB0byBoYXZlIGVhY2ggc2ltdWxhdG9yCi0gICAgIGRvIGFsbCBhcmd2IHByb2Nlc3NpbmcuICAqLwotCi0jaWZkZWYgU0lNX0g4MzAwIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0gIHdoaWxlICgoaSA9IGdldG9wdCAoYWMsIGF2LCAiYTpjOm06b3A6czpodHYiKSkgIT0gRU9GKSAKLSNlbHNlCi0gIHdoaWxlICgoaSA9IGdldG9wdCAoYWMsIGF2LCAiYTpjOm06b3A6czp0diIpKSAhPSBFT0YpIAotI2VuZGlmCi0gICAgc3dpdGNoIChpKQotICAgICAgewotICAgICAgY2FzZSAnYSc6Ci0JLyogRklYTUU6IFRlbXBvcmFyeSBoYWNrLiAgKi8KLQl7Ci0JICBpbnQgbGVuID0gc3RybGVuIChhdlswXSkgKyBzdHJsZW4gKG9wdGFyZyk7Ci0JICBjaGFyICphcmdidWYgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDIgKyA1MCk7Ci0JICBzcHJpbnRmIChhcmdidWYsICIlcyAlcyIsIGF2WzBdLCBvcHRhcmcpOwotI2lmZGVmIFNJTV9IQVZFX0JJRU5ESUFOCi0JICAvKiBUaGUgZGVzaXJlZCBlbmRpYW5uZXNzIG11c3QgYmUgcGFzc2VkIHRvIHNpbV9vcGVuLgotCSAgICAgVGhlIHZhbHVlIGZvciAic2V0LWxhdGVyIiBpcyBzZXQgd2hlbiB3ZSBrbm93IHdoYXQgaXQgaXMuCi0JICAgICAtRSBzdXBwb3J0IGlzbid0IHlldCBwYXJ0IG9mIHRoZSBwdWJsaXNoZWQgaW50ZXJmYWNlLiAgKi8KLQkgIHN0cmNhdCAoYXJnYnVmLCAiIC1FIHNldC1sYXRlciIpOwotI2VuZGlmCi0JICBzaW1fYXJndiA9IGJ1aWxkYXJndiAoYXJnYnVmKTsKLQl9Ci0JYnJlYWs7Ci0jaWZkZWYgU0lNX0hBVkVfU0lNQ0FDSEUKLSAgICAgIGNhc2UgJ2MnOgotCXNpbV9zZXRfc2ltY2FjaGVfc2l6ZSAoYXRvaSAob3B0YXJnKSk7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGNhc2UgJ20nOgotCS8qIEZJWE1FOiBSZW5hbWUgdG8gc2ltX3NldF9tZW1fc2l6ZS4gICovCi0Jc2ltX3NpemUgKGF0b2kgKG9wdGFyZykpOwotCWJyZWFrOwotI2lmZGVmIFNJTV9IQVZFX0VOVklST05NRU5UCi0gICAgICBjYXNlICdvJzoKLQkvKiBPcGVyYXRpbmcgZW5pcm9ubWVudCB3aGVyZSBhbnkgc2lnbmFscyBhcmUgZGVsaXZlcmVkIHRvIHRoZQotICAgICAgICAgICB0YXJnZXQuICovCi0Jb3BlcmF0aW5nX3AgPSAxOwotCWJyZWFrOwotI2VuZGlmIFNJTV9IQVZFX0VOVklST05NRU5UCi0jaWZkZWYgU0lNX0hBVkVfUFJPRklMRQotICAgICAgY2FzZSAncCc6Ci0Jc2ltX3NldF9wcm9maWxlIChhdG9pIChvcHRhcmcpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ3MnOgotCXNpbV9zZXRfcHJvZmlsZV9zaXplIChhdG9pIChvcHRhcmcpKTsKLQlicmVhazsKLSNlbmRpZgotICAgICAgY2FzZSAndCc6Ci0JdHJhY2UgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSAndic6Ci0JLyogVGhpbmdzIHRoYXQgYXJlIHByaW50ZWQgd2l0aCAtdiBhcmUgdGhlIGtpbmRzIG9mIHRoaW5ncyB0aGF0Ci0JICAgZ2NjIC12IHByaW50cy4gIFRoaXMgaXMgbm90IG1lYW50IHRvIGluY2x1ZGUgZGV0YWlsZWQgdHJhY2luZwotCSAgIG9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwganVzdCBzdW1tYXJpZXMuICAqLwotCXZlcmJvc2UgPSAxOwotCS8qIHNpbV9zZXRfdmVyYm9zZSAoMSk7ICovCi0JYnJlYWs7Ci0JLyogRklYTUU6IFF1aWNrIGhhY2ssIHRvIGJlIHJlcGxhY2VkIGJ5IG1vcmUgZ2VuZXJhbCBmYWNpbGl0eS4gICovCi0jaWZkZWYgU0lNX0g4MzAwCi0gICAgICBjYXNlICdoJzoKLQlzZXRfaDgzMDBoICgxKTsKLQlicmVhazsKLSNlbmRpZgotICAgICAgZGVmYXVsdDoKLQl1c2FnZSAoKTsKLSAgICAgIH0KLQotICBhYyAtPSBvcHRpbmQ7Ci0gIGF2ICs9IG9wdGluZDsKLSAgaWYgKGFjIDw9IDApCi0gICAgdXNhZ2UgKCk7Ci0KLSAgbmFtZSA9ICphdjsKLSAgcHJvZ19hcmdzID0gYXY7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgcHJpbnRmICgiJXMgJXNcbiIsIG15bmFtZSwgbmFtZSk7Ci0gICAgfQotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIDApOwotICBpZiAoIWFiZmQpIAotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzOiAlc1xuIiwgCi0JICAgICAgIG15bmFtZSwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGNhbid0IGxvYWQgJXM6ICVzXG4iLAotCSAgICAgICBteW5hbWUsIG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotI2lmZGVmIFNJTV9IQVZFX0JJRU5ESUFOCi0gIC8qIFRoZSBlbmRpYW5uZXNzIG11c3QgYmUgcGFzc2VkIHRvIHNpbV9vcGVuIGJlY2F1c2Ugb25lIG1heSB3aXNoIHRvCi0gICAgIGV4YW1pbmUvc2V0IHJlZ2lzdGVycyBiZWZvcmUgY2FsbGluZyBzaW1fbG9hZCBbd2hpY2ggaXMgdGhlIG90aGVyCi0gICAgIHBsYWNlIHdoZXJlIG9uZSBjYW4gZGV0ZXJtaW5lIGVuZGlhbm5lc3NdLiAgV2UgcHJldmlvdXNseSBwYXNzZWQgdGhlCi0gICAgIGVuZGlhbm5lc3MgdmlhIGdsb2JhbCBgdGFyZ2V0X2J5dGVfb3JkZXInIGJ1dCB0aGF0J3Mgbm90IGEgY2xlYW4KLSAgICAgaW50ZXJmYWNlLiAgKi8KLSAgZm9yIChpID0gMTsgc2ltX2FyZ3ZbaSArIDFdICE9IE5VTEw7ICsraSkKLSAgICBjb250aW51ZTsKLSAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICBzaW1fYXJndltpXSA9ICJiaWciOwotICBlbHNlCi0gICAgc2ltX2FyZ3ZbaV0gPSAibGl0dGxlIjsKLSNlbmRpZgotCi0gIC8qIEVuc3VyZSB0aGF0IGFueSBydW4tdGltZSBpbml0aWFsaXNhdGlvbiB0aGF0IG5lZWRzIHRvIGJlCi0gICAgIHBlcmZvcm1lZCBieSB0aGUgc2ltdWxhdG9yIGNhbiBvY2N1ci4gKi8KLSAgc2QgPSBzaW1fb3BlbiAoU0lNX09QRU5fU1RBTkRBTE9ORSwgJmRlZmF1bHRfY2FsbGJhY2ssIGFiZmQsIHNpbV9hcmd2KTsKLSAgaWYgKHNkID09IDApCi0gICAgZXhpdCAoMSk7Ci0KLSAgaWYgKHNpbV9sb2FkIChzZCwgbmFtZSwgYWJmZCwgMCkgPT0gU0lNX1JDX0ZBSUwpCi0gICAgZXhpdCAoMSk7Ci0KLSAgaWYgKHNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBwcm9nX2FyZ3MsIE5VTEwpID09IFNJTV9SQ19GQUlMKQotICAgIGV4aXQgKDEpOwotCi0jaWZkZWYgU0lNX0hBVkVfRU5WSVJPTk1FTlQKLSAgLyogTk9URTogQW4gb2xkIHNpbXVsYXRvciBzdXBwb3J0aW5nIHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgTVVTVAotICAgICBwcm92aWRlIHNpbV9zZXRfdHJhY2UoKSBhbmQgbm90IHNpbV90cmFjZSgpLiBUaGF0IHdheQotICAgICBzaW1fc3RvcF9yZWFzb24oKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgYW55IHN0b3AgcmVhc29uLiAqLwotICBpZiAodHJhY2UpCi0gICAgc2ltX3NldF90cmFjZSAoKTsKLSAgc2lncmMgPSAwOwotICBkbwotICAgIHsKLSAgICAgIHByZXZfc2lnaW50ID0gc2lnbmFsIChTSUdJTlQsIGNudHJsX2MpOwotICAgICAgc2ltX3Jlc3VtZSAoc2QsIDAsIHNpZ3JjKTsKLSAgICAgIHNpZ25hbCAoU0lHSU5ULCBwcmV2X3NpZ2ludCk7Ci0gICAgICBzaW1fc3RvcF9yZWFzb24gKHNkLCAmcmVhc29uLCAmc2lncmMpOwotICAgIH0KLSAgd2hpbGUgKG9wZXJhdGluZ19wICYmIHJlYXNvbiA9PSBzaW1fc3RvcHBlZCAmJiBzaWdyYyAhPSBTSUdJTlQpOwotI2Vsc2UKLSAgaWYgKHRyYWNlKQotICAgIHsKLSAgICAgIGludCBkb25lID0gMDsKLSAgICAgIHByZXZfc2lnaW50ID0gc2lnbmFsIChTSUdJTlQsIGNudHJsX2MpOwotICAgICAgd2hpbGUgKCFkb25lKQotCXsKLQkgIGRvbmUgPSBzaW1fdHJhY2UgKHNkKTsKLQl9Ci0gICAgICBzaWduYWwgKFNJR0lOVCwgcHJldl9zaWdpbnQpOwotICAgICAgc2ltX3N0b3BfcmVhc29uIChzZCwgJnJlYXNvbiwgJnNpZ3JjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X3NpZ2ludCA9IHNpZ25hbCAoU0lHSU5ULCBjbnRybF9jKTsKLSAgICAgIHNpZ3JjID0gMDsKLSAgICAgIHNpbV9yZXN1bWUgKHNkLCAwLCBzaWdyYyk7Ci0gICAgICBzaWduYWwgKFNJR0lOVCwgcHJldl9zaWdpbnQpOwotICAgICAgc2ltX3N0b3BfcmVhc29uIChzZCwgJnJlYXNvbiwgJnNpZ3JjKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAodmVyYm9zZSkKLSAgICBzaW1faW5mbyAoc2QsIDApOwotICBzaW1fY2xvc2UgKHNkLCAwKTsKLQotICAvKiBJZiByZWFzb24gaXMgc2ltX2V4aXRlZCwgdGhlbiBzaWdyYyBob2xkcyB0aGUgZXhpdCBjb2RlIHdoaWNoIHdlIHdhbnQKLSAgICAgdG8gcmV0dXJuLiAgSWYgcmVhc29uIGlzIHNpbV9zdG9wcGVkIG9yIHNpbV9zaWduYWxsZWQsIHRoZW4gc2lncmMgaG9sZHMKLSAgICAgdGhlIHNpZ25hbCB0aGF0IHRoZSBzaW11bGF0b3IgcmVjZWl2ZWQ7IHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgdG8KLSAgICAgaW5kaWNhdGUgZmFpbHVyZS4gICovCi0KLSNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IFVnaC4gIGdyZXAgZm9yIFNMRUVQIGluIGNvbXBpbGUuYyAgKi8KLSAgaWYgKHNpZ3JjID09IFNJR0lMTCkKLSAgICBhYm9ydCAoKTsKLSAgc2lncmMgPSAwOwotI2Vsc2UKLSAgLyogV2h5IGRpZCB3ZSBzdG9wPyAqLwotICBzd2l0Y2ggKHJlYXNvbikKLSAgICB7Ci0gICAgY2FzZSBzaW1fc2lnbmFsbGVkOgotICAgIGNhc2Ugc2ltX3N0b3BwZWQ6Ci0gICAgICBpZiAoc2lncmMgIT0gMCkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHJvZ3JhbSBzdG9wcGVkIHdpdGggc2lnbmFsICVkLlxuIiwgc2lncmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHNpbV9leGl0ZWQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc2ltX3J1bm5pbmc6Ci0gICAgY2FzZSBzaW1fcG9sbGluZzogLyogdGhlc2UgaW5kaWNhdGUgYSBzZXJpb3VzIHByb2JsZW0gKi8KLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gc2lncmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHByb2dyYW0gW3Byb2dyYW0gYXJnc11cbiIsIG15bmFtZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiLWEgYXJncyAgICAgICAgIFBhc3MgYGFyZ3MnIHRvIHNpbXVsYXRvci5cbiIpOwotI2lmZGVmIFNJTV9IQVZFX1NJTUNBQ0hFCi0gIGZwcmludGYgKHN0ZGVyciwgIi1jIHNpemUgICAgICAgICBTZXQgc2ltdWxhdG9yIGNhY2hlIHNpemUgdG8gYHNpemUnLlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBTSU1fSDgzMDAKLSAgZnByaW50ZiAoc3RkZXJyLCAiLWggICAgICAgICAgICAgIEV4ZWN1dGFibGUgaXMgZm9yIGg4LzMwMGggb3IgaDgvMzAwcy5cbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIi1tIHNpemUgICAgICAgICBTZXQgbWVtb3J5IHNpemUgb2Ygc2ltdWxhdG9yLCBpbiBieXRlcy5cbiIpOwotI2lmZGVmIFNJTV9IQVZFX0VOVklST05NRU5UCi0gIGZwcmludGYgKHN0ZGVyciwgIi1vICAgICAgICAgICAgICBTZWxlY3Qgb3BlcmF0aW5nIChrZXJuZWwpIGVudmlyb25tZW50LlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBTSU1fSEFWRV9QUk9GSUxFCi0gIGZwcmludGYgKHN0ZGVyciwgIi1wIGZyZXEgICAgICAgICBTZXQgcHJvZmlsaW5nIGZyZXF1ZW5jeS5cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICItcyBzaXplICAgICAgICAgU2V0IHByb2ZpbGluZyBzaXplLlxuIik7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiLXQgICAgICAgICAgICAgIFBlcmZvcm0gaW5zdHJ1Y3Rpb24gdHJhY2luZy5cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAgICAgICAgICAgICAgTm90ZTogVmVyeSBmZXcgc2ltdWxhdG9ycyBzdXBwb3J0IHRyYWNpbmcuXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiLXYgICAgICAgICAgICAgIFZlcmJvc2Ugb3V0cHV0LlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgInByb2dyYW0gYXJncyAgICBBcmd1bWVudHMgdG8gcGFzcyB0byBzaW11bGF0ZWQgcHJvZ3JhbS5cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAgICAgICAgICAgICAgTm90ZTogVmVyeSBmZXcgc2ltdWxhdG9ycyBzdXBwb3J0IHRoaXMuXG4iKTsKLSAgZXhpdCAoMSk7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1hYm9ydC5jIGIvc2ltL2NvbW1vbi9zaW0tYWJvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YmYyMC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1hYm9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogR2VuZXJpYyBzaW11bGF0b3IgYWJvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0vKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHNpbV9lbmdpbmVfYWJvcnQgdGhhdCBkb2VzIG5vdCB1c2UKLSAgIGxvbmdqbXAsIGluc3RlYWQgaXQganVzdCBjYWxscyBzaW1faW9fZXJyb3IuICBzaW1faW9fZXJyb3Igd2lsbAotICAganVtcCByaWdodCBvdXQgb2YgdGhlIHNpbXVsYXRvci4KLQotICAgSXQgaXMgaW50ZW5kZWQgYXMgYSBob2xkZXIgZm9yIHNpbXVsYXRvcnMgdGhhdCBoYXZlIHN0YXJ0ZWQgdG8gdXNlCi0gICBzaW0tY29yZSBldC5hbC4gYnV0IGFyZSBub3QgeWV0IGluIGEgcG9zaXRpb24gdG8gdXNlIHNpbS1lbmdpbmUKLSAgICh0aGUgc2V0am1wL2xvbmdqbXAgY29kZSkuICovCi0KLQotdm9pZAotc2ltX2VuZ2luZV9hYm9ydCAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2NwdSAqY3B1LAotCQkgIHNpbV9jaWEgY2lhLAotCQkgIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAuLi4pCi17Ci0gIEFTU0VSVCAoc2QgPT0gTlVMTCB8fCBTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBpZiAoc2QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB2YV9saXN0IGFwOwotICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICBzaW1faW9fZXZwcmludGYgKHNkLCBmbXQsIGFwKTsKLSAgICAgIHZhX2VuZChhcCk7Ci0gICAgICBzaW1faW9fZXJyb3IgKHNkLCAiXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YV9saXN0IGFwOwotICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFwKTsKLSAgICAgIHZhX2VuZChhcCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYWx1LmggYi9zaW0vY29tbW9uL3NpbS1hbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkMTAxOC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1hbHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNDcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9TSU1fQUxVX0hfCi0jZGVmaW5lIF9TSU1fQUxVX0hfCi0KLSNpbmNsdWRlICJzeW1jYXQuaCIKLQotCi0vKiBJTlRFR0VSIEFMVSBNT0RVTEU6Ci0KLSAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIDIncyBjb21wbGVtZW50IGFyaXRobWV0aWMKLSAgIGluY2x1ZGluZyB0aGUgcmVjb3JkaW5nIG9mIGNhcnJ5IGFuZCBvdmVyZmxvdyBzdGF0dXMgYml0cy4KLQotCi0gICBFWEFNUExFOgotCi0gICBDb2RlIHVzaW5nIHRoaXMgbW9kdWxlIGluY2x1ZGVzIGl0IGludG8gc2ltLW1haW4uaCBhbmQgdGhlbiwgYXMgYQotICAgY29udmVudGlvbiwgZGVmaW5lcyBtYWNybydzIEFMVSpfRU5EIHRoYXQgcmVjb3JkcyB0aGUgcmVzdWx0IG9mIGFueQotICAgYXJpdG1ldGljIHBlcmZvcm1lZC4gIEV4OgotCi0gICAJI2luY2x1ZGUgInNpbS1hbHUuaCIKLQkjZGVmaW5lIEFMVTMyX0VORChSRVMpIFwKLQkoUkVTKSA9IEFMVTMyX09WRVJGTE9XX1JFU1VMVDsgXAotCWNhcnJ5ID0gQUxVMzJfSEFEX0NBUlJZX0JPUlJPVzsgXAotCW92ZXJmbG93ID0gQUxVMzJfSEFEX09WRVJGTE9XCi0KLSAgIFRoZSBtYWNybydzIGFyZSB0aGVuIHVzZWQgdmlzOgotCi0gICAgICAgIHsKLQkgIEFMVTMyX0JFR0lOIChHUFJbaV0pOwotCSAgQUxVMzJfQUREQyAoR1BSW2pdKTsKLQkgIEFMVTMyX0VORCAoR1BSW2tdKTsKLQl9Ci0KLQotICAgTk9URVM6Ci0KLSAgIE1hY3JvcyBleGlzdCBmb3IgZWZmaWNpZW50bHkgY29tcHV0aW5nIDgsIDE2LCAzMiBhbmQgNjQgYml0Ci0gICBhcml0aG1ldGljIC0gQUxVOF8qLCBBTFUxNl8qLCAuLi4uICBJbiBhZGRpdGlvbiwgYWNjb3JkaW5nIHRvCi0gICBUQVJHRVRfV09SRF9CSVRTSVpFIGEgc2V0IG9mIHNob3J0LWhhbmQgbWFjcm9zIGFyZSBkZWZpbmVkIC0gQUxVXyoKLQotICAgSW5pdGlhbGl6YXRpb246Ci0KLQlBTFUqX0JFR0lOKEFDQyk6IERlY2xhcmUgaW5pdGlhbGl6ZSB0aGUgQUxVIGFjY3VtdWxhdG9yIHdpdGggQUNDLgotCi0gICBSZXN1bHRzOgotCi0gICAgICAgIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgZmluYWwgcmVzdWx0IG1heSBiZSBjb21wdXRlZCBhIG51bWJlcgotICAgICAgICBvZiBkaWZmZXJlbnQgd2F5cy4gIFRocmVlIGRpZmZlcmVudCBvdmVyZmxvdyBtYWNybydzIGFyZQotICAgICAgICBkZWZpbmVkLCB0aGUgbW9zdCBlZmZpY2llbnQgb25lIHRvIHVzZSBkZXBlbmRzIG9uIHdoaWNoIG90aGVyCi0gICAgICAgIG91dHB1dHMgZnJvbSB0aGUgYWx1IGFyZSBiZWluZyB1c2VkLgotCi0JQUxVKl9SRVNVTFQ6IEdlbmVyaWMgQUxVIHJlc3VsdCBvdXRwdXQuCi0KLSAgIAlBTFUqX0hBRF9PVkVSRkxPVzogUmV0dXJucyBhIG5vbnplcm8gdmFsdWUgaWYgc2lnbmVkIG92ZXJmbG93Ci0gICAJb2NjdXJlZC4KLQotCUFMVSpfT1ZFUkZMT1dfUkVTVUxUOiBJZiB0aGUgbWFjcm8gQUxVKl9IQURfT1ZFUkZMT1cgaXMgYmVpbmcKLQl1c2VkIHRoaXMgaXMgdGhlIG1vc3QgZWZmaWNpZW50IHJlc3VsdCBhdmFpbGFibGUuICBFeDoKLQotCQkjZGVmaW5lIEFMVTE2X0VORChSRVMpIFwKLQkJaWYgKEFMVTE2X0hBRF9PVkVSRkxPVykgXAotCQkgIHNpbV9lbmdpbmVfaGFsdCAoLi4uKTsgXAotCQkoUkVTKSA9IEFMVTE2X09WRVJGTE9XX1JFU1VMVAotICAgCi0gICAJQUxVKl9IQURfQ0FSUllfQk9SUk9XOiBSZXR1cm5zIGEgbm9uemVybyB2YWx1ZSBpZiB1bnNpZ25lZAotICAgCW92ZXJmbG93IG9yIHVuZGVyZmxvdyAoYWxzbyByZWZlcmVkIHRvIGFzIGNhcnJ5IGFuZCBib3Jyb3cpCi0gICAJb2NjdXJlZC4KLQotCUFMVSpfQ0FSUllfQk9SUk9XX1JFU1VMVDogSWYgdGhlIG1hY3JvIEFMVSpfSEFEX0NBUlJZX0JPUlJPVyBpcyBiZWluZwotCXVzZWQgdGhpcyBpcyB0aGUgbW9zdCBlZmZpY2llbnQgcmVzdWx0IGF2YWlsYWJsZS4gIEV4OgotCi0JCSNkZWZpbmUgQUxVNjRfRU5EKFJFUykgXAotCQlTdGF0ZS5jYXJyeSA9IEFMVTY0X0hBRF9DQVJSWV9CT1JST1c7IFwKLQkJKFJFUykgPSBBTFU2NF9DQVJSWV9CT1JST1dfUkVTVUxUCi0gICAKLSAgIAotICAgQWRkaXRpb246Ci0KLQlBTFUqX0FERChWQUwpOiBBZGQgVkFMIHRvIHRoZSBBTFUgYWNjdW11bGF0b3IuICBSZWNvcmQgYW55Ci0Jb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgotCi0JQUxVKl9BRERDKFZBTCk6IEFkZCBWQUwgdG8gdGhlIEFMVSBhY2N1bXVsYXRvci4gIFJlY29yZCBhbnkKLQljYXJyeS1vdXQgb3Igb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgotCi0JQUxVKl9BRERDX0MoVkFMLENJKTogQWRkIFZBTCBhbmQgQ0kgKGNhcnJ5LWluKS4gIFJlY29yZCBhbnkKLQljYXJyeS1vdXQgb3Igb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgotCi0gICBTdWJ0cmFjdGlvbjoKLQotCUFMVSpfU1VCKFZBTCk6IFN1YnRyYWN0IFZBTCBmcm9tIHRoZSBBTFUgYWNjdW11bGF0b3IuICBSZWNvcmQKLQlhbnkgdW5kZXJmbG93IGFzIHdlbGwgYXMgdGhlIGZpbmFsIHJlc3VsdC4KLQotCUFMVSpfU1VCQyhWQUwpOiBTdWJ0cmFjdCBWQUwgZnJvbSB0aGUgQUxVIGFjY3VtdWxhdG9yIHVzaW5nCi0JbmVnYXRlZCBhZGRpdGlvbi4gIFJlY29yZCBhbnkgdW5kZXJmbG93IG9yIGNhcnJ5LW91dCBhcyB3ZWxsCi0JYXMgdGhlIGZpbmFsIHJlc3VsdC4KLQotCUFMVSpfU1VCQihWQUwpOiBTdWJ0cmFjdCBWQUwgZnJvbSB0aGUgQUxVIGFjY3VtdWxhdG9yIHVzaW5nCi0JZGlyZWN0IHN1YnRyYWN0aW9uIChBQ0MrflZBTCsxKS4gIFJlY29yZCBhbnkgdW5kZXJmbG93IG9yCi0JYm9ycm93LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCi0KLQlBTFUqX1NVQkNfWChWQUwsQ0kpOiBTdWJ0cmFjdCBWQUwgYW5kIENJIChjYXJyeS1pbikgZnJvbSB0aGUKLQlBTFUgYWNjdW11bGF0b3IgdXNpbmcgZXh0ZW5kZWQgbmVnYXRlZCBhZGRpdGlvbiAoQUNDK35WQUwrQ0kpLgotCVJlY29yZCBhbnkgdW5kZXJmbG93IG9yIGNhcnJ5LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCi0KLQlBTFUqX1NVQkJfQihWQUwsQkkpOiBTdWJ0cmFjdCBWQUwgYW5kIEJJIChib3Jyb3ctaW4pIGZyb20gdGhlCi0JQUxVIGFjY3VtdWxhdG9yIHVzaW5nIGRpcmVjdCBzdWJ0cmFjdGlvbi4gIFJlY29yZCBhbnkKLQl1bmRlcmZsb3cgb3IgYm9ycm93LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCi0KLQotICovCi0KLQotCi0vKiBUd29zIGNvbXBsZW1lbnQgYXJpdG1ldGljIC0gYWRkaXRpb24vc3VidHJhY3Rpb24gLSBjYXJyeS9ib3Jyb3cKLSAgIChvciB5b3UgdGhvdWdodCB5b3Uga25ldyB0aGUgYW5zd2VyIHRvIDAtMCkKLQotICAgCi0KLSAgIE5vdGF0aW9uIGFuZCBQcm9wZXJ0aWVzOgotCi0KLSAgIFhuIGRlbm90ZXMgdGhlIHZhbHVlIFggc3RvcmVkIGluIE4gYml0cy4KLQotICAgTVNCbiAoWCk6IFRoZSBtb3N0IHNpZ25pZmljYW50IChzaWduKSBiaXQgb2YgWCB0cmVhdGVkIGFzIGFuIE4gYml0Ci0gICB2YWx1ZS4KLQotICAgU0VYVG4gKFgpOiBUaGUgaW5maW5pdGUgc2lnbiBleHRlbnNpb24gb2YgWCB0cmVhdGVkIGFzIGFuIE4gYml0Ci0gICB2YWx1ZS4KLQotICAgTUFYbiwgTUlObjogVGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZCBvZiBhIHNpZ25lZCwgdHdvJ3MKLSAgIGNvbXBsZW1lbnQgTiBiaXQgdmFsdWUuCi0KLSAgIFVNQVhuOiBUaGUgdXBwZXIgYm91bmQgb2YgYW4gdW5zaWduZWQgTiBiaXQgdmFsdWUgKHRoZSBsb3dlcgotICAgYm91bmQgaXMgYWx3YXlzIHplcm8pLgotCi0gICBVbjogVU1BWG4gKyAxLiAgVW5zaWduZWQgYXJyaXRobWV0aWMgaXMgY29tcHV0ZWQgYG1vZHVsbyAoVW4pJy4gIAotCi0gICBYW3BdOiBJcyBiaXQgUCBvZiBYLiAgWFswXSBkZW5vdGVzIHRoZSBsZWFzdCBzaWduaWZhbnQgYml0LgotCi0gICB+WFtwXTogSXMgdGhlIGludmVyc2lvbiBvZiBiaXQgWFtwXS4gQWxzbyBlcXVhbCB0byAxLVhbcF0sCi0gICAoMStYW3BdKW1vZCgyKS4KLQotCi0KLSAgIEFkZGl0aW9uIC0gT3ZlcmZsb3cgLSBJbnRyb2R1Y3Rpb246Ci0KLQotICAgT3ZlcmZsb3cvT3ZlcmZsb3cgaW5kaWNhdGVzIGFuIGVycm9yIGluIGNvbXB1dGF0aW9uIG9mIHNpZ25lZAotICAgYXJyaXRobWV0aWMuICBpLmUuIGdpdmVuIFgsWSBpbiBbTUlObi4uTUFYbl07IG92ZXJmbG93Ci0gICBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0IFgrWSA+IE1BWG4gb3IgWCtZIDwgTUlOX0lOVHguCi0KLSAgIEhhcmR3YXJlIHRyYWRpdGlvbmFsbHkgaW1wbGVtZW50cyBvdmVyZmxvdyBieSBjb21wdXRpbmcgdGhlIFhPUiBvZgotICAgY2FycnktaW4vY2Fycnktb3V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgQUxVLiBIZXJlCi0gICBvdGhlciBtZXRob2RzIG5lZWQgdG8gYmUgZm91bmQuCi0KLQotCi0gICBBZGRpdGlvbiAtIE92ZXJmbG93IC0gbWV0aG9kIDE6Ci0KLQotICAgT3ZlcmZsb3cgb2NjdXJlcyB3aGVuIHRoZSBzaWduIChtb3N0IHNpZ25pZmljYW50IGJpdCkgb2YgdGhlIHR3byBOCi0gICBiaXQgb3BlcmFuZHMgaXMgaWRlbnRpY2FsIGJ1dCBkaWZmZXJlbnQgdG8gdGhlIHNpZ24gb2YgdGhlIHJlc3VsdDoKLQotICAgICAgICAgICAgICAgIFJuID0gKFhuICsgWW4pCi0JCVYgPSBNU0JuICh+KFhuIF4gWW4pICYgKFJuIF4gWG4pKQotCi0KLQotICAgQWRkaXRpb24gLSBPdmVyZmxvdyAtIG1ldGhvZCAyOgotCi0KLSAgIFRoZSB0d28gTiBiaXQgb3BlcmFuZHMgYXJlIHNpZ24gZXh0ZW5kZWQgdG8gTT5OIGJpdHMgYW5kIHRoZW4KLSAgIGFkZGVkLiAgT3ZlcmZsb3cgb2NjdXJlcyB3aGVuIFNJR05fQklUPG4+IGFuZCBTSUdOX0JJVDxtPiBkbyBub3QKLSAgIG1hdGNoLgotICAKLSAgIAkJUm0gPSAoU0VYVG4gKFhuKSArIFNFWFRuIChZbikpCi0JCVYgPSBNU0JuICgoUm0gPj4gKE0gLSBOKSkgXiBSbSkKLQotCi0KLSAgIEFkZGl0aW9uIC0gT3ZlcmZsb3cgLSBtZXRob2QgMzoKLQotCi0gICBUaGUgdHdvIE4gYml0IG9wZXJhbmRzIGFyZSBzaWduIGV4dGVuZGVkIHRvIE0+TiBiaXRzIGFuZCB0aGVuCi0gICBhZGRlZC4gIE92ZXJmbG93IG9jY3VyZXMgd2hlbiB0aGUgcmVzdWx0IGlzIG91dHNpZGUgb2YgdGhlIHNpZ24KLSAgIGV4dGVuZGVkIHJhbmdlIFtNSU5uIC4uIE1BWG5dLgotCi0KLQotICAgQWRkaXRpb24gLSBPdmVyZmxvdyAtIG1ldGhvZCA0OgotCi0KLSAgIEdpdmVuIHRoZSBSZXN1bHQgYW5kIENhcnJ5LW91dCBiaXRzLCB0aGUgb1ZlcmZsb3cgZnJvbSB0aGUgYWRkaXRpb24KLSAgIG9mIFgsIFkgYW5kIGNhcnJ5LUluIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUgZXF1YXRpb246Ci0KLSAgICAgICAgICAgICAgICBSbiA9IChYbiArIFluKQotCQlWID0gKE1TQm4gKChYbiBeIFluKSBeIFJuKSkgXiBDKQotCi0gICBBcyBzaG93biBpbiB0aGUgdGFibGUgYmVsb3c6Ci0KLSAgICAgICAgIEkgIFggIFkgIFIgIEMgfCBWIHwgWF5ZICBeUiAgXkMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0tLS0tLS0tLS0tCi0gICAgICAgICAwICAwICAwICAwICAwIHwgMCB8ICAwICAgIDAgICAwCi0gICAgICAgICAwICAwICAxICAxICAwIHwgMCB8ICAxICAgIDAgICAwCi0gICAgICAgICAwICAxICAwICAxICAwIHwgMCB8ICAxICAgIDAgICAwCi0gICAgICAgICAwICAxICAxICAwICAxIHwgMSB8ICAwICAgIDAgICAxCi0gICAgICAgICAxICAwICAwICAxICAwIHwgMSB8ICAwICAgIDEgICAxCi0gICAgICAgICAxICAwICAxICAwICAxIHwgMCB8ICAxICAgIDEgICAwCi0gICAgICAgICAxICAxICAwICAwICAxIHwgMCB8ICAxICAgIDEgICAwCi0gICAgICAgICAxICAxICAxICAxICAxIHwgMCB8ICAwICAgIDEgICAwCi0KLQotCi0gICBBZGRpdGlvbiAtIENhcnJ5IC0gSW50cm9kdWN0aW9uOgotCi0KLSAgIENhcnJ5IChwb29ybHkgbmFtZWQpIGluZGljYXRlcyB0aGF0IGFuIG92ZXJmbG93IG9jY3VyZWQgZm9yCi0gICB1bnNpZ25lZCBOIGJpdCBhZGRpdGlvbi4gIGkuZS4gZ2l2ZW4gWCwgWSBpbiBbMC4uVU1BWG5dIHRoZW4KLSAgIGNhcnJ5IGluZGljYXRlcyBYK1kgPiBVTUFYbiBvciBYK1kgPj0gVW4uCi0KLSAgIFRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIG91dHB1dCBmb3IgYWxsIGdpdmVuIGlucHV0cyBpbnRvIGEKLSAgIGZ1bGwtYWRkZXIuCi0gIAotICAgICAgICAgSSAgWCAgWSAgUiB8IEMKLSAgICAgICAgLS0tLS0tLS0tLS0tKy0tLQotICAgICAgICAgMCAgMCAgMCAgMCB8IDAKLSAgICAgICAgIDAgIDAgIDEgIDEgfCAwCi0gICAgICAgICAwICAxICAwICAxIHwgMAotICAgICAgICAgMCAgMSAgMSAgMCB8IDEKLSAgICAgICAgIDEgIDAgIDAgIDEgfCAwCi0gICAgICAgICAxICAwICAxICAwIHwgMQotICAgICAgICAgMSAgMSAgMCAgMCB8IDEKLSAgICAgICAgIDEgIDEgIDEgIDEgfCAxCi0KLSAgIChjYXJyeS1JbiwgWCwgWSwgUmVzdWx0LCBDYXJyeS1vdXQpOgotCi0KLQotICAgQWRkaXRpb24gLSBDYXJyeSAtIG1ldGhvZCAxOgotCi0KLSAgIExvb2tpbmcgYXQgdGhlIHRlcm1zIFgsIFkgYW5kIFIgd2Ugd2FudCBhbiBlcXVhdGlvbiBmb3IgQy4KLQotICAgICAgIFhZXFIgIDAgIDEKLSAgICAgICAgICArLS0tLS0tLQotICAgICAgIDAwIHwgIDAgIDAgCi0gICAgICAgMDEgfCAgMSAgMAotICAgICAgIDExIHwgIDEgIDEKLSAgICAgICAxMCB8ICAxICAwCi0KLSAgIFRoaXMgZ2l2aW5nIHVzIHRoZSBzdW0tb2YtcHJvZCBlcXVhdGlvbjoKLQotCQlNU0JuICgoWG4gJiBZbikgfCAoWG4gJiB+Um4pIHwgKFluICYgflJuKSkKLQotICAgVmVyaWZ5aW5nOgotCi0gICAgICAgICBJICBYICBZICBSIHwgQyB8IFgmWSAgWCZ+UiBZJn5SIAotICAgICAgICAtLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgMCAgMCAgMCAgMCB8IDAgfCAgMCAgICAwICAgIDAKLSAgICAgICAgIDAgIDAgIDEgIDEgfCAwIHwgIDAgICAgMCAgICAwCi0gICAgICAgICAwICAxICAwICAxIHwgMCB8ICAwICAgIDAgICAgMAotICAgICAgICAgMCAgMSAgMSAgMCB8IDEgfCAgMSAgICAxICAgIDEKLSAgICAgICAgIDEgIDAgIDAgIDEgfCAwIHwgIDAgICAgMCAgICAwCi0gICAgICAgICAxICAwICAxICAwIHwgMSB8ICAwICAgIDAgICAgMQotICAgICAgICAgMSAgMSAgMCAgMCB8IDEgfCAgMCAgICAxICAgIDAKLSAgICAgICAgIDEgIDEgIDEgIDEgfCAxIHwgIDEgICAgMCAgICAwCi0KLQotCi0gICBBZGRpdGlvbiAtIENhcnJ5IC0gbWV0aG9kIDI6Ci0KLQotICAgR2l2ZW4gdHdvIHNpZ25lZCBOIGJpdCBudW1iZXJzLCBhIGNhcnJ5IGNhbiBiZSBkZXRlY3RlZCBieSB0cmVhdGluZwotICAgdGhlIG51bWJlcnMgYXMgTiBiaXQgdW5zaWduZWQgYW5kIGFkZGluZyB0aGVtIHVzaW5nIE0+TiB1bnNpZ25lZAotICAgYXJyaXRobWV0aWMuICBDYXJyeSBpcyBpbmRpY2F0ZWQgYnkgYml0ICgxIDw8IE4pIGJlaW5nIHNldCAocmVzdWx0Ci0gICA+PSAyKipOKS4KLQotCi0KLSAgIEFkZGl0aW9uIC0gQ2FycnkgLSBtZXRob2QgMzoKLQotCi0gICBHaXZlbiB0aGUgb1ZlcmZsb3cgYml0LiAgVGhlIGNhcnJ5IGNhbiBiZSBjb21wdXRlZCBmcm9tOgotCi0JCSh+UiZWKSB8IChSJlYpCi0KLQotCi0gICBBZGRpdGlvbiAtIENhcnJ5IC0gbWV0aG9kIDQ6Ci0KLSAgIEdpdmVuIHR3byBzaWduZWQgbnVtYmVycy4gIFRyZWF0aW5nIHRoZW0gYXMgdW5zaWduZWQgd2UgaGF2ZToKLQotCQkwIDw9IFggPCBVbiwgMCA8PSBZIDwgVW4KLQk9PT4JWCArIFkgPCAyIFVuCi0KLSAgIENvbnNpZGVyIFkgd2hlbiBjYXJyeSBvY2N1cmVzOgotCi0JCVggKyBZID49IFVuLCBZIDwgVW4KLQk9PT4JKFVuIC0gWCkgPD0gWSA8IFVuICAgICAgICAgICAgICAgIyByZS1hcmFuZ2UKLQk9PT4JVW4gPD0gWCArIFkgPCBVbiArIFggPCAyIFVuICAgICAgIyBhZGQgWG4KLQk9PT4JMCA8PSAoWCArIFkpIG1vZCBVbiA8IFggbW9kIFVuCi0KLSAgIG9yIHdoZW4gY2FycnkgYXMgb2NjdXJlZDoKLQotICAgICAgICAgICAgICAgKFggKyBZKSBtb2QgVW4gPCBYIG1vZCBVbgotCi0gICBDb25zaWRlciBZIHdoZW4gY2FycnkgZG9lcyBub3Qgb2NjdXJlOgotCi0JCVggKyBZIDwgVW4KLQloYXZlCVggPCBVbiwgWSA+PSAwCi0JPT0+CVggPD0gWCArIFkgPCBVbgotCT09PiAgICAgWCBtb2QgVW4gPD0gKFggKyBZKSBtb2QgVW4KLQotICAgb3Igd2hlbiBjYXJyeSBoYXMgbm90IG9jY3VyZWQ6Ci0KLQkgICAgICAgICEgKCAoWCArIFkpIG1vZCBVbiA8IFggbW9kIFVuKQotCi0gICBoZW5jZSB3ZSBnZXQgY2FycnkgYnkgY29tcHV0aW5nIGluIE4gYml0IHVuc2lnbmVkIGFycml0aG1ldGljLgotCi0gICAgICAgICAgICAgICAgY2FycnkgPC0gKFhuICsgWW4pIDwgWG4KLQotCi0KLSAgIFN1YnRyYWN0aW9uIC0gSW50cm9kdWN0aW9uCi0KLQotICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyBvZiBjb21wdXRpbmcgdGhlIHNpZ25lZCB0d28ncwotICAgY29tcGxlbWVudCBkaWZmZXJlbmNlIG9mIHR3byBudW1iZXJzLiAgVGhlIGZpcnN0IGlzIGJhc2VkIG9uCi0gICBuZWdhdGl2ZSBhZGRpdGlvbiwgdGhlIHNlY29uZCBvbiBkaXJlY3Qgc3VidHJhY3Rpb24uCi0KLQotCi0gICBTdWJ0cmFjdGlvbiAtIENhcnJ5IC0gSW50cm9kdWN0aW9uIC0gTmVnYXRlZCBBZGRpdGlvbgotCi0KLSAgIFRoZSBlcXVhdGlvbiBYIC0gWSBjYW4gYmUgY29tcHV0ZWQgdXNpbmc6Ci0KLSAgIAkJWCArICgtWSkKLQk9PT4JWCArIH5ZICsgMQkJIyAtWSA9IH5ZICsgMQotCi0gICBJbiBhZGRpdGlvbiB0byB0aGUgcmVzdWx0LCB0aGUgZXF1YXRpb24gcHJvZHVjZXMgQ2Fycnktb3V0LiAgRm9yCi0gICBzdWNjZWVkaW5nIGV4dGVuZGVkIHBycmNpc2lvbiBjYWxjdWxhdGlvbnMsIHRoZSBtb3JlIGdlbmVyYWwKLSAgIGVxdWF0aW9uIGNhbiBiZSB1c2VkOgotCi0JCUNbcF06UltwXSAgPSAgWFtwXSArIH5ZW3BdICsgQ1twLTFdCi0gCXdoZXJlCUNbMF06UlswXSAgPSAgWFswXSArIH5ZWzBdICsgMQotCi0KLQotICAgU3VidHJhY3Rpb24gLSBCb3Jyb3cgLSBJbnRyb2R1Y3Rpb24gLSBEaXJlY3QgU3VidHJhY3Rpb24KLQotCi0gICBUaGUgYWx0ZXJuYXRpdmUgdG8gbmVnYXRpdmUgYWRkaXRpb24gaXMgZGlyZWN0IHN1YnRyYWN0aW9uIHdoZXJlCi0gICBgWC1ZIGlzIGNvbXB1dGVkIGRpcmVjdGx5LiAgSW4gYWRkaXRpb24gdG8gdGhlIHJlc3VsdCBvZiB0aGUKLSAgIGNhbGN1bGF0aW9uLCBhIEJvcnJvdyBiaXQgaXMgcHJvZHVjZWQuICBJbiBnZW5lcmFsIHRlcm1zOgotCi0JCUJbcF06UltwXSAgPSAgWFtwXSAtIFlbcF0gLSBCW3AtMV0KLQl3aGVyZQlCWzBdOlJbMF0gID0gIFhbMF0gLSBZWzBdCi0KLSAgIFRoZSBCb3Jyb3cgYml0IGlzIHRoZSBjb21wbGVtZW50IG9mIHRoZSBDYXJyeSBiaXQgcHJvZHVjZWQgYnkKLSAgIE5lZ2F0ZWQgQWRkaXRpb24gYWJvdmUuICBBIGRvZGd5IHByb29mIGZvbGxvd3M6Ci0KLSAgIAlDYXNlIDA6Ci0JCUNbMF06UlswXSA9IFhbMF0gKyB+WVswXSArIDEKLQk9PT4JQ1swXTpSWzBdID0gWFswXSArIDEgLSBZWzBdICsgMQkjIH5ZWzBdID0gKDEgLSBZWzBdKT8KLQk9PT4JQ1swXTpSWzBdID0gMiArIFhbMF0gLSBZWzBdCi0JPT0+CUNbMF06UlswXSA9IDIgKyBCWzBdOlJbMF0KLQk9PT4JQ1swXTpSWzBdID0gKDEgKyBCWzBdKTpSWzBdCi0JPT0+CUNbMF0gPSB+QlswXQkJCSMgKDEgKyBCWzBdKSBtb2QgMiA9IH5CWzBdPwotCi0JQ2FzZSBQOgotCQlDW3BdOlJbcF0gPSBYW3BdICsgfllbcF0gKyBDW3AtMV0KLQk9PT4JQ1twXTpSW3BdID0gWFtwXSArIDEgLSBZWzBdICsgMSAtIEJbcC0xXQotCT09PglDW3BdOlJbcF0gPSAyICsgWFtwXSAtIFlbMF0gLSBCW3AtMV0KLQk9PT4JQ1twXTpSW3BdID0gMiArIEJbcF06UltwXQotCT09PglDW3BdOlJbcF0gPSAoMSArIEJbcF0pOlJbcF0KLQk9PT4gICAgIENbcF0gPSB+QltwXQotCi0gICBUaGUgdGFibGUgYmVsb3cgbGlzdHMgYWxsIHBvc3NpYmxlIGlucHV0cy9vdXRwdXRzIGZvciBhCi0gICBmdWxsLXN1YnRyYWN0b3I6Ci0KLSAgIAlYICBZICBJICB8ICBSICBCCi0JMCAgMCAgMCAgfCAgMCAgMAotCTAgIDAgIDEgIHwgIDEgIDEKLQkwICAxICAwICB8ICAxICAxCi0JMCAgMSAgMSAgfCAgMCAgMQotCTEgIDAgIDAgIHwgIDEgIDAKLQkxICAwICAxICB8ICAwICAwCi0JMSAgMSAgMCAgfCAgMCAgMAotCTEgIDEgIDEgIHwgIDEgIDEKLQotCi0KLSAgIFN1YnRyYWN0aW9uIC0gTWV0aG9kIDEKLQotCi0gICBUcmVhdGluZyBYbiBhbmQgWW4gYXMgdW5zaWduZWQgdmFsdWVzIHRoZW4gYSBib3Jyb3cgKHVuc2lnbmVkCi0gICB1bmRlcmZsb3cpIG9jY3VyZXMgd2hlbjoKLQotCQlCID0gWG4gPCBZbgotCT09PglDID0gWG4gPj0gWW4KLQotICovCi0KLQotCi0vKiA4IGJpdCB0YXJnZXQgZXhwcmVzc2lvbnM6Ci0KLSAgIFNpbmNlIHRoZSBob3N0J3MgbmF0dXJhbCBiaXRzaXplID4gOCBiaXRzLCBjYXJyeSBtZXRob2QgMiBhbmQKLSAgIG92ZXJmbG93IG1ldGhvZCAyIGFyZSB1c2VkLiAqLwotCi0jZGVmaW5lIEFMVThfQkVHSU4oVkFMKSBcCi11bnNpZ25lZCBhbHU4X2NyID0gKHVuc2lnbmVkOCkgKFZBTCk7IFwKLXNpZ25lZCBhbHU4X3ZyID0gKHNpZ25lZDgpIChhbHU4X2NyKQotCi0jZGVmaW5lIEFMVThfU0VUKFZBTCkgXAotYWx1OF9jciA9ICh1bnNpZ25lZDgpIChWQUwpOyBcCi1hbHU4X3ZyID0gKHNpZ25lZDgpIChhbHU4X2NyKQotCi0jZGVmaW5lIEFMVThfU0VUX0NBUlJZX0JPUlJPVyhDQVJSWSkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGlmIChDQVJSWSkJCQkJCQkJCVwKLSAgICBhbHU4X2NyIHw9ICgoc2lnbmVkKS0xKSA8PCA4OwkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIGFsdThfY3IgJj0gMHhmZjsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFU4X0hBRF9DQVJSWV9CT1JST1cgKGFsdThfY3IgJiBMU0JJVDMyKDgpKQotI2RlZmluZSBBTFU4X0hBRF9PVkVSRkxPVyAoKChhbHU4X3ZyID4+IDgpIF4gYWx1OF92cikgJiBMU0JJVDMyICg4LTEpKQotCi0jZGVmaW5lIEFMVThfUkVTVUxUICgodW5zaWduZWQ4KSBhbHU4X2NyKQotI2RlZmluZSBBTFU4X0NBUlJZX0JPUlJPV19SRVNVTFQgKCh1bnNpZ25lZDgpIGFsdThfY3IpCi0jZGVmaW5lIEFMVThfT1ZFUkZMT1dfUkVTVUxUICgodW5zaWduZWQ4KSBhbHU4X3ZyKQotCi0vKiAjZGVmaW5lIEFMVThfRU5EID8/Pz8/IC0gdGFyZ2V0IGRlcGVuZGFudCAqLwotCi0KLQotLyogMTYgYml0IHRhcmdldCBleHByZXNzaW9uczoKLQotICAgU2luY2UgdGhlIGhvc3QncyBuYXR1cmFsIGJpdHNpemUgPiAxNiBiaXRzLCBjYXJyeSBtZXRob2QgMiBhbmQKLSAgIG92ZXJmbG93IG1ldGhvZCAyIGFyZSB1c2VkLiAqLwotCi0jZGVmaW5lIEFMVTE2X0JFR0lOKFZBTCkgXAotc2lnbmVkIGFsdTE2X2NyID0gKHVuc2lnbmVkMTYpIChWQUwpOyBcCi11bnNpZ25lZCBhbHUxNl92ciA9IChzaWduZWQxNikgKGFsdTE2X2NyKQotCi0jZGVmaW5lIEFMVTE2X1NFVChWQUwpIFwKLWFsdTE2X2NyID0gKHVuc2lnbmVkMTYpIChWQUwpOyBcCi1hbHUxNl92ciA9IChzaWduZWQxNikgKGFsdTE2X2NyKQotCi0jZGVmaW5lIEFMVTE2X1NFVF9DQVJSWV9CT1JST1coQ0FSUlkpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBpZiAoQ0FSUlkpCQkJCQkJCQlcCi0gICAgYWx1MTZfY3IgfD0gKChzaWduZWQpLTEpIDw8IDE2OwkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIGFsdTE2X2NyICY9IDB4ZmZmZjsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9IQURfQ0FSUllfQk9SUk9XIChhbHUxNl9jciAmIExTQklUMzIoMTYpKQotI2RlZmluZSBBTFUxNl9IQURfT1ZFUkZMT1cgKCgoYWx1MTZfdnIgPj4gMTYpIF4gYWx1MTZfdnIpICYgTFNCSVQzMiAoMTYtMSkpCi0KLSNkZWZpbmUgQUxVMTZfUkVTVUxUICgodW5zaWduZWQxNikgYWx1MTZfY3IpCi0jZGVmaW5lIEFMVTE2X0NBUlJZX0JPUlJPV19SRVNVTFQgKCh1bnNpZ25lZDE2KSBhbHUxNl9jcikKLSNkZWZpbmUgQUxVMTZfT1ZFUkZMT1dfUkVTVUxUICgodW5zaWduZWQxNikgYWx1MTZfdnIpCi0KLS8qICNkZWZpbmUgQUxVMTZfRU5EID8/Pz8/IC0gdGFyZ2V0IGRlcGVuZGFudCAqLwotCi0KLQotLyogMzIgYml0IHRhcmdldCBleHByZXNzaW9uczoKLQotICAgU2luY2UgbW9zdCBob3N0cyBkbyBub3Qgc3VwcG9ydCA2NCAoPiAzMikgYml0IGFycml0aG1ldGljLCBjYXJyeQotICAgbWV0aG9kIDQgYW5kIG92ZXJmbG93IG1ldGhvZCA0IGFyZSB1c2VkLiAqLwotCi0jZGVmaW5lIEFMVTMyX0JFR0lOKFZBTCkgXAotdW5zaWduZWQzMiBhbHUzMl9yID0gKFZBTCk7IFwKLWludCBhbHUzMl9jID0gMDsgXAotaW50IGFsdTMyX3YgPSAwCi0KLSNkZWZpbmUgQUxVMzJfU0VUKFZBTCkgXAotYWx1MzJfciA9IChWQUwpOyBcCi1hbHUzMl9jID0gMDsgXAotYWx1MzJfdiA9IDAKLQotI2RlZmluZSBBTFUzMl9TRVRfQ0FSUllfQk9SUk9XKENBUlJZKSBhbHUzMl9jID0gKENBUlJZKQotCi0jZGVmaW5lIEFMVTMyX0hBRF9DQVJSWV9CT1JST1cgKGFsdTMyX2MpCi0jZGVmaW5lIEFMVTMyX0hBRF9PVkVSRkxPVyAoYWx1MzJfdikKLQotI2RlZmluZSBBTFUzMl9SRVNVTFQgKGFsdTMyX3IpCi0jZGVmaW5lIEFMVTMyX0NBUlJZX0JPUlJPV19SRVNVTFQgKGFsdTMyX3IpCi0jZGVmaW5lIEFMVTMyX09WRVJGTE9XX1JFU1VMVCAoYWx1MzJfcikKLQotCi0KLS8qIDY0IGJpdCB0YXJnZXQgZXhwcmVzc2lvbnM6Ci0KLSAgIEV2ZW4gdGhvdWdoIHRoZSBob3N0IHR5cGljYWxseSBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlIDY0IGJpdAotICAgYXJyaXRobWV0aWMsIGl0IGlzIHN0aWxsIHVzZWQuICovCi0KLSNkZWZpbmUgQUxVNjRfQkVHSU4oVkFMKSBcCi11bnNpZ25lZDY0IGFsdTY0X3IgPSAoVkFMKTsgXAotaW50IGFsdTY0X2MgPSAwOyBcCi1pbnQgYWx1NjRfdiA9IDAKLQotI2RlZmluZSBBTFU2NF9TRVQoVkFMKSBcCi1hbHU2NF9yID0gKFZBTCk7IFwKLWFsdTY0X2MgPSAwOyBcCi1hbHU2NF92ID0gMAotCi0jZGVmaW5lIEFMVTY0X1NFVF9DQVJSWV9CT1JST1coQ0FSUlkpIGFsdTY0X2MgPSAoQ0FSUlkpCi0KLSNkZWZpbmUgQUxVNjRfSEFEX0NBUlJZX0JPUlJPVyAoYWx1NjRfYykKLSNkZWZpbmUgQUxVNjRfSEFEX09WRVJGTE9XIChhbHU2NF92KQotCi0jZGVmaW5lIEFMVTY0X1JFU1VMVCAoYWx1NjRfcikKLSNkZWZpbmUgQUxVNjRfQ0FSUllfQk9SUk9XX1JFU1VMVCAoYWx1NjRfcikKLSNkZWZpbmUgQUxVNjRfT1ZFUkZMT1dfUkVTVUxUIChhbHU2NF9yKQotCi0KLQotLyogR2VuZXJpYyB2ZXJzaW9ucyBvZiBhYm92ZSBtYWNyb3MgKi8KLQotI2RlZmluZSBBTFVfQkVHSU4JICAgIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0JFR0lOKQotI2RlZmluZSBBTFVfU0VUCQkgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU0VUKQotI2RlZmluZSBBTFVfU0VUX0NBUlJZCSAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9TRVRfQ0FSUlkpCi0KLSNkZWZpbmUgQUxVX0hBRF9PVkVSRkxPVyAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9IQURfT1ZFUkZMT1cpCi0jZGVmaW5lIEFMVV9IQURfQ0FSUlkgICAgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfSEFEX0NBUlJZKQotCi0jZGVmaW5lIEFMVV9SRVNVTFQgICAgICAgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfUkVTVUxUKQotI2RlZmluZSBBTFVfT1ZFUkZMT1dfUkVTVUxUIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX09WRVJGTE9XX1JFU1VMVCkKLSNkZWZpbmUgQUxVX0NBUlJZX1JFU1VMVCAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9DQVJSWV9SRVNVTFQpCi0KLQotCi0vKiBCYXNpYyBvcGVyYXRpb24gLSBhZGQgKG92ZXJmbG93aW5nKSAqLwotCi0jZGVmaW5lIEFMVThfQUREKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQ4IGFsdThhZGRfdmFsID0gKFZBTCk7CQkJCQlcCi0gIEFMVThfQUREQyAoYWx1OGFkZF92YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMTZfQUREKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQxNiBhbHUxNmFkZF92YWwgPSAoVkFMKTsJCQkJCVwKLSAgQUxVMTZfQUREQyAoYWx1OGFkZF92YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMzJfQUREKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMmFkZF92YWwgPSAoVkFMKTsJCQkJCVwKLSAgQUxVMzJfQUREQyAoYWx1MzJhZGRfdmFsKTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTY0X0FERChWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRhZGRfdmFsID0gKHVuc2lnbmVkNjQpIChWQUwpOwkJCQlcCi0gIEFMVTY0X0FEREMgKGFsdTY0YWRkX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFVfQUREIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FERCkKLQotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbiAtIGFkZCBjYXJyeWluZyAoYW5kIG92ZXJmbG93aW5nKSAqLwotCi0jZGVmaW5lIEFMVThfQUREQyhWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4YWRkY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgYWx1OF9jciArPSAodW5zaWduZWQ4KShhbHU4YWRkY192YWwpOwkJCQkJXAotICBhbHU4X3ZyICs9IChzaWduZWQ4KShhbHU4YWRkY192YWwpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9BRERDKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQxNiBhbHUxNmFkZGNfdmFsID0gKFZBTCk7CQkJCQlcCi0gIGFsdTE2X2NyICs9ICh1bnNpZ25lZDE2KShhbHUxNmFkZGNfdmFsKTsJCQkJXAotICBhbHUxNl92ciArPSAoc2lnbmVkMTYpKGFsdTE2YWRkY192YWwpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTMyX0FEREMoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDMyIGFsdTMyYWRkY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMmFkZGNfc2lnbiA9IGFsdTMyYWRkY192YWwgXiBhbHUzMl9yOwkJCVwKLSAgYWx1MzJfciArPSAoYWx1MzJhZGRjX3ZhbCk7CQkJCQkJXAotICBhbHUzMl9jID0gKGFsdTMyX3IgPCBhbHUzMmFkZGNfdmFsKTsJCQkJCVwKLSAgYWx1MzJfdiA9ICgoYWx1MzJhZGRjX3NpZ24gXiAtICh1bnNpZ25lZDMyKWFsdTMyX2MpIF4gYWx1MzJfcikgPj4gMzE7CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVNjRfQUREQyhWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRhZGRjX3ZhbCA9ICh1bnNpZ25lZDY0KSAoVkFMKTsJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRhZGRjX3NpZ24gPSBhbHU2NGFkZGNfdmFsIF4gYWx1NjRfcjsJCQlcCi0gIGFsdTY0X3IgKz0gKGFsdTY0YWRkY192YWwpOwkJCQkJCVwKLSAgYWx1NjRfYyA9IChhbHU2NF9yIDwgYWx1NjRhZGRjX3ZhbCk7CQkJCQlcCi0gIGFsdTY0X3YgPSAoKGFsdTY0YWRkY19zaWduIF4gLSAodW5zaWduZWQ2NClhbHU2NF9jKSBeIGFsdTY0X3IpID4+IDYzOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9BRERDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FEREMpCi0KLQotCi0vKiBDb21wb3VuZCBvcGVyYXRpb24gLSBhZGQgY2FycnlpbmcgKGFuZCBvdmVyZmxvd2luZykgd2l0aCBjYXJyeS1pbiAqLwotCi0jZGVmaW5lIEFMVThfQUREQ19DKFZBTCxDKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4YWRkY2NfdmFsID0gKFZBTCk7CQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4YWRkY2NfYyA9IChDKTsJCQkJCQlcCi0gIGFsdThfY3IgKz0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OGFkZGNjX3ZhbCArIGFsdThhZGRjY19jOwkJXAotICBhbHU4X3ZyICs9IChzaWduZWQpKHNpZ25lZDgpKGFsdThhZGRjY192YWwpICsgYWx1OGFkZGNjX2M7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTE2X0FERENfQyhWQUwsQykJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDE2IGFsdTE2YWRkY2NfdmFsID0gKFZBTCk7CQkJCQlcCi0gIHVuc2lnbmVkMTYgYWx1MTZhZGRjY19jID0gKEMpOwkJCQkJXAotICBhbHUxNl9jciArPSAodW5zaWduZWQpKHVuc2lnbmVkMTYpYWx1MTZhZGRjY192YWwgKyBhbHUxNmFkZGNjX2M7CVwKLSAgYWx1MTZfdnIgKz0gKHNpZ25lZCkoc2lnbmVkMTYpKGFsdTE2YWRkY2NfdmFsKSArIGFsdTE2YWRkY2NfYzsJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9BRERDX0MoVkFMLEMpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMmFkZGNjX3ZhbCA9IChWQUwpOwkJCQkJXAotICB1bnNpZ25lZDMyIGFsdTMyYWRkY2NfYyA9IChDKTsJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMmFkZGNjX3NpZ24gPSAoYWx1MzJhZGRjY192YWwgXiBhbHUzMl9yKTsJCVwKLSAgYWx1MzJfciArPSAoYWx1MzJhZGRjY192YWwgKyBhbHUzMmFkZGNjX2MpOwkJCQlcCi0gIGFsdTMyX2MgPSAoKGFsdTMyX3IgPCBhbHUzMmFkZGNjX3ZhbCkJCQkJCVwKLSAgICAgICAgICAgICB8fCAoYWx1MzJhZGRjY19jICYmIGFsdTMyX3IgPT0gYWx1MzJhZGRjY192YWwpKTsJCVwKLSAgYWx1MzJfdiA9ICgoYWx1MzJhZGRjY19zaWduIF4gLSAodW5zaWduZWQzMilhbHUzMl9jKSBeIGFsdTMyX3IpID4+IDMxO1wKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVNjRfQUREQ19DKFZBTCxDKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRhZGRjY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQ2NCBhbHU2NGFkZGNjX2MgPSAoQyk7CQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRhZGRjY19zaWduID0gKGFsdTY0YWRkY2NfdmFsIF4gYWx1NjRfcik7CQlcCi0gIGFsdTY0X3IgKz0gKGFsdTY0YWRkY2NfdmFsICsgYWx1NjRhZGRjY19jKTsJCQkJXAotICBhbHU2NF9jID0gKChhbHU2NF9yIDwgYWx1NjRhZGRjY192YWwpCQkJCQlcCi0gICAgICAgICAgICAgfHwgKGFsdTY0YWRkY2NfYyAmJiBhbHU2NF9yID09IGFsdTY0YWRkY2NfdmFsKSk7CQlcCi0gIGFsdTY0X3YgPSAoKGFsdTY0YWRkY2Nfc2lnbiBeIC0gKHVuc2lnbmVkNjQpYWx1NjRfYykgXiBhbHU2NF9yKSA+PiA2MztcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9BRERDX0MgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfQUREQ19DKQotCi0KLQotLyogQmFzaWMgb3BlcmF0aW9uIC0gc3VidHJhY3QgKG92ZXJmbG93aW5nKSAqLwotCi0jZGVmaW5lIEFMVThfU1VCKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQ4IGFsdThzdWJfdmFsID0gKFZBTCk7CQkJCQlcCi0gIEFMVThfQUREQ19DICh+YWx1OHN1Yl92YWwsIDEpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9TVUIoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDE2IGFsdTE2c3ViX3ZhbCA9IChWQUwpOwkJCQkJXAotICBBTFUxNl9BRERDX0MgKH5hbHUxNnN1Yl92YWwsIDEpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9TVUIoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDMyIGFsdTMyc3ViX3ZhbCA9IChWQUwpOwkJCQkJXAotICBBTFUzMl9BRERDX0MgKH5hbHUzMnN1Yl92YWwsIDEpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFU2NF9TVUIoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0c3ViX3ZhbCA9IChWQUwpOwkJCQkJXAotICBBTFU2NF9BRERDX0MgKH5hbHU2NHN1Yl92YWwsIDEpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFVfU1VCIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQikKLQotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGNhcnJ5aW5nIChhbmQgb3ZlcmZsb3dpbmcpICovCi0KLSNkZWZpbmUgQUxVOF9TVUJDKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQ4IGFsdThzdWJjX3ZhbCA9IChWQUwpOwkJCQkJXAotICBBTFU4X0FERENfQyAofmFsdThzdWJjX3ZhbCwgMSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTE2X1NVQkMoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDE2IGFsdTE2c3ViY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgQUxVMTZfQUREQ19DICh+YWx1MTZzdWJjX3ZhbCwgMSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTMyX1NVQkMoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDMyIGFsdTMyc3ViY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgQUxVMzJfQUREQ19DICh+YWx1MzJzdWJjX3ZhbCwgMSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTY0X1NVQkMoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0c3ViY192YWwgPSAoVkFMKTsJCQkJCVwKLSAgQUxVNjRfQUREQ19DICh+YWx1NjRzdWJjX3ZhbCwgMSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9TVUJDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQkMpCi0KLQotCi0vKiBDb21wb3VuZCBvcGVyYXRpb24gLSBzdWJ0cmFjdCBjYXJyeWluZyAoYW5kIG92ZXJmbG93aW5nKSwgZXh0ZW5kZWQgKi8KLQotI2RlZmluZSBBTFU4X1NVQkNfWChWQUwsQykJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDggYWx1OHN1YmN4X3ZhbCA9IChWQUwpOwkJCQkJXAotICB1bnNpZ25lZDggYWx1OHN1YmN4X2MgPSAoQyk7CQkJCQkJXAotICBBTFU4X0FERENfQyAofmFsdThzdWJjeF92YWwsIGFsdThzdWJjeF9jKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9TVUJDX1goVkFMLEMpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQxNiBhbHUxNnN1YmN4X3ZhbCA9IChWQUwpOwkJCQkJXAotICB1bnNpZ25lZDE2IGFsdTE2c3ViY3hfYyA9IChDKTsJCQkJCVwKLSAgQUxVMTZfQUREQ19DICh+YWx1MTZzdWJjeF92YWwsIGFsdTE2c3ViY3hfYyk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMzJfU1VCQ19YKFZBTCxDKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMzIgYWx1MzJzdWJjeF92YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMnN1YmN4X2MgPSAoQyk7CQkJCQlcCi0gIEFMVTMyX0FERENfQyAofmFsdTMyc3ViY3hfdmFsLCBhbHUzMnN1YmN4X2MpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTY0X1NVQkNfWChWQUwsQykJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0c3ViY3hfdmFsID0gKFZBTCk7CQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRzdWJjeF9jID0gKEMpOwkJCQkJXAotICBBTFU2NF9BRERDX0MgKH5hbHU2NHN1YmN4X3ZhbCwgYWx1NjRzdWJjeF9jKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFVfU1VCQ19YIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQkNfWCkKLQotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGJvcnJvd2luZyAoYW5kIG92ZXJmbG93aW5nKSAqLwotCi0jZGVmaW5lIEFMVThfU1VCQihWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4c3ViYl92YWwgPSAoVkFMKTsJCQkJCVwKLSAgYWx1OF9jciAtPSAodW5zaWduZWQpKHVuc2lnbmVkOClhbHU4c3ViYl92YWw7CQkJCVwKLSAgYWx1OF92ciAtPSAoc2lnbmVkKShzaWduZWQ4KWFsdThzdWJiX3ZhbDsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9TVUJCKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQxNiBhbHUxNnN1YmJfdmFsID0gKFZBTCk7CQkJCQlcCi0gIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJfdmFsOwkJCVwKLSAgYWx1MTZfdnIgLT0gKHNpZ25lZCkoc2lnbmVkMTYpYWx1MTZzdWJiX3ZhbDsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9TVUJCKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMnN1YmJfdmFsID0gKFZBTCk7CQkJCQlcCi0gIHVuc2lnbmVkMzIgYWx1MzJzdWJiX3NpZ24gPSBhbHUzMnN1YmJfdmFsIF4gYWx1MzJfcjsJCQlcCi0gIGFsdTMyX2MgPSAoYWx1MzJfciA8IGFsdTMyc3ViYl92YWwpOwkJCQkJXAotICBhbHUzMl9yIC09IChhbHUzMnN1YmJfdmFsKTsJCQkJCQlcCi0gIGFsdTMyX3YgPSAoKGFsdTMyc3ViYl9zaWduIF4gLSAodW5zaWduZWQzMilhbHUzMl9jKSBeIGFsdTMyX3IpID4+IDMxOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTY0X1NVQkIoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0c3ViYl92YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQ2NCBhbHU2NHN1YmJfc2lnbiA9IGFsdTY0c3ViYl92YWwgXiBhbHU2NF9yOwkJCVwKLSAgYWx1NjRfYyA9IChhbHU2NF9yIDwgYWx1NjRzdWJiX3ZhbCk7CQkJCQlcCi0gIGFsdTY0X3IgLT0gKGFsdTY0c3ViYl92YWwpOwkJCQkJCVwKLSAgYWx1NjRfdiA9ICgoYWx1NjRzdWJiX3NpZ24gXiAtICh1bnNpZ25lZDY0KWFsdTY0X2MpIF4gYWx1NjRfcikgPj4gMzE7CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVX1NVQkIgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU1VCQikKLQotCi0KLS8qIENvbXBvdW5kIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGJvcnJvd2luZyAoYW5kIG92ZXJmbG93aW5nKSB3aXRoIGJvcnJvdy1pbiAqLwotCi0jZGVmaW5lIEFMVThfU1VCQl9CKFZBTCxCKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4c3ViYmJfdmFsID0gKFZBTCk7CQkJCQlcCi0gIHVuc2lnbmVkOCBhbHU4c3ViYmJfYiA9IChCKTsJCQkJCQlcCi0gIGFsdThfY3IgLT0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OHN1YmJiX3ZhbDsJCQlcCi0gIGFsdThfY3IgLT0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OHN1YmJiX2I7CQkJCVwKLSAgYWx1OF92ciAtPSAoc2lnbmVkKShzaWduZWQ4KWFsdThzdWJiYl92YWwgKyBhbHU4c3ViYmJfYjsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMTZfU1VCQl9CKFZBTCxCKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMTYgYWx1MTZzdWJiYl92YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQxNiBhbHUxNnN1YmJiX2IgPSAoQik7CQkJCQlcCi0gIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJiX3ZhbDsJCQlcCi0gIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJiX2I7CQkJXAotICBhbHUxNl92ciAtPSAoc2lnbmVkKShzaWduZWQxNilhbHUxNnN1YmJiX3ZhbCArIGFsdTE2c3ViYmJfYjsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMzJfU1VCQl9CKFZBTCxCKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMzIgYWx1MzJzdWJiYl92YWwgPSAoVkFMKTsJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMnN1YmJiX2IgPSAoQik7CQkJCQlcCi0gIEFMVTMyX0FERENfQyAofmFsdTMyc3ViYmJfdmFsLCAhYWx1MzJzdWJiYl9iKTsJCQlcCi0gIGFsdTMyX2MgPSAhYWx1MzJfYzsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFU2NF9TVUJCX0IoVkFMLEIpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQ2NCBhbHU2NHN1YmJiX3ZhbCA9IChWQUwpOwkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0c3ViYmJfYiA9IChCKTsJCQkJCVwKLSAgQUxVNjRfQUREQ19DICh+YWx1NjRzdWJiYl92YWwsICFhbHU2NHN1YmJiX2IpOwkJCVwKLSAgYWx1NjRfYyA9ICFhbHU2NF9jOwkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9TVUJCX0IgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU1VCQl9CKQotCi0KLQotLyogQmFzaWMgb3BlcmF0aW9uIC0gbmVnYXRlIChvdmVyZmxvd2luZykgKi8KLQotI2RlZmluZSBBTFU4X05FRygpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHNpZ25lZCBhbHU4bmVnX3ZhbCA9IChBTFU4X1JFU1VMVCk7CQkJCQlcCi0gIEFMVThfU0VUICgxKTsJCQkJCQkJCVwKLSAgQUxVOF9BRERDICh+YWx1OG5lZ192YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMTZfTkVHKCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgc2lnbmVkIGFsdTE2bmVnX3ZhbCA9IChBTFUxNl9SRVNVTFQpOwkJCQlcCi0gIEFMVTE2X1NFVCAoMSk7CQkJCQkJCVwKLSAgQUxVMTZfQUREQyAofmFsdTE2bmVnX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9ORUcoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDMyIGFsdTMybmVnX3ZhbCA9IChBTFUzMl9SRVNVTFQpOwkJCQlcCi0gIEFMVTMyX1NFVCAoMSk7CQkJCQkJCVwKLSAgQUxVMzJfQUREQyAofmFsdTMybmVnX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEFMVTY0X05FRygpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkNjQgYWx1NjRuZWdfdmFsID0gKEFMVTY0X1JFU1VMVCk7CQkJCVwKLSAgQUxVNjRfU0VUICgxKTsJCQkJCQkJXAotICBBTFU2NF9BRERDICh+YWx1NjRuZWdfdmFsKTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9ORUcgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTkVHKQotCi0KLQotCi0vKiBCYXNpYyBvcGVyYXRpb24gLSBuZWdhdGUgY2FycnlpbmcgKGFuZCBvdmVyZmxvd2luZykgKi8KLQotI2RlZmluZSBBTFU4X05FR0MoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBzaWduZWQgYWx1OG5lZ2NfdmFsID0gKEFMVThfUkVTVUxUKTsJCQkJCVwKLSAgQUxVOF9TRVQgKDEpOwkJCQkJCQkJXAotICBBTFU4X0FEREMgKH5hbHU4bmVnY192YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMTZfTkVHQygpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHNpZ25lZCBhbHUxNm5lZ2NfdmFsID0gKEFMVTE2X1JFU1VMVCk7CQkJCVwKLSAgQUxVMTZfU0VUICgxKTsJCQkJCQkJXAotICBBTFUxNl9BRERDICh+YWx1MTZuZWdjX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9ORUdDKCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQzMiBhbHUzMm5lZ2NfdmFsID0gKEFMVTMyX1JFU1VMVCk7CQkJCVwKLSAgQUxVMzJfU0VUICgxKTsJCQkJCQkJXAotICBBTFUzMl9BRERDICh+YWx1MzJuZWdjX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEFMVTY0X05FR0MoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0bmVnY192YWwgPSAoQUxVNjRfUkVTVUxUKTsJCQkJXAotICBBTFU2NF9TRVQgKDEpOwkJCQkJCQlcCi0gIEFMVTY0X0FEREMgKH5hbHU2NG5lZ2NfdmFsKTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9ORUdDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX05FR0MpCi0KLQotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbiAtIG5lZ2F0ZSBib3Jyb3dpbmcgKGFuZCBvdmVyZmxvd2luZykgKi8KLQotI2RlZmluZSBBTFU4X05FR0IoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBzaWduZWQgYWx1OG5lZ2JfdmFsID0gKEFMVThfUkVTVUxUKTsJCQkJCVwKLSAgQUxVOF9TRVQgKDApOwkJCQkJCQkJXAotICBBTFU4X1NVQkIgKGFsdThuZWdiX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUxNl9ORUdCKCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgc2lnbmVkIGFsdTE2bmVnYl92YWwgPSAoQUxVMTZfUkVTVUxUKTsJCQkJXAotICBBTFUxNl9TRVQgKDApOwkJCQkJCQlcCi0gIEFMVTE2X1NVQkIgKGFsdTE2bmVnYl92YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMzJfTkVHQigpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMzIgYWx1MzJuZWdiX3ZhbCA9IChBTFUzMl9SRVNVTFQpOwkJCQlcCi0gIEFMVTMyX1NFVCAoMCk7CQkJCQkJCVwKLSAgQUxVMzJfU1VCQiAoYWx1MzJuZWdiX3ZhbCk7CQkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEFMVTY0X05FR0IoKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDY0IGFsdTY0bmVnYl92YWwgPSAoQUxVNjRfUkVTVUxUKTsJCQkJXAotICBBTFU2NF9TRVQgKDApOwkJCQkJCQlcCi0gIEFMVTY0X1NVQkIgKGFsdTY0bmVnYl92YWwpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVX05FR0IgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTkVHQikKLQotCi0KLQotLyogT3RoZXIgKi8KLQotI2RlZmluZSBBTFU4X09SKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgZXJyb3IoIkFMVTE2X09SIik7CQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMTZfT1IoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBlcnJvcigiQUxVMTZfT1IiKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9PUihWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGFsdTMyX3IgfD0gKFZBTCk7CQkJCQkJCVwKLSAgYWx1MzJfYyA9IDA7CQkJCQkJCQlcCi0gIGFsdTMyX3YgPSAwOwkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFU2NF9PUihWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGFsdTY0X3IgfD0gKFZBTCk7CQkJCQkJCVwKLSAgYWx1NjRfYyA9IDA7CQkJCQkJCQlcCi0gIGFsdTY0X3YgPSAwOwkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFVfT1IoVkFMKSBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9PUikoVkFMKQotCi0KLQotI2RlZmluZSBBTFUxNl9YT1IoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBlcnJvcigiQUxVMTZfWE9SIik7CQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVMzJfWE9SKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgYWx1MzJfciBePSAoVkFMKTsJCQkJCQkJXAotICBhbHUzMl9jID0gMDsJCQkJCQkJCVwKLSAgYWx1MzJfdiA9IDA7CQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTY0X1hPUihWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGFsdTY0X3IgXj0gKFZBTCk7CQkJCQkJCVwKLSAgYWx1NjRfYyA9IDA7CQkJCQkJCQlcCi0gIGFsdTY0X3YgPSAwOwkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFVfWE9SKFZBTCkgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfWE9SKShWQUwpCi0KLQotCi0KLSNkZWZpbmUgQUxVMTZfQU5EKFZBTCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgZXJyb3IoIkFMVV9BTkQxNiIpOwkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVTMyX0FORChWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGFsdTMyX3IgJj0gKFZBTCk7CQkJCQkJCVwKLSAgYWx1MzJfciA9IDA7CQkJCQkJCQlcCi0gIGFsdTMyX3YgPSAwOwkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFU2NF9BTkQoVkFMKQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBhbHU2NF9yICY9IChWQUwpOwkJCQkJCQlcCi0gIGFsdTY0X3IgPSAwOwkJCQkJCQkJXAotICBhbHU2NF92ID0gMDsJCQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVX0FORChWQUwpIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FORCkoVkFMKQotCi0KLQotCi0jZGVmaW5lIEFMVTE2X05PVChWQUwpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGVycm9yKCJBTFVfTk9UMTYiKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBTFUzMl9OT1QJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgYWx1MzJfciA9IH5hbHUzMl9yOwkJCQkJCQlcCi0gIGFsdTMyX2MgPSAwOwkJCQkJCQkJXAotICBhbHUzMl92ID0gMDsJCQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUxVNjRfTk9UCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGFsdTY0X3IgPSB+YWx1NjRfcjsJCQkJCQkJXAotICBhbHU2NF9jID0gMDsJCQkJCQkJCVwKLSAgYWx1NjRfdiA9IDA7CQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFMVV9OT1QgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTk9UKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWFyYW5nZS5jIGIvc2ltL2NvbW1vbi9zaW0tYXJhbmdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDgxMTMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tYXJhbmdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyogQWRkcmVzcyByYW5nZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRlbGwgc2ltLWFyYW5nZS5oIGl0J3MgdXMuICAqLwotI2RlZmluZSBTSU1fQVJBTkdFX0MKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIERFRklORV9JTkxJTkVfUCAoISBkZWZpbmVkIChTSU1fQVJBTkdFX0NfSU5DTFVERUQpKQotI2RlZmluZSBERUZJTkVfTk9OX0lOTElORV9QIGRlZmluZWQgKFNJTV9BUkFOR0VfQ19JTkNMVURFRCkKLQotI2lmIERFRklORV9OT05fSU5MSU5FX1AKLQotLyogSW5zZXJ0IGEgcmFuZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JhbmdlIChBRERSX1NVQlJBTkdFICoqcG9zLCBBRERSX1NVQlJBTkdFICphc3IpCi17Ci0gIGFzci0+bmV4dCA9ICpwb3M7Ci0gICpwb3MgPSBhc3I7Ci19Ci0KLS8qIERlbGV0ZSBhIHJhbmdlLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9yYW5nZSAoQUREUl9TVUJSQU5HRSAqKnRoaXNhc3JwKQotewotICBBRERSX1NVQlJBTkdFICp0aGlzYXNyOwotCi0gIHRoaXNhc3IgPSAqdGhpc2FzcnA7Ci0gICp0aGlzYXNycCA9IHRoaXNhc3ItPm5leHQ7Ci0KLSAgZnJlZSAodGhpc2Fzcik7Ci19Ci0KLS8qIEFkZCBvciBkZWxldGUgYW4gYWRkcmVzcyByYW5nZS4KLSAgIFRoaXMgY29kZSB3YXMgYm9ycm93ZWQgZnJvbSBsaW51eCdzIGxvY2tzLmM6cG9zaXhfbG9ja19maWxlKCkuCi0gICA/Pz8gVG9kbzogR2l2ZW4gb3VyIHNpbXBsZXIgbmVlZHMgdGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkCi0gICAoc3BsaXQgaW50byB0d28gZm5zKS4gICovCi0KLXN0YXRpYyB2b2lkCi1mcm9iX3JhbmdlIChBRERSX1JBTkdFICphciwgYWRkcmVzc193b3JkIHN0YXJ0LCBhZGRyZXNzX3dvcmQgZW5kLCBpbnQgZGVsZXRlX3ApCi17Ci0gIEFERFJfU1VCUkFOR0UgKmFzcjsKLSAgQUREUl9TVUJSQU5HRSAqbmV3X2FzciwgKm5ld19hc3IyOwotICBBRERSX1NVQlJBTkdFICpsZWZ0ID0gTlVMTDsKLSAgQUREUl9TVUJSQU5HRSAqcmlnaHQgPSBOVUxMOwotICBBRERSX1NVQlJBTkdFICoqYmVmb3JlOwotICBBRERSX1NVQlJBTkdFIGluaXRfY2FsbGVyOwotICBBRERSX1NVQlJBTkdFICpjYWxsZXIgPSAmaW5pdF9jYWxsZXI7Ci0gIGludCBhZGRlZF9wID0gMDsKLQotICBtZW1zZXQgKGNhbGxlciwgMCwgc2l6ZW9mIChBRERSX1NVQlJBTkdFKSk7Ci0gIG5ld19hc3IgPSBaQUxMT0MgKEFERFJfU1VCUkFOR0UpOwotICBuZXdfYXNyMiA9IFpBTExPQyAoQUREUl9TVUJSQU5HRSk7Ci0KLSAgY2FsbGVyLT5zdGFydCA9IHN0YXJ0OwotICBjYWxsZXItPmVuZCA9IGVuZDsKLSAgYmVmb3JlID0gJmFyLT5yYW5nZXM7Ci0KLSAgd2hpbGUgKChhc3IgPSAqYmVmb3JlKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGRlbGV0ZV9wKQotCXsKLQkgIC8qIFRyeSBuZXh0IHJhbmdlIGlmIGN1cnJlbnQgcmFuZ2UgcHJlY2VlZHMgbmV3IG9uZSBhbmQgbm90Ci0JICAgICBhZGphY2VudCBvciBvdmVybGFwcGluZy4gICovCi0JICBpZiAoYXNyLT5lbmQgPCBjYWxsZXItPnN0YXJ0IC0gMSkKLQkgICAgZ290byBuZXh0X3JhbmdlOwotCi0JICAvKiBCcmVhayBvdXQgaWYgbmV3IHJhbmdlIHByZWNlZWRzIGN1cnJlbnQgb25lIGFuZCBub3QKLQkgICAgIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nLiAgKi8KLQkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5lbmQgKyAxKQotCSAgICBicmVhazsKLQotCSAgLyogSWYgd2UgY29tZSBoZXJlLCB0aGUgbmV3IGFuZCBjdXJyZW50IHJhbmdlcyBhcmUgYWRqYWNlbnQgb3IKLQkgICAgIG92ZXJsYXBwaW5nLiBNYWtlIG9uZSByYW5nZSB5aWVsZGluZyBmcm9tIHRoZSBsb3dlciBzdGFydCBhZGRyZXNzCi0JICAgICBvZiBib3RoIHJhbmdlcyB0byB0aGUgaGlnaGVyIGVuZCBhZGRyZXNzLiAgKi8KLQkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5zdGFydCkKLQkgICAgYXNyLT5zdGFydCA9IGNhbGxlci0+c3RhcnQ7Ci0JICBlbHNlCi0JICAgIGNhbGxlci0+c3RhcnQgPSBhc3ItPnN0YXJ0OwotCSAgaWYgKGFzci0+ZW5kIDwgY2FsbGVyLT5lbmQpCi0JICAgIGFzci0+ZW5kID0gY2FsbGVyLT5lbmQ7Ci0JICBlbHNlCi0JICAgIGNhbGxlci0+ZW5kID0gYXNyLT5lbmQ7Ci0KLQkgIGlmIChhZGRlZF9wKQotCSAgICB7Ci0JICAgICAgZGVsZXRlX3JhbmdlIChiZWZvcmUpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBjYWxsZXIgPSBhc3I7Ci0JICBhZGRlZF9wID0gMTsKLQl9Ci0gICAgICBlbHNlIC8qIGRlbGV0aW5nIGEgcmFuZ2UgKi8KLQl7Ci0JICAvKiBUcnkgbmV4dCByYW5nZSBpZiBjdXJyZW50IHJhbmdlIHByZWNlZWRzIG5ldyBvbmUuICAqLwotCSAgaWYgKGFzci0+ZW5kIDwgY2FsbGVyLT5zdGFydCkKLQkgICAgZ290byBuZXh0X3JhbmdlOwotCi0JICAvKiBCcmVhayBvdXQgaWYgbmV3IHJhbmdlIHByZWNlZWRzIGN1cnJlbnQgb25lLiAgKi8KLQkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5lbmQpCi0JICAgIGJyZWFrOwotCi0JICBhZGRlZF9wID0gMTsKLQotCSAgaWYgKGFzci0+c3RhcnQgPCBjYWxsZXItPnN0YXJ0KQotCSAgICBsZWZ0ID0gYXNyOwotCi0JICAvKiBJZiB0aGUgbmV4dCByYW5nZSBpbiB0aGUgbGlzdCBoYXMgYSBoaWdoZXIgZW5kCi0JICAgICBhZGRyZXNzIHRoYW4gdGhlIG5ldyBvbmUsIGluc2VydCB0aGUgbmV3IG9uZSBoZXJlLiAgKi8KLQkgIGlmIChhc3ItPmVuZCA+IGNhbGxlci0+ZW5kKQotCSAgICB7Ci0JICAgICAgcmlnaHQgPSBhc3I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChhc3ItPnN0YXJ0ID49IGNhbGxlci0+c3RhcnQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgbmV3IHJhbmdlIGNvbXBsZXRlbHkgcmVwbGFjZXMgYW4gb2xkCi0JICAgICAgICAgb25lIChUaGlzIG1heSBoYXBwZW4gc2V2ZXJhbCB0aW1lcykuICAqLwotCSAgICAgIGlmIChhZGRlZF9wKQotCQl7Ci0JCSAgZGVsZXRlX3JhbmdlIChiZWZvcmUpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICAvKiBSZXBsYWNlIHRoZSBvbGQgcmFuZ2Ugd2l0aCB0aGUgbmV3IG9uZS4gICovCi0JICAgICAgYXNyLT5zdGFydCA9IGNhbGxlci0+c3RhcnQ7Ci0JICAgICAgYXNyLT5lbmQgPSBjYWxsZXItPmVuZDsKLQkgICAgICBjYWxsZXIgPSBhc3I7Ci0JICAgICAgYWRkZWRfcCA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdvIG9uIHRvIG5leHQgcmFuZ2UuICAqLwotICAgIG5leHRfcmFuZ2U6Ci0gICAgICBiZWZvcmUgPSAmYXNyLT5uZXh0OwotICAgIH0KLQotICBpZiAoIWFkZGVkX3ApCi0gICAgewotICAgICAgaWYgKGRlbGV0ZV9wKQotCWdvdG8gb3V0OwotICAgICAgbmV3X2Fzci0+c3RhcnQgPSBjYWxsZXItPnN0YXJ0OwotICAgICAgbmV3X2Fzci0+ZW5kID0gY2FsbGVyLT5lbmQ7Ci0gICAgICBpbnNlcnRfcmFuZ2UgKGJlZm9yZSwgbmV3X2Fzcik7Ci0gICAgICBuZXdfYXNyID0gTlVMTDsKLSAgICB9Ci0gIGlmIChyaWdodCkKLSAgICB7Ci0gICAgICBpZiAobGVmdCA9PSByaWdodCkKLQl7Ci0JICAvKiBUaGUgbmV3IHJhbmdlIGJyZWFrcyB0aGUgb2xkIG9uZSBpbiB0d28gcGllY2VzLAotCSAgICAgc28gd2UgaGF2ZSB0byB1c2UgdGhlIHNlY29uZCBuZXcgcmFuZ2UuICAqLwotCSAgbmV3X2FzcjItPnN0YXJ0ID0gcmlnaHQtPnN0YXJ0OwotCSAgbmV3X2FzcjItPmVuZCA9IHJpZ2h0LT5lbmQ7Ci0JICBsZWZ0ID0gbmV3X2FzcjI7Ci0JICBpbnNlcnRfcmFuZ2UgKGJlZm9yZSwgbGVmdCk7Ci0JICBuZXdfYXNyMiA9IE5VTEw7Ci0JfQotICAgICAgcmlnaHQtPnN0YXJ0ID0gY2FsbGVyLT5lbmQgKyAxOwotICAgIH0KLSAgaWYgKGxlZnQpCi0gICAgewotICAgICAgbGVmdC0+ZW5kID0gY2FsbGVyLT5zdGFydCAtIDE7Ci0gICAgfQotCi0gb3V0OgotICBpZiAobmV3X2FzcikKLSAgICBmcmVlKG5ld19hc3IpOwotICBpZiAobmV3X2FzcjIpCi0gICAgZnJlZShuZXdfYXNyMik7Ci19Ci0KLS8qIEZyZWUgVCBhbmQgYWxsIHN1YnRyZWVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc2VhcmNoX3RyZWUgKEFERFJfUkFOR0VfVFJFRSAqdCkKLXsKLSAgaWYgKHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX3NlYXJjaF90cmVlICh0LT5sb3dlcik7Ci0gICAgICBmcmVlX3NlYXJjaF90cmVlICh0LT5oaWdoZXIpOwotICAgICAgZnJlZSAodCk7Ci0gICAgfQotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX3NlYXJjaF90cmVlIHRvIHJlY3Vyc2l2ZWx5IGJ1aWxkIGEgYmFsYW5jZWQgdHJlZS4KLSAgID8/PyBJdCdzIG5vdCBhbiBvcHRpbXVtIHRyZWUgdGhvdWdoLiAgKi8KLQotc3RhdGljIEFERFJfUkFOR0VfVFJFRSAqCi1idWlsZF90cmVlXzEgKEFERFJfU1VCUkFOR0UgKiphc3J0YWIsIHVuc2lnbmVkIGludCBuKQotewotICB1bnNpZ25lZCBpbnQgbWlkID0gbiAvIDI7Ci0gIEFERFJfUkFOR0VfVFJFRSAqdDsKLQotICBpZiAobiA9PSAwKQotICAgIHJldHVybiBOVUxMOwotICB0ID0gKEFERFJfUkFOR0VfVFJFRSAqKSB4bWFsbG9jIChzaXplb2YgKEFERFJfUkFOR0VfVFJFRSkpOwotICB0LT5zdGFydCA9IGFzcnRhYlttaWRdLT5zdGFydDsKLSAgdC0+ZW5kID0gYXNydGFiW21pZF0tPmVuZDsKLSAgaWYgKG1pZCAhPSAwKQotICAgIHQtPmxvd2VyID0gYnVpbGRfdHJlZV8xIChhc3J0YWIsIG1pZCk7Ci0gIGVsc2UKLSAgICB0LT5sb3dlciA9IE5VTEw7Ci0gIGlmIChuID4gbWlkICsgMSkKLSAgICB0LT5oaWdoZXIgPSBidWlsZF90cmVlXzEgKGFzcnRhYiArIG1pZCArIDEsIG4gLSBtaWQgLSAxKTsKLSAgZWxzZQotICAgIHQtPmhpZ2hlciA9IE5VTEw7Ci0gIHJldHVybiB0OwotfQotCi0vKiBCdWlsZCBhIHNlYXJjaCB0cmVlIGZvciBhZGRyZXNzIHJhbmdlIEFSLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX3NlYXJjaF90cmVlIChBRERSX1JBTkdFICphcikKLXsKLSAgLyogPz8/IFNpbXBsZSB2ZXJzaW9uIGZvciBub3cuICAqLwotICBBRERSX1NVQlJBTkdFICphc3IsKiphc3J0YWI7Ci0gIHVuc2lnbmVkIGludCBpLCBuOwotCi0gIGZvciAobiA9IDAsIGFzciA9IGFyLT5yYW5nZXM7IGFzciAhPSBOVUxMOyArK24sIGFzciA9IGFzci0+bmV4dCkKLSAgICBjb250aW51ZTsKLSAgYXNydGFiID0gKEFERFJfU1VCUkFOR0UgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKEFERFJfU1VCUkFOR0UgKikpOwotICBmb3IgKGkgPSAwLCBhc3IgPSBhci0+cmFuZ2VzOyBpIDwgbjsgKytpLCBhc3IgPSBhc3ItPm5leHQpCi0gICAgYXNydGFiW2ldID0gYXNyOwotICBhci0+cmFuZ2VfdHJlZSA9IGJ1aWxkX3RyZWVfMSAoYXNydGFiLCBuKTsKLSAgZnJlZSAoYXNydGFiKTsKLX0KLQotdm9pZAotc2ltX2FkZHJfcmFuZ2VfYWRkIChBRERSX1JBTkdFICphciwgYWRkcmVzc193b3JkIHN0YXJ0LCBhZGRyZXNzX3dvcmQgZW5kKQotewotICBmcm9iX3JhbmdlIChhciwgc3RhcnQsIGVuZCwgMCk7Ci0KLSAgLyogUmVidWlsZCB0aGUgc2VhcmNoIHRyZWUuICAqLwotICAvKiA/Pz8gSW5zdGVhZCBvZiByZWJ1aWxkaW5nIGl0IGhlcmUgaXQgY291bGQgYmUgZG9uZSBpbiBhIG1vZHVsZSByZXN1bWUKLSAgICAgaGFuZGxlciwgc2F5IGJ5IGZpcnN0IGNoZWNraW5nIGZvciBhIGBjaGFuZ2VkJyBmbGFnLCBhc3N1bWluZyBvZiBjb3Vyc2UKLSAgICAgdGhpcyB3b3VsZCBuZXZlciBiZSBkb25lIHdoaWxlIHRoZSBzaW11bGF0aW9uIGlzIHJ1bm5pbmcuICAqLwotICBmcmVlX3NlYXJjaF90cmVlIChhci0+cmFuZ2VfdHJlZSk7Ci0gIGJ1aWxkX3NlYXJjaF90cmVlIChhcik7Ci19Ci0KLXZvaWQKLXNpbV9hZGRyX3JhbmdlX2RlbGV0ZSAoQUREUl9SQU5HRSAqYXIsIGFkZHJlc3Nfd29yZCBzdGFydCwgYWRkcmVzc193b3JkIGVuZCkKLXsKLSAgZnJvYl9yYW5nZSAoYXIsIHN0YXJ0LCBlbmQsIDEpOwotCi0gIC8qIFJlYnVpbGQgdGhlIHNlYXJjaCB0cmVlLiAgKi8KLSAgLyogPz8/IEluc3RlYWQgb2YgcmVidWlsZGluZyBpdCBoZXJlIGl0IGNvdWxkIGJlIGRvbmUgaW4gYSBtb2R1bGUgcmVzdW1lCi0gICAgIGhhbmRsZXIsIHNheSBieSBmaXJzdCBjaGVja2luZyBmb3IgYSBgY2hhbmdlZCcgZmxhZywgYXNzdW1pbmcgb2YgY291cnNlCi0gICAgIHRoaXMgd291bGQgbmV2ZXIgYmUgZG9uZSB3aGlsZSB0aGUgc2ltdWxhdGlvbiBpcyBydW5uaW5nLiAgKi8KLSAgZnJlZV9zZWFyY2hfdHJlZSAoYXItPnJhbmdlX3RyZWUpOwotICBidWlsZF9zZWFyY2hfdHJlZSAoYXIpOwotfQotCi0jZW5kaWYgLyogREVGSU5FX05PTl9JTkxJTkVfUCAqLwotCi0jaWYgREVGSU5FX0lOTElORV9QCi0KLVNJTV9BUkFOR0VfSU5MSU5FIGludAotc2ltX2FkZHJfcmFuZ2VfaGl0X3AgKEFERFJfUkFOR0UgKmFyLCBhZGRyZXNzX3dvcmQgYWRkcikKLXsKLSAgQUREUl9SQU5HRV9UUkVFICp0ID0gYXItPnJhbmdlX3RyZWU7Ci0KLSAgd2hpbGUgKHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYWRkciA8IHQtPnN0YXJ0KQotCXQgPSB0LT5sb3dlcjsKLSAgICAgIGVsc2UgaWYgKGFkZHIgPiB0LT5lbmQpCi0JdCA9IHQtPmhpZ2hlcjsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogREVGSU5FX0lOTElORV9QICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1hcmFuZ2UuaCBiL3NpbS9jb21tb24vc2ltLWFyYW5nZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJhMGY0Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWFyYW5nZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogQWRkcmVzcyByYW5nZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCBieSBzaW0tYmFzaWNzLmguICAqLwotCi0jaWZuZGVmIFNJTV9BUkFOR0VfSAotI2RlZmluZSBTSU1fQVJBTkdFX0gKLQotLyogQSBsaXN0IG9mIGFkZHJlc3MgcmFuZ2VzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2FkZHJfc3VicmFuZ2UgewotICBzdHJ1Y3QgX2FkZHJfc3VicmFuZ2UgKm5leHQ7Ci0KLSAgLyogUmFuZ2Ugb2YgYWRkcmVzc2VzIHRvIGJlIHRyYWNlZCBpcyBbc3RhcnQsZW5kXS4gICovCi0gIGFkZHJlc3Nfd29yZCBzdGFydCxlbmQ7Ci19IEFERFJfU1VCUkFOR0U7Ci0KLS8qIEZvciBzcGVlZCwgc2VhcmNoaW5nIGlzIGRvbmUgb24gYSB0cmVlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2FkZHJfcmFuZ2VfdHJlZSB7Ci0gIHN0cnVjdCBfYWRkcl9yYW5nZV90cmVlICpsb3dlcjsKLSAgc3RydWN0IF9hZGRyX3JhbmdlX3RyZWUgKmhpZ2hlcjsKLQotICAvKiBSYW5nZSBvZiBhZGRyZXNzZXMgdG8gYmUgdHJhY2VkIGlzIFtzdGFydCxlbmRdLiAgKi8KLSAgYWRkcmVzc193b3JkIHN0YXJ0LGVuZDsKLX0gQUREUl9SQU5HRV9UUkVFOwotCi0vKiBUaGUgdG9wIGxldmVsIHN0cnVjdC4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9hZGRyX3JhbmdlIHsKLSAgQUREUl9TVUJSQU5HRSAqcmFuZ2VzOwotI2RlZmluZSBBRERSX1JBTkdFX1JBTkdFUyhhcikgKChhciktPnJhbmdlcykKLSAgQUREUl9SQU5HRV9UUkVFICpyYW5nZV90cmVlOwotI2RlZmluZSBBRERSX1JBTkdFX1RSRUUoYXIpICgoYXIpLT5yYW5nZV90cmVlKQotfSBBRERSX1JBTkdFOwotCi0vKiBBZGQgYWRkcmVzcyByYW5nZSBTVEFSVCxFTkQgdG8gQVIuICAqLwotZXh0ZXJuIHZvaWQgc2ltX2FkZHJfcmFuZ2VfYWRkIChBRERSX1JBTkdFICogLyphciovLAotCQkJCWFkZHJlc3Nfd29yZCAvKnN0YXJ0Ki8sCi0JCQkJYWRkcmVzc193b3JkIC8qZW5kKi8pOwotCi0vKiBEZWxldGUgYWRkcmVzcyByYW5nZSBTVEFSVCxFTkQgZnJvbSBBUi4gICovCi1leHRlcm4gdm9pZCBzaW1fYWRkcl9yYW5nZV9kZWxldGUgKEFERFJfUkFOR0UgKiAvKmFyKi8sCi0JCQkJICAgYWRkcmVzc193b3JkIC8qc3RhcnQqLywKLQkJCQkgICBhZGRyZXNzX3dvcmQgLyplbmQqLyk7Ci0KLS8qIFJldHVybiBub24temVybyBpZiBBRERSIGlzIGluIHJhbmdlIEFSLCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZS4KLSAgIElmIG5vIHJhbmdlIGlzIHNwZWNpZmllZCwgdGhhdCBpcyBkZWZpbmVkIHRvIG1lYW4gImV2ZXJ5dGhpbmciLiAgKi8KLWV4dGVybiBJTkxJTkUgaW50Ci1zaW1fYWRkcl9yYW5nZV9oaXRfcCAoQUREUl9SQU5HRSAqIC8qYXIqLywgYWRkcmVzc193b3JkIC8qYWRkciovKTsKLSNkZWZpbmUgQUREUl9SQU5HRV9ISVRfUChhciwgYWRkcikgXAotICAoKGFyKS0+cmFuZ2VfdHJlZSA9PSBOVUxMIHx8IHNpbV9hZGRyX3JhbmdlX2hpdF9wICgoYXIpLCAoYWRkcikpKQotCi0jaWZkZWYgSEFWRV9JTkxJTkUKLSNpZmRlZiBTSU1fQVJBTkdFX0MKLSNkZWZpbmUgU0lNX0FSQU5HRV9JTkxJTkUgSU5MSU5FCi0jZWxzZQotI2RlZmluZSBTSU1fQVJBTkdFX0lOTElORSBFWFRFUk5fSU5MSU5FCi0jZW5kaWYKLSNpbmNsdWRlICJzaW0tYXJhbmdlLmMiCi0jZWxzZQotI2RlZmluZSBTSU1fQVJBTkdFX0lOTElORQotI2VuZGlmCi0jZGVmaW5lIFNJTV9BUkFOR0VfQ19JTkNMVURFRAotCi0jZW5kaWYgLyogU0lNX0FSQU5HRV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1hc3NlcnQuaCBiL3NpbS9jb21tb24vc2ltLWFzc2VydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc0MDg0Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWFzc2VydC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIEdEQi4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9BU1NFUlRfSF8KLSNkZWZpbmUgX1NJTV9BU1NFUlRfSF8KLQotI2RlZmluZSBTSU1fRklMVEVSX1BBVEgoRklMRSwgUEFUSCkgXAotZG8gXAotICB7IFwKLSAgICAvKiBzdHJpcCBsZWFkaW5nIHBhdGggKi8gXAotICAgIGNvbnN0IGNoYXIgKnAgPSAoUEFUSCk7IFwKLSAgICAoRklMRSkgPSBwOyBcCi0gICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJzonKSBcCi0gICAgICB7IFwKLSAgICAgICAgaWYgKCpwID09ICcvJykgXAotICAgICAgICAgIChGSUxFKSA9IHAgKyAxOyBcCi0gICAgICAgIHArKzsgXAotICAgICAgfSBcCi0gIH0gXAotd2hpbGUgKDApCi0KLS8qIFRoZSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNJTV9BU1NFUlQgYW5kIEFTU0VSVCBpcyB0aGF0Ci0gICBTSU1fQVNTRVJUIHBhc3NlcyBgc2QnIHRvIHNpbV9pb19lcnJvciBmb3IgdGhlIFNJTV9ERVNDLAotICAgQVNTRVJUIHBhc3NlcyBOVUxMLiAgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fQVNTRVJUKQotI2lmIGRlZmluZWQgKFdJVEhfQVNTRVJUKQotI2RlZmluZSBTSU1fQVNTRVJUKEVYUFJFU1NJT04pIFwKLWRvIFwKLSAgeyBcCi0gICAgaWYgKFdJVEhfQVNTRVJUKSBcCi0gICAgICB7IFwKLSAgICAgICAgaWYgKCEoRVhQUkVTU0lPTikpIFwKLSAgICAgICAgICB7IFwKLSAgICAgICAgICAgIC8qIHJlcG9ydCB0aGUgZmFpbHVyZSAqLyBcCi0gICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlOyBcCi0gICAgICAgICAgICBTSU1fRklMVEVSX1BBVEgoZmlsZSwgX19GSUxFX18pOyBcCi0gICAgICAgICAgICBzaW1faW9fZXJyb3IgKHNkLCAiJXM6JWQ6IGFzc2VydGlvbiBmYWlsZWQgLSAlcyIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgX19MSU5FX18sICNFWFBSRVNTSU9OKTsgXAotICAgICAgICAgIH0gXAotICAgICAgfSBcCi0gIH0gXAotd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBTSU1fQVNTRVJUKEVYUFJFU1NJT04pIGRvIHsgLypub3RoaW5nKi87IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEFTU0VSVCkKLSNpZiBkZWZpbmVkIChXSVRIX0FTU0VSVCkKLSNkZWZpbmUgQVNTRVJUKEVYUFJFU1NJT04pIFwKLWRvIFwKLSAgeyBcCi0gICAgaWYgKFdJVEhfQVNTRVJUKSBcCi0gICAgICB7IFwKLSAgICAgICAgaWYgKCEoRVhQUkVTU0lPTikpIFwKLSAgICAgICAgICB7IFwKLSAgICAgICAgICAgIC8qIHJlcG9ydCB0aGUgZmFpbHVyZSAqLyBcCi0gICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlOyBcCi0gICAgICAgICAgICBTSU1fRklMVEVSX1BBVEgoZmlsZSwgX19GSUxFX18pOyBcCi0gICAgICAgICAgICBzaW1faW9fZXJyb3IgKE5VTEwsICIlczolZDogYXNzZXJ0aW9uIGZhaWxlZCAtICVzIiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBfX0xJTkVfXywgI0VYUFJFU1NJT04pOyBcCi0gICAgICAgICAgfSBcCi0gICAgICB9IFwKLSAgfSBcCi13aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIEFTU0VSVChFWFBSRVNTSU9OKSBkbyB7IC8qbm90aGluZyovOyB9IHdoaWxlICgwKQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1iYXNlLmggYi9zaW0vY29tbW9uL3NpbS1iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGIxMzcuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIFNpbXVsYXRvciBwc2V1ZG8gYmFzZWNsYXNzLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFNpbXVsYXRvciBzdGF0ZSBwc2V1ZG8gYmFzZWNsYXNzLgotCi0gICBFYWNoIHNpbXVsYXRvciBpcyByZXF1aXJlZCB0byBoYXZlIHRoZSBmaWxlIGBgc2ltLW1haW4uaCcnLiAgVGhhdAotICAgZmlsZSBpbmNsdWRlcyBgYHNpbS1iYXNpY3MuaCcnLCBkZWZpbmVzIHRoZSBiYXNlIHR5cGUgYGBzaW1fY2lhJycKLSAgICh0aGUgZGF0YSB0eXBlIHRoYXQgY29udGFpbnMgY29tcGxldGUgY3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzCi0gICBpbmZvcm1hdGlvbiksIGluY2x1ZGUgYGBzaW0tYmFzZS5oJyc6Ci0KLSAgICAgI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSAgICAgdHlwZWRlZiBhZGRyZXNzX3dvcmQgc2ltX2NpYTsKLSAgICAgLy0qIElmIGBzaW1fY2lhJyBpcyBub3QgYW4gaW50ZWdyYWwgdmFsdWUgKGUuZy4gYSBzdHJ1Y3QpLCBkZWZpbmUKLSAgICAgICAgIENJQV9BRERSIHRvIHJldHVybiB0aGUgaW50ZWdyYWwgdmFsdWUuICAqLS8KLSAgICAgLy0qICNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoLi4uKSAqLS8KLSAgICAgI2luY2x1ZGUgInNpbS1iYXNlLmgiCi0gICAKLSAgIGZpbmFsbHksIHR3byBkYXRhIHR5cGVzIGBzdHJ1Y3QgX3NpbV9jcHUnIGFuZCBgc3RydWN0IHNpbV9zdGF0ZScKLSAgIGFyZSBkZWZpbmVkOgotCi0gICAgIHN0cnVjdCBfc2ltX2NwdSB7Ci0gICAgICAgIC4uLiBzaW11bGF0b3Igc3BlY2lmaWMgbWVtYmVycyAuLi4KLSAgICAgICAgc2ltX2NwdV9iYXNlIGJhc2U7Ci0gICAgIH07Ci0KLSAgICAgc3RydWN0IHNpbV9zdGF0ZSB7Ci0gICAgICAgc2ltX2NwdSBjcHVbTUFYX05SX1BST0NFU1NPUlNdOwotICAgICAjaWYgKFdJVEhfU01QKQotICAgICAjZGVmaW5lIFNUQVRFX0NQVShzZCxuKSAoJihzZCktPmNwdVtuXSkKLSAgICAgI2Vsc2UKLSAgICAgI2RlZmluZSBTVEFURV9DUFUoc2QsbikgKCYoc2QpLT5jcHVbMF0pCi0gICAgICNlbmRpZgotICAgICAgIC4uLiBzaW11bGF0b3Igc3BlY2lmaWMgbWVtYmVycyAuLi4KLSAgICAgICBzaW1fc3RhdGVfYmFzZSBiYXNlOwotICAgICB9OwotCi0gICBOb3RlIHRoYXQgYGJhc2UnIGFwcGVhcnMgbGFzdC4gIFRoaXMgbWFrZXMgYGJhc2UubWFnaWMnIGFwcGVhciBsYXN0Ci0gICBpbiB0aGUgZW50aXJlIHN0cnVjdCBhbmQgaGVscHMgY2F0Y2ggbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLwotCi0KLSNpZm5kZWYgU0lNX0JBU0VfSAotI2RlZmluZSBTSU1fQkFTRV9ICi0KLS8qIFByZS1kZWNsYXJlIGNlcnRhaW4gdHlwZXMuICovCi0KLS8qIHR5cGVkZWYgPHRhcmdldC1kZXBlbmRhbnQ+IHNpbV9jaWE7ICovCi0jaWZuZGVmIE5VTExfQ0lBCi0jZGVmaW5lIE5VTExfQ0lBICgoc2ltX2NpYSkgMCkKLSNlbmRpZgotLyogUmV0dXJuIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFkZHJlc3MgYXMgYSBudW1iZXIuCi0gICBTb21lIHRhcmdldHMgdHJlYXQgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBhcyBhIHN0cnVjdAotICAgKGUuZy4gZm9yIGRlbGF5IHNsb3QgaGFuZGxpbmcpLiAgKi8KLSNpZm5kZWYgQ0lBX0FERFIKLSNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoY2lhKQotI2VuZGlmCi0jaWZuZGVmIElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUwotI2RlZmluZSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MgKChhZGRyZXNzX3dvcmQpMCAtIDEpCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9jcHUgc2ltX2NwdTsKLQotI2luY2x1ZGUgInNpbS1tb2R1bGUuaCIKLQotI2luY2x1ZGUgInNpbS10cmFjZS5oIgotI2luY2x1ZGUgInNpbS1jb3JlLmgiCi0jaW5jbHVkZSAic2ltLWV2ZW50cy5oIgotI2luY2x1ZGUgInNpbS1wcm9maWxlLmgiCi0jaWZkZWYgU0lNX0hBVkVfTU9ERUwKLSNpbmNsdWRlICJzaW0tbW9kZWwuaCIKLSNlbmRpZgotI2luY2x1ZGUgInNpbS1pby5oIgotI2luY2x1ZGUgInNpbS1lbmdpbmUuaCIKLSNpbmNsdWRlICJzaW0td2F0Y2guaCIKLSNpbmNsdWRlICJzaW0tbWVtb3B0LmgiCi0jaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKLSNpbmNsdWRlICJzaW0tYnJlYWsuaCIKLSNlbmRpZgotI2luY2x1ZGUgInNpbS1jcHUuaCIKLQotLyogR2xvYmFsIHBvaW50ZXIgdG8gY3VycmVudCBzdGF0ZSB3aGlsZSBzaW1fcmVzdW1lIGlzIHJ1bm5pbmcuCi0gICBPbiBhIG1hY2hpbmUgd2l0aCBsb3RzIG9mIHJlZ2lzdGVycywgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gcmVzZXJ2ZQotICAgb25lIG9mIHRoZW0gZm9yIGN1cnJlbnRfc3RhdGUuICBIb3dldmVyIG9uIGEgbWFjaGluZSB3aXRoIGZldyByZWdpc3RlcnMKLSAgIGN1cnJlbnRfc3RhdGUgY2FuJ3QgcGVybWFuZW50bHkgbGl2ZSBpbiBvbmUgYW5kIGluZGlyZWN0aW5nIHRocm91Z2ggaXQKLSAgIHdpbGwgYmUgc2xvd2VyIFtpbiB3aGljaCBjYXNlIG9uZSBjYW4gaGF2ZSBzaW1fcmVzdW1lIHNldCBnbG9iYWxzIGZyb20KLSAgIGN1cnJlbnRfc3RhdGUgZm9yIGZhc3RlciBhY2Nlc3NdLgotICAgSWYgQ1VSUkVOVF9TVEFURV9SRUcgaXMgZGVmaW5lZCwgaXQgbWVhbnMgY3VycmVudF9zdGF0ZSBpcyBsaXZpbmcgaW4KLSAgIGEgZ2xvYmFsIHJlZ2lzdGVyLiAgKi8KLQotCi0jaWZkZWYgQ1VSUkVOVF9TVEFURV9SRUcKLS8qIEZJWE1FOiB3aXAgKi8KLSNlbHNlCi1leHRlcm4gc3RydWN0IHNpbV9zdGF0ZSAqY3VycmVudF9zdGF0ZTsKLSNlbmRpZgotCi0KLS8qIFRoZSBzaW11bGF0b3IgbWF5IHByb3ZpZGUgZGlmZmVyZW50IChhbmQgZmFzdGVyKSBkZWZpbml0aW9uLiAgKi8KLSNpZm5kZWYgQ1VSUkVOVF9TVEFURQotI2RlZmluZSBDVVJSRU5UX1NUQVRFIGN1cnJlbnRfc3RhdGUKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAvKiBTaW11bGF0b3IncyBhcmd2WzBdLiAgKi8KLSAgY29uc3QgY2hhciAqbXlfbmFtZTsKLSNkZWZpbmUgU1RBVEVfTVlfTkFNRShzZCkgKChzZCktPmJhc2UubXlfbmFtZSkKLQotICAvKiBXaG8gb3BlbmVkIHRoZSBzaW11bGF0b3IuICAqLwotICBTSU1fT1BFTl9LSU5EIG9wZW5fa2luZDsKLSNkZWZpbmUgU1RBVEVfT1BFTl9LSU5EKHNkKSAoKHNkKS0+YmFzZS5vcGVuX2tpbmQpCi0KLSAgLyogVGhlIGhvc3QgY2FsbGJhY2tzLiAgKi8KLSAgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpjYWxsYmFjazsKLSNkZWZpbmUgU1RBVEVfQ0FMTEJBQ0soc2QpICgoc2QpLT5iYXNlLmNhbGxiYWNrKQotCi0gIC8qIFRoZSB0eXBlIG9mIHNpbXVsYXRpb24gZW52aXJvbm1lbnQgKHVzZXIvb3BlcmF0aW5nKS4gICovCi0gIGVudW0gc2ltX2Vudmlyb25tZW50IGVudmlyb25tZW50OwotI2RlZmluZSBTVEFURV9FTlZJUk9OTUVOVChzZCkgKChzZCktPmJhc2UuZW52aXJvbm1lbnQpCi0KLSNpZiAwIC8qIEZJWE1FOiBOb3QgcmVhZHkgeWV0LiAgKi8KLSAgLyogU3R1ZmYgZGVmaW5lZCBpbiBzaW0tY29uZmlnLmguICAqLwotICBzdHJ1Y3Qgc2ltX2NvbmZpZyBjb25maWc7Ci0jZGVmaW5lIFNUQVRFX0NPTkZJRyhzZCkgKChzZCktPmJhc2UuY29uZmlnKQotI2VuZGlmCi0KLSAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGBpbml0JyBoYW5kbGVycy4gICovCi0gIHN0cnVjdCBtb2R1bGVfbGlzdCAqbW9kdWxlczsKLSNkZWZpbmUgU1RBVEVfTU9EVUxFUyhzZCkgKChzZCktPmJhc2UubW9kdWxlcykKLQotICAvKiBTdXBwb3J0ZWQgb3B0aW9ucy4gICovCi0gIHN0cnVjdCBvcHRpb25fbGlzdCAqb3B0aW9uczsKLSNkZWZpbmUgU1RBVEVfT1BUSU9OUyhzZCkgKChzZCktPmJhc2Uub3B0aW9ucykKLQotICAvKiBOb24temVybyBpZiAtdiBzcGVjaWZpZWQuICAqLwotICBpbnQgdmVyYm9zZV9wOwotI2RlZmluZSBTVEFURV9WRVJCT1NFX1Aoc2QpICgoc2QpLT5iYXNlLnZlcmJvc2VfcCkKLQotICAvKiBOb24gY3B1LXNwZWNpZmljIHRyYWNlIGRhdGEuICBTZWUgc2ltLXRyYWNlLmguICAqLwotICBUUkFDRV9EQVRBIHRyYWNlX2RhdGE7Ci0jZGVmaW5lIFNUQVRFX1RSQUNFX0RBVEEoc2QpICgmIChzZCktPmJhc2UudHJhY2VfZGF0YSkKLQotICAvKiBJZiBub24gTlVMTCwgdGhlIEJGRCBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hpdGVjdHVyZTsKLSNkZWZpbmUgU1RBVEVfQVJDSElURUNUVVJFKHNkKSAoKHNkKS0+YmFzZS5hcmNoaXRlY3R1cmUpCi0KLSAgLyogSWYgbm9uIE5VTEwsIHRoZSBiZmQgdGFyZ2V0IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCi0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLSNkZWZpbmUgU1RBVEVfVEFSR0VUKHNkKSAoKHNkKS0+YmFzZS50YXJnZXQpCi0KLSAgLyogSW4gc3RhbmRhbG9uZSBzaW11bGF0b3IsIHRoaXMgaXMgdGhlIHByb2dyYW0ncyBhcmd1bWVudHMgcGFzc2VkCi0gICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBjaGFyICoqcHJvZ19hcmd2OwotI2RlZmluZSBTVEFURV9QUk9HX0FSR1Yoc2QpICgoc2QpLT5iYXNlLnByb2dfYXJndikKLQotICAvKiBUaGUgcHJvZ3JhbSdzIGJmZC4gICovCi0gIHN0cnVjdCBfYmZkICpwcm9nX2JmZDsKLSNkZWZpbmUgU1RBVEVfUFJPR19CRkQoc2QpICgoc2QpLT5iYXNlLnByb2dfYmZkKQotCi0gIC8qIFN5bWJvbCB0YWJsZSBmb3IgcHJvZ19iZmQgKi8KLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnByb2dfc3ltczsKLSNkZWZpbmUgU1RBVEVfUFJPR19TWU1TKHNkKSAoKHNkKS0+YmFzZS5wcm9nX3N5bXMpCi0KLSAgLyogVGhlIHByb2dyYW0ncyB0ZXh0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3Qgc2VjICp0ZXh0X3NlY3Rpb247Ci0gIC8qIFN0YXJ0aW5nIGFuZCBlbmRpbmcgdGV4dCBzZWN0aW9uIGFkZHJlc3NlcyBmcm9tIHRoZSBiZmQuICAqLwotICBTSU1fQUREUiB0ZXh0X3N0YXJ0LCB0ZXh0X2VuZDsKLSNkZWZpbmUgU1RBVEVfVEVYVF9TRUNUSU9OKHNkKSAoKHNkKS0+YmFzZS50ZXh0X3NlY3Rpb24pCi0jZGVmaW5lIFNUQVRFX1RFWFRfU1RBUlQoc2QpICgoc2QpLT5iYXNlLnRleHRfc3RhcnQpCi0jZGVmaW5lIFNUQVRFX1RFWFRfRU5EKHNkKSAoKHNkKS0+YmFzZS50ZXh0X2VuZCkKLQotICAvKiBTdGFydCBhZGRyZXNzLCBzZXQgd2hlbiB0aGUgcHJvZ3JhbSBpcyBsb2FkZWQgZnJvbSB0aGUgYmZkLiAgKi8KLSAgU0lNX0FERFIgc3RhcnRfYWRkcjsKLSNkZWZpbmUgU1RBVEVfU1RBUlRfQUREUihzZCkgKChzZCktPmJhc2Uuc3RhcnRfYWRkcikKLQotICAvKiBTaXplIG9mIHRoZSBzaW11bGF0b3IncyBjYWNoZSwgaWYgYW55LgotICAgICBUaGlzIGlzIG5vdCB0aGUgdGFyZ2V0J3MgY2FjaGUuICBJdCBpcyB0aGUgY2FjaGUgdGhlIHNpbXVsYXRvciB1c2VzCi0gICAgIHRvIHByb2Nlc3MgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgdW5zaWduZWQgaW50IHNjYWNoZV9zaXplOwotI2RlZmluZSBTVEFURV9TQ0FDSEVfU0laRShzZCkgKChzZCktPmJhc2Uuc2NhY2hlX3NpemUpCi0KLSAgLyogRklYTUU6IE1vdmUgdG8gdG9wIGxldmVsIHNpbV9zdGF0ZSBzdHJ1Y3QgKGFzIHNvbWUgc3RydWN0KT8gICovCi0jaWZkZWYgU0lNX0hBVkVfRkxBVE1FTQotICB1bnNpZ25lZCBpbnQgbWVtX3NpemU7Ci0jZGVmaW5lIFNUQVRFX01FTV9TSVpFKHNkKSAoKHNkKS0+YmFzZS5tZW1fc2l6ZSkKLSAgdW5zaWduZWQgaW50IG1lbV9iYXNlOwotI2RlZmluZSBTVEFURV9NRU1fQkFTRShzZCkgKChzZCktPmJhc2UubWVtX2Jhc2UpCi0gIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSNkZWZpbmUgU1RBVEVfTUVNT1JZKHNkKSAoKHNkKS0+YmFzZS5tZW1vcnkpCi0jZW5kaWYKLQotICAvKiBjb3JlIG1lbW9yeSBidXMgKi8KLSNkZWZpbmUgU1RBVEVfQ09SRShzZCkgKCYoc2QpLT5iYXNlLmNvcmUpCi0gIHNpbV9jb3JlIGNvcmU7Ci0KLSAgLyogUmVjb3JkIG9mIG1lbW9yeSBzZWN0aW9ucyBhZGRlZCB2aWEgdGhlIG1lbW9yeS1vcHRpb25zIGludGVyZmFjZS4gICovCi0jZGVmaW5lIFNUQVRFX01FTU9QVChzZCkgKChzZCktPmJhc2UubWVtb3B0KQotICBzaW1fbWVtb3B0ICptZW1vcHQ7Ci0KLSAgLyogZXZlbnQgaGFuZGxlciAqLwotI2RlZmluZSBTVEFURV9FVkVOVFMoc2QpICgmKHNkKS0+YmFzZS5ldmVudHMpCi0gIHNpbV9ldmVudHMgZXZlbnRzOwotCi0gIC8qIGdlbmVyaWMgaGFsdC9yZXN1bWUgZW5naW5lICovCi0gIHNpbV9lbmdpbmUgZW5naW5lOwotI2RlZmluZSBTVEFURV9FTkdJTkUoc2QpICgmKHNkKS0+YmFzZS5lbmdpbmUpCi0KLSAgLyogZ2VuZXJpYyB3YXRjaHBvaW50IHN1cHBvcnQgKi8KLSAgc2ltX3dhdGNocG9pbnRzIHdhdGNocG9pbnRzOwotI2RlZmluZSBTVEFURV9XQVRDSFBPSU5UUyhzZCkgKCYoc2QpLT5iYXNlLndhdGNocG9pbnRzKQotCi0gIC8qIFBvaW50ZXIgdG8gbGlzdCBvZiBicmVha3BvaW50cyAqLwotICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJyZWFrcG9pbnRzOwotI2RlZmluZSBTVEFURV9CUkVBS1BPSU5UUyhzZCkgKChzZCktPmJhc2UuYnJlYWtwb2ludHMpCi0KLSNpZiBXSVRIX0hXCi0gIHN0cnVjdCBzaW1faHcgKmh3OwotI2RlZmluZSBTVEFURV9IVyhzZCkgKChzZCktPmJhc2UuaHcpCi0jZW5kaWYKLQotICAvKiBTaG91bGQgaW1hZ2UgbG9hZHMgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBMTUEgb3IgVk1BPyAgT2xkZXIKLSAgICAgc2ltdWxhdG9ycyB1c2UgdGhlIFZNQSB3aGlsZSBuZXdlciBzaW11bGF0b3JzIHByZWZlciB0aGUgTE1BLiAqLwotICBpbnQgbG9hZF9hdF9sbWFfcDsKLSNkZWZpbmUgU1RBVEVfTE9BRF9BVF9MTUFfUChTRCkgKChTRCktPmJhc2UubG9hZF9hdF9sbWFfcCkKLQotICAvKiBNYXJrZXIgZm9yIHRob3NlIHdhbnRpbmcgdG8gZG8gc2FuaXR5IGNoZWNrcy4KLSAgICAgVGhpcyBzaG91bGQgcmVtYWluIHRoZSBsYXN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCB0byBoZWxwIGNhdGNoCi0gICAgIG1pc2NvbXBpbGF0aW9uIGVycm9ycy4gICovCi0gIGludCBtYWdpYzsKLSNkZWZpbmUgU0lNX01BR0lDX05VTUJFUiAweDQyNDIKLSNkZWZpbmUgU1RBVEVfTUFHSUMoc2QpICgoc2QpLT5iYXNlLm1hZ2ljKQotfSBzaW1fc3RhdGVfYmFzZTsKLQotLyogRnVuY3Rpb25zIGZvciBhbGxvY2F0aW5nL2ZyZWVpbmcgYSBzaW1fc3RhdGUuICAqLwotU0lNX0RFU0Mgc2ltX3N0YXRlX2FsbG9jIFBBUkFNUyAoKFNJTV9PUEVOX0tJTkQga2luZCwgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2spKTsKLXZvaWQgc2ltX3N0YXRlX2ZyZWUgUEFSQU1TICgoU0lNX0RFU0MpKTsKLQotI2VuZGlmIC8qIFNJTV9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWJhc2ljcy5oIGIvc2ltL2NvbW1vbi9zaW0tYmFzaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzRiMjEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tYmFzaWNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9TSU1fQkFTSUNTX0hfCi0jZGVmaW5lIF9TSU1fQkFTSUNTX0hfCi0KLQotLyogQmFzaWMgY29uZmlndXJhdGlvbiAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLS8qIEJhc2ljIGhvc3QgZGVwZW5kYW50IG1lc3MgLSBob3BlZnVsbHkgPHN0ZGlvLmg+ICsgPHN0ZGFyZy5oPiB3aWxsCi0gICBicmluZyBwb3RlbnRpYWwgY29uZmxpY3RzIG91dCBpbiB0aGUgb3BlbiAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2lmZGVmIF9fQ1lHV0lOMzJfXwotZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKipyZXN1bHQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKLWV4dGVybiBpbnQgYXNwcmludGYgKGNoYXIgKipyZXN1bHQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLSNlbmRpZgotCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0KLQkKLS8qIFNvbWUgdmVyc2lvbnMgb2YgR0NDIGluY2x1ZGUgYW4gYXR0cmlidXRlIG9wZXJhdG9yLCBkZWZpbmUgaXQgKi8KLQotI2lmICFkZWZpbmVkIChfX2F0dHJpYnV0ZV9fKQotI2lmICghZGVmaW5lZChfX0dOVUNfXykgfHwgKF9fR05VQ19fIDwgMikgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA2KSkKLSNkZWZpbmUgX19hdHRyaWJ1dGVfXyhhcmcpCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIEdsb2JhbCB0eXBlcyB0aGF0IGNvZGUgbWFuaXB1bGF0ZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2RldmljZSBkZXZpY2U7Ci1zdHJ1Y3QgaHc7Ci1zdHJ1Y3QgX3NpbV9mcHU7Ci0KLQotLyogR2VuZXJpYyBhZGRyZXNzIHNwYWNlIChtYXBzKSBhbmQgYWNjZXNzIGF0dHJpYnV0ZXMgKi8KLQotZW51bSB7Ci0gIHJlYWRfbWFwID0gMCwKLSAgd3JpdGVfbWFwID0gMSwKLSAgZXhlY19tYXAgPSAyLAotICBpb19tYXAgPSAzLAotICBucl9tYXBzID0gMzIsIC8qIHNvbWV0aGluZyBzbWFsbCAqLwotfTsKLQotZW51bSB7Ci0gIGFjY2Vzc19pbnZhbGlkID0gMCwKLSAgYWNjZXNzX3JlYWQgPSAxIDw8IHJlYWRfbWFwLAotICBhY2Nlc3Nfd3JpdGUgPSAxIDw8IHdyaXRlX21hcCwKLSAgYWNjZXNzX2V4ZWMgPSAxIDw8IGV4ZWNfbWFwLAotICBhY2Nlc3NfaW8gPSAxIDw8IGlvX21hcCwKLX07Ci0KLWVudW0gewotICBhY2Nlc3NfcmVhZF93cml0ZSA9IChhY2Nlc3NfcmVhZCB8IGFjY2Vzc193cml0ZSksCi0gIGFjY2Vzc19yZWFkX2V4ZWMgPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3NfZXhlYyksCi0gIGFjY2Vzc193cml0ZV9leGVjID0gKGFjY2Vzc193cml0ZSB8IGFjY2Vzc19leGVjKSwKLSAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYyA9IChhY2Nlc3NfcmVhZCB8IGFjY2Vzc193cml0ZSB8IGFjY2Vzc19leGVjKSwKLSAgYWNjZXNzX3JlYWRfaW8gPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3NfaW8pLAotICBhY2Nlc3Nfd3JpdGVfaW8gPSAoYWNjZXNzX3dyaXRlIHwgYWNjZXNzX2lvKSwKLSAgYWNjZXNzX3JlYWRfd3JpdGVfaW8gPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3Nfd3JpdGUgfCBhY2Nlc3NfaW8pLAotICBhY2Nlc3NfZXhlY19pbyA9IChhY2Nlc3NfZXhlYyB8IGFjY2Vzc19pbyksCi0gIGFjY2Vzc19yZWFkX2V4ZWNfaW8gPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3NfZXhlYyB8IGFjY2Vzc19pbyksCi0gIGFjY2Vzc193cml0ZV9leGVjX2lvID0gKGFjY2Vzc193cml0ZSB8IGFjY2Vzc19leGVjIHwgYWNjZXNzX2lvKSwKLSAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlY19pbyA9IChhY2Nlc3NfcmVhZCB8IGFjY2Vzc193cml0ZSB8IGFjY2Vzc19leGVjIHwgYWNjZXNzX2lvKSwKLX07Ci0KLQotLyogZGlzcG9zaXRpb24gb2YgYW4gb2JqZWN0IHdoZW4gdGhpbmdzIGFyZSByZXNldCAqLwotCi10eXBlZGVmIGVudW0gewotICBwZXJtZW5hbnRfb2JqZWN0LAotICB0ZW1wb3Jhcnlfb2JqZWN0LAotfSBvYmplY3RfZGlzcG9zaXRpb247Ci0KLQotLyogTWVtb3J5IHRyYW5zZmVyIHR5cGVzICovCi0KLXR5cGVkZWYgZW51bSBfdHJhbnNmZXJfdHlwZSB7Ci0gIHJlYWRfdHJhbnNmZXIsCi0gIHdyaXRlX3RyYW5zZmVyLAotfSB0cmFuc2Zlcl90eXBlOwotCi0KLS8qIGRpcmVjdGlvbnMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgYmlkaXJlY3RfcG9ydCwKLSAgaW5wdXRfcG9ydCwKLSAgb3V0cHV0X3BvcnQsCi19IHBvcnRfZGlyZWN0aW9uOwotCi0KLQwKLS8qIEJhc2ljIGRlZmluaXRpb25zIC0gb3JkZXJlZCBzbyB0aGF0IG5vdGhpbmcgY2FsbHMgd2hhdCBjb21lcyBhZnRlciBpdC4gICovCi0KLS8qIEZJWE1FOiBjb25kaXRpb25hbGl6aW5nIHRjb25maWcuaCBvbiBIQVZFX0NPTkZJR19IIHNlZW1zIHdyb25nLiAgKi8KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAidGNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAicmVtb3RlLXNpbS5oIgotCi0jaW5jbHVkZSAic2ltLWNvbmZpZy5oIgotCi0jaW5jbHVkZSAic2ltLWlubGluZS5oIgotCi0jaW5jbHVkZSAic2ltLXR5cGVzLmgiCi0jaW5jbHVkZSAic2ltLWJpdHMuaCIKLSNpbmNsdWRlICJzaW0tZW5kaWFuLmgiCi0jaW5jbHVkZSAic2ltLXNpZ25hbC5oIgotI2luY2x1ZGUgInNpbS1hcmFuZ2UuaCIKLQotI2luY2x1ZGUgInNpbS11dGlscy5oIgotCi0vKiBOb3RlOiBPbmx5IHRoZSBzaW1wbGVyIGludGVyZmFjZXMgYXJlIGRlZmluZWQgaGVyZS4gIE1vcmUgaGVhdnkKLSAgIHdlaWdodCBvYmplY3RzLCBzdWNoIGFzIGNvcmUgYW5kIGV2ZW50cywgYXJlIGRlZmluZWQgaW4gdGhlIG1vcmUKLSAgIHNlcmlvdXMgc2ltLWJhc2UuaCBoZWFkZXIuICovCi0KLSNlbmRpZiAvKiBfU0lNX0JBU0lDU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYml0cy5jIGIvc2ltL2NvbW1vbi9zaW0tYml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZiNzNiLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWJpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9TSU1fQklUU19DXwotI2RlZmluZSBfU0lNX0JJVFNfQ18KLQotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0KLQotSU5MSU5FX1NJTV9CSVRTXAotKHVuc2lnbmVkX3dvcmQpCi1MU01BU0tFRCAodW5zaWduZWRfd29yZCB2YWwsCi0JICBpbnQgc3RhcnQsCi0JICBpbnQgc3RvcCkKLXsKLSAgLyogTk9URSAtIHN0YXJ0LCBzdG9wIGNhbiB3cmFwICovCi0gIHZhbCAmPSBMU01BU0sgKHN0YXJ0LCBzdG9wKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWRfd29yZCkKLU1TTUFTS0VEICh1bnNpZ25lZF93b3JkIHZhbCwKLQkgIGludCBzdGFydCwKLQkgIGludCBzdG9wKQotewotICAvKiBOT1RFIC0gc3RhcnQsIHN0b3AgY2FuIHdyYXAgKi8KLSAgdmFsICY9IE1TTUFTSyAoc3RhcnQsIHN0b3ApOwotICByZXR1cm4gdmFsOwotfQotCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZF93b3JkKQotTFNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAotCSAgICAgaW50IHN0YXJ0LAotCSAgICAgaW50IHN0b3ApCi17Ci0gIEFTU0VSVCAoc3RhcnQgPj0gc3RvcCk7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIExTRVhUUkFDVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgaWYgKHN0b3AgPj0gMzIpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3RhcnQgPCAzMikKLQl2YWwgJj0gTFNNQVNLIChzdGFydCwgMCk7Ci0gICAgICB2YWwgPj49IHN0b3A7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSNlbmRpZgotfQotCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZF93b3JkKQotTVNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAotCSAgICAgaW50IHN0YXJ0LAotCSAgICAgaW50IHN0b3ApCi17Ci0gIEFTU0VSVCAoc3RhcnQgPD0gc3RvcCk7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIE1TRVhUUkFDVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgaWYgKHN0b3AgPCAzMikKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzdGFydCA+PSAzMikKLQl2YWwgJj0gTVNNQVNLIChzdGFydCwgNjQgLSAxKTsKLSAgICAgIHZhbCA+Pj0gKDY0IC0gc3RvcCAtIDEpOwotICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0jZW5kaWYKLX0KLQotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWRfd29yZCkKLUxTSU5TRVJURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAotCSAgICBpbnQgc3RhcnQsCi0JICAgIGludCBzdG9wKQotewotICBBU1NFUlQgKHN0YXJ0ID49IHN0b3ApOwotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIHJldHVybiBMU0lOU0VSVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgLyogQml0IG51bWJlcnMgYXJlIDYzLi4wLCBldmVuIGZvciAzMiBiaXQgdGFyZ2V0cy4KLSAgICAgT24gMzIgYml0IHRhcmdldHMgd2UgaWdub3JlIDYzLi4zMiAgKi8KLSAgaWYgKHN0b3AgPj0gMzIpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPDw9IHN0b3A7Ci0gICAgICB2YWwgJj0gTFNNQVNLIChzdGFydCwgc3RvcCk7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSNlbmRpZgotfQotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWRfd29yZCkKLU1TSU5TRVJURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAotCSAgICBpbnQgc3RhcnQsCi0JICAgIGludCBzdG9wKQotewotICBBU1NFUlQgKHN0YXJ0IDw9IHN0b3ApOwotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIHJldHVybiBNU0lOU0VSVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgLyogQml0IG51bWJlcnMgYXJlIDAuLjYzLCBldmVuIGZvciAzMiBiaXQgdGFyZ2V0cy4KLSAgICAgT24gMzIgYml0IHRhcmdldHMgd2UgaWdub3JlIDAuLjMxLiAgKi8KLSAgaWYgKHN0b3AgPCAzMikKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbCA8PD0gKCg2NCAtIDEpIC0gc3RvcCk7Ci0gICAgICB2YWwgJj0gTVNNQVNLIChzdGFydCwgc3RvcCk7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSNlbmRpZgotfQotCi0KLQotSU5MSU5FX1NJTV9CSVRTXAotKHVuc2lnbmVkX3dvcmQpCi1MU1NFWFQgKHNpZ25lZF93b3JkIHZhbCwKLQlpbnQgc2lnbl9iaXQpCi17Ci0gIEFTU0VSVCAoc2lnbl9iaXQgPCA2NCk7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIExTU0VYVDY0ICh2YWwsIHNpZ25fYml0KTsKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0gIGlmIChzaWduX2JpdCA+PSAzMikKLSAgICByZXR1cm4gdmFsOwotICBlbHNlIHsKLSAgICB2YWwgPSBMU1NFWFQzMiAodmFsLCBzaWduX2JpdCk7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotI2VuZGlmCi19Ci0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZF93b3JkKQotTVNTRVhUIChzaWduZWRfd29yZCB2YWwsCi0JaW50IHNpZ25fYml0KQotewotICBBU1NFUlQgKHNpZ25fYml0IDwgNjQpOwotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIHJldHVybiBNU1NFWFQ2NCAodmFsLCBzaWduX2JpdCk7Ci0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotICBpZiAoc2lnbl9iaXQgPCAzMikKLSAgICByZXR1cm4gdmFsOwotICBlbHNlIHsKLSAgICB2YWwgPSBNU1NFWFQzMiAodmFsLCBzaWduX2JpdCAtIDMyKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0jZW5kaWYKLX0KLQotCi0KLSNkZWZpbmUgTiA4Ci0jaW5jbHVkZSAic2ltLW4tYml0cy5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDE2Ci0jaW5jbHVkZSAic2ltLW4tYml0cy5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDMyCi0jaW5jbHVkZSAic2ltLW4tYml0cy5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDY0Ci0jaW5jbHVkZSAic2ltLW4tYml0cy5oIgotI3VuZGVmIE4KLQotI2VuZGlmIC8qIF9TSU1fQklUU19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYml0cy5oIGIvc2ltL2NvbW1vbi9zaW0tYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTExYmNkLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWJpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9CSVRTX0hfCi0jZGVmaW5lIF9TSU1fQklUU19IXwotCi0KLS8qIEJpdCBtYW5pcHVsYXRpb24gcm91dGluZXM6Ci0KLSAgIEJpdCBudW1iZXJpbmc6IFRoZSBiaXRzIGFyZSBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCBJU0EncwotICAgY29udmVudGlvbi4gIFRoYXQgYmVpbmcgY29udHJvbGxlZCBieSBXSVRIX1RBUkdFVF9XT1JEX01TQi4gIEZvcgotICAgdGhlIFBvd2VyUEMgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApIHRoZSBudW1iZXJpbmcgaXMgMC4uMzEKLSAgIHdoaWxlIGZvciB0aGUgTUlQUyAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMzEpIGl0IGlzIDMxLi4wLgotCi0gICBTaXplIGNvbnZlbnRpb246IEVhY2ggbWFjcm8gaXMgaW4gdGhyZWUgZm9ybXMgLSA8TUFDUk8+MzIgd2hpY2gKLSAgIG9wZXJhdGVzIGluIDMyYml0IHF1YW50aXR5IChiaXRzIGFyZSBudW1iZXJlZCAwLi4zMSk7IDxNQUNSTz42NAotICAgd2hpY2ggb3BlcmF0ZXMgdXNpbmcgNjRiaXQgcXVhbnRpdGVzIChhbmQgYml0cyBhcmUgbnVtYmVyZWQgMC4uNjMpOwotICAgYW5kIDxNQUNSTz4gd2hpY2ggb3BlcmF0ZXMgdXNpbmcgdGhlIGJpdCBzaXplIG9mIHRoZSB0YXJnZXQKLSAgIGFyY2hpdGVjdHVyZSAoYml0cyBhcmUgc3RpbGwgbnVtYmVyZWQgMC4uNjMpLCB3aXRoIDMyYml0Ci0gICBhcmNoaXRlY3R1cmVzIGlnbm9yaW5nIHRoZSBmaXJzdCAzMmJpdHMgbGVhdmluZyBiaXQgMzIgYXMgdGhlIG1vc3QKLSAgIHNpZ25pZmljYW50LgotCi0gICBOQjogVXNlIEVYVFJBQ1RFRCwgTVNFWFRSQUNURUQgYW5kIExTRVhUUkFDVEVEIGFzIGEgZ3VpZGVsaW5lIGZvcgotICAgbmFtaW5nLiAgTFNNQVNLIGFuZCBMU01BU0tFRCBhcmUgd3JvbmcuCi0KLSAgIEJJVCooUE9TKTogYConIGJpdCBjb25zdGFudCB3aXRoIGp1c3QgMSBiaXQgc2V0LgotCi0gICBMU0JJVCooT0ZGU0VUKTogYConIGJpdCBjb25zdGFudCB3aXRoIGp1c3QgMSBiaXQgc2V0IC0gTFMgYml0IGlzCi0gICB6ZXJvLgotCi0gICBNU0JJVCooT0ZGU0VUKTogYConIGJpdCBjb25zdGFudCB3aXRoIGp1c3QgMSBiaXQgc2V0IC0gTVMgYml0IGlzCi0gICB6ZXJvLgotCi0gICBNQVNLKihGSVJTVCwgTEFTVCk6IGAqJyBiaXQgY29uc3RhbnQgd2l0aCBiaXRzIFtGSVJTVCAuLiBMQVNUXQotICAgc2V0LiBUaGUgPE1BQ1JPPiAobm8gc2l6ZSkgdmVyc2lvbiBwZXJtaXRzIEZJUlNUID49IExBU1QgYW5kCi0gICBnZW5lcmF0ZXMgYSB3cmFwcGVkIGJpdCBtYXNrIHZpcyAoWzAuLkxBU1RdIHwgW0ZJUlNULi5MU0JdKS4KLQotICAgTFNNQVNLKihGSVJTVCwgTEFTVCk6IExpa2UgTUFTSyAtIExTIGJpdCBpcyB6ZXJvLgotCi0gICBNU01BU0sqKEZJUlNULCBMQVNUKTogTGlrZSBNQVNLIC0gTFMgYml0IGlzIHplcm8uCi0KLSAgIE1BU0tFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTWFza3Mgb3V0IGFsbCBidXQgYml0cyBbRklSU1QKLSAgIC4uIExBU1RdLgotCi0gICBMU01BU0tFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTGlrZSBNQVNLRUQgLSBMUyBiaXQgaXMgemVyby4KLQotICAgTVNNQVNLRUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IExpa2UgTUFTS0VEIC0gTVMgYml0IGlzIHplcm8uCi0KLSAgIEVYVFJBQ1RFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTWFza3Mgb3V0IGJpdHMgW0ZJUlNUIC4uIExBU1RdIGJ1dAotICAgYWxzbyByaWdodCBzaGlmdHMgdGhlIG1hc2tlZCB2YWx1ZSBzbyB0aGF0IGJpdCBMQVNUIGJlY29tZXMgdGhlCi0gICBsZWFzdCBzaWduaWZpY2FudCAocmlnaHQgbW9zdCkuCi0KLSAgIExTRVhUUkFDVEVEKihWQUxVRSwgRklSU1QsIExBU1QpOiBTYW1lIGFzIGV4dHJhY3RlZCAtIExTIGJpdCBpcwotICAgemVyby4KLQotICAgTVNFWFRSQUNURUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IFNhbWUgYXMgZXh0cmFjdGVkIC0gTVMgYml0IGlzCi0gICB6ZXJvLgotCi0gICBTSFVGRkxFRCoqKFZBTFVFLCBPTEQsIE5FVyk6IE1hc2sgdGhlbiBtb3ZlIGEgc2luZ2xlIGJpdCBmcm9tIE9MRAotICAgbmV3IE5FVy4KLQotICAgTU9WRUQqKihWQUxVRSwgT0xEX0ZJUlNULCBPTERfTEFTVCwgTkVXX0ZJUlNULCBORVdfTEFTVCk6IE1vdmVzCi0gICB0aGluZ3MgYXJvdW5kIHNvIHRoYXQgYml0cyBPTERfRklSU1QuLk9MRF9MQVNUIGFyZSBtYXNrZWQgdGhlbgotICAgbW92ZWQgdG8gTkVXX0ZJUlNULi5ORVdfTEFTVC4KLQotICAgSU5TRVJURUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IFRha2VzIFZBTFVFIGFuZCBgaW5zZXJ0cycgdGhlIChMQVNUCi0gICAtIEZJUlNUICsgMSkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbnRvIGJpdCBwb3NpdGlvbnMgWyBGSVJTVAotICAgLi4gTEFTVCBdLiAgVGhpcyBpcyBhbG1vc3QgdGhlIGNvbXBsZW1lbnQgdG8gRVhUUkFDVEVELgotCi0gICBJRUFfTUFTS0VEKFNIT1VMRF9NQVNLLCBBRERSKTogQ29udmVydCB0aGUgYWRkcmVzcyB0byB0aGUgdGFyZ2V0cwotICAgbmF0dXJhbCBzaXplLiAgSWYgaW4gMzJiaXQgbW9kZSwgZGlzY2FyZCB0aGUgaGlnaCAzMmJpdHMuCi0KLSAgIEVYVEVORCooVkFMVUUpOiBDb252ZXJ0IHRoZSBgKicgYml0IHZhbHVlIHRvIHRoZSB0YXJnZXRzIG5hdHVyYWwKLSAgIHdvcmQgc2l6ZS4gIFNpZ24gZXh0ZW5kIHRoZSB2YWx1ZSBpZiBuZWVkZWQuCi0KLSAgIEFMSUdOXyooVkFMVUUpOiBSb3VuZCB0aGUgdmFsdWUgdXB3YXJkcyBzbyB0aGF0IGl0IGlzIGFsaWduZWQgdG8gYQotICAgYF8qJyBieXRlIGJvdW5kYXJ5LgotCi0gICBGTE9PUl8qKFZBTFVFKTogVHJ1bmNhdGUgdGhlIHZhbHVlIHNvIHRoYXQgaXQgaXMgYWxpZ25lZCB0byBhIGBfKicKLSAgIGJ5dGUgYm91bmRhcnkuCi0KLSAgIFJPVCooVkFMVUUsIE5SX0JJVFMpOiBSZXR1cm4gdGhlIGAqJyBiaXQgVkFMVUUgcm90YXRlZCBieSBOUl9CSVRTCi0gICByaWdodCAocG9zaXRpdmUpIG9yIGxlZnQgKG5lZ2F0aXZlKS4KLQotICAgUk9UTCooVkFMVUUsIE5SX0JJVFMpOiBSZXR1cm4gdGhlIGAqJyBiaXQgdmFsdWUgcm90YXRlZCBieSBOUl9CSVRTCi0gICBsZWZ0LiAgMCA8PSBOUl9CSVRTIDw9IGAqJy4KLQotICAgUk9UUiooVkFMVUUsIE5SX0JJVFMpOiBSZXR1cm4gdGhlIGAqJyBiaXQgdmFsdWUgcm90YXRlZCBieSBOUl9CSVRTCi0gICByaWdodC4gIDAgPD0gTlJfQklUUyA8PSBOLgotCi0gICBTRVhUKihWQUxVRSwgU0lHTl9CSVQpOiBUcmVhdCBTSUdOX0JJVCBhcyBWQUxVRXMgc2lnbiwgZXh0ZW5kIGl0IHRpCi0gICBgKicgYml0cy4KLQotICAgTm90ZTogT25seSB0aGUgQklUKiBhbmQgTUFTSyogbWFjcm9zIHJldHVybiBhIGNvbnN0YW50IHRoYXQgY2FuIGJlCi0gICB1c2VkIGluIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KLQotICAgKi8KLQotCi0vKiBjb21wdXRlIHRoZSBudW1iZXIgb2YgYml0cyBiZXR3ZWVuIFNUQVJUIGFuZCBTVE9QICovCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKLSNkZWZpbmUgX01BS0VfV0lEVEgoU1RBUlQsIFNUT1ApIChTVE9QIC0gU1RBUlQgKyAxKQotI2Vsc2UKLSNkZWZpbmUgX01BS0VfV0lEVEgoU1RBUlQsIFNUT1ApIChTVEFSVCAtIFNUT1AgKyAxKQotI2VuZGlmCi0KLQotCi0vKiBjb21wdXRlIHRoZSBudW1iZXIgc2hpZnRzIHJlcXVpcmVkIHRvIG1vdmUgYSBiaXQgYmV0d2VlbiBMU0IgKE1TQikKLSAgIGFuZCBQT1MgKi8KLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQotI2RlZmluZSBfTFNCX1NISUZUKFdJRFRILCBQT1MpIChXSURUSCAtIDEgLSBQT1MpCi0jZWxzZQotI2RlZmluZSBfTFNCX1NISUZUKFdJRFRILCBQT1MpIChQT1MpCi0jZW5kaWYKLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQotI2RlZmluZSBfTVNCX1NISUZUKFdJRFRILCBQT1MpIChQT1MpCi0jZWxzZQotI2RlZmluZSBfTVNCX1NISUZUKFdJRFRILCBQT1MpIChXSURUSCAtIDEgLSBQT1MpCi0jZW5kaWYKLQotCi0vKiBjb21wdXRlIHRoZSBhYnNvbHV0ZSBiaXQgcG9zaXRpb24gZ2l2ZW4gdGhlIE9GRlNFVCBmcm9tIHRoZSBNU0IoTFNCKQotICAgTkI6IF9NQUtFX3h4eF9QT1MgKFdJRFRILCBfTUFLRV94eHhfU0hJRlQgKFdJRFRILCBQT1MpKSA9PSBQT1MgKi8KLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQotI2RlZmluZSBfTVNCX1BPUyhXSURUSCwgU0hJRlQpIChTSElGVCkKLSNlbHNlCi0jZGVmaW5lIF9NU0JfUE9TKFdJRFRILCBTSElGVCkgKFdJRFRIIC0gMSAtIFNISUZUKQotI2VuZGlmCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKLSNkZWZpbmUgX0xTQl9QT1MoV0lEVEgsIFNISUZUKSAoV0lEVEggLSAxIC0gU0hJRlQpCi0jZWxzZQotI2RlZmluZSBfTFNCX1BPUyhXSURUSCwgU0hJRlQpIChTSElGVCkKLSNlbmRpZgotCi0KLS8qIGNvbnZlcnQgYSA2NCBiaXQgcG9zaXRpb24gaW50byBhIGNvcnJlc3BvbmRpbmcgMzJiaXQgcG9zaXRpb24uIE1TQgotICAgcG9zIGhhbmRsZXMgdGhlIHBvc2liaWxpdHkgdGhhdCB0aGUgYml0IGxpZXMgYmV5b25kIHRoZSAzMmJpdAotICAgYm91bmRhcnkgKi8KLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQotI2RlZmluZSBfTVNCXzMyKFNUQVJULCBTVE9QKSAoU1RBUlQgPD0gU1RPUCBcCi0JCQkgICAgICA/IChTVEFSVCA8IDMyID8gMCA6IFNUQVJUIC0gMzIpIFwKLQkJCSAgICAgIDogKFNUT1AgPCAzMiA/IDAgOiBTVE9QIC0gMzIpKQotI2Vsc2UKLSNkZWZpbmUgX01TQl8zMihTVEFSVCwgU1RPUCkgKFNUQVJUID49IFNUT1AgXAotCQkJICAgICAgPyAoU1RBUlQgPj0gMzIgPyAzMSA6IFNUQVJUKSBcCi0JCQkgICAgICA6IChTVE9QID49IDMyID8gMzEgOiBTVE9QKSkKLSNlbmRpZgotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIF9MU0JfMzIoU1RBUlQsIFNUT1ApIChTVEFSVCA8PSBTVE9QIFwKLQkJCSAgICAgID8gKFNUT1AgPCAzMiA/IDAgOiBTVE9QIC0gMzIpIFwKLQkJCSAgICAgIDogKFNUQVJUIDwgMzIgPyAwIDogU1RBUlQgLSAzMikpCi0jZWxzZQotI2RlZmluZSBfTFNCXzMyKFNUQVJULCBTVE9QKSAoU1RBUlQgPj0gU1RPUCBcCi0JCQkgICAgICA/IChTVE9QID49IDMyID8gMzEgOiBTVE9QKSBcCi0JCQkgICAgICA6IChTVEFSVCA+PSAzMiA/IDMxIDogU1RBUlQpKQotI2VuZGlmCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKLSNkZWZpbmUgX01TQihTVEFSVCwgU1RPUCkgKFNUQVJUIDw9IFNUT1AgPyBTVEFSVCA6IFNUT1ApCi0jZWxzZQotI2RlZmluZSBfTVNCKFNUQVJULCBTVE9QKSAoU1RBUlQgPj0gU1RPUCA/IFNUQVJUIDogU1RPUCkKLSNlbmRpZgotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIF9MU0IoU1RBUlQsIFNUT1ApIChTVEFSVCA8PSBTVE9QID8gU1RPUCA6IFNUQVJUKQotI2Vsc2UKLSNkZWZpbmUgX0xTQihTVEFSVCwgU1RPUCkgKFNUQVJUID49IFNUT1AgPyBTVE9QIDogU1RBUlQpCi0jZW5kaWYKLQotCi0vKiBMUy9NUyBCaXQgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIExTQklUOChQT1MpICAoKHVuc2lnbmVkOCkgMSA8PCAoUE9TKSkKLSNkZWZpbmUgTFNCSVQxNihQT1MpICgodW5zaWduZWQxNikxIDw8IChQT1MpKQotI2RlZmluZSBMU0JJVDMyKFBPUykgKCh1bnNpZ25lZDMyKTEgPDwgKFBPUykpCi0jZGVmaW5lIExTQklUNjQoUE9TKSAoKHVuc2lnbmVkNjQpMSA8PCAoUE9TKSkKLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZGVmaW5lIExTQklUKFBPUykgTFNCSVQ2NCAoUE9TKQotI2Vsc2UKLSNkZWZpbmUgTFNCSVQoUE9TKSAoKHVuc2lnbmVkMzIpKChQT1MpID49IDMyIFwKLQkJICAgICAgICAgICAgICAgICA/IDAgXAotCQkJICAgICAgICAgOiAoMSA8PCAoKFBPUykgPj0gMzIgPyAwIDogKFBPUykpKSkpCi0jZW5kaWYKLQotCi0jZGVmaW5lIE1TQklUOChQT1MpICAoKHVuc2lnbmVkOCkgMSA8PCAoIDggLSAxIC0gKFBPUykpKQotI2RlZmluZSBNU0JJVDE2KFBPUykgKCh1bnNpZ25lZDE2KTEgPDwgKDE2IC0gMSAtIChQT1MpKSkKLSNkZWZpbmUgTVNCSVQzMihQT1MpICgodW5zaWduZWQzMikxIDw8ICgzMiAtIDEgLSAoUE9TKSkpCi0jZGVmaW5lIE1TQklUNjQoUE9TKSAoKHVuc2lnbmVkNjQpMSA8PCAoNjQgLSAxIC0gKFBPUykpKQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgTVNCSVQoUE9TKSBNU0JJVDY0IChQT1MpCi0jZWxzZQotI2RlZmluZSBNU0JJVChQT1MpICgodW5zaWduZWQzMikoKFBPUykgPCAzMiBcCi0JCSAgICAgICAgICAgICAgICAgPyAwIFwKLQkJICAgICAgICAgICAgICAgICA6ICgxIDw8ICgoUE9TKSA8IDMyID8gMCA6ICg2NCAtIDEpIC0gKFBPUykpKSkpCi0jZW5kaWYKLQotCi0vKiBCaXQgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIEJJVDQoUE9TKSAgKDEgPDwgX0xTQl9TSElGVCAoNCwgKFBPUykpKQotI2RlZmluZSBCSVQ1KFBPUykgICgxIDw8IF9MU0JfU0hJRlQgKDUsIChQT1MpKSkKLSNkZWZpbmUgQklUMTAoUE9TKSAoMSA8PCBfTFNCX1NISUZUICgxMCwgKFBPUykpKQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIEJJVDggIE1TQklUOAotI2RlZmluZSBCSVQxNiBNU0JJVDE2Ci0jZGVmaW5lIEJJVDMyIE1TQklUMzIKLSNkZWZpbmUgQklUNjQgTVNCSVQ2NAotI2RlZmluZSBCSVQgICBNU0JJVAotI2Vsc2UKLSNkZWZpbmUgQklUOCAgTFNCSVQ4Ci0jZGVmaW5lIEJJVDE2IExTQklUMTYKLSNkZWZpbmUgQklUMzIgTFNCSVQzMgotI2RlZmluZSBCSVQ2NCBMU0JJVDY0Ci0jZGVmaW5lIEJJVCAgIExTQklUCi0jZW5kaWYKLQotCi0KLS8qIG11bHRpIGJpdCBtYXNrICovCi0KLS8qIDExMTExMSAtPiBtbWxsMTEgLT4gbW0xMWxsICovCi0jZGVmaW5lIF9NQVNLbihXSURUSCwgU1RBUlQsIFNUT1ApICgoKHVuc2lnbmVkIyNXSURUSCkoLTEpIFwKLQkJCQkgICAgID4+IChfTVNCX1NISUZUIChXSURUSCwgU1RBUlQpIFwKLQkJCQkJICsgX0xTQl9TSElGVCAoV0lEVEgsIFNUT1ApKSkgXAotCQkJCSAgICA8PCBfTFNCX1NISUZUIChXSURUSCwgU1RPUCkpCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKLSNkZWZpbmUgX1BPU19MRShTVEFSVCwgU1RPUCkgKFNUQVJUIDw9IFNUT1ApCi0jZWxzZQotI2RlZmluZSBfUE9TX0xFKFNUQVJULCBTVE9QKSAoU1RPUCA8PSBTVEFSVCkKLSNlbmRpZgotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgTUFTSyhTVEFSVCwgU1RPUCkgXAotICAgICAoX1BPU19MRSAoKFNUQVJUKSwgKFNUT1ApKSBcCi0gICAgICA/IF9NQVNLbig2NCwgXAotCSAgICAgICBfTVNCICgoU1RBUlQpLCAoU1RPUCkpLCBcCi0JICAgICAgIF9MU0IgKChTVEFSVCksIChTVE9QKSkgKSBcCi0gICAgICA6IChfTUFTS24oNjQsIF9NU0JfUE9TICg2NCwgMCksIChTVE9QKSkgXAotCSB8IF9NQVNLbig2NCwgKFNUQVJUKSwgX0xTQl9QT1MgKDY0LCAwKSkpKQotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSNkZWZpbmUgTUFTSyhTVEFSVCwgU1RPUCkgXAotICAgICAoX1BPU19MRSAoKFNUQVJUKSwgKFNUT1ApKSBcCi0gICAgICA/IChfUE9TX0xFICgoU1RPUCksIF9NU0JfUE9TICg2NCwgMzEpKSBcCi0JID8gMCBcCi0JIDogX01BU0tuICgzMiwgXAotCQkgICBfTVNCXzMyICgoU1RBUlQpLCAoU1RPUCkpLCBcCi0JCSAgIF9MU0JfMzIgKChTVEFSVCksIChTVE9QKSkpKSBcCi0gICAgICA6IChfTUFTS24gKDMyLCBcCi0JCSBfTFNCXzMyICgoU1RBUlQpLCAoU1RPUCkpLCBcCi0JCSBfTFNCX1BPUyAoMzIsIDApKSBcCi0JIHwgKF9QT1NfTEUgKChTVE9QKSwgX01TQl9QT1MgKDY0LCAzMSkpIFwKLQkgICAgPyAwIFwKLQkgICAgOiBfTUFTS24gKDMyLCBcCi0JCSAgICAgIF9NU0JfUE9TICgzMiwgMCksIFwKLQkJICAgICAgX01TQl8zMiAoKFNUQVJUKSwgKFNUT1ApKSkpKSkKLSNlbmRpZgotI2lmICFkZWZpbmVkIChNQVNLKQotI2Vycm9yICJNQVNLIG5ldmVyIHVuZGVmaW5lZCIKLSNlbmRpZgotCi0KLS8qIE11bHRpLWJpdCBtYXNrIG9uIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgKi8KLQotI2RlZmluZSBfTFNNQVNLbihXSURUSCwgRklSU1QsIExBU1QpIF9NQVNLbiAoV0lEVEgsIFwKLQkJCQkJICAgICBfTFNCX1BPUyAoV0lEVEgsIEZJUlNUKSwgXAotCQkJCQkgICAgIF9MU0JfUE9TIChXSURUSCwgTEFTVCkpCi0KLSNkZWZpbmUgTFNNQVNLOChGSVJTVCwgTEFTVCkgICBfTFNNQVNLbiAoIDgsIChGSVJTVCksIChMQVNUKSkKLSNkZWZpbmUgTFNNQVNLMTYoRklSU1QsIExBU1QpICBfTFNNQVNLbiAoMTYsIChGSVJTVCksIChMQVNUKSkKLSNkZWZpbmUgTFNNQVNLMzIoRklSU1QsIExBU1QpICBfTFNNQVNLbiAoMzIsIChGSVJTVCksIChMQVNUKSkKLSNkZWZpbmUgTFNNQVNLNjQoRklSU1QsIExBU1QpICBfTFNNQVNLbiAoNjQsIChGSVJTVCksIChMQVNUKSkKLQotI2RlZmluZSBMU01BU0soRklSU1QsIExBU1QpIChNQVNLIChfTFNCX1BPUyAoNjQsIEZJUlNUKSwgX0xTQl9QT1MgKDY0LCBMQVNUKSkpCi0KLQotLyogTXVsdGktYml0IG1hc2sgb24gbW9zdCBzaWduaWZpY2FudCBiaXRzICovCi0KLSNkZWZpbmUgX01TTUFTS24oV0lEVEgsIEZJUlNULCBMQVNUKSBfTUFTS24gKFdJRFRILCBcCi0JCQkJCSAgICAgX01TQl9QT1MgKFdJRFRILCBGSVJTVCksIFwKLQkJCQkJICAgICBfTVNCX1BPUyAoV0lEVEgsIExBU1QpKQotCi0jZGVmaW5lIE1TTUFTSzgoRklSU1QsIExBU1QpICBfTVNNQVNLbiAoIDgsIChGSVJTVCksIChMQVNUKSkKLSNkZWZpbmUgTVNNQVNLMTYoRklSU1QsIExBU1QpIF9NU01BU0tuICgxNiwgKEZJUlNUKSwgKExBU1QpKQotI2RlZmluZSBNU01BU0szMihGSVJTVCwgTEFTVCkgX01TTUFTS24gKDMyLCAoRklSU1QpLCAoTEFTVCkpCi0jZGVmaW5lIE1TTUFTSzY0KEZJUlNULCBMQVNUKSBfTVNNQVNLbiAoNjQsIChGSVJTVCksIChMQVNUKSkKLQotI2RlZmluZSBNU01BU0soRklSU1QsIExBU1QpIChNQVNLIChfTVNCX1BPUyAoNjQsIEZJUlNUKSwgX01TQl9QT1MgKDY0LCBMQVNUKSkpCi0KLQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIE1BU0s4ICBNU01BU0s4Ci0jZGVmaW5lIE1BU0sxNiBNU01BU0sxNgotI2RlZmluZSBNQVNLMzIgTVNNQVNLMzIKLSNkZWZpbmUgTUFTSzY0IE1TTUFTSzY0Ci0jZWxzZQotI2RlZmluZSBNQVNLOCAgTFNNQVNLOAotI2RlZmluZSBNQVNLMTYgTFNNQVNLMTYKLSNkZWZpbmUgTUFTSzMyIExTTUFTSzMyCi0jZGVmaW5lIE1BU0s2NCBMU01BU0s2NAotI2VuZGlmCi0KLQotCi0vKiBtYXNrIHRoZSByZXF1aXJlZCBiaXRzLCBsZWF2aW5nIHRoZW0gaW4gcGxhY2UgKi8KLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIExTTUFTS0VEOCAgKHVuc2lnbmVkOCAgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTFNNQVNLRUQxNiAodW5zaWduZWQxNiB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBMU01BU0tFRDMyICh1bnNpZ25lZDMyIHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIExTTUFTS0VENjQgKHVuc2lnbmVkNjQgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7Ci0KLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBMU01BU0tFRCAodW5zaWduZWRfd29yZCB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIE1TTUFTS0VEOCAgKHVuc2lnbmVkOCAgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTVNNQVNLRUQxNiAodW5zaWduZWQxNiB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBNU01BU0tFRDMyICh1bnNpZ25lZDMyIHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIE1TTUFTS0VENjQgKHVuc2lnbmVkNjQgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7Ci0KLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBNU01BU0tFRCAodW5zaWduZWRfd29yZCB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQotI2RlZmluZSBNQVNLRUQ4ICBNU01BU0tFRDgKLSNkZWZpbmUgTUFTS0VEMTYgTVNNQVNLRUQxNgotI2RlZmluZSBNQVNLRUQzMiBNU01BU0tFRDMyCi0jZGVmaW5lIE1BU0tFRDY0IE1TTUFTS0VENjQKLSNkZWZpbmUgTUFTS0VEICAgTVNNQVNLRUQKLSNlbHNlCi0jZGVmaW5lIE1BU0tFRDggIExTTUFTS0VEOAotI2RlZmluZSBNQVNLRUQxNiBMU01BU0tFRDE2Ci0jZGVmaW5lIE1BU0tFRDMyIExTTUFTS0VEMzIKLSNkZWZpbmUgTUFTS0VENjQgTFNNQVNLRUQ2NAotI2RlZmluZSBNQVNLRUQgTFNNQVNLRUQKLSNlbmRpZgotCi0KLQotLyogZXh0cmFjdCB0aGUgcmVxdWlyZWQgYml0cyBhbGlnbmluZyB0aGVtIHdpdGggdGhlIGxzYiAqLwotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTFNFWFRSQUNURUQ4ICAodW5zaWduZWQ4ICB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIExTRVhUUkFDVEVEMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBMU0VYVFJBQ1RFRDMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTFNFWFRSQUNURUQ2NCAodW5zaWduZWQ2NCB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOwotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTFNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIE1TRVhUUkFDVEVEOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBNU0VYVFJBQ1RFRDE2ICh1bnNpZ25lZDE2IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgTVNFWFRSQUNURUQzMiAodW5zaWduZWQzMiB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIE1TRVhUUkFDVEVENjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkX3dvcmQpIE1TRVhUUkFDVEVEICh1bnNpZ25lZF93b3JkIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKLSNkZWZpbmUgRVhUUkFDVEVEOCAgTVNFWFRSQUNURUQ4Ci0jZGVmaW5lIEVYVFJBQ1RFRDE2IE1TRVhUUkFDVEVEMTYKLSNkZWZpbmUgRVhUUkFDVEVEMzIgTVNFWFRSQUNURUQzMgotI2RlZmluZSBFWFRSQUNURUQ2NCBNU0VYVFJBQ1RFRDY0Ci0jZGVmaW5lIEVYVFJBQ1RFRCAgIE1TRVhUUkFDVEVECi0jZWxzZQotI2RlZmluZSBFWFRSQUNURUQ4ICBMU0VYVFJBQ1RFRDgKLSNkZWZpbmUgRVhUUkFDVEVEMTYgTFNFWFRSQUNURUQxNgotI2RlZmluZSBFWFRSQUNURUQzMiBMU0VYVFJBQ1RFRDMyCi0jZGVmaW5lIEVYVFJBQ1RFRDY0IExTRVhUUkFDVEVENjQKLSNkZWZpbmUgRVhUUkFDVEVEICAgTFNFWFRSQUNURUQKLSNlbmRpZgotCi0KLQotLyogbW92ZSBhIHNpbmdsZSBiaXQgYXJvdW5kICovCi0vKiBOQjogdGhlIHdpZXJkbmVzcyAoTj5PP04tTzowKSBpcyB0byBzdG9wIGEgd2FybmluZyBmcm9tIEdDQyAqLwotI2RlZmluZSBfU0hVRkZMRURuKE4sIFdPUkQsIE9MRCwgTkVXKSBcCi0oKE9MRCkgPCAoTkVXKSBcCi0gPyAoKCh1bnNpZ25lZCMjTikoV09SRCkgXAotICAgICA+PiAoKChORVcpID4gKE9MRCkpID8gKChORVcpIC0gKE9MRCkpIDogMCkpIFwKLSAgICAmIE1BU0szMigoTkVXKSwgKE5FVykpKSBcCi0gOiAoKCh1bnNpZ25lZCMjTikoV09SRCkgXAotICAgICA8PCAoKChPTEQpID4gKE5FVykpID8gKChPTEQpIC0gKE5FVykpIDogMCkpIFwKLSAgICAmIE1BU0szMigoTkVXKSwgKE5FVykpKSkKLQotI2RlZmluZSBTSFVGRkxFRDMyKFdPUkQsIE9MRCwgTkVXKSBfU0hVRkZMRURuICgzMiwgV09SRCwgT0xELCBORVcpCi0jZGVmaW5lIFNIVUZGTEVENjQoV09SRCwgT0xELCBORVcpIF9TSFVGRkxFRG4gKDY0LCBXT1JELCBPTEQsIE5FVykKLQotI2RlZmluZSBTSFVGRkxFRChXT1JELCBPTEQsIE5FVykgX1NIVUZGTEVEbiAoX3dvcmQsIFdPUkQsIE9MRCwgTkVXKQotCi0KLS8qIEluc2VydCBhIGdyb3VwIG9mIGJpdHMgaW50byBhIGJpdCBwb3NpdGlvbiAqLwotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTFNJTlNFUlRFRDggICh1bnNpZ25lZDggIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTFNJTlNFUlRFRDE2ICh1bnNpZ25lZDE2IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgTFNJTlNFUlRFRDMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTFNJTlNFUlRFRDY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTFNJTlNFUlRFRCAodW5zaWduZWRfd29yZCB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOwotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTVNJTlNFUlRFRDggICh1bnNpZ25lZDggIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTVNJTlNFUlRFRDE2ICh1bnNpZ25lZDE2IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgTVNJTlNFUlRFRDMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTVNJTlNFUlRFRDY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTVNJTlNFUlRFRCAodW5zaWduZWRfd29yZCB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOwotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIElOU0VSVEVEOCAgTVNJTlNFUlRFRDgKLSNkZWZpbmUgSU5TRVJURUQxNiBNU0lOU0VSVEVEMTYKLSNkZWZpbmUgSU5TRVJURUQzMiBNU0lOU0VSVEVEMzIKLSNkZWZpbmUgSU5TRVJURUQ2NCBNU0lOU0VSVEVENjQKLSNkZWZpbmUgSU5TRVJURUQgICBNU0lOU0VSVEVECi0jZWxzZQotI2RlZmluZSBJTlNFUlRFRDggIExTSU5TRVJURUQ4Ci0jZGVmaW5lIElOU0VSVEVEMTYgTFNJTlNFUlRFRDE2Ci0jZGVmaW5lIElOU0VSVEVEMzIgTFNJTlNFUlRFRDMyCi0jZGVmaW5lIElOU0VSVEVENjQgTFNJTlNFUlRFRDY0Ci0jZGVmaW5lIElOU0VSVEVEICAgTFNJTlNFUlRFRAotI2VuZGlmCi0KLQotCi0vKiBNT1ZFIGJpdHMgZnJvbSBvbmUgbG9jIHRvIGFub3RoZXIgKGNvbWJpbmF0aW9uIG9mIGV4dHJhY3QvaW5zZXJ0KSAqLwotCi0jZGVmaW5lIE1PVkVEOChWQUwsT0gsT0wsTkgsTkwpICBJTlNFUlRFRDggKEVYVFJBQ1RFRDggKChWQUwpLCBPSCwgT0wpLCBOSCwgTkwpCi0jZGVmaW5lIE1PVkVEMTYoVkFMLE9ILE9MLE5ILE5MKSBJTlNFUlRFRDE2KEVYVFJBQ1RFRDE2KChWQUwpLCBPSCwgT0wpLCBOSCwgTkwpCi0jZGVmaW5lIE1PVkVEMzIoVkFMLE9ILE9MLE5ILE5MKSBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKChWQUwpLCBPSCwgT0wpLCBOSCwgTkwpCi0jZGVmaW5lIE1PVkVENjQoVkFMLE9ILE9MLE5ILE5MKSBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KChWQUwpLCBPSCwgT0wpLCBOSCwgTkwpCi0jZGVmaW5lIE1PVkVEKFZBTCxPSCxPTCxOSCxOTCkgICBJTlNFUlRFRCAgKEVYVFJBQ1RFRCAgKChWQUwpLCBPSCwgT0wpLCBOSCwgTkwpCi0KLQotCi0vKiBTaWduIGV4dGVuZCB0aGUgcXVhbnRpdHkgdG8gdGhlIHRhcmdldHMgbmF0dXJhbCB3b3JkIHNpemUgKi8KLQotI2RlZmluZSBFWFRFTkQ0KFgpICAoTFNTRVhUICgoWCksIDMpKQotI2RlZmluZSBFWFRFTkQ1KFgpICAoTFNTRVhUICgoWCksIDQpKQotI2RlZmluZSBFWFRFTkQ4KFgpICAoKHNpZ25lZF93b3JkKShzaWduZWQ4KShYKSkKLSNkZWZpbmUgRVhURU5EMTEoWCkgIChMU1NFWFQgKChYKSwgMTApKQotI2RlZmluZSBFWFRFTkQxNShYKSAgKExTU0VYVCAoKFgpLCAxNCkpCi0jZGVmaW5lIEVYVEVORDE2KFgpICgoc2lnbmVkX3dvcmQpKHNpZ25lZDE2KShYKSkKLSNkZWZpbmUgRVhURU5EMjQoWCkgIChMU1NFWFQgKChYKSwgMjMpKQotI2RlZmluZSBFWFRFTkQzMihYKSAoKHNpZ25lZF93b3JkKShzaWduZWQzMikoWCkpCi0jZGVmaW5lIEVYVEVORDY0KFgpICgoc2lnbmVkX3dvcmQpKHNpZ25lZDY0KShYKSkKLQotLyogZGVwZW5kaW5nIG9uIE1PREUgcmV0dXJuIGEgNjRiaXQgb3IgMzJiaXQgKHNpZ24gZXh0ZW5kZWQpIHZhbHVlICovCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgRVhURU5ERUQoWCkgICAgICgoc2lnbmVkNjQpKHNpZ25lZDMyKShYKSkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEVYVEVOREVEKFgpICAgICAoWCkKLSNlbmRpZgotCi0KLS8qIG1lbW9yeSBhbGlnbm1lbnQgbWFjcm8ncyAqLwotI2RlZmluZSBfQUxJR05hKEEsWCkgICgoKFgpICsgKChBKSAtIDEpKSAmIH4oKEEpIC0gMSkpCi0jZGVmaW5lIF9GTE9PUmEoQSxYKSAgKChYKSAmIH4oKEEpIC0gMSkpCi0KLSNkZWZpbmUgQUxJR05fOChYKQlfQUxJR05hICg4LCBYKQotI2RlZmluZSBBTElHTl8xNihYKQlfQUxJR05hICgxNiwgWCkKLQotI2RlZmluZSBBTElHTl9QQUdFKFgpCV9BTElHTmEgKDB4MTAwMCwgWCkKLSNkZWZpbmUgRkxPT1JfUEFHRShYKSAgICgoWCkgJiB+KDB4MTAwMCAtIDEpKQotCi0KLS8qIGJpdCBibGl0aW5nIG1hY3JvJ3MgKi8KLSNkZWZpbmUgQkxJVDMyKFYsIFBPUywgQklUKSBcCi1kbyB7IFwKLSAgaWYgKEJJVCkgXAotICAgIFYgfD0gQklUMzIgKFBPUyk7IFwKLSAgZWxzZSBcCi0gICAgViAmPSB+QklUMzIgKFBPUyk7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIE1CTElUMzIoViwgTE8sIEhJLCBWQUwpIFwKLWRvIHsgXAotICAoVikgPSAoKChWKSAmIH5NQVNLMzIgKChMTyksIChISSkpKSBcCi0JIHwgSU5TRVJURUQzMiAoVkFMLCBMTywgSEkpKTsgXAotfSB3aGlsZSAoMCkKLQotCi0KLS8qIHNvbWUgcm90YXRlIGZ1bmN0aW9ucy4gIFRoZSBnZW5lcmljIG1hY3JvJ3MgUk9ULCBST1RMLCBST1RSIGFyZQotICAgaW50ZW50aW9uYWxseSBvbWl0ZWQuICovCi0KLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIFJPVDggICh1bnNpZ25lZDggIHZhbCwgaW50IHNoaWZ0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBST1QxNiAodW5zaWduZWQxNiB2YWwsIGludCBzaGlmdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgUk9UMzIgKHVuc2lnbmVkMzIgdmFsLCBpbnQgc2hpZnQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIFJPVDY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHNoaWZ0KTsKLQotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgUk9UTDggICh1bnNpZ25lZDggIHZhbCwgaW50IHNoaWZ0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBST1RMMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc2hpZnQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIFJPVEwzMiAodW5zaWduZWQzMiB2YWwsIGludCBzaGlmdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgUk9UTDY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHNoaWZ0KTsKLQotCi1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgUk9UUjggICh1bnNpZ25lZDggIHZhbCwgaW50IHNoaWZ0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBST1RSMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc2hpZnQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIFJPVFIzMiAodW5zaWduZWQzMiB2YWwsIGludCBzaGlmdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgUk9UUjY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHNoaWZ0KTsKLQotCi0KLS8qIFNpZ24gZXh0ZW5zaW9uIG9wZXJhdGlvbnMgKi8KLQotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIExTU0VYVDggIChzaWduZWQ4ICB2YWwsIGludCBzaWduX2JpdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTFNTRVhUMTYgKHNpZ25lZDE2IHZhbCwgaW50IHNpZ25fYml0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBMU1NFWFQzMiAoc2lnbmVkMzIgdmFsLCBpbnQgc2lnbl9iaXQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIExTU0VYVDY0IChzaWduZWQ2NCB2YWwsIGludCBzaWduX2JpdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTFNTRVhUIChzaWduZWRfd29yZCB2YWwsIGludCBzaWduX2JpdCk7Ci0KLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBNU1NFWFQ4ICAoc2lnbmVkOCAgdmFsLCBpbnQgc2lnbl9iaXQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIE1TU0VYVDE2IChzaWduZWQxNiB2YWwsIGludCBzaWduX2JpdCk7Ci1JTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgTVNTRVhUMzIgKHNpZ25lZDMyIHZhbCwgaW50IHNpZ25fYml0KTsKLUlOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBNU1NFWFQ2NCAoc2lnbmVkNjQgdmFsLCBpbnQgc2lnbl9iaXQpOwotSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkX3dvcmQpIE1TU0VYVCAoc2lnbmVkX3dvcmQgdmFsLCBpbnQgc2lnbl9iaXQpOwotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCi0jZGVmaW5lIFNFWFQ4ICBNU1NFWFQ4Ci0jZGVmaW5lIFNFWFQxNiBNU1NFWFQxNgotI2RlZmluZSBTRVhUMzIgTVNTRVhUMzIKLSNkZWZpbmUgU0VYVDY0IE1TU0VYVDY0Ci0jZGVmaW5lIFNFWFQgICBNU1NFWFQKLSNlbHNlCi0jZGVmaW5lIFNFWFQ4ICBMU1NFWFQ4Ci0jZGVmaW5lIFNFWFQxNiBMU1NFWFQxNgotI2RlZmluZSBTRVhUMzIgTFNTRVhUMzIKLSNkZWZpbmUgU0VYVDY0IExTU0VYVDY0Ci0jZGVmaW5lIFNFWFQgICBMU1NFWFQKLSNlbmRpZgotCi0KLQotI2lmIEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0JJVFNfSU5MSU5FKQotI2luY2x1ZGUgInNpbS1iaXRzLmMiCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TSU1fQklUU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYnJlYWsuYyBiL3NpbS9jb21tb24vc2ltLWJyZWFrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODk1NjAuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tYnJlYWsuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBTaW11bGF0b3IgYnJlYWtwb2ludCBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLSNpbmNsdWRlICJzaW0tYnJlYWsuaCIKLQotI2lmbmRlZiBTSU1fQlJFQUtQT0lOVAotI2RlZmluZSBTSU1fQlJFQUtQT0lOVCB7MHgwMH0KLSNkZWZpbmUgU0lNX0JSRUFLUE9JTlRfU0laRSAoMSkKLSNlbmRpZgotCi1zdHJ1Y3QKLXNpbV9icmVha3BvaW50Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqbmV4dDsKLSAgU0lNX0FERFIgYWRkcjsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBicmVha3BvaW50ICovCi0gIGludCBmbGFnczsKLSAgdW5zaWduZWQgY2hhciBsb2NfY29udGVudHNbU0lNX0JSRUFLUE9JTlRfU0laRV07IC8qIENvbnRlbnRzIG9mIGFkZHIgd2hpbGUKLQkJCQkJCSAgICAgIEJQIGlzIGVuYWJsZWQgKi8KLX07Ci0KLSNkZWZpbmUgU0lNX0JSRUFLX0lOU0VSVEVEIDB4MQkvKiBCcmVha3BvaW50IGhhcyBiZWVuIGluc2VydGVkICovCi0jZGVmaW5lIFNJTV9CUkVBS19ESVNBQkxFRCAweDIJLyogQnJlYWtwb2ludCBpcyBkaXNhYmxlZCAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzaW1fYnJlYWtwb2ludCBbXSA9IFNJTV9CUkVBS1BPSU5UOwotCi1zdGF0aWMgdm9pZCBpbnNlcnRfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgICAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicCkpOwotc3RhdGljIHZvaWQgcmVtb3ZlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCi0JCQkJICAgICAgIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnApKTsKLXN0YXRpYyBTSU1fUkMgcmVzdW1lX2hhbmRsZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLXN0YXRpYyBTSU1fUkMgc3VzcGVuZF9oYW5kbGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogRG8gdGhlIGFjdHVhbCB3b3JrIG9mIGluc2VydGluZyBhIGJyZWFrcG9pbnQgaW50byB0aGUgaW5zdHJ1Y3Rpb24KLSAgIHN0cmVhbS4gKi8KLQotc3RhdGljIHZvaWQKLWluc2VydF9icmVha3BvaW50IChzZCwgYnApCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOwotewotICBpZiAoYnAtPmZsYWdzICYgKFNJTV9CUkVBS19JTlNFUlRFRCB8IFNJTV9CUkVBS19ESVNBQkxFRCkpCi0gICAgcmV0dXJuOwotCi0gIHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgZXhlY19tYXAsIGJwLT5sb2NfY29udGVudHMsCi0JCQlicC0+YWRkciwgU0lNX0JSRUFLUE9JTlRfU0laRSk7Ci0gIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoc2QsIE5VTEwsIGV4ZWNfbWFwLCBzaW1fYnJlYWtwb2ludCwKLQkJCSBicC0+YWRkciwgU0lNX0JSRUFLUE9JTlRfU0laRSk7Ci0gIGJwLT5mbGFncyB8PSBTSU1fQlJFQUtfSU5TRVJURUQ7Ci19Ci0KLS8qIERvIHRoZSBhY3R1YWwgd29yayBvZiByZW1vdmluZyBhIGJyZWFrcG9pbnQuICovCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfYnJlYWtwb2ludCAoc2QsIGJwKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKLXsKLSAgaWYgKCEoYnAtPmZsYWdzICYgU0lNX0JSRUFLX0lOU0VSVEVEKSkKLSAgICByZXR1cm47Ci0KLSAgc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChzZCwgTlVMTCwgZXhlY19tYXAsIGJwLT5sb2NfY29udGVudHMsCi0JCQkgYnAtPmFkZHIsIFNJTV9CUkVBS1BPSU5UX1NJWkUpOwotICBicC0+ZmxhZ3MgJj0gflNJTV9CUkVBS19JTlNFUlRFRDsKLX0KLQotLyogQ29tZSBoZXJlIHdoZW4gYSBicmVha3BvaW50IGluc24gaXMgaGl0LiAgSWYgaXQncyByZWFsbHkgYSBicmVha3BvaW50LCB3ZQotICAgaGFsdCB0aGluZ3MsIGFuZCBuZXZlciByZXR1cm4uICBJZiBpdCdzIGEgZmFsc2UgaGl0LCB3ZSByZXR1cm4gdG8gbGV0IHRoZQotICAgY2FsbGVyIGhhbmRsZSB0aGluZ3MuICAqLwotCi12b2lkCi1zaW1faGFuZGxlX2JyZWFrcG9pbnQgKHNkLCBjcHUsIGNpYSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHNpbV9jcHUgKmNwdTsKLSAgICAgc2ltX2NpYSBjaWE7Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7Ci0KLSAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCk7IGJwOyBicCA9IGJwLT5uZXh0KQotICAgIGlmIChicC0+YWRkciA9PSBDSUFfQUREUiAoY2lhKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghYnAgfHwgIShicC0+ZmxhZ3MgJiBTSU1fQlJFQUtfSU5TRVJURUQpKQotICAgIHJldHVybjsKLQotICBzaW1fZW5naW5lX2hhbHQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotfQotCi0vKiBIYW5kbGVyIGZ1bmN0aW9ucyBmb3Igc2ltdWxhdG9yIHJlc3VtZSBhbmQgc3VzcGVuZCBldmVudHMuICovCi0KLXN0YXRpYyBTSU1fUkMKLXJlc3VtZV9oYW5kbGVyIChzZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7Ci0KLSAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCk7IGJwOyBicCA9IGJwLT5uZXh0KQotICAgIGluc2VydF9icmVha3BvaW50IChzZCwgYnApOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXN0YXRpYyBTSU1fUkMKLXN1c3BlbmRfaGFuZGxlciAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOwotCi0gIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKLSAgICByZW1vdmVfYnJlYWtwb2ludCAoc2QsIGJwKTsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0vKiBDYWxsZWQgZnJvbSBzaW11bGF0b3IgbW9kdWxlIGluaXRpYWxpemF0aW9uLiAgKi8KLQotU0lNX1JDCi1zaW1fYnJlYWtfaW5zdGFsbCAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBzaW1fbW9kdWxlX2FkZF9yZXN1bWVfZm4gKHNkLCByZXN1bWVfaGFuZGxlcik7Ci0gIHNpbV9tb2R1bGVfYWRkX3N1c3BlbmRfZm4gKHNkLCBzdXNwZW5kX2hhbmRsZXIpOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIEluc3RhbGwgYSBicmVha3BvaW50LiAgVGhpcyBpcyBhIHVzZXItZnVuY3Rpb24uICBUaGUgYnJlYWtwb2ludCBpc24ndAotICAgYWN0dWFsbHkgaW5zdGFsbGVkIGhlcmUuICBXZSBqdXN0IHJlY29yZCBpdC4gIFJlc3VtZV9oYW5kbGVyIGRvZXMgdGhlCi0gICBhY3R1YWwgd29yay4KLSovCi0KLVNJTV9SQwotc2ltX3NldF9icmVha3BvaW50IChzZCwgYWRkcikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7Ci0KLSAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCk7IGJwOyBicCA9IGJwLT5uZXh0KQotICAgIGlmIChicC0+YWRkciA9PSBhZGRyKQotICAgICAgcmV0dXJuIFNJTV9SQ19EVVBMSUNBVEVfQlJFQUtQT0lOVDsgLyogQWxyZWFkeSB0aGVyZSAqLwotICAgIGVsc2UKLSAgICAgIGJyZWFrOyAvKiBGSVhNRTogd2h5IG5vdCBzY2FuIGFsbCBicCdzPyAqLwotCi0gIGJwID0gWkFMTE9DIChzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQpOwotCi0gIGJwLT5hZGRyID0gYWRkcjsKLSAgYnAtPm5leHQgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOwotICBicC0+ZmxhZ3MgPSAwOwotICBTVEFURV9CUkVBS1BPSU5UUyAoc2QpID0gYnA7Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogRGVsZXRlIGEgYnJlYWtwb2ludC4gIEFsbCBrbm93bGVnZSBvZiB0aGUgYnJlYWtwb2ludCBpcyByZW1vdmVkIGZyb20gdGhlCi0gICBzaW11bGF0b3IuCi0qLwotCi1TSU1fUkMKLXNpbV9jbGVhcl9icmVha3BvaW50IChzZCwgYWRkcikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnAsICpicHByZXY7Ci0KLSAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCksIGJwcHJldiA9IE5VTEw7Ci0gICAgICAgYnA7Ci0gICAgICAgYnBwcmV2ID0gYnAsIGJwID0gYnAtPm5leHQpCi0gICAgaWYgKGJwLT5hZGRyID09IGFkZHIpCi0gICAgICBicmVhazsKLQotICBpZiAoIWJwKQotICAgIHJldHVybiBTSU1fUkNfVU5LTk9XTl9CUkVBS1BPSU5UOwotCi0gIHJlbW92ZV9icmVha3BvaW50IChzZCwgYnApOwotCi0gIGlmIChicHByZXYpCi0gICAgYnBwcmV2LT5uZXh0ID0gYnAtPm5leHQ7Ci0gIGVsc2UKLSAgICBTVEFURV9CUkVBS1BPSU5UUyAoc2QpID0gTlVMTDsKLQotICB6ZnJlZSAoYnApOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX2NsZWFyX2FsbF9icmVha3BvaW50cyAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICB3aGlsZSAoU1RBVEVfQlJFQUtQT0lOVFMgKHNkKSkKLSAgICBzaW1fY2xlYXJfYnJlYWtwb2ludCAoc2QsIFNUQVRFX0JSRUFLUE9JTlRTIChzZCktPmFkZHIpOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX2VuYWJsZV9icmVha3BvaW50IChzZCwgYWRkcikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci17Ci0gIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7Ci0KLSAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCk7IGJwOyBicCA9IGJwLT5uZXh0KQotICAgIGlmIChicC0+YWRkciA9PSBhZGRyKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKCFicCkKLSAgICByZXR1cm4gU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVDsKLQotICBicC0+ZmxhZ3MgJj0gflNJTV9CUkVBS19ESVNBQkxFRDsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1TSU1fUkMKLXNpbV9kaXNhYmxlX2JyZWFrcG9pbnQgKHNkLCBhZGRyKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLXsKLSAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKLQotICBmb3IgKGJwID0gU1RBVEVfQlJFQUtQT0lOVFMgKHNkKTsgYnA7IGJwID0gYnAtPm5leHQpCi0gICAgaWYgKGJwLT5hZGRyID09IGFkZHIpCi0gICAgICBicmVhazsKLQotICBpZiAoIWJwKQotICAgIHJldHVybiBTSU1fUkNfVU5LTk9XTl9CUkVBS1BPSU5UOwotCi0gIGJwLT5mbGFncyB8PSBTSU1fQlJFQUtfRElTQUJMRUQ7Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotU0lNX1JDCi1zaW1fZW5hYmxlX2FsbF9icmVha3BvaW50cyAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOwotCi0gIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKLSAgICBicC0+ZmxhZ3MgJj0gflNJTV9CUkVBS19ESVNBQkxFRDsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1TSU1fUkMKLXNpbV9kaXNhYmxlX2FsbF9icmVha3BvaW50cyAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOwotCi0gIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKLSAgICBicC0+ZmxhZ3MgfD0gU0lNX0JSRUFLX0RJU0FCTEVEOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1icmVhay5oIGIvc2ltL2NvbW1vbi9zaW0tYnJlYWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwMzM4Zi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1icmVhay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogU2ltdWxhdG9yIGJyZWFrcG9pbnQgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmbmRlZiBTSU1fQlJFQUtfSAotI2RlZmluZSBTSU1fQlJFQUtfSAotCi0vKiBDYWxsIHRoaXMgdG8gaW5zdGFsbCB0aGUgcmVzdW1lIGFuZCBzdXNwZW5kIGhhbmRsZXJzIGZvciB0aGUgYnJlYWtwb2ludAotICAgbW9kdWxlLiAgKi8KLQotTU9EVUxFX0lOU1RBTExfRk4gc2ltX2JyZWFrX2luc3RhbGw7Ci0KLS8qIENhbGwgdGhpcyBpbnNpZGUgdGhlIHNpbXVsYXRvciB3aGVuIHdlIGV4ZWN1dGUgdGhlIHBvdGVudGlhbAotICAgYnJlYWtwb2ludCBpbnNuLiAgSWYgdGhlIGJyZWFrcG9pbnQgc3lzdGVtIGtub3dzIGFib3V0IGl0LCB0aGUKLSAgIGJyZWFrcG9pbnQgaXMgaGFuZGxlZCwgYW5kIHRoaXMgcm91dGluZSBuZXZlciByZXR1cm5zLiAgSWYgdGhpcwotICAgaXNuJ3QgcmVhbGx5IGEgYnJlYWtwb2ludCwgdGhlbiBpdCByZXR1cm5zIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8KLSAgIGhhbmRsZSB0aGluZ3MuICAqLwotCi12b2lkIHNpbV9oYW5kbGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBzaW1fY2lhIGNpYSkpOwotCi0jZW5kaWYgLyogU0lNX0JSRUFLX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNvbmZpZy5jIGIvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTE5YWEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LDE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotCi1pbnQgY3VycmVudF9ob3N0X2J5dGVfb3JkZXI7Ci1pbnQgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcjsKLWludCBjdXJyZW50X3N0ZGlvOwotCi1lbnVtIHNpbV9hbGlnbm1lbnRzIGN1cnJlbnRfYWxpZ25tZW50OwotCi0jaWYgZGVmaW5lZCAoV0lUSF9GTE9BVElOR19QT0lOVCkKLWludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OwotI2VuZGlmCi0KLQotCi0vKiBtYXAgYSBieXRlIG9yZGVyIG9udG8gYSB0ZXh0dWFsIHN0cmluZyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1jb25maWdfYnl0ZV9vcmRlcl90b19hIChpbnQgYnl0ZV9vcmRlcikKLXsKLSAgc3dpdGNoIChieXRlX29yZGVyKQotICAgIHsKLSAgICBjYXNlIExJVFRMRV9FTkRJQU46Ci0gICAgICByZXR1cm4gIkxJVFRMRV9FTkRJQU4iOwotICAgIGNhc2UgQklHX0VORElBTjoKLSAgICAgIHJldHVybiAiQklHX0VORElBTiI7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICIwIjsKLSAgICB9Ci0gIHJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotY29uZmlnX3N0ZGlvX3RvX2EgKGludCBzdGRpbykKLXsKLSAgc3dpdGNoIChzdGRpbykKLSAgICB7Ci0gICAgY2FzZSBET05UX1VTRV9TVERJTzoKLSAgICAgIHJldHVybiAiRE9OVF9VU0VfU1RESU8iOwotICAgIGNhc2UgRE9fVVNFX1NURElPOgotICAgICAgcmV0dXJuICJET19VU0VfU1RESU8iOwotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgfQotICByZXR1cm4gIlVOS05PV04iOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWNvbmZpZ19lbnZpcm9ubWVudF90b19hIChlbnVtIHNpbV9lbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLXsKLSAgc3dpdGNoIChlbnZpcm9ubWVudCkKLSAgICB7Ci0gICAgY2FzZSBBTExfRU5WSVJPTk1FTlQ6Ci0gICAgICByZXR1cm4gIkFMTF9FTlZJUk9OTUVOVCI7Ci0gICAgY2FzZSBVU0VSX0VOVklST05NRU5UOgotICAgICAgcmV0dXJuICJVU0VSX0VOVklST05NRU5UIjsKLSAgICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6Ci0gICAgICByZXR1cm4gIlZJUlRVQUxfRU5WSVJPTk1FTlQiOwotICAgIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgotICAgICAgcmV0dXJuICJPUEVSQVRJTkdfRU5WSVJPTk1FTlQiOwotICAgIH0KLSAgcmV0dXJuICJVTktOT1dOIjsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1jb25maWdfYWxpZ25tZW50X3RvX2EgKGVudW0gc2ltX2FsaWdubWVudHMgYWxpZ25tZW50KQotewotICBzd2l0Y2ggKGFsaWdubWVudCkKLSAgICB7Ci0gICAgY2FzZSBNSVhFRF9BTElHTk1FTlQ6Ci0gICAgICByZXR1cm4gIk1JWEVEX0FMSUdOTUVOVCI7Ci0gICAgY2FzZSBOT05TVFJJQ1RfQUxJR05NRU5UOgotICAgICAgcmV0dXJuICJOT05TVFJJQ1RfQUxJR05NRU5UIjsKLSAgICBjYXNlIFNUUklDVF9BTElHTk1FTlQ6Ci0gICAgICByZXR1cm4gIlNUUklDVF9BTElHTk1FTlQiOwotICAgIGNhc2UgRk9SQ0VEX0FMSUdOTUVOVDoKLSAgICAgIHJldHVybiAiRk9SQ0VEX0FMSUdOTUVOVCI7Ci0gICAgfQotICByZXR1cm4gIlVOS05PV04iOwotfQotCi0KLSNpZiBkZWZpbmVkIChXSVRIX0ZMT0FUSU5HX1BPSU5UKQotc3RhdGljIGNvbnN0IGNoYXIgKgotY29uZmlnX2Zsb2F0aW5nX3BvaW50X3RvX2EgKGludCBmbG9hdGluZ19wb2ludCkKLXsKLSAgc3dpdGNoIChmbG9hdGluZ19wb2ludCkKLSAgICB7Ci0gICAgY2FzZSBTT0ZUX0ZMT0FUSU5HX1BPSU5UOgotICAgICAgcmV0dXJuICJTT0ZUX0ZMT0FUSU5HX1BPSU5UIjsKLSAgICBjYXNlIEhBUkRfRkxPQVRJTkdfUE9JTlQ6Ci0gICAgICByZXR1cm4gIkhBUkRfRkxPQVRJTkdfUE9JTlQiOwotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgfQotICByZXR1cm4gIlVOS05PV04iOwotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCwgcHJpb3IgdG8gcGFyc2luZyBhcmd2LiAgKi8KLQotdm9pZAotc2ltX2NvbmZpZ19kZWZhdWx0IChTSU1fREVTQyBzZCkKLXsKLSAgIC8qIFNldCB0aGUgY3VycmVudCBlbnZpcm9ubWVudCB0byBBTExfRU5WSVJPTk1FTlQgdG8gaW5kaWNhdGUgbm9uZSBoYXMgYmVlbgotICAgICAgc2VsZWN0ZWQgeWV0LiAgVGhpcyBpcyBzbyB0aGF0IGFmdGVyIHBhcnNpbmcgYXJndiwgd2Uga25vdyB3aGV0aGVyIHRoZQotICAgICAgZW52aXJvbm1lbnQgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9yIG5vdC4gICovCi0gIFNUQVRFX0VOVklST05NRU5UIChzZCkgPSBBTExfRU5WSVJPTk1FTlQ7Ci19Ci0KLS8qIENvbXBsZXRlIGFuZCB2ZXJpZnkgdGhlIHNpbXVsYXRpb24gZW52aXJvbm1lbnQuICAqLwotCi1TSU1fUkMKLXNpbV9jb25maWcgKFNJTV9ERVNDIHNkKQotewotICBpbnQgcHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXI7Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0KLSAgLyogZXh0cmFjdCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KLSAgaWYgKFNUQVRFX1BST0dfQkZEIChzZCkgPT0gTlVMTCkKLSAgICBwcmVmZXJlZF90YXJnZXRfYnl0ZV9vcmRlciA9IDA7Ci0gIGVsc2UKLSAgICBwcmVmZXJlZF90YXJnZXRfYnl0ZV9vcmRlciA9IChiZmRfbGl0dGxlX2VuZGlhbihTVEFURV9QUk9HX0JGRCAoc2QpKQotCQkJCSAgPyBMSVRUTEVfRU5ESUFOCi0JCQkJICA6IEJJR19FTkRJQU4pOwotCi0gIC8qIHNldCB0aGUgaG9zdCBieXRlIG9yZGVyICovCi0gIGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyID0gMTsKLSAgaWYgKCooY2hhciopKCZjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcikpCi0gICAgY3VycmVudF9ob3N0X2J5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotICBlbHNlCi0gICAgY3VycmVudF9ob3N0X2J5dGVfb3JkZXIgPSBCSUdfRU5ESUFOOwotCi0gIC8qIHZlcmlmeSB0aGUgaG9zdCBieXRlIG9yZGVyICovCi0gIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiAhPSBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcikKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJob3N0ICglcykgYW5kIGNvbmZpZ3VyZWQgKCVzKSBieXRlIG9yZGVyIGluIGNvbmZsaWN0IiwKLQkJICAgICAgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoY3VycmVudF9ob3N0X2J5dGVfb3JkZXIpLAotCQkgICAgICBjb25maWdfYnl0ZV9vcmRlcl90b19hIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUikpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLQotCi0gIC8qIHNldCB0aGUgdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSNpZiAoV0lUSF9UUkVFX1BST1BFUlRJRVMpCi0gIGlmIChjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID09IDApCi0gICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcgotICAgICAgPSAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkgKHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyIpCi0JID8gTElUVExFX0VORElBTgotCSA6IEJJR19FTkRJQU4pOwotI2VuZGlmCi0gIGlmIChjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID09IDAKLSAgICAgICYmIHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyICE9IDApCi0gICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyOwotICBpZiAoY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9PSAwKQotICAgIGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPSBXSVRIX1RBUkdFVF9CWVRFX09SREVSOwotICBpZiAoY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9PSAwKQotICAgIGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPSBXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI7Ci0KLSAgLyogdmVyaWZ5IHRoZSB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSAwKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCBieXRlIG9yZGVyIHVuc3BlY2lmaWVkXG4iKTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSICE9IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpCi0gICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVGFyZ2V0ICglcykgYW5kIGNvbmZpZ3VyZWQgKCVzKSBieXRlIG9yZGVyIGluIGNvbmZsaWN0XG4iLAotCQkgIGNvbmZpZ19ieXRlX29yZGVyX3RvX2EgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpLAotCQkgIGNvbmZpZ19ieXRlX29yZGVyX3RvX2EgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIpKTsKLSAgaWYgKHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyICE9IDAKLSAgICAgICYmIENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgIT0gcHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXIpCi0gICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVGFyZ2V0ICglcykgYW5kIHNwZWNpZmllZCAoJXMpIGJ5dGUgb3JkZXIgaW4gY29uZmxpY3RcbiIsCi0JCSAgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiksCi0JCSAgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAocHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXIpKTsKLQotCi0gIC8qIHNldCB0aGUgc3RkaW8gKi8KLSAgaWYgKGN1cnJlbnRfc3RkaW8gPT0gMCkKLSAgICBjdXJyZW50X3N0ZGlvID0gV0lUSF9TVERJTzsKLSAgaWYgKGN1cnJlbnRfc3RkaW8gPT0gMCkKLSAgICBjdXJyZW50X3N0ZGlvID0gRE9fVVNFX1NURElPOwotCi0gIC8qIHZlcmlmeSB0aGUgc3RkaW8gKi8KLSAgaWYgKENVUlJFTlRfU1RESU8gPT0gMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgc3RhbmRhcmQgSU8gdW5zcGVjaWZpZWRcbiIpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgaWYgKENVUlJFTlRfU1RESU8gIT0gY3VycmVudF9zdGRpbykKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgKCVzKSBhbmQgY29uZmlndXJlZCAoJXMpIHN0YW5kYXJkIElPIGluIGNvbmZsaWN0XG4iLAotCQkgICAgICBjb25maWdfc3RkaW9fdG9fYSAoQ1VSUkVOVF9TVERJTyksCi0JCSAgICAgIGNvbmZpZ19zdGRpb190b19hIChjdXJyZW50X3N0ZGlvKSk7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICAKLSAgCi0gIC8qIGNoZWNrIHRoZSB2YWx1ZSBvZiBNU0IgKi8KLSAgaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCICE9IDAKLSAgICAgICYmIFdJVEhfVEFSR0VUX1dPUkRfTVNCICE9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgLSAxKSkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgYml0c2l6ZSAoJWQpIGNvbnRyYWRpY3RzIHRhcmdldCBtb3N0IHNpZ25pZmljYW50IGJpdCAoJWQpXG4iLAotCQkgICAgICBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsIFdJVEhfVEFSR0VUX1dPUkRfTVNCKTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0gIAotICAKLSAgLyogc2V0IHRoZSBlbnZpcm9ubWVudCAqLwotI2lmIChXSVRIX1RSRUVfUFJPUEVSVElFUykKLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gQUxMX0VOVklST05NRU5UKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVudiA9Ci0JdHJlZV9maW5kX3N0cmluZ19wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvZW52Iik7Ci0gICAgICBTVEFURV9FTlZJUk9OTUVOVCAoc2QpID0gKChzdHJjbXAoZW52LCAidXNlciIpID09IDAKLQkJCQkgfHwgc3RyY21wKGVudiwgInVlYSIpID09IDApCi0JCQkJPyBVU0VSX0VOVklST05NRU5UCi0JCQkJOiAoc3RyY21wKGVudiwgInZpcnR1YWwiKSA9PSAwCi0JCQkJICAgfHwgc3RyY21wKGVudiwgInZlYSIpID09IDApCi0JCQkJPyBWSVJUVUFMX0VOVklST05NRU5UCi0JCQkJOiAoc3RyY21wKGVudiwgIm9wZXJhdGluZyIpID09IDAKLQkJCQkgICB8fCBzdHJjbXAoZW52LCAib2VhIikgPT0gMCkKLQkJCQk/IE9QRVJBVElOR19FTlZJUk9OTUVOVAotCQkJCTogQUxMX0VOVklST05NRU5UKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gQUxMX0VOVklST05NRU5UKQotICAgIFNUQVRFX0VOVklST05NRU5UIChzZCkgPSBERUZBVUxUX0VOVklST05NRU5UOwotICAKLSAgCi0gIC8qIHNldCB0aGUgYWxpZ25tZW50ICovCi0jaWYgKFdJVEhfVFJFRV9QUk9QRVJUSUVTKQotICBpZiAoY3VycmVudF9hbGlnbm1lbnQgPT0gMCkKLSAgICBjdXJyZW50X2FsaWdubWVudCA9Ci0gICAgICAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL3N0cmljdC1hbGlnbm1lbnQ/IikKLSAgICAgICA/IFNUUklDVF9BTElHTk1FTlQKLSAgICAgICA6IE5PTlNUUklDVF9BTElHTk1FTlQpOwotI2VuZGlmCi0gIGlmIChjdXJyZW50X2FsaWdubWVudCA9PSAwKQotICAgIGN1cnJlbnRfYWxpZ25tZW50ID0gV0lUSF9BTElHTk1FTlQ7Ci0gIGlmIChjdXJyZW50X2FsaWdubWVudCA9PSAwKQotICAgIGN1cnJlbnRfYWxpZ25tZW50ID0gV0lUSF9ERUZBVUxUX0FMSUdOTUVOVDsKLSAgCi0gIC8qIHZlcmlmeSB0aGUgYWxpZ25tZW50ICovCi0gIGlmIChDVVJSRU5UX0FMSUdOTUVOVCA9PSAwKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCBhbGlnbm1lbnQgdW5zcGVjaWZpZWRcbiIpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgaWYgKENVUlJFTlRfQUxJR05NRU5UICE9IGN1cnJlbnRfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCAoJXMpIGFuZCBjb25maWd1cmVkICglcykgYWxpZ25tZW50IGluIGNvbmZsaWN0XG4iLAotCQkgICAgICBjb25maWdfYWxpZ25tZW50X3RvX2EgKENVUlJFTlRfQUxJR05NRU5UKSwKLQkJICAgICAgY29uZmlnX2FsaWdubWVudF90b19hIChjdXJyZW50X2FsaWdubWVudCkpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgCi0jaWYgZGVmaW5lZCAoV0lUSF9GTE9BVElOR19QT0lOVCkKLSAgCi0gIC8qIHNldCB0aGUgZmxvYXRpbmcgcG9pbnQgKi8KLSAgaWYgKGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQgPT0gMCkKLSAgICBjdXJyZW50X2Zsb2F0aW5nX3BvaW50ID0gV0lUSF9GTE9BVElOR19QT0lOVDsKLSAgCi0gIC8qIHZlcmlmeSB0aGUgZmxvYXRpbmcgcG9pbnQgKi8KLSAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgPT0gMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgZmxvYXRpbmctcG9pbnQgdW5zcGVjaWZpZWRcbiIpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgIT0gY3VycmVudF9mbG9hdGluZ19wb2ludCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgKCVzKSBhbmQgY29uZmlndXJlZCAoJXMpIGZsb2F0aW5nLXBvaW50IGluIGNvbmZsaWN0XG4iLAotCQkgICAgICBjb25maWdfYWxpZ25tZW50X3RvX2EgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQpLAotCQkgICAgICBjb25maWdfYWxpZ25tZW50X3RvX2EgKGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQpKTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0gIAotI2VuZGlmCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLQotdm9pZAotcHJpbnRfc2ltX2NvbmZpZyAoU0lNX0RFU0Mgc2QpCi17Ci0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fVkVSU0lPTl9fKQotICBzaW1faW9fcHJpbnRmIChzZCwgIkNvbXBpbGVkIGJ5IEdDQyAlcyBvbiAlcyAlc1xuIiwKLQkJCSAgX19WRVJTSU9OX18sIF9fREFURV9fLCBfX1RJTUVfXyk7Ci0jZWxzZQotICBzaW1faW9fcHJpbnRmIChzZCwgIkNvbXBpbGVkIG9uICVzICVzXG4iLCBfX0RBVEVfXywgX19USU1FX18pOwotI2VuZGlmCi0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1RBUkdFVF9CWVRFX09SREVSICAgPSAlc1xuIiwKLQkJIGNvbmZpZ19ieXRlX29yZGVyX3RvX2EgKFdJVEhfVEFSR0VUX0JZVEVfT1JERVIpKTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUiAgID0gJXNcbiIsCi0JCSBjb25maWdfYnl0ZV9vcmRlcl90b19hIChXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVIpKTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfSE9TVF9CWVRFX09SREVSICAgICA9ICVzXG4iLAotCQkgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoV0lUSF9IT1NUX0JZVEVfT1JERVIpKTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfU1RESU8gICAgICAgICAgICAgICA9ICVzXG4iLAotCQkgY29uZmlnX3N0ZGlvX3RvX2EgKFdJVEhfU1RESU8pKTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfVEFSR0VUX1dPUkRfTVNCICAgICA9ICVkXG4iLAotCQkgV0lUSF9UQVJHRVRfV09SRF9NU0IpOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID0gJWRcbiIsCi0JCSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFID0gJWRcbiIsCi0JCSBXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkUpOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFID0gJWRcbiIsCi0JCSBXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUpOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA9ICVkXG4iLAotCQkgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSk7Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX0VOVklST05NRU5UID0gJXNcbiIsCi0JCSBjb25maWdfZW52aXJvbm1lbnRfdG9fYSAoV0lUSF9FTlZJUk9OTUVOVCkpOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9BTElHTk1FTlQgPSAlc1xuIiwKLQkJIGNvbmZpZ19hbGlnbm1lbnRfdG9fYSAoV0lUSF9BTElHTk1FTlQpKTsKLQotI2lmIGRlZmluZWQgKFdJVEhfREVGQVVMVF9BTElHTk1FTlQpCi0gIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9ERUZBVUxUX0FMSUdOTUVOVCA9ICVzXG4iLAotCQkgY29uZmlnX2FsaWdubWVudF90b19hIChXSVRIX0RFRkFVTFRfQUxJR05NRU5UKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFdJVEhfWE9SX0VORElBTikKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1hPUl9FTkRJQU4gPSAlZFxuIiwgV0lUSF9YT1JfRU5ESUFOKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoV0lUSF9GTE9BVElOR19QT0lOVCkKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX0ZMT0FUSU5HX1BPSU5UID0gJXNcbiIsCi0JCSBjb25maWdfZmxvYXRpbmdfcG9pbnRfdG9fYSAoV0lUSF9GTE9BVElOR19QT0lOVCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChXSVRIX1NNUCkKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1NNUCA9ICVkXG4iLCBXSVRIX1NNUCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFdJVEhfUkVTRVJWRURfQklUUykKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1JFU0VSVkVEX0JJVFMgPSAlZFxuIiwgV0lUSF9SRVNFUlZFRF9CSVRTKTsKLSNlbmRpZgotCQkgCi0jaWYgZGVmaW5lZCAoV0lUSF9QUk9GSUxFKQotICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfUFJPRklMRSA9ICVkXG4iLCBXSVRIX1BST0ZJTEUpOwotI2VuZGlmCi0JCSAKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNvbmZpZy5oIGIvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjA3MTIuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBTSU1fQ09ORklHX0gKLSNkZWZpbmUgU0lNX0NPTkZJR19ICi0KLQotLyogSG9zdCBkZXBlbmRhbnQ6Ci0KLSAgIFRoZSBDUFAgYmVsb3cgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsYXRpb24gaG9zdC4gIEluCi0gICBwYXJ0aWN1bGFyIGl0IGRlZmluZXMgdGhlIG1hY3JvJ3M6Ci0KLSAgIAlXSVRIX0hPU1RfQllURV9PUkRFUglUaGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdC4gQ291bGQKLQkJCQliZSBhbnkgb2YgTElUVExFX0VORElBTiwgQklHX0VORElBTgotCQkJCW9yIDAgKHVua25vd24pLiAgVGhvc2UgbWFjcm8ncyBhbHNvCi0JCQkJbmVlZCB0byBiZSBkZWZpbmVkLgotCi0gKi8KLQotCi0vKiBOZXRCU0Q6Ci0KLSAgIE5ldEJTRCBpcyBlYXN5LCBldmVyeXRoaW5nIHlvdSBjb3VsZCBldmVyIHdhbnQgaXMgaW4gYSBoZWFkZXIgZmlsZQotICAgKHdlbGwgYWxtb3N0IDotKSAqLwotCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKQotIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyBlbmRpZgotIyBpZiAoQllURV9PUkRFUiAhPSBXSVRIX0hPU1RfQllURV9PUkRFUikKLSMgIGVycm9yICJob3N0IGVuZGlhbiBpbmNvcnJlY3RseSBjb25maWd1cmVkLCBjaGVjayBjb25maWcuaCIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBMaW51eCBpcyBzaW1pbGFybHkgZWFzeS4gICovCi0KLSNpZiBkZWZpbmVkKF9fbGludXhfXykKLSMgaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jIGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChMSVRUTEVfRU5ESUFOKQotIyAgZGVmaW5lIExJVFRMRV9FTkRJQU4gX19MSVRUTEVfRU5ESUFOCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZChCSUdfRU5ESUFOKQotIyAgZGVmaW5lIEJJR19FTkRJQU4gX19CSUdfRU5ESUFOCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoX19CWVRFX09SREVSKSAmJiAhZGVmaW5lZChCWVRFX09SREVSKQotIyAgZGVmaW5lIEJZVEVfT1JERVIgX19CWVRFX09SREVSCi0jIGVuZGlmCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQotIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKLSMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCWVRFX09SREVSCi0jIGVuZGlmCi0jIGlmIChCWVRFX09SREVSICE9IFdJVEhfSE9TVF9CWVRFX09SREVSKQotIyAgZXJyb3IgImhvc3QgZW5kaWFuIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQsIGNoZWNrIGNvbmZpZy5oIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIElOU0VSVCBIRVJFIC0gaG9zdHMgdGhhdCBoYXZlIGF2YWlsYWJsZSBMSVRUTEVfRU5ESUFOIGFuZAotICAgQklHX0VORElBTiBtYWNybydzICovCi0KLQotLyogU29tZSBob3N0cyBkb24ndCBkZWZpbmUgTElUVExFX0VORElBTiBvciBCSUdfRU5ESUFOLCBoZWxwIHRoZW0gb3V0ICovCi0KLSNpZm5kZWYgTElUVExFX0VORElBTgotI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKLSNlbmRpZgotI2lmbmRlZiBCSUdfRU5ESUFOCi0jZGVmaW5lIEJJR19FTkRJQU4gNDMyMQotI2VuZGlmCi0KLQotLyogU3VuT1Mgb24gU1BBUkM6Ci0KLSAgIEJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkICovCi0KLSNpZiBkZWZpbmVkKHNwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCi0jICBlcnJvciAic3VuIHdhcyBiaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBSYW5kb20geDg2Ci0KLSAgIExpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkICovCi0KLSNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoaTQ4NikgfHwgZGVmaW5lZChpNTg2KSB8fCBkZWZpbmVkIChpNjg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkIChfX2k2ODZfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCi0jICBlcnJvciAieDg2IHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIChkZWZpbmVkIChfX2k0ODZfXykgfHwgZGVmaW5lZCAoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgV0lUSF9CU1dBUAotI3VuZGVmICBodG9ubAotI3VuZGVmICBudG9obAotI2RlZmluZSBodG9ubChJTikgX19leHRlbnNpb25fXyAoeyBpbnQgX291dDsgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9vdXQpIDogIjAiIChJTikpOyBfb3V0OyB9KQotI2RlZmluZSBudG9obChJTikgX19leHRlbnNpb25fXyAoeyBpbnQgX291dDsgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9vdXQpIDogIjAiIChJTikpOyBfb3V0OyB9KQotI2VuZGlmCi0KLS8qIFBvd2VyIG9yIFBvd2VyUEMgcnVubmluZyBBSVggICovCi0jaWYgZGVmaW5lZChfUE9XRVIpICYmIGRlZmluZWQoX0FJWCkKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCi0jICBlcnJvciAiUG93ZXIvUG93ZXJQQyBBSVggd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBTb2xhcmlzIHJ1bm5pbmcgUG93ZXJQQyAqLwotI2lmIGRlZmluZWQoX19QUEMpICYmIGRlZmluZWQoX19zdW5fXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCi0jICBlcnJvciAiU29sYXJpcyBvbiBQb3dlclBDcyB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEhQL1BBICovCi0jaWYgZGVmaW5lZChfX2hwcGFfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCi0jICBlcnJvciAiSFAvUEEgd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBCaWcgZW5kaWFuIE1JUFMgKi8KLSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQotIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKLSMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCi0jIGVuZGlmCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQotIyAgZXJyb3IgIk1JUFNFQiB3YXMgYmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIExpdHRsZSBlbmRpYW4gTUlQUyAqLwotI2lmIGRlZmluZWQoX19NSVBTRUxfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCi0jICBlcnJvciAiTUlQU0VMIHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2luZG93cyBOVCAqLwotI2lmIGRlZmluZWQoX19XSU4zMl9fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKLSMgIGVycm9yICJXaW5kb3dzIE5UIHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQWxwaGEgcnVubmluZyBERUMgdW5peCAqLwotI2lmIGRlZmluZWQoX19vc2ZfXykgJiYgZGVmaW5lZChfX2FscGhhX18pCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQotIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKLSMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0jIGVuZGlmCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQotIyAgZXJyb3IgIkFYUCBydW5uaW5nIERFQyB1bml4IHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBJTlNFUlQgSEVSRSAtIGFkZGl0aW9uYWwgaG9zdHMgdGhhdCBkbyBub3QgaGF2ZSBMSVRUTEVfRU5ESUFOIGFuZAotICAgQklHX0VORElBTiBkZWZpbml0aW9ucyBhdmFpbGFibGUuICAqLwotDAotLyogVW50aWwgZGV2aWNlcyBhbmQgdHJlZSBwcm9wZXJ0aWVzIGFyZSBzb3J0ZWQgb3V0LCB0ZWxsIHNpbS1jb25maWcuYwotICAgbm90IHRvIGNhbGwgdGhlIHRyZWVfZmluZF9mb28gZm5zLiAgKi8KLSNkZWZpbmUgV0lUSF9UUkVFX1BST1BFUlRJRVMgMAotCi0KLS8qIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QvdGFyZ2V0OgotCi0gICBJZiB0aGUgYnVpbGQgcHJvY2VzcyBpcyBhd2FyZSAoYXQgY29tcGlsZSB0aW1lKSBvZiB0aGUgZW5kaWFubmVzcwotICAgb2YgdGhlIGhvc3QvdGFyZ2V0IGl0IGlzIGFibGUgdG8gZWxpbWluYXRlIHNsb3dlciBnZW5lcmljIGVuZGlhbgotICAgaGFuZGxpbmcgY29kZS4KLQotICAgUG9zc2libGUgdmFsdWVzIGFyZSAwICh1bmtub3duKSwgTElUVExFX0VORElBTiwgQklHX0VORElBTiAqLwotCi0jaWZuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSCQkwIC8qdW5rbm93biovCi0jZW5kaWYKLQotI2lmbmRlZiBXSVRIX1RBUkdFVF9CWVRFX09SREVSCi0jZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIJCTAgLyp1bmtub3duKi8KLSNlbmRpZgotCi0jaWZuZGVmIFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUgotI2RlZmluZSBXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVIgMCAvKiBmYXRhbCAqLwotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9ob3N0X2J5dGVfb3JkZXI7Ci0jZGVmaW5lIENVUlJFTlRfSE9TVF9CWVRFX09SREVSIChXSVRIX0hPU1RfQllURV9PUkRFUiBcCi0JCQkJID8gV0lUSF9IT1NUX0JZVEVfT1JERVIgXAotCQkJCSA6IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyKQotZXh0ZXJuIGludCBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyOwotI2RlZmluZSBDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSIChXSVRIX1RBUkdFVF9CWVRFX09SREVSIFwKLQkJCQkgICA/IFdJVEhfVEFSR0VUX0JZVEVfT1JERVIgXAotCQkJCSAgIDogY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcikKLQotCi0KLS8qIFhPUiBlbmRpYW4uCi0KLSAgIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgdGhlIHNpbXVsYXRvciBjYW4gc3VwcG9ydCB0aGUgaG9ycmlibGUKLSAgIFhPUiBlbmRpYW4gbW9kZSAoYXMgZm91bmQgaW4gdGhlIFBvd2VyUEMgYW5kIE1JUFMgSVNBKS4gIFNlZQotICAgc2ltLWNvcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIElmIFdJVEhfWE9SX0VORElBTiBpcyBub24temVybywgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgIHBvdGVudGlhbGx5IGludm9sdmVkIGluIHRoZSBYT1IgbXVuZ2UuIEEgdHlwaWNhbCB2YWx1ZSBpcyA4LiAqLwotCi0jaWZuZGVmIFdJVEhfWE9SX0VORElBTgotI2RlZmluZSBXSVRIX1hPUl9FTkRJQU4JCTAKLSNlbmRpZgotCi0KLQotLyogSW50ZWwgaG9zdCBCU1dBUCBzdXBwb3J0OgotCi0gICBXaGV0aGVyIHRvIHVzZSBic3dhcCBvbiB0aGUgNDg2IGFuZCBwZW50aXVtcyByYXRoZXIgdGhhbiB0aGUgMzg2Ci0gICBzZXF1ZW5jZSB0aGF0IHVzZXMgeGNoZ2Ivcm9ybC94Y2hnYiAqLwotI2lmbmRlZiBXSVRIX0JTV0FQCi0jZGVmaW5lCVdJVEhfQlNXQVAgMAotI2VuZGlmCi0KLQotCi0vKiBTTVAgc3VwcG9ydDoKLQotICAgU2V0cyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0IGNhbiBiZSBzaW11bGF0ZWQuICBJZgotICAgV0lUSF9TTVAgaXMgc2V0IHRvIHplcm8gKDApLCB0aGUgc2ltdWxhdG9yIGlzIHJlc3RyaWN0ZWQgdG8KLSAgIHN1cG9ydGluZyBvbmx5IG9uZSBwcm9jZXNzb3IgKGFuZCBhcyBhIGNvbnNlcXVlbmNlIGxlYXZlcyB0aGUgU01QCi0gICBjb2RlIG91dCBvZiB0aGUgYnVpbGQgcHJvY2VzcykuCi0KLSAgIFRoZSBhY3R1YWwgbnVtYmVyIG9mIHByb2Nlc3NvcnMgaXMgdGFrZW4gZnJvbSB0aGUgZGV2aWNlCi0gICAvb3B0aW9ucy9zbXBAPG5yLWNwdT4gKi8KLQotI2lmIGRlZmluZWQgKFdJVEhfU01QKSAmJiAoV0lUSF9TTVAgPiAwKQotI2RlZmluZSBNQVhfTlJfUFJPQ0VTU09SUwkJV0lUSF9TTVAKLSNlbmRpZgotCi0jaWZuZGVmIE1BWF9OUl9QUk9DRVNTT1JTCi0jZGVmaW5lIE1BWF9OUl9QUk9DRVNTT1JTCQkxCi0jZW5kaWYKLQotCi0vKiBTaXplIG9mIHRhcmdldCB3b3JkLCBhZGRyZXNzIGFuZCBPcGVuRmlybXdhcmUgQ2VsbDoKLQotICAgVGhlIHRhcmdldCB3b3JkIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbmF0dXJhbCBzaXplIG9mIGl0cwotICAgcmVnaW5zdGVycy4KLQotICAgT24gbW9zdCBob3N0cywgdGhlIGFkZHJlc3MgYW5kIGNlbGwgYXJlIHRoZSBzYW1lIHNpemUgYXMgYSB0YXJnZXQKLSAgIHdvcmQuICAqLwotCi0jaWZuZGVmIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRQotI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgICAgICAgIDMyCi0jZW5kaWYKLQotI2lmbmRlZiBXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkUKLSNkZWZpbmUgV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFCVdJVEhfVEFSR0VUX1dPUkRfQklUU0laRQotI2VuZGlmCi0KLSNpZm5kZWYgV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFCi0jZGVmaW5lIFdJVEhfVEFSR0VUX0NFTExfQklUU0laRQlXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUKLSNlbmRpZgotCi0jaWZuZGVmIFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUKLSNkZWZpbmUgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA2NAotI2VuZGlmCi0KLQotCi0vKiBNb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0YXJnZXQ6Ci0KLSAgIFNldCB0aGlzIGFjY29yZGluZyB0byB5b3VyIHRhcmdldCdzIGJpdCBudW1iZXJpbmcgY29udmVudGlvbi4gIEZvcgotICAgdGhlIFBvd2VyUEMgaXQgaXMgemVybywgZm9yIG1hbnkgb3RoZXIgdGFyZ2V0cyBpdCBpcyAzMSBvciA2My4KLQotICAgRm9yIHRhcmdldHMgdGhhdCBjYW4gYm90aCBoYXZlIGVpdGhlciAzMiBvciA2NCBiaXQgd29yZHMgYW5kIG51bWJlcgotICAgTVNCIGFzIDMxLCA2My4gIERlZmluZSB0aGlzIHRvIGJlIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgLSAxKSAqLwotCi0jaWZuZGVmIFdJVEhfVEFSR0VUX1dPUkRfTVNCCi0jZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfTVNCICAgICAgICAgICAgMAotI2VuZGlmCi0KLQotCi0vKiBQcm9ncmFtIGVudmlyb25tZW50OgotCi0gICBUaHJlZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSAtIFVFQSAodXNlciksIFZFQSAodmlydHVhbCkgYW5kCi0gICBPRUEgKHBlcmF0aW5nKS4gIFRoZSBmb3JtZXIgdHdvIGFyZSBlbnZpcm9ubWVudCB0aGF0IHVzZXJzIHdvdWxkCi0gICBleHBlY3QgdG8gc2VlIChWRUEgaW5jbHVkZXMgdGhpbmdzIGxpa2UgY29oZXJlbmN5IGFuZCB0aGUgdGltZQotICAgYmFzZSkgd2hpbGUgT0VBIGlzIHdoYXQgYW4gb3BlcmF0aW5nIHN5c3RlbSBleHBlY3RzIHRvIHNlZS4gIEJ5Ci0gICBzZXR0aW5nIHRoZXNlIHRvIHNwZWNpZmljIHZhbHVlcywgdGhlIGJ1aWxkIHByb2Nlc3MgaXMgYWJsZSB0bwotICAgZWxpbWluYXRlIG5vbiByZWxldmVudCBlbnZpcm9ubWVudCBjb2RlLgotCi0gICBTVEFURV9FTlZJUk9OTUVOVChzZCkgc3BlY2lmaWVzIHdoaWNoIG9mIHZlYSBvciBvZWEgaXMgcmVxdWlyZWQgZm9yCi0gICB0aGUgY3VycmVudCBydW50aW1lLgotCi0gICBBTExfRU5WSVJPTk1FTlQgaXMgdXNlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBhcyBhIHZhbHVlIGZvcgotICAgV0lUSF9FTlZJUk9OTUVOVCB0byBpbmRpY2F0ZSB0aGUgY2hvaWNlIGlzIHJ1bnRpbWUgc2VsZWN0YWJsZS4KLSAgIFRoZSBkZWZhdWx0IGlzIHRoZW4gVVNFUl9FTlZJUk9OTUVOVCBbc2luY2UgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hvb3NlCi0gICB0aGUgZGVmYXVsdCBhdCBjb25maWd1cmUgdGltZSBzZWVtcyBsaWtlIGZlYXR1cml0aXMgYW5kIHNpbmNlIHBlb3BsZSB1c2luZwotICAgT1BFUkFUSU5HX0VOVklST05NRU5UIGhhdmUgbW9yZSB0byB3b3JyeSBhYm91dCB0aGFuIHNlbGVjdGluZyB0aGUKLSAgIGRlZmF1bHRdLgotICAgQUxMX0VOVklST05NRU5UIGlzIGFsc28gdXNlZCB0byBzZXQgU1RBVEVfRU5WSVJPTk1FTlQgdG8gdGhlCi0gICAidW5pbml0aWFsaXplZCIgc3RhdGUuICAqLwotCi1lbnVtIHNpbV9lbnZpcm9ubWVudCB7Ci0gIEFMTF9FTlZJUk9OTUVOVCwKLSAgVVNFUl9FTlZJUk9OTUVOVCwKLSAgVklSVFVBTF9FTlZJUk9OTUVOVCwKLSAgT1BFUkFUSU5HX0VOVklST05NRU5UCi19OwotCi0vKiBJZiB0aGUgc2ltdWxhdG9yIHNwZWNpZmllZCBTSU1fQUNfT1BUSU9OX0VOVklST05NRU5ULCBpbmRpY2F0ZSBzby4gICovCi0jaWZkZWYgV0lUSF9FTlZJUk9OTUVOVAotI2RlZmluZSBTSU1fSEFWRV9FTlZJUk9OTUVOVAotI2VuZGlmCi0KLS8qIElmIHRoZSBzaW11bGF0b3IgZG9lc24ndCBzcGVjaWZ5IFNJTV9BQ19PUFRJT05fRU5WSVJPTk1FTlQgaW4gaXRzCi0gICBjb25maWd1cmUuaW4sIHRoZSBvbmx5IHN1cHBvcnRlZCBlbnZpcm9ubWVudCBpcyB0aGUgdXNlciBlbnZpcm9ubWVudC4gICovCi0jaWZuZGVmIFdJVEhfRU5WSVJPTk1FTlQKLSNkZWZpbmUgV0lUSF9FTlZJUk9OTUVOVCBVU0VSX0VOVklST05NRU5UCi0jZW5kaWYKLQotI2RlZmluZSBERUZBVUxUX0VOVklST05NRU5UIChXSVRIX0VOVklST05NRU5UICE9IEFMTF9FTlZJUk9OTUVOVCBcCi0JCQkgICAgID8gV0lUSF9FTlZJUk9OTUVOVCBcCi0JCQkgICAgIDogVVNFUl9FTlZJUk9OTUVOVCkKLQotCi0vKiBDYWxsYmFjayAmIE1vZHVsbyBNZW1vcnkuCi0KLSAgIENvcmUgaW5jbHVkZXMgYSBidWlsdGluIG1lbW9yeSB0eXBlIChyYXdfbWVtb3J5KSB0aGF0IGlzCi0gICBpbXBsZW1lbnRlZCB1c2luZyBhbiBhcnJheS4gIHJhd19tZW1vcnkgZG9lcyBub3QgcmVxdWlyZSBhbnkKLSAgIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGV0Yy4KLQotICAgQ2FsbGJhY2sgbWVtb3J5IGlzIHdoZXJlIHRoZSBjb3JlIGNhbGxzIGEgY29yZSBkZXZpY2UgZm9yIHRoZSBkYXRhCi0gICBpdCByZXF1aXJlcy4gIENhbGxiYWNrIG1lbW9yeSBjYW4gYmUgbGF5ZXJlZCB1c2luZyBwcmlvcml0aWVzLgotCi0gICBNb2R1bG8gbWVtb3J5IGlzIGEgdmFyaWF0aW9uIG9uIHJhd19tZW1vcnkgd2hlcmUgQUREUkVTUyAmIChNT0RVTE8KLSAgIC0gMSkgaXMgdXNlZCBhcyB0aGUgaW5kZXggaW50byB0aGUgbWVtb3J5IGFycmF5LgotCi0gICBUaGUgT0VBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IGZvciBkZXZpY2VzLgotCi0gICBUaGUgVkVBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IHRvIGNhcHR1cmUgYHBhZ2UgZmF1bHRzJy4KLQotICAgQlRXLCB3aGlsZSByYXdfbWVtb3J5IGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBhcyBhIGNhbGxiYWNrLAotICAgcHJvZmlsaW5nIGhhcyBzaG93biB0aGF0IHRoZXJlIGlzIGEgYmlnZXIgd2luIChhdCBsZWFzdCBmb3IgdGhlCi0gICB4ODYpIGluIGVsaW1pbmF0aW5nIGEgZnVuY3Rpb24gY2FsbCBmb3IgdGhlIG1vc3QgY29tbW9uCi0gICAocmF3X21lbW9yeSkgY2FzZS4gKi8KLQotI2lmbmRlZiBXSVRIX0NBTExCQUNLX01FTU9SWQotI2RlZmluZSBXSVRIX0NBTExCQUNLX01FTU9SWQkJMQotI2VuZGlmCi0KLSNpZm5kZWYgV0lUSF9NT0RVTE9fTUVNT1JZCi0jZGVmaW5lIFdJVEhfTU9EVUxPX01FTU9SWSAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLQotCi0vKiBBbGlnbm1lbnQ6Ci0KLSAgIEEgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBtYXkgb3IgbWF5IG5vdCBoYW5kbGUgbWlzcyBhbGlnbmVkCi0gICB0cmFuc2ZlcnMuCi0KLSAgIEFzIGFsdGVybmF0aXZlczogYm90aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gbW9kZXMgdGFrZSBhbiBleGNlcHRpb24KLSAgIChTVFJJQ1RfQUxJR05NRU5UKTsgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1vZGVscyBoYW5kbGUgbWlzIGFsaWduZWQKLSAgIHRyYW5zZmVycyAoTk9OU1RSSUNUX0FMSUdOTUVOVCk7IG9yIHRoZSBhZGRyZXNzIGlzIGZvcmNlZCBpbnRvCi0gICBhbGlnbm1lbnQgdXNpbmcgYSBtYXNrIChGT1JDRURfQUxJR05NRU5UKS4KLQotICAgTWl4ZWQgYWxpZ25tZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiB0aGUgc2ltdWxhdG9yIG5lZWRzIHRvIGJlCi0gICBhYmxlIHRvIGNoYW5nZSB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvbiB0aGUgZmx5IChlZyBmb3IKLSAgIGJpLWVuZGlhbiBzdXBwb3J0KS4gKi8KLQotZW51bSBzaW1fYWxpZ25tZW50cyB7Ci0gIE1JWEVEX0FMSUdOTUVOVCwKLSAgTk9OU1RSSUNUX0FMSUdOTUVOVCwKLSAgU1RSSUNUX0FMSUdOTUVOVCwKLSAgRk9SQ0VEX0FMSUdOTUVOVCwKLX07Ci0KLWV4dGVybiBlbnVtIHNpbV9hbGlnbm1lbnRzIGN1cnJlbnRfYWxpZ25tZW50OwotCi0jaWYgIWRlZmluZWQgKFdJVEhfQUxJR05NRU5UKQotI2RlZmluZSBXSVRIX0FMSUdOTUVOVCAwCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChXSVRIX0RFRkFVTFRfQUxJR05NRU5UKQotI2RlZmluZSBXSVRIX0RFRkFVTFRfQUxJR05NRU5UIDAgLyogZmF0YWwgKi8KLSNlbmRpZgotCi0KLQotCi0jZGVmaW5lIENVUlJFTlRfQUxJR05NRU5UIChXSVRIX0FMSUdOTUVOVCBcCi0JCQkgICA/IFdJVEhfQUxJR05NRU5UIFwKLQkJCSAgIDogY3VycmVudF9hbGlnbm1lbnQpCi0KLQotCi0vKiBGbG9hdGluZyBwb2ludCBzdXBvcnQ6Ci0KLSAgIFNob3VsZCB0aGUgcHJvY2Vzc29yIHRyYXAgZm9yIGFsbCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKGFzCi0gICBpZiB0aGUgaGFyZHdhcmUgd2Fzbid0IGltcGxlbWVudGVkKSBvciBpbXBsZW1lbnQgdGhlIGZsb2F0aW5nIHBvaW50Ci0gICBpbnN0cnVjdGlvbnMgZGlyZWN0bHkuICovCi0KLSNpZiBkZWZpbmVkIChXSVRIX0ZMT0FUSU5HX1BPSU5UKQotCi0jZGVmaW5lIFNPRlRfRkxPQVRJTkdfUE9JTlQJCTEKLSNkZWZpbmUgSEFSRF9GTE9BVElOR19QT0lOVAkJMgotCi1leHRlcm4gaW50IGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQ7Ci0jZGVmaW5lIENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgKFdJVEhfRkxPQVRJTkdfUE9JTlQgXAotCQkJCT8gV0lUSF9GTE9BVElOR19QT0lOVCBcCi0JCQkJOiBjdXJyZW50X2Zsb2F0aW5nX3BvaW50KQotCi0jZW5kaWYKLQotCi0KLS8qIEVuZ2luZSBtb2R1bGUuCi0KLSAgIFVzZSB0aGUgY29tbW9uIHN0YXJ0L3N0b3AvcmVzdGFydCBmcmFtZXdvcmsgKHNpbS1lbmdpbmUpLgotICAgU2ltdWxhdG9ycyB1c2luZyB0aGUgb3RoZXIgbW9kdWxlcyBidXQgbm90IHRoZSBlbmdpbmUgc2hvdWxkIGRlZmluZQotICAgV0lUSF9FTkdJTkU9MC4gKi8KLQotI2lmbmRlZiBXSVRIX0VOR0lORQotI2RlZmluZSBXSVRIX0VOR0lORQkJCTEKLSNlbmRpZgotCi0KLQotLyogRGVidWdnaW5nOgotCi0gICBDb250cm9sIHRoZSBpbmNsdXNpb24gb2YgZGVidWdnaW5nIGNvZGUuCi0gICBEZWJ1Z2dpbmcgaXMgb25seSB0dXJuZWQgb24gaW4gcmFyZSBjaXJjdW1zdGFuY2VzIFtzYXkgZHVyaW5nIGRldmVsb3BtZW50XQotICAgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB0dXJuZWQgb24gb3RoZXJ3aXNlLiAgKi8KLQotI2lmbmRlZiBXSVRIX0RFQlVHCi0jZGVmaW5lIFdJVEhfREVCVUcJCQkwCi0jZW5kaWYKLQotLyogSW5jbHVkZSB0aGUgdHJhY2luZyBjb2RlLiAgRGlzYWJsaW5nIHRoaXMgZWxpbWluYXRlcyBhbGwgdHJhY2luZwotICAgY29kZSAqLwotCi0jaWZuZGVmIFdJVEhfVFJBQ0UKLSNkZWZpbmUgV0lUSF9UUkFDRSAgICAgICAgICAgICAgICAgICAgICAoLTEpCi0jZW5kaWYKLQotLyogSW5jbHVkZSB0aGUgcHJvZmlsaW5nIGNvZGUuICBEaXNhYmxpbmcgdGhpcyBlbGltaW5hdGVzIGFsbCBwcm9maWxpbmcKLSAgIGNvZGUuICAqLwotCi0jaWZuZGVmIFdJVEhfUFJPRklMRQotI2RlZmluZSBXSVRIX1BST0ZJTEUJCQkoLTEpCi0jZW5kaWYKLQotCi0vKiBpbmNsdWRlIGNvZGUgdGhhdCBjaGVja3MgYXNzZXJ0aW9ucyBzY2F0dGVyZWQgdGhyb3VnaCBvdXQgdGhlCi0gICBwcm9ncmFtICovCi0KLSNpZm5kZWYgV0lUSF9BU1NFUlQKLSNkZWZpbmUgV0lUSF9BU1NFUlQJCQkxCi0jZW5kaWYKLQotCi0vKiBXaGV0aGVyIHRvIGNoZWNrIGluc3RydWN0aW9ucyBmb3IgcmVzZXJ2ZWQgYml0cyBiZWluZyBzZXQgKi8KLQotLyogI2RlZmluZSBXSVRIX1JFU0VSVkVEX0JJVFMJCTEgKi8KLQotCi0KLS8qIGluY2x1ZGUgbW9uaXRvcmluZyBjb2RlICovCi0KLSNkZWZpbmUgTU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRQkxCi0jZGVmaW5lIE1PTklUT1JfTE9BRF9TVE9SRV9VTklUCQkyCi0vKiBkbyBub3QgZGVmaW5lIFdJVEhfTU9OIGJ5IGRlZmF1bHQgKi8KLSNkZWZpbmUgREVGQVVMVF9XSVRIX01PTgkJKE1PTklUT1JfTE9BRF9TVE9SRV9VTklUIFwKLQkJCQkJIHwgTU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRSkKLQotCi0vKiBDdXJyZW50IENQVSBtb2RlbCAobW9kZWxzIGFyZSBpbiB0aGUgZ2VuZXJhdGVkIG1vZGVscy5oIGluY2x1ZGUgZmlsZSkgICovCi0jaWZuZGVmIFdJVEhfTU9ERUwKLSNkZWZpbmUgV0lUSF9NT0RFTAkJCTAKLSNlbmRpZgotCi0jZGVmaW5lIENVUlJFTlRfTU9ERUwgKFdJVEhfTU9ERUwJXAotCQkgICAgICAgPyBXSVRIX01PREVMCVwKLQkJICAgICAgIDogY3VycmVudF9tb2RlbCkKLQotI2lmbmRlZiBXSVRIX0RFRkFVTFRfTU9ERUwKLSNkZWZpbmUgV0lUSF9ERUZBVUxUX01PREVMCQlERUZBVUxUX01PREVMCi0jZW5kaWYKLQotI2RlZmluZSBNT0RFTF9JU1NVRV9JR05PUkUJCSgtMSkKLSNkZWZpbmUgTU9ERUxfSVNTVUVfUFJPQ0VTUwkJMQotCi0jaWZuZGVmIFdJVEhfTU9ERUxfSVNTVUUKLSNkZWZpbmUgV0lUSF9NT0RFTF9JU1NVRQkJMAotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9tb2RlbF9pc3N1ZTsKLSNkZWZpbmUgQ1VSUkVOVF9NT0RFTF9JU1NVRSAoV0lUSF9NT0RFTF9JU1NVRQlcCi0JCQkgICAgID8gV0lUSF9NT0RFTF9JU1NVRQlcCi0JCQkgICAgIDogY3VycmVudF9tb2RlbF9pc3N1ZSkKLQotCi0KLS8qIFdoZXRoZXIgb3Igbm90IGlucHV0L291dHB1dCBqdXN0IHVzZXMgc3RkaW8sIG9yIHVzZXMgcHJpbnRmX2ZpbHRlcmVkIGZvcgotICAgb3V0cHV0LCBhbmQgcG9sbGluZyBpbnB1dCBmb3IgaW5wdXQuICAqLwotCi0jZGVmaW5lIERPTlRfVVNFX1NURElPCQkJMgotI2RlZmluZSBET19VU0VfU1RESU8JCQkxCi0KLSNpZm5kZWYgV0lUSF9TVERJTwotI2RlZmluZSBXSVRIX1NURElPCQkJMAotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9zdGRpbzsKLSNkZWZpbmUgQ1VSUkVOVF9TVERJTyAoV0lUSF9TVERJTwlcCi0JCSAgICAgICA/IFdJVEhfU1RESU8gICAgIFwKLQkJICAgICAgIDogY3VycmVudF9zdGRpbykKLQotCi0KLS8qIFNwZWNpZnkgdGhhdCBjb25maWd1cmVkIGNhbGxzIHBhc3MgcGFyYW1ldGVycyBpbiByZWdpc3RlcnMgd2hlbiB0aGUKLSAgIGNvbnZlbnRpb24gaXMgdGhhdCB0aGV5IGFyZSBwbGFjZWQgb24gdGhlIHN0YWNrICovCi0KLSNpZm5kZWYgV0lUSF9SRUdQQVJNCi0jZGVmaW5lIFdJVEhfUkVHUEFSTSAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyogU3BlY2lmeSB0aGF0IGNvbmZpZ3VyZWQgY2FsbHMgdXNlIGFuIGFsdGVybmF0aXZlIGNhbGxpbmcgbWVjaGFuaXNtICovCi0KLSNpZm5kZWYgV0lUSF9TVERDQUxMCi0jZGVmaW5lIFdJVEhfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotCi0vKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgY29uZmlndXJhdGlvbiwgYmVmb3JlIHBhcnNpbmcgYXJndi4gICovCi0KLWV4dGVybiB2b2lkIHNpbV9jb25maWdfZGVmYXVsdCAoU0lNX0RFU0Mgc2QpOwotCi0vKiBDb21wbGV0ZSBhbmQgdmVyaWZ5IHRoZSBzaW11bGF0b3IgY29uZmlndXJhdGlvbi4gICovCi0KLWV4dGVybiBTSU1fUkMgc2ltX2NvbmZpZyAoU0lNX0RFU0Mgc2QpOwotCi0vKiBQcmludCB0aGUgc2ltdWxhdG9yIGNvbmZpZ3VyYXRpb24uICAqLwotCi1leHRlcm4gdm9pZCBwcmludF9zaW1fY29uZmlnIChTSU1fREVTQyBzZCk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1jb3JlLmMgYi9zaW0vY29tbW9uL3NpbS1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTc5YzQuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgU0lNX0NPUkVfQwotI2RlZmluZSBTSU1fQ09SRV9DCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotI2lmIChXSVRIX0hXKQotI2luY2x1ZGUgInNpbS1ody5oIgotI2VuZGlmCi0KLS8qICJjb3JlIiBtb2R1bGUgaW5zdGFsbCBoYW5kbGVyLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgc2ltX21vZHVsZV9pbnN0YWxsIHRvIGluc3RhbGwgdGhlICJjb3JlIgotICAgc3Vic3lzdGVtIGludG8gdGhlIHNpbXVsYXRvci4gICovCi0KLSNpZiBFWFRFUk5fU0lNX0NPUkVfUAotc3RhdGljIE1PRFVMRV9JTklUX0ZOIHNpbV9jb3JlX2luaXQ7Ci1zdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiBzaW1fY29yZV91bmluc3RhbGw7Ci0jZW5kaWYKLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi1TSU1fUkMKLXNpbV9jb3JlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotCi0gIC8qIGVzdGFibGlzaCB0aGUgb3RoZXIgaGFuZGxlcnMgKi8KLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgc2ltX2NvcmVfdW5pbnN0YWxsKTsKLSAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIHNpbV9jb3JlX2luaXQpOwotCi0gIC8qIGVzdGFibGlzaCBhbnkgaW5pdGlhbCBkYXRhIHN0cnVjdHVyZXMgLSBub25lICovCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0jZW5kaWYKLQotCi0vKiBVbmluc3RhbGwgdGhlICJjb3JlIiBzdWJzeXN0ZW0gZnJvbSB0aGUgc2ltdWxhdG9yLiAgKi8KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi1zdGF0aWMgdm9pZAotc2ltX2NvcmVfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgc2ltX2NvcmUgKmNvcmUgPSBTVEFURV9DT1JFKHNkKTsKLSAgdW5zaWduZWQgbWFwOwotICAvKiBibG93IGF3YXkgYW55IG1hcHBpbmdzICovCi0gIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspIHsKLSAgICBzaW1fY29yZV9tYXBwaW5nICpjdXJyID0gY29yZS0+Y29tbW9uLm1hcFttYXBdLmZpcnN0OwotICAgIHdoaWxlIChjdXJyICE9IE5VTEwpIHsKLSAgICAgIHNpbV9jb3JlX21hcHBpbmcgKnRiZCA9IGN1cnI7Ci0gICAgICBjdXJyID0gY3Vyci0+bmV4dDsKLSAgICAgIGlmICh0YmQtPmZyZWVfYnVmZmVyICE9IE5VTEwpIHsKLQlTSU1fQVNTRVJUKHRiZC0+YnVmZmVyICE9IE5VTEwpOwotCXpmcmVlKHRiZC0+ZnJlZV9idWZmZXIpOwotICAgICAgfQotICAgICAgemZyZWUodGJkKTsKLSAgICB9Ci0gICAgY29yZS0+Y29tbW9uLm1hcFttYXBdLmZpcnN0ID0gTlVMTDsKLSAgfQotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi1zdGF0aWMgU0lNX1JDCi1zaW1fY29yZV9pbml0IChTSU1fREVTQyBzZCkKLXsKLSAgLyogTm90aGluZyB0byBkbyAqLwotICByZXR1cm4gU0lNX1JDX09LOwotfQotI2VuZGlmCi0KLQotCi0jaWZuZGVmIFNJTV9DT1JFX1NJR05BTAotI2RlZmluZSBTSU1fQ09SRV9TSUdOQUwoU0QsQ1BVLENJQSxNQVAsTlJfQllURVMsQUREUixUUkFOU0ZFUixFUlJPUikgXAotc2ltX2NvcmVfc2lnbmFsICgoU0QpLCAoQ1BVKSwgKENJQSksIChNQVApLCAoTlJfQllURVMpLCAoQUREUiksIChUUkFOU0ZFUiksIChFUlJPUikpCi0jZW5kaWYKLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi12b2lkCi1zaW1fY29yZV9zaWduYWwgKFNJTV9ERVNDIHNkLAotCQkgc2ltX2NwdSAqY3B1LAotCQkgc2ltX2NpYSBjaWEsCi0JCSB1bnNpZ25lZCBtYXAsCi0JCSBpbnQgbnJfYnl0ZXMsCi0JCSBhZGRyZXNzX3dvcmQgYWRkciwKLQkJIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsCi0JCSBzaW1fY29yZV9zaWduYWxzIHNpZykKLXsKLSAgY29uc3QgY2hhciAqY29weSA9ICh0cmFuc2ZlciA9PSByZWFkX3RyYW5zZmVyID8gInJlYWQiIDogIndyaXRlIik7Ci0gIGFkZHJlc3Nfd29yZCBpcCA9IENJQV9BRERSIChjaWEpOwotICBzd2l0Y2ggKHNpZykKLSAgICB7Ci0gICAgY2FzZSBzaW1fY29yZV91bm1hcHBlZF9zaWduYWw6Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJjb3JlOiAlZCBieXRlICVzIHRvIHVubWFwcGVkIGFkZHJlc3MgMHglbHggYXQgMHglbHhcbiIsCi0JCSAgICAgIG5yX2J5dGVzLCBjb3B5LCAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKLSAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGNwdSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1NFR1YpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsOgotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiY29yZTogJWQgYnl0ZSBtaXNhbGlnbmVkICVzIHRvIGFkZHJlc3MgMHglbHggYXQgMHglbHhcbiIsCi0JCSAgICAgIG5yX2J5dGVzLCBjb3B5LCAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKLSAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGNwdSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0JVUyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIGNwdSwgY2lhLAotCQkJInNpbV9jb3JlX3NpZ25hbCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOwotICAgIH0KLX0KLSNlbmRpZgotCi0KLSNpZiBFWFRFUk5fU0lNX0NPUkVfUAotc3RhdGljIHNpbV9jb3JlX21hcHBpbmcgKgotbmV3X3NpbV9jb3JlX21hcHBpbmcgKFNJTV9ERVNDIHNkLAotCQkgICAgICBpbnQgbGV2ZWwsCi0JCSAgICAgIGludCBzcGFjZSwKLQkJICAgICAgYWRkcmVzc193b3JkIGFkZHIsCi0JCSAgICAgIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKLQkJICAgICAgdW5zaWduZWQgbW9kdWxvLAotI2lmIFdJVEhfSFcKLQkJICAgICAgc3RydWN0IGh3ICpkZXZpY2UsCi0jZWxzZQotCQkgICAgICBkZXZpY2UgKmRldmljZSwKLSNlbmRpZgotCQkgICAgICB2b2lkICpidWZmZXIsCi0JCSAgICAgIHZvaWQgKmZyZWVfYnVmZmVyKQotewotICBzaW1fY29yZV9tYXBwaW5nICpuZXdfbWFwcGluZyA9IFpBTExPQyhzaW1fY29yZV9tYXBwaW5nKTsKLSAgLyogY29tbW9uICovCi0gIG5ld19tYXBwaW5nLT5sZXZlbCA9IGxldmVsOwotICBuZXdfbWFwcGluZy0+c3BhY2UgPSBzcGFjZTsKLSAgbmV3X21hcHBpbmctPmJhc2UgPSBhZGRyOwotICBuZXdfbWFwcGluZy0+bnJfYnl0ZXMgPSBucl9ieXRlczsKLSAgbmV3X21hcHBpbmctPmJvdW5kID0gYWRkciArIChucl9ieXRlcyAtIDEpOwotICBpZiAobW9kdWxvID09IDApCi0gICAgbmV3X21hcHBpbmctPm1hc2sgPSAodW5zaWduZWQpIDAgLSAxOwotICBlbHNlCi0gICAgbmV3X21hcHBpbmctPm1hc2sgPSBtb2R1bG8gLSAxOwotICBuZXdfbWFwcGluZy0+YnVmZmVyID0gYnVmZmVyOwotICBuZXdfbWFwcGluZy0+ZnJlZV9idWZmZXIgPSBmcmVlX2J1ZmZlcjsKLSAgbmV3X21hcHBpbmctPmRldmljZSA9IGRldmljZTsKLSAgcmV0dXJuIG5ld19tYXBwaW5nOwotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi1zdGF0aWMgdm9pZAotc2ltX2NvcmVfbWFwX2F0dGFjaCAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgc2ltX2NvcmVfbWFwICphY2Nlc3NfbWFwLAotCQkgICAgIGludCBsZXZlbCwKLQkJICAgICBpbnQgc3BhY2UsCi0JCSAgICAgYWRkcmVzc193b3JkIGFkZHIsCi0JCSAgICAgYWRkcmVzc193b3JkIG5yX2J5dGVzLAotCQkgICAgIHVuc2lnbmVkIG1vZHVsbywKLSNpZiBXSVRIX0hXCi0JCSAgICAgc3RydWN0IGh3ICpjbGllbnQsIC8qY2FsbGJhY2svZGVmYXVsdCovCi0jZWxzZQotCQkgICAgIGRldmljZSAqY2xpZW50LCAvKmNhbGxiYWNrL2RlZmF1bHQqLwotI2VuZGlmCi0JCSAgICAgdm9pZCAqYnVmZmVyLCAvKnJhd19tZW1vcnkqLwotCQkgICAgIHZvaWQgKmZyZWVfYnVmZmVyKSAvKnJhd19tZW1vcnkqLwotewotICAvKiBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yIHRoaXMgYWRkaXRpb25hbCBtYXBwaW5nIGFuZCB0aGVuCi0gICAgIGluc2VydCAqLwotICBzaW1fY29yZV9tYXBwaW5nICpuZXh0X21hcHBpbmc7Ci0gIHNpbV9jb3JlX21hcHBpbmcgKipsYXN0X21hcHBpbmc7Ci0KLSAgU0lNX0FTU0VSVCAoKGNsaWVudCA9PSBOVUxMKSAhPSAoYnVmZmVyID09IE5VTEwpKTsKLSAgU0lNX0FTU0VSVCAoKGNsaWVudCA9PSBOVUxMKSA+PSAoZnJlZV9idWZmZXIgIT0gTlVMTCkpOwotCi0gIC8qIGFjdHVhbGx5IGRvIG9jY2FzaW9uYWxseSBnZXQgYSB6ZXJvIHNpemUgbWFwICovCi0gIGlmIChucl9ieXRlcyA9PSAwKQotICAgIHsKLSNpZiAoV0lUSF9ERVZJQ0VTKQotICAgICAgZGV2aWNlX2Vycm9yKGNsaWVudCwgImNhbGxlZCBvbiBzaW1fY29yZV9tYXBfYXR0YWNoIHdpdGggc2l6ZSB6ZXJvIik7Ci0jZW5kaWYKLSNpZiAoV0lUSF9IVykKLSAgICAgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgImNhbGxlZCBvbiBzaW1fY29yZV9tYXBfYXR0YWNoIHdpdGggc2l6ZSB6ZXJvIik7Ci0jZW5kaWYKLSAgICAgIHNpbV9pb19lcnJvciAoc2QsICJjYWxsZWQgb24gc2ltX2NvcmVfbWFwX2F0dGFjaCB3aXRoIHNpemUgemVybyIpOwotICAgIH0KLQotICAvKiBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQgKGJldHdlZW4gbGFzdC9uZXh0KSAqLwotICBuZXh0X21hcHBpbmcgPSBhY2Nlc3NfbWFwLT5maXJzdDsKLSAgbGFzdF9tYXBwaW5nID0gJmFjY2Vzc19tYXAtPmZpcnN0OwotICB3aGlsZShuZXh0X21hcHBpbmcgIT0gTlVMTAotCSYmIChuZXh0X21hcHBpbmctPmxldmVsIDwgbGV2ZWwKLQkgICAgfHwgKG5leHRfbWFwcGluZy0+bGV2ZWwgPT0gbGV2ZWwKLQkJJiYgbmV4dF9tYXBwaW5nLT5ib3VuZCA8IGFkZHIpKSkKLSAgICB7Ci0gICAgICAvKiBwcm92aWRlZCBsZXZlbHMgYXJlIHRoZSBzYW1lICovCi0gICAgICAvKiBhc3NlcnQ6IG5leHRfbWFwcGluZy0+YmFzZSA+IGFsbCBiYXNlcyBiZWZvcmUgbmV4dF9tYXBwaW5nICovCi0gICAgICAvKiBhc3NlcnQ6IG5leHRfbWFwcGluZy0+Ym91bmQgPj0gYWxsIGJvdW5kcyBiZWZvcmUgbmV4dF9tYXBwaW5nICovCi0gICAgICBsYXN0X21hcHBpbmcgPSAmbmV4dF9tYXBwaW5nLT5uZXh0OwotICAgICAgbmV4dF9tYXBwaW5nID0gbmV4dF9tYXBwaW5nLT5uZXh0OwotICAgIH0KLSAgCi0gIC8qIGNoZWNrIGluc2VydGlvbiBwb2ludCBjb3JyZWN0ICovCi0gIFNJTV9BU1NFUlQgKG5leHRfbWFwcGluZyA9PSBOVUxMIHx8IG5leHRfbWFwcGluZy0+bGV2ZWwgPj0gbGV2ZWwpOwotICBpZiAobmV4dF9tYXBwaW5nICE9IE5VTEwgJiYgbmV4dF9tYXBwaW5nLT5sZXZlbCA9PSBsZXZlbAotICAgICAgJiYgbmV4dF9tYXBwaW5nLT5iYXNlIDwgKGFkZHIgKyAobnJfYnl0ZXMgLSAxKSkpCi0gICAgewotI2lmIChXSVRIX0RFVklDRVMpCi0gICAgICBkZXZpY2VfZXJyb3IgKGNsaWVudCwgIm1lbW9yeSBtYXAgJWQ6MHglbHguLjB4JWx4ICglbGQgYnl0ZXMpIG92ZXJsYXBzICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSIsCi0JCSAgICBzcGFjZSwKLQkJICAgIChsb25nKSBhZGRyLAotCQkgICAgKGxvbmcpIG5yX2J5dGVzLAotCQkgICAgKGxvbmcpIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpLAotCQkgICAgbmV4dF9tYXBwaW5nLT5zcGFjZSwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPmJhc2UsCi0JCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ib3VuZCwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPm5yX2J5dGVzKTsKLSNlbmRpZgotI2lmIFdJVEhfSFcKLSAgICAgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgIm1lbW9yeSBtYXAgJWQ6MHglbHguLjB4JWx4ICglbGQgYnl0ZXMpIG92ZXJsYXBzICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSIsCi0JCSAgICBzcGFjZSwKLQkJICAgIChsb25nKSBhZGRyLAotCQkgICAgKGxvbmcpIG5yX2J5dGVzLAotCQkgICAgKGxvbmcpIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpLAotCQkgICAgbmV4dF9tYXBwaW5nLT5zcGFjZSwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPmJhc2UsCi0JCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ib3VuZCwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPm5yX2J5dGVzKTsKLSNlbmRpZgotICAgICAgc2ltX2lvX2Vycm9yIChzZCwgIm1lbW9yeSBtYXAgJWQ6MHglbHguLjB4JWx4ICglbGQgYnl0ZXMpIG92ZXJsYXBzICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSIsCi0JCSAgICBzcGFjZSwKLQkJICAgIChsb25nKSBhZGRyLAotCQkgICAgKGxvbmcpIG5yX2J5dGVzLAotCQkgICAgKGxvbmcpIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpLAotCQkgICAgbmV4dF9tYXBwaW5nLT5zcGFjZSwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPmJhc2UsCi0JCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ib3VuZCwKLQkJICAgIChsb25nKSBuZXh0X21hcHBpbmctPm5yX2J5dGVzKTsKLSAgfQotCi0gIC8qIGNyZWF0ZS9pbnNlcnQgdGhlIG5ldyBtYXBwaW5nICovCi0gICpsYXN0X21hcHBpbmcgPSBuZXdfc2ltX2NvcmVfbWFwcGluZyhzZCwKLQkJCQkgICAgICAgbGV2ZWwsCi0JCQkJICAgICAgIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgbW9kdWxvLAotCQkJCSAgICAgICBjbGllbnQsIGJ1ZmZlciwgZnJlZV9idWZmZXIpOwotICAoKmxhc3RfbWFwcGluZyktPm5leHQgPSBuZXh0X21hcHBpbmc7Ci19Ci0jZW5kaWYKLQotCi0vKiBBdHRhY2ggbWVtb3J5IG9yIGEgbWVtb3J5IG1hcHBlZCBkZXZpY2UgdG8gdGhlIHNpbXVsYXRvci4KLSAgIFNlZSBzaW0tY29yZS5oIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24uICAqLwotCi0jaWYgRVhURVJOX1NJTV9DT1JFX1AKLXZvaWQKLXNpbV9jb3JlX2F0dGFjaCAoU0lNX0RFU0Mgc2QsCi0JCSBzaW1fY3B1ICpjcHUsCi0JCSBpbnQgbGV2ZWwsCi0JCSB1bnNpZ25lZCBtYXBtYXNrLAotCQkgaW50IHNwYWNlLAotCQkgYWRkcmVzc193b3JkIGFkZHIsCi0JCSBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCi0JCSB1bnNpZ25lZCBtb2R1bG8sCi0jaWYgV0lUSF9IVwotCQkgc3RydWN0IGh3ICpjbGllbnQsCi0jZWxzZQotCQkgZGV2aWNlICpjbGllbnQsCi0jZW5kaWYKLQkJIHZvaWQgKm9wdGlvbmFsX2J1ZmZlcikKLXsKLSAgc2ltX2NvcmUgKm1lbW9yeSA9IFNUQVRFX0NPUkUoc2QpOwotICB1bnNpZ25lZCBtYXA7Ci0gIHZvaWQgKmJ1ZmZlcjsKLSAgdm9pZCAqZnJlZV9idWZmZXI7Ci0KLSAgLyogY2hlY2sgZm9yIGZvciBhdHRlbXB0IHRvIHVzZSB1bmltcGxlbWVudGVkIHBlci1wcm9jZXNzb3IgY29yZSBtYXAgKi8KLSAgaWYgKGNwdSAhPSBOVUxMKQotICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1fY29yZV9tYXBfYXR0YWNoIC0gcHJvY2Vzc29yIHNwZWNpZmljIG1lbW9yeSBtYXAgbm90IHlldCBzdXBwb3J0ZWQiKTsKLQotICAvKiB2ZXJpZnkgbW9kdWxvIG1lbW9yeSAqLwotICBpZiAoIVdJVEhfTU9EVUxPX01FTU9SWSAmJiBtb2R1bG8gIT0gMCkKLSAgICB7Ci0jaWYgKFdJVEhfREVWSUNFUykKLSAgICAgIGRldmljZV9lcnJvciAoY2xpZW50LCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gbWVtb3J5IGRpc2FibGVkIik7Ci0jZW5kaWYKLSNpZiAoV0lUSF9IVykKLSAgICAgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIG1lbW9yeSBkaXNhYmxlZCIpOwotI2VuZGlmCi0gICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gbWVtb3J5IGRpc2FibGVkIik7Ci0gICAgfQotICBpZiAoY2xpZW50ICE9IE5VTEwgJiYgbW9kdWxvICE9IDApCi0gICAgewotI2lmIChXSVRIX0RFVklDRVMpCi0gICAgICBkZXZpY2VfZXJyb3IgKGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIGFuZCBjYWxsYmFjayBtZW1vcnkgY29uZmxpY3QiKTsKLSNlbmRpZgotI2lmIChXSVRIX0hXKQotICAgICAgc2ltX2h3X2Fib3J0IChzZCwgY2xpZW50LCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gYW5kIGNhbGxiYWNrIG1lbW9yeSBjb25mbGljdCIpOwotI2VuZGlmCi0gICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gYW5kIGNhbGxiYWNrIG1lbW9yeSBjb25mbGljdCIpOwotICAgIH0KLSAgaWYgKG1vZHVsbyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIG1hc2sgPSBtb2R1bG8gLSAxOwotICAgICAgLyogYW55IHplcm8gYml0cyAqLwotICAgICAgd2hpbGUgKG1hc2sgPj0gc2l6ZW9mICh1bnNpZ25lZDY0KSkgLyogbWluaW11bSBtb2R1bG8gKi8KLQl7Ci0JICBpZiAoKG1hc2sgJiAxKSA9PSAwKQotCSAgICBtYXNrID0gMDsKLQkgIGVsc2UKLQkgICAgbWFzayA+Pj0gMTsKLQl9Ci0gICAgICBpZiAobWFzayAhPSBzaXplb2YgKHVuc2lnbmVkNjQpIC0gMSkKLQl7Ci0jaWYgKFdJVEhfREVWSUNFUykKLQkgIGRldmljZV9lcnJvciAoY2xpZW50LCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gJWx4IG5vdCBwb3dlciBvZiB0d28iLCAobG9uZykgbW9kdWxvKTsKLSNlbmRpZgotI2lmIChXSVRIX0hXKQotCSAgc2ltX2h3X2Fib3J0IChzZCwgY2xpZW50LCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBtb2R1bG8gJWx4IG5vdCBwb3dlciBvZiB0d28iLCAobG9uZykgbW9kdWxvKTsKLSNlbmRpZgotCSAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvICVseCBub3QgcG93ZXIgb2YgdHdvIiwgKGxvbmcpIG1vZHVsbyk7Ci0JfQotICAgIH0KLQotICAvKiB2ZXJpZnkgY29uc2lzdGVuY3kgYmV0d2VlbiBkZXZpY2UgYW5kIGJ1ZmZlciAqLwotICBpZiAoY2xpZW50ICE9IE5VTEwgJiYgb3B0aW9uYWxfYnVmZmVyICE9IE5VTEwpCi0gICAgewotI2lmIChXSVRIX0RFVklDRVMpCi0gICAgICBkZXZpY2VfZXJyb3IgKGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gY29uZmxpY3RpbmcgYnVmZmVyIGFuZCBhdHRhY2ggYXJndW1lbnRzIik7Ci0jZW5kaWYKLSNpZiAoV0lUSF9IVykKLSAgICAgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gY29uZmxpY3RpbmcgYnVmZmVyIGFuZCBhdHRhY2ggYXJndW1lbnRzIik7Ci0jZW5kaWYKLSAgICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIGNvbmZsaWN0aW5nIGJ1ZmZlciBhbmQgYXR0YWNoIGFyZ3VtZW50cyIpOwotICAgIH0KLSAgaWYgKGNsaWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvcHRpb25hbF9idWZmZXIgPT0gTlVMTCkKLQl7Ci0JICBpbnQgcGFkZGluZyA9IChhZGRyICUgc2l6ZW9mICh1bnNpZ25lZDY0KSk7Ci0JICB1bnNpZ25lZCBsb25nIGJ5dGVzID0gKG1vZHVsbyA9PSAwID8gbnJfYnl0ZXMgOiBtb2R1bG8pICsgcGFkZGluZzsKLQkgIGZyZWVfYnVmZmVyID0gemFsbG9jIChieXRlcyk7Ci0JICBidWZmZXIgPSAoY2hhciopIGZyZWVfYnVmZmVyICsgcGFkZGluZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnVmZmVyID0gb3B0aW9uYWxfYnVmZmVyOwotCSAgZnJlZV9idWZmZXIgPSBOVUxMOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBhIGRldmljZSAqLwotICAgICAgYnVmZmVyID0gTlVMTDsKLSAgICAgIGZyZWVfYnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogYXR0YWNoIHRoZSByZWdpb24gdG8gYWxsIGFwcGxpY2FibGUgYWNjZXNzIG1hcHMgKi8KLSAgZm9yIChtYXAgPSAwOyAKLSAgICAgICBtYXAgPCBucl9tYXBzOwotICAgICAgIG1hcCsrKQotICAgIHsKLSAgICAgIGlmIChtYXBtYXNrICYgKDEgPDwgbWFwKSkKLQl7Ci0JICBzaW1fY29yZV9tYXBfYXR0YWNoIChzZCwgJm1lbW9yeS0+Y29tbW9uLm1hcFttYXBdLAotCQkJICAgICAgIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKLQkJCSAgICAgICBjbGllbnQsIGJ1ZmZlciwgZnJlZV9idWZmZXIpOwotCSAgZnJlZV9idWZmZXIgPSBOVUxMOwotCX0KLSAgICB9Ci0gIAotICAvKiBKdXN0IGNvcHkgdGhpcyBtYXAgdG8gZWFjaCBvZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgRklYTUUgLSBsYXRlciB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdHJ1ZSBwcm9jZXNzb3Igc3BlY2lmaWMKLSAgICAgbWFwcy4gKi8KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgaSsrKQotICAgICAgewotCUNQVV9DT1JFIChTVEFURV9DUFUgKHNkLCBpKSktPmNvbW1vbiA9IFNUQVRFX0NPUkUgKHNkKS0+Y29tbW9uOwotICAgICAgfQotICB9Ci19Ci0jZW5kaWYKLQotCi0vKiBSZW1vdmUgYW55IG1lbW9yeSByZWZlcmVuY2UgcmVsYXRlZCB0byB0aGlzIGFkZHJlc3MgKi8KLSNpZiBFWFRFUk5fU0lNX0NPUkVfUAotc3RhdGljIHZvaWQKLXNpbV9jb3JlX21hcF9kZXRhY2ggKFNJTV9ERVNDIHNkLAotCQkgICAgIHNpbV9jb3JlX21hcCAqYWNjZXNzX21hcCwKLQkJICAgICBpbnQgbGV2ZWwsCi0JCSAgICAgaW50IHNwYWNlLAotCQkgICAgIGFkZHJlc3Nfd29yZCBhZGRyKQotewotICBzaW1fY29yZV9tYXBwaW5nICoqZW50cnk7Ci0gIGZvciAoZW50cnkgPSAmYWNjZXNzX21hcC0+Zmlyc3Q7Ci0gICAgICAgKCplbnRyeSkgIT0gTlVMTDsKLSAgICAgICBlbnRyeSA9ICYoKmVudHJ5KS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKCplbnRyeSktPmJhc2UgPT0gYWRkcgotCSAgJiYgKCplbnRyeSktPmxldmVsID09IGxldmVsCi0JICAmJiAoKmVudHJ5KS0+c3BhY2UgPT0gc3BhY2UpCi0JewotCSAgc2ltX2NvcmVfbWFwcGluZyAqZGVhZCA9ICgqZW50cnkpOwotCSAgKCplbnRyeSkgPSBkZWFkLT5uZXh0OwotCSAgaWYgKGRlYWQtPmZyZWVfYnVmZmVyICE9IE5VTEwpCi0JICAgIHpmcmVlIChkZWFkLT5mcmVlX2J1ZmZlcik7Ci0JICB6ZnJlZSAoZGVhZCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLSNlbmRpZgotCi0jaWYgRVhURVJOX1NJTV9DT1JFX1AKLXZvaWQKLXNpbV9jb3JlX2RldGFjaCAoU0lNX0RFU0Mgc2QsCi0JCSBzaW1fY3B1ICpjcHUsCi0JCSBpbnQgbGV2ZWwsCi0JCSBpbnQgYWRkcmVzc19zcGFjZSwKLQkJIGFkZHJlc3Nfd29yZCBhZGRyKQotewotICBzaW1fY29yZSAqbWVtb3J5ID0gU1RBVEVfQ09SRSAoc2QpOwotICB1bnNpZ25lZCBtYXA7Ci0gIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspCi0gICAgewotICAgICAgc2ltX2NvcmVfbWFwX2RldGFjaCAoc2QsICZtZW1vcnktPmNvbW1vbi5tYXBbbWFwXSwKLQkJCSAgIGxldmVsLCBhZGRyZXNzX3NwYWNlLCBhZGRyKTsKLSAgICB9Ci0gIC8qIEp1c3QgY29weSB0aGlzIHVwZGF0ZSB0byBlYWNoIG9mIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZGF0YQotICAgICBzdHJ1Y3R1cmVzLiAgRklYTUUgLSBsYXRlciB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdHJ1ZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgbWFwcy4gKi8KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgaSsrKQotICAgICAgewotCUNQVV9DT1JFIChTVEFURV9DUFUgKHNkLCBpKSktPmNvbW1vbiA9IFNUQVRFX0NPUkUgKHNkKS0+Y29tbW9uOwotICAgICAgfQotICB9Ci19Ci0jZW5kaWYKLQotCi1TVEFUSUNfSU5MSU5FX1NJTV9DT1JFXAotKHNpbV9jb3JlX21hcHBpbmcgKikKLXNpbV9jb3JlX2ZpbmRfbWFwcGluZyhzaW1fY29yZV9jb21tb24gKmNvcmUsCi0JCSAgICAgIHVuc2lnbmVkIG1hcCwKLQkJICAgICAgYWRkcmVzc193b3JkIGFkZHIsCi0JCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLAotCQkgICAgICBpbnQgYWJvcnQsIC8qZWl0aGVyIDAgb3IgMSAtIGhpbnQgdG8gaW5saW5lLy1PICovCi0JCSAgICAgIHNpbV9jcHUgKmNwdSwgLyogYWJvcnQgPT4gY3B1ICE9IE5VTEwgKi8KLQkJICAgICAgc2ltX2NpYSBjaWEpCi17Ci0gIHNpbV9jb3JlX21hcHBpbmcgKm1hcHBpbmcgPSBjb3JlLT5tYXBbbWFwXS5maXJzdDsKLSAgQVNTRVJUICgoYWRkciAmIChucl9ieXRlcyAtIDEpKSA9PSAwKTsgLyogbXVzdCBiZSBhbGlnbmVkICovCi0gIEFTU0VSVCAoKGFkZHIgKyAobnJfYnl0ZXMgLSAxKSkgPj0gYWRkcik7IC8qIG11c3Qgbm90IHdyYXAgKi8KLSAgQVNTRVJUICghYWJvcnQgfHwgY3B1ICE9IE5VTEwpOyAvKiBhYm9ydCBuZWVkcyBhIG5vbiBudWxsIENQVSAqLwotICB3aGlsZSAobWFwcGluZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChhZGRyID49IG1hcHBpbmctPmJhc2UKLQkgICYmIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpIDw9IG1hcHBpbmctPmJvdW5kKQotCXJldHVybiBtYXBwaW5nOwotICAgICAgbWFwcGluZyA9IG1hcHBpbmctPm5leHQ7Ci0gICAgfQotICBpZiAoYWJvcnQpCi0gICAgewotICAgICAgU0lNX0NPUkVfU0lHTkFMIChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLCBtYXAsIG5yX2J5dGVzLCBhZGRyLCB0cmFuc2ZlciwKLQkJICAgICAgIHNpbV9jb3JlX3VubWFwcGVkX3NpZ25hbCk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX1NJTV9DT1JFXAotKHZvaWQgKikKLXNpbV9jb3JlX3RyYW5zbGF0ZSAoc2ltX2NvcmVfbWFwcGluZyAqbWFwcGluZywKLQkJICAgIGFkZHJlc3Nfd29yZCBhZGRyKQotewotICBpZiAoV0lUSF9NT0RVTE9fTUVNT1JZKQotICAgIHJldHVybiAodm9pZCAqKSgodW5zaWduZWQ4ICopIG1hcHBpbmctPmJ1ZmZlcgotCQkgICAgKyAoKGFkZHIgLSBtYXBwaW5nLT5iYXNlKSAmIG1hcHBpbmctPm1hc2spKTsKLSAgZWxzZQotICAgIHJldHVybiAodm9pZCAqKSgodW5zaWduZWQ4ICopIG1hcHBpbmctPmJ1ZmZlcgotCQkgICAgKyBhZGRyIC0gbWFwcGluZy0+YmFzZSk7Ci19Ci0KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi11bnNpZ25lZAotc2ltX2NvcmVfcmVhZF9idWZmZXIgKFNJTV9ERVNDIHNkLAotCQkgICAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICAgIHVuc2lnbmVkIG1hcCwKLQkJICAgICAgdm9pZCAqYnVmZmVyLAotCQkgICAgICBhZGRyZXNzX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbGVuKQotewotICBzaW1fY29yZV9jb21tb24gKmNvcmUgPSAoY3B1ID09IE5VTEwgPyAmU1RBVEVfQ09SRSAoc2QpLT5jb21tb24gOiAmQ1BVX0NPUkUgKGNwdSktPmNvbW1vbik7Ci0gIHVuc2lnbmVkIGNvdW50ID0gMDsKLSAgd2hpbGUgKGNvdW50IDwgbGVuKQotIHsKLSAgICB1bnNpZ25lZF93b3JkIHJhZGRyID0gYWRkciArIGNvdW50OwotICAgIHNpbV9jb3JlX21hcHBpbmcgKm1hcHBpbmcgPQotICAgICAgc2ltX2NvcmVfZmluZF9tYXBwaW5nIChjb3JlLCBtYXAsCi0JCQkgICAgcmFkZHIsIC8qbnItYnl0ZXMqLzEsCi0JCQkgICAgcmVhZF90cmFuc2ZlciwKLQkJCSAgICAwIC8qZG9udC1hYm9ydCovLCBOVUxMLCBOVUxMX0NJQSk7Ci0gICAgaWYgKG1hcHBpbmcgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotI2lmIChXSVRIX0RFVklDRVMpCi0gICAgaWYgKG1hcHBpbmctPmRldmljZSAhPSBOVUxMKQotICAgICAgewotCWludCBucl9ieXRlcyA9IGxlbiAtIGNvdW50OwotCXNpbV9jaWEgY2lhID0gY3B1ID8gQ0lBX0dFVCAoY3B1KSA6IE5VTExfQ0lBOwotCWlmIChyYWRkciArIG5yX2J5dGVzIC0gMT4gbWFwcGluZy0+Ym91bmQpCi0JICBucl9ieXRlcyA9IG1hcHBpbmctPmJvdW5kIC0gcmFkZHIgKyAxOwotCWlmIChkZXZpY2VfaW9fcmVhZF9idWZmZXIgKG1hcHBpbmctPmRldmljZSwKLQkJCQkgICAodW5zaWduZWRfMSopYnVmZmVyICsgY291bnQsCi0JCQkJICAgbWFwcGluZy0+c3BhY2UsCi0JCQkJICAgcmFkZHIsCi0JCQkJICAgbnJfYnl0ZXMsIAotCQkJCSAgIHNkLAotCQkJCSAgIGNwdSwgCi0JCQkJICAgY2lhKSAhPSBucl9ieXRlcykKLQkgIGJyZWFrOwotCWNvdW50ICs9IG5yX2J5dGVzOwotCWNvbnRpbnVlOwotICAgICAgfQotI2VuZGlmCi0jaWYgKFdJVEhfSFcpCi0gICAgaWYgKG1hcHBpbmctPmRldmljZSAhPSBOVUxMKQotICAgICAgewotCWludCBucl9ieXRlcyA9IGxlbiAtIGNvdW50OwotCWlmIChyYWRkciArIG5yX2J5dGVzIC0gMT4gbWFwcGluZy0+Ym91bmQpCi0JICBucl9ieXRlcyA9IG1hcHBpbmctPmJvdW5kIC0gcmFkZHIgKyAxOwotCWlmIChzaW1faHdfaW9fcmVhZF9idWZmZXIgKHNkLCBtYXBwaW5nLT5kZXZpY2UsCi0JCQkJICAgKHVuc2lnbmVkXzEqKWJ1ZmZlciArIGNvdW50LAotCQkJCSAgIG1hcHBpbmctPnNwYWNlLAotCQkJCSAgIHJhZGRyLAotCQkJCSAgIG5yX2J5dGVzKSAhPSBucl9ieXRlcykKLQkgIGJyZWFrOwotCWNvdW50ICs9IG5yX2J5dGVzOwotCWNvbnRpbnVlOwotICAgICAgfQotI2VuZGlmCi0gICAgKCh1bnNpZ25lZF8xKilidWZmZXIpW2NvdW50XSA9Ci0gICAgICAqKHVuc2lnbmVkXzEqKXNpbV9jb3JlX3RyYW5zbGF0ZShtYXBwaW5nLCByYWRkcik7Ci0gICAgY291bnQgKz0gMTsKLSB9Ci0gIHJldHVybiBjb3VudDsKLX0KLSNlbmRpZgotCi0KLSNpZiBFWFRFUk5fU0lNX0NPUkVfUAotdW5zaWduZWQKLXNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICAgICB1bnNpZ25lZCBtYXAsCi0JCSAgICAgICBjb25zdCB2b2lkICpidWZmZXIsCi0JCSAgICAgICBhZGRyZXNzX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIGxlbikKLXsKLSAgc2ltX2NvcmVfY29tbW9uICpjb3JlID0gKGNwdSA9PSBOVUxMID8gJlNUQVRFX0NPUkUgKHNkKS0+Y29tbW9uIDogJkNQVV9DT1JFIChjcHUpLT5jb21tb24pOwotICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gIHdoaWxlIChjb3VudCA8IGxlbikKLSAgICB7Ci0gICAgICB1bnNpZ25lZF93b3JkIHJhZGRyID0gYWRkciArIGNvdW50OwotICAgICAgc2ltX2NvcmVfbWFwcGluZyAqbWFwcGluZyA9Ci0Jc2ltX2NvcmVfZmluZF9tYXBwaW5nIChjb3JlLCBtYXAsCi0JCQkgICAgICAgcmFkZHIsIC8qbnItYnl0ZXMqLzEsCi0JCQkgICAgICAgd3JpdGVfdHJhbnNmZXIsCi0JCQkgICAgICAgMCAvKmRvbnQtYWJvcnQqLywgTlVMTCwgTlVMTF9DSUEpOwotICAgICAgaWYgKG1hcHBpbmcgPT0gTlVMTCkKLQlicmVhazsKLSNpZiAoV0lUSF9ERVZJQ0VTKQotICAgICAgaWYgKFdJVEhfQ0FMTEJBQ0tfTUVNT1JZCi0JICAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKLQl7Ci0JICBpbnQgbnJfYnl0ZXMgPSBsZW4gLSBjb3VudDsKLQkgIHNpbV9jaWEgY2lhID0gY3B1ID8gQ0lBX0dFVCAoY3B1KSA6IE5VTExfQ0lBOwotCSAgaWYgKHJhZGRyICsgbnJfYnl0ZXMgLSAxID4gbWFwcGluZy0+Ym91bmQpCi0JICAgIG5yX2J5dGVzID0gbWFwcGluZy0+Ym91bmQgLSByYWRkciArIDE7Ci0JICBpZiAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlciAobWFwcGluZy0+ZGV2aWNlLAotCQkJCSAgICAgICh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKLQkJCQkgICAgICBtYXBwaW5nLT5zcGFjZSwKLQkJCQkgICAgICByYWRkciwKLQkJCQkgICAgICBucl9ieXRlcywKLQkJCQkgICAgICBzZCwKLQkJCQkgICAgICBjcHUsIAotCQkJCSAgICAgIGNpYSkgIT0gbnJfYnl0ZXMpCi0JICAgIGJyZWFrOwotCSAgY291bnQgKz0gbnJfYnl0ZXM7Ci0JICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLSNpZiAoV0lUSF9IVykKLSAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWQotCSAgJiYgbWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpCi0JewotCSAgaW50IG5yX2J5dGVzID0gbGVuIC0gY291bnQ7Ci0JICBpZiAocmFkZHIgKyBucl9ieXRlcyAtIDEgPiBtYXBwaW5nLT5ib3VuZCkKLQkgICAgbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKLQkgIGlmIChzaW1faHdfaW9fd3JpdGVfYnVmZmVyIChzZCwgbWFwcGluZy0+ZGV2aWNlLAotCQkJCSAgICAgICh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKLQkJCQkgICAgICBtYXBwaW5nLT5zcGFjZSwKLQkJCQkgICAgICByYWRkciwKLQkJCQkgICAgICBucl9ieXRlcykgIT0gbnJfYnl0ZXMpCi0JICAgIGJyZWFrOwotCSAgY291bnQgKz0gbnJfYnl0ZXM7Ci0JICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLSAgICAgICoodW5zaWduZWRfMSopc2ltX2NvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIHJhZGRyKSA9Ci0JKCh1bnNpZ25lZF8xKilidWZmZXIpW2NvdW50XTsKLSAgICAgIGNvdW50ICs9IDE7Ci0gICAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0jZW5kaWYKLQotCi0jaWYgRVhURVJOX1NJTV9DT1JFX1AKLXZvaWQKLXNpbV9jb3JlX3NldF94b3IgKFNJTV9ERVNDIHNkLAotCQkgIHNpbV9jcHUgKmNwdSwKLQkJICBpbnQgaXNfeG9yKQotewotICAvKiBzZXQgdXAgdGhlIFhPUiBtYXAgaWYgcmVxdWlyZWQuICovCi0gIGlmIChXSVRIX1hPUl9FTkRJQU4pIHsKLSAgICB7Ci0gICAgICBzaW1fY29yZSAqY29yZSA9IFNUQVRFX0NPUkUgKHNkKTsKLSAgICAgIHNpbV9jcHVfY29yZSAqY3B1X2NvcmUgPSAoY3B1ICE9IE5VTEwgPyBDUFVfQ09SRSAoY3B1KSA6IE5VTEwpOwotICAgICAgaWYgKGNwdV9jb3JlICE9IE5VTEwpCi0JewotCSAgaW50IGkgPSAxOwotCSAgdW5zaWduZWQgbWFzazsKLQkgIGlmIChpc194b3IpCi0JICAgIG1hc2sgPSBXSVRIX1hPUl9FTkRJQU4gLSAxOwotCSAgZWxzZQotCSAgICBtYXNrID0gMDsKLQkgIHdoaWxlIChpIC0gMSA8IFdJVEhfWE9SX0VORElBTikKLQkgICAgewotCSAgICAgIGNwdV9jb3JlLT54b3JbaS0xXSA9IG1hc2s7Ci0JICAgICAgbWFzayA9IChtYXNrIDw8IDEpICYgKFdJVEhfWE9SX0VORElBTiAtIDEpOwotCSAgICAgIGkgPSAoaSA8PCAxKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaXNfeG9yKQotCSAgICBjb3JlLT5ieXRlX3hvciA9IFdJVEhfWE9SX0VORElBTiAtIDE7Ci0JICBlbHNlCi0JICAgIGNvcmUtPmJ5dGVfeG9yID0gMDsKLQl9CSAgCi0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGlmIChpc194b3IpCi0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsCi0JCQkiQXR0ZW1wdGVkIHRvIGVuYWJsZSB4b3ItZW5kaWFuIG1vZGUgd2hlbiBwZXJtZW5hbnRseSBkaXNhYmxlZC4iKTsKLSAgfQotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi1zdGF0aWMgdm9pZAotcmV2ZXJzZV9uICh1bnNpZ25lZF8xICpkZXN0LAotCSAgIGNvbnN0IHVuc2lnbmVkXzEgKnNyYywKLQkgICBpbnQgbnJfYnl0ZXMpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykKLSAgICB7Ci0gICAgICBkZXN0IFtucl9ieXRlcyAtIGkgLSAxXSA9IHNyYyBbaV07Ci0gICAgfQotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fQ09SRV9QCi11bnNpZ25lZAotc2ltX2NvcmVfeG9yX3JlYWRfYnVmZmVyIChTSU1fREVTQyBzZCwKLQkJCSAgc2ltX2NwdSAqY3B1LAotCQkJICB1bnNpZ25lZCBtYXAsCi0JCQkgIHZvaWQgKmJ1ZmZlciwKLQkJCSAgYWRkcmVzc193b3JkIGFkZHIsCi0JCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBhZGRyZXNzX3dvcmQgYnl0ZV94b3IgPSAoY3B1ID09IE5VTEwgPyBTVEFURV9DT1JFIChzZCktPmJ5dGVfeG9yIDogQ1BVX0NPUkUgKGNwdSktPnhvclswXSk7Ci0gIGlmICghV0lUSF9YT1JfRU5ESUFOIHx8ICFieXRlX3hvcikKLSAgICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIG1hcCwgYnVmZmVyLCBhZGRyLCBucl9ieXRlcyk7Ci0gIGVsc2UKLSAgICAvKiBvbmx5IGJyZWFrIHVwIHRyYW5zZmVycyB3aGVuIHhvci1lbmRpYW4gaXMgYm90aCBzZWxlY3RlZCBhbmQgZW5hYmxlZCAqLwotICAgIHsKLSAgICAgIHVuc2lnbmVkXzEgeFtXSVRIX1hPUl9FTkRJQU4gKyAxXTsgLyogKzEgdG8gYXZvaWQgemVyby1zaXplZCBhcnJheSAqLwotICAgICAgdW5zaWduZWQgbnJfdHJhbnNmZXJlZCA9IDA7Ci0gICAgICBhZGRyZXNzX3dvcmQgc3RhcnQgPSBhZGRyOwotICAgICAgdW5zaWduZWQgbnJfdGhpc190cmFuc2ZlciA9IChXSVRIX1hPUl9FTkRJQU4gLSAoYWRkciAmIH4oV0lUSF9YT1JfRU5ESUFOIC0gMSkpKTsKLSAgICAgIGFkZHJlc3Nfd29yZCBzdG9wOwotICAgICAgLyogaW5pdGlhbCBhbmQgaW50ZXJtZWRpYXRlIHRyYW5zZmVycyBhcmUgYnJva2VuIHdoZW4gdGhleSBjcm9zcwotICAgICAgICAgYW4gWE9SIGVuZGlhbiBib3VuZGFyeSAqLwotICAgICAgd2hpbGUgKG5yX3RyYW5zZmVyZWQgKyBucl90aGlzX3RyYW5zZmVyIDwgbnJfYnl0ZXMpCi0JLyogaW5pdGlhbC9pbnRlcm1lZGlhdGUgdHJhbnNmZXJzICovCi0JewotCSAgLyogc2luY2UgeG9yLWVuZGlhbiBpcyBlbmFibGVkIHN0b3BeeG9yIGRlZmluZXMgdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgKi8KLQkgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOwotCSAgU0lNX0FTU0VSVCAoc3RhcnQgPD0gc3RvcCk7Ci0JICBTSU1fQVNTRVJUICgoc3RvcCBeIGJ5dGVfeG9yKSA8PSAoc3RhcnQgXiBieXRlX3hvcikpOwotCSAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCBtYXAsIHgsIHN0b3AgXiBieXRlX3hvciwgbnJfdGhpc190cmFuc2ZlcikKLQkgICAgICAhPSBucl90aGlzX3RyYW5zZmVyKQotCSAgICByZXR1cm4gbnJfdHJhbnNmZXJlZDsKLQkgIHJldmVyc2VfbiAoJigodW5zaWduZWRfMSopYnVmZmVyKVtucl90cmFuc2ZlcmVkXSwgeCwgbnJfdGhpc190cmFuc2Zlcik7Ci0JICBucl90cmFuc2ZlcmVkICs9IG5yX3RoaXNfdHJhbnNmZXI7Ci0JICBucl90aGlzX3RyYW5zZmVyID0gV0lUSF9YT1JfRU5ESUFOOwotCSAgc3RhcnQgPSBzdG9wICsgMTsKLQl9Ci0gICAgICAvKiBmaW5hbCB0cmFuc2ZlciAqLwotICAgICAgbnJfdGhpc190cmFuc2ZlciA9IG5yX2J5dGVzIC0gbnJfdHJhbnNmZXJlZDsKLSAgICAgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOwotICAgICAgU0lNX0FTU0VSVCAoc3RvcCA9PSAoYWRkciArIG5yX2J5dGVzIC0gMSkpOwotICAgICAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCBtYXAsIHgsIHN0b3AgXiBieXRlX3hvciwgbnJfdGhpc190cmFuc2ZlcikKLQkgICE9IG5yX3RoaXNfdHJhbnNmZXIpCi0JcmV0dXJuIG5yX3RyYW5zZmVyZWQ7Ci0gICAgICByZXZlcnNlX24gKCYoKHVuc2lnbmVkXzEqKWJ1ZmZlcilbbnJfdHJhbnNmZXJlZF0sIHgsIG5yX3RoaXNfdHJhbnNmZXIpOwotICAgICAgcmV0dXJuIG5yX2J5dGVzOwotICAgIH0KLX0KLSNlbmRpZgotICAKLSAgCi0jaWYgRVhURVJOX1NJTV9DT1JFX1AKLXVuc2lnbmVkCi1zaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyIChTSU1fREVTQyBzZCwKLQkJCSAgIHNpbV9jcHUgKmNwdSwKLQkJCSAgIHVuc2lnbmVkIG1hcCwKLQkJCSAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJCSAgIGFkZHJlc3Nfd29yZCBhZGRyLAotCQkJICAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIGFkZHJlc3Nfd29yZCBieXRlX3hvciA9IChjcHUgPT0gTlVMTCA/IFNUQVRFX0NPUkUgKHNkKS0+Ynl0ZV94b3IgOiBDUFVfQ09SRSAoY3B1KS0+eG9yWzBdKTsKLSAgaWYgKCFXSVRIX1hPUl9FTkRJQU4gfHwgIWJ5dGVfeG9yKQotICAgIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIG1hcCwgYnVmZmVyLCBhZGRyLCBucl9ieXRlcyk7Ci0gIGVsc2UKLSAgICAvKiBvbmx5IGJyZWFrIHVwIHRyYW5zZmVycyB3aGVuIHhvci1lbmRpYW4gaXMgYm90aCBzZWxlY3RlZCBhbmQgZW5hYmxlZCAqLwotICAgIHsKLSAgICAgIHVuc2lnbmVkXzEgeFtXSVRIX1hPUl9FTkRJQU4gKyAxXTsgLyogKzEgdG8gYXZvaWQgemVybyBzaXplZCBhcnJheSAqLwotICAgICAgdW5zaWduZWQgbnJfdHJhbnNmZXJlZCA9IDA7Ci0gICAgICBhZGRyZXNzX3dvcmQgc3RhcnQgPSBhZGRyOwotICAgICAgdW5zaWduZWQgbnJfdGhpc190cmFuc2ZlciA9IChXSVRIX1hPUl9FTkRJQU4gLSAoYWRkciAmIH4oV0lUSF9YT1JfRU5ESUFOIC0gMSkpKTsKLSAgICAgIGFkZHJlc3Nfd29yZCBzdG9wOwotICAgICAgLyogaW5pdGlhbCBhbmQgaW50ZXJtZWRpYXRlIHRyYW5zZmVycyBhcmUgYnJva2VuIHdoZW4gdGhleSBjcm9zcwotICAgICAgICAgYW4gWE9SIGVuZGlhbiBib3VuZGFyeSAqLwotICAgICAgd2hpbGUgKG5yX3RyYW5zZmVyZWQgKyBucl90aGlzX3RyYW5zZmVyIDwgbnJfYnl0ZXMpCi0JLyogaW5pdGlhbC9pbnRlcm1lZGlhdGUgdHJhbnNmZXJzICovCi0JewotCSAgLyogc2luY2UgeG9yLWVuZGlhbiBpcyBlbmFibGVkIHN0b3BeeG9yIGRlZmluZXMgdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgKi8KLQkgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOwotCSAgU0lNX0FTU0VSVCAoc3RhcnQgPD0gc3RvcCk7Ci0JICBTSU1fQVNTRVJUICgoc3RvcCBeIGJ5dGVfeG9yKSA8PSAoc3RhcnQgXiBieXRlX3hvcikpOwotCSAgcmV2ZXJzZV9uICh4LCAmKCh1bnNpZ25lZF8xKilidWZmZXIpW25yX3RyYW5zZmVyZWRdLCBucl90aGlzX3RyYW5zZmVyKTsKLQkgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgbWFwLCB4LCBzdG9wIF4gYnl0ZV94b3IsIG5yX3RoaXNfdHJhbnNmZXIpCi0JICAgICAgIT0gbnJfdGhpc190cmFuc2ZlcikKLQkgICAgcmV0dXJuIG5yX3RyYW5zZmVyZWQ7Ci0JICBucl90cmFuc2ZlcmVkICs9IG5yX3RoaXNfdHJhbnNmZXI7Ci0JICBucl90aGlzX3RyYW5zZmVyID0gV0lUSF9YT1JfRU5ESUFOOwotCSAgc3RhcnQgPSBzdG9wICsgMTsKLQl9Ci0gICAgICAvKiBmaW5hbCB0cmFuc2ZlciAqLwotICAgICAgbnJfdGhpc190cmFuc2ZlciA9IG5yX2J5dGVzIC0gbnJfdHJhbnNmZXJlZDsKLSAgICAgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOwotICAgICAgU0lNX0FTU0VSVCAoc3RvcCA9PSAoYWRkciArIG5yX2J5dGVzIC0gMSkpOwotICAgICAgcmV2ZXJzZV9uICh4LCAmKCh1bnNpZ25lZF8xKilidWZmZXIpW25yX3RyYW5zZmVyZWRdLCBucl90aGlzX3RyYW5zZmVyKTsKLSAgICAgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgbWFwLCB4LCBzdG9wIF4gYnl0ZV94b3IsIG5yX3RoaXNfdHJhbnNmZXIpCi0JICAhPSBucl90aGlzX3RyYW5zZmVyKQotCXJldHVybiBucl90cmFuc2ZlcmVkOwotICAgICAgcmV0dXJuIG5yX2J5dGVzOwotICAgIH0KLX0KLSNlbmRpZgotCi0KLQotLyogZGVmaW5lIHRoZSByZWFkL3dyaXRlIDEvMi80LzgvMTYvd29yZCBmdW5jdGlvbnMgKi8KLQotI2RlZmluZSBOIDE2Ci0jaW5jbHVkZSAic2ltLW4tY29yZS5oIgotCi0jZGVmaW5lIE4gOAotI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKLQotI2RlZmluZSBOIDcKLSNkZWZpbmUgTSA4Ci0jaW5jbHVkZSAic2ltLW4tY29yZS5oIgotCi0jZGVmaW5lIE4gNgotI2RlZmluZSBNIDgKLSNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCi0KLSNkZWZpbmUgTiA1Ci0jZGVmaW5lIE0gOAotI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKLQotI2RlZmluZSBOIDQKLSNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCi0KLSNkZWZpbmUgTiAzCi0jZGVmaW5lIE0gNAotI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKLQotI2RlZmluZSBOIDIKLSNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCi0KLSNkZWZpbmUgTiAxCi0jaW5jbHVkZSAic2ltLW4tY29yZS5oIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNvcmUuaCBiL3NpbS9jb21tb24vc2ltLWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNTY5ZS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBTSU1fQ09SRV9ICi0jZGVmaW5lIFNJTV9DT1JFX0gKLQotCi0vKiBjb3JlIHNpZ25hbHMgKGVycm9yIGNvbmRpdGlvbnMpCi0gICBEZWZpbmUgU0lNX0NPUkVfU0lHTkFMIHRvIGNhdGNoIHRoZXNlIHNpZ25hbHMgLSBzZWUgc2ltLWNvcmUuYyBmb3IKLSAgIGRldGFpbHMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBzaW1fY29yZV91bm1hcHBlZF9zaWduYWwsCi0gIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwsCi0gIG5yX3NpbV9jb3JlX3NpZ25hbHMsCi19IHNpbV9jb3JlX3NpZ25hbHM7Ci0KLS8qIFR5cGUgb2YgU0lNX0NPUkVfU0lHTkFMIGhhbmRsZXIuICAqLwotdHlwZWRlZiB2b2lkIChTSU1fQ09SRV9TSUdOQUxfRk4pCi0gICAgIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBzaW1fY2lhIGNpYSwgdW5zaWduZWQgbWFwLCBpbnQgbnJfYnl0ZXMsCi0gICAgICBhZGRyZXNzX3dvcmQgYWRkciwgdHJhbnNmZXJfdHlwZSB0cmFuc2Zlciwgc2ltX2NvcmVfc2lnbmFscyBzaWcpOwotCi1leHRlcm4gU0lNX0NPUkVfU0lHTkFMX0ZOIHNpbV9jb3JlX3NpZ25hbDsKLQotCi0vKiBiYXNpYyB0eXBlcyAqLwotCi10eXBlZGVmIHN0cnVjdCBfc2ltX2NvcmVfbWFwcGluZyBzaW1fY29yZV9tYXBwaW5nOwotc3RydWN0IF9zaW1fY29yZV9tYXBwaW5nIHsKLSAgLyogY29tbW9uICovCi0gIGludCBsZXZlbDsKLSAgaW50IHNwYWNlOwotICB1bnNpZ25lZF93b3JkIGJhc2U7Ci0gIHVuc2lnbmVkX3dvcmQgYm91bmQ7Ci0gIHVuc2lnbmVkX3dvcmQgbnJfYnl0ZXM7Ci0gIHVuc2lnbmVkIG1hc2s7Ci0gIC8qIG1lbW9yeSBtYXAgKi8KLSAgdm9pZCAqZnJlZV9idWZmZXI7Ci0gIHZvaWQgKmJ1ZmZlcjsKLSAgLyogY2FsbGJhY2sgbWFwICovCi0jaWYgKFdJVEhfSFcpCi0gIHN0cnVjdCBodyAqZGV2aWNlOwotI2Vsc2UKLSAgZGV2aWNlICpkZXZpY2U7Ci0jZW5kaWYKLSAgLyogdHJhY2luZyAqLwotICBpbnQgdHJhY2U7Ci0gIC8qIGdyb3d0aCAqLwotICBzaW1fY29yZV9tYXBwaW5nICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9jb3JlX21hcCBzaW1fY29yZV9tYXA7Ci1zdHJ1Y3QgX3NpbV9jb3JlX21hcCB7Ci0gIHNpbV9jb3JlX21hcHBpbmcgKmZpcnN0OwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfc2ltX2NvcmVfY29tbW9uIHsKLSAgc2ltX2NvcmVfbWFwIG1hcFtucl9tYXBzXTsKLX0gc2ltX2NvcmVfY29tbW9uOwotCi0KLS8qIE1haW4gY29yZSBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9jb3JlIHNpbV9jb3JlOwotc3RydWN0IF9zaW1fY29yZSB7Ci0gIHNpbV9jb3JlX2NvbW1vbiBjb21tb247Ci0gIGFkZHJlc3Nfd29yZCBieXRlX3hvcjsgLyogYXBwbHkgeG9yIHVuaXZlcnNhbGx5ICovCi19OwotCi0KLS8qIFBlciBDUFUgZGlzdHJpYnV0ZWQgY29tcG9uZW50IG9mIHRoZSBjb3JlLiAgQXQgcHJlc2VudCB0aGlzIGlzCi0gICBtb3N0bHkgYSBjbG9uZSBvZiB0aGUgZ2xvYmFsIGNvcmUgZGF0YSBzdHJ1Y3R1cmUuICovCi0KLXR5cGVkZWYgc3RydWN0IF9zaW1fY3B1X2NvcmUgewotICBzaW1fY29yZV9jb21tb24gY29tbW9uOwotICBhZGRyZXNzX3dvcmQgeG9yW1dJVEhfWE9SX0VORElBTiArIDFdOyAvKiArMSB0byBhdm9pZCB6ZXJvLXNpemVkIGFycmF5ICovCi19IHNpbV9jcHVfY29yZTsKLQotCi0vKiBJbnN0YWxsIHRoZSAiY29yZSIgbW9kdWxlLiAgKi8KLQotZXh0ZXJuIFNJTV9SQyBzaW1fY29yZV9pbnN0YWxsIChTSU1fREVTQyBzZCk7Ci0KLQotCi0vKiBDcmVhdGUgYSBtZW1vcnkgcmVnaW9uIHdpdGhpbiB0aGUgY29yZS4KLQotICAgQ1BVIC0gd2hlbiBub24gTlVMTCwgc3BlY2lmZXMgdGhlIHNpbmdsZSBwcm9jZXNzb3IgdGhhdCB0aGUgbWVtb3J5Ci0gICBzcGFjZSBpcyB0byBiZSBhdHRhY2hlZCB0by4gKElOSU1QTEVNRU5URUQpLgotCi0gICBMRVZFTCAtIHNwZWNpZmllcyB0aGUgb3JkZXJpbmcgb2YgdGhlIG1lbW9yeSByZWdpb24uICBMb3dlciByZWdpb25zCi0gICBhcmUgc2VhcmNoZWQgZmlyc3QuICBXaXRoaW4gYSBsZXZlbCwgbWVtb3J5IHJlZ2lvbnMgY2FuIG5vdAotICAgb3ZlcmxhcC4KLQotICAgTUFQTUFTSyAtIEJpdG1hc2sgc3BlY2lmeWluZyB0aGUgbWVtb3J5IG1hcHMgdGhhdCB0aGUgcmVnaW9uIGlzIHRvCi0gICBiZSBhdHRhY2hlZCB0by4gIFR5cGljYWxseSB0aGUgZW51bXMgc2ltLWJhc2ljcy5oOmFjY2Vzc18qIGFyZSB1c2VkLgotCi0gICBBRERSRVNTX1NQQUNFIC0gRm9yIGRldmljZSByZWdpb25zLCBhIE1BUDpBRERSRVNTIHBhaXIgaXMKLSAgIHRyYW5zbGF0ZWQgaW50byBBRERSRVNTX1NQQUNFOk9GRlNFVCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZQotICAgY2xpZW50IGRldmljZS4KLQotICAgTU9EVUxPIC0gd2hlbiB0aGUgc2ltdWxhdG9yIGhhcyBiZWVuIGNvbmZpZ3VyZWQgV0lUSF9NT0RVTE8gc3VwcG9ydAotICAgYW5kIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCBzcGVjaWZpZXMgdGhhdCBhY2Nlc3NlcyB0byB0aGUgcmVnaW9uCi0gICBbQUREUiAuLiBBRERSK05SX0JZVEVTKSBzaG91bGQgYmUgbWFwcGVkIG9udG8gdGhlIHN1YiByZWdpb24gW0FERFIKLSAgIC4uIEFERFIrTU9EVUxPKS4gIFRoZSBtb2R1bG8gdmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KLQotICAgREVWSUNFIC0gV2hlbiBub24gTlVMTCwgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIGNhbGxiYWNrIG1lbW9yeQotICAgc3BhY2UgYW5kIHNwZWNpZmllZCBkZXZpY2UncyBtZW1vcnkgY2FsbGJhY2sgaGFuZGxlciBzaG91bGQgYmUKLSAgIGNhbGxlZC4KLQotICAgT1BUSU9OQUxfQlVGRkVSIC0gd2hlbiBub24gTlVMTCwgc3BlY2lmaWVzIHRoZSBidWZmZXIgdG8gdXNlIGZvcgotICAgZGF0YSByZWFkICYgd3JpdHRlbiB0byB0aGUgcmVnaW9uLiAgTm9ybWFsbHkgYSBtb3JlIGVmZmljaWVudAotICAgaW50ZXJuYWwgc3RydWN0dXJlIGlzIHVzZWQuICBJdCBpcyBhc3N1bWVkIHRoYXQgYnVmZmVyIGlzIGFsbG9jYXRlZAotICAgc3VjaCB0aGF0IHRoZSBieXRlIGFsaWdubWVkIG9mIE9QVElPTkFMX0JVRkZFUiBtYXRjaGVzIEFERFIgdmlzCi0gICAoT1BUSU9OQUxfQlVGRkVSICUgOCkgPT0gKEFERFIgJSA4KSkuICBJdCBpcyBkZWZpbmVkIHRvIGJlIGEgc3ViLW9wdGltYWwKLSAgIGhvb2sgdGhhdCBhbGxvd3MgY2xpZW50cyB0byBkbyBuYXN0eSB0aGluZ3MgdGhhdCB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKLSAgIGFjY29tb2RhdGUuICovCi0KLWV4dGVybiB2b2lkIHNpbV9jb3JlX2F0dGFjaAotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSBpbnQgbGV2ZWwsCi0gdW5zaWduZWQgbWFwbWFzaywKLSBpbnQgYWRkcmVzc19zcGFjZSwKLSBhZGRyZXNzX3dvcmQgYWRkciwKLSBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCi0gdW5zaWduZWQgbW9kdWxvLAotI2lmIChXSVRIX0hXKQotIHN0cnVjdCBodyAqY2xpZW50LAotI2Vsc2UKLSBkZXZpY2UgKmNsaWVudCwKLSNlbmRpZgotIHZvaWQgKm9wdGlvbmFsX2J1ZmZlcik7Ci0KLQotLyogRGVsZXRlIGEgbWVtb3J5IHNlY3Rpb24gd2l0aGluIHRoZSBjb3JlLgotCi0gKi8KLQotZXh0ZXJuIHZvaWQgc2ltX2NvcmVfZGV0YWNoCi0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqY3B1LAotIGludCBsZXZlbCwKLSBpbnQgYWRkcmVzc19zcGFjZSwKLSBhZGRyZXNzX3dvcmQgYWRkcik7Ci0KLQotLyogVmFyaWFibGUgc2l6ZWQgcmVhZC93cml0ZQotCi0gICBUcmFuc2ZlciBhIHZhcmlhYmxlIHNpemVkIGJsb2NrIG9mIHJhdyBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kCi0gICB0YXJnZXQuICBTaG91bGQgYW55IHByb2JsZW1zIG9jY3VyZSwgdGhlIG51bWJlciBvZiBieXRlcwotICAgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVyZWQgaXMgcmV0dXJuZWQuCi0KLSAgIE5vIGhvc3QvdGFyZ2V0IGJ5dGUgZW5kaWFuIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLiAgTm8geG9yLWVuZGlhbgotICAgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQuCi0KLSAgIElmIENQVSBhcmd1bWVudCwgd2hlbiBub24gTlVMTCwgc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMKLSAgIGFkZHJlc3MgbWFwIHRoYXQgaXMgdG8gYmUgdXNlZCBpbiB0aGUgdHJhbnNmZXIuICovCi0KLQotZXh0ZXJuIHVuc2lnbmVkIHNpbV9jb3JlX3JlYWRfYnVmZmVyCi0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqY3B1LAotIHVuc2lnbmVkIG1hcCwKLSB2b2lkICpidWZmZXIsCi0gYWRkcmVzc193b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi1leHRlcm4gdW5zaWduZWQgc2ltX2NvcmVfd3JpdGVfYnVmZmVyCi0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqY3B1LAotIHVuc2lnbmVkIG1hcCwKLSBjb25zdCB2b2lkICpidWZmZXIsCi0gYWRkcmVzc193b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi0KLQotLyogQ29uZmlndXJlIHRoZSBjb3JlJ3MgWE9SIGVuZGlhbiB0cmFuc2ZlciBtb2RlLiAgT25seSBhcHBsaWNhYmxlCi0gICB3aGVuIFdJVEhfWE9SX0VORElBTiBpcyBlbmFibGVkLgotCi0gICBUYXJnZXRzIHN1cG9ydGluZyBYT1IgZW5kaWFuLCBzaGFsbCBub3RpZnkgdGhlIGNvcmUgb2YgYW55IGNoYW5nZXMKLSAgIGluIHN0YXRlIHZpYSB0aGlzIGNhbGwuCi0KLSAgIFRoZSBDUFUgYXJndW1lbnQsIHdoZW4gbm9uIE5VTEwsIHNwZWNpZmVzIHRoZSBzaW5nbGUgcHJvY2Vzc29yIHRoYXQKLSAgIHRoZSB4b3ItZW5kaWFuIGNvbmZpZ3VyYXRpb24gaXMgdG8gYmUgYXBwbGllZCB0by4gKi8KLQotZXh0ZXJuIHZvaWQgc2ltX2NvcmVfc2V0X3hvcgotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSBpbnQgaXNfeG9yKTsKLQotCi0vKiBYT1IgdmVyc2lvbiBvZiB2YXJpYWJsZSBzaXplZCByZWFkL3dyaXRlLgotCi0gICBUcmFuc2ZlciBhIHZhcmlhYmxlIHNpemVkIGJsb2NrIG9mIHJhdyBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kCi0gICB0YXJnZXQuICBTaG91bGQgYW55IHByb2JsZW1zIG9jY3VyZSwgdGhlIG51bWJlciBvZiBieXRlcwotICAgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVyZWQgaXMgcmV0dXJuZWQuCi0KLSAgIE5vIGhvc3QvdGFyZ2V0IGJ5dGUgZW5kaWFuIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLiAgSWYgYXBwbGljYWJsZQotICAgKFdJVEhfWE9SX0VORElBTiBhbmQgeG9yLWVuZGlhbiBzZXQpLCB4b3ItZW5kaWFuIGNvbnZlcnNpb24gKmlzKgotICAgcGVyZm9ybWVkLgotCi0gICBJZiBDUFUgYXJndW1lbnQsIHdoZW4gbm9uIE5VTEwsIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIHNwZWNpZmljCi0gICBhZGRyZXNzIG1hcCB0aGF0IGlzIHRvIGJlIHVzZWQgaW4gdGhlIHRyYW5zZmVyLiAqLwotCi1leHRlcm4gdW5zaWduZWQgc2ltX2NvcmVfeG9yX3JlYWRfYnVmZmVyCi0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqY3B1LAotIHVuc2lnbmVkIG1hcCwKLSB2b2lkICpidWZmZXIsCi0gYWRkcmVzc193b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi1leHRlcm4gdW5zaWduZWQgc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlcgotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSB1bnNpZ25lZCBtYXAsCi0gY29uc3Qgdm9pZCAqYnVmZmVyLAotIGFkZHJlc3Nfd29yZCBhZGRyLAotIHVuc2lnbmVkIG5yX2J5dGVzKTsKLQotCi0KLS8qIEZpeGVkIHNpemVkLCBwcm9jZXNzb3Igb3JpZW50ZWQsIHJlYWQvd3JpdGUuCi0KLSAgIFRyYW5zZmVyIGEgZml4ZWQgYW1vdXQgb2YgbWVtb3J5IGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldC4gIFRoZQotICAgZGF0YSB0cmFuc2ZlcmVkIGlzIHRyYW5zbGF0ZWQgZnJvbS90byBob3N0IHRvL2Zyb20gdGFyZ2V0IGJ5dGUKLSAgIG9yZGVyIChpbmNsdWRpbmcgeG9yIGVuZGlhbikuICBTaG91bGQgdGhlIHRyYW5zZmVyIGZhaWwsIHRoZQotICAgb3BlcmF0aW9uIHNoYWxsIGFib3J0IChubyByZXR1cm4pLgotCi0gICBBTElHTkVEIGFzc3VtZXMgeWhhdCB0aGUgc3BlY2lmaWVkIEFERFJFU1MgaXMgY29ycmVjdGx5IGFsbGlnbmVkCi0gICBmb3IgYW4gTiBieXRlIHRyYW5zZmVyIChubyBhbGlnbm1lbnQgY2hlY2tzIGFyZSBtYWRlKS4gIFBhc3NpbmcgYW4KLSAgIGluY29ycmVjdGx5IGFsaWduZWQgQUREUkVTUyBpcyBlcnJvbmVvdXMuCi0KLSAgIFVOQUxJR05FRCBjaGVja3MvbW9kaWZpZXMgdGhlIEFERFJFU1MgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMKLSAgIG9mIGFuIE4gYnl0ZSB0cmFuc2Zlci4gQWN0aW9uLCBhcyBkZWZpbmVkIGJ5IFdJVEhfQUxJR05NRU5ULCBiZWluZwotICAgdGFrZW4gc2hvdWxkIHRoZSBjaGVjayBmYWlsLgotCi0gICBNSVNTQUxJR05FRCB0cmFuc2ZlcnMgdGhlIGRhdGEgcmVnYXJkbGVzcy4KLQotICAgTWlzYWxpZ25lZCB4b3ItZW5kaWFuIGFjY2Vzc2VzIGFyZSBicm9rZW4gaW50byBhIHNlcXVlbmNlIG9mCi0gICB0cmFuc2ZlcnMgZWFjaCA8PSBXSVRIX1hPUl9FTkRJQU4gYnl0ZXMgKi8KLQotCi0jZGVmaW5lIERFQ0xBUkVfU0lNX0NPUkVfV1JJVEVfTihBTElHTk1FTlQsTixNKSBcCi1JTkxJTkVfU0lNX0NPUkVcCi0odm9pZCkgc2ltX2NvcmVfd3JpdGVfIyNBTElHTk1FTlQjI18jI04gXAotKHNpbV9jcHUgKmNwdSwgXAotIHNpbV9jaWEgY2lhLCBcCi0gdW5zaWduZWQgbWFwLCBcCi0gYWRkcmVzc193b3JkIGFkZHIsIFwKLSB1bnNpZ25lZF8jI00gdmFsKTsKLQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKGFsaWduZWQsMSwxKQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKGFsaWduZWQsMiwyKQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKGFsaWduZWQsNCw0KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKGFsaWduZWQsOCw4KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKGFsaWduZWQsMTYsMTYpCi0KLSNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzEgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xIAotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKHVuYWxpZ25lZCwyLDIpCi1ERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04odW5hbGlnbmVkLDQsNCkKLURFQ0xBUkVfU0lNX0NPUkVfV1JJVEVfTih1bmFsaWduZWQsOCw4KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKHVuYWxpZ25lZCwxNiwxNikKLQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKG1pc2FsaWduZWQsMyw0KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKG1pc2FsaWduZWQsNSw4KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKG1pc2FsaWduZWQsNiw4KQotREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKG1pc2FsaWduZWQsNyw4KQotCi0jZGVmaW5lIHNpbV9jb3JlX3dyaXRlXzEgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xCi0jZGVmaW5lIHNpbV9jb3JlX3dyaXRlXzIgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8yCi0jZGVmaW5lIHNpbV9jb3JlX3dyaXRlXzQgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF80Ci0jZGVmaW5lIHNpbV9jb3JlX3dyaXRlXzggc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF84Ci0jZGVmaW5lIHNpbV9jb3JlX3dyaXRlXzE2IHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfMTYKLQotI2RlZmluZSBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfd29yZCBYQ09OQ0FUMihzaW1fY29yZV93cml0ZV91bmFsaWduZWRfLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSkKLSNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF93b3JkIFhDT05DQVQyKHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSkKLSNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfd29yZCBYQ09OQ0FUMihzaW1fY29yZV93cml0ZV8sV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKQotCi0jdW5kZWYgREVDTEFSRV9TSU1fQ09SRV9XUklURV9OCi0KLQotI2RlZmluZSBERUNMQVJFX1NJTV9DT1JFX1JFQURfTihBTElHTk1FTlQsTixNKSBcCi1JTkxJTkVfU0lNX0NPUkVcCi0odW5zaWduZWRfIyNNKSBzaW1fY29yZV9yZWFkXyMjQUxJR05NRU5UIyNfIyNOIFwKLShzaW1fY3B1ICpjcHUsIFwKLSBzaW1fY2lhIGNpYSwgXAotIHVuc2lnbmVkIG1hcCwgXAotIGFkZHJlc3Nfd29yZCBhZGRyKTsKLQotREVDTEFSRV9TSU1fQ09SRV9SRUFEX04oYWxpZ25lZCwxLDEpCi1ERUNMQVJFX1NJTV9DT1JFX1JFQURfTihhbGlnbmVkLDIsMikKLURFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKGFsaWduZWQsNCw0KQotREVDTEFSRV9TSU1fQ09SRV9SRUFEX04oYWxpZ25lZCw4LDgpCi1ERUNMQVJFX1NJTV9DT1JFX1JFQURfTihhbGlnbmVkLDE2LDE2KQotCi0jZGVmaW5lIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzEgc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzEKLURFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKHVuYWxpZ25lZCwyLDIpCi1ERUNMQVJFX1NJTV9DT1JFX1JFQURfTih1bmFsaWduZWQsNCw0KQotREVDTEFSRV9TSU1fQ09SRV9SRUFEX04odW5hbGlnbmVkLDgsOCkKLURFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKHVuYWxpZ25lZCwxNiwxNikKLQotREVDTEFSRV9TSU1fQ09SRV9SRUFEX04obWlzYWxpZ25lZCwzLDQpCi1ERUNMQVJFX1NJTV9DT1JFX1JFQURfTihtaXNhbGlnbmVkLDUsOCkKLURFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKG1pc2FsaWduZWQsNiw4KQotREVDTEFSRV9TSU1fQ09SRV9SRUFEX04obWlzYWxpZ25lZCw3LDgpCi0KLQotI2RlZmluZSBzaW1fY29yZV9yZWFkXzEgc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzEKLSNkZWZpbmUgc2ltX2NvcmVfcmVhZF8yIHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8yCi0jZGVmaW5lIHNpbV9jb3JlX3JlYWRfNCBzaW1fY29yZV9yZWFkX2FsaWduZWRfNAotI2RlZmluZSBzaW1fY29yZV9yZWFkXzggc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzgKLSNkZWZpbmUgc2ltX2NvcmVfcmVhZF8xNiBzaW1fY29yZV9yZWFkX2FsaWduZWRfMTYKLQotI2RlZmluZSBzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF93b3JkIFhDT05DQVQyKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpCi0jZGVmaW5lIHNpbV9jb3JlX3JlYWRfYWxpZ25lZF93b3JkIFhDT05DQVQyKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8sV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKQotI2RlZmluZSBzaW1fY29yZV9yZWFkX3dvcmQgWENPTkNBVDIoc2ltX2NvcmVfcmVhZF8sV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKQotCi0jdW5kZWYgREVDTEFSRV9TSU1fQ09SRV9SRUFEX04KLQotCi0jaWYgKFdJVEhfREVWSUNFUykKLS8qIFRPRE86IGNyZWF0ZSBzaW0vY29tbW9uL2RldmljZS5oICovCi0vKiBUaGVzZSBhcmUgZGVmaW5lZCB3aXRoIGVhY2ggcGFydGljdWxhciBjcHUuICAqLwotdm9pZCBkZXZpY2VfZXJyb3IgKGRldmljZSAqbWUsIGNoYXIqIG1lc3NhZ2UsIC4uLik7Ci1pbnQgZGV2aWNlX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsIHZvaWQgKmRlc3QsIGludCBzcGFjZSwgYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLCBTSU1fREVTQyBzZCwgc2ltX2NwdSAqcHJvY2Vzc29yLCBzaW1fY2lhIGNpYSk7Ci1pbnQgZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLCBjb25zdCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwgYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLCBTSU1fREVTQyBzZCwgc2ltX2NwdSAqcHJvY2Vzc29yLCBzaW1fY2lhIGNpYSk7Ci0jZW5kaWYKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNwdS5jIGIvc2ltL2NvbW1vbi9zaW0tY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmQ1MmMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tY3B1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBDUFUgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgY3B1cyBpbiB0aGUgc2ltdWxhdG9yLgotICAgU3BhY2UgZm9yIHRoZSBjcHUgbXVzdCBjdXJyZW50bHkgZXhpc3QgcHJpb3IgdG8gcGFyc2luZyBBUkdWLgotICAgRVhUUkFfQllURVMgaXMgYWRkaXRpb25hbCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdGhlIHNpbV9jcHUgc3RydWN0LiAgKi8KLS8qID8/PyB3aXAuICBiZXR0ZXIgc29sdXRpb24gbXVzdCB3YWl0LiAgKi8KLQotU0lNX1JDCi1zaW1fY3B1X2FsbG9jX2FsbCAoU0lNX0RFU0Mgc2QsIGludCBuY3B1cywgaW50IGV4dHJhX2J5dGVzKQotewotICBpbnQgYzsKLQotICBmb3IgKGMgPSAwOyBjIDwgbmNwdXM7ICsrYykKLSAgICBTVEFURV9DUFUgKHNkLCBjKSA9IHNpbV9jcHVfYWxsb2MgKHNkLCBleHRyYV9ieXRlcyk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNwdSBvYmplY3QuCi0gICBFWFRSQV9CWVRFUyBpcyBhZGRpdGlvbmFsIHNwYWNlIHRvIGFsbG9jYXRlIGZvciB0aGUgc2ltX2NwdSBzdHJ1Y3QuICAqLwotCi1zaW1fY3B1ICoKLXNpbV9jcHVfYWxsb2MgKFNJTV9ERVNDIHNkLCBpbnQgZXh0cmFfYnl0ZXMpCi17Ci0gIHJldHVybiB6YWxsb2MgKHNpemVvZiAoc2ltX2NwdSkgKyBleHRyYV9ieXRlcyk7Ci19Ci0KLS8qIEZyZWUgYWxsIHJlc291cmNlcyBoZWxkIGJ5IGFsbCBjcHVzLiAgKi8KLQotdm9pZAotc2ltX2NwdV9mcmVlX2FsbCAoU0lNX0RFU0Mgc2QpCi17Ci0gIGludCBjOwotCi0gIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQotICAgIGlmIChTVEFURV9DUFUgKHNkLCBjKSkKLSAgICAgIHNpbV9jcHVfZnJlZSAoU1RBVEVfQ1BVIChzZCwgYykpOwotfQotCi0vKiBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSBDUFUuICAqLwotCi12b2lkCi1zaW1fY3B1X2ZyZWUgKHNpbV9jcHUgKmNwdSkKLXsKLSAgemZyZWUgKGNwdSk7Ci19Ci0MCi0vKiBQQyB1dGlsaXRpZXMuICAqLwotCi1zaW1fY2lhCi1zaW1fcGNfZ2V0IChzaW1fY3B1ICpjcHUpCi17Ci0gIHJldHVybiAoKiBDUFVfUENfRkVUQ0ggKGNwdSkpIChjcHUpOwotfQotCi12b2lkCi1zaW1fcGNfc2V0IChzaW1fY3B1ICpjcHUsIHNpbV9jaWEgbmV3dmFsKQotewotICAoKiBDUFVfUENfU1RPUkUgKGNwdSkpIChjcHUsIG5ld3ZhbCk7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1jcHUuaCBiL3NpbS9jb21tb24vc2ltLWNwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjlmZWFkLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWNwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qIENQVSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgc2ltLWJhc2UuaC4KLQotICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgZnJhbWV3b3JrIGFuZAotICAgdGhlIHNlbGVjdGVkIGNwdS4gICovCi0KLSNpZm5kZWYgU0lNX0NQVV9ICi0jZGVmaW5lIFNJTV9DUFVfSAotCi0vKiBUeXBlIG9mIGZ1bmN0aW9uIHRvIHJldHVybiBhbiBpbnNuIG5hbWUuICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKENQVV9JTlNOX05BTUVfRk4pIChzaW1fY3B1ICosIGludCk7Ci0KLS8qIFR5cGVzIGZvciByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zLgotICAgVGhlc2Ugcm91dGluZXMgaW1wbGVtZW50IHRoZSBzaW1fe2ZldGNoLHN0b3JlfV9yZWdpc3RlciBpbnRlcmZhY2UuICAqLwotdHlwZWRlZiBpbnQgKENQVVJFR19GRVRDSF9GTikgKHNpbV9jcHUgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci10eXBlZGVmIGludCAoQ1BVUkVHX1NUT1JFX0ZOKSAoc2ltX2NwdSAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLQotLyogVHlwZXMgZm9yIFBDIGFjY2VzcyBmdW5jdGlvbnMuCi0gICBTb21lIHNpbXVsYXRvcnMgcmVxdWlyZSBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgcHJvZ3JhbQotICAgY291bnRlciBbYSBtYWNybyBpcyBpbnN1ZmZpY2llbnQgYXMgdGhlIFBDIGlzIGtlcHQgaW4gYSBjcHUtc3BlY2lmaWMgcGFydAotICAgb2YgdGhlIHNpbV9jcHUgc3RydWN0XS4gICovCi10eXBlZGVmIHNpbV9jaWEgKFBDX0ZFVENIX0ZOKSAoc2ltX2NwdSAqKTsKLXR5cGVkZWYgdm9pZCAoUENfU1RPUkVfRk4pIChzaW1fY3B1ICosIHNpbV9jaWEpOwotCi0vKiBQc2V1ZG8gYmFzZWNsYXNzIGZvciBlYWNoIGNwdS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAvKiBCYWNrbGluayB0byBtYWluIHN0YXRlIHN0cnVjdC4gICovCi0gIFNJTV9ERVNDIHN0YXRlOwotI2RlZmluZSBDUFVfU1RBVEUoY3B1KSAoKGNwdSktPmJhc2Uuc3RhdGUpCi0KLSAgLyogUHJvY2Vzc29yIGluZGV4IHdpdGhpbiB0aGUgU0RfREVTQyAqLwotICBpbnQgaW5kZXg7Ci0jZGVmaW5lIENQVV9JTkRFWChjcHUpICgoY3B1KS0+YmFzZS5pbmRleCkKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgY3B1LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNkZWZpbmUgQ1BVX05BTUUoY3B1KSAoKGNwdSktPmJhc2UubmFtZSkKLQotICAvKiBPcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgY3B1LiAgKi8KLSAgc3RydWN0IG9wdGlvbl9saXN0ICpvcHRpb25zOwotI2RlZmluZSBDUFVfT1BUSU9OUyhjcHUpICgoY3B1KS0+YmFzZS5vcHRpb25zKQotCi0gIC8qIFByb2Nlc3NvciBzcGVjaWZpYyBjb3JlIGRhdGEgKi8KLSAgc2ltX2NwdV9jb3JlIGNvcmU7Ci0jZGVmaW5lIENQVV9DT1JFKGNwdSkgKCYgKGNwdSktPmJhc2UuY29yZSkKLQotICAvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zICh1c2VkIHRvIGl0ZXJhdGUgb3ZlciBDUFVfSU5TTl9OQU1FKS4gICovCi0gIHVuc2lnbmVkIGludCBtYXhfaW5zbnM7Ci0jZGVmaW5lIENQVV9NQVhfSU5TTlMoY3B1KSAoKGNwdSktPmJhc2UubWF4X2luc25zKQotCi0gIC8qIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbmFtZSBvZiBhbiBpbnNuLiAgKi8KLSAgQ1BVX0lOU05fTkFNRV9GTiAqaW5zbl9uYW1lOwotI2RlZmluZSBDUFVfSU5TTl9OQU1FKGNwdSkgKChjcHUpLT5iYXNlLmluc25fbmFtZSkKLQotICAvKiBUcmFjZSBkYXRhLiAgU2VlIHNpbS10cmFjZS5oLiAgKi8KLSAgVFJBQ0VfREFUQSB0cmFjZV9kYXRhOwotI2RlZmluZSBDUFVfVFJBQ0VfREFUQShjcHUpICgmIChjcHUpLT5iYXNlLnRyYWNlX2RhdGEpCi0KLSAgLyogTWF4aW11bSBudW1iZXIgb2YgZGVidWdnYWJsZSBlbnRpdGllcy4KLSAgICAgVGhpcyBkZWJ1Z2dpbmcgaXMgbm90IGludGVuZGVkIGZvciBub3JtYWwgdXNlLgotICAgICBJdCBpcyBvbmx5IGVuYWJsZWQgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgtZGVidWcKLSAgICAgd2hpY2ggc2hvdWxkbid0IG5vcm1hbGx5IGJlIHNwZWNpZmllZC4gICovCi0jaWZuZGVmIE1BWF9ERUJVR19WQUxVRVMKLSNkZWZpbmUgTUFYX0RFQlVHX1ZBTFVFUyA0Ci0jZW5kaWYKLQotICAvKiBCb29sZWFuIGFycmF5IG9mIHNwZWNpZmllZCBkZWJ1Z2dpbmcgZmxhZ3MuICAqLwotICBjaGFyIGRlYnVnX2ZsYWdzW01BWF9ERUJVR19WQUxVRVNdOwotI2RlZmluZSBDUFVfREVCVUdfRkxBR1MoY3B1KSAoKGNwdSktPmJhc2UuZGVidWdfZmxhZ3MpCi0gIC8qIFN0YW5kYXJkIHZhbHVlcy4gICovCi0jZGVmaW5lIERFQlVHX0lOU05fSURYIDAKLSNkZWZpbmUgREVCVUdfTkVYVF9JRFggMiAvKiBzaW11bGF0b3Igc3BlY2lmaWMgZGVidWcgYml0cyBiZWdpbiBoZXJlICovCi0KLSAgLyogRGVidWdnaW5nIG91dHB1dCBnb2VzIHRvIHRoaXMgb3Igc3RkZXJyIGlmIE5VTEwuCi0gICAgIFdlIGNhbid0IHN0b3JlIGBzdGRlcnInIGhlcmUgYXMgc3RkZXJyIGdvZXMgdGhyb3VnaCBhIGNhbGxiYWNrLiAgKi8KLSAgRklMRSAqZGVidWdfZmlsZTsKLSNkZWZpbmUgQ1BVX0RFQlVHX0ZJTEUoY3B1KSAoKGNwdSktPmJhc2UuZGVidWdfZmlsZSkKLQotICAvKiBQcm9maWxlIGRhdGEuICBTZWUgc2ltLXByb2ZpbGUuaC4gICovCi0gIFBST0ZJTEVfREFUQSBwcm9maWxlX2RhdGE7Ci0jZGVmaW5lIENQVV9QUk9GSUxFX0RBVEEoY3B1KSAoJiAoY3B1KS0+YmFzZS5wcm9maWxlX2RhdGEpCi0KLSNpZmRlZiBTSU1fSEFWRV9NT0RFTAotICAvKiBNYWNoaW5lIHRhYmxlcyBmb3IgdGhpcyBjcHUuICBTZWUgc2ltLW1vZGVsLmguICAqLwotICBjb25zdCBNQUNIICptYWNoOwotI2RlZmluZSBDUFVfTUFDSChjcHUpICgoY3B1KS0+YmFzZS5tYWNoKQotICAvKiBUaGUgc2VsZWN0ZWQgbW9kZWwuICAqLwotICBjb25zdCBNT0RFTCAqbW9kZWw7Ci0jZGVmaW5lIENQVV9NT0RFTChjcHUpICgoY3B1KS0+YmFzZS5tb2RlbCkKLSAgLyogTW9kZWwgZGF0YSAocHJvZmlsaW5nIHN0YXRlLCBldGMuKS4gICovCi0gIHZvaWQgKm1vZGVsX2RhdGE7Ci0jZGVmaW5lIENQVV9NT0RFTF9EQVRBKGNwdSkgKChjcHUpLT5iYXNlLm1vZGVsX2RhdGEpCi0jZW5kaWYKLQotICAvKiBSb3V0aW5lcyB0byBmZXRjaC9zdG9yZSByZWdpc3RlcnMuICAqLwotICBDUFVSRUdfRkVUQ0hfRk4gKnJlZ19mZXRjaDsKLSNkZWZpbmUgQ1BVX1JFR19GRVRDSChjKSAoKGMpLT5iYXNlLnJlZ19mZXRjaCkKLSAgQ1BVUkVHX1NUT1JFX0ZOICpyZWdfc3RvcmU7Ci0jZGVmaW5lIENQVV9SRUdfU1RPUkUoYykgKChjKS0+YmFzZS5yZWdfc3RvcmUpCi0gIFBDX0ZFVENIX0ZOICpwY19mZXRjaDsKLSNkZWZpbmUgQ1BVX1BDX0ZFVENIKGMpICgoYyktPmJhc2UucGNfZmV0Y2gpCi0gIFBDX1NUT1JFX0ZOICpwY19zdG9yZTsKLSNkZWZpbmUgQ1BVX1BDX1NUT1JFKGMpICgoYyktPmJhc2UucGNfc3RvcmUpCi0KLX0gc2ltX2NwdV9iYXNlOwotCi0vKiBDcmVhdGUgYWxsIGNwdXMuICAqLwotZXh0ZXJuIFNJTV9SQyBzaW1fY3B1X2FsbG9jX2FsbCAoU0lNX0RFU0MsIGludCwgaW50KTsKLS8qIENyZWF0ZSBhIGNwdS4gICovCi1leHRlcm4gc2ltX2NwdSAqc2ltX2NwdV9hbGxvYyAoU0lNX0RFU0MsIGludCk7Ci0vKiBSZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5IGFsbCBjcHVzLiAgKi8KLWV4dGVybiB2b2lkIHNpbV9jcHVfZnJlZV9hbGwgKFNJTV9ERVNDKTsKLS8qIFJlbGVhc2UgcmVzb3VyY2VzIGhlbGQgYnkgYSBjcHUuICAqLwotZXh0ZXJuIHZvaWQgc2ltX2NwdV9mcmVlIChzaW1fY3B1ICopOwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcHUgZGF0YSBmb3IgQ1BVX05BTUUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLWV4dGVybiBzaW1fY3B1ICpzaW1fY3B1X2xvb2t1cCAoU0lNX0RFU0MsIGNvbnN0IGNoYXIgKik7Ci0KLS8qIFJldHVybiBwcmVmaXggdG8gdXNlIGluIGNwdSBzcGVjaWZpYyBtZXNzYWdlcy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqc2ltX2NwdV9tc2dfcHJlZml4IChzaW1fY3B1ICopOwotLyogQ292ZXIgZm4gdG8gc2ltX2lvX2VwcmludGYuICAqLwotZXh0ZXJuIHZvaWQgc2ltX2lvX2VwcmludGZfY3B1IChzaW1fY3B1ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLQotLyogR2V0L3NldCBhIHBjIHZhbHVlLiAgKi8KLSNkZWZpbmUgQ1BVX1BDX0dFVChjcHUpICgoKiBDUFVfUENfRkVUQ0ggKGNwdSkpIChjcHUpKQotI2RlZmluZSBDUFVfUENfU0VUKGNwdSxuZXd2YWwpICgoKiBDUFVfUENfU1RPUkUgKGNwdSkpICgoY3B1KSwgKG5ld3ZhbCkpKQotLyogRXh0ZXJuYWwgaW50ZXJmYWNlIHRvIGFjY2Vzc2luZyB0aGUgcGMuICAqLwotc2ltX2NpYSBzaW1fcGNfZ2V0IChzaW1fY3B1ICopOwotdm9pZCBzaW1fcGNfc2V0IChzaW1fY3B1ICosIHNpbV9jaWEpOwotCi0jZW5kaWYgLyogU0lNX0NQVV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1lbmRpYW4uYyBiL3NpbS9jb21tb24vc2ltLWVuZGlhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjgyMDI4Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWVuZGlhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9FTkRJQU5fQ18KLSNkZWZpbmUgX1NJTV9FTkRJQU5fQ18KLQotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0KLQotI2lmICFkZWZpbmVkKF9TV0FQXzEpCi0jZGVmaW5lIF9TV0FQXzEoU0VULFJBVykgU0VUIChSQVcpCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9TV0FQXzIpICYmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKGh0b25zKQotI2RlZmluZSBfU1dBUF8yKFNFVCxSQVcpIFNFVCBodG9ucyAoUkFXKQotI2VuZGlmCi0KLSNpZm5kZWYJX1NXQVBfMgotI2RlZmluZSBfU1dBUF8yKFNFVCxSQVcpIFNFVCAoKChSQVcpID4+IDgpIHwgKChSQVcpIDw8IDgpKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfU1dBUF80KSAmJiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikgJiYgZGVmaW5lZChodG9ubCkKLSNkZWZpbmUgX1NXQVBfNChTRVQsUkFXKSBTRVQgaHRvbmwgKFJBVykKLSNlbmRpZgotCi0jaWZuZGVmIF9TV0FQXzQKLSNkZWZpbmUJX1NXQVBfNChTRVQsUkFXKSBTRVQgKCgoUkFXKSA8PCAyNCkgfCAoKChSQVcpICYgMHhmZjAwKSA8PCA4KSB8ICgoKFJBVykgJiAweGZmMDAwMCkgPj4gOCkgfCAoKFJBVykgPj4gMjQpKQotI2VuZGlmCi0KLSNpZm5kZWYgX1NXQVBfOAotI2RlZmluZSBfU1dBUF84KFNFVCxSQVcpIFwKLSAgdW5pb24geyB1bnNpZ25lZF84IGR3b3JkOyB1bnNpZ25lZF80IHdvcmRzWzJdOyB9IGluLCBvdXQ7IFwKLSAgaW4uZHdvcmQgPSBSQVc7IFwKLSAgX1NXQVBfNCAob3V0LndvcmRzWzBdID0sIGluLndvcmRzWzFdKTsgXAotICBfU1dBUF80IChvdXQud29yZHNbMV0gPSwgaW4ud29yZHNbMF0pOyBcCi0gIFNFVCBvdXQuZHdvcmQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBfU1dBUF8xNgotI2RlZmluZSBfU1dBUF8xNihTRVQsUkFXKSBcCi0gIHVuaW9uIHsgdW5zaWduZWRfMTYgd29yZDsgdW5zaWduZWRfNCB3b3Jkc1s0XTsgfSBpbiwgb3V0OyBcCi0gIGluLndvcmQgPSAoUkFXKTsgXAotICBfU1dBUF80IChvdXQud29yZHNbMF0gPSwgaW4ud29yZHNbM10pOyBcCi0gIF9TV0FQXzQgKG91dC53b3Jkc1sxXSA9LCBpbi53b3Jkc1syXSk7IFwKLSAgX1NXQVBfNCAob3V0LndvcmRzWzJdID0sIGluLndvcmRzWzFdKTsgXAotICBfU1dBUF80IChvdXQud29yZHNbM10gPSwgaW4ud29yZHNbMF0pOyBcCi0gIFNFVCBvdXQud29yZDsKLSNlbmRpZgotCi0KLSNkZWZpbmUgTiAxCi0jaW5jbHVkZSAic2ltLW4tZW5kaWFuLmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gMgotI2luY2x1ZGUgInNpbS1uLWVuZGlhbi5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDQKLSNpbmNsdWRlICJzaW0tbi1lbmRpYW4uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiA4Ci0jaW5jbHVkZSAic2ltLW4tZW5kaWFuLmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gMTYKLSNpbmNsdWRlICJzaW0tbi1lbmRpYW4uaCIKLSN1bmRlZiBOCi0KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfOCkKLXNpbV9lbmRpYW5fc3BsaXRfMTYgKHVuc2lnbmVkXzE2IHdvcmQsIGludCB3KQotewotICBpZiAoQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKLSAgICB7Ci0gICAgICByZXR1cm4gd29yZC5hWzEgLSB3XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gd29yZC5hW3ddOwotICAgIH0KLX0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF8xNikKLXNpbV9lbmRpYW5fam9pbl8xNiAodW5zaWduZWRfOCBoLCB1bnNpZ25lZF84IGwpCi0KLXsKLSAgdW5zaWduZWRfMTYgd29yZDsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pCi0gICAgewotICAgICAgd29yZC5hWzBdID0gbDsKLSAgICAgIHdvcmQuYVsxXSA9IGg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd29yZC5hWzBdID0gaDsKLSAgICAgIHdvcmQuYVsxXSA9IGw7Ci0gICAgfQotICByZXR1cm4gd29yZDsKLX0KLQotCi0KLSNlbmRpZiAvKiBfU0lNX0VORElBTl9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZW5kaWFuLmggYi9zaW0vY29tbW9uL3NpbS1lbmRpYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczM2M4Mi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1lbmRpYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9FTkRJQU5fSF8KLSNkZWZpbmUgX1NJTV9FTkRJQU5fSF8KLQotCi0vKiBDIGJ5dGUgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2gydF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5faDJ0XzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9oMnRfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2gydF84KHVuc2lnbmVkXzggeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgZW5kaWFuX2gydF8xNih1bnNpZ25lZF8xNiB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX3QyaF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5fdDJoXzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl90MmhfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX3QyaF84KHVuc2lnbmVkXzggeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgZW5kaWFuX3QyaF8xNih1bnNpZ25lZF8xNiB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgc3dhcF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBzd2FwXzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIHN3YXBfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgc3dhcF84KHVuc2lnbmVkXzggeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgc3dhcF8xNih1bnNpZ25lZF8xNiB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2gyYmVfMSh1bnNpZ25lZF8xIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2gyYmVfMih1bnNpZ25lZF8yIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2gyYmVfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2gyYmVfOCh1bnNpZ25lZF84IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIGVuZGlhbl9oMmJlXzE2KHVuc2lnbmVkXzE2IHgpOwotCi1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5fYmUyaF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5fYmUyaF8yKHVuc2lnbmVkXzIgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5fYmUyaF80KHVuc2lnbmVkXzQgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5fYmUyaF84KHVuc2lnbmVkXzggeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgZW5kaWFuX2JlMmhfMTYodW5zaWduZWRfMTYgeCk7Ci0KLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9oMmxlXzEodW5zaWduZWRfMSB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9oMmxlXzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9oMmxlXzQodW5zaWduZWRfNCB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9oMmxlXzgodW5zaWduZWRfOCB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzE2KSBlbmRpYW5faDJsZV8xNih1bnNpZ25lZF8xNiB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2xlMmhfMSh1bnNpZ25lZF8xIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2xlMmhfMih1bnNpZ25lZF8yIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2xlMmhfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2xlMmhfOCh1bnNpZ25lZF84IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIGVuZGlhbl9sZTJoXzE2KHVuc2lnbmVkXzE2IHgpOwotCi1JTkxJTkVfU0lNX0VORElBTih2b2lkKikgb2Zmc2V0XzEodW5zaWduZWRfMSAqeCwgdW5zaWduZWQgd3MsIHVuc2lnbmVkIHcpOwotSU5MSU5FX1NJTV9FTkRJQU4odm9pZCopIG9mZnNldF8yKHVuc2lnbmVkXzIgKngsIHVuc2lnbmVkIHdzLCB1bnNpZ25lZCB3KTsKLUlOTElORV9TSU1fRU5ESUFOKHZvaWQqKSBvZmZzZXRfNCh1bnNpZ25lZF80ICp4LCB1bnNpZ25lZCB3cywgdW5zaWduZWQgdyk7Ci1JTkxJTkVfU0lNX0VORElBTih2b2lkKikgb2Zmc2V0XzgodW5zaWduZWRfOCAqeCwgdW5zaWduZWQgd3MsIHVuc2lnbmVkIHcpOwotSU5MSU5FX1NJTV9FTkRJQU4odm9pZCopIG9mZnNldF8xNih1bnNpZ25lZF8xNiAqeCwgdW5zaWduZWQgd3MsIHVuc2lnbmVkIHcpOwotCi1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgc2ltX2VuZGlhbl9qb2luXzE2ICh1bnNpZ25lZF84IGgsIHVuc2lnbmVkXzggbCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBzaW1fZW5kaWFuX3NwbGl0XzE2ICh1bnNpZ25lZF8xNiB3b3JkLCBpbnQgdyk7Ci0KLQotLyogU1dBUCAqLwotCi0jZGVmaW5lIFNXQVBfMShYKSBzd2FwXzEoWCkKLSNkZWZpbmUgU1dBUF8yKFgpIHN3YXBfMihYKQotI2RlZmluZSBTV0FQXzQoWCkgc3dhcF80KFgpCi0jZGVmaW5lIFNXQVBfOChYKSBzd2FwXzgoWCkKLSNkZWZpbmUgU1dBUF8xNihYKSBzd2FwXzE2KFgpCi0KLQotLyogSE9TVCB0byBCRSAqLwotCi0jZGVmaW5lIEgyQkVfMShYKSBlbmRpYW5faDJiZV8xKFgpCi0jZGVmaW5lIEgyQkVfMihYKSBlbmRpYW5faDJiZV8yKFgpCi0jZGVmaW5lIEgyQkVfNChYKSBlbmRpYW5faDJiZV80KFgpCi0jZGVmaW5lIEgyQkVfOChYKSBlbmRpYW5faDJiZV84KFgpCi0jZGVmaW5lIEgyQkVfMTYoWCkgZW5kaWFuX2gyYmVfMTYoWCkKLSNkZWZpbmUgQkUySF8xKFgpIGVuZGlhbl9iZTJoXzEoWCkKLSNkZWZpbmUgQkUySF8yKFgpIGVuZGlhbl9iZTJoXzIoWCkKLSNkZWZpbmUgQkUySF80KFgpIGVuZGlhbl9iZTJoXzQoWCkKLSNkZWZpbmUgQkUySF84KFgpIGVuZGlhbl9iZTJoXzgoWCkKLSNkZWZpbmUgQkUySF8xNihYKSBlbmRpYW5fYmUyaF8xNihYKQotCi0KLS8qIEhPU1QgdG8gTEUgKi8KLQotI2RlZmluZSBIMkxFXzEoWCkgZW5kaWFuX2gybGVfMShYKQotI2RlZmluZSBIMkxFXzIoWCkgZW5kaWFuX2gybGVfMihYKQotI2RlZmluZSBIMkxFXzQoWCkgZW5kaWFuX2gybGVfNChYKQotI2RlZmluZSBIMkxFXzgoWCkgZW5kaWFuX2gybGVfOChYKQotI2RlZmluZSBIMkxFXzE2KFgpIGVuZGlhbl9oMmxlXzE2KFgpCi0jZGVmaW5lIExFMkhfMShYKSBlbmRpYW5fbGUyaF8xKFgpCi0jZGVmaW5lIExFMkhfMihYKSBlbmRpYW5fbGUyaF8yKFgpCi0jZGVmaW5lIExFMkhfNChYKSBlbmRpYW5fbGUyaF80KFgpCi0jZGVmaW5lIExFMkhfOChYKSBlbmRpYW5fbGUyaF84KFgpCi0jZGVmaW5lIExFMkhfMTYoWCkgZW5kaWFuX2xlMmhfMTYoWCkKLQotCi0vKiBIT1NUIHRvIFRBUkdFVCAqLwotCi0jZGVmaW5lIEgyVF8xKFgpIGVuZGlhbl9oMnRfMShYKQotI2RlZmluZSBIMlRfMihYKSBlbmRpYW5faDJ0XzIoWCkKLSNkZWZpbmUgSDJUXzQoWCkgZW5kaWFuX2gydF80KFgpCi0jZGVmaW5lIEgyVF84KFgpIGVuZGlhbl9oMnRfOChYKQotI2RlZmluZSBIMlRfMTYoWCkgZW5kaWFuX2gydF8xNihYKQotI2RlZmluZSBUMkhfMShYKSBlbmRpYW5fdDJoXzEoWCkKLSNkZWZpbmUgVDJIXzIoWCkgZW5kaWFuX3QyaF8yKFgpCi0jZGVmaW5lIFQySF80KFgpIGVuZGlhbl90MmhfNChYKQotI2RlZmluZSBUMkhfOChYKSBlbmRpYW5fdDJoXzgoWCkKLSNkZWZpbmUgVDJIXzE2KFgpIGVuZGlhbl90MmhfMTYoWCkKLQotCi0vKiBDT05WRVJUIElOIFBMQUNFCi0KLSAgIFRoZXNlIG1hY3JvcywgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdW5rbm93biBzaXplLCBzd2FwIGl0cyB2YWx1ZSBpbgotICAgcGxhY2UgaWYgYSBob3N0L3RhcmdldCBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLiAqLwotCi0jZGVmaW5lIEgyVChWQVJJQUJMRSkgXAotZG8geyBcCi0gIHZvaWQgKnZwID0gJihWQVJJQUJMRSk7IFwKLSAgc3dpdGNoIChzaXplb2YgKFZBUklBQkxFKSkgeyBcCi0gIGNhc2UgMTogKih1bnNpZ25lZF8xKil2cCA9IEgyVF8xKCoodW5zaWduZWRfMSopdnApOyBicmVhazsgXAotICBjYXNlIDI6ICoodW5zaWduZWRfMiopdnAgPSBIMlRfMigqKHVuc2lnbmVkXzIqKXZwKTsgYnJlYWs7IFwKLSAgY2FzZSA0OiAqKHVuc2lnbmVkXzQqKXZwID0gSDJUXzQoKih1bnNpZ25lZF80Kil2cCk7IGJyZWFrOyBcCi0gIGNhc2UgODogKih1bnNpZ25lZF84Kil2cCA9IEgyVF84KCoodW5zaWduZWRfOCopdnApOyBicmVhazsgXAotICBjYXNlIDE2OiAqKHVuc2lnbmVkXzE2Kil2cCA9IEgyVF8xNigqKHVuc2lnbmVkXzE2Kil2cCk7IGJyZWFrOyBcCi0gIH0gXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUMkgoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gVDJIXzEoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDI6IFZBUklBQkxFID0gVDJIXzIoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDQ6IFZBUklBQkxFID0gVDJIXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gVDJIXzgoVkFSSUFCTEUpOyBicmVhazsgXAotICAvKmNhc2UgMTY6IFZBUklBQkxFID0gVDJIXzE2KFZBUklBQkxFKTsgYnJlYWs7Ki8gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU1dBUChWQVJJQUJMRSkgXAotZG8geyBcCi0gIHN3aXRjaCAoc2l6ZW9mKFZBUklBQkxFKSkgeyBcCi0gIGNhc2UgMTogVkFSSUFCTEUgPSBTV0FQXzEoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDI6IFZBUklBQkxFID0gU1dBUF8yKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSA0OiBWQVJJQUJMRSA9IFNXQVBfNChWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgODogVkFSSUFCTEUgPSBTV0FQXzgoVkFSSUFCTEUpOyBicmVhazsgXAotICAvKmNhc2UgMTY6IFZBUklBQkxFID0gU1dBUF8xNihWQVJJQUJMRSk7IGJyZWFrOyovIFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEgyQkUoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gSDJCRV8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IEgyQkVfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBIMkJFXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gSDJCRV84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgLypjYXNlIDE2OiBWQVJJQUJMRSA9IEgyQkVfMTYoVkFSSUFCTEUpOyBicmVhazsqLyBcCi0gIH0gXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBCRTJIKFZBUklBQkxFKSBcCi1kbyB7IFwKLSAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKLSAgY2FzZSAxOiBWQVJJQUJMRSA9IEJFMkhfMShWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgMjogVkFSSUFCTEUgPSBCRTJIXzIoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDQ6IFZBUklBQkxFID0gQkUySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSA4OiBWQVJJQUJMRSA9IEJFMkhfOChWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIC8qY2FzZSAxNjogVkFSSUFCTEUgPSBCRTJIXzE2KFZBUklBQkxFKTsgYnJlYWs7Ki8gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSDJMRShWQVJJQUJMRSkgXAotZG8geyBcCi0gIHN3aXRjaCAoc2l6ZW9mKFZBUklBQkxFKSkgeyBcCi0gIGNhc2UgMTogVkFSSUFCTEUgPSBIMkxFXzEoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDI6IFZBUklBQkxFID0gSDJMRV8yKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSA0OiBWQVJJQUJMRSA9IEgyTEVfNChWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgODogVkFSSUFCTEUgPSBIMkxFXzgoVkFSSUFCTEUpOyBicmVhazsgXAotICAvKmNhc2UgMTY6IFZBUklBQkxFID0gSDJMRV8xNihWQVJJQUJMRSk7IGJyZWFrOyovIFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIExFMkgoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gTEUySF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IExFMkhfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBMRTJIXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gTEUySF84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgLypjYXNlIDE2OiBWQVJJQUJMRSA9IExFMkhfMTYoVkFSSUFCTEUpOyBicmVhazsqLyBcCi0gIH0gXAotfSB3aGlsZSAoMCkKLQotCi0KLS8qIFRBUkdFVCBXT1JEOgotCi0gICBCeXRlIHN3YXAgYSBxdWFudGl0eSB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0cyB3b3JkICovCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBIMlRfd29yZChYKSBIMlRfOChYKQotI2RlZmluZSBUMkhfd29yZChYKSBUMkhfOChYKQotI2RlZmluZSBIMkJFX3dvcmQoWCkgSDJCRV84KFgpCi0jZGVmaW5lIEJFMkhfd29yZChYKSBCRTJIXzgoWCkKLSNkZWZpbmUgSDJMRV93b3JkKFgpIEgyTEVfOChYKQotI2RlZmluZSBMRTJIX3dvcmQoWCkgTEUySF84KFgpCi0jZGVmaW5lIFNXQVBfd29yZChYKSBTV0FQXzgoWCkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEgyVF93b3JkKFgpIEgyVF80KFgpCi0jZGVmaW5lIFQySF93b3JkKFgpIFQySF80KFgpCi0jZGVmaW5lIEgyQkVfd29yZChYKSBIMkJFXzQoWCkKLSNkZWZpbmUgQkUySF93b3JkKFgpIEJFMkhfNChYKQotI2RlZmluZSBIMkxFX3dvcmQoWCkgSDJMRV80KFgpCi0jZGVmaW5lIExFMkhfd29yZChYKSBMRTJIXzQoWCkKLSNkZWZpbmUgU1dBUF93b3JkKFgpIFNXQVBfNChYKQotI2VuZGlmCi0KLQotCi0vKiBUQVJHRVQgQ0VMTDoKLQotICAgQnl0ZSBzd2FwIGEgcXVhbnRpdHkgdGhlIHNpemUgb2YgdGhlIHRhcmdldHMgSUVFRSAxMjc1IG1lbW9yeSBjZWxsICovCi0KLSNkZWZpbmUgSDJUX2NlbGwoWCkgSDJUXzQoWCkKLSNkZWZpbmUgVDJIX2NlbGwoWCkgVDJIXzQoWCkKLSNkZWZpbmUgSDJCRV9jZWxsKFgpIEgyQkVfNChYKQotI2RlZmluZSBCRTJIX2NlbGwoWCkgQkUySF80KFgpCi0jZGVmaW5lIEgyTEVfY2VsbChYKSBIMkxFXzQoWCkKLSNkZWZpbmUgTEUySF9jZWxsKFgpIExFMkhfNChYKQotI2RlZmluZSBTV0FQX2NlbGwoWCkgU1dBUF80KFgpCi0KLQotCi0vKiBIT1NUIE9mZnNldHM6Ci0KLSAgIEFkZHJlc3Mgb2YgaGlnaC9sb3cgc3ViLXdvcmQgd2l0aGluIGEgaG9zdCB3b3JkIHF1YW50aXR5LgotCi0gICBBZGRyZXNzIG9mIHN1Yi13b3JkIE4gd2l0aGluIGEgaG9zdCB3b3JkIHF1YW50aXR5LiAgTk9URTogTnVtYmVyaW5nCi0gICBpcyBCSUcgZW5kaWFuIGFsd2F5cy4gKi8KLQotI2RlZmluZSBBSDFfMihYKSAodW5zaWduZWRfMSopb2Zmc2V0XzIoKFgpLCAxLCAwKQotI2RlZmluZSBBTDFfMihYKSAodW5zaWduZWRfMSopb2Zmc2V0XzIoKFgpLCAxLCAxKQotCi0jZGVmaW5lIEFIMl80KFgpICh1bnNpZ25lZF8yKilvZmZzZXRfNCgoWCksIDIsIDApCi0jZGVmaW5lIEFMMl80KFgpICh1bnNpZ25lZF8yKilvZmZzZXRfNCgoWCksIDIsIDEpCi0KLSNkZWZpbmUgQUg0XzgoWCkgKHVuc2lnbmVkXzQqKW9mZnNldF84KChYKSwgNCwgMCkKLSNkZWZpbmUgQUw0XzgoWCkgKHVuc2lnbmVkXzQqKW9mZnNldF84KChYKSwgNCwgMSkKLQotI2RlZmluZSBBSDhfMTYoWCkgKHVuc2lnbmVkXzgqKW9mZnNldF8xNigoWCksIDgsIDApCi0jZGVmaW5lIEFMOF8xNihYKSAodW5zaWduZWRfOCopb2Zmc2V0XzE2KChYKSwgOCwgMSkKLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZGVmaW5lIEFIX3dvcmQoWCkgQUg0XzgoWCkKLSNkZWZpbmUgQUxfd29yZChYKSBBTDRfOChYKQotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSNkZWZpbmUgQUhfd29yZChYKSBBSDJfNChYKQotI2RlZmluZSBBTF93b3JkKFgpIEFMMl80KFgpCi0jZW5kaWYKLQotCi0jZGVmaW5lIEExXzIoWCxOKSAodW5zaWduZWRfMSopb2Zmc2V0XzIoKFgpLCAxLCAoTikpCi0KLSNkZWZpbmUgQTFfNChYLE4pICh1bnNpZ25lZF8xKilvZmZzZXRfNCgoWCksIDEsIChOKSkKLSNkZWZpbmUgQTJfNChYLE4pICh1bnNpZ25lZF8yKilvZmZzZXRfNCgoWCksIDIsIChOKSkKLQotI2RlZmluZSBBMV84KFgsTikgKHVuc2lnbmVkXzEqKW9mZnNldF84KChYKSwgMSwgKE4pKQotI2RlZmluZSBBMl84KFgsTikgKHVuc2lnbmVkXzIqKW9mZnNldF84KChYKSwgMiwgKE4pKQotI2RlZmluZSBBNF84KFgsTikgKHVuc2lnbmVkXzQqKW9mZnNldF84KChYKSwgNCwgKE4pKQotCi0jZGVmaW5lIEExXzE2KFgsTikgKHVuc2lnbmVkXzEqKW9mZnNldF8xNigoWCksIDEsIChOKSkKLSNkZWZpbmUgQTJfMTYoWCxOKSAodW5zaWduZWRfMiopb2Zmc2V0XzE2KChYKSwgMiwgKE4pKQotI2RlZmluZSBBNF8xNihYLE4pICh1bnNpZ25lZF80KilvZmZzZXRfMTYoKFgpLCA0LCAoTikpCi0jZGVmaW5lIEE4XzE2KFgsTikgKHVuc2lnbmVkXzgqKW9mZnNldF8xNigoWCksIDgsIChOKSkKLQotCi0KLQotLyogSE9TVCBDb21wb25lbnRzOgotCi0gICBWYWx1ZSBvZiBzdWItd29yZCB3aXRoaW4gYSBob3N0IHdvcmQgcXVhbnRpdHkgKi8KLQotI2RlZmluZSBWSDFfMihYKSAoKHVuc2lnbmVkXzEpKCh1bnNpZ25lZF8yKShYKSA+PiA4KSkKLSNkZWZpbmUgVkwxXzIoWCkgKHVuc2lnbmVkXzEpKFgpCi0KLSNkZWZpbmUgVkgyXzQoWCkgKCh1bnNpZ25lZF8yKSgodW5zaWduZWRfNCkoWCkgPj4gMTYpKQotI2RlZmluZSBWTDJfNChYKSAoKHVuc2lnbmVkXzIpKFgpKQotCi0jZGVmaW5lIFZINF84KFgpICgodW5zaWduZWRfNCkoKHVuc2lnbmVkXzgpKFgpID4+IDMyKSkKLSNkZWZpbmUgVkw0XzgoWCkgKCh1bnNpZ25lZF80KShYKSkKLQotI2RlZmluZSBWSDhfMTYoWCkgKHNpbV9lbmRpYW5fc3BsaXRfMTYgKChYKSwgMCkpCi0jZGVmaW5lIFZMOF8xNihYKSAoc2ltX2VuZGlhbl9zcGxpdF8xNiAoKFgpLCAxKSkKLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZGVmaW5lIFZIX3dvcmQoWCkgVkg0XzgoWCkKLSNkZWZpbmUgVkxfd29yZChYKSBWTDRfOChYKQotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSNkZWZpbmUgVkhfd29yZChYKSBWSDJfNChYKQotI2RlZmluZSBWTF93b3JkKFgpIFZMMl80KFgpCi0jZW5kaWYKLQotCi0jZGVmaW5lIFYxXzIoWCxOKSAoKHVuc2lnbmVkXzEpKCh1bnNpZ25lZF8yKShYKSA+PiAoIDggKiAoMSAtIChOKSkpKSkKLQotI2RlZmluZSBWMV80KFgsTikgKCh1bnNpZ25lZF8xKSgodW5zaWduZWRfNCkoWCkgPj4gKCA4ICogKDMgLSAoTikpKSkpCi0jZGVmaW5lIFYyXzQoWCxOKSAoKHVuc2lnbmVkXzIpKCh1bnNpZ25lZF80KShYKSA+PiAoMTYgKiAoMSAtIChOKSkpKSkKLQotI2RlZmluZSBWMV84KFgsTikgKCh1bnNpZ25lZF8xKSgodW5zaWduZWRfOCkoWCkgPj4gKCA4ICogKDcgLSAoTikpKSkpCi0jZGVmaW5lIFYyXzgoWCxOKSAoKHVuc2lnbmVkXzIpKCh1bnNpZ25lZF84KShYKSA+PiAoMTYgKiAoMyAtIChOKSkpKSkKLSNkZWZpbmUgVjRfOChYLE4pICgodW5zaWduZWRfNCkoKHVuc2lnbmVkXzgpKFgpID4+ICgzMiAqICgxIC0gKE4pKSkpKQotCi0jZGVmaW5lIFYxXzE2KFgsTikgKCpBMV8xNiAoJihYKSxOKSkKLSNkZWZpbmUgVjJfMTYoWCxOKSAoKkEyXzE2ICgmKFgpLE4pKQotI2RlZmluZSBWNF8xNihYLE4pICgqQTRfMTYgKCYoWCksTikpCi0jZGVmaW5lIFY4XzE2KFgsTikgKCpBOF8xNiAoJihYKSxOKSkKLQotCi0vKiBSZXZlcnNlIC0gaW5zZXJ0IHN1Yi13b3JkIGludG8gd29yZCBxdWFudGl0eSAqLwotCi0jZGVmaW5lIFYyX0gxKFgpICgodW5zaWduZWRfMikodW5zaWduZWRfMSkoWCkgPDwgIDgpCi0jZGVmaW5lIFYyX0wxKFgpICgodW5zaWduZWRfMikodW5zaWduZWRfMSkoWCkpCi0KLSNkZWZpbmUgVjRfSDIoWCkgKCh1bnNpZ25lZF80KSh1bnNpZ25lZF8yKShYKSA8PCAxNikKLSNkZWZpbmUgVjRfTDIoWCkgKCh1bnNpZ25lZF80KSh1bnNpZ25lZF8yKShYKSkKLQotI2RlZmluZSBWOF9INChYKSAoKHVuc2lnbmVkXzgpKHVuc2lnbmVkXzQpKFgpIDw8IDMyKQotI2RlZmluZSBWOF9MNChYKSAoKHVuc2lnbmVkXzgpKHVuc2lnbmVkXzQpKFgpKQotCi0jZGVmaW5lIFYxNl9IOChYKSAoKHVuc2lnbmVkXzE2KSh1bnNpZ25lZF84KShYKSA8PCA2NCkKLSNkZWZpbmUgVjE2X0w4KFgpICgodW5zaWduZWRfMTYpKHVuc2lnbmVkXzgpKFgpKQotCi0KLSNkZWZpbmUgVjJfMShYLE4pICgodW5zaWduZWRfMikodW5zaWduZWRfMSkoWCkgPDwgKCA4ICogKDEgLSAoTikpKSkKLQotI2RlZmluZSBWNF8xKFgsTikgKCh1bnNpZ25lZF80KSh1bnNpZ25lZF8xKShYKSA8PCAoIDggKiAoMyAtIChOKSkpKQotI2RlZmluZSBWNF8yKFgsTikgKCh1bnNpZ25lZF80KSh1bnNpZ25lZF8yKShYKSA8PCAoMTYgKiAoMSAtIChOKSkpKQotCi0jZGVmaW5lIFY4XzEoWCxOKSAoKHVuc2lnbmVkXzgpKHVuc2lnbmVkXzEpKFgpIDw8ICggOCAqICg3IC0gKE4pKSkpCi0jZGVmaW5lIFY4XzIoWCxOKSAoKHVuc2lnbmVkXzgpKHVuc2lnbmVkXzIpKFgpIDw8ICgxNiAqICgzIC0gKE4pKSkpCi0jZGVmaW5lIFY4XzQoWCxOKSAoKHVuc2lnbmVkXzgpKHVuc2lnbmVkXzQpKFgpIDw8ICgzMiAqICgxIC0gKE4pKSkpCi0KLSNkZWZpbmUgVjE2XzEoWCxOKSAoKHVuc2lnbmVkXzE2KSh1bnNpZ25lZF8xKShYKSA8PCAoIDggKiAoMTUgLSAoTikpKSkKLSNkZWZpbmUgVjE2XzIoWCxOKSAoKHVuc2lnbmVkXzE2KSh1bnNpZ25lZF8yKShYKSA8PCAoMTYgKiAoNyAtIChOKSkpKQotI2RlZmluZSBWMTZfNChYLE4pICgodW5zaWduZWRfMTYpKHVuc2lnbmVkXzQpKFgpIDw8ICgzMiAqICgzIC0gKE4pKSkpCi0jZGVmaW5lIFYxNl84KFgsTikgKCh1bnNpZ25lZF8xNikodW5zaWduZWRfOCkoWCkgPDwgKDY0ICogKDEgLSAoTikpKSkKLQotCi0vKiBSZXZlcnNlIC0gaW5zZXJ0IE4gc3ViLXdvcmRzIGludG8gc2luZ2xlIHdvcmQgcXVhbnRpdHkgKi8KLQotI2RlZmluZSBVMl8xKEkwLEkxKSAoVjJfMShJMCwwKSB8IFYyXzEoSTEsMSkpCi0jZGVmaW5lIFU0XzEoSTAsSTEsSTIsSTMpIChWNF8xKEkwLDApIHwgVjRfMShJMSwxKSB8IFY0XzEoSTIsMikgfCBWNF8xKEkzLDMpKQotI2RlZmluZSBVOF8xKEkwLEkxLEkyLEkzLEk0LEk1LEk2LEk3KSBcCi0oVjhfMShJMCwwKSB8IFY4XzEoSTEsMSkgfCBWOF8xKEkyLDIpIHwgVjhfMShJMywzKSBcCi0gfCBWOF8xKEk0LDQpIHwgVjhfMShJNSw1KSB8IFY4XzEoSTYsNikgfCBWOF8xKEk3LDcpKQotI2RlZmluZSBVMTZfMShJMCxJMSxJMixJMyxJNCxJNSxJNixJNyxJOCxJOSxJMTAsSTExLEkxMixJMTMsSTE0LEkxNSkgXAotKFYxNl8xKEkwLDApIHwgVjE2XzEoSTEsMSkgfCBWMTZfMShJMiwyKSB8IFYxNl8xKEkzLDMpIFwKLSB8IFYxNl8xKEk0LDQpIHwgVjE2XzEoSTUsNSkgfCBWMTZfMShJNiw2KSB8IFYxNl8xKEk3LDcpIFwKLSB8IFYxNl8xKEk4LDgpIHwgVjE2XzEoSTksOSkgfCBWMTZfMShJMTAsMTApIHwgVjE2XzEoSTExLDExKSBcCi0gfCBWMTZfMShJMTIsMTIpIHwgVjE2XzEoSTEzLDEzKSB8IFYxNl8xKEkxNCwxNCkgfCBWMTZfMShJMTUsMTUpKQotCi0jZGVmaW5lIFU0XzIoSTAsSTEpIChWNF8yKEkwLDApIHwgVjRfMihJMSwxKSkKLSNkZWZpbmUgVThfMihJMCxJMSxJMixJMykgKFY4XzIoSTAsMCkgfCBWOF8yKEkxLDEpIHwgVjhfMihJMiwyKSB8IFY4XzIoSTMsMykpCi0jZGVmaW5lIFUxNl8yKEkwLEkxLEkyLEkzLEk0LEk1LEk2LEk3KSBcCi0oVjE2XzIoSTAsMCkgfCBWMTZfMihJMSwxKSB8IFYxNl8yKEkyLDIpIHwgVjE2XzIoSTMsMykgXAotIHwgVjE2XzIoSTQsNCkgfCBWMTZfMihJNSw1KSB8IFYxNl8yKEk2LDYpIHwgVjE2XzIoSTcsNykgKQotCi0jZGVmaW5lIFU4XzQoSTAsSTEpIChWOF80KEkwLDApIHwgVjhfNChJMSwxKSkKLSNkZWZpbmUgVTE2XzQoSTAsSTEsSTIsSTMpIChWMTZfNChJMCwwKSB8IFYxNl80KEkxLDEpIHwgVjE2XzQoSTIsMikgfCBWMTZfNChJMywzKSkKLQotI2RlZmluZSBVMTZfOChJMCxJMSkgKHNpbV9lbmRpYW5fam9pbl8xNiAoSTAsIEkxKSkKLQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgVndvcmRfSChYKSBWOF9INChYKQotI2RlZmluZSBWd29yZF9MKFgpIFY4X0w0KFgpCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotI2RlZmluZSBWd29yZF9IKFgpIFY0X0gyKFgpCi0jZGVmaW5lIFZ3b3JkX0woWCkgVjRfTDIoWCkKLSNlbmRpZgotCi0KLQotCi0jaWYgSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fRU5ESUFOX0lOTElORSkKLSNpbmNsdWRlICJzaW0tZW5kaWFuLmMiCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TSU1fRU5ESUFOX0hfICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1lbmdpbmUuYyBiL3NpbS9jb21tb24vc2ltLWVuZ2luZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE1ZjYzLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWVuZ2luZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qIEdlbmVyaWMgc2ltdWxhdG9yIGhhbHQvcmVzdGFydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdldCB0aGUgcnVuIHN0YXRlLgotICAgUkVBU09OL1NJR1JDIGFyZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHNpbV9zdG9wX3JlYXNvbi4KLSAgID8/PyBTaG91bGQgZWFjaCBjcHUgaGF2ZSBpdHMgb3duIGNvcHk/ICAqLwotCi12b2lkCi1zaW1fZW5naW5lX2dldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpCi17Ci0gIHNpbV9lbmdpbmUgKmVuZ2luZSA9IFNUQVRFX0VOR0lORSAoc2QpOwotICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gICpyZWFzb24gPSBlbmdpbmUtPnJlYXNvbjsKLSAgKnNpZ3JjID0gZW5naW5lLT5zaWdyYzsKLX0KLQotLyogU2V0IHRoZSBydW4gc3RhdGUgdG8gUkVBU09OL1NJR1JDLgotICAgUkVBU09OL1NJR1JDIGFyZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHNpbV9zdG9wX3JlYXNvbi4KLSAgID8/PyBTaG91bGQgZWFjaCBjcHUgaGF2ZSBpdHMgb3duIGNvcHk/ICAqLwotCi12b2lkCi1zaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wIHJlYXNvbiwgaW50IHNpZ3JjKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBlbmdpbmUtPnJlYXNvbiA9IHJlYXNvbjsKLSAgZW5naW5lLT5zaWdyYyA9IHNpZ3JjOwotfQotCi0vKiBHZW5lcmljIGhhbHQgKi8KLQotdm9pZAotc2ltX2VuZ2luZV9oYWx0IChTSU1fREVTQyBzZCwKLQkJIHNpbV9jcHUgKmxhc3RfY3B1LAotCQkgc2ltX2NwdSAqbmV4dF9jcHUsIC8qIE5VTEwgLSB1c2UgZGVmYXVsdCAqLwotCQkgc2ltX2NpYSBjaWEsCi0JCSBlbnVtIHNpbV9zdG9wIHJlYXNvbiwKLQkJIGludCBzaWdyYykKLXsKLSAgc2ltX2VuZ2luZSAqZW5naW5lID0gU1RBVEVfRU5HSU5FIChzZCk7Ci0gIEFTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgaWYgKGVuZ2luZS0+am1wYnVmICE9IE5VTEwpCi0gICAgewotICAgICAgam1wX2J1ZiAqaGFsdF9idWYgPSBlbmdpbmUtPmptcGJ1ZjsKLSAgICAgIGVuZ2luZS0+bGFzdF9jcHUgPSBsYXN0X2NwdTsKLSAgICAgIGVuZ2luZS0+bmV4dF9jcHUgPSBuZXh0X2NwdTsKLSAgICAgIGVuZ2luZS0+cmVhc29uID0gcmVhc29uOwotICAgICAgZW5naW5lLT5zaWdyYyA9IHNpZ3JjOwotCi0gICAgICBTSU1fRU5HSU5FX0hBTFRfSE9PSyAoc2QsIGxhc3RfY3B1LCBjaWEpOwotCi0jaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fU1VTUEVORAotICAgICAgaWYgKGxhc3RfY3B1ICE9IE5VTEwgJiYgcmVhc29uICE9IHNpbV9leGl0ZWQpCi0JU0lNX0NQVV9FWENFUFRJT05fU1VTUEVORCAoc2QsIGxhc3RfY3B1LCBzaW1fc2lnbmFsX3RvX2hvc3QgKHNkLCBzaWdyYykpOwotI2VuZGlmCi0KLSAgICAgIGxvbmdqbXAgKCpoYWx0X2J1Ziwgc2ltX2VuZ2luZV9oYWx0X2ptcHZhbCk7Ci0gICAgfQotICBlbHNlCi0gICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9oYWx0IC0gYmFkIGxvbmcganVtcCIpOwotfQotCi0KLS8qIEdlbmVyaWMgcmVzdGFydCAqLwotCi12b2lkCi1zaW1fZW5naW5lX3Jlc3RhcnQgKFNJTV9ERVNDIHNkLAotCQkgICAgc2ltX2NwdSAqbGFzdF9jcHUsCi0JCSAgICBzaW1fY3B1ICpuZXh0X2NwdSwKLQkJICAgIHNpbV9jaWEgY2lhKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBpZiAoZW5naW5lLT5qbXBidWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBqbXBfYnVmICpoYWx0X2J1ZiA9IGVuZ2luZS0+am1wYnVmOwotICAgICAgZW5naW5lLT5sYXN0X2NwdSA9IGxhc3RfY3B1OwotICAgICAgZW5naW5lLT5uZXh0X2NwdSA9IG5leHRfY3B1OwotICAgICAgU0lNX0VOR0lORV9SRVNUQVJUX0hPT0sgKHNkLCBsYXN0X2NwdSwgY2lhKTsKLSAgICAgIGxvbmdqbXAgKCpoYWx0X2J1Ziwgc2ltX2VuZ2luZV9yZXN0YXJ0X2ptcHZhbCk7Ci0gICAgfQotICBlbHNlCi0gICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9yZXN0YXJ0IC0gYmFkIGxvbmcganVtcCIpOwotfQotCi0KLS8qIEdlbmVyaWMgZXJyb3IgY29kZSAqLwotCi12b2lkCi1zaW1fZW5naW5lX3ZhYm9ydCAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgc2ltX2NpYSBjaWEsCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAgdmFfbGlzdCBhcCkKLXsKLSAgQVNTRVJUIChzZCA9PSBOVUxMIHx8IFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIGlmIChzZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXApOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5RdWl0XG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgZWxzZSBpZiAoU1RBVEVfRU5HSU5FIChzZCktPmptcGJ1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpbV9pb19ldnByaW50ZiAoc2QsIGZtdCwgYXApOwotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiXG4iKTsKLSAgICAgIHNpbV9pb19lcnJvciAoc2QsICJRdWl0IFNpbXVsYXRvciIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpbV9pb19ldnByaW50ZiAoc2QsIGZtdCwgYXApOwotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiXG4iKTsKLSAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGNwdSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0FCUlQpOwotICAgIH0KLX0KLQotdm9pZAotc2ltX2VuZ2luZV9hYm9ydCAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2NwdSAqY3B1LAotCQkgIHNpbV9jaWEgY2lhLAotCQkgIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIEFTU0VSVCAoc2QgPT0gTlVMTCB8fCBTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgc2ltX2VuZ2luZV92YWJvcnQgKHNkLCBjcHUsIGNpYSwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotCi0KLS8qIEdlbmVyaWMgbmV4dC9sYXN0IGNwdSAqLwotCi1pbnQKLXNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKFNJTV9ERVNDIHNkKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgaWYgKGVuZ2luZS0+bGFzdF9jcHUgIT0gTlVMTCkKLSAgICByZXR1cm4gZW5naW5lLT5sYXN0X2NwdSAtIFNUQVRFX0NQVSAoc2QsIDApOwotICBlbHNlCi0gICAgcmV0dXJuIE1BWF9OUl9QUk9DRVNTT1JTOwotfQotCi1pbnQKLXNpbV9lbmdpbmVfbmV4dF9jcHVfbnIgKFNJTV9ERVNDIHNkKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgaWYgKGVuZ2luZS0+bmV4dF9jcHUgIT0gTlVMTCkKLSAgICByZXR1cm4gZW5naW5lLT5uZXh0X2NwdSAtIFNUQVRFX0NQVSAoc2QsIDApOwotICBlbHNlCi0gICAgcmV0dXJuIHNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKHNkKSArIDE7Ci19Ci0KLWludAotc2ltX2VuZ2luZV9ucl9jcHVzIChTSU1fREVTQyBzZCkKLXsKLSAgc2ltX2VuZ2luZSAqZW5naW5lID0gU1RBVEVfRU5HSU5FIChzZCk7Ci0gIHJldHVybiBlbmdpbmUtPm5yX2NwdXM7Ci19Ci0KLQotCi0KLS8qIEluaXRpYWxpemF0aW9uICovCi0KLXN0YXRpYyBTSU1fUkMKLXNpbV9lbmdpbmVfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIC8qIGluaXRpYWxpemUgdGhlIHN0YXJ0L3N0b3AvcmVzdW1lIGVuZ2luZSAqLwotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgZW5naW5lLT5qbXBidWYgPSBOVUxMOwotICBlbmdpbmUtPmxhc3RfY3B1ID0gTlVMTDsKLSAgZW5naW5lLT5uZXh0X2NwdSA9IE5VTEw7Ci0gIGVuZ2luZS0+bnJfY3B1cyA9IE1BWF9OUl9QUk9DRVNTT1JTOwotICBlbmdpbmUtPnJlYXNvbiA9IHNpbV9ydW5uaW5nOwotICBlbmdpbmUtPnNpZ3JjID0gMDsKLSAgZW5naW5lLT5zdGVwcGVyID0gTlVMTDsgLyogc2ltX2V2ZW50c19pbml0IHdpbGwgY2xlYW4gaXQgdXAgKi8KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotCi1TSU1fUkMKLXNpbV9lbmdpbmVfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCi17Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fZW5naW5lX2luaXQpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZW5naW5lLmggYi9zaW0vY29tbW9uL3NpbS1lbmdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhYTUxZi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1lbmdpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBHZW5lcmljIHNpbXVsYXRvciBoYWx0L3Jlc3VtZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgU0lNX0VOR0lORV9ICi0jZGVmaW5lIFNJTV9FTkdJTkVfSAotCi0KLXR5cGVkZWYgc3RydWN0IF9zaW1fZW5naW5lIHNpbV9lbmdpbmU7Ci1zdHJ1Y3QgX3NpbV9lbmdpbmUKLXsKLSAgdm9pZCAqam1wYnVmOwotICBzaW1fY3B1ICpsYXN0X2NwdTsKLSAgc2ltX2NwdSAqbmV4dF9jcHU7Ci0gIGludCBucl9jcHVzOwotICBlbnVtIHNpbV9zdG9wIHJlYXNvbjsKLSAgc2ltX2V2ZW50ICpzdGVwcGVyOwotICBpbnQgc2lncmM7Ci19OwotCi0KLQotLyogam1wdmFsOiAwIChpbml0aWFsIHVzZSkgc3RhcnQgc2ltdWxhdG9yCi0gICAgICAgICAgIDEgICAgICAgICAgICAgICBoYWx0IHNpbXVsYXRvcgotICAgICAgICAgICAyICAgICAgICAgICAgICAgcmVzdGFydCBzaW11bGF0b3IKLSAgIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIElTTyBDIHN0YW5kYXJkICh0aGUgb25seSB0aW1lIDAgaXMgcmV0dXJuZWQKLSAgIGlzIGF0IHRoZSBpbml0aWFsIGNhbGwgdG8gc2V0am1wKS4gKi8KLQotZW51bSB7Ci0gIHNpbV9lbmdpbmVfc3RhcnRfam1wdmFsLAotICBzaW1fZW5naW5lX2hhbHRfam1wdmFsLAotICBzaW1fZW5naW5lX3Jlc3RhcnRfam1wdmFsLAotfTsKLQotCi0vKiBHZXQvc2V0IHRoZSBydW4gc3RhdGUgb2YgQ1BVIHRvIFJFQVNPTi9TSUdSQy4KLSAgIFJFQVNPTi9TSUdSQyBhcmUgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBzaW1fc3RvcF9yZWFzb24uICAqLwotdm9pZCBzaW1fZW5naW5lX2dldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpOwotdm9pZCBzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wIHJlYXNvbiwgaW50IHNpZ3JjKTsKLQotCi0vKiBIYWx0IHRoZSBzaW11bGF0b3IgKm5vdyogKi8KLQotZXh0ZXJuIHZvaWQgc2ltX2VuZ2luZV9oYWx0Ci0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqbGFzdF9jcHUsIC8qIE5VTEwgLT4gaW4gZXZlbnQtbWdyICovCi0gc2ltX2NwdSAqbmV4dF9jcHUsIC8qIE5VTEwgLT4gc3VjYyAobGFzdF9jcHUpIG9yIGV2ZW50LW1nciAqLwotIHNpbV9jaWEgY2lhLAotIGVudW0gc2ltX3N0b3AgcmVhc29uLAotIGludCBzaWdyYyk7Ci0KLS8qIEhhbHQgaG9vayAtIGFsbG93IHRhcmdldCBzcGVjaWZpYyBvcGVyYXRpb24gd2hlbiBoYWx0aW5nIGEKLSAgIHNpbXVsYXRvciAqLwotCi0jaWYgIWRlZmluZWQgKFNJTV9FTkdJTkVfSEFMVF9IT09LKQotI2RlZmluZSBTSU1fRU5HSU5FX0hBTFRfSE9PSyhTRCwgTEFTVF9DUFUsIENJQSkgXAotaWYgKChMQVNUX0NQVSkgIT0gTlVMTCkgQ0lBX1NFVCAoTEFTVF9DUFUsIENJQSkKLSNlbmRpZgotCi0vKiBOQjogSWYgYSBwb3J0IHVzZXMgdGhlIFNJTV9DUFVfRVhDRVBUSU9OXyogaG9va3MsIHRoZSBkZWZhdWx0IAotICAgU0lNX0VOR0lORV9IQUxUX0hPT0sgYW5kIFNJTV9FTkdJTkVfUkVTVU1FX0hPT0sgbXVzdCBub3QgYmUgdXNlZC4KLSAgIFRoZXkgY29uZmxpY3QgaW4gdGhhdCB0aGUgUEMgc2V0IGJ5IHRoZSBIQUxUX0hPT0sgbWF5IG92ZXJ3cml0ZSB0aGUKLSAgIHByb3BlciBvbmUsIGFzIGludGVuZGVkIHRvIGJlIHNhdmVkIGJ5IHRoZSBFWENFUFRJT05fVFJJR0dFUgotICAgaG9vay4gKi8KLQotCi0vKiByZXN0YXJ0IHRoZSBzaW11bGF0b3IgKm5vdyogKi8KLQotZXh0ZXJuIHZvaWQgc2ltX2VuZ2luZV9yZXN0YXJ0Ci0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqbGFzdF9jcHUsIC8qIE5VTEwgLT4gaW4gZXZlbnQtbWdyICovCi0gc2ltX2NwdSAqbmV4dF9jcHUsIC8qIE5VTEwgLT4gc3VjYyAobGFzdF9jcHUpIG9yIGV2ZW50LW1nciAqLwotIHNpbV9jaWEgY2lhKTsKLQotLyogUmVzdGFydCBob29rIC0gYWxsb3cgdGFyZ2V0IHNwZWNpZmljIG9wZXJhdGlvbiB3aGVuIHJlc3RhcnRpbmcgYQotICAgc2ltdWxhdG9yICovCi0KLSNpZiAhZGVmaW5lZCAoU0lNX0VOR0lORV9SRVNUQVJUX0hPT0spCi0jZGVmaW5lIFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKSBTSU1fRU5HSU5FX0hBTFRfSE9PSyhTRCwgTEFTVF9DUFUsIENJQSkKLSNlbmRpZgotCi0KLQotCi0vKiBBYm9ydCB0aGUgc2ltdWxhdG9yICpub3cqLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIE5VTEwgc2FmZS4gIEl0IGNhbiBiZSBjYWxsZWQgd2hlbiBlaXRoZXIgb2YgU0Qgb3IKLSAgIENJQSBhcmUgTlVMTC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBzZXRqbXAvbG9uZ2ptcCBzYWZlLiAgSXQgY2FuIGJlIGNhbGxlZCB3aGVuIG9mCi0gICB0aGUgc2ltX2VuZ2luZSBzZXRqbXAvbG9uZ2ptcCBidWZmZXIgaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkLgotCi0gICBTaW11bGF0b3JzIHRoYXQgYXJlIHVzaW5nIGNvbXBvbmVudHMgc3VjaCBhcyBzaW0tY29yZSBidXQgYXJlIG5vdAotICAgeWV0IHVzaW5nIHRoaXMgc2ltLWVuZ2luZSBtb2R1bGUgc2hvdWxkIGxpbmsgaW4gZmlsZSBzaW0tYWJvcnQubwotICAgd2hpY2ggaW1wbGVtZW50cyBhIG5vbiBzZXRqbXAvbG9uZ2ptcCB2ZXJzaW9uIG9mCi0gICBzaW1fZW5naW5lX2Fib3J0LiAqLwotCi1leHRlcm4gdm9pZCBzaW1fZW5naW5lX2Fib3J0Ci0oU0lNX0RFU0Mgc2QsCi0gc2ltX2NwdSAqY3B1LAotIHNpbV9jaWEgY2lhLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKLQotZXh0ZXJuIHZvaWQgc2ltX2VuZ2luZV92YWJvcnQKLShTSU1fREVTQyBzZCwKLSBzaW1fY3B1ICpjcHUsCi0gc2ltX2NpYSBjaWEsCi0gY29uc3QgY2hhciAqZm10LAotIHZhX2xpc3QgYXApOwotCi0vKiBObyBhYm9ydCBob29rIC0gd2hlbiBwb3NzaWJsZSB0aGlzIGZ1bmN0aW9uIGV4aXRzIHVzaW5nIHRoZQotICAgZW5naW5lX2hhbHQgZnVuY3Rpb24gKGFuZCBTSU1fRU5HSU5FX0hBTFRfSE9PSykuICovCi0KLQotCi0KLS8qIENhbGxlZCBieSB0aGUgZ2VuZXJpYyBzaW1fcmVzdW1lIHRvIHJ1biB0aGUgc2ltdWxhdGlvbiB3aXRoaW4gdGhlCi0gICBhYm92ZSBzYWZ0eSBuZXQuCi0KLSAgIEFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2VuZ2luZV9ydW4gY2FuIGJlIGZvdW5kIGluIHRoZQotICAgZmlsZSBzaW0tcnVuLmMgKi8KLQotZXh0ZXJuIHZvaWQgc2ltX2VuZ2luZV9ydW4KLShTSU1fREVTQyBzZCwKLSBpbnQgbmV4dF9jcHVfbnIsCi0gaW50IG5yX2NwdXMsCi0gaW50IHNpZ2duYWwpOyAvKiBtb3N0IHNpbXVsYXRvcnMgaWdub3JlIHNpZ2duYWwgKi8KLQotCi0KLS8qIERldGVybWluZSB0aGUgc3RhdGUgb2YgbmV4dC9sYXN0IGNwdSB3aGVuIHRoZSBzaW11bGF0b3Igd2FzIGxhc3QKLSAgIGhhbHRlZCAtIGEgdmFsdWUgPj0gTUFYX05SX1BST0NFU1NPUlMgaW5kaWNhdGVzIHRoYXQgdGhlCi0gICBldmVudC1xdWV1ZSB3YXMgbmV4dC9sYXN0LiAqLwotCi1leHRlcm4gaW50IHNpbV9lbmdpbmVfbmV4dF9jcHVfbnIgKFNJTV9ERVNDIHNkKTsKLWV4dGVybiBpbnQgc2ltX2VuZ2luZV9sYXN0X2NwdV9uciAoU0lNX0RFU0Mgc2QpOwotZXh0ZXJuIGludCBzaW1fZW5naW5lX25yX2NwdXMgKFNJTV9ERVNDIHNkKTsKLQotCi0vKiBFc3RhYmxpc2ggdGhlIHNpbXVsYXRvciBlbmdpbmUgKi8KLU1PRFVMRV9JTlNUQUxMX0ZOIHNpbV9lbmdpbmVfaW5zdGFsbDsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWV2ZW50cy5jIGIvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjk0YTcuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9FVkVOVFNfQ18KLSNkZWZpbmUgX1NJTV9FVkVOVFNfQ18KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNpZ25hbC5oPiAvKiBGb3IgU0lHUFJPQ01BU0sgZXQuYWwuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIHdhdGNoX2ludmFsaWQsCi0KLSAgLyogY29yZSAtIHRhcmdldCBieXRlIG9yZGVyICovCi0gIHdhdGNoX2NvcmVfdGFyZ18xLAotICB3YXRjaF9jb3JlX3RhcmdfMiwKLSAgd2F0Y2hfY29yZV90YXJnXzQsCi0gIHdhdGNoX2NvcmVfdGFyZ184LAotICAvKiBjb3JlIC0gYmlnLWVuZGlhbiAqLwotICB3YXRjaF9jb3JlX2JlXzEsCi0gIHdhdGNoX2NvcmVfYmVfMiwKLSAgd2F0Y2hfY29yZV9iZV80LAotICB3YXRjaF9jb3JlX2JlXzgsCi0gIC8qIGNvcmUgLSBsaXR0bGUtZW5kaWFuICovCi0gIHdhdGNoX2NvcmVfbGVfMSwKLSAgd2F0Y2hfY29yZV9sZV8yLAotICB3YXRjaF9jb3JlX2xlXzQsCi0gIHdhdGNoX2NvcmVfbGVfOCwKLQotICAvKiBzaW0gLSBob3N0IGJ5dGUgb3JkZXIgKi8KLSAgd2F0Y2hfc2ltX2hvc3RfMSwKLSAgd2F0Y2hfc2ltX2hvc3RfMiwKLSAgd2F0Y2hfc2ltX2hvc3RfNCwKLSAgd2F0Y2hfc2ltX2hvc3RfOCwKLSAgLyogc2ltIC0gYmlnLWVuZGlhbiAqLwotICB3YXRjaF9zaW1fYmVfMSwKLSAgd2F0Y2hfc2ltX2JlXzIsCi0gIHdhdGNoX3NpbV9iZV80LAotICB3YXRjaF9zaW1fYmVfOCwKLSAgLyogc2ltIC0gbGl0dGxlLWVuZGlhbiAqLwotICB3YXRjaF9zaW1fbGVfMSwKLSAgd2F0Y2hfc2ltX2xlXzIsCi0gIHdhdGNoX3NpbV9sZV80LAotICB3YXRjaF9zaW1fbGVfOCwKLSAgCi0gIC8qIHdhbGxjbG9jayAqLwotICB3YXRjaF9jbG9jaywKLQotICAvKiB0aW1lciAqLwotICB3YXRjaF90aW1lciwKLX0gc2ltX2V2ZW50X3dhdGNocG9pbnRzOwotCi0KLXN0cnVjdCBfc2ltX2V2ZW50IHsKLSAgc2ltX2V2ZW50X3dhdGNocG9pbnRzIHdhdGNoaW5nOwotICB2b2lkICpkYXRhOwotICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlcjsKLSAgLyogdGltZXIgZXZlbnQgKi8KLSAgc2lnbmVkNjQgdGltZV9vZl9ldmVudDsKLSAgLyogd2F0Y2ggd2FsbGNsb2NrIGV2ZW50ICovCi0gIHVuc2lnbmVkIHdhbGxjbG9jazsKLSAgLyogd2F0Y2ggY29yZSBhZGRyZXNzICovCi0gIGFkZHJlc3Nfd29yZCBjb3JlX2FkZHI7Ci0gIHVuc2lnbmVkIGNvcmVfbWFwOwotICAvKiB3YXRjaCBzaW0gYWRkciAqLwotICB2b2lkICpob3N0X2FkZHI7Ci0gIC8qIHdhdGNoIGNvcmUvc2ltIHJhbmdlICovCi0gIGludCBpc193aXRoaW47IC8qIDAvMSAqLwotICB1bnNpZ25lZCB1YjsKLSAgdW5zaWduZWQgbGI7Ci0gIHVuc2lnbmVkNjQgdWI2NDsKLSAgdW5zaWduZWQ2NCBsYjY0OwotICAvKiB0cmFjZSBpbmZvIChpZiBhbnkpICovCi0gIGNoYXIgKnRyYWNlOwotICAvKiBsaXN0ICovCi0gIHNpbV9ldmVudCAqbmV4dDsKLX07Ci0KLQotLyogVGhlIGV2ZW50IHF1ZXVlIG1haW50YWlucyBhIHNpbmdsZSBhYnNvbHV0ZSB0aW1lIHVzaW5nIHR3bwotICAgdmFyaWFibGVzLgotICAgCi0gICBUSU1FX09GX0VWRU5UOiB0aGlzIGhvbGRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IGV2ZW50IGlzIG1lbnQKLSAgIHRvIG9jY3VyZS4gIElmIG5vIG5leHQgZXZlbnQgaXQgd2lsbCBob2xkIHRoZSB0aW1lIG9mIHRoZSBsYXN0Ci0gICBldmVudC4KLQotICAgVElNRV9GUk9NX0VWRU5UOiBUaGUgY3VycmVudCBkaXN0YW5jZSBmcm9tIFRJTUVfT0ZfRVZFTlQuICBBIHZhbHVlCi0gICA8PSAwIChleGNlcHQgd2hlbiBwb2xsLWV2ZW50IGlzIGJlaW5nIHByb2Nlc3NlZCkgaW5kaWNhdGVzIHRoYXQKLSAgIGV2ZW50IHByb2Nlc3NpbmcgaXMgZHVlLiAgVGhpcyB2YXJpYWJsZSBpcyBkZWNyZW1lbnRlZCBvbmNlIGZvcgotICAgZWFjaCBpdGVyYXRpb24gb2YgYSBjbG9jayBjeWNsZS4KLQotICAgSW5pdGlhbGx5LCB0aGUgY2xvY2sgaXMgc3RhcnRlZCBhdCB0aW1lIG9uZSAoMCkgd2l0aCBUSU1FX09GX0VWRU5UCi0gICA9PSAwIGFuZCBUSU1FX0ZST01fRVZFTlQgPT0gMCBhbmQgd2l0aCBOUl9USUNLU19UT19QUk9DRVNTID09IDEuCi0KLSAgIENsZWFybHkgdGhlcmUgaXMgYSBidWcgaW4gdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBhYnNvbHV0ZQotICAgdGltZSBjb3VudGVyIHdpbGwgbmV2ZXIgYmVjb21lIGdyZWF0ZXIgdGhhbiAyXjYyLgotCi0gICBUbyBhdm9pZCB0aGUgbmVlZCB0byB1c2UgNjRiaXQgYXJpdGhtZXRpYywgdGhlIGV2ZW50IHF1ZXVlIGFsd2F5cwotICAgY29udGFpbnMgYXQgbGVhc3Qgb25lIGV2ZW50IHNjaGVkdWxlZCBldmVyeSAxNiAwMDAgdGlja3MuICBUaGlzCi0gICBsaW1pdHMgdGhlIHRpbWUgZnJvbSBldmVudCBjb3VudGVyIHRvIHZhbHVlcyBsZXNzIHRoYW4KLSAgIDE2IDAwMC4gKi8KLQotCi0jaWYgIWRlZmluZWQgKFNJTV9FVkVOVFNfUE9MTF9SQVRFKQotI2RlZmluZSBTSU1fRVZFTlRTX1BPTExfUkFURSAweDEwMDAKLSNlbmRpZgotCi0KLSNkZWZpbmUgX0VUUkFDRSBzZCwgTlVMTAotCi0jdW5kZWYgRVRSQUNFX1AKLSNkZWZpbmUgRVRSQUNFX1AgKFdJVEhfVFJBQ0UgJiYgU1RBVEVfRVZFTlRTIChzZCktPnRyYWNlKQotCi0jdW5kZWYgRVRSQUNFCi0jZGVmaW5lIEVUUkFDRShBUkdTKSBcCi1kbyBcCi0gIHsgXAotICAgIGlmIChFVFJBQ0VfUCkgXAotICAgICAgeyBcCi0gICAgICAgIGlmIChTVFJBQ0VfREVCVUdfUCAoc2QpKSBcCi0JICB7IFwKLQkgICAgY29uc3QgY2hhciAqZmlsZTsgXAotCSAgICBTSU1fRklMVEVSX1BBVEggKGZpbGUsIF9fRklMRV9fKTsgXAotCSAgICB0cmFjZV9wcmludGYgKHNkLCBOVUxMLCAiJXM6JWQ6ICIsIGZpbGUsIF9fTElORV9fKTsgXAotCSAgfSBcCi0gICAgICAgIHRyYWNlX3ByaW50ZiAgQVJHUzsgXAotICAgICAgfSBcCi0gIH0gXAotd2hpbGUgKDApCi0KLQotLyogZXZlbnQgcXVldWUgaXRlcmF0b3IgLSBkb24ndCBpdGVyYXRlIG92ZXIgdGhlIGhlbGQgcXVldWUuICovCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1zdGF0aWMgc2ltX2V2ZW50ICoqCi1uZXh0X2V2ZW50X3F1ZXVlIChTSU1fREVTQyBzZCwKLQkJICBzaW1fZXZlbnQgKipxdWV1ZSkKLXsKLSAgaWYgKHF1ZXVlID09IE5VTEwpCi0gICAgcmV0dXJuICZTVEFURV9FVkVOVFMgKHNkKS0+cXVldWU7Ci0gIGVsc2UgaWYgKHF1ZXVlID09ICZTVEFURV9FVkVOVFMgKHNkKS0+cXVldWUpCi0gICAgcmV0dXJuICZTVEFURV9FVkVOVFMgKHNkKS0+d2F0Y2hwb2ludHM7Ci0gIGVsc2UgaWYgKHF1ZXVlID09ICZTVEFURV9FVkVOVFMgKHNkKS0+d2F0Y2hwb2ludHMpCi0gICAgcmV0dXJuICZTVEFURV9FVkVOVFMgKHNkKS0+d2F0Y2hlZHBvaW50czsKLSAgZWxzZSBpZiAocXVldWUgPT0gJlNUQVRFX0VWRU5UUyAoc2QpLT53YXRjaGVkcG9pbnRzKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgc2ltX2lvX2Vycm9yIChzZCwgIm5leHRfZXZlbnRfcXVldWUgLSBiYWQgcXVldWUiKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotCi1TVEFUSUNfSU5MSU5FX1NJTV9FVkVOVFNcCi0odm9pZCkKLXNpbV9ldmVudHNfcG9sbCAoU0lNX0RFU0Mgc2QsCi0JCSB2b2lkICpkYXRhKQotewotICAvKiBqdXN0IHJlLXNjaGVkdWxlIGluIDEwMDAgbWlsbGlvbiB0aWNrcyB0aW1lICovCi0gIHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCBTSU1fRVZFTlRTX1BPTExfUkFURSwgc2ltX2V2ZW50c19wb2xsLCBzZCk7Ci0gIHNpbV9pb19wb2xsX3F1aXQgKHNkKTsKLX0KLQotCi0vKiAiZXZlbnRzIiBtb2R1bGUgaW5zdGFsbCBoYW5kbGVyLgotICAgVGhpcyBpcyBjYWxsZWQgdmlhIHNpbV9tb2R1bGVfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSAiZXZlbnRzIiBzdWJzeXN0ZW0KLSAgIGludG8gdGhlIHNpbXVsYXRvci4gICovCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1TVEFUSUNfU0lNX0VWRU5UUyAoTU9EVUxFX1VOSU5TVEFMTF9GTikgc2ltX2V2ZW50c191bmluc3RhbGw7Ci1TVEFUSUNfU0lNX0VWRU5UUyAoTU9EVUxFX0lOSVRfRk4pIHNpbV9ldmVudHNfaW5pdDsKLVNUQVRJQ19TSU1fRVZFTlRTIChNT0RVTEVfUkVTVU1FX0ZOKSBzaW1fZXZlbnRzX3Jlc3VtZTsKLVNUQVRJQ19TSU1fRVZFTlRTIChNT0RVTEVfU1VTUEVORF9GTikgc2ltX2V2ZW50c19zdXNwZW5kOwotI2VuZGlmCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1TSU1fUkMKLXNpbV9ldmVudHNfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCi17Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHNpbV9tb2R1bGVfYWRkX3VuaW5zdGFsbF9mbiAoc2QsIHNpbV9ldmVudHNfdW5pbnN0YWxsKTsKLSAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIHNpbV9ldmVudHNfaW5pdCk7Ci0gIHNpbV9tb2R1bGVfYWRkX3Jlc3VtZV9mbiAoc2QsIHNpbV9ldmVudHNfcmVzdW1lKTsKLSAgc2ltX21vZHVsZV9hZGRfc3VzcGVuZF9mbiAoc2QsIHNpbV9ldmVudHNfc3VzcGVuZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0jZW5kaWYKLQotCi0vKiBTdXNwZW5kL3Jlc3VtZSB0aGUgZXZlbnQgcXVldWUgbWFuYWdlciB3aGVuIHRoZSBzaW11bGF0b3IgaXMgbm90Ci0gICBydW5uaW5nICovCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1zdGF0aWMgU0lNX1JDCi1zaW1fZXZlbnRzX3Jlc3VtZSAoU0lNX0RFU0Mgc2QpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBTSU1fQVNTRVJUIChldmVudHMtPnJlc3VtZV93YWxsY2xvY2sgPT0gMCk7Ci0gIGV2ZW50cy0+cmVzdW1lX3dhbGxjbG9jayA9IHNpbV9lbGFwc2VkX3RpbWVfZ2V0ICgpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotI2VuZGlmCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1zdGF0aWMgU0lNX1JDCi1zaW1fZXZlbnRzX3N1c3BlbmQgKFNJTV9ERVNDIHNkKQotewotICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrICE9IDApOwotICBldmVudHMtPmVsYXBzZWRfd2FsbGNsb2NrICs9IHNpbV9lbGFwc2VkX3RpbWVfc2luY2UgKGV2ZW50cy0+cmVzdW1lX3dhbGxjbG9jayk7Ci0gIGV2ZW50cy0+cmVzdW1lX3dhbGxjbG9jayA9IDA7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0jZW5kaWYKLQotCi0vKiBVbmluc3RhbGwgdGhlICJldmVudHMiIHN1YnN5c3RlbSBmcm9tIHRoZSBzaW11bGF0b3IuICAqLwotCi0jaWYgRVhURVJOX1NJTV9FVkVOVFNfUAotc3RhdGljIHZvaWQKLXNpbV9ldmVudHNfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgLyogRklYTUU6IGZyZWUgYnVmZmVycywgZXRjLiAqLwotfQotI2VuZGlmCi0KLQotLyogbWFsbG9jL2ZyZWUgKi8KLQotI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKLXN0YXRpYyBzaW1fZXZlbnQgKgotc2ltX2V2ZW50c196YWxsb2MgKFNJTV9ERVNDIHNkKQotewotICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKLSAgc2ltX2V2ZW50ICpuZXcgPSBldmVudHMtPmZyZWVfbGlzdDsKLSAgaWYgKG5ldyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGV2ZW50cy0+ZnJlZV9saXN0ID0gbmV3LT5uZXh0OwotICAgICAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAoKm5ldykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBkZWZpbmVkIChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkIChTSUdfU0VUTUFTSykKLSAgICAgIC8qLUxPQ0stKi8KLSAgICAgIHNpZ3NldF90IG9sZF9tYXNrOwotICAgICAgc2lnc2V0X3QgbmV3X21hc2s7Ci0gICAgICBzaWdmaWxsc2V0KCZuZXdfbWFzayk7Ci0gICAgICBzaWdwcm9jbWFzayAoU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKLSNlbmRpZgotICAgICAgbmV3ID0gWkFMTE9DIChzaW1fZXZlbnQpOwotI2lmIGRlZmluZWQgKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQgKFNJR19TRVRNQVNLKQotICAgICAgLyotVU5MT0NLLSovCi0gICAgICBzaWdwcm9jbWFzayAoU0lHX1NFVE1BU0ssICZvbGRfbWFzaywgTlVMTCk7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiBuZXc7Ci19Ci0jZW5kaWYKLQotU1RBVElDX0lOTElORV9TSU1fRVZFTlRTXAotKHZvaWQpCi1zaW1fZXZlbnRzX2ZyZWUgKFNJTV9ERVNDIHNkLAotCQkgc2ltX2V2ZW50ICpkZWFkKQotewotICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKLSAgZGVhZC0+bmV4dCA9IGV2ZW50cy0+ZnJlZV9saXN0OwotICBldmVudHMtPmZyZWVfbGlzdCA9IGRlYWQ7Ci0gIGlmIChkZWFkLT50cmFjZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGRlYWQtPnRyYWNlKTsgLyogTkI6IGFzcHJpbnRmIHJldHVybnMgYSBgZnJlZScgYnVmICovCi0gICAgICBkZWFkLT50cmFjZSA9IE5VTEw7Ci0gICAgfQotfQotCi0KLS8qIEluaXRpYWxpemUgdGhlIHNpbXVsYXRvciBldmVudCBtYW5hZ2VyICovCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1TSU1fUkMKLXNpbV9ldmVudHNfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotCi0gIC8qIGRyYWluIHRoZSBpbnRlcnJ1cHQgcXVldWUgKi8KLSAgZXZlbnRzLT5ucl9oZWxkID0gMDsKLSAgaWYgKGV2ZW50cy0+aGVsZCA9PSBOVUxMKQotICAgIGV2ZW50cy0+aGVsZCA9IE5aQUxMT0MgKHNpbV9ldmVudCwgTUFYX05SX1NJR05BTF9TSU1fRVZFTlRTKTsKLQotICAvKiBkcmFpbiB0aGUgbm9ybWFsIHF1ZXVlcyAqLwotICB7Ci0gICAgc2ltX2V2ZW50ICoqcXVldWUgPSBOVUxMOwotICAgIHdoaWxlICgocXVldWUgPSBuZXh0X2V2ZW50X3F1ZXVlIChzZCwgcXVldWUpKSAhPSBOVUxMKQotICAgICAgewotCWlmIChxdWV1ZSA9PSBOVUxMKSBicmVhazsKLQl3aGlsZSAoKnF1ZXVlICE9IE5VTEwpCi0JICB7Ci0JICAgIHNpbV9ldmVudCAqZGVhZCA9ICpxdWV1ZTsKLQkgICAgKnF1ZXVlID0gZGVhZC0+bmV4dDsKLQkgICAgc2ltX2V2ZW50c19mcmVlIChzZCwgZGVhZCk7Ci0JICB9Ci0JKnF1ZXVlID0gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIHdpbmQgdGltZSBiYWNrIHRvIHplcm8gKi8KLSAgZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzID0gMTsgLyogc3RhcnQgYnkgZG9pbmcgcXVldWUgKi8KLSAgZXZlbnRzLT50aW1lX29mX2V2ZW50ID0gMDsKLSAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPSAwOwotICBldmVudHMtPmVsYXBzZWRfd2FsbGNsb2NrID0gMDsKLSAgZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrID0gMDsKLQotICAvKiBzY2hlZHVsZSBvdXIgaW5pdGlhbCBjb3VudGVyIGV2ZW50ICovCi0gIHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAwLCBzaW1fZXZlbnRzX3BvbGwsIHNkKTsKLQotICAvKiBmcm9tIG5vdyBvbiwgZXhjZXB0IHdoZW4gdGhlIGxhcmdlLWludCBldmVudCBpcyBiZWluZyBwcm9jZXNzZWQKLSAgICAgdGhlIGV2ZW50IHF1ZXVlIGlzIG5vbiBlbXB0eSAqLwotICBTSU1fQVNTRVJUIChldmVudHMtPnF1ZXVlICE9IE5VTEwpOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0jZW5kaWYKLQotCi1JTkxJTkVfU0lNX0VWRU5UU1wKLShzaWduZWQ2NCkKLXNpbV9ldmVudHNfdGltZSAoU0lNX0RFU0Mgc2QpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICByZXR1cm4gKGV2ZW50cy0+dGltZV9vZl9ldmVudCAtIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50KTsKLX0KLQotCi1JTkxJTkVfU0lNX0VWRU5UU1wKLSh1bnNpZ25lZCBsb25nKQotc2ltX2V2ZW50c19lbGFwc2VkX3RpbWUgKFNJTV9ERVNDIHNkKQotewotICB1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBTVEFURV9FVkVOVFMgKHNkKS0+ZWxhcHNlZF93YWxsY2xvY2s7Ci0KLSAgLyogQXJlIHdlIGJlaW5nIGNhbGxlZCBpbnNpZGUgc2ltX3Jlc3VtZT8KLSAgICAgKElzIHRoZXJlIGEgc2ltdWxhdGlvbiBpbiBwcm9ncmVzcz8pICAqLwotICBpZiAoU1RBVEVfRVZFTlRTIChzZCktPnJlc3VtZV93YWxsY2xvY2sgIT0gMCkKLSAgICAgZWxhcHNlZCArPSBzaW1fZWxhcHNlZF90aW1lX3NpbmNlIChTVEFURV9FVkVOVFMgKHNkKS0+cmVzdW1lX3dhbGxjbG9jayk7Ci0KLSAgcmV0dXJuIGVsYXBzZWQ7Ci19Ci0KLQotU1RBVElDX0lOTElORV9TSU1fRVZFTlRTXAotKHZvaWQpCi11cGRhdGVfdGltZV9mcm9tX2V2ZW50IChTSU1fREVTQyBzZCkKLXsKLSAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7Ci0gIHNpZ25lZDY0IGN1cnJlbnRfdGltZSA9IHNpbV9ldmVudHNfdGltZSAoc2QpOwotICBpZiAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGV2ZW50cy0+dGltZV9vZl9ldmVudCA9IGV2ZW50cy0+cXVldWUtPnRpbWVfb2ZfZXZlbnQ7Ci0gICAgICBldmVudHMtPnRpbWVfZnJvbV9ldmVudCA9IChldmVudHMtPnF1ZXVlLT50aW1lX29mX2V2ZW50IC0gY3VycmVudF90aW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBldmVudHMtPnRpbWVfb2ZfZXZlbnQgPSBjdXJyZW50X3RpbWUgLSAxOwotICAgICAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPSAtMTsKLSAgICB9Ci0gIGlmIChFVFJBQ0VfUCkKLSAgICB7Ci0gICAgICBzaW1fZXZlbnQgKmV2ZW50OwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGV2ZW50ID0gZXZlbnRzLT5xdWV1ZSwgaSA9IDA7Ci0JICAgZXZlbnQgIT0gTlVMTDsKLQkgICBldmVudCA9IGV2ZW50LT5uZXh0LCBpKyspCi0JewotCSAgRVRSQUNFICgoX0VUUkFDRSwKLQkJICAgImV2ZW50IHRpbWUtZnJvbS1ldmVudCAtIHRpbWUgJWxkLCBkZWx0YSAlbGQgLSBldmVudCAlZCwgdGFnIDB4JWx4LCB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseCVzJXNcbiIsCi0JCSAgIChsb25nKWN1cnJlbnRfdGltZSwKLQkJICAgKGxvbmcpZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQsCi0JCSAgIGksCi0JCSAgIChsb25nKWV2ZW50LAotCQkgICAobG9uZylldmVudC0+dGltZV9vZl9ldmVudCwKLQkJICAgKGxvbmcpZXZlbnQtPmhhbmRsZXIsCi0JCSAgIChsb25nKWV2ZW50LT5kYXRhLAotCQkgICAoZXZlbnQtPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAotCQkgICAoZXZlbnQtPnRyYWNlICE9IE5VTEwpID8gZXZlbnQtPnRyYWNlIDogIiIpKTsKLQl9Ci0gICAgfQotICBTSU1fQVNTRVJUIChjdXJyZW50X3RpbWUgPT0gc2ltX2V2ZW50c190aW1lIChzZCkpOwotfQotCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3NpbV9ldmVudCAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2V2ZW50ICpuZXdfZXZlbnQsCi0JCSAgc2lnbmVkNjQgZGVsdGEpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBzaW1fZXZlbnQgKmN1cnI7Ci0gIHNpbV9ldmVudCAqKnByZXY7Ci0gIHNpZ25lZDY0IHRpbWVfb2ZfZXZlbnQ7Ci0KLSAgaWYgKGRlbHRhIDwgMCkKLSAgICBzaW1faW9fZXJyb3IgKHNkLCAid2hhdCBpcyBwYXN0IGlzIHBhc3QhXG4iKTsKLSAgCi0gIC8qIGNvbXB1dGUgd2hlbiB0aGUgZXZlbnQgc2hvdWxkIG9jY3VyZSAqLwotICB0aW1lX29mX2V2ZW50ID0gc2ltX2V2ZW50c190aW1lIChzZCkgKyBkZWx0YTsKLSAgCi0gIC8qIGZpbmQgdGhlIHF1ZXVlIGluc2VydGlvbiBwb2ludCAtIHRoaW5ncyBhcmUgdGltZSBvcmRlcmVkICovCi0gIHByZXYgPSAmZXZlbnRzLT5xdWV1ZTsKLSAgY3VyciA9IGV2ZW50cy0+cXVldWU7Ci0gIHdoaWxlIChjdXJyICE9IE5VTEwgJiYgdGltZV9vZl9ldmVudCA+PSBjdXJyLT50aW1lX29mX2V2ZW50KQotICAgIHsKLSAgICAgIFNJTV9BU1NFUlQgKGN1cnItPm5leHQgPT0gTlVMTAotCQkgIHx8IGN1cnItPnRpbWVfb2ZfZXZlbnQgPD0gY3Vyci0+bmV4dC0+dGltZV9vZl9ldmVudCk7Ci0gICAgICBwcmV2ID0gJmN1cnItPm5leHQ7Ci0gICAgICBjdXJyID0gY3Vyci0+bmV4dDsKLSAgICB9Ci0gIFNJTV9BU1NFUlQgKGN1cnIgPT0gTlVMTCB8fCB0aW1lX29mX2V2ZW50IDwgY3Vyci0+dGltZV9vZl9ldmVudCk7Ci0gIAotICAvKiBpbnNlcnQgaXQgKi8KLSAgbmV3X2V2ZW50LT5uZXh0ID0gY3VycjsKLSAgKnByZXYgPSBuZXdfZXZlbnQ7Ci0gIG5ld19ldmVudC0+dGltZV9vZl9ldmVudCA9IHRpbWVfb2ZfZXZlbnQ7Ci0gIAotICAvKiBhZGp1c3QgdGhlIHRpbWUgdW50aWwgdGhlIGZpcnN0IGV2ZW50ICovCi0gIHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQgKHNkKTsKLX0KLSNlbmRpZgotCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi1zaW1fZXZlbnQgKgotc2ltX2V2ZW50c19zY2hlZHVsZSAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgc2lnbmVkNjQgZGVsdGFfdGltZSwKLQkJICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLQkJICAgICB2b2lkICpkYXRhKQotewotICB2YV9saXN0IGR1bW15OwotICByZXR1cm4gc2ltX2V2ZW50c19zY2hlZHVsZV92dHJhY2VmIChzZCwgZGVsdGFfdGltZSwgaGFuZGxlciwgZGF0YSwKLQkJCQkgICAgICBOVUxMLCBkdW1teSk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgRVhURVJOX1NJTV9FVkVOVFNfUAotc2ltX2V2ZW50ICoKLXNpbV9ldmVudHNfc2NoZWR1bGVfdHJhY2VmIChTSU1fREVTQyBzZCwKLQkJCSAgICBzaWduZWQ2NCBkZWx0YV90aW1lLAotCQkJICAgIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotCQkJICAgIHZvaWQgKmRhdGEsCi0JCQkgICAgY29uc3QgY2hhciAqZm10LAotCQkJICAgIC4uLikKLXsKLSAgc2ltX2V2ZW50ICpuZXdfZXZlbnQ7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgbmV3X2V2ZW50ID0gc2ltX2V2ZW50c19zY2hlZHVsZV92dHJhY2VmIChzZCwgZGVsdGFfdGltZSwgaGFuZGxlciwgZGF0YSwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICByZXR1cm4gbmV3X2V2ZW50OwotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKLXNpbV9ldmVudCAqCi1zaW1fZXZlbnRzX3NjaGVkdWxlX3Z0cmFjZWYgKFNJTV9ERVNDIHNkLAotCQkJICAgICBzaWduZWQ2NCBkZWx0YV90aW1lLAotCQkJICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLQkJCSAgICAgdm9pZCAqZGF0YSwKLQkJCSAgICAgY29uc3QgY2hhciAqZm10LAotCQkJICAgICB2YV9saXN0IGFwKQotewotICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7Ci0gIG5ld19ldmVudC0+ZGF0YSA9IGRhdGE7Ci0gIG5ld19ldmVudC0+aGFuZGxlciA9IGhhbmRsZXI7Ci0gIG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF90aW1lcjsKLSAgaWYgKGZtdCA9PSBOVUxMIHx8ICFFVFJBQ0VfUCB8fCB2YXNwcmludGYgKCZuZXdfZXZlbnQtPnRyYWNlLCBmbXQsIGFwKSA8IDApCi0gICAgbmV3X2V2ZW50LT50cmFjZSA9IE5VTEw7Ci0gIGluc2VydF9zaW1fZXZlbnQoc2QsIG5ld19ldmVudCwgZGVsdGFfdGltZSk7Ci0gIEVUUkFDRSgoX0VUUkFDRSwKLQkgICJldmVudCBzY2hlZHVsZWQgYXQgJWxkIC0gdGFnIDB4JWx4IC0gdGltZSAlbGQsIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHglcyVzXG4iLAotCSAgKGxvbmcpc2ltX2V2ZW50c190aW1lKHNkKSwKLQkgIChsb25nKW5ld19ldmVudCwKLQkgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKLQkgIChsb25nKW5ld19ldmVudC0+aGFuZGxlciwKLQkgIChsb25nKW5ld19ldmVudC0+ZGF0YSwKLQkgIChuZXdfZXZlbnQtPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAotCSAgKG5ld19ldmVudC0+dHJhY2UgIT0gTlVMTCkgPyBuZXdfZXZlbnQtPnRyYWNlIDogIiIpKTsKLSAgcmV0dXJuIG5ld19ldmVudDsKLX0KLSNlbmRpZgotCi0KLSNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCi12b2lkCi1zaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCAoU0lNX0RFU0Mgc2QsCi0JCQkJICBzaWduZWQ2NCBkZWx0YV90aW1lLAotCQkJCSAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0JCQkJICB2b2lkICpkYXRhKQotewotICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKLSAgc2ltX2V2ZW50ICpuZXdfZXZlbnQ7Ci0jaWYgZGVmaW5lZCAoSEFWRV9TSUdQUk9DTUFTSykgJiYgZGVmaW5lZCAoU0lHX1NFVE1BU0spCi0gIC8qLUxPQ0stKi8KLSAgc2lnc2V0X3Qgb2xkX21hc2s7Ci0gIHNpZ3NldF90IG5ld19tYXNrOwotICBzaWdmaWxsc2V0KCZuZXdfbWFzayk7Ci0gIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm5ld19tYXNrLCAmb2xkX21hc2spOwotI2VuZGlmCi0gIAotICAvKiBhbGxvY2F0ZSBhbiBldmVudCBlbnRyeSBmcm9tIHRoZSBzaWduYWwgYnVmZmVyICovCi0gIG5ld19ldmVudCA9ICZldmVudHMtPmhlbGQgW2V2ZW50cy0+bnJfaGVsZF07Ci0gIGV2ZW50cy0+bnJfaGVsZCArKzsKLSAgaWYgKGV2ZW50cy0+bnJfaGVsZCA+IE1BWF9OUl9TSUdOQUxfU0lNX0VWRU5UUykKLSAgICB7Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChOVUxMLCBOVUxMLCBOVUxMX0NJQSwKLQkJCSJzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCAtIGJ1ZmZlciBvdmVmbG93Iik7Ci0gICAgfQotICAKLSAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKLSAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50ID0gZGVsdGFfdGltZTsgLyogd29yayBpdCBvdXQgbGF0ZXIgKi8KLSAgbmV3X2V2ZW50LT5uZXh0ID0gTlVMTDsKLQotICBldmVudHMtPndvcmtfcGVuZGluZyA9IDE7IC8qIG5vdGlmeSBtYWluIHByb2Nlc3MgKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQgKFNJR19TRVRNQVNLKQotICAvKi1VTkxPQ0stKi8KLSAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOwotI2VuZGlmCi0gIAotICBFVFJBQ0UgKChfRVRSQUNFLAotCSAgICJzaWduYWwgc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIHRpbWUgJWxkLCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAotCSAgIChsb25nKXNpbV9ldmVudHNfdGltZShzZCksCi0JICAgKGxvbmcpbmV3X2V2ZW50LAotCSAgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKLQkgICAobG9uZyluZXdfZXZlbnQtPmhhbmRsZXIsCi0JICAgKGxvbmcpbmV3X2V2ZW50LT5kYXRhKSk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgRVhURVJOX1NJTV9FVkVOVFNfUAotc2ltX2V2ZW50ICoKLXNpbV9ldmVudHNfd2F0Y2hfY2xvY2sgKFNJTV9ERVNDIHNkLAotCQkJdW5zaWduZWQgZGVsdGFfbXNfdGltZSwKLQkJCXNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotCQkJdm9pZCAqZGF0YSkKLXsKLSAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7Ci0gIHNpbV9ldmVudCAqbmV3X2V2ZW50ID0gc2ltX2V2ZW50c196YWxsb2MgKHNkKTsKLSAgLyogdHlwZSAqLwotICBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY2xvY2s7Ci0gIC8qIGhhbmRsZXIgKi8KLSAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKLSAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgLyogZGF0YSAqLwotICBpZiAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrID09IDApCi0gICAgbmV3X2V2ZW50LT53YWxsY2xvY2sgPSAoZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jayArIGRlbHRhX21zX3RpbWUpOwotICBlbHNlCi0gICAgbmV3X2V2ZW50LT53YWxsY2xvY2sgPSAoZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jawotCQkJICAgICsgc2ltX2VsYXBzZWRfdGltZV9zaW5jZSAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrKQotCQkJICAgICsgZGVsdGFfbXNfdGltZSk7Ci0gIC8qIGluc2VydCAqLwotICBuZXdfZXZlbnQtPm5leHQgPSBldmVudHMtPndhdGNocG9pbnRzOwotICBldmVudHMtPndhdGNocG9pbnRzID0gbmV3X2V2ZW50OwotICBldmVudHMtPndvcmtfcGVuZGluZyA9IDE7Ci0gIEVUUkFDRSAoKF9FVFJBQ0UsCi0JICAiZXZlbnQgd2F0Y2hpbmcgY2xvY2sgYXQgJWxkIC0gdGFnIDB4JWx4IC0gd2FsbGNsb2NrICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKLQkgICAobG9uZylzaW1fZXZlbnRzX3RpbWUgKHNkKSwKLQkgICAobG9uZyluZXdfZXZlbnQsCi0JICAgKGxvbmcpbmV3X2V2ZW50LT53YWxsY2xvY2ssCi0JICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAotCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOwotICByZXR1cm4gbmV3X2V2ZW50OwotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKLXNpbV9ldmVudCAqCi1zaW1fZXZlbnRzX3dhdGNoX3NpbSAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgIHZvaWQgKmhvc3RfYWRkciwKLQkJICAgICAgaW50IG5yX2J5dGVzLAotCQkgICAgICBpbnQgYnl0ZV9vcmRlciwKLQkJICAgICAgaW50IGlzX3dpdGhpbiwKLQkJICAgICAgdW5zaWduZWQ2NCBsYiwKLQkJICAgICAgdW5zaWduZWQ2NCB1YiwKLQkJICAgICAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0JCSAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7Ci0gIC8qIHR5cGUgKi8KLSAgc3dpdGNoIChieXRlX29yZGVyKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBzd2l0Y2ggKG5yX2J5dGVzKQotCXsKLQljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF8xOyBicmVhazsKLQljYXNlIDI6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF8yOyBicmVhazsKLQljYXNlIDQ6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF80OyBicmVhazsKLQljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF84OyBicmVhazsKLQlkZWZhdWx0OiBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9zaW0gLSBpbnZhbGlkIG5yIGJ5dGVzIik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCSUdfRU5ESUFOOgotICAgICAgc3dpdGNoIChucl9ieXRlcykKLQl7Ci0JY2FzZSAxOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2JlXzE7IGJyZWFrOwotCWNhc2UgMjogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX3NpbV9iZV8yOyBicmVhazsKLQljYXNlIDQ6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fYmVfNDsgYnJlYWs7Ci0JY2FzZSA4OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2JlXzg7IGJyZWFrOwotCWRlZmF1bHQ6IHNpbV9pb19lcnJvciAoc2QsICJzaW1fZXZlbnRzX3dhdGNoX3NpbSAtIGludmFsaWQgbnIgYnl0ZXMiKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExJVFRMRV9FTkRJQU46Ci0gICAgICBzd2l0Y2ggKG5yX2J5dGVzKQotCXsKLQljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fbGVfMTsgYnJlYWs7Ci0JY2FzZSAyOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2xlXzI7IGJyZWFrOwotCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX3NpbV9sZV80OyBicmVhazsKLQljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fbGVfODsgYnJlYWs7Ci0JZGVmYXVsdDogc2ltX2lvX2Vycm9yIChzZCwgInNpbV9ldmVudHNfd2F0Y2hfc2ltIC0gaW52YWxpZCBuciBieXRlcyIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9zaW0gLSBpbnZhbGlkIGJ5dGUgb3JkZXIiKTsKLSAgICB9Ci0gIC8qIGhhbmRsZXIgKi8KLSAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKLSAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgLyogZGF0YSAqLwotICBuZXdfZXZlbnQtPmhvc3RfYWRkciA9IGhvc3RfYWRkcjsKLSAgbmV3X2V2ZW50LT5sYiA9IGxiOwotICBuZXdfZXZlbnQtPmxiNjQgPSBsYjsKLSAgbmV3X2V2ZW50LT51YiA9IHViOwotICBuZXdfZXZlbnQtPnViNjQgPSB1YjsKLSAgbmV3X2V2ZW50LT5pc193aXRoaW4gPSAoaXNfd2l0aGluICE9IDApOwotICAvKiBpbnNlcnQgKi8KLSAgbmV3X2V2ZW50LT5uZXh0ID0gZXZlbnRzLT53YXRjaHBvaW50czsKLSAgZXZlbnRzLT53YXRjaHBvaW50cyA9IG5ld19ldmVudDsKLSAgZXZlbnRzLT53b3JrX3BlbmRpbmcgPSAxOwotICBFVFJBQ0UgKChfRVRSQUNFLAotCSAgICJldmVudCB3YXRjaGluZyBob3N0IGF0ICVsZCAtIHRhZyAweCVseCAtIGhvc3QtYWRkciAweCVseCwgMHglbHguLjB4JWx4LCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAotCSAgIChsb25nKXNpbV9ldmVudHNfdGltZSAoc2QpLAotCSAgIChsb25nKW5ld19ldmVudCwKLQkgICAobG9uZyluZXdfZXZlbnQtPmhvc3RfYWRkciwKLQkgICAobG9uZyluZXdfZXZlbnQtPmxiLAotCSAgIChsb25nKW5ld19ldmVudC0+dWIsCi0JICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAotCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOwotICByZXR1cm4gbmV3X2V2ZW50OwotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKLXNpbV9ldmVudCAqCi1zaW1fZXZlbnRzX3dhdGNoX2NvcmUgKFNJTV9ERVNDIHNkLAotCQkgICAgICAgYWRkcmVzc193b3JkIGNvcmVfYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIGNvcmVfbWFwLAotCQkgICAgICAgaW50IG5yX2J5dGVzLAotCQkgICAgICAgaW50IGJ5dGVfb3JkZXIsCi0JCSAgICAgICBpbnQgaXNfd2l0aGluLAotCQkgICAgICAgdW5zaWduZWQ2NCBsYiwKLQkJICAgICAgIHVuc2lnbmVkNjQgdWIsCi0JCSAgICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLQkJICAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7Ci0gIC8qIHR5cGUgKi8KLSAgc3dpdGNoIChieXRlX29yZGVyKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBzd2l0Y2ggKG5yX2J5dGVzKQotCXsKLQljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX3RhcmdfMTsgYnJlYWs7Ci0JY2FzZSAyOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV90YXJnXzI7IGJyZWFrOwotCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfdGFyZ180OyBicmVhazsKLQljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX3RhcmdfODsgYnJlYWs7Ci0JZGVmYXVsdDogc2ltX2lvX2Vycm9yIChzZCwgInNpbV9ldmVudHNfd2F0Y2hfY29yZSAtIGludmFsaWQgbnIgYnl0ZXMiKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJJR19FTkRJQU46Ci0gICAgICBzd2l0Y2ggKG5yX2J5dGVzKQotCXsKLQljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2JlXzE7IGJyZWFrOwotCWNhc2UgMjogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfYmVfMjsgYnJlYWs7Ci0JY2FzZSA0OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9iZV80OyBicmVhazsKLQljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2JlXzg7IGJyZWFrOwotCWRlZmF1bHQ6IHNpbV9pb19lcnJvciAoc2QsICJzaW1fZXZlbnRzX3dhdGNoX2NvcmUgLSBpbnZhbGlkIG5yIGJ5dGVzIik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSVRUTEVfRU5ESUFOOgotICAgICAgc3dpdGNoIChucl9ieXRlcykKLQl7Ci0JY2FzZSAxOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9sZV8xOyBicmVhazsKLQljYXNlIDI6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2xlXzI7IGJyZWFrOwotCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfbGVfNDsgYnJlYWs7Ci0JY2FzZSA4OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9sZV84OyBicmVhazsKLQlkZWZhdWx0OiBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9jb3JlIC0gaW52YWxpZCBuciBieXRlcyIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9jb3JlIC0gaW52YWxpZCBieXRlIG9yZGVyIik7Ci0gICAgfQotICAvKiBoYW5kbGVyICovCi0gIG5ld19ldmVudC0+ZGF0YSA9IGRhdGE7Ci0gIG5ld19ldmVudC0+aGFuZGxlciA9IGhhbmRsZXI7Ci0gIC8qIGRhdGEgKi8KLSAgbmV3X2V2ZW50LT5jb3JlX2FkZHIgPSBjb3JlX2FkZHI7Ci0gIG5ld19ldmVudC0+Y29yZV9tYXAgPSBjb3JlX21hcDsKLSAgbmV3X2V2ZW50LT5sYiA9IGxiOwotICBuZXdfZXZlbnQtPmxiNjQgPSBsYjsKLSAgbmV3X2V2ZW50LT51YiA9IHViOwotICBuZXdfZXZlbnQtPnViNjQgPSB1YjsKLSAgbmV3X2V2ZW50LT5pc193aXRoaW4gPSAoaXNfd2l0aGluICE9IDApOwotICAvKiBpbnNlcnQgKi8KLSAgbmV3X2V2ZW50LT5uZXh0ID0gZXZlbnRzLT53YXRjaHBvaW50czsKLSAgZXZlbnRzLT53YXRjaHBvaW50cyA9IG5ld19ldmVudDsKLSAgZXZlbnRzLT53b3JrX3BlbmRpbmcgPSAxOwotICBFVFJBQ0UgKChfRVRSQUNFLAotCSAgICJldmVudCB3YXRjaGluZyBob3N0IGF0ICVsZCAtIHRhZyAweCVseCAtIGhvc3QtYWRkciAweCVseCwgMHglbHguLjB4JWx4LCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAotCSAgIChsb25nKXNpbV9ldmVudHNfdGltZSAoc2QpLAotCSAgIChsb25nKW5ld19ldmVudCwKLQkgICAobG9uZyluZXdfZXZlbnQtPmhvc3RfYWRkciwKLQkgICAobG9uZyluZXdfZXZlbnQtPmxiLAotCSAgIChsb25nKW5ld19ldmVudC0+dWIsCi0JICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAotCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOwotICByZXR1cm4gbmV3X2V2ZW50OwotfQotI2VuZGlmCi0KLQotI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKLXZvaWQKLXNpbV9ldmVudHNfZGVzY2hlZHVsZSAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgICBzaW1fZXZlbnQgKmV2ZW50X3RvX3JlbW92ZSkKLXsKLSAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7Ci0gIHNpbV9ldmVudCAqdG9fcmVtb3ZlID0gKHNpbV9ldmVudCopZXZlbnRfdG9fcmVtb3ZlOwotICBpZiAoZXZlbnRfdG9fcmVtb3ZlICE9IE5VTEwpCi0gICAgewotICAgICAgc2ltX2V2ZW50ICoqcXVldWUgPSBOVUxMOwotICAgICAgd2hpbGUgKChxdWV1ZSA9IG5leHRfZXZlbnRfcXVldWUgKHNkLCBxdWV1ZSkpICE9IE5VTEwpCi0JewotCSAgc2ltX2V2ZW50ICoqcHRyX3RvX2N1cnJlbnQ7Ci0JICBmb3IgKHB0cl90b19jdXJyZW50ID0gcXVldWU7Ci0JICAgICAgICpwdHJfdG9fY3VycmVudCAhPSBOVUxMICYmICpwdHJfdG9fY3VycmVudCAhPSB0b19yZW1vdmU7Ci0JICAgICAgIHB0cl90b19jdXJyZW50ID0gJigqcHRyX3RvX2N1cnJlbnQpLT5uZXh0KTsKLQkgIGlmICgqcHRyX3RvX2N1cnJlbnQgPT0gdG9fcmVtb3ZlKQotCSAgICB7Ci0JICAgICAgc2ltX2V2ZW50ICpkZWFkID0gKnB0cl90b19jdXJyZW50OwotCSAgICAgICpwdHJfdG9fY3VycmVudCA9IGRlYWQtPm5leHQ7Ci0JICAgICAgRVRSQUNFICgoX0VUUkFDRSwKLQkJICAgICAgICJldmVudC93YXRjaCBkZXNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseCVzJXNcbiIsCi0JCSAgICAgICAobG9uZykgc2ltX2V2ZW50c190aW1lIChzZCksCi0JCSAgICAgICAobG9uZykgZXZlbnRfdG9fcmVtb3ZlLAotCQkgICAgICAgKGxvbmcpIGRlYWQtPnRpbWVfb2ZfZXZlbnQsCi0JCSAgICAgICAobG9uZykgZGVhZC0+aGFuZGxlciwKLQkJICAgICAgIChsb25nKSBkZWFkLT5kYXRhLAotCQkgICAgICAgKGRlYWQtPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAotCQkgICAgICAgKGRlYWQtPnRyYWNlICE9IE5VTEwpID8gZGVhZC0+dHJhY2UgOiAiIikpOwotCSAgICAgIHNpbV9ldmVudHNfZnJlZSAoc2QsIGRlYWQpOwotCSAgICAgIHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQgKHNkKTsKLQkgICAgICBTSU1fQVNTRVJUICgoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPj0gMCkgPT0gKGV2ZW50cy0+cXVldWUgIT0gTlVMTCkpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIEVUUkFDRSAoKF9FVFJBQ0UsCi0JICAgImV2ZW50L3dhdGNoIGRlc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIG5vdCBmb3VuZFxuIiwKLQkgICAobG9uZykgc2ltX2V2ZW50c190aW1lIChzZCksCi0JICAgKGxvbmcpIGV2ZW50X3RvX3JlbW92ZSkpOwotfQotI2VuZGlmCi0KLQotU1RBVElDX0lOTElORV9TSU1fRVZFTlRTXAotKGludCkKLXNpbV93YXRjaF92YWxpZCAoU0lNX0RFU0Mgc2QsCi0JCSBzaW1fZXZlbnQgKnRvX2RvKQotewotICBzd2l0Y2ggKHRvX2RvLT53YXRjaGluZykKLSAgICB7Ci0KLSNkZWZpbmUgV0FUQ0hfQ09SRShOLE9QLEVYVCkgXAotICAgICAgaW50IG9rOyBcCi0gICAgICB1bnNpZ25lZF8jI04gd29yZCA9IDA7IFwKLSAgICAgIGludCBucl9yZWFkID0gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCB0b19kby0+Y29yZV9tYXAsICZ3b3JkLCBcCi0JCQkJCSAgdG9fZG8tPmNvcmVfYWRkciwgc2l6ZW9mICh3b3JkKSk7IFwKLSAgICAgIE9QICh3b3JkKTsgXAotICAgICAgb2sgPSAobnJfcmVhZCA9PSBzaXplb2YgKHVuc2lnbmVkXyMjTikgXAotCSAgICAmJiAodG9fZG8tPmlzX3dpdGhpbiBcCi0JCT09ICh3b3JkID49IHRvX2RvLT5sYiMjRVhUIFwKLQkJICAgICYmIHdvcmQgPD0gdG9fZG8tPnViIyNFWFQpKSk7Ci0KLSAgICBjYXNlIHdhdGNoX2NvcmVfdGFyZ18xOgotICAgICAgewotCVdBVENIX0NPUkUgKDEsIFQySCwpOwotCXJldHVybiBvazsKLSAgICAgIH0KLSAgICBjYXNlIHdhdGNoX2NvcmVfdGFyZ18yOgotICAgICAgewotICAgICAgICBXQVRDSF9DT1JFICgyLCBUMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9jb3JlX3RhcmdfNDoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfQ09SRSAoNCwgVDJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfY29yZV90YXJnXzg6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX0NPUkUgKDgsIFQySCw2NCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotCi0gICAgY2FzZSB3YXRjaF9jb3JlX2JlXzE6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX0NPUkUgKDEsIEJFMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9jb3JlX2JlXzI6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX0NPUkUgKDIsIEJFMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9jb3JlX2JlXzQ6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX0NPUkUgKDQsIEJFMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9jb3JlX2JlXzg6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX0NPUkUgKDgsIEJFMkgsNjQpOwotCXJldHVybiBvazsKLSAgICAgIH0KLQotICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV8xOgotICAgICAgewotICAgICAgICBXQVRDSF9DT1JFICgxLCBMRTJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV8yOgotICAgICAgewotICAgICAgICBXQVRDSF9DT1JFICgyLCBMRTJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV80OgotICAgICAgewotICAgICAgICBXQVRDSF9DT1JFICg0LCBMRTJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV84OgotICAgICAgewotICAgICAgICBXQVRDSF9DT1JFICg4LCBMRTJILDY0KTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0jdW5kZWYgV0FUQ0hfQ09SRQotCi0jZGVmaW5lIFdBVENIX1NJTShOLE9QLEVYVCkgXAotICAgICAgaW50IG9rOyBcCi0gICAgICB1bnNpZ25lZF8jI04gd29yZCA9ICoodW5zaWduZWRfIyNOKil0b19kby0+aG9zdF9hZGRyOyBcCi0gICAgICBPUCAod29yZCk7IFwKLSAgICAgIG9rID0gKHRvX2RvLT5pc193aXRoaW4gXAotCSAgICA9PSAod29yZCA+PSB0b19kby0+bGIjI0VYVCBcCi0JCSYmIHdvcmQgPD0gdG9fZG8tPnViIyNFWFQpKTsKLQotICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfMToKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICgxLCB3b3JkID0gLCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfMjoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICgyLCB3b3JkID0gLCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfNDoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICg0LCB3b3JkID0gLCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfODoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICg4LCB3b3JkID0gLDY0KTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0KLSAgICBjYXNlIHdhdGNoX3NpbV9iZV8xOgotICAgICAgewotICAgICAgICBXQVRDSF9TSU0gKDEsIEJFMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9zaW1fYmVfMjoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICgyLCBCRTJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfc2ltX2JlXzQ6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX1NJTSAoNCwgQkUySCwpOwotCXJldHVybiBvazsKLSAgICAgIH0KLSAgICBjYXNlIHdhdGNoX3NpbV9iZV84OgotICAgICAgewotICAgICAgICBXQVRDSF9TSU0gKDgsIEJFMkgsNjQpOwotCXJldHVybiBvazsKLSAgICAgIH0KLQotICAgIGNhc2Ugd2F0Y2hfc2ltX2xlXzE6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX1NJTSAoMSwgTEUySCwpOwotCXJldHVybiBvazsKLSAgICAgIH0KLSAgICBjYXNlIHdhdGNoX3NpbV9sZV8yOgotICAgICAgewotICAgICAgICBXQVRDSF9TSU0gKDEsIExFMkgsKTsKLQlyZXR1cm4gb2s7Ci0gICAgICB9Ci0gICAgY2FzZSB3YXRjaF9zaW1fbGVfNDoKLSAgICAgIHsKLSAgICAgICAgV0FUQ0hfU0lNICgxLCBMRTJILCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotICAgIGNhc2Ugd2F0Y2hfc2ltX2xlXzg6Ci0gICAgICB7Ci0gICAgICAgIFdBVENIX1NJTSAoMSwgTEUySCw2NCk7Ci0JcmV0dXJuIG9rOwotICAgICAgfQotI3VuZGVmIFdBVENIX1NJTQotCi0gICAgY2FzZSB3YXRjaF9jbG9jazogLyogd2FsbGNsb2NrICovCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBlbGFwc2VkX3RpbWUgPSBzaW1fZXZlbnRzX2VsYXBzZWRfdGltZSAoc2QpOwotCXJldHVybiAoZWxhcHNlZF90aW1lID49IHRvX2RvLT53YWxsY2xvY2spOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1fd2F0Y2hfdmFsaWQgLSBiYWQgc3dpdGNoIik7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0oaW50KQotc2ltX2V2ZW50c190aWNrIChTSU1fREVTQyBzZCkKLXsKLSAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7Ci0KLSAgLyogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHRpY2tzIGhhdmUgYmVlbgotICAgICBmdWxseSBwcm9jZXNzZWQgKi8KLQotICAvKiBBZHZhbmNlIHRoZSB0aW1lIGJ1dCAqb25seSogaWYgdGhlcmUgaXMgbm90aGluZyB0byBwcm9jZXNzICovCi0gIGlmIChldmVudHMtPndvcmtfcGVuZGluZwotICAgICAgfHwgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPT0gMCkKLSAgICB7Ci0gICAgICBldmVudHMtPm5yX3RpY2tzX3RvX3Byb2Nlc3MgKz0gMTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50IC09IDE7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0oaW50KQotc2ltX2V2ZW50c190aWNrbiAoU0lNX0RFU0Mgc2QsCi0JCSAgaW50IG4pCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBTSU1fQVNTRVJUIChuID4gMCk7Ci0KLSAgLyogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHRpY2tzIGhhdmUgYmVlbgotICAgICBmdWxseSBwcm9jZXNzZWQgKi8KLQotICAvKiBBZHZhbmNlIHRoZSB0aW1lIGJ1dCAqb25seSogaWYgdGhlcmUgaXMgbm90aGluZyB0byBwcm9jZXNzICovCi0gIGlmIChldmVudHMtPndvcmtfcGVuZGluZyB8fCBldmVudHMtPnRpbWVfZnJvbV9ldmVudCA8IG4pCi0gICAgewotICAgICAgZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzICs9IG47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBldmVudHMtPnRpbWVfZnJvbV9ldmVudCAtPSBuOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLUlOTElORV9TSU1fRVZFTlRTXAotKHZvaWQpCi1zaW1fZXZlbnRzX3NsaXAgKFNJTV9ERVNDIHNkLAotCQkgaW50IHNsaXApCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOwotICBTSU1fQVNTRVJUIChzbGlwID4gMCk7Ci0KLSAgLyogRmxhZyBhIHJlYWR5IGV2ZW50IHdpdGggd29ya19wZW5kaW5nIGluc3RlYWQgb2YgbnVtYmVyIG9mIHRpY2tzCi0gICAgIHRvIHByb2Nlc3Mgc28gdGhhdCB0aGUgdGltZSBjb250aW51ZXMgdG8gYmUgY29ycmVjdCAqLwotICBpZiAoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPCBzbGlwKQotICAgIHsKLSAgICAgIGV2ZW50cy0+d29ya19wZW5kaW5nID0gMTsKLSAgICB9Ci0gIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50IC09IHNsaXA7Ci19Ci0KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0odm9pZCkKLXNpbV9ldmVudHNfcHJlcHJvY2VzcyAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgICBpbnQgZXZlbnRzX3dlcmVfbGFzdCwKLQkJICAgICAgIGludCBldmVudHNfd2VyZV9uZXh0KQotewotICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMoc2QpOwotICBpZiAoZXZlbnRzX3dlcmVfbGFzdCkKLSAgICB7Ci0gICAgICAvKiBIYWx0ZWQgcGFydCB3YXkgdGhyb3VnaCBldmVudCBwcm9jZXNzaW5nICovCi0gICAgICBBU1NFUlQgKGV2ZW50cy0+bnJfdGlja3NfdG9fcHJvY2VzcyAhPSAwKTsKLSAgICAgIC8qIFRoZSBleHRlcm5hbCB3b3JsZCBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCB0aGF0IHN0b3BwZWQgdGhlCi0gICAgICAgICBzaW11bGF0b3Igd2FzIHRoZSBsYXN0IGV2ZW50IHRvIHByb2Nlc3MuICovCi0gICAgICBBU1NFUlQgKGV2ZW50c193ZXJlX25leHQpOwotICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7Ci0gICAgfQotICBlbHNlIGlmIChldmVudHNfd2VyZV9uZXh0KQotICAgIHsKLSAgICAgIC8qIEhhbHRlZCBieSB0aGUgbGFzdCBwcm9jZXNzb3IgKi8KLSAgICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSkKLQlzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKLSAgICB9Ci19Ci0KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0odm9pZCkKLXNpbV9ldmVudHNfcHJvY2VzcyAoU0lNX0RFU0Mgc2QpCi17Ci0gIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyhzZCk7Ci0gIHNpZ25lZDY0IGV2ZW50X3RpbWUgPSBzaW1fZXZlbnRzX3RpbWUoc2QpOwotCi0gIC8qIENsZWFyIHdvcmtfcGVuZGluZyBiZWZvcmUgY2hlY2tpbmcgbnJfaGVsZC4gIENsZWFyaW5nCi0gICAgIHdvcmtfcGVuZGluZyBhZnRlciBucl9oZWxkICh3aXRoIG91dCBhIGxvY2sgY291bGQgbG9vc2UgYW4KLSAgICAgZXZlbnQpLiAqLwotICBldmVudHMtPndvcmtfcGVuZGluZyA9IDA7Ci0KLSAgLyogbW92ZSBhbnkgZXZlbnRzIHRoYXQgd2VyZSBhc3luY2hyb25vdXNseSBxdWV1ZWQgYnkgYW55IHNpZ25hbAotICAgICBoYW5kbGVycyBvbnRvIHRoZSByZWFsIGV2ZW50IHF1ZXVlLiAgKi8KLSAgaWYgKGV2ZW50cy0+bnJfaGVsZCA+IDApCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICAKLSNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCi0gICAgICAvKi1MT0NLLSovCi0gICAgICBzaWdzZXRfdCBvbGRfbWFzazsKLSAgICAgIHNpZ3NldF90IG5ld19tYXNrOwotICAgICAgc2lnZmlsbHNldCgmbmV3X21hc2spOwotICAgICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKLSNlbmRpZgotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLT5ucl9oZWxkOyBpKyspCi0JewotCSAgc2ltX2V2ZW50ICplbnRyeSA9ICZldmVudHMtPmhlbGQgW2ldOwotCSAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsCi0JCQkgICAgICAgZW50cnktPnRpbWVfb2ZfZXZlbnQsCi0JCQkgICAgICAgZW50cnktPmhhbmRsZXIsCi0JCQkgICAgICAgZW50cnktPmRhdGEpOwotCX0KLSAgICAgIGV2ZW50cy0+bnJfaGVsZCA9IDA7Ci0gICAgICAKLSNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCi0gICAgICAvKi1VTkxPQ0stKi8KLSAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOwotI2VuZGlmCi0gICAgICAKLSAgICB9Ci0gIAotICAvKiBQcm9jZXNzIGFueSB3YXRjaHBvaW50cy4gQmUgY2FyZWZ1bCB0byBhbGxvdyBhIHdhdGNocG9pbnQgdG8KLSAgICAgYXBwZWFyL2Rpc2FwcGVhciB1bmRlciBvdXIgZmVldC4KLSAgICAgVG8gZW5zdXJlIHRoYXQgd2F0Y2hwb2ludHMgYXJlIHByb2Nlc3NlZCBvbmx5IG9uY2UgcGVyIGN5Y2xlLAotICAgICB0aGV5IGFyZSBtb3ZlZCBvbnRvIGEgd2F0Y2hlZCBxdWV1ZSwgdGhpcyByZXR1cm5lZCB0byB0aGUKLSAgICAgd2F0Y2hwb2ludCBxdWV1ZSB3aGVuIGFsbCBxdWV1ZSBwcm9jZXNzaW5nIGhhcyBiZWVuCi0gICAgIGNvbXBsZXRlZC4gKi8KLSAgd2hpbGUgKGV2ZW50cy0+d2F0Y2hwb2ludHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW1fZXZlbnQgKnRvX2RvID0gZXZlbnRzLT53YXRjaHBvaW50czsKLSAgICAgIGV2ZW50cy0+d2F0Y2hwb2ludHMgPSB0b19kby0+bmV4dDsKLSAgICAgIGlmIChzaW1fd2F0Y2hfdmFsaWQgKHNkLCB0b19kbykpCi0JewotCSAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIgPSB0b19kby0+aGFuZGxlcjsKLQkgIHZvaWQgKmRhdGEgPSB0b19kby0+ZGF0YTsKLQkgIEVUUkFDRSgoX0VUUkFDRSwKLQkJICAiZXZlbnQgaXNzdWVkIGF0ICVsZCAtIHRhZyAweCVseCAtIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHglcyVzXG4iLAotCQkgIChsb25nKSBldmVudF90aW1lLAotCQkgIChsb25nKSB0b19kbywKLQkJICAobG9uZykgaGFuZGxlciwKLQkJICAobG9uZykgZGF0YSwKLQkJICAodG9fZG8tPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAotCQkgICh0b19kby0+dHJhY2UgIT0gTlVMTCkgPyB0b19kby0+dHJhY2UgOiAiIikpOwotCSAgc2ltX2V2ZW50c19mcmVlIChzZCwgdG9fZG8pOwotCSAgaGFuZGxlciAoc2QsIGRhdGEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0b19kby0+bmV4dCA9IGV2ZW50cy0+d2F0Y2hlZHBvaW50czsKLQkgIGV2ZW50cy0+d2F0Y2hlZHBvaW50cyA9IHRvX2RvOwotCX0KLSAgICB9Ci0gIAotICAvKiBjb25zdW1lIGFsbCBldmVudHMgZm9yIHRoaXMgb3IgZWFybGllciB0aW1lcy4gIEJlIGNhcmVmdWwgdG8KLSAgICAgYWxsb3cgYW4gZXZlbnQgdG8gYXBwZWFyL2Rpc2FwcGVhciB1bmRlciBvdXIgZmVldCAqLwotICB3aGlsZSAoZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudCA8Ci0JIChldmVudF90aW1lICsgZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzKSkKLSAgICB7Ci0gICAgICBzaW1fZXZlbnQgKnRvX2RvID0gZXZlbnRzLT5xdWV1ZTsKLSAgICAgIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyID0gdG9fZG8tPmhhbmRsZXI7Ci0gICAgICB2b2lkICpkYXRhID0gdG9fZG8tPmRhdGE7Ci0gICAgICBldmVudHMtPnF1ZXVlID0gdG9fZG8tPm5leHQ7Ci0gICAgICB1cGRhdGVfdGltZV9mcm9tX2V2ZW50IChzZCk7Ci0gICAgICBFVFJBQ0UoKF9FVFJBQ0UsCi0JICAgICAgImV2ZW50IGlzc3VlZCBhdCAlbGQgLSB0YWcgMHglbHggLSBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4JXMlc1xuIiwKLQkgICAgICAobG9uZykgZXZlbnRfdGltZSwKLQkgICAgICAobG9uZykgdG9fZG8sCi0JICAgICAgKGxvbmcpIGhhbmRsZXIsCi0JICAgICAgKGxvbmcpIGRhdGEsCi0JICAgICAgKHRvX2RvLT50cmFjZSAhPSBOVUxMKSA/ICIsICIgOiAiIiwKLQkgICAgICAodG9fZG8tPnRyYWNlICE9IE5VTEwpID8gdG9fZG8tPnRyYWNlIDogIiIpKTsKLSAgICAgIHNpbV9ldmVudHNfZnJlZSAoc2QsIHRvX2RvKTsKLSAgICAgIGhhbmRsZXIgKHNkLCBkYXRhKTsKLSAgICB9Ci0gIAotICAvKiBwdXQgdGhpbmdzIGJhY2sgd2hlcmUgdGhleSBiZWxvbmcgcmVhZHkgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLwotICBldmVudHMtPndhdGNocG9pbnRzID0gZXZlbnRzLT53YXRjaGVkcG9pbnRzOwotICBldmVudHMtPndhdGNoZWRwb2ludHMgPSBOVUxMOwotICBpZiAoZXZlbnRzLT53YXRjaHBvaW50cyAhPSBOVUxMKQotICAgIGV2ZW50cy0+d29ya19wZW5kaW5nID0gMTsKLSAgCi0gIC8qIGFkdmFuY2UgdGhlIHRpbWUgKi8KLSAgU0lNX0FTU0VSVCAoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPj0gZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzKTsKLSAgU0lNX0FTU0VSVCAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKTsgLyogYWx3YXlzIHBvbGwgZXZlbnQgKi8KLSAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgLT0gZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzOwotCi0gIC8qIHRoaXMgcm91bmQgb2YgcHJvY2Vzc2luZyBjb21wbGV0ZSAqLwotICBldmVudHMtPm5yX3RpY2tzX3RvX3Byb2Nlc3MgPSAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWV2ZW50cy5oIGIvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWUzZGYuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBTSU1fRVZFTlRTX0gKLSNkZWZpbmUgU0lNX0VWRU5UU19ICi0KLQotLyogTm90ZXM6Ci0KLSAgIFdoZW4gc2NoZWR1bGluZyBhbiBldmVudCwgdGhlIGEgZGVsdGEgb2YgemVyby9vbmUgcmVmZXJzIHRvIHRoZQotICAgdGltZWxpbmUgYXMgZm9sbG93czoKLQotICAgZXBvY2ggICAwfDEgICAgICAgICAgICAgIDF8MiAgICAgICAgICAgICAgMnwzICAgICAgICAgICAgICAzfAotICAgKipxdWV1ZSoqfC0taW5zbi0tfCpxdWV1ZSp8LS1pbnNuLS18KnF1ZXVlKnwtLWluc24tLXwqcXVldWUqfAotICAgICB8ICAgXiAgICAgICAgICAgICAgIF4gICAgICAgIHwgICAgICAgXiAgICAgICAgICAgICAgICBeCi0gICAgIGAtICswIC0tLS0tLS0tLS0tLSArMSAtLS4uICAgYC0tLS0tICswIC0tLS0tLS0tLS0tLS0gKzEgLS0uLgotCi0gICBXaGVuIHRoZSBxdWV1ZSBpcyBpbml0aWFsaXplZCwgdGhlIHRpbWUgaXMgc2V0IHRvIHplcm8gd2l0aCBhCi0gICBudW1iZXIgb2YgaW5pdGlhbGl6YXRpb24gZXZlbnRzIHNjaGVkdWxlZC4gIENvbnNlcXVlbnRseSwgYXMgYWxzbwotICAgaWxsdXN0cmF0ZWQgYWJvdmUsIHRoZSBldmVudCBxdWV1ZSBzaG91bGQgYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUKLSAgIGZpcnN0IGluc3RydWN0aW9uLiAgVGhhdCBpbnN0cnVjdGlvbiBiZWluZyBleGVjdXRlZCBkdXJpbmcgdGljayAxLgotCi0gICBUaGUgc2ltdWxhdG9yIG1haW4gbG9vcCBtYXkgdGFrZSBhIGZvcm0gc2ltaWxhciB0bzoKLQotICAgICAgIGlmIChoYWx0LS9yZXN0YXJ0LXNldGptcCkKLSAgICAgICAgIHsKLQotCSAgIC4uLi4gLy8gRGV0ZXJtaW5lIHdobyBzaG91bGQgZ28gbmV4dAotCSAgIGxhc3QtY3B1LW5yID0gZ2V0LWxhc3QtY3B1LW5yIChzZCk7Ci0JICAgbmV4dC1jcHUtbnIgPSBnZXQtbmV4dC1jcHUtbnIgKHNkKTsKLQkgICBldmVudHMtd2VyZS1sYXN0PyA9IChsYXN0LWNwdS1uciA+PSBuci1jcHVzKTsKLQkgICBldmVudHMtd2VyZS1uZXh0PyA9IChuZXh0LWNwdS1uciA+PSBuci1jcHVzKTsKLQotICAgICAgICAgICAuLi4uIC8vIHByb2Nlc3MgYW55IG91dHN0YW5kaW5nIGV2ZW50cwotICAgICAgICAgICBzaW1fZXZlbnRzX3ByZXByb2Nlc3MgKHNkLCBldmVudHMtd2VyZS1sYXN0PywgZXZlbnRzLXdlcmUtbmV4dD8pOwotCSAgIGlmIChldmVudHMtd2VyZS1uZXh0KQotCSAgICAgbmV4dC1jcHUtbnIgPSAwOwotCi0gICAgICAgICAgIC4uLi4gLy8gcHJpbWUgbWFpbiBsb29wIAotCi0gICAgICAgICAgIHdoaWxlICgxKQotICAgICAgICAgICAgIHsKLQkgICAgICAgIC4uLi4gLy8gbW9kZWwgb25lIGluc24gb2YgbmV4dC1jcHUtbnIgLi4gbnItY3B1cwotICAgICAgICAgICAgICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSkKLQkgICAgICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7Ci0gICAgICAgICAgICAgICAgbmV4dC1jcHUtbnIgPSAwCi0JICAgICB9Ci0gICAgICAgICB9Ci0KLSAgIE5CLiAgSW4gdGhlIGFib3ZlIHBzZXVkbyBjb2RlIGl0IGlzIGFzc3VtZWQgdGhhdCBhbnkgY3B1LW5yID49Ci0gICBuci1jcHVzIGlzIGEgbWFya2VyIGZvciB0aGUgZXZlbnQgcXVldWUuICovCi0KLQotdHlwZWRlZiB2b2lkIHNpbV9ldmVudF9oYW5kbGVyKFNJTV9ERVNDIHNkLCB2b2lkICpkYXRhKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9ldmVudCBzaW1fZXZlbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9zaW1fZXZlbnRzIHNpbV9ldmVudHM7Ci1zdHJ1Y3QgX3NpbV9ldmVudHMgewotICBpbnQgbnJfdGlja3NfdG9fcHJvY2VzczsKLSAgc2ltX2V2ZW50ICpxdWV1ZTsKLSAgc2ltX2V2ZW50ICp3YXRjaHBvaW50czsKLSAgc2ltX2V2ZW50ICp3YXRjaGVkcG9pbnRzOwotICBzaW1fZXZlbnQgKmZyZWVfbGlzdDsKLSAgLyogZmxhZyBhZGRpdGlvbmFsIHdvcmsgbmVlZGVkICovCi0gIHZvbGF0aWxlIGludCB3b3JrX3BlbmRpbmc7Ci0gIC8qIHRoZSBhc3luY2hyb25vdXMgZXZlbnQgcXVldWUgKi8KLSNpZm5kZWYgTUFYX05SX1NJR05BTF9TSU1fRVZFTlRTCi0jZGVmaW5lIE1BWF9OUl9TSUdOQUxfU0lNX0VWRU5UUyAyCi0jZW5kaWYKLSAgc2ltX2V2ZW50ICpoZWxkOwotICB2b2xhdGlsZSBpbnQgbnJfaGVsZDsKLSAgLyogdGltZWtlZXBpbmcgKi8KLSAgdW5zaWduZWQgbG9uZyBlbGFwc2VkX3dhbGxjbG9jazsKLSAgU0lNX0VMQVBTRURfVElNRSByZXN1bWVfd2FsbGNsb2NrOwotICBzaWduZWQ2NCB0aW1lX29mX2V2ZW50OwotICBpbnQgdGltZV9mcm9tX2V2ZW50OwotICBpbnQgdHJhY2U7Ci19OwotCi0KLQotLyogSW5zdGFsbCB0aGUgImV2ZW50cyIgbW9kdWxlLiAgKi8KLQotZXh0ZXJuIFNJTV9SQyBzaW1fZXZlbnRzX2luc3RhbGwgKFNJTV9ERVNDIHNkKTsKLQotCi0vKiBTY2hlZHVsZSBhbiBldmVudCBERUxUQV9USU1FIHRpY2tzIGludG8gdGhlIGZ1dHVyZSAqLwotCi1leHRlcm4gc2ltX2V2ZW50ICpzaW1fZXZlbnRzX3NjaGVkdWxlCi0oU0lNX0RFU0Mgc2QsCi0gc2lnbmVkNjQgZGVsdGFfdGltZSwKLSBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLSB2b2lkICpkYXRhKTsKLQotZXh0ZXJuIHNpbV9ldmVudCAqc2ltX2V2ZW50c19zY2hlZHVsZV90cmFjZWYKLShTSU1fREVTQyBzZCwKLSBzaWduZWQ2NCBkZWx0YV90aW1lLAotIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotIHZvaWQgKmRhdGEsCi0gY29uc3QgY2hhciAqZm10LAotIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOwotCi1leHRlcm4gc2ltX2V2ZW50ICpzaW1fZXZlbnRzX3NjaGVkdWxlX3Z0cmFjZWYKLShTSU1fREVTQyBzZCwKLSBzaWduZWQ2NCBkZWx0YV90aW1lLAotIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotIHZvaWQgKmRhdGEsCi0gY29uc3QgY2hhciAqZm10LAotIHZhX2xpc3QgYXApOwotCi0KLWV4dGVybiB2b2lkIHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsCi0oU0lNX0RFU0Mgc2QsCi0gc2lnbmVkNjQgZGVsdGFfdGltZSwKLSBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLSB2b2lkICpkYXRhKTsKLQotLyogTkI6IHNpZ25hbCBsZXZlbCBldmVudHMgY2FuJ3QgaGF2ZSB0cmFjZSBzdHJpbmdzIGFzIG1hbGxvYyBpc24ndAotICAgYXZhaWxhYmxlICovCi0KLQotCi0vKiBTY2hlZHVsZSBhbiBldmVudCBtaWxsaS1zZWNvbmRzIGZyb20gTk9XLiAgVGhlIGV4YWN0IGludGVycHJldGF0aW9uCi0gICBvZiB3YWxsY2xvY2sgaXMgaG9zdCBkZXBlbmRhbnQuICovCi0KLWV4dGVybiBzaW1fZXZlbnQgKnNpbV9ldmVudHNfd2F0Y2hfY2xvY2sKLShTSU1fREVTQyBzZCwKLSB1bnNpZ25lZCBkZWx0YV9tc190aW1lLAotIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotIHZvaWQgKmRhdGEpOwotCi0KLS8qIFNjaGVkdWxlIGFuIGV2ZW50IHdoZW4gdGhlIHRlc3QgKElTX1dJVEhJTiA9PSAoVkFMID49IExCICYmIFZBTCA8PQotICAgVUIpKSBvZiB0aGUgTlJfQllURVMgdmFsdWUgYXQgSE9TVF9BRERSIHdpdGggQllURV9PUkRFUiBlbmRpYW4gaXMKLSAgIHRydWUuCi0KLSAgIEhPU1RfQUREUjogcG9pbnRlciBpbnRvIHRoZSBob3N0IGFkZHJlc3Mgc3BhY2UuCi0gICBCWVRFX09SREVSOiAwIC0gaG9zdCBlbmRpYW47IEJJR19FTkRJQU47IExJVFRMRV9FTkRJQU4gKi8KLQotZXh0ZXJuIHNpbV9ldmVudCAqc2ltX2V2ZW50c193YXRjaF9zaW0KLShTSU1fREVTQyBzZCwKLSB2b2lkICpob3N0X2FkZHIsCi0gaW50IG5yX2J5dGVzLAotIGludCBieXRlX29yZGVyLAotIGludCBpc193aXRoaW4sCi0gdW5zaWduZWQ2NCBsYiwKLSB1bnNpZ25lZDY0IHViLAotIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAotIHZvaWQgKmRhdGEpOwotCi0KLS8qIFNjaGVkdWxlIGFuIGV2ZW50IHdoZW4gdGhlIHRlc3QgKElTX1dJVEhJTiA9PSAoVkFMID49IExCICYmIFZBTCA8PQotICAgVUIpKSBvZiB0aGUgTlJfQllURVMgdmFsdWUgYXQgQ09SRV9BRERSIGluIEJZVEVfT1JERVIgZW5kaWFuIGlzCi0gICB0cnVlLgotCi0gICBDT1JFX0FERFIvTUFQOiBwb2ludGVyIGludG8gdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlLgotICAgQllURV9PUkRFUjogMCAtIGN1cnJlbnQgdGFyZ2V0IGVuZGlhbjsgQklHX0VORElBTjsgTElUVExFX0VORElBTiAqLwotCi1leHRlcm4gc2ltX2V2ZW50ICpzaW1fZXZlbnRzX3dhdGNoX2NvcmUKLShTSU1fREVTQyBzZCwKLSBhZGRyZXNzX3dvcmQgY29yZV9hZGRyLAotIHVuc2lnbmVkIG1hcCwKLSBpbnQgbnJfYnl0ZXMsCi0gaW50IGJ5dGVfb3JkZXIsCi0gaW50IGlzX3dpdGhpbiwKLSB1bnNpZ25lZDY0IGxiLAotIHVuc2lnbmVkNjQgdWIsCi0gc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0gdm9pZCAqZGF0YSk7Ci0KLS8qIERlc2NoZWR1bGUgdGhlIHNwZWNpZmllZCBldmVudCAqLwotCi1leHRlcm4gdm9pZCBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUKLShTSU1fREVTQyBzZCwKLSBzaW1fZXZlbnQgKmV2ZW50X3RvX3JlbW92ZSk7Ci0KLQotLyogUHJlcGFyZSBmb3IgbWFpbiBzaW11bGF0b3IgbG9vcC4gIEVuc3VyZSB0aGF0IHRoZSBuZXh0IHRoaW5nIHRvIGRvCi0gICBpcyBub3QgZXZlbnQgcHJvY2Vzc2luZy4KLQotICAgSWYgdGhlIHNpbXVsYXRvciBoYWx0ZWQgcGFydCB3YXkgdGhyb3VnaCBldmVudCBwcm9jZXNzaW5nIHRoZW4gYm90aAotICAgRVZFTlRTX1dFUkVfTEFTVCBhbmQgRVZFTlRTX1dFUkVfTkVYVCBzaGFsbCBiZSB0cnVlLgotCi0gICBJZiB0aGUgc2ltdWxhdG9yIGhhbHRlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBsYXN0IGNwdSwgdGhlbiBvbmx5Ci0gICBFVkVOVFNfV0VSRV9ORVhUIHNoYWxsIGJlIHRydWUuICovCi0KLUlOTElORV9TSU1fRVZFTlRTXAotKHZvaWQpIHNpbV9ldmVudHNfcHJlcHJvY2VzcwotKFNJTV9ERVNDIHNkLAotIGludCBldmVudHNfd2VyZV9sYXN0LAotIGludCBldmVudHNfd2VyZV9uZXh0KTsKLQotCi0vKiBQcm9ncmVzcyB0aW1lLgotCi0gICBTZXBhcmF0ZWQgaW50byB0d28gcGFydHMgc28gdGhhdCB0aGUgbWFpbiBsb29wIGNhbiBzYXZlIGl0cyBjb250ZXh0Ci0gICBiZWZvcmUgdGhlIGV2ZW50IHF1ZXVlIGlzIHByb2Nlc3NlZC4gIFdoZW4gc2ltX2V2ZW50c190aWNrKigpCi0gICByZXR1cm5zIHRydWUsIGFueSBzaW11bGF0aW9uIGNvbnRleHQgc2hvdWxkIGJlIHNhdmVkIGFuZAotICAgc2ltX2V2ZW50c19wcm9jZXNzKCkgY2FsbGVkLgotCi0gICBTSU1fRVZFTlRTX1RJQ0sgYWR2YW5jZXMgdGhlIGNsb2NrIGJ5IDEgY3ljbGUuCi0KLSAgIFNJTV9FVkVOVFNfVElDS04gYWR2YW5jZXMgdGhlIGNsb2NrIGJ5IE4gY3ljbGVzICgxLi5NQVhJTlQpLiAqLwotCi1JTkxJTkVfU0lNX0VWRU5UU1wKLShpbnQpIHNpbV9ldmVudHNfdGljawotKFNJTV9ERVNDIHNkKTsKLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0oaW50KSBzaW1fZXZlbnRzX3RpY2tuCi0oU0lNX0RFU0Mgc2QsCi0gaW50IG4pOwotCi1JTkxJTkVfU0lNX0VWRU5UU1wKLSh2b2lkKSBzaW1fZXZlbnRzX3Byb2Nlc3MKLShTSU1fREVTQyBzZCk7Ci0KLQotLyogQWR2YW5jZSB0aGUgY2xvY2sgYnkgYW4gYWRkaXRpb25hbCBTTElQIGN5Y2xlcyBhdCB0aGUgbmV4dCBjYWxsIHRvCi0gICBzaW1fZXZlbnRzX3RpY2sqKCkuICBGb3IgbXVsdGlwbGUgY2FsbHMsIHRoZSBlZmZlY3QgaXMKLSAgIGFjY3VtdWxhdGl2ZS4gKi8KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0odm9pZCkgc2ltX2V2ZW50c19zbGlwCi0oU0lNX0RFU0Mgc2QsCi0gaW50IHNsaXApOwotCi0KLS8qIFByb2dyZXNzIHRpbWUgc3VjaCB0aGF0IGFuIGV2ZW50IHNoYWxsIG9jY3VyZSB1cG9uIHRoZSBuZXh0IGNhbGwgdG8KLSAgIHNpbV9ldmVudHMgdGljayAqLwotCi0jaWYgMAotSU5MSU5FX1NJTV9FVkVOVFNcCi0odm9pZCkgc2ltX2V2ZW50c190aW1ld2FycAotKFNJTV9ERVNDIHNkKTsKLSNlbmRpZgotCi0KLS8qIGxvY2FsIGNvbmNlcHQgb2YgZWxhcHNlZCB0YXJnZXQgdGltZSAqLwotCi1JTkxJTkVfU0lNX0VWRU5UU1wKLShzaWduZWQ2NCkgc2ltX2V2ZW50c190aW1lCi0oU0lNX0RFU0Mgc2QpOwotCi0KLS8qIGxvY2FsIGNvbmNlcHQgb2YgZWxhcHNlZCBob3N0IHRpbWUgKG1pbGxpc2Vjb25kcykgKi8KLQotSU5MSU5FX1NJTV9FVkVOVFNcCi0odW5zaWduZWQgbG9uZykgc2ltX2V2ZW50c19lbGFwc2VkX3RpbWUKLShTSU1fREVTQyBzZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZnB1LmMgYi9zaW0vY29tbW9uL3NpbS1mcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzODFlMC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1mcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NzggKzAsMCBAQAotLyogVGhpcyBpcyBhIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGxpYnJhcnkgd2hpY2ggY2FuIGJlIHVzZWQgaW5zdGVhZAotICAgb2YgdGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGluIGxpYmdjYzEuYyBmb3IgdGFyZ2V0cyB3aXRob3V0Ci0gICBoYXJkd2FyZSBmbG9hdGluZyBwb2ludC4gICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NCwxOTk3LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQotY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2l0aCBvdGhlciBwcm9ncmFtcywgYW5kIHRvIGRpc3RyaWJ1dGUKLXRob3NlIHByb2dyYW1zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcwotZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMgZG8gYXBwbHkgaW4gb3RoZXIKLXJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YgdGhlIGZpbGUsIGFuZAotZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGFub3RoZXIgcHJvZ3JhbS4pCi0KLVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIG90aGVyIGZpbGVzLAotICAgc29tZSBvZiB3aGljaCBhcmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKLSAgIHRoaXMgbGlicmFyeSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlCi0gICB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAgIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLSAgIHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAqLwotCi0vKiBUaGlzIGltcGxlbWVudHMgSUVFRSA3NTQgZm9ybWF0IGFyaXRobWV0aWMsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEKLSAgIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGUgcm91bmRpbmcgbW9kZSwgb3IgZm9yIGdlbmVyYXRpbmcgb3IgaGFuZGxpbmcKLSAgIGV4Y2VwdGlvbnMuCi0KLSAgIFRoZSBvcmlnaW5hbCBjb2RlIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBoYWNrZWQgYnkgTWFyayBFaWNoaW4gYW5kIEppbQotICAgV2lsc29uLCBhbGwgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0KLSNpZm5kZWYgU0lNX0ZQVV9DCi0jZGVmaW5lIFNJTV9GUFVfQwotCi0jaW5jbHVkZSAic2ltLWJhc2ljcy5oIgotI2luY2x1ZGUgInNpbS1mcHUuaCIKLQotI2luY2x1ZGUgInNpbS1pby5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotCi0vKiBEZWJ1Z2dpbmcgc3VwcG9ydC4gKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2JpdHMgKHVuc2lnbmVkNjQgeCwKLQkgICAgaW50IG1zYml0LAotCSAgICBzaW1fZnB1X3ByaW50X2Z1bmMgcHJpbnQsCi0JICAgIHZvaWQgKmFyZykKLXsKLSAgdW5zaWduZWQ2NCBiaXQgPSBMU0JJVDY0IChtc2JpdCk7Ci0gIGludCBpID0gNDsKLSAgd2hpbGUgKGJpdCkKLSAgICB7Ci0gICAgICBpZiAoaSA9PSAwKQotCXByaW50IChhcmcsICIsIik7Ci0gICAgICBpZiAoKHggJiBiaXQpKQotCXByaW50IChhcmcsICIxIik7Ci0gICAgICBlbHNlCi0JcHJpbnQgKGFyZywgIjAiKTsKLSAgICAgIGJpdCA+Pj0gMTsKLSAgICAgIGkgPSAoaSArIDEpICUgNDsKLSAgICB9Ci19Ci0KLQotCi0vKiBRdWljayBhbmQgZGlydHkgY29udmVyc2lvbiBiZXR3ZWVuIGEgaG9zdCBkb3VibGUgYW5kIGhvc3QgNjRiaXQgaW50ICovCi0KLXR5cGVkZWYgdW5pb24gewotICBkb3VibGUgZDsKLSAgdW5zaWduZWQ2NCBpOwotfSBzaW1fZnB1X21hcDsgIAotCi0KLS8qIEEgcGFja2VkIElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCi0gICBGb3JtIGlzIDxTSUdOOjE+PEJJQVNFREVYUDpOUl9FWFBCSVRTPjxGUkFDOk5SX0ZSQUNCSVRTPiBmb3IgYm90aAotICAgMzIgYW5kIDY0IGJpdCBudW1iZXJzLiAgVGhpcyBudW1iZXIgaXMgaW50ZXJwcmV0ZWQgYXM6Ci0KLSAgIE5vcm1hbGl6ZWQgKDAgPCBCSUFTRURFWFAgJiYgQklBU0VERVhQIDwgRVhQTUFYKToKLSAgIChzaWduID8gJy0nIDogJysnKSAxLjxGUkFDPiB4IDIgXiAoQklBU0VERVhQIC0gRVhQQklBUykKLQotICAgRGVub3JtYWxpemVkICgwID09IEJJQVNFREVYUCAmJiBGUkFDICE9IDApOgotICAgKHNpZ24gPyAiLSIgOiAiKyIpIDAuPEZSQUM+IHggMiBeICgtIEVYUEJJQVMpCi0KLSAgIFplcm8gKDAgPT0gQklBU0VERVhQICYmIEZSQUMgPT0gMCk6Ci0gICAoc2lnbiA/ICItIiA6ICIrIikgMC4wCi0gICAKLSAgIEluZmluaXR5IChCSUFTRURFWFAgPT0gRVhQTUFYICYmIEZSQUMgPT0gMCk6Ci0gICAoc2lnbiA/ICItIiA6ICIrIikgImluZmluaXR5IgotCi0gICBTaWduYWxpbmdOYU4gKEJJQVNFREVYUCA9PSBFWFBNQVggJiYgRlJBQyA+IDAgJiYgRlJBQyA8IFFVSUVUX05BTik6Ci0gICBTTmFOLkZSQUMKLQotICAgUXVpZXROYU4gKEJJQVNFREVYUCA9PSBFWFBNQVggJiYgRlJBQyA+IDAgJiYgRlJBQyA+IFFVSUVUX05BTik6Ci0gICBRTmFOLkZSQUMKLQotICAgKi8KLQotI2RlZmluZSBOUl9FWFBCSVRTICAoaXNfZG91YmxlID8gICAxMSA6ICAgOCkKLSNkZWZpbmUgTlJfRlJBQ0JJVFMgKGlzX2RvdWJsZSA/ICAgNTIgOiAyMykKLSNkZWZpbmUgU0lHTkJJVCAgICAgKGlzX2RvdWJsZSA/IE1TQklUNjQgKDApIDogTVNCSVQ2NCAoMzIpKQotCi0jZGVmaW5lIEVYUE1BWDMyICAgICgyNTUpCi0jZGVmaW5lIEVYTVBBWDY0ICAgICgyMDQ3KQotI2RlZmluZSBFWFBNQVggICAgICAoKHVuc2lnbmVkKSAoaXNfZG91YmxlID8gRVhNUEFYNjQgOiBFWFBNQVgzMikpCi0KLSNkZWZpbmUgRVhQQklBUzMyICAgKDEyNykKLSNkZWZpbmUgRVhQQklBUzY0ICAgKDEwMjMpCi0jZGVmaW5lIEVYUEJJQVMgICAgIChpc19kb3VibGUgPyBFWFBCSUFTNjQgOiBFWFBCSUFTMzIpCi0KLSNkZWZpbmUgUVVJRVRfTkFOICAgTFNCSVQ2NCAoTlJfRlJBQ0JJVFMgLSAxKQotCi0KLQotLyogQW4gdW5wYWNrZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCi0gICBXaGVuIHVucGFja2VkLCB0aGUgZnJhY3Rpb24gb2YgYm90aCBhIDMyIGFuZCA2NCBiaXQgZmxvYXRpbmcgcG9pbnQKLSAgIG51bWJlciBpcyBzdG9yZWQgdXNpbmcgdGhlIHNhbWUgZm9ybWF0OgotCi0gICA2NCBiaXQgLSA8SU1QTElDSVRfMToxPjxGUkFDQklUUzo1Mj48R1VBUkRTOjg+PFBBRDowMD4KLSAgIDMyIGJpdCAtIDxJTVBMSUNJVF8xOjE+PEZSQUNCSVRTOjIzPjxHVUFSRFM6Nz48UEFEOjMwPiAqLwotCi0jZGVmaW5lIE5SX1BBRDMyICAgICgzMCkKLSNkZWZpbmUgTlJfUEFENjQgICAgKDApCi0jZGVmaW5lIE5SX1BBRCAgICAgIChpc19kb3VibGUgPyBOUl9QQUQ2NCA6IE5SX1BBRDMyKQotI2RlZmluZSBQQURNQVNLICAgICAoaXNfZG91YmxlID8gMCA6IExTTUFTSzY0IChOUl9QQUQzMiAtIDEsIDApKQotCi0jZGVmaW5lIE5SX0dVQVJEUzMyICg3ICsgTlJfUEFEMzIpCi0jZGVmaW5lIE5SX0dVQVJEUzY0ICg4ICsgTlJfUEFENjQpCi0jZGVmaW5lIE5SX0dVQVJEUyAgKGlzX2RvdWJsZSA/IE5SX0dVQVJEUzY0IDogTlJfR1VBUkRTMzIpCi0jZGVmaW5lIEdVQVJETUFTSyAgTFNNQVNLNjQgKE5SX0dVQVJEUyAtIDEsIDApCi0KLSNkZWZpbmUgR1VBUkRNU0IgICBMU0JJVDY0ICAoTlJfR1VBUkRTIC0gMSkKLSNkZWZpbmUgR1VBUkRMU0IgICBMU0JJVDY0ICAoTlJfUEFEKQotI2RlZmluZSBHVUFSRFJPVU5EIExTTUFTSzY0IChOUl9HVUFSRFMgLSAyLCAwKQotCi0jZGVmaW5lIE5SX0ZSQUNfR1VBUkQgICAoNjApCi0jZGVmaW5lIElNUExJQ0lUXzEgTFNCSVQ2NCAoTlJfRlJBQ19HVUFSRCkKLSNkZWZpbmUgSU1QTElDSVRfMiBMU0JJVDY0IChOUl9GUkFDX0dVQVJEICsgMSkKLSNkZWZpbmUgSU1QTElDSVRfNCBMU0JJVDY0IChOUl9GUkFDX0dVQVJEICsgMikKLSNkZWZpbmUgTlJfU1BBUkUgMgotCi0jZGVmaW5lIEZSQUMzMk1BU0sgTFNNQVNLNjQgKDYzLCBOUl9GUkFDX0dVQVJEIC0gMzIgKyAxKQotCi0jZGVmaW5lIE5PUk1BTF9FWFBNSU4gKC0oRVhQQklBUykrMSkKLQotI2RlZmluZSBOT1JNQUxfRVhQTUFYMzIgKEVYUEJJQVMzMikKLSNkZWZpbmUgTk9STUFMX0VYUE1BWDY0IChFWFBCSUFTNjQpCi0jZGVmaW5lIE5PUk1BTF9FWFBNQVggKEVYUEJJQVMpCi0KLQotLyogSW50ZWdlciBjb25zdGFudHMgKi8KLQotI2RlZmluZSBNQVhfSU5UMzIgICgoc2lnbmVkNjQpIExTTUFTSzY0ICgzMCwgMCkpCi0jZGVmaW5lIE1BWF9VSU5UMzIgTFNNQVNLNjQgKDMxLCAwKQotI2RlZmluZSBNSU5fSU5UMzIgICgoc2lnbmVkNjQpIExTTUFTSzY0ICg2MywgMzEpKQotCi0jZGVmaW5lIE1BWF9JTlQ2NCAgKChzaWduZWQ2NCkgTFNNQVNLNjQgKDYyLCAwKSkKLSNkZWZpbmUgTUFYX1VJTlQ2NCBMU01BU0s2NCAoNjMsIDApCi0jZGVmaW5lIE1JTl9JTlQ2NCAgKChzaWduZWQ2NCkgTFNNQVNLNjQgKDYzLCA2MykpCi0KLSNkZWZpbmUgTUFYX0lOVCAgIChpc182NGJpdCA/IE1BWF9JTlQ2NCAgOiBNQVhfSU5UMzIpCi0jZGVmaW5lIE1JTl9JTlQgICAoaXNfNjRiaXQgPyBNSU5fSU5UNjQgIDogTUlOX0lOVDMyKQotI2RlZmluZSBNQVhfVUlOVCAgKGlzXzY0Yml0ID8gTUFYX1VJTlQ2NCA6IE1BWF9VSU5UMzIpCi0jZGVmaW5lIE5SX0lOVEJJVFMgKGlzXzY0Yml0ID8gNjQgOiAzMikKLQotLyogU3F1ZWVzZSBhbiB1bnBhY2tlZCBzaW1fZnB1IHN0cnVjdCBpbnRvIGEgMzIvNjQgYml0IGludGVnZXIgKi8KLVNUQVRJQ19JTkxJTkVfU0lNX0ZQVSAodW5zaWduZWQ2NCkKLXBhY2tfZnB1IChjb25zdCBzaW1fZnB1ICpzcmMsCi0JICBpbnQgaXNfZG91YmxlKQotewotICBpbnQgc2lnbjsKLSAgdW5zaWduZWQ2NCBleHA7Ci0gIHVuc2lnbmVkNjQgZnJhY3Rpb247Ci0gIHVuc2lnbmVkNjQgcGFja2VkOwotCi0gIHN3aXRjaCAoc3JjLT5jbGFzcykKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBOYU4gKi8KLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfcW5hbjoKLSAgICAgIHNpZ24gPSBzcmMtPnNpZ247Ci0gICAgICBleHAgPSBFWFBNQVg7Ci0gICAgICAvKiBmb3JjZSBmcmFjdGlvbiB0byBjb3JyZWN0IGNsYXNzICovCi0gICAgICBmcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb247Ci0gICAgICBmcmFjdGlvbiA+Pj0gTlJfR1VBUkRTOwotICAgICAgZnJhY3Rpb24gfD0gUVVJRVRfTkFOOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3NuYW46Ci0gICAgICBzaWduID0gc3JjLT5zaWduOwotICAgICAgZXhwID0gRVhQTUFYOwotICAgICAgLyogZm9yY2UgZnJhY3Rpb24gdG8gY29ycmVjdCBjbGFzcyAqLwotICAgICAgZnJhY3Rpb24gPSBzcmMtPmZyYWN0aW9uOwotICAgICAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKLSAgICAgIGZyYWN0aW9uICY9IH5RVUlFVF9OQU47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfaW5maW5pdHk6Ci0gICAgICBzaWduID0gc3JjLT5zaWduOwotICAgICAgZXhwID0gRVhQTUFYOwotICAgICAgZnJhY3Rpb24gPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3plcm86Ci0gICAgICBzaWduID0gc3JjLT5zaWduOwotICAgICAgZXhwID0gMDsKLSAgICAgIGZyYWN0aW9uID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKLSAgICAgIEFTU0VSVCAoc3JjLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xKTsKLSAgICAgIEFTU0VSVCAoc3JjLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOwotICAgICAgaWYgKHNyYy0+bm9ybWFsX2V4cCA8IE5PUk1BTF9FWFBNSU4pCi0JewotCSAgLyogVGhpcyBudW1iZXIncyBleHBvbmVudCBpcyB0b28gbG93IHRvIGZpdCBpbnRvIHRoZSBiaXRzCi0JICAgICBhdmFpbGFibGUgaW4gdGhlIG51bWJlciBXZSdsbCBkZW5vcm1hbGl6ZSB0aGUgbnVtYmVyIGJ5Ci0JICAgICBzdG9yaW5nIHplcm8gaW4gdGhlIGV4cG9uZW50IGFuZCBzaGlmdCB0aGUgZnJhY3Rpb24gdG8KLQkgICAgIHRoZSByaWdodCB0byBtYWtlIHVwIGZvciBpdC4gKi8KLQkgIGludCBucl9zaGlmdCA9IE5PUk1BTF9FWFBNSU4gLSBzcmMtPm5vcm1hbF9leHA7Ci0JICBpZiAobnJfc2hpZnQgPiBOUl9GUkFDQklUUykKLQkgICAgewotCSAgICAgIC8qIHVuZGVyZmxvdywganVzdCBtYWtlIHRoZSBudW1iZXIgemVybyAqLwotCSAgICAgIHNpZ24gPSBzcmMtPnNpZ247Ci0JICAgICAgZXhwID0gMDsKLQkgICAgICBmcmFjdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNpZ24gPSBzcmMtPnNpZ247Ci0JICAgICAgZXhwID0gMDsKLQkgICAgICAvKiBTaGlmdCBieSB0aGUgdmFsdWUgKi8KLQkgICAgICBmcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb247Ci0JICAgICAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKLQkgICAgICBmcmFjdGlvbiA+Pj0gbnJfc2hpZnQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzcmMtPm5vcm1hbF9leHAgPiBOT1JNQUxfRVhQTUFYKQotCXsKLQkgIC8qIEluZmluaXR5ICovCi0JICBzaWduID0gc3JjLT5zaWduOwotCSAgZXhwID0gRVhQTUFYOwotCSAgZnJhY3Rpb24gPSAwOyAKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwID0gKHNyYy0+bm9ybWFsX2V4cCArIEVYUEJJQVMpOwotCSAgc2lnbiA9IHNyYy0+c2lnbjsKLQkgIGZyYWN0aW9uID0gc3JjLT5mcmFjdGlvbjsKLQkgIC8qIEZJWE1FOiBOZWVkIHRvIHJvdW5kIGFjY29yZGluZyB0byBXSVRIX1NJTV9GUFVfUk9VTkRJTkcKLSAgICAgICAgICAgICBvciBzb21lIHN1Y2ggKi8KLQkgIC8qIFJvdW5kIHRvIG5lYXJlc3Q6IElmIHRoZSBndWFyZCBiaXRzIGFyZSB0aGUgYWxsIHplcm8sIGJ1dAotCSAgICAgdGhlIGZpcnN0LCB0aGVuIHdlJ3JlIGhhbGYgd2F5IGJldHdlZW4gdHdvIG51bWJlcnMsCi0JICAgICBjaG9vc2UgdGhlIG9uZSB3aGljaCBtYWtlcyB0aGUgbHNiIG9mIHRoZSBhbnN3ZXIgMC4gICovCi0JICBpZiAoKGZyYWN0aW9uICYgR1VBUkRNQVNLKSA9PSBHVUFSRE1TQikKLQkgICAgewotCSAgICAgIGlmICgoZnJhY3Rpb24gJiAoR1VBUkRNU0IgPDwgMSkpKQotCQlmcmFjdGlvbiArPSAoR1VBUkRNU0IgPDwgMSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEFkZCBhIG9uZSB0byB0aGUgZ3VhcmRzIHRvIGZvcmNlIHJvdW5kIHRvIG5lYXJlc3QgKi8KLQkgICAgICBmcmFjdGlvbiArPSBHVUFSRFJPVU5EOwotCSAgICB9Ci0JICBpZiAoKGZyYWN0aW9uICYgSU1QTElDSVRfMikpIC8qIHJvdW5kaW5nIHJlc3VsdGVkIGluIGNhcnJ5ICovCi0JICAgIHsKLQkgICAgICBleHAgKz0gMTsKLQkgICAgICBmcmFjdGlvbiA+Pj0gMTsKLQkgICAgfQotCSAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKLQkgIC8qIFdoZW4gZXhwID09IEVYUE1BWCAob3ZlcmZsb3cgZnJvbSBjYXJyeSkgZnJhY3Rpb24gbXVzdAotCSAgICAgaGF2ZSBiZWVuIG1hZGUgemVybyAqLwotCSAgQVNTRVJUICgoZXhwID09IEVYUE1BWCkgPD0gKChmcmFjdGlvbiAmIH5JTVBMSUNJVF8xKSA9PSAwKSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBwYWNrZWQgPSAoKHNpZ24gPyBTSUdOQklUIDogMCkKLQkgICAgIHwgKGV4cCA8PCBOUl9GUkFDQklUUykKLQkgICAgIHwgTFNNQVNLRUQ2NCAoZnJhY3Rpb24sIE5SX0ZSQUNCSVRTIC0gMSwgMCkpOwotCi0gIC8qIHRyYWNlIG9wZXJhdGlvbiAqLwotI2lmIDAKLSAgaWYgKGlzX2RvdWJsZSkKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgicGFja19mcHU6ICIpOwotICAgICAgcHJpbnRmICgiLT4gJWMlMGxYLiUwNmxYXG4iLAotCSAgICAgIExTTUFTS0VEMzIgKHBhY2tlZCwgMzEsIDMxKSA/ICc4JyA6ICcwJywKLQkgICAgICAobG9uZykgTFNFWFRSQUNURUQzMiAocGFja2VkLCAzMCwgMjMpLAotCSAgICAgIChsb25nKSBMU0VYVFJBQ1RFRDMyIChwYWNrZWQsIDIzIC0gMSwgMCkpOwotICAgIH0KLSNlbmRpZgotICAKLSAgcmV0dXJuIHBhY2tlZDsKLX0KLQotCi0vKiBVbnBhY2sgYSAzMi82NCBiaXQgaW50ZWdlciBpbnRvIGEgc2ltX2ZwdSBzdHJ1Y3R1cmUgKi8KLVNUQVRJQ19JTkxJTkVfU0lNX0ZQVSAodm9pZCkKLXVucGFja19mcHUgKHNpbV9mcHUgKmRzdCwgdW5zaWduZWQ2NCBwYWNrZWQsIGludCBpc19kb3VibGUpCi17Ci0gIHVuc2lnbmVkNjQgZnJhY3Rpb24gPSBMU01BU0tFRDY0IChwYWNrZWQsIE5SX0ZSQUNCSVRTIC0gMSwgMCk7Ci0gIHVuc2lnbmVkIGV4cCA9IExTRVhUUkFDVEVENjQgKHBhY2tlZCwgTlJfRVhQQklUUyArIE5SX0ZSQUNCSVRTIC0gMSwgTlJfRlJBQ0JJVFMpOwotICBpbnQgc2lnbiA9IChwYWNrZWQgJiBTSUdOQklUKSAhPSAwOwotCi0gIGlmIChleHAgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBIbW0uICBMb29rcyBsaWtlIDAgKi8KLSAgICAgIGlmIChmcmFjdGlvbiA9PSAwKQotCXsKLQkgIC8qIHRhc3RlcyBsaWtlIHplcm8gKi8KLQkgIGRzdC0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3plcm87Ci0JICBkc3QtPnNpZ24gPSBzaWduOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBaZXJvIGV4cG9uZW50IHdpdGggbm9uIHplcm8gZnJhY3Rpb24gLSBpdCdzIGRlbm9ybWFsaXplZCwKLQkgICAgIHNvIHRoZXJlIGlzbid0IGEgbGVhZGluZyBpbXBsaWNpdCBvbmUgLSB3ZSdsbCBzaGlmdCBpdCBzbwotCSAgICAgaXQgZ2V0cyBvbmUuICAqLwotCSAgZHN0LT5ub3JtYWxfZXhwID0gZXhwIC0gRVhQQklBUyArIDE7Ci0JICBkc3QtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19kZW5vcm07Ci0JICBkc3QtPnNpZ24gPSBzaWduOwotCSAgZnJhY3Rpb24gPDw9IE5SX0dVQVJEUzsKLQkgIHdoaWxlIChmcmFjdGlvbiA8IElNUExJQ0lUXzEpCi0JICAgIHsKLQkgICAgICBmcmFjdGlvbiA8PD0gMTsKLQkgICAgICBkc3QtPm5vcm1hbF9leHAtLTsKLQkgICAgfQotCSAgZHN0LT5mcmFjdGlvbiA9IGZyYWN0aW9uOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGV4cCA9PSBFWFBNQVgpCi0gICAgewotICAgICAgLyogSHVnZSBleHBvbmVudCovCi0gICAgICBpZiAoZnJhY3Rpb24gPT0gMCkKLQl7Ci0JICAvKiBBdHRhY2hlZCB0byBhIHplcm8gZnJhY3Rpb24gLSBtZWFucyBpbmZpbml0eSAqLwotCSAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7Ci0JICBkc3QtPnNpZ24gPSBzaWduOwotCSAgLyogZHN0LT5ub3JtYWxfZXhwID0gRVhQQklBUzsgKi8KLQkgIC8qIGRzdC0+ZnJhY3Rpb24gPSAwOyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBOb24gemVybyBmcmFjdGlvbiwgbWVhbnMgTmFOICovCi0JICBkc3QtPnNpZ24gPSBzaWduOwotCSAgZHN0LT5mcmFjdGlvbiA9IChmcmFjdGlvbiA8PCBOUl9HVUFSRFMpOwotCSAgaWYgKGZyYWN0aW9uID49IFFVSUVUX05BTikKLQkgICAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLQkgIGVsc2UKLQkgICAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3Nfc25hbjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90aGluZyBzdHJhbmdlIGFib3V0IHRoaXMgbnVtYmVyICovCi0gICAgICBkc3QtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7Ci0gICAgICBkc3QtPnNpZ24gPSBzaWduOwotICAgICAgZHN0LT5mcmFjdGlvbiA9ICgoZnJhY3Rpb24gPDwgTlJfR1VBUkRTKSB8IElNUExJQ0lUXzEpOwotICAgICAgZHN0LT5ub3JtYWxfZXhwID0gZXhwIC0gRVhQQklBUzsKLSAgICB9Ci0KLSAgLyogdHJhY2Ugb3BlcmF0aW9uICovCi0jaWYgMAotICBpZiAoaXNfZG91YmxlKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJ1bnBhY2tfZnB1OiAlYyUwMmxYLiUwNmxYIC0+XG4iLAotCSAgICAgIExTTUFTS0VEMzIgKHBhY2tlZCwgMzEsIDMxKSA/ICc4JyA6ICcwJywKLQkgICAgICAobG9uZykgTFNFWFRSQUNURUQzMiAocGFja2VkLCAzMCwgMjMpLAotCSAgICAgIChsb25nKSBMU0VYVFJBQ1RFRDMyIChwYWNrZWQsIDIzIC0gMSwgMCkpOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIHNhbml0eSBjaGVja3MgKi8KLSAgewotICAgIHNpbV9mcHVfbWFwIHZhbDsKLSAgICB2YWwuaSA9IHBhY2tfZnB1IChkc3QsIDEpOwotICAgIGlmIChpc19kb3VibGUpCi0gICAgICB7Ci0JQVNTRVJUICh2YWwuaSA9PSBwYWNrZWQpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQl1bnNpZ25lZDMyIHZhbCA9IHBhY2tfZnB1IChkc3QsIDApOwotCXVuc2lnbmVkMzIgb3JnID0gcGFja2VkOwotCUFTU0VSVCAodmFsID09IG9yZyk7Ci0gICAgICB9Ci0gIH0KLX0KLQotCi0vKiBDb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgaW50byBhbiBpbnRlZ2VyICovCi1TVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKLWZwdTJpIChzaWduZWQ2NCAqaSwKLSAgICAgICBjb25zdCBzaW1fZnB1ICpzLAotICAgICAgIGludCBpc182NGJpdCwKLSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQotewotICB1bnNpZ25lZDY0IHRtcDsKLSAgaW50IHNoaWZ0OwotICBpbnQgc3RhdHVzID0gMDsKLSAgaWYgKHNpbV9mcHVfaXNfemVybyAocykpCi0gICAgewotICAgICAgKmkgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19zbmFuIChzKSkKLSAgICB7Ci0gICAgICAqaSA9IE1JTl9JTlQ7IC8qIEZJWE1FICovCi0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChzKSkKLSAgICB7Ci0gICAgICAqaSA9IE1JTl9JTlQ7IC8qIEZJWE1FICovCi0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7Ci0gICAgfQotICAvKiBtYXAgaW5maW5pdHkgb250byBNQVhfSU5ULi4uICovCi0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChzKSkKLSAgICB7Ci0gICAgICAqaSA9IHMtPnNpZ24gPyBNSU5fSU5UIDogTUFYX0lOVDsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2N2aTsKLSAgICB9Ci0gIC8qIGl0IGlzIGEgbnVtYmVyLCBidXQgYSBzbWFsbCBvbmUgKi8KLSAgaWYgKHMtPm5vcm1hbF9leHAgPCAwKQotICAgIHsKLSAgICAgICppID0gMDsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotICAgIH0KLSAgLyogSXMgdGhlIGZsb2F0aW5nIHBvaW50IE1JTl9JTlQgb3IganVzdCBjbG9zZT8gKi8KLSAgaWYgKHMtPnNpZ24gJiYgcy0+bm9ybWFsX2V4cCA9PSAoTlJfSU5UQklUUyAtIDEpKQotICAgIHsKLSAgICAgICppID0gTUlOX0lOVDsKLSAgICAgIEFTU0VSVCAocy0+ZnJhY3Rpb24gPj0gSU1QTElDSVRfMSk7Ci0gICAgICBpZiAocy0+ZnJhY3Rpb24gPT0gSU1QTElDSVRfMSkKLQlyZXR1cm4gMDsgLyogZXhhY3QgKi8KLSAgICAgIGlmIChpc182NGJpdCkgLyogY2FuJ3Qgcm91bmQgKi8KLQlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7IC8qIG11c3QgYmUgb3ZlcmZsb3cgKi8KLSAgICAgIC8qIEZvciBhIDMyYml0IHdpdGggTUFYX0lOVCwgcm91bmRpbmcgaXMgcG9zc2libGUgKi8KLSAgICAgIHN3aXRjaCAocm91bmQpCi0JewotCWNhc2Ugc2ltX2ZwdV9yb3VuZF9kZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBzaW1fZnB1X3JvdW5kX3plcm86Ci0JICBpZiAoKHMtPmZyYWN0aW9uICYgRlJBQzMyTUFTSykgIT0gSU1QTElDSVRfMSkKLQkgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9yb3VuZF9uZWFyOgotCSAgewotCSAgICBpZiAoKHMtPmZyYWN0aW9uICYgRlJBQzMyTUFTSykgIT0gSU1QTElDSVRfMSkKLQkgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7Ci0JICAgIGVsc2UgaWYgKChzLT5mcmFjdGlvbiAmICFGUkFDMzJNQVNLKSA+PSAofkZSQUMzMk1BU0sgPj4gMSkpCi0JICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0JICB9Ci0JY2FzZSBzaW1fZnB1X3JvdW5kX3VwOgotCSAgaWYgKChzLT5mcmFjdGlvbiAmIEZSQUMzMk1BU0spID09IElNUExJQ0lUXzEpCi0JICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotCSAgZWxzZQotCSAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7Ci0JY2FzZSBzaW1fZnB1X3JvdW5kX2Rvd246Ci0JICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7Ci0JfQotICAgIH0KLSAgLyogV291bGQgcmlnaHQgc2hpZnRpbmcgcmVzdWx0IGluIHRoZSBGUkFDIGJlaW5nIHNoaWZ0ZWQgaW50bwotICAgICAodGhyb3VnaCkgdGhlIGludGVnZXIncyBzaWduIGJpdD8gKi8KLSAgaWYgKHMtPm5vcm1hbF9leHAgPiAoTlJfSU5UQklUUyAtIDIpKQotICAgIHsKLSAgICAgICppID0gcy0+c2lnbiA/IE1JTl9JTlQgOiBNQVhfSU5UOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOwotICAgIH0KLSAgLyogbm9ybWFsIG51bWJlciBzaGlmdCBpdCBpbnRvIHBsYWNlICovCi0gIHRtcCA9IHMtPmZyYWN0aW9uOwotICBzaGlmdCA9IChzLT5ub3JtYWxfZXhwIC0gKE5SX0ZSQUNfR1VBUkQpKTsKLSAgaWYgKHNoaWZ0ID4gMCkKLSAgICB7Ci0gICAgICB0bXAgPDw9IHNoaWZ0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNoaWZ0ID0gLXNoaWZ0OwotICAgICAgaWYgKHRtcCAmICgoU0lHTkVENjQgKDEpIDw8IHNoaWZ0KSAtIDEpKQotCXN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotICAgICAgdG1wID4+PSBzaGlmdDsKLSAgICB9Ci0gICppID0gcy0+c2lnbiA/ICgtdG1wKSA6ICh0bXApOwotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiBjb252ZXJ0IGFuIGludGVnZXIgaW50byBhIGZsb2F0aW5nIHBvaW50ICovCi1TVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKLWkyZnB1IChzaW1fZnB1ICpmLCBzaWduZWQ2NCBpLCBpbnQgaXNfNjRiaXQpCi17Ci0gIGludCBzdGF0dXMgPSAwOwotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOwotICAgICAgZi0+c2lnbiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKLSAgICAgIGYtPnNpZ24gPSAoaSA8IDApOwotICAgICAgZi0+bm9ybWFsX2V4cCA9IE5SX0ZSQUNfR1VBUkQ7Ci0KLSAgICAgIGlmIChmLT5zaWduKSAKLQl7Ci0JICAvKiBTcGVjaWFsIGNhc2UgZm9yIG1pbmludCwgc2luY2UgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZwotCSAgICAgK3ZlIGludGVnZXIgcmVwcmVzZW50YXRpb24gZm9yIGl0ICovCi0JICBpZiAoaSA9PSBNSU5fSU5UKQotCSAgICB7Ci0JICAgICAgZi0+ZnJhY3Rpb24gPSBJTVBMSUNJVF8xOwotCSAgICAgIGYtPm5vcm1hbF9leHAgPSBOUl9JTlRCSVRTIC0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmLT5mcmFjdGlvbiA9ICgtaSk7Ci0JfQotICAgICAgZWxzZQotCWYtPmZyYWN0aW9uID0gaTsKLQotICAgICAgaWYgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzIpCi0JewotCSAgZG8gCi0JICAgIHsKLQkgICAgICBmLT5mcmFjdGlvbiA9IChmLT5mcmFjdGlvbiA+PiAxKSB8IChmLT5mcmFjdGlvbiAmIDEpOwotCSAgICAgIGYtPm5vcm1hbF9leHAgKz0gMTsKLQkgICAgfQotCSAgd2hpbGUgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzIpOwotCX0KLSAgICAgIGVsc2UgaWYgKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMSkKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgZi0+ZnJhY3Rpb24gPDw9IDE7Ci0JICAgICAgZi0+bm9ybWFsX2V4cCAtPSAxOwotCSAgICB9Ci0JICB3aGlsZSAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8xKTsKLQl9Ci0gICAgfQotCi0gIC8qIHRyYWNlIG9wZXJhdGlvbiAqLwotI2lmIDAKLSAgewotICAgIHByaW50ZiAoImkyZnB1OiAweCUwOGxYIC0+XG4iLCAobG9uZykgaSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICB7Ci0gICAgc2lnbmVkNjQgdmFsOwotICAgIGZwdTJpICgmdmFsLCBmLCBpc182NGJpdCwgc2ltX2ZwdV9yb3VuZF96ZXJvKTsKLSAgICBpZiAoaSA+PSBNSU5fSU5UMzIgJiYgaSA8PSBNQVhfSU5UMzIpCi0gICAgICB7Ci0JQVNTRVJUICh2YWwgPT0gaSk7Ci0gICAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0KLS8qIENvbnZlcnQgYSBmbG9hdGluZyBwb2ludCBpbnRvIGFuIGludGVnZXIgKi8KLVNUQVRJQ19JTkxJTkVfU0lNX0ZQVSAoaW50KQotZnB1MnUgKHVuc2lnbmVkNjQgKnUsIGNvbnN0IHNpbV9mcHUgKnMsIGludCBpc182NGJpdCkKLXsKLSAgY29uc3QgaW50IGlzX2RvdWJsZSA9IDE7Ci0gIHVuc2lnbmVkNjQgdG1wOwotICBpbnQgc2hpZnQ7Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKHMpKQotICAgIHsKLSAgICAgICp1ID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfbmFuIChzKSkKLSAgICB7Ci0gICAgICAqdSA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qIGl0IGlzIGEgbmVnYXRpdmUgbnVtYmVyICovCi0gIGlmIChzLT5zaWduKQotICAgIHsKLSAgICAgICp1ID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogZ2V0IHJlYXNvbmFibGUgTUFYX1VTSV9JTlQuLi4gKi8KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHMpKQotICAgIHsKLSAgICAgICp1ID0gTUFYX1VJTlQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qIGl0IGlzIGEgbnVtYmVyLCBidXQgYSBzbWFsbCBvbmUgKi8KLSAgaWYgKHMtPm5vcm1hbF9leHAgPCAwKQotICAgIHsKLSAgICAgICp1ID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogb3ZlcmZsb3cgKi8KLSAgaWYgKHMtPm5vcm1hbF9leHAgPiAoTlJfSU5UQklUUyAtIDEpKQotICAgIHsKLSAgICAgICp1ID0gTUFYX1VJTlQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qIG5vcm1hbCBudW1iZXIgKi8KLSAgdG1wID0gKHMtPmZyYWN0aW9uICYgflBBRE1BU0spOwotICBzaGlmdCA9IChzLT5ub3JtYWxfZXhwIC0gKE5SX0ZSQUNCSVRTICsgTlJfR1VBUkRTKSk7Ci0gIGlmIChzaGlmdCA+IDApCi0gICAgewotICAgICAgdG1wIDw8PSBzaGlmdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaGlmdCA9IC1zaGlmdDsKLSAgICAgIHRtcCA+Pj0gc2hpZnQ7Ci0gICAgfQotICAqdSA9IHRtcDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgYW4gdW5zaWduZWQgaW50ZWdlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgKi8KLVNUQVRJQ19JTkxJTkVfU0lNX0ZQVSAoaW50KQotdTJmcHUgKHNpbV9mcHUgKmYsIHVuc2lnbmVkNjQgdSwgaW50IGlzXzY0Yml0KQotewotICBpZiAodSA9PSAwKQotICAgIHsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOwotICAgICAgZi0+c2lnbiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKLSAgICAgIGYtPnNpZ24gPSAwOwotICAgICAgZi0+bm9ybWFsX2V4cCA9IE5SX0ZSQUNfR1VBUkQ7Ci0gICAgICBmLT5mcmFjdGlvbiA9IHU7Ci0KLSAgICAgIHdoaWxlIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzEpCi0JewotCSAgZi0+ZnJhY3Rpb24gPDw9IDE7Ci0JICBmLT5ub3JtYWxfZXhwIC09IDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcmVnaXN0ZXIgPC0+IHNpbV9mcHUgKi8KLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpCi1zaW1fZnB1XzMydG8gKHNpbV9mcHUgKmYsIHVuc2lnbmVkMzIgcykKLXsKLSAgdW5wYWNrX2ZwdSAoZiwgcywgMCk7Ci19Ci0KLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpCi1zaW1fZnB1XzIzMnRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDMyIGgsIHVuc2lnbmVkMzIgbCkKLXsKLSAgdW5zaWduZWQ2NCBzID0gaDsKLSAgcyA9IChzIDw8IDMyKSB8IGw7Ci0gIHVucGFja19mcHUgKGYsIHMsIDEpOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKQotc2ltX2ZwdV82NHRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDY0IHMpCi17Ci0gIHVucGFja19mcHUgKGYsIHMsIDEpOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKQotc2ltX2ZwdV90bzMyICh1bnNpZ25lZDMyICpzLAotCSAgICAgIGNvbnN0IHNpbV9mcHUgKmYpCi17Ci0gICpzID0gcGFja19mcHUgKGYsIDApOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKQotc2ltX2ZwdV90bzIzMiAodW5zaWduZWQzMiAqaCwgdW5zaWduZWQzMiAqbCwKLQkgICAgICAgY29uc3Qgc2ltX2ZwdSAqZikKLXsKLSAgdW5zaWduZWQ2NCBzID0gcGFja19mcHUgKGYsIDEpOwotICAqbCA9IHM7Ci0gICpoID0gKHMgPj4gMzIpOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKQotc2ltX2ZwdV90bzY0ICh1bnNpZ25lZDY0ICp1LAotCSAgICAgIGNvbnN0IHNpbV9mcHUgKmYpCi17Ci0gICp1ID0gcGFja19mcHUgKGYsIDEpOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKQotc2ltX2ZwdV9mcmFjdGlvbnRvIChzaW1fZnB1ICpmLAotCQkgICAgaW50IHNpZ24sCi0JCSAgICBpbnQgbm9ybWFsX2V4cCwKLQkJICAgIHVuc2lnbmVkNjQgZnJhY3Rpb24sCi0JCSAgICBpbnQgcHJlY2lzaW9uKQotewotICBpbnQgc2hpZnQgPSAoTlJfRlJBQ19HVUFSRCAtIHByZWNpc2lvbik7Ci0gIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7Ci0gIGYtPnNpZ24gPSBzaWduOwotICBmLT5ub3JtYWxfZXhwID0gbm9ybWFsX2V4cDsKLSAgLyogc2hpZnQgdGhlIGZyYWN0aW9uIHRvIHdoZXJlIHNpbS1mcHUgZXhwZWN0cyBpdCAqLwotICBpZiAoc2hpZnQgPj0gMCkKLSAgICBmLT5mcmFjdGlvbiA9IChmcmFjdGlvbiA8PCBzaGlmdCk7Ci0gIGVsc2UKLSAgICBmLT5mcmFjdGlvbiA9IChmcmFjdGlvbiA+PiAtc2hpZnQpOwotICBmLT5mcmFjdGlvbiB8PSBJTVBMSUNJVF8xOwotfQotCi0KLUlOTElORV9TSU1fRlBVICh1bnNpZ25lZDY0KQotc2ltX2ZwdV90b2ZyYWN0aW9uIChjb25zdCBzaW1fZnB1ICpkLAotCQkgICAgaW50IHByZWNpc2lvbikKLXsKLSAgLyogd2UgaGF2ZSBOUl9GUkFDX0dVQVJEIGJpdHMsIHdlIHdhbnQgb25seSBQUkVDSVNJT04gYml0cyAqLwotICBpbnQgc2hpZnQgPSAoTlJfRlJBQ19HVUFSRCAtIHByZWNpc2lvbik7Ci0gIHVuc2lnbmVkNjQgZnJhY3Rpb24gPSAoZC0+ZnJhY3Rpb24gJiB+SU1QTElDSVRfMSk7Ci0gIGlmIChzaGlmdCA+PSAwKQotICAgIHJldHVybiBmcmFjdGlvbiA+PiBzaGlmdDsKLSAgZWxzZQotICAgIHJldHVybiBmcmFjdGlvbiA8PCAtc2hpZnQ7Ci19Ci0KLQotLyogUm91bmRpbmcgKi8KLQotU1RBVElDX0lOTElORV9TSU1fRlBVIChpbnQpCi1kb19ub3JtYWxfb3ZlcmZsb3cgKHNpbV9mcHUgKmYsCi0JCSAgICBpbnQgaXNfZG91YmxlLAotCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKLXsKLSAgc3dpdGNoIChyb3VuZCkKLSAgICB7Ci0gICAgY2FzZSBzaW1fZnB1X3JvdW5kX2RlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIHNpbV9mcHVfcm91bmRfbmVhcjoKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19pbmZpbml0eTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF91cDoKLSAgICAgIGlmICghZi0+c2lnbikKLQlmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNpbV9mcHVfcm91bmRfZG93bjoKLSAgICAgIGlmIChmLT5zaWduKQotCWYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19pbmZpbml0eTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF96ZXJvOgotICAgICAgYnJlYWs7Ci0gICAgfQotICBmLT5ub3JtYWxfZXhwID0gTk9STUFMX0VYUE1BWDsKLSAgZi0+ZnJhY3Rpb24gPSBMU01BU0s2NCAoTlJfRlJBQ19HVUFSRCwgTlJfR1VBUkRTKTsKLSAgcmV0dXJuIChzaW1fZnB1X3N0YXR1c19vdmVyZmxvdyB8IHNpbV9mcHVfc3RhdHVzX2luZXhhY3QpOwotfQotCi1TVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKLWRvX25vcm1hbF91bmRlcmZsb3cgKHNpbV9mcHUgKmYsCi0JCSAgICAgaW50IGlzX2RvdWJsZSwKLQkJICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQotewotICBzd2l0Y2ggKHJvdW5kKQotICAgIHsKLSAgICBjYXNlIHNpbV9mcHVfcm91bmRfZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF9uZWFyOgotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3plcm87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNpbV9mcHVfcm91bmRfdXA6Ci0gICAgICBpZiAoZi0+c2lnbikKLQlmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF9kb3duOgotICAgICAgaWYgKCFmLT5zaWduKQotCWYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fZnB1X3JvdW5kX3plcm86Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZi0+bm9ybWFsX2V4cCA9IE5PUk1BTF9FWFBNSU4gLSBOUl9GUkFDQklUUzsKLSAgZi0+ZnJhY3Rpb24gPSBJTVBMSUNJVF8xOwotICByZXR1cm4gKHNpbV9mcHVfc3RhdHVzX2luZXhhY3QgfCBzaW1fZnB1X3N0YXR1c191bmRlcmZsb3cpOwotfQotCi0KLQotLyogUm91bmQgYSBudW1iZXIgdXNpbmcgTlJfR1VBUkRTLgotICAgV2lsbCByZXR1cm4gdGhlIHJvdW5kZWQgbnVtYmVyIG9yIEYtPkZSQUNUSU9OID09IDAgd2hlbiB1bmRlcmZsb3cgKi8KLQotU1RBVElDX0lOTElORV9TSU1fRlBVIChpbnQpCi1kb19ub3JtYWxfcm91bmQgKHNpbV9mcHUgKmYsCi0JCSBpbnQgbnJfZ3VhcmRzLAotCQkgc2ltX2ZwdV9yb3VuZCByb3VuZCkKLXsKLSAgdW5zaWduZWQ2NCBndWFyZG1hc2sgPSBMU01BU0s2NCAobnJfZ3VhcmRzIC0gMSwgMCk7Ci0gIHVuc2lnbmVkNjQgZ3VhcmRtc2IgPSBMU0JJVDY0IChucl9ndWFyZHMgLSAxKTsKLSAgdW5zaWduZWQ2NCBmcmFjbHNiID0gZ3VhcmRtc2IgPDwgMTsKLSAgaWYgKChmLT5mcmFjdGlvbiAmIGd1YXJkbWFzaykpCi0gICAgewotICAgICAgaW50IHN0YXR1cyA9IHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0gICAgICBzd2l0Y2ggKHJvdW5kKQotCXsKLQljYXNlIHNpbV9mcHVfcm91bmRfZGVmYXVsdDoKLQkgIHJldHVybiAwOwotCWNhc2Ugc2ltX2ZwdV9yb3VuZF9uZWFyOgotCSAgaWYgKChmLT5mcmFjdGlvbiAmIGd1YXJkbXNiKSkKLQkgICAgewotCSAgICAgIGlmICgoZi0+ZnJhY3Rpb24gJiBmcmFjbHNiKSkKLQkJewotCQkgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19yb3VuZGVkOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGYtPmZyYWN0aW9uICYgKGd1YXJkbWFzayA+PiAxKSkpCi0JCXsKLQkJICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfcm91bmRlZDsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfcm91bmRfdXA6Ci0JICBpZiAoIWYtPnNpZ24pCi0JICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19yb3VuZGVkOwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3JvdW5kX2Rvd246Ci0JICBpZiAoZi0+c2lnbikKLQkgICAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX3JvdW5kZWQ7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfcm91bmRfemVybzoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGYtPmZyYWN0aW9uICY9IH5ndWFyZG1hc2s7Ci0gICAgICAvKiByb3VuZCBpZiBuZWVkZWQsIGhhbmRsZSByZXN1bHRpbmcgb3ZlcmZsb3cgKi8KLSAgICAgIGlmICgoc3RhdHVzICYgc2ltX2ZwdV9zdGF0dXNfcm91bmRlZCkpCi0JewotCSAgZi0+ZnJhY3Rpb24gKz0gZnJhY2xzYjsKLQkgIGlmICgoZi0+ZnJhY3Rpb24gJiBJTVBMSUNJVF8yKSkKLQkgICAgewotCSAgICAgIGYtPmZyYWN0aW9uID4+PSAxOwotCSAgICAgIGYtPm5vcm1hbF9leHAgKz0gMTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotU1RBVElDX0lOTElORV9TSU1fRlBVIChpbnQpCi1kb19yb3VuZCAoc2ltX2ZwdSAqZiwKLQkgIGludCBpc19kb3VibGUsCi0JICBzaW1fZnB1X3JvdW5kIHJvdW5kLAotCSAgc2ltX2ZwdV9kZW5vcm0gZGVub3JtKQotewotICBzd2l0Y2ggKGYtPmNsYXNzKQotICAgIHsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfcW5hbjoKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfemVybzoKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfaW5maW5pdHk6Ci0gICAgICByZXR1cm4gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19zbmFuOgotICAgICAgLyogUXVpZXRlbiBhIFNpZ25hbGluZ05hTiAqLyAKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKLSAgICAgIHsKLQlpbnQgc3RhdHVzOwotCUFTU0VSVCAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8yKTsKLQlBU1NFUlQgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzEpOwotCWlmIChmLT5ub3JtYWxfZXhwIDwgTk9STUFMX0VYUE1JTikKLQkgIHsKLQkgICAgLyogVGhpcyBudW1iZXIncyBleHBvbmVudCBpcyB0b28gbG93IHRvIGZpdCBpbnRvIHRoZSBiaXRzCi0JICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgbnVtYmVyLiAgUm91bmQgb2ZmIGFueSBiaXRzIHRoYXQgd2lsbCBiZQotCSAgICAgICBkaXNjYXJkZWQgYXMgYSByZXN1bHQgb2YgZGVub3JtYWxpemF0aW9uLiAgRWRnZSBjYXNlIGlzCi0JICAgICAgIHRoZSBpbXBsaWNpdCBiaXQgc2hpZnRlZCB0byBHVUFSRDAgYW5kIHRoZW4gcm91bmRlZAotCSAgICAgICB1cC4gKi8KLQkgICAgaW50IHNoaWZ0ID0gTk9STUFMX0VYUE1JTiAtIGYtPm5vcm1hbF9leHA7Ci0JICAgIGlmIChzaGlmdCArIE5SX0dVQVJEUyA8PSBOUl9GUkFDX0dVQVJEICsgMQotCQkmJiAhKGRlbm9ybSAmIHNpbV9mcHVfZGVub3JtX3plcm8pKQotCSAgICAgIHsKLQkJc3RhdHVzID0gZG9fbm9ybWFsX3JvdW5kIChmLCBzaGlmdCArIE5SX0dVQVJEUywgcm91bmQpOwotCQlpZiAoZi0+ZnJhY3Rpb24gPT0gMCkgLyogcm91bmRpbmcgdW5kZXJmbG93ZWQgKi8KLQkJICB7Ci0JCSAgICBzdGF0dXMgfD0gZG9fbm9ybWFsX3VuZGVyZmxvdyAoZiwgaXNfZG91YmxlLCByb3VuZCk7Ci0JCSAgfQotCQllbHNlIGlmIChmLT5ub3JtYWxfZXhwIDwgTk9STUFMX0VYUE1JTikgLyogc3RpbGwgdW5kZXJmbG93PyAqLwotCQkgIHsKLQkJICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19kZW5vcm07Ci0JCSAgICAvKiBBbnkgbG9zcyBvZiBwcmVjaXNpb24gd2hlbiBkZW5vcm1hbGl6aW5nIGlzCi0JCSAgICAgICB1bmRlcmZsb3cuIFNvbWUgcHJvY2Vzc29ycyBjaGVjayBmb3IgdW5kZXJmbG93Ci0JCSAgICAgICBiZWZvcmUgcm91bmRpbmcsIHNvbWUgYWZ0ZXIhICovCi0JCSAgICBpZiAoc3RhdHVzICYgc2ltX2ZwdV9zdGF0dXNfaW5leGFjdCkKLQkJICAgICAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdzsKLQkJICAgIC8qIEZsYWcgdGhhdCByZXN1bHRhbnQgdmFsdWUgaGFzIGJlZW4gZGVub3JtYWxpemVkICovCi0JCSAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfZGVub3JtOwotCQkgIH0KLQkJZWxzZSBpZiAoKGRlbm9ybSAmIHNpbV9mcHVfZGVub3JtX3VuZGVyZmxvd19pbmV4YWN0KSkKLQkJICB7Ci0JCSAgICBpZiAoKHN0YXR1cyAmIHNpbV9mcHVfc3RhdHVzX2luZXhhY3QpKQotCQkgICAgICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfdW5kZXJmbG93OwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0YXR1cyA9IGRvX25vcm1hbF91bmRlcmZsb3cgKGYsIGlzX2RvdWJsZSwgcm91bmQpOwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChmLT5ub3JtYWxfZXhwID4gTk9STUFMX0VYUE1BWCkKLQkgIHsKLQkgICAgLyogSW5maW5pdHkgKi8KLQkgICAgc3RhdHVzID0gZG9fbm9ybWFsX292ZXJmbG93IChmLCBpc19kb3VibGUsIHJvdW5kKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHN0YXR1cyA9IGRvX25vcm1hbF9yb3VuZCAoZiwgTlJfR1VBUkRTLCByb3VuZCk7Ci0JICAgIGlmIChmLT5mcmFjdGlvbiA9PSAwKQotCSAgICAgIC8qIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOyAqLwotCSAgICAgIHN0YXR1cyB8PSBkb19ub3JtYWxfdW5kZXJmbG93IChmLCBpc19kb3VibGUsIHJvdW5kKTsKLQkgICAgZWxzZSBpZiAoZi0+bm9ybWFsX2V4cCA+IE5PUk1BTF9FWFBNQVgpCi0JICAgICAgLyogb29wcyEgcm91bmRpbmcgY2F1c2VkIG92ZXJmbG93ICovCi0JICAgICAgc3RhdHVzIHw9IGRvX25vcm1hbF9vdmVyZmxvdyAoZiwgaXNfZG91YmxlLCByb3VuZCk7Ci0JICB9Ci0JQVNTRVJUICgoZi0+Y2xhc3MgPT0gc2ltX2ZwdV9jbGFzc19udW1iZXIKLQkJIHx8IGYtPmNsYXNzID09IHNpbV9mcHVfY2xhc3NfZGVub3JtKQotCQk8PSAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8yICYmIGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzEpKTsKLQlyZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X3JvdW5kXzMyIChzaW1fZnB1ICpmLAotCQkgIHNpbV9mcHVfcm91bmQgcm91bmQsCi0JCSAgc2ltX2ZwdV9kZW5vcm0gZGVub3JtKQotewotICByZXR1cm4gZG9fcm91bmQgKGYsIDAsIHJvdW5kLCBkZW5vcm0pOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9yb3VuZF82NCAoc2ltX2ZwdSAqZiwKLQkJICBzaW1fZnB1X3JvdW5kIHJvdW5kLAotCQkgIHNpbV9mcHVfZGVub3JtIGRlbm9ybSkKLXsKLSAgcmV0dXJuIGRvX3JvdW5kIChmLCAxLCByb3VuZCwgZGVub3JtKTsKLX0KLQotCi0KLS8qIEFyaXRobWV0aWMgb3BzICovCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2FkZCAoc2ltX2ZwdSAqZiwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgICBjb25zdCBzaW1fZnB1ICpyKQotewotICBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSkKLSAgICB7Ci0gICAgICAqZiA9ICpsOwotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKGwpKQotICAgIHsKLSAgICAgICpmID0gKmw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChsKSkKLSAgICB7Ci0gICAgICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikKLQkgICYmIGwtPnNpZ24gIT0gci0+c2lnbikKLQl7Ci0JICAqZiA9IHNpbV9mcHVfcW5hbjsKLQkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lzaTsKLQl9Ci0gICAgICAqZiA9ICpsOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfemVybyAobCkpCi0gICAgewotICAgICAgaWYgKHNpbV9mcHVfaXNfemVybyAocikpCi0JewotCSAgKmYgPSBzaW1fZnB1X3plcm87Ci0JICBmLT5zaWduID0gbC0+c2lnbiAmIHItPnNpZ247Ci0JfQotICAgICAgZWxzZQotCSpmID0gKnI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQotICAgIHsKLSAgICAgICpmID0gKmw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHsKLSAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQgc2hpZnQgPSBsLT5ub3JtYWxfZXhwIC0gci0+bm9ybWFsX2V4cDsKLSAgICB1bnNpZ25lZDY0IGxmcmFjdGlvbjsKLSAgICB1bnNpZ25lZDY0IHJmcmFjdGlvbjsKLSAgICAvKiB1c2UgZXhwIG9mIGxhcmdlciAqLwotICAgIGlmIChzaGlmdCA+PSBOUl9GUkFDX0dVQVJEKQotICAgICAgewotCS8qIGxlZnQgaGFzIG11Y2ggYmlnZ2VyIG1hZ25pdHV0ZSAqLwotCSpmID0gKmw7Ci0JcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0gICAgICB9Ci0gICAgaWYgKHNoaWZ0IDw9IC0gTlJfRlJBQ19HVUFSRCkKLSAgICAgIHsKLQkvKiByaWdodCBoYXMgbXVjaCBiaWdnZXIgbWFnbml0dXRlICovCi0JKmYgPSAqcjsKLQlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKLSAgICAgIH0KLSAgICBsZnJhY3Rpb24gPSBsLT5mcmFjdGlvbjsKLSAgICByZnJhY3Rpb24gPSByLT5mcmFjdGlvbjsKLSAgICBpZiAoc2hpZnQgPiAwKQotICAgICAgewotCWYtPm5vcm1hbF9leHAgPSBsLT5ub3JtYWxfZXhwOwotCWlmIChyZnJhY3Rpb24gJiBMU01BU0s2NCAoc2hpZnQgLSAxLCAwKSkKLQkgIHsKLQkgICAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0JICAgIHJmcmFjdGlvbiB8PSBMU0JJVDY0IChzaGlmdCk7IC8qIHN0aWNrIExTQml0ICovCi0JICB9Ci0JcmZyYWN0aW9uID4+PSBzaGlmdDsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChzaGlmdCA8IDApCi0gICAgICB7Ci0JZi0+bm9ybWFsX2V4cCA9IHItPm5vcm1hbF9leHA7Ci0JaWYgKGxmcmFjdGlvbiAmIExTTUFTSzY0ICgtIHNoaWZ0IC0gMSwgMCkpCi0JICB7Ci0JICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotCSAgICBsZnJhY3Rpb24gfD0gTFNCSVQ2NCAoLSBzaGlmdCk7IC8qIHN0aWNrIExTQml0ICovCi0JICB9Ci0JbGZyYWN0aW9uID4+PSAtc2hpZnQ7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWYtPm5vcm1hbF9leHAgPSByLT5ub3JtYWxfZXhwOwotICAgICAgfQotCi0gICAgLyogcGVyZm9ybSB0aGUgYWRkaXRpb24gKi8KLSAgICBpZiAobC0+c2lnbikKLSAgICAgIGxmcmFjdGlvbiA9IC0gbGZyYWN0aW9uOwotICAgIGlmIChyLT5zaWduKQotICAgICAgcmZyYWN0aW9uID0gLSByZnJhY3Rpb247Ci0gICAgZi0+ZnJhY3Rpb24gPSBsZnJhY3Rpb24gKyByZnJhY3Rpb247Ci0KLSAgICAvKiB6ZXJvPyAqLwotICAgIGlmIChmLT5mcmFjdGlvbiA9PSAwKQotICAgICAgewotCSpmID0gc2ltX2ZwdV96ZXJvOwotCXJldHVybiAwOwotICAgICAgfQotCi0gICAgLyogc2lnbj8gKi8KLSAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfbnVtYmVyOwotICAgIGlmICgoc2lnbmVkNjQpIGYtPmZyYWN0aW9uID49IDApCi0gICAgICBmLT5zaWduID0gMDsKLSAgICBlbHNlCi0gICAgICB7Ci0JZi0+c2lnbiA9IDE7Ci0JZi0+ZnJhY3Rpb24gPSAtIGYtPmZyYWN0aW9uOwotICAgICAgfQotCi0gICAgLyogbm9ybWFsaXplIGl0ICovCi0gICAgaWYgKChmLT5mcmFjdGlvbiAmIElNUExJQ0lUXzIpKQotICAgICAgewotCWYtPmZyYWN0aW9uID0gKGYtPmZyYWN0aW9uID4+IDEpIHwgKGYtPmZyYWN0aW9uICYgMSk7Ci0JZi0+bm9ybWFsX2V4cCArKzsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzEpCi0gICAgICB7Ci0JZG8KLQkgIHsKLQkgICAgZi0+ZnJhY3Rpb24gPDw9IDE7Ci0JICAgIGYtPm5vcm1hbF9leHAgLS07Ci0JICB9Ci0Jd2hpbGUgKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMSk7Ci0gICAgICB9Ci0gICAgQVNTRVJUIChmLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xICYmIGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X3N1YiAoc2ltX2ZwdSAqZiwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgICBjb25zdCBzaW1fZnB1ICpyKQotewotICBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSkKLSAgICB7Ci0gICAgICAqZiA9ICpsOwotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKGwpKQotICAgIHsKLSAgICAgICpmID0gKmw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChsKSkKLSAgICB7Ci0gICAgICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikKLQkgICYmIGwtPnNpZ24gPT0gci0+c2lnbikKLQl7Ci0JICAqZiA9IHNpbV9mcHVfcW5hbjsKLQkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lzaTsKLQl9Ci0gICAgICAqZiA9ICpsOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIGYtPnNpZ24gPSAhci0+c2lnbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfemVybyAobCkpCi0gICAgewotICAgICAgaWYgKHNpbV9mcHVfaXNfemVybyAocikpCi0JewotCSAgKmYgPSBzaW1fZnB1X3plcm87Ci0JICBmLT5zaWduID0gbC0+c2lnbiAmICFyLT5zaWduOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqZiA9ICpyOwotCSAgZi0+c2lnbiA9ICFyLT5zaWduOwotCX0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfemVybyAocikpCi0gICAgewotICAgICAgKmYgPSAqbDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgewotICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludCBzaGlmdCA9IGwtPm5vcm1hbF9leHAgLSByLT5ub3JtYWxfZXhwOwotICAgIHVuc2lnbmVkNjQgbGZyYWN0aW9uOwotICAgIHVuc2lnbmVkNjQgcmZyYWN0aW9uOwotICAgIC8qIHVzZSBleHAgb2YgbGFyZ2VyICovCi0gICAgaWYgKHNoaWZ0ID49IE5SX0ZSQUNfR1VBUkQpCi0gICAgICB7Ci0JLyogbGVmdCBoYXMgbXVjaCBiaWdnZXIgbWFnbml0dXRlICovCi0JKmYgPSAqbDsKLQlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKLSAgICAgIH0KLSAgICBpZiAoc2hpZnQgPD0gLSBOUl9GUkFDX0dVQVJEKQotICAgICAgewotCS8qIHJpZ2h0IGhhcyBtdWNoIGJpZ2dlciBtYWduaXR1dGUgKi8KLQkqZiA9ICpyOwotCWYtPnNpZ24gPSAhci0+c2lnbjsKLQlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKLSAgICAgIH0KLSAgICBsZnJhY3Rpb24gPSBsLT5mcmFjdGlvbjsKLSAgICByZnJhY3Rpb24gPSByLT5mcmFjdGlvbjsKLSAgICBpZiAoc2hpZnQgPiAwKQotICAgICAgewotCWYtPm5vcm1hbF9leHAgPSBsLT5ub3JtYWxfZXhwOwotCWlmIChyZnJhY3Rpb24gJiBMU01BU0s2NCAoc2hpZnQgLSAxLCAwKSkKLQkgIHsKLQkgICAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0JICAgIHJmcmFjdGlvbiB8PSBMU0JJVDY0IChzaGlmdCk7IC8qIHN0aWNrIExTQml0ICovCi0JICB9Ci0JcmZyYWN0aW9uID4+PSBzaGlmdDsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChzaGlmdCA8IDApCi0gICAgICB7Ci0JZi0+bm9ybWFsX2V4cCA9IHItPm5vcm1hbF9leHA7Ci0JaWYgKGxmcmFjdGlvbiAmIExTTUFTSzY0ICgtIHNoaWZ0IC0gMSwgMCkpCi0JICB7Ci0JICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotCSAgICBsZnJhY3Rpb24gfD0gTFNCSVQ2NCAoLSBzaGlmdCk7IC8qIHN0aWNrIExTQml0ICovCi0JICB9Ci0JbGZyYWN0aW9uID4+PSAtc2hpZnQ7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWYtPm5vcm1hbF9leHAgPSByLT5ub3JtYWxfZXhwOwotICAgICAgfQotCi0gICAgLyogcGVyZm9ybSB0aGUgc3VidHJhY3Rpb24gKi8KLSAgICBpZiAobC0+c2lnbikKLSAgICAgIGxmcmFjdGlvbiA9IC0gbGZyYWN0aW9uOwotICAgIGlmICghci0+c2lnbikKLSAgICAgIHJmcmFjdGlvbiA9IC0gcmZyYWN0aW9uOwotICAgIGYtPmZyYWN0aW9uID0gbGZyYWN0aW9uICsgcmZyYWN0aW9uOwotCi0gICAgLyogemVybz8gKi8KLSAgICBpZiAoZi0+ZnJhY3Rpb24gPT0gMCkKLSAgICAgIHsKLQkqZiA9IHNpbV9mcHVfemVybzsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLQotICAgIC8qIHNpZ24/ICovCi0gICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKLSAgICBpZiAoKHNpZ25lZDY0KSBmLT5mcmFjdGlvbiA+PSAwKQotICAgICAgZi0+c2lnbiA9IDA7Ci0gICAgZWxzZQotICAgICAgewotCWYtPnNpZ24gPSAxOwotCWYtPmZyYWN0aW9uID0gLSBmLT5mcmFjdGlvbjsKLSAgICAgIH0KLQotICAgIC8qIG5vcm1hbGl6ZSBpdCAqLwotICAgIGlmICgoZi0+ZnJhY3Rpb24gJiBJTVBMSUNJVF8yKSkKLSAgICAgIHsKLQlmLT5mcmFjdGlvbiA9IChmLT5mcmFjdGlvbiA+PiAxKSB8IChmLT5mcmFjdGlvbiAmIDEpOwotCWYtPm5vcm1hbF9leHAgKys7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8xKQotICAgICAgewotCWRvCi0JICB7Ci0JICAgIGYtPmZyYWN0aW9uIDw8PSAxOwotCSAgICBmLT5ub3JtYWxfZXhwIC0tOwotCSAgfQotCXdoaWxlIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzEpOwotICAgICAgfQotICAgIEFTU0VSVCAoZi0+ZnJhY3Rpb24gPj0gSU1QTElDSVRfMSAmJiBmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KLQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9tdWwgKHNpbV9mcHUgKmYsCi0JICAgICBjb25zdCBzaW1fZnB1ICpsLAotCSAgICAgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkpCi0gICAgewotICAgICAgKmYgPSAqbDsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChsKSkKLSAgICB7Ci0gICAgICAqZiA9ICpsOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKLSAgICB7Ci0gICAgICAqZiA9ICpyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAobCkpCi0gICAgewotICAgICAgaWYgKHNpbV9mcHVfaXNfemVybyAocikpCi0JewotCSAgKmYgPSBzaW1fZnB1X3FuYW47Ci0JICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pbXo7Ci0JfQotICAgICAgKmYgPSAqbDsKLSAgICAgIGYtPnNpZ24gPSBsLT5zaWduIF4gci0+c2lnbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpKQotICAgIHsKLSAgICAgIGlmIChzaW1fZnB1X2lzX3plcm8gKGwpKQotCXsKLQkgICpmID0gc2ltX2ZwdV9xbmFuOwotCSAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16OwotCX0KLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKGwpIHx8IHNpbV9mcHVfaXNfemVybyAocikpCi0gICAgewotICAgICAgKmYgPSBzaW1fZnB1X3plcm87Ci0gICAgICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qIENhbGN1bGF0ZSB0aGUgbWFudGlzc2EgYnkgbXVsdGlwbHlpbmcgYm90aCA2NGJpdCBudW1iZXJzIHRvIGdldCBhCi0gICAgIDEyOCBiaXQgbnVtYmVyICovCi0gIHsKLSAgICB1bnNpZ25lZDY0IGxvdzsKLSAgICB1bnNpZ25lZDY0IGhpZ2g7Ci0gICAgdW5zaWduZWQ2NCBubCA9IGwtPmZyYWN0aW9uICYgMHhmZmZmZmZmZjsKLSAgICB1bnNpZ25lZDY0IG5oID0gbC0+ZnJhY3Rpb24gPj4gMzI7Ci0gICAgdW5zaWduZWQ2NCBtbCA9IHItPmZyYWN0aW9uICYgMHhmZmZmZmZmZjsKLSAgICB1bnNpZ25lZDY0IG1oID0gci0+ZnJhY3Rpb24gPj4zMjsKLSAgICB1bnNpZ25lZDY0IHBwX2xsID0gbWwgKiBubDsKLSAgICB1bnNpZ25lZDY0IHBwX2hsID0gbWggKiBubDsKLSAgICB1bnNpZ25lZDY0IHBwX2xoID0gbWwgKiBuaDsKLSAgICB1bnNpZ25lZDY0IHBwX2hoID0gbWggKiBuaDsKLSAgICB1bnNpZ25lZDY0IHJlczIgPSAwOwotICAgIHVuc2lnbmVkNjQgcmVzMCA9IDA7Ci0gICAgdW5zaWduZWQ2NCBwc19oaF9fID0gcHBfaGwgKyBwcF9saDsKLSAgICBpZiAocHNfaGhfXyA8IHBwX2hsKQotICAgICAgcmVzMiArPSBVTlNJR05FRDY0ICgweDEwMDAwMDAwMCk7Ci0gICAgcHBfaGwgPSAocHNfaGhfXyA8PCAzMikgJiBVTlNJR05FRDY0ICgweGZmZmZmZmZmMDAwMDAwMDApOwotICAgIHJlczAgPSBwcF9sbCArIHBwX2hsOwotICAgIGlmIChyZXMwIDwgcHBfbGwpCi0gICAgICByZXMyKys7Ci0gICAgcmVzMiArPSAoKHBzX2hoX18gPj4gMzIpICYgMHhmZmZmZmZmZikgKyBwcF9oaDsKLSAgICBoaWdoID0gcmVzMjsKLSAgICBsb3cgPSByZXMwOwotICAgIAotICAgIGYtPm5vcm1hbF9leHAgPSBsLT5ub3JtYWxfZXhwICsgci0+bm9ybWFsX2V4cDsKLSAgICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247Ci0gICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKLQotICAgIC8qIElucHV0IGlzIGJvdW5kZWQgYnkgWzEsMikgICA7ICAgWzJeNjAsMl42MSkKLSAgICAgICBPdXRwdXQgaXMgYm91bmRlZCBieSBbMSw0KSAgOyAgIFsyXjEyMCwyXjEyMikgKi8KLSAKLSAgICAvKiBBZGp1c3QgdGhlIGV4cG9uZW50IGFjY29yZGluZyB0byB3aGVyZSB0aGUgZGVjaW1hbCBwb2ludCBlbmRlZAotICAgICAgIHVwIGluIHRoZSBoaWdoIDY0IGJpdCB3b3JkLiAgSW4gdGhlIHNvdXJjZSB0aGUgZGVjaW1hbCBwb2ludAotICAgICAgIHdhcyBhdCBOUl9GUkFDX0dVQVJELiAqLwotICAgIGYtPm5vcm1hbF9leHAgKz0gTlJfRlJBQ19HVUFSRCArIDY0IC0gKE5SX0ZSQUNfR1VBUkQgKiAyKTsKLQotICAgIC8qIFRoZSBoaWdoIHdvcmQgaXMgYm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlLiAgQ29uc2VxdWVudGx5Ci0gICAgICAgaXQgaGFzIG5ldmVyIG92ZXJmbG93ZWQgaW50byBJTVBMSUNJVF8yLiAqLwotICAgIEFTU0VSVCAoaGlnaCA8IExTQklUNjQgKCgoTlJfRlJBQ19HVUFSRCArIDEpICogMikgLSA2NCkpOwotICAgIEFTU0VSVCAoaGlnaCA+PSBMU0JJVDY0ICgoTlJfRlJBQ19HVUFSRCAqIDIpIC0gNjQpKTsKLSAgICBBU1NFUlQgKExTQklUNjQgKCgoTlJfRlJBQ19HVUFSRCArIDEpICogMikgLSA2NCkgPCBJTVBMSUNJVF8xKTsKLQotI2lmIDAKLSAgICBwcmludGYgKCJcbiIpOwotICAgIHByaW50X2JpdHMgKGhpZ2gsIDYzLCAoc2ltX2ZwdV9wcmludF9mdW5jKilmcHJpbnRmLCBzdGRvdXQpOwotICAgIHByaW50ZiAoIjsiKTsKLSAgICBwcmludF9iaXRzIChsb3csIDYzLCAoc2ltX2ZwdV9wcmludF9mdW5jKilmcHJpbnRmLCBzdGRvdXQpOwotICAgIHByaW50ZiAoIlxuIik7Ci0jZW5kaWYKLQotICAgIC8qIG5vcm1hbGl6ZSAqLwotICAgIGRvCi0gICAgICB7Ci0JZi0+bm9ybWFsX2V4cC0tOwotCWhpZ2ggPDw9IDE7Ci0JaWYgKGxvdyAmIExTQklUNjQgKDYzKSkKLQkgIGhpZ2ggfD0gMTsKLQlsb3cgPDw9IDE7Ci0gICAgICB9Ci0gICAgd2hpbGUgKGhpZ2ggPCBJTVBMSUNJVF8xKTsKLQotI2lmIDAKLSAgICBwcmludF9iaXRzIChoaWdoLCA2MywgKHNpbV9mcHVfcHJpbnRfZnVuYyopZnByaW50Ziwgc3Rkb3V0KTsKLSAgICBwcmludGYgKCI7Iik7Ci0gICAgcHJpbnRfYml0cyAobG93LCA2MywgKHNpbV9mcHVfcHJpbnRfZnVuYyopZnByaW50Ziwgc3Rkb3V0KTsKLSAgICBwcmludGYgKCJcbiIpOwotI2VuZGlmCi0KLSAgICBBU1NFUlQgKGhpZ2ggPj0gSU1QTElDSVRfMSAmJiBoaWdoIDwgSU1QTElDSVRfMik7Ci0gICAgaWYgKGxvdyAhPSAwKQotICAgICAgewotCWYtPmZyYWN0aW9uID0gKGhpZ2ggfCAxKTsgLyogc3RpY2t5ICovCi0JcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWYtPmZyYWN0aW9uID0gaGlnaDsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9kaXYgKHNpbV9mcHUgKmYsCi0JICAgICBjb25zdCBzaW1fZnB1ICpsLAotCSAgICAgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkpCi0gICAgewotICAgICAgKmYgPSAqbDsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChsKSkKLSAgICB7Ci0gICAgICAqZiA9ICpsOwotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKGwpKQotICAgIHsKLSAgICAgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKLQl7Ci0JICAqZiA9IHNpbV9mcHVfcW5hbjsKLQkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lkaTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmYgPSAqbDsKLQkgIGYtPnNpZ24gPSBsLT5zaWduIF4gci0+c2lnbjsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKGwpKQotICAgIHsKLSAgICAgIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQotCXsKLQkgICpmID0gc2ltX2ZwdV9xbmFuOwotCSAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfemR6OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqZiA9ICpsOwotCSAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpKQotICAgIHsKLSAgICAgICpmID0gc2ltX2ZwdV96ZXJvOwotICAgICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc196ZXJvIChyKSkKLSAgICB7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7Ci0gICAgICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9kaXYwOwotICAgIH0KLQotICAvKiBDYWxjdWxhdGUgdGhlIG1hbnRpc3NhIGJ5IG11bHRpcGx5aW5nIGJvdGggNjRiaXQgbnVtYmVycyB0byBnZXQgYQotICAgICAxMjggYml0IG51bWJlciAqLwotICB7Ci0gICAgLyogcXVvdGllbnQgPSAgKCAoIG51bWVyYXRvciAvIGRlbm9taW5hdG9yKQotICAgICAgICAgICAgICAgICAgICAgIHggMl4obnVtZXJhdG9yIGV4cG9uZW50IC0gIGRlbm9taW5hdG9yIGV4cG9uZW50KQotICAgICAqLwotICAgIHVuc2lnbmVkNjQgbnVtZXJhdG9yOwotICAgIHVuc2lnbmVkNjQgZGVub21pbmF0b3I7Ci0gICAgdW5zaWduZWQ2NCBxdW90aWVudDsKLSAgICB1bnNpZ25lZDY0IGJpdDsKLQotICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7Ci0gICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOwotICAgIGYtPm5vcm1hbF9leHAgPSBsLT5ub3JtYWxfZXhwIC0gci0+bm9ybWFsX2V4cDsKLQotICAgIG51bWVyYXRvciA9IGwtPmZyYWN0aW9uOwotICAgIGRlbm9taW5hdG9yID0gci0+ZnJhY3Rpb247Ci0KLSAgICAvKiBGcmFjdGlvbiB3aWxsIGJlIGxlc3MgdGhhbiAxLjAgKi8KLSAgICBpZiAobnVtZXJhdG9yIDwgZGVub21pbmF0b3IpCi0gICAgICB7Ci0JbnVtZXJhdG9yIDw8PSAxOwotCWYtPm5vcm1hbF9leHAtLTsKLSAgICAgIH0KLSAgICBBU1NFUlQgKG51bWVyYXRvciA+PSBkZW5vbWluYXRvcik7Ci0gICAgCi0gICAgLyogR2FpbiBleHRyYSBwcmVjaXNpb24sIGFscmVhZHkgdXNlZCBvbmUgc3BhcmUgYml0ICovCi0gICAgbnVtZXJhdG9yIDw8PSAgICBOUl9TUEFSRTsKLSAgICBkZW5vbWluYXRvciA8PD0gIE5SX1NQQVJFOwotCi0gICAgLyogRG9lcyBkaXZpZGUgb25lIGJpdCBhdCBhIHRpbWUuICBPcHRpbWl6ZT8/PyAgKi8KLSAgICBxdW90aWVudCA9IDA7Ci0gICAgYml0ID0gKElNUExJQ0lUXzEgPDwgTlJfU1BBUkUpOwotICAgIHdoaWxlIChiaXQpCi0gICAgICB7Ci0JaWYgKG51bWVyYXRvciA+PSBkZW5vbWluYXRvcikKLQkgIHsKLQkgICAgcXVvdGllbnQgfD0gYml0OwotCSAgICBudW1lcmF0b3IgLT0gZGVub21pbmF0b3I7Ci0JICB9Ci0JYml0ID4+PSAxOwotCW51bWVyYXRvciA8PD0gMTsKLSAgICAgIH0KLQotI2lmIDAKLSAgICBwcmludGYgKCJcbiIpOwotICAgIHByaW50X2JpdHMgKHF1b3RpZW50LCA2MywgKHNpbV9mcHVfcHJpbnRfZnVuYyopZnByaW50Ziwgc3Rkb3V0KTsKLSAgICBwcmludGYgKCJcbiIpOwotICAgIHByaW50X2JpdHMgKG51bWVyYXRvciwgNjMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKWZwcmludGYsIHN0ZG91dCk7Ci0gICAgcHJpbnRmICgiXG4iKTsKLSAgICBwcmludF9iaXRzIChkZW5vbWluYXRvciwgNjMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKWZwcmludGYsIHN0ZG91dCk7Ci0gICAgcHJpbnRmICgiXG4iKTsKLSNlbmRpZgotCi0gICAgLyogZGlzY2FyZCAoYnV0IHNhdmUpIHRoZSBleHRyYSBiaXRzICovCi0gICAgaWYgKChxdW90aWVudCAmIExTTUFTSzY0IChOUl9TUEFSRSAtMSwgMCkpKQotICAgICAgcXVvdGllbnQgPSAocXVvdGllbnQgPj4gTlJfU1BBUkUpIHwgMTsKLSAgICBlbHNlCi0gICAgICBxdW90aWVudCA9IChxdW90aWVudCA+PiBOUl9TUEFSRSk7Ci0KLSAgICBmLT5mcmFjdGlvbiA9IHF1b3RpZW50OwotICAgIEFTU0VSVCAoZi0+ZnJhY3Rpb24gPj0gSU1QTElDSVRfMSAmJiBmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOwotICAgIGlmIChudW1lcmF0b3IgIT0gMCkKLSAgICAgIHsKLQlmLT5mcmFjdGlvbiB8PSAxOyAvKiBzdGljayByZW1haW5pbmcgYml0cyAqLwotCXJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfbWF4IChzaW1fZnB1ICpmLAotCSAgICAgY29uc3Qgc2ltX2ZwdSAqbCwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKGwpKQotICAgIHsKLSAgICAgICpmID0gKmw7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKLSAgICB7Ci0gICAgICAqZiA9ICpyOwotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfcW5hbiAobCkpCi0gICAgewotICAgICAgKmYgPSAqbDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKGwpKQotICAgIHsKLSAgICAgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKQotCSAgJiYgbC0+c2lnbiA9PSByLT5zaWduKQotCXsKLQkgICpmID0gc2ltX2ZwdV9xbmFuOwotCSAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpOwotCX0KLSAgICAgIGlmIChsLT5zaWduKQotCSpmID0gKnI7IC8qIC1pbmYgPCBhbnl0aGluZyAqLwotICAgICAgZWxzZQotCSpmID0gKmw7IC8qICtpbmYgPiBhbnRoaW5nICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKLSAgICB7Ci0gICAgICBpZiAoci0+c2lnbikKLQkqZiA9ICpsOyAvKiBhbnl0aGluZyA+IC1pbmYgKi8KLSAgICAgIGVsc2UKLQkqZiA9ICpyOyAvKiBhbnRoaW5nIDwgK2luZiAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAobC0+c2lnbiA+IHItPnNpZ24pCi0gICAgewotICAgICAgKmYgPSAqcjsgLyogLXZlIDwgK3ZlICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChsLT5zaWduIDwgci0+c2lnbikKLSAgICB7Ci0gICAgICAqZiA9ICpsOyAvKiArdmUgPiAtdmUgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgQVNTRVJUIChsLT5zaWduID09IHItPnNpZ24pOwotICBpZiAobC0+bm9ybWFsX2V4cCA+IHItPm5vcm1hbF9leHAKLSAgICAgIHx8IChsLT5ub3JtYWxfZXhwID09IHItPm5vcm1hbF9leHAgJiYgCi0JICBsLT5mcmFjdGlvbiA+IHItPmZyYWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiB8bHwgPiB8cnwgKi8KLSAgICAgIGlmIChsLT5zaWduKQotCSpmID0gKnI7IC8qIC12ZSA8IC12ZSAqLwotICAgICAgZWxzZQotCSpmID0gKmw7IC8qICt2ZSA+ICt2ZSAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogfGx8IDw9IHxyfCAqLwotICAgICAgaWYgKGwtPnNpZ24pCi0JKmYgPSAqbDsgLyogLXZlID4gLXZlICovCi0gICAgICBlbHNlCi0JKmYgPSAqcjsgLyogK3ZlIDwgK3ZlICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfbWluIChzaW1fZnB1ICpmLAotCSAgICAgY29uc3Qgc2ltX2ZwdSAqbCwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKGwpKQotICAgIHsKLSAgICAgICpmID0gKmw7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKLSAgICB7Ci0gICAgICAqZiA9ICpyOwotICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfcW5hbiAobCkpCi0gICAgewotICAgICAgKmYgPSAqbDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKGwpKQotICAgIHsKLSAgICAgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKQotCSAgJiYgbC0+c2lnbiA9PSByLT5zaWduKQotCXsKLQkgICpmID0gc2ltX2ZwdV9xbmFuOwotCSAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpOwotCX0KLSAgICAgIGlmIChsLT5zaWduKQotCSpmID0gKmw7IC8qIC1pbmYgPCBhbnl0aGluZyAqLwotICAgICAgZWxzZQotCSpmID0gKnI7IC8qICtpbmYgPiBhbnRoaW5nICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKLSAgICB7Ci0gICAgICBpZiAoci0+c2lnbikKLQkqZiA9ICpyOyAvKiBhbnl0aGluZyA+IC1pbmYgKi8KLSAgICAgIGVsc2UKLQkqZiA9ICpsOyAvKiBhbnl0aGluZyA8ICtpbmYgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGwtPnNpZ24gPiByLT5zaWduKQotICAgIHsKLSAgICAgICpmID0gKmw7IC8qIC12ZSA8ICt2ZSAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAobC0+c2lnbiA8IHItPnNpZ24pCi0gICAgewotICAgICAgKmYgPSAqcjsgLyogK3ZlID4gLXZlICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIEFTU0VSVCAobC0+c2lnbiA9PSByLT5zaWduKTsKLSAgaWYgKGwtPm5vcm1hbF9leHAgPiByLT5ub3JtYWxfZXhwCi0gICAgICB8fCAobC0+bm9ybWFsX2V4cCA9PSByLT5ub3JtYWxfZXhwICYmIAotCSAgbC0+ZnJhY3Rpb24gPiByLT5mcmFjdGlvbikpCi0gICAgewotICAgICAgLyogfGx8ID4gfHJ8ICovCi0gICAgICBpZiAobC0+c2lnbikKLQkqZiA9ICpsOyAvKiAtdmUgPCAtdmUgKi8KLSAgICAgIGVsc2UKLQkqZiA9ICpyOyAvKiArdmUgPiArdmUgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHxsfCA8PSB8cnwgKi8KLSAgICAgIGlmIChsLT5zaWduKQotCSpmID0gKnI7IC8qIC12ZSA+IC12ZSAqLwotICAgICAgZWxzZQotCSpmID0gKmw7IC8qICt2ZSA8ICt2ZSAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X25lZyAoc2ltX2ZwdSAqZiwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKLSAgICB7Ci0gICAgICAqZiA9ICpyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAqZiA9ICpyOwotICBmLT5zaWduID0gIXItPnNpZ247Ci0gIHJldHVybiAwOwotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2FicyAoc2ltX2ZwdSAqZiwKLQkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKLSAgICB7Ci0gICAgICAqZiA9ICpyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAqZiA9ICpyOwotICBmLT5zaWduID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfaW52IChzaW1fZnB1ICpmLAotCSAgICAgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCi0gICAgewotICAgICAgKmYgPSAqcjsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQotICAgIHsKLSAgICAgICpmID0gKnI7Ci0gICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpKQotICAgIHsKLSAgICAgICpmID0gc2ltX2ZwdV96ZXJvOwotICAgICAgZi0+c2lnbiA9IHItPnNpZ247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQotICAgIHsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19pbmZpbml0eTsKLSAgICAgIGYtPnNpZ24gPSByLT5zaWduOwotICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfZGl2MDsKLSAgICB9Ci0gICpmID0gKnI7Ci0gIGYtPm5vcm1hbF9leHAgPSAtIHItPm5vcm1hbF9leHA7Ci0gIHJldHVybiAwOwotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X3NxcnQgKHNpbV9mcHUgKmYsCi0JICAgICAgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCi0gICAgewotICAgICAgKmYgPSBzaW1fZnB1X3FuYW47Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCi0gICAgewotICAgICAgKmYgPSBzaW1fZnB1X3FuYW47Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQotICAgIHsKLSAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOwotICAgICAgZi0+c2lnbiA9IHItPnNpZ247Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKLSAgICB7Ci0gICAgICBpZiAoci0+c2lnbikKLQl7Ci0JICAqZiA9IHNpbV9mcHVfcW5hbjsKLQkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NxcnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19pbmZpbml0eTsKLQkgIGYtPnNpZ24gPSAwOwotCSAgZi0+c2lnbiA9IDA7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICBpZiAoci0+c2lnbikKLSAgICB7Ci0gICAgICAqZiA9IHNpbV9mcHVfcW5hbjsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NxcnQ7Ci0gICAgfQotCi0gIC8qIEAoIyllX3NxcnQuYyA1LjEgOTMvMDkvMjQgKi8KLSAgLyoKLSAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgKgotICAgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCi0gICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLSAgICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCi0gICAqIGlzIHByZXNlcnZlZC4KLSAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgKi8KLSAgCi0gIC8qIF9faWVlZTc1NF9zcXJ0KHgpCi0gICAqIFJldHVybiBjb3JyZWN0bHkgcm91bmRlZCBzcXJ0LgotICAgKiAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAqICAgICAgICAgICB8ICBVc2UgdGhlIGhhcmR3YXJlIHNxcnQgaWYgeW91IGhhdmUgb25lIHwKLSAgICogICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiBNZXRob2Q6IAotICAgKiAgIEJpdCBieSBiaXQgbWV0aG9kIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYy4gKFNsb3csIGJ1dCBwb3J0YWJsZSkgCi0gICAqICAgMS4gTm9ybWFsaXphdGlvbgotICAgKglTY2FsZSB4IHRvIHkgaW4gWzEsNCkgd2l0aCBldmVuIHBvd2VycyBvZiAyOiAKLSAgICoJZmluZCBhbiBpbnRlZ2VyIGsgc3VjaCB0aGF0ICAxIDw9ICh5PXgqMl4oMmspKSA8IDQsIHRoZW4KLSAgICoJCXNxcnQoeCkgPSAyXmsgKiBzcXJ0KHkpCi0gICAtCi0gICAtIFNpbmNlOgotICAgLSAgIHNxcnQgKCB4KjJeKDJtKSApICAgICA9IHNxcnQoeCkuMl5tICAgIDsgbSBldmVuCi0gICAtICAgc3FydCAoIHgqMl4oMm0gKyAxKSApID0gc3FydCgyLngpLjJebSAgOyBtIG9kZAotICAgLSBEZWZpbmU6Ci0gICAtICAgeSA9ICgobSBldmVuKSA/IHggOiAyLngpCi0gICAtIFRoZW46Ci0gICAtICAgeSBpbiBbMSwgNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBbSU1QTElDSVRfMSxJTVBMSUNJVF80KQotICAgLSBBbmQ6Ci0gICAtICAgc3FydCAoeSkgaW4gWzEsIDIpICAgICAgICAgICAgICAgICAgICAgOyBbSU1QTElDSVRfMSxJTVBMSUNJVF8yKQotICAgLQotICAgKiAgIDIuIEJpdCBieSBiaXQgY29tcHV0YXRpb24KLSAgICoJTGV0IHEgID0gc3FydCh5KSB0cnVuY2F0ZWQgdG8gaSBiaXQgYWZ0ZXIgYmluYXJ5IHBvaW50IChxID0gMSksCi0gICAqCSAgICAgaQkJCQkJCQkgMAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEgICAgICAgICAyCi0gICAqCSAgICBzICA9IDIqcSAsIGFuZAl5ICA9ICAyICAgKiAoIHkgLSBxICApLgkJKDEpCi0gICAqCSAgICAgaSAgICAgIGkgICAgICAgICAgICBpICAgICAgICAgICAgICAgICBpCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICoJVG8gY29tcHV0ZSBxICAgIGZyb20gcSAsIG9uZSBjaGVja3Mgd2hldGhlciAKLSAgICoJCSAgICBpKzEgICAgICAgaSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAqCi0gICAqCQkJICAgICAgLShpKzEpIDIKLSAgICoJCQkocSArIDIgICAgICApIDw9IHkuCQkJKDIpCi0gICAqICAgICAJCQkgIGkKLSAgICoJCQkJCQkJICAgICAgLShpKzEpCi0gICAqCUlmICgyKSBpcyBmYWxzZSwgdGhlbiBxICAgPSBxIDsgb3RoZXJ3aXNlIHEgICA9IHEgICsgMiAgICAgIC4KLSAgICoJCSAJICAgICAgIGkrMSAgIGkgICAgICAgICAgICAgaSsxICAgaQotICAgKgotICAgKglXaXRoIHNvbWUgYWxnZWJyaWMgbWFuaXB1bGF0aW9uLCBpdCBpcyBub3QgZGlmZmljdWx0IHRvIHNlZQotICAgKgl0aGF0ICgyKSBpcyBlcXVpdmFsZW50IHRvIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpKzEpCi0gICAqCQkJcyAgKyAgMiAgICAgICA8PSB5CQkJKDMpCi0gICAqCQkJIGkgICAgICAgICAgICAgICAgaQotICAgKgotICAgKglUaGUgYWR2YW50YWdlIG9mICgzKSBpcyB0aGF0IHMgIGFuZCB5ICBjYW4gYmUgY29tcHV0ZWQgYnkgCi0gICAqCQkJCSAgICAgIGkgICAgICBpCi0gICAqCXRoZSBmb2xsb3dpbmcgcmVjdXJyZW5jZSBmb3JtdWxhOgotICAgKgkgICAgaWYgKDMpIGlzIGZhbHNlCi0gICAqCi0gICAqCSAgICBzICAgICA9ICBzICAsCXkgICAgPSB5ICAgOwkJCSg0KQotICAgKgkgICAgIGkrMSAgICAgIGkJCSBpKzEgICAgaQotICAgKgotICAgLQotICAgLSAgICAgICAgICAgICAgICAgICAgICBOT1RFOiB5ICAgID0gMip5Ci0gICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEgICAgICBpCi0gICAtCi0gICAqCSAgICBvdGhlcndpc2UsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAtaSAgICAgICAgICAgICAgICAgICAgICAtKGkrMSkKLSAgICoJICAgIHMJICA9ICBzICArIDIgICwgIHkgICAgPSB5ICAtICBzICAtIDIgIAkJKDUpCi0gICAqICAgICAgICAgaSsxICAgICAgaSAgICAgICAgICBpKzEgICAgaSAgICAgaQotICAgKgkJCQkKLSAgIC0KLSAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKGkrMSkKLSAgIC0gICAgICAgICAgICAgICAgICAgICAgTk9URTogeSAgICA9IDIgKHkgIC0gIHMgIC0gIDIgICAgICApIAkJCi0gICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEgICAgICAgaSAgICAgaQotICAgLQotICAgKglPbmUgbWF5IGVhc2lseSB1c2UgaW5kdWN0aW9uIHRvIHByb3ZlICg0KSBhbmQgKDUpLiAKLSAgICoJTm90ZS4gU2luY2UgdGhlIGxlZnQgaGFuZCBzaWRlIG9mICgzKSBjb250YWluIG9ubHkgaSsyIGJpdHMsCi0gICAqCSAgICAgIGl0IGRvZXMgbm90IG5lY2Vzc2FyeSB0byBkbyBhIGZ1bGwgKDUzLWJpdCkgY29tcGFyaXNvbiAKLSAgICoJICAgICAgaW4gKDMpLgotICAgKiAgIDMuIEZpbmFsIHJvdW5kaW5nCi0gICAqCUFmdGVyIGdlbmVyYXRpbmcgdGhlIDUzIGJpdHMgcmVzdWx0LCB3ZSBjb21wdXRlIG9uZSBtb3JlIGJpdC4KLSAgICoJVG9nZXRoZXIgd2l0aCB0aGUgcmVtYWluZGVyLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdGhlCi0gICAqCXJlc3VsdCBpcyBleGFjdCwgYmlnZ2VyIHRoYW4gMS8ydWxwLCBvciBsZXNzIHRoYW4gMS8ydWxwCi0gICAqCShpdCB3aWxsIG5ldmVyIGVxdWFsIHRvIDEvMnVscCkuCi0gICAqCVRoZSByb3VuZGluZyBtb2RlIGNhbiBiZSBkZXRlY3RlZCBieSBjaGVja2luZyB3aGV0aGVyCi0gICAqCWh1Z2UgKyB0aW55IGlzIGVxdWFsIHRvIGh1Z2UsIGFuZCB3aGV0aGVyIGh1Z2UgLSB0aW55IGlzCi0gICAqCWVxdWFsIHRvIGh1Z2UgZm9yIHNvbWUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICJodWdlIiBhbmQgInRpbnkiLgotICAgKgkJCi0gICAqIFNwZWNpYWwgY2FzZXM6Ci0gICAqCXNxcnQoKy0wKSA9ICstMCAJLi4uIGV4YWN0Ci0gICAqCXNxcnQoaW5mKSA9IGluZgotICAgKglzcXJ0KC12ZSkgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsCi0gICAqCXNxcnQoTmFOKSA9IE5hTgkJLi4uIHdpdGggaW52YWxpZCBzaWduYWwgZm9yIHNpZ25hbGluZyBOYU4KLSAgICoKLSAgICogT3RoZXIgbWV0aG9kcyA6IHNlZSB0aGUgYXBwZW5kZWQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGJlbG93LgotICAgKi0tLS0tLS0tLS0tLS0tLQotICAgKi8KLQotICB7Ci0gICAgLyogZ2VuZXJhdGUgc3FydCh4KSBiaXQgYnkgYml0ICovCi0gICAgdW5zaWduZWQ2NCB5OwotICAgIHVuc2lnbmVkNjQgcTsKLSAgICB1bnNpZ25lZDY0IHM7Ci0gICAgdW5zaWduZWQ2NCBiOwotCi0gICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKLSAgICBmLT5zaWduID0gMDsKLSAgICB5ID0gci0+ZnJhY3Rpb247Ci0gICAgZi0+bm9ybWFsX2V4cCA9IChyLT5ub3JtYWxfZXhwID4+IDEpOwkvKiBleHAgPSBbZXhwLzJdICovCi0KLSAgICAvKiBvZGQgZXhwLCBkb3VibGUgeCB0byBtYWtlIGl0IGV2ZW4gKi8KLSAgICBBU1NFUlQgKHkgPj0gSU1QTElDSVRfMSAmJiB5IDwgSU1QTElDSVRfNCk7Ci0gICAgaWYgKChyLT5ub3JtYWxfZXhwICYgMSkpCi0gICAgICB7Ci0JeSArPSB5OwotICAgICAgfQotICAgIEFTU0VSVCAoeSA+PSBJTVBMSUNJVF8xICYmIHkgPCAoSU1QTElDSVRfMiA8PCAxKSk7Ci0KLSAgICAvKiBMZXQgbG9vcCBkZXRlcm1pbmUgZmlyc3QgdmFsdWUgb2YgcyAoZWl0aGVyIDEgb3IgMikgKi8KLSAgICBiID0gSU1QTElDSVRfMTsKLSAgICBxID0gMDsKLSAgICBzID0gMDsKLSAgICAKLSAgICB3aGlsZSAoYikKLSAgICAgIHsKLQl1bnNpZ25lZDY0IHQgPSBzICsgYjsKLQlpZiAodCA8PSB5KQotCSAgewotCSAgICBzIHw9IChiIDw8IDEpOwotCSAgICB5IC09IHQ7Ci0JICAgIHEgfD0gYjsKLQkgIH0KLQl5IDw8PSAxOwotCWIgPj49IDE7Ci0gICAgICB9Ci0KLSAgICBBU1NFUlQgKHEgPj0gSU1QTElDSVRfMSAmJiBxIDwgSU1QTElDSVRfMik7Ci0gICAgZi0+ZnJhY3Rpb24gPSBxOwotICAgIGlmICh5ICE9IDApCi0gICAgICB7Ci0JZi0+ZnJhY3Rpb24gfD0gMTsgLyogc3RpY2sgcmVtYWluaW5nIGJpdHMgKi8KLQlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0KLS8qIGludC9sb25nIDwtPiBzaW1fZnB1ICovCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2kzMnRvIChzaW1fZnB1ICpmLAotCSAgICAgICBzaWduZWQzMiBpLAotCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQotewotICBpMmZwdSAoZiwgaSwgMCk7Ci0gIHJldHVybiAwOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV91MzJ0byAoc2ltX2ZwdSAqZiwKLQkgICAgICAgdW5zaWduZWQzMiB1LAotCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQotewotICB1MmZwdSAoZiwgdSwgMCk7Ci0gIHJldHVybiAwOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pNjR0byAoc2ltX2ZwdSAqZiwKLQkgICAgICAgc2lnbmVkNjQgaSwKLQkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKLXsKLSAgaTJmcHUgKGYsIGksIDEpOwotICByZXR1cm4gMDsKLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfdTY0dG8gKHNpbV9mcHUgKmYsCi0JICAgICAgIHVuc2lnbmVkNjQgdSwKLQkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKLXsKLSAgdTJmcHUgKGYsIHUsIDEpOwotICByZXR1cm4gMDsKLX0KLQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV90bzMyaSAoc2lnbmVkMzIgKmksCi0JICAgICAgIGNvbnN0IHNpbV9mcHUgKmYsCi0JICAgICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCi17Ci0gIHNpZ25lZDY0IGk2NDsKLSAgaW50IHN0YXR1cyA9IGZwdTJpICgmaTY0LCBmLCAwLCByb3VuZCk7Ci0gICppID0gaTY0OwotICByZXR1cm4gc3RhdHVzOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV90bzMydSAodW5zaWduZWQzMiAqdSwKLQkgICAgICAgY29uc3Qgc2ltX2ZwdSAqZiwKLQkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKLXsKLSAgdW5zaWduZWQ2NCB1NjQ7Ci0gIGludCBzdGF0dXMgPSBmcHUydSAoJnU2NCwgZiwgMCk7Ci0gICp1ID0gdTY0OwotICByZXR1cm4gc3RhdHVzOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV90bzY0aSAoc2lnbmVkNjQgKmksCi0JICAgICAgIGNvbnN0IHNpbV9mcHUgKmYsCi0JICAgICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCi17Ci0gIHJldHVybiBmcHUyaSAoaSwgZiwgMSwgcm91bmQpOwotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X3RvNjR1ICh1bnNpZ25lZDY0ICp1LAotCSAgICAgICBjb25zdCBzaW1fZnB1ICpmLAotCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQotewotICByZXR1cm4gZnB1MnUgKHUsIGYsIDEpOwotfQotCi0KLQotLyogc2ltX2ZwdSAtPiBob3N0IGZvcm1hdCAqLwotCi0jaWYgMAotSU5MSU5FX1NJTV9GUFUgKGZsb2F0KQotc2ltX2ZwdV8yZiAoY29uc3Qgc2ltX2ZwdSAqZikKLXsKLSAgcmV0dXJuIGZ2YWwuZDsKLX0KLSNlbmRpZgotCi0KLUlOTElORV9TSU1fRlBVIChkb3VibGUpCi1zaW1fZnB1XzJkIChjb25zdCBzaW1fZnB1ICpzKQotewotICBzaW1fZnB1X21hcCB2YWw7Ci0gIGlmIChzaW1fZnB1X2lzX3NuYW4gKHMpKQotICAgIHsKLSAgICAgIC8qIGdhZyBTTmFOJ3MgKi8KLSAgICAgIHNpbV9mcHUgbiA9ICpzOwotICAgICAgbi5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKLSAgICAgIHZhbC5pID0gcGFja19mcHUgKCZuLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwuaSA9IHBhY2tfZnB1IChzLCAxKTsKLSAgICB9Ci0gIHJldHVybiB2YWwuZDsKLX0KLQotCi0jaWYgMAotSU5MSU5FX1NJTV9GUFUgKHZvaWQpCi1zaW1fZnB1X2YyIChzaW1fZnB1ICpmLAotCSAgICBmbG9hdCBzKQotewotICBzaW1fZnB1X21hcCB2YWw7Ci0gIHZhbC5kID0gczsKLSAgdW5wYWNrX2ZwdSAoZiwgdmFsLmksIDEpOwotfQotI2VuZGlmCi0KLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpCi1zaW1fZnB1X2QyIChzaW1fZnB1ICpmLAotCSAgICBkb3VibGUgZCkKLXsKLSAgc2ltX2ZwdV9tYXAgdmFsOwotICB2YWwuZCA9IGQ7Ci0gIHVucGFja19mcHUgKGYsIHZhbC5pLCAxKTsKLX0KLQotCi0vKiBHZW5lcmFsICovCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2lzX25hbiAoY29uc3Qgc2ltX2ZwdSAqZCkKLXsKLSAgc3dpdGNoIChkLT5jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3FuYW46Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3NuYW46Ci0gICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pc19xbmFuIChjb25zdCBzaW1fZnB1ICpkKQotewotICBzd2l0Y2ggKGQtPmNsYXNzKQotICAgIHsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfcW5hbjoKLSAgICAgIHJldHVybiAxOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2lzX3NuYW4gKGNvbnN0IHNpbV9mcHUgKmQpCi17Ci0gIHN3aXRjaCAoZC0+Y2xhc3MpCi0gICAgewotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19zbmFuOgotICAgICAgcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfaXNfemVybyAoY29uc3Qgc2ltX2ZwdSAqZCkKLXsKLSAgc3dpdGNoIChkLT5jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3plcm86Ci0gICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pc19pbmZpbml0eSAoY29uc3Qgc2ltX2ZwdSAqZCkKLXsKLSAgc3dpdGNoIChkLT5jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OgotICAgICAgcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfaXNfbnVtYmVyIChjb25zdCBzaW1fZnB1ICpkKQotewotICBzd2l0Y2ggKGQtPmNsYXNzKQotICAgIHsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfZGVub3JtOgotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6Ci0gICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pc19kZW5vcm0gKGNvbnN0IHNpbV9mcHUgKmQpCi17Ci0gIHN3aXRjaCAoZC0+Y2xhc3MpCi0gICAgewotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19kZW5vcm06Ci0gICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X3NpZ24gKGNvbnN0IHNpbV9mcHUgKmQpCi17Ci0gIHJldHVybiBkLT5zaWduOwotfQotCi0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2V4cCAoY29uc3Qgc2ltX2ZwdSAqZCkKLXsKLSAgcmV0dXJuIGQtPm5vcm1hbF9leHA7Ci19Ci0KLQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pcyAoY29uc3Qgc2ltX2ZwdSAqZCkKLXsKLSAgc3dpdGNoIChkLT5jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX3FuYW46Ci0gICAgICByZXR1cm4gU0lNX0ZQVV9JU19RTkFOOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19zbmFuOgotICAgICAgcmV0dXJuIFNJTV9GUFVfSVNfU05BTjsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfaW5maW5pdHk6Ci0gICAgICBpZiAoZC0+c2lnbikKLQlyZXR1cm4gU0lNX0ZQVV9JU19OSU5GOwotICAgICAgZWxzZQotCXJldHVybiBTSU1fRlBVX0lTX1BJTkY7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX251bWJlcjoKLSAgICAgIGlmIChkLT5zaWduKQotCXJldHVybiBTSU1fRlBVX0lTX05OVU1CRVI7Ci0gICAgICBlbHNlCi0JcmV0dXJuIFNJTV9GUFVfSVNfUE5VTUJFUjsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfZGVub3JtOgotICAgICAgaWYgKGQtPnNpZ24pCi0JcmV0dXJuIFNJTV9GUFVfSVNfTkRFTk9STTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gU0lNX0ZQVV9JU19QREVOT1JNOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc196ZXJvOgotICAgICAgaWYgKGQtPnNpZ24pCi0JcmV0dXJuIFNJTV9GUFVfSVNfTlpFUk87Ci0gICAgICBlbHNlCi0JcmV0dXJuIFNJTV9GUFVfSVNfUFpFUk87Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfY21wIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKQotewotICBzaW1fZnB1IHJlczsKLSAgc2ltX2ZwdV9zdWIgKCZyZXMsIGwsIHIpOwotICByZXR1cm4gc2ltX2ZwdV9pcyAoJnJlcyk7Ci19Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2lzX2x0IChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKQotewotICBpbnQgc3RhdHVzOwotICBzaW1fZnB1X2x0ICgmc3RhdHVzLCBsLCByKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfaXNfbGUgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGludCBpczsKLSAgc2ltX2ZwdV9sZSAoJmlzLCBsLCByKTsKLSAgcmV0dXJuIGlzOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pc19lcSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaW50IGlzOwotICBzaW1fZnB1X2VxICgmaXMsIGwsIHIpOwotICByZXR1cm4gaXM7Ci19Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2lzX25lIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKQotewotICBpbnQgaXM7Ci0gIHNpbV9mcHVfbmUgKCZpcywgbCwgcik7Ci0gIHJldHVybiBpczsKLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfaXNfZ2UgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGludCBpczsKLSAgc2ltX2ZwdV9nZSAoJmlzLCBsLCByKTsKLSAgcmV0dXJuIGlzOwotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9pc19ndCAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaW50IGlzOwotICBzaW1fZnB1X2d0ICgmaXMsIGwsIHIpOwotICByZXR1cm4gaXM7Ci19Ci0KLQotLyogQ29tcGFyZSBvcGVyYXRvcnMgKi8KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfbHQgKGludCAqaXMsCi0JICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmICghc2ltX2ZwdV9pc19uYW4gKGwpICYmICFzaW1fZnB1X2lzX25hbiAocikpCi0gICAgewotICAgICAgc2ltX2ZwdV9tYXAgbHZhbDsKLSAgICAgIHNpbV9mcHVfbWFwIHJ2YWw7Ci0gICAgICBsdmFsLmkgPSBwYWNrX2ZwdSAobCwgMSk7Ci0gICAgICBydmFsLmkgPSBwYWNrX2ZwdSAociwgMSk7Ci0gICAgICAoKmlzKSA9IChsdmFsLmQgPCBydmFsLmQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmIChzaW1fZnB1X2lzX3NuYW4gKGwpIHx8IHNpbV9mcHVfaXNfc25hbiAocikpCi0gICAgewotICAgICAgKmlzID0gMDsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmlzID0gMDsKLSAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3FuYW47Ci0gICAgfQotfQotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KQotc2ltX2ZwdV9sZSAoaW50ICppcywKLQkgICAgY29uc3Qgc2ltX2ZwdSAqbCwKLQkgICAgY29uc3Qgc2ltX2ZwdSAqcikKLXsKLSAgaWYgKCFzaW1fZnB1X2lzX25hbiAobCkgJiYgIXNpbV9mcHVfaXNfbmFuIChyKSkKLSAgICB7Ci0gICAgICBzaW1fZnB1X21hcCBsdmFsOwotICAgICAgc2ltX2ZwdV9tYXAgcnZhbDsKLSAgICAgIGx2YWwuaSA9IHBhY2tfZnB1IChsLCAxKTsKLSAgICAgIHJ2YWwuaSA9IHBhY2tfZnB1IChyLCAxKTsKLSAgICAgICppcyA9IChsdmFsLmQgPD0gcnZhbC5kKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSB8fCBzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfZXEgKGludCAqaXMsCi0JICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmICghc2ltX2ZwdV9pc19uYW4gKGwpICYmICFzaW1fZnB1X2lzX25hbiAocikpCi0gICAgewotICAgICAgc2ltX2ZwdV9tYXAgbHZhbDsKLSAgICAgIHNpbV9mcHVfbWFwIHJ2YWw7Ci0gICAgICBsdmFsLmkgPSBwYWNrX2ZwdSAobCwgMSk7Ci0gICAgICBydmFsLmkgPSBwYWNrX2ZwdSAociwgMSk7Ci0gICAgICAoKmlzKSA9IChsdmFsLmQgPT0gcnZhbC5kKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSB8fCBzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfbmUgKGludCAqaXMsCi0JICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIGlmICghc2ltX2ZwdV9pc19uYW4gKGwpICYmICFzaW1fZnB1X2lzX25hbiAocikpCi0gICAgewotICAgICAgc2ltX2ZwdV9tYXAgbHZhbDsKLSAgICAgIHNpbV9mcHVfbWFwIHJ2YWw7Ci0gICAgICBsdmFsLmkgPSBwYWNrX2ZwdSAobCwgMSk7Ci0gICAgICBydmFsLmkgPSBwYWNrX2ZwdSAociwgMSk7Ci0gICAgICAoKmlzKSA9IChsdmFsLmQgIT0gcnZhbC5kKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSB8fCBzaW1fZnB1X2lzX3NuYW4gKHIpKQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICppcyA9IDA7Ci0gICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOwotICAgIH0KLX0KLQotSU5MSU5FX1NJTV9GUFUgKGludCkKLXNpbV9mcHVfZ2UgKGludCAqaXMsCi0JICAgIGNvbnN0IHNpbV9mcHUgKmwsCi0JICAgIGNvbnN0IHNpbV9mcHUgKnIpCi17Ci0gIHJldHVybiBzaW1fZnB1X2xlIChpcywgciwgbCk7Ci19Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpCi1zaW1fZnB1X2d0IChpbnQgKmlzLAotCSAgICBjb25zdCBzaW1fZnB1ICpsLAotCSAgICBjb25zdCBzaW1fZnB1ICpyKQotewotICByZXR1cm4gc2ltX2ZwdV9sdCAoaXMsIHIsIGwpOwotfQotCi0KLS8qIEEgbnVtYmVyIG9mIHVzZWZ1bCBjb25zdGFudHMgKi8KLQotI2lmIEVYVEVSTl9TSU1fRlBVX1AKLWNvbnN0IHNpbV9mcHUgc2ltX2ZwdV96ZXJvID0gewotICBzaW1fZnB1X2NsYXNzX3plcm8sCi19OwotY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X3FuYW4gPSB7Ci0gIHNpbV9mcHVfY2xhc3NfcW5hbiwKLX07Ci1jb25zdCBzaW1fZnB1IHNpbV9mcHVfb25lID0gewotICBzaW1fZnB1X2NsYXNzX251bWJlciwgMCwgSU1QTElDSVRfMSwgMQotfTsKLWNvbnN0IHNpbV9mcHUgc2ltX2ZwdV90d28gPSB7Ci0gIHNpbV9mcHVfY2xhc3NfbnVtYmVyLCAwLCBJTVBMSUNJVF8xLCAyCi19OwotY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X21heDMyID0gewotICBzaW1fZnB1X2NsYXNzX251bWJlciwgMCwgTFNNQVNLNjQgKE5SX0ZSQUNfR1VBUkQsIE5SX0dVQVJEUzMyKSwgTk9STUFMX0VYUE1BWDMyCi19OwotY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X21heDY0ID0gewotICBzaW1fZnB1X2NsYXNzX251bWJlciwgMCwgTFNNQVNLNjQgKE5SX0ZSQUNfR1VBUkQsIE5SX0dVQVJEUzY0KSwgTk9STUFMX0VYUE1BWDY0Ci19OwotI2VuZGlmCi0KLQotLyogRm9yIGRlYnVnZ2luZyAqLwotCi1JTkxJTkVfU0lNX0ZQVSAodm9pZCkKLXNpbV9mcHVfcHJpbnRfZnB1IChjb25zdCBzaW1fZnB1ICpmLAotCQkgICBzaW1fZnB1X3ByaW50X2Z1bmMgKnByaW50LAotCQkgICB2b2lkICphcmcpCi17Ci0gIHByaW50IChhcmcsICIlcyIsIGYtPnNpZ24gPyAiLSIgOiAiKyIpOwotICBzd2l0Y2ggKGYtPmNsYXNzKQotICAgIHsKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfcW5hbjoKLSAgICAgIHByaW50IChhcmcsICIwLiIpOwotICAgICAgcHJpbnRfYml0cyAoZi0+ZnJhY3Rpb24sIE5SX0ZSQUNfR1VBUkQgLSAxLCBwcmludCwgYXJnKTsKLSAgICAgIHByaW50IChhcmcsICIqUXVpZXROYU4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19zbmFuOgotICAgICAgcHJpbnQgKGFyZywgIjAuIik7Ci0gICAgICBwcmludF9iaXRzIChmLT5mcmFjdGlvbiwgTlJfRlJBQ19HVUFSRCAtIDEsIHByaW50LCBhcmcpOwotICAgICAgcHJpbnQgKGFyZywgIipTaWduYWxOYU4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc196ZXJvOgotICAgICAgcHJpbnQgKGFyZywgIjAuMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OgotICAgICAgcHJpbnQgKGFyZywgIklORiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fZnB1X2NsYXNzX251bWJlcjoKLSAgICBjYXNlIHNpbV9mcHVfY2xhc3NfZGVub3JtOgotICAgICAgcHJpbnQgKGFyZywgIjEuIik7Ci0gICAgICBwcmludF9iaXRzIChmLT5mcmFjdGlvbiwgTlJfRlJBQ19HVUFSRCAtIDEsIHByaW50LCBhcmcpOwotICAgICAgcHJpbnQgKGFyZywgIioyXiUrLTVkIiwgZi0+bm9ybWFsX2V4cCk7Ci0gICAgICBBU1NFUlQgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzEpOwotICAgICAgQVNTRVJUIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOwotICAgIH0KLX0KLQotCi1JTkxJTkVfU0lNX0ZQVSAodm9pZCkKLXNpbV9mcHVfcHJpbnRfc3RhdHVzIChpbnQgc3RhdHVzLAotCQkgICAgICBzaW1fZnB1X3ByaW50X2Z1bmMgKnByaW50LAotCQkgICAgICB2b2lkICphcmcpCi17Ci0gIGludCBpID0gMTsKLSAgY2hhciAqcHJlZml4ID0gIiI7Ci0gIHdoaWxlIChzdGF0dXMgPj0gaSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKChzaW1fZnB1X3N0YXR1cykgKHN0YXR1cyAmIGkpKQotCXsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2Rlbm9ybToKLQkgIHByaW50IChhcmcsICIlc0QiLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW46Ci0JICBwcmludCAoYXJnLCAiJXNTTmFOIiwgcHJlZml4KTsKLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOgotCSAgcHJpbnQgKGFyZywgIiVzUU5hTiIsIHByZWZpeCk7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpOgotCSAgcHJpbnQgKGFyZywgIiVzSVNJIiwgcHJlZml4KTsKLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pZGk6Ci0JICBwcmludCAoYXJnLCAiJXNJREkiLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3pkejoKLQkgIHByaW50IChhcmcsICIlc1pEWiIsIHByZWZpeCk7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16OgotCSAgcHJpbnQgKGFyZywgIiVzSU1aIiwgcHJlZml4KTsKLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk6Ci0JICBwcmludCAoYXJnLCAiJXNDVkkiLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2NtcDoKLQkgIHByaW50IChhcmcsICIlc0NNUCIsIHByZWZpeCk7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc3FydDoKLQkgIHByaW50IChhcmcsICIlc1NRUlQiLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q6Ci0JICBwcmludCAoYXJnLCAiJXNYIiwgcHJlZml4KTsKLQkgIGJyZWFrOwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19vdmVyZmxvdzoKLQkgIHByaW50IChhcmcsICIlc08iLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdzoKLQkgIHByaW50IChhcmcsICIlc1UiLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfZGl2MDoKLQkgIHByaW50IChhcmcsICIlcy8iLCBwcmVmaXgpOwotCSAgYnJlYWs7Ci0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX3JvdW5kZWQ6Ci0JICBwcmludCAoYXJnLCAiJXNSIiwgcHJlZml4KTsKLQkgIGJyZWFrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaSA8PD0gMTsKLSAgICAgIHByZWZpeCA9ICIsIjsKLSAgICB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZnB1LmggYi9zaW0vY29tbW9uL3NpbS1mcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkNTNjMi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1mcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKiBTaW11bGF0b3IgRmxvYXRpbmctcG9pbnQgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5Ny0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0KLSNpZm5kZWYgU0lNX0ZQVV9ICi0jZGVmaW5lIFNJTV9GUFVfSAotCi0KLQotLyogVGhlIEZQVSBpbnRlcm1lZGlhdGUgdHlwZSAtIHRoaXMgb2JqZWN0LCBwYXNzZWQgYnkgcmVmZXJlbmNlLAotICAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb3BhcXVlLgotCi0KLSAgIFByYWdtYXRpY3MgLSBwYXNzIHN0cnVjdCBieSByZWY6Ci0KLSAgIFRoZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgb2JqZWN0L2ludGVyZmFjZSB0aGF0IHdlcmUgY29uc2lkZXJlZAotICAgd2VyZTogYSBwYWNrZWQgNjQgYml0IHZhbHVlOyBhbiB1bnBhY2tlZCBzdHJ1Y3R1cmUgcGFzc2VkIGJ5IHZhbHVlOwotICAgYW5kIGFuIHVucGFja2VkIHN0cnVjdHVyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgotCi0gICBUaGUgcGFja2VkIDY0IGJpdCB2YWx1ZSB3YXMgcmVqZWN0ZWQgYmVjYXVzZTogaXQgbGltaXRlZCB0aGUKLSAgIHByZWNpc2lvbiBvZiBpbnRlcm1lZGlhdGUgdmFsdWVzOyByZWFzb25hYmxlIHBlcmZvcm1hbmNlIHdvdWxkIG9ubHkKLSAgIGJlIGFjaGlldmVkIHdoZW4gdGhlIHNpbV9mcHUgcGFja2FnZSB3YXMgaW4tbGluZWQgYWxsb3dpbmcgcmVwZWF0ZWQKLSAgIHVucGFja2luZyBvcGVyYXRpb25zIHRvIGJlIGVsaW1pbmF0ZWQuCi0KLSAgIEZvciB1bnBhY2tlZCBzdHJ1Y3R1cmVzIChwYXNzZWQgYnkgdmFsdWUgYW5kIHJlZmVyZW5jZSksIHRoZSBjb2RlCi0gICBxdWFsaXR5IG9mIEdDQy0yLjcgKG9uIHg4NikgZm9yIGVhY2ggYWx0ZXJuYXRpdmUgd2FzIGNvbXBhcmVkLgotICAgTmVlZGxlc3MgdG8gc2F5IHRoZSByZXN1bHRzLCB3aGlsZSBiZXR0ZXIgdGhlbiBmb3IgYSBwYWNrZWQgNjQgYml0Ci0gICBvYmplY3QsIHdlcmUgc3RpbGwgcG9vciAoR0NDIGhhZCBvbmx5IGxpbWl0ZWQgc3VwcG9ydCBmb3IgdGhlCi0gICBvcHRpbWl6YXRpb24gb2YgcmVmZXJlbmNlcyB0byBzdHJ1Y3R1cmUgbWVtYmVycykuICBSZWdhcmRsZXNzLCB0aGUKLSAgIHN0cnVjdC1ieS1yZWYgYWx0ZXJuYXRpdmUgYWNoaWV2ZWQgYmV0dGVyIHJlc3VsdHMgd2hlbiBjb21waWxlZAotICAgd2l0aCAoYmV0dGVyIHNwZWVkKSBhbmQgd2l0aG91dCAoYmV0dGVyIGNvZGUgZGVuc2l0eSkgaW4tbGluaW5nLgotICAgSGVyZSdzIGxvb2tpbmcgZm9yd2FyZCB0byBhbiBpbXByb3ZlZCBHQ0Mgb3B0aW1pemVyLgotCi0KLSAgIFByYWdtYXRpY3MgLSBhdm9pZCBob3N0IEZQIGhhcmR3YXJlOgotCi0gICBGUCBvcGVyYXRpb25zIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBlaXRoZXI6IHRoZSBob3N0J3MgZmxvYXRpbmcKLSAgIHBvaW50IGhhcmR3YXJlOyBvciBieSBlbXVsYXRpbmcgdGhlIEZQIG9wZXJhdGlvbnMgdXNpbmcgaW50ZWdlcgotICAgb25seSByb3V0aW5lcy4gIFRoaXMgaXMgZGlyZWN0IHRyYWRlb2ZmIGJldHdlZW4gc3BlZWQsIHBvcnRhYmlsaXR5Ci0gICBhbmQgY29ycmVjdG5lc3MuCi0KLSAgIFRoZSB0d28gcHJpbmNpcGFsIHJlYXNvbnMgZm9yIHNlbGVjdGluZyBwb3J0YWJpbGl0eSBhbmQgY29ycmVjdG5lc3MKLSAgIG92ZXIgc3BlZWQgYXJlOgotCi0gICAxIC0gQ29ycmVjdG5lc3MuICBUaGUgYXNzdW1wdGlvbiB0aGF0IEZQIGNvcnJlY3RuZXNzIHdhc24ndCBhbgotICAgaXNzdWUgZm9yIGNvZGUgYmVpbmcgcnVuIG9uIHNpbXVsYXRvcnMgd2FzIHdyb25nLiAgSW5zdGVhZCBvZgotICAgcnVubmluZyBGUCB0b2xlcmFudCAoPykgY29kZSwgc2ltdWxhdG9yIHVzZXJzIGluc3RlYWQgdHlwaWNhbGx5IHJ1bgotICAgdmVyeSBhZ2dyZXNzaXZlIEZQIGNvZGUgc2VxdWVuY2VzLiAgVGhlIHNvbGUgcHVycG9zZSBvZiB0aG9zZQotICAgc2VxdWVuY2VzIGJlaW5nIHRvIHRlc3QgdGhlIHRhcmdldCBJU0EncyBGUCBpbXBsZW1lbnRhdGlvbi4KLQotICAgMiAtIFBvcnRhYmlsaXR5LiAgVGhlIGhvc3QgRlAgaW1wbGVtZW50YXRpb24gaXMgbm90IHByZWRpY3RhYmxlLiAgQQotICAgc2ltdWxhdG9yIG1vZGVsaW5nIGFnZ3Jlc3NpdmUgRlAgY29kZSBzZXF1ZW5jZXMgdXNpbmcgdGhlIGhvc3RzIEZQVQotICAgcmVsaWVzIGhlYXZpbHkgb24gdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBob3N0cyBGUCBpbXBsZW1lbnRhdGlvbi4KLSAgIEl0IHR1cm5zIG91dCB0aGF0IHN1Y2ggdHJ1c3QgY2FuIGJlIG1pc3BsYWNlZC4gIFRoZSBiZWhhdmlvciBvZgotICAgaG9zdCBGUCBpbXBsZW1lbnRhdGlvbnMgd2hlbiBoYW5kbGluZyBlZGdlIGNvbmRpdGlvbnMgc3VjaCBhcyBTTmFOcwotICAgYW5kIGV4Y2VwdGlvbnMgdmFyaWVkIHdpZGVseS4KLQotCi0gICAqLwotCi0KLXR5cGVkZWYgZW51bQotewotICBzaW1fZnB1X2NsYXNzX3plcm8sCi0gIHNpbV9mcHVfY2xhc3Nfc25hbiwKLSAgc2ltX2ZwdV9jbGFzc19xbmFuLAotICBzaW1fZnB1X2NsYXNzX251bWJlciwKLSAgc2ltX2ZwdV9jbGFzc19kZW5vcm0sCi0gIHNpbV9mcHVfY2xhc3NfaW5maW5pdHksCi19IHNpbV9mcHVfY2xhc3M7Ci0KLXR5cGVkZWYgc3RydWN0IF9zaW1fZnB1IHsKLSAgc2ltX2ZwdV9jbGFzcyBjbGFzczsKLSAgaW50IHNpZ247Ci0gIHVuc2lnbmVkNjQgZnJhY3Rpb247Ci0gIGludCBub3JtYWxfZXhwOwotfSBzaW1fZnB1OwotCi0KLQotLyogUm91bmRpbmcgb3B0aW9ucy4KLQotICAgVGhlIHZhbHVlIHplcm8gKHNpbV9mcHVfcm91bmRfZGVmYXVsdCkgZm9yIEFMVSBvcGVyYXRpb25zIGluZGljYXRlcwotICAgdGhhdCwgd2hlbiBwb3NzaWJsZSwgcm91bmRpbmcgc2hvdWxkIGJlIGF2b2lkZWQuICovCi0KLXR5cGVkZWYgZW51bQotewotICBzaW1fZnB1X3JvdW5kX2RlZmF1bHQgPSAwLAotICBzaW1fZnB1X3JvdW5kX25lYXIgPSAxLAotICBzaW1fZnB1X3JvdW5kX3plcm8gPSAyLAotICBzaW1fZnB1X3JvdW5kX3VwID0gMywKLSAgc2ltX2ZwdV9yb3VuZF9kb3duID0gNCwKLX0gc2ltX2ZwdV9yb3VuZDsKLQotCi0vKiBPcHRpb25zIHdoZW4gaGFuZGxpbmcgZGVub3JtYWxpemVkIG51bWJlcnMuICAqLwotCi10eXBlZGVmIGVudW0KLXsKLSAgc2ltX2ZwdV9kZW5vcm1fZGVmYXVsdCA9IDAsCi0gIHNpbV9mcHVfZGVub3JtX3VuZGVyZmxvd19pbmV4YWN0ID0gMSwKLSAgc2ltX2ZwdV9kZW5vcm1femVybyA9IDIsCi19IHNpbV9mcHVfZGVub3JtOwotCi0KLQotLyogU3RhdHVzIHZhbHVlcyByZXR1cm5lZCBieSBGUFUgb3BlcmF0b3JzLgotCi0gICBXaGVuIGNoZWNraW5nIHRoZSByZXN1bHQgb2YgYW4gRlAgc2VxdWVuY2UgKGV4IDMydG8sIGFkZCwgc2luZ2xlLAotICAgdG8zMikgdGhlIGNhbGxlciBtYXkgZWl0aGVyOiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGVhY2ggRlAKLSAgIG9wZXJhdG9yOyBvciBmb3JtIHRoZSB1bmlvbiAoT1IpIG9mIHRoZSByZXR1cm5lZCB2YWx1ZXMgYW5kIGV4YW1pbmUKLSAgIHRoZW0gb25jZSBhdCB0aGUgZW5kLgotCi0gICBGSVhNRTogVGhpcyBmYWNpbGl0eSBpcyBzdGlsbCBiZWluZyBkZXZlbG9wZWQuICBUaGUgY2hvaWNlIG9mCi0gICBzdGF0dXMgdmFsdWVzIHJldHVybmVkIGFuZCB0aGVpciBleGFjdCBtZWFuaW5nIG1heSBjaGFuZ2VkIGluIHRoZQotICAgZnV0dXJlLiAgKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbiA9IDEsCi0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbiA9IDIsCi0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpID0gNCwgLyogKGluZiAtIGluZikgKi8KLSAgc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pZGkgPSA4LCAvKiAoaW5mIC8gaW5mKSAqLwotICBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3pkeiA9IDE2LCAvKiAoMCAvIDApICovCi0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16ID0gMzIsIC8qIChpbmYgKiAwKSAqLwotICBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2N2aSA9IDY0LCAvKiBjb252ZXJ0IHRvIGludGVnZXIgKi8KLSAgc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9kaXYwID0gMTI4LCAvKiAoWCAvIDApICovCi0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY21wID0gMjU2LCAvKiBjb21wYXJlICovCi0gIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc3FydCA9IDUxMiwKLSAgc2ltX2ZwdV9zdGF0dXNfcm91bmRlZCA9IDEwMjQsCi0gIHNpbV9mcHVfc3RhdHVzX2luZXhhY3QgPSAyMDQ4LAotICBzaW1fZnB1X3N0YXR1c19vdmVyZmxvdyA9IDQwOTYsCi0gIHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdyA9IDgxOTIsCi0gIHNpbV9mcHVfc3RhdHVzX2Rlbm9ybSA9IDE2Mzg0LAotfSBzaW1fZnB1X3N0YXR1czsKLQotCi0KLQotLyogRGlyZWN0bHkgbWFwIGJldHdlZW4gYSAzMi82NCBiaXQgcmVnaXN0ZXIgYW5kIHRoZSBzaW1fZnB1IGludGVybmFsCi0gICB0eXBlLgotCi0gICBXaGVuIGNvbnZlcnRpbmcgZnJvbSB0aGUgMzIvNjQgYml0IHBhY2tlZCBmb3JtYXQgdG8gdGhlIHNpbV9mcHUKLSAgIGludGVybmFsIHR5cGUsIHRoZSBvcGVyYXRpb24gaXMgZXhhY3QuCi0KLSAgIFdoZW4gY29udmVydGluZyBmcm9tIHRoZSBzaW1fZnB1IGludGVybmFsIHR5cGUgdG8gMzIvNjQgYml0IHBhY2tlZAotICAgZm9ybWF0LCB0aGUgb3BlcmF0aW9uIG1heSByZXN1bHQgaW4gYSBsb3NzIG9mIHByZWNpc2lvbi4gVGhlCi0gICBjb25maWd1cmF0aW9uIG1hY3JvIFdJVEhfRlBVX0NPTlZFUlNJT04gY29udHJvbHMgdGhpcy4gIEJ5IGRlZmF1bHQsCi0gICBzaWxlbnQgcm91bmQgdG8gbmVhcmVzdCBpcyBwZXJmb3JtZWQuICBBbHRlcm5hdGl2bHksIHJvdW5kIHVwLAotICAgcm91bmQgZG93biBhbmQgcm91bmQgdG8gemVybyBjYW4gYmUgcGVyZm9ybWVkLiAgSW4gYSBzaW11bGF0b3IKLSAgIGVtdWxhdGluZyBleGFjdCBGUFUgYmVoYXZvdXIsIHNpbV9mcHVfcm91bmRfezMyLDY0fSBzaG91bGQgYmUKLSAgIGNhbGxlZCBiZWZvcmUgcGFja2luZyB0aGUgc2ltX2ZwdSB2YWx1ZS4gICovCi0KLUlOTElORV9TSU1fRlBVICh2b2lkKSBzaW1fZnB1XzMydG8gKHNpbV9mcHUgKmYsIHVuc2lnbmVkMzIgcyk7Ci1JTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV8yMzJ0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQzMiBoLCB1bnNpZ25lZDMyIGwpOwotSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfNjR0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQ2NCBkKTsKLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfdG8zMiAodW5zaWduZWQzMiAqcywgY29uc3Qgc2ltX2ZwdSAqZik7Ci1JTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV90bzIzMiAodW5zaWduZWQzMiAqaCwgdW5zaWduZWQzMiAqbCwgY29uc3Qgc2ltX2ZwdSAqZik7Ci1JTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV90bzY0ICh1bnNpZ25lZDY0ICpkLCBjb25zdCBzaW1fZnB1ICpmKTsKLQotCi0vKiBDcmVhdGUgYSBzaW1fZnB1IHN0cnVjdCB1c2luZyByYXcgaW5mb3JtYXRpb24uICAoRlJBQ1RJT04gJiBMU01BU0sKLSAgIChQUkVDSVNJT04tMSwgMCkpIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUKLSAgIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBsZWFkaW5nIGJpdCBMU0JJVCAoUFJFQ0lTSU9OKSBpcyBhbHdheXMKLSAgIGltcGxpZWQuICBUaGUgbnVtYmVyIGNyZWF0ZWQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5OgotCi0gICAoU0lHTiA/ICItIiA6ICIrIikgIjEuIiBGUkFDVElPTntQUkVDSVNJT04tMSwwfSBYIDIgXiBOT1JNQUxfRVhQPgotCi0gICBZb3UgY2FuIG5vdCBzcGVjaWZ5IHplcm8gdXNpbmcgdGhpcyBmdW5jdGlvbi4gKi8KLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZnJhY3Rpb250byAoc2ltX2ZwdSAqZiwgaW50IHNpZ24sIGludCBub3JtYWxfZXhwLCB1bnNpZ25lZDY0IGZyYWN0aW9uLCBpbnQgcHJlY2lzaW9uKTsKLQotLyogUmV2ZXJzZSBvcGVyYXRvbi4gIElmIFMgaXMgYSBub24temVybyBudW1iZXIsIGRpc2NhcmRzIHRoZSBpbXBsaWVkCi0gICBsZWFkaW5nIG9uZSBhbmQgcmV0dXJucyBQUkVDSVNJT04gZnJhY3Rpb24gYml0cy4gIE5vIHJvdW5kaW5nIGlzCi0gICBwZXJmb3JtZWQuICovCi1JTkxJTkVfU0lNX0ZQVSAodW5zaWduZWQ2NCkgc2ltX2ZwdV90b2ZyYWN0aW9uIChjb25zdCBzaW1fZnB1ICpzLCBpbnQgcHJlY2lzaW9uKTsKLQotCi0KLS8qIFJvdW5kaW5nIG9wZXJhdG9ycy4KLQotICAgRm9yY2UgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCB0byBhbiBleGFjdCAzMi82NCBiaXQKLSAgIHJlcHJlc2VudGF0aW9uLiAqLwotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3JvdW5kXzMyIChzaW1fZnB1ICpmLAotCQkJCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kLAotCQkJCSAgICAgICBzaW1fZnB1X2Rlbm9ybSBkZW5vcm0pOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9yb3VuZF82NCAoc2ltX2ZwdSAqZiwKLQkJCQkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCwKLQkJCQkgICAgICAgc2ltX2ZwdV9kZW5vcm0gZGVub3JtKTsKLQotCi0KLS8qIEFycml0aG1ldGljIG9wZXJhdG9ycy4KLQotICAgRklYTUU6IEluIHRoZSBmdXR1cmUsIGFkZGl0aW9uYWwgYXJndW1lbnRzIFJPVU5ESU5HIGFuZCBCSVRTSVpFIG1heQotICAgYmUgYWRkZWQuICovCi0KLXR5cGVkZWYgaW50IChzaW1fZnB1X29wMSkgKHNpbV9mcHUgKmYsCi0JCQkgICBjb25zdCBzaW1fZnB1ICpsKTsKLXR5cGVkZWYgaW50IChzaW1fZnB1X29wMikgKHNpbV9mcHUgKmYsCi0JCQkgICBjb25zdCBzaW1fZnB1ICpsLAotCQkJICAgY29uc3Qgc2ltX2ZwdSAqcik7Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfYWRkIChzaW1fZnB1ICpmLAotCQkJCSAgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3N1YiAoc2ltX2ZwdSAqZiwKLQkJCQkgIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9tdWwgKHNpbV9mcHUgKmYsCi0JCQkJICBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfZGl2IChzaW1fZnB1ICpmLAotCQkJCSAgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X21heCAoc2ltX2ZwdSAqZiwKLQkJCQkgIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9taW4gKHNpbV9mcHUgKmYsCi0JCQkJICBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfbmVnIChzaW1fZnB1ICpmLAotCQkJCSAgY29uc3Qgc2ltX2ZwdSAqYSk7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2FicyAoc2ltX2ZwdSAqZiwKLQkJCQkgIGNvbnN0IHNpbV9mcHUgKmEpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pbnYgKHNpbV9mcHUgKmYsCi0JCQkJICBjb25zdCBzaW1fZnB1ICphKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfc3FydCAoc2ltX2ZwdSAqZiwKLQkJCQkgICBjb25zdCBzaW1fZnB1ICpzcXIpOwotCi0KLQotLyogQ29udmVyc2lvbiBvZiBpbnRlZ2VyIDwtPiBmbG9hdGluZyBwb2ludC4gKi8KLQotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pMzJ0byAoc2ltX2ZwdSAqZiwgc2lnbmVkMzIgaSwKLQkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3UzMnRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDMyIHUsCi0JCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pNjR0byAoc2ltX2ZwdSAqZiwgc2lnbmVkNjQgaSwKLQkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3U2NHRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDY0IHUsCi0JCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOwotI2lmIDAKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaTIzMnRvIChzaW1fZnB1ICpmLCBzaWduZWQzMiBoLCBzaWduZWQzMiBsLAotCQkJCSAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7Ci0jZW5kaWYKLSNpZiAwCi1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3UyMzJ0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQzMiBoLCB1bnNpZ25lZDMyIGwsCi0JCQkJICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKLSNlbmRpZgotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3RvMzJpIChzaWduZWQzMiAqaSwgY29uc3Qgc2ltX2ZwdSAqZiwKLQkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3RvMzJ1ICh1bnNpZ25lZDMyICp1LCBjb25zdCBzaW1fZnB1ICpmLAotCQkJCSAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG82NGkgKHNpZ25lZDY0ICppLCBjb25zdCBzaW1fZnB1ICpmLAotCQkJCSAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG82NHUgKHVuc2lnbmVkNjQgKnUsIGNvbnN0IHNpbV9mcHUgKmYsCi0JCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOwotI2lmIDAKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG8yMzJpIChzaWduZWQ2NCAqaCwgc2lnbmVkNjQgKmwsIGNvbnN0IHNpbV9mcHUgKmYsCi0JCQkJICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKLSNlbmRpZgotI2lmIDAKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG8yMzJ1ICh1bnNpZ25lZDY0ICpoLCB1bnNpZ25lZDY0ICpsLCBjb25zdCBzaW1fZnB1ICpmLAotCQkJCSAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7Ci0jZW5kaWYKLQotCi0vKiBDb252ZXJzaW9uIG9mIGludGVybmFsIHNpbV9mcHUgdHlwZSB0byBob3N0IGRvdWJsZSBmb3JtYXQuCi0KLSAgIEZvciBkZWJ1Z2luZy90cmFjaW5nIG9ubHkuICBBIFNOYU4gaXMgbmV2ZXIgcmV0dXJuZWQuICovCi0KLS8qIElOTElORV9TSU1fRlBVIChmbG9hdCkgc2ltX2ZwdV8yZiAoY29uc3Qgc2ltX2ZwdSAqZik7ICovCi1JTkxJTkVfU0lNX0ZQVSAoZG91YmxlKSBzaW1fZnB1XzJkIChjb25zdCBzaW1fZnB1ICpkKTsKLQotLyogSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZjIgKHNpbV9mcHUgKmYsIGZsb2F0IHMpOyAqLwotSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZDIgKHNpbV9mcHUgKmYsIGRvdWJsZSBkKTsKLQotCi0KLS8qIFNwZWNpZmljIG51bWJlciBjbGFzc2VzLgotCi0gICBOQjogV2hlbiBlaXRoZXIsIGEgMzIvNjQgYml0IGZsb2F0aW5nIHBvaW50cyBpcyBjb252ZXJ0ZWQgdG8KLSAgIGludGVybmFsIGZvcm1hdCwgb3IgYW4gaW50ZXJuYWwgZm9ybWF0IG51bWJlciBpcyByb3VuZGVkIHRvIDMyLzY0Ci0gICBiaXQgcHJlY2lzaW9uLCBhIHNwZWNpYWwgbWFya2VyIGlzIHJldGFpbmVkIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlCi0gICB2YWx1ZSB3YXMgbm9ybWFsaXplZC4gIEZvciBzdWNoIG51bWJlcnMgYm90aCBpc19udW1iZXIgYW5kCi0gICBpc19kZW5vcm0gcmV0dXJuIHRydWUuICovCi0KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbmFuIChjb25zdCBzaW1fZnB1ICpzKTsgLyogMSA9PiBTTmFOIG9yIFFOYU4gKi8KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfc25hbiAoY29uc3Qgc2ltX2ZwdSAqcyk7IC8qIDEgPT4gU05hTiAqLwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19xbmFuIChjb25zdCBzaW1fZnB1ICpzKTsgLyogMSA9PiBRTmFOICovCi0KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfemVybyAoY29uc3Qgc2ltX2ZwdSAqcyk7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2luZmluaXR5IChjb25zdCBzaW1fZnB1ICpzKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbnVtYmVyIChjb25zdCBzaW1fZnB1ICpzKTsgLyogIXplcm8gKi8KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfZGVub3JtIChjb25zdCBzaW1fZnB1ICpzKTsgLyogIXplcm8gKi8KLQotCi0KLS8qIEZsb2F0aW5nIHBvaW50IGZpZWxkcyAqLwotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3NpZ24gKGNvbnN0IHNpbV9mcHUgKnMpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9leHAgKGNvbnN0IHNpbV9mcHUgKnMpOwotCi0KLQotLyogU3BlY2lmaWMgY29tcGFyaXNvbiBvcGVyYXRvcnMKLQotICAgRm9yIE5hTnMgZXQuYWwuLCB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgd2lsbCBzZXQgSVMgdG8gemVybyBhbmQKLSAgIHJldHVybiBhIG5vbnplcm8gcmVzdWx0LiAqLwotCi1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2x0IChpbnQgKmlzLCBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfbGUgKGludCAqaXMsIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9lcSAoaW50ICppcywgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X25lIChpbnQgKmlzLCBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfZ2UgKGludCAqaXMsIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9ndCAoaW50ICppcywgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci0KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbHQgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19sZSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2VxIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbmUgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19nZSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7Ci1JTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2d0IChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKLQotCi0KLS8qIEdlbmVyYWwgbnVtYmVyIGNsYXNzIGFuZCBjb21wYXJpc29uIG9wZXJhdG9ycy4KLQotICAgVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBpbmRpY2F0ZWQgYnkgcmV0dXJuaW5nIG9uZSBvZiB0aGUKLSAgIHZhbHVlcyBiZWxvdy4gIEVmZmljaWVudCBlbXVsYXRpb24gb2YgYSB0YXJnZXQgRlAgY29tcGFyZQotICAgaW5zdHJ1Y3Rpb24gY2FuIGJlIGFjaGlldmVkIGJ5IHJlZGVmaW5pbmcgdGhlIHZhbHVlcyBiZWxvdyB0byBtYXRjaAotICAgY29ycmVzcG9uZGluZyB0YXJnZXQgRlAgc3RhdHVzIGJpdHMuCi0KLSAgIEZvciBpbnN0YW5jZS4gIFNJTV9GUFVfUU5BTiBtYXkgYmUgcmVkZWZpbmVkIHRvIGJlIHRoZSBiaXQKLSAgIGBJTlZBTElEJyB3aGlsZSBTSU1fRlBVX05JTkYgbWlnaHQgYmUgcmVkZWZpbmVkIGFzIHRoZSBiaXRzCi0gICBgTkVHQVRJVkUgfCBJTkZJTklUWSB8IFZBTElEJy4gKi8KLQotI2lmbmRlZiBTSU1fRlBVX0lTX1NOQU4KLWVudW0gewotICBTSU1fRlBVX0lTX1NOQU4gPSAxLCAvKiBOb2lzeSBub3QtYS1udW1iZXIgKi8KLSAgU0lNX0ZQVV9JU19RTkFOID0gMiwgLyogUXVpdGUgbm90LWEtbnVtYmVyICovCi0gIFNJTV9GUFVfSVNfTklORiA9IDMsIC8qIC1pbmZpbml0eSAqLwotICBTSU1fRlBVX0lTX1BJTkYgPSA0LCAvKiAraW5maW5pdHkgKi8KLSAgU0lNX0ZQVV9JU19OTlVNQkVSID0gNSwgLyogLW51bWJlciAtIFsgLU1BWCAuLiAtTUlOIF0gKi8KLSAgU0lNX0ZQVV9JU19QTlVNQkVSID0gNiwgLyogK251bWJlciAtIFsgK01JTiAuLiArTUFYIF0gKi8KLSAgU0lNX0ZQVV9JU19OREVOT1JNID0gNywgLyogLWRlbm9ybSAtICggTUlOIC4uIDAgKSAqLwotICBTSU1fRlBVX0lTX1BERU5PUk0gPSA4LCAvKiArZGVub3JtIC0gKCAwIC4uIE1JTiApICovCi0gIFNJTV9GUFVfSVNfTlpFUk8gPSA5LCAvKiAtMCAqLwotICBTSU1fRlBVX0lTX1BaRVJPID0gMTAsIC8qICswICovCi19OwotI2VuZGlmCi0KLUlOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXMgKGNvbnN0IHNpbV9mcHUgKmwpOwotSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9jbXAgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOwotCi0KLQotLyogQSBjb25zdGFudCBvZiB1c2VmdWwgbnVtYmVycyAqLwotCi1leHRlcm4gY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X3plcm87Ci1leHRlcm4gY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X29uZTsKLWV4dGVybiBjb25zdCBzaW1fZnB1IHNpbV9mcHVfdHdvOwotZXh0ZXJuIGNvbnN0IHNpbV9mcHUgc2ltX2ZwdV9xbmFuOwotZXh0ZXJuIGNvbnN0IHNpbV9mcHUgc2ltX2ZwdV9tYXgzMjsKLWV4dGVybiBjb25zdCBzaW1fZnB1IHNpbV9mcHVfbWF4NjQ7Ci0KLQotLyogU2VsZWN0IHRoZSBhcHBsaWNhYmxlIGZ1bmN0aW9ucyBmb3IgdGhlIGZwX3dvcmQgdHlwZSAqLwotCi0jaWYgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA9PSAzMgotI2RlZmluZSBzaW1fZnB1X3RvZnAgc2ltX2ZwdV90bzMyCi0jZGVmaW5lIHNpbV9mcHVfZnB0byBzaW1fZnB1XzMydG8KLSNkZWZpbmUgc2ltX2ZwdV9yb3VuZF9mcCBzaW1fZnB1X3JvdW5kXzMyCi0jZGVmaW5lIHNpbV9mcHVfbWF4ZnAgc2ltX2ZwdV9tYXgzMgotI2VuZGlmCi0jaWYgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA9PSA2NAotI2RlZmluZSBzaW1fZnB1X3RvZnAgc2ltX2ZwdV90bzY0Ci0jZGVmaW5lIHNpbV9mcHVfZnB0byBzaW1fZnB1XzY0dG8KLSNkZWZpbmUgc2ltX2ZwdV9yb3VuZF9mcCBzaW1fZnB1X3JvdW5kXzY0Ci0jZGVmaW5lIHNpbV9mcHVfbWF4ZnAgc2ltX2ZwdV9tYXg2NAotI2VuZGlmCi0KLQotCi0vKiBGb3IgZGVidWdnaW5nICovCi0KLXR5cGVkZWYgdm9pZCBzaW1fZnB1X3ByaW50X2Z1bmMgKHZvaWQgKiwgY2hhciAqLCAuLi4pOwotCi1JTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV9wcmludF9mcHUgKGNvbnN0IHNpbV9mcHUgKmYsCi0JCQkJCSBzaW1fZnB1X3ByaW50X2Z1bmMgKnByaW50LAotCQkJCQkgdm9pZCAqYXJnKTsKLQotSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfcHJpbnRfc3RhdHVzIChpbnQgc3RhdHVzLAotCQkJCQkgICAgc2ltX2ZwdV9wcmludF9mdW5jICpwcmludCwKLQkJCQkJICAgIHZvaWQgKmFyZyk7Ci0KLSNpZiBIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9GUFVfSU5MSU5FKQotI2luY2x1ZGUgInNpbS1mcHUuYyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWhsb2FkLmMgYi9zaW0vY29tbW9uL3NpbS1obG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODcyNmJhLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWhsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBHZW5lcmljIGxvYWQgZm9yIGhhcmR3YXJlIHNpbXVsYXRvciBtb2RlbHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzaW0tdXRpbHMuaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLQotLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBzaW1fbG9hZCB0aGF0IHdvcmtzIHdpdGggc2ltdWxhdG9ycwotICAgbW9kZWxpbmcgYSBoYXJkd2FyZSBwbGF0Zm9ybS4gKi8KLQotU0lNX1JDCi1zaW1fbG9hZCAoc2QsIHByb2dfbmFtZSwgcHJvZ19iZmQsIGZyb21fdHR5KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqcHJvZ19uYW1lOwotICAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgYmZkICpyZXN1bHRfYmZkOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIGlmIChzaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwgcHJvZ19uYW1lLCBwcm9nX2JmZCkgIT0gU0lNX1JDX09LKQotICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfUFJPR19CRkQgKHNkKSAhPSBOVUxMKTsKLQotICAvKiBOT1RFOiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBvbGRlciBoYXJkd2FyZSBzaW11bGF0b3JzCi0gICAgIGluY29ycmVjdGx5IHdyaXRlIHRoZSBwcm9ncmFtIHNlY3Rpb25zIGF0IExNQSBpbnRlcnByZXRlZCBhcyBhCi0gICAgIHZpcnR1YWwgYWRkcmVzcy4gIFRoaXMgaXMgc3RpbGwgYWNjb21tb2RhdGVkIGZvciBiYWNrd2FyZAotICAgICBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCi0KLSAgcmVzdWx0X2JmZCA9IHNpbV9sb2FkX2ZpbGUgKHNkLCBTVEFURV9NWV9OQU1FIChzZCksCi0JCQkgICAgICBTVEFURV9DQUxMQkFDSyAoc2QpLAotCQkJICAgICAgcHJvZ19uYW1lLAotCQkJICAgICAgU1RBVEVfUFJPR19CRkQgKHNkKSwKLQkJCSAgICAgIFNUQVRFX09QRU5fS0lORCAoc2QpID09IFNJTV9PUEVOX0RFQlVHLAotCQkJICAgICAgU1RBVEVfTE9BRF9BVF9MTUFfUCAoc2QpLAotCQkJICAgICAgc2ltX3dyaXRlKTsKLSAgaWYgKHJlc3VsdF9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKFNUQVRFX1BST0dfQkZEIChzZCkpOwotICAgICAgU1RBVEVfUFJPR19CRkQgKHNkKSA9IE5VTEw7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taHJ3LmMgYi9zaW0vY29tbW9uL3NpbS1ocncuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzODMwMi4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1ocncuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgZm9yIGhhcmR3YXJlIHNpbXVsYXRvciBtb2RlbHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX3JlYWQgdGhhdCB3b3JrcyB3aXRoIHNpbXVsYXRvcnMKLSAgIG1vZGVsaW5nIHJlYWwgaGFyZHdhcmUgKi8KLQotaW50Ci1zaW1fcmVhZCAoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCByZWFkX21hcCwKLQkJCSAgICAgICBidWYsIG1lbSwgbGVuZ3RoKTsKLX0KLQotaW50Ci1zaW1fd3JpdGUgKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKLXsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgcmV0dXJuIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoc2QsIE5VTEwsIHdyaXRlX21hcCwKLQkJCQlidWYsIG1lbSwgbGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWh3LmMgYi9zaW0vY29tbW9uL3NpbS1ody5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM4NDYyLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWh3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyogU2ltdWxhdG9yIGhhcmR3YXJlIG9wdGlvbiBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFuZCBBbmRyZXcgQ2FnbmV5LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotCi0jaW5jbHVkZSAic2ltLWh3LmgiCi0KLSNpbmNsdWRlICJody10cmVlLmgiCi0jaW5jbHVkZSAiaHctZGV2aWNlLmgiCi0jaW5jbHVkZSAiaHctbWFpbi5oIgotI2luY2x1ZGUgImh3LWJhc2UuaCIKLQotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvZXJybm8uaD4KLQotCi1zdHJ1Y3Qgc2ltX2h3IHsKLSAgc3RydWN0IGh3ICp0cmVlOwotICBpbnQgdHJhY2VfcDsKLSAgaW50IGluZm9fcDsKLSAgLyogaWYgY2FsbGVkIGZyb20gYSBwcm9jZXNzb3IgKi8KLSAgc2ltX2NwdSAqY3B1OwotICBzaW1fY2lhIGNpYTsKLX07Ci0KLQotc3RydWN0IGh3ICoKLXNpbV9od19wYXJzZSAoc3RydWN0IHNpbV9zdGF0ZSAqc2QsCi0JICAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgIC4uLikKLXsKLSAgc3RydWN0IGh3ICpjdXJyZW50OwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0gIGN1cnJlbnQgPSBod190cmVlX3ZwYXJzZSAoU1RBVEVfSFcgKHNkKS0+dHJlZSwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICByZXR1cm4gY3VycmVudDsKLX0KLQotc3RydWN0IHByaW50ZXIgewotICBzdHJ1Y3Qgc2ltX3N0YXRlICpmaWxlOwotICB2b2lkICgqcHJpbnQpIChzdHJ1Y3Qgc2ltX3N0YXRlICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCBhcCk7Ci19OwotCi1zdGF0aWMgdm9pZAotZG9fcHJpbnQgKHZvaWQgKmZpbGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICBzdHJ1Y3QgcHJpbnRlciAqcCA9IGZpbGU7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgcC0+cHJpbnQgKHAtPmZpbGUsIGZtdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotdm9pZAotc2ltX2h3X3ByaW50IChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLQkgICAgICB2b2lkICgqcHJpbnQpIChzdHJ1Y3Qgc2ltX3N0YXRlICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCBhcCkpCi17Ci0gIHN0cnVjdCBwcmludGVyIHA7Ci0gIHAuZmlsZSA9IHNkOwotICBwLnByaW50ID0gcHJpbnQ7Ci0gIGh3X3RyZWVfcHJpbnQgKFNUQVRFX0hXIChzZCktPnRyZWUsIGRvX3ByaW50LCAmcCk7Ci19Ci0KLQotCi0KLS8qIGNvbW1hbmQgbGluZSBvcHRpb25zLiAqLwotCi1lbnVtIHsKLSAgT1BUSU9OX0hXX0lORk8gPSBPUFRJT05fU1RBUlQsCi0gIE9QVElPTl9IV19UUkFDRSwKLSAgT1BUSU9OX0hXX0RFVklDRSwKLSAgT1BUSU9OX0hXX0ZJTEUsCi19OwotCi1zdGF0aWMgREVDTEFSRV9PUFRJT05fSEFORExFUiAoaHdfb3B0aW9uX2hhbmRsZXIpOwotCi1zdGF0aWMgY29uc3QgT1BUSU9OIGh3X29wdGlvbnNbXSA9Ci17Ci0gIHsgeyJody1pbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IV19JTkZPIH0sCi0gICAgICAnXDAnLCBOVUxMLCAiTGlzdCBjb25maWd1cmFibGUgaHcgcmVnaW9ucyIsCi0gICAgICBod19vcHRpb25faGFuZGxlciB9LAotICB7IHsiaW5mby1odyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSFdfSU5GTyB9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwKLSAgICAgIGh3X29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7Imh3LXRyYWNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IV19UUkFDRSB9LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBhbGwgaGFyZHdhcmUgZGV2aWNlcyIsCi0gICAgICBod19vcHRpb25faGFuZGxlciB9LAotICB7IHsidHJhY2UtaHciLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hXX1RSQUNFIH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLAotICAgICAgaHdfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHsiaHctZGV2aWNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IV19ERVZJQ0UgfSwKLSAgICAgICdcMCcsICJERVZJQ0UiLCAiQWRkIHRoZSBzcGVjaWZpZWQgZGV2aWNlIiwKLSAgICAgIGh3X29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7Imh3LWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hXX0ZJTEUgfSwKLSAgICAgICdcMCcsICJGSUxFIiwgIkFkZCB0aGUgZGV2aWNlcyBsaXN0ZWQgaW4gdGhlIGZpbGUiLAotICAgICAgaHdfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotCi0KLS8qIENvcGllZCBmcm9tIC4uL3BwYy9wc2ltLmM6cHNpbV9tZXJnZV9kZXZpY2VfZmlsZSgpICovCi0KLXN0YXRpYyBTSU1fUkMKLW1lcmdlX2RldmljZV9maWxlIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLQkJICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQotewotICBGSUxFICpkZXNjcmlwdGlvbjsKLSAgc3RydWN0IGh3ICpjdXJyZW50ID0gU1RBVEVfSFcgKHNkKS0+dHJlZTsKLSAgaW50IGxpbmVfbnI7Ci0gIGNoYXIgZGV2aWNlX3BhdGhbMTAwMF07Ci0gIAotICAvKiB0cnkgb3BlbmluZyB0aGUgZmlsZSAqLwotICBkZXNjcmlwdGlvbiA9IGZvcGVuIChmaWxlX25hbWUsICJyIik7Ci0gIGlmIChkZXNjcmlwdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0gIAotICBsaW5lX25yID0gMDsKLSAgd2hpbGUgKGZnZXRzIChkZXZpY2VfcGF0aCwgc2l6ZW9mKGRldmljZV9wYXRoKSwgZGVzY3JpcHRpb24pKQotICAgIHsKLSAgICAgIGNoYXIgKmRldmljZTsKLSAgICAgIC8qIGNoZWNrIHRoYXQgYSBjb21wbGV0ZSBsaW5lIHdhcyByZWFkICovCi0gICAgICBpZiAoc3RyY2hyIChkZXZpY2VfcGF0aCwgJ1xuJykgPT0gTlVMTCkKLQl7Ci0JICBmY2xvc2UgKGRlc2NyaXB0aW9uKTsKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIiVzOiVkOiBsaW5lIHRvIGxvbmciLCBmaWxlX25hbWUsIGxpbmVfbnIpOwotCSAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCX0KLSAgICAgICpzdHJjaHIgKGRldmljZV9wYXRoLCAnXG4nKSA9ICdcMCc7Ci0gICAgICBsaW5lX25yKys7Ci0gICAgICAvKiBza2lwIGNvbW1lbnRzICgiIyIgb3IgIjsiKSBhbmQgYmxhbmsgbGluZXMgbGluZXMgKi8KLSAgICAgIGZvciAoZGV2aWNlID0gZGV2aWNlX3BhdGg7Ci0JICAgKmRldmljZSAhPSAnXDAnICYmIGlzc3BhY2UgKCpkZXZpY2UpOwotCSAgIGRldmljZSsrKTsKLSAgICAgIGlmIChkZXZpY2VbMF0gPT0gJyMnCi0JICB8fCBkZXZpY2VbMF0gPT0gJzsnCi0JICB8fCBkZXZpY2VbMF0gPT0gJ1wwJykKLQljb250aW51ZTsKLSAgICAgIC8qIG1lcmdlIGFueSBhcHBlbmRlZCBsaW5lcyAqLwotICAgICAgd2hpbGUgKGRldmljZV9wYXRoW3N0cmxlbiAoZGV2aWNlX3BhdGgpIC0gMV0gPT0gJ1xcJykKLQl7Ci0JICBpbnQgY3VybGVuID0gc3RybGVuIChkZXZpY2VfcGF0aCkgLSAxOwotCSAgLyogemFwIHRoZSBgXCcgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAqLwotCSAgZGV2aWNlX3BhdGhbY3VybGVuXSA9ICdcMCc7Ci0JICAvKiBhcHBlbmQgdGhlIG5leHQgbGluZSAqLwotCSAgaWYgKCFmZ2V0cyAoZGV2aWNlX3BhdGggKyBjdXJsZW4sCi0JCSAgICAgIHNpemVvZiAoZGV2aWNlX3BhdGgpIC0gY3VybGVuLAotCQkgICAgICBkZXNjcmlwdGlvbikpCi0JICAgIHsKLQkgICAgICBmY2xvc2UgKGRlc2NyaXB0aW9uKTsKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIlczolZDogdW5leHBlY3RlZCBlb2YiLCBmaWxlX25hbWUsIGxpbmVfbnIpOwotCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgICAgfQotCSAgaWYgKHN0cmNocihkZXZpY2VfcGF0aCwgJ1xuJykgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZjbG9zZShkZXNjcmlwdGlvbik7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiJXM6JWQ6IGxpbmUgdG8gbG9uZyIsIGZpbGVfbmFtZSwgbGluZV9ucik7Ci0JICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICB9Ci0JICAqc3RyY2hyKGRldmljZV9wYXRoLCAnXG4nKSA9ICdcMCc7Ci0JICBsaW5lX25yKys7Ci0JfQotICAgICAgLyogcGFyc2UgdGhpcyBsaW5lICovCi0gICAgICBjdXJyZW50ID0gaHdfdHJlZV9wYXJzZSAoY3VycmVudCwgIiVzIiwgZGV2aWNlKTsKLSAgICB9Ci0gIGZjbG9zZSAoZGVzY3JpcHRpb24pOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0KLXN0YXRpYyBTSU1fUkMKLWh3X29wdGlvbl9oYW5kbGVyIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwgc2ltX2NwdSAqY3B1LCBpbnQgb3B0LAotCQkgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQotewotICBzd2l0Y2ggKG9wdCkKLSAgICB7Ci0KLSAgICBjYXNlIE9QVElPTl9IV19JTkZPOgotICAgICAgewotCS8qIGRlbGF5IGluZm8gdW50aWwgYWZ0ZXIgdGhlIHRyZWUgaXMgZmluaXNoZWQgKi8KLQlTVEFURV9IVyAoc2QpLT5pbmZvX3AgPSAxOwotCXJldHVybiBTSU1fUkNfT0s7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIE9QVElPTl9IV19UUkFDRToKLSAgICAgIHsKLQlpZiAoYXJnID09IE5VTEwpCi0JICB7Ci0JICAgIFNUQVRFX0hXIChzZCktPnRyYWNlX3AgPSAxOwotCSAgfQotCWVsc2UgaWYgKHN0cmNtcCAoYXJnLCAieWVzIikgPT0gMAotCQkgfHwgc3RyY21wIChhcmcsICJvbiIpID09IDApCi0JICB7Ci0JICAgIFNUQVRFX0hXIChzZCktPnRyYWNlX3AgPSAxOwotCSAgfQotCWVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwCi0JCSB8fCBzdHJjbXAgKGFyZywgIm9mZiIpID09IDApCi0JICB7Ci0JICAgIFNUQVRFX0hXIChzZCktPnRyYWNlX3AgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiT3B0aW9uIC0taHctdHJhY2UgaWdub3JlZFxuIik7Ci0JICAgIC8qIHNldCB0cmFjaW5nIG9uIGFsbCBkZXZpY2VzICovCi0JICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgIH0KLQkvKiBGSVhNRTogTm90IHZlcnkgbmljZSAtIHNlZSBhbHNvIGh3LWJhc2UuYyAqLwotCWlmIChTVEFURV9IVyAoc2QpLT50cmFjZV9wKQotCSAgaHdfdHJlZV9wYXJzZSAoU1RBVEVfSFcgKHNkKS0+dHJlZSwgIi9nbG9iYWwtdHJhY2U/IHRydWUiKTsKLQlyZXR1cm4gU0lNX1JDX09LOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBPUFRJT05fSFdfREVWSUNFOgotICAgICAgewotCWh3X3RyZWVfcGFyc2UgKFNUQVRFX0hXIChzZCktPnRyZWUsIGFyZyk7Ci0JcmV0dXJuIFNJTV9SQ19PSzsKLSAgICAgIH0KLQotICAgIGNhc2UgT1BUSU9OX0hXX0ZJTEU6Ci0gICAgICB7Ci0JcmV0dXJuIG1lcmdlX2RldmljZV9maWxlIChzZCwgYXJnKTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIGh3IG9wdGlvbiAlZFxuIiwgb3B0KTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci19Ci0KLQotLyogImh3IiBtb2R1bGUgaW5zdGFsbCBoYW5kbGVyLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgc2ltX21vZHVsZV9pbnN0YWxsIHRvIGluc3RhbGwgdGhlICJodyIgc3Vic3lzdGVtCi0gICBpbnRvIHRoZSBzaW11bGF0b3IuICAqLwotCi1zdGF0aWMgTU9EVUxFX0lOSVRfRk4gc2ltX2h3X2luaXQ7Ci1zdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiBzaW1faHdfdW5pbnN0YWxsOwotCi1TSU1fUkMKLXNpbV9od19pbnN0YWxsIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCkKLXsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBod19vcHRpb25zKTsKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgc2ltX2h3X3VuaW5zdGFsbCk7Ci0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1faHdfaW5pdCk7Ci0gIFNUQVRFX0hXIChzZCkgPSBaQUxMT0MgKHN0cnVjdCBzaW1faHcpOwotICBTVEFURV9IVyAoc2QpLT50cmVlID0gaHdfdHJlZV9jcmVhdGUgKHNkLCAiY29yZSIpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0KLXN0YXRpYyBTSU1fUkMKLXNpbV9od19pbml0IChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCkKLXsKLSAgLyogRklYTUU6IGFueXRoaW5nIG5lZWRlZD8gKi8KLSAgaHdfdHJlZV9maW5pc2ggKFNUQVRFX0hXIChzZCktPnRyZWUpOwotICBpZiAoU1RBVEVfSFcgKHNkKS0+aW5mb19wKQotICAgIHNpbV9od19wcmludCAoc2QsIHNpbV9pb192cHJpbnRmKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogVW5pbnN0YWxsIHRoZSAiaHciIHN1YnN5c3RlbSBmcm9tIHRoZSBzaW11bGF0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotc2ltX2h3X3VuaW5zdGFsbCAoc3RydWN0IHNpbV9zdGF0ZSAqc2QpCi17Ci0gIC8qIGh3X3RyZWVfZGVsZXRlIChTVEFURV9IVyAoc2QpLT50cmVlKTsgKi8KLSAgemZyZWUgKFNUQVRFX0hXIChzZCkpOwotICBTVEFURV9IVyAoc2QpID0gTlVMTDsKLX0KLQotCi0MCi0vKiBEYXRhIHRyYW5zZmVycyB0by9mcm9tIHRoZSBoYXJkd2FyZSBkZXZpY2UgdHJlZS4gIFRoZXJlIGFyZSBzZXZlcmFsCi0gICBjYXNlcy4gKi8KLQotCi0vKiBDUFU6IFRoZSBzaW11bGF0aW9uIGlzIHJ1bm5pbmcgYW5kIHRoZSBjdXJyZW50IENQVS9DSUEKLSAgIGluaXRpYXRlcyBhIGRhdGEgdHJhbnNmZXIuICovCi0KLXZvaWQgCi1zaW1fY3B1X2h3X2lvX3JlYWRfYnVmZmVyIChzaW1fY3B1ICpjcHUsCi0JCQkgICBzaW1fY2lhIGNpYSwKLQkJCSAgIHN0cnVjdCBodyAqaHcsCi0JCQkgICB2b2lkICpkZXN0LAotCQkJICAgaW50IHNwYWNlLAotCQkJICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJICAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBTVEFURV9IVyAoc2QpLT5jcHUgPSBjcHU7Ci0gIFNUQVRFX0hXIChzZCktPmNpYSA9IGNpYTsKLSAgaWYgKGh3X2lvX3JlYWRfYnVmZmVyIChodywgZGVzdCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSAhPSBucl9ieXRlcykKLSAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgY3B1LCBjaWEsICJicm9rZW4gQ1BVIHJlYWQiKTsKLX0KLQotdm9pZCAKLXNpbV9jcHVfaHdfaW9fd3JpdGVfYnVmZmVyIChzaW1fY3B1ICpjcHUsCi0JCQkgICAgc2ltX2NpYSBjaWEsCi0JCQkgICAgc3RydWN0IGh3ICpodywKLQkJCSAgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgICAgaW50IHNwYWNlLAotCQkJICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSAgICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIFNUQVRFX0hXIChzZCktPmNwdSA9IGNwdTsKLSAgU1RBVEVfSFcgKHNkKS0+Y2lhID0gY2lhOwotICBpZiAoaHdfaW9fd3JpdGVfYnVmZmVyIChodywgc291cmNlLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpICE9IG5yX2J5dGVzKQotICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwgImJyb2tlbiBDUFUgd3JpdGUiKTsKLX0KLQotCi0KLQotLyogU1lTVEVNOiBBIGRhdGEgdHJhbnNmZXIgaXMgYmVpbmcgaW5pdGlhdGVkIGJ5IHRoZSBzeXN0ZW0uICovCi0KLXVuc2lnbmVkIAotc2ltX2h3X2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLQkJICAgICAgIHN0cnVjdCBodyAqaHcsCi0JCSAgICAgICB2b2lkICpkZXN0LAotCQkgICAgICAgaW50IHNwYWNlLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIFNUQVRFX0hXIChzZCktPmNwdSA9IE5VTEw7Ci0gIHJldHVybiBod19pb19yZWFkX2J1ZmZlciAoaHcsIGRlc3QsIHNwYWNlLCBhZGRyLCBucl9ieXRlcyk7Ci19Ci0KLXVuc2lnbmVkCi1zaW1faHdfaW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLQkJCXN0cnVjdCBodyAqaHcsCi0JCQljb25zdCB2b2lkICpzb3VyY2UsCi0JCQlpbnQgc3BhY2UsCi0JCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQl1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgU1RBVEVfSFcgKHNkKS0+Y3B1ID0gTlVMTDsKLSAgcmV0dXJuIGh3X2lvX3dyaXRlX2J1ZmZlciAoaHcsIHNvdXJjZSwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKTsKLX0KLQotCi0MCi0vKiBBYm9ydCB0aGUgc2ltdWxhdGlvbiBzcGVjaWZ5aW5nIEhXIGFzIHRoZSByZWFzb24gKi8KLQotdm9pZAotaHdfdmFib3J0IChzdHJ1Y3QgaHcgKm1lLAotCSAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICB2YV9saXN0IGFwKQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICptc2c7Ci0gIC8qIGZpbmQgYW4gaWRlbnRpdHkgKi8KLSAgaWYgKG1lICE9IE5VTEwgJiYgaHdfcGF0aCAobWUpICE9IE5VTEwgJiYgaHdfcGF0aCAobWUpIFswXSAhPSAnXDAnKQotICAgIG5hbWUgPSBod19wYXRoIChtZSk7Ci0gIGVsc2UgaWYgKG1lICE9IE5VTEwgJiYgaHdfbmFtZSAobWUpICE9IE5VTEwgJiYgaHdfbmFtZSAobWUpWzBdICE9ICdcMCcpCi0gICAgbmFtZSA9IGh3X25hbWUgKG1lKTsKLSAgZWxzZSBpZiAobWUgIT0gTlVMTCAmJiBod19mYW1pbHkgKG1lKSAhPSBOVUxMICYmIGh3X2ZhbWlseSAobWUpWzBdICE9ICdcMCcpCi0gICAgbmFtZSA9IGh3X2ZhbWlseSAobWUpOwotICBlbHNlCi0gICAgbmFtZSA9ICJkZXZpY2UiOwotICAvKiBjb25zdHJ1Y3QgYW4gdXBkYXRlZCBmb3JtYXQgc3RyaW5nICovCi0gIG1zZyA9IGFsbG9jYSAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoIjogIikgKyBzdHJsZW4gKGZtdCkgKyAxKTsKLSAgc3RyY3B5IChtc2csIG5hbWUpOwotICBzdHJjYXQgKG1zZywgIjogIik7Ci0gIHN0cmNhdCAobXNnLCBmbXQpOwotICAvKiByZXBvcnQgdGhlIHByb2JsZW0gKi8KLSAgc2ltX2VuZ2luZV92YWJvcnQgKGh3X3N5c3RlbSAobWUpLAotCQkgICAgIFNUQVRFX0hXIChod19zeXN0ZW0gKG1lKSktPmNwdSwKLQkJICAgICBTVEFURV9IVyAoaHdfc3lzdGVtIChtZSkpLT5jaWEsCi0JCSAgICAgbXNnLCBhcCk7Ci19Ci0KLXZvaWQKLWh3X2Fib3J0IChzdHJ1Y3QgaHcgKm1lLAotCSAgY29uc3QgY2hhciAqZm10LAotCSAgLi4uKQotewotICB2YV9saXN0IGFwOwotICAvKiByZXBvcnQgdGhlIHByb2JsZW0gKi8KLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICBod192YWJvcnQgKG1lLCBmbXQsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci19Ci0KLXZvaWQKLXNpbV9od19hYm9ydCAoc3RydWN0IHNpbV9zdGF0ZSAqc2QsCi0JICAgICAgc3RydWN0IGh3ICptZSwKLQkgICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAgLi4uKQotewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0gIGlmIChtZSA9PSBOVUxMKQotICAgIHNpbV9lbmdpbmVfdmFib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsIGZtdCwgYXApOwotICBlbHNlCi0gICAgaHdfdmFib3J0IChtZSwgZm10LCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotCi0KLS8qIE1JU0Mgcm91dGluZXMgdG8gdGllIEhXIGludG8gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSAqLwotCi12b2lkCi1od19oYWx0IChzdHJ1Y3QgaHcgKm1lLAotCSBpbnQgcmVhc29uLAotCSBpbnQgc3RhdHVzKQotewotICBzdHJ1Y3Qgc2ltX3N0YXRlICpzZCA9IGh3X3N5c3RlbSAobWUpOwotICBzdHJ1Y3Qgc2ltX2h3ICpzaW0gPSBTVEFURV9IVyAoc2QpOwotICBzaW1fZW5naW5lX2hhbHQgKHNkLCBzaW0tPmNwdSwgTlVMTCwgc2ltLT5jaWEsIHJlYXNvbiwgc3RhdHVzKTsKLX0KLQotc3RydWN0IF9zaW1fY3B1ICoKLWh3X3N5c3RlbV9jcHUgKHN0cnVjdCBodyAqbWUpCi17Ci0gIHJldHVybiBTVEFURV9IVyAoaHdfc3lzdGVtIChtZSkpLT5jcHU7Ci19Ci0KLXZvaWQKLWh3X3RyYWNlIChzdHJ1Y3QgaHcgKm1lLAotCSAgY29uc3QgY2hhciAqZm10LAotCSAgLi4uKQotewotICBpZiAoaHdfdHJhY2VfcCAobWUpKSAvKiB0byBiZSBzdXJlLCB0byBiZSBzdXJlICovCi0gICAgewotICAgICAgdmFfbGlzdCBhcDsKLSAgICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChod19zeXN0ZW0gKG1lKSwgIiVzOiAiLCBod19wYXRoIChtZSkpOwotICAgICAgc2ltX2lvX2V2cHJpbnRmIChod19zeXN0ZW0gKG1lKSwgZm10LCBhcCk7Ci0gICAgICBzaW1faW9fZXByaW50ZiAoaHdfc3lzdGVtIChtZSksICJcbiIpOwotICAgICAgdmFfZW5kIChhcCk7Ci0gICAgfQotfQotCi0KLS8qIEJhc2VkIG9uIGdkYi00LjE3L3NpbS9wcGMvbWFpbi5jOnNpbV9pb19yZWFkX3N0ZGluKCkgKi8KLQotaW50Ci1kb19od19wb2xsX3JlYWQgKHN0cnVjdCBodyAqbWUsCi0JCSBkb19od19wb2xsX3JlYWRfbWV0aG9kICpyZWFkLAotCQkgaW50IHNpbV9pb19mZCwKLQkJIHZvaWQgKmJ1ZiwKLQkJIHVuc2lnbmVkIHNpemVvZl9idWYpCi17Ci0gIGludCBzdGF0dXMgPSByZWFkIChod19zeXN0ZW0gKG1lKSwgc2ltX2lvX2ZkLCBidWYsIHNpemVvZl9idWYpOwotICBpZiAoc3RhdHVzID4gMCkKLSAgICByZXR1cm4gc3RhdHVzOwotICBlbHNlIGlmIChzdGF0dXMgPT0gMCAmJiBzaXplb2ZfYnVmID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UgaWYgKHN0YXR1cyA9PSAwKQotICAgIHJldHVybiBIV19JT19FT0Y7Ci0gIGVsc2UgLyogc3RhdHVzIDwgMCAqLwotICAgIHsKLSNpZmRlZiBFQUdBSU4KLSAgICAgIGlmIChTVEFURV9DQUxMQkFDSyAoaHdfc3lzdGVtIChtZSkpLT5sYXN0X2Vycm5vID09IEVBR0FJTikKLQlyZXR1cm4gSFdfSU9fTk9UX1JFQURZOwotICAgICAgZWxzZQotCXJldHVybiBIV19JT19FT0Y7Ci0jZWxzZQotICAgICAgcmV0dXJuIEhXX0lPX0VPRjsKLSNlbmRpZgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWh3LmggYi9zaW0vY29tbW9uL3NpbS1ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmViZDE4Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWh3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBEZXZpY2UgZGVmaW5pdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFNJTV9IV19ICi0jZGVmaW5lIFNJTV9IV19ICi0KLQotLyogRXN0YWJsaXNoIHRoaXMgb2JqZWN0ICovCi0KLVNJTV9SQyBzaW1faHdfaW5zdGFsbAotKHN0cnVjdCBzaW1fc3RhdGUgKnNkKTsKLQotCi0vKiBQYXJzZSBhIGhhcmR3YXJlIGRlZmluaXRpb24gKi8KLQotc3RydWN0IGh3ICpzaW1faHdfcGFyc2UKLShzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLSBjb25zdCBjaGFyICpmbXQsCi0gLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0KLQotLyogUHJpbnQgdGhlIGhhcmR3YXJlIHRyZWUgKi8KLQotdm9pZCBzaW1faHdfcHJpbnQKLShzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKLSB2b2lkICgqcHJpbnQpIChzdHJ1Y3Qgc2ltX3N0YXRlICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCBhcCkpOwotCi0KLS8qIEFib3J0IHRoZSBzaW11bGF0aW9uIHNwZWNpZnlpbmcgSFcgYXMgdGhlIHJlYXNvbiAqLwotCi12b2lkIHNpbV9od19hYm9ydAotKFNJTV9ERVNDIHNkLAotIHN0cnVjdCBodyAqaHcsCi0gY29uc3QgY2hhciAqZm10LAotIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotCi0KLQotLyogQ1BVOiBUaGUgc2ltdWxhdGlvbiBpcyBydW5uaW5nIGFuZCB0aGUgY3VycmVudCBDUFUvQ0lBCi0gICBpbml0aWF0ZXMgYSBkYXRhIHRyYW5zZmVyLiAqLwotCi12b2lkIHNpbV9jcHVfaHdfaW9fcmVhZF9idWZmZXIKLShzaW1fY3B1ICpjcHUsCi0gc2ltX2NpYSBjaWEsCi0gc3RydWN0IGh3ICpodywKLSB2b2lkICpkZXN0LAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi12b2lkIHNpbV9jcHVfaHdfaW9fd3JpdGVfYnVmZmVyCi0oc2ltX2NwdSAqY3B1LAotIHNpbV9jaWEgY2lhLAotIHN0cnVjdCBodyAqaHcsCi0gY29uc3Qgdm9pZCAqc291cmNlLAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi0KLQotLyogU1lTVEVNOiBBIGRhdGEgdHJhbnNmZXIgaXMgYmVpbmcgaW5pdGlhdGVkIGJ5IHRoZSBzeXN0ZW0uICovCi0KLXVuc2lnbmVkIHNpbV9od19pb19yZWFkX2J1ZmZlcgotKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAotIHN0cnVjdCBodyAqaHcsCi0gdm9pZCAqZGVzdCwKLSBpbnQgc3BhY2UsCi0gdW5zaWduZWRfd29yZCBhZGRyLAotIHVuc2lnbmVkIG5yX2J5dGVzKTsKLQotdW5zaWduZWQgc2ltX2h3X2lvX3dyaXRlX2J1ZmZlcgotKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAotIHN0cnVjdCBodyAqaHcsCi0gY29uc3Qgdm9pZCAqc291cmNlLAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taW5mby5jIGIvc2ltL2NvbW1vbi9zaW0taW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDgzMjI3Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgZm9yIGhhcmR3YXJlIHNpbXVsYXRvciBtb2RlbHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2luZm8gdGhhdCB3b3JrcyB3aXRoIHNpbXVsYXRvcnMgdXNpbmcKLSAgIHNpbS1tb2R1bGUuICovCi0KLXZvaWQKLXNpbV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpCi17Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHNpbV9tb2R1bGVfaW5mbyAoc2QsIHZlcmJvc2UgfHwgU1RBVEVfVkVSQk9TRV9QIChzZCkpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taW5saW5lLmMgYi9zaW0vY29tbW9uL3NpbS1pbmxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYzY1ZS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1pbmxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBTSU1fSU5MSU5FX0MKLSNkZWZpbmUgU0lNX0lOTElORV9DCi0KLSN1bmRlZiBTSU1fSU5MSU5FX1AKLSNkZWZpbmUgU0lNX0lOTElORV9QIDEKLQotI2luY2x1ZGUgInNpbS1pbmxpbmUuaCIKLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0KLSNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9CSVRTX0lOTElORSkKLSNpbmNsdWRlICJzaW0tYml0cy5jIgotI2VuZGlmCi0KLQotI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0NPUkVfSU5MSU5FKQotI2luY2x1ZGUgInNpbS1jb3JlLmMiCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fRU5ESUFOX0lOTElORSkKLSNpbmNsdWRlICJzaW0tZW5kaWFuLmMiCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fRVZFTlRTX0lOTElORSkKLSNpbmNsdWRlICJzaW0tZXZlbnRzLmMiCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fRlBVX0lOTElORSkKLSNpbmNsdWRlICJzaW0tZnB1LmMiCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fVFlQRVNfSU5MSU5FKQotI2luY2x1ZGUgInNpbS10eXBlcy5jIgotI2VuZGlmCi0KLQotI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoU0lNX01BSU5fSU5MSU5FKQotI2luY2x1ZGUgInNpbS1tYWluLmMiCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChFTkdJTkVfSU5MSU5FKQotLyogI2luY2x1ZGUgImVuZ2luZS5jIiAtIGhhbmRsZWQgYnkgZ2VuZXJhdG9yICovCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChJQ0FDSEVfSU5MSU5FKQotLyogI2luY2x1ZGUgImljYWNoZS5jIiAtIGhhbmRsZWQgYnkgZ2VuZXJhdG9yICovCi0jZW5kaWYKLQotCi0jaWYgQ19SRVZFQUxTX01PRFVMRV9QIChJREVDT0RFX0lOTElORSkKLS8qICNpbmNsdWRlICJpZGVjb2RlLmMiIC0gaGFuZGxlZCBieSBnZW5lcmF0b3IgKi8KLSNlbmRpZgotCi0KLSNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNFTUFOVElDU19JTkxJTkUpCi0vKiAjaW5jbHVkZSAic2VtYW50aWNzLmMiIC0gaGFuZGxlZCBieSBnZW5lcmF0b3IgKi8KLSNlbmRpZgotCi0KLSNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNVUFBPUlRfSU5MSU5FKQotLyogI2luY2x1ZGUgInN1cHBvcnQuYyIgLSBoYW5kbGVkIGJ5IGdlbmVyYXRvciAqLwotI2VuZGlmCi0KLQotI3VuZGVmIFNJTV9JTkxJTkVfUAotI2RlZmluZSBTSU1fSU5MSU5FX1AgMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWlubGluZS5oIGIvc2ltL2NvbW1vbi9zaW0taW5saW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDY1OGQuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0taW5saW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MTAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIFNJTV9JTkxJTkVfSAotI2RlZmluZSBTSU1fSU5MSU5FX0gKLQotCi0vKiBJTkxJTkUgQ09ERSBTRUxFQ1RJT046Ci0KLSAgIEdDQyAtTzMgYXR0ZW1wdHMgdG8gaW5saW5lIGFueSBmdW5jdGlvbiBvciBwcm9jZWR1cmUgaW4gc2NvcGUuICBUaGUKLSAgIG9wdGlvbnMgYmVsb3cgZmFjaWxpdGF0ZSBmaW5lciBncmFpbmVkIGNvbnRyb2wgb3ZlciB3aGF0IGlzIGFuZAotICAgd2hhdCBpcyBub3QgaW5saW5lZC4gIEluIHBhcnRpY3VsYXIsIGl0IGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mCi0gICBtb2R1bGVzIGZvciBpbmxpbmluZy4gIERvaW5nIHRoaXMgYWxsb3dzIHRoZSBjb21waWxlciB0byBib3RoCi0gICBlbGltaW5hdGUgdGhlIG92ZXJoZWFkIG9mIGZ1bmN0aW9uIGNhbGxzIGFuZCAoYXMgYSBjb25zZXF1ZW5jZSkKLSAgIGFsc28gZWxpbWluYXRlIGZ1cnRoZXIgZGVhZCBjb2RlLgotCi0gICBPbiBhIENJU0MgKHg4NikgSSd2ZSBmb3VuZCB0aGF0IEkgY2FuIGFjaGlldmUgYW4gb3JkZXIgb2YgbWFnaW50dWRlCi0gICBzcGVlZCBpbXByb3ZlbWVudCAoeDMteDUpLiAgSW4gdGhlIGNhc2Ugb2YgUklTQyAoc3BhcmMpIHdoaWxlIHRoZQotICAgcGVyZm9ybWFuY2UgZ2FpbiBpc24ndCBhcyBncmVhdCBpdCBpcyBzdGlsbCBzaWduaWZpY2FudC4KLQotICAgRWFjaCBtb2R1bGUgaXMgY29udHJvbGVkIGJ5IHRoZSBtYWNybyA8bW9kdWxlPl9JTkxJTkUgd2hpY2ggY2FuCi0gICBoYXZlIHRoZSB2YWx1ZXMgZGVzY3JpYmVkIGJlbG93Ci0KLSAgICAgICAwIChaRVJPKQotCi0gICAgICAgICBEbyBub3QgaW5saW5lIGFueSB0aGluZyBmb3IgdGhlIGdpdmVuIG1vZHVsZQotCi0gICBUaGUgZm9sbG93aW5nIGJpdCBmaWVsZHMgdmFsdWVzIGNhbiBiZSBjb21iaW5lZDoKLQotICAgICAgSF9SRVZFQUxTX01PRFVMRToKLSAgICAgIENfUkVWRUFMU19NT0RVTEU6Ci0KLSAgICAgICAgIEluY2x1ZGUgdGhlIEMgZmlsZSBmb3IgdGhlIG1vZHVsZSBpbnRvIHRoZSBmaWxlIGJlaW5nCi0gICAgICAgICBjb21waWxlZC4gIFRoZSBhY3R1YWwgaW5saW5pbmcgaXMgY29udHJvbGxlZCBzZXBhcmF0bHkuCi0KLQkgV2hpbGUgb2Ygbm8gYXBwYXJlbnQgYmVuZWZpdCwgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlCi0JIGluY2x1ZGVkIG1vZHVsZSwgd2hlbiBjb21waWxlZCwgdG8gaW5saW5lIGl0cyBjYWxscyB0byB3aGF0Ci0JIHdvdWxkIG90aGVyd2l6ZSBiZSBleHRlcm5hbCBmdW5jdGlvbnMuCi0KLQkge0NfLEhffSBEZXRlcm1pbmVzIHdoZXJlIHRoZSBtb2R1bGUgaXMgaW5saW5lZC4gIEEKLQkgSF9SRVZFQUxTX01PRFVMRSB3aWxsIGJlIGluY2x1ZGVkIGV2ZXJ5d2hlcmUuCi0KLSAgICAgIElOTElORV9HTE9CQUxTOgotCi0gICAgICAgICBNYWtlIGV4dGVybmFsIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIG1vZHVsZSBgaW5saW5lJy4gIFRodXMgaWYKLSAgICAgICAgIHRoZSBtb2R1bGUgaXMgaW5jbHVkZWQgaW50byBhIGZpbGUgYmVpbmcgY29tcGlsZWQsIGNhbGxzIHRvCi0JIHRoZSBpbmNsdWRlZCBtb2R1bGVzIGZ1bnRpb25zIGNhbiBiZSBlbGltaW5hdGVkLiAgSU5MSU5FX01PRFVMRQotCSBpbXBsaWVzIFJFVkVBTF9NT0RVTEUuCi0KLSAgICAgIElOTElORV9MT0NBTFM6Ci0KLSAgICAgICAgIE1ha2UgaW50ZXJuYWwgKHN0YXRpYykgZnVuY3Rpb25zIHdpdGhpbiB0aGUgbW9kdWxlIGBpbmxpbmUnLgotCi0KLSAgIENPRElORyBTVFlMRToKLQotICAgVGhlIGlubGluZSBhYmlsaXR5IGlzIGVuYWJsZWQgYnkgc3BlY2lmeWluZyBldmVyeSBkYXRhIGFuZCBmdW5jdGlvbgotICAgZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24gdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotCi0gICAgICAgR0xPQkFMIElOTElORSBGVU5DVElPTlM6Ci0KLSAgICAgICAgICBTdWNoIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kIHVzZWQgaGVhdmlseS4gIElubGluaW5nIHRoZW0KLSAgICAgICAgICB3aWxsIGVsaW1pbmF0ZSBhbiB1bm5lY2Vzc2FyeSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0JICAuaDogSU5MSU5FX09VUlBLRyAodm9pZCkgb3VycGtnX2Z1bmMKLQkgICAgICAoaW50IHgsCi0JICAgICAgIGludCB5KTsKLQotCSAgLmM6IElOTElORV9PVVJQS0cgKHZvaWQpCi0JICAgICAgb3VycGtnX2Z1bmMgKGludCB4LAotCSAgICAgICAgICAgICAgICAgICBpbnQgeSkKLQkgICAgICB7Ci0JICAgICAgICAuLi4KLQkgICAgICB9Ci0KLQotICAgICAgIEdMT0JBTCBJTkxJTkUgVkFSSUFCTEVTOgotCi0gICAgICAgICAgVGhpcyBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZS4KLQotCi0gICAgICAgR0xPQkFMIE5PTi1JTkxJTkUgKEVYVEVSTikgRlVOQ1RJT05TIEFORCBWQVJJQUJMRVM6Ci0KLSAgICAgICAgICBUaGVzZSBpbmNsdWRlIGZ1bmN0aW9ucyB3aXRoIHZhcmFyZ3MgcGFyYW1ldGVycy4gIEl0IGNhbgotICAgICAgICAgIGFsc28gaW5jbHVkZSBsYXJnZSByYXJlbHkgdXNlZCBmdW5jdGlvbnMgdGhhdCBjb250cmlidXRlCi0gICAgICAgICAgbGl0dGxlIHdoZW4gaW5saW5lZC4KLQotCSAgLmg6IGV4dGVybiBpbnQgb3VycGtnX3ByaW50Ci0JICAgICAgKGNoYXIgKmZtdCwgLi4uKTsKLQkgICAgICBleHRlcm4gaW50IGFfZ2xvYmFsX3ZhcmlhYmxlOwotCi0JICAuYzogI2lmIEVYVEVSTl9PVVJQS0dfUAotCSAgICAgIGludAotCSAgICAgIG91cnBrZ19wcmludCAoY2hhciAqZm10LAotCSAgICAgICAgICAgICAgICAgICAgLi4uKQotICAgICAgICAgICAgICB7Ci0JICAgICAgICAgLi4uCi0JICAgICAgfQotCSAgICAgICNlbmRpZgotCSAgICAgICNpZiBFWFRFUk5fT1VSUEtHX1AKLQkgICAgICBpbnQgYV9nbG9iYWxfdmFyaWFibGUgPSAxOwotCSAgICAgICNlbmRpZgotCi0KLSAgICAgICBMT0NBTCAoU1RBVElDKSBGVU5DVElPTlM6Ci0KLSAgICAgICAgICBUaGVzZSBjYW4gZWl0aGVyIGJlIG1hcmtlZCBpbmxpbmUgb3IganVzdCBzdGF0aWMgc3RhdGljIHZpczoKLQotCSAgLmg6IFNUQVRJQ19JTkxJTkVfT1VSUEtHIChpbnQpIG91cnBrZ19zdGF0aWNmICh2b2lkKTsKLQkgIC5jOiBTVEFUSUNfSU5MSU5FX09VUlBLRyAoaW50KQotCSAgICAgIG91cnBrZ19zdGF0aWNmICh2b2lkKQotCSAgICAgIHsKLQkgICAgICAgIC4uCi0JICAgICAgfQotCi0JICAuaDogU1RBVElDX09VUlBLRyAoaW50KSBvdXJwa2dfc3RhdGljZiAodm9pZCk7Ci0JICAuYzogU1RBVElDX09VUlBLRyAoaW50KQotCSAgICAgIG91cnBrZ19zdGF0aWNmICh2b2lkKQotCSAgICAgIHsKLQkgICAgICAgIC4uCi0JICAgICAgfQotCi0KLSAgICAgICBBbGwgLmggZmlsZXM6Ci0KLQotICAgICAgICAgIEFsbCBtb2R1bGVzIG11c3Qgd3JhcCB0aGVpciAuaCBjb2RlIGluIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICNpZm5kZWYgT1VSUEtHX0gKLQkgICNkZWZpbmUgT1VSUEtHX0gKLQkgIC4uLiBjb2RlIHByb3BlciAuLi4KLQkgICNlbmRpZgotCi0gICAgICAgICAgSW4gYWRkaXRpb24sIG1vZHVsZXMgdGhhdCB3YW50IHRvIGFsbG93IGdsb2JhbCBpbmxpbmluZyBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSB0aGUgbGluZXMgKGJlbG93KSBhdCB0aGUgZW5kIG9mIHRoZSAuaCBmaWxlLiAoRklYTUU6Ci0gICAgICAgICAgU2hvdWxkbid0IGJlIG5lZWRlZCkuCi0KLSAgICAgICAgICAjaWYgSF9SRVZFQUxTX01PRFVMRV9QIChPVVJQS0dfSU5MSU5FKQotICAgICAgICAgICNpbmNsdWRlICJvdXJwa2cuYyIKLSAgICAgICAgICAjZW5kaWYKLQotCi0gICAgICAgQWxsIC5jIGZpbGVzOgotCi0gICAgICAgICAgQWxsIG1vZHVsZXMgbXVzdCB3cmFwIHRoZWlyIC5jIGNvZGUgaW4gdGhlIGZvbGxvd2luZwotCi0JICAjaWZuZGVmIE9VUlBLR19DCi0JICAjZGVmaW5lIE9VUlBLR19DCi0JICAuLi4gY29kZSBwcm9wZXIgLi4uCi0JICAjZW5kaWYKLQotCi0gICBOT1cgSVQgV09SS1M6Ci0KLSAgICAgIDA6Ci0KLSAgICAgIFNpbmNlIG5vIGlubGluaW5nIGlzIGRlZmluZWQuIEFsbCBtYWNybydzIGdldCBzdGFuZGFyZCBkZWZhdWx0cwotICAgICAgKGV4dGVybiwgc3RhdGljLCAuLi4pLgotICAgICAgCi0KLQotICAgICAgSF9SRVZFQUxTX01PRFVMRSAoYWx0IGluY2x1ZGVzIG91cik6Ci0KLQotICAgICAgYWx0cHJvZy5jIGRlZmluZXMgQUxUUFJPR19DIGFuZCB0aGVuIGluY2x1ZGVzIHNpbS1pbmxpbmUuaC4KLQotICAgICAgSW4gc2ltLWlubGluZS5oIHRoZSBleHByZXNzaW9uIGBgIEhfUkVWRUFMU19NT0RVTEVfUAotICAgICAgKE9VUlBST0dfSU5MSU5FKSAmJiAhICBkZWZpbmVkIChPVVJQUk9HX0MpICYmIFJFVkVBTF9NT0RVTEVfUAotICAgICAgKE9VUlBST0dfSU5MSU5FKSAnJyBpcyBUUlVFIHNvIGl0IGRlZmluZXMgKl9PVVJQUk9HIGFzIHN0YXRpYwotICAgICAgYW5kIEVYVEVSTl9PVVJQUk9HX1AgYXMgRkFMU0UuCi0KLSAgICAgIGFsdHByb2cuYyBpbmNsdWRlcyBvdXJwcm9nLmguCi0KLSAgICAgIEluIG91cnByb2cuaCB0aGUgZXhwcmVzc2lvbiBgYEhfUkVWRUFMU19NT0RVTEVfUAotICAgICAgKE9VUlBST0dfSU5MSU5FKScnIGlzIFRSVUUgc28gaXQgaW5jbHVkZXMgb3VycHJvZy5jLgotCi0gICAgICBDb25zZXF1ZW50bHksIGFsbCB0aGUgY29kZSBpbiBvdXJwcm9nLmMgaXMgdmlzaWJsZSBhbmQgc3RhdGljIGluCi0gICAgICB0aGUgZmlsZSBhbHRwcm9nLmMKLQotCi0KLSAgICAgIEhfUkVWRUFMU19NT0RVTEUgKG91ciBpbmNsdWRlcyBvdXIpOgotCi0KLSAgICAgIG91cnByb2cuYyBkZWZpbmVzIE9VUlBST0dfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmguCi0KLSAgICAgIEluIHNpbS1pbmxpbmUuaCB0aGUgdGVybSBgYCAhIGRlZmluZWQgKE9VUlBST0dfQykgJycgaXMgRkFMU0Ugc28KLSAgICAgIGl0IGRlZmluZXMgKl9PVVJQUk9HIGFzIG5vbi1zdGF0aWMgYW5kIEVYVEVSTl9PVVJQUk9HX1AgYXMgVFJVRS4KLQotICAgICAgb3VycHJvZy5jIGluY2x1ZGVzIG91cnByb2cuaC4KLQotICAgICAgSW4gb3VycHJvZy5oIHRoZSBleHByZXNzaW9uIGBgSF9SRVZFQUxTX01PRFVMRV9QCi0gICAgICAoT1VSUFJPR19JTkxJTkUpJycgaXMgdHJ1ZSBzbyBpdCBpbmNsdWRlcyBvdXJwcm9nLmMuCi0KLSAgICAgIEluIG91cnByb2cuYyAoc2Vjb25kIGluY2x1ZGUpIHRoZSBleHByZXNzaW9uIGRlZmluZWQgKE9VUlBST0dfQykKLSAgICAgIGFuZCBzbyB0aGUgYm9keSBpcyBub3QgcmUtaW5jbHVkZWQuCi0KLSAgICAgIENvbnNlcXVlbnRseSwgb3VycHJvZy5vIHdpbGwgY29udGFpbiBhIG5vbi1zdGF0aWMgY29weSBvZiBhbGwKLSAgICAgIHRoZSBleHBvcnRlZCBzeW1ib2xzLgotCi0KLQotICAgICAgQ19SRVZFQUxTX01PRFVMRSAoYWx0IGluY2x1ZGVzIG91cik6Ci0KLQotICAgICAgYWx0cHJvZy5jIGRlZmluZXMgQUxUUFJPR19DIGFuZCB0aGVuIGluY2x1ZGVzIHNpbS1pbmxpbmUuYwotCi0gICAgICBzaW0taW5saW5lLmMgZGVmaW5lcyBDX0lOTElORV9DIGFuZCB0aGVuIGluY2x1ZGVzIHNpbS1pbmxpbmUuaAotICAgICAgCi0gICAgICBJbiBzaW0taW5saW5lLmggdGhlIGV4cHJlc3Npb24gYGAgZGVmaW5lZCAoU0lNX0lOTElORSkgJiYgIQotICAgICAgZGVmaW5lZCAoT1VSUFJPR19DKSAmJiBSRVZFQUxfTU9EVUxFX1AgKE9VUlBST0dfSU5MSU5FKSAnJyBpcwotICAgICAgdHJ1ZSBzbyBpdCBkZWZpbmVzICpfT1VSUFJPRyBhcyBzdGF0aWMgYW5kIEVYVEVSTl9PVVJQUk9HX1AgYXMKLSAgICAgIEZBTFNFLgotCi0gICAgICBJbiBzaW0taW5saW5lLmMgdGhlIGV4cHJlc3Npb24gYGBDX1JFVkVBTFNfTU9EVUxFX1AKLSAgICAgIChPVVJQUk9HX0lOTElORSknJyBpcyB0cnVlIHNvIGl0IGluY2x1ZGVzIG91cnByb2cuYy4KLQotICAgICAgQ29uc2VxdWVudGx5LCBhbGwgdGhlIGNvZGUgaW4gb3VycHJvZy5jIGlzIHZpc2libGUgYW5kIHN0YXRpYyBpbgotICAgICAgdGhlIGZpbGUgYWx0cHJvZy5jLgotCi0KLQotICAgICAgQ19SRVZFQUxTX01PRFVMRSAob3VyIGluY2x1ZGVzIG91cik6Ci0KLQotICAgICAgb3VycHJvZy5jIGRlZmluZXMgT1VSUFJPR19DIGFuZCB0aGVuIGluY2x1ZGVzIHNpbS1pbmxpbmUuYwotCi0gICAgICBzaW0taW5saW5lLmMgZGVmaW5lcyBDX0lOTElORV9DIGFuZCB0aGVuIGluY2x1ZGVzIHNpbS1pbmxpbmUuaAotICAgICAgCi0gICAgICBJbiBzaW0taW5saW5lLmggdGhlIHRlcm0gYGAgISAgZGVmaW5lZCAoT1VSUFJPR19DKSAnJyBpcyBGQUxTRQotICAgICAgc28gaXQgZGVmaW5lcyAqX09VUlBST0cgYXMgbm9uLXN0YXRpYyBhbmQgRVhURVJOX09VUlBST0dfUCBhcwotICAgICAgVFJVRS4KLQotICAgICAgQ29uc2VxdWVudGx5LCBvdXJwcm9nLm8gd2lsbCBjb250YWluIGEgbm9uLXN0YXRpYyBjb3B5IG9mIGFsbAotICAgICAgdGhlIGV4cG9ydGVkIHN5bWJvbHMuCi0KLQotCi0gICBSRUFMSVRZIENIRUNLOgotCi0gICBUaGlzIGlzIG5vdCBmb3IgdGhlIGZhaW50IGhlYXJ0ZWQuICBJJ3ZlIHNlZW4gR0NDIGdldCB1cCB0byA1MDBtYgotICAgdHJ5aW5nIHRvIGNvbXBpbGUgd2hhdCB0aGlzIGNhbiBjcmVhdGUuICovCi0MCi0jZGVmaW5lIEhfUkVWRUFMU19NT0RVTEUJCTEKLSNkZWZpbmUgQ19SRVZFQUxTX01PRFVMRQkJMgotI2RlZmluZSBJTkxJTkVfR0xPQkFMUwkJCTQKLSNkZWZpbmUgSU5MSU5FX0xPQ0FMUwkJCTgKLQotI2RlZmluZSBSRUdQQVJNX01PRFVMRSAgICAgICAgICAgICAgICAgMzIKLQotI2RlZmluZSBBTExfSF9JTkxJTkUgKEhfUkVWRUFMU19NT0RVTEUgfCBJTkxJTkVfR0xPQkFMUyB8IElOTElORV9MT0NBTFMpCi0jZGVmaW5lIEFMTF9DX0lOTElORSAoQ19SRVZFQUxTX01PRFVMRSB8IElOTElORV9HTE9CQUxTIHwgSU5MSU5FX0xPQ0FMUykKLQotCi0vKiBEZWZhdWx0IG1hY3JvIHRvIHNpbXBsaWZ5IGNvbnRyb2wgc2V2ZXJhbCBvZiBrZXkgdGhlIGlubGluZXMgKi8KLQotI2lmbmRlZiBERUZBVUxUX0lOTElORQotI2RlZmluZQlERUZBVUxUX0lOTElORQkJCUlOTElORV9MT0NBTFMKLSNlbmRpZgotCi0jZGVmaW5lIFJFVkVBTF9NT0RVTEVfUChYKSAoWCAmIChIX1JFVkVBTFNfTU9EVUxFIHwgQ19SRVZFQUxTX01PRFVMRSkpCi0jZGVmaW5lIEhfUkVWRUFMU19NT0RVTEVfUChYKSAoKFggJiBIX1JFVkVBTFNfTU9EVUxFKSkKLSNkZWZpbmUgQ19SRVZFQUxTX01PRFVMRV9QKFgpICgoWCAmIENfUkVWRUFMU19NT0RVTEUpKQotCi0KLSNpZm5kZWYgSEFWRV9JTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX0lOTElORQotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBZb3VyIGNvbXBpbGVycyBpbmxpbmUgcHJlZml4ICovCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fT1BUSU1JWkVfXykKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORSAvKmlubGluZSovCi0jZW5kaWYKLSNlbmRpZgotCi0vKiA/Pz8gVGVtcG9yYXJ5LCBwZW5kaW5nIGRlY2lzaW9uIHRvIGFsd2F5cyB1c2UgZXh0ZXJuIGlubGluZSBhbmQgZG8gYSB2YXN0Ci0gICBjbGVhbnVwIG9mIGlubGluZSBzdXBwb3J0LiAgKi8KLSNpZm5kZWYgSU5MSU5FMgotI2lmIGRlZmluZWQgKF9fR05VQ19fKQotI2RlZmluZSBJTkxJTkUyIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORTIgLyppbmxpbmUqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBZb3VyIGNvbXBpbGVyJ3Mgc3RhdGljIGlubGluZSBwcmVmaXggKi8KLQotI2lmbmRlZiBTVEFUSUNfSU5MSU5FCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkUgc3RhdGljIElOTElORQotI2VuZGlmCi0KLQotLyogWW91ciBjb21waWxlcidzIGV4dGVybiBpbmxpbmUgcHJlZml4ICovCi0KLSNpZm5kZWYgRVhURVJOX0lOTElORQotI2RlZmluZSBFWFRFUk5fSU5MSU5FIGV4dGVybiBJTkxJTkUyCi0jZW5kaWYKLQotCi0vKiBZb3VyIGNvbXBpbGVyJ3Mgbm8tcmV0dXJuIHJlc2VydmVkIHdvcmQgKi8KLQotI2lmbmRlZiBOT1JFVFVSTgotI2RlZmluZSBOT1JFVFVSTgotI2VuZGlmCi0KLQotCi0vKiBZb3VyIGNvbXBpbGVycydzIHVudXNlZCByZXNlcnZlZCB3b3JkICovCi0KLSNpZiAhZGVmaW5lZCAoVU5VU0VEKQotI2lmICghZGVmaW5lZCAoX19HTlVDX18pIFwKLSAgICAgfHwgKF9fR05VQ19fIDwgMikgXAotICAgICB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpKQotI2RlZmluZSBVTlVTRUQKLSNlbHNlCi0jZGVmaW5lIFVOVVNFRCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKLSNlbmRpZgotI2VuZGlmCi0KLQotCi0KLS8qIFlvdXIgY29tcGlsZXJzIG5vbnN0YW5kYXJkIGZ1bmN0aW9uIGNhbGwgbWVjaGFuaXNtIHByZWZpeCAqLwotCi0jaWYgIWRlZmluZWQgUkVHUEFSTQotI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAoZGVmaW5lZCAoX19pMzg2X18pIHx8IGRlZmluZWQgKF9faTQ4Nl9fKSB8fCBkZWZpbmVkIChfX2k1ODZfXykgfHwgZGVmaW5lZCAoX19pNjg2X18pKQotI2lmIChXSVRIX1JFR1BBUk0gJiYgV0lUSF9TVERDQUxMKQotI2RlZmluZSBSRUdQQVJNIF9fYXR0cmlidXRlX18oKF9fcmVncGFybV9fKFdJVEhfUkVHUEFSTSksX19zdGRjYWxsX18pKQotI2Vsc2UKLSNpZiAoV0lUSF9SRUdQQVJNICYmICFXSVRIX1NURENBTEwpCi0jZGVmaW5lIFJFR1BBUk0gX19hdHRyaWJ1dGVfXygoX19yZWdwYXJtX18oV0lUSF9SRUdQQVJNKSkpCi0jZWxzZQotI2lmICghV0lUSF9SRUdQQVJNICYmIFdJVEhfU1REQ0FMTCkKLSNkZWZpbmUgUkVHUEFSTSBfX2F0dHJpYnV0ZV9fKChfX3N0ZGNhbGxfXykpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgUkVHUEFSTQotI2RlZmluZSBSRUdQQVJNCi0jZW5kaWYKLQotCi0MCi0vKiAqKioqKgotICAgc2ltLWJpdHMgYW5kIHNpbS1lbmRpYW4gYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgcmVzdAotICAgb2YgdGhlIG1vZHVsZXMgYmVsb3cuICBUaGVpciBkZWZhdWx0IHZhbHVlIGlzIEFMTF9IX0lOTElORS4KLSAgIFRoZSByZXN0IGFyZSBBTExfQ19JTkxJTkUuICBEb24ndCBibGluaywgeW91J2xsIG1pc3MgaXQhCi0gICAqKioqKgotICAgKi8KLQotLyogc2ltLWJpdHMgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fQklUU19JTkxJTkUpICYmIChERUZBVUxUX0lOTElORSkKLSMgZGVmaW5lIFNJTV9CSVRTX0lOTElORSAoQUxMX0hfSU5MSU5FKQotI2VuZGlmCi0KLSNpZiAoU0lNX0JJVFNfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCi0jIGRlZmluZSBSRUdQQVJNX1NJTV9CSVRTIFJFR1BBUk0KLSNlbHNlCi0jIGRlZmluZSBSRUdQQVJNX1NJTV9CSVRTCi0jZW5kaWYKLQotI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fQklUU19JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKLSAgICAgJiYgIWRlZmluZWQgKFNJTV9CSVRTX0MpIFwKLSAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoU0lNX0JJVFNfSU5MSU5FKSkpCi0jIGlmIChTSU1fQklUU19JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKLSMgIGRlZmluZSBJTkxJTkVfU0lNX0JJVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9TSU1fQklUU19QIDAKLSMgZWxzZQotIyAgZGVmaW5lIElOTElORV9TSU1fQklUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TSU1fQklUUwotIyAgZGVmaW5lIEVYVEVSTl9TSU1fQklUU19QIDAKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfU0lNX0JJVFMoVFlQRSkgVFlQRSBSRUdQQVJNX1NJTV9CSVRTCi0jIGRlZmluZSBFWFRFUk5fU0lNX0JJVFNfUCAxCi0jZW5kaWYKLQotI2lmIChTSU1fQklUU19JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fQklUUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9CSVRTKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0lNX0JJVFMKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRJQ19TSU1fQklUUyhUWVBFKSBzdGF0aWMgVFlQRQotCi0KLQotLyogc2ltLWNvcmUgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fQ09SRV9JTkxJTkUpICYmIChERUZBVUxUX0lOTElORSkKLSMgZGVmaW5lIFNJTV9DT1JFX0lOTElORSBBTExfQ19JTkxJTkUKLSNlbmRpZgotCi0jaWYgKFNJTV9DT1JFX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fQ09SRSBSRUdQQVJNCi0jZWxzZQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fQ09SRQotI2VuZGlmCi0KLSNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0NPUkVfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCi0gICAgICYmICFkZWZpbmVkIChTSU1fQ09SRV9DKSBcCi0gICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9DT1JFX0lOTElORSkpKQotIyBpZiAoU0lNX0NPUkVfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCi0jICBkZWZpbmUgSU5MSU5FX1NJTV9DT1JFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU0lNX0NPUkVfUCAwCi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9TSU1fQ09SRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TSU1fQ09SRQotIyAgZGVmaW5lIEVYVEVSTl9TSU1fQ09SRV9QIDAKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9TSU1fQ09SRShUWVBFKSBUWVBFIFJFR1BBUk1fU0lNX0NPUkUKLSMgZGVmaW5lIEVYVEVSTl9TSU1fQ09SRV9QIDEKLSNlbmRpZgotCi0jaWYgKFNJTV9DT1JFX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9DT1JFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0NPUkUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TSU1fQ09SRQotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDX1NJTV9DT1JFKFRZUEUpIHN0YXRpYyBUWVBFCi0KLQotCi0vKiBzaW0tZW5kaWFuICovCi0KLSNpZiAhZGVmaW5lZCAoU0lNX0VORElBTl9JTkxJTkUpICYmIChERUZBVUxUX0lOTElORSkKLSMgZGVmaW5lIFNJTV9FTkRJQU5fSU5MSU5FIEFMTF9IX0lOTElORQotI2VuZGlmCi0KLSNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKLSMgZGVmaW5lIFJFR1BBUk1fU0lNX0VORElBTiBSRUdQQVJNCi0jZWxzZQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fRU5ESUFOCi0jZW5kaWYKLQotI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fRU5ESUFOX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAotICAgICAmJiAhZGVmaW5lZCAoU0lNX0VORElBTl9DKSBcCi0gICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9FTkRJQU5fSU5MSU5FKSkpCi0jIGlmIChTSU1fRU5ESUFOX0lOTElORSAmIElOTElORV9HTE9CQUxTKQotIyAgZGVmaW5lIElOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU0lNX0VORElBTl9QIDAKLSMgZWxzZQotIyAgZGVmaW5lIElOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX1NJTV9FTkRJQU4KLSMgIGRlZmluZSBFWFRFUk5fU0lNX0VORElBTl9QIDAKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfU0lNX0VORElBTihUWVBFKSBUWVBFIFJFR1BBUk1fU0lNX0VORElBTgotIyBkZWZpbmUgRVhURVJOX1NJTV9FTkRJQU5fUCAxCi0jZW5kaWYKLQotI2lmIChTSU1fRU5ESUFOX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0lNX0VORElBTgotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIFRZUEUKLQotCi0KLS8qIHNpbS1ldmVudHMgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fRVZFTlRTX0lOTElORSkgJiYgKERFRkFVTFRfSU5MSU5FKQotIyBkZWZpbmUgU0lNX0VWRU5UU19JTkxJTkUgQUxMX0NfSU5MSU5FCi0jZW5kaWYKLQotI2lmIChTSU1fRVZFTlRTX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fRVZFTlRTIFJFR1BBUk0KLSNlbHNlCi0jIGRlZmluZSBSRUdQQVJNX1NJTV9FVkVOVFMKLSNlbmRpZgotCi0jaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9FVkVOVFNfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCi0gICAgICYmICFkZWZpbmVkIChTSU1fRVZFTlRTX0MpIFwKLSAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoU0lNX0VWRU5UU19JTkxJTkUpKSkKLSMgaWYgKFNJTV9FVkVOVFNfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCi0jICBkZWZpbmUgSU5MSU5FX1NJTV9FVkVOVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9TSU1fRVZFTlRTX1AgMAotIyBlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1NJTV9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX0VWRU5UUwotIyAgZGVmaW5lIEVYVEVSTl9TSU1fRVZFTlRTX1AgMAotIyBlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9TSU1fRVZFTlRTKFRZUEUpIFRZUEUgUkVHUEFSTV9TSU1fRVZFTlRTCi0jIGRlZmluZSBFWFRFUk5fU0lNX0VWRU5UU19QIDEKLSNlbmRpZgotCi0jaWYgKFNJTV9FVkVOVFNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0VWRU5UUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TSU1fRVZFTlRTCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUSUNfU0lNX0VWRU5UUyhUWVBFKSBzdGF0aWMgVFlQRQotCi0KLQotLyogc2ltLWZwdSAqLwotCi0jaWYgIWRlZmluZWQgKFNJTV9GUFVfSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCi0jIGRlZmluZSBTSU1fRlBVX0lOTElORSBBTExfQ19JTkxJTkUKLSNlbmRpZgotCi0jaWYgKFNJTV9GUFVfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCi0jIGRlZmluZSBSRUdQQVJNX1NJTV9GUFUgUkVHUEFSTQotI2Vsc2UKLSMgZGVmaW5lIFJFR1BBUk1fU0lNX0ZQVQotI2VuZGlmCi0KLSNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0ZQVV9JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKLSAgICAgJiYgIWRlZmluZWQgKFNJTV9GUFVfQykgXAotICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTSU1fRlBVX0lOTElORSkpKQotIyBpZiAoU0lNX0ZQVV9JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKLSMgIGRlZmluZSBJTkxJTkVfU0lNX0ZQVShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX1NJTV9GUFVfUCAwCi0jIGVsc2UKLSMgIGRlZmluZSBJTkxJTkVfU0lNX0ZQVShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TSU1fRlBVCi0jICBkZWZpbmUgRVhURVJOX1NJTV9GUFVfUCAwCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX1NJTV9GUFUoVFlQRSkgVFlQRSBSRUdQQVJNX1NJTV9GUFUKLSMgZGVmaW5lIEVYVEVSTl9TSU1fRlBVX1AgMQotI2VuZGlmCi0KLSNpZiAoU0lNX0ZQVV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fRlBVKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0ZQVShUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NJTV9GUFUKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRJQ19TSU1fRlBVKFRZUEUpIHN0YXRpYyBUWVBFCi0KLQotCi0vKiBzaW0tdHlwZXMgKi8KLQotI2lmIChTSU1fVFlQRVNfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCi0jIGRlZmluZSBSRUdQQVJNX1NJTV9UWVBFUyBSRUdQQVJNCi0jZWxzZQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fVFlQRVMKLSNlbmRpZgotCi0jaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9UWVBFU19JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKLSAgICAgJiYgIWRlZmluZWQgKFNJTV9UWVBFU19DKSBcCi0gICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9UWVBFU19JTkxJTkUpKSkKLSMgaWYgKFNJTV9UWVBFU19JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKLSMgIGRlZmluZSBJTkxJTkVfU0lNX1RZUEVTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU0lNX1RZUEVTX1AgMAotIyBlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1NJTV9UWVBFUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TSU1fVFlQRVMKLSMgIGRlZmluZSBFWFRFUk5fU0lNX1RZUEVTX1AgMAotIyBlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9TSU1fVFlQRVMoVFlQRSkgVFlQRSBSRUdQQVJNX1NJTV9UWVBFUwotIyBkZWZpbmUgRVhURVJOX1NJTV9UWVBFU19QIDEKLSNlbmRpZgotCi0jaWYgKFNJTV9UWVBFU19JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fVFlQRVMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fVFlQRVMoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TSU1fVFlQRVMKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRJQ19TSU1fVFlQRVMoVFlQRSkgc3RhdGljIFRZUEUKLQotCi0KLS8qIHNpbV9tYWluICovCi0KLSNpZiAhZGVmaW5lZCAoU0lNX01BSU5fSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCi0jIGRlZmluZSBTSU1fTUFJTl9JTkxJTkUgKEFMTF9DX0lOTElORSkKLSNlbmRpZgotCi0jaWYgKFNJTV9NQUlOX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fTUFJTiBSRUdQQVJNCi0jZWxzZQotIyBkZWZpbmUgUkVHUEFSTV9TSU1fTUFJTgotI2VuZGlmCi0KLSNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX01BSU5fSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCi0gICAgICYmICFkZWZpbmVkIChTSU1fTUFJTl9DKSBcCi0gICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9NQUlOX0lOTElORSkpKQotIyBpZiAoU0lNX01BSU5fSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCi0jICBkZWZpbmUgSU5MSU5FX1NJTV9NQUlOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU0lNX01BSU5fUCAwCi0jIGVsc2UKLSMgIGRlZmluZSBJTkxJTkVfU0lNX01BSU4oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX01BSU4KLSMgIGRlZmluZSBFWFRFUk5fU0lNX01BSU5fUCAwCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX1NJTV9NQUlOKFRZUEUpIFRZUEUgUkVHUEFSTV9TSU1fTUFJTgotIyBkZWZpbmUgRVhURVJOX1NJTV9NQUlOX1AgMQotI2VuZGlmCi0KLSNpZiAoU0lNX01BSU5fSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX01BSU4oVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fTUFJTihUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NJTV9NQUlOCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUSUNfU0lNX01BSU4oVFlQRSkgc3RhdGljIFRZUEUKLQwKLS8qIGVuZ2luZSAqLwotCi0jaWYgKEVOR0lORV9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKLSMgZGVmaW5lIFJFR1BBUk1fRU5HSU5FIFJFR1BBUk0KLSNlbHNlCi0jIGRlZmluZSBSRUdQQVJNX0VOR0lORQotI2VuZGlmCi0KLSNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoRU5HSU5FX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAotICAgICAmJiAhZGVmaW5lZCAoRU5HSU5FX0MpIFwKLSAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoRU5HSU5FX0lOTElORSkpKQotIyBpZiAoRU5HSU5FX0lOTElORSAmIElOTElORV9HTE9CQUxTKQotIyAgZGVmaW5lIElOTElORV9FTkdJTkUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9FTkdJTkVfUCAwCi0jIGVsc2UKLSMgIGRlZmluZSBJTkxJTkVfRU5HSU5FKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX0VOR0lORQotIyAgZGVmaW5lIEVYVEVSTl9FTkdJTkVfUCAwCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX0VOR0lORShUWVBFKSBUWVBFIFJFR1BBUk1fRU5HSU5FCi0jIGRlZmluZSBFWFRFUk5fRU5HSU5FX1AgMQotI2VuZGlmCi0KLSNpZiAoRU5HSU5FX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0VOR0lORShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0VOR0lORShUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX0VOR0lORQotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDX0VOR0lORShUWVBFKSBzdGF0aWMgVFlQRQotCi0KLQotLyogaWNhY2hlICovCi0KLSNpZiAoSUNBQ0hFX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQotIyBkZWZpbmUgUkVHUEFSTV9JQ0FDSEUgUkVHUEFSTQotI2Vsc2UKLSMgZGVmaW5lIFJFR1BBUk1fSUNBQ0hFCi0jZW5kaWYKLQotI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChJQ0FDSEVfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCi0gICAgICYmICFkZWZpbmVkIChJQ0FDSEVfQykgXAotICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChJQ0FDSEVfSU5MSU5FKSkpCi0jIGlmIChJQ0FDSEVfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCi0jICBkZWZpbmUgSU5MSU5FX0lDQUNIRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0lDQUNIRV9QIDAKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX0lDQUNIRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9JQ0FDSEUKLSMgIGRlZmluZSBFWFRFUk5fSUNBQ0hFX1AgMAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX0lDQUNIRShUWVBFKSBUWVBFIFJFR1BBUk1fSUNBQ0hFCi0jIGRlZmluZSBFWFRFUk5fSUNBQ0hFX1AgMQotI2VuZGlmCi0KLSNpZiAoSUNBQ0hFX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lDQUNIRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lDQUNIRShUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX0lDQUNIRQotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDX0lDQUNIRShUWVBFKSBzdGF0aWMgVFlQRQotCi0KLQotLyogaWRlY29kZSAqLwotCi0jaWYgKElERUNPREVfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCi0jIGRlZmluZSBSRUdQQVJNX0lERUNPREUgUkVHUEFSTQotI2Vsc2UKLSMgZGVmaW5lIFJFR1BBUk1fSURFQ09ERQotI2VuZGlmCi0KLSNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoSURFQ09ERV9JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKLSAgICAgJiYgIWRlZmluZWQgKElERUNPREVfQykgXAotICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChJREVDT0RFX0lOTElORSkpKQotIyBpZiAoSURFQ09ERV9JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKLSMgIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0lERUNPREVfUCAwCi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9JREVDT0RFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX0lERUNPREUKLSMgIGRlZmluZSBFWFRFUk5fSURFQ09ERV9QIDAKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9JREVDT0RFKFRZUEUpIFRZUEUgUkVHUEFSTV9JREVDT0RFCi0jIGRlZmluZSBFWFRFUk5fSURFQ09ERV9QIDEKLSNlbmRpZgotCi0jaWYgKElERUNPREVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lERUNPREUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9JREVDT0RFCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUSUNfSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRQotCi0KLQotLyogc2VtYW50aWNzICovCi0KLSNpZiAoU0VNQU5USUNTX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQotIyBkZWZpbmUgUkVHUEFSTV9TRU1BTlRJQ1MgUkVHUEFSTQotI2Vsc2UKLSMgZGVmaW5lIFJFR1BBUk1fU0VNQU5USUNTCi0jZW5kaWYKLQotI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTRU1BTlRJQ1NfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCi0gICAgICYmICFkZWZpbmVkIChTRU1BTlRJQ1NfQykgXAotICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTRU1BTlRJQ1NfSU5MSU5FKSkpCi0jIGlmIChTRU1BTlRJQ1NfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCi0jICBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX1NFTUFOVElDU19QIDAKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TRU1BTlRJQ1MKLSMgIGRlZmluZSBFWFRFUk5fU0VNQU5USUNTX1AgMAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBUWVBFIFJFR1BBUk1fU0VNQU5USUNTCi0jIGRlZmluZSBFWFRFUk5fU0VNQU5USUNTX1AgMQotI2VuZGlmCi0KLSNpZiBFWFRFUk5fU0VNQU5USUNTX1AKLSMgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1MoVFlQRSkgVFlQRSBSRUdQQVJNX1NFTUFOVElDUwotI2Vsc2UKLSMgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0VNQU5USUNTCi0jZW5kaWYKLQotI2lmIChTRU1BTlRJQ1NfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0VNQU5USUNTCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUSUNfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBUWVBFCi0KLQotCi0vKiBzdXBwb3J0ICovCi0KLSNpZiAhZGVmaW5lZCAoU1VQUE9SVF9JTkxJTkUpICYmIChERUZBVUxUX0lOTElORSkKLSMgZGVmaW5lIFNVUFBPUlRfSU5MSU5FIEFMTF9DX0lOTElORQotI2VuZGlmCi0KLSNpZiAoU1VQUE9SVF9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKLSMgZGVmaW5lIFJFR1BBUk1fU1VQUE9SVCBSRUdQQVJNCi0jZWxzZQotIyBkZWZpbmUgUkVHUEFSTV9TVVBQT1JUCi0jZW5kaWYKLQotI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTVVBQT1JUX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAotICAgICAmJiAhZGVmaW5lZCAoU1VQUE9SVF9DKSBcCi0gICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNVUFBPUlRfSU5MSU5FKSkpCi0jIGlmIChTVVBQT1JUX0lOTElORSAmIElOTElORV9HTE9CQUxTKQotIyAgZGVmaW5lIElOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU1VQUE9SVF9QIDAKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1NVUFBPUlQoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU1VQUE9SVAotIyAgZGVmaW5lIEVYVEVSTl9TVVBQT1JUX1AgMAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX1NVUFBPUlQoVFlQRSkgVFlQRSBSRUdQQVJNX1NVUFBPUlQKLSMgZGVmaW5lIEVYVEVSTl9TVVBQT1JUX1AgMQotI2VuZGlmCi0KLSNpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU1VQUE9SVChUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NVUFBPUlQKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRJQ19TVVBQT1JUKFRZUEUpIHN0YXRpYyBUWVBFCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWlvLmMgYi9zaW0vY29tbW9uL3NpbS1pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmY0NDQ1Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLWlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTgsIEN5Z251cyBTb2x1dGlvbnMuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1pby5oIgotI2luY2x1ZGUgInRhcmctdmFscy5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSNpZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBzaW11bGF0b3Igc2hvdWxkIHBvbGwgdGhlIGhvc3QKLSAgIGZvciBhIHF1aXQuICovCi0jaWZuZGVmIFBPTExfUVVJVF9JTlRFUlZBTAotI2RlZmluZSBQT0xMX1FVSVRfSU5URVJWQUwgMHgxMAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcG9sbF9xdWl0X2NvdW50ID0gUE9MTF9RVUlUX0lOVEVSVkFMOwotCi0vKiBTZWUgdGhlIGZpbGUgaW5jbHVkZS9jYWxsYmFja3MuaCBmb3IgYSBkZXNjcmlwdGlvbiAqLwotCi0KLWludAotc2ltX2lvX2luaXQoU0lNX0RFU0Mgc2QpCi17Ci0gIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5pbml0IChTVEFURV9DQUxMQkFDSyAoc2QpKTsKLX0KLQotCi1pbnQKLXNpbV9pb19zaHV0ZG93bihTSU1fREVTQyBzZCkKLXsKLSAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnNodXRkb3duIChTVEFURV9DQUxMQkFDSyAoc2QpKTsKLX0KLQotCi1pbnQKLXNpbV9pb191bmxpbmsoU0lNX0RFU0Mgc2QsCi0JICAgICAgY29uc3QgY2hhciAqZjEpCi17Ci0gIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT51bmxpbmsgKFNUQVRFX0NBTExCQUNLIChzZCksIGYxKTsKLX0KLQotCi1sb25nCi1zaW1faW9fdGltZShTSU1fREVTQyBzZCwKLQkgICAgbG9uZyAqdCkKLXsKLSAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnRpbWUgKFNUQVRFX0NBTExCQUNLIChzZCksIHQpOwotfQotCi0KLWludAotc2ltX2lvX3N5c3RlbShTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqcykKLXsKLSAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnN5c3RlbSAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgcyk7Ci19Ci0KLQotaW50Ci1zaW1faW9fcmVuYW1lKFNJTV9ERVNDIHNkLAotCSAgICAgIGNvbnN0IGNoYXIgKmYxLAotCSAgICAgIGNvbnN0IGNoYXIgKmYyKQotewotICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+cmVuYW1lIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmMSwgZjIpOwotfQotCi0KLWludAotc2ltX2lvX3dyaXRlX3N0ZG91dChTSU1fREVTQyBzZCwKLQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJICAgIGludCBsZW4pCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgewotICBjYXNlIERPX1VTRV9TVERJTzoKLSAgICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+d3JpdGVfc3Rkb3V0IChTVEFURV9DQUxMQkFDSyAoc2QpLCBidWYsIGxlbik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE9OVF9VU0VfU1RESU86Ci0gICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPndyaXRlIChTVEFURV9DQUxMQkFDSyAoc2QpLCAxLCBidWYsIGxlbik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9pb193cml0ZV9zdGRvdXQ6IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZAotc2ltX2lvX2ZsdXNoX3N0ZG91dChTSU1fREVTQyBzZCkKLXsKLSAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7Ci0gIGNhc2UgRE9fVVNFX1NURElPOgotICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmZsdXNoX3N0ZG91dCAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE9OVF9VU0VfU1RESU86Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9pb19mbHVzaF9zdGRvdXQ6IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi1pbnQKLXNpbV9pb193cml0ZV9zdGRlcnIoU0lNX0RFU0Mgc2QsCi0JCSAgICBjb25zdCBjaGFyICpidWYsCi0JCSAgICBpbnQgbGVuKQotewotICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKLSAgY2FzZSBET19VU0VfU1RESU86Ci0gICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPndyaXRlX3N0ZGVyciAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgYnVmLCBsZW4pOwotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotICAgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT53cml0ZSAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgMiwgYnVmLCBsZW4pOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1faW9fd3JpdGVfc3RkZXJyOiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQKLXNpbV9pb19mbHVzaF9zdGRlcnIoU0lNX0RFU0Mgc2QpCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgewotICBjYXNlIERPX1VTRV9TVERJTzoKLSAgICBTVEFURV9DQUxMQkFDSyAoc2QpLT5mbHVzaF9zdGRlcnIgKFNUQVRFX0NBTExCQUNLIChzZCkpOwotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1faW9fZmx1c2hfc3RkZXJyOiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotaW50Ci1zaW1faW9fd3JpdGUoU0lNX0RFU0Mgc2QsCi0JICAgICBpbnQgZmQsCi0JICAgICBjb25zdCBjaGFyICpidWYsCi0JICAgICBpbnQgbGVuKQotewotICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+d3JpdGUgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkLCBidWYsIGxlbik7Ci19Ci0KLQotaW50Ci1zaW1faW9fcmVhZF9zdGRpbihTSU1fREVTQyBzZCwKLQkJICBjaGFyICpidWYsCi0JCSAgaW50IGxlbikKLXsKLSAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7Ci0gIGNhc2UgRE9fVVNFX1NURElPOgotICAgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5yZWFkX3N0ZGluIChTVEFURV9DQUxMQkFDSyAoc2QpLCBidWYsIGxlbik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE9OVF9VU0VfU1RESU86Ci0gICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnJlYWQgKFNUQVRFX0NBTExCQUNLIChzZCksIDAsIGJ1ZiwgbGVuKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2lvX3JlYWRfc3RkaW46IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1zaW1faW9fcmVhZChTSU1fREVTQyBzZCwgaW50IGZkLAotCSAgICBjaGFyICpidWYsCi0JICAgIGludCBsZW4pCi17Ci0gIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5yZWFkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmZCwgYnVmLCBsZW4pOwotfQotCi0KLWludAotc2ltX2lvX29wZW4oU0lNX0RFU0Mgc2QsCi0JICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgIGludCBmbGFncykKLXsKLSAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPm9wZW4gKFNUQVRFX0NBTExCQUNLIChzZCksIG5hbWUsIGZsYWdzKTsKLX0KLQotCi1pbnQKLXNpbV9pb19sc2VlayhTSU1fREVTQyBzZCwKLQkgICAgIGludCBmZCwKLQkgICAgIGxvbmcgb2ZmLAotCSAgICAgaW50IHdheSkKLXsKLSAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPmxzZWVrIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmZCwgb2ZmLCB3YXkpOwotfQotCi0KLWludAotc2ltX2lvX2lzYXR0eShTSU1fREVTQyBzZCwKLQkgICAgICBpbnQgZmQpCi17Ci0gIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5pc2F0dHkgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkKTsKLX0KLQotCi1pbnQKLXNpbV9pb19nZXRfZXJybm8oU0lNX0RFU0Mgc2QpCi17Ci0gIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5nZXRfZXJybm8gKFNUQVRFX0NBTExCQUNLIChzZCkpOwotfQotCi0KLWludAotc2ltX2lvX2Nsb3NlKFNJTV9ERVNDIHNkLAotCSAgICAgaW50IGZkKQotewotICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+Y2xvc2UgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkKTsKLX0KLQotCi12b2lkCi1zaW1faW9fcHJpbnRmKFNJTV9ERVNDIHNkLAotCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICAgICAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBmbXQpOwotICBTVEFURV9DQUxMQkFDSyAoc2QpLT52cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLX0KLQotCi12b2lkCi1zaW1faW9fdnByaW50ZihTSU1fREVTQyBzZCwKLQkgICAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgICB2YV9saXN0IGFwKQotewotICBTVEFURV9DQUxMQkFDSyAoc2QpLT52cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKLX0KLQotCi12b2lkCi1zaW1faW9fZXByaW50ZihTSU1fREVTQyBzZCwKLQkgICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAgLi4uKQotewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+ZXZwcmludGZfZmlsdGVyZWQgKFNUQVRFX0NBTExCQUNLIChzZCksIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotfQotCi0KLXZvaWQKLXNpbV9pb19ldnByaW50ZihTSU1fREVTQyBzZCwKLQkJY29uc3QgY2hhciAqZm10LAotCQl2YV9saXN0IGFwKQotewotICBTVEFURV9DQUxMQkFDSyAoc2QpLT5ldnByaW50Zl9maWx0ZXJlZCAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgZm10LCBhcCk7Ci19Ci0KLQotdm9pZAotc2ltX2lvX2Vycm9yKFNJTV9ERVNDIHNkLAotCSAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgLi4uKQotewotICBpZiAoc2QgPT0gTlVMTCB8fCBTVEFURV9DQUxMQkFDSyAoc2QpID09IE5VTEwpIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICBhYm9ydCAoKTsKLSAgfQotICBlbHNlIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmV2cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmVycm9yIChTVEFURV9DQUxMQkFDSyAoc2QpLCAiIik7Ci0gIH0KLX0KLQotCi12b2lkCi1zaW1faW9fcG9sbF9xdWl0KFNJTV9ERVNDIHNkKQotewotICBpZiAoU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+cG9sbF9xdWl0ICE9IE5VTEwgJiYgcG9sbF9xdWl0X2NvdW50LS0gPCAwKQotICAgIHsKLSAgICAgIHBvbGxfcXVpdF9jb3VudCA9IFBPTExfUVVJVF9JTlRFUlZBTDsKLSAgICAgIGlmIChTVEFURV9DQUxMQkFDSyAoc2QpLT5wb2xsX3F1aXQgKFNUQVRFX0NBTExCQUNLIChzZCkpKQotCXNpbV9zdG9wIChzZCk7Ci0gICAgfQotfQotCi0KLS8qIEJhc2VkIG9uIGdkYi00LjE3L3NpbS9wcGMvbWFpbi5jOnNpbV9pb19yZWFkX3N0ZGluKCkuCi0KLSAgIEZJWE1FOiBTaG91bGQgbm90IGJlIGNhbGxpbmcgZmNudGwoKSBvciBncnViYmluZyBhcm91bmQgaW5zaWRlIG9mCi0gICAtPmZkbWFwIGFuZCAtPmVycm5vLgotCi0gICBGSVhNRTogU29tZSBjb21wbGV0bHkgbmV3IG1lY2hhbmlzbSBmb3IgaGFuZGxpbmcgdGhlIGdlbmVyYWwKLSAgIHByb2JsZW0gb2YgYXN5bmNocm9ub3VzIElPIGlzIG5lZWRlZC4KLQotICAgRklYTUU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcmVzcyB0aGUgZWNob2luZyAoRUNITykgb2YgaW5wdXQuCi0gICBDb25zZXF1ZW50bHkgcG9sbGVkIGlucHV0IGlzIGFsd2F5cyBkaXNwbGF5ZWQuCi0KLSAgIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gdW5jb29rZWQgcmVhZHMuCi0gICBDb25zZXF1ZW50bHksIGRhdGEgd2lsbCBub3QgYmUgcmVhZCB1bnRpbCBhbiBFT0xOIGNoYXJhY3RlciBoYXMKLSAgIGJlZW4gZW50ZXJlZC4gQSBjbnRybC1kIG1heSBmb3JjZSB0aGUgZWFybHkgdGVybWluYXRpb24gb2YgYSBsaW5lICovCi0KLQotaW50Ci1zaW1faW9fcG9sbF9yZWFkIChTSU1fREVTQyBzZCwKLQkJICBpbnQgc2ltX2lvX2ZkLAotCQkgIGNoYXIgKmJ1ZiwKLQkJICBpbnQgc2l6ZW9mX2J1ZikKLXsKLSNpZiBkZWZpbmVkKE9fTkRFTEFZKSAmJiBkZWZpbmVkKEZfR0VURkwpICYmIGRlZmluZWQoRl9TRVRGTCkKLSAgaW50IGZkID0gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+ZmRtYXBbc2ltX2lvX2ZkXTsKLSAgaW50IGZsYWdzOwotICBpbnQgc3RhdHVzOwotICBpbnQgbnJfcmVhZDsKLSAgaW50IHJlc3VsdDsKLSAgU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+bGFzdF9lcnJubyA9IDA7Ci0gIC8qIGdldCB0aGUgb2xkIHN0YXR1cyAqLwotICBmbGFncyA9IGZjbnRsIChmZCwgRl9HRVRGTCwgMCk7Ci0gIGlmIChmbGFncyA9PSAtMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJzaW1faW9fcG9sbF9yZWFkIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qIHRlbXAsIGRpc2FibGUgYmxvY2tpbmcgSU8gKi8KLSAgc3RhdHVzID0gZmNudGwgKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTkRFTEFZKTsKLSAgaWYgKHN0YXR1cyA9PSAtMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJzaW1faW9fcmVhZF9zdGRpbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAvKiB0cnkgZm9yIGlucHV0ICovCi0gIG5yX3JlYWQgPSByZWFkIChmZCwgYnVmLCBzaXplb2ZfYnVmKTsKLSAgaWYgKG5yX3JlYWQgPj0gMCkKLSAgICB7Ci0gICAgICAvKiBwcmludGYgKCI8bnItcmVhZD0lZD5cbiIsIG5yX3JlYWQpOyAqLwotICAgICAgcmVzdWx0ID0gbnJfcmVhZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IC8qIG5yX3JlYWQgPCAwICovCi0gICAgICByZXN1bHQgPSAtMTsKLSAgICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmxhc3RfZXJybm8gPSBlcnJubzsKLSAgICB9Ci0gIC8qIHJldHVybiB0byByZWd1bGFyIHZld2luZyAqLwotICBzdGF0dXMgPSBmY250bCAoZmQsIEZfU0VURkwsIGZsYWdzKTsKLSAgaWYgKHN0YXR1cyA9PSAtMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKCJzaW1faW9fcmVhZF9zdGRpbiIpOwotICAgICAgLyogcmV0dXJuIDA7ICovCi0gICAgfQotICByZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgcmV0dXJuIHNpbV9pb19yZWFkIChzZCwgc2ltX2lvX2ZkLCBidWYsIHNpemVvZl9idWYpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1pby5oIGIvc2ltL2NvbW1vbi9zaW0taW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1YjYyMy4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1pby5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBTSU1fSU9fSAotI2RlZmluZSBTSU1fSU9fSAotCi0vKiBTZWUgdGhlIGZpbGUgaW5jbHVkZS9jYWxsYmFja3MuaCBmb3IgYSBkZXNjcmlwdGlvbiAqLwotCi1pbnQgc2ltX2lvX2luaXQgKFNJTV9ERVNDIHNkKTsKLQotaW50IHNpbV9pb19zaHV0ZG93biAoU0lNX0RFU0Mgc2QpOwotCi1pbnQgc2ltX2lvX3VubGluayAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKik7Ci0KLWxvbmcgc2ltX2lvX3RpbWUgKFNJTV9ERVNDIHNkLCBsb25nICopOwotCi1pbnQgc2ltX2lvX3N5c3RlbSAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKik7Ci0KLWludCBzaW1faW9fcmVuYW1lIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCi1pbnQgc2ltX2lvX3dyaXRlX3N0ZG91dCAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKiwgaW50KTsKLQotdm9pZCBzaW1faW9fZmx1c2hfc3Rkb3V0IChTSU1fREVTQyBzZCk7Ci0KLWludCBzaW1faW9fd3JpdGVfc3RkZXJyIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqLCBpbnQpOwotCi12b2lkIHNpbV9pb19mbHVzaF9zdGRlcnIgKFNJTV9ERVNDIHNkKTsKLQotaW50IHNpbV9pb193cml0ZSAoU0lNX0RFU0Mgc2QsIGludCwgY29uc3QgY2hhciAqLCBpbnQpOwotCi1pbnQgc2ltX2lvX3JlYWRfc3RkaW4gKFNJTV9ERVNDIHNkLCBjaGFyICosIGludCk7Ci0KLWludCBzaW1faW9fcmVhZCAoU0lNX0RFU0Mgc2QsIGludCwgY2hhciAqLCBpbnQpOwotCi1pbnQgc2ltX2lvX29wZW4gKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICosIGludCk7Ci0KLWludCBzaW1faW9fbHNlZWsgKFNJTV9ERVNDIHNkLCBpbnQsIGxvbmcsIGludCk7Ci0KLWludCBzaW1faW9faXNhdHR5IChTSU1fREVTQyBzZCwgaW50KTsKLQotaW50IHNpbV9pb19nZXRfZXJybm8gKFNJTV9ERVNDIHNkKTsKLQotaW50IHNpbV9pb19jbG9zZSAoU0lNX0RFU0Mgc2QsIGludCk7Ci0KLXZvaWQgc2ltX2lvX3ByaW50ZiAoU0lNX0RFU0Mgc2QsCi0JCSAgICBjb25zdCBjaGFyICpmbXQsCi0JCSAgICAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLQotdm9pZCBzaW1faW9fdnByaW50ZiAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0KLXZvaWQgc2ltX2lvX2VwcmludGYgKFNJTV9ERVNDIHNkLAotCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAgICAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLQotdm9pZCBzaW1faW9fZXZwcmludGYgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotCi12b2lkIHNpbV9pb19lcnJvciAoU0lNX0RFU0Mgc2QsCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0KLXZvaWQgc2ltX2lvX3BvbGxfcXVpdCAoU0lNX0RFU0Mgc2QpOwotCi0vKiBSZXR1cm5zIC0xIGFuZCBzZXRzIChob3N0KSBFQUdBSU4gaWYgbm90IHJlYWR5LiAqLwotaW50IHNpbV9pb19wb2xsX3JlYWQgKFNJTV9ERVNDIHNkLCBpbnQsIGNoYXIgKiwgaW50KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1sb2FkLmMgYi9zaW0vY29tbW9uL3NpbS1sb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZmIzM2IuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qIFV0aWxpdHkgdG8gbG9hZCBhIGZpbGUgaW50byB0aGUgc2ltdWxhdG9yLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgc3RhbmRhbG9uZSBsb2FkZXIsIGluZGVwZW5kZW50IG9mIHRoZSBzaW0tYmFzaWMuaCBtYWNoaW5lcnksCi0gICBhcyBpdCBpcyB1c2VkIGJ5IHNpbXVsYXRvcnMgdGhhdCBkb24ndCB1c2UgaXQgW3Rob3VnaCB0aGF0IGRvZXNuJ3QgbWVhbgotICAgdG8gc3VnZ2VzdCB0aGF0IHRoZXkgc2hvdWxkbid0IDotKV0uICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPiAvKiBmb3IgTlVMTCAqLwotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic2ltLXV0aWxzLmgiCi0KLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotc3RhdGljIHZvaWQgZXByaW50ZiBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgdm9pZCB4cHJpbnRmIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLXN0YXRpYyB2b2lkIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZQotICBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIHVuc2lnbmVkIGxvbmcsIHRpbWVfdCwgdGltZV90KSk7Ci1zdGF0aWMgdm9pZCB4cHJpbnRmX2JmZF92bWEgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBiZmRfdm1hKSk7Ci0KLS8qIExvYWQgcHJvZ3JhbSBQUk9HIGludG8gdGhlIHNpbXVsYXRvciB1c2luZyB0aGUgZnVuY3Rpb24gRE9fTE9BRC4KLSAgIElmIFBST0dfQkZEIGlzIG5vbi1OVUxMLCB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZC4KLSAgIElmIFZFUkJPU0VfUCBpcyBub24temVybyBzdGF0aXN0aWNzIGFyZSBwcmludGVkIG9mIGVhY2ggbG9hZGVkIHNlY3Rpb24KLSAgIGFuZCB0aGUgdHJhbnNmZXIgcmF0ZSAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZ2RiKS4KLSAgIElmIExNQV9QIGlzIG5vbi16ZXJvIHRoZSBwcm9ncmFtIHNlY3Rpb25zIGFyZSBsb2FkZWQgYXQgdGhlIExNQQotICAgcmF0aGVyIHRoYW4gdGhlIFZNQQotICAgSWYgdGhpcyBmYWlscyBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQgYW5kIE5VTEwgaXMgcmV0dXJuZWQuCi0gICBJZiBpdCBzdWNjZWVkcyB0aGUgYmZkIGlzIHJldHVybmVkLgotICAgTk9URTogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgb2xkZXIgaGFyZHdhcmUgc2ltdWxhdG9ycyBpbmNvcnJlY3RseQotICAgd3JpdGUgdGhlIHByb2dyYW0gc2VjdGlvbnMgYXQgTE1BIGludGVycHJldGVkIGFzIGEgdmlydHVhbCBhZGRyZXNzLgotICAgVGhpcyBpcyBzdGlsbCBhY2NvbW1vZGF0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KLQotCi1iZmQgKgotc2ltX2xvYWRfZmlsZSAoc2QsIG15bmFtZSwgY2FsbGJhY2ssIHByb2csIHByb2dfYmZkLCB2ZXJib3NlX3AsIGxtYV9wLCBkb193cml0ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm15bmFtZTsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7Ci0gICAgIGNoYXIgKnByb2c7Ci0gICAgIGJmZCAqcHJvZ19iZmQ7Ci0gICAgIGludCB2ZXJib3NlX3A7Ci0gICAgIGludCBsbWFfcDsKLSAgICAgc2ltX3dyaXRlX2ZuIGRvX3dyaXRlOwotewotICBhc2VjdGlvbiAqczsKLSAgLyogUmVjb3JkIHNlcGFyYXRlbHkgYXMgd2UgZG9uJ3Qgd2FudCB0byBjbG9zZSBQUk9HX0JGRCBpZiBpdCB3YXMgcGFzc2VkLiAgKi8KLSAgYmZkICpyZXN1bHRfYmZkOwotICB0aW1lX3Qgc3RhcnRfdGltZSA9IDA7CS8qIFN0YXJ0IGFuZCBlbmQgdGltZXMgb2YgZG93bmxvYWQgKi8KLSAgdGltZV90IGVuZF90aW1lID0gMDsKLSAgdW5zaWduZWQgbG9uZyBkYXRhX2NvdW50ID0gMDsJLyogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHRvIG1lbW9yeSAqLwotICBpbnQgZm91bmRfbG9hZGFibGVfc2VjdGlvbjsKLQotICBpZiAocHJvZ19iZmQgIT0gTlVMTCkKLSAgICByZXN1bHRfYmZkID0gcHJvZ19iZmQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHRfYmZkID0gYmZkX29wZW5yIChwcm9nLCAwKTsKLSAgICAgIGlmIChyZXN1bHRfYmZkID09IE5VTEwpCi0JewotCSAgZXByaW50ZiAoY2FsbGJhY2ssICIlczogY2FuJ3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCAKLQkJICAgbXluYW1lLCBwcm9nLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAocmVzdWx0X2JmZCwgYmZkX29iamVjdCkpIAotICAgIHsKLSAgICAgIGVwcmludGYgKGNhbGxiYWNrLCAiJXM6IFwiJXNcIiBpcyBub3QgYW4gb2JqZWN0IGZpbGU6ICVzXG4iLAotCSAgICAgICBteW5hbWUsIHByb2csIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIC8qIE9ubHkgY2xvc2UgaWYgd2Ugb3BlbmVkIGl0LiAgKi8KLSAgICAgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQotCWJmZF9jbG9zZSAocmVzdWx0X2JmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHZlcmJvc2VfcCkKLSAgICBzdGFydF90aW1lID0gdGltZSAoTlVMTCk7Ci0KLSAgZm91bmRfbG9hZGFibGVfc2VjdGlvbiA9IDA7Ci0gIGZvciAocyA9IHJlc3VsdF9iZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkgCi0gICAgewotICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpIAotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBjaGFyICpidWZmZXI7Ci0JICAgICAgYmZkX3ZtYSBsbWE7Ci0KLQkgICAgICBidWZmZXIgPSBtYWxsb2MgKHNpemUpOwotCSAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkKLQkJewotCQkgIGVwcmludGYgKGNhbGxiYWNrLAotCQkJICAgIiVzOiBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGxvYWQgXCIlc1wiXG4iLAotCQkJICAgbXluYW1lLCBwcm9nKTsKLQkJICAvKiBPbmx5IGNsb3NlIGlmIHdlIG9wZW5lZCBpdC4gICovCi0JCSAgaWYgKHByb2dfYmZkID09IE5VTEwpCi0JCSAgICBiZmRfY2xvc2UgKHJlc3VsdF9iZmQpOwotCQkgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaWYgKGxtYV9wKQotCQlsbWEgPSBiZmRfc2VjdGlvbl9sbWEgKHJlc3VsdF9iZmQsIHMpOwotCSAgICAgIGVsc2UKLQkJbG1hID0gYmZkX3NlY3Rpb25fdm1hIChyZXN1bHRfYmZkLCBzKTsKLQkgICAgICBpZiAodmVyYm9zZV9wKQotCQl7Ci0JCSAgeHByaW50ZiAoY2FsbGJhY2ssICJMb2FkaW5nIHNlY3Rpb24gJXMsIHNpemUgMHglbHggJXMgIiwKLQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChyZXN1bHRfYmZkLCBzKSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBzaXplLAotCQkJICAgKGxtYV9wID8gImxtYSIgOiAidm1hIikpOwotCQkgIHhwcmludGZfYmZkX3ZtYSAoY2FsbGJhY2ssIGxtYSk7Ci0JCSAgeHByaW50ZiAoY2FsbGJhY2ssICJcbiIpOwotCQl9Ci0JICAgICAgZGF0YV9jb3VudCArPSBzaXplOwotCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAocmVzdWx0X2JmZCwgcywgYnVmZmVyLCAwLCBzaXplKTsKLQkgICAgICBkb193cml0ZSAoc2QsIGxtYSwgYnVmZmVyLCBzaXplKTsKLQkgICAgICBmb3VuZF9sb2FkYWJsZV9zZWN0aW9uID0gMTsKLQkgICAgICBmcmVlIChidWZmZXIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoIWZvdW5kX2xvYWRhYmxlX3NlY3Rpb24pCi0gICAgewotICAgICAgZXByaW50ZiAoY2FsbGJhY2ssCi0JICAgICAgICIlczogbm8gbG9hZGFibGUgc2VjdGlvbnMgXCIlc1wiXG4iLAotCSAgICAgICBteW5hbWUsIHByb2cpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICh2ZXJib3NlX3ApCi0gICAgewotICAgICAgZW5kX3RpbWUgPSB0aW1lIChOVUxMKTsKLSAgICAgIHhwcmludGYgKGNhbGxiYWNrLCAiU3RhcnQgYWRkcmVzcyAiKTsKLSAgICAgIHhwcmludGZfYmZkX3ZtYSAoY2FsbGJhY2ssIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocmVzdWx0X2JmZCkpOwotICAgICAgeHByaW50ZiAoY2FsbGJhY2ssICJcbiIpOwotICAgICAgcmVwb3J0X3RyYW5zZmVyX3BlcmZvcm1hbmNlIChjYWxsYmFjaywgZGF0YV9jb3VudCwgc3RhcnRfdGltZSwgZW5kX3RpbWUpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0X2JmZDsKLX0KLQotc3RhdGljIHZvaWQKLXhwcmludGYgVlBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLCBjb25zdCBjaGFyICpmbXQsIC4uLikpCi17Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKLSAgY2hhciAqZm10OwotI2VuZGlmCi0gIHZhX2xpc3QgYXA7Ci0KLSAgVkFfU1RBUlQgKGFwLCBmbXQpOwotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgY2FsbGJhY2sgPSB2YV9hcmcgKGFwLCBob3N0X2NhbGxiYWNrICopOwotICBmbXQgPSB2YV9hcmcgKGFwLCBjaGFyICopOwotI2VuZGlmCi0KLSAgKCpjYWxsYmFjay0+dnByaW50Zl9maWx0ZXJlZCkgKGNhbGxiYWNrLCBmbXQsIGFwKTsKLQotICB2YV9lbmQgKGFwKTsKLX0KLQotc3RhdGljIHZvaWQKLWVwcmludGYgVlBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLCBjb25zdCBjaGFyICpmbXQsIC4uLikpCi17Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKLSAgY2hhciAqZm10OwotI2VuZGlmCi0gIHZhX2xpc3QgYXA7Ci0KLSAgVkFfU1RBUlQgKGFwLCBmbXQpOwotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgY2FsbGJhY2sgPSB2YV9hcmcgKGFwLCBob3N0X2NhbGxiYWNrICopOwotICBmbXQgPSB2YV9hcmcgKGFwLCBjaGFyICopOwotI2VuZGlmCi0KLSAgKCpjYWxsYmFjay0+ZXZwcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgZm10LCBhcCk7Ci0KLSAgdmFfZW5kIChhcCk7Ci19Ci0KLS8qIFJlcG9ydCBob3cgZmFzdCB0aGUgdHJhbnNmZXIgd2VudC4gKi8KLQotc3RhdGljIHZvaWQKLXJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSAoY2FsbGJhY2ssIGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKQotICAgICBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKLSAgICAgdW5zaWduZWQgbG9uZyBkYXRhX2NvdW50OwotICAgICB0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7Ci17Ci0gIHhwcmludGYgKGNhbGxiYWNrLCAiVHJhbnNmZXIgcmF0ZTogIik7Ci0gIGlmIChlbmRfdGltZSAhPSBzdGFydF90aW1lKQotICAgIHhwcmludGYgKGNhbGxiYWNrLCAiJWxkIGJpdHMvc2VjIiwKLQkgICAgIChkYXRhX2NvdW50ICogOCkgLyAoZW5kX3RpbWUgLSBzdGFydF90aW1lKSk7Ci0gIGVsc2UKLSAgICB4cHJpbnRmIChjYWxsYmFjaywgIiVsZCBiaXRzIGluIDwxIHNlYyIsIChkYXRhX2NvdW50ICogOCkpOwotICB4cHJpbnRmIChjYWxsYmFjaywgIi5cbiIpOwotfQotCi0vKiBQcmludCBhIGJmZF92bWEuCi0gICBUaGlzIGlzIGludGVuZGVkIHRvIGhhbmRsZSB0aGUgdmFnYXJpZXMgb2YgMzIgdnMgNjQgYml0cywgZXRjLiAgKi8KLQotc3RhdGljIHZvaWQKLXhwcmludGZfYmZkX3ZtYSAoY2FsbGJhY2ssIHZtYSkKLSAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7Ci0gICAgIGJmZF92bWEgdm1hOwotewotICAvKiBGSVhNRTogZm9yIG5vdyAqLwotICB4cHJpbnRmIChjYWxsYmFjaywgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1tZW1vcHQuYyBiL3NpbS9jb21tb24vc2ltLW1lbW9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTEyYTQ1Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLW1lbW9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qIFNpbXVsYXRvciBtZW1vcnkgb3B0aW9uIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0jaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKiBNZW1vcnkgZmlsbCBieXRlICovCi1zdGF0aWMgdW5zaWduZWQ4IGZpbGxfYnl0ZV92YWx1ZTsKLXN0YXRpYyBpbnQgZmlsbF9ieXRlX2ZsYWcgPSAwOwotCi0vKiBNZW1vcnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi0KLWVudW0gewotICBPUFRJT05fTUVNT1JZX0RFTEVURSA9IE9QVElPTl9TVEFSVCwKLSAgT1BUSU9OX01FTU9SWV9SRUdJT04sCi0gIE9QVElPTl9NRU1PUllfU0laRSwKLSAgT1BUSU9OX01FTU9SWV9JTkZPLAotICBPUFRJT05fTUVNT1JZX0FMSUFTLAotICBPUFRJT05fTUVNT1JZX0NMRUFSLAotICBPUFRJT05fTUVNT1JZX0ZJTEwKLX07Ci0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOwotCi1zdGF0aWMgY29uc3QgT1BUSU9OIG1lbW9yeV9vcHRpb25zW10gPQotewotICB7IHsibWVtb3J5LWRlbGV0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX0RFTEVURSB9LAotICAgICAgJ1wwJywgIkFERFJFU1N8YWxsIiwgIkRlbGV0ZSBtZW1vcnkgYXQgQUREUkVTUyAoYWxsIGFkZHJlc3NlcykiLAotICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJkZWxldGUtbWVtb3J5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfREVMRVRFIH0sCi0gICAgICAnXDAnLCAiQUREUkVTUyIsIE5VTEwsCi0gICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHsibWVtb3J5LXJlZ2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX1JFR0lPTiB9LAotICAgICAgJ1wwJywgIkFERFJFU1MsU0laRVssTU9EVUxPXSIsICJBZGQgYSBtZW1vcnkgcmVnaW9uIiwKLSAgICAgIG1lbW9yeV9vcHRpb25faGFuZGxlciB9LAotCi0gIHsgeyJtZW1vcnktYWxpYXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9BTElBUyB9LAotICAgICAgJ1wwJywgIkFERFJFU1MsU0laRXssQUREUkVTU30iLCAiQWRkIG1lbW9yeSBzaGFkb3ciLAotICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7Im1lbW9yeS1zaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfU0laRSB9LAotICAgICAgJ1wwJywgIlNJWkUiLCAiQWRkIG1lbW9yeSBhdCBhZGRyZXNzIHplcm8iLAotICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7Im1lbW9yeS1maWxsIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfRklMTCB9LAotICAgICAgJ1wwJywgIlZBTFVFIiwgIkZpbGwgc3Vic2VxdWVudGx5IGFkZGVkIG1lbW9yeSByZWdpb25zIiwKLSAgICAgIG1lbW9yeV9vcHRpb25faGFuZGxlciB9LAotCi0gIHsgeyJtZW1vcnktY2xlYXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9DTEVBUiB9LAotICAgICAgJ1wwJywgTlVMTCwgIkNsZWFyIHN1YnNlcXVlbnRseSBhZGRlZCBtZW1vcnkgcmVnaW9ucyIsCi0gICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHsibWVtb3J5LWluZm8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9JTkZPIH0sCi0gICAgICAnXDAnLCBOVUxMLCAiTGlzdCBjb25maWd1cmFibGUgbWVtb3J5IHJlZ2lvbnMiLAotICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJpbmZvLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX0lORk8gfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsCi0gICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotCi1zdGF0aWMgc2ltX21lbW9wdCAqCi1kb19tZW1vcHRfYWRkIChTSU1fREVTQyBzZCwKLQkgICAgICAgaW50IGxldmVsLAotCSAgICAgICBpbnQgc3BhY2UsCi0JICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAotCSAgICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCi0JICAgICAgIHVuc2lnbmVkIG1vZHVsbywKLQkgICAgICAgc2ltX21lbW9wdCAqKmVudHJ5LAotCSAgICAgICB2b2lkICpidWZmZXIpCi17Ci0gIHZvaWQgKmZpbGxfYnVmZmVyOwotICB1bnNpZ25lZCBmaWxsX2xlbmd0aDsKLSAgdm9pZCAqZnJlZV9idWZmZXI7Ci0KLSAgaWYgKGJ1ZmZlciAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEJ1ZmZlciBhbHJlYWR5IGdpdmVuLiAgc2ltX21lbW9yeV91bmluc3RhbGwgd2lsbCBmcmVlIGl0LiAqLwotICAgICAgc2ltX2NvcmVfYXR0YWNoIChzZCwgTlVMTCwKLQkJICAgICAgIGxldmVsLCBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLCBzcGFjZSwKLQkJICAgICAgIGFkZHIsIG5yX2J5dGVzLCBtb2R1bG8sIE5VTEwsIGJ1ZmZlcik7Ci0KLSAgICAgIGZyZWVfYnVmZmVyID0gYnVmZmVyOwotICAgICAgZmlsbF9idWZmZXIgPSBidWZmZXI7Ci0gICAgICBmaWxsX2xlbmd0aCA9IChtb2R1bG8gPT0gMCkgPyBucl9ieXRlcyA6IG1vZHVsbzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBbGxvY2F0ZSBuZXcgd2VsbC1hbGlnbmVkIGJ1ZmZlciwganVzdCBhcyBzaW1fY29yZV9hdHRhY2goKS4gKi8KLSAgICAgIHZvaWQgKmFsaWduZWRfYnVmZmVyOwotICAgICAgaW50IHBhZGRpbmcgPSAoYWRkciAlIHNpemVvZiAodW5zaWduZWQ2NCkpOwotICAgICAgdW5zaWduZWQgbG9uZyBieXRlcyA9IChtb2R1bG8gPT0gMCA/IG5yX2J5dGVzIDogbW9kdWxvKSArIHBhZGRpbmc7Ci0KLSAgICAgIC8qIElmIGZpbGxpbmcgd2l0aCBub24temVybyB2YWx1ZSwgZG8gbm90IHVzZSBjbGVhcmluZyBhbGxvY2F0b3IuICovCi0KLSAgICAgIGlmIChmaWxsX2J5dGVfZmxhZyAmJiBmaWxsX2J5dGVfdmFsdWUgIT0gMCkKLSAgICAgICAgZnJlZV9idWZmZXIgPSB4bWFsbG9jIChieXRlcyk7IC8qIGRvbid0IGNsZWFyICovCi0gICAgICBlbHNlCi0gICAgICAgIGZyZWVfYnVmZmVyID0gemFsbG9jIChieXRlcyk7IC8qIGNsZWFyICovCi0KLSAgICAgIGFsaWduZWRfYnVmZmVyID0gKGNoYXIqKSBmcmVlX2J1ZmZlciArIHBhZGRpbmc7Ci0KLSAgICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCi0JCSAgICAgICBsZXZlbCwgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYywgc3BhY2UsCi0JCSAgICAgICBhZGRyLCBucl9ieXRlcywgbW9kdWxvLCBOVUxMLCBhbGlnbmVkX2J1ZmZlcik7Ci0KLSAgICAgIGZpbGxfYnVmZmVyID0gYWxpZ25lZF9idWZmZXI7Ci0gICAgICBmaWxsX2xlbmd0aCA9IChtb2R1bG8gPT0gMCkgPyBucl9ieXRlcyA6IG1vZHVsbzsKLQotICAgICAgLyogSWYgd2UganVzdCB1c2VkIGEgY2xlYXJpbmcgYWxsb2NhdG9yLCBhbmQgYXJlIGFib3V0IHRvIGZpbGwgd2l0aAotICAgICAgICAgemVybywgdHJ1bmNhdGUgdGhlIHJlZHVuZGFudCBmaWxsIG9wZXJhdGlvbi4gKi8KLQotICAgICAgaWYgKGZpbGxfYnl0ZV9mbGFnICYmIGZpbGxfYnl0ZV92YWx1ZSA9PSAwKQotICAgICAgICAgZmlsbF9sZW5ndGggPSAxOyAvKiBhdm9pZCBib3VuZGFyeSBsZW5ndGg9MCBjYXNlICovCi0gICAgfQotCi0gIGlmIChmaWxsX2J5dGVfZmxhZykKLSAgICB7Ci0gICAgICBBU1NFUlQgKGZpbGxfYnVmZmVyICE9IDApOwotICAgICAgbWVtc2V0ICgoY2hhciopIGZpbGxfYnVmZmVyLCBmaWxsX2J5dGVfdmFsdWUsIGZpbGxfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgd2hpbGUgKCgqZW50cnkpICE9IE5VTEwpCi0gICAgZW50cnkgPSAmKCplbnRyeSktPm5leHQ7Ci0gICgqZW50cnkpID0gWkFMTE9DIChzaW1fbWVtb3B0KTsKLSAgKCplbnRyeSktPmxldmVsID0gbGV2ZWw7Ci0gICgqZW50cnkpLT5zcGFjZSA9IHNwYWNlOwotICAoKmVudHJ5KS0+YWRkciA9IGFkZHI7Ci0gICgqZW50cnkpLT5ucl9ieXRlcyA9IG5yX2J5dGVzOwotICAoKmVudHJ5KS0+bW9kdWxvID0gbW9kdWxvOwotICAoKmVudHJ5KS0+YnVmZmVyID0gZnJlZV9idWZmZXI7Ci0KLSAgcmV0dXJuICgqZW50cnkpOwotfQotCi1zdGF0aWMgU0lNX1JDCi1kb19tZW1vcHRfZGVsZXRlIChTSU1fREVTQyBzZCwKLQkJICBpbnQgbGV2ZWwsCi0JCSAgaW50IHNwYWNlLAotCQkgIGFkZHJlc3Nfd29yZCBhZGRyKQotewotICBzaW1fbWVtb3B0ICoqZW50cnkgPSAmU1RBVEVfTUVNT1BUIChzZCk7Ci0gIHNpbV9tZW1vcHQgKmFsaWFzOwotICB3aGlsZSAoKCplbnRyeSkgIT0gTlVMTAotCSAmJiAoKCplbnRyeSktPmxldmVsICE9IGxldmVsCi0JICAgICAgfHwgKCplbnRyeSktPnNwYWNlICE9IHNwYWNlCi0JICAgICAgfHwgKCplbnRyeSktPmFkZHIgIT0gYWRkcikpCi0gICAgZW50cnkgPSAmKCplbnRyeSktPm5leHQ7Ci0gIGlmICgoKmVudHJ5KSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1lbW9yeSBhdCAweCVseCBub3QgZm91bmQsIG5vdCBkZWxldGVkXG4iLAotCQkgICAgICAobG9uZykgYWRkcik7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICAvKiBkZWxldGUgYW55IGJ1ZmZlciAqLwotICBpZiAoKCplbnRyeSktPmJ1ZmZlciAhPSBOVUxMKQotICAgIHpmcmVlICgoKmVudHJ5KS0+YnVmZmVyKTsKLSAgLyogZGVsZXRlIGl0IGFuZCBpdHMgYWxpYXNlcyAqLwotICBhbGlhcyA9ICplbnRyeTsKLSAgKmVudHJ5ID0gKCplbnRyeSktPm5leHQ7Ci0gIHdoaWxlIChhbGlhcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbV9tZW1vcHQgKmRlYWQgPSBhbGlhczsKLSAgICAgIGFsaWFzID0gYWxpYXMtPmFsaWFzOwotICAgICAgc2ltX2NvcmVfZGV0YWNoIChzZCwgTlVMTCwgZGVhZC0+bGV2ZWwsIGRlYWQtPnNwYWNlLCBkZWFkLT5hZGRyKTsKLSAgICAgIHpmcmVlIChkZWFkKTsKLSAgICB9Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLQotc3RhdGljIGNoYXIgKgotcGFyc2Vfc2l6ZSAoY2hhciAqY2hwLAotCSAgICBhZGRyZXNzX3dvcmQgKm5yX2J5dGVzLAotCSAgICB1bnNpZ25lZCAqbW9kdWxvKQotewotICAvKiA8bnJfYnl0ZXM+IFsgIiUiIDxtb2R1bG8+IF0gKi8KLSAgKm5yX2J5dGVzID0gc3RydG91bCAoY2hwLCAmY2hwLCAwKTsKLSAgaWYgKCpjaHAgPT0gJyUnKQotICAgIHsKLSAgICAgICptb2R1bG8gPSBzdHJ0b3VsIChjaHAgKyAxLCAmY2hwLCAwKTsKLSAgICB9Ci0gIHJldHVybiBjaHA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3Vsb25nX3ZhbHVlIChjaGFyICpjaHAsCi0JCSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi17Ci0gICp2YWx1ZSA9IHN0cnRvdWwgKGNocCwgJmNocCwgMCk7Ci0gIHJldHVybiBjaHA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2FkZHIgKGNoYXIgKmNocCwKLQkgICAgaW50ICpsZXZlbCwKLQkgICAgaW50ICpzcGFjZSwKLQkgICAgYWRkcmVzc193b3JkICphZGRyKQotewotICAvKiBbIDxzcGFjZT4gIjogIiBdIDxhZGRyPiBbICJAIiA8bGV2ZWw+IF0gKi8KLSAgKmFkZHIgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAoY2hwLCAmY2hwLCAwKTsKLSAgaWYgKCpjaHAgPT0gJzonKQotICAgIHsKLSAgICAgICpzcGFjZSA9ICphZGRyOwotICAgICAgKmFkZHIgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAoY2hwICsgMSwgJmNocCwgMCk7Ci0gICAgfQotICBpZiAoKmNocCA9PSAnQCcpCi0gICAgewotICAgICAgKmxldmVsID0gc3RydG91bCAoY2hwICsgMSwgJmNocCwgMCk7Ci0gICAgfQotICByZXR1cm4gY2hwOwotfQotCi0KLXN0YXRpYyBTSU1fUkMKLW1lbW9yeV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKLQkJICAgICAgIGNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCi17Ci0gIHN3aXRjaCAob3B0KQotICAgIHsKLQotICAgIGNhc2UgT1BUSU9OX01FTU9SWV9ERUxFVEU6Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoYXJnLCAiYWxsIikgPT0gMCkKLQl7Ci0JICB3aGlsZSAoU1RBVEVfTUVNT1BUIChzZCkgIT0gTlVMTCkKLQkgICAgZG9fbWVtb3B0X2RlbGV0ZSAoc2QsCi0JCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+bGV2ZWwsCi0JCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+c3BhY2UsCi0JCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+YWRkcik7Ci0JICByZXR1cm4gU0lNX1JDX09LOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgbGV2ZWwgPSAwOwotCSAgaW50IHNwYWNlID0gMDsKLQkgIGFkZHJlc3Nfd29yZCBhZGRyID0gMDsKLQkgIHBhcnNlX2FkZHIgKGFyZywgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKLQkgIHJldHVybiBkb19tZW1vcHRfZGVsZXRlIChzZCwgbGV2ZWwsIHNwYWNlLCBhZGRyKTsKLQl9Ci0gICAgCi0gICAgY2FzZSBPUFRJT05fTUVNT1JZX1JFR0lPTjoKLSAgICAgIHsKLQljaGFyICpjaHAgPSBhcmc7Ci0JaW50IGxldmVsID0gMDsKLQlpbnQgc3BhY2UgPSAwOwotCWFkZHJlc3Nfd29yZCBhZGRyID0gMDsKLQlhZGRyZXNzX3dvcmQgbnJfYnl0ZXMgPSAwOwotCXVuc2lnbmVkIG1vZHVsbyA9IDA7Ci0JLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLwotCWNocCA9IHBhcnNlX2FkZHIgKGNocCwgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKLQlpZiAoKmNocCAhPSAnLCcpCi0JICB7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1pc3Npbmcgc2l6ZSBmb3IgbWVtb3J5LXJlZ2lvblxuIik7Ci0JICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgIH0KLQljaHAgPSBwYXJzZV9zaXplIChjaHAgKyAxLCAmbnJfYnl0ZXMsICZtb2R1bG8pOwotCS8qIG9sZCBzdHlsZSAqLwotCWlmICgqY2hwID09ICcsJykKLQkgIG1vZHVsbyA9IHN0cnRvdWwgKGNocCArIDEsICZjaHAsIDApOwotCS8qIHRyeSB0byBhdHRhY2gvaW5zZXJ0IGl0ICovCi0JZG9fbWVtb3B0X2FkZCAoc2QsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKLQkJICAgICAgICZTVEFURV9NRU1PUFQgKHNkKSwgTlVMTCk7Ci0JcmV0dXJuIFNJTV9SQ19PSzsKLSAgICAgIH0KLQotICAgIGNhc2UgT1BUSU9OX01FTU9SWV9BTElBUzoKLSAgICAgIHsKLQljaGFyICpjaHAgPSBhcmc7Ci0JaW50IGxldmVsID0gMDsKLQlpbnQgc3BhY2UgPSAwOwotCWFkZHJlc3Nfd29yZCBhZGRyID0gMDsKLQlhZGRyZXNzX3dvcmQgbnJfYnl0ZXMgPSAwOwotCXVuc2lnbmVkIG1vZHVsbyA9IDA7Ci0Jc2ltX21lbW9wdCAqZW50cnk7Ci0JLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLwotCWNocCA9IHBhcnNlX2FkZHIgKGNocCwgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKLQlpZiAoKmNocCAhPSAnLCcpCi0JICB7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1pc3Npbmcgc2l6ZSBmb3IgbWVtb3J5LXJlZ2lvblxuIik7Ci0JICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgIH0KLQljaHAgPSBwYXJzZV9zaXplIChjaHAgKyAxLCAmbnJfYnl0ZXMsICZtb2R1bG8pOwotCS8qIHRyeSB0byBhdHRhY2gvaW5zZXJ0IHRoZSBtYWluIHJlY29yZCAqLwotCWVudHJ5ID0gZG9fbWVtb3B0X2FkZCAoc2QsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKLQkJCSAgICAgICAmU1RBVEVfTUVNT1BUIChzZCksCi0JCQkgICAgICAgTlVMTCk7Ci0JLyogbm93IGF0dGFjaCBhbGwgdGhlIGFsaWFzZXMgKi8KLQl3aGlsZSAoKmNocCA9PSAnLCcpCi0JICB7Ci0JICAgIGludCBhX2xldmVsID0gbGV2ZWw7Ci0JICAgIGludCBhX3NwYWNlID0gc3BhY2U7Ci0JICAgIGFkZHJlc3Nfd29yZCBhX2FkZHIgPSBhZGRyOwotCSAgICBjaHAgPSBwYXJzZV9hZGRyIChjaHAgKyAxLCAmYV9sZXZlbCwgJmFfc3BhY2UsICZhX2FkZHIpOwotCSAgICBkb19tZW1vcHRfYWRkIChzZCwgYV9sZXZlbCwgYV9zcGFjZSwgYV9hZGRyLCBucl9ieXRlcywgbW9kdWxvLAotCQkJICAgJmVudHJ5LT5hbGlhcywgZW50cnktPmJ1ZmZlcik7Ci0JICB9Ci0JcmV0dXJuIFNJTV9SQ19PSzsKLSAgICAgIH0KLQotICAgIGNhc2UgT1BUSU9OX01FTU9SWV9TSVpFOgotICAgICAgewotCWludCBsZXZlbCA9IDA7Ci0JaW50IHNwYWNlID0gMDsKLQlhZGRyZXNzX3dvcmQgYWRkciA9IDA7Ci0JYWRkcmVzc193b3JkIG5yX2J5dGVzID0gMDsKLQl1bnNpZ25lZCBtb2R1bG8gPSAwOwotCS8qIHBhcnNlIHRoZSBhcmd1bWVudHMgKi8KLQlwYXJzZV9zaXplIChhcmcsICZucl9ieXRlcywgJm1vZHVsbyk7Ci0JLyogdHJ5IHRvIGF0dGFjaC9pbnNlcnQgaXQgKi8KLQlkb19tZW1vcHRfYWRkIChzZCwgbGV2ZWwsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgbW9kdWxvLAotCQkgICAgICAgJlNUQVRFX01FTU9QVCAoc2QpLCBOVUxMKTsKLQlyZXR1cm4gU0lNX1JDX09LOwotICAgICAgfQotCi0gICAgY2FzZSBPUFRJT05fTUVNT1JZX0NMRUFSOgotICAgICAgewotCWZpbGxfYnl0ZV92YWx1ZSA9ICh1bnNpZ25lZDgpIDA7Ci0JZmlsbF9ieXRlX2ZsYWcgPSAxOwotCXJldHVybiBTSU1fUkNfT0s7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIE9QVElPTl9NRU1PUllfRklMTDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIGZpbGxfdmFsdWU7Ci0JcGFyc2VfdWxvbmdfdmFsdWUgKGFyZywgJmZpbGxfdmFsdWUpOwotCWlmIChmaWxsX3ZhbHVlID4gMjU1KQotCSAgewotCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJNaXNzaW5nIGZpbGwgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTVcbiIpOwotCSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICB9Ci0JZmlsbF9ieXRlX3ZhbHVlID0gKHVuc2lnbmVkOCkgZmlsbF92YWx1ZTsKLQlmaWxsX2J5dGVfZmxhZyA9IDE7Ci0JcmV0dXJuIFNJTV9SQ19PSzsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgT1BUSU9OX01FTU9SWV9JTkZPOgotICAgICAgewotCXNpbV9tZW1vcHQgKmVudHJ5OwotCXNpbV9pb19wcmludGYgKHNkLCAiTWVtb3J5IG1hcHM6XG4iKTsKLQlmb3IgKGVudHJ5ID0gU1RBVEVfTUVNT1BUIChzZCk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JICB7Ci0JICAgIHNpbV9tZW1vcHQgKmFsaWFzOwotCSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiBtZW1vcnkiKTsKLQkgICAgaWYgKGVudHJ5LT5hbGlhcyA9PSBOVUxMKQotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiIHJlZ2lvbiAiKTsKLQkgICAgZWxzZQotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiIGFsaWFzICIpOwotCSAgICBpZiAoZW50cnktPnNwYWNlICE9IDApCi0JICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIweCVseDoiLCAobG9uZykgZW50cnktPnNwYWNlKTsKLQkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIweCUwOGx4IiwgKGxvbmcpIGVudHJ5LT5hZGRyKTsKLQkgICAgaWYgKGVudHJ5LT5sZXZlbCAhPSAwKQotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiQDB4JWx4IiwgKGxvbmcpIGVudHJ5LT5sZXZlbCk7Ci0JICAgIHNpbV9pb19wcmludGYgKHNkLCAiLDB4JWx4IiwKLQkJCSAgIChsb25nKSBlbnRyeS0+bnJfYnl0ZXMpOwotCSAgICBpZiAoZW50cnktPm1vZHVsbyAhPSAwKQotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiJSUweCVseCIsIChsb25nKSBlbnRyeS0+bW9kdWxvKTsKLQkgICAgZm9yIChhbGlhcyA9IGVudHJ5LT5hbGlhczsKLQkJIGFsaWFzICE9IE5VTEw7Ci0JCSBhbGlhcyA9IGFsaWFzLT5uZXh0KQotCSAgICAgIHsKLQkJaWYgKGFsaWFzLT5zcGFjZSAhPSAwKQotCQkgIHNpbV9pb19wcmludGYgKHNkLCAiMHglbHg6IiwgKGxvbmcpIGFsaWFzLT5zcGFjZSk7Ci0JCXNpbV9pb19wcmludGYgKHNkLCAiLDB4JTA4bHgiLCAobG9uZykgYWxpYXMtPmFkZHIpOwotCQlpZiAoYWxpYXMtPmxldmVsICE9IDApCi0JCSAgc2ltX2lvX3ByaW50ZiAoc2QsICJAMHglbHgiLCAobG9uZykgYWxpYXMtPmxldmVsKTsKLQkgICAgICB9Ci0JICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLQkgIH0KLQlyZXR1cm4gU0lNX1JDX09LOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gbWVtb3J5IG9wdGlvbiAlZFxuIiwgb3B0KTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci19Ci0KLQotLyogIm1lbW9yeSIgbW9kdWxlIGluc3RhbGwgaGFuZGxlci4KLQotICAgVGhpcyBpcyBjYWxsZWQgdmlhIHNpbV9tb2R1bGVfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSAibWVtb3J5IiBzdWJzeXN0ZW0KLSAgIGludG8gdGhlIHNpbXVsYXRvci4gICovCi0KLXN0YXRpYyBNT0RVTEVfSU5JVF9GTiBzaW1fbWVtb3J5X2luaXQ7Ci1zdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiBzaW1fbWVtb3J5X3VuaW5zdGFsbDsKLQotU0lNX1JDCi1zaW1fbWVtb3B0X2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIG1lbW9yeV9vcHRpb25zKTsKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgc2ltX21lbW9yeV91bmluc3RhbGwpOwotICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgc2ltX21lbW9yeV9pbml0KTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotCi0vKiBVbmluc3RhbGwgdGhlICJtZW1vcnkiIHN1YnN5c3RlbSBmcm9tIHRoZSBzaW11bGF0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotc2ltX21lbW9yeV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBzaW1fbWVtb3B0ICoqZW50cnkgPSAmU1RBVEVfTUVNT1BUIChzZCk7Ci0gIHNpbV9tZW1vcHQgKmFsaWFzOwotCi0gIHdoaWxlICgoKmVudHJ5KSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGRlbGV0ZSBhbnkgYnVmZmVyICovCi0gICAgICBpZiAoKCplbnRyeSktPmJ1ZmZlciAhPSBOVUxMKQotCXpmcmVlICgoKmVudHJ5KS0+YnVmZmVyKTsKLQotICAgICAgLyogZGVsZXRlIGl0IGFuZCBpdHMgYWxpYXNlcyAqLwotICAgICAgYWxpYXMgPSAqZW50cnk7Ci0KLSAgICAgIC8qIG5leHQgdmljdGltICovCi0gICAgICAqZW50cnkgPSAoKmVudHJ5KS0+bmV4dDsKLQotICAgICAgd2hpbGUgKGFsaWFzICE9IE5VTEwpCi0JewotCSAgc2ltX21lbW9wdCAqZGVhZCA9IGFsaWFzOwotCSAgYWxpYXMgPSBhbGlhcy0+YWxpYXM7Ci0JICBzaW1fY29yZV9kZXRhY2ggKHNkLCBOVUxMLCBkZWFkLT5sZXZlbCwgZGVhZC0+c3BhY2UsIGRlYWQtPmFkZHIpOwotCSAgemZyZWUgKGRlYWQpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIFNJTV9SQwotc2ltX21lbW9yeV9pbml0IChTSU1fREVTQyBzZCkKLXsKLSAgLyogRklYTUU6IGFueXRoaW5nIG5lZWRlZD8gKi8KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLW1lbW9wdC5oIGIvc2ltL2NvbW1vbi9zaW0tbWVtb3B0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4N2M1NzYuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tbWVtb3B0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3Igc2ltdWxhdG9yIG1lbW9yeSBhcmd1bWVudCBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgU0lNX01FTU9QVF9ICi0jZGVmaW5lIFNJTV9NRU1PUFRfSAotCi0vKiBQcm92aWRlcyBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyB0aGUgbWVtb3J5IGNvcmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9tZW1vcHQgc2ltX21lbW9wdDsKLXN0cnVjdCBfc2ltX21lbW9wdCB7Ci0gIGludCBsZXZlbDsKLSAgaW50IHNwYWNlOwotICB1bnNpZ25lZF93b3JkIGFkZHI7Ci0gIHVuc2lnbmVkX3dvcmQgbnJfYnl0ZXM7Ci0gIHVuc2lnbmVkIG1vZHVsbzsKLSAgdm9pZCAqYnVmZmVyOwotICBzaW1fbWVtb3B0ICphbGlhczsgLyogbGlua2VkIGxpc3QgKi8KLSAgc2ltX21lbW9wdCAqbmV4dDsKLX07Ci0KLQotLyogSW5zdGFsbCB0aGUgIm1lbW9wdCIgbW9kdWxlLiAgKi8KLQotU0lNX1JDIHNpbV9tZW1vcHRfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpOwotCi0KLS8qIFdhcyB0aGVyZSBhIG1lbW9yeSBjb21tYW5kPyAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLW1vZGVsLmMgYi9zaW0vY29tbW9uL3NpbS1tb2RlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZkYzE1Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLW1vZGVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogTW9kZWwgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotI2luY2x1ZGUgImJmZC5oIgotCi1zdGF0aWMgdm9pZCBtb2RlbF9zZXQgKHNpbV9jcHUgKiwgY29uc3QgTU9ERUwgKik7Ci0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChtb2RlbF9vcHRpb25faGFuZGxlcik7Ci0KLXN0YXRpYyBNT0RVTEVfSU5JVF9GTiBzaW1fbW9kZWxfaW5pdDsKLQotI2RlZmluZSBPUFRJT05fTU9ERUwgKE9QVElPTl9TVEFSVCArIDApCi0KLXN0YXRpYyBjb25zdCBPUFRJT04gbW9kZWxfb3B0aW9uc1tdID0gewotICB7IHsibW9kZWwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01PREVMfSwKLSAgICAgICdcMCcsICJNT0RFTCIsICJTcGVjaWZ5IG1vZGVsIHRvIHNpbXVsYXRlIiwKLSAgICAgIG1vZGVsX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgU0lNX1JDCi1tb2RlbF9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKLQkJICAgICAgY2hhciAqYXJnLCBpbnQgaXNfY29tbWFuZCkKLXsKLSAgc3dpdGNoIChvcHQpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX01PREVMIDoKLSAgICAgIHsKLQljb25zdCBNT0RFTCAqbW9kZWwgPSBzaW1fbW9kZWxfbG9va3VwIChhcmcpOwotCWlmICghIG1vZGVsKQotCSAgewotCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJ1bmtub3duIG1vZGVsIGAlcydcbiIsIGFyZyk7Ci0JICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgIH0KLQlzaW1fbW9kZWxfc2V0IChzZCwgY3B1LCBtb2RlbCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX21vZGVsX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotCi0gIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgTlVMTCwgbW9kZWxfb3B0aW9ucyk7Ci0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fbW9kZWxfaW5pdCk7Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzaW1fbW9kZWxfc2V0IHRvIHNldCB0aGUgbW9kZWwgZm9yIG9uZSBjcHUuICAqLwotCi1zdGF0aWMgdm9pZAotbW9kZWxfc2V0IChzaW1fY3B1ICpjcHUsIGNvbnN0IE1PREVMICptb2RlbCkKLXsKLSAgQ1BVX01BQ0ggKGNwdSkgPSBNT0RFTF9NQUNIIChtb2RlbCk7Ci0gIENQVV9NT0RFTCAoY3B1KSA9IG1vZGVsOwotICAoKiBNQUNIX0lOSVRfQ1BVIChNT0RFTF9NQUNIIChtb2RlbCkpKSAoY3B1KTsKLSAgKCogTU9ERUxfSU5JVCAobW9kZWwpKSAoY3B1KTsKLX0KLQotLyogU2V0IHRoZSBjdXJyZW50IG1vZGVsIG9mIENQVSB0byBNT0RFTC4KLSAgIElmIENQVSBpcyBOVUxMLCBhbGwgY3B1cyBhcmUgc2V0IHRvIE1PREVMLiAgKi8KLQotdm9pZAotc2ltX21vZGVsX3NldCAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgY29uc3QgTU9ERUwgKm1vZGVsKQotewotICBpZiAoISBjcHUpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQotCWlmIChTVEFURV9DUFUgKHNkLCBjKSkKLQkgIG1vZGVsX3NldCAoU1RBVEVfQ1BVIChzZCwgYyksIG1vZGVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtb2RlbF9zZXQgKGNwdSwgbW9kZWwpOwotICAgIH0KLX0KLQotLyogTG9vayB1cCBtb2RlbCBuYW1lZCBOQU1FLgotICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTU9ERUwgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBNT0RFTCAqCi1zaW1fbW9kZWxfbG9va3VwIChjb25zdCBjaGFyICpuYW1lKQotewotICBjb25zdCBNQUNIICoqbWFjaHA7Ci0gIGNvbnN0IE1PREVMICptb2RlbDsKLQotICBmb3IgKG1hY2hwID0gJiBzaW1fbWFjaHNbMF07ICptYWNocCAhPSBOVUxMOyArK21hY2hwKQotICAgIHsKLSAgICAgIGZvciAobW9kZWwgPSBNQUNIX01PREVMUyAoKm1hY2hwKTsgTU9ERUxfTkFNRSAobW9kZWwpICE9IE5VTEw7ICsrbW9kZWwpCi0JewotCSAgaWYgKHN0cmNtcCAoTU9ERUxfTkFNRSAobW9kZWwpLCBuYW1lKSA9PSAwKQotCSAgICByZXR1cm4gbW9kZWw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgbWFjaGluZSBuYW1lZCBOQU1FLgotICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTUFDSCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IE1BQ0ggKgotc2ltX21hY2hfbG9va3VwIChjb25zdCBjaGFyICpuYW1lKQotewotICBjb25zdCBNQUNIICoqbWFjaHA7Ci0KLSAgZm9yIChtYWNocCA9ICYgc2ltX21hY2hzWzBdOyAqbWFjaHAgIT0gTlVMTDsgKyttYWNocCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChNQUNIX05BTUUgKCptYWNocCksIG5hbWUpID09IDApCi0JcmV0dXJuICptYWNocDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rIHVwIGEgbWFjaGluZSB2aWEgaXRzIGJmZCBuYW1lLgotICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTUFDSCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IE1BQ0ggKgotc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lIChjb25zdCBjaGFyICpuYW1lKQotewotICBjb25zdCBNQUNIICoqbWFjaHA7Ci0KLSAgZm9yIChtYWNocCA9ICYgc2ltX21hY2hzWzBdOyAqbWFjaHAgIT0gTlVMTDsgKyttYWNocCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChNQUNIX0JGRF9OQU1FICgqbWFjaHApLCBuYW1lKSA9PSAwKQotCXJldHVybiAqbWFjaHA7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5pdGlhbGl6ZSBtb2RlbCBzdXBwb3J0LiAgKi8KLQotc3RhdGljIFNJTV9SQwotc2ltX21vZGVsX2luaXQgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQ1BVICpjcHU7Ci0KLSAgLyogSWYgYm90aCBjcHUgbW9kZWwgYW5kIHN0YXRlIGFyY2hpdGVjdHVyZSBhcmUgc2V0LCBlbnN1cmUgdGhleSdyZQotICAgICBjb21wYXRpYmxlLiAgSWYgb25seSBvbmUgaXMgc2V0LCBzZXQgdGhlIG90aGVyLiAgSWYgbmVpdGhlciBhcmUgc2V0LAotICAgICB1c2UgdGhlIGRlZmF1bHQgbW9kZWwuICBTVEFURV9BUkNISVRFQ1RVUkUgaXMgdGhlIGJmZF9hcmNoX2luZm8gZGF0YQotICAgICBmb3IgdGhlIHNlbGVjdGVkICJtYWNoIiAoYmZkIHRlcm1pbm9sb2d5KS4gICovCi0KLSAgLyogT25seSBjaGVjayBjcHUgMC4gIFNUQVRFX0FSQ0hJVEVDVFVSRSBpcyBmb3IgdGhhdCBvbmUgb25seS4gICovCi0gIC8qID8/PyBBdCBwcmVzZW50IHRoaXMgb25seSBzdXBwb3J0cyBob21vZ2VuZW91cyBtdWx0aXByb2Nlc3NvcnMuICAqLwotICBjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLQotICBpZiAoISBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKQotICAgICAgJiYgISBDUFVfTUFDSCAoY3B1KSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGRlZmF1bHQgbW9kZWwuICAqLwotICAgICAgY29uc3QgTU9ERUwgKm1vZGVsID0gc2ltX21vZGVsX2xvb2t1cCAoV0lUSF9ERUZBVUxUX01PREVMKTsKLSAgICAgIHNpbV9tb2RlbF9zZXQgKHNkLCBOVUxMLCBtb2RlbCk7Ci0gICAgfQotCi0gIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKQotICAgICAgJiYgQ1BVX01BQ0ggKGNwdSkpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPnByaW50YWJsZV9uYW1lLAotCQkgIE1BQ0hfQkZEX05BTUUgKENQVV9NQUNIIChjcHUpKSkgIT0gMCkKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJpbnZhbGlkIG1vZGVsIGAlcycgZm9yIGAlcydcbiIsCi0JCQkgIE1PREVMX05BTUUgKENQVV9NT0RFTCAoY3B1KSksCi0JCQkgIFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5wcmludGFibGVfbmFtZSk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCkpCi0gICAgewotICAgICAgLyogVXNlIHRoZSBkZWZhdWx0IG1vZGVsIGZvciB0aGUgc2VsZWN0ZWQgbWFjaGluZS4KLQkgVGhlIGRlZmF1bHQgbW9kZWwgaXMgdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdC4gICovCi0gICAgICBjb25zdCBNQUNIICptYWNoID0gc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+cHJpbnRhYmxlX25hbWUpOwotCi0gICAgICBpZiAobWFjaCA9PSBOVUxMKQotCXsKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgInVuc3VwcG9ydGVkIG1hY2hpbmUgYCVzJ1xuIiwKLQkJCSAgU1RBVEVfQVJDSElURUNUVVJFIChzZCktPnByaW50YWJsZV9uYW1lKTsKLQkgIHJldHVybiBTSU1fUkNfRkFJTDsKLQl9Ci0gICAgICBzaW1fbW9kZWxfc2V0IChzZCwgTlVMTCwgTUFDSF9NT0RFTFMgKG1hY2gpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSA9IGJmZF9zY2FuX2FyY2ggKE1BQ0hfQkZEX05BTUUgKENQVV9NQUNIIChjcHUpKSk7Ci0gICAgfQotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1tb2RlbC5oIGIvc2ltL2NvbW1vbi9zaW0tbW9kZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3MjgxNS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1tb2RlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qIEFyY2hpdGVjdHVyZSwgbWFjaGluZSwgYW5kIG1vZGVsIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBOb21lbmNsYXR1cmU6Ci0gICBhcmNoaXRlY3R1cmUgPSBvbmUgb2Ygc3BhcmMsIG1pcHMsIHNoLCBldGMuCi0gICBpbiB0aGUgc3BhcmMgYXJjaGl0ZWN0dXJlLCBtYWNoID0gb25lIG9mIHY2LCB2NywgdjgsIHNwYXJjbGl0ZSwgZXRjLgotICAgaW4gdGhlIHY4IG1hY2gsIG1vZGVsID0gb25lIG9mIHN1cGVyc3BhcmMsIGV0Yy4KLSovCi0KLS8qIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBzaW0tYmFzaWNzLmguICAqLwotCi0jaWZuZGVmIFNJTV9NT0RFTF9ICi0jZGVmaW5lIFNJTV9NT0RFTF9ICi0KLS8qIEZ1bmN0aW9uIHVuaXQgYW5kIGluc3RydWN0aW9uIHRpbWluZyBzdXBwb3J0LgotICAgPz8/IFRoaXMgaXMgb2J2aW91c2x5IGluc3VmZmljaWVudGx5IGdlbmVyYWwuCi0gICBJdCdzIHVzZWZ1bCBidXQgaXQgbmVlZHMgZWxhYm9yYXRpbmcgdXBvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciBuYW1lOyAvKiBhY3R1YWxseSBhIFVOSVRfVFlQRSBlbnVtICovCi0gIHVuc2lnbmVkIGNoYXIgaXNzdWU7Ci0gIHVuc2lnbmVkIGNoYXIgZG9uZTsKLX0gVU5JVDsKLQotI2lmbmRlZiBNQVhfVU5JVFMKLSNkZWZpbmUgTUFYX1VOSVRTIDEKLSNlbmRpZgotCi10eXBlZGVmIGludCAoTU9ERUxfRk4pIChzaW1fY3B1ICosIHZvaWQgKik7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhpcyBpcyBhbiBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGlzIGluc24uCi0gICAgIEhvdyB0aGlzIHdvcmtzIGlzIHVwIHRvIHRoZSB0YXJnZXQuICAqLwotICBpbnQgbnVtOwotCi0gIC8qIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNuLXNwZWNpZmljIHByb2ZpbGluZy4gICovCi0gIE1PREVMX0ZOICptb2RlbF9mbjsKLQotICAvKiBBcnJheSBvZiBmdW5jdGlvbiB1bml0cyB1c2VkIGJ5IHRoaXMgaW5zbi4gICovCi0gIFVOSVQgdW5pdHNbTUFYX1VOSVRTXTsKLX0gSU5TTl9USU1JTkc7Ci0KLS8qIFN0cnVjdCB0byBkZXNjcmliZSB2YXJpb3VzIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMgb2YgYSBjcHUuCi0gICBXaGVuIG11bHRpcGxlIGNwdSB2YXJpYW50cyBhcmUgc3VwcG9ydGVkLCB0aGUgc2l6ZXMgb2Ygc29tZSBzdHJ1Y3RzCi0gICBjYW4gdmFyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlIHNpemUgb2YgdGhlIFNJTV9DUFUgc3RydWN0LiAgKi8KLSAgaW50IHNpbV9jcHVfc2l6ZTsKLSNkZWZpbmUgSU1QX1BST1BTX1NJTV9DUFVfU0laRShjcHVfcHJvcHMpICgoY3B1X3Byb3BzKS0+c2ltX2NwdV9zaXplKQotICAvKiBBbiBTQ0FDSEUgZWxlbWVudCBjYW4gdmFyeSBpbiBzaXplLCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGNwdS4KLSAgICAgVGhpcyBpcyB6ZXJvIGlmIHRoZSBTQ0FDSEUgaXNuJ3QgaW4gdXNlIGZvciB0aGlzIHZhcmlhbnQuICAqLwotICBpbnQgc2NhY2hlX2VsbV9zaXplOwotI2RlZmluZSBJTVBfUFJPUFNfU0NBQ0hFX0VMTV9TSVpFKGNwdV9wcm9wcykgKChjcHVfcHJvcHMpLT5zY2FjaGVfZWxtX3NpemUpCi19IE1BQ0hfSU1QX1BST1BFUlRJRVM7Ci0KLS8qIEEgbWFjaGluZSB2YXJpYW50LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBNQUNIX05BTUUobSkgKChtKS0+bmFtZSkKLSAgLyogVGhpcyBpcyB0aGUgYXJndW1lbnQgdG8gYmZkX3NjYW5fYXJjaC4gICovCi0gIGNvbnN0IGNoYXIgKmJmZF9uYW1lOwotI2RlZmluZSBNQUNIX0JGRF9OQU1FKG0pICgobSktPmJmZF9uYW1lKQotICBlbnVtIG1hY2hfYXR0ciBudW07Ci0jZGVmaW5lIE1BQ0hfTlVNKG0pICgobSktPm51bSkKLQotICBpbnQgd29yZF9iaXRzaXplOwotI2RlZmluZSBNQUNIX1dPUkRfQklUU0laRShtKSAoKG0pLT53b3JkX2JpdHNpemUpCi0gIGludCBhZGRyX2JpdHNpemU7Ci0jZGVmaW5lIE1BQ0hfQUREUl9CSVRTSVpFKG0pICgobSktPmFkZHJfYml0c2l6ZSkKLQotICAvKiBQb2ludGVyIHRvIG51bGwtZW50cnkgdGVybWluYXRlZCB0YWJsZSBvZiBtb2RlbHMgb2YgdGhpcyBtYWNoLgotICAgICBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3Qgb25lLiAgKi8KLSAgY29uc3Qgc3RydWN0IG1vZGVsICptb2RlbHM7Ci0jZGVmaW5lIE1BQ0hfTU9ERUxTKG0pICgobSktPm1vZGVscykKLQotICAvKiBQb2ludGVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoaXMgbWFjaC4gICovCi0gIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgKmltcF9wcm9wczsKLSNkZWZpbmUgTUFDSF9JTVBfUFJPUFMobSkgKChtKS0+aW1wX3Byb3BzKQotCi0gIC8qIENhbGxlZCBieSBzaW1fbW9kZWxfc2V0IHdoZW4gdGhlIG1vZGVsIG9mIGEgY3B1IGlzIHNldC4gICovCi0gIHZvaWQgKCogaW5pdF9jcHUpIChzaW1fY3B1ICopOwotI2RlZmluZSBNQUNIX0lOSVRfQ1BVKG0pICgobSktPmluaXRfY3B1KQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHNpbXVsYXRvciBlbmdpbmUgZm9yIHRoaXMgY3B1LgotICAgICBVc2VkIGJ5IGNnZW4gc2ltdWxhdG9ycyB0byBpbml0aWFsaXplIHRoZSBpbnNuIGRlc2NyaXB0b3IgdGFibGUuICAqLwotICB2b2lkICgqIHByZXBhcmVfcnVuKSAoc2ltX2NwdSAqKTsKLSNkZWZpbmUgTUFDSF9QUkVQQVJFX1JVTihtKSAoKG0pLT5wcmVwYXJlX3J1bikKLX0gTUFDSDsKLQotLyogQSBtb2RlbCAoaW1wbGVtZW50YXRpb24pIG9mIGEgbWFjaGluZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IG1vZGVsIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSNkZWZpbmUgTU9ERUxfTkFNRShtKSAoKG0pLT5uYW1lKQotICBjb25zdCBNQUNIICptYWNoOwotI2RlZmluZSBNT0RFTF9NQUNIKG0pICgobSktPm1hY2gpCi0gIC8qIEFuIGVudW0gdGhhdCBkaXN0aW5ndWlzaGVkIHRoZSBtb2RlbC4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIE1PREVMX05VTShtKSAoKG0pLT5udW0pCi0gIC8qIFBvaW50ZXIgdG8gdGltaW5nIHRhYmxlIGZvciB0aGlzIG1vZGVsLiAgKi8KLSAgY29uc3QgSU5TTl9USU1JTkcgKnRpbWluZzsKLSNkZWZpbmUgTU9ERUxfVElNSU5HKG0pICgobSktPnRpbWluZykKLSAgdm9pZCAoKiBpbml0KSAoc2ltX2NwdSAqKTsKLSNkZWZpbmUgTU9ERUxfSU5JVChtKSAoKG0pLT5pbml0KQotfSBNT0RFTDsKLQotLyogVGFibGVzIG9mIHN1cHBvcnRlZCBtYWNoaW5lcy4gICovCi0vKiA/Pz8gSW4gYSBzaW11bGF0b3Igb2YgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcywgd2lsbCBuZWVkIG11bHRpcGxlIGNvcGllcyBvZgotICAgdGhpcy4gIEhhdmUgYW4gYGFyY2hzJyBhcnJheSB0aGF0IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbWFjaHMgYXJyYXkKLSAgIGZvciBlYWNoICh3aGljaCBpbiB0dXJuIGhhcyBhIHBvaW50ZXIgdG8gdGhlIG1vZGVscyBhcnJheSBmb3IgZWFjaCkuICAqLwotZXh0ZXJuIGNvbnN0IE1BQ0ggKnNpbV9tYWNoc1tdOwotCi0vKiBNb2RlbCBtb2R1bGUgaGFuZGxlcnMuICAqLwotZXh0ZXJuIE1PRFVMRV9JTlNUQUxMX0ZOIHNpbV9tb2RlbF9pbnN0YWxsOwotCi0vKiBTdXBwb3J0IHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIHNpbV9tb2RlbF9zZXQgKFNJTV9ERVNDIHNkXywgc2ltX2NwdSAqY3B1XywgY29uc3QgTU9ERUwgKm1vZGVsXyk7Ci1leHRlcm4gY29uc3QgTU9ERUwgKiBzaW1fbW9kZWxfbG9va3VwIChjb25zdCBjaGFyICpuYW1lXyk7Ci1leHRlcm4gY29uc3QgTUFDSCAqIHNpbV9tYWNoX2xvb2t1cCAoY29uc3QgY2hhciAqbmFtZV8pOwotZXh0ZXJuIGNvbnN0IE1BQ0ggKiBzaW1fbWFjaF9sb29rdXBfYmZkX25hbWUgKGNvbnN0IGNoYXIgKmJmZF9uYW1lXyk7Ci0KLSNlbmRpZiAvKiBTSU1fTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbW9kdWxlLmMgYi9zaW0vY29tbW9uL3NpbS1tb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlYjMyYS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1tb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKiBNb2R1bGUgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1pby5oIgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0jaWYgV0lUSF9IVwotI2luY2x1ZGUgInNpbS1ody5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotLyogTGlzdCBvZiBhbGwgbW9kdWxlcy4gICovCi1zdGF0aWMgTU9EVUxFX0lOU1RBTExfRk4gKiBjb25zdCBtb2R1bGVzW10gPSB7Ci0gIHN0YW5kYXJkX2luc3RhbGwsCi0gIHNpbV9ldmVudHNfaW5zdGFsbCwKLSNpZmRlZiBTSU1fSEFWRV9NT0RFTAotICBzaW1fbW9kZWxfaW5zdGFsbCwKLSNlbmRpZgotI2lmIFdJVEhfRU5HSU5FCi0gIHNpbV9lbmdpbmVfaW5zdGFsbCwKLSNlbmRpZgotI2lmIFdJVEhfVFJBQ0UKLSAgdHJhY2VfaW5zdGFsbCwKLSNlbmRpZgotI2lmIFdJVEhfUFJPRklMRQotICBwcm9maWxlX2luc3RhbGwsCi0jZW5kaWYKLSAgc2ltX2NvcmVfaW5zdGFsbCwKLSNpZm5kZWYgU0lNX0hBVkVfRkxBVE1FTQotICAvKiBGSVhNRTogc2hvdWxkIGhhbmRsZSBmbGF0bWVtIGFzIHdlbGwgRkxBVE1FTSAqLwotICBzaW1fbWVtb3B0X2luc3RhbGwsCi0jZW5kaWYKLSNpZiBXSVRIX1dBVENIUE9JTlRTCi0gIHNpbV93YXRjaHBvaW50X2luc3RhbGwsCi0jZW5kaWYKLSNpZiBXSVRIX1NDQUNIRQotICBzY2FjaGVfaW5zdGFsbCwKLSNlbmRpZgotI2lmZGVmIFNJTV9IQVZFX0JSRUFLUE9JTlRTCi0gIHNpbV9icmVha19pbnN0YWxsLAotI2VuZGlmCi0jaWYgV0lUSF9IVwotICBzaW1faHdfaW5zdGFsbCwKLSNlbmRpZgotICAvKiBDb25maWd1cmVkIGluIFtzaW11bGF0b3Igc3BlY2lmaWNdIGFkZGl0aW9uYWwgbW9kdWxlcy4gICovCi0jaWZkZWYgTU9EVUxFX0xJU1QKLSAgTU9EVUxFX0xJU1QKLSNlbmRpZgotICAwCi19OwotDAotLyogRnVuY3Rpb25zIGNhbGxlZCBmcm9tIHNpbV9vcGVuLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBjb21tb24gcGFydHMgYmVmb3JlIGFyZ3VtZW50IHByb2Nlc3NpbmcuICAqLwotCi1TSU1fUkMKLXNpbV9wcmVfYXJndl9pbml0IChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbXluYW1lKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgPT0gTlVMTCk7Ci0KLSAgU1RBVEVfTVlfTkFNRSAoc2QpID0gbXluYW1lICsgc3RybGVuIChteW5hbWUpOwotICB3aGlsZSAoU1RBVEVfTVlfTkFNRSAoc2QpID4gbXluYW1lICYmIFNUQVRFX01ZX05BTUUgKHNkKVstMV0gIT0gJy8nKQotICAgIC0tU1RBVEVfTVlfTkFNRSAoc2QpOwotCi0gIC8qIFNldCB0aGUgY3B1IG5hbWVzIHRvIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotICAgICAgewotCWNoYXIgKm5hbWU7Ci0JYXNwcmludGYgKCZuYW1lLCAiY3B1JWQiLCBpKTsKLQlDUFVfTkFNRSAoU1RBVEVfQ1BVIChzZCwgaSkpID0gbmFtZTsKLSAgICAgIH0KLSAgfQotCi0gIHNpbV9jb25maWdfZGVmYXVsdCAoc2QpOwotCi0gIC8qIEluc3RhbGwgYWxsIGNvbmZpZ3VyZWQgaW4gbW9kdWxlcy4gICovCi0gIGlmIChzaW1fbW9kdWxlX2luc3RhbGwgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIEluaXRpYWxpemUgY29tbW9uIHBhcnRzIGFmdGVyIGFyZ3VtZW50IHByb2Nlc3NpbmcuICAqLwotCi1TSU1fUkMKLXNpbV9wb3N0X2FyZ3ZfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIGludCBpOwotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7Ci0KLSAgLyogU2V0IHRoZSBjcHUtPnN0YXRlIGJhY2tsaW5rcyBmb3IgZWFjaCBjcHUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKLSAgICB7Ci0gICAgICBDUFVfU1RBVEUgKFNUQVRFX0NQVSAoc2QsIGkpKSA9IHNkOwotICAgICAgQ1BVX0lOREVYIChTVEFURV9DUFUgKHNkLCBpKSkgPSBpOwotICAgIH0KLQotICBpZiAoc2ltX21vZHVsZV9pbml0IChzZCkgIT0gU0lNX1JDX09LKQotICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotDAotLyogSW5zdGFsbCBhbGwgbW9kdWxlcy4KLSAgIElmIHRoaXMgZmFpbHMsIG5vIG1vZHVsZXMgYXJlIGxlZnQgaW5zdGFsbGVkLiAgKi8KLQotU0lNX1JDCi1zaW1fbW9kdWxlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBNT0RVTEVfSU5TVEFMTF9GTiAqIGNvbnN0ICptb2RwOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSA9PSBOVUxMKTsKLQotICBTVEFURV9NT0RVTEVTIChzZCkgPSBaQUxMT0MgKHN0cnVjdCBtb2R1bGVfbGlzdCk7Ci0gIGZvciAobW9kcCA9IG1vZHVsZXM7ICptb2RwICE9IE5VTEw7ICsrbW9kcCkKLSAgICB7Ci0gICAgICBpZiAoKCptb2RwKSAoc2QpICE9IFNJTV9SQ19PSykKLQl7Ci0JICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotCSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpID09IE5VTEwpOwotCSAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCX0KLSAgICB9Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciBhbGwgbW9kdWxlcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGFuZCBhZnRlciBhcmd2Ci0gICBoYXMgYmVlbiBwcm9jZXNzZWQuICAqLwotCi1TSU1fUkMKLXNpbV9tb2R1bGVfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0gIHN0cnVjdCBtb2R1bGVfbGlzdCAqbW9kdWxlcyA9IFNUQVRFX01PRFVMRVMgKHNkKTsKLSAgTU9EVUxFX0lOSVRfTElTVCAqbW9kcDsKLQotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7Ci0KLSAgZm9yIChtb2RwID0gbW9kdWxlcy0+aW5pdF9saXN0OyBtb2RwICE9IE5VTEw7IG1vZHAgPSBtb2RwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoKm1vZHAtPmZuKSAoc2QpICE9IFNJTV9SQ19PSykKLQlyZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0vKiBDYWxsZWQgd2hlbiBldmVyIHRoZSBzaW11bGF0b3IgaXMgcmVzdW1lZCAqLwotCi1TSU1fUkMKLXNpbV9tb2R1bGVfcmVzdW1lIChTSU1fREVTQyBzZCkKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfUkVTVU1FX0xJU1QgKm1vZHA7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIGZvciAobW9kcCA9IG1vZHVsZXMtPnJlc3VtZV9saXN0OyBtb2RwICE9IE5VTEw7IG1vZHAgPSBtb2RwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoKm1vZHAtPmZuKSAoc2QpICE9IFNJTV9SQ19PSykKLQlyZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0vKiBDYWxsZWQgd2hlbiBldmVyIHRoZSBzaW11bGF0b3IgaXMgc3VzcGVuZGVkICovCi0KLVNJTV9SQwotc2ltX21vZHVsZV9zdXNwZW5kIChTSU1fREVTQyBzZCkKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfU1VTUEVORF9MSVNUICptb2RwOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKTsKLQotICBmb3IgKG1vZHAgPSBtb2R1bGVzLT5zdXNwZW5kX2xpc3Q7IG1vZHAgIT0gTlVMTDsgbW9kcCA9IG1vZHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCgqbW9kcC0+Zm4pIChzZCkgIT0gU0lNX1JDX09LKQotCXJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIFVuaW5zdGFsbCBpbnN0YWxsZWQgbW9kdWxlcywgY2FsbGVkIGJ5IHNpbV9jbG9zZS4gICovCi0KLXZvaWQKLXNpbV9tb2R1bGVfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfVU5JTlNUQUxMX0xJU1QgKm1vZHA7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcy4gICovCi0gIGZvciAobW9kcCA9IG1vZHVsZXMtPnVuaW5zdGFsbF9saXN0OyBtb2RwICE9IE5VTEw7IG1vZHAgPSBtb2RwLT5uZXh0KQotICAgICgqbW9kcC0+Zm4pIChzZCk7Ci0KLSAgLyogY2xlYW4tdXAgaW5pdCBsaXN0ICovCi0gIHsKLSAgICBNT0RVTEVfSU5JVF9MSVNUICpuLCAqZDsKLSAgICBmb3IgKGQgPSBtb2R1bGVzLT5pbml0X2xpc3Q7IGQgIT0gTlVMTDsgZCA9IG4pCi0gICAgICB7Ci0JbiA9IGQtPm5leHQ7Ci0JemZyZWUgKGQpOwotICAgICAgfQotICB9Ci0KLSAgLyogY2xlYW4tdXAgcmVzdW1lIGxpc3QgKi8KLSAgewotICAgIE1PRFVMRV9SRVNVTUVfTElTVCAqbiwgKmQ7Ci0gICAgZm9yIChkID0gbW9kdWxlcy0+cmVzdW1lX2xpc3Q7IGQgIT0gTlVMTDsgZCA9IG4pCi0gICAgICB7Ci0JbiA9IGQtPm5leHQ7Ci0JemZyZWUgKGQpOwotICAgICAgfQotICB9Ci0KLSAgLyogY2xlYW4tdXAgc3VzcGVuZCBsaXN0ICovCi0gIHsKLSAgICBNT0RVTEVfU1VTUEVORF9MSVNUICpuLCAqZDsKLSAgICBmb3IgKGQgPSBtb2R1bGVzLT5zdXNwZW5kX2xpc3Q7IGQgIT0gTlVMTDsgZCA9IG4pCi0gICAgICB7Ci0JbiA9IGQtPm5leHQ7Ci0JemZyZWUgKGQpOwotICAgICAgfQotICB9Ci0KLSAgLyogY2xlYW4tdXAgdW5pbnN0YWxsIGxpc3QgKi8KLSAgewotICAgIE1PRFVMRV9VTklOU1RBTExfTElTVCAqbiwgKmQ7Ci0gICAgZm9yIChkID0gbW9kdWxlcy0+dW5pbnN0YWxsX2xpc3Q7IGQgIT0gTlVMTDsgZCA9IG4pCi0gICAgICB7Ci0JbiA9IGQtPm5leHQ7Ci0JemZyZWUgKGQpOwotICAgICAgfQotICB9Ci0KLSAgLyogY2xlYW4tdXAgaW5mbyBsaXN0ICovCi0gIHsKLSAgICBNT0RVTEVfSU5GT19MSVNUICpuLCAqZDsKLSAgICBmb3IgKGQgPSBtb2R1bGVzLT5pbmZvX2xpc3Q7IGQgIT0gTlVMTDsgZCA9IG4pCi0gICAgICB7Ci0JbiA9IGQtPm5leHQ7Ci0JemZyZWUgKGQpOwotICAgICAgfQotICB9Ci0KLSAgemZyZWUgKG1vZHVsZXMpOwotICBTVEFURV9NT0RVTEVTIChzZCkgPSBOVUxMOwotfQotCi0vKiBDYWxsZWQgd2hlbiBldmVyIHNpbXVsYXRvciBpbmZvIGlzIG5lZWRlZCAqLwotCi12b2lkCi1zaW1fbW9kdWxlX2luZm8gKFNJTV9ERVNDIHNkLCBpbnQgdmVyYm9zZSkKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfSU5GT19MSVNUICptb2RwOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKTsKLQotICBmb3IgKG1vZHAgPSBtb2R1bGVzLT5pbmZvX2xpc3Q7IG1vZHAgIT0gTlVMTDsgbW9kcCA9IG1vZHAtPm5leHQpCi0gICAgewotICAgICAgKCptb2RwLT5mbikgKHNkLCB2ZXJib3NlKTsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgRk4gdG8gdGhlIGluaXQgaGFuZGxlciBsaXN0LgotICAgaW5pdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgaW5zdGFsbC4gKi8KLQotdm9pZAotc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9JTklUX0ZOIGZuKQotewotICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7Ci0gIE1PRFVMRV9JTklUX0xJU1QgKmwgPSBaQUxMT0MgKE1PRFVMRV9JTklUX0xJU1QpOwotICBNT0RVTEVfSU5JVF9MSVNUICoqbGFzdDsKLQotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7Ci0KLSAgbGFzdCA9ICZtb2R1bGVzLT5pbml0X2xpc3Q7Ci0gIHdoaWxlICgqbGFzdCAhPSBOVUxMKQotICAgIGxhc3QgPSAmKCgqbGFzdCktPm5leHQpOwotCi0gIGwtPmZuID0gZm47Ci0gIGwtPm5leHQgPSBOVUxMOwotICAqbGFzdCA9IGw7Ci19Ci0KLS8qIEFkZCBGTiB0byB0aGUgcmVzdW1lIGhhbmRsZXIgbGlzdC4KLSAgIHJlc3VtZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgaW5zdGFsbC4gKi8KLQotdm9pZAotc2ltX21vZHVsZV9hZGRfcmVzdW1lX2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX1JFU1VNRV9GTiBmbikKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfUkVTVU1FX0xJU1QgKmwgPSBaQUxMT0MgKE1PRFVMRV9SRVNVTUVfTElTVCk7Ci0gIE1PRFVMRV9SRVNVTUVfTElTVCAqKmxhc3Q7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIGxhc3QgPSAmbW9kdWxlcy0+cmVzdW1lX2xpc3Q7Ci0gIHdoaWxlICgqbGFzdCAhPSBOVUxMKQotICAgIGxhc3QgPSAmKCgqbGFzdCktPm5leHQpOwotCi0gIGwtPmZuID0gZm47Ci0gIGwtPm5leHQgPSBOVUxMOwotICAqbGFzdCA9IGw7Ci19Ci0KLS8qIEFkZCBGTiB0byB0aGUgaW5pdCBoYW5kbGVyIGxpc3QuCi0gICBzdXNwZW5kIGluIHRoZSByZXZlcnNlIG9yZGVyIHRvIGluc3RhbGwuICovCi0KLXZvaWQKLXNpbV9tb2R1bGVfYWRkX3N1c3BlbmRfZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfU1VTUEVORF9GTiBmbikKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfU1VTUEVORF9MSVNUICpsID0gWkFMTE9DIChNT0RVTEVfU1VTUEVORF9MSVNUKTsKLSAgTU9EVUxFX1NVU1BFTkRfTElTVCAqKmxhc3Q7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIGxhc3QgPSAmbW9kdWxlcy0+c3VzcGVuZF9saXN0OwotICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKLSAgICBsYXN0ID0gJigoKmxhc3QpLT5uZXh0KTsKLQotICBsLT5mbiA9IGZuOwotICBsLT5uZXh0ID0gbW9kdWxlcy0+c3VzcGVuZF9saXN0OwotICBtb2R1bGVzLT5zdXNwZW5kX2xpc3QgPSBsOwotfQotCi0vKiBBZGQgRk4gdG8gdGhlIHVuaW5zdGFsbCBoYW5kbGVyIGxpc3QuCi0gICBVbmluc3RhbGwgaW4gcmV2ZXJzZSBvcmRlciB0byBpbnN0YWxsLiAgKi8KLQotdm9pZAotc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX1VOSU5TVEFMTF9GTiBmbikKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfVU5JTlNUQUxMX0xJU1QgKmwgPSBaQUxMT0MgKE1PRFVMRV9VTklOU1RBTExfTElTVCk7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIGwtPmZuID0gZm47Ci0gIGwtPm5leHQgPSBtb2R1bGVzLT51bmluc3RhbGxfbGlzdDsKLSAgbW9kdWxlcy0+dW5pbnN0YWxsX2xpc3QgPSBsOwotfQotCi0vKiBBZGQgRk4gdG8gdGhlIGluZm8gaGFuZGxlciBsaXN0LgotICAgUmVwb3J0IGluZm8gaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGluc3RhbGwuICovCi0KLXZvaWQKLXNpbV9tb2R1bGVfYWRkX2luZm9fZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfSU5GT19GTiBmbikKLXsKLSAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOwotICBNT0RVTEVfSU5GT19MSVNUICpsID0gWkFMTE9DIChNT0RVTEVfSU5GT19MSVNUKTsKLSAgTU9EVUxFX0lORk9fTElTVCAqKmxhc3Q7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOwotCi0gIGxhc3QgPSAmbW9kdWxlcy0+aW5mb19saXN0OwotICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKLSAgICBsYXN0ID0gJigoKmxhc3QpLT5uZXh0KTsKLQotICBsLT5mbiA9IGZuOwotICBsLT5uZXh0ID0gTlVMTDsKLSAgKmxhc3QgPSBsOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbW9kdWxlLmggYi9zaW0vY29tbW9uL3NpbS1tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiYTM1MC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKiBNb2R1bGUgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBzaW0tYmFzZS5oLiAgKi8KLQotI2lmbmRlZiBTSU1fTU9EVUxFU19ICi0jZGVmaW5lIFNJTV9NT0RVTEVTX0gKLQotLyogTW9kdWxlcyBhcmUgYWRkb25zIHRvIHRoZSBzaW11bGF0b3IgdGhhdCBwZXJmb3JtIGEgc3BlY2lmaWMgZnVuY3Rpb24KLSAgIChlLmcuIHRyYWNpbmcsIHByb2ZpbGluZywgbWVtb3J5IHN1YnN5c3RlbSwgZXRjLikuICBTb21lIG1vZHVsZXMgYXJlCi0gICBidWlsdGluLCBhbmQgb3RoZXJzIGFyZSBhZGRlZCBhdCBjb25maWd1cmUgdGltZS4gIFRoZSBpbnRlbnQgaXMgdG8KLSAgIHByb3ZpZGUgYSB1bmlmb3JtIGZyYW1ld29yayBmb3IgYWxsIG9mIHRoZSBwaWVjZXMgdGhhdCBtYWtlIHVwIHRoZQotICAgc2ltdWxhdG9yLgotCi0gICBUT0RPOiBBZGQgZmFjaWxpdGllcyBmb3Igc2F2aW5nL3Jlc3RvcmluZyBzdGF0ZSB0by9mcm9tIGEgZmlsZS4gICovCi0KLQotLyogVmFyaW91cyBmdW5jdGlvbiB0eXBlcy4gICovCi0KLXR5cGVkZWYgU0lNX1JDIChNT0RVTEVfSU5TVEFMTF9GTikgKFNJTV9ERVNDKTsKLXR5cGVkZWYgU0lNX1JDIChNT0RVTEVfSU5JVF9GTikgKFNJTV9ERVNDKTsKLXR5cGVkZWYgU0lNX1JDIChNT0RVTEVfUkVTVU1FX0ZOKSAoU0lNX0RFU0MpOwotdHlwZWRlZiBTSU1fUkMgKE1PRFVMRV9TVVNQRU5EX0ZOKSAoU0lNX0RFU0MpOwotdHlwZWRlZiB2b2lkICAgKE1PRFVMRV9VTklOU1RBTExfRk4pIChTSU1fREVTQyk7Ci10eXBlZGVmIHZvaWQgICAoTU9EVUxFX0lORk9fRk4pIChTSU1fREVTQywgaW50KTsKLQotCi0vKiBMaXN0cyBvZiBpbnN0YWxsZWQgaGFuZGxlcnMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBtb2R1bGVfaW5pdF9saXN0IHsKLSAgc3RydWN0IG1vZHVsZV9pbml0X2xpc3QgKm5leHQ7Ci0gIE1PRFVMRV9JTklUX0ZOICpmbjsKLX0gTU9EVUxFX0lOSVRfTElTVDsKLQotdHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX3Jlc3VtZV9saXN0IHsKLSAgc3RydWN0IG1vZHVsZV9yZXN1bWVfbGlzdCAqbmV4dDsKLSAgTU9EVUxFX1JFU1VNRV9GTiAqZm47Ci19IE1PRFVMRV9SRVNVTUVfTElTVDsKLQotdHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX3N1c3BlbmRfbGlzdCB7Ci0gIHN0cnVjdCBtb2R1bGVfc3VzcGVuZF9saXN0ICpuZXh0OwotICBNT0RVTEVfU1VTUEVORF9GTiAqZm47Ci19IE1PRFVMRV9TVVNQRU5EX0xJU1Q7Ci0KLXR5cGVkZWYgc3RydWN0IG1vZHVsZV91bmluc3RhbGxfbGlzdCB7Ci0gIHN0cnVjdCBtb2R1bGVfdW5pbnN0YWxsX2xpc3QgKm5leHQ7Ci0gIE1PRFVMRV9VTklOU1RBTExfRk4gKmZuOwotfSBNT0RVTEVfVU5JTlNUQUxMX0xJU1Q7Ci0KLXR5cGVkZWYgc3RydWN0IG1vZHVsZV9pbmZvX2xpc3QgewotICBzdHJ1Y3QgbW9kdWxlX2luZm9fbGlzdCAqbmV4dDsKLSAgTU9EVUxFX0lORk9fRk4gKmZuOwotfSBNT0RVTEVfSU5GT19MSVNUOwotCi0KLS8qIEZ1bmN0aW9ucyB0byByZWdpc3RlciBtb2R1bGUgd2l0aCB2YXJpb3VzIGhhbmRsZXIgbGlzdHMgKi8KLQotU0lNX1JDIHNpbV9tb2R1bGVfaW5zdGFsbCAoU0lNX0RFU0MpOwotdm9pZCBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoU0lNX0RFU0MpOwotdm9pZCBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX0lOSVRfRk4gZm4pOwotdm9pZCBzaW1fbW9kdWxlX2FkZF9yZXN1bWVfZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfUkVTVU1FX0ZOIGZuKTsKLXZvaWQgc2ltX21vZHVsZV9hZGRfc3VzcGVuZF9mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9TVVNQRU5EX0ZOIGZuKTsKLXZvaWQgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX1VOSU5TVEFMTF9GTiBmbik7Ci12b2lkIHNpbV9tb2R1bGVfYWRkX2luZm9fZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfSU5GT19GTiBmbik7Ci0KLQotLyogSW5pdGlhbGl6ZSBpbnN0YWxsZWQgbW9kdWxlcyBiZWZvcmUgYXJndW1lbnQgcHJvY2Vzc2luZy4KLSAgIENhbGxlZCBieSBzaW1fb3Blbi4gICovCi1TSU1fUkMgc2ltX3ByZV9hcmd2X2luaXQgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICpteW5hbWUpOwotCi0vKiBJbml0aWFsaXplIGluc3RhbGxlZCBtb2R1bGVzIGFmdGVyIGFyZ3VtZW50IHByb2Nlc3NpbmcuCi0gICBDYWxsZWQgYnkgc2ltX29wZW4uICAqLwotU0lNX1JDIHNpbV9wb3N0X2FyZ3ZfaW5pdCAoU0lNX0RFU0Mgc2QpOwotCi0vKiBSZS1pbml0aWFsaXplIHRoZSBtb2R1bGUuICBDYWxsZWQgYnkgc2ltX2NyZWF0ZV9pbmZlcmlvci4gKi8KLVNJTV9SQyBzaW1fbW9kdWxlX2luaXQgKFNJTV9ERVNDIHNkKTsKLQotLyogU3VzcGVuZC9yZXN1bWUgbW9kdWxlcy4gIENhbGxlZCBieSBzaW1fcnVuIG9yIHNpbV9yZXN1bWUgKi8KLVNJTV9SQyBzaW1fbW9kdWxlX3N1c3BlbmQgKFNJTV9ERVNDIHNkKTsKLVNJTV9SQyBzaW1fbW9kdWxlX3Jlc3VtZSAoU0lNX0RFU0Mgc2QpOwotCi0vKiBSZXBvcnQgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiBtb2R1bGUgKi8KLXZvaWQgc2ltX21vZHVsZV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpOwotCi0KLS8qIE1vZHVsZSBwcml2YXRlIGRhdGEgKi8KLQotc3RydWN0IG1vZHVsZV9saXN0IHsKLQotICAvKiBMaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgYGluaXQnIGhhbmRsZXJzICovCi0gIE1PRFVMRV9JTklUX0xJU1QgKmluaXRfbGlzdDsKLQotICAvKiBMaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgYHVuaW5zdGFsbCcgaGFuZGxlcnMuICAqLwotICBNT0RVTEVfVU5JTlNUQUxMX0xJU1QgKnVuaW5zdGFsbF9saXN0OwotCi0gIC8qIExpc3Qgb2YgaW5zdGFsbGVkIG1vZHVsZSBgcmVzdW1lJyBoYW5kbGVycy4gICovCi0gIE1PRFVMRV9SRVNVTUVfTElTVCAqcmVzdW1lX2xpc3Q7Ci0KLSAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGBzdXNwZW5kJyBoYW5kbGVycy4gICovCi0gIE1PRFVMRV9TVVNQRU5EX0xJU1QgKnN1c3BlbmRfbGlzdDsKLQotICAvKiBMaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgYGluZm8nIGhhbmRsZXJzLiAgKi8KLSAgTU9EVUxFX0lORk9fTElTVCAqaW5mb19saXN0OwotCi19OwotCi0KLSNlbmRpZiAvKiBTSU1fTU9EVUxFU19IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1uLWJpdHMuaCBiL3NpbS9jb21tb24vc2ltLW4tYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE1N2ZmLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLW4tYml0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBOCi0jZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKLSNlbmRpZgotCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBkZWZpbmVkKHNpZ25lZCkKLS8qIElmIHNpZ25lZCB3ZXJlIGRlZmluZWQgdG8gYmUgc2F5IF9fc2lnbmVkIChpZSwgc29tZSB2ZXJzaW9ucyBvZiBMaW51eCksCi0gICB0aGVuIHRoZSBzaWduZWROIG1hY3JvIHdvdWxkIG5vdCB3b3JrIGNvcnJlY3RseS4gIElmIHdlIGhhdmUgYSBzdGFuZGFyZAotICAgY29tcGlsZXIsIHdlIGhhdmUgc2lnbmVkLiAgKi8KLSN1bmRlZiBzaWduZWQKLSNlbmRpZgotCi0vKiBOT1RFOiBTZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiAqLwotI2RlZmluZSB1bnNpZ25lZE4gWENPTkNBVDIodW5zaWduZWQsTikKLSNkZWZpbmUgc2lnbmVkTiBYQ09OQ0FUMihzaWduZWQsTikKLSNkZWZpbmUgTFNNQVNLbiBYQ09OQ0FUMihMU01BU0ssTikKLSNkZWZpbmUgTVNNQVNLbiBYQ09OQ0FUMihNU01BU0ssTikKLSNkZWZpbmUgTFNNQVNLRURuIFhDT05DQVQyKExTTUFTS0VELE4pCi0jZGVmaW5lIE1TTUFTS0VEbiBYQ09OQ0FUMihNU01BU0tFRCxOKQotI2RlZmluZSBMU0VYVFJBQ1RFRG4gWENPTkNBVDIoTFNFWFRSQUNURUQsTikKLSNkZWZpbmUgTVNFWFRSQUNURURuIFhDT05DQVQyKE1TRVhUUkFDVEVELE4pCi0jZGVmaW5lIExTSU5TRVJURURuIFhDT05DQVQyKExTSU5TRVJURUQsTikKLSNkZWZpbmUgTVNJTlNFUlRFRG4gWENPTkNBVDIoTVNJTlNFUlRFRCxOKQotI2RlZmluZSBST1RuIFhDT05DQVQyKFJPVCxOKQotI2RlZmluZSBST1RMbiBYQ09OQ0FUMihST1RMLE4pCi0jZGVmaW5lIFJPVFJuIFhDT05DQVQyKFJPVFIsTikKLSNkZWZpbmUgTVNTRVhUbiBYQ09OQ0FUMihNU1NFWFQsTikKLSNkZWZpbmUgTFNTRVhUbiBYQ09OQ0FUMihMU1NFWFQsTikKLQotLyogVEFHUzogTFNNQVNLRUQxNiBMU01BU0tFRDMyIExTTUFTS0VENjQgKi8KLQotSU5MSU5FX1NJTV9CSVRTXAotKHVuc2lnbmVkTikKLUxTTUFTS0VEbiAodW5zaWduZWROIHdvcmQsCi0JICAgaW50IHN0YXJ0LAotCSAgIGludCBzdG9wKQotewotICB3b3JkICY9IExTTUFTS24gKHN0YXJ0LCBzdG9wKTsKLSAgcmV0dXJuIHdvcmQ7Ci19Ci0KLS8qIFRBR1M6IE1TTUFTS0VEMTYgTVNNQVNLRUQzMiBNU01BU0tFRDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1NU01BU0tFRG4gKHVuc2lnbmVkTiB3b3JkLAotCSAgIGludCBzdGFydCwKLQkgICBpbnQgc3RvcCkKLXsKLSAgd29yZCAmPSBNU01BU0tuIChzdGFydCwgc3RvcCk7Ci0gIHJldHVybiB3b3JkOwotfQotCi0vKiBUQUdTOiBMU0VYVFJBQ1RFRDE2IExTRVhUUkFDVEVEMzIgTFNFWFRSQUNURUQ2NCAqLwotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWROKQotTFNFWFRSQUNURURuICh1bnNpZ25lZE4gdmFsLAotCSAgICAgIGludCBzdGFydCwKLQkgICAgICBpbnQgc3RvcCkKLXsKLSAgdmFsIDw8PSAoTiAtIDEgLSBzdGFydCk7IC8qIGRyb3AgaGlnaCBiaXRzICovCi0gIHZhbCA+Pj0gKE4gLSAxIC0gc3RhcnQpICsgKHN0b3ApOyAvKiBkcm9wIGxvdyBiaXRzICovCi0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIFRBR1M6IE1TRVhUUkFDVEVEMTYgTVNFWFRSQUNURUQzMiBNU0VYVFJBQ1RFRDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1NU0VYVFJBQ1RFRG4gKHVuc2lnbmVkTiB2YWwsCi0JICAgICAgaW50IHN0YXJ0LAotCSAgICAgIGludCBzdG9wKQotewotICB2YWwgPDw9IChzdGFydCk7IC8qIGRyb3AgaGlnaCBiaXRzICovCi0gIHZhbCA+Pj0gKHN0YXJ0KSArIChOIC0gMSAtIHN0b3ApOyAvKiBkcm9wIGxvdyBiaXRzICovCi0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIFRBR1M6IExTSU5TRVJURUQxNiBMU0lOU0VSVEVEMzIgTFNJTlNFUlRFRDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1MU0lOU0VSVEVEbiAodW5zaWduZWROIHZhbCwKLQkgICAgIGludCBzdGFydCwKLQkgICAgIGludCBzdG9wKQotewotICB2YWwgPDw9IHN0b3A7Ci0gIHZhbCAmPSBMU01BU0tuIChzdGFydCwgc3RvcCk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIFRBR1M6IE1TSU5TRVJURUQxNiBNU0lOU0VSVEVEMzIgTVNJTlNFUlRFRDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1NU0lOU0VSVEVEbiAodW5zaWduZWROIHZhbCwKLQkgICAgIGludCBzdGFydCwKLQkgICAgIGludCBzdG9wKQotewotICB2YWwgPDw9ICgoTiAtIDEpIC0gc3RvcCk7Ci0gIHZhbCAmPSBNU01BU0tuIChzdGFydCwgc3RvcCk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIFRBR1M6IFJPVDE2IFJPVDMyIFJPVDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1ST1RuICh1bnNpZ25lZE4gdmFsLAotICAgICAgaW50IHNoaWZ0KQotewotICBpZiAoc2hpZnQgPiAwKQotICAgIHJldHVybiBST1RSbiAodmFsLCBzaGlmdCk7Ci0gIGVsc2UgaWYgKHNoaWZ0IDwgMCkKLSAgICByZXR1cm4gUk9UTG4gKHZhbCwgLXNoaWZ0KTsKLSAgZWxzZQotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qIFRBR1M6IFJPVEwxNiBST1RMMzIgUk9UTDY0ICovCi0KLUlOTElORV9TSU1fQklUU1wKLSh1bnNpZ25lZE4pCi1ST1RMbiAodW5zaWduZWROIHZhbCwKLSAgICAgICBpbnQgc2hpZnQpCi17Ci0gIHVuc2lnbmVkTiByZXN1bHQ7Ci0gIEFTU0VSVCAoc2hpZnQgPD0gTik7Ci0gIHJlc3VsdCA9ICgoKHZhbCkgPDwgKHNoaWZ0KSkgfCAoKHZhbCkgPj4gKChOKS0oc2hpZnQpKSkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUQUdTOiBST1RSMTYgUk9UUjMyIFJPVFI2NCAqLwotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWROKQotUk9UUm4gKHVuc2lnbmVkTiB2YWwsCi0gICAgICAgaW50IHNoaWZ0KQotewotICB1bnNpZ25lZE4gcmVzdWx0OwotICBBU1NFUlQgKHNoaWZ0IDw9IE4pOwotICByZXN1bHQgPSAoKCh2YWwpID4+IChzaGlmdCkpIHwgKCh2YWwpIDw8ICgoTiktKHNoaWZ0KSkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVEFHUzogTFNTRVhUMTYgTFNTRVhUMzIgTFNTRVhUNjQgKi8KLQotSU5MSU5FX1NJTV9CSVRTXAotKHVuc2lnbmVkTikKLUxTU0VYVG4gKHNpZ25lZE4gdmFsLAotCSBpbnQgc2lnbl9iaXQpCi17Ci0gIGludCBzaGlmdDsKLSAgLyogbWFrZSB0aGUgc2lnbi1iaXQgbW9zdCBzaWduaWZpY2FudCBhbmQgdGhlbiBzbWVhciBpdCBiYWNrIGludG8KLSAgICAgcG9zaXRpb24gKi8KLSAgQVNTRVJUIChzaWduX2JpdCA8IE4pOwotICBzaGlmdCA9ICgoTiAtIDEpIC0gc2lnbl9iaXQpOwotICB2YWwgPDw9IHNoaWZ0OwotICB2YWwgPj49IHNoaWZ0OwotICByZXR1cm4gdmFsOwotfQotCi0vKiBUQUdTOiBNU1NFWFQxNiBNU1NFWFQzMiBNU1NFWFQ2NCAqLwotCi1JTkxJTkVfU0lNX0JJVFNcCi0odW5zaWduZWROKQotTVNTRVhUbiAoc2lnbmVkTiB2YWwsCi0JIGludCBzaWduX2JpdCkKLXsKLSAgLyogbWFrZSB0aGUgc2lnbi1iaXQgbW9zdCBzaWduaWZpY2FudCBhbmQgdGhlbiBzbWVhciBpdCBiYWNrIGludG8KLSAgICAgcG9zaXRpb24gKi8KLSAgQVNTRVJUIChzaWduX2JpdCA8IE4pOwotICB2YWwgPDw9IHNpZ25fYml0OwotICB2YWwgPj49IHNpZ25fYml0OwotICByZXR1cm4gdmFsOwotfQotCi0KLS8qIE5PVEU6IFNlZSBzdGFydCBvZiBmaWxlIGZvciAjZGVmaW5lICovCi0jdW5kZWYgTFNTRVhUbgotI3VuZGVmIE1TU0VYVG4KLSN1bmRlZiBST1RMbgotI3VuZGVmIFJPVFJuCi0jdW5kZWYgUk9UbgotI3VuZGVmIExTSU5TRVJURURuCi0jdW5kZWYgTVNJTlNFUlRFRG4KLSN1bmRlZiBMU0VYVFJBQ1RFRG4KLSN1bmRlZiBNU0VYVFJBQ1RFRG4KLSN1bmRlZiBMU01BU0tFRG4KLSN1bmRlZiBMU01BU0tuCi0jdW5kZWYgTVNNQVNLRURuCi0jdW5kZWYgTVNNQVNLbgotI3VuZGVmIHNpZ25lZE4KLSN1bmRlZiB1bnNpZ25lZE4KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLW4tY29yZS5oIGIvc2ltL2NvbW1vbi9zaW0tbi1jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDRhOWYuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tbi1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBOCi0jZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKLSNlbmRpZgotI2lmbmRlZiBNCi0jZGVmaW5lIE0gTgotI2VuZGlmCi0KLS8qIE46IFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byB0cmFuc2Zlci4KLSAgIE06IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHR5cGUgdXNlZCB0byB0cmFuc2ZlciB0aGUgZGF0YSAqLwotCi0jaWYgKE4gPiBNKQotI2Vycm9yICJOIChuciBieXRlcyBvZiBkYXRhKSBtdXN0IGJlIDw9IE0gKG5yIG9mIGJ5dGVzIGluIGRhdGEgdHlwZSkiCi0jZW5kaWYKLQotCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0KLS8qIE5PVEU6IHNlZSBlbmQgb2YgZmlsZSBmb3IgI3VuZGVmIG9mIHRoZXNlIG1hY3JvcyAqLwotCi0jZGVmaW5lIHVuc2lnbmVkX00gWENPTkNBVDIodW5zaWduZWRfLE0pCi0KLSNkZWZpbmUgVDJIX00gWENPTkNBVDIoVDJIXyxNKQotI2RlZmluZSBIMlRfTSBYQ09OQ0FUMihIMlRfLE0pCi0jZGVmaW5lIFNXQVBfTSBYQ09OQ0FUMihTV0FQXyxNKQotCi0jZGVmaW5lIHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OIFhDT05DQVQyKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8sTikKLSNkZWZpbmUgc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTiBYQ09OQ0FUMihzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8sTikKLSNkZWZpbmUgc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkX04gWENPTkNBVDIoc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXyxOKQotI2RlZmluZSBzaW1fY29yZV93cml0ZV9hbGlnbmVkX04gWENPTkNBVDIoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8sTikKLSNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkX04gWENPTkNBVDIoc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXyxOKQotI2RlZmluZSBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkX04gWENPTkNBVDIoc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF8sTikKLSNkZWZpbmUgc2ltX2NvcmVfdHJhY2VfTSBYQ09OQ0FUMihzaW1fY29yZV90cmFjZV8sTSkKLSNkZWZpbmUgc2ltX2NvcmVfZHVtbXlfTSBYQ09OQ0FUMihzaW1fY29yZV9kdW1teV8sTSkKLQotCi0jaWYgKE0gPT0gTiAmJiBOID4gMSkKLS8qIGR1bW15IHZhcmlhYmxlIHVzZWQgYXMgYSByZXR1cm4gdmFsdWUgd2hlbiBub3RoaW5nIGVsc2UgaXMKLSAgIGF2YWlsYWJsZSBhbmQgdGhlIGNvbXBpbGVyIGlzIGNvbXBsYWluaW5nICovCi1zdGF0aWMgdW5zaWduZWRfTSBzaW1fY29yZV9kdW1teV9NOwotI2VuZGlmCi0KLQotLyogVEFHUzogc2ltX2NvcmVfdHJhY2VfMSBzaW1fY29yZV90cmFjZV8yICovCi0vKiBUQUdTOiBzaW1fY29yZV90cmFjZV80IHNpbV9jb3JlX3RyYWNlXzggKi8KLS8qIFRBR1M6IHNpbV9jb3JlX3RyYWNlXzE2ICovCi0KLSNpZiAoTSA9PSBOKQotU1RBVElDX1NJTV9DT1JFKHZvaWQpCi1zaW1fY29yZV90cmFjZV9NIChzaW1fY3B1ICpjcHUsCi0JCSAgc2ltX2NpYSBjaWEsCi0JCSAgaW50IGxpbmVfbnIsCi0JCSAgdHJhbnNmZXJfdHlwZSB0eXBlLAotCQkgIHVuc2lnbmVkIG1hcCwKLQkJICBhZGRyZXNzX3dvcmQgYWRkciwKLQkJICB1bnNpZ25lZF9NIHZhbCwKLQkJICBpbnQgbnJfYnl0ZXMpCi17Ci0gIGNvbnN0IGNoYXIgKnRyYW5zZmVyID0gKHR5cGUgPT0gcmVhZF90cmFuc2ZlciA/ICJyZWFkIiA6ICJ3cml0ZSIpOwotICBjb25zdCBjaGFyICpkaXJlY3Rpb24gPSAodHlwZSA9PSByZWFkX3RyYW5zZmVyID8gIi0+IiA6ICI8LSIpOwotCi0gIGlmIChUUkFDRV9ERUJVR19QIChjcHUpKQotICAgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsICJzaW0tbi1jb3JlLmg6JWQ6ICIsIGxpbmVfbnIpOwotCi0jaWYgKE0gPT0gMTYpCi0gIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsCi0JCSIlcy0lZCAlczoweCUwOGx4ICVzIDB4JTA4bHglMDhseCUwOGx4JTA4bHhcbiIsCi0JCXRyYW5zZmVyLCBucl9ieXRlcywKLQkJbWFwX3RvX3N0ciAobWFwKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0JCWRpcmVjdGlvbiwKLQkJKHVuc2lnbmVkIGxvbmcpIFY0XzE2ICh2YWwsIDApLAotCQkodW5zaWduZWQgbG9uZykgVjRfMTYgKHZhbCwgMSksCi0JCSh1bnNpZ25lZCBsb25nKSBWNF8xNiAodmFsLCAyKSwKLQkJKHVuc2lnbmVkIGxvbmcpIFY0XzE2ICh2YWwsIDMpKTsKLSNlbmRpZgotI2lmIChNID09IDgpCi0gIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsCi0JCSIlcy0lZCAlczoweCUwOGx4ICVzIDB4JTA4bHglMDhseFxuIiwKLQkJdHJhbnNmZXIsIG5yX2J5dGVzLAotCQltYXBfdG9fc3RyIChtYXApLAotCQkodW5zaWduZWQgbG9uZykgYWRkciwKLQkJZGlyZWN0aW9uLAotCQkodW5zaWduZWQgbG9uZykgVjRfOCAodmFsLCAwKSwKLQkJKHVuc2lnbmVkIGxvbmcpIFY0XzggKHZhbCwgMSkpOwotI2VuZGlmCi0jaWYgKE0gPT0gNCkKLSAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwKLQkJIiVzLSVkICVzOjB4JTA4bHggJXMgMHglMDhseFxuIiwKLQkJdHJhbnNmZXIsCi0JCW5yX2J5dGVzLAotCQltYXBfdG9fc3RyIChtYXApLAotCQkodW5zaWduZWQgbG9uZykgYWRkciwKLQkJZGlyZWN0aW9uLAotCQkodW5zaWduZWQgbG9uZykgdmFsKTsKLSNlbmRpZgotI2lmIChNID09IDIpCi0gIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsCi0JCSIlcy0lZCAlczoweCUwOGx4ICVzIDB4JTA0bHhcbiIsCi0JCXRyYW5zZmVyLAotCQlucl9ieXRlcywKLQkJbWFwX3RvX3N0ciAobWFwKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0JCWRpcmVjdGlvbiwKLQkJKHVuc2lnbmVkIGxvbmcpIHZhbCk7Ci0jZW5kaWYKLSNpZiAoTSA9PSAxKQotICB0cmFjZV9wcmludGYgKENQVV9TVEFURSAoY3B1KSwgY3B1LAotCQkiJXMtJWQgJXM6MHglMDhseCAlcyAweCUwMmx4XG4iLAotCQl0cmFuc2ZlciwKLQkJbnJfYnl0ZXMsCi0JCW1hcF90b19zdHIgKG1hcCksCi0JCSh1bnNpZ25lZCBsb25nKSBhZGRyLAotCQlkaXJlY3Rpb24sCi0JCSh1bnNpZ25lZCBsb25nKSB2YWwpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotICAKLS8qIFRBR1M6IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8xIHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8yICovCi0vKiBUQUdTOiBzaW1fY29yZV9yZWFkX2FsaWduZWRfNCBzaW1fY29yZV9yZWFkX2FsaWduZWRfOCAqLwotLyogVEFHUzogc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzE2ICovCi0KLSNpZiAoTSA9PSBOKQotSU5MSU5FX1NJTV9DT1JFKHVuc2lnbmVkX00pCi1zaW1fY29yZV9yZWFkX2FsaWduZWRfTihzaW1fY3B1ICpjcHUsCi0JCQlzaW1fY2lhIGNpYSwKLQkJCXVuc2lnbmVkIG1hcCwKLQkJCWFkZHJlc3Nfd29yZCB4YWRkcikKLXsKLSAgc2ltX2NwdV9jb3JlICpjcHVfY29yZSA9IENQVV9DT1JFIChjcHUpOwotICBzaW1fY29yZV9jb21tb24gKmNvcmUgPSAmY3B1X2NvcmUtPmNvbW1vbjsKLSAgdW5zaWduZWRfTSB2YWw7Ci0gIHNpbV9jb3JlX21hcHBpbmcgKm1hcHBpbmc7Ci0gIGFkZHJlc3Nfd29yZCBhZGRyOwotI2lmIFdJVEhfWE9SX0VORElBTiAhPSAwCi0gIGlmIChXSVRIX1hPUl9FTkRJQU4pCi0gICAgYWRkciA9IHhhZGRyIF4gY3B1X2NvcmUtPnhvclsoTiAtIDEpICUgV0lUSF9YT1JfRU5ESUFOXTsKLSAgZWxzZQotI2VuZGlmCi0gICAgYWRkciA9IHhhZGRyOwotICBtYXBwaW5nID0gc2ltX2NvcmVfZmluZF9tYXBwaW5nIChjb3JlLCBtYXAsIGFkZHIsIE4sIHJlYWRfdHJhbnNmZXIsIDEgLyphYm9ydCovLCBjcHUsIGNpYSk7Ci0gIGRvCi0gICAgewotI2lmIChXSVRIX0RFVklDRVMpCi0gICAgICBpZiAoV0lUSF9DQUxMQkFDS19NRU1PUlkgJiYgbWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWRfTSBkYXRhOwotCSAgaWYgKGRldmljZV9pb19yZWFkX2J1ZmZlciAobWFwcGluZy0+ZGV2aWNlLCAmZGF0YSwgbWFwcGluZy0+c3BhY2UsIGFkZHIsIE4sIENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEpICE9IE4pCi0JICAgIGRldmljZV9lcnJvciAobWFwcGluZy0+ZGV2aWNlLCAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGlvX3JlYWRfYnVmZmVyIHNob3VsZCBub3QgZmFpbCIsCi0JCQkgIFhTVFJJTkcgKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OKSk7Ci0JICB2YWwgPSBUMkhfTSAoZGF0YSk7Ci0JICBicmVhazsKLQl9Ci0jZW5kaWYKLSNpZiAoV0lUSF9IVykKLSAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZF9NIGRhdGE7Ci0JICBzaW1fY3B1X2h3X2lvX3JlYWRfYnVmZmVyIChjcHUsIGNpYSwgbWFwcGluZy0+ZGV2aWNlLCAmZGF0YSwgbWFwcGluZy0+c3BhY2UsIGFkZHIsIE4pOwotCSAgdmFsID0gVDJIX00gKGRhdGEpOwotCSAgYnJlYWs7Ci0JfQotI2VuZGlmCi0gICAgICB2YWwgPSBUMkhfTSAoKih1bnNpZ25lZF9NKikgc2ltX2NvcmVfdHJhbnNsYXRlIChtYXBwaW5nLCBhZGRyKSk7Ci0gICAgfQotICB3aGlsZSAoMCk7Ci0gIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3B1LCBhZGRyLCBOLCBtYXApOwotICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCi0gICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7Ci0gIHJldHVybiB2YWw7Ci19Ci0jZW5kaWYKLSAgCi0vKiBUQUdTOiBzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8xIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzIgKi8KLS8qIFRBR1M6IHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzQgc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfOCAqLwotLyogVEFHUzogc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfMTYgKi8KLQotI2lmIChNID09IE4gJiYgTiA+IDEpCi1JTkxJTkVfU0lNX0NPUkUodW5zaWduZWRfTSkKLXNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04oc2ltX2NwdSAqY3B1LAotCQkJICBzaW1fY2lhIGNpYSwKLQkJCSAgdW5zaWduZWQgbWFwLAotCQkJICBhZGRyZXNzX3dvcmQgYWRkcikKLXsKLSAgaW50IGFsaWdubWVudCA9IE4gLSAxOwotICAvKiBpZiBoYXJkd2lyZWQgdG8gZm9yY2VkIGFsaWdubWVudCBqdXN0IGRvIGl0ICovCi0gIGlmIChXSVRIX0FMSUdOTUVOVCA9PSBGT1JDRURfQUxJR05NRU5UKQotICAgIHJldHVybiBzaW1fY29yZV9yZWFkX2FsaWduZWRfTiAoY3B1LCBjaWEsIG1hcCwgYWRkciAmIH5hbGlnbm1lbnQpOwotICBlbHNlIGlmICgoYWRkciAmIGFsaWdubWVudCkgPT0gMCkKLSAgICByZXR1cm4gc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04gKGNwdSwgY2lhLCBtYXAsIGFkZHIpOwotICBlbHNlCi0gICAgc3dpdGNoIChDVVJSRU5UX0FMSUdOTUVOVCkKLSAgICAgIHsKLSAgICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKLQlTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKLQkJCSByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKLSAgICAgIGNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoKLQl7Ci0JICB1bnNpZ25lZF9NIHZhbDsKLQkgIGlmIChzaW1fY29yZV94b3JfcmVhZF9idWZmZXIgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBtYXAsICZ2YWwsIGFkZHIsIE4pICE9IE4pCi0JICAgIFNJTV9DT1JFX1NJR05BTCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwgbWFwLCBOLCBhZGRyLAotCQkJICAgICByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKLQkgIHZhbCA9IFQySF9NKHZhbCk7Ci0JICBQUk9GSUxFX0NPVU5UX0NPUkUgKGNwdSwgYWRkciwgTiwgbWFwKTsKLQkgIGlmIChUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKSkKLQkgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7Ci0JICByZXR1cm4gdmFsOwotCX0KLSAgICAgIGNhc2UgRk9SQ0VEX0FMSUdOTUVOVDoKLQlyZXR1cm4gc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04gKGNwdSwgY2lhLCBtYXAsIGFkZHIgJiB+YWxpZ25tZW50KTsKLSAgICAgIGNhc2UgTUlYRURfQUxJR05NRU5UOgotCXNpbV9lbmdpbmVfYWJvcnQgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsCi0JCQkgICJpbnRlcm5hbCBlcnJvciAtICVzIC0gbWl4ZWQgYWxpZ25tZW50IiwKLQkJCSAgWFNUUklORyAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTikpOwotICAgICAgZGVmYXVsdDoKLQlzaW1fZW5naW5lX2Fib3J0IChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLAotCQkJICAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGJhZCBzd2l0Y2giLAotCQkJICBYU1RSSU5HIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKSk7Ci0JLyogdG8ga2VlcCBzb21lIGNvbXBpbGVycyBoYXBweSwgd2UgcmV0dXJuIGEgZHVtbXkgKi8KLQlyZXR1cm4gc2ltX2NvcmVfZHVtbXlfTTsKLSAgICAgIH0KLX0KLSNlbmRpZgotCi0vKiBUQUdTOiBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMyBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfNSAqLwotLyogVEFHUzogc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzYgc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzcgKi8KLQotI2lmIChNICE9IE4pCi1JTkxJTkVfU0lNX0NPUkUodW5zaWduZWRfTSkKLXNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKLQkJCSAgc2ltX2NpYSBjaWEsCi0JCQkgIHVuc2lnbmVkIG1hcCwKLQkJCSAgYWRkcmVzc193b3JkIGFkZHIpCi17Ci0gIHVuc2lnbmVkX00gdmFsID0gMDsKLSAgaWYgKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlciAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIG1hcCwgJnZhbCwgYWRkciwgTikgIT0gTikKLSAgICBTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKLQkJICAgICByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSICE9IENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIpCi0gICAgdmFsID0gU1dBUF9NICh2YWwpOwotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQotICAgIHZhbCA+Pj0gKE0gLSBOKSAqIDg7Ci0gIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3B1LCBhZGRyLCBOLCBtYXApOwotICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCi0gICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7Ci0gIHJldHVybiB2YWw7Ci19Ci0jZW5kaWYKLQotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfMiAqLwotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF80IHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfOCAqLwotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xNiAqLwotCi0jaWYgKE0gPT0gTikKLUlOTElORV9TSU1fQ09SRSh2b2lkKQotc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKLQkJCSBzaW1fY2lhIGNpYSwKLQkJCSB1bnNpZ25lZCBtYXAsCi0JCQkgYWRkcmVzc193b3JkIHhhZGRyLAotCQkJIHVuc2lnbmVkX00gdmFsKQotewotICBzaW1fY3B1X2NvcmUgKmNwdV9jb3JlID0gQ1BVX0NPUkUgKGNwdSk7Ci0gIHNpbV9jb3JlX2NvbW1vbiAqY29yZSA9ICZjcHVfY29yZS0+Y29tbW9uOwotICBzaW1fY29yZV9tYXBwaW5nICptYXBwaW5nOwotICBhZGRyZXNzX3dvcmQgYWRkcjsKLSNpZiBXSVRIX1hPUl9FTkRJQU4gIT0gMAotICBpZiAoV0lUSF9YT1JfRU5ESUFOKQotICAgIGFkZHIgPSB4YWRkciBeIGNwdV9jb3JlLT54b3JbKE4gLSAxKSAlIFdJVEhfWE9SX0VORElBTl07Ci0gIGVsc2UKLSNlbmRpZgotICAgIGFkZHIgPSB4YWRkcjsKLSAgbWFwcGluZyA9IHNpbV9jb3JlX2ZpbmRfbWFwcGluZyAoY29yZSwgbWFwLCBhZGRyLCBOLCB3cml0ZV90cmFuc2ZlciwgMSAvKmFib3J0Ki8sIGNwdSwgY2lhKTsKLSAgZG8KLSAgICB7Ci0jaWYgKFdJVEhfREVWSUNFUykKLSAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZF9NIGRhdGEgPSBIMlRfTSAodmFsKTsKLQkgIGlmIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyIChtYXBwaW5nLT5kZXZpY2UsICZkYXRhLCBtYXBwaW5nLT5zcGFjZSwgYWRkciwgTiwgQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSkgIT0gTikKLQkgICAgZGV2aWNlX2Vycm9yIChtYXBwaW5nLT5kZXZpY2UsICJpbnRlcm5hbCBlcnJvciAtICVzIC0gaW9fd3JpdGVfYnVmZmVyIHNob3VsZCBub3QgZmFpbCIsCi0JCQkgIFhTVFJJTkcgKHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTikpOwotCSAgYnJlYWs7Ci0JfQotI2VuZGlmCi0jaWYgKFdJVEhfSFcpCi0gICAgICBpZiAoV0lUSF9DQUxMQkFDS19NRU1PUlkgJiYgbWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWRfTSBkYXRhID0gSDJUX00gKHZhbCk7Ci0JICBzaW1fY3B1X2h3X2lvX3dyaXRlX2J1ZmZlciAoY3B1LCBjaWEsIG1hcHBpbmctPmRldmljZSwgJmRhdGEsIG1hcHBpbmctPnNwYWNlLCBhZGRyLCBOKTsKLQkgIGJyZWFrOwotCX0KLSNlbmRpZgotICAgICAgKih1bnNpZ25lZF9NKikgc2ltX2NvcmVfdHJhbnNsYXRlIChtYXBwaW5nLCBhZGRyKSA9IEgyVF9NICh2YWwpOwotICAgIH0KLSAgd2hpbGUgKDApOwotICBQUk9GSUxFX0NPVU5UX0NPUkUgKGNwdSwgYWRkciwgTiwgbWFwKTsKLSAgaWYgKFRSQUNFX1AgKGNwdSwgVFJBQ0VfQ09SRV9JRFgpKQotICAgIHNpbV9jb3JlX3RyYWNlX00gKGNwdSwgY2lhLCBfX0xJTkVfXywgd3JpdGVfdHJhbnNmZXIsIG1hcCwgYWRkciwgdmFsLCBOKTsKLX0KLSNlbmRpZgotCi0vKiBUQUdTOiBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMSBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMiAqLwotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzQgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzggKi8KLS8qIFRBR1M6IHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF8xNiAqLwotCi0jaWYgKE0gPT0gTiAmJiBOID4gMSkKLUlOTElORV9TSU1fQ09SRSh2b2lkKQotc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkX04oc2ltX2NwdSAqY3B1LAotCQkJICAgc2ltX2NpYSBjaWEsCi0JCQkgICB1bnNpZ25lZCBtYXAsCi0JCQkgICBhZGRyZXNzX3dvcmQgYWRkciwKLQkJCSAgIHVuc2lnbmVkX00gdmFsKQotewotICBpbnQgYWxpZ25tZW50ID0gTiAtIDE7Ci0gIC8qIGlmIGhhcmR3aXJlZCB0byBmb3JjZWQgYWxpZ25tZW50IGp1c3QgZG8gaXQgKi8KLSAgaWYgKFdJVEhfQUxJR05NRU5UID09IEZPUkNFRF9BTElHTk1FTlQpCi0gICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OIChjcHUsIGNpYSwgbWFwLCBhZGRyICYgfmFsaWdubWVudCwgdmFsKTsKLSAgZWxzZSBpZiAoKGFkZHIgJiBhbGlnbm1lbnQpID09IDApCi0gICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OIChjcHUsIGNpYSwgbWFwLCBhZGRyLCB2YWwpOwotICBlbHNlCi0gICAgc3dpdGNoIChDVVJSRU5UX0FMSUdOTUVOVCkKLSAgICAgIHsKLSAgICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKLQlTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKLQkJCSB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5PTlNUUklDVF9BTElHTk1FTlQ6Ci0JewotCSAgdW5zaWduZWRfTSBkYXRhID0gSDJUX00gKHZhbCk7Ci0JICBpZiAoc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlciAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIG1hcCwgJmRhdGEsIGFkZHIsIE4pICE9IE4pCi0JICAgIFNJTV9DT1JFX1NJR05BTCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwgbWFwLCBOLCBhZGRyLAotCQkJICAgICB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0JICBQUk9GSUxFX0NPVU5UX0NPUkUgKGNwdSwgYWRkciwgTiwgbWFwKTsKLQkgIGlmIChUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKSkKLQkgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCB3cml0ZV90cmFuc2ZlciwgbWFwLCBhZGRyLCB2YWwsIE4pOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY2FzZSBGT1JDRURfQUxJR05NRU5UOgotCXNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTiAoY3B1LCBjaWEsIG1hcCwgYWRkciAmIH5hbGlnbm1lbnQsIHZhbCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE1JWEVEX0FMSUdOTUVOVDoKLQlzaW1fZW5naW5lX2Fib3J0IChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLAotCQkJICAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIG1peGVkIGFsaWdubWVudCIsCi0JCQkgIFhTVFJJTkcgKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKSk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXNpbV9lbmdpbmVfYWJvcnQgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsCi0JCQkgICJpbnRlcm5hbCBlcnJvciAtICVzIC0gYmFkIHN3aXRjaCIsCi0JCQkgIFhTVFJJTkcgKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci19Ci0jZW5kaWYKLQotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF8zIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNSAqLwotLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF82IHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNyAqLwotCi0jaWYgKE0gIT0gTikKLUlOTElORV9TSU1fQ09SRSh2b2lkKQotc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKLQkJCSAgIHNpbV9jaWEgY2lhLAotCQkJICAgdW5zaWduZWQgbWFwLAotCQkJICAgYWRkcmVzc193b3JkIGFkZHIsCi0JCQkgICB1bnNpZ25lZF9NIHZhbCkKLXsKLSAgdW5zaWduZWRfTSBkYXRhID0gdmFsOwotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQotICAgIGRhdGEgPDw9IChNIC0gTikgKiA4OwotICBpZiAoQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIgIT0gQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUikKLSAgICBkYXRhID0gU1dBUF9NIChkYXRhKTsKLSAgaWYgKHNpbV9jb3JlX3hvcl93cml0ZV9idWZmZXIgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBtYXAsICZkYXRhLCBhZGRyLCBOKSAhPSBOKQotICAgIFNJTV9DT1JFX1NJR05BTCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwgbWFwLCBOLCBhZGRyLAotCQkgICAgIHdyaXRlX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKLSAgUFJPRklMRV9DT1VOVF9DT1JFIChjcHUsIGFkZHIsIE4sIG1hcCk7Ci0gIGlmIChUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKSkKLSAgICBzaW1fY29yZV90cmFjZV9NIChjcHUsIGNpYSwgX19MSU5FX18sIHdyaXRlX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7Ci19Ci0jZW5kaWYKLQotCi0vKiBOT1RFOiBzZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSBvZiB0aGVzZSBtYWNyb3MgKi8KLSN1bmRlZiB1bnNpZ25lZF9NCi0jdW5kZWYgVDJIX00KLSN1bmRlZiBIMlRfTQotI3VuZGVmIFNXQVBfTQotI3VuZGVmIHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OCi0jdW5kZWYgc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTgotI3VuZGVmIHNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF9OCi0jdW5kZWYgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OCi0jdW5kZWYgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkX04KLSN1bmRlZiBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkX04KLSN1bmRlZiBzaW1fY29yZV90cmFjZV9NCi0jdW5kZWYgc2ltX2NvcmVfZHVtbXlfTQotI3VuZGVmIE0KLSN1bmRlZiBOCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1uLWVuZGlhbi5oIGIvc2ltL2NvbW1vbi9zaW0tbi1lbmRpYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZTA1YS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1uLWVuZGlhbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgTgotI2Vycm9yICJOIG11c3QgYmUgI2RlZmluZWQiCi0jZW5kaWYKLQotI2luY2x1ZGUgInN5bWNhdC5oIgotCi0vKiBOT1RFOiBTZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiAqLwotI2RlZmluZSB1bnNpZ25lZF9OIFhDT05DQVQyKHVuc2lnbmVkXyxOKQotI2RlZmluZSBlbmRpYW5fdDJoX04gWENPTkNBVDIoZW5kaWFuX3QyaF8sTikKLSNkZWZpbmUgZW5kaWFuX2gydF9OIFhDT05DQVQyKGVuZGlhbl9oMnRfLE4pCi0jZGVmaW5lIF9TV0FQX04gWENPTkNBVDIoX1NXQVBfLE4pCi0jZGVmaW5lIHN3YXBfTiBYQ09OQ0FUMihzd2FwXyxOKQotI2RlZmluZSBlbmRpYW5faDJiZV9OIFhDT05DQVQyKGVuZGlhbl9oMmJlXyxOKQotI2RlZmluZSBlbmRpYW5fYmUyaF9OIFhDT05DQVQyKGVuZGlhbl9iZTJoXyxOKQotI2RlZmluZSBlbmRpYW5faDJsZV9OIFhDT05DQVQyKGVuZGlhbl9oMmxlXyxOKQotI2RlZmluZSBlbmRpYW5fbGUyaF9OIFhDT05DQVQyKGVuZGlhbl9sZTJoXyxOKQotI2RlZmluZSBvZmZzZXRfTiBYQ09OQ0FUMihvZmZzZXRfLE4pCi0KLS8qIFRBR1M6IGVuZGlhbl90MmhfMSBlbmRpYW5fdDJoXzIgZW5kaWFuX3QyaF80IGVuZGlhbl90MmhfOCBlbmRpYW5fdDJoXzE2ICovCi0KLUlOTElORV9TSU1fRU5ESUFOXAotKHVuc2lnbmVkX04pCi1lbmRpYW5fdDJoX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IENVUlJFTlRfSE9TVF9CWVRFX09SREVSKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IGVuZGlhbl9oMnRfMSBlbmRpYW5faDJ0XzIgZW5kaWFuX2gydF80IGVuZGlhbl9oMnRfOCBlbmRpYW5faDJ0XzE2ICovCi0KLUlOTElORV9TSU1fRU5ESUFOXAotKHVuc2lnbmVkX04pCi1lbmRpYW5faDJ0X04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IENVUlJFTlRfSE9TVF9CWVRFX09SREVSKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IHN3YXBfMSBzd2FwXzIgc3dhcF80IHN3YXBfOCBzd2FwXzE2ICovCi0KLUlOTElORV9TSU1fRU5ESUFOXAotKHVuc2lnbmVkX04pCi1zd2FwX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci19Ci0KLS8qIFRBR1M6IGVuZGlhbl9oMmJlXzEgZW5kaWFuX2gyYmVfMiBlbmRpYW5faDJiZV80IGVuZGlhbl9oMmJlXzggZW5kaWFuX2gyYmVfMTYgKi8KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfTikKLWVuZGlhbl9oMmJlX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IGVuZGlhbl9iZTJoXzEgZW5kaWFuX2JlMmhfMiBlbmRpYW5fYmUyaF80IGVuZGlhbl9iZTJoXzggZW5kaWFuX2JlMmhfMTYgKi8KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfTikKLWVuZGlhbl9iZTJoX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IGVuZGlhbl9oMmxlXzEgZW5kaWFuX2gybGVfMiBlbmRpYW5faDJsZV80IGVuZGlhbl9oMmxlXzggZW5kaWFuX2gybGVfMTYgKi8KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfTikKLWVuZGlhbl9oMmxlX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IGVuZGlhbl9sZTJoXzEgZW5kaWFuX2xlMmhfMiBlbmRpYW5fbGUyaF80IGVuZGlhbl9sZTJoXzggZW5kaWFuX2xlMmhfMTYgKi8KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfTikKLWVuZGlhbl9sZTJoX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7Ci0gICAgcmV0dXJuIHJhd19pbjsKLSAgfQotICBlbHNlIHsKLSAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOwotICB9Ci19Ci0KLS8qIFRBR1M6IG9mZnNldF8xIG9mZnNldF8yIG9mZnNldF80IG9mZnNldF84IG9mZnNldF8xNiAqLwotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh2b2lkKikKLW9mZnNldF9OICh1bnNpZ25lZF9OICp4LAotCSAgdW5zaWduZWQgc2l6ZW9mX3dvcmQsCi0JICB1bnNpZ25lZCB3b3JkKQotewotICBjaGFyICppbiA9IChjaGFyKil4OwotICBjaGFyICpvdXQ7Ci0gIHVuc2lnbmVkIG9mZnNldCA9IHNpemVvZl93b3JkICogd29yZDsKLSAgQVNTRVJUIChvZmZzZXQgKyBzaXplb2Zfd29yZCA8PSBzaXplb2YodW5zaWduZWRfTikpOwotICBBU1NFUlQgKHdvcmQgPCAoc2l6ZW9mICh1bnNpZ25lZF9OKSAvIHNpemVvZl93b3JkKSk7Ci0gIEFTU0VSVCAoKHNpemVvZiAodW5zaWduZWRfTikgJSBzaXplb2Zfd29yZCkgPT0gMCk7Ci0gIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQotICAgIHsKLSAgICAgIG91dCA9IGluICsgc2l6ZW9mICh1bnNpZ25lZF9OKSAtIG9mZnNldCAtIHNpemVvZl93b3JkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG91dCA9IGluICsgb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIG91dDsKLX0KLQotCi0vKiBOT1RFOiBTZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSAqLwotI3VuZGVmIHVuc2lnbmVkX04KLSN1bmRlZiBlbmRpYW5fdDJoX04KLSN1bmRlZiBlbmRpYW5faDJ0X04KLSN1bmRlZiBfU1dBUF9OCi0jdW5kZWYgc3dhcF9OCi0jdW5kZWYgZW5kaWFuX2gyYmVfTgotI3VuZGVmIGVuZGlhbl9iZTJoX04KLSN1bmRlZiBlbmRpYW5faDJsZV9OCi0jdW5kZWYgZW5kaWFuX2xlMmhfTgotI3VuZGVmIG9mZnNldF9OCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmMgYi9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzAxOWMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tb3B0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY2ICswLDAgQEAKLS8qIFNpbXVsYXRvciBvcHRpb24gaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAic2ltLWlvLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLS8qIEFkZCBhIHNldCBvZiBvcHRpb25zIHRvIHRoZSBzaW11bGF0b3IuCi0gICBUQUJMRSBpcyBhbiBhcnJheSBvZiBPUFRJT05TIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIGBvcHQubmFtZScgZW50cnkuCi0gICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBtb2R1bGVzIGluIHRoZWlyIGBpbnN0YWxsJyBoYW5kbGVyLiAgKi8KLQotU0lNX1JDCi1zaW1fYWRkX29wdGlvbl90YWJsZSAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgY29uc3QgT1BUSU9OICp0YWJsZSkKLXsKLSAgc3RydWN0IG9wdGlvbl9saXN0ICpvbCA9ICgoc3RydWN0IG9wdGlvbl9saXN0ICopCi0JCQkgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3B0aW9uX2xpc3QpKSk7Ci0KLSAgLyogTm90ZTogVGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgaW4gdGhlIHJldmVyc2Ugb3JkZXIgd2UncmUgY2FsbGVkIHNvCi0gICAgIGxhdGVyIGNhbGxzIHdpbGwgb3ZlcnJpZGUgZWFybGllciBvbmVzIChpbiBjYXNlIHRoYXQgZXZlciBoYXBwZW5zKS4KLSAgICAgVGhpcyBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3VyLiAgKi8KLQotICBpZiAoY3B1KQotICAgIHsKLSAgICAgIG9sLT5uZXh0ID0gQ1BVX09QVElPTlMgKGNwdSk7Ci0gICAgICBvbC0+b3B0aW9ucyA9IHRhYmxlOwotICAgICAgQ1BVX09QVElPTlMgKGNwdSkgPSBvbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvbC0+bmV4dCA9IFNUQVRFX09QVElPTlMgKHNkKTsKLSAgICAgIG9sLT5vcHRpb25zID0gdGFibGU7Ci0gICAgICBTVEFURV9PUFRJT05TIChzZCkgPSBvbDsKLSAgICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogU3RhbmRhcmQgb3B0aW9uIHRhYmxlLgotICAgTW9kdWxlcyBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIG9uZXMuCi0gICBUaGUgY2FsbGVyIG9mIHNpbV9wYXJzZV9hcmdzIG1heSBhbHNvIHNwZWNpZnkgYWRkaXRpb25hbCBvcHRpb25zCi0gICBieSBjYWxsaW5nIHNpbV9hZGRfb3B0aW9uX3RhYmxlIGZpcnN0LiAgKi8KLQotc3RhdGljIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIgKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyKTsKLQotLyogRklYTUU6IFdlIHNob3VsZG4ndCBwcmludCBpbiAtLWhlbHAgb3V0cHV0IG9wdGlvbnMgdGhhdCBhcmVuJ3QgdXNhYmxlLgotICAgU29tZSBmaW5lIHR1bmluZyB3aWxsIGJlIG5lY2Vzc2FyeS4gIE9uZSBjYW4gZWl0aGVyIG1vdmUgbGVzcyBnZW5lcmFsCi0gICBvcHRpb25zIHRvIGFub3RoZXIgdGFibGUgb3IgdXNlIGEgSEFWRV9GT08gbWFjcm8gdG8gaWZkZWYgb3V0IHVuYXZhaWxhYmxlCi0gICBvcHRpb25zLiAgKi8KLQotLyogPz8/IE9uZSBtaWdodCB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY29tcGlsZSBvdXQgdGhlIGVudHJpZXMgdGhhdAotICAgYXJlbid0IGVuYWJsZWQuICBUaGVyZSdzIGEgZGlzdGluY3Rpb24sIGhvd2V2ZXIsIGJldHdlZW4gb3B0aW9ucyBhCi0gICBzaW11bGF0b3IgY2FuJ3Qgc3VwcG9ydCBhbmQgb3B0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiBjb25maWd1cmVkIGluLgotICAgQ2VydGFpbmx5IG9wdGlvbnMgYSBzaW11bGF0b3IgY2FuJ3Qgc3VwcG9ydCBzaG91bGRuJ3QgYXBwZWFyIGluIHRoZQotICAgb3V0cHV0IG9mIC0taGVscC4gIFdoZXRoZXIgdGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBvcHRpb25zIHRoYXQgaGF2ZW4ndAotICAgYmVlbiBjb25maWd1cmVkIGluIG9yIG5vdCBpc24ndCBzb21ldGhpbmcgSSBjYW4gZ2V0IHdvcmtlZCB1cCBvdmVyLgotICAgW05vdGUgdGhhdCBjb25kaXRpb25hbGx5IGNvbXBpbGluZyB0aGVtIG91dCBtaWdodCBzaW1wbHkgaW52b2x2ZSBtb3ZpbmcKLSAgIHRoZSBvcHRpb24gdG8gYW5vdGhlciB0YWJsZS5dCi0gICBJZiB5b3UgZGVjaWRlIHRvIGNvbmRpdGlvbmFsbHkgY29tcGlsZSB0aGVtIG91dCBhcyB3ZWxsLCBkZWxldGUgdGhpcwotICAgY29tbWVudCBhbmQgYWRkIGEgY29tbWVudCBzYXlpbmcgdGhhdCB0aGF0IGlzIHRoZSBydWxlLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgT1BUSU9OX0RFQlVHX0lOU04gPSBPUFRJT05fU1RBUlQsCi0gIE9QVElPTl9ERUJVR19GSUxFLAotICBPUFRJT05fRE9fQ09NTUFORCwKLSAgT1BUSU9OX0FSQ0hJVEVDVFVSRSwKLSAgT1BUSU9OX1RBUkdFVCwKLSAgT1BUSU9OX0FSQ0hJVEVDVFVSRV9JTkZPLAotICBPUFRJT05fRU5WSVJPTk1FTlQsCi0gIE9QVElPTl9BTElHTk1FTlQsCi0gIE9QVElPTl9WRVJCT1NFLAotI2lmIGRlZmluZWQgKFNJTV9IQVZFX0JJRU5ESUFOKQotICBPUFRJT05fRU5ESUFOLAotI2VuZGlmCi0gIE9QVElPTl9ERUJVRywKLSNpZmRlZiBTSU1fSEFWRV9GTEFUTUVNCi0gIE9QVElPTl9NRU1fU0laRSwKLSNlbmRpZgotICBPUFRJT05fSEVMUCwKLSNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IFNob3VsZCBiZSBtb3ZhYmxlIHRvIGg4MzAwIGRpci4gICovCi0gIE9QVElPTl9IODMwMCwKLSNlbmRpZgotICBPUFRJT05fTE9BRF9MTUEsCi0gIE9QVElPTl9MT0FEX1ZNQSwKLX0gU1RBTkRBUkRfT1BUSU9OUzsKLQotc3RhdGljIGNvbnN0IE9QVElPTiBzdGFuZGFyZF9vcHRpb25zW10gPQotewotICB7IHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sCi0gICAgICAndicsIE5VTEwsICJWZXJib3NlIG91dHB1dCIsCi0gICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAotCi0jaWYgZGVmaW5lZCAoU0lNX0hBVkVfQklFTkRJQU4pIC8qID8/PyAmJiBXSVRIX1RBUkdFVF9CWVRFX09SREVSID09IDAgKi8KLSAgeyB7ImVuZGlhbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5ESUFOfSwKLSAgICAgICdFJywgImJpZ3xsaXR0bGUiLCAiU2V0IGVuZGlhbm5lc3MiLAotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKLSNlbmRpZgotCi0jaWZkZWYgU0lNX0hBVkVfRU5WSVJPTk1FTlQKLSAgLyogVGhpcyBvcHRpb24gaXNuJ3Qgc3VwcG9ydGVkIHVubGVzcyBhbGwgY2hvaWNlcyBhcmUgc3VwcG9ydGVkIGluIGtlZXBpbmcKLSAgICAgd2l0aCB0aGUgZ29hbCBvZiBub3QgcHJpbnRpbmcgaW4gLS1oZWxwIG91dHB1dCB0aGluZ3MgdGhlIHNpbXVsYXRvciBjYW4ndAotICAgICBkbyBbYXMgb3Bwb3NlZCB0byB0aGluZ3MgdGhhdCBqdXN0IGhhdmVuJ3QgYmVlbiBjb25maWd1cmVkIGluXS4gICovCi0gIHsgeyJlbnZpcm9ubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5WSVJPTk1FTlR9LAotICAgICAgJ1wwJywgInVzZXJ8dmlydHVhbHxvcGVyYXRpbmciLCAiU2V0IHJ1bm5pbmcgZW52aXJvbm1lbnQiLAotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKLSNlbmRpZgotCi0gIHsgeyJhbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FMSUdOTUVOVH0sCi0gICAgICAnXDAnLCAic3RyaWN0fG5vbnN0cmljdHxmb3JjZWQiLCAiU2V0IG1lbW9yeSBhY2Nlc3MgYWxpZ25tZW50IiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7ImRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUJVR30sCi0gICAgICAnRCcsIE5VTEwsICJQcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMiLAotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7ImRlYnVnLWluc24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFQlVHX0lOU059LAotICAgICAgJ1wwJywgTlVMTCwgIlByaW50IGluc3RydWN0aW9uIGRlYnVnZ2luZyBtZXNzYWdlcyIsCi0gICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAotICB7IHsiZGVidWctZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVCVUdfRklMRX0sCi0gICAgICAnXDAnLCAiRklMRSBOQU1FIiwgIlNwZWNpZnkgZGVidWdnaW5nIG91dHB1dCBmaWxlIiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0KLSNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IFNob3VsZCBiZSBtb3ZhYmxlIHRvIGg4MzAwIGRpci4gICovCi0gIHsgeyJoODMwMGgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0g4MzAwfSwKLSAgICAgICdoJywgTlVMTCwgIkluZGljYXRlIHRoZSBDUFUgaXMgaDgvMzAwaCBvciBoOC8zMDBzIiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0jZW5kaWYKLQotI2lmZGVmIFNJTV9IQVZFX0ZMQVRNRU0KLSAgeyB7Im1lbS1zaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1fU0laRX0sCi0gICAgICAnbScsICJNRU1PUlkgU0laRSIsICJTcGVjaWZ5IG1lbW9yeSBzaXplIiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0jZW5kaWYKLQotICB7IHsiZG8tY29tbWFuZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRE9fQ09NTUFORH0sCi0gICAgICAnXDAnLCAiQ09NTUFORCIsICIiLyp1bmRvY3VtZW50ZWQqLywKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFTFB9LAotICAgICAgJ0gnLCBOVUxMLCAiUHJpbnQgaGVscCBpbmZvcm1hdGlvbiIsCi0gICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAotCi0gIHsgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FSQ0hJVEVDVFVSRX0sCi0gICAgICAnXDAnLCAiTUFDSElORSIsICJTcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJhcmNoaXRlY3R1cmUtaW5mbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVJDSElURUNUVVJFX0lORk99LAotICAgICAgJ1wwJywgTlVMTCwgIkxpc3Qgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMiLAotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7ImluZm8tYXJjaGl0ZWN0dXJlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BUkNISVRFQ1RVUkVfSU5GT30sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLAotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQVJHRVR9LAotICAgICAgJ1wwJywgIkJGRE5BTUUiLCAiU3BlY2lmeSB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIiwKLSAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCi0KLSNpZmRlZiBTSU1fSEFORExFU19MTUEKLSAgeyB7ImxvYWQtbG1hIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FEX0xNQX0sCi0gICAgICAnXDAnLCBOVUxMLAotI2lmIFNJTV9IQU5ETEVTX0xNQQotICAgICJVc2UgVk1BIG9yIExNQSBhZGRyZXNzZXMgd2hlbiBsb2FkaW5nIGltYWdlIChkZWZhdWx0IExNQSkiLAotI2Vsc2UKLSAgICAiVXNlIFZNQSBvciBMTUEgYWRkcmVzc2VzIHdoZW4gbG9hZGluZyBpbWFnZSAoZGVmYXVsdCBWTUEpIiwKLSNlbmRpZgotICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIsICJsb2FkLXtsbWEsdm1hfSIgfSwKLSAgeyB7ImxvYWQtdm1hIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FEX1ZNQX0sCi0gICAgICAnXDAnLCBOVUxMLCAiIiwgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIsICAiIiB9LAotI2VuZGlmCi0KLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBTSU1fUkMKLXN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBpbnQgb3B0LAotCQkJIGNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCi17Ci0gIGludCBpLG47Ci0KLSAgc3dpdGNoICgoU1RBTkRBUkRfT1BUSU9OUykgb3B0KQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9WRVJCT1NFOgotICAgICAgU1RBVEVfVkVSQk9TRV9QIChzZCkgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBTSU1fSEFWRV9CSUVORElBTgotICAgIGNhc2UgT1BUSU9OX0VORElBTjoKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImJpZyIpID09IDApCi0JewotCSAgaWYgKFdJVEhfVEFSR0VUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKLQkgICAgewotCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBjb21waWxlZCBmb3IgbGl0dGxlIGVuZGlhbiBvbmx5LlxuIik7Ci0JICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICB9Ci0JICAvKiBGSVhNRTp3aXA6IE5lZWQgdG8gc2V0IHNvbWV0aGluZyBpbiBTVEFURV9DT05GSUcuICAqLwotCSAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsaXR0bGUiKSA9PSAwKQotCXsKLQkgIGlmIChXSVRIX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCi0JICAgIHsKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJTaW11bGF0b3IgY29tcGlsZWQgZm9yIGJpZyBlbmRpYW4gb25seS5cbiIpOwotCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgICAgfQotCSAgLyogRklYTUU6d2lwOiBOZWVkIHRvIHNldCBzb21ldGhpbmcgaW4gU1RBVEVfQ09ORklHLiAgKi8KLQkgIGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJJbnZhbGlkIGVuZGlhbiBzcGVjaWZpY2F0aW9uIGAlcydcbiIsIGFyZyk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgT1BUSU9OX0VOVklST05NRU5UOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAidXNlciIpID09IDApCi0JU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9IFVTRVJfRU5WSVJPTk1FTlQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInZpcnR1YWwiKSA9PSAwKQotCVNUQVRFX0VOVklST05NRU5UIChzZCkgPSBWSVJUVUFMX0VOVklST05NRU5UOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJvcGVyYXRpbmciKSA9PSAwKQotCVNUQVRFX0VOVklST05NRU5UIChzZCkgPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ7Ci0gICAgICBlbHNlCi0JewotCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiSW52YWxpZCBlbnZpcm9ubWVudCBzcGVjaWZpY2F0aW9uIGAlcydcbiIsIGFyZyk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgICAgaWYgKFdJVEhfRU5WSVJPTk1FTlQgIT0gQUxMX0VOVklST05NRU5UCi0JICAmJiBXSVRIX0VOVklST05NRU5UICE9IFNUQVRFX0VOVklST05NRU5UIChzZCkpCi0JewotCSAgY2hhciAqdHlwZTsKLQkgIHN3aXRjaCAoV0lUSF9FTlZJUk9OTUVOVCkKLQkgICAgewotCSAgICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6IHR5cGUgPSAidXNlciI7IGJyZWFrOwotCSAgICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6IHR5cGUgPSAidmlydHVhbCI7IGJyZWFrOwotCSAgICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDogdHlwZSA9ICJvcGVyYXRpbmciOyBicmVhazsKLQkgICAgfQotCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiU2ltdWxhdG9yIGNvbXBpbGVkIGZvciB0aGUgJXMgZW52aXJvbm1lbnQgb25seS5cbiIsCi0JCQkgIHR5cGUpOwotCSAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQUxJR05NRU5UOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAic3RyaWN0IikgPT0gMCkKLQl7Ci0JICBpZiAoV0lUSF9BTElHTk1FTlQgPT0gMCB8fCBXSVRIX0FMSUdOTUVOVCA9PSBTVFJJQ1RfQUxJR05NRU5UKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9hbGlnbm1lbnQgPSBTVFJJQ1RfQUxJR05NRU5UOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJub25zdHJpY3QiKSA9PSAwKQotCXsKLQkgIGlmIChXSVRIX0FMSUdOTUVOVCA9PSAwIHx8IFdJVEhfQUxJR05NRU5UID09IE5PTlNUUklDVF9BTElHTk1FTlQpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2FsaWdubWVudCA9IE5PTlNUUklDVF9BTElHTk1FTlQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImZvcmNlZCIpID09IDApCi0JewotCSAgaWYgKFdJVEhfQUxJR05NRU5UID09IDAgfHwgV0lUSF9BTElHTk1FTlQgPT0gRk9SQ0VEX0FMSUdOTUVOVCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfYWxpZ25tZW50ID0gRk9SQ0VEX0FMSUdOTUVOVDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJJbnZhbGlkIGFsaWdubWVudCBzcGVjaWZpY2F0aW9uIGAlcydcbiIsIGFyZyk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgICAgc3dpdGNoIChXSVRIX0FMSUdOTUVOVCkKLQl7Ci0JY2FzZSBTVFJJQ1RfQUxJR05NRU5UOgotCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiU2ltdWxhdG9yIGNvbXBpbGVkIGZvciBzdHJpY3QgYWxpZ25tZW50IG9ubHkuXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBjb21waWxlZCBmb3Igbm9uc3RyaWN0IGFsaWdubWVudCBvbmx5LlxuIik7Ci0JICBicmVhazsKLQljYXNlIEZPUkNFRF9BTElHTk1FTlQ6Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJTaW11bGF0b3IgY29tcGlsZWQgZm9yIGZvcmNlZCBhbGlnbm1lbnQgb25seS5cbiIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCi0gICAgY2FzZSBPUFRJT05fREVCVUc6Ci0gICAgICBpZiAoISBXSVRIX0RFQlVHKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkRlYnVnZ2luZyBub3QgY29tcGlsZWQgaW4sIGAtRCcgaWdub3JlZFxuIik7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChuID0gMDsgbiA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK24pCi0JICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfREVCVUdfVkFMVUVTOyArK2kpCi0JICAgICAgQ1BVX0RFQlVHX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBuKSlbaV0gPSAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fREVCVUdfSU5TTiA6Ci0gICAgICBpZiAoISBXSVRIX0RFQlVHKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkRlYnVnZ2luZyBub3QgY29tcGlsZWQgaW4sIGAtLWRlYnVnLWluc24nIGlnbm9yZWRcbiIpOwotICAgICAgZWxzZQotCXsKLQkgIGZvciAobiA9IDA7IG4gPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytuKQotCSAgICBDUFVfREVCVUdfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIG4pKVtERUJVR19JTlNOX0lEWF0gPSAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fREVCVUdfRklMRSA6Ci0gICAgICBpZiAoISBXSVRIX0RFQlVHKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkRlYnVnZ2luZyBub3QgY29tcGlsZWQgaW4sIGAtLWRlYnVnLWZpbGUnIGlnbm9yZWRcbiIpOwotICAgICAgZWxzZQotCXsKLQkgIEZJTEUgKmYgPSBmb3BlbiAoYXJnLCAidyIpOwotCi0JICBpZiAoZiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5hYmxlIHRvIG9wZW4gZGVidWcgb3V0cHV0IGZpbGUgYCVzJ1xuIiwgYXJnKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGZvciAobiA9IDA7IG4gPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytuKQotCSAgICBDUFVfREVCVUdfRklMRSAoU1RBVEVfQ1BVIChzZCwgbikpID0gZjsKLQl9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIFNJTV9IODMwMCAvKiBGSVhNRTogQ2FuIGJlIG1vdmVkIHRvIGg4MzAwIGRpci4gICovCi0gICAgY2FzZSBPUFRJT05fSDgzMDA6Ci0gICAgICBzZXRfaDgzMDBoICgxKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSU1fSEFWRV9GTEFUTUVNCi0gICAgY2FzZSBPUFRJT05fTUVNX1NJWkU6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyB1bCA9IHN0cnRvbCAoYXJnLCBOVUxMLCAwKTsKLQkvKiAxNjM4NDogc29tZSBtaW5pbWFsIGFtb3VudCAqLwotCWlmICghIGlzZGlnaXQgKGFyZ1swXSkgfHwgdWwgPCAxNjM4NCkKLQkgIHsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiSW52YWxpZCBtZW1vcnkgc2l6ZSBgJXMnIiwgYXJnKTsKLQkgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgfQotCVNUQVRFX01FTV9TSVpFIChzZCkgPSB1bDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIE9QVElPTl9ET19DT01NQU5EOgotICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9BUkNISVRFQ1RVUkU6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFwID0gYmZkX3NjYW5fYXJjaCAoYXJnKTsKLQlpZiAoYXAgPT0gTlVMTCkKLQkgIHsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiQXJjaGl0ZWN0dXJlIGAlcycgdW5rbm93blxuIiwgYXJnKTsKLQkgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgfQotCVNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpID0gYXA7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIE9QVElPTl9BUkNISVRFQ1RVUkVfSU5GTzoKLSAgICAgIHsKLQljb25zdCBjaGFyICoqbGlzdCA9IGJmZF9hcmNoX2xpc3QoKTsKLQljb25zdCBjaGFyICoqbHA7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkgIGFib3J0ICgpOwotCXNpbV9pb19wcmludGYgKHNkLCAiUG9zc2libGUgYXJjaGl0ZWN0dXJlczoiKTsKLQlmb3IgKGxwID0gbGlzdDsgKmxwICE9IE5VTEw7IGxwKyspCi0JICBzaW1faW9fcHJpbnRmIChzZCwgIiAlcyIsICpscCk7Ci0Jc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotCWZyZWUgKGxpc3QpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBPUFRJT05fVEFSR0VUOgotICAgICAgewotCVNUQVRFX1RBUkdFVCAoc2QpID0geHN0cmR1cCAoYXJnKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgT1BUSU9OX0xPQURfTE1BOgotICAgICAgewotCVNUQVRFX0xPQURfQVRfTE1BX1AgKHNkKSA9IDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIE9QVElPTl9MT0FEX1ZNQToKLSAgICAgIHsKLQlTVEFURV9MT0FEX0FUX0xNQV9QIChzZCkgPSAwOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBPUFRJT05fSEVMUDoKLSAgICAgIHNpbV9wcmludF9oZWxwIChzZCwgaXNfY29tbWFuZCk7Ci0gICAgICBpZiAoU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSkKLQlleGl0ICgwKTsKLSAgICAgIC8qIEZJWE1FOiAndHdvdWxkIGJlIG5pY2UgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgaWYgZ2RiLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0vKiBBZGQgdGhlIHN0YW5kYXJkIG9wdGlvbiBsaXN0IHRvIHRoZSBzaW11bGF0b3IuICAqLwotCi1TSU1fUkMKLXN0YW5kYXJkX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBpZiAoc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBzdGFuZGFyZF9vcHRpb25zKSAhPSBTSU1fUkNfT0spCi0gICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotI2lmZGVmIFNJTV9IQU5ETEVTX0xNQQotICBTVEFURV9MT0FEX0FUX0xNQV9QIChzZCkgPSBTSU1fSEFORExFU19MTUE7Ci0jZW5kaWYKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIGFyZyBpcyBhIGR1cGxpY2F0ZSBhcmd1bWVudC4KLSAgIElmIEFSRyBpcyBOVUxMLCBpbml0aWFsaXplLiAgKi8KLQotI2RlZmluZSBBUkdfSEFTSF9TSVpFIDk3Ci0jZGVmaW5lIEFSR19IQVNIKGEpICgoMjU2ICogKHVuc2lnbmVkIGNoYXIpIGFbMF0gKyAodW5zaWduZWQgY2hhcikgYVsxXSkgJSBBUkdfSEFTSF9TSVpFKQotCi1zdGF0aWMgaW50Ci1kdXBfYXJnX3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICBpbnQgaGFzaDsKLSAgc3RhdGljIGNoYXIgKiphcmdfdGFibGUgPSBOVUxMOwotCi0gIGlmIChhcmcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYXJnX3RhYmxlID09IE5VTEwpCi0JYXJnX3RhYmxlID0gKGNoYXIgKiopIHhtYWxsb2MgKEFSR19IQVNIX1NJWkUgKiBzaXplb2YgKGNoYXIgKikpOwotICAgICAgbWVtc2V0IChhcmdfdGFibGUsIDAsIEFSR19IQVNIX1NJWkUgKiBzaXplb2YgKGNoYXIgKikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGhhc2ggPSBBUkdfSEFTSCAoYXJnKTsKLSAgd2hpbGUgKGFyZ190YWJsZVtoYXNoXSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgYXJnX3RhYmxlW2hhc2hdKSA9PSAwKQotCXJldHVybiAxOwotICAgICAgLyogV2UgYXNzdW1lIHRoZXJlIHdvbid0IGJlIG1vcmUgdGhhbiBBUkdfSEFTSF9TSVpFIGFyZ3VtZW50cyBzbyB3ZQotCSBkb24ndCBjaGVjayBpZiB0aGUgdGFibGUgaXMgZnVsbC4gICovCi0gICAgICBpZiAoKytoYXNoID09IEFSR19IQVNIX1NJWkUpCi0JaGFzaCA9IDA7Ci0gICAgfQotICBhcmdfdGFibGVbaGFzaF0gPSBhcmc7Ci0gIHJldHVybiAwOwotfQotICAgICAKLS8qIENhbGxlZCBieSBzaW1fb3BlbiB0byBwYXJzZSB0aGUgYXJndW1lbnRzLiAgKi8KLQotU0lNX1JDCi1zaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGMsIGksIGFyZ2MsIG51bV9vcHRzOwotICBjaGFyICpwLCAqc2hvcnRfb3B0aW9uczsKLSAgLyogVGhlIGB2YWwnIG9wdGlvbiBzdHJ1Y3QgZW50cnkgaXMgZHluYW1pY2FsbHkgYXNzaWduZWQgZm9yIG9wdGlvbnMgdGhhdAotICAgICBvbmx5IGNvbWUgaW4gdGhlIGxvbmcgZm9ybS4gIE9SSUdfVkFMIGlzIHVzZWQgdG8gZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZQotICAgICBiYWNrLiAgKi8KLSAgaW50ICpvcmlnX3ZhbDsKLSAgc3RydWN0IG9wdGlvbiAqbHAsICpsb25nX29wdGlvbnM7Ci0gIGNvbnN0IHN0cnVjdCBvcHRpb25fbGlzdCAqb2w7Ci0gIGNvbnN0IE9QVElPTiAqb3B0OwotICBPUFRJT05fSEFORExFUiAqKmhhbmRsZXJzOwotICBzaW1fY3B1ICoqb3B0X2NwdTsKLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgKythcmdjKQotICAgIGNvbnRpbnVlOwotCi0gIC8qIENvdW50IHRoZSBudW1iZXIgb2Ygb3B0aW9ucy4gICovCi0gIG51bV9vcHRzID0gMDsKLSAgZm9yIChvbCA9IFNUQVRFX09QVElPTlMgKHNkKTsgb2wgIT0gTlVMTDsgb2wgPSBvbC0+bmV4dCkKLSAgICBmb3IgKG9wdCA9IG9sLT5vcHRpb25zOyBPUFRJT05fVkFMSURfUCAob3B0KTsgKytvcHQpCi0gICAgICArK251bV9vcHRzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKLSAgICBmb3IgKG9sID0gQ1BVX09QVElPTlMgKFNUQVRFX0NQVSAoc2QsIGkpKTsgb2wgIT0gTlVMTDsgb2wgPSBvbC0+bmV4dCkKLSAgICAgIGZvciAob3B0ID0gb2wtPm9wdGlvbnM7IE9QVElPTl9WQUxJRF9QIChvcHQpOyArK29wdCkKLQkrK251bV9vcHRzOwotCi0gIC8qIEluaXRpYWxpemUgZHVwbGljYXRlIGFyZ3VtZW50IGNoZWNrZXIuICAqLwotICAodm9pZCkgZHVwX2FyZ19wIChOVUxMKTsKLQotICAvKiBCdWlsZCB0aGUgb3B0aW9uIHRhYmxlIGZvciBnZXRvcHQuICAqLwotCi0gIGxvbmdfb3B0aW9ucyA9IE5aQUxMT0MgKHN0cnVjdCBvcHRpb24sIG51bV9vcHRzICsgMSk7Ci0gIGxwID0gbG9uZ19vcHRpb25zOwotICBzaG9ydF9vcHRpb25zID0gTlpBTExPQyAoY2hhciwgbnVtX29wdHMgKiAzICsgMSk7Ci0gIHAgPSBzaG9ydF9vcHRpb25zOwotICBoYW5kbGVycyA9IE5aQUxMT0MgKE9QVElPTl9IQU5ETEVSICosIE9QVElPTl9TVEFSVCArIG51bV9vcHRzKTsKLSAgb3JpZ192YWwgPSBOWkFMTE9DIChpbnQsIE9QVElPTl9TVEFSVCArIG51bV9vcHRzKTsKLSAgb3B0X2NwdSA9IE5aQUxMT0MgKHNpbV9jcHUgKiwgT1BUSU9OX1NUQVJUICsgbnVtX29wdHMpOwotCi0gIC8qIFNldCAnKycgYXMgZmlyc3QgY2hhciBzbyBhcmd1bWVudCBwZXJtdXRhdGlvbiBpc24ndCBkb25lLiAgVGhpcwotICAgICBpcyBkb25lIHRvIHN0b3AgZ2V0b3B0X2xvbmcgcmV0dXJuaW5nIG9wdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIKLSAgICAgdGhlIHRhcmdldCBwcm9ncmFtLiAgU3VjaCBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdW5jaGFuZ2VkIGludG8KLSAgICAgdGhlIHByb2dyYW0gaW1hZ2UuICovCi0gICpwKysgPSAnKyc7Ci0KLSAgZm9yIChpID0gT1BUSU9OX1NUQVJULCBvbCA9IFNUQVRFX09QVElPTlMgKHNkKTsgb2wgIT0gTlVMTDsgb2wgPSBvbC0+bmV4dCkKLSAgICBmb3IgKG9wdCA9IG9sLT5vcHRpb25zOyBPUFRJT05fVkFMSURfUCAob3B0KTsgKytvcHQpCi0gICAgICB7Ci0JaWYgKGR1cF9hcmdfcCAob3B0LT5vcHQubmFtZSkpCi0JICBjb250aW51ZTsKLQlpZiAob3B0LT5zaG9ydG9wdCAhPSAwKQotCSAgewotCSAgICAqcCsrID0gb3B0LT5zaG9ydG9wdDsKLQkgICAgaWYgKG9wdC0+b3B0Lmhhc19hcmcgPT0gcmVxdWlyZWRfYXJndW1lbnQpCi0JICAgICAgKnArKyA9ICc6JzsKLQkgICAgZWxzZSBpZiAob3B0LT5vcHQuaGFzX2FyZyA9PSBvcHRpb25hbF9hcmd1bWVudCkKLQkgICAgICB7ICpwKysgPSAnOic7ICpwKysgPSAnOic7IH0KLQkgICAgaGFuZGxlcnNbKHVuc2lnbmVkIGNoYXIpIG9wdC0+c2hvcnRvcHRdID0gb3B0LT5oYW5kbGVyOwotCSAgICBpZiAob3B0LT5vcHQudmFsICE9IDApCi0JICAgICAgb3JpZ192YWxbKHVuc2lnbmVkIGNoYXIpIG9wdC0+c2hvcnRvcHRdID0gb3B0LT5vcHQudmFsOwotCSAgICBlbHNlCi0JICAgICAgb3JpZ192YWxbKHVuc2lnbmVkIGNoYXIpIG9wdC0+c2hvcnRvcHRdID0gb3B0LT5zaG9ydG9wdDsKLQkgIH0KLQlpZiAob3B0LT5vcHQubmFtZSAhPSBOVUxMKQotCSAgewotCSAgICAqbHAgPSBvcHQtPm9wdDsKLQkgICAgLyogRHluYW1pY2FsbHkgYXNzaWduIGB2YWwnIG51bWJlcnMgZm9yIGxvbmcgb3B0aW9ucy4gKi8KLQkgICAgbHAtPnZhbCA9IGkrKzsKLQkgICAgaGFuZGxlcnNbbHAtPnZhbF0gPSBvcHQtPmhhbmRsZXI7Ci0JICAgIG9yaWdfdmFsW2xwLT52YWxdID0gb3B0LT5vcHQudmFsOwotCSAgICBvcHRfY3B1W2xwLT52YWxdID0gTlVMTDsKLQkgICAgKytscDsKLQkgIH0KLSAgICAgIH0KLQotICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKLSAgICB7Ci0gICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjKTsKLSAgICAgIGZvciAob2wgPSBDUFVfT1BUSU9OUyAoY3B1KTsgb2wgIT0gTlVMTDsgb2wgPSBvbC0+bmV4dCkKLQlmb3IgKG9wdCA9IG9sLT5vcHRpb25zOyBPUFRJT05fVkFMSURfUCAob3B0KTsgKytvcHQpCi0JICB7Ci0jaWYgMCAvKiBFYWNoIG9wdGlvbiBpcyBwcmVwZW5kZWQgd2l0aCAtLTxjcHVuYW1lPi0gc28gdGhpcyBncmVhdGx5IGN1dHMgZG93bgotCSBvbiB0aGUgbmVlZCBmb3IgZHVwX2FyZ19wIGNoZWNraW5nLiAgTWF5YmUgaW4gdGhlIGZ1dHVyZSBpdCdsbCBiZQotCSBuZWVkZWQgc28gdGhpcyBpcyBqdXN0IGNvbW1lbnRlZCBvdXQsIGFuZCBub3QgZGVsZXRlZC4gICovCi0JICAgIGlmIChkdXBfYXJnX3AgKG9wdC0+b3B0Lm5hbWUpKQotCSAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JICAgIC8qIERvbid0IGFsbG93IHNob3J0IHZlcnNpb25zIG9mIGNwdSBzcGVjaWZpYyBvcHRpb25zIGZvciBub3cuICAqLwotCSAgICBpZiAob3B0LT5zaG9ydG9wdCAhPSAwKQotCSAgICAgIHsKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiaW50ZXJuYWwgZXJyb3IsIHNob3J0IGNwdSBzcGVjaWZpYyBvcHRpb24iKTsKLQkJcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICAgIH0KLQkgICAgaWYgKG9wdC0+b3B0Lm5hbWUgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWNoYXIgKm5hbWU7Ci0JCSpscCA9IG9wdC0+b3B0OwotCQkvKiBQcmVwZW5kIC0tPGNwdW5hbWU+LSB0byB0aGUgb3B0aW9uLiAgKi8KLQkJYXNwcmludGYgKCZuYW1lLCAiJXMtJXMiLCBDUFVfTkFNRSAoY3B1KSwgbHAtPm5hbWUpOwotCQlscC0+bmFtZSA9IG5hbWU7Ci0JCS8qIER5bmFtaWNhbGx5IGFzc2lnbiBgdmFsJyBudW1iZXJzIGZvciBsb25nIG9wdGlvbnMuICovCi0JCWxwLT52YWwgPSBpKys7Ci0JCWhhbmRsZXJzW2xwLT52YWxdID0gb3B0LT5oYW5kbGVyOwotCQlvcmlnX3ZhbFtscC0+dmFsXSA9IG9wdC0+b3B0LnZhbDsKLQkJb3B0X2NwdVtscC0+dmFsXSA9IGNwdTsKLQkJKytscDsKLQkgICAgICB9Ci0JICB9Ci0gICAgfQotCSAgICAKLSAgLyogVGVybWluYXRlIHRoZSBzaG9ydCBhbmQgbG9uZyBvcHRpb24gbGlzdHMuICAqLwotICAqcCA9IDA7Ci0gIGxwLT5uYW1lID0gTlVMTDsKLQotICAvKiBFbnN1cmUgZ2V0b3B0IGlzIGluaXRpYWxpemVkLiAgKi8KLSAgb3B0aW5kID0gMDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgbG9uZ2luZCwgb3B0YzsKLQotICAgICAgb3B0YyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLCBsb25nX29wdGlvbnMsICZsb25naW5kKTsKLSAgICAgIGlmIChvcHRjID09IC0xKQotCXsKLQkgIGlmIChTVEFURV9PUEVOX0tJTkQgKHNkKSA9PSBTSU1fT1BFTl9TVEFOREFMT05FKQotCSAgICBTVEFURV9QUk9HX0FSR1YgKHNkKSA9IGR1cGFyZ3YgKGFyZ3YgKyBvcHRpbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKG9wdGMgPT0gJz8nKQotCXJldHVybiBTSU1fUkNfRkFJTDsKLQotICAgICAgaWYgKCgqaGFuZGxlcnNbb3B0Y10pIChzZCwgb3B0X2NwdVtvcHRjXSwgb3JpZ192YWxbb3B0Y10sIG9wdGFyZywgMC8qIWlzX2NvbW1hbmQqLykgPT0gU0lNX1JDX0ZBSUwpCi0JcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0vKiBVdGlsaXR5IG9mIHNpbV9wcmludF9oZWxwIHRvIHByaW50IGEgbGlzdCBvZiBvcHRpb24gdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2hlbHAgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGNvbnN0IHN0cnVjdCBvcHRpb25fbGlzdCAqb2wsIGludCBpc19jb21tYW5kKQotewotICBjb25zdCBPUFRJT04gKm9wdDsKLQotICBmb3IgKCA7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCi0gICAgZm9yIChvcHQgPSBvbC0+b3B0aW9uczsgT1BUSU9OX1ZBTElEX1AgKG9wdCk7ICsrb3B0KQotICAgICAgewotCWNvbnN0IGludCBpbmRlbnQgPSAzMDsKLQlpbnQgY29tbWEsIGxlbjsKLQljb25zdCBPUFRJT04gKm87Ci0KLQlpZiAoZHVwX2FyZ19wIChvcHQtPm9wdC5uYW1lKSkKLQkgIGNvbnRpbnVlOwotCi0JaWYgKG9wdC0+ZG9jID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCWlmIChvcHQtPmRvY19uYW1lICE9IE5VTEwgJiYgb3B0LT5kb2NfbmFtZSBbMF0gPT0gJ1wwJykKLQkgIGNvbnRpbnVlOwotCi0Jc2ltX2lvX3ByaW50ZiAoc2QsICIgICIpOwotCi0JY29tbWEgPSAwOwotCWxlbiA9IDI7Ci0KLQkvKiBsaXN0IGFueSBzaG9ydCBvcHRpb25zIChhbGlhc2VzKSBmb3IgdGhlIGN1cnJlbnQgT1BUICovCi0JaWYgKCFpc19jb21tYW5kKQotCSAgewotCSAgICBvID0gb3B0OwotCSAgICBkbwotCSAgICAgIHsKLQkJaWYgKG8tPnNob3J0b3B0ICE9ICdcMCcpCi0JCSAgewotCQkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIlcy0lYyIsIGNvbW1hID8gIiwgIiA6ICIiLCBvLT5zaG9ydG9wdCk7Ci0JCSAgICBsZW4gKz0gKGNvbW1hID8gMiA6IDApICsgMjsKLQkJICAgIGlmIChvLT5hcmcgIT0gTlVMTCkKLQkJICAgICAgewotCQkJaWYgKG8tPm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQotCQkJICB7Ci0JCQkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJbJXNdIiwgby0+YXJnKTsKLQkJCSAgICBsZW4gKz0gMSArIHN0cmxlbiAoby0+YXJnKSArIDE7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIHNpbV9pb19wcmludGYgKHNkLCAiICVzIiwgby0+YXJnKTsKLQkJCSAgICBsZW4gKz0gMSArIHN0cmxlbiAoby0+YXJnKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBjb21tYSA9IDE7Ci0JCSAgfQotCQkrK287Ci0JICAgICAgfQotCSAgICB3aGlsZSAoT1BUSU9OX1ZBTElEX1AgKG8pICYmIG8tPmRvYyA9PSBOVUxMKTsKLQkgIH0KLQkKLQkvKiBsaXN0IGFueSBsb25nIG9wdGlvbnMgKGFsaWFzZXMpIGZvciB0aGUgY3VycmVudCBPUFQgKi8KLQlvID0gb3B0OwotCWRvCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNvbnN0IGNoYXIgKmNwdV9wcmVmaXggPSBjcHUgPyBDUFVfTkFNRSAoY3B1KSA6IE5VTEw7Ci0JICAgIGlmIChvLT5kb2NfbmFtZSAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBvLT5kb2NfbmFtZTsKLQkgICAgZWxzZQotCSAgICAgIG5hbWUgPSBvLT5vcHQubmFtZTsKLQkgICAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgICB7Ci0JCXNpbV9pb19wcmludGYgKHNkLCAiJXMlcyVzJXMlcyIsCi0JCQkgICAgICAgY29tbWEgPyAiLCAiIDogIiIsCi0JCQkgICAgICAgaXNfY29tbWFuZCA/ICIiIDogIi0tIiwKLQkJCSAgICAgICBjcHUgPyBjcHVfcHJlZml4IDogIiIsCi0JCQkgICAgICAgY3B1ID8gIi0iIDogIiIsCi0JCQkgICAgICAgbmFtZSk7Ci0JCWxlbiArPSAoKGNvbW1hID8gMiA6IDApCi0JCQkrIChpc19jb21tYW5kID8gMCA6IDIpCi0JCQkrIHN0cmxlbiAobmFtZSkpOwotCQlpZiAoby0+YXJnICE9IE5VTEwpCi0JCSAgewotCQkgICAgaWYgKG8tPm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQotCQkgICAgICB7Ci0JCQlzaW1faW9fcHJpbnRmIChzZCwgIls9JXNdIiwgby0+YXJnKTsKLQkJCWxlbiArPSAyICsgc3RybGVuIChvLT5hcmcpICsgMTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlzaW1faW9fcHJpbnRmIChzZCwgIiAlcyIsIG8tPmFyZyk7Ci0JCQlsZW4gKz0gMSArIHN0cmxlbiAoby0+YXJnKTsKLQkJICAgICAgfQotCQkgIH0KLQkJY29tbWEgPSAxOwotCSAgICAgIH0KLQkgICAgKytvOwotCSAgfQotCXdoaWxlIChPUFRJT05fVkFMSURfUCAobykgJiYgby0+ZG9jID09IE5VTEwpOwotCi0JaWYgKGxlbiA+PSBpbmRlbnQpCi0JICB7Ci0JICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4lKnMiLCBpbmRlbnQsICIiKTsKLQkgIH0KLQllbHNlCi0JICBzaW1faW9fcHJpbnRmIChzZCwgIiUqcyIsIGluZGVudCAtIGxlbiwgIiIpOwotCi0JLyogcHJpbnQgdGhlIGRlc2NyaXB0aW9uLCB3b3JkIHdyYXAgbG9uZyBsaW5lcyAqLwotCXsKLQkgIGNvbnN0IGNoYXIgKmNocCA9IG9wdC0+ZG9jOwotCSAgdW5zaWduZWQgZG9jX3dpZHRoID0gODAgLSBpbmRlbnQ7Ci0JICB3aGlsZSAoc3RybGVuIChjaHApID49IGRvY193aWR0aCkgLyogc29tZSBzbGFjayAqLwotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqZW5kID0gY2hwICsgZG9jX3dpZHRoIC0gMTsKLQkgICAgICB3aGlsZSAoZW5kID4gY2hwICYmICFpc3NwYWNlICgqZW5kKSkKLQkJZW5kIC0tOwotCSAgICAgIGlmIChlbmQgPT0gY2hwKQotCQllbmQgPSBjaHAgKyBkb2Nfd2lkdGggLSAxOwotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiJS4qc1xuJSpzIiwgZW5kIC0gY2hwLCBjaHAsIGluZGVudCwgIiIpOwotCSAgICAgIGNocCA9IGVuZDsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKmNocCkgJiYgKmNocCAhPSAnXDAnKQotCQljaHArKzsKLQkgICAgfQotCSAgc2ltX2lvX3ByaW50ZiAoc2QsICIlc1xuIiwgY2hwKTsKLQl9Ci0gICAgICB9Ci19Ci0KLS8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgKi8KLQotdm9pZAotc2ltX3ByaW50X2hlbHAgKHNkLCBpc19jb21tYW5kKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IGlzX2NvbW1hbmQ7Ci17Ci0gIGlmIChTVEFURV9PUEVOX0tJTkQgKHNkKSA9PSBTSU1fT1BFTl9TVEFOREFMT05FKQotICAgIHNpbV9pb19wcmludGYgKHNkLCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBwcm9ncmFtIFtwcm9ncmFtIGFyZ3NdXG4iLAotCQkgICBTVEFURV9NWV9OQU1FIChzZCkpOwotCi0gIC8qIEluaXRpYWxpemUgZHVwbGljYXRlIGFyZ3VtZW50IGNoZWNrZXIuICAqLwotICAodm9pZCkgZHVwX2FyZ19wIChOVUxMKTsKLQotICBpZiAoU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSkKLSAgICBzaW1faW9fcHJpbnRmIChzZCwgIk9wdGlvbnM6XG4iKTsKLSAgZWxzZQotICAgIHNpbV9pb19wcmludGYgKHNkLCAiQ29tbWFuZHM6XG4iKTsKLQotICBwcmludF9oZWxwIChzZCwgTlVMTCwgU1RBVEVfT1BUSU9OUyAoc2QpLCBpc19jb21tYW5kKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotCi0gIC8qIFByaW50IGNwdS1zcGVjaWZpYyBvcHRpb25zLiAgKi8KLSAgewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCi0gICAgICB7Ci0Jc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgaSk7Ci0JaWYgKENQVV9PUFRJT05TIChjcHUpID09IE5VTEwpCi0JICBjb250aW51ZTsKLQlzaW1faW9fcHJpbnRmIChzZCwgIkNQVSAlcyBzcGVjaWZpYyBvcHRpb25zOlxuIiwgQ1BVX05BTUUgKGNwdSkpOwotCXByaW50X2hlbHAgKHNkLCBjcHUsIENQVV9PUFRJT05TIChjcHUpLCBpc19jb21tYW5kKTsKLQlzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0gICAgICB9Ci0gIH0KLQotICBzaW1faW9fcHJpbnRmIChzZCwgIk5vdGU6IERlcGVuZGluZyBvbiB0aGUgc2ltdWxhdG9yIGNvbmZpZ3VyYXRpb24gc29tZSAlc3NcbiIsCi0JCSBTVEFURV9PUEVOX0tJTkQgKHNkKSA9PSBTSU1fT1BFTl9TVEFOREFMT05FID8gIm9wdGlvbiIgOiAiY29tbWFuZCIpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgICAgIG1heSBub3QgYmUgYXBwbGljYWJsZVxuIik7Ci0KLSAgaWYgKFNUQVRFX09QRU5fS0lORCAoc2QpID09IFNJTV9PUEVOX1NUQU5EQUxPTkUpCi0gICAgewotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJwcm9ncmFtIGFyZ3MgICAgQXJndW1lbnRzIHRvIHBhc3MgdG8gc2ltdWxhdGVkIHByb2dyYW0uXG4iKTsKLSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICAgICAgICAgICAgICAgIE5vdGU6IFZlcnkgZmV3IHNpbXVsYXRvcnMgc3VwcG9ydCB0aGlzLlxuIik7Ci0gICAgfQotfQotCi0vKiBVdGlsaXR5IG9mIHNpbV9hcmdzX2NvbW1hbmQgdG8gZmluZCB0aGUgY2xvc2VzdCBtYXRjaCBmb3IgYSBjb21tYW5kLgotICAgQ29tbWFuZHMgdGhhdCBoYXZlICItIiBpbiB0aGVtIGNhbiBiZSBzcGVjaWZpZWQgYXMgc2VwYXJhdGUgd29yZHMuCi0gICBlLmcuIHNpbSBtZW1vcnktcmVnaW9uIDB4ODAwMDAwLDB4NDAwMAotICAgb3IgICBzaW0gbWVtb3J5IHJlZ2lvbiAweDgwMDAwMCwweDQwMDAKLSAgIElmIENQVSBpcyBub24tbnVsbCwgdXNlIGl0cyBvcHRpb24gdGFibGUgbGlzdCwgb3RoZXJ3aXNlIHVzZSB0aGUgbWFpbiBvbmUuCi0gICAqUEFSR0kgaXMgd2hlcmUgdG8gc3RhcnQgbG9va2luZyBpbiBBUkdWLiAgSXQgaXMgdXBkYXRlZCB0byBwb2ludCBwYXN0Ci0gICB0aGUgZm91bmQgb3B0aW9uLiAgKi8KLQotc3RhdGljIGNvbnN0IE9QVElPTiAqCi1maW5kX21hdGNoIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBjaGFyICphcmd2W10sIGludCAqcGFyZ2kpCi17Ci0gIGNvbnN0IHN0cnVjdCBvcHRpb25fbGlzdCAqb2w7Ci0gIGNvbnN0IE9QVElPTiAqb3B0OwotICAvKiBtb3N0IHJlY2VudCBvcHRpb24gbWF0Y2ggKi8KLSAgY29uc3QgT1BUSU9OICptYXRjaGluZ19vcHQgPSBOVUxMOwotICBpbnQgbWF0Y2hpbmdfYXJnaSA9IC0xOwotCi0gIGlmIChjcHUpCi0gICAgb2wgPSBDUFVfT1BUSU9OUyAoY3B1KTsKLSAgZWxzZQotICAgIG9sID0gU1RBVEVfT1BUSU9OUyAoc2QpOwotCi0gIC8qIFNraXAgcGFzc2VkIGVsZW1lbnRzIHNwZWNpZmllZCBieSAqUEFSR0kuICAqLwotICBhcmd2ICs9ICpwYXJnaTsKLQotICBmb3IgKCA7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCi0gICAgZm9yIChvcHQgPSBvbC0+b3B0aW9uczsgT1BUSU9OX1ZBTElEX1AgKG9wdCk7ICsrb3B0KQotICAgICAgewotCWludCBhcmdpID0gMDsKLQljb25zdCBjaGFyICpuYW1lID0gb3B0LT5vcHQubmFtZTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCSAgY29udGludWU7Ci0Jd2hpbGUgKGFyZ3YgW2FyZ2ldICE9IE5VTEwKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgYXJndiBbYXJnaV0sIHN0cmxlbiAoYXJndiBbYXJnaV0pKSA9PSAwKQotCSAgewotCSAgICBuYW1lID0gJm5hbWUgW3N0cmxlbiAoYXJndlthcmdpXSldOwotCSAgICBpZiAobmFtZSBbMF0gPT0gJy0nKQotCSAgICAgIHsKLQkJLyogbGVhZGluZyBtYXRjaCAuLi48YS1iLWM+LWQtZS1mIC0gY29udGludWUgc2VhcmNoICovCi0JCW5hbWUgKys7IC8qIHNraXAgYC0nICovCi0JCWFyZ2kgKys7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAobmFtZSBbMF0gPT0gJ1wwJykKLQkgICAgICB7Ci0JCS8qIGV4YWN0IG1hdGNoIC4uLjxhLWItYy1kLWUtZj4gLSBiZXR0ZXIgdGhhbiBiZWZvcmU/ICovCi0JCWlmIChhcmdpID4gbWF0Y2hpbmdfYXJnaSkKLQkJICB7Ci0JCSAgICBtYXRjaGluZ19hcmdpID0gYXJnaTsKLQkJICAgIG1hdGNoaW5nX29wdCA9IG9wdDsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotCi0gICpwYXJnaSA9IG1hdGNoaW5nX2FyZ2k7Ci0gIHJldHVybiBtYXRjaGluZ19vcHQ7Ci19Ci0KLVNJTV9SQwotc2ltX2FyZ3NfY29tbWFuZCAoU0lNX0RFU0Mgc2QsIGNoYXIgKmNtZCkKLXsKLSAgLyogc29tZXRoaW5nIHRvIGRvPyAqLwotICBpZiAoY21kID09IE5VTEwpCi0gICAgcmV0dXJuIFNJTV9SQ19PSzsgLyogRklYTUUgLSBwZXJoYXBocyBoZWxwIHdvdWxkIGJlIGJldHRlciAqLwotICAKLSAgaWYgKGNtZCBbMF0gPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIHVzZXIgc3BlY2lmaWVkIC08b3B0PiAuLi4gZm9ybT8gKi8KLSAgICAgIGNoYXIgKiphcmd2ID0gYnVpbGRhcmd2IChjbWQpOwotICAgICAgU0lNX1JDIHJjID0gc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KTsKLSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLSAgICAgIHJldHVybiByYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICoqYXJndiA9IGJ1aWxkYXJndiAoY21kKTsKLSAgICAgIGNvbnN0IE9QVElPTiAqbWF0Y2hpbmdfb3B0ID0gTlVMTDsKLSAgICAgIGludCBtYXRjaGluZ19hcmdpOwotICAgICAgc2ltX2NwdSAqY3B1OwotCi0gICAgICBpZiAoYXJndiBbMF0gPT0gTlVMTCkKLQlyZXR1cm4gU0lNX1JDX09LOyAvKiBGSVhNRSAtIHBlcmhhcGhzIGhlbHAgd291bGQgYmUgYmV0dGVyICovCi0KLSAgICAgIC8qIEZpcnN0IGNoZWNrIGZvciBhIGNwdSBzZWxlY3Rvci4gICovCi0gICAgICB7Ci0JY2hhciAqY3B1X25hbWUgPSB4c3RyZHVwIChhcmd2WzBdKTsKLQljaGFyICpoeXBoZW4gPSBzdHJjaHIgKGNwdV9uYW1lLCAnLScpOwotCWlmIChoeXBoZW4pCi0JICAqaHlwaGVuID0gMDsKLQljcHUgPSBzaW1fY3B1X2xvb2t1cCAoc2QsIGNwdV9uYW1lKTsKLQlpZiAoY3B1KQotCSAgewotCSAgICAvKiBJZiA8Y3B1bmFtZT4tPGNvbW1hbmQ+LCBwb2ludCBhcmd2WzBdIGF0IDxjb21tYW5kPi4gICovCi0JICAgIGlmIChoeXBoZW4pCi0JICAgICAgewotCQltYXRjaGluZ19hcmdpID0gMDsKLQkJYXJndlswXSArPSBoeXBoZW4gLSBjcHVfbmFtZSArIDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgbWF0Y2hpbmdfYXJnaSA9IDE7Ci0JICAgIG1hdGNoaW5nX29wdCA9IGZpbmRfbWF0Y2ggKHNkLCBjcHUsIGFyZ3YsICZtYXRjaGluZ19hcmdpKTsKLQkgICAgLyogSWYgaHlwaGVuIGZvdW5kIHJlc3RvcmUgYXJndlswXS4gICovCi0JICAgIGlmIChoeXBoZW4pCi0JICAgICAgYXJndlswXSAtPSBoeXBoZW4gLSBjcHVfbmFtZSArIDE7Ci0JICB9Ci0JZnJlZSAoY3B1X25hbWUpOwotICAgICAgfQotCi0gICAgICAvKiBJZiB0aGF0IGZhaWxlZCwgdHJ5IHRoZSBtYWluIHRhYmxlLiAgKi8KLSAgICAgIGlmIChtYXRjaGluZ19vcHQgPT0gTlVMTCkKLQl7Ci0JICBtYXRjaGluZ19hcmdpID0gMDsKLQkgIG1hdGNoaW5nX29wdCA9IGZpbmRfbWF0Y2ggKHNkLCBOVUxMLCBhcmd2LCAmbWF0Y2hpbmdfYXJnaSk7Ci0JfQotCi0gICAgICBpZiAobWF0Y2hpbmdfb3B0ICE9IE5VTEwpCi0JewotCSAgc3dpdGNoIChtYXRjaGluZ19vcHQtPm9wdC5oYXNfYXJnKQotCSAgICB7Ci0JICAgIGNhc2Ugbm9fYXJndW1lbnQ6Ci0JICAgICAgaWYgKGFyZ3YgW21hdGNoaW5nX2FyZ2kgKyAxXSA9PSBOVUxMKQotCQltYXRjaGluZ19vcHQtPmhhbmRsZXIgKHNkLCBjcHUsIG1hdGNoaW5nX29wdC0+b3B0LnZhbCwKLQkJCQkgICAgICAgTlVMTCwgMS8qaXNfY29tbWFuZCovKTsKLQkgICAgICBlbHNlCi0JCXNpbV9pb19lcHJpbnRmIChzZCwgIkNvbW1hbmQgYCVzJyB0YWtlcyBubyBhcmd1bWVudHNcbiIsCi0JCQkJbWF0Y2hpbmdfb3B0LT5vcHQubmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugb3B0aW9uYWxfYXJndW1lbnQ6Ci0JICAgICAgaWYgKGFyZ3YgW21hdGNoaW5nX2FyZ2kgKyAxXSA9PSBOVUxMKQotCQltYXRjaGluZ19vcHQtPmhhbmRsZXIgKHNkLCBjcHUsIG1hdGNoaW5nX29wdC0+b3B0LnZhbCwKLQkJCQkgICAgICAgTlVMTCwgMS8qaXNfY29tbWFuZCovKTsKLQkgICAgICBlbHNlIGlmIChhcmd2IFttYXRjaGluZ19hcmdpICsgMl0gPT0gTlVMTCkKLQkJbWF0Y2hpbmdfb3B0LT5oYW5kbGVyIChzZCwgY3B1LCBtYXRjaGluZ19vcHQtPm9wdC52YWwsCi0JCQkJICAgICAgIGFyZ3YgW21hdGNoaW5nX2FyZ2kgKyAxXSwgMS8qaXNfY29tbWFuZCovKTsKLQkgICAgICBlbHNlCi0JCXNpbV9pb19lcHJpbnRmIChzZCwgIkNvbW1hbmQgYCVzJyByZXF1aXJlcyBubyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50XG4iLAotCQkJCW1hdGNoaW5nX29wdC0+b3B0Lm5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHJlcXVpcmVkX2FyZ3VtZW50OgotCSAgICAgIGlmIChhcmd2IFttYXRjaGluZ19hcmdpICsgMV0gPT0gTlVMTCkKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiQ29tbWFuZCBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAotCQkJCW1hdGNoaW5nX29wdC0+b3B0Lm5hbWUpOwotCSAgICAgIGVsc2UgaWYgKGFyZ3YgW21hdGNoaW5nX2FyZ2kgKyAyXSA9PSBOVUxMKQotCQltYXRjaGluZ19vcHQtPmhhbmRsZXIgKHNkLCBjcHUsIG1hdGNoaW5nX29wdC0+b3B0LnZhbCwKLQkJCQkgICAgICAgYXJndiBbbWF0Y2hpbmdfYXJnaSArIDFdLCAxLyppc19jb21tYW5kKi8pOwotCSAgICAgIGVsc2UKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiQ29tbWFuZCBgJXMnIHJlcXVpcmVzIG9ubHkgb25lIGFyZ3VtZW50XG4iLAotCQkJCW1hdGNoaW5nX29wdC0+b3B0Lm5hbWUpOwotCSAgICB9Ci0JICBmcmVlYXJndiAoYXJndik7Ci0JICByZXR1cm4gU0lNX1JDX09LOwotCX0KLQotICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotICAgIH0KLSAgICAgIAotICAvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGF0IHJlbW90bHkgbWF0Y2hlZCAqLwotICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmggYi9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2FkNTYuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tb3B0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qIEhlYWRlciBmaWxlIGZvciBzaW11bGF0b3IgYXJndW1lbnQgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFNJTV9PUFRJT05TX0gKLSNkZWZpbmUgU0lNX09QVElPTlNfSAotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLS8qIEFSR1Ygb3B0aW9uIHN1cHBvcnQuCi0KLSAgIE9wdGlvbnMgZm9yIHRoZSBzdGFuZGFsb25lIHNpbXVsYXRvciBhcmUgcGFyc2VkIGJ5IHNpbV9vcGVuIHNpbmNlCi0gICBzaW1fb3BlbiBoYW5kbGVzIHRoZSBsYXJnZSBtYWpvcml0eSBvZiB0aGVtIGFuZCBpdCBhbHNvIHBhcnNlcyB0aGUKLSAgIG9wdGlvbnMgd2hlbiBpbnZva2VkIGJ5IGdkYiBbb3IgYW55IGV4dGVybmFsIHByb2dyYW1dLgotCi0gICBGb3IgT1BUSU9OX0hBTkRMRVI6IGFyZyMyIGlzIHRoZSBwcm9jZXNzb3IgdG8gYXBwbHkgdG8gb3B0aW9uIHRvCi0gICAoYWxsIGlmIE5VTEwpOyBhcmcjMyBpcyB0aGUgb3B0aW9uIGluZGV4OyBhcmcjNCBpcyB0aGUgb3B0aW9uJ3MKLSAgIGFyZ3VtZW50LCBOVUxMIGlmIG9wdGlvbmFsIGFuZCBtaXNzaW5nOyBhcmcjNSBpcyBub256ZXJvIGlmIGEKLSAgIGNvbW1hbmQgaXMgYmVpbmcgaW50ZXJwcmV0ZWQuICovCi0KLXR5cGVkZWYgU0lNX1JDIChPUFRJT05fSEFORExFUikgUEFSQU1TICgoU0lNX0RFU0MsIHNpbV9jcHUgKiwgaW50LCBjaGFyICosIGludCkpOwotCi0vKiBEZWNsYXJlIG9wdGlvbiBoYW5kbGVycyB3aXRoIGEgbWFjcm8gc28gaXQncyB1c2FibGUgb24gayZyIHN5c3RlbXMuICAqLwotI2RlZmluZSBERUNMQVJFX09QVElPTl9IQU5ETEVSKGZuKSBTSU1fUkMgZm4gUEFSQU1TICgoU0lNX0RFU0MsIHNpbV9jcHUgKiwgaW50LCBjaGFyICosIGludCkpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAvKiBUaGUgbG9uZyBvcHRpb24gaW5mb3JtYXRpb24uICovCi0KLSAgc3RydWN0IG9wdGlvbiBvcHQ7Ci0KLSAgLyogVGhlIHNob3J0IG9wdGlvbiB3aXRoIHRoZSBzYW1lIG1lYW5pbmcgKCdcMCcgaWYgbm9uZSkuCi0KLSAgICAgRm9yIHNob3J0IG9wdGlvbnMsIHdoZW4gT1BULlZBTCBpcyBub24temVybywgaXQsIGluc3RlYWQgb2YKLSAgICAgU0hPUlRPUFQgaXMgcGFzc2VkIHRvIEhBTkRMRVIuCi0KLSAgICAgRm9yIGV4YW1wbGUsIGZvciB0aGUgYmVsb3c6Ci0KLQl7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZBTFVFfSwKLQkgICAgJ2QnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUn0sCi0JeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WQUxVRX0sCi0JICAgICdlJywgTlVMTCwgIjw8ZGVzY3JpcHRpb24+PiIsIEhBTkRMRVJ9LAotCi0gICAgIHRoZSBvcHRpb25zIC0tZGMsIC1kIGFuZCAtZSBhbGwgcmVzdWx0IGluIE9QVElPTl9WQUxVRSBiZWluZwotICAgICBwYXNzZWQgaW50byBIQU5ETEVSLiAqLwotCi0gIGNoYXIgc2hvcnRvcHQ7Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IChOVUxMIGlmIG5vbmUpLiAgKi8KLQotICBjb25zdCBjaGFyICphcmc7Ci0KLSAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLgotCi0gICAgIElmIERPQyBpcyBOVUxMLCB0aGlzIG9wdGlvbiBuYW1lIGlzIGxpc3RlZCBhcyBhIHN5bm9ueW0gZm9yIHRoZQotICAgICBwcmV2aW91cyBvcHRpb24uCi0KLSAgICAgSWYgRE9DIGFuZCBET0NfTkFNRSBhcmUgdGhlIGVtcHR5IHN0cmluZyAoaS5lLiAiIiksIHRoaXMgb3B0aW9uCi0gICAgIGlzIG5vdCBsaXN0ZWQgaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCi0KLSAgICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBhbGlhc2VkIG9wdGlvbnMgLS1kYywgLS1kcCBhbmQgLWQsIHRoZW46Ci0KLQl7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RDfSwKLQkgICAgJ2QnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUn0sCi0JeyB7ImRwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUH0sCi0JICAgICdcMCcsIE5VTEwsIE5VTEwsIEhBTkRMRVJ9LAotCi0gICAgIHdpbGwgbGlzdCBgYC1kLCAtLWRjLCAtLWRwIDw8ZGVzY3JpcHRpb24+PicnICovCi0KLSAgY29uc3QgY2hhciAqZG9jOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgb3B0aW9uLiAgKi8KLQotICBPUFRJT05fSEFORExFUiAqaGFuZGxlcjsKLQotICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBuYW1lLiAgVXNlZCB3aGVuIGdlbmVyYXRpbmcgdXNhZ2UgYW5kIGhlbHAKLSAgICAgbWVzc2FnZXMuCi0KLSAgICAgSWYgRE9DIGFuZCBET0NfTkFNRSBhcmUgdGhlIGVtcHR5IHN0cmluZyAoaS5lLiAiIiksIHRoaXMgb3B0aW9uCi0gICAgIGlzIG5vdCBsaXN0ZWQgaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCi0KLSAgICAgSWYgRE9DX05BTUUgaXMgYSBub24tZW1wdHkgc3RyaW5nIHRoZW4gaXQsIGluc3RlZCBvZiBPUFQuTkFNRSwgaXMKLSAgICAgbGlzdGVkIGFzIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCi0KLSAgICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBvcHRpb25zIC0tc2V0LXBjIGFuZCAtLXNldC1zcCwgdGhlbjoKLQotCXsgeyJzZXQtcGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFVF9QQ30sCi0gICAgICAgICAgICAnXDAnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUiwgIi0tc2V0LVJFR05BTUUiIH0sCi0JeyB7InNldC1zcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VUX1NQfSwKLQkgICAgJ1wwJywgTlVMTCwgIiIsIEhBTkRMRVIsICIiIH0sCi0KLSAgICAgd2lsbCBsaXN0IGBgLS1zZXQtUkVHTkFNRSA8PGRlc2NyaXB0aW9uPj4iLiAqLwotCi0gIGNvbnN0IGNoYXIgKmRvY19uYW1lOwotCi19IE9QVElPTjsKLQotLyogQWxsIG9wdGlvbnMgdGhhdCBkb24ndCBoYXZlIGEgc2hvcnQgZm9ybSBlcXVpdmFsZW50IGJlZ2luIHdpdGggdGhpcyBmb3IKLSAgIGB2YWwnLiAgMTMwIGlzbid0IHNwZWNpYWwsIGp1c3Qgc29tZSBub24tQVNDSUkgdmFsdWUgdG8gYmVnaW4gYXQuCi0gICBNb2R1bGVzIG5lZWRuJ3Qgd29ycnkgYWJvdXQgY29sbGlzaW9ucyBoZXJlLCB0aGUgY29kZSBkeW5hbWljYWxseSBhc3NpZ25lZAotICAgdGhlIGFjdHVhbCBudW1iZXJzIHVzZWQgYW5kIHRoZW4gcGFzc2VzIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byB0aGUgb3B0aW9uCi0gICBoYW5kbGVyLiAgKi8KLSNkZWZpbmUgT1BUSU9OX1NUQVJUIDEzMAotCi0vKiBJZGVudGlmeSB2YWxpZCBvcHRpb24gaW4gdGhlIHRhYmxlICovCi0jZGVmaW5lIE9QVElPTl9WQUxJRF9QKE8pICgoTyktPm9wdC5uYW1lICE9IE5VTEwgfHwgKE8pLT5zaG9ydG9wdCAhPSAnXDAnKQotCi0vKiBMaXN0IG9mIG9wdGlvbnMgYWRkZWQgYnkgdmFyaW91cyBtb2R1bGVzLiAgKi8KLXR5cGVkZWYgc3RydWN0IG9wdGlvbl9saXN0IHsKLSAgc3RydWN0IG9wdGlvbl9saXN0ICpuZXh0OwotICBjb25zdCBPUFRJT04gKm9wdGlvbnM7Ci19IE9QVElPTl9MSVNUOwotCi0vKiBBZGQgYSBzZXQgb2Ygb3B0aW9ucyB0byB0aGUgc2ltdWxhdG9yLgotICAgQ1BVIGlzIHRoZSBjcHUgdGhlIG9wdGlvbnMgYXBwbHkgdG8gb3IgTlVMTCBmb3IgYWxsIGNwdXMuCi0gICBUQUJMRSBpcyBhbiBhcnJheSBvZiBPUFRJT05TIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIGBvcHQubmFtZScgZW50cnkuICAqLwotU0lNX1JDIHNpbV9hZGRfb3B0aW9uX3RhYmxlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGNvbnN0IE9QVElPTiAqdGFibGUpKTsKLQotLyogSW5zdGFsbCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQgb3B0aW9ucy4gICovCi1NT0RVTEVfSU5TVEFMTF9GTiBzdGFuZGFyZF9pbnN0YWxsOwotCi0vKiBDYWxsZWQgYnkgc2ltX29wZW4gdG8gcGFyc2UgdGhlIGFyZ3VtZW50cy4gICovCi1TSU1fUkMgc2ltX3BhcnNlX2FyZ3MgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKiphcmd2KSk7Ci0KLS8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgSVNfQ09NTUFORCBpcyBub24temVybyB3aGVuCi0gICB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIuICovCi12b2lkIHNpbV9wcmludF9oZWxwIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgaXNfY29tbWFuZCkpOwotCi0vKiBUcnkgdG8gcGFyc2UgdGhlIGNvbW1hbmQgYXMgaWYgaXQgaXMgYW4gb3B0aW9uLCBPbmx5IGZhaWwgd2hlbgotICAgdG90YWxseSB1bnN1Y2Nlc3NmdWwgKi8KLVNJTV9SQyBzaW1fYXJnc19jb21tYW5kIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpKTsKLQotI2VuZGlmIC8qIFNJTV9PUFRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXByb2ZpbGUuYyBiL3NpbS9jb21tb24vc2ltLXByb2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyOWEzOC4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS1wcm9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc1ICswLDAgQEAKLS8qIERlZmF1bHQgcHJvZmlsaW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0taW8uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09NTUFTKG4pIHNpbV9hZGRfY29tbWFzIChjb21tYV9idWYsIHNpemVvZiAoY29tbWFfYnVmKSwgKG4pKQotCi1zdGF0aWMgTU9EVUxFX0lOSVRfRk4gcHJvZmlsZV9pbml0Owotc3RhdGljIE1PRFVMRV9VTklOU1RBTExfRk4gcHJvZmlsZV91bmluc3RhbGw7Ci0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChwcm9maWxlX29wdGlvbl9oYW5kbGVyKTsKLQotZW51bSB7Ci0gIE9QVElPTl9QUk9GSUxFX0lOU04gPSBPUFRJT05fU1RBUlQsCi0gIE9QVElPTl9QUk9GSUxFX01FTU9SWSwKLSAgT1BUSU9OX1BST0ZJTEVfTU9ERUwsCi0gIE9QVElPTl9QUk9GSUxFX0ZJTEUsCi0gIE9QVElPTl9QUk9GSUxFX0NPUkUsCi0gIE9QVElPTl9QUk9GSUxFX1BDLAotICBPUFRJT05fUFJPRklMRV9QQ19SQU5HRSwKLSAgT1BUSU9OX1BST0ZJTEVfUENfR1JBTlVMQVJJVFksCi0gIE9QVElPTl9QUk9GSUxFX1JBTkdFLAotICBPUFRJT05fUFJPRklMRV9GVU5DVElPTgotfTsKLQotc3RhdGljIGNvbnN0IE9QVElPTiBwcm9maWxlX29wdGlvbnNbXSA9IHsKLSAgeyB7InByb2ZpbGUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgICAgICdwJywgIm9ufG9mZiIsICJQZXJmb3JtIHByb2ZpbGluZyIsCi0gICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJwcm9maWxlLWluc24iLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfSU5TTn0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gaW5zdHJ1Y3Rpb24gcHJvZmlsaW5nIiwKLSAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InByb2ZpbGUtbWVtb3J5Iiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX01FTU9SWX0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gbWVtb3J5IHByb2ZpbGluZyIsCi0gICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJwcm9maWxlLWNvcmUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfQ09SRX0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gQ09SRSBwcm9maWxpbmciLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotICB7IHsicHJvZmlsZS1tb2RlbCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9NT0RFTH0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gbW9kZWwgcHJvZmlsaW5nIiwKLSAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHsicHJvZmlsZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX0ZJTEV9LAotICAgICAgJ1wwJywgIkZJTEUgTkFNRSIsICJTcGVjaWZ5IHByb2ZpbGUgb3V0cHV0IGZpbGUiLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotCi0gIHsgeyJwcm9maWxlLXBjIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX1BDfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBQQyBwcm9maWxpbmciLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotICB7IHsicHJvZmlsZS1wYy1mcmVxdWVuY3kiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0YnfSwKLSAgICAgICdGJywgIlBDIFBST0ZJTEUgRlJFUVVFTkNZIiwgIlNwZWNpZmllZCBQQyBwcm9maWxpbmcgZnJlcXVlbmN5IiwKLSAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InByb2ZpbGUtcGMtc2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICAgICAgJ1MnLCAiUEMgUFJPRklMRSBTSVpFIiwgIlNwZWNpZnkgUEMgcHJvZmlsaW5nIHNpemUiLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotICB7IHsicHJvZmlsZS1wYy1ncmFudWxhcml0eSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9QQ19HUkFOVUxBUklUWX0sCi0gICAgICAnXDAnLCAiUEMgUFJPRklMRSBHUkFOVUxBUklUWSIsICJTcGVjaWZ5IFBDIHByb2ZpbGluZyBzYW1wbGUgY292ZXJhZ2UiLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotICB7IHsicHJvZmlsZS1wYy1yYW5nZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9QQ19SQU5HRX0sCi0gICAgICAnXDAnLCAiQkFTRSxCT1VORCIsICJTcGVjaWZ5IFBDIHByb2ZpbGluZyBhZGRyZXNzIHJhbmdlIiwKLSAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKLQotI2lmZGVmIFNJTV9IQVZFX0FERFJfUkFOR0UKLSAgeyB7InByb2ZpbGUtcmFuZ2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfUkFOR0V9LAotICAgICAgJ1wwJywgIlNUQVJULEVORCIsICJTcGVjaWZ5IHJhbmdlIG9mIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIG1vZGVsIHByb2ZpbGluZyIsCi0gICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCi0jaWYgMCAvKndpcCovCi0gIHsgeyJwcm9maWxlLWZ1bmN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX0ZVTkNUSU9OfSwKLSAgICAgICdcMCcsICJGVU5DVElPTiIsICJTcGVjaWZ5IGZ1bmN0aW9uIHRvIHByb2ZpbGUiLAotICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAotI2VuZGlmCi0jZW5kaWYKLQotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotLyogU2V0L3Jlc2V0IHRoZSBwcm9maWxlIG9wdGlvbnMgaW5kaWNhdGVkIGluIE1BU0suICAqLwotCi1TSU1fUkMKLXNldF9wcm9maWxlX29wdGlvbl9tYXNrIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgaW50IHByb2ZpbGVfbnI7Ci0gIGludCBjcHVfbnI7Ci0gIGludCBwcm9maWxlX3ZhbCA9IDE7Ci0KLSAgaWYgKGFyZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgInllcyIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCAib24iKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywgIjEiKSA9PSAwKQotCXByb2ZpbGVfdmFsID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjAiKSA9PSAwKQotCXByb2ZpbGVfdmFsID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJBcmd1bWVudCBgJXMnIGZvciBgLS1wcm9maWxlJXMnIGludmFsaWQsIG9uZSBvZiBgb24nLCBgb2ZmJywgYHllcycsIGBubycgZXhwZWN0ZWRcbiIsIGFyZywgbmFtZSk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgIH0KLQotICAvKiB1cGRhdGUgYXBwbGljYWJsZSBwcm9maWxlIGJpdHMgKi8KLSAgZm9yIChwcm9maWxlX25yID0gMDsgcHJvZmlsZV9uciA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytwcm9maWxlX25yKQotICAgIHsKLSAgICAgIGlmICgobWFzayAmICgxIDw8IHByb2ZpbGVfbnIpKSA9PSAwKQotCWNvbnRpbnVlOwotCi0jaWYgMCAvKiBzZWUgc2ltLXRyYWNlLmMsIHNldCBmbGFncyBpbiBTVEFURSBoZXJlIGlmL3doZW4gdGhlcmUgYXJlIGFueSAqLwotICAgICAgLyogU2V0IG5vbi1jcHUgc3BlY2lmaWMgdmFsdWVzLiAgKi8KLSAgICAgIHN3aXRjaCAocHJvZmlsZV9ucikKLQl7Ci0JY2FzZSA/Pz8gOgotCSAgYnJlYWs7Ci0JfQotI2VuZGlmCi0KLSAgICAgIC8qIFNldCBjcHUgdmFsdWVzLiAgKi8KLSAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQotCXsKLQkgIENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtwcm9maWxlX25yXSA9IHByb2ZpbGVfdmFsOwotCX0KLSAgICB9Ci0KLSAgLyogUmUtY29tcHV0ZSB0aGUgY3B1IHByb2ZpbGUgc3VtbWFyeS4gICovCi0gIGlmIChwcm9maWxlX3ZhbCkKLSAgICB7Ci0gICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKLQlDUFVfUFJPRklMRV9EQVRBIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKS0+cHJvZmlsZV9hbnlfcCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgY3B1X25yKyspCi0JewotCSAgQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSktPnByb2ZpbGVfYW55X3AgPSAwOwotCSAgZm9yIChwcm9maWxlX25yID0gMDsgcHJvZmlsZV9uciA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytwcm9maWxlX25yKQotCSAgICB7Ci0JICAgICAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtwcm9maWxlX25yXSkKLQkJewotCQkgIENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpLT5wcm9maWxlX2FueV9wID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0gIAotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIFNldCBvbmUgcHJvZmlsZSBvcHRpb24gYmFzZWQgb24gaXRzIElEWCB2YWx1ZS4KLSAgIE5vdCBzdGF0aWMgYXMgY2dlbi1zY2FjaGUuYyB1c2VzIGl0LiAgKi8KLQotU0lNX1JDCi1zaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGlkeCwgY29uc3QgY2hhciAqYXJnKQotewotICByZXR1cm4gc2V0X3Byb2ZpbGVfb3B0aW9uX21hc2sgKHNkLCBuYW1lLCAxIDw8IGlkeCwgYXJnKTsKLX0KLQotc3RhdGljIFNJTV9SQwotcHJvZmlsZV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsCi0JCQlzaW1fY3B1ICpjcHUsCi0JCQlpbnQgb3B0LAotCQkJY2hhciAqYXJnLAotCQkJaW50IGlzX2NvbW1hbmQpCi17Ci0gIGludCBjcHVfbnIscHJvZl9ucjsKLQotICAvKiBGSVhNRTogTmVlZCB0byBoYW5kbGUgYGNwdScgYXJnLiAgKi8KLQotICBzd2l0Y2ggKG9wdCkKLSAgICB7Ci0gICAgY2FzZSAncCcgOgotICAgICAgaWYgKCEgV0lUSF9QUk9GSUxFKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtcCcgaWdub3JlZFxuIik7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHNldF9wcm9maWxlX29wdGlvbl9tYXNrIChzZCwgInByb2ZpbGUiLCBQUk9GSUxFX1VTRUZVTF9NQVNLLAotCQkJCQlhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QUk9GSUxFX0lOU04gOgotICAgICAgaWYgKFdJVEhfUFJPRklMRV9JTlNOX1ApCi0JcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLWluc24iLCBQUk9GSUxFX0lOU05fSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkluc3RydWN0aW9uIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtaW5zbicgaWdub3JlZFxuIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BST0ZJTEVfTUVNT1JZIDoKLSAgICAgIGlmIChXSVRIX1BST0ZJTEVfTUVNT1JZX1ApCi0JcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLW1lbW9yeSIsIFBST0ZJTEVfTUVNT1JZX0lEWCwgYXJnKTsKLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJNZW1vcnkgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1tZW1vcnknIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QUk9GSUxFX0NPUkUgOgotICAgICAgaWYgKFdJVEhfUFJPRklMRV9DT1JFX1ApCi0JcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLWNvcmUiLCBQUk9GSUxFX0NPUkVfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkNPUkUgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1jb3JlJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9NT0RFTCA6Ci0gICAgICBpZiAoV0lUSF9QUk9GSUxFX01PREVMX1ApCi0JcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLW1vZGVsIiwgUFJPRklMRV9NT0RFTF9JRFgsIGFyZyk7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiTW9kZWwgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1tb2RlbCcgaWdub3JlZFxuIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BST0ZJTEVfRklMRSA6Ci0gICAgICAvKiBGSVhNRTogTWlnaHQgd2FudCB0aGlzIHRvIGFwcGx5IHRvIHBjIHByb2ZpbGluZyBvbmx5LAotCSBvciBoYXZlIHR3byBwcm9maWxlIGZpbGUgb3B0aW9ucy4gICovCi0gICAgICBpZiAoISBXSVRIX1BST0ZJTEUpCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiUHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1maWxlJyBpZ25vcmVkXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBGSUxFICpmID0gZm9wZW4gKGFyZywgInciKTsKLQotCSAgaWYgKGYgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVuYWJsZSB0byBvcGVuIHByb2ZpbGUgb3V0cHV0IGZpbGUgYCVzJ1xuIiwgYXJnKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICBQUk9GSUxFX0ZJTEUgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IGY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QUk9GSUxFX1BDOgotICAgICAgaWYgKFdJVEhfUFJPRklMRV9QQ19QKQotCXJldHVybiBzaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChzZCwgIi1wYyIsIFBST0ZJTEVfUENfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlBDIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtcGMnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdGJyA6Ci0gICAgICBpZiAoV0lUSF9QUk9GSUxFX1BDX1ApCi0JewotCSAgLyogRklYTUU6IFZhbGlkYXRlIGFyZy4gICovCi0JICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICBQUk9GSUxFX1BDX0ZSRVEgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHZhbDsKLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICBDUFVfUFJPRklMRV9GTEFHUyAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSlbUFJPRklMRV9QQ19JRFhdID0gMTsKLQl9Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1wYy1mcmVxdWVuY3knIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJyA6Ci0gICAgICBpZiAoV0lUSF9QUk9GSUxFX1BDX1ApCi0JewotCSAgLyogRklYTUU6IFZhbGlkYXRlIGFyZy4gICovCi0JICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHZhbDsKLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICBDUFVfUFJPRklMRV9GTEFHUyAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSlbUFJPRklMRV9QQ19JRFhdID0gMTsKLQl9Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1wYy1zaXplJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9QQ19HUkFOVUxBUklUWToKLSAgICAgIGlmIChXSVRIX1BST0ZJTEVfUENfUCkKLQl7Ci0JICBpbnQgc2hpZnQ7Ci0JICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKLQkgIC8qIGNoZWNrIHRoYXQgdGhlIGdyYW51bGFyaXR5IGlzIGEgcG93ZXIgb2YgdHdvICovCi0JICBzaGlmdCA9IDA7Ci0JICB3aGlsZSAodmFsID4gKDEgPDwgc2hpZnQpKQotCSAgICB7Ci0JICAgICAgc2hpZnQgKz0gMTsKLQkgICAgfQotCSAgaWYgKHZhbCAhPSAoMSA8PCBzaGlmdCkpCi0JICAgIHsKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJQQyBwcm9maWxpbmcgZ3JhbnVsYXJpdHkgbm90IGEgcG93ZXIgb2YgdHdvXG4iKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGlmIChzaGlmdCA9PSAwKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIGdyYW51bGFyaXR5IHRvbyBzbWFsbCIpOwotCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgICAgfQotCSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjcHVfbnIpCi0JICAgIFBST0ZJTEVfUENfU0hJRlQgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHNoaWZ0OwotCSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjcHVfbnIpCi0JICAgIENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtQUk9GSUxFX1BDX0lEWF0gPSAxOwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJQQyBwcm9maWxpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1wcm9maWxlLXBjLWdyYW51bGFyaXR5JyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9QQ19SQU5HRToKLSAgICAgIGlmIChXSVRIX1BST0ZJTEVfUENfUCkKLQl7Ci0JICAvKiBGSVhNRTogVmFsaWRhdGUgYXJncyAqLwotCSAgY2hhciAqY2hwID0gYXJnOwotCSAgdW5zaWduZWQgbG9uZyBiYXNlOwotCSAgdW5zaWduZWQgbG9uZyBib3VuZDsKLQkgIGJhc2UgPSBzdHJ0b3VsIChjaHAsICZjaHAsIDApOwotCSAgaWYgKCpjaHAgIT0gJywnKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiLS1wcm9maWxlLXBjLXJhbmdlIG1pc3NpbmcgQk9VTkQgYXJndW1lbnRcbiIpOwotCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgICAgfQotCSAgYm91bmQgPSBzdHJ0b3VsIChjaHAgKyAxLCBOVUxMLCAwKTsKLQkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQotCSAgICB7Ci0JICAgICAgUFJPRklMRV9QQ19TVEFSVCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkpID0gYmFzZTsKLQkgICAgICBQUk9GSUxFX1BDX0VORCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkpID0gYm91bmQ7Ci0JICAgIH0JICAgICAgCi0JICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2NwdV9ucikKLQkgICAgQ1BVX1BST0ZJTEVfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpW1BST0ZJTEVfUENfSURYXSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlBDIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtcGMtcmFuZ2UnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9SQU5HRSA6Ci0gICAgICBpZiAoV0lUSF9QUk9GSUxFKQotCXsKLQkgIGNoYXIgKmNocCA9IGFyZzsKLQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsZW5kOwotCSAgc3RhcnQgPSBzdHJ0b3VsIChjaHAsICZjaHAsIDApOwotCSAgaWYgKCpjaHAgIT0gJywnKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiLS1wcm9maWxlLXJhbmdlIG1pc3NpbmcgRU5EIGFyZ3VtZW50XG4iKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGVuZCA9IHN0cnRvdWwgKGNocCArIDEsIE5VTEwsIDApOwotCSAgLyogRklYTUU6IEFyZ3VtZW50IHZhbGlkYXRpb24uICAqLwotCSAgaWYgKGNwdSAhPSBOVUxMKQotCSAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLAotCQkJCXN0YXJ0LCBlbmQpOwotCSAgZWxzZQotCSAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2NwdV9ucikKLQkgICAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSwKLQkJCQkgIHN0YXJ0LCBlbmQpOwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJQcm9maWxpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1wcm9maWxlLXJhbmdlJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFJPRklMRV9GVU5DVElPTiA6Ci0gICAgICBpZiAoV0lUSF9QUk9GSUxFKQotCXsKLQkgIC8qd2lwOiBuZWVkIHRvIGNvbXB1dGUgZnVuY3Rpb24gcmFuZ2UgZ2l2ZW4gbmFtZSovCi0JfQotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtZnVuY3Rpb24nIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogU0lNX0hBVkVfQUREUl9SQU5HRSAqLwotICAgIH0KLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotDAotLyogUEMgcHJvZmlsaW5nIHN1cHBvcnQgKi8KLQotI2lmIFdJVEhfUFJPRklMRV9QQ19QCi0KLXN0YXRpYyB2b2lkCi1wcm9maWxlX3BjX2NsZWFudXAgKFNJTV9ERVNDIHNkKQotewotICBpbnQgbjsKLSAgZm9yIChuID0gMDsgbiA8IE1BWF9OUl9QUk9DRVNTT1JTOyBuKyspCi0gICAgewotICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgbik7Ci0gICAgICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICAgICAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpICE9IE5VTEwpCi0JemZyZWUgKFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpKTsKLSAgICAgIFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpID0gTlVMTDsKLSAgICAgIGlmIChQUk9GSUxFX1BDX0VWRU5UIChkYXRhKSAhPSBOVUxMKQotCXNpbV9ldmVudHNfZGVzY2hlZHVsZSAoc2QsIFBST0ZJTEVfUENfRVZFTlQgKGRhdGEpKTsKLSAgICAgIFBST0ZJTEVfUENfRVZFTlQgKGRhdGEpID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByb2ZpbGVfcGNfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgcHJvZmlsZV9wY19jbGVhbnVwIChzZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9maWxlX3BjX2V2ZW50IChTSU1fREVTQyBzZCwKLQkJICB2b2lkICpkYXRhKQotewotICBzaW1fY3B1ICpjcHUgPSAoc2ltX2NwdSopIGRhdGE7Ci0gIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIGFkZHJlc3Nfd29yZCBwYzsKLSAgdW5zaWduZWQgaTsKLSAgc3dpdGNoIChTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMpCi0gICAgewotICAgIGNhc2UgMjogcGMgPSAqKHVuc2lnbmVkXzIqKShTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYykgOyBicmVhazsKLSAgICBjYXNlIDQ6IHBjID0gKih1bnNpZ25lZF80KikoU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMpIDsgYnJlYWs7Ci0gICAgY2FzZSA4OiBwYyA9ICoodW5zaWduZWRfOCopKFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjKSA7IGJyZWFrOwotICAgIGRlZmF1bHQ6IHBjID0gMDsKLSAgICB9Ci0gIGkgPSAocGMgLSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKSkgPj4gUFJPRklMRV9QQ19TSElGVCAocHJvZmlsZSk7Ci0gIGlmIChpIDwgUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKSkKLSAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbaV0gKz0gMTsgLyogT3ZlcmZsb3c/ICovCi0gIGVsc2UKLSAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKV0gKz0gMTsKLSAgUFJPRklMRV9QQ19FVkVOVCAocHJvZmlsZSkgPSAKLSAgICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgUFJPRklMRV9QQ19GUkVRIChwcm9maWxlKSwgcHJvZmlsZV9wY19ldmVudCwgY3B1KTsKLX0KLQotc3RhdGljIFNJTV9SQwotcHJvZmlsZV9wY19pbml0IChTSU1fREVTQyBzZCkKLXsKLSAgaW50IG47Ci0gIHByb2ZpbGVfcGNfY2xlYW51cCAoc2QpOwotICBmb3IgKG4gPSAwOyBuIDwgTUFYX05SX1BST0NFU1NPUlM7IG4rKykKLSAgICB7Ci0gICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBuKTsKLSAgICAgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gICAgICBpZiAoQ1BVX1BST0ZJTEVfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIG4pKVtQUk9GSUxFX1BDX0lEWF0KLQkgICYmIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjICE9IE5VTEwpCi0JewotCSAgaW50IGJ1Y2tldF9zaXplOwotCSAgLyogZmlsbCBpbiB0aGUgZnJlcXVlbmN5IGlmIG5vdCBzcGVjaWZpZWQgKi8KLQkgIGlmIChQUk9GSUxFX1BDX0ZSRVEgKGRhdGEpID09IDApCi0JICAgIFBST0ZJTEVfUENfRlJFUSAoZGF0YSkgPSAyNTY7Ci0JICAvKiBmaWxsIGluIHRoZSBzdGFydC9lbmQgaWYgbm90IHNwZWNpZmllZCAqLwotCSAgaWYgKFBST0ZJTEVfUENfRU5EIChkYXRhKSA9PSAwKQotCSAgICB7Ci0JICAgICAgUFJPRklMRV9QQ19TVEFSVCAoZGF0YSkgPSBTVEFURV9URVhUX1NUQVJUIChzZCk7Ci0JICAgICAgUFJPRklMRV9QQ19FTkQgKGRhdGEpID0gU1RBVEVfVEVYVF9FTkQgKHNkKTsKLQkgICAgfQotCSAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgaWYgbm90IHNwZWNpZmllZC4gKi8KLQkgIGlmIChQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKGRhdGEpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoUFJPRklMRV9QQ19CVUNLRVRfU0laRSAoZGF0YSkgPT0gMCkKLQkJUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSA9IDE2OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChQUk9GSUxFX1BDX0VORCAoZGF0YSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogbnJfYnVja2V0cyA9IChmdWxsLWFkZHJlc3MtcmFuZ2UgLyAyKSAvIChidWNrZXRfc2l6ZSAvIDIpICovCi0JCSAgICAgIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkgPQotCQkJKCgxIDw8IChTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMpICogKDggLSAxKSkKLQkJCSAvIChQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKSAvIDIpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkgPQotCQkJKChQUk9GSUxFX1BDX0VORCAoZGF0YSkKLQkJCSAgLSBQUk9GSUxFX1BDX1NUQVJUIChkYXRhKQotCQkJICArIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpIC0gMSkKLQkJCSAvIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAvKiBDb21wdXRlIHRoZSBidWNrZXQgc2l6ZSBpZiBub3Qgc3BlY2lmaWVkLiAgRW5zdXJlIHRoYXQgaXQKLSAgICAgICAgICAgICBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIHR3byAqLwotCSAgaWYgKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoUFJPRklMRV9QQ19FTkQgKGRhdGEpID09IDApCi0JCS8qIGJ1Y2tldF9zaXplID0gKGZ1bGwtYWRkcmVzcy1yYW5nZSAvIDIpIC8gKG5yX2J1Y2tldHMgLyAyKSAqLwotCQlidWNrZXRfc2l6ZSA9ICgoMSA8PCAoKFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyAqIDgpIC0gMSkpCi0JCQkgICAgICAgLyAoUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSAvIDIpKTsKLQkgICAgICBlbHNlCi0JCWJ1Y2tldF9zaXplID0gKChQUk9GSUxFX1BDX0VORCAoZGF0YSkKLQkJCQktIFBST0ZJTEVfUENfU1RBUlQgKGRhdGEpCi0JCQkJKyBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKGRhdGEpIC0gMSkKLQkJCSAgICAgICAvIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkpOwotCSAgICAgIFBST0ZJTEVfUENfU0hJRlQgKGRhdGEpID0gMDsKLQkgICAgICB3aGlsZSAoYnVja2V0X3NpemUgPCBQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKSkKLQkJewotCQkgIFBST0ZJTEVfUENfU0hJRlQgKGRhdGEpICs9IDE7Ci0JCX0KLQkgICAgfQotCSAgLyogQWxpZ24gdGhlIGVuZCBhZGRyZXNzIHdpdGggYnVja2V0IHNpemUgKi8KLQkgIGlmIChQUk9GSUxFX1BDX0VORCAoZGF0YSkgIT0gMCkKLQkgICAgUFJPRklMRV9QQ19FTkQgKGRhdGEpID0gKFBST0ZJTEVfUENfU1RBUlQgKGRhdGEpCi0JCQkJICAgICArIChQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKQotCQkJCQkqIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkpKTsKLQkgIC8qIGNyZWF0ZSB0aGUgcmVsZXZhbnQgYnVmZmVycyAqLwotCSAgUFJPRklMRV9QQ19DT1VOVCAoZGF0YSkgPQotCSAgICBOWkFMTE9DICh1bnNpZ25lZCwgUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSArIDEpOwotCSAgUFJPRklMRV9QQ19FVkVOVCAoZGF0YSkgPQotCSAgICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwKLQkJCQkgUFJPRklMRV9QQ19GUkVRIChkYXRhKSwKLQkJCQkgcHJvZmlsZV9wY19ldmVudCwKLQkJCQkgY3B1KTsKLQl9Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1zdGF0aWMgdm9pZAotcHJvZmlsZV9wcmludF9wYyAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIGNoYXIgY29tbWFfYnVmWzIwXTsKLSAgdW5zaWduZWQgbWF4X3ZhbDsKLSAgdW5zaWduZWQgdG90YWw7Ci0gIHVuc2lnbmVkIGk7Ci0KLSAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiUHJvZ3JhbSBDb3VudGVyIFN0YXRpc3RpY3M6XG5cbiIpOwotCi0gIC8qIEZpcnN0IHBhc3Mgb3ZlciBkYXRhIGNvbXB1dGVzIHZhcmlvdXMgdGhpbmdzLiAgKi8KLSAgbWF4X3ZhbCA9IDA7Ci0gIHRvdGFsID0gMDsKLSAgZm9yIChpID0gMDsgaSA8PSBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpOyArK2kpCi0gICAgewotICAgICAgdG90YWwgKz0gUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2ldOwotICAgICAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSA+IG1heF92YWwpCi0JbWF4X3ZhbCA9IFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXTsKLSAgICB9Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIFRvdGFsIHNhbXBsZXM6ICVzXG4iLAotCQkgQ09NTUFTICh0b3RhbCkpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgR3JhbnVsYXJpdHk6ICVzIGJ5dGVzIHBlciBidWNrZXRcbiIsCi0JCSBDT01NQVMgKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKHByb2ZpbGUpKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICBTaXplOiAlcyBidWNrZXRzXG4iLAotCQkgQ09NTUFTIChQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICBGcmVxdWVuY3k6ICVzIGN5Y2xlcyBwZXIgc2FtcGxlXG4iLAotCQkgQ09NTUFTIChQUk9GSUxFX1BDX0ZSRVEgKHByb2ZpbGUpKSk7Ci0KLSAgaWYgKFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSAhPSAwKQotICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBSYW5nZTogMHglbHggMHglbHhcbiIsCi0JCSAgIChsb25nKSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKSwKLQkJICAgKGxvbmcpIFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSk7Ci0KLSAgaWYgKHZlcmJvc2UgJiYgbWF4X3ZhbCAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vdyB3ZSBjYW4gcHJpbnQgdGhlIGhpc3RvZ3JhbS4gICovCi0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IFBST0ZJTEVfUENfTlJfQlVDS0VUUyAocHJvZmlsZSk7ICsraSkKLQl7Ci0JICBpZiAoUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2ldICE9IDApCi0JICAgIHsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgIik7Ci0JICAgICAgaWYgKGkgPT0gUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKSkKLQkJc2ltX2lvX3ByaW50ZiAoc2QsICIlMTBzOiIsICJvdmVyZmxvdyIpOwotCSAgICAgIGVsc2UKLQkJc2ltX2lvX3ByaW50ZiAoc2QsICIweCUwOGx4OiIsCi0JCQkgICAgICAgKGxvbmcpIChQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKQotCQkJCSAgICAgICArIChpICogUFJPRklMRV9QQ19CVUNLRVRfU0laRSAocHJvZmlsZSkpKSk7Ci0JICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgJSpzIiwKLQkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAotCQkJICAgICBDT01NQVMgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSkpOwotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICU0LjFmIiwKLQkJCSAgICAgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSAqIDEwMC4wKSAvIHRvdGFsKTsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIjogIik7Ci0JICAgICAgc2ltX3Byb2ZpbGVfcHJpbnRfYmFyIChzZCwgUFJPRklMRV9ISVNUT0dSQU1fV0lEVEgsCi0JCQkJICAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbaV0sCi0JCQkJICAgICBtYXhfdmFsKTsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGR1bXAgdGhlIGhpc3RvZ3JhbSB0byB0aGUgZmlsZSAiZ21vbi5vdXQiIHVzaW5nIEJTRCdzIGdwcm9mIGZpbGUKLSAgICAgZm9ybWF0ICovCi0gIC8qIFNpbmNlIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24KLSAgICAgd2hpY2ggdGhlIHByb2ZpbGUgaXMgYmVpbmcsIGVuZGlhbiBpc3N1ZXMgYXJlIG5vdCBjb25zaWRlcmVkIGluCi0gICAgIHRoZSBjb2RlIGJlbG93LiAqLwotICAvKiBGSVhNRTogSXMgdGhpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBjb2RlPyAqLwotICB7Ci0gICAgRklMRSAqcGYgPSBmb3BlbiAoImdtb24ub3V0IiwgIndiIik7Ci0gICAgCi0gICAgaWYgKHBmID09IE5VTEwpCi0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJGYWlsZWQgdG8gb3BlbiBcImdtb24ub3V0XCIgcHJvZmlsZSBmaWxlXG4iKTsKLSAgICBlbHNlCi0gICAgICB7Ci0JaW50IG9rOwotCS8qIEZJWE1FOiB3aGF0IGlmIHRoZSB0YXJnZXQgaGFzIGEgNjQgYml0IFBDPyAqLwotCXVuc2lnbmVkMzIgaGVhZGVyWzNdOwotCXVuc2lnbmVkIGxvb3A7Ci0JaWYgKFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSAhPSAwKQotCSAgewotCSAgICBoZWFkZXJbMF0gPSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKTsKLQkgICAgaGVhZGVyWzFdID0gUFJPRklMRV9QQ19FTkQgKHByb2ZpbGUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaGVhZGVyWzBdID0gMDsKLQkgICAgaGVhZGVyWzFdID0gMDsKLQkgIH0KLQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKCsgaGVhZGVyKSAqLwotCWhlYWRlclsyXSA9IFBST0ZJTEVfUENfTlJfQlVDS0VUUyAocHJvZmlsZSkgKiAyICsgc2l6ZW9mIChoZWFkZXIpOwotCW9rID0gZndyaXRlICgmaGVhZGVyLCBzaXplb2YgKGhlYWRlciksIDEsIHBmKTsKLQlmb3IgKGxvb3AgPSAwOwotCSAgICAgb2sgJiYgKGxvb3AgPCBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpKTsKLQkgICAgIGxvb3ArKykKLQkgIHsKLQkgICAgc2lnbmVkMTYgc2FtcGxlOwotCSAgICBpZiAoUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2xvb3BdID49IDB4ZmZmZikKLQkgICAgICBzYW1wbGUgPSAweGZmZmY7Ci0JICAgIGVsc2UKLQkgICAgICBzYW1wbGUgPSBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbbG9vcF07Ci0JICAgIG9rID0gZndyaXRlICgmc2FtcGxlLCBzaXplb2YgKHNhbXBsZSksIDEsIHBmKTsKLQkgIH0KLQlpZiAob2sgPT0gMCkKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIkZhaWxlZCB0byB3cml0ZSB0byBcImdtb24ub3V0XCIgcHJvZmlsZSBmaWxlXG4iKTsKLQlmY2xvc2UocGYpOwotICAgICAgfQotICB9Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotfQotCi0jZW5kaWYKLQwKLS8qIFN1bW1hcnkgcHJpbnRpbmcgc3VwcG9ydC4gICovCi0KLSNpZiBXSVRIX1BST0ZJTEVfSU5TTl9QCi0KLXN0YXRpYyBTSU1fUkMKLXByb2ZpbGVfaW5zbl9pbml0IChTSU1fREVTQyBzZCkKLXsKLSAgaW50IGM7Ci0KLSAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCi0gICAgewotICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7Ci0KLSAgICAgIGlmIChDUFVfTUFYX0lOU05TIChjcHUpID4gMCkKLQlQUk9GSUxFX0lOU05fQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpID0gTlpBTExPQyAodW5zaWduZWQgaW50LCBDUFVfTUFYX0lOU05TIChjcHUpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotc3RhdGljIHZvaWQKLXByb2ZpbGVfcHJpbnRfaW5zbiAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKLXsKLSAgdW5zaWduZWQgaW50IGksIG4sIHRvdGFsLCBtYXhfdmFsLCBtYXhfbmFtZV9sZW47Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICBjaGFyIGNvbW1hX2J1ZlsyMF07Ci0KLSAgLyogSWYgTUFYX0lOU05TIG5vdCBzZXQsIGluc24gcHJvZmlsaW5nIGlzbid0IHN1cHBvcnRlZC4gICovCi0gIGlmIChDUFVfTUFYX0lOU05TIChjcHUpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiSW5zdHJ1Y3Rpb24gU3RhdGlzdGljcyIpOwotI2lmZGVmIFNJTV9IQVZFX0FERFJfUkFOR0UKLSAgaWYgKFBST0ZJTEVfUkFOR0UgKGRhdGEpLT5yYW5nZXMpCi0gICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgKGZvciBzZWxlY3RlZCBhZGRyZXNzIHJhbmdlKHMpKSIpOwotI2VuZGlmCi0gIHNpbV9pb19wcmludGYgKHNkLCAiXG5cbiIpOwotCi0gIC8qIEZpcnN0IHBhc3Mgb3ZlciBkYXRhIGNvbXB1dGVzIHZhcmlvdXMgdGhpbmdzLiAgKi8KLSAgbWF4X3ZhbCA9IDA7Ci0gIHRvdGFsID0gMDsKLSAgbWF4X25hbWVfbGVuID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IENQVV9NQVhfSU5TTlMgKGNwdSk7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gKCpDUFVfSU5TTl9OQU1FIChjcHUpKSAoY3B1LCBpKTsKLQotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQljb250aW51ZTsKLSAgICAgIHRvdGFsICs9IFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldOwotICAgICAgaWYgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldID4gbWF4X3ZhbCkKLQltYXhfdmFsID0gUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSBbaV07Ci0gICAgICBuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChuID4gbWF4X25hbWVfbGVuKQotCW1heF9uYW1lX2xlbiA9IG47Ci0gICAgfQotICAvKiBzZXQgdGhlIHRvdGFsIGluc24gY291bnQsIGluIGNhc2UgY2xpZW50IGlzIGJlaW5nIGxhenkgKi8KLSAgaWYgKCEgUFJPRklMRV9UT1RBTF9JTlNOX0NPVU5UIChkYXRhKSkKLSAgICBQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKGRhdGEpID0gdG90YWw7Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIFRvdGFsOiAlcyBpbnNuc1xuIiwgQ09NTUFTICh0b3RhbCkpOwotCi0gIGlmICh2ZXJib3NlICYmIG1heF92YWwgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb3cgd2UgY2FuIHByaW50IHRoZSBoaXN0b2dyYW0uICAqLwotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IENQVV9NQVhfSU5TTlMgKGNwdSk7ICsraSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gKCpDUFVfSU5TTl9OQU1FIChjcHUpKSAoY3B1LCBpKTsKLQotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSBbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICAgJSpzOiAlKnM6ICIsCi0JCQkgICAgIG1heF9uYW1lX2xlbiwgbmFtZSwKLQkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAotCQkJICAgICBDT01NQVMgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldKSk7Ci0JICAgICAgc2ltX3Byb2ZpbGVfcHJpbnRfYmFyIChzZCwgUFJPRklMRV9ISVNUT0dSQU1fV0lEVEgsCi0JCQkJICAgICBQUk9GSUxFX0lOU05fQ09VTlQgKGRhdGEpIFtpXSwKLQkJCQkgICAgIG1heF92YWwpOwotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotfQotCi0jZW5kaWYKLQotI2lmIFdJVEhfUFJPRklMRV9NRU1PUllfUAotCi1zdGF0aWMgdm9pZAotcHJvZmlsZV9wcmludF9tZW1vcnkgKHNpbV9jcHUgKmNwdSwgaW50IHZlcmJvc2UpCi17Ci0gIHVuc2lnbmVkIGludCBpLCBuOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCwgdG90YWxfd3JpdGU7Ci0gIHVuc2lnbmVkIGludCBtYXhfdmFsLCBtYXhfbmFtZV9sZW47Ci0gIC8qIEZJWE1FOiBOZWVkIHRvIGFkZCBzbXAgc3VwcG9ydC4gICovCi0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICBjaGFyIGNvbW1hX2J1ZlsyMF07Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJNZW1vcnkgQWNjZXNzIFN0YXRpc3RpY3NcblxuIik7Ci0KLSAgLyogRmlyc3QgcGFzcyBvdmVyIGRhdGEgY29tcHV0ZXMgdmFyaW91cyB0aGluZ3MuICAqLwotICBtYXhfdmFsID0gdG90YWxfcmVhZCA9IHRvdGFsX3dyaXRlID0gbWF4X25hbWVfbGVuID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1PREVfVEFSR0VUX01BWDsgKytpKQotICAgIHsKLSAgICAgIHRvdGFsX3JlYWQgKz0gUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV07Ci0gICAgICB0b3RhbF93cml0ZSArPSBQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV07Ci0gICAgICBpZiAoUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV0gPiBtYXhfdmFsKQotCW1heF92YWwgPSBQUk9GSUxFX1JFQURfQ09VTlQgKGRhdGEpIFtpXTsKLSAgICAgIGlmIChQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV0gPiBtYXhfdmFsKQotCW1heF92YWwgPSBQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV07Ci0gICAgICBuID0gc3RybGVuIChNT0RFX05BTUUgKGkpKTsKLSAgICAgIGlmIChuID4gbWF4X25hbWVfbGVuKQotCW1heF9uYW1lX2xlbiA9IG47Ci0gICAgfQotCi0gIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgcmVhZDogICVzIGFjY2Vzc2VzXG4iLAotCQkgQ09NTUFTICh0b3RhbF9yZWFkKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICBUb3RhbCB3cml0ZTogJXMgYWNjZXNzZXNcbiIsCi0JCSBDT01NQVMgKHRvdGFsX3dyaXRlKSk7Ci0KLSAgaWYgKHZlcmJvc2UgJiYgbWF4X3ZhbCAhPSAwKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBOZWVkIHRvIHNlcGFyYXRlIGluc3RydWN0aW9uIGZldGNoZXMgZnJvbSBkYXRhIGZldGNoZXMKLQkgYXMgdGhlIGZvcm1lciBzd2FtcHMgdGhlIGxhdHRlci4gICovCi0gICAgICAvKiBOb3cgd2UgY2FuIHByaW50IHRoZSBoaXN0b2dyYW0uICAqLwotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE1PREVfVEFSR0VUX01BWDsgKytpKQotCXsKLQkgIGlmIChQUk9GSUxFX1JFQURfQ09VTlQgKGRhdGEpIFtpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICAlKnMgcmVhZDogICUqczogIiwKLQkJCSAgICAgbWF4X25hbWVfbGVuLCBNT0RFX05BTUUgKGkpLAotCQkJICAgICBtYXhfdmFsIDwgMTAwMDAgPyA1IDogMTAsCi0JCQkgICAgIENPTU1BUyAoUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV0pKTsKLQkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKLQkJCQkgICAgIFBST0ZJTEVfUkVBRF9DT1VOVCAoZGF0YSkgW2ldLAotCQkJCSAgICAgbWF4X3ZhbCk7Ci0JICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotCSAgICB9Ci0JICBpZiAoUFJPRklMRV9XUklURV9DT1VOVCAoZGF0YSkgW2ldICE9IDApCi0JICAgIHsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgICUqcyB3cml0ZTogJSpzOiAiLAotCQkJICAgICBtYXhfbmFtZV9sZW4sIE1PREVfTkFNRSAoaSksCi0JCQkgICAgIG1heF92YWwgPCAxMDAwMCA/IDUgOiAxMCwKLQkJCSAgICAgQ09NTUFTIChQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV0pKTsKLQkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKLQkJCQkgICAgIFBST0ZJTEVfV1JJVEVfQ09VTlQgKGRhdGEpIFtpXSwKLQkJCQkgICAgIG1heF92YWwpOwotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotfQotCi0jZW5kaWYKLQotI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKLQotc3RhdGljIHZvaWQKLXByb2ZpbGVfcHJpbnRfY29yZSAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKLXsKLSAgdW5zaWduZWQgaW50IHRvdGFsOwotICB1bnNpZ25lZCBpbnQgbWF4X3ZhbDsKLSAgLyogRklYTUU6IE5lZWQgdG8gYWRkIHNtcCBzdXBwb3J0LiAgKi8KLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIGNoYXIgY29tbWFfYnVmWzIwXTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIkNPUkUgU3RhdGlzdGljc1xuXG4iKTsKLQotICAvKiBGaXJzdCBwYXNzIG92ZXIgZGF0YSBjb21wdXRlcyB2YXJpb3VzIHRoaW5ncy4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBtYXA7Ci0gICAgdG90YWwgPSAwOwotICAgIG1heF92YWwgPSAwOwotICAgIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspCi0gICAgICB7Ci0JdG90YWwgKz0gUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXTsKLQlpZiAoUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXSA+IG1heF92YWwpCi0JICBtYXhfdmFsID0gUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWw6ICAlcyBhY2Nlc3Nlc1xuIiwKLQkJIENPTU1BUyAodG90YWwpKTsKLQotICBpZiAodmVyYm9zZSAmJiBtYXhfdmFsICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbWFwOwotICAgICAgLyogTm93IHdlIGNhbiBwcmludCB0aGUgaGlzdG9ncmFtLiAgKi8KLSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLSAgICAgIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspCi0JewotCSAgaWYgKFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0gIT0gMCkKLQkgICAgewotCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiJTEwczoiLCBtYXBfdG9fc3RyIChtYXApKTsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiUqczogIiwKLQkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAotCQkJICAgICBDT01NQVMgKFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0pKTsKLQkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKLQkJCQkgICAgIFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0sCi0JCQkJICAgICBtYXhfdmFsKTsKLQkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKLX0KLQotI2VuZGlmCi0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotCi1zdGF0aWMgdm9pZAotcHJvZmlsZV9wcmludF9tb2RlbCAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIHVuc2lnbmVkIGxvbmcgY3RpX3N0YWxsX2N5Y2xlcyA9IFBST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyAoZGF0YSk7Ci0gIHVuc2lnbmVkIGxvbmcgbG9hZF9zdGFsbF9jeWNsZXMgPSBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTIChkYXRhKTsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbF9jeWNsZXMgPSBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyAoZGF0YSk7Ci0gIGNoYXIgY29tbWFfYnVmWzIwXTsKLQotICBzaW1faW9fcHJpbnRmIChzZCwgIk1vZGVsICVzIFRpbWluZyBJbmZvcm1hdGlvbiIsCi0JCSBNT0RFTF9OQU1FIChDUFVfTU9ERUwgKGNwdSkpKTsKLSNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCi0gIGlmIChQUk9GSUxFX1JBTkdFIChkYXRhKS0+cmFuZ2VzKQotICAgIHNpbV9pb19wcmludGYgKHNkLCAiIChmb3Igc2VsZWN0ZWQgYWRkcmVzcyByYW5nZShzKSkiKTsKLSNlbmRpZgotICBzaW1faW9fcHJpbnRmIChzZCwgIlxuXG4iKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICUtKnMgJXNcbiIsCi0JCSBQUk9GSUxFX0xBQkVMX1dJRFRILCAiVGFrZW4gYnJhbmNoZXM6IiwKLQkJIENPTU1BUyAoUFJPRklMRV9NT0RFTF9UQUtFTl9DT1VOVCAoZGF0YSkpKTsKLSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICUtKnMgJXNcbiIsCi0JCSBQUk9GSUxFX0xBQkVMX1dJRFRILCAiVW50YWtlbiBicmFuY2hlczoiLAotCQkgQ09NTUFTIChQUk9GSUxFX01PREVMX1VOVEFLRU5fQ09VTlQgKGRhdGEpKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG4iLAotCQkgUFJPRklMRV9MQUJFTF9XSURUSCwgIkN5Y2xlcyBzdGFsbGVkIGR1ZSB0byBicmFuY2hlczoiLAotCQkgQ09NTUFTIChjdGlfc3RhbGxfY3ljbGVzKSk7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG4iLAotCQkgUFJPRklMRV9MQUJFTF9XSURUSCwgIkN5Y2xlcyBzdGFsbGVkIGR1ZSB0byBsb2FkczoiLAotCQkgQ09NTUFTIChsb2FkX3N0YWxsX2N5Y2xlcykpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIiAgJS0qcyAlc1xuIiwKLQkJIFBST0ZJTEVfTEFCRUxfV0lEVEgsICJUb3RhbCBjeWNsZXMgKCphcHByb3hpbWF0ZSopOiIsCi0JCSBDT01NQVMgKHRvdGFsX2N5Y2xlcykpOwotICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1zaW1fcHJvZmlsZV9wcmludF9iYXIgKFNJTV9ERVNDIHNkLCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbWF4X3ZhbCkKLXsKLSAgdW5zaWduZWQgaW50IGksIGNvdW50OwotCi0gIGNvdW50ID0gKChkb3VibGUpIHZhbCAvIChkb3VibGUpIG1heF92YWwpICogKGRvdWJsZSkgd2lkdGg7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0gICAgc2ltX2lvX3ByaW50ZiAoc2QsICIqIik7Ci19Ci0KLS8qIFByaW50IHRoZSBzaW11bGF0b3IncyBleGVjdXRpb24gc3BlZWQgZm9yIENQVS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9maWxlX3ByaW50X3NwZWVkIChzaW1fY3B1ICpjcHUpCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICB1bnNpZ25lZCBsb25nIG1pbGxpc2Vjb25kcyA9IHNpbV9ldmVudHNfZWxhcHNlZF90aW1lIChzZCk7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWwgPSBQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKGRhdGEpOwotICBjaGFyIGNvbW1hX2J1ZlsyMF07Ci0KLSAgc2ltX2lvX3ByaW50ZiAoc2QsICJTaW11bGF0b3IgRXhlY3V0aW9uIFNwZWVkXG5cbiIpOwotCi0gIGlmICh0b3RhbCAhPSAwKQotICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBUb3RhbCBpbnN0cnVjdGlvbnM6ICAgJXNcbiIsIENPTU1BUyAodG90YWwpKTsKLQotICBpZiAobWlsbGlzZWNvbmRzIDwgMTAwMCkKLSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgZXhlY3V0aW9uIHRpbWU6IDwgMSBzZWNvbmRcblxuIik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgcHJpbnRpbmcgb2YgdGhlIHRpbWUgcm91bmRlZCB0byAyIGRlY2ltYWwgcGxhY2VzIG1ha2VzIHRoZSBzcGVlZAotCSBjYWxjdWxhdGlvbiBzZWVtIGluY29ycmVjdCBbZXZlbiB0aG91Z2ggaXQgaXMgY29ycmVjdF0uICBTbyByb3VuZAotCSBNSUxMSVNFQ09ORFMgZmlyc3QuIFRoaXMgY2FuIG1hcmdpbmFsbHkgYWZmZWN0IHRoZSByZXN1bHQsIGJ1dCBpdCdzCi0JIGJldHRlciB0aGF0IHRoZSB1c2VyIG5vdCBwZXJjZWl2ZSB0aGVyZSdzIGEgbWF0aCBlcnJvci4gICovCi0gICAgICBkb3VibGUgc2VjcyA9IChkb3VibGUpIG1pbGxpc2Vjb25kcyAvIDEwMDA7Ci0gICAgICBzZWNzID0gKChkb3VibGUpICh1bnNpZ25lZCBsb25nKSAoc2VjcyAqIDEwMCArIC41KSkgLyAxMDA7Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgZXhlY3V0aW9uIHRpbWU6ICUuMmYgc2Vjb25kc1xuIiwgc2Vjcyk7Ci0gICAgICAvKiBEb24ndCBjb25mdXNlIHRoaW5ncyB3aXRoIGRhdGEgdGhhdCBpc24ndCB1c2VmdWwuCi0JIElmIHdlIHJhbiBmb3IgbGVzcyB0aGFuIDIgc2Vjb25kcywgb25seSB1c2UgdGhlIGRhdGEgaWYgd2UKLQkgZXhlY3V0ZWQgbW9yZSB0aGFuIDEwMCwwMDAgaW5zbnMuICAqLwotICAgICAgaWYgKHNlY3MgPj0gMiB8fCB0b3RhbCA+PSAxMDAwMDApCi0Jc2ltX2lvX3ByaW50ZiAoc2QsICIgIFNpbXVsYXRvciBzcGVlZDogICAgICAlcyBpbnNucy9zZWNvbmRcblxuIiwKLQkJICAgICAgIENPTU1BUyAoKHVuc2lnbmVkIGxvbmcpICgoZG91YmxlKSB0b3RhbCAvIHNlY3MpKSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBzZWxlY3RlZCBhZGRyZXNzIHJhbmdlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9maWxlX3ByaW50X2FkZHJfcmFuZ2VzIChzaW1fY3B1ICpjcHUpCi17Ci0gIEFERFJfU1VCUkFOR0UgKmFzciA9IFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLT5yYW5nZXM7Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotCi0gIGlmIChhc3IpCi0gICAgewotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJTZWxlY3RlZCBhZGRyZXNzIHJhbmdlc1xuXG4iKTsKLSAgICAgIHdoaWxlIChhc3IgIT0gTlVMTCkKLQl7Ci0JICBzaW1faW9fcHJpbnRmIChzZCwgIiAgMHglbHggLSAweCVseFxuIiwKLQkJCSAobG9uZykgYXNyLT5zdGFydCwgKGxvbmcpIGFzci0+ZW5kKTsKLQkgIGFzciA9IGFzci0+bmV4dDsKLQl9Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Ci0gICAgfQotfQotCi0vKiBUb3AgbGV2ZWwgZnVuY3Rpb24gdG8gcHJpbnQgYWxsIHN1bW1hcnkgcHJvZmlsZSBpbmZvcm1hdGlvbi4KLSAgIEl0IGlzIFtjdXJyZW50bHldIGludGVuZGVkIHRoYXQgYWxsIHN1Y2ggZGF0YSBpcyBwcmludGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0gICBJJ2QgcmF0aGVyIGtlZXAgaXQgYWxsIGluIG9uZSBwbGFjZSBmb3Igbm93LiAgVG8gdGhhdCBlbmQsIE1JU0NfQ1BVIGFuZAotICAgTUlTQyBhcmUgY2FsbGJhY2tzIHVzZWQgdG8gcHJpbnQgYW55IG1pc2NlbGxhbmVvdXMgZGF0YS4KLQotICAgT25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgdXNlciBvcHRpb24gdGhhdCBhbGxvd3MgcHJpbnRpbmcgYnkgdHlwZSBvciBieSBjcHUKLSAgIChpLmUuIHByaW50IGFsbCBpbnNuIGRhdGEgZm9yIGVhY2ggY3B1IGZpcnN0LCBvciBwcmludCBkYXRhIGNwdSBieSBjcHUpLgotICAgVGhpcyBtYXkgYmUgYSBjYXNlIG9mIGZlYXR1cml0aXMgc28gaXQncyBjdXJyZW50bHkgbGVmdCBvdXQuCi0KLSAgIE5vdGUgdGhhdCByZXN1bHRzIGFyZSBpbmRlbnRlZCB0d28gc3BhY2VzIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbQotICAgc2VjdGlvbiB0aXRsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcHJvZmlsZV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpCi17Ci0gIGludCBpLGM7Ci0gIGludCBwcmludF90aXRsZV9wID0gMDsKLQotICAvKiBPbmx5IHByaW50IHRoZSB0aXRsZSBpZiBzb21lIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgKi8KLSAgLyogPz8/IFdoeSBkb24ndCB3ZSBqdXN0IGV4aXQgaWYgbm8gZGF0YSBjb2xsZWN0ZWQ/ICAqLwotICAvKiBGSVhNRTogSWYgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGNhbiBiZSBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLAotICAgICB0aGVuIE1BWF9OUl9QUk9DRVNTT1JTIHdpbGwgbmVlZCB0byB0YWtlIGFuIGFyZ3VtZW50IG9mIGBzZCcuICAqLwotCi0gIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQotICAgIHsKLSAgICAgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGMpOwotICAgICAgUFJPRklMRV9EQVRBICpkYXRhID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytpKQotCWlmIChQUk9GSUxFX0ZMQUdTIChkYXRhKSBbaV0pCi0JICBwcmludF90aXRsZV9wID0gMTsKLSAgICAgIC8qIE9uZSBjb3VsZCBicmVhayBvdXQgZWFybHkgaWYgcHJpbnRfdGl0bGVfcCBpcyBzZXQuICAqLwotICAgIH0KLSAgaWYgKHByaW50X3RpdGxlX3ApCi0gICAgc2ltX2lvX3ByaW50ZiAoc2QsICJTdW1tYXJ5IHByb2ZpbGluZyByZXN1bHRzOlxuXG4iKTsKLQotICAvKiBMb29wLCBjcHUgYnkgY3B1LCBwcmludGluZyByZXN1bHRzLiAgKi8KLQotICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKLSAgICB7Ci0gICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjKTsKLSAgICAgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0KLSAgICAgIGlmIChNQVhfTlJfUFJPQ0VTU09SUyA+IDEKLQkgICYmICgwCi0jaWYgV0lUSF9QUk9GSUxFX0lOU05fUAotCSAgICAgIHx8IFBST0ZJTEVfRkxBR1MgKGRhdGEpIFtQUk9GSUxFX0lOU05fSURYXQotI2VuZGlmCi0jaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCi0JICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTUVNT1JZX0lEWF0KLSNlbmRpZgotI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKLQkgICAgICB8fCBQUk9GSUxFX0ZMQUdTIChkYXRhKSBbUFJPRklMRV9DT1JFX0lEWF0KLSNlbmRpZgotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0JICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTU9ERUxfSURYXQotI2VuZGlmCi0jaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QICYmIFdJVEhfU0NBQ0hFCi0JICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0KLSNlbmRpZgotI2lmIFdJVEhfUFJPRklMRV9QQ19QCi0JICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfUENfSURYXQotI2VuZGlmCi0JICAgICAgKSkKLQl7Ci0JICBzaW1faW9fcHJpbnRmIChzZCwgIkNQVSAlZFxuXG4iLCBjKTsKLQl9Ci0KLSNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCi0gICAgICBpZiAocHJpbnRfdGl0bGVfcAotCSAgJiYgKFBST0ZJTEVfSU5TTl9QIChjcHUpCi0JICAgICAgfHwgUFJPRklMRV9NT0RFTF9QIChjcHUpKSkKLQlwcm9maWxlX3ByaW50X2FkZHJfcmFuZ2VzIChjcHUpOwotI2VuZGlmCi0KLSNpZiBXSVRIX1BST0ZJTEVfSU5TTl9QCi0gICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfSU5TTl9JRFhdKQotCXByb2ZpbGVfcHJpbnRfaW5zbiAoY3B1LCB2ZXJib3NlKTsKLSNlbmRpZgotCi0jaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCi0gICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTUVNT1JZX0lEWF0pCi0JcHJvZmlsZV9wcmludF9tZW1vcnkgKGNwdSwgdmVyYm9zZSk7Ci0jZW5kaWYKLQotI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKLSAgICAgIGlmIChQUk9GSUxFX0ZMQUdTIChkYXRhKSBbUFJPRklMRV9DT1JFX0lEWF0pCi0JcHJvZmlsZV9wcmludF9jb3JlIChjcHUsIHZlcmJvc2UpOwotI2VuZGlmCi0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAgICAgaWYgKFBST0ZJTEVfRkxBR1MgKGRhdGEpIFtQUk9GSUxFX01PREVMX0lEWF0pCi0JcHJvZmlsZV9wcmludF9tb2RlbCAoY3B1LCB2ZXJib3NlKTsKLSNlbmRpZgotCi0jaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QICYmIFdJVEhfU0NBQ0hFCi0gICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0pCi0Jc2NhY2hlX3ByaW50X3Byb2ZpbGUgKGNwdSwgdmVyYm9zZSk7Ci0jZW5kaWYKLQotI2lmIFdJVEhfUFJPRklMRV9QQ19QCi0gICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfUENfSURYXSkKLQlwcm9maWxlX3ByaW50X3BjIChjcHUsIHZlcmJvc2UpOwotI2VuZGlmCi0KLSAgICAgIC8qIFByaW50IGNwdS1zcGVjaWZpYyBkYXRhIGJlZm9yZSB0aGUgZXhlY3V0aW9uIHNwZWVkLiAgKi8KLSAgICAgIGlmIChQUk9GSUxFX0lORk9fQ1BVX0NBTExCQUNLIChkYXRhKSAhPSBOVUxMKQotCVBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0sgKGRhdGEpIChjcHUsIHZlcmJvc2UpOwotCi0gICAgICAvKiBBbHdheXMgdHJ5IHRvIHByaW50IGV4ZWN1dGlvbiB0aW1lIGFuZCBzcGVlZC4gICovCi0gICAgICBpZiAodmVyYm9zZQotCSAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfSU5TTl9JRFhdKQotCXByb2ZpbGVfcHJpbnRfc3BlZWQgKGNwdSk7Ci0gICAgfQotCi0gIC8qIEZpbmFsbHkgcHJpbnQgbm9uLWNwdSBzcGVjaWZpYyBtaXNjZWxsYW5lb3VzIGRhdGEuICAqLwotICBpZiAoU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLIChzZCkpCi0gICAgU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLIChzZCkgKHNkLCB2ZXJib3NlKTsKLQotfQotDAotLyogSW5zdGFsbCBwcm9maWxpbmcgc3VwcG9ydCBpbiB0aGUgc2ltdWxhdG9yLiAgKi8KLQotU0lNX1JDCi1wcm9maWxlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBpbnQgaTsKLQotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHByb2ZpbGVfb3B0aW9ucyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotICAgIG1lbXNldCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpLCAwLAotCSAgICBzaXplb2YgKCogQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpKSk7Ci0jaWYgV0lUSF9QUk9GSUxFX0lOU05fUAotICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9pbnNuX2luaXQpOwotI2VuZGlmCi0jaWYgV0lUSF9QUk9GSUxFX1BDX1AKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgcHJvZmlsZV9wY191bmluc3RhbGwpOwotICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9wY19pbml0KTsKLSNlbmRpZgotICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9pbml0KTsKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgcHJvZmlsZV91bmluc3RhbGwpOwotICBzaW1fbW9kdWxlX2FkZF9pbmZvX2ZuIChzZCwgcHJvZmlsZV9pbmZvKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotc3RhdGljIFNJTV9SQwotcHJvZmlsZV9pbml0IChTSU1fREVTQyBzZCkKLXsKLSNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCi0gIC8qIENoZWNrIGlmIGEgcmFuZ2UgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGhvdXQgc3BlY2lmeWluZyB3aGF0IHRvCi0gICAgIGNvbGxlY3QuICAqLwotICB7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKLSAgICAgIHsKLQlzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKLQotCWlmIChBRERSX1JBTkdFX1JBTkdFUyAoUFJPRklMRV9SQU5HRSAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkpCi0JICAgICYmICEgKFBST0ZJTEVfSU5TTl9QIChjcHUpCi0JCSAgfHwgUFJPRklMRV9NT0RFTF9QIChjcHUpKSkKLQkgIHsKLQkgICAgc2ltX2lvX2VwcmludGZfY3B1IChjcHUsICJQcm9maWxpbmcgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgd2l0aG91dCAtLXByb2ZpbGUtaW5zbiBvciAtLXByb2ZpbGUtbW9kZWwuXG4iKTsKLQkgICAgc2ltX2lvX2VwcmludGZfY3B1IChjcHUsICJBZGRyZXNzIHJhbmdlIGlnbm9yZWQuXG4iKTsKLQkgICAgc2ltX2FkZHJfcmFuZ2VfZGVsZXRlIChQUk9GSUxFX1JBTkdFIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSwKLQkJCQkgICAwLCB+IChhZGRyZXNzX3dvcmQpIDApOwotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1zdGF0aWMgdm9pZAotcHJvZmlsZV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBpbnQgaSxqOwotCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotICAgIHsKLSAgICAgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGkpOwotICAgICAgUFJPRklMRV9EQVRBICpkYXRhID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKLQotICAgICAgaWYgKFBST0ZJTEVfRklMRSAoZGF0YSkgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgY3B1cyBpcyBnb2luZyB0byB0aGUgc2FtZSBmaWxlLAotCSAgICAgYXZvaWQgY2xvc2luZyB0aGUgZmlsZSB0d2ljZS4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKQotCSAgICBpZiAoUFJPRklMRV9GSUxFIChDUFVfUFJPRklMRV9EQVRBIChTVEFURV9DUFUgKHNkLCBqKSkpCi0JCT09IFBST0ZJTEVfRklMRSAoZGF0YSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaSA9PSBqKQotCSAgICBmY2xvc2UgKFBST0ZJTEVfRklMRSAoZGF0YSkpOwotCX0KLQotICAgICAgaWYgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgIT0gTlVMTCkKLQl6ZnJlZSAoUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tcHJvZmlsZS5oIGIvc2ltL2NvbW1vbi9zaW0tcHJvZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZlODUwLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLXByb2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKiBQcm9maWxlIGhlYWRlciBmb3Igc2ltdWxhdG9ycyB1c2luZyBjb21tb24gZnJhbWV3b3JrLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTSU1fUFJPRklMRV9ICi0jZGVmaW5lIFNJTV9QUk9GSUxFX0gKLQotI2lmbmRlZiBXSVRIX1BST0ZJTEUKLUVycm9yLCBXSVRIX1BST0ZJTEUgbm90IGRlZmluZWQuCi0jZW5kaWYKLQotLyogU3RhbmRhcmQgcHJvZmlsYWJsZSBlbnRpdGllcy4gICovCi0KLWVudW0gewotICAvKiBQcm9maWxlIGluc24gdXNhZ2UuICAqLwotICBQUk9GSUxFX0lOU05fSURYID0gMSwKLQotICAvKiBQcm9maWxlIG1lbW9yeSB1c2FnZS4gICovCi0gIFBST0ZJTEVfTUVNT1JZX0lEWCwKLQotICAvKiBQcm9maWxlIHRoZSBjcHUgbW9kZWwgKGN5Y2xlcywgZXRjLikuICAqLwotICBQUk9GSUxFX01PREVMX0lEWCwKLQotICAvKiBQcm9maWxlIHRoZSBzaW11bGF0b3IncyBleGVjdXRpb24gY2FjaGUuICAqLwotICBQUk9GSUxFX1NDQUNIRV9JRFgsCi0KLSAgLyogUHJvZmlsZSB0aGUgUEMuICAqLwotICBQUk9GSUxFX1BDX0lEWCwKLQotICAvKiBQcm9maWxlIHNpbS1jb3JlLmMgc3R1ZmYuICAqLwotICAvKiA/Pz8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBQUk9GSUxFX01FTU9SWV9JRFggaXMgLi4uID8gICovCi0gIFBST0ZJTEVfQ09SRV9JRFgsCi0KLSAgLyogU2ltdWxhdG9yIHNwZWNpZmljIHByb2ZpbGUgYml0cyBiZWdpbiBoZXJlLiAgKi8KLSAgUFJPRklMRV9ORVhUX0lEWAotfTsKLQotLyogTWF4aW11bSBudW1iZXIgb2YgcHJvZmlsYWJsZSBlbnRpdGllcy4gICovCi0jaWZuZGVmIE1BWF9QUk9GSUxFX1ZBTFVFUwotI2RlZmluZSBNQVhfUFJPRklMRV9WQUxVRVMgMzIKLSNlbmRpZgotCi0vKiBUaGUgLXAgb3B0aW9uIG9ubHkgcHJpbnRzIHVzZWZ1bCB2YWx1ZXMuICBJdCdzIGVhc3kgdG8gdHlwZSBhbmQgc2hvdWxkbid0Ci0gICBzcGxhdCBvbiB0aGUgc2NyZWVuIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIHN1biBtYWtpbmcgbm90aGluZyBlYXN5IHRvCi0gICBmaW5kLiAgKi8KLSNkZWZpbmUgUFJPRklMRV9VU0VGVUxfTUFTSyBcCi0oKDEgPDwgUFJPRklMRV9JTlNOX0lEWCkgXAotIHwgKDEgPDwgUFJPRklMRV9NRU1PUllfSURYKSBcCi0gfCAoMSA8PCBQUk9GSUxFX01PREVMX0lEWCkgXAotIHwgKDEgPDwgUFJPRklMRV9DT1JFX0lEWCkpCi0KLS8qIFV0aWxpdHkgdG8gc2V0IHByb2ZpbGUgb3B0aW9ucy4gICovCi1TSU1fUkMgc2V0X3Byb2ZpbGVfb3B0aW9uX21hc2sgKFNJTV9ERVNDIHNkXywgY29uc3QgY2hhciAqbmFtZV8sIGludCBtYXNrXywKLQkJCQljb25zdCBjaGFyICphcmdfKTsKLQotLyogVXRpbGl0eSB0byBwYXJzZSBhIC0tcHJvZmlsZS08Zm9vPiBvcHRpb24uICAqLwotLyogPz8/IE9uIHRoZSBvbmUgaGFuZCBhbGwgY2FsbHMgY291bGQgYmUgY29uZmluZWQgdG8gc2ltLXByb2ZpbGUuYywgYnV0Ci0gICBvbiB0aGUgb3RoZXIgaGFuZCBrZWVwaW5nIGEgbW9kdWxlJ3MgcHJvZmlsaW5nIG9wdGlvbiB3aXRoIHRoZSBtb2R1bGUncwotICAgc291cmNlIGlzIGNsZWFuZXIuICAgKi8KLQotU0lNX1JDIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKFNJTV9ERVNDIHNkXywgY29uc3QgY2hhciAqbmFtZV8sIGludCBpZHhfLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmFyZ18pOwotDAotLyogTWFza3Mgc28gV0lUSF9QUk9GSUxFIGNhbiBoYXZlIHN5bWJvbGljIHZhbHVlcy4KLSAgIFRoZSBjYXNlIGNob2ljZSBoZXJlIGlzIG9uIHB1cnBvc2UuICBUaGUgbG93ZXJjYXNlIHBhcnRzIGFyZSBhcmdzIHRvCi0gICAtLXdpdGgtcHJvZmlsZS4gICovCi0jZGVmaW5lIFBST0ZJTEVfaW5zbiAgICgxIDw8IFBST0ZJTEVfSU5TTl9JRFgpCi0jZGVmaW5lIFBST0ZJTEVfbWVtb3J5ICgxIDw8IFBST0ZJTEVfTUVNT1JZX0lEWCkKLSNkZWZpbmUgUFJPRklMRV9tb2RlbCAgKDEgPDwgUFJPRklMRV9NT0RFTF9JRFgpCi0jZGVmaW5lIFBST0ZJTEVfc2NhY2hlICgxIDw8IFBST0ZJTEVfU0NBQ0hFX0lEWCkKLSNkZWZpbmUgUFJPRklMRV9wYyAgICAgKDEgPDwgUFJPRklMRV9QQ19JRFgpCi0jZGVmaW5lIFBST0ZJTEVfY29yZSAgICgxIDw8IFBST0ZJTEVfQ09SRV9JRFgpCi0KLS8qIFByZXByb2Nlc3NvciBtYWNyb3MgdG8gc2ltcGxpZnkgdGVzdHMgb2YgV0lUSF9QUk9GSUxFLiAgKi8KLSNkZWZpbmUgV0lUSF9QUk9GSUxFX0lOU05fUCAoV0lUSF9QUk9GSUxFICYgUFJPRklMRV9pbnNuKQotI2RlZmluZSBXSVRIX1BST0ZJTEVfTUVNT1JZX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfbWVtb3J5KQotI2RlZmluZSBXSVRIX1BST0ZJTEVfTU9ERUxfUCAoV0lUSF9QUk9GSUxFICYgUFJPRklMRV9tb2RlbCkKLSNkZWZpbmUgV0lUSF9QUk9GSUxFX1NDQUNIRV9QIChXSVRIX1BST0ZJTEUgJiBQUk9GSUxFX3NjYWNoZSkKLSNkZWZpbmUgV0lUSF9QUk9GSUxFX1BDX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfcGMpCi0jZGVmaW5lIFdJVEhfUFJPRklMRV9DT1JFX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfY29yZSkKLQotLyogSWYgTUFYX1RBUkdFVF9NT0RFUyBpc24ndCBkZWZpbmVkLCB3ZSBjYW4ndCBkbyBtZW1vcnkgcHJvZmlsaW5nLgotICAgPz8/IEl0IGlzIGludGVuZGVkIHRoYXQgdGhpcyBpcyBhIHRlbXBvcmFyeSBvY2N1cmVuY2UuICBOb3JtYWxseQotICAgTUFYX1RBUkdFVF9NT0RFUyBpcyBkZWZpbmVkLiAgKi8KLSNpZm5kZWYgTUFYX1RBUkdFVF9NT0RFUwotI3VuZGVmIFdJVEhfUFJPRklMRV9NRU1PUllfUAotI2RlZmluZSBXSVRIX1BST0ZJTEVfTUVNT1JZX1AgMAotI2VuZGlmCi0KLS8qIE9ubHkgYnVpbGQgTU9ERUwgY29kZSB3aGVuIHRoZSB0YXJnZXQgc2ltdWxhdG9yIGhhcyBzdXBwb3J0IGZvciBpdCAqLwotI2lmbmRlZiBTSU1fSEFWRV9NT0RFTAotI3VuZGVmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0jZGVmaW5lIFdJVEhfUFJPRklMRV9NT0RFTF9QIDAKLSNlbmRpZgotCi0vKiBQcm9maWxpbmcgaW5zdGFsbCBoYW5kbGVyLiAgKi8KLU1PRFVMRV9JTlNUQUxMX0ZOIHByb2ZpbGVfaW5zdGFsbDsKLQotLyogT3V0cHV0IGZvcm1hdCBtYWNyb3MuICAqLwotI2lmbmRlZiBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSAotI2RlZmluZSBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCA0MAotI2VuZGlmCi0jaWZuZGVmIFBST0ZJTEVfTEFCRUxfV0lEVEgKLSNkZWZpbmUgUFJPRklMRV9MQUJFTF9XSURUSCAzMgotI2VuZGlmCi0MCi0vKiBDYWxsYmFja3MgZm9yIGludGVybmFsIHByb2ZpbGVfaW5mby4KLSAgIFRoZSBjYWxsYmFja3MgbWF5IGJlIE5VTEwgbWVhbmluZyB0aGVyZSBpc24ndCBvbmUuCi0gICBOb3RlIHRoYXQgcmVzdWx0cyBhcmUgaW5kZW50ZWQgdHdvIHNwYWNlcyB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20KLSAgIHNlY3Rpb24gdGl0bGVzLgotICAgSWYgbm9uLU5VTEwsIFBST0ZJTEVfQ0FMTEJBQ0sgaXMgY2FsbGVkIHRvIHByaW50IGV4dHJhIG5vbi1jcHUgcmVsYXRlZCBkYXRhLgotICAgSWYgbm9uLU5VTEwsIFBST0ZJTEVfQ1BVX0NBTExCQUNLIGlzIGNhbGxlZCB0byBwcmludCBleHRyYSBjcHUgcmVsYXRlZCBkYXRhLgotICAgKi8KLQotdHlwZWRlZiB2b2lkIChQUk9GSUxFX0lORk9fQ0FMTEJBQ0tfRk4pIChTSU1fREVTQywgaW50KTsKLXN0cnVjdCBfc2ltX2NwdTsgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KLXR5cGVkZWYgdm9pZCAoUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDS19GTikgKHN0cnVjdCBfc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSk7Ci0KLQwKLS8qIFN0cnVjdCBjb250YWluaW5nIG1vc3QgcHJvZmlsaW5nIGRhdGEuCi0gICBJdCBkb2Vzbid0IGNvbnRhaW4gYWxsIHByb2ZpbGluZyBkYXRhIGJlY2F1c2UgZm9yIGV4YW1wbGUgc2NhY2hlIGRhdGEKLSAgIGlzIGtlcHQgd2l0aCB0aGUgcmVzdCBvZiBzY2FjaGUgc3VwcG9ydC4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogR2xvYmFsIHN1bW1hcnkgb2YgYWxsIHRoZSBjdXJyZW50IHByb2ZpbGluZyBvcHRpb25zLiAgKi8KLSAgY2hhciBwcm9maWxlX2FueV9wOwotCi0gIC8qIEJvb2xlYW4gYXJyYXkgb2Ygc3BlY2lmaWVkIHByb2ZpbGluZyBmbGFncy4gICovCi0gIGNoYXIgcHJvZmlsZV9mbGFnc1tNQVhfUFJPRklMRV9WQUxVRVNdOwotI2RlZmluZSBQUk9GSUxFX0ZMQUdTKHApICgocCktPnByb2ZpbGVfZmxhZ3MpCi0KLSAgLyogVGhlIHRvdGFsIGluc24gY291bnQgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5LgotICAgICBJdCBpcyBhbHdheXMgY29tcHV0ZWQsIHJlZ2FyZGxlc3Mgb2YgaW5zbiBwcm9maWxpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIHRvdGFsX2luc25fY291bnQ7Ci0jZGVmaW5lIFBST0ZJTEVfVE9UQUxfSU5TTl9DT1VOVChwKSAoKHApLT50b3RhbF9pbnNuX2NvdW50KQotCi0jaWYgV0lUSF9QUk9GSUxFX0lOU05fUAotICB1bnNpZ25lZCBpbnQgKmluc25fY291bnQ7Ci0jZGVmaW5lIFBST0ZJTEVfSU5TTl9DT1VOVChwKSAoKHApLT5pbnNuX2NvdW50KQotI2VuZGlmCi0KLSNpZiBXSVRIX1BST0ZJTEVfTUVNT1JZX1AKLSAgdW5zaWduZWQgaW50IHJlYWRfY291bnRbTUFYX1RBUkdFVF9NT0RFU107Ci0jZGVmaW5lIFBST0ZJTEVfUkVBRF9DT1VOVChwKSAoKHApLT5yZWFkX2NvdW50KQotICB1bnNpZ25lZCBpbnQgd3JpdGVfY291bnRbTUFYX1RBUkdFVF9NT0RFU107Ci0jZGVmaW5lIFBST0ZJTEVfV1JJVEVfQ09VTlQocCkgKChwKS0+d3JpdGVfY291bnQpCi0jZW5kaWYKLQotI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKLSAgLyogQ291bnQgcmVhZC93cml0ZS9leGVjIGFjY2Vzc2VzIHNlcGFyYXRseS4gKi8KLSAgdW5zaWduZWQgaW50IGNvcmVfY291bnRbbnJfbWFwc107Ci0jZGVmaW5lIFBST0ZJTEVfQ09SRV9DT1VOVChwKSAoKHApLT5jb3JlX2NvdW50KQotI2VuZGlmCi0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiA/Pz8gUXVpY2sgaGFjayB1bnRpbCBtb3JlIGVsYWJvcmF0ZSBzY2hlbWUgaXMgZmluaXNoZWQuICAqLwotICAvKiBUb3RhbCBjeWNsZSBjb3VudCwgaW5jbHVkaW5nIHN0YWxscy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdG90YWxfY3ljbGVzOwotI2RlZmluZSBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyhwKSAoKHApLT50b3RhbF9jeWNsZXMpCi0gIC8qIFN0YWxscyBkdWUgdG8gYnJhbmNoZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGN0aV9zdGFsbF9jeWNsZXM7Ci0jZGVmaW5lIFBST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyhwKSAoKHApLT5jdGlfc3RhbGxfY3ljbGVzKQotICB1bnNpZ25lZCBsb25nIGxvYWRfc3RhbGxfY3ljbGVzOwotI2RlZmluZSBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTKHApICgocCktPmxvYWRfc3RhbGxfY3ljbGVzKQotICAvKiBOdW1iZXIgb2YgY3ljbGVzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHRvb2suICAqLwotICB1bnNpZ25lZCBsb25nIGN1cl9pbnNuX2N5Y2xlczsKLSNkZWZpbmUgUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMocCkgKChwKS0+Y3VyX2luc25fY3ljbGVzKQotCi0gIC8qIFRha2VuIGFuZCBub3QtdGFrZW4gYnJhbmNoZXMgKGFuZCBvdGhlciBjdGkncykuICAqLwotICB1bnNpZ25lZCBsb25nIHRha2VuX2NvdW50LCB1bnRha2VuX2NvdW50OwotI2RlZmluZSBQUk9GSUxFX01PREVMX1RBS0VOX0NPVU5UKHApICgocCktPnRha2VuX2NvdW50KQotI2RlZmluZSBQUk9GSUxFX01PREVMX1VOVEFLRU5fQ09VTlQocCkgKChwKS0+dW50YWtlbl9jb3VudCkKLSNlbmRpZgotCi0jaWYgV0lUSF9QUk9GSUxFX1BDX1AKLSAgLyogUEMgcHJvZmlsaW5nIGF0dGVtcHRzIHRvIGRldGVybWluZSBmdW5jdGlvbiB1c2FnZSBieSBzYW1wbGluZyB0aGUgUEMKLSAgICAgZXZlcnkgc28gbWFueSBpbnN0cnVjdGlvbnMuICAqLwotICB1bnNpZ25lZCBpbnQgcHJvZmlsZV9wY19mcmVxOwotI2RlZmluZSBQUk9GSUxFX1BDX0ZSRVEocCkgKChwKS0+cHJvZmlsZV9wY19mcmVxKQotICB1bnNpZ25lZCBpbnQgcHJvZmlsZV9wY19ucl9idWNrZXRzOwotI2RlZmluZSBQUk9GSUxFX1BDX05SX0JVQ0tFVFMocCkgKChwKS0+cHJvZmlsZV9wY19ucl9idWNrZXRzKQotICBhZGRyZXNzX3dvcmQgcHJvZmlsZV9wY19zdGFydDsKLSNkZWZpbmUgUFJPRklMRV9QQ19TVEFSVChwKSAoKHApLT5wcm9maWxlX3BjX3N0YXJ0KQotICBhZGRyZXNzX3dvcmQgcHJvZmlsZV9wY19lbmQ7Ci0jZGVmaW5lIFBST0ZJTEVfUENfRU5EKHApICgocCktPnByb2ZpbGVfcGNfZW5kKQotICB1bnNpZ25lZCBwcm9maWxlX3BjX3NoaWZ0OwotI2RlZmluZSBQUk9GSUxFX1BDX1NISUZUKHApICgocCktPnByb2ZpbGVfcGNfc2hpZnQpCi0jZGVmaW5lIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUocCkgKFBST0ZJTEVfUENfU0hJRlQgKHApID8gKDEgPDwgUFJPRklMRV9QQ19TSElGVCAocCkpIDogMCkKLSAgdW5zaWduZWQgKnByb2ZpbGVfcGNfY291bnQ7Ci0jZGVmaW5lIFBST0ZJTEVfUENfQ09VTlQocCkgKChwKS0+cHJvZmlsZV9wY19jb3VudCkKLSAgc2ltX2V2ZW50ICpwcm9maWxlX3BjX2V2ZW50OwotI2RlZmluZSBQUk9GSUxFX1BDX0VWRU5UKHApICgocCktPnByb2ZpbGVfcGNfZXZlbnQpCi0jZW5kaWYKLQotICAvKiBQcm9maWxlIG91dHB1dCBnb2VzIHRvIHRoaXMgb3Igc3RkZXJyIGlmIE5VTEwuCi0gICAgIFdlIGNhbid0IHN0b3JlIGBzdGRlcnInIGhlcmUgYXMgc3RkZXJyIGdvZXMgdGhyb3VnaCBhIGNhbGxiYWNrLiAgKi8KLSAgRklMRSAqcHJvZmlsZV9maWxlOwotI2RlZmluZSBQUk9GSUxFX0ZJTEUocCkgKChwKS0+cHJvZmlsZV9maWxlKQotCi0gIC8qIFdoZW4gcmVwb3J0aW5nIGEgcHJvZmlsZSBzdW1tYXJ5LCBob29rIHRvIGluY2x1ZGUgcGVyLXByb2Nlc3NvcgotICAgICB0YXJnZXQgc3BlY2lmaWMgcHJvZmlsZSBpbmZvcm1hdGlvbiAqLwotICBQUk9GSUxFX0lORk9fQ1BVX0NBTExCQUNLX0ZOICppbmZvX2NwdV9jYWxsYmFjazsKLSNkZWZpbmUgUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDSyhwKSAoKHApLT5pbmZvX2NwdV9jYWxsYmFjaykKLQotICAvKiBXaGVuIHJlcG9ydGluZyBhIHByb2ZpbGUgc3VtbWFyeSwgaG9vayB0byBpbmNsdWRlIGNvbW1vbiB0YXJnZXQKLSAgICAgc3BlY2lmaWMgcHJvZmlsZSBpbmZvcm1hdGlvbiAqLwotICBQUk9GSUxFX0lORk9fQ0FMTEJBQ0tfRk4gKmluZm9fY2FsbGJhY2s7Ci0jZGVmaW5lIFNUQVRFX1BST0ZJTEVfSU5GT19DQUxMQkFDSyhzZCkgXAotKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIDApKS0+aW5mb19jYWxsYmFjaykKLQotICAvKiBQcm9maWxlIHJhbmdlLgotICAgICA/Pz8gTm90IGFsbCBjcHUncyBzdXBwb3J0IHRoaXMuICAqLwotICBBRERSX1JBTkdFIHJhbmdlOwotI2RlZmluZSBQUk9GSUxFX1JBTkdFKHApICgmIChwKS0+cmFuZ2UpCi19IFBST0ZJTEVfREFUQTsKLQwKLS8qIFByZWRpY2F0ZXMuICAqLwotCi0jZGVmaW5lIENQVV9QUk9GSUxFX0ZMQUdTKGNwdSkgUFJPRklMRV9GTEFHUyAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRyYWNpbmcgb2YgSURYIGlzIGVuYWJsZWQgZm9yIENQVS4gICovCi0jZGVmaW5lIFBST0ZJTEVfUChjcHUsaWR4KSBcCi0oKFdJVEhfUFJPRklMRSAmICgxIDw8IChpZHgpKSkgIT0gMCBcCi0gJiYgQ1BVX1BST0ZJTEVfRkxBR1MgKGNwdSlbaWR4XSAhPSAwKQotCi0vKiBOb24temVybyBpZiAtLXByb2ZpbGUtPHh4eHg+IHdhcyBzcGVjaWZpZWQgZm9yIENQVS4gICovCi0jZGVmaW5lIFBST0ZJTEVfQU5ZX1AoY3B1KQkoKFdJVEhfUFJPRklMRSkgJiYgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSktPnByb2ZpbGVfYW55X3ApKQotI2RlZmluZSBQUk9GSUxFX0lOU05fUChjcHUpCVBST0ZJTEVfUCAoY3B1LCBQUk9GSUxFX0lOU05fSURYKQotI2RlZmluZSBQUk9GSUxFX01FTU9SWV9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfTUVNT1JZX0lEWCkKLSNkZWZpbmUgUFJPRklMRV9NT0RFTF9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfTU9ERUxfSURYKQotI2RlZmluZSBQUk9GSUxFX1NDQUNIRV9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfU0NBQ0hFX0lEWCkKLSNkZWZpbmUgUFJPRklMRV9QQ19QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfUENfSURYKQotI2RlZmluZSBQUk9GSUxFX0NPUkVfUChjcHUpCVBST0ZJTEVfUCAoY3B1LCBQUk9GSUxFX0NPUkVfSURYKQotDAotLyogVXNhZ2UgbWFjcm9zLiAgKi8KLQotI2lmIFdJVEhfUFJPRklMRV9JTlNOX1AKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9JTlNOKGNwdSwgcGMsIGluc25fbnVtKSBcCi1kbyB7IFwKLSAgaWYgKFBST0ZJTEVfSU5TTl9QIChjcHUpKSBcCi0gICAgKysgUFJPRklMRV9JTlNOX0NPVU5UIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSBbaW5zbl9udW1dOyBcCi19IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9JTlNOKGNwdSwgcGMsIGluc25fbnVtKQotI2VuZGlmIC8qICEgaW5zbiAqLwotCi0jaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCi0jZGVmaW5lIFBST0ZJTEVfQ09VTlRfUkVBRChjcHUsIGFkZHIsIG1vZGVfbnVtKSBcCi1kbyB7IFwKLSAgaWYgKFBST0ZJTEVfTUVNT1JZX1AgKGNwdSkpIFwKLSAgICArKyBQUk9GSUxFX1JFQURfQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpIFttb2RlX251bV07IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFBST0ZJTEVfQ09VTlRfV1JJVEUoY3B1LCBhZGRyLCBtb2RlX251bSkgXAotZG8geyBcCi0gIGlmIChQUk9GSUxFX01FTU9SWV9QIChjcHUpKSBcCi0gICAgKysgUFJPRklMRV9XUklURV9DT1VOVCAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkgW21vZGVfbnVtXTsgXAotfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIFBST0ZJTEVfQ09VTlRfUkVBRChjcHUsIGFkZHIsIG1vZGVfbnVtKQotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1dSSVRFKGNwdSwgYWRkciwgbW9kZV9udW0pCi0jZW5kaWYgLyogISBtZW1vcnkgKi8KLQotI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9DT1JFKGNwdSwgYWRkciwgc2l6ZSwgbWFwKSBcCi1kbyB7IFwKLSAgaWYgKFBST0ZJTEVfQ09SRV9QIChjcHUpKSBcCi0gICAgUFJPRklMRV9DT1JFX0NPVU5UIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSBbbWFwXSArPSAxOyBcCi19IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9DT1JFKGNwdSwgYWRkciwgc2l6ZSwgbWFwKQotI2VuZGlmIC8qICEgY29yZSAqLwotCi0vKiBNaXNjLiB1dGlsaXRpZXMuICAqLwotCi1leHRlcm4gdm9pZCBzaW1fcHJvZmlsZV9wcmludF9iYXIgKFNJTV9ERVNDLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLQotI2VuZGlmIC8qIFNJTV9QUk9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXJlYXNvbi5jIGIvc2ltL2NvbW1vbi9zaW0tcmVhc29uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDBkZjMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tcmVhc29uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBHZW5lcmljIHNpbXVsYXRvciBzdG9wX3JlYXNvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBzaW1fc3RvcF9yZWFzb24gKi8KLQotdm9pZAotc2ltX3N0b3BfcmVhc29uIChTSU1fREVTQyBzZCwgZW51bSBzaW1fc3RvcCAqcmVhc29uLCBpbnQgKnNpZ3JjKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBOVUxMOwotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBlbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgKnJlYXNvbiA9IGVuZ2luZS0+cmVhc29uOwotICBzd2l0Y2ggKCpyZWFzb24pCi0gICAgewotICAgIGNhc2Ugc2ltX2V4aXRlZCA6Ci0gICAgICAqc2lncmMgPSBlbmdpbmUtPnNpZ3JjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzaW1fc2lnbmFsbGVkIDoKLSAgICAgIC8qID8/PyBTZWUgdGhlIGNvbW1lbnQgYmVsb3cgY2FzZSBgc2ltX3NpZ25hbGxlZCcgaW4KLQkgZ2RiL3JlbW90ZS1zaW0uYzpnZGJzaW1fd2FpdC4KLQkgPz8/IENvbnNpZGVyIHRoZSBjYXNlIG9mIHRoZSB0YXJnZXQgcmVxdWVzdGluZyB0aGF0IGl0Ci0JIGtpbGwoMikgaXRzZWxmIHdpdGggU0lHTkFMLiAgVGhhdCBTSUdOQUwsIGJlaW5nIHRhcmdldAotCSBzcGVjaWZpYywgd2lsbCBub3QgY29ycmVzcG9uZCB0byBlaXRoZXIgb2YgdGhlIFNJTV9TSUdOQUwKLQkgZW51bSBub3IgdGhlIEhPU1RfU0lHTkFMLiAgQSBtYXBwaW5nIGZyb20gVEFSR0VUX1NJR05BTCB0bwotCSBIT1NUX1NJR05BTCBpcyBuZWVkZWQuICAqLwotICAgICAgKnNpZ3JjID0gc2ltX3NpZ25hbF90b19ob3N0IChzZCwgZW5naW5lLT5zaWdyYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNpbV9zdG9wcGVkIDoKLSAgICAgIC8qIFRoZSBnZGIvc2ltdWxhdG9yIGludGVyZmFjZSBjYWxscyBmb3IgdXMgdG8gcmV0dXJuIHRoZSBob3N0Ci0JIHZlcnNpb24gb2YgdGhlIHNpZ25hbCB3aGljaCBnZGIgdGhlbiBjb252ZXJ0cyBpbnRvIHRoZQotCSB0YXJnZXQncyB2ZXJzaW9uLiAgVGhpcyBpcyBvYnZpb3VzbHkgYSBiaXQgY2x1bXN5LiAgKi8KLSAgICAgICpzaWdyYyA9IHNpbV9zaWduYWxfdG9faG9zdCAoc2QsIGVuZ2luZS0+c2lncmMpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1yZWcuYyBiL3NpbS9jb21tb24vc2ltLXJlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjNkYzQxLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLXJlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogR2VuZXJpYyByZWdpc3RlciByZWFkL3dyaXRlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2ZldGNoX3JlZ2lzdGVyIGZvciBzaW11bGF0b3JzIHVzaW5nCi0gICBDUFVfUkVHX0ZFVENILgotICAgVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLwotLyogPz8/IE9idmlvdXNseSB0aGUgaW50ZXJmYWNlIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGhhbmRsZSBtdWx0aXBsZQotICAgY3B1cy4gICovCi0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChTSU1fREVTQyBzZCwgaW50IHJuLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpCi17Ci0gIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHJldHVybiAoKiBDUFVfUkVHX0ZFVENIIChjcHUpKSAoY3B1LCBybiwgYnVmLCBsZW5ndGgpOwotfQotCi0vKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHNpbV9mZXRjaF9yZWdpc3RlciBmb3Igc2ltdWxhdG9ycyB1c2luZwotICAgQ1BVX1JFR19GRVRDSC4KLSAgIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLS8qID8/PyBPYnZpb3VzbHkgdGhlIGludGVyZmFjZSBuZWVkcyB0byBiZSBleHRlbmRlZCB0byBoYW5kbGUgbXVsdGlwbGUKLSAgIGNwdXMuICAqLwotCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoU0lNX0RFU0Mgc2QsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQotewotICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLQotICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICByZXR1cm4gKCogQ1BVX1JFR19TVE9SRSAoY3B1KSkgKGNwdSwgcm4sIGJ1ZiwgbGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXJlc3VtZS5jIGIvc2ltL2NvbW1vbi9zaW0tcmVzdW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZjc1ZDUuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tcmVzdW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBHZW5lcmljIHNpbXVsYXRvciByZXN1bWUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEhhbHQgdGhlIHNpbXVsYXRvciBhZnRlciBqdXN0IG9uZSBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgdm9pZAotaGFzX3N0ZXBwZWQgKFNJTV9ERVNDIHNkLAotCSAgICAgdm9pZCAqZGF0YSkKLXsKLSAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotICBzaW1fZW5naW5lX2hhbHQgKHNkLCBOVUxMLCBOVUxMLCBOVUxMX0NJQSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKLX0KLQotCi0vKiBHZW5lcmljIHJlc3VtZSAtIGFzc3VtZXMgdGhlIGV4aXN0YW5jZSBvZiBzaW1fZW5naW5lX3J1biAqLwotCi12b2lkCi1zaW1fcmVzdW1lIChTSU1fREVTQyBzZCwKLQkgICAgaW50IHN0ZXAsCi0JICAgIGludCBzaWdnbmFsKQotewotICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKLSAgam1wX2J1ZiBidWY7Ci0gIGludCBqbXB2YWw7Ci0KLSAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOwotCi0gIC8qIHdlIG9ubHkgd2FudCB0byBiZSBzaW5nbGUgc3RlcHBpbmcgdGhlIHNpbXVsYXRvciBvbmNlICovCi0gIGlmIChlbmdpbmUtPnN0ZXBwZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKHNkLCBlbmdpbmUtPnN0ZXBwZXIpOwotICAgICAgZW5naW5lLT5zdGVwcGVyID0gTlVMTDsKLSAgICB9Ci0gIGlmIChzdGVwKQotICAgIGVuZ2luZS0+c3RlcHBlciA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLCBoYXNfc3RlcHBlZCwgc2QpOwotCi0gIHNpbV9tb2R1bGVfcmVzdW1lIChzZCk7Ci0KLSAgLyogcnVuL3Jlc3VtZSB0aGUgc2ltdWxhdG9yICovCi0gIGVuZ2luZS0+am1wYnVmID0gJmJ1ZjsKLSAgam1wdmFsID0gc2V0am1wIChidWYpOwotICBpZiAoam1wdmFsID09IHNpbV9lbmdpbmVfc3RhcnRfam1wdmFsCi0gICAgICB8fCBqbXB2YWwgPT0gc2ltX2VuZ2luZV9yZXN0YXJ0X2ptcHZhbCkKLSAgICB7Ci0gICAgICBpbnQgbGFzdF9jcHVfbnIgPSBzaW1fZW5naW5lX2xhc3RfY3B1X25yIChzZCk7Ci0gICAgICBpbnQgbmV4dF9jcHVfbnIgPSBzaW1fZW5naW5lX25leHRfY3B1X25yIChzZCk7Ci0gICAgICBpbnQgbnJfY3B1cyA9IHNpbV9lbmdpbmVfbnJfY3B1cyAoc2QpOwotCi0gICAgICBzaW1fZXZlbnRzX3ByZXByb2Nlc3MgKHNkLCBsYXN0X2NwdV9uciA+PSBucl9jcHVzLCBuZXh0X2NwdV9uciA+PSBucl9jcHVzKTsKLSAgICAgIGlmIChuZXh0X2NwdV9uciA+PSBucl9jcHVzKQotCW5leHRfY3B1X25yID0gMDsKLQotICAgICAgLyogT25seSBkZWxpdmVyIHRoZSBzaWdnbmFsIF1zaWNdIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggLSBkb24ndAotICAgICAgICAgcmUtZGVsaXZlciBhbnkgc2lnZ25hbCBkdXJpbmcgYSByZXN0YXJ0LiAqLwotICAgICAgaWYgKGptcHZhbCA9PSBzaW1fZW5naW5lX3Jlc3RhcnRfam1wdmFsKQotCXNpZ2duYWwgPSAwOwotCi0jaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fUkVTVU1FCi0gICAgICB7Ci0Jc2ltX2NwdSogY3B1ID0gU1RBVEVfQ1BVIChzZCwgbmV4dF9jcHVfbnIpOwotCVNJTV9DUFVfRVhDRVBUSU9OX1JFU1VNRShzZCwgY3B1LCBzaWdnbmFsKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBzaW1fZW5naW5lX3J1biAoc2QsIG5leHRfY3B1X25yLCBucl9jcHVzLCBzaWdnbmFsKTsKLSAgICB9Ci0gIGVuZ2luZS0+am1wYnVmID0gTlVMTDsKLQotICBzaW1fbW9kdWxlX3N1c3BlbmQgKHNkKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXJ1bi5jIGIvc2ltL2NvbW1vbi9zaW0tcnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjcyOTAuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tcnVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBHZW5lcmljIHNpbXVsYXRvciBydW4uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2VuZ2luZV9ydW4gdGhhdCB3b3JrcyB3aXRoaW4gdGhlCi0gICBzaW1fZW5naW5lIHNldGptcC9sb25nam1wIGZyYW1ld29yay4gKi8KLQotI2RlZmluZSBJTUVNIFhDT05DQVQKLQotdm9pZAotc2ltX2VuZ2luZV9ydW4gKFNJTV9ERVNDIHNkLAotCQlpbnQgbmV4dF9jcHVfbnIsIC8qIGlnbm9yZSAqLwotCQlpbnQgbnJfY3B1cywgLyogaWdub3JlICovCi0JCWludCBzaWdnbmFsKSAvKiBpZ25vcmUgKi8KLXsKLSAgc2ltX2NpYSBjaWE7Ci0gIHNpbV9jcHUgKmNwdTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7Ci0gIGNpYSA9IENJQV9HRVQgKGNwdSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGluc3RydWN0aW9uX3dvcmQgaW5zbiA9IElNRU0zMiAoY2lhKTsKLSAgICAgIGNpYSA9IGlkZWNvZGVfaXNzdWUgKHNkLCBpbnNuLCBjaWEpOwotICAgICAgLyogcHJvY2VzcyBhbnkgZXZlbnRzICovCi0gICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCi0JewotCSAgQ0lBX1NFVCAoY3B1LCBjaWEpOwotCSAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXNpZ25hbC5jIGIvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzA5YjEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBTaW11bGF0b3Igc2lnbmFsIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLS8qIENvbnZlcnQgU0lNX1NJR0ZPTyB0byBTSUdGT08uCi0gICBXaGF0IHRvIGRvIHdoZW4gdGhlIGhvc3QgZG9lc24ndCBoYXZlIFNJR0ZPTyBpcyBoYW5kbGVkIG9uIGEgY2FzZSBieSBjYXNlCi0gICBiYXNpcy4gIEdlbmVyYWxseSwgaW4gdGhlIGNhc2Ugb2YgcGFzc2luZyBhIHZhbHVlIGJhY2sgdG8gZ2RiLCB3ZSB3YW50IGdkYgotICAgdG8gbm90IHRoaW5rIHRoZSBwcm9jZXNzIGhhcyBkaWVkIChzbyBpdCBjYW4gYmUgZGVidWdnZWQgYXQgdGhlIHBvaW50IG9mCi0gICBmYWlsdXJlKS4gICovCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2lmbmRlZiBTSUdUUkFQCi0jZGVmaW5lIFNJR1RSQVAgNQotI2VuZGlmCi0jaWZuZGVmIFNJR0JVUwotI2RlZmluZSBTSUdCVVMgMTAKLSNlbmRpZgotI2lmbmRlZiBTSUdRVUlUCi0jZGVmaW5lIFNJR1FVSVQgMwotI2VuZGlmCi0jZW5kaWYKLQotaW50Ci1zaW1fc2lnbmFsX3RvX2hvc3QgKFNJTV9ERVNDIHNkLCBTSU1fU0lHTkFMIHNpZykKLXsKLSAgc3dpdGNoIChzaWcpCi0gICAgewotICAgIGNhc2UgU0lNX1NJR0lOVCA6Ci0gICAgICByZXR1cm4gU0lHSU5UOwotCi0gICAgY2FzZSBTSU1fU0lHQUJSVCA6Ci0gICAgICByZXR1cm4gU0lHQUJSVDsKLQotICAgIGNhc2UgU0lNX1NJR0lMTCA6Ci0jaWZkZWYgU0lHSUxMCi0gICAgICByZXR1cm4gU0lHSUxMOwotI2Vsc2UKLSAgICAgIHJldHVybiBTSUdTRUdWOwotI2VuZGlmCi0KLSAgICBjYXNlIFNJTV9TSUdUUkFQIDoKLSAgICAgIHJldHVybiBTSUdUUkFQOwotCi0gICAgY2FzZSBTSU1fU0lHQlVTIDoKLSNpZmRlZiBTSUdCVVMKLSAgICAgIHJldHVybiBTSUdCVVM7Ci0jZWxzZQotICAgICAgcmV0dXJuIFNJR1NFR1Y7Ci0jZW5kaWYKLQotICAgIGNhc2UgU0lNX1NJR1NFR1YgOgotICAgICAgcmV0dXJuIFNJR1NFR1Y7Ci0KLSAgICBjYXNlIFNJTV9TSUdYQ1BVIDoKLSNpZmRlZiBTSUdYQ1BVCi0gICAgICByZXR1cm4gU0lHWENQVTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNJTV9TSUdGUEU6Ci0jaWZkZWYgU0lHWENQVQotICAgICAgcmV0dXJuIFNJR0ZQRTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNJTV9TSUdOT05FOgotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc2ltX2lvX2VwcmludGYgKHNkLCAic2ltX3NpZ25hbF90b19ob3N0OiB1bmtub3duIHNpZ25hbDogJWRcbiIsIHNpZyk7Ci0jaWZkZWYgU0lHSFVQCi0gIHJldHVybiBTSUdIVVA7ICAvKiBGSVhNRTogU3VnZ2VzdGlvbnM/ICAqLwotI2Vsc2UKLSAgcmV0dXJuIDE7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXNpZ25hbC5oIGIvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmUxN2QuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBTaW11bGF0b3Igc2lnbmFsIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTSU1fU0lHTkFMX0gKLSNkZWZpbmUgU0lNX1NJR05BTF9ICi0KLS8qIFNpZ25hbHMgd2UgdXNlLgotICAgVGhpcyBwcm92aWRlcyBhIGxheWVyIGJldHdlZW4gb3VyIHZhbHVlcyBhbmQgaG9zdC90YXJnZXQgdmFsdWVzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX1NJR05PTkUgPSA2NCwKLSAgLyogaWxsZWdhbCBpbnNuICovCi0gIFNJTV9TSUdJTEwsCi0gIC8qIGJyZWFrcG9pbnQgKi8KLSAgU0lNX1NJR1RSQVAsCi0gIC8qIG1pc2FsaWduZWQgbWVtb3J5IGFjY2VzcyAqLwotICBTSU1fU0lHQlVTLAotICAvKiB0cmllZCB0byByZWFkL3dyaXRlIG1lbW9yeSB0aGF0J3Mgbm90IHJlYWRhYmxlL3dyaXRhYmxlICovCi0gIFNJTV9TSUdTRUdWLAotICAvKiBjcHUgbGltaXQgZXhjZWVkZWQgKi8KLSAgU0lNX1NJR1hDUFUsCi0gIC8qIHNpbXVsYXRpb24gaW50ZXJydXB0ZWQgKHNpbV9zdG9wIGNhbGxlZCkgKi8KLSAgU0lNX1NJR0lOVCwKLSAgLyogRmxvYXRpbmcgcG9pbnQgb3IgaW50ZWdlciBkaXZpZGUgKi8KLSAgU0lNX1NJR0ZQRSwKLSAgLyogc2ltdWxhdGlvbiBhYm9ydGVkICovCi0gIFNJTV9TSUdBQlJUCi19IFNJTV9TSUdOQUw7Ci0KLWludCBzaW1fc2lnbmFsX3RvX2hvc3QgKFNJTV9ERVNDIHNkLCBTSU1fU0lHTkFMKTsKLQotI2VuZGlmIC8qIFNJTV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tc3RvcC5jIGIvc2ltL2NvbW1vbi9zaW0tc3RvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU5MzE1Li4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLXN0b3AuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEdlbmVyaWMgc2ltdWxhdG9yIHN0b3AuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX3N0b3AuICAqLwotCi1zdGF0aWMgdm9pZAotY29udHJvbF9jX3NpbXVsYXRpb24gKFNJTV9ERVNDIHNkLAotCQkgICAgICB2b2lkICpkYXRhKQotewotICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHNpbV9lbmdpbmVfaGFsdCAoc2QsIE5VTEwsIE5VTEwsIE5VTExfQ0lBLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0lOVCk7Ci19Ci0KLWludAotc2ltX3N0b3AgKFNJTV9ERVNDIHNkKQotewotICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0gIHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKHNkLAotCQkJCSAgIDAgLypOT1cqLywKLQkJCQkgICBjb250cm9sX2Nfc2ltdWxhdGlvbiwKLQkJCQkgICBzZCAvKmRhdGEqLyk7Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tdHJhY2UuYyBiL3NpbS9jb21tb24vc2ltLXRyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTIzMTMuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDEgKzAsMCBAQAotLyogU2ltdWxhdG9yIHRyYWNpbmcvZGVidWdnaW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0taW8uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotI2luY2x1ZGUgInNpbS1mcHUuaCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9QSEFTRQotI2RlZmluZSBTSVpFX1BIQVNFIDgKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfTE9DQVRJT04KLSNkZWZpbmUgU0laRV9MT0NBVElPTiAyMAotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9QQwotI2RlZmluZSBTSVpFX1BDIDYKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfTElORV9OVU1CRVIKLSNkZWZpbmUgU0laRV9MSU5FX05VTUJFUiA0Ci0jZW5kaWYKLQotc3RhdGljIE1PRFVMRV9JTklUX0ZOIHRyYWNlX2luaXQ7Ci1zdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiB0cmFjZV91bmluc3RhbGw7Ci0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSICh0cmFjZV9vcHRpb25faGFuZGxlcik7Ci0KLWVudW0gewotICBPUFRJT05fVFJBQ0VfSU5TTgk9IE9QVElPTl9TVEFSVCwKLSAgT1BUSU9OX1RSQUNFX0RFQ09ERSwKLSAgT1BUSU9OX1RSQUNFX0VYVFJBQ1QsCi0gIE9QVElPTl9UUkFDRV9MSU5FTlVNLAotICBPUFRJT05fVFJBQ0VfTUVNT1JZLAotICBPUFRJT05fVFJBQ0VfTU9ERUwsCi0gIE9QVElPTl9UUkFDRV9BTFUsCi0gIE9QVElPTl9UUkFDRV9DT1JFLAotICBPUFRJT05fVFJBQ0VfRVZFTlRTLAotICBPUFRJT05fVFJBQ0VfRlBVLAotICBPUFRJT05fVFJBQ0VfQlJBTkNILAotICBPUFRJT05fVFJBQ0VfU0VNQU5USUNTLAotICBPUFRJT05fVFJBQ0VfUkFOR0UsCi0gIE9QVElPTl9UUkFDRV9GVU5DVElPTiwKLSAgT1BUSU9OX1RSQUNFX0RFQlVHLAotICBPUFRJT05fVFJBQ0VfRklMRQotfTsKLQotc3RhdGljIGNvbnN0IE9QVElPTiB0cmFjZV9vcHRpb25zW10gPQotewotICAvKiBUaGlzIHRhYmxlIGlzIG9yZ2FuaXplZCB0byBncm91cCByZWxhdGVkIGluc3RydWN0aW9ucyB0b2dldGhlci4gICovCi0gIHsgeyJ0cmFjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICAgICAgJ3QnLCAib258b2ZmIiwgIlRyYWNlIHVzZWZ1bCB0aGluZ3MiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWluc24iLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0lOU059LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJQZXJmb3JtIGluc3RydWN0aW9uIHRyYWNpbmciLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWRlY29kZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfREVDT0RFfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgaW5zdHJ1Y3Rpb24gZGVjb2RpbmciLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWV4dHJhY3QiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0VYVFJBQ1R9LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBpbnN0cnVjdGlvbiBleHRyYWN0aW9uIiwKLSAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJ0cmFjZS1saW5lbnVtIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9MSU5FTlVNfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBsaW5lIG51bWJlciB0cmFjaW5nIChpbXBsaWVzIC0tdHJhY2UtaW5zbikiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLW1lbW9yeSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfTUVNT1JZfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgbWVtb3J5IG9wZXJhdGlvbnMiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWFsdSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfQUxVfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgQUxVIG9wZXJhdGlvbnMiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWZwdSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfRlBVfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgRlBVIG9wZXJhdGlvbnMiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWJyYW5jaCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfQlJBTkNIfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgYnJhbmNoaW5nIiwKLSAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJ0cmFjZS1zZW1hbnRpY3MiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX1NFTUFOVElDU30sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gQUxVLCBGUFUsIE1FTU9SWSwgYW5kIEJSQU5DSCB0cmFjaW5nIiwKLSAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJ0cmFjZS1tb2RlbCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfTU9ERUx9LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJJbmNsdWRlIG1vZGVsIHBlcmZvcm1hbmNlIGRhdGEiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWNvcmUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0NPUkV9LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBjb3JlIG9wZXJhdGlvbnMiLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLWV2ZW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfRVZFTlRTfSwKLSAgICAgICdcMCcsICJvbnxvZmYiLCAiVHJhY2UgZXZlbnRzIiwKLSAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCi0jaWZkZWYgU0lNX0hBVkVfQUREUl9SQU5HRQotICB7IHsidHJhY2UtcmFuZ2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX1JBTkdFfSwKLSAgICAgICdcMCcsICJTVEFSVCxFTkQiLCAiU3BlY2lmeSByYW5nZSBvZiBhZGRyZXNzZXMgZm9yIGluc3RydWN0aW9uIHRyYWNpbmciLAotICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKLSNpZiAwIC8qd2lwKi8KLSAgeyB7InRyYWNlLWZ1bmN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9GVU5DVElPTn0sCi0gICAgICAnXDAnLCAiRlVOQ1RJT04iLCAiU3BlY2lmeSBmdW5jdGlvbiB0byB0cmFjZSIsCi0gICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAotI2VuZGlmCi0jZW5kaWYKLSAgeyB7InRyYWNlLWRlYnVnIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9ERUJVR30sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIkFkZCBpbmZvcm1hdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgc2ltdWxhdG9yIHRvIHRoZSB0cmFjaW5nIG91dHB1dCIsCi0gICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAotICB7IHsidHJhY2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfRklMRX0sCi0gICAgICAnXDAnLCAiRklMRSBOQU1FIiwgIlNwZWNpZnkgdHJhY2luZyBvdXRwdXQgZmlsZSIsCi0gICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotLyogU2V0L3Jlc2V0IHRoZSB0cmFjZSBvcHRpb25zIGluZGljYXRlZCBpbiBNQVNLLiAgKi8KLQotc3RhdGljIFNJTV9SQwotc2V0X3RyYWNlX29wdGlvbl9tYXNrIChzZCwgbmFtZSwgbWFzaywgYXJnKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IG1hc2s7Ci0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsKLSAgaW50IHRyYWNlX25yOwotICBpbnQgY3B1X25yOwotICBpbnQgdHJhY2VfdmFsID0gMTsKLQotICBpZiAoYXJnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAieWVzIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsICJvbiIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCAiMSIpID09IDApCi0JdHJhY2VfdmFsID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjAiKSA9PSAwKQotCXRyYWNlX3ZhbCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiQXJndW1lbnQgYCVzJyBmb3IgYC0tdHJhY2UlcycgaW52YWxpZCwgb25lIG9mIGBvbicsIGBvZmYnLCBgeWVzJywgYG5vJyBleHBlY3RlZFxuIiwgYXJnLCBuYW1lKTsKLQkgIHJldHVybiBTSU1fUkNfRkFJTDsKLQl9Ci0gICAgfQotCi0gIC8qIHVwZGF0ZSBhcHBsaWNhYmxlIHRyYWNlIGJpdHMgKi8KLSAgZm9yICh0cmFjZV9uciA9IDA7IHRyYWNlX25yIDwgTUFYX1RSQUNFX1ZBTFVFUzsgKyt0cmFjZV9ucikKLSAgICB7Ci0gICAgICBpZiAoKG1hc2sgJiAoMSA8PCB0cmFjZV9ucikpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNldCBub24tY3B1IHNwZWNpZmljIHZhbHVlcy4gICovCi0gICAgICBzd2l0Y2ggKHRyYWNlX25yKQotCXsKLQljYXNlIFRSQUNFX0VWRU5UU19JRFg6Ci0JICBTVEFURV9FVkVOVFMgKHNkKS0+dHJhY2UgPSB0cmFjZV92YWw7Ci0JICBicmVhazsKLQljYXNlIFRSQUNFX0RFQlVHX0lEWDoKLQkgIFNUQVRFX1RSQUNFX0ZMQUdTIChzZClbdHJhY2VfbnJdID0gdHJhY2VfdmFsOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBTZXQgY3B1IHZhbHVlcy4gICovCi0gICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKLQl7Ci0JICBDUFVfVFJBQ0VfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpW3RyYWNlX25yXSA9IHRyYWNlX3ZhbDsKLQl9Ci0gICAgfQotCi0gIC8qIFJlLWNvbXB1dGUgdGhlIGNwdSB0cmFjZSBzdW1tYXJ5LiAgKi8KLSAgaWYgKHRyYWNlX3ZhbCkKLSAgICB7Ci0gICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKLQlDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSktPnRyYWNlX2FueV9wID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKLQl7Ci0JICBDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSktPnRyYWNlX2FueV9wID0gMDsKLQkgIGZvciAodHJhY2VfbnIgPSAwOyB0cmFjZV9uciA8IE1BWF9UUkFDRV9WQUxVRVM7ICsrdHJhY2VfbnIpCi0JICAgIHsKLQkgICAgICBpZiAoQ1BVX1RSQUNFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVt0cmFjZV9ucl0pCi0JCXsKLQkJICBDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSktPnRyYWNlX2FueV9wID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0gIAotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLS8qIFNldCBvbmUgdHJhY2Ugb3B0aW9uIGJhc2VkIG9uIGl0cyBJRFggdmFsdWUuICAqLwotCi1zdGF0aWMgU0lNX1JDCi1zZXRfdHJhY2Vfb3B0aW9uIChzZCwgbmFtZSwgaWR4LCBhcmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgaWR4OwotICAgICBjb25zdCBjaGFyICphcmc7Ci17Ci0gIHJldHVybiBzZXRfdHJhY2Vfb3B0aW9uX21hc2sgKHNkLCBuYW1lLCAxIDw8IGlkeCwgYXJnKTsKLX0KLQotCi1zdGF0aWMgU0lNX1JDCi10cmFjZV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKLQkJICAgICAgY2hhciAqYXJnLCBpbnQgaXNfY29tbWFuZCkKLXsKLSAgaW50IG47Ci0gIGludCBjcHVfbnI7Ci0KLSAgc3dpdGNoIChvcHQpCi0gICAgewotICAgIGNhc2UgJ3QnIDoKLSAgICAgIGlmICghIFdJVEhfVFJBQ0UpCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiVHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtdCcgaWdub3JlZFxuIik7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHNldF90cmFjZV9vcHRpb25fbWFzayAoc2QsICJ0cmFjZSIsIFRSQUNFX1VTRUZVTF9NQVNLLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9UUkFDRV9JTlNOIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0lOU05fUCkKLQlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbiAoc2QsICItaW5zbiIsIFRSQUNFX0lOU05fSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkluc3RydWN0aW9uIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1pbnNuJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfREVDT0RFIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0RFQ09ERV9QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1kZWNvZGUiLCBUUkFDRV9ERUNPREVfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkRlY29kZSB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZGVjb2RlJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfRVhUUkFDVCA6Ci0gICAgICBpZiAoV0lUSF9UUkFDRV9FWFRSQUNUX1ApCi0JcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWV4dHJhY3QiLCBUUkFDRV9FWFRSQUNUX0lEWCwgYXJnKTsKLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJFeHRyYWN0IHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1leHRyYWN0JyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfTElORU5VTSA6Ci0gICAgICBpZiAoV0lUSF9UUkFDRV9MSU5FTlVNX1AgJiYgV0lUSF9UUkFDRV9JTlNOX1ApCi0JewotCSAgaWYgKHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWxpbmVudW0iLCBUUkFDRV9MSU5FTlVNX0lEWCwgYXJnKSAhPSBTSU1fUkNfT0sKLQkgICAgICB8fCBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1saW5lbnVtIiwgVFJBQ0VfSU5TTl9JRFgsIGFyZykgIT0gU0lNX1JDX09LKQotCSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkxpbmUgbnVtYmVyIG9yIGluc3RydWN0aW9uIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1saW5lbnVtJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfTUVNT1JZIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX01FTU9SWV9QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1tZW1vcnkiLCBUUkFDRV9NRU1PUllfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIk1lbW9yeSB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtbWVtb3J5JyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfTU9ERUwgOgotICAgICAgaWYgKFdJVEhfVFJBQ0VfTU9ERUxfUCkKLQlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbiAoc2QsICItbW9kZWwiLCBUUkFDRV9NT0RFTF9JRFgsIGFyZyk7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiTW9kZWwgdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLW1vZGVsJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfQUxVIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0FMVV9QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1hbHUiLCBUUkFDRV9BTFVfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkFMVSB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtYWx1JyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfQ09SRSA6Ci0gICAgICBpZiAoV0lUSF9UUkFDRV9DT1JFX1ApCi0JcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWNvcmUiLCBUUkFDRV9DT1JFX0lEWCwgYXJnKTsKLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJDT1JFIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1jb3JlJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfRVZFTlRTIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0VWRU5UU19QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1ldmVudHMiLCBUUkFDRV9FVkVOVFNfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkVWRU5UUyB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZXZlbnRzJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfRlBVIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0ZQVV9QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1mcHUiLCBUUkFDRV9GUFVfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkZQVSB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZnB1JyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfQlJBTkNIIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0JSQU5DSF9QKQotCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1icmFuY2giLCBUUkFDRV9CUkFOQ0hfSURYLCBhcmcpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIkJyYW5jaCB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtYnJhbmNoJyBpZ25vcmVkXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfU0VNQU5USUNTIDoKLSAgICAgIGlmIChXSVRIX1RSQUNFX0FMVV9QCi0JICAmJiBXSVRIX1RSQUNFX0ZQVV9QCi0JICAmJiBXSVRIX1RSQUNFX01FTU9SWV9QCi0JICAmJiBXSVRIX1RSQUNFX0JSQU5DSF9QKQotCXsKLQkgIGlmIChzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1zZW1hbnRpY3MiLCBUUkFDRV9BTFVfSURYLCBhcmcpICE9IFNJTV9SQ19PSwotCSAgICAgIHx8IHNldF90cmFjZV9vcHRpb24gKHNkLCAiLXNlbWFudGljcyIsIFRSQUNFX0ZQVV9JRFgsIGFyZykgIT0gU0lNX1JDX09LCi0JICAgICAgfHwgc2V0X3RyYWNlX29wdGlvbiAoc2QsICItc2VtYW50aWNzIiwgVFJBQ0VfTUVNT1JZX0lEWCwgYXJnKSAhPSBTSU1fUkNfT0sKLQkgICAgICB8fCBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1zZW1hbnRpY3MiLCBUUkFDRV9CUkFOQ0hfSURYLCBhcmcpICE9IFNJTV9SQ19PSykKLQkgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJBbHUsIGZwdSwgbWVtb3J5LCBhbmQvb3IgYnJhbmNoIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1zZW1hbnRpY3MnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfUkFOR0UgOgotICAgICAgaWYgKFdJVEhfVFJBQ0UpCi0JewotCSAgY2hhciAqY2hwID0gYXJnOwotCSAgdW5zaWduZWQgbG9uZyBzdGFydCxlbmQ7Ci0JICBzdGFydCA9IHN0cnRvdWwgKGNocCwgJmNocCwgMCk7Ci0JICBpZiAoKmNocCAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICItLXRyYWNlLXJhbmdlIG1pc3NpbmcgRU5EIGFyZ3VtZW50XG4iKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGVuZCA9IHN0cnRvdWwgKGNocCArIDEsIE5VTEwsIDApOwotCSAgLyogRklYTUU6IEFyZ3VtZW50IHZhbGlkYXRpb24uICAqLwotCSAgaWYgKGNwdSAhPSBOVUxMKQotCSAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFRSQUNFX1JBTkdFIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSwKLQkJCQlzdGFydCwgZW5kKTsKLQkgIGVsc2UKLQkgICAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjcHVfbnIpCi0JICAgICAgc2ltX2FkZHJfcmFuZ2VfYWRkIChUUkFDRV9SQU5HRSAoQ1BVX1RSQUNFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSwKLQkJCQkgIHN0YXJ0LCBlbmQpOwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJUcmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtcmFuZ2UnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9UUkFDRV9GVU5DVElPTiA6Ci0gICAgICBpZiAoV0lUSF9UUkFDRSkKLQl7Ci0JICAvKndpcDogbmVlZCB0byBjb21wdXRlIGZ1bmN0aW9uIHJhbmdlIGdpdmVuIG5hbWUqLwotCX0KLSAgICAgIGVsc2UKLQlzaW1faW9fZXByaW50ZiAoc2QsICJUcmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZnVuY3Rpb24nIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogU0lNX0hBVkVfQUREUl9SQU5HRSAqLwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfREVCVUcgOgotICAgICAgaWYgKFdJVEhfVFJBQ0VfREVCVUdfUCkKLQlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbiAoc2QsICItZGVidWciLCBUUkFDRV9ERUJVR19JRFgsIGFyZyk7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiVHJhY2luZyBkZWJ1ZyBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZGVidWcnIGlnbm9yZWRcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9UUkFDRV9GSUxFIDoKLSAgICAgIGlmICghIFdJVEhfVFJBQ0UpCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiVHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLWZpbGUnIGlnbm9yZWRcbiIpOwotICAgICAgZWxzZQotCXsKLQkgIEZJTEUgKmYgPSBmb3BlbiAoYXJnLCAidyIpOwotCi0JICBpZiAoZiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5hYmxlIHRvIG9wZW4gdHJhY2Ugb3V0cHV0IGZpbGUgYCVzJ1xuIiwgYXJnKTsKLQkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgIH0KLQkgIGZvciAobiA9IDA7IG4gPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytuKQotCSAgICBUUkFDRV9GSUxFIChDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgbikpKSA9IGY7Ci0JICBUUkFDRV9GSUxFIChTVEFURV9UUkFDRV9EQVRBIChzZCkpID0gZjsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQwKLS8qIEluc3RhbGwgdHJhY2luZyBzdXBwb3J0LiAgKi8KLQotU0lNX1JDCi10cmFjZV9pbnN0YWxsIChTSU1fREVTQyBzZCkKLXsKLSAgaW50IGk7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLQotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHRyYWNlX29wdGlvbnMpOwotICBtZW1zZXQgKFNUQVRFX1RSQUNFX0RBVEEgKHNkKSwgMCwgc2l6ZW9mICgqIFNUQVRFX1RSQUNFX0RBVEEgKHNkKSkpOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKLSAgICBtZW1zZXQgKENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBpKSksIDAsCi0JICAgIHNpemVvZiAoKiBDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpKSk7Ci0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCB0cmFjZV9pbml0KTsKLSAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgdHJhY2VfdW5pbnN0YWxsKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotc3RhdGljIFNJTV9SQwotdHJhY2VfaW5pdCAoU0lNX0RFU0Mgc2QpCi17Ci0jaWZkZWYgU0lNX0hBVkVfQUREUl9SQU5HRQotICAvKiBDaGVjayBpZiBhIHJhbmdlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRob3V0IHNwZWNpZnlpbmcgd2hhdCB0bwotICAgICBjb2xsZWN0LiAgKi8KLSAgewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCi0gICAgICB7Ci0Jc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgaSk7Ci0KLQlpZiAoQUREUl9SQU5HRV9SQU5HRVMgKFRSQUNFX1JBTkdFIChDUFVfVFJBQ0VfREFUQSAoY3B1KSkpCi0JICAgICYmICEgVFJBQ0VfSU5TTl9QIChjcHUpKQotCSAgewotCSAgICBzaW1faW9fZXByaW50Zl9jcHUgKGNwdSwgIlRyYWNpbmcgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgd2l0aG91dCAtLXRyYWNlLWluc24uXG4iKTsKLQkgICAgc2ltX2lvX2VwcmludGZfY3B1IChjcHUsICJBZGRyZXNzIHJhbmdlIGlnbm9yZWQuXG4iKTsKLQkgICAgc2ltX2FkZHJfcmFuZ2VfZGVsZXRlIChUUkFDRV9SQU5HRSAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpLAotCQkJCSAgIDAsIH4gKGFkZHJlc3Nfd29yZCkgMCk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkCi10cmFjZV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBpbnQgaSxqOwotICBGSUxFICpzZmlsZSA9IFRSQUNFX0ZJTEUgKFNUQVRFX1RSQUNFX0RBVEEgKHNkKSk7Ci0KLSAgaWYgKHNmaWxlICE9IE5VTEwpCi0gICAgZmNsb3NlIChzZmlsZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCi0gICAgewotICAgICAgRklMRSAqY2ZpbGUgPSBUUkFDRV9GSUxFIChDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpKTsKLSAgICAgIGlmIChjZmlsZSAhPSBOVUxMICYmIGNmaWxlICE9IHNmaWxlKQotCXsKLQkgIC8qIElmIG91dHB1dCBmcm9tIGRpZmZlcmVudCBjcHVzIGlzIGdvaW5nIHRvIHRoZSBzYW1lIGZpbGUsCi0JICAgICBhdm9pZCBjbG9zaW5nIHRoZSBmaWxlIHR3aWNlLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JICAgIGlmIChUUkFDRV9GSUxFIChDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgaikpKSA9PSBjZmlsZSkKLQkgICAgICBicmVhazsKLQkgIGlmIChpID09IGopCi0JICAgIGZjbG9zZSAoY2ZpbGUpOwotCX0KLSAgICB9Ci19Ci0MCi10eXBlZGVmIGVudW0gewotICB0cmFjZV9mbXRfaW52YWxpZCwKLSAgdHJhY2VfZm10X3dvcmQsCi0gIHRyYWNlX2ZtdF9mcCwKLSAgdHJhY2VfZm10X2ZwdSwKLSAgdHJhY2VfZm10X3N0cmluZywKLSAgdHJhY2VfZm10X2Jvb2wsCi0gIHRyYWNlX2ZtdF9hZGRyLAotICB0cmFjZV9mbXRfaW5zdHJ1Y3Rpb25faW5jb21wbGV0ZSwKLX0gZGF0YV9mbXQ7Ci0KLS8qIGNvbXB1dGUgdGhlIG5yIG9mIHRyYWNlIGRhdGEgdW5pdHMgY29uc3VtZWQgYnkgZGF0YSAqLwotc3RhdGljIGludAotc2F2ZV9kYXRhX3NpemUgKFRSQUNFX0RBVEEgKmRhdGEsCi0JCWxvbmcgc2l6ZSkKLXsKLSAgcmV0dXJuICgoc2l6ZSArIHNpemVvZiAoVFJBQ0VfSU5QVVRfREFUQSAoZGF0YSkgWzBdKSAtIDEpCi0JICAvIHNpemVvZiAoVFJBQ0VfSU5QVVRfREFUQSAoZGF0YSkgWzBdKSk7Ci19Ci0KLQotLyogQXJjaGl2ZSBEQVRBIGludG8gdGhlIHRyYWNlIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQKLXNhdmVfZGF0YSAoU0lNX0RFU0Mgc2QsCi0JICAgVFJBQ0VfREFUQSAqZGF0YSwKLQkgICBkYXRhX2ZtdCBmbXQsCi0JICAgbG9uZyBzaXplLAotCSAgIHZvaWQgKmJ1ZikKLXsKLSAgaW50IGkgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOwotICBpZiAoaSA9PSBzaXplb2YgKFRSQUNFX0lOUFVUX0ZNVCAoZGF0YSkpKQotICAgIHNpbV9pb19lcnJvciAoc2QsICJ0cmFjZSBidWZmZXIgb3ZlcmZsb3ciKTsKLSAgVFJBQ0VfSU5QVVRfRk1UIChkYXRhKSBbaV0gPSBmbXQ7Ci0gIFRSQUNFX0lOUFVUX1NJWkUgKGRhdGEpIFtpXSA9IHNpemU7Ci0gIG1lbWNweSAoJlRSQUNFX0lOUFVUX0RBVEEgKGRhdGEpIFtpXSwgYnVmLCBzaXplKTsKLSAgaSArPSBzYXZlX2RhdGFfc2l6ZSAoZGF0YSwgc2l6ZSk7Ci0gIFRSQUNFX0lOUFVUX0lEWCAoZGF0YSkgPSBpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGF0YSAoU0lNX0RFU0Mgc2QsCi0JICAgIHNpbV9jcHUgKmNwdSwKLQkgICAgZGF0YV9mbXQgZm10LAotCSAgICBsb25nIHNpemUsCi0JICAgIHZvaWQgKmRhdGEpCi17Ci0gIHN3aXRjaCAoZm10KQotICAgIHsKLSAgICBjYXNlIHRyYWNlX2ZtdF9pbnN0cnVjdGlvbl9pbmNvbXBsZXRlOgotICAgICAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiIChpbnN0cnVjdGlvbiBpbmNvbXBsZXRlKSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0cmFjZV9mbXRfd29yZDoKLSAgICBjYXNlIHRyYWNlX2ZtdF9hZGRyOgotICAgICAgewotCXN3aXRjaCAoc2l6ZSkKLQkgIHsKLQkgIGNhc2Ugc2l6ZW9mICh1bnNpZ25lZDMyKToKLQkgICAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiIDB4JTA4bHgiLCAobG9uZykgKiAodW5zaWduZWQzMiopIGRhdGEpOwotCSAgICBicmVhazsKLQkgIGNhc2Ugc2l6ZW9mICh1bnNpZ25lZDY0KToKLQkgICAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiIDB4JTA4bHglMDhseCIsCi0JCQkgIChsb25nKSAoKCogKHVuc2lnbmVkNjQqKSBkYXRhKSA+PiAzMiksCi0JCQkgIChsb25nKSAqICh1bnNpZ25lZDY0KikgZGF0YSk7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSB0cmFjZV9mbXRfYm9vbDoKLSAgICAgIHsKLQlTSU1fQVNTRVJUIChzaXplID09IHNpemVvZiAoaW50KSk7Ci0JdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiICUtOHMiLAotCQkgICAgICAoKiAoaW50KikgZGF0YSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIHRyYWNlX2ZtdF9mcDoKLSAgICAgIHsKLQlzaW1fZnB1IGZwOwotCXN3aXRjaCAoc2l6ZSkKLQkgIHsKLQkgICAgLyogRklYTUU6IEFzc3VtZXMgc2l6ZW9mIGZsb2F0ID09IDQ7IHNpemVvZiBkb3VibGUgPT0gOCAqLwotCSAgY2FzZSA0OgotCSAgICBzaW1fZnB1XzMydG8gKCZmcCwgKih1bnNpZ25lZDMyKilkYXRhKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHNpbV9mcHVfNjR0byAoJmZwLCAqKHVuc2lnbmVkNjQqKWRhdGEpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCXRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAlOGciLCBzaW1fZnB1XzJkICgmZnApKTsKLQlzd2l0Y2ggKHNpemUpCi0JICB7Ci0JICBjYXNlIDQ6Ci0JICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAoMHglMDhseCkiLAotCQkJICAobG9uZykgKih1bnNpZ25lZDMyKilkYXRhKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAoMHglMDhseCUwOGx4KSIsCi0JCQkgIChsb25nKSAoKih1bnNpZ25lZDY0KilkYXRhID4+IDMyKSwKLQkJCSAgKGxvbmcpICgqKHVuc2lnbmVkNjQqKWRhdGEpKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIHRyYWNlX2ZtdF9mcHU6Ci0gICAgICAvKiBGSVhNRTogQXQgcHJlc2VudCBzaW1fZnB1IGRhdGEgaXMgc3RvcmVkIGFzIGEgZG91YmxlICovCi0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgJThnIiwgKiAoZG91YmxlKikgZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRyYWNlX2ZtdF9zdHJpbmc6Ci0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgJS04cyIsIChjaGFyKikgZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCQkgIAotc3RhdGljIGNvbnN0IGNoYXIgKgotdHJhY2VfaWR4X3RvX3N0ciAoaW50IHRyYWNlX2lkeCkKLXsKLSAgc3RhdGljIGNoYXIgbnVtWzhdOwotICBzd2l0Y2ggKHRyYWNlX2lkeCkKLSAgICB7Ci0gICAgY2FzZSBUUkFDRV9BTFVfSURYOiAgICAgcmV0dXJuICJhbHU6ICAgICAiOwotICAgIGNhc2UgVFJBQ0VfSU5TTl9JRFg6ICAgIHJldHVybiAiaW5zbjogICAgIjsKLSAgICBjYXNlIFRSQUNFX0RFQ09ERV9JRFg6ICByZXR1cm4gImRlY29kZTogICI7Ci0gICAgY2FzZSBUUkFDRV9FWFRSQUNUX0lEWDogcmV0dXJuICJleHRyYWN0OiAiOwotICAgIGNhc2UgVFJBQ0VfTUVNT1JZX0lEWDogIHJldHVybiAibWVtb3J5OiAgIjsKLSAgICBjYXNlIFRSQUNFX0NPUkVfSURYOiAgICByZXR1cm4gImNvcmU6ICAgICI7Ci0gICAgY2FzZSBUUkFDRV9FVkVOVFNfSURYOiAgcmV0dXJuICJldmVudHM6ICAiOwotICAgIGNhc2UgVFJBQ0VfRlBVX0lEWDogICAgIHJldHVybiAiZnB1OiAgICAgIjsKLSAgICBjYXNlIFRSQUNFX0JSQU5DSF9JRFg6ICByZXR1cm4gImJyYW5jaDogICI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKG51bSwgIj8lZD8iLCB0cmFjZV9pZHgpOwotICAgICAgcmV0dXJuIG51bTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10cmFjZV9yZXN1bHRzIChTSU1fREVTQyBzZCwKLQkgICAgICAgc2ltX2NwdSAqY3B1LAotCSAgICAgICBpbnQgdHJhY2VfaWR4LAotCSAgICAgICBpbnQgbGFzdF9pbnB1dCkKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBpbnQgbnJfb3V0OwotICBpbnQgaTsKLQotICAvKiBjcm9zcyBjaGVjayB0cmFjZV9pZHggYWdhaW5zdCBUUkFDRV9JRFggKGRhdGEpPyAqLwotCi0gIC8qIHByZWZpeCAqLwotICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlcyAlcyIsCi0JCXRyYWNlX2lkeF90b19zdHIgKFRSQUNFX0lEWCAoZGF0YSkpLAotCQlUUkFDRV9QUkVGSVggKGRhdGEpKTsKLSAgVFJBQ0VfSURYIChkYXRhKSA9IDA7Ci0KLSAgZm9yIChpID0gMCwgbnJfb3V0ID0gMDsKLSAgICAgICBpIDwgVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKLSAgICAgICBpICs9IHNhdmVfZGF0YV9zaXplIChkYXRhLCBUUkFDRV9JTlBVVF9TSVpFIChkYXRhKSBbaV0pLCBucl9vdXQrKykKLSAgICB7Ci0gICAgICBpZiAoaSA9PSBsYXN0X2lucHV0KQotCXsKLQkgIGludCBwYWQgPSAoc3RybGVuICgiIDB4IikgKyBzaXplb2YgKHVuc2lnbmVkX3dvcmQpICogMik7Ci0JICBpbnQgcGFkZGluZyA9IHBhZCAqICgzIC0gbnJfb3V0KTsKLQkgIGlmIChwYWRkaW5nIDwgMCkKLQkgICAgcGFkZGluZyA9IDA7Ci0JICBwYWRkaW5nICs9IHN0cmxlbiAoIiA6OiIpOwotCSAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiJSpzIiwgcGFkZGluZywgIiA6OiIpOwotCX0KLSAgICAgIHByaW50X2RhdGEgKHNkLCBjcHUsCi0JCSAgVFJBQ0VfSU5QVVRfRk1UIChkYXRhKSBbaV0sCi0JCSAgVFJBQ0VfSU5QVVRfU0laRSAoZGF0YSkgW2ldLAotCQkgICZUUkFDRV9JTlBVVF9EQVRBIChkYXRhKSBbaV0pOwotICAgIH0KLSAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiXG4iKTsKLX0KLQotdm9pZAotdHJhY2VfcHJlZml4IChTSU1fREVTQyBzZCwKLQkgICAgICBzaW1fY3B1ICpjcHUsCi0JICAgICAgc2ltX2NpYSBjaWEsCi0JICAgICAgYWRkcmVzc193b3JkIHBjLAotCSAgICAgIGludCBsaW5lX3AsCi0JICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JICAgICAgaW50IGxpbmVudW0sCi0JICAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgIC4uLikKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICB2YV9saXN0IGFwOwotICBjaGFyICpwcmVmaXggPSBUUkFDRV9QUkVGSVggKGRhdGEpOwotICBjaGFyICpjaHA7Ci0gLyogRklYTUU6IFRoZSBUUkFDRV9QUkVGSVhfV0lEVEggc2hvdWxkIGJlIGRldGVybWluZWQgYXQgYnVpbGQgdGltZSB1c2luZwotICAgIGtub3duIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb25zLiAqLwotI2lmbmRlZiBUUkFDRV9QUkVGSVhfV0lEVEgKLSNkZWZpbmUgVFJBQ0VfUFJFRklYX1dJRFRIIDQ4Ci0jZW5kaWYKLSAgaW50IHdpZHRoID0gVFJBQ0VfUFJFRklYX1dJRFRIOwotCi0gIC8qIGlmIHRoZSBwcmV2aW91cyB0cmFjZSBkYXRhIHdhc24ndCBmbHVzaGVkLCBmbHVzaCBpdCBub3cgd2l0aCBhCi0gICAgIG5vdGUgaW5kaWNhdGluZyB0aGF0IHRoZSB0cmFjZSB3YXMgaW5jb21wbGV0ZS4gKi8KLSAgaWYgKFRSQUNFX0lEWCAoZGF0YSkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gICAgICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfaW5zdHJ1Y3Rpb25faW5jb21wbGV0ZSwgMSwgIiIpOwotICAgICAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgVFJBQ0VfSURYIChkYXRhKSwgbGFzdF9pbnB1dCk7Ci0gICAgfQotICBUUkFDRV9JRFggKGRhdGEpID0gMDsKLSAgVFJBQ0VfSU5QVVRfSURYIChkYXRhKSA9IDA7Ci0KLSAgLyogQ3JlYXRlIHRoZSB0ZXh0IHByZWZpeCBmb3IgdGhpcyBuZXcgaW5zdHJ1Y3Rpb246ICovCi0gIGlmICghbGluZV9wKQotICAgIHsKLSAgICAgIGlmIChmaWxlbmFtZSkKLQl7Ci0JICBzcHJpbnRmIChwcmVmaXgsICIlczolLSpkIDB4JS4qbHggIiwKLQkJICAgZmlsZW5hbWUsCi0JCSAgIFNJWkVfTElORV9OVU1CRVIsIGxpbmVudW0sCi0JCSAgIFNJWkVfUEMsIChsb25nKSBwYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNwcmludGYgKHByZWZpeCwgIjB4JS4qbHggIiwKLQkJICAgU0laRV9QQywgKGxvbmcpIHBjKTsKLQkgIC8qIFNocmluayB0aGUgd2lkdGggYnkgdGhlIGFtb3VudCB0aGF0IHdlIGRpZG4ndCBwcmludC4gICovCi0JICB3aWR0aCAtPSBTSVpFX0xJTkVfTlVNQkVSICsgU0laRV9QQyArIDg7Ci0JfQotICAgICAgY2hwID0gc3RyY2hyIChwcmVmaXgsICdcMCcpOwotICAgICAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICAgICAgdnNwcmludGYgKGNocCwgZm10LCBhcCk7Ci0gICAgICB2YV9lbmQgKGFwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsyNTZdOwotICAgICAgYnVmWzBdID0gMDsKLSAgICAgIGlmIChTVEFURV9URVhUX1NFQ1RJT04gKENQVV9TVEFURSAoY3B1KSkKLQkgICYmIHBjID49IFNUQVRFX1RFWFRfU1RBUlQgKENQVV9TVEFURSAoY3B1KSkKLQkgICYmIHBjIDwgU1RBVEVfVEVYVF9FTkQgKENQVV9TVEFURSAoY3B1KSkpCi0JewotCSAgY29uc3QgY2hhciAqcGNfZmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKTA7Ci0JICBjb25zdCBjaGFyICpwY19mdW5jdGlvbiA9IChjb25zdCBjaGFyICopMDsKLQkgIHVuc2lnbmVkIGludCBwY19saW5lbnVtID0gMDsKLQkgIGJmZCAqYWJmZDsKLQkgIGFzeW1ib2wgKiphc3ltYm9sczsKLQotCSAgYWJmZCA9IFNUQVRFX1BST0dfQkZEIChDUFVfU1RBVEUgKGNwdSkpOwotCSAgYXN5bWJvbHMgPSBTVEFURV9QUk9HX1NZTVMgKENQVV9TVEFURSAoY3B1KSk7Ci0JICBpZiAoYXN5bWJvbHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxvbmcgc3ltc2l6ZTsKLQkgICAgICBsb25nIHN5bWJvbF9jb3VudDsKLQotCSAgICAgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0JICAgICAgaWYgKHN5bXNpemUgPCAwKQotCQl7Ci0JCSAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIGNwdSwgY2lhLCAiY291bGQgbm90IHJlYWQgc3ltYm9scyIpOwotCQl9Ci0JICAgICAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICAgICAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkgICAgICBpZiAoc3ltYm9sX2NvdW50IDwgMCkKLQkJewotCQkgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwgImNvdWxkIG5vdCBjYW5vbmljYWxpemUgc3ltYm9scyIpOwotCQl9Ci0JICAgICAgU1RBVEVfUFJPR19TWU1TIChDUFVfU1RBVEUgKGNwdSkpID0gYXN5bWJvbHM7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCQkgICAgIFNUQVRFX1RFWFRfU0VDVElPTiAoQ1BVX1NUQVRFIChjcHUpKSwKLQkJCQkgICAgIGFzeW1ib2xzLAotCQkJCSAgICAgcGMgLSBTVEFURV9URVhUX1NUQVJUIChDUFVfU1RBVEUgKGNwdSkpLAotCQkJCSAgICAgJnBjX2ZpbGVuYW1lLCAmcGNfZnVuY3Rpb24sICZwY19saW5lbnVtKSkKLQkgICAgewotCSAgICAgIGNoYXIgKnAgPSBidWY7Ci0JICAgICAgaWYgKHBjX2xpbmVudW0pCi0JCXsKLQkJICBzcHJpbnRmIChwLCAiIyUtKmQgIiwgU0laRV9MSU5FX05VTUJFUiwgcGNfbGluZW51bSk7Ci0JCSAgcCArPSBzdHJsZW4gKHApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ByaW50ZiAocCwgIiUtKnMgIiwgU0laRV9MSU5FX05VTUJFUisxLCAiLS0tIik7Ci0JCSAgcCArPSBTSVpFX0xJTkVfTlVNQkVSKzI7Ci0JCX0KLQotCSAgICAgIGlmIChwY19mdW5jdGlvbikKLQkJewotCQkgIHNwcmludGYgKHAsICIlcyAiLCBwY19mdW5jdGlvbik7Ci0JCSAgcCArPSBzdHJsZW4gKHApOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocGNfZmlsZW5hbWUpCi0JCXsKLQkJICBjaGFyICpxID0gKGNoYXIgKikgc3RycmNociAocGNfZmlsZW5hbWUsICcvJyk7Ci0JCSAgc3ByaW50ZiAocCwgIiVzICIsIChxKSA/IHErMSA6IHBjX2ZpbGVuYW1lKTsKLQkJICBwICs9IHN0cmxlbiAocCk7Ci0JCX0KLQotCSAgICAgIGlmICgqcCA9PSAnICcpCi0JCSpwID0gJ1wwJzsKLQkgICAgfQotCX0KLQotICAgICAgc3ByaW50ZiAocHJlZml4LCAiMHglLip4ICUtKi4qcyAiLAotCSAgICAgICBTSVpFX1BDLCAodW5zaWduZWQpIHBjLAotCSAgICAgICBTSVpFX0xPQ0FUSU9OLCBTSVpFX0xPQ0FUSU9OLCBidWYpOwotICAgICAgY2hwID0gc3RyY2hyIChwcmVmaXgsICdcMCcpOwotICAgICAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICAgICAgdnNwcmludGYgKGNocCwgZm10LCBhcCk7Ci0gICAgICB2YV9lbmQgKGFwKTsKLSAgICB9Ci0KLSAgLyogUGFkIGl0IG91dCB0byBUUkFDRV9QUkVGSVhfV0lEVEguICAqLwotICBjaHAgPSBzdHJjaHIgKHByZWZpeCwgJ1wwJyk7Ci0gIGlmIChjaHAgLSBwcmVmaXggPCB3aWR0aCkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGNocCwgJyAnLCB3aWR0aCAtIChjaHAgLSBwcmVmaXgpKTsKLSAgICAgIGNocCA9ICZwcmVmaXggW3dpZHRoXTsKLSAgICAgICpjaHAgPSAnXDAnOwotICAgIH0KLSAgc3RyY3B5IChjaHAsICIgLSIpOwotCi0gIC8qIGNoZWNrIHRoYXQgd2UndmUgbm90IG92ZXIgZmxvd2VkIHRoZSBwcmVmaXggYnVmZmVyICovCi0gIGlmIChzdHJsZW4gKHByZWZpeCkgPj0gc2l6ZW9mIChUUkFDRV9QUkVGSVggKGRhdGEpKSkKLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotdHJhY2VfZ2VuZXJpYyAoU0lNX0RFU0Mgc2QsCi0JICAgICAgIHNpbV9jcHUgKmNwdSwKLQkgICAgICAgaW50IHRyYWNlX2lkeCwKLQkgICAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgICAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiVzICVzIiwKLQkJdHJhY2VfaWR4X3RvX3N0ciAodHJhY2VfaWR4KSwKLQkJVFJBQ0VfUFJFRklYIChDUFVfVFJBQ0VfREFUQSAoY3B1KSkpOwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0gIHRyYWNlX3ZwcmludGYgKHNkLCBjcHUsIGZtdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLSAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiXG4iKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXQwIChTSU1fREVTQyBzZCwKLQkgICAgICBzaW1fY3B1ICpjcHUsCi0JICAgICAgaW50IHRyYWNlX2lkeCkKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotfQotCi12b2lkCi10cmFjZV9pbnB1dF93b3JkMSAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgaW50IHRyYWNlX2lkeCwKLQkJICAgdW5zaWduZWRfd29yZCBkMCkKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwgJmQwKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXRfd29yZDIgKFNJTV9ERVNDIHNkLAotCQkgICBzaW1fY3B1ICpjcHUsCi0JCSAgIGludCB0cmFjZV9pZHgsCi0JCSAgIHVuc2lnbmVkX3dvcmQgZDAsCi0JCSAgIHVuc2lnbmVkX3dvcmQgZDEpCi17Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAodW5zaWduZWRfd29yZCksICZkMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmZDEpOwotfQotCi12b2lkCi10cmFjZV9pbnB1dF93b3JkMyAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgaW50IHRyYWNlX2lkeCwKLQkJICAgdW5zaWduZWRfd29yZCBkMCwKLQkJICAgdW5zaWduZWRfd29yZCBkMSwKLQkJICAgdW5zaWduZWRfd29yZCBkMikKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwgJmQwKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAodW5zaWduZWRfd29yZCksICZkMSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmZDIpOwotfQotCi12b2lkCi10cmFjZV9pbnB1dF93b3JkNCAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgaW50IHRyYWNlX2lkeCwKLQkJICAgdW5zaWduZWRfd29yZCBkMCwKLQkJICAgdW5zaWduZWRfd29yZCBkMSwKLQkJICAgdW5zaWduZWRfd29yZCBkMiwKLQkJICAgdW5zaWduZWRfd29yZCBkMykKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChkMCksICZkMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKGQxKSwgJmQxKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAoZDIpLCAmZDIpOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChkMyksICZkMyk7Ci19Ci0KLXZvaWQKLXRyYWNlX2lucHV0X2Jvb2wxIChTSU1fREVTQyBzZCwKLQkJICAgc2ltX2NwdSAqY3B1LAotCQkgICBpbnQgdHJhY2VfaWR4LAotCQkgICBpbnQgZDApCi17Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2Jvb2wsIHNpemVvZiAoZDApLCAmZDApOwotfQotCi12b2lkCi10cmFjZV9pbnB1dF9hZGRyMSAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgaW50IHRyYWNlX2lkeCwKLQkJICAgYWRkcmVzc193b3JkIGQwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9hZGRyLCBzaXplb2YgKGQwKSwgJmQwKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXRfZnAxIChTSU1fREVTQyBzZCwKLQkJIHNpbV9jcHUgKmNwdSwKLQkJIGludCB0cmFjZV9pZHgsCi0JCSBmcF93b3JkIGYwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYwKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXRfZnAyIChTSU1fREVTQyBzZCwKLQkJIHNpbV9jcHUgKmNwdSwKLQkJIGludCB0cmFjZV9pZHgsCi0JCSBmcF93b3JkIGYwLAotCQkgZnBfd29yZCBmMSkKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZnBfd29yZCksICZmMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYxKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXRfZnAzIChTSU1fREVTQyBzZCwKLQkJIHNpbV9jcHUgKmNwdSwKLQkJIGludCB0cmFjZV9pZHgsCi0JCSBmcF93b3JkIGYwLAotCQkgZnBfd29yZCBmMSwKLQkJIGZwX3dvcmQgZjIpCi17Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGZwX3dvcmQpLCAmZjApOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZnBfd29yZCksICZmMSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYyKTsKLX0KLQotdm9pZAotdHJhY2VfaW5wdXRfZnB1MSAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2NwdSAqY3B1LAotCQkgIGludCB0cmFjZV9pZHgsCi0JCSAgc2ltX2ZwdSAqZjApCi17Ci0gIGRvdWJsZSBkOwotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7Ci0gIGQgPSBzaW1fZnB1XzJkIChmMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChkb3VibGUpLCAmZCk7Ci19Ci0KLXZvaWQKLXRyYWNlX2lucHV0X2ZwdTIgKFNJTV9ERVNDIHNkLAotCQkgIHNpbV9jcHUgKmNwdSwKLQkJICBpbnQgdHJhY2VfaWR4LAotCQkgIHNpbV9mcHUgKmYwLAotCQkgIHNpbV9mcHUgKmYxKQotewotICBkb3VibGUgZDsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OwotICBkID0gc2ltX2ZwdV8yZCAoZjApOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOwotICBkID0gc2ltX2ZwdV8yZCAoZjEpOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOwotfQotCi12b2lkCi10cmFjZV9pbnB1dF9mcHUzIChTSU1fREVTQyBzZCwKLQkJICBzaW1fY3B1ICpjcHUsCi0JCSAgaW50IHRyYWNlX2lkeCwKLQkJICBzaW1fZnB1ICpmMCwKLQkJICBzaW1fZnB1ICpmMSwKLQkJICBzaW1fZnB1ICpmMikKLXsKLSAgZG91YmxlIGQ7Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKLSAgZCA9IHNpbV9mcHVfMmQgKGYwKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGRvdWJsZSksICZkKTsKLSAgZCA9IHNpbV9mcHVfMmQgKGYxKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGRvdWJsZSksICZkKTsKLSAgZCA9IHNpbV9mcHVfMmQgKGYyKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGRvdWJsZSksICZkKTsKLX0KLQotdm9pZAotdHJhY2VfcmVzdWx0X3dvcmQxIChTSU1fREVTQyBzZCwKLQkJICAgIHNpbV9jcHUgKmNwdSwKLQkJICAgIGludCB0cmFjZV9pZHgsCi0JCSAgICB1bnNpZ25lZF93b3JkIHIwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmcjApOwotCi0gIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Ci19CSAgICAgIAotCi12b2lkCi10cmFjZV9yZXN1bHQwIChTSU1fREVTQyBzZCwKLQkgICAgICAgc2ltX2NwdSAqY3B1LAotCSAgICAgICBpbnQgdHJhY2VfaWR4KQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0KLSAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKLX0JICAgICAgCi0KLXZvaWQKLXRyYWNlX3Jlc3VsdF93b3JkMiAoU0lNX0RFU0Mgc2QsCi0JCSAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICBpbnQgdHJhY2VfaWR4LAotCQkgICAgdW5zaWduZWRfd29yZCByMCwKLQkJICAgIHVuc2lnbmVkX3dvcmQgcjEpCi17Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgaW50IGxhc3RfaW5wdXQ7Ci0KLSAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLwotICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAocjApLCAmcjApOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChyMSksICZyMSk7Ci0KLSAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKLX0JICAgICAgCi0KLXZvaWQKLXRyYWNlX3Jlc3VsdF93b3JkNCAoU0lNX0RFU0Mgc2QsCi0JCSAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICBpbnQgdHJhY2VfaWR4LAotCQkgICAgdW5zaWduZWRfd29yZCByMCwKLQkJICAgIHVuc2lnbmVkX3dvcmQgcjEsCi0JCSAgICB1bnNpZ25lZF93b3JkIHIyLAotCQkgICAgdW5zaWduZWRfd29yZCByMykKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBpbnQgbGFzdF9pbnB1dDsKLQotICAvKiBBcHBlbmQgYW55IHJlc3VsdHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXRzICovCi0gIGxhc3RfaW5wdXQgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChyMCksICZyMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHIxKSwgJnIxKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAocjIpLCAmcjIpOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChyMyksICZyMyk7Ci0KLSAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKLX0JICAgICAgCi0KLXZvaWQKLXRyYWNlX3Jlc3VsdF9ib29sMSAoU0lNX0RFU0Mgc2QsCi0JCSAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICBpbnQgdHJhY2VfaWR4LAotCQkgICAgaW50IHIwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9ib29sLCBzaXplb2YgKHIwKSwgJnIwKTsKLQotICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOwotfQkgICAgICAKLQotdm9pZAotdHJhY2VfcmVzdWx0X2FkZHIxIChTSU1fREVTQyBzZCwKLQkJICAgIHNpbV9jcHUgKmNwdSwKLQkJICAgIGludCB0cmFjZV9pZHgsCi0JCSAgICBhZGRyZXNzX3dvcmQgcjApCi17Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgaW50IGxhc3RfaW5wdXQ7Ci0KLSAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLwotICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2FkZHIsIHNpemVvZiAocjApLCAmcjApOwotCi0gIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Ci19CSAgICAgIAotCi12b2lkCi10cmFjZV9yZXN1bHRfZnAxIChTSU1fREVTQyBzZCwKLQkJICBzaW1fY3B1ICpjcHUsCi0JCSAgaW50IHRyYWNlX2lkeCwKLQkJICBmcF93b3JkIGYwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYwKTsKLQotICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOwotfQkgICAgICAKLQotdm9pZAotdHJhY2VfcmVzdWx0X2ZwMiAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2NwdSAqY3B1LAotCQkgIGludCB0cmFjZV9pZHgsCi0JCSAgZnBfd29yZCBmMCwKLQkJICBmcF93b3JkIGYxKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmMCksICZmMCk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmMSksICZmMSk7Ci0KLSAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKLX0JICAgICAgCi0KLXZvaWQKLXRyYWNlX3Jlc3VsdF9mcHUxIChTSU1fREVTQyBzZCwKLQkJICAgc2ltX2NwdSAqY3B1LAotCQkgICBpbnQgdHJhY2VfaWR4LAotCQkgICBzaW1fZnB1ICpmMCkKLXsKLSAgZG91YmxlIGQ7Ci0gIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKLSAgaW50IGxhc3RfaW5wdXQ7Ci0KLSAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLwotICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKLSAgZCA9IHNpbV9mcHVfMmQgKGYwKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGRvdWJsZSksICZkKTsKLQotICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOwotfQkgICAgICAKLQotdm9pZAotdHJhY2VfcmVzdWx0X3N0cmluZzEgKFNJTV9ERVNDIHNkLAotCQkgICAgICBzaW1fY3B1ICpjcHUsCi0JCSAgICAgIGludCB0cmFjZV9pZHgsCi0JCSAgICAgIGNoYXIgKnMwKQotewotICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7Ci0gIGludCBsYXN0X2lucHV0OwotCi0gIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KLSAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7Ci0gIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9zdHJpbmcsIHN0cmxlbiAoczApICsgMSwgczApOwotCi0gIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Ci19CSAgICAgIAotCi12b2lkCi10cmFjZV9yZXN1bHRfd29yZDFfc3RyaW5nMSAoU0lNX0RFU0Mgc2QsCi0JCQkgICAgc2ltX2NwdSAqY3B1LAotCQkJICAgIGludCB0cmFjZV9pZHgsCi0JCQkgICAgdW5zaWduZWRfd29yZCByMCwKLQkJCSAgICBjaGFyICpzMCkKLXsKLSAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOwotICBpbnQgbGFzdF9pbnB1dDsKLQotICAvKiBBcHBlbmQgYW55IHJlc3VsdHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXRzICovCi0gIGxhc3RfaW5wdXQgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOwotICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwgJnIwKTsKLSAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3N0cmluZywgc3RybGVuIChzMCkgKyAxLCBzMCk7Ci0KLSAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKLX0JICAgICAgCi0MCi12b2lkCi10cmFjZV92cHJpbnRmIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gIGlmIChjcHUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoVFJBQ0VfRklMRSAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpICE9IE5VTEwpCi0JdmZwcmludGYgKFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChjcHUpKSwgZm10LCBhcCk7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2V2cHJpbnRmIChzZCwgZm10LCBhcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFRSQUNFX0ZJTEUgKFNUQVRFX1RSQUNFX0RBVEEgKHNkKSkgIT0gTlVMTCkKLQl2ZnByaW50ZiAoVFJBQ0VfRklMRSAoU1RBVEVfVFJBQ0VfREFUQSAoc2QpKSwgZm10LCBhcCk7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2V2cHJpbnRmIChzZCwgZm10LCBhcCk7Ci0gICAgfQotfQotCi0vKiBUaGUgZnVuY3Rpb24gdHJhY2Vfb25lX2luc24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGZ1bmN0aW9uIHBhaXIKLSAgIHRyYWNlX3ByZWZpeCgpICsgdHJhY2VfZ2VuZXJpYygpLiAgSXQgaXMgc3RpbGwgdXNlZC4gKi8KLXZvaWQKLXRyYWNlX29uZV9pbnNuIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgcGMsCi0JCWludCBsaW5lX3AsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW51bSwKLQkJY29uc3QgY2hhciAqcGhhc2Vfd29fY29sb24sIGNvbnN0IGNoYXIgKmZtdCwKLQkJLi4uKQotewotICB2YV9saXN0IGFwOwotICBjaGFyIHBoYXNlW1NJWkVfUEhBU0UrMl07Ci0KLSAgc3RybmNweSAocGhhc2UsIHBoYXNlX3dvX2NvbG9uLCBTSVpFX1BIQVNFKTsKLSAgc3RyY2F0IChwaGFzZSwgIjoiKTsKLQotICBpZiAoIWxpbmVfcCkKLSAgICB7Ci0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlLSpzICVzOiUtKmQgMHglLipseCAiLAotCQkgICAgU0laRV9QSEFTRSsxLCBwaGFzZSwKLQkJICAgIGZpbGVuYW1lLAotCQkgICAgU0laRV9MSU5FX05VTUJFUiwgbGluZW51bSwKLQkJICAgIFNJWkVfUEMsIChsb25nKXBjKTsKLSAgICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgICAgIHRyYWNlX3ZwcmludGYgKHNkLCBjcHUsIGZtdCwgYXApOwotICAgICAgdmFfZW5kIChhcCk7Ci0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICJcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzI1Nl07Ci0KLSAgICAgIGJ1ZlswXSA9IDA7Ci0gICAgICBpZiAoU1RBVEVfVEVYVF9TRUNUSU9OIChDUFVfU1RBVEUgKGNwdSkpCi0JICAmJiBwYyA+PSBTVEFURV9URVhUX1NUQVJUIChDUFVfU1RBVEUgKGNwdSkpCi0JICAmJiBwYyA8IFNUQVRFX1RFWFRfRU5EIChDUFVfU1RBVEUgKGNwdSkpKQotCXsKLQkgIGNvbnN0IGNoYXIgKnBjX2ZpbGVuYW1lID0gKGNvbnN0IGNoYXIgKikwOwotCSAgY29uc3QgY2hhciAqcGNfZnVuY3Rpb24gPSAoY29uc3QgY2hhciAqKTA7Ci0JICB1bnNpZ25lZCBpbnQgcGNfbGluZW51bSA9IDA7Ci0KLQkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKFNUQVRFX1BST0dfQkZEIChDUFVfU1RBVEUgKGNwdSkpLAotCQkJCSAgICAgU1RBVEVfVEVYVF9TRUNUSU9OIChDUFVfU1RBVEUgKGNwdSkpLAotCQkJCSAgICAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopIDAsCi0JCQkJICAgICBwYyAtIFNUQVRFX1RFWFRfU1RBUlQgKENQVV9TVEFURSAoY3B1KSksCi0JCQkJICAgICAmcGNfZmlsZW5hbWUsICZwY19mdW5jdGlvbiwgJnBjX2xpbmVudW0pKQotCSAgICB7Ci0JICAgICAgY2hhciAqcCA9IGJ1ZjsKLQkgICAgICBpZiAocGNfbGluZW51bSkKLQkJewotCQkgIHNwcmludGYgKHAsICIjJS0qZCAiLCBTSVpFX0xJTkVfTlVNQkVSLCBwY19saW5lbnVtKTsKLQkJICBwICs9IHN0cmxlbiAocCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzcHJpbnRmIChwLCAiJS0qcyAiLCBTSVpFX0xJTkVfTlVNQkVSKzEsICItLS0iKTsKLQkJICBwICs9IFNJWkVfTElORV9OVU1CRVIrMjsKLQkJfQotCi0JICAgICAgaWYgKHBjX2Z1bmN0aW9uKQotCQl7Ci0JCSAgc3ByaW50ZiAocCwgIiVzICIsIHBjX2Z1bmN0aW9uKTsKLQkJICBwICs9IHN0cmxlbiAocCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwY19maWxlbmFtZSkKLQkJewotCQkgIGNoYXIgKnEgPSAoY2hhciAqKSBzdHJyY2hyIChwY19maWxlbmFtZSwgJy8nKTsKLQkJICBzcHJpbnRmIChwLCAiJXMgIiwgKHEpID8gcSsxIDogcGNfZmlsZW5hbWUpOwotCQkgIHAgKz0gc3RybGVuIChwKTsKLQkJfQotCi0JICAgICAgaWYgKCpwID09ICcgJykKLQkJKnAgPSAnXDAnOwotCSAgICB9Ci0JfQotCi0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlLSpzIDB4JS4qeCAlLSouKnMgIiwKLQkJICAgIFNJWkVfUEhBU0UrMSwgcGhhc2UsCi0JCSAgICBTSVpFX1BDLCAodW5zaWduZWQpIHBjLAotCQkgICAgU0laRV9MT0NBVElPTiwgU0laRV9MT0NBVElPTiwgYnVmKTsKLSAgICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgICAgIHRyYWNlX3ZwcmludGYgKHNkLCBjcHUsIGZtdCwgYXApOwotICAgICAgdmFfZW5kIChhcCk7Ci0gICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICJcbiIpOwotICAgIH0KLX0KLQotdm9pZAotdHJhY2VfcHJpbnRmIFZQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBjb25zdCBjaGFyICpmbXQsIC4uLikpCi17Ci0jaWYgIWRlZmluZWQgX19TVERDX18gJiYgIWRlZmluZWQgQUxNT1NUX1NUREMKLSAgU0lNX0RFU0Mgc2Q7Ci0gIHNpbV9jcHUgKmNwdTsKLSAgY29uc3QgY2hhciAqZm10OwotI2VuZGlmCi0gIHZhX2xpc3QgYXA7Ci0KLSAgVkFfU1RBUlQgKGFwLCBmbXQpOwotI2lmICFkZWZpbmVkIF9fU1REQ19fICYmICFkZWZpbmVkIEFMTU9TVF9TVERDCi0gIHNkID0gdmFfYXJnIChhcCwgU0lNX0RFU0MpOwotICBjcHUgPSB2YV9hcmcgKGFwLCBzaW1fY3B1ICopOwotICBmbXQgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSAgdHJhY2VfdnByaW50ZiAoc2QsIGNwdSwgZm10LCBhcCk7Ci0KLSAgdmFfZW5kIChhcCk7Ci19Ci0KLXZvaWQKLWRlYnVnX3ByaW50ZiBWUEFSQU1TICgoc2ltX2NwdSAqY3B1LCBjb25zdCBjaGFyICpmbXQsIC4uLikpCi17Ci0jaWYgIWRlZmluZWQgX19TVERDX18gJiYgIWRlZmluZWQgQUxNT1NUX1NUREMKLSAgc2ltX2NwdSAqY3B1OwotICBjb25zdCBjaGFyICpmbXQ7Ci0jZW5kaWYKLSAgdmFfbGlzdCBhcDsKLQotICBWQV9TVEFSVCAoYXAsIGZtdCk7Ci0jaWYgIWRlZmluZWQgX19TVERDX18gJiYgIWRlZmluZWQgQUxNT1NUX1NUREMKLSAgY3B1ID0gdmFfYXJnIChhcCwgc2ltX2NwdSAqKTsKLSAgZm10ID0gdmFfYXJnIChhcCwgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIGlmIChDUFVfREVCVUdfRklMRSAoY3B1KSA9PSBOVUxMKQotICAgICgqIFNUQVRFX0NBTExCQUNLIChDUFVfU1RBVEUgKGNwdSkpLT5ldnByaW50Zl9maWx0ZXJlZCkKLSAgICAgIChTVEFURV9DQUxMQkFDSyAoQ1BVX1NUQVRFIChjcHUpKSwgZm10LCBhcCk7Ci0gIGVsc2UKLSAgICB2ZnByaW50ZiAoQ1BVX0RFQlVHX0ZJTEUgKGNwdSksIGZtdCwgYXApOwotCi0gIHZhX2VuZCAoYXApOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tdHJhY2UuaCBiL3NpbS9jb21tb24vc2ltLXRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDI3N2UuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKiBTaW11bGF0b3IgdHJhY2luZy9kZWJ1Z2dpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCBieSBzaW0tYmFzaWNzLmguICAqLwotCi0jaWZuZGVmIFNJTV9UUkFDRV9ICi0jZGVmaW5lIFNJTV9UUkFDRV9ICi0KLS8qIFN0YW5kYXJkIHRyYWNlYWJsZSBlbnRpdGllcy4gICovCi0KLWVudW0gewotICAvKiBUcmFjZSBpbnNuIGV4ZWN1dGlvbi4gICovCi0gIFRSQUNFX0lOU05fSURYID0gMSwKLQotICAvKiBUcmFjZSBpbnNuIGRlY29kaW5nLgotICAgICA/Pz8gVGhpcyBpcyBtb3JlIG9mIGEgc2ltdWxhdG9yIGRlYnVnZ2luZyBvcGVyYXRpb24gYW5kIG1pZ2h0IGJlc3QgYmUKLSAgICAgbW92ZWQgdG8gLS1kZWJ1Zy1kZWNvZGUuICAqLwotICBUUkFDRV9ERUNPREVfSURYLAotCi0gIC8qIFRyYWNlIGluc24gZXh0cmFjdGlvbi4KLSAgICAgPz8/IFRoaXMgaXMgbW9yZSBvZiBhIHNpbXVsYXRvciBkZWJ1Z2dpbmcgb3BlcmF0aW9uIGFuZCBtaWdodCBiZXN0IGJlCi0gICAgIG1vdmVkIHRvIC0tZGVidWctZXh0cmFjdC4gICovCi0gIFRSQUNFX0VYVFJBQ1RfSURYLAotCi0gIC8qIFRyYWNlIGluc24gZXhlY3V0aW9uIGJ1dCBpbmNsdWRlIGxpbmUgbnVtYmVycy4gICovCi0gIFRSQUNFX0xJTkVOVU1fSURYLAotCi0gIC8qIFRyYWNlIG1lbW9yeSBvcGVyYXRpb25zLgotICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFRSQUNFX0NPUkVfSURYIGlzIChJIHRoaW5rKSB0aGF0IHRoaXMKLSAgICAgaXMgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYSBoaWdoZXIgbGV2ZWwuICBUUkFDRV9DT1JFX0lEWCBhcHBsaWVzIHRvIHRoZQotICAgICBsb3cgbGV2ZWwgY29yZSBvcGVyYXRpb25zLiAgKi8KLSAgVFJBQ0VfTUVNT1JZX0lEWCwKLQotICAvKiBJbmNsdWRlIG1vZGVsIHBlcmZvcm1hbmNlIGRhdGEgaW4gdHJhY2luZyBvdXRwdXQuICAqLwotICBUUkFDRV9NT0RFTF9JRFgsCi0KLSAgLyogVHJhY2UgQUxVIG9wZXJhdGlvbnMuICAqLwotICBUUkFDRV9BTFVfSURYLAotCi0gIC8qIFRyYWNlIG1lbW9yeSBjb3JlIG9wZXJhdGlvbnMuICAqLwotICBUUkFDRV9DT1JFX0lEWCwKLQotICAvKiBUcmFjZSBldmVudHMuICAqLwotICBUUkFDRV9FVkVOVFNfSURYLAotCi0gIC8qIFRyYWNlIGZwdSBvcGVyYXRpb25zLiAgKi8KLSAgVFJBQ0VfRlBVX0lEWCwKLQotICAvKiBUcmFjZSBicmFuY2hpbmcuICAqLwotICBUUkFDRV9CUkFOQ0hfSURYLAotCi0gIC8qIEFkZCBpbmZvcm1hdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgc2ltdWxhdG9yIHRvIHRyYWNlIG91dHB1dC4gICovCi0gIFRSQUNFX0RFQlVHX0lEWCwKLQotICAvKiBTaW11bGF0b3Igc3BlY2lmaWMgdHJhY2UgYml0cyBiZWdpbiBoZXJlLiAgKi8KLSAgVFJBQ0VfTkVYVF9JRFgsCi0KLX07Ci0vKiBNYXhpbXVtIG51bWJlciBvZiB0cmFjZWFibGUgZW50aXRpZXMuICAqLwotI2lmbmRlZiBNQVhfVFJBQ0VfVkFMVUVTCi0jZGVmaW5lIE1BWF9UUkFDRV9WQUxVRVMgMzIKLSNlbmRpZgotCi0vKiBUaGUgLXQgb3B0aW9uIG9ubHkgcHJpbnRzIHVzZWZ1bCB2YWx1ZXMuICBJdCdzIGVhc3kgdG8gdHlwZSBhbmQgc2hvdWxkbid0Ci0gICBzcGxhdCBvbiB0aGUgc2NyZWVuIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIHN1biBtYWtpbmcgbm90aGluZyBlYXN5IHRvCi0gICBmaW5kLiAgKi8KLSNkZWZpbmUgVFJBQ0VfVVNFRlVMX01BU0sgXAotKCgxIDw8IFRSQUNFX0lOU05fSURYKSBcCi0gfCAoMSA8PCBUUkFDRV9MSU5FTlVNX0lEWCkgXAotIHwgKDEgPDwgVFJBQ0VfTUVNT1JZX0lEWCkgXAotIHwgKDEgPDwgVFJBQ0VfTU9ERUxfSURYKSBcCi0gfCAoMSA8PCBUUkFDRV9FVkVOVFNfSURYKSkKLQwKLS8qIE1hc2tzIHNvIFdJVEhfVFJBQ0UgY2FuIGhhdmUgc3ltYm9saWMgdmFsdWVzLgotICAgVGhlIGNhc2UgY2hvaWNlIGhlcmUgaXMgb24gcHVycG9zZS4gIFRoZSBsb3dlcmNhc2UgcGFydHMgYXJlIGFyZ3MgdG8KLSAgIC0td2l0aC10cmFjZS4gICovCi0jZGVmaW5lIFRSQUNFX2luc24gICAgICgxIDw8IFRSQUNFX0lOU05fSURYKQotI2RlZmluZSBUUkFDRV9kZWNvZGUgICAoMSA8PCBUUkFDRV9ERUNPREVfSURYKQotI2RlZmluZSBUUkFDRV9leHRyYWN0ICAoMSA8PCBUUkFDRV9FWFRSQUNUX0lEWCkKLSNkZWZpbmUgVFJBQ0VfbGluZW51bSAgKDEgPDwgVFJBQ0VfTElORU5VTV9JRFgpCi0jZGVmaW5lIFRSQUNFX21lbW9yeSAgICgxIDw8IFRSQUNFX01FTU9SWV9JRFgpCi0jZGVmaW5lIFRSQUNFX21vZGVsICAgICgxIDw8IFRSQUNFX01PREVMX0lEWCkKLSNkZWZpbmUgVFJBQ0VfYWx1ICAgICAgKDEgPDwgVFJBQ0VfQUxVX0lEWCkKLSNkZWZpbmUgVFJBQ0VfY29yZSAgICAgKDEgPDwgVFJBQ0VfQ09SRV9JRFgpCi0jZGVmaW5lIFRSQUNFX2V2ZW50cyAgICgxIDw8IFRSQUNFX0VWRU5UU19JRFgpCi0jZGVmaW5lIFRSQUNFX2ZwdSAgICAgICgxIDw8IFRSQUNFX0ZQVV9JRFgpCi0jZGVmaW5lIFRSQUNFX2JyYW5jaCAgICgxIDw8IFRSQUNFX0JSQU5DSF9JRFgpCi0jZGVmaW5lIFRSQUNFX2RlYnVnICAgICgxIDw8IFRSQUNFX0RFQlVHX0lEWCkKLQotLyogUHJlcHJvY2Vzc29yIG1hY3JvcyB0byBzaW1wbGlmeSB0ZXN0cyBvZiBXSVRIX1RSQUNFLiAgKi8KLSNkZWZpbmUgV0lUSF9UUkFDRV9JTlNOX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9pbnNuKQotI2RlZmluZSBXSVRIX1RSQUNFX0RFQ09ERV9QCShXSVRIX1RSQUNFICYgVFJBQ0VfZGVjb2RlKQotI2RlZmluZSBXSVRIX1RSQUNFX0VYVFJBQ1RfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2V4dHJhY3QpCi0jZGVmaW5lIFdJVEhfVFJBQ0VfTElORU5VTV9QCShXSVRIX1RSQUNFICYgVFJBQ0VfbGluZW51bSkKLSNkZWZpbmUgV0lUSF9UUkFDRV9NRU1PUllfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX21lbW9yeSkKLSNkZWZpbmUgV0lUSF9UUkFDRV9NT0RFTF9QCShXSVRIX1RSQUNFICYgVFJBQ0VfbW9kZWwpCi0jZGVmaW5lIFdJVEhfVFJBQ0VfQUxVX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9hbHUpCi0jZGVmaW5lIFdJVEhfVFJBQ0VfQ09SRV9QCShXSVRIX1RSQUNFICYgVFJBQ0VfY29yZSkKLSNkZWZpbmUgV0lUSF9UUkFDRV9FVkVOVFNfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2V2ZW50cykKLSNkZWZpbmUgV0lUSF9UUkFDRV9GUFVfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2ZwdSkKLSNkZWZpbmUgV0lUSF9UUkFDRV9CUkFOQ0hfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2JyYW5jaCkKLSNkZWZpbmUgV0lUSF9UUkFDRV9ERUJVR19QCShXSVRIX1RSQUNFICYgVFJBQ0VfZGVidWcpCi0KLS8qIFRyYWNpbmcgaW5zdGFsbCBoYW5kbGVyLiAgKi8KLU1PRFVMRV9JTlNUQUxMX0ZOIHRyYWNlX2luc3RhbGw7Ci0MCi0vKiBTdHJ1Y3QgY29udGFpbmluZyBhbGwgc3lzdGVtIGFuZCBjcHUgdHJhY2UgZGF0YS4KLQotICAgU3lzdGVtIHRyYWNlIGRhdGEgaXMgc3RvcmVkIHdpdGggdGhlIGFzc29jaWF0ZWQgbW9kdWxlLgotICAgU3lzdGVtIGFuZCBjcHUgdHJhY2luZyBtdXN0IHNoYXJlIHRoZSBzYW1lIHNwYWNlIG9mIGJpdG1hc2tzIGFzIHRoZXkKLSAgIGFyZSBhcmd1bWVudHMgdG8gLS13aXRoLXRyYWNlLiAgT25lIGNvdWxkIGhhdmUgLS13aXRoLXRyYWNlIGFuZAotICAgLS13aXRoLWNwdS10cmFjZSBvciBzb21lIHN1Y2ggYnV0IHRoYXQncyBhbiBvdmVyLWNvbXBsaWNhdGlvbiBhdCB0aGlzIHBvaW50Ci0gICBpbiB0aW1lLiAgQWxzbywgdGhlcmUgbWF5IGJlIG9jY2FzaW9ucyB3aGVyZSBzeXN0ZW0gYW5kIGNwdSB0cmFjaW5nIG1heQotICAgd2lzaCB0byBzaGFyZSBhIG5hbWUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfdHJhY2VfZGF0YSB7Ci0KLSAgLyogR2xvYmFsIHN1bW1hcnkgb2YgYWxsIHRoZSBjdXJyZW50IHRyYWNlIG9wdGlvbnMgKi8KLSAgY2hhciB0cmFjZV9hbnlfcDsKLQotICAvKiBCb29sZWFuIGFycmF5IG9mIHNwZWNpZmllZCB0cmFjaW5nIGZsYWdzLiAgKi8KLSAgLyogPz8/IEl0J3Mgbm90IGNsZWFyIHRoYXQgdXNpbmcgYW4gYXJyYXkgdnMgYSBiaXQgbWFzayBpcyBmYXN0ZXIuCi0gICAgIENvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIG9uZSB3YW50cyB0byB0ZXN0IHdoZXRoZXIgYW55IG9mIHNldmVyYWwgYml0cwotICAgICBhcmUgc2V0LiAgKi8KLSAgY2hhciB0cmFjZV9mbGFnc1tNQVhfVFJBQ0VfVkFMVUVTXTsKLSNkZWZpbmUgVFJBQ0VfRkxBR1ModCkgKCh0KS0+dHJhY2VfZmxhZ3MpCi0KLSAgLyogVHJhY2luZyBvdXRwdXQgZ29lcyB0byB0aGlzIG9yIHN0ZGVyciBpZiBOVUxMLgotICAgICBXZSBjYW4ndCBzdG9yZSBgc3RkZXJyJyBoZXJlIGFzIHN0ZGVyciBnb2VzIHRocm91Z2ggYSBjYWxsYmFjay4gICovCi0gIEZJTEUgKnRyYWNlX2ZpbGU7Ci0jZGVmaW5lIFRSQUNFX0ZJTEUodCkgKCh0KS0+dHJhY2VfZmlsZSkKLQotICAvKiBCdWZmZXIgdG8gc3RvcmUgdGhlIHByZWZpeCB0byBiZSBwcmludGVkIGJlZm9yZSBhbnkgdHJhY2UgbGluZS4gICovCi0gIGNoYXIgdHJhY2VfcHJlZml4WzI1Nl07Ci0jZGVmaW5lIFRSQUNFX1BSRUZJWCh0KSAoKHQpLT50cmFjZV9wcmVmaXgpCi0KLSAgLyogQnVmZmVyIHRvIHNhdmUgdGhlIGlucHV0cyBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBVc2UgYQotICAgICB1bmlvbiB0byBmb3JjZSB0aGUgYnVmZmVyIGludG8gY29ycmVjdCBhbGlnbm1lbnQgKi8KLSAgdW5pb24gewotICAgIHVuc2lnbmVkOCBpODsKLSAgICB1bnNpZ25lZDE2IGkxNjsKLSAgICB1bnNpZ25lZDMyIGkzMjsKLSAgICB1bnNpZ25lZDY0IGk2NDsKLSAgfSB0cmFjZV9pbnB1dF9kYXRhWzE2XTsKLSAgdW5zaWduZWQ4IHRyYWNlX2lucHV0X2ZtdFsxNl07Ci0gIHVuc2lnbmVkOCB0cmFjZV9pbnB1dF9zaXplWzE2XTsKLSAgaW50IHRyYWNlX2lucHV0X2lkeDsKLSNkZWZpbmUgVFJBQ0VfSU5QVVRfREFUQSh0KSAoKHQpLT50cmFjZV9pbnB1dF9kYXRhKQotI2RlZmluZSBUUkFDRV9JTlBVVF9GTVQodCkgKCh0KS0+dHJhY2VfaW5wdXRfZm10KQotI2RlZmluZSBUUkFDRV9JTlBVVF9TSVpFKHQpICgodCktPnRyYWNlX2lucHV0X3NpemUpCi0jZGVmaW5lIFRSQUNFX0lOUFVUX0lEWCh0KSAoKHQpLT50cmFjZV9pbnB1dF9pZHgpCi0KLSAgLyogQ2F0ZWdvcnkgb2YgdHJhY2UgYmVpbmcgcGVyZm9ybWVkICovCi0gIGludCB0cmFjZV9pZHg7Ci0jZGVmaW5lIFRSQUNFX0lEWCh0KSAoKHQpLT50cmFjZV9pZHgpCi0KLSAgLyogVHJhY2UgcmFuZ2UuCi0gICAgID8/PyBOb3QgYWxsIGNwdSdzIHN1cHBvcnQgdGhpcy4gICovCi0gIEFERFJfUkFOR0UgcmFuZ2U7Ci0jZGVmaW5lIFRSQUNFX1JBTkdFKHQpICgmICh0KS0+cmFuZ2UpCi19IFRSQUNFX0RBVEE7Ci0MCi0vKiBTeXN0ZW0gdHJhY2luZyBzdXBwb3J0LiAgKi8KLQotI2RlZmluZSBTVEFURV9UUkFDRV9GTEFHUyhzZCkgVFJBQ0VfRkxBR1MgKFNUQVRFX1RSQUNFX0RBVEEgKHNkKSkKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRyYWNpbmcgb2YgSURYIGlzIGVuYWJsZWQgZm9yIG5vbi1jcHUgc3BlY2lmaWMKLSAgIGNvbXBvbmVudHMuICBUaGUgIlMiIGluICJTVFJBQ0UiIHJlZmVycyB0byAiU3lzdGVtIi4gICovCi0jZGVmaW5lIFNUUkFDRV9QKHNkLGlkeCkgXAotKChXSVRIX1RSQUNFICYgKDEgPDwgKGlkeCkpKSAhPSAwIFwKLSAmJiBTVEFURV9UUkFDRV9GTEFHUyAoc2QpW2lkeF0gIT0gMCkKLQotLyogTm9uLXplcm8gaWYgLS10cmFjZS08eHh4eD4gd2FzIHNwZWNpZmllZCBmb3IgU0QuICAqLwotI2RlZmluZSBTVFJBQ0VfREVCVUdfUChzZCkJU1RSQUNFX1AgKHNkLCBUUkFDRV9ERUJVR19JRFgpCi0MCi0vKiBDUFUgdHJhY2luZyBzdXBwb3J0LiAgKi8KLQotI2RlZmluZSBDUFVfVFJBQ0VfRkxBR1MoY3B1KSBUUkFDRV9GTEFHUyAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpCi0KLS8qIFJldHVybiBub24temVybyBpZiB0cmFjaW5nIG9mIElEWCBpcyBlbmFibGVkIGZvciBDUFUuICAqLwotI2RlZmluZSBUUkFDRV9QKGNwdSxpZHgpIFwKLSgoV0lUSF9UUkFDRSAmICgxIDw8IChpZHgpKSkgIT0gMCBcCi0gJiYgQ1BVX1RSQUNFX0ZMQUdTIChjcHUpW2lkeF0gIT0gMCkKLQotLyogTm9uLXplcm8gaWYgLS10cmFjZS08eHh4eD4gd2FzIHNwZWNpZmllZCBmb3IgQ1BVLiAgKi8KLSNkZWZpbmUgVFJBQ0VfQU5ZX1AoY3B1KQkoKFdJVEhfVFJBQ0UpICYmIChDUFVfVFJBQ0VfREFUQSAoY3B1KS0+dHJhY2VfYW55X3ApKQotI2RlZmluZSBUUkFDRV9JTlNOX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0lOU05fSURYKQotI2RlZmluZSBUUkFDRV9ERUNPREVfUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfREVDT0RFX0lEWCkKLSNkZWZpbmUgVFJBQ0VfRVhUUkFDVF9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9FWFRSQUNUX0lEWCkKLSNkZWZpbmUgVFJBQ0VfTElORU5VTV9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9MSU5FTlVNX0lEWCkKLSNkZWZpbmUgVFJBQ0VfTUVNT1JZX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX01FTU9SWV9JRFgpCi0jZGVmaW5lIFRSQUNFX01PREVMX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX01PREVMX0lEWCkKLSNkZWZpbmUgVFJBQ0VfQUxVX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0FMVV9JRFgpCi0jZGVmaW5lIFRSQUNFX0NPUkVfUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfQ09SRV9JRFgpCi0jZGVmaW5lIFRSQUNFX0VWRU5UU19QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9FVkVOVFNfSURYKQotI2RlZmluZSBUUkFDRV9GUFVfUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfRlBVX0lEWCkKLSNkZWZpbmUgVFJBQ0VfQlJBTkNIX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0JSQU5DSF9JRFgpCi0jZGVmaW5lIFRSQUNFX0RFQlVHX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0RFQlVHX0lEWCkKLQwKLS8qIFRyYWNlaW5nIGZ1bmN0aW9ucy4KLQotICovCi0KLS8qIFByaW1lIHRoZSB0cmFjZSBidWZmZXJzIHJlYWR5IGZvciBhbnkgdHJhY2Ugb3V0cHV0LgotICAgTXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gYW55IG90aGVyIHRyYWNlIG9wZXJhdGlvbiAqLwotZXh0ZXJuIHZvaWQgdHJhY2VfcHJlZml4IFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgc2ltX2NwdSAqY3B1LAotCQkJCSAgc2ltX2NpYSBjaWEsCi0JCQkJICBhZGRyZXNzX3dvcmQgcGMsCi0JCQkJICBpbnQgcHJpbnRfbGluZW51bV9wLAotCQkJCSAgY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCQkJCSAgaW50IGxpbmVfbnIsCi0JCQkJICBjb25zdCBjaGFyICpmbXQsCi0JCQkJICAuLi4pKQotICAgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCA4LCA5KSkpOwotCi0vKiBHZW5lcmljIHRyYWNlIHByaW50LCBhc3N1bWVzIHRyYWNlX3ByZWZpeCgpIGhhcyBiZWVuIGNhbGxlZCAqLwotCi1leHRlcm4gdm9pZCB0cmFjZV9nZW5lcmljIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgIGNvbnN0IGNoYXIgKmZtdCwKLQkJCQkgICAuLi4pKQotICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKLQotLyogVHJhY2UgYSB2YXJ5aW5nIG51bWJlciBvZiB3b3JkIHNpemVkIGlucHV0cy9vdXRwdXRzLiAgdHJhY2VfcmVzdWx0KgotICAgbXVzdCBiZSBjYWxsZWQgdG8gY2xvc2UgdGhlIHRyYWNlIG9wZXJhdGlvbi4gKi8KLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXQwIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgc2ltX2NwdSAqY3B1LAotCQkJCSAgaW50IHRyYWNlX2lkeCkpOwotCi1leHRlcm4gdm9pZCB0cmFjZV9pbnB1dF93b3JkMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgICAgc2ltX2NwdSAqY3B1LAotCQkJCSAgICAgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQwKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX2lucHV0X3dvcmQyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgICAgICBzaW1fY3B1ICpjcHUsCi0JCQkJICAgICAgIGludCB0cmFjZV9pZHgsCi0JCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZDAsCi0JCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZDEpKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfd29yZDMgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCi0JCQkJICAgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgICAgaW50IHRyYWNlX2lkeCwKLQkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMCwKLQkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMSwKLQkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMikpOwotCi1leHRlcm4gdm9pZCB0cmFjZV9pbnB1dF93b3JkNCBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgICAgc2ltX2NwdSAqY3B1LAotCQkJCSAgICAgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQwLAotCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQxLAotCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQyLAotCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQzKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX2lucHV0X2FkZHIxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgICAgICBzaW1fY3B1ICpjcHUsCi0JCQkJICAgICAgIGludCB0cmFjZV9pZHgsCi0JCQkJICAgICAgIGFkZHJlc3Nfd29yZCBkMCkpOwotCi1leHRlcm4gdm9pZCB0cmFjZV9pbnB1dF9ib29sMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgICAgc2ltX2NwdSAqY3B1LAotCQkJCSAgICAgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgICAgICBpbnQgZDApKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfZnAxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgICAgc2ltX2NwdSAqY3B1LAotCQkJCSAgICAgaW50IHRyYWNlX2lkeCwKLQkJCQkgICAgIGZwX3dvcmQgZjApKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfZnAyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgICAgc2ltX2NwdSAqY3B1LAotCQkJCSAgICAgaW50IHRyYWNlX2lkeCwKLQkJCQkgICAgIGZwX3dvcmQgZjAsCi0JCQkJICAgICBmcF93b3JkIGYxKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwMyBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgIGludCB0cmFjZV9pZHgsCi0JCQkJICAgICBmcF93b3JkIGYwLAotCQkJCSAgICAgZnBfd29yZCBmMSwKLQkJCQkgICAgIGZwX3dvcmQgZjIpKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfZnB1MSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgIGludCB0cmFjZV9pZHgsCi0JCQkJICAgICBzdHJ1Y3QgX3NpbV9mcHUgKmYwKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwdTIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCi0JCQkJICAgICBzaW1fY3B1ICpjcHUsCi0JCQkJICAgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgICAgc3RydWN0IF9zaW1fZnB1ICpmMCwKLQkJCQkgICAgIHN0cnVjdCBfc2ltX2ZwdSAqZjEpKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfZnB1MyBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgIGludCB0cmFjZV9pZHgsCi0JCQkJICAgICBzdHJ1Y3QgX3NpbV9mcHUgKmYwLAotCQkJCSAgICAgc3RydWN0IF9zaW1fZnB1ICpmMSwKLQkJCQkgICAgIHN0cnVjdCBfc2ltX2ZwdSAqZjIpKTsKLQotLyogT3RoZXIgdHJhY2VfaW5wdXR7XzxmbXQ+PG5yLWlucHV0cz59IGZ1bmN0aW9ucyBjYW4gZ28gaGVyZSAqLwotCi1leHRlcm4gdm9pZCB0cmFjZV9yZXN1bHQwIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICBpbnQgdHJhY2VfaWR4KSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF93b3JkMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkJc2ltX2NwdSAqY3B1LAotCQkJCQlpbnQgdHJhY2VfaWR4LAotCQkJCQl1bnNpZ25lZF93b3JkIHIwKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF93b3JkMiBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkJc2ltX2NwdSAqY3B1LAotCQkJCQlpbnQgdHJhY2VfaWR4LAotCQkJCQl1bnNpZ25lZF93b3JkIHIwLAotCQkJCQl1bnNpZ25lZF93b3JkIHIxKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF93b3JkNCBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkJc2ltX2NwdSAqY3B1LAotCQkJCQlpbnQgdHJhY2VfaWR4LAotCQkJCQl1bnNpZ25lZF93b3JkIHIwLAotCQkJCQl1bnNpZ25lZF93b3JkIHIxLAotCQkJCQl1bnNpZ25lZF93b3JkIHIyLAotCQkJCQl1bnNpZ25lZF93b3JkIHIzKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF9ib29sMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkJc2ltX2NwdSAqY3B1LAotCQkJCQlpbnQgdHJhY2VfaWR4LAotCQkJCQlpbnQgcjApKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0X2FkZHIxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCQlzaW1fY3B1ICpjcHUsCi0JCQkJCWludCB0cmFjZV9pZHgsCi0JCQkJCWFkZHJlc3Nfd29yZCByMCkpOwotCi1leHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfZnAxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCSAgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgICBpbnQgdHJhY2VfaWR4LAotCQkJCSAgICAgIGZwX3dvcmQgZjApKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0X2ZwMiBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkgICAgICBzaW1fY3B1ICpjcHUsCi0JCQkJICAgICAgaW50IHRyYWNlX2lkeCwKLQkJCQkgICAgICBmcF93b3JkIGYwLAotCQkJCSAgICAgIGZwX3dvcmQgZjEpKTsKLQotZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0X2ZwdTEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCi0JCQkJICAgICAgIHNpbV9jcHUgKmNwdSwKLQkJCQkgICAgICAgaW50IHRyYWNlX2lkeCwKLQkJCQkgICAgICAgc3RydWN0IF9zaW1fZnB1ICpmMCkpOwotCi1leHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfc3RyaW5nMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKLQkJCQkJICBzaW1fY3B1ICpjcHUsCi0JCQkJCSAgaW50IHRyYWNlX2lkeCwKLQkJCQkJICBjaGFyICpzdHIwKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF93b3JkMV9zdHJpbmcxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAotCQkJCQkJc2ltX2NwdSAqY3B1LAotCQkJCQkJaW50IHRyYWNlX2lkeCwKLQkJCQkJCXVuc2lnbmVkX3dvcmQgcjAsCi0JCQkJCQljaGFyICpzMCkpOwotCi0vKiBPdGhlciB0cmFjZV9yZXN1bHR7Xzx0eXBlPjxuci1yZXN1bHRzPn0gKi8KLQotCi0vKiBNYWNybydzIGZvciB0cmFjaW5nIEFMVSBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQwKCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAotICAgIHRyYWNlX2lucHV0MCAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCk7IFwKLX0gd2hpbGUgKDApCi0gICAgCi0jZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDEoVjApIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9pbnB1dF93b3JkMSAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCwgKFYwKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMihWMCxWMSkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAotICAgIHRyYWNlX2lucHV0X3dvcmQyIChTRCwgQ1BVLCBUUkFDRV9BTFVfSURYLCAoVjApLCAoVjEpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQzKFYwLFYxLFYyKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfaW5wdXRfd29yZDMgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgsIChWMCksIChWMSksIChWMikpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDQoVjAsVjEsVjIsVjMpIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9pbnB1dF93b3JkNCAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCwgKFYwKSwgKFYxKSwgKFYyKSwgKFYzKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfQUxVX1JFU1VMVChSMCkgVFJBQ0VfQUxVX1JFU1VMVDEoUjApCi0KLSNkZWZpbmUgVFJBQ0VfQUxVX1JFU1VMVDAoKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfcmVzdWx0MCAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfQUxVX1JFU1VMVDEoUjApIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9yZXN1bHRfd29yZDEgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgsIChSMCkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0FMVV9SRVNVTFQyKFIwLFIxKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfcmVzdWx0X3dvcmQyIChTRCwgQ1BVLCBUUkFDRV9BTFVfSURYLCAoUjApLCAoUjEpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkFDRV9BTFVfUkVTVUxUNChSMCxSMSxSMixSMykgXAotZG8geyBcCi0gIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAotICAgIHRyYWNlX3Jlc3VsdF93b3JkNCAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCwgKFIwKSwgKFIxKSwgKFIyKSwgKFIzKSk7IFwKLX0gd2hpbGUgKDApCi0KLQotLyogTWFjcm8ncyBmb3IgdHJhY2luZyBGUFUgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgVFJBQ0VfRlBfSU5QVVQwKCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAotICAgIHRyYWNlX2lucHV0MCAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCk7IFwKLX0gd2hpbGUgKDApCi0gICAgCi0jZGVmaW5lIFRSQUNFX0ZQX0lOUFVUMShWMCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAotICAgIHRyYWNlX2lucHV0X2ZwMSAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCwgKFYwKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfRlBfSU5QVVQyKFYwLFYxKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfaW5wdXRfZnAyIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoVjApLCAoVjEpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkFDRV9GUF9JTlBVVDMoVjAsVjEsVjIpIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfRlBVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9pbnB1dF9mcDMgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgsIChWMCksIChWMSksIChWMikpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0ZQX0lOUFVUX1dPUkQxKFYwKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfaW5wdXRfd29yZDEgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgsIChWMCkpOyBcCi19IHdoaWxlICgwKQotICAgIAotI2RlZmluZSBUUkFDRV9GUF9SRVNVTFQoUjApIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfRlBVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9yZXN1bHRfZnAxIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoUjApKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkFDRV9GUF9SRVNVTFQyKFIwLFIxKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfcmVzdWx0X2ZwMiAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCwgKFIwKSwgKFIxKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfRlBfUkVTVUxUX0JPT0woUjApIFwKLWRvIHsgXAotICBpZiAoVFJBQ0VfRlBVX1AgKENQVSkpIFwKLSAgICB0cmFjZV9yZXN1bHRfYm9vbDEgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgsIChSMCkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0ZQX1JFU1VMVF9XT1JEKFIwKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCi0gICAgdHJhY2VfcmVzdWx0X3dvcmQxIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoUjApKTsgXAotfSB3aGlsZSAoMCkKLQotCi0vKiBNYWNyb3MgZm9yIHRyYWNpbmcgYnJhbmNoZXMgKi8KLQotI2RlZmluZSBUUkFDRV9CUkFOQ0hfSU5QVVQoQ09ORCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgXAotICAgIHRyYWNlX2lucHV0X2Jvb2wxIChTRCwgQ1BVLCBUUkFDRV9CUkFOQ0hfSURYLCAoQ09ORCkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0JSQU5DSF9SRVNVTFQoREVTVCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgXAotICAgIHRyYWNlX3Jlc3VsdF9hZGRyMSAoU0QsIENQVSwgVFJBQ0VfQlJBTkNIX0lEWCwgKERFU1QpKTsgXAotfSB3aGlsZSAoMCkKLQotDAotLyogVGhlIGZ1bmN0aW9uIHRyYWNlX29uZV9pbnNuIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBmdW5jdGlvbiBwYWlyCi0gICB0cmFjZV9wcmVmaXgoKSArIHRyYWNlX2dlbmVyaWMoKSAqLwotZXh0ZXJuIHZvaWQgdHJhY2Vfb25lX2luc24gUEFSQU1TICgoU0lNX0RFU0Mgc2QsCi0JCQkJICAgIHNpbV9jcHUgKiBjcHUsCi0JCQkJICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JCQkJICAgIGludCBwcmludF9saW5lbnVtX3AsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkJCQkgICAgaW50IGxpbmVfbnIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnVuaXQsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkJCQkgICAgLi4uKSkKLSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDgsIDkpKSk7Ci0KLWV4dGVybiB2b2lkIHRyYWNlX3ByaW50ZiBQQVJBTVMgKChTSU1fREVTQywgc2ltX2NwdSAqLCBjb25zdCBjaGFyICosIC4uLikpCi0gICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotCi1leHRlcm4gdm9pZCB0cmFjZV92cHJpbnRmIFBBUkFNUyAoKFNJTV9ERVNDLCBzaW1fY3B1ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0vKiBEZWJ1ZyBzdXBwb3J0LgotICAgVGhpcyBpcyBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgZW5vdWdoIG9mIGl0IHRvIGp1c3RpZnkKLSAgIGEgc2ltLWRlYnVnLmguICAqLwotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgZGVidWdnaW5nIG9mIElEWCBmb3IgQ1BVIGlzIGVuYWJsZWQuICAqLwotI2RlZmluZSBERUJVR19QKGNwdSwgaWR4KSBcCi0oKFdJVEhfREVCVUcgJiAoMSA8PCAoaWR4KSkpICE9IDAgXAotICYmIENQVV9ERUJVR19GTEFHUyAoY3B1KVtpZHhdICE9IDApCi0KLS8qIE5vbi16ZXJvIGlmICItLWRlYnVnLWluc24iIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIERFQlVHX0lOU05fUChjcHUpIERFQlVHX1AgKGNwdSwgREVCVUdfSU5TTl9JRFgpCi0KLWV4dGVybiB2b2lkIGRlYnVnX3ByaW50ZiBQQVJBTVMgKChzaW1fY3B1ICosIGNvbnN0IGNoYXIgKiwgLi4uKSkKLSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0KLSNlbmRpZiAvKiBTSU1fVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tdHlwZXMuaCBiL3NpbS9jb21tb24vc2ltLXR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmM1OTguLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0tdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBwc2ltIChtb2RlbCBvZiB0aGUgUG93ZXJQQyh0bSkgYXJjaGl0ZWN0dXJlKQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAtLQotCi0gICBQb3dlclBDIGlzIGEgdHJhZGVtYXJrIG9mIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24uICovCi0KLQotI2lmbmRlZiBTSU1fVFlQRVNfSAotLyogI2RlZmluZSBTSU1fVFlQRVNfSCAqLwotCi0vKiBJTlRFR0VSIFFVQU5USVRJRVM6Ci0KLSAgIFRZUEVTOgotCi0gICAgIHNpZ25lZCogICAgc2lnbmVkIHR5cGUgb2YgdGhlIGdpdmVuIHNpemUKLSAgICAgdW5zaWduZWQqICBUaGUgY29ycmVzcG9uZGluZyBpbnNpZ25lZCB0eXBlCi0KLSAgIFNJWkVTCi0KLSAgICAgKk5OCVNpemUgYmFzZWQgb24gdGhlIG51bWJlciBvZiBiaXRzCi0gICAgICpfTk4gICAgICAgU2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBieXRlcwotICAgICAqX3dvcmQgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncyB3b3JkCi0gICAgIAkJd29yZCBzaXplICgzMi82NCBiaXRzKQotICAgICAqX2NlbGwgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncwotICAgICAJCUlFRUUgMTI3NSBjZWxsIHNpemUgKGFsbW9zdCBhbHdheXMgMzIgYml0cykKLQotKi8KLQotCi0jaWYgIWRlZmluZWQgKFNJTV9UWVBFU19IKSAmJiBkZWZpbmVkIChfX0dOVUNfXykKLSNkZWZpbmUgU0lNX1RZUEVTX0gKLQotLyogYml0IGJhc2VkICovCi0KLSNkZWZpbmUgVU5TSUdORUQzMihYKSAoKHVuc2lnbmVkMzIpIFgjI1VMKQotI2RlZmluZSBVTlNJR05FRDY0KFgpICgodW5zaWduZWQ2NCkgWCMjVUxMKQotCi0jZGVmaW5lIFNJR05FRDMyKFgpICgoc2lnbmVkMzIpIFgjI0wpCi0jZGVmaW5lIFNJR05FRDY0KFgpICgoc2lnbmVkNjQpIFgjI0xMKQotCi10eXBlZGVmIHNpZ25lZCBpbnQgc2lnbmVkOCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fUUlfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCBzaWduZWQxNiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCBzaWduZWQzMiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCBzaWduZWQ2NCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fRElfXykpKTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQ4IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19RSV9fKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQxNiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkMzIgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1bnNpZ25lZDY0IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ESV9fKSkpOwotCi10eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkNjQgYVsyXTsgfSB1bnNpZ25lZDEyODsKLXR5cGVkZWYgc3RydWN0IHsgc2lnbmVkNjQgYVsyXTsgfSBzaWduZWQxMjg7Ci0KLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZCAoU0lNX1RZUEVTX0gpICYmIGRlZmluZWQgKF9NU0NfVkVSKQotI2RlZmluZSBTSU1fVFlQRVNfSAotCi0vKiBiaXQgYmFzZWQgKi8KLQotI2RlZmluZSBVTlNJR05FRDMyKFgpIChYIyN1aTMyKQotI2RlZmluZSBVTlNJR05FRDY0KFgpIChYIyN1aTY0KQotCi0jZGVmaW5lIFNJR05FRDMyKFgpIChYIyNpMzIpCi0jZGVmaW5lIFNJR05FRDY0KFgpIChYIyNpNjQpCi0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkODsKLXR5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2OwotdHlwZWRlZiBzaWduZWQgaW50IHNpZ25lZDMyOwotdHlwZWRlZiBzaWduZWQgX19pbnQ2NCBzaWduZWQ2NDsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQ4OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkMzI7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdW5zaWduZWQ2NDsKLQotdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZDY0IGFbMl07IH0gdW5zaWduZWQxMjg7Ci10eXBlZGVmIHN0cnVjdCB7IHNpZ25lZDY0IGFbMl07IH0gc2lnbmVkMTI4OwotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotCi0jaWYgIWRlZmluZWQgKFNJTV9UWVBFU19IKQotI2RlZmluZSBTSU1fVFlQRVNfSAotCi0vKiBiaXQgYmFzZWQgKi8KLQotI2RlZmluZSBVTlNJR05FRDMyKFgpIChYIyNVTCkKLSNkZWZpbmUgVU5TSUdORUQ2NChYKSAoWCMjVUxMKQotCi0jZGVmaW5lIFNJR05FRDMyKFgpIChYIyNMKQotI2RlZmluZSBTSUdORUQ2NChYKSAoWCMjTEwpCi0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkODsKLXR5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2OwotI2lmIGRlZmluZWQgKF9fQUxQSEFfXykKLXR5cGVkZWYgc2lnbmVkIGludCB1bnNpZ25lZDMyOwotdHlwZWRlZiBzaWduZWQgbG9uZyB1bnNpZ25lZDY0OwotI2Vsc2UKLXR5cGVkZWYgc2lnbmVkIGxvbmcgdW5zaWduZWQzMjsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZDY0OwotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1bnNpZ25lZDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuc2lnbmVkMTY7Ci0jaWYgZGVmaW5lZCAoX19BTFBIQV9fKQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQzMjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDY0OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWQ2NDsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkNjQgYVsyXTsgfSB1bnNpZ25lZDEyODsKLXR5cGVkZWYgc3RydWN0IHsgc2lnbmVkNjQgYVsyXTsgfSBzaWduZWQxMjg7Ci0KLSNlbmRpZgotCi0KLS8qIGJ5dGUgYmFzZWQgKi8KLQotdHlwZWRlZiBzaWduZWQ4IHNpZ25lZF8xOwotdHlwZWRlZiBzaWduZWQxNiBzaWduZWRfMjsKLXR5cGVkZWYgc2lnbmVkMzIgc2lnbmVkXzQ7Ci10eXBlZGVmIHNpZ25lZDY0IHNpZ25lZF84OwotdHlwZWRlZiBzaWduZWQxMjggc2lnbmVkXzE2OwotCi10eXBlZGVmIHVuc2lnbmVkOCB1bnNpZ25lZF8xOwotdHlwZWRlZiB1bnNpZ25lZDE2IHVuc2lnbmVkXzI7Ci10eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfNDsKLXR5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF84OwotdHlwZWRlZiB1bnNpZ25lZDEyOCB1bnNpZ25lZF8xNjsKLQotCi0vKiBmb3IgZ2VuZXJhbCB3b3JrLCB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkICovCi0vKiB1bnNpZ25lZDogPj0gMzIgYml0cyAqLwotLyogc2lnbmVkOiAgID49IDMyIGJpdHMgKi8KLS8qIGxvbmc6ICAgICA+PSAzMiBiaXRzLCBzaWduIHVuZGVmaW5lZCAqLwotLyogaW50OiAgICAgIHNtYWxsIGluZGljYXRvciAqLwotCi0vKiB0YXJnZXQgYXJjaGl0ZWN0dXJlIGJhc2VkICovCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLXR5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF93b3JkOwotdHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfd29yZDsKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi10eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfd29yZDsKLXR5cGVkZWYgc2lnbmVkMzIgc2lnbmVkX3dvcmQ7Ci0jZW5kaWYKLQotCi0vKiBPdGhlciBpbnN0cnVjdGlvbnMgKi8KLSNpZiAoV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFID09IDY0KQotdHlwZWRlZiB1bnNpZ25lZDY0IHVuc2lnbmVkX2FkZHJlc3M7Ci10eXBlZGVmIHNpZ25lZDY0IHNpZ25lZF9hZGRyZXNzOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRSA9PSAzMikKLXR5cGVkZWYgdW5zaWduZWQzMiB1bnNpZ25lZF9hZGRyZXNzOwotdHlwZWRlZiBzaWduZWQzMiBzaWduZWRfYWRkcmVzczsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZF9hZGRyZXNzIGFkZHJlc3Nfd29yZDsKLQotCi0vKiBJRUVFIDEyNzUgY2VsbCBzaXplICovCi0jaWYgKFdJVEhfVEFSR0VUX0NFTExfQklUU0laRSA9PSA2NCkKLXR5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF9jZWxsOwotdHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfY2VsbDsKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUgPT0gMzIpCi10eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfY2VsbDsKLXR5cGVkZWYgc2lnbmVkMzIgc2lnbmVkX2NlbGw7Ci0jZW5kaWYKLXR5cGVkZWYgc2lnbmVkX2NlbGwgY2VsbF93b3JkOyAvKiBjZWxscyBhcmUgbm9ybWFsbHkgc2lnbmVkICovCi0KLQotLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCi0jaWYgKFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUgPT0gNjQpCi10eXBlZGVmIHVuc2lnbmVkNjQgZnBfd29yZDsKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFID09IDMyKQotdHlwZWRlZiB1bnNpZ25lZDMyIGZwX3dvcmQ7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS11dGlscy5jIGIvc2ltL2NvbW1vbi9zaW0tdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkYmFlNS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS11dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qIE1pc2NlbGxhbmVvdXMgc2ltdWxhdG9yIHV0aWxpdGllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+IC8qIG5lZWRlZCBieSBzeXMvcmVzb3VyY2UuaCAqLwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic2ltLXV0aWxzLmgiCi0KLS8qIEdsb2JhbCBwb2ludGVyIHRvIGFsbCBzdGF0ZSBkYXRhLgotICAgU2V0IGJ5IHNpbV9yZXN1bWUuICAqLwotc3RydWN0IHNpbV9zdGF0ZSAqY3VycmVudF9zdGF0ZTsKLQotLyogQWxsb2NhdGUgemVybyBmaWxsZWQgbWVtb3J5IHdpdGggeG1hbGxvYyAtIHhtYWxsb2MgYWJvcnRzIG9mIHRoZQotICAgYWxsb2NhdGlvbiBmYWlscy4gICovCi0KLXZvaWQgKgotemFsbG9jICh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gIHZvaWQgKm1lbW9yeSA9ICh2b2lkICopIHhtYWxsb2MgKHNpemUpOwotICBtZW1zZXQgKG1lbW9yeSwgMCwgc2l6ZSk7Ci0gIHJldHVybiBtZW1vcnk7Ci19Ci0KLXZvaWQKLXpmcmVlICh2b2lkICpkYXRhKQotewotICBmcmVlIChkYXRhKTsKLX0KLQotLyogQWxsb2NhdGUgYSBzaW1fc3RhdGUgc3RydWN0LiAgKi8KLQotU0lNX0RFU0MKLXNpbV9zdGF0ZV9hbGxvYyAoU0lNX09QRU5fS0lORCBraW5kLAotCQkgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2spCi17Ci0gIFNJTV9ERVNDIHNkID0gWkFMTE9DIChzdHJ1Y3Qgc2ltX3N0YXRlKTsKLQotICBTVEFURV9NQUdJQyAoc2QpID0gU0lNX01BR0lDX05VTUJFUjsKLSAgU1RBVEVfQ0FMTEJBQ0sgKHNkKSA9IGNhbGxiYWNrOwotICBTVEFURV9PUEVOX0tJTkQgKHNkKSA9IGtpbmQ7Ci0KLSNpZiAwCi0gIHsKLSAgICBpbnQgY3B1X25yOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgYmFjayBsaW5rIGZyb20gdGhlIGNwdSBzdHJ1Y3QgdG8gdGhlIHN0YXRlIHN0cnVjdC4gICovCi0gICAgLyogPz8/IEkgY2FuIGVudmlzaW9uIGEgZGVzaWduIHdoZXJlIHRoZSBzdGF0ZSBzdHJ1Y3QgY29udGFpbnMgYW4gYXJyYXkKLSAgICAgICBvZiBwb2ludGVycyB0byBjcHUgc3RydWN0cywgcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGVtc2VsdmVzLgotICAgICAgIEltcGxlbWVudGluZyB0aGlzIGlzIHRyaWNraWVyIGFzIG9uZSBtYXkgbm90IGtub3cgd2hhdCB0byBhbGxvY2F0ZSB1bnRpbAotICAgICAgIG9uZSBoYXMgcGFyc2VkIHRoZSBhcmdzLiAgUGFyc2luZyB0aGUgYXJncyB0d2ljZSB3b3VsZG4ndCBiZSB1bnJlYXNvbmFibGUsCi0gICAgICAgSU1ITy4gIElmIHRoZSBzdGF0ZSBzdHJ1Y3QgZXZlciBkb2VzIGNvbnRhaW4gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdGhlbiB3ZQotICAgICAgIGNhbid0IGRvIHRoaXMgaGVyZS4KLSAgICAgICA/Pz8gU2VlIGFsc28gc2ltX3Bvc3RfYXJndl9pbml0Ki8KLSAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKLSAgICAgIHsKLQlDUFVfU1RBVEUgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpID0gc2Q7Ci0JQ1BVX0lOREVYIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKSA9IGNwdV9ucjsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSNpZmRlZiBTSU1fU1RBVEVfSU5JVAotICBTSU1fU1RBVEVfSU5JVCAoc2QpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHNkOwotfQotCi0vKiBGcmVlIGEgc2ltX3N0YXRlIHN0cnVjdC4gICovCi0KLXZvaWQKLXNpbV9zdGF0ZV9mcmVlIChTSU1fREVTQyBzZCkKLXsKLSAgQVNTRVJUIChzZC0+YmFzZS5tYWdpYyA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLQotI2lmZGVmIFNJTV9TVEFURV9GUkVFCi0gIFNJTV9TVEFURV9GUkVFIChzZCk7Ci0jZW5kaWYKLQotICB6ZnJlZSAoc2QpOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcHUgZGF0YSBmb3IgQ1BVX05BTUUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotc2ltX2NwdSAqCi1zaW1fY3B1X2xvb2t1cCAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKmNwdV9uYW1lKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKLSAgICBpZiAoc3RyY21wIChjcHVfbmFtZSwgQ1BVX05BTUUgKFNUQVRFX0NQVSAoc2QsIGkpKSkgPT0gMCkKLSAgICAgIHJldHVybiBTVEFURV9DUFUgKHNkLCBpKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgcHJlZml4IHRvIHVzZSBmb3IgYSBDUFUgc3BlY2lmaWMgbWVzc2FnZSAodHlwaWNhbGx5IGFuCi0gICBlcnJvciBtZXNzYWdlKS4gICovCi0KLWNvbnN0IGNoYXIgKgotc2ltX2NwdV9tc2dfcHJlZml4IChzaW1fY3B1ICpjcHUpCi17Ci0jaWYgTUFYX05SX1BST0NFU1NPUlMgPT0gMQotICByZXR1cm4gIiI7Ci0jZWxzZQotICBzdGF0aWMgY2hhciAqcHJlZml4OwotCi0gIGlmIChwcmVmaXggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgbWF4bGVuID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKENQVV9OQU1FIChTVEFURV9DUFUgKHNkLCBpKSkpOwotCSAgaWYgKGxlbiA+IG1heGxlbikKLQkgICAgbWF4bGVuID0gbGVuOwotCX0KLSAgICAgIHByZWZpeCA9IChjaGFyICopIHhtYWxsb2MgKG1heGxlbiArIDUpOwotICAgIH0KLSAgc3ByaW50ZiAocHJlZml4LCAiJXM6ICIsIENQVV9OQU1FIChjcHUpKTsKLSAgcmV0dXJuIHByZWZpeDsKLSNlbmRpZgotfQotCi0vKiBDb3ZlciBmbiB0byBzaW1faW9fZXByaW50Zi4gICovCi0KLXZvaWQKLXNpbV9pb19lcHJpbnRmX2NwdSAoc2ltX2NwdSAqY3B1LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICBzaW1faW9fZXByaW50ZiAoc2QsIHNpbV9jcHVfbXNnX3ByZWZpeCAoY3B1KSk7Ci0gIHNpbV9pb19ldnByaW50ZiAoc2QsIGZtdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotLyogVHVybiBWQUxVRSBpbnRvIGEgc3RyaW5nIHdpdGggY29tbWFzLiAgKi8KLQotY2hhciAqCi1zaW1fYWRkX2NvbW1hcyAoY2hhciAqYnVmLCBpbnQgc2l6ZW9mX2J1ZiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgaW50IGNvbW1hID0gMzsKLSAgY2hhciAqZW5kYnVmID0gYnVmICsgc2l6ZW9mX2J1ZiAtIDE7Ci0KLSAgKi0tZW5kYnVmID0gJ1wwJzsKLSAgZG8gewotICAgIGlmIChjb21tYS0tID09IDApCi0gICAgICB7Ci0JKi0tZW5kYnVmID0gJywnOwotCWNvbW1hID0gMjsKLSAgICAgIH0KLQotICAgICotLWVuZGJ1ZiA9ICh2YWx1ZSAlIDEwKSArICcwJzsKLSAgfSB3aGlsZSAoKHZhbHVlIC89IDEwKSAhPSAwKTsKLQotICByZXR1cm4gZW5kYnVmOwotfQotCi0vKiBBbmFseXplIFBST0dfTkFNRS9QUk9HX0JGRCBhbmQgc2V0IHRoZXNlIGZpZWxkcyBpbiB0aGUgc3RhdGUgc3RydWN0OgotICAgU1RBVEVfQVJDSElURUNUVVJFLCBpZiBub3Qgc2V0IGFscmVhZHkgYW5kIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGJmZAotICAgU1RBVEVfUFJPR19CRkQKLSAgIFNUQVRFX1NUQVJUX0FERFIKLSAgIFNUQVRFX1RFWFRfU0VDVElPTgotICAgU1RBVEVfVEVYVF9TVEFSVAotICAgU1RBVEVfVEVYVF9FTkQKLQotICAgUFJPR19OQU1FIGlzIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgb3IgTlVMTC4KLSAgIFBST0dfQkZEIGlzIGl0cyBiZmQgb3IgTlVMTC4KLQotICAgSWYgYm90aCBQUk9HX05BTUUgYW5kIFBST0dfQkZEIGFyZSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICBJZiBQUk9HX0JGRCBpcyBub3QgTlVMTCwgUFJPR19OQU1FIGlzIGlnbm9yZWQuCi0KLSAgIEltcGxpY2l0IGlucHV0czogU1RBVEVfTVlfTkFNRShzZCksIFNUQVRFX1RBUkdFVChzZCksCi0gICAgICAgICAgICAgICAgICAgIFNUQVRFX0FSQ0hJVEVDVFVSRShzZCkuCi0KLSAgIEEgbmV3IGJmZCBpcyBjcmVhdGVkIHNvIHRoZSBhcHAgaXNuJ3QgcmVxdWlyZWQgdG8ga2VlcCBpdHMgY29weSBvZiB0aGUKLSAgIGJmZCBvcGVuLiAgKi8KLQotU0lNX1JDCi1zaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwgcHJvZ19uYW1lLCBwcm9nX2JmZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKnByb2dfbmFtZTsKLSAgICAgYmZkICpwcm9nX2JmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0KLSAgaWYgKHByb2dfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHByb2dfYmZkID09IFNUQVRFX1BST0dfQkZEIChzZCkpCi0JLyogYWxyZWFkeSBhbmFseXplZCAqLwotCXJldHVybiBTSU1fUkNfT0s7Ci0gICAgICBlbHNlCi0JLyogZHVwbGljYXRlIG5lZWRlZCwgc2F2ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSByZS1vcGVuZWQgKi8KLQlwcm9nX25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChwcm9nX2JmZCk7Ci0gICAgfQotCi0gIC8qIGRvIHdlIG5lZWQgdG8gZHVwbGljYXRlIGFueXRoaW5nPyAqLwotICBpZiAocHJvZ19uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIFNJTV9SQ19PSzsKLQotICAvKiBvcGVuIGEgbmV3IGNvcHkgb2YgdGhlIHByb2dfYmZkICovCi0gIHByb2dfYmZkID0gYmZkX29wZW5yIChwcm9nX25hbWUsIFNUQVRFX1RBUkdFVCAoc2QpKTsKLSAgaWYgKHByb2dfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiJXM6IGNhbid0IG9wZW4gXCIlc1wiOiAlc1xuIiwgCi0JCSAgICAgIFNUQVRFX01ZX05BTUUgKHNkKSwKLQkJICAgICAgcHJvZ19uYW1lLAotCQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKHByb2dfYmZkLCBiZmRfb2JqZWN0KSkgCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiJXM6IFwiJXNcIiBpcyBub3QgYW4gb2JqZWN0IGZpbGU6ICVzXG4iLAotCQkgICAgICBTVEFURV9NWV9OQU1FIChzZCksCi0JCSAgICAgIHByb2dfbmFtZSwKLQkJICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCkgIT0gTlVMTCkKLSAgICBiZmRfc2V0X2FyY2hfaW5mbyAocHJvZ19iZmQsIFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKHByb2dfYmZkKSAhPSBiZmRfYXJjaF91bmtub3duCi0JICAmJiBiZmRfZ2V0X2FyY2ggKHByb2dfYmZkKSAhPSBiZmRfYXJjaF9vYnNjdXJlKQotCXsKLQkgIFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpID0gYmZkX2dldF9hcmNoX2luZm8gKHByb2dfYmZkKTsKLQl9Ci0gICAgfQotCi0gIC8qIHVwZGF0ZSB0aGUgc2ltIHN0cnVjdHVyZSAqLwotICBpZiAoU1RBVEVfUFJPR19CRkQgKHNkKSAhPSBOVUxMKQotICAgIGJmZF9jbG9zZSAoU1RBVEVfUFJPR19CRkQgKHNkKSk7Ci0gIFNUQVRFX1BST0dfQkZEIChzZCkgPSBwcm9nX2JmZDsKLSAgU1RBVEVfU1RBUlRfQUREUiAoc2QpID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChwcm9nX2JmZCk7Ci0KLSAgZm9yIChzID0gcHJvZ19iZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocHJvZ19iZmQsIHMpLCAiLnRleHQiKSA9PSAwKQotICAgICAgewotCVNUQVRFX1RFWFRfU0VDVElPTiAoc2QpID0gczsKLQlTVEFURV9URVhUX1NUQVJUIChzZCkgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChwcm9nX2JmZCwgcyk7Ci0JU1RBVEVfVEVYVF9FTkQgKHNkKSA9IFNUQVRFX1RFWFRfU1RBUlQgKHNkKSArIGJmZF9zZWN0aW9uX3NpemUgKHByb2dfYmZkLCBzKTsKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotDAotLyogU2ltdWxhdG9yIHRpbWluZyBzdXBwb3J0LiAgKi8KLQotLyogQ2FsbGVkIGJlZm9yZSBzaW1fZWxhcHNlZF90aW1lX3NpbmNlIHRvIGdldCBhIHJlZmVyZW5jZSBwb2ludC4gICovCi0KLVNJTV9FTEFQU0VEX1RJTUUKLXNpbV9lbGFwc2VkX3RpbWVfZ2V0ICgpCi17Ci0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSAgc3RydWN0IHJ1c2FnZSBteXRpbWU7Ci0gIGlmIChnZXRydXNhZ2UgKFJVU0FHRV9TRUxGLCAmbXl0aW1lKSA9PSAwKQotICAgIHJldHVybiAxICsgKFNJTV9FTEFQU0VEX1RJTUUpICgoKGRvdWJsZSkgbXl0aW1lLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDApICsgKCgoZG91YmxlKSBteXRpbWUucnVfdXRpbWUudHZfdXNlYyArIDUwMCkgLyAxMDAwKSk7Ci0gIHJldHVybiAxOwotI2Vsc2UKLSNpZmRlZiBIQVZFX1RJTUUKLSAgcmV0dXJuIDEgKyAoU0lNX0VMQVBTRURfVElNRSkgdGltZSAoKHRpbWVfdCkgMCk7Ci0jZWxzZQotICByZXR1cm4gMTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBTVEFSVC4KLSAgIFRoZSBhY3R1YWwgdGltZSBtYXkgYmUgY3B1IHVzYWdlIChwcmVmZXJlZCkgb3Igd2FsbCBjbG9jay4gICovCi0KLXVuc2lnbmVkIGxvbmcKLXNpbV9lbGFwc2VkX3RpbWVfc2luY2UgKHN0YXJ0KQotICAgICBTSU1fRUxBUFNFRF9USU1FIHN0YXJ0OwotewotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0gIHJldHVybiBzaW1fZWxhcHNlZF90aW1lX2dldCAoKSAtIHN0YXJ0OwotI2Vsc2UKLSNpZmRlZiBIQVZFX1RJTUUKLSAgcmV0dXJuIChzaW1fZWxhcHNlZF90aW1lX2dldCAoKSAtIHN0YXJ0KSAqIDEwMDA7Ci0jZWxzZQotICByZXR1cm4gMDsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLQotCi0vKiBkb19jb21tYW5kIGJ1dCB3aXRoIHByaW50ZiBzdHlsZSBmb3JtYXR0aW5nIG9mIHRoZSBhcmd1bWVudHMgKi8KLXZvaWQKLXNpbV9kb19jb21tYW5kZiAoU0lNX0RFU0Mgc2QsCi0JCSBjb25zdCBjaGFyICpmbXQsCi0JCSAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIGNoYXIgKmJ1ZjsKLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICB2YXNwcmludGYgKCZidWYsIGZtdCwgYXApOwotICBzaW1fZG9fY29tbWFuZCAoc2QsIGJ1Zik7Ci0gIHZhX2VuZCAoYXApOwotICBmcmVlIChidWYpOwotfQotCi0KLS8qIHNpbS1iYXNpY3MuaCBkZWZpbmVzIGEgbnVtYmVyIG9mIGVudW1lcmF0aW9ucywgY29udmVydCBlYWNoIG9mIHRoZW0KLSAgIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uICovCi1jb25zdCBjaGFyICoKLW1hcF90b19zdHIgKHVuc2lnbmVkIG1hcCkKLXsKLSAgc3dpdGNoIChtYXApCi0gICAgewotICAgIGNhc2UgcmVhZF9tYXA6IHJldHVybiAicmVhZCI7Ci0gICAgY2FzZSB3cml0ZV9tYXA6IHJldHVybiAid3JpdGUiOwotICAgIGNhc2UgZXhlY19tYXA6IHJldHVybiAiZXhlYyI7Ci0gICAgY2FzZSBpb19tYXA6IHJldHVybiAiaW8iOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgc3RyWzEwXTsKLQlzcHJpbnRmIChzdHIsICIoJWxkKSIsIChsb25nKSBtYXApOwotCXJldHVybiBzdHI7Ci0gICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBjaGFyICoKLWFjY2Vzc190b19zdHIgKHVuc2lnbmVkIGFjY2VzcykKLXsKLSAgc3dpdGNoIChhY2Nlc3MpCi0gICAgewotICAgIGNhc2UgYWNjZXNzX2ludmFsaWQ6IHJldHVybiAiaW52YWxpZCI7Ci0gICAgY2FzZSBhY2Nlc3NfcmVhZDogcmV0dXJuICJyZWFkIjsKLSAgICBjYXNlIGFjY2Vzc193cml0ZTogcmV0dXJuICJ3cml0ZSI7Ci0gICAgY2FzZSBhY2Nlc3NfZXhlYzogcmV0dXJuICJleGVjIjsKLSAgICBjYXNlIGFjY2Vzc19pbzogcmV0dXJuICJpbyI7Ci0gICAgY2FzZSBhY2Nlc3NfcmVhZF93cml0ZTogcmV0dXJuICJyZWFkX3dyaXRlIjsKLSAgICBjYXNlIGFjY2Vzc19yZWFkX2V4ZWM6IHJldHVybiAicmVhZF9leGVjIjsKLSAgICBjYXNlIGFjY2Vzc193cml0ZV9leGVjOiByZXR1cm4gIndyaXRlX2V4ZWMiOwotICAgIGNhc2UgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYzogcmV0dXJuICJyZWFkX3dyaXRlX2V4ZWMiOwotICAgIGNhc2UgYWNjZXNzX3JlYWRfaW86IHJldHVybiAicmVhZF9pbyI7Ci0gICAgY2FzZSBhY2Nlc3Nfd3JpdGVfaW86IHJldHVybiAid3JpdGVfaW8iOwotICAgIGNhc2UgYWNjZXNzX3JlYWRfd3JpdGVfaW86IHJldHVybiAicmVhZF93cml0ZV9pbyI7Ci0gICAgY2FzZSBhY2Nlc3NfZXhlY19pbzogcmV0dXJuICJleGVjX2lvIjsKLSAgICBjYXNlIGFjY2Vzc19yZWFkX2V4ZWNfaW86IHJldHVybiAicmVhZF9leGVjX2lvIjsKLSAgICBjYXNlIGFjY2Vzc193cml0ZV9leGVjX2lvOiByZXR1cm4gIndyaXRlX2V4ZWNfaW8iOwotICAgIGNhc2UgYWNjZXNzX3JlYWRfd3JpdGVfZXhlY19pbzogcmV0dXJuICJyZWFkX3dyaXRlX2V4ZWNfaW8iOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgc3RyWzEwXTsKLQlzcHJpbnRmIChzdHIsICIoJWxkKSIsIChsb25nKSBhY2Nlc3MpOwotCXJldHVybiBzdHI7Ci0gICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBjaGFyICoKLXRyYW5zZmVyX3RvX3N0ciAodW5zaWduZWQgdHJhbnNmZXIpCi17Ci0gIHN3aXRjaCAodHJhbnNmZXIpCi0gICAgewotICAgIGNhc2UgcmVhZF90cmFuc2ZlcjogcmV0dXJuICJyZWFkIjsKLSAgICBjYXNlIHdyaXRlX3RyYW5zZmVyOiByZXR1cm4gIndyaXRlIjsKLSAgICBkZWZhdWx0OiByZXR1cm4gIihlcnJvcikiOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS11dGlscy5oIGIvc2ltL2NvbW1vbi9zaW0tdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MGU2YS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3NpbS11dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogTWlzY2VsbGFuZW91cyBzaW11bGF0b3IgdXRpbGl0aWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTSU1fVVRJTFNfSAotI2RlZmluZSBTSU1fVVRJTFNfSAotCi0vKiBNZW1vcnkgbWFuYWdlbWVudCB3aXRoIGFuIGFsbG9jYXRvciB0aGF0IGNsZWFycyBtZW1vcnkgYmVmb3JlIHVzZS4gKi8KLQotdm9pZCAqemFsbG9jICh1bnNpZ25lZCBsb25nIHNpemUpOwotCi0jZGVmaW5lIFpBTExPQyhUWVBFKSAoVFlQRSopemFsbG9jKHNpemVvZiAoVFlQRSkpCi0jZGVmaW5lIE5aQUxMT0MoVFlQRSxOKSAoVFlQRSopemFsbG9jKHNpemVvZiAoVFlQRSkgKiAoTikpCi0KLXZvaWQgemZyZWUodm9pZCopOwotCi0vKiBUdXJuIFZBTFVFIGludG8gYSBzdHJpbmcgd2l0aCBjb21tYXMuICAqLwotY2hhciAqc2ltX2FkZF9jb21tYXMgKGNoYXIgKiwgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotLyogVXRpbGl0aWVzIGZvciBlbGFwc2VkIHRpbWUgcmVwb3J0aW5nLiAgKi8KLQotLyogT3BhcXVlIHR5cGUsIGtub3duIG9ubHkgaW5zaWRlIHNpbV9lbGFwc2VkX3RpbWVfZm9vIGZucy4gRXh0ZXJuYWxseQotICAgaXQgaXMga25vd24gdG8gbmV2ZXIgaGF2ZSB0aGUgdmFsdWUgemVyby4gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBTSU1fRUxBUFNFRF9USU1FOwotCi0KLS8qIEdldCByZWZlcmVuY2UgcG9pbnQgZm9yIGZ1dHVyZSBjYWxsIHRvIHNpbV90aW1lX2VsYXBzZWQuICAqLwotU0lNX0VMQVBTRURfVElNRSBzaW1fZWxhcHNlZF90aW1lX2dldCAodm9pZCk7Ci0KLS8qIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgU1RBUlQuICAqLwotdW5zaWduZWQgbG9uZyBzaW1fZWxhcHNlZF90aW1lX3NpbmNlIChTSU1fRUxBUFNFRF9USU1FIHN0YXJ0KTsKLQotLyogVXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGxvYWQgaW1hZ2UuICAqLwotCi1TSU1fUkMgc2ltX2FuYWx5emVfcHJvZ3JhbSAoU0lNX0RFU0Mgc2QsIGNoYXIgKnByb2dfbmFtZSwKLQkJCSAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQpOwotCi0vKiBMb2FkIHByb2dyYW0gUFJPRyBpbnRvIHRoZSBzaW11bGF0b3IgdXNpbmcgdGhlIGZ1bmN0aW9uIERPX0xPQUQuCi0gICBJZiBQUk9HX0JGRCBpcyBub24tTlVMTCwgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuCi0gICBJZiBWRVJCT1NFX1AgaXMgbm9uLXplcm8gc3RhdGlzdGljcyBhcmUgcHJpbnRlZCBvZiBlYWNoIGxvYWRlZCBzZWN0aW9uCi0gICBhbmQgdGhlIHRyYW5zZmVyIHJhdGUgKGZvciBjb25zaXN0ZW5jeSB3aXRoIGdkYikuCi0gICBJZiBMTUFfUCBpcyBub24temVybyB0aGUgcHJvZ3JhbSBzZWN0aW9ucyBhcmUgbG9hZGVkIGF0IHRoZSBMTUEKLSAgIHJhdGhlciB0aGFuIHRoZSBWTUEKLSAgIElmIHRoaXMgZmFpbHMgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkIGFuZCBOVUxMIGlzIHJldHVybmVkLgotICAgSWYgaXQgc3VjY2VlZHMgdGhlIGJmZCBpcyByZXR1cm5lZC4KLSAgIE5PVEU6IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIG9sZGVyIGhhcmR3YXJlIHNpbXVsYXRvcnMgaW5jb3JyZWN0bHkKLSAgIHdyaXRlIHRoZSBwcm9ncmFtIHNlY3Rpb25zIGF0IExNQSBpbnRlcnByZXRlZCBhcyBhIHZpcnR1YWwgYWRkcmVzcy4KLSAgIFRoaXMgaXMgc3RpbGwgYWNjb21tb2RhdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCi0KLXR5cGVkZWYgaW50IHNpbV93cml0ZV9mbiBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLAotCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotc3RydWN0IF9iZmQgKnNpbV9sb2FkX2ZpbGUgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICpteW5hbWUsCi0JCQkgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2ssIGNoYXIgKnByb2csCi0JCQkgICAgc3RydWN0IF9iZmQgKnByb2dfYmZkLCBpbnQgdmVyYm9zZV9wLAotCQkJICAgIGludCBsbWFfcCwgc2ltX3dyaXRlX2ZuIGRvX2xvYWQpOwotCi0vKiBJbnRlcm5hbCB2ZXJzaW9uIG9mIHNpbV9kb19jb21tYW5kLCBpbmNsdWRlIGZvcm1hdHRpbmcgKi8KLXZvaWQgc2ltX2RvX2NvbW1hbmRmIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIGNhbGxiYWNrLmMgYXMgY292ZXIgZnVuY3Rpb25zIHRvIHRoZSB2cHJpbnRmCi0gICBjYWxsYmFja3MuICAqLwotCi12b2lkIHNpbV9jYl9wcmludGYgKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotdm9pZCBzaW1fY2JfZXByaW50ZiAoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIC4uLik7Ci0KLQotLyogc2ltLWJhc2ljcy5oIGRlZmluZXMgYSBudW1iZXIgb2YgZW51bWVyYXRpb25zLCBjb252ZXJ0IGVhY2ggb2YgdGhlbQotICAgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKi8KLWNvbnN0IGNoYXIgKm1hcF90b19zdHIgKHVuc2lnbmVkIG1hcCk7Ci1jb25zdCBjaGFyICphY2Nlc3NfdG9fc3RyICh1bnNpZ25lZCBhY2Nlc3MpOwotY29uc3QgY2hhciAqdHJhbnNmZXJfdG9fc3RyICh1bnNpZ25lZCB0cmFuc2Zlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0td2F0Y2guYyBiL3NpbS9jb21tb24vc2ltLXdhdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YzlhZDEuLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zaW0td2F0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKiBHZW5lcmljIHNpbXVsYXRvciB3YXRjaHBvaW50IHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLWVudW0gewotICBPUFRJT05fV0FUQ0hfREVMRVRFICAgICAgICAgICAgICAgICAgICAgID0gT1BUSU9OX1NUQVJULAotCi0gIE9QVElPTl9XQVRDSF9JTkZPLAotICBPUFRJT05fV0FUQ0hfQ0xPQ0ssCi0gIE9QVElPTl9XQVRDSF9DWUNMRVMsCi0gIE9QVElPTl9XQVRDSF9QQywKLQotICBPUFRJT05fV0FUQ0hfT1AsCi19OwotCi0KLS8qIEJyZWFrIGFuIG9wdGlvbiBudW1iZXIgaW50byBpdHMgb3AvaW50LW5yICovCi1zdGF0aWMgd2F0Y2hwb2ludF90eXBlCi1vcHRpb25fdG9fdHlwZSAoU0lNX0RFU0Mgc2QsCi0JCWludCBvcHRpb24pCi17Ci0gIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOwotICB3YXRjaHBvaW50X3R5cGUgdHlwZSA9ICgob3B0aW9uIC0gT1BUSU9OX1dBVENIX09QKQotCQkJICAvICh3YXRjaC0+bnJfaW50ZXJydXB0cyArIDEpKTsKLSAgU0lNX0FTU0VSVCAodHlwZSA+PSAwICYmIHR5cGUgPCBucl93YXRjaHBvaW50X3R5cGVzKTsKLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLW9wdGlvbl90b19pbnRlcnJ1cHRfbnIgKFNJTV9ERVNDIHNkLAotCQkJaW50IG9wdGlvbikKLXsKLSAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7Ci0gIGludCBpbnRlcnJ1cHRfbnIgPSAoKG9wdGlvbiAtIE9QVElPTl9XQVRDSF9PUCkKLQkJICAgICAgJSAod2F0Y2gtPm5yX2ludGVycnVwdHMgKyAxKSk7Ci0gIHJldHVybiBpbnRlcnJ1cHRfbnI7Ci19Ci0KLXN0YXRpYyBpbnQKLXR5cGVfdG9fb3B0aW9uIChTSU1fREVTQyBzZCwKLQkJd2F0Y2hwb2ludF90eXBlIHR5cGUsCi0JCWludCBpbnRlcnJ1cHRfbnIpCi17Ci0gIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOwotICByZXR1cm4gKCh0eXBlICogKHdhdGNoLT5ucl9pbnRlcnJ1cHRzICsgMSkpCi0JICArIGludGVycnVwdF9ucgotCSAgKyBPUFRJT05fV0FUQ0hfT1ApOwotfQotCi0KLS8qIERlbGV0ZSBvbmUgb3IgbW9yZSB3YXRjaHBvaW50cy4gIEZhaWwgaWYgbm8gd2F0Y2hwb2ludHMgd2VyZSBmb3VuZCAqLwotCi1zdGF0aWMgU0lNX1JDCi1kb193YXRjaHBvaW50X2RlbGV0ZSAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgIGludCBpZGVudCwKLQkJICAgICAgd2F0Y2hwb2ludF90eXBlIHR5cGUpCi17Ci0gIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOwotICBzaW1fd2F0Y2hfcG9pbnQgKiplbnRyeSA9ICZ3YXRjaC0+cG9pbnRzOwotICBTSU1fUkMgc3RhdHVzID0gU0lNX1JDX0ZBSUw7Ci0gIHdoaWxlICgoKmVudHJ5KSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoKmVudHJ5KS0+aWRlbnQgPT0gaWRlbnQKLQkgIHx8ICgqZW50cnkpLT50eXBlID09IHR5cGUpCi0JewotCSAgc2ltX3dhdGNoX3BvaW50ICpkZWFkID0gKCplbnRyeSk7Ci0JICAoKmVudHJ5KSA9ICgqZW50cnkpLT5uZXh0OwotCSAgc2ltX2V2ZW50c19kZXNjaGVkdWxlIChzZCwgZGVhZC0+ZXZlbnQpOwotCSAgemZyZWUgKGRlYWQpOwotCSAgc3RhdHVzID0gU0lNX1JDX09LOwotCX0KLSAgICAgIGVsc2UKLQllbnRyeSA9ICYoKmVudHJ5KS0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXdhdGNocG9pbnRfdHlwZV90b19zdHIgKFNJTV9ERVNDIHNkLAotCQkJd2F0Y2hwb2ludF90eXBlIHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAgcGNfd2F0Y2hwb2ludDoKLSAgICAgIHJldHVybiAicGMiOwotICAgIGNhc2UgY2xvY2tfd2F0Y2hwb2ludDoKLSAgICAgIHJldHVybiAiY2xvY2siOwotICAgIGNhc2UgY3ljbGVzX3dhdGNocG9pbnQ6Ci0gICAgICByZXR1cm4gImN5Y2xlcyI7Ci0gICAgY2FzZSBpbnZhbGlkX3dhdGNocG9pbnQ6Ci0gICAgY2FzZSBucl93YXRjaHBvaW50X3R5cGVzOgotICAgICAgcmV0dXJuICIoaW52YWxpZC10eXBlKSI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIgKgotaW50ZXJydXB0X25yX3RvX3N0ciAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgaW50IGludGVycnVwdF9ucikKLXsKLSAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7Ci0gIGlmIChpbnRlcnJ1cHRfbnIgPCAwKQotICAgIHJldHVybiAiKGludmFsaWQtaW50ZXJydXB0KSI7Ci0gIGVsc2UgaWYgKGludGVycnVwdF9uciA+PSB3YXRjaC0+bnJfaW50ZXJydXB0cykKLSAgICByZXR1cm4gImJyZWFrcG9pbnQiOwotICBlbHNlCi0gICAgcmV0dXJuIHdhdGNoLT5pbnRlcnJ1cHRfbmFtZXNbaW50ZXJydXB0X25yXTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fd2F0Y2hwb2ludF9pbmZvIChTSU1fREVTQyBzZCkKLXsKLSAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7Ci0gIHNpbV93YXRjaF9wb2ludCAqcG9pbnQ7Ci0gIHNpbV9pb19wcmludGYgKHNkLCAiV2F0Y2hwb2ludHM6XG4iKTsKLSAgZm9yIChwb2ludCA9IHdhdGNoLT5wb2ludHM7IHBvaW50ICE9IE5VTEw7IHBvaW50ID0gcG9pbnQtPm5leHQpCi0gICAgewotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIlM2Q6IHdhdGNoICVzICVzICIsCi0JCSAgICAgcG9pbnQtPmlkZW50LAotCQkgICAgIHdhdGNocG9pbnRfdHlwZV90b19zdHIgKHNkLCBwb2ludC0+dHlwZSksCi0JCSAgICAgaW50ZXJydXB0X25yX3RvX3N0ciAoc2QsIHBvaW50LT5pbnRlcnJ1cHRfbnIpKTsKLSAgICAgIGlmIChwb2ludC0+aXNfcGVyaW9kaWMpCi0Jc2ltX2lvX3ByaW50ZiAoc2QsICIrIik7Ci0gICAgICBpZiAoIXBvaW50LT5pc193aXRoaW4pCi0Jc2ltX2lvX3ByaW50ZiAoc2QsICIhIik7Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIjB4JWx4IiwgcG9pbnQtPmFyZzApOwotICAgICAgaWYgKHBvaW50LT5hcmcxICE9IHBvaW50LT5hcmcwKQotCXNpbV9pb19wcmludGYgKHNkLCAiLDB4JWx4IiwgcG9pbnQtPmFyZzEpOwotICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOwotICAgIH0KLX0KLQkJICAgIAotCi0KLXN0YXRpYyBzaW1fZXZlbnRfaGFuZGxlciBoYW5kbGVfd2F0Y2hwb2ludDsKLQotc3RhdGljIFNJTV9SQwotc2NoZWR1bGVfd2F0Y2hwb2ludCAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgc2ltX3dhdGNoX3BvaW50ICpwb2ludCkKLXsKLSAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7Ci0gIHN3aXRjaCAocG9pbnQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgcGNfd2F0Y2hwb2ludDoKLSAgICAgIHBvaW50LT5ldmVudCA9IHNpbV9ldmVudHNfd2F0Y2hfc2ltIChzZCwKLQkJCQkJICAgd2F0Y2gtPnBjLAotCQkJCQkgICB3YXRjaC0+c2l6ZW9mX3BjLAotCQkJCQkgICAwLyogaG9zdC1lbmRpYW4gKi8sCi0JCQkJCSAgIHBvaW50LT5pc193aXRoaW4sCi0JCQkJCSAgIHBvaW50LT5hcmcwLCBwb2ludC0+YXJnMSwKLQkJCQkJICAgLyogUEMgaW4gYXJnMC4uYXJnMSAqLwotCQkJCQkgICBoYW5kbGVfd2F0Y2hwb2ludCwKLQkJCQkJICAgcG9pbnQpOwotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLSAgICBjYXNlIGNsb2NrX3dhdGNocG9pbnQ6Ci0gICAgICBwb2ludC0+ZXZlbnQgPSBzaW1fZXZlbnRzX3dhdGNoX2Nsb2NrIChzZCwKLQkJCQkJICAgICBwb2ludC0+YXJnMCwgLyogbXMgdGltZSAqLwotCQkJCQkgICAgIGhhbmRsZV93YXRjaHBvaW50LAotCQkJCQkgICAgIHBvaW50KTsKLSAgICAgIHJldHVybiBTSU1fUkNfT0s7Ci0gICAgY2FzZSBjeWNsZXNfd2F0Y2hwb2ludDoKLSAgICAgIHBvaW50LT5ldmVudCA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLAotCQkJCQkgIHBvaW50LT5hcmcwLCAvKiB0aW1lICovCi0JCQkJCSAgaGFuZGxlX3dhdGNocG9pbnQsCi0JCQkJCSAgcG9pbnQpOwotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLSAgICBkZWZhdWx0OgotICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIE5VTEwsIE5VTExfQ0lBLAotCQkJImhhbmRsZV93YXRjaHBvaW50IC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7Ci0gICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfd2F0Y2hwb2ludCAoU0lNX0RFU0Mgc2QsIHZvaWQgKmRhdGEpCi17Ci0gIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOwotICBzaW1fd2F0Y2hfcG9pbnQgKnBvaW50ID0gKHNpbV93YXRjaF9wb2ludCAqKSBkYXRhOwotICBpbnQgaW50ZXJydXB0X25yID0gcG9pbnQtPmludGVycnVwdF9ucjsKLQotICBpZiAocG9pbnQtPmlzX3BlcmlvZGljKQotICAgIC8qIHJlc2NoZWR1bGUgdGhpcyBldmVudCBiZWZvcmUgcHJvY2Vzc2luZyBpdCAqLwotICAgIHNjaGVkdWxlX3dhdGNocG9pbnQgKHNkLCBwb2ludCk7Ci0gIGVsc2UKLSAgICBkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIHBvaW50LT5pZGVudCwgaW52YWxpZF93YXRjaHBvaW50KTsKLSAgICAKLSAgaWYgKHBvaW50LT5pbnRlcnJ1cHRfbnIgPT0gd2F0Y2gtPm5yX2ludGVycnVwdHMpCi0gICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHSU5UKTsKLSAgZWxzZQotICAgIHdhdGNoLT5pbnRlcnJ1cHRfaGFuZGxlciAoc2QsICZ3YXRjaC0+aW50ZXJydXB0X25hbWVzW2ludGVycnVwdF9ucl0pOwotfQotCi0KLXN0YXRpYyBTSU1fUkMKLWRvX3dhdGNocG9pbnRfY3JlYXRlIChTSU1fREVTQyBzZCwKLQkJICAgICAgd2F0Y2hwb2ludF90eXBlIHR5cGUsCi0JCSAgICAgIGludCBvcHQsCi0JCSAgICAgIGNoYXIgKmFyZykKLXsKLSAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7Ci0gIHNpbV93YXRjaF9wb2ludCAqKnBvaW50OwotCi0gIC8qIGNyZWF0ZSB0aGUgd2F0Y2hwb2ludCAqLwotICBwb2ludCA9ICZ3YXRjaC0+cG9pbnRzOwotICB3aGlsZSAoKCpwb2ludCkgIT0gTlVMTCkKLSAgICBwb2ludCA9ICYoKnBvaW50KS0+bmV4dDsKLSAgKCpwb2ludCkgPSBaQUxMT0MgKHNpbV93YXRjaF9wb2ludCk7Ci0KLSAgLyogZmlsbCBpbiB0aGUgZGV0YWlscyAqLwotICAoKnBvaW50KS0+aWRlbnQgPSArKyh3YXRjaC0+bGFzdF9wb2ludF9ucik7Ci0gICgqcG9pbnQpLT50eXBlID0gb3B0aW9uX3RvX3R5cGUgKHNkLCBvcHQpOwotICAoKnBvaW50KS0+aW50ZXJydXB0X25yID0gb3B0aW9uX3RvX2ludGVycnVwdF9uciAoc2QsIG9wdCk7Ci0gIC8qIHByZWZpeGVzIHRvIGFyZyAtICs9PSBwZXJpb2RpYywgIT09bm90IG9yIG91dHNpZGUgKi8KLSAgKCpwb2ludCktPmlzX3dpdGhpbiA9IDE7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChhcmdbMF0gPT0gJysnKQotCSgqcG9pbnQpLT5pc19wZXJpb2RpYyA9IDE7Ci0gICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJyEnKQotCSgqcG9pbnQpLT5pc193aXRoaW4gPSAwOwotICAgICAgZWxzZQotCWJyZWFrOwotICAgICAgYXJnKys7Ci0gICAgfQotCQotICAoKnBvaW50KS0+YXJnMCA9IHN0cnRvdWwgKGFyZywgJmFyZywgMCk7Ci0gIGlmIChhcmdbMF0gPT0gJywnKQotICAgICgqcG9pbnQpLT5hcmcwID0gc3RydG91bCAoYXJnLCBOVUxMLCAwKTsKLSAgZWxzZQotICAgICgqcG9pbnQpLT5hcmcxID0gKCpwb2ludCktPmFyZzA7Ci0KLSAgLyogc2NoZWR1bGUgaXQgKi8KLSAgc2NoZWR1bGVfd2F0Y2hwb2ludCAoc2QsICgqcG9pbnQpKTsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0KLXN0YXRpYyBTSU1fUkMKLXdhdGNocG9pbnRfb3B0aW9uX2hhbmRsZXIgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGludCBvcHQsCi0JCQkgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQotewotICBpZiAob3B0ID49IE9QVElPTl9XQVRDSF9PUCkKLSAgICByZXR1cm4gZG9fd2F0Y2hwb2ludF9jcmVhdGUgKHNkLCBjbG9ja193YXRjaHBvaW50LCBvcHQsIGFyZyk7Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKG9wdCkKLSAgICAgIHsKLQkKLSAgICAgIGNhc2UgT1BUSU9OX1dBVENIX0RFTEVURToKLQlpZiAoaXNkaWdpdCAoKGludCkgYXJnWzBdKSkKLQkgIHsKLQkgICAgaW50IGlkZW50ID0gc3RydG9sIChhcmcsIE5VTEwsIDApOwotCSAgICBpZiAoZG9fd2F0Y2hwb2ludF9kZWxldGUgKHNkLCBpZGVudCwgaW52YWxpZF93YXRjaHBvaW50KQotCQkhPSBTSU1fUkNfT0spCi0JICAgICAgewotCQlzaW1faW9fZXByaW50ZiAoc2QsICJXYXRjaHBvaW50ICVkIG5vdCBmb3VuZFxuIiwgaWRlbnQpOwotCQlyZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JICAgICAgfQotCSAgICByZXR1cm4gU0lNX1JDX09LOwotCSAgfQotCWVsc2UgaWYgKHN0cmNhc2VjbXAgKGFyZywgImFsbCIpID09IDApCi0JICB7Ci0JICAgIHdhdGNocG9pbnRfdHlwZSB0eXBlOwotCSAgICBmb3IgKHR5cGUgPSBpbnZhbGlkX3dhdGNocG9pbnQgKyAxOwotCQkgdHlwZSA8IG5yX3dhdGNocG9pbnRfdHlwZXM7Ci0JCSB0eXBlKyspCi0JICAgICAgewotCQlkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIHR5cGUpOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQkgIH0KLQllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJwYyIpID09IDApCi0JICB7Ci0JICAgIGlmIChkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIHBjX3dhdGNocG9pbnQpCi0JCSE9IFNJTV9SQ19PSykKLQkgICAgICB7Ci0JCXNpbV9pb19lcHJpbnRmIChzZCwgIk5vIFBDIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKLQkJcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQkgIH0KLQllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJjbG9jayIpID09IDApCi0JICB7Ci0JICAgIGlmIChkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIGNsb2NrX3dhdGNocG9pbnQpICE9IFNJTV9SQ19PSykKLQkgICAgICB7Ci0JCXNpbV9pb19lcHJpbnRmIChzZCwgIk5vIENMT0NLIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKLQkJcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQkgIH0KLQllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJjeWNsZXMiKSA9PSAwKQotCSAgewotCSAgICBpZiAoZG9fd2F0Y2hwb2ludF9kZWxldGUgKHNkLCAwLCBjeWNsZXNfd2F0Y2hwb2ludCkgIT0gU0lNX1JDX09LKQotCSAgICAgIHsKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiTm8gQ1lDTEVTIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKLQkJcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQkgIH0KLQlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIHdhdGNocG9pbnQgdHlwZSBgJXMnXG4iLCBhcmcpOwotCXJldHVybiBTSU1fUkNfRkFJTDsKLQkKLSAgICAgIGNhc2UgT1BUSU9OX1dBVENIX0lORk86Ci0JewotCSAgZG9fd2F0Y2hwb2ludF9pbmZvIChzZCk7Ci0JICByZXR1cm4gU0lNX1JDX09LOwotCX0KLSAgICAgIAotICAgICAgZGVmYXVsdDoKLQlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIHdhdGNoIG9wdGlvbiAlZFxuIiwgb3B0KTsKLQlyZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JCi0gICAgICB9Ci0gIAotfQotCi0KLXN0YXRpYyBTSU1fUkMKLXNpbV93YXRjaHBvaW50X2luaXQgKFNJTV9ERVNDIHNkKQotewotICBzaW1fd2F0Y2hwb2ludHMgKndhdGNoID0gU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKTsKLSAgc2ltX3dhdGNoX3BvaW50ICpwb2ludDsKLSAgLyogTk9URTogRG8gbm90IG5lZWQgdG8gZGUtc2NoZWR1bGUgYW55IHByZXZpb3VzIHdhdGNocG9pbnRzIGFzCi0gICAgIHNpbS1ldmVudHMgaGFzIGFscmVhZHkgZG9uZSB0aGlzICovCi0gIC8qIHNjaGVkdWxlIGFueSB3YXRjaHBvaW50cyBlbmFibGVkIGJ5IGNvbW1hbmQgbGluZSBvcHRpb25zICovCi0gIGZvciAocG9pbnQgPSB3YXRjaC0+cG9pbnRzOyBwb2ludCAhPSBOVUxMOyBwb2ludCA9IHBvaW50LT5uZXh0KQotICAgIHsKLSAgICAgIHNjaGVkdWxlX3dhdGNocG9pbnQgKHNkLCBwb2ludCk7Ci0gICAgfQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi0KLXN0YXRpYyBjb25zdCBPUFRJT04gd2F0Y2hwb2ludF9vcHRpb25zW10gPQotewotICB7IHsid2F0Y2gtZGVsZXRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVRDSF9ERUxFVEUgfSwKLSAgICAgICdcMCcsICJJREVOVHxhbGx8cGN8Y3ljbGVzfGNsb2NrIiwgIkRlbGV0ZSBhIHdhdGNocG9pbnQiLAotICAgICAgd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlciB9LAotCi0gIHsgeyJ3YXRjaC1pbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVRDSF9JTkZPIH0sCi0gICAgICAnXDAnLCBOVUxMLCAiTGlzdCBzY2hlZHVsZWQgd2F0Y2hwb2ludHMiLAotICAgICAgd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlciB9LAotCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY2hhciAqZGVmYXVsdF9pbnRlcnJ1cHRfbmFtZXNbXSA9IHsgImludCIsIDAsIH07Ci0KLQotCi1TSU1fUkMKLXNpbV93YXRjaHBvaW50X2luc3RhbGwgKFNJTV9ERVNDIHNkKQotewotICBzaW1fd2F0Y2hwb2ludHMgKndhdGNoID0gU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKTsKLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLSAgLyogdGhlIGJhc2ljIGNvbW1hbmQgc2V0ICovCi0gIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fd2F0Y2hwb2ludF9pbml0KTsKLSAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCB3YXRjaHBvaW50X29wdGlvbnMpOwotICAvKiBmaWxsIGluIHNvbWUgZGV0YWlscyAqLwotICBpZiAod2F0Y2gtPmludGVycnVwdF9uYW1lcyA9PSBOVUxMKQotICAgIHdhdGNoLT5pbnRlcnJ1cHRfbmFtZXMgPSBkZWZhdWx0X2ludGVycnVwdF9uYW1lczsKLSAgd2F0Y2gtPm5yX2ludGVycnVwdHMgPSAwOwotICB3aGlsZSAod2F0Y2gtPmludGVycnVwdF9uYW1lc1t3YXRjaC0+bnJfaW50ZXJydXB0c10gIT0gTlVMTCkKLSAgICB3YXRjaC0+bnJfaW50ZXJydXB0cysrOwotICAvKiBnZW5lcmF0ZSBtb3JlIGFkdmFuc2VkIGNvbW1hbmRzICovCi0gIHsKLSAgICBPUFRJT04gKmludF9vcHRpb25zID0gTlpBTExPQyAoT1BUSU9OLCAxICsgKHdhdGNoLT5ucl9pbnRlcnJ1cHRzICsgMSkgKiBucl93YXRjaHBvaW50X3R5cGVzKTsKLSAgICBpbnQgaW50ZXJydXB0X25yOwotICAgIGZvciAoaW50ZXJydXB0X25yID0gMDsgaW50ZXJydXB0X25yIDw9IHdhdGNoLT5ucl9pbnRlcnJ1cHRzOyBpbnRlcnJ1cHRfbnIrKykKLSAgICAgIHsKLQl3YXRjaHBvaW50X3R5cGUgdHlwZTsKLQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgbnJfd2F0Y2hwb2ludF90eXBlczsgdHlwZSsrKQotCSAgewotCSAgICBjaGFyICpuYW1lOwotCSAgICBpbnQgbnIgPSBpbnRlcnJ1cHRfbnIgKiBucl93YXRjaHBvaW50X3R5cGVzICsgdHlwZTsKLQkgICAgT1BUSU9OICpvcHRpb24gPSAmaW50X29wdGlvbnNbbnJdOwotCSAgICBhc3ByaW50ZiAoJm5hbWUsICJ3YXRjaC0lcy0lcyIsCi0JCSAgICAgIHdhdGNocG9pbnRfdHlwZV90b19zdHIgKHNkLCB0eXBlKSwKLQkJICAgICAgaW50ZXJydXB0X25yX3RvX3N0ciAoc2QsIGludGVycnVwdF9ucikpOwotCSAgICBvcHRpb24tPm9wdC5uYW1lID0gbmFtZTsKLQkgICAgb3B0aW9uLT5vcHQuaGFzX2FyZyA9IHJlcXVpcmVkX2FyZ3VtZW50OwotCSAgICBvcHRpb24tPm9wdC52YWwgPSB0eXBlX3RvX29wdGlvbiAoc2QsIHR5cGUsIGludGVycnVwdF9ucik7Ci0JICAgIG9wdGlvbi0+ZG9jID0gIiI7Ci0JICAgIG9wdGlvbi0+ZG9jX25hbWUgPSAiIjsKLQkgICAgb3B0aW9uLT5oYW5kbGVyID0gd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlcjsKLQkgIH0KLSAgICAgIH0KLSAgICAvKiBhZGp1c3QgZmlyc3QgZmV3IGVudHJpZXMgc28gdGhhdCB0aGV5IGNvbnRhaW4gcmVhbAotICAgICAgIGRvY3VtZW50YXRpb24sIHRoZSBmaXJzdCBlbnRyeSBpbmNsdWRlcyBhIGxpc3Qgb2YgYWN0aW9ucy4gKi8KLSAgICB7Ci0gICAgICBjaGFyICpwcmVmaXggPSAKLQkiV2F0Y2ggdGhlIHNpbXVsYXRvciwgdGFrZSBBQ1RJT04gaW4gQ09VTlQgY3ljbGVzIChgKycgZm9yIGV2ZXJ5IENPVU5UIGN5Y2xlcyksIEFDVElPTiBpcyI7Ci0gICAgICBjaGFyICpkb2M7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChwcmVmaXgpICsgMTsKLSAgICAgIGZvciAoaW50ZXJydXB0X25yID0gMDsgaW50ZXJydXB0X25yIDw9IHdhdGNoLT5ucl9pbnRlcnJ1cHRzOyBpbnRlcnJ1cHRfbnIrKykKLQlsZW4gKz0gc3RybGVuIChpbnRlcnJ1cHRfbnJfdG9fc3RyIChzZCwgaW50ZXJydXB0X25yKSkgKyAxOwotICAgICAgZG9jID0gTlpBTExPQyAoY2hhciwgbGVuKTsKLSAgICAgIHN0cmNweSAoZG9jLCBwcmVmaXgpOwotICAgICAgZm9yIChpbnRlcnJ1cHRfbnIgPSAwOyBpbnRlcnJ1cHRfbnIgPD0gd2F0Y2gtPm5yX2ludGVycnVwdHM7IGludGVycnVwdF9ucisrKQotCXsKLQkgIHN0cmNhdCAoZG9jLCAiICIpOwotCSAgc3RyY2F0IChkb2MsIGludGVycnVwdF9ucl90b19zdHIgKHNkLCBpbnRlcnJ1cHRfbnIpKTsKLQl9Ci0gICAgICBpbnRfb3B0aW9uc1swXS5kb2NfbmFtZSA9ICJ3YXRjaC1jeWNsZXMtQUNUSU9OIjsKLSAgICAgIGludF9vcHRpb25zWzBdLmFyZyA9ICJbK11DT1VOVCI7Ci0gICAgICBpbnRfb3B0aW9uc1swXS5kb2MgPSBkb2M7Ci0gICAgfQotICAgIGludF9vcHRpb25zWzFdLmRvY19uYW1lID0gIndhdGNoLXBjLUFDVElPTiI7Ci0gICAgaW50X29wdGlvbnNbMV0uYXJnID0gIlshXUFERFJFU1MiOwotICAgIGludF9vcHRpb25zWzFdLmRvYyA9Ci0gICAgICAiV2F0Y2ggdGhlIFBDLCB0YWtlIEFDVElPTiB3aGVuIG1hdGNoZXMgQUREUkVTUyAoaW4gcmFuZ2UgQUREUkVTUyxBRERSRVNTKSwgYCEnIG5lZ2F0ZXMgdGVzdCI7Ci0gICAgaW50X29wdGlvbnNbMl0uZG9jX25hbWUgPSAid2F0Y2gtY2xvY2stQUNUSU9OIjsKLSAgICBpbnRfb3B0aW9uc1syXS5hcmcgPSAiWytdTUlMTElTRUNPTkRTIjsKLSAgICBpbnRfb3B0aW9uc1syXS5kb2MgPQotICAgICAgIldhdGNoIHRoZSBjbG9jaywgdGFrZSBBQ1RJT04gYWZ0ZXIgTUlMTElTRUNPTkRTIChgKycgZm9yIGV2ZXJ5IE1JTExJU0VDT05EUykiOwotCi0gICAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBpbnRfb3B0aW9ucyk7Ci0gIH0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXdhdGNoLmggYi9zaW0vY29tbW9uL3NpbS13YXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyMGQzLi4wMDAwMDAwCi0tLSBhL3NpbS9jb21tb24vc2ltLXdhdGNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBTaW11bGF0b3Igd2F0Y2hwb2ludCBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWZuZGVmIFNJTV9XQVRDSF9ICi0jZGVmaW5lIFNJTV9XQVRDSF9ICi0KLXR5cGVkZWYgZW51bSB7Ci0gIGludmFsaWRfd2F0Y2hwb2ludCA9IC0xLAotICBwY193YXRjaHBvaW50LAotICBjbG9ja193YXRjaHBvaW50LAotICBjeWNsZXNfd2F0Y2hwb2ludCwKLSAgbnJfd2F0Y2hwb2ludF90eXBlcywKLX0gd2F0Y2hwb2ludF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfc2ltX3dhdGNoX3BvaW50IHNpbV93YXRjaF9wb2ludDsKLXN0cnVjdCBfc2ltX3dhdGNoX3BvaW50IHsKLSAgaW50IGlkZW50OwotICB3YXRjaHBvaW50X3R5cGUgdHlwZTsKLSAgaW50IGludGVycnVwdF9ucjsgLyogPT0gbnJfaW50ZXJydXB0cyAtPiBicmVha3BvaW50ICovCi0gIGludCBpc19wZXJpb2RpYzsKLSAgaW50IGlzX3dpdGhpbjsKLSAgdW5zaWduZWQgbG9uZyBhcmcwOwotICB1bnNpZ25lZCBsb25nIGFyZzE7Ci0gIHNpbV9ldmVudCAqZXZlbnQ7Ci0gIHNpbV93YXRjaF9wb2ludCAqbmV4dDsKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX3NpbV93YXRjaHBvaW50cyB7Ci0KLSAgLyogUG9pbnRlciBpbnRvIHRoZSBob3N0J3MgZGF0YSBzdHJ1Y3R1cmVzIHNwZWNpZnlpbmcgdGhlCi0gICAgIGFkZHJlc3Mvc2l6ZSBvZiB0aGUgcHJvZ3JhbS1jb3VudGVyICovCi0gIC8qIEZJWE1FOiBJbiB0aGUgZnV0dXJlIHRoaXMgc2hhbGwgYmUgZ2VuZXJhbGl6ZWQgc28gdGhhdCBhbnkgb2YgdGhlCi0gICAgIE4gcHJvY2Vzc29ycyBNIHJlZ2lzdGVycyBjYW4gYmUgd2F0Y2hlZCAqLwotICB2b2lkICpwYzsKLSAgaW50IHNpemVvZl9wYzsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBoYW5kbGVyIGZvciBpbnRlcnJ1cHQgd2F0Y2hwb2ludHMgKi8KLSAgLyogRklYTUU6IGNhbiB0aGlzIGJlIGRvbmUgYmV0dGVyPyAqLwotICAvKiBOT1RFOiBGb3IgdGhlIERBVEEgYXJnLCB0aGUgaGFuZGxlciBpcyBwYXNzZWQgYSAoY2hhcioqKSBwb2ludGVyCi0gICAgIHRoYXQgaXMgYW4gb2Zmc2V0IGludG8gdGhlIElOVEVSUlVQVF9OQU1FUyB2ZWN0b3IuICBVc2UKLSAgICAgYXJpdGhtZXRpYyB0byBkZXRlcm1pbmUgdGhlIGludGVycnVwdC1uci4gKi8KLSAgc2ltX2V2ZW50X2hhbmRsZXIgKmludGVycnVwdF9oYW5kbGVyOwotCi0gIC8qIFBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgbGlzdCBvZiBpbnRlcnJ1cHQgbmFtZXMgKi8KLSAgLyogRklYTUU6IGNhbiB0aGlzIGJlIGRvbmUgYmV0dGVyPyAgTG9vayBhdCB0aGUgUFBDJ3MgaW50ZXJydXB0Ci0gICAgIG1lY2hhbmlzbSBhbmQgdGFibGUgZm9yIGEgcm91Z2ggaWRlYSBvZiB3aGVyZSBpdCB3aWxsIGdvIG5leHQgKi8KLSAgaW50IG5yX2ludGVycnVwdHM7Ci0gIGNoYXIgKippbnRlcnJ1cHRfbmFtZXM7Ci0KLSAgLyogYWN0aXZlIHdhdGNocG9pbnRzICovCi0gIGludCBsYXN0X3BvaW50X25yOwotICBzaW1fd2F0Y2hfcG9pbnQgKnBvaW50czsKLQotfSBzaW1fd2F0Y2hwb2ludHM7Ci0KLS8qIFdhdGNoIGluc3RhbGwgaGFuZGxlci4gICovCi1NT0RVTEVfSU5TVEFMTF9GTiBzaW1fd2F0Y2hwb2ludF9pbnN0YWxsOwotCi0jZW5kaWYgLyogU0lNX1dBVENIX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc3lzY2FsbC5jIGIvc2ltL2NvbW1vbi9zeXNjYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTNiODguLjAwMDAwMDAKLS0tIGEvc2ltL2NvbW1vbi9zeXNjYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyogUmVtb3RlIHRhcmdldCBzeXN0ZW0gY2FsbCBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIga2luZAotICAgb2YgcmVtb3RlIChoYXJkd2FyZSwgc2ltdWxhdG9yLCB3aGF0ZXZlcikuICBBcyBzdWNoLCBzdXBwb3J0IGZvciBpdAotICAgKGUuZy4gc2ltL2NvbW1vbi9jYWxsYmFjay5jKSBzaG91bGQgKm5vdCogbGl2ZSBpbiB0aGUgc2ltdWxhdG9yIHNvdXJjZQotICAgdHJlZSwgbm9yIHNob3VsZCBpdCBsaXZlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuICBLJlIgQyBtdXN0IGJlCi0gICBzdXBwb3J0ZWQuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKLQotI2lmbmRlZiBFTk9TWVMKLSNkZWZpbmUgRU5PU1lTIEVJTlZBTAotI2VuZGlmCi0jaWZuZGVmIEVOQU1FVE9PTE9ORwotI2RlZmluZSBFTkFNRVRPT0xPTkcgRUlOVkFMCi0jZW5kaWYKLQotLyogTWF4aW11bSBsZW5ndGggb2YgYSBwYXRoIG5hbWUuICAqLwotI2lmbmRlZiBNQVhfUEFUSF9MRU4KLSNkZWZpbmUgTUFYX1BBVEhfTEVOIDEwMjQKLSNlbmRpZgotCi0vKiBXaGVuIGRvaW5nIGZpbGUgcmVhZC93cml0ZXMsIGRvIHRoaXMgbWFueSBieXRlcyBhdCBhIHRpbWUuICAqLwotI2RlZmluZSBGSUxFX1hGUl9TSVpFIDQwOTYKLQotLyogRklYTUU6IGZvciBub3csIG5lZWQgdG8gY29uc2lkZXIgdGFyZ2V0IHdvcmQgc2l6ZS4gICovCi0jZGVmaW5lIFRXT1JEIGxvbmcKLSNkZWZpbmUgVEFERFIgdW5zaWduZWQgbG9uZwotCi0vKiBVdGlsaXR5IG9mIGNiX3N5c2NhbGwgdG8gZmV0Y2ggYSBwYXRoIG5hbWUgb3Igb3RoZXIgc3RyaW5nIGZyb20gdGhlIHRhcmdldC4KLSAgIFRoZSByZXN1bHQgaXMgMCBmb3Igc3VjY2VzcyBvciBhIGhvc3QgZXJybm8gdmFsdWUuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfc3RyaW5nIChjYiwgc2MsIGJ1ZiwgYnVmbGVuLCBhZGRyKQotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgQ0JfU1lTQ0FMTCAqc2M7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLSAgICAgVEFERFIgYWRkcjsKLXsKLSAgY2hhciAqcCwgKnBlbmQ7Ci0KLSAgZm9yIChwID0gYnVmLCBwZW5kID0gYnVmICsgYnVmbGVuOyBwIDwgcGVuZDsgKytwLCArK2FkZHIpCi0gICAgewotICAgICAgLyogTm8sIGl0IGlzbid0IGV4cGVjdGVkIHRoYXQgdGhpcyB3b3VsZCBjYXVzZSBvbmUgdHJhbnNhY3Rpb24gd2l0aAotCSB0aGUgcmVtb3RlIHRhcmdldCBmb3IgZWFjaCBieXRlLiAgVGhlIHRhcmdldCBjb3VsZCBzZW5kIHRoZQotCSBwYXRoIG5hbWUgYWxvbmcgd2l0aCB0aGUgc3lzY2FsbCByZXF1ZXN0LCBhbmQgY2FjaGUgdGhlIGZpbGUKLQkgbmFtZSBzb21ld2hlcmUgKG9yIG90aGVyd2lzZSB0d2VhayB0aGlzIGFzIGRlc2lyZWQpLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9ICgqc2MtPnJlYWRfbWVtKSAoY2IsIHNjLCBhZGRyLCBwLCAxKTsKLQkJCQkgICAgCi0gICAgICBpZiAoY291bnQgIT0gMSkKLQlyZXR1cm4gRUlOVkFMOwotICAgICAgaWYgKCpwID09IDApCi0JYnJlYWs7Ci0gICAgfQotICBpZiAocCA9PSBwZW5kKQotICAgIHJldHVybiBFTkFNRVRPT0xPTkc7Ci0gIHJldHVybiAwOwotfQotCi0vKiBVdGlsaXR5IG9mIGNiX3N5c2NhbGwgdG8gZmV0Y2ggYSBwYXRoIG5hbWUuCi0gICBUaGUgYnVmZmVyIGlzIG1hbGxvYydkIGFuZCB0aGUgYWRkcmVzcyBpcyBzdG9yZWQgaW4gQlVGUC4KLSAgIFRoZSByZXN1bHQgaXMgdGhhdCBvZiBnZXRfc3RyaW5nLgotICAgSWYgYW4gZXJyb3Igb2NjdXJzLCBubyBidWZmZXIgaXMgbGVmdCBtYWxsb2MnZC4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9wYXRoIChjYiwgc2MsIGFkZHIsIGJ1ZnApCi0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBDQl9TWVNDQUxMICpzYzsKLSAgICAgVEFERFIgYWRkcjsKLSAgICAgY2hhciAqKmJ1ZnA7Ci17Ci0gIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKE1BWF9QQVRIX0xFTik7Ci0gIGludCByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZ2V0X3N0cmluZyAoY2IsIHNjLCBidWYsIE1BWF9QQVRIX0xFTiwgYWRkcik7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICAqYnVmcCA9IGJ1ZjsKLSAgZWxzZQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFBlcmZvcm0gYSBzeXN0ZW0gY2FsbCBvbiBiZWhhbGYgb2YgdGhlIHRhcmdldC4gICovCi0KLUNCX1JDCi1jYl9zeXNjYWxsIChjYiwgc2MpCi0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBDQl9TWVNDQUxMICpzYzsKLXsKLSAgVFdPUkQgcmVzdWx0ID0gMCwgZXJyY29kZSA9IDA7Ci0KLSAgaWYgKHNjLT5tYWdpYyAhPSBDQl9TWVNDQUxMX01BR0lDKQotICAgIGFib3J0ICgpOwotCi0gIHN3aXRjaCAoY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCAoY2IsIHNjLT5mdW5jKSkKLSAgICB7Ci0jaWYgMCAvKiBGSVhNRTogd2lwICovCi0gICAgY2FzZSBDQl9TWVNfYXJndmxlbiA6Ci0gICAgICB7Ci0JLyogQ29tcHV0ZSBob3cgbXVjaCBzcGFjZSBpcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgYXJndixlbnZwCi0JICAgc3RyaW5ncyBzbyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBhbGxvY2F0ZSB0aGUgc3BhY2UgYW5kIHRoZW4KLQkgICBjYWxsIFNZU19hcmd2IHRvIGZldGNoIHRoZSB2YWx1ZXMuICAqLwotCWludCBhZGRyX3NpemUgPSBjYi0+YWRkcl9zaXplOwotCWludCBhcmdjLGVudmMsYXJnbGVuLGVudmxlbjsKLQljb25zdCBjaGFyICoqYXJndiA9IGNiLT5pbml0X2FyZ3Y7Ci0JY29uc3QgY2hhciAqKmVudnAgPSBjYi0+aW5pdF9lbnZwOwotCi0JYXJnYyA9IGFyZ2xlbiA9IDA7Ci0JaWYgKGFyZ3YpCi0JICB7Ci0JICAgIGZvciAoIDsgYXJndlthcmdjXTsgKythcmdjKQotCSAgICAgIGFyZ2xlbiArPSBzdHJsZW4gKGFyZ3ZbYXJnY10pICsgMTsKLQkgIH0KLQllbnZjID0gZW52bGVuID0gMDsKLQlpZiAoZW52cCkKLQkgIHsKLQkgICAgZm9yICggOyBlbnZwW2VudmNdOyArK2VudmMpCi0JICAgICAgZW52bGVuICs9IHN0cmxlbiAoZW52cFtlbnZjXSkgKyAxOwotCSAgfQotCXJlc3VsdCA9IGFyZ2xlbiArIGVudmxlbjsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgQ0JfU1lTX2FyZ3YgOgotICAgICAgewotCS8qIFBvaW50ZXIgdG8gdGFyZ2V0J3MgYnVmZmVyLiAgKi8KLQlUQUREUiB0YnVmID0gc2MtPmFyZzE7Ci0JLyogQnVmZmVyIHNpemUuICAqLwotCWludCBidWZzaXplID0gc2MtPmFyZzI7Ci0JLyogUSBpcyB0aGUgdGFyZ2V0IGFkZHJlc3Mgb2Ygd2hlcmUgYWxsIHRoZSBzdHJpbmdzIGdvLiAgKi8KLQlUQUREUiBxOwotCWludCB3b3JkX3NpemUgPSBjYi0+d29yZF9zaXplOwotCWludCBpLGFyZ2MsZW52YyxsZW47Ci0JY29uc3QgY2hhciAqKmFyZ3YgPSBjYi0+aW5pdF9hcmd2OwotCWNvbnN0IGNoYXIgKiplbnZwID0gY2ItPmluaXRfZW52cDsKLQotCWFyZ2MgPSAwOwotCWlmIChhcmd2KQotCSAgewotCSAgICBmb3IgKCA7IGFyZ3ZbYXJnY107ICsrYXJnYykKLQkgICAgICB7Ci0JCWludCBsZW4gPSBzdHJsZW4gKGFyZ3ZbYXJnY10pOwotCQlpbnQgd3JpdHRlbiA9ICgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgdGJ1ZiwgYXJndlthcmdjXSwgbGVuICsgMSk7Ci0JCWlmICh3cml0dGVuICE9IGxlbikKLQkJICB7Ci0JCSAgICByZXN1bHQgPSAtMTsKLQkJICAgIGVycmNvZGUgPSBFSU5WQUw7Ci0JCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JCSAgfQotCQl0YnVmID0gbGVuICsgMTsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKCgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgdGJ1ZiwgIiIsIDEpICE9IDEpCi0JICB7Ci0JICAgIHJlc3VsdCA9IC0xOwotCSAgICBlcnJjb2RlID0gRUlOVkFMOwotCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICB9Ci0JdGJ1ZisrOwotCWVudmMgPSAwOwotCWlmIChlbnZwKQotCSAgewotCSAgICBmb3IgKCA7IGVudnBbZW52Y107ICsrZW52YykKLQkgICAgICB7Ci0JCWludCBsZW4gPSBzdHJsZW4gKGVudnBbZW52Y10pOwotCQlpbnQgd3JpdHRlbiA9ICgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgdGJ1ZiwgZW52cFtlbnZjXSwgbGVuICsgMSk7Ci0JCWlmICh3cml0dGVuICE9IGxlbikKLQkJICB7Ci0JCSAgICByZXN1bHQgPSAtMTsKLQkJICAgIGVycmNvZGUgPSBFSU5WQUw7Ci0JCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JCSAgfQotCQl0YnVmID0gbGVuICsgMTsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKCgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgdGJ1ZiwgIiIsIDEpICE9IDEpCi0JICB7Ci0JICAgIHJlc3VsdCA9IC0xOwotCSAgICBlcnJjb2RlID0gRUlOVkFMOwotCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICB9Ci0JcmVzdWx0ID0gYXJnYzsKLQlzYy0+cmVzdWx0MiA9IGVudmM7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLyogd2lwICovCi0KLSAgICBjYXNlIENCX1NZU19leGl0IDoKLSAgICAgIC8qIENhbGxlciBtdXN0IGNhdGNoIGFuZCBoYW5kbGUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENCX1NZU19vcGVuIDoKLSAgICAgIHsKLQljaGFyICpwYXRoOwotCi0JZXJyY29kZSA9IGdldF9wYXRoIChjYiwgc2MsIHNjLT5hcmcxLCAmcGF0aCk7Ci0JaWYgKGVycmNvZGUgIT0gMCkKLQkgIHsKLQkgICAgcmVzdWx0ID0gLTE7Ci0JICAgIGdvdG8gRmluaXNoU3lzY2FsbDsKLQkgIH0KLQlyZXN1bHQgPSAoKmNiLT5vcGVuKSAoY2IsIHBhdGgsIHNjLT5hcmcyIC8qLCBzYy0+YXJnMyovKTsKLQlmcmVlIChwYXRoKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkgIGdvdG8gRXJyb3JGaW5pc2g7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ0JfU1lTX2Nsb3NlIDoKLSAgICAgIHJlc3VsdCA9ICgqY2ItPmNsb3NlKSAoY2IsIHNjLT5hcmcxKTsKLSAgICAgIGlmIChyZXN1bHQgPCAwKQotCWdvdG8gRXJyb3JGaW5pc2g7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ0JfU1lTX3JlYWQgOgotICAgICAgewotCS8qID8/PyBQZXJmZWN0IGhhbmRsaW5nIG9mIGVycm9yIGNvbmRpdGlvbnMgbWF5IHJlcXVpcmUgb25seSBvbmUKLQkgICBjYWxsIHRvIGNiLT5yZWFkLiAgT25lIGNhbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEgaXMKLQkgICBjb250aWd1b3VzbHkgc3RvcmVkIGluIGhvc3QgbWVtb3J5IHNvIHRoYXQgd291bGQgcmVxdWlyZQotCSAgIG1hbGxvYydpbmcvZnJlZSdpbmcgdGhlIHNwYWNlLiAgTWF5YmUgbGF0ZXIuICAqLwotCWNoYXIgYnVmW0ZJTEVfWEZSX1NJWkVdOwotCWludCBmZCA9IHNjLT5hcmcxOwotCVRBRERSIGFkZHIgPSBzYy0+YXJnMjsKLQlzaXplX3QgY291bnQgPSBzYy0+YXJnMzsKLQlzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0JaW50IGJ5dGVzX3dyaXR0ZW47Ci0KLQl3aGlsZSAoY291bnQgPiAwKQotCSAgewotCSAgICBpZiAoZmQgPT0gMCkKLQkgICAgICByZXN1bHQgPSAoaW50KSAoKmNiLT5yZWFkX3N0ZGluKSAoY2IsIGJ1ZiwKLQkJCQkJCShjb3VudCA8IEZJTEVfWEZSX1NJWkUKLQkJCQkJCSA/IGNvdW50IDogRklMRV9YRlJfU0laRSkpOwotCSAgICBlbHNlCi0JICAgICAgcmVzdWx0ID0gKGludCkgKCpjYi0+cmVhZCkgKGNiLCBmZCwgYnVmLAotCQkJCQkgIChjb3VudCA8IEZJTEVfWEZSX1NJWkUKLQkJCQkJICAgPyBjb3VudCA6IEZJTEVfWEZSX1NJWkUpKTsKLQkgICAgaWYgKHJlc3VsdCA9PSAtMSkKLQkgICAgICBnb3RvIEVycm9yRmluaXNoOwotCSAgICBpZiAocmVzdWx0ID09IDApCS8qIEVPRiAqLwotCSAgICAgIGJyZWFrOwotCSAgICBieXRlc193cml0dGVuID0gKCpzYy0+d3JpdGVfbWVtKSAoY2IsIHNjLCBhZGRyLCBidWYsIHJlc3VsdCk7Ci0JICAgIGlmIChieXRlc193cml0dGVuICE9IHJlc3VsdCkKLQkgICAgICB7Ci0JCXJlc3VsdCA9IC0xOwotCQllcnJjb2RlID0gRUlOVkFMOwotCQlnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICAgICAgfQotCSAgICBieXRlc19yZWFkICs9IHJlc3VsdDsKLQkgICAgY291bnQgLT0gcmVzdWx0OwotCSAgICBhZGRyICs9IHJlc3VsdDsKLQkgICAgLyogSWYgdGhpcyBpcyBhIHNob3J0IHJlYWQsIGRvbid0IGdvIGJhY2sgZm9yIG1vcmUgKi8KLQkgICAgaWYgKHJlc3VsdCAhPSBGSUxFX1hGUl9TSVpFKQotCSAgICAgIGJyZWFrOwotCSAgfQotCXJlc3VsdCA9IGJ5dGVzX3JlYWQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ0JfU1lTX3dyaXRlIDoKLSAgICAgIHsKLQkvKiA/Pz8gUGVyZmVjdCBoYW5kbGluZyBvZiBlcnJvciBjb25kaXRpb25zIG1heSByZXF1aXJlIG9ubHkgb25lCi0JICAgY2FsbCB0byBjYi0+d3JpdGUuICBPbmUgY2FuJ3QgYXNzdW1lIGFsbCB0aGUgZGF0YSBpcwotCSAgIGNvbnRpZ3VvdXNseSBzdG9yZWQgaW4gaG9zdCBtZW1vcnkgc28gdGhhdCB3b3VsZCByZXF1aXJlCi0JICAgbWFsbG9jJ2luZy9mcmVlJ2luZyB0aGUgc3BhY2UuICBNYXliZSBsYXRlci4gICovCi0JY2hhciBidWZbRklMRV9YRlJfU0laRV07Ci0JaW50IGZkID0gc2MtPmFyZzE7Ci0JVEFERFIgYWRkciA9IHNjLT5hcmcyOwotCXNpemVfdCBjb3VudCA9IHNjLT5hcmczOwotCWludCBieXRlc19yZWFkOwotCXNpemVfdCBieXRlc193cml0dGVuID0gMDsKLQotCXdoaWxlIChjb3VudCA+IDApCi0JICB7Ci0JICAgIGludCBieXRlc190b19yZWFkID0gY291bnQgPCBGSUxFX1hGUl9TSVpFID8gY291bnQgOiBGSUxFX1hGUl9TSVpFOwotCSAgICBieXRlc19yZWFkID0gKCpzYy0+cmVhZF9tZW0pIChjYiwgc2MsIGFkZHIsIGJ1ZiwgYnl0ZXNfdG9fcmVhZCk7Ci0JICAgIGlmIChieXRlc19yZWFkICE9IGJ5dGVzX3RvX3JlYWQpCi0JICAgICAgewotCQlyZXN1bHQgPSAtMTsKLQkJZXJyY29kZSA9IEVJTlZBTDsKLQkJZ290byBGaW5pc2hTeXNjYWxsOwotCSAgICAgIH0KLQkgICAgaWYgKGZkID09IDEpCi0JICAgICAgewotCQlyZXN1bHQgPSAoaW50KSAoKmNiLT53cml0ZV9zdGRvdXQpIChjYiwgYnVmLCBieXRlc19yZWFkKTsKLQkJKCpjYi0+Zmx1c2hfc3Rkb3V0KSAoY2IpOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoZmQgPT0gMikKLQkgICAgICB7Ci0JCXJlc3VsdCA9IChpbnQpICgqY2ItPndyaXRlX3N0ZGVycikgKGNiLCBidWYsIGJ5dGVzX3JlYWQpOwotCQkoKmNiLT5mbHVzaF9zdGRlcnIpIChjYik7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgcmVzdWx0ID0gKGludCkgKCpjYi0+d3JpdGUpIChjYiwgZmQsIGJ1ZiwgYnl0ZXNfcmVhZCk7Ci0JICAgIGlmIChyZXN1bHQgPT0gLTEpCi0JICAgICAgZ290byBFcnJvckZpbmlzaDsKLQkgICAgYnl0ZXNfd3JpdHRlbiArPSByZXN1bHQ7Ci0JICAgIGNvdW50IC09IHJlc3VsdDsKLQkgICAgYWRkciArPSByZXN1bHQ7Ci0JICB9Ci0JcmVzdWx0ID0gYnl0ZXNfd3JpdHRlbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDQl9TWVNfbHNlZWsgOgotICAgICAgewotCWludCBmZCA9IHNjLT5hcmcxOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2MtPmFyZzI7Ci0JaW50IHdoZW5jZSA9IHNjLT5hcmczOwotCi0JcmVzdWx0ID0gKCpjYi0+bHNlZWspIChjYiwgZmQsIG9mZnNldCwgd2hlbmNlKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkgIGdvdG8gRXJyb3JGaW5pc2g7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ0JfU1lTX3VubGluayA6Ci0gICAgICB7Ci0JY2hhciAqcGF0aDsKLQotCWVycmNvZGUgPSBnZXRfcGF0aCAoY2IsIHNjLCBzYy0+YXJnMSwgJnBhdGgpOwotCWlmIChlcnJjb2RlICE9IDApCi0JICB7Ci0JICAgIHJlc3VsdCA9IC0xOwotCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICB9Ci0JcmVzdWx0ID0gKCpjYi0+dW5saW5rKSAoY2IsIHBhdGgpOwotCWZyZWUgKHBhdGgpOwotCWlmIChyZXN1bHQgPCAwKQotCSAgZ290byBFcnJvckZpbmlzaDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDQl9TWVNfc3RhdCA6Ci0gICAgICB7Ci0JY2hhciAqcGF0aCwqYnVmOwotCWludCBidWZsZW47Ci0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQlUQUREUiBhZGRyID0gc2MtPmFyZzI7Ci0KLQllcnJjb2RlID0gZ2V0X3BhdGggKGNiLCBzYywgc2MtPmFyZzEsICZwYXRoKTsKLQlpZiAoZXJyY29kZSAhPSAwKQotCSAgewotCSAgICByZXN1bHQgPSAtMTsKLQkgICAgZ290byBGaW5pc2hTeXNjYWxsOwotCSAgfQotCXJlc3VsdCA9ICgqY2ItPnN0YXQpIChjYiwgcGF0aCwgJnN0YXRidWYpOwotCWZyZWUgKHBhdGgpOwotCWlmIChyZXN1bHQgPCAwKQotCSAgZ290byBFcnJvckZpbmlzaDsKLQlidWZsZW4gPSBjYl9ob3N0X3RvX3RhcmdldF9zdGF0IChjYiwgTlVMTCwgTlVMTCk7Ci0JYnVmID0geG1hbGxvYyAoYnVmbGVuKTsKLQlpZiAoY2JfaG9zdF90b190YXJnZXRfc3RhdCAoY2IsICZzdGF0YnVmLCBidWYpICE9IGJ1ZmxlbikKLQkgIHsKLQkgICAgLyogVGhlIHRyYW5zbGF0aW9uIGZhaWxlZC4gIFRoaXMgaXMgZHVlIHRvIGFuIGludGVybmFsCi0JICAgICAgIGhvc3QgcHJvZ3JhbSBlcnJvciwgbm90IHRoZSB0YXJnZXQncyBmYXVsdC4gICovCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICAgIGVycmNvZGUgPSBFTk9TWVM7Ci0JICAgIHJlc3VsdCA9IC0xOwotCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICB9Ci0JaWYgKCgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgYWRkciwgYnVmLCBidWZsZW4pICE9IGJ1ZmxlbikKLQkgIHsKLQkgICAgZnJlZSAoYnVmKTsKLQkgICAgZXJyY29kZSA9IEVJTlZBTDsKLQkgICAgcmVzdWx0ID0gLTE7Ci0JICAgIGdvdG8gRmluaXNoU3lzY2FsbDsKLQkgIH0KLQlmcmVlIChidWYpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENCX1NZU19mc3RhdCA6Ci0gICAgICB7Ci0JY2hhciAqYnVmOwotCWludCBidWZsZW47Ci0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQlUQUREUiBhZGRyID0gc2MtPmFyZzI7Ci0KLQlyZXN1bHQgPSAoKmNiLT5mc3RhdCkgKGNiLCBzYy0+YXJnMSwgJnN0YXRidWYpOwotCWlmIChyZXN1bHQgPCAwKQotCSAgZ290byBFcnJvckZpbmlzaDsKLQlidWZsZW4gPSBjYl9ob3N0X3RvX3RhcmdldF9zdGF0IChjYiwgTlVMTCwgTlVMTCk7Ci0JYnVmID0geG1hbGxvYyAoYnVmbGVuKTsKLQlpZiAoY2JfaG9zdF90b190YXJnZXRfc3RhdCAoY2IsICZzdGF0YnVmLCBidWYpICE9IGJ1ZmxlbikKLQkgIHsKLQkgICAgLyogVGhlIHRyYW5zbGF0aW9uIGZhaWxlZC4gIFRoaXMgaXMgZHVlIHRvIGFuIGludGVybmFsCi0JICAgICAgIGhvc3QgcHJvZ3JhbSBlcnJvciwgbm90IHRoZSB0YXJnZXQncyBmYXVsdC4gICovCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICAgIGVycmNvZGUgPSBFTk9TWVM7Ci0JICAgIHJlc3VsdCA9IC0xOwotCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7Ci0JICB9Ci0JaWYgKCgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgYWRkciwgYnVmLCBidWZsZW4pICE9IGJ1ZmxlbikKLQkgIHsKLQkgICAgZnJlZSAoYnVmKTsKLQkgICAgZXJyY29kZSA9IEVJTlZBTDsKLQkgICAgcmVzdWx0ID0gLTE7Ci0JICAgIGdvdG8gRmluaXNoU3lzY2FsbDsKLQkgIH0KLQlmcmVlIChidWYpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENCX1NZU190aW1lIDoKLSAgICAgIHsKLQkvKiBGSVhNRTogTWF5IHdpc2ggdG8gY2hhbmdlIENCX1NZU190aW1lIHRvIHNvbWV0aGluZyBlbHNlLgotCSAgIFdlIG1pZ2h0IGFsc28gd2FudCBnZXR0aW1lb2ZkYXkgb3IgdGltZXMsIGJ1dCBpZiBzeXN0ZW0gY2FsbHMKLQkgICBjYW4gYmUgYnVpbHQgb24gb3RoZXJzLCB3ZSBjYW4ga2VlcCB0aGUgbnVtYmVyIHdlIGhhdmUgdG8gc3VwcG9ydAotCSAgIGhlcmUgZG93bi4gICovCi0JdGltZV90IHQgPSAoKmNiLT50aW1lKSAoY2IsICh0aW1lX3QgKikgMCk7Ci0JcmVzdWx0ID0gdDsKLQkvKiBJdCBpcyB1cCB0byB0YXJnZXQgY29kZSB0byBwcm9jZXNzIHRoZSBhcmd1bWVudCB0byB0aW1lKCkuICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENCX1NZU19jaGRpciA6Ci0gICAgY2FzZSBDQl9TWVNfY2htb2QgOgotICAgIGNhc2UgQ0JfU1lTX3V0aW1lIDoKLSAgICAgIC8qIGZhbGwgdGhyb3VnaCBmb3Igbm93ICovCi0KLSAgICBkZWZhdWx0IDoKLSAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgZXJyY29kZSA9IEVOT1NZUzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotIEZpbmlzaFN5c2NhbGw6Ci0gIHNjLT5yZXN1bHQgPSByZXN1bHQ7Ci0gIGlmIChlcnJjb2RlID09IDApCi0gICAgc2MtPmVycmNvZGUgPSAwOwotICBlbHNlCi0gICAgc2MtPmVycmNvZGUgPSBjYl9ob3N0X3RvX3RhcmdldF9lcnJubyAoY2IsIGVycmNvZGUpOwotICByZXR1cm4gQ0JfUkNfT0s7Ci0KLSBFcnJvckZpbmlzaDoKLSAgc2MtPnJlc3VsdCA9IHJlc3VsdDsKLSAgc2MtPmVycmNvZGUgPSAoKmNiLT5nZXRfZXJybm8pIChjYik7Ci0gIHJldHVybiBDQl9SQ19PSzsKLX0KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vdGNvbmZpZy5pbiBiL3NpbS9jb21tb24vdGNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4YjViZS4uMDAwMDAwMAotLS0gYS9zaW0vY29tbW9uL3Rjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBEZWZhdWx0IHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuCi0gICBUbyBvdmVycmlkZSB0aGlzLCBjcmVhdGUgZmlsZSBgdGNvbmZpZy5pbicgaW4gdGhlIHNpbXVsYXRvcidzCi0gICBzb3VyY2UgZGlyZWN0b3J5LiAgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBwcm9maWxpbmcuCi0gICBTZWUgdGhlIG1pcHMgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLXAgZm9vJyBhbmQgYC1zIGJhcicgb3B0aW9ucy4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3Byb2ZpbGV7LF9zaXplfS4gICovCi0vKiAjZGVmaW5lIFNJTV9IQVZFX1BST0ZJTEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciB1c2VzIGFuIGluc3RydWN0aW9uIGNhY2hlLgotICAgU2VlIHRoZSBoOC8zMDAgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLWMgc2l6ZScgb3B0aW9uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuCi0gICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9zaW1jYWNoZV9zaXplLiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfU0lNQ0FDSEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHRhcmdldCBjcHUgaXMgYmktZW5kaWFuCi0gICBhbmQgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBpdC4gICovCi0vKiAjZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOICovCmRpZmYgLS1naXQgYS9zaW0vY29uZmlndXJlIGIvc2ltL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdkM2JkOC4uMDAwMDAwMAotLS0gYS9zaW0vY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTkxMSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltICIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNjY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5NzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzExOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3MjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTMwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA0MjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDYzOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDgxOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDEyNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyODA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjg1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi0KLQotIyBJZiBhIGNwdSBldmVyIGhhcyBtb3JlIHRoYW4gb25lIHNpbXVsYXRvciB0byBjaG9vc2UgZnJvbSwgdXNlCi0jIC0tZW5hYmxlLXNpbT0uLi4gdG8gY2hvb3NlLgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbSBvciAtLWRpc2FibGUtc2ltIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi15ZXMgfCBubykgOzsKLSopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgLS1lbmFibGUtc2ltIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLSMgQXNzdW1lIHNpbXVsYXRvciBjYW4gYmUgYnVpbHQgd2l0aCBjYy4KLSMgSWYgdGhlIHVzZXIgcGFzc2VzIC0tZW5hYmxlLXNpbSBidWlsdCBpdCByZWdhcmRsZXNzIG9mICQoQ0MpLgotb25seV9pZl9nY2M9bm8KLW9ubHlfaWZfZW5hYmxlZD1ubwotZXh0cmFfc3ViZGlycz1jb21tb24KLQotIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgotIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91Ci0jICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCi0jICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgotCi1jYXNlICIke3RhcmdldH0iIGluCi0gIGFybSotKi0qIHwgdGh1bWIqLSotKikKLQlzaW1fdGFyZ2V0PWFybQotCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gdGVzdHN1aXRlIgotCTs7Ci0gIHN0cm9uZ2FybSotKi0qKQlzaW1fdGFyZ2V0PWFybSA7OwotICBkMTB2LSotKikJCXNpbV90YXJnZXQ9ZDEwdiA7OwotICBkMzB2LSotKikKLQlzaW1fdGFyZ2V0PWQzMHYKLQlvbmx5X2lmX2djYz15ZXMKLQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCi0JOzsKLSAgZnIzMC0qLSopCQlzaW1fdGFyZ2V0PWZyMzAgOzsKLSAgaDgzMDAqLSotKikJCXNpbV90YXJnZXQ9aDgzMDAgOzsKLSAgaDg1MDAtKi0qKQkJc2ltX3RhcmdldD1oODUwMCA7OwotICBpOTYwLSotKikJCXNpbV90YXJnZXQ9aTk2MCA7OwotICBtMzJyLSotKikJCXNpbV90YXJnZXQ9bTMyciA7OwotICBtY29yZS0qLSopCQlzaW1fdGFyZ2V0PW1jb3JlIDs7Ci0gIG1pcHMqLSotKikKLQkjIFRoZSBNSVBTIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jc2ltX3RhcmdldD1taXBzCi0Jb25seV9pZl9nY2M9eWVzCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCTs7Ci0gIG1uMTAzMDAqLSotKikKLQkjIFRoZSBtbjEwMzAwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jc2ltX3RhcmdldD1tbjEwMzAwCi0Jb25seV9pZl9nY2M9eWVzCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCTs7Ci0gIG1uMTAyMDAqLSotKikKLQlzaW1fdGFyZ2V0PW1uMTAyMDAKLQk7OwotICBzaCotKi0qKQkJc2ltX3RhcmdldD1zaCA7OwotICBwb3dlcnBjKi0qLWVhYmkqIHwgcG93ZXJwYyotKi1zb2xhcmlzKiB8IHBvd2VycGMqLSotc3lzdjQqIHwgcG93ZXJwYyotKi1lbGYqIHwgcG93ZXJwYyotKi1saW51eCogKQotCSMgVGhlIFBvd2VyUEMgc2ltdWxhdG9yIHVzZXMgdGhlIEdDQyBleHRlbnNpb24gbG9uZyBsb25nIGFzIHdlbGwgYXMKLQkjIEFOU0kgcHJvdG90eXBlcywgc28gZG9uJ3QgZW5hYmxlIGl0IGZvciByYW5kb20gaG9zdCBjb21waWxlcnMKLQkjIHVubGVzcyBhc2tlZCB0by4KLQlzaW1fdGFyZ2V0PXBwYwotCW9ubHlfaWZfZ2NjPXllcwotCSNleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IgotCTs7Ci0gIHY4NTAtKi0qKQotCSMgVGhlIFY4NTAgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KLQlzaW1fdGFyZ2V0PXY4NTAKLQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCi0Jb25seV9pZl9nY2M9eWVzCi0JOzsKLSAgdjg1MGUtKi0qKQotCSMgVGhlIFY4NTAgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KLQlzaW1fdGFyZ2V0PXY4NTAKLQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCi0Jb25seV9pZl9nY2M9eWVzCi0JOzsKLSAgdjg1MGVhLSotKikKLQkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jc2ltX3RhcmdldD12ODUwCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCW9ubHlfaWZfZ2NjPXllcwotCTs7Ci0gIHc2NS0qLSopCi0Jc2ltX3RhcmdldD13NjUKLQkjIFRoZSB3NjUgaXMgc3VmZmVyaW5nIGZyb20gZ3JhZHVhbCBkZWNheS4KLQlvbmx5X2lmX2VuYWJsZWQ9eWVzCi0JOzsKLSAgejhrKi0qLSopCQlzaW1fdGFyZ2V0PXo4ayA7OwotICBzcGFyYzY0LSotKikKLQlvbmx5X2lmX2djYz15ZXMKLQlzaW1fdGFyZ2V0PW5vbmUgIyBEb24ndCBidWlsZCBlcmMzMiBpZiBzcGFyYzY0LgotCTs7Ci0gIHNwYXJjbGl0ZSotKi0qIHwgc3BhcmM4NngqLSotKikKLQkjIFRoZSBTUEFSQyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgotCW9ubHlfaWZfZ2NjPXllcwotCXNpbV90YXJnZXQ9ZXJjMzIKLQk7OwotICBzcGFyYyotKi0qKQotCSMgVGhlIFNQQVJDIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jb25seV9pZl9nY2M9eWVzCi0JIyBVbmZvcnR1bmF0ZWx5IGVyYzMyIHdvbid0IGJ1aWxkIG9uIG1hbnkgaG9zdHMsIHNvIG9ubHkgZW5hYmxlCi0JIyBpdCBpZiB0aGUgdXNlciByZWFsbHkgcmVhbGx5IHdhbnRzIGl0LgotCW9ubHlfaWZfZW5hYmxlZD15ZXMKLQlzaW1fdGFyZ2V0PWVyYzMyCi0JOzsKLSAgKikJCQlzaW1fdGFyZ2V0PW5vbmUgOzsKLWVzYWMKLQotCi0jIElzIHRoZXJlIGEgdGVzdHN1aXRlIGRpcmVjdG9yeSBmb3IgdGhlIHRhcmdldD8KLXRlc3RkaXI9YGVjaG8gJHt0YXJnZXR9IHwgc2VkIC1lICdzLy0uKi0vLS8nYAotaWYgdGVzdCAtciAke3NyY2Rpcn0vdGVzdHN1aXRlLyR7dGVzdGRpcn0vY29uZmlndXJlIDsgdGhlbgotICBleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IHRlc3RzdWl0ZSIKLWZpCi0KLQotY2FzZSAiJHtlbmFibGVfc2ltfSIgaW4KLW5vKQlzaW1fdGFyZ2V0PW5vbmUgOzsKLXllcykKLQlpZiB0ZXN0ICR7b25seV9pZl9nY2N9ID0geWVzIDsgdGhlbgotCQlpZiB0ZXN0ICIke0dDQ30iICE9IHllcyA7IHRoZW4KLQkJCWVjaG8gIkNhbid0IGVuYWJsZSBzaW11bGF0b3Igc2luY2Ugbm90IGNvbXBpbGluZyB3aXRoIEdDQy4iCi0JCQlzaW1fdGFyZ2V0PW5vbmUKLQkJZmkKLQlmaQotCTs7Ci0qKQotCWlmIHRlc3QgJHtvbmx5X2lmX2VuYWJsZWR9ID0geWVzIDsgdGhlbgotCQlzaW1fdGFyZ2V0PW5vbmUKLQllbHNlCi0JCWlmIHRlc3QgJHtvbmx5X2lmX2djY30gPSB5ZXMgOyB0aGVuCi0JCQlpZiB0ZXN0ICIke0dDQ30iICE9IHllcyA7IHRoZW4KLQkJCQlzaW1fdGFyZ2V0PW5vbmUKLQkJCWZpCi0JCWZpCi0JZmkKLQk7OwotZXNhYwotCi1pZiB0ZXN0IHgiJHtzaW1fdGFyZ2V0fSIgIT0geG5vbmUgOyB0aGVuCi0JY29uZmlnZGlycz0iJHtleHRyYV9zdWJkaXJzfSAke3NpbV90YXJnZXR9IgotCXN1YmRpcnM9IiRjb25maWdkaXJzIgotCi1maQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCi0jIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgotIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgotY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZwotcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKLXMlXFslXFwmJWcKLXMlXF0lXFwmJWcKLXMlXCQlJCQlZwotRU9GCi1ERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKLXJtIC1mIGNvbmZ0ZXN0LmRlZnMKLQotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVAc3ViZGlyc0AlJHN1YmRpcnMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQotaWYgdGVzdCAiJG5vX3JlY3Vyc2lvbiIgIT0geWVzOyB0aGVuCi0KLSAgIyBSZW1vdmUgLS1jYWNoZS1maWxlIGFuZCAtLXNyY2RpciBhcmd1bWVudHMgc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPQotICBhY19wcmV2PQotICBmb3IgYWNfYXJnIGluICRhY19jb25maWd1cmVfYXJnczsgZG8KLSAgICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICAgIGFjX3ByZXY9Ci0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gICAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgICAgOzsKLSAgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgICAgOzsKLSAgICAqKSBhY19zdWJfY29uZmlndXJlX2FyZ3M9IiRhY19zdWJfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBmb3IgYWNfY29uZmlnX2RpciBpbiAkY29uZmlnZGlyczsgZG8KLQotICAgICMgRG8gbm90IGNvbXBsYWluLCBzbyBhIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGNvbmZpZ3VyZSB3aGljaGV2ZXIKLSAgICAjIHBhcnRzIG9mIGEgbGFyZ2Ugc291cmNlIHRyZWUgYXJlIHByZXNlbnQuCi0gICAgaWYgdGVzdCAhIC1kICRzcmNkaXIvJGFjX2NvbmZpZ19kaXI7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGVjaG8gY29uZmlndXJpbmcgaW4gJGFjX2NvbmZpZ19kaXIKLQotICAgIGNhc2UgIiRzcmNkaXIiIGluCi0gICAgLikgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAtZCAuLyRhY19jb25maWdfZGlyIHx8IG1rZGlyIC4vJGFjX2NvbmZpZ19kaXI7IHRoZW4gOjsKLSAgICAgIGVsc2UKLSAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGNyZWF0ZSBgcHdkYC8kYWNfY29uZmlnX2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBhY19wb3BkaXI9YHB3ZGAKLSAgICBjZCAkYWNfY29uZmlnX2RpcgotCi0gICAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluIC8kYWNfY29uZmlnX2Rpci4KLSAgICAgIGFjX2RvdHM9YGVjaG8gJGFjX2NvbmZpZ19kaXJ8c2VkIC1lICdzJV5cLi8lJScgLWUgJ3MlW14vXSQlJi8lJyAtZSAncyVbXi9dKi8lLi4vJWcnYAotCi0gICAgY2FzZSAiJHNyY2RpciIgaW4KLSAgICAuKSAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2RpciA7OwotICAgIC8qKSAjIEFic29sdXRlIHBhdGguCi0gICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIvJGFjX2NvbmZpZ19kaXIgOzsKLSAgICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgICBhY19zdWJfc3JjZGlyPSRhY19kb3RzJHNyY2Rpci8kYWNfY29uZmlnX2RpciA7OwotICAgIGVzYWMKLQotICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlOyBvdGhlcndpc2UgZ2V0IEN5Z251cyBzdHlsZSBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmU7IHRoZW4KLSAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlCi0gICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgotICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfY29uZmlndXJlCi0gICAgZWxzZQotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19jb25maWdfZGlyIiAxPiYyCi0gICAgICBhY19zdWJfY29uZmlndXJlPQotICAgIGZpCi0KLSAgICAjIFRoZSByZWN1cnNpb24gaXMgaGVyZS4KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3ViX2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBNYWtlIHRoZSBjYWNoZSBmaWxlIG5hbWUgY29ycmVjdCByZWxhdGl2ZSB0byB0aGUgc3ViZGlyZWN0b3J5LgotICAgICAgY2FzZSAiJGNhY2hlX2ZpbGUiIGluCi0gICAgICAvKikgYWNfc3ViX2NhY2hlX2ZpbGU9JGNhY2hlX2ZpbGUgOzsKLSAgICAgICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICAgICAgYWNfc3ViX2NhY2hlX2ZpbGU9IiRhY19kb3RzJGNhY2hlX2ZpbGUiIDs7Ci0gICAgICBlc2FjCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICAgICAgICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICAgICAgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgZWNobyAicnVubmluZyAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfc3ViX2NvbmZpZ3VyZSAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIC0tY2FjaGUtZmlsZT0kYWNfc3ViX2NhY2hlX2ZpbGUgLS1zcmNkaXI9JGFjX3N1Yl9zcmNkaXIiCi0gICAgICAjIFRoZSBldmFsIG1ha2VzIHF1b3RpbmcgYXJndW1lbnRzIHdvcmsuCi0gICAgICBpZiBldmFsICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpcgotICAgICAgdGhlbiA6Ci0gICAgICBlbHNlCi0gICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfY29uZmlnX2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICBmaQotICAgIGZpCi0KLSAgICBjZCAkYWNfcG9wZGlyCi0gIGRvbmUKLWZpCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9zaW0vY29uZmlndXJlLmluIGIvc2ltL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlZTI2MC4uMDAwMDAwMAotLS0gYS9zaW0vY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLUFDX0NIRUNLX1RPT0woQVIsIGFyKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLQotQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLikKLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0FSR19QUk9HUkFNCi1BQ19QUk9HX0NDCi1BQ19TVUJTVChDRkxBR1MpCi1BQ19TVUJTVChIREVGSU5FUykKLUFSPSR7QVItYXJ9Ci1BQ19TVUJTVChBUikKLUFDX1BST0dfUkFOTElCCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi0KLSMgSWYgYSBjcHUgZXZlciBoYXMgbW9yZSB0aGFuIG9uZSBzaW11bGF0b3IgdG8gY2hvb3NlIGZyb20sIHVzZQotIyAtLWVuYWJsZS1zaW09Li4uIHRvIGNob29zZS4KLUFDX0FSR19FTkFCTEUoc2ltLAotWyAgLS1lbmFibGUtc2ltIF0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgoteWVzIHwgbm8pIDs7Ci0qKQlBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgLS1lbmFibGUtc2ltIG9wdGlvbikgOzsKLWVzYWNdKQotCi0jIEFzc3VtZSBzaW11bGF0b3IgY2FuIGJlIGJ1aWx0IHdpdGggY2MuCi0jIElmIHRoZSB1c2VyIHBhc3NlcyAtLWVuYWJsZS1zaW0gYnVpbHQgaXQgcmVnYXJkbGVzcyBvZiAkKENDKS4KLW9ubHlfaWZfZ2NjPW5vCi1vbmx5X2lmX2VuYWJsZWQ9bm8KLWV4dHJhX3N1YmRpcnM9Y29tbW9uCi0KLSMgV0hFTiBBRERJTkcgRU5UUklFUyBUTyBUSElTIE1BVFJJWDoKLSMgIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IHNpZGUgYWx3YXlzIGhhcyB0d28gZGFzaGVzLiAgT3RoZXJ3aXNlIHlvdQotIyAgY2FuIGdldCBzcHVyaW91cyBtYXRjaGVzLiAgRXZlbiBmb3IgdW5hbWJpZ3VvdXMgY2FzZXMsIGRvIHRoaXMgYXMgYQotIyAgY29udmVudGlvbiwgZWxzZSB0aGUgdGFibGUgYmVjb21lcyBhIHJlYWwgbWVzcyB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4KLQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBhcm0qLSotKiB8IHRodW1iKi0qLSopCi0Jc2ltX3RhcmdldD1hcm0KLQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IHRlc3RzdWl0ZSIKLQk7OwotICBzdHJvbmdhcm0qLSotKikJc2ltX3RhcmdldD1hcm0gOzsKLSAgZDEwdi0qLSopCQlzaW1fdGFyZ2V0PWQxMHYgOzsKLSAgZDMwdi0qLSopCi0Jc2ltX3RhcmdldD1kMzB2Ci0Jb25seV9pZl9nY2M9eWVzCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCTs7Ci0gIGZyMzAtKi0qKQkJc2ltX3RhcmdldD1mcjMwIDs7Ci0gIGg4MzAwKi0qLSopCQlzaW1fdGFyZ2V0PWg4MzAwIDs7Ci0gIGg4NTAwLSotKikJCXNpbV90YXJnZXQ9aDg1MDAgOzsKLSAgaTk2MC0qLSopCQlzaW1fdGFyZ2V0PWk5NjAgOzsKLSAgbTMyci0qLSopCQlzaW1fdGFyZ2V0PW0zMnIgOzsKLSAgbWNvcmUtKi0qKQkJc2ltX3RhcmdldD1tY29yZSA7OwotICBtaXBzKi0qLSopCi0JIyBUaGUgTUlQUyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgotCXNpbV90YXJnZXQ9bWlwcwotCW9ubHlfaWZfZ2NjPXllcwotCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKLQk7OwotICBtbjEwMzAwKi0qLSopCi0JIyBUaGUgbW4xMDMwMCBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgotCXNpbV90YXJnZXQ9bW4xMDMwMAotCW9ubHlfaWZfZ2NjPXllcwotCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKLQk7OwotICBtbjEwMjAwKi0qLSopCi0Jc2ltX3RhcmdldD1tbjEwMjAwCi0JOzsKLSAgc2gqLSotKikJCXNpbV90YXJnZXQ9c2ggOzsKLSAgcG93ZXJwYyotKi1lYWJpKiB8IHBvd2VycGMqLSotc29sYXJpcyogfCBwb3dlcnBjKi0qLXN5c3Y0KiB8IHBvd2VycGMqLSotZWxmKiB8IHBvd2VycGMqLSotbGludXgqICkKLQkjIFRoZSBQb3dlclBDIHNpbXVsYXRvciB1c2VzIHRoZSBHQ0MgZXh0ZW5zaW9uIGxvbmcgbG9uZyBhcyB3ZWxsIGFzCi0JIyBBTlNJIHByb3RvdHlwZXMsIHNvIGRvbid0IGVuYWJsZSBpdCBmb3IgcmFuZG9tIGhvc3QgY29tcGlsZXJzCi0JIyB1bmxlc3MgYXNrZWQgdG8uCi0Jc2ltX3RhcmdldD1wcGMKLQlvbmx5X2lmX2djYz15ZXMKLQkjZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSIKLQk7OwotICB2ODUwLSotKikKLQkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jc2ltX3RhcmdldD12ODUwCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCW9ubHlfaWZfZ2NjPXllcwotCTs7Ci0gIHY4NTBlLSotKikKLQkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCi0Jc2ltX3RhcmdldD12ODUwCi0JZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgotCW9ubHlfaWZfZ2NjPXllcwotCTs7Ci0gIHY4NTBlYS0qLSopCi0JIyBUaGUgVjg1MCBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgotCXNpbV90YXJnZXQ9djg1MAotCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKLQlvbmx5X2lmX2djYz15ZXMKLQk7OwotICB3NjUtKi0qKQotCXNpbV90YXJnZXQ9dzY1Ci0JIyBUaGUgdzY1IGlzIHN1ZmZlcmluZyBmcm9tIGdyYWR1YWwgZGVjYXkuCi0Jb25seV9pZl9lbmFibGVkPXllcwotCTs7Ci0gIHo4ayotKi0qKQkJc2ltX3RhcmdldD16OGsgOzsKLSAgc3BhcmM2NC0qLSopCi0Jb25seV9pZl9nY2M9eWVzCi0Jc2ltX3RhcmdldD1ub25lICMgRG9uJ3QgYnVpbGQgZXJjMzIgaWYgc3BhcmM2NC4KLQk7OwotICBzcGFyY2xpdGUqLSotKiB8IHNwYXJjODZ4Ki0qLSopCi0JIyBUaGUgU1BBUkMgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KLQlvbmx5X2lmX2djYz15ZXMKLQlzaW1fdGFyZ2V0PWVyYzMyCi0JOzsKLSAgc3BhcmMqLSotKikKLQkjIFRoZSBTUEFSQyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgotCW9ubHlfaWZfZ2NjPXllcwotCSMgVW5mb3J0dW5hdGVseSBlcmMzMiB3b24ndCBidWlsZCBvbiBtYW55IGhvc3RzLCBzbyBvbmx5IGVuYWJsZQotCSMgaXQgaWYgdGhlIHVzZXIgcmVhbGx5IHJlYWxseSB3YW50cyBpdC4KLQlvbmx5X2lmX2VuYWJsZWQ9eWVzCi0Jc2ltX3RhcmdldD1lcmMzMgotCTs7Ci0gICopCQkJc2ltX3RhcmdldD1ub25lIDs7Ci1lc2FjCi0KLQotIyBJcyB0aGVyZSBhIHRlc3RzdWl0ZSBkaXJlY3RvcnkgZm9yIHRoZSB0YXJnZXQ/Ci10ZXN0ZGlyPWBlY2hvICR7dGFyZ2V0fSB8IHNlZCAtZSAncy8tLiotLy0vJ2AKLWlmIHRlc3QgLXIgJHtzcmNkaXJ9L3Rlc3RzdWl0ZS8ke3Rlc3RkaXJ9L2NvbmZpZ3VyZSA7IHRoZW4KLSAgZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSB0ZXN0c3VpdGUiCi1maQotCi0KLWNhc2UgIiR7ZW5hYmxlX3NpbX0iIGluCi1ubykJc2ltX3RhcmdldD1ub25lIDs7Ci15ZXMpCi0JaWYgdGVzdCAke29ubHlfaWZfZ2NjfSA9IHllcyA7IHRoZW4KLQkJaWYgdGVzdCAiJHtHQ0N9IiAhPSB5ZXMgOyB0aGVuCi0JCQllY2hvICJDYW4ndCBlbmFibGUgc2ltdWxhdG9yIHNpbmNlIG5vdCBjb21waWxpbmcgd2l0aCBHQ0MuIgotCQkJc2ltX3RhcmdldD1ub25lCi0JCWZpCi0JZmkKLQk7OwotKikKLQlpZiB0ZXN0ICR7b25seV9pZl9lbmFibGVkfSA9IHllcyA7IHRoZW4KLQkJc2ltX3RhcmdldD1ub25lCi0JZWxzZQotCQlpZiB0ZXN0ICR7b25seV9pZl9nY2N9ID0geWVzIDsgdGhlbgotCQkJaWYgdGVzdCAiJHtHQ0N9IiAhPSB5ZXMgOyB0aGVuCi0JCQkJc2ltX3RhcmdldD1ub25lCi0JCQlmaQotCQlmaQotCWZpCi0JOzsKLWVzYWMKLQotaWYgdGVzdCB4IiR7c2ltX3RhcmdldH0iICE9IHhub25lIDsgdGhlbgotCWNvbmZpZ2RpcnM9IiR7ZXh0cmFfc3ViZGlyc30gJHtzaW1fdGFyZ2V0fSIKLQlBQ19DT05GSUdfU1VCRElSUygkY29uZmlnZGlycykKLWZpCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9zaW0vZDEwdi9DaGFuZ2VMb2cgYi9zaW0vZDEwdi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDg5OTMuLjAwMDAwMDAKLS0tIGEvc2ltL2QxMHYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NCArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgQXByIDE4IDE2OjI2OjQxIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBEZWxpdmVyIFNJR0lMTC4KLQkobG9va3VwX2hhc2gpOiBEbyBub3QgcHJpbnQgU0lHSUxMIG1lc3NhZ2UuCi0KLVR1ZSBGZWIgMjIgMTg6MjQ6NTYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0NGTEFHUyk6IERlZmluZSBTSU1fSEFWRV9FTlZJUk9OTUVOVC4KLQkqIGludGVycC5jIChzaW1fc2V0X3RyYWNlKTogUmVwbGFjZSBzaW1fdHJhY2UuICBFbmFibGUgdHJhY2luZy4KLQotVHVlIEZlYiAgOCAxNzo0MToxMiAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKFNJR19EMTBWX0JVUyk6IERlZmluZS4KLQotCSogc2ltb3BzLmMgKGFkZHJlc3NfZXhjZXB0aW9uKTogRGVsZXRlIGZ1bmN0aW9uLgotCShPUF8zMDAwMDAwMCwgT1BfNjQwMSwgT1BfNjAwMSwgT1BfNjAwMCwgT1BfMzIwMTAwMDAsIE9QXzMxMDAwMDAwLAotIAlPUF82NjAxLCBPUF82MjAxLCBPUF82MjAwLCBPUF8zMzAxMDAwMCwgT1BfMzQwMDAwMDAsIE9QXzY4MDAsCi0gCU9QXzZDMUYsIE9QXzY4MDEsIE9QXzZDMDEsIE9QXzM2MDEwMDAwLCBPUF8zNTAwMDAwMCwgT1BfNkEwMCwKLSAJT1BfNkUxRiwgT1BfNkEwMSwgT1BfNkUwMSwgT1BfMzcwMTAwMDApOiBSZXBsYWNlIGNhbGwgdG8KLSAJYWRkcmVzc19leGNlcHRpb24gd2l0aCBjb2RlIHRoYXQgc2V0cyBTSUdfRDEwVl9CVVMuCi0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogV2hlbiBTSUdCVVMgb3IgU0lHU0VHViwgZGVsaXZlciBhIGJ1cwotIAllcnJvciB0byB0aGUgc2ltdWxhdG9yIGJlZm9yZSByZXN1bWluZyBleGVjdXRpb24uCi0JKHNpbV90cmFjZSk6IENoZWNrIHN0b3AgcmVhc29uIGFuZCB1c2UgdGhhdCB0byBkZXRlcm1pbmUgc2ltX3RyYWNlCi0gCXJldHVybiB2YWx1ZS4KLQkoc2ltX3N0b3BfcmVhc29uKTogRm9yIFNJR19EMTBWX0JVUyByZXR1cm4gYSBTSUdCVVMgLyBTSUdTRUdWCi0gCXNpZ3JjLgotCi1UdWUgSmFuIDE4IDE2OjA3OjQyIE1TVCAyMDAwCURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQ2hhbmdlIGludGVybmFsIGluaXRpYWwgdmFsdWUgZm9yCi0JRE1BUDIgdG8gMHgyMDAwLgotCi1Nb24gSmFuICAzIDAyOjA2OjA3IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGxvb2t1cF9oYXNoKTogU3RvcCB0aGUgdXBkYXRlIG9mIHRoZSBQQyB3aGVuIHRoZXJlIHdhcwotIAlhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGV4Y2VwdGlvbi4KLQotTW9uIEphbiAgMyAwMDoxNDozMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChhZGRyZXNzX2V4Y2VwdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoT1BfMzAwMDAwMDAsIE9QXzY0MDEsIE9QXzYwMDEsIE9QXzYwMDAsIE9QXzMyMDEwMDAwLCBPUF8zMTAwMDAwMCwKLSAJT1BfNjYwMSwgT1BfNjIwMSwgT1BfNjIwMCwgT1BfMzMwMTAwMDAsIE9QXzM0MDAwMDAwLCBPUF82ODAwLAotIAlPUF82QzFGLCBPUF82ODAxLCBPUF82QzAxLCBPUF8zNjAxMDAwMCwgT1BfMzUwMDAwMDAsIE9QXzZBMDAsCi0gCU9QXzZFMUYsIE9QXzZBMDEsIE9QXzZFMDEsIE9QXzM3MDEwMDAwKTogRm9yICJsZCIsICJsZDJ3IiwgInN0IgotIAlhbmQgInN0MnciIGNoZWNrIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWxpZ25lZC4KLQotMTk5OS0xMi0zMCAgQ2hhbmRyYSBDaGF2dmEgICA8Y2NoYXZ2YUBjeWdudXMuY29tPgotCQotCSogZDEwdl9zaW0uaCAoSU5DX0FERFIpOiBBZGRlZCBjb2RlIHRvIGFzc2lnbgotCXByb3BlciBhZGRyZXNzIGZvciBsb2FkcyB3aXRoIHByZWRlYyBvcGVyYXRpb25zLgotCi0xOTk5LTExLTI1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfNEUwRik6IE5ldyBmdW5jdGlvbjogU2ltdWxhdGUgbmV3IGJpdCBwYXR0ZXJuIGZvcgotCWNwZmcgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBPY3QgMjkgMTg6MzQ6MjggMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAobW92ZV90b19jcik6IERvbid0IGFsbG93IHVzZXIgdG8gc2V0IFBTVy5ETSBpbiBlaXRoZXIKLSAJRFBTVyBhbmQgQlBTVy4KLQotVGh1IE9jdCAyOCAwMToyNjoxOCAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjIwKTogVXNlIFNFVF9IV19QU1cgd2hlbiB1cGRhdGluZyBQU1cuCi0JKFBTV19IV19NQVNLKTogRGVjbGFyZS4KLQotCSogZDEwdl9zaW0uaCAobW92ZV90b19jcik6IEFkZCBgYHBzd19od19wJycgcGFyYW1ldGVyLgotCShTRVRfQ1JFRywgU0VUX1BTV19CSVQpOiBVcGRhdGUuCi0JKFNFVF9IV19DUkVHLCBTRVRfSFdfUFNXKTogRGVmaW5lLgotCi1TdW4gT2N0IDI0IDIxOjM4OjA0IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9kMTB2X3RyYW5zbGF0ZV9kbWFwX2FkZHIpOiBGaXggZXh0cmFjdGlvbiBvZiBJT1NQCi0gCWZvciBETUFQMy4KLQotU3VuIE9jdCAyNCAxNjowNDoxNiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fZDEwdl90cmFuc2xhdGVfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkoeGZlcl9tZW0pOiBSZXdyaXRlLiAgVXNlIHNpbV9kMTB2X3RyYW5zbGF0ZV9hZGRyLgotCShtYXBfbWVtb3J5KTogTWFrZSBJTkxJTkUuCi0KLVN1biBPY3QgMjQgMTM6NDU6MTkgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2QxMHZfdHJhbnNsYXRlX2RtYXBfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkoZG1lbV9hZGRyKTogUmV3cml0ZS4gVXNlIHNpbV9kMTB2X3RyYW5zbGF0ZV9kbWFwX2FkZHIuICBDaGFuZ2UKLSAJb2Zmc2V0IHBhcmFtZXRlciB0byB0eXBlIHVpbnQxNi4KLQkqIGQxMHZfc2ltLmggKGRtZW1fYWRkcik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotU3VuIE9jdCAyNCAxMzowNzozMSAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChpbWFwX3JlZ2lzdGVyLCBzZXRfaW1hcF9yZWdpc3RlciwgZG1hcF9yZWdpc3RlciwKLSAJc2V0X2ltYXBfcmVnaXN0ZXIpOiBVc2UgbWFwX21lbW9yeS4KLQkoRE1BUCk6IFVwZGF0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEluaXRpYWxpemUgYWxsIERNQVAgcmVnaXN0ZXJzLiAgTk9URSB0aGF0Ci0gCURNQVAyLCBpbiBpbnRlcm5hbCBtZW1vcnkgbW9kZSwgaXMgc2V0IHRvIDB4MDAwMCBhbmQgTk9UCi0gCTB4MjAwMC4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9sZGVyIGQxMHYgYm9hcmRzLgotCi1TdW4gT2N0IDI0IDExOjIyOjEyIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9kMTB2X3RyYW5zbGF0ZV9pbWFwX2FkZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGltZW1fYWRkcik6IFJld3JpdGUuICBVc2Ugc2ltX2QxMHZfdHJhbnNsYXRlX2ltYXBfYWRkci4KLQkobGFzdF9mcm9tLCBsYXN0X3RvKTogRGVjbGFyZS4KLQotU3VuIE9jdCAyNCAwMToyMTo1NiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKHN0cnVjdCBkMTB2X21lbW9yeSk6IERlZmluZS4gIFN1cHBvcnQgdmVyeSBsb25nCi0gCW1lbW9yaWVzLgotCShzdHJ1Y3QgX3N0YXRlKTogUmVwbGFjZSBpbWVtLCBkbWVtIGFuZCB1bWVtIGJ5IG1lbS4KLQkoSU1BUF9CTE9DS19TSVpFLCBETUFQX0JMT0NLX1NJWkUsIFNFR01FTlRfU0laRSwgSU1FTV9TRUdNRU5UUywKLSAJRE1FTV9TRUdNRU5UUywgVU1FTV9TRUdNRU5UUyk6IERlZmluZS4KLQotCSogaW50ZXJwLmMgKG1hcF9tZW1vcnkpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9zaXplLCB4ZmVyX21lbW9yeSwgaW1lbV9hZGRyLCBkbWVtX2FkZHIpOiBVcGRhdGUuCi0JKFVNRU1fU0VHTUVOVFMpOiBNb3ZlZWQgdG8gImQxMHZfc2ltLmgiLgotCShJTUVNX1NJWkVETUVNX1NJWkUpOiBEZWxldGUuCi0KLVNhdCBPY3QgMjMgMjA6MDY6NTggMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogSW5jbHVkZSAic2ltLWQxMHYuaCIuCi0gCShpbWFwX3JlZ2lzdGVyLCBzZXRfaW1hcF9yZWdpc3RlciwgZG1hcF9yZWdpc3RlciwKLSAJc2V0X2RtYXBfcmVnaXN0ZXIsIHNwaV9yZWdpc3Rlciwgc3B1X3JlZ2lzdGVyLCBzZXRfc3BpX3JlZ2lzdGVyLAotIAlzZXRfc3B1X3JlZ2lzdGVyKTogTmV3IGZ1bmN0aW9ucy4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFVwZGF0ZS4KLQkoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBSZXdyaXRlLiAgVXNlIGVudW1zCi0gCWRlZmluZWQgaW4gc2ltLWQxMHYuaC4KLQotCSogZDEwdl9zaW0uaCAoREVCVUdfTUVNT1JZKTogRGVmaW5lLgotCShJTUFQMCwgSU1BUDEsIERNQVAsIFNFVF9JTUFQMCwgU0VUX0lNQVAxLCBTRVRfRE1BUCk6IERlbGV0ZS4KLQkKLVNhdCBPY3QgMjMgMTg6NDE6MTggMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBbGxvdyBhIGRlYnVnIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgLXQKLSAJb3B0aW9uLgotCShsb29rdXBfaGFzaCk6IERvbid0IGV4aXQgb24gYW4gaWxsZWdhbCBpbnN0cnVjdGlvbi4KLQkoZG9fbG9uZywgZG9fMl9zaG9ydCwgZG9fcGFyYWxsZWwpOiBDaGVjayBmb3IgZmFpbGVkIGluc3RydWN0aW9uCi0gCWxvb2t1cC4KLQotTW9uIE9jdCAxOCAxODowMzoyNCBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfMzIyMCk6IEZpeCB0cmFjZSBvdXRwdXQgZm9yIGlsbGVnYWwgYWNjdW11bGF0b3IKLSAJbWVzc2FnZS4KLQotMTk5OS0wOS0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmM6IERpc2FibGUgc2V0dGluZyBvZiBETSBiaXQgaW4gUFNXLgotCi1XZWQgU2VwICA4IDE5OjM0OjU1IE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChvcF90eXBlcyk6IEFkZGVkIG5ldyBtZW1vcnkgaW5kaXJlY3QgdHlwZSBPUF9NRU1SRUYzLgotCSh0cmFjZV9pbnB1dF9mdW5jKTogQWRkZWQgc3VwcG9ydCBmb3IgT1BfTUVNUkVGMy4KLQkoT1BfMzIwMTAwMDApOiBOZXcgaW5zdHJ1Y3Rpb24gbGQuCi0JKE9QXzMzMDEwMDAwKTogTmV3IGluc3RydWN0aW9uIGxkMncuCi0JKE9QXzUyMDkpOiBOZXcgaW5zdHJ1Y3Rpb24gc2FjLgotCShPUF80MjA5KTogTmV3IGluc3RydWN0aW9uIHNhY2hpLgotCShPUF8zMjIwKTogTmV3IGluc3RydWN0aW9uIHNsYWUuCi0JKE9QXzM2MDEwMDAwKTogTmV3IGluc3RydWN0aW9uIHN0LgotCShPUF8zNzAxMDAwMCk6IE5ldyBpbnN0cnVjdGlvbiBzdDJ3LgotCi0xOTk5LTA5LTA5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChvbGRfc2VnbWVudF9tYXBwaW5nKTogTmV3IGdsb2JhbC4KLQkoeGZlcl9tZW0pOiBDaGFuZ2UgdGhlIGRlZmF1bHQgc2VnbWVudCBtYXBwaW5nIHRvIGJlIHRoZSB3YXkKLQl0aGF0IE1pdHN1YmlzaGkgcHJlZmVycywgYnV0IHVzZSB0aGUgcHJldmlvdXMgbWFwcGluZyBpZgotCW9sZF9zZWdtZW50X21hcHBpbmcgaXMgdHJ1ZS4KLQkoc2ltX29wZW4pOiBBZGQgYW4gb3B0aW9uIC1vbGRzZWcgdG8gZ2V0IHRoZSBvbGQgbWFwcGluZy4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEluaXQgbWFwcGluZyByZWdpc3RlcnMgYmFzZWQgb24gdGhlCi0JdmFsdWUgb2Ygb2xkX3NlZ21lbnRfbWFwcGluZy4KLQotMTk5OS0wOS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzY2MDEpOiBEbyBub3Qgd3JpdGUgYmFjayBkZWNyZW1lbnRlZCBhZGRyZXNzIGlmCi0JZWl0aGVyIG9mIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcnMgd2FzIHRoZSBzYW1lIGFzIHRoZSBhZGRyZXNzCi0JcmVnaXN0ZXIuIAotCShPUF82MjAxKTogRG8gbm90IHdyaXRlIGJhY2sgaW5jcmVtZW50ZWQgYWRkcmVzcyBpZiBlaXRoZXIgb2YgdGhlCi0JZGVzdGluYXRpb24gcmVnaXN0ZXJzIHdhcyB0aGUgc2FtZSBhcyB0aGUgYWRkcmVzcyByZWdpc3Rlci4gCi0KLVRodSBTZXAgIDIgMTg6MTU6NTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTE5OTktMDUtMDggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCQotMTk5OS0wNC0wMiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHVpX2xvb3BfaG9va19jb3VudGVyKTogTmV3IGdsb2JhbCAod2hlbiBORUVEX1VJX0xPT1BfSE9PSwotCWRlZmluZWQpLgotCShzaW1fcmVzdW1lKTogSWYgdGhlIGNvdW50ZXIgaGFzIGV4cGlyZWQsIGNhbGwgdGhlIHVpX2xvb3BfaG9vaywKLQlpZiBkZWZpbmVkLgotCShVSV9MT09QX1BPTExfSU5URVJWQUwpOiBEZWZpbmUuIFVzZWQgdG8gdHdlYWsgdGhlIGZyZXF1ZW5jeSBvZgotCXVpX2xvb3BfaG9vayBjYWxscy4KLQkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0ZMQUdTKTogSW5jbHVkZSBORUVEX1VJX0xPT1BfSE9PSy4KLQotV2VkIE1hciAxMCAxOTozMjoxMyAxOTk5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYzogSWYgbG9hZCBpbnN0cnVjdGlvbiB3aXRoIGF1dG8gaW5jcmVtZW50L2RlY3JlbWVudAotCWFkZHJlc3NpbmcgaXMgdXNlZCB3aGVuIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyB0aGUgc2FtZSBhcwotCXRoZSBhZGRyZXNzIHJlZ2lzdGVyLCB0aGVuIGlnbm9yZSB0aGUgYXV0byBpbmNyZW1lbnQvZGVjcmVtZW50LgotCi1XZWQgTWFyIDEwIDE5OjMyOjEzIDE5OTkgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfNUYwMCk6IElmZGVmIFNZU19zdGF0IGNhc2UgYmVjYXVzZQotCW5vdCBhbGwgc3lzdGVtcyBoYXZlIGl0IGRlZmluZWQuCi0KLTE5OTktMDEtMjYgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKE9QXzU2MDcpOiBDb3JyZWN0IHNhdHVyYXRpb24gY29tcGFyaXNvbi9hc3NpZ25tZW50LgotCShPUF8xMjAxLCBPUF8xMjAzLCBPUF8xNzAwMTIwMCwgT1BfMTcwMDEyMDIsIAotICAgICAgICAgT1BfMkEwMCwgT1BfMjgwMCwgT1BfMkMwMCwgT1BfMzIwMCwgT1BfMzIwMSwgCi0gICAgICAgICBPUF8xMDAxLCBPUF8xMDAzLCBPUF8xNzAwMTAwMCwgT1BfMTcwMDEwMDIpOiBEaXR0by4KLQotMTk5OS0wMS0yNiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoT1BfNTYwNSk6IFNpZ24gZXh0ZW5kIE1JTjMyIGFuZCBNQVgzMiBiZWZvcmUgc2F0dXJhdGlvbgotICAgICAgICBjb21wYXJpc29uLgotCShPUF81NjA3KTogRGl0dG8uCi0JKE9QXzJBMDApOiBEaXR0by4KLQkoT1BfMjgwMCk6IERpdHRvLgotCi0xOTk5LTAxLTEzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jIChPUF8xMjIzKTogU2lnbiBleHRlbmQgTUlOMzIgYW5kIE1BWDMyIGJlZm9yZSBzYXR1cmF0aW9uCi0JY29tcGFyaXNvbi4KLQotVHVlIE5vdiAyNCAxNzowNDo0MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChzeXMvc3lzY2FsbC5oKTogSW5jbHVkZSB0YXJnLXZhbHMuaCBpbnN0ZWFkLgotCShTWVNfKik6IFJlcGxhY2Ugd2l0aCBUQVJHRVRfU1lTXyouCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBvbiB0YXJnLXZhbHMuaC4KLQkoTkxfVEFSR0VUKTogRGVmaW5lIGFzIE5MX1RBUkdFVF9kMTB2LgotCi1XZWQgU2VwIDMwIDAwOjA2OjMyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jICh4ZmVyX21lbSk6IE1pc3NpbmcgYnJlYWssIGluc3RydWN0aW9uIG1lbW9yeSBjYXNlCi0gCWZsb3dlZCBpbnRvIHVuaWZpZWQgbWVtb3J5IGNhc2UuCi0KLVdlZCBTZXAgMzAgMTA6MTQ6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmM6IElmIGxvYWQgaW5zdHJ1Y3Rpb24gd2l0aCBhdXRvIGluY3JlbWVudC9kZWNyZW1lbnQKLQlhZGRyZXNzaW5nIGlzIHVzZWQgd2hlbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMKLQl0aGUgYWRkcmVzcyByZWdpc3RlciwgdGhlbiBpZ25vcmUgdGhlIGF1dG8gaW5jcmVtZW50L2RlY3JlbWVudC4KLQotVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjIzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToyMDowNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotRnJpIEFwciAyNCAxMTowNDo0NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IE9QQ09ERSBhbmQgTUFTSyBhcmUgdW5zaWduZWQuCi0KLQkqIGQxMHZfc2ltLmggKHJlbW90ZS1zaW0uaCwgc2ltLWNvbmZpZy5oKTogSW5jbHVkZS4KLQkKLVNhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgIDEgMTI6NTk6MTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAodHJhY2VfaW5wdXRfZnVuYyk6IFVzZSBtb3ZlX2Zyb21fY3IgLyBDUkVHUyB0byBvYnRhaW4KLSAJdXAtdG8tZGF0ZSBDUiB2YWx1ZS4KLQkoT1BfT1BfMTAwMDAwMCwgYWRkMyk6IFRyYWNlIGlucHV0cyBiZWZvcmUgcGVyZm9ybWluZyBhZGQuCi0JKE9QXzVGMDAsIDwqPik6IFRyYWNlIGlucHV0IHJlZ2lzdGVycyBiZWZvcmUgbWFraW5nIHN5c3RlbSBjYWxsLgotCShPUF81RjAwLCA8a2lsbD4pOiBUcmFjZSBSMCwgUjEgbm90IFJFR24uCi0JKE9QXzVGMDAsIDxnZXRwaWQ+KTogQWx3YXlzIHJldHVybiA0Ny4KLQkKLQkqIGQxMHZfc2ltLmggKFNMT1QsIFNMT1RfTlIsIFNMT1RfUEVORF9NQVNLLCBTTE9UX1BFTkQsCi0gCVNMT1RfRElTQ0FSRCwgU0xPVF9GTFVTSCk6IERlZmluZS4gIEFuIGltcGxlbWVudGF0aW9uIG9mIHdyaXRlCi0gCWJhY2sgc2xvdHMuCi0JKHN0cnVjdCBfc3RhdGUpOiBBZGQgc3RydWN0IHNsb3Qgc2xvdCB0byBnbG9iYWwgc3RhdGUgdmFyaWFibGUuCi0JKHN0cnVjdCBfc3RhdGUpOiBEZWxldGUgZmllbGRzIFNNLCBFQSwgREIsIERNLCBJRSwgUlAsIE1ELCBGWCwgU1QsCi0gCUYwLCBGMSwgQyBmcm9tIGdsb2JhbCBTdGF0ZSB2YXJpYWJsZS4KLQkoc3RydWN0IF9zdGF0ZSk6IEFkZCBzdHJ1Y3QgdHJhY2UgdG8gZ2xvYmFsIFN0YXRlIHZhcmlhYmxlLgotCShHUFIsIFNFVF9HUFIpOiBEZWZpbmUuICBTRVRfR1BSIHVzZXMgU0xPVF9QRU5ELgotCShQU1cqLCBTRVRfUFNXKik6IERlZmluZS4gU0VUX1BTVyogdXNlcyBTRVRfQ1JFRy4KLQkoQ1JFRywgU0VUX0NSRUcsIFNFVF8qKTogRGVmaW5lLiBTRVRfQ1JFRyB1c2VzIGZ1bmMgbW92ZV90b19jci4KLQkoSU5DX0FERFIpOiBSZS1pbXBsZW1lbnQuICBVc2UgU0VUX0dQUiB0byB1cGRhdGUgcmVnaXN0ZXJzLgotCShKTVApOiBSZS1pbXBsZW1lbnQuIFVzZSBTRVRfKiB0byB1cGRhdGUgcmVnaXN0ZXJzLgotCi0JKiBpbnRlcnAuYzogVXNlIG5ldyBTRVRfKiBldC5hbC4gbWFjcm9zIHRvIGZldGNoIC8gc3RvcmUKLSAJcmVnaXN0ZXJzLgotCShnZXRfb3BlcmFuZHMpOiBTcXVpcnJlbCBhd2F5IHRyYWNlIHZhbHVlcyBhdCBzdGFydCBvZiBlYWNoCi0gCW9wZXJhbmQgZGVjb2RlLgotCShkb18yX3Nob3J0KTogRmx1c2ggcGVuZGluZyB3cml0ZXMgYmVmb3JlIGlzc3Vpbmcgc2Vjb25kCi0gCWluc3RydWN0aW9uLgotCShzaW1fcmVzdW1lKTogRmx1c2ggcGVuZGluZyB3cml0ZXMgYXQgZW5kIG9mIGluc3RydWN0aW9uIGN5Y2xlLgotCShzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2NyZWF0ZV9pbmZlcmlvcik6Ci0gCUFmdGVyIHNjaGVkdWxpbmcgdXBkYXRlcyB0byByZWdpc3RlcnMgdXNpbmcgU0VUXyosIGZsdXNoIHVwZGF0ZXMuCi0JKHNpbV9yZXN1bWUpOiBSZS1vcmRlciBoYW5kbGluZyBvZiBSUFQvcmVwZWF0IGFuZCBJQkEvaGJyZWFrIHNvCi0gCXRoYXQgZWFjaCBzZXRzIHBjIHVzaW5nIFNFVF8qIGFuZCBsYXN0IFNFVF8qIGV2ZW50dWFsbHkgd2luZHMgb3V0LgotCQotCSogc2ltb3BzLmM6IFVzZSBuZXcgU0VUXyogZXQuYWwuIG1hY3JvcyB0byBmZXRjaCAvIHN0b3JlCi0gCXJlZ2lzdGVycy4KLQkobW92ZV90b19jcik6IEFkZCBNQVNLIGFyZ3VtZW50IGZvciBzZWxlY3RpdmUgdXBkYXRlIG9mIENSRUcgYml0cy4KLSAgCVJlLWltcGxlbWVudCB1c2luZyBuZXcgU0VUXyogbWFjcm9zLgotCSh0cmFjZV9vdXRwdXRfZnVuYywgdHJhY2Vfb3V0cHV0KTogRGVsZXRlLiBSZXBsYWNlIHdpdGguCi0JKGRvX3RyYWNlX291dHB1dF9mbHVzaCwgdHJhY2Vfb3V0cHV0X2ZpbmlzaCwgdHJhY2Vfb3V0cHV0XzQwLAotIAl0cmFjZV9vdXRwdXRfMzIsIHRyYWNlX291dHB1dF8xNiwgdHJhY2Vfb3V0cHV0X3ZvaWQsCi0gCXRyYWNlX291dHB1dF9mbGFnKTogTmV3IGZ1bmN0aW9ucy4gIEhhbmRsZSBzcGVjaWZpYyB0cmFjZSBjYXNlcy4KLQkoT1BfKik6IFJlLXdyaXRlIHRyYWNpbmcgdG8gdXNlIG5ldyB0cmFjZV9vdXRwdXRfKiBmdW5jdGlvbnMuCi0JKE9QXyopOiBSZS13cml0ZSB0byB1c2UgbmV3IFNFVF8qIGV0LmFsLiBtYWNyb3MuCi0JKEZVTkMsIFBBUk1bMS00XSwgUkVUVkFMLCBSRVRWQUwzMik6IFJlZG8gZGVmaW5pdGlvbi4KLQkoUkVUVkFMX0hJR0gsIFJFVFZBTF9MT1cpOiBEZWxldGUsIHVzZSBSRVRWQUwzMi4KLQkKLVdlZCBBcHIgIDEgMTI6NTU6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fV0FSTklOR1MpOiBBZGQuCi0JY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEZlYiAxNyAxMjozODo0MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotTW9uIE9jdCAyNyAxNDo0MzozMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogKGRtZW1fYWRkcik6IElmIGFkZHJlc3MgaXMgaWxsZWdhbCBvciBpbiBJL08gc3BhY2UsIHNpZ25hbCBhIGJ1cwotIAllcnJvci4gIEFsbG9jYXRlIHVuaWZpZWQgbWVtb3J5IG9uIGRlbWFuZC4gIEZpeCBETUVNIGFkZHJlc3MKLSAJY2FsY3VsYXRpb25zLgotCQotTW9uIEZlYiAxNiAxMDoyNzo1MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjIwKTogSW1wbGVtZW50ICJkYnQiLgotCShPUF81RjYwKTogSW1wbGVtZW50ICJydGQiLgotCi0JKiBkMTB2X3NpbS5oIChEUENfQ1IpOiBEZWZpbmUgZW51bS4KLQkoREJUX1ZFQ1RPUl9TVEFSVCk6IERlZmluZQotCShEUFNXLCBEUEMpOiBEZWZpbmUuCi0KLUZyaSBGZWIgMTMgMTU6MTU6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAobW92ZV90b19jcik6IFN5bmMgcmVnc1tTUF9JRFhdIHdpdGggU3RhdGUuc3AgYWNjb3JkaW5nCi0gCXRvIFBTVzpTTS4KLQotCSogZDEwdl9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IEFkZCBzcCwgYXMgaG9sZGluZyBhcmVhIGZvciBTUEkvU1BVLgotCShTUF9JRFgpOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTEgMTY6NTM6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfNUYwMCk6IENhbGwgZXJyb3IgaW5zdGVhZCBvZiBhYm9ydCBmb3IgdW5rbm93bgotIAlzeXNjYWxscy4KLQotCSogZDEwdl9zaW0uaCAoZW51bSk6IERlZmluZSBEUFNXX0NSLgotCi0JKiBzaW1vcHMuYyAobW92ZV90b19jcik6IE1hc2sgb3V0IGhhcmR3aXJlZCB6ZXJvIGJpdHMgaW4gRFBTVy4KLQotVHVlIEZlYiAxMCAxODoyODozOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fd3JpdGVfcGh5cyk6IERlbGV0ZS4KLQkoc2ltX2xvYWQpOiBDYWxsIHNpbV9sb2FkX2ZpbGUgd2l0aCBzaW1fd3JpdGUgYW5kIExNQS4KLQotTW9uIEZlYiAgOSAxMjowNTowMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jOiBSZXdyaXRlIHhmZXJfbWVtIHNvIHRoYXQgaXQgdHJhbnNsYXRlcyBhZGRyZXNzZXMgYXMgLQotIAkweDAwLi4uIC0gRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSwgMHgwMS4uLiBJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5LAotIAkweDEwLi4uIC0gb24tY2hpcCBkYXRhLCAweDExLi4uIC0gb24tY2hpcCBpbnNuLCAweDEyLi4uIC0gdW5pZmllZAotIAltZW1vcnkuCi0JKHBjX2FkZHIpOiBEZWxldGUuCi0JKGltZW1fYWRkcik6IE5ldyBmdW5jdGlvbiAtIHRyYW5zbGF0ZSBJTUVNIGFkZHJlc3MuCi0JKHNpbV9yZXN1bWUpOiBVc2UgaW1lbV9hZGRyIHRvIHRyYW5zbGF0ZSBpbnNuIGFkZHJlc3MsIGFib3J0IGlmCi0gCXRyYW5zbGF0aW9uIGZhaWxlZC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFdyaXRlIEFSR1YgdG8gbWVtb3J5IHVzaW5nIHNpbV93cml0ZS4gIFBhc3MKLSAJYXJnYy9hcmd2IHVzaW5nIHIwL3IxIG5vdCByMi9yMy4KLQkoc2ltX3NpemUpOiBEbyBub3QgaW5pdGlhbGl6ZSBJTUFQL0RNQVAgaGVyZS4KLQkoc2ltX29wZW4pOiBDYWxsIHNpbV9jcmVhdGVfaW5mZXJpb3IgYW5kIHNpbV9zaXplIHRvIGluaXRpYWxpemUKLSAJdGhlIHN5c3RlbS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEluaXRpYWxpemUgSU1BUC9ETUFQIHRvIGhhcmR3YXJlIHJlc2V0Ci0gCWRlZmF1bHRzLgotCShpbml0X3N5c3RlbSk6IERlbGV0ZS4KLQkoeGZlcl9tZW0sIHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogRG8gbm90IGNhbGwKLSAJaW5pdF9zeXN0ZW0uCi0JKGRlY29kZV9wYyk6IENoZWNrIHByb2dfYmZkIGlzIGRlZmluZWQgYmVmb3JlIGxvb2tpbmcgdXAgLnRleHQKLSAJc2VjdGlvbi4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU3VuIEphbiAyNSAyMjoyMzowMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9wX3JlYXNvbik6IEV4aXQgc3RhdHVzIGlzIG5vdyBpbiByMCwgbm90IHIyLgotCi1TYXQgSmFuIDI0IDE5OjAwOjMwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMTB2X3NpbS5oIChERUJVR19UUkFQKTogTmV3IGRlYnVnIGZsYWcuCi0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogSWYgREVCVUdfVFJBUCBpcyBvbiwgdHVybiB0cmFwcyAwLTE0IGludG8KLQlwcmludGluZyB0aGUgcmVnaXN0ZXJzLgotCi1UaHUgSmFuIDIyIDE3OjU0OjAxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAob3BfdHlwZXMpOiBOZXcgQUJJLCBhcmdzIGFyZSByMC4ucjMsIHN5c3RlbSBjYWxsICMgaXMKLQlpbiByNC4KLQkodHJhY2Vfe2luLG91dH1wdXRfZnVuYyk6IERpdHRvLgotCShPUF80OTAwKTogRGl0dG8uCi0JKE9QXzI0ODAwMDAwKTogRGl0dG8uCi0JKE9QXzREMDApOiBEaXR0by4KLQkoT1BfNUYwMCk6IERpdHRvLgotCi1UaHUgSmFuIDIyIDE0OjMwOjM2IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoVU1FTV9TRUdNRU5UUyk6IE5ldyBkZWZpbmUsIHNldCB0byAxMjguCi0JKHNpbV9zaXplKTogVXNlIFVNRU1fU0VHTUVOVFMgcmF0aGVyIHRoYW4gaGFyZHdpcmVkIGNvbnN0YW50LgotCShzaW1fY2xvc2UpOiBSZXNldCBwcm9nX2JmZCB0byBOVUxMIGFmdGVyIGNsb3NpbmcgaXQuICBBbHNvCi0JcmVzZXQgcHJvZ19iZmRfd2FzX29wZW5lZF9wIGFmdGVyIGNsb3NpbmcgcHJvZ19iZmQuCi0JKHNpbV9sb2FkKTogUmVzZXQgcHJvZ19iZmRfd2FzX29wZW5lZF9wIGFmdGVyIGNsb3NpbmcgcHJvZ19iZmQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBHZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGFiZmQgbm90IHByb2dfYmZkLgotCSh4ZmVyX21lbSk6IERvIGJvdW5kcyBjaGVja2luZyBvbiBhZGRyZXNzZXMgYW5kIHJldHVybiB6ZXJvIGxlbmd0aAotCXJlYWQvd3JpdGUgb24gYmFkIGFkZHJlc3NlcywgcmF0aGVyIHRoYW4gYWJvcnRpbmcuICBQcmVwYXJlIHRvCi0JYmUgYWJsZSB0byBoYW5kbGUgeGZlcnMgdGhhdCBjcm9zcyBzZWdtZW50IGJvdW5kYXJpZXMsIGJ1dCBub3QKLQl5ZXQgaW1wbGVtZW50ZWQuICBPbmx5IGVtaXQgZGVidWcgbWVzc2FnZSB3aGVuIGQxMHZfZGVidWcgaXMKLQlzZXQgYXMgd2VsbCBhcyBERUJVRyBiZWluZyBkZWZpbmVkLgotCi1Nb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVHVlIERlYyAgOSAxMDoyODozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKFJQVF9TKTogSW5kZXggY3JlZ3Mgd2l0aCBSUFRfU19DUiBub3QgUlBUX0VfQ1IuCi0JKEJQU1cpOiBEaXR0byBmb3IgQlBTV19DUiBhbmQgbm90IFBTV19DUi4KLQotCSogc2ltb3BzLmMgKE9QXzVGNDApOiBKTVAgdG8gQlBDIGluc3RlYWQgb2YgYXNzaWduaW5nIFBDIGRpcmVjdGx5LgotCQotTW9uIERlYyAgOCAxMjo1ODozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogRnJvbSBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPi4gQ2hhbmdlCi0gCXJlc2VydmVkIHRyYXAgZnJvbSAwIHRvIDE1LiBBZGQgdHJhcCBlbXVsYXRpb24gY29kZSBmb3IgMC0xNC4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGcm9tIE1hcnRpbiBIdW50IDxodW50QGN5Z251cy5jb20+LiBDaGVjawotIAlJQkEgZm9yIFNEQlQuCi0KLQkqIGQxMHZfc2ltLmggKEFFX1ZFQ1RPUl9TVEFSVCwgUklFX1ZFQ1RPUl9TVEFSVCwKLSAJU0RCVF9WRUNUT1JfU1RBUlQsIFRSQVBfVkVDVE9SX1NUQVJUKTogRGVmaW5lLgotCQotCSogc2ltb3BzLmMgKE9QXzVGMDApOiBGb3IgInRyYXAiLCBtYXNrIG91dCBhbGwgYnV0IFNNIGJpdCBpbiBQU1csCi0gCXVzZSBtb3ZlX3RvX2NyLgotCShPUF81RjAwKTogRm9yICJ0cmFwIiwgdXBkYXRlIEJQU1cgd2l0aCBtb3ZlX3RvX2NyLgotCi1GcmkgRGVjICA1IDE1OjMxOjE3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDEwdl9zaW0uaCAoZW51bSk6IEVudW1lcmF0ZSBDUiByZWdpc3RlciBuYW1lcy4KLQkoZW51bSk6IEVudW1lcmF0ZSBQU1cgYml0IHZhbHVlcy4KLQkoUFNXKTogT2J0YWluIHZhbHVlIHVpbmcgbW92ZV9mcm9tX2NyLgotCShNT0RfUywgTU9EX0UsIEJQU1cpOiBNYWtlIHItdmFsdWVzLgotCShtb3ZlX2Zyb21fY3IsIG1vdmVfdG9fY3IpOiBEZWNsYXJlIGZ1bmN0aW9ucy4KLQkKLQkqIGludGVycC5jIChzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9zdG9yZV9yZWdpc3Rlcik6IFVzZQotIAltb3ZlX2Zyb21fY3IgYW5kIG1vdmVfdG9fY3IgZm9yIENSIHJlZ2lzdGVyIHRyYW5zZmVycy4KLQotCSogc2ltb3BzLmMgKG1vdmVfZnJvbV9jciwgbW92ZV90b19jcik6IE5ldyBmdW5jdGlvbnMuCi0JKE9QXzVGNDApOiBNb3ZlIEJQU1cgdG8gUFNXIHVzaW5nIG1vdmVfdG9fY3IgYW5kIG1vdmVfZnJvbV9jci4KLQkoT1BfNTYwMCk6IEZvciAibXZ0YyIsIHVzZSBmdW5jdGlvbiBtb3ZlX3RvX2NyLgotCShPUF81MjAwKTogRm9yICJtdmZjIiwgdXNlIGZ1bmN0aW9uIG1vdmVfZnJvbV9jci4KLQotRnJpIERlYyAgNSAxMzozMzoxNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81NjAwKTogRm9yICJtdnRjIiBNT0RfRSBhbmQgTU9EX1MsIGVuc3VyZSB0aGF0IHRoZQotIAlMU2JpdCBpcyB6ZXJvLgotCi1UaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IERlYyAgNCAxNjo1MTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgRE0gLSBQU1cgZGVidWcgbWFzay4KLQotCSogc2ltb3BzLmMgKE9QXzU2MDApOiBGb3IgIm12dGMiLCBzYXZlIFBTVy5ETS4KLQkoT1BfNTIwMCk6IERpdHRvIGZvciAibXZmYyIuCi0KLVdlZCBEZWMgIDMgMTc6Mjc6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMTB2X3NpbS5oIChTRVhUNTYpOiBEZWZpbmUuCi0KLQkqIHNpbW9wcy5jIChPUF80MjAxKTogRm9yICJyYWMiLCBzaWduIGV4dGVuZCA1NiBiaXQgdmFsdWUgYmVmb3JlCi0gCWl0IGlzIHNoaWZ0ZWQuCi0KLQkqIGQxMHZfc2ltLmggKE1BWDMyLCBNSU4zMiwgTUFTSzMyLCBNQVNLNDApOiBSZS1kZWZpbmUgdXNpbmcKLSAJU0lHTkVENjQgbWFjcm8uCi0KLVR1ZSBEZWMgIDIgMTU6Mzg6MzQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogQ2FsbCBkb18yX3Nob3J0IHdpdGggTEVGVF9GSVJTVCBvcgotCVJJR0hUX0ZJUlNULCBhcyBhcHByb3ByaWF0ZSwgaW5zdGVhZCBvZiBoYXJkY29kZWQgaW50cyB0aGF0Ci0JZG9uJ3QgbWF0Y2ggZW51bSB2YWx1ZXMuCi0KLVR1ZSBEZWMgIDIgMTU6MDE6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfM0EwMCk6IEZvciAibWFjdSIsIHBlcmZvcm0gbXVsdGlwbHkgc3RhZ2UgdXNpbmcgMzIKLSAJYml0IHJhdGhlciB0aGFuIDE2IGJpdCBwcmVjaXNpb24uCi0JKE9QXzNDMDApOiBGb3IgIm11bHh1Iiwgc3RvcmUgdW5zaWduZWQgcHJvZHVjdCBpbiBBQ0MuCi0JKE9QXzM4MDApOiBGb3IgIm1zYnUiLCBzdWJ0cmFjdCB1bnNpZ25lZCBwcm9kdWN0IGZyb20gQUNDLAotCShPUF8wKTogRm9yICJzdWIiLCBjb21wdXRlIGNhcnJ5IGJ5IGNvbXBhcmluZyBpbnB1dHMuCi0KLVR1ZSBEZWMgIDIgMTE6MDQ6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfMTAwMCk6IEZvciAic3ViMnciLCBjb21wdXRlIGNhcnJ5IGJ5IGNvbXBhcmluZwotIAlpbnB1dHMuCi0KLU1vbiBOb3YgMTcgMjA6NTc6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfMSk6IFVzZSAzMiBiaXQgdW5zaWduZWQgYXJpdGhtZXRpYyBmb3Igc3VidHJhY3QsCi0gCWNhcnJ5IGluZGljYXRlZCBieSB2YWx1ZSA+IDB4ZmZmZi4KLQotRnJpIE5vdiAxNCAxMjo1MToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogRG9uJ3Qgc2V0IHVwIFNJR0lOVCBoYW5kbGVyIHVzaW5nIHNpZ25hbCwKLSAJaGFuZGxlZCBieSBjbGllbnQuCi0JKHNpbV9yZXN1bWUpOiBGaXggcmFjZSBjb25kaXRpb24gb2YgYSBkaXJlY3QgYXNzaWdubWVudCB0bwotIAlzdG9wX3NpbXVsYXRvciwgY29uZGl0aW9uYWxseSBjYWxsIHNpbV9zdG9wLgotCShzaW1fc3RvcF9yZWFzb24pOiBDaGVjayBzdG9wX3NpbXVsYXRvciByZXR1cm5pbmcgU0lHSU5ULiAgQ2xlYXIKLSAJc3RvcF9zaW11bGF0b3IgcmVhZHkgZm9yIG5leHQgc2ltX3Jlc3VtZSBjYWxsLgotCShzaW1fY3RybF9jKTogRGVsZXRlIGZ1bmN0aW9uLgotCi1UaHUgTm92IDEzIDE5OjI5OjM0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGb3IgIlJFUCIsIG9ubHkgY2hlY2svdXBkYXRlIHRoZSBQQyB3aGVuCi0gCWEgYnJhbmNoIGluc3RydWN0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZC4KLQotTW9uIE5vdiAxMCAxNzo1MDoxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF80MjAxKTogInJhY2hpIi4gU2lnbiBleHRlbmQgYml0IDQwIG9mIEFDQy4gIFNpZ24KLSAJZXh0ZW5kIGJpdCA0NCBhbGwgY29uc3RhbnRzLgotCShPUF80MjAxKTogUmVwbGFjZSBHQ0Mgc3BlY2lmaWMgMHguLkxMIHdpdGggU0lHTkVENjQgbWFjcm8uCi0JCi1GcmkgT2N0IDI0IDEwOjI2OjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDEwdl9zaW0uaDogSW5jbHVkZSBzaW0tdHlwZXMuaC4KLQkodWludDgsIGluODE2LCB1aW55MTYsIGludDMyLCB1aW50MzIsIGludDY0LCB1aW50NjQpOiBUeXBlZGVmCi0gCXVzaW5nIHVuc2lnbmVkOCBldC5hbC4gZnJvbSBzaW0tdHlwZXMuaC4KLQkoU0VYVDMyLCBTRVhUNDAsIFNFWFQ0NCwgU0VYVDYwKTogUmVwbGFjZSBHQ0Mgc3BlY2lmaWMgMHguLkxMIHdpdGgKLSAJU0lHTkVENjQgbWFjcm8uCi0KLVdlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX3dyaXRlX3BoeXMpOiBOZXcgZnVuY3Rpb24sIHdyaXRlIHRvIHBoeXNpY2FsCi0gCWluc3RlYWQgb2YgdmlydHVhbCBtZW1vcnkuCi0JCi0JKiBpbnRlcnAuYyAoc2ltX2xvYWQpOiBQYXNzIGxtYV9wIGFuZCBzaW1fd3JpdGVfcGh5cyB0bwotIAlzaW1fbG9hZF9maWxlLgotCi1Nb24gT2N0IDEzIDEwOjU1OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF82QTAxKTogQ2hhbmdlIE9QX1BPU1RERUMgdG8gT1BfUE9TVElOQyBhbmQgbW92ZQotCWV4Y2VwdGlvbiBnZW5lcmF0aW9uIGNvZGUgdG8gT1BfNkUwMS4KLQkoT1BfNkUwMSk6IENoYW5nZSBPUF9QT1NUSU5DIHRvIE9QX1BPU1RERUMgYW5kIGluc2VydCBleGNlcHRpb24KLQlnZW5lcmF0aW9uIGNvZGUuCi0KLVNhdCBPY3QgMTEgMDk6MDI6MDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF82NDAxKTogcG9zdGRlY3JlbWVudCBvbiByMTUgaXMgT0ssIHJlbW92ZSBleGNlcHRpb24uCi0JKE9QXzY2MDEpOiBEaXR0by4KLQotRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IFNlcCAyNyAxMjo1MTozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHBjX2FkZHIpOiBEaXNjYXJkIHVwcGVyIGJpdChzKSBvZiBQQyBpbiBjYXNlCi0JSU1BUDEgc2VsZWN0cyB1bmlmaWVkIG1lbW9yeS4KLQkqIGQxMHZfc2ltLmggKElOQ19BRERSKTogQWxpZ24gTU9EX0UgdG8gaW5jcmVtZW50IGJlZm9yZSB0ZXN0aW5nCi0JZm9yIGVuZCBjb25kaXRpb24uCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMTAgMjI6MzA6MjQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogSW5jcmVtZW50IFBDIGF0IGVuZCBvZiByZXAKLQlsb29wLgotCi0JKiBzaW1vcHMuYyAoT1BfNDIwMSk6IEZpeCByYWNoaSBpbnN0cnVjdGlvbi4KLQotVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVR1ZSBBdWcgMjYgMTA6Mzc6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQkoc3RhcnRfYWRkcmVzcyk6IERlbGV0ZSB2YXJpYWJsZS4KLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTU6Mzk6MjkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotVHVlIE1heSAyMCAxMDoxNDo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBSZW1vdmUgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVRodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgQXByIDIyIDEwOjI5OjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IFVuZG8gcGF0Y2ggdG8gYWRkIC1FIHN1cHBvcnQuCi0KLUZyaSBBcHIgMTggMTM6Mzk6MDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX3N0b3ApOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBBcHIgMTcgMDI6NDI6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1sb2FkLm8uCi0JKiBkMTB2X3NpbS5oIChleGVjX2JmZCk6IFJlbmFtZSB0byBwcm9nX2JmZC4KLQkqIGludGVycC5jOiAjaW5jbHVkZSBiZmQuaC4KLQkobXluYW1lLCBzaW1fa2luZCwgc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShwcm9nX2JmZF93YXNfb3BlbmVkX3AsIHByb2dfYmZkKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKGRlY29kZV9wYyk6IFVwZGF0ZSB0byB1c2UgcHJvZ19iZmQuCi0JKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuICBJZ25vcmUgLUUgYXJnLgotCShzaW1fY2xvc2UpOiBDbG9zZSBwcm9nX2JmZCBpZiBzaW11bGF0b3Igb3BlbmVkIGl0LgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCi0JQ2FsbCBzaW1fbG9hZF9maWxlIHRvIGxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4KLQkqIHNpbW9wcy5jICh0cmFjZV9pbnB1dF9mdW5jKTogZXhlY19iZmQgcmVuYW1lZCB0byBwcm9nX2JmZC4KLQotV2VkIEFwciAxNiAxNjoxMjowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogT25seSBwcm92aWRlIHN5c3RlbSBjYWxscyBTWVNfZXhlY3YsCi0gCVNZU193YWl0LCBTWVNfd2FpdCwgU1lTX3V0aW1lLCBTWVNfdGltZSBpZiBkZWZpbmVkIGJ5IHRoZSBob3N0LgotCQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi1GcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotCSogc2ltb3BzLmMgKE9QXzVGMDApOiBSZW1vdmUgb2xkIHRyYXBzIDEtMy4gIE1ha2UgdHJhcCAxNSB0aGUgc2FtZQotCWFzIHRyYXAgMCwgd2hpY2ggd2lsbCBiZSBkZXByZWNhdGVkLiAgT25seSBzZXQgZXJybm8sIGlmIGFuIGVycm9yCi0JaW4gZmFjdCB3YXMgcmV0dXJuZWQuCi0KLVRodSBNYXIgMTMgMTI6NDE6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IERlbGV0ZSByZWR1bmRhbnQgcHJvdG90eXBlcyBvZiBzaW1fZm9vIGZucy4KLQkoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93IGluIGFyZ3YgZm9ybS4KLQkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVRodSBNYXIgMTMgMTA6Mjk6MDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jICh0cmFjZV97aW5wdXQsb3V0cHV0fV9mdW5jKTogQ2FsbCBmbHVzaF9zdGRvdXQgZnJvbSB0aGUKLQljYWxsYmFjayBmdW5jdGlvbnMuCi0JKE9QXzVGMDApOiBEaXR0by4KLQkoT1BfNns0LDYsQyxBfTAxKTogVGVzdCBmb3IgcG9zdCBkZWNyZW1lbnQgb24gdGhlIHN0YWNrIHBvaW50ZXIuCi0JKE9QX3sxMjAwLDEwMDAwMDAsMjAxLDVGRTAsMTAwMywxNzAwMTAwMn0pOiBGaXggcHJvYmxlbXMgaW4KLQlzZXR0aW5nIHRoZSBjYXJyeSBiaXQgYWZ0ZXIgYW4gYWRkIG9yIGEgc3VidHJhY3QuCi0KLVdlZCBGZWIgMTIgMTY6MDQ6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF97MTQwMywxNTAwMkEwMiwzezAsNH0wezAsMX19KTogT25seSB1c2UgdGhlIGJvdHRvbQotCTQwIGJpdHMgb2YgYWNjdW11bGF0b3JzLiAgU2lnbi96ZXJvIGV4dGVuZCBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCi0JQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQotCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgotCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgotCW1ha2VmaWxlIGZyYWdtZW50LgotCi1GcmkgRGVjIDI3IDIyOjU0OjA1IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmM6IHBhdGNoIHRvIG5vdCAjaW5jbHVkZSAiZDEwdl9zaW0uaCIgd2hpY2gKLQl1bmVjZXNzYXJpbHkgaW5jbHVkZXMgYmZkLmggYW5kIGNhdXNlcyB3aW5nZGIgY29uZmlndXJlCi0JdG8gZmFpbC4KLQotTW9uIERlYyAxNiAxMzozOTowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHhmZXJfbWVtKTogQ2hhbmdlIHVuaWZpZWQgbWVtb3J5IHRvIDB4MC4KLQotVGh1IE5vdiAyOCAyMDo0Mjo1NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF8zRTAxKTogRml4IHRyYWNpbmcgaW5mb3JtYXRpb24uCi0JKE9QXzMwMHswLDF9KTogRG8gbm90IHByb3BpZ2F0ZSBzaWduLgotCi1Nb24gTm92IDI1IDE5OjQ3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbiAoV09SRFNfQklHRU5ESUFOKTogQWRkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGQxMHZfc2ltLmg6ICNpbmNsdWRlICJjb25maWcuaCIKLQotU2F0IE5vdiAyMyAwOTozNDo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEVsaW1pbmF0ZSB3YXJuaW5ncyB3aGVuIGdlbmVyYXRlZAotCXRhYmxlLmMgaXMgY29tcGlsZWQuCi0KLVdlZCBOb3YgMjAgMTk6NDE6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDYXN0IHJlc3VsdCBvZiBjYWxsb2MsIGFuZCBtYWtlIHN1cmUgTlVMTAotCXdhcyBub3QgcmV0dXJuZWQuCi0JKGRtZW1fYWRkcik6IElmIGFkZHJlc3MgaXMgaWxsZWdhbCBvciBpbiBJL08gc3BhY2UsIHNpZ25hbCBhIGJ1cwotCWVycm9yLgotCShwY19hZGRyKTogU2lnbmFsIGJ1cyBlcnJvciwgbm90IGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZm9yIGJvZ3VzCi0JcGMuCi0KLVdlZCBOb3YgMjAgMDE6MjM6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBhbGwgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fT0JKUyxTSU1fRVhUUkFfQ0ZMQUdTLFNJTV9FWFRSQV9DTEVBTik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnLmluOiBOZXcgZmlsZS4KLQkqIGludGVycC5jOiAjaW5jbHVkZSAiY2FsbGJhY2suaCIuCi0JKiBzaW1vcHMuYzogI2luY2x1ZGUgImNvbmZpZy5oIi4gICNpbmNsdWRlIDx1bmlzdGQuaD4gaWYgcHJlc2VudC4KLQotRnJpIE5vdiAgOCAxNjoxOTo1NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1zaW0uaCAoc2ltb3BzKTogQWRkIGZsYWcgaXNfbG9uZy4KLQkoU3RhdGUpOiBBZGQgcGNfY2hhbmdlZC4gIEluc3RydWN0aW9ucyB3aGljaCB1cGRhdGUgdGhlIFBDIHNob3VsZAotCXVzZSB0aGUgSk1QIG1hY3JvIHdoaWNoIHNldHMgdGhpcy4KLQkoSk1QKTogTmV3IG1hY3JvLiAgU2V0cyB0aGUgUEMgYW5kIHRoZSBwY19jaGFuZ2VkIGZsYWcuCi0KLQkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEFkZCBpc19sb25nIGZpZWxkLgotCQotCSogaW50ZXJwLmMgKGxvb2t1cF9oYXNoKTogSWYgd2UgYmxpbmRseSBhcHBseSBhIHNob3J0IG9wY29kZSdzIG1hc2sKLQl0byBhIGxvbmcgb3Bjb2RlIHdlIGNvdWxkIGdldCBhIGZhbHNlIG1hdGNoLiAgQ2hlY2sgdGhlIG9wY29kZSBzaXplLgotCShoYXNoKTogQWRkIGEgc2l6ZSBmaWVsZCB0byB0aGUgaGFzaCB0YWJsZS4KLQkoc2ltX29wZW4pOiBJbml0aWFsaXplIHNpemUgZmllbGQgaW4gaGFzaCB0YWJsZS4KLQkoc2ltX3Jlc3VtZSk6IENoYW5nZSB0byBsb2dpYyBmb3Igc2V0dGluZyB0aGUgUEMuICBVc2VkIHRvIGluY3JlbWVudCB0aGUKLQlQQyBpZiBpdCBoYWQgbm90IGJlZW4gY2hhbmdlZC4gIFRoaXMgZGlkbid0IGFsbG93IHNpbmdsZS1pbnN0cnVjdGlvbiBsb29wcy4KLQlOb3cgY2hlY2tzIHRoZSBmbGFnIFN0YXRlLnBjX2NoYW5nZWQuICBBbHNvIG5vdyBzdG9wcyB3aGVuIF5DIGlzIHJlY2VpdmVkLgotCShkbWVtX2FkZHIpOiBGaXggdHJhbnNsYXRpb24gb2YgZGF0YSBzZWdtZW50cyB0byB1bmlmaWVkIG1lbW9yeS4KLQkoc2ltX2N0cmxfYyk6IE5ldyBmdW5jdGlvbi4gIFdoZW4gXkMgaXMgcmVjZWl2ZWQsIHNldCBzdG9wX3NpbXVsYXRvciBmbGFnLgotCi0JKiBzaW1vcHMuYzogQ2hhbmdlZCBhbGwgYnJhbmNoIGFuZCBqdW1wIGluc3RydWN0aW9ucyB0byB1c2UgbmV3IEpNUCBtYWNyby4KLQkoT1BfMjAwMDAwMDApOiBDb3JyZWN0ZWQgdHJhY2UgaW5mb3JtYXRpb24gdG8gc2hvdyB0aGlzIGlzIGEgbGRpLmwsIG5vdAotCWEgbGRpLnMgaW5zdHJ1Y3Rpb24uCi0JCi1UaHUgT2N0IDMxIDE5OjEzOjU1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBGaXggYnVnIHdoZXJlCi0JdXBkYXRpbmcgdGhlIGFjY3VtdWxhdG9ycyB3YXMgb3ZlcndyaXRpbmcgb3RoZXIgcGFydHMgb2YgdGhlIGdsb2JhbAotCVN0YXRlIHZhcmlhYmxlLgotCi1XZWQgT2N0IDMwIDE3OjM1OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGJmZC5oKSBEb24ndCBpbmNsdWRlIGl0IGhlcmUgYW55IG1vcmUuCi0JKHRleHR7LF9zdGFydCxfZW5kfSk6IE1vdmUgaGVyZSBmcm9tIHNpbW9wcy5jIGFuZCBtYWtlIGV4dGVybi4KLQkoZGVjb2RlX3BjKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgUEMgYXMgYW4gYWRkcmVzcyB0aGF0IHRoZQotCWRlYnVnZ2VyIGNhbiB1c2UuCi0JKGRtZW1fYWRkcik6IFByaW50IGRlY29kZWQgUEMgaW4gZXJyb3IgbWVzc2FnZS4KLQkocGNfYWRkcik6IERpdHRvLgotCi0JKiBzaW1vcHMuYyAoYmZkLmgpIERvbid0IGluY2x1ZGUgaXQgaGVyZSBhbnkgbW9yZS4KLQkodGV4dHssX3N0YXJ0LF9lbmR9KTogTW92ZSB0byBzaW1vcHMuYy4KLQkodHJhY2VfaW5wdXRfZnVuYyk6IE1vdmUgZGVjb2Rpbmcgb2YgUEMsIGFuZCBsb29raW5nIHVwIC50ZXh0Ci0Jc3RhcnQgdG8gZGVjb2RlX3BjLgotCi0JKiBkMTB2X3NpbS5oIChiZmQuaCk6IEluY2x1ZGUgaXQgaGVyZS4KLQkodGV4dHssX3N0YXJ0LF9lbmR9KTogQWRkIGV4dGVybmFsIGRlY2xhcmF0aW9ucy4KLQkoZXhlY19iZmQpOiBEaXR0by4KLQkoZGVjb2RlX3BjKTogRGl0dG8uCi0KLVR1ZSBPY3QgMjkgMTI6MTM6NTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc2l6ZSk6IE5vdyBhbGxvY2F0ZXMgdW5pZmllZCBtZW1vcnkgZm9yIGltYXAgc2VnbWVudHMKLQkwLDEsMiwgYW5kIDEyNy4gSW5pdGlhbGl6ZXMgaW1hcDAgYW5kIGltYXAxIHRvIDB4MTAwMC4gIEluaXRpYWxpemVzIGRtYXAgdG8gMC4KLQkoc2ltX3dyaXRlKTogSnVzdCBjYWxsIHhmZXJfbWVtKCkuCi0JKHNpbV9yZWFkKTogSnVzdCBjYWxsIHhmZXJfbWVtKCkuCi0JKHhmZXJfbWVtKTogTmV3IGZ1bmN0aW9uLiBEb2VzIGFwcHJvcHJpYXRlIG1lbW9yeSBtYXBwaW5nIGFuZCBjb3BpZXMgYnl0ZXMuCi0JKGRtZW1fYWRkcik6IE5ldyBmdW5jdGlvbi4gUmVhZHMgZG1hcCByZWdpc3RlciBhbmQgdHJhbnNsYXRlcyBkYXRhCi0gCWFkZHJlc3NlcyB0byBsb2NhbCBhZGRyZXNzZXMuCi0JKHBjX2FkZHIpOiBOZXcgZnVuY3Rpb24uIFJlYWRzIGltYXAgcmVnaXN0ZXIgYW5kIGNvbXB1dGVzIGxvY2FsIGFkZHJlc3MKLQljb3JyZXNwb25kaW5nIHRvIGNvbnRlbnRzIG9mIHRoZSBQQy4KLQkoc2ltX3Jlc3VtZSk6IENoYW5nZSB0byB1c2UgcGNfYWRkcigpLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogQ2hhbmdlIHJlaW5pdGlhbGl6YXRpb24gY29kZS4gQWxzbyByZWluaXRpYWxpemVzCi0JaW1hcFswMV0gYW5kIGRtYXAuCi0JKHNpbV9mZXRjaF9yZWdpc3Rlcik6IEFkZCBmYWtlIHJlZ2lzdGVycyAzMiwzMywzNCBmb3IgaW1hcDAsIGltYXAxLCBhbmQgZG1hcC4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkIGZha2UgcmVnaXN0ZXJzIDMyLDMzLDM0IGZvciBpbWFwMCwgaW1hcDEsIGFuZCBkbWFwLgotCi0JKiBzaW1vcHMuYyAoTUVNUFRSKTogUmVkZWZpbmUgdG8gdXNlIGRtZW1fYWRkcigpLgotCShPUF81RjAwKTogUmVwbGFjZSByZWZlcmVuY2VzIHRvIFNUYXRlLmltZW0gd2l0aCBkbWVtX2FkZHIoKS4KLQkKLQkqIGQxMHYtc2ltLmggKFN0YXRlKTogUmVtb3ZlIG1lbV9taW4gYW5kIG1lbV9tYXguIEFkZCB1bWVtWzEyOF0uCi0JKFJCLFNXLFJXLFNMVyxSTFcpOiBSZWRlZmluZSB0byB1c2UgZG1lbV9hZGRyKCkuCi0JKElNQVAwLElNQVAxLERNQVAsU0VUX0lNQVAsU0VUX0lNQVAxLFNFVF9ETUFQKTogRGVmaW5lLgotCQotVHVlIE9jdCAyMiAxNToyMjozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKF9pbnNfdHlwZSk6IFJlb3JnYW5pemUsIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUKLQliZXR0ZXIgc3RhdGlzdGljcywgbGlrZSBub3QgY291bnRpbmcgTk9QUyBhcyBwYXJhbGxlbAotCWluc3RydWN0aW9ucywgYW5kIHByaW50aW5nIHRvdGFsIGN5Y2xlcy4KLQkoaW5zX3R5cGVfY291bnRlcnMpOiBNYWtlIHVuc2lnbmVkIGxvbmcuCi0JKGxlZnRfbm9wcyxyaWdodF9ub3BzKTogRm9sZCBpbnRvIGluc190eXBlX2NvdW50ZXJzLgotCi0JKiBzaW1vcHMuYyAodHJhY2VfaW5wdXRfZnVuYyk6IFByaW50IG5ldyBpbnN0cnVjdGlvbiB0eXBlcy4KLQlIYW5kbGUgT1BfUjJSMyBhcyBpbnB1dCB0eXBlcy4KLQkoT1BfezM4MDAwMDAwLDcwMDB9KTogQ29ycmVjdGx5IHNpZ24gZXh0ZW5kIGJ5dGVzLgotCShPUF81RTAwKTogRG9uJ3QgY291bnQgTk9QcyBhcyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCi0JKE9QXzQ2MEIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCShPUF81RjAwKTogRGl0dG8uCi0KLQkqIGludGVycC5jIChpbnNfdHlwZV9jb3VudGVycyk6IE1ha2UgdW5zaWduZWQgbG9uZy4KLQkobGVmdF9ub3BzLHJpZ2h0X25vcHMpOiBEZWxldGUuCi0JKG1vc3QgZnVuY3Rpb25zKTogQWRkIHByb3RvdHlwZXMuCi0JKElOTElORSk6IElmIEdDQyBhbmQgb3B0aW1pemUgZGVmaW5lIGFzIF9faW5saW5lX18uCi0JKHssbG9va3VwX31oYXNoLGdldF9vcGVyYW5kcyk6IERlY2xhcmUgYXMgSU5MSU5FLgotCShkb19wYXJhbGxlbCk6IENvdW50IGNvbmRpdGlvbmFsIG9wZXJhdGlvbnMuCi0JKGFkZF9jb21tYXMpOiBOZXcgZnVuY3Rpb24sIHRvIGFkZCBjb21tYXMgZXZlcnkgMyBkaWdpdHMuCi0JKHNpbV9zaXplKTogQ2FsbCBhZGRfY29tbWFzIHRvIHByaW50IG51bWJlcnMuCi0JKHNpbV97b3BlbixyZXN1bWV9KTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuCi0JKHNpbV9pbmZvKTogUHJvdmlkZSBiZXR0ZXIgc3RhdGlzdGljcy4KLQkoc2ltX3JlYWQpOiBBZGQgaW50IHJldHVybiB0eXBlLgotCi1Nb24gT2N0IDIxIDE2OjE2OjI2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IENoYW5nZSB0aGUgd2F5IHNpbmdsZS1zdGVwcGluZyBhbmQgZXhjZXB0aW9ucwotIAlhcmUgaGFuZGxlZCBzbyBzaW5nbGUtc3RlcHBpbmcgd29ya3MgYWdhaW4uCi0KLVRodSBPY3QgMTcgMTI6MjQ6MTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbmRpYW4uYzogT3B0aW1pemUgc2ltdWxhdGVkIGxvYWRzL3N0b3JlcyBvbiB4ODYsIEFJWCwgYW5kIGJpZwotCWVuZGlhbiBob3N0cy4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tYnN3YXApOiBOZXcgc3dpdGNoIHRvIGVuYWJsZSB1c2luZwotCXRoZSBCU1dBUCBpbnN0cnVjdGlvbiBvbiB4ODYncy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogTWFrZWZpbGUuaW4gKHtTV0FQLENPTkZJR31fQ0ZMQUdTKTogQWRkIC0tZW5hYmxlLXNpbS1ic3dhcAotCXN1cHBvcnQuCi0KLVdlZCBPY3QgMTYgMTM6NTA6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbmRpYW4uYzogTmV3IGZpbGUuICBNb3ZlIGVuZGlhbiBmdW5jdGlvbnMgaGVyZSBmcm9tIGludGVycC5jLgotCU9wdGltaXplIGNvZGUsIGFuZCBtYWtlIGl0IHdvcmsgYXMgZWl0aGVyIGlubGluZSBmdW5jdGlvbnMgb3IgYXMgYQotCXNlcGFyYXRlIGZpbGUuCi0KLQkqIGludGVycC5jOiBNb3ZlIGVuZGlhbiBmdW5jdGlvbnMgZnJvbSBoZXJlIHRvIGVuZGlhbi5jLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERSk6IEFkZCBlbmRpYW4uYy4KLQkocnVuLGxpYnNpbS5hKTogQWRkIGRlcGVuZGVuY3kgb24gZW5kaWFuLm8uCi0JKGVuZGlhbi5vKTogQWRkIGRlcGVuZGVuY3kuCi0KLQkqIGQxMHZfc2ltLmggKHJlYWQvd3JpdGUgc3VwcG9ydCk6IEFsd2F5cyBnbyB0aHJvdWdoIHRoZSBtYWNoaW5lCi0JaW5kZXBlbmRlbnQgZW5kaWFuIGZ1bmN0aW9ucy4gIElmIGNvbXBpbGluZyB3aXRoIEdDQyBhbmQKLQlvcHRpbWl6aW5nLCBpbmNsdWRlIGVuZGlhbi5jIHNvIHRoZSBlbmRpYW4gZnVuY3Rpb25zIGFyZSBpbmxpbmVkLgotCi0JKiBzaW1vcHMuYyAoT1BfNUYwMCk6IENvcnJlY3QgdHJhY2luZyBvZiBhY2N1bXVsYXRvcnMuCQotCi1UdWUgT2N0IDE1IDEwOjU3OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzVGMDApOiBBZGQgc3VwcG9ydCBmb3IgZ2V0cGlkLCBraWxsIHN5c3RlbSBjYWxscy4KLQotCSogaW50ZXJwLmMgKGRvX3syX3Nob3J0LHBhcmFsbGVsfSk6IElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQsCi0JZG9uJ3QgZXhlY3V0ZSB0aGUgc2Vjb25kIGluc3RydWN0aW9uLgotCi1TYXQgT2N0IDEyIDIyOjE3OjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QX3szMTAwMDAwMCw2NjAxLDYyMDEsNjIwMH0pOiBTdG9yZSBhZGRyZXNzIGluIGEKLQl0ZW1wb3JhcnkgaW4gY2FzZSB0aGUgcmVnaXN0ZXIgaXMgb3ZlcnJpZGVuIHdoZW4gbG9hZGluZy4KLQkoT1BfNjIwMCk6IE91dHB1dCB0eXBlIGlzIE9QX0RSRUcgZm9yIHRyYWNpbmcuCi0KLUZyaSBPY3QgIDQgMjM6NDY6MTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBkMTB2X3NpbS5oIChzdHJ1Y3QgX3N0YXRlKTogQWRkIG1lbV97bWluLG1heH0gZmllbGRzLgotCi0JKiBpbnRlcnAuYyAoc2ltX3NpemUpOiBJbml0aWFsaXplIG1lbV97bWluLG1heH0gZmllbGRzLgotCShzaW1fd3JpdGUpOiBVcGRhdGUgbWVtX3ttaW4sbWF4fSBmaWVsZHMuCi0JKHNpbV9yZXN1bWUpOiBJZiBQQyBpcyBub3QgaW4gdGhlIG1pbmltdW0vbWF4aW11bSBtZW1vcnkgcmFuZ2UsCi0JYWJvcnQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBQcmVzZXJ2ZSBtZW1fe21pbixtYXh9IGZpZWxkcy4KLQotRnJpIFNlcCAyNyAxMzoxMTo1OCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogQWRkIHN1cHBvcnQgZm9yIHRpbWUoKSBzeXN0ZW0gY2FsbC4KLQotV2VkIFNlcCAyNSAxNjozMTo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF97NkUwMSw2QTAxLDZFMUYsNkEwMH0pOiBQcmludCBib3RoIHdvcmRzIGJlaW5nCi0Jc3RvcmVkIGlmIHRyYWNpbmcuCi0JKE9QXzVGMDAsdHJhY2Vfe2luLG91dH1wdXRfZnVuYyk6IEFkZCBmaW5lciBncmFpbiB0cmFjaW5nIGZvcgotCXN5c3RlbSBjYWxscy4KLQotTW9uIFNlcCAyMyAxNzo1NTozMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChvcF90eXBlcyk6IEFkZCBPUF97Q09OU1RBTlQ4LFIyLFIzfS4KLQkodHJhY2VfaW5wdXRfZnVuYyk6IEFkZCBzdXBwb3J0IGZvciAgT1Bfe0NPTlNUQU5UOCxSMixSM30uCi0JKE9QX3s0OTAwLDI0ODAwMDAwLDQ4MDAsNEEwMCw0QjAwLDREMDAsNEMwMH0pOiBBZGQgT1BfUjIgYW5kIE9QX1IzCi0JdG8gY2FsbC9zdWJyb3V0aW5lIHJldHVybnMgdG8gdHJhY2UgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgYW5kCi0JdGhlIHJldHVybiB2YWx1ZS4gIEZvciBzbWFsbCBqdW1wcywgdXNlIENPTlNUQU5UOCwgbm90IENPTlNUQU5UMTYuCi0KLUZyaSBTZXAgMjAgMTU6MzY6NDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogUmVpbml0aWFsaXplIFN0YXRlIGV2ZXJ5IHRpbWUgCi0Jc2ltX2NyZWF0ZV9pbmZlcmlvcigpIGlzIGNhbGxlZC4KLQotVGh1IFNlcCAxOSAyMTozODoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnppcGxpbmsubmV0PgotCi0JKiBzaW1vcHMuYyAoT1BfezQwMSwyMDAwMDAwLDYwMSwzMDAwMDAwLDIzMDAwMDAwfSk6IEdldCBzaWduIHJpZ2h0Ci0Jb24gY29tcGFyaXNvbnMuCi0JKE9QXzQwMSk6IEZpeCB0cmFjaW5nIGluZm9ybWF0aW9uLgotCi1UaHUgU2VwIDE5IDEwOjMwOjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKFNJWkVfe1BDLExJTkVfTlVNQkVSfSk6IE5ldyBkZWZhdWx0IHNpemVzIGZvciBvdXRwdXQuCi0JKHRyYWNlX2lucHV0X2Z1bmMpOiBVc2UgdGhlbS4KLQkodHJhY2VfaW5wdXRfZnVuYyk6IE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHRyYWlsaW5nIHNwYWNlIGFmdGVyIHRoZQotCWluc3RydWN0aW9uLgotCShPUF82MjAwKTogRml4IHRyYWNpbmcgaW5mby4KLQotCSogTWFrZWZpbGUuaW4gKHJ1bik6IEFkZCBkZXBlbmRlbmNpZXMgb24gbGliYmZkLmEgYW5kCi0JbGliaWJlcml0eS5hLgotCi1XZWQgU2VwIDE4IDA5OjEzOjI1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZDEwdl9zaW0uaCAoREVCVUdfSU5TVFJVQ1RJT04pOiBOZXcgZGVidWcgdmFsdWUgdG8gaW5jbHVkZSBsaW5lCi0JbnVtYmVycyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gZGVidWcgdHJhY2UuCi0JKERFQlVHKTogSWYgbm90IGRlZmluZWQsIHNldCB0byBERUJVR19UUkFDRSwgREVCVUdfVkFMVUVTLCBhbmQKLQlERUJVR19MSU5FX05VTUJFUi4gCi0JKFNJR19EMTBWX3tTVE9QLEVYSVR9KTogVmFsdWVzIHRvIHJlcHJlc2VudCB0aGUgc3RvcCBpbnN0cnVjdGlvbgotCWFuZCBleGl0IHN5c3RlbSBjYWxsIHRyYXAgYmVpbmcgZXhlY3V0ZWQuCi0KLQkqIGludGVycC5jIChzaW1fc3RvcF9yZWFzb24pOiBTZXQgZXhpdCBjb2RlIGNvcnJlY3RseSBmb3Igc3RvcAotCWluc3RydWN0aW9uIGFuZCBleGl0IHN5c3RlbSBjYWxsIHRyYXAuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWNmbGFncyk6IFJlbW92ZSB0cmFjZSBjYXNlLgotCSgtLWVuYWJsZS1zaW0tZGVidWcpOiBOZXcgc3dpdGNoIHRvIHNldCB0aGUgZGVidWcgdmFsdWVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBzaW1vcHMuYyAodHJhY2Vfe2lucHV0LG91dHB1dH1fZnVuYyk6IFJlbmFtZSBmcm9tCi0JdHJhY2Vfe2lucHV0LG91dHB1dH0uCi0JKHRyYWNlX3tpbnB1dCxvdXRwdXR9KTogQ2FsbCB0cmFjZV97aW5wdXQsb3V0cHV0fV9mdW5jIGlmCi0JZDEwdl9kZWJ1ZyBpcyBub24temVyby4KLQkoU0laRV9JTlNUUlVDVElPTik6IEN1dCBkb3duIHRvIDguCi0JKFNJWkVfT1BFUkFORFMpOiBDdXQgZG93biB0byAxOC4KLQkoU0laRV9MT0NBVElPTik6IE5ldyB2YWx1ZSBmb3Igc2l6ZSBvZiBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZQotCWZpZWxkLgotCShpbml0X3RleHRfcCx0ZXh0eyxfc3RhcnQsX2VuZH0pOiBOZXcgc3RhdGljIHZhcmlhYmxlcyBmb3IKLQlwcmludGluZyBsaW5lIG51bWJlciBhbmQgZnVuY3Rpb24gbmFtZS4KLQkoZXhlY19iZmQpOiBOZXcgZXh0ZXJuYWwgdGhhdCBydW4uYyBzZXRzLgotCSh0cmFjZV9pbnB1dF9mdW5jKTogUHJpbnQgbGluZSBudW1iZXIgYW5kIGZ1bmN0aW9uIG5hbWUgaWYKLQlhdmFpbGFibGUgYW5kIGlmIGRlc2lyZWQuCi0JKE9QXzRFMDkpOiBEb24ndCBwcmludCBvdXQgREJUIG1lc3NhZ2UuCi0JKE9QXzVGRTApOiBTZXQgZXhjZXB0aW9uIGZpZWxkIHRvIFNJR19EMTBWX1NUT1AuCi0JKE9QXzVGMDApOiBTZXQgZXhjZXB0aW9uIGZpZWxkIHRvIFNJR19EMTBWX0VYSVQuCQotCi1TYXQgU2VwIDE0IDIyOjE4OjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGRvXzJfc2hvcnQpOiBJZiB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RlcyBqdW1wLT5pbnMsCi0JZG9uJ3QgZG8gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpZiB0aGUganVtcCBzdWNjZWVkcy4KLQotRnJpIFNlcCAxMyAyMjozNToxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogVXNlIHVua25vd24gdHJhcHMgdG8gcHJpbnQgYWxsIEdQUnMsCi0JYWNjdW11bGF0b3JzLCBQQywgYW5kIEYwL0YxL0MgZmxhZ3MuCi0KLVRodSBTZXAgMTIgMTI6NTA6MTEgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfNUYwMCk6IEZpeCBwcm9ibGVtcyB3aXRoIHN5c3RlbSBjYWxscy4KLQotVGh1IFNlcCAxMiAxMjoxOToyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF81RjAwKTogQ29ycmVjdCB0cmFjaW5nIGluZm9ybWF0aW9uIGZvciB0cmFwLgotCi1XZWQgU2VwIDExIDE4OjU1OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBDb3JyZWN0bHkgZmluZCBvcGNvZGVzIGRpcmVjdG9yeS4KLQotTW9uIFNlcCAgOSAxMzoyNzoyNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jICh0cmFjZV9vdXRwdXQpOiBQcm9wZXJseSBhbGlnbiBhY2N1bXVsYXRvciBvdXRwdXQuCi0JKE9QXzN7MCwyLDR9MDApOiBQcm9wZXJseSBwYXJlbnRoZXNpemUgdGVzdCBleHByZXNzaW9uLiAgQWRkIGVycm9yCi0JaWYgc2hpZnQgY291bnQgaXMgdG9vIGhpZ2guCi0JKE9QXzRFezAwLDAyLDA0LDIwLDIyLDQwLDQyfSk6IE1ha2UgdGVzdHMgYWdyZWUgd2l0aCBib29rLgotCShPUF80RTA5KTogTWFrZSBjcGZnIHByb3Blcmx5IHRyYWNlIHRoZSBpbnB1dCBmbGFncy4KLQkob3BfdHlwZXMpOiBBZGQgT1BfRkxBR19PVVRQVVQuCi0JKHRyYWNlX3tpbnB1dCxvdXRwdXR9KTogU3VwcG9ydCBPUF9GTEFHX09VVFBVVC4KLQkoT1BfMzEwMDAwMDApOiBUaGlzIGxkMncgdmFyaWVudCBpcyBhIDE2LWJpdCBtZW1vcnkgcmVmZXJlbmNlLCBub3QKLQlhbiA4LWJpdCBtZW1vcnkgcmVmZXJlbmNlIGluc3RydWN0aW9uIGZvciB0cmFjaW5nIHB1cnBvc2VzLgotCShPUF8yMDEpOiBBZGRpIG5lZWRzIHRvIHNldCB0aGUgY2FycnkuCi0KLUZyaSBTZXAgIDYgMTc6NTY6MTcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF8yNjAwLCBPUF8yNjAxKTogQ2hhbmdlZCBtaW4gYW5kIG1heCBjb21wYXJpc29ucwotCXRvIHVzZSBzaWduZWQgcmVnaXN0ZXIgdmFsdWVzLgotCi1XZWQgU2VwICA0IDExOjM1OjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZDEwdl9zaW0uaCAoREVCVUdfKik6IEFkZCBiaXQgZmxhZ3MgZm9yIGNvbnRyb2xsaW5nIGRlYnVnCi0Jb3V0cHV0LgotCShfaW5zX3R5cGUpOiBOZXcgZW51bWVyYXRpb24gdG8gc3BlY2lmeSB3aGljaCBjb250YWluZXIgYW4KLQlpbnN0cnVjdGlvbiBpcyBpbiwgYW5kIHdoZXRoZXIgaXQgaXMgcGFydCBvZiBhIHBhcmFsbGVsIG9wZXJhdGlvbi4KLQkoX3N0YXRlKTogQWRkIGluc190eXBlIGZpZWxkLgotCSh7LHV9aW50ezgsMTYsMzIsNjR9KTogVXNlIGxpbWl0cy5oIHRvIHNpemUgdGhlIGFwcHJvcHJpYXRlIHR5cGVzLgotCShpbnNfdHlwZV9jb3VudGVycyk6IENvdW50ZXJzIGZvciB0aGUgdmFyaW91cyBpbnN0cnVjdGlvbiB0eXBlcy4KLQkoe2xlZnQscmlnaHR9X25vcHMpOiBDb3VudGVycyBmb3IgdGhlIG51bWJlciBvZiBub3BzIGluIGVhY2gKLQljb250YWluZXIuCi0JKGQxMHZfZGVidWcpOiBOZXcgdmFyaWFibGUgdG8gaW5kaWNhdGUgd2hldGhlciBkZWJ1Z2dpbmcgaXMgdHVybmVkCi0Jb24uCi0KLQkqIHNpbW9wcy5jOiAoYWxsIGZ1bmN0aW9ucyk6IENoYW5nZSBhbGwgI2lmZGVmIERFQlVHIGNvZGUgc28gdGhhdAotCXRoZSBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBjYW4gYmUgdHJhY2VkLCBhbG9uZyB3aXRoIHRoZQotCWluc3RydWN0aW9uIHR5cGUuICBNYWtlIHRoZSAtdCBvcHRpb24gZW5hYmxlIHRyYWNpbmcuCi0JKGFsbCBmdW5jdGlvbnMpOiBDaGFuZ2UgcHJpbnRmIGNhbGxzIHRvIHVzZSB0aGUgcHJpbnRmX2ZpbHRlcmVkCi0JZnVuY3Rpb24gaW4gdGhlIGNhbGxiYWNrIHRhYmxlLgotCi0JKiBpbnRlcnAuYyAoX2xlZnRyaWdodCk6IE5ldyBlbnVtZXJhdGlvbiB0byBzYXkgd2hldGhlciAyIHNob3J0Ci0JaW5zdHJ1Y3Rpb25zIGFyZSBkb25lIGxlZnQgZmlyc3Qgb3IgcmlnaHQgZmlyc3QuCi0JKGRvX3tsb25nLDJfc2hvcnQscGFyYWxsZWx9KTogSW5kaWNhdGUgaW4gdGhlIG1hY2hpbmUgc3RhdGUgd2hpY2gKLQl0eXBlIG9mIGluc3RydWN0aW9uIHRoaXMgaXMuICBDb3VudCBlYWNoIG9mIHRoZSB0eXBlcyBvZgotCWluc3RydWN0aW9ucyBleGVjdXRlZC4KLQkoc2ltX3NpemUpOiBPbmx5IHByaW50IHRoZSBtZW1vcnkgc2l6ZXMgaWYgREVCVUdfTUVNU0laRSBkZWJ1ZwotCWZsYWcgaXMgc2V0LgotCShzaW1fcmVzdW1lKTogUGFzcyBsZWZ0L3JpZ2h0IGluZGljYXRpb24gdG8gZG9fMl9zaG9ydC4KLQkoYWxsIGZ1bmN0aW9ucyk6IENoYW5nZSBwcmludGYgY2FsbHMgdG8gdXNlIHRoZSBwcmludGZfZmlsdGVyZWQKLQlmdW5jdGlvbiBpbiB0aGUgY2FsbGJhY2sgdGFibGUuCi0JKHNpbV90cmFjZSk6IFR1cm4gb24gZGVidWcgZmxhZyBpZiBERUJVRyB3YXMgZGVmaW5lZCwgYW5kIGNhbGwKLQlzaW1fcmVzdW1lLgotCShzaW1faW5mbyk6IFByaW50IG91dCBzdGF0aXN0aWNzIG9uIGluc3RydWN0aW9ucy4KLQkoc2ltX3t0cmFjZSxjcmVhdGVfaW5mZXJpb3J9KTogRWxpbWluYXRlIGV4dHJhbmVvdXMgb3V0cHV0IHVubGVzcwotCWRlYnVnZ2luZy4KLQkoc2ltX29wZW4pOiBJZiBhcmdzID09IC10IGFuZCBERUJVRyB3YXMgZGVmaW5lZCwgc2V0IGQxMHZfZGVidWcuCi0JT25seSBpbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHNpbV9vcGVuIGlzIGNhbGxlZC4KLQotCSogTWFrZWZpbGUuaW46IE1ha2Ugb2JqZWN0cyBkZXBlbmQgb24gZDEwdl9zaW0uaC4KLQkoeyxTSU1ffUNGTEFHUyk6IEluY2x1ZGUgY29uZmlndXJlIGRlcGVuZGVudCBzd2l0Y2hlcy4gIFNldHRpbmcKLQlDRkxBR1MgZG9lcyBub3Qgb3ZlcnJpZGUgaG9zdC90YXJnZXQgZGVmaW5lcyBvciBTSU1fQ0ZMQUdTLgotCShDQ19GT1JfQlVJTEQsZ2VuY29kZSk6IFVzZSBDQ19GT1JfQlVJTEQgdG8gY29tcGlsZSBnZW5jb2RlLgotCShydW4pOiBCeSBkZWZhdWx0LCB0aGUgbWF0aCBsaWJyYXJ5IGlzIG5vdCBuZWVkZWQgdG8gYmUgbGlua2VkCi0JaW4uCi0JKHtCRkQsTElCSUJFUlRZfV9MSUIpOiBEZWZpbmUgYXMgdmFyaWFibGVzIHNvIHRoZXkgY2FuIGJlCi0Jb3ZlcnJpZGRlbi4KLQkoVlBBVEgpOiBEb24ndCBzZXQgdG8gYW55dGhpbmcgYnV0IEBzcmNkaXJAIHRvIHdvcmsgd2l0aCBub24tR05VCi0JbWFrZXMuCi0JKHtydW4sY2FsbGJhY2t9Lm8pOiBQcm92aWRlIGV4cGxpY2l0IHBhdGhzIHRvIHRoZWlyIGFwcHJvcHJpYXRlCi0Jc291cmNlIGRpcmVjdG9yaWVzLgotCShnZW5jb2Rleywub30sZDEwdi1vcGMubyk6IFNwbGl0IGNvbXBpbGF0aW9uIGludG8gY3JlYXRpbmcgb2JqZWN0Ci0JYW5kIGxpbmtpbmcuICBJbnN0ZWFkIG9mIGxpbmtpbmcgaW4gbGlib3Bjb2Rlcy5hLCBqdXN0IGNvbXBpbGUKLQlkMTB2LW9wYy5vIGRpcmVjdGx5IHRvIGhhbmRsZSBjYW5hZGlhbiBjcm9zcy4KLQkoQ1NFQVJDSCk6IEFkZCBvcGNvZGVzIGRpcmVjdG9yeS4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tY2ZsYWdzKTogTmV3IHN3aXRjaCB0byBhbGxvdyB1c2VyIHRvCi0Jc2V0IHRoZSBkZWZhdWx0cy4KLQkoQ0NfRk9SX0JVSUxEKTogRGVhbCB3aXRoIGNhbmFkaWFuIGNyb3NzZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVdlZCBTZXAgMDQgMDQ6NDU6MzQgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYzogSW5jbHVkZSBjb3JyZWN0IHN5c2NhbGwuaCBmb3IgZDEwdiwgbm90IGhvc3Qncy4KLQlGaXggI2lmZGVmIFNZU19zdGF0LgotCi1UdWUgU2VwICAzIDE0OjAwOjA0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzVGMDApOiBXcmFwIGFsbCBTWVNfeHh4IHRyYXBzIHdpdGggI2lmZGVmLgotCUFkZCB0cmFwIDIgdG8gYmUgcHJpbnRmIGFuZCB0cmFwIDMgdG8gYmUgcHV0Y2hhci4KLQotV2VkIEF1ZyAyOCAyMTo0MjozNCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYywgc2ltb3BzLmM6IEFkZCBzdXBwb3J0Ci0JZm9yIGxvdy1sZXZlbCBzeXN0ZW0gY2FsbHMuCi0KLVdlZCBBdWcgMjggMTc6MzM6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYzogRml4IGJ5dGUtb3JkZXIgcHJvYmxlbXMuCi0KLU1vbiBBdWcgMjYgMTg6MzA6MjggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHZfc2ltLmggKFNFWFQzMik6IEFkZGVkLgotCSogaW50ZXJwLmM6IENvbW1lbnRlZCBvdXQgcHJpbnRmcy4KLQkqIHNpbW9wcy5jOiAgRml4ZWQgZXJyb3IgaW4gc2IgYW5kIHN0MncuIAotCi1UaHUgQXVnIDE1IDEzOjMwOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgZDEwdl9zaW0uaCwgaW50ZXJwLmMsIHNpbW9wcy5jOiBBZGRlZCByZW1haW5pbmcKLQlEU1AgaW5zdHJ1Y3Rpb25zLiAgQWRkZWQgbW9kdWxvIGFkZHJlc3NpbmcuCi0KLVN1biBBdWcgMTEgMTI6NTc6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYywgc2ltb3BzLmM6IFNuYXBzaG90LgotCi1GcmkgQXVnICAyIDE3OjQ0OjI0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2X3NpbS5oLCBzaW1vcHMuYzogU25hcHNob3QuCi0KLVRodSBBdWcgIDEgMTc6MDU6MjQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIENoYW5nZUxvZywgTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBkMTB2X3NpbS5oLCAKLQlnZW5jb2RlLmMsIGludGVycC5jLCBzaW1vcHMuYzogQ3JlYXRlZC4KLQpkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvTWFrZWZpbGUuaW4gYi9zaW0vZDEwdi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkMjE5Zi4uMDAwMDAwMAotLS0gYS9zaW0vZDEwdi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIEQxMHYgc2ltIGxpYnJhcnkuCi0jICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1TSU1fT0JKUyA9IGludGVycC5vIHRhYmxlLm8gc2ltb3BzLm8gZW5kaWFuLm8gc2ltLWxvYWQubwotU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4tZXh0cmEKLVNJTV9FWFRSQV9DRkxBR1MgPSAtRE5FRURfVUlfTE9PUF9IT09LIC1EU0lNX0hBVkVfRU5WSVJPTk1FTlQKLQotSU5DTFVERSA9IGQxMHZfc2ltLmggJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmggdGFyZy12YWxzLmggZW5kaWFuLmMKLQotIyBUaGlzIHNlbGVjdHMgdGhlIGQxMHYgbmV3bGliL2xpYmdsb3NzIHN5c2NhbGwgZGVmaW5pdGlvbnMuCi1OTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9kMTB2Ci0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLXNpbW9wcy5oOiBnZW5jb2RlCi0JLi9nZW5jb2RlIC1oID4kQAotCi10YWJsZS5jOiBnZW5jb2RlIHNpbW9wcy5oCi0JLi9nZW5jb2RlID4kQAotCi1nZW5jb2RlLm86IGdlbmNvZGUuYyAkKElOQ0xVREUpCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZ2VuY29kZS5jCi0KLWQxMHYtb3BjLm86ICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL2QxMHYtb3BjLmMKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL2QxMHYtb3BjLmMKLQotZ2VuY29kZTogZ2VuY29kZS5vIGQxMHYtb3BjLm8KLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1vIGdlbmNvZGUgZ2VuY29kZS5vIGQxMHYtb3BjLm8gJChCVUlMRF9MSUIpCi0KLWNsZWFuLWV4dHJhOgotCXJtIC1mIHRhYmxlLmMgc2ltb3BzLmggZ2VuY29kZQotCi1pbnRlcnAubzogaW50ZXJwLmMgdGFibGUuYyAkKElOQ0xVREUpCi1zaW1vcHMubzogc2ltb3BzLmMgJChJTkNMVURFKQotZW5kaWFuLm86IGVuZGlhbi5jICQoSU5DTFVERSkKLXRhYmxlLm86IHRhYmxlLmMKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2FjY29uZmlnLmggYi9zaW0vZDEwdi9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9kMTB2L2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2NvbmZpZy5pbiBiL3NpbS9kMTB2L2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4N2EyYi4uMDAwMDAwMAotLS0gYS9zaW0vZDEwdi9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX1NFVEZQVUNXCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2NvbmZpZ3VyZSBiL3NpbS9kMTB2L2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTEwNmM0Yy4uMDAwMDAwMAotLS0gYS9zaW0vZDEwdi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzWz1MSVNUXQkJRW5hYmxlIGJ1aWxkLXRpbWUgY29tcGlsZXIgd2FybmluZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjgxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzYxOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODg6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4ODogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyODogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDYxOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTY6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI5OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTQ6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMzMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzNDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM3MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIzOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5NDogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ1OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5Nzc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAyMDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxNTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzODE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjgxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NDE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjI6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTgxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwOTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwNDogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0ODogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCi0gIGJ1aWxkX3dhcm5pbmdzPSItV2FsbCAtV3BvaW50ZXItYXJpdGggLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIgotY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCTs7Ci0gIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKLSAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0JYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKLSAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0JYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKLSAgKikJYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKLWZpCi1XQVJOX0NGTEFHUz0iIgotV0VSUk9SX0NGTEFHUz0iIgotaWYgdGVzdCAieCR7YnVpbGRfd2FybmluZ3N9IiAhPSB4IC1hICJ4JEdDQyIgPSB4eWVzCi10aGVuCi0gICMgU2VwYXJhdGUgb3V0IHRoZSAtV2Vycm9yIGZsYWcgYXMgc29tZSBmaWxlcyBqdXN0IGNhbm5vdCBiZQotICAjIGNvbXBpbGVkIHdpdGggaXQgZW5hYmxlZC4KLSAgZm9yIHcgaW4gJHtidWlsZF93YXJuaW5nc307IGRvCi0gICAgY2FzZSAkdyBpbgotICAgIC1XZXJyKikgV0VSUk9SX0NGTEFHUz0tV2Vycm9yIDs7Ci0gICAgKikgV0FSTl9DRkxBR1M9IiR7V0FSTl9DRkxBR1N9ICR3IgotICAgIGVzYWMKLSAgZG9uZQotZmkKLWVsc2UKLSAgYnVpbGRfd2FybmluZ3M9IiIKLWZpCi0KLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZwotcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZwotcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZwotcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2NvbmZpZ3VyZS5pbiBiL3NpbS9kMTB2L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlYmY2Ni4uMDAwMDAwMAotLS0gYS9zaW0vZDEwdi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotQUNfUFJFUkVRKDIuNSlkbmwKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLVNJTV9BQ19DT01NT04KLQotU0lNX0FDX09QVElPTl9XQVJOSU5HUwotCi1BQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQotCi0KLVNJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2QxMHZfc2ltLmggYi9zaW0vZDEwdi9kMTB2X3NpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY2ZGEwLi4wMDAwMDAwCi0tLSBhL3NpbS9kMTB2L2QxMHZfc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBERUJVR19UUkFDRQkJMHgwMDAwMDAwMQotI2RlZmluZSBERUJVR19WQUxVRVMJCTB4MDAwMDAwMDIKLSNkZWZpbmUgREVCVUdfTElORV9OVU1CRVIJMHgwMDAwMDAwNAotI2RlZmluZSBERUJVR19NRU1TSVpFCQkweDAwMDAwMDA4Ci0jZGVmaW5lIERFQlVHX0lOU1RSVUNUSU9OCTB4MDAwMDAwMTAKLSNkZWZpbmUgREVCVUdfVFJBUAkJMHgwMDAwMDAyMAotI2RlZmluZSBERUJVR19NRU1PUlkJCTB4MDAwMDAwNDAKLQotI2lmbmRlZglERUJVRwotI2RlZmluZQlERUJVRyAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMgfCBERUJVR19MSU5FX05VTUJFUikKLSNlbmRpZgotCi1leHRlcm4gaW50IGQxMHZfZGVidWc7Ci0KLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0jaW5jbHVkZSAic2ltLWNvbmZpZy5oIgotI2luY2x1ZGUgInNpbS10eXBlcy5oIgotCi10eXBlZGVmIHVuc2lnbmVkOCB1aW50ODsKLXR5cGVkZWYgdW5zaWduZWQxNiB1aW50MTY7Ci10eXBlZGVmIHNpZ25lZDE2IGludDE2OwotdHlwZWRlZiB1bnNpZ25lZDMyIHVpbnQzMjsKLXR5cGVkZWYgc2lnbmVkMzIgaW50MzI7Ci10eXBlZGVmIHVuc2lnbmVkNjQgdWludDY0OwotdHlwZWRlZiBzaWduZWQ2NCBpbnQ2NDsKLQotLyogRklYTUU6IEQxMFYgZGVmaW5lcyAqLwotdHlwZWRlZiB1aW50MTYgcmVnX3Q7Ci0KLXN0cnVjdCBzaW1vcHMgCi17Ci0gIGxvbmcgb3Bjb2RlOwotICBpbnQgIGlzX2xvbmc7Ci0gIGxvbmcgbWFzazsKLSAgaW50IGZvcm1hdDsKLSAgaW50IGN5Y2xlczsKLSAgaW50IHVuaXQ7Ci0gIGludCBleGVjX3R5cGU7Ci0gIHZvaWQgKCpmdW5jKSgpOwotICBpbnQgbnVtb3BzOwotICBpbnQgb3BlcmFuZHNbOV07Ci19OwotCi1lbnVtIF9pbnNfdHlwZQotewotICBJTlNfVU5LTk9XTiwJCQkvKiB1bmtub3duIGluc3RydWN0aW9uICovCi0gIElOU19DT05EX1RSVUUsCQkvKiAjIHRpbWVzIEVYRXh4eCBleGVjdXRlZCBvdGhlciBpbnN0cnVjdGlvbiAqLwotICBJTlNfQ09ORF9GQUxTRSwJCS8qICMgdGltZXMgRVhFeHh4IGRpZCBub3QgZXhlY3V0ZSBvdGhlciBpbnN0cnVjdGlvbiAqLwotICBJTlNfQ09ORF9KVU1QLAkJLyogIyB0aW1lcyBKVU1QIHNraXBwZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gKi8KLSAgSU5TX0NZQ0xFUywJCQkvKiAjIGN5Y2xlcyAqLwotICBJTlNfTE9ORywJCQkvKiBsb25nIGluc3RydWN0aW9uIChib3RoIGNvbnRhaW5lcnMsIGllIEZNID09IDExKSAqLwotICBJTlNfTEVGVFJJR0hULAkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgLT4gUiAoaWUsIEZNID09IDAxKSAqLwotICBJTlNfUklHSFRMRUZULAkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgPC0gUiAoaWUsIEZNID09IDEwKSAqLwotICBJTlNfUEFSQUxMRUwsCQkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgfHwgUiAoaWUsIFJNID09IDAwKSAqLwotCi0gIElOU19MRUZULAkJCS8qIG5vcm1hbCBsZWZ0IGluc3RydWN0aW9ucyAqLwotICBJTlNfTEVGVF9QQVJBTExFTCwJCS8qIGxlZnQgc2lkZSBvZiB8fCAqLwotICBJTlNfTEVGVF9DT05EX1RFU1QsCQkvKiBFWEV4eCB0ZXN0IG9uIGxlZnQgc2lkZSAqLwotICBJTlNfTEVGVF9DT05EX0VYRSwJCS8qIGV4ZWN1dGlvbiBhZnRlciBFWEV4eHggdGVzdCBvbiByaWdodCBzaWRlIHN1Y2NlZWRlZCAqLwotICBJTlNfTEVGVF9OT1BTLAkJLyogTk9QIG9uIGxlZnQgc2lkZSAqLwotCi0gIElOU19SSUdIVCwJCQkvKiBub3JtYWwgcmlnaHQgaW5zdHJ1Y3Rpb25zICovCi0gIElOU19SSUdIVF9QQVJBTExFTCwJCS8qIHJpZ2h0IHNpZGUgb2YgfHwgKi8KLSAgSU5TX1JJR0hUX0NPTkRfVEVTVCwJCS8qIEVYRXh4IHRlc3Qgb24gcmlnaHQgc2lkZSAqLwotICBJTlNfUklHSFRfQ09ORF9FWEUsCQkvKiBleGVjdXRpb24gYWZ0ZXIgRVhFeHh4IHRlc3Qgb24gbGVmdCBzaWRlIHN1Y2NlZWRlZCAqLwotICBJTlNfUklHSFRfTk9QUywJCS8qIE5PUCBvbiByaWdodCBzaWRlICovCi0KLSAgSU5TX01BWAotfTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX01BWCBdOwotCi1lbnVtIHsKLSAgU1BfSURYID0gMTUsCi19OwotCi0vKiBXcml0ZS1iYWNrIHNsb3RzICovCi11bmlvbiBzbG90X2RhdGEgewotICB1bnNpZ25lZF8xIF8xOwotICB1bnNpZ25lZF8yIF8yOwotICB1bnNpZ25lZF80IF80OwotICB1bnNpZ25lZF84IF84OwotfTsKLXN0cnVjdCBzbG90IHsKLSAgdm9pZCAqZGVzdDsKLSAgaW50IHNpemU7Ci0gIHVuaW9uIHNsb3RfZGF0YSBkYXRhOwotICB1bmlvbiBzbG90X2RhdGEgbWFzazsKLX07Ci1lbnVtIHsKLSBOUl9TTE9UUyA9IDE2LAotfTsKLSNkZWZpbmUgU0xPVCAoU3RhdGUuc2xvdCkKLSNkZWZpbmUgU0xPVF9OUiAoU3RhdGUuc2xvdF9ucikKLSNkZWZpbmUgU0xPVF9QRU5EX01BU0soREVTVCwgTVNLLCBWQUwpIFwKLSAgZG8gXAotICAgIHsgXAotICAgICAgU0xPVFtTTE9UX05SXS5kZXN0ID0gJihERVNUKTsgXAotICAgICAgU0xPVFtTTE9UX05SXS5zaXplID0gc2l6ZW9mIChERVNUKTsgXAotICAgICAgc3dpdGNoIChzaXplb2YgKERFU1QpKSBcCi0gICAgICAgIHsgXAotICAgICAgICBjYXNlIDE6IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzEgPSAodW5zaWduZWRfMSkgKFZBTCk7IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzEgPSAodW5zaWduZWRfMSkgKE1TSyk7IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgICBjYXNlIDI6IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzIgPSAodW5zaWduZWRfMikgKFZBTCk7IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzIgPSAodW5zaWduZWRfMikgKE1TSyk7IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgICBjYXNlIDQ6IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzQgPSAodW5zaWduZWRfNCkgKFZBTCk7IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzQgPSAodW5zaWduZWRfNCkgKE1TSyk7IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgICBjYXNlIDg6IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzggPSAodW5zaWduZWRfOCkgKFZBTCk7IFwKLSAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzggPSAodW5zaWduZWRfOCkgKE1TSyk7IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgICB9IFwKLSAgICAgIFNMT1RfTlIgPSAoU0xPVF9OUiArIDEpOyBcCi0gICAgfSBcCi0gIHdoaWxlICgwKQotI2RlZmluZSBTTE9UX1BFTkQoREVTVCwgVkFMKSBTTE9UX1BFTkRfTUFTSyhERVNULCAwLCBWQUwpCi0jZGVmaW5lIFNMT1RfRElTQ0FSRCgpIChTTE9UX05SID0gMCkKLSNkZWZpbmUgU0xPVF9GTFVTSCgpIFwKLSAgZG8gXAotICAgIHsgXAotICAgICAgaW50IGk7IFwKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTTE9UX05SOyBpKyspIFwKLQl7IFwKLQkgIHN3aXRjaCAoU0xPVFtpXS5zaXplKSBcCi0JICAgIHsgXAotCSAgICBjYXNlIDE6IFwKLQkgICAgICAqKHVuc2lnbmVkXzEqKSBTTE9UW2ldLmRlc3QgJj0gU0xPVFtpXS5tYXNrLl8xOyBcCi0JICAgICAgKih1bnNpZ25lZF8xKikgU0xPVFtpXS5kZXN0IHw9IFNMT1RbaV0uZGF0YS5fMTsgXAotCSAgICAgIGJyZWFrOyBcCi0JICAgIGNhc2UgMjogXAotCSAgICAgICoodW5zaWduZWRfMiopIFNMT1RbaV0uZGVzdCAmPSBTTE9UW2ldLm1hc2suXzI7IFwKLQkgICAgICAqKHVuc2lnbmVkXzIqKSBTTE9UW2ldLmRlc3QgfD0gU0xPVFtpXS5kYXRhLl8yOyBcCi0JICAgICAgYnJlYWs7IFwKLQkgICAgY2FzZSA0OiBcCi0JICAgICAgKih1bnNpZ25lZF80KikgU0xPVFtpXS5kZXN0ICY9IFNMT1RbaV0ubWFzay5fNDsgXAotCSAgICAgICoodW5zaWduZWRfNCopIFNMT1RbaV0uZGVzdCB8PSBTTE9UW2ldLmRhdGEuXzQ7IFwKLQkgICAgICBicmVhazsgXAotCSAgICBjYXNlIDg6IFwKLQkgICAgICAqKHVuc2lnbmVkXzgqKSBTTE9UW2ldLmRlc3QgJj0gU0xPVFtpXS5tYXNrLl84OyBcCi0JICAgICAgKih1bnNpZ25lZF84KikgU0xPVFtpXS5kZXN0IHw9IFNMT1RbaV0uZGF0YS5fODsgXAotCSAgICAgIGJyZWFrOyBcCi0JICAgIH0gXAotICAgICAgICB9IFwKLSAgICAgIFNMT1RfTlIgPSAwOyBcCi0gICAgfSBcCi0gIHdoaWxlICgwKQotI2RlZmluZSBTTE9UX0RVTVAoKSBcCi0gIGRvIFwKLSAgICB7IFwKLSAgICAgIGludCBpOyBcCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgU0xPVF9OUjsgaSsrKSBcCi0JeyBcCi0JICBzd2l0Y2ggKFNMT1RbaV0uc2l6ZSkgXAotCSAgICB7IFwKLQkgICAgY2FzZSAxOiBcCi0gICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwMnggfCAweCUwMnhcbiIsIGksIFwKLQkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl8xLCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzEpOyBcCi0JICAgICAgYnJlYWs7IFwKLQkgICAgY2FzZSAyOiBcCi0gICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwNHggfCAweCUwNHhcbiIsIGksIFwKLQkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl8yLCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzIpOyBcCi0JICAgICAgYnJlYWs7IFwKLQkgICAgY2FzZSA0OiBcCi0gICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwOHggfCAweCUwOHhcbiIsIGksIFwKLQkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl80LCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzQpOyBcCi0JICAgICAgYnJlYWs7IFwKLQkgICAgY2FzZSA4OiBcCi0gICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwOHglMDh4IHwgMHglMDh4JTA4eFxuIiwgaSwgXAotCQkgICAgICAobG9uZykgU0xPVFtpXS5kZXN0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAoU0xPVFtpXS5tYXNrLl84ID4+IDMyKSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIFNMT1RbaV0ubWFzay5fOCwgXAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgKFNMT1RbaV0uZGF0YS5fOCA+PiAzMiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzgpOyBcCi0JICAgICAgYnJlYWs7IFwKLQkgICAgfSBcCi0gICAgICAgIH0gXAotICAgIH0gXAotICB3aGlsZSAoMCkKLQotLyogZDEwdiBtZW1vcnk6IFRoZXJlIGFyZSB0aHJlZSBzZXBhcmF0ZSBkMTB2IG1lbW9yeSByZWdpb25zIElNRU0sCi0gICBVTUVNIGFuZCBETUVNLiAgVGhlIElNRU0gYW5kIERNRU0gYXJlIGZ1cnRoZXIgYnJva2VuIGRvd24gaW50bwotICAgYmxvY2tzICh2ZXJ5IGxpa2UgVk0gcGFnZXMpLiAqLwotCi1lbnVtCi17Ci0gIElNQVBfQkxPQ0tfU0laRSA9IDB4MjAwMDAsCi0gIERNQVBfQkxPQ0tfU0laRSA9IDB4NDAwMCwKLX07Ci0KLS8qIEltcGxlbWVudCB0aGUgdGhyZWUgbWVtb3J5IHJlZ2lvbnMgdXNpbmcgc3BhcnNlIGFycmF5cy4gIEFsbG9jYXRlCi0gICBtZW1vcnkgdXNpbmcgYGBzZWdtZW50cycnLiAgQSBzZWdtZW50IG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMKLSAgIGEgQkxPQ0sgLSBlbnN1cmVzIHRoYXQgYW4gYWNjZXNzIHRoYXQgZG9lc24ndCBjcm9zcyBhIGJsb2NrCi0gICBib3VuZGFyeSBjYW4ndCBjcm9zcyBhIHNlZ21lbnQgYm91bmRhcnkgKi8KLQotZW51bQotewotICBTRUdNRU5UX1NJWkUgPSAweDIwMDAwLCAvKiAxMjhLQiAtIE1BWChJTUFQX0JMT0NLX1NJWkUsRE1BUF9CTE9DS19TSVpFKSAqLwotICBJTUVNX1NFR01FTlRTID0gOCwgLyogMU1CICovCi0gIERNRU1fU0VHTUVOVFMgPSA4LCAvKiAxTUIgKi8KLSAgVU1FTV9TRUdNRU5UUyA9IDEyOCAvKiAxNk1CICovCi19OwotCi1zdHJ1Y3QgZDEwdl9tZW1vcnkKLXsKLSAgdWludDggKmluc25bSU1FTV9TRUdNRU5UU107Ci0gIHVpbnQ4ICpkYXRhW0RNRU1fU0VHTUVOVFNdOwotICB1aW50OCAqdW5pZltVTUVNX1NFR01FTlRTXTsKLSAgdWludDggZmF1bHRbMTZdOwotfTsKLQotc3RydWN0IF9zdGF0ZQotewotICByZWdfdCByZWdzWzE2XTsJCS8qIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgR1BSKE4pIChTdGF0ZS5yZWdzWyhOKV0gKyAwKQotI2RlZmluZSBTRVRfR1BSKE4sVkFMKSBTTE9UX1BFTkQgKFN0YXRlLnJlZ3NbKE4pXSwgKFZBTCkpCi0KLSNkZWZpbmUgR1BSMzIoTikgKCgoKHVpbnQzMikgU3RhdGUucmVnc1soTikgKyAwXSkgPDwgMTYpIFwKLQkJICB8ICh1aW50MTYpIFN0YXRlLnJlZ3NbKE4pICsgMV0pCi0jZGVmaW5lIFNFVF9HUFIzMihOLFZBTCkgZG8geyBTRVRfR1BSIChPUFswXSArIDAsIChWQUwpID4+IDE2KTsgU0VUX0dQUiAoT1BbMF0gKyAxLCAoVkFMKSk7IH0gd2hpbGUgKDApCi0KLSAgcmVnX3QgY3JlZ3NbMTZdOwkJLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQ1JFRyhOKSAoU3RhdGUuY3JlZ3NbKE4pXSArIDApCi0jZGVmaW5lIFNFVF9DUkVHKE4sVkFMKSBtb3ZlX3RvX2NyICgoTiksIDAsIChWQUwpLCAwKQotI2RlZmluZSBTRVRfSFdfQ1JFRyhOLFZBTCkgbW92ZV90b19jciAoKE4pLCAwLCAoVkFMKSwgMSkKLQotICByZWdfdCBzcFsyXTsgICAgICAgICAgICAgICAgICAvKiBob2xkaW5nIGFyZWEgZm9yIFNQSSgwKS9TUFUoMSkgKi8KLSNkZWZpbmUgSEVMRF9TUChOKSAoU3RhdGUuc3BbKE4pXSArIDApCi0jZGVmaW5lIFNFVF9IRUxEX1NQKE4sVkFMKSBTTE9UX1BFTkQgKFN0YXRlLnNwWyhOKV0sIChWQUwpKQotCi0gIGludDY0IGFbMl07CQkJLyogYWNjdW11bGF0b3JzICovCi0jZGVmaW5lIEFDQyhOKSAoU3RhdGUuYVsoTildICsgMCkKLSNkZWZpbmUgU0VUX0FDQyhOLFZBTCkgU0xPVF9QRU5EIChTdGF0ZS5hWyhOKV0sIChWQUwpICYgTUFTSzQwKQotCi0gIC8qIHdyaXRlYmFjayBpbmZvICovCi0gIHN0cnVjdCBzbG90IHNsb3RbTlJfU0xPVFNdOwotICBpbnQgc2xvdF9ucjsKLQotICAvKiB0cmFjZSBkYXRhICovCi0gIHN0cnVjdCB7Ci0gICAgdWludDE2IHBzdzsKLSAgfSB0cmFjZTsKLQotICB1aW50OCBleGU7Ci0gIGludAlleGNlcHRpb247Ci0gIGludAlwY19jaGFuZ2VkOwotCi0gIC8qIE5PVEU6IGV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGlzIG5vdCByZXNldCBieQotICAgICBzaW1fY3JlYXRlX2luZmVyaW9yKCkgKi8KLQotICBzdHJ1Y3QgZDEwdl9tZW1vcnkgbWVtOwotCi0gIGVudW0gX2luc190eXBlIGluc190eXBlOwotCi19IFN0YXRlOwotCi0KLWV4dGVybiBob3N0X2NhbGxiYWNrICpkMTB2X2NhbGxiYWNrOwotZXh0ZXJuIHVpbnQxNiBPUFs0XTsKLWV4dGVybiBzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdOwotZXh0ZXJuIGFzZWN0aW9uICp0ZXh0OwotZXh0ZXJuIGJmZF92bWEgdGV4dF9zdGFydDsKLWV4dGVybiBiZmRfdm1hIHRleHRfZW5kOwotZXh0ZXJuIGJmZCAqcHJvZ19iZmQ7Ci0KLWVudW0KLXsKLSAgUFNXX0NSID0gMCwKLSAgQlBTV19DUiA9IDEsCi0gIFBDX0NSID0gMiwKLSAgQlBDX0NSID0gMywKLSAgRFBTV19DUiA9IDQsCi0gIERQQ19DUiA9IDUsCi0gIFJQVF9DX0NSID0gNywKLSAgUlBUX1NfQ1IgPSA4LAotICBSUFRfRV9DUiA9IDksCi0gIE1PRF9TX0NSID0gMTAsCi0gIE1PRF9FX0NSID0gMTEsCi0gIElCQV9DUiA9IDE0LAotfTsKLQotZW51bQotewotICBQU1dfU01fQklUID0gMHg4MDAwLAotICBQU1dfRUFfQklUID0gMHgyMDAwLAotICBQU1dfREJfQklUID0gMHgxMDAwLAotICBQU1dfRE1fQklUID0gMHgwODAwLAotICBQU1dfSUVfQklUID0gMHgwNDAwLAotICBQU1dfUlBfQklUID0gMHgwMjAwLAotICBQU1dfTURfQklUID0gMHgwMTAwLAotICBQU1dfRlhfQklUID0gMHgwMDgwLAotICBQU1dfU1RfQklUID0gMHgwMDQwLAotICBQU1dfRjBfQklUID0gMHgwMDA4LAotICBQU1dfRjFfQklUID0gMHgwMDA0LAotICBQU1dfQ19CSVQgPSAgMHgwMDAxLAotfTsKLQotI2RlZmluZSBQU1cgQ1JFRyAoUFNXX0NSKQotI2RlZmluZSBTRVRfUFNXKFZBTCkgU0VUX0NSRUcgKFBTV19DUiwgKFZBTCkpCi0jZGVmaW5lIFNFVF9IV19QU1coVkFMKSBTRVRfSFdfQ1JFRyAoUFNXX0NSLCAoVkFMKSkKLSNkZWZpbmUgU0VUX1BTV19CSVQoTUFTSyxWQUwpIG1vdmVfdG9fY3IgKFBTV19DUiwgfihNQVNLKSwgKFZBTCkgPyAoTUFTSykgOiAwLCAxKQotCi0jZGVmaW5lIFBTV19TTSAoKFBTVyAmIFBTV19TTV9CSVQpICE9IDApCi0jZGVmaW5lIFNFVF9QU1dfU00oVkFMKSBTRVRfUFNXX0JJVCAoUFNXX1NNX0JJVCwgKFZBTCkpCi0KLSNkZWZpbmUgUFNXX0VBICgoUFNXICYgUFNXX0VBX0JJVCkgIT0gMCkKLSNkZWZpbmUgU0VUX1BTV19FQShWQUwpIFNFVF9QU1dfQklUIChQU1dfRUFfQklULCAoVkFMKSkKLQotI2RlZmluZSBQU1dfREIgKChQU1cgJiBQU1dfREJfQklUKSAhPSAwKQotI2RlZmluZSBTRVRfUFNXX0RCKFZBTCkgU0VUX1BTV19CSVQgKFBTV19EQl9CSVQsIChWQUwpKQotCi0jZGVmaW5lIFBTV19ETSAoKFBTVyAmIFBTV19ETV9CSVQpICE9IDApCi0jZGVmaW5lIFNFVF9QU1dfRE0oVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0RNX0JJVCwgKFZBTCkpCi0KLSNkZWZpbmUgUFNXX0lFICgoUFNXICYgUFNXX0lFX0JJVCkgIT0gMCkKLSNkZWZpbmUgU0VUX1BTV19JRShWQUwpIFNFVF9QU1dfQklUIChQU1dfSUVfQklULCAoVkFMKSkKLQotI2RlZmluZSBQU1dfUlAgKChQU1cgJiBQU1dfUlBfQklUKSAhPSAwKQotI2RlZmluZSBTRVRfUFNXX1JQKFZBTCkgU0VUX1BTV19CSVQgKFBTV19SUF9CSVQsIChWQUwpKQotCi0jZGVmaW5lIFBTV19NRCAoKFBTVyAmIFBTV19NRF9CSVQpICE9IDApCi0jZGVmaW5lIFNFVF9QU1dfTUQoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX01EX0JJVCwgKFZBTCkpCi0KLSNkZWZpbmUgUFNXX0ZYICgoUFNXICYgUFNXX0ZYX0JJVCkgIT0gMCkKLSNkZWZpbmUgU0VUX1BTV19GWChWQUwpIFNFVF9QU1dfQklUIChQU1dfRlhfQklULCAoVkFMKSkKLQotI2RlZmluZSBQU1dfU1QgKChQU1cgJiBQU1dfU1RfQklUKSAhPSAwKQotI2RlZmluZSBTRVRfUFNXX1NUKFZBTCkgU0VUX1BTV19CSVQgKFBTV19TVF9CSVQsIChWQUwpKQotCi0jZGVmaW5lIFBTV19GMCAoKFBTVyAmIFBTV19GMF9CSVQpICE9IDApCi0jZGVmaW5lIFNFVF9QU1dfRjAoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0YwX0JJVCwgKFZBTCkpCi0KLSNkZWZpbmUgUFNXX0YxICgoUFNXICYgUFNXX0YxX0JJVCkgIT0gMCkKLSNkZWZpbmUgU0VUX1BTV19GMShWQUwpIFNFVF9QU1dfQklUIChQU1dfRjFfQklULCAoVkFMKSkKLQotI2RlZmluZSBQU1dfQyAoKFBTVyAmIFBTV19DX0JJVCkgIT0gMCkKLSNkZWZpbmUgU0VUX1BTV19DKFZBTCkgU0VUX1BTV19CSVQgKFBTV19DX0JJVCwgKFZBTCkpCi0KLS8qIFNlZSBzaW1vcHNjLjptb3ZlX3RvX2NyKCkgZm9yIHJlZ2lzdGVycyB0aGF0IGNhbiBub3QgYmUgcmVhZC1mcm9tCi0gICBvciBhc3NpZ25lZC10byBkaXJlY3RseSAqLwotCi0jZGVmaW5lIFBDCUNSRUcgKFBDX0NSKQotI2RlZmluZSBTRVRfUEMoVkFMKSBTRVRfQ1JFRyAoUENfQ1IsIChWQUwpKQotCi0jZGVmaW5lIEJQU1cJQ1JFRyAoQlBTV19DUikKLSNkZWZpbmUgU0VUX0JQU1coVkFMKSBTRVRfQ1JFRyAoQlBTV19DUiwgKFZBTCkpCi0KLSNkZWZpbmUgQlBDCUNSRUcgKEJQQ19DUikKLSNkZWZpbmUgU0VUX0JQQyhWQUwpIFNFVF9DUkVHIChCUENfQ1IsIChWQUwpKQotCi0jZGVmaW5lIERQU1cJQ1JFRyAoRFBTV19DUikKLSNkZWZpbmUgU0VUX0RQU1coVkFMKSBTRVRfQ1JFRyAoRFBTV19DUiwgKFZBTCkpCi0KLSNkZWZpbmUgRFBDCUNSRUcgKERQQ19DUikKLSNkZWZpbmUgU0VUX0RQQyhWQUwpIFNFVF9DUkVHIChEUENfQ1IsIChWQUwpKQotCi0jZGVmaW5lIFJQVF9DCUNSRUcgKFJQVF9DX0NSKQotI2RlZmluZSBTRVRfUlBUX0MoVkFMKSBTRVRfQ1JFRyAoUlBUX0NfQ1IsIChWQUwpKQotCi0jZGVmaW5lIFJQVF9TCUNSRUcgKFJQVF9TX0NSKQotI2RlZmluZSBTRVRfUlBUX1MoVkFMKSBTRVRfQ1JFRyAoUlBUX1NfQ1IsIChWQUwpKQotCi0jZGVmaW5lIFJQVF9FCUNSRUcgKFJQVF9FX0NSKQotI2RlZmluZSBTRVRfUlBUX0UoVkFMKSBTRVRfQ1JFRyAoUlBUX0VfQ1IsIChWQUwpKQotCi0jZGVmaW5lIE1PRF9TCUNSRUcgKE1PRF9TX0NSKQotI2RlZmluZSBTRVRfTU9EX1MoVkFMKSBTRVRfQ1JFRyAoTU9EX1NfQ1IsIChWQUwpKQotCi0jZGVmaW5lIE1PRF9FCUNSRUcgKE1PRF9FX0NSKQotI2RlZmluZSBTRVRfTU9EX0UoVkFMKSBTRVRfQ1JFRyAoTU9EX0VfQ1IsIChWQUwpKQotCi0jZGVmaW5lIElCQQlDUkVHIChJQkFfQ1IpCi0jZGVmaW5lIFNFVF9JQkEoVkFMKSBTRVRfQ1JFRyAoSUJBX0NSLCAoVkFMKSkKLQotCi0jZGVmaW5lIFNJR19EMTBWX1NUT1AJLTEKLSNkZWZpbmUgU0lHX0QxMFZfRVhJVAktMgotI2RlZmluZSBTSUdfRDEwVl9CVVMgICAgLTMKLQotI2RlZmluZSBTRVhUMyh4KQkoKCgoeCkmMHg3KV4ofjMpKSs0KQkKLQotLyogc2lnbi1leHRlbmQgYSA0LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDQoeCkJKCgoKHgpJjB4ZileKH43KSkrOCkJCi0KLS8qIHNpZ24tZXh0ZW5kIGFuIDgtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUOCh4KQkoKCgoeCkmMHhmZileKH4weDdmKSkrMHg4MCkKLQotLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkmMHhmZmZmKV4ofjB4N2ZmZikpKzB4ODAwMCkKLQotLyogc2lnbi1leHRlbmQgYSAzMi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQzMih4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwKSkKLQotLyogc2lnbiBleHRlbmQgYSA0MCBiaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ0MCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmKSleKH5TSUdORUQ2NCgweDdmZmZmZmZmZmYpKSkrU0lHTkVENjQoMHg4MDAwMDAwMDAwKSkKLQotLyogc2lnbiBleHRlbmQgYSA0NCBiaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ0NCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwMDAwKSkKLQotLyogc2lnbiBleHRlbmQgYSA1NiBiaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ1Nih4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwMDAwMDAwKSkKLQotLyogc2lnbiBleHRlbmQgYSA2MCBiaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ2MCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZmZmZmYpKV4oflNJR05FRDY0KDB4N2ZmZmZmZmZmZmZmZmZmKSkpK1NJR05FRDY0KDB4ODAwMDAwMDAwMDAwMDAwKSkKLQotI2RlZmluZSBNQVgzMglTSUdORUQ2NCgweDdmZmZmZmZmKQotI2RlZmluZSBNSU4zMglTSUdORUQ2NCgweGZmODAwMDAwMDApCi0jZGVmaW5lIE1BU0szMglTSUdORUQ2NCgweGZmZmZmZmZmKQotI2RlZmluZSBNQVNLNDAJU0lHTkVENjQoMHhmZmZmZmZmZmZmKQotCi0vKiBUaGUgYWxpZ25tZW50IG9mIE1PRF9FIGluIHRoZSBmb2xsb3dpbmcgbWFjcm8gZGVwZW5kcyB1cG9uICJpIgotICAgYWx3YXlzIGJlaW5nIGEgcG93ZXIgb2YgMi4gKi8KLSNkZWZpbmUgSU5DX0FERFIoeCxpKSBcCi1kbyBcCi0gIHsgXAotICAgIGludCB0ZXN0X2kgPSBpIDwgMCA/IGkgOiB+KChpKSAtIDEpOyBcCi0gICAgaWYgKFBTV19NRCAmJiBHUFIgKHgpID09IChNT0RfRSAmIHRlc3RfaSkpIFwKLSAgICAgIFNFVF9HUFIgKHgsIE1PRF9TKTsgXAotICAgIGVsc2UgXAotICAgICAgU0VUX0dQUiAoeCwgR1BSICh4KSArIChpKSk7IFwKLSAgfSBcCi13aGlsZSAoMCkKLQotZXh0ZXJuIHVpbnQ4ICpkbWVtX2FkZHIgKHVpbnQxNiBvZmZzZXQpOwotZXh0ZXJuIHVpbnQ4ICppbWVtX2FkZHIgUEFSQU1TICgodWludDMyKSk7Ci1leHRlcm4gYmZkX3ZtYSBkZWNvZGVfcGMgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lCVJCKHgpCSgqKGRtZW1fYWRkcih4KSkpCi0jZGVmaW5lIFNCKGFkZHIsZGF0YSkJKCBSQihhZGRyKSA9IChkYXRhICYgMHhmZikpCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykgJiYgIWRlZmluZWQoTk9fRU5ESUFOX0lOTElORSkKLSNkZWZpbmUgRU5ESUFOX0lOTElORSBzdGF0aWMgX19pbmxpbmVfXwotI2luY2x1ZGUgImVuZGlhbi5jIgotI3VuZGVmIEVORElBTl9JTkxJTkUKLQotI2Vsc2UKLWV4dGVybiB1aW50MzIgZ2V0X2xvbmd3b3JkIFBBUkFNUyAoKHVpbnQ4ICopKTsKLWV4dGVybiB1aW50MTYgZ2V0X3dvcmQgUEFSQU1TICgodWludDggKikpOwotZXh0ZXJuIGludDY0IGdldF9sb25nbG9uZyBQQVJBTVMgKCh1aW50OCAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV93b3JkIFBBUkFNUyAoKHVpbnQ4ICphZGRyLCB1aW50MTYgZGF0YSkpOwotZXh0ZXJuIHZvaWQgd3JpdGVfbG9uZ3dvcmQgUEFSQU1TICgodWludDggKmFkZHIsIHVpbnQzMiBkYXRhKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9sb25nbG9uZyBQQVJBTVMgKCh1aW50OCAqYWRkciwgaW50NjQgZGF0YSkpOwotI2VuZGlmCi0KLSNkZWZpbmUgU1coYWRkcixkYXRhKQkJd3JpdGVfd29yZChkbWVtX2FkZHIoYWRkciksZGF0YSkKLSNkZWZpbmUgUlcoeCkJCQlnZXRfd29yZChkbWVtX2FkZHIoeCkpCi0jZGVmaW5lIFNMVyhhZGRyLGRhdGEpICAJd3JpdGVfbG9uZ3dvcmQoZG1lbV9hZGRyKGFkZHIpLGRhdGEpCi0jZGVmaW5lIFJMVyh4KQkJCWdldF9sb25nd29yZChkbWVtX2FkZHIoeCkpCi0jZGVmaW5lIFJFQURfMTYoeCkJCWdldF93b3JkKHgpCi0jZGVmaW5lIFdSSVRFXzE2KGFkZHIsZGF0YSkJd3JpdGVfd29yZChhZGRyLGRhdGEpCi0jZGVmaW5lIFJFQURfNjQoeCkJCWdldF9sb25nbG9uZyh4KQotI2RlZmluZSBXUklURV82NChhZGRyLGRhdGEpCXdyaXRlX2xvbmdsb25nKGFkZHIsZGF0YSkKLQotI2RlZmluZSBKTVAoeCkJCQlkbyB7IFNFVF9QQyAoeCk7IFN0YXRlLnBjX2NoYW5nZWQgPSAxOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFJJRV9WRUNUT1JfU1RBUlQgMHhmZmMyCi0jZGVmaW5lIEFFX1ZFQ1RPUl9TVEFSVCAweGZmYzMKLSNkZWZpbmUgVFJBUF9WRUNUT1JfU1RBUlQgMHhmZmM0CS8qIHZlY3RvciBmb3IgdHJhcCAwICovCi0jZGVmaW5lIERCVF9WRUNUT1JfU1RBUlQgMHhmZmQ0Ci0jZGVmaW5lIFNEQlRfVkVDVE9SX1NUQVJUIDB4ZmZkNQotCi0vKiBTY2VkdWxlIGEgc3RvcmUgb2YgVkFMIGludG8gY3JbQ1JdLiAgTUFTSyBpbmRpY2F0ZXMgdGhlIGJpdHMgaW4KLSAgIGNyW0NSXSB0aGF0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgKGkuZS4gY3JbQ1JdID0gKGNyW0NSXSAmIE1BU0spIHwKLSAgIChWQUwgJiB+TUFTSykpLiAgSW4gYWRkaXRpb24sIHVubGVzcyBQU1dfSFdfUCwgYSBWQUwgaW50ZW5kZWQgZm9yCi0gICBQU1cgaXMgbWFza2VkIGZvciB6ZXJvIGJpdHMuICovCi0KLWV4dGVybiByZWdfdCBtb3ZlX3RvX2NyIChpbnQgY3IsIHJlZ190IG1hc2ssIHJlZ190IHZhbCwgaW50IHBzd19od19wKTsKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2VuZGlhbi5jIGIvc2ltL2QxMHYvZW5kaWFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjUwM2UuLjAwMDAwMDAKLS0tIGEvc2ltL2QxMHYvZW5kaWFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyogSWYgd2UncmUgYmVpbmcgY29tcGlsZWQgYXMgYSAuYyBmaWxlLCByYXRoZXIgdGhhbiBiZWluZyBpbmNsdWRlZCBpbgotICAgZDEwdl9zaW0uaCwgdGhlbiBFTkRJQU5fSU5MSU5FIHdvbid0IGJlIGRlZmluZWQgeWV0LiAgKi8KLQotI2lmbmRlZiBFTkRJQU5fSU5MSU5FCi0jZGVmaW5lIE5PX0VORElBTl9JTkxJTkUKLSNpbmNsdWRlICJkMTB2X3NpbS5oIgotI2RlZmluZSBFTkRJQU5fSU5MSU5FCi0jZW5kaWYKLQotRU5ESUFOX0lOTElORSB1aW50MTYKLWdldF93b3JkICh4KQotICAgICAgdWludDggKng7Ci17Ci0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotCi0gIHVuc2lnbmVkIHNob3J0IHdvcmQgPSAqKHVuc2lnbmVkIHNob3J0ICopeDsKLSAgX19hc21fXyAoInhjaGdiICViMCwlaDAiIDogIj1xIiAod29yZCkgOiAiMCIgKHdvcmQpKTsKLSAgcmV0dXJuIHdvcmQ7Ci0KLSNlbGlmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQotICAvKiBJdCBpcyBzYWZlIHRvIGRvIHRoaXMgb24gYmlnIGVuZGlhbiBob3N0cywgc2luY2UgdGhlIGQxMHYgcmVxdWlyZXMgdGhhdCB3b3JkcyBiZQotICAgICBhbGlnbmVkIG9uIDE2LWJpdCBib3VuZGFyaWVzLiAgKi8KLSAgcmV0dXJuICoodWludDE2ICopeDsKLQotI2Vsc2UKLSAgcmV0dXJuICgodWludDE2KXhbMF08PDgpICsgeFsxXTsKLSNlbmRpZgotfQotCi1FTkRJQU5fSU5MSU5FIHVpbnQzMgotZ2V0X2xvbmd3b3JkICh4KQotICAgICAgdWludDggKng7Ci17Ci0jaWYgKGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKFVTRV9CU1dBUCkKLQotICB1bnNpZ25lZCBpbnQgbG9uZ193b3JkID0gKih1bnNpZ25lZCAqKXg7Ci0gIF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChsb25nX3dvcmQpIDogIjAiIChsb25nX3dvcmQpKTsKLSAgcmV0dXJuIGxvbmdfd29yZDsKLQotI2VsaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotCi0gIHVuc2lnbmVkIGludCBsb25nX3dvcmQgPSAqKHVuc2lnbmVkICopeDsKLSAgX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCQkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCi0JICAicm9ybCAkMTYsJTBcblx0IgkJLyogc3dhcCB3b3JkcwkJKi8KLQkgICJ4Y2hnYiAlYjAsJWgwIgkJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KLQkgIDoiPXEiIChsb25nX3dvcmQpCi0JICA6ICIwIiAobG9uZ193b3JkKSk7Ci0KLSAgcmV0dXJuIGxvbmdfd29yZDsKLQotI2VsaWYgKGRlZmluZWQoX1BPV0VSKSAmJiBkZWZpbmVkKF9BSVgpKSB8fCAoZGVmaW5lZChfX1BQQ19fKSAmJiBkZWZpbmVkKF9fQklHX0VORElBTl9fKSkKLSAgLyogUG93ZXIgJiBQb3dlclBDIGNvbXB1dGVycyBpbiBiaWcgZW5kaWFuIG1vZGUgY2FuIGhhbmRsZSB1bmFsaWduZWQgbG9hZHMmc3RvcmVzICovCi0gIHJldHVybiAqKHVpbnQzMiAqKXg7Ci0KLSNlbGlmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQotICAvKiBsb25nIHdvcmRzIG11c3QgYmUgYWxpZ25lZCBvbiBhdCBsZWFzdCAxNi1iaXQgYm91bmRhcmllcywgc28gdGhpcyBzaG91bGQgYmUgc2FmZS4gICovCi0gIHJldHVybiAoKCh1aW50MzIpICoodWludDE2ICopeCk8PDE2KSB8ICgodWludDMyKSAqKHVpbnQxNiAqKSh4KzIpKTsKLQotI2Vsc2UKLSAgcmV0dXJuICgodWludDMyKXhbMF08PDI0KSArICgodWludDMyKXhbMV08PDE2KSArICgodWludDMyKXhbMl08PDgpICsgKCh1aW50MzIpeFszXSk7Ci0jZW5kaWYKLX0KLQotRU5ESUFOX0lOTElORSBpbnQ2NAotZ2V0X2xvbmdsb25nICh4KQotICAgICAgdWludDggKng7Ci17Ci0gIHVpbnQzMiB0b3AgPSBnZXRfbG9uZ3dvcmQgKHgpOwotICB1aW50MzIgYm90dG9tID0gZ2V0X2xvbmd3b3JkICh4KzQpOwotICByZXR1cm4gKCgoaW50NjQpdG9wKTw8MzIpIHwgKGludDY0KWJvdHRvbTsKLX0KLQotRU5ESUFOX0lOTElORSB2b2lkCi13cml0ZV93b3JkIChhZGRyLCBkYXRhKQotICAgICB1aW50OCAqYWRkcjsKLSAgICAgdWludDE2IGRhdGE7Ci17Ci0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotCi0gIF9fYXNtX18gKCJ4Y2hnYiAlYjAsJWgwIiA6ICI9cSIgKGRhdGEpIDogIjAiIChkYXRhKSk7Ci0gICoodWludDE2ICopYWRkciA9IGRhdGE7Ci0KLSNlbGlmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQotICAvKiBJdCBpcyBzYWZlIHRvIGRvIHRoaXMgb24gYmlnIGVuZGlhbiBob3N0cywgc2luY2UgdGhlIGQxMHYgcmVxdWlyZXMgdGhhdCB3b3JkcyBiZQotICAgICBhbGlnbmVkIG9uIDE2LWJpdCBib3VuZGFyaWVzLiAgKi8KLSAgKih1aW50MTYgKilhZGRyID0gZGF0YTsKLQotI2Vsc2UKLSAgYWRkclswXSA9IChkYXRhID4+IDgpICYgMHhmZjsKLSAgYWRkclsxXSA9IGRhdGEgJiAweGZmOwotI2VuZGlmCi19Ci0KLUVORElBTl9JTkxJTkUgdm9pZAotd3JpdGVfbG9uZ3dvcmQgKGFkZHIsIGRhdGEpCi0gICAgIHVpbnQ4ICphZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSNpZiAoZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoVVNFX0JTV0FQKQotCi0gIF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChkYXRhKSA6ICIwIiAoZGF0YSkpOwotICAqKHVpbnQzMiAqKWFkZHIgPSBkYXRhOwotCi0jZWxpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pCi0KLSAgX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCQkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCi0JICAicm9ybCAkMTYsJTBcblx0IgkJLyogc3dhcCB3b3JkcwkJKi8KLQkgICJ4Y2hnYiAlYjAsJWgwIgkJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KLQkgIDoiPXEiIChkYXRhKQotCSAgOiAiMCIgKGRhdGEpKTsKLQotICAqKHVpbnQzMiAqKWFkZHIgPSBkYXRhOwotCi0jZWxpZiAoZGVmaW5lZChfUE9XRVIpICYmIGRlZmluZWQoX0FJWCkpIHx8IChkZWZpbmVkKF9fUFBDX18pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pKQotICAvKiBQb3dlciAmIFBvd2VyUEMgY29tcHV0ZXJzIGluIGJpZyBlbmRpYW4gbW9kZSBjYW4gaGFuZGxlIHVuYWxpZ25lZCBsb2FkcyZzdG9yZXMgKi8KLSAgKih1aW50MzIgKilhZGRyID0gZGF0YTsKLQotI2VsaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCi0gICoodWludDE2ICopYWRkciA9ICh1aW50MTYpKGRhdGEgPj4gMTYpOwotICAqKHVpbnQxNiAqKShhZGRyICsgMikgPSAodWludDE2KWRhdGE7Ci0KLSNlbHNlCi0gIGFkZHJbMF0gPSAoZGF0YSA+PiAyNCkgJiAweGZmOwotICBhZGRyWzFdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKLSAgYWRkclsyXSA9IChkYXRhID4+IDgpICYgMHhmZjsKLSAgYWRkclszXSA9IGRhdGEgJiAweGZmOwotI2VuZGlmCi19Ci0KLUVORElBTl9JTkxJTkUgdm9pZAotd3JpdGVfbG9uZ2xvbmcgKGFkZHIsIGRhdGEpCi0gICAgIHVpbnQ4ICphZGRyOwotICAgICBpbnQ2NCBkYXRhOwotewotICB3cml0ZV9sb25nd29yZCAoYWRkciwgKHVpbnQzMikoZGF0YSA+PiAzMikpOwotICB3cml0ZV9sb25nd29yZCAoYWRkcis0LCAodWludDMyKWRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvZ2VuY29kZS5jIGIvc2ltL2QxMHYvZ2VuY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyNjliLi4wMDAwMDAwCi0tLSBhL3NpbS9kMTB2L2dlbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIgotCi1zdGF0aWMgdm9pZCB3cml0ZV9oZWFkZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgd3JpdGVfb3Bjb2RlcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV90ZW1wbGF0ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwiLWgiKSA9PSAwKSkKLSAgICB3cml0ZV9oZWFkZXIoKTsKLSAgZWxzZSBpZiAoKGFyZ2MgPiAxKSAmJiAoc3RyY21wIChhcmd2WzFdLCItdCIpID09IDApKQotICAgIHdyaXRlX3RlbXBsYXRlICgpOwotICBlbHNlCi0gICAgd3JpdGVfb3Bjb2RlcygpOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVfaGVhZGVyICgpCi17Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICBpZiAob3Bjb2RlLT5mb3JtYXQgIT0gT1BDT0RFX0ZBS0UpCi0gICAgICBwcmludGYoInZvaWQgT1BfJVggUEFSQU1TICgodm9pZCkpO1x0XHQvKiAlcyAqL1xuIixvcGNvZGUtPm9wY29kZSwgb3Bjb2RlLT5uYW1lKTsKLX0KLQotCi0vKiB3cml0ZV90ZW1wbGF0ZSBjcmVhdGVzIGEgZmlsZSBhbGwgcmVxdWlyZWQgZnVuY3Rpb25zLCByZWFkeSAqLwotLyogdG8gYmUgZmlsbGVkIG91dCAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfdGVtcGxhdGUgKCkKLXsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gIGludCBpLGo7Ci0KLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJkMTB2X3NpbS5oXCJcbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcbiIpOwotCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgIT0gT1BDT0RFX0ZBS0UpCi0JewotCSAgcHJpbnRmKCIvKiAlcyAqL1xudm9pZFxuT1BfJVggKClcbntcbiIsb3Bjb2RlLT5uYW1lLG9wY29kZS0+b3Bjb2RlKTsKLQkgIAotCSAgLyogY291bnQgb3BlcmFuZHMgKi8KLQkgIGogPSAwOwotCSAgZm9yIChpPTA7aTw2O2krKykKLQkgICAgewotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICAgICAgaWYgKChmbGFncyAmIE9QRVJBTkRfUkVHKSB8fCAoZmxhZ3MgJiBPUEVSQU5EX05VTSkgfHwgKGZsYWdzICYgT1BFUkFORF9BRERSKSkKLQkJaisrOwotCSAgICB9Ci0JICBzd2l0Y2ggKGopCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFxuXCIpO1xuIixvcGNvZGUtPm5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXhcXG5cIixPUFswXSk7XG4iLG9wY29kZS0+bmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXhcXG5cIixPUFswXSxPUFsxXSk7XG4iLG9wY29kZS0+bmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0sT1BbMl0pO1xuIixvcGNvZGUtPm5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwiVG9vIG1hbnkgb3BlcmFuZHM6ICVkXG4iLGopOwotCSAgICB9Ci0JICBwcmludGYgKCJ9XG5cbiIpOwotCX0KLSAgICB9Ci19Ci0KLQotbG9uZyBPcGNvZGVzWzUxMl07Ci1zdGF0aWMgaW50IGN1cm9wPTA7Ci0KLWNoZWNrX29wY29kZXMoIGxvbmcgb3ApCi17Ci0gIGludCBpOwotCi0gIGZvciAoaT0wO2k8Y3Vyb3A7aSsrKQotICAgIGlmIChPcGNvZGVzW2ldID09IG9wKQotICAgICAgZnByaW50ZihzdGRlcnIsIkRVUExJQ0FURSBPUENPREVTOiAleFxuIixvcCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX29wY29kZXMgKCkKLXsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gIGludCBpLCBqOwotICAKLSAgLyogd3JpdGUgb3V0IG9wY29kZSB0YWJsZSAqLwotICBwcmludGYgKCIjaW5jbHVkZSBcImQxMHZfc2ltLmhcIlxuIik7Ci0gIHByaW50ZiAoIiNpbmNsdWRlIFwic2ltb3BzLmhcIlxuXG4iKTsKLSAgcHJpbnRmICgic3RydWN0IHNpbW9wcyBTaW1vcHNbXSA9IHtcbiIpOwotICAKLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCAhPSBPUENPREVfRkFLRSkKLQl7Ci0JICBwcmludGYgKCIgIHsgJWxkLCVkLCVsZCwlZCwlZCwlZCwlZCxPUF8lWCwiLCBvcGNvZGUtPm9wY29kZSwgCi0JCSAgKG9wY29kZS0+Zm9ybWF0ICYgTE9OR19PUENPREUpID8gMSA6IDAsIG9wY29kZS0+bWFzaywgb3Bjb2RlLT5mb3JtYXQsIAotCQkgIG9wY29kZS0+Y3ljbGVzLCBvcGNvZGUtPnVuaXQsIG9wY29kZS0+ZXhlY190eXBlLCBvcGNvZGUtPm9wY29kZSk7Ci0gICAgICAKLQkgIC8qIFJFTU9WRSBNRSAqLwotCSAgY2hlY2tfb3Bjb2RlcyAob3Bjb2RlLT5vcGNvZGUpOwotCSAgT3Bjb2Rlc1tjdXJvcCsrXSA9IG9wY29kZS0+b3Bjb2RlOwotCi0JICBqID0gMDsKLQkgIGZvciAoaT0wO2k8NjtpKyspCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZ3MgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgICAgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1JFRykgfHwgKGZsYWdzICYgT1BFUkFORF9OVU0pIHx8IChmbGFncyAmIE9QRVJBTkRfQUREUikpCi0JCWorKzsKLQkgICAgfQotCSAgcHJpbnRmICgiJWQsIixqKTsKLQkgIAotCSAgaiA9IDA7Ci0JICBmb3IgKGk9MDtpPDY7aSsrKQotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgICAgICBpbnQgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLnNoaWZ0OwotCSAgICAgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1JFRykgfHwgKGZsYWdzICYgT1BFUkFORF9OVU0pfHwgKGZsYWdzICYgT1BFUkFORF9BRERSKSkKLQkJewotCQkgIGlmIChqID09IDApCi0JCSAgICBwcmludGYgKCJ7Iik7Ci0JCSAgZWxzZQotCQkgICAgcHJpbnRmICgiLCAiKTsKLQkJICBpZiAoKGZsYWdzICYgT1BFUkFORF9SRUcpICYmIChvcGNvZGUtPmZvcm1hdCA9PSBMT05HX0wpKQotCQkgICAgc2hpZnQgKz0gMTU7Ci0JCSAgcHJpbnRmICgiJWQsJWQsJWQiLHNoaWZ0LGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uYml0cyxmbGFncyk7Ci0JCSAgaiA9IDE7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGopCi0JICAgIHByaW50ZiAoIn0iKTsKLQkgIHByaW50ZiAoIn0sXG4iKTsKLQl9Ci0gICAgfQotICBwcmludGYgKCJ7IDAsMCwwLDAsMCwwLDAsKHZvaWQgKCopKHZvaWQpKTAsMCx7MCwwLDB9fSxcbn07XG4iKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2ludGVycC5jIGIvc2ltL2QxMHYvaW50ZXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NmRmMzEuLjAwMDAwMDAKLS0tIGEvc2ltL2QxMHYvaW50ZXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYwICswLDAgQEAKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotI2luY2x1ZGUgImQxMHZfc2ltLmgiCi0jaW5jbHVkZSAic2ltLWQxMHYuaCIKLQotZW51bSBfbGVmdHJpZ2h0IHsgTEVGVF9GSVJTVCwgUklHSFRfRklSU1QgfTsKLQotc3RhdGljIGNoYXIgKm15bmFtZTsKLXN0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOwotaW50IGQxMHZfZGVidWc7Ci0KLS8qIFNldCB0aGlzIHRvIHRydWUgdG8gZ2V0IHRoZSBwcmV2aW91cyBzZWdtZW50IGxheW91dC4gKi8KLQotaW50IG9sZF9zZWdtZW50X21hcHBpbmc7Ci0KLWhvc3RfY2FsbGJhY2sgKmQxMHZfY2FsbGJhY2s7Ci11bnNpZ25lZCBsb25nIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19NQVggXTsKLQotdWludDE2IE9QWzRdOwotCi1zdGF0aWMgaW50IGluaXRfdGV4dF9wID0gMDsKLS8qIG5vbi16ZXJvIGlmIHdlIG9wZW5lZCBwcm9nX2JmZCAqLwotc3RhdGljIGludCBwcm9nX2JmZF93YXNfb3BlbmVkX3A7Ci1iZmQgKnByb2dfYmZkOwotYXNlY3Rpb24gKnRleHQ7Ci1iZmRfdm1hIHRleHRfc3RhcnQ7Ci1iZmRfdm1hIHRleHRfZW5kOwotCi1zdGF0aWMgbG9uZyBoYXNoIFBBUkFNUyAoKGxvbmcgaW5zbiwgaW50IGZvcm1hdCkpOwotc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICpsb29rdXBfaGFzaCBQQVJBTVMgKCh1aW50MzIgaW5zLCBpbnQgc2l6ZSkpOwotc3RhdGljIHZvaWQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKHN0cnVjdCBzaW1vcHMgKnMsIHVpbnQzMiBpbnMpKTsKLXN0YXRpYyB2b2lkIGRvX2xvbmcgUEFSQU1TICgodWludDMyIGlucykpOwotc3RhdGljIHZvaWQgZG9fMl9zaG9ydCBQQVJBTVMgKCh1aW50MTYgaW5zMSwgdWludDE2IGluczIsIGVudW0gX2xlZnRyaWdodCBsZWZ0cmlnaHQpKTsKLXN0YXRpYyB2b2lkIGRvX3BhcmFsbGVsIFBBUkFNUyAoKHVpbnQxNiBpbnMxLCB1aW50MTYgaW5zMikpOwotc3RhdGljIGNoYXIgKmFkZF9jb21tYXMgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgc2l6ZW9mX2J1ZiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgc2ltX3NldF9wcm9maWxlIFBBUkFNUyAoKGludCBuKSk7Ci1leHRlcm4gdm9pZCBzaW1fc2V0X3Byb2ZpbGVfc2l6ZSBQQVJBTVMgKChpbnQgbikpOwotc3RhdGljIElOTElORSB1aW50OCAqbWFwX21lbW9yeSAodW5zaWduZWQgcGh5c19hZGRyKTsKLQotI2lmZGVmIE5FRURfVUlfTE9PUF9IT09LCi0vKiBIb3cgb2Z0ZW4gdG8gcnVuIHRoZSB1aV9sb29wIHVwZGF0ZSwgd2hlbiBpbiB1c2UgKi8KLSNkZWZpbmUgVUlfTE9PUF9QT0xMX0lOVEVSVkFMIDB4MTQwMDAKLQotLyogQ291bnRlciBmb3IgdGhlIHVpX2xvb3BfaG9vayB1cGRhdGUgKi8KLXN0YXRpYyBsb25nIHVpX2xvb3BfaG9va19jb3VudGVyID0gVUlfTE9PUF9QT0xMX0lOVEVSVkFMOwotCi0vKiBBY3R1YWwgaG9vayB0byBjYWxsIHRvIHJ1biB0aHJvdWdoIGdkYidzIGd1aSBldmVudCBsb29wICovCi1leHRlcm4gaW50ICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKLSNlbmRpZiAvKiBORUVEX1VJX0xPT1BfSE9PSyAqLwotCi0jaWZuZGVmIElOTElORQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9IQVNIICA2Mwotc3RydWN0IGhhc2hfZW50cnkKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKm5leHQ7Ci0gIHVpbnQzMiBvcGNvZGU7Ci0gIHVpbnQzMiBtYXNrOwotICBpbnQgc2l6ZTsKLSAgc3RydWN0IHNpbW9wcyAqb3BzOwotfTsKLQotc3RydWN0IGhhc2hfZW50cnkgaGFzaF90YWJsZVtNQVhfSEFTSCsxXTsKLQotSU5MSU5FIHN0YXRpYyBsb25nIAotaGFzaChpbnNuLCBmb3JtYXQpCi0gICAgIGxvbmcgaW5zbjsKLSAgICAgaW50IGZvcm1hdDsKLXsKLSAgaWYgKGZvcm1hdCAmIExPTkdfT1BDT0RFKQotICAgIHJldHVybiAoKGluc24gJiAweDNGMDAwMDAwKSA+PiAyNCk7Ci0gIGVsc2UKLSAgICByZXR1cm4oKGluc24gJiAweDdFMDApID4+IDkpOwotfQotCi1JTkxJTkUgc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICoKLWxvb2t1cF9oYXNoIChpbnMsIHNpemUpCi0gICAgIHVpbnQzMiBpbnM7Ci0gICAgIGludCBzaXplOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoc2l6ZSkKLSAgICBoID0gJmhhc2hfdGFibGVbKGlucyAmIDB4M0YwMDAwMDApID4+IDI0XTsKLSAgZWxzZQotICAgIGggPSAmaGFzaF90YWJsZVsoaW5zICYgMHg3RTAwKSA+PiA5XTsKLQotICB3aGlsZSAoKGlucyAmIGgtPm1hc2spICE9IGgtPm9wY29kZSB8fCBoLT5zaXplICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKGgtPm5leHQgPT0gTlVMTCkKLQl7Ci0JICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0JICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGggPSBoLT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIChoKTsKLX0KLQotSU5MSU5FIHN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZHMgKHN0cnVjdCBzaW1vcHMgKnMsIHVpbnQzMiBpbnMpCi17Ci0gIGludCBpLCBzaGlmdCwgYml0cywgZmxhZ3M7Ci0gIHVpbnQzMiBtYXNrOwotICBmb3IgKGk9MDsgaSA8IHMtPm51bW9wczsgaSsrKQotICAgIHsKLSAgICAgIHNoaWZ0ID0gcy0+b3BlcmFuZHNbMyppXTsKLSAgICAgIGJpdHMgPSBzLT5vcGVyYW5kc1szKmkrMV07Ci0gICAgICBmbGFncyA9IHMtPm9wZXJhbmRzWzMqaSsyXTsKLSAgICAgIG1hc2sgPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICAgICAgT1BbaV0gPSAoaW5zID4+IHNoaWZ0KSAmIG1hc2s7Ci0gICAgfQotICAvKiBGSVhNRTogZm9yIHRyYWNpbmcsIHVwZGF0ZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZWFjaAotICAgICBpbnN0cnVjdGlvbiBkZWNvZGUgY3ljbGUgKi8KLSAgU3RhdGUudHJhY2UucHN3ID0gUFNXOwotfQotCi1iZmRfdm1hCi1kZWNvZGVfcGMgKCkKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGlmICghaW5pdF90ZXh0X3AgJiYgcHJvZ19iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3RleHRfcCA9IDE7Ci0gICAgICBmb3IgKHMgPSBwcm9nX2JmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotCWlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChwcm9nX2JmZCwgcyksICIudGV4dCIpID09IDApCi0JICB7Ci0JICAgIHRleHQgPSBzOwotCSAgICB0ZXh0X3N0YXJ0ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAocHJvZ19iZmQsIHMpOwotCSAgICB0ZXh0X2VuZCA9IHRleHRfc3RhcnQgKyBiZmRfc2VjdGlvbl9zaXplIChwcm9nX2JmZCwgcyk7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLQotICByZXR1cm4gKFBDIDw8IDIpICsgdGV4dF9zdGFydDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2xvbmcgKGlucykKLSAgICAgdWludDMyIGluczsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmg7Ci0jaWZkZWYgREVCVUcKLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfSU5TVFJVQ1RJT04pICE9IDApCi0gICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiZG9fbG9uZyAweCV4XG4iLCBpbnMpOwotI2VuZGlmCi0gIGggPSBsb29rdXBfaGFzaCAoaW5zLCAxKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGdldF9vcGVyYW5kcyAoaC0+b3BzLCBpbnMpOwotICBTdGF0ZS5pbnNfdHlwZSA9IElOU19MT05HOwotICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7Ci0gIChoLT5vcHMtPmZ1bmMpKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb18yX3Nob3J0IChpbnMxLCBpbnMyLCBsZWZ0cmlnaHQpCi0gICAgIHVpbnQxNiBpbnMxLCBpbnMyOwotICAgICBlbnVtIF9sZWZ0cmlnaHQgbGVmdHJpZ2h0OwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKLSAgZW51bSBfaW5zX3R5cGUgZmlyc3QsIHNlY29uZDsKLQotI2lmZGVmIERFQlVHCi0gIGlmICgoZDEwdl9kZWJ1ZyAmIERFQlVHX0lOU1RSVUNUSU9OKSAhPSAwKQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgImRvXzJfc2hvcnQgMHgleCAoJXMpIC0+IDB4JXhcbiIsCi0JCQkJICAgICAgIGluczEsIChsZWZ0cmlnaHQpID8gImxlZnQiIDogInJpZ2h0IiwgaW5zMik7Ci0jZW5kaWYKLQotICBpZiAobGVmdHJpZ2h0ID09IExFRlRfRklSU1QpCi0gICAgewotICAgICAgZmlyc3QgPSBJTlNfTEVGVDsKLSAgICAgIHNlY29uZCA9IElOU19SSUdIVDsKLSAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUUklHSFQgXSsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gSU5TX1JJR0hUOwotICAgICAgc2Vjb25kID0gSU5TX0xFRlQ7Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRMRUZUIF0rKzsKLSAgICB9Ci0KLSAgLyogSXNzdWUgdGhlIGZpcnN0IGluc3RydWN0aW9uICovCi0gIGggPSBsb29rdXBfaGFzaCAoaW5zMSwgMCk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBnZXRfb3BlcmFuZHMgKGgtPm9wcywgaW5zMSk7Ci0gIFN0YXRlLmluc190eXBlID0gZmlyc3Q7Ci0gIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKLSAgKGgtPm9wcy0+ZnVuYykoKTsKLQotICAvKiBJc3N1ZSB0aGUgc2Vjb25kIGluc3RydWN0aW9uIChpZiB0aGUgUEMgaGFzbid0IGNoYW5nZWQpICovCi0gIGlmICghU3RhdGUucGNfY2hhbmdlZCAmJiAhU3RhdGUuZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIC8qIGZpbmlzaCBhbnkgZXhpc3RpbmcgaW5zdHJ1Y3Rpb25zICovCi0gICAgICBTTE9UX0ZMVVNIICgpOwotICAgICAgaCA9IGxvb2t1cF9oYXNoIChpbnMyLCAwKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgZ2V0X29wZXJhbmRzIChoLT5vcHMsIGluczIpOwotICAgICAgU3RhdGUuaW5zX3R5cGUgPSBzZWNvbmQ7Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ1lDTEVTIF0rKzsKLSAgICAgIChoLT5vcHMtPmZ1bmMpKCk7Ci0gICAgfQotICBlbHNlIGlmICghU3RhdGUuZXhjZXB0aW9uKQotICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DT05EX0pVTVAgXSsrOwotfQotCi1zdGF0aWMgdm9pZAotZG9fcGFyYWxsZWwgKGluczEsIGluczIpCi0gICAgIHVpbnQxNiBpbnMxLCBpbnMyOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDEsICpoMjsKLSNpZmRlZiBERUJVRwotICBpZiAoKGQxMHZfZGVidWcgJiBERUJVR19JTlNUUlVDVElPTikgIT0gMCkKLSAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJkb19wYXJhbGxlbCAweCV4IHx8IDB4JXhcbiIsIGluczEsIGluczIpOwotI2VuZGlmCi0gIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19QQVJBTExFTCBdKys7Ci0gIGgxID0gbG9va3VwX2hhc2ggKGluczEsIDApOwotICBpZiAoaDEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGgyID0gbG9va3VwX2hhc2ggKGluczIsIDApOwotICBpZiAoaDIgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGgxLT5vcHMtPmV4ZWNfdHlwZSA9PSBQQVJPTkxZKQotICAgIHsKLSAgICAgIGdldF9vcGVyYW5kcyAoaDEtPm9wcywgaW5zMSk7Ci0gICAgICBTdGF0ZS5pbnNfdHlwZSA9IElOU19MRUZUX0NPTkRfVEVTVDsKLSAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKLSAgICAgIChoMS0+b3BzLT5mdW5jKSgpOwotICAgICAgaWYgKFN0YXRlLmV4ZSkKLQl7Ci0JICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9UUlVFIF0rKzsKLQkgIGdldF9vcGVyYW5kcyAoaDItPm9wcywgaW5zMik7Ci0JICBTdGF0ZS5pbnNfdHlwZSA9IElOU19SSUdIVF9DT05EX0VYRTsKLQkgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKLQkgIChoMi0+b3BzLT5mdW5jKSgpOwotCX0KLSAgICAgIGVsc2UKLQlpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9GQUxTRSBdKys7Ci0gICAgfQotICBlbHNlIGlmIChoMi0+b3BzLT5leGVjX3R5cGUgPT0gUEFST05MWSkKLSAgICB7Ci0gICAgICBnZXRfb3BlcmFuZHMgKGgyLT5vcHMsIGluczIpOwotICAgICAgU3RhdGUuaW5zX3R5cGUgPSBJTlNfUklHSFRfQ09ORF9URVNUOwotICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOwotICAgICAgKGgyLT5vcHMtPmZ1bmMpKCk7Ci0gICAgICBpZiAoU3RhdGUuZXhlKQotCXsKLQkgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DT05EX1RSVUUgXSsrOwotCSAgZ2V0X29wZXJhbmRzIChoMS0+b3BzLCBpbnMxKTsKLQkgIFN0YXRlLmluc190eXBlID0gSU5TX0xFRlRfQ09ORF9FWEU7Ci0JICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7Ci0JICAoaDEtPm9wcy0+ZnVuYykoKTsKLQl9Ci0gICAgICBlbHNlCi0JaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NPTkRfRkFMU0UgXSsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdldF9vcGVyYW5kcyAoaDEtPm9wcywgaW5zMSk7Ci0gICAgICBTdGF0ZS5pbnNfdHlwZSA9IElOU19MRUZUX1BBUkFMTEVMOwotICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOwotICAgICAgKGgxLT5vcHMtPmZ1bmMpKCk7Ci0gICAgICBpZiAoIVN0YXRlLmV4Y2VwdGlvbikKLQl7Ci0JICBnZXRfb3BlcmFuZHMgKGgyLT5vcHMsIGluczIpOwotCSAgU3RhdGUuaW5zX3R5cGUgPSBJTlNfUklHSFRfUEFSQUxMRUw7Ci0JICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7Ci0JICAoaDItPm9wcy0+ZnVuYykoKTsKLQl9Ci0gICAgfQotfQotIAotc3RhdGljIGNoYXIgKgotYWRkX2NvbW1hcyhidWYsIHNpemVvZl9idWYsIHZhbHVlKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBzaXplb2ZfYnVmOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotICBpbnQgY29tbWEgPSAzOwotICBjaGFyICplbmRidWYgPSBidWYgKyBzaXplb2ZfYnVmIC0gMTsKLQotICAqLS1lbmRidWYgPSAnXDAnOwotICBkbyB7Ci0gICAgaWYgKGNvbW1hLS0gPT0gMCkKLSAgICAgIHsKLQkqLS1lbmRidWYgPSAnLCc7Ci0JY29tbWEgPSAyOwotICAgICAgfQotCi0gICAgKi0tZW5kYnVmID0gKHZhbHVlICUgMTApICsgJzAnOwotICB9IHdoaWxlICgodmFsdWUgLz0gMTApICE9IDApOwotCi0gIHJldHVybiBlbmRidWY7Ci19Ci0KLXZvaWQKLXNpbV9zaXplIChwb3dlcikKLSAgICAgaW50IHBvd2VyOwotCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgSU1FTV9TRUdNRU5UUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChTdGF0ZS5tZW0uaW5zbltpXSkKLQlmcmVlIChTdGF0ZS5tZW0uaW5zbltpXSk7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgRE1FTV9TRUdNRU5UUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChTdGF0ZS5tZW0uZGF0YVtpXSkKLQlmcmVlIChTdGF0ZS5tZW0uZGF0YVtpXSk7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgVU1FTV9TRUdNRU5UUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChTdGF0ZS5tZW0udW5pZltpXSkKLQlmcmVlIChTdGF0ZS5tZW0udW5pZltpXSk7Ci0gICAgfQotICAvKiBBbHdheXMgYWxsb2NhdGUgZG1lbSBzZWdtZW50IDAuICBUaGlzIGNvbnRhaW5zIHRoZSBJTUFQIGFuZCBETUFQCi0gICAgIHJlZ2lzdGVycy4gKi8KLSAgU3RhdGUubWVtLmRhdGFbMF0gPSBjYWxsb2MgKDEsIFNFR01FTlRfU0laRSk7Ci19Ci0KLS8qIEZvciB0cmFjaW5nIC0gbGVhdmUgaW5mbyBvbiBsYXN0IGFjY2VzcyBhcm91bmQuICovCi1zdGF0aWMgY2hhciAqbGFzdF9zZWduYW1lID0gImludmFsaWQiOwotc3RhdGljIGNoYXIgKmxhc3RfZnJvbSA9ICJpbnZhbGlkIjsKLXN0YXRpYyBjaGFyICpsYXN0X3RvID0gImludmFsaWQiOwotCi1lbnVtCi0gIHsKLSAgICBJTUFQMF9PRkZTRVQgPSAweGZmMDAsCi0gICAgRE1BUDBfT0ZGU0VUID0gMHhmZjA4LAotICAgIERNQVAyX1NIQURET1cgPSAweGZmMDQsCi0gICAgRE1BUDJfT0ZGU0VUID0gMHhmZjBjCi0gIH07Ci0KLXN0YXRpYyB2b2lkCi1zZXRfZG1hcF9yZWdpc3RlciAoaW50IHJlZ19uciwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgdWludDggKnJhdyA9IG1hcF9tZW1vcnkgKFNJTV9EMTBWX01FTU9SWV9EQVRBCi0JCQkgICArIERNQVAwX09GRlNFVCArIDIgKiByZWdfbnIpOwotICBXUklURV8xNiAocmF3LCB2YWx1ZSk7Ci0jaWZkZWYgREVCVUcKLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTUVNT1JZKSkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkKLQkoZDEwdl9jYWxsYmFjaywgIm1lbTogZG1hcCVkPTB4JTA0bHhcbiIsIHJlZ19uciwgdmFsdWUpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZG1hcF9yZWdpc3RlciAoaW50IHJlZ19ucikKLXsKLSAgdWludDggKnJhdyA9IG1hcF9tZW1vcnkgKFNJTV9EMTBWX01FTU9SWV9EQVRBCi0JCQkgICArIERNQVAwX09GRlNFVCArIDIgKiByZWdfbnIpOwotICByZXR1cm4gUkVBRF8xNiAocmF3KTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pbWFwX3JlZ2lzdGVyIChpbnQgcmVnX25yLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotICB1aW50OCAqcmF3ID0gbWFwX21lbW9yeSAoU0lNX0QxMFZfTUVNT1JZX0RBVEEKLQkJCSAgICsgSU1BUDBfT0ZGU0VUICsgMiAqIHJlZ19ucik7Ci0gIFdSSVRFXzE2IChyYXcsIHZhbHVlKTsKLSNpZmRlZiBERUJVRwotICBpZiAoKGQxMHZfZGVidWcgJiBERUJVR19NRU1PUlkpKQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKQotCShkMTB2X2NhbGxiYWNrLCAibWVtOiBpbWFwJWQ9MHglMDRseFxuIiwgcmVnX25yLCB2YWx1ZSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbWFwX3JlZ2lzdGVyIChpbnQgcmVnX25yKQotewotICB1aW50OCAqcmF3ID0gbWFwX21lbW9yeSAoU0lNX0QxMFZfTUVNT1JZX0RBVEEKLQkJCSAgICsgSU1BUDBfT0ZGU0VUICsgMiAqIHJlZ19ucik7Ci0gIHJldHVybiBSRUFEXzE2IChyYXcpOwotfQotCi1lbnVtCi0gIHsKLSAgICBIRUxEX1NQSV9JRFggPSAwLAotICAgIEhFTERfU1BVX0lEWCA9IDEKLSAgfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNwdV9yZWdpc3RlciAodm9pZCkKLXsKLSAgaWYgKFBTV19TTSkKLSAgICByZXR1cm4gR1BSIChTUF9JRFgpOwotICBlbHNlCi0gICAgcmV0dXJuIEhFTERfU1AgKEhFTERfU1BVX0lEWCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zcGlfcmVnaXN0ZXIgKHZvaWQpCi17Ci0gIGlmICghUFNXX1NNKQotICAgIHJldHVybiBHUFIgKFNQX0lEWCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gSEVMRF9TUCAoSEVMRF9TUElfSURYKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9zcGlfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0gIGlmICghUFNXX1NNKQotICAgIFNFVF9HUFIgKFNQX0lEWCwgdmFsdWUpOwotICBTRVRfSEVMRF9TUCAoSEVMRF9TUElfSURYLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc3B1X3JlZ2lzdGVyICAodW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgaWYgKFBTV19TTSkKLSAgICBTRVRfR1BSIChTUF9JRFgsIHZhbHVlKTsKLSAgU0VUX0hFTERfU1AgKEhFTERfU1BVX0lEWCwgdmFsdWUpOwotfQotCi0vKiBHaXZlbiBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgRE1BUCBhZGRyZXNzIHNwYWNlLCB0cmFuc2xhdGUgaXQKLSAgIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzLiAqLwotCi11bnNpZ25lZCBsb25nCi1zaW1fZDEwdl90cmFuc2xhdGVfZG1hcF9hZGRyICh1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCSAgICAgIGludCBucl9ieXRlcywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICgqZG1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpKQotewotICBzaG9ydCBtYXA7Ci0gIGludCByZWdubzsKLSAgbGFzdF9mcm9tID0gImxvZ2ljYWwtZGF0YSI7Ci0gIGlmIChvZmZzZXQgPj0gRE1BUF9CTE9DS19TSVpFICogU0lNX0QxMFZfTlJfRE1BUF9SRUdTKQotICAgIHsKLSAgICAgIC8qIExvZ2ljYWwgYWRkcmVzcyBvdXQgc2lkZSBvZiBkYXRhIHNlZ21lbnRzLCBub3Qgc3VwcG9ydGVkICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJlZ25vID0gKG9mZnNldCAvIERNQVBfQkxPQ0tfU0laRSk7Ci0gIG9mZnNldCA9IChvZmZzZXQgJSBETUFQX0JMT0NLX1NJWkUpOwotICBpZiAoKG9mZnNldCAlIERNQVBfQkxPQ0tfU0laRSkgKyBucl9ieXRlcyA+IERNQVBfQkxPQ0tfU0laRSkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBjcm9zcyBhIEJMT0NLIGJvdW5kYXJ5ICovCi0gICAgICBucl9ieXRlcyA9IERNQVBfQkxPQ0tfU0laRSAtIChvZmZzZXQgJSBETUFQX0JMT0NLX1NJWkUpOwotICAgIH0KLSAgbWFwID0gZG1hcF9yZWdpc3RlciAocmVnbm8pOwotICBpZiAocmVnbm8gPT0gMykKLSAgICB7Ci0gICAgICAvKiBBbHdheXMgbWFwcyB0byBkYXRhIG1lbW9yeSAqLwotICAgICAgaW50IGlvc3BpID0gKG9mZnNldCAvIDB4MTAwMCkgJSA0OwotICAgICAgaW50IGlvc3AgPSAobWFwID4+ICg0ICogKDMgLSBpb3NwaSkpKSAlIDB4MTA7Ci0gICAgICBsYXN0X3RvID0gImlvLXNwYWNlIjsKLSAgICAgICpwaHlzID0gKFNJTV9EMTBWX01FTU9SWV9EQVRBICsgKGlvc3AgKiAweDEwMDAwKSArIDB4YzAwMCArIG9mZnNldCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHNwID0gKChtYXAgJiAweDMwMDApID4+IDEyKTsKLSAgICAgIGludCBzZWdubyA9IChtYXAgJiAweDNmZik7Ci0gICAgICBzd2l0Y2ggKHNwKQotCXsKLQljYXNlIDA6IC8qIDAwOiBVbmlmaWVkIG1lbW9yeSAqLwotCSAgKnBoeXMgPSBTSU1fRDEwVl9NRU1PUllfVU5JRklFRCArIChzZWdubyAqIERNQVBfQkxPQ0tfU0laRSkgKyBvZmZzZXQ7Ci0JICBsYXN0X3RvID0gInVuaWZpZWQiOwotCSAgYnJlYWs7Ci0JY2FzZSAxOiAvKiAwMTogSW5zdHJ1Y3Rpb24gTWVtb3J5ICovCi0JICAqcGh5cyA9IFNJTV9EMTBWX01FTU9SWV9JTlNOICsgKHNlZ25vICogRE1BUF9CTE9DS19TSVpFKSArIG9mZnNldDsKLQkgIGxhc3RfdG8gPSAiY2hpcC1pbnNuIjsKLQkgIGJyZWFrOwotCWNhc2UgMjogLyogMTA6IEludGVybmFsIGRhdGEgbWVtb3J5ICovCi0JICAqcGh5cyA9IFNJTV9EMTBWX01FTU9SWV9EQVRBICsgKHNlZ25vIDw8IDE2KSArIChyZWdubyAqIERNQVBfQkxPQ0tfU0laRSkgKyBvZmZzZXQ7Ci0JICBsYXN0X3RvID0gImNoaXAtZGF0YSI7Ci0JICBicmVhazsKLQljYXNlIDM6IC8qIDExOiBSZXNlcnZlZCAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfQotCi0vKiBHaXZlbiBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgSU1BUCBhZGRyZXNzIHNwYWNlLCB0cmFuc2xhdGUgaXQKLSAgIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzLiAqLwotCi11bnNpZ25lZCBsb25nCi1zaW1fZDEwdl90cmFuc2xhdGVfaW1hcF9hZGRyICh1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCSAgICAgIGludCBucl9ieXRlcywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICgqaW1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpKQotewotICBzaG9ydCBtYXA7Ci0gIGludCByZWdubzsKLSAgaW50IHNwOwotICBpbnQgc2Vnbm87Ci0gIGxhc3RfZnJvbSA9ICJsb2dpY2FsLWluc24iOwotICBpZiAob2Zmc2V0ID49IChJTUFQX0JMT0NLX1NJWkUgKiBTSU1fRDEwVl9OUl9JTUFQX1JFR1MpKQotICAgIHsKLSAgICAgIC8qIExvZ2ljYWwgYWRkcmVzcyBvdXRzaWRlIG9mIElNQVAgc2VnbWVudHMsIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmVnbm8gPSAob2Zmc2V0IC8gSU1BUF9CTE9DS19TSVpFKTsKLSAgb2Zmc2V0ID0gKG9mZnNldCAlIElNQVBfQkxPQ0tfU0laRSk7Ci0gIGlmIChvZmZzZXQgKyBucl9ieXRlcyA+IElNQVBfQkxPQ0tfU0laRSkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBjcm9zcyBhIEJMT0NLIGJvdW5kYXJ5ICovCi0gICAgICBucl9ieXRlcyA9IElNQVBfQkxPQ0tfU0laRSAtIG9mZnNldDsKLSAgICB9Ci0gIG1hcCA9IGltYXBfcmVnaXN0ZXIgKHJlZ25vKTsKLSAgc3AgPSAobWFwICYgMHgzMDAwKSA+PiAxMjsKLSAgc2Vnbm8gPSAobWFwICYgMHgwMDdmKTsKLSAgc3dpdGNoIChzcCkKLSAgICB7Ci0gICAgY2FzZSAwOiAvKiAwMDogdW5pZmllZCBtZW1vcnkgKi8KLSAgICAgICpwaHlzID0gU0lNX0QxMFZfTUVNT1JZX1VOSUZJRUQgKyAoc2Vnbm8gPDwgMTcpICsgb2Zmc2V0OwotICAgICAgbGFzdF90byA9ICJ1bmlmaWVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogLyogMDE6IGluc3RydWN0aW9uIG1lbW9yeSAqLwotICAgICAgKnBoeXMgPSBTSU1fRDEwVl9NRU1PUllfSU5TTiArIChJTUFQX0JMT0NLX1NJWkUgKiByZWdubykgKyBvZmZzZXQ7Ci0gICAgICBsYXN0X3RvID0gImNoaXAtaW5zbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6IC8qMTAqLwotICAgICAgLyogUmVzZXJ2ZWQuICovCi0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIDM6IC8qIDExOiBmb3IgdGVzdGluZyAgLSBpbnN0cnVjdGlvbiBtZW1vcnkgKi8KLSAgICAgIG9mZnNldCA9IChvZmZzZXQgJSAweDgwMCk7Ci0gICAgICAqcGh5cyA9IFNJTV9EMTBWX01FTU9SWV9JTlNOICsgb2Zmc2V0OwotICAgICAgaWYgKG9mZnNldCArIG5yX2J5dGVzID4gMHg4MDApCi0JLyogZG9uJ3QgY3Jvc3MgVk0gYm91bmRhcnkgKi8KLQlucl9ieXRlcyA9IDB4ODAwIC0gb2Zmc2V0OwotICAgICAgbGFzdF90byA9ICJ0ZXN0LWluc24iOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXNpbV9kMTB2X3RyYW5zbGF0ZV9hZGRyICh1bnNpZ25lZCBsb25nIG1lbWFkZHIsCi0JCQkgaW50IG5yX2J5dGVzLAotCQkJIHVuc2lnbmVkIGxvbmcgKnRhcmdfYWRkciwKLQkJCSB1bnNpZ25lZCBsb25nICgqZG1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpLAotCQkJIHVuc2lnbmVkIGxvbmcgKCppbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcGh5czsKLSAgdW5zaWduZWQgbG9uZyBzZWc7Ci0gIHVuc2lnbmVkIGxvbmcgb2ZmOwotCi0gIGxhc3RfZnJvbSA9ICJ1bmtub3duIjsKLSAgbGFzdF90byA9ICJ1bmtub3duIjsKLQotICBzZWcgPSAobWVtYWRkciA+PiAyNCk7Ci0gIG9mZiA9IChtZW1hZGRyICYgMHhmZmZmZmZMKTsKLQotICAvKiBIb3dldmVyLCBpZiB3ZSd2ZSBhc2tlZCB0byB1c2UgdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gb2Ygc2VnbWVudAotICAgICBtYXBwaW5nLCByZWFycmFuZ2UgdGhlIHNlZ21lbnRzIGFzIGZvbGxvd3MuICovCi0KLSAgaWYgKG9sZF9zZWdtZW50X21hcHBpbmcpCi0gICAgewotICAgICAgc3dpdGNoIChzZWcpCi0JewotCWNhc2UgMHgwMDogLyogRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSAqLwotCSAgc2VnID0gMHgxMDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMTogLyogSU1BUCB0cmFuc2xhdGVkIG1lbW9yeSAqLwotCSAgc2VnID0gMHgxMTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMDogLyogT24tY2hpcCBkYXRhIG1lbW9yeSAqLwotCSAgc2VnID0gMHgwMjsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMTogLyogT24tY2hpcCBpbnNuIG1lbW9yeSAqLwotCSAgc2VnID0gMHgwMTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMjogLyogVW5pZmllZCBtZW1vcnkgKi8KLQkgIHNlZyA9IDB4MDA7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoc2VnKQotICAgIHsKLSAgICBjYXNlIDB4MDA6CQkJLyogUGh5c2ljYWwgdW5pZmllZCBtZW1vcnkgKi8KLSAgICAgIGxhc3RfZnJvbSA9ICJwaHlzLXVuaWZpZWQiOwotICAgICAgbGFzdF90byA9ICJ1bmlmaWVkIjsKLSAgICAgIHBoeXMgPSBTSU1fRDEwVl9NRU1PUllfVU5JRklFRCArIG9mZjsKLSAgICAgIGlmICgob2ZmICUgU0VHTUVOVF9TSVpFKSArIG5yX2J5dGVzID4gU0VHTUVOVF9TSVpFKQotCW5yX2J5dGVzID0gU0VHTUVOVF9TSVpFIC0gKG9mZiAlIFNFR01FTlRfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwMToJCQkvKiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgKi8KLSAgICAgIGxhc3RfZnJvbSA9ICJwaHlzLWluc24iOwotICAgICAgbGFzdF90byA9ICJjaGlwLWluc24iOwotICAgICAgcGh5cyA9IFNJTV9EMTBWX01FTU9SWV9JTlNOICsgb2ZmOwotICAgICAgaWYgKChvZmYgJSBTRUdNRU5UX1NJWkUpICsgbnJfYnl0ZXMgPiBTRUdNRU5UX1NJWkUpCi0JbnJfYnl0ZXMgPSBTRUdNRU5UX1NJWkUgLSAob2ZmICUgU0VHTUVOVF9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDAyOgkJCS8qIFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgKi8KLSAgICAgIGxhc3RfZnJvbSA9ICJwaHlzLWRhdGEiOwotICAgICAgbGFzdF90byA9ICJjaGlwLWRhdGEiOwotICAgICAgcGh5cyA9IFNJTV9EMTBWX01FTU9SWV9EQVRBICsgb2ZmOwotICAgICAgaWYgKChvZmYgJSBTRUdNRU5UX1NJWkUpICsgbnJfYnl0ZXMgPiBTRUdNRU5UX1NJWkUpCi0JbnJfYnl0ZXMgPSBTRUdNRU5UX1NJWkUgLSAob2ZmICUgU0VHTUVOVF9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDEwOgkJCS8qIGluIGxvZ2ljYWwgZGF0YSBhZGRyZXNzIHNlZ21lbnQgKi8KLSAgICAgIG5yX2J5dGVzID0gc2ltX2QxMHZfdHJhbnNsYXRlX2RtYXBfYWRkciAob2ZmLCBucl9ieXRlcywgJnBoeXMsCi0JCQkJCSAgICAgICBkbWFwX3JlZ2lzdGVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDExOgkJCS8qIGluIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50ICovCi0gICAgICBucl9ieXRlcyA9IHNpbV9kMTB2X3RyYW5zbGF0ZV9pbWFwX2FkZHIgKG9mZiwgbnJfYnl0ZXMsICZwaHlzLAotCQkJCQkgICAgICAgaW1hcF9yZWdpc3Rlcik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKnRhcmdfYWRkciA9IHBoeXM7Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciBpbnRvIHRoZSByYXcgYnVmZmVyIGRlc2lnbmF0ZWQgYnkgcGh5c19hZGRyLiAgSXQKLSAgIGlzIGFzc3VtZWQgdGhhdCB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGVuc3VyZWQgdGhhdCB0aGUgYWNjZXNzCi0gICBpc24ndCBnb2luZyB0byBjcm9zcyBhIHNlZ21lbnQgYm91bmRhcnkuICovCi0KLXVpbnQ4ICoKLW1hcF9tZW1vcnkgKHVuc2lnbmVkIHBoeXNfYWRkcikKLXsKLSAgdWludDggKiptZW1vcnk7Ci0gIHVpbnQ4ICpyYXc7Ci0gIHVuc2lnbmVkIG9mZnNldDsKLSAgaW50IHNlZ21lbnQgPSAoKHBoeXNfYWRkciA+PiAyNCkgJiAweGZmKTsKLSAgCi0gIHN3aXRjaCAoc2VnbWVudCkKLSAgICB7Ci0gICAgICAKLSAgICBjYXNlIDB4MDA6IC8qIFVuaWZpZWQgbWVtb3J5ICovCi0gICAgICB7Ci0JbWVtb3J5ID0gJlN0YXRlLm1lbS51bmlmWyhwaHlzX2FkZHIgLyBTRUdNRU5UX1NJWkUpICUgVU1FTV9TRUdNRU5UU107Ci0JbGFzdF9zZWduYW1lID0gInVtZW0iOwotCWJyZWFrOwotICAgICAgfQotICAgIAotICAgIGNhc2UgMHgwMTogLyogT24tY2hpcCBpbnNuIG1lbW9yeSAqLwotICAgICAgewotCW1lbW9yeSA9ICZTdGF0ZS5tZW0uaW5zblsocGh5c19hZGRyIC8gU0VHTUVOVF9TSVpFKSAlIElNRU1fU0VHTUVOVFNdOwotCWxhc3Rfc2VnbmFtZSA9ICJpbWVtIjsKLQlicmVhazsKLSAgICAgIH0KLSAgICAKLSAgICBjYXNlIDB4MDI6IC8qIE9uLWNoaXAgZGF0YSBtZW1vcnkgKi8KLSAgICAgIHsKLQlpZiAoKHBoeXNfYWRkciAmIDB4ZmYwMCkgPT0gMHhmZjAwKQotCSAgewotCSAgICBwaHlzX2FkZHIgPSAocGh5c19hZGRyICYgMHhmZmZmKTsKLQkgICAgaWYgKHBoeXNfYWRkciA9PSBETUFQMl9TSEFERE9XKQotCSAgICAgIHsKLQkJcGh5c19hZGRyID0gRE1BUDJfT0ZGU0VUOwotCQlsYXN0X3NlZ25hbWUgPSAiZG1hcCI7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgbGFzdF9zZWduYW1lID0gInJlZyI7Ci0JICB9Ci0JZWxzZQotCSAgbGFzdF9zZWduYW1lID0gImRtZW0iOwotCW1lbW9yeSA9ICZTdGF0ZS5tZW0uZGF0YVsocGh5c19hZGRyIC8gU0VHTUVOVF9TSVpFKSAlIERNRU1fU0VHTUVOVFNdOwotCWJyZWFrOwotICAgICAgfQotICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBPT1BTISAqLwotICAgICAgbGFzdF9zZWduYW1lID0gInNjcmFwIjsKLSAgICAgIHJldHVybiBTdGF0ZS5tZW0uZmF1bHQ7Ci0gICAgfQotICAKLSAgaWYgKCptZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbWVtb3J5ID0gY2FsbG9jICgxLCBTRUdNRU5UX1NJWkUpOwotICAgICAgaWYgKCptZW1vcnkgPT0gTlVMTCkKLQl7Ci0JICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJNYWxsb2MgZmFpbGVkLlxuIik7Ci0JICByZXR1cm4gU3RhdGUubWVtLmZhdWx0OwotCX0KLSAgICB9Ci0gIAotICBvZmZzZXQgPSAocGh5c19hZGRyICUgU0VHTUVOVF9TSVpFKTsKLSAgcmF3ID0gKm1lbW9yeSArIG9mZnNldDsKLSAgcmV0dXJuIHJhdzsKLX0KLSAgCi0vKiBUcmFuc2ZlciBkYXRhIHRvL2Zyb20gc2ltdWxhdGVkIG1lbW9yeS4gIFNpbmNlIGEgYnVnIGluIGVpdGhlciB0aGUKLSAgIHNpbXVsYXRlZCBwcm9ncmFtIG9yIGluIGdkYiBvciB0aGUgc2ltdWxhdG9yIGl0c2VsZiBtYXkgY2F1c2UgYQotICAgYm9ndXMgYWRkcmVzcyB0byBiZSBwYXNzZWQgaW4sIHdlIG5lZWQgdG8gZG8gc29tZSBzYW5pdHkgY2hlY2tpbmcKLSAgIG9uIGFkZHJlc3NlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgd2l0aGluIGJvdW5kcy4gIFdoZW4gYW4gYWRkcmVzcwotICAgZmFpbHMgdGhlIGJvdW5kcyBjaGVjaywgdHJlYXQgaXQgYXMgYSB6ZXJvIGxlbmd0aCByZWFkL3dyaXRlIHJhdGhlcgotICAgdGhhbiBhYm9ydGluZyB0aGUgZW50aXJlIHJ1bi4gKi8KLQotc3RhdGljIGludAoteGZlcl9tZW0gKFNJTV9BRERSIHZpcnQsCi0JICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCi0JICBpbnQgc2l6ZSwKLQkgIGludCB3cml0ZV9wKQotewotICBpbnQgeGZlcmVkID0gMDsKLQotICB3aGlsZSAoeGZlcmVkIDwgc2l6ZSkKLSAgICB7Ci0gICAgICB1aW50OCAqbWVtb3J5OwotICAgICAgdW5zaWduZWQgbG9uZyBwaHlzOwotICAgICAgaW50IHBoeXNfc2l6ZTsKLSAgICAgIHBoeXNfc2l6ZSA9IHNpbV9kMTB2X3RyYW5zbGF0ZV9hZGRyICh2aXJ0LCBzaXplLAotCQkJCQkgICAmcGh5cywKLQkJCQkJICAgZG1hcF9yZWdpc3RlciwKLQkJCQkJICAgaW1hcF9yZWdpc3Rlcik7Ci0gICAgICBpZiAocGh5c19zaXplID09IDApCi0JcmV0dXJuIHhmZXJlZDsKLQotICAgICAgbWVtb3J5ID0gbWFwX21lbW9yeSAocGh5cyk7Ci0KLSNpZmRlZiBERUJVRwotICAgICAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfSU5TVFJVQ1RJT04pICE9IDApCi0JewotCSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpCi0JICAgIChkMTB2X2NhbGxiYWNrLAotCSAgICAgInNpbV8lcyAlZCBieXRlczogMHglMDhseCAoJXMpIC0+IDB4JTA4bHggKCVzKSAtPiAweCUwOGx4ICglcylcbiIsCi0JICAgICAod3JpdGVfcCA/ICJ3cml0ZSIgOiAicmVhZCIpLAotCSAgICAgcGh5c19zaXplLCB2aXJ0LCBsYXN0X2Zyb20sCi0JICAgICBwaHlzLCBsYXN0X3RvLAotCSAgICAgKGxvbmcpIG1lbW9yeSwgbGFzdF9zZWduYW1lKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKHdyaXRlX3ApCi0JewotCSAgbWVtY3B5IChtZW1vcnksIGJ1ZmZlciwgcGh5c19zaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChidWZmZXIsIG1lbW9yeSwgcGh5c19zaXplKTsKLQl9Ci0KLSAgICAgIHZpcnQgKz0gcGh5c19zaXplOwotICAgICAgYnVmZmVyICs9IHBoeXNfc2l6ZTsKLSAgICAgIHhmZXJlZCArPSBwaHlzX3NpemU7Ci0gICAgfQotCi0gIHJldHVybiBzaXplOwotfQotCi0KLWludAotc2ltX3dyaXRlIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIHBlcmZvcm1pbmcgYSB2aXJ0dWFsIHRyYW5zZmVyICovCi0gIHJldHVybiB4ZmVyX21lbSggYWRkciwgYnVmZmVyLCBzaXplLCAxKTsKLX0KLQotaW50Ci1zaW1fcmVhZCAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBwZXJmb3JtaW5nIGEgdmlydHVhbCB0cmFuc2ZlciAqLwotICByZXR1cm4geGZlcl9tZW0oIGFkZHIsIGJ1ZmZlciwgc2l6ZSwgMCk7Ci19Ci0KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBjYWxsYmFjaywgYWJmZCwgYXJndikKLSAgICAgU0lNX09QRU5fS0lORCBraW5kOwotICAgICBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBzdHJ1Y3Qgc2ltb3BzICpzOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKLSAgc3RhdGljIGludCBpbml0X3AgPSAwOwotICBjaGFyICoqcDsKLQotICBzaW1fa2luZCA9IGtpbmQ7Ci0gIGQxMHZfY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgbXluYW1lID0gYXJndlswXTsKLSAgb2xkX3NlZ21lbnRfbWFwcGluZyA9IDA7Ci0KLSAgLyogTk9URTogVGhpcyBhcmd1bWVudCBwYXJzaW5nIGlzIG9ubHkgZWZmZWN0aXZlIHdoZW4gdGhpcyBmdW5jdGlvbgotICAgICBpcyBjYWxsZWQgYnkgR0RCLiBTdGFuZGFsb25lIGFyZ3VtZW50IHBhcnNpbmcgaXMgaGFuZGxlZCBieQotICAgICBzaW0vY29tbW9uL3J1bi5jLiAqLwotICBmb3IgKHAgPSBhcmd2ICsgMTsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgqcCwgIi1vbGRzZWciKSA9PSAwKQotCW9sZF9zZWdtZW50X21hcHBpbmcgPSAxOwotI2lmZGVmIERFQlVHCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKCpwLCAiLXQiKSA9PSAwKQotCWQxMHZfZGVidWcgPSBERUJVRzsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKCpwLCAiLXQiLCAyKSA9PSAwKQotCWQxMHZfZGVidWcgPSBhdG9pICgqcCArIDIpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IHVuc3VwcG9ydGVkIG9wdGlvbihzKTogJXNcbiIsKnApOwotICAgIH0KLSAgCi0gIC8qIHB1dCBhbGwgdGhlIG9wY29kZXMgaW4gdGhlIGhhc2ggdGFibGUgKi8KLSAgaWYgKCFpbml0X3ArKykKLSAgICB7Ci0gICAgICBmb3IgKHMgPSBTaW1vcHM7IHMtPmZ1bmM7IHMrKykKLQl7Ci0JICBoID0gJmhhc2hfdGFibGVbaGFzaChzLT5vcGNvZGUscy0+Zm9ybWF0KV07Ci0gICAgICAKLQkgIC8qIGdvIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjaGFpbiAqLwotCSAgd2hpbGUgKGgtPm5leHQpCi0JICAgIGggPSBoLT5uZXh0OwotCi0JICBpZiAoaC0+b3BzKQotCSAgICB7Ci0JICAgICAgaC0+bmV4dCA9IChzdHJ1Y3QgaGFzaF9lbnRyeSAqKSBjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpKTsKLQkgICAgICBpZiAoIWgtPm5leHQpCi0JCXBlcnJvciAoIm1hbGxvYyBmYWlsdXJlIik7Ci0KLQkgICAgICBoID0gaC0+bmV4dDsKLQkgICAgfQotCSAgaC0+b3BzID0gczsKLQkgIGgtPm1hc2sgPSBzLT5tYXNrOwotCSAgaC0+b3Bjb2RlID0gcy0+b3Bjb2RlOwotCSAgaC0+c2l6ZSA9IHMtPmlzX2xvbmc7Ci0JfQotICAgIH0KLQotICAvKiByZXNldCB0aGUgcHJvY2Vzc29yIHN0YXRlICovCi0gIGlmICghU3RhdGUubWVtLmRhdGFbMF0pCi0gICAgc2ltX3NpemUgKDEpOwotICBzaW1fY3JlYXRlX2luZmVyaW9yICgoU0lNX0RFU0MpIDEsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gIC8qIEZ1ZGdlIG91ciBkZXNjcmlwdG9yLiAgKi8KLSAgcmV0dXJuIChTSU1fREVTQykgMTsKLX0KLQotCi12b2lkCi1zaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBxdWl0dGluZzsKLXsKLSAgaWYgKHByb2dfYmZkICE9IE5VTEwgJiYgcHJvZ19iZmRfd2FzX29wZW5lZF9wKQotICAgIHsKLSAgICAgIGJmZF9jbG9zZSAocHJvZ19iZmQpOwotICAgICAgcHJvZ19iZmQgPSBOVUxMOwotICAgICAgcHJvZ19iZmRfd2FzX29wZW5lZF9wID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQKLXNpbV9zZXRfcHJvZmlsZSAobikKLSAgICAgaW50IG47Ci17Ci0gICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9zZXRfcHJvZmlsZSAlZFxuIixuKTsKLX0KLQotdm9pZAotc2ltX3NldF9wcm9maWxlX3NpemUgKG4pCi0gICAgIGludCBuOwotewotICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJzaW1fc2V0X3Byb2ZpbGVfc2l6ZSAlZFxuIixuKTsKLX0KLQotdWludDggKgotZG1lbV9hZGRyICh1aW50MTYgb2Zmc2V0KQotewotICB1bnNpZ25lZCBsb25nIHBoeXM7Ci0gIHVpbnQ4ICptZW07Ci0gIGludCBwaHlzX3NpemU7Ci0KLSAgLyogTm90ZTogRE1FTSBhZGRyZXNzIHJhbmdlIGlzIDAuLjB4MTAwMDAuIENhbGxpbmcgY29kZSBjYW4gY29tcHV0ZQotICAgICB0aGluZ3MgbGlrZSBgYDB4ZmZmZSArIDB4MGU2MCA9PSAweDEwZTVkJycuICBTaW5jZSBvZmZzZXQncyB0eXBlCi0gICAgIGlzIHVpbnQxNiB0aGlzIGlzIG1vZHVsbydlZCBvbnRvIDB4MGU1ZC4gKi8KLQotICBwaHlzX3NpemUgPSBzaW1fZDEwdl90cmFuc2xhdGVfZG1hcF9hZGRyIChvZmZzZXQsIDEsICZwaHlzLAotCQkJCQkgICAgZG1hcF9yZWdpc3Rlcik7Ci0gIGlmIChwaHlzX3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICBtZW0gPSBTdGF0ZS5tZW0uZmF1bHQ7Ci0gICAgfQotICBlbHNlCi0gICAgbWVtID0gbWFwX21lbW9yeSAocGh5cyk7Ci0jaWZkZWYgREVCVUcKLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTUVNT1JZKSkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkKLQkoZDEwdl9jYWxsYmFjaywKLQkgIm1lbTogMHglMDh4ICglcykgLT4gMHglMDhseCAlZCAoJXMpIC0+IDB4JTA4bHggKCVzKVxuIiwKLQkgb2Zmc2V0LCBsYXN0X2Zyb20sCi0JIHBoeXMsIHBoeXNfc2l6ZSwgbGFzdF90bywKLQkgKGxvbmcpIG1lbSwgbGFzdF9zZWduYW1lKTsKLSAgICB9Ci0jZW5kaWYKLSAgcmV0dXJuIG1lbTsKLX0KLQotdWludDggKgotaW1lbV9hZGRyICh1aW50MzIgb2Zmc2V0KQotewotICB1bnNpZ25lZCBsb25nIHBoeXM7Ci0gIHVpbnQ4ICptZW07Ci0gIGludCBwaHlzX3NpemUgPSBzaW1fZDEwdl90cmFuc2xhdGVfaW1hcF9hZGRyIChvZmZzZXQsIDEsICZwaHlzLCBpbWFwX3JlZ2lzdGVyKTsKLSAgaWYgKHBoeXNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBTdGF0ZS5tZW0uZmF1bHQ7Ci0gICAgfQotICBtZW0gPSBtYXBfbWVtb3J5IChwaHlzKTsgCi0jaWZkZWYgREVCVUcKLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTUVNT1JZKSkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkKLQkoZDEwdl9jYWxsYmFjaywKLQkgIm1lbTogMHglMDh4ICglcykgLT4gMHglMDhseCAlZCAoJXMpIC0+IDB4JTA4bHggKCVzKVxuIiwKLQkgb2Zmc2V0LCBsYXN0X2Zyb20sCi0JIHBoeXMsIHBoeXNfc2l6ZSwgbGFzdF90bywKLQkgKGxvbmcpIG1lbSwgbGFzdF9zZWduYW1lKTsKLSAgICB9Ci0jZW5kaWYKLSAgcmV0dXJuIG1lbTsKLX0KLQotc3RhdGljIGludCBzdG9wX3NpbXVsYXRvciA9IDA7Ci0KLWludAotc2ltX3N0b3AgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgc3RvcF9zaW11bGF0b3IgPSAxOwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBSdW4gKG9yIHJlc3VtZSkgdGhlIHByb2dyYW0uICAqLwotdm9pZAotc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgc3RlcCwgc2lnZ25hbDsKLXsKLSAgdWludDMyIGluc3Q7Ci0gIHVpbnQ4ICppYWRkcjsKLQotLyogICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJzaW1fcmVzdW1lICglZCwlZCkgIFBDPTB4JXhcbiIsc3RlcCxzaWdnbmFsLFBDKTsgKi8KLSAgU3RhdGUuZXhjZXB0aW9uID0gMDsKLSAgaWYgKHN0ZXApCi0gICAgc2ltX3N0b3AgKHNkKTsKLQotICBzd2l0Y2ggKHNpZ2duYWwpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGJyZWFrOwotI2lmZGVmIFNJR0JVUwotICAgIGNhc2UgU0lHQlVTOgotI2VuZGlmCi0gICAgY2FzZSBTSUdTRUdWOgotICAgICAgU0VUX0JQQyAoUEMpOwotICAgICAgU0VUX0JQU1cgKFBTVyk7Ci0gICAgICBTRVRfSFdfUFNXICgoUFNXICYgKFBTV19GMF9CSVQgfCBQU1dfRjFfQklUIHwgUFNXX0NfQklUKSkpOwotICAgICAgSk1QIChBRV9WRUNUT1JfU1RBUlQpOwotICAgICAgU0xPVF9GTFVTSCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0lHSUxMOgotICAgICAgU0VUX0JQQyAoUEMpOwotICAgICAgU0VUX0JQU1cgKFBTVyk7Ci0gICAgICBTRVRfSFdfUFNXICgoUFNXICYgKFBTV19GMF9CSVQgfCBQU1dfRjFfQklUIHwgUFNXX0NfQklUKSkpOwotICAgICAgSk1QIChSSUVfVkVDVE9SX1NUQVJUKTsKLSAgICAgIFNMT1RfRkxVU0ggKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyoganVzdCBpZ25vcmUgaXQgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGlhZGRyID0gaW1lbV9hZGRyICgodWludDMyKVBDIDw8IDIpOwotICAgICAgaWYgKGlhZGRyID09IFN0YXRlLm1lbS5mYXVsdCkKLSAJewotIAkgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0JVUzsKLSAJICBicmVhazsKLSAJfQotIAotICAgICAgaW5zdCA9IGdldF9sb25nd29yZCggaWFkZHIgKTsgCi0gCi0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMDsKLSAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DWUNMRVMgXSsrOwotICAgICAgCi0gICAgICBzd2l0Y2ggKGluc3QgJiAweEMwMDAwMDAwKQotCXsKLQljYXNlIDB4QzAwMDAwMDA6Ci0JICAvKiBsb25nIGluc3RydWN0aW9uICovCi0JICBkb19sb25nIChpbnN0ICYgMHgzRkZGRkZGRik7Ci0JICBicmVhazsKLQljYXNlIDB4ODAwMDAwMDA6Ci0JICAvKiBSIC0+IEwgKi8KLQkgIGRvXzJfc2hvcnQgKCBpbnN0ICYgMHg3RkZGLCAoaW5zdCAmIDB4M0ZGRjgwMDApID4+IDE1LCBSSUdIVF9GSVJTVCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDAwMDAwMDA6Ci0JICAvKiBMIC0+IFIgKi8KLQkgIGRvXzJfc2hvcnQgKChpbnN0ICYgMHgzRkZGODAwMCkgPj4gMTUsIGluc3QgJiAweDdGRkYsIExFRlRfRklSU1QpOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgZG9fcGFyYWxsZWwgKChpbnN0ICYgMHgzRkZGODAwMCkgPj4gMTUsIGluc3QgJiAweDdGRkYpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBJZiB0aGUgUEMgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbWF0Y2hlcyBSUFRfRSB0aGVuCi0JIHNjaGVkdWxlIGEgYnJhbmNoIHRvIHRoZSBsb29wIHN0YXJ0LiAgSWYgb25lIG9mIHRob3NlCi0JIGluc3RydWN0aW9ucyBoYXBwZW5zIHRvIGJlIGEgYnJhbmNoLCB0aGFuIHRoYXQgaW5zdHJ1Y3Rpb24KLQkgd2lsbCBiZSBpZ25vcmVkICovCi0gICAgICBpZiAoIVN0YXRlLnBjX2NoYW5nZWQpCi0JewotCSAgaWYgKFBTV19SUCAmJiBQQyA9PSBSUFRfRSkKLQkgICAgewotCSAgICAgIC8qIE5vdGU6IFRoZSBiZWhhdm91ciBvZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBhdCBSUFRfRQotCQkgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kYW50LCB0aGlzIHNpbXVsYXRvciB0YWtlcyB0aGUKLQkJIGJyYW5jaC4gIEJyYW5jaGluZyB0byBSUFRfRSBpcyB2YWxpZCwgdGhlIGluc3RydWN0aW9uCi0JCSBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgbG9vcCBpcyB0YWtlbi4gICovCi0JICAgICAgaWYgKFJQVF9DID09IDEpCi0JCXsKLQkJICBTRVRfUFNXX1JQICgwKTsKLQkJICBTRVRfUlBUX0MgKDApOwotCQkgIFNFVF9QQyAoUEMgKyAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFNFVF9SUFRfQyAoUlBUX0MgLSAxKTsKLQkJICBTRVRfUEMgKFJQVF9TKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIFNFVF9QQyAoUEMgKyAxKTsKLQl9CSAgCi0gICAgICAKLSAgICAgIC8qIENoZWNrIGZvciBhIGJyZWFrcG9pbnQgdHJhcCBvbiB0aGlzIGluc3RydWN0aW9uLiAgVGhpcwotCSBvdmVycmlkZXMgYW55IHBlbmRpbmcgYnJhbmNoZXMgb3IgbG9vcHMgKi8KLSAgICAgIGlmIChQU1dfREIgJiYgUEMgPT0gSUJBKQotCXsKLQkgIFNFVF9CUEMgKFBDKTsKLQkgIFNFVF9CUFNXIChQU1cpOwotCSAgU0VUX1BTVyAoUFNXICYgUFNXX1NNX0JJVCk7Ci0JICBTRVRfUEMgKFNEQlRfVkVDVE9SX1NUQVJUKTsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlYmFjayBhbGwgdGhlIERBVEEgLyBQQyBjaGFuZ2VzICovCi0gICAgICBTTE9UX0ZMVVNIICgpOwotCi0jaWZkZWYgTkVFRF9VSV9MT09QX0hPT0sKLSAgICAgIGlmICh1aV9sb29wX2hvb2sgIT0gTlVMTCAmJiB1aV9sb29wX2hvb2tfY291bnRlci0tIDwgMCkKLQl7Ci0JICB1aV9sb29wX2hvb2tfY291bnRlciA9IFVJX0xPT1BfUE9MTF9JTlRFUlZBTDsKLQkgIHVpX2xvb3BfaG9vayAoMCk7Ci0JfQotI2VuZGlmIC8qIE5FRURfVUlfTE9PUF9IT09LICovCi0gICAgfQotICB3aGlsZSAoICFTdGF0ZS5leGNlcHRpb24gJiYgIXN0b3Bfc2ltdWxhdG9yKTsKLSAgCi0gIGlmIChzdGVwICYmICFTdGF0ZS5leGNlcHRpb24pCi0gICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLX0KLQotdm9pZAotc2ltX3NldF90cmFjZSAodm9pZCkKLXsKLSNpZmRlZiBERUJVRwotICBkMTB2X2RlYnVnID0gREVCVUc7Ci0jZW5kaWYKLX0KLQotdm9pZAotc2ltX2luZm8gKHNkLCB2ZXJib3NlKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHZlcmJvc2U7Ci17Ci0gIGNoYXIgYnVmMVs0MF07Ci0gIGNoYXIgYnVmMls0MF07Ci0gIGNoYXIgYnVmM1s0MF07Ci0gIGNoYXIgYnVmNFs0MF07Ci0gIGNoYXIgYnVmNVs0MF07Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdAkJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVCBdICsgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlRfQ09ORF9FWEUgXTsKLSAgdW5zaWduZWQgbG9uZyBsZWZ0X25vcHMJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVF9OT1BTIF07Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdF9wYXJhbGxlbAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX1BBUkFMTEVMIF07Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdF9jb25kCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlRfQ09ORF9URVNUIF07Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdF90b3RhbAk9IGxlZnQgKyBsZWZ0X3BhcmFsbGVsICsgbGVmdF9jb25kICsgbGVmdF9ub3BzOwotCi0gIHVuc2lnbmVkIGxvbmcgcmlnaHQJCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUIF0gKyBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfQ09ORF9FWEUgXTsKLSAgdW5zaWduZWQgbG9uZyByaWdodF9ub3BzCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUX05PUFMgXTsKLSAgdW5zaWduZWQgbG9uZyByaWdodF9wYXJhbGxlbAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVF9QQVJBTExFTCBdOwotICB1bnNpZ25lZCBsb25nIHJpZ2h0X2NvbmQJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfQ09ORF9URVNUIF07Ci0gIHVuc2lnbmVkIGxvbmcgcmlnaHRfdG90YWwJPSByaWdodCArIHJpZ2h0X3BhcmFsbGVsICsgcmlnaHRfY29uZCArIHJpZ2h0X25vcHM7Ci0KLSAgdW5zaWduZWQgbG9uZyB1bmtub3duCQk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19VTktOT1dOIF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zX2xvbmcJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTE9ORyBdOwotICB1bnNpZ25lZCBsb25nIHBhcmFsbGVsCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1BBUkFMTEVMIF07Ci0gIHVuc2lnbmVkIGxvbmcgbGVmdHJpZ2h0CT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlRSSUdIVCBdOwotICB1bnNpZ25lZCBsb25nIHJpZ2h0bGVmdAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVExFRlQgXTsKLSAgdW5zaWduZWQgbG9uZyBjb25kX3RydWUJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9UUlVFIF07Ci0gIHVuc2lnbmVkIGxvbmcgY29uZF9mYWxzZQk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DT05EX0ZBTFNFIF07Ci0gIHVuc2lnbmVkIGxvbmcgY29uZF9qdW1wCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NPTkRfSlVNUCBdOwotICB1bnNpZ25lZCBsb25nIGN5Y2xlcwkJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ1lDTEVTIF07Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWwJCT0gKHVua25vd24gKyBsZWZ0X3RvdGFsICsgcmlnaHRfdG90YWwgKyBpbnNfbG9uZyk7Ci0KLSAgaW50IHNpemUJCQk9IHN0cmxlbiAoYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgdG90YWwpKTsKLSAgaW50IHBhcmFsbGVsX3NpemUJCT0gc3RybGVuIChhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLAotCQkJCQkJICAgICAgKGxlZnRfcGFyYWxsZWwgPiByaWdodF9wYXJhbGxlbCkgPyBsZWZ0X3BhcmFsbGVsIDogcmlnaHRfcGFyYWxsZWwpKTsKLSAgaW50IGNvbmRfc2l6ZQkJCT0gc3RybGVuIChhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCAobGVmdF9jb25kID4gcmlnaHRfY29uZCkgPyBsZWZ0X2NvbmQgOiByaWdodF9jb25kKSk7Ci0gIGludCBub3Bfc2l6ZQkJCT0gc3RybGVuIChhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCAobGVmdF9ub3BzID4gcmlnaHRfbm9wcykgPyBsZWZ0X25vcHMgOiByaWdodF9ub3BzKSk7Ci0gIGludCBub3JtYWxfc2l6ZQkJPSBzdHJsZW4gKGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIChsZWZ0ID4gcmlnaHQpID8gbGVmdCA6IHJpZ2h0KSk7Ci0KLSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgImV4ZWN1dGVkICUqcyBsZWZ0ICBpbnN0cnVjdGlvbihzKSwgJSpzIG5vcm1hbCwgJSpzIHBhcmFsbGVsLCAlKnMgRVhFeHh4LCAlKnMgbm9wc1xuIiwKLQkJCQkgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIGxlZnRfdG90YWwpLAotCQkJCSAgICAgbm9ybWFsX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjIsIHNpemVvZiAoYnVmMiksIGxlZnQpLAotCQkJCSAgICAgcGFyYWxsZWxfc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMywgc2l6ZW9mIChidWYzKSwgbGVmdF9wYXJhbGxlbCksCi0JCQkJICAgICBjb25kX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjQsIHNpemVvZiAoYnVmNCksIGxlZnRfY29uZCksCi0JCQkJICAgICBub3Bfc2l6ZSwgYWRkX2NvbW1hcyAoYnVmNSwgc2l6ZW9mIChidWY1KSwgbGVmdF9ub3BzKSk7Ci0KLSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgImV4ZWN1dGVkICUqcyByaWdodCBpbnN0cnVjdGlvbihzKSwgJSpzIG5vcm1hbCwgJSpzIHBhcmFsbGVsLCAlKnMgRVhFeHh4LCAlKnMgbm9wc1xuIiwKLQkJCQkgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHJpZ2h0X3RvdGFsKSwKLQkJCQkgICAgIG5vcm1hbF9zaXplLCBhZGRfY29tbWFzIChidWYyLCBzaXplb2YgKGJ1ZjIpLCByaWdodCksCi0JCQkJICAgICBwYXJhbGxlbF9zaXplLCBhZGRfY29tbWFzIChidWYzLCBzaXplb2YgKGJ1ZjMpLCByaWdodF9wYXJhbGxlbCksCi0JCQkJICAgICBjb25kX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjQsIHNpemVvZiAoYnVmNCksIHJpZ2h0X2NvbmQpLAotCQkJCSAgICAgbm9wX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjUsIHNpemVvZiAoYnVmNSksIHJpZ2h0X25vcHMpKTsKLQotICBpZiAoaW5zX2xvbmcpCi0gICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgICAiZXhlY3V0ZWQgJSpzIGxvbmcgaW5zdHJ1Y3Rpb24ocylcbiIsCi0JCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIGluc19sb25nKSk7Ci0KLSAgaWYgKHBhcmFsbGVsKQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkgICAgICAgImV4ZWN1dGVkICUqcyBwYXJhbGxlbCBpbnN0cnVjdGlvbihzKVxuIiwKLQkJCQkgICAgICAgc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgcGFyYWxsZWwpKTsKLQotICBpZiAobGVmdHJpZ2h0KQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkgICAgICAgImV4ZWN1dGVkICUqcyBpbnN0cnVjdGlvbihzKSBlbmNvZGVkIEwtPlJcbiIsCi0JCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIGxlZnRyaWdodCkpOwotCi0gIGlmIChyaWdodGxlZnQpCi0gICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgICAiZXhlY3V0ZWQgJSpzIGluc3RydWN0aW9uKHMpIGVuY29kZWQgUi0+TFxuIiwKLQkJCQkgICAgICAgc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgcmlnaHRsZWZ0KSk7Ci0KLSAgaWYgKHVua25vd24pCi0gICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgICAiZXhlY3V0ZWQgJSpzIHVua25vd24gaW5zdHJ1Y3Rpb24ocylcbiIsCi0JCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHVua25vd24pKTsKLQotICBpZiAoY29uZF90cnVlKQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkgICAgICAgImV4ZWN1dGVkICUqcyBpbnN0cnVjdGlvbihzKSBkdWUgdG8gRVhFeHh4IGNvbmRpdGlvbiBiZWluZyB0cnVlXG4iLAotCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBjb25kX3RydWUpKTsKLQotICBpZiAoY29uZF9mYWxzZSkKLSAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCi0JCQkJICAgICAgICJza2lwcGVkICAlKnMgaW5zdHJ1Y3Rpb24ocykgZHVlIHRvIEVYRXh4eCBjb25kaXRpb24gYmVpbmcgZmFsc2VcbiIsCi0JCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIGNvbmRfZmFsc2UpKTsKLQotICBpZiAoY29uZF9qdW1wKQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkgICAgICAgInNraXBwZWQgICUqcyBpbnN0cnVjdGlvbihzKSBkdWUgdG8gY29uZGl0aW9uYWwgYnJhbmNoIHN1Y2NlZWRpbmdcbiIsCi0JCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIGNvbmRfanVtcCkpOwotCi0gICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkgICAgICJleGVjdXRlZCAlKnMgY3ljbGUocylcbiIsCi0JCQkJICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBjeWNsZXMpKTsKLQotICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCi0JCQkJICAgICAiZXhlY3V0ZWQgJSpzIHRvdGFsIGluc3RydWN0aW9uc1xuIiwKLQkJCQkgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHRvdGFsKSk7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotCi0gIC8qIHJlc2V0IGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotICBtZW1zZXQgKCZTdGF0ZS5yZWdzLCAwLCAoaW50KSZTdGF0ZS5tZW0gLSAoaW50KSZTdGF0ZS5yZWdzKTsKLQotICBpZiAoYXJndikKLSAgICB7Ci0gICAgICAvKiBhIGhhY2sgdG8gc2V0IHIwL3IxIHdpdGggYXJnYy9hcmd2ICovCi0gICAgICAvKiBzb21lIGhpZ2ggbWVtb3J5IHRoYXQgd29uJ3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIHN0YWNrIHNvb24gKi8KLSAgICAgIGJmZF92bWEgYWRkciA9IDB4N0MwMDsKLSAgICAgIGludCBwID0gMjA7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB3aGlsZSAoYXJndltpXSkKLSAJewotIAkgIGludCBzaXplID0gc3RybGVuIChhcmd2W2ldKSArIDE7Ci0gCSAgU1cgKGFkZHIgKyAyKmksIGFkZHIgKyBwKTsgCi0gCSAgc2ltX3dyaXRlIChzZCwgYWRkciArIDAsIGFyZ3ZbaV0sIHNpemUpOwotIAkgIHAgKz0gc2l6ZTsKLSAJICBpKys7Ci0gCX0KLSAgICAgIFNFVF9HUFIgKDAsIGFkZHIpOwotICAgICAgU0VUX0dQUiAoMSwgaSk7Ci0gICAgfQotCi0gIC8qIHNldCBQQyAqLwotICBpZiAoYWJmZCAhPSBOVUxMKQotICAgIHN0YXJ0X2FkZHJlc3MgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBlbHNlCi0gICAgc3RhcnRfYWRkcmVzcyA9IDB4ZmZjMCA8PCAyOwotI2lmZGVmIERFQlVHCi0gIGlmIChkMTB2X2RlYnVnKQotICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9jcmVhdGVfaW5mZXJpb3I6ICBQQz0weCVseFxuIiwgKGxvbmcpIHN0YXJ0X2FkZHJlc3MpOwotI2VuZGlmCi0gIFNFVF9DUkVHIChQQ19DUiwgc3RhcnRfYWRkcmVzcyA+PiAyKTsKLQotICAvKiBjcHUgcmVzZXRzIGltYXAwIHRvIDAgYW5kIGltYXAxIHRvIDB4N2YsIGJ1dCBEMTBWLUVWQSBib2FyZAotICAgICBpbml0aWFsaXplcyBpbWFwMCBhbmQgaW1hcDEgdG8gMHgxMDAwIGFzIHBhcnQgb2YgaXRzIFJPTQotICAgICBpbml0aWFsaXphdGlvbi4gKi8KLSAgaWYgKG9sZF9zZWdtZW50X21hcHBpbmcpCi0gICAgewotICAgICAgLyogRXh0ZXJuYWwgbWVtb3J5IHN0YXJ0dXAuICBUaGlzIGlzIHRoZSBIQVJEIHJlc2V0IHN0YXRlLiAqLwotICAgICAgc2V0X2ltYXBfcmVnaXN0ZXIgKDAsIDB4MDAwMCk7Ci0gICAgICBzZXRfaW1hcF9yZWdpc3RlciAoMSwgMHgwMDdmKTsKLSAgICAgIHNldF9kbWFwX3JlZ2lzdGVyICgwLCAweDIwMDApOwotICAgICAgc2V0X2RtYXBfcmVnaXN0ZXIgKDEsIDB4MjAwMCk7Ci0gICAgICBzZXRfZG1hcF9yZWdpc3RlciAoMiwgMHgwMDAwKTsgLyogT2xkIERNQVAgKi8KLSAgICAgIHNldF9kbWFwX3JlZ2lzdGVyICgzLCAweDAwMDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEludGVybmFsIG1lbW9yeSBzdGFydHVwLiBUaGlzIGlzIHRoZSBST00gaW50aWFsaXplZCBzdGF0ZS4gKi8KLSAgICAgIHNldF9pbWFwX3JlZ2lzdGVyICgwLCAweDEwMDApOwotICAgICAgc2V0X2ltYXBfcmVnaXN0ZXIgKDEsIDB4MTAwMCk7Ci0gICAgICBzZXRfZG1hcF9yZWdpc3RlciAoMCwgMHgyMDAwKTsKLSAgICAgIHNldF9kbWFwX3JlZ2lzdGVyICgxLCAweDIwMDApOwotICAgICAgc2V0X2RtYXBfcmVnaXN0ZXIgKDIsIDB4MjAwMCk7IC8qIERNQVAyIGluaXRpYWwgaW50ZXJuYWwgdmFsdWUgaXMKLQkJCQkJMHgyMDAwIG9uIHRoZSBuZXcgYm9hcmQuICovCi0gICAgICBzZXRfZG1hcF9yZWdpc3RlciAoMywgMHgwMDAwKTsKLSAgICB9Ci0KLSAgU0xPVF9GTFVTSCAoKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotCi12b2lkCi1zaW1fc2V0X2NhbGxiYWNrcyAocCkKLSAgICAgaG9zdF9jYWxsYmFjayAqcDsKLXsKLSAgZDEwdl9jYWxsYmFjayA9IHA7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247Ci0gICAgIGludCAqc2lncmM7Ci17Ci0vKiAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9zdG9wX3JlYXNvbjogIFBDPTB4JXhcbiIsUEM8PDIpOyAqLwotCi0gIHN3aXRjaCAoU3RhdGUuZXhjZXB0aW9uKQotICAgIHsKLSAgICBjYXNlIFNJR19EMTBWX1NUT1A6CQkJLyogc3RvcCBpbnN0cnVjdGlvbiAqLwotICAgICAgKnJlYXNvbiA9IHNpbV9leGl0ZWQ7Ci0gICAgICAqc2lncmMgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNJR19EMTBWX0VYSVQ6CQkJLyogZXhpdCB0cmFwICovCi0gICAgICAqcmVhc29uID0gc2ltX2V4aXRlZDsKLSAgICAgICpzaWdyYyA9IEdQUiAoMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0lHX0QxMFZfQlVTOgotICAgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOwotI2lmZGVmIFNJR0JVUwotICAgICAgKnNpZ3JjID0gU0lHQlVTOwotI2Vsc2UKLSAgICAgICpzaWdyYyA9IFNJR1NFR1Y7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkJLyogc29tZSBzaWduYWwgKi8KLSAgICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKLSAgICAgIGlmIChzdG9wX3NpbXVsYXRvciAmJiAhU3RhdGUuZXhjZXB0aW9uKQotCSpzaWdyYyA9IFNJR0lOVDsKLSAgICAgIGVsc2UKLQkqc2lncmMgPSBTdGF0ZS5leGNlcHRpb247Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3RvcF9zaW11bGF0b3IgPSAwOwotfQotCi1pbnQKLXNpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgbGVuZ3RoOwotewotICBpbnQgc2l6ZTsKLSAgaWYgKHJuIDwgMCkKLSAgICBzaXplID0gMDsKLSAgZWxzZSBpZiAocm4gPj0gU0lNX0QxMFZfUjBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9SMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9SX1JFR1MpCi0gICAgewotICAgICAgV1JJVEVfMTYgKG1lbW9yeSwgR1BSIChybiAtIFNJTV9EMTBWX1IwX1JFR05VTSkpOwotICAgICAgc2l6ZSA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChybiA+PSBTSU1fRDEwVl9DUjBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9DUjBfUkVHTlVNICsgU0lNX0QxMFZfTlJfQ1JfUkVHUykKLSAgICB7Ci0gICAgICBXUklURV8xNiAobWVtb3J5LCBDUkVHIChybiAtIFNJTV9EMTBWX0NSMF9SRUdOVU0pKTsKLSAgICAgIHNpemUgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAocm4gPj0gU0lNX0QxMFZfQTBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9BMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9BX1JFR1MpCi0gICAgewotICAgICAgV1JJVEVfNjQgKG1lbW9yeSwgQUNDIChybiAtIFNJTV9EMTBWX0EwX1JFR05VTSkpOwotICAgICAgc2l6ZSA9IDg7Ci0gICAgfQotICBlbHNlIGlmIChybiA9PSBTSU1fRDEwVl9TUElfUkVHTlVNKQotICAgIHsKLSAgICAgIC8qIFBTV19TTSBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBTUCBpcyB0aGUgVVNFUgotICAgICAgICAgc3RhY2stcG9pbnRlci4gKi8KLSAgICAgIFdSSVRFXzE2IChtZW1vcnksIHNwaV9yZWdpc3RlciAoKSk7Ci0gICAgICBzaXplID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHJuID09IFNJTV9EMTBWX1NQVV9SRUdOVU0pCi0gICAgewotICAgICAgLyogUFNXX1NNIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IFNQIGlzIHRoZSBVU0VSCi0gICAgICAgICBzdGFjay1wb2ludGVyLiAqLwotICAgICAgV1JJVEVfMTYgKG1lbW9yeSwgc3B1X3JlZ2lzdGVyICgpKTsKLSAgICAgIHNpemUgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAocm4gPj0gU0lNX0QxMFZfSU1BUDBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9JTUFQMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9JTUFQX1JFR1MpCi0gICAgewotICAgICAgV1JJVEVfMTYgKG1lbW9yeSwgaW1hcF9yZWdpc3RlciAocm4gLSBTSU1fRDEwVl9JTUFQMF9SRUdOVU0pKTsKLSAgICAgIHNpemUgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAocm4gPj0gU0lNX0QxMFZfRE1BUDBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9ETUFQMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9ETUFQX1JFR1MpCi0gICAgewotICAgICAgV1JJVEVfMTYgKG1lbW9yeSwgZG1hcF9yZWdpc3RlciAocm4gLSBTSU1fRDEwVl9ETUFQMF9SRUdOVU0pKTsKLSAgICAgIHNpemUgPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHNpemUgPSAwOwotICByZXR1cm4gc2l6ZTsKLX0KLSAKLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGludCBzaXplOwotICBpZiAocm4gPCAwKQotICAgIHNpemUgPSAwOwotICBlbHNlIGlmIChybiA+PSBTSU1fRDEwVl9SMF9SRUdOVU0KLQkgICAmJiBybiA8IFNJTV9EMTBWX1IwX1JFR05VTSArIFNJTV9EMTBWX05SX1JfUkVHUykKLSAgICB7Ci0gICAgICBTRVRfR1BSIChybiAtIFNJTV9EMTBWX1IwX1JFR05VTSwgUkVBRF8xNiAobWVtb3J5KSk7Ci0gICAgICBzaXplID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHJuID49IFNJTV9EMTBWX0NSMF9SRUdOVU0KLQkgICAmJiBybiA8IFNJTV9EMTBWX0NSMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9DUl9SRUdTKQotICAgIHsKLSAgICAgIFNFVF9DUkVHIChybiAtIFNJTV9EMTBWX0NSMF9SRUdOVU0sIFJFQURfMTYgKG1lbW9yeSkpOwotICAgICAgc2l6ZSA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChybiA+PSBTSU1fRDEwVl9BMF9SRUdOVU0KLQkgICAmJiBybiA8IFNJTV9EMTBWX0EwX1JFR05VTSArIFNJTV9EMTBWX05SX0FfUkVHUykKLSAgICB7Ci0gICAgICBTRVRfQUNDIChybiAtIFNJTV9EMTBWX0EwX1JFR05VTSwgUkVBRF82NCAobWVtb3J5KSAmIE1BU0s0MCk7Ci0gICAgICBzaXplID0gODsKLSAgICB9Ci0gIGVsc2UgaWYgKHJuID09IFNJTV9EMTBWX1NQSV9SRUdOVU0pCi0gICAgewotICAgICAgLyogUFNXX1NNIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IFNQIGlzIHRoZSBVU0VSCi0gICAgICAgICBzdGFjay1wb2ludGVyLiAqLwotICAgICAgc2V0X3NwaV9yZWdpc3RlciAoUkVBRF8xNiAobWVtb3J5KSk7Ci0gICAgICBzaXplID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHJuID09IFNJTV9EMTBWX1NQVV9SRUdOVU0pCi0gICAgewotICAgICAgc2V0X3NwdV9yZWdpc3RlciAoUkVBRF8xNiAobWVtb3J5KSk7Ci0gICAgICBzaXplID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHJuID49IFNJTV9EMTBWX0lNQVAwX1JFR05VTQotCSAgICYmIHJuIDwgU0lNX0QxMFZfSU1BUDBfUkVHTlVNICsgU0lNX0QxMFZfTlJfSU1BUF9SRUdTKQotICAgIHsKLSAgICAgIHNldF9pbWFwX3JlZ2lzdGVyIChybiAtIFNJTV9EMTBWX0lNQVAwX1JFR05VTSwgUkVBRF8xNihtZW1vcnkpKTsKLSAgICAgIHNpemUgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAocm4gPj0gU0lNX0QxMFZfRE1BUDBfUkVHTlVNCi0JICAgJiYgcm4gPCBTSU1fRDEwVl9ETUFQMF9SRUdOVU0gKyBTSU1fRDEwVl9OUl9ETUFQX1JFR1MpCi0gICAgewotICAgICAgc2V0X2RtYXBfcmVnaXN0ZXIgKHJuIC0gU0lNX0QxMFZfRE1BUDBfUkVHTlVNLCBSRUFEXzE2KG1lbW9yeSkpOwotICAgICAgc2l6ZSA9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgc2l6ZSA9IDA7Ci0gIFNMT1RfRkxVU0ggKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi0KLXZvaWQKLXNpbV9kb19jb21tYW5kIChzZCwgY21kKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqY21kOwoteyAKLSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAic2ltX2RvX2NvbW1hbmQ6ICVzXG4iLGNtZCk7Ci19Ci0KLVNJTV9SQwotc2ltX2xvYWQgKHNkLCBwcm9nLCBhYmZkLCBmcm9tX3R0eSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKnByb2c7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBleHRlcm4gYmZkICpzaW1fbG9hZF9maWxlICgpOyAvKiA/Pz8gRG9uJ3Qga25vdyB3aGVyZSB0aGlzIHNob3VsZCBsaXZlLiAgKi8KLQotICBpZiAocHJvZ19iZmQgIT0gTlVMTCAmJiBwcm9nX2JmZF93YXNfb3BlbmVkX3ApCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gICAgICBwcm9nX2JmZF93YXNfb3BlbmVkX3AgPSAwOwotICAgIH0KLSAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBkMTB2X2NhbGxiYWNrLCBwcm9nLCBhYmZkLAotCQkJICAgIHNpbV9raW5kID09IFNJTV9PUEVOX0RFQlVHLAotCQkJICAgIDEvKkxNQSovLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIHByb2dfYmZkX3dhc19vcGVuZWRfcCA9IGFiZmQgPT0gTlVMTDsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0gCmRpZmYgLS1naXQgYS9zaW0vZDEwdi9zaW1vcHMuYyBiL3NpbS9kMTB2L3NpbW9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjBmYTU2Li4wMDAwMDAwCi0tLSBhL3NpbS9kMTB2L3NpbW9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYyOCArMCwwIEBACi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJkMTB2X3NpbS5oIgotI2luY2x1ZGUgInNpbW9wcy5oIgotI2luY2x1ZGUgInRhcmctdmFscy5oIgotCi1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLQotZW51bSBvcF90eXBlcyB7Ci0gIE9QX1ZPSUQsCi0gIE9QX1JFRywKLSAgT1BfUkVHX09VVFBVVCwKLSAgT1BfRFJFRywKLSAgT1BfRFJFR19PVVRQVVQsCi0gIE9QX0FDQ1VNLAotICBPUF9BQ0NVTV9PVVRQVVQsCi0gIE9QX0FDQ1VNX1JFVkVSU0UsCi0gIE9QX0NSLAotICBPUF9DUl9PVVRQVVQsCi0gIE9QX0NSX1JFVkVSU0UsCi0gIE9QX0ZMQUcsCi0gIE9QX0ZMQUdfT1VUUFVULAotICBPUF9DT05TVEFOVDE2LAotICBPUF9DT05TVEFOVDgsCi0gIE9QX0NPTlNUQU5UMywKLSAgT1BfQ09OU1RBTlQ0LAotICBPUF9NRU1SRUYsCi0gIE9QX01FTVJFRjIsCi0gIE9QX01FTVJFRjMsCi0gIE9QX1BPU1RERUMsCi0gIE9QX1BPU1RJTkMsCi0gIE9QX1BSRURFQywKLSAgT1BfUjAsCi0gIE9QX1IxLAotICBPUF9SMiwKLX07Ci0KLQotZW51bSB7Ci0gIFBTV19NQVNLID0gKFBTV19TTV9CSVQKLQkgICAgICB8IFBTV19FQV9CSVQKLQkgICAgICB8IFBTV19EQl9CSVQKLQkgICAgICB8IFBTV19JRV9CSVQKLQkgICAgICB8IFBTV19SUF9CSVQKLQkgICAgICB8IFBTV19NRF9CSVQKLQkgICAgICB8IFBTV19GWF9CSVQKLQkgICAgICB8IFBTV19TVF9CSVQKLQkgICAgICB8IFBTV19GMF9CSVQKLQkgICAgICB8IFBTV19GMV9CSVQKLQkgICAgICB8IFBTV19DX0JJVCksCi0gIC8qIFRoZSBmb2xsb3dpbmcgYml0cyBpbiB0aGUgUFNXIF9jYW4ndF8gYmUgc2V0IGJ5IGluc3RydWN0aW9ucyBzdWNoCi0gICAgIGFzIG12dGMuICovCi0gIFBTV19IV19NQVNLID0gKFBTV19NQVNLIHwgUFNXX0RNX0JJVCkKLX07Ci0KLXJlZ190Ci1tb3ZlX3RvX2NyIChpbnQgY3IsIHJlZ190IG1hc2ssIHJlZ190IHZhbCwgaW50IHBzd19od19wKQotewotICAvKiBBIE1BU0sgYml0IGlzIHNldCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgQ1Igc2hvdWxkCi0gICAgIGJlIGxlZnQgYWxvbmUgKi8KLSAgLyogVGhpcyBhc3N1bWVzIHRoYXQgKFZBTCAmIE1BU0spID09IDAgKi8KLSAgc3dpdGNoIChjcikKLSAgICB7Ci0gICAgY2FzZSBQU1dfQ1I6Ci0gICAgICBpZiAocHN3X2h3X3ApCi0JdmFsICY9IFBTV19IV19NQVNLOwotICAgICAgZWxzZQotCXZhbCAmPSBQU1dfTUFTSzsKLSAgICAgIGlmICgobWFzayAmIFBTV19TTV9CSVQpID09IDApCi0JewotCSAgaW50IG5ld19wc3dfc20gPSAodmFsICYgUFNXX1NNX0JJVCkgIT0gMDsKLQkgIC8qIHNhdmUgb2xkIFNQICovCi0JICBTRVRfSEVMRF9TUCAoUFNXX1NNLCBHUFIgKFNQX0lEWCkpOwotCSAgaWYgKFBTV19TTSAhPSBuZXdfcHN3X3NtKQotCSAgICAvKiByZXN0b3JlIG5ldyBTUCAqLwotCSAgICBTRVRfR1BSIChTUF9JRFgsIEhFTERfU1AgKG5ld19wc3dfc20pKTsKLQl9Ci0gICAgICBpZiAoKG1hc2sgJiAoUFNXX1NUX0JJVCB8IFBTV19GWF9CSVQpKSA9PSAwKQotCXsKLQkgIGlmICh2YWwgJiBQU1dfU1RfQklUICYmICEodmFsICYgUFNXX0ZYX0JJVCkpCi0JICAgIHsKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkKLQkJKGQxMHZfY2FsbGJhY2ssCi0JCSAiRVJST1IgYXQgUEMgMHgleDogU1QgY2FuIG9ubHkgYmUgc2V0IHdoZW4gRlggaXMgc2V0LlxuIiwKLQkJIFBDPDwyKTsKLQkgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBrZWVwIGFuIHVwLXRvLWRhdGUgcHN3IGFyb3VuZCBmb3IgdHJhY2luZyAqLwotICAgICAgU3RhdGUudHJhY2UucHN3ID0gKFN0YXRlLnRyYWNlLnBzdyAmIG1hc2spIHwgdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCUFNXX0NSOgotICAgIGNhc2UgRFBTV19DUjoKLSAgICAgIC8qIEp1c3QgbGlrZSBQU1csIG1hc2sgdGhpbmdzIGxpa2UgRE0gb3V0LiAqLwotICAgICAgaWYgKHBzd19od19wKQotCXZhbCAmPSBQU1dfSFdfTUFTSzsKLSAgICAgIGVsc2UKLQl2YWwgJj0gUFNXX01BU0s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PRF9TX0NSOgotICAgIGNhc2UgTU9EX0VfQ1I6Ci0gICAgICB2YWwgJj0gfjE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKiBvbmx5IGlzc3VlIGFuIHVwZGF0ZSBpZiB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgY2hhbmdlZCAqLwotICBpZiAoKFN0YXRlLmNyZWdzW2NyXSAmIH5tYXNrKSAhPSB2YWwpCi0gICAgU0xPVF9QRU5EX01BU0sgKFN0YXRlLmNyZWdzW2NyXSwgbWFzaywgdmFsKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCB0cmFjZV9pbnB1dF9mdW5jIFBBUkFNUyAoKGNoYXIgKm5hbWUsCi0JCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjEsCi0JCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjIsCi0JCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjMpKTsKLQotI2RlZmluZSB0cmFjZV9pbnB1dChuYW1lLCBpbjEsIGluMiwgaW4zKSBkbyB7IGlmIChkMTB2X2RlYnVnKSB0cmFjZV9pbnB1dF9mdW5jIChuYW1lLCBpbjEsIGluMiwgaW4zKTsgfSB3aGlsZSAoMCkKLQotI2lmbmRlZiBTSVpFX0lOU1RSVUNUSU9OCi0jZGVmaW5lIFNJWkVfSU5TVFJVQ1RJT04gOAotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9PUEVSQU5EUwotI2RlZmluZSBTSVpFX09QRVJBTkRTIDE4Ci0jZW5kaWYKLQotI2lmbmRlZiBTSVpFX1ZBTFVFUwotI2RlZmluZSBTSVpFX1ZBTFVFUyAxMwotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9MT0NBVElPTgotI2RlZmluZSBTSVpFX0xPQ0FUSU9OIDIwCi0jZW5kaWYKLQotI2lmbmRlZiBTSVpFX1BDCi0jZGVmaW5lIFNJWkVfUEMgNgotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9MSU5FX05VTUJFUgotI2RlZmluZSBTSVpFX0xJTkVfTlVNQkVSIDQKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotdHJhY2VfaW5wdXRfZnVuYyAobmFtZSwgaW4xLCBpbjIsIGluMykKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgZW51bSBvcF90eXBlcyBpbjE7Ci0gICAgIGVudW0gb3BfdHlwZXMgaW4yOwotICAgICBlbnVtIG9wX3R5cGVzIGluMzsKLXsKLSAgY2hhciAqY29tbWE7Ci0gIGVudW0gb3BfdHlwZXMgaW5bM107Ci0gIGludCBpOwotICBjaGFyIGJ1ZlsxMDI0XTsKLSAgY2hhciAqcDsKLSAgbG9uZyB0bXA7Ci0gIGNoYXIgKnR5cGU7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbnVtYmVyOwotICBiZmRfdm1hIGJ5dGVfcGM7Ci0KLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfVFJBQ0UpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAoU3RhdGUuaW5zX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBJTlNfVU5LTk9XTjoJCXR5cGUgPSAiID8iOyBicmVhazsKLSAgICBjYXNlIElOU19MRUZUOgkJdHlwZSA9ICIgTCI7IGJyZWFrOwotICAgIGNhc2UgSU5TX1JJR0hUOgkJdHlwZSA9ICIgUiI7IGJyZWFrOwotICAgIGNhc2UgSU5TX0xFRlRfUEFSQUxMRUw6CXR5cGUgPSAiKkwiOyBicmVhazsKLSAgICBjYXNlIElOU19SSUdIVF9QQVJBTExFTDoJdHlwZSA9ICIqUiI7IGJyZWFrOwotICAgIGNhc2UgSU5TX0xFRlRfQ09ORF9URVNUOgl0eXBlID0gIj9MIjsgYnJlYWs7Ci0gICAgY2FzZSBJTlNfUklHSFRfQ09ORF9URVNUOgl0eXBlID0gIj9SIjsgYnJlYWs7Ci0gICAgY2FzZSBJTlNfTEVGVF9DT05EX0VYRToJdHlwZSA9ICImTCI7IGJyZWFrOwotICAgIGNhc2UgSU5TX1JJR0hUX0NPTkRfRVhFOgl0eXBlID0gIiZSIjsgYnJlYWs7Ci0gICAgY2FzZSBJTlNfTE9ORzoJCXR5cGUgPSAiIEIiOyBicmVhazsKLSAgICB9Ci0KLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTElORV9OVU1CRVIpID09IDApCi0gICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgICAiMHglLip4ICVzOiAlLSpzICIsCi0JCQkJICAgICAgIFNJWkVfUEMsICh1bnNpZ25lZClQQywKLQkJCQkgICAgICAgdHlwZSwKLQkJCQkgICAgICAgU0laRV9JTlNUUlVDVElPTiwgbmFtZSk7Ci0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZlswXSA9ICdcMCc7Ci0gICAgICBieXRlX3BjID0gZGVjb2RlX3BjICgpOwotICAgICAgaWYgKHRleHQgJiYgYnl0ZV9wYyA+PSB0ZXh0X3N0YXJ0ICYmIGJ5dGVfcGMgPCB0ZXh0X2VuZCkKLQl7Ci0JICBmaWxlbmFtZSA9IChjb25zdCBjaGFyICopMDsKLQkgIGZ1bmN0aW9ubmFtZSA9IChjb25zdCBjaGFyICopMDsKLQkgIGxpbmVudW1iZXIgPSAwOwotCSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAocHJvZ19iZmQsIHRleHQsIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKTAsIGJ5dGVfcGMgLSB0ZXh0X3N0YXJ0LAotCQkJCSAgICAgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLCAmbGluZW51bWJlcikpCi0JICAgIHsKLQkgICAgICBwID0gYnVmOwotCSAgICAgIGlmIChsaW5lbnVtYmVyKQotCQl7Ci0JCSAgc3ByaW50ZiAocCwgIiMlLSpkICIsIFNJWkVfTElORV9OVU1CRVIsIGxpbmVudW1iZXIpOwotCQkgIHAgKz0gc3RybGVuIChwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNwcmludGYgKHAsICIlLSpzICIsIFNJWkVfTElORV9OVU1CRVIrMSwgIi0tLSIpOwotCQkgIHAgKz0gU0laRV9MSU5FX05VTUJFUisyOwotCQl9Ci0KLQkgICAgICBpZiAoZnVuY3Rpb25uYW1lKQotCQl7Ci0JCSAgc3ByaW50ZiAocCwgIiVzICIsIGZ1bmN0aW9ubmFtZSk7Ci0JCSAgcCArPSBzdHJsZW4gKHApOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoZmlsZW5hbWUpCi0JCXsKLQkJICBjaGFyICpxID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0JCSAgc3ByaW50ZiAocCwgIiVzICIsIChxKSA/IHErMSA6IGZpbGVuYW1lKTsKLQkJICBwICs9IHN0cmxlbiAocCk7Ci0JCX0KLQotCSAgICAgIGlmICgqcCA9PSAnICcpCi0JCSpwID0gJ1wwJzsKLQkgICAgfQotCX0KLQotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCQkgIjB4JS4qeCAlczogJS0qLipzICUtKnMgIiwKLQkJCQkJIFNJWkVfUEMsICh1bnNpZ25lZClQQywKLQkJCQkJIHR5cGUsCi0JCQkJCSBTSVpFX0xPQ0FUSU9OLCBTSVpFX0xPQ0FUSU9OLCBidWYsCi0JCQkJCSBTSVpFX0lOU1RSVUNUSU9OLCBuYW1lKTsKLSAgICB9Ci0KLSAgaW5bMF0gPSBpbjE7Ci0gIGluWzFdID0gaW4yOwotICBpblsyXSA9IGluMzsKLSAgY29tbWEgPSAiIjsKLSAgcCA9IGJ1ZjsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGluW2ldKQotCXsKLQljYXNlIE9QX1ZPSUQ6Ci0JY2FzZSBPUF9SMDoKLQljYXNlIE9QX1IxOgotCWNhc2UgT1BfUjI6Ci0JICBicmVhazsKLQotCWNhc2UgT1BfUkVHOgotCWNhc2UgT1BfUkVHX09VVFBVVDoKLQljYXNlIE9QX0RSRUc6Ci0JY2FzZSBPUF9EUkVHX09VVFBVVDoKLQkgIHNwcmludGYgKHAsICIlc3IlZCIsIGNvbW1hLCBPUFtpXSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9DUjoKLQljYXNlIE9QX0NSX09VVFBVVDoKLQljYXNlIE9QX0NSX1JFVkVSU0U6Ci0JICBzcHJpbnRmIChwLCAiJXNjciVkIiwgY29tbWEsIE9QW2ldKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGNvbW1hID0gIiwiOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QX0FDQ1VNOgotCWNhc2UgT1BfQUNDVU1fT1VUUFVUOgotCWNhc2UgT1BfQUNDVU1fUkVWRVJTRToKLQkgIHNwcmludGYgKHAsICIlc2ElZCIsIGNvbW1hLCBPUFtpXSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9DT05TVEFOVDE2OgotCSAgc3ByaW50ZiAocCwgIiVzJWQiLCBjb21tYSwgT1BbaV0pOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgY29tbWEgPSAiLCI7Ci0JICBicmVhazsKLQotCWNhc2UgT1BfQ09OU1RBTlQ4OgotCSAgc3ByaW50ZiAocCwgIiVzJWQiLCBjb21tYSwgU0VYVDgoT1BbaV0pKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGNvbW1hID0gIiwiOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QX0NPTlNUQU5UNDoKLQkgIHNwcmludGYgKHAsICIlcyVkIiwgY29tbWEsIFNFWFQ0KE9QW2ldKSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9DT05TVEFOVDM6Ci0JICBzcHJpbnRmIChwLCAiJXMlZCIsIGNvbW1hLCBTRVhUMyhPUFtpXSkpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgY29tbWEgPSAiLCI7Ci0JICBicmVhazsKLQotCWNhc2UgT1BfTUVNUkVGOgotCSAgc3ByaW50ZiAocCwgIiVzQHIlZCIsIGNvbW1hLCBPUFtpXSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9NRU1SRUYyOgotCSAgc3ByaW50ZiAocCwgIiVzQCglZCxyJWQpIiwgY29tbWEsIChpbnQxNilPUFtpXSwgT1BbaSsxXSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9NRU1SRUYzOgotCSAgc3ByaW50ZiAocCwgIiVzQCVkIiwgY29tbWEsIE9QW2ldKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGNvbW1hID0gIiwiOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QX1BPU1RJTkM6Ci0JICBzcHJpbnRmIChwLCAiJXNAciVkKyIsIGNvbW1hLCBPUFtpXSk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9QT1NUREVDOgotCSAgc3ByaW50ZiAocCwgIiVzQHIlZC0iLCBjb21tYSwgT1BbaV0pOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgY29tbWEgPSAiLCI7Ci0JICBicmVhazsKLQotCWNhc2UgT1BfUFJFREVDOgotCSAgc3ByaW50ZiAocCwgIiVzQC1yJWQiLCBjb21tYSwgT1BbaV0pOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgY29tbWEgPSAiLCI7Ci0JICBicmVhazsKLQotCWNhc2UgT1BfRkxBRzoKLQljYXNlIE9QX0ZMQUdfT1VUUFVUOgotCSAgaWYgKE9QW2ldID09IDApCi0JICAgIHNwcmludGYgKHAsICIlc2YwIiwgY29tbWEpOwotCi0JICBlbHNlIGlmIChPUFtpXSA9PSAxKQotCSAgICBzcHJpbnRmIChwLCAiJXNmMSIsIGNvbW1hKTsKLQotCSAgZWxzZQotCSAgICBzcHJpbnRmIChwLCAiJXNjIiwgY29tbWEpOwotCi0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBjb21tYSA9ICIsIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfVkFMVUVTKSA9PSAwKQotICAgIHsKLSAgICAgICpwKysgPSAnXG4nOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJXMiLCBidWYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUtKnMiLCBTSVpFX09QRVJBTkRTLCBidWYpOwotCi0gICAgICBwID0gYnVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQl7Ci0JICBidWZbMF0gPSAnXDAnOwotCSAgc3dpdGNoIChpbltpXSkKLQkgICAgewotCSAgICBjYXNlIE9QX1ZPSUQ6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzIiwgU0laRV9WQUxVRVMsICIiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX1JFR19PVVRQVVQ6Ci0JICAgIGNhc2UgT1BfRFJFR19PVVRQVVQ6Ci0JICAgIGNhc2UgT1BfQ1JfT1VUUFVUOgotCSAgICBjYXNlIE9QX0FDQ1VNX09VVFBVVDoKLQkgICAgY2FzZSBPUF9GTEFHX09VVFBVVDoKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMiLCBTSVpFX1ZBTFVFUywgIi0tLSIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1BfUkVHOgotCSAgICBjYXNlIE9QX01FTVJFRjoKLQkgICAgY2FzZSBPUF9QT1NUREVDOgotCSAgICBjYXNlIE9QX1BPU1RJTkM6Ci0JICAgIGNhc2UgT1BfUFJFREVDOgotCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAotCQkJCQkJICh1aW50MTYpIEdQUiAoT1BbaV0pKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX01FTVJFRjM6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsICh1aW50MTYpIE9QW2ldKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX0RSRUc6Ci0JICAgICAgdG1wID0gKGxvbmcpKCgoKHVpbnQzMikgR1BSIChPUFtpXSkpIDw8IDE2KSB8ICgodWludDMyKSBHUFIgKE9QW2ldICsgMSkpKTsKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuOGx4IiwgU0laRV9WQUxVRVMtMTAsICIiLCB0bXApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1BfQ1I6Ci0JICAgIGNhc2UgT1BfQ1JfUkVWRVJTRToKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKLQkJCQkJCSAodWludDE2KSBDUkVHIChPUFtpXSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1BfQUNDVU06Ci0JICAgIGNhc2UgT1BfQUNDVU1fUkVWRVJTRToKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuMnglLjhseCIsIFNJWkVfVkFMVUVTLTEyLCAiIiwKLQkJCQkJCSAoKGludCkoQUNDIChPUFtpXSkgPj4gMzIpICYgMHhmZiksCi0JCQkJCQkgKCh1bnNpZ25lZCBsb25nKSBBQ0MgKE9QW2ldKSkgJiAweGZmZmZmZmZmKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX0NPTlNUQU5UMTY6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgKHVpbnQxNilPUFtpXSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPUF9DT05TVEFOVDQ6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgKHVpbnQxNilTRVhUNChPUFtpXSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1BfQ09OU1RBTlQ4OgotCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAotCQkJCQkJICh1aW50MTYpU0VYVDgoT1BbaV0pKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX0NPTlNUQU5UMzoKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKLQkJCQkJCSAodWludDE2KVNFWFQzKE9QW2ldKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPUF9GTEFHOgotCSAgICAgIGlmIChPUFtpXSA9PSAwKQotCQkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnNGMCA9ICVkIiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgICBQU1dfRjAgIT0gMCk7Ci0KLQkgICAgICBlbHNlIGlmIChPUFtpXSA9PSAxKQotCQkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnNGMSA9ICVkIiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgICBQU1dfRjEgIT0gMCk7Ci0KLQkgICAgICBlbHNlCi0JCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqc0MgPSAlZCIsIFNJWkVfVkFMVUVTLTUsICIiLAotCQkJCQkJICAgUFNXX0MgIT0gMCk7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX01FTVJFRjI6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgKHVpbnQxNilPUFtpXSk7Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgKHVpbnQxNilHUFIgKE9QW2kgKyAxXSkpOwotCSAgICAgIGkrKzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9QX1IwOgotCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAotCQkJCQkJICh1aW50MTYpIEdQUiAoMCkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1BfUjE6Ci0JICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCi0JCQkJCQkgKHVpbnQxNikgR1BSICgxKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPUF9SMjoKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKLQkJCQkJCSAodWludDE2KSBHUFIgKDIpKTsKLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLQotICAoKmQxMHZfY2FsbGJhY2stPmZsdXNoX3N0ZG91dCkgKGQxMHZfY2FsbGJhY2spOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdHJhY2Vfb3V0cHV0X2ZsdXNoICh2b2lkKQotewotICAoKmQxMHZfY2FsbGJhY2stPmZsdXNoX3N0ZG91dCkgKGQxMHZfY2FsbGJhY2spOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdHJhY2Vfb3V0cHV0X2ZpbmlzaCAodm9pZCkKLXsKLSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCSAgICAgIiBGMD0lZCBGMT0lZCBDPSVkXG4iLAotCQkJCSAgICAgKFN0YXRlLnRyYWNlLnBzdyAmIFBTV19GMF9CSVQpICE9IDAsCi0JCQkJICAgICAoU3RhdGUudHJhY2UucHN3ICYgUFNXX0YxX0JJVCkgIT0gMCwKLQkJCQkgICAgIChTdGF0ZS50cmFjZS5wc3cgJiBQU1dfQ19CSVQpICE9IDApOwotICAoKmQxMHZfY2FsbGJhY2stPmZsdXNoX3N0ZG91dCkgKGQxMHZfY2FsbGJhY2spOwotfQotCi1zdGF0aWMgdm9pZAotdHJhY2Vfb3V0cHV0XzQwICh1aW50NjQgdmFsKQotewotICBpZiAoKGQxMHZfZGVidWcgJiAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKSA9PSAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkJICIgOjogJSpzMHglLjJ4JS44bHgiLAotCQkJCQkgU0laRV9WQUxVRVMgLSAxMiwKLQkJCQkJICIiLAotCQkJCQkgKChpbnQpKHZhbCA+PiAzMikgJiAweGZmKSwKLQkJCQkJICgodW5zaWduZWQgbG9uZykgdmFsKSAmIDB4ZmZmZmZmZmYpOwotICAgICAgZG9fdHJhY2Vfb3V0cHV0X2ZpbmlzaCAoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10cmFjZV9vdXRwdXRfMzIgKHVpbnQzMiB2YWwpCi17Ci0gIGlmICgoZDEwdl9kZWJ1ZyAmIChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpID09IChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCQkgIiA6OiAlKnMweCUuOHgiLAotCQkJCQkgU0laRV9WQUxVRVMgLSAxMCwKLQkJCQkJICIiLAotCQkJCQkgKGludCkgdmFsKTsKLSAgICAgIGRvX3RyYWNlX291dHB1dF9maW5pc2ggKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdHJhY2Vfb3V0cHV0XzE2ICh1aW50MTYgdmFsKQotewotICBpZiAoKGQxMHZfZGVidWcgJiAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKSA9PSAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKLQkJCQkJICIgOjogJSpzMHglLjR4IiwKLQkJCQkJIFNJWkVfVkFMVUVTIC0gNiwKLQkJCQkJICIiLAotCQkJCQkgKGludCkgdmFsKTsKLSAgICAgIGRvX3RyYWNlX291dHB1dF9maW5pc2ggKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdHJhY2Vfb3V0cHV0X3ZvaWQgKCkKLXsKLSAgaWYgKChkMTB2X2RlYnVnICYgKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkgPT0gKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJcbiIpOwotICAgICAgZG9fdHJhY2Vfb3V0cHV0X2ZsdXNoICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXRyYWNlX291dHB1dF9mbGFnICgpCi17Ci0gIGlmICgoZDEwdl9kZWJ1ZyAmIChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpID09IChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAotCQkJCQkgIiA6OiAlKnMiLAotCQkJCQkgU0laRV9WQUxVRVMsCi0JCQkJCSAiIik7Ci0gICAgICBkb190cmFjZV9vdXRwdXRfZmluaXNoICgpOwotICAgIH0KLX0KLQotCi0KLQotI2Vsc2UKLSNkZWZpbmUgdHJhY2VfaW5wdXQoTkFNRSwgSU4xLCBJTjIsIElOMykKLSNkZWZpbmUgdHJhY2Vfb3V0cHV0KFJFU1VMVCkKLSNlbmRpZgotCi0vKiBhYnMgKi8KLXZvaWQKLU9QXzQ2MDcgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoImFicyIsIE9QX1JFRywgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIHRtcCA9IEdQUihPUFswXSk7Ci0gIGlmICh0bXAgPCAwKQotICAgIHsKLSAgICAgIHRtcCA9IC0gdG1wOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgU0VUX1BTV19GMCAoMCk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIGFicyAqLwotdm9pZAotT1BfNTYwNyAoKQotewotICBpbnQ2NCB0bXA7Ci0gIHRyYWNlX2lucHV0ICgiYWJzIiwgT1BfQUNDVU0sIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotCi0gIHRtcCA9IFNFWFQ0MCAoQUNDIChPUFswXSkpOwotICBpZiAodG1wIDwgMCApCi0gICAgewotICAgICAgdG1wID0gLSB0bXA7Ci0gICAgICBpZiAoUFNXX1NUKQotCXsKLQkgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQotCSAgICB0bXAgPSAoTUFYMzIpOwotCSAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQkgICAgdG1wID0gKE1JTjMyKTsKLQkgIGVsc2UKLQkgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0JfQotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIGFkZCAqLwotdm9pZAotT1BfMjAwICgpCi17Ci0gIHVpbnQxNiBhID0gR1BSIChPUFswXSk7Ci0gIHVpbnQxNiBiID0gR1BSIChPUFsxXSk7Ci0gIHVpbnQxNiB0bXAgPSAoYSArIGIpOwotICB0cmFjZV9pbnB1dCAoImFkZCIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKLSAgU0VUX1BTV19DIChhID4gdG1wKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogYWRkICovCi12b2lkCi1PUF8xMjAxICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMF0pKSArIChTRVhUMTYgKEdQUiAoT1BbMV0pKSA8PCAxNiB8IEdQUiAoT1BbMV0gKyAxKSk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9WT0lEKTsKLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBhZGQgKi8KLXZvaWQKLU9QXzEyMDMgKCkKLXsKLSAgaW50NjQgdG1wOwotICB0bXAgPSBTRVhUNDAoQUNDIChPUFswXSkpICsgU0VYVDQwKEFDQyAoT1BbMV0pKTsKLQotICB0cmFjZV9pbnB1dCAoImFkZCIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIGlmIChQU1dfU1QpCi0gICAgewotICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCi0JdG1wID0gKE1BWDMyKTsKLSAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCi0JdG1wID0gKE1JTjMyKTsKLSAgICAgIGVsc2UKLQl0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogYWRkMncgKi8KLXZvaWQKLU9QXzEyMDAgKCkKLXsKLSAgdWludDMyIHRtcDsKLSAgdWludDMyIGEgPSAoR1BSIChPUFswXSkpIDw8IDE2IHwgR1BSIChPUFswXSArIDEpOwotICB1aW50MzIgYiA9IChHUFIgKE9QWzFdKSkgPDwgMTYgfCBHUFIgKE9QWzFdICsgMSk7Ci0gIHRyYWNlX2lucHV0ICgiYWRkMnciLCBPUF9EUkVHLCBPUF9EUkVHLCBPUF9WT0lEKTsKLSAgdG1wID0gYSArIGI7Ci0gIFNFVF9QU1dfQyAodG1wIDwgYSk7Ci0gIFNFVF9HUFIgKE9QWzBdICsgMCwgKHRtcCA+PiAxNikpOwotICBTRVRfR1BSIChPUFswXSArIDEsICh0bXAgJiAweEZGRkYpKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBhZGQzICovCi12b2lkCi1PUF8xMDAwMDAwICgpCi17Ci0gIHVpbnQxNiBhID0gR1BSIChPUFsxXSk7Ci0gIHVpbnQxNiBiID0gT1BbMl07Ci0gIHVpbnQxNiB0bXAgPSAoYSArIGIpOwotICB0cmFjZV9pbnB1dCAoImFkZDMiLCBPUF9SRUdfT1VUUFVULCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYpOwotICBTRVRfUFNXX0MgKHRtcCA8IGEpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBhZGRhYzMgKi8KLXZvaWQKLU9QXzE3MDAwMjAwICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMl0pKSArIFNFWFQ0MCAoKEdQUiAoT1BbMV0pIDw8IDE2KSB8IEdQUiAoT1BbMV0gKyAxKSk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGRhYzMiLCBPUF9EUkVHX09VVFBVVCwgT1BfRFJFRywgT1BfQUNDVU0pOwotICBTRVRfR1BSIChPUFswXSArIDAsICgodG1wID4+IDE2KSAmIDB4ZmZmZikpOwotICBTRVRfR1BSIChPUFswXSArIDEsICh0bXAgJiAweGZmZmYpKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBhZGRhYzMgKi8KLXZvaWQKLU9QXzE3MDAwMjAyICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMV0pKSArIFNFWFQ0MChBQ0MgKE9QWzJdKSk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGRhYzMiLCBPUF9EUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX0FDQ1VNKTsKLSAgU0VUX0dQUiAoT1BbMF0gKyAwLCAodG1wID4+IDE2KSAmIDB4ZmZmZik7Ci0gIFNFVF9HUFIgKE9QWzBdICsgMSwgdG1wICYgMHhmZmZmKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBhZGRhYzNzICovCi12b2lkCi1PUF8xNzAwMTIwMCAoKQotewotICBpbnQ2NCB0bXA7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGRhYzNzIiwgT1BfRFJFR19PVVRQVVQsIE9QX0RSRUcsIE9QX0FDQ1VNKTsKLSAgdG1wID0gU0VYVDQwIChBQ0MgKE9QWzJdKSkgKyBTRVhUNDAgKChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpOwotICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLSAgICB7Ci0gICAgICB0bXAgPSAoTUFYMzIpOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfSAgICAgIAotICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQotICAgIHsKLSAgICAgIHRtcCA9IChNSU4zMik7Ci0gICAgICBTRVRfUFNXX0YwICgxKTsKLSAgICB9ICAgICAgCi0gIGVsc2UKLSAgICB7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9ICAgICAgCi0gIFNFVF9HUFIgKE9QWzBdICsgMCwgKHRtcCA+PiAxNikgJiAweGZmZmYpOwotICBTRVRfR1BSIChPUFswXSArIDEsICh0bXAgJiAweGZmZmYpKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBhZGRhYzNzICovCi12b2lkCi1PUF8xNzAwMTIwMiAoKQotewotICBpbnQ2NCB0bXA7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGRhYzNzIiwgT1BfRFJFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9BQ0NVTSk7Ci0gIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzFdKSkgKyBTRVhUNDAoQUNDIChPUFsyXSkpOwotICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLSAgICB7Ci0gICAgICB0bXAgPSAoTUFYMzIpOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfSAgICAgIAotICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQotICAgIHsKLSAgICAgIHRtcCA9IChNSU4zMik7Ci0gICAgICBTRVRfUFNXX0YwICgxKTsKLSAgICB9ICAgICAgCi0gIGVsc2UKLSAgICB7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9ICAgICAgCi0gIFNFVF9HUFIgKE9QWzBdICsgMCwgKHRtcCA+PiAxNikgJiAweGZmZmYpOwotICBTRVRfR1BSIChPUFswXSArIDEsICh0bXAgJiAweGZmZmYpKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBhZGRpICovCi12b2lkCi1PUF8yMDEgKCkKLXsKLSAgdWludDE2IGEgPSBHUFIgKE9QWzBdKTsKLSAgdWludDE2IGI7Ci0gIHVpbnQxNiB0bXA7Ci0gIGlmIChPUFsxXSA9PSAwKQotICAgIE9QWzFdID0gMTY7Ci0gIGIgPSBPUFsxXTsKLSAgdG1wID0gKGEgKyBiKTsKLSAgdHJhY2VfaW5wdXQgKCJhZGRpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKLSAgU0VUX1BTV19DICh0bXAgPCBhKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogYW5kICovCi12b2lkCi1PUF9DMDAgKCkKLXsKLSAgdWludDE2IHRtcCA9IEdQUiAoT1BbMF0pICYgR1BSIChPUFsxXSk7Ci0gIHRyYWNlX2lucHV0ICgiYW5kIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBhbmQzICovCi12b2lkCi1PUF82MDAwMDAwICgpCi17Ci0gIHVpbnQxNiB0bXAgPSBHUFIgKE9QWzFdKSAmIE9QWzJdOwotICB0cmFjZV9pbnB1dCAoImFuZDMiLCBPUF9SRUdfT1VUUFVULCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBiY2xyaSAqLwotdm9pZAotT1BfQzAxICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJiY2xyaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIHRtcCA9IChHUFIgKE9QWzBdKSAmfigweDgwMDAgPj4gT1BbMV0pKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogYmwucyAqLwotdm9pZAotT1BfNDkwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImJsLnMiLCBPUF9DT05TVEFOVDgsIE9QX1IwLCBPUF9SMSk7Ci0gIFNFVF9HUFIgKDEzLCBQQyArIDEpOwotICBKTVAoIFBDICsgU0VYVDggKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBibC5sICovCi12b2lkCi1PUF8yNDgwMDAwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImJsLmwiLCBPUF9DT05TVEFOVDE2LCBPUF9SMCwgT1BfUjEpOwotICBTRVRfR1BSICgxMywgKFBDICsgMSkpOwotICBKTVAgKFBDICsgT1BbMF0pOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogYm5vdGkgKi8KLXZvaWQKLU9QX0EwMSAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgiYm5vdGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICB0bXAgPSAoR1BSIChPUFswXSkgXiAoMHg4MDAwID4+IE9QWzFdKSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIGJyYS5zICovCi12b2lkCi1PUF80ODAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiYnJhLnMiLCBPUF9DT05TVEFOVDgsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBKTVAgKFBDICsgU0VYVDggKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBicmEubCAqLwotdm9pZAotT1BfMjQwMDAwMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJicmEubCIsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBKTVAgKFBDICsgT1BbMF0pOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogYnJmMGYucyAqLwotdm9pZAotT1BfNEEwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImJyZjBmLnMiLCBPUF9DT05TVEFOVDgsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBpZiAoIVBTV19GMCkKLSAgICBKTVAgKFBDICsgU0VYVDggKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBicmYwZi5sICovCi12b2lkCi1PUF8yNTAwMDAwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImJyZjBmLmwiLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgaWYgKCFQU1dfRjApCi0gICAgSk1QIChQQyArIE9QWzBdKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGJyZjB0LnMgKi8KLXZvaWQKLU9QXzRCMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJicmYwdC5zIiwgT1BfQ09OU1RBTlQ4LCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgaWYgKFBTV19GMCkKLSAgICBKTVAgKFBDICsgU0VYVDggKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBicmYwdC5sICovCi12b2lkCi1PUF8yNTgwMDAwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImJyZjB0LmwiLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgaWYgKFBTV19GMCkKLSAgICBKTVAgKFBDICsgT1BbMF0pOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogYnNldGkgKi8KLXZvaWQKLU9QXzgwMSAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgiYnNldGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICB0bXAgPSAoR1BSIChPUFswXSkgfCAoMHg4MDAwID4+IE9QWzFdKSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIGJ0c3RpICovCi12b2lkCi1PUF9FMDEgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJidHN0aSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKChHUFIgKE9QWzBdKSAmICgweDgwMDAgPj4gT1BbMV0pKSA/IDEgOiAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGNscmFjICovCi12b2lkCi1PUF81NjAxICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiY2xyYWMiLCBPUF9BQ0NVTV9PVVRQVVQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTRVRfQUNDIChPUFswXSwgMCk7Ci0gIHRyYWNlX291dHB1dF80MCAoMCk7Ci19Ci0KLS8qIGNtcCAqLwotdm9pZAotT1BfNjAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiY21wIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBTRVRfUFNXX0YwICgoKGludDE2KShHUFIgKE9QWzBdKSkgPCAoaW50MTYpKEdQUiAoT1BbMV0pKSkgPyAxIDogMCk7Ci0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBjbXAgKi8KLXZvaWQKLU9QXzE2MDMgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJjbXAiLCBPUF9BQ0NVTSwgT1BfQUNDVU0sIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBTRVRfUFNXX0YwICgoU0VYVDQwKEFDQyAoT1BbMF0pKSA8IFNFWFQ0MChBQ0MgKE9QWzFdKSkpID8gMSA6IDApOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wZXEgKi8KLXZvaWQKLU9QXzQwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImNtcGVxIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgPT0gR1BSIChPUFsxXSkpID8gMSA6IDApOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wZXEgKi8KLXZvaWQKLU9QXzE0MDMgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJjbXBlcSIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKCgoQUNDIChPUFswXSkgJiBNQVNLNDApID09IChBQ0MgKE9QWzFdKSAmIE1BU0s0MCkpID8gMSA6IDApOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wZXFpLnMgKi8KLXZvaWQKLU9QXzQwMSAoKQotewotICB0cmFjZV9pbnB1dCAoImNtcGVxaS5zIiwgT1BfUkVHLCBPUF9DT05TVEFOVDQsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgPT0gKHJlZ190KSBTRVhUNCAoT1BbMV0pKSA/IDEgOiAwKTsgIAotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wZXFpLmwgKi8KLXZvaWQKLU9QXzIwMDAwMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJjbXBlcWkubCIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKChHUFIgKE9QWzBdKSA9PSAocmVnX3QpT1BbMV0pID8gMSA6IDApOyAgCi0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBjbXBpLnMgKi8KLXZvaWQKLU9QXzYwMSAoKQotewotICB0cmFjZV9pbnB1dCAoImNtcGkucyIsIE9QX1JFRywgT1BfQ09OU1RBTlQ0LCBPUF9WT0lEKTsKLSAgU0VUX1BTV19GMSAoUFNXX0YwKTsKLSAgU0VUX1BTV19GMCAoKChpbnQxNikoR1BSIChPUFswXSkpIDwgKGludDE2KVNFWFQ0KE9QWzFdKSkgPyAxIDogMCk7ICAKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGNtcGkubCAqLwotdm9pZAotT1BfMzAwMDAwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImNtcGkubCIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKCgoaW50MTYpKEdQUiAoT1BbMF0pKSA8IChpbnQxNikoT1BbMV0pKSA/IDEgOiAwKTsgIAotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wdSAqLwotdm9pZAotT1BfNDYwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImNtcHUiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKChHUFIgKE9QWzBdKSA8IEdQUiAoT1BbMV0pKSA/IDEgOiAwKTsgIAotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogY21wdWkgKi8KLXZvaWQKLU9QXzIzMDAwMDAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiY21wdWkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgPCAocmVnX3QpT1BbMV0pID8gMSA6IDApOyAgCi0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBjcGZnICovCi12b2lkCi1PUF80RTA5ICgpCi17Ci0gIHVpbnQ4IHZhbDsKLSAgCi0gIHRyYWNlX2lucHV0ICgiY3BmZyIsIE9QX0ZMQUdfT1VUUFVULCBPUF9GTEFHLCBPUF9WT0lEKTsKLSAgCi0gIGlmIChPUFsxXSA9PSAwKQotICAgIHZhbCA9IFBTV19GMDsKLSAgZWxzZSBpZiAoT1BbMV0gPT0gMSkKLSAgICB2YWwgPSBQU1dfRjE7Ci0gIGVsc2UKLSAgICB2YWwgPSBQU1dfQzsKLSAgaWYgKE9QWzBdID09IDApCi0gICAgU0VUX1BTV19GMCAodmFsKTsKLSAgZWxzZQotICAgIFNFVF9QU1dfRjEgKHZhbCk7Ci0KLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGNwZmcgKi8KLXZvaWQKLU9QXzRFMEYgKCkKLXsKLSAgdWludDggdmFsOwotICAKLSAgdHJhY2VfaW5wdXQgKCJjcGZnIiwgT1BfRkxBR19PVVRQVVQsIE9QX0ZMQUcsIE9QX1ZPSUQpOwotICAKLSAgaWYgKE9QWzFdID09IDApCi0gICAgdmFsID0gUFNXX0YwOwotICBlbHNlIGlmIChPUFsxXSA9PSAxKQotICAgIHZhbCA9IFBTV19GMTsKLSAgZWxzZQotICAgIHZhbCA9IFBTV19DOwotICBpZiAoT1BbMF0gPT0gMCkKLSAgICBTRVRfUFNXX0YwICh2YWwpOwotICBlbHNlCi0gICAgU0VUX1BTV19GMSAodmFsKTsKLQotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogZGJ0ICovCi12b2lkCi1PUF81RjIwICgpCi17Ci0gIC8qIGQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZChkMTB2X2NhbGxiYWNrLCAiKioqKiogREJUICoqKioqICBQQz0leFxuIixQQyk7ICovCi0KLSAgLyogR0RCIHVzZXMgdGhlIGluc3RydWN0aW9uIHBhaXIgYGBkYnQgfHwgbm9wJycgYXMgYSBicmVhay1wb2ludC4KLSAgICAgVGhlIGNvbmRpdGlvbmFsIGJlbG93IGlzIGZvciBlaXRoZXIgb2YgdGhlIGluc3RydWN0aW9uIHBhaXJzCi0gICAgIGBgZGJ0IC0+IFhYWCcnIG9yIGBgZGJ0IDwtIFhYWCcnIGFuZCB0cmVhdHMgdGhlbSBhcyBhcyBjYXNlcwotICAgICB3aGVyZSB0aGUgZGJ0IGluc3RydWN0aW9uIHNob3VsZCBiZSBpbnRlcnByZXRlZC4KLQotICAgICBUaGUgbW9kdWxlIGBzaW0tYnJlYWsnIHByb3ZpZGVzIGEgbW9yZSBlZmZlY3RpdmUgbWVjaGFuaXNtIGZvcgotICAgICBkZXRlY3RpbmcgR0RCIHBsYW50ZWQgYnJlYWtwb2ludHMuICBUaGUgY29kZSBiZWxvdyBtYXksCi0gICAgIGV2ZW50dWFsbHksIGJlIGNoYW5nZWQgdG8gdXNlIHRoYXQgbWVjaGFuaXNtLiAqLwotCi0gIGlmIChTdGF0ZS5pbnNfdHlwZSA9PSBJTlNfTEVGVAotICAgICAgfHwgU3RhdGUuaW5zX3R5cGUgPT0gSU5TX1JJR0hUKQotICAgIHsKLSAgICAgIHRyYWNlX2lucHV0ICgiZGJ0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gICAgICBTRVRfRFBDIChQQyArIDEpOwotICAgICAgU0VUX0RQU1cgKFBTVyk7Ci0gICAgICBTRVRfSFdfUFNXIChQU1dfRE1fQklUIHwgKFBTVyAmIChQU1dfRjBfQklUIHwgUFNXX0YxX0JJVCB8IFBTV19DX0JJVCkpKTsKLSAgICAgIEpNUCAoREJUX1ZFQ1RPUl9TVEFSVCk7Ci0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOwotICAgIH0KLX0KLQotLyogZGl2cyAqLwotdm9pZAotT1BfMTQwMDI4MDAgKCkKLXsKLSAgdWludDE2IGZvbywgdG1wLCB0bXBmOwotICB1aW50MTYgaGk7Ci0gIHVpbnQxNiBsbzsKLQotICB0cmFjZV9pbnB1dCAoImRpdnMiLCBPUF9EUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBmb28gPSAoR1BSIChPUFswXSkgPDwgMSkgfCAoR1BSIChPUFswXSArIDEpID4+IDE1KTsKLSAgdG1wID0gKGludDE2KWZvbyAtIChpbnQxNikoR1BSIChPUFsxXSkpOwotICB0bXBmID0gKGZvbyA+PSBHUFIgKE9QWzFdKSkgPyAxIDogMDsKLSAgaGkgPSAoKHRtcGYgPT0gMSkgPyB0bXAgOiBmb28pOwotICBsbyA9ICgoR1BSIChPUFswXSArIDEpIDw8IDEpIHwgdG1wZik7Ci0gIFNFVF9HUFIgKE9QWzBdICsgMCwgaGkpOwotICBTRVRfR1BSIChPUFswXSArIDEsIGxvKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICgoKHVpbnQzMikgaGkgPDwgMTYpIHwgbG8pOwotfQotCi0vKiBleGVmMGYgKi8KLXZvaWQKLU9QXzRFMDQgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJleGVmMGYiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgU3RhdGUuZXhlID0gKFBTV19GMCA9PSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4ZWYwdCAqLwotdm9pZAotT1BfNEUyNCAoKQotewotICB0cmFjZV9pbnB1dCAoImV4ZWYwdCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGUgPSAoUFNXX0YwICE9IDApOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogZXhlZjFmICovCi12b2lkCi1PUF80RTQwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiZXhlZjFmIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIFN0YXRlLmV4ZSA9IChQU1dfRjEgPT0gMCk7Ci0gIHRyYWNlX291dHB1dF9mbGFnICgpOwotfQotCi0vKiBleGVmMXQgKi8KLXZvaWQKLU9QXzRFNDIgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJleGVmMXQiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgU3RhdGUuZXhlID0gKFBTV19GMSAhPSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4ZWZhZiAqLwotdm9pZAotT1BfNEUwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImV4ZWZhZiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGUgPSAoUFNXX0YwID09IDApICYgKFBTV19GMSA9PSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4ZWZhdCAqLwotdm9pZAotT1BfNEUwMiAoKQotewotICB0cmFjZV9pbnB1dCAoImV4ZWZhdCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGUgPSAoUFNXX0YwID09IDApICYgKFBTV19GMSAhPSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4ZXRhZiAqLwotdm9pZAotT1BfNEUyMCAoKQotewotICB0cmFjZV9pbnB1dCAoImV4ZXRhZiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGUgPSAoUFNXX0YwICE9IDApICYgKFBTV19GMSA9PSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4ZXRhdCAqLwotdm9pZAotT1BfNEUyMiAoKQotewotICB0cmFjZV9pbnB1dCAoImV4ZXRhdCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGUgPSAoUFNXX0YwICE9IDApICYgKFBTV19GMSAhPSAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIGV4cCAqLwotdm9pZAotT1BfMTUwMDJBMDAgKCkKLXsKLSAgdWludDMyIHRtcCwgZm9vOwotICBpbnQgaTsKLQotICB0cmFjZV9pbnB1dCAoImV4cCIsIE9QX1JFR19PVVRQVVQsIE9QX0RSRUcsIE9QX1ZPSUQpOwotICBpZiAoKChpbnQxNilHUFIgKE9QWzFdKSkgPj0gMCkKLSAgICB0bXAgPSAoR1BSIChPUFsxXSkgPDwgMTYpIHwgR1BSIChPUFsxXSArIDEpOwotICBlbHNlCi0gICAgdG1wID0gfigoR1BSIChPUFsxXSkgPDwgMTYpIHwgR1BSIChPUFsxXSArIDEpKTsKLSAgCi0gIGZvbyA9IDB4NDAwMDAwMDA7Ci0gIGZvciAoaT0xO2k8MTc7aSsrKQotICAgIHsKLSAgICAgIGlmICh0bXAgJiBmb28pCi0JewotCSAgU0VUX0dQUiAoT1BbMF0sIChpIC0gMSkpOwotCSAgdHJhY2Vfb3V0cHV0XzE2IChpIC0gMSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZm9vID4+PSAxOwotICAgIH0KLSAgU0VUX0dQUiAoT1BbMF0sIDE2KTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICgxNik7Ci19Ci0KLS8qIGV4cCAqLwotdm9pZAotT1BfMTUwMDJBMDIgKCkKLXsKLSAgaW50NjQgdG1wLCBmb287Ci0gIGludCBpOwotCi0gIHRyYWNlX2lucHV0ICgiZXhwIiwgT1BfUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX1ZPSUQpOwotICB0bXAgPSBTRVhUNDAoQUNDIChPUFsxXSkpOwotICBpZiAodG1wIDwgMCkKLSAgICB0bXAgPSB+dG1wICYgTUFTSzQwOwotICAKLSAgZm9vID0gMHg0MDAwMDAwMDAwTEw7Ci0gIGZvciAoaT0xO2k8MjU7aSsrKQotICAgIHsKLSAgICAgIGlmICh0bXAgJiBmb28pCi0JewotCSAgU0VUX0dQUiAoT1BbMF0sIGkgLSA5KTsKLQkgIHRyYWNlX291dHB1dF8xNiAoaSAtIDkpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGZvbyA+Pj0gMTsKLSAgICB9Ci0gIFNFVF9HUFIgKE9QWzBdLCAxNik7Ci0gIHRyYWNlX291dHB1dF8xNiAoMTYpOwotfQotCi0vKiBqbCAqLwotdm9pZAotT1BfNEQwMCAoKQotewotICB0cmFjZV9pbnB1dCAoImpsIiwgT1BfUkVHLCBPUF9SMCwgT1BfUjEpOwotICBTRVRfR1BSICgxMywgUEMgKyAxKTsKLSAgSk1QIChHUFIgKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBqbXAgKi8KLXZvaWQKLU9QXzRDMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJqbXAiLCBPUF9SRUcsCi0JICAgICAgIChPUFswXSA9PSAxMykgPyBPUF9SMCA6IE9QX1ZPSUQsCi0JICAgICAgIChPUFswXSA9PSAxMykgPyBPUF9SMSA6IE9QX1ZPSUQpOwotCi0gIEpNUCAoR1BSIChPUFswXSkpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogbGQgKi8KLXZvaWQKLU9QXzMwMDAwMDAwICgpCi17Ci0gIHVpbnQxNiB0bXA7Ci0gIHVpbnQxNiBhZGRyID0gT1BbMV0gKyBHUFIgKE9QWzJdKTsKLSAgdHJhY2VfaW5wdXQgKCJsZCIsIE9QX1JFR19PVVRQVVQsIE9QX01FTVJFRjIsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdG1wID0gUlcgKGFkZHIpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBsZCAqLwotdm9pZAotT1BfNjQwMSAoKQotewotICB1aW50MTYgdG1wOwotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoImxkIiwgT1BfUkVHX09VVFBVVCwgT1BfUE9TVERFQywgT1BfVk9JRCk7Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0bXAgPSBSVyAoYWRkcik7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICBpZiAoT1BbMF0gIT0gT1BbMV0pCi0gICAgSU5DX0FERFIgKE9QWzFdLCAtMik7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbGQgKi8KLXZvaWQKLU9QXzYwMDEgKCkKLXsKLSAgdWludDE2IHRtcDsKLSAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKTsKLSAgdHJhY2VfaW5wdXQgKCJsZCIsIE9QX1JFR19PVVRQVVQsIE9QX1BPU1RJTkMsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdG1wID0gUlcgKGFkZHIpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgaWYgKE9QWzBdICE9IE9QWzFdKQotICAgIElOQ19BRERSIChPUFsxXSwgMik7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbGQgKi8KLXZvaWQKLU9QXzYwMDAgKCkKLXsKLSAgdWludDE2IHRtcDsKLSAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKTsKLSAgdHJhY2VfaW5wdXQgKCJsZCIsIE9QX1JFR19PVVRQVVQsIE9QX01FTVJFRiwgT1BfVk9JRCk7Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0bXAgPSBSVyAoYWRkcik7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIGxkICovCi12b2lkCi1PUF8zMjAxMDAwMCAoKQotewotICB1aW50MTYgdG1wOwotICB1aW50MTYgYWRkciA9IE9QWzFdOwotICB0cmFjZV9pbnB1dCAoImxkIiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGMywgT1BfVk9JRCk7Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0bXAgPSBSVyAoYWRkcik7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIGxkMncgKi8KLXZvaWQKLU9QXzMxMDAwMDAwICgpCi17Ci0gIGludDMyIHRtcDsKLSAgdWludDE2IGFkZHIgPSBPUFsxXSArIEdQUiAoT1BbMl0pOwotICB0cmFjZV9pbnB1dCAoImxkMnciLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRtcCA9IFJMVyAoYWRkcik7Ci0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogbGQydyAqLwotdm9pZAotT1BfNjYwMSAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICBpbnQzMiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibGQydyIsIE9QX1JFR19PVVRQVVQsIE9QX1BPU1RERUMsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdG1wID0gUkxXIChhZGRyKTsKLSAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKLSAgaWYgKE9QWzBdICE9IE9QWzFdICYmICgoT1BbMF0gKyAxKSAhPSBPUFsxXSkpCi0gICAgSU5DX0FERFIgKE9QWzFdLCAtNCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogbGQydyAqLwotdm9pZAotT1BfNjIwMSAoKQotewotICBpbnQzMiB0bXA7Ci0gIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSk7Ci0gIHRyYWNlX2lucHV0ICgibGQydyIsIE9QX1JFR19PVVRQVVQsIE9QX1BPU1RJTkMsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdG1wID0gUkxXIChhZGRyKTsKLSAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKLSAgaWYgKE9QWzBdICE9IE9QWzFdICYmICgoT1BbMF0gKyAxKSAhPSBPUFsxXSkpCi0gICAgSU5DX0FERFIgKE9QWzFdLCA0KTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBsZDJ3ICovCi12b2lkCi1PUF82MjAwICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSk7Ci0gIGludDMyIHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJsZDJ3IiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRtcCA9IFJMVyAoYWRkcik7Ci0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogbGQydyAqLwotdm9pZAotT1BfMzMwMTAwMDAgKCkKLXsKLSAgaW50MzIgdG1wOwotICB1aW50MTYgYWRkciA9IE9QWzFdOwotICB0cmFjZV9pbnB1dCAoImxkMnciLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYzLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRtcCA9IFJMVyAoYWRkcik7Ci0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogbGRiICovCi12b2lkCi1PUF8zODAwMDAwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibGRiIiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGMiwgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ4IChSQiAoT1BbMV0gKyBHUFIgKE9QWzJdKSkpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBsZGIgKi8KLXZvaWQKLU9QXzcwMDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoImxkYiIsIE9QX1JFR19PVVRQVVQsIE9QX01FTVJFRiwgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ4IChSQiAoR1BSIChPUFsxXSkpKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbGRpLnMgKi8KLXZvaWQKLU9QXzQwMDEgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoImxkaS5zIiwgT1BfUkVHX09VVFBVVCwgT1BfQ09OU1RBTlQ0LCBPUF9WT0lEKTsKLSAgdG1wID0gU0VYVDQgKE9QWzFdKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbGRpLmwgKi8KLXZvaWQKLU9QXzIwMDAwMDAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJsZGkubCIsIE9QX1JFR19PVVRQVVQsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICB0bXAgPSBPUFsxXTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbGR1YiAqLwotdm9pZAotT1BfMzkwMDAwMDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoImxkdWIiLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKLSAgdG1wID0gUkIgKE9QWzFdICsgR1BSIChPUFsyXSkpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBsZHViICovCi12b2lkCi1PUF83MjAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJsZHViIiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGLCBPUF9WT0lEKTsKLSAgdG1wID0gUkIgKEdQUiAoT1BbMV0pKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbWFjICovCi12b2lkCi1PUF8yQTAwICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoIm1hYyIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1JFRyk7Ci0gIHRtcCA9IFNFWFQ0MCAoKGludDE2KShHUFIgKE9QWzFdKSkgKiAoaW50MTYpKEdQUiAoT1BbMl0pKSk7Ci0KLSAgaWYgKFBTV19GWCkKLSAgICB0bXAgPSBTRVhUNDAoICh0bXAgPDwgMSkgJiBNQVNLNDApOwotCi0gIGlmIChQU1dfU1QgJiYgdG1wID4gU0VYVDQwKE1BWDMyKSkKLSAgICB0bXAgPSAoTUFYMzIpOwotCi0gIHRtcCArPSBTRVhUNDAgKEFDQyAoT1BbMF0pKTsKLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtYWNzdSAqLwotdm9pZAotT1BfMUEwMCAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJtYWNzdSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1JFRyk7Ci0gIHRtcCA9IFNFWFQ0MCAoKGludDE2KSBHUFIgKE9QWzFdKSAqIEdQUiAoT1BbMl0pKTsKLSAgaWYgKFBTV19GWCkKLSAgICB0bXAgPSBTRVhUNDAgKCh0bXAgPDwgMSkgJiBNQVNLNDApOwotICB0bXAgPSAoKFNFWFQ0MCAoQUNDIChPUFswXSkpICsgdG1wKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG1hY3UgKi8KLXZvaWQKLU9QXzNBMDAgKCkKLXsKLSAgdWludDY0IHRtcDsKLSAgdWludDMyIHNyYzE7Ci0gIHVpbnQzMiBzcmMyOwotCi0gIHRyYWNlX2lucHV0ICgibWFjdSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1JFRyk7Ci0gIHNyYzEgPSAodWludDE2KSBHUFIgKE9QWzFdKTsKLSAgc3JjMiA9ICh1aW50MTYpIEdQUiAoT1BbMl0pOwotICB0bXAgPSBzcmMxICogc3JjMjsKLSAgaWYgKFBTV19GWCkKLSAgICB0bXAgPSAodG1wIDw8IDEpOwotICB0bXAgPSAoKEFDQyAoT1BbMF0pICsgdG1wKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG1heCAqLwotdm9pZAotT1BfMjYwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibWF4IiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBpZiAoKGludDE2KSBHUFIgKE9QWzFdKSA+IChpbnQxNilHUFIgKE9QWzBdKSkKLSAgICB7Ci0gICAgICB0bXAgPSBHUFIgKE9QWzFdKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IEdQUiAoT1BbMF0pOwotICAgICAgU0VUX1BTV19GMCAoMCk7ICAgIAotICAgIH0KLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbWF4ICovCi12b2lkCi1PUF8zNjAwICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoIm1heCIsIE9QX0FDQ1VNLCBPUF9EUkVHLCBPUF9WT0lEKTsKLSAgU0VUX1BTV19GMSAoUFNXX0YwKTsKLSAgdG1wID0gU0VYVDE2IChHUFIgKE9QWzFdKSkgPDwgMTYgfCBHUFIgKE9QWzFdICsgMSk7Ci0gIGlmICh0bXAgPiBTRVhUNDAgKEFDQyAoT1BbMF0pKSkKLSAgICB7Ci0gICAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IEFDQyAoT1BbMF0pOwotICAgICAgU0VUX1BTV19GMCAoMCk7Ci0gICAgfQotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtYXggKi8KLXZvaWQKLU9QXzM2MDIgKCkKLXsKLSAgaW50NjQgdG1wOwotICB0cmFjZV9pbnB1dCAoIm1heCIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIGlmIChTRVhUNDAgKEFDQyAoT1BbMV0pKSA+IFNFWFQ0MCAoQUNDIChPUFswXSkpKQotICAgIHsKLSAgICAgIHRtcCA9IEFDQyAoT1BbMV0pOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wID0gQUNDIChPUFswXSk7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLQotLyogbWluICovCi12b2lkCi1PUF8yNjAxICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtaW4iLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIGlmICgoaW50MTYpR1BSIChPUFsxXSkgPCAoaW50MTYpR1BSIChPUFswXSkpCi0gICAgewotICAgICAgdG1wID0gR1BSIChPUFsxXSk7Ci0gICAgICBTRVRfUFNXX0YwICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0bXAgPSBHUFIgKE9QWzBdKTsKLSAgICAgIFNFVF9QU1dfRjAgKDApOyAgICAKLSAgICB9Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG1pbiAqLwotdm9pZAotT1BfMzYwMSAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJtaW4iLCBPUF9BQ0NVTSwgT1BfRFJFRywgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIHRtcCA9IFNFWFQxNiAoR1BSIChPUFsxXSkpIDw8IDE2IHwgR1BSIChPUFsxXSArIDEpOwotICBpZiAodG1wIDwgU0VYVDQwKEFDQyAoT1BbMF0pKSkKLSAgICB7Ci0gICAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IEFDQyAoT1BbMF0pOwotICAgICAgU0VUX1BTV19GMCAoMCk7Ci0gICAgfQotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtaW4gKi8KLXZvaWQKLU9QXzM2MDMgKCkKLXsKLSAgaW50NjQgdG1wOwotICB0cmFjZV9pbnB1dCAoIm1pbiIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIGlmIChTRVhUNDAoQUNDIChPUFsxXSkpIDwgU0VYVDQwKEFDQyAoT1BbMF0pKSkKLSAgICB7Ci0gICAgICB0bXAgPSBBQ0MgKE9QWzFdKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IEFDQyAoT1BbMF0pOwotICAgICAgU0VUX1BTV19GMCAoMCk7Ci0gICAgfQotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtc2IgKi8KLXZvaWQKLU9QXzI4MDAgKCkKLXsKLSAgaW50NjQgdG1wOwotCi0gIHRyYWNlX2lucHV0ICgibXNiIiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfUkVHKTsKLSAgdG1wID0gU0VYVDQwICgoaW50MTYpKEdQUiAoT1BbMV0pKSAqIChpbnQxNikoR1BSIChPUFsyXSkpKTsKLQotICBpZiAoUFNXX0ZYKQotICAgIHRtcCA9IFNFWFQ0MCAoKHRtcCA8PCAxKSAmIE1BU0s0MCk7Ci0KLSAgaWYgKFBTV19TVCAmJiB0bXAgPiBTRVhUNDAoTUFYMzIpKQotICAgIHRtcCA9IChNQVgzMik7Ci0KLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMF0pKSAtIHRtcDsKLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogbXNic3UgKi8KLXZvaWQKLU9QXzE4MDAgKCkKLXsKLSAgaW50NjQgdG1wOwotCi0gIHRyYWNlX2lucHV0ICgibXNic3UiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9SRUcpOwotICB0bXAgPSBTRVhUNDAgKChpbnQxNilHUFIgKE9QWzFdKSAqIEdQUiAoT1BbMl0pKTsKLSAgaWYgKFBTV19GWCkKLSAgICB0bXAgPSBTRVhUNDAoICh0bXAgPDwgMSkgJiBNQVNLNDApOwotICB0bXAgPSAoKFNFWFQ0MCAoQUNDIChPUFswXSkpIC0gdG1wKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG1zYnUgKi8KLXZvaWQKLU9QXzM4MDAgKCkKLXsKLSAgdWludDY0IHRtcDsKLSAgdWludDMyIHNyYzE7Ci0gIHVpbnQzMiBzcmMyOwotCi0gIHRyYWNlX2lucHV0ICgibXNidSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1JFRyk7Ci0gIHNyYzEgPSAodWludDE2KSBHUFIgKE9QWzFdKTsKLSAgc3JjMiA9ICh1aW50MTYpIEdQUiAoT1BbMl0pOwotICB0bXAgPSBzcmMxICogc3JjMjsKLSAgaWYgKFBTV19GWCkKLSAgICB0bXAgPSAodG1wIDw8IDEpOwotICB0bXAgPSAoKEFDQyAoT1BbMF0pIC0gdG1wKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG11bCAqLwotdm9pZAotT1BfMkUwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibXVsIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICB0bXAgPSBHUFIgKE9QWzBdKSAqIEdQUiAoT1BbMV0pOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBtdWx4ICovCi12b2lkCi1PUF8yQzAwICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoIm11bHgiLCBPUF9BQ0NVTV9PVVRQVVQsIE9QX1JFRywgT1BfUkVHKTsKLSAgdG1wID0gU0VYVDQwICgoaW50MTYpKEdQUiAoT1BbMV0pKSAqIChpbnQxNikoR1BSIChPUFsyXSkpKTsKLQotICBpZiAoUFNXX0ZYKQotICAgIHRtcCA9IFNFWFQ0MCAoKHRtcCA8PCAxKSAmIE1BU0s0MCk7Ci0KLSAgaWYgKFBTV19TVCAmJiB0bXAgPiBTRVhUNDAoTUFYMzIpKQotICAgIHRtcCA9IChNQVgzMik7Ci0gIGVsc2UKLSAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogbXVseHN1ICovCi12b2lkCi1PUF8xQzAwICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoIm11bHhzdSIsIE9QX0FDQ1VNX09VVFBVVCwgT1BfUkVHLCBPUF9SRUcpOwotICB0bXAgPSBTRVhUNDAgKChpbnQxNikoR1BSIChPUFsxXSkpICogR1BSIChPUFsyXSkpOwotCi0gIGlmIChQU1dfRlgpCi0gICAgdG1wIDw8PSAxOwotICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogbXVseHUgKi8KLXZvaWQKLU9QXzNDMDAgKCkKLXsKLSAgdWludDY0IHRtcDsKLSAgdWludDMyIHNyYzE7Ci0gIHVpbnQzMiBzcmMyOwotCi0gIHRyYWNlX2lucHV0ICgibXVseHUiLCBPUF9BQ0NVTV9PVVRQVVQsIE9QX1JFRywgT1BfUkVHKTsKLSAgc3JjMSA9ICh1aW50MTYpIEdQUiAoT1BbMV0pOwotICBzcmMyID0gKHVpbnQxNikgR1BSIChPUFsyXSk7Ci0gIHRtcCA9IHNyYzEgKiBzcmMyOwotICBpZiAoUFNXX0ZYKQotICAgIHRtcCA8PD0gMTsKLSAgdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG12ICovCi12b2lkCi1PUF80MDAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdiIsIE9QX1JFR19PVVRQVVQsIE9QX1JFRywgT1BfVk9JRCk7Ci0gIHRtcCA9IEdQUiAoT1BbMV0pOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBtdjJ3ICovCi12b2lkCi1PUF81MDAwICgpCi17Ci0gIGludDMyIHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdjJ3IiwgT1BfRFJFR19PVVRQVVQsIE9QX0RSRUcsIE9QX1ZPSUQpOwotICB0bXAgPSBHUFIzMiAoT1BbMV0pOwotICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Ci19Ci0KLS8qIG12MndmYWMgKi8KLXZvaWQKLU9QXzNFMDAgKCkKLXsKLSAgaW50MzIgdG1wOwotICB0cmFjZV9pbnB1dCAoIm12MndmYWMiLCBPUF9EUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX1ZPSUQpOwotICB0bXAgPSBBQ0MgKE9QWzFdKTsKLSAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBtdjJ3dGFjICovCi12b2lkCi1PUF8zRTAxICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdjJ3dGFjIiwgT1BfRFJFRywgT1BfQUNDVU1fT1VUUFVULCBPUF9WT0lEKTsKLSAgdG1wID0gKChTRVhUMTYgKEdQUiAoT1BbMF0pKSA8PCAxNiB8IEdQUiAoT1BbMF0gKyAxKSkgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFsxXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtdmFjICovCi12b2lkCi1PUF8zRTAzICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdmFjIiwgT1BfQUNDVU1fT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIHRtcCA9IEFDQyAoT1BbMV0pOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtdmIgKi8KLXZvaWQKLU9QXzU0MDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoIm12YiIsIE9QX1JFR19PVVRQVVQsIE9QX1JFRywgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ4IChHUFIgKE9QWzFdKSAmIDB4ZmYpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBtdmYwZiAqLwotdm9pZAotT1BfNDQwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibWYwZiIsIE9QX1JFR19PVVRQVVQsIE9QX1JFRywgT1BfVk9JRCk7Ci0gIGlmIChQU1dfRjAgPT0gMCkKLSAgICB7Ci0gICAgICB0bXAgPSBHUFIgKE9QWzFdKTsKLSAgICAgIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9IEdQUiAoT1BbMF0pOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG12ZjB0ICovCi12b2lkCi1PUF80NDAxICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtZjB0IiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9WT0lEKTsKLSAgaWYgKFBTV19GMCkKLSAgICB7Ci0gICAgICB0bXAgPSBHUFIgKE9QWzFdKTsKLSAgICAgIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9IEdQUiAoT1BbMF0pOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG12ZmFjZyAqLwotdm9pZAotT1BfMUUwNCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibXZmYWNnIiwgT1BfUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX1ZPSUQpOwotICB0bXAgPSAoKEFDQyAoT1BbMV0pID4+IDMyKSAmIDB4ZmYpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBtdmZhY2hpICovCi12b2lkCi1PUF8xRTAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdmZhY2hpIiwgT1BfUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX1ZPSUQpOwotICB0bXAgPSAoQUNDIChPUFsxXSkgPj4gMTYpOyAgCi0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOyAgCi0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbXZmYWNsbyAqLwotdm9pZAotT1BfMUUwMiAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgibXZmYWNsbyIsIE9QX1JFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKLSAgdG1wID0gQUNDIChPUFsxXSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG12ZmMgKi8KLXZvaWQKLU9QXzUyMDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoIm12ZmMiLCBPUF9SRUdfT1VUUFVULCBPUF9DUiwgT1BfVk9JRCk7Ci0gIHRtcCA9IENSRUcgKE9QWzFdKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbXZ0YWNnICovCi12b2lkCi1PUF8xRTQxICgpCi17Ci0gIGludDY0IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdnRhY2ciLCBPUF9SRUcsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKLSAgdG1wID0gKChBQ0MgKE9QWzFdKSAmIE1BU0szMikKLQkgfCAoKGludDY0KShHUFIgKE9QWzBdKSAmIDB4ZmYpIDw8IDMyKSk7Ci0gIFNFVF9BQ0MgKE9QWzFdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG12dGFjaGkgKi8KLXZvaWQKLU9QXzFFMDEgKCkKLXsKLSAgdWludDY0IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdnRhY2hpIiwgT1BfUkVHLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIHRtcCA9IEFDQyAoT1BbMV0pICYgMHhmZmZmOwotICB0bXAgPSAoKFNFWFQxNiAoR1BSIChPUFswXSkpIDw8IDE2IHwgdG1wKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzFdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIG12dGFjbG8gKi8KLXZvaWQKLU9QXzFFMjEgKCkKLXsKLSAgaW50NjQgdG1wOwotICB0cmFjZV9pbnB1dCAoIm12dGFjbG8iLCBPUF9SRUcsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKLSAgdG1wID0gKChTRVhUMTYgKEdQUiAoT1BbMF0pKSkgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFsxXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBtdnRjICovCi12b2lkCi1PUF81NjAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJtdnRjIiwgT1BfUkVHLCBPUF9DUl9PVVRQVVQsIE9QX1ZPSUQpOwotICB0bXAgPSBHUFIgKE9QWzBdKTsKLSAgdG1wID0gU0VUX0NSRUcgKE9QWzFdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG12dWIgKi8KLXZvaWQKLU9QXzU0MDEgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoIm12dWIiLCBPUF9SRUdfT1VUUFVULCBPUF9SRUcsIE9QX1ZPSUQpOwotICB0bXAgPSAoR1BSIChPUFsxXSkgJiAweGZmKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogbmVnICovCi12b2lkCi1PUF80NjA1ICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJuZWciLCBPUF9SRUcsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICB0bXAgPSAtIEdQUiAoT1BbMF0pOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBuZWcgKi8KLXZvaWQKLU9QXzU2MDUgKCkKLXsKLSAgaW50NjQgdG1wOwotCi0gIHRyYWNlX2lucHV0ICgibmVnIiwgT1BfQUNDVU0sIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICB0bXAgPSAtU0VYVDQwKEFDQyAoT1BbMF0pKTsKLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0KLS8qIG5vcCAqLwotdm9pZAotT1BfNUUwMCAoKQotewotICB0cmFjZV9pbnB1dCAoIm5vcCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotCi0gIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0tLTsJLyogZG9uJ3QgY291bnQgbm9wcyBhcyBub3JtYWwgaW5zdHJ1Y3Rpb25zICovCi0gIHN3aXRjaCAoU3RhdGUuaW5zX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfVU5LTk9XTiBdKys7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSU5TX0xFRlRfUEFSQUxMRUw6Ci0gICAgICAvKiBEb24ndCBjb3VudCBhIHBhcmFsbGVsIG9wIHRoYXQgaW5jbHVkZXMgYSBOT1AgYXMgYSB0cnVlIHBhcmFsbGVsIG9wICovCi0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfUEFSQUxMRUwgXS0tOwotICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUIF0rKzsKLSAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX05PUFMgXSsrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElOU19MRUZUOgotICAgIGNhc2UgSU5TX0xFRlRfQ09ORF9FWEU6Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVF9OT1BTIF0rKzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJTlNfUklHSFRfUEFSQUxMRUw6Ci0gICAgICAvKiBEb24ndCBjb3VudCBhIHBhcmFsbGVsIG9wIHRoYXQgaW5jbHVkZXMgYSBOT1AgYXMgYSB0cnVlIHBhcmFsbGVsIG9wICovCi0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVF9QQVJBTExFTCBdLS07Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVCBdKys7Ci0gICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfTk9QUyBdKys7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSU5TX1JJR0hUOgotICAgIGNhc2UgSU5TX1JJR0hUX0NPTkRfRVhFOgotICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUX05PUFMgXSsrOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBub3QgKi8KLXZvaWQKLU9QXzQ2MDMgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoIm5vdCIsIE9QX1JFRywgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIHRtcCA9IH5HUFIgKE9QWzBdKTsgIAotICBTRVRfR1BSIChPUFswXSwgdG1wKTsgIAotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG9yICovCi12b2lkCi1PUF84MDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoIm9yIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICB0bXAgPSAoR1BSIChPUFswXSkgfCBHUFIgKE9QWzFdKSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIG9yMyAqLwotdm9pZAotT1BfNDAwMDAwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgib3IzIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9DT05TVEFOVDE2KTsKLSAgdG1wID0gKEdQUiAoT1BbMV0pIHwgT1BbMl0pOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiByYWMgKi8KLXZvaWQKLU9QXzUyMDEgKCkKLXsKLSAgaW50NjQgdG1wOwotICBpbnQgc2hpZnQgPSBTRVhUMyAoT1BbMl0pOwotCi0gIHRyYWNlX2lucHV0ICgicmFjIiwgT1BfRFJFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9DT05TVEFOVDMpOwotICBpZiAoT1BbMV0gIT0gMCkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCi0JCQkJCSAiRVJST1IgYXQgUEMgMHgleDogaW5zdHJ1Y3Rpb24gb25seSB2YWxpZCBmb3IgQTBcbiIsCi0JCQkJCSBQQzw8Mik7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0gICAgfQotCi0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIHRtcCA9IFNFWFQ1NiAoKEFDQyAoMCkgPDwgMTYpIHwgKEFDQyAoMSkgJiAweGZmZmYpKTsKLSAgaWYgKHNoaWZ0ID49MCkKLSAgICB0bXAgPDw9IHNoaWZ0OwotICBlbHNlCi0gICAgdG1wID4+PSAtc2hpZnQ7Ci0gIHRtcCArPSAweDgwMDA7Ci0gIHRtcCA+Pj0gMTY7IC8qIGxvb2sgYXQgYml0cyAwOjQzICovCi0gIGlmICh0bXAgPiBTRVhUNDQgKFNJR05FRDY0ICgweDAwMDdmZmZmZmZmKSkpCi0gICAgewotICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0gCi0gIGVsc2UgaWYgKHRtcCA8IFNFWFQ0NCAoU0lHTkVENjQgKDB4ZmZmODAwMDAwMDApKSkKLSAgICB7Ci0gICAgICB0bXAgPSAweDgwMDAwMDAwOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfSAKLSAgZWxzZQotICAgIHsKLSAgICAgIFNFVF9QU1dfRjAgKDApOwotICAgIH0KLSAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiByYWNoaSAqLwotdm9pZAotT1BfNDIwMSAoKQotewotICBzaWduZWQ2NCB0bXA7Ci0gIGludCBzaGlmdCA9IFNFWFQzIChPUFsyXSk7Ci0KLSAgdHJhY2VfaW5wdXQgKCJyYWNoaSIsIE9QX1JFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9DT05TVEFOVDMpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICBpZiAoc2hpZnQgPj0wKQotICAgIHRtcCA9IFNFWFQ0MCAoQUNDIChPUFsxXSkpIDw8IHNoaWZ0OwotICBlbHNlCi0gICAgdG1wID0gU0VYVDQwIChBQ0MgKE9QWzFdKSkgPj4gLXNoaWZ0OwotICB0bXAgKz0gMHg4MDAwOwotCi0gIGlmICh0bXAgPiBTRVhUNDQgKFNJR05FRDY0ICgweDAwMDdmZmZmZmZmKSkpCi0gICAgewotICAgICAgdG1wID0gMHg3ZmZmOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlIGlmICh0bXAgPCBTRVhUNDQgKFNJR05FRDY0ICgweGZmZjgwMDAwMDAwKSkpCi0gICAgewotICAgICAgdG1wID0gMHg4MDAwOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wID0gKHRtcCA+PiAxNik7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHJlcCAqLwotdm9pZAotT1BfMjcwMDAwMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJyZXAiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICBTRVRfUlBUX1MgKFBDICsgMSk7Ci0gIFNFVF9SUFRfRSAoUEMgKyBPUFsxXSk7Ci0gIFNFVF9SUFRfQyAoR1BSIChPUFswXSkpOwotICBTRVRfUFNXX1JQICgxKTsKLSAgaWYgKEdQUiAoT1BbMF0pID09IDApCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IHJlcCB3aXRoIGNvdW50PTAgaXMgaWxsZWdhbC5cbiIpOwotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOwotICAgIH0KLSAgaWYgKE9QWzFdIDwgNCkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogcmVwIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucy5cbiIpOwotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOwotICAgIH0KLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHJlcGkgKi8KLXZvaWQKLU9QXzJGMDAwMDAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgicmVwaSIsIE9QX0NPTlNUQU5UMTYsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICBTRVRfUlBUX1MgKFBDICsgMSk7Ci0gIFNFVF9SUFRfRSAoUEMgKyBPUFsxXSk7Ci0gIFNFVF9SUFRfQyAoT1BbMF0pOwotICBTRVRfUFNXX1JQICgxKTsKLSAgaWYgKE9QWzBdID09IDApCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IHJlcGkgd2l0aCBjb3VudD0wIGlzIGlsbGVnYWwuXG4iKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICB9Ci0gIGlmIChPUFsxXSA8IDQpCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IHJlcGkgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDQgaW5zdHJ1Y3Rpb25zLlxuIik7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0gICAgfQotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogcnRkICovCi12b2lkCi1PUF81RjYwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgicnRkIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIFNFVF9DUkVHIChQU1dfQ1IsIERQU1cpOwotICBKTVAoRFBDKTsKLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHJ0ZSAqLwotdm9pZAotT1BfNUY0MCAoKQotewotICB0cmFjZV9pbnB1dCAoInJ0ZSIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTRVRfQ1JFRyAoUFNXX0NSLCBCUFNXKTsKLSAgSk1QKEJQQyk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzYWMgKi8KLXZvaWQgT1BfNTIwOSAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzYWMiLCBPUF9SRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0KLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMV0pKTsKLQotICBTRVRfUFNXX0YxIChQU1dfRjApOwotCi0gIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQotICAgIHsKLSAgICAgIHRtcCA9IChNQVgzMik7Ci0gICAgICBTRVRfUFNXX0YwICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCi0gICAgewotICAgICAgdG1wID0gMHg4MDAwMDAwMDsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9ICh0bXAgJiBNQVNLMzIpOwotICAgICAgU0VUX1BTV19GMCAoMCk7Ci0gICAgfQotCi0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0KLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBzYWNoaSAqLwotdm9pZAotT1BfNDIwOSAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzYWNoaSIsIE9QX1JFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKLQotICB0bXAgPSBTRVhUNDAoQUNDIChPUFsxXSkpOwotCi0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0KLSAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCi0gICAgewotICAgICAgdG1wID0gMHg3ZmZmOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfQotICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQotICAgIHsKLSAgICAgIHRtcCA9IDB4ODAwMDsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA+Pj0gMTY7Ci0gICAgICBTRVRfUFNXX0YwICgwKTsKLSAgICB9Ci0KLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0KLSAgdHJhY2Vfb3V0cHV0XzE2IChPUFswXSk7Ci19Ci0KLS8qIHNhZGQgKi8KLXZvaWQKLU9QXzEyMjMgKCkKLXsKLSAgaW50NjQgdG1wOwotCi0gIHRyYWNlX2lucHV0ICgic2FkZCIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgKyAoU0VYVDQwKEFDQyAoT1BbMV0pKSA+PiAxNik7Ci0gIGlmIChQU1dfU1QpCi0gICAgewotICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCi0JdG1wID0gKE1BWDMyKTsKLSAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCi0JdG1wID0gKE1JTjMyKTsKLSAgICAgIGVsc2UKLQl0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKLSAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogc2V0ZjBmICovCi12b2lkCi1PUF80NjExICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJzZXRmMGYiLCBPUF9SRUdfT1VUUFVULCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgdG1wID0gKChQU1dfRjAgPT0gMCkgPyAxIDogMCk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHNldGYwdCAqLwotdm9pZAotT1BfNDYxMyAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgic2V0ZjB0IiwgT1BfUkVHX09VVFBVVCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIHRtcCA9ICgoUFNXX0YwID09IDEpID8gMSA6IDApOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBzbGFlICovCi12b2lkCi1PUF8zMjIwICgpCi17Ci0gIGludDY0IHRtcDsKLSAgaW50MTYgcmVnOwotCi0gIHRyYWNlX2lucHV0ICgic2xhZSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1ZPSUQpOwotCi0gIHJlZyA9IFNFWFQxNiAoR1BSIChPUFsxXSkpOwotCi0gIGlmIChyZWcgPj0gMTcgfHwgcmVnIDw9IC0xNykKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogc2hpZnQgdmFsdWUgJWQgdG9vIGxhcmdlLlxuIiwgcmVnKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdG1wID0gU0VYVDQwIChBQ0MgKE9QWzBdKSk7Ci0KLSAgaWYgKFBTV19TVCAmJiAodG1wIDwgU0VYVDQwIChNSU4zMikgfHwgdG1wID4gU0VYVDQwIChNQVgzMikpKQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBhY2N1bXVsYXRvciB2YWx1ZSAweCUuMnglLjhseCBvdXQgb2YgcmFuZ2VcbiIsICgoaW50KSh0bXAgPj4gMzIpICYgMHhmZiksICgodW5zaWduZWQgbG9uZykgdG1wKSAmIDB4ZmZmZmZmZmYpOwotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVnID49IDAgJiYgcmVnIDw9IDE2KQotICAgIHsKLSAgICAgIHRtcCA9IFNFWFQ1NiAoKFNFWFQ1NiAodG1wKSkgPDwgKEdQUiAoT1BbMV0pKSk7Ci0gICAgICBpZiAoUFNXX1NUKQotCXsKLQkgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQotCSAgICB0bXAgPSAoTUFYMzIpOwotCSAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQkgICAgdG1wID0gKE1JTjMyKTsKLQkgIGVsc2UKLQkgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0JfQotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IChTRVhUNDAgKEFDQyAoT1BbMF0pKSkgPj4gKC1HUFIgKE9QWzFdKSk7Ci0gICAgfQotCi0gIFNFVF9BQ0MoT1BbMF0sIHRtcCk7Ci0KLSAgdHJhY2Vfb3V0cHV0XzQwKHRtcCk7Ci19Ci0KLS8qIHNsZWVwICovCi12b2lkCi1PUF81RkMwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgic2xlZXAiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKLSAgU0VUX1BTV19JRSAoMSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzbGwgKi8KLXZvaWQKLU9QXzIyMDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInNsbCIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKLSAgdG1wID0gKEdQUiAoT1BbMF0pIDw8IChHUFIgKE9QWzFdKSAmIDB4ZikpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBzbGwgKi8KLXZvaWQKLU9QXzMyMDAgKCkKLXsKLSAgaW50NjQgdG1wOwotICB0cmFjZV9pbnB1dCAoInNsbCIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBpZiAoKEdQUiAoT1BbMV0pICYgMzEpIDw9IDE2KQotICAgIHRtcCA9IFNFWFQ0MCAoQUNDIChPUFswXSkpIDw8IChHUFIgKE9QWzFdKSAmIDMxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBzaGlmdCB2YWx1ZSAlZCB0b28gbGFyZ2UuXG4iLCBHUFIgKE9QWzFdKSAmIDMxKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBzbGxpICovCi12b2lkCi1PUF8yMjAxICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJzbGxpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKLSAgdG1wID0gKEdQUiAoT1BbMF0pIDw8IE9QWzFdKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogc2xsaSAqLwotdm9pZAotT1BfMzIwMSAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgaWYgKE9QWzFdID09IDApCi0gICAgT1BbMV0gPSAxNjsKLQotICB0cmFjZV9pbnB1dCAoInNsbGkiLCBPUF9BQ0NVTSwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgPDwgT1BbMV07Ci0KLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotfQotCi0vKiBzbHggKi8KLXZvaWQKLU9QXzQ2MEIgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInNseCIsIE9QX1JFRywgT1BfRkxBRywgT1BfVk9JRCk7Ci0gIHRtcCA9ICgoR1BSIChPUFswXSkgPDwgMSkgfCBQU1dfRjApOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBzcmEgKi8KLXZvaWQKLU9QXzI0MDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInNyYSIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKLSAgdG1wID0gKCgoaW50MTYpKEdQUiAoT1BbMF0pKSkgPj4gKEdQUiAoT1BbMV0pICYgMHhmKSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHNyYSAqLwotdm9pZAotT1BfMzQwMCAoKQotewotICB0cmFjZV9pbnB1dCAoInNyYSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1ZPSUQpOwotICBpZiAoKEdQUiAoT1BbMV0pICYgMzEpIDw9IDE2KQotICAgIHsKLSAgICAgIGludDY0IHRtcCA9ICgoU0VYVDQwKEFDQyAoT1BbMF0pKSA+PiAoR1BSIChPUFsxXSkgJiAzMSkpICYgTUFTSzQwKTsKLSAgICAgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICAgICAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBzaGlmdCB2YWx1ZSAlZCB0b28gbGFyZ2UuXG4iLCBHUFIgKE9QWzFdKSAmIDMxKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIHNyYWkgKi8KLXZvaWQKLU9QXzI0MDEgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInNyYWkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICB0bXAgPSAoKChpbnQxNikoR1BSIChPUFswXSkpKSA+PiBPUFsxXSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHNyYWkgKi8KLXZvaWQKLU9QXzM0MDEgKCkKLXsKLSAgaW50NjQgdG1wOwotICBpZiAoT1BbMV0gPT0gMCkKLSAgICBPUFsxXSA9IDE2OwotCi0gIHRyYWNlX2lucHV0ICgic3JhaSIsIE9QX0FDQ1VNLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKLSAgdG1wID0gKChTRVhUNDAoQUNDIChPUFswXSkpID4+IE9QWzFdKSAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIHNybCAqLwotdm9pZAotT1BfMjAwMCAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgic3JsIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotICB0bXAgPSAoR1BSIChPUFswXSkgPj4gIChHUFIgKE9QWzFdKSAmIDB4ZikpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBzcmwgKi8KLXZvaWQKLU9QXzMwMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJzcmwiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9WT0lEKTsKLSAgaWYgKChHUFIgKE9QWzFdKSAmIDMxKSA8PSAxNikKLSAgICB7Ci0gICAgICBpbnQ2NCB0bXAgPSAoKHVpbnQ2NCkoKEFDQyAoT1BbMF0pICYgTUFTSzQwKSA+PiAoR1BSIChPUFsxXSkgJiAzMSkpKTsKLSAgICAgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICAgICAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBzaGlmdCB2YWx1ZSAlZCB0b28gbGFyZ2UuXG4iLCBHUFIgKE9QWzFdKSAmIDMxKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLX0KLQotLyogc3JsaSAqLwotdm9pZAotT1BfMjAwMSAoKQotewotICBpbnQxNiB0bXA7Ci0gIHRyYWNlX2lucHV0ICgic3JsaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIHRtcCA9IChHUFIgKE9QWzBdKSA+PiBPUFsxXSk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHNybGkgKi8KLXZvaWQKLU9QXzMwMDEgKCkKLXsKLSAgaW50NjQgdG1wOwotICBpZiAoT1BbMV0gPT0gMCkKLSAgICBPUFsxXSA9IDE2OwotCi0gIHRyYWNlX2lucHV0ICgic3JsaSIsIE9QX0FDQ1VNLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKLSAgdG1wID0gKCh1aW50NjQpKEFDQyAoT1BbMF0pICYgTUFTSzQwKSA+PiBPUFsxXSk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIHNyeCAqLwotdm9pZAotT1BfNDYwOSAoKQotewotICB1aW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInNyeCIsIE9QX1JFRywgT1BfRkxBRywgT1BfVk9JRCk7Ci0gIHRtcCA9IFBTV19GMCA8PCAxNTsKLSAgdG1wID0gKChHUFIgKE9QWzBdKSA+PiAxKSB8IHRtcCk7Ci0gIFNFVF9HUFIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Ci19Ci0KLS8qIHN0ICovCi12b2lkCi1PUF8zNDAwMDAwMCAoKQotewotICB1aW50MTYgYWRkciA9IE9QWzFdICsgR1BSIChPUFsyXSk7Ci0gIHRyYWNlX2lucHV0ICgic3QiLCBPUF9SRUcsIE9QX01FTVJFRjIsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgU1cgKGFkZHIsIEdQUiAoT1BbMF0pKTsKLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHN0ICovCi12b2lkCi1PUF82ODAwICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSk7Ci0gIHRyYWNlX2lucHV0ICgic3QiLCBPUF9SRUcsIE9QX01FTVJFRiwgT1BfVk9JRCk7Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBTVyAoYWRkciwgR1BSIChPUFswXSkpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3QgKi8KLS8qIHN0IFJzcmMxLEAtU1AgKi8KLXZvaWQKLU9QXzZDMUYgKCkKLXsKLSAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKSAtIDI7Ci0gIHRyYWNlX2lucHV0ICgic3QiLCBPUF9SRUcsIE9QX1BSRURFQywgT1BfVk9JRCk7Ci0gIGlmIChPUFsxXSAhPSAxNSkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogY2Fubm90IHByZS1kZWNyZW1lbnQgYW55IHJlZ2lzdGVycyBidXQgcjE1IChTUCkuXG4iKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBTVyAoYWRkciwgR1BSIChPUFswXSkpOwotICBTRVRfR1BSIChPUFsxXSwgYWRkcik7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzdCAqLwotdm9pZAotT1BfNjgwMSAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9QT1NUSU5DLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIFNXIChhZGRyLCBHUFIgKE9QWzBdKSk7Ci0gIElOQ19BRERSIChPUFsxXSwgMik7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzdCAqLwotdm9pZAotT1BfNkMwMSAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9QT1NUREVDLCBPUF9WT0lEKTsKLSAgaWYgKCBPUFsxXSA9PSAxNSApCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGNhbm5vdCBwb3N0LWRlY3JlbWVudCByZWdpc3RlciByMTUgKFNQKS5cbiIpOwotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIFNXIChhZGRyLCBHUFIgKE9QWzBdKSk7Ci0gIElOQ19BRERSIChPUFsxXSwgLTIpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3QgKi8KLXZvaWQKLU9QXzM2MDEwMDAwICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gT1BbMV07Ci0gIHRyYWNlX2lucHV0ICgic3QiLCBPUF9SRUcsIE9QX01FTVJFRjMsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgU1cgKGFkZHIsIEdQUiAoT1BbMF0pKTsKLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHN0MncgKi8KLXZvaWQKLU9QXzM1MDAwMDAwICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gR1BSIChPUFsyXSkrIE9QWzFdOwotICB0cmFjZV9pbnB1dCAoInN0MnciLCBPUF9EUkVHLCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIFNXIChhZGRyICsgMCwgR1BSIChPUFswXSArIDApKTsKLSAgU1cgKGFkZHIgKyAyLCBHUFIgKE9QWzBdICsgMSkpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3QydyAqLwotdm9pZAotT1BfNkEwMCAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoInN0MnciLCBPUF9EUkVHLCBPUF9NRU1SRUYsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgU1cgKGFkZHIgKyAwLCBHUFIgKE9QWzBdICsgMCkpOwotICBTVyAoYWRkciArIDIsIEdQUiAoT1BbMF0gKyAxKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzdDJ3ICovCi12b2lkCi1PUF82RTFGICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSkgLSA0OwotICB0cmFjZV9pbnB1dCAoInN0MnciLCBPUF9EUkVHLCBPUF9QUkVERUMsIE9QX1ZPSUQpOwotICBpZiAoIE9QWzFdICE9IDE1ICkKLSAgICB7Ci0gICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogY2Fubm90IHByZS1kZWNyZW1lbnQgYW55IHJlZ2lzdGVycyBidXQgcjE1IChTUCkuXG4iKTsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoYWRkciAmIDEpKQotICAgIHsKLSAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0JVUzsKLSAgICAgIFN0YXRlLnBjX2NoYW5nZWQgPSAxOyAvKiBEb24ndCBpbmNyZW1lbnQgdGhlIFBDLiAqLwotICAgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBTVyAoYWRkciArIDAsIEdQUiAoT1BbMF0gKyAwKSk7Ci0gIFNXIChhZGRyICsgMiwgR1BSIChPUFswXSArIDEpKTsKLSAgU0VUX0dQUiAoT1BbMV0sIGFkZHIpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3QydyAqLwotdm9pZAotT1BfNkEwMSAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoInN0MnciLCBPUF9EUkVHLCBPUF9QT1NUSU5DLCBPUF9WT0lEKTsKLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIFNXIChhZGRyICsgMCwgR1BSIChPUFswXSArIDApKTsKLSAgU1cgKGFkZHIgKyAyLCBHUFIgKE9QWzBdICsgMSkpOwotICBJTkNfQUREUiAoT1BbMV0sIDQpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3QydyAqLwotdm9pZAotT1BfNkUwMSAoKQotewotICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMV0pOwotICB0cmFjZV9pbnB1dCAoInN0MnciLCBPUF9EUkVHLCBPUF9QT1NUREVDLCBPUF9WT0lEKTsKLSAgaWYgKCBPUFsxXSA9PSAxNSApCi0gICAgewotICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGNhbm5vdCBwb3N0LWRlY3JlbWVudCByZWdpc3RlciByMTUgKFNQKS5cbiIpOwotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChhZGRyICYgMSkpCi0gICAgewotICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfQlVTOwotICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDE7IC8qIERvbid0IGluY3JlbWVudCB0aGUgUEMuICovCi0gICAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIFNXIChhZGRyICsgMCwgR1BSIChPUFswXSArIDApKTsKLSAgU1cgKGFkZHIgKyAyLCBHUFIgKE9QWzBdICsgMSkpOwotICBJTkNfQUREUiAoT1BbMV0sIC00KTsKLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHN0MncgKi8KLXZvaWQKLU9QXzM3MDEwMDAwICgpCi17Ci0gIHVpbnQxNiBhZGRyID0gT1BbMV07Ci0gIHRyYWNlX2lucHV0ICgic3QydyIsIE9QX0RSRUcsIE9QX01FTVJFRjMsIE9QX1ZPSUQpOwotICBpZiAoKGFkZHIgJiAxKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9CVVM7Ci0gICAgICBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBQQy4gKi8KLSAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgU1cgKGFkZHIgKyAwLCBHUFIgKE9QWzBdICsgMCkpOwotICBTVyAoYWRkciArIDIsIEdQUiAoT1BbMF0gKyAxKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzdGIgKi8KLXZvaWQKLU9QXzNDMDAwMDAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgic3RiIiwgT1BfUkVHLCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKLSAgU0IgKEdQUiAoT1BbMl0pICsgT1BbMV0sIEdQUiAoT1BbMF0pKTsKLSAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Ci19Ci0KLS8qIHN0YiAqLwotdm9pZAotT1BfNzgwMCAoKQotewotICB0cmFjZV9pbnB1dCAoInN0YiIsIE9QX1JFRywgT1BfTUVNUkVGLCBPUF9WT0lEKTsKLSAgU0IgKEdQUiAoT1BbMV0pLCBHUFIgKE9QWzBdKSk7Ci0gIHRyYWNlX291dHB1dF92b2lkICgpOwotfQotCi0vKiBzdG9wICovCi12b2lkCi1PUF81RkUwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgic3RvcCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICBTdGF0ZS5leGNlcHRpb24gPSBTSUdfRDEwVl9TVE9QOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogc3ViICovCi12b2lkCi1PUF8wICgpCi17Ci0gIHVpbnQxNiBhID0gR1BSIChPUFswXSk7Ci0gIHVpbnQxNiBiID0gR1BSIChPUFsxXSk7Ci0gIHVpbnQxNiB0bXAgPSAoYSAtIGIpOwotICB0cmFjZV9pbnB1dCAoInN1YiIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKLSAgLyogc2VlIC4uL2NvbW1vbi9zaW0tYWx1LmggZm9yIGEgbW9yZSBleHRlbnNpdmUgZGlzY3Vzc2lvbiBvbiBob3cgdG8KLSAgICAgY29tcHV0ZSB0aGUgY2Fycnkvb3ZlcmZsb3cgYml0cy4gKi8KLSAgU0VUX1BTV19DIChhID49IGIpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiBzdWIgKi8KLXZvaWQKLU9QXzEwMDEgKCkKLXsKLSAgaW50NjQgdG1wOwotCi0gIHRyYWNlX2lucHV0ICgic3ViIiwgT1BfQUNDVU0sIE9QX0RSRUcsIE9QX1ZPSUQpOwotICB0bXAgPSBTRVhUNDAoQUNDIChPUFswXSkpIC0gKFNFWFQxNiAoR1BSIChPUFsxXSkpIDw8IDE2IHwgR1BSIChPUFsxXSArIDEpKTsKLSAgaWYgKFBTV19TVCkKLSAgICB7Ci0gICAgICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKLQl0bXAgPSAoTUFYMzIpOwotICAgICAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLQl0bXAgPSAoTUlOMzIpOwotICAgICAgZWxzZQotCXRtcCA9ICh0bXAgJiBNQVNLNDApOwotICAgIH0KLSAgZWxzZQotICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOwotICBTRVRfQUNDIChPUFswXSwgdG1wKTsKLQotICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Ci19Ci0KLS8qIHN1YiAqLwotCi12b2lkCi1PUF8xMDAzICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoInN1YiIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7Ci0gIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgLSBTRVhUNDAoQUNDIChPUFsxXSkpOwotICBpZiAoUFNXX1NUKQotICAgIHsKLSAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQotCXRtcCA9IChNQVgzMik7Ci0gICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQotCXRtcCA9IChNSU4zMik7Ci0gICAgICBlbHNlCi0JdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0gICAgfQotICBlbHNlCi0gICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7Ci0gIFNFVF9BQ0MgKE9QWzBdLCB0bXApOwotCi0gIHRyYWNlX291dHB1dF80MCAodG1wKTsKLX0KLQotLyogc3ViMncgKi8KLXZvaWQKLU9QXzEwMDAgKCkKLXsKLSAgdWludDMyIHRtcCwgYSwgYjsKLQotICB0cmFjZV9pbnB1dCAoInN1YjJ3IiwgT1BfRFJFRywgT1BfRFJFRywgT1BfVk9JRCk7Ci0gIGEgPSAodWludDMyKSgoR1BSIChPUFswXSkgPDwgMTYpIHwgR1BSIChPUFswXSArIDEpKTsKLSAgYiA9ICh1aW50MzIpKChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpOwotICAvKiBzZWUgLi4vY29tbW9uL3NpbS1hbHUuaCBmb3IgYSBtb3JlIGV4dGVuc2l2ZSBkaXNjdXNzaW9uIG9uIGhvdyB0bwotICAgICBjb21wdXRlIHRoZSBjYXJyeS9vdmVyZmxvdyBiaXRzICovCi0gIHRtcCA9IGEgLSBiOwotICBTRVRfUFNXX0MgKGEgPj0gYik7Ci0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogc3ViYWMzICovCi12b2lkCi1PUF8xNzAwMDAwMCAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzdWJhYzMiLCBPUF9EUkVHX09VVFBVVCwgT1BfRFJFRywgT1BfQUNDVU0pOwotICB0bXAgPSBTRVhUNDAgKChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpIC0gU0VYVDQwIChBQ0MgKE9QWzJdKSk7Ci0gIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8zMiAodG1wKTsKLX0KLQotLyogc3ViYWMzICovCi12b2lkCi1PUF8xNzAwMDAwMiAoKQotewotICBpbnQ2NCB0bXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzdWJhYzMiLCBPUF9EUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX0FDQ1VNKTsKLSAgdG1wID0gU0VYVDQwIChBQ0MgKE9QWzFdKSkgLSBTRVhUNDAoQUNDIChPUFsyXSkpOwotICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Ci19Ci0KLS8qIHN1YmFjM3MgKi8KLXZvaWQKLU9QXzE3MDAxMDAwICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoInN1YmFjM3MiLCBPUF9EUkVHX09VVFBVVCwgT1BfRFJFRywgT1BfQUNDVU0pOwotICBTRVRfUFNXX0YxIChQU1dfRjApOwotICB0bXAgPSBTRVhUNDAgKChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpIC0gU0VYVDQwKEFDQyAoT1BbMl0pKTsKLSAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCi0gICAgewotICAgICAgdG1wID0gKE1BWDMyKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0gICAgICAKLSAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKLSAgICB7Ci0gICAgICB0bXAgPSAoTUlOMzIpOwotICAgICAgU0VUX1BTV19GMCAoMSk7Ci0gICAgfSAgICAgIAotICBlbHNlCi0gICAgewotICAgICAgU0VUX1BTV19GMCAoMCk7Ci0gICAgfSAgICAgIAotICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOwotICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Ci19Ci0KLS8qIHN1YmFjM3MgKi8KLXZvaWQKLU9QXzE3MDAxMDAyICgpCi17Ci0gIGludDY0IHRtcDsKLQotICB0cmFjZV9pbnB1dCAoInN1YmFjM3MiLCBPUF9EUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX0FDQ1VNKTsKLSAgU0VUX1BTV19GMSAoUFNXX0YwKTsKLSAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMV0pKSAtIFNFWFQ0MChBQ0MgKE9QWzJdKSk7Ci0gIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQotICAgIHsKLSAgICAgIHRtcCA9IChNQVgzMik7Ci0gICAgICBTRVRfUFNXX0YwICgxKTsKLSAgICB9ICAgICAgCi0gIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCi0gICAgewotICAgICAgdG1wID0gKE1JTjMyKTsKLSAgICAgIFNFVF9QU1dfRjAgKDEpOwotICAgIH0gICAgICAKLSAgZWxzZQotICAgIHsKLSAgICAgIFNFVF9QU1dfRjAgKDApOwotICAgIH0gICAgICAKLSAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOwotfQotCi0vKiBzdWJpICovCi12b2lkCi1PUF8xICgpCi17Ci0gIHVuc2lnbmVkIHRtcDsKLSAgaWYgKE9QWzFdID09IDApCi0gICAgT1BbMV0gPSAxNjsKLQotICB0cmFjZV9pbnB1dCAoInN1YmkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICAvKiBzZWUgLi4vY29tbW9uL3NpbS1hbHUuaCBmb3IgYSBtb3JlIGV4dGVuc2l2ZSBkaXNjdXNzaW9uIG9uIGhvdyB0bwotICAgICBjb21wdXRlIHRoZSBjYXJyeS9vdmVyZmxvdyBiaXRzLiAqLwotICAvKiBzaW5jZSBPUFsxXSBpcyBuZXZlciA8PSAwLCAtT1BbMV0gPT0gfk9QWzFdKzEgY2FuIG5ldmVyIG92ZXJmbG93ICovCi0gIHRtcCA9ICgodW5zaWduZWQpKHVuc2lnbmVkMTYpIEdQUiAoT1BbMF0pCi0JICsgKHVuc2lnbmVkKSh1bnNpZ25lZDE2KSAoIC0gT1BbMV0pKTsKLSAgU0VUX1BTV19DICh0bXAgPj0gKDEgPDwgMTYpKTsKLSAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7Ci0gIHRyYWNlX291dHB1dF8xNiAodG1wKTsKLX0KLQotLyogdHJhcCAqLwotdm9pZAotT1BfNUYwMCAoKQotewotICB0cmFjZV9pbnB1dCAoInRyYXAiLCBPUF9DT05TVEFOVDQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLQotICBzd2l0Y2ggKE9QWzBdKQotICAgIHsKLSAgICBkZWZhdWx0OgotI2lmIChERUJVRyAmIERFQlVHX1RSQVApID09IDAKLSAgICAgIHsKLQl1aW50MTYgdmVjID0gT1BbMF0gKyBUUkFQX1ZFQ1RPUl9TVEFSVDsKLQlTRVRfQlBDIChQQyArIDEpOwotCVNFVF9CUFNXIChQU1cpOwotCVNFVF9QU1cgKFBTVyAmIFBTV19TTV9CSVQpOwotCUpNUCAodmVjKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbHNlCQkJLyogaWYgZGVidWdnaW5nIHVzZSB0cmFwIHRvIHByaW50IHJlZ2lzdGVycyAqLwotICAgICAgewotCWludCBpOwotCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7Ci0KLQlpZiAoZmlyc3RfdGltZSkKLQkgIHsKLQkgICAgZmlyc3RfdGltZSA9IDA7Ci0JICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIlRyYXAgICMgICAgIFBDICIpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIgICVzciVkIiwgKGkgPiA5KSA/ICIiIDogIiAiLCBpKTsKLQkgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiICAgICAgICAgYTAgICAgICAgICBhMSBmMCBmMSBjXG4iKTsKLQkgIH0KLQotCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIlRyYXAgJTJkIDB4JS40eDoiLCAoaW50KU9QWzBdLCAoaW50KVBDKTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiICUuNHgiLCAoaW50KSBHUFIgKGkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIgJS4yeCUuOGx4IiwKLQkJCQkJICAgICAoKGludCkoQUNDIChpKSA+PiAzMikgJiAweGZmKSwKLQkJCQkJICAgICAoKHVuc2lnbmVkIGxvbmcpIEFDQyAoaSkpICYgMHhmZmZmZmZmZik7Ci0KLQkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIgICVkICAlZCAlZFxuIiwKLQkJCQkJICAgUFNXX0YwICE9IDAsIFBTV19GMSAhPSAwLCBQU1dfQyAhPSAwKTsKLQkoKmQxMHZfY2FsbGJhY2stPmZsdXNoX3N0ZG91dCkgKGQxMHZfY2FsbGJhY2spOwotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0gICAgY2FzZSAxNToJCQkvKiBuZXcgc3lzdGVtIGNhbGwgdHJhcCAqLwotICAgICAgLyogVHJhcCAxNSBpcyB1c2VkIGZvciBzaW11bGF0aW5nIGxvdy1sZXZlbCBJL08gKi8KLSAgICAgIHsKLQl1bnNpZ25lZDMyIHJlc3VsdCA9IDA7Ci0JZXJybm8gPSAwOwotCi0vKiBSZWdpc3RlcnMgcGFzc2VkIHRvIHRyYXAgMCAqLwotCi0jZGVmaW5lIEZVTkMgICBHUFIgKDQpCS8qIGZ1bmN0aW9uIG51bWJlciAqLwotI2RlZmluZSBQQVJNMSAgR1BSICgwKQkvKiBvcHRpb25hbCBwYXJtIDEgKi8KLSNkZWZpbmUgUEFSTTIgIEdQUiAoMSkJLyogb3B0aW9uYWwgcGFybSAyICovCi0jZGVmaW5lIFBBUk0zICBHUFIgKDIpCS8qIG9wdGlvbmFsIHBhcm0gMyAqLwotI2RlZmluZSBQQVJNNCAgR1BSICgzKQkvKiBvcHRpb25hbCBwYXJtIDMgKi8KLQotLyogUmVnaXN0ZXJzIHNldCBieSB0cmFwIDAgKi8KLQotI2RlZmluZSBSRVRWQUwoWCkgICBkbyB7IHJlc3VsdCA9IChYKTsgU0VUX0dQUiAoMCwgcmVzdWx0KTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgUkVUVkFMMzIoWCkgZG8geyByZXN1bHQgPSAoWCk7IFNFVF9HUFIgKDAsIHJlc3VsdCA+PiAxNik7IFNFVF9HUFIgKDEsIHJlc3VsdCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFJFVEVSUihYKSBTRVRfR1BSICg0LCAoWCkpCQkvKiByZXR1cm4gZXJyb3IgY29kZSAqLwotCi0vKiBUdXJuIGEgcG9pbnRlciBpbiBhIHJlZ2lzdGVyIGludG8gYSBwb2ludGVyIGludG8gcmVhbCBtZW1vcnkuICovCi0KLSNkZWZpbmUgTUVNUFRSKHgpICgoY2hhciAqKShkbWVtX2FkZHIoeCkpKQotCi0Jc3dpdGNoIChGVU5DKQotCSAgewotI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0JICBjYXNlIFRBUkdFVF9TWVNfZm9yazoKLQkgICAgdHJhY2VfaW5wdXQgKCI8Zm9yaz4iLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKLQkgICAgUkVUVkFMIChmb3JrICgpKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOwotCSAgICBicmVhazsKLQotI2RlZmluZSBnZXRwaWQoKSA0NwotCSAgY2FzZSBUQVJHRVRfU1lTX2dldHBpZDoKLQkgICAgdHJhY2VfaW5wdXQgKCI8Z2V0cGlkPiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotCSAgICBSRVRWQUwgKGdldHBpZCAoKSk7Ci0JICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgVEFSR0VUX1NZU19raWxsOgotCSAgICB0cmFjZV9pbnB1dCAoIjxraWxsPiIsIE9QX1IwLCBPUF9SMSwgT1BfVk9JRCk7Ci0JICAgIGlmIChQQVJNMSA9PSBnZXRwaWQgKCkpCi0JICAgICAgewotCQl0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLQkJU3RhdGUuZXhjZXB0aW9uID0gUEFSTTI7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgb3Nfc2lnID0gLTE7Ci0JCXN3aXRjaCAoUEFSTTIpCi0JCSAgewotI2lmZGVmIFNJR0hVUAotCQkgIGNhc2UgMTogb3Nfc2lnID0gU0lHSFVQOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0lOVAotCQkgIGNhc2UgMjogb3Nfc2lnID0gU0lHSU5UOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1FVSVQKLQkJICBjYXNlIDM6IG9zX3NpZyA9IFNJR1FVSVQ7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHSUxMCi0JCSAgY2FzZSA0OiBvc19zaWcgPSBTSUdJTEw7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHVFJBUAotCQkgIGNhc2UgNTogb3Nfc2lnID0gU0lHVFJBUDsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQlJUCi0JCSAgY2FzZSA2OiBvc19zaWcgPSBTSUdBQlJUOwlicmVhazsKLSNlbGlmIGRlZmluZWQoU0lHSU9UKQotCQkgIGNhc2UgNjogb3Nfc2lnID0gU0lHSU9UOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0VNVAotCQkgIGNhc2UgNzogb3Nfc2lnID0gU0lHRU1UOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0ZQRQotCQkgIGNhc2UgODogb3Nfc2lnID0gU0lHRlBFOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0tJTEwKLQkJICBjYXNlIDk6IG9zX3NpZyA9IFNJR0tJTEw7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHQlVTCi0JCSAgY2FzZSAxMDogb3Nfc2lnID0gU0lHQlVTOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1NFR1YKLQkJICBjYXNlIDExOiBvc19zaWcgPSBTSUdTRUdWOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1NZUwotCQkgIGNhc2UgMTI6IG9zX3NpZyA9IFNJR1NZUzsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0JCSAgY2FzZSAxMzogb3Nfc2lnID0gU0lHUElQRTsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBTFJNCi0JCSAgY2FzZSAxNDogb3Nfc2lnID0gU0lHQUxSTTsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdURVJNCi0JCSAgY2FzZSAxNTogb3Nfc2lnID0gU0lHVEVSTTsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdVUkcKLQkJICBjYXNlIDE2OiBvc19zaWcgPSBTSUdVUkc7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHU1RPUAotCQkgIGNhc2UgMTc6IG9zX3NpZyA9IFNJR1NUT1A7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHVFNUUAotCQkgIGNhc2UgMTg6IG9zX3NpZyA9IFNJR1RTVFA7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHQ09OVAotCQkgIGNhc2UgMTk6IG9zX3NpZyA9IFNJR0NPTlQ7CWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU0lHQ0hMRAotCQkgIGNhc2UgMjA6IG9zX3NpZyA9IFNJR0NITEQ7CWJyZWFrOwotI2VsaWYgZGVmaW5lZChTSUdDTEQpCi0JCSAgY2FzZSAyMDogb3Nfc2lnID0gU0lHQ0xEOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1RUSU4KLQkJICBjYXNlIDIxOiBvc19zaWcgPSBTSUdUVElOOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1RUT1UKLQkJICBjYXNlIDIyOiBvc19zaWcgPSBTSUdUVE9VOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0lPCi0JCSAgY2FzZSAyMzogb3Nfc2lnID0gU0lHSU87CWJyZWFrOwotI2VsaWYgZGVmaW5lZCAoU0lHUE9MTCkKLQkJICBjYXNlIDIzOiBvc19zaWcgPSBTSUdQT0xMOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLQkJICBjYXNlIDI0OiBvc19zaWcgPSBTSUdYQ1BVOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1hGU1oKLQkJICBjYXNlIDI1OiBvc19zaWcgPSBTSUdYRlNaOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1ZUQUxSTQotCQkgIGNhc2UgMjY6IG9zX3NpZyA9IFNJR1ZUQUxSTTsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQUk9GCi0JCSAgY2FzZSAyNzogb3Nfc2lnID0gU0lHUFJPRjsJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSUdXSU5DSAotCQkgIGNhc2UgMjg6IG9zX3NpZyA9IFNJR1dJTkNIOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR0xPU1QKLQkJICBjYXNlIDI5OiBvc19zaWcgPSBTSUdMT1NUOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjEKLQkJICBjYXNlIDMwOiBvc19zaWcgPSBTSUdVU1IxOwlicmVhazsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjIKLQkJICBjYXNlIDMxOiBvc19zaWcgPSBTSUdVU1IyOwlicmVhazsKLSNlbmRpZgotCQkgIH0KLQotCQlpZiAob3Nfc2lnID09IC0xKQotCQkgIHsKLQkJICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotCQkgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiVW5rbm93biBzaWduYWwgJWRcbiIsIFBBUk0yKTsKLQkJICAgICgqZDEwdl9jYWxsYmFjay0+Zmx1c2hfc3Rkb3V0KSAoZDEwdl9jYWxsYmFjayk7Ci0JCSAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgUkVUVkFMIChraWxsIChQQVJNMSwgUEFSTTIpKTsKLQkJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSBUQVJHRVRfU1lTX2V4ZWN2ZToKLQkgICAgdHJhY2VfaW5wdXQgKCI8ZXhlY3ZlPiIsIE9QX1IwLCBPUF9SMSwgT1BfUjIpOwotCSAgICBSRVRWQUwgKGV4ZWN2ZSAoTUVNUFRSIChQQVJNMSksIChjaGFyICoqKSBNRU1QVFIgKFBBUk0yKSwKLQkJCSAgICAgKGNoYXIgKiopTUVNUFRSIChQQVJNMykpKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOwotCSAgICBicmVhazsKLQotI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKLQkgIGNhc2UgVEFSR0VUX1NZU19leGVjdjoKLQkgICAgdHJhY2VfaW5wdXQgKCI8ZXhlY3Y+IiwgT1BfUjAsIE9QX1IxLCBPUF9WT0lEKTsKLQkgICAgUkVUVkFMIChleGVjdmUgKE1FTVBUUiAoUEFSTTEpLCAoY2hhciAqKikgTUVNUFRSIChQQVJNMiksIE5VTEwpKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOwotCSAgICBicmVhazsKLSNlbmRpZgotCi0JICBjYXNlIFRBUkdFVF9TWVNfcGlwZToKLQkgICAgewotCSAgICAgIHJlZ190IGJ1ZjsKLQkgICAgICBpbnQgaG9zdF9mZFsyXTsKLQotCSAgICAgIHRyYWNlX2lucHV0ICgiPHBpcGU+IiwgT1BfUjAsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotCSAgICAgIGJ1ZiA9IFBBUk0xOwotCSAgICAgIFJFVFZBTCAocGlwZSAoaG9zdF9mZCkpOwotCSAgICAgIFNXIChidWYsIGhvc3RfZmRbMF0pOwotCSAgICAgIGJ1ZiArPSBzaXplb2YodWludDE2KTsKLQkgICAgICBTVyAoYnVmLCBob3N0X2ZkWzFdKTsKLQkgICAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0jaWYgMAotI2lmZGVmIFRBUkdFVF9TWVNfd2FpdAotCSAgY2FzZSBUQVJHRVRfU1lTX3dhaXQ6Ci0JICAgIHsKLQkgICAgICBpbnQgc3RhdHVzOwotCSAgICAgIHRyYWNlX2lucHV0ICgiPHdhaXQ+IiwgT1BfUjAsIE9QX1ZPSUQsIE9QX1ZPSUQpOwotCSAgICAgIFJFVFZBTCAod2FpdCAoJnN0YXR1cykpOwotCSAgICAgIGlmIChQQVJNMSkKLQkJU1cgKFBBUk0xLCBzdGF0dXMpOwotCSAgICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotI2Vsc2UKLQkgIGNhc2UgVEFSR0VUX1NZU19nZXRwaWQ6Ci0JICAgIHRyYWNlX2lucHV0ICgiPGdldHBpZD4iLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKLQkgICAgUkVUVkFMICgxKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBUQVJHRVRfU1lTX2tpbGw6Ci0JICAgIHRyYWNlX2lucHV0ICgiPGtpbGw+IiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOwotCSAgICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLQkgICAgU3RhdGUuZXhjZXB0aW9uID0gUEFSTTI7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgIGNhc2UgVEFSR0VUX1NZU19yZWFkOgotCSAgICB0cmFjZV9pbnB1dCAoIjxyZWFkPiIsIE9QX1IwLCBPUF9SMSwgT1BfUjIpOwotCSAgICBSRVRWQUwgKGQxMHZfY2FsbGJhY2stPnJlYWQgKGQxMHZfY2FsbGJhY2ssIFBBUk0xLCBNRU1QVFIgKFBBUk0yKSwKLQkJCQkJICBQQVJNMykpOwotCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFRBUkdFVF9TWVNfd3JpdGU6Ci0JICAgIHRyYWNlX2lucHV0ICgiPHdyaXRlPiIsIE9QX1IwLCBPUF9SMSwgT1BfUjIpOwotCSAgICBpZiAoUEFSTTEgPT0gMSkKLQkgICAgICBSRVRWQUwgKChpbnQpZDEwdl9jYWxsYmFjay0+d3JpdGVfc3Rkb3V0IChkMTB2X2NhbGxiYWNrLAotCQkJCQkJCSBNRU1QVFIgKFBBUk0yKSwgUEFSTTMpKTsKLQkgICAgZWxzZQotCSAgICAgIFJFVFZBTCAoKGludClkMTB2X2NhbGxiYWNrLT53cml0ZSAoZDEwdl9jYWxsYmFjaywgUEFSTTEsCi0JCQkJCQkgIE1FTVBUUiAoUEFSTTIpLCBQQVJNMykpOwotCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFRBUkdFVF9TWVNfbHNlZWs6Ci0JICAgIHRyYWNlX2lucHV0ICgiPGxzZWVrPiIsIE9QX1IwLCBPUF9SMSwgT1BfUjIpOwotCSAgICBSRVRWQUwzMiAoZDEwdl9jYWxsYmFjay0+bHNlZWsgKGQxMHZfY2FsbGJhY2ssIFBBUk0xLAotCQkJCQkgICAgKCgoKHVuc2lnbmVkIGxvbmcpIFBBUk0yKSA8PCAxNikKLQkJCQkJICAgICB8fCAodW5zaWduZWQgbG9uZykgUEFSTTMpLAotCQkJCQkgICAgUEFSTTQpKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzMyIChyZXN1bHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgotCSAgICB0cmFjZV9pbnB1dCAoIjxjbG9zZT4iLCBPUF9SMCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0JICAgIFJFVFZBTCAoZDEwdl9jYWxsYmFjay0+Y2xvc2UgKGQxMHZfY2FsbGJhY2ssIFBBUk0xKSk7Ci0JICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgVEFSR0VUX1NZU19vcGVuOgotCSAgICB0cmFjZV9pbnB1dCAoIjxvcGVuPiIsIE9QX1IwLCBPUF9SMSwgT1BfUjIpOwotCSAgICBSRVRWQUwgKGQxMHZfY2FsbGJhY2stPm9wZW4gKGQxMHZfY2FsbGJhY2ssIE1FTVBUUiAoUEFSTTEpLCBQQVJNMikpOwotCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFRBUkdFVF9TWVNfZXhpdDoKLQkgICAgdHJhY2VfaW5wdXQgKCI8ZXhpdD4iLCBPUF9SMCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0JICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX0VYSVQ7Ci0JICAgIHRyYWNlX291dHB1dF92b2lkICgpOwotCSAgICBicmVhazsKLQotI2lmZGVmIFRBUkdFVF9TWVNfc3RhdAotCSAgY2FzZSBUQVJHRVRfU1lTX3N0YXQ6Ci0JICAgIHRyYWNlX2lucHV0ICgiPHN0YXQ+IiwgT1BfUjAsIE9QX1IxLCBPUF9WT0lEKTsKLQkgICAgLyogc3RhdCBzeXN0ZW0gY2FsbCAqLwotCSAgICB7Ci0JICAgICAgc3RydWN0IHN0YXQgaG9zdF9zdGF0OwotCSAgICAgIHJlZ190IGJ1ZjsKLQotCSAgICAgIFJFVFZBTCAoc3RhdCAoTUVNUFRSIChQQVJNMSksICZob3N0X3N0YXQpKTsKLQotCSAgICAgIGJ1ZiA9IFBBUk0yOwotCi0JICAgICAgLyogVGhlIGhhcmQtY29kZWQgb2Zmc2V0cyBhbmQgc2l6ZXMgd2VyZSBkZXRlcm1pbmVkIGJ5IHVzaW5nCi0JICAgICAgICogdGhlIEQxMFYgY29tcGlsZXIgb24gYSB0ZXN0IHByb2dyYW0gdGhhdCB1c2VkIHN0cnVjdCBzdGF0LgotCSAgICAgICAqLwotCSAgICAgIFNXICAoYnVmLCAgICBob3N0X3N0YXQuc3RfZGV2KTsKLQkgICAgICBTVyAgKGJ1ZisyLCAgaG9zdF9zdGF0LnN0X2lubyk7Ci0JICAgICAgU1cgIChidWYrNCwgIGhvc3Rfc3RhdC5zdF9tb2RlKTsKLQkgICAgICBTVyAgKGJ1Zis2LCAgaG9zdF9zdGF0LnN0X25saW5rKTsKLQkgICAgICBTVyAgKGJ1Zis4LCAgaG9zdF9zdGF0LnN0X3VpZCk7Ci0JICAgICAgU1cgIChidWYrMTAsIGhvc3Rfc3RhdC5zdF9naWQpOwotCSAgICAgIFNXICAoYnVmKzEyLCBob3N0X3N0YXQuc3RfcmRldik7Ci0JICAgICAgU0xXIChidWYrMTYsIGhvc3Rfc3RhdC5zdF9zaXplKTsKLQkgICAgICBTTFcgKGJ1ZisyMCwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKLQkgICAgICBTTFcgKGJ1ZisyOCwgaG9zdF9zdGF0LnN0X210aW1lKTsKLQkgICAgICBTTFcgKGJ1ZiszNiwgaG9zdF9zdGF0LnN0X2N0aW1lKTsKLQkgICAgfQotCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgIGNhc2UgVEFSR0VUX1NZU19jaG93bjoKLQkgICAgdHJhY2VfaW5wdXQgKCI8Y2hvd24+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7Ci0JICAgIFJFVFZBTCAoY2hvd24gKE1FTVBUUiAoUEFSTTEpLCBQQVJNMiwgUEFSTTMpKTsKLQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBUQVJHRVRfU1lTX2NobW9kOgotCSAgICB0cmFjZV9pbnB1dCAoIjxjaG1vZD4iLCBPUF9SMCwgT1BfUjEsIE9QX1IyKTsKLQkgICAgUkVUVkFMIChjaG1vZCAoTUVNUFRSIChQQVJNMSksIFBBUk0yKSk7Ci0JICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkgICAgYnJlYWs7Ci0KLSNpZiAwCi0jaWZkZWYgVEFSR0VUX1NZU191dGltZQotCSAgY2FzZSBUQVJHRVRfU1lTX3V0aW1lOgotCSAgICB0cmFjZV9pbnB1dCAoIjx1dGltZT4iLCBPUF9SMCwgT1BfUjEsIE9QX1IyKTsKLQkgICAgLyogQ2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHZvaWQgKiwgdG8gYXZvaWQgdHlwZSBtaXNtYXRjaAotCSAgICAgICBpZiBhIHByb3RvdHlwZSBpcyBwcmVzZW50LiAgKi8KLQkgICAgUkVUVkFMICh1dGltZSAoTUVNUFRSIChQQVJNMSksICh2b2lkICopIE1FTVBUUiAoUEFSTTIpKSk7Ci0JICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKLQkgICAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgMAotI2lmZGVmIFRBUkdFVF9TWVNfdGltZQotCSAgY2FzZSBUQVJHRVRfU1lTX3RpbWU6Ci0JICAgIHRyYWNlX2lucHV0ICgiPHRpbWU+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7Ci0JICAgIFJFVFZBTDMyICh0aW1lIChQQVJNMSA/IE1FTVBUUiAoUEFSTTEpIDogTlVMTCkpOwotCSAgICB0cmFjZV9vdXRwdXRfMzIgKHJlc3VsdCk7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQkgICAgCi0JICBkZWZhdWx0OgotCSAgICBkMTB2X2NhbGxiYWNrLT5lcnJvciAoZDEwdl9jYWxsYmFjaywgIlVua25vd24gc3lzY2FsbCAlZCIsIEZVTkMpOwotCSAgfQotCWlmICgodWludDE2KSByZXN1bHQgPT0gKHVpbnQxNikgLTEpCi0JICBSRVRFUlIgKGQxMHZfY2FsbGJhY2stPmdldF9lcnJubyhkMTB2X2NhbGxiYWNrKSk7Ci0JZWxzZQotCSAgUkVURVJSICgwKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIHRzdDBpICovCi12b2lkCi1PUF83MDAwMDAwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgidHN0MGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOwotICBTRVRfUFNXX0YxIChQU1dfRjApOzsKLSAgU0VUX1BTV19GMCAoKEdQUiAoT1BbMF0pICYgT1BbMV0pID8gMSA6IDApOwotICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKLX0KLQotLyogdHN0MWkgKi8KLXZvaWQKLU9QX0YwMDAwMDAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJ0c3QxaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfRjEgKFBTV19GMCk7Ci0gIFNFVF9QU1dfRjAgKCh+KEdQUiAoT1BbMF0pKSAmIE9QWzFdKSA/IDEgOiAwKTsKLSAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Ci19Ci0KLS8qIHdhaXQgKi8KLXZvaWQKLU9QXzVGODAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJ3YWl0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7Ci0gIFNFVF9QU1dfSUUgKDEpOwotICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKLX0KLQotLyogeG9yICovCi12b2lkCi1PUF9BMDAgKCkKLXsKLSAgaW50MTYgdG1wOwotICB0cmFjZV9pbnB1dCAoInhvciIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKLSAgdG1wID0gKEdQUiAoT1BbMF0pIF4gR1BSIChPUFsxXSkpOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQotCi0vKiB4b3IzICovCi12b2lkCi1PUF81MDAwMDAwICgpCi17Ci0gIGludDE2IHRtcDsKLSAgdHJhY2VfaW5wdXQgKCJ4b3IzIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9DT05TVEFOVDE2KTsKLSAgdG1wID0gKEdQUiAoT1BbMV0pIF4gT1BbMl0pOwotICBTRVRfR1BSIChPUFswXSwgdG1wKTsKLSAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvQ2hhbmdlTG9nIGIvc2ltL2QzMHYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ1YTQ1Li4wMDAwMDAwCi0tLSBhL3NpbS9kMzB2L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEzNzYgKzAsMCBAQAotVHVlIE1heSAyMyAyMTozOToyMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMjAwMC0wNC0xMiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAcmVkaGF0LmNvbT4KLQotCSogY3B1LmggKEdQUl9DTEVBUik6IE5ldyBtYWNyby4JCi0JKEdQUl9TRVQpOiBSZW1vdmVkIG1hY3JvLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgU2VwICAxIDExOjM4OjIxIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNuczogQ2FzdCBDSUEgdG8gTE9ORyBpbiBwcmludGZzLgotCi1UdWUgQXVnIDMxIDAxOjMyOjIyIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY3B1LmggKHVucXVldWVfd3JpdGVzKTogQWRkIGRlY2xhcmF0aW9uLgotCi0xOTk5LTA1LTI3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fcmVwZWF0KTogUHJpbnQgYSB3YXJuaW5nIGlmIGEgUkVQRUFUIG9yIFJFUEVBVEkKLQlpbnN0cnVjdGlvbiBsb29wIGlzIHRvbyBzbWFsbC4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi0xOTk5LTAzLTE2ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQlGcm9tIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjcHUuaCAobXZ0c3lzX2xlZnRfcCk6IE5ldyBmbGFnIGZvciBNVlRTWVMgaW5zdHJ1Y3Rpb24gaGlzdG9yeS4KLSAgICAgICAgKiBkMzB2LWluc25zIChtdnRzeXMpOiBTZXQgdGhpcyBmbGFnIGluc3RlYWQgb2YgbGVmdF9raWxsc19yaWdodF9wLgotICAgICAgICAoZG9fc2F0aCk6IERldGVjdCBNVlRTWVMgYnkgbmV3IGZsYWcuCi0gICAgICAgICogZW5naW5lLmMgKHVucXVldWVfd3JpdGVzKTogRGV0ZWN0IE1WVFNZUyBieSBuZXcgZmxhZy4KLSAgICAgICAgKGRvXzJfc2hvcnQsIGRvX3BhcmFsbGVsKTogSW5pdGlhbGl6ZSBuZXcgZmxhZy4KLSAgICAgICAKLTE5OTktMDItMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIHRjb25maWcuaW4gKFNJTV9IQU5ETEVTX0xNQSk6IE1ha2UgaXQgc28uCi0KLTE5OTktMDEtMTIgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IE1ha2UgUFNXIGNvbmZsaWN0IHJlc29sdXRpb24gY29kZQotIAljb25kaXRpb25hbCAtIGRpc2FibGUgaXQgZm9yIE1WVFNZUyB8fCBpbnNuIGNhc2UuCi0JCi0xOTk5LTAxLTExICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19zYXRoKTogRHJhaW4gUFNXIHdyaXRlIHF1ZXVlIGJlZm9yZSBQU1dfU19GTEFHCi0gCXVwZGF0ZS4KLQkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IE1ha2Ugbm9uLXN0YXRpYy4gIFJlbW92ZSBQU1dfVi9WQQotCXNwZWNpYWwgY2FzZS4KLQkoZG9fcGFyYWxsZWwpOiBEb24ndCBkcmFpbiBQU1cgd3JpdGUgcXVldWUgZm9yIE1WVFNZUyB8fCBpbnNuLgotCi0xOTk5LTAxLTA3ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19sZDJoKTogU2lnbi1leHRlbmQgbG9hZGVkIGhhbGYtd29yZHMuCi0KLTE5OTktMDEtMDUgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX2xkMmgpOiBSZWFkIG1lbW9yeSBpbiB3b3JkIHVuaXRzLgotCShkb19sZDRiaCk6IERpdHRvLiAgQ29ycmVjdCBzaWduIGV4dGVuc2lvbi4KLQkoZG9fbGQ0Ymh1KTogRGl0dG8uCi0JKGRvX3N0MmgpOiBXcml0ZSBtZW1vcnkgaW4gd29yZCB1bml0cy4KLQkoZG9fc3Q0aGIpOiBEaXR0by4KLQkoc3Q0aGIpOiBDb3JyZWN0IG1uZW1vbmljIGluIGlnZW4gdGVtcGxhdGUuCi0KLTE5OTgtMTItMDggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnM6IChkb19sZDJoKTogRG9uJ3QgdXBkYXRlIFIwIG5vciBSMSBmb3IgZG91YmxlLXdvcmQgaW5zbi4KLQkoZG9fbGQydyk6IERpdHRvLgotIAkoZG9fbGQ0YmgpOiBEaXR0by4KLSAJKGRvX2xkNGJodSk6IERpdHRvLgotIAkoZG9fbXVseDJoKTogRGl0dG8uCi0KLTE5OTgtMTItMDMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3JlcGVhdCk6IERvbid0IHNldCBSUCBmb3IgcmVwZWF0IGNvdW50IDEuCi0KLTE5OTgtMTItMDMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NyYyk6IFRyZWF0IHNoaWZ0IGNvdW50IC0zMiBuYXR1cmFsbHkgaW5zdGVhZCBvZgotCXByb2R1Y2luZyB6ZXJvIHJlc3VsdC4KLQotMTk5OC0xMS0yMiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fc3JjKTogTGltaXQgU1JDIHNoaWZ0IGNvdW50IHRvIC0zMiAuLiAzMS4KLQotMTk5OC0xMS0xNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZGJ0KTogRGVmZXIgUFNXL0RQU1cgdXBkYXRlIHdpdGggbmV3IERJRF9UUkFQIGNvZGUgMi4gIAotCSogZW5naW5lLmMgKHVucXVldWVfd3JpdGVzKTogUGVyZm9ybSBEQlQgcHJvY2Vzc2luZyBvbiBQU1cvRFBTVyBoZXJlLgotCi0xOTk4LTExLTEyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjcHUuaCAoX3NpbV9jcHUpOiBSZW1vdmVkIGlzX2RlbGF5ZWRfY2FsbCBmaWVsZCwgYW5kIGFzc29jaWF0ZWQKLSAJUlBUX0lTX0NBTEwgbWFjcm8uICAKLQkqIHNpbS1jYWxscy5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogRG9uJ3QgaW5pdGlhbGl6ZSBpc19kZWxheWVkX2NhbGwuCi0JKiBkMzB2LWluc25zIChkb19kYnJhKTogRG9uJ3QgY2xlYXIgUlBUX0lTX0NBTEwuIChkb19kYnJhaSk6IERpdHRvLiAKLQkoZG9fZGptcCk6IERpdHRvLiAoZG9fZGptcGkpOiBEaXR0by4gKGRvX3JlcGVhdCk6IERpdHRvLiAKLQkqIGQzMHYtaW5zbnMgKGRvX2Ric3IpOiBEb24ndCBzZXQgUlBUX0lTX0NBTEwsIGJ1dCBzZXQgUjYyIGluc3RlYWQuIAotCShkb19kYnNyaSk6IERpdHRvLiAoZG9fZGpzcik6IERpdG8uIChkb19kanNyaSk6IERpdHRvLgotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogUmVtb3ZlIGNvbmRpdGlvbmFsIHNldHRpbmcgb2YgUjYyIGJhc2VkIAotCXVwb24gUlBUX0lTX0NBTEwuCi0JCi0xOTk4LTExLTA4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBBZGQgZHVtbXkgbWVtb3J5IHJhbmdlIG92ZXIgY29udHJvbAotCXJlZ2lzdGVyIHJlZ2lvbiAoMHg0MDAwMDAwMC4uMHg0MDAwRkZGRikuCi0gCi0xOTk4LTExLTA2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19tdmZhY2MpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byA2MyAuLiAwLgotCi1UdWUgT2N0IDEzIDExOjAxOjE2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NyYSxkb19zcmFoLGRvX3NybCxkb19zcmxoKTogTWFrZSBzaGlmdAotIAljb3VudCAtMzIgdG8gcHJvZHVjZSB6ZXJvIHJlc3VsdC4KLQkoZG9fc3JjKTogRGl0dG8gZm9yIHNoaWZ0IGNvdW50ID09IC02NC4KLQotTW9uIE9jdCAxMiAyMzowNDoxMSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChST1QpOiBVc2UgMHgxZiBiaXQgbWFzayBmb3Igcm90YXRlIGNvdW50IG1hc2tpbmcuCi0JKGRvX3NyYSxkb19zcmwpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byAtMzIgLi4gMzEuCi0JKGRvX3NyYWgsZG9fc3JsaCk6IFVzZSBsb29wIHRvIGxpbWl0IHNoaWZ0IGNvdW50IHRvIC0zMiAuLiAzMS4KLQkoc3JhMmgsc3JsMmgpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byAtMTYgLi4gMTUuCi0JKGRvX3NyYyk6IFVzZSBsb29wIHRvIGxpbWl0IHNoaWZ0IGNvdW50IHRvIC02NCAuLiA2My4KLQotRnJpIE9jdCAgOSAxNjo0Njo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tY2FsbHMuYyAoZ2V0X2luc25fbmFtZSk6IE5ldyBmbi4KLQkoc2ltX29wZW4pOiBJbml0aWFsaXplIENQVV9JTlNOX05BTUUsQ1BVX01BWF9JTlNOUy4KLQkqIHNpbS1tYWluLmggKE1BWF9JTlNOUyxJTlNOX05BTUUpOiBEZWxldGUuCi0KLU1vbiBTZXAgMjggMTA6NDM6MjggMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fc3JhLGRvX3NyYWgsZG9fc3JsLGRvX3NybGgsUk9ULGRvX3NyYyk6IFVzZQotCWNvcnJlY3QgTVNCIGJpdCBudW1iZXJzIGZvciBzaWduIGV4dGVuc2lvbiBtYXNrcy4KLQotRnJpIFNlcCAyNSAxNzozMjoyNyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBlbmdpbmUuYyAoZG9fcGFyYWxsZWwpOiBVbnF1ZXVlIHdyaXRlcyBpZiBNVSBpbnN0cnVjdGlvbiB3YXMKLQlhIE1WVFNZUywgYXMgaWRlbnRpZmllZCBieSBpdHMgbGVmdF9raWxsc19yaWdodF9wIHNpZGUtZWZmZWN0LgotCi1GcmkgU2VwIDI1IDEyOjMxOjM0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NyYSxkb19zcmFoLGRvX3NybCxkb19zcmxoLFJPVCxkb19zcmMpOiBNYXNrCi0gCXNoaWZ0L3JvdGF0ZSBjb3VudHMgdG8gbnVtYmVyIG9mIGJpdHMgaW4gd2lkdGggb2Ygb3BlcmFuZDsgbm8KLSAJbG9uZ2VyIHNhdHVyYXRlIGF0IG1heGltYS4KLQotVHVlIEp1bCAxNCAxODozOToyMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjcHUuaCAobGVmdF9raWxsc19yaWdodF9wKTogTmV3IGZsYWcgZm9yIG5vbi1icmFuY2ggaW5zdHJ1Y3Rpb25zCi0JdGhhdCwgd2hlbiBleGVjdXRlZCBpbiBsZWZ0IHNsb3Qgb2YgYSAtPiBzZXF1ZW50aWFsIHBhaXIsIGtpbGwgdGhlCi0JcmlnaHQgc2xvdC4KLQkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IFNldCBmbGFnIGZvciBQU1cvUFNXaC9QU1dsL0ZMQUcgb3BlcmFuZHMuCi0JKiBlbmdpbmUuYyAoZG9fMl9zaG9ydCk6IFJlc3BlY3QgZmxhZy4KLQkKLVRodSBKdW4gIDQgMTY6NDg6NTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBkb24ndCBzYXZlIHRoZSBiUFNXIGFuZCBQU1cgYmFzZWQgb24KLQljdXJyZW50IHZhbHVlcyBiZWNhdXNlIGFuIGluc3RydWN0aW9uIGRvbmUgaW4gcGFyYWxsZWwgd2l0aAotCXRoZSB0cmFwIG1pZ2h0IGNoYW5nZSB0aGVtLCBpbnN0ZWFkIHNldCBhIGZsYWcgZG8gdGhhdAotCXVucXVldWVfd3JpdGVzIHdpbGwgdGFrZSBjYXJlIG9mIGl0LgotCSogZW5naW5lLmMgKHVucXVldWVfd3JpdGVzKTogZmluaXNoIHRyYXAgaGFuZGxpbmcKLQkqIGNwdS5oIChfc2ltX2NwdSk6IGFkZCBuZXcgZmllbGQgZGlkX3RyYXAgYW5kIGEgbWFjcm8gRElEX1RSQVAKLQl0byBtYWtlIHVzZSBvZiBpdDsgc2V0IGJ5IGRvX3RyYXAsIHRlc3RlZCBhbmQgY2xlYXJlZCBieQotCXVucXVldWVfd3JpdGVzLgotCi1UdWUgTWF5IDE5IDE2OjA3OjA0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IFN1cHByZXNzIHRoZSBhbGwgZW5xdWV1ZWQgd3JpdGVzIHRvCi0gCXRoZSBzYW1lIGZsYWdzIGluIFBTVyBleGNlcHQgdGhlIGxhc3QuCi0KLUZyaSBNYXkgMTUgMTE6Mzg6NTkgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoUkVUSSk6IENvcnJlY3QgaW5zdHJ1Y3Rpb24gc3BlbGxpbmcgdG8gInJlaXQiLgotCi1UaHUgTWF5IDE0IDA5OjM0OjIwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRidCk6IEhhbmRsZSBEQlQgYXQgZW5kIG9mIHJlcGVhdCBibG9jay4KLQkoZG9fdHJhcCwgZGJ0KTogQ2xlYXIgUFNXX1JQIGlmIGF0IGVuZCBvZiByZXBlYXQgYmxvY2suCi0KLVRodSBNYXkgMTQgMDc6NDE6NDEgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogVHJpZ2dlciBEREJUIGJhc2VkIG9uIHByZXZpb3VzIFBDLAotIAlpbnN0ZWFkIG9mIG5leHQgUEMuCi0KLVdlZCBNYXkgMTMgMTE6MDM6NDAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogTW92ZSBEREJUIGhhbmRsaW5nIGFmdGVyIGluc3RydWN0aW9uCi0gCWRlY29kZS9leGVjdXRlIHN0YWdlLgotCi1UdWUgTWF5IDEyIDEyOjE0OjUzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NhdCopOiBDb3JyZWN0ICJzYXR1cmF0ZSB0byAwIGJpdHMiIHBhdGNoIHRvCi0gCXByb3Blcmx5IGhhbmRsZSBuZWdhdGl2ZSBzYXR1cmF0aW9uIGlucHV0cy4KLQotVHVlIE1heSAxMiAxMToxMToyNiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBEZWNyZW1lbnQgUlBUX0Mgb25seSB1bmRlciBtb3JlCi0gCXJlc3RyaWN0ZWQgY29uZGl0aW9ucy4KLQotTW9uIE1heSAxMSAxNzozMzo0NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19zYXQqKTogTWFrZSAic2F0dXJhdGUgdG8gMCBiaXRzIiBwYXNzIHRocm91Z2ggZGF0YQotIAl1bmNoYW5nZWQuCi0KLU1vbiBNYXkgMTEgMTY6Mjc6MDQgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogSW1wbGVtZW50IEREQlQgKGRlYnVnZ2VyIGRlYnVnIHRyYXApCi0JZnVuY3Rpb25hbGl0eS4KLQotRnJpIE1heSAgOCAxNjo0NDoxOSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb190cmFwKTogU2V0IGJQQyB0byBSUFRfUyBpZiB0cmFwIGlzIGxhc3QKLQlpbnN0cnVjdGlvbiBpbiByZXBlYXQgYmxvY2suCi0JKGJzciovanNyKik6IFNldCBSNjIgKExJTkspIHRvIFJQVF9TIGlmIHN1YnJvdXRpbmUgYnJhbmNoCi0JaXMgbGFzdCBpbnN0cnVjdGlvbiBpbiByZXBlYXQgYmxvY2suCi0KLUZyaSBNYXkgIDggMTE6MDY6NTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fc2F0aCk6IFF1ZXJ5L3VwZGF0ZSBGNC9QU1dfUyB1c2luZyBwcm9wZXIgZmxhZwotIAltYWNyby4KLQkqIGNwdS5oIChQU1dfU19GTEFHKTogTmV3IGZsYWcgbnVtYmVyIGZvciBQU1dfUyBzdGF0dXMgYml0LgotCi1XZWQgTWF5ICA2IDE5OjQwOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKElOU05fTkFNRSk6IE5ldyBhcmcgYGNwdScuCi0KLUZyaSBNYXkgIDEgMTQ6MjQ6MzAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zOiBGaXggcGFyYW1ldGVyIGxpc3QgdG8gc2ltX2VuZ2luZV9hYm9ydC4KLQotVGh1IEFwciAzMCAxNDoyODowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fc2F0aCk6IEFkZCBhZGRpdGlvbmFsIGFyZ3VtZW50IHRoYXQgZGV0ZXJtaW5lcwotCXdoZXRoZXIgb3Igbm90IHRoZSBGNCAoUFNXX1MpIGJpdCBpbiB0aGUgUFNXIGlzIHVwZGF0ZWQuCi0JKFNBVDJIKTogRG8gbm90IHVwZGF0ZSBQU1dfUyBiaXQuCi0JKFNBVEhwKTogRG8gdXBkYXRlIFBTV19TIGJpdC4KLQotVHVlIEFwciAyOCAyMzozNjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoU1JBSHAsIFNSTEhwKTogIEltbWVkaWF0ZSB2YWx1ZXMgYXJlIHNpZ25lZCA2IGJpdAotCXZhbHVlcywgbm90IDUgYml0IHZhbHVlcy4KLQotV2VkIEFwciAyOSAxMjo1Nzo1NSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19pbmNyKTogQ2hlY2sgbW9kdWxhciBhcml0aG1ldGljIGxpbWl0cyBhZnRlcgotIAlwb3N0aW5jcmVtZW50L3Bvc3RkZWNyZW1lbnQsIHJhdGhlciB0aGFuIGJlZm9yZSwgdG8gbWF0Y2gKLSAJZXJyb25lb3VzIGhhcmR3YXJlIGJlaGF2aW9yLgotCi1UdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBBcHIgMjcgMTk6NDI6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBDbGVhciBhbGwgYml0cyBpbiBQU1cgZXhjZXB0IFNNIGFuZCBEQi4KLQotTW9uIEFwciAyNyAxNDo1NTowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fbXVseDJoKTogTG93IG9yZGVyIHJlc3VsdHMgZ28gaW4gcmErMSwgaGlnaAotCW9yZGVyIGluIHJhLgotCi1Nb24gQXByIDI3IDE0OjQyOjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19tdWx4MmgpOiBSZXdyaXRlIHRvIGRvIHByb3BlciAzMiBiaXQgc2lnbmVkCi0JbXVsdGlwbHkgb2YgaGlnaCBhbmQgbG93IGZpZWxkcyBmcm9tIG9wZXJhbmRzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjIwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToyMDowMCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotV2VkIEFwciAyMiAyMToyMzowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaWMtZDMwdiAoUmJVLCBSY1UpOiBVbnNpZ25lZCB2ZXJzaW9ucyBvZiBSYiBhbmQgUmMuCi0JKiBkMzB2LWluc25zIChNVlRBQ0MpOiBVc2UgbmV3IFJiVSBhbmQgUmNVIG1hY3Jvcy4KLQotV2VkIEFwciAyMiAyMDo1MjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaWMtZDMwdiAoUmJIVSxSYkxVKTogVW5zaWduZWQgdmVyc2lvbnMgb2YgUmJIIGFuZCBSYkwuCi0JKiBkMzB2LWluc25zIChTUkwySCk6IFVzZSBuZXcgUmJIVSBhbmQgUmJMVSBtYWNyb3MgaW5zdGVhZCBvZgotCVJiSCBhbmQgUmJMLgotCi1Nb24gQXByIDEzIDE2OjU5OjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19zcmwpOiBBdm9pZCB1bmRlZmluZWQgYmVoYXZpb3Igb2YgaG9zdCBjb21waWxlcgotCXdoZW4gc2hpZnRpbmcgbGVmdCBieSBtb3JlIHRoYW4gMzEgYml0cy4KLQotVHVlIEFwciAgNyAxODowOTowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogUmVtb3ZlIGF0X2xvb3BfZW5kIHZhcmlhYmxlLiBBZGQKLQlycF93YXNfc2V0IGFuZCBycHRfY193YXNfbm9uemVybyB2YXJpYWJsZXMuICBNYWpvciByZXN0cnVjdHVyaW5nIG9mCi0JY29kZSBiZWZvcmUgYW5kIGFmdGVyIGluc3RydWN0aW9uIGV4ZWN1dGlvbiB0byBwcm9wZXJseSBoYW5kbGUgc3RhdGUKLQlvZiB0aGUgUlAgYml0IGluIHRoZSBQU1csIHRoZSB2YWx1ZSBpbiBSUFRfQywgYW5kIG90aGVyIGxvb3AgcmVsYXRlZAotCXByb2JsZW1zLgotCi1TYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgQXByICAzIDE1OjI2OjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb190cmFwKTogVXNlIG9mZnNldCBmcm9tIEVJVF9WQiByYXRoZXIgdGhhbiBoYXJkY29kZWQKLQlCQVNFX0FERFJFU1MgY29uc3RhbnQuCi0JKiBjcHUuaCAoQkFTRV9BRERSRVNTKTogUmVtb3ZlIGNvbnN0YW50IG5vdCB1c2VkIGFueSBsb25nZXIuCi0KLUZyaSBBcHIgIDMgMTQ6NDI6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oIChFSVRfVkIpOiBEZWZpbmUgbWFjcm8gdG8gYWNjZXNzIEVJVF9WQiByZWdpc3Rlci4KLQkoRUlUX1ZCX0RFRkFVTFQpOiBEZWZpbmUgdmFsdWUgb2YgRUlUX1ZCIHJlZ2lzdGVyIGFmdGVyIHJlc2V0LgotCSogc2ltLWNhbGxzLmMgKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBTZXQgRUlUX1ZCIHRvIEVJVF9WQl9ERUZBVUxULgotCi1UdWUgTWFyIDMxIDE5OjAwOjAwIDE5OTggIEZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX2RicmFpKTogUlBUX1MgaXMgY2lhIHBsdXMgcGNkaXNwIHJhdGhlciB0aGFuCi0JanVzdCBwY2Rpc3AuCi0KLU1vbiBNYXIgMzAgMjA6MzA6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IEFkZCBhdF9sb29wX2VuZC4gIFJld29yayBlbmQgb2YgbG9vcAotCWNvZGUgdG8gdXNlIHRoaXMgdG8gYm90aCByZXNldCBQU1dfUlAgd2hlbiBuZWVkZWQgYW5kIHRvIHNldCBQQwotCXRvIFJQVF9TIGZvciBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGUgbG9vcC4KLQotTW9uIE1hciAzMCAxNjoxMjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogQ2hhbmdlIGNvZGUgdGhhdCBoYW5kbGVzIFJQVF8qIHJlZ3MKLQlhbmQgUFNXX1JQIGJpdCBpbiBQU1cgc28gdGhhdCBQU1dfUlAgaXMgYWx3YXlzIHNldCB3aGlsZSBleGVjdXRpbmcKLQl0aGUgbG9vcCBhbmQgbG9vcCB0ZXJtaW5hdGVzIHVwb24gY29tcGxldGlvbiBvZiB0aGUgcGFzcyBmb3Igd2hpY2gKLQlSUFRfQyBpcyB6ZXJvLiAgTW9yZSBjbG9zZWx5IGZvbGxvdyBsb2dpYyBpbiBhcmNoaXRlY3R1cmUgbWFudWFsLgotCi1GcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgTWFyIDE5IDAwOjI1OjQzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogTW92ZSBtZW1vcnktcmVnaW9uIGNvbW1hbmRzIGJhY2sgdG8KLSAJYmVmb3JlIHRoZSBjYWxsIHRvIHNpbV9wYXJzZV9hcmdzLgotCShkMzB2X29wdGlvbl9oYW5kbGVyKTogSW1wbGVtZW50IGV4dG1lbS1zaXplIG9wdGlvbiB1c2luZwotIAltZW1vcnktZGVsZXRlIGFuZCBtZW1vcnktcmVnaW9uIGNvbW1hbmRzLgotCi0JKiBzaW0tY2FsbHMuYyAoZDMwdl9vcHRpb25faGFuZGxlcik6IFVzZSBBTlNJLUMgYXJndW1lbnQgbGlzdCwKLSAJY29ycmVjdCBudW1iZXIgYW5kIHR5cGUgb2YgYXJndW1lbnRzLgotCQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxMSAxMzo1NjozMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFsdS5oIChJTUVNLCBNRU0sIFNUT1JFKTogUmVwbGFjZSBzaW1fY29yZV8qX21hcCB3aXRoIGV4ZWNfbWFwLAotIAlyZWFkX21hcCBhbmQgd3JpdGVfbWFwIHJlc3AuCi0KLQkqIGNwdS5jIChkMzB2X3JlYWRfbWVtLCBkMzB2X3dyaXRlX21lbSk6IERpdHRvLgotCi1Nb24gTWFyICAyIDEzOjM0OjA4IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19yZXBlYXQpOiBBYm9ydCByZXBlYXQgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZQotCWEgcmVwZWF0IGNvdW50IG9mIHplcm8uCi0KLUZyaSBGZWIgMjcgMTg6NDQ6MTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogVXBkYXRlIGNhbGwgdG8gc2ltX2FkZF9vcHRpb25fdGFibGUuCi0KLVRodSBGZWIgMjYgMTg6MzQ6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX2luZm8pOiBEZWxldGUuCi0KLVdlZCBGZWIgMjUgMTQ6NDQ6NTggMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IElmIG1vdmluZyB0byBFSVRfVkIgcmVnaXN0ZXIsIGFuZCB3aXRoCi0JdmFsaWQgYml0cy4gIE9wdGltaXplIGNvZGUgc29tZXdoYXQuCi0KLQkqIGNwdS5oIChlaXRfdmVjdG9yX2Jhc2VfY3IpOiBOZXcgQ1Igd2UgbmVlZCB0byBzcGVjaWFsIGNhc2UuCi0JKEVJVF9WQUxJRCk6IFZhbGlkIGJpdHMgZm9yIEVJVF9WQiByZWdpc3Rlci4KLQkKLQkqIGQzMHYtaW5zbnMgKG12e2YsdH1zeXMpOiBXaGVuIG1vdmluZyB0by9mcm9tIFBTV0gsIHRoZSB2YWx1ZSBpcwotCWluIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgcmVnaXN0ZXIuCi0KLQkqIGQzMHYtaW5zbnMgKGRvX3NyYSk6IFVzZSBhIGNvbW1vbiBXUklURTMyX1FVRVVFIHRvIHdyaXRlIGJhY2sKLQlyZXN1bHRzLgotCShkb19zcnthLGx9aCk6IERvIHNoaWZ0IGluIDMyIGJpdHMsIG9ubHkgdHJ1bmNhdGUgd2hlbiB3cml0aW5nCi0JcmVzdWx0IGJhY2sgdG8gdGhlIHJlZ2lzdGVycy4KLQotVHVlIEZlYiAyNCAxODowOTo1MiAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogVXNlIC1HIGdlbi16ZXJvLXIwIG9wdGlvbiB0byBmb3JjZQotCXIwIHRvIGFsd2F5cyBiZSB6ZXJvLgotCSogY3B1LmggKEdQUl9TRVQpOiBEZWZpbmUuCi0KLVR1ZSBGZWIgMjQgMTQ6MTI6NTcgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NhdGgpOiBEbyBzYXR1cmF0aW9uIGluIDMyIGJpdHMsIGJlZm9yZQotCWNvbnZlcnRpbmcgdG8gMTYuCi0JKHNhdHssMmgseixocH0pOiBVc2UgaW1tXzUsIG5vdCBpbW0gdG8gZ2V0IHByb3BlciB6ZXJvIGV4dGVuZC4KLQkoZG9fc2F0aF9wKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KLQkoc2F0aHApOiBDYWxsIGRvX3NhdGgsIG5vdCBkb19zYXRoX3AuCi0KLU1vbiBGZWIgMjMgMTU6NTU6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGlsbGVnYWwsd3Jvbmdfc2xvdCk6IFByaW50IFxuIGFmdGVyIFBDIGFuZCBiZWZvcmUgd2UKLQljYWxsIHNpbV9lbmdpbmVfaGFsdC4KLQkoc3J7YSxsfWhwKTogSW1wbGVtZW50IG1pc3NpbmcgaW5zdHJ1Y3Rpb25zLgotCShkb190cmFwKTogUHJpbnQgaGlnaCBvcmRlciBQU1cgYml0cyBpbiBodW1hbiByZWFkYWJsZSBmYXNoaW9uLgotCShkb197ZGJyYXssaX0sZGJzcnssaX0sZGptcHssaX0sZGpzcnssaX0scmVwZWF0fSk6IFNldCBQU1cgYml0IFJQLgotCi0JKiBhbHUuaCAoUFNXX1NFVF9RVUVVRSk6IE5ldyBtYWNybyB0byBzZXQgUFNXIGJpdHMuCi0KLQkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IENoZWNrIGZvciBSUCBiaXQgYmVpbmcgc2V0LCBub3QgUlBUX0MKLQliZWluZyA+IDAuICBJZiBSUFRfQyBpcyBkZWNyZW1lbnRlZCB0byAwLCBjbGVhciBQU1cgUlAgYml0LgotCi1GcmkgRmViIDIwIDEwOjEzOjM0IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjcHUuaCAoQkFTRV9BRERSRVNTKTogQ2hhbmdlIGZyb20gMHhmZmZmZjAwMCB0byAweGZmZmZmMDIwLgotCi1UdWUgRmViIDE3IDEyOjM5OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgotIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgotCi1GcmkgRmViICA2IDE3OjM5OjU0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19kYnJhaSk6IENvcnJlY3QgdHlwbywgdXNlIHNoaWZ0LCBub3QgY29tcGFyaXNvbi4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIEphbiAzMCAwODoyOToyMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IEFkZCBwYXJhbWV0ZXIgbnJfY3B1cy4KLQotRnJpIEphbiAzMCAxNzowOTozNyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoanNydHpyKTogQ2hlY2sgZm9yIHJlZ2lzdGVyID09IDAsIG5vdCAhPSAwLgotCi1XZWQgSmFuIDIxIDE3OjUyOjA0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZW5naW5lLmMgKGRvX3N0YWNrX3N3YXApOiBNYWtlIHR5cGUgb2YgbmV3X3NwIHVuc2lnbmVkLgotCi1Nb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gSmFuICA1IDE2OjA0OjE3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAc2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9pbmZvKTogQ2FsbCBwcm9maWxlX3ByaW50LgotCi0JKiBzaW0tbWFpbi5oOiBFbmFibGUgaW5zdHJ1Y3Rpb24gcHJvZmlsaW5nLgotCi1UaHUgRGVjIDE4IDEyOjIxOjM4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBhbHUuaCAoQUxVezE2LDMyfV9FTkQpOiBDaGFuZ2Ugc2V0dGluZyBQU1cgdG8gb25seSBzZXQgdGhlIGNhcnJ5Ci0JYW5kIG92ZXJmbG93IGJpdHMuICBEb24ndCBsb29rIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIFBTVy4KLQkoUFNXX0ZMQUdfU0VUX1FVRVVFKTogT25seSBxdWV1ZSB1cCBzZXR0aW5nIHRoZSBwYXJ0aWN1bGFyIGJpdCBpbgotCXF1ZXN0aW9uLiAgRG9uJ3QgbG9vayBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBQU1cuCi0KLQkqIGQzMHYtaW5zbnM6IEFsbCBpbnN0cnVjdGlvbnMgdGhhdCBzZXQgdGhlIFBTVywgd2lsbCBvbmx5IHF1ZXVlCi0JdXAgdGhlIHBhcnRpY3VsYXIgYml0cyBpbiBxdWVzdGlvbiB0aGF0IHdlcmUgc2V0IGJ5IHRoZQotCWluc3RydWN0aW9uLiAgRG9uJ3QgbG9vayBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBQU1cuCi0KLVdlZCBEZWMgMTcgMTE6NDE6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oIChQU1dfVkFMSUQpOiBBbGxvdyBFQS9EQiB0byBiZSBzZXQgaW4gdGhlIFBTVy4KLQkoRFBTV19WQUxJRCk6IExpa2UgUFNXX1ZBTElELCBidXQgaXQgYWxsb3dzIHRoZSBEUyBiaXQgdG8gYmUgc2V0LgotCi0JKiBlbmdpbmUuYyAodHJhY2VfYWx1MzIpOiBXaGVuIGNoYW5naW5nIEJQU1cvRFBTVywgcHJpbnQgdGhlCi0Jc3BlY2lhbCBQU1cgYml0cy4KLQotCSogZDMwdi1pbnNucyAoZG9fY21wX2NjKTogRml4IGNtcHBzIGFuZCBjbXBuZy4KLQkoZG9fY21weyx1fV9jYyk6IFByaW50IHdoaWNoIGNjIHZhbHVlIHdhcyB1c2VkIGlmIG5vdCBpbiBzd2l0Y2gKLQlzdGF0ZW1lbnQuCi0JKGRvX2NtcHVfY2MpOiBSZW1vdmUgaWxsZWdhbCBjYXNlcyBDTVBVe0VRLE5FLFBTLE5HfS4KLQkobXZ0c3lzKTogV2hlbiBzZXR0aW5nIEJQU1cgb3IgRFBTVywgYW5kIHdpdGggRFBTV19WQUxJRC4KLQotVHVlIERlYyAxNiAxODoxNzoyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAobXVseDJoKTogQWRkIG1pc3NpbmcgaW5zdHJ1Y3Rpb24uICBDb21wbGFpbiBpZgotCXJlZ2lzdGVyIGlzIG5vdCBldmVuLgotCShkb197YWRkLHN1Yn1oX3BwcCk6IEdldCBjb3JyZWN0IGhpZ2gvbG93IHZhbHVlcy4gIEFsc28gY29ycmVjdGx5Ci0JaGFuZGxlIHNob3J0IGltbWVkaWF0ZXMuCi0JKGRvX2xkezJ3LDRiaH0pOiBEb24ndCBsb2FkIHIwIGlmIHJhID09IDAuCi0KLQkqIGVuZ2luZS5jIChkMzB2X2ludGVycnVwdF9ldmVudCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQkodW5xdWV1ZV93cml0ZXMpOiBEaXR0by4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVNhdCBEZWMgMTMgMjM6NDA6MTcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oIChfd3JpdGV7MzIsNjR9KTogTmV3IHN0cnVjdHVyZXMgZm9yIGtlZXBpbmcgdHJhY2sgb2YKLQlxdWV1ZWQgd3JpdGVzIHRvIHJlZ2lzdGVycy4KLQkoX3NpbV9jcHUpOiBBZGQgX3dyaXRlezMyLDY0fSBzdHJ1Y3R1cmVzLiAgTWFrZSBpc19kZWxheWVkX2NhbGwKLQl1bnNpZ25lZDMyIGFsc28uCi0JKFdSSVRFezMyLDY0fSopOiBOZXcgbWFjcm9zIGZvciBxdWV1ZWluZyB1cCB3cml0ZXMgdG8gcmVnaXN0ZXJzLgotCi0JKiBhbHUuaCAoQUxVMTZfRU5EKTogVGFrZSBmaWVsZCB0aGF0IHNheXMgd2hldGhlciB3ZSBhcmUgc2V0dGluZwotCXRoZSBoaWdoIG9yIGxvdyBoYWxmIHdvcmQuICBRdWV1ZSB1cCBjaGFuZ2VzIHRvIHJlZ2lzdGVycy4KLQkoQUxVMzJfRU5EKTogUXVldWUgdXAgY2hhbmdlcyB0byByZWdpc3RlcnMuCi0JKFBTV19GTEFHX1NFVF9RVUVVRSk6IExpa2UgUFNXX0ZMQUdfU0VULCBleGNlcHQgcXVldWVzIGl0IHVwLgotCi0JKiBzaW0tbWFpbi5oIChkb19zdGFja19zd2FwKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCi0JKiBlbmdpbmUuYyAoZG9fc3RhY2tfc3dhcCk6IE1ha2Ugc3RhdGljLgotCSh1bnF1ZXVlX3dyaXRlcyk6IE5ldyBmdW5jdGlvbiB0byB1bnF1ZXVlIGFsbCBjaGFuZ2VzIHRvIDMyIGFuZCA2NAotCWJpdCByZWdpc3RlcnMgaW4gb3JkZXIuICBJbXBsZW1lbnQgLS10cmFjZS1hbHUuICBSZXNldCBoaWdoIHdhdGVyCi0JbWFya3MgZm9yICMgb2YgcXVldWVkIHJlZ2lzdGVycy4gIElmIFBTVyBjaGFuZ2VkLCBwb3NzaWJseSB1cGRhdGUKLQlzdGFjayBwb2ludGVyLgotCShkb197bG9uZywyX3Nob3J0LHBhcmFsbGVsfSk6IFVucXVldWUgcmVnaXN0ZXIgd3JpdGVzIGF0IHRoZQotCWFwcHJvcHJpYXRlIHRpbWUuCi0KLQkqIGQzMHYtaW5zbnM6IE1vZGlmeSBhbGwgaW5zbnMgdG8gcXVldWUgY2hhbmdlcyB0byByZWdpc3RlcnMsCi0JcmF0aGVyIHRoYW4gZG8gdGhlbSBpbW1lZGlhdGVseSBzbyB0aGF0IHBhcmFsbGVsIGluc3RydWN0aW9ucyBnZXQKLQl0aGUgcmlnaHQgdmFsdWVzIGZvciBpbnB1dHMuICBSZXdyaXRlIDE2IGJpdCBvcGVyYXRpb25zIHRvIGJlIGRvbmUKLQlpbiB0ZXJtcyBvZiBtYXNrZWQgMzIgYml0IHJlZ2lzdGVycy4gIERvbid0IGNhbGwgZG9fc3RhY2tfc3dhcCBhbnkKLQltb3JlIGhlcmUuCi0KLVRodSBEZWMgMTEgMTA6MDY6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1jYWxscy5jIChkMzB2X29wdGlvbl9oYW5kbGVyKTogQWRkIHN1cHBvcnQgZm9yIC0tZXh0bWVtLXNpemUKLQl0byBzaXplIGV4dGVybmFsIG1lbW9yeS4KLQkoc2ltX29wZW4pOiBEaXR0by4gIERlZmF1bHQgaWYgbm8gLS1leHRtZW0tc2l6ZSBvcHRpb24gaXMgOCBtZWcuCi0KLVdlZCBEZWMgMTAgMDE6MDg6MjQgMTk5NyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19yb3QyaCk6IENsaXAgcm90YXRlIGFtb3VudHMgdG8gZm91ciBiaXRzLiAgVGhlCi0gCXVwcGVyIGJpdHMsIGFuZCB0aGUgc2lnbiBvZiB0aGUgcm90YXRpb24gYW1vdW50LCBhcmUgcmVkIGhlcnJpbmdzLgotCShkb19zcmEsIGRvX3NybCk6IEhhbmRsZSBzaGlmdHMgZ3JlYXRlciB0aGFuIDMyIGJpdHMuCi0JKGRvX3NyYWgsIGRvX3NyYWwpOiBQcm9wZXJseSBzaWduLWV4dGVuZCB2YWx1ZSBhbmQgc2hpZnQgYW1vdW50LgotCUhhbmRsZSBzaGlmdHMgbGFyZ2VyIHRoYW4gMTYgYml0cy4KLQotVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBEZWMgIDEgMTU6MTA6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3N1YjJoKTogRm9yIHNob3J0IGluc3RydWN0aW9uLCBjb3JyZWN0bHkKLQlkdXBwbGljYXRlIGxvd2VyIDE2IGJpdHMgb2YgaW1tZWRpYXRlIGluIHVwcGVyIDE2IGJpdHMuCi0JKHNhdDJ6KTogRml4IHR5cG8gdGhhdCBpZ25vcmVkIHRoZSB1cHBlciBoYWxmIG9mIHRoZSByZWdpc3Rlci4KLQkoZG9fc2F0eik6IElmIDwgMCwgc2V0ICpyYSB0byAwLCBpZiBub3QgY2FsbCBkb19zYXQuCi0JKG12dHN5cyk6IEJlZm9yZSBzZXR0aW5nIFBTVywgYW5kIHdpdGggUFNXX1ZBTElELgotCi0JKiBjcHUuaCAoUFNXX1ZBTElEKTogTWFzayBmb3IgYml0cyBpbiBQU1cgdGhhdCBpcyB2YWxpZC4KLQotTW9uIERlYyAgMSAxNTowNTowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0JCi0JKiBkMzB2LWluc25zIChkb190cmFwKTogUGFjaWZ5IEdDQyAtIGNvcnJlY3QgdHlwZSBvZiAlbGQgYXJnIGluCi0gCXByaW50ZiwgcmV0dXJuIGR1bW15IGF0IGVuZC4KLQkKLU1vbiBEZWMgIDEgMTU6MDU6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19hZGQsIGRvX2FkZGhfcHBwLCBkb19hZGRzKTogUmVwbGFjZSBBTFVfQUREIHdpdGgKLSAJQUxVX0FEREMuCi0JKGRvX2FkZGMpOiBSZXBsYWNlIEFMVV9TRVRfQ0FSUlkgLyBBTFVfQUREX0NBIHdpdGggQUxVX0FERENfQy4KLQkoZG9fc3ViLCBkb19zdWJoX3BwcCk6IFJlcGxhY2UgQUxVX1NVQiB3aXRoIEFMVV9TVUJCLgotCShkb19zdWJiKTogUmVwbGFjZSBBTFVfU0VUX0NBUlJZIC8gQUxVX1NVQl9DQSB3aXRoIEFMVV9TVUJCX0IuCi0KLQkqIGFsdS5oIChBTFUxNl9FTkQpOiBVc2UgQUxVMTZfSEFEX0NBUlJZX0JPUlJPVyBpbnN0ZWFkIG9mCi0gCUFMVTE2X0hBRF9DQVJSWS4KLQkoQUxVMzJfRU5EKTogRGl0dG8uCi0KLQkqIHNpbS1tYWluLmggKHN0cmluZy5oLCBzdHJpbmdzLmgpOiBJbmNsdWRlLgotCQotCSogc2ltLWNhbGxzLmM6IERlbGV0ZSBpbmNsdXNpb24gb2Ygc3RyaW5nLmggYW5kIHN0cmluZ3MuaC4KLQkKLVN1biBOb3YgMzAgMTc6Mjk6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLXRyYXBkdW1wKTogTmV3IHN3aXRjaCB0byBjb250cm9sCi0Jd2hldGhlciB0cmFwcyAwLi4zMCBkdW1wIG91dCB0aGUgcmVnaXN0ZXJzIG9yIGRvIHRoZSByZWFsIHRyYXAuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0xGQUdTKTogQWRkIC1EVFJBUERVTVA9ezAsMX0gaWYKLQlhcHByb3ByaWF0ZSAtLXtlbixkaXN9YWJsZS1zaW0tdHJhcGR1bXAgaXMgZG9uZS4KLQotCSogc2ltLWNhbGxzLmMgKE9QVElPTl9UUkFDRV9DQUxMKTogUmVuYW1lIGZyb20gT1BUSU9OX0NBTExfVFJBQ0UuCi0JKE9QVElPTl9UUkFDRV9UUkFQRFVNUCk6IE5ldyBvcHRpb24gZm9yIC0tdHJhY2UtdHJhcGR1bXAuCi0JKGQzMHZfb3B0aW9uX2hhbmRsZXIpOiBBZGQgc3VwcG9ydCBmb3IgLS10cmFjZS10cmFwZHVtcC4KLQkoZDMwdl9vcHRpb25zKTogRGl0dG8uCi0JKHNpbV9vcGVuKTogRGl0dG8uCi0KLQkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBEbyByZWdpc3RlciBkdW1wIGlmIC0tdHJhY2UtdHJhcGR1bXAgYW5kCi0Jbm90IHRoZSBzeXN0ZW0gY2FsbCB0cmFwLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGNhbGxpbmcgb2xkIGZ1bmN0aW9uCi0Jc2ltX2lvX3N5c2NhbGxzLgotCi1TYXQgTm92IDI5IDE4OjU0OjU1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjcHUuaCAoX3NpbV9jcHUpOiBBZGQgdHJhY2VfY2FsbF9wLCB0cmFjZV9hY3Rpb24gZmllbGRzLgotCShUUkFDRV9DQUxMX1ApOiBOb24temVybyBpZiAtLXRyYWNlLWNhbGwuCi0JKFRSQUNFX0FDVElPTik6IE5vbi16ZXJvIGlmIHRoZXJlIGlzIGEgdHJhY2luZyBhY3Rpb24gYXQgdGhlIGVuZAotCW9mIHByb2Nlc3NpbmcgYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnkuCi0JKFRSQUNFX0FDVElPTl97Q0FMTCxSRVRVUk59KTogQml0cyB0byBzYXkgdHJhY2UgY2FsbCAmIHJldHVybi4KLQkoZDMwdl9uZXh0X2luc24pOiBEZWxldGUsIG5vdyB0cmFjZV9hY3Rpb24gZmllbGQgaW4gY3B1IHN0YXRlLgotCi0JKiBjcHUuYyAoZDMwdl9uZXh0X2luc24pOiBEZWxldGUsIG5vdyB0cmFjZV9hY3Rpb24gZmllbGQgaW4gY3B1Ci0Jc3RhdGUuCi0JKHJldHVybl9vY2N1cnJlZCk6IE1pbmltdW0gc2F2ZWQgcmVnaXN0ZXIgdG8gY2hlY2sgaXMgbm93IDM0LgotCi0JKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBDaGFuZ2UgY2FsbCB0cmFjaW5nIHRvIHVzZQotCXRyYWNlX2FjdGlvbiBmaWVsZCBpbiBjcHUgc3RhdGUuCi0KLQkqIHNpbS1jYWxscy5jIChkMzB2X29wdGlvbl9oYW5kbGVyKTogSGFuZGxlIGQzMHYgc3BlY2lmaWMgb3B0aW9ucy4KLQkoZDMwdl9vcHRpb25zKTogRDMwViBzcGVjaWZpYyBvcHRpb25zLiAgUmlnaHQgbm93LCAtLXRyYWNlLWNhbGwuCi0JKHNpbV9vcGVuKTogUmVnaXN0ZXIgZDMwdiBzcGVjaWZpYyBvcHRpb25zLgotCi0JKiBkMzB2LWluc25zIChjYWxsLCByZXR1cm4gaW5zbnMpOiBNb3ZlIC0tdHJhY2UtZGVidWcgY2FsbC9yZXR1cm4KLQl0cmFjaW5nIGFjdGlvbiB0byBkMzB2IHNwZWNpZmljIC0tdHJhY2UtY2FsbCBvcHRpb24uCi0KLUZyaSBOb3YgMjggMjA6MTI6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oIChDUkVHKTogUmVuYW1lIGZyb20gQ1IuCi0KLQkqIGQzMHYtaW5zbnMgKGRvX3thZGRjLHN1YmJ9KTogRXhwbGljaXRseSBpbXBvcnQgdGhlIGNhcnJ5IGJpdC4KLQkoZG9fdHJhcCk6IFVzZSBDUkVHLCBub3QgQ1IuICBTd2l0Y2ggdG8gdXNpbmcgY2Jfc3lzY2FsbC4KLQotVGh1IE5vdiAyNyAxOToyNTo0MyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY3B1LmggKEFDQyk6IERlZmluZSBhcyBzaG9ydCBjdXQgdG8gYWNjdW11bGF0b3JzLgotCi0JKiBkMzB2LWluc25zIChkb19yb3QpOiBEZWxldGUgZXhwbGljaXQgZnVuY3Rpb24sIHVzZSBST1QzMiB0byBkbwotCXJvdGF0ZSBpbnN0cnVjdGlvbi4KLQkoZG9fdHJhcCk6IE1ha2UgdHJhcCAzMCBwcmludCBvdXQgYWNjdW11bGF0b3JzIGFuZCBmaXJzdCAxNgotCWNvbnRyb2wgcmVnaXN0ZXJzIGFzIHdlbGwuCi0JKGRvX2F2Zyk6IFNpZ24gZXh0ZW5kIHRvIDY0IGJpdCB0eXBlIGJlZm9yZSBkb2luZyBhZGQvc2hpZnQuCi0JKGRvX2F2ZzJoKTogU2lnbiBleHRlbmQgMTYgYml0IGNodW5rcyBiZWZvcmUgZG9pbmcgYWRkL3NoaWZ0LgotCi1XZWQgTm92IDI2IDE1OjIwOjI0IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTF9UQVJHRVQpOiBEZWZpbmUuCi0KLVdlZCBOb3YgMjYgMTY6NTU6MzggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oIChkMzB2X25leHRfaW5zbik6IE5ldyBmbGFnIGZvciB0aGluZ3Mgd2UgYXJlIHN1cHBvc2VkIHRvCi0JdHJhY2UgYmV0d2VlbiBpbnN0cnVjdGlvbiB3b3Jkcy4KLQkoe2NhbGwscmV0dXJufV9vY2N1cnJlZCk6IFJlbW92ZSBpbmRleCBhcmd1bWVudC4KLQkoZDMwdl97cmVhZCx3cml0ZX1fbWVtKTogQWRkIGRlY2xhcmF0aW9ucy4KLQotCSogY3B1LmMgKGQzMHZfbmV4dF9pbnNuKTogTmV3IGZsYWcgZm9yIHRoaW5ncyB3ZSBhcmUgc3VwcG9zZWQgdG8KLQl0cmFjZSBiZXR3ZWVuIGluc3RydWN0aW9uIHdvcmRzLgotCSh7Y2FsbCxyZXR1cm59X29jY3VycmVkKTogUmVtb3ZlIGluZGV4IGFyZ3VtZW50LgotCShkMzB2X3tyZWFkLHdyaXRlfV9tZW0pOiBOZXcgZnVuY3Rpb25zIGZvciByZWFkaW5nL3dyaXRpbmcKLQlzaW11bGF0ZWQgbWVtb3J5IGluIHRoZSBuZXcgY29tbW9uIHN5c3RlbSBjYWxsIHN1cHBvcnQuCi0KLQkqIGQzMHYtaW5zbnM6IFNldCBlbWFjcyBDIG1vZGUuCi0JKGNhbGwvcmV0dXJuIGluc25zKTogU2V0IGJpdCB0byB0cmFjZSBjYWxsIGF0IGluc3RydWN0aW9uCi0JYm91bmRhcnksIHJhdGhlciB0aGFuIGRvaW5nIGl0IGhlcmUuCi0JKGRvX3RyYXApOiBTZXQgdXAgdG8gdXNlIG5ldyBjb21tb24gc3lzdGVtIGNhbGwgaW50ZXJmYWNlLgotCi0JKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBJZiBkMzB2X25leHRfaW5zbiBpcyBub24gemVybywgZG8KLQlmdW5jdGlvbiBjYWxsL3JldHVybiB0cmFjaW5nLgotCi1Nb24gTm92IDI0IDE2OjQwOjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChibm90KTogQ29ycmVjdGx5IHJlc2V0IGJpdCBpbiBxdWVzdGlvbi4KLQkoZG9fdHJhcCk6IFVzZSBjb21tb24gc3lzdGVtIGNhbGwgZW11bGF0aW9uIHN1cHBvcnQsIHJhdGhlciB0aGFuCi0Jb3VyIGhvbWUgZ3Jvd24gc3VwcG9ydC4KLQotU3VuIE5vdiAyMyAyMjo0NzoyMCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAobXZmYWNjKTogSW1tZWRpYXRlIGZpZWxkIGlzIHVuc2lnbmVkLCBhbGxvd2luZwotCXNoaWZ0cyBvZiB1cCB0byA2MyB0byBiZSBlbmNvZGVkLiAgQWxzbyBkbyBzaGlmdCBzaWduZWQsIHJhdGhlcgotCXRoYW4gdW5zaWduZWQuCi0KLQkqIGljLWQzMHYgKElNTV82Uyk6IEFkZCBmaWVsZCBmb3IgNiBiaXQgdW5zaWduZWQgY29uc3RhbnRzLgotCi0JKiBkMzB2LWluc25zIChjbXB1KTogU2hvcnQgY21wdSB6ZXJvIGV4dGVuZHMgaW1tZWRpYXRlLCBub3Qgc2lnbgotCWV4dGVuZHMuCi0KLVNhdCBOb3YgMjIgMTk6MDQ6MzQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChpbGxlZ2FsLCB3cm9uZ19zbG90KTogUmVwbGFjZSBTSUdJTEwgd2l0aAotIAlTSU1fU0lHSUxMLgotCi0JKiBzaW0tY2FsbHMuYyAoc2lnbmFsLmgpOiBEbyBub3QgaW5jbHVkZSwgcmVwbGFjZWQgYnkKLSAJc2ltLXNpZ25hbC5oLgotCi0JKiBzaW0tbWFpbi5oIChzaWduYWwuaCk6IERvIG5vdCBpbmNsdWRlLCBpbmNsdWRlIHNpbS1zaWduYWwuaAotIAlpbnN0ZWFkLgotCi1GcmkgTm92IDIxIDA5OjMzOjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY3B1LmMgKGNhbGxfb2NjdXJyZWQpOiBVc2UgWkFMTE9DIGluc3RlYWQgb2YgeG1hbGxvYy4KLQkocmV0dXJuX29jY3VycmVkKTogVXNlIHpmcmVlIGluc3RlYWQgb2YgZnJlZS4KLQotV2VkIE5vdiAxOSAxMzoyODowOSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHtsLHN9X3tzdXBwb3J0LHNlbWFudGljc30ubyk6IERlcGVuZCBvbiB0aGUgaW5jbHVkZQotCWZpbGVzIGluICQoRU5HSU5FX0gpLgotCi0JKiBkMzB2LWluc25zIChkb197YWRkLGFkZGMsc3ViLHN1YmJ9KTogQUxVX3tBREQsU1VCfV9DQSBub3cgdGFrZXMKLQlhIFZBTCBhcmd1bWVudCB0byBhZGQvc3VidHJhY3QgYWxvbmcgd2l0aCB0aGUgY2FycnkuCi0KLVR1ZSBOb3YgMTggMTU6MzM6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogVXNlICQoU0lNX05FV19DT01NT05fT0JKUykuCi0KLVR1ZSBOb3YgMTggMTM6NTY6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBDaGFuZ2UgdG8gbmV3IHN5c3RlbSBjYWxsIG51bWJlcnMuICBBZGQKLQlyZWFkIGVtdWxhdGlvbi4KLQotTW9uIE5vdiAxNyAxNDo0Mzo0NSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAobXVseCk6IEFkZCBtdWx4IGluc3RydWN0aW9uLgotCi1TdW4gTm92IDE2IDE5OjA2OjU2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjcHUuYyAoe2NhbGwscmV0dXJufV9vY2N1cnJlZCk6IE5ldyB0cmFjZSBmdW5jdGlvbnMgdG8gbWFyawotCWZ1bmN0aW9uIGNhbGxzIGFuZCByZXR1cm5zIGFuZCBjaGVjayB3aGV0aGVyIGFsbCBzYXZlZCByZWdpc3RlcnMKLQlyZWFsbHkgd2VyZSBzYXZlZC4KLQotCSogY3B1LmggKHtjYWxsLHJldHVybn1fb2NjdXJyZWQpOiBBZGQgZGVjbGFyYXRpb24uCi0KLQkqIGQzMHYtaW5zbnMgKHtic3IsIGpzcn0gcGF0dGVybnMpOiBDYWxsIGNhbGxfb2NjdXJyZWQgaWYKLQktLXRyYWNlLWRlYnVnIHRvIHRyYWNlIGZ1bmN0aW9uIGNhbGxzLgotCShqbXAgcmVnaXN0ZXIgcGF0dGVybik6IElmIHRoaXMgaXMgYSBqdW1wIHI2MiBhbmQgLS10cmFjZS1kZWJ1ZywKLQljYWxsIHJldHVybl9vY2N1cnJlZCB0byB0cmFjZSBmdW5jdGlvbiBjYWxscy4KLQkoYnNye3Rueix0enJ9KTogTW92ZSBzZXR0aW5nIHI2MiBpbnNpZGUgY29uZGl0aW9uYWwgYWdhaW5zdCByZWcuCi0JKGRvX2xkMncpOiBHcmFiIG1lbW9yeSBpbiA2NC1iaXQgY2h1bmssIHRvIGNoZWNrIGFsaWdubWVudC4KLQkoZG9fc3Qydyk6IERpdHRvLgotCi1TYXQgTm92IDE1IDIwOjU3OjU3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zOiBVbmRvIGNoYW5nZXMgZnJvbSBOb3YuIDExLCBhbGxvd2luZyBmb3Igb2RkIHJlZ2lzdGVyCi0JcGFpcnMsIHNpbmNlIHRoZSBtYWNoaW5lIGRvZXNuJ3Qgc3VwcG9ydCBzdWNoIHVzYWdlLiAgVHJhcCBvbiBvZGQKLQlyZWdpc3RlcnMsIHJhdGhlciB0aGFuIGdpdmUgYSB3YXJuaW5nLiAgS2VlcCBkb19zcmMgYW5kIGRvX3RyYXAKLQljaGFuZ2VzLgotCi1GcmkgTm92IDE0IDExOjU5OjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fdHJhcCk6IFBhY2lmeSBjb21waWxlciB3YXJuaW5ncyBmb3IgcHJpbnRmIGNhbGxzLgotCi1UdWUgTm92IDExIDE4OjI2OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChub3RfcjYzX3JlZyk6IFJlbmFtZSBmcm9tIG1ha2VfZXZlbl9yZWcsIG9ubHkgY2hlY2sKLQlmb3IgcmVnaXN0ZXIgYmVpbmcgcjYzLiAgQ2hhbmdlIGNhbGxlcnMgbGQye2gsd30sIGxkNGJoeyx1fS4KLQkoZ2V0X3JlZ19ub3RfcjYzKTogUmVuYW1lIGZyb20gZ2V0X2V2ZW5fcmVnLCBhbmQgb25seSBjaGVjayBmb3IKLQlyZWdpc3RlciByNjMuICBDaGFuZ2UgY2FsbGVycyBzdDJ7dyxofSwgc3Q0Yi4KLQkoZG9fc3JjKTogQ29ycmVjdCByZWdpc3RlciBwYWlyIGZvciBzaGlmdCBsZWZ0LgotCShkb190cmFwKTogVGVtcG9yYXJpbHkgbWFrZSB0cmFwIDMwIHByaW50IG91dCB0aGUgcmVnaXN0ZXJzLgotCi1UdWUgTm92ICA0IDA4OjUxOjIyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb190cmFwKTogTWFrZSB0cmFwIDMxIGJlIHVzZWQgZm9yIHN5c3RlbSBjYWxscy4KLQlBZGQgcHJpbWl0aXZlIHdyaXRlIGFuZCBleGl0IHN5c3RlbSBjYWxscy4KLQotCSogTWFrZWZpbGUgKEZJTFRFUik6IE5ldyBtYWtlIHZhcmlhYmxlIHRvIGZpbHRlciBvdXQga25vd24gaWdlbgotCXdhcm5pbmdzLgotCSh0bXAtaWdlbik6IEFkZCAkKEZJTFRFUikgb24gYWxsIDMgaW52b2NhdGlvbnMgb2YgaWdlbiB0byBmaWx0ZXIKLQlvdXQgd2FybmluZ3MgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBieSBkZWZhdWx0LgotCi1GcmkgT2N0IDMxIDE5OjM2OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQ2hhbmdlIEVJVCB0byBtZW1vcnkgcmVnaW9uLgotCi1GcmkgT2N0IDE3IDE2OjUxOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYWx1LmggKEFMVTE2X0VORCk6IEdldCByZXN1bHQgZnJvbSBBTFUxNl9PVkVSRkxPV19SRVNVTFQuCi0JKEFMVTMyX0VORCk6IEdldCByZXN1bHQgZnJvbSBBTFUzMl9PVkVSRkxPV19SRVNVTFQuCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjkgMTU6MjM6MzUgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKE1WRlNZUyBNVlRTWVMpOiAgRml4IGJpdCBwYXR0ZXJucyBzbyB0aGF0IHRoZXNlCi0JaW5zdHJ1Y3Rpb25zIGdldCByZWNvZ25pc2VkLgotCi1XZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgU2VwIDI0IDE3OjUxOjQzIDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiAgQWRkIHNpbS1icmVhay5vLgotCSogKElOQ0xVREVfREVQUyk6ICBBZGQgdGNvbmZpZy5oLgotCSogYWx1LmggKE1FTSBTVE9SRSk6ICBDaGFuZ2UgdG8gc2ltX2NvcmVfcmVhZC93cml0ZV91bmFsaWduZWQgdG8KLQlhbGxvdyBmb3IgdHJhcHBpbmcgdW5hbGlnbmVkIGFjY2Vzc2VzLgotCSogY3B1Lmg6ICBEZWZpbmUgU0lNX0JSRUFLUE9JTlQgYXMgc3lzY2FsbCA1IGZvciBpbnRyaW5zaWMgYnJlYWtwb2ludAotCW1lY2hhbmlzbS4KLQkqIGQzMHYtaW5zbiAoc2hvcnQgc3lzY2FsbCk6ICBVc2Ugc3lzY2FsbCA1IGZvciBicmVha3BvaW50IGluc24uCi0JKiBzaW0tY2FsbHMuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyIHNpbV9zdG9yZV9yZWdpc3Rlcik6ICBJbXBsZW1lbnQuCi0JKiB0Y29uZmlnLmluOiAgRGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTIHRvIGVuYWJsZSBpbnRyaW5zaWMKLQlicmVha3BvaW50IG1lY2hhbmlzbS4KLQkKLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTA6MTk6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX1dBUk5JTkdTLCBTSU1fQUxJR05NRU5ULCBTSU1fRU5ESUFOLAotIAlTSU1fSE9TVEVORElBTiwgU0lNX1JFU0VSVkVEX0JJVFMpOiBEZWxldGUsIG1vdmVkIHRvIGNvbW1vbi4KLQkoU0lNX0VYVFJBX0NGTEFHUyk6IFVwZGF0ZS4KLQkKLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNwZWNpZnkgc3RyaWN0IGFsaWdubWVudC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxMiAxNjoxMzowNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDaGFuZ2UgbWVtb3J5IHRvCi0gICAgICAgIGludGVybmFsIGluc3QuIFJBTSBoJzAwMDAwMDAwLWgnMDAwMGZmZmYgKDY0S0IpCi0gICAgICAgIGludGVybmFsIGRhdGEgUkFNICBoJzIwMDAwMDAwLWgnMjAwMDdmZmYgKDMyS0IpCi0gICAgICAgIGV4dGVybmFsIFJBTSAgICAgICBoJzgwMDAwMDAwLWgnODAzZmZmZmYgKDRNQikKLSAgICAgICAgRUlUICAgICAgICAgICAgICAgIGgnZmZmZmYwMDAtaCdmZmZmZmZmZgotCi0KLVRodSBTZXAgMTEgMDg6NTk6MzQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhydy5vIG1vZHVsZS4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9yZWFkKTogRGVsZXRlLiB1c2Ugc2ltLWhydy4KLQkoc2ltX3dyaXRlKTogRGVsZXRlLCB1c2Ugc2ltLWhydy4KLQkKLQotVHVlIFNlcCAgOSAwMTozNjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGljLWQzMHYgKGltbV81KTogVXBkYXRlIG5yIGFyZ3MgcGFzc2VkIHRvIExTTUFTS0VELgotCi0JKiBkMzB2LWluc25zIChkb19zYXQsIGRvX3NhdGgsIGRvX3NhdGhfcCwgZG9fc2F0eiwgZG9fc2F0emgpOiBGaXgsCi0gCWNvbXB1dGluZyB0aGUgbWF4IHNhdCB2YWx1ZSBpbmNvcnJlY3RseS4KLQotVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAgNSAwOToxNTozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX21hYywgZG9fbWFjcywgZG9fbXN1YiwgZG9fbXVseHMpOiBVc2UgZXhwbGljaXQKLSAJdHlwZSBjYXN0IGluc3RlYWQgb2YgU0lHTkVENjQgbWFjcm8uCi0KLVRodSBTZXAgIDQgMTA6Mjg6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBJbmNsdWRlIHNpbS1tZW1vcHQubyBtb2R1bGUuCi0KLQkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IFBhc3MgemVybyBtb2R1bG8gYXJnIHRvIHNpbV9jb3JlX2F0dGFjaAotIAljYWxscy4KLQkoc2ltX29wZW4pOiBJZiBubyBtZW1vcnksIHVzZSBtZW1vcnkgY29tbWFuZHMgdG8gZXN0YWJsaXNoIGQzMHYKLSAJcmFtLgotCShkMzB2X29wdGlvbl9oYW5kbGVyKTogRGVsZXRlLCByZXBsYXNlZCBieSBzaW0tbWVtb3B0LmMuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBDYWxsIHNpbV9tb2R1bGVfaW5pdC4KLQotCSogc2ltLW1haW4uaCAoc3RydWN0IHNpbV9zdGF0ZSk6IFJlbW92ZSBtZW1iZXJzIGVpdF9yYW0sCi0gCXNpemVvZl9laXRfcmFtLCBleHRlcm5hbF9yYW0sIGJhc2VvZl9leHRlcm5hbF9yYW0sCi0gCXNpemVvZl9leHRlcm5hbF9yYW0uIFVzaW5nIGdlbmVyaWMgbWVtb3J5IG1vZGVsIGluc3RlYWQuCi0KLU1vbiBTZXAgIDEgMTE6MDQ6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBVc2Ugc2ltX3N0YXRlX2FsbG9jLgotCi1TYXQgQXVnIDMwIDEwOjAxOjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTKTogRGVmaW5lLgotCi0JKiBlbmdpbmUuYyAoZG9fMl9zaG9ydCk6IENvbXBhcmUgd2l0aCBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MKLSAJbm90IC0xLgotCi1XZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEF1ZyAyNyAxMzo0MTo1NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IEFkZCBjYWxsIHRvIHNpbV9hbmFseXplX3Byb2dyYW0sIHVwZGF0ZQotIAljYWxsIHRvIHNpbV9jb25maWcuCi0KLQkqIHNpbS1jYWxscy5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJndW1lbnQuCi0gIAlJbml0aWFsaXplIENQVSByZWdpc3RlcnMgaW5jbHVkaW5nIFBDLgotCShzaW1fbG9hZCk6IERlbGV0ZSwgdXNpbmcgc2ltLWhsb2FkLgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhsb2FkLm8gbW9kdWxlLgotCi1Nb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotTW9uIEF1ZyAyNSAxNTo0MTo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fb3Blbik6IE1vdmUgc2ltX2NvbmZpZyBjYWxsIHRvIGFmdGVyIHNpbV9wYXJzZV9hcmdzLgotCShzaW1fb3Blbik6IENoZWNrIHNpbV9jb25maWcgcmV0dXJuIHN0YXR1cy4KLQotRnJpIEF1ZyAyMiAxNjozODo1OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3N1YmhfcHBwKTogQ29ycmVjdCBuYW1lLCB3YXMgZG9fc3ViX3BwcC4KLQkoZG9fc3ViaF9wcHApOiBDb21wdXRlIHJjPXJiLXNyYyBpbnN0ZWFkIG9mIHNyYy1yYi4KLQkoZG9fYWRkaF9wcHApOiBEaXR0by4KLQkKLUZyaSBKdW4gMjcgMTQ6NDM6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChtdmZzeXMsIG12dHN5cyk6IFN3aXRjaCBpbnN0cnVjdGlvbiBlbmNvZGluZ3MsIHdhcwotIAl3cm9uZy4gIFVwZGF0ZSBoYW5kbGluZyBvZiBQU1dbRFNdIGJpdC4KLQkoZGJ0KTogRml4IGRlYnVnIHRyYXAgYWRkcmVzcy4KLQotCSogY3B1LmggKE5SX0NPTlRST0xfUkVHSVNURVJTKTogQWxsb3cgdGhlIGZ1bGwgNjQgcmVnaXN0ZXJzLgotCi1UdWUgSnVuIDI0IDEyOjQxOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoREJULCBSVEQpOiBTd2FwIHRoZSBzdGFjayBhZnRlciB1cGRhdGluZyB0aGUgUFNXLgotCShEQlQpOiBVc2UgUFNXX1NFVCB0byB1cGRhdGUgUFNXLgotCQotCSogYWx1LmggKEFMVTE2X0VORCk6IENoZWNrIGZvciAxNiBiaXQgY2FycnkgYW5kIG5vdCAzMiBiaXQuCi0KLVR1ZSBKdW4gMjQgMTI6MTY6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMi5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChwcHAsIGNjYywgcHAsIFhYLCBwKTogVXBkYXRlIGZvcm1hdCBmdW5jdGlvbnMgc28KLSAJdGhhdCB0aGV5IGFyZSBvZiBjbGFzcyAlcyBpbnN0ZWFkIG9mIGNsYXNzIGZ1bmN0aW9uLgotCi1UdWUgSnVuIDEwIDEyOjI2OjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoZW5naW5lX2Vycm9yLCBlbmdpbmVfcmVzdGFydCwgZW5naW5lX2hhbHQsCi0gCWVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IERlbGV0ZSBwcm90b3R5cGVzLiAgRnVuY3Rpb25zIGRlbGV0ZWQKLSAJZWFybGllci4KLQkoZG9faW50ZXJydXB0X2hhbmRsZXIpOiBBZGQgcHJvdG90eXBlLgotCShzaW1fc3RhdGUpOiBBZGQgcGVuZGluZ19ldmVudCBtZW1iZXIgdG8gc3RydWN0LgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDb25maWd1cmUgaW50ZXJydXB0IGhhbmRsZXIuCi0JKiBlbmdpbmUuYyAoZDMwdl9pbnRlcnJ1cHRfZXZlbnQpOiBOZXcgZnVuY3Rpb24uICBEZWxpdmVyIGV4dGVybmFsCi0gCWludGVycnVwdCB0byBwcm9jZXNzb3IuCi0KLQkqIGQzMHYtaW5zbnMgKGRvX3N0YWNrX3N3YXApOiBNb3ZlIGZ1bmN0aW9uIGZyb20gaGVyZS4KLQkqIGVuZ2luZS5jIChkb19zdGFja19zd2FwKTogVG8gaGVyZS4KLQkqIHNpbS1tYWluLmggKGRvX3N0YWNrX3N3YXApOiBBZGQgcHJvdG90eXBlLgotCQotCSogY3B1LmggKHJlZ2lzdGVycyk6IENoYW5nZSBjdXJyZW50X3NwIHRvIGFuIGludC4KLQkqIGQzMHYtaW5zbiAoZG9fc3RhY2tfc3dhcCk6IFVwZGF0ZS4KLQkKLVRodSBKdW4gIDUgMTI6NTQ6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChMRCosIFNUKik6IERpc2FzZW1ibGUgWFggPT0gMCBhcyBpbW1lZCB2ZXJzaW9uIG9mCi0gCWluc3RydWN0aW9uLgotCShzdHJfWFhYKTogRml4IGNhc2Ugb2YgWFggPT0gMyAtIHJldHVybiAiLSIuCi0KLVRodSBKdW4gIDUgMTI6NTQ6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBJc3N1aW5nIEwtPlIgYW5kIFItPkwgaW5zdHJ1Y3Rpb25zIGluCi0gCXdyb25nIG9yZGVyLgotCi0JKiBkMzB2LWluc24gKENNUFVjYyBpbW0gbG9uZyk6IFdpdGggb2YgUkIgZmllbGQgc2hvdWxkIGJlIDYgbm90Ci0gCXRocmVlLgotCShNVUwsIE1VTDJILCBNVUxIWCk6IFggZmllbGQgMDEgaW5zdGVhZCBvZiAxMC4KLQotVGh1IEp1biAgNSAxMjo1NDozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IERvbid0IG1vZGlmeSBEUyBiaXQgd2hlbiB3cml0aW5nIHRvIFBTVy4KLQkoZGJ0LCBydGQpOiBOZXcgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjcHUuaCAoTlJfQ09OVFJPTF9SRUdJU1RFUlMpOiBOb3cgMTUuCi0JKGRlYnVnX3Byb2dyYW1fc3RhdHVzX3dvcmRfY3IsIGRlYnVnX3Byb2dyYW1fY291bnRlcl9jcik6IEFkZAotIAlkZWJ1ZyBjb250cm9sIHJlZ2lzdGVycy4gUmVudW1iZXIgb3RoZXIgY29udHJvbCByZWdpc3RlcnMuCi0JKFBTV19EUyk6IE5ldyBQU1cgYml0LgotCShEUEMsIERQU1cpOiBEZWZpbmUuCi0KLVdlZCBNYXkgMjggMTM6NDU6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBDaGVjayB0aGUgZXZlbnQgcXVldWUgb24gZXZlcnkgY3ljbGUuCi0KLQkqIHNpbS1jYWxscy5jIChzaW1fc2l6ZSk6IERlbGV0ZS4KLQkoc2ltX2RvX2NvbW1hbmQpOiBDYWxsIHNpbV9hcmdzX2NvbW1hbmQuCi0JKHNpbV9vcGVuKTogTW92ZSBlaXRfcmFtIGFuZCBzaXplb2ZfZWl0X3JhbSB0byBzaW1fc3RhdGUgc3RydWN0LgotCShzaW11bGF0aW9uKTogRGVsZXRlIGdsb2JhbCBub3cgZGVwZW5kIG9uIHNkIGFyZ3VtZW50LgotCShzaW1fb3Blbik6IEluaXRpYWxpemUgc2ltLXdhdGNoLgotCShkMzB2X29wdGlvbl9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBtZW0tc2l6ZSBhcmd1bWVudC4KLQotVHVlIE1heSAyNyAxNDowMzozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jYWxscy5jIChzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZS4KLQkoc2ltX3dyaXRlKTogUGFzcyBOVUxMIGNwdSBhcmcgdG8gc2ltX2NvcmVfd3JpdGVfYnVmZmVyLgotCi0JKiBlbmdpbmUuYyAoZW5naW5lX2luaXQpOiBEZWxldGUuICBIYW5kbGVkIGluIHNpbV9vcGVuLgotCShlbmdpbmVfY3JlYXRlKTogRGl0dG8uCi0JCi1UdWUgTWF5IDIwIDEwOjE1OjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KLQotTW9uIE1heSAxOSAxNDo1OTozMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IFNldCB0aGUgc2ltLmJhc2UgbWFnaWMgbnVtYmVyLgotCi1GcmkgTWF5IDE2IDE1OjI1OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNuczogUmVwbGFjZSBlbmdpbmVfZXJyb3Igd2l0aCBjb21tb24gc2ltX2VuZ2luZV9hYm9ydC4KLQkqIGNwdS5jIChpc19jb25kaXRpb25fb2ssIGlzX3dyb25nX3Nsb3QpOiBEaXR0by4KLQotCSogZW5naW5lLmMgKGVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IFJlbmFtZSB0aGlzLgotCShzaW1fZW5naW5lX3J1bik6IFRvIHRoaXMuIFNpbXBsaWZ5IC0gbW9zdCBtb3ZlZCB0byBjb21tb24uCi0KLQkqIHNpbS1jYWxscy5jIChzaW1fc3RvcF9yZWFzb24sIHNpbV9yZXN1bWUsIHNpbV9zdG9wKToKLSAJRGVsZXRlLiBSZXBsYWNlZCBieSBjb21tb24gY29kZS4KLQotCSogZW5naW5lLmMgKGVuZ2luZV9lcnJvciwgZW5naW5lX3Jlc3RhcnQsIGVuZ2luZV9oYWx0KTogRGl0dG8uCi0JCi0JKiBzaW0tbWFpbi5oIChTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSywgU0lNX0VOR0lORV9IQUxUX0hPT0spOgotIAlEZWZpbmUgYXMgTk9Qcy4KLQotTW9uIE1heSAgNSAyMzowNTo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFsdS5oIChJTUVNLCBNRU0sIFNUT1JFKTogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBjb3JlIGluCi0gCS4uL2NvbW1vbi4KLQkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IERpdHRvLgotCi0JKiBhbHUuaCwgY3B1LmgsIGNwdS5jLCBkMzB2LWluc24sIGRjLXNob3J0OiBDbGVhbiB1cCBjb3B5cmlnaHQKLSAJbm90aWNlLgotCi1GcmkgTWF5ICAyIDEyOjAxOjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbS1vcHRpb25zLmgsIHNpbS11dGlscy5oKTogSW5jbHVkZS4KLQkqIE1ha2VmaWxlLmluIChzaW0tY2FsbHMubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGQzMHYtaW5zbnMgKGFkZHJlc3Nfd29yZCk6IFJlbW92ZSBjaWEgYXJndW1lbnQgZnJvbSBzdXBwb3J0Ci0gCWZ1bmN0aW9ucywgaWdlbiBub3cgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkuCi0KLQkqIE1ha2VmaWxlLmluICh0bXAtaWdlbik6IEluY2x1ZGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaW4KLSAJZ2VuZXJhdGVkIGZpbGVzLgotCi0JKiBzaW0tbWFpbi5oIChTSU1fREVTQyk6IFJlbW92ZSBzaW1fZXZlbnRzIGFuZCBzaW1fY29yZSwgbW92ZWQgdG8KLSAJc2ltdWxhdG9yIGJhc2UgdHlwZSBzaW1fc3RhdGVfYmFzZS4KLQkoc2ltLWNvcmUuaCwgc2ltLWV2ZW50cy5oLCBzaW0taW8uaCk6IFJlcGxhY2Ugd2l0aCAjaW5jbHVkZQotCSJzaW0tYmFzZS5oIi4KLQotCSogc2ltLW1haW4uaCAoc2ltX3N0YXRlKTogVHJhY2sgcmVjb21lbmRhdGlvbnMgaW4gY29tbW9uCi0gCWRpcmVjdG9yeS4KLSAgCSogY3B1LmggKHNpbV9jcHUpOiBEaXR0by4KLSAgCSogZW5naW5lLmMgKGRvXzJfc2hvcnQsIGRvX3BhcmFsbGVsKTogRGl0dG8uCi0JKiBjcHUuaCAoR1BSKTogRGl0dG8uCi0JKiBhbHUuaCAoTUVNLCBJTUVNLCBTVE9SRSk6IERpdHRvLgotCSogY3B1LmMgKGlzX3dyb25nX3Nsb3QpOiBEaXR0by4KLQkqIGljLWQzMHYgKEFhLCBBYik6IERpdHRvLgotCi1UaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbW9kdWxlLm8sIHNpbS1wcm9maWxlLm8uCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDYWxsIHNpbV9tb2R1bGVfdW5pbnN0YWxsIGlmIGFyZ3VtZW50Ci0JcGFyc2luZyBmYWlscy4gIENhbGwgc2ltX3Bvc3RfYXJndl9pbml0LgotCShzaW1fY2xvc2UpOiBDYWxsIHNpbV9tb2R1bGVfdW5pbnN0YWxsLgotCi1GcmkgQXByIDE4IDEzOjQ0OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgQXByIDE3IDAyOjU3OjU1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLCBzaW0tb3B0aW9ucy5vLCBzaW0tdHJhY2Uuby4KLQkoU0lNX0VYVFJBX3tMSUJTLExJQkRFUFMsQUxMLElOU1RBTEx9KTogRGVsZXRlLgotCShTSU1fUlVOX09CSlMpOiBDaGFuZ2UgZnJvbSBydW4ubyB0byBucnVuLm8uCi0JKiBjcHUuaCAoc2ltX2NwdSk6IE5ldyBtZW1iZXIgYmFzZS4gIERlbGV0ZSBtZW1iZXJzIHRyYWNlLCBzZC4KLQkoY3B1X3RyYWNlcyk6IERlbGV0ZS4KLQkqIGVuZ2luZS5jIChlbmdpbmVfaW5pdCk6IFNldCBiYWNrbGluayBmcm9tIGNwdSB0byBzdGF0ZS4KLQkqIHNpbS1jYWxscy5jOiAjaW5jbHVkZSBiZmQuaC4KLQkoc2ltX29wZW4pOiBTZXQgU1RBVEVfT1BFTl9LSU5ELiAgQ2FsbCBzaW1fcHJlX2FyZ3ZfaW5pdCwKLQlzaW1fcGFyc2VfYXJncy4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLgotCUNhbGwgc2ltX2xvYWRfZmlsZSB0byBsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgotCShzaW1fdHJhY2UpOiBEZWxldGUuCi0JKiBzaW0tbWFpbi5oIChzdHJ1Y3Qgc2ltX3N0YXRlKTogc2ltX3N0YXRlX2Jhc2UgaXMgdHlwZWRlZiBub3cuCi0JKFNUQVRFX0NQVSk6IERlZmluZS4KLQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBEZWZpbmUuCi0JKFNJTV9PQkpTKTogQWRkIHNpbS11dGlscy5vLgotCShTSU1fR0VOKTogRGVsZXRlIHRtcC1jb21tb24uCi0JKFNJTV9FWFRSQV9DTEVBTik6IERlbGV0ZSBjbGVhbi1jb21tb24uCi0JKEJVSUxUX1NSQ19GUk9NX0NPTU1PTik6IE1vdmVkIHRvIC4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbi4KLQkodG1wLWNvbW1vbixjbGVhbi1jb21tb24pOiBEZWxldGUuCi0JKEVOR0lORV9IKTogc2ltLXN0YXRlLmggcmVuYW1lZCB0byBzaW0tbWFpbi5oLgotCShjbGVhbi1pZ2VuKTogRGVsZXRlIHRtcC1pbnNucy4KLQotCSogY3B1LmM6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KLQkqIGVuZ2luZS5jOiBMaWtld2lzZS4KLQkqIHNpbS1jYWxscy5jOiBMaWtld2lzZS4KLQkoemFsbG9jLHpmcmVlKTogTW92ZWQgdG8gLi4vY29tbW9uL3NpbS11dGlscy5jLgotCSogc2ltLW1haW4uaDogUmVuYW1lZCBmcm9tIHNpbS1zdGF0ZS5oLgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDExOjEzOjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBMaW5rIGluIHRoZSByZWNlbnRseSBhZGRlZCBzaW0tY29uZmlnLm8KLQotCSogZW5naW5lLmMgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIsIGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyLAotIAljdXJyZW50X2Vudmlyb25tZW50LCBjdXJyZW50X2FsaWdubWVudCwgY3VycmVudF9mbG9hdGluZ19wb2ludCwKLSAJY3VycmVudF9tb2RlbF9pc3N1ZSwgY3VycmVudF9zdGRpbyk6IERlbGV0ZSwgbW92ZWQgdG8KLSAJLi4vY29tbW9uL3NpbS1jb25maWcuYwotCi1Nb24gTWFyIDI0IDE0OjUwOjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBkMzB2LWluc25zIChkb19sZHcpOiBMb2FkIDQgYnl0ZXMgbm90IDIuCi0JKGRvX2luY3IsIExEKiwgU1QqKTogSW5jcmVtZW50IHJlZ2lzdGVyIG5vdCBpdHMgdmFsdWUuCi0KLU1vbiBNYXIgMjQgMDk6NTk6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5jIChpc193cm9uZ19zbG90KTogRGl0dG8uCi0JKGlzX2NvbmRpdGlvbl9vayk6IERpdHRvLgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX3RyYWNlKTogRGl0dG8uCi0KLQkqIGVuZ2luZS5jIChlbmdpbmVfaW5pdCk6IERpdHRvLgotCShkb18yX3Nob3J0KTogRGl0dG8uCi0JKGVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IERpdHRvLgotCi0JKiBkMzB2LWluc25zICh2b2lkKTogVXBkYXRlLiBGb3IgZnVuY3Rpb25zLCByZW1vdmUgYFNJTV9ERVNDIHNkJwotIAlhbmQgYGNwdSAqcHJvY2Vzc29yJyBhcmd1bWVudHMgYXMgaWdlbiBub3cgaGFuZGxlcyB0aGlzLgotCi0JKiBjcHUuaDogUmVuYW1lIHN0cnVjdCBfY3B1IHRvIHN0cnVjdCBfc2ltX2NwdS4gUmVuYW1lIHZhcmlhYmxlCi0gCXByb2Nlc3NvciB0byBjcHUuCi0KLQkqIHNpbS1zdGF0ZS5oOiBVcGRhdGUuCi0KLUZyaSBNYXIgMjEgMTI6NTI6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX3NhdCk6IENvcnJlY3QgY2FsY3VsYXRpb24gb2Ygc2F0dXJhdGUgbG93ZXIKLSAJYm91bmQuCi0JKGRvX3NhdGgpOiBEaXR0by4KLQkoZG9fc2F0emgsIGRvX3NhdHopOiBBcmd1bWVudHMgc2hvdWxkIGJlIHNpZ25lZC4KLQkKLQkqIHNpbS1jYWxscy5jICh6YWxsb2MpOiBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiB4bWFsbG9jKCkgZm9yCi0gCW1vbWVudC4KLQkoZmlsdGVyX2ZpbGVuYW1lKTogRHJvcC4KLQotCSogY3B1LmggKGlzX3dyb25nX3Nsb3QpOiBDb3JyZWN0IGRlY2xhcmF0aW9uIG5hbWUgLSB3YXMKLSAJaXNfdmFsaWRfc2xvdC4KLQotCSogZW5naW5lLmMgKGRvX3BhcmFsbGVsKTogUGxpY2F0ZSBHQ0MuCi0JKGVuZ2luZV9lcnJvcik6IERpdHRvLgotCShlbmdpbmVfcnVuX3VudGlsX3N0b3ApOiBEaXR0by4KLQkqIGNwdS5jIChpc193cm9uZ19zbG90KTogRGl0dG8uCi0JKGlzX2NvbmRpdGlvbl9vayk6IERpdHRvLgotCSogc2ltLWNhbGxzLmMgKHNpbV9zaXplKTogRGl0dG8uCi0JKHNpbV9yZWFkKTogRGl0dG8uCi0JKHNpbV90cmFjZSk6IERpdHRvLgotCQotCSogZW5naW5lLmgsIGVuZ2luZS5jIChlbmdpbmVfY3JlYXRlKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlIHRvCi0gCWhlYWRlciBmaWxlLiAgQ2xlYW4gdXAgbWlzc2luZyB2YXJpYWJsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodW5pc3RkLmgsIHN0cmluZy5oLCBzdHJpbmdzLmgpOiBDb25maWd1cmUgaW4uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVGh1IE1hciAyMCAxOTo0MDoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAodm9pZCk6IFByb3ZpZGUgYSBzZWNvbmQgZW11bCBpbnN0cnVjdGlvbiB1c2luZyBhCi0gCWJyYW5jaCBwcmVmaXguCi0KLVR1ZSBNYXIgMTggMjA6NTE6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbiAoZG9fc2F0Kik6IFBhc3MgYWxsIG5lY2Vzc2FyeSBhcmdzLgotCQotVHVlIE1hciAxOCAxODo0OToxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoU0FUKik6IElzc3VlIHdhcm5pbmcgd2hlbiBiaXQgb3ZlcmZsb3cuCi0JKEVNVUwpOiBFeGl0IHdpdGggR1BSWzJdIG5vdCAyLgotCi1UdWUgTWFyIDE4IDE0OjI0OjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBzaW0tc3RhdGUuaDogTmV3IGZpbGUgcmVuYW1lIGVuZ2luZS5oLgotCShzaW1fc3RhdGUpOiBSZW5hbWUgZW5naW5lIHN0cnV0IHRvIHNpbV9zdGF0ZSwgcmVuYW1lIGV2ZW50cyBhbmQKLSAJY29yZSBtZW1iZXJzLgotCQotCSogZW5naW5lLmM6IFVwZGF0ZS4KLQkqIGNwdS5oLCBjcHUuYzogRGl0dG8uCi0JKiBhbHUuaDogRGl0dG8uCi0JKiBkMzB2LWluc25zOiBEaXR0by4KLQkqIHNpbS1jYWxscy5jOiBEaXR0by4KLQotCSogTWFrZWZpbGUuaW4gKHNpbS0qLmMpOiBNb3ZlZCB0byAuLi9jb21tb24uCi0KLVR1ZSBNYXIgMTggMTA6Mzk6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnMgKGRvX21hYyk6IEFkZGluZyB3cm9uZyByZWdpc3Rlci4KLQkoZG9fbWFjcyk6IERpdHRvLgotCShkb19tc3ViKTogRGl0dG8uCi0JKGRvX21zdWJzKTogRGl0dG8uCi0KLQkqIGljLWQzMHY6IFB1dCBiYWNrIGRlZmluaXRpb25zIG9mIFJhSCwgUmFMLCBldC5hbC4KLQkoZG9fc3JhMmgsIGRvX3NyYWgpOiBVc2UuCi0JKGRvX3NybDJoLCBkb19zcmxoKTogVXNlLgotCQotCSogZDMwdi1pbnNucyAoU0FULCBTQVQySCwgU0FUcCwgU0FUWik6IEltcGxlbWVudCBzYXR1cmF0ZS4KLQotVHVlIE1hciAxOCAwMzowMToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNuczogU3BlY2lmeSB3aWxkIGluc3RlZCBvZiByZXNlcnZlZCBiaXRzLgotCSh2b2lkKTogCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLU1vbiBNYXIgMTcgMTQ6MzU6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0ZMQUdTKSwgY29uZmlndXJlLmluOiBJbmNsdWRlIFNJTV8qCi0gCW9wdGlvbnMuIEFsbG93IFJFU0VSVkVEX0JJVFMgdG8gYmUgY29uZmlndXJlZC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi0JKiBNYWtlZmlsZS5pbiAoc2ltLSouaCk6IERyb3AsIG5vdCBuZWVkZWQuCi0JKHNpbS0qLmMpOiBNYWtlIGVhY2ggZXhwbGljaXQgc28gdGhhdCB0aGV5IGF1dG9tYXRpY2FsbHkgdXBkYXRlLgotCi1TYXQgTWFyIDE1IDAyOjM0OjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBpYy1kMzB2IChpbW0gbG9uZyk6IEluY29ycmVjdCBjYWxjdWxhdGlvbi4KLQotCSogZDMwdi1pbnNucyAoRU1VTCk6IEZpbmlzaCBleGl0LCB3cml0ZS1zdHJpbmcgZW11bC1jYWxsLgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX3RyYWNlKTogSGF2ZSBzaW0tdHJhY2UgZW5hYmxlIGJhc2ljIGluc3RydWN0aW9uCi0gCXRyYWNpbmcuCi0KLVNhdCBNYXIgMTUgMDI6MTA6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRW5hYmxlIGNvbW1vbiBvcHRpb25zIC0gZW5kaWFuLCBpbmxpbmUgYW5kCi0gCXdhcm5pbmdzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCQotRnJpIE1hciAxNCAxNjoxMTo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNwdS5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGNwdS5jIChpc19jb25kaXRpb25fb2spOiBVcGRhdGUgUFNXIGJpdCBtYW5pcHVsYXRpb25zLgotCi1GcmkgTWFyIDE0IDEyOjQ5OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEF1dG9jb25maWcgbTQKLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogTWFrZWZpbGUuaW46IFVzZSBtNCB0byBwcmVwcm9jZXNzIGQzMHYtaW5zbnMuCi0JKiBkMzB2LWluc246IEFkanVzdC4KLQotVGh1IE1hciAxMyAxMjo0NDo1NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93Ci0JaW4gYXJndiBmb3JtLgotCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KLQotV2VkIE1hciAxMiAxOTowNTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQ3JlYXRlIGFsbCB0aGUgZDMwdiBSQU0gYmxvY2tzLgotCi0JKiBlbmdpbmUuYyAoZW5naW5lX3J1bl91bnRpbF9zdG9wKTogSGFuZGxlIGRlbGF5ZWQgc3Vicm91dGluZQotIAljYWxsLgotCSogZDMwdi1pbnNuOiBEaXR0by4KLQkKLQkqIGljLWQzMHY6IEZvciBSYiBhbmQgUmMgYWx3YXlzIHJldHVybiB0aGUgdmFsdWUgYW5kIG5vdCB0aGUKLSAJZXF1YXRpb24uCi0JKiBkMzB2LWluc246IFVzZS4KLQkKLQkqIGljLWQzMHYgKHZhbF9SYSk6IFJldHVybnMgMCBvciBSQS4KLQkqIGQzMHYtaW5zbjogVXNlLgotCQotCSogZDMwdi1pbnNuIChtYWtlX2V2ZW5fcmVnLCBnZXRfZXZlbl9yZWcpOiBOZXcgZnVuY3Rpb25zLiBGb3JjZQotIAl0aGUgcmVnaXN0ZXIgaW5kZXggdG8gYmUgZXZlbiwgaXNzdXNpbmcgYSB3YXJuaW5nIGlmIGl0IHdhcyBub3QuCi0JKExEKiwgU1QqKTogVXNlLgotCQotV2VkIE1hciAxMiAxNDo1NzoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAoZG9fdHJhcCk6IEltcGxlbWVudCBUUkFQIGluc3RydWN0aW9uLgotCi0JKiBhbHUuaCAoUFNXX0YsIFBTV19GTEFHX1ZBTCwgUFNXX0ZMQUdfU0VUKTogTmV3IG1hY3JvLCBtYXAgZmxhZwotIAlvbnRvIFBTVyBiaXQuCi0JKiBpYy1kMzB2OiBEcm9wIEYqIGV4cHJlc3Npb25zLgotCSogZDMwdi1pbnNuOiBVc2UgbW9yZSBleHBsaWNpdCBQU1dfRkxBR18gb3BzLgotCSogY3B1LmggKFBTV18qKTogUmVkbyBQU1cgYml0IHZhbHVlcy4KLQkqIGFsdS5oIChBTFUqX0VORCk6IFVwZGF0ZS4gRml4IHNldHRpbmcgb2Ygb3ZlcmZsb3cgLSBsb2dpYyB3YXMKLSAJYmFja3dhcmRzLgotCQotCSogZDMwdi1pbnNuIChNVkZTWVMsIE1WVFNZUyk6IEltcGxlbWVudC4KLQkqIGNwdS5oIChQU1dILCBQU1dMKTogTmV3IG1hY3JvcyBmb3IgaGlnaCwgbG93IHdvcmQgb2YgUFNXLgotCQotV2VkIE1hciAxMiAxNDoxMjoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY3B1LmggKFJQVF9JU19DQUxMKTogTmV3IG1hY3JvIGZvciBwcm9jZXNzb3IgZmllbGQKLSAJaXNfZGVsYXllZF9jYWxsLiAgVGhhdCBpbiB0dXJuIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlIGlmIGEKLSAJZGVsYXllZCBicmFuY2ggb3IgZGVsYXllZCBjYWxsIGlzIHRvIG9jY3VyZS4KLQkqIGQzMHYtaW5zbnMgKGRvX2RicmEpOiBTZXQvY2xlYXIgUlBUX0lTX0NBTEw7Ci0JKGRvX2RicmFpKTogRGl0dG8uCi0JKGRvX2Ric3IpOiBEaXR0by4KLQkoZG9fZGJzcik6IERpdHRvLgotCShkb19kam1wKTogRGl0dG8uCi0JKGRvX2RqbXBpKTogRG90dG8uCi0JKGRvX2Rqc3IpOiBEaXR0by4KLQkoZG9fZGpzcmkpOiBEaXR0by4KLQkodm9pZCk6IAotCi0JKiBkMzB2LWluc24gKGRvX2luY3IpOiBGaW5pc2ggLSBoYW5kbGUgbW9kdWxvIHJlZ2lzdGVycy4KLQkKLQkqIGQzMHYtaW5zbnMgKENNUFUpOiBJbmNsdWRlIGFsbCBwb3NzaWJsZSBjb21wYXJlCi0gCW9wZXJhdGlvbnMuIElzc3VlIGEgd2FybmluZyB3aGVyZSBvcCBkZWZpbmVkIGJ5IHRoZSBwcm9jZXNzb3IKLSAJc3BlYy4KLQkKLVdlZCBNYXIgMTIgMTM6NTU6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtaW5zbnM6IEFkZCBhIG5ldyBpbnN0cnVjdGlvbiBjbGFzcyBfRU1VTCBhbmQgYSBuZXcKLSAJaW5zdHJ1Y3Rpb24gRU1VTCB0aGF0IGVtdWxhdGVzIGEgZmV3IGJhc2ljIElPIG9wZXJhdGlvbnMuCi0KLQkqIE1ha2VmaWxlLmluICh0bXAtaWdlbik6IEZpbHRlciBpbiBlbXVsIGluc3RydWN0aW9ucy4KLQotRnJpIE1hciAgNyAyMDozMjoxMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZDMwdi1pbnNucyAodm9pZCk6IEZpbGwgaW4gdGhlIGdhcHMuCi0KLVdlZCBGZWIgMjYgMDk6MzE6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5pbiAodG1wLWlnZW4pOiBJbmNsdWRlIGljLWQzMHYgaW4gZGVwZW5kZW5jaWVzLgotCi0JKiBpYy1kMzB2IChjYWNoZSk6IFVwZGF0ZSB0byB1c2UgSF93b3JkLCBMX3dvcmQgYWRkZWQgdG8KLSAJc2ltLWVuZGlhbi5oLgotCi1UdWUgRmViIDI1IDE1OjI2OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogQ29ycmVjdGx5IHJ1biAkKE1BS0UpLgotCi1UaHUgRmViIDIwIDIwOjMwOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEZST01fSUdFTiwgRlJPTV9DT01NT04pOiBNYWtlIHRoZSBpZ2VuIGdlbmVyYXRlZAotIAlmaWxlcyBkZXBlbmRhbnQgb24gdG1wLWlnZW4uIERlZmluZSBFTkdJTkVfSC4KLQkKLVN1biBGZWIgMTYgMTY6NDI6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE5ldyBmaWxlIC0gZm9sbG93IERvdWcgRXZhbnMgaW5zdHJ1Y3Rpb25zLgotCSogTWFrZWZpbGUuaW46IERpdHRvLgotCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9NYWtlZmlsZS5pbiBiL3NpbS9kMzB2L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYzYmU4Li4wMDAwMDAwCi0tLSBhL3NpbS9kMzB2L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMgICBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgotIyAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0jIAotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1NND0gQE00QAotCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGdpdmVuIGRlZmF1bHQgdmFsdWVzIGluIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcuCi0jIFdlIG92ZXJyaWRlIHRoZSBvbmVzIHdlIG5lZWQgdG8gaGVyZS4KLSMgTm90IGFsbCBvZiB0aGVzZSBuZWVkIHRvIGJlIG1lbnRpb25lZCwgb25seSB0aGUgbmVjZXNzYXJ5IG9uZXMuCi0KLSMgTGlzdCBvZiBvYmplY3QgZmlsZXMsIGxlc3MgY29tbW9uIHBhcnRzLgotU0lNX09CSlMgPSBcCi0JJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCi0JZW5naW5lLm8gY3B1Lm8gXAotCXNfc3VwcG9ydC5vIGxfc3VwcG9ydC5vIFwKLQlzX2lkZWNvZGUubyBsX2lkZWNvZGUubyAgXAotCXNfc2VtYW50aWNzLm8gbF9zZW1hbnRpY3MubyBcCi0Jc2ltLWNhbGxzLm8gaXRhYmxlLm8gXAotCXNpbS1obG9hZC5vIFwKLQlzaW0taHJ3Lm8gXAotCXNpbS1lbmdpbmUubyBcCi0Jc2ltLXN0b3AubyBcCi0Jc2ltLXJlYXNvbi5vIFwKLQlzaW0tcmVzdW1lLm8KLQotIyBMaXN0IG9mIGV4dHJhIGRlcGVuZGVuY2llcy4KLSMgR2VuZXJhbGx5IHRoaXMgY29uc2lzdHMgb2Ygc2ltdWxhdG9yIHNwZWNpZmljIGZpbGVzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCi1TSU1fRVhUUkFfREVQUyA9IGl0YWJsZS5oIHNfaWRlY29kZS5oIGxfaWRlY29kZS5oIGNwdS5oIGFsdS5oCi0KLSMgTGlzdCBvZiBnZW5lcmF0b3JzCi1TSU1fR0VOPXRtcC1pZ2VuCi0KLSMgTGlzdCBvZiBleHRyYSBmbGFncyB0byBhbHdheXMgcGFzcyB0byAkKENDKS4KLVNJTV9FWFRSQV9DRkxBR1MgPSBAc2ltX3RyYXBkdW1wQAotCi0jIExpc3Qgb2YgbWFpbiBvYmplY3QgZmlsZXMgZm9yIGBydW4nLgotU0lNX1JVTl9PQkpTID0gbnJ1bi5vCi0KLSMgRGVwZW5kZW5jeSBvZiBgY2xlYW4nIHRvIGNsZWFuIGFueSBleHRyYSBmaWxlcy4KLVNJTV9FWFRSQV9DTEVBTiA9IGNsZWFuLWlnZW4KLQotIyBUaGlzIHNlbGVjdHMgdGhlIGQzMHYgbmV3bGliL2xpYmdsb3NzIHN5c2NhbGwgZGVmaW5pdGlvbnMuCi1OTF9UQVJHRVQ9LUROTF9UQVJHRVRfZDMwdgotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1NQUlOX0lOQ0xVREVfREVQUyA9IHRjb25maWcuaAotSU5DTFVERV9ERVBTID0gJChNQUlOX0lOQ0xVREVfREVQUykgJChTSU1fRVhUUkFfREVQUykKLQotIyBSdWxlcyBuZWVkIHRvIGJ1aWxkICQoU0lNX09CSlMpLCBwbHVzIHdoYXRldmVyIGVsc2UgdGhlIHRhcmdldCB3YW50cy4KLQotIyAuLi4gdGFyZ2V0IHNwZWNpZmljIHJ1bGVzIC4uLgotCi0jIEZpbHRlciB0byBlbGltaW5hdGUga25vd24gd2FybmluZ3MKLUZJTFRFUiA9IDI+JjEgfCBlZ3JlcCAtdiAiRGlzY2FyZGluZyBpbnN0cnVjdGlvbnxpbnN0cnVjdGlvbiBmaWVsZCBvZiB0eXBlIFxgY29tcHV0ZVwnIGNoYW5nZWQgdG8gXGBjYWNoZVwnfEluc3RydWN0aW9uIGZvcm1hdCBpcyBub3QgNjQgYml0cyB3aWRlIgotCi1CVUlMVF9TUkNfRlJPTV9JR0VOID0gXAotCXNfaWNhY2hlLmggXAotCXNfaWNhY2hlLmMgXAotCXNfaWRlY29kZS5oIFwKLQlzX2lkZWNvZGUuYyBcCi0Jc19zZW1hbnRpY3MuaCBcCi0Jc19zZW1hbnRpY3MuYyBcCi0Jc19tb2RlbC5oIFwKLQlzX21vZGVsLmMgXAotCXNfc3VwcG9ydC5oIFwKLQlzX3N1cHBvcnQuYyBcCi0JbF9pY2FjaGUuaCBcCi0JbF9pY2FjaGUuYyBcCi0JbF9pZGVjb2RlLmggXAotCWxfaWRlY29kZS5jIFwKLQlsX3NlbWFudGljcy5oIFwKLQlsX3NlbWFudGljcy5jIFwKLQlsX21vZGVsLmggXAotCWxfbW9kZWwuYyBcCi0JbF9zdXBwb3J0LmggXAotCWxfc3VwcG9ydC5jIFwKLQlpdGFibGUuaCBpdGFibGUuYwotJChCVUlMVF9TUkNfRlJPTV9JR0VOKTogdG1wLWlnZW4KLSMKLQotLlBIT05ZOiBjbGVhbi1pZ2VuCi1jbGVhbi1pZ2VuOgotCXJtIC1mICQoQlVJTFRfU1JDX0ZST01fSUdFTikKLQlybSAtZiB0bXAtaWdlbiB0bXAtaW5zbnMKLQotLi4vaWdlbi9pZ2VuOgotCWNkIC4uL2lnZW4gJiYgJChNQUtFKQotCi10bXAtaWdlbjogJChzcmNkaXIpL2RjLXNob3J0ICQoc3JjZGlyKS9kMzB2LWluc25zICQoc3JjZGlyKS9pYy1kMzB2IC4uL2lnZW4vaWdlbgotCWNkIC4uL2lnZW4gJiYgJChNQUtFKQotCWVjaG8gIiMgMSBcIiQoc3JjZGlyKS9kMzB2LWluc25zXCIiID4gdG1wLWluc25zCi0JJChNNCkgPCAkKHNyY2RpcikvZDMwdi1pbnNucyA+PiB0bXAtaW5zbnMgCi0JQGVjaG8gIkdlbmVyYXRpbmcgc2hvcnQgdmVyc2lvbiAuLi4iCi0JLi4vaWdlbi9pZ2VuIFwKLQkJLUcgZ2VuLXplcm8tcjAgXAotCQktRyBkaXJlY3QtYWNjZXNzIFwKLQkJLUcgZGVmYXVsdC1uaWEtbWludXMtb25lIFwKLQkJLUcgY29uZGl0aW9uYWwtaXNzdWUgXAotCQktRyB2ZXJpZnktc2xvdCBcCi0JCS1HIGZpZWxkLXdpZHRocyBcCi0JCS1GIHNob3J0LGVtdWwgXAotCQktQiAzMiBcCi0JCS1QICJzXyIgXAotCQktbyAkKHNyY2RpcikvZGMtc2hvcnQgXAotCQktayAkKHNyY2RpcikvaWMtZDMwdiBcCi0JCS1uICQoc3JjZGlyKS9kMzB2LWluc25zIC1pIHRtcC1pbnNucyBcCi0JCS1uIHNfaWNhY2hlLmggICAgLWhjIHRtcC1pY2FjaGUuaCBcCi0JCS1uIHNfaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCi0JCS1uIHNfc2VtYW50aWNzLmggLWhzIHRtcC1zZW1hbnRpY3MuaCBcCi0JCS1uIHNfc2VtYW50aWNzLmMgLXMgIHRtcC1zZW1hbnRpY3MuYyBcCi0JCS1uIHNfaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAotCQktbiBzX2lkZWNvZGUuYyAgIC1kICB0bXAtaWRlY29kZS5jIFwKLQkJLW4gc19tb2RlbC5oICAgICAtaG0gdG1wLW1vZGVsLmggXAotCQktbiBzX21vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCi0JCS1uIHNfc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAotCQktbiBzX3N1cHBvcnQuYyAgIC1mICB0bXAtc3VwcG9ydC5jICQoRklMVEVSKQotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggc19pY2FjaGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgc19pY2FjaGUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5oIHNfaWRlY29kZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgc19pZGVjb2RlLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIHNfc2VtYW50aWNzLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5jIHNfc2VtYW50aWNzLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmggc19tb2RlbC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIHNfbW9kZWwuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5oIHNfc3VwcG9ydC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmMgc19zdXBwb3J0LmMKLQlAZWNobyAiR2VuZXJhdGluZyBsb25nIHZlcnNpb24gLi4uIgotCS4uL2lnZW4vaWdlbiBcCi0JCS1HIGdlbi16ZXJvLXIwIFwKLQkJLUcgZGlyZWN0LWFjY2VzcyBcCi0JCS1HIGRlZmF1bHQtbmlhLW1pbnVzLW9uZSBcCi0JCS1HIGNvbmRpdGlvbmFsLWlzc3VlIFwKLQkJLUcgZmllbGQtd2lkdGhzIFwKLQkJLUYgbG9uZyxlbXVsIFwKLQkJLUIgNjQgXAotCQktUCAibF8iIFwKLQkJLW8gJChzcmNkaXIpL2RjLXNob3J0IFwKLQkJLWsgJChzcmNkaXIpL2ljLWQzMHYgXAotCQktaSB0bXAtaW5zbnMgXAotCQktbiBsX2ljYWNoZS5oICAgIC1oYyB0bXAtaWNhY2hlLmggXAotCQktbiBsX2ljYWNoZS5jICAgIC1jICB0bXAtaWNhY2hlLmMgXAotCQktbiBsX3NlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAotCQktbiBsX3NlbWFudGljcy5jIC1zICB0bXAtc2VtYW50aWNzLmMgXAotCQktbiBsX2lkZWNvZGUuaCAgIC1oZCB0bXAtaWRlY29kZS5oIFwKLQkJLW4gbF9pZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCi0JCS1uIGxfbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKLQkJLW4gbF9tb2RlbC5jICAgICAtbSAgdG1wLW1vZGVsLmMgXAotCQktbiBsX3N1cHBvcnQuaCAgIC1oZiB0bXAtc3VwcG9ydC5oIFwKLQkJLW4gbF9zdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYyAkKEZJTFRFUikKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5oIGxfaWNhY2hlLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIGxfaWNhY2hlLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuaCBsX2lkZWNvZGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5jIGxfaWRlY29kZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBsX3NlbWFudGljcy5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuYyBsX3NlbWFudGljcy5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5oIGxfbW9kZWwuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuYyBsX21vZGVsLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBsX3N1cHBvcnQuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5jIGxfc3VwcG9ydC5jCi0JQGVjaG8gIkdlbmVyYXRpbmcgaW5zdHJ1Y3Rpb24gZGF0YWJhc2UgLi4uIgotCS4uL2lnZW4vaWdlbiBcCi0JCS1HIGZpZWxkLXdpZHRocyBcCi0JCS1GIHNob3J0LGxvbmcsZW11bCBcCi0JCS1CIDY0IFwKLQkJLW8gJChzcmNkaXIpL2RjLXNob3J0IFwKLQkJLWsgJChzcmNkaXIpL2ljLWQzMHYgXAotCQktaSB0bXAtaW5zbnMgXAotCQktbiBpdGFibGUuaCAgICAtaHQgdG1wLWl0YWJsZS5oIFwKLQkJLW4gaXRhYmxlLmMgICAgLXQgIHRtcC1pdGFibGUuYyAkKEZJTFRFUikKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5oIGl0YWJsZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuYyBpdGFibGUuYwotCXRvdWNoIHRtcC1pZ2VuCi0KLUVOR0lORV9IID0gXAotCXNpbS1tYWluLmggXAotCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWJhc2ljcy5oIFwKLQljb25maWcuaCBcCi0JJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tY29uZmlnLmggXAotCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWlubGluZS5oIFwKLQkkKHNyY2RpcikvLi4vY29tbW9uL3NpbS10eXBlcy5oIFwKLQkkKHNyY2RpcikvLi4vY29tbW9uL3NpbS1iaXRzLmggXAotCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWVuZGlhbi5oIFwKLQlpdGFibGUuaCBcCi0JbF9pZGVjb2RlLmggc19pZGVjb2RlLmggXAotCWNwdS5oIFwKLQlhbHUuaCBcCi0JJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tYWx1LmggXAotCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWNvcmUuaCBcCi0JJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tZXZlbnRzLmggXAotCi1lbmdpbmUubzogZW5naW5lLmMgJChFTkdJTkVfSCkKLXNpbS1jYWxscy5vOiBzaW0tY2FsbHMuYyAkKEVOR0lORV9IKSAkKHNyY2RpcikvLi4vY29tbW9uL3NpbS11dGlscy5oICQoc3JjZGlyKS8uLi9jb21tb24vc2ltLW9wdGlvbnMuaAotY3B1Lm86IGNwdS5jICQoRU5HSU5FX0gpCi1zX3N1cHBvcnQubzogc19zdXBwb3J0LmMgJChFTkdJTkVfSCkKLWxfc3VwcG9ydC5vOiBsX3N1cHBvcnQuYyAkKEVOR0lORV9IKQotc19zZW1hbnRpY3Mubzogc19zZW1hbnRpY3MuYyAkKEVOR0lORV9IKQotbF9zZW1hbnRpY3MubzogbF9zZW1hbnRpY3MuYyAkKEVOR0lORV9IKQpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvYWNjb25maWcuaCBiL3NpbS9kMzB2L2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg3YTEuLjAwMDAwMDAKLS0tIGEvc2ltL2QzMHYvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvYWx1LmggYi9zaW0vZDMwdi9hbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZWUzZi4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi9hbHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmbmRlZiBfRDMwVl9BTFVfSF8KLSNkZWZpbmUgX0QzMFZfQUxVX0hfCi0KLSNkZWZpbmUgQUxVX0NBUlJZIChQU1dfVkFMKFBTV19DKSAhPSAwKQotCi0jaW5jbHVkZSAic2ltLWFsdS5oIgotCi0jZGVmaW5lIEFMVTE2X0VORChUQVJHLCBISUdIKQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMzIgbWFzaywgdmFsdWU7CQkJCQkJXAotICBpZiAoQUxVMTZfSEFEX09WRVJGTE9XKSB7CQkJCQkJXAotICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19WQSkgfCBCSVQzMiAoUFNXX0MpOwkJXAotICAgIHZhbHVlID0gQklUMzIgKFBTV19WKSB8IEJJVDMyIChQU1dfVkEpOwkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIGVsc2UgewkJCQkJCQkJXAotICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19DKTsJCQkJXAotICAgIHZhbHVlID0gMDsJCQkJCQkJCVwKLSAgfQkJCQkJCQkJCVwKLSAgaWYgKEFMVTE2X0hBRF9DQVJSWV9CT1JST1cpCQkJCQkJXAotICAgIHZhbHVlIHw9IEJJVDMyIChQU1dfQyk7CQkJCQkJXAotICBpZiAoSElHSCkJCQkJCQkJCVwKLSAgICBXUklURTMyX1FVRVVFX01BU0sgKFRBUkcsIEFMVTE2X09WRVJGTE9XX1JFU1VMVDw8MTYsIDB4ZmZmZjAwMDApOwlcCi0gIGVsc2UJCQkJCQkJCQlcCi0gICAgV1JJVEUzMl9RVUVVRV9NQVNLIChUQVJHLCBBTFUxNl9PVkVSRkxPV19SRVNVTFQsIDB4MDAwMGZmZmYpOwlcCi0gIFdSSVRFMzJfUVVFVUVfTUFTSyAoJlBTVywgdmFsdWUsIG1hc2spOwkJCQlcCi19Ci0KLSNkZWZpbmUgQUxVMzJfRU5EKFRBUkcpCQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0gIHVuc2lnbmVkMzIgbWFzaywgdmFsdWU7CQkJCQkJXAotICBpZiAoQUxVMzJfSEFEX09WRVJGTE9XKSB7CQkJCQkJXAotICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19WQSkgfCBCSVQzMiAoUFNXX0MpOwkJXAotICAgIHZhbHVlID0gQklUMzIgKFBTV19WKSB8IEJJVDMyIChQU1dfVkEpOwkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIGVsc2UgewkJCQkJCQkJXAotICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19DKTsJCQkJXAotICAgIHZhbHVlID0gMDsJCQkJCQkJCVwKLSAgfQkJCQkJCQkJCVwKLSAgaWYgKEFMVTMyX0hBRF9DQVJSWV9CT1JST1cpCQkJCQkJXAotICAgIHZhbHVlIHw9IEJJVDMyIChQU1dfQyk7CQkJCQkJXAotICBXUklURTMyX1FVRVVFIChUQVJHLCBBTFUzMl9PVkVSRkxPV19SRVNVTFQpOwkJCQlcCi0gIFdSSVRFMzJfUVVFVUVfTUFTSyAoJlBTVywgdmFsdWUsIG1hc2spOwkJCQlcCi19Ci0KLSNkZWZpbmUgQUxVX0VORChUQVJHKSBBTFUzMl9FTkQoVEFSRykKLQotCi0vKiBQU1cgJiBGbGFnIG1hbmlwdWxhdGlvbiAqLwotCi0jZGVmaW5lIFBTV19TRVQoQklULFZBTCkgQkxJVDMyKFBTVywgKEJJVCksIChWQUwpKQotI2RlZmluZSBQU1dfVkFMKEJJVCkgRVhUUkFDVEVEMzIoUFNXLCAoQklUKSwgKEJJVCkpCi0KLSNkZWZpbmUgUFNXX0YoRkxBRykgKDE3ICsgKChGTEFHKSAlIDgpICogMikKLSNkZWZpbmUgUFNXX0ZMQUdfU0VUKEZMQUcsVkFMKSBQU1dfU0VUKFBTV19GKEZMQUcpLCBWQUwpCi0jZGVmaW5lIFBTV19GTEFHX1ZBTChGTEFHKSBQU1dfVkFMKFBTV19GKEZMQUcpKQotCi0jZGVmaW5lIFBTV19TRVRfUVVFVUUoQklULFZBTCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICB1bnNpZ25lZDMyIG1hc2sgPSBCSVQzMiAoQklUKTsJCQkJCVwKLSAgdW5zaWduZWQzMiBiaXR2YWwgPSAoVkFMKSA/IG1hc2sgOiAwOwkJCQkJXAotICBXUklURTMyX1FVRVVFX01BU0sgKCZQU1csIGJpdHZhbCwgbWFzayk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUFNXX0ZMQUdfU0VUX1FVRVVFKEZMQUcsVkFMKQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgdW5zaWduZWQzMiBtYXNrID0gQklUMzIgKFBTV19GIChGTEFHKSk7CQkJCVwKLSAgdW5zaWduZWQzMiBiaXR2YWwgPSAoVkFMKSA/IG1hc2sgOiAwOwkJCQkJXAotICBXUklURTMyX1FVRVVFX01BU0sgKCZQU1csIGJpdHZhbCwgbWFzayk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIEJyaW5nIGRhdGEgaW4gZnJvbSB0aGUgY29sZCAqLwotCi0jZGVmaW5lIElNRU0oRUEpIFwKLShzaW1fY29yZV9yZWFkXzgoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgZXhlY19tYXAsIChFQSkpKQotCi0jZGVmaW5lIE1FTShTSUdOLCBFQSwgTlJfQllURVMpIFwKLSgoU0lHTiMjXyMjTlJfQllURVMpIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyMjTlJfQllURVMoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgcmVhZF9tYXAsIChFQSkpKQotCi0jZGVmaW5lIFNUT1JFKEVBLCBOUl9CWVRFUywgVkFMKSBcCi1kbyB7IFwKLSAgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXyMjTlJfQllURVMoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgd3JpdGVfbWFwLCAoRUEpLCAoVkFMKSk7IFwKLX0gd2hpbGUgKDApCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9jb25maWcuaW4gYi9zaW0vZDMwdi9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjNiODYuLjAwMDAwMDAKLS0tIGEvc2ltL2QzMHYvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLwotI3VuZGVmIFdPUkRTX0JJR0VORElBTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vZDMwdi9jb25maWd1cmUgYi9zaW0vZDMwdi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3Nzk4NDcuLjAwMDAwMDAKLS0tIGEvc2ltL2QzMHYvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDQxMCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taW5saW5lPWlubGluZXMJCVNwZWNpZnkgd2hpY2ggZnVuY3Rpb25zIHNob3VsZCBiZSBpbmxpbmVkLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCwgIG5vbnN0cmljdCBvciBmb3JjZWQgYWxpZ25tZW50IG9mIG1lbW9yeSBhY2Nlc3Nlcy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1idWlsZC13YXJuaW5nc1s9TElTVF0JCUVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMJCVNwZWNpZnkgd2hldGhlciB0byBjaGVjayByZXNlcnZlZCBiaXRzIGluIGluc3RydWN0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFwZHVtcAkJTWFrZSB1bmtub3duIHRyYXBzIGR1bXAgdGhlIHJlZ2lzdGVycyIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc0ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzM6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwMDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgzNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Nzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwMDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNDA6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3MzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA4OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0MTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA2OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjkxOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzUzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczOTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1NzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTU2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTg5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjMyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5NDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjc6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0NzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY2OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzkzOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyMTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDU2OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUzMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Mjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzYzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODUzOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODgxOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk2MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzExOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTc0OiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjE6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTY6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDM4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjA6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi1mb3IgYWNfcHJvZyBpbiBnbTQgZ251bTQgbTQKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTTQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTTQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX000PSIkTTQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9NND0iJE00IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX000PSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZmkKLU00PSIkYWNfY3ZfcGF0aF9NNCIKLWlmIHRlc3QgLW4gIiRNNCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNNCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRNNCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRNNCIgfHwgTTQ9Im00IgotCi0KLQotZGVmYXVsdF9zaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWlubGluZSBvciAtLWRpc2FibGUtc2ltLWlubGluZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faW5saW5lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faW5saW5lIgotICBzaW1faW5saW5lPSIiCi1jYXNlICIkZW5hYmxldmFsIiBpbgotICBubykJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICAwKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7Ci0gIHllcyB8IDIpCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7Ci0gIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKLSAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0gICAgICAgbmV3X2ZsYWc9IiIKLSAgICAgICBjYXNlICIkeCIgaW4KLQkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKLQkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7Ci0JICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfQ19JTkxJTkUiOzsKLQkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9DX0lOTElORSI7OwotICAgICAgIGVzYWMKLSAgICAgICBpZiB0ZXN0IHgiJHNpbV9pbmxpbmUiID0geCIiOyB0aGVuCi0JIHNpbV9pbmxpbmU9IiRuZXdfZmxhZyIKLSAgICAgICBlbHNlCi0JIHNpbV9pbmxpbmU9IiRzaW1faW5saW5lICRuZXdfZmxhZyIKLSAgICAgICBmaQotICAgICBkb25lOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faW5saW5lIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQotZmkKLWVsc2UKLSAgCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCi0gICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgotICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLSAgICBmaQotICBlbHNlCi0gICAgc2ltX2lubGluZT0iIgotICBmaQotZWxzZQotICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi1maQotZmkKLQotCi13aXJlX2VuZGlhbj0iQklHX0VORElBTiIKLWRlZmF1bHRfZW5kaWFuPSIiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW5kaWFuIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKLSAgeWVzKQkgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgZWxzZQotICAgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JICAgZWxzZQotCSAgICAgZWNobyAiTm8gaGFyZC13aXJlZCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCIKLQkgICBmaQotCSBmaTs7Ci0gIG5vKQkgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgotCSBlbHNlCi0JICAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0JICAgZWxzZQotCSAgICAgZWNobyAiTm8gZGVmYXVsdCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2VuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLSAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi1lbHNlCi0gIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLSAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0gIGVsc2UKLSAgICBzaW1fZW5kaWFuPQotICBmaQotZmkKLWZpCi0KLXdpcmVfYWxpZ25tZW50PSJTVFJJQ1RfQUxJR05NRU5UIgotZGVmYXVsdF9hbGlnbm1lbnQ9IiIKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OwotICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OwotICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OwotICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLQkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgICBlbHNlCi0JICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgZWxzZQotICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYWxpZ25tZW50PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgotICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi1lbHNlCi0gIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICBlbHNlCi0gICAgc2ltX2FsaWdubWVudD0KLSAgZmkKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWhvc3RlbmRpYW4gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2hvc3RlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0ZW5kaWFuIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OwotICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2hvc3RlbmRpYW49IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCi1maQotZWxzZQotICAKLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MDg6IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgotIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotaW50IG1haW4oKSB7Ci0KLSNpZiAhQllURV9PUkRFUiB8fCAhQklHX0VORElBTiB8fCAhTElUVExFX0VORElBTgotIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzczMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzQxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotbWFpbiAoKSB7Ci0gIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGxvbmcgbDsKLSAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07Ci0gIH0gdTsKLSAgdS5sID0gMTsKLSAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKLUVPRgotCi1maQotCi0gIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKLSAgZWxzZQotICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCi0gIGZpCi1lbHNlCi0gIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYnVpbGQtd2FybmluZ3Mgb3IgLS1kaXNhYmxlLWJ1aWxkLXdhcm5pbmdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2J1aWxkX3dhcm5pbmdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9idWlsZF93YXJuaW5ncyIKLSAgYnVpbGRfd2FybmluZ3M9Ii1XYWxsIC1XcG9pbnRlci1hcml0aCAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMiCi1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJOzsKLSAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OwotICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKLQlidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OwotICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKLQlidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OwotICAqKQlidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQotZmkKLVdBUk5fQ0ZMQUdTPSIiCi1XRVJST1JfQ0ZMQUdTPSIiCi1pZiB0ZXN0ICJ4JHtidWlsZF93YXJuaW5nc30iICE9IHggLWEgIngkR0NDIiA9IHh5ZXMKLXRoZW4KLSAgIyBTZXBhcmF0ZSBvdXQgdGhlIC1XZXJyb3IgZmxhZyBhcyBzb21lIGZpbGVzIGp1c3QgY2Fubm90IGJlCi0gICMgY29tcGlsZWQgd2l0aCBpdCBlbmFibGVkLgotICBmb3IgdyBpbiAke2J1aWxkX3dhcm5pbmdzfTsgZG8KLSAgICBjYXNlICR3IGluCi0gICAgLVdlcnIqKSBXRVJST1JfQ0ZMQUdTPS1XZXJyb3IgOzsKLSAgICAqKSBXQVJOX0NGTEFHUz0iJHtXQVJOX0NGTEFHU30gJHciCi0gICAgZXNhYwotICBkb25lCi1maQotZWxzZQotICBidWlsZF93YXJuaW5ncz0iIgotZmkKLQotCi1kZWZhdWx0X3NpbV9yZXNlcnZlZF9iaXRzPSIxIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIG9yIC0tZGlzYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Jlc2VydmVkX2JpdHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MSI7OwotICBubykJc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTAiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fcmVzZXJ2ZWRfYml0cz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Jlc2VydmVkX2JpdHMiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHJlc2VydmVkIGZsYWdzID0gJHNpbV9yZXNlcnZlZF9iaXRzIiA2PiYxCi1maQotZWxzZQotICBzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9JHtkZWZhdWx0X3NpbV9yZXNlcnZlZF9iaXRzfSIKLWZpCi0KLQotCi0KLSMKLSMgRW5hYmxlIG1ha2luZyB1bmtub3duIHRyYXBzIGR1bXAgb3V0IHJlZ2lzdGVycwotIwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFwZHVtcCBvciAtLWRpc2FibGUtc2ltLXRyYXBkdW1wIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFwZHVtcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYXBkdW1wIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgc2ltX3RyYXBkdW1wPSItRFRSQVBEVU1QPTEiOzsKLSAgbm8pICBzaW1fdHJhcGR1bXA9Ii1EVFJBUERVTVA9MCI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXRyYXBkdW1wIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fdHJhcGR1bXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFwZHVtcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltX3RyYXBkdW1wID0gJHNpbV90cmFwZHVtcCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3RyYXBkdW1wPSIiCi1maQotCi0KLWZvciBhY19oZHIgaW4gc3RkbGliLmggdW5pc3RkLmggc3RyaW5nLmggc3RyaW5ncy5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg4NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4ODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM4OTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBNNEAlJE00JWcKLXMlQHNpbV90cmFwZHVtcEAlJHNpbV90cmFwZHVtcCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvY29uZmlndXJlLmluIGIvc2ltL2QzMHYvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDBhYWM1Li4wMDAwMDAwCi0tLSBhL3NpbS9kMzB2L2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1kbmwgRmluZCBhIHZlcnNpb25uIG9mIG00IHRvIHVzZSBhcyBhIHByZXByb2Nlc3NvcgotQUNfUEFUSF9QUk9HUyhNNCwgZ200IGdudW00IG00LCBtNCkKLQotZG5sIE9wdGlvbnMgYXZhaWxhYmxlIGluIHRoaXMgbW9kdWxlCi1TSU1fQUNfT1BUSU9OX0lOTElORSgwKQotU0lNX0FDX09QVElPTl9FTkRJQU4oQklHX0VORElBTikKLVNJTV9BQ19PUFRJT05fQUxJR05NRU5UKFNUUklDVF9BTElHTk1FTlQpCi1TSU1fQUNfT1BUSU9OX0hPU1RFTkRJQU4KLVNJTV9BQ19PUFRJT05fV0FSTklOR1MKLVNJTV9BQ19PUFRJT05fUkVTRVJWRURfQklUUygxKQotCi1BQ19TVUJTVChNNCkKLQotIwotIyBFbmFibGUgbWFraW5nIHVua25vd24gdHJhcHMgZHVtcCBvdXQgcmVnaXN0ZXJzCi0jCi1BQ19BUkdfRU5BQkxFKHNpbS10cmFwZHVtcCwKLVsgIC0tZW5hYmxlLXNpbS10cmFwZHVtcAkJTWFrZSB1bmtub3duIHRyYXBzIGR1bXAgdGhlIHJlZ2lzdGVyc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV90cmFwZHVtcD0iLURUUkFQRFVNUD0xIjs7Ci0gIG5vKSAgc2ltX3RyYXBkdW1wPSItRFRSQVBEVU1QPTAiOzsKLSAgKikgICBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXRyYXBkdW1wIik7IHNpbV90cmFwZHVtcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYXBkdW1wIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW1fdHJhcGR1bXAgPSAkc2ltX3RyYXBkdW1wIiA2PiYxCi1maV0sW3NpbV90cmFwZHVtcD0iIl0pZG5sCi1BQ19TVUJTVChzaW1fdHJhcGR1bXApCi0KLWRubCBGb3IgVU5JWCBlbXVsYXRpb24KLUFDX0NIRUNLX0hFQURFUlMoc3RkbGliLmggdW5pc3RkLmggc3RyaW5nLmggc3RyaW5ncy5oKQotCi0KLVNJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2NwdS5jIGIvc2ltL2QzMHYvY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGE5NTEuLjAwMDAwMDAKLS0tIGEvc2ltL2QzMHYvY3B1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyogTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3JwLiBEMzBWIFNpbXVsYXRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZm5kZWYgX0NQVV9DXwotI2RlZmluZSBfQ1BVX0NfCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0MCi1pbnQKLWlzX3dyb25nX3Nsb3QgKFNJTV9ERVNDIHNkLAotCSAgICAgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgICAgICBpdGFibGVfaW5kZXggaW5kZXgpCi17Ci0gIHN3aXRjaCAoU1RBVEVfQ1BVIChzZCwgMCktPnVuaXQpCi0gICAgewotICAgIGNhc2UgbWVtb3J5X3VuaXQ6Ci0gICAgICByZXR1cm4gIWl0YWJsZVtpbmRleF0ub3B0aW9uW2l0YWJsZV9vcHRpb25fbXVdOwotICAgIGNhc2UgaW50ZWdlcl91bml0OgotICAgICAgcmV0dXJuICFpdGFibGVbaW5kZXhdLm9wdGlvbltpdGFibGVfb3B0aW9uX2l1XTsKLSAgICBjYXNlIGFueV91bml0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLAotCQkJImludGVybmFsIGVycm9yIC0gaXNfd3Jvbmdfc2xvdCAtIGJhZCBzd2l0Y2giKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWludAotaXNfY29uZGl0aW9uX29rIChTSU1fREVTQyBzZCwKLQkJIGFkZHJlc3Nfd29yZCBjaWEsCi0JCSBpbnQgY29uZCkKLXsKLSAgc3dpdGNoIChjb25kKQotICAgIHsKLSAgICBjYXNlIDB4MDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgMHgxOgotICAgICAgcmV0dXJuIFBTV19WQUwoUFNXX0YwKTsKLSAgICBjYXNlIDB4MjoKLSAgICAgIHJldHVybiAhUFNXX1ZBTChQU1dfRjApOwotICAgIGNhc2UgMHgzOgotICAgICAgcmV0dXJuIFBTV19WQUwoUFNXX0YxKTsKLSAgICBjYXNlIDB4NDoKLSAgICAgIHJldHVybiAhUFNXX1ZBTChQU1dfRjEpOwotICAgIGNhc2UgMHg1OgotICAgICAgcmV0dXJuIFBTV19WQUwoUFNXX0YwKSAmJiBQU1dfVkFMKFBTV19GMSk7Ci0gICAgY2FzZSAweDY6Ci0gICAgICByZXR1cm4gUFNXX1ZBTChQU1dfRjApICYmICFQU1dfVkFMKFBTV19GMSk7Ci0gICAgY2FzZSAweDc6Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwKLQkJCSJpc19jb25kaXRpb25fb2sgLSBiYWQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uIGJpdHMiKTsKLSAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwKLQkJCSJpbnRlcm5hbCBlcnJvciAtIGlzX2NvbmRpdGlvbl9vayAtIGJhZCBzd2l0Y2giKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0MCi0vKiBJZiAtLXRyYWNlLWNhbGwsIHRyYWNlIGNhbGxzLCByZW1lbWJlcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZgotICAgcmVnaXN0ZXJzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2NhbGxfc3RhY2sgewotICBzdHJ1Y3QgX2NhbGxfc3RhY2sgKnByZXY7Ci0gIHJlZ2lzdGVycyByZWdzOwotfSBjYWxsX3N0YWNrOwotCi1zdGF0aWMgY2FsbF9zdGFjayAqY2FsbF9zdGFja19oZWFkID0gKGNhbGxfc3RhY2sgKikwOwotc3RhdGljIGludCBjYWxsX2RlcHRoID0gMDsKLQotdm9pZCBjYWxsX29jY3VycmVkIChTSU1fREVTQyBzZCwKLQkJICAgIHNpbV9jcHUgKmNwdSwKLQkJICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JCSAgICBhZGRyZXNzX3dvcmQgbmlhKQotewotICBjYWxsX3N0YWNrICpwdHIgPSBaQUxMT0MgKGNhbGxfc3RhY2spOwotICBwdHItPnJlZ3MgPSBjcHUtPnJlZ3M7Ci0gIHB0ci0+cHJldiA9IGNhbGxfc3RhY2tfaGVhZDsKLSAgY2FsbF9zdGFja19oZWFkID0gcHRyOwotCi0gIHRyYWNlX29uZV9pbnNuIChzZCwgY3B1LCBuaWEsIDEsICIiLCAwLCAiY2FsbCIsCi0JCSAgIkRlcHRoICUzZCwgUmV0dXJuIDB4JS44bHgsIEFyZ3MgMHglLjhseCAweCUuOGx4IiwKLQkJICArK2NhbGxfZGVwdGgsICh1bnNpZ25lZCBsb25nKWNpYSs4LCAodW5zaWduZWQgbG9uZylHUFJbMl0sCi0JCSAgKHVuc2lnbmVkIGxvbmcpR1BSWzNdKTsKLX0KLQotLyogSWYgLS10cmFjZS1jYWxsLCB0cmFjZSByZXR1cm5zLCBjaGVja2luZyBpZiBhbnkgc2F2ZWQgcmVnaXN0ZXIgd2FzIGNoYW5nZWQuICAqLwotCi12b2lkIHJldHVybl9vY2N1cnJlZCAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgIHNpbV9jcHUgKmNwdSwKLQkJICAgICAgYWRkcmVzc193b3JkIGNpYSwKLQkJICAgICAgYWRkcmVzc193b3JkIG5pYSkKLXsKLSAgY2hhciBidWZmZXJbMTAyNF07Ci0gIGNoYXIgKmJ1Zl9wdHIgPSBidWZmZXI7Ci0gIGNhbGxfc3RhY2sgKnB0ciA9IGNhbGxfc3RhY2tfaGVhZDsKLSAgaW50IHJlZ25vOwotICBjaGFyICpwcmVmaXggPSAiLCBSZWdpc3RlcnMgdGhhdCBkaWZmZXI6ICI7Ci0KLSAgKmJ1Zl9wdHIgPSAnXDAnOwotICBmb3IgKHJlZ25vID0gMzQ7IHJlZ25vIDw9IDYzOyByZWdubysrKSB7Ci0gICAgaWYgKGNwdS0+cmVncy5nZW5lcmFsX3B1cnBvc2VbcmVnbm9dICE9IHB0ci0+cmVncy5nZW5lcmFsX3B1cnBvc2VbcmVnbm9dKSB7Ci0gICAgICBzcHJpbnRmIChidWZfcHRyLCAiJXNyJWQiLCBwcmVmaXgsIHJlZ25vKTsKLSAgICAgIGJ1Zl9wdHIgKz0gc3RybGVuIChidWZfcHRyKTsKLSAgICAgIHByZWZpeCA9ICIgIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoY3B1LT5yZWdzLmFjY3VtdWxhdG9yWzFdICE9IHB0ci0+cmVncy5hY2N1bXVsYXRvclsxXSkgewotICAgIHNwcmludGYgKGJ1Zl9wdHIsICIlc2ExIiwgcHJlZml4KTsKLSAgICBidWZfcHRyICs9IHN0cmxlbiAoYnVmX3B0cik7Ci0gICAgcHJlZml4ID0gIiAiOwotICB9Ci0KLSAgdHJhY2Vfb25lX2luc24gKHNkLCBjcHUsIGNpYSwgMSwgIiIsIDAsICJyZXR1cm4iLAotCQkgICJEZXB0aCAlM2QsIFJldHVybiAweCUuOGx4LCBSZXQuIDB4JS44bHggMHglLjhseCVzIiwKLQkJICBjYWxsX2RlcHRoLS0sICh1bnNpZ25lZCBsb25nKW5pYSwgKHVuc2lnbmVkIGxvbmcpR1BSWzJdLAotCQkgICh1bnNpZ25lZCBsb25nKUdQUlszXSwgYnVmZmVyKTsKLQotICBjYWxsX3N0YWNrX2hlYWQgPSBwdHItPnByZXY7Ci0gIHpmcmVlIChwdHIpOwotfQotCi0MCi0vKiBSZWFkL3dyaXRlIGZ1bmN0aW9ucyBmb3Igc3lzdGVtIGNhbGwgaW50ZXJmYWNlLiAgKi8KLWludAotZDMwdl9yZWFkX21lbSAoaG9zdF9jYWxsYmFjayAqY2IsCi0JICAgICAgIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKLQkgICAgICAgdW5zaWduZWQgbG9uZyB0YWRkciwKLQkgICAgICAgY2hhciAqYnVmLAotCSAgICAgICBpbnQgYnl0ZXMpCi17Ci0gIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotCi0gIHJldHVybiBzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgcmVhZF9tYXAsIGJ1ZiwgdGFkZHIsIGJ5dGVzKTsKLX0KLQotaW50Ci1kMzB2X3dyaXRlX21lbSAoaG9zdF9jYWxsYmFjayAqY2IsCi0JCXN0cnVjdCBjYl9zeXNjYWxsICpzYywKLQkJdW5zaWduZWQgbG9uZyB0YWRkciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlpbnQgYnl0ZXMpCi17Ci0gIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotCi0gIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOwotfQotCi0jZW5kaWYgLyogX0NQVV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvY3B1LmggYi9zaW0vZDMwdi9jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNzQ5Yy4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi9jcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmbmRlZiBfQ1BVX0hfCi0jZGVmaW5lIF9DUFVfSF8KLQotZW51bSB7Ci0gIE5SX0dFTkVSQUxfUFVSUE9TRV9SRUdJU1RFUlMgPSA2NCwKLSAgTlJfQ09OVFJPTF9SRUdJU1RFUlMgPSA2NCwKLSAgTlJfQUNDVU1VTEFUT1JTID0gMiwKLSAgU1RBQ0tfUE9JTlRFUl9HUFIgPSA2MywKLSAgTlJfU1RBQ0tfUE9JTlRFUlMgPSAyLAotfTsKLQotZW51bSB7Ci0gIHByb2Nlc3Nvcl9zdGF0dXNfd29yZF9jciA9IDAsCi0gIGJhY2t1cF9wcm9jZXNzb3Jfc3RhdHVzX3dvcmRfY3IgPSAxLAotICBwcm9ncmFtX2NvdW50ZXJfY3IgPSAyLAotICBiYWNrdXBfcHJvZ3JhbV9jb3VudGVyX2NyID0gMywKLSAgZGVidWdfYmFja3VwX3Byb2Nlc3Nvcl9zdGF0dXNfd29yZF9jciA9IDQsCi0gIGRlYnVnX2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3IgPSA1LAotICByZXNlcnZlZF82X2NyID0gNiwKLSAgcmVwZWF0X2NvdW50X2NyID0gNywKLSAgcmVwZWF0X3N0YXJ0X2FkZHJlc3NfY3IgPSA4LAotICByZXBlYXRfZW5kX2FkZHJlc3NfY3IgPSA5LAotICBtb2R1bG9fc3RhcnRfYWRkcmVzc19jciA9IDEwLAotICBtb2R1bG9fZW5kX2FkZHJlc3NfY3IgPSAxMSwKLSAgaW5zdHJ1Y3Rpb25fYnJlYWtfYWRkcmVzc19jciA9IDE0LAotICBlaXRfdmVjdG9yX2Jhc2VfY3IgPSAxNSwKLX07Ci0KLQotZW51bSB7Ci0gIFBTV19TTSA9IDAsCi0gIFBTV19FQSA9IDIsCi0gIFBTV19EQiA9IDMsCi0gIFBTV19EUyA9IDQsCi0gIFBTV19JRSA9IDUsCi0gIFBTV19SUCA9IDYsCi0gIFBTV19NRCA9IDcsCi0gIFBTV19GMCA9IDE3LAotICBQU1dfRjEgPSAxOSwKLSAgUFNXX0YyID0gMjEsCi0gIFBTV19GMyA9IDIzLAotICBQU1dfUyA9IDI1LAotICBQU1dfViA9IDI3LAotICBQU1dfVkEgPSAyOSwKLSAgUFNXX0MgPSAzMSwKLX07Ci0KLS8qIGFsaWFzZXMgZm9yIFBTVyBmbGFnIG51bWJlcnMgKEYwLi5GNykgKi8KLWVudW0KLXsKLSAgUFNXX1NfRkxBRyA9IDQsCi19OwotCi10eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXJzIHsKLSAgdW5zaWduZWQzMiBnZW5lcmFsX3B1cnBvc2VbTlJfR0VORVJBTF9QVVJQT1NFX1JFR0lTVEVSU107Ci0gIC8qIGtlZXAgdHJhY2sgb2YgdGhlIHN0YWNrIHBvaW50ZXIgKi8KLSAgdW5zaWduZWQzMiBzcFtOUl9TVEFDS19QT0lOVEVSU107IC8qIHN3YXAgd2l0aCBTUCAqLwotICB1bnNpZ25lZDMyIGN1cnJlbnRfc3A7Ci0gIHVuc2lnbmVkMzIgY29udHJvbFtOUl9DT05UUk9MX1JFR0lTVEVSU107Ci0gIHVuc2lnbmVkNjQgYWNjdW11bGF0b3JbTlJfQUNDVU1VTEFUT1JTXTsKLX0gcmVnaXN0ZXJzOwotCi10eXBlZGVmIGVudW0gX2NwdV91bml0cyB7Ci0gIG1lbW9yeV91bml0LAotICBpbnRlZ2VyX3VuaXQsCi0gIGFueV91bml0LAotfSBjcHVfdW5pdHM7Ci0KLS8qIEluIG9yZGVyIHRvIHN1cHBvcnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLCB3aGljaCBvbmUgaW5zdHJ1Y3Rpb24gY2FuIGJlCi0gICB3cml0aW5nIHRvIGEgcmVnaXN0ZXIgdGhhdCBpcyB1c2VkIGFzIGlucHV0IHRvIGFub3RoZXIsIHF1ZXVlIHVwIHRoZQotICAgd3JpdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uIGJvdW5kYXJpZXMuICAqLwotCi0jZGVmaW5lIE1BWF9XUklURTMyCTE2Ci0jZGVmaW5lIE1BWF9XUklURTY0CTIKLQotc3RydWN0IF93cml0ZTMyIHsKLSAgaW50IG51bTsJCQkJLyogIyBvZiAzMi1iaXQgd3JpdGVzIHF1ZXVlZCB1cCAqLwotICB1bnNpZ25lZDMyIHZhbHVlW01BWF9XUklURTMyXTsJLyogdmFsdWUgdG8gd3JpdGUgKi8KLSAgdW5zaWduZWQzMiBtYXNrW01BWF9XUklURTMyXTsJCS8qIG1hc2sgdG8gdXNlICovCi0gIHVuc2lnbmVkMzIgKnB0cltNQVhfV1JJVEUzMl07CQkvKiBhZGRyZXNzIHRvIHdyaXRlIHRvICovCi19OwotCi1zdHJ1Y3QgX3dyaXRlNjQgewotICBpbnQgbnVtOwkJCQkvKiAjIG9mIDY0LWJpdCB3cml0ZXMgcXVldWVkIHVwICovCi0gIHVuc2lnbmVkNjQgdmFsdWVbTUFYX1dSSVRFNjRdOwkvKiB2YWx1ZSB0byB3cml0ZSAqLwotICB1bnNpZ25lZDY0ICpwdHJbTUFYX1dSSVRFNjRdOwkJLyogYWRkcmVzcyB0byB3cml0ZSB0byAqLwotfTsKLQotc3RydWN0IF9zaW1fY3B1IHsKLSAgY3B1X3VuaXRzIHVuaXQ7Ci0gIHJlZ2lzdGVycyByZWdzOwotICBzaW1fY3B1X2Jhc2UgYmFzZTsKLSAgaW50IHRyYWNlX2NhbGxfcDsJCQkvKiBXaGV0aGVyIHRvIGRvIGNhbGwgdHJhY2luZy4gICovCi0gIGludCB0cmFjZV90cmFwX3A7CQkJLyogSWYgdW5rbm93biB0cmFwcyBkdW1wIG91dCB0aGUgcmVncyAqLwotICBpbnQgdHJhY2VfYWN0aW9uOwkJCS8qIHRyYWNlIGJpdHMgYXQgZW5kIG9mIGluc3RydWN0aW9ucyAqLwotICBpbnQgbGVmdF9raWxsc19yaWdodF9wOyAgICAgICAgICAgICAgIC8qIGxlZnQgaW5zbiBraWxscyBpbnNuIGluIHJpZ2h0IHNsb3Qgb2YgLT4gKi8KLSAgaW50IG12dHN5c19sZWZ0X3A7CQkJLyogbGVmdCBpbnNuIHdhcyBtdnRzeXMgKi8KLSAgaW50IGRpZF90cmFwOwkJCQkvKiB3ZSBkaWQgYSB0cmFwICYgbmVlZCB0byBmaW5pc2ggaXQgKi8KLSAgc3RydWN0IF93cml0ZTMyIHdyaXRlMzI7CQkvKiBxdWV1ZWQgdXAgMzItYml0IHdyaXRlcyAqLwotICBzdHJ1Y3QgX3dyaXRlNjQgd3JpdGU2NDsJCS8qIHF1ZXVlZCB1cCA2NC1iaXQgd3JpdGVzICovCi19OwotCi0jZGVmaW5lIFBDCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW3Byb2dyYW1fY291bnRlcl9jcl0pCi0jZGVmaW5lIFBTVyAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyXSkKLSNkZWZpbmUgUFNXTCAgICAoKkFMMl80KCZQU1cpKQotI2RlZmluZSBQU1dIICAgICgqQUgyXzQoJlBTVykpCi0jZGVmaW5lIERQU1cgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2RlYnVnX2JhY2t1cF9wcm9jZXNzb3Jfc3RhdHVzX3dvcmRfY3JdKQotI2RlZmluZSBEUEMgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2RlYnVnX2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3JdKQotI2RlZmluZSBiUEMgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3JdKQotI2RlZmluZSBiUFNXIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtiYWNrdXBfcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyXSkKLSNkZWZpbmUgUlBUX0MgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW3JlcGVhdF9jb3VudF9jcl0pCi0jZGVmaW5lIFJQVF9TIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtyZXBlYXRfc3RhcnRfYWRkcmVzc19jcl0pCi0jZGVmaW5lIFJQVF9FIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtyZXBlYXRfZW5kX2FkZHJlc3NfY3JdKQotI2RlZmluZSBNT0RfUyAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbbW9kdWxvX3N0YXJ0X2FkZHJlc3NfY3JdKQotI2RlZmluZSBNT0RfRSAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbbW9kdWxvX2VuZF9hZGRyZXNzX2NyXSkKLSNkZWZpbmUgSUJBIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtpbnN0cnVjdGlvbl9icmVha19hZGRyZXNzX2NyXSkKLSNkZWZpbmUgRUlUX1ZCCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2VpdF92ZWN0b3JfYmFzZV9jcl0pCi0jZGVmaW5lIEdQUgkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuZ2VuZXJhbF9wdXJwb3NlKQotI2RlZmluZSBHUFJfQ0xFQVIoTikgKEdQUlsoTildID0gMCkKLSNkZWZpbmUgQUNDCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5hY2N1bXVsYXRvcikKLSNkZWZpbmUgQ1JFRwkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbCkKLSNkZWZpbmUgU1AgICAgICAoR1BSW1NUQUNLX1BPSU5URVJfR1BSXSkKLSNkZWZpbmUgVFJBQ0VfQ0FMTF9QIChTVEFURV9DUFUgKHNkLCAwKS0+dHJhY2VfY2FsbF9wKQotI2RlZmluZSBUUkFDRV9UUkFQX1AgKFNUQVRFX0NQVSAoc2QsIDApLT50cmFjZV90cmFwX3ApCi0jZGVmaW5lIFRSQUNFX0FDVElPTiAoU1RBVEVfQ1BVIChzZCwgMCktPnRyYWNlX2FjdGlvbikKLSNkZWZpbmUgICAgIFRSQUNFX0FDVElPTl9DQUxMCTB4MDAwMDAwMDEJLyogY2FsbCBvY2N1cnJlZCAqLwotI2RlZmluZSAgICAgVFJBQ0VfQUNUSU9OX1JFVFVSTgkweDAwMDAwMDAyCS8qIHJldHVybiBvY2N1cnJlZCAqLwotCi0jZGVmaW5lIFdSSVRFMzIgKFNUQVRFX0NQVSAoc2QsIDApLT53cml0ZTMyKQotI2RlZmluZSBXUklURTMyX05VTQkgKFdSSVRFMzIubnVtKQotI2RlZmluZSBXUklURTMyX1BUUihOKQkgKFdSSVRFMzIucHRyW05dKQotI2RlZmluZSBXUklURTMyX01BU0soTikJIChXUklURTMyLm1hc2tbTl0pCi0jZGVmaW5lIFdSSVRFMzJfVkFMVUUoTikgKFdSSVRFMzIudmFsdWVbTl0pCi0jZGVmaW5lIFdSSVRFMzJfUVVFVUUoUFRSLCBWQUxVRSkgV1JJVEUzMl9RVUVVRV9NQVNLIChQVFIsIFZBTFVFLCAweGZmZmZmZmZmKQotCi0jZGVmaW5lIFdSSVRFMzJfUVVFVUVfTUFTSyhQVFIsIFZBTFVFLCBNQVNLKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBpbnQgX251bSA9IFdSSVRFMzJfTlVNOwkJCQkJCVwKLSAgaWYgKF9udW0gPj0gTUFYX1dSSVRFMzIpCQkJCQkJXAotICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLAkJCVwKLQkJICAgICAgIlRvbyBtYW55IHF1ZXVlZCAzMi1iaXQgd3JpdGVzIik7CQkJXAotICBXUklURTMyX1BUUihfbnVtKSA9IFBUUjsJCQkJCQlcCi0gIFdSSVRFMzJfVkFMVUUoX251bSkgPSBWQUxVRTsJCQkJCQlcCi0gIFdSSVRFMzJfTUFTSyhfbnVtKSA9IE1BU0s7CQkJCQkJXAotICBXUklURTMyX05VTSA9IF9udW0rMTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBESURfVFJBUAkoU1RBVEVfQ1BVIChzZCwgMCktPmRpZF90cmFwKQotCi0jZGVmaW5lIFdSSVRFNjQgKFNUQVRFX0NQVSAoc2QsIDApLT53cml0ZTY0KQotI2RlZmluZSBXUklURTY0X05VTQkgKFdSSVRFNjQubnVtKQotI2RlZmluZSBXUklURTY0X1BUUihOKQkgKFdSSVRFNjQucHRyW05dKQotI2RlZmluZSBXUklURTY0X1ZBTFVFKE4pIChXUklURTY0LnZhbHVlW05dKQotI2RlZmluZSBXUklURTY0X1FVRVVFKFBUUiwgVkFMVUUpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBpbnQgX251bSA9IFdSSVRFNjRfTlVNOwkJCQkJCVwKLSAgaWYgKF9udW0gPj0gTUFYX1dSSVRFNjQpCQkJCQkJXAotICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLAkJCVwKLQkJICAgICAgIlRvbyBtYW55IHF1ZXVlZCA2NC1iaXQgd3JpdGVzIik7CQkJXAotICBXUklURTY0X1BUUihfbnVtKSA9IFBUUjsJCQkJCQlcCi0gIFdSSVRFNjRfVkFMVUUoX251bSkgPSBWQUxVRTsJCQkJCQlcCi0gIFdSSVRFNjRfTlVNID0gX251bSsxOwkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIERQU1dfVkFMSUQJMHhiZjAwNTU1NQotI2RlZmluZSBQU1dfVkFMSUQJMHhiNzAwNTU1NQotI2RlZmluZSBFSVRfVkFMSUQJMHhmZmZmZjAwMAkvKiBGcm9tIHBhZ2UgNy00IG9mIEQzMFYvTVBFRyBhcmNoLiBtYW51YWwgICovCi0jZGVmaW5lIEVJVF9WQl9ERUZBVUxUCTB4ZmZmZmYwMDAJLyogVmFsdWUgb2YgdGhlIEVJVF9WQiByZWdpc3RlciBhZnRlciByZXNldCAqLwotCi0vKiBWZXJpZnkgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIGNvcnJlY3Qgc2xvdCAqLwotCi0jZGVmaW5lIElTX1dST05HX1NMT1QgaXNfd3Jvbmdfc2xvdChzZCwgY2lhLCBNWV9JTkRFWCkKLWV4dGVybiBpbnQgaXNfd3Jvbmdfc2xvdAotKFNJTV9ERVNDIHNkLAotIGFkZHJlc3Nfd29yZCBjaWEsCi0gaXRhYmxlX2luZGV4IGluZGV4KTsKLQotI2RlZmluZSBJU19DT05ESVRJT05fT0sgaXNfY29uZGl0aW9uX29rKHNkLCBjaWEsIENDQykKLWV4dGVybiBpbnQgaXNfY29uZGl0aW9uX29rCi0oU0lNX0RFU0Mgc2QsCi0gYWRkcmVzc193b3JkIGNpYSwKLSBpbnQgY29uZCk7Ci0KLSNkZWZpbmUgU0lNX0hBVkVfQlJFQUtQT0lOVFMJLyogVHVybiBvbiBpbnRlcm5hbCBicmVha3BvaW50IG1vZHVsZSAqLwotCi0vKiBJbnRlcm5hbCBicmVha3BvaW50IGluc3RydWN0aW9uIGlzIHN5c2NhbGwgNSAqLwotI2RlZmluZSBTSU1fQlJFQUtQT0lOVCB7MHgwZSwgMHgwMCwgMHgwMCwgMHgwNX0KLSNkZWZpbmUgU0lNX0JSRUFLUE9JTlRfU0laRSAoNCkKLQotLyogQ2FsbCBvY2N1cnJlZCAqLwotZXh0ZXJuIHZvaWQgY2FsbF9vY2N1cnJlZAotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSBhZGRyZXNzX3dvcmQgY2lhLAotIGFkZHJlc3Nfd29yZCBuaWEpOwotCi0vKiBSZXR1cm4gb2NjdXJyZWQgKi8KLWV4dGVybiB2b2lkIHJldHVybl9vY2N1cnJlZAotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSBhZGRyZXNzX3dvcmQgY2lhLAotIGFkZHJlc3Nfd29yZCBuaWEpOwotCi0vKiBXaGV0aGVyIHRvIGRvIGNhbGwgdHJhY2luZy4gICovCi1leHRlcm4gaW50IGQzMHZfY2FsbF90cmFjZV9wOwotCi0vKiBSZWFkL3dyaXRlIGZ1bmN0aW9ucyBmb3Igc3lzdGVtIGNhbGwgaW50ZXJmYWNlLiAgKi8KLWV4dGVybiBpbnQgZDMwdl9yZWFkX21lbQotKGhvc3RfY2FsbGJhY2sgKmNiLAotIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKLSB1bnNpZ25lZCBsb25nIHRhZGRyLAotIGNoYXIgKmJ1ZiwKLSBpbnQgYnl0ZXMpOwotCi1leHRlcm4gaW50IGQzMHZfd3JpdGVfbWVtCi0oaG9zdF9jYWxsYmFjayAqY2IsCi0gc3RydWN0IGNiX3N5c2NhbGwgKnNjLAotIHVuc2lnbmVkIGxvbmcgdGFkZHIsCi0gY29uc3QgY2hhciAqYnVmLAotIGludCBieXRlcyk7Ci0KLS8qIFByb2Nlc3MgYWxsIG9mIHRoZSBxdWV1ZWQgdXAgd3JpdGVzIGluIG9yZGVyIG5vdyAqLwotdm9pZCB1bnF1ZXVlX3dyaXRlcwotKFNJTV9ERVNDIHNkLAotIHNpbV9jcHUgKmNwdSwKLSBhZGRyZXNzX3dvcmQgY2lhKTsKLQotI2VuZGlmIC8qIF9DUFVfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2QzMHYtaW5zbnMgYi9zaW0vZDMwdi9kMzB2LWluc25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y4MzdjLi4wMDAwMDAwCi0tLSBhL3NpbS9kMzB2L2QzMHYtaW5zbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDI0ICswLDAgQEAKLS8vICAtKi0gQyAtKi0KLS8vICBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgotLy8gIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0vLyAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucyBJbmMuCi0vLwotLy8gIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLS8vCi0vLyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLS8vICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotLy8gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0vLyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vCi0vLyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0vLyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS8vICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0vLyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS8vCi0vLyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLS8vICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotLy8gIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0vLwotCi0KLWRlZmluZSggX0JSQSwgIGAxLiosQ0NDLDAwMCcpCi1kZWZpbmUoIF9MT0dJQywgYDEuKixDQ0MsMDAxJykKLWRlZmluZSggX0lNRU0sIGAxLiosQ0NDLDAxMCcpCi1kZWZpbmUoIF9JQUxVMSwgYDEuKixDQ0MsMTAwJykKLWRlZmluZShfSUFMVTIsIGAxLiosQ0NDLDEwMScpCi0KLQotCi1kZWZpbmUoX0lNTTYsIGA2LklNTV82UycpCi1kZWZpbmUoX0lNTTEyLCBgMTIuSU1NXzEyUycpCi1kZWZpbmUoX0lNTTE4LCBgMTguSU1NXzE4UycpCi1kZWZpbmUoX0lNTTMyLCBgNi5JTU1fNkwsKiwwMDAsOC5JTU1fOEwsMDAsMTguSU1NXzE4TCcpCi0KLQotCi0vLyBUaGUgZm9sbG93aW5nIGlzIGNhbGxlZCB3aGVuIGV2ZXIgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpcwotLy8gZW5jb3VudGVyZWQKLTo6aW50ZXJuYWw6OmlsbGVnYWwKLQlzaW1faW9fZXByaW50ZiAoc2QsICJpbGxlZ2FsIGluc3RydWN0aW9uIGF0IDB4JWx4XG4iLCAobG9uZykgY2lhKTsKLQlzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwgc2ltX3NpZ25hbGxlZCwgU0lNX1NJR0lMTCk7Ci0KLS8vIFRoZSBmb2xsb3dpbmcgaXMgY2FsbGVkIHdoZW4gZXZlciBhbiBpbnN0cnVjdGlvbiBpbiB0aGUgd3JvbmcKLS8vIHNsb3QgaXMgZW5jb3VudGVyZWQuCi06OmludGVybmFsOjp3cm9uZ19zbG90Ci0Jc2ltX2lvX2VwcmludGYgKHNkLCAid3Jvbmcgc2xvdCBhdCAweCVseFxuIiwgKGxvbmcpIGNpYSk7Ci0Jc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBjaWEsIHNpbV9zaWduYWxsZWQsIFNJTV9TSUdJTEwpOwotCi0KLQotLy8gU29tZXRoaW5nIGlsbGVnYWwgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250YWN0IHRoZSBzaW11bGF0b3IgZW11bAotLy8gbGlicmFyeS4KLWRlZmluZShfRU1VTCwgYDEuKixDQ0MsMTExJykKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2VtdWw6aW50IGltbQotCS8qIHRlbXAgaGFjayAtIGxhdGVyIHJlcGxhY2Ugd2l0aCByZWFsIGludGVyZmFjZSAqLwotCWVudW0gewotCSAgcGFyYW0xID0gMiwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNAotCX07Ci0Jc3dpdGNoIChpbW0pIHsKLQljYXNlIDA6Ci0JICB7Ci0JICAgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgIlVOSVggY2FsbCBlbXVsYXRpb24gdW5zdXBwb3J0ZWQiKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAxOgotCSAgLyogVHJhcCAxIC0gcHJpbnRzIGEgc3RyaW5nICovCi0JICB7Ci0JICAgIGFkZHJlc3Nfd29yZCBzdHIgPSBHUFJbcGFyYW0xXTsKLQkgICAgY2hhciBjaHI7Ci0JICAgIHdoaWxlICgxKSB7Ci0JICAgICAgY2hyID0gTUVNICh1bnNpZ25lZCwgc3RyLCAxKTsKLQkgICAgaWYgKGNociA9PSAnXDAnKSBicmVhazsKLQkgICAgICBzaW1faW9fd3JpdGVfc3Rkb3V0IChzZCwgJmNociwgc2l6ZW9mIGNocik7Ci0JICAgICAgc3RyKys7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAzOgotCSAgLyogVHJhcCAzIC0gd3JpdGVzIGEgY2hhcmFjdGVyICovCi0JICB7Ci0JICAgIGNoYXIgY2hyID0gR1BSW3BhcmFtMV07Ci0JICAgIHNpbV9pb193cml0ZV9zdGRvdXQgKHNkLCAmY2hyLCBzaXplb2YgY2hyKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSA0OgotCSAgLyogVHJhcCA0IGV4aXRzIHdpdGggc3RhdHVzIGluIFtwYXJhbTFdICovCi0JICB7Ci0JICAgIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fZXhpdGVkLCBHUFJbcGFyYW0xXSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgNToKLQkgIC8qIFRyYXAgNSBicmVha3BvaW50cy4gIElmIHRoZSBicmVha3BvaW50IHN5c3RlbSBrbm93cyBhYm91dCB0aGlzLCBpdAotCSAgICAgd29uJ3QgcmV0dXJuLiAgT3RoZXJ3aXNlLCB3ZSBmYWxsIHRocm91Z2ggdG8gdHJlYXQgdGhpcyBhcyBhbgotCSAgICAgdW5rbm93biBpbnN0cnVjdGlvbi4gICovCi0JICB7Ci0JICAgIHNpbV9oYW5kbGVfYnJlYWtwb2ludCAoU0QsIENQVSwgY2lhKTsKLQkgIC8qIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IGNhc2UuKi8KLQkgIH0KLQlkZWZhdWx0OgotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiVW5rbm93biBtb25pdG9yIGNhbGwgJWQiLCBpbW0pOwotCX0KLQotX0VNVUwsMDAwMDAsMDAsNi4qLDYuKixJTU1fNlM6RU1VTDpzaG9ydCxlbXVsOml1LG11OkVNVUwKLSJzeXNjYWxsIDxpbW0+IgotCWRvX2VtdWwgKF9TRCwgaW1tKTsKLV9CUkEsMDAwMDAsMDAsNi4qKiw2LioqLF9JTU0zMjpCUkE6bG9uZzppdSxtdTpFTVVMIGxvbmcKLSJzeXNjYWxsIDxpbW0+IgotCWRvX2VtdWwgKF9TRCwgaW1tKTsKLQotLy8gQUJTCi0KLV9JQUxVMSwwMTAwMCwwMCw2LlJBLDYuUkIsNi4qKjpJQUxVMTpzaG9ydDppdSxtdTpBQlMKLSJhYnMgcjxSQT4sIHI8UkI+IgotCVdSSVRFMzJfUVVFVUUgKFJhLCBhYnMoUmIpKTsKLQotCi0KLS8vIEFERAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fYWRkOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIGltbQotCUFMVV9CRUdJTihyYik7Ci0JQUxVX0FEREMoaW1tKTsKLQlBTFVfRU5EKHJhKTsKLQotX0lBTFUxLDAwMDAwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFERAotImFkZCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2FkZCAoX1NELCBSYSwgUmIsIFJjKTsKLV9JQUxVMSwwMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QUREIGltbQotImFkZCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZCAoX1NELCBSYSwgUmIsIGltbSk7Ci1fSUFMVTEsMDAwMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFERCBpbW0gbG9uZwotImFkZCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZCAoX1NELCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBBREQySAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fYWRkMmg6c2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgaW1tCi0JdW5zaWduZWQxNiBhaDIgPSBWSDJfNChyYikgKyBWSDJfNChpbW0pOwotCXVuc2lnbmVkMTYgYWwyID0gVkwyXzQocmIpICsgVkwyXzQoaW1tKTsKLQlXUklURTMyX1FVRVVFIChyYSwgKGFoMiA8PCAxNikgfCBhbDIpOwotCi1fSUFMVTEsMDAwMDEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QUREMkgKLSJhZGQyaCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2FkZDJoIChfU0QsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDAwMDAxLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpBREQySCBpbW0KLSJhZGQyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZDJoIChfU0QsIFJhLCBSYiwgaW1tSEwpOwotX0lBTFUxLDAwMDAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpBREQySCBpbW0gbG9uZwotImFkZDJoIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fYWRkMmggKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gQUREQwotCi12b2lkOjpmdW5jdGlvbjo6ZG9fYWRkYzp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KLQlBTFVfQkVHSU4ocmIpOwotCUFMVV9BRERDX0MoaW1tLCBBTFVfQ0FSUlkpOwotCUFMVV9FTkQocmEpOwotCi1fSUFMVTEsMDAxMDAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QUREQwotImFkZGMgcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19hZGRjIChfU0QsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDAwMTAwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpBRERDIGltbQotImFkZGMgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19hZGRjIChfU0QsIFJhLCBSYiwgaW1tKTsKLV9JQUxVMSwwMDEwMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6QUREQyBpbW0gbG9uZwotImFkZGMgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19hZGRjIChfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLS8vIEFEREhwcHAKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2FkZGhfcHBwOmludCBwcHAsIHVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCXN3aXRjaCAocHBwKSB7Ci0JY2FzZSAweDA6IC8qIExMTCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkwyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDE6IC8qIExMSCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkgyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDI6IC8qIExITCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkwyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDM6IC8qIExISCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkgyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDQ6IC8qIEhMTCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkwyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDU6IC8qIEhMSCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkgyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDY6IC8qIEhITCAqLwotCSAgewotCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKLQkgIEFMVTE2X0FEREMoVkwyXzQoc3JjKSk7Ci0JICBBTFUxNl9FTkQocmEsIDEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDc6IC8qIEhISCAqLwotCSAgewkKLQkgIEFMVTE2X0JFR0lOKFZIMl80KHJiKSk7Ci0JICBBTFUxNl9BRERDKFZIMl80KHNyYykpOwotCSAgQUxVMTZfRU5EKHJhLCAxKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJkb19hZGRoX3BwcCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOwotCX0KLTo6JXM6OnBwcDppbnQgcHBwCi0Jc3dpdGNoIChwcHApCi0JICB7Ci0JICBjYXNlIDB4MDogcmV0dXJuICJsbGwiOwotCSAgY2FzZSAweDE6IHJldHVybiAibGxoIjsKLQkgIGNhc2UgMHgyOiByZXR1cm4gImxobCI7Ci0JICBjYXNlIDB4MzogcmV0dXJuICJsaGgiOwotCSAgY2FzZSAweDQ6IHJldHVybiAiaGxsIjsKLQkgIGNhc2UgMHg1OiByZXR1cm4gImhsaCI7Ci0JICBjYXNlIDB4NjogcmV0dXJuICJoaGwiOwotCSAgY2FzZSAweDc6IHJldHVybiAiaGhoIjsKLQkgIGRlZmF1bHQ6IHJldHVybiAiPyI7Ci0JICB9Ci0KLV9JQUxVMSwxMCxwcHAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QURESHBwcAotImFkZGglczxwcHA+IHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fYWRkaF9wcHAoX1NELCBwcHAsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDEwLHBwcCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QURESHBwcCBpbW0KLSJhZGRoJXM8cHBwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZGhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIGltbUhMKTsKLV9JQUxVMSwxMCxwcHAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFEREhwcHAgaW1tIGxvbmcKLSJhZGRoJXM8cHBwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZGhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBBRERTCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19hZGRzOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIGltbQotCUFMVV9CRUdJTihyYik7Ci0JQUxVX0FEREMoRVhUUkFDVEVEMzIoaW1tLCAwLCAwKSk7Ci0JQUxVX0VORChyYSk7Ci0KLV9JQUxVMSwwMDExMCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpBRERTCi0iYWRkcyByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2FkZHMgKF9TRCwgUmEsIFJiLCBSYyk7Ci1fSUFMVTEsMDAxMTAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkFERFMgaW1tCi0iYWRkcyByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZHMgKF9TRCwgUmEsIFJiLCBpbW0pOwotX0lBTFUxLDAwMTEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpBRERTIGltbSBsb25nCi0iYWRkcyByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZHMgKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gQUREUzJICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19hZGRzMmg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tSEwKLQl1bnNpZ25lZDE2IGhpZ2ggPSBWSDJfNChyYikgKyBFWFRSQUNURUQzMihpbW1ITCwgMCwgMCk7Ci0JdW5zaWduZWQxNiBsb3cgPSBWTDJfNChyYikgKyBFWFRSQUNURUQzMihpbW1ITCwgMTYsIDE2KTsKLQlXUklURTMyX1FVRVVFIChyYSwgKGhpZ2ggPDwgMTYpIHwgbG93KTsKLQotX0lBTFUxLDAwMTExLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFERFMySAotImFkZHMyaCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2FkZHMyaCAoX1NELCBSYSwgUmIsIFJjKTsKLV9JQUxVMSwwMDExMSwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QUREUzJIIGltbQotImFkZHMyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2FkZHMyaCAoX1NELCBSYSwgUmIsIGltbUhMKTsKLV9JQUxVMSwwMDExMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6QUREUzJIIGltbSBsb25nCi0iYWRkczJoIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fYWRkczJoIChfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLS8vIEFORAotCi1fTE9HSUMsMTEwMDAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6QU5ECi0iYW5kIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiICYgUmMpOwotX0xPR0lDLDExMDAwLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpBTkQgaW1tCi0iYW5kIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiICYgaW1tKTsKLV9MT0dJQywxMTAwMCwxMCw2LlJBLDYuUkIsX0lNTTMyOkxPR0lDOmxvbmc6aXUsbXU6QU5EIGltbSBsb25nCi0iYW5kIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiICYgaW1tKTsKLQotCi0vLyBBTkRGRwotCi1fTE9HSUMsMDEwMDAsMDAsKioqLDMuRkEsKioqLDMuRkIsKioqLDMuRkM6TE9HSUM6c2hvcnQ6aXUsbXU6TG9naWNhbCBBTkQgRmxhZ3MKLSJhbmRmZyBmPEZBPiwgZjxGQj4sIGY8RkM+IgotCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgUFNXX0ZMQUdfVkFMKEZCKSAmIFBTV19GTEFHX1ZBTChGQykpOwotX0xPR0lDLDAxMDAwLDEwLCoqKiwzLkZBLCoqKiwzLkZCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OkxvZ2ljYWwgQU5EIEZsYWdzIGltbQotImFuZGZnIGY8RkE+LCBmPEZCPiwgPGltbV82PiIKLQlQU1dfRkxBR19TRVRfUVVFVUUoRkEsIFBTV19GTEFHX1ZBTChGQikgJiAoaW1tXzYgJiAxKSk7Ci0KLQotCi0vLyBBVkcKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2F2Zzp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KLQlXUklURTMyX1FVRVVFIChyYSwgKChzaWduZWQ2NCkoc2lnbmVkMzIpcmIgKyAoc2lnbmVkNjQpKHNpZ25lZDMyKWltbSArIDEpID4+IDEpOwotCi1fSUFMVTEsMDEwMTAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QVZHCi0iYXZnIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fYXZnIChfU0QsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDAxMDEwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpBVkcgaW1tCi0iYXZnIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fYXZnIChfU0QsIFJhLCBSYiwgaW1tKTsKLV9JQUxVMSwwMTAxMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6QVZHIGltbSBsb25nCi0iYXZnIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fYXZnIChfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLS8vIEFWRzJICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19hdmcyaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KLQl1bnNpZ25lZDE2IGhpZ2ggPSAoKHNpZ25lZDMyKShzaWduZWQxNilWSDJfNChyYikgKyAoc2lnbmVkMzIpKHNpZ25lZDE2KVZIMl80KGltbSkgKyAxKSA+PiAxOwotCXVuc2lnbmVkMTYgbG93ICA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KVZMMl80KHJiKSArIChzaWduZWQzMikoc2lnbmVkMTYpVkwyXzQoaW1tKSArIDEpID4+IDE7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIChoaWdoIDw8IDE2KSB8IGxvdyk7Ci0KLV9JQUxVMSwwMTAxMSwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpBVkcySAotImF2ZzJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fYXZnMmggKF9TRCwgUmEsIFJiLCBSYyk7Ci1fSUFMVTEsMDEwMTEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkFWRzJIIGltbQotImF2ZzJoIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fYXZnMmggKF9TRCwgUmEsIFJiLCBpbW1ITCk7Ci1fSUFMVTEsMDEwMTEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFWRzJIIGltbSBsb25nCi0iYXZnMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19hdmcyaCAoX1NELCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBCQ0xSCi0KLV9MT0dJQywwMDAxMSwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpCQ0xSCi0iYmNsciByPFJBPiwgcjxSQj4sIHI8UkM+IgotCVdSSVRFMzJfUVVFVUUoUmEsIFJiICYgfkJJVDMyKChSYykgJSAzMikpOwotX0xPR0lDLDAwMDExLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpCQ0xSIGltbQotImJjbHIgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlXUklURTMyX1FVRVVFKFJhLCBSYiAmIH5CSVQzMigoaW1tKSAlIDMyKSk7Ci0KLQotCi0vLyBCTk9UCi0KLV9MT0dJQywwMDAwMSwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpCTk9UCi0iYm5vdCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiBeIEJJVDMyKChSYykgJSAzMikpOwotX0xPR0lDLDAwMDAxLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpCTk9UIGltbQotImJub3QgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlXUklURTMyX1FVRVVFIChSYSwgUmIgXiBCSVQzMigoaW1tKSAlIDMyKSk7Ci0KLQotCi0vLyBCUkEKLQotX0JSQSwwMDAwMCwwMCw2LioqLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6QlJBCi0iYnJhIHI8UkM+IgotCW5pYSA9IGNpYSArIHBjZGlzcDsKLV9CUkEsMDAwMDAsMTAsX0lNTTE4OkJSQTpzaG9ydDptdTpCUkEgaW1tCi0iYnJhIDxwY2Rpc3A+IgotCW5pYSA9IGNpYSArIHBjZGlzcDsKLV9CUkEsMDAwMDAsMTAsNi4qKiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpCUkEgaW1tIGxvbmcKLSJicmEgPHBjZGlzcD4iCi0JbmlhID0gY2lhICsgcGNkaXNwOwotCi0KLQotLy8gQlJBVE5aCi0KLV9CUkEsMDAxMDAsMDEsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkJSQVROWgotImJyYXRueiByPFJDPiIKLQlpZiAoKlJhICE9IDApCi0JICBuaWEgPSBjaWEgKyBwY2Rpc3A7Ci1fQlJBLDAwMTAwLDExLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpCUkFUTlogaW1tCi0iYnJhdG56IDxwY2Rpc3A+IgotCWlmICgqUmEgIT0gMCkKLQkgIG5pYSA9IGNpYSArIHBjZGlzcDsKLV9CUkEsMDAxMDAsMTEsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpCUkFUTlogaW1tIGxvbmcKLSJicmF0bnogPHBjZGlzcD4iCi0JaWYgKCpSYSAhPSAwKQotCSAgbmlhID0gY2lhICsgcGNkaXNwOwotCi0KLQotLy8gQlJBVFpSCi0KLV9CUkEsMDAxMDAsMDAsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkJSQVRaUgotImJyYXR6ciByPFJDPiIKLQlpZiAodmFsX1JhID09IDApCi0JICBuaWEgPSBjaWEgKyBwY2Rpc3A7Ci1fQlJBLDAwMTAwLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpCUkFUWlIgaW1tCi0iYnJhdHpyIDxwY2Rpc3A+IgotCWlmICh2YWxfUmEgPT0gMCkKLQkgIG5pYSA9IGNpYSArIHBjZGlzcDsKLV9CUkEsMDAxMDAsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpCUkFUWlIgaW1tIGxvbmcKLSJicmF0enIgPHBjZGlzcD4iCi0JaWYgKHZhbF9SYSA9PSAwKQotCSAgbmlhID0gY2lhICsgcGNkaXNwOwotCi0KLQotLy8gQlNFVAotCi1fTE9HSUMsMDAwMTAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6QlNFVAotImJzZXQgcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlXUklURTMyX1FVRVVFIChSYSwgUmIgfCBCSVQzMigoUmMpICUgMzIpKTsKLV9MT0dJQywwMDAxMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6QlNFVCBpbW0KLSJic2V0IHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiIHwgQklUMzIoKGltbSkgJSAzMikpOwotCi0KLQotLy8gQlNSCi0KLV9CUkEsMDAwMTAsMDAsNi4qKiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkJTUgotImJzciByPFJDPiIKLQlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCWVsc2UKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQluaWEgPSBjaWEgKyBwY2Rpc3A7Ci0JaWYgKFRSQUNFX0NBTExfUCkKLQkgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLV9CUkEsMDAwMTAsMTAsX0lNTTE4OkJSQTpzaG9ydDptdTpCU1IgaW1tCi0iYnNyIDxwY2Rpc3A+IgotCWlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JZWxzZQotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOwotCW5pYSA9IGNpYSArIHBjZGlzcDsKLQlpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOwotX0JSQSwwMDAxMCwxMCw2LioqLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkJTUiBpbW0gbG9uZwotImJzciA8cGNkaXNwPiIKLQlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCWVsc2UKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQluaWEgPSBjaWEgKyBwY2Rpc3A7Ci0JaWYgKFRSQUNFX0NBTExfUCkKLQkgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQotCi0vLyBCU1JUTloKLQotX0JSQSwwMDExMCwwMSw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6QlNSVE5aCi0iYnNydG56IHI8UkM+IgotCWlmICh2YWxfUmEgIT0gMCkgewotCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCSAgZWxzZQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JICBuaWEgPSBjaWEgKyBwY2Rpc3A7Ci0JICBpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JfQotCi1fQlJBLDAwMTEwLDExLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpCU1JUTlogaW1tCi0iYnNydG56IDxwY2Rpc3A+IgotCWlmICh2YWxfUmEgIT0gMCkgewotCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCSAgZWxzZQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JICBuaWEgPSBjaWEgKyBwY2Rpc3A7Ci0JICBpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JfQotCi1fQlJBLDAwMTEwLDExLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6QlNSVE5aIGltbSBsb25nCi0iYnNydG56IDxwY2Rpc3A+IgotCWlmICh2YWxfUmEgIT0gMCkgewotCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCSAgZWxzZQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JICBuaWEgPSBjaWEgKyBwY2Rpc3A7Ci0JICBpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JfQotCi0KLS8vIEJTUlRaUgotCi1fQlJBLDAwMTEwLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpCU1JUWlIKLSJic3J0enIgcjxSQz4iCi0JaWYgKHZhbF9SYSA9PSAwKSB7Ci0JICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JICBlbHNlCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQkgIG5pYSA9IGNpYSArIHBjZGlzcDsKLQkgIGlmIChUUkFDRV9DQUxMX1ApCi0JICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQl9Ci0KLV9CUkEsMDAxMTAsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkJTUlRaUiBpbW0KLSJic3J0enIgPHBjZGlzcD4iCi0JaWYgKHZhbF9SYSA9PSAwKSB7Ci0JICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JICBlbHNlCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQkgIG5pYSA9IGNpYSArIHBjZGlzcDsKLQkgIGlmIChUUkFDRV9DQUxMX1ApCi0JICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQl9Ci0KLV9CUkEsMDAxMTAsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpCU1JUWlIgaW1tIGxvbmcKLSJic3J0enIgPHBjZGlzcD4iCi0JaWYgKHZhbF9SYSA9PSAwKSB7Ci0JICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JICBlbHNlCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQkgIG5pYSA9IGNpYSArIHBjZGlzcDsKLQkgIGlmIChUUkFDRV9DQUxMX1ApCi0JICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQl9Ci0KLQotLy8gQlRTVAotCi1fTE9HSUMsMDAwMDAsMDAsKioqLDMuRkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OkJUU1QKLSJidHN0IGY8RkE+LCByPFJCPiwgcjxSQz4iCi0JaW50IGJpdCA9IChSYykgJSAzMjsKLQlQU1dfRkxBR19TRVRfUVVFVUUoRkEsIE1BU0tFRDMyKFJiLCBiaXQsIGJpdCkpOwotX0xPR0lDLDAwMDAwLDEwLCoqKiwzLkZBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6QlRTVCBpbW0KLSJidHN0IGY8RkE+LCByPFJCPiwgPGltbT4iCi0JaW50IGJpdCA9IGltbSAlIDMyOwotCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgTUFTS0VEMzIoUmIsIGJpdCwgYml0KSk7Ci0KLQotCi0vLyBDTVBjYwotCi12b2lkOjpmdW5jdGlvbjo6ZG9fY21wX2NjOmludCBjYywgaW50IGZhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgcmMKLQlpbnQgdmFsdWUgPSAwOwotCXN3aXRjaCAoY2MpIHsKLQljYXNlIDA6IC8qIEVRICovCi0JICB2YWx1ZSA9IChyYiA9PSByYyk7Ci0JICBicmVhazsKLQljYXNlIDE6IC8qIE5FICovCi0JICB2YWx1ZSA9IChyYiAhPSByYyk7Ci0JICBicmVhazsKLQljYXNlIDI6IC8qIEdUICovCi0JICB2YWx1ZSA9IChyYiA+IHJjKTsKLQkgIGJyZWFrOwotCWNhc2UgMzogLyogR0UgKi8KLQkgIHZhbHVlID0gKHJiID49IHJjKTsKLQkgIGJyZWFrOwotCWNhc2UgNDogLyogTFQgKi8KLQkgIHZhbHVlID0gKHJiIDwgcmMpOwotCSAgYnJlYWs7Ci0JY2FzZSA1OiAvKiBMRSAqLwotCSAgdmFsdWUgPSAocmIgPD0gcmMpOwotCSAgYnJlYWs7Ci0JY2FzZSA2OiAvKiBQUyAqLwotCSAgdmFsdWUgPSAoKHJiID49IDApICYmIChyYyA+PSAwKSk7Ci0JICBicmVhazsKLQljYXNlIDc6IC8qIE5HICovCi0JICB2YWx1ZSA9ICgocmIgPCAwKSAmJiAocmMgPCAwKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiZG9fY21wX2NjIC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoICglZCkiLCBjYyk7Ci0JfQotCVBTV19GTEFHX1NFVF9RVUVVRShmYSwgdmFsdWUpOwotCi06OiVzOjpjY2M6aW50IGNjYwotCXN3aXRjaCAoY2NjKQotCSAgewotCSAgY2FzZSAwOiByZXR1cm4gImVxIjsKLQkgIGNhc2UgMTogcmV0dXJuICJuZSI7Ci0JICBjYXNlIDI6IHJldHVybiAiZ3QiOwotCSAgY2FzZSAzOiByZXR1cm4gImdlIjsKLQkgIGNhc2UgNDogcmV0dXJuICJsdCI7Ci0JICBjYXNlIDU6IHJldHVybiAibGUiOwotCSAgY2FzZSA2OiByZXR1cm4gInBzIjsKLQkgIGNhc2UgNzogcmV0dXJuICJuZyI7Ci0JICBkZWZhdWx0OiByZXR1cm4gIj8iOwotCSAgfQotCi1fTE9HSUMsMDExMDAsMDAsY2NjLDMuRkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OkNNUGNjCi0iY21wJXM8Y2NjPiBmPEZBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2NtcF9jYyhfU0QsIGNjYywgRkEsIFJiLCBSYyk7Ci1fTE9HSUMsMDExMDAsMTAsY2NjLDMuRkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpDTVBjYyBpbW0KLSJjbXAlczxjY2M+IGY8RkE+LCByPFJCPiwgPGltbT4iCi0JZG9fY21wX2NjKF9TRCwgY2NjLCBGQSwgUmIsIGltbSk7Ci1fTE9HSUMsMDExMDAsMTAsY2NjLDMuRkEsNi5SQixfSU1NMzI6TE9HSUM6bG9uZzppdSxtdTpDTVBjYyBpbW0gbG9uZwotImNtcCVzPGNjYz4gZjxGQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19jbXBfY2MoX1NELCBjY2MsIEZBLCBSYiwgaW1tKTsKLQotCi0KLS8vIENNUFVjYwotCi12b2lkOjpmdW5jdGlvbjo6ZG9fY21wdV9jYzppbnQgY2MsIGludCBmYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiByYwotCWludCB2YWx1ZSA9IDA7Ci0Jc3dpdGNoIChjYykgewotCWNhc2UgMjogLyogR1QgKi8KLQkgIHZhbHVlID0gKHJiID4gcmMpOwotCSAgYnJlYWs7Ci0JY2FzZSAzOiAvKiBHRSAqLwotCSAgdmFsdWUgPSAocmIgPj0gcmMpOwotCSAgYnJlYWs7Ci0JY2FzZSA0OiAvKiBMVCAqLwotCSAgdmFsdWUgPSAocmIgPCByYyk7Ci0JICBicmVhazsKLQljYXNlIDU6IC8qIExFICovCi0JICB2YWx1ZSA9IChyYiA8PSByYyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiZG9fY21wdV9jYyAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCAoJWQpIiwgY2MpOwotCX0KLQlQU1dfRkxBR19TRVRfUVVFVUUoZmEsIHZhbHVlKTsKLQotX0xPR0lDLDAxMTAxLDAwLGNjYywzLkZBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpDTVBVY2MKLSJjbXB1JXM8Y2NjPiBmPEZBPiwgcjxSQj4sIHI8UkM+IgotCWRvX2NtcHVfY2MoX1NELCBjY2MsIEZBLCBSYiwgUmMpOwotX0xPR0lDLDAxMTAxLDEwLGNjYywzLkZBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6Q01QVWNjIGltbQotImNtcHUlczxjY2M+IGY8RkE+LCByPFJCPiwgPGltbT4iCi0JZG9fY21wdV9jYyhfU0QsIGNjYywgRkEsIFJiLCBpbW1fNnUpOwotX0xPR0lDLDAxMTAxLDEwLGNjYywzLkZBLDYuUkIsX0lNTTMyOkxPR0lDOmxvbmc6aXUsbXU6Q01QVWNjIGltbSBsb25nCi0iY21wdSVzPGNjYz4gZjxGQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19jbXB1X2NjKF9TRCwgY2NjLCBGQSwgUmIsIGltbSk7Ci0KLQotCi0vLyBEQlJBCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19kYnJhOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgcmEKLQlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBjaWEgKyBwY2Rpc3ApOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgKHJhICYgfjB4NykpOwotCi1fQlJBLDEwMDAwLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpEQlJBCi0iZGJyYSByPFJBPiwgcjxSQz4iCi0JZG9fZGJyYShfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLV9CUkEsMTAwMDAsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkRCUkEgaW1tCi0iZGJyYSByPFJBPiwgPHBjZGlzcD4iCi0JZG9fZGJyYShfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLV9CUkEsMTAwMDAsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpEQlJBIGltbSBsb25nCi0iZGJyYSByPFJBPiwgPHBjZGlzcD4iCi0JZG9fZGJyYShfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLQotCi0KLS8vIERCUkFJCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19kYnJhaTphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIGltbQotCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX1MsIGNpYSArIHBjZGlzcCk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAoaW1tIDw8IDMpKTsKLQotX0JSQSwxMDEwMCwwMCw2LklNTV82LDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6REJSQUkKLSJkYnJhaSA8SU1NXzY+LCByPFJDPiIKLQlkb19kYnJhaShfU0QsIHBjZGlzcCwgSU1NXzYpOwotX0JSQSwxMDEwMCwxMCw2LklNTV82LF9JTU0xMjpCUkE6c2hvcnQ6bXU6REJSQUkgaW1tCi0iZGJyYWkgPElNTV82PiwgPHBjZGlzcD4iCi0JZG9fZGJyYWkoX1NELCBwY2Rpc3AsIElNTV82KTsKLV9CUkEsMTAxMDAsMTAsNi5JTU1fNiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpEQlJBSSBpbW0gbG9uZwotImRicmFpIDxJTU1fNj4sIDxwY2Rpc3A+IgotCWRvX2RicmFpKF9TRCwgcGNkaXNwLCBJTU1fNik7Ci0KLQotCi0vLyBEQlNSCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19kYnNyOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgcmEKLQlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBjaWEgKyBwY2Rpc3ApOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgcmEpOwotCVdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyByYSArIDgpOwotCi1fQlJBLDEwMDEwLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpEQlNSCi0iZGJzciByPFJBPiwgcjxSQz4iCi0JZG9fZGJzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLV9CUkEsMTAwMTAsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkRCU1IgaW1tCi0iZGJzciByPFJBPiwgPHBjZGlzcD4iCi0JZG9fZGJzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLV9CUkEsMTAwMTAsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpEQlNSIGltbSBsb25nCi0iZGJzciByPFJBPiwgPHBjZGlzcD4iCi0JZG9fZGJzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKLQotCi0KLS8vIERCU1JJCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19kYnNyaTphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIGltbQotCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX1MsIGNpYSArIHBjZGlzcCk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAoaW1tIDw8IDMpKTsKLQlXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgKGltbSA8PCAzKSArIDgpOwotCi1fQlJBLDEwMTEwLDAwLDYuSU1NXzYsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpEQlNSSQotImRic3JpIDxJTU1fNj4sIHI8UkM+IgotCWRvX2Ric3JpKF9TRCwgcGNkaXNwLCBJTU1fNik7Ci1fQlJBLDEwMTEwLDEwLDYuSU1NXzYsX0lNTTEyOkJSQTpzaG9ydDptdTpEQlNSSSBpbW0KLSJkYnNyaSA8SU1NXzY+LCA8cGNkaXNwPiIKLQlkb19kYnNyaShfU0QsIHBjZGlzcCwgSU1NXzYpOwotX0JSQSwxMDExMCwxMCw2LklNTV82LDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkRCU1JJIGltbSBsb25nCi0iZGJzcmkgPElNTV82PiwgPHBjZGlzcD4iCi0JZG9fZGJzcmkoX1NELCBwY2Rpc3AsIElNTV82KTsKLQotCi0KLS8vIERCVAotCi0KLV9CUkEsMDEwMTEsMDAsNi4qKiw2LioqLDYuKio6QlJBOnNob3J0Om11OkRCVAotImRidCIKLQlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICB7Ci0JICAgIFdSSVRFMzJfUVVFVUUgKCZEUEMsIFJQVF9TKTsKLQkgICAgaWYgKFJQVF9DID09IDApCi0JICAgICAgUFNXX1NFVCAoUFNXX1JQLCAwKTsKLQkgIH0KLQllbHNlCi0JICBXUklURTMyX1FVRVVFICgmRFBDLCBjaWEgKyA4KTsKLQlESURfVFJBUCA9IDI7Ci0JbmlhID0gMHhmZmZmZjEyMDsgLyogZGVidWdfdHJhcF9hZGRyZXNzICovCi0KLS8vIERKTVAKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2RqbXA6YWRkcmVzc193b3JkIHBjZGlzcCwgdW5zaWduZWQzMiByYQotCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX1MsIHBjZGlzcCk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAocmEgJiB+MHg3KSk7Ci0KLV9CUkEsMTAwMDEsMDAsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkRKTVAKLSJkam1wIHI8UkE+LCByPFJDPiIKLQlkb19kam1wKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotX0JSQSwxMDAwMSwxMCw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6REpNUCBpbW0KLSJkam1wIHI8UkE+LCA8cGNkaXNwPiIKLQlkb19kam1wKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotX0JSQSwxMDAwMSwxMCw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkRKTVAgaW1tIGxvbmcKLSJkam1wIHI8UkE+LCA8cGNkaXNwPiIKLQlkb19kam1wKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotCi0KLQotLy8gREpNUEkKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2RqbXBpOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgaW1tCi0JUFNXX1NFVF9RVUVVRSAoUFNXX1JQLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX0MsIDEpOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfUywgcGNkaXNwKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX0UsIGNpYSArIChpbW0gPDwgMykpOwotCi1fQlJBLDEwMTAxLDAwLDYuSU1NXzYsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpESk1QSQotImRqbXBpIDxJTU1fNj4sIHI8UkM+IgotCWRvX2RqbXBpKF9TRCwgcGNkaXNwLCBJTU1fNik7Ci1fQlJBLDEwMTAxLDEwLDYuSU1NXzYsX0lNTTEyOkJSQTpzaG9ydDptdTpESk1QSSBpbW0KLSJkam1waSA8SU1NXzY+LCA8cGNkaXNwPiIKLQlkb19kam1waShfU0QsIHBjZGlzcCwgSU1NXzYpOwotX0JSQSwxMDEwMSwxMCw2LklNTV82LDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkRKTVBJIGltbSBsb25nCi0iZGptcGkgPElNTV82PiwgPHBjZGlzcD4iCi0JZG9fZGptcGkoX1NELCBwY2Rpc3AsIElNTV82KTsKLQotCi0KLS8vIERKU1IKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2Rqc3I6YWRkcmVzc193b3JkIHBjZGlzcCwgdW5zaWduZWQzMiByYQotCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX1MsIHBjZGlzcCk7Ci0JV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAocmEgJiB+MHg3KSk7Ci0JV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIChyYSAmIH4weDcpICsgOCk7Ci0KLV9CUkEsMTAwMTEsMDAsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkRKU1IKLSJkanNyIHI8UkE+LCByPFJDPiIKLQlkb19kanNyKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotX0JSQSwxMDAxMSwxMCw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6REpTUiBpbW0KLSJkanNyIHI8UkE+LCA8cGNkaXNwPiIKLQlkb19kanNyKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotX0JSQSwxMDAxMSwxMCw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkRKU1IgaW1tIGxvbmcKLSJkanNyIHI8UkE+LCA8cGNkaXNwPiIKLQlkb19kanNyKF9TRCwgcGNkaXNwLCB2YWxfUmEpOwotCi0KLQotLy8gREpTUkkKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2Rqc3JpOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgaW1tCi0JUFNXX1NFVF9RVUVVRSAoUFNXX1JQLCAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX0MsIDEpOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfUywgcGNkaXNwKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX0UsIGNpYSArIChpbW0gPDwgMykpOwotCVdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyAoaW1tIDw8IDMpICsgOCk7Ci0KLV9CUkEsMTAxMTEsMDAsNi5JTU1fNiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkRKU1JJCi0iZGpzcmkgPElNTV82PiwgcjxSQz4iCi0JZG9fZGpzcmkoX1NELCBwY2Rpc3AsIElNTV82KTsKLV9CUkEsMTAxMTEsMTAsNi5JTU1fNixfSU1NMTI6QlJBOnNob3J0Om11OkRKU1JJIGltbQotImRqc3JpIDxJTU1fNj4sIDxwY2Rpc3A+IgotCWRvX2Rqc3JpKF9TRCwgcGNkaXNwLCBJTU1fNik7Ci1fQlJBLDEwMTExLDEwLDYuSU1NXzYsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6REpTUkkgaW1tIGxvbmcKLSJkanNyaSA8SU1NXzY+LCA8cGNkaXNwPiIKLQlkb19kanNyaShfU0QsIHBjZGlzcCwgSU1NXzYpOwotCi0KLQotLy8gSk1QCi0KLV9CUkEsMDAwMDEsMDAsNi4qKiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkpNUAotImptcCByPFJDPiIKLQluaWEgPSBwY2FkZHI7Ci0JaWYgKFJDID09IDYyICYmIFRSQUNFX0NBTExfUCkKLQkgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fUkVUVVJOOwotX0JSQSwwMDAwMSwxMCxfSU1NMTg6QlJBOnNob3J0Om11OkpNUCBpbW0KLSJqbXAgPHBjZGlzcD4iCi0JbmlhID0gcGNhZGRyOwotX0JSQSwwMDAwMSwxMCw2LioqLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkpNUCBpbW0gbG9uZwotImptcCA8cGNkaXNwPiIKLQluaWEgPSBwY2FkZHI7Ci0KLQotCi0vLyBKTVBUTloKLQotX0JSQSwwMDEwMSwwMSw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6Sk1QVE5aCi0iam1wdG56IHI8UkM+IgotCWlmICh2YWxfUmEgIT0gMCkKLQkgIG5pYSA9IHBjYWRkcjsKLV9CUkEsMDAxMDEsMTEsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkpNUFROWiBpbW0KLSJqbXB0bnogPHBjZGlzcD4iCi0JaWYgKHZhbF9SYSAhPSAwKQotCSAgbmlhID0gcGNhZGRyOwotX0JSQSwwMDEwMSwxMSw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkpNUFROWiBpbW0gbG9uZwotImptcHRueiA8cGNkaXNwPiIKLQlpZiAodmFsX1JhICE9IDApCi0JICBuaWEgPSBwY2FkZHI7Ci0KLQotCi0vLyBKTVBUWlIKLQotX0JSQSwwMDEwMSwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6Sk1QVFpSCi0iam1wdHpyIHI8UkM+IgotCWlmICh2YWxfUmEgPT0gMCkKLQkgIG5pYSA9IHBjYWRkcjsKLV9CUkEsMDAxMDEsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkpNUFRaUiBpbW0KLSJqbXB0enIgPHBjZGlzcD4iCi0JaWYgKHZhbF9SYSA9PSAwKQotCSAgbmlhID0gcGNhZGRyOwotX0JSQSwwMDEwMSwxMCw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkpNUFRaUiBpbW0gbG9uZwotImptcHR6ciA8cGNkaXNwPiIKLQlpZiAodmFsX1JhID09IDApCi0JICBuaWEgPSBwY2FkZHI7Ci0KLQotCi0vLyBKT0lOcHAgCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19qb2luX3BwOmludCBwcCwgdW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0Jc3dpdGNoIChwcCkgewotCWNhc2UgMHgwOiAvKiBMTCAqLwotCSAgV1JJVEUzMl9RVUVVRSAocmEsICgodW5zaWduZWQzMilWTDJfNChyYikgPDwgMTYpIHwgVkwyXzQoc3JjKSk7Ci0JICBicmVhazsKLQljYXNlIDB4MTogLyogTEggKi8KLQkgIFdSSVRFMzJfUVVFVUUgKHJhLCAoKHVuc2lnbmVkMzIpVkwyXzQocmIpIDw8IDE2KSB8IFZIMl80KHNyYykpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDI6IC8qIEhMICovCi0JICBXUklURTMyX1FVRVVFIChyYSwgKCh1bnNpZ25lZDMyKVZIMl80KHJiKSA8PCAxNikgfCBWTDJfNChzcmMpKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgzOiAvKiBISCAqLwotCSAgV1JJVEUzMl9RVUVVRSAocmEsICgodW5zaWduZWQzMilWSDJfNChyYikgPDwgMTYpIHwgVkgyXzQoc3JjKSk7Ci0JICBicmVhazsKLQl9Ci0KLTo6JXM6OnBwOmludCBwcAotCXN3aXRjaCAocHApCi0JICB7Ci0JICBjYXNlIDB4MDogcmV0dXJuICJsbCI7Ci0JICBjYXNlIDB4MTogcmV0dXJuICJsaCI7Ci0JICBjYXNlIDB4MjogcmV0dXJuICJobCI7Ci0JICBjYXNlIDB4MzogcmV0dXJuICJoaCI7Ci0JICBkZWZhdWx0OiByZXR1cm4gIj8iOwotCSAgfQotCi1fSUFMVTEsMDExLHBwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkpPSU5wcAotImpvaW4lczxwcD4gcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19qb2luX3BwKF9TRCwgcHAsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDAxMSxwcCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6Sk9JTnBwIGltbQotImpvaW4lczxwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19qb2luX3BwKF9TRCwgcHAsIFJhLCBSYiwgaW1tSEwpOwotX0lBTFUxLDAxMSxwcCwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6Sk9JTnBwIGltbSBsb25nCi0iam9pbiVzPHBwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX2pvaW5fcHAoX1NELCBwcCwgUmEsIFJiLCBpbW1ITCk7Ci0KLQotCi0vLyBKU1IKLQotX0JSQSwwMDAxMSwwMCw2LioqLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6SlNSCi0ianNyIHI8UkM+IgotCWlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JZWxzZQotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOwotCWlmIChUUkFDRV9DQUxMX1ApCi0JICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JcmV0dXJuIHBjYWRkcjsKLV9CUkEsMDAwMTEsMTAsX0lNTTE4OkJSQTpzaG9ydDptdTpKU1IgaW1tCi0ianNyIDxwY2Rpc3A+IgotCWlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JZWxzZQotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOwotCWlmIChUUkFDRV9DQUxMX1ApCi0JICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JcmV0dXJuIHBjYWRkcjsKLV9CUkEsMDAwMTEsMTAsNi4qKiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKU1IgaW1tIGxvbmcKLSJqc3IgPHBjZGlzcD4iCi0JaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKLQllbHNlCi0JICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JaWYgKFRSQUNFX0NBTExfUCkKLQkgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQlyZXR1cm4gcGNhZGRyOwotCi0KLS8vIEpTUlROWgotCi1fQlJBLDAwMTExLDAxLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpKU1JUTloKLSJqc3J0bnogcjxSQz4iCi0JaWYgKHZhbF9SYSAhPSAwKSB7Ci0JICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JICBlbHNlCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQkgIG5pYSA9IHBjYWRkcjsKLQkgIGlmIChUUkFDRV9DQUxMX1ApCi0JICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQl9Ci1fQlJBLDAwMTExLDExLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpKU1JUTlogaW1tCi0ianNydG56IDxwY2Rpc3A+IgotCWlmICh2YWxfUmEgIT0gMCkgewotCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCSAgZWxzZQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JICBuaWEgPSBwY2FkZHI7Ci0JICBpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JfQotX0JSQSwwMDExMSwxMSw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkpTUlROWiBpbW0gbG9uZwotImpzcnRueiA8cGNkaXNwPiIKLQlpZiAodmFsX1JhICE9IDApIHsKLQkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKLQkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKLQkgIGVsc2UKLQkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOwotCSAgbmlhID0gcGNhZGRyOwotCSAgaWYgKFRSQUNFX0NBTExfUCkKLQkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOwotCX0KLQotCi0KLS8vIEpTUlRaUgotCi1fQlJBLDAwMTExLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpKU1JUWlIKLSJqc3J0enIgcjxSQz4iCi0JaWYgKHZhbF9SYSA9PSAwKSB7Ci0JICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7Ci0JICBlbHNlCi0JICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKLQkgIG5pYSA9IHBjYWRkcjsKLQkgIGlmIChUUkFDRV9DQUxMX1ApCi0JICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKLQl9Ci1fQlJBLDAwMTExLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpKU1JUWlIgaW1tCi0ianNydHpyIDxwY2Rpc3A+IgotCWlmICh2YWxfUmEgPT0gMCkgewotCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOwotCSAgZWxzZQotCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7Ci0JICBuaWEgPSBwY2FkZHI7Ci0JICBpZiAoVFJBQ0VfQ0FMTF9QKQotCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7Ci0JfQotX0JSQSwwMDExMSwxMCw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkpTUlRaUiBpbW0gbG9uZwotImpzcnR6ciA8cGNkaXNwPiIKLQlpZiAodmFsX1JhID09IDApIHsKLQkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKLQkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKLQkgIGVsc2UKLQkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOwotCSAgbmlhID0gcGNhZGRyOwotCSAgaWYgKFRSQUNFX0NBTExfUCkKLQkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOwotCX0KLQotCi0KLS8vIFBvc3QgaW5jcmVtZW50Ci0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19pbmNyOmludCB4LCB1bnNpZ25lZDMyICpyYiwgaW50IGRlbHRhCi0JdW5zaWduZWQzMiBuZXh0X3JiOwotCWlmICh4ID09IDEpCi0JICBuZXh0X3JiID0gKnJiICsgZGVsdGE7Ci0JZWxzZSBpZiAoeCA9PSAzKQotCSAgbmV4dF9yYiA9ICpyYiAtIGRlbHRhOwotCWVsc2UKLQkgIG5leHRfcmIgPSAqcmI7IC8qIHZhbHVlIG5vdCB1c2VkICovCi0JLyogSFcgZXJyYXR1bTogY2hlY2sgdmFsdWUgYWZ0ZXIgaW5jcmVtZW50aW5nICovCi0JaWYgKG5leHRfcmIgPT0gTU9EX0UKLQkgICAgJiYgKHggPT0gMSB8fCB4ID09IDMpCi0JICAgICYmIChQU1dfVkFMKFBTV19NRCkpKSB7Ci0JICBXUklURTMyX1FVRVVFIChyYiwgTU9EX1MpOwotCX0KLQllbHNlIGlmICh4ID09IDEgfHwgeCA9PSAzKQotCSAgV1JJVEUzMl9RVUVVRSAocmIsIG5leHRfcmIpOwotCi0vLyBMRDJICi0KLWludDo6ZnVuY3Rpb246Om1ha2VfZXZlbl9yZWc6aW50IHJlZywgY29uc3QgY2hhciAqbmFtZQotCWlmIChyZWcgJiAxKQotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLAotCQkJICAgICIweCVseDolcyBvZGQgcmVnaXN0ZXIgKHIlZCkgdXNlZCBpbiBtdWx0aS13b3JkIGxvYWQvbXVseDJoIiwKLQkJCSAgICAobG9uZykgY2lhLCBuYW1lLCByZWcpOwotCXJldHVybiByZWc7Ci0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19sZDJoOmludCByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlzaWduZWQzMiBtZW07Ci0JcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDJIIik7Ci0JbWVtID0gTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDQpOwotCWlmIChyYSAhPSAwKQotCXsKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAwXSwgU0VYVDMyKEVYVFJBQ1RFRDMyKG1lbSwgMCwgMTUpLCAxNikpOwotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDFdLCBTRVhUMzIoRVhUUkFDVEVEMzIobWVtLCAxNiwgMzEpLCAxNikpOwotCX0KLQotOjolczo6WFg6aW50IFhYCi0Jc3dpdGNoIChYWCkKLQkgIHsKLQkgIGNhc2UgMDogcmV0dXJuICIiOwotCSAgY2FzZSAxOiByZXR1cm4gIisiOwotCSAgY2FzZSAzOiByZXR1cm4gIi0iOwotCSAgZGVmYXVsdDogcmV0dXJuICI/IjsKLQkgIH0KLQotX0lNRU0sMDAwMTEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMRDJICi0ibGQyaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZDJoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fbGQyaChfU0QsIFJBLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA0KTsKLV9JTUVNLDAwMDExLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxEMkggbG9uZwotImxkMmggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19sZDJoKF9TRCwgUkEsIFJiLCBpbW0pOwotCi0KLQotLy8gTEQyVwotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbGQydzppbnQgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0JdW5zaWduZWQ2NCBtZW07Ci0JcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDJXIik7Ci0JbWVtID0gTUVNKHVuc2lnbmVkLCByYiArIHNyYywgOCk7Ci0JaWYgKHJhICE9IDApCi0JewotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDBdLCBFWFRSQUNURUQ2NCAobWVtLCAwLCAzMSkpOwotCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDFdLCBFWFRSQUNURUQ2NCAobWVtLCAzMiwgNjMpKTsKLQl9Ci0KLV9JTUVNLDAwMTEwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TDJXCi0ibGQydyByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZDJ3IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fbGQydyhfU0QsIFJBLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA4KTsKLV9JTUVNLDAwMTEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkwyVyBsb25nCi0ibGQydyByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX2xkMncoX1NELCBSQSwgUmIsIGltbSk7Ci0KLQotCi0vLyBMRDRCSAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbGQ0Ymg6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQl1bnNpZ25lZDE2IGwxLCBsMiwgaDEsIGgyOwotCXVuc2lnbmVkMzIgbWVtOwotCXJhID0gbWFrZV9ldmVuX3JlZyhfU0QsIHJhLCAiTEQ0QkgiKTsKLQltZW0gPSBNRU0odW5zaWduZWQsIHJiICsgc3JjLCA0KTsKLQloMSA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDAsIDcpLCA4KTsKLQlsMSA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDgsIDE1KSwgOCk7Ci0JaDIgPSBTRVhUMTYoRVhUUkFDVEVEMzIobWVtLCAxNiwgMjMpLCA4KTsKLQlsMiA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDI0LCAzMSksIDgpOwotCWlmIChyYSAhPSAwKQotCXsKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAwXSwgKGgxIDw8IDE2KSB8IGwxKTsKLQkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAxXSwgKGgyIDw8IDE2KSB8IGwyKTsKLQl9Ci0KLV9JTUVNLDAwMTAxLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TEQ0QkgKLSJsZDRiaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZDRiaCByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgotCWRvX2xkNGJoKF9TRCwgUkEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOwotX0lNRU0sMDAxMDEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TEQ0QkggbG9uZwotImxkNGJoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCi0JZG9fbGQ0YmgoX1NELCBSQSwgUmIsIGltbSk7Ci0KLQotCi0vLyBMRDRCSFUKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2xkNGJodTp1bnNpZ25lZDMyIHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCXVuc2lnbmVkMTYgbDEsIGwyLCBoMSwgaDI7Ci0JdW5zaWduZWQzMiBtZW07Ci0JcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDRCSCIpOwotCW1lbSA9IE1FTShzaWduZWQsIHJiICsgc3JjLCA0KTsKLQloMSA9IEVYVFJBQ1RFRDMyKG1lbSwgMCwgNyk7Ci0JbDEgPSBFWFRSQUNURUQzMihtZW0sIDgsIDE1KTsKLQloMiA9IEVYVFJBQ1RFRDMyKG1lbSwgMTYsIDIzKTsKLQlsMiA9IEVYVFJBQ1RFRDMyKG1lbSwgMjQsIDMxKTsKLQlpZiAocmEgIT0gMCkKLQl7Ci0JICBXUklURTMyX1FVRVVFICgmR1BSW3JhICsgMF0sIChoMSA8PCAxNikgfCBsMSk7Ci0JICBXUklURTMyX1FVRVVFICgmR1BSW3JhICsgMV0sIChoMiA8PCAxNikgfCBsMik7Ci0JfQotCi1fSU1FTSwwMTEwMSxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxENEJIVQotImxkNGhidSByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZDRoYnUgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19sZDRiaHUoX1NELCBSQSwgUmIsIHNyYyk7Ci0JZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgNCk7Ci1fSU1FTSwwMTEwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpMRDRCSFUgbG9uZwotImxkNGhidSByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX2xkNGJodShfU0QsIFJBLCBSYiwgaW1tKTsKLQotCi0KLS8vIExEQgotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbGRiOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCVdSSVRFMzJfUVVFVUUgKHJhLCBNRU0oc2lnbmVkLCByYiArIHNyYywgMSkpOwotCi1fSU1FTSwwMDAwMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxEQgotImxkYiByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZGIgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19sZGIoX1NELCBSYSwgUmIsIHNyYyk7Ci0JZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgMSk7Ci1fSU1FTSwwMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpMREIgbG9uZwotImxkYiByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX2xkYihfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLS8vIExEQlUKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2xkYnU6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0JV1JJVEUzMl9RVUVVRSAocmEsIE1FTSh1bnNpZ25lZCwgcmIgKyBzcmMsIDEpKTsKLQotX0lNRU0sMDEwMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMREJVCi0ibGRidSByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZGJ1IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fbGRidShfU0QsIFJhLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAxKTsKLV9JTUVNLDAxMDAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxEQlUgbG9uZwotImxkYnUgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19sZGJ1KF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTERICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19sZGg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0JV1JJVEUzMl9RVUVVRSAocmEsIE1FTShzaWduZWQsIHJiICsgc3JjLCAyKSk7Ci0KLV9JTUVNLDAwMDEwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TERICi0ibGRoIHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAotImxkaCByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgotCWRvX2xkaChfU0QsIFJhLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAyKTsKLV9JTUVNLDAwMDEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxESCBsb25nCi0ibGRoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCi0JZG9fbGRoKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTERISAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbGRoaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlXUklURTMyX1FVRVVFIChyYSwgTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDIpIDw8IDE2KTsKLQotX0lNRU0sMDAwMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMREhICi0ibGRoaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJsZGhoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fbGRoaChfU0QsIFJhLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAyKTsKLV9JTUVNLDAwMDAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxESEggbG9uZwotImxkaGggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19sZGhoKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTERIVQotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbGRodTp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlXUklURTMyX1FVRVVFIChyYSwgTUVNKHVuc2lnbmVkLCByYiArIHNyYywgMikpOwotCi1fSU1FTSwwMTAxMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxESFUKLSJsZGh1IHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAotImxkaHUgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19sZGh1KF9TRCwgUmEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDIpOwotX0lNRU0sMDEwMTAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TERIVSBsb25nCi0ibGRodSByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX2xkaHUoX1NELCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBMRFcKLQotdm9pZDo6ZnVuY3Rpb246OmRvX2xkdzp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlXUklURTMyX1FVRVVFIChyYSwgTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDQpKTsKLQotX0lNRU0sMDAxMDAsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMRFcKLSJsZHcgcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCi0ibGR3IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fbGR3KF9TRCwgUmEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOwotX0lNRU0sMDAxMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TERXIGxvbmcKLSJsZHcgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19sZHcoX1NELCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBNQUNhCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19tYWM6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCi0JdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKLQlhY2N1bSArPSAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpOwotCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAzMiwgNjMpKTsKLQotX0lBTFUyLDEwMTAwLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNQUNhCi0ibWFjPEFBPiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX21hYyhfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCi1fSUFMVTIsMTAxMDAsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNQUNhIGltbQotIm1hYzxBQT4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tYWMoX1NELCBBYSwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTUFDU2EKLQotdm9pZDo6ZnVuY3Rpb246OmRvX21hY3M6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCi0JdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKLQlhY2N1bSArPSAoKHNpZ25lZDY0KSAocmIpICogKHNpZ25lZDY0KSAoc3JjKSkgPDwgMTsKLQlXUklURTY0X1FVRVVFIChhYSwgYWNjdW0pOwotCVdSSVRFMzJfUVVFVUUgKHJhLCBFWFRSQUNURUQ2NChhY2N1bSwgMCwgMzEpKTsKLQotX0lBTFUyLDEwMTAxLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNQUNTYQotIm1hY3M8QUE+IHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fbWFjcyhfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCi1fSUFMVTIsMTAxMDEsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNQUNTYSBpbW0KLSJtYWNzPEFBPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX21hY3MoX1NELCBBYSwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTU9EREVDIHwgTU9ESU5DCi0KLV9JTUVNLDAwMTExLDExLDYuKiosNi5SQixfSU1NNjpJTUVNOnNob3J0Om11Ok1PRERFQwotIm1vZGRlYyByPFJCPiwgPGltbT4iCi0JZG9faW5jcihfU0QsIDMvKjBiMTEqLywgJkdQUltSQl0sIGltbV81KTsJCi1fSU1FTSwwMDExMSwwMSw2LioqLDYuUkIsX0lNTTY6SU1FTTpzaG9ydDptdTpNT0RJTkMKLSJtb2RpbmMgcjxSQj4sIDxpbW0+IgotCWRvX2luY3IoX1NELCAxLyowYjAxKi8sICZHUFJbUkJdLCBpbW1fNSk7CQotCi0KLQotLy8gTVNVQmEKLQotdm9pZDo6ZnVuY3Rpb246OmRvX21zdWI6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCi0JdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKLQlhY2N1bSAtPSAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpOwotCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAzMiwgNjMpKTsKLQotX0lBTFUyLDEwMTEwLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNU1VCYQotIm1zdWI8QUE+IHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fbXN1YihfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCi1fSUFMVTIsMTAxMTAsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNU1VCYSBpbW0KLSJtc3ViPEFBPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX21zdWIoX1NELCBBYSwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTVNVQlNhCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19tc3Viczp1bnNpZ25lZDY0ICphYSwgdW5zaWduZWQzMiAqcmEsIHNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMKLQl1bnNpZ25lZDY0IGFjY3VtID0gKmFhOwotCWFjY3VtIC09ICgoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpKSA8PCAxOwotCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAwLCAzMSkpOwotCi1fSUFMVTIsMTAxMTEsMCwxLkFBLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1TVUJTYQotIm1zdWJzPEFBPiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX21zdWJzKF9TRCwgQWEsIFJhLCBSYiwgUmMpOwkKLV9JQUxVMiwxMDExMSwxLDEuQUEsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1TVUJTYSBpbW0KLSJtc3ViczxBQT4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tc3VicyhfU0QsIEFhLCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBNVUwKLQotdm9pZDo6ZnVuY3Rpb246OmRvX211bDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlXUklURTMyX1FVRVVFIChyYSwgcmIgKiBzcmMpOwotCi1fSUFMVTIsMTAwMDAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMCi0ibXVsIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fbXVsKF9TRCwgUmEsIFJiLCBSYyk7CQotX0lBTFUyLDEwMDAwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVUwgaW1tCi0ibXVsIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fbXVsKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gTVVMMkgKLQotdm9pZDo6ZnVuY3Rpb246OmRvX211bDJoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCXVuc2lnbmVkMTYgaGlnaCA9IFZIMl80KHJiKSAqIFZIMl80KHNyYyk7Ci0JdW5zaWduZWQxNiBsb3cgID0gVkwyXzQocmIpICogVkwyXzQoc3JjKTsKLQlXUklURTMyX1FVRVVFIChyYSwgKGhpZ2ggPDwgMTYpIHwgbG93KTsKLQotX0lBTFUyLDAwMDAwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1VTDJICi0ibXVsMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19tdWwyaChfU0QsIFJhLCBSYiwgUmMpOwkKLV9JQUxVMiwwMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6TVVMMkggaW1tCi0ibXVsMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tdWwyaChfU0QsIFJhLCBSYiwgaW1tSEwpOwotCi0KLQotLy8gTVVMWAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbXVseDp1bnNpZ25lZDY0ICphYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYwotCVdSSVRFNjRfUVVFVUUgKGFhLCAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpKTsKLQotX0lBTFUyLDExMDAwLDAwLDUuKiwxLkFBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNVUxYCi0ibXVseCBhPEFBPiwgcjxSQj4sIHI8UkM+IgotCWRvX211bHgoX1NELCBBYSwgUmIsIFJjKTsJCi1fSUFMVTIsMTEwMDAsMTAsNS4qLDEuQUEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVUxYIGltbQotIm11bHggYTxBQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tdWx4KF9TRCwgQWEsIFJiLCBpbW0pOwotCi0KLS8vIE1VTFgySAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbXVseDJoOmludCByYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYywgaW50IGhpZ2gKLQlzaWduZWQzMiByZXN1bHQgPSByYiAqIHNyYzsKLQlpZiAoIWhpZ2gpCi0JICB7Ci0JICAgIHJhID0gbWFrZV9ldmVuX3JlZyhfU0QsIHJhLCAiTVVMWDJIIik7Ci0JICAgIGlmIChyYSAhPSAwKQotCSAgICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmErMV0sIHJlc3VsdCk7Ci0JICB9Ci0JZWxzZSBpZiAocmEgIT0gMCkKLQkgIHsKLQkgICAgICBXUklURTMyX1FVRVVFICgmR1BSW3JhKzBdLCByZXN1bHQpOwotCSAgfQotCi1fSUFMVTIsMDAwMDEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMWDJICi0ibXVsMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19tdWx4MmgoX1NELCBSQSwgUmJILCBSY0gsIDEpOwotCWRvX211bHgyaChfU0QsIFJBLCBSYkwsIFJjTCwgMCk7Ci1fSUFMVTIsMDAwMDEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1VTFgySCBpbW0KLSJtdWwyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX211bHgyaChfU0QsIFJBLCBSYkgsIGltbSwgMSk7Ci0JZG9fbXVseDJoKF9TRCwgUkEsIFJiTCwgaW1tLCAwKTsKLQotLy8gTVVMSFhwcAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbXVsaHg6aW50IHBwLCB1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlzaWduZWQzMiB2YWx1ZSA9IDA7Ci0Jc3dpdGNoIChwcCkgewotCWNhc2UgMDogLyogTEwgKi8KLQkgIHZhbHVlID0gU0VYVDMyKFZMMl80KHJiKSwgMTYpICogU0VYVDMyKFZMMl80KHNyYyksIDE2KTsKLQkgIGJyZWFrOwotCWNhc2UgMTogLyogTEggKi8KLQkgIHZhbHVlID0gU0VYVDMyKFZMMl80KHJiKSwgMTYpICogU0VYVDMyKFZIMl80KHNyYyksIDE2KTsKLQkgIGJyZWFrOwotCWNhc2UgMjogLyogSEwgKi8KLQkgIHZhbHVlID0gU0VYVDMyKFZIMl80KHJiKSwgMTYpICogU0VYVDMyKFZMMl80KHNyYyksIDE2KTsKLQkgIGJyZWFrOwotCWNhc2UgMzogLyogSEggKi8KLQkgIHZhbHVlID0gU0VYVDMyKFZIMl80KHJiKSwgMTYpICogU0VYVDMyKFZIMl80KHNyYyksIDE2KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJkb19tdWxoeCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOwotCX0KLQlXUklURTMyX1FVRVVFIChyYSwgdmFsdWUpOwotCi1fSUFMVTIsMDAxLHBwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1VTEhYcHAKLSJtdWxoeCVzPHBwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX211bGh4KF9TRCwgcHAsIFJhLCBSYiwgUmMpOwkKLV9JQUxVMiwwMDEscHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1VTEhYcHAgaW1tCi0ibXVsaHglczxwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tdWxoeChfU0QsIHBwLCBSYSwgUmIsIGltbUhMKTsKLQotCi0KLS8vIE1VTFhTCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19tdWx4czp1bnNpZ25lZDY0ICphYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYwotCVdSSVRFNjRfUVVFVUUgKGFhLCAoKHNpZ25lZDY0KSAocmIpICogKHNpZ25lZDY0KSAoc3JjKSkgPDwgMSk7Ci0KLV9JQUxVMiwxMTAwMSwwMCw1LiosMS5BQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMWFMKLSJtdWx4cyBhPEFBPiwgcjxSQj4sIHI8UkM+IgotCWRvX211bHhzKF9TRCwgQWEsIFJiLCBSYyk7CQotX0lBTFUyLDExMDAxLDEwLDUuKiwxLkFBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6TVVMWFMgaW1tCi0ibXVseHMgYTxBQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19tdWx4cyhfU0QsIEFhLCBSYiwgaW1tKTsKLQotCi0KLS8vIE1WRkFDQwotCi12b2lkOjpmdW5jdGlvbjo6ZG9fbXZmYWNjOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDY0IGFiLCB1bnNpZ25lZDMyIHNyYwotCXdoaWxlIChzcmMgPiA2Mykgc3JjIC09IDY0OwotCVdSSVRFMzJfUVVFVUUgKHJhLCAoKHNpZ25lZDY0KWFiKSA+PiBzcmMpOwotCi1fSUFMVTIsMTExMTEsMDAsNi5SQSw1LiosMS5BQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1WRkFDQwotIm12ZmFjYyByPFJBPiwgYTxBQj4sIHI8UkM+IgotCWRvX212ZmFjYyhfU0QsIFJhLCAqQWIsIFJjKTsJCi1fSUFMVTIsMTExMTEsMTAsNi5SQSw1LiosMS5BQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVkZBQ0MgaW1tCi0ibXZmYWNjIHI8UkE+LCBhPEFCPiwgPGltbT4iCi0JZG9fbXZmYWNjKF9TRCwgUmEsICpBYiwgaW1tXzZ1KTsKLQotCi0KLS8vIE1WRlNZUwotCi1fQlJBLDExMTEwLDAwLDYuUkEsNi5DUiw2LklEOkJSQTpzaG9ydDptdTpNVkZTWVMKLSJtdmZzeXMgcjxSQT4sIGNyPENSPiIKLQlzd2l0Y2ggKElEKSB7Ci0JY2FzZSAwOgotCSAgaWYgKENSID49IE5SX0NPTlRST0xfUkVHSVNURVJTKQotCSAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJGSVhNRSAtIGlsbGVnYWwgQ1IiKTsKLQkgIGVsc2UKLQkgICAgV1JJVEUzMl9RVUVVRSAoUmEsIChDUFUpLT5yZWdzLmNvbnRyb2xbQ1JdKTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIFdSSVRFMzJfUVVFVUUgKFJhLCBQU1dMKTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIFdSSVRFMzJfUVVFVUUgKFJhLCBFWFRSQUNURUQzMihQU1dILCAxNiwgMzEpKTsKLQkgIGJyZWFrOwotCWNhc2UgMzoKLQkgIFdSSVRFMzJfUVVFVUUgKFJhLCBQU1dfRkxBR19WQUwoQ1IpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJGSVhNRSAtIGlsbGVnYWwgSUQiKTsKLQl9Ci0KLQotCi0vLyBNVlRBQ0MKLQotX0lBTFUyLDAxMTExLDAwLDUuKiwxLkFBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNVlRBQ0MKLSJtdnRhY2MgYTxBQT4sIHI8UkI+LCByPFJDPiIKLQlXUklURTY0X1FVRVVFIChBYSwgSU5TRVJURUQ2NChSYlUsIDAsIDMxKSB8IChSY1UpKTsKLQotCi0KLS8vIE1WVFNZUwotCi1fQlJBLDAxMTEwLDAwLDYuQ1IsNi5SQiw2LklEOkJSQTpzaG9ydDptdTpNVlRTWVMKLSJtdnRzeXMgY3I8Q1I+LCByPFJCPiIKLQlzd2l0Y2ggKElEKSB7Ci0JY2FzZSAwOgkJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgIGlmIChDUiA+PSBOUl9DT05UUk9MX1JFR0lTVEVSUykKLQkgICAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiRklYTUUgLSBpbGxlZ2FsIENSIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZDMyIHZhbHVlID0gUmI7Ci0JICAgICAgQ1BVLT5tdnRzeXNfbGVmdF9wID0gMTsKLQkgICAgICBpZiAoQ1IgPT0gcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyKQotCQl7Ci0JCSAgdW5zaWduZWQzMiBkcyA9IFBTVyAmIEJJVDMyIChQU1dfRFMpOwkvKiBwcmVzZXJ2ZSBkcyAqLwotCQkgIHZhbHVlID0gZHMgfCAodmFsdWUgJiBQU1dfVkFMSUQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoQ1IgPT0gYmFja3VwX3Byb2Nlc3Nvcl9zdGF0dXNfd29yZF9jcgotCQkgICAgICAgfHwgQ1IgPT0gZGVidWdfYmFja3VwX3Byb2Nlc3Nvcl9zdGF0dXNfd29yZF9jcikKLQkJdmFsdWUgJj0gRFBTV19WQUxJRDsKLQkgICAgICBlbHNlIGlmIChDUiA9PSBlaXRfdmVjdG9yX2Jhc2VfY3IpCi0JCXZhbHVlICY9IEVJVF9WQUxJRDsKLQkgICAgICBXUklURTMyX1FVRVVFICgmKENQVSktPnJlZ3MuY29udHJvbFtDUl0sIHZhbHVlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAxOgkJCS8qIFBTV0wgKi8KLQkgIFdSSVRFMzJfUVVFVUVfTUFTSyAoJlBTVywgRVhUUkFDVEVEMzIoUmIsIDE2LCAzMSksCi0JCQkgICAgICBQU1dfVkFMSUQgJiAweDAwMDBmZmZmKTsKLQkgIGJyZWFrOwotCWNhc2UgMjoJCQkvKiBQU1dIICovCi0JICB7Ci0JICAgIHVuc2lnbmVkMzIgZHMgPSBQU1cgJiBCSVQzMiAoUFNXX0RTKTsJLyogcHJlc2VydmUgZHMgKi8KLQkgICAgV1JJVEUzMl9RVUVVRV9NQVNLICgmUFNXLCAoRVhUUkFDVEVEMzIoUmIsIDE2LCAzMSkgPDwgMTYpIHwgZHMsCi0JCQkJKFBTV19WQUxJRCB8IGRzKSAmIDB4ZmZmZjAwMDApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAzOgkJCS8qIEZMQUcgKi8KLQkgIFBTV19GTEFHX1NFVF9RVUVVRShDUiwgUmIgJiAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJGSVhNRSAtIGlsbGVnYWwgSUQiKTsKLQl9Ci0KLQotCi0vLyBOT1AKLQotX0JSQSwwMTExMSwwMCw2LioqLDYuKiosNi4qKjpCUkE6c2hvcnQ6aXUsbXU6Tk9QCi0ibm9wIgotCS8qIE5PUCAqLzsKLQotCi0vLyBOT1QKLQotX0xPR0lDLDExMDAxLDAwLDYuUkEsNi5SQiw2Lio6TE9HSUM6c2hvcnQ6aXUsbXU6Tk9UCi0ibm90IHI8UkE+LCByPFJCPiIKLQlXUklURTMyX1FVRVVFIChSYSwgflJiKTsKLQotCi0KLS8vIE5PVEZHCi0KLV9MT0dJQywwMTAwMSwwMCwqKiosMy5GQSwqKiosMy5GQiwqKiosMy5GQzpMT0dJQzpzaG9ydDppdSxtdTpOT1RGRwotIm5vdGZnIGY8RkE+LCBmPEZCPiIKLQlQU1dfRkxBR19TRVRfUVVFVUUoRkEsICFQU1dfRkxBR19WQUwoRkIpKTsKLQotCi0vLyBPUgotCi1fTE9HSUMsMTEwMTAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6T1IKLSJvciByPFJBPiwgcjxSQj4sIHI8UkM+IgotCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiB8IFJjKTsKLV9MT0dJQywxMTAxMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6T1IgaW1tCi0ib3IgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlXUklURTMyX1FVRVVFIChSYSwgUmIgfCBpbW0pOwotX0xPR0lDLDExMDEwLDEwLDYuUkEsNi5SQixfSU1NMzI6TE9HSUM6bG9uZzppdSxtdTpPUiBpbW0gbG9uZwotIm9yIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiIHwgaW1tKTsKLQotCi0KLS8vIE9SRkcKLQotX0xPR0lDLDAxMDEwLDAwLCoqKiwzLkZBLCoqKiwzLkZCLCoqKiwzLkZDOkxPR0lDOnNob3J0Oml1LG11Ok9SRkcKLSJvcmZnIGY8RkE+LCBmPEZCPiwgZjxGQz4iCi0JUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCBQU1dfRkxBR19WQUwoRkIpIHwgUFNXX0ZMQUdfVkFMKEZDKSk7Ci1fTE9HSUMsMDEwMTAsMTAsKioqLDMuRkEsKioqLDMuRkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6T1JGRyBpbW0KLSJvcmZnIGY8RkE+LCBmPEZCPiwgPGltbT4iCi0JUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCBQU1dfRkxBR19WQUwoRkIpIHwgKGltbV82ICYgMSkpOwotCi0KLQotLy8gUkVJVAotCi1fQlJBLDAxMDAwLDAwLDYuKiosNi4qKiw2LioqOkJSQTpzaG9ydDptdTpSRUlUCi0icmVpdCIKLQlXUklURTMyX1FVRVVFICgmUFNXLCBiUFNXKTsKLQluaWEgPSBiUEM7Ci0KLQotCi0KLS8vIFJFUEVBVAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fcmVwZWF0OnVuc2lnbmVkMzIgY291bnQsIGFkZHJlc3Nfd29yZCBwY2FkZHIKLQlhZGRyZXNzX3dvcmQgcnB0X3MgPSBjaWEgKyA4OwotCWFkZHJlc3Nfd29yZCBycHRfZSA9IGNpYSArIHBjYWRkcjsKLQotCWlmIChjb3VudCA9PSAwKQotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiUkVQRUFUIHdpdGggcmE9MCBhbmQgUkVQRUFUSSB3aXRoIGltbSA9IDAgaXMgZm9yYmlkZGVuLiIpOwotCWlmIChjb3VudCA+IDEpCi0JICBQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOwotCWlmIChycHRfZSAgPCBycHRfcyArIDB4MTgpCi0JICBzaW1faW9fZXByaW50ZiAoc2QsICJ3YXJuaW5nOiAweCVseDogUkVQRUFUIG9yIFJFUEVBVEkgbG9vcCBpcyB0b28gc21hbGxcbiIsIChsb25nKSBjaWEpOwotCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgY291bnQgLSAxKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX1MsIHJwdF9zKTsKLQlXUklURTMyX1FVRVVFICgmUlBUX0UsIHJwdF9lKTsKLQotX0JSQSwxMTAwMCwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6UkVQRUFUCi0icmVwZWF0IHI8UkE+LCByPFJDPiIKLQlkb19yZXBlYXQoX1NELCB2YWxfUmEsIHBjYWRkcik7Ci1fQlJBLDExMDAwLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpSRVBFQVQgaW1tCi0icmVwZWF0IHI8UkE+LCA8cGNhZGRyPiIKLQlkb19yZXBlYXQoX1NELCB2YWxfUmEsIHBjYWRkcik7Ci1fQlJBLDExMDAwLDEwLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6UkVQRUFUIGltbSBsb25nCi0icmVwZWF0IHI8UkE+LCA8cGNhZGRyPiIKLQlkb19yZXBlYXQoX1NELCB2YWxfUmEsIHBjYWRkcik7Ci0KLQotCi0KLS8vIFJFUEVBVEkKLQotX0JSQSwxMTAxMCwwMCw2LklNTV82LDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6UkVQRUFUSQotInJlcGVhdGkgPElNTV82PiwgcjxSQz4iCi0JZG9fcmVwZWF0KF9TRCwgSU1NXzYsIHBjYWRkcik7Ci1fQlJBLDExMDEwLDEwLDYuSU1NXzYsX0lNTTEyOkJSQTpzaG9ydDptdTpSRVBFQVRJIGltbQotInJlcGVhdGkgPElNTV82PiwgPHBjYWRkcj4iCi0JZG9fcmVwZWF0KF9TRCwgSU1NXzYsIHBjYWRkcik7Ci1fQlJBLDExMDEwLDEwLDYuSU1NXzYsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6UkVQRUFUSSBpbW0gbG9uZwotInJlcGVhdGkgPElNTV82PiwgPHBjYWRkcj4iCi0JZG9fcmVwZWF0KF9TRCwgSU1NXzYsIHBjYWRkcik7Ci0KLQotCi0KLS8vIFJURAotCi1fQlJBLDAxMDEwLDAwLDYuKiw2LiosNi4qOkJSQTpzaG9ydDptdTpSVEQKLSJydGQiCi0JV1JJVEUzMl9RVUVVRSAoJlBTVywgRFBTVyk7Ci0JbmlhID0gRFBDOwotCi0KLQotCi0vLyBST1QKLQotX0xPR0lDLDEwMTAwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlJPVAotInJvdCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCVdSSVRFMzJfUVVFVUUgKFJhLCBST1QzMihSYiwgUmMgJiAweDFmKSk7Ci1fTE9HSUMsMTAxMDAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlJPVCBpbW0KLSJyb3QgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlXUklURTMyX1FVRVVFIChSYSwgUk9UMzIoUmIsIGltbSAmIDB4MWYpKTsKLQotCi0KLQotLy8gUk9UMkgKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3JvdDJoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMKLQl1bnNpZ25lZDE2IGhpZ2ggPSBST1RSMTYoVkgyXzQocmIpLCBWSDJfNChzcmMpICYgMHhmKTsKLQl1bnNpZ25lZDE2IGxvdyAgPSBST1RSMTYoVkwyXzQocmIpLCBWTDJfNChzcmMpICYgMHhmKTsKLQlXUklURTMyX1FVRVVFIChyYSwgKGhpZ2ggPDwgMTYpIHwgbG93KTsKLQotX0xPR0lDLDEwMTAxLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlJPVDJICi0icm90MmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19yb3QyaChfU0QsIFJhLCBSYiwgUmMpOwotX0xPR0lDLDEwMTAxLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpST1QySCBpbW0KLSJyb3QyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3JvdDJoKF9TRCwgUmEsIFJiLCBpbW1ITCk7Ci0KLQotCi0KLS8vIFNBVAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fc2F0OnNpZ25lZDMyICpyYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYwotCWludCBiaXRzID0gTFNNQVNLRUQzMihzcmMsIDQsIDApOyAvKiA1ICovCi0Jc2lnbmVkMzIgc2F0ID0gTFNNQVNLMzIoYml0cywgMCkgPj4gMjsKLQlzaWduZWQzMiBuc2F0ID0gfnNhdDsKLQlzaWduZWQzMiB2YWx1ZTsKLQlpZiAoYml0cyAhPSBzcmMpCi0JICBzaW1faW9fZXByaW50ZiAoc2QsICJ3YXJuaW5nOiAweCVseDpTQVQgYml0IG92ZXJmbG93XG4iLCAobG9uZykgY2lhKTsKLQlpZiAoYml0cyA9PSAwKQotCSAgdmFsdWUgPSByYjsKLQllbHNlIGlmIChyYiA+PSBzYXQpCi0JICB2YWx1ZSA9IHNhdDsKLQllbHNlIGlmIChyYiA8PSBuc2F0KQotCSAgdmFsdWUgPSBuc2F0OwotCWVsc2UKLQkgIHZhbHVlID0gcmI7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIHZhbHVlKTsKLQotX0lBTFUyLDAxMDAwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1OlNBVAotInNhdCByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX3NhdChfU0QsIFJhLCBSYiwgUmMpOwotX0lBTFUyLDAxMDAwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpTQVQgaW1tCi0ic2F0IHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fc2F0KF9TRCwgUmEsIFJiLCBpbW1fNSk7Ci0KLQotCi0KLS8vIFNBVDJICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zYXRoOnNpZ25lZDMyICpyYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYywgaW50IGhpZ2gsIGludCB1cGRhdGVzX2Y0Ci0JaW50IGJpdHMgPSBMU01BU0tFRDMyKHNyYywgNCwgMCk7IC8qIDUgKi8KLQlzaWduZWQzMiBzYXQgPSBMU01BU0szMihiaXRzLCAwKSA+PiAyOwotCXNpZ25lZDMyIG5zYXQgPSB+c2F0OwotCXNpZ25lZDMyIHZhbHVlOwotCWlmIChiaXRzICE9IHNyYykKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIndhcm5pbmc6IDB4JWx4OlNBVCBiaXQgb3ZlcmZsb3dcbiIsIChsb25nKSBjaWEpOwotCWlmIChiaXRzID09IDApCi0JICB2YWx1ZSA9IHJiOwotCWVsc2UgaWYgKHJiID49IHNhdCkKLQkgIHZhbHVlID0gc2F0OwotCWVsc2UgaWYgKHJiIDw9IG5zYXQpCi0JICB2YWx1ZSA9IG5zYXQ7Ci0JZWxzZQotCSAgdmFsdWUgPSByYjsKLQlpZiAoaGlnaCkKLQkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlIDw8IDE2LCAweGZmZmYwMDAwKTsKLQllbHNlCi0JICBXUklURTMyX1FVRVVFX01BU0sgKHJhLCB2YWx1ZSwgMHgwMDAwZmZmZik7Ci0JaWYgKHVwZGF0ZXNfZjQpCi0JICB7Ci0JICAgIC8qIGlmIE1VIGluc3RydWN0aW9uIHdhcyBhIE1WVFNZUyAobGtyKSwgdW5xdWV1ZSByZWdpc3RlciB3cml0ZXMgbm93ICovCi0JICAgIGlmKFNUQVRFX0NQVSAoc2QsIDApLT5tdnRzeXNfbGVmdF9wKQotCSAgICAgIHVucXVldWVfd3JpdGVzIChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSk7Ci0JICAgIFBTV19GTEFHX1NFVF9RVUVVRShQU1dfU19GTEFHLCBQU1dfRkxBR19WQUwoUFNXX1NfRkxBRykgXiAodmFsdWUgJiAxKSk7Ci0JICB9Ci0KLV9JQUxVMiwwMTAwMSwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpTQVQySAotInNhdDJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fc2F0aChfU0QsIFJhLCBSYkgsIFJjSCwgMSwgMCk7Ci0JZG9fc2F0aChfU0QsIFJhLCBSYkwsIFJjTCwgMCwgMCk7Ci1fSUFMVTIsMDEwMDEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1OlNBVDJIIGltbQotInNhdDJoIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fc2F0aChfU0QsIFJhLCBSYkgsIGltbV81LCAxLCAwKTsKLQlkb19zYXRoKF9TRCwgUmEsIFJiTCwgaW1tXzUsIDAsIDApOwotCi0KLQotCi0vLyBTQVRIcAotCi06OiVzOjpwOmludCBwCi0Jc3dpdGNoIChwKQotCSAgewotCSAgY2FzZSAwOiByZXR1cm4gImwiOwotCSAgY2FzZSAxOiByZXR1cm4gImgiOwotCSAgZGVmYXVsdDogcmV0dXJuICI/IjsKLQkgIH0KLQotX0lBTFUyLDExMTAscCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpTQVRIUAotInNhdGglczxwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX3NhdGgoX1NELCBSYSwgUmIsIFJjLCBwLCAxKTsKLV9JQUxVMiwxMTEwLHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1OlNBVEhQIGltbQotInNhdGglczxwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3NhdGgoX1NELCBSYSwgUmIsIGltbV81LCBwLCAxKTsKLQotCi0KLS8vIFNBVFoKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3NhdHo6c2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCi0JaWYgKHJiIDwgMCkKLQkgIFdSSVRFMzJfUVVFVUUgKHJhLCAwKTsKLQllbHNlCi0JICBkb19zYXQgKF9TRCwgcmEsIHJiLCBzcmMpOwotCi1fSUFMVTIsMDEwMTAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6U0FUWgotInNhdHogcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19zYXR6KF9TRCwgUmEsIFJiLCBSYyk7Ci1fSUFMVTIsMDEwMTAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1OlNBVFogaW1tCi0ic2F0eiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3NhdHooX1NELCBSYSwgUmIsIGltbV81KTsKLQotCi0KLQotLy8gU0FUWjJICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zYXR6aDpzaWduZWQzMiAqcmEsIHNpZ25lZDE2IHJiLCBzaWduZWQzMiBzcmMsIGludCBoaWdoCi0JaW50IGJpdHMgPSBMU01BU0tFRDMyKHNyYywgMywgMCk7IC8qNCovCi0Jc2lnbmVkMTYgc2F0ID0gTFNNQVNLMTYoYml0cywgMCkgPj4gMjsKLQlzaWduZWQxNiBuc2F0ID0gMDsKLQlzaWduZWQxNiB2YWx1ZTsKLQlpZiAoYml0cyAhPSBzcmMpCi0JICBzaW1faW9fZXByaW50ZiAoc2QsICJ3YXJuaW5nOiAweCVseDpTQVRaMkggYml0IG92ZXJmbG93XG4iLCAobG9uZykgY2lhKTsKLQlpZiAoYml0cyA9PSAwICYmIHJiID4gc2F0KQotCSAgdmFsdWUgPSByYjsKLQllbHNlIGlmIChyYiA+IHNhdCkKLQkgIHZhbHVlID0gc2F0OwotCWVsc2UgaWYgKHJiIDwgbnNhdCkKLQkgIHZhbHVlID0gbnNhdDsKLQllbHNlCi0JICB2YWx1ZSA9IHJiOwotCWlmIChoaWdoKQotCSAgV1JJVEUzMl9RVUVVRV9NQVNLIChyYSwgdmFsdWUgPDwgMTYsIDB4ZmZmZjAwMDApOwotCWVsc2UKLQkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlLCAweDAwMDBmZmZmKTsKLQotCi1fSUFMVTIsMDEwMTEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6U0FUWjJICi0ic2F0ejJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fc2F0emgoX1NELCBSYSwgUmJILCBSY0gsIDEpOwotCWRvX3NhdHpoKF9TRCwgUmEsIFJiTCwgUmNMLCAwKTsKLV9JQUxVMiwwMTAxMSwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6U0FUWjJIIGltbQotInNhdHoyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3NhdHpoKF9TRCwgUmEsIFJiSCwgaW1tLCAxKTsKLQlkb19zYXR6aChfU0QsIFJhLCBSYkwsIGltbSwgMCk7Ci0KLQotCi0KLS8vIFNSQQotCi12b2lkOjpmdW5jdGlvbjo6ZG9fc3JhOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMKLQl1bnNpZ25lZDMyIHZhbHVlOwotCXdoaWxlIChzcmMgPiAzMSkgc3JjIC09IDMyOwotCXdoaWxlIChzcmMgPCAtMzIpIHNyYyArPSAzMjsKLQlpZiAoc3JjID49IDApCi0JICB2YWx1ZSA9IChzaWduZWQzMilyYiA+PiBzcmM7Ci0JZWxzZSBpZiAoc3JjID09IC0zMikKLQkgIHZhbHVlID0gMDsKLQllbHNlCi0JICB2YWx1ZSA9IHJiIDw8IC1zcmM7Ci0JV1JJVEUzMl9RVUVVRSAocmEsIHZhbHVlKTsKLQotX0xPR0lDLDEwMDAwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlNSQQotInNyYSByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX3NyYShfU0QsIFJhLCBSYiwgUmMpOwotX0xPR0lDLDEwMDAwLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpTUkEgaW1tCi0ic3JhIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fc3JhKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotCi0vLyBTUkFIcAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fc3JhaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgaW50IHNyYywgaW50IGhpZ2gKLQl1bnNpZ25lZDMyIHZhbHVlOwotCXdoaWxlIChzcmMgPiAzMSkgc3JjIC09IDMyOwotCXdoaWxlIChzcmMgPCAtMzIpIHNyYyArPSAzMjsKLQlpZiAoc3JjID49IDApCi0JICB2YWx1ZSA9IChzaWduZWQzMilyYiA+PiBzcmM7Ci0JZWxzZSBpZiAoc3JjID09IC0zMikKLQkgIHZhbHVlID0gMDsKLQllbHNlCi0JICB2YWx1ZSA9IHJiIDw8IC1zcmM7Ci0JaWYgKGhpZ2gpCi0JICBXUklURTMyX1FVRVVFX01BU0sgKHJhLCB2YWx1ZSA8PCAxNiwgMHhmZmZmMDAwMCk7Ci0JZWxzZQotCSAgV1JJVEUzMl9RVUVVRV9NQVNLIChyYSwgdmFsdWUsIDB4MDAwMGZmZmYpOwotCi1fTE9HSUMsMDAxMCxwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlNSQUhQCi0ic3JhaCVzPHA+IHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fc3JhaChfU0QsIFJhLCBSYiwgUmMsIHApOwotX0xPR0lDLDAwMTAscCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6U1JBSFAgaW1tCi0ic3JhaCVzPHA+IHI8UkE+LCByPFJCPiwgPGltbT4iCi0JZG9fc3JhaChfU0QsIFJhLCBSYiwgaW1tLCBwKTsKLQotCi0KLQotLy8gU1JBMkgKLQotX0xPR0lDLDEwMDAxLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlNSQTJICi0ic3JhMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlzaWduZWQzMiBzcmNIID0gUmNIOwotCXNpZ25lZDMyIHNyY0wgPSBSY0w7Ci0Jd2hpbGUgKHNyY0ggPiAxNSkgc3JjSCAtPSAxNjsKLQl3aGlsZSAoc3JjSCA8IC0xNikgc3JjSCArPSAxNjsKLQl3aGlsZSAoc3JjTCA+IDE1KSBzcmNMIC09IDE2OwotCXdoaWxlIChzcmNMIDwgLTE2KSBzcmNMICs9IDE2OwotCWRvX3NyYWgoX1NELCBSYSwgUmJILCBzcmNILCAxKTsKLQlkb19zcmFoKF9TRCwgUmEsIFJiTCwgc3JjTCwgMCk7Ci1fTE9HSUMsMTAwMDEsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSQTJIIGltbQotInNyYTJoIHI8UkE+LCByPFJCPiwgPGltbT4iCi0Jc2lnbmVkMzIgc3JjID0gaW1tOwotCXdoaWxlIChzcmMgPiAxNSkgc3JjIC09IDE2OwotCXdoaWxlIChzcmMgPCAtMTYpIHNyYyArPSAxNjsKLQlkb19zcmFoKF9TRCwgUmEsIFJiSCwgc3JjLCAxKTsKLQlkb19zcmFoKF9TRCwgUmEsIFJiTCwgc3JjLCAwKTsKLQotCi0KLQotLy8gU1JDCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zcmM6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIGludCBzcmMKLQl1bnNpZ25lZDMyIHZhbHVlOwotCXVuc2lnbmVkNjQgb3BlcmFuZDsKLQl1bnNpZ25lZDY0IHNoaWZ0ZWQ7Ci0Jd2hpbGUgKHNyYyA+IDMxKSBzcmMgLT0gMzI7Ci0Jd2hpbGUgKHNyYyA8IC0zMikgc3JjICs9IDMyOwotCWlmIChzcmMgPj0gMCkKLQkgIHsKLQkgICAgb3BlcmFuZCA9IChJTlNFUlRFRDY0KHJiLCAwLCAzMSkgfCBJTlNFUlRFRDY0KCpyYSwgMzIsIDYzKSk7Ci0JICAgIHNoaWZ0ZWQgPSBvcGVyYW5kID4+IHNyYzsKLQkgICAgdmFsdWUgPSBFWFRSQUNURUQ2NChzaGlmdGVkLCAzMiwgNjMpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb3BlcmFuZCA9IChJTlNFUlRFRDY0KCpyYSwgMCwgMzEpIHwgSU5TRVJURUQ2NChyYiwgMzIsIDYzKSk7Ci0JICAgIHNoaWZ0ZWQgPSBvcGVyYW5kIDw8IC1zcmM7Ci0JICAgIHZhbHVlID0gRVhUUkFDVEVENjQoc2hpZnRlZCwgMCwgMzEpOwotCSAgfQotCVdSSVRFMzJfUVVFVUUgKHJhLCB2YWx1ZSk7Ci0KLV9MT0dJQywxMDExMCwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkMKLSJzcmMgcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19zcmMoX1NELCBSYSwgUmIsIFJjKTsKLV9MT0dJQywxMDExMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6U1JDIGltbQotInNyYyByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3NyYyhfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLQotLy8gU1JMCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zcmw6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIGludCBzcmMKLQl1bnNpZ25lZDMyIHZhbHVlOwotCXdoaWxlIChzcmMgPiAzMSkgc3JjIC09IDMyOwotCXdoaWxlIChzcmMgPCAtMzIpIHNyYyArPSAzMjsKLQlpZiAoc3JjID49IDApCi0JICB2YWx1ZSA9ICh1bnNpZ25lZDMyKXJiID4+IHNyYzsKLQllbHNlIGlmIChzcmMgPT0gLTMyKQotCSAgdmFsdWUgPSAwOwotCWVsc2UKLQkgIHZhbHVlID0gKHVuc2lnbmVkMzIpcmIgPDwgLXNyYzsKLQlXUklURTMyX1FVRVVFIChyYSwgdmFsdWUpOwotCi1fTE9HSUMsMTAwMTAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6U1JMCi0ic3JsIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fc3JsKF9TRCwgUmEsIFJiLCBSYyk7Ci1fTE9HSUMsMTAwMTAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSTCBpbW0KLSJzcmwgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19zcmwoX1NELCBSYSwgUmIsIGltbSk7Ci0KLQotCi0KLS8vIFNSTEhwCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zcmxoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCBpbnQgc3JjLCBpbnQgaGlnaAotCXVuc2lnbmVkMzIgdmFsdWU7Ci0Jd2hpbGUgKHNyYyA+IDMxKSBzcmMgLT0gMzI7Ci0Jd2hpbGUgKHNyYyA8IC0zMikgc3JjICs9IDMyOwotCWlmIChzcmMgPj0gMCkKLQkgIHZhbHVlID0gcmIgPj4gc3JjOwotCWVsc2UgaWYgKHNyYyA9PSAtMzIpCi0JICB2YWx1ZSA9IDA7Ci0JZWxzZQotCSAgdmFsdWUgPSByYiA8PCAtc3JjOwotCWlmIChoaWdoKQotCSAgV1JJVEUzMl9RVUVVRV9NQVNLIChyYSwgdmFsdWUgPDwgMTYsIDB4ZmZmZjAwMDApOwotCWVsc2UKLQkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlLCAweDAwMDBmZmZmKTsKLQotX0xPR0lDLDAwMTEscCwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkxIUAotInNybGglczxwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX3NybGgoX1NELCBSYSwgUmIsIFJjLCBwKTsKLV9MT0dJQywwMDExLHAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSTEhQIGltbQotInNybGglczxwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3NybGgoX1NELCBSYSwgUmIsIGltbSwgcCk7Ci0KLQotLy8gU1JMMkgKLQotX0xPR0lDLDEwMDExLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlNSTDJICi0ic3JsMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlzaWduZWQzMiBzcmNIID0gUmNIOwotCXNpZ25lZDMyIHNyY0wgPSBSY0w7Ci0Jd2hpbGUgKHNyY0ggPiAxNSkgc3JjSCAtPSAxNjsKLQl3aGlsZSAoc3JjSCA8IC0xNikgc3JjSCArPSAxNjsKLQl3aGlsZSAoc3JjTCA+IDE1KSBzcmNMIC09IDE2OwotCXdoaWxlIChzcmNMIDwgLTE2KSBzcmNMICs9IDE2OwotCWRvX3NybGgoX1NELCBSYSwgUmJIVSwgc3JjSCwgMSk7Ci0JZG9fc3JsaChfU0QsIFJhLCBSYkxVLCBzcmNMLCAwKTsKLV9MT0dJQywxMDAxMSwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6U1JMMkggaW1tCi0ic3JsMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlzaWduZWQzMiBzcmMgPSBpbW07Ci0Jd2hpbGUgKHNyYyA+IDE1KSBzcmMgLT0gMTY7Ci0Jd2hpbGUgKHNyYyA8IC0xNikgc3JjICs9IDE2OwotCWRvX3NybGgoX1NELCBSYSwgUmJIVSwgc3JjLCAxKTsKLQlkb19zcmxoKF9TRCwgUmEsIFJiTFUsIHNyYywgMCk7Ci0KLQotCi0KLS8vIFNUMkgKLQotdm9pZDo6ZnVuY3Rpb246OmdldF9ldmVuX3JlZzppbnQgKnJlZywgdW5zaWduZWQzMiAqcjAsIGNvbnN0IGNoYXIgKm5hbWUKLQlpZiAoKnJlZyAmIDEpCi0JICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsCi0JCQkgICAgIjB4JWx4OiVzIG9kZCByZWdpc3RlciAociVkKSB1c2VkIGluIG11bHRpLXdvcmQgc3RvcmUiLAotCQkJICAgIChsb25nKSBjaWEsIG5hbWUsICpyZWcpOwotCWlmICgqcmVnID09IDApCi0JICAqcjAgPSAwOwotCWVsc2UKLQkgICpyMCA9IEdQUlsqcmVnXTsKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3N0Mmg6aW50IHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCXVuc2lnbmVkMzIgdmFsX3JhOwotCXVuc2lnbmVkMzIgbWVtOwotCWdldF9ldmVuX3JlZyhfU0QsICZyYSwgJnZhbF9yYSwgIlNUMkgiKTsKLQltZW0gPSBJTlNFUlRFRDMyKHZhbF9yYSwgMCwgMTUpIHwKLQkgICAgICBJTlNFUlRFRDMyKEdQUltyYSArIDFdLCAxNiwgMzEpOwotCVNUT1JFKHJiICsgc3JjLCA0LCBtZW0pOwotCi1fSU1FTSwxMDAxMSxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUMkgKLSJzdDJoIHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAotInN0MmggcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19zdDJoKF9TRCwgUkEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOwotX0lNRU0sMTAwMTEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1QySCBsb25nCi0ic3QyaCByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX3N0MmgoX1NELCBSQSwgUmIsIGltbSk7Ci0KLQotCi0vLyBTVDJXCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zdDJ3OmludCByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQl1bnNpZ25lZDMyIHZhbF9yYTsKLQl1bnNpZ25lZDY0IG1lbTsKLQlnZXRfZXZlbl9yZWcoX1NELCAmcmEsICZ2YWxfcmEsICJTVDJXIik7Ci0JbWVtID0gSU5TRVJURUQ2NCh2YWxfcmEsIDAsIDMxKSB8IElOU0VSVEVENjQoR1BSW3JhICsgMV0sIDMyLCA2Myk7Ci0JU1RPUkUocmIgKyBzcmMsIDgsIG1lbSk7Ci0KLV9JTUVNLDEwMTEwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6U1QyVwotInN0MncgcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCi0ic3QydyByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgotCWRvX3N0MncoX1NELCBSQSwgUmIsIHNyYyk7Ci0JZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgOCk7Ci1fSU1FTSwxMDExMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpTVDJXIGxvbmcKLSJzdDJ3IHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCi0JZG9fc3QydyhfU0QsIFJBLCBSYiwgaW1tKTsKLQotCi0KLS8vIFNUNEhCCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zdDRoYjppbnQgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0JdW5zaWduZWQzMiB2YWxfcmE7Ci0JdW5zaWduZWQzMiBtZW07Ci0JZ2V0X2V2ZW5fcmVnKF9TRCwgJnJhLCAmdmFsX3JhLCAiU1Q0SEIiKTsKLQltZW0gPSBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHZhbF9yYSwgOCwgMTUpLCAwLCA3KSB8Ci0JICAgICAgSU5TRVJURUQzMihFWFRSQUNURUQzMih2YWxfcmEsIDI0LCAzMSksIDgsIDE1KSB8Ci0JICAgICAgSU5TRVJURUQzMihFWFRSQUNURUQzMihHUFJbcmEgKyAxXSwgOCwgMTUpLCAxNiwgMjMpIHwKLQkgICAgICBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKEdQUltyYSArIDFdLCAyNCwgMzEpLCAyNCwgMzEpOwotCVNUT1JFKHJiICsgc3JjLCA0LCBtZW0pOwotCi1fSU1FTSwxMDEwMSxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUNEhCCi0ic3Q0aGIgcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCi0ic3Q0aGIgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19zdDRoYihfU0QsIFJBLCBSYiwgc3JjKTsKLQlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA0KTsKLV9JTUVNLDEwMTAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OlNUNEhCIGxvbmcKLSJzdDRoYiByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX3N0NGhiKF9TRCwgUkEsIFJiLCBpbW0pOwotCi0KLQotLy8gU1RCCi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zdGI6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlTVE9SRShyYiArIHNyYywgMSwgRVhUUkFDVEVEMzIocmEsIDI0LCAzMSkpOwotCi1fSU1FTSwxMDAwMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUQgotInN0YiByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJzdGIgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19zdGIoX1NELCB2YWxfUmEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDEpOwotX0lNRU0sMTAwMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1RCIGxvbmcKLSJzdGIgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19zdGIoX1NELCB2YWxfUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gU1RICi0KLXZvaWQ6OmZ1bmN0aW9uOjpkb19zdGg6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKLQlTVE9SRShyYiArIHNyYywgMiwgRVhUUkFDVEVEMzIocmEsIDE2LCAzMSkpOwotCi1fSU1FTSwxMDAxMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUSAotInN0aCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJzdGggcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKLQlkb19zdGgoX1NELCB2YWxfUmEsIFJiLCBzcmMpOwotCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDIpOwotX0lNRU0sMTAwMTAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1RIIGxvbmcKLSJzdGggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKLQlkb19zdGgoX1NELCB2YWxfUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gU1RISAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fc3RoaDp1bnNpZ25lZDMyIHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCVNUT1JFKHJiICsgc3JjLCAyLCBFWFRSQUNURUQzMihyYSwgMCwgMTUpKTsKLQotX0lNRU0sMTAwMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpTVEhICi0ic3RoaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKLSJzdGhoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCi0JZG9fc3RoaChfU0QsIHZhbF9SYSwgUmIsIHNyYyk7Ci0JZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgMik7Ci1fSU1FTSwxMDAwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpTVEhIIGxvbmcKLSJzdGhoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCi0JZG9fc3RoaChfU0QsIHZhbF9SYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBTVFcKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3N0dzp1bnNpZ25lZDMyIHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYwotCVNUT1JFKHJiICsgc3JjLCA0LCByYSk7Ci0KLV9JTUVNLDEwMTAwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6U1RXCi0ic3R3IHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAotInN0dyByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgotCWRvX3N0dyhfU0QsIHZhbF9SYSwgUmIsIHNyYyk7Ci0JZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgNCk7Ci1fSU1FTSwxMDEwMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpTVFcgbG9uZwotInN0dyByPFJBPiwgQChyPFJCPiwgPGltbT4pIgotCWRvX3N0dyhfU0QsIHZhbF9SYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBTVUIKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3N1Yjp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KLQlBTFVfQkVHSU4ocmIpOwotCUFMVV9TVUJCKGltbSk7Ci0JQUxVX0VORChyYSk7Ci0KLV9JQUxVMSwwMDAxMCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpTVUIKLSJzdWIgcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19zdWIgKF9TRCwgUmEsIFJiLCBSYyk7Ci1fSUFMVTEsMDAwMTAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OlNVQiBpbW0KLSJzdWIgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19zdWIgKF9TRCwgUmEsIFJiLCBpbW0pOwotX0lBTFUxLDAwMDEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpTVUIgaW1tIGxvbmcKLSJzdWIgcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19zdWIgKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gU1VCMkgKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3N1YjJoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIGltbQotCXVuc2lnbmVkMTYgaGlnaCA9IFZIMl80KHJiKSAtIFZIMl80KGltbSk7Ci0JdW5zaWduZWQxNiBsb3cgID0gVkwyXzQocmIpIC0gVkwyXzQoaW1tKTsKLQlXUklURTMyX1FVRVVFIChyYSwgKGhpZ2ggPDwgMTYpIHwgbG93KTsKLQotX0lBTFUxLDAwMDExLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OlNVQjJICi0ic3ViMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKLQlkb19zdWIyaCAoX1NELCBSYSwgUmIsIFJjKTsKLV9JQUxVMSwwMDAxMSwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6U1VCMkggaW1tCi0ic3ViMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKLQlkb19zdWIyaCAoX1NELCBSYSwgUmIsIGltbUhMKTsKLV9JQUxVMSwwMDAxMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6U1VCMkggaW1tIGxvbmcKLSJzdWIyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3N1YjJoIChfU0QsIFJhLCBSYiwgaW1tKTsKLQotCi0KLS8vIFNVQkIKLQotdm9pZDo6ZnVuY3Rpb246OmRvX3N1YmI6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tCi0JQUxVX0JFR0lOKHJiKTsKLQlBTFVfU1VCQl9CKGltbSwgQUxVX0NBUlJZKTsKLQlBTFVfRU5EKHJhKTsKLQkKLV9JQUxVMSwwMDEwMSwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpTVUJCCi0ic3ViYiByPFJBPiwgcjxSQj4sIHI8UkM+IgotCWRvX3N1YmIgKF9TRCwgUmEsIFJiLCBSYyk7Ci1fSUFMVTEsMDAxMDEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OlNVQkIgaW1tCi0ic3ViYiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3N1YmIgKF9TRCwgUmEsIFJiLCBpbW0pOwotX0lBTFUxLDAwMTAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpTVUJCIGltbSBsb25nCi0ic3ViYiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3N1YmIgKF9TRCwgUmEsIFJiLCBpbW0pOwotCi0KLQotLy8gU1VCSHBwcAotCi12b2lkOjpmdW5jdGlvbjo6ZG9fc3ViaF9wcHA6aW50IHBwcCwgdW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCi0Jc3dpdGNoIChwcHApIHsKLQljYXNlIDB4MDogLyogTExMICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWTDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWTDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MTogLyogTExIICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWTDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWSDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MjogLyogTEhMICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWSDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWTDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MzogLyogTEhIICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWSDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWSDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4NDogLyogSExMICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWTDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWTDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4NTogLyogSExIICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWTDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWSDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4NjogLyogSEhMICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWSDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWTDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4NzogLyogSEhIICovCi0JICB7Ci0JICBBTFUxNl9CRUdJTihWSDJfNChyYikpOwotCSAgQUxVMTZfU1VCQihWSDJfNChzcmMpKTsKLQkgIEFMVTE2X0VORChyYSwgMSk7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiZG9fc3ViaF9wcHAgLSBpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2giKTsKLQl9Ci0KLV9JQUxVMSwxMSxwcHAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6U1VCSHBwcAotInN1YmglczxwcHA+IHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JZG9fc3ViaF9wcHAoX1NELCBwcHAsIFJhLCBSYiwgUmMpOwotX0lBTFUxLDExLHBwcCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6U1VCSHBwcCBpbW0KLSJzdWJoJXM8cHBwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3N1YmhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIGltbUhMKTsKLV9JQUxVMSwxMSxwcHAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OlNVQkhwcHAgaW1tIGxvbmcKLSJzdWJoJXM8cHBwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgotCWRvX3N1YmhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIGltbSk7Ci0KLQotCi0vLyBUUkFQCi0KLWFkZHJlc3Nfd29yZDo6ZnVuY3Rpb246OmRvX3RyYXA6YWRkcmVzc193b3JkIHRyYXBfdmVjdG9yLCBhZGRyZXNzX3dvcmQgbmlhCi0JLyogU3RlYWwgdHJhcCAzMSBmb3IgZG9pbmcgc3lzdGVtIGNhbGxzICovCi0JLyogU3lzdGVtIGNhbGxzIGFyZSBkZWZpbmVkIGluIGxpYmdsb3NzL2QzMHYvc3lzY2FsbC5oLiAgKi8KLQlpZiAodHJhcF92ZWN0b3IgPT0gRUlUX1ZCICsgMHgyMCArICgzMSA8PCAzKSkKLQkgIHsKLQkgICAgZW51bSB7IFBBUk0xID0gMiwgUEFSTTIsIFBBUk0zLCBQQVJNNCwgRlVOQyB9OwotCSAgICBpZiAoR1BSW0ZVTkNdID09IDEpCQkvKiBleGl0ICovCi0JICAgICAgewotCSAgICAgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIE5VTEwsIGNpYSwgc2ltX2V4aXRlZCwKLQkJICAJICAgICAgICAgR1BSW1BBUk0xXSk7Ci0JICAgICAgICByZXR1cm4gLTE7IC8qIGR1bW15ICovCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlDQl9TWVNDQUxMIHN5c2NhbGw7Ci0KLQkJQ0JfU1lTQ0FMTF9JTklUICgmc3lzY2FsbCk7Ci0JCXN5c2NhbGwuYXJnMSA9IEdQUltQQVJNMV07Ci0JCXN5c2NhbGwuYXJnMiA9IEdQUltQQVJNMl07Ci0JCXN5c2NhbGwuYXJnMyA9IEdQUltQQVJNM107Ci0JCXN5c2NhbGwuYXJnNCA9IEdQUltQQVJNNF07Ci0JCXN5c2NhbGwuZnVuYyA9IEdQUltGVU5DXTsKLQkJc3lzY2FsbC5wMSA9IChQVFIpIFNEOwotCQlzeXNjYWxsLnJlYWRfbWVtID0gZDMwdl9yZWFkX21lbTsKLQkJc3lzY2FsbC53cml0ZV9tZW0gPSBkMzB2X3dyaXRlX21lbTsKLQotCQlXUklURTMyX1FVRVVFICgmR1BSW1BBUk0xXSwKLQkJCSAgICAgICAoKGNiX3N5c2NhbGwgKFNUQVRFX0NBTExCQUNLIChTRCksICZzeXNjYWxsKQotCQkJCSA9PSBDQl9SQ19PSykKLQkJCQk/IHN5c2NhbGwucmVzdWx0Ci0JCQkJOiAtc3lzY2FsbC5lcnJjb2RlKSk7Ci0JCXJldHVybiBuaWE7Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKFRSQUNFX1RSQVBfUCkKLQkgIHsKLQkgICAgaW50IHJlZywgaTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiXG5UcmFwICVsZDpcbiIsIChsb25nKSAoKHRyYXBfdmVjdG9yIC0gKEVJVF9WQiArIDB4MjApKSA+PiAzKSk7Ci0JICAgIGZvciAocmVnID0gMDsgcmVnIDwgTlJfR0VORVJBTF9QVVJQT1NFX1JFR0lTVEVSUzsgcmVnICs9IDgpCi0JICAgICAgewotCQlzaW1faW9fZXByaW50ZiAoc2QsICJyJS4yZCAgLSByJS4yZDogIiwgcmVnLCByZWcrNyk7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiIDB4JS44bHgiLCAobG9uZykgR1BSW3JlZytpXSk7Ci0JCXNpbV9pb19lcHJpbnRmIChzZCwgIlxuIik7Ci0JICAgICAgfQotCi0JICAgIGZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZyArPSA4KQotCSAgICAgIHsKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiY3IlLjJkIC0gY3IlLjJkOiIsIHJlZywgcmVnKzcpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAweCUuOGx4IiwgKGxvbmcpIENSRUdbcmVnK2ldKTsKLQkJc2ltX2lvX2VwcmludGYgKHNkLCAiXG4iKTsKLQkgICAgICB9Ci0KLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiYTAgICAtIGExOiAgIik7Ci0JICAgIGZvciAocmVnID0gMDsgcmVnIDwgTlJfQUNDVU1VTEFUT1JTOyByZWcrKykKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgMHglLjhseCAweCUuOGx4IiwKLQkJCSAgICAgIChsb25nKUVYVFJBQ1RFRDY0KEFDQ1tyZWddLCAwLCAzMSksCi0JCQkgICAgICAobG9uZylFWFRSQUNURUQ2NChBQ0NbcmVnXSwgMzIsIDYzKSk7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlxuIik7Ci0KLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiZjAgICAtIGY3OiAgIik7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGYwKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0YwKSk7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGYxKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0YxKSk7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGYyKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0YyKSk7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGYzKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0YzKSk7Ci0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgIChzKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX1MpKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAgKHYpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfVikpOwotCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgICh2YSkgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19WQSkpOwotCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgICAoYykgJWRcbiIsIChpbnQpIFBTV19WQUwoUFNXX0MpKTsKLQotCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJwc3doOiAgICAgICAiKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAoc20pICVkIiwgKGludCkgUFNXX1ZBTChQU1dfU00pKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAoZWEpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfRUEpKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAoaWUpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfSUUpKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAocnApICVkIiwgKGludCkgUFNXX1ZBTChQU1dfUlApKTsKLQkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAobWQpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfTUQpKTsKLQotCSAgICBpZiAoUFNXX1ZBTChQU1dfREIpKQotCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGRiKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0RCKSk7Ci0KLQkgICAgaWYgKFBTV19WQUwoUFNXX0RTKSkKLQkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChkcykgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19EUykpOwotCi0JICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlxuIik7Ci0JICAgIHJldHVybiBuaWE7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZihQU1dfVkFMKFBTV19SUCkgJiYgUlBUX0UgPT0gY2lhKQotCSAgICAgIHsKLQkJV1JJVEUzMl9RVUVVRSAoJmJQQywgUlBUX1MpOwotCQlpZiAoUlBUX0MgPT0gMCkKLQkJICBQU1dfU0VUIChQU1dfUlAsIDApOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIFdSSVRFMzJfUVVFVUUgKCZiUEMsIGNpYSArIDgpOwotCSAgICBESURfVFJBUCA9IDE7Ci0JICAgIHJldHVybiB0cmFwX3ZlY3RvcjsKLQkgIH0KLQotX0JSQSwwMTAwMSwwMCw2LioqLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6VFJBUAotInRyYXAgcjxSQz4iCi0JbmlhID0gZG9fdHJhcCAoX1NELCBFSVRfVkIgKyAweDIwICsgTUFTS0VEMzIoUmMsIDI0LCAyOCksIG5pYSk7Ci1fQlJBLDAxMDAxLDEwLDYuKiosNi4qKixfSU1NNjpCUkE6c2hvcnQ6bXU6VFJBUCBpbW0KLSJ0cmFwIDxpbW0+IgotCW5pYSA9IGRvX3RyYXAgKF9TRCwgRUlUX1ZCICsgMHgyMCArIChpbW1fNSA8PCAzKSwgbmlhKTsKLQotCi0KLS8vIFhPUgotCi1fTE9HSUMsMTEwMTEsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6WE9SCi0ieG9yIHI8UkE+LCByPFJCPiwgcjxSQz4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiIF4gUmMpOwotX0xPR0lDLDExMDExLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpYT1IgaW1tCi0ieG9yIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiIF4gaW1tKTsKLV9MT0dJQywxMTAxMSwxMCw2LlJBLDYuUkIsX0lNTTMyOkxPR0lDOmxvbmc6aXUsbXU6WE9SIGltbSBsb25nCi0ieG9yIHI8UkE+LCByPFJCPiwgPGltbT4iCi0JV1JJVEUzMl9RVUVVRSAoUmEsIFJiIF4gaW1tKTsKLQotCi0KLS8vIFhPUkZHCi0KLV9MT0dJQywwMTAxMSwwMCwqKiosMy5GQSwqKiosMy5GQiwqKiosMy5GQzpMT0dJQzpzaG9ydDppdSxtdTpYT1JGRwotInhvcmZnIGY8RkE+LCBmPEZCPiwgZjxGQz4iCi0JUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCBQU1dfRkxBR19WQUwoRkIpIF4gUFNXX0ZMQUdfVkFMKEZDKSk7Ci1fTE9HSUMsMDEwMTEsMTAsKioqLDMuRkEsKioqLDMuRkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6WE9SRkcgaW1tCi0ieG9yZmcgZjxGQT4sIGY8RkI+LCA8aW1tXzY+IgotCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgUFNXX0ZMQUdfVkFMKEZCKSBeIChpbW1fNiAmIDEpKTsKLQotCi0KZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2RjLXNob3J0IGIvc2ltL2QzMHYvZGMtc2hvcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTFkZmEuLjAwMDAwMDAKLS0tIGEvc2ltL2QzMHYvZGMtc2hvcnQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLwotLy8gIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4gRDMwViBTaW11bGF0b3IuCi0vLyAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS8vICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zIEluYy4KLS8vCi0vLyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotLy8KLS8vICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotLy8gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0vLyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLS8vICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8KLS8vICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS8vICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLy8gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLS8vICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLy8KLS8vICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0vLyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLS8vCi1zd2l0Y2g6IDQ6IDEzOiA0OiAxMwpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvZW5naW5lLmMgYi9zaW0vZDMwdi9lbmdpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiYWFkMS4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi9lbmdpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgRU5HSU5FX0MKLSNkZWZpbmUgRU5HSU5FX0MKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZG9fc3RhY2tfc3dhcCAoU0lNX0RFU0Mgc2QpCi17Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotICB1bnNpZ25lZCBuZXdfc3AgPSAoUFNXX1ZBTChQU1dfU00pICE9IDApOwotICBpZiAoY3B1LT5yZWdzLmN1cnJlbnRfc3AgIT0gbmV3X3NwKQotICAgIHsKLSAgICAgIGNwdS0+cmVncy5zcFtjcHUtPnJlZ3MuY3VycmVudF9zcF0gPSBTUDsKLSAgICAgIGNwdS0+cmVncy5jdXJyZW50X3NwID0gbmV3X3NwOwotICAgICAgU1AgPSBjcHUtPnJlZ3Muc3BbY3B1LT5yZWdzLmN1cnJlbnRfc3BdOwotICAgIH0KLX0KLQotI2lmIFdJVEhfVFJBQ0UKLS8qIEltcGxlbWVudCBBTFUgdHJhY2luZyBvZiAzMi1iaXQgcmVnaXN0ZXJzLiAgKi8KLXN0YXRpYyB2b2lkCi10cmFjZV9hbHUzMiAoU0lNX0RFU0Mgc2QsCi0JICAgICBzaW1fY3B1ICpjcHUsCi0JICAgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgICAgdW5zaWduZWQzMiAqcHRyKQotewotICB1bnNpZ25lZDMyIHZhbHVlID0gKnB0cjsKLQotICBpZiAocHRyID49ICZHUFJbMF0gJiYgcHRyIDw9ICZHUFJbTlJfR0VORVJBTF9QVVJQT1NFX1JFR0lTVEVSU10pCi0gICAgdHJhY2Vfb25lX2luc24gKHNkLCBjcHUsIGNpYSwgMSwgImVuZ2luZS5jIiwgX19MSU5FX18sICJhbHUiLAotCQkgICAgIlNldCByZWdpc3RlciByJS0yZCA9IDB4JS44bHggKCVsZCkiLAotCQkgICAgcHRyIC0gJkdQUlswXSwgKGxvbmcpdmFsdWUsIChsb25nKXZhbHVlKTsKLQotICBlbHNlIGlmIChwdHIgPT0gJlBTVyB8fCBwdHIgPT0gJmJQU1cgfHwgcHRyID09ICZEUFNXKQotICAgIHRyYWNlX29uZV9pbnNuIChzZCwgY3B1LCBjaWEsIDEsICJlbmdpbmUuYyIsIF9fTElORV9fLCAiYWx1IiwKLQkJICAgICJTZXQgcmVnaXN0ZXIgJXMgPSAweCUuOGx4JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKLQkJICAgIChwdHIgPT0gJlBTVykgPyAicHN3IiA6ICgocHRyID09ICZiUFNXKSA/ICJicHN3IiA6ICJkcHN3IiksCi0JCSAgICAobG9uZyl2YWx1ZSwKLQkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19TTSkpID8gIiwgc20iIDogIiIsCi0JCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfRUEpKSA/ICIsIGVhIiA6ICIiLAotCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX0RCKSkgPyAiLCBkYiIgOiAiIiwKLQkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19EUykpID8gIiwgZHMiIDogIiIsCi0JCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfSUUpKSA/ICIsIGllIiA6ICIiLAotCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX1JQKSkgPyAiLCBycCIgOiAiIiwKLQkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19NRCkpID8gIiwgbWQiIDogIiIsCi0JCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfRjApKSA/ICIsIGYwIiA6ICIiLAotCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX0YxKSkgPyAiLCBmMSIgOiAiIiwKLQkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19GMikpID8gIiwgZjIiIDogIiIsCi0JCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfRjMpKSA/ICIsIGYzIiA6ICIiLAotCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX1MpKSAgPyAiLCBzIiAgOiAiIiwKLQkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19WKSkgID8gIiwgdiIgIDogIiIsCi0JCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfVkEpKSA/ICIsIHZhIiA6ICIiLAotCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX0MpKSAgPyAiLCBjIiAgOiAiIik7Ci0KLSAgZWxzZSBpZiAocHRyID49ICZDUkVHWzBdICYmIHB0ciA8PSAmQ1JFR1tOUl9DT05UUk9MX1JFR0lTVEVSU10pCi0gICAgdHJhY2Vfb25lX2luc24gKHNkLCBjcHUsIGNpYSwgMSwgImVuZ2luZS5jIiwgX19MSU5FX18sICJhbHUiLAotCQkgICAgIlNldCByZWdpc3RlciBjciVkID0gMHglLjhseCAoJWxkKSIsCi0JCSAgICBwdHIgLSAmQ1JFR1swXSwgKGxvbmcpdmFsdWUsIChsb25nKXZhbHVlKTsKLX0KLQotLyogSW1wbGVtZW50IEFMVSB0cmFjaW5nIG9mIDMyLWJpdCByZWdpc3RlcnMuICAqLwotc3RhdGljIHZvaWQKLXRyYWNlX2FsdTY0IChTSU1fREVTQyBzZCwKLQkgICAgIHNpbV9jcHUgKmNwdSwKLQkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICAgICB1bnNpZ25lZDY0ICpwdHIpCi17Ci0gIHVuc2lnbmVkNjQgdmFsdWUgPSAqcHRyOwotCi0gIGlmIChwdHIgPj0gJkFDQ1swXSAmJiBwdHIgPD0gJkFDQ1tOUl9BQ0NVTVVMQVRPUlNdKQotICAgIHRyYWNlX29uZV9pbnNuIChzZCwgY3B1LCBjaWEsIDEsICJlbmdpbmUuYyIsIF9fTElORV9fLCAiYWx1IiwKLQkJICAgICJTZXQgcmVnaXN0ZXIgYSUtMmQgPSAweCUuOGx4IDB4JS44bHgiLAotCQkgICAgcHRyIC0gJkFDQ1swXSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZDMyKSh2YWx1ZSA+PiAzMiksCi0JCSAgICAodW5zaWduZWQgbG9uZykodW5zaWduZWQzMil2YWx1ZSk7Ci0KLX0KLSNlbmRpZgotCi0vKiBQcm9jZXNzIGFsbCBvZiB0aGUgcXVldWVkIHVwIHdyaXRlcyBpbiBvcmRlciBub3cgKi8KLXZvaWQKLXVucXVldWVfd3JpdGVzIChTSU1fREVTQyBzZCwKLQkJc2ltX2NwdSAqY3B1LAotCQlhZGRyZXNzX3dvcmQgY2lhKQotewotICBpbnQgaSwgbnVtOwotICBpbnQgZGlkX3BzdyA9IDA7Ci0gIHVuc2lnbmVkMzIgKnBzd19hZGRyID0gJlBTVzsKLQotICBudW0gPSBXUklURTMyX05VTTsKLSAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkMzIgbWFzayA9IFdSSVRFMzJfTUFTSyAoaSk7Ci0gICAgICB1bnNpZ25lZDMyICpwdHIgPSBXUklURTMyX1BUUiAoaSk7Ci0gICAgICB1bnNpZ25lZDMyIHZhbHVlID0gKCpwdHIgJiB+bWFzaykgfCAoV1JJVEUzMl9WQUxVRSAoaSkgJiBtYXNrKTsKLSAgICAgIGludCBqOwotCi0gICAgICBpZiAocHRyID09IHBzd19hZGRyKQotICAgICAgIHsKLQkgLyogSWYgTVUgaW5zdHJ1Y3Rpb24gd2FzIG5vdCBhIE1WVFNZUywgcmVzb2x2ZSBQU1cKLSAgICAgICAgICAgICBjb250ZW50aW9uIGluIGZhdm91ciBvZiBJVS4gKi8KLQkgIGlmKCEgU1RBVEVfQ1BVIChzZCwgMCktPm12dHN5c19sZWZ0X3ApCi0JICAgIHsKLQkgICAgICAvKiBEZXRlY3QgY29udGVudGlvbiBpbiBwYXJhbGxlbCB3cml0ZXMgdG8gdGhlIHNhbWUgUFNXIGZsYWdzLgotCQkgVGhlIGhhcmR3YXJlIGFsbG93cyB0aGUgdXBkYXRlcyBmcm9tIElVIHRvIHByZXZhaWwgb3ZlcgotCQkgdGhvc2UgZnJvbSBNVS4gKi8KLQkgICAgICAKLQkgICAgICB1bnNpZ25lZDMyIGZsYWdfYml0cyA9Ci0JCUJJVDMyIChQU1dfRjApIHwgQklUMzIgKFBTV19GMSkgfAotCQlCSVQzMiAoUFNXX0YyKSB8IEJJVDMyIChQU1dfRjMpIHwKLQkJQklUMzIgKFBTV19TKSB8IEJJVDMyIChQU1dfVikgfAotCQlCSVQzMiAoUFNXX1ZBKSB8IEJJVDMyIChQU1dfQyk7Ci0JICAgICAgdW5zaWduZWQzMiBteV9mbGFnX2JpdHMgPSBtYXNrICYgZmxhZ19iaXRzOwotCSAgICAgIAotCSAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbnVtOyBqKyspCi0JCWlmIChXUklURTMyX1BUUiAoaikgPT0gcHN3X2FkZHIgJiYgLyogd3JpdGUgdG8gUFNXICovCi0JCSAgICBXUklURTMyX01BU0sgKGopICYgbXlfZmxhZ19iaXRzKSAgLyogc29tZSBvZiB0aGUgc2FtZSBmbGFncyAqLwotCQkgIHsKLQkJICAgIC8qIFJlY29tcHV0ZSBsb2NhbCBtYXNrICYgdmFsdWUsIHRvIHN1cHByZXNzIHRoaXMKLQkJICAgICAgIGVhcmxpZXIgd3JpdGUgdG8gdGhlIHNhbWUgZmxhZyBiaXRzLiAqLwotCQkgICAgCi0JCSAgICB1bnNpZ25lZDMyIG5ld19tYXNrID0gbWFzayAmIH4oV1JJVEUzMl9NQVNLIChqKSAmIG15X2ZsYWdfYml0cyk7Ci0JCSAgICAKLQkJICAgIC8qIFRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgVkEgKGFjY3VtdWxhdGVkCi0JCSAgICAgICBvdmVyZmxvdykgZmxhZywgaW4gdGhhdCBpdCBpcyBvbmx5IGluY2x1ZGVkIGluIHRoZQotCQkgICAgICAgc2Vjb25kIGluc3RydWN0aW9uJ3MgbWFzayBpZiB0aGUgb3ZlcmZsb3cKLQkJICAgICAgIG9jY3VycmVkLiAgWWV0IHRoZSBoYXJkd2FyZSBzdGlsbCBzdXBwcmVzc2VzIHRoZQotCQkgICAgICAgZmlyc3QgaW5zdHJ1Y3Rpb24ncyB1cGRhdGUgdG8gVkEuICBTbyB3ZSBrbHVkZ2UKLQkJICAgICAgIHRoaXMgYnkgaW5mZXJyaW5nIFBTV19WIC0+IFBTV19WQSBmb3IgdGhlIHNlY29uZAotCQkgICAgICAgaW5zdHJ1Y3Rpb24uICovCi0JCSAgICAKLQkJICAgIGlmIChXUklURTMyX01BU0sgKGopICYgQklUMzIgKFBTV19WKSkKLQkJICAgICAgewotCQkJbmV3X21hc2sgJj0gfkJJVDMyIChQU1dfVkEpOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIHZhbHVlID0gKCpwdHIgJiB+bmV3X21hc2spIHwgKFdSSVRFMzJfVkFMVUUgKGkpICYgbmV3X21hc2spOwotCQkgIH0KLQkgICAgfQotCSAgCi0gICAgICAgICBkaWRfcHN3ID0gMTsKLSAgICAgICB9Ci0KLSAgICAgICpwdHIgPSB2YWx1ZTsKLQotI2lmIFdJVEhfVFJBQ0UKLSAgICAgIGlmIChUUkFDRV9BTFVfUCAoY3B1KSkKLQl0cmFjZV9hbHUzMiAoc2QsIGNwdSwgY2lhLCBwdHIpOwotI2VuZGlmCi0gICAgfQotCi0gIG51bSA9IFdSSVRFNjRfTlVNOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQ2NCAqcHRyID0gV1JJVEU2NF9QVFIgKGkpOwotICAgICAgKnB0ciA9IFdSSVRFNjRfVkFMVUUgKGkpOwotCi0jaWYgV0lUSF9UUkFDRQotICAgICAgaWYgKFRSQUNFX0FMVV9QIChjcHUpKQotCXRyYWNlX2FsdTY0IChzZCwgY3B1LCBjaWEsIHB0cik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgV1JJVEUzMl9OVU0gPSAwOwotICBXUklURTY0X05VTSA9IDA7Ci0KLSAgaWYgKERJRF9UUkFQID09IDEpIC8qIG9yZGluYXJ5IHRyYXAgKi8KLSAgICB7Ci0gICAgICBiUFNXID0gUFNXOwotICAgICAgUFNXICY9IChCSVQzMiAoUFNXX0RCKSB8IEJJVDMyIChQU1dfU00pKTsKLSAgICAgIGRpZF9wc3cgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoRElEX1RSQVAgPT0gMikgLyogZGVidWcgdHJhcCAqLwotICAgIHsKLSAgICAgIERQU1cgPSBQU1c7Ci0gICAgICBQU1cgJj0gQklUMzIgKFBTV19EUyk7Ci0gICAgICBQU1cgfD0gQklUMzIgKFBTV19EUyk7Ci0gICAgICBkaWRfcHN3ID0gMTsKLSAgICB9Ci0gIERJRF9UUkFQID0gMDsKLQotICBpZiAoZGlkX3BzdykKLSAgICBkb19zdGFja19zd2FwIChzZCk7Ci19Ci0KLQotLyogU0lNVUxBVEUgSU5TVFJVQ1RJT05TLCB2YXJpb3VzIGRpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZQotICAgdGhpbmcgKi8KLQotc3RhdGljIGFkZHJlc3Nfd29yZAotZG9fbG9uZyAoU0lNX0RFU0Mgc2QsCi0JIGxfaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiwKLQkgYWRkcmVzc193b3JkIGNpYSkKLXsKLSAgYWRkcmVzc193b3JkIG5pYSA9IGxfaWRlY29kZV9pc3N1ZShzZCwKLQkJCQkgICAgIGluc3RydWN0aW9uLAotCQkJCSAgICAgY2lhKTsKLQotICB1bnF1ZXVlX3dyaXRlcyAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEpOwotICByZXR1cm4gbmlhOwotfQotCi1zdGF0aWMgYWRkcmVzc193b3JkCi1kb18yX3Nob3J0IChTSU1fREVTQyBzZCwKLQkgICAgc19pbnN0cnVjdGlvbl93b3JkIGluc24xLAotCSAgICBzX2luc3RydWN0aW9uX3dvcmQgaW5zbjIsCi0JICAgIGNwdV91bml0cyB1bml0LAotCSAgICBhZGRyZXNzX3dvcmQgY2lhKQotewotICBhZGRyZXNzX3dvcmQgbmlhOwotCi0gIC8qIHJ1biB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gKi8KLSAgU1RBVEVfQ1BVIChzZCwgMCktPnVuaXQgPSB1bml0OwotICBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wID0gMDsKLSAgU1RBVEVfQ1BVIChzZCwgMCktPm12dHN5c19sZWZ0X3AgPSAwOwotICBuaWEgPSBzX2lkZWNvZGVfaXNzdWUoc2QsCi0JCQlpbnNuMSwKLQkJCWNpYSk7Ci0KLSAgdW5xdWV1ZV93cml0ZXMgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhKTsKLQotICAvKiBPbmx5IGRvIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaWYgdGhlIFBDIGhhcyBub3QgY2hhbmdlZCAqLwotICBpZiAoKG5pYSA9PSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpICYmCi0gICAgICAoISBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wKSkgewotICAgIFNUQVRFX0NQVSAoc2QsIDApLT51bml0ID0gYW55X3VuaXQ7Ci0gICAgbmlhID0gc19pZGVjb2RlX2lzc3VlIChzZCwKLQkJCSAgIGluc24yLAotCQkJICAgY2lhKTsKLQotICAgIHVucXVldWVfd3JpdGVzIChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSk7Ci0gIH0KLQotICBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wID0gMDsKLSAgU1RBVEVfQ1BVIChzZCwgMCktPm12dHN5c19sZWZ0X3AgPSAwOwotICByZXR1cm4gbmlhOwotfQotCi1zdGF0aWMgYWRkcmVzc193b3JkCi1kb19wYXJhbGxlbCAoU0lNX0RFU0Mgc2QsCi0JICAgICBzX2luc3RydWN0aW9uX3dvcmQgbGVmdF9pbnNuLAotCSAgICAgc19pbnN0cnVjdGlvbl93b3JkIHJpZ2h0X2luc24sCi0JICAgICBhZGRyZXNzX3dvcmQgY2lhKQotewotICBhZGRyZXNzX3dvcmQgbmlhX2xlZnQ7Ci0gIGFkZHJlc3Nfd29yZCBuaWFfcmlnaHQ7Ci0gIGFkZHJlc3Nfd29yZCBuaWE7Ci0KLSAgLyogcnVuIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiAqLwotICBTVEFURV9DUFUgKHNkLCAwKS0+dW5pdCA9IG1lbW9yeV91bml0OwotICBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wID0gMDsKLSAgU1RBVEVfQ1BVIChzZCwgMCktPm12dHN5c19sZWZ0X3AgPSAwOwotICBuaWFfbGVmdCA9IHNfaWRlY29kZV9pc3N1ZShzZCwKLQkJCSAgICAgbGVmdF9pbnNuLAotCQkJICAgICBjaWEpOwotCi0gIC8qIHJ1biB0aGUgc2Vjb25kIGluc3RydWN0aW9uICovCi0gIFNUQVRFX0NQVSAoc2QsIDApLT51bml0ID0gaW50ZWdlcl91bml0OwotICBuaWFfcmlnaHQgPSBzX2lkZWNvZGVfaXNzdWUoc2QsCi0JCQkgICAgICByaWdodF9pbnNuLAotCQkJICAgICAgY2lhKTsKLQotICAvKiBtZXJnZSB0aGUgUEMncyAqLwotICBpZiAobmlhX2xlZnQgPT0gSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTKSB7Ci0gICAgaWYgKG5pYV9yaWdodCA9PSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpCi0gICAgICBuaWEgPSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1M7Ci0gICAgZWxzZQotICAgICAgbmlhID0gbmlhX3JpZ2h0OwotICB9Ci0gIGVsc2UgewotICAgIGlmIChuaWFfcmlnaHQgPT0gSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTKQotICAgICAgbmlhID0gbmlhX2xlZnQ7Ci0gICAgZWxzZSB7Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgInBhcmFsbGVsIGp1bXBzIik7Ci0gICAgICBuaWEgPSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1M7Ci0gICAgfQotICB9Ci0KLSAgdW5xdWV1ZV93cml0ZXMgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhKTsKLSAgcmV0dXJuIG5pYTsKLX0KLQotCi10eXBlZGVmIGVudW0gewotICBwX2luc24gPSAwLAotICBsb25nX2luc24gPSAzLAotICBsX3JfaW5zbiA9IDEsCi0gIHJfbF9pbnNuID0gMiwKLX0gaW5zdHJ1Y3Rpb25fdHlwZXM7Ci0KLVNUQVRJQ19JTkxJTkUgaW5zdHJ1Y3Rpb25fdHlwZXMKLWluc3RydWN0aW9uX3R5cGUobF9pbnN0cnVjdGlvbl93b3JkIGluc24pCi17Ci0gIGludCBmbTAgPSBNQVNLRUQ2NChpbnNuLCAwLCAwKSAhPSAwOwotICBpbnQgZm0xID0gTUFTS0VENjQoaW5zbiwgMzIsIDMyKSAhPSAwOwotICByZXR1cm4gKChmbTAgPDwgMSkgfCBmbTEpOwotfQotCi0KLQotdm9pZAotc2ltX2VuZ2luZV9ydW4gKFNJTV9ERVNDIHNkLAotCQlpbnQgbGFzdF9jcHVfbnIsCi0JCWludCBucl9jcHVzLAotCQlpbnQgc2lnZ25hbCkKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIGNpYSA9IFBDOwotICAgICAgYWRkcmVzc193b3JkIG5pYTsKLSAgICAgIGxfaW5zdHJ1Y3Rpb25fd29yZCBpbnNuID0gSU1FTShjaWEpOwotICAgICAgaW50IHJwX3dhc19zZXQ7Ci0gICAgICBpbnQgcnB0X2Nfd2FzX25vbnplcm87Ci0KLSAgICAgIC8qIEJlZm9yZSBleGVjdXRpbmcgdGhlIGluc3RydWN0aW9uLCB3ZSBuZWVkIHRvIHRlc3Qgd2hldGhlciBvcgotCSBub3QgUlBUX0MgaXMgZ3JlYXRlciB0aGFuIHplcm8sIGFuZCBzYXZlIHRoYXQgc3RhdGUgZm9yIHVzZQotCSBhZnRlciBleGVjdXRpbmcgdGhlIGluc3RydWN0aW9uLiAgSW4gcGFydGljdWxhciwgd2UgbmVlZCB0bwotCSBub3QgY2FyZSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBjaGFuZ2VzIFJQVF9DIGl0c2VsZi4gKi8KLQotICAgICAgcnB0X2Nfd2FzX25vbnplcm8gPSAoUlBUX0MgPiAwKTsKLQotICAgICAgLyogQmVmb3JlIGV4ZWN1dGluZyB0aGUgaW5zdHJ1Y3Rpb24sIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmCi0JIHdlIGhhdmUgdG8gZGVjcmVtZW50IFJQVF9DLCB0aGUgcmVwZWF0IGNvdW50IHJlZ2lzdGVyLiAgRG8gdGhpcwotCSBpZiBQQyA9PSBSUFRfRSwgYnV0IG9ubHkgaWYgd2UgYXJlIGluIGFuIGFjdGl2ZSByZXBlYXQgYmxvY2suICovCi0KLSAgICAgIGlmIChQQyA9PSBSUFRfRSAmJgotCSAgKFJQVF9DID4gMCB8fCBQU1dfVkFMIChQU1dfUlApICE9IDApKQotCXsKLQkgIFJQVF9DIC0tOwotCX0KLSAgICAgIAotICAgICAgLyogTm93IGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGF0IFBDICovCi0KLSAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb25fdHlwZSAoaW5zbikpCi0JewotCWNhc2UgbG9uZ19pbnNuOgotCSAgbmlhID0gZG9fbG9uZyAoc2QsIGluc24sIGNpYSk7Ci0JICBicmVhazsKLQljYXNlIHJfbF9pbnNuOgotCSAgLyogTCA8LSBSICovCi0JICBuaWEgPSBkb18yX3Nob3J0IChzZCwgaW5zbiwgaW5zbiA+PiAzMiwgaW50ZWdlcl91bml0LCBjaWEpOwotCSAgYnJlYWs7Ci0JY2FzZSBsX3JfaW5zbjoKLQkgIC8qIEwgLT4gUiAqLwotCSAgbmlhID0gZG9fMl9zaG9ydCAoc2QsIGluc24gPj4gMzIsIGluc24sIG1lbW9yeV91bml0LCBjaWEpOwotCSAgYnJlYWs7Ci0JY2FzZSBwX2luc246Ci0JICBuaWEgPSBkb19wYXJhbGxlbCAoc2QsIGluc24gPj4gMzIsIGluc24sIGNpYSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEsCi0JCQkgICAgImludGVybmFsIGVycm9yIC0gZW5naW5lX3J1bl91bnRpbF9zdG9wIC0gYmFkIHN3aXRjaCIpOwotCSAgbmlhID0gLTE7Ci0JfQotCi0gICAgICBpZiAoVFJBQ0VfQUNUSU9OKQotCXsKLQkgIGlmIChUUkFDRV9BQ1RJT04gJiBUUkFDRV9BQ1RJT05fQ0FMTCkKLQkgICAgY2FsbF9vY2N1cnJlZCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEsIG5pYSk7Ci0KLQkgIGlmIChUUkFDRV9BQ1RJT04gJiBUUkFDRV9BQ1RJT05fUkVUVVJOKQotCSAgICByZXR1cm5fb2NjdXJyZWQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLCBuaWEpOwotCi0JICBUUkFDRV9BQ1RJT04gPSAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgbm93IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBSUCBiaXQgaW4gdGhlIFBTVy4KLQkgVGhlcmUgYXJlIHRocmVlIGNvbmRpdGlvbnMgZm9yIHRoaXMsIHRoZSBSUCBiaXQgaXMgYWxyZWFkeQotCSBzZXQgKGp1c3QgYSBzcGVlZCBvcHRpbWl6YXRpb24pLCB0aGUgaW5zdHJ1Y3Rpb24gd2UganVzdAotCSBleGVjdXRlZCBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgbG9vcCwgYW5kIHRoZSByZXBlYXQKLQkgY291bnQgaXMgY3VycmVudGx5IHplcm8uICovCi0KLSAgICAgIHJwX3dhc19zZXQgPSBQU1dfVkFMIChQU1dfUlApOwotICAgICAgaWYgKHJwX3dhc19zZXQgJiYgKFBDID09IFJQVF9FKSAmJiBSUFRfQyA9PSAwKQotCXsKLQkgIFBTV19TRVQgKFBTV19SUCwgMCk7Ci0JfQotCi0gICAgICAvKiBOb3cgdXBkYXRlIHRoZSBQQy4gIElmIHdlIGp1c3QgZXhlY3V0ZWQgYSBqdW1wIGluc3RydWN0aW9uLAotCSB0aGF0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBldmVyeXRoaW5nIGVsc2UuICBOZXh0IGNvbWVzCi0JIGJyYW5jaGluZyBiYWNrIHRvIFJQVF9TIGFzIGEgcmVzdWx0IG9mIGEgbG9vcC4gIEZpbmFsbHksIHRoZQotCSBkZWZhdWx0IGlzIHRvIHNpbXBseSBhZHZhbmNlIHRvIHRoZSBuZXh0IGlubGluZQotCSBpbnN0cnVjdGlvbi4gKi8KLQotICAgICAgaWYgKG5pYSAhPSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpCi0JewotCSAgUEMgPSBuaWE7Ci0JfQotICAgICAgZWxzZSBpZiAocnBfd2FzX3NldCAmJiBycHRfY193YXNfbm9uemVybyAmJiAoUEMgPT0gUlBUX0UpKQotCXsKLQkgIFBDID0gUlBUX1M7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFBDID0gY2lhICsgODsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIGZvciBEREJUIChkZWJ1Z2dlciBkZWJ1ZyB0cmFwKSBjb25kaXRpb24uICBEbyB0aGlzIGFmdGVyCi0JIHRoZSByZXBlYXQgYmxvY2sgY2hlY2tzIHNvIHRoZSBleGN1cnNpb24gdG8gdGhlIHRyYXAgaGFuZGxlciBkb2VzCi0JIG5vdCBhbHRlciBsb29waW5nIHN0YXRlLiAqLwotCi0gICAgICBpZiAoY2lhID09IElCQSAmJiBQU1dfVkFMIChQU1dfREIpKQotCXsKLQkgIERQQyA9IFBDOwotCSAgUFNXX1NFVCAoUFNXX0VBLCAxKTsKLQkgIERQU1cgPSBQU1c7Ci0JICAvKiBjbGVhciBhbGwgYml0cyBpbiBQU1cgZXhjZXB0IFNNICovCi0JICBQU1cgJj0gQklUMzIgKFBTV19TTSk7Ci0JICAvKiBhZGQgRFMgYml0ICovCi0JICBQU1cgfD0gQklUMzIgKFBTV19EUyk7Ci0JICAvKiBkaXNwYXRjaCB0byBEREJUIGhhbmRsZXIgKi8KLQkgIFBDID0gMHhmZmZmZjEyODsgLyogZGVidWdnZXJfZGVidWdfdHJhcF9hZGRyZXNzICovCi0JfQotCi0gICAgICAvKiBwcm9jZXNzIGFueSBldmVudHMgKi8KLSAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIEwtPlIgb3IgTDwtUiBpbnNucyBjb3VudCBhcyB0d28gY3ljbGVzPyAqLwotICAgICAgaWYgKHNpbV9ldmVudHNfdGljayAoc2QpKQotCXsKLQkgIHNpbV9ldmVudHNfcHJvY2VzcyAoc2QpOwotCX0KLSAgICB9ICAKLX0KLQotCi0vKiBkMzB2IGV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyLgotCi0gICBOb3RlOiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIHByb3BlciBpbnRlcnJ1cHQgZGVsaXZlcnkKLSAgIG1lY2hhbmlzbS4gIFRoaXMgaW50ZXJydXB0IG1lY2hhbmlzbSBkaXNjYXJkcyBsYXRlciBpbnRlcnJ1cHRzIGlmCi0gICBhbiBlYXJsaWVyIGludGVycnVwdCBoYXNuJ3QgYmVlbiBkZWxpdmVyZWQuCi0KLSAgIE5vdGU6IFRoaXMgaW50ZXJydXB0IG1lY2hhbmlzbSBkb2VzIG5vdCByZXNldCBpdHMgc2VsZiB3aGVuIHRoZQotICAgc2ltdWxhdG9yIGlzIHJlLW9wZW5lZC4gKi8KLQotdm9pZAotZDMwdl9pbnRlcnJ1cHRfZXZlbnQgKFNJTV9ERVNDIHNkLAotCQkgICAgICB2b2lkICpkYXRhKQotewotICBpZiAoUFNXX1ZBTCAoUFNXX0lFKSkKLSAgICAvKiBpbnRlcnJ1cHRzIG5vdCBtYXNrZWQgKi8KLSAgICB7Ci0gICAgICAvKiBzY3J1YiBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KLSAgICAgIGlmIChzZC0+cGVuZGluZ19pbnRlcnJ1cHQgIT0gTlVMTCkKLQlzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKHNkLCBzZC0+cGVuZGluZ19pbnRlcnJ1cHQpOwotICAgICAgLyogZGVsaXZlciAqLwotICAgICAgYlBTVyA9IFBTVzsKLSAgICAgIGJQQyA9IFBDOwotICAgICAgUFNXID0gMDsKLSAgICAgIFBDID0gMHhmZmZmZjEzODsgLyogZXh0ZXJuYWwgaW50ZXJydXB0ICovCi0gICAgICBkb19zdGFja19zd2FwIChzZCk7Ci0gICAgfQotICBlbHNlIGlmIChzZC0+cGVuZGluZ19pbnRlcnJ1cHQgPT0gTlVMTCkKLSAgICAvKiBpbnRlcnJ1cHRzIG1hc2tlZCBhbmQgbm8gaW50ZXJydXB0IHBlbmRpbmcgKi8KLSAgICB7Ci0gICAgICBzZC0+cGVuZGluZ19pbnRlcnJ1cHQgPSBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgMSwKLQkJCQkJCSAgIGQzMHZfaW50ZXJydXB0X2V2ZW50LAotCQkJCQkJICAgZGF0YSk7Ci0gICAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2ljLWQzMHYgYi9zaW0vZDMwdi9pYy1kMzB2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGExODRmLi4wMDAwMDAwCi0tLSBhL3NpbS9kMzB2L2ljLWQzMHYKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jIEluc3RydWN0aW9uIGNhY2hlIHJ1bGVzCi0jCi0jICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi1jb21wdXRlOlJBOlJBOjoKLWNvbXB1dGU6UkE6UmE6c2lnbmVkMzIgKjooJkdQUltSQV0pCi1jb21wdXRlOlJBOlJhSDpzaWduZWQxNiAqOkFIMl80KFJhKQotY29tcHV0ZTpSQTpSYUw6c2lnbmVkMTYgKjpBTDJfNChSYSkKLWNvbXB1dGU6UkE6dmFsX1JhOnNpZ25lZDMyOihSQSA9PSAwID8gMCA6IEdQUltSQV0pCi0jCi1jb21wdXRlOlJCOlJCOjoKLWNvbXB1dGU6UkI6UmI6c2lnbmVkMzI6KFJCID09IDAgPyAwIDogR1BSW1JCXSkKLWNvbXB1dGU6UkI6UmJVOnVuc2lnbmVkMzI6KFJCID09IDAgPyAwIDogR1BSW1JCXSkKLWNvbXB1dGU6UkI6UmJIOnNpZ25lZDE2OlZIMl80KFJiKQotY29tcHV0ZTpSQjpSYkw6c2lnbmVkMTY6VkwyXzQoUmIpCi1jb21wdXRlOlJCOlJiSFU6dW5zaWduZWQxNjpWSDJfNChSYikKLWNvbXB1dGU6UkI6UmJMVTp1bnNpZ25lZDE2OlZMMl80KFJiKQotIwotY29tcHV0ZTpSQzpSQzo6Ci1jb21wdXRlOlJDOlJjOnNpZ25lZDMyOihSQyA9PSAwID8gMCA6IEdQUltSQ10pCi1jb21wdXRlOlJDOlJjVTp1bnNpZ25lZDMyOihSQyA9PSAwID8gMCA6IEdQUltSQ10pCi1jb21wdXRlOlJDOlJjSDpzaWduZWQxNjpWSDJfNChSYykKLWNvbXB1dGU6UkM6UmNMOnNpZ25lZDE2OlZMMl80KFJjKQotIwotIwotY29tcHV0ZTpJTU1fNlM6SU1NXzZTOjoKLWNvbXB1dGU6SU1NXzZTOmltbTpzaWduZWQzMjpTRVhUMzIoSU1NXzZTLCAzMiAtIDYpCi0jIE5CIC0gZm9yIHNob3J0IGltbVtITF0gYXJlIHRoZSBzYW1lIHZhbHVlCi1jb21wdXRlOklNTV82UzppbW1ITDpzaWduZWQzMjooKGltbSA8PCAxNikgfCBNQVNLRUQzMihpbW0sIDE2LCAzMSkpCi1jb21wdXRlOklNTV82UzppbW1IOnNpZ25lZDMyOmltbQotY29tcHV0ZTpJTU1fNlM6aW1tTDpzaWduZWQzMjppbW0KLWNvbXB1dGU6SU1NXzZTOmltbV82OnNpZ25lZDMyOklNTV82UwotY29tcHV0ZTpJTU1fNlM6aW1tXzU6c2lnbmVkMzI6TFNNQVNLRUQzMihJTU1fNlMsIDQsIDApCi1jb21wdXRlOklNTV82UzppbW1fNnU6dW5zaWduZWQzMjooSU1NXzZTICYgMHgzZikKLSMKLWNvbXB1dGU6UkM6cGNkaXNwOnNpZ25lZDMyOihSYyAmIH4weDcpCi1jb21wdXRlOlJDOnBjYWRkcjpzaWduZWQzMjpwY2Rpc3AKLSMKLWNvbXB1dGU6SU1NXzE4UzpJTU1fMThTOjoKLWNvbXB1dGU6SU1NXzE4UzpwY2Rpc3A6c2lnbmVkMzI6KFNFWFQzMihJTU1fMThTLCAzMiAtIDE4KSA8PCAzKQotY29tcHV0ZTpJTU1fMThTOnBjYWRkcjpzaWduZWQzMjpwY2Rpc3AKLWNvbXB1dGU6SU1NXzEyUzpJTU1fMTJTOjoKLWNvbXB1dGU6SU1NXzEyUzpwY2Rpc3A6c2lnbmVkMzI6KFNFWFQzMihJTU1fMTJTLCAzMiAtIDEyKSA8PCAzKQotY29tcHV0ZTpJTU1fMTJTOnBjYWRkcjpzaWduZWQzMjpwY2Rpc3AKLSMKLWNvbXB1dGU6SU1NXzhMOklNTV84TDo6Ci1jb21wdXRlOklNTV8xOEw6SU1NXzE4TDo6Ci1jb21wdXRlOklNTV82TDpJTU1fNkw6OgotY29tcHV0ZTpJTU1fNkw6aW1tOnNpZ25lZDMyOigoKChJTU1fNkwgPDwgOCkgfCBJTU1fOEwpIDw8IDE4KSB8IElNTV8xOEwpCi1jb21wdXRlOklNTV82TDppbW1ITDpzaWduZWQzMjppbW0KLWNvbXB1dGU6SU1NXzZMOmltbUg6c2lnbmVkMzI6RVhUUkFDVEVEMzIoaW1tLCAwLCAxNSkKLWNvbXB1dGU6SU1NXzZMOmltbUw6c2lnbmVkMzI6RVhUUkFDVEVEMzIoaW1tLCAxNiwgMzEpCi1jb21wdXRlOklNTV82TDpwY2Rpc3A6c2lnbmVkMzI6KGltbSAmIH4weDcpCi1jb21wdXRlOklNTV82TDpwY2FkZHI6c2lnbmVkMzI6cGNkaXNwCi0jCi0jCi1jb21wdXRlOlNSQ182OlNSQ182OjoKLWNvbXB1dGU6U1JDXzY6c3JjOnVuc2lnbmVkMzI6KFhYID09IDIgPyBTRVhUMzIoU1JDXzYsIDMyIC0gNikgOiBHUFJbU1JDXzZdKQotIwotIwotY29tcHV0ZTpBQTpBQTo6Ci1jb21wdXRlOkFBOkFhOnVuc2lnbmVkNjQqOigoQ1BVKS0+cmVncy5hY2N1bXVsYXRvciArIEFBKQotY29tcHV0ZTpBQjpBQjo6Ci1jb21wdXRlOkFCOkFiOnVuc2lnbmVkNjQqOigoQ1BVKS0+cmVncy5hY2N1bXVsYXRvciArIEFCKQpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvc2ltLWNhbGxzLmMgYi9zaW0vZDMwdi9zaW0tY2FsbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxOTUyOS4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi9zaW0tY2FsbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic2ltLXV0aWxzLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0bWVtX3NpemUgPSAxMDI0KjEwMjQqODsJLyogOCBtZWcgaXMgdGhlIG1heGltdW0gbGlzdGVkIGluIHRoZSBhcmNoLiBtYW51YWwgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRfaW5zbl9uYW1lIChzaW1fY3B1ICosIGludCk7Ci0KLSNkZWZpbmUgU0lNX0FERFIgdW5zaWduZWQKLQotCi0jZGVmaW5lIE9QVElPTl9UUkFDRV9DQUxMCTIwMAotI2RlZmluZSBPUFRJT05fVFJBQ0VfVFJBUERVTVAJMjAxCi0jZGVmaW5lIE9QVElPTl9FWFRNRU1fU0laRQkyMDIKLQotc3RhdGljIFNJTV9SQwotZDMwdl9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgc2ltX2NwdSAqY3B1LAotCQkgICAgIGludCBvcHQsCi0JCSAgICAgY2hhciAqYXJnLAotCQkgICAgIGludCBjb21tYW5kX3ApCi17Ci0gIGNoYXIgKnN1ZmZpeDsKLQotICBzd2l0Y2ggKG9wdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfQ0FMTDoKLSAgICAgIGlmIChhcmcgPT0gTlVMTCB8fCBzdHJjbXAgKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wIChhcmcsICJvbiIpID09IDApCi0JVFJBQ0VfQ0FMTF9QID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMCkKLQlUUkFDRV9DQUxMX1AgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVucmVjb25pemVkIC0tdHJhY2UtY2FsbCBvcHRpb24gYCVzJ1xuIiwgYXJnKTsKLQkgIHJldHVybiBTSU1fUkNfRkFJTDsKLQl9Ci0gICAgICByZXR1cm4gU0lNX1JDX09LOwotCi0gICAgY2FzZSBPUFRJT05fVFJBQ0VfVFJBUERVTVA6Ci0gICAgICBpZiAoYXJnID09IE5VTEwgfHwgc3RyY21wIChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAib24iKSA9PSAwKQotCVRSQUNFX1RSQVBfUCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgIm9mZiIpID09IDApCi0JVFJBQ0VfVFJBUF9QID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJVbnJlY29uaXplZCAtLXRyYWNlLWNhbGwgb3B0aW9uIGAlcydcbiIsIGFyZyk7Ci0JICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0JfQotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQotICAgIGNhc2UgT1BUSU9OX0VYVE1FTV9TSVpFOgotICAgICAgaWYgKGFyZyA9PSBOVUxMIHx8ICFpc2RpZ2l0ICgqYXJnKSkKLQl7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJJbnZhbGlkIG1lbW9yeSBzaXplIGAlcyciLCBhcmcpOwotCSAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCX0KLQotICAgICAgc3VmZml4ID0gYXJnOwotICAgICAgZXh0bWVtX3NpemUgPSBzdHJ0b2wgKGFyZywgJnN1ZmZpeCwgMCk7Ci0gICAgICBpZiAoKnN1ZmZpeCA9PSAnbScgfHwgKnN1ZmZpeCA9PSAnTScpCi0JZXh0bWVtX3NpemUgPDw9IDIwOwotICAgICAgZWxzZSBpZiAoKnN1ZmZpeCA9PSAnaycgfHwgKnN1ZmZpeCA9PSAnSycpCi0JZXh0bWVtX3NpemUgPDw9IDEwOwotICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBkZWxldGUgMHg4MDAwMDAwMCIpOwotICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHg4MDAwMDAwMCwweCVseCIsIGV4dG1lbV9zaXplKTsKLQotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLSAgICB9Ci0KLSAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBvcHRpb24gKCVkKVxuIiwgb3B0KTsKLSAgcmV0dXJuIFNJTV9SQ19GQUlMOwotfQotCi1zdGF0aWMgY29uc3QgT1BUSU9OIGQzMHZfb3B0aW9uc1tdID0KLXsKLSAgeyB7InRyYWNlLWNhbGwiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0NBTEx9LAotICAgICAgJ1wwJywgIm9ufG9mZiIsICJFbmFibGUgdHJhY2luZyBvZiBjYWxscyBhbmQgcmV0dXJucywgY2hlY2tpbmcgc2F2ZWQgcmVnaXN0ZXJzIiwKLSAgICAgIGQzMHZfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7InRyYWNlLXRyYXBkdW1wIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9UUkFQRFVNUH0sCi0gICAgICAnXDAnLCAib258b2ZmIiwKLSNpZiBUUkFQRFVNUAotICAgICJUcmFwcyAwLi4zMCBkdW1wIG91dCBhbGwgb2YgdGhlIHJlZ2lzdGVycyAoZGVmYXVsdHMgb24pIiwKLSNlbHNlCi0gICAgIlRyYXBzIDAuLjMwIGR1bXAgb3V0IGFsbCBvZiB0aGUgcmVnaXN0ZXJzIiwKLSNlbmRpZgotICAgICAgZDMwdl9vcHRpb25faGFuZGxlciB9LAotICB7IHsiZXh0bWVtLXNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYVE1FTV9TSVpFfSwKLSAgICAnXDAnLCAic2l6ZSIsICJDaGFuZ2Ugc2l6ZSBvZiBleHRlcm5hbCBtZW1vcnksIGRlZmF1bHQgOCBtZWciLAotICAgIGQzMHZfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KLX07Ci0KLS8qIFJldHVybiBuYW1lIG9mIGFuIGluc24sIHVzZWQgYnkgaW5zbiBwcm9maWxpbmcuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfaW5zbl9uYW1lIChzaW1fY3B1ICpjcHUsIGludCBpKQotewotICByZXR1cm4gaXRhYmxlW2ldLm5hbWU7Ci19Ci0KLS8qIFN0cnVjdHVyZXMgdXNlZCBieSB0aGUgc2ltdWxhdG9yLCBmb3IgZ2RiIGp1c3QgaGF2ZSBzdGF0aWMgc3RydWN0dXJlcyAqLwotCi1TSU1fREVTQwotc2ltX29wZW4gKFNJTV9PUEVOX0tJTkQga2luZCwKLQkgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLAotCSAgc3RydWN0IF9iZmQgKmFiZmQsCi0JICBjaGFyICoqYXJndikKLXsKLSAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKLQotICAvKiBGSVhNRTogd2F0Y2hwb2ludHMgY29kZSBzaG91bGRuJ3QgbmVlZCB0aGlzICovCi0gIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjID0gJihQQyk7Ci0gIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyA9IHNpemVvZiAoUEMpOwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfaGFuZGxlciA9IGQzMHZfaW50ZXJydXB0X2V2ZW50OwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lY2hhbmlzbSBmb3IgZG9pbmcgaW5zbiBwcm9maWxpbmcuICAqLwotICBDUFVfSU5TTl9OQU1FIChTVEFURV9DUFUgKHNkLCAwKSkgPSBnZXRfaW5zbl9uYW1lOwotICBDUFVfTUFYX0lOU05TIChTVEFURV9DUFUgKHNkLCAwKSkgPSBucl9pdGFibGVfZW50cmllczsKLQotI2lmZGVmIFRSQVBEVU1QCi0gIFRSQUNFX1RSQVBfUCA9IFRSQVBEVU1QOwotI2VuZGlmCi0KLSAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQotICAgIHJldHVybiAwOwotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIGQzMHZfb3B0aW9ucyk7Ci0KLSAgLyogTWVtb3J5IGFuZCBFRVBST00gKi8KLSAgLyogaW50ZXJuYWwgaW5zdHJ1Y3Rpb24gUkFNIC0gZml4ZWQgKi8KLSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMCwweDEwMDAwIik7Ci0gIC8qIGludGVybmFsIGRhdGEgUkFNIC0gZml4ZWQgKi8KLSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHgyMDAwMDAwMCwweDgwMDAiKTsKLSAgLyogY29udHJvbCByZWdpc3RlciBkdW1teSBhcmVhICovCi0gIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4NDAwMDAwMDAsMHgxMDAwMCIpOwotICAvKiBleHRlcm5hbCBSQU0gKi8KLSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHg4MDAwMDAwMCwweCVseCIsIGV4dG1lbV9zaXplKTsKLSAgLyogRUlUIFJBTSAqLwotICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAweGZmZmZmMDAwLDB4MTAwMCIpOwotCi0gIC8qIGdldG9wdCB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHNvIHdlIGp1c3QgaGF2ZSB0byBleGl0IGlmIHRoaXMgZmFpbHMuCi0gICAgIEZJWE1FOiBIbW1tLi4uICBpbiB0aGUgY2FzZSBvZiBnZGIgd2UgbmVlZCBnZXRvcHQgdG8gY2FsbAotICAgICBwcmludF9maWx0ZXJlZC4gICovCi0gIGlmIChzaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAotCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCi0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIGNoZWNrIGZvci9lc3RhYmxpc2ggdGhlIGEgcmVmZXJlbmNlIHByb2dyYW0gaW1hZ2UgKi8KLSAgaWYgKHNpbV9hbmFseXplX3Byb2dyYW0gKHNkLAotCQkJICAgKFNUQVRFX1BST0dfQVJHViAoc2QpICE9IE5VTEwKLQkJCSAgICA/ICpTVEFURV9QUk9HX0FSR1YgKHNkKQotCQkJICAgIDogTlVMTCksCi0JCQkgICBhYmZkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBlc3RhYmxpc2ggYW55IHJlbWFpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KLSAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc2ltX3Bvc3RfYXJndl9pbml0IChzZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MsCi0JIGZpbGUgZGVzY3JpcHRvciBsZWFrcywgZXRjLiAgKi8KLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHNkOwotfQotCi0KLXZvaWQKLXNpbV9jbG9zZSAoU0lNX0RFU0Mgc2QsIGludCBxdWl0dGluZykKLXsKLSAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKLSAgICAgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLwotICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotfQotCi0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoU0lNX0RFU0Mgc2QsCi0JCSAgICAgc3RydWN0IF9iZmQgKmFiZmQsCi0JCSAgICAgY2hhciAqKmFyZ3YsCi0JCSAgICAgY2hhciAqKmVudnApCi17Ci0gIC8qIGNsZWFyIGFsbCByZWdpc3RlcnMgKi8KLSAgbWVtc2V0ICgmU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MsIDAsIHNpemVvZiAoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MpKTsKLSAgRUlUX1ZCID0gRUlUX1ZCX0RFRkFVTFQ7Ci0gIFNUQVRFX0NQVSAoc2QsIDApLT51bml0ID0gYW55X3VuaXQ7Ci0gIHNpbV9tb2R1bGVfaW5pdCAoc2QpOwotICBpZiAoYWJmZCAhPSBOVUxMKQotICAgIFBDID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZWxzZQotICAgIFBDID0gMHhmZmZmZjAwMDsgLyogcmVzZXQgdmFsdWUgKi8KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpCi17Ci0gIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCi0gICAgc2ltX2lvX3ByaW50ZiAoc2QsICJVbmtub3duIGNvbW1hbmQgYCVzJ1xuIiwgY21kKTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBkZWZpbml0aW9ucyB3ZXJlIHJpcHBlZCBvZmYgZnJvbQotICAgZ2RiL2NvbmZpZy90bS1kMzB2LmguICBJZiBhbnkgb2YgdGhvc2UgZGVmcyBjaGFuZ2VzLCB0aGlzIHRhYmxlIG5lZWRzIHRvCi0gICBiZSB1cGRhdGVkLiAgKi8KLQotI2RlZmluZSBOVU1fUkVHUyA4NgotCi0jZGVmaW5lIFIwX1JFR05VTQkwCi0jZGVmaW5lIEZQX1JFR05VTQkxMQotI2RlZmluZSBMUl9SRUdOVU0gCTYyCi0jZGVmaW5lIFNQX1JFR05VTSAJNjMKLSNkZWZpbmUgU1BJX1JFR05VTQk2NAkvKiBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotI2RlZmluZSBTUFVfUkVHTlVNCTY1CS8qIFVzZXIgc3RhY2sgcG9pbnRlciAqLwotI2RlZmluZSBDUkVHU19TVEFSVAk2NgotCi0jZGVmaW5lIFBTV19SRUdOVU0gCShDUkVHU19TVEFSVCArIDApIC8qIHBzdywgYnBzdywgb3IgZHBzdz8/PyAqLwotI2RlZmluZSAgICBQU1dfU00gMHg4MDAwMDAwMAkvKiBTdGFjayBtb2RlOiAwID09IGludGVycnVwdCAoU1BJKSwKLQkJCQkJICAgICAgIDEgPT0gdXNlciAoU1BVKSAqLwotI2RlZmluZSBCUFNXX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxKSAvKiBCYWNrdXAgUFNXIChvbiBpbnRlcnJ1cHQpICovCi0jZGVmaW5lIFBDX1JFR05VTSAJKENSRUdTX1NUQVJUICsgMikgLyogcGMsIGJwYywgb3IgZHBjPz8/ICovCi0jZGVmaW5lIEJQQ19SRUdOVU0gCShDUkVHU19TVEFSVCArIDMpIC8qIEJhY2t1cCBQQyAob24gaW50ZXJydXB0KSAqLwotI2RlZmluZSBEUFNXX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA0KSAvKiBCYWNrdXAgUFNXIChvbiBkZWJ1ZyB0cmFwKSAqLwotI2RlZmluZSBEUENfUkVHTlVNIAkoQ1JFR1NfU1RBUlQgKyA1KSAvKiBCYWNrdXAgUEMgKG9uIGRlYnVnIHRyYXApICovCi0jZGVmaW5lIFJQVF9DX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA3KSAvKiBMb29wIGNvdW50ICovCi0jZGVmaW5lIFJQVF9TX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA4KSAvKiBMb29wIHN0YXJ0IGFkZHJlc3MqLwotI2RlZmluZSBSUFRfRV9SRUdOVU0JKENSRUdTX1NUQVJUICsgOSkgLyogTG9vcCBlbmQgYWRkcmVzcyAqLwotI2RlZmluZSBNT0RfU19SRUdOVU0JKENSRUdTX1NUQVJUICsgMTApCi0jZGVmaW5lIE1PRF9FX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxMSkKLSNkZWZpbmUgSUJBX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxNCkgLyogSW5zdHJ1Y3Rpb24gYnJlYWsgYWRkcmVzcyAqLwotI2RlZmluZSBFSVRfVkJfUkVHTlVNCShDUkVHU19TVEFSVCArIDE1KSAvKiBWZWN0b3IgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIElOVF9TX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxNikgLyogSW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZSBJTlRfTV9SRUdOVU0JKENSRUdTX1NUQVJUICsgMTcpIC8qIEludGVycnVwdCBtYXNrICovCi0jZGVmaW5lIEEwX1JFR05VTSAJODQKLSNkZWZpbmUgQTFfUkVHTlVNIAk4NQotCi1pbnQKLXNpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJlZ25vLCBidWYsIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCByZWdubzsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICBpZiAocmVnbm8gPCBBMF9SRUdOVU0pCi0gICAgewotICAgICAgdW5zaWduZWQzMiByZWc7Ci0KLSAgICAgIGlmIChyZWdubyA8PSBSMF9SRUdOVU0gKyA2MykKLQlyZWcgPSBzZC0+Y3B1WzBdLnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXTsKLSAgICAgIGVsc2UgaWYgKHJlZ25vIDw9IFNQVV9SRUdOVU0pCi0JcmVnID0gc2QtPmNwdVswXS5yZWdzLnNwW3JlZ25vIC0gU1BJX1JFR05VTV07Ci0gICAgICBlbHNlCi0JcmVnID0gc2QtPmNwdVswXS5yZWdzLmNvbnRyb2xbcmVnbm8gLSBDUkVHU19TVEFSVF07Ci0KLSAgICAgIGJ1ZlswXSA9IHJlZyA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHJlZyA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHJlZyA+PiA4OwotICAgICAgYnVmWzNdID0gcmVnOwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCBOVU1fUkVHUykKLSAgICB7Ci0gICAgICB1bnNpZ25lZDMyIHJlZzsKLQotICAgICAgcmVnID0gc2QtPmNwdVswXS5yZWdzLmFjY3VtdWxhdG9yW3JlZ25vIC0gQTBfUkVHTlVNXSA+PiAzMjsKLQotICAgICAgYnVmWzBdID0gcmVnID4+IDI0OwotICAgICAgYnVmWzFdID0gcmVnID4+IDE2OwotICAgICAgYnVmWzJdID0gcmVnID4+IDg7Ci0gICAgICBidWZbM10gPSByZWc7Ci0KLSAgICAgIHJlZyA9IHNkLT5jcHVbMF0ucmVncy5hY2N1bXVsYXRvcltyZWdubyAtIEEwX1JFR05VTV07Ci0KLSAgICAgIGJ1Zls0XSA9IHJlZyA+PiAyNDsKLSAgICAgIGJ1Zls1XSA9IHJlZyA+PiAxNjsKLSAgICAgIGJ1Zls2XSA9IHJlZyA+PiA4OwotICAgICAgYnVmWzddID0gcmVnOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcmVnbm8sIGJ1ZiwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJlZ25vOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGlmIChyZWdubyA8IEEwX1JFR05VTSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZDMyIHJlZzsKLQotICAgICAgcmVnID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107Ci0KLSAgICAgIGlmIChyZWdubyA8PSBSMF9SRUdOVU0gKyA2MykKLQlzZC0+Y3B1WzBdLnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXSA9IHJlZzsKLSAgICAgIGVsc2UgaWYgKHJlZ25vIDw9IFNQVV9SRUdOVU0pCi0Jc2QtPmNwdVswXS5yZWdzLnNwW3JlZ25vIC0gU1BJX1JFR05VTV0gPSByZWc7Ci0gICAgICBlbHNlCi0Jc2QtPmNwdVswXS5yZWdzLmNvbnRyb2xbcmVnbm8gLSBDUkVHU19TVEFSVF0gPSByZWc7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA8IE5VTV9SRUdTKQotICAgIHsKLSAgICAgIHVuc2lnbmVkMzIgcmVnOwotCi0gICAgICByZWcgPSAoYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKLQotICAgICAgc2QtPmNwdVswXS5yZWdzLmFjY3VtdWxhdG9yW3JlZ25vIC0gQTBfUkVHTlVNXSA9ICh1bnNpZ25lZDY0KXJlZyA8PCAzMjsKLQotICAgICAgcmVnID0gKGJ1Zls0XSA8PCAyNCkgfCAoYnVmWzVdIDw8IDE2KSB8IChidWZbNl0gPDwgOCkgfCBidWZbN107Ci0KLSAgICAgIHNkLT5jcHVbMF0ucmVncy5hY2N1bXVsYXRvcltyZWdubyAtIEEwX1JFR05VTV0gfD0gcmVnOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9zaW0vZDMwdi9zaW0tbWFpbi5oIGIvc2ltL2QzMHYvc2ltLW1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiOGFhMC4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi9zaW0tbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9TSU1fTUFJTl9IXwotI2RlZmluZSBfU0lNX01BSU5fSF8KLQotLyogVGhpcyBzaW11bGF0b3Igc3Vwb3J0cyB3YXRjaHBvaW50cyAqLwotI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKLQotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJzaW0tc2lnbmFsLmgiCi0KLS8qIG5lZWRlZCAqLwotdHlwZWRlZiBhZGRyZXNzX3dvcmQgc2ltX2NpYTsKLSNkZWZpbmUgSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTICgoYWRkcmVzc193b3JkKSAwIC0gMSkKLQotLyogVGhpcyBzaW11bGF0b3IgZG9lc24ndCBjYWNoZSBhbnl0aGluZyBzbyBubyBzYXZpbmcgb2YgY29udGV4dCBpcwotICAgbmVlZGVkIGR1cmluZyBlaXRoZXIgb2YgYSBoYWx0IG9yIHJlc3RhcnQgKi8KLSNkZWZpbmUgU0lNX0VOR0lORV9IQUxUX0hPT0soU0QsQ1BVLENJQSkgd2hpbGUgKDApCi0jZGVmaW5lIFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKFNELENQVSxDSUEpIHdoaWxlICgwKQotCi0jaW5jbHVkZSAic2ltLWJhc2UuaCIKLQotLyogVGhlc2UgYXJlIGdlbmVyYXRlZCBmaWxlcy4gICovCi0jaW5jbHVkZSAiaXRhYmxlLmgiCi0jaW5jbHVkZSAic19pZGVjb2RlLmgiCi0jaW5jbHVkZSAibF9pZGVjb2RlLmgiCi0KLSNpbmNsdWRlICJjcHUuaCIKLSNpbmNsdWRlICJhbHUuaCIKLQotCi1zdHJ1Y3Qgc2ltX3N0YXRlIHsKLQotICBzaW1fZXZlbnQgKnBlbmRpbmdfaW50ZXJydXB0OwotCi0gIC8qIHRoZSBwcm9jZXNzb3JzIHByb3BlciAqLwotICBzaW1fY3B1IGNwdVtNQVhfTlJfUFJPQ0VTU09SU107Ci0jaWYgKFdJVEhfU01QKQotI2RlZmluZSBTVEFURV9DUFUoc2QsIG4pICgmKHNkKS0+Y3B1W25dKQotI2Vsc2UKLSNkZWZpbmUgU1RBVEVfQ1BVKHNkLCBuKSAoJihzZCktPmNwdVswXSkKLSNlbmRpZgotCi0gIC8qIFRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKLQotfTsKLQotCi0vKiBkZWxpdmVyIGFuIGludGVycnVwdCAqLwotc2ltX2V2ZW50X2hhbmRsZXIgZDMwdl9pbnRlcnJ1cHRfZXZlbnQ7Ci0KLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NJTV9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9zaW0vZDMwdi90Y29uZmlnLmluIGIvc2ltL2QzMHYvdGNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmI5MS4uMDAwMDAwMAotLS0gYS9zaW0vZDMwdi90Y29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBEMzBWIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAtKi0gQyAtKi0gKi8KLQotLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRyaW5zaWMgYnJlYWtwb2ludCBtZWNoYW5pc20uICovCi0jZGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTCi0KLS8qIFNlZSBzaW0taGxvYWQuYy4gIFdlIHByb3Blcmx5IGhhbmRsZSBMTUEuICovCi0jZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCi0KZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9DaGFuZ2VMb2cgYi9zaW0vZXJjMzIvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmZmNjAwLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2MDMgKzAsMCBAQAotVHVlIE1heSAyMyAyMTozOToyMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMjAwMC0wMy0wNyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAcmVkaGF0LmNvbT4KLQotCUZyb20gSm9obiBEYWxsYXdheSAgPGpsZEByZWRoYXQuY28udWs+OgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc2lzKTogQWRkICQoRVhFRVhUKSBmb3IgV2luZG93cyBob3N0LgotCi0yMDAwLTAzLTAzICBKb25hdGhhbiBMYXJtb3VyICA8amxhcm1vdXJAcmVkaGF0LmNvLnVrPgotCi0JKiBmdW5jLmMgKGJ1ZmZlcl9yZWFkX21lbW9yeSk6IENoYW5nZSB0eXBlIG9mIHNpemUgdG8gdW5zaWduZWQgdG8KLQltYXRjaCBwcm90b3R5cGUKLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi0xOTk5LTAzLTAzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgdGVybWNhcCBhbmQgLWx1c2VyMzIgZm9yIGhvc3Q9Y3lnd2luCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQkKLTE5OTktMDItMTEgIEh1Z28gVHlzb24gIDxobXRAY3lnbnVzLmNvLnVrPgotCi0JKiBleGVjLmMgKGRpc3BhdGNoX2luc3RydWN0aW9uKTogCi0JQ29ycmVjdCB0aGUgc2Vuc2Ugb2YgdGhlCi0JICAgICAgICAgIGlmICghc3BhcmNsaXRlKSB7Ci0JCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgfQotCWNsYXVzZSB0aGF0IGhhcyBiZWVuIHBhc3RlZCBhcm91bmQ6IGl0J3MgY29ycmVjdCBpbiB0aGUgU0NBTiBhbmQKLQlESVZTY2MgKGRpdmlkZSBzdGVwKSBjYXNlcyAod2hlcmUgaXQgd2FzIHByb2JhYmx5IG9yaWdpbmFsbHkKLQl3cml0dGVuPyksIGJ1dCByZXZlcnNlZCBpbiB0aGUgU0RJViwgU0RJVmNjLCBVRElWLCBVRElWY2MgY2FzZXMKLQlpZS4gaW5zdHJ1Y3Rpb25zIG9ubHkgaW4gdGhlIFNQQVJDIFY4IG9yIFNQQVJDbGl0ZSA4NngKLQlhcmNoaXRlY3R1cmVzLiAgSXQgd2FzIGFsc28gcHJlc2VudCB3aGVuIG5vdCByZXF1aXJlZCBmb3IgU01VTCwKLQlTTVVMY2MsIFVNVUwsIFVNVUxjYyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgcHJlc2VudCBpbiBhbGwKLQlhcmNoaXRlY3R1cmVzLgotCi0xOTk5LTAxLTI1ICBIdWdvIFR5c29uICA8aG10QGN5Z251cy5jby51az4KLQotCSogaW50ZXJmLmMgKHJ1bl9zaW0pOiBGaXggYSBidWcgaW4gdGhlIG1haW4gbG9vcCdzIGhhbmRsaW5nIG9mCi0JYW5udWxsZWQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMuICBUaGVyZSBpcyBwcmVjZWRlbnQgZm9yIHRoaXMKLQljaGFuZ2U7IHRoZSBfb3RoZXJfIG1haW4gbG9vcCBpbiBzaXMuYyBnZXRzIGl0IHJpZ2h0IGFjY29yZGluZyB0bwotCW15IHJlYWRpbmcgb2YgdGhlIGNvZGUuCi0KLQlUaGUgYnVnIGlzOiBpZiBhbiBpbnRlcnJ1cHQgaGFwcGVucyB3aGVuIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JKGF0IHNyZWdzLT5wYykgaXMgYW5udWxsZWQsIHRoZSB0cmFwIGlzIHRha2VuIChieSBleGVjdXRlX3RyYXAoKSkKLQl3aXRoIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBQQyBhbmQgTlBDLCBzbyB3aGVuIHRoZSB0cmFwIHJldHVybnMsCi0JdGhlIGFubnVsbGVkIGluc3RydWN0aW9uIGlzIGluZGVlZCBleGVjdXRlZC4gIEFub3RoZXIgZ2l2ZWF3YXkgaXMKLQl0aGF0IHRoZSBhbm51bCBmbGFnIGlzIGNsZWFyZWQgaW4gZXhlY3V0ZV90cmFwKCk6IHRoZSBpbmZvcm1hdGlvbgotCWlzIGRlbW9uc3RyYWJseSBkaXNjYXJkZWQuCi0KLQlUaGUgc29sdXRpb24gaXM6IHBlcmZvcm0gYW5udWxsaW5nIGJlZm9yZSBsb29raW5nIGZvciB0cmFwcywgaW4KLQlmYWN0IGl0J3MgbmVhdGVyIHRvIGRvIGFubnVsbGluZywgc2VlIGlmIHRoZXJlJ3MgYW4gaW50ZXJydXB0IGFuZAotCWlmIG5vdCwgZG8gdGhlIGluc3RydWN0aW9uLCB0aGVuIGhhbmRsZSB0cmFwcyBiZSB0aGV5IGdlbmVyYXRlZCBieQotCWludGVycnVwdHMgcGVuZGluZyBvciBieSB0aGUgaW5zdHJ1Y3Rpb24gd2UgbWlnaHQganVzdCBoYXZlIGRvbmUuCi0JVGhhdCdzIHdoYXQgdGhlIHNpcy5jIG9uZSBkb2VzLgotCi0xOTk5LTAxLTIwICBIdWdvIFR5c29uICA8aG10QGN5Z251cy5jby51az4KLQotCSogc2lzLmg6IEFkZCBhc3IxNyByZWdpc3RlciBmb3Igc3VwcG9ydCBvZiBTcGFyY0xJVEUgKGF0IGxlYXN0IHRoZQotCUhpdGFjaGkgb25lcyBJIGZpbmQgYmVmb3JlIG1lKQotCi0JKiBleGVjLmMgKGRpc3BhdGNoX2luc3RydWN0aW9uKTogQ2FzZSBXUlk6IEFsbG93IHdyaXRlIG9mIGFzcjE3IGlmCi0Jc3BhcmNsaXRlLiAgT3RoZXIgQVNSIG51bWJlcnMgdGhhbiAxNyBvciAwIChZKSB0cmFwIG91dC4KLQlDYXNlIFJEWTogQWxsb3cgcmVhZCBvZiBhc3IxNyBpZiBzcGFyY2xpdGUuICBPdGhlciBBU1JzIGRpdHRvLgotCShleGVjdXRlX3RyYXApOiBEbyBzaW5nbGUtdmVjdG9yLXRyYXBwaW5nIGlmIGFzcjE3IGJpdCAwIGlzIHNldC4KLQkoaW5pdF9yZWdzKTogSW5pdGlhbGl6ZSB5IGFuZCBhc3IxNy4KLQlOQjogSW4gaW5zdHJ1Y3Rpb24tc2V0IHNwYWNlLCB0aGUgWSByZWdpc3RlciBpcyBhc3IwOyB0aGUKLQlpbnN0cnVjdGlvbnMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgZm9yIGh1bWFuIHJlYXNvbnMgb25seS4KLQotCSogc2lzLmM6Ci0JKiBpbnRlcmYuYzogU2V0IGJvb2xlYW4gbW9kZSB2YXJpYWJsZSBkdW1iaW8gaWYgaW52b2tlZCB3aXRoCi0JYXJndW1lbnQgIi1kdW1iaW8iIGFuZCBtZW50aW9uIGl0IG9mIHZlcmJvc2UuCi0JKiBlcmMzMi5jOiBpZiAiZHVtYmlvIiBpcyBzZXQsIGRvIG5vdCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhCi0JdGVybWluYWwgdHlwZSBkZXZpY2UgYXR0YWNoZWQgdG8gc3RkaW4vc3Rkb3V0LiAgRG8gbm90IHNldAotCWJ1ZmZlcmluZyBvciBtZXNzIHdpdGggdGNzZXRhdHRyIG9yIGRvIGFueSByZWFkIG9wZXJhdGlvbnMgaW4KLQlvcmRlciB0byBtYWtlIFVBUlQgaW50ZXJydXB0czsgbm90IGlucHV0IGRhdGEgaXMgc3VwcG9ydGVkLgotCVRoaXMgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IHRoZSBzaW0gdG8gYmUgdXNlZCB3aXRoaW4gdGhlIGVDb3MKLQl0ZXN0aW5nIGluZnJhc3RydWN0dXJlIHdoZXJlIHN0ZGluL3N0ZG91dCBhcmUgcGlwZXMgdG8gYSBUQ0wKLQlwcm9ncmFtOyB0aGUgc2ltIGhhbmdzIG90aGVyd2lzZS4KLQotVGh1IEp1bCAyMyAwNzoxNzowMyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGV4ZWMuYyAoZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24pOiBBZGQgU1BBUkNsaXRlICdzY2FuJyBpbnN0cnVjdGlvbi4KLQotVHVlIEp1bCAgNyAyMToxMjo0MSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGZ1bmMuYyAoYmZkX2xvYWQpOiBBZGQgc3BlY2lhbCBoYW5kbGluZyBvZiBhLm91dCBleGVjdXRhYmxlcy4KLQotU2F0IEp1biAxMyAwODozMzoyNSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGZ1bmMuYyAoYmZkX2xvYWQpOiBQcmludCBjb3JyZWN0IGVuZGlhbm5lc3MuCi0JKiBpbnRlcmYuYyAocnVuX3NpbSk6IFByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpZiB2ZXJib3NpdHkgbGV2ZWwKLQlpcyBncmVhdGVyIHRoYW4gMi4KLQkoc2ltX29wZW4pOiBSZXBlYXRlZCAtdiBvcHRpb25zIG5vdyBpbmNyZW1lbnQgdmVyYm9zaXR5IGxldmVsLgotCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBIYW5kbGUgbGl0dGxlLWVuZGlhbiBjYXNlLgotCShmbHVzaF93aW5kb3cpOiBQcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgdmVyYm9zaXR5IGxldmVsCi0JaXMgZ3JlYXRlciB0aGVuIDIuCi0KLVR1ZSBKdW4gIDIgMTU6MjA6MzUgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoIG1ha2VzCi0JYnl0ZS1zd2FwcGluZyB1bm5lY2Vzc2FyeS4gIEFkZCAtc3BhcmNsaXRlLWJvYXJkIG9wdGlvbiBmb3IKLQllbXVsYXRpbmcgUkFNIGZvdW5kIG9uIHR5cGljYWwgU1BBUkNsaXRlIGJvYXJkcy4gIFByaW50Ci0JZXJyb3IgbWVzc2FnZSBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbi4KLQkqIGVyYzMyLmM6IENoYW5nZSBSQU0gYWRkcmVzcyBhbmQgc2l6ZSBmcm9tIGNvbnN0YW50cyB0byB2YXJpYWJsZXMsCi0JdG8gYWxsb3cgZW11bGF0aW9uIG9mIFNQQVJDbGl0ZSBib2FyZCBSQU0uCi0JKGZldGNoX2J5dGVzLCBzdG9yZV9ieXRlcyk6IE5ldyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZXZhbXBlZAotCW1lbWVtb3J5X3JlYWQgYW5kIG1lbW9yeV93cml0ZS4KLQkobWVtb3J5X3JlYWQsIG1lbW9yeV93cml0ZSk6IFJld3JpdGUgdG8gc3RvcmUgYnl0ZXMgaW4gdGFyZ2V0Ci0JYnl0ZSBvcmRlciBpbnN0ZWFkIG9mIHN0b3Jpbmcgd29yZHMgaW4gaG9zdCBieXRlIG9yZGVyOyB0aGlzCi0JZ3JlYXRseSBzaW1wbGlmaWVzIHN1cHBvcnQgb2YgbGl0dGxlLWVuZGlhbiBwcm9ncmFtcy4KLQkoZ2V0X21lbV9wdHIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgYnl0ZSBwYXJhbWV0ZXIuCi0JKHNpc19tZW1vcnlfd3JpdGUsIHNpc19tZW1vcnlfcmVhZCk6IFN0b3JlIHdvcmRzIGluIHRhcmdldAotCWJ5dGUgb3JkZXIgaW5zdGVhZCBvZiBob3N0IGJ5dGUgb3JkZXIuCi0JKGJ5dGVfc3dhcF93b3Jkcyk6IFJlbW92ZSwgbm8gbG9uZ2VyIG5lZWRlZC4KLQkqIHNpcy5oICgoYnl0ZV9zd2FwX3dvcmRzKTogUmVtb3ZlIGRlY2xhcmF0aW9uLCBubyBsb25nZXIgbmVlZGVkLgotCShtZW1vcnlfcmVhZCk6IEFkZCBuZXcgc3ogcGFyYW1ldGVyLgotCSogc2lzLmMgKHJ1bl9zaW0pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoIG1ha2VzCi0JYnl0ZS1zd2FwcGluZyB1bm5lY2Vzc2FyeS4KLQkqIGV4ZWMuYyAoZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoCi0JbWFrZXMgYnl0ZS1zd2FwcGluZyBhbmQgZG91YmxlLXdvcmQgZmV0Y2hpbmcgdW5uZWNlc3NhcnkuCi0JKiBmdW5jLmMgKHNwYXJjbGl0ZV9ib2FyZCk6IERlY2xhcmUgbmV3IHZhcmlhYmxlLgotCShnZXRfcmVnaSk6IEhhbmRsZSBsaXR0bGUtZW5kaWFuIGRhdGEuCi0JKGJmZF9sb2FkKTogUmVjb2duaXplIGxpdHRsZS1lbmRpYW4gU1BBUkNsaXRlIGFzIGhhdmluZwotCWxpdHRsZS1lbmRpYW4gZGF0YS4KLQkKLUZyaSBNYXkgMjIgMTQ6MjM6MTYgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBlcmMzMi5jIChwb3J0X2luaXQpOiBQcmludCBtZXNzYWdlcyBvbmx5IGlmIHNpc192ZXJib3NlIGlzIHRydWUuCi0JKiBmdW5jLmMgKGJmZF9sb2FkKTogRGl0dG8uCi0JKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBEaXR0by4KLQotVGh1IE1heSAxNCAyMzoxMDo0OCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNpcy5oICh1aW50NjQsIGludDY0KTogRGVmaW5lLgotCSogZXhlYy5jIChTRElWLCBTRElWQ0MsIFVESVYsIFVESVZDQyk6IERlZmluZSBuZXcgb3Bjb2Rlcy4KLQkqIChtdWw2NCk6IFNpbXBsaWZ5IGNhbGN1bGF0aW9uIG9mIG5lZ2F0aXZlIHJlc3VsdC4KLQkqIChkaXY2NCk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gZm9yIDY0LWJpdCBkaXZpc2lvbi4KLQkqIChkaXNwYXRjaF9pbnN0cnVjdGlvbik6IEFkZCBlbXVsYXRpb24gb2YgU0RJViwgU0RJVkNDLCBVRElWLAotCWFuZCBVRElWQ0MuCi0JCi1XZWQgTWF5IDEzIDE0OjU5OjU0IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZXJjMzIuYyAoY2xvc2VfcG9ydCk6IERvbid0IGNsb3NlIHN0ZGluOyBpdCBraWxscyBHREIuCi0JKGJ5dGVfc3dhcF93b3Jkcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHNpcy5oOiAoYnl0ZV9zd2FwX3dvcmRzKTogRGVjbGFyZS4KLQkqIGludGVyZi5jIChydW5fc2ltKTogQWx3YXlzIGZldGNoIGluc3RydWN0aW9ucyBhcyBiaWctZW5kaWFuLgotCSogc2lzLmMgKHJ1bl9zaW0pOiBEaXR0by4KLQotVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxOTo1MiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotU2F0IEFwciAxOCAxMjowMDoxNiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGZ1bmMuYyAoZGlzcF9mcHUpOiBGaXggYnVpbGQgcHJvYmxlbSBvbiBiaWctZW5kaWFuIGhvc3RzLgotCi1XZWQgQXByICA4IDE5OjMzOjM0IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZXJjMzIuYyAoc2ltX3N0b3ApOiBIYW5kbGUgU0lHSU5UIGdyYWNlZnVsbHkuCi0JKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBEb24ndCBjYXRjaCBTSUdJTlQ7IEdEQiB3aWxsIGRvIHRoYXQgZm9yIHVzLgotCi1XZWQgQXByICA4IDE4OjI5OjQwIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZXhlYy5jIChkaXNwYXRjaF9pbnN0cnVjdGlvbik6IENoYW5nZSBob3cgY2Fycnkgb3V0IGlzIGNhbGN1bGF0ZWQKLQlpbiBESVZTQ0MuICBBZGQgZW11bGF0aW9uIG9mIFNNVUxDQywgVU1VTCwgYW5kIFVNVUxDQy4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAgMSAyMToxOToxOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGVuZC5jOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjcuNSwgZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFuZCBidWdzLgotCSogZXJjMzIuYzogRGl0dG8uCi0JKiBleGVjLmM6IERpdHRvLgotCSogZmxvYXQuYzogRGl0dG8uCi0JKiBmdW5jLmM6IERpdHRvLgotCSogaGVscC5jOiBEaXR0by4KLQkqIGludGVyZi5jOiBEaXR0by4KLQkqIHNpcy5jOiBEaXR0by4KLQkqIHNpcy5oOiBEaXR0by4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEZlYiAxNyAxMjo0MToxMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVyZi5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVHVlIEF1ZyAyNiAxMDozODoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGZsb2F0LmMgKF9fc2V0ZnB1Y3cpOiBDb21waWxlIG9uIGFueSBpMzg2IHRhcmdldC4gIE5vdCBqdXN0IE5ULgotCi0JKiBpbnRlcmYuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4gIEluaXRpYWxpemUgUEMgZnJvbSBBQkZECi0gCWFyZ3VtZW50LgotCShzaW1fbG9hZCk6IERvbid0IHNhdmUgc3RhcnQgYWRkcmVzcy4KLQkoc3RhcnRfYWRkcmVzcyk6IERlbGV0ZSB2YXJpYWJsZS4KLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTY6MTk6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4gQ2hhbmdlIEFSR1YgdG8gUEFSR1YuCi0KLU1vbiBKdW4gMzAgMTE6NDU6MjUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc2lzKTogQ2hhbmdlICQoc3JjZGlyKS9zaXMgdG8gc2lzLgotCi1XZWQgTWF5IDI4IDA5OjQ2OjEzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJmLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogRHJvcCBTRCBhcmd1bWVudCAtIG5vdCBhcHBsaWNhYmxlLgotCShzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmcsIHNhdmUgaXQuCi0KLVRodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgQXByIDIyIDExOjA1OjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVyZi5jIChzaW1fb3Blbik6IFVuZG8gcGF0Y2ggdG8gYWRkIC1FIHN1cHBvcnQuCi0KLVRodSBBcHIgMTcgMDM6MDM6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJmLmMgKHNpbV9vcGVuKTogSWdub3JlIC1FIGFyZy4KLQkoc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIFNldCBzdGFydF9hZGRyZXNzIGZyb20gYmZkLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KLQotVHVlIEFwciAxNSAxNToxNjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNpcyk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pLgotCi1Nb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1XZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVyZi5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLVRodSBNYXIgMTMgMTI6NDY6MDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJmLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdyBpbgotCWFyZ3YgZm9ybS4KLQkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVR1ZSBGZWIgIDQgMTM6MzU6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEBDT01NT05fTUFLRUZJTEVfRlJBRyk6IFVzZQotCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEphbiAyMyAxMTo0NjoyMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKLQlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgotCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KLQltYWtlZmlsZSBmcmFnbWVudC4KLQotV2VkIERlYyAgNCAxODoyNTowNCAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBpbnRlcmYuYyAocnVuX3NpbSk6IFN0b3AgdGhlIHNpbXVsYXRvciBhbmQgcmVzZXQgdGhlIHN0ZGlvIGFmdGVyCi0JYnJlYWtwb2ludHMuCi0KLVR1ZSBEZWMgIDMgMTE6NTQ6MzcgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBMb29rIGZvciBsaWJ0ZXJtY2FwLmEuCi0JKiBNYWtlZmlsZS5pbjogT25seSBsaW5rIGluIC1sdGVybWNhcCBpZiBpdCBleGlzdHMuCi0JKiBlcmMzMi5jOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjZhLiBGaXggdWFydCBoYW5kbGluZy4KLQkqIGV4ZWMuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gQWRkIHNwYXJjbGl0ZSBzdXBwb3J0LgotCSogZmxvYXQuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gQ29udmVydCBjb21tZW50cyB0bwotCXByZXByb2Nlc3NvciB3YXJuaW5ncy4gQWRkIF9fc2V0ZnB1Y3coKSBmb3IgaTM4NSBob3N0cyBzbyBmbG9hdGluZwotCXBvaW50IGV4Y2VwdGlvbnMgd29yayBvbiB3aW4zMi4KLQkqIGZ1bmMuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gRml4IHVhcnQgaGFuZGxpbmcsIGFkZCBzdXBwb3J0Ci0JZm9yIHVzZXIgZXJyb3IgdHJhcHMuCi0JKiBoZWxwLmM6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNmEuIEFkZCBoZWxwIG5vdGUgb24gdXNlciBlcnJvcgotCXRyYXBzLgotCSogaW50ZXJmLmM6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNmEuIEZpeCB1YXJ0IGhhbmRsaW5nLCBhbmQgYWRkCi0Jc3BhcmNsaXRlIHN1cHBvcnQuCi0JKiBleGFtcGxlcy9nY2N4OiBVc2Ugc3BhcmNsaXRlIGNyb3NzIGNvbXBpbGVyLCBub3QgbmF0aXZlIGdjYy4KLQkqIGV4YW1wbGVzL3NydDAuUzogVXNlICJtb3YiIHJhdGhlciB0aGFuICJ3ciIgZm9yIG1hbmlwdWxhdGluZwotCXRoZSBwc3IgcmVnaXN0ZXIuCi0KLU1vbiBOb3YgMjUgMDg6Mjg6MTAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChydW4ubyk6IFJlbW92ZSB0aGlzIHJ1bGUsIGl0IGhpZGVzIHRoZSBvbmUgaW4KLQkuLi9jb21tb24vTWFrZS1jb21tb24uaW4gdGhhdCBjb3JyZWN0bHkgcmVmZXJlbmNlcyB0aGUgc291cmNlCi0JaW4gdGhlIHNpYmxpbmcgLi4vY29tbW9uIGRpcmVjdG9yeS4KLQotV2VkIE5vdiAyMCAwMTozMDoxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIHN0dWZmIG1vdmVkIHRvIC4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbi4KLQkoU0lNX3tPQkpTLEVYVFJBX0xJQlMsRVhUUkFfTElCREVQUyxFWFRSQV9BTEwsRVhUUkFfSU5TVEFMTH0pOiBEZWZpbmUuCi0JKFNJTV97RVhUUkFfQ0xFQU4sRVhUUkFfQ0ZMQUdTfSk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnLmluOiBOZXcgZmlsZS4KLQkqIGZ1bmMuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUsIG1vdmVkIHRvCi0JKiBpbnRlcmYuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBoZXJlLgotCShzaW1fY2FsbGJhY2spOiBOZXcgZ2xvYmFsLgotCVJld3JpdGUgYWxsIGNhbGxzIHRvIHByaW50Zl9maWx0ZXJlZCB0byBnbyB0aHJvdWdoIGNhbGxiYWNrLgotCShzaW1fc2l6ZSxzaW1fdHJhY2UpOiBOZXcgZnVuY3Rpb25zLgotCShzaW1fe2luc2VydCxyZW1vdmV9X2JyZWFrcG9pbnQpOiAjaWYgMCBvdXQuCi0JKiBzaXMuYzogI2luY2x1ZGUgImNvbmZpZy5oIi4gICNpbmNsdWRlIDxzdGRsaWIuaD4gaWYgcHJlc2VudC4KLQkobWFpbik6IENvZXJjZSBmcHJpbnRmIGFyZyB0byBJTklUX0RJU0FTU0VNQkxFX0lORk8gdG8gZnByaW50Zl9mdHlwZS4KLQkqIHNpcy5oOiAjaW5jbHVkZSAiY2FsbGJhY2suaCIuCi0JKiBydW4uYzogRGVsZXRlZCwgdXNpbmcgb25lIGluIC4uL2NvbW1vbiBub3cuCi0KLVRodSBPY3QgIDMgMTY6MTI6MDMgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAxNjo1Nzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBBbHNvIHJlbW92ZSBjb25maWcubG9nLgotCi1TYXQgU2VwIDE0IDAwOjAwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZS4KLQkoQVIsIEFSX0ZMQUdTLCBCSVNPTiwgTUFLRUlORk8pOiBSZW1vdmUgZHVwbGljYXRlIHZhcmlhYmxlcy4KLQkoUkFOTElCLCBDQyk6IExpa2V3aXNlLgotCShlbmQpOiBVc2UgJChDQ19GT1JfQlVJTEQpLCBub3QgJChDQykuCi0JKiBjb25maWd1cmUuaW46IFNldCBDQ19GT1JfQlVJTEQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBTZXAgIDggMTQ6MDQ6MzcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZXJjMzIuYyAocG9ydF9pbml0KTogIERpc2FibGUgdGhpcyBmb3IgX19HTzMyX18gKGdvdCBubyBwdHkncwotCXRoZXJlIGVpdGhlci4uLikuCi0KLU1vbiBBdWcgMTIgMTc6MDQ6NTggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZXJjMzIuYzogIERvbid0IGluY2x1ZGUgc3lzL2lvY3RsLmggb3Igc3lzL2ZpbGUuaC4gIFRoZXkgYXJlbid0Ci0JbmVjZXNzYXJ5LgotCSogKHBvcnRfaW5pdCk6ICBEb24ndCBldmVuICp0cnkqIHRvIG9wZW4gcHR5J3MgdW5kZXIgX1dJTjMyLgotCSogVXNlIFNJTV9BRERSLCBub3QgY2FkZHJfdCBmb3IgZGVjbGFyaW5nIHZhcnMgdGhhdCBob2xkIGFkZHJlc3Nlcy4KLQkqIGZsb2F0LmM6ICBHZXQgcmlkIG9mICN3YXJuaW5nLiAgTWFrZXMgTWljcm9zb2Z0IEMgYmFyZi4KLQkqIGludGVyZi5jIChzaW1fb3Blbik6ICBDYXN0IGZwcmludGYgdG8gKGZwcmludGZfZnR5cGUpIHRvIGZpeAotCWNvbXBpbGVyIHdhcm5pbmcuCi0JKiAoc2ltX2xvYWQgc2ltX2NyZWF0ZV9pbmZlcmlvciBzaW1fcmVhZCk6ICBVc2UgcHJvdG90eXBlcyBvbmx5IGluCi0JZGVjbHMsIG5vdCBkZWZzLgotCSogR2V0IHJpZCBvZiBlbnVtIHNpbV9zdG9wLiAgSXQncyBkZWZpbmVkIGluIHJlbW90ZS1zaW0uaC4KLQkqIChzaW1fc3RvcF9yZWFzb24pOiAgRGVmaW5lIFNJR1RSQVAgaWYgX1dJTjMyLgotCSogc2lzLmg6ICBJbmNsdWRlIGFuc2lkZWNsLmggYW5kIHJlbW90ZS1zaW0uaC4KLQotV2VkIEp1bCAgMyAxNjowNToyMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlcmMzMi5jIChtZWNfcmVzZXQgbWVjX3JlYWQgbWVjX3dyaXRlIG1lbW9yeV9yZWFkIG1lbW9yeV93cml0ZSksCi0Jc2lzLmg6ICBHZXQgcmlkIG9mIGFsbCB1c2VzIG9mIGxvbmcgbG9uZydzLgotCSogKGNsb3NlX3BvcnQgcmVhZF91YXJ0IHdyaXRlX3VhcnQgdWFydGFfdHgpOiAgRG9uJ3Qgc2VnIGZhdWx0Ci0Jd2hlbiBjYW4ndCBvcGVuIHB0eSdzLgotCSogZXhlYy5jOiAgQWRkIHR3byBuZXcgaW5zdHJ1Y3Rpb25zOiBzbXVsLCBhbmQgZGl2c2NjLgotCSogaW50ZXJmLmMgKGZsdXNoX3dpbmRvd3MpOiAgTmV3IHJvdXRpbmUgdG8gZmx1c2ggdGhlIHJlZ2lzdGVyCi0Jd2luZG93cyBvdXQgdG8gdGhlIHN0YWNrIGp1c3QgYmVmb3JlIHJldHVybmluZyB0byBHREIuICBNYWtlcwotCWJhY2t0cmFjZXMgd29yayBtdWNoIGJldHRlci4KLQotV2VkIEp1biAyNiAxMjoxOToxMSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIsIG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAxNDoxOTowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotVHVlIEp1biAgNCAxMDozNzoxMiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBjaGVjayB0byBzZWUgaWYgdG9vbGRpciBleGlzdHMuCi0JTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotTW9uIEp1biAgMyAxMjozMzozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlbmQuaCk6IFVzZSBleHBsaWNpdCAuLyB3aGVuIHJ1bm5pbmcgZW5kLgotCi1TdW4gTWF5IDE5IDIxOjA1OjMxIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGZ1bmMuYyhiZmRfbG9hZCk6IERvbid0IHRyeSB0byBwcmludCB0aGUgZmlsZW5hbWUgaWYgdGhlIHBmYmQgaXMKLQlOVUxMLgotCSogaW50ZXJmLmMoc2ltX2xvYWQpOiBQYXNzIHRoZSB3aG9sZSBzdHJpbmcsIG5vdCBqdXN0IHRoZSBmaXJzdAotCWJ5dGUuCi0KLVZlcnNpb24gMi4xIDI2LTAyLTk2Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIAotKiBGaXhlZCBidWcgaW4gImdvIiBjb21tYW5kLgotIAotdmVyc2lvbiAyLjAgMDUtMDItOTYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogRml4ZWQgYnVnIGluIGludGVycnVwdCBmb3JjZSByZWdpc3RlciAoZXJjMzIuYykuCi0KLSogQ2hhbmdlIGZpbGUgbG9hZCBmdW5jdGlvbiB0byB1c2UgYmZkX29wZW5yLgotCi0qIFNJUyBzaG91bGQgbm93IGJlIGVuZGlhbiBpbmRlcGVuZGVudC4KLQotdmVyc2lvbiAxLjggMjQtMTEtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogRml4ZWQgRlBVIHRpbWluZyAtIHNvbWUgc2VxdWVuY2VzIG9mIEZQVSBpbnN0cnVjdGlvbnMgZGlkIG5vdCBjYWxjdWxhdGUKLSAgdGhlIHJlc291cmNlIGRlcGVuZGVuY2llcyByaWdodC4KLQotKiBDb3JyZWN0ZWQgU1RERlEgd2hlbiBxbmUgPSAwIChhZ2FpbiEpLiBUaGUgZnR0IGlzIHNldCB0byBzZXF1ZW5jZV9lcnJvcgotICBidXQgbm8gRlBVIHRyYXAgaXMgZ2VuZXJhdGVkLgotCi12ZXJzaW9uIDEuNy4xIDMxLTEwLTk1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIENvcnJlY3RlZCBTVERGUSB3aGVuIHFuZSA9IDAuIE5vdywgYSB0cmFwIGlzIGltbWlkaWF0ZWx5IGdlbmVyYXRlZCBidXQKLSAgdGhlIEZQVSBzdGF5cyBpbiBleGVjdXRlIG1vZGUuCi0KLSogQ29ycmVjdGVkIEpNUEwgYW5kIFJFVFQgdGltaW5nICh0aGVzZSBpbnN0cnVjdGlvbnMgdGFrZXMgdHdvIGN5Y2xlcykuCi0KLQotdmVyc2lvbiAxLjcgMjUtMTAtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogSW50ZXJydXB0IGR1cmluZyBhbm51bGVkIGluc3RydWN0aW9uIGNvcnJ1cHRlZCByZXR1cm4gYWRkcmVzcyAtIGZpeGVkLgotCi0KLXZlcnNpb24gMS42LjIgMjUtMTAtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogQWRkZWQgLURGQVNUX1VBUlQgdG8gTWFrZWZpbGUKLSAKLQotdmVyc2lvbiAxLjYuMSAyNC0xMC05NQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLSogRml4ZWQgYnVnIGluIFNUREZRIHdoaWNoIGNhdXNlZCBidXMgZXJyb3IKLQotCi12ZXJzaW9uIDEuNiAwMi0xMC05NQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLSogTW9kaWZpZWQgc3J0MC5zIHRvIGluY2x1ZGUgY29kZSB0aGF0IGluaXRpYXRlcyByZWdpc3RlcnMgaW4gSVUgYW5kIEZQVQotICBhbmQgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgc2VnbWVudC4gVGhlIHNpbXVsYXRvciAnbG9hZCcgY29tbWFuZCBkb2VzIG5vdAotICBsb25nZXIgaW5pdGlhbGl6ZSB0aGUgZGF0YSBzZWdtZW50IQotCi0qIENvcnJlY3RlZCBNRUMgdGltZXIgb3BlcmF0aW9uOyBzY2FsZXJzIG5vdyBkaXZpZGUgdGhlIGZyZXF1ZW5jeSBieSAKLSAgKHNjYWxlcl92YWx1ZSArIDEpLgotCi0qIE1FQyBicmVha3BvaW50cyBhcmUgbm90IGNoZWNrZWQgZHVyaW5nIHN0b3JlIG9wZXJhdGlvbgotCi0KLXZlcnNpb24gMS41IDE0LTA5LTk1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgY3ljbGUgY291bnRpbmcgZm9yIElVICYgRlBVIGluc3RydWN0aW9ucy4KLQotKiBGaXhlZCBidWcgdGhhdCBhbGxvd2VkIGFuIGFubnVsZWQgaW5zdHJ1Y3Rpb24gdG8gY2F1c2UgbWVtb3J5IGV4Y2VwdGlvbi4KLQotKiBUaGUgKndzIHBhcmFtZXRlciBpbiBtZW0uYyBzaG91bGQgbm93IGNvbnRhaW4gdGhlIG51bWJlciBvZiB3YWl0c3RhdGVzCi0gIHJlcXVpcmVkIGJ5IHRoZSBtZW1vcnkgYWNjZXNzICh3YXMgdG90YWwgbnVtYmVyIG9mIGN5Y2xlcykuCi0KLSogVGhlIHN1cHBsaWVkIHNydDAucyBub3cgY2xlYXJzIHRoZSBCU1MgKHRoYW5rcyBKb2VsKS4KLQotdmVyc2lvbiAxLjQgMjItMDgtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogQWRkZWQgYSAnLWcnIHN3aXRjaCB0byBlbmFibGUvZGlzYWJsZSB0aGUgR05VIHJlYWRsaW5lKCksIHdoaWNoIGNhdXNlCi1zb21lIHByb2JsZW1zIG9uIHNvbGFyaXMgMi54IG1hY2hpbmVzLgotCi0qIEVuYWJsZWQgTUVDIHdhdGNocG9pbnQgYW5kIGJyZWFrcG9pbnQgZnVuY3Rpb24gdG8gbWVtLmMuIFBlcmZvcm1hbmNlIAotbWF5IHN1ZmZlciBhIGJpdCAuLi4KLQotTk9URTogVGhlIFVBUlRzIGFyZSBub3cgY29ubmVjdGVkIHRvIC9kZXYvdHR5cGMgYW5kIC9kZXYvdHR5cGQuCi0KLXZlcnNpb24gMS4zIDI2LTA3LTk1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIEZpeGVkIGJ1ZyBpbiBtdWxzY2MgaW5zdHJ1Y3Rpb24gKGhvdyBjb3VsZCB0aGF0IGV2ZXIgaGF2ZSB3b3JrZWQ/KQotCi0qIEZpeGVkIGJ1ZyBpbiBVQVJUIEIgKGZsdXNoZWQgY2hhcmFjdGVycyBvbiBVQVJUIEEpLCB0aGFua3MgUGF1bC4KLQotdmVyc2lvbiAxLjIgMTMtMDctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogRml4ZWQgYnVnIGluIGludGVycnVwdCBoYW5kbGluZyAod3JvbmcgaW50ZXJydXB0IHNlbGVjdGVkIHdoZW4gbW9yZSB0aGF0Ci1vbmUgaW50ZXJydXB0IHBlbmRpbmcpCi0KLSogRml4ZWQgdXBkYXRpbmcgb2YgY29uZGl0aW9uIGNvZGVzIGR1cmluZyBsb2dpY2FsIGluc3RydWN0aW9ucyAoY2FycnkgYW5kCi1vdmVyZmxvdyB3ZXJlIG5vdCByZXNldCkKLQotKiBGaXhlZCBidWcgaW4gV1JUQlIgKHR0IGZpZWxkIHdhcyB3cm9uZ2x5IG92ZXItd3JpdHRlbikKLQotdmVyc2lvbiAxLjEgMDctMDctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogRml4ZWQgc2V2ZXJhbCBidWdzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgY2FsbGJhY2sgcm91dGluZXMuCi0ocmVwb3J0ZWQgYnkgUGF1bCBXYXJyZW4sIEFsc3lzKQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL01ha2VmaWxlLmluIGIvc2ltL2VyYzMyL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU4MTVhLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIGVyYzMyc2ltIGxpYnJhcnkuCi0jICAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydAotIyAgICBNb2RpZmllZCBieSBKLkdhaXNsZXIgRVNBL0VTVEVDCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotVEVSTUNBUF9MSUIgPSBAVEVSTUNBUEAKLQotU0lNX09CSlMgPSBleGVjLm8gZXJjMzIubyBmdW5jLm8gaGVscC5vIGZsb2F0Lm8gaW50ZXJmLm8KLVNJTV9FWFRSQV9MSUJTID0gLi4vLi4vcmVhZGxpbmUvbGlicmVhZGxpbmUuYSAgJChURVJNQ0FQX0xJQikgLWxtCi1TSU1fRVhUUkFfTElCREVQUyA9IC4uLy4uL3JlYWRsaW5lL2xpYnJlYWRsaW5lLmEKLVNJTV9FWFRSQV9BTEwgPSBzaXMKLVNJTV9FWFRSQV9JTlNUQUxMID0gaW5zdGFsbC1zaXMKLVNJTV9FWFRSQV9DTEVBTiA9IGNsZWFuLXNpcwotCi0jIFVBUlRTIHJ1biBhdCBhYm91dCAxMTUyMDAgYmF1ZCAoc2ltdWxhdG9yIHRpbWUpLiBBZGQgLURGQVNUX1VBUlQgdG8KLSMgQ0ZMQUdTIGlmIGZhc3RlciAoaW5maW5pdGUpIFVBUlQgc3BlZWQgaXMgZGVzaXJlZC4gTWlnaHQgYWZmZWN0IHRoZQotIyBiZWhhdmlvdXIgb2YgVUFSVCBpbnRlcnJ1cHQgcm91dGluZXMgLi4uCi1TSU1fRVhUUkFfQ0ZMQUdTID0gLURTVEFUIC1ERkFTVF9VQVJUIC1ESVVSRVYwIC1ETUVDUkVWMAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi0jIGBzaXMnIGRvZXNuJ3QgbmVlZCBpbnRlcmYuby4KLVNJU19PRklMRVMgPSBleGVjLm8gZXJjMzIubyBmdW5jLm8gaGVscC5vIGZsb2F0Lm8KLQotc2lzOiBzaXMubyAkKFNJU19PRklMRVMpICQoQ09NTU9OX09CSlMpICQoTElCREVQUykKLQkkKENDKSAkKEFMTF9DRkxBR1MpIC1vIHNpcyBcCi0JICBzaXMubyAkKFNJU19PRklMRVMpICQoQ09NTU9OX09CSlMpICQoRVhUUkFfTElCUykKLQotIyBGSVhNRTogVGhpcyBjb21wdXRlcyB0aGUgYnVpbGQgaG9zdCdzIGVuZGlhbm5lc3MsIGRvZXNuJ3QgaXQ/Ci0jIFRoZXJlIGlzIEFDX0NfQklHRU5ESUFOIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSBmbG9hdCBlbmRpYW5uZXNzLgotIyBbQXJlIGludC9mbG9hdCBlbmRpYW5zIGV2ZXJ5IGRpZmZlcmVudCBvbiBhIHNwYXJjP10KLWVuZDogJChzcmNkaXIpL2VuZC5jCi0JJChDQ19GT1JfQlVJTEQpICQoc3JjZGlyKS9lbmQuYyAtbyBlbmQKLWVuZC5oOiBlbmQKLQkuL2VuZCA+IGVuZC5oCi0KLSMgQ29weSB0aGUgZmlsZXMgaW50byBkaXJlY3RvcmllcyB3aGVyZSB0aGV5IHdpbGwgYmUgcnVuLgotaW5zdGFsbC1zaXM6IGluc3RhbGxkaXJzCi0Jbj1gZWNobyBzaXMgfCBzZWQgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknYDsgXAotCSQoSU5TVEFMTF9QUk9HUkFNKSBzaXMkKEVYRUVYVCkgJChiaW5kaXIpLyQkbiQoRVhFRVhUKQotCi1jbGVhbi1zaXM6Ci0Jcm0gLWYgc2lzIGVuZCBlbmQuaAotCi1jb25maWd1cmU6Ci0JQGVjaG8gIlJlYnVpbGRpbmcgY29uZmlndXJlLi4uIgotCWlmIFsgeCIke3NyY2Rpcn0iID0geCJAc3JjZGlyQCIgXSA7IHRoZW4gXAotCSAgc3JjZGlyPS4gOyBleHBvcnQgc3JjZGlyIDsgXAotCWVsc2UgdHJ1ZSA7IGZpIDsgXAotCShjZCAkJHtzcmNkaXJ9OyBhdXRvY29uZiAtLWxvY2FsZGlyPS4uL2NvbW1vbikKLQotIyBDaXJjdW12ZW50IFN1biBNYWtlIGJ1ZyB3aXRoIFZQQVRILgotZXJjMzIubzogZXJjMzIuYyBzaXMuaCBlbmQuaAotZXhlYy5vOiBleGVjLmMgc2lzLmggZW5kLmgKLWZsb2F0Lm86IGZsb2F0LmMgc2lzLmggZW5kLmgKLWZ1bmMubzogZnVuYy5jCi1oZWxwLm86IGhlbHAuYwotaW50ZXJmLm86IGludGVyZi5jIHNpcy5oIGVuZC5oIAotc2lzLm86IHNpcy5jIHNpcy5oIGVuZC5oCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvTkVXUyBiL3NpbS9lcmMzMi9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI0YjdiLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLQotdmVyc2lvbiAyLjAgMDUtMDItOTYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogU3dpdGNoZWQgdG8gYmZkIGxpYnJhcnkuIEFueSBzdXBwb3J0ZWQgZm9ybWF0IChlbGYsIGNvZmYsIC4uLikgY2FuIGJlIHVzZWQuCi0qIFRoZSBVQVJUIGRldmljZXMgY2FuIGJlIHNldCB0aHJvdWdoIC11YXJ0MSBhbmQgLXVhcnQyIHN3aXRjaGVzLgotKiBTd2l0Y2hlZCB0byBHTlUgcmVhZGxpbmUuCi0qIEFkZGVkIC1jIG9wdGlvbiB0byBydW4gYmF0Y2ggZmlsZXMgYXQgc3RhcnR1cAotKiAncmVnJyBjb21tYW5kIGNhbiBzaG93IGRpZmZlcmVudCByZWdpc3RlciB3aW5kb3dzIChlZyAncmVnIHczJykuCi0qIFVzZSAnaGVscCcgZm9yIG9ubGluZSBoZWxwIG9uIHNpbXVsYXRvciBjb21tYW5kcwotCi12ZXJzaW9uIDEuOC4xIDIwLTAxLTk2Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIGFkZGVkIC1tZXZyZXYwIHN3aXRjaCB0byBzaW11bGF0ZSBNRUMgcmV2LjAgYnVncyBpbiB0aW1lciBhbmQgdWFydAotCi0qIGFkZGVkIC1pdXJldjAgc3dpdGNoIHRvIHNpbXVsYXRlIElVIHJldi4wIGptcGwvcmVzdG9yZSBidWcKLQotKiBBZGRlZCBzaXMgY29tbWFuZCAnYmF0Y2gnIHRvIHJ1biBiYXRjaCBmaWxlcwotCi0KLXZlcnNpb24gMS44IDMwLTEwLTk1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIEFkZGVkIHMtcmVjb3JkIHN1cHBvcnQuIFVzZSB0aGUgJy1zJyBzd2l0Y2ggd2l0aCBzaXMgb3IgdGhlICdsb2FkJyBjb21tYW5kLgotCi0qIElVIGxvYWQgZGVwZW5kZW5jaWVzIGFyZSBub3cgbW9kZWxsZWQKLQotdmVyc2lvbiAxLjcgMzAtMTAtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogUG93ZXItZG93biBtb2RlIGltcGxlbWVudGVkIGluIGVyYzMyLmMuCi0gIAotKiBQZXJmb3JtYW5jZSBkaXNwbGF5IHNob3dzIHRoZSByYXRpbyBiZXR3ZWVuIHNpbXVsYXRvci10aW1lIGFuZCByZWFsLXRpbWUuCi0KLQotdmVyc2lvbiAxLjYuMiAyNS0xMC05NQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBUaGUgVUFSVHMgY2FuIG5vdyBiZSBydW4gYXQgYSBnaXZlbiBzcGVlZCAoc2ltdWxhdG9yIHRpbWUpIHRvIGJldHRlcgotICBzaW11bGF0ZSB0aGUgYmVoYXZpb3VyIG9mIGludGVycnVwdCByb3V0aW5lcy4gVGhlICJ0cnVlIG1vZGUiIGlzCi0gIHNlbGVjdGVkIHRocm91Z2ggYSBjb21waWxlIHN3aXRjaCBpbiB0aGUgbWFrZWZpbGUuCi0KLQotdmVyc2lvbiAxLjYgMjgtMDktOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogTWFqb3IgcmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUuIG1lYy5jIGFuZCBtZW0uYyBtZXJnZWQgaW50byBlcmMzMi5jLgotCi0qIFRoZSBsb2FkIGNvbW1hbmQgZG9lcyBOT1QgbG9uZ2VyIGxvYWQgdGhlIGluaXRpYWxpc2VkIGRhdGEgYXQgYW4gYWRkcmVzcwotICBkZWZpbmVkIGJ5IC5iZGF0YS4gVGhpcyBpcyBkb25lIGluIHNydDAucyB1c2luZyBfZW52aXJvbi4KLQotKiBBZGRpdGlvbmFsIE1FQyBmdW5jdGlvbmFsbGl0eSBhZGRlZCAtIHNvZnR3YXJlIHJlc2V0LCBtZW1vcnkgYWNjZXNzCi0gIHByb3RlY3Rpb24gYW5kIHdhaXRzdGF0ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgotCi0qIGludGVyZi5jIC0gYSBHREIgaW50ZXJmYWNlIGFkZGVkCi0KLSogLXYgc3dpdGNoICh2ZXJib3NlKSBhZGRlZAotCi12ZXJzaW9uIDEuNSAxNC0wOS05NQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBBZGRlZCBhIGluc3RydWN0aW9uIHRyYWNlIGJ1ZmZlciwgZW5hYmxlZCB0aHJvdWdoIHRoZSAnaGlzdCcgY29tbWFuZC4KLQotKiBBZGRlZCBhICdwZXJmJyBjb21tYW5kIHRvIGRpc3BsYXkgc3RhdGlzdGljcyBzdWNoIGFzIGluc3RydWN0aW9uIG1peCwKLSAgQ1BJLCBGUFUgaG9sZHMgZXRjLgotCi0qIEFkZGVkIC1uZnAgc3dpdGNoIHRvIGRpc2FibGUgRlBVLgotCi0qIEFkZGVkIC1mcmVxIHN3aXRjaCB0byBzZXQgc2ltdWxhdGVkIGZyZXF1ZW5jeS4KLQotdmVyc2lvbiAxLjQgMjItMDgtOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogQSAtZyBpcyBwcm92aWRlZCBmb3IgdGhvc2Ugd2hvIGhhdmUgcHJvYmxlbXMgd2l0aCBHTlUgcmVhZGxpbmUoKS4gCi0KLXZlcnNpb24gMS4zIDI2LTA3LTk1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIE5vIG1ham9yIG5ld3MsIGp1c3QgYSBidWcgZml4IHJlbGVhc2UgLi4uCi0KLQotdmVyc2lvbiAxLjIgMTMtMDctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSogQWRkZWQgc2V0dGluZyBvZiBJVSByZWdpc3RlcnMgdGhyb3VnaCB0aGUgJ3JlZycgY29tbWFuZC4gU2VlIFJFQURNRS4KLQotKiBUaGUgR05VIHJlYWRsaW5lKCkgZnVuY3Rpb24gaXMgdXNlZCBmb3IgY29tbWFuZCBpbnB1dC4gSG93ZXZlciwgYQotY3RybC1EIHN0aWxsIGtpbGxzIHRoZSBzaW11bGF0b3IgLi4uCi0KLQotdmVyc2lvbiAxLjEgMDctMDctOTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotKiBBZGRlZCBhICdnbycgY29tbWFuZAotCi0qIEFkZGVkIGN5Y2xlIGNvdW50aW5nIGZvciBpbnRlcnJ1cHQgb3ZlcmhlYWQuCi0KLSogRnVuY3Rpb24gJ2dldF9tZW1fcHRyJyB0YWtlcyBvbmUgbW9yZSBwYXJhbWV0ZXIgdG8gYXZvaWQgc2VnbWVudGF0aW9uIAotICAgZmF1bHRzIGlmIGEub3V0IGZpbGVzIGFyZSBsb2FkZWQgb3V0c2lkZSB0aGUgc2ltdWxhdGVkIG1lbW9yeS4gU2VlIFJFQURNRS4KLQotKiBBZGRlZCB1c2VyLWRlZmluZWQgZnVuY3Rpb24gc2ltX3N0b3AoKS4KLQotKiBBZGRlZCBhIHJlc2V0IGNvbW1hbmQuIFNlZSBSRUFETUUuCi0KLSogSW1wbGVtZW50ZWQgYnVmZmVyZWQgb3V0cHV0IGZvciBNRUMgdWFydHMgdG8gaW1wcm92ZSBvdXRwdXQgc3BlZWQuCi0KZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9SRUFETUUuZXJjMzIgYi9zaW0vZXJjMzIvUkVBRE1FLmVyYzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDEzNTk5Li4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9SRUFETUUuZXJjMzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotCi0xLiBNRUMgYW5kIEVSQzMyIGVtdWxhdGlvbgotCi1UaGUgZmlsZSAnZXJjMzIuYycgY29udGFpbnMgYSBtb2RlbCBvZiB0aGUgTUVDLCA1MTIgSyByb20gYW5kIDQgTSByYW0uCi0KLVRoZSBmb2xsb3dpbmcgcGFyYWdyYXBocyBvdXRsaW5lIHRoZSBpbXBsZW1lbnRlZCBNRUMgZnVuY3Rpb25zLgotCi0xLjEgVUFSVHMKLQotVGhlIFVBUlRzIGFyZSBjb25uZWN0ZWQgdG8gdHdvIHBzZXVkby1kZXZpY2VzLCAvZGV2L3R0eXBjIGFuZCAvZGV2L3R0eXBkLgotVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6Ci0KLS0gVUFSVCBBIFJYIGFuZCBUWCByZWdpc3RlcgkoMHgwMWY4MDBlMCkKLS0gVUFSVCBCIFJYIGFuZCBUWCByZWdpc3RlcgkoMHgwMWY4MDBlNCkKLS0gVUFSVCBzdGF0dXMgcmVnaXN0ZXIJCSgweDAxZjgwMGU4KQotCi1UbyBzcGVlZCB1cCBzaW11bGF0aW9uLCB0aGUgVUFSVHMgb3BlcmF0ZSBhdCBhcHByb3hpbWF0ZWx5IDExNTIwMCBiYXVkLiAKLVRoZSBVQVJUcyBnZW5lcmF0ZSBpbnRlcnJ1cHQgNCBhbmQgNSBhZnRlciBlYWNoIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGVkIAotY2hhcmFjdGVyLiAgVGhlIGVycm9yIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgb3ZlcmZsb3cgb2NjdXJzIC0gb3RoZXIKLWVycm9ycyBjYW5ub3Qgb2NjdXJlLgotCi0xLjIgUmVhbC10aW1lIGNsb2NrIGFuZCBnZW5lcmFsIHB1cG9zZSB0aW1lciBBCi0KLVRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGFyZSBpbXBsZW1ldGVkOgotCi0tIFJlYWwtdGltZSBjbG9jayB0aW1lcgkJCQkoMHgwMWY4MDA4MCwgcmVhZC1vbmx5KQotLSBSZWFsLXRpbWUgY2xvY2sgc2NhbGVyIHByb2dyYW0gcmVnaXN0ZXIgCSgweDAxZjgwMDg0LCB3cml0ZS1vbmx5KQotLSBSZWFsLXRpbWUgY2xvY2sgY291bnRlciBwcm9ncmFtIHJlZ2lzdGVyIAkoMHgwMWY4MDA4MCwgd3JpdGUtb25seSkKLQotLSBHZW5lYXJsIHB1cG9zZSB0aW1lciAJCQkJKDB4MDFmODAwODgsIHJlYWQtb25seSkKLS0gUmVhbC10aW1lIGNsb2NrIHNjYWxlciBwcm9ncmFtIHJlZ2lzdGVyIAkoMHgwMWY4MDA4Yywgd3JpdGUtb25seSkKLS0gR2VuZXJhbCBwdXJwb3NlIHRpbWVyIGNvdW50ZXIgcHJvZy4gcmVnaXN0ZXIgCSgweDAxZjgwMDg4LCB3cml0ZS1vbmx5KQotCi0tIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDA5OCwgd3JpdGUtb25seSkKLQotMS4zIEludGVycnVwdCBjb250cm9sbGVyCi0KLVRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyBpbXBsZW1lbnRlZCBhcyBpbiB0aGUgTUVDIHNwZWNpZmljYXRpb24gd2l0aAotdGhlIGV4Y2VwdGlvbiBvZiB0aGUgaW50ZXJydXB0IHNoYXBlIHJlZ2lzdGVyLiBTaW5jZSBleHRlcm5hbCBpbnRlcnJ1cHRzCi1hcmUgbm90IHBvc3NpYmxlLCB0aGUgaW50ZXJydXB0IHNoYXBlIHJlZ2lzdGVyIGlzIG5vdCBpbXBsZW1lbnRlZC4gVGhlCi1vbmx5IGludGVybmFsIGludGVycnVwdHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGFyZSB0aGUgcmVhbC10aW1lIGNsb2NrLCAKLXRoZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgYW5kIFVBUlRzLiBIb3dldmVyLCBhbGwgMTUgaW50ZXJydXB0cwotY2FuIGJlIHRlc3RlZCB2aWEgdGhlIGludGVycnVwdCBmb3JjZSByZWdpc3Rlci4KLQotVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6Ci0KLS0gSW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSAgICAgICAoMHgwMWY4MDA0OCwgcmVhZC1vbmx5KQotLSBJbnRlcnJ1cHQgbWFzayByZWdpc3RlcgkJICAgICAgICgweDAxZjgwMDRjLCByZWFkLXdyaXRlKQotLSBJbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIJCSAgICAgICAoMHgwMWY4MDA1MCwgd3JpdGUtb25seSkKLS0gSW50ZXJydXB0IGZvcmNlIHJlZ2lzdGVyCQkgICAgICAgKDB4MDFmODAwNTQsIHJlYWQtd3JpdGUpCi0KLTEuNCBCcmVha3BvaW50IGFuZCB3YXRjaHBvaW50IHJlZ2lzdGVyCi0KLVRoZSBicmVha3BvaW50IGFuZCB3YXRjaHBvaW50IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgaW4gdGhlIE1FQwotc3BlY2lmaWNhdGlvbi4gVHJhcHMgYXJlIGNvcnJlY3RseSBnZW5lcmF0ZWQsIGFuZCB0aGUgc3lzdGVtIGZhdWx0IHN0YXR1cwotcmVnaXN0ZXIgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4gSW1wbGVtZXRlZCByZWdpc3RlcnMgYXJlOgotCi0tIERlYnVnIGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDBjMCwgcmVhZC13cml0ZSkKLS0gQnJlYWtwb2ludCByZWdpc3RlcgkJCQkoMHgwMWY4MDBjNCwgd3JpdGUtb25seSkKLS0gV2F0Y2hwb2ludCByZWdpc3RlcgkJCQkoMHgwMWY4MDBjOCwgd3JpdGUtb25seSkKLS0gU3lzdGVtIGZhdWx0IHN0YXR1cyByZWdpc3RlcgkJCSgweDAxZjgwMGEwLCByZWFkLXdyaXRlKQotLSBGaXJ0cyBmYWlsaW5nIGFkZHJlc3MgcmVnaXN0ZXIJCSgweDAxZjgwMGE0LCByZWFkLXdyaXRlKQotCi0KLTEuNSBNZW1vcnkgaW50ZXJmYWNlCi0KLVRoZSBmb2xsb3dpbmcgbWVtb3J5IGFyZWFzIGFyZSB2YWxpZCBmb3IgdGhlIEVSQzMyIHNpbXVsYXRvcjoKLQotMHgwMDAwMDAwMCAtIDB4MDAwODAwMDAJCVJPTSAoNTEyIEtieXRlLCBsb2FkZWQgYXQgc3RhcnQtdXApCi0weDAyMDAwMDAwIC0gMHgwMjQwMDAwMAkJUkFNICg0IE1ieXRlLCBpbml0aWFsaXNlZCB0byAweDApCi0weDAxZjgwMDAwIC0gMHgwMWY4MDBmZgkJTUVDIHJlZ2lzdGVycwotCi1BY2Nlc3MgdG8gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXJzIG9yIG5vbi1leGlzdGluZyBtZW1vcnkgd2lsbCByZXN1bHQKLWluIGEgbWVtb3J5IGV4Y2VwdGlvbiB0cmFwLiBIb3dldmVyLCBhY2Nlc3MgdG8gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXJzCi1pbiB0aGUgYXJlYSAweDAxZjgwMDAwIC0gMHgwMWY4MDEwMCB3aWxsIG5vdCBjYXVzZSBhIG1lbW9yeSBleGNlcHRpb24gdHJhcC4KLVRoZSB3cml0dGVuIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIGEgcmVnaXN0ZXIgYW5kIGNhbiBiZSByZWFkIGJhY2suIEl0Ci1kb2VzIGhvd2V2ZXIgbm90IGFmZmVjdCB0aGUgZnVuY3Rpb24gaW4gYW55IHdheS4gCi0KLVRoZSBtZW1vcnkgY29uZmlndWFydGlvbiByZWdpc3RlciBpcyB1c2VkIHRvIGRlZmluZSBhdmFpbGFibGUgbWVtb3J5Ci1pbiB0aGUgc3lzdGVtLiBUaGUgZmllbGRzIFJTSVogYW5kIFBTSVogYXJlIHVzZWQgdG8gc2V0IFJBTSBhbmQgUk9NCi1zaXplLCB0aGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgbm90IHVzZWQuICBOT1RFOiBhZnRlciByZXNldCwgdGhlIE1FQyAKLWlzIHNldCB0byBkZWNvZGUgNCBLYnl0ZSBvZiBST00gYW5kIDI1NiBLYnl0ZSBvZiBSQU0uIFRoZSBtZW1vcnkgCi1jb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhhcyB0byBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGF2YWlsYWJsZSBtZW1vcnkuIAotCi1UaGUgd2FpdHN0YXRlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXMgdXNlZCB0byBnZW5lcmF0ZSB3YWl0c3RhdGVzLiAKLVRoaXMgcmVnaXN0ZXIgbXVzdCBhbHNvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIGFmdGVyIAotcmVzZXQuCi0KLVRoZSBtZW1vcnkgcHJvdGVjdGlvbiBzY2hlbWUgaXMgaW1wbGVtZW50ZWQgLSBpdCBpcyBlbmFibGVkIHRocm91Z2ggYml0IDMKLWluIHRoZSBNRUMgY29udHJvbCByZWdpc3Rlci4KLQotVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6Ci0KLS0gTUVDIGNvbnRyb2wgcmVnaXN0ZXIgKGJpdCAzIG9ubHkpCQkoMHgwMWY4MDAwMCwgcmVhZC13cml0ZSkKLS0gTWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDAxMCwgcmVhZC13cml0ZSkKLS0gV2FpdHN0YXRlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIJCSgweDAxZjgwMDE4LCByZWFkLXdyaXRlKQotLSBNZW1vcnkgYWNjZXNzIHJlZ2lzdGVyIDAJCQkoMHgwMWY4MDAyMCwgcmVhZC13cml0ZSkKLS0gTWVtb3J5IGFjY2VzcyByZWdpc3RlciAxCQkJKDB4MDFmODAwMjQsIHJlYWQtd3JpdGUpCi0KLTEuNiBXYXRjaGRvZwotCi1UaGUgd2F0Y2hkb2cgaXMgaW1wbGVtZW50ZWQgYXMgaW4gdGhlIHNwZWNpZmljYXRpb24uIFRoZSBpbnB1dCBjbG9jayBpcwotYWx3YXlzIHRoZSBzeXN0ZW0gY2xvY2sgcmVnYXJkc2xlc3Mgb2YgV0RDUyBiaXQgaW4gbWVjIGNvbmZpZ3VyYXRpb24gCi1yZWdpc3Rlci4KLQotVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6Ci0gCi0tIFdhdGNoZG9nIHByb2dyYW0gYW5kIGFja25vd2xlZGdlIHJlZ2lzdGVyCSgweDAxZjgwMDYwLCB3cml0ZS1vbmx5KQotLSBXYXRjaGRvZyB0cmFwIGRvb3Igc2V0IHJlZ2lzdGVyCQkoMHgwMWY4MDA2NCwgd3JpdGUtb25seSkKLQotMS43IFNvZnR3YXJlIHJlc2V0IHJlZ2lzdGVyCi0KLUltcGxlbWVudGVkIGFzIGluIHRoZSBzcGVjaWZpY2F0aW9uICgweDAxZjgwMDAwNCwgd3JpdGUtb25seSkuCi0KLTEuOCBQb3dlci1kb3duIG1vZGUKLQotVGhlIHBvd2VyLWRvd24gcmVnaXN0ZXIgKDB4MDFmODAwMDA4KSBpcyBpbXBsZW1lbnRlZCBhcyBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KLUhvd2V2ZXIsIGlmIHRoZSBzaW11bGF0b3IgZXZlbnQgcXVldWUgaXMgZW1wdHksIHBvd2VyLWRvd24gbW9kZSBpcyBub3QKLWVudGVyZWQgc2luY2Ugbm8gaW50ZXJydXB0IHdvdWxkIGJlIGdlbmVyYXRlZCB0byBleGl0IGZyb20gdGhlIG1vZGUuIEEKLUN0cmwtQyBpbiB0aGUgc2ltdWxhdG9yIHdpbmRvdyB3aWxsIGV4aXQgdGhlIHBvd2VyLWRvd24gbW9kZS4KLQotMS45IE1FQyBjb250cm9sIHJlZ2lzdGVyCi0KLVRoZSBmb2xsb3dpbmcgYml0cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIE1FQyBjb250cm9sIHJlZ2lzdGVyOgotCi1CaXQJTmFtZQlGdW5jdGlvbgotMAlQUkQJUG93ZXItZG93biBtb2RlIGVuYWJsZQotMQlTV1IJU29mdCByZXNldCBlbmFibGUKLTMJQVBSCUFjY2VzcyBwcm90ZWN0aW9uIGVuYWJsZQotCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvUkVBRE1FLmdkYiBiL3NpbS9lcmMzMi9SRUFETUUuZ2RiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTlmY2IzLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9SRUFETUUuZ2RiCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotSG93IHRvIHVzZSBTSVMgd2l0aCBHREIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTEuIEJ1aWxkaW5nIEdEQiB3aXRoIFNJUwotCi1UbyBidWlsZCBHREIgd2l0aCB0aGUgU0lTL0VSQzMyIHNpbXVsYXRvciwgY29uZmlndXJlIHdpdGggb3B0aW9uCi0nLS10YXJnZXQgc3BhcmMtZXJjMzItYW91dCcgYW5kIGJ1aWxkIGFzIHVzdWFsLgotCi0yLiBBdHRhY2hpbmcgdGhlIHNpbXVsYXRvcgotCi1UbyBhdHRhY2ggR0RCIHRvIHRoZSBzaW11bGF0b3IsIHVzZToKLQotdGFyZ2V0IHNpbSBbb3B0aW9uc10gW2ZpbGVzXQotCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKLQotIC1uZnAJCURpc2FibGUgRlBVLiBGUG9wcyB3aWxsIGNhdXNlIGFuIEZQVSBkaXNhYmxlZCB0cmFwLgotCi0gLWZyZXEgPGY+CVNldCB0aGUgc2ltdWxhdGVkICJzeXN0ZW0gY2xvY2siIHRvIDxmPiBNSHouCi0KLSAtdgkJVmVyYm9zZSBtb2RlLgotCi0gLW5vZ2RiCQlEaXNhYmxlIEdEQiBicmVha3BvaW50IGhhbmRsaW5nIChzZWUgYmVsb3cpCi0KLVRoZSBsaXN0ZWQgW2ZpbGVzXSBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gYW91dCBmb3JtYXQgYW5kIHdpbGwgYmUKLWxvYWRlZCBpbiB0aGUgc2ltdWxhdG9yIG1lbW9yeSBwcmlvci4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGxvYWQKLWEgYm9vdCBibG9jayBhdCBhZGRyZXNzIDB4MCBpZiB0aGUgYXBwbGljYXRpb24gaXMgbGlua2VkIHRvIHJ1bgotZnJvbSBSQU0gKDB4MjAwMDAwMCkuCi0KLVRvIHN0YXJ0IGRlYnVnZ2luZyBhIHByb2dyYW0gdHlwZSAnbG9hZCA8cHJvZ3JhbT4nIGFuZCBkZWJ1ZyBhcwotdXN1YWwuIAotCi1UaGUgbmF0aXZlIHNpbXVsYXRvciBjb21tYW5kcyBjYW4gYmUgcmVhY2hlZCB1c2luZyB0aGUgR0RCICdzaW0nCi1jb21tYW5kOgotCi1zaW0gPHNpc19jb21tYW5kPgotCi1EaXJlY3Qgc2ltdWxhdG9yIGNvbW1hbmRzIGR1cmluZyBhIEdEQiBzZXNzaW9uIG11c3QgYmUgaXNzdWVkCi13aXRoIGNhcmUgbm90IHRvIGRpc3R1cmIgR0RCJ3Mgb3BlcmF0aW9uIC4uLiAKLQotRm9yIGluZm8gb24gc3VwcG9ydGVkIEVSQzMyIGZ1bmN0aW9uYWxpdHksIHNlZSBSRUFETUUuc2lzLgotCi0KLTMuIExvYWRpbmcgYW91dCBmaWxlcwotCi1UaGUgR0RCIGxvYWQgY29tbWFuZCBsb2FkcyBhbiBhb3V0IGZpbGUgaW50byB0aGUgc2ltdWxhdG9yCi1tZW1vcnkgd2l0aCB0aGUgZGF0YSBzZWN0aW9uIHN0YXJ0aW5nIGRpcmVjdGx5IGFmdGVyIHRoZSB0ZXh0Ci1zZWN0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2ljaCBzdGFydCBhZGRyZXNzIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBkYXRhCi1hdCBsaW5rIHRpbWUhIFRoaXMgbWVhbnMgdGhhdCB5b3VyIGFwcGxpY2F0aW9ucyBlaXRoZXIgaGFzIHRvIGluY2x1ZGUKLWEgcm91dGluZSB0aGF0IGluaXRpYWxpc2UgdGhlIGRhdGEgc2VnbWVudCBhdCB0aGUgcHJvcGVyIGFkZHJlc3Mgb3IKLWxpbmsgd2l0aCB0aGUgZGF0YSBwbGFjZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHRleHQgc2VjdGlvbi4KLQotQSBjb3B5aW5nIHJvdXRpbmUgaXMgZmFpcmx5IHNpbXBsZSwganVzdCBjb3B5IGFsbCBkYXRhIGJldHdlZW4KLV9ldGV4dCBhbmQgX2RhdGEgdG8gYSBtZW1vcnkgbG9hY3Rpb24gc3RhcnRpbmcgYXQgX2Vudmlyb24uIFRoaXMKLXNob3VsZCBiZSBkb25lIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGJzcyBpcyBjbGVhcmVkIChpbiBzcnQwLnMpLgotCi0KLTQuIEdEQiBicmVha3BvaW50IGhhbmRsaW5nCi0KLUdEQiBpbnNlcnRzIGJyZWFrcG9pbnQgaW4gdGhlIGZvcm0gb2YgdGhlICd0YSAxJyBpbnN0cnVjdGlvbi4gVGhlCi1HREItaW50ZWdyYXRlZCBzaW11bGF0b3Igd2lsbCB0aGVyZWZvcmUgcmVjb2duaXplIHRoZSBicmVha3BvaW50Ci1pbnN0cnVjdGlvbiBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gR0RCLiBJZiB0aGUgYXBwbGljYXRpb24gdXNlcwotJ3RhIDEnLCB0aGUgYnJlYWtwb2ludCBkZXRlY3Rpb24gY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIC1ub2dkYgotc3dpdGNoLiBJbiB0aGlzIGNhc2UgaG93ZXZlciwgR0RCIGJyZWFrcG9pbnRzIHdpbGwgbm90IHdvcmsuCi0KLQotUmVwb3J0IHByb2JsZW1zIHRvIEppcmkgR2Fpc2xlciBFU0EvRVNURUMgKGpnYWlzQHdkLmVzdGVjLmVzYS5ubCkKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9SRUFETUUuc2lzIGIvc2ltL2VyYzMyL1JFQURNRS5zaXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTlmMDMuLjAwMDAwMDAKLS0tIGEvc2ltL2VyYzMyL1JFQURNRS5zaXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotCi1TSVMgLSBTcGFyYyBJbnN0cnVjdGlvbiBTaW11bGF0b3IgUkVBRE1FIGZpbGUgICh2Mi4wLCAwNS0wMi0xOTk2KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBJbnRyb2R1Y3Rpb24KLQotVGhlIFNJUyBpcyBhIFNQQVJDIFY3IGFyY2hpdGVjdHVyZSBzaW11bGF0b3IuIEl0IGNvbnNpc3Qgb2YgdHdvIHBhcnRzLAotdGhlIHNpbXVsYXRvciBjb3JlIGFuZCBhIHVzZXIgZGVmaW5lZCBtZW1vcnkgbW9kdWxlLiBUaGUgc2ltdWxhdG9yCi1jb3JlIGV4ZWN1dGVzIHRoZSBpbnN0cnVjdGlvbnMgd2hpbGUgdGhlIG1lbW9yeSBtb2R1bGUgZW11bGF0ZXMgbWVtb3J5Ci1hbmQgcGVyaXBoZXJhbHMuIAotCi0yLiBVc2FnZQotCi1UaGUgc2ltdWxhdG9yIGlzIHN0YXJ0ZWQgYXMgZm9sbG93czogCi0KLXNpcyBbLXVhcnQxIHVhcnRfZGV2aWNlMV0gWy11YXJ0MiB1YXJ0X2RldmljZTJdIAotICAgIFstbmZwXSBbLWZyZXEgZnJlcXVlbmN5XSBbLWMgYmF0Y2hfZmlsZV0gW2ZpbGVzXSAKLQotVGhlIGRlZmF1bHQgdWFydCBkZXZpY2VzIGZvciBTSVMgYXJlIC9kZXYvcHR5cGMgYW5kIC9kZXYvcHR5cGQuIFRoZQotLXVhcnRbMSwyXSBzd2l0Y2ggY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0aGUgdWFydHMgdG8gb3RoZXIgZGV2aWNlcy4KLVVzZSAndGlwIC9kZXYvdHR5cGMnICB0byBjb25uZWN0IGEgdGVybWluYWwgZW11bGF0b3IgdG8gdGhlIHVhcnRzLgotVGhlICctbmZwJyB3aWxsIGRpc2FibGUgdGhlIHNpbXVsYXRlZCBGUFUsIHNvIGVhY2ggRlBVIGluc3RydWN0aW9uIHdpbGwKLWdlbmVyYXRlIGEgRlBVIGRpc2FibGVkIHRyYXAuIFRoZSAnLWZyZXEnIHN3aXRjaCBjYW4gYmUgdXNlZCB0byBkZWZpbmUKLXdoaWNoICJmcmVxdWVuY3kiIHRoZSBzaW11bGF0b3IgcnVucyBhdC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSAncGVyZicKLWNvbW1hbmQgdG8gY2FsY3VsYXRlZCB0aGUgTUlQUyBmaWd1cmUgZm9yIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uLgotVGhlIGdpdmUgZnJlcXVlbmN5IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBmcmVxdWVuY3kgaW4gTUh6LgotCi1UaGUgLWMgb3B0aW9uIGluZGljYXRlcyB0aGF0IHNpcyBjb21tYW5kcyBzaG91bGQgYmUgcmVhZCBmcm9tICdiYXRjaF9maWxlJyAKLWF0IHN0YXJ0dXAuCi0KLUZpbGVzIHRvIGJlIGxvYWRlZCBtdXN0IGJlIGluIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGZvcm1hdHMgKHNlZSBJTlNUQUxMQVRJT04pLAotYW5kIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIHNpbXVsYXRlZCBtZW1vcnkuIFRoZSBmaWxlIGZvcm1hdHMgYXJlCi1hdXRvbWF0aWNhbGx5IHJlY29nbmlzZWQuCi0KLVRoZSBzY3JpcHQgJ3N0YXJ0c2ltJyB3aWxsIHN0YXJ0IHRoZSBzaW11bGF0b3IgaW4gb25lIHh0ZXJtIHdpbmRvdyBhbmQKLW9wZW4gYSB0ZXJtaW5hbCBlbXVsYXRvciAodGlwKSBjb25uZWN0ZWQgdG8gdGhlIFVBUlQgQSBpbiBhIHNlY29uZAoteHRlcm0gd2luZG93LiBCZWxvdyBpcyBkZXNjcmlwdGlvbiBvZiBjb21tYW5kcyAgdGhhdCBhcmUgcmVjb2duaXplZCBieSAKLXRoZSBzaW11bGF0b3IuIFRoZSBjb21tYW5kLWxpbmUgaXMgcGFyc2VkIHVzaW5nIEdOVSByZWFkbGluZS4gQSBjb21tYW5kCi1oaXN0b3J5IG9mIDY0IGNvbW1hbmRzIGlzIG1haW50YWluZWQuIFVzZSB0aGUgdXAvZG93biBhcnJvd3MgdG8gcmVjYWxsCi1wcmV2aW91cyBjb21tYW5kcy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZWFkbGluZSBkb2N1bWVudGF0aW9uLgotCi1iYXRjaCA8ZmlsZT4KLQotRXhlY3V0ZSBhIGJhdGNoIGZpbGUgb2YgU0lTIGNvbW1hbmRzLgotCi0rYnAgPGFkZHJlc3M+Ci0KLUFkZHMgYW4gYnJlYWtwb2ludCBhdCBhZGRyZXNzIDxhZGRyZXNzPi4KLQotYnAKLQotUHJpbnRzIGFsbCBicmVha3BvaW50cwotCi0tYnAgPG51bT4KLQotRGVsZXRlcyBicmVha3BvaW50IDxudW0+LiBVc2UgJ2JwJyB0byBzZWUgd2hpY2ggbnVtYmVyIGlzIGFzc2lnbmVkIHRvIHRoZSAKLWJyZWFrcG9pbnRzLgotCi1jb250IFtpbnN0X2NvdW50XQotCi1Db250aW51ZSBleGVjdXRpb24gYXQgcHJlc2VudCBwb3NpdGlvbiwgb3B0aW9uYWxseSBmb3IgW2luc3RfY291bnRdIAotaW5zdHJ1Y3Rpb25zLgotCi1kaXMgW2FkZHJdIFtjb3VudF0KLQotRGlzYXNzZW1ibGUgW2NvdW50XSBpbnN0cnVjdGlvbnMgYXQgYWRkcmVzcyBbYWRkcl0uIERlZmF1bHQgdmFsdWVzIGZvcgotY291bnQgaXMgMTYgYW5kIGFkZHIgaXMgdGhlIHByZXNlbnQgYWRkcmVzcy4KLQotZWNobyA8c3RyaW5nPgotCi1QcmludCA8c3RyaW5nPiB0byB0aGUgc2ltdWxhdG9yIHdpbmRvdy4KLQotZmxvYXQKLQotUHJpbnRzIHRoZSBGUFUgcmVnaXN0ZXJzCi0KLWdvIDxhZGRyZXNzPiBbaW5zdF9jb3VudF0KLQotVGhlIGdvIGNvbW1hbmQgd2lsbCBzZXQgcGMgdG8gPGFkZHJlc3M+IGFuZCBucGMgdG8gPGFkZHJlc3M+ICsgNCwgYW5kIHN0YXJ0Ci1leGVjdXRpb24uIE5vIG90aGVyIGluaXRpYWxpc2F0aW9uIHdpbGwgYmUgZG9uZS4gSWYgaW5zdF9jb3VudCBpcyBnaXZlbiwgCi1leGVjdXRpb24gd2lsbCBzdG9wIGFmdGVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KLQotaGVscAotCi1QcmludCBhIHNtYWxsIGhlbHAgbWVudSBmb3IgdGhlIFNJUyBjb21tYW5kcy4KLQotaGlzdCBbdHJhY2VfbGVuZ3RoXQotCi1FbmFibGUgdGhlIGluc3RydWN0aW9uIHRyYWNlIGJ1ZmZlci4gVGhlICd0cmFjZV9sZW5ndGgnIGxhc3QgZXhlY3V0ZWQgCi1pbnN0cnVjdGlvbnMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHRyYWNlIGJ1ZmZlci4gQSAnaGlzdCcgY29tbWFuZCB3aXRob3V0IAotYSB0cmFjZV9sZW5ndGggd2lsbCBkaXNwbGF5IHRoZSB0cmFjZSBidWZmZXIuIFNwZWNpZnlpbmcgYSB6ZXJvIHRyYWNlIAotbGVuZ3RoIHdpbGwgZGlzYWJsZSB0aGUgdHJhY2UgYnVmZmVyLgotCi1sb2FkICA8ZmlsZV9uYW1lPgotCi1Mb2FkcyBhIGZpbGUgaW50byBzaW11bGF0b3IgbWVtb3J5LiAKLQotbWVtIFthZGRyXSBbY291bnRdCi0KLURpc3BsYXkgbWVtb3J5IGF0IFthZGRyXSBmb3IgW2NvdW50XSBieXRlcy4gU2FtZSBkZWZhdWx0IHZhbHVlcyBhcyBhYm92ZS4KLQotcXVpdAotCi1FeGl0cyB0aGUgc2ltdWxhdG9yLgotCi1wZXJmIFtyZXNldF0KLQotVGhlICdwZXJmJyBjb21tYW5kIHdpbGwgZGlzcGxheSB2YXJpb3VzIGV4ZWN1dGlvbiBzdGF0aXN0aWNzLiBBICdwZXJmIHJlc2V0JyAKLWNvbW1hbmQgd2lsbCByZXNldCB0aGUgc3RhdGlzdGljcy4gVGhpcyBjYW4gYmUgdXNlZCBpZiBzdGF0aXN0aWNzIHNoYWxsIAotYmUgY2FsY3VsYXRlZCBvbmx5IG92ZXIgYSBwYXJ0IG9mIHRoZSBwcm9ncmFtLiBUaGUgJ3J1bicgYW5kICdyZXNldCcgCi1jb21tYW5kIGFsc28gcmVzZXRzIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24uCi0KLXJlZyBbcmVnX25hbWVdIFt2YWx1ZV0KLQotUHJpbnRzIGFuZCBzZXRzIHRoZSBJVSByZWdpdGVycy4gJ3JlZycgd2l0aG91dCBwYXJhbWV0ZXJzIHByaW50cyB0aGUgSVUKLXJlZ2lzdGVycy4gJ3JlZyBbcmVnX25hbWVdIFt2YWx1ZV0nIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgdG8KLVt2YWx1ZV0uIFZhbGlkIHJlZ2lzdGVyIG5hbWVzIGFyZSBwc3IsIHRiciwgd2ltLCB5LCBnMS1nNywgbzAtbzcgYW5kCi1sMC1sNy4KLQotcmVzZXQKLQotUGVyZm9ybXMgYSBwb3dlci1vbiByZXNldC4gVGhpcyBjb21tYW5kIGlzIGVxdWFsIHRvICdydW4gMCcuCi0KLXJ1biBbaW5zdF9jb3VudF0KLQotUmVzZXRzIHRoZSBzaW11bGF0b3IgYW5kIHN0YXJ0cyBleGVjdXRpb24gZnJvbSBhZGRyZXNzIDAuIElmIGFuIGluc3RydWN0aW9uCi1jb3VudCBpcyBnaXZlbiAoaW5zdF9jb3VudCksIHRoZSBzaW11bGF0b3Igd2lsbCBzdG9wIGFmdGVyIHRoZSBzcGVjaWZpZWQgCi1udW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiBUaGUgZXZlbnQgcXVldWUgaXMgZW1wdGllZCBidXQgYW55IHNldCBicmVha3BvaW50cwotcmVtYWluLgotCi1zdGVwCi0KLUVxdWFsIHRvICd0cmFjZSAxJwotCi10cmEgW2luc3RfY291bnRdCi0KLVN0YXJ0cyB0aGUgc2ltdWxhdG9yIGF0IHRoZSBwcmVzZW50IHBvc2l0aW9uIGFuZCBwcmludHMgZWFjaCBpbnN0cnVjdGlvbgotaXQgZXhlY3V0ZXMuIElmIGFuIGluc3RydWN0aW9uIGNvdW50IGlzIGdpdmVuIChpbnN0X2NvdW50KSwgdGhlIHNpbXVsYXRvciAKLXdpbGwgc3RvcCBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCi0KLVR5cGluZyBhICdDdHJsLUMnIHdpbGwgaW50ZXJydXB0IGEgcnVubmluZyBzaW11bGF0b3IuIAotCi1TaG9ydCBmb3JtcyBvZiB0aGUgY29tbWFuZHMgYXJlIGFsbG93ZWQsIGUuZyAnYycgJ2NvJyBvciAnY29uJyBhcmUgYWxsCi1pbnRlcnByZXRlZCBhcyAnY29udCcuIAotCi0KLTMuIFNpbXVsYXRvciBjb3JlCi0KLVRoZSBTSVMgZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSA5MEM2MDFFIGFuZCA5MEM2MDJFIHNwYXJjIElVIGFuZAotRlBVIGZyb20gTWF0cmEgTUhTLiBUaGVzZSBhcmUgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoZSBDeXByZXNzIEM2MDEKLWFuZCBDNjAyLiAgVGhlIHNpbXVsYXRvciBpcyBjeWNsZSB0cnVlLCBpLmUgYSBzaW11bGF0b3IgdGltZSBpcwotbWFpbnRhaW5lZCBhbmQgaW5yZW1lbnRlZCBhY2NvcmRpbmcgdGhlIElVIGFuZCBGUFUgaW5zdHJ1Y3Rpb24gdGltaW5nLgotVGhlIHBhcmFsbGVsIGV4ZWN1dGlvbiBiZXR3ZWVuIHRoZSBJVSBhbmQgRlBVIGlzIG1vZGVsbGVkLCBhcyB3ZWxsIGFzCi1zdGFsbHMgZHVlIHRvIG9wZXJhbmQgZGVwZW5kZW5jaWVzIChGUFUpLiBUaGUgY29yZSBpbnRlcmFjdHMgd2l0aCB0aGUKLXVzZXItZGVmaW5lZCBtZW1vcnkgbW9kdWxlcyB0aHJvdWdoIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucy4gVGhlIG1lbW9yeQotbW9kdWxlIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotaW50IG1lbW9yeV9yZWFkKGFzaSxhZGRyLGRhdGEsd3MpCi1pbnQgYXNpOwotdW5zaWduZWQgaW50IGFkZHI7Ci11bnNpZ25lZCBpbnQgKmRhdGE7Ci1pbnQgKndzOwotCi1pbnQgbWVtb3J5X3dyaXRlKGFzaSxhZGRyLGRhdGEsc3osd3MpCi1pbnQgYXNpOwotdW5zaWduZWQgaW50IGFkZHI7Ci11bnNpZ25lZCBpbnQgKmRhdGE7Ci1pbnQgc3o7Ci1pbnQgKndzOwotCi1pbnQgc2lzX21lbW9yeV9yZWFkKGFkZHIsIGRhdGEsIGxlbmd0aCkKLXVuc2lnbmVkIGludCBhZGRyOwotY2hhciAgICpkYXRhOwotdW5zaWduZWQgaW50IGxlbmd0aDsKLQotaW50IHNpc19tZW1vcnlfd3JpdGUoYWRkciwgZGF0YSwgbGVuZ3RoKQotdW5zaWduZWQgaW50IGFkZHI7Ci1jaGFyICAgICpkYXRhOwotdW5zaWduZWQgaW50IGxlbmd0aDsKLQotaW50IGluaXRfc2ltKCkKLQotaW50IHJlc2V0KCkKLQotaW50IGVycm9yX21vZGUocGMpCi11bnNpZ25lZCBpbnQgcGM7Ci0KLW1lbW9yeV9yZWFkKCkgaXMgdXNlZCBieSB0aGUgc2ltdWxhdG9yIHRvIGZldGNoIGluc3RydWN0aW9ucyBhbmQKLW9wZXJhbmRzLiAgVGhlIGFkZHJlc3Mgc3BhY2UgaWRlbnRpZmllciAoYXNpKSBhbmQgYWRkcmVzcyBpcyBwYXNzZWQgYXMKLXBhcmFtZXRlcnMuIFRoZSByZWFkIGRhdGEgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBkYXRhIHBvaW50ZXIKLSgqZGF0YSkgYW5kIHRoZSBudW1iZXIgb2Ygd2FpdHN0YXRlIHRvICp3cy4gJ21lbW9yeV9yZWFkJyBzaG91bGQgcmV0dXJuCi0wIG9uIHN1Y2Nlc3MgYW5kIDEgb24gZmFpbHVyZS4gQSBmYWlsdXJlIHdpbGwgY2F1c2UgYSBkYXRhIG9yCi1pbnN0cnVjdGlvbiBmZXRjaCB0cmFwLiBtZW1vcnlfcmVhZCgpIGFsd2F5cyByZWFkcyBvbmUgMzItYml0IHdvcmQuCi0KLXNpc19tZW1vcnlfcmVhZCgpIGlzIHVzZWQgYnkgdGhlIHNpbXVsYXRvciB0byBkaXNwbGF5IGFuZCBkaXNhc3NlbWJsZQotbWVtb3J5IGNvbnRhbnRzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGNvcHkgJ2xlbmd0aCcgYnl0ZXMgb2YgdGhlIHNpbXVsYXRlZAotbWVtb3J5IHN0YXJ0aW5nIGF0ICdhZGRyJyB0byAnKmRhdGEnLgotVGhlIHNpc19tZW1vcnlfcmVhZCgpIHNob3VsZCByZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIG9uIGZhaWx1cmUuCi1GYWlsdXJlIHNob3VsZCBvbmx5IGJlIGluZGljYXRlZCBpZiBhY2Nlc3MgdG8gdW5pbXBsZW1lbnRlZCBtZW1vcnkgaXMgYXR0ZW1wdGVkLgotCi1tZW1vcnlfd3JpdGUoKSBpcyB1c2VkIHRvIHdyaXRlIHRvIG1lbW9yeS4gSW4gYWRkaXRpb24gdG8gdGhlIGFzaQotYW5kIGFkZHJlc3MgcGFyYW1ldGVycywgdGhlIHNpemUgb2YgdGhlIHdyaXR0ZW4gZGF0YSBpcyBnaXZlbiBieSAnc3onLgotVGhlIHBvaW50ZXIgKmRhdGEgcG9pbnRzIHRvIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uIFRoZSAnc3onIGlzIGNvZGVkCi1hcyBmb2xsb3dzOgotCi0gIHN6CWFjY2VzcyB0eXBlCi0gIDAJICBieXRlCi0gIDEJICBoYWxmd29yZAotICAyCSAgd29yZAotICAzCSAgZG91YmxlLXdvcmQKLQotSWYgYSBkb3VibGUgd29yZCBpcyB3cml0dGVuLCB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIGlzIGluIGRhdGFbMF0gYW5kCi10aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaW4gZGF0YVsxXS4KLQotc2lzX21lbW9yeV93cml0ZSgpIGlzIHVzZWQgYnkgdGhlIHNpbXVsYXRvciBkdXJpbmcgbG9hZGluZyBvZiBwcm9ncmFtcy4KLVRoZSBmdW5jdGlvbiBzaG91bGQgY29weSAnbGVuZ3RoJyBieXRlcyBmcm9tICpkYXRhIHRvIHRoZSBzaW11bGF0ZWQKLW1lbW9yeSBzdGFydGluZyBhdCAnYWRkcicuIHNpc19tZW1vcnlfd3JpdGUoKSBzaG91bGQgcmV0dXJuIDEgb24gCi1zdWNjZXNzIGFuZCAwIG9uIGZhaWx1cmUuIEZhaWx1cmUgc2hvdWxkIG9ubHkgYmUgaW5kaWNhdGVkIGlmIGFjY2VzcyAKLXRvIHVuaW1wbGVtZW50ZWQgbWVtb3J5IGlzIGF0dGVtcHRlZC4gU2VlIGVyYzMyLmMgZm9yIG1vcmUgZGV0YWlscyAKLW9uIGhvdyB0byBkZWZpbmUgdGhlIG1lbW9yeSBlbXVsYXRpb24gZnVuY3Rpb25zLgotCi1UaGUgJ2luaXRfc2ltJyBpcyBjYWxsZWQgb25jZSB3aGVuIHRoZSBzaW11bGF0b3IgaXMgc3RhcnRlZC4gVGhpcyBmdW5jdGlvbgotc2hvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsaXNhdGlvbnMgb2YgdXNlciBkZWZpbmVkIG1lbW9yeSBvciAKLXBlcmlwaGVyYWxzIHRoYXQgb25seSBoYXZlIHRvIGJlIGRvbmUgb25jZSwgc3VjaCBhcyBvcGVuaW5nIGZpbGVzIGV0Yy4KLQotVGhlICdyZXNldCcgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHNpbXVsYXRvciBpcyByZXNldCwgaS5lLiB3aGVuIGEKLSdydW4nIGNvbW1hbmQgaXMgZ2l2ZW4uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8gc2ltdWxhdGUgYSBwb3dlcgotb24gcmVzZXQgb2YgbWVtb3J5IGFuZCBwZXJpcGhlcmFscy4KLQotZXJyb3JfbW9kZSgpIGlzIGNhbGxlZCBieSB0aGUgc2ltdWxhdG9yIHdoZW4gdGhlIElVIGdvZXMgaW50byBlcnJvciBtb2RlLAotdHlwaWNhbGx5IGlmIGEgdHJhcCBpcyBjYXVzZWQgd2hlbiB0cmFwcyBhcmUgZGlzYWJsZWQuIFRoZSBtZW1vcnkgbW9kdWxlCi1jYW4gdGhlbiB0YWtlIGFjdGlvbnMsIHN1Y2ggYXMgaXNzdWUgYSByZXNldC4KLQotc3lzX3Jlc2V0KCkgY2FuIGJlIGNhbGxlZCBieSB0aGUgbWVtb3J5IG1vZHVsZSB0byByZXNldCB0aGUgc2ltdWxhdG9yLiBBCi1yZXNldCB3aWxsIGVtcHR5IHRoZSBldmVudCBxdWV1ZSBhbmQgcGVyZm9ybSBhIHBvd2VyLW9uIHJlc2V0LgotCi00LiBFdmVudHMgYW5kIGludGVycnVwdHMKLQotVGhlIHNpbXVsYXRvciBzdXBwb3J0cyBhbiBldmVudCBxdWV1ZSBhbmQgdGhlIGdlbmVyYXRpb24gb2YgcHJvY2Vzc29yCi1pbnRlcnJ1cHRzLiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyLWRlZmluZWQKLW1lbW9yeSBtb2R1bGU6Ci0KLWV2ZW50KGNmdW5jLGFyZyxkZWx0YSkKLXZvaWQgKCpjZnVuYykoKTsKLWludCBhcmc7Ci11bnNpZ25lZCBpbnQgZGVsdGE7Ci0KLXNldF9pbnQobGV2ZWwsY2FsbGJhY2ssYXJnKQotaW50IGxldmVsOwotdm9pZCAoKmNhbGxiYWNrKSgpOwotaW50IGFyZzsKLQotY2xlYXJfaW50KGxldmVsKQotaW50IGxldmVsOwotCi1zaW1fc3RvcCgpCi0KLVRoZSAnZXZlbnQnIGZ1bmN0aW9ucyB3aWxsIHNjaGVkdWxlIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uICdjZnVuYycKLWF0IHRpbWUgJ25vdyArIGRlbHRhJyBjbG9jayBjeWNsZXMuIFRoZSBwYXJhbWV0ZXIgJ2FyZycgaXMgcGFzc2VkIGFzIGEgCi1wYXJhbWV0ZXIgdG8gJ2NmdW5jJy4KLQotVGhlICdzZXRfaW50JyBmdW5jdGlvbiBzZXQgdGhlIHByb2Nlc3NvciBpbnRlcnJ1cHQgJ2xldmVsJy4gV2hlbiB0aGUgaW50ZXJydXB0Ci1pcyB0YWtlbiwgdGhlIGZ1bmN0aW9uICdjYWxsYmFjaycgaXMgY2FsbGVkIHdpdGggdGhlIGFyZ3VtZW50ICdhcmcnLiBUaGlzCi13aWxsIGFsc28gY2xlYXIgdGhlIGludGVycnVwdC4gQW4gaW50ZXJydXB0IGNhbiBiZSBjbGVhcmVkIGJlZm9yZSBpdCBpcwotdGFrZW4gYnkgY2FsbGluZyAnY2xlYXJfaW50JyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQgbGV2ZWwuCi0KLVRoZSBzaW1fc3RvcCBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBzaW11bGF0b3Igc3RvcHMgZXhlY3V0aW9uLgotSXQgY2FuIGJlIHVzZWQgdG8gZmx1c2ggYnVmZmVyZWQgZGV2aWNlcyB0byBnZXQgYSBjbGVhbiBzdGF0ZSBkdXJpbmcKLXNpbmdsZSBzdGVwcGluZyBldGMuCi0KLVNlZSAnZXJjMzIuYycgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgZXZlbnRzIGFuZCBpbnRlcnJ1cHRzLgotCi01LiBNZW1vcnkgbW9kdWxlCi0KLVRoZSBzdXBwbGllZCBtZW1vcnkgbW9kdWxlIChlcmMzMi5jKSBlbXVsYXRlcyB0aGUgZnVuY3Rpb25zIG9mIG1lbW9yeSBhbmQKLXRoZSBNRUMgYXNpYyBkZXZlbG9wZWQgZm9yIHRoZSA5MEM2MDEvMi4gSXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0KLSogVUFSVCBBICYgQgotKiBSZWFsLXRpbWUgY2xvY2sKLSogR2VuZXJhbCBwdXJwb3NlIHRpbWVyCi0qIEludGVycnVwdCBjb250cm9sbGVyCi0qIEJyZWFrcG9pbnQgcmVnaXN0ZXIKLSogV2F0Y2hwb2ludCByZWdpc3RlcgotKiA1MTIgS2J5dGUgUk9NCi0qIDQgTWJ5dGUgUkFNCi0KLVNlZSBSRUFETUUuZXJjMzIgb24gaG93IHRoZSBNRUMgZnVuY3Rpb25zIGFyZSBlbXVsYXRlZC4gIEZvciBhIGRldGFpbGVkIE1FQwotc3BlY2lmaWNhdGlvbiwgbG9vayBhdCB0aGUgRVJDMzIgaG9tZSBwYWdlIGF0IFVSTDoKLQotaHR0cDovL3d3dy5lc3RlYy5lc2Eubmwvd3Ntd3d3L2VyYzMyCi0KLTYuIENvbXBpbGUgYW5kIGxpbmtpbmcgcHJvZ3JhbXMKLQotVGhlIGRpcmVjdG9yeSAnZXhhbXBsZXMnIGNvbnRhaW4gc29tZSBjb2RlIGZyYWdtZW50cyBmb3IgU0lTLgotVGhlIHNjcmlwdCBnY2N4IGluZGljYXRlcyBob3cgdGhlIG5hdGl2ZSBzdW5vcyBnY2MgYW5kIGxpbmtlciBjYW4gYmUgdXNlZAotdG8gcHJvZHVjZSBleGVjdXRhYmxlcyBmb3IgdGhlIHNpbXVsYXRvci4gVG8gY29tcGlsZSBhbmQgbGluayB0aGUgcHJvdmlkZWQKLSdoZWxsby5jJywgdHlwZSAnZ2NjeCBoZWxsby5jJy4gVGhpcyB3aWxsIGJ1aWxkIHRoZSBleGVjdXRhYmxlICdoZWxsbycuCi1TdGFydCB0aGUgc2ltdWxhdG9yIGJ5IHJ1bm5pbmcgJ3N0YXJ0c2ltIGhlbGxvJywgYW5kIGlzc3VlIHRoZSBjb21tYW5kICdydW4uCi1BZnRlciB0aGUgcHJvZ3JhbSBpcyB0ZXJtaW5hdGVkLCB0aGUgSVUgd2lsbCBiZSBmb3JjZSB0byBlcnJvciBtb2RlIHRocm91Z2gKLWEgc29mdHdhcmUgdHJhcCBhbmQgaGFsdC4gCi0KLVRoZSBwcm9ncmFtcyBhcmUgbGlua2VkIHdpdGggYSBzdGFydC11cCBmaWxlLCBzcnQwLlMuIFRoaXMgZmlsZSBpbmNsdWRlcwotdGhlIHRyYXB0YWJsZSBhbmQgd2luZG93IHVuZGVyZmxvdy9vdmVyZmxvdyB0cmFwIHJvdXRpbmVzLgotCi03LiBJVSBhbmQgRlBVIGluc3RydWN0aW9uIHRpbWluZy4KLQotVGhlIHNpbXVsYXRvciBwcm92aWRlcyBjeWNsZSB0cnVlIHNpbXVsYXRpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKLXRoZSBlbXVsYXRlZCBpbnN0cnVjdGlvbiB0aW1pbmcgZm9yIDkwQzYwMUUgJiA5MEM2MDJFOgotCi1JbnN0cnVjdGlvbnMJICAgICAgQ3ljbGVzCi0KLWptcGwsIHJldHQJCTIKLWxvYWQJCQkyCi1zdG9yZQkJCTMKLWxvYWQgZG91YmxlCQkzCi1zdG9yZSBkb3VibGUJCTQKLW90aGVyIGludGVnZXIgb3BzCTEKLWZhYnMJCQkyCi1mYWRkcwkJCTQKLWZhZGRkCQkJNAotZmNtcHMJCQk0Ci1mY21wZAkJCTQKLWZkaXZzCQkJMjAKLWZkaXZkCQkJMzUKLWZtb3ZzCQkJMgotZm11bHMJCQk1Ci1mbXVsZAkJCTkKLWZuZWdzCQkJMgotZnNxcnRzCQkJMzcKLWZzcXJ0ZAkJCTY1Ci1mc3VicwkJCTQKLWZzdWJkCQkJNAotZmR0b2kJCQk3Ci1mZG90cwkJCTMKLWZpdG9zCQkJNgotZml0b2QJCQk2Ci1mc3RvaQkJCTYKLWZzdG9kCQkJMgotCi1UaGUgcGFyYWxsZWwgb3BlcmF0aW9uIGJldHdlZW4gdGhlIElVIGFuZCBGUFUgaXMgbW9kZWxsZWQuIFRoaXMgbWVhbnMKLXRoYXQgYSBGUFUgaW5zdHJ1Y3Rpb24gd2lsbCBleGVjdXRlIGluIHBhcmFsbGVsIHdpdGggb3RoZXIgaW5zdHJ1Y3Rpb25zIGFzCi1sb25nIGFzIG5vIGRhdGEgb3IgcmVzb3VyY2UgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZC4gU2VlIHRoZSA5MEM2MDJFIGRhdGEKLXNoZWV0IGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBkZXBlbmRlbmNpZXMuIFRyYWNpbmcgdXNpbmcgdGhlICd0cmFjZScKLWNvbW1hbmQgd2lsbCBkaXNwbGF5IHRoZSBjdXJyZW50IHNpbXVsYXRvciB0aW1lIGluIHRoZSBsZWZ0IGNvbHVtbi4gVGhpcwotdGltZSBpbmRpY2F0ZXMgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgZmV0Y2hlZC4gSWYgYSBkZXBlbmRlbmN5IGlzIGRldGV0ZWN0ZWQsCi10aGUgZm9sbG93aW5nIGZldGNoIHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgY29uZmxpY3QgaXMgcmVzb2x2ZWQuCi0KLVRoZSBsb2FkIGRlcGVuZGVuY3kgaW4gdGhlIDkwQzYwMUUgaXMgYWxzbyBtb2RlbGxlZCAtIGlmIHRoZSBkZXN0aW5hdGlvbiAKLXJlZ2lzdGVyIG9mIGEgbG9hZCBpbnN0cnVjdGlvbiBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24sIGFuIAotaWRsZSBjeWNsZSBpcyBpbnNlcnRlZC4KLQotOC4gRlBVIGltcGxlbWVudGF0aW9uCi0KLVRoZSBzaW11bGF0b3IgbWFwcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIG9uIHRoZSBob3N0cyBmbG9hdGluZyBwb2ludAotY2FwYWJpbGl0aWVzLiBUaGlzIG1lYW5zIHRoYXQgYWNjdXJhY3kgYW5kIGdlbmVyYXRpb24gb2YgSUVFRSBleGNlcHRpb25zIGlzIAotaG9zdCBkZXBlbmRlbnQuCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvYWNjb25maWcuaCBiL3NpbS9lcmMzMi9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvY29uZmlnLmluIGIvc2ltL2VyYzMyL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4N2EyYi4uMDAwMDAwMAotLS0gYS9zaW0vZXJjMzIvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvY29uZmlndXJlIGIvc2ltL2VyYzMyL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU1NjIyMy4uMDAwMDAwMAotLS0gYS9zaW0vZXJjMzIvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDA5NiArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLWZvciBhY19oZHIgaW4gc3RkbGliLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBJbiB0aGUgQ3lnd2luIGVudmlyb25tZW50LCB3ZSBuZWVkIHNvbWUgYWRkaXRpb25hbCBmbGFncy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjeWd3aW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NDA6IGNoZWNraW5nIGZvciBjeWd3aW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3NpbV9jdl9vc19jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fQ1lHV0lOX18KLWxvc2UKLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJsb3NlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBzaW1fY3Zfb3NfY3lnd2luPXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIHNpbV9jdl9vc19jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRzaW1fY3Zfb3NfY3lnd2luIiAxPiY2Ci0KLWlmIHRlc3QgeCRzaW1fY3Zfb3NfY3lnd2luID0geHllczsgdGhlbgotICBURVJNQ0FQPSdgaWYgdGVzdCAtciAuLi8uLi9saWJ0ZXJtY2FwL2xpYnRlcm1jYXAuYTsgdGhlbiBlY2hvIC4uLy4uL2xpYnRlcm1jYXAvbGlidGVybWNhcC5hOyBlbHNlIGVjaG8gLWx0ZXJtY2FwOyBmaWAgLWx1c2VyMzInCi1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtYWluIGluIC1sdGVybWNhcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU3MDogY2hlY2tpbmcgZm9yIG1haW4gaW4gLWx0ZXJtY2FwIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gdGVybWNhcCdfJ21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sdGVybWNhcCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBURVJNQ0FQPS1sdGVybWNhcAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLVRFUk1DQVA9IiIKLWZpCi0KLWZpCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBURVJNQ0FQQCUkVEVSTUNBUCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2NvbmZpZ3VyZS5pbiBiL3NpbS9lcmMzMi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjM0M2QuLjAwMDAwMDAKLS0tIGEvc2ltL2VyYzMyL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oKQotCi0jIEluIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQsIHdlIG5lZWQgc29tZSBhZGRpdGlvbmFsIGZsYWdzLgotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBjeWd3aW5dLCBzaW1fY3Zfb3NfY3lnd2luLAotW0FDX0VHUkVQX0NQUChsb3NlLCBbCi0jaWZkZWYgX19DWUdXSU5fXwotbG9zZQotI2VuZGlmXSxbc2ltX2N2X29zX2N5Z3dpbj15ZXNdLFtzaW1fY3Zfb3NfY3lnd2luPW5vXSldKQotCi1pZiB0ZXN0IHgkc2ltX2N2X29zX2N5Z3dpbiA9IHh5ZXM7IHRoZW4KLSAgVEVSTUNBUD0nYGlmIHRlc3QgLXIgLi4vLi4vbGlidGVybWNhcC9saWJ0ZXJtY2FwLmE7IHRoZW4gZWNobyAuLi8uLi9saWJ0ZXJtY2FwL2xpYnRlcm1jYXAuYTsgZWxzZSBlY2hvIC1sdGVybWNhcDsgZmlgIC1sdXNlcjMyJwotZWxzZQotICBBQ19DSEVDS19MSUIodGVybWNhcCwgbWFpbiwgVEVSTUNBUD0tbHRlcm1jYXAsIFRFUk1DQVA9IiIpCi1maQotQUNfU1VCU1QoVEVSTUNBUCkKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2VuZC5jIGIvc2ltL2VyYzMyL2VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNmZDc5Li4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9lbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4oKQotewotCi0gICAgdW5zaWduZWQgaW50ICAgIHUxOwotICAgIGNoYXIgICAgICAgICAgICpjOwotICAgIGRvdWJsZSAgICAgICAgICBkMTsKLSAgICBmbG9hdCAgICAgICAgICAqZjE7Ci0KLSAgICBjID0gKGNoYXIgKikgJnUxOwotICAgIHUxID0gMHgwRjsKLSAgICBpZiAoY1swXSA9PSAweDBGKQotCXB1dHMoIiNkZWZpbmUgSE9TVF9MSVRUTEVfRU5ESUFOXG4iKTsKLSAgICBlbHNlCi0JcHV0cygiI2RlZmluZSBIT1NUX0JJR19FTkRJQU5cbiIpOwotCi0gICAgZDEgPSAxLjA7Ci0gICAgZjEgPSAoZmxvYXQgKikgJmQxOwotICAgIGlmICgqKChpbnQgKikgZjEpICE9IDB4M2ZmMDAwMDApCi0JcHV0cygiI2RlZmluZSBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVRcbiIpOwotICAgIGVsc2UKLQlwdXRzKCIjZGVmaW5lIEhPU1RfQklHX0VORElBTl9GTE9BVFxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvZXJjMzIuYyBiL3NpbS9lcmMzMi9lcmMzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjNmM2FjLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9lcmMzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgotICogCi0gKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMi41IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCi0gKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQotICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqIAotICovCi0KLS8qIFRoZSBjb250cm9sIHNwYWNlIGRldmljZXMgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHN5cy9mY250bC5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAic2lzLmgiCi0jaW5jbHVkZSAiZW5kLmgiCi0jaW5jbHVkZSAic2ltLWNvbmZpZy5oIgotCi1leHRlcm4gaW50ICAgICAgY3RybF9jOwotZXh0ZXJuIGludDMyICAgIHNpc192ZXJib3NlOwotZXh0ZXJuIGludDMyICAgIHNwYXJjbGl0ZSwgc3BhcmNsaXRlX2JvYXJkOwotZXh0ZXJuIGludCAgICAgIHJvbTgsd3JwLHViZW47Ci1leHRlcm4gY2hhciAgICAgdWFydF9kZXYxW10sIHVhcnRfZGV2MltdOwotCi1pbnQgZHVtYmlvID0gMDsgLyogbm9ybWFsLCBzbWFydCwgdGVybWluYWwgb3JpZW50ZWQgSU8gYnkgZGVmYXVsdCAqLwotCi0vKiBNRUMgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE1FQ19TVEFSVCAJMHgwMWY4MDAwMAotI2RlZmluZSBNRUNfRU5EIAkweDAxZjgwMTAwCi0KLS8qIE1lbW9yeSBleGNlcHRpb24gd2FpdHN0YXRlcyAqLwotI2RlZmluZSBNRU1fRVhfV1MgCTEKLQotLyogRVJDMzIgYWx3YXlzIGFkZHMgb25lIHdhaXRzdGF0ZSBkdXJpbmcgUkFNIHN0ZCAqLwotI2RlZmluZSBTVERfV1MgMQotCi0jaWZkZWYgRVJSSU5KCi1leHRlcm4gaW50IGVycm1lYzsKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0J3MgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuIGJ5IGRlZmF1bHQgdW50aWwgd2UgbG9hZCBhCi0gICBsaXR0bGUtZW5kaWFuIHByb2dyYW0uICAqLwotCi1pbnQJY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47Ci0KLSNkZWZpbmUgTUVDX1dTCTAJCS8qIFdhaXRzdGF0ZXMgcGVyIE1FQyBhY2Nlc3MgKDAgd3MpICovCi0jZGVmaW5lIE1PSwkwCi0KLS8qIE1FQyByZWdpc3RlciBhZGRyZXNzZXMgKi8KLQotI2RlZmluZSBNRUNfTUNSCQkweDAwMAotI2RlZmluZSBNRUNfU0ZSICAJMHgwMDQKLSNkZWZpbmUgTUVDX1BXRFIgIAkweDAwOAotI2RlZmluZSBNRUNfTUVNQ0ZHCTB4MDEwCi0jZGVmaW5lIE1FQ19JT0NSCTB4MDE0Ci0jZGVmaW5lIE1FQ19XQ1IJCTB4MDE4Ci0KLSNkZWZpbmUgTUVDX01BUjAgIAkweDAyMAotI2RlZmluZSBNRUNfTUFSMSAgCTB4MDI0Ci0KLSNkZWZpbmUgTUVDX1NTQTEgCTB4MDIwCi0jZGVmaW5lIE1FQ19TRUExIAkweDAyNAotI2RlZmluZSBNRUNfU1NBMiAJMHgwMjgKLSNkZWZpbmUgTUVDX1NFQTIgCTB4MDJDCi0jZGVmaW5lIE1FQ19JU1IJCTB4MDQ0Ci0jZGVmaW5lIE1FQ19JUFIJCTB4MDQ4Ci0jZGVmaW5lIE1FQ19JTVIgCTB4MDRDCi0jZGVmaW5lIE1FQ19JQ1IgCTB4MDUwCi0jZGVmaW5lIE1FQ19JRlIgCTB4MDU0Ci0jZGVmaW5lIE1FQ19XRE9HICAJMHgwNjAKLSNkZWZpbmUgTUVDX1RSQVBEICAJMHgwNjQKLSNkZWZpbmUgTUVDX1JUQ19DT1VOVEVSCTB4MDgwCi0jZGVmaW5lIE1FQ19SVENfUkVMT0FECTB4MDgwCi0jZGVmaW5lIE1FQ19SVENfU0NBTEVSCTB4MDg0Ci0jZGVmaW5lIE1FQ19HUFRfQ09VTlRFUgkweDA4OAotI2RlZmluZSBNRUNfR1BUX1JFTE9BRAkweDA4OAotI2RlZmluZSBNRUNfR1BUX1NDQUxFUgkweDA4QwotI2RlZmluZSBNRUNfVElNRVJfQ1RSTAkweDA5OAotI2RlZmluZSBNRUNfU0ZTUgkweDBBMAotI2RlZmluZSBNRUNfRkZBUgkweDBBNAotI2RlZmluZSBNRUNfRVJTUgkweDBCMAotI2RlZmluZSBNRUNfREJHCQkweDBDMAotI2RlZmluZSBNRUNfVENSCQkweDBEMAotCi0jZGVmaW5lIE1FQ19CUksJCTB4MEM0Ci0jZGVmaW5lIE1FQ19XUFIJCTB4MEM4Ci0KLSNkZWZpbmUgTUVDX1VBUlRBCTB4MEUwCi0jZGVmaW5lIE1FQ19VQVJUQgkweDBFNAotI2RlZmluZSBNRUNfVUFSVF9DVFJMCTB4MEU4Ci0jZGVmaW5lIFNJTV9MT0FECTB4MEYwCi0KLS8qIE1lbW9yeSBleGNlcHRpb24gY2F1c2VzICovCi0jZGVmaW5lIFBST1RfRVhDCTB4MwotI2RlZmluZSBVSU1QX0FDQwkweDQKLSNkZWZpbmUgTUVDX0FDQwkJMHg2Ci0jZGVmaW5lIFdBVENIX0VYQwkweGEKLSNkZWZpbmUgQlJFQUtfRVhDCTB4YgotCi0vKiBTaXplIG9mIFVBUlQgYnVmZmVycyAoYnl0ZXMpICovCi0jZGVmaW5lIFVBUlRCVUYJMTAyNAotCi0vKiBOdW1iZXIgb2Ygc2ltdWxhdG9yIHRpY2tzIGJldHdlZW4gZmx1c2hpbmcgdGhlIFVBUlRTLiAJICovCi0vKiBGb3IgZ29vZCBwZXJmb3JtYW5jZSwga2VlcCBhYm92ZSAxMDAwCQkJICovCi0jZGVmaW5lIFVBUlRfRkxVU0hfVElNRQkgIDMwMDAKLQotLyogTUVDIHRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLwotI2RlZmluZSBUQ1JfR0FDUiAxCi0jZGVmaW5lIFRDUl9HQUNMIDIKLSNkZWZpbmUgVENSX0dBU0UgNAotI2RlZmluZSBUQ1JfR0FTTCA4Ci0jZGVmaW5lIFRDUl9UQ1JDUiAweDEwMAotI2RlZmluZSBUQ1JfVENSQ0wgMHgyMDAKLSNkZWZpbmUgVENSX1RDUlNFIDB4NDAwCi0jZGVmaW5lIFRDUl9UQ1JTTCAweDgwMAotCi0vKiBOZXcgdWFydCBkZWZpbmVzICovCi0jZGVmaW5lIFVBUlRfVFhfVElNRQkxMDAwCi0jZGVmaW5lIFVBUlRfUlhfVElNRQkxMDAwCi0jZGVmaW5lIFVBUlRBX0RSCTB4MQotI2RlZmluZSBVQVJUQV9TUkUJMHgyCi0jZGVmaW5lIFVBUlRBX0hSRQkweDQKLSNkZWZpbmUgVUFSVEFfT1IJMHg0MAotI2RlZmluZSBVQVJUQV9DTFIJMHg4MAotI2RlZmluZSBVQVJUQl9EUgkweDEwMDAwCi0jZGVmaW5lIFVBUlRCX1NSRQkweDIwMDAwCi0jZGVmaW5lIFVBUlRCX0hSRQkweDQwMDAwCi0jZGVmaW5lIFVBUlRCX09SCTB4NDAwMDAwCi0jZGVmaW5lIFVBUlRCX0NMUgkweDgwMDAwMAotCi0jZGVmaW5lIFVBUlRfRFIJCTB4MTAwCi0jZGVmaW5lIFVBUlRfVFNFCTB4MjAwCi0jZGVmaW5lIFVBUlRfVEhFCTB4NDAwCi0KLS8qIE1FQyByZWdpc3RlcnMgKi8KLQotc3RhdGljIGNoYXIgICAgIGZuYW1lWzI1Nl07Ci1zdGF0aWMgaW50MzIgICAgZmluZCA9IDA7Ci1zdGF0aWMgdWludDMyICAgbWVjX3NzYVsyXTsJLyogV3JpdGUgcHJvdGVjdGlvbiBzdGFydCBhZGRyZXNzICovCi1zdGF0aWMgdWludDMyICAgbWVjX3NlYVsyXTsJLyogV3JpdGUgcHJvdGVjdGlvbiBlbmQgYWRkcmVzcyAqLwotc3RhdGljIHVpbnQzMiAgIG1lY193cHJbMl07CS8qIFdyaXRlIHByb3RlY3Rpb24gY29udHJvbCBmaWVsZHMgKi8KLXN0YXRpYyB1aW50MzIgICBtZWNfc2ZzcjsKLXN0YXRpYyB1aW50MzIgICBtZWNfZmZhcjsKLXN0YXRpYyB1aW50MzIgICBtZWNfaXByOwotc3RhdGljIHVpbnQzMiAgIG1lY19pbXI7Ci1zdGF0aWMgdWludDMyICAgbWVjX2lzcjsKLXN0YXRpYyB1aW50MzIgICBtZWNfaWNyOwotc3RhdGljIHVpbnQzMiAgIG1lY19pZnI7Ci1zdGF0aWMgdWludDMyICAgbWVjX21jcjsJLyogTUVDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLXN0YXRpYyB1aW50MzIgICBtZWNfbWVtY2ZnOwkvKiBNZW1vcnkgY29udHJvbCByZWdpc3RlciAqLwotc3RhdGljIHVpbnQzMiAgIG1lY193Y3I7CS8qIE1FQyB3YWl0c3RhdGUgcmVnaXN0ZXIgKi8KLXN0YXRpYyB1aW50MzIgICBtZWNfaW9jcjsJLyogTUVDIElPIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLXN0YXRpYyB1aW50MzIgICBwb3N0ZWRfaXJxOwotc3RhdGljIHVpbnQzMiAgIG1lY19lcnNyOwkvKiBNRUMgZXJyb3IgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotc3RhdGljIHVpbnQzMiAgIG1lY190Y3I7CS8qIE1FQyB0ZXN0IGNvbXRyb2wgcmVnaXN0ZXIgKi8KLQotc3RhdGljIHVpbnQzMiAgIHJ0Y19jb3VudGVyOwotc3RhdGljIHVpbnQzMiAgIHJ0Y19yZWxvYWQ7Ci1zdGF0aWMgdWludDMyICAgcnRjX3NjYWxlcjsKLXN0YXRpYyB1aW50MzIgICBydGNfc2NhbGVyX3N0YXJ0Owotc3RhdGljIHVpbnQzMiAgIHJ0Y19lbmFibGVkOwotc3RhdGljIHVpbnQzMiAgIHJ0Y19jcjsKLXN0YXRpYyB1aW50MzIgICBydGNfc2U7Ci0KLXN0YXRpYyB1aW50MzIgICBncHRfY291bnRlcjsKLXN0YXRpYyB1aW50MzIgICBncHRfcmVsb2FkOwotc3RhdGljIHVpbnQzMiAgIGdwdF9zY2FsZXI7Ci1zdGF0aWMgdWludDMyICAgZ3B0X3NjYWxlcl9zdGFydDsKLXN0YXRpYyB1aW50MzIgICBncHRfZW5hYmxlZDsKLXN0YXRpYyB1aW50MzIgICBncHRfY3I7Ci1zdGF0aWMgdWludDMyICAgZ3B0X3NlOwotCi1zdGF0aWMgdWludDMyICAgd2RvZ19zY2FsZXI7Ci1zdGF0aWMgdWludDMyICAgd2RvZ19jb3VudGVyOwotc3RhdGljIHVpbnQzMiAgIHdkb2dfcnN0X2RlbGF5Owotc3RhdGljIHVpbnQzMiAgIHdkb2dfcnN0b247Ci0KLWVudW0gd2RvZ190eXBlIHsKLSAgICBpbml0LCBkaXNhYmxlZCwgZW5hYmxlZCwgc3RvcHBlZAotfTsKLQotc3RhdGljIGVudW0gd2RvZ190eXBlIHdkb2dfc3RhdHVzOwotCi0KLS8qIFJPTSBzaXplIDEwMjQgS2J5dGUgKi8KLSNkZWZpbmUgUk9NX1NaCSAJMHgxMDAwMDAKLSNkZWZpbmUgUk9NX01BU0sgCTB4MGZmZmZmCi0KLS8qIFJBTSBzaXplIDQgTWJ5dGUgKi8KLSNkZWZpbmUgUkFNX1NUQVJUIAkweDAyMDAwMDAwCi0jZGVmaW5lIFJBTV9FTkQgCTB4MDI0MDAwMDAKLSNkZWZpbmUgUkFNX01BU0sgCTB4MDAzZmZmZmYKLQotLyogU1BBUkNsaXRlIGJvYXJkcyBhbGwgc2VlbSB0byBoYXZlIFJBTSBhdCB0aGUgc2FtZSBwbGFjZS4gKi8KLSNkZWZpbmUgUkFNX1NUQVJUX1NMSVRFCTB4NDAwMDAwMDAKLSNkZWZpbmUgUkFNX0VORF9TTElURSAJMHg0MDQwMDAwMAotI2RlZmluZSBSQU1fTUFTS19TTElURSAJMHgwMDNmZmZmZgotCi0vKiBNZW1vcnkgc3VwcG9ydCB2YXJpYWJsZXMgKi8KLQotc3RhdGljIHVpbnQzMiAgIG1lbV9yYW1yX3dzOwkvKiBSQU0gcmVhZCB3YWl0c3RhdGVzICovCi1zdGF0aWMgdWludDMyICAgbWVtX3JhbXdfd3M7CS8qIFJBTSB3cml0ZSB3YWl0c3RhdGVzICovCi1zdGF0aWMgdWludDMyICAgbWVtX3JvbXJfd3M7CS8qIFJPTSByZWFkIHdhaXRzdGF0ZXMgKi8KLXN0YXRpYyB1aW50MzIgICBtZW1fcm9td193czsJLyogUk9NIHdyaXRlIHdhaXRzdGF0ZXMgKi8KLXN0YXRpYyB1aW50MzIJbWVtX3JhbXN0YXJ0OwkvKiBSQU0gc3RhcnQgKi8KLXN0YXRpYyB1aW50MzIJbWVtX3JhbWVuZDsJLyogUkFNIGVuZCAqLwotc3RhdGljIHVpbnQzMgltZW1fcmFtbWFzazsJLyogUkFNIGFkZHJlc3MgbWFzayAqLwotc3RhdGljIHVpbnQzMiAgIG1lbV9yYW1zejsJLyogUkFNIHNpemUgKi8KLXN0YXRpYyB1aW50MzIgICBtZW1fcm9tc3o7CS8qIFJPTSBzaXplICovCi1zdGF0aWMgdWludDMyICAgbWVtX2FjY3Byb3Q7CS8qIFJBTSB3cml0ZSBwcm90ZWN0aW9uIGVuYWJsZWQgKi8KLXN0YXRpYyB1aW50MzIgICBtZW1fYmxvY2twcm90OwkvKiBSQU0gYmxvY2sgd3JpdGUgcHJvdGVjdGlvbiBlbmFibGVkICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCXJvbWJbUk9NX1NaXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCXJhbWJbUkFNX0VORCAtIFJBTV9TVEFSVF07Ci0KLQotLyogVUFSVCBzdXBwb3J0IHZhcmlhYmxlcyAqLwotCi1zdGF0aWMgaW50MzIgICAgZmQxLCBmZDI7CS8qIGZpbGUgZGVzY3JpcHRvciBmb3IgaW5wdXQgZmlsZSAqLwotc3RhdGljIGludDMyICAgIFVjb250cm9sOwkvKiBVQVJUIHN0YXR1cyByZWdpc3RlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXFbVUFSVEJVRl0sIGJxW1VBUlRCVUZdOwotc3RhdGljIGludDMyICAgIGFudW0sIGFpbmQgPSAwOwotc3RhdGljIGludDMyICAgIGJudW0sIGJpbmQgPSAwOwotc3RhdGljIGNoYXIgICAgIHdidWZhW1VBUlRCVUZdLCB3YnVmYltVQVJUQlVGXTsKLXN0YXRpYyB1bnNpZ25lZCB3bnVtYTsKLXN0YXRpYyB1bnNpZ25lZCB3bnVtYjsKLXN0YXRpYyBGSUxFICAgICpmMWluLCAqZjFvdXQsICpmMmluLCAqZjJvdXQ7Ci1zdGF0aWMgc3RydWN0IHRlcm1pb3MgaW9jMSwgaW9jMiwgaW9jb2xkMSwgaW9jb2xkMjsKLXN0YXRpYyBpbnQgICAgICBmMW9wZW4gPSAwLCBmMm9wZW4gPSAwOwotCi1zdGF0aWMgY2hhciAgICAgdWFydGFfc3JlZywgdWFydGFfaHJlZywgdWFydGJfc3JlZywgdWFydGJfaHJlZzsKLXN0YXRpYyB1aW50MzIgICB1YXJ0X3N0YXRfcmVnOwotc3RhdGljIHVpbnQzMiAgIHVhcnRhX2RhdGEsIHVhcnRiX2RhdGE7Ci0KLSNpZmRlZiBFUkEKLWludCBlcmEgPSAwOwotaW50IGVyYXJlZzsKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAlkZWNvZGVfZXJzciBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgRVJSSU5KCi1zdGF0aWMgdm9pZAlpdWNvbXBlcnIgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZAltZWNwYXJlcnJvciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAlkZWNvZGVfbWVtY2ZnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkCWRlY29kZV93Y3IgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQJZGVjb2RlX21jciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAljbG9zZV9wb3J0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkCW1lY19yZXNldCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAltZWNfaW50YWNrIFBBUkFNUyAoKGludDMyIGxldmVsKSk7Ci1zdGF0aWMgdm9pZAljaGtfaXJxIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkCW1lY19pcnEgUEFSQU1TICgoaW50MzIgbGV2ZWwpKTsKLXN0YXRpYyB2b2lkCXNldF9zZnNyIFBBUkFNUyAoKHVpbnQzMiBmYXVsdCwgdWludDMyIGFkZHIsCi0JCQkJICB1aW50MzIgYXNpLCB1aW50MzIgcmVhZCkpOwotc3RhdGljIGludDMyCW1lY19yZWFkIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgYXNpLCB1aW50MzIgKmRhdGEpKTsKLXN0YXRpYyBpbnQJbWVjX3dyaXRlIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgZGF0YSkpOwotc3RhdGljIHZvaWQJcG9ydF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1aW50MzIJcmVhZF91YXJ0IFBBUkFNUyAoKHVpbnQzMiBhZGRyKSk7Ci1zdGF0aWMgdm9pZAl3cml0ZV91YXJ0IFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgZGF0YSkpOwotc3RhdGljIHZvaWQJZmx1c2hfdWFydCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAl1YXJ0YV90eCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAl1YXJ0Yl90eCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAl1YXJ0X3J4IFBBUkFNUyAoKGNhZGRyX3QgYXJnKSk7Ci1zdGF0aWMgdm9pZAl1YXJ0X2ludHIgUEFSQU1TICgoY2FkZHJfdCBhcmcpKTsKLXN0YXRpYyB2b2lkCXVhcnRfaXJxX3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkCXdkb2dfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOwotc3RhdGljIHZvaWQJd2RvZ19zdGFydCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAlydGNfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOwotc3RhdGljIHZvaWQJcnRjX3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1aW50MzIJcnRjX2NvdW50ZXJfcmVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAlydGNfc2NhbGVyX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7Ci1zdGF0aWMgdm9pZAlydGNfcmVsb2FkX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7Ci1zdGF0aWMgdm9pZAlncHRfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOwotc3RhdGljIHZvaWQJZ3B0X3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1aW50MzIJZ3B0X2NvdW50ZXJfcmVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZAlncHRfc2NhbGVyX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7Ci1zdGF0aWMgdm9pZAlncHRfcmVsb2FkX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7Ci1zdGF0aWMgdm9pZAl0aW1lcl9jdHJsIFBBUkFNUyAoKHVpbnQzMiB2YWwpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLQkJZ2V0X21lbV9wdHIgUEFSQU1TICgodWludDMyIGFkZHIsIHVpbnQzMiBzaXplKSk7Ci0KLXN0YXRpYyB2b2lkCWZldGNoX2J5dGVzIFBBUkFNUyAoKGludCBhc2ksIHVuc2lnbmVkIGNoYXIgKm1lbSwKLQkJCQkgICAgIHVpbnQzMiAqZGF0YSwgaW50IHN6KSk7Ci0KLXN0YXRpYyB2b2lkCXN0b3JlX2J5dGVzIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKm1lbSwgdWludDMyICpkYXRhLCBpbnQgc3opKTsKLQotZXh0ZXJuIGludAlleHRfaXJsOwotCi0KLS8qIE9uZS10aW1lIGluaXQgKi8KLQotdm9pZAotaW5pdF9zaW0oKQotewotICAgIHBvcnRfaW5pdCgpOwotfQotCi0vKiBQb3dlci1vbiByZXNldCBpbml0ICovCi0KLXZvaWQKLXJlc2V0KCkKLXsKLSAgICBtZWNfcmVzZXQoKTsKLSAgICB1YXJ0X2lycV9zdGFydCgpOwotICAgIHdkb2dfc3RhcnQoKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlY29kZV9lcnNyKCkKLXsKLSAgICBpZiAobWVjX2Vyc3IgJiAweDAxKSB7Ci0JaWYgKCEobWVjX21jciAmIDB4MjApKSB7Ci0JICAgIGlmIChtZWNfbWNyICYgMHg0MCkgewotCSAgICAgICAgc3lzX3Jlc2V0KCk7Ci0JICAgICAgICBtZWNfZXJzciA9IDB4ODAwMDsKLQkgICAgICAgIGlmIChzaXNfdmVyYm9zZSkKLQkgICAgICAgICAgICBwcmludGYoIkVycm9yIG1hbmFnZXIgcmVzZXQgLSBJVSBpbiBlcnJvciBtb2RlXG4iKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHN5c19oYWx0KCk7Ci0JICAgICAgICBtZWNfZXJzciB8PSAweDIwMDA7Ci0JICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCi0JICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIGhhbHQgLSBJVSBpbiBlcnJvciBtb2RlXG4iKTsKLQkgICAgfQotCX0gZWxzZQotCSAgICBtZWNfaXJxKDEpOwotICAgIH0KLSAgICBpZiAobWVjX2Vyc3IgJiAweDA0KSB7Ci0JaWYgKCEobWVjX21jciAmIDB4MjAwKSkgewotCSAgICBpZiAobWVjX21jciAmIDB4NDAwKSB7Ci0JICAgICAgICBzeXNfcmVzZXQoKTsKLQkgICAgICAgIG1lY19lcnNyID0gMHg4MDAwOwotCSAgICAgICAgaWYgKHNpc192ZXJib3NlKQotCSAgICAgICAgICAgIHByaW50ZigiRXJyb3IgbWFuYWdlciByZXNldCAtIElVIGNvbXBhcmlzb24gZXJyb3JcbiIpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgc3lzX2hhbHQoKTsKLQkgICAgICAgIG1lY19lcnNyIHw9IDB4MjAwMDsKLQkgICAgICAgIGlmIChzaXNfdmVyYm9zZSkKLQkgICAgICAgICAgICBwcmludGYoIkVycm9yIG1hbmFnZXIgaGFsdCAtIElVIGNvbXBhcmlzb24gZXJyb3JcbiIpOwotCSAgICB9Ci0JfSBlbHNlCi0JICAgIG1lY19pcnEoMSk7Ci0gICAgfQotICAgIGlmIChtZWNfZXJzciAmIDB4MjApIHsgCi0JaWYgKCEobWVjX21jciAmIDB4MjAwMCkpIHsKLQkgICAgaWYgKG1lY19tY3IgJiAweDQwMDApIHsKLQkgICAgICAgIHN5c19yZXNldCgpOwotCSAgICAgICAgbWVjX2Vyc3IgPSAweDgwMDA7Ci0JICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCi0JICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIHJlc2V0IC0gTUVDIGhhcmR3YXJlIGVycm9yXG4iKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHN5c19oYWx0KCk7Ci0JICAgICAgICBtZWNfZXJzciB8PSAweDIwMDA7Ci0JICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCi0JICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIGhhbHQgLSBNRUMgaGFyZHdhcmUgZXJyb3JcbiIpOwotCSAgICB9Ci0JfSBlbHNlCi0JICAgIG1lY19pcnEoMSk7Ci0gICAgfQotfQotCi0jaWZkZWYgRVJSSU5KCi1zdGF0aWMgdm9pZAotaXVjb21wZXJyKCkKLXsKLSAgICBtZWNfZXJzciB8PSAweDA0OwotICAgIGRlY29kZV9lcnNyKCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1lY3BhcmVycm9yKCkKLXsKLSAgICBtZWNfZXJzciB8PSAweDIwOwotICAgIGRlY29kZV9lcnNyKCk7Ci19Ci0KLQotLyogSVUgZXJyb3IgbW9kZSBtYW5hZ2VyICovCi0KLXZvaWQKLWVycm9yX21vZGUocGMpCi0gICAgdWludDMyICAgICAgICAgIHBjOwotewotCi0gICAgbWVjX2Vyc3IgfD0gMHgxOwotICAgIGRlY29kZV9lcnNyKCk7Ci19Ci0KLQotLyogQ2hlY2sgbWVtb3J5IHNldHRpbmdzICovCi0KLXN0YXRpYyB2b2lkCi1kZWNvZGVfbWVtY2ZnKCkKLXsKLSAgICBpZiAocm9tOCkgbWVjX21lbWNmZyAmPSB+MHgyMDAwMDsKLSAgICBlbHNlIG1lY19tZW1jZmcgfD0gMHgyMDAwMDsKLQotICAgIG1lbV9yYW1zeiA9ICgyNTYgKiAxMDI0KSA8PCAoKG1lY19tZW1jZmcgPj4gMTApICYgNyk7Ci0gICAgbWVtX3JvbXN6ID0gKDEyOCAqIDEwMjQpIDw8ICgobWVjX21lbWNmZyA+PiAxOCkgJiA3KTsKLQotICAgIGlmIChzcGFyY2xpdGVfYm9hcmQpIHsKLQltZW1fcmFtc3RhcnQgPSBSQU1fU1RBUlRfU0xJVEU7Ci0JbWVtX3JhbWVuZCA9IFJBTV9FTkRfU0xJVEU7Ci0JbWVtX3JhbW1hc2sgPSBSQU1fTUFTS19TTElURTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JbWVtX3JhbXN0YXJ0ID0gUkFNX1NUQVJUOwotCW1lbV9yYW1lbmQgPSBSQU1fRU5EOwotCW1lbV9yYW1tYXNrID0gUkFNX01BU0s7Ci0gICAgfQotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoIlJBTSBzdGFydDogMHgleCwgUkFNIHNpemU6ICVkIEssIFJPTSBzaXplOiAlZCBLXG4iLAotCSAgICAgICBtZW1fcmFtc3RhcnQsIG1lbV9yYW1zeiA+PiAxMCwgbWVtX3JvbXN6ID4+IDEwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlY29kZV93Y3IoKQotewotICAgIG1lbV9yYW1yX3dzID0gbWVjX3djciAmIDM7Ci0gICAgbWVtX3JhbXdfd3MgPSAobWVjX3djciA+PiAyKSAmIDM7Ci0gICAgbWVtX3JvbXJfd3MgPSAobWVjX3djciA+PiA0KSAmIDB4MGY7Ci0gICAgaWYgKHJvbTgpIHsKLSAgICAJaWYgKG1lbV9yb21yX3dzID4gMCApICBtZW1fcm9tcl93cy0tOwotCW1lbV9yb21yX3dzID0gNSArICg0Km1lbV9yb21yX3dzKTsKLSAgICB9Ci0gICAgbWVtX3JvbXdfd3MgPSAobWVjX3djciA+PiA4KSAmIDB4MGY7Ci0gICAgaWYgKHNpc192ZXJib3NlKQotCXByaW50ZigiV2FpdHN0YXRlcyA9IFJBTSByZWFkOiAlZCwgUkFNIHdyaXRlOiAlZCwgUk9NIHJlYWQ6ICVkLCBST00gd3JpdGU6ICVkXG4iLAotCSAgICAgICBtZW1fcmFtcl93cywgbWVtX3JhbXdfd3MsIG1lbV9yb21yX3dzLCBtZW1fcm9td193cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvZGVfbWNyKCkKLXsKLSAgICBtZW1fYWNjcHJvdCA9IChtZWNfd3ByWzBdIHwgbWVjX3dwclsxXSk7Ci0gICAgbWVtX2Jsb2NrcHJvdCA9IChtZWNfbWNyID4+IDMpICYgMTsKLSAgICBpZiAoc2lzX3ZlcmJvc2UgJiYgbWVtX2FjY3Byb3QpCi0JcHJpbnRmKCJNZW1vcnkgYmxvY2sgd3JpdGUgcHJvdGVjdGlvbiBlbmFibGVkXG4iKTsKLSAgICBpZiAobWVjX21jciAmIDB4MDgwMDApIHsKLQltZWNfZXJzciB8PSAweDIwOwotCWRlY29kZV9lcnNyKCk7Ci0gICAgfQotICAgIGlmIChzaXNfdmVyYm9zZSAmJiAobWVjX21jciAmIDIpKQotCXByaW50ZigiU29mdHdhcmUgcmVzZXQgZW5hYmxlZFxuIik7Ci0gICAgaWYgKHNpc192ZXJib3NlICYmIChtZWNfbWNyICYgMSkpCi0JcHJpbnRmKCJQb3dlci1kb3duIG1vZGUgZW5hYmxlZFxuIik7Ci19Ci0KLS8qIEZsdXNoIHBvcnRzIHdoZW4gc2ltdWxhdG9yIHN0b3BzICovCi0KLXZvaWQKLXNpbV9oYWx0KCkKLXsKLSNpZmRlZiBGQVNUX1VBUlQKLSAgICBmbHVzaF91YXJ0KCk7Ci0jZW5kaWYKLX0KLQotaW50Ci1zaW1fc3RvcChTSU1fREVTQyBzZCkKLXsKLSAgY3RybF9jID0gMTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbG9zZV9wb3J0KCkKLXsKLSAgICBpZiAoZjFvcGVuICYmIGYxaW4gIT0gc3RkaW4pCi0JZmNsb3NlKGYxaW4pOwotICAgIGlmIChmMm9wZW4gJiYgZjJpbiAhPSBzdGRpbikKLQlmY2xvc2UoZjJpbik7Ci19Ci0KLXZvaWQKLWV4aXRfc2ltKCkKLXsKLSAgICBjbG9zZV9wb3J0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZWNfcmVzZXQoKQotewotICAgIGludCAgICAgICAgICAgICBpOwotCi0gICAgZmluZCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLQltZWNfc3NhW2ldID0gbWVjX3NlYVtpXSA9IG1lY193cHJbaV0gPSAwOwotICAgIG1lY19tY3IgPSAweDAxMzUwMDE0OwotICAgIG1lY19pb2NyID0gMDsKLSAgICBtZWNfc2ZzciA9IDB4MDc4OwotICAgIG1lY19mZmFyID0gMDsKLSAgICBtZWNfaXByID0gMDsKLSAgICBtZWNfaW1yID0gMHg3ZmZlOwotICAgIG1lY19pc3IgPSAwOwotICAgIG1lY19pY3IgPSAwOwotICAgIG1lY19pZnIgPSAwOwotICAgIG1lY19tZW1jZmcgPSAweDEwMDAwOwotICAgIG1lY193Y3IgPSAtMTsKLSAgICBtZWNfZXJzciA9IDA7CQkvKiBNRUMgZXJyb3IgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotICAgIG1lY190Y3IgPSAwOwkJLyogTUVDIHRlc3QgY29tdHJvbCByZWdpc3RlciAqLwotCi0gICAgZGVjb2RlX21lbWNmZygpOwotICAgIGRlY29kZV93Y3IoKTsKLSAgICBkZWNvZGVfbWNyKCk7Ci0KLSAgICBwb3N0ZWRfaXJxID0gMDsKLSAgICB3bnVtYSA9IHdudW1iID0gMDsKLSAgICBhbnVtID0gYWluZCA9IGJudW0gPSBiaW5kID0gMDsKLQotICAgIHVhcnRfc3RhdF9yZWcgPSBVQVJUQV9TUkUgfCBVQVJUQV9IUkUgfCBVQVJUQl9TUkUgfCBVQVJUQl9IUkU7Ci0gICAgdWFydGFfZGF0YSA9IHVhcnRiX2RhdGEgPSBVQVJUX1RIRSB8IFVBUlRfVFNFOwotCi0gICAgcnRjX2NvdW50ZXIgPSAweGZmZmZmZmZmOwotICAgIHJ0Y19yZWxvYWQgPSAweGZmZmZmZmZmOwotICAgIHJ0Y19zY2FsZXIgPSAweGZmOwotICAgIHJ0Y19lbmFibGVkID0gMDsKLSAgICBydGNfY3IgPSAwOwotICAgIHJ0Y19zZSA9IDA7Ci0KLSAgICBncHRfY291bnRlciA9IDB4ZmZmZmZmZmY7Ci0gICAgZ3B0X3JlbG9hZCA9IDB4ZmZmZmZmZmY7Ci0gICAgZ3B0X3NjYWxlciA9IDB4ZmZmZjsKLSAgICBncHRfZW5hYmxlZCA9IDA7Ci0gICAgZ3B0X2NyID0gMDsKLSAgICBncHRfc2UgPSAwOwotCi0gICAgd2RvZ19zY2FsZXIgPSAyNTU7Ci0gICAgd2RvZ19yc3RfZGVsYXkgPSAyNTU7Ci0gICAgd2RvZ19jb3VudGVyID0gMHhmZmZmOwotICAgIHdkb2dfcnN0b24gPSAwOwotICAgIHdkb2dfc3RhdHVzID0gaW5pdDsKLQotI2lmZGVmIEVSQQotICAgIGVyYXJlZyA9IDA7Ci0jZW5kaWYKLQotfQotCi0KLQotc3RhdGljIHZvaWQKLW1lY19pbnRhY2sobGV2ZWwpCi0gICAgaW50MzIgICAgICAgICAgIGxldmVsOwotewotICAgIGludCAgICAgICAgICAgICBpcnFfdGVzdDsKLQotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoImludGVycnVwdCAlZCBhY2tub3dsZWRnZWRcbiIsIGxldmVsKTsKLSAgICBpcnFfdGVzdCA9IG1lY190Y3IgJiAweDgwMDAwOwotICAgIGlmICgoaXJxX3Rlc3QpICYmIChtZWNfaWZyICYgKDEgPDwgbGV2ZWwpKSkKLQltZWNfaWZyICY9IH4oMSA8PCBsZXZlbCk7Ci0gICAgZWxzZQotCW1lY19pcHIgJj0gfigxIDw8IGxldmVsKTsKLSAgIGNoa19pcnEoKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoa19pcnEoKQotewotICAgIGludDMyICAgICAgICAgICBpOwotICAgIHVpbnQzMiAgICAgICAgICBpdG1wOwotICAgIGludAkJICAgIG9sZF9pcmw7Ci0KLSAgICBvbGRfaXJsID0gZXh0X2lybDsKLSAgICBpZiAobWVjX3RjciAmIDB4ODAwMDApIGl0bXAgPSBtZWNfaWZyOwotICAgIGVsc2UgaXRtcCAgPSAwOwotICAgIGl0bXAgPSAoKG1lY19pcHIgfCBpdG1wKSAmIH5tZWNfaW1yKSAmIDB4MGZmZmU7Ci0gICAgZXh0X2lybCA9IDA7Ci0gICAgaWYgKGl0bXAgIT0gMCkgewotCWZvciAoaSA9IDE1OyBpID4gMDsgaS0tKSB7Ci0JICAgIGlmICgoKGl0bXAgPj4gaSkgJiAxKSAhPSAwKSB7Ci0JCWlmICgoc2lzX3ZlcmJvc2UpICYmIChpID4gb2xkX2lybCkpIAotCQkgICAgcHJpbnRmKCJJVSBpcmw6ICVkXG4iLCBpKTsKLQkJZXh0X2lybCA9IGk7Ci0JICAgICAgICBzZXRfaW50KGksIG1lY19pbnRhY2ssIGkpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZWNfaXJxKGxldmVsKQotICAgIGludDMyICAgICAgICAgICBsZXZlbDsKLXsKLSAgICBtZWNfaXByIHw9ICgxIDw8IGxldmVsKTsKLSAgICBjaGtfaXJxKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc2ZzcihmYXVsdCwgYWRkciwgYXNpLCByZWFkKQotICAgIHVpbnQzMiAgICAgICAgICBmYXVsdDsKLSAgICB1aW50MzIgICAgICAgICAgYWRkcjsKLSAgICB1aW50MzIgICAgICAgICAgYXNpOwotICAgIHVpbnQzMiAgICAgICAgICByZWFkOwotewotICAgIGlmICgoYXNpID09IDB4YSkgfHwgKGFzaSA9PSAweGIpKSB7Ci0JbWVjX2ZmYXIgPSBhZGRyOwotCW1lY19zZnNyID0gKGZhdWx0IDw8IDMpIHwgKCFyZWFkIDw8IDE1KTsKLQltZWNfc2ZzciB8PSAoKG1lY19zZnNyICYgMSkgXiAxKSB8IChtZWNfc2ZzciAmIDEpOwotCXN3aXRjaCAoYXNpKSB7Ci0JY2FzZSAweGE6Ci0JICAgIG1lY19zZnNyIHw9IDB4MDAwNDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweGI6Ci0JICAgIG1lY19zZnNyIHw9IDB4MTAwNDsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludDMyCi1tZWNfcmVhZChhZGRyLCBhc2ksIGRhdGEpCi0gICAgdWludDMyICAgICAgICAgIGFkZHI7Ci0gICAgdWludDMyICAgICAgICAgIGFzaTsKLSAgICB1aW50MzIgICAgICAgICAqZGF0YTsKLXsKLQotICAgIHN3aXRjaCAoYWRkciAmIDB4MGZmKSB7Ci0KLSAgICBjYXNlIE1FQ19NQ1I6CQkvKiAweDAwICovCi0JKmRhdGEgPSBtZWNfbWNyOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfTUVNQ0ZHOgkJLyogMHgxMCAqLwotCSpkYXRhID0gbWVjX21lbWNmZzsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX0lPQ1I6Ci0JKmRhdGEgPSBtZWNfaW9jcjsJLyogMHgxNCAqLwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfU1NBMToJCS8qIDB4MjAgKi8KLQkqZGF0YSA9IG1lY19zc2FbMF0gfCAobWVjX3dwclswXSA8PCAyMyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBNRUNfU0VBMToJCS8qIDB4MjQgKi8KLQkqZGF0YSA9IG1lY19zZWFbMF07Ci0JYnJlYWs7Ci0gICAgY2FzZSBNRUNfU1NBMjoJCS8qIDB4MjggKi8KLQkqZGF0YSA9IG1lY19zc2FbMV0gfCAobWVjX3dwclsxXSA8PCAyMyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBNRUNfU0VBMjoJCS8qIDB4MmMgKi8KLQkqZGF0YSA9IG1lY19zZWFbMV07Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19JU1I6CQkvKiAweDQ0ICovCi0JKmRhdGEgPSBtZWNfaXNyOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfSVBSOgkJLyogMHg0OCAqLwotCSpkYXRhID0gbWVjX2lwcjsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX0lNUjoJCS8qIDB4NGMgKi8KLQkqZGF0YSA9IG1lY19pbXI7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19JRlI6CQkvKiAweDU0ICovCi0JKmRhdGEgPSBtZWNfaWZyOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfUlRDX0NPVU5URVI6CS8qIDB4ODAgKi8KLQkqZGF0YSA9IHJ0Y19jb3VudGVyX3JlYWQoKTsKLQlicmVhazsKLSAgICBjYXNlIE1FQ19SVENfU0NBTEVSOgkvKiAweDg0ICovCi0JaWYgKHJ0Y19lbmFibGVkKQotCSAgICAqZGF0YSA9IHJ0Y19zY2FsZXIgLSAobm93KCkgLSBydGNfc2NhbGVyX3N0YXJ0KTsKLQllbHNlCi0JICAgICpkYXRhID0gcnRjX3NjYWxlcjsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX0dQVF9DT1VOVEVSOgkvKiAweDg4ICovCi0JKmRhdGEgPSBncHRfY291bnRlcl9yZWFkKCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19HUFRfU0NBTEVSOgkvKiAweDhjICovCi0JaWYgKHJ0Y19lbmFibGVkKQotCSAgICAqZGF0YSA9IGdwdF9zY2FsZXIgLSAobm93KCkgLSBncHRfc2NhbGVyX3N0YXJ0KTsKLQllbHNlCi0JICAgICpkYXRhID0gZ3B0X3NjYWxlcjsKLQlicmVhazsKLQotCi0gICAgY2FzZSBNRUNfU0ZTUjoJCS8qIDB4QTAgKi8KLQkqZGF0YSA9IG1lY19zZnNyOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfRkZBUjoJCS8qIDB4QTQgKi8KLQkqZGF0YSA9IG1lY19mZmFyOwotCWJyZWFrOwotCi0gICAgY2FzZSBTSU1fTE9BRDoKLQlmbmFtZVtmaW5kXSA9IDA7Ci0JaWYgKGZpbmQgPT0gMCkKLQkgICAgc3RyY3B5KGZuYW1lLCAic2ltbG9hZCIpOwotCWZpbmQgPSBiZmRfbG9hZChmbmFtZSk7Ci0gCWlmIChmaW5kID09IC0xKSAKLQkgICAgKmRhdGEgPSAwOwotCWVsc2UKLQkgICAgKmRhdGEgPSAxOwotCWZpbmQgPSAwOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfRVJTUjoJCS8qIDB4QjAgKi8KLQkqZGF0YSA9IG1lY19lcnNyOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfVENSOgkJLyogMHhEMCAqLwotCSpkYXRhID0gbWVjX3RjcjsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX1VBUlRBOgkJLyogMHhFMCAqLwotICAgIGNhc2UgTUVDX1VBUlRCOgkJLyogMHhFNCAqLwotCWlmIChhc2kgIT0gMHhiKSB7Ci0JICAgIHNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMSk7Ci0JICAgIHJldHVybiAoMSk7Ci0JfQotCSpkYXRhID0gcmVhZF91YXJ0KGFkZHIpOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfVUFSVF9DVFJMOgkJLyogMHhFOCAqLwotCi0JKmRhdGEgPSByZWFkX3VhcnQoYWRkcik7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCXNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMSk7Ci0JcmV0dXJuICgxKTsKLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIChNT0spOwotfQotCi1zdGF0aWMgaW50Ci1tZWNfd3JpdGUoYWRkciwgZGF0YSkKLSAgICB1aW50MzIgICAgICAgICAgYWRkcjsKLSAgICB1aW50MzIgICAgICAgICAgZGF0YTsKLXsKLSAgICBpZiAoc2lzX3ZlcmJvc2UgPiAxKQotCXByaW50ZigiTUVDIHdyaXRlIGE6ICUwOHgsIGQ6ICUwOHhcbiIsYWRkcixkYXRhKTsKLSAgICBzd2l0Y2ggKGFkZHIgJiAweDBmZikgewotCi0gICAgY2FzZSBNRUNfTUNSOgotCW1lY19tY3IgPSBkYXRhOwotCWRlY29kZV9tY3IoKTsKLSAgICAgICAgaWYgKG1lY19tY3IgJiAweDA4MDAwKSBtZWNwYXJlcnJvcigpOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfU0ZSOgotCWlmIChtZWNfbWNyICYgMHgyKSB7Ci0JICAgIHN5c19yZXNldCgpOwotCSAgICBtZWNfZXJzciA9IDB4NDAwMDsKLSAgICAJICAgIGlmIChzaXNfdmVyYm9zZSkKLQkgICAgCXByaW50ZigiIFNvZnR3YXJlIHJlc2V0IGlzc3VlZFxuIik7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfSU9DUjoKLQltZWNfaW9jciA9IGRhdGE7Ci0gICAgICAgIGlmIChtZWNfaW9jciAmIDB4QzBDMEMwQzApIG1lY3BhcmVycm9yKCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19TU0ExOgkJLyogMHgyMCAqLwotICAgICAgICBpZiAoZGF0YSAmIDB4RkUwMDAwMDApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX3NzYVswXSA9IGRhdGEgJiAweDdmZmZmZjsKLQltZWNfd3ByWzBdID0gKGRhdGEgPj4gMjMpICYgMHgwMzsKLQltZW1fYWNjcHJvdCA9IG1lY193cHJbMF0gfHwgbWVjX3dwclsxXTsKLQlpZiAoc2lzX3ZlcmJvc2UgJiYgbWVjX3dwclswXSkKLQkgICAgcHJpbnRmKCJTZWdtZW50IDEgbWVtb3J5IHByb3RlY3Rpb24gZW5hYmxlZCAoMHgwMiUwNnggLSAweDAyJTA2eClcbiIsCi0JCSAgIG1lY19zc2FbMF0gPDwgMiwgbWVjX3NlYVswXSA8PCAyKTsKLQlicmVhazsKLSAgICBjYXNlIE1FQ19TRUExOgkJLyogMHgyNCAqLwotICAgICAgICBpZiAoZGF0YSAmIDB4RkY4MDAwMDApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX3NlYVswXSA9IGRhdGEgJiAweDdmZmZmZjsKLQlicmVhazsKLSAgICBjYXNlIE1FQ19TU0EyOgkJLyogMHgyOCAqLwotICAgICAgICBpZiAoZGF0YSAmIDB4RkUwMDAwMDApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX3NzYVsxXSA9IGRhdGEgJiAweDdmZmZmZjsKLQltZWNfd3ByWzFdID0gKGRhdGEgPj4gMjMpICYgMHgwMzsKLQltZW1fYWNjcHJvdCA9IG1lY193cHJbMF0gfHwgbWVjX3dwclsxXTsKLQlpZiAoc2lzX3ZlcmJvc2UgJiYgbWVjX3dwclsxXSkKLQkgICAgcHJpbnRmKCJTZWdtZW50IDIgbWVtb3J5IHByb3RlY3Rpb24gZW5hYmxlZCAoMHgwMiUwNnggLSAweDAyJTA2eClcbiIsCi0JCSAgIG1lY19zc2FbMV0gPDwgMiwgbWVjX3NlYVsxXSA8PCAyKTsKLQlicmVhazsKLSAgICBjYXNlIE1FQ19TRUEyOgkJLyogMHgyYyAqLwotICAgICAgICBpZiAoZGF0YSAmIDB4RkY4MDAwMDApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX3NlYVsxXSA9IGRhdGEgJiAweDdmZmZmZjsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX1VBUlRBOgotICAgIGNhc2UgTUVDX1VBUlRCOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkZGMDApIG1lY3BhcmVycm9yKCk7Ci0gICAgY2FzZSBNRUNfVUFSVF9DVFJMOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkYwMEZGMDApIG1lY3BhcmVycm9yKCk7Ci0Jd3JpdGVfdWFydChhZGRyLCBkYXRhKTsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX0dQVF9SRUxPQUQ6Ci0JZ3B0X3JlbG9hZF9zZXQoZGF0YSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19HUFRfU0NBTEVSOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjAwMDApIG1lY3BhcmVycm9yKCk7Ci0JZ3B0X3NjYWxlcl9zZXQoZGF0YSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19USU1FUl9DVFJMOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkYwRjApIG1lY3BhcmVycm9yKCk7Ci0JdGltZXJfY3RybChkYXRhKTsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX1JUQ19SRUxPQUQ6Ci0JcnRjX3JlbG9hZF9zZXQoZGF0YSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19SVENfU0NBTEVSOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkZGMDApIG1lY3BhcmVycm9yKCk7Ci0JcnRjX3NjYWxlcl9zZXQoZGF0YSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19TRlNSOgkJLyogMHhBMCAqLwotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjA4ODApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX3Nmc3IgPSAweDc4OwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfSVNSOgotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkUwMDApIG1lY3BhcmVycm9yKCk7Ci0JbWVjX2lzciA9IGRhdGE7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19JTVI6CQkvKiAweDRjICovCi0KLSAgICAgICAgaWYgKGRhdGEgJiAweEZGRkY4MDAxKSBtZWNwYXJlcnJvcigpOwotCW1lY19pbXIgPSBkYXRhICYgMHg3ZmZlOwotCWNoa19pcnEoKTsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX0lDUjoJCS8qIDB4NTAgKi8KLQotICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjAwMDEpIG1lY3BhcmVycm9yKCk7Ci0JbWVjX2lwciAmPSB+ZGF0YSAmIDB4MGZmZmU7Ci0JY2hrX2lycSgpOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfSUZSOgkJLyogMHg1NCAqLwotCi0gICAgICAgIGlmIChtZWNfdGNyICYgMHgwODAwMDApIHsKLSAgICAgICAgICAgIGlmIChkYXRhICYgMHhGRkZGMDAwMSkgbWVjcGFyZXJyb3IoKTsKLQkgICAgbWVjX2lmciA9IGRhdGEgJiAweGZmZmU7Ci0JICAgIGNoa19pcnEoKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBTSU1fTE9BRDoKLQlmbmFtZVtmaW5kKytdID0gKGNoYXIpIGRhdGE7Ci0JYnJlYWs7Ci0KLQotICAgIGNhc2UgTUVDX01FTUNGRzoJCS8qIDB4MTAgKi8KLSAgICAgICAgaWYgKGRhdGEgJiAweEMwRTA4MDAwKSBtZWNwYXJlcnJvcigpOwotCW1lY19tZW1jZmcgPSBkYXRhOwotCWRlY29kZV9tZW1jZmcoKTsKLQlpZiAobWVjX21lbWNmZyAmIDB4YzBlMDgwMDApCi0JICAgIG1lY3BhcmVycm9yKCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19XQ1I6CQkvKiAweDE4ICovCi0JbWVjX3djciA9IGRhdGE7Ci0JZGVjb2RlX3djcigpOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfRVJTUjoJCS8qIDB4QjAgKi8KLQlpZiAobWVjX3RjciAmIDB4MTAwMDAwKQotICAgICAgICAgICAgaWYgKGRhdGEgJiAweEZGRkZFRkMwKSBtZWNwYXJlcnJvcigpOwotCSAgICBtZWNfZXJzciA9IGRhdGEgJiAweDEwM2Y7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIE1FQ19UQ1I6CQkvKiAweEQwICovCi0gICAgICAgIGlmIChkYXRhICYgMHhGRkUxRkZDMCkgbWVjcGFyZXJyb3IoKTsKLQltZWNfdGNyID0gZGF0YSAmIDB4MWUwMDNmOwotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfV0RPRzoJCS8qIDB4NjAgKi8KLQl3ZG9nX3NjYWxlciA9IChkYXRhID4+IDE2KSAmIDB4MGZmOwotCXdkb2dfY291bnRlciA9IGRhdGEgJiAweDBmZmZmOwotCXdkb2dfcnN0X2RlbGF5ID0gZGF0YSA+PiAyNDsKLQl3ZG9nX3JzdG9uID0gMDsKLQlpZiAod2RvZ19zdGF0dXMgPT0gc3RvcHBlZCkKLQkgICAgd2RvZ19zdGFydCgpOwotCXdkb2dfc3RhdHVzID0gZW5hYmxlZDsKLQlicmVhazsKLQotICAgIGNhc2UgTUVDX1RSQVBEOgkJLyogMHg2NCAqLwotCWlmICh3ZG9nX3N0YXR1cyA9PSBpbml0KSB7Ci0JICAgIHdkb2dfc3RhdHVzID0gZGlzYWJsZWQ7Ci0JICAgIGlmIChzaXNfdmVyYm9zZSkKLQkJcHJpbnRmKCJXYXRjaGRvZyBkaXNhYmxlZFxuIik7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBNRUNfUFdEUjoKLQlpZiAobWVjX21jciAmIDEpCi0JICAgIHdhaXRfZm9yX2lycSgpOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlzZXRfc2ZzcihNRUNfQUNDLCBhZGRyLCAweGIsIDApOwotCXJldHVybiAoMSk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAoTU9LKTsKLX0KLQotCi0vKiBNRUMgVUFSVFMgKi8KLQotc3RhdGljIGludCAgICAgIGlmZDEgPSAtMSwgaWZkMiA9IC0xLCBvZmQxID0gLTEsIG9mZDIgPSAtMTsKLQotdm9pZAotaW5pdF9zdGRpbygpCi17Ci0gICAgaWYgKGR1bWJpbykKLSAgICAgICAgcmV0dXJuOyAvKiBkbyBub3RoaW5nICovCi0gICAgaWYgKCFpZmQxKQotCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmaW9jMSk7Ci0gICAgaWYgKCFpZmQyKQotCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmaW9jMik7Ci19Ci0KLXZvaWQKLXJlc3RvcmVfc3RkaW8oKQotewotICAgIGlmIChkdW1iaW8pCi0gICAgICAgIHJldHVybjsgLyogZG8gbm90aGluZyAqLwotICAgIGlmICghaWZkMSkKLQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJmlvY29sZDEpOwotICAgIGlmICghaWZkMikKLQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJmlvY29sZDIpOwotfQotCi0jZGVmaW5lIERPX1NURElPX1JFQUQoIF9mZF8sIF9idWZfLCBfbGVuXyApICAgICAgICAgIFwKLSAgICAgICAgICAgICAoIGR1bWJpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgPyAoMCkgLyogbm8gYnl0ZXMgcmVhZCwgbm8gZGVsYXkgKi8gICBcCi0gICAgICAgICAgICAgICA6IHJlYWQoIF9mZF8sIF9idWZfLCBfbGVuXyApICkKLQotCi1zdGF0aWMgdm9pZAotcG9ydF9pbml0KCkKLXsKLQotICAgIGlmICh1YmVuKSB7Ci0gICAgZjJpbiA9IHN0ZGluOwotICAgIGYxaW4gPSBOVUxMOwotICAgIGYyb3V0ID0gc3Rkb3V0OwotICAgIGYxb3V0ID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgIGYxaW4gPSBzdGRpbjsKLSAgICBmMmluID0gTlVMTDsKLSAgICBmMW91dCA9IHN0ZG91dDsKLSAgICBmMm91dCA9IE5VTEw7Ci0gICAgfQotICAgIGlmICh1YXJ0X2RldjFbMF0gIT0gMCkKLQlpZiAoKGZkMSA9IG9wZW4odWFydF9kZXYxLCBPX1JEV1IgfCBPX05PTkJMT0NLKSkgPCAwKSB7Ci0JICAgIHByaW50ZigiV2FybmluZywgY291bGRuJ3Qgb3BlbiBvdXRwdXQgZGV2aWNlICVzXG4iLCB1YXJ0X2RldjEpOwotCX0gZWxzZSB7Ci0JICAgIGlmIChzaXNfdmVyYm9zZSkKLQkJcHJpbnRmKCJzZXJpYWwgcG9ydCBBIG9uICVzXG4iLCB1YXJ0X2RldjEpOwotCSAgICBmMWluID0gZjFvdXQgPSBmZG9wZW4oZmQxLCAicisiKTsKLQkgICAgc2V0YnVmKGYxb3V0LCBOVUxMKTsKLQkgICAgZjFvcGVuID0gMTsKLQl9Ci0gICAgaWYgKGYxaW4pIGlmZDEgPSBmaWxlbm8oZjFpbik7Ci0gICAgaWYgKGlmZDEgPT0gMCkgewotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgcHJpbnRmKCJzZXJpYWwgcG9ydCBBIG9uIHN0ZGluL3N0ZG91dFxuIik7Ci0gICAgICAgIGlmICghZHVtYmlvKSB7Ci0gICAgICAgICAgICB0Y2dldGF0dHIoaWZkMSwgJmlvYzEpOwotICAgICAgICAgICAgaW9jb2xkMSA9IGlvYzE7Ci0gICAgICAgICAgICBpb2MxLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKLSAgICAgICAgICAgIGlvYzEuY19jY1tWTUlOXSA9IDA7Ci0gICAgICAgICAgICBpb2MxLmNfY2NbVlRJTUVdID0gMDsKLSAgICAgICAgfQotCWYxb3BlbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKGYxb3V0KSB7Ci0Jb2ZkMSA9IGZpbGVubyhmMW91dCk7Ci0gICAgCWlmICghZHVtYmlvICYmIG9mZDEgPT0gMSkgc2V0YnVmKGYxb3V0LCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAodWFydF9kZXYyWzBdICE9IDApCi0JaWYgKChmZDIgPSBvcGVuKHVhcnRfZGV2MiwgT19SRFdSIHwgT19OT05CTE9DSykpIDwgMCkgewotCSAgICBwcmludGYoIldhcm5pbmcsIGNvdWxkbid0IG9wZW4gb3V0cHV0IGRldmljZSAlc1xuIiwgdWFydF9kZXYyKTsKLQl9IGVsc2UgewotCSAgICBpZiAoc2lzX3ZlcmJvc2UpCi0JCXByaW50Zigic2VyaWFsIHBvcnQgQiBvbiAlc1xuIiwgdWFydF9kZXYyKTsKLQkgICAgZjJpbiA9IGYyb3V0ID0gZmRvcGVuKGZkMiwgInIrIik7Ci0JICAgIHNldGJ1ZihmMm91dCwgTlVMTCk7Ci0JICAgIGYyb3BlbiA9IDE7Ci0JfQotICAgIGlmIChmMmluKSAgaWZkMiA9IGZpbGVubyhmMmluKTsKLSAgICBpZiAoaWZkMiA9PSAwKSB7Ci0JaWYgKHNpc192ZXJib3NlKQotCSAgICBwcmludGYoInNlcmlhbCBwb3J0IEIgb24gc3RkaW4vc3Rkb3V0XG4iKTsKLSAgICAgICAgaWYgKCFkdW1iaW8pIHsKLSAgICAgICAgICAgIHRjZ2V0YXR0cihpZmQyLCAmaW9jMik7Ci0gICAgICAgICAgICBpb2NvbGQyID0gaW9jMjsKLSAgICAgICAgICAgIGlvYzIuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwotICAgICAgICAgICAgaW9jMi5jX2NjW1ZNSU5dID0gMDsKLSAgICAgICAgICAgIGlvYzIuY19jY1tWVElNRV0gPSAwOwotICAgICAgICB9Ci0JZjJvcGVuID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoZjJvdXQpIHsKLQlvZmQyID0gZmlsZW5vKGYyb3V0KTsKLSAgICAgICAgaWYgKCFkdW1iaW8gJiYgb2ZkMiA9PSAxKSBzZXRidWYoZjJvdXQsIE5VTEwpOwotICAgIH0KLQotICAgIHdudW1hID0gd251bWIgPSAwOwotCi19Ci0KLXN0YXRpYyB1aW50MzIKLXJlYWRfdWFydChhZGRyKQotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotewotCi0gICAgdW5zaWduZWQgICAgICAgIHRtcDsKLQotICAgIHRtcCA9IDA7Ci0gICAgc3dpdGNoIChhZGRyICYgMHhmZikgewotCi0gICAgY2FzZSAweEUwOgkJCS8qIFVBUlQgMSAqLwotI2lmbmRlZiBfV0lOMzIKLSNpZmRlZiBGQVNUX1VBUlQKLQotCWlmIChhaW5kIDwgYW51bSkgewotCSAgICBpZiAoKGFpbmQgKyAxKSA8IGFudW0pCi0JCW1lY19pcnEoNCk7Ci0JICAgIHJldHVybiAoMHg3MDAgfCAodWludDMyKSBhcVthaW5kKytdKTsKLQl9IGVsc2UgewotCSAgICBpZiAoZjFvcGVuKSB7Ci0JICAgICAgICBhbnVtID0gRE9fU1RESU9fUkVBRChpZmQxLCBhcSwgVUFSVEJVRik7Ci0JICAgIH0KLQkgICAgaWYgKGFudW0gPiAwKSB7Ci0JCWFpbmQgPSAwOwotCQlpZiAoKGFpbmQgKyAxKSA8IGFudW0pCi0JCSAgICBtZWNfaXJxKDQpOwotCQlyZXR1cm4gKDB4NzAwIHwgKHVpbnQzMikgYXFbYWluZCsrXSk7Ci0JICAgIH0gZWxzZSB7Ci0JCXJldHVybiAoMHg2MDAgfCAodWludDMyKSBhcVthaW5kXSk7Ci0JICAgIH0KLQotCX0KLSNlbHNlCi0JdG1wID0gdWFydGFfZGF0YTsKLQl1YXJ0YV9kYXRhICY9IH5VQVJUX0RSOwotCXVhcnRfc3RhdF9yZWcgJj0gflVBUlRBX0RSOwotCXJldHVybiB0bXA7Ci0jZW5kaWYKLSNlbHNlCi0JcmV0dXJuKDApOwotI2VuZGlmCi0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4RTQ6CQkJLyogVUFSVCAyICovCi0jaWZuZGVmIF9XSU4zMgotI2lmZGVmIEZBU1RfVUFSVAotCWlmIChiaW5kIDwgYm51bSkgewotCSAgICBpZiAoKGJpbmQgKyAxKSA8IGJudW0pCi0JCW1lY19pcnEoNSk7Ci0JICAgIHJldHVybiAoMHg3MDAgfCAodWludDMyKSBicVtiaW5kKytdKTsKLQl9IGVsc2UgewotCSAgICBpZiAoZjJvcGVuKSB7Ci0JCWJudW0gPSBET19TVERJT19SRUFEKGlmZDIsIGJxLCBVQVJUQlVGKTsKLQkgICAgfQotCSAgICBpZiAoYm51bSA+IDApIHsKLQkJYmluZCA9IDA7Ci0JCWlmICgoYmluZCArIDEpIDwgYm51bSkKLQkJICAgIG1lY19pcnEoNSk7Ci0JCXJldHVybiAoMHg3MDAgfCAodWludDMyKSBicVtiaW5kKytdKTsKLQkgICAgfSBlbHNlIHsKLQkJcmV0dXJuICgweDYwMCB8ICh1aW50MzIpIGJxW2JpbmRdKTsKLQkgICAgfQotCi0JfQotI2Vsc2UKLQl0bXAgPSB1YXJ0Yl9kYXRhOwotCXVhcnRiX2RhdGEgJj0gflVBUlRfRFI7Ci0JdWFydF9zdGF0X3JlZyAmPSB+VUFSVEJfRFI7Ci0JcmV0dXJuIHRtcDsKLSNlbmRpZgotI2Vsc2UKLQlyZXR1cm4oMCk7Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGNhc2UgMHhFODoJCQkvKiBVQVJUIHN0YXR1cyByZWdpc3RlcgkgKi8KLSNpZm5kZWYgX1dJTjMyCi0jaWZkZWYgRkFTVF9VQVJUCi0KLQlVY29udHJvbCA9IDA7Ci0JaWYgKGFpbmQgPCBhbnVtKSB7Ci0JICAgIFVjb250cm9sIHw9IDB4MDAwMDAwMDE7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGYxb3BlbikgewotCSAgICAgICAgYW51bSA9IERPX1NURElPX1JFQUQoaWZkMSwgYXEsIFVBUlRCVUYpOwotICAgICAgICAgICAgfQotCSAgICBpZiAoYW51bSA+IDApIHsKLQkJVWNvbnRyb2wgfD0gMHgwMDAwMDAwMTsKLQkJYWluZCA9IDA7Ci0JCW1lY19pcnEoNCk7Ci0JICAgIH0KLQl9Ci0JaWYgKGJpbmQgPCBibnVtKSB7Ci0JICAgIFVjb250cm9sIHw9IDB4MDAwMTAwMDA7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGYyb3BlbikgewotCQlibnVtID0gRE9fU1RESU9fUkVBRChpZmQyLCBicSwgVUFSVEJVRik7Ci0JICAgIH0KLQkgICAgaWYgKGJudW0gPiAwKSB7Ci0JCVVjb250cm9sIHw9IDB4MDAwMTAwMDA7Ci0JCWJpbmQgPSAwOwotCQltZWNfaXJxKDUpOwotCSAgICB9Ci0JfQotCi0JVWNvbnRyb2wgfD0gMHgwMDA2MDAwNjsKLQlyZXR1cm4gKFVjb250cm9sKTsKLSNlbHNlCi0JcmV0dXJuICh1YXJ0X3N0YXRfcmVnKTsKLSNlbmRpZgotI2Vsc2UKLQlyZXR1cm4oMHgwMDA2MDAwNik7Ci0jZW5kaWYKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgcHJpbnRmKCJSZWFkIGZyb20gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXIgKCV4KVxuIiwgYWRkcik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3VhcnQoYWRkciwgZGF0YSkKLSAgICB1aW50MzIgICAgICAgICAgYWRkcjsKLSAgICB1aW50MzIgICAgICAgICAgZGF0YTsKLXsKLSAgICB1bnNpZ25lZCBjaGFyICAgYzsKLQotICAgIGMgPSAodW5zaWduZWQgY2hhcikgZGF0YTsKLSAgICBzd2l0Y2ggKGFkZHIgJiAweGZmKSB7Ci0KLSAgICBjYXNlIDB4RTA6CQkJLyogVUFSVCBBICovCi0jaWZkZWYgRkFTVF9VQVJUCi0JaWYgKGYxb3BlbikgewotCSAgICBpZiAod251bWEgPCBVQVJUQlVGKQotCSAgICAgICAgd2J1ZmFbd251bWErK10gPSBjOwotCSAgICBlbHNlIHsKLQkgICAgICAgIHdoaWxlICh3bnVtYSkKLQkJICAgIHdudW1hIC09IGZ3cml0ZSh3YnVmYSwgMSwgd251bWEsIGYxb3V0KTsKLQkgICAgICAgIHdidWZhW3dudW1hKytdID0gYzsKLQkgICAgfQotCX0KLQltZWNfaXJxKDQpOwotI2Vsc2UKLQlpZiAodWFydF9zdGF0X3JlZyAmIFVBUlRBX1NSRSkgewotCSAgICB1YXJ0YV9zcmVnID0gYzsKLQkgICAgdWFydF9zdGF0X3JlZyAmPSB+VUFSVEFfU1JFOwotCSAgICBldmVudCh1YXJ0YV90eCwgMCwgVUFSVF9UWF9USU1FKTsKLQl9IGVsc2UgewotCSAgICB1YXJ0YV9ocmVnID0gYzsKLQkgICAgdWFydF9zdGF0X3JlZyAmPSB+VUFSVEFfSFJFOwotCX0KLSNlbmRpZgotCWJyZWFrOwotCi0gICAgY2FzZSAweEU0OgkJCS8qIFVBUlQgQiAqLwotI2lmZGVmIEZBU1RfVUFSVAotCWlmIChmMm9wZW4pIHsKLQkgICAgaWYgKHdudW1iIDwgVUFSVEJVRikKLQkJd2J1ZmJbd251bWIrK10gPSBjOwotCSAgICBlbHNlIHsKLQkJd2hpbGUgKHdudW1iKQotCQkgICAgd251bWIgLT0gZndyaXRlKHdidWZiLCAxLCB3bnVtYiwgZjJvdXQpOwotCQl3YnVmYlt3bnVtYisrXSA9IGM7Ci0JICAgIH0KLQl9Ci0JbWVjX2lycSg1KTsKLSNlbHNlCi0JaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQl9TUkUpIHsKLQkgICAgdWFydGJfc3JlZyA9IGM7Ci0JICAgIHVhcnRfc3RhdF9yZWcgJj0gflVBUlRCX1NSRTsKLQkgICAgZXZlbnQodWFydGJfdHgsIDAsIFVBUlRfVFhfVElNRSk7Ci0JfSBlbHNlIHsKLQkgICAgdWFydGJfaHJlZyA9IGM7Ci0JICAgIHVhcnRfc3RhdF9yZWcgJj0gflVBUlRCX0hSRTsKLQl9Ci0jZW5kaWYKLQlicmVhazsKLSAgICBjYXNlIDB4RTg6CQkJLyogVUFSVCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNpZm5kZWYgRkFTVF9VQVJUCi0JaWYgKGRhdGEgJiBVQVJUQV9DTFIpIHsKLQkgICAgdWFydF9zdGF0X3JlZyAmPSAweEZGRkYwMDAwOwotCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX1NSRSB8IFVBUlRBX0hSRTsKLQl9Ci0JaWYgKGRhdGEgJiBVQVJUQl9DTFIpIHsKLQkgICAgdWFydF9zdGF0X3JlZyAmPSAweDAwMDBGRkZGOwotCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRCX1NSRSB8IFVBUlRCX0hSRTsKLQl9Ci0jZW5kaWYKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgcHJpbnRmKCJXcml0ZSB0byB1bmltcGxlbWVudGVkIE1FQyByZWdpc3RlciAoJXgpXG4iLCBhZGRyKTsKLQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZsdXNoX3VhcnQoKQotewotICAgIHdoaWxlICh3bnVtYSAmJiBmMW9wZW4pCi0Jd251bWEgLT0gZndyaXRlKHdidWZhLCAxLCB3bnVtYSwgZjFvdXQpOwotICAgIHdoaWxlICh3bnVtYiAmJiBmMm9wZW4pCi0Jd251bWIgLT0gZndyaXRlKHdidWZiLCAxLCB3bnVtYiwgZjJvdXQpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXVhcnRhX3R4KCkKLXsKLQotICAgIHdoaWxlIChmMW9wZW4gJiYgZndyaXRlKCZ1YXJ0YV9zcmVnLCAxLCAxLCBmMW91dCkgIT0gMSk7Ci0gICAgaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9IUkUpIHsKLQl1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX1NSRTsKLSAgICB9IGVsc2UgewotCXVhcnRhX3NyZWcgPSB1YXJ0YV9ocmVnOwotCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEFfSFJFOwotCWV2ZW50KHVhcnRhX3R4LCAwLCBVQVJUX1RYX1RJTUUpOwotICAgIH0KLSAgICBtZWNfaXJxKDQpOwotfQotCi1zdGF0aWMgdm9pZAotdWFydGJfdHgoKQotewotICAgIHdoaWxlIChmMm9wZW4gJiYgZndyaXRlKCZ1YXJ0Yl9zcmVnLCAxLCAxLCBmMm91dCkgIT0gMSk7Ci0gICAgaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQl9IUkUpIHsKLQl1YXJ0X3N0YXRfcmVnIHw9IFVBUlRCX1NSRTsKLSAgICB9IGVsc2UgewotCXVhcnRiX3NyZWcgPSB1YXJ0Yl9ocmVnOwotCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEJfSFJFOwotCWV2ZW50KHVhcnRiX3R4LCAwLCBVQVJUX1RYX1RJTUUpOwotICAgIH0KLSAgICBtZWNfaXJxKDUpOwotfQotCi1zdGF0aWMgdm9pZAotdWFydF9yeChhcmcpCi0gICAgY2FkZHJfdCAgICAgICAgIGFyZzsKLXsKLSAgICBpbnQzMiAgICAgICAgICAgcnNpemU7Ci0gICAgY2hhciAgICAgICAgICAgIHJ4ZDsKLQotCi0gICAgcnNpemUgPSAwOwotICAgIGlmIChmMW9wZW4pCi0gICAgICAgIHJzaXplID0gRE9fU1RESU9fUkVBRChpZmQxLCAmcnhkLCAxKTsKLSAgICBpZiAocnNpemUgPiAwKSB7Ci0JdWFydGFfZGF0YSA9IFVBUlRfRFIgfCByeGQ7Ci0JaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9IUkUpCi0JICAgIHVhcnRhX2RhdGEgfD0gVUFSVF9USEU7Ci0JaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9TUkUpCi0JICAgIHVhcnRhX2RhdGEgfD0gVUFSVF9UU0U7Ci0JaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9EUikgewotCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX09SOwotCSAgICBtZWNfaXJxKDcpOwkJLyogVUFSVCBlcnJvciBpbnRlcnJ1cHQgKi8KLQl9Ci0JdWFydF9zdGF0X3JlZyB8PSBVQVJUQV9EUjsKLQltZWNfaXJxKDQpOwotICAgIH0KLSAgICByc2l6ZSA9IDA7Ci0gICAgaWYgKGYyb3BlbikKLSAgICAgICAgcnNpemUgPSBET19TVERJT19SRUFEKGlmZDIsICZyeGQsIDEpOwotICAgIGlmIChyc2l6ZSkgewotCXVhcnRiX2RhdGEgPSBVQVJUX0RSIHwgcnhkOwotCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfSFJFKQotCSAgICB1YXJ0Yl9kYXRhIHw9IFVBUlRfVEhFOwotCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfU1JFKQotCSAgICB1YXJ0Yl9kYXRhIHw9IFVBUlRfVFNFOwotCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfRFIpIHsKLQkgICAgdWFydF9zdGF0X3JlZyB8PSBVQVJUQl9PUjsKLQkgICAgbWVjX2lycSg3KTsJCS8qIFVBUlQgZXJyb3IgaW50ZXJydXB0ICovCi0JfQotCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEJfRFI7Ci0JbWVjX2lycSg1KTsKLSAgICB9Ci0gICAgZXZlbnQodWFydF9yeCwgMCwgVUFSVF9SWF9USU1FKTsKLX0KLQotc3RhdGljIHZvaWQKLXVhcnRfaW50cihhcmcpCi0gICAgY2FkZHJfdCAgICAgICAgIGFyZzsKLXsKLSAgICByZWFkX3VhcnQoMHhFOCk7CQkvKiBDaGVjayBmb3IgVUFSVCBpbnRlcnJ1cHRzIGV2ZXJ5IDEwMDAgY2xrICovCi0gICAgZmx1c2hfdWFydCgpOwkJLyogRmx1c2ggVUFSVCBwb3J0cyAgICAgICovCi0gICAgZXZlbnQodWFydF9pbnRyLCAwLCBVQVJUX0ZMVVNIX1RJTUUpOwotfQotCi0KLXN0YXRpYyB2b2lkCi11YXJ0X2lycV9zdGFydCgpCi17Ci0jaWZkZWYgRkFTVF9VQVJUCi0gICAgZXZlbnQodWFydF9pbnRyLCAwLCBVQVJUX0ZMVVNIX1RJTUUpOwotI2Vsc2UKLSNpZm5kZWYgX1dJTjMyCi0gICAgZXZlbnQodWFydF9yeCwgMCwgVUFSVF9SWF9USU1FKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLS8qIFdhdGNoLWRvZyAqLwotCi1zdGF0aWMgdm9pZAotd2RvZ19pbnRyKGFyZykKLSAgICBjYWRkcl90ICAgICAgICAgYXJnOwotewotICAgIGlmICh3ZG9nX3N0YXR1cyA9PSBkaXNhYmxlZCkgewotCXdkb2dfc3RhdHVzID0gc3RvcHBlZDsKLSAgICB9IGVsc2UgewotCi0JaWYgKHdkb2dfY291bnRlcikgewotCSAgICB3ZG9nX2NvdW50ZXItLTsKLQkgICAgZXZlbnQod2RvZ19pbnRyLCAwLCB3ZG9nX3NjYWxlciArIDEpOwotCX0gZWxzZSB7Ci0JICAgIGlmICh3ZG9nX3JzdG9uKSB7Ci0JCXByaW50ZigiV2F0Y2hkb2cgcmVzZXQhXG4iKTsKLQkJc3lzX3Jlc2V0KCk7Ci0JCW1lY19lcnNyID0gMHhDMDAwOwotCSAgICB9IGVsc2UgewotCQltZWNfaXJxKDE1KTsKLQkJd2RvZ19yc3RvbiA9IDE7Ci0JCXdkb2dfY291bnRlciA9IHdkb2dfcnN0X2RlbGF5OwotCQlldmVudCh3ZG9nX2ludHIsIDAsIHdkb2dfc2NhbGVyICsgMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd2RvZ19zdGFydCgpCi17Ci0gICAgZXZlbnQod2RvZ19pbnRyLCAwLCB3ZG9nX3NjYWxlciArIDEpOwotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoIldhdGNoZG9nIHN0YXJ0ZWQsIHNjYWxlciA9ICVkLCBjb3VudGVyID0gJWRcbiIsCi0JICAgICAgIHdkb2dfc2NhbGVyLCB3ZG9nX2NvdW50ZXIpOwotfQotCi0KLS8qIE1FQyB0aW1lcnMgKi8KLQotCi1zdGF0aWMgdm9pZAotcnRjX2ludHIoYXJnKQotICAgIGNhZGRyX3QgICAgICAgICBhcmc7Ci17Ci0gICAgaWYgKHJ0Y19jb3VudGVyID09IDApIHsKLQotCW1lY19pcnEoMTMpOwotCWlmIChydGNfY3IpCi0JICAgIHJ0Y19jb3VudGVyID0gcnRjX3JlbG9hZDsKLQllbHNlCi0JICAgIHJ0Y19zZSA9IDA7Ci0gICAgfSBlbHNlCi0JcnRjX2NvdW50ZXIgLT0gMTsKLSAgICBpZiAocnRjX3NlKSB7Ci0JZXZlbnQocnRjX2ludHIsIDAsIHJ0Y19zY2FsZXIgKyAxKTsKLQlydGNfc2NhbGVyX3N0YXJ0ID0gbm93KCk7Ci0JcnRjX2VuYWJsZWQgPSAxOwotICAgIH0gZWxzZSB7Ci0JaWYgKHNpc192ZXJib3NlKQotCSAgICBwcmludGYoIlJUQyBzdG9wcGVkXG5cciIpOwotCXJ0Y19lbmFibGVkID0gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydGNfc3RhcnQoKQotewotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoIlJUQyBzdGFydGVkIChwZXJpb2QgJWQpXG5cciIsIHJ0Y19zY2FsZXIgKyAxKTsKLSAgICBldmVudChydGNfaW50ciwgMCwgcnRjX3NjYWxlciArIDEpOwotICAgIHJ0Y19zY2FsZXJfc3RhcnQgPSBub3coKTsKLSAgICBydGNfZW5hYmxlZCA9IDE7Ci19Ci0KLXN0YXRpYyB1aW50MzIKLXJ0Y19jb3VudGVyX3JlYWQoKQotewotICAgIHJldHVybiAocnRjX2NvdW50ZXIpOwotfQotCi1zdGF0aWMgdm9pZAotcnRjX3NjYWxlcl9zZXQodmFsKQotICAgIHVpbnQzMiAgICAgICAgICB2YWw7Ci17Ci0gICAgcnRjX3NjYWxlciA9IHZhbCAmIDB4MGZmOwkvKiBlaWdodC1iaXQgc2NhbGVyIG9ubHkgKi8KLX0KLQotc3RhdGljIHZvaWQKLXJ0Y19yZWxvYWRfc2V0KHZhbCkKLSAgICB1aW50MzIgICAgICAgICAgdmFsOwotewotICAgIHJ0Y19yZWxvYWQgPSB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ncHRfaW50cihhcmcpCi0gICAgY2FkZHJfdCAgICAgICAgIGFyZzsKLXsKLSAgICBpZiAoZ3B0X2NvdW50ZXIgPT0gMCkgewotCW1lY19pcnEoMTIpOwotCWlmIChncHRfY3IpCi0JICAgIGdwdF9jb3VudGVyID0gZ3B0X3JlbG9hZDsKLQllbHNlCi0JICAgIGdwdF9zZSA9IDA7Ci0gICAgfSBlbHNlCi0JZ3B0X2NvdW50ZXIgLT0gMTsKLSAgICBpZiAoZ3B0X3NlKSB7Ci0JZXZlbnQoZ3B0X2ludHIsIDAsIGdwdF9zY2FsZXIgKyAxKTsKLQlncHRfc2NhbGVyX3N0YXJ0ID0gbm93KCk7Ci0JZ3B0X2VuYWJsZWQgPSAxOwotICAgIH0gZWxzZSB7Ci0JaWYgKHNpc192ZXJib3NlKQotCSAgICBwcmludGYoIkdQVCBzdG9wcGVkXG5cciIpOwotCWdwdF9lbmFibGVkID0gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ncHRfc3RhcnQoKQotewotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoIkdQVCBzdGFydGVkIChwZXJpb2QgJWQpXG5cciIsIGdwdF9zY2FsZXIgKyAxKTsKLSAgICBldmVudChncHRfaW50ciwgMCwgZ3B0X3NjYWxlciArIDEpOwotICAgIGdwdF9zY2FsZXJfc3RhcnQgPSBub3coKTsKLSAgICBncHRfZW5hYmxlZCA9IDE7Ci19Ci0KLXN0YXRpYyB1aW50MzIKLWdwdF9jb3VudGVyX3JlYWQoKQotewotICAgIHJldHVybiAoZ3B0X2NvdW50ZXIpOwotfQotCi1zdGF0aWMgdm9pZAotZ3B0X3NjYWxlcl9zZXQodmFsKQotICAgIHVpbnQzMiAgICAgICAgICB2YWw7Ci17Ci0gICAgZ3B0X3NjYWxlciA9IHZhbCAmIDB4MGZmZmY7CS8qIDE2LWJpdCBzY2FsZXIgKi8KLX0KLQotc3RhdGljIHZvaWQKLWdwdF9yZWxvYWRfc2V0KHZhbCkKLSAgICB1aW50MzIgICAgICAgICAgdmFsOwotewotICAgIGdwdF9yZWxvYWQgPSB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aW1lcl9jdHJsKHZhbCkKLSAgICB1aW50MzIgICAgICAgICAgdmFsOwotewotCi0gICAgcnRjX2NyID0gKCh2YWwgJiBUQ1JfVENSQ1IpICE9IDApOwotICAgIGlmICh2YWwgJiBUQ1JfVENSQ0wpIHsKLQlydGNfY291bnRlciA9IHJ0Y19yZWxvYWQ7Ci0gICAgfQotICAgIGlmICh2YWwgJiBUQ1JfVENSU0wpIHsKLSAgICB9Ci0gICAgcnRjX3NlID0gKCh2YWwgJiBUQ1JfVENSU0UpICE9IDApOwotICAgIGlmIChydGNfc2UgJiYgKHJ0Y19lbmFibGVkID09IDApKQotCXJ0Y19zdGFydCgpOwotCi0gICAgZ3B0X2NyID0gKHZhbCAmIFRDUl9HQUNSKTsKLSAgICBpZiAodmFsICYgVENSX0dBQ0wpIHsKLQlncHRfY291bnRlciA9IGdwdF9yZWxvYWQ7Ci0gICAgfQotICAgIGlmICh2YWwgJiBUQ1JfR0FDTCkgewotICAgIH0KLSAgICBncHRfc2UgPSAodmFsICYgVENSX0dBU0UpID4+IDI7Ci0gICAgaWYgKGdwdF9zZSAmJiAoZ3B0X2VuYWJsZWQgPT0gMCkpCi0JZ3B0X3N0YXJ0KCk7Ci19Ci0KLQotLyogUmV0cmlldmUgZGF0YSBmcm9tIHRhcmdldCBtZW1vcnkuICBNRU0gcG9pbnRzIHRvIGxvY2F0aW9uIGZyb20gd2hpY2gKLSAgIHRvIHJlYWQgdGhlIGRhdGE7IERBVEEgcG9pbnRzIHRvIHdvcmRzIHdoZXJlIHJldHJpZXZlZCBkYXRhIHdpbGwgYmUKLSAgIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIuICBTWiBjb250YWlucyBsb2coMikgb2YgdGhlIG51bWJlciBvZiBieXRlcwotICAgdG8gcmV0cmlldmUsIGFuZCBjYW4gYmUgMCAoMSBieXRlKSwgMSAob25lIGhhbGYtd29yZCksIDIgKG9uZSB3b3JkKSwKLSAgIG9yIDMgKHR3byB3b3JkcykuICovCi0KLXN0YXRpYyB2b2lkCi1mZXRjaF9ieXRlcyAoYXNpLCBtZW0sIGRhdGEsIHN6KQotICAgIGludAkJICAgIGFzaTsKLSAgICB1bnNpZ25lZCBjaGFyICAqbWVtOwotICAgIHVpbnQzMgkgICAqZGF0YTsKLSAgICBpbnQJCSAgICBzejsKLXsKLSAgICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCi0JfHwgYXNpID09IDggfHwgYXNpID09IDkpIHsKLQlzd2l0Y2ggKHN6KSB7Ci0JY2FzZSAzOgotCSAgICBkYXRhWzFdID0gICgoKHVpbnQzMikgbWVtWzddKSAmIDB4ZmYpIHwKLQkJICAgICAgKCgoKHVpbnQzMikgbWVtWzZdKSAmIDB4ZmYpIDw8ICA4KSB8Ci0JCSAgICAgICgoKCh1aW50MzIpIG1lbVs1XSkgJiAweGZmKSA8PCAxNikgfAotCQkgICAgICAoKCgodWludDMyKSBtZW1bNF0pICYgMHhmZikgPDwgMjQpOwotCSAgICAvKiBGYWxsIHRocm91Z2ggdG8gMiAqLwotCWNhc2UgMjoKLQkgICAgZGF0YVswXSA9ICAoKCh1aW50MzIpIG1lbVszXSkgJiAweGZmKSB8Ci0JCSAgICAgICgoKCh1aW50MzIpIG1lbVsyXSkgJiAweGZmKSA8PCAgOCkgfAotCQkgICAgICAoKCgodWludDMyKSBtZW1bMV0pICYgMHhmZikgPDwgMTYpIHwKLQkJICAgICAgKCgoKHVpbnQzMikgbWVtWzBdKSAmIDB4ZmYpIDw8IDI0KTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBkYXRhWzBdID0gICgoKHVpbnQzMikgbWVtWzFdKSAmIDB4ZmYpIHwKLQkJICAgICAgKCgoKHVpbnQzMikgbWVtWzBdKSAmIDB4ZmYpIDw8IDgpOwotCSAgICBicmVhazsKLQljYXNlIDA6Ci0JICAgIGRhdGFbMF0gPSBtZW1bMF0gJiAweGZmOwotCSAgICBicmVhazsKLQkgICAgCi0JfQotICAgIH0gZWxzZSB7Ci0Jc3dpdGNoIChzeikgewotCWNhc2UgMzoKLQkgICAgZGF0YVsxXSA9ICgoKCh1aW50MzIpIG1lbVs3XSkgJiAweGZmKSA8PCAyNCkgfAotCQkgICAgICAoKCgodWludDMyKSBtZW1bNl0pICYgMHhmZikgPDwgMTYpIHwKLQkJICAgICAgKCgoKHVpbnQzMikgbWVtWzVdKSAmIDB4ZmYpIDw8ICA4KSB8Ci0JCSAgICAgICAoKCh1aW50MzIpIG1lbVs0XSkgJiAweGZmKTsKLQkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDQgKi8KLQljYXNlIDI6Ci0JICAgIGRhdGFbMF0gPSAoKCgodWludDMyKSBtZW1bM10pICYgMHhmZikgPDwgMjQpIHwKLQkJICAgICAgKCgoKHVpbnQzMikgbWVtWzJdKSAmIDB4ZmYpIDw8IDE2KSB8Ci0JCSAgICAgICgoKCh1aW50MzIpIG1lbVsxXSkgJiAweGZmKSA8PCAgOCkgfAotCQkgICAgICAgKCgodWludDMyKSBtZW1bMF0pICYgMHhmZik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgZGF0YVswXSA9ICgoKCh1aW50MzIpIG1lbVsxXSkgJiAweGZmKSA8PCAgOCkgfAotCQkgICAgICAgKCgodWludDMyKSBtZW1bMF0pICYgMHhmZik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMDoKLQkgICAgZGF0YVswXSA9IG1lbVswXSAmIDB4ZmY7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotLyogU3RvcmUgZGF0YSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gIE1FTSBwb2ludHMgdG8gbG9jYXRpb24gdG8gc3RvcmUgZGF0YTsKLSAgIERBVEEgcG9pbnRzIHRvIHdvcmRzIGluIGhvc3QgYnl0ZSBvcmRlciB0byBiZSBzdG9yZWQuICBTWiBjb250YWlucyBsb2coMikKLSAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0cmlldmUsIGFuZCBjYW4gYmUgMCAoMSBieXRlKSwgMSAob25lIGhhbGYtd29yZCksCi0gICAyIChvbmUgd29yZCksIG9yIDMgKHR3byB3b3JkcykuICovCi0KLXN0YXRpYyB2b2lkCi1zdG9yZV9ieXRlcyAobWVtLCBkYXRhLCBzeikKLSAgICB1bnNpZ25lZCBjaGFyICAqbWVtOwotICAgIHVpbnQzMgkgICAqZGF0YTsKLSAgICBpbnQJCSAgICBzejsKLXsKLSAgICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7Ci0Jc3dpdGNoIChzeikgewotCWNhc2UgMzoKLQkgICAgbWVtWzddID0gKGRhdGFbMV0gPj4gMjQpICYgMHhmZjsKLQkgICAgbWVtWzZdID0gKGRhdGFbMV0gPj4gMTYpICYgMHhmZjsKLQkgICAgbWVtWzVdID0gKGRhdGFbMV0gPj4gIDgpICYgMHhmZjsKLQkgICAgbWVtWzRdID0gZGF0YVsxXSAmIDB4ZmY7Ci0JICAgIC8qIEZhbGwgdGhyb3VnaCB0byAyICovCi0JY2FzZSAyOgotCSAgICBtZW1bM10gPSAoZGF0YVswXSA+PiAyNCkgJiAweGZmOwotCSAgICBtZW1bMl0gPSAoZGF0YVswXSA+PiAxNikgJiAweGZmOwotCSAgICAvKiBGYWxsIHRocm91Z2ggdG8gMSAqLwotCWNhc2UgMToKLQkgICAgbWVtWzFdID0gKGRhdGFbMF0gPj4gIDgpICYgMHhmZjsKLQkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDAgKi8KLQljYXNlIDA6Ci0JICAgIG1lbVswXSA9IGRhdGFbMF0gJiAweGZmOwotCSAgICBicmVhazsKLQl9Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKHN6KSB7Ci0JY2FzZSAzOgotCSAgICBtZW1bN10gPSBkYXRhWzFdICYgMHhmZjsKLQkgICAgbWVtWzZdID0gKGRhdGFbMV0gPj4gIDgpICYgMHhmZjsKLQkgICAgbWVtWzVdID0gKGRhdGFbMV0gPj4gMTYpICYgMHhmZjsKLQkgICAgbWVtWzRdID0gKGRhdGFbMV0gPj4gMjQpICYgMHhmZjsKLQkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDIgKi8KLQljYXNlIDI6Ci0JICAgIG1lbVszXSA9IGRhdGFbMF0gJiAweGZmOwotCSAgICBtZW1bMl0gPSAoZGF0YVswXSA+PiAgOCkgJiAweGZmOwotCSAgICBtZW1bMV0gPSAoZGF0YVswXSA+PiAxNikgJiAweGZmOwotCSAgICBtZW1bMF0gPSAoZGF0YVswXSA+PiAyNCkgJiAweGZmOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIG1lbVsxXSA9IGRhdGFbMF0gJiAweGZmOwotCSAgICBtZW1bMF0gPSAoZGF0YVswXSA+PiA4KSAmIDB4ZmY7Ci0JICAgIGJyZWFrOwotCWNhc2UgMDoKLQkgICAgbWVtWzBdID0gZGF0YVswXSAmIDB4ZmY7Ci0JICAgIGJyZWFrOwotCSAgICAKLQl9Ci0gICAgfQotfQotCi0KLS8qIE1lbW9yeSBlbXVsYXRpb24gKi8KLQotaW50Ci1tZW1vcnlfcmVhZChhc2ksIGFkZHIsIGRhdGEsIHN6LCB3cykKLSAgICBpbnQzMiAgICAgICAgICAgYXNpOwotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotICAgIHVpbnQzMiAgICAgICAgICpkYXRhOwotICAgIGludDMyICAgICAgICAgICBzejsKLSAgICBpbnQzMiAgICAgICAgICAqd3M7Ci17Ci0gICAgaW50MzIgICAgICAgICAgIG1leGM7Ci0KLSNpZmRlZiBFUlJJTkoKLSAgICBpZiAoZXJybWVjKSB7Ci0JaWYgKHNpc192ZXJib3NlKQotCSAgICBwcmludGYoIkluc2VydGVkIE1FQyBlcnJvciAlZFxuIixlcnJtZWMpOwotCXNldF9zZnNyKGVycm1lYywgYWRkciwgYXNpLCAxKTsKLQlpZiAoZXJybWVjID09IDUpIG1lY3BhcmVycm9yKCk7Ci0JaWYgKGVycm1lYyA9PSA2KSBpdWNvbXBlcnIoKTsKLQllcnJtZWMgPSAwOwotCXJldHVybigxKTsKLSAgICB9Ci0jZW5kaWY7Ci0KLSAgICBpZiAoKGFkZHIgPj0gbWVtX3JhbXN0YXJ0KSAmJiAoYWRkciA8IChtZW1fcmFtc3RhcnQgKyBtZW1fcmFtc3opKSkgewotCWZldGNoX2J5dGVzIChhc2ksICZyYW1iW2FkZHIgJiBtZW1fcmFtbWFza10sIGRhdGEsIHN6KTsKLQkqd3MgPSBtZW1fcmFtcl93czsKLQlyZXR1cm4gKDApOwotICAgIH0gZWxzZSBpZiAoKGFkZHIgPj0gTUVDX1NUQVJUKSAmJiAoYWRkciA8IE1FQ19FTkQpKSB7Ci0JbWV4YyA9IG1lY19yZWFkKGFkZHIsIGFzaSwgZGF0YSk7Ci0JaWYgKG1leGMpIHsKLQkgICAgc2V0X3Nmc3IoTUVDX0FDQywgYWRkciwgYXNpLCAxKTsKLQkgICAgKndzID0gTUVNX0VYX1dTOwotCX0gZWxzZSB7Ci0JICAgICp3cyA9IDA7Ci0JfQotCXJldHVybiAobWV4Yyk7Ci0KLSNpZmRlZiBFUkEKLQotICAgIH0gZWxzZSBpZiAoZXJhKSB7Ci0gICAgCWlmICgoYWRkciA8IDB4MTAwMDAwKSB8fCAKLQkgICAgKChhZGRyPj0gMHg4MDAwMDAwMCkgJiYgKGFkZHIgPCAweDgwMTAwMDAwKSkpIHsKLQkgICAgZmV0Y2hfYnl0ZXMgKGFzaSwgJnJvbWJbYWRkciAmIFJPTV9NQVNLXSwgZGF0YSwgc3opOwotCSAgICAqd3MgPSA0OwotCSAgICByZXR1cm4gKDApOwotCX0gZWxzZSBpZiAoKGFkZHIgPj0gMHgxMDAwMDAwMCkgJiYgCi0JCSAgIChhZGRyIDwgKDB4MTAwMDAwMDAgKyAoNTEyIDw8IChtZWNfaW9jciAmIDB4MGYpKSkpICYmCi0JCSAgIChtZWNfaW9jciAmIDB4MTApKSAgewotCSAgICAqZGF0YSA9IGVyYXJlZzsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0JCi0gICAgfSBlbHNlICBpZiAoYWRkciA8IG1lbV9yb21zeikgewotCSAgICBmZXRjaF9ieXRlcyAoYXNpLCAmcm9tYlthZGRyXSwgZGF0YSwgc3opOwotCSAgICAqd3MgPSBtZW1fcm9tcl93czsKLQkgICAgcmV0dXJuICgwKTsKLQotI2Vsc2UKLSAgICB9IGVsc2UgaWYgKGFkZHIgPCBtZW1fcm9tc3opIHsKLQlmZXRjaF9ieXRlcyAoYXNpLCAmcm9tYlthZGRyXSwgZGF0YSwgc3opOwotCSp3cyA9IG1lbV9yb21yX3dzOwotCXJldHVybiAoMCk7Ci0jZW5kaWYKLQotICAgIH0KLQotICAgIHByaW50ZigiTWVtb3J5IGV4Y2VwdGlvbiBhdCAleCAoaWxsZWdhbCBhZGRyZXNzKVxuIiwgYWRkcik7Ci0gICAgc2V0X3Nmc3IoVUlNUF9BQ0MsIGFkZHIsIGFzaSwgMSk7Ci0gICAgKndzID0gTUVNX0VYX1dTOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLWludAotbWVtb3J5X3dyaXRlKGFzaSwgYWRkciwgZGF0YSwgc3osIHdzKQotICAgIGludDMyICAgICAgICAgICBhc2k7Ci0gICAgdWludDMyICAgICAgICAgIGFkZHI7Ci0gICAgdWludDMyICAgICAgICAgKmRhdGE7Ci0gICAgaW50MzIgICAgICAgICAgIHN6OwotICAgIGludDMyICAgICAgICAgICp3czsKLXsKLSAgICB1aW50MzIgICAgICAgICAgYnl0ZV9hZGRyOwotICAgIHVpbnQzMiAgICAgICAgICBieXRlX21hc2s7Ci0gICAgdWludDMyICAgICAgICAgIHdhZGRyOwotICAgIHVpbnQzMiAgICAgICAgICpyYW07Ci0gICAgaW50MzIgICAgICAgICAgIG1leGM7Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgICAgIHdwaGl0WzJdOwotCi0jaWZkZWYgRVJSSU5KCi0gICAgaWYgKGVycm1lYykgewotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgcHJpbnRmKCJJbnNlcnRlZCBNRUMgZXJyb3IgJWRcbiIsZXJybWVjKTsKLQlzZXRfc2ZzcihlcnJtZWMsIGFkZHIsIGFzaSwgMCk7Ci0JaWYgKGVycm1lYyA9PSA1KSBtZWNwYXJlcnJvcigpOwotCWlmIChlcnJtZWMgPT0gNikgaXVjb21wZXJyKCk7Ci0JZXJybWVjID0gMDsKLQlyZXR1cm4oMSk7Ci0gICAgfQotI2VuZGlmOwotCi0gICAgaWYgKChhZGRyID49IG1lbV9yYW1zdGFydCkgJiYgKGFkZHIgPCAobWVtX3JhbXN0YXJ0ICsgbWVtX3JhbXN6KSkpIHsKLQlpZiAobWVtX2FjY3Byb3QpIHsKLQotCSAgICB3YWRkciA9IChhZGRyICYgMHg3ZmZmZmYpID4+IDI7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCXdwaGl0W2ldID0KLQkJICAgICgoKGFzaSA9PSAweGEpICYmIChtZWNfd3ByW2ldICYgMSkpIHx8Ci0JCSAgICAgKChhc2kgPT0gMHhiKSAmJiAobWVjX3dwcltpXSAmIDIpKSkgJiYKLQkJICAgICgod2FkZHIgPj0gbWVjX3NzYVtpXSkgJiYgKCh3YWRkciB8IChzeiA9PSAzKSkgPCBtZWNfc2VhW2ldKSk7Ci0KLQkgICAgaWYgKCgobWVtX2Jsb2NrcHJvdCkgJiYgKHdwaGl0WzBdIHx8IHdwaGl0WzFdKSkgfHwKLQkJKCghbWVtX2Jsb2NrcHJvdCkgJiYKLQkJICEoKG1lY193cHJbMF0gJiYgd3BoaXRbMF0pIHx8IChtZWNfd3ByWzFdICYmIHdwaGl0WzFdKSkKLQkJICkpIHsKLQkJaWYgKHNpc192ZXJib3NlKQotCQkgICAgcHJpbnRmKCJNZW1vcnkgYWNjZXNzIHByb3RlY3Rpb24gZXJyb3IgYXQgMHglMDh4XG4iLCBhZGRyKTsKLQkJc2V0X3Nmc3IoUFJPVF9FWEMsIGFkZHIsIGFzaSwgMCk7Ci0JCSp3cyA9IE1FTV9FWF9XUzsKLQkJcmV0dXJuICgxKTsKLQkgICAgfQotCX0KLQotCXN0b3JlX2J5dGVzICgmcmFtYlthZGRyICYgbWVtX3JhbW1hc2tdLCBkYXRhLCBzeik7Ci0KLQlzd2l0Y2ggKHN6KSB7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkgICAgKndzID0gbWVtX3JhbXdfd3MgKyAzOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgICp3cyA9IG1lbV9yYW13X3dzOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgICp3cyA9IDIgKiBtZW1fcmFtd193cyArIFNURF9XUzsKLQkgICAgYnJlYWs7Ci0JfQotCXJldHVybiAoMCk7Ci0gICAgfSBlbHNlIGlmICgoYWRkciA+PSBNRUNfU1RBUlQpICYmIChhZGRyIDwgTUVDX0VORCkpIHsKLQlpZiAoKHN6ICE9IDIpIHx8IChhc2kgIT0gMHhiKSkgewotCSAgICBzZXRfc2ZzcihNRUNfQUNDLCBhZGRyLCBhc2ksIDApOwotCSAgICAqd3MgPSBNRU1fRVhfV1M7Ci0JICAgIHJldHVybiAoMSk7Ci0JfQotCW1leGMgPSBtZWNfd3JpdGUoYWRkciwgKmRhdGEpOwotCWlmIChtZXhjKSB7Ci0JICAgIHNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMCk7Ci0JICAgICp3cyA9IE1FTV9FWF9XUzsKLQl9IGVsc2UgewotCSAgICAqd3MgPSAwOwotCX0KLQlyZXR1cm4gKG1leGMpOwotCi0jaWZkZWYgRVJBCi0KLSAgICB9IGVsc2UgaWYgKGVyYSkgewotICAgIAlpZiAoKGVyYXJlZyAmIDIpICYmIAotCSgoYWRkciA8IDB4MTAwMDAwKSB8fCAoKGFkZHIgPj0gMHg4MDAwMDAwMCkgJiYgKGFkZHIgPCAweDgwMTAwMDAwKSkpKSB7Ci0JICAgIGFkZHIgJj0gUk9NX01BU0s7Ci0JICAgICp3cyA9IHN6ID09IDMgPyA4IDogNDsKLQkgICAgc3RvcmVfYnl0ZXMgKCZyb21iW2FkZHJdLCBkYXRhLCBzeik7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotCX0gZWxzZSBpZiAoKGFkZHIgPj0gMHgxMDAwMDAwMCkgJiYgCi0JCSAgIChhZGRyIDwgKDB4MTAwMDAwMDAgKyAoNTEyIDw8IChtZWNfaW9jciAmIDB4MGYpKSkpICYmCi0JCSAgIChtZWNfaW9jciAmIDB4MTApKSAgewotCSAgICBlcmFyZWcgPSAqZGF0YSAmIDB4MGU7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotCi0gICAgfSBlbHNlIGlmICgoYWRkciA8IG1lbV9yb21zeikgJiYgKG1lY19tZW1jZmcgJiAweDEwMDAwKSAmJiAod3JwKSAmJgotICAgICAgICAgICAgICAgKCgobWVjX21lbWNmZyAmIDB4MjAwMDApICYmIChzeiA+IDEpKSB8fCAKLQkJKCEobWVjX21lbWNmZyAmIDB4MjAwMDApICYmIChzeiA9PSAwKSkpKSB7Ci0KLQkqd3MgPSBtZW1fcm9td193cyArIDE7Ci0JaWYgKHN6ID09IDMpCi0JICAgICp3cyArPSBtZW1fcm9td193cyArIFNURF9XUzsKLQlzdG9yZV9ieXRlcyAoJnJvbWJbYWRkcl0sIGRhdGEsIHN6KTsKLSAgICAgICAgcmV0dXJuICgwKTsKLQotI2Vsc2UKLSAgICB9IGVsc2UgaWYgKChhZGRyIDwgbWVtX3JvbXN6KSAmJiAobWVjX21lbWNmZyAmIDB4MTAwMDApICYmICh3cnApICYmCi0gICAgICAgICAgICAgICAoKChtZWNfbWVtY2ZnICYgMHgyMDAwMCkgJiYgKHN6ID4gMSkpIHx8IAotCQkoIShtZWNfbWVtY2ZnICYgMHgyMDAwMCkgJiYgKHN6ID09IDApKSkpIHsKLQotCSp3cyA9IG1lbV9yb213X3dzICsgMTsKLQlpZiAoc3ogPT0gMykKLSAgICAgICAgICAgICp3cyArPSBtZW1fcm9td193cyArIFNURF9XUzsKLQlzdG9yZV9ieXRlcyAoJnJvbWJbYWRkcl0sIGRhdGEsIHN6KTsKLSAgICAgICAgcmV0dXJuICgwKTsKLQotI2VuZGlmCi0KLSAgICB9Ci0JCi0gICAgKndzID0gTUVNX0VYX1dTOwotICAgIHNldF9zZnNyKFVJTVBfQUNDLCBhZGRyLCBhc2ksIDApOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICAqCi1nZXRfbWVtX3B0cihhZGRyLCBzaXplKQotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotICAgIHVpbnQzMiAgICAgICAgICBzaXplOwotewotICAgIGlmICgoYWRkciArIHNpemUpIDwgUk9NX1NaKSB7Ci0JcmV0dXJuICgmcm9tYlthZGRyXSk7Ci0gICAgfSBlbHNlIGlmICgoYWRkciA+PSBtZW1fcmFtc3RhcnQpICYmICgoYWRkciArIHNpemUpIDwgbWVtX3JhbWVuZCkpIHsKLQlyZXR1cm4gKCZyYW1iW2FkZHIgJiBtZW1fcmFtbWFza10pOwotICAgIH0KLQotI2lmZGVmIEVSQQotICAgICAgZWxzZSBpZiAoKGVyYSkgJiYgKChhZGRyIDwweDEwMDAwMCkgfHwgCi0JKChhZGRyID49ICh1bnNpZ25lZCkgMHg4MDAwMDAwMCkgJiYgKChhZGRyICsgc2l6ZSkgPCAodW5zaWduZWQpIDB4ODAxMDAwMDApKSkpIHsKLQlyZXR1cm4gKCZyb21iW2FkZHIgJiBST01fTUFTS10pOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuICgoY2hhciAqKSAtMSk7Ci19Ci0KLWludAotc2lzX21lbW9yeV93cml0ZShhZGRyLCBkYXRhLCBsZW5ndGgpCi0gICAgdWludDMyICAgICAgICAgIGFkZHI7Ci0gICAgY2hhciAgICAgICAgICAgKmRhdGE7Ci0gICAgdWludDMyICAgICAgICAgIGxlbmd0aDsKLXsKLSAgICBjaGFyICAgICAgICAgICAqbWVtOwotCi0gICAgaWYgKChtZW0gPSBnZXRfbWVtX3B0cihhZGRyLCBsZW5ndGgpKSA9PSAoKGNoYXIgKikgLTEpKQotCXJldHVybiAoMCk7Ci0KLSAgICBtZW1jcHkobWVtLCBkYXRhLCBsZW5ndGgpOwotICAgIHJldHVybiAobGVuZ3RoKTsKLX0KLQotaW50Ci1zaXNfbWVtb3J5X3JlYWQoYWRkciwgZGF0YSwgbGVuZ3RoKQotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotICAgIGNoYXIgICAgICAgICAgICpkYXRhOwotICAgIHVpbnQzMiAgICAgICAgICBsZW5ndGg7Ci17Ci0gICAgY2hhciAgICAgICAgICAgKm1lbTsKLQotICAgIGlmICgobWVtID0gZ2V0X21lbV9wdHIoYWRkciwgbGVuZ3RoKSkgPT0gKChjaGFyICopIC0xKSkKLQlyZXR1cm4gKDApOwotCi0gICAgbWVtY3B5KGRhdGEsIG1lbSwgbGVuZ3RoKTsKLSAgICByZXR1cm4gKGxlbmd0aCk7Ci19CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvZXhlYy5jIGIvc2ltL2VyYzMyL2V4ZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxZmMwYy4uMDAwMDAwMAotLS0gYS9zaW0vZXJjMzIvZXhlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0MSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgotICogCi0gKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMS44IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCi0gKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQotICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJzaXMuaCIKLSNpbmNsdWRlICJlbmQuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGludDMyICAgIHNpc192ZXJib3NlLCBzcGFyY2xpdGU7Ci1pbnQgZXh0X2lybCA9IDA7Ci0KLS8qIExvYWQvc3RvcmUgaW50ZXJsb2NrIGRlbGF5ICovCi0jZGVmaW5lIEZMU1RIT0xEIDEKLQotLyogTG9hZCBkZWxheSAoZGVsZXRlIGlmIHVud2FudGVkIC0gc3BlZWRzIHVwIHNpbXVsYXRpb24pICovCi0jZGVmaW5lIExPQURfREVMIDEKLQotI2RlZmluZSBUX0xECTIKLSNkZWZpbmUgVF9MREQJMwotI2RlZmluZSBUX1NUCTMKLSNkZWZpbmUgVF9TVEQJNAotI2RlZmluZSBUX0xEU1QJNAotI2RlZmluZSBUX0pNUEwJMgotI2RlZmluZSBUX1JFVFQJMgotCi0jZGVmaW5lIEZTUl9RTkUgCTB4MjAwMAotI2RlZmluZSBGUF9FWEVfTU9ERSAwCi0jZGVmaW5lCUZQX0VYQ19QRSAgIDEKLSNkZWZpbmUgRlBfRVhDX01PREUgMgotCi0jZGVmaW5lCUZCQQk4Ci0jZGVmaW5lCUZCTgkwCi0jZGVmaW5lCUZCTkUJMQotI2RlZmluZQlGQkxHCTIKLSNkZWZpbmUJRkJVTAkzCi0jZGVmaW5lCUZCTCAJNAotI2RlZmluZQlGQlVHCTUKLSNkZWZpbmUJRkJHIAk2Ci0jZGVmaW5lCUZCVSAJNwotI2RlZmluZSBGQkEJOAotI2RlZmluZSBGQkUJOQotI2RlZmluZSBGQlVFCTEwCi0jZGVmaW5lIEZCR0UJMTEKLSNkZWZpbmUgRkJVR0UJMTIKLSNkZWZpbmUgRkJMRQkxMwotI2RlZmluZSBGQlVMRQkxNAotI2RlZmluZSBGQk8JMTUKLQotI2RlZmluZQlGQ0NfRSAJMAotI2RlZmluZQlGQ0NfTCAJMQotI2RlZmluZQlGQ0NfRyAJMgotI2RlZmluZQlGQ0NfVSAJMwotCi0jZGVmaW5lIFBTUl9FVCAweDIwCi0jZGVmaW5lIFBTUl9FRiAweDEwMDAKLSNkZWZpbmUgUFNSX1BTIDB4NDAKLSNkZWZpbmUgUFNSX1MgIDB4ODAKLSNkZWZpbmUgUFNSX04gIDB4MDgwMDAwMAotI2RlZmluZSBQU1JfWiAgMHgwNDAwMDAwCi0jZGVmaW5lIFBTUl9WICAweDAyMDAwMDAKLSNkZWZpbmUgUFNSX0MgIDB4MDEwMDAwMAotI2RlZmluZSBQU1JfQ0MgMHgwRjAwMDAwCi0jZGVmaW5lIFBTUl9DV1AgMHg3Ci0jZGVmaW5lIFBTUl9QSUwgMHgwZjAwCi0KLSNkZWZpbmUgSUNDX04JKGljYyA+PiAzKQotI2RlZmluZSBJQ0NfWgkoaWNjID4+IDIpCi0jZGVmaW5lIElDQ19WCShpY2MgPj4gMSkKLSNkZWZpbmUgSUNDX0MJKGljYykKLQotI2RlZmluZSBGUF9QUkVTCShzcmVncy0+ZnB1X3ByZXMpCi0KLSNkZWZpbmUgVFJBUF9JRVhDIDEKLSNkZWZpbmUgVFJBUF9VTklNUCAyCi0jZGVmaW5lIFRSQVBfUFJJVkkgMwotI2RlZmluZSBUUkFQX0ZQRElTIDQKLSNkZWZpbmUgVFJBUF9XT0ZMIDUKLSNkZWZpbmUgVFJBUF9XVUZMIDYKLSNkZWZpbmUgVFJBUF9VTkFMSSA3Ci0jZGVmaW5lIFRSQVBfRlBFWEMgOAotI2RlZmluZSBUUkFQX0RFWEMgOQotI2RlZmluZSBUUkFQX1RBRyAxMAotI2RlZmluZSBUUkFQX0RJVjAgMHgyYQotCi0jZGVmaW5lIEZTUl9UVAkJMHgxQzAwMAotI2RlZmluZSBGUF9JRUVFCQkweDA0MDAwCi0jZGVmaW5lIEZQX1VOSU1QCTB4MEMwMDAKLSNkZWZpbmUgRlBfU0VRX0VSUgkweDEwMDAwCi0KLSNkZWZpbmUJQklDQ19CTgkJMAotI2RlZmluZQlCSUNDX0JFCQkxCi0jZGVmaW5lCUJJQ0NfQkxFCTIKLSNkZWZpbmUJQklDQ19CTAkJMwotI2RlZmluZQlCSUNDX0JMRVUJNAotI2RlZmluZQlCSUNDX0JDUwk1Ci0jZGVmaW5lCUJJQ0NfTkVHCTYKLSNkZWZpbmUJQklDQ19CVlMJNwotI2RlZmluZQlCSUNDX0JBCQk4Ci0jZGVmaW5lCUJJQ0NfQk5FCTkKLSNkZWZpbmUJQklDQ19CRwkJMTAKLSNkZWZpbmUJQklDQ19CR0UJMTEKLSNkZWZpbmUJQklDQ19CR1UJMTIKLSNkZWZpbmUJQklDQ19CQ0MJMTMKLSNkZWZpbmUJQklDQ19QT1MJMTQKLSNkZWZpbmUJQklDQ19CVkMJMTUKLQotI2RlZmluZSBJTlNUX1NJTU0xMyAweDFmZmYKLSNkZWZpbmUgSU5TVF9SUzIgICAgMHgxZgotI2RlZmluZSBJTlNUX0kJICAgIDB4MjAwMAotI2RlZmluZSBBREQgCTB4MDAKLSNkZWZpbmUgQUREQ0MgCTB4MTAKLSNkZWZpbmUgQUREWCAJMHgwOAotI2RlZmluZSBBRERYQ0MgCTB4MTgKLSNkZWZpbmUgVEFERENDIAkweDIwCi0jZGVmaW5lIFRTVUJDQyAgMHgyMQotI2RlZmluZSBUQUREQ0NUViAweDIyCi0jZGVmaW5lIFRTVUJDQ1RWIDB4MjMKLSNkZWZpbmUgSUFORCAJMHgwMQotI2RlZmluZSBJQU5EQ0MgCTB4MTEKLSNkZWZpbmUgSUFORE4gCTB4MDUKLSNkZWZpbmUgSUFORE5DQwkweDE1Ci0jZGVmaW5lIE1VTFNjYyAJMHgyNAotI2RlZmluZSBESVZTY2MgCTB4MUQKLSNkZWZpbmUgU01VTAkweDBCCi0jZGVmaW5lIFNNVUxDQwkweDFCCi0jZGVmaW5lIFVNVUwJMHgwQQotI2RlZmluZSBVTVVMQ0MJMHgxQQotI2RlZmluZSBTRElWCTB4MEYKLSNkZWZpbmUgU0RJVkNDCTB4MUYKLSNkZWZpbmUgVURJVgkweDBFCi0jZGVmaW5lIFVESVZDQwkweDFFCi0jZGVmaW5lIElPUiAJMHgwMgotI2RlZmluZSBJT1JDQyAJMHgxMgotI2RlZmluZSBJT1JOIAkweDA2Ci0jZGVmaW5lIElPUk5DQyAJMHgxNgotI2RlZmluZSBTTEwgCTB4MjUKLSNkZWZpbmUgU1JBIAkweDI3Ci0jZGVmaW5lIFNSTCAJMHgyNgotI2RlZmluZSBTVUIgCTB4MDQKLSNkZWZpbmUgU1VCQ0MgCTB4MTQKLSNkZWZpbmUgU1VCWCAJMHgwQwotI2RlZmluZSBTVUJYQ0MgCTB4MUMKLSNkZWZpbmUgSVhOT1IgCTB4MDcKLSNkZWZpbmUgSVhOT1JDQwkweDE3Ci0jZGVmaW5lIElYT1IgCTB4MDMKLSNkZWZpbmUgSVhPUkNDIAkweDEzCi0jZGVmaW5lIFNFVEhJIAkweDA0Ci0jZGVmaW5lIEJJQ0MgCTB4MDIKLSNkZWZpbmUgRlBCQ0MgCTB4MDYKLSNkZWZpbmUgUkRZIAkweDI4Ci0jZGVmaW5lIFJEUFNSIAkweDI5Ci0jZGVmaW5lIFJEV0lNIAkweDJBCi0jZGVmaW5lIFJEVEJSIAkweDJCCi0jZGVmaW5lIFNDQU4gCTB4MkMKLSNkZWZpbmUgV1JZCTB4MzAKLSNkZWZpbmUgV1JQU1IJMHgzMQotI2RlZmluZSBXUldJTQkweDMyCi0jZGVmaW5lIFdSVEJSCTB4MzMKLSNkZWZpbmUgSk1QTCAJMHgzOAotI2RlZmluZSBSRVRUIAkweDM5Ci0jZGVmaW5lIFRJQ0MgCTB4M0EKLSNkZWZpbmUgU0FWRSAJMHgzQwotI2RlZmluZSBSRVNUT1JFIDB4M0QKLSNkZWZpbmUgTERECTB4MDMKLSNkZWZpbmUgTEREQQkweDEzCi0jZGVmaW5lIExECTB4MDAKLSNkZWZpbmUgTERBCTB4MTAKLSNkZWZpbmUgTERGCTB4MjAKLSNkZWZpbmUgTERERgkweDIzCi0jZGVmaW5lIExEU1RVQgkweDBECi0jZGVmaW5lIExEU1RVQkEJMHgxRAotI2RlZmluZSBMRFVCCTB4MDEKLSNkZWZpbmUgTERVQkEJMHgxMQotI2RlZmluZSBMRFNCCTB4MDkKLSNkZWZpbmUgTERTQkEJMHgxOQotI2RlZmluZSBMRFVICTB4MDIKLSNkZWZpbmUgTERVSEEJMHgxMgotI2RlZmluZSBMRFNICTB4MEEKLSNkZWZpbmUgTERTSEEJMHgxQQotI2RlZmluZSBMREZTUgkweDIxCi0jZGVmaW5lIFNUCTB4MDQKLSNkZWZpbmUgU1RBCTB4MTQKLSNkZWZpbmUgU1RCCTB4MDUKLSNkZWZpbmUgU1RCQQkweDE1Ci0jZGVmaW5lIFNURAkweDA3Ci0jZGVmaW5lIFNUREEJMHgxNwotI2RlZmluZSBTVEYJMHgyNAotI2RlZmluZSBTVERGUQkweDI2Ci0jZGVmaW5lIFNUREYJMHgyNwotI2RlZmluZSBTVEZTUgkweDI1Ci0jZGVmaW5lIFNUSAkweDA2Ci0jZGVmaW5lIFNUSEEJMHgxNgotI2RlZmluZSBTV0FQCTB4MEYKLSNkZWZpbmUgU1dBUEEJMHgxRgotI2RlZmluZSBGTFVTSAkweDNCCi0KLSNkZWZpbmUgU0lHTl9CSVQgMHg4MDAwMDAwMAotCi0vKiAjIG9mIGN5Y2xlcyBvdmVyaGVhZCB3aGVuIGEgdHJhcCBpcyB0YWtlbiAqLwotI2RlZmluZSBUUkFQX0MgIDMKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIHVpbnQzMglzdWJfY2MgUEFSQU1TICgodWludDMyIHBzciwgaW50MzIgb3BlcmFuZDEsIGludDMyIG9wZXJhbmQyLAotCQkJCWludDMyIHJlc3VsdCkpOwotc3RhdGljIHVpbnQzMglhZGRfY2MgUEFSQU1TICgodWludDMyIHBzciwgaW50MzIgb3BlcmFuZDEsIGludDMyIG9wZXJhbmQyLAotCQkJCWludDMyIHJlc3VsdCkpOwotc3RhdGljIHZvaWQJbG9nX2NjIFBBUkFNUyAoKGludDMyIHJlc3VsdCwgc3RydWN0IHBzdGF0ZSAqc3JlZ3MpKTsKLXN0YXRpYyBpbnQJZnBleGVjIFBBUkFNUyAoKHVpbnQzMiBvcDMsIHVpbnQzMiByZCwgdWludDMyIHJzMSwgdWludDMyIHJzMiwKLQkJCQlzdHJ1Y3QgcHN0YXRlICpzcmVncykpOwotc3RhdGljIGludAljaGtfYXNpIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCB1aW50MzIgKmFzaSwgdWludDMyIG9wMykpOwotCi0KLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotZXh0ZXJuIGludDMyICAgIG5mcCxpZnQ7Ci0KLSNpZmRlZiBFUlJJTkoKLWV4dGVybiB1aW50MzIgZXJydHQsIGVycmZ0dDsKLSNlbmRpZgotCi1zdGF0aWMgdWludDMyCi1zdWJfY2MocHNyLCBvcGVyYW5kMSwgb3BlcmFuZDIsIHJlc3VsdCkKLSAgICB1aW50MzIgICAgICAgICAgcHNyOwotICAgIGludDMyICAgICAgICAgICBvcGVyYW5kMTsKLSAgICBpbnQzMiAgICAgICAgICAgb3BlcmFuZDI7Ci0gICAgaW50MzIgICAgICAgICAgIHJlc3VsdDsKLXsKLSAgICBwc3IgPSAoKHBzciAmIH5QU1JfTikgfCAoKHJlc3VsdCA+PiA4KSAmIFBTUl9OKSk7Ci0gICAgaWYgKHJlc3VsdCkKLQlwc3IgJj0gflBTUl9aOwotICAgIGVsc2UKLQlwc3IgfD0gUFNSX1o7Ci0gICAgcHNyID0gKHBzciAmIH5QU1JfVikgfCAoKCgob3BlcmFuZDEgJiB+b3BlcmFuZDIgJiB+cmVzdWx0KSB8Ci0JCQkgICAofm9wZXJhbmQxICYgb3BlcmFuZDIgJiByZXN1bHQpKSA+PiAxMCkgJiBQU1JfVik7Ci0gICAgcHNyID0gKHBzciAmIH5QU1JfQykgfCAoKCgofm9wZXJhbmQxICYgb3BlcmFuZDIpIHwKLQkJCSAoKH5vcGVyYW5kMSB8IG9wZXJhbmQyKSAmIHJlc3VsdCkpID4+IDExKSAmIFBTUl9DKTsKLSAgICByZXR1cm4gKHBzcik7Ci19Ci0KLXVpbnQzMgotYWRkX2NjKHBzciwgb3BlcmFuZDEsIG9wZXJhbmQyLCByZXN1bHQpCi0gICAgdWludDMyICAgICAgICAgIHBzcjsKLSAgICBpbnQzMiAgICAgICAgICAgb3BlcmFuZDE7Ci0gICAgaW50MzIgICAgICAgICAgIG9wZXJhbmQyOwotICAgIGludDMyICAgICAgICAgICByZXN1bHQ7Ci17Ci0gICAgcHNyID0gKChwc3IgJiB+UFNSX04pIHwgKChyZXN1bHQgPj4gOCkgJiBQU1JfTikpOwotICAgIGlmIChyZXN1bHQpCi0JcHNyICY9IH5QU1JfWjsKLSAgICBlbHNlCi0JcHNyIHw9IFBTUl9aOwotICAgIHBzciA9IChwc3IgJiB+UFNSX1YpIHwgKCgoKG9wZXJhbmQxICYgb3BlcmFuZDIgJiB+cmVzdWx0KSB8Ci0JCQkgICh+b3BlcmFuZDEgJiB+b3BlcmFuZDIgJiByZXN1bHQpKSA+PiAxMCkgJiBQU1JfVik7Ci0gICAgcHNyID0gKHBzciAmIH5QU1JfQykgfCAoKCgob3BlcmFuZDEgJiBvcGVyYW5kMikgfAotCQkJICgob3BlcmFuZDEgfCBvcGVyYW5kMikgJiB+cmVzdWx0KSkgPj4gMTEpICYgUFNSX0MpOwotICAgIHJldHVybihwc3IpOwotfQotCi1zdGF0aWMgdm9pZAotbG9nX2NjKHJlc3VsdCwgc3JlZ3MpCi0gICAgaW50MzIgICAgICAgICAgIHJlc3VsdDsKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci17Ci0gICAgc3JlZ3MtPnBzciAmPSB+KFBTUl9DQyk7CS8qIFplcm8gQ0MgYml0cyAqLwotICAgIHNyZWdzLT5wc3IgPSAoc3JlZ3MtPnBzciB8ICgocmVzdWx0ID4+IDgpICYgUFNSX04pKTsKLSAgICBpZiAocmVzdWx0ID09IDApCi0Jc3JlZ3MtPnBzciB8PSBQU1JfWjsKLX0KLQotLyogQWRkIHR3byB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMsIGFuZCBjYWxjdWxhdGUgdGhlIGNhcnJ5IG91dC4gKi8KLQotc3RhdGljIHVpbnQzMgotYWRkMzIgKHVpbnQzMiBuMSwgdWludDMyIG4yLCBpbnQgKmNhcnJ5KQotewotICB1aW50MzIgcmVzdWx0ID0gbjEgKyBuMjsKLQotICAqY2FycnkgPSByZXN1bHQgPCBuMSB8fCByZXN1bHQgPCBuMTsKLSAgcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qIE11bHRpcGx5IHR3byAzMi1iaXQgaW50ZWdlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotbXVsNjQgKHVpbnQzMiBuMSwgdWludDMyIG4yLCB1aW50MzIgKnJlc3VsdF9oaSwgdWludDMyICpyZXN1bHRfbG8sIGludCBtc2lnbmVkKQotewotICB1aW50MzIgbG8sIG1pZDEsIG1pZDIsIGhpLCByZWdfbG8sIHJlZ19oaTsKLSAgaW50IGNhcnJ5OwotICBpbnQgc2lnbiA9IDA7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHNpZ25lZCBtdWx0aXBseSwgY2FsY3VsYXRlIHRoZSBzaWduIG9mIHRoZSByZXN1bHQKLSAgICAgYW5kIG1ha2UgdGhlIG9wZXJhbmRzIHBvc2l0aXZlLiAgKi8KLSAgaWYgKG1zaWduZWQpCi0gICAgewotICAgICAgc2lnbiA9IChuMSBeIG4yKSAmIFNJR05fQklUOwotICAgICAgaWYgKG4xICYgU0lHTl9CSVQpCi0JbjEgPSAtbjE7Ci0gICAgICBpZiAobjIgJiBTSUdOX0JJVCkKLQluMiA9IC1uMjsKLSAgICAgIAotICAgIH0KLSAgCi0gIC8qIFdlIGNhbiBzcGxpdCB0aGUgMzJ4MzIgaW50byBmb3VyIDE2eDE2IG9wZXJhdGlvbnMuIFRoaXMgZW5zdXJlcwotICAgICB0aGF0IHdlIGRvIG5vdCBsb3NlIHByZWNpc2lvbiBvbiAzMmJpdCBvbmx5IGhvc3RzOiAqLwotICBsbyA9ICAgKChuMSAmIDB4RkZGRikgKiAobjIgJiAweEZGRkYpKTsKLSAgbWlkMSA9ICgobjEgJiAweEZGRkYpICogKChuMiA+PiAxNikgJiAweEZGRkYpKTsKLSAgbWlkMiA9ICgoKG4xID4+IDE2KSAmIDB4RkZGRikgKiAobjIgJiAweEZGRkYpKTsKLSAgaGkgPSAgICgoKG4xID4+IDE2KSAmIDB4RkZGRikgKiAoKG4yID4+IDE2KSAmIDB4RkZGRikpOwotICAKLSAgLyogV2Ugbm93IG5lZWQgdG8gYWRkIGFsbCBvZiB0aGVzZSByZXN1bHRzIHRvZ2V0aGVyLCB0YWtpbmcgY2FyZQotICAgICB0byBwcm9wb2dhdGUgdGhlIGNhcnJpZXMgZnJvbSB0aGUgYWRkaXRpb25zOiAqLwotICByZWdfbG8gPSBhZGQzMiAobG8sIChtaWQxIDw8IDE2KSwgJmNhcnJ5KTsKLSAgcmVnX2hpID0gY2Fycnk7Ci0gIHJlZ19sbyA9IGFkZDMyIChyZWdfbG8sIChtaWQyIDw8IDE2KSwgJmNhcnJ5KTsKLSAgcmVnX2hpICs9IChjYXJyeSArICgobWlkMSA+PiAxNikgJiAweEZGRkYpICsgKChtaWQyID4+IDE2KSAmIDB4RkZGRikgKyBoaSk7Ci0KLSAgLyogTmVnYXRlIHJlc3VsdCBpZiBuZWNlc3NhcnkuICovCi0gIGlmIChzaWduKQotICAgIHsKLSAgICAgIHJlZ19oaSA9IH4gcmVnX2hpOwotICAgICAgcmVnX2xvID0gLSByZWdfbG87Ci0gICAgICBpZiAocmVnX2xvID09IDApCi0JcmVnX2hpKys7Ci0gICAgfQotICAKLSAgKnJlc3VsdF9sbyA9IHJlZ19sbzsKLSAgKnJlc3VsdF9oaSA9IHJlZ19oaTsKLX0KLQotCi0vKiBEaXZpZGUgYSA2NC1iaXQgaW50ZWdlciBieSBhIDMyLWJpdCBpbnRlZ2VyLiAgV2UgY2hlYXQgYW5kIGFzc3VtZQotICAgdGhhdCB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyBsb25nIGxvbmcgb3BlcmF0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXY2NCAodWludDMyIG4xX2hpLCB1aW50MzIgbjFfbG93LCB1aW50MzIgbjIsIHVpbnQzMiAqcmVzdWx0LCBpbnQgbXNpZ25lZCkKLXsKLSAgdWludDY0IG4xOwotCi0gIG4xID0gKCh1aW50NjQpIG4xX2hpKSA8PCAzMjsKLSAgbjEgfD0gKCh1aW50NjQpIG4xX2xvdykgJiAweGZmZmZmZmZmOwotCi0gIGlmIChtc2lnbmVkKQotICAgIHsKLSAgICAgIGludDY0IG4xX3MgPSAoaW50NjQpIG4xOwotICAgICAgaW50MzIgbjJfcyA9IChpbnQzMikgbjI7Ci0gICAgICBuMV9zID0gbjFfcyAvIG4yX3M7Ci0gICAgICBuMSA9ICh1aW50NjQpIG4xX3M7Ci0gICAgfQotICBlbHNlCi0gICAgbjEgPSBuMSAvIG4yOwotCi0gICpyZXN1bHQgPSAodWludDMyKSAobjEgJiAweGZmZmZmZmZmKTsKLX0KLQotCi1pbnQKLWRpc3BhdGNoX2luc3RydWN0aW9uKHNyZWdzKQotICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKLXsKLQotICAgIHVpbnQzMiAgICAgICAgICBjd3AsIG9wLCBvcDIsIG9wMywgYXNpLCByZCwgY29uZCwgcnMxLAotICAgICAgICAgICAgICAgICAgICByczI7Ci0gICAgdWludDMyICAgICAgICAgIGxkZXAsIGljYzsKLSAgICBpbnQzMiAgICAgICAgICAgb3BlcmFuZDEsIG9wZXJhbmQyLCAqcmRkLCByZXN1bHQsIGVpY2MsCi0gICAgICAgICAgICAgICAgICAgIG5ld19jd3A7Ci0gICAgaW50MzIgICAgICAgICAgIHBjLCBucGMsIGRhdGEsIGFkZHJlc3MsIHdzLCBtZXhjLCBmY2M7Ci0gICAgaW50MzIJICAgIGRkYXRhWzJdOwotCi0gICAgc3JlZ3MtPm5pbnN0Kys7Ci0gICAgY3dwID0gKChzcmVncy0+cHNyICYgUFNSX0NXUCkgPDwgNCk7Ci0gICAgb3AgPSBzcmVncy0+aW5zdCA+PiAzMDsKLSAgICBwYyA9IHNyZWdzLT5ucGM7Ci0gICAgbnBjID0gc3JlZ3MtPm5wYyArIDQ7Ci0gICAgb3AzID0gcmQgPSByczEgPSBvcGVyYW5kMiA9IGVpY2MgPSAwOwotICAgIHJkZCA9IDA7Ci0gICAgaWYgKG9wICYgMikgewotCi0Jb3AzID0gKHNyZWdzLT5pbnN0ID4+IDE5KSAmIDB4M2Y7Ci0JcnMxID0gKHNyZWdzLT5pbnN0ID4+IDE0KSAmIDB4MWY7Ci0JcmQgPSAoc3JlZ3MtPmluc3QgPj4gMjUpICYgMHgxZjsKLQotI2lmZGVmIExPQURfREVMCi0KLQkvKiBDaGVjayBpZiBsb2FkIGRlcGVuZGVjeSBpcyBwb3NzaWJsZSAqLwotCWlmIChlYmFzZS5zaW10aW1lIDw9IHNyZWdzLT5pbGR0aW1lKQotCSAgICBsZGVwID0gKCgob3AzICYgMHgzOCkgIT0gMHgyOCkgJiYgKChvcDMgJiAweDNlKSAhPSAweDM0KSAmJiAoc3JlZ3MtPmlsZHJlZyAhPSAwKSk7Ci0gICAgICAgIGVsc2UKLQkgICAgbGRlcCA9IDA7Ci0JaWYgKHNyZWdzLT5pbnN0ICYgSU5TVF9JKSB7Ci0JICAgIGlmIChsZGVwICYmIChzcmVncy0+aWxkcmVnID09IHJzMSkpCi0JCXNyZWdzLT5ob2xkKys7Ci0JICAgIG9wZXJhbmQyID0gc3JlZ3MtPmluc3Q7Ci0JICAgIG9wZXJhbmQyID0gKChvcGVyYW5kMiA8PCAxOSkgPj4gMTkpOwkvKiBzaWduIGV4dGVuZCAqLwotCX0gZWxzZSB7Ci0JICAgIHJzMiA9IHNyZWdzLT5pbnN0ICYgSU5TVF9SUzI7Ci0JICAgIGlmIChyczIgPiA3KQotCQlvcGVyYW5kMiA9IHNyZWdzLT5yWyhjd3AgKyByczIpICYgMHg3Zl07Ci0JICAgIGVsc2UKLQkJb3BlcmFuZDIgPSBzcmVncy0+Z1tyczJdOwotCSAgICBpZiAobGRlcCAmJiAoKHNyZWdzLT5pbGRyZWcgPT0gcnMxKSB8fCAoc3JlZ3MtPmlsZHJlZyA9PSByczIpKSkKLQkJc3JlZ3MtPmhvbGQrKzsKLQl9Ci0jZWxzZQotCWlmIChzcmVncy0+aW5zdCAmIElOU1RfSSkgewotCSAgICBvcGVyYW5kMiA9IHNyZWdzLT5pbnN0OwotCSAgICBvcGVyYW5kMiA9ICgob3BlcmFuZDIgPDwgMTkpID4+IDE5KTsJLyogc2lnbiBleHRlbmQgKi8KLQl9IGVsc2UgewotCSAgICByczIgPSBzcmVncy0+aW5zdCAmIElOU1RfUlMyOwotCSAgICBpZiAocnMyID4gNykKLQkJb3BlcmFuZDIgPSBzcmVncy0+clsoY3dwICsgcnMyKSAmIDB4N2ZdOwotCSAgICBlbHNlCi0JCW9wZXJhbmQyID0gc3JlZ3MtPmdbcnMyXTsKLQl9Ci0jZW5kaWYKLQotCWlmIChyZCA+IDcpCi0JICAgIHJkZCA9ICYoc3JlZ3MtPnJbKGN3cCArIHJkKSAmIDB4N2ZdKTsKLQllbHNlCi0JICAgIHJkZCA9ICYoc3JlZ3MtPmdbcmRdKTsKLQlpZiAocnMxID4gNykKLQkgICAgcnMxID0gc3JlZ3MtPnJbKGN3cCArIHJzMSkgJiAweDdmXTsKLQllbHNlCi0JICAgIHJzMSA9IHNyZWdzLT5nW3JzMV07Ci0gICAgfQotICAgIHN3aXRjaCAob3ApIHsKLSAgICBjYXNlIDA6Ci0Jb3AyID0gKHNyZWdzLT5pbnN0ID4+IDIyKSAmIDB4NzsKLQlzd2l0Y2ggKG9wMikgewotCWNhc2UgU0VUSEk6Ci0JICAgIHJkID0gKHNyZWdzLT5pbnN0ID4+IDI1KSAmIDB4MWY7Ci0JICAgIGlmIChyZCA+IDcpCi0JCXJkZCA9ICYoc3JlZ3MtPnJbKGN3cCArIHJkKSAmIDB4N2ZdKTsKLQkgICAgZWxzZQotCQlyZGQgPSAmKHNyZWdzLT5nW3JkXSk7Ci0JICAgICpyZGQgPSBzcmVncy0+aW5zdCA8PCAxMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBCSUNDOgotI2lmZGVmIFNUQVQKLQkgICAgc3JlZ3MtPm5icmFuY2grKzsKLSNlbmRpZgotCSAgICBpY2MgPSBzcmVncy0+cHNyID4+IDIwOwotCSAgICBjb25kID0gKChzcmVncy0+aW5zdCA+PiAyNSkgJiAweDBmKTsKLQkgICAgc3dpdGNoIChjb25kKSB7Ci0JICAgIGNhc2UgQklDQ19CTjoKLQkJZWljYyA9IDA7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEJJQ0NfQkU6Ci0JCWVpY2MgPSBJQ0NfWjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CTEU6Ci0JCWVpY2MgPSBJQ0NfWiB8IChJQ0NfTiBeIElDQ19WKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CTDoKLQkJZWljYyA9IChJQ0NfTiBeIElDQ19WKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CTEVVOgotCQllaWNjID0gSUNDX0MgfCBJQ0NfWjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CQ1M6Ci0JCWVpY2MgPSBJQ0NfQzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19ORUc6Ci0JCWVpY2MgPSBJQ0NfTjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CVlM6Ci0JCWVpY2MgPSBJQ0NfVjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CQToKLQkJZWljYyA9IDE7Ci0JCWlmIChzcmVncy0+aW5zdCAmIDB4MjAwMDAwMDApCi0JCSAgICBzcmVncy0+YW5udWwgPSAxOwotCQlicmVhazsKLQkgICAgY2FzZSBCSUNDX0JORToKLQkJZWljYyA9IH4oSUNDX1opOwotCQlicmVhazsKLQkgICAgY2FzZSBCSUNDX0JHOgotCQllaWNjID0gfihJQ0NfWiB8IChJQ0NfTiBeIElDQ19WKSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEJJQ0NfQkdFOgotCQllaWNjID0gfihJQ0NfTiBeIElDQ19WKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQklDQ19CR1U6Ci0JCWVpY2MgPSB+KElDQ19DIHwgSUNDX1opOwotCQlicmVhazsKLQkgICAgY2FzZSBCSUNDX0JDQzoKLQkJZWljYyA9IH4oSUNDX0MpOwotCQlicmVhazsKLQkgICAgY2FzZSBCSUNDX1BPUzoKLQkJZWljYyA9IH4oSUNDX04pOwotCQlicmVhazsKLQkgICAgY2FzZSBCSUNDX0JWQzoKLQkJZWljYyA9IH4oSUNDX1YpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoZWljYyAmIDEpIHsKLQkJb3BlcmFuZDEgPSBzcmVncy0+aW5zdDsKLQkJb3BlcmFuZDEgPSAoKG9wZXJhbmQxIDw8IDEwKSA+PiA4KTsJLyogc2lnbiBleHRlbmQgKi8KLQkJbnBjID0gc3JlZ3MtPnBjICsgb3BlcmFuZDE7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmIChzcmVncy0+aW5zdCAmIDB4MjAwMDAwMDApCi0JCSAgICBzcmVncy0+YW5udWwgPSAxOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgRlBCQ0M6Ci0jaWZkZWYgU1RBVAotCSAgICBzcmVncy0+bmJyYW5jaCsrOwotI2VuZGlmCi0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChlYmFzZS5zaW10aW1lIDwgc3JlZ3MtPmZ0aW1lKSB7Ci0JCXNyZWdzLT5mdGltZSA9IGViYXNlLnNpbXRpbWUgKyBzcmVncy0+aG9sZDsKLQkgICAgfQotCSAgICBjb25kID0gKChzcmVncy0+aW5zdCA+PiAyNSkgJiAweDBmKTsKLQkgICAgZmNjID0gKHNyZWdzLT5mc3IgPj4gMTApICYgMHgzOwotCSAgICBzd2l0Y2ggKGNvbmQpIHsKLQkgICAgY2FzZSBGQk46Ci0JCWVpY2MgPSAwOwotCQlicmVhazsKLQkgICAgY2FzZSBGQk5FOgotCQllaWNjID0gKGZjYyAhPSBGQ0NfRSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEZCTEc6Ci0JCWVpY2MgPSAoZmNjID09IEZDQ19MKSB8fCAoZmNjID09IEZDQ19HKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJVTDoKLQkJZWljYyA9IChmY2MgPT0gRkNDX0wpIHx8IChmY2MgPT0gRkNDX1UpOwotCQlicmVhazsKLQkgICAgY2FzZSBGQkw6Ci0JCWVpY2MgPSAoZmNjID09IEZDQ19MKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJVRzoKLQkJZWljYyA9IChmY2MgPT0gRkNDX0cpIHx8IChmY2MgPT0gRkNDX1UpOwotCQlicmVhazsKLQkgICAgY2FzZSBGQkc6Ci0JCWVpY2MgPSAoZmNjID09IEZDQ19HKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJVOgotCQllaWNjID0gKGZjYyA9PSBGQ0NfVSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEZCQToKLQkJZWljYyA9IDE7Ci0JCWlmIChzcmVncy0+aW5zdCAmIDB4MjAwMDAwMDApCi0JCSAgICBzcmVncy0+YW5udWwgPSAxOwotCQlicmVhazsKLQkgICAgY2FzZSBGQkU6Ci0JCWVpY2MgPSAhKGZjYyAhPSBGQ0NfRSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEZCVUU6Ci0JCWVpY2MgPSAhKChmY2MgPT0gRkNDX0wpIHx8IChmY2MgPT0gRkNDX0cpKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJHRToKLQkJZWljYyA9ICEoKGZjYyA9PSBGQ0NfTCkgfHwgKGZjYyA9PSBGQ0NfVSkpOwotCQlicmVhazsKLQkgICAgY2FzZSBGQlVHRToKLQkJZWljYyA9ICEoZmNjID09IEZDQ19MKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJMRToKLQkJZWljYyA9ICEoKGZjYyA9PSBGQ0NfRykgfHwgKGZjYyA9PSBGQ0NfVSkpOwotCQlicmVhazsKLQkgICAgY2FzZSBGQlVMRToKLQkJZWljYyA9ICEoZmNjID09IEZDQ19HKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRkJPOgotCQllaWNjID0gIShmY2MgPT0gRkNDX1UpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoZWljYykgewotCQlvcGVyYW5kMSA9IHNyZWdzLT5pbnN0OwotCQlvcGVyYW5kMSA9ICgob3BlcmFuZDEgPDwgMTApID4+IDgpOwkvKiBzaWduIGV4dGVuZCAqLwotCQlucGMgPSBzcmVncy0+cGMgKyBvcGVyYW5kMTsKLQkgICAgfSBlbHNlIHsKLQkJaWYgKHNyZWdzLT5pbnN0ICYgMHgyMDAwMDAwMCkKLQkJICAgIHNyZWdzLT5hbm51bCA9IDE7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6CQkJLyogQ0FMTCAqLwotI2lmZGVmIFNUQVQKLQlzcmVncy0+bmJyYW5jaCsrOwotI2VuZGlmCi0Jc3JlZ3MtPnJbKGN3cCArIDE1KSAmIDB4N2ZdID0gc3JlZ3MtPnBjOwotCW5wYyA9IHNyZWdzLT5wYyArIChzcmVncy0+aW5zdCA8PCAyKTsKLQlicmVhazsKLQotICAgIGNhc2UgMjoKLQlpZiAoKG9wMyA+PiAxKSA9PSAweDFhKSB7Ci0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JICAgIH0gZWxzZSB7Ci0JCXJzMSA9IChzcmVncy0+aW5zdCA+PiAxNCkgJiAweDFmOwotCQlyczIgPSBzcmVncy0+aW5zdCAmIDB4MWY7Ci0JCXNyZWdzLT50cmFwID0gZnBleGVjKG9wMywgcmQsIHJzMSwgcnMyLCBzcmVncyk7Ci0JICAgIH0KLQl9IGVsc2UgewotCi0JICAgIHN3aXRjaCAob3AzKSB7Ci0JICAgIGNhc2UgVElDQzoKLQkgICAgICAgIGljYyA9IHNyZWdzLT5wc3IgPj4gMjA7Ci0JICAgICAgICBjb25kID0gKChzcmVncy0+aW5zdCA+PiAyNSkgJiAweDBmKTsKLQkgICAgICAgIHN3aXRjaCAoY29uZCkgewotCQljYXNlIEJJQ0NfQk46Ci0JCSAgICBlaWNjID0gMDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEJJQ0NfQkU6Ci0JCSAgICBlaWNjID0gSUNDX1o7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBCSUNDX0JMRToKLQkJICAgIGVpY2MgPSBJQ0NfWiB8IChJQ0NfTiBeIElDQ19WKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEJJQ0NfQkw6Ci0JCSAgICBlaWNjID0gKElDQ19OIF4gSUNDX1YpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgQklDQ19CTEVVOgotCQkgICAgZWljYyA9IElDQ19DIHwgSUNDX1o7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBCSUNDX0JDUzoKLQkJICAgIGVpY2MgPSBJQ0NfQzsKLQkJICAgIGJyZWFrOwotCQljYXNlIEJJQ0NfTkVHOgotCQkgICAgZWljYyA9IElDQ19OOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgQklDQ19CVlM6Ci0JCSAgICBlaWNjID0gSUNDX1Y7Ci0JCSAgICBicmVhazsKLQkgICAgICAgIGNhc2UgQklDQ19CQToKLQkJICAgIGVpY2MgPSAxOwotCQkgICAgYnJlYWs7Ci0JICAgICAgICBjYXNlIEJJQ0NfQk5FOgotCQkgICAgZWljYyA9IH4oSUNDX1opOwotCQkgICAgYnJlYWs7Ci0JICAgICAgICBjYXNlIEJJQ0NfQkc6Ci0JCSAgICBlaWNjID0gfihJQ0NfWiB8IChJQ0NfTiBeIElDQ19WKSk7Ci0JCSAgICBicmVhazsKLQkgICAgICAgIGNhc2UgQklDQ19CR0U6Ci0JCSAgICBlaWNjID0gfihJQ0NfTiBeIElDQ19WKTsKLQkJICAgIGJyZWFrOwotCSAgICAgICAgY2FzZSBCSUNDX0JHVToKLQkJICAgIGVpY2MgPSB+KElDQ19DIHwgSUNDX1opOwotCQkgICAgYnJlYWs7Ci0JICAgICAgICBjYXNlIEJJQ0NfQkNDOgotCQkgICAgZWljYyA9IH4oSUNDX0MpOwotCQkgICAgYnJlYWs7Ci0JICAgICAgICBjYXNlIEJJQ0NfUE9TOgotCQkgICAgZWljYyA9IH4oSUNDX04pOwotCQkgICAgYnJlYWs7Ci0JICAgICAgICBjYXNlIEJJQ0NfQlZDOgotCQkgICAgZWljYyA9IH4oSUNDX1YpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaWYgKGVpY2MgJiAxKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9ICgweDgwIHwgKChyczEgKyBvcGVyYW5kMikgJiAweDdmKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBNVUxTY2M6Ci0JCW9wZXJhbmQxID0KLQkJICAgICgoKHNyZWdzLT5wc3IgJiBQU1JfVikgXiAoKHNyZWdzLT5wc3IgJiBQU1JfTikgPj4gMikpCi0JCSAgICAgPDwgMTApIHwgKHJzMSA+PiAxKTsKLQkJaWYgKChzcmVncy0+eSAmIDEpID09IDApCi0JCSAgICBvcGVyYW5kMiA9IDA7Ci0JCSpyZGQgPSBvcGVyYW5kMSArIG9wZXJhbmQyOwotCQlzcmVncy0+eSA9IChyczEgPDwgMzEpIHwgKHNyZWdzLT55ID4+IDEpOwotCQlzcmVncy0+cHNyID0gYWRkX2NjKHNyZWdzLT5wc3IsIG9wZXJhbmQxLCBvcGVyYW5kMiwgKnJkZCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIERJVlNjYzoKLQkJewotCQkgIGludCBzaWduOwotCQkgIHVpbnQzMiByZXN1bHQsIHJlbWFpbmRlcjsKLQkJICBpbnQgYzAsIHkzMTsKLQotCQkgIGlmICghc3BhcmNsaXRlKSB7Ci0JCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgfQotCi0JCSAgc2lnbiA9ICgoc3JlZ3MtPnBzciAmIFBTUl9WKSAhPSAwKSBeICgoc3JlZ3MtPnBzciAmIFBTUl9OKSAhPSAwKTsKLQotCQkgIHJlbWFpbmRlciA9IChzcmVncy0+eSA8PCAxKSB8IChyczEgPj4gMzEpOwotCi0JCSAgLyogSWYgdHJ1ZSBzaWduIGlzIHBvc2l0aXZlLCBjYWxjdWxhdGUgcmVtYWluZGVyIC0gZGl2aXNvci4KLQkJICAgICBPdGhlcndpc2UsIGNhbGN1bGF0ZSByZW1haW5kZXIgKyBkaXZpc29yLiAgKi8KLQkJICBpZiAoc2lnbiA9PSAwKQotCQkgICAgb3BlcmFuZDIgPSB+b3BlcmFuZDIgKyAxOwotCQkgIHJlc3VsdCA9IHJlbWFpbmRlciArIG9wZXJhbmQyOwotCi0JCSAgLyogVGhlIFNQQVJDbGl0ZSBVc2VyJ3MgTWFudWFsIGlzIG5vdCBjbGVhciBvbiBob3cKLQkJICAgICB0aGUgImNhcnJ5IG91dCIgb2YgdGhlIGFib3ZlIEFMVSBvcGVyYXRpb24gaXMgdG8KLQkJICAgICBiZSBjYWxjdWxhdGVkLiAgRnJvbSB0cmlhbCBhbmQgZXJyb3IgdGVzdHMKLQkJICAgICBvbiB0aGUgdGhlIGNoaXAgaXRzZWxmLCBpdCBhcHBlYXJzIHRoYXQgaXQgaXMKLQkJICAgICBhIG5vcm1hbCBhZGRpdGlvbiBjYXJyeSwgYW5kIG5vdCBhIHN1YnRyYWN0aW9uIGJvcnJvdywKLQkJICAgICBldmVuIGluIGNhc2VzIHdoZXJlIHRoZSBkaXZpc29yIGlzIHN1YnRyYWN0ZWQKLQkJICAgICBmcm9tIHRoZSByZW1haW5kZXIuICBGSVhNRTogZ2V0IHRoZSB0cnVlIHN0b3J5Ci0JCSAgICAgZnJvbSBGdWppdHN1LiAqLwotCQkgIGMwID0gcmVzdWx0IDwgKHVpbnQzMikgcmVtYWluZGVyCi0JCSAgICAgICB8fCByZXN1bHQgPCAodWludDMyKSBvcGVyYW5kMjsKLQotCQkgIGlmIChyZXN1bHQgJiAweDgwMDAwMDAwKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfTjsKLQkJICBlbHNlCi0JCSAgICBzcmVncy0+cHNyICY9IH5QU1JfTjsKLQotCQkgIHkzMSA9IChzcmVncy0+eSAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDA7Ci0KLQkJICBpZiAocmVzdWx0ID09IDAgJiYgc2lnbiA9PSB5MzEpCi0JCSAgICBzcmVncy0+cHNyIHw9IFBTUl9aOwotCQkgIGVsc2UKLQkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9aOwotCi0JCSAgc2lnbiA9IChzaWduICYmICF5MzEpIHx8ICghYzAgJiYgKHNpZ24gfHwgIXkzMSkpOwotCi0JCSAgaWYgKHNpZ24gXiAocmVzdWx0ID4+IDMxKSkKLQkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX1Y7Ci0JCSAgZWxzZQotCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX1Y7Ci0KLQkJICBpZiAoIXNpZ24pCi0JCSAgICBzcmVncy0+cHNyIHw9IFBTUl9DOwotCQkgIGVsc2UKLQkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9DOwotCi0JCSAgc3JlZ3MtPnkgPSByZXN1bHQ7Ci0KLQkJICBpZiAocmQgIT0gMCkKLQkJICAgICpyZGQgPSAocnMxIDw8IDEpIHwgIXNpZ247Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU01VTDoKLQkJewotCQkgIG11bDY0IChyczEsIG9wZXJhbmQyLCAmc3JlZ3MtPnksIHJkZCwgMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU01VTENDOgotCQl7Ci0JCSAgdWludDMyIHJlc3VsdDsKLQotCQkgIG11bDY0IChyczEsIG9wZXJhbmQyLCAmc3JlZ3MtPnksICZyZXN1bHQsIDEpOwotCi0JCSAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCi0JCSAgICBzcmVncy0+cHNyIHw9IFBTUl9OOwotCQkgIGVsc2UKLQkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9OOwotCi0JCSAgaWYgKHJlc3VsdCA9PSAwKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfWjsKLQkJICBlbHNlCi0JCSAgICBzcmVncy0+cHNyICY9IH5QU1JfWjsKLQotCQkgICpyZGQgPSByZXN1bHQ7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgVU1VTDoKLQkJewotCQkgIG11bDY0IChyczEsIG9wZXJhbmQyLCAmc3JlZ3MtPnksIHJkZCwgMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgVU1VTENDOgotCQl7Ci0JCSAgdWludDMyIHJlc3VsdDsKLQotCQkgIG11bDY0IChyczEsIG9wZXJhbmQyLCAmc3JlZ3MtPnksICZyZXN1bHQsIDApOwotCi0JCSAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCi0JCSAgICBzcmVncy0+cHNyIHw9IFBTUl9OOwotCQkgIGVsc2UKLQkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9OOwotCi0JCSAgaWYgKHJlc3VsdCA9PSAwKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfWjsKLQkJICBlbHNlCi0JCSAgICBzcmVncy0+cHNyICY9IH5QU1JfWjsKLQotCQkgICpyZGQgPSByZXN1bHQ7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RJVjoKLQkJewotCQkgIGlmIChzcGFyY2xpdGUpIHsKLQkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJICB9Ci0KLQkJICBpZiAob3BlcmFuZDIgPT0gMCkgewotCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX0RJVjA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJICBkaXY2NCAoc3JlZ3MtPnksIHJzMSwgb3BlcmFuZDIsIHJkZCwgMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgU0RJVkNDOgotCQl7Ci0JCSAgdWludDMyIHJlc3VsdDsKLQotCQkgIGlmIChzcGFyY2xpdGUpIHsKLQkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJICB9Ci0KLQkJICBpZiAob3BlcmFuZDIgPT0gMCkgewotCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX0RJVjA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJICBkaXY2NCAoc3JlZ3MtPnksIHJzMSwgb3BlcmFuZDIsICZyZXN1bHQsIDEpOwotCi0JCSAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCi0JCSAgICBzcmVncy0+cHNyIHw9IFBTUl9OOwotCQkgIGVsc2UKLQkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9OOwotCi0JCSAgaWYgKHJlc3VsdCA9PSAwKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfWjsKLQkJICBlbHNlCi0JCSAgICBzcmVncy0+cHNyICY9IH5QU1JfWjsKLQotCQkgIC8qIEZJWE1FOiBzaG91bGQgc2V0IG92ZXJmbG93IGZsYWcgY29ycmVjdGx5LiAgKi8KLQkJICBzcmVncy0+cHNyICY9IH4oUFNSX0MgfCBQU1JfVik7Ci0KLQkJICAqcmRkID0gcmVzdWx0OwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFVESVY6Ci0JCXsKLQkJICBpZiAoc3BhcmNsaXRlKSB7Ci0JCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgfQotCi0JCSAgaWYgKG9wZXJhbmQyID09IDApIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9ESVYwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCSAgZGl2NjQgKHNyZWdzLT55LCByczEsIG9wZXJhbmQyLCByZGQsIDApOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFVESVZDQzoKLQkJewotCQkgIHVpbnQzMiByZXN1bHQ7Ci0KLQkJICBpZiAoc3BhcmNsaXRlKSB7Ci0JCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgfQotCi0JCSAgaWYgKG9wZXJhbmQyID09IDApIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9ESVYwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCSAgZGl2NjQgKHNyZWdzLT55LCByczEsIG9wZXJhbmQyLCAmcmVzdWx0LCAwKTsKLQotCQkgIGlmIChyZXN1bHQgJiAweDgwMDAwMDAwKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfTjsKLQkJICBlbHNlCi0JCSAgICBzcmVncy0+cHNyICY9IH5QU1JfTjsKLQotCQkgIGlmIChyZXN1bHQgPT0gMCkKLQkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX1o7Ci0JCSAgZWxzZQotCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX1o7Ci0KLQkJICAvKiBGSVhNRTogc2hvdWxkIHNldCBvdmVyZmxvdyBmbGFnIGNvcnJlY3RseS4gICovCi0JCSAgc3JlZ3MtPnBzciAmPSB+KFBTUl9DIHwgUFNSX1YpOwotCi0JCSAgKnJkZCA9IHJlc3VsdDsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBJWE5PUjoKLQkJKnJkZCA9IHJzMSBeIH5vcGVyYW5kMjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVhOT1JDQzoKLQkJKnJkZCA9IHJzMSBeIH5vcGVyYW5kMjsKLQkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVhPUjoKLQkJKnJkZCA9IHJzMSBeIG9wZXJhbmQyOwotCQlicmVhazsKLQkgICAgY2FzZSBJWE9SQ0M6Ci0JCSpyZGQgPSByczEgXiBvcGVyYW5kMjsKLQkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSU9SOgotCQkqcmRkID0gcnMxIHwgb3BlcmFuZDI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIElPUkNDOgotCQkqcmRkID0gcnMxIHwgb3BlcmFuZDI7Ci0JCWxvZ19jYygqcmRkLCBzcmVncyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIElPUk46Ci0JCSpyZGQgPSByczEgfCB+b3BlcmFuZDI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIElPUk5DQzoKLQkJKnJkZCA9IHJzMSB8IH5vcGVyYW5kMjsKLQkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSUFORE5DQzoKLQkJKnJkZCA9IHJzMSAmIH5vcGVyYW5kMjsKLQkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSUFORE46Ci0JCSpyZGQgPSByczEgJiB+b3BlcmFuZDI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIElBTkQ6Ci0JCSpyZGQgPSByczEgJiBvcGVyYW5kMjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSUFORENDOgotCQkqcmRkID0gcnMxICYgb3BlcmFuZDI7Ci0JCWxvZ19jYygqcmRkLCBzcmVncyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNVQjoKLQkJKnJkZCA9IHJzMSAtIG9wZXJhbmQyOwotCQlicmVhazsKLQkgICAgY2FzZSBTVUJDQzoKLQkJKnJkZCA9IHJzMSAtIG9wZXJhbmQyOwotCQlzcmVncy0+cHNyID0gc3ViX2NjKHNyZWdzLT5wc3IsIHJzMSwgb3BlcmFuZDIsICpyZGQpOwotCQlicmVhazsKLQkgICAgY2FzZSBTVUJYOgotCQkqcmRkID0gcnMxIC0gb3BlcmFuZDIgLSAoKHNyZWdzLT5wc3IgPj4gMjApICYgMSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNVQlhDQzoKLQkJKnJkZCA9IHJzMSAtIG9wZXJhbmQyIC0gKChzcmVncy0+cHNyID4+IDIwKSAmIDEpOwotCQlzcmVncy0+cHNyID0gc3ViX2NjKHNyZWdzLT5wc3IsIHJzMSwgb3BlcmFuZDIsICpyZGQpOwotCQlicmVhazsKLQkgICAgY2FzZSBBREQ6Ci0JCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQUREQ0M6Ci0JCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKLQkJc3JlZ3MtPnBzciA9IGFkZF9jYyhzcmVncy0+cHNyLCByczEsIG9wZXJhbmQyLCAqcmRkKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQUREWDoKLQkJKnJkZCA9IHJzMSArIG9wZXJhbmQyICsgKChzcmVncy0+cHNyID4+IDIwKSAmIDEpOwotCQlicmVhazsKLQkgICAgY2FzZSBBRERYQ0M6Ci0JCSpyZGQgPSByczEgKyBvcGVyYW5kMiArICgoc3JlZ3MtPnBzciA+PiAyMCkgJiAxKTsKLQkJc3JlZ3MtPnBzciA9IGFkZF9jYyhzcmVncy0+cHNyLCByczEsIG9wZXJhbmQyLCAqcmRkKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgVEFERENDOgotCQkqcmRkID0gcnMxICsgb3BlcmFuZDI7Ci0JCXNyZWdzLT5wc3IgPSBhZGRfY2Moc3JlZ3MtPnBzciwgcnMxLCBvcGVyYW5kMiwgKnJkZCk7Ci0JCWlmICgocnMxIHwgb3BlcmFuZDIpICYgMHgzKQotCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfVjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgVFNVQkNDOgotCQkqcmRkID0gcnMxIC0gb3BlcmFuZDI7Ci0JCXNyZWdzLT5wc3IgPSBzdWJfY2MgKHNyZWdzLT5wc3IsIHJzMSwgb3BlcmFuZDIsICpyZGQpOwotCQlpZiAoKHJzMSB8IG9wZXJhbmQyKSAmIDB4MykKLQkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX1Y7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFRBRERDQ1RWOgotCQkqcmRkID0gcnMxICsgb3BlcmFuZDI7Ci0JCXJlc3VsdCA9IGFkZF9jYygwLCByczEsIG9wZXJhbmQyLCAqcmRkKTsKLQkJaWYgKChyczEgfCBvcGVyYW5kMikgJiAweDMpCi0JCSAgICByZXN1bHQgfD0gUFNSX1Y7Ci0JCWlmIChyZXN1bHQgJiBQU1JfVikgewotCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1RBRzsKLQkJfSBlbHNlIHsKLQkJICAgIHNyZWdzLT5wc3IgPSAoc3JlZ3MtPnBzciAmIH5QU1JfQ0MpIHwgcmVzdWx0OwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFRTVUJDQ1RWOgotCQkqcmRkID0gcnMxIC0gb3BlcmFuZDI7Ci0JCXJlc3VsdCA9IGFkZF9jYyAoMCwgcnMxLCBvcGVyYW5kMiwgKnJkZCk7Ci0JCWlmICgocnMxIHwgb3BlcmFuZDIpICYgMHgzKQotCQkgICAgcmVzdWx0IHw9IFBTUl9WOwotCQlpZiAocmVzdWx0ICYgUFNSX1YpCi0JCSAgewotCQkgICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVEFHOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgICAgc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyICYgflBTUl9DQykgfCByZXN1bHQ7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgY2FzZSBTTEw6Ci0JCSpyZGQgPSByczEgPDwgKG9wZXJhbmQyICYgMHgxZik7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNSTDoKLQkJKnJkZCA9IHJzMSA+PiAob3BlcmFuZDIgJiAweDFmKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU1JBOgotCQkqcmRkID0gKChpbnQpIHJzMSkgPj4gKG9wZXJhbmQyICYgMHgxZik7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEZMVVNIOgotCQlpZiAoaWZ0KSBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNBVkU6Ci0JCW5ld19jd3AgPSAoKHNyZWdzLT5wc3IgJiBQU1JfQ1dQKSAtIDEpICYgUFNSX0NXUDsKLQkJaWYgKHNyZWdzLT53aW0gJiAoMSA8PCBuZXdfY3dwKSkgewotCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1dPRkw7Ci0JCSAgICBicmVhazsKLQkJfQotCQlpZiAocmQgPiA3KQotCQkgICAgcmRkID0gJihzcmVncy0+clsoKG5ld19jd3AgPDwgNCkgKyByZCkgJiAweDdmXSk7Ci0JCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKLQkJc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyICYgflBTUl9DV1ApIHwgbmV3X2N3cDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUkVTVE9SRToKLQotCQluZXdfY3dwID0gKChzcmVncy0+cHNyICYgUFNSX0NXUCkgKyAxKSAmIFBTUl9DV1A7Ci0JCWlmIChzcmVncy0+d2ltICYgKDEgPDwgbmV3X2N3cCkpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9XVUZMOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaWYgKHJkID4gNykKLQkJICAgIHJkZCA9ICYoc3JlZ3MtPnJbKChuZXdfY3dwIDw8IDQpICsgcmQpICYgMHg3Zl0pOwotCQkqcmRkID0gcnMxICsgb3BlcmFuZDI7Ci0JCXNyZWdzLT5wc3IgPSAoc3JlZ3MtPnBzciAmIH5QU1JfQ1dQKSB8IG5ld19jd3A7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFJEUFNSOgotCQlpZiAoIShzcmVncy0+cHNyICYgUFNSX1MpKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfUFJJVkk7Ci0JCSAgICBicmVhazsKLQkJfQotCQkqcmRkID0gc3JlZ3MtPnBzcjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUkRZOgotICAgICAgICAgICAgICAgIGlmICghc3BhcmNsaXRlKQotICAgICAgICAgICAgICAgICAgICAqcmRkID0gc3JlZ3MtPnk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByczFfaXNfYXNyID0gKHNyZWdzLT5pbnN0ID4+IDE0KSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggMCA9PSByczFfaXNfYXNyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICpyZGQgPSBzcmVncy0+eTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIDE3ID09IHJzMV9pc19hc3IgKQotICAgICAgICAgICAgICAgICAgICAgICAgKnJkZCA9IHNyZWdzLT5hc3IxNzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgUkRXSU06Ci0JCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCSpyZGQgPSBzcmVncy0+d2ltOwotCQlicmVhazsKLQkgICAgY2FzZSBSRFRCUjoKLQkJaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgewotCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1BSSVZJOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJKnJkZCA9IHNyZWdzLT50YnI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdSUFNSOgotCQlpZiAoKHNyZWdzLT5wc3IgJiAweDFmKSA+IDcpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCXNyZWdzLT5wc3IgPSAocnMxIF4gb3BlcmFuZDIpICYgMHgwMGYwM2ZmZjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV1JXSU06Ci0JCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCXNyZWdzLT53aW0gPSAocnMxIF4gb3BlcmFuZDIpICYgMHgwZmY7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdSVEJSOgotCQlpZiAoIShzcmVncy0+cHNyICYgUFNSX1MpKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfUFJJVkk7Ci0JCSAgICBicmVhazsKLQkJfQotCQlzcmVncy0+dGJyID0gKHNyZWdzLT50YnIgJiAweDAwMDAwZmYwKSB8Ci0JCSAgICAoKHJzMSBeIG9wZXJhbmQyKSAmIDB4ZmZmZmYwMDApOwotCQlicmVhazsKLQkgICAgY2FzZSBXUlk6Ci0gICAgICAgICAgICAgICAgaWYgKCFzcGFyY2xpdGUpCi0gICAgICAgICAgICAgICAgICAgIHNyZWdzLT55ID0gKHJzMSBeIG9wZXJhbmQyKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHJkICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyZWdzLT55ID0gKHJzMSBeIG9wZXJhbmQyKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIDE3ID09IHJkICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyZWdzLT5hc3IxNyA9IChyczEgXiBvcGVyYW5kMik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCWJyZWFrOwotCSAgICBjYXNlIEpNUEw6Ci0KLSNpZmRlZiBTVEFUCi0JCXNyZWdzLT5uYnJhbmNoKys7Ci0jZW5kaWYKLQkJc3JlZ3MtPmljbnQgPSBUX0pNUEw7CS8qIEpNUEwgdGFrZXMgdHdvIGN5Y2xlcyAqLwotCQlpZiAocnMxICYgMHgzKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7Ci0JCSAgICBicmVhazsKLQkJfQotCQkqcmRkID0gc3JlZ3MtPnBjOwotCQlucGMgPSByczEgKyBvcGVyYW5kMjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUkVUVDoKLQkJYWRkcmVzcyA9IHJzMSArIG9wZXJhbmQyOwotCQluZXdfY3dwID0gKChzcmVncy0+cHNyICYgUFNSX0NXUCkgKyAxKSAmIFBTUl9DV1A7Ci0JCXNyZWdzLT5pY250ID0gVF9SRVRUOwkvKiBSRVRUIHRha2VzIHR3byBjeWNsZXMgKi8KLQkJaWYgKHNyZWdzLT5wc3IgJiBQU1JfRVQpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmIChzcmVncy0+d2ltICYgKDEgPDwgbmV3X2N3cCkpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9XVUZMOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaWYgKGFkZHJlc3MgJiAweDMpIHsKLQkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCXNyZWdzLT5wc3IgPSAoc3JlZ3MtPnBzciAmIH5QU1JfQ1dQKSB8IG5ld19jd3AgfCBQU1JfRVQ7Ci0JCXNyZWdzLT5wc3IgPQotCQkgICAgKHNyZWdzLT5wc3IgJiB+UFNSX1MpIHwgKChzcmVncy0+cHNyICYgUFNSX1BTKSA8PCAxKTsKLQkJbnBjID0gYWRkcmVzczsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBTQ0FOOgotCQl7Ci0JCSAgdWludDMyIHJlc3VsdCwgbWFzazsKLQkJICBpbnQgaTsKLQotCQkgIGlmICghc3BhcmNsaXRlKSB7Ci0JCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgfQotCQkgIG1hc2sgPSAob3BlcmFuZDIgJiAweDgwMDAwMDAwKSB8IChvcGVyYW5kMiA+PiAxKTsKLQkJICByZXN1bHQgPSByczEgXiBtYXNrOwotCi0JCSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJICAgIGlmIChyZXN1bHQgJiAweDgwMDAwMDAwKQotCQkgICAgICBicmVhazsKLQkJICAgIHJlc3VsdCA8PD0gMTsKLQkJICB9Ci0KLQkJICAqcmRkID0gaSA9PSAzMiA/IDYzIDogaTsKLQkJfQotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzoJCQkvKiBMb2FkL3N0b3JlIGluc3RydWN0aW9ucyAqLwotCi0JYWRkcmVzcyA9IHJzMSArIG9wZXJhbmQyOwotCi0JaWYgKHNyZWdzLT5wc3IgJiBQU1JfUykKLQkgICAgYXNpID0gMTE7Ci0JIGVsc2UKLQkgICAgYXNpID0gMTA7Ci0KLQlpZiAob3AzICYgNCkgewotCSAgICBzcmVncy0+aWNudCA9IFRfU1Q7CS8qIFNldCBzdG9yZSBpbnN0cnVjdGlvbiBjb3VudCAqLwotI2lmZGVmIFNUQVQKLQkgICAgc3JlZ3MtPm5zdG9yZSsrOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkgICAgc3JlZ3MtPmljbnQgPSBUX0xEOwkvKiBTZXQgbG9hZCBpbnN0cnVjdGlvbiBjb3VudCAqLwotI2lmZGVmIFNUQVQKLQkgICAgc3JlZ3MtPm5sb2FkKys7Ci0jZW5kaWYKLQl9Ci0KLQkvKiBEZWNvZGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KLQotCXN3aXRjaCAob3AzKSB7Ci0JY2FzZSBMRERBOgotCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOwotCWNhc2UgTEREOgotCSAgICBpZiAoYWRkcmVzcyAmIDB4NykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChyZCAmIDEpIHsKLQkJcmQgJj0gMHgxZTsKLQkJaWYgKHJkID4gNykKLQkJICAgIHJkZCA9ICYoc3JlZ3MtPnJbKGN3cCArIHJkKSAmIDB4N2ZdKTsKLQkJZWxzZQotCQkgICAgcmRkID0gJihzcmVncy0+Z1tyZF0pOwotCSAgICB9Ci0JICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsIGRkYXRhLCAzLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3cyAqIDI7Ci0JICAgIHNyZWdzLT5pY250ID0gVF9MREQ7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCSAgICB9IGVsc2UgewotCQlyZGRbMF0gPSBkZGF0YVswXTsKLQkJcmRkWzFdID0gZGRhdGFbMV07Ci0jaWZkZWYgU1RBVAotCQlzcmVncy0+bmxvYWQrKzsJLyogRG91YmxlIGxvYWQgY291bnRzIHR3aWNlICovCi0jZW5kaWYKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgTERBOgotCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOwotCWNhc2UgTEQ6Ci0JICAgIGlmIChhZGRyZXNzICYgMHgzKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbWV4YyA9IG1lbW9yeV9yZWFkKGFzaSwgYWRkcmVzcywgJmRhdGEsIDIsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBpZiAobWV4YykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKLQkgICAgfSBlbHNlIHsKLQkJKnJkZCA9IGRhdGE7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBMRFNUVUJBOgotCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOwotCWNhc2UgTERTVFVCOgotCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMCwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIHNyZWdzLT5pY250ID0gVF9MRFNUOwotCSAgICBpZiAobWV4YykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgKnJkZCA9IGRhdGE7Ci0JICAgIGRhdGEgPSAweDBmZjsKLQkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsICZkYXRhLCAwLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3czsKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JICAgIH0KLSNpZmRlZiBTVEFUCi0JICAgIHNyZWdzLT5ubG9hZCsrOwotI2VuZGlmCi0JICAgIGJyZWFrOwotCWNhc2UgTERTQkE6Ci0JY2FzZSBMRFVCQToKLQkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKLQljYXNlIExEU0I6Ci0JY2FzZSBMRFVCOgotCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMCwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoKG9wMyA9PSBMRFNCKSAmJiAoZGF0YSAmIDB4ODApKQotCQlkYXRhIHw9IDB4ZmZmZmZmMDA7Ci0JICAgICpyZGQgPSBkYXRhOwotCSAgICBicmVhazsKLQljYXNlIExEU0hBOgotCWNhc2UgTERVSEE6Ci0JICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7Ci0JY2FzZSBMRFNIOgotCWNhc2UgTERVSDoKLQkgICAgaWYgKGFkZHJlc3MgJiAweDEpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOwotCQlicmVhazsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMSwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoKG9wMyA9PSBMRFNIKSAmJiAoZGF0YSAmIDB4ODAwMCkpCi0JCWRhdGEgfD0gMHhmZmZmMDAwMDsKLQkgICAgKnJkZCA9IGRhdGE7Ci0JICAgIGJyZWFrOwotCWNhc2UgTERGOgotCSAgICBpZiAoISgoc3JlZ3MtPnBzciAmIFBTUl9FRikgJiYgRlBfUFJFUykpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0ZQRElTOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoYWRkcmVzcyAmIDB4MykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChlYmFzZS5zaW10aW1lIDwgc3JlZ3MtPmZ0aW1lKSB7Ci0JCWlmICgoc3JlZ3MtPmZyZCA9PSByZCkgfHwgKHNyZWdzLT5mcnMxID09IHJkKSB8fAotCQkgICAgKHNyZWdzLT5mcnMyID09IHJkKSkKLQkJICAgIHNyZWdzLT5maG9sZCArPSAoc3JlZ3MtPmZ0aW1lIC0gZWJhc2Uuc2ltdGltZSk7Ci0JICAgIH0KLQkgICAgbWV4YyA9IG1lbW9yeV9yZWFkKGFzaSwgYWRkcmVzcywgJmRhdGEsIDIsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBzcmVncy0+ZmxyZCA9IHJkOwotCSAgICBzcmVncy0+bHRpbWUgPSBlYmFzZS5zaW10aW1lICsgc3JlZ3MtPmljbnQgKyBGTFNUSE9MRCArCi0JCXNyZWdzLT5ob2xkICsgc3JlZ3MtPmZob2xkOwotCSAgICBpZiAobWV4YykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKLQkgICAgfSBlbHNlIHsKLQkJc3JlZ3MtPmZzW3JkXSA9ICooKGZsb2F0MzIgKikgJiBkYXRhKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIExEREY6Ci0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChhZGRyZXNzICYgMHg3KSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKLQkJaWYgKCgoc3JlZ3MtPmZyZCA+PiAxKSA9PSAocmQgPj4gMSkpIHx8Ci0JCSAgICAoKHNyZWdzLT5mcnMxID4+IDEpID09IChyZCA+PiAxKSkgfHwKLQkJICAgICgoc3JlZ3MtPmZyczIgPj4gMSkgPT0gKHJkID4+IDEpKSkKLQkJICAgIHNyZWdzLT5maG9sZCArPSAoc3JlZ3MtPmZ0aW1lIC0gZWJhc2Uuc2ltdGltZSk7Ci0JICAgIH0KLQkgICAgbWV4YyA9IG1lbW9yeV9yZWFkKGFzaSwgYWRkcmVzcywgZGRhdGEsIDMsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzICogMjsKLQkgICAgc3JlZ3MtPmljbnQgPSBUX0xERDsKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JICAgIH0gZWxzZSB7Ci0JCXJkICY9IDB4MUU7Ci0JCXNyZWdzLT5mbHJkID0gcmQ7Ci0JCXNyZWdzLT5mc1tyZF0gPSAqKChmbG9hdDMyICopICYgZGRhdGFbMF0pOwotI2lmZGVmIFNUQVQKLQkJc3JlZ3MtPm5sb2FkKys7CS8qIERvdWJsZSBsb2FkIGNvdW50cyB0d2ljZSAqLwotI2VuZGlmCi0JCXNyZWdzLT5mc1tyZCArIDFdID0gKigoZmxvYXQzMiAqKSAmIGRkYXRhWzFdKTsKLQkJc3JlZ3MtPmx0aW1lID0gZWJhc2Uuc2ltdGltZSArIHNyZWdzLT5pY250ICsgRkxTVEhPTEQgKwotCQkJICAgICAgIHNyZWdzLT5ob2xkICsgc3JlZ3MtPmZob2xkOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgTERGU1I6Ci0JICAgIGlmIChlYmFzZS5zaW10aW1lIDwgc3JlZ3MtPmZ0aW1lKSB7Ci0JCXNyZWdzLT5maG9sZCArPSAoc3JlZ3MtPmZ0aW1lIC0gZWJhc2Uuc2ltdGltZSk7Ci0JICAgIH0KLQkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGFkZHJlc3MgJiAweDMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOwotCQlicmVhazsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMiwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCSAgICB9IGVsc2UgewotCQlzcmVncy0+ZnNyID0KLQkJICAgIChzcmVncy0+ZnNyICYgMHg3RkYwMDApIHwgKGRhdGEgJiB+MHg3RkYwMDApOwotCQlzZXRfZnNyKHNyZWdzLT5mc3IpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgU1RGU1I6Ci0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChhZGRyZXNzICYgMHgzKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKLQkJc3JlZ3MtPmZob2xkICs9IChzcmVncy0+ZnRpbWUgLSBlYmFzZS5zaW10aW1lKTsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgJnNyZWdzLT5mc3IsIDIsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBpZiAobWV4YykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgU1RBOgotCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOwotCWNhc2UgU1Q6Ci0JICAgIGlmIChhZGRyZXNzICYgMHgzKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsIHJkZCwgMiwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgU1RCQToKLQkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKLQljYXNlIFNUQjoKLQkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsIHJkZCwgMCwgJndzKTsKLQkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7Ci0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgU1REQToKLQkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKLQljYXNlIFNURDoKLQkgICAgaWYgKGFkZHJlc3MgJiAweDcpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAocmQgJiAxKSB7Ci0JCXJkICY9IDB4MWU7Ci0JCWlmIChyZCA+IDcpCi0JCSAgICByZGQgPSAmKHNyZWdzLT5yWyhjd3AgKyByZCkgJiAweDdmXSk7Ci0JCWVsc2UKLQkJICAgIHJkZCA9ICYoc3JlZ3MtPmdbcmRdKTsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgcmRkLCAzLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3czsKLQkgICAgc3JlZ3MtPmljbnQgPSBUX1NURDsKLSNpZmRlZiBTVEFUCi0JICAgIHNyZWdzLT5uc3RvcmUrKzsJLyogRG91YmxlIHN0b3JlIGNvdW50cyB0d2ljZSAqLwotI2VuZGlmCi0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIFNUREZROgotCSAgICBpZiAoKHNyZWdzLT5wc3IgJiAweDFmKSA+IDcpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoISgoc3JlZ3MtPnBzciAmIFBTUl9FRikgJiYgRlBfUFJFUykpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0ZQRElTOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoYWRkcmVzcyAmIDB4NykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmICghKHNyZWdzLT5mc3IgJiBGU1JfUU5FKSkgewotCQlzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiB+RlNSX1RUKSB8IEZQX1NFUV9FUlI7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHJkZCA9ICYoc3JlZ3MtPmZwcVswXSk7Ci0JICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCByZGQsIDMsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBzcmVncy0+aWNudCA9IFRfU1REOwotI2lmZGVmIFNUQVQKLQkgICAgc3JlZ3MtPm5zdG9yZSsrOwkvKiBEb3VibGUgc3RvcmUgY291bnRzIHR3aWNlICovCi0jZW5kaWYKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JCWJyZWFrOwotCSAgICB9IGVsc2UgewotCQlzcmVncy0+ZnNyICY9IH5GU1JfUU5FOwotCQlzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYRV9NT0RFOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgU1RIQToKLQkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKLQljYXNlIFNUSDoKLQkgICAgaWYgKGFkZHJlc3MgJiAweDEpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOwotCQlicmVhazsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgcmRkLCAxLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3czsKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBTVEY6Ci0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChhZGRyZXNzICYgMHgzKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKLQkJaWYgKHNyZWdzLT5mcmQgPT0gcmQpCi0JCSAgICBzcmVncy0+ZmhvbGQgKz0gKHNyZWdzLT5mdGltZSAtIGViYXNlLnNpbXRpbWUpOwotCSAgICB9Ci0JICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCAmc3JlZ3MtPmZzaVtyZF0sIDIsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBpZiAobWV4YykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIFNUREY6Ci0JICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChhZGRyZXNzICYgMHg3KSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgcmQgJj0gMHgxRTsKLQkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKLQkJaWYgKChzcmVncy0+ZnJkID09IHJkKSB8fCAoc3JlZ3MtPmZyZCArIDEgPT0gcmQpKQotCQkgICAgc3JlZ3MtPmZob2xkICs9IChzcmVncy0+ZnRpbWUgLSBlYmFzZS5zaW10aW1lKTsKLQkgICAgfQotCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgJnNyZWdzLT5mc2lbcmRdLCAzLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3czsKLQkgICAgc3JlZ3MtPmljbnQgPSBUX1NURDsKLSNpZmRlZiBTVEFUCi0JICAgIHNyZWdzLT5uc3RvcmUrKzsJLyogRG91YmxlIHN0b3JlIGNvdW50cyB0d2ljZSAqLwotI2VuZGlmCi0JICAgIGlmIChtZXhjKSB7Ci0JCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgU1dBUEE6Ci0JICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7Ci0JY2FzZSBTV0FQOgotCSAgICBpZiAoYWRkcmVzcyAmIDB4MykgewotCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsICZkYXRhLCAyLCAmd3MpOwotCSAgICBzcmVncy0+aG9sZCArPSB3czsKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCByZGQsIDIsICZ3cyk7Ci0JICAgIHNyZWdzLT5ob2xkICs9IHdzOwotCSAgICBzcmVncy0+aWNudCA9IFRfTERTVDsKLQkgICAgaWYgKG1leGMpIHsKLQkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7Ci0JCWJyZWFrOwotCSAgICB9IGVsc2UKLQkJKnJkZCA9IGRhdGE7Ci0jaWZkZWYgU1RBVAotCSAgICBzcmVncy0+bmxvYWQrKzsKLSNlbmRpZgotCSAgICBicmVhazsKLQotCi0JZGVmYXVsdDoKLQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotCSAgICBicmVhazsKLQl9Ci0KLSNpZmRlZiBMT0FEX0RFTAotCi0JaWYgKCEob3AzICYgNCkpIHsKLQkgICAgc3JlZ3MtPmlsZHRpbWUgPSBlYmFzZS5zaW10aW1lICsgc3JlZ3MtPmhvbGQgKyBzcmVncy0+aWNudDsKLQkgICAgc3JlZ3MtPmlsZHJlZyA9IHJkOwotCSAgICBpZiAoKG9wMyB8IDB4MTApID09IDB4MTMpCi0JCXNyZWdzLT5pbGRyZWcgfD0gMTsJLyogRG91YmxlIGxvYWQsIG9kZCByZWdpc3RlciBsb2FkZWQKLQkJCQkJICogbGFzdCAqLwotCX0KLSNlbmRpZgotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7Ci0JYnJlYWs7Ci0gICAgfQotICAgIHNyZWdzLT5nWzBdID0gMDsKLSAgICBpZiAoIXNyZWdzLT50cmFwKSB7Ci0Jc3JlZ3MtPnBjID0gcGM7Ci0Jc3JlZ3MtPm5wYyA9IG5wYzsKLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotI2RlZmluZSBUX0ZBQlNzCQkyCi0jZGVmaW5lIFRfRkFERHMJCTQKLSNkZWZpbmUgVF9GQUREZAkJNAotI2RlZmluZSBUX0ZDTVBzCQk0Ci0jZGVmaW5lIFRfRkNNUGQJCTQKLSNkZWZpbmUgVF9GRElWcwkJMjAKLSNkZWZpbmUgVF9GRElWZAkJMzUKLSNkZWZpbmUgVF9GTU9WcwkJMgotI2RlZmluZSBUX0ZNVUxzCQk1Ci0jZGVmaW5lIFRfRk1VTGQJCTkKLSNkZWZpbmUgVF9GTkVHcwkJMgotI2RlZmluZSBUX0ZTUVJUcwkzNwotI2RlZmluZSBUX0ZTUVJUZAk2NQotI2RlZmluZSBUX0ZTVUJzCQk0Ci0jZGVmaW5lIFRfRlNVQmQJCTQKLSNkZWZpbmUgVF9GZFRPaQkJNwotI2RlZmluZSBUX0ZkVE9zCQkzCi0jZGVmaW5lIFRfRmlUT3MJCTYKLSNkZWZpbmUgVF9GaVRPZAkJNgotI2RlZmluZSBUX0ZzVE9pCQk2Ci0jZGVmaW5lIFRfRnNUT2QJCTIKLQotI2RlZmluZSBGQUJTcwkweDA5Ci0jZGVmaW5lIEZBRERzCTB4NDEKLSNkZWZpbmUgRkFERGQJMHg0MgotI2RlZmluZSBGQ01QcwkweDUxCi0jZGVmaW5lIEZDTVBkCTB4NTIKLSNkZWZpbmUgRkNNUEVzCTB4NTUKLSNkZWZpbmUgRkNNUEVkCTB4NTYKLSNkZWZpbmUgRkRJVnMJMHg0RAotI2RlZmluZSBGRElWZAkweDRFCi0jZGVmaW5lIEZNT1ZzCTB4MDEKLSNkZWZpbmUgRk1VTHMJMHg0OQotI2RlZmluZSBGTVVMZAkweDRBCi0jZGVmaW5lIEZORUdzCTB4MDUKLSNkZWZpbmUgRlNRUlRzCTB4MjkKLSNkZWZpbmUgRlNRUlRkCTB4MkEKLSNkZWZpbmUgRlNVQnMJMHg0NQotI2RlZmluZSBGU1VCZAkweDQ2Ci0jZGVmaW5lIEZkVE9pCTB4RDIKLSNkZWZpbmUgRmRUT3MJMHhDNgotI2RlZmluZSBGaVRPcwkweEM0Ci0jZGVmaW5lIEZpVE9kCTB4QzgKLSNkZWZpbmUgRnNUT2kJMHhEMQotI2RlZmluZSBGc1RPZAkweEM5Ci0KLQotc3RhdGljIGludAotZnBleGVjKG9wMywgcmQsIHJzMSwgcnMyLCBzcmVncykKLSAgICB1aW50MzIgICAgICAgICAgb3AzLCByZCwgcnMxLCByczI7Ci0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotICAgIHVpbnQzMiAgICAgICAgICBvcGYsIHRlbSwgYWNjZXg7Ci0gICAgaW50MzIgICAgICAgICAgIGZjYzsKLSAgICB1aW50MzIgICAgICAgICAgbGRhZGo7Ci0KLSAgICBpZiAoc3JlZ3MtPmZwc3RhdGUgPT0gRlBfRVhDX01PREUpIHsKLQlzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiB+RlNSX1RUKSB8IEZQX1NFUV9FUlI7Ci0Jc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgaWYgKHNyZWdzLT5mcHN0YXRlID09IEZQX0VYQ19QRSkgewotCXNyZWdzLT5mcHN0YXRlID0gRlBfRVhDX01PREU7Ci0JcmV0dXJuIChUUkFQX0ZQRVhDKTsKLSAgICB9Ci0gICAgb3BmID0gKHNyZWdzLT5pbnN0ID4+IDUpICYgMHgxZmY7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBGUG9wIGluIHRoZSBwaXBlLiBJZiBzbywgaGFsdCB1bnRpbCBpdCBpcwotICAgICAqIGZpbmlzaGVkIGJ5IGluY3JlbWVudGluZyBmaG9sZCB3aXRoIHRoZSByZW1haW5pbmcgZXhlY3V0aW9uIHRpbWUKLSAgICAgKi8KLQotICAgIGlmIChlYmFzZS5zaW10aW1lIDwgc3JlZ3MtPmZ0aW1lKSB7Ci0Jc3JlZ3MtPmZob2xkID0gKHNyZWdzLT5mdGltZSAtIGViYXNlLnNpbXRpbWUpOwotICAgIH0gZWxzZSB7Ci0Jc3JlZ3MtPmZob2xkID0gMDsKLQotCS8qIENoZWNrIGxvYWQgZGVwZW5kZW5jaWVzLiAqLwotCi0JaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+bHRpbWUpIHsKLQotCSAgICAvKiBEb24ndCBjaGVjayByczEgaWYgc2luZ2xlIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zICovCi0KLQkgICAgaWYgKCgob3BmID4+IDYpID09IDApIHx8ICgob3BmID4+IDYpID09IDMpKQotCQlyczEgPSAzMjsKLQotCSAgICAvKiBBZGp1c3QgZm9yIGRvdWJsZSBmbG9hdHMgKi8KLQotCSAgICBsZGFkaiA9IG9wZiAmIDE7Ci0JICAgIGlmICghKCgoc3JlZ3MtPmZscmQgLSByczEpID4+IGxkYWRqKSAmJiAoKHNyZWdzLT5mbHJkIC0gcnMyKSA+PiBsZGFkaikpKQotCQlzcmVncy0+ZmhvbGQrKzsKLQl9Ci0gICAgfQotCi0gICAgc3JlZ3MtPmZpbnN0Kys7Ci0KLSAgICBzcmVncy0+ZnJzMSA9IHJzMTsJCS8qIFN0b3JlIHNyYyBhbmQgZHN0IGZvciBkZXBlbmRlY3kgY2hlY2sgKi8KLSAgICBzcmVncy0+ZnJzMiA9IHJzMjsKLSAgICBzcmVncy0+ZnJkID0gcmQ7Ci0KLSAgICBzcmVncy0+ZnRpbWUgPSBlYmFzZS5zaW10aW1lICsgc3JlZ3MtPmhvbGQgKyBzcmVncy0+ZmhvbGQ7Ci0KLSAgICAvKiBTUEFSQyBpcyBiaWctZW5kaWFuIC0gc3dhcCBkb3VibGUgZmxvYXRzIGlmIGhvc3QgaXMgbGl0dGxlLWVuZGlhbiAqLwotICAgIC8qIFRoaXMgaXMgdWdseSAtIEkga25vdyAuLi4gKi8KLQotICAgIC8qIEZJWE1FOiBzaG91bGQgdXNlIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSKQotICAgICAgIGJ1dCB3aGF0IGFib3V0IG1hY2hpbmVzIHdoZXJlIGZsb2F0IHZhbHVlcyBhcmUgZGlmZmVyZW50IGVuZGlhbm5lc3MKLSAgICAgICBmcm9tIGludGVnZXIgdmFsdWVzPyAqLwotCi0jaWZkZWYgSE9TVF9MSVRUTEVfRU5ESUFOX0ZMT0FUCi0gICAgcnMxICY9IDB4MWY7Ci0gICAgc3dpdGNoIChvcGYpIHsKLQljYXNlIEZBRERkOgotCWNhc2UgRkRJVmQ6Ci0JY2FzZSBGTVVMZDoKLQljYXNlIEZTUVJUZDoKLQljYXNlIEZTVUJkOgotICAgICAgICBjYXNlIEZDTVBkOgotICAgICAgICBjYXNlIEZDTVBFZDoKLQljYXNlIEZkVE9pOgotCWNhc2UgRmRUT3M6Ci0gICAgCSAgICBzcmVncy0+ZmRwW3JzMSB8IDFdID0gc3JlZ3MtPmZzW3JzMSAmIH4xXTsKLSAgICAJICAgIHNyZWdzLT5mZHBbcnMxICYgfjFdID0gc3JlZ3MtPmZzW3JzMSB8IDFdOwotICAgIAkgICAgc3JlZ3MtPmZkcFtyczIgfCAxXSA9IHNyZWdzLT5mc1tyczIgJiB+MV07Ci0gICAgCSAgICBzcmVncy0+ZmRwW3JzMiAmIH4xXSA9IHNyZWdzLT5mc1tyczIgfCAxXTsKLSAgICBkZWZhdWx0OgotICAgIH0KLSNlbmRpZgotCi0gICAgY2xlYXJfYWNjZXgoKTsKLQotICAgIHN3aXRjaCAob3BmKSB7Ci0gICAgY2FzZSBGQUJTczoKLQlzcmVncy0+ZnNbcmRdID0gZmFicyhzcmVncy0+ZnNbcnMyXSk7Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRkFCU3M7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZBRERzOgotCXNyZWdzLT5mc1tyZF0gPSBzcmVncy0+ZnNbcnMxXSArIHNyZWdzLT5mc1tyczJdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZBRERzOwotCWJyZWFrOwotICAgIGNhc2UgRkFERGQ6Ci0Jc3JlZ3MtPmZkW3JkID4+IDFdID0gc3JlZ3MtPmZkW3JzMSA+PiAxXSArIHNyZWdzLT5mZFtyczIgPj4gMV07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRkFERGQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSBGQ01QczoKLSAgICBjYXNlIEZDTVBFczoKLQlpZiAoc3JlZ3MtPmZzW3JzMV0gPT0gc3JlZ3MtPmZzW3JzMl0pCi0JICAgIGZjYyA9IDM7Ci0JZWxzZSBpZiAoc3JlZ3MtPmZzW3JzMV0gPCBzcmVncy0+ZnNbcnMyXSkKLQkgICAgZmNjID0gMjsKLQllbHNlIGlmIChzcmVncy0+ZnNbcnMxXSA+IHNyZWdzLT5mc1tyczJdKQotCSAgICBmY2MgPSAxOwotCWVsc2UKLQkgICAgZmNjID0gMDsKLQlzcmVncy0+ZnNyIHw9IDB4MEMwMDsKLQlzcmVncy0+ZnNyICY9IH4oZmNjIDw8IDEwKTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GQ01QczsKLQlzcmVncy0+ZnJkID0gMzI7CS8qIHJkIGlnbm9yZWQgKi8KLQlpZiAoKGZjYyA9PSAwKSAmJiAob3BmID09IEZDTVBFcykpIHsKLQkgICAgc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0JICAgIHNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH4weDFDMDAwKSB8ICgxIDw8IDE0KTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBGQ01QZDoKLSAgICBjYXNlIEZDTVBFZDoKLQlpZiAoc3JlZ3MtPmZkW3JzMSA+PiAxXSA9PSBzcmVncy0+ZmRbcnMyID4+IDFdKQotCSAgICBmY2MgPSAzOwotCWVsc2UgaWYgKHNyZWdzLT5mZFtyczEgPj4gMV0gPCBzcmVncy0+ZmRbcnMyID4+IDFdKQotCSAgICBmY2MgPSAyOwotCWVsc2UgaWYgKHNyZWdzLT5mZFtyczEgPj4gMV0gPiBzcmVncy0+ZmRbcnMyID4+IDFdKQotCSAgICBmY2MgPSAxOwotCWVsc2UKLQkgICAgZmNjID0gMDsKLQlzcmVncy0+ZnNyIHw9IDB4MEMwMDsKLQlzcmVncy0+ZnNyICY9IH4oZmNjIDw8IDEwKTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GQ01QZDsKLQlzcmVncy0+ZnJkID0gMzI7CS8qIHJkIGlnbm9yZWQgKi8KLQlpZiAoKGZjYyA9PSAwKSAmJiAob3BmID09IEZDTVBFZCkpIHsKLQkgICAgc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0JICAgIHNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfSUVFRTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBGRElWczoKLQlzcmVncy0+ZnNbcmRdID0gc3JlZ3MtPmZzW3JzMV0gLyBzcmVncy0+ZnNbcnMyXTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GRElWczsKLQlicmVhazsKLSAgICBjYXNlIEZESVZkOgotCXNyZWdzLT5mZFtyZCA+PiAxXSA9IHNyZWdzLT5mZFtyczEgPj4gMV0gLyBzcmVncy0+ZmRbcnMyID4+IDFdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZESVZkOwotCWJyZWFrOwotICAgIGNhc2UgRk1PVnM6Ci0Jc3JlZ3MtPmZzW3JkXSA9IHNyZWdzLT5mc1tyczJdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZNT1ZzOwotCXNyZWdzLT5mcnMxID0gMzI7CS8qIHJzMSBpZ25vcmVkICovCi0JYnJlYWs7Ci0gICAgY2FzZSBGTVVMczoKLQlzcmVncy0+ZnNbcmRdID0gc3JlZ3MtPmZzW3JzMV0gKiBzcmVncy0+ZnNbcnMyXTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GTVVMczsKLQlicmVhazsKLSAgICBjYXNlIEZNVUxkOgotCXNyZWdzLT5mZFtyZCA+PiAxXSA9IHNyZWdzLT5mZFtyczEgPj4gMV0gKiBzcmVncy0+ZmRbcnMyID4+IDFdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZNVUxkOwotCWJyZWFrOwotICAgIGNhc2UgRk5FR3M6Ci0Jc3JlZ3MtPmZzW3JkXSA9IC1zcmVncy0+ZnNbcnMyXTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GTkVHczsKLQlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLwotCWJyZWFrOwotICAgIGNhc2UgRlNRUlRzOgotCWlmIChzcmVncy0+ZnNbcnMyXSA8IDAuMCkgewotCSAgICBzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKLQkgICAgc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfkZTUl9UVCkgfCBGUF9JRUVFOwotCSAgICBzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiAweDFmKSB8IDB4MTA7Ci0JICAgIGJyZWFrOwotCX0KLQlzcmVncy0+ZnNbcmRdID0gc3FydChzcmVncy0+ZnNbcnMyXSk7Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRlNRUlRzOwotCXNyZWdzLT5mcnMxID0gMzI7CS8qIHJzMSBpZ25vcmVkICovCi0JYnJlYWs7Ci0gICAgY2FzZSBGU1FSVGQ6Ci0JaWYgKHNyZWdzLT5mZFtyczIgPj4gMV0gPCAwLjApIHsKLQkgICAgc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0JICAgIHNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfSUVFRTsKLQkgICAgc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgMHgxZikgfCAweDEwOwotCSAgICBicmVhazsKLQl9Ci0Jc3JlZ3MtPmZkW3JkID4+IDFdID0gc3FydChzcmVncy0+ZmRbcnMyID4+IDFdKTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GU1FSVGQ7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZTVUJzOgotCXNyZWdzLT5mc1tyZF0gPSBzcmVncy0+ZnNbcnMxXSAtIHNyZWdzLT5mc1tyczJdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZTVUJzOwotCWJyZWFrOwotICAgIGNhc2UgRlNVQmQ6Ci0Jc3JlZ3MtPmZkW3JkID4+IDFdID0gc3JlZ3MtPmZkW3JzMSA+PiAxXSAtIHNyZWdzLT5mZFtyczIgPj4gMV07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRlNVQmQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSBGZFRPaToKLQlzcmVncy0+ZnNpW3JkXSA9IChpbnQpIHNyZWdzLT5mZFtyczIgPj4gMV07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRmRUT2k7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZkVE9zOgotCXNyZWdzLT5mc1tyZF0gPSAoZmxvYXQzMikgc3JlZ3MtPmZkW3JzMiA+PiAxXTsKLQlzcmVncy0+ZnRpbWUgKz0gVF9GZFRPczsKLQlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLwotCWJyZWFrOwotICAgIGNhc2UgRmlUT3M6Ci0Jc3JlZ3MtPmZzW3JkXSA9IChmbG9hdDMyKSBzcmVncy0+ZnNpW3JzMl07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRmlUT3M7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZpVE9kOgotCXNyZWdzLT5mZFtyZCA+PiAxXSA9IChmbG9hdDY0KSBzcmVncy0+ZnNpW3JzMl07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRmlUT2Q7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZzVE9pOgotCXNyZWdzLT5mc2lbcmRdID0gKGludCkgc3JlZ3MtPmZzW3JzMl07Ci0Jc3JlZ3MtPmZ0aW1lICs9IFRfRnNUT2k7Ci0Jc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KLQlicmVhazsKLSAgICBjYXNlIEZzVE9kOgotCXNyZWdzLT5mZFtyZCA+PiAxXSA9IHNyZWdzLT5mc1tyczJdOwotCXNyZWdzLT5mdGltZSArPSBUX0ZzVE9kOwotCXNyZWdzLT5mcnMxID0gMzI7CS8qIHJzMSBpZ25vcmVkICovCi0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCXNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfVU5JTVA7Ci0Jc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0gICAgfQotCi0jaWZkZWYgRVJSSU5KCi0gICAgaWYgKGVycmZ0dCkgewotCXNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgKGVycmZ0dCA8PCAxNCk7Ci0Jc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7Ci0JaWYgKHNpc192ZXJib3NlKSBwcmludGYoIkluc2VydGVkIGZwdSBlcnJvciAlWFxuIixlcnJmdHQpOwotCWVycmZ0dCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhY2NleCA9IGdldF9hY2NleCgpOwotCi0jaWZkZWYgSE9TVF9MSVRUTEVfRU5ESUFOX0ZMT0FUCi0gICAgc3dpdGNoIChvcGYpIHsKLSAgICBjYXNlIEZBRERkOgotICAgIGNhc2UgRkRJVmQ6Ci0gICAgY2FzZSBGTVVMZDoKLSAgICBjYXNlIEZTUVJUZDoKLSAgICBjYXNlIEZTVUJkOgotICAgIGNhc2UgRmlUT2Q6Ci0gICAgY2FzZSBGc1RPZDoKLQlzcmVncy0+ZnNbcmQgJiB+MV0gPSBzcmVncy0+ZmRwW3JkIHwgMV07Ci0Jc3JlZ3MtPmZzW3JkIHwgMV0gPSBzcmVncy0+ZmRwW3JkICYgfjFdOwotICAgIGRlZmF1bHQ6Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKHNyZWdzLT5mcHN0YXRlID09IEZQX0VYQ19QRSkgewotCXNyZWdzLT5mcHFbMF0gPSBzcmVncy0+cGM7Ci0Jc3JlZ3MtPmZwcVsxXSA9IHNyZWdzLT5pbnN0OwotCXNyZWdzLT5mc3IgfD0gRlNSX1FORTsKLSAgICB9IGVsc2UgewotCXRlbSA9IChzcmVncy0+ZnNyID4+IDIzKSAmIDB4MWY7Ci0JaWYgKHRlbSAmIGFjY2V4KSB7Ci0JICAgIHNyZWdzLT5mcHN0YXRlID0gRlBfRVhDX1BFOwotCSAgICBzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiB+RlNSX1RUKSB8IEZQX0lFRUU7Ci0JICAgIHNyZWdzLT5mc3IgPSAoKHNyZWdzLT5mc3IgJiB+MHgxZikgfCBhY2NleCk7Ci0JfSBlbHNlIHsKLQkgICAgc3JlZ3MtPmZzciA9ICgoKChzcmVncy0+ZnNyID4+IDUpIHwgYWNjZXgpIDw8IDUpIHwgYWNjZXgpOwotCX0KLQlpZiAoc3JlZ3MtPmZwc3RhdGUgPT0gRlBfRVhDX1BFKSB7Ci0JICAgIHNyZWdzLT5mcHFbMF0gPSBzcmVncy0+cGM7Ci0JICAgIHNyZWdzLT5mcHFbMV0gPSBzcmVncy0+aW5zdDsKLQkgICAgc3JlZ3MtPmZzciB8PSBGU1JfUU5FOwotCX0KLSAgICB9Ci0gICAgY2xlYXJfYWNjZXgoKTsKLQotICAgIHJldHVybiAoMCk7Ci0KLQotfQotCi1zdGF0aWMgaW50Ci1jaGtfYXNpKHNyZWdzLCBhc2ksIG9wMykKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci0gICAgdWludDMyICphc2ksIG9wMzsKLQotewotICAgIGlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKLQlzcmVncy0+dHJhcCA9IFRSQVBfUFJJVkk7Ci0JcmV0dXJuICgwKTsKLSAgICB9IGVsc2UgaWYgKHNyZWdzLT5pbnN0ICYgSU5TVF9JKSB7Ci0Jc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOwotCXJldHVybiAoMCk7Ci0gICAgfSBlbHNlCi0JKmFzaSA9IChzcmVncy0+aW5zdCA+PiA1KSAmIDB4MGZmOwotICAgIHJldHVybigxKTsKLX0KLQotaW50Ci1leGVjdXRlX3RyYXAoc3JlZ3MpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotICAgIGludDMyICAgICAgICAgICBjd3A7Ci0KLSAgICBpZiAoc3JlZ3MtPnRyYXAgPT0gMjU2KSB7Ci0Jc3JlZ3MtPnBjID0gMDsKLQlzcmVncy0+bnBjID0gNDsKLQlzcmVncy0+dHJhcCA9IDA7Ci0gICAgfSBlbHNlIGlmIChzcmVncy0+dHJhcCA9PSAyNTcpIHsKLQkgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfSBlbHNlIHsKLQotCWlmICgoc3JlZ3MtPnBzciAmIFBTUl9FVCkgPT0gMCkKLQkgICAgcmV0dXJuIChFUlJPUik7Ci0KLQlzcmVncy0+dGJyID0gKHNyZWdzLT50YnIgJiAweGZmZmZmMDAwKSB8IChzcmVncy0+dHJhcCA8PCA0KTsKLQlzcmVncy0+dHJhcCA9IDA7Ci0Jc3JlZ3MtPnBzciAmPSB+UFNSX0VUOwotCXNyZWdzLT5wc3IgfD0gKChzcmVncy0+cHNyICYgUFNSX1MpID4+IDEpOwotCXNyZWdzLT5hbm51bCA9IDA7Ci0Jc3JlZ3MtPnBzciA9ICgoKHNyZWdzLT5wc3IgJiBQU1JfQ1dQKSAtIDEpICYgMHg3KSB8IChzcmVncy0+cHNyICYgflBTUl9DV1ApOwotCWN3cCA9ICgoc3JlZ3MtPnBzciAmIFBTUl9DV1ApIDw8IDQpOwotCXNyZWdzLT5yWyhjd3AgKyAxNykgJiAweDdmXSA9IHNyZWdzLT5wYzsKLQlzcmVncy0+clsoY3dwICsgMTgpICYgMHg3Zl0gPSBzcmVncy0+bnBjOwotCXNyZWdzLT5wc3IgfD0gUFNSX1M7Ci0Jc3JlZ3MtPnBjID0gc3JlZ3MtPnRicjsKLQlzcmVncy0+bnBjID0gc3JlZ3MtPnRiciArIDQ7Ci0KLSAgICAgICAgaWYgKCAwICE9ICgxICYgc3JlZ3MtPmFzcjE3KSApIHsKLSAgICAgICAgICAgIC8qIHNpbmdsZSB2ZWN0b3IgdHJhcHBpbmchICovCi0gICAgICAgICAgICBzcmVncy0+cGMgPSBzcmVncy0+dGJyICYgMHhmZmZmZjAwMDsKLSAgICAgICAgICAgIHNyZWdzLT5ucGMgPSBzcmVncy0+cGMgKyA0OwotICAgICAgICB9Ci0KLQkvKiBJbmNyZWFzZSBzaW11bGF0b3IgdGltZSAqLwotCXNyZWdzLT5pY250ID0gVFJBUF9DOwotCi0gICAgfQotCi0KLSAgICByZXR1cm4gKDApOwotCi19Ci0KLWV4dGVybiBzdHJ1Y3QgaXJxY2VsbCBpcnFhcnJbMTZdOwotCi1pbnQKLWNoZWNrX2ludGVycnVwdHMoc3JlZ3MpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotI2lmZGVmIEVSUklOSgotICAgIGlmIChlcnJ0dCkgewotCXNyZWdzLT50cmFwID0gZXJydHQ7Ci0JaWYgKHNpc192ZXJib3NlKSBwcmludGYoIkluc2VydGVkIGVycm9yIHRyYXAgMHglMDJYXG4iLGVycnR0KTsKLQllcnJ0dCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoKGV4dF9pcmwpICYmIChzcmVncy0+cHNyICYgUFNSX0VUKSAmJgotCSgoZXh0X2lybCA9PSAxNSkgfHwgKGV4dF9pcmwgPiAoaW50KSAoKHNyZWdzLT5wc3IgJiBQU1JfUElMKSA+PiA4KSkpKSB7Ci0JaWYgKHNyZWdzLT50cmFwID09IDApIHsKLQkgICAgc3JlZ3MtPnRyYXAgPSAxNiArIGV4dF9pcmw7Ci0JICAgIGlycWFycltleHRfaXJsICYgMHgwZl0uY2FsbGJhY2soaXJxYXJyW2V4dF9pcmwgJiAweDBmXS5hcmcpOwotCSAgICByZXR1cm4oMSk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXZvaWQKLWluaXRfcmVncyhzcmVncykKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci17Ci0gICAgc3JlZ3MtPnBjID0gMDsKLSAgICBzcmVncy0+bnBjID0gNDsKLSAgICBzcmVncy0+dHJhcCA9IDA7Ci0gICAgc3JlZ3MtPnBzciAmPSAweDAwZjAzZmRmOwotICAgIHNyZWdzLT5wc3IgfD0gMHgwODA7CS8qIFNldCBzdXBlcnZpc29yIGJpdCAqLwotICAgIHNyZWdzLT5icmVha3BvaW50ID0gMDsKLSAgICBzcmVncy0+YW5udWwgPSAwOwotICAgIHNyZWdzLT5mcHN0YXRlID0gRlBfRVhFX01PREU7Ci0gICAgc3JlZ3MtPmZwcW4gPSAwOwotICAgIHNyZWdzLT5mdGltZSA9IDA7Ci0gICAgc3JlZ3MtPmx0aW1lID0gMDsKLSAgICBzcmVncy0+ZXJyX21vZGUgPSAwOwotICAgIGV4dF9pcmwgPSAwOwotICAgIHNyZWdzLT5nWzBdID0gMDsKLSNpZmRlZiBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVQKLSAgICBzcmVncy0+ZmRwID0gKGZsb2F0MzIgKikgc3JlZ3MtPmZkOwotICAgIHNyZWdzLT5mc2kgPSAoaW50MzIgKikgc3JlZ3MtPmZzOwotI2Vsc2UKLSAgICBzcmVncy0+ZnMgPSAoZmxvYXQzMiAqKSBzcmVncy0+ZmQ7Ci0gICAgc3JlZ3MtPmZzaSA9IChpbnQzMiAqKSBzcmVncy0+ZmQ7Ci0jZW5kaWYKLSAgICBzcmVncy0+ZnNyID0gMDsKLSAgICBzcmVncy0+ZnB1X3ByZXMgPSAhbmZwOwotICAgIHNldF9mc3Ioc3JlZ3MtPmZzcik7Ci0gICAgc3JlZ3MtPmJwaGl0ID0gMDsKLSAgICBzcmVncy0+aWxkcmVnID0gMDsKLSAgICBzcmVncy0+aWxkdGltZSA9IDA7Ci0KLSAgICBzcmVncy0+eSA9IDA7Ci0gICAgc3JlZ3MtPmFzcjE3ID0gMDsKLQotICAgIHNyZWdzLT5yZXR0X2VyciA9IDA7Ci0gICAgc3JlZ3MtPmptcGx0aW1lID0gMDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9mbG9hdC5jIGIvc2ltL2VyYzMyL2Zsb2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmY0MWUuLjAwMDAwMDAKLS0tIGEvc2ltL2VyYzMyL2Zsb2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFNJUy4KLSAqCi0gKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvci4gQ29weXJpZ2h0IChDKSAxOTk1IEppcmkgR2Fpc2xlciwgRXVyb3BlYW4KLSAqIFNwYWNlIEFnZW5jeQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1Ci0gKiBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSBzaW11bGF0ZWQKLSAqIEZQVS4gSUVFRSB0cmFwIGhhbmRsaW5nIGlzIGRvbmUgYXMgZm9sbG93czogCi0gKiAxLiBJbiB0aGUgaG9zdCwgYWxsIElFRUUgdHJhcHMgYXJlIG1hc2tlZAotICogMi4gQWZ0ZXIgZWFjaCBzaW11bGF0ZWQgRlBVIGluc3RydWN0aW9uLCBjaGVjayBpZiBhbnkgZXhjZXB0aW9uIG9jY3VyZWQgCi0gKiAgICBieSByZWFkaW5nIHRoZSBleGNlcHRpb24gYml0cyBmcm9tIHRoZSBob3N0IEZQVSBzdGF0dXMgcmVnaXN0ZXIgCi0gKiAgICAoZ2V0X2FjY2V4KCkpLgotICogMy4gUHJvcGFnYXRlIGFueSBleGNlcHRpb25zIHRvIHRoZSBzaW11bGF0ZWQgRlNSLgotICogNC4gQ2xlYXIgaG9zdCBleGNlcHRpb24gYml0cwotICoKLSAqCi0gKiBUaGlzIGNhbiBhbHNvIGJlIGRvbmUgdXNpbmcgaWVlZV9mbGFncygpIGxpYnJhcnkgcm91dGluZSBvbiBzdW4uCi0gKi8KLQotI2luY2x1ZGUgInNpcy5oIgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1leHRlcm4gdWludDMyCV9nZXRfc3cgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHVpbnQzMglfZ2V0X2N3IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkCV9fc2V0ZnB1Y3cgUEFSQU1TICgodW5zaWduZWQgc2hvcnQgZnB1X2NvbnRyb2wpKTsKLQotLyogVGhpcyBob3N0IGRlcGVuZGVudCByb3V0aW5lIHNob3VsZCByZXR1cm4gdGhlIGFjY3J1ZWQgZXhjZXB0aW9ucyAqLwotaW50Ci1nZXRfYWNjZXgoKQotewotI2lmZGVmIHNwYXJjCi0gICAgcmV0dXJuICgoX2dldF9mc3JfcmF3KCkgPj4gNSkgJiAweDFGKTsKLSNlbGlmIGkzODYKLSAgICB1aW50MzIgYWNjeDsKLQotICAgIGFjY3ggPSBfZ2V0X3N3KCkgJiAweDNmOwotICAgIGFjY3ggPSAoKGFjY3ggJiAxKSA8PCA0KSB8ICgoYWNjeCAmIDIpID4+IDEpIHwgKChhY2N4ICYgNCkgPj4gMSkgfAotCSAgIChhY2N4ICYgOCkgfCAoKGFjY3ggJiAxNikgPj4gMikgfCAoKGFjY3ggJiAzMikgPj4gNSk7Ci0gICAgcmV0dXJuKGFjY3gpOwotI2Vsc2UKLSAgICByZXR1cm4oMCk7Ci0jd2FybmluZyBubyBmcHUgdHJhcCBzdXBwb3J0IGZvciB0aGlzIHRhcmdldAotI2VuZGlmCi0KLX0KLQotLyogSG93IHRvIGNsZWFyIHRoZSBhY2NydWVkIGV4Y2VwdGlvbnMgKi8KLXZvaWQKLWNsZWFyX2FjY2V4KCkKLXsKLSNpZmRlZiBzcGFyYwotICAgIHNldF9mc3IoKF9nZXRfZnNyX3JhdygpICYgfjB4M2UwKSk7Ci0jZWxpZiBpMzg2Ci0gICAgYXNtKCIKLS50ZXh0Ci0JZm5jbGV4Ci0KLSAgICAiKTsKLSNlbHNlCi0jd2FybmluZyBubyBmcHUgdHJhcCBzdXBwb3J0IGZvciB0aGlzIHRhcmdldAotI2VuZGlmCi19Ci0KLS8qIEhvdyB0byBtYXAgU1BBUkMgRlNSIG9udG8gdGhlIGhvc3QgKi8KLXZvaWQKLXNldF9mc3IoZnNyKQotdWludDMyIGZzcjsKLXsKLSNpZmRlZiBzcGFyYwotCV9zZXRfZnNyX3Jhdyhmc3IgJiB+MHgwZjgwMDAwMCk7Ci0jZWxpZiBpMzg2Ci0gICAgIHZvaWQgX19zZXRmcHVjdyh1bnNpZ25lZCBzaG9ydCBmcHVfY29udHJvbCk7Ci0gICAgIHVpbnQzMiByYXdmc3I7Ci0KLSAgICAgZnNyID4+PSAzMDsKLSAgICAgc3dpdGNoIChmc3IpIHsKLQljYXNlIDA6IAotCWNhc2UgMjogYnJlYWs7Ci0JY2FzZSAxOiBmc3IgPSAzOwotCWNhc2UgMzogZnNyID0gMTsKLSAgICAgfQotICAgICByYXdmc3IgPSBfZ2V0X2N3KCk7Ci0gICAgIHJhd2ZzciB8PSAoZnNyIDw8IDEwKSB8IDB4M2ZmOwotICAgICBfX3NldGZwdWN3KHJhd2Zzcik7Ci0jZWxzZQotI3dhcm5pbmcgbm8gZnB1IHRyYXAgc3VwcG9ydCBmb3IgdGhpcyB0YXJnZXQKLSNlbmRpZgotfQotCi0KLS8qIEhvc3QgZGVwZW5kZW50IHN1cHBvcnQgZnVuY3Rpb25zICovCi0KLSNpZmRlZiBzcGFyYwotCi0gICAgYXNtKCIKLQotLnRleHQKLSAgICAgICAgLmFsaWduIDQKLSAgICAgICAgLmdsb2JhbCBfX3NldF9mc3JfcmF3LF9zZXRfZnNyX3JhdwotX19zZXRfZnNyX3JhdzoKLV9zZXRfZnNyX3JhdzoKLSAgICAgICAgc2F2ZSAlc3AsLTEwNCwlc3AKLSAgICAgICAgc3QgJWkwLFslZnArNjhdCi0gICAgICAgIGxkIFslZnArNjhdLCAlZnNyCi0gICAgICAgIG1vdiAwLCVpMAotICAgICAgICByZXQKLSAgICAgICAgcmVzdG9yZQotIAotICAgICAgICAuYWxpZ24gNAotICAgICAgICAuZ2xvYmFsIF9fZ2V0X2Zzcl9yYXcKLSAgICAgICAgLmdsb2JhbCBfZ2V0X2Zzcl9yYXcKLV9fZ2V0X2Zzcl9yYXc6Ci1fZ2V0X2Zzcl9yYXc6Ci0gICAgICAgIHNhdmUgJXNwLC0xMDQsJXNwCi0gICAgICAgIHN0ICVmc3IsWyVmcCs2OF0KLSAgICAgICAgbGQgWyVmcCs2OF0sICVpMAotICAgICAgICByZXQKLSAgICAgICAgcmVzdG9yZQotIAotICAgICIpOwotCi0jZWxpZiBpMzg2Ci0KLSAgICBhc20oIgotCi0udGV4dAotICAgICAgICAuYWxpZ24gOAotLmdsb2JsIF9nZXRfc3csX19nZXRfc3cKLV9fZ2V0X3N3OgotX2dldF9zdzoKLSAgICAgICAgcHVzaGwgJWVicAotICAgICAgICBtb3ZsICVlc3AsJWVicAotICAgICAgICBtb3ZsICQwLCVlYXgKLSAgICAgICAgZm5zdHN3ICVheAotICAgICAgICBtb3ZsICVlYnAsJWVzcAotICAgICAgICBwb3BsICVlYnAKLSAgICAgICAgcmV0Ci0KLSAgICAgICAgLmFsaWduIDgKLS5nbG9ibCBfZ2V0X2N3LF9fZ2V0X2N3Ci1fX2dldF9jdzoKLV9nZXRfY3c6Ci0gICAgICAgIHB1c2hsICVlYnAKLSAgICAgICAgbW92bCAlZXNwLCVlYnAKLSAgICAgICAgc3VidyAkMiwlZXNwCi0gICAgICAgIGZuc3RjdyAtMiglZWJwKQotICAgICAgICBtb3Z3IC0yKCVlYnApLCVlYXgKLSAgICAgICAgbW92bCAlZWJwLCVlc3AKLSAgICAgICAgcG9wbCAlZWJwCi0gICAgICAgIHJldAotCi0KLSAgICAiKTsKLQotCi0jZWxzZQotI3dhcm5pbmcgbm8gZnB1IHRyYXAgc3VwcG9ydCBmb3IgdGhpcyB0YXJnZXQKLSNlbmRpZgotCi0jaWYgaTM4NgotLyogI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19HTzMyX18gKi8KLS8qIFRoaXMgaXMgc28gZmxvYXRpbmcgZXhjZXB0aW9uIGhhbmRsaW5nIHdvcmtzIG9uIE5UCi0gICBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZnJvbSB0aGUgbGludXggZnB1X2NvbnRyb2wuaCwgd2hpY2gKLSAgIGRvZXNuJ3QgZXhpc3Qgb24gTlQuCi0KLSAgIGRlZmF1bHQgdG86Ci0gICAgIC0gZXh0ZW5kZWQgcHJlY2lzaW9uCi0gICAgIC0gcm91bmRpbmcgdG8gbmVhcmVzdAotICAgICAtIGV4Y2VwdGlvbnMgb24gb3ZlcmZsb3csIHplcm8gZGl2aWRlIGFuZCBOYU4KLSovCi0jZGVmaW5lIF9GUFVfREVGQVVMVCAgMHgxMzcyIAotI2RlZmluZSBfRlBVX1JFU0VSVkVEIDB4RjBDMCAgLyogUmVzZXJ2ZWQgYml0cyBpbiBjdyAqLwotCi1zdGF0aWMgdm9pZAotX19zZXRmcHVjdyh1bnNpZ25lZCBzaG9ydCBmcHVfY29udHJvbCkKLXsKLSAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY3c7Ci0KLSAgLyogSWYgdXNlciBzdXBwbGllZCBfZnB1X2NvbnRyb2wsIHVzZSBpdCAhICovCi0gIGlmICghZnB1X2NvbnRyb2wpCi0gIHsgCi0gICAgLyogdXNlIGRlZmF1bHRzICovCi0gICAgZnB1X2NvbnRyb2wgPSBfRlBVX0RFRkFVTFQ7Ci0gIH0KLSAgLyogR2V0IENvbnRyb2wgV29yZCAqLwotICBfX2FzbV9fIHZvbGF0aWxlICgiZm5zdGN3ICUwIiA6ICI9bSIgKGN3KSA6ICk7Ci0gIAotICAvKiBtYXNrIGluICovCi0gIGN3ICY9IF9GUFVfUkVTRVJWRUQ7Ci0gIGN3ID0gY3cgfCAoZnB1X2NvbnRyb2wgJiB+X0ZQVV9SRVNFUlZFRCk7Ci0KLSAgLyogc2V0IGN3ICovCi0gIF9fYXNtX18gdm9sYXRpbGUgKCJmbGRjdyAlMCIgOjogIm0iIChjdykpOwotfQotLyogI2VuZGlmICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9mdW5jLmMgYi9zaW0vZXJjMzIvZnVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjkxZTMyLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9mdW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYyICswLDAgQEAKLS8qCi0gKiBmdW5jLmMsIG1pc2Mgc2ltdWxhdG9yIGZ1bmN0aW9ucy4gVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgotICogCi0gKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMS44IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCi0gKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQotICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAic2lzLmgiCi0jaW5jbHVkZSAiZW5kLmgiCi0jaW5jbHVkZSA8ZGlzLWFzbS5oPgotI2luY2x1ZGUgInNpbS1jb25maWcuaCIKLQotCi0jZGVmaW5lCVZBTCh4KQlzdHJ0b3VsKHgsKGNoYXIgKiopTlVMTCwwKQotCi1leHRlcm4gaW50CWN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXI7Ci1zdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaW5mbzsKLXN0cnVjdCBwc3RhdGUgICBzcmVnczsKLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotaW50ICAgICAgICAgICAgIGN0cmxfYyA9IDA7Ci1pbnQgICAgICAgICAgICAgc2lzX3ZlcmJvc2UgPSAwOwotY2hhciAgICAgICAgICAgKnNpc192ZXJzaW9uID0gIjIuNy41IjsKLWludCAgICAgICAgICAgICBuZnAgPSAwOwotaW50ICAgICAgICAgICAgIGlmdCA9IDA7Ci1pbnQgICAgICAgICAgICAgd3JwID0gMDsKLWludCAgICAgICAgICAgICByb204ID0gMDsKLWludCAgICAgICAgICAgICB1YmVuID0gMDsKLWludAkJdGVybXNhdmU7Ci1pbnQgICAgICAgICAgICAgc3BhcmNsaXRlID0gMDsJCS8qIGVtdWxhdGluZyBTUEFSQ2xpdGUgaW5zdHJ1Y3Rpb25zPyAqLwotaW50ICAgICAgICAgICAgIHNwYXJjbGl0ZV9ib2FyZCA9IDA7CS8qIGVtdWxhdGluZyBTUEFSQ2xpdGUgYm9hcmQgUkFNPyAqLwotY2hhciAgICAgICAgICAgIHVhcnRfZGV2MVsxMjhdID0gIiI7Ci1jaGFyICAgICAgICAgICAgdWFydF9kZXYyWzEyOF0gPSAiIjsKLWV4dGVybglpbnQJZXh0X2lybDsKLXVpbnQzMgkJbGFzdF9sb2FkX2FkZHIgPSAwOwotCi0jaWZkZWYgRVJSSU5KCi11aW50MzIJCWVycmNudCA9IDA7Ci11aW50MzIJCWVycnBlciA9IDA7Ci11aW50MzIJCWVycnR0ID0gMDsKLXVpbnQzMgkJZXJyZnR0ID0gMDsKLXVpbnQzMgkJZXJybWVjID0gMDsKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgaW50CWJhdGNoIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBjaGFyICpmbmFtZSkpOwotc3RhdGljIHZvaWQJc2V0X3JlZ2EgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIGNoYXIgKnJlZywgdWludDMyIHJ2YWwpKTsKLXN0YXRpYyB2b2lkCWRpc3BfcmVnIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBjaGFyICpyZWcpKTsKLXN0YXRpYyB1aW50MzIJbGltY2FsYyBQQVJBTVMgKChmbG9hdDMyIGZyZXEpKTsKLXN0YXRpYyB2b2lkCWludF9oYW5kbGVyIFBBUkFNUyAoKGludDMyIHNpZykpOwotc3RhdGljIHZvaWQJaW5pdF9ldmVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50CWRpc3BfZnB1IFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncykpOwotc3RhdGljIHZvaWQJZGlzcF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncywgaW50IGN3cCkpOwotc3RhdGljIHZvaWQJZGlzcF9jdHJsIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7Ci1zdGF0aWMgdm9pZAlkaXNwX21lbSBQQVJBTVMgKCh1aW50MzIgYWRkciwgdWludDMyIGxlbikpOwotCi1zdGF0aWMgaW50IAotYmF0Y2goc3JlZ3MsIGZuYW1lKQotICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKLSAgICBjaGFyICAgICAgICAgICAqZm5hbWU7Ci17Ci0gICAgRklMRSAgICAgICAgICAgKmZwOwotICAgIGNoYXIgICAgICAgICAgICBsYnVmWzEwMjRdOwotCi0gICAgaWYgKChmcCA9IGZvcGVuKGZuYW1lLCAiciIpKSA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBvcGVuIGJhdGNoIGZpbGUgJXNcbiIsIGZuYW1lKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLSAgICB3aGlsZSAoIWZlb2YoZnApKSB7Ci0JbGJ1ZlswXSA9IDA7Ci0JZmdldHMobGJ1ZiwgMTAyMywgZnApOwotCWlmICgoc3RybGVuKGxidWYpID4gMCkgJiYgKGxidWZbc3RybGVuKGxidWYpIC0gMV0gPT0gJ1xuJykpCi0JICAgIGxidWZbc3RybGVuKGxidWYpIC0gMV0gPSAwOwotCXByaW50Zigic2lzPiAlc1xuIiwgbGJ1Zik7Ci0JZXhlY19jbWQoc3JlZ3MsIGxidWYpOwotICAgIH0KLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXZvaWQKLXNldF9yZWdpKHNyZWdzLCByZWcsIHJ2YWwpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotICAgIGludDMyICAgICAgICAgICByZWc7Ci0gICAgdWludDMyICAgICAgICAgIHJ2YWw7Ci17Ci0gICAgdWludDMyICAgICAgICAgIGN3cDsKLQotICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7Ci0gICAgaWYgKChyZWcgPiAwKSAmJiAocmVnIDwgOCkpIHsKLQlzcmVncy0+Z1tyZWddID0gcnZhbDsKLSAgICB9IGVsc2UgaWYgKChyZWcgPj0gOCkgJiYgKHJlZyA8IDMyKSkgewotCXNyZWdzLT5yWyhjd3AgKyByZWcpICYgMHg3Zl0gPSBydmFsOwotICAgIH0gZWxzZSBpZiAoKHJlZyA+PSAzMikgJiYgKHJlZyA8IDY0KSkgewotCXNyZWdzLT5mc2lbcmVnIC0gMzJdID0gcnZhbDsKLSAgICB9IGVsc2UgewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSA2NDoKLQkgICAgc3JlZ3MtPnkgPSBydmFsOwotCSAgICBicmVhazsKLQljYXNlIDY1OgotCSAgICBzcmVncy0+cHNyID0gcnZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2NjoKLQkgICAgc3JlZ3MtPndpbSA9IHJ2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjc6Ci0JICAgIHNyZWdzLT50YnIgPSBydmFsOwotCSAgICBicmVhazsKLQljYXNlIDY4OgotCSAgICBzcmVncy0+cGMgPSBydmFsOwotCSAgICBicmVhazsKLQljYXNlIDY5OgotCSAgICBzcmVncy0+bnBjID0gcnZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3MDoKLQkgICAgc3JlZ3MtPmZzciA9IHJ2YWw7Ci0JICAgIHNldF9mc3IocnZhbCk7Ci0JICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6YnJlYWs7Ci0JfQotICAgIH0KLX0KLQotdm9pZAotZ2V0X3JlZ2koc3RydWN0IHBzdGF0ZSAqIHNyZWdzLCBpbnQzMiByZWcsIGNoYXIgKmJ1ZikKLXsKLSAgICB1aW50MzIgICAgICAgICAgY3dwOwotICAgIHVpbnQzMiAgICAgICAgICBydmFsID0gMDsKLQotICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7Ci0gICAgaWYgKChyZWcgPj0gMCkgJiYgKHJlZyA8IDgpKSB7Ci0JcnZhbCA9IHNyZWdzLT5nW3JlZ107Ci0gICAgfSBlbHNlIGlmICgocmVnID49IDgpICYmIChyZWcgPCAzMikpIHsKLQlydmFsID0gc3JlZ3MtPnJbKGN3cCArIHJlZykgJiAweDdmXTsKLSAgICB9IGVsc2UgaWYgKChyZWcgPj0gMzIpICYmIChyZWcgPCA2NCkpIHsKLQlydmFsID0gc3JlZ3MtPmZzaVtyZWcgLSAzMl07Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgNjQ6Ci0JICAgIHJ2YWwgPSBzcmVncy0+eTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2NToKLQkgICAgcnZhbCA9IHNyZWdzLT5wc3I7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjY6Ci0JICAgIHJ2YWwgPSBzcmVncy0+d2ltOwotCSAgICBicmVhazsKLQljYXNlIDY3OgotCSAgICBydmFsID0gc3JlZ3MtPnRicjsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2ODoKLQkgICAgcnZhbCA9IHNyZWdzLT5wYzsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OToKLQkgICAgcnZhbCA9IHNyZWdzLT5ucGM7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzA6Ci0JICAgIHJ2YWwgPSBzcmVncy0+ZnNyOwotCSAgICBicmVhazsKLSAgICBkZWZhdWx0OmJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gQklHX0VORElBTikgewotCWJ1ZlswXSA9IChydmFsID4+IDI0KSAmIDB4MGZmOwotCWJ1ZlsxXSA9IChydmFsID4+IDE2KSAmIDB4MGZmOwotCWJ1ZlsyXSA9IChydmFsID4+IDgpICYgMHgwZmY7Ci0JYnVmWzNdID0gcnZhbCAmIDB4MGZmOwotICAgIH0KLSAgICBlbHNlIHsKLQlidWZbM10gPSAocnZhbCA+PiAyNCkgJiAweDBmZjsKLQlidWZbMl0gPSAocnZhbCA+PiAxNikgJiAweDBmZjsKLQlidWZbMV0gPSAocnZhbCA+PiA4KSAmIDB4MGZmOwotCWJ1ZlswXSA9IHJ2YWwgJiAweDBmZjsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9yZWdhKHNyZWdzLCByZWcsIHJ2YWwpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotICAgIGNoYXIgICAgICAgICAgICpyZWc7Ci0gICAgdWludDMyICAgICAgICAgIHJ2YWw7Ci17Ci0gICAgdWludDMyICAgICAgICAgIGN3cDsKLSAgICBpbnQzMiAgICAgICAgICAgZXJyID0gMDsKLQotICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7Ci0gICAgaWYgKHN0cmNtcChyZWcsICJwc3IiKSA9PSAwKQotCXNyZWdzLT5wc3IgPSAocnZhbCA9IChydmFsICYgMHgwMGYwM2ZmZikpOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJ0YnIiKSA9PSAwKQotCXNyZWdzLT50YnIgPSAocnZhbCA9IChydmFsICYgMHhmZmZmZmZmMCkpOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJ3aW0iKSA9PSAwKQotCXNyZWdzLT53aW0gPSAocnZhbCA9IChydmFsICYgMHgwZmYpKTsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAieSIpID09IDApCi0Jc3JlZ3MtPnkgPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJwYyIpID09IDApCi0Jc3JlZ3MtPnBjID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibnBjIikgPT0gMCkKLQlzcmVncy0+bnBjID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiZnNyIikgPT0gMCkgewotCXNyZWdzLT5mc3IgPSBydmFsOwotCXNldF9mc3IocnZhbCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAocmVnLCAiZzAiKSA9PSAwKQotCWVyciA9IDI7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImcxIikgPT0gMCkKLQlzcmVncy0+Z1sxXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImcyIikgPT0gMCkKLQlzcmVncy0+Z1syXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImczIikgPT0gMCkKLQlzcmVncy0+Z1szXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc0IikgPT0gMCkKLQlzcmVncy0+Z1s0XSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc1IikgPT0gMCkKLQlzcmVncy0+Z1s1XSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc2IikgPT0gMCkKLQlzcmVncy0+Z1s2XSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc3IikgPT0gMCkKLQlzcmVncy0+Z1s3XSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8wIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgOCkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8xIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgOSkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8yIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMTApICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJvMyIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDExKSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibzQiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAxMikgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm81IikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMTMpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJvNiIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDE0KSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibzciKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAxNSkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImwwIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMTYpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsMSIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDE3KSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibDIiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAxOCkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImwzIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMTkpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsNCIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDIwKSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibDUiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAyMSkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImw2IikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMjIpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsNyIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDIzKSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTAiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAyNCkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImkxIikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMjUpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJpMiIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDI2KSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTMiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAyNykgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImk0IikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMjgpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJpNSIpID09IDApCi0Jc3JlZ3MtPnJbKGN3cCArIDI5KSAmIDB4N2ZdID0gcnZhbDsKLSAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTYiKSA9PSAwKQotCXNyZWdzLT5yWyhjd3AgKyAzMCkgJiAweDdmXSA9IHJ2YWw7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImk3IikgPT0gMCkKLQlzcmVncy0+clsoY3dwICsgMzEpICYgMHg3Zl0gPSBydmFsOwotICAgIGVsc2UKLQllcnIgPSAxOwotICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgY2FzZSAwOgotCXByaW50ZigiJXMgPSAlZCAoMHglMDh4KVxuIiwgcmVnLCBydmFsLCBydmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JcHJpbnRmKCJubyBzdWNoIHJlZ2lzZXI6ICVzXG4iLCByZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlwcmludGYoImNhbm5vdCBzZXQgZzBcbiIpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwX3JlZyhzcmVncywgcmVnKQotICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKLSAgICBjaGFyICAgICAgICAgICAqcmVnOwotewotICAgIGlmIChzdHJuY21wKHJlZywgInciLDEpID09IDApCi0JZGlzcF9yZWdzKHNyZWdzLCBWQUwoJnJlZ1sxXSkpOwotfQotCi0jaWZkZWYgRVJSSU5KCi0KLXZvaWQKLWVycmluaigpCi17Ci0gICAgaW50CWVycjsKLQotICAgIHN3aXRjaCAoZXJyID0gKHJhbmRvbSgpICUgMTIpKSB7Ci0JY2FzZSAwOiBlcnJ0dCA9IDB4NjE7IGJyZWFrOwotCWNhc2UgMTogZXJydHQgPSAweDYyOyBicmVhazsKLQljYXNlIDI6IGVycnR0ID0gMHg2MzsgYnJlYWs7Ci0JY2FzZSAzOiBlcnJ0dCA9IDB4NjQ7IGJyZWFrOwotCWNhc2UgNDogZXJydHQgPSAweDY1OyBicmVhazsKLQljYXNlIDU6IAotCWNhc2UgNjogCi0JY2FzZSA3OiBlcnJmdHQgPSBlcnI7IAotCQlicmVhazsKLQljYXNlIDg6IGVycm1lYyA9IDE7IGJyZWFrOwotCWNhc2UgOTogZXJybWVjID0gMjsgYnJlYWs7Ci0JY2FzZSAxMDogZXJybWVjID0gNTsgYnJlYWs7Ci0JY2FzZSAxMTogZXJybWVjID0gNjsgYnJlYWs7Ci0gICAgfQotICAgIGVycmNudCsrOwotICAgIGlmIChlcnJwZXIpIGV2ZW50KGVycmluaiwgMCwgKHJhbmRvbSgpJWVycnBlcikpOwotfQotCi12b2lkCi1lcnJpbmpzdGFydCgpCi17Ci0gICAgaWYgKGVycnBlcikgZXZlbnQoZXJyaW5qLCAwLCAocmFuZG9tKCklZXJycGVyKSk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdWludDMyCi1saW1jYWxjIChmcmVxKQotICAgIGZsb2F0MzIJCWZyZXE7Ci17Ci0gICAgdWludDMyICAgICAgICAgIHVuaXQsIGxpbTsKLSAgICBkb3VibGUJICAgIGZsaW07Ci0gICAgY2hhciAgICAgICAgICAgKmNtZDEsICpjbWQyOwotCi0gICAgdW5pdCA9IDE7Ci0gICAgbGltID0gLTE7Ci0gICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpIHsKLSAgICAgICAgbGltID0gVkFMKGNtZDEpOwotICAgICAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChjbWQyLCJ1cyIpPT0wKSB1bml0ID0gMTsKLSAgICAgIAkgICAgaWYgKHN0cmNtcChjbWQyLCJtcyIpPT0wKSB1bml0ID0gMTAwMDsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoY21kMiwicyIpPT0wKSAgdW5pdCA9IDEwMDAwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZmxpbSA9IChkb3VibGUpIGxpbSAqIChkb3VibGUpIHVuaXQgKiAoZG91YmxlKSBmcmVxICsgCi0JICAgKGRvdWJsZSkgZWJhc2Uuc2ltdGltZTsKLSAgICAgICAgaWYgKChmbGltID4gZWJhc2Uuc2ltdGltZSkgJiYgKGZsaW0gPCA0Mjk0OTY3Mjk2LjApKSB7Ci0gICAgICAgICAgICBsaW0gPSAodWludDMyKSBmbGltOwotICAgICAgICB9IGVsc2UgIHsKLSAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gZXhwcmVzc2lvblxuIik7Ci0gICAgICAgICAgICBsaW0gPSAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGxpbSk7Ci19Ci0gICAgCi1pbnQKLWV4ZWNfY21kKHNyZWdzLCBjbWQpCi0gICAgY2hhciAgICAgICAgICAgKmNtZDsKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci17Ci0gICAgY2hhciAgICAgICAgICAgKmNtZDEsICpjbWQyOwotICAgIGludDMyICAgICAgICAgICBzdGF0OwotICAgIHVpbnQzMiAgICAgICAgICBsZW4sIGksIGNsZW4sIGo7Ci0gICAgc3RhdGljIHVpbnQzMiAgIGRhZGRyID0gMDsKLSAgICBjaGFyICAgICAgICAgICAqY21kc2F2ZTsKLQotICAgIHN0YXQgPSBPSzsKLSAgICBjbWRzYXZlID0gc3RyZHVwKGNtZCk7Ci0gICAgaWYgKChjbWQxID0gc3RydG9rKGNtZCwgIiBcdCIpKSAhPSBOVUxMKSB7Ci0JY2xlbiA9IHN0cmxlbihjbWQxKTsKLQlpZiAoc3RybmNtcChjbWQxLCAiYnAiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBzcmVncy0+YnB0bnVtOyBpKyspIHsKLQkJcHJpbnRmKCIgICVkIDogMHglMDh4XG4iLCBpICsgMSwgc3JlZ3MtPmJwdHNbaV0pOwotCSAgICB9Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICIrYnAiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7Ci0JCXNyZWdzLT5icHRzW3NyZWdzLT5icHRudW1dID0gVkFMKGNtZDEpICYgfjB4MzsKLQkJcHJpbnRmKCJhZGRlZCBicmVha3BvaW50ICVkIGF0IDB4JTA4eFxuIiwKLQkJICAgICAgIHNyZWdzLT5icHRudW0gKyAxLCBzcmVncy0+YnB0c1tzcmVncy0+YnB0bnVtXSk7Ci0JCXNyZWdzLT5icHRudW0gKz0gMTsKLQkgICAgfQotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiLWJwIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotCQlpID0gVkFMKGNtZDEpIC0gMTsKLQkJaWYgKChpID49IDApICYmIChpIDwgc3JlZ3MtPmJwdG51bSkpIHsKLQkJICAgIHByaW50ZigiZGVsZXRlZCBicmVha3BvaW50ICVkIGF0IDB4JTA4eFxuIiwgaSArIDEsCi0JCQkgICBzcmVncy0+YnB0c1tpXSk7Ci0JCSAgICBmb3IgKDsgaSA8IHNyZWdzLT5icHRudW0gLSAxOyBpKyspIHsKLQkJCXNyZWdzLT5icHRzW2ldID0gc3JlZ3MtPmJwdHNbaSArIDFdOwotCQkgICAgfQotCQkgICAgc3JlZ3MtPmJwdG51bSAtPSAxOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImJhdGNoIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgewotCQlwcmludGYoIm5vIGZpbGUgc3BlY2lmaWVkXG4iKTsKLQkgICAgfSBlbHNlIHsKLQkJYmF0Y2goc3JlZ3MsIGNtZDEpOwotCSAgICB9Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJjb250IiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgewotCQlzdGF0ID0gcnVuX3NpbShzcmVncywgLTEsIDApOwotCSAgICB9IGVsc2UgewotCQlzdGF0ID0gcnVuX3NpbShzcmVncywgVkFMKGNtZDEpLCAwKTsKLQkgICAgfQotCSAgICBkYWRkciA9IHNyZWdzLT5wYzsKLQkgICAgc2ltX2hhbHQoKTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImRlYnVnIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotCQlzaXNfdmVyYm9zZSA9IFZBTChjbWQxKTsKLQkgICAgfQotCSAgICBwcmludGYoIkRlYnVnIGxldmVsID0gJWRcbiIsc2lzX3ZlcmJvc2UpOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiZGlzIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotCQlkYWRkciA9IFZBTChjbWQxKTsKLQkgICAgfQotCSAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotCQlsZW4gPSBWQUwoY21kMik7Ci0JICAgIH0gZWxzZQotCQlsZW4gPSAxNjsKLQkgICAgcHJpbnRmKCJcbiIpOwotCSAgICBkaXNfbWVtKGRhZGRyLCBsZW4sICZkaW5mbyk7Ci0JICAgIHByaW50ZigiXG4iKTsKLQkgICAgZGFkZHIgKz0gbGVuICogNDsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImVjaG8iLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7Ci0JCXByaW50ZigiJXNcbiIsICgmY21kc2F2ZVtjbGVuKzFdKSk7Ci0JICAgIH0KLSNpZmRlZiBFUlJJTkoKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImVycm9yIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgewotCQllcnJwZXIgPSBWQUwoY21kMSk7Ci0JICAgICAgICBpZiAoZXJycGVyKSB7Ci0JCSAgICBldmVudChlcnJpbmosIDAsIChsZW4gPSAocmFuZG9tKCklZXJycGVyKSkpOwotCQkgICAgcHJpbnRmKCJFcnJvciBpbmplY3Rpb24gc3RhcnRlZCB3aXRoIHBlcmlvZCAlZFxuIixsZW4pOwotCSAgICAgICAgfSAKLQkgICAgIH0gZWxzZSBwcmludGYoIkluamVjdGVkIGVycm9yczogJWRcbiIsZXJyY250KTsKLSNlbmRpZgotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiZmxvYXQiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIHN0YXQgPSBkaXNwX2ZwdShzcmVncyk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJnbyIsIGNsZW4pID09IDApIHsKLQkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpID09IE5VTEwpIHsKLQkJbGVuID0gbGFzdF9sb2FkX2FkZHI7Ci0JICAgIH0gZWxzZSB7Ci0JCWxlbiA9IFZBTChjbWQxKTsKLQkgICAgfQotCSAgICBzcmVncy0+cGMgPSBsZW4gJiB+MzsKLQkgICAgc3JlZ3MtPm5wYyA9IHNyZWdzLT5wYyArIDQ7Ci0JICAgIHByaW50ZigicmVzdW1pbmcgYXQgMHglMDh4XG4iLHNyZWdzLT5wYyk7Ci0JICAgIGlmICgoY21kMiA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7Ci0JCXN0YXQgPSBydW5fc2ltKHNyZWdzLCBWQUwoY21kMiksIDApOwotCSAgICB9IGVsc2UgewotCQlzdGF0ID0gcnVuX3NpbShzcmVncywgLTEsIDApOwotCSAgICB9Ci0JICAgIGRhZGRyID0gc3JlZ3MtPnBjOwotCSAgICBzaW1faGFsdCgpOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiaGVscCIsIGNsZW4pID09IDApIHsKLQkgICAgZ2VuX2hlbHAoKTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImhpc3RvcnkiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7Ci0JCXNyZWdzLT5oaXN0bGVuID0gVkFMKGNtZDEpOwotCQlpZiAoc3JlZ3MtPmhpc3RidWYgIT0gTlVMTCkKLQkJICAgIGZyZWUoc3JlZ3MtPmhpc3RidWYpOwotCQlzcmVncy0+aGlzdGJ1ZiA9IChzdHJ1Y3QgaGlzdHlwZSAqKSBjYWxsb2Moc3JlZ3MtPmhpc3RsZW4sIHNpemVvZihzdHJ1Y3QgaGlzdHlwZSkpOwotCQlwcmludGYoInRyYWNlIGhpc3RvcnkgbGVuZ3RoID0gJWRcblxyIiwgc3JlZ3MtPmhpc3RsZW4pOwotCQlzcmVncy0+aGlzdGluZCA9IDA7Ci0KLQkgICAgfSBlbHNlIHsKLQkJaiA9IHNyZWdzLT5oaXN0aW5kOwotCQlmb3IgKGkgPSAwOyBpIDwgc3JlZ3MtPmhpc3RsZW47IGkrKykgewotCQkgICAgaWYgKGogPj0gc3JlZ3MtPmhpc3RsZW4pCi0JCQlqID0gMDsKLQkJICAgIHByaW50ZigiICU4ZCAiLCBzcmVncy0+aGlzdGJ1ZltqXS50aW1lKTsKLQkJICAgIGRpc19tZW0oc3JlZ3MtPmhpc3RidWZbal0uYWRkciwgMSwgJmRpbmZvKTsKLQkJICAgIGorKzsKLQkJfQotCSAgICB9Ci0KLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImxvYWQiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7Ci0JCWxhc3RfbG9hZF9hZGRyID0gYmZkX2xvYWQoY21kMSk7Ci0JCXdoaWxlICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKQotCQkgICAgbGFzdF9sb2FkX2FkZHIgPSBiZmRfbG9hZChjbWQxKTsKLQkgICAgfSBlbHNlIHsKLQkJcHJpbnRmKCJsb2FkOiBubyBmaWxlIHNwZWNpZmllZFxuIik7Ci0JICAgIH0KLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgIm1lbSIsIGNsZW4pID09IDApIHsKLQkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpCi0JCWRhZGRyID0gVkFMKGNtZDEpOwotCSAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkKLQkJbGVuID0gVkFMKGNtZDIpOwotCSAgICBlbHNlCi0JCWxlbiA9IDY0OwotCSAgICBkaXNwX21lbShkYWRkciwgbGVuKTsKLQkgICAgZGFkZHIgKz0gbGVuOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAicGVyZiIsIGNsZW4pID09IDApIHsKLQkgICAgY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpOwotCSAgICBpZiAoKGNtZDEgIT0gTlVMTCkgJiYKLQkJKHN0cm5jbXAoY21kMSwgInJlc2V0Iiwgc3RybGVuKGNtZDEpKSA9PSAwKSkgewotCQlyZXNldF9zdGF0KHNyZWdzKTsKLQkgICAgfSBlbHNlCi0JCXNob3dfc3RhdChzcmVncyk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJxdWl0IiwgY2xlbikgPT0gMCkgewotCSAgICBleGl0KDApOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAicmVnIiwgY2xlbikgPT0gMCkgewotCSAgICBjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIik7Ci0JICAgIGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKTsKLQkgICAgaWYgKGNtZDIgIT0gTlVMTCkKLQkJc2V0X3JlZ2Eoc3JlZ3MsIGNtZDEsIFZBTChjbWQyKSk7Ci0JICAgIGVsc2UgaWYgKGNtZDEgIT0gTlVMTCkKLQkJZGlzcF9yZWcoc3JlZ3MsIGNtZDEpOwotCSAgICBlbHNlIHsKLQkJZGlzcF9yZWdzKHNyZWdzLHNyZWdzLT5wc3IpOwotCQlkaXNwX2N0cmwoc3JlZ3MpOwotCSAgICB9Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJyZXNldCIsIGNsZW4pID09IDApIHsKLQkgICAgZWJhc2Uuc2ltdGltZSA9IDA7Ci0JICAgIHJlc2V0X2FsbCgpOwotCSAgICByZXNldF9zdGF0KHNyZWdzKTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgInJ1biIsIGNsZW4pID09IDApIHsKLQkgICAgZWJhc2Uuc2ltdGltZSA9IDA7Ci0JICAgIHJlc2V0X2FsbCgpOwotCSAgICByZXNldF9zdGF0KHNyZWdzKTsKLQkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpID09IE5VTEwpIHsKLQkJc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIC0xLCAwKTsKLQkgICAgfSBlbHNlIHsKLQkJc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIFZBTChjbWQxKSwgMCk7Ci0JICAgIH0KLQkgICAgZGFkZHIgPSBzcmVncy0+cGM7Ci0JICAgIHNpbV9oYWx0KCk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJzaGVsbCIsIGNsZW4pID09IDApIHsKLQkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpIHsKLQkJc3lzdGVtKCZjbWRzYXZlW2NsZW5dKTsKLQkgICAgfQotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAic3RlcCIsIGNsZW4pID09IDApIHsKLQkgICAgc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIDEsIDEpOwotCSAgICBkYWRkciA9IHNyZWdzLT5wYzsKLQkgICAgc2ltX2hhbHQoKTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgInRjb250IiwgY2xlbikgPT0gMCkgewotCSAgICBzcmVncy0+dGxpbWl0ID0gbGltY2FsYyhzcmVncy0+ZnJlcSk7Ci0JICAgIHN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMCk7Ci0JICAgIGRhZGRyID0gc3JlZ3MtPnBjOwotCSAgICBzaW1faGFsdCgpOwotCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAidGdvIiwgY2xlbikgPT0gMCkgewotCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgewotCQlsZW4gPSBsYXN0X2xvYWRfYWRkcjsKLQkgICAgfSBlbHNlIHsKLQkJbGVuID0gVkFMKGNtZDEpOwotCSAgICAgICAgc3JlZ3MtPnRsaW1pdCA9IGxpbWNhbGMoc3JlZ3MtPmZyZXEpOwotCSAgICB9Ci0JICAgIHNyZWdzLT5wYyA9IGxlbiAmIH4zOwotCSAgICBzcmVncy0+bnBjID0gc3JlZ3MtPnBjICsgNDsKLQkgICAgcHJpbnRmKCJyZXN1bWluZyBhdCAweCUwOHhcbiIsc3JlZ3MtPnBjKTsKLQkgICAgc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIC0xLCAwKTsKLQkgICAgZGFkZHIgPSBzcmVncy0+cGM7Ci0JICAgIHNpbV9oYWx0KCk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0bGltaXQiLCBjbGVuKSA9PSAwKSB7Ci0JICAgc3JlZ3MtPnRsaW1pdCA9IGxpbWNhbGMoc3JlZ3MtPmZyZXEpOwotCSAgIGlmIChzcmVncy0+dGxpbWl0ICE9ICh1aW50MzIpIC0xKQotICAgICAgICAgICAgICBwcmludGYoInNpbXVsYXRpb24gbGltaXQgPSAldSAoJS4zZiBtcylcbiIsKHVpbnQzMikgc3JlZ3MtPnRsaW1pdCwKLQkJc3JlZ3MtPnRsaW1pdCAvIHNyZWdzLT5mcmVxIC8gMTAwMCk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0cmEiLCBjbGVuKSA9PSAwKSB7Ci0JICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSA9PSBOVUxMKSB7Ci0JCXN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMSk7Ci0JICAgIH0gZWxzZSB7Ci0JCXN0YXQgPSBydW5fc2ltKHNyZWdzLCBWQUwoY21kMSksIDEpOwotCSAgICB9Ci0JICAgIHByaW50ZigiXG4iKTsKLQkgICAgZGFkZHIgPSBzcmVncy0+cGM7Ci0JICAgIHNpbV9oYWx0KCk7Ci0JfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0cnVuIiwgY2xlbikgPT0gMCkgewotCSAgICBlYmFzZS5zaW10aW1lID0gMDsKLQkgICAgcmVzZXRfYWxsKCk7Ci0JICAgIHJlc2V0X3N0YXQoc3JlZ3MpOwotCSAgICBzcmVncy0+dGxpbWl0ID0gbGltY2FsYyhzcmVncy0+ZnJlcSk7Ci0JICAgIHN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMCk7Ci0JICAgIGRhZGRyID0gc3JlZ3MtPnBjOwotCSAgICBzaW1faGFsdCgpOwotCX0gZWxzZQotCSAgICBwcmludGYoInN5bnRheCBlcnJvclxuIik7Ci0gICAgfQotICAgIGlmIChjbWRzYXZlICE9IE5VTEwpCi0JZnJlZShjbWRzYXZlKTsKLSAgICByZXR1cm4gKHN0YXQpOwotfQotCi0KLXZvaWQKLXJlc2V0X3N0YXQoc3JlZ3MpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotICAgIHNyZWdzLT50b3R0aW1lID0gMDsKLSAgICBzcmVncy0+cHdkdGltZSA9IDA7Ci0gICAgc3JlZ3MtPm5pbnN0ID0gMDsKLSAgICBzcmVncy0+ZmhvbGR0ID0gMDsKLSAgICBzcmVncy0+aG9sZHQgPSAwOwotICAgIHNyZWdzLT5pY250dCA9IDA7Ci0gICAgc3JlZ3MtPmZpbnN0ID0gMDsKLSAgICBzcmVncy0+bnN0b3JlID0gMDsKLSAgICBzcmVncy0+bmxvYWQgPSAwOwotICAgIHNyZWdzLT5uYnJhbmNoID0gMDsKLSAgICBzcmVncy0+c2ltc3RhcnQgPSBlYmFzZS5zaW10aW1lOwotCi19Ci0KLXZvaWQKLXNob3dfc3RhdChzcmVncykKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci17Ci0gICAgdWludDMyICAgICAgICAgIGlpbnN0OwotICAgIHVpbnQzMiAgICAgICAgICBzdGltZSwgdG90dGltZTsKLQotICAgIGlmIChzcmVncy0+dG90dGltZSA9PSAwKSB0b3R0aW1lID0gMTsgZWxzZSB0b3R0aW1lID0gc3JlZ3MtPnRvdHRpbWU7Ci0gICAgc3RpbWUgPSBlYmFzZS5zaW10aW1lIC0gc3JlZ3MtPnNpbXN0YXJ0OwkvKiBUb3RhbCBzaW11bGF0ZWQgdGltZSAqLwotI2lmZGVmIFNUQVQKLQotICAgIGlpbnN0ID0gc3JlZ3MtPm5pbnN0IC0gc3JlZ3MtPmZpbnN0IC0gc3JlZ3MtPm5sb2FkIC0gc3JlZ3MtPm5zdG9yZSAtCi0Jc3JlZ3MtPm5icmFuY2g7Ci0jZW5kaWYKLQotICAgIHByaW50ZigiXG4gQ3ljbGVzICAgICAgIDogJTlkXG5cciIsIGViYXNlLnNpbXRpbWUgLSBzcmVncy0+c2ltc3RhcnQpOwotICAgIHByaW50ZigiIEluc3RydWN0aW9ucyA6ICU5ZFxuIiwgc3JlZ3MtPm5pbnN0KTsKLQotI2lmZGVmIFNUQVQKLSAgICBwcmludGYoIiAgIGludGVnZXIgICAgOiAlOS4yZiAlJVxuIiwgMTAwLjAgKiAoZmxvYXQpIGlpbnN0IC8gKGZsb2F0KSBzcmVncy0+bmluc3QpOwotICAgIHByaW50ZigiICAgbG9hZCAgICAgICA6ICU5LjJmICUlXG4iLAotCSAgIDEwMC4wICogKGZsb2F0KSBzcmVncy0+bmxvYWQgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7Ci0gICAgcHJpbnRmKCIgICBzdG9yZSAgICAgIDogJTkuMmYgJSVcbiIsCi0JICAgMTAwLjAgKiAoZmxvYXQpIHNyZWdzLT5uc3RvcmUgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7Ci0gICAgcHJpbnRmKCIgICBicmFuY2ggICAgIDogJTkuMmYgJSVcbiIsCi0JICAgMTAwLjAgKiAoZmxvYXQpIHNyZWdzLT5uYnJhbmNoIC8gKGZsb2F0KSBzcmVncy0+bmluc3QpOwotICAgIHByaW50ZigiICAgZmxvYXQgICAgICA6ICU5LjJmICUlXG4iLAotCSAgIDEwMC4wICogKGZsb2F0KSBzcmVncy0+Zmluc3QgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7Ci0gICAgcHJpbnRmKCIgSW50ZWdlciBDUEkgIDogJTkuMmZcbiIsCi0JICAgKChmbG9hdCkgKHN0aW1lIC0gc3JlZ3MtPnB3ZHRpbWUgLSBzcmVncy0+ZmhvbGR0IC0gc3JlZ3MtPmZpbnN0KSkKLQkgICAvCi0JICAgKGZsb2F0KSAoc3JlZ3MtPm5pbnN0IC0gc3JlZ3MtPmZpbnN0KSk7Ci0gICAgcHJpbnRmKCIgRmxvYXQgQ1BJICAgIDogJTkuMmZcbiIsCi0JICAgKChmbG9hdCkgc3JlZ3MtPmZob2xkdCAvIChmbG9hdCkgc3JlZ3MtPmZpbnN0KSArIDEuMCk7Ci0jZW5kaWYKLSAgICBwcmludGYoIiBPdmVyYWxsIENQSSAgOiAlOS4yZlxuIiwKLQkgICAoZmxvYXQpIChzdGltZSAtIHNyZWdzLT5wd2R0aW1lKSAvIChmbG9hdCkgc3JlZ3MtPm5pbnN0KTsKLSAgICBwcmludGYoIlxuIEVSQzMyIHBlcmZvcm1hbmNlICglNC4xZiBNSHopOiAlNS4yZiBNT1BTICglNS4yZiBNSVBTLCAlNS4yZiBNRkxPUFMpXG4iLAotCSAgIHNyZWdzLT5mcmVxLCBzcmVncy0+ZnJlcSAqIChmbG9hdCkgc3JlZ3MtPm5pbnN0IC8gKGZsb2F0KSAoc3RpbWUgLSBzcmVncy0+cHdkdGltZSksCi0JICAgc3JlZ3MtPmZyZXEgKiAoZmxvYXQpIChzcmVncy0+bmluc3QgLSBzcmVncy0+Zmluc3QpIC8KLQkgICAoZmxvYXQpIChzdGltZSAtIHNyZWdzLT5wd2R0aW1lKSwKLSAgICAgc3JlZ3MtPmZyZXEgKiAoZmxvYXQpIHNyZWdzLT5maW5zdCAvIChmbG9hdCkgKHN0aW1lIC0gc3JlZ3MtPnB3ZHRpbWUpKTsKLSAgICBwcmludGYoIiBTaW11bGF0ZWQgRVJDMzIgdGltZSAgICAgICAgOiAlNS4yZiBtc1xuIiwgKGZsb2F0KSAoZWJhc2Uuc2ltdGltZSAtIHNyZWdzLT5zaW1zdGFydCkgLyAxMDAwLjAgLyBzcmVncy0+ZnJlcSk7Ci0gICAgcHJpbnRmKCIgUHJvY2Vzc29yIHV0aWxpc2F0aW9uICAgICAgIDogJTUuMmYgJSVcbiIsIDEwMC4wICogKDEuMCAtICgoZmxvYXQpIHNyZWdzLT5wd2R0aW1lIC8gKGZsb2F0KSBzdGltZSkpKTsKLSAgICBwcmludGYoIiBSZWFsLXRpbWUgLyBzaW11bGF0b3ItdGltZSAgOiAxLyUuMmYgXG4iLAotICAgICAgKChmbG9hdCkgc3JlZ3MtPnRvdHRpbWUpIC8gKChmbG9hdCkgKHN0aW1lKSAvIChzcmVncy0+ZnJlcSAqIDEuMEU2KSkpOwotICAgIHByaW50ZigiIFNpbXVsYXRvciBwZXJmb3JtYW5jZSAgICAgICA6ICVkIEtJUFNcbiIsc3JlZ3MtPm5pbnN0L3RvdHRpbWUvMTAwMCk7Ci0gICAgcHJpbnRmKCIgVXNlZCB0aW1lIChzeXMgKyB1c2VyKSAgICAgIDogJTNkIHNcblxuIiwgc3JlZ3MtPnRvdHRpbWUpOwotfQotCi0KLQotdm9pZAotaW5pdF9icHQoc3JlZ3MpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotICAgIHNyZWdzLT5icHRudW0gPSAwOwotICAgIHNyZWdzLT5oaXN0bGVuID0gMDsKLSAgICBzcmVncy0+aGlzdGluZCA9IDA7Ci0gICAgc3JlZ3MtPmhpc3RidWYgPSBOVUxMOwotICAgIHNyZWdzLT50bGltaXQgPSAtMTsKLX0KLQotc3RhdGljIHZvaWQKLWludF9oYW5kbGVyKHNpZykKLSAgICBpbnQzMiAgICAgICAgICAgc2lnOwotewotICAgIGlmIChzaWcgIT0gMikKLQlwcmludGYoIlxuXG4gU2lnbmFsIGhhbmRsZXIgZXJyb3IgICglZClcblxuIiwgc2lnKTsKLSAgICBjdHJsX2MgPSAxOwotfQotCi12b2lkCi1pbml0X3NpZ25hbHMoKQotewotICAgIHR5cGVkZWYgdm9pZCAgICAoKlBGSSkgKCk7Ci0gICAgc3RhdGljIFBGSSAgICAgIGludF90YWJbMl07Ci0KLSAgICBpbnRfdGFiWzBdID0gc2lnbmFsKFNJR1RFUk0sIGludF9oYW5kbGVyKTsKLSAgICBpbnRfdGFiWzFdID0gc2lnbmFsKFNJR0lOVCwgaW50X2hhbmRsZXIpOwotfQotCi0KLWV4dGVybiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaW5mbzsKLQotc3RydWN0IGVzdGF0ZSAgIGViYXNlOwotc3RydWN0IGV2Y2VsbCAgIGV2YnVmW0VWRU5UX01BWF07Ci1zdHJ1Y3QgaXJxY2VsbCAgaXJxYXJyWzE2XTsKLQotc3RhdGljIGludAotZGlzcF9mcHUoc3JlZ3MpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotewotCi0gICAgaW50ICAgICAgICAgaTsKLSAgICBmbG9hdAl0OwotCi0gICAgcHJpbnRmKCJcbiBmc3I6ICUwOFhcblxuIiwgc3JlZ3MtPmZzcik7Ci0KLSNpZmRlZiBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVQKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICAgIHNyZWdzLT5mZHBbaSBeIDFdID0gc3JlZ3MtPmZzW2ldOwotI2VuZGlmCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCXQgPSBzcmVncy0+ZnNbaV07Ci0JcHJpbnRmKCIgZiUwMmQgICUwOHggICUxNGUgICIsIGksIHNyZWdzLT5mc2lbaV0sIHNyZWdzLT5mc1tpXSk7Ci0JaWYgKCEoaSAmIDEpKQotCSAgICBwcmludGYoIiUxNGVcbiIsIHNyZWdzLT5mZFtpID4+IDFdKTsKLQllbHNlCi0JICAgIHByaW50ZigiXG4iKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHJldHVybiAoT0spOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcF9yZWdzKHNyZWdzLGN3cCkKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci0gICAgaW50IGN3cDsKLXsKLQotICAgIGludCAgICAgICAgICAgaTsKLQotICAgIGN3cCA9ICgoY3dwICYgMHg3KSA8PCA0KTsKLSAgICBwcmludGYoIlxuXHQgIElOUyAgICAgICBMT0NBTFMgICAgICBPVVRTICAgICBHTE9CQUxTXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JcHJpbnRmKCIgICAlZDogICUwOFggICAlMDhYICAgJTA4WCAgICUwOFhcbiIsIGksCi0JICAgICAgIHNyZWdzLT5yWyhjd3AgKyBpICsgMjQpICYgMHg3Zl0sCi0JICAgIHNyZWdzLT5yWyhjd3AgKyBpICsgMTYpICYgMHg3Zl0sIHNyZWdzLT5yWyhjd3AgKyBpICsgOCkgJiAweDdmXSwKLQkgICAgICAgc3JlZ3MtPmdbaV0pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BfY3RybChzcmVncykKLSAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Ci17Ci0KLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBpWzRdOwotCi0gICAgcHJpbnRmKCJcbiBwc3I6ICUwOFggICB3aW06ICUwOFggICB0YnI6ICUwOFggICB5OiAlMDhYXG4iLAotCSAgIHNyZWdzLT5wc3IsIHNyZWdzLT53aW0sIHNyZWdzLT50YnIsIHNyZWdzLT55KTsKLSAgICBzaXNfbWVtb3J5X3JlYWQoc3JlZ3MtPnBjLCBpLCA0KTsKLSAgICBwcmludGYoIlxuICBwYzogJTA4WCA9ICUwMlglMDJYJTAyWCUwMlggICAgIiwgc3JlZ3MtPnBjLGlbMF0saVsxXSxpWzJdLGlbM10pOwotICAgIHByaW50X2luc25fc3BhcmMoc3JlZ3MtPnBjLCAmZGluZm8pOwotICAgIHNpc19tZW1vcnlfcmVhZChzcmVncy0+bnBjLCBpLCA0KTsKLSAgICBwcmludGYoIlxuIG5wYzogJTA4WCA9ICUwMlglMDJYJTAyWCUwMlggICAgIixzcmVncy0+bnBjLGlbMF0saVsxXSxpWzJdLGlbM10pOwotICAgIHByaW50X2luc25fc3BhcmMoc3JlZ3MtPm5wYywgJmRpbmZvKTsKLSAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKQotCXByaW50ZigiXG4gSVUgaW4gZXJyb3IgbW9kZSIpOwotICAgIHByaW50ZigiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcF9tZW0oYWRkciwgbGVuKQotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotICAgIHVpbnQzMiAgICAgICAgICBsZW47Ci17Ci0KLSAgICB1aW50MzIgICAgICAgICAgaTsKLSAgICB1bnNpZ25lZCBjaGFyICAgZGF0YVs0XTsKLSAgICB1aW50MzIgICAgICAgICAgbWVtWzRdLCBqOwotICAgIGNoYXIgICAgICAgICAgICpwOwotCi0gICAgZm9yIChpID0gYWRkciAmIH4zOyBpIDwgKChhZGRyICsgbGVuKSAmIH4zKTsgaSArPSAxNikgewotCXByaW50ZigiXG4gJThYICAiLCBpKTsKLQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JICAgIHNpc19tZW1vcnlfcmVhZCgoaSArIChqICogNCkpLCBkYXRhLCA0KTsKLQkgICAgcHJpbnRmKCIlMDJ4JTAyeCUwMnglMDJ4ICAiLCBkYXRhWzBdLGRhdGFbMV0sZGF0YVsyXSxkYXRhWzNdKTsKLQkgICAgbWVtW2pdID0gKigoaW50ICopICZkYXRhKTsKLQl9Ci0JcHJpbnRmKCIgICIpOwotCXAgPSAoY2hhciAqKSBtZW07Ci0JZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLQkgICAgaWYgKGlzcHJpbnQocFtqXSkpCi0JCXB1dGNoYXIocFtqXSk7Ci0JICAgIGVsc2UKLQkJcHV0Y2hhcignLicpOwotCX0KLSAgICB9Ci0gICAgcHJpbnRmKCJcblxuIik7Ci19Ci0KLXZvaWQKLWRpc19tZW0oYWRkciwgbGVuLCBpbmZvKQotICAgIHVpbnQzMiAgICAgICAgICBhZGRyOwotICAgIHVpbnQzMiAgICAgICAgICBsZW47Ci0gICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICAgdWludDMyICAgICAgICAgIGk7Ci0gICAgdW5zaWduZWQgY2hhciAgIGRhdGFbNF07Ci0KLSAgICBmb3IgKGkgPSBhZGRyICYgLTM7IGkgPCAoKGFkZHIgJiAtMykgKyAobGVuIDw8IDIpKTsgaSArPSA0KSB7Ci0Jc2lzX21lbW9yeV9yZWFkKGksIGRhdGEsIDQpOwotCXByaW50ZigiICUwOHggICUwMnglMDJ4JTAyeCUwMnggICIsIGksIGRhdGFbMF0sZGF0YVsxXSxkYXRhWzJdLGRhdGFbM10pOwotCXByaW50X2luc25fc3BhcmMoaSwgaW5mbyk7Ci0gICAgICAgIGlmIChpID49IDB4ZmZmZmZmZmMpIGJyZWFrOwotCXByaW50ZigiXG4iKTsKLSAgICB9Ci19Ci0KLWludAotYnVmZmVyX3JlYWRfbWVtb3J5KGFkZHIsIGJ1ZmZlciwgc2l6ZSwgaW5mbykKLSAgICBiZmRfdm1hICAgICAgICAgYWRkcjsKLSAgICBiZmRfYnl0ZSAgICAgICAqYnVmZmVyOwotICAgIHVpbnQzMiAgICAgICAgICBzaXplOwotICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAgIGlmIChzaXplID09IHNpc19tZW1vcnlfcmVhZChhZGRyLCBidWZmZXIsIHNpemUpKQotCXJldHVybiAoMCk7Ci0gICAgZWxzZQotCXJldHVybiAoMSk7Ci19Ci0KLXZvaWQKLXBlcnJvcl9tZW1vcnkoc3RhdHVzLCBhZGRyLCBpbmZvKQotICAgIGludDMyICAgICAgICAgICBzdGF0dXM7Ci0gICAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLSAgICBwcmludGYoIkNvdWxkIG5vdCByZWFkIGFkZHJlc3MgMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSBhZGRyKTsKLX0KLQotdm9pZAotZ2VuZXJpY19wcmludF9hZGRyZXNzKGFkZHIsIGluZm8pCi0gICAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLSAgICBwcmludGYoIjB4JXgiLCAodW5zaWduZWQgaW50KSBhZGRyKTsKLX0KLQotLyogSnVzdCByZXR1cm4gdGhlIGdpdmVuIGFkZHJlc3MuICAqLwotCi1pbnQKLWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gMTsKLX0KLQotCi0vKiBBZGQgZXZlbnQgdG8gZXZlbnQgcXVldWUgKi8KLQotdm9pZAotZXZlbnQoY2Z1bmMsIGFyZywgZGVsdGEpCi0gICAgdm9pZCAgICAgICAgICAgICgqY2Z1bmMpICgpOwotICAgIGludDMyICAgICAgICAgICBhcmc7Ci0gICAgdWludDMyICAgICAgICAgIGRlbHRhOwotewotICAgIHN0cnVjdCBldmNlbGwgICpldjEsICpldmluczsKLQotICAgIGlmIChlYmFzZS5mcmVlcSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJFcnJvciwgdG9vIG1hbnkgZXZlbnRzIGluIGV2ZW50IHF1ZXVlXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGV2MSA9ICZlYmFzZS5lcTsKLSAgICBkZWx0YSArPSBlYmFzZS5zaW10aW1lOwotICAgIHdoaWxlICgoZXYxLT5ueHQgIT0gTlVMTCkgJiYgKGV2MS0+bnh0LT50aW1lIDw9IGRlbHRhKSkgewotCWV2MSA9IGV2MS0+bnh0OwotICAgIH0KLSAgICBpZiAoZXYxLT5ueHQgPT0gTlVMTCkgewotCWV2MS0+bnh0ID0gZWJhc2UuZnJlZXE7Ci0JZWJhc2UuZnJlZXEgPSBlYmFzZS5mcmVlcS0+bnh0OwotCWV2MS0+bnh0LT5ueHQgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0JZXZpbnMgPSBlYmFzZS5mcmVlcTsKLQllYmFzZS5mcmVlcSA9IGViYXNlLmZyZWVxLT5ueHQ7Ci0JZXZpbnMtPm54dCA9IGV2MS0+bnh0OwotCWV2MS0+bnh0ID0gZXZpbnM7Ci0gICAgfQotICAgIGV2MS0+bnh0LT50aW1lID0gZGVsdGE7Ci0gICAgZXYxLT5ueHQtPmNmdW5jID0gY2Z1bmM7Ci0gICAgZXYxLT5ueHQtPmFyZyA9IGFyZzsKLX0KLQotI2lmIDAJLyogYXBwYXJlbnRseSBub3QgdXNlZCAqLwotdm9pZAotc3RvcF9ldmVudCgpCi17Ci19Ci0jZW5kaWYKLQotdm9pZAotaW5pdF9ldmVudCgpCi17Ci0gICAgaW50MzIgICAgICAgICAgIGk7Ci0KLSAgICBlYmFzZS5lcS5ueHQgPSBOVUxMOwotICAgIGViYXNlLmZyZWVxID0gZXZidWY7Ci0gICAgZm9yIChpID0gMDsgaSA8IEVWRU5UX01BWDsgaSsrKSB7Ci0JZXZidWZbaV0ubnh0ID0gJmV2YnVmW2kgKyAxXTsKLSAgICB9Ci0gICAgZXZidWZbRVZFTlRfTUFYIC0gMV0ubnh0ID0gTlVMTDsKLX0KLQotdm9pZAotc2V0X2ludChsZXZlbCwgY2FsbGJhY2ssIGFyZykKLSAgICBpbnQzMiAgICAgICAgICAgbGV2ZWw7Ci0gICAgdm9pZCAgICAgICAgICAgICgqY2FsbGJhY2spICgpOwotICAgIGludDMyICAgICAgICAgICBhcmc7Ci17Ci0gICAgaXJxYXJyW2xldmVsICYgMHgwZl0uY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICBpcnFhcnJbbGV2ZWwgJiAweDBmXS5hcmcgPSBhcmc7Ci19Ci0KLS8qIEFkdmFuY2Ugc2ltdWxhdG9yIHRpbWUgKi8KLQotdm9pZAotYWR2YW5jZV90aW1lKHNyZWdzKQotICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKLXsKLQotICAgIHN0cnVjdCBldmNlbGwgICpldnJlbTsKLSAgICB2b2lkICAgICAgICAgICAgKCpjZnVuYykgKCk7Ci0gICAgdWludDMyICAgICAgICAgIGFyZywgZW5kdGltZTsKLQotI2lmZGVmIFNUQVQKLSAgICBzcmVncy0+ZmhvbGR0ICs9IHNyZWdzLT5maG9sZDsKLSAgICBzcmVncy0+aG9sZHQgKz0gc3JlZ3MtPmhvbGQ7Ci0gICAgc3JlZ3MtPmljbnR0ICs9IHNyZWdzLT5pY250OwotI2VuZGlmCi0KLSAgICBlbmR0aW1lID0gZWJhc2Uuc2ltdGltZSArIHNyZWdzLT5pY250ICsgc3JlZ3MtPmhvbGQgKyBzcmVncy0+ZmhvbGQ7Ci0KLSAgICB3aGlsZSAoKGViYXNlLmVxLm54dC0+dGltZSA8PSAoZW5kdGltZSkpICYmIChlYmFzZS5lcS5ueHQgIT0gTlVMTCkpIHsKLQllYmFzZS5zaW10aW1lID0gZWJhc2UuZXEubnh0LT50aW1lOwotCWNmdW5jID0gZWJhc2UuZXEubnh0LT5jZnVuYzsKLQlhcmcgPSBlYmFzZS5lcS5ueHQtPmFyZzsKLQlldnJlbSA9IGViYXNlLmVxLm54dDsKLQllYmFzZS5lcS5ueHQgPSBlYmFzZS5lcS5ueHQtPm54dDsKLQlldnJlbS0+bnh0ID0gZWJhc2UuZnJlZXE7Ci0JZWJhc2UuZnJlZXEgPSBldnJlbTsKLQljZnVuYyhhcmcpOwotICAgIH0KLSAgICBlYmFzZS5zaW10aW1lID0gZW5kdGltZTsKLQotfQotCi11aW50MzIKLW5vdygpCi17Ci0gICAgcmV0dXJuKGViYXNlLnNpbXRpbWUpOwotfQotCi0KLS8qIEFkdmFuY2UgdGltZSB1bnRpbCBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgc2VlbiAqLwotCi1pbnQKLXdhaXRfZm9yX2lycSgpCi17Ci0gICAgc3RydWN0IGV2Y2VsbCAgKmV2cmVtOwotICAgIHZvaWQgICAgICAgICAgICAoKmNmdW5jKSAoKTsKLSAgICBpbnQzMiAgICAgICAgICAgYXJnLCBlbmR0aW1lOwotCi0gICAgaWYgKGViYXNlLmVxLm54dCA9PSBOVUxMKQotCXByaW50ZigiV2FybmluZzogZXZlbnQgcXVldWUgZW1wdHkgLSBwb3dlci1kb3duIG1vZGUgbm90IGVudGVyZWRcbiIpOwotICAgIGVuZHRpbWUgPSBlYmFzZS5zaW10aW1lOwotICAgIHdoaWxlICghZXh0X2lybCAmJiAoZWJhc2UuZXEubnh0ICE9IE5VTEwpKSB7Ci0JZWJhc2Uuc2ltdGltZSA9IGViYXNlLmVxLm54dC0+dGltZTsKLQljZnVuYyA9IGViYXNlLmVxLm54dC0+Y2Z1bmM7Ci0JYXJnID0gZWJhc2UuZXEubnh0LT5hcmc7Ci0JZXZyZW0gPSBlYmFzZS5lcS5ueHQ7Ci0JZWJhc2UuZXEubnh0ID0gZWJhc2UuZXEubnh0LT5ueHQ7Ci0JZXZyZW0tPm54dCA9IGViYXNlLmZyZWVxOwotCWViYXNlLmZyZWVxID0gZXZyZW07Ci0JY2Z1bmMoYXJnKTsKLQlpZiAoY3RybF9jKSB7Ci0JICAgIHByaW50ZigiXGJ3YXJuaW5nOiBwb3dlci1kb3duIG1vZGUgaW50ZXJydXB0ZWRcbiIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIHNyZWdzLnB3ZHRpbWUgKz0gZWJhc2Uuc2ltdGltZSAtIGVuZHRpbWU7Ci0gICAgcmV0dXJuIChlYmFzZS5zaW10aW1lIC0gZW5kdGltZSk7Ci19Ci0KLWludAotY2hlY2tfYnB0KHNyZWdzKQotICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKLXsKLSAgICBpbnQzMiAgICAgICAgICAgaTsKLQotICAgIGlmICgoc3JlZ3MtPmJwaGl0KSB8fCAoc3JlZ3MtPmFubnVsKSkKLQlyZXR1cm4gKDApOwotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50MzIpIHNyZWdzLT5icHRudW07IGkrKykgewotCWlmIChzcmVncy0+cGMgPT0gc3JlZ3MtPmJwdHNbaV0pCi0JICAgIHJldHVybiAoQlBUX0hJVCk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLXJlc2V0X2FsbCgpCi17Ci0gICAgaW5pdF9ldmVudCgpOwkJLyogQ2xlYXIgZXZlbnQgcXVldWUgKi8KLSAgICBpbml0X3JlZ3MoJnNyZWdzKTsKLSAgICByZXNldCgpOwotI2lmZGVmIEVSUklOSgotICAgIGVycmluanN0YXJ0KCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotc3lzX3Jlc2V0KCkKLXsKLSAgICByZXNldF9hbGwoKTsKLSAgICBzcmVncy50cmFwID0gMjU2OwkJLyogRm9yY2UgZmFrZSByZXNldCB0cmFwICovCi19Ci0KLXZvaWQKLXN5c19oYWx0KCkKLXsKLSAgICBzcmVncy50cmFwID0gMjU3OyAgICAgICAgICAgLyogRm9yY2UgZmFrZSBoYWx0IHRyYXAgKi8KLX0KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBtaW4oQSwgQikgKCgoQSkgPCAoQikpID8gKEEpIDogKEIpKQotI2RlZmluZSBMT0FEX0FERFJFU1MgMAotCi1pbnQKLWJmZF9sb2FkKGZuYW1lKQotICAgIGNoYXIgICAgICAgICAgICpmbmFtZTsKLXsKLSAgICBhc2VjdGlvbiAgICAgICAqc2VjdGlvbjsKLSAgICBiZmQgICAgICAgICAgICAqcGJmZDsKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7Ci0KLSAgICBwYmZkID0gYmZkX29wZW5yKGZuYW1lLCAwKTsKLQotICAgIGlmIChwYmZkID09IE5VTEwpIHsKLQlwcmludGYoIm9wZW4gb2YgJXMgZmFpbGVkXG4iLCBmbmFtZSk7Ci0JcmV0dXJuICgtMSk7Ci0gICAgfQotICAgIGlmICghYmZkX2NoZWNrX2Zvcm1hdChwYmZkLCBiZmRfb2JqZWN0KSkgewotCXByaW50ZigiZmlsZSAlcyAgZG9lc24ndCBzZWVtIHRvIGJlIGFuIG9iamVjdCBmaWxlXG4iLCBmbmFtZSk7Ci0JcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgYXJjaCA9IGJmZF9nZXRfYXJjaF9pbmZvIChwYmZkKTsKLSAgICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKHBiZmQpIHx8IGFyY2gtPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKQotICAgICAgICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID0gTElUVExFX0VORElBTjsKLSAgICBlbHNlCi0JY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47Ci0gICAgaWYgKHNpc192ZXJib3NlKQotCXByaW50ZigiZmlsZSAlcyBpcyAlcy1lbmRpYW4uXG4iLCBmbmFtZSwKLQkgICAgICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9PSBCSUdfRU5ESUFOID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICBpZiAoc2lzX3ZlcmJvc2UpCi0JcHJpbnRmKCJsb2FkaW5nICVzOiIsIGZuYW1lKTsKLSAgICBmb3IgKHNlY3Rpb24gPSBwYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpIHsKLQlpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKHBiZmQsIHNlY3Rpb24pICYgU0VDX0FMTE9DKSB7Ci0JICAgIGJmZF92bWEgICAgICAgICBzZWN0aW9uX2FkZHJlc3M7Ci0JICAgIHVuc2lnbmVkIGxvbmcgICBzZWN0aW9uX3NpemU7Ci0JICAgIGNvbnN0IGNoYXIgICAgICpzZWN0aW9uX25hbWU7Ci0KLQkgICAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUocGJmZCwgc2VjdGlvbik7Ci0KLQkgICAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldF9zZWN0aW9uX3ZtYShwYmZkLCBzZWN0aW9uKTsKLQkgICAgLyoKLQkgICAgICogQWRqdXN0IHNlY3Rpb25zIGZyb20gYS5vdXQgZmlsZXMsIHNpbmNlIHRoZXkgZG9uJ3QgY2FycnkgdGhlaXIKLQkgICAgICogYWRkcmVzc2VzIHdpdGguCi0JICAgICAqLwotCSAgICBpZiAoYmZkX2dldF9mbGF2b3VyKHBiZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSB7Ci0JCWlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJICAgIHNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocGJmZCk7Ci0JCWVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiLmRhdGEiKSA9PSAwKSB7Ci0JCSAgICAvKiBSZWFkIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBkYXRhIHNlY3Rpb24uCi0JCSAgICAgICBUaGVyZSBzaG91bGQgYmUgdGhlIHN0cmluZyAnRGFUYScgZm9sbG93ZWQgYnkKLQkJICAgICAgIGEgd29yZCBjb250YWluaW5nIHRoZSBhY3R1YWwgc2VjdGlvbiBhZGRyZXNzLiAqLwotCQkgICAgc3RydWN0IGRhdGFfbWFya2VyCi0JCSAgICB7Ci0JCQljaGFyIHNpZ25hdHVyZVs0XTsJLyogJ0RhVGEnICovCi0JCQl1bnNpZ25lZCBjaGFyIHNkYXRhWzRdOwkvKiAmc2RhdGEgKi8KLQkJICAgIH0gbWFya2VyOwotCQkgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChwYmZkLCBzZWN0aW9uLCAmbWFya2VyLCAwLAotCQkJCQkgICAgICBzaXplb2YgKG1hcmtlcikpOwotCQkgICAgaWYgKHN0cm5jbXAgKG1hcmtlci5zaWduYXR1cmUsICJEYVRhIiwgNCkgPT0gMCkKLQkJICAgICAgewotCQkJaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gQklHX0VORElBTikKLQkJCSAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldGIzMiAobWFya2VyLnNkYXRhKTsKLQkJCWVsc2UKLQkJCSAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldGwzMiAobWFya2VyLnNkYXRhKTsKLQkJICAgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgICBzZWN0aW9uX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplKHBiZmQsIHNlY3Rpb24pOwotCi0JICAgIGlmIChzaXNfdmVyYm9zZSkKLQkJcHJpbnRmKCJcbnNlY3Rpb24gJXMgYXQgMHglMDhseCAoMHglbHggYnl0ZXMpIiwKLQkJICAgICAgIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9hZGRyZXNzLCBzZWN0aW9uX3NpemUpOwotCi0JICAgIC8qIFRleHQsIGRhdGEgb3IgbGl0ICovCi0JICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MocGJmZCwgc2VjdGlvbikgJiBTRUNfTE9BRCkgewotCQlmaWxlX3B0ciAgICAgICAgZnB0cjsKLQotCQlmcHRyID0gMDsKLQotCQl3aGlsZSAoc2VjdGlvbl9zaXplID4gMCkgewotCQkgICAgY2hhciAgICAgICAgICAgIGJ1ZmZlclsxMDI0XTsKLQkJICAgIGludCAgICAgICAgICAgICBjb3VudDsKLQotCQkgICAgY291bnQgPSBtaW4oc2VjdGlvbl9zaXplLCAxMDI0KTsKLQotCQkgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKHBiZmQsIHNlY3Rpb24sIGJ1ZmZlciwgZnB0ciwgY291bnQpOwotCi0JCSAgICBzaXNfbWVtb3J5X3dyaXRlKHNlY3Rpb25fYWRkcmVzcywgYnVmZmVyLCBjb3VudCk7Ci0KLQkJICAgIHNlY3Rpb25fYWRkcmVzcyArPSBjb3VudDsKLQkJICAgIGZwdHIgKz0gY291bnQ7Ci0JCSAgICBzZWN0aW9uX3NpemUgLT0gY291bnQ7Ci0JCX0KLQkgICAgfSBlbHNlCQkvKiBCU1MgKi8KLQkJaWYgKHNpc192ZXJib3NlKQotCQkgICAgcHJpbnRmKCIobm90IGxvYWRlZCkiKTsKLQl9Ci0gICAgfQotICAgIGlmIChzaXNfdmVyYm9zZSkKLQlwcmludGYoIlxuIik7Ci0KLSAgICByZXR1cm4oYmZkX2dldF9zdGFydF9hZGRyZXNzIChwYmZkKSk7Ci19CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvaGVscC5jIGIvc2ltL2VyYzMyL2hlbHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZWU3Yy4uMDAwMDAwMAotLS0gYS9zaW0vZXJjMzIvaGVscC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAic2lzLmgiCi0KLXZvaWQKLXVzYWdlKCkKLXsKLQotICAgIHByaW50ZigidXNhZ2U6IHNpcyBbLXVhcnQxIHVhcnRfZGV2aWNlMV0gWy11YXJ0MiB1YXJ0X2RldmljZTJdXG4iKTsKLSAgICBwcmludGYoIlstbmZwXSBbLWZyZXEgZnJlcXVlbmN5XSBbLWMgYmF0Y2hfZmlsZV0gW2ZpbGVzXVxuIik7Ci0gICAgcHJpbnRmKCJbLXNwYXJjbGl0ZV0gWy1kdW1iaW9dXG4iKTsKLX0KLQotdm9pZAotZ2VuX2hlbHAoKQotewotCi0gIHByaW50ZigiXG4gYmF0Y2ggPGZpbGU+ICAgICAgICAgIGV4ZWN1dGUgYSBiYXRjaCBmaWxlIG9mIFNJUyBjb21tYW5kc1xuIik7Ci0gICAgcHJpbnRmKCIgK2JwIDxhZGRyPiAgICAgICAgICAgIGFkZCBhIGJyZWFrcG9pbnQgYXQgPGFkZHI+XG4iKTsKLSAgICBwcmludGYoIiAtYnAgPG51bT4gICAgICAgICAgICAgZGVsZXRlIGJyZWFrcG9pbnQgPG51bT5cbiIpOwotICAgIHByaW50ZigiIGJwICAgICAgICAgICAgICAgICAgICBwcmludCBhbGwgYnJlYWtwb2ludHNcbiIpOwotICAgIHByaW50ZigiIGNvbnQgW2ljbnRdICAgICAgICAgICBjb250aW51ZSBleGVjdXRpb24gZm9yIFtpY250XSBpbnN0cnVjdGlvbnNcbiIpOwotICAgIHByaW50ZigiIGRlYiA8bGV2ZWw+ICAgICAgICAgICBzZXQgZGVidWcgbGV2ZWxcbiIpOwotICAgIHByaW50ZigiIGRpcyBbYWRkcl0gW2NvdW50XSAgICBkaXNhc3NlbWJsZSBbY291bnRdIGluc3RydWN0aW9ucyBhdCBhZGRyZXNzIFthZGRyXVxuIik7Ci0gICAgcHJpbnRmKCIgZWNobyA8c3RyaW5nPiAgICAgICAgIHByaW50IDxzdHJpbmc+IHRvIHRoZSBzaW11bGF0b3Igd2luZG93XG4iKTsKLSNpZmRlZiBFUlJJTkoKLSAgICBwcmludGYoIiBlcnJvciA8cGVyaW9kPiAgICAgICAgaW5qZWN0IGVycm9yIHRyYXBzIGluIElVIGFuZCBGUFVcbiIpOwotI2VuZGlmCi0gICAgcHJpbnRmKCIgZmxvYXQgICAgICAgICAgICAgICAgIHByaW50IHRoZSBGUFUgcmVnaXN0ZXJzXG4iKTsKLSAgICBwcmludGYoIiBnbyA8YWRkcj4gW2ljbnRdICAgICAgc3RhcnQgZXhlY3V0aW9uIGF0IDxhZGRyPiBmb3IgW2ljbnRdIGluc3RydWN0aW9uc1xuIik7Ci0gICAgcHJpbnRmKCIgaGlzdCBbdHJhY2VfbGVuZ3RoXSAgIGVuYWJsZS9zaG93IHRyYWNlIGhpc3RvcnlcbiIpOwotICAgIHByaW50ZigiIGxvYWQgIDxmaWxlX25hbWU+ICAgICBsb2FkIGEgZmlsZSBpbnRvIHNpbXVsYXRvciBtZW1vcnlcbiIpOwotICAgIHByaW50ZigiIG1lbSBbYWRkcl0gW2NvdW50XSAgICBkaXNwbGF5IG1lbW9yeSBhdCBbYWRkcl0gZm9yIFtjb3VudF0gYnl0ZXNcbiIpOwotICAgIHByaW50ZigiIHF1aXQgICAgICAgICAgICAgICAgICBleGl0IHRoZSBzaW11bGF0b3JcbiIpOwotICAgIHByaW50ZigiIHBlcmYgW3Jlc2V0XSAgICAgICAgICBzaG93L3Jlc2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3NcbiIpOwotICAgIHByaW50ZigiIHJlZyBbdzwwLTc+XSAgICAgICAgICBzaG93IGludGVnZXIgcmVnaXN0ZXJzIChvciB3aW5kb3dzLCBlZyAncmUgdzInKVxuIik7Ci0gICAgcHJpbnRmKCIgcnVuIFtpbnN0X2NvdW50XSAgICAgIHJlc2V0IGFuZCBzdGFydCBleGVjdXRpb24gZm9yIFtpY250XSBpbnN0cnVjdGlvblxuIik7Ci0gICAgcHJpbnRmKCIgc3RlcCAgICAgICAgICAgICAgICAgIHNpbmdsZSBzdGVwXG4iKTsKLSAgICBwcmludGYoIiB0cmEgW2luc3RfY291bnRdICAgICAgdHJhY2UgW2luc3RfY291bnRdIGluc3RydWN0aW9uc1xuIik7Ci0gICAgcHJpbnRmKCJcbiB0eXBlIEN0cmwtQyB0byBpbnRlcnJ1cHQgZXhlY3V0aW9uXG5cbiIpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2ludGVyZi5jIGIvc2ltL2VyYzMyL2ludGVyZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE3ODFlLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9pbnRlcmYuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgotICogCi0gKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMS42IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCi0gKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQotICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvZmNudGwuaD4KLSNpbmNsdWRlICJzaXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlIDxkaXMtYXNtLmg+Ci0jaW5jbHVkZSAic2ltLWNvbmZpZy5oIgotCi0jaW5jbHVkZSAicmVtb3RlLXNpbS5oIgotCi0jaWZuZGVmIGZwcmludGYKLWV4dGVybiAgICAgICAgICBmcHJpbnRmKCk7Ci0jZW5kaWYKLQotI2RlZmluZSBQU1JfQ1dQIDB4NwotCi0jZGVmaW5lCVZBTCh4KQlzdHJ0b2woeCwoY2hhciAqKilOVUxMLDApCi0KLWV4dGVybiBjaGFyICAgKipidWlsZGFyZ3YoY2hhciAqaW5wdXQpOwotCi1leHRlcm4gc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGluZm87Ci1leHRlcm4gc3RydWN0IHBzdGF0ZSBzcmVnczsKLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotCi1leHRlcm4gaW50CWN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXI7Ci1leHRlcm4gaW50ICAgICAgY3RybF9jOwotZXh0ZXJuIGludCAgICAgIG5mcDsKLWV4dGVybiBpbnQgICAgICBpZnQ7Ci1leHRlcm4gaW50ICAgICAgcm9tODsKLWV4dGVybiBpbnQgICAgICB3cnA7Ci1leHRlcm4gaW50ICAgICAgdWJlbjsKLWV4dGVybiBpbnQgICAgICBzaXNfdmVyYm9zZTsKLWV4dGVybiBjaGFyICAgICpzaXNfdmVyc2lvbjsKLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotZXh0ZXJuIHN0cnVjdCBldmNlbGwgZXZidWZbXTsKLWV4dGVybiBzdHJ1Y3QgaXJxY2VsbCBpcnFhcnJbXTsKLWV4dGVybiBpbnQgICAgICBpcnFwZW5kLCBleHRfaXJsOwotZXh0ZXJuIGludCAgICAgIHNwYXJjbGl0ZTsKLWV4dGVybiBpbnQgICAgICBkdW1iaW87Ci1leHRlcm4gaW50ICAgICAgc3BhcmNsaXRlX2JvYXJkOwotZXh0ZXJuIGludCAgICAgIHRlcm1zYXZlOwotZXh0ZXJuIGNoYXIgICAgIHVhcnRfZGV2MVtdLCB1YXJ0X2RldjJbXTsKLQotaW50ICAgICAgICAgICAgIHNpc19nZGJfYnJlYWsgPSAxOwotCi1ob3N0X2NhbGxiYWNrICpzaW1fY2FsbGJhY2s7Ci0KLWludAotcnVuX3NpbShzcmVncywgaWNvdW50LCBkaXMpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotICAgIHVuc2lnbmVkIGludCAgICBpY291bnQ7Ci0gICAgaW50ICAgICAgICAgICAgIGRpczsKLXsKLSAgICBpbnQgICAgICAgICAgICAgbWV4YywgaXJxOwotCi0gICAgaWYgKHNpc192ZXJib3NlKQotCSgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJyZXN1bWluZyBhdCAleFxuIiwKLQkJCQkJICBzcmVncy0+cGMpOwotICAgaW5pdF9zdGRpbygpOwotICAgc3JlZ3MtPnN0YXJ0dGltZSA9IHRpbWUoTlVMTCk7Ci0gICBpcnEgPSAwOwotICAgd2hpbGUgKCFzcmVncy0+ZXJyX21vZGUgJiAoaWNvdW50ID4gMCkpIHsKLQotCXNyZWdzLT5maG9sZCA9IDA7Ci0Jc3JlZ3MtPmhvbGQgPSAwOwotCXNyZWdzLT5pY250ID0gMTsKLQotICAgICAgICBpZiAoc3JlZ3MtPnBzciAmIDB4MDgwKQotICAgICAgICAgICAgc3JlZ3MtPmFzaSA9IDg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNyZWdzLT5hc2kgPSA5OwotCi0jaWYgMAkvKiBERUxFVEUgTUUhIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLwotICAgICAgICBpZiAoc2lzX3ZlcmJvc2UgPiAxKQotICAgICAgICAgICAgaWYgKHNyZWdzLT5wYyA9PSAwIHx8IHNyZWdzLT5ucGMgPT0gMCkKLSAgICAgICAgICAgICAgICBwcmludGYgKCJib2d1cyBwYyBvciBucGNcbiIpOwotI2VuZGlmCi0gICAgICAgIG1leGMgPSBtZW1vcnlfcmVhZChzcmVncy0+YXNpLCBzcmVncy0+cGMsICZzcmVncy0+aW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICZzcmVncy0+aG9sZCk7Ci0jaWYgMQkvKiBERUxFVEUgTUUhIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLwotICAgICAgICBpZiAoc2lzX3ZlcmJvc2UgPiAyKQotICAgICAgICAgICAgcHJpbnRmKCJwYyAleCwgbnAgJXgsIHNwICV4LCBmcCAleCwgd20gJXgsIGN3ICV4LCBpICUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgc3JlZ3MtPnBjLCBzcmVncy0+bnBjLAotICAgICAgICAgICAgICAgICAgIHNyZWdzLT5yWygoKHNyZWdzLT5wc3IgJiA3KSA8PCA0KSArIDE0KSAmIDB4N2ZdLAotICAgICAgICAgICAgICAgICAgIHNyZWdzLT5yWygoKHNyZWdzLT5wc3IgJiA3KSA8PCA0KSArIDMwKSAmIDB4N2ZdLAotICAgICAgICAgICAgICAgICAgIHNyZWdzLT53aW0sCi0gICAgICAgICAgICAgICAgICAgc3JlZ3MtPnBzciAmIDcsCi0gICAgICAgICAgICAgICAgICAgc3JlZ3MtPmluc3QpOwotI2VuZGlmCi0gICAgICAgIGlmIChzcmVncy0+YW5udWwpIHsKLSAgICAgICAgICAgIHNyZWdzLT5hbm51bCA9IDA7Ci0gICAgICAgICAgICBzcmVncy0+aWNudCA9IDE7Ci0gICAgICAgICAgICBzcmVncy0+cGMgPSBzcmVncy0+bnBjOwotICAgICAgICAgICAgc3JlZ3MtPm5wYyA9IHNyZWdzLT5ucGMgKyA0OwotICAgICAgICB9IGVsc2UgewotCSAgICBpZiAoZXh0X2lybCkgaXJxID0gY2hlY2tfaW50ZXJydXB0cyhzcmVncyk7Ci0JICAgIGlmICghaXJxKSB7Ci0JCWlmIChtZXhjKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9IElfQUNDX0VYQzsKLQkJfSBlbHNlIHsKLQkJICAgIGlmICgoc2lzX2dkYl9icmVhaykgJiYgKHNyZWdzLT5pbnN0ID09IDB4OTFkMDIwMDEpKSB7Ci0JCQlpZiAoc2lzX3ZlcmJvc2UpCi0JCQkgICAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkJCQkgICAgICAiU1cgQlAgaGl0IGF0ICV4XG4iLCBzcmVncy0+cGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2ltX2hhbHQoKTsKLQkJCXJlc3RvcmVfc3RkaW8oKTsKLQkJCWNsZWFyZXJyKHN0ZGluKTsKLQkJCXJldHVybiAoQlBUX0hJVCk7Ci0JCSAgICB9IGVsc2UKLQkJCWRpc3BhdGNoX2luc3RydWN0aW9uKHNyZWdzKTsKLQkJfQotCQlpY291bnQtLTsKLQkgICAgfQotCSAgICBpZiAoc3JlZ3MtPnRyYXApIHsKLSAgICAgICAgICAgICAgICBpcnEgPSAwOwotCQlzcmVncy0+ZXJyX21vZGUgPSBleGVjdXRlX3RyYXAoc3JlZ3MpOwotCSAgICB9Ci0JfQotCWFkdmFuY2VfdGltZShzcmVncyk7Ci0JaWYgKGN0cmxfYykgewotCSAgICBpY291bnQgPSAwOwotCX0KLSAgICB9Ci0gICAgc2ltX2hhbHQoKTsKLSAgICBzcmVncy0+dG90dGltZSArPSB0aW1lKE5VTEwpIC0gc3JlZ3MtPnN0YXJ0dGltZTsKLSAgICByZXN0b3JlX3N0ZGlvKCk7Ci0gICAgY2xlYXJlcnIoc3RkaW4pOwotICAgIGlmIChzcmVncy0+ZXJyX21vZGUpCi0JZXJyb3JfbW9kZShzcmVncy0+cGMpOwotICAgIGlmIChzcmVncy0+ZXJyX21vZGUpCi0JcmV0dXJuIChFUlJPUik7Ci0gICAgaWYgKHNyZWdzLT5icGhpdCkgewotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkJICAgICAgIkhXIEJQIGhpdCBhdCAleFxuIiwgc3JlZ3MtPnBjKTsKLQlyZXR1cm4gKEJQVF9ISVQpOwotICAgIH0KLSAgICBpZiAoY3RybF9jKSB7Ci0JY3RybF9jID0gMDsKLQlyZXR1cm4gKENUUkxfQyk7Ci0gICAgfQotICAgIHJldHVybiAoVElNRV9PVVQpOwotfQotCi12b2lkCi1zaW1fc2V0X2NhbGxiYWNrcyAocHRyKQotICAgICBob3N0X2NhbGxiYWNrICpwdHI7Ci17Ci0gIHNpbV9jYWxsYmFjayA9IHB0cjsKLX0KLQotdm9pZAotc2ltX3NpemUgKG1lbXNpemUpCi0gICAgIGludCBtZW1zaXplOwotewotfQotCi1TSU1fREVTQwotc2ltX29wZW4gKGtpbmQsIGNhbGxiYWNrLCBhYmZkLCBhcmd2KQotICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7Ci0gICAgIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqY2FsbGJhY2s7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLQotICAgIGludCAgICAgICAgICAgICBhcmdjID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdCA9IDE7Ci0gICAgaW50ICAgICAgICAgICAgIGZyZXEgPSAwOwotCi0gICAgc2ltX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0KLSAgICB3aGlsZSAoYXJndlthcmdjXSkKLSAgICAgIGFyZ2MrKzsKLSAgICB3aGlsZSAoc3RhdCA8IGFyZ2MpIHsKLQlpZiAoYXJndltzdGF0XVswXSA9PSAnLScpIHsKLQkgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXYiKSA9PSAwKSB7Ci0JCXNpc192ZXJib3NlKys7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItbmZwIikgPT0gMCkgewotCQluZnAgPSAxOwotCSAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1pZnQiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWZ0ID0gMTsKLQkgICAgfSBlbHNlCi0JICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1zcGFyY2xpdGUiKSA9PSAwKSB7Ci0JCXNwYXJjbGl0ZSA9IDE7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItc3BhcmNsaXRlLWJvYXJkIikgPT0gMCkgewotCQlzcGFyY2xpdGVfYm9hcmQgPSAxOwotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWR1bWJpbyIpID09IDApIHsKLQkJZHVtYmlvID0gMTsKLQkgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItd3JwIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHdycCA9IDE7Ci0JICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXJvbTgiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcm9tOCA9IDE7Ci0JICAgIH0gZWxzZSAKLSAgICAgICAgICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YmVuIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHViZW4gPSAxOwotCSAgICB9IGVsc2UgCi0JICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MSIpID09IDApIHsKLQkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQotCQkgICAgc3RyY3B5KHVhcnRfZGV2MSwgYXJndlsrK3N0YXRdKTsKLQkgICAgfSBlbHNlCi0JICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MiIpID09IDApIHsKLQkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQotCQkgICAgc3RyY3B5KHVhcnRfZGV2MiwgYXJndlsrK3N0YXRdKTsKLQkgICAgfSBlbHNlCi0JICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1ub2dkYiIpID09IDApIHsKLQkJc2lzX2dkYl9icmVhayA9IDA7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItZnJlcSIpID09IDApIHsKLQkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKSB7Ci0JCSAgICBmcmVxID0gVkFMKGFyZ3ZbKytzdGF0XSk7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkJCSAgInVua25vd24gb3B0aW9uICVzXG4iLAotCQkJCQkJICBhcmd2W3N0YXRdKTsKLQkgICAgfQotCX0gZWxzZQotCSAgICBiZmRfbG9hZChhcmd2W3N0YXRdKTsKLQlzdGF0Kys7Ci0gICAgfQotCi0gICAgaWYgKHNpc192ZXJib3NlKSB7Ci0JKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywgIlxuIFNJUyAtIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciAlc1xuIiwgc2lzX3ZlcnNpb24pOwotCSgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICIgQnVnLXJlcG9ydHMgdG8gSmlyaSBHYWlzbGVyIEVTQS9FU1RFQyAoamdhaXNAd2QuZXN0ZWMuZXNhLm5sKVxuIik7Ci0JaWYgKG5mcCkKLQkgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJubyBGUFVcbiIpOwotCWlmIChzcGFyY2xpdGUpCi0JICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAic2ltdWxhdGluZyBTcGFyY2xpdGVcbiIpOwotCWlmIChkdW1iaW8pCi0JICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiZHVtYiBJTyAobm8gaW5wdXQsIGR1bWIgb3V0cHV0KVxuIik7Ci0JaWYgKHNpc19nZGJfYnJlYWsgPT0gMCkKLQkgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJkaXNhYmxpbmcgR0RCIHRyYXAgaGFuZGxpbmcgZm9yIGJyZWFrcG9pbnRzXG4iKTsKLQlpZiAoZnJlcSkKLQkgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICIgRVJDMzIgZnJlcSAlZCBNaHpcbiIsIGZyZXEpOwotICAgIH0KLQotICAgIHNyZWdzLmZyZXEgPSBmcmVxID8gZnJlcSA6IDE1OwotICAgIHRlcm1zYXZlID0gZmNudGwoMCwgRl9HRVRGTCwgMCk7Ci0gICAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPKGRpbmZvLCBzdGRvdXQsKGZwcmludGZfZnR5cGUpZnByaW50Zik7Ci0gICAgZGluZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0gICAgcmVzZXRfYWxsKCk7Ci0gICAgZWJhc2Uuc2ltdGltZSA9IDA7Ci0gICAgaW5pdF9zaW0oKTsKLSAgICBpbml0X2JwdCgmc3JlZ3MpOwotICAgIHJlc2V0X3N0YXQoJnNyZWdzKTsKLQotICAgIC8qIEZ1ZGdlIG91ciBkZXNjcmlwdG9yIGZvciBub3cuICAqLwotICAgIHJldHVybiAoU0lNX0RFU0MpIDE7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZShzZCwgcXVpdHRpbmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcXVpdHRpbmc7Ci17Ci0KLSAgICBleGl0X3NpbSgpOwotICAgIGZjbnRsKDAsIEZfU0VURkwsIHRlcm1zYXZlKTsKLQotfTsKLQotU0lNX1JDCi1zaW1fbG9hZChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpwcm9nOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgICBiZmRfbG9hZCAocHJvZyk7Ci0gICAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotU0lNX1JDCi1zaW1fY3JlYXRlX2luZmVyaW9yKHNkLCBhYmZkLCBhcmd2LCBlbnYpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci0gICAgIGNoYXIgKiplbnY7Ci17Ci0gICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzID0gMDsKLSAgICBpZiAoYWJmZCAhPSBOVUxMKQotICAgICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgICBlYmFzZS5zaW10aW1lID0gMDsKLSAgICByZXNldF9hbGwoKTsKLSAgICByZXNldF9zdGF0KCZzcmVncyk7Ci0gICAgc3JlZ3MucGMgPSBzdGFydF9hZGRyZXNzICYgfjM7Ci0gICAgc3JlZ3MubnBjID0gc3JlZ3MucGMgKyA0OwotICAgIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyKHNkLCByZWdubywgdmFsdWUsIGxlbmd0aCkKLSAgICBTSU1fREVTQyBzZDsKLSAgICBpbnQgICAgICAgICAgICAgcmVnbm87Ci0gICAgdW5zaWduZWQgY2hhciAgKnZhbHVlOwotICAgIGludCBsZW5ndGg7Ci17Ci0gICAgLyogRklYTUU6IFJldmlldyB0aGUgY29tcHV0YXRpb24gb2YgcmVndmFsLiAgKi8KLSAgICBpbnQgcmVndmFsOwotICAgIGlmIChjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID09IEJJR19FTkRJQU4pCi0JcmVndmFsID0gKHZhbHVlWzBdIDw8IDI0KSB8ICh2YWx1ZVsxXSA8PCAxNikKLQkJIHwgKHZhbHVlWzJdIDw8IDgpIHwgdmFsdWVbM107Ci0gICAgZWxzZQotCXJlZ3ZhbCA9ICh2YWx1ZVszXSA8PCAyNCkgfCAodmFsdWVbMl0gPDwgMTYpCi0JCSB8ICh2YWx1ZVsxXSA8PCA4KSB8IHZhbHVlWzBdOwotICAgIHNldF9yZWdpKCZzcmVncywgcmVnbm8sIHJlZ3ZhbCk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyKHNkLCByZWdubywgYnVmLCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgIGludCAgICAgICAgICAgICByZWdubzsKLSAgICB1bnNpZ25lZCBjaGFyICAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICAgIGdldF9yZWdpKCZzcmVncywgcmVnbm8sIGJ1Zik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXNpbV93cml0ZShzZCwgbWVtLCBidWYsIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgU0lNX0FERFIgICAgICAgICAgICAgbWVtOwotICAgIHVuc2lnbmVkIGNoYXIgICpidWY7Ci0gICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKLXsKLSAgICByZXR1cm4gKHNpc19tZW1vcnlfd3JpdGUobWVtLCBidWYsIGxlbmd0aCkpOwotfQotCi1pbnQKLXNpbV9yZWFkKHNkLCBtZW0sIGJ1ZiwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgbWVtOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gICAgcmV0dXJuIChzaXNfbWVtb3J5X3JlYWQobWVtLCBidWYsIGxlbmd0aCkpOwotfQotCi12b2lkCi1zaW1faW5mbyhzZCwgdmVyYm9zZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCB2ZXJib3NlOwotewotICAgIHNob3dfc3RhdCgmc3JlZ3MpOwotfQotCi1pbnQgICAgICAgICAgICAgc2ltc3RhdCA9IE9LOwotCi12b2lkCi1zaW1fc3RvcF9yZWFzb24oc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICogcmVhc29uOwotICAgICBpbnQgKnNpZ3JjOwotewotCi0gICAgc3dpdGNoIChzaW1zdGF0KSB7Ci0JY2FzZSBDVFJMX0M6Ci0JKnJlYXNvbiA9IHNpbV9zdG9wcGVkOwotCSpzaWdyYyA9IFNJR0lOVDsKLQlicmVhazsKLSAgICBjYXNlIE9LOgotICAgIGNhc2UgVElNRV9PVVQ6Ci0gICAgY2FzZSBCUFRfSElUOgotCSpyZWFzb24gPSBzaW1fc3RvcHBlZDsKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgU0lHVFJBUCA1Ci0jZW5kaWYKLQkqc2lncmMgPSBTSUdUUkFQOwotCWJyZWFrOwotICAgIGNhc2UgRVJST1I6Ci0JKnNpZ3JjID0gMDsKLQkqcmVhc29uID0gc2ltX2V4aXRlZDsKLSAgICB9Ci0gICAgY3RybF9jID0gMDsKLSAgICBzaW1zdGF0ID0gT0s7Ci19Ci0KLS8qIEZsdXNoIGFsbCByZWdpc3RlciB3aW5kb3dzIG91dCB0byB0aGUgc3RhY2suICBTdGFydGluZyBhZnRlciB0aGUgaW52YWxpZAotICAgd2luZG93LCBmbHVzaCBhbGwgd2luZG93cyB1cCB0bywgYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCB3aW5kb3cuICBUaGlzCi0gICBhbGxvd3MgR0RCIHRvIGRvIGJhY2t0cmFjZXMgYW5kIGxvb2sgYXQgbG9jYWwgdmFyaWFibGVzIGZvciBmcmFtZXMgdGhhdAotICAgYXJlIHN0aWxsIGluIHRoZSByZWdpc3RlciB3aW5kb3dzLiAgTm90ZSB0aGF0IHN0cmljdGx5IHNwZWFraW5nLCB0aGlzCi0gICBiZWhhdmlvciBpcyAqd3JvbmcqIGZvciBzZXZlcmFsIHJlYXNvbnMuICBGaXJzdCwgaXQgZG9lc24ndCB1c2UgdGhlIHdpbmRvdwotICAgb3ZlcmZsb3cgaGFuZGxlcnMuICBJdCB0aGVyZWZvcmUgYXNzdW1lcyBzdGFuZGFyZCBmcmFtZSBsYXlvdXRzIGFuZCB3aW5kb3cKLSAgIGhhbmRsaW5nIHBvbGljaWVzLiAgU2Vjb25kLCBpdCBjaGFuZ2VzIHN5c3RlbSBzdGF0ZSBiZWhpbmQgdGhlIGJhY2sgb2YgdGhlCi0gICB0YXJnZXQgcHJvZ3JhbS4gIEkgZXhwZWN0IHRoaXMgdG8gbWFpbmx5IHBvc2UgcHJvYmxlbXMgd2hlbiBkZWJ1Z2dpbmcgdHJhcAotICAgaGFuZGxlcnMuCi0qLwotCi1zdGF0aWMgdm9pZAotZmx1c2hfd2luZG93cyAoKQotewotICBpbnQgaW52d2luOwotICBpbnQgY3dwOwotICBpbnQgd2luOwotICBpbnQgd3M7Ci0KLSAgLyogS2VlcCBjdXJyZW50IHdpbmRvdyBoYW5keSAqLwotCi0gIGN3cCA9IHNyZWdzLnBzciAmIFBTUl9DV1A7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBpbnZhbGlkIHdpbmRvdyBmcm9tIHRoZSB3aW0uICovCi0KLSAgZm9yIChpbnZ3aW4gPSAwOyBpbnZ3aW4gPD0gUFNSX0NXUDsgaW52d2luKyspCi0gICAgaWYgKChzcmVncy53aW0gPj4gaW52d2luKSAmIDEpCi0gICAgICBicmVhazsKLQotICAvKiBTdGFydCBzYXZpbmcgd2l0aCB0aGUgd2luZG93IGFmdGVyIHRoZSBpbnZhbGlkIHdpbmRvdy4gKi8KLQotICBpbnZ3aW4gPSAoaW52d2luIC0gMSkgJiBQU1JfQ1dQOwotCi0gIGZvciAod2luID0gaW52d2luOyA7IHdpbiA9ICh3aW4gLSAxKSAmIFBTUl9DV1ApCi0gICAgewotICAgICAgdWludDMyIHNwOwotICAgICAgaW50IGk7Ci0KLSAgICAgIHNwID0gc3JlZ3Muclsod2luICogMTYgKyAxNCkgJiAweDdmXTsKLSNpZiAxCi0gICAgICBpZiAoc2lzX3ZlcmJvc2UgPiAyKSB7Ci0JdWludDMyIGZwID0gc3JlZ3Muclsod2luICogMTYgKyAzMCkgJiAweDdmXTsKLQlwcmludGYoImZsdXNoX3dpbmRvdzogd2luICVkLCBzcCAleCwgZnAgJXhcbiIsIHdpbiwgc3AsIGZwKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQltZW1vcnlfd3JpdGUgKDExLCBzcCArIDQgKiBpLCAmc3JlZ3Muclsod2luICogMTYgKyAxNiArIGkpICYgMHg3Zl0sIDIsCi0JCSAgICAgICZ3cyk7Ci0KLSAgICAgIGlmICh3aW4gPT0gY3dwKQotCWJyZWFrOwotICAgIH0KLX0KLQotdm9pZAotc2ltX3Jlc3VtZShTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKQotewotICAgIHNpbXN0YXQgPSBydW5fc2ltKCZzcmVncywgLTEsIDApOwotCi0gICAgaWYgKHNpc19nZGJfYnJlYWspIGZsdXNoX3dpbmRvd3MgKCk7Ci19Ci0KLWludAotc2ltX3RyYWNlIChzZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0gIC8qIEZJWE1FOiB1bmZpbmlzaGVkICovCi0gIHNpbV9yZXN1bWUgKHNkLCAwLCAwKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLXNpbV9kb19jb21tYW5kKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgIGNoYXIgICAgICAgICAgICpjbWQ7Ci17Ci0gICAgZXhlY19jbWQoJnNyZWdzLCBjbWQpOwotfQotCi0jaWYgMCAvKiBGSVhNRTogVGhlc2Ugc2hvdWxkbid0IGV4aXN0LiAgKi8KLQotaW50Ci1zaW1faW5zZXJ0X2JyZWFrcG9pbnQoaW50IGFkZHIpCi17Ci0gICAgaWYgKHNyZWdzLmJwdG51bSA8IEJQVF9NQVgpIHsKLQlzcmVncy5icHRzW3NyZWdzLmJwdG51bV0gPSBhZGRyICYgfjB4MzsKLQlzcmVncy5icHRudW0rKzsKLQlpZiAoc2lzX3ZlcmJvc2UpCi0JICAgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJpbnNlcnRlZCBIVyBCUCBhdCAleFxuIiwgYWRkcik7Ci0JcmV0dXJuIDA7Ci0gICAgfSBlbHNlCi0JcmV0dXJuIDE7Ci19Ci0KLWludAotc2ltX3JlbW92ZV9icmVha3BvaW50KGludCBhZGRyKQotewotICAgIGludCAgICAgICAgICAgICBpID0gMDsKLQotICAgIHdoaWxlICgoaSA8IHNyZWdzLmJwdG51bSkgJiYgKHNyZWdzLmJwdHNbaV0gIT0gYWRkcikpCi0JaSsrOwotICAgIGlmIChhZGRyID09IHNyZWdzLmJwdHNbaV0pIHsKLQlmb3IgKDsgaSA8IHNyZWdzLmJwdG51bSAtIDE7IGkrKykKLQkgICAgc3JlZ3MuYnB0c1tpXSA9IHNyZWdzLmJwdHNbaSArIDFdOwotCXNyZWdzLmJwdG51bSAtPSAxOwotCWlmIChzaXNfdmVyYm9zZSkKLQkgICAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywgInJlbW92ZWQgSFcgQlAgYXQgJXhcbiIsIGFkZHIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvc2lzLmMgYi9zaW0vZXJjMzIvc2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Njc4ODEuLjAwMDAwMDAKLS0tIGEvc2ltL2VyYzMyL3Npcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBTSVMuCi0gKiAKLSAqIFNJUywgU1BBUkMgaW5zdHJ1Y3Rpb24gc2ltdWxhdG9yLiBDb3B5cmlnaHQgKEMpIDE5OTUgSmlyaSBHYWlzbGVyLCBFdXJvcGVhbgotICogU3BhY2UgQWdlbmN5Ci0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUKLSAqIE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2ZjbnRsLmg+Ci0jaW5jbHVkZSAic2lzLmgiCi0jaW5jbHVkZSA8ZGlzLWFzbS5oPgotI2luY2x1ZGUgInNpbS1jb25maWcuaCIKLQotI2lmbmRlZiBmcHJpbnRmCi1leHRlcm4gICAgICAgICAgZnByaW50ZigpOwotI2VuZGlmCi0KLSNkZWZpbmUJVkFMKHgpCXN0cnRvbCh4LChjaGFyICoqKU5VTEwsMCkKLQotLyogU3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZyb20gcmVhZGxpbmUgbGlicmFyeSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKmxpbmU7Ci0gIGNoYXIgKmRhdGE7Ci19IEhJU1RfRU5UUlk7Ci0KLWV4dGVybiBjaGFyICoJcmVhZGxpbmUgUEFSQU1TICgoY2hhciAqcHJvbXB0KSk7Ci1leHRlcm4gdm9pZAl1c2luZ19oaXN0b3J5IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkCWFkZF9oaXN0b3J5IFBBUkFNUyAoKGNoYXIgKnN0cmluZykpOwotZXh0ZXJuIEhJU1RfRU5UUlkgKnJlbW92ZV9oaXN0b3J5IFBBUkFNUyAoKGludCB3aGljaCkpOwotCi0KLQotLyogQ29tbWFuZCBoaXN0b3J5IGJ1ZmZlciBsZW5ndGggLSBNVVNUIGJlIGJpbmFyeSAqLwotI2RlZmluZSBISVNUX0xFTgk2NAotCi1leHRlcm4gc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGluZm87Ci1leHRlcm4gc3RydWN0IHBzdGF0ZSBzcmVnczsKLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotCi1leHRlcm4gaW50ICAgICAgY3RybF9jOwotZXh0ZXJuIGludCAgICAgIG5mcDsKLWV4dGVybiBpbnQgICAgICBpZnQ7Ci1leHRlcm4gaW50ICAgICAgd3JwOwotZXh0ZXJuIGludCAgICAgIHJvbTg7Ci1leHRlcm4gaW50ICAgICAgdWJlbjsKLWV4dGVybiBpbnQgICAgICBzaXNfdmVyYm9zZTsKLWV4dGVybiBjaGFyICAgICpzaXNfdmVyc2lvbjsKLWV4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOwotZXh0ZXJuIHN0cnVjdCBldmNlbGwgZXZidWZbXTsKLWV4dGVybiBzdHJ1Y3QgaXJxY2VsbCBpcnFhcnJbXTsKLWV4dGVybiBpbnQgICAgICBpcnFwZW5kLCBleHRfaXJsOwotZXh0ZXJuIGludCAgICAgIHRlcm1zYXZlOwotZXh0ZXJuIGludCAgICAgIHNwYXJjbGl0ZTsKLWV4dGVybiBpbnQgICAgICBkdW1iaW87Ci1leHRlcm4gY2hhciAgICAgdWFydF9kZXYxW107Ci1leHRlcm4gY2hhciAgICAgdWFydF9kZXYyW107Ci1leHRlcm4gdWludDMyICAgbGFzdF9sb2FkX2FkZHI7Ci0KLSNpZmRlZiBFUkEKLWV4dGVybiBpbnQgZXJhOwotI2VuZGlmCi0KLWludAotcnVuX3NpbShzcmVncywgaWNvdW50LCBkaXMpCi0gICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOwotICAgIHVuc2lnbmVkIGludCAgICBpY291bnQ7Ci0gICAgaW50ICAgICAgICAgICAgIGRpczsKLXsKLSAgICBpbnQgICAgICAgICAgICAgaXJxLCBtZXhjLCBkZWIsIGFzaTsKLQotICAgIHNyZWdzLT5zdGFydHRpbWUgPSB0aW1lKE5VTEwpOwotICAgIGluaXRfc3RkaW8oKTsKLSAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKSBpY291bnQgPSAwOwotICAgIGRlYiA9IGRpcyB8fCBzcmVncy0+aGlzdGxlbiB8fCBzcmVncy0+YnB0bnVtOwotICAgIGlycSA9IDA7Ci0gICAgd2hpbGUgKGljb3VudCA+IDApIHsKLQotCWlmIChzcmVncy0+cHNyICYgMHgwODApCi0JICAgIGFzaSA9IDk7Ci0gICAJZWxzZQotCSAgICBhc2kgPSA4OwotCW1leGMgPSBtZW1vcnlfcmVhZChhc2ksIHNyZWdzLT5wYywgJnNyZWdzLT5pbnN0LCAyLCAmc3JlZ3MtPmhvbGQpOwotCXNyZWdzLT5pY250ID0gMTsKLQlpZiAoc3JlZ3MtPmFubnVsKSB7Ci0JICAgIHNyZWdzLT5hbm51bCA9IDA7Ci0JICAgIHNyZWdzLT5wYyA9IHNyZWdzLT5ucGM7Ci0JICAgIHNyZWdzLT5ucGMgPSBzcmVncy0+bnBjICsgNDsKLQl9IGVsc2UgewotCSAgICBzcmVncy0+ZmhvbGQgPSAwOwotCSAgICBpZiAoZXh0X2lybCkgaXJxID0gY2hlY2tfaW50ZXJydXB0cyhzcmVncyk7Ci0JICAgIGlmICghaXJxKSB7Ci0JCWlmIChtZXhjKSB7Ci0JCSAgICBzcmVncy0+dHJhcCA9IElfQUNDX0VYQzsKLQkJfSBlbHNlIHsKLQkJICAgIGlmIChkZWIpIHsKLQkgICAgCQlpZiAoKHNyZWdzLT5icGhpdCA9IGNoZWNrX2JwdChzcmVncykpICE9IDApIHsKLSAgICAgICAgICAgIAkJICAgIHJlc3RvcmVfc3RkaW8oKTsKLQkgICAgCQkgICAgcmV0dXJuIChCUFRfSElUKTsKLQkgICAgCQl9Ci0JCSAgICAgICAgaWYgKHNyZWdzLT5oaXN0bGVuKSB7Ci0JCQkgICAgc3JlZ3MtPmhpc3RidWZbc3JlZ3MtPmhpc3RpbmRdLmFkZHIgPSBzcmVncy0+cGM7Ci0JCQkgICAgc3JlZ3MtPmhpc3RidWZbc3JlZ3MtPmhpc3RpbmRdLnRpbWUgPSBlYmFzZS5zaW10aW1lOwotCQkJICAgIHNyZWdzLT5oaXN0aW5kKys7Ci0JCQkgICAgaWYgKHNyZWdzLT5oaXN0aW5kID49IHNyZWdzLT5oaXN0bGVuKQotCQkJICAgICAgICBzcmVncy0+aGlzdGluZCA9IDA7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIGlmIChkaXMpIHsKLQkJCSAgICBwcmludGYoIiAlOHUgIiwgZWJhc2Uuc2ltdGltZSk7Ci0JCQkgICAgZGlzX21lbShzcmVncy0+cGMsIDEsICZkaW5mbyk7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQkgICAgZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24oc3JlZ3MpOwotCQkgICAgaWNvdW50LS07Ci0JCX0KLQkgICAgfQotCSAgICBpZiAoc3JlZ3MtPnRyYXApIHsKLQkJaXJxID0gMDsKLQkJc3JlZ3MtPmVycl9tb2RlID0gZXhlY3V0ZV90cmFwKHNyZWdzKTsKLSAgICAgICAgCWlmIChzcmVncy0+ZXJyX21vZGUpIHsKLQkgICAgICAgICAgICBlcnJvcl9tb2RlKHNyZWdzLT5wYyk7Ci0JICAgICAgICAgICAgaWNvdW50ID0gMDsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQlhZHZhbmNlX3RpbWUoc3JlZ3MpOwotCWlmIChjdHJsX2MgfHwgKHNyZWdzLT50bGltaXQgPD0gZWJhc2Uuc2ltdGltZSkpIHsKLQkgICAgaWNvdW50ID0gMDsKLQkgICAgaWYgKHNyZWdzLT50bGltaXQgPD0gZWJhc2Uuc2ltdGltZSkgc3JlZ3MtPnRsaW1pdCA9IC0xOwotCX0KLSAgICB9Ci0gICAgc3JlZ3MtPnRvdHRpbWUgKz0gdGltZShOVUxMKSAtIHNyZWdzLT5zdGFydHRpbWU7Ci0gICAgcmVzdG9yZV9zdGRpbygpOwotICAgIGlmIChzcmVncy0+ZXJyX21vZGUpCi0JcmV0dXJuIChFUlJPUik7Ci0gICAgaWYgKGN0cmxfYykgewotCWN0cmxfYyA9IDA7Ci0JcmV0dXJuIChDVFJMX0MpOwotICAgIH0KLSAgICByZXR1cm4gKFRJTUVfT1VUKTsKLX0KLQotaW50Ci1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgaW50ICAgICAgICAgICAgIGFyZ2M7Ci0gICAgY2hhciAgICAgICAgICAqKmFyZ3Y7Ci17Ci0KLSAgICBpbnQgICAgICAgICAgICAgY29udCA9IDE7Ci0gICAgaW50ICAgICAgICAgICAgIHN0YXQgPSAxOwotICAgIGludCAgICAgICAgICAgICBmcmVxID0gMTQ7Ci0gICAgaW50ICAgICAgICAgICAgIGNvcHQgPSAwOwotCi0gICAgY2hhciAgICAgICAgICAgKmNmaWxlLCAqYmFjbWQ7Ci0gICAgY2hhciAgICAgICAgICAgKmNtZHFbSElTVF9MRU5dOwotICAgIGludCAgICAgICAgICAgICBjbWRpID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgIGNmaWxlID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLQljbWRxW2ldID0gMDsKLSAgICBwcmludGYoIlxuIFNJUyAtIFNQQVJDIGludHJ1Y3Rpb24gc2ltdWxhdG9yICVzLCAgY29weXJpZ2h0IEppcmkgR2Fpc2xlciAxOTk1XG4iLCBzaXNfdmVyc2lvbik7Ci0gICAgcHJpbnRmKCIgQnVnLXJlcG9ydHMgdG8gamdhaXNAd2QuZXN0ZWMuZXNhLm5sXG5cbiIpOwotICAgIHdoaWxlIChzdGF0IDwgYXJnYykgewotCWlmIChhcmd2W3N0YXRdWzBdID09ICctJykgewotCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdiIpID09IDApIHsKLQkJc2lzX3ZlcmJvc2UgPSAxOwotCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWMiKSA9PSAwKSB7Ci0JCWlmICgoc3RhdCArIDEpIDwgYXJnYykgewotCQkgICAgY29wdCA9IDE7Ci0JCSAgICBjZmlsZSA9IGFyZ3ZbKytzdGF0XTsKLQkJfQotCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLW5mcCIpID09IDApCi0JCW5mcCA9IDE7Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWlmdCIpID09IDApCi0JCWlmdCA9IDE7Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXdycCIpID09IDApCi0JCXdycCA9IDE7Ci0JICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXJvbTgiKSA9PSAwKQotCQlyb204ID0gMTsKLQkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdWJlbiIpID09IDApCi0JCXViZW4gPSAxOwotCSAgICBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MSIpID09IDApIHsKLQkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQotCQkgICAgc3RyY3B5KHVhcnRfZGV2MSwgYXJndlsrK3N0YXRdKTsKLQkgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MiIpID09IDApIHsKLQkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQotCQkgICAgc3RyY3B5KHVhcnRfZGV2MiwgYXJndlsrK3N0YXRdKTsKLQkgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1mcmVxIikgPT0gMCkgewotCQlpZiAoKHN0YXQgKyAxKSA8IGFyZ2MpCi0JCSAgICBmcmVxID0gVkFMKGFyZ3ZbKytzdGF0XSk7Ci0JICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItc3BhcmNsaXRlIikgPT0gMCkgewotCQlzcGFyY2xpdGUgPSAxOwotI2lmZGVmIEVSQQotCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWVyYSIpID09IDApIHsKLQkJZXJhID0gMTsKLSNlbmRpZgotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1kdW1iaW8iKSA9PSAwKSB7Ci0JCWR1bWJpbyA9IDE7Ci0JICAgIH0gZWxzZSB7Ci0JCXByaW50ZigidW5rbm93biBvcHRpb24gJXNcbiIsIGFyZ3Zbc3RhdF0pOwotCQl1c2FnZSgpOwotCQlleGl0KDEpOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgbGFzdF9sb2FkX2FkZHIgPSBiZmRfbG9hZChhcmd2W3N0YXRdKTsKLQl9Ci0Jc3RhdCsrOwotICAgIH0KLSAgICBpZiAobmZwKQotCXByaW50ZigiRlBVIGRpc2FibGVkXG4iKTsKLSNpZmRlZiBFUkEKLSAgICBpZiAoZXJhKQotCXByaW50ZigiRVJBIEVDQyBlbXVsYXRpb24gZW5hYmxlZFxuIik7Ci0jZW5kaWYKLSAgICBzcmVncy5mcmVxID0gZnJlcTsKLQotICAgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaW5mbywgc3Rkb3V0LCAoZnByaW50Zl9mdHlwZSkgZnByaW50Zik7Ci0gICAgZGluZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgICB0ZXJtc2F2ZSA9IGZjbnRsKDAsIEZfR0VURkwsIDApOwotICAgIHVzaW5nX2hpc3RvcnkoKTsKLSAgICBpbml0X3NpZ25hbHMoKTsKLSAgICBlYmFzZS5zaW10aW1lID0gMDsKLSAgICByZXNldF9hbGwoKTsKLSAgICBpbml0X2JwdCgmc3JlZ3MpOwotICAgIGluaXRfc2ltKCk7Ci0jaWZkZWYgU1RBVAotICAgIHJlc2V0X3N0YXQoJnNyZWdzKTsKLSNlbmRpZgotCi0gICAgaWYgKGNvcHQpIHsKLQliYWNtZCA9IChjaGFyICopIG1hbGxvYygyNTYpOwotCXN0cmNweShiYWNtZCwgImJhdGNoICIpOwotCXN0cmNhdChiYWNtZCwgY2ZpbGUpOwotCWV4ZWNfY21kKCZzcmVncywgYmFjbWQpOwotICAgIH0KLSAgICB3aGlsZSAoY29udCkgewotCi0JaWYgKGNtZHFbY21kaV0gIT0gMCkgewotI2lmIDAKLQkgICAgcmVtb3ZlX2hpc3RvcnkoY21kcVtjbWRpXSk7Ci0jZWxzZQotCSAgICByZW1vdmVfaGlzdG9yeShjbWRpKTsKLSNlbmRpZgotCSAgICBmcmVlKGNtZHFbY21kaV0pOwotCSAgICBjbWRxW2NtZGldID0gMDsKLQl9Ci0JY21kcVtjbWRpXSA9IHJlYWRsaW5lKCJzaXM+ICIpOwotCWlmIChjbWRxW2NtZGldICYmICpjbWRxW2NtZGldKQotCSAgICBhZGRfaGlzdG9yeShjbWRxW2NtZGldKTsKLQlpZiAoY21kcVtjbWRpXSkKLQkgICAgc3RhdCA9IGV4ZWNfY21kKCZzcmVncywgY21kcVtjbWRpXSk7Ci0JZWxzZSB7Ci0JICAgIHB1dHMoIlxuIik7Ci0JICAgIGV4aXQoMCk7Ci0JfQotCXN3aXRjaCAoc3RhdCkgewotCWNhc2UgT0s6Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1RSTF9DOgotCSAgICBwcmludGYoIlxiXGJJbnRlcnJ1cHQhXG4iKTsKLQljYXNlIFRJTUVfT1VUOgotCSAgICBwcmludGYoIiBTdG9wcGVkIGF0IHRpbWUgJWQgKCUuM2YgbXMpXG4iLCBlYmFzZS5zaW10aW1lLCAKLQkgICAgICAoKGRvdWJsZSkgZWJhc2Uuc2ltdGltZSAvIChkb3VibGUpIHNyZWdzLmZyZXEpIC8gMTAwMC4wKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBCUFRfSElUOgotCSAgICBwcmludGYoImJyZWFrcG9pbnQgYXQgMHglMDh4IHJlYWNoZWRcbiIsIHNyZWdzLnBjKTsKLQkgICAgc3JlZ3MuYnBoaXQgPSAxOwotCSAgICBicmVhazsKLQljYXNlIEVSUk9SOgotCSAgICBwcmludGYoIklVIGluIGVycm9yIG1vZGUgKCVkKVxuIiwgc3JlZ3MudHJhcCk7Ci0JICAgIHN0YXQgPSAwOwotCSAgICBwcmludGYoIiAlOGQgIiwgZWJhc2Uuc2ltdGltZSk7Ci0JICAgIGRpc19tZW0oc3JlZ3MucGMsIDEsICZkaW5mbyk7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotCX0KLQljdHJsX2MgPSAwOwotCXN0YXQgPSBPSzsKLQotCWNtZGkgPSAoY21kaSArIDEpICYgKEhJU1RfTEVOIC0gMSk7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9zaXMuaCBiL3NpbS9lcmMzMi9zaXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4OTVjMC4uMDAwMDAwMAotLS0gYS9zaW0vZXJjMzIvc2lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFNJUy4KLSAqIAotICogRVJDMzJTSU0sIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvci4gQ29weXJpZ2h0IChDKSAxOTk1IEppcmkgR2Fpc2xlciwKLSAqIEV1cm9wZWFuIFNwYWNlIEFnZW5jeQotICogCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICogCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1Ci0gKiBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICogCi0gKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0KLSNpbmNsdWRlICJlbmQuaCIKLQotI2RlZmluZSBJX0FDQ19FWEMgMQotCi0vKiBNYXhpbXVtIGV2ZW50cyBpbiBldmVudCBxdWV1ZSAqLwotI2RlZmluZSBFVkVOVF9NQVgJMjU2Ci0KLS8qIE1heGltdW0gIyBvZiBmbG9hdGluZyBwb2ludCBxdWV1ZSAqLwotI2RlZmluZSBGUFVRTgkxCi0KLS8qIE1heGltdW0gIyBvZiBicmVha3BvaW50cyAqLwotI2RlZmluZSBCUFRfTUFYCTI1NgotCi1zdHJ1Y3QgaGlzdHlwZSB7Ci0gICAgdW5zaWduZWQgICAgICAgIGFkZHI7Ci0gICAgdW5zaWduZWQgICAgICAgIHRpbWU7Ci19OwotCi0vKiB0eXBlIGRlZmluaXRpb25zICovCi0KLXR5cGVkZWYgc2hvcnQgaW50IGludDE2OwkvKiAxNi1iaXQgc2lnbmVkIGludCAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdWludDE2OwkvKiAxNi1iaXQgdW5zaWduZWQgaW50ICovCi10eXBlZGVmIGludCAgICAgaW50MzI7CQkvKiAzMi1iaXQgc2lnbmVkIGludCAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwkvKiAzMi1iaXQgdW5zaWduZWQgaW50ICovCi10eXBlZGVmIGZsb2F0ICAgZmxvYXQzMjsJLyogMzItYml0IGZsb2F0ICovCi10eXBlZGVmIGRvdWJsZSAgZmxvYXQ2NDsJLyogNjQtYml0IGZsb2F0ICovCi0KLS8qIEZJWE1FOiB3aGF0IGFib3V0IGhvc3QgY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCA2NC1iaXQgaW50cz8gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NDsgLyogNjQtYml0IHVuc2lnbmVkIGludCAqLwotdHlwZWRlZiBsb25nIGxvbmcgaW50NjQ7CS8qIDY0LWJpdCBzaWduZWQgaW50ICovCi0KLXN0cnVjdCBwc3RhdGUgewotCi0gICAgZmxvYXQ2NCAgICAgICAgIGZkWzE2XTsJLyogRlBVIHJlZ2lzdGVycyAqLwotI2lmZGVmIEhPU1RfTElUVExFX0VORElBTl9GTE9BVAotICAgIGZsb2F0MzIgICAgICAgICBmc1szMl07Ci0gICAgZmxvYXQzMiAgICAgICAgKmZkcDsKLSNlbHNlCi0gICAgZmxvYXQzMiAgICAgICAgKmZzOwotI2VuZGlmCi0gICAgaW50MzIgICAgICAgICAgKmZzaTsKLSAgICB1aW50MzIgICAgICAgICAgZnNyOwotICAgIGludDMyICAgICAgICAgICBmcHN0YXRlOwotICAgIHVpbnQzMiAgICAgICAgICBmcHFbRlBVUU4gKiAyXTsKLSAgICB1aW50MzIgICAgICAgICAgZnBxbjsKLSAgICB1aW50MzIgICAgICAgICAgZnRpbWU7Ci0gICAgdWludDMyICAgICAgICAgIGZscmQ7Ci0gICAgdWludDMyICAgICAgICAgIGZyZDsKLSAgICB1aW50MzIgICAgICAgICAgZnJzMTsKLSAgICB1aW50MzIgICAgICAgICAgZnJzMjsKLSAgICB1aW50MzIgICAgICAgICAgZnB1X3ByZXM7CS8qIEZQVSBwcmVzZW50ICgwID0gTm8sIDEgPSBZZXMpICovCi0KLSAgICB1aW50MzIgICAgICAgICAgcHNyOwkvKiBJVSByZWdpc3RlcnMgKi8KLSAgICB1aW50MzIgICAgICAgICAgdGJyOwotICAgIHVpbnQzMiAgICAgICAgICB3aW07Ci0gICAgdWludDMyICAgICAgICAgIGdbOF07Ci0gICAgdWludDMyICAgICAgICAgIHJbMTI4XTsKLSAgICB1aW50MzIgICAgICAgICAgeTsKLSAgICB1aW50MzIgICAgICAgICAgYXNyMTc7ICAgICAgLyogU2luZ2xlIHZlY3RvciB0cmFwcGluZyAqLwotICAgIHVpbnQzMiAgICAgICAgICBwYywgbnBjOwotCi0KLSAgICB1aW50MzIgICAgICAgICAgdHJhcDsJLyogQ3VycmVudCB0cmFwIHR5cGUgKi8KLSAgICB1aW50MzIgICAgICAgICAgYW5udWw7CS8qIEluc3RydWN0aW9uIGFubnVsICovCi0gICAgdWludDMyICAgICAgICAgIGRhdGE7CS8qIExvYWRlZCBkYXRhCSAgICAgKi8KLSAgICB1aW50MzIgICAgICAgICAgaW5zdDsJLyogQ3VycmVudCBpbnN0cnVjdGlvbiAqLwotICAgIHVpbnQzMiAgICAgICAgICBhc2k7CS8qIEN1cnJlbnQgQVNJICovCi0gICAgdWludDMyICAgICAgICAgIGVycl9tb2RlOwkvKiBJVSBlcnJvciBtb2RlICovCi0gICAgdWludDMyICAgICAgICAgIGJyZWFrcG9pbnQ7Ci0gICAgdWludDMyICAgICAgICAgIGJwdG51bTsKLSAgICB1aW50MzIgICAgICAgICAgYnBoaXQ7Ci0gICAgdWludDMyICAgICAgICAgIGJwdHNbQlBUX01BWF07CS8qIEJyZWFrcG9pbnRzICovCi0KLSAgICB1aW50MzIgICAgICAgICAgbHRpbWU7CS8qIExvYWQgaW50ZXJsb2NrIHRpbWUgKi8KLSAgICB1aW50MzIgICAgICAgICAgaG9sZDsJLyogSVUgaG9sZCBjeWNsZXMgaW4gY3VycmVudCBpbnN0ICovCi0gICAgdWludDMyICAgICAgICAgIGZob2xkOwkvKiBGUFUgaG9sZCBjeWNsZXMgaW4gY3VycmVudCBpbnN0ICovCi0gICAgdWludDMyICAgICAgICAgIGljbnQ7CS8qIEluc3RydWN0aW9uIGN5Y2xlcyBpbiBjdXJyIGluc3QgKi8KLQotICAgIHVpbnQzMiAgICAgICAgICBoaXN0bGVuOwkvKiBUcmFjZSBoaXN0b3J5IG1hbmFnZW1lbnQgKi8KLSAgICB1aW50MzIgICAgICAgICAgaGlzdGluZDsKLSAgICBzdHJ1Y3QgaGlzdHlwZSAqaGlzdGJ1ZjsKLSAgICBmbG9hdDMyICAgICAgICAgZnJlcTsJLyogU2ltdWxhdGVkIHByb2Nlc3NvciBmcmVxdWVuY3kgKi8KLQotCi0gICAgdWludDMyICAgICAgICAgIHRvdHRpbWU7Ci0gICAgdWludDMyICAgICAgICAgIG5pbnN0OwotICAgIHVpbnQzMiAgICAgICAgICBmaG9sZHQ7Ci0gICAgdWludDMyICAgICAgICAgIGhvbGR0OwotICAgIHVpbnQzMiAgICAgICAgICBpY250dDsKLSAgICB1aW50MzIgICAgICAgICAgZmluc3Q7Ci0gICAgdWludDMyICAgICAgICAgIHNpbXN0YXJ0OwotICAgIHVpbnQzMiAgICAgICAgICBzdGFydHRpbWU7Ci0gICAgdWludDMyICAgICAgICAgIHRsaW1pdDsJLyogU2ltdWxhdGlvbiB0aW1lIGxpbWl0ICovCi0gICAgdWludDMyICAgICAgICAgIHB3ZHRpbWU7CS8qIEN5Y2xlcyBpbiBwb3dlci1kb3duIG1vZGUgKi8KLSAgICB1aW50MzIgICAgICAgICAgbnN0b3JlOwkvKiBOdW1iZXIgb2YgbG9hZCBpbnN0cnVjdGlvbnMgKi8KLSAgICB1aW50MzIgICAgICAgICAgbmxvYWQ7CS8qIE51bWJlciBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgKi8KLSAgICB1aW50MzIgICAgICAgICAgbmFubnVsOwkvKiBOdW1iZXIgb2YgYW5udWxlZCBpbnN0cnVjdGlvbnMgKi8KLSAgICB1aW50MzIgICAgICAgICAgbmJyYW5jaDsJLyogTnVtYmVyIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLSAgICB1aW50MzIgICAgICAgICAgaWxkcmVnOwkvKiBEZXN0aW5hdGlvbiBvZiBsYXN0IGxvYWQgaW5zdHJ1Y3Rpb24gKi8KLSAgICB1aW50MzIgICAgICAgICAgaWxkdGltZTsJLyogTGFzdCB0aW1lIHBvaW50IGZvciBsb2FkIGRlcGVuZGVuY3kgKi8KLQotICAgIGludCAgICAgICAgICAgICByZXR0X2VycjsJLyogSVUgaW4gam1wbC9yZXN0b3JlIGVycm9yIHN0YXRlIChSZXYuMCkgKi8KLSAgICBpbnQgICAgICAgICAgICAgam1wbHRpbWU7Ci19OwotCi1zdHJ1Y3QgZXZjZWxsIHsKLSAgICB2b2lkICAgICAgICAgICAgKCpjZnVuYykgKCk7Ci0gICAgaW50MzIgICAgICAgICAgIGFyZzsKLSAgICB1aW50MzIgICAgICAgICAgdGltZTsKLSAgICBzdHJ1Y3QgZXZjZWxsICAqbnh0OwotfTsKLQotc3RydWN0IGVzdGF0ZSB7Ci0gICAgc3RydWN0IGV2Y2VsbCAgIGVxOwotICAgIHN0cnVjdCBldmNlbGwgICpmcmVlcTsKLSAgICB1aW50MzIgICAgICAgICAgc2ltdGltZTsKLX07Ci0KLXN0cnVjdCBpcnFjZWxsIHsKLSAgICB2b2lkICAgICAgICAgICAgKCpjYWxsYmFjaykgKCk7Ci0gICAgaW50MzIgICAgICAgICAgIGFyZzsKLX07Ci0KLQotI2RlZmluZSBPSyAwCi0jZGVmaW5lIFRJTUVfT1VUIDEKLSNkZWZpbmUgQlBUX0hJVCAyCi0jZGVmaW5lIEVSUk9SIDMKLSNkZWZpbmUgQ1RSTF9DIDQKLQotLyogUHJvdG90eXBlcyAgKi8KLQotLyogZXJjMzIuYyAqLwotZXh0ZXJuIHZvaWQJaW5pdF9zaW0gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJcmVzZXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJZXJyb3JfbW9kZSBQQVJBTVMgKCh1aW50MzIgcGMpKTsKLWV4dGVybiB2b2lkCXNpbV9oYWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkCWV4aXRfc2ltIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkCWluaXRfc3RkaW8gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJcmVzdG9yZV9zdGRpbyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50CW1lbW9yeV9yZWFkIFBBUkFNUyAoKGludDMyIGFzaSwgdWludDMyIGFkZHIsIHVpbnQzMiAqZGF0YSwKLQkJCQkgICAgIGludDMyIHN6LCBpbnQzMiAqd3MpKTsKLWV4dGVybiBpbnQJbWVtb3J5X3dyaXRlIFBBUkFNUyAoKGludDMyIGFzaSwgdWludDMyIGFkZHIsIHVpbnQzMiAqZGF0YSwKLQkJCQkgICAgaW50MzIgc3osIGludDMyICp3cykpOwotZXh0ZXJuIGludAlzaXNfbWVtb3J5X3dyaXRlIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCBjaGFyICpkYXRhLAotCQkJCQkgIHVpbnQzMiBsZW5ndGgpKTsKLWV4dGVybiBpbnQJc2lzX21lbW9yeV9yZWFkIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCBjaGFyICpkYXRhLAotCQkJCQkgdWludDMyIGxlbmd0aCkpOwotCi0vKiBmdW5jLmMgKi8KLWV4dGVybiB2b2lkCXNldF9yZWdpIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBpbnQzMiByZWcsCi0JCQkJICB1aW50MzIgcnZhbCkpOwotZXh0ZXJuIHZvaWQJZ2V0X3JlZ2kgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIGludDMyIHJlZywgY2hhciAqYnVmKSk7Ci1leHRlcm4gaW50CWV4ZWNfY21kIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBjaGFyICpjbWQpKTsKLWV4dGVybiB2b2lkCXJlc2V0X3N0YXQgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAgKnNyZWdzKSk7Ci1leHRlcm4gdm9pZAlzaG93X3N0YXQgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAgKnNyZWdzKSk7Ci1leHRlcm4gdm9pZAlpbml0X2JwdCBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICAqc3JlZ3MpKTsKLWV4dGVybiB2b2lkCWluaXRfc2lnbmFscyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvOwotZXh0ZXJuIHZvaWQJZGlzX21lbSBQQVJBTVMgKCh1aW50MzIgYWRkciwgdWludDMyIGxlbiwKLQkJCQkgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLWV4dGVybiB2b2lkCWV2ZW50IFBBUkFNUyAoKHZvaWQgKCpjZnVuYykgKCksIGludDMyIGFyZywgdWludDMyIGRlbHRhKSk7Ci1leHRlcm4gdm9pZAlzZXRfaW50IFBBUkFNUyAoKGludDMyIGxldmVsLCB2b2lkICgqY2FsbGJhY2spICgpLCBpbnQzMiBhcmcpKTsKLWV4dGVybiB2b2lkCWFkdmFuY2VfdGltZSBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICAqc3JlZ3MpKTsKLWV4dGVybiB1aW50MzIJbm93IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQJd2FpdF9mb3JfaXJxIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQJY2hlY2tfYnB0IFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7Ci1leHRlcm4gdm9pZAlyZXNldF9hbGwgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJc3lzX3Jlc2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkCXN5c19oYWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQJYmZkX2xvYWQgUEFSQU1TICgoY2hhciAqZm5hbWUpKTsKLQotLyogZXhlYy5jICovCi1leHRlcm4gaW50CWRpc3BhdGNoX2luc3RydWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7Ci1leHRlcm4gaW50CWV4ZWN1dGVfdHJhcCBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICpzcmVncykpOwotZXh0ZXJuIGludAljaGVja19pbnRlcnJ1cHRzIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncykpOwotZXh0ZXJuIHZvaWQJaW5pdF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7Ci0KLS8qIGludGVyZi5jICovCi1leHRlcm4gaW50CXJ1bl9zaW0gUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsCi0JCQkJIHVuc2lnbmVkIGludCBpY291bnQsIGludCBkaXMpKTsKLQotLyogZmxvYXQuYyAqLwotZXh0ZXJuIGludAlnZXRfYWNjZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJY2xlYXJfYWNjZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJc2V0X2ZzciBQQVJBTVMgKCh1aW50MzIgZnNyKSk7Ci0KLS8qIGhlbHAuYyAqLwotZXh0ZXJuIHZvaWQJdXNhZ2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQJZ2VuX2hlbHAgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL3N0YXJ0c2ltIGIvc2ltL2VyYzMyL3N0YXJ0c2ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjliNDFjLi4wMDAwMDAwCi0tLSBhL3NpbS9lcmMzMi9zdGFydHNpbQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwoteHRlcm0gLWUgc2lzICQqICYKLXh0ZXJtIC1lIHRpcCAvZGV2L3R0eXBjICYKLQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvQ2hhbmdlTG9nIGIvc2ltL2ZyMzAvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGYyNTVkLi4wMDAwMDAwCi0tLSBhL3NpbS9mcjMwL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0yMDAwLTAzLTMwICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMTAtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogdHJhcHMuYyAoc2ltX2VuZ2luZV9pbnZhbGlkX2luc24pOiBOZXcgYXJnIGB2cGMnLiAgQ2hhbmdlIHR5cGUgb2YKLQlyZXN1bHQgdG8gU0VNX1BDLiAgUmV0dXJuIHZwYy4KLQotV2VkIFNlcCAyOSAxNDo0NTozMiAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHRyYXBzLmMgKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUmV0dXJuIFBDLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA4LTMxICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGNwdWFsbC5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTA2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLUZyaSBBcHIgMTYgMTY6NTA6MzEgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRldmljZXMuYyAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfZXJyb3IpOiBHaXZlIHByb3BlciBhcmcgc3BlYy4KLQotMTk5OS0wNC0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0KLTE5OTktMDMtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZGVjb2RlLmM6IFJlYnVpbGQuCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogYXJjaC5jLGFyY2guaCxtb2RlbC5jOiBSZWJ1aWxkLgotCSogZnIzMC5jIChmcjMwYmZfZmV0Y2hfcmVnaXN0ZXIpOiBSZXBsYWNlIGNhbGxzIHRvIGFfZnIzMF9oXyogd2l0aAotCWNhbGxzIHRvIGZyMzBiZl9oXyouCi0JKGZyMzBiZl9zdG9yZV9yZWdpc3Rlcik6IERpdHRvLgotCSogdHJhcHMuYyAoc2V0dXBfaW50KTogRGl0dG8uCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBVcGRhdGUgY2FsbCB0byBmcjMwX2NnZW5fY3B1X29wZW4uCi0KLU1vbiBNYXIgMjIgMTM6MTM6MDUgMTk5OSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChGT1JDRURfQUxJR05NRU5UKS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNwdS5oOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGFyY2guYyxhcmNoLmgsY3B1LmMsY3B1Lmg6IFJlYnVpbGQuCi0JKiBmcjMwLXNpbS5oIChHRVRfSF9TQklULFNFVF9IX1NCSVQpOiBEZWxldGUuCi0JKEdFVF9IX0NDUixTRVRfSF9DQ1IsR0VUX0hfU0NSLFNFVF9IX1NDUixHRVRfSF9JTE0sU0VUX0hfSUxNKTogRGVsZXRlLgotCShHRVRfSF9QUyxTRVRfSF9QUyxHRVRfSF9EUixTRVRfSF9EUik6IERlbGV0ZS4KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQotMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaDogUmVidWlsZC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBBZGQgZnIzMC1kZXNjLmgsIGRlbGV0ZSBjcHUtb3BjLmguCi0JKiBjb25maWd1cmUuaW4gKHNpbV9saW5rX2ZpbGVzLHNpbV9saW5rX2xpbmtzKTogRGVsZXRlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0JKiBmcjMwLmMgKGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkpOiBDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvCi0JQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JKiBtbG9vcC5pbiAoZXh0cmFjdC1wYmIpOiBEaXR0by4gVXNlIGlkZXNjLT5sZW5ndGggdG8gZ2V0IGluc24gbGVuZ3RoLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogZnIzMF9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQgZnJvbQotCWZyMzBfY2dlbl9vcGNvZGVfb3Blbi4gIFNldCBkaXNhc3NlbWJsZXIuCi0JKHNpbV9jbG9zZSk6IGZyMzBfY2dlbl9jcHVfb3BlbiByZW5hbWVkIGZyb20gZnIzMF9jZ2VuX29wY29kZV9vcGVuLgotCSogc2ltLW1haW4uaDogRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsY3B1LXNpbS5oLiBJbmNsdWRlCi0JZnIzMC1kZXNjLmgsZnIzMC1vcGMuaCxmcjMwLXNpbS5oLgotCi0xOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTAxLTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5oLG1vZGVsLmM6IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLmMgKGZyMzBiZl9tb2RlbF9pbnNuX2JlZm9yZSk6IENsZWFyIGxvYWRfcmVnc19wZW5kaW5nLgotCShmcjMwYmZfbW9kZWxfaW5zbl9hZnRlcik6IENvcHkgbG9hZF9yZWdzX3BlbmRpbmcgdG8gbG9hZF9yZWdzLgotCShmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyk6IENoZWNrIGZvciBsb2FkIHN0YWxscy4KLQkoZnIzMGJmX21vZGVsX2ZyMzBfMV91X3tjdGksbG9hZCxzdG9yZX0pOiBEaXR0by4KLQotMTk5OS0wMS0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBhcmNoLmMsYXJjaC5oLGNwdWFsbC5oOiBSZWdlbmVyYXRlLgotCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0JKiBkZXZpY2VzLmMgKGRldmljZV9pb193cml0ZV9idWZmZXIpOiBSZW1vdmUgc29tZSBtMzJyIGNydWZ0LgotCSogZnIzMC1zaW0uaCAoRlIzMF9NSVNDX1BST0ZJTEUpOiBEZWxldGUsIHBsdXMgc3VwcG9ydGluZyBtYWNyb3MuCi0JKEVJVF8qLE1TUFJfKixNTENSXyosTVBNUl8qKTogRGVsZXRlLCBtMzJyIGNydWZ0LgotCSogZnIzMC5jIChmcjMwYmZfbW9kZWxfaW5zbl9hZnRlcik6IFVwZGF0ZSBjeWNsZSBjb3VudHMuCi0JKGNoZWNrX2xvYWRfc3RhbGwpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjKTogVXBkYXRlIGFyZ3VtZW50IGxpc3QuCi0JKGZyMzBiZl9tb2RlbF9mcjMwXzFfdV97Y3RpLGxvYWQsc3RvcmUsbGRtLHN0bX0pOiBOZXcgZnVuY3Rpb25zLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogQ29tbWVudCBvdXQgbWVtb3J5IG1hcHBlZCBkZXZpY2UgYWxsb2NhdGlvbi4KLQlEZWxldGUgRlIzMF9NSVNDX1BST0ZJTEUgaGFuZGxpbmcuCi0JKHByaW50X2ZyMzBfbWlzY19jcHUpOiBEZWxldGUuCi0JKiBzaW0tbWFpbi5oIChfc2ltX2NwdSk6IERlbGV0ZSBtZW1iZXIgZnIzMF9taXNjX3Byb2ZpbGUuCi0JKiB0cmFwcy5jIChzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IFBDQUREUi0+SUFERFIuCi0KLTE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGZyMzAtY2xlYW4pOiBybSBlbmcuaC4KLQotCSogc2ltLW1haW4uaDogRGVsZXRlIGluY2x1c2lvbiBvZiBhbnNpZGVjbC5oLgotCUluY2x1ZGUgc2ltLWJhc2ljcy5oIGJlZm9yZSBjZ2VuLXR5cGVzLmguCi0JRGVsZXRlIGluY2x1c2lvbiBvZiBjZ2VuLXNjYWNoZS5oLGNnZW4tY3B1LmgsY2dlbi10cmFjZS5oLGNwdWFsbC5oLgotCSogY3B1Lmgsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNQUlOX0lOQ0xVREVfREVQUyk6IERlbGV0ZS4KLQkoSU5DTFVERV9ERVBTLE9QU19JTkNMVURFX0RFUFMpOiBEZWxldGUuCi0JKHNpbS1pZi5vLGFyY2gubyxkZXZpY2VzLm8pOiBVc2UgU0lNX01BSU5fREVQUy4KLQkoRlIzMEJGX0lOQ0xVREVfREVQUyk6IFVzZSBDR0VOX01BSU5fQ1BVX0RFUFMuCi0JKG1sb29wLm8sY3B1Lm8sZGVjb2RlLm8sc2VtLm8sbW9kZWwubyk6IFNpbXBsaWZ5IGRlcGVuZGVuY2llcy4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC1zaW0uaCAoZnIzMGJmX2hfc2JpdF9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCi0JKFtHU11FVF9IX1NCSVQpOiBEZWZpbmUuCi0JKGZyMzBiZl9oX2Njcl9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCi0JKFtHU11FVF9IX0NDUik6IERlZmluZS4KLQkoZnIzMGJmX2hfc2NyX1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KLQkoW0dTXUVUX0hfU0NSKTogRGVmaW5lLgotCShmcjMwYmZfaF9pbG1fW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgotCShbR1NdRVRfSF9JTE0pOiBEZWZpbmUuCi0JKGZyMzBiZl9oX3BzX1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KLQkoW0dTXUVUX0hfUFMpOiBEZWZpbmUuCi0JKGZyMzBiZl9oX2RyX1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KLQkoW0dTXUVUX0hfRFIpOiBEZWZpbmUuCi0JKiBmcjMwLmMgKGFsbCByZWdpc3RlciBhY2Nlc3MgZm5zKTogUmVuYW1lIHRvIC4uLl9oYW5kbGVyLgotCShmcjMwYmZfaF8qX2dldF9oYW5kbGVyLGZyMzBiZl9oXypfc2V0X2hhbmRsZXIpOiBSZXdyaXRlIHRvIHVzZQotCUNQVSBvciBHRVRfSF9GT08vU0VUX0hfRk9PIGFjY2VzcyBtYWNyb3MgYXMgYXBwcm9wcmlhdGUuCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBNb2RlbCBwcm9iaW5nIGNvZGUgbW92ZWQgdG8gc2ltLW1vZGVsLmMuCi0KLUZyaSBEZWMgMTggMTc6MDk6MzQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLmMgKGZyMzBiZl9zdG9yZV9yZWdpc3Rlcik6IENhbGwgYV9mcjMwX2hfZHJfc2V0IGZvcgotCWRlZGljYXRlZCByZWdpc3RlcnMuCi0KLVRodSBEZWMgMTcgMTc6MTc6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBEZWMgMTUgMTc6Mzk6NTkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiB0cmFwcy5jIChzZXR1cF9pbnQpOiBDb3JyZWN0IGNhbGxzIHRvIFNFVE1FTVNJLgotCShmcjMwX2ludCk6IE11c3QgY2FsY3VsYXRlIG5ldyBwYyBhZnRlciBzYXZpbmcgb2xkIG9uZS4KLQkqIGZyMzAuYyAoZnIzMGJmX2hfc2JpdF9nZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9oX3NiaXRfc2V0KTogTmV3IGZ1bmN0aW9uLgotCShmcjMwYmZfaF9jY3Jfc2V0KTogVXNlIGZyMzBiZl9oX3NiaXRfc2V0IGFuZCBtb3ZlIHN0YWNrIHN3aXRjaGluZwotCWxvZ2ljIHRvIHRoYXQgZnVuY3Rpb24uCi0JKiBjcHUuW2NoXSxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQotMTk5OC0xMi0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IC0tZW5hYmxlLWNnZW4tbWFpbnQgbW92ZWQgdG8gY29tbW9uL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQotCSogdHJhcHMuYyAoc2V0dXBfaW50KTogVXNlIGVudW1zIGZvciByZWdpc3RlciBudW1iZXJzLgotCShmcjMwX2ludCk6IERpdHRvLgotCi0xOTk4LTEyLTE0ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5bY2hdLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi1UaHUgRGVjIDEwIDE4OjQzOjEzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogYXJjaC5bY2hdLGNwdS5bY2hdLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC5jIChmcjMwYmZfaF9zY3JfZ2V0KTogSW1wbGVtZW50IGFzIHNlcGFyYXRlIGJpdHMuCi0JKGZyMzBiZl9oX3Njcl9zZXQpOiBJbXBsZW1lbnQgYXMgc2VwYXJhdGUgYml0cy4KLQotV2VkIERlYyAgOSAxMzoyNTozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxkZWNvZGUuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBEZWMgIDggMTM6MTU6MjMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQotTW9uIERlYyAgNyAxNDozNToyMyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHRyYXBzLmMgKGZyMzBfaW50ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi0xOTk4LTEyLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGNwdWFsbC5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIG1sb29wLmluIChleHRyYWN0KTogTWFrZSBzdGF0aWMgaW5saW5lLiAgUmV3cml0ZS4KLQkoZXhlY3V0ZSk6IENoZWNrIEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlIHByb2ZpbGluZy4KLQlVcGRhdGUgY2FsbHMgdG8gVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSS4KLQotRnJpIERlYyAgNCAxNjoxODoyNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuCi0JKiBjcHUuaCxkZWNvZGUuYzogUmVnZW5lcmF0ZS4KLQotRnJpIERlYyAgNCAxNzowOToyNyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRGVjICA0IDAwOjIyOjQzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi1UaHUgRGVjICAzIDE3OjMzOjE2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5jIChmcjMwYmZfaF9jY3JfZ2V0KTogTmV3IGZ1bmN0aW9uLgotCShmcjMwYmZfaF9jY3Jfc2V0KTogTmV3IGZ1bmN0aW9uLgotCShmcjMwYmZfaF9wc19nZXQpOiBVc2UgY2NyIGFjY2VzcyBmdW5jdGlvbi4KLQkoZnIzMGJmX2hfcHNfc2V0KTogVXNlIGNjciBhY2Nlc3MgZnVuY3Rpb24uCi0JKGZyMzBiZl9oX3Njcl9nZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9oX3Njcl9zZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9oX2lsbV9nZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9oX2lsbV9zZXQpOiBOZXcgZnVuY3Rpb24KLQkoZnIzMGJmX2hfcHNfZ2V0KTogSW1wbGVtZW50IHNyYyBhbmQgaWxtLgotCShmcjMwYmZfaF9wc19zZXQpOiBJbXBsZW1lbnQgc3JjIGFuZCBpbG0uCi0KLQkqIGFyY2guYyxhcmNoLmgsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYywKLQlzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBEZWMgIDMgMDA6MTU6MTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogbWxvb3AuaW4gKGV4dHJhY3QtcGJiKTogQWRkIGRlbGF5IHNsb3Qgc3VwcG9ydC4KLQkqIGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi1UaHUgTm92IDI2IDExOjI4OjMwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDIzIDE4OjMwOjM2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTExLTIwICBEb3VnIEV2YW5zICA8ZGV2YW5zQHRvYm9yLnRvLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtc2ltLmggKCotUkVHTlVNKTogU3luYyB1cCB3aXRoIGdkYi4KLQkqIGZyMzAuYyAoZGVjb2RlX2dkYl9kcl9yZWdudW0pOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBiZl9mZXRjaF9yZWdpc3Rlcik6IEltcGxlbWVudC4KLQkoZnIzMGJmX3N0b3JlX3JlZ2lzdGVyKTogRGl0dG8uCi0JKGZyMzBiZl9oX3BzX2dldCxmcjMwYmZfaF9wc19zZXQpOiBEaXR0by4KLQkoZnIzMGJmX2hfZHJfZ2V0LGZyMzBiZl9oX2RyX3NldCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0JKiB0cmFwcy5jIChzZXR1cF9pbnQpOiBOZXcgZnVuY3Rpb24KLQkoZnIzMF9pbnQpOiBIYW5kbGUgYWxsIGludCBpbnNuIHByb2Nlc3NpbmcgaGVyZS4KLQlEb24ndCBzYXZlIHBzLHBjIGlmIGJyZWFrcG9pbnQgdHJhcC4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQotVGh1IE5vdiAxOSAxNjowNTowOSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHRyYXBzLmMgKGZyMzBfaW50KTogQ29ycmVjdCByZWdpc3RlciB1c2FnZS4KLQkqIGFyY2guYzogUmVnZW5lcmF0ZWQuCi0JKiBhcmNoLmg6IFJlZ2VuZXJhdGVkLgotCSogY3B1LmM6IFJlZ2VuZXJhdGVkLgotCSogY3B1Lmg6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmM6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmg6IFJlZ2VuZXJhdGVkLgotCSogbW9kZWwuYzogUmVnZW5lcmF0ZWQuCi0JKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgotCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgotCi1XZWQgTm92IDE4IDIxOjM5OjM3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1zaW0uaCAoVFJBUF9TWVNDQUxMLCBUUkFQX0JSRUFLUE9JTlQpOiBSZWRlZmluZSBmb3IgZnIzMC4KLQkqIGZyMzAuYyAoZnIzMGJmX2hfcHNfZ2V0KTogTmV3IGZ1bmN0aW9uLgotCShmcjMwYmZfaF9wc19zZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBtbG9vcC5pbjogU2V0IHVwIGZhc3QtcGJiIG1vZGVsIGZvciBmcjMwLgotCSogdHJhcHMuYyAoZnIzMF9pbnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcmNoLmM6IFJlZ2VuZXJhdGVkLgotCSogYXJjaC5oOiBSZWdlbmVyYXRlZC4KLQkqIGNwdS5jOiBSZWdlbmVyYXRlZC4KLQkqIGNwdS5oOiBSZWdlbmVyYXRlZC4KLQkqIGRlY29kZS5jOiBSZWdlbmVyYXRlZC4KLQkqIG1vZGVsLmM6IFJlZ2VuZXJhdGVkLgotCSogc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlZC4KLQkqIHNlbS5jOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRlIzMF9PQkpTKTogRGVsZXRlIGV4dHJhY3Quby4KLQkoRlIzMEJGX0lOQ0xVREVfREVQUyk6IEFkZCBjZ2VuLWVuZ2luZS5oLgotCShleHRyYWN0Lm8pOiBEZWxldGUgcnVsZSBmb3IuCi0JKiBtbG9vcC5pbjogUmV3cml0ZS4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCi1XZWQgTm92IDE4IDExOjMxOjIxIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlZC4KLQkqIHNlbS5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxOToyMzo0NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGFyY2guYzogUmVnZW5lcmF0ZWQuCi0JKiBhcmNoLmg6IFJlZ2VuZXJhdGVkLgotCSogY3B1LmM6IFJlZ2VuZXJhdGVkLgotCSogY3B1Lmg6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmM6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmg6IFJlZ2VuZXJhdGVkLgotCSogZXh0cmFjdC5jOiBSZWdlbmVyYXRlZC4KLQkqIG1vZGVsLmM6IFJlZ2VuZXJhdGVkLgotCSogc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlZC4KLQkqIHNlbS5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxMiAxOToyNzo1MCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGFyY2guYzogUmVnZW5lcmF0ZWQuCi0JKiBhcmNoLmg6IFJlZ2VuZXJhdGVkLgotCSogY3B1LmM6IFJlZ2VuZXJhdGVkLgotCSogY3B1Lmg6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmM6IFJlZ2VuZXJhdGVkLgotCSogZGVjb2RlLmg6IFJlZ2VuZXJhdGVkLgotCSogZXh0cmFjdC5jOiBSZWdlbmVyYXRlZC4KLQkqIG1vZGVsLmM6IFJlZ2VuZXJhdGVkLgotCSogc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlZC4KLQkqIHNlbS5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAuYzogR2V0IHJpZCBvZiB1bnVzZWQgZnVuY3Rpb25zLgotCi1Nb24gTm92ICA5IDE4OjI1OjQ3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogYXJjaC5jOiBSZWdlbmVyYXRlZC4KLQkqIGFyY2guaDogUmVnZW5lcmF0ZWQuCi0JKiBjcHUuYzogUmVnZW5lcmF0ZWQuCi0JKiBjcHUuaDogUmVnZW5lcmF0ZWQuCi0JKiBkZWNvZGUuYzogUmVnZW5lcmF0ZWQuCi0JKiBkZWNvZGUuaDogUmVnZW5lcmF0ZWQuCi0JKiBleHRyYWN0LmM6IFJlZ2VuZXJhdGVkLgotCSogbW9kZWwuYzogUmVnZW5lcmF0ZWQuCi0JKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgotCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC5jOiBHZXQgcmlkIG9mIG0zMnIgc3R1ZmYuIEZsZXNoIG91dCBmcjMwIHN0dWZmLgotCi1UaHUgTm92ICA1IDE1OjI2OjIyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY3B1Lmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgT2N0IDI3IDE1OjM5OjQ4IDE5OTYgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogRGlyZWN0b3J5IGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9NYWtlZmlsZS5pbiBiL3NpbS9mcjMwL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjczMTJlLi4wMDAwMDAwCi0tLSBhL3NpbS9mcjMwL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgZnIzMCBzaW11bGF0b3IKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSMgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1GUjMwX09CSlMgPSBmcjMwLm8gY3B1Lm8gZGVjb2RlLm8gc2VtLm8gbW9kZWwubyBtbG9vcC5vCi0KLUNPTkZJR19ERVZJQ0VTID0gZHYtc29ja3Nlci5vCi1DT05GSUdfREVWSUNFUyA9Ci0KLVNJTV9PQkpTID0gXAotCSQoU0lNX05FV19DT01NT05fT0JKUykgXAotCXNpbS1jcHUubyBcCi0Jc2ltLWhsb2FkLm8gXAotCXNpbS1ocncubyBcCi0Jc2ltLW1vZGVsLm8gXAotCXNpbS1yZWcubyBcCi0JY2dlbi11dGlscy5vIGNnZW4tdHJhY2UubyBjZ2VuLXNjYWNoZS5vIFwKLQljZ2VuLXJ1bi5vIHNpbS1yZWFzb24ubyBzaW0tZW5naW5lLm8gc2ltLXN0b3AubyBcCi0Jc2ltLWlmLm8gYXJjaC5vIFwKLQkkKEZSMzBfT0JKUykgXAotCXRyYXBzLm8gZGV2aWNlcy5vIFwKLQkkKENPTkZJR19ERVZJQ0VTKQotCi0jIEV4dHJhIGhlYWRlcnMgaW5jbHVkZWQgYnkgc2ltLW1haW4uaC4KLVNJTV9FWFRSQV9ERVBTID0gXAotCSQoQ0dFTl9JTkNMVURFX0RFUFMpIFwKLQlhcmNoLmggY3B1YWxsLmggZnIzMC1zaW0uaCAkKHNyY2RpcikvLi4vLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaAotCi1TSU1fRVhUUkFfQ0ZMQUdTID0KLQotU0lNX1JVTl9PQkpTID0gbnJ1bi5vCi1TSU1fRVhUUkFfQ0xFQU4gPSBmcjMwLWNsZWFuCi0KLSMgVGhpcyBzZWxlY3RzIHRoZSBmcjMwIG5ld2xpYi9saWJnbG9zcyBzeXNjYWxsIGRlZmluaXRpb25zLgotTkxfVEFSR0VUID0gLUROTF9UQVJHRVRfZnIzMAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1hcmNoID0gZnIzMAotCi1zaW0taWYubzogc2ltLWlmLmMgJChTSU1fTUFJTl9ERVBTKSAkKHNyY2RpcikvLi4vY29tbW9uL3NpbS1jb3JlLmgKLQotYXJjaC5vOiBhcmNoLmMgJChTSU1fTUFJTl9ERVBTKQotCi1kZXZpY2VzLm86IGRldmljZXMuYyAkKFNJTV9NQUlOX0RFUFMpCi0KLSMgRlIzMCBvYmpzCi0KLUZSMzBCRl9JTkNMVURFX0RFUFMgPSBcCi0JJChDR0VOX01BSU5fQ1BVX0RFUFMpIFwKLQljcHUuaCBkZWNvZGUuaCBlbmcuaAotCi1mcjMwLm86IGZyMzAuYyAkKEZSMzBCRl9JTkNMVURFX0RFUFMpCi0KLSMgRklYTUU6IFVzZSBvZiBgbW9ubycgaXMgd2lwLgotbWxvb3AuYyBlbmcuaDogc3RhbXAtbWxvb3AKLXN0YW1wLW1sb29wOiAkKHNyY2RpcikvLi4vY29tbW9uL2dlbm1sb29wLnNoIG1sb29wLmluIE1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNjb20pL2dlbm1sb29wLnNoIFwKLQkJLW1vbm8gLWZhc3QgLXBiYiAtc3dpdGNoIHNlbS1zd2l0Y2guYyBcCi0JCS1jcHUgZnIzMGJmIC1pbmZpbGUgJChzcmNkaXIpL21sb29wLmluCi0JJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSBlbmcuaGluIGVuZy5oCi0JJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSBtbG9vcC5jaW4gbWxvb3AuYwotCXRvdWNoIHN0YW1wLW1sb29wCi1tbG9vcC5vOiBtbG9vcC5jIHNlbS1zd2l0Y2guYyAkKEZSMzBCRl9JTkNMVURFX0RFUFMpCi0KLWNwdS5vOiBjcHUuYyAkKEZSMzBCRl9JTkNMVURFX0RFUFMpCi1kZWNvZGUubzogZGVjb2RlLmMgJChGUjMwQkZfSU5DTFVERV9ERVBTKQotc2VtLm86IHNlbS5jICQoRlIzMEJGX0lOQ0xVREVfREVQUykKLW1vZGVsLm86IG1vZGVsLmMgJChGUjMwQkZfSU5DTFVERV9ERVBTKQotCi1mcjMwLWNsZWFuOgotCXJtIC1mIG1sb29wLmMgZW5nLmggc3RhbXAtbWxvb3AKLQlybSAtZiB0bXAtKgotCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9SRUFETUUgYi9zaW0vZnIzMC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmYzMTQuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotVGhpcyBpcyB0aGUgZnIzMCBzaW11bGF0b3IgZGlyZWN0b3J5LgotCi1JdCBpcyBzdGlsbCB3b3JrLWluLXByb2dyZXNzLiAgVGhlIGN1cnJlbnQgc291cmNlcyBhcmUgcmVhc29uYWJseQotd2VsbCB0ZXN0ZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgYXJlIGluLiAgSG93ZXZlciwgdGhlcmUncyBsb3RzCi1tb3JlIHlldCB0byBjb21lLgotCi1UaGVyZSBhcmUgbG90cyBvZiBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKLVRoZXkgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jZ2VuLW1haW50LAotc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSB1bmRlciBhdXRvbWFrZS9hdXRvY29uZi4KLQotRm9yIGRldGFpbHMgb24gdGhlIGdlbmVyYXRvciwgc2VlIC4uLy4uL2NnZW4uCi0KLWRldm8vY2dlbiBpc24ndCBwYXJ0IG9mIHRoZSBjb21wLXRvb2xzIG1vZHVsZSB5ZXQuCi1Zb3UnbGwgbmVlZCB0byBjaGVjayBpdCBvdXQgbWFudWFsbHkgKGFsc28gYWtpbiB0byBhdXRvbWFrZS9hdXRvY29uZikuCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9UT0RPIGIvc2ltL2ZyMzAvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0Yzc2MC4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotbTMyci1pbmhlcml0ZWQgc3R1ZmY/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIGhlYWRlciBmaWxlIGRlcGVuZGVuY2llcyByZXZpc2l0Ci0tIGhvb2tzIGNsZWFudXAKLS0gdGVzdHN1aXRlcwotLSBGSVhNRSdzCi0KLQotbTMyciBzdHVmZj8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gbWVtb3J5IGFjY2Vzc2VzIHN0aWxsIHRlc3QgaWYgcHJvZmlsaW5nIGlzIG9uIGV2ZW4gaW4gZmFzdCBtb2RlCi0tIGhhdmUgc2VtYW50aWMgY29kZSB1c2UgRy9TRVRfSF9GT08gaWYgbm90IGRlZmF1bHQgW2luY2wgZnVuLWFjY2Vzc10KLS0gaGF2ZSBHL1NFVF9IX0ZPTyBtYWNyb3MgY2FsbCBmdW5jdGlvbiBpZiBmdW4tYWNjZXNzCi0tIC0tPiBjYW4gYWx3YXlzIHVzZSBHL1NfSF9GT08gbWFjcm9zCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9hcmNoLmMgYi9zaW0vZnIzMC9hcmNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZWVhMGQuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvYXJjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogU2ltdWxhdG9yIHN1cHBvcnQgZm9yIGZyMzAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImJmZC5oIgotCi1jb25zdCBNQUNIICpzaW1fbWFjaHNbXSA9Ci17Ci0jaWZkZWYgSEFWRV9DUFVfRlIzMEJGCi0gICYgZnIzMF9tYWNoLAotI2VuZGlmCi0gIDAKLX07Ci0KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2FyY2guaCBiL3NpbS9mcjMwL2FyY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjNTE2ZS4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9hcmNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBTaW11bGF0b3IgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfQVJDSF9ICi0jZGVmaW5lIEZSMzBfQVJDSF9ICi0KLSNkZWZpbmUgVEFSR0VUX0JJR19FTkRJQU4gMQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtb2RlbCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gbW9kZWxfdHlwZSB7Ci0gIE1PREVMX0ZSMzBfMSwgTU9ERUxfTUFYCi19IE1PREVMX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX01PREVMUyAoKGludCkgTU9ERUxfTUFYKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciB1bml0IHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSB1bml0X3R5cGUgewotICBVTklUX05PTkUsIFVOSVRfRlIzMF8xX1VfU1RNLCBVTklUX0ZSMzBfMV9VX0xETSwgVU5JVF9GUjMwXzFfVV9TVE9SRQotICwgVU5JVF9GUjMwXzFfVV9MT0FELCBVTklUX0ZSMzBfMV9VX0NUSSwgVU5JVF9GUjMwXzFfVV9FWEVDLCBVTklUX01BWAotfSBVTklUX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX1VOSVRTICgzKQotCi0jZW5kaWYgLyogRlIzMF9BUkNIX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NvbmZpZy5pbiBiL3NpbS9mcjMwL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyM2I4Ni4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCi0jdW5kZWYgV09SRFNfQklHRU5ESUFOCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX1NFVEZQVUNXCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NvbmZpZ3VyZSBiL3NpbS9mcjMwL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5NjIxNy4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0Mjk0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCwgIG5vbnN0cmljdCBvciBmb3JjZWQgYWxpZ25tZW50IG9mIG1lbW9yeSBhY2Nlc3Nlcy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc2NhY2hlPXNpemUJCVNwZWNpZnkgc2ltdWxhdG9yIGV4ZWN1dGlvbiBjYWNoZSBzaXplLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPW1vZGVsCVNwZWNpZnkgZGVmYXVsdCBtb2RlbCB0byBzaW11bGF0ZS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZW52aXJvbm1lbnQ9ZW52aXJvbm1lbnQJU3BlY2lmeSBtaXhlZCwgdXNlciwgdmlydHVhbCBvciBvcGVyYXRpbmcgZW52aXJvbm1lbnQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY2dlbi1tYWludFs9RElSXSAgICBidWlsZCBjZ2VuIGdlbmVyYXRlZCBmaWxlcyIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc0ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzM6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwMDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgzNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Nzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwMDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNDA6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3MzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA4OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0MTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA2OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjkxOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzUzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczOTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1NzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTU2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTg5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjMyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5NDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjc6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0NzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY2OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzkzOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyMTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDU2OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUzMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Mjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzYzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODUzOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODgxOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk2MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzExOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTc0OiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjE6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTY6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDM4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjA6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi0KLXdpcmVfZW5kaWFuPSJCSUdfRU5ESUFOIgotZGVmYXVsdF9lbmRpYW49IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0tZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSBlbHNlCi0gICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JIGVsc2UKLQkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLSAgZWxzZQotICAgIHNpbV9lbmRpYW49Ci0gIGZpCi1maQotZmkKLQotd2lyZV9hbGlnbm1lbnQ9IkZPUkNFRF9BTElHTk1FTlQiCi1kZWZhdWx0X2FsaWdubWVudD0iIgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7Ci0gIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLQkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyMTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYzOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpCi1maQotCi0KLWRlZmF1bHRfc2ltX3NjYWNoZT0iMTYzODQiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXNjYWNoZSBvciAtLWRpc2FibGUtc2ltLXNjYWNoZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc2NhY2hlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc2NhY2hlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iOzsKLSAgbm8pCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9MCIgOzsKLSAgWzAtOV0qKSBzaW1fY2FjaGU9JHtlbmFibGV2YWx9OzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiQmFkIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zY2FjaGUiIiAxPiYyOyBleGl0IDE7IH07Ci0Jc2ltX3NjYWNoZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NjYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2NhY2hlIHNpemUgPSAkc2ltX3NjYWNoZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iCi1maQotCi0KLQotZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbD0iZnIzMC0xIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIG9yIC0tZGlzYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVmYXVsdF9tb2RlbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJNaXNzaW5nIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIiIgMT4mMjsgZXhpdCAxOyB9OzsKLSAgKikJc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZW5hYmxldmFsfVwiJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWZhdWx0X21vZGVsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBkZWZhdWx0IG1vZGVsID0gJHNpbV9kZWZhdWx0X21vZGVsIiA2PiYxCi1maQotZWxzZQotICBzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsfVwiJyIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVudmlyb25tZW50IG9yIC0tZGlzYWJsZS1zaW0tZW52aXJvbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Vudmlyb25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW52aXJvbm1lbnQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYWxsIHwgQUxMKSAgICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiOzsKLSAgdXNlciB8IFVTRVIpICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1VU0VSX0VOVklST05NRU5UIjs7Ci0gIHZpcnR1YWwgfCBWSVJUVUFMKSAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VklSVFVBTF9FTlZJUk9OTUVOVCI7OwotICBvcGVyYXRpbmcgfCBPUEVSQVRJTkcpIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPU9QRVJBVElOR19FTlZJUk9OTUVOVCI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWVudmlyb25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OwotICAgICAgIHNpbV9lbnZpcm9ubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Vudmlyb25tZW50IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gZW52aXJvbm1lbnQgPSAkc2ltX2Vudmlyb25tZW50IiA2PiYxCi1maQotZWxzZQotICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiCi1maQotCi0KLWNnZW5fbWFpbnQ9bm8KLWNnZW49Z3VpbGUKLWNnZW5kaXI9JyQoc3JjZGlyKS8uLi8uLi9jZ2VuJwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNnZW4tbWFpbnQgb3IgLS1kaXNhYmxlLWNnZW4tbWFpbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY2dlbl9tYWludCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY2dlbl9tYWludCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCWNnZW5fbWFpbnQ9eWVzIDs7Ci0gIG5vKQljZ2VuX21haW50PW5vIDs7Ci0gICopCi0JIyBhcmd1bWVudCBpcyBjZ2VuIGluc3RhbGwgZGlyZWN0b3J5IChub3QgaW1wbGVtZW50ZWQgeWV0KS4KLQkjIEhhdmluZyBhIGBzaGFyZScgZGlyZWN0b3J5IG1pZ2h0IGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAuc2NtLAotCSMgLmNwdSwgZXRjLiBmaWxlcy4KLQljZ2VuZGlyPSR7Y2dlbl9tYWludH0vbGliL2NnZW4KLQljZ2VuPWd1aWxlCi0JOzsKLWVzYWMKLWZpCi1pZiB0ZXN0IHgke2NnZW5fbWFpbnR9ICE9IHhubyA7IHRoZW4KLSAgQ0dFTl9NQUlOVD0nJwotZWxzZQotICBDR0VOX01BSU5UPScjJwotZmkKLQotCi0KLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKLXMlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKLXMlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCi1zJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZwotcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKLXMlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENHRU5fTUFJTlRAJSRDR0VOX01BSU5UJWcKLXMlQGNnZW5kaXJAJSRjZ2VuZGlyJWcKLXMlQGNnZW5AJSRjZ2VuJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1hY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCi1hY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXNyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCi13aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCi0gIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgotICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKLQotICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKLQotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgJGFjX2Rlc3QKLQotICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRzcmNkaXIiIGluCi0gIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICBlc2FjCi0KLSAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKLSAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWRvbmUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotY2FzZSAieCRDT05GSUdfRklMRVMiIGluCi0geE1ha2VmaWxlKikKLSAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKLSAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKLSAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKLQktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCi0JPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKLSAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAotICAgOzsKLSBlc2FjCi0gY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQotCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9jb25maWd1cmUuaW4gYi9zaW0vZnIzMC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDFlMTMuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLVNJTV9BQ19PUFRJT05fRU5ESUFOKEJJR19FTkRJQU4pCi1TSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChGT1JDRURfQUxJR05NRU5UKQotU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCi1TSU1fQUNfT1BUSU9OX1NDQUNIRSgxNjM4NCkKLVNJTV9BQ19PUFRJT05fREVGQVVMVF9NT0RFTChmcjMwLTEpCi1TSU1fQUNfT1BUSU9OX0VOVklST05NRU5UCi1TSU1fQUNfT1BUSU9OX0NHRU5fTUFJTlQKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvY3B1LmMgYi9zaW0vZnIzMC9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5NDY4OC4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBNaXNjLiBzdXBwb3J0IGZvciBDUFUgZmFtaWx5IGZyMzBiZi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBmcjMwYmYKLSNkZWZpbmUgV0FOVF9DUFVfRlIzMEJGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImNnZW4tb3BzLmgiCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1wYy4gICovCi0KLVVTSQotZnIzMGJmX2hfcGNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9wYyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLXBjLiAgKi8KLQotdm9pZAotZnIzMGJmX2hfcGNfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX3BjKSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWdyLiAgKi8KLQotU0kKLWZyMzBiZl9oX2dyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCi17Ci0gIHJldHVybiBDUFUgKGhfZ3JbcmVnbm9dKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtZ3IuICAqLwotCi12b2lkCi1mcjMwYmZfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9ncltyZWdub10pID0gbmV3dmFsOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtY3IuICAqLwotCi1TSQotZnIzMGJmX2hfY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKLXsKLSAgcmV0dXJuIENQVSAoaF9jcltyZWdub10pOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1jci4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2NyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2NyW3JlZ25vXSkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1kci4gICovCi0KLVNJCi1mcjMwYmZfaF9kcl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICByZXR1cm4gR0VUX0hfRFIgKHJlZ25vKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtZHIuICAqLwotCi12b2lkCi1mcjMwYmZfaF9kcl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCi17Ci0gIFNFVF9IX0RSIChyZWdubywgbmV3dmFsKTsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXBzLiAgKi8KLQotVVNJCi1mcjMwYmZfaF9wc19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gR0VUX0hfUFMgKCk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLXBzLiAgKi8KLQotdm9pZAotZnIzMGJmX2hfcHNfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVNJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfUFMgKG5ld3ZhbCk7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1yMTMuICAqLwotCi1TSQotZnIzMGJmX2hfcjEzX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBDUFUgKGhfcjEzKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtcjEzLiAgKi8KLQotdm9pZAotZnIzMGJmX2hfcjEzX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX3IxMykgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1yMTQuICAqLwotCi1TSQotZnIzMGJmX2hfcjE0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBDUFUgKGhfcjE0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtcjE0LiAgKi8KLQotdm9pZAotZnIzMGJmX2hfcjE0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX3IxNCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1yMTUuICAqLwotCi1TSQotZnIzMGJmX2hfcjE1X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBDUFUgKGhfcjE1KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtcjE1LiAgKi8KLQotdm9pZAotZnIzMGJmX2hfcjE1X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX3IxNSkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1uYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX25iaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9uYml0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtbmJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX25iaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfbmJpdCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC16Yml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX3piaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF96Yml0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtemJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX3piaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfemJpdCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC12Yml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX3ZiaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF92Yml0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtdmJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX3ZiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfdmJpdCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1jYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX2NiaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9jYml0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtY2JpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2NiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfY2JpdCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1pYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX2liaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9pYml0KTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtaWJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2liaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfaWJpdCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1zYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX3NiaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIEdFVF9IX1NCSVQgKCk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLXNiaXQuICAqLwotCi12b2lkCi1mcjMwYmZfaF9zYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfU0JJVCAobmV3dmFsKTsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXRiaXQuICAqLwotCi1CSQotZnIzMGJmX2hfdGJpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX3RiaXQpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC10Yml0LiAgKi8KLQotdm9pZAotZnIzMGJmX2hfdGJpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCi17Ci0gIENQVSAoaF90Yml0KSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWQwYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX2QwYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBDUFUgKGhfZDBiaXQpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1kMGJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2QwYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2QwYml0KSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWQxYml0LiAgKi8KLQotQkkKLWZyMzBiZl9oX2QxYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBDUFUgKGhfZDFiaXQpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1kMWJpdC4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2QxYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2QxYml0KSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWNjci4gICovCi0KLVVRSQotZnIzMGJmX2hfY2NyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBHRVRfSF9DQ1IgKCk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWNjci4gICovCi0KLXZvaWQKLWZyMzBiZl9oX2Njcl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQotewotICBTRVRfSF9DQ1IgKG5ld3ZhbCk7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1zY3IuICAqLwotCi1VUUkKLWZyMzBiZl9oX3Njcl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gR0VUX0hfU0NSICgpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1zY3IuICAqLwotCi12b2lkCi1mcjMwYmZfaF9zY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfU0NSIChuZXd2YWwpOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtaWxtLiAgKi8KLQotVVFJCi1mcjMwYmZfaF9pbG1fZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIEdFVF9IX0lMTSAoKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtaWxtLiAgKi8KLQotdm9pZAotZnIzMGJmX2hfaWxtX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCi17Ci0gIFNFVF9IX0lMTSAobmV3dmFsKTsKLX0KLQotLyogUmVjb3JkIHRyYWNlIHJlc3VsdHMgZm9yIElOU04uICAqLwotCi12b2lkCi1mcjMwYmZfcmVjb3JkX3RyYWNlX3Jlc3VsdHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBDR0VOX0lOU04gKmluc24sCi0JCQkgICAgaW50ICppbmRpY2VzLCBUUkFDRV9SRUNPUkQgKnRyKQotewotfQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvY3B1LmggYi9zaW0vZnIzMC9jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NDVkYTEuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvY3B1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NjggKzAsMCBAQAotLyogQ1BVIGZhbWlseSBoZWFkZXIgZm9yIGZyMzBiZi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBDUFVfRlIzMEJGX0gKLSNkZWZpbmUgQ1BVX0ZSMzBCRl9ICi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGFyZSBmZXRjaGVkIGF0IGEgdGltZS4KLSAgIFRoaXMgaXMgZm9yIExJVyB0eXBlIGluc3RydWN0aW9ucyBzZXRzIChlLmcuIG0zMnIpLiAgKi8KLSNkZWZpbmUgTUFYX0xJV19JTlNOUyAxCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4gICovCi0jZGVmaW5lIE1BWF9QQVJBTExFTF9JTlNOUyAxCi0KLS8qIENQVSBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IHsKLSAgLyogcHJvZ3JhbSBjb3VudGVyICovCi0gIFVTSSBoX3BjOwotI2RlZmluZSBHRVRfSF9QQygpIENQVSAoaF9wYykKLSNkZWZpbmUgU0VUX0hfUEMoeCkgKENQVSAoaF9wYykgPSAoeCkpCi0gIC8qIGdlbmVyYWwgcmVnaXN0ZXJzICovCi0gIFNJIGhfZ3JbMTZdOwotI2RlZmluZSBHRVRfSF9HUihhMSkgQ1BVIChoX2dyKVthMV0KLSNkZWZpbmUgU0VUX0hfR1IoYTEsIHgpIChDUFUgKGhfZ3IpW2ExXSA9ICh4KSkKLSAgLyogY29wcm9jZXNzb3IgcmVnaXN0ZXJzICovCi0gIFNJIGhfY3JbMTZdOwotI2RlZmluZSBHRVRfSF9DUihhMSkgQ1BVIChoX2NyKVthMV0KLSNkZWZpbmUgU0VUX0hfQ1IoYTEsIHgpIChDUFUgKGhfY3IpW2ExXSA9ICh4KSkKLSAgLyogZGVkaWNhdGVkIHJlZ2lzdGVycyAqLwotICBTSSBoX2RyWzZdOwotI2RlZmluZSBHRVRfSF9EUihpbmRleCkgZnIzMGJmX2hfZHJfZ2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCBpbmRleCkKLSNkZWZpbmUgU0VUX0hfRFIoaW5kZXgsIHgpIFwKLWRvIHsgXAotZnIzMGJmX2hfZHJfc2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCAoaW5kZXgpLCAoeCkpO1wKLX0gd2hpbGUgKDApCi0gIC8qIHByb2Nlc3NvciBzdGF0dXMgKi8KLSAgVVNJIGhfcHM7Ci0jZGVmaW5lIEdFVF9IX1BTKCkgZnIzMGJmX2hfcHNfZ2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1KQotI2RlZmluZSBTRVRfSF9QUyh4KSBcCi1kbyB7IFwKLWZyMzBiZl9oX3BzX3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHgpKTtcCi19IHdoaWxlICgwKQotICAvKiBHZW5lcmFsIFJlZ2lzdGVyIDEzIGV4cGxpY2l0bHkgcmVxdWlyZWQgKi8KLSAgU0kgaF9yMTM7Ci0jZGVmaW5lIEdFVF9IX1IxMygpIENQVSAoaF9yMTMpCi0jZGVmaW5lIFNFVF9IX1IxMyh4KSAoQ1BVIChoX3IxMykgPSAoeCkpCi0gIC8qIEdlbmVyYWwgUmVnaXN0ZXIgMTQgZXhwbGljaXRseSByZXF1aXJlZCAqLwotICBTSSBoX3IxNDsKLSNkZWZpbmUgR0VUX0hfUjE0KCkgQ1BVIChoX3IxNCkKLSNkZWZpbmUgU0VUX0hfUjE0KHgpIChDUFUgKGhfcjE0KSA9ICh4KSkKLSAgLyogR2VuZXJhbCBSZWdpc3RlciAxNSBleHBsaWNpdGx5IHJlcXVpcmVkICovCi0gIFNJIGhfcjE1OwotI2RlZmluZSBHRVRfSF9SMTUoKSBDUFUgKGhfcjE1KQotI2RlZmluZSBTRVRfSF9SMTUoeCkgKENQVSAoaF9yMTUpID0gKHgpKQotICAvKiBuZWdhdGl2ZSAgICAgICAgIGJpdCAqLwotICBCSSBoX25iaXQ7Ci0jZGVmaW5lIEdFVF9IX05CSVQoKSBDUFUgKGhfbmJpdCkKLSNkZWZpbmUgU0VUX0hfTkJJVCh4KSAoQ1BVIChoX25iaXQpID0gKHgpKQotICAvKiB6ZXJvICAgICAgICAgICAgIGJpdCAqLwotICBCSSBoX3piaXQ7Ci0jZGVmaW5lIEdFVF9IX1pCSVQoKSBDUFUgKGhfemJpdCkKLSNkZWZpbmUgU0VUX0hfWkJJVCh4KSAoQ1BVIChoX3piaXQpID0gKHgpKQotICAvKiBvdmVyZmxvdyAgICAgICAgIGJpdCAqLwotICBCSSBoX3ZiaXQ7Ci0jZGVmaW5lIEdFVF9IX1ZCSVQoKSBDUFUgKGhfdmJpdCkKLSNkZWZpbmUgU0VUX0hfVkJJVCh4KSAoQ1BVIChoX3ZiaXQpID0gKHgpKQotICAvKiBjYXJyeSAgICAgICAgICAgIGJpdCAqLwotICBCSSBoX2NiaXQ7Ci0jZGVmaW5lIEdFVF9IX0NCSVQoKSBDUFUgKGhfY2JpdCkKLSNkZWZpbmUgU0VUX0hfQ0JJVCh4KSAoQ1BVIChoX2NiaXQpID0gKHgpKQotICAvKiBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLwotICBCSSBoX2liaXQ7Ci0jZGVmaW5lIEdFVF9IX0lCSVQoKSBDUFUgKGhfaWJpdCkKLSNkZWZpbmUgU0VUX0hfSUJJVCh4KSAoQ1BVIChoX2liaXQpID0gKHgpKQotICAvKiBzdGFjayBiaXQgKi8KLSAgQkkgaF9zYml0OwotI2RlZmluZSBHRVRfSF9TQklUKCkgZnIzMGJmX2hfc2JpdF9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCi0jZGVmaW5lIFNFVF9IX1NCSVQoeCkgXAotZG8geyBcCi1mcjMwYmZfaF9zYml0X3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHgpKTtcCi19IHdoaWxlICgwKQotICAvKiB0cmFjZSB0cmFwICAgICAgIGJpdCAqLwotICBCSSBoX3RiaXQ7Ci0jZGVmaW5lIEdFVF9IX1RCSVQoKSBDUFUgKGhfdGJpdCkKLSNkZWZpbmUgU0VUX0hfVEJJVCh4KSAoQ1BVIChoX3RiaXQpID0gKHgpKQotICAvKiBkaXZpc2lvbiAwICAgICAgIGJpdCAqLwotICBCSSBoX2QwYml0OwotI2RlZmluZSBHRVRfSF9EMEJJVCgpIENQVSAoaF9kMGJpdCkKLSNkZWZpbmUgU0VUX0hfRDBCSVQoeCkgKENQVSAoaF9kMGJpdCkgPSAoeCkpCi0gIC8qIGRpdmlzaW9uIDEgICAgICAgYml0ICovCi0gIEJJIGhfZDFiaXQ7Ci0jZGVmaW5lIEdFVF9IX0QxQklUKCkgQ1BVIChoX2QxYml0KQotI2RlZmluZSBTRVRfSF9EMUJJVCh4KSAoQ1BVIChoX2QxYml0KSA9ICh4KSkKLSAgLyogY29uZGl0aW9uIGNvZGUgYml0cyAqLwotICBVUUkgaF9jY3I7Ci0jZGVmaW5lIEdFVF9IX0NDUigpIGZyMzBiZl9oX2Njcl9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCi0jZGVmaW5lIFNFVF9IX0NDUih4KSBcCi1kbyB7IFwKLWZyMzBiZl9oX2Njcl9zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsICh4KSk7XAotfSB3aGlsZSAoMCkKLSAgLyogc3lzdGVtIGNvbmRpdGlvbiBiaXRzICovCi0gIFVRSSBoX3NjcjsKLSNkZWZpbmUgR0VUX0hfU0NSKCkgZnIzMGJmX2hfc2NyX2dldF9oYW5kbGVyIChjdXJyZW50X2NwdSkKLSNkZWZpbmUgU0VUX0hfU0NSKHgpIFwKLWRvIHsgXAotZnIzMGJmX2hfc2NyX3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHgpKTtcCi19IHdoaWxlICgwKQotICAvKiBpbnRlcnJ1cHQgbGV2ZWwgbWFzayAqLwotICBVUUkgaF9pbG07Ci0jZGVmaW5lIEdFVF9IX0lMTSgpIGZyMzBiZl9oX2lsbV9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCi0jZGVmaW5lIFNFVF9IX0lMTSh4KSBcCi1kbyB7IFwKLWZyMzBiZl9oX2lsbV9zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsICh4KSk7XAotfSB3aGlsZSAoMCkKLSAgfSBoYXJkd2FyZTsKLSNkZWZpbmUgQ1BVX0NHRU5fSFcoY3B1KSAoJiAoY3B1KS0+Y3B1X2RhdGEuaGFyZHdhcmUpCi19IEZSMzBCRl9DUFVfREFUQTsKLQotLyogQ292ZXIgZm5zIGZvciByZWdpc3RlciBhY2Nlc3MuICAqLwotVVNJIGZyMzBiZl9oX3BjX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgZnIzMGJmX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7Ci1TSSBmcjMwYmZfaF9ncl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Ci12b2lkIGZyMzBiZl9oX2dyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7Ci1TSSBmcjMwYmZfaF9jcl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Ci12b2lkIGZyMzBiZl9oX2NyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7Ci1TSSBmcjMwYmZfaF9kcl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Ci12b2lkIGZyMzBiZl9oX2RyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7Ci1VU0kgZnIzMGJmX2hfcHNfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF9wc19zZXQgKFNJTV9DUFUgKiwgVVNJKTsKLVNJIGZyMzBiZl9oX3IxM19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX3IxM19zZXQgKFNJTV9DUFUgKiwgU0kpOwotU0kgZnIzMGJmX2hfcjE0X2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgZnIzMGJmX2hfcjE0X3NldCAoU0lNX0NQVSAqLCBTSSk7Ci1TSSBmcjMwYmZfaF9yMTVfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF9yMTVfc2V0IChTSU1fQ1BVICosIFNJKTsKLUJJIGZyMzBiZl9oX25iaXRfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF9uYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7Ci1CSSBmcjMwYmZfaF96Yml0X2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgZnIzMGJmX2hfemJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOwotQkkgZnIzMGJmX2hfdmJpdF9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX3ZiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKLUJJIGZyMzBiZl9oX2NiaXRfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF9jYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7Ci1CSSBmcjMwYmZfaF9pYml0X2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgZnIzMGJmX2hfaWJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOwotQkkgZnIzMGJmX2hfc2JpdF9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX3NiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKLUJJIGZyMzBiZl9oX3RiaXRfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF90Yml0X3NldCAoU0lNX0NQVSAqLCBCSSk7Ci1CSSBmcjMwYmZfaF9kMGJpdF9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX2QwYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7Ci1CSSBmcjMwYmZfaF9kMWJpdF9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX2QxYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7Ci1VUUkgZnIzMGJmX2hfY2NyX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgZnIzMGJmX2hfY2NyX3NldCAoU0lNX0NQVSAqLCBVUUkpOwotVVFJIGZyMzBiZl9oX3Njcl9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGZyMzBiZl9oX3Njcl9zZXQgKFNJTV9DUFUgKiwgVVFJKTsKLVVRSSBmcjMwYmZfaF9pbG1fZ2V0IChTSU1fQ1BVICopOwotdm9pZCBmcjMwYmZfaF9pbG1fc2V0IChTSU1fQ1BVICosIFVRSSk7Ci0KLS8qIFRoZXNlIG11c3QgYmUgaGFuZC13cml0dGVuLiAgKi8KLWV4dGVybiBDUFVSRUdfRkVUQ0hfRk4gZnIzMGJmX2ZldGNoX3JlZ2lzdGVyOwotZXh0ZXJuIENQVVJFR19TVE9SRV9GTiBmcjMwYmZfc3RvcmVfcmVnaXN0ZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgVUlOVCBsb2FkX3JlZ3M7Ci0gIFVJTlQgbG9hZF9yZWdzX3BlbmRpbmc7Ci19IE1PREVMX0ZSMzBfMV9EQVRBOwotCi0vKiBJbnN0cnVjdGlvbiBhcmd1bWVudCBidWZmZXIuICAqLwotCi11bmlvbiBzZW1fZmllbGRzIHsKLSAgc3RydWN0IHsgLyogbm8gb3BlcmFuZHMgKi8KLSAgICBpbnQgZW1wdHk7Ci0gIH0gZm10X2VtcHR5OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBJQUREUiBpX2xhYmVsOTsKLSAgfSBzZm10X2JyYWQ7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFVJTlQgZl91ODsKLSAgfSBzZm10X2ludDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgSUFERFIgaV9sYWJlbDEyOwotICB9IHNmbXRfY2FsbDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kgZl9zMTA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7Ci0gIH0gc2ZtdF9hZGRzcDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVVNJIGZfZGlyMTA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7Ci0gIH0gc2ZtdF9kbW92cjE1cGk7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFVJTlQgZl9kaXI4OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOwotICB9IHNmbXRfZG1vdnIxM3BpYjsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVVNJIGZfZGlyOTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKLSAgfSBzZm10X2Rtb3ZyMTNwaWg7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFVTSSBmX2RpcjEwOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOwotICB9IHNmbXRfZG1vdnIxM3BpOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICBVSU5UIGZfUnMxOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7Ci0gIH0gc2ZtdF9tb3YyZHI7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFVJTlQgZl9SczE7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfUmk7Ci0gIH0gc2ZtdF9tb3ZkcjsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVUlOVCBmX1JzMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKLSAgfSBzZm10X2xkcjE1ZHI7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFVJTlQgZl9pMzI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfUmk7Ci0gIH0gc2ZtdF9sZGkzMjsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgVUlOVCBmX2kyMDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKLSAgfSBzZm10X2xkaTIwOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICBVSU5UIGZfaTg7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfUmk7Ci0gIH0gc2ZtdF9sZGk4OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX1JpOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICB9IHNmbXRfc3RyMTVncjsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgVVNJIGZfdWRpc3A2OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICB9IHNmbXRfc3RyMTU7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIElOVCBmX2Rpc3A4OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OwotICB9IHNmbXRfc3RyMTRiOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICBTSSBmX2Rpc3A5OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OwotICB9IHNmbXRfc3RyMTRoOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICBTSSBmX2Rpc3AxMDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX1JpOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKLSAgfSBzZm10X3N0cjE0OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9SaTsKLSAgICBVU0kgZl91ZGlzcDY7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOwotICB9IHNmbXRfbGRyMTU7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIElOVCBmX2Rpc3A4OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKLSAgfSBzZm10X2xkcjE0dWI7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFNJIGZfZGlzcDk7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOwotICB9IHNmbXRfbGRyMTR1aDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgU0kgZl9kaXNwMTA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOwotICB9IHNmbXRfbGRyMTQ7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFNJIGZfbTQ7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9SaTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKLSAgfSBzZm10X2FkZDI7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFVJTlQgZl91NDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX1JpOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOwotICB9IHNmbXRfYWRkaTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVVNJIGZfdTEwOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICB9IHNmbXRfZW50ZXI7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX1JpOwotICAgIFNJKiBpX1JqOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9SajsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7Ci0gIH0gc2ZtdF9zdHIxMzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgVUlOVCBmX1JpOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICB9IHNmbXRfbGRyMTVncjsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgU0kqIGlfUmo7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9SajsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfUmk7Ci0gIH0gc2ZtdF9sZHIxMzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfUmk7Ci0gICAgU0kqIGlfUmo7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9SaTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX1JqOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOwotICB9IHNmbXRfYWRkOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBVSU5UIGZfcmVnbGlzdF9oaV9zdDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzExOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfODsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfOTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICB9IHNmbXRfc3RtMTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVUlOVCBmX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTA7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTM7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfODsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzk7Ci0gIH0gc2ZtdF9sZG0xOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBVSU5UIGZfcmVnbGlzdF9sb3dfc3Q7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8yOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8zOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl80OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl81OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl82OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl83OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7Ci0gIH0gc2ZtdF9zdG0wOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBVSU5UIGZfcmVnbGlzdF9sb3dfbGQ7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8zOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzU7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl82OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNzsKLSAgfSBzZm10X2xkbTA7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCCi0gIC8qIFdyaXRlYmFjayBoYW5kbGVyLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBQb2ludGVyIHRvIGFyZ2J1ZiBlbnRyeSBmb3IgaW5zbiB3aG9zZSByZXN1bHRzIG5lZWQgd3JpdGluZyBiYWNrLiAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgYXJnYnVmICphYnVmOwotICB9IHdyaXRlOwotICAvKiB4LWJlZm9yZSBoYW5kbGVyICovCi0gIHN0cnVjdCB7Ci0gICAgLypjb25zdCBTQ0FDSEUgKmluc25zW01BWF9QQVJBTExFTF9JTlNOU107Ki8KLSAgICBpbnQgZmlyc3RfcDsKLSAgfSBiZWZvcmU7Ci0gIC8qIHgtYWZ0ZXIgaGFuZGxlciAqLwotICBzdHJ1Y3QgewotICAgIGludCBlbXB0eTsKLSAgfSBhZnRlcjsKLSAgLyogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBlYWNoIHBiYi4gICovCi0gIHN0cnVjdCB7Ci0gICAgLyogTnVtYmVyIG9mIGluc25zIGluIHBiYi4gICovCi0gICAgaW50IGluc25fY291bnQ7Ci0gICAgLyogTmV4dCBwYmIgdG8gZXhlY3V0ZS4gICovCi0gICAgU0NBQ0hFICpuZXh0OwotICAgIFNDQUNIRSAqYnJhbmNoX3RhcmdldDsKLSAgfSBjaGFpbjsKLSNlbmRpZgotfTsKLQotLyogVGhlIEFSR0JVRiBzdHJ1Y3QuICAqLwotc3RydWN0IGFyZ2J1ZiB7Ci0gIC8qIFRoZXNlIGFyZSB0aGUgYmFzZWNsYXNzIGRlZmluaXRpb25zLiAgKi8KLSAgSUFERFIgYWRkcjsKLSAgY29uc3QgSURFU0MgKmlkZXNjOwotICBjaGFyIHRyYWNlX3A7Ci0gIGNoYXIgcHJvZmlsZV9wOwotICAvKiA/Pz8gVGVtcG9yYXJ5IGhhY2sgZm9yIHNraXAgaW5zbnMuICAqLwotICBjaGFyIHNraXBfY291bnQ7Ci0gIGNoYXIgdW51c2VkOwotICAvKiBjcHUgc3BlY2lmaWMgZGF0YSBmb2xsb3dzICovCi0gIHVuaW9uIHNlbSBzZW1hbnRpYzsKLSAgaW50IHdyaXR0ZW47Ci0gIHVuaW9uIHNlbV9maWVsZHMgZmllbGRzOwotfTsKLQotLyogQSBjYWNoZWQgaW5zbi4KLQotICAgPz8/IFNDQUNIRSB1c2VkIHRvIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgYXJnYnVmLiAgV2UgY291bGQgZGVsZXRlIHRoZQotICAgdHlwZSBlbnRpcmVseSBhbmQgYWx3YXlzIGp1c3QgdXNlIEFSR0JVRiwgYnV0IGZvciBmdXR1cmUgY29uY2VybnMgYW5kIGFzCi0gICBhIGxldmVsIG9mIGFic3RyYWN0aW9uIGl0IGlzIGxlZnQgaW4uICAqLwotCi1zdHJ1Y3Qgc2NhY2hlIHsKLSAgc3RydWN0IGFyZ2J1ZiBhcmdidWY7Ci19OwotCi0vKiBNYWNyb3MgdG8gc2ltcGxpZnkgZXh0cmFjdGlvbiwgcmVhZGluZyBhbmQgc2VtYW50aWMgY29kZS4KLSAgIFRoZXNlIGRlZmluZSBhbmQgYXNzaWduIHRoZSBsb2NhbCB2YXJzIHRoYXQgY29udGFpbiB0aGUgaW5zbidzIGZpZWxkcy4gICovCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0VNUFRZX1ZBUlMgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfQ09ERSBcCi0gIGxlbmd0aCA9IDA7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX1JqOyBcCi0gIFVJTlQgZl9SaTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERElfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfdTQ7IFwKLSAgVUlOVCBmX1JpOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERJX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl91NCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERDJfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBTSSBmX200OyBcCi0gIFVJTlQgZl9SaTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREMl9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfbTQgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIHwgKCgoLTEpIDw8ICg0KSkpKTsgXAotICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfb3AzOyBcCi0gIFVJTlQgZl9SaTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWMFNfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RJVjNfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfb3AzOyBcCi0gIFVJTlQgZl9vcDQ7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RJVjNfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9vcDQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREk4X1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9pODsgXAotICBVSU5UIGZfUmk7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESThfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfaTggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDgpOyBcCi0gIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkyMF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfaTIwXzQ7IFwKLSAgVUlOVCBmX2kyMF8xNjsgXAotICBVSU5UIGZfaTIwOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX1JpOyBcCi0gIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovIFwKLSAgVUlOVCB3b3JkXzE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESTIwX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIHdvcmRfMSA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2kyMF80ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX2kyMF8xNiA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAxNiwgMCwgMTYpIDw8IDApKTsgXAote1wKLSAgZl9pMjAgPSAoKCgoZl9pMjBfNCkgPDwgKDE2KSkpIHwgKGZfaTIwXzE2KSk7XAotfVwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkzMl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfaTMyOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX29wMzsgXAotICBVSU5UIGZfUmk7IFwKLSAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8gXAotICBVSU5UIHdvcmRfMTsgXAotICBVSU5UIHdvcmRfMjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTERJMzJfQ09ERSBcCi0gIGxlbmd0aCA9IDY7IFwKLSAgd29yZF8xID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgMik7IFwKLSAgd29yZF8yID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgNCk7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfaTMyID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzIsIDE2LCAwLCAxNikgPDwgMCl8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDE2LCAwLCAxNikgPDwgMTYpKTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDMgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBTSSBmX2Rpc3AxMDsgXAotICBVSU5UIGZfUmk7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE0X0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2Rpc3AxMCA9ICgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDQsIDgpKSA8PCAoMikpOyBcCi0gIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNFVIX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFNJIGZfZGlzcDk7IFwKLSAgVUlOVCBmX1JpOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNFVIX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2Rpc3A5ID0gKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgNCwgOCkpIDw8ICgxKSk7IFwKLSAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE0VUJfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgSU5UIGZfZGlzcDg7IFwKLSAgVUlOVCBmX1JpOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNFVCX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2Rpc3A4ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDQsIDgpOyBcCi0gIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVTSSBmX3VkaXNwNjsgXAotICBVSU5UIGZfUmk7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE1X0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl91ZGlzcDYgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIDw8ICgyKSk7IFwKLSAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE1RFJfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfb3AzOyBcCi0gIFVJTlQgZl9SczI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE1RFJfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9SczIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NT1ZEUl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9SczE7IFwKLSAgVUlOVCBmX1JpOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NT1ZEUl9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfUnMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ0FMTF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3A1OyBcCi0gIFNJIGZfcmVsMTI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NBTExfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3A1ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCAxKTsgXAotICBmX3JlbDEyID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA1LCAxMSkpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0lOVF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl91ODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfSU5UX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl91OCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfY2M7IFwKLSAgU0kgZl9yZWw5OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CUkFEX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2NjID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX3JlbDkgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9ETU9WUjEzX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVVNJIGZfZGlyMTA7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2RpcjEwID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RNT1ZSMTNIX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVVNJIGZfZGlyOTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfRE1PVlIxM0hfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2RpcjkgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgxKSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfZGlyODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2RpcjggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NPUE9QX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9jY2M7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfb3AzOyBcCi0gIFVJTlQgZl9DUmo7IFwKLSAgVUlOVCBmX3U0YzsgXAotICBVSU5UIGZfQ1JpOyBcCi0gIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovIFwKLSAgVUlOVCB3b3JkXzE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NPUE9QX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIHdvcmRfMSA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX2NjYyA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAxNiwgMCwgOCkgPDwgMCkpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9DUmogPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMTYsIDgsIDQpIDw8IDApKTsgXAotICBmX3U0YyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0gIGZfQ1JpID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDE2LCAxMiwgMTYpIDw8IDApKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DT1BMRF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfY2NjOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX29wMzsgXAotICBVSU5UIGZfUmpjOyBcCi0gIFVJTlQgZl91NGM7IFwKLSAgVUlOVCBmX0NSaTsgXAotICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLyBcCi0gIFVJTlQgd29yZF8xOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DT1BMRF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICB3b3JkXzEgPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMgKyAyKTsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9jY2MgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMTYsIDAsIDgpIDw8IDApKTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDMgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfUmpjID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDE2LCA4LCA0KSA8PCAwKSk7IFwKLSAgZl91NGMgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotICBmX0NSaSA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAxNiwgMTIsIDE2KSA8PCAwKSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ09QU1RfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX2NjYzsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9vcDM7IFwKLSAgVUlOVCBmX0NSajsgXAotICBVSU5UIGZfdTRjOyBcCi0gIFVJTlQgZl9SaWM7IFwKLSAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8gXAotICBVSU5UIHdvcmRfMTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ09QU1RfQ09ERSBcCi0gIGxlbmd0aCA9IDQ7IFwKLSAgd29yZF8xID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgMik7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfY2NjID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDE2LCAwLCA4KSA8PCAwKSk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AzID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX0NSaiA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAxNiwgOCwgNCkgPDwgMCkpOyBcCi0gIGZfdTRjID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLSAgZl9SaWMgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMTYsIDEyLCAxNikgPDwgMCkpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERFNQX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgU0kgZl9zMTA7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERFNQX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9zMTAgPSAoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRE0wX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3JlZ2xpc3RfbG93X2xkOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRE0wX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9yZWdsaXN0X2xvd19sZCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTERNMV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yZWdsaXN0X2hpX2xkOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRE0xX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9yZWdsaXN0X2hpX2xkID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVE0wX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3JlZ2xpc3RfbG93X3N0OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVE0wX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9yZWdsaXN0X2xvd19zdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RNMV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yZWdsaXN0X2hpX3N0OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVE0xX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9yZWdsaXN0X2hpX3N0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTlRFUl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVTSSBmX3UxMDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfRU5URVJfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX3UxMCA9ICgoRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKTsgXAotCi0vKiBDb2xsZWN0aW9uIG9mIHZhcmlvdXMgdGhpbmdzIGZvciB0aGUgdHJhY2UgaGFuZGxlciB0byB1c2UuICAqLwotCi10eXBlZGVmIHN0cnVjdCB0cmFjZV9yZWNvcmQgewotICBJQUREUiBwYzsKLSAgLyogRklYTUU6d2lwICovCi19IFRSQUNFX1JFQ09SRDsKLQotI2VuZGlmIC8qIENQVV9GUjMwQkZfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvY3B1YWxsLmggYi9zaW0vZnIzMC9jcHVhbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlYmI5MC4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9jcHVhbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIFNpbXVsYXRvciBDUFUgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfQ1BVQUxMX0gKLSNkZWZpbmUgRlIzMF9DUFVBTExfSAotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIGNwdSBmYW1pbHkuICAqLwotCi0jaWZkZWYgV0FOVF9DUFVfRlIzMEJGCi0jaW5jbHVkZSAiZW5nLmgiCi0jaW5jbHVkZSAiY2dlbi1lbmdpbmUuaCIKLSNpbmNsdWRlICJjcHUuaCIKLSNpbmNsdWRlICJkZWNvZGUuaCIKLSNlbmRpZgotCi1leHRlcm4gY29uc3QgTUFDSCBmcjMwX21hY2g7Ci0KLSNpZm5kZWYgV0FOVF9DUFUKLS8qIFRoZSBBUkdCVUYgc3RydWN0LiAgKi8KLXN0cnVjdCBhcmdidWYgewotICAvKiBUaGVzZSBhcmUgdGhlIGJhc2VjbGFzcyBkZWZpbml0aW9ucy4gICovCi0gIElBRERSIGFkZHI7Ci0gIGNvbnN0IElERVNDICppZGVzYzsKLSAgY2hhciB0cmFjZV9wOwotICBjaGFyIHByb2ZpbGVfcDsKLSAgLyogPz8/IFRlbXBvcmFyeSBoYWNrIGZvciBza2lwIGluc25zLiAgKi8KLSAgY2hhciBza2lwX2NvdW50OwotICBjaGFyIHVudXNlZDsKLSAgLyogY3B1IHNwZWNpZmljIGRhdGEgZm9sbG93cyAqLwotfTsKLSNlbmRpZgotCi0jaWZuZGVmIFdBTlRfQ1BVCi0vKiBBIGNhY2hlZCBpbnNuLgotCi0gICA/Pz8gU0NBQ0hFIHVzZWQgdG8gY29udGFpbiBtb3JlIHRoYW4ganVzdCBhcmdidWYuICBXZSBjb3VsZCBkZWxldGUgdGhlCi0gICB0eXBlIGVudGlyZWx5IGFuZCBhbHdheXMganVzdCB1c2UgQVJHQlVGLCBidXQgZm9yIGZ1dHVyZSBjb25jZXJucyBhbmQgYXMKLSAgIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXQgaXMgbGVmdCBpbi4gICovCi0KLXN0cnVjdCBzY2FjaGUgewotICBzdHJ1Y3QgYXJnYnVmIGFyZ2J1ZjsKLX07Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEZSMzBfQ1BVQUxMX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2RlY29kZS5jIGIvc2ltL2ZyMzAvZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDZhMTEuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUwICswLDAgQEAKLS8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBkZWNvZGVyIGZvciBmcjMwYmYuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNkZWZpbmUgV0FOVF9DUFUgZnIzMGJmCi0jZGVmaW5lIFdBTlRfQ1BVX0ZSMzBCRgotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIGFycmF5LgotICAgVGhpcyBpcyBjb21wdXRlZCBhdCBydW50aW1lLiAgU3BhY2UgZm9yIGl0IGlzIG5vdCBtYWxsb2MnZCB0byBzYXZlIGEKLSAgIHRlZW5zeSBiaXQgb2YgY3B1IGluIHRoZSBkZWNvZGVyLiAgTW92aW5nIGl0IHRvIG1hbGxvYyBzcGFjZSBpcyB0cml2aWFsCi0gICBidXQgd29uJ3QgYmUgZG9uZSB1bnRpbCBuZWNlc3NhcnkgKHdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBydW50aW1lCi0gICBhZGRpdGlvbiBvZiBpbnN0cnVjdGlvbnMgbm9yIGFuIFNNUCBtYWNoaW5lIHdpdGggZGlmZmVyZW50IGNwdXMpLiAgKi8KLXN0YXRpYyBJREVTQyBmcjMwYmZfaW5zbl9kYXRhW0ZSMzBCRl9JTlNOX01BWF07Ci0KLS8qIENvbW1hcyBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb250YWluZWQgaW4gdGhlIG1hY3Jvcy4KLSAgIFNvbWUgb2YgdGhlc2UgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgb3V0LiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBmcjMwYmZfaW5zbl9zZW1bXSA9Ci17Ci0gIHsgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCwgRlIzMEJGX0lOU05fWF9JTlZBTElELCBGUjMwQkZfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0FGVEVSLCBGUjMwQkZfSU5TTl9YX0FGVEVSLCBGUjMwQkZfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgRlIzMEJGX0lOU05fWF9CRUZPUkUsIEZSMzBCRl9TRk1UX0VNUFRZIH0sCi0gIHsgVklSVFVBTF9JTlNOX1hfQ1RJX0NIQUlOLCBGUjMwQkZfSU5TTl9YX0NUSV9DSEFJTiwgRlIzMEJGX1NGTVRfRU1QVFkgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9DSEFJTiwgRlIzMEJGX0lOU05fWF9DSEFJTiwgRlIzMEJGX1NGTVRfRU1QVFkgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9CRUdJTiwgRlIzMEJGX0lOU05fWF9CRUdJTiwgRlIzMEJGX1NGTVRfRU1QVFkgfSwKLSAgeyBGUjMwX0lOU05fQURELCBGUjMwQkZfSU5TTl9BREQsIEZSMzBCRl9TRk1UX0FERCB9LAotICB7IEZSMzBfSU5TTl9BRERJLCBGUjMwQkZfSU5TTl9BRERJLCBGUjMwQkZfU0ZNVF9BRERJIH0sCi0gIHsgRlIzMF9JTlNOX0FERDIsIEZSMzBCRl9JTlNOX0FERDIsIEZSMzBCRl9TRk1UX0FERDIgfSwKLSAgeyBGUjMwX0lOU05fQUREQywgRlIzMEJGX0lOU05fQUREQywgRlIzMEJGX1NGTVRfQUREQyB9LAotICB7IEZSMzBfSU5TTl9BREROLCBGUjMwQkZfSU5TTl9BREROLCBGUjMwQkZfU0ZNVF9BREROIH0sCi0gIHsgRlIzMF9JTlNOX0FERE5JLCBGUjMwQkZfSU5TTl9BREROSSwgRlIzMEJGX1NGTVRfQURETkkgfSwKLSAgeyBGUjMwX0lOU05fQURETjIsIEZSMzBCRl9JTlNOX0FERE4yLCBGUjMwQkZfU0ZNVF9BREROMiB9LAotICB7IEZSMzBfSU5TTl9TVUIsIEZSMzBCRl9JTlNOX1NVQiwgRlIzMEJGX1NGTVRfQUREIH0sCi0gIHsgRlIzMF9JTlNOX1NVQkMsIEZSMzBCRl9JTlNOX1NVQkMsIEZSMzBCRl9TRk1UX0FEREMgfSwKLSAgeyBGUjMwX0lOU05fU1VCTiwgRlIzMEJGX0lOU05fU1VCTiwgRlIzMEJGX1NGTVRfQURETiB9LAotICB7IEZSMzBfSU5TTl9DTVAsIEZSMzBCRl9JTlNOX0NNUCwgRlIzMEJGX1NGTVRfQ01QIH0sCi0gIHsgRlIzMF9JTlNOX0NNUEksIEZSMzBCRl9JTlNOX0NNUEksIEZSMzBCRl9TRk1UX0NNUEkgfSwKLSAgeyBGUjMwX0lOU05fQ01QMiwgRlIzMEJGX0lOU05fQ01QMiwgRlIzMEJGX1NGTVRfQ01QMiB9LAotICB7IEZSMzBfSU5TTl9BTkQsIEZSMzBCRl9JTlNOX0FORCwgRlIzMEJGX1NGTVRfQU5EIH0sCi0gIHsgRlIzMF9JTlNOX09SLCBGUjMwQkZfSU5TTl9PUiwgRlIzMEJGX1NGTVRfQU5EIH0sCi0gIHsgRlIzMF9JTlNOX0VPUiwgRlIzMEJGX0lOU05fRU9SLCBGUjMwQkZfU0ZNVF9BTkQgfSwKLSAgeyBGUjMwX0lOU05fQU5ETSwgRlIzMEJGX0lOU05fQU5ETSwgRlIzMEJGX1NGTVRfQU5ETSB9LAotICB7IEZSMzBfSU5TTl9BTkRILCBGUjMwQkZfSU5TTl9BTkRILCBGUjMwQkZfU0ZNVF9BTkRIIH0sCi0gIHsgRlIzMF9JTlNOX0FOREIsIEZSMzBCRl9JTlNOX0FOREIsIEZSMzBCRl9TRk1UX0FOREIgfSwKLSAgeyBGUjMwX0lOU05fT1JNLCBGUjMwQkZfSU5TTl9PUk0sIEZSMzBCRl9TRk1UX0FORE0gfSwKLSAgeyBGUjMwX0lOU05fT1JILCBGUjMwQkZfSU5TTl9PUkgsIEZSMzBCRl9TRk1UX0FOREggfSwKLSAgeyBGUjMwX0lOU05fT1JCLCBGUjMwQkZfSU5TTl9PUkIsIEZSMzBCRl9TRk1UX0FOREIgfSwKLSAgeyBGUjMwX0lOU05fRU9STSwgRlIzMEJGX0lOU05fRU9STSwgRlIzMEJGX1NGTVRfQU5ETSB9LAotICB7IEZSMzBfSU5TTl9FT1JILCBGUjMwQkZfSU5TTl9FT1JILCBGUjMwQkZfU0ZNVF9BTkRIIH0sCi0gIHsgRlIzMF9JTlNOX0VPUkIsIEZSMzBCRl9JTlNOX0VPUkIsIEZSMzBCRl9TRk1UX0FOREIgfSwKLSAgeyBGUjMwX0lOU05fQkFOREwsIEZSMzBCRl9JTlNOX0JBTkRMLCBGUjMwQkZfU0ZNVF9CQU5ETCB9LAotICB7IEZSMzBfSU5TTl9CT1JMLCBGUjMwQkZfSU5TTl9CT1JMLCBGUjMwQkZfU0ZNVF9CQU5ETCB9LAotICB7IEZSMzBfSU5TTl9CRU9STCwgRlIzMEJGX0lOU05fQkVPUkwsIEZSMzBCRl9TRk1UX0JBTkRMIH0sCi0gIHsgRlIzMF9JTlNOX0JBTkRILCBGUjMwQkZfSU5TTl9CQU5ESCwgRlIzMEJGX1NGTVRfQkFOREwgfSwKLSAgeyBGUjMwX0lOU05fQk9SSCwgRlIzMEJGX0lOU05fQk9SSCwgRlIzMEJGX1NGTVRfQkFOREwgfSwKLSAgeyBGUjMwX0lOU05fQkVPUkgsIEZSMzBCRl9JTlNOX0JFT1JILCBGUjMwQkZfU0ZNVF9CQU5ETCB9LAotICB7IEZSMzBfSU5TTl9CVFNUTCwgRlIzMEJGX0lOU05fQlRTVEwsIEZSMzBCRl9TRk1UX0JUU1RMIH0sCi0gIHsgRlIzMF9JTlNOX0JUU1RILCBGUjMwQkZfSU5TTl9CVFNUSCwgRlIzMEJGX1NGTVRfQlRTVEwgfSwKLSAgeyBGUjMwX0lOU05fTVVMLCBGUjMwQkZfSU5TTl9NVUwsIEZSMzBCRl9TRk1UX01VTCB9LAotICB7IEZSMzBfSU5TTl9NVUxVLCBGUjMwQkZfSU5TTl9NVUxVLCBGUjMwQkZfU0ZNVF9NVUxVIH0sCi0gIHsgRlIzMF9JTlNOX01VTEgsIEZSMzBCRl9JTlNOX01VTEgsIEZSMzBCRl9TRk1UX01VTEggfSwKLSAgeyBGUjMwX0lOU05fTVVMVUgsIEZSMzBCRl9JTlNOX01VTFVILCBGUjMwQkZfU0ZNVF9NVUxIIH0sCi0gIHsgRlIzMF9JTlNOX0RJVjBTLCBGUjMwQkZfSU5TTl9ESVYwUywgRlIzMEJGX1NGTVRfRElWMFMgfSwKLSAgeyBGUjMwX0lOU05fRElWMFUsIEZSMzBCRl9JTlNOX0RJVjBVLCBGUjMwQkZfU0ZNVF9ESVYwVSB9LAotICB7IEZSMzBfSU5TTl9ESVYxLCBGUjMwQkZfSU5TTl9ESVYxLCBGUjMwQkZfU0ZNVF9ESVYxIH0sCi0gIHsgRlIzMF9JTlNOX0RJVjIsIEZSMzBCRl9JTlNOX0RJVjIsIEZSMzBCRl9TRk1UX0RJVjIgfSwKLSAgeyBGUjMwX0lOU05fRElWMywgRlIzMEJGX0lOU05fRElWMywgRlIzMEJGX1NGTVRfRElWMyB9LAotICB7IEZSMzBfSU5TTl9ESVY0UywgRlIzMEJGX0lOU05fRElWNFMsIEZSMzBCRl9TRk1UX0RJVjRTIH0sCi0gIHsgRlIzMF9JTlNOX0xTTCwgRlIzMEJGX0lOU05fTFNMLCBGUjMwQkZfU0ZNVF9MU0wgfSwKLSAgeyBGUjMwX0lOU05fTFNMSSwgRlIzMEJGX0lOU05fTFNMSSwgRlIzMEJGX1NGTVRfTFNMSSB9LAotICB7IEZSMzBfSU5TTl9MU0wyLCBGUjMwQkZfSU5TTl9MU0wyLCBGUjMwQkZfU0ZNVF9MU0xJIH0sCi0gIHsgRlIzMF9JTlNOX0xTUiwgRlIzMEJGX0lOU05fTFNSLCBGUjMwQkZfU0ZNVF9MU0wgfSwKLSAgeyBGUjMwX0lOU05fTFNSSSwgRlIzMEJGX0lOU05fTFNSSSwgRlIzMEJGX1NGTVRfTFNMSSB9LAotICB7IEZSMzBfSU5TTl9MU1IyLCBGUjMwQkZfSU5TTl9MU1IyLCBGUjMwQkZfU0ZNVF9MU0xJIH0sCi0gIHsgRlIzMF9JTlNOX0FTUiwgRlIzMEJGX0lOU05fQVNSLCBGUjMwQkZfU0ZNVF9MU0wgfSwKLSAgeyBGUjMwX0lOU05fQVNSSSwgRlIzMEJGX0lOU05fQVNSSSwgRlIzMEJGX1NGTVRfTFNMSSB9LAotICB7IEZSMzBfSU5TTl9BU1IyLCBGUjMwQkZfSU5TTl9BU1IyLCBGUjMwQkZfU0ZNVF9MU0xJIH0sCi0gIHsgRlIzMF9JTlNOX0xESTgsIEZSMzBCRl9JTlNOX0xESTgsIEZSMzBCRl9TRk1UX0xESTggfSwKLSAgeyBGUjMwX0lOU05fTERJMjAsIEZSMzBCRl9JTlNOX0xESTIwLCBGUjMwQkZfU0ZNVF9MREkyMCB9LAotICB7IEZSMzBfSU5TTl9MREkzMiwgRlIzMEJGX0lOU05fTERJMzIsIEZSMzBCRl9TRk1UX0xESTMyIH0sCi0gIHsgRlIzMF9JTlNOX0xELCBGUjMwQkZfSU5TTl9MRCwgRlIzMEJGX1NGTVRfTEQgfSwKLSAgeyBGUjMwX0lOU05fTERVSCwgRlIzMEJGX0lOU05fTERVSCwgRlIzMEJGX1NGTVRfTEQgfSwKLSAgeyBGUjMwX0lOU05fTERVQiwgRlIzMEJGX0lOU05fTERVQiwgRlIzMEJGX1NGTVRfTEQgfSwKLSAgeyBGUjMwX0lOU05fTERSMTMsIEZSMzBCRl9JTlNOX0xEUjEzLCBGUjMwQkZfU0ZNVF9MRFIxMyB9LAotICB7IEZSMzBfSU5TTl9MRFIxM1VILCBGUjMwQkZfSU5TTl9MRFIxM1VILCBGUjMwQkZfU0ZNVF9MRFIxMyB9LAotICB7IEZSMzBfSU5TTl9MRFIxM1VCLCBGUjMwQkZfSU5TTl9MRFIxM1VCLCBGUjMwQkZfU0ZNVF9MRFIxMyB9LAotICB7IEZSMzBfSU5TTl9MRFIxNCwgRlIzMEJGX0lOU05fTERSMTQsIEZSMzBCRl9TRk1UX0xEUjE0IH0sCi0gIHsgRlIzMF9JTlNOX0xEUjE0VUgsIEZSMzBCRl9JTlNOX0xEUjE0VUgsIEZSMzBCRl9TRk1UX0xEUjE0VUggfSwKLSAgeyBGUjMwX0lOU05fTERSMTRVQiwgRlIzMEJGX0lOU05fTERSMTRVQiwgRlIzMEJGX1NGTVRfTERSMTRVQiB9LAotICB7IEZSMzBfSU5TTl9MRFIxNSwgRlIzMEJGX0lOU05fTERSMTUsIEZSMzBCRl9TRk1UX0xEUjE1IH0sCi0gIHsgRlIzMF9JTlNOX0xEUjE1R1IsIEZSMzBCRl9JTlNOX0xEUjE1R1IsIEZSMzBCRl9TRk1UX0xEUjE1R1IgfSwKLSAgeyBGUjMwX0lOU05fTERSMTVEUiwgRlIzMEJGX0lOU05fTERSMTVEUiwgRlIzMEJGX1NGTVRfTERSMTVEUiB9LAotICB7IEZSMzBfSU5TTl9MRFIxNVBTLCBGUjMwQkZfSU5TTl9MRFIxNVBTLCBGUjMwQkZfU0ZNVF9MRFIxNVBTIH0sCi0gIHsgRlIzMF9JTlNOX1NULCBGUjMwQkZfSU5TTl9TVCwgRlIzMEJGX1NGTVRfU1QgfSwKLSAgeyBGUjMwX0lOU05fU1RILCBGUjMwQkZfSU5TTl9TVEgsIEZSMzBCRl9TRk1UX1NUIH0sCi0gIHsgRlIzMF9JTlNOX1NUQiwgRlIzMEJGX0lOU05fU1RCLCBGUjMwQkZfU0ZNVF9TVCB9LAotICB7IEZSMzBfSU5TTl9TVFIxMywgRlIzMEJGX0lOU05fU1RSMTMsIEZSMzBCRl9TRk1UX1NUUjEzIH0sCi0gIHsgRlIzMF9JTlNOX1NUUjEzSCwgRlIzMEJGX0lOU05fU1RSMTNILCBGUjMwQkZfU0ZNVF9TVFIxMyB9LAotICB7IEZSMzBfSU5TTl9TVFIxM0IsIEZSMzBCRl9JTlNOX1NUUjEzQiwgRlIzMEJGX1NGTVRfU1RSMTMgfSwKLSAgeyBGUjMwX0lOU05fU1RSMTQsIEZSMzBCRl9JTlNOX1NUUjE0LCBGUjMwQkZfU0ZNVF9TVFIxNCB9LAotICB7IEZSMzBfSU5TTl9TVFIxNEgsIEZSMzBCRl9JTlNOX1NUUjE0SCwgRlIzMEJGX1NGTVRfU1RSMTRIIH0sCi0gIHsgRlIzMF9JTlNOX1NUUjE0QiwgRlIzMEJGX0lOU05fU1RSMTRCLCBGUjMwQkZfU0ZNVF9TVFIxNEIgfSwKLSAgeyBGUjMwX0lOU05fU1RSMTUsIEZSMzBCRl9JTlNOX1NUUjE1LCBGUjMwQkZfU0ZNVF9TVFIxNSB9LAotICB7IEZSMzBfSU5TTl9TVFIxNUdSLCBGUjMwQkZfSU5TTl9TVFIxNUdSLCBGUjMwQkZfU0ZNVF9TVFIxNUdSIH0sCi0gIHsgRlIzMF9JTlNOX1NUUjE1RFIsIEZSMzBCRl9JTlNOX1NUUjE1RFIsIEZSMzBCRl9TRk1UX1NUUjE1RFIgfSwKLSAgeyBGUjMwX0lOU05fU1RSMTVQUywgRlIzMEJGX0lOU05fU1RSMTVQUywgRlIzMEJGX1NGTVRfU1RSMTVQUyB9LAotICB7IEZSMzBfSU5TTl9NT1YsIEZSMzBCRl9JTlNOX01PViwgRlIzMEJGX1NGTVRfTU9WIH0sCi0gIHsgRlIzMF9JTlNOX01PVkRSLCBGUjMwQkZfSU5TTl9NT1ZEUiwgRlIzMEJGX1NGTVRfTU9WRFIgfSwKLSAgeyBGUjMwX0lOU05fTU9WUFMsIEZSMzBCRl9JTlNOX01PVlBTLCBGUjMwQkZfU0ZNVF9NT1ZQUyB9LAotICB7IEZSMzBfSU5TTl9NT1YyRFIsIEZSMzBCRl9JTlNOX01PVjJEUiwgRlIzMEJGX1NGTVRfTU9WMkRSIH0sCi0gIHsgRlIzMF9JTlNOX01PVjJQUywgRlIzMEJGX0lOU05fTU9WMlBTLCBGUjMwQkZfU0ZNVF9NT1YyUFMgfSwKLSAgeyBGUjMwX0lOU05fSk1QLCBGUjMwQkZfSU5TTl9KTVAsIEZSMzBCRl9TRk1UX0pNUCB9LAotICB7IEZSMzBfSU5TTl9KTVBELCBGUjMwQkZfSU5TTl9KTVBELCBGUjMwQkZfU0ZNVF9KTVAgfSwKLSAgeyBGUjMwX0lOU05fQ0FMTFIsIEZSMzBCRl9JTlNOX0NBTExSLCBGUjMwQkZfU0ZNVF9DQUxMUiB9LAotICB7IEZSMzBfSU5TTl9DQUxMUkQsIEZSMzBCRl9JTlNOX0NBTExSRCwgRlIzMEJGX1NGTVRfQ0FMTFIgfSwKLSAgeyBGUjMwX0lOU05fQ0FMTCwgRlIzMEJGX0lOU05fQ0FMTCwgRlIzMEJGX1NGTVRfQ0FMTCB9LAotICB7IEZSMzBfSU5TTl9DQUxMRCwgRlIzMEJGX0lOU05fQ0FMTEQsIEZSMzBCRl9TRk1UX0NBTEwgfSwKLSAgeyBGUjMwX0lOU05fUkVULCBGUjMwQkZfSU5TTl9SRVQsIEZSMzBCRl9TRk1UX1JFVCB9LAotICB7IEZSMzBfSU5TTl9SRVRfRCwgRlIzMEJGX0lOU05fUkVUX0QsIEZSMzBCRl9TRk1UX1JFVCB9LAotICB7IEZSMzBfSU5TTl9JTlQsIEZSMzBCRl9JTlNOX0lOVCwgRlIzMEJGX1NGTVRfSU5UIH0sCi0gIHsgRlIzMF9JTlNOX0lOVEUsIEZSMzBCRl9JTlNOX0lOVEUsIEZSMzBCRl9TRk1UX0lOVEUgfSwKLSAgeyBGUjMwX0lOU05fUkVUSSwgRlIzMEJGX0lOU05fUkVUSSwgRlIzMEJGX1NGTVRfUkVUSSB9LAotICB7IEZSMzBfSU5TTl9CUkFELCBGUjMwQkZfSU5TTl9CUkFELCBGUjMwQkZfU0ZNVF9CUkFEIH0sCi0gIHsgRlIzMF9JTlNOX0JSQSwgRlIzMEJGX0lOU05fQlJBLCBGUjMwQkZfU0ZNVF9CUkFEIH0sCi0gIHsgRlIzMF9JTlNOX0JOT0QsIEZSMzBCRl9JTlNOX0JOT0QsIEZSMzBCRl9TRk1UX0JOT0QgfSwKLSAgeyBGUjMwX0lOU05fQk5PLCBGUjMwQkZfSU5TTl9CTk8sIEZSMzBCRl9TRk1UX0JOT0QgfSwKLSAgeyBGUjMwX0lOU05fQkVRRCwgRlIzMEJGX0lOU05fQkVRRCwgRlIzMEJGX1NGTVRfQkVRRCB9LAotICB7IEZSMzBfSU5TTl9CRVEsIEZSMzBCRl9JTlNOX0JFUSwgRlIzMEJGX1NGTVRfQkVRRCB9LAotICB7IEZSMzBfSU5TTl9CTkVELCBGUjMwQkZfSU5TTl9CTkVELCBGUjMwQkZfU0ZNVF9CRVFEIH0sCi0gIHsgRlIzMF9JTlNOX0JORSwgRlIzMEJGX0lOU05fQk5FLCBGUjMwQkZfU0ZNVF9CRVFEIH0sCi0gIHsgRlIzMF9JTlNOX0JDRCwgRlIzMEJGX0lOU05fQkNELCBGUjMwQkZfU0ZNVF9CQ0QgfSwKLSAgeyBGUjMwX0lOU05fQkMsIEZSMzBCRl9JTlNOX0JDLCBGUjMwQkZfU0ZNVF9CQ0QgfSwKLSAgeyBGUjMwX0lOU05fQk5DRCwgRlIzMEJGX0lOU05fQk5DRCwgRlIzMEJGX1NGTVRfQkNEIH0sCi0gIHsgRlIzMF9JTlNOX0JOQywgRlIzMEJGX0lOU05fQk5DLCBGUjMwQkZfU0ZNVF9CQ0QgfSwKLSAgeyBGUjMwX0lOU05fQk5ELCBGUjMwQkZfSU5TTl9CTkQsIEZSMzBCRl9TRk1UX0JORCB9LAotICB7IEZSMzBfSU5TTl9CTiwgRlIzMEJGX0lOU05fQk4sIEZSMzBCRl9TRk1UX0JORCB9LAotICB7IEZSMzBfSU5TTl9CUEQsIEZSMzBCRl9JTlNOX0JQRCwgRlIzMEJGX1NGTVRfQk5EIH0sCi0gIHsgRlIzMF9JTlNOX0JQLCBGUjMwQkZfSU5TTl9CUCwgRlIzMEJGX1NGTVRfQk5EIH0sCi0gIHsgRlIzMF9JTlNOX0JWRCwgRlIzMEJGX0lOU05fQlZELCBGUjMwQkZfU0ZNVF9CVkQgfSwKLSAgeyBGUjMwX0lOU05fQlYsIEZSMzBCRl9JTlNOX0JWLCBGUjMwQkZfU0ZNVF9CVkQgfSwKLSAgeyBGUjMwX0lOU05fQk5WRCwgRlIzMEJGX0lOU05fQk5WRCwgRlIzMEJGX1NGTVRfQlZEIH0sCi0gIHsgRlIzMF9JTlNOX0JOViwgRlIzMEJGX0lOU05fQk5WLCBGUjMwQkZfU0ZNVF9CVkQgfSwKLSAgeyBGUjMwX0lOU05fQkxURCwgRlIzMEJGX0lOU05fQkxURCwgRlIzMEJGX1NGTVRfQkxURCB9LAotICB7IEZSMzBfSU5TTl9CTFQsIEZSMzBCRl9JTlNOX0JMVCwgRlIzMEJGX1NGTVRfQkxURCB9LAotICB7IEZSMzBfSU5TTl9CR0VELCBGUjMwQkZfSU5TTl9CR0VELCBGUjMwQkZfU0ZNVF9CTFREIH0sCi0gIHsgRlIzMF9JTlNOX0JHRSwgRlIzMEJGX0lOU05fQkdFLCBGUjMwQkZfU0ZNVF9CTFREIH0sCi0gIHsgRlIzMF9JTlNOX0JMRUQsIEZSMzBCRl9JTlNOX0JMRUQsIEZSMzBCRl9TRk1UX0JMRUQgfSwKLSAgeyBGUjMwX0lOU05fQkxFLCBGUjMwQkZfSU5TTl9CTEUsIEZSMzBCRl9TRk1UX0JMRUQgfSwKLSAgeyBGUjMwX0lOU05fQkdURCwgRlIzMEJGX0lOU05fQkdURCwgRlIzMEJGX1NGTVRfQkxFRCB9LAotICB7IEZSMzBfSU5TTl9CR1QsIEZSMzBCRl9JTlNOX0JHVCwgRlIzMEJGX1NGTVRfQkxFRCB9LAotICB7IEZSMzBfSU5TTl9CTFNELCBGUjMwQkZfSU5TTl9CTFNELCBGUjMwQkZfU0ZNVF9CTFNEIH0sCi0gIHsgRlIzMF9JTlNOX0JMUywgRlIzMEJGX0lOU05fQkxTLCBGUjMwQkZfU0ZNVF9CTFNEIH0sCi0gIHsgRlIzMF9JTlNOX0JISUQsIEZSMzBCRl9JTlNOX0JISUQsIEZSMzBCRl9TRk1UX0JMU0QgfSwKLSAgeyBGUjMwX0lOU05fQkhJLCBGUjMwQkZfSU5TTl9CSEksIEZSMzBCRl9TRk1UX0JMU0QgfSwKLSAgeyBGUjMwX0lOU05fRE1PVlIxMywgRlIzMEJGX0lOU05fRE1PVlIxMywgRlIzMEJGX1NGTVRfRE1PVlIxMyB9LAotICB7IEZSMzBfSU5TTl9ETU9WUjEzSCwgRlIzMEJGX0lOU05fRE1PVlIxM0gsIEZSMzBCRl9TRk1UX0RNT1ZSMTNIIH0sCi0gIHsgRlIzMF9JTlNOX0RNT1ZSMTNCLCBGUjMwQkZfSU5TTl9ETU9WUjEzQiwgRlIzMEJGX1NGTVRfRE1PVlIxM0IgfSwKLSAgeyBGUjMwX0lOU05fRE1PVlIxM1BJLCBGUjMwQkZfSU5TTl9ETU9WUjEzUEksIEZSMzBCRl9TRk1UX0RNT1ZSMTNQSSB9LAotICB7IEZSMzBfSU5TTl9ETU9WUjEzUElILCBGUjMwQkZfSU5TTl9ETU9WUjEzUElILCBGUjMwQkZfU0ZNVF9ETU9WUjEzUElIIH0sCi0gIHsgRlIzMF9JTlNOX0RNT1ZSMTNQSUIsIEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUIsIEZSMzBCRl9TRk1UX0RNT1ZSMTNQSUIgfSwKLSAgeyBGUjMwX0lOU05fRE1PVlIxNVBJLCBGUjMwQkZfSU5TTl9ETU9WUjE1UEksIEZSMzBCRl9TRk1UX0RNT1ZSMTVQSSB9LAotICB7IEZSMzBfSU5TTl9ETU9WMlIxMywgRlIzMEJGX0lOU05fRE1PVjJSMTMsIEZSMzBCRl9TRk1UX0RNT1YyUjEzIH0sCi0gIHsgRlIzMF9JTlNOX0RNT1YyUjEzSCwgRlIzMEJGX0lOU05fRE1PVjJSMTNILCBGUjMwQkZfU0ZNVF9ETU9WMlIxM0ggfSwKLSAgeyBGUjMwX0lOU05fRE1PVjJSMTNCLCBGUjMwQkZfSU5TTl9ETU9WMlIxM0IsIEZSMzBCRl9TRk1UX0RNT1YyUjEzQiB9LAotICB7IEZSMzBfSU5TTl9ETU9WMlIxM1BJLCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJLCBGUjMwQkZfU0ZNVF9ETU9WMlIxM1BJIH0sCi0gIHsgRlIzMF9JTlNOX0RNT1YyUjEzUElILCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMEJGX1NGTVRfRE1PVjJSMTNQSUggfSwKLSAgeyBGUjMwX0lOU05fRE1PVjJSMTNQSUIsIEZSMzBCRl9JTlNOX0RNT1YyUjEzUElCLCBGUjMwQkZfU0ZNVF9ETU9WMlIxM1BJQiB9LAotICB7IEZSMzBfSU5TTl9ETU9WMlIxNVBELCBGUjMwQkZfSU5TTl9ETU9WMlIxNVBELCBGUjMwQkZfU0ZNVF9ETU9WMlIxNVBEIH0sCi0gIHsgRlIzMF9JTlNOX0xEUkVTLCBGUjMwQkZfSU5TTl9MRFJFUywgRlIzMEJGX1NGTVRfTERSRVMgfSwKLSAgeyBGUjMwX0lOU05fU1RSRVMsIEZSMzBCRl9JTlNOX1NUUkVTLCBGUjMwQkZfU0ZNVF9MRFJFUyB9LAotICB7IEZSMzBfSU5TTl9DT1BPUCwgRlIzMEJGX0lOU05fQ09QT1AsIEZSMzBCRl9TRk1UX0NPUE9QIH0sCi0gIHsgRlIzMF9JTlNOX0NPUExELCBGUjMwQkZfSU5TTl9DT1BMRCwgRlIzMEJGX1NGTVRfQ09QT1AgfSwKLSAgeyBGUjMwX0lOU05fQ09QU1QsIEZSMzBCRl9JTlNOX0NPUFNULCBGUjMwQkZfU0ZNVF9DT1BPUCB9LAotICB7IEZSMzBfSU5TTl9DT1BTViwgRlIzMEJGX0lOU05fQ09QU1YsIEZSMzBCRl9TRk1UX0NPUE9QIH0sCi0gIHsgRlIzMF9JTlNOX05PUCwgRlIzMEJGX0lOU05fTk9QLCBGUjMwQkZfU0ZNVF9CTk9EIH0sCi0gIHsgRlIzMF9JTlNOX0FORENDUiwgRlIzMEJGX0lOU05fQU5EQ0NSLCBGUjMwQkZfU0ZNVF9BTkRDQ1IgfSwKLSAgeyBGUjMwX0lOU05fT1JDQ1IsIEZSMzBCRl9JTlNOX09SQ0NSLCBGUjMwQkZfU0ZNVF9BTkRDQ1IgfSwKLSAgeyBGUjMwX0lOU05fU1RJTE0sIEZSMzBCRl9JTlNOX1NUSUxNLCBGUjMwQkZfU0ZNVF9TVElMTSB9LAotICB7IEZSMzBfSU5TTl9BRERTUCwgRlIzMEJGX0lOU05fQUREU1AsIEZSMzBCRl9TRk1UX0FERFNQIH0sCi0gIHsgRlIzMF9JTlNOX0VYVFNCLCBGUjMwQkZfSU5TTl9FWFRTQiwgRlIzMEJGX1NGTVRfRVhUU0IgfSwKLSAgeyBGUjMwX0lOU05fRVhUVUIsIEZSMzBCRl9JTlNOX0VYVFVCLCBGUjMwQkZfU0ZNVF9FWFRVQiB9LAotICB7IEZSMzBfSU5TTl9FWFRTSCwgRlIzMEJGX0lOU05fRVhUU0gsIEZSMzBCRl9TRk1UX0VYVFNIIH0sCi0gIHsgRlIzMF9JTlNOX0VYVFVILCBGUjMwQkZfSU5TTl9FWFRVSCwgRlIzMEJGX1NGTVRfRVhUVUggfSwKLSAgeyBGUjMwX0lOU05fTERNMCwgRlIzMEJGX0lOU05fTERNMCwgRlIzMEJGX1NGTVRfTERNMCB9LAotICB7IEZSMzBfSU5TTl9MRE0xLCBGUjMwQkZfSU5TTl9MRE0xLCBGUjMwQkZfU0ZNVF9MRE0xIH0sCi0gIHsgRlIzMF9JTlNOX1NUTTAsIEZSMzBCRl9JTlNOX1NUTTAsIEZSMzBCRl9TRk1UX1NUTTAgfSwKLSAgeyBGUjMwX0lOU05fU1RNMSwgRlIzMEJGX0lOU05fU1RNMSwgRlIzMEJGX1NGTVRfU1RNMSB9LAotICB7IEZSMzBfSU5TTl9FTlRFUiwgRlIzMEJGX0lOU05fRU5URVIsIEZSMzBCRl9TRk1UX0VOVEVSIH0sCi0gIHsgRlIzMF9JTlNOX0xFQVZFLCBGUjMwQkZfSU5TTl9MRUFWRSwgRlIzMEJGX1NGTVRfTEVBVkUgfSwKLSAgeyBGUjMwX0lOU05fWENIQiwgRlIzMEJGX0lOU05fWENIQiwgRlIzMEJGX1NGTVRfWENIQiB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBmcjMwYmZfaW5zbl9zZW1faW52YWxpZCA9IHsKLSAgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCwgRlIzMEJGX0lOU05fWF9JTlZBTElELCBGUjMwQkZfU0ZNVF9FTVBUWQotfTsKLQotLyogSW5pdGlhbGl6ZSBhbiBJREVTQyBmcm9tIHRoZSBjb21waWxlLXRpbWUgY29tcHV0YWJsZSBwYXJ0cy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5pdF9pZGVzYyAoU0lNX0NQVSAqY3B1LCBJREVTQyAqaWQsIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSAqdCkKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICppbnNuX3RhYmxlID0gQ0dFTl9DUFVfSU5TTl9UQUJMRSAoQ1BVX0NQVV9ERVNDIChjcHUpKS0+aW5pdF9lbnRyaWVzOwotCi0gIGlkLT5udW0gPSB0LT5pbmRleDsKLSAgaWQtPnNmbXQgPSB0LT5zZm10OwotICBpZiAoKGludCkgdC0+dHlwZSA8PSAwKQotICAgIGlkLT5pZGF0YSA9ICYgY2dlbl92aXJ0dWFsX2luc25fdGFibGVbLSAoaW50KSB0LT50eXBlXTsKLSAgZWxzZQotICAgIGlkLT5pZGF0YSA9ICYgaW5zbl90YWJsZVt0LT50eXBlXTsKLSAgaWQtPmF0dHJzID0gQ0dFTl9JTlNOX0FUVFJTIChpZC0+aWRhdGEpOwotICAvKiBPaCBteSBnb2QsIGEgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaWQtPmxlbmd0aCA9IENHRU5fSU5TTl9CSVRTSVpFIChpZC0+aWRhdGEpIC8gODsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIGlkLT50aW1pbmcgPSAmIE1PREVMX1RJTUlORyAoQ1BVX01PREVMIChjcHUpKSBbdC0+aW5kZXhdOwotICB7Ci0gICAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gICAgU0lNX0FTU0VSVCAodC0+aW5kZXggPT0gaWQtPnRpbWluZy0+bnVtKTsKLSAgfQotI2VuZGlmCi0KLSAgLyogU2VtYW50aWMgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkIGVsc2V3aGVyZS4gICovCi19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGFibGUuICAqLwotCi12b2lkCi1mcjMwYmZfaW5pdF9pZGVzY190YWJsZSAoU0lNX0NQVSAqY3B1KQotewotICBJREVTQyAqaWQsKnRhYmVuZDsKLSAgY29uc3Qgc3RydWN0IGluc25fc2VtICp0LCp0ZW5kOwotICBpbnQgdGFic2l6ZSA9IEZSMzBCRl9JTlNOX01BWDsKLSAgSURFU0MgKnRhYmxlID0gZnIzMGJmX2luc25fZGF0YTsKLQotICBtZW1zZXQgKHRhYmxlLCAwLCB0YWJzaXplICogc2l6ZW9mIChJREVTQykpOwotCi0gIC8qIEZpcnN0IHNldCBhbGwgZW50cmllcyB0byB0aGUgYGludmFsaWQgaW5zbicuICAqLwotICB0ID0gJiBmcjMwYmZfaW5zbl9zZW1faW52YWxpZDsKLSAgZm9yIChpZCA9IHRhYmxlLCB0YWJlbmQgPSB0YWJsZSArIHRhYnNpemU7IGlkIDwgdGFiZW5kOyArK2lkKQotICAgIGluaXRfaWRlc2MgKGNwdSwgaWQsIHQpOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRoZSBjaG9zZW4gY3B1LiAgKi8KLSAgZm9yICh0ID0gZnIzMGJmX2luc25fc2VtLCB0ZW5kID0gdCArIHNpemVvZiAoZnIzMGJmX2luc25fc2VtKSAvIHNpemVvZiAoKnQpOwotICAgICAgIHQgIT0gdGVuZDsgKyt0KQotICAgIHsKLSAgICAgIGluaXRfaWRlc2MgKGNwdSwgJiB0YWJsZVt0LT5pbmRleF0sIHQpOwotICAgIH0KLQotICAvKiBMaW5rIHRoZSBJREVTQyB0YWJsZSBpbnRvIHRoZSBjcHUuICAqLwotICBDUFVfSURFU0MgKGNwdSkgPSB0YWJsZTsKLX0KLQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gaXRzIElERVNDIGVudHJ5LiAgKi8KLQotY29uc3QgSURFU0MgKgotZnIzMGJmX2RlY29kZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIElBRERSIHBjLAotICAgICAgICAgICAgICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbiwKLSAgICAgICAgICAgICAgQVJHQlVGICphYnVmKQotewotICAvKiBSZXN1bHQgb2YgZGVjb2Rlci4gICovCi0gIEZSMzBCRl9JTlNOX1RZUEUgaXR5cGU7Ci0KLSAgewotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDI1NSA8PCAwKSkpOwotICAgICAgc3dpdGNoICh2YWwpCi0gICAgICB7Ci0gICAgICBjYXNlIDAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xEUjEzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHIxMzsKLSAgICAgIGNhc2UgMSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTNVSDsgZ290byBleHRyYWN0X3NmbXRfbGRyMTM7Ci0gICAgICBjYXNlIDIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xEUjEzVUI7IGdvdG8gZXh0cmFjdF9zZm10X2xkcjEzOwotICAgICAgY2FzZSAzIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9MRFIxNTsgZ290byBleHRyYWN0X3NmbXRfbGRyMTU7Ci0gICAgICBjYXNlIDQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZDsKLSAgICAgIGNhc2UgNSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERVSDsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDYgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xEVUI7IGdvdG8gZXh0cmFjdF9zZm10X2xkOwotICAgICAgY2FzZSA3IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDQpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTVHUjsgZ290byBleHRyYWN0X3NmbXRfbGRyMTVncjsKLSAgICAgICAgICBjYXNlIDEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX01PVjJQUzsgZ290byBleHRyYWN0X3NmbXRfbW92MnBzOwotICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTVEUjsgZ290byBleHRyYWN0X3NmbXRfbGRyMTVkcjsKLSAgICAgICAgICBjYXNlIDkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xEUjE1UFM7IGdvdG8gZXh0cmFjdF9zZm10X2xkcjE1cHM7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gRlIzMEJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgOCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRE1PVjJSMTM7IGdvdG8gZXh0cmFjdF9zZm10X2Rtb3YycjEzOwotICAgICAgY2FzZSA5IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9ETU9WMlIxM0g7IGdvdG8gZXh0cmFjdF9zZm10X2Rtb3YycjEzaDsKLSAgICAgIGNhc2UgMTAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RNT1YyUjEzQjsgZ290byBleHRyYWN0X3NmbXRfZG1vdjJyMTNiOwotICAgICAgY2FzZSAxMSA6IGl0eXBlID0gRlIzMEJGX0lOU05fRE1PVjJSMTVQRDsgZ290byBleHRyYWN0X3NmbXRfZG1vdjJyMTVwZDsKLSAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RNT1YyUjEzUEk7IGdvdG8gZXh0cmFjdF9zZm10X2Rtb3YycjEzcGk7Ci0gICAgICBjYXNlIDEzIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSDsgZ290byBleHRyYWN0X3NmbXRfZG1vdjJyMTNwaWg7Ci0gICAgICBjYXNlIDE0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJQjsgZ290byBleHRyYWN0X3NmbXRfZG1vdjJyMTNwaWI7Ci0gICAgICBjYXNlIDE1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9FTlRFUjsgZ290byBleHRyYWN0X3NmbXRfZW50ZXI7Ci0gICAgICBjYXNlIDE2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9TVFIxMzsgZ290byBleHRyYWN0X3NmbXRfc3RyMTM7Ci0gICAgICBjYXNlIDE3IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9TVFIxM0g7IGdvdG8gZXh0cmFjdF9zZm10X3N0cjEzOwotICAgICAgY2FzZSAxOCA6IGl0eXBlID0gRlIzMEJGX0lOU05fU1RSMTNCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHIxMzsKLSAgICAgIGNhc2UgMTkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUUjE1OyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHIxNTsKLSAgICAgIGNhc2UgMjAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdDsKLSAgICAgIGNhc2UgMjEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUSDsgZ290byBleHRyYWN0X3NmbXRfc3Q7Ci0gICAgICBjYXNlIDIyIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9TVEI7IGdvdG8gZXh0cmFjdF9zZm10X3N0OwotICAgICAgY2FzZSAyMyA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUUjE1R1I7IGdvdG8gZXh0cmFjdF9zZm10X3N0cjE1Z3I7Ci0gICAgICAgICAgY2FzZSAxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9NT1ZQUzsgZ290byBleHRyYWN0X3NmbXRfbW92cHM7Ci0gICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9TVFIxNURSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHIxNWRyOwotICAgICAgICAgIGNhc2UgOSA6IGl0eXBlID0gRlIzMEJGX0lOU05fU1RSMTVQUzsgZ290byBleHRyYWN0X3NmbXRfc3RyMTVwczsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAyNCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRE1PVlIxMzsgZ290byBleHRyYWN0X3NmbXRfZG1vdnIxMzsKLSAgICAgIGNhc2UgMjUgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RNT1ZSMTNIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kbW92cjEzaDsKLSAgICAgIGNhc2UgMjYgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RNT1ZSMTNCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kbW92cjEzYjsKLSAgICAgIGNhc2UgMjcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RNT1ZSMTVQSTsgZ290byBleHRyYWN0X3NmbXRfZG1vdnIxNXBpOwotICAgICAgY2FzZSAyOCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRE1PVlIxM1BJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kbW92cjEzcGk7Ci0gICAgICBjYXNlIDI5IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9ETU9WUjEzUElIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kbW92cjEzcGloOwotICAgICAgY2FzZSAzMCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRE1PVlIxM1BJQjsgZ290byBleHRyYWN0X3NmbXRfZG1vdnIxM3BpYjsKLSAgICAgIGNhc2UgMzEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0lOVDsgZ290byBleHRyYWN0X3NmbXRfaW50OwotICAgICAgY2FzZSAzMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzNCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzNSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzNyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0MSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0MyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0NSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0NyA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkcjE0OwotICAgICAgY2FzZSA0OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA0OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1MSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1MyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1NSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2MSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2MyA6IGl0eXBlID0gRlIzMEJGX0lOU05fU1RSMTQ7IGdvdG8gZXh0cmFjdF9zZm10X3N0cjE0OwotICAgICAgY2FzZSA2NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2NSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3MSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3MyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3NSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA3OSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTRVSDsgZ290byBleHRyYWN0X3NmbXRfbGRyMTR1aDsKLSAgICAgIGNhc2UgODAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgOTUgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUUjE0SDsgZ290byBleHRyYWN0X3NmbXRfc3RyMTRoOwotICAgICAgY2FzZSA5NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA0IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwNSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA3IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExMSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSMTRVQjsgZ290byBleHRyYWN0X3NmbXRfbGRyMTR1YjsKLSAgICAgIGNhc2UgMTEyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTIxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTI0IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyNSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTI3IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9TVFIxNEI7IGdvdG8gZXh0cmFjdF9zZm10X3N0cjE0YjsKLSAgICAgIGNhc2UgMTI4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CQU5ETDsgZ290byBleHRyYWN0X3NmbXRfYmFuZGw7Ci0gICAgICBjYXNlIDEyOSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkFOREg7IGdvdG8gZXh0cmFjdF9zZm10X2JhbmRsOwotICAgICAgY2FzZSAxMzAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FORDsgZ290byBleHRyYWN0X3NmbXRfYW5kOwotICAgICAgY2FzZSAxMzEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FORENDUjsgZ290byBleHRyYWN0X3NmbXRfYW5kY2NyOwotICAgICAgY2FzZSAxMzIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FORE07IGdvdG8gZXh0cmFjdF9zZm10X2FuZG07Ci0gICAgICBjYXNlIDEzMyA6IGl0eXBlID0gRlIzMEJGX0lOU05fQU5ESDsgZ290byBleHRyYWN0X3NmbXRfYW5kaDsKLSAgICAgIGNhc2UgMTM0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9BTkRCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmRiOwotICAgICAgY2FzZSAxMzUgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUSUxNOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdGlsbTsKLSAgICAgIGNhc2UgMTM2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CVFNUTDsgZ290byBleHRyYWN0X3NmbXRfYnRzdGw7Ci0gICAgICBjYXNlIDEzNyA6IGl0eXBlID0gRlIzMEJGX0lOU05fQlRTVEg7IGdvdG8gZXh0cmFjdF9zZm10X2J0c3RsOwotICAgICAgY2FzZSAxMzggOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1hDSEI7IGdvdG8gZXh0cmFjdF9zZm10X3hjaGI7Ci0gICAgICBjYXNlIDEzOSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTU9WOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tb3Y7Ci0gICAgICBjYXNlIDE0MCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERNMDsgZ290byBleHRyYWN0X3NmbXRfbGRtMDsKLSAgICAgIGNhc2UgMTQxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9MRE0xOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZG0xOwotICAgICAgY2FzZSAxNDIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUTTA7IGdvdG8gZXh0cmFjdF9zZm10X3N0bTA7Ci0gICAgICBjYXNlIDE0MyA6IGl0eXBlID0gRlIzMEJGX0lOU05fU1RNMTsgZ290byBleHRyYWN0X3NmbXRfc3RtMTsKLSAgICAgIGNhc2UgMTQ0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CT1JMOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYW5kbDsKLSAgICAgIGNhc2UgMTQ1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CT1JIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYW5kbDsKLSAgICAgIGNhc2UgMTQ2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9PUjsgZ290byBleHRyYWN0X3NmbXRfYW5kOwotICAgICAgY2FzZSAxNDcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX09SQ0NSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmRjY3I7Ci0gICAgICBjYXNlIDE0OCA6IGl0eXBlID0gRlIzMEJGX0lOU05fT1JNOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmRtOwotICAgICAgY2FzZSAxNDkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX09SSDsgZ290byBleHRyYWN0X3NmbXRfYW5kaDsKLSAgICAgIGNhc2UgMTUwIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9PUkI7IGdvdG8gZXh0cmFjdF9zZm10X2FuZGI7Ci0gICAgICBjYXNlIDE1MSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0pNUDsgZ290byBleHRyYWN0X3NmbXRfam1wOwotICAgICAgICAgIGNhc2UgMSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQ0FMTFI7IGdvdG8gZXh0cmFjdF9zZm10X2NhbGxyOwotICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gRlIzMEJGX0lOU05fUkVUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9yZXQ7Ci0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9SRVRJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9yZXRpOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRElWMFM7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjBzOwotICAgICAgICAgIGNhc2UgNSA6IGl0eXBlID0gRlIzMEJGX0lOU05fRElWMFU7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjB1OwotICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gRlIzMEJGX0lOU05fRElWMTsgZ290byBleHRyYWN0X3NmbXRfZGl2MTsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0RJVjI7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjI7Ci0gICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9FWFRTQjsgZ290byBleHRyYWN0X3NmbXRfZXh0c2I7Ci0gICAgICAgICAgY2FzZSA5IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9FWFRVQjsgZ290byBleHRyYWN0X3NmbXRfZXh0dWI7Ci0gICAgICAgICAgY2FzZSAxMCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRVhUU0g7IGdvdG8gZXh0cmFjdF9zZm10X2V4dHNoOwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0VYVFVIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9leHR1aDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxNTIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JFT1JMOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYW5kbDsKLSAgICAgIGNhc2UgMTUzIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CRU9SSDsgZ290byBleHRyYWN0X3NmbXRfYmFuZGw7Ci0gICAgICBjYXNlIDE1NCA6IGl0eXBlID0gRlIzMEJGX0lOU05fRU9SOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmQ7Ci0gICAgICBjYXNlIDE1NSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERJMjA7IGdvdG8gZXh0cmFjdF9zZm10X2xkaTIwOwotICAgICAgY2FzZSAxNTYgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0VPUk07IGdvdG8gZXh0cmFjdF9zZm10X2FuZG07Ci0gICAgICBjYXNlIDE1NyA6IGl0eXBlID0gRlIzMEJGX0lOU05fRU9SSDsgZ290byBleHRyYWN0X3NmbXRfYW5kaDsKLSAgICAgIGNhc2UgMTU4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9FT1JCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmRiOwotICAgICAgY2FzZSAxNTkgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9KTVBEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9qbXA7Ci0gICAgICAgICAgY2FzZSAxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9DQUxMUkQ7IGdvdG8gZXh0cmFjdF9zZm10X2NhbGxyOwotICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gRlIzMEJGX0lOU05fUkVUX0Q7IGdvdG8gZXh0cmFjdF9zZm10X3JldDsKLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0lOVEU7IGdvdG8gZXh0cmFjdF9zZm10X2ludGU7Ci0gICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9ESVYzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kaXYzOwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gRlIzMEJGX0lOU05fRElWNFM7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjRzOwotICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERJMzI7IGdvdG8gZXh0cmFjdF9zZm10X2xkaTMyOwotICAgICAgICAgIGNhc2UgOSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTEVBVkU7IGdvdG8gZXh0cmFjdF9zZm10X2xlYXZlOwotICAgICAgICAgIGNhc2UgMTAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX05PUDsgZ290byBleHRyYWN0X3NmbXRfYm5vZDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9DT1BPUDsgZ290byBleHRyYWN0X3NmbXRfY29wb3A7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gRlIzMEJGX0lOU05fQ09QTEQ7IGdvdG8gZXh0cmFjdF9zZm10X2NvcG9wOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0NPUFNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jb3BvcDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9DT1BTVjsgZ290byBleHRyYWN0X3NmbXRfY29wb3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gRlIzMEJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTYwIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9BREROSTsgZ290byBleHRyYWN0X3NmbXRfYWRkbmk7Ci0gICAgICBjYXNlIDE2MSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQURETjI7IGdvdG8gZXh0cmFjdF9zZm10X2FkZG4yOwotICAgICAgY2FzZSAxNjIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FERE47IGdvdG8gZXh0cmFjdF9zZm10X2FkZG47Ci0gICAgICBjYXNlIDE2MyA6IGl0eXBlID0gRlIzMEJGX0lOU05fQUREU1A7IGdvdG8gZXh0cmFjdF9zZm10X2FkZHNwOwotICAgICAgY2FzZSAxNjQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FEREk7IGdvdG8gZXh0cmFjdF9zZm10X2FkZGk7Ci0gICAgICBjYXNlIDE2NSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQUREMjsgZ290byBleHRyYWN0X3NmbXRfYWRkMjsKLSAgICAgIGNhc2UgMTY2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9BREQ7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMTY3IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9BRERDOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGRjOwotICAgICAgY2FzZSAxNjggOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0NNUEk7IGdvdG8gZXh0cmFjdF9zZm10X2NtcGk7Ci0gICAgICBjYXNlIDE2OSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQ01QMjsgZ290byBleHRyYWN0X3NmbXRfY21wMjsKLSAgICAgIGNhc2UgMTcwIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9DTVA7IGdvdG8gZXh0cmFjdF9zZm10X2NtcDsKLSAgICAgIGNhc2UgMTcxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9NVUxVOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWx1OwotICAgICAgY2FzZSAxNzIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NVQjsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAxNzMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NVQkM7IGdvdG8gZXh0cmFjdF9zZm10X2FkZGM7Ci0gICAgICBjYXNlIDE3NCA6IGl0eXBlID0gRlIzMEJGX0lOU05fU1VCTjsgZ290byBleHRyYWN0X3NmbXRfYWRkbjsKLSAgICAgIGNhc2UgMTc1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9NVUw7IGdvdG8gZXh0cmFjdF9zZm10X211bDsKLSAgICAgIGNhc2UgMTc2IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9MU1JJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sc2xpOwotICAgICAgY2FzZSAxNzcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xTUjI7IGdvdG8gZXh0cmFjdF9zZm10X2xzbGk7Ci0gICAgICBjYXNlIDE3OCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTFNSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sc2w7Ci0gICAgICBjYXNlIDE3OSA6IGl0eXBlID0gRlIzMEJGX0lOU05fTU9WMkRSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tb3YyZHI7Ci0gICAgICBjYXNlIDE4MCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTFNMSTsgZ290byBleHRyYWN0X3NmbXRfbHNsaTsKLSAgICAgIGNhc2UgMTgxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9MU0wyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sc2xpOwotICAgICAgY2FzZSAxODIgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xTTDsgZ290byBleHRyYWN0X3NmbXRfbHNsOwotICAgICAgY2FzZSAxODMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX01PVkRSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tb3ZkcjsKLSAgICAgIGNhc2UgMTg0IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9BU1JJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sc2xpOwotICAgICAgY2FzZSAxODUgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0FTUjI7IGdvdG8gZXh0cmFjdF9zZm10X2xzbGk7Ci0gICAgICBjYXNlIDE4NiA6IGl0eXBlID0gRlIzMEJGX0lOU05fQVNSOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sc2w7Ci0gICAgICBjYXNlIDE4NyA6IGl0eXBlID0gRlIzMEJGX0lOU05fTVVMVUg7IGdvdG8gZXh0cmFjdF9zZm10X211bGg7Ci0gICAgICBjYXNlIDE4OCA6IGl0eXBlID0gRlIzMEJGX0lOU05fTERSRVM7IGdvdG8gZXh0cmFjdF9zZm10X2xkcmVzOwotICAgICAgY2FzZSAxODkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1NUUkVTOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHJlczsKLSAgICAgIGNhc2UgMTkxIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9NVUxIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxoOwotICAgICAgY2FzZSAxOTIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTkzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDE5NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxOTUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTk2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDE5NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxOTggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTk5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIwMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIwMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMDQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjA1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIwNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMDcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0xESTg7IGdvdG8gZXh0cmFjdF9zZm10X2xkaTg7Ci0gICAgICBjYXNlIDIwOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIxMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMTIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjEzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIxNCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMTUgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0NBTEw7IGdvdG8gZXh0cmFjdF9zZm10X2NhbGw7Ci0gICAgICBjYXNlIDIxNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMTcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjE4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIxOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMjAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjIxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIyMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMjMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0NBTExEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jYWxsOwotICAgICAgY2FzZSAyMjQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JSQTsgZ290byBleHRyYWN0X3NmbXRfYnJhZDsKLSAgICAgIGNhc2UgMjI1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CTk87IGdvdG8gZXh0cmFjdF9zZm10X2Jub2Q7Ci0gICAgICBjYXNlIDIyNiA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkVROyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXFkOwotICAgICAgY2FzZSAyMjcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JORTsgZ290byBleHRyYWN0X3NmbXRfYmVxZDsKLSAgICAgIGNhc2UgMjI4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CQzsgZ290byBleHRyYWN0X3NmbXRfYmNkOwotICAgICAgY2FzZSAyMjkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JOQzsgZ290byBleHRyYWN0X3NmbXRfYmNkOwotICAgICAgY2FzZSAyMzAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JOOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibmQ7Ci0gICAgICBjYXNlIDIzMSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQlA7IGdvdG8gZXh0cmFjdF9zZm10X2JuZDsKLSAgICAgIGNhc2UgMjMyIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CVjsgZ290byBleHRyYWN0X3NmbXRfYnZkOwotICAgICAgY2FzZSAyMzMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JOVjsgZ290byBleHRyYWN0X3NmbXRfYnZkOwotICAgICAgY2FzZSAyMzQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JMVDsgZ290byBleHRyYWN0X3NmbXRfYmx0ZDsKLSAgICAgIGNhc2UgMjM1IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CR0U7IGdvdG8gZXh0cmFjdF9zZm10X2JsdGQ7Ci0gICAgICBjYXNlIDIzNiA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkxFOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibGVkOwotICAgICAgY2FzZSAyMzcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JHVDsgZ290byBleHRyYWN0X3NmbXRfYmxlZDsKLSAgICAgIGNhc2UgMjM4IDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CTFM7IGdvdG8gZXh0cmFjdF9zZm10X2Jsc2Q7Ci0gICAgICBjYXNlIDIzOSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkhJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibHNkOwotICAgICAgY2FzZSAyNDAgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JSQUQ7IGdvdG8gZXh0cmFjdF9zZm10X2JyYWQ7Ci0gICAgICBjYXNlIDI0MSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQk5PRDsgZ290byBleHRyYWN0X3NmbXRfYm5vZDsKLSAgICAgIGNhc2UgMjQyIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CRVFEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXFkOwotICAgICAgY2FzZSAyNDMgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JORUQ7IGdvdG8gZXh0cmFjdF9zZm10X2JlcWQ7Ci0gICAgICBjYXNlIDI0NCA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkNEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iY2Q7Ci0gICAgICBjYXNlIDI0NSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQk5DRDsgZ290byBleHRyYWN0X3NmbXRfYmNkOwotICAgICAgY2FzZSAyNDYgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JORDsgZ290byBleHRyYWN0X3NmbXRfYm5kOwotICAgICAgY2FzZSAyNDcgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JQRDsgZ290byBleHRyYWN0X3NmbXRfYm5kOwotICAgICAgY2FzZSAyNDggOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JWRDsgZ290byBleHRyYWN0X3NmbXRfYnZkOwotICAgICAgY2FzZSAyNDkgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JOVkQ7IGdvdG8gZXh0cmFjdF9zZm10X2J2ZDsKLSAgICAgIGNhc2UgMjUwIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CTFREOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibHRkOwotICAgICAgY2FzZSAyNTEgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JHRUQ7IGdvdG8gZXh0cmFjdF9zZm10X2JsdGQ7Ci0gICAgICBjYXNlIDI1MiA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkxFRDsgZ290byBleHRyYWN0X3NmbXRfYmxlZDsKLSAgICAgIGNhc2UgMjUzIDogaXR5cGUgPSBGUjMwQkZfSU5TTl9CR1REOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibGVkOwotICAgICAgY2FzZSAyNTQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX0JMU0Q7IGdvdG8gZXh0cmFjdF9zZm10X2Jsc2Q7Ci0gICAgICBjYXNlIDI1NSA6IGl0eXBlID0gRlIzMEJGX0lOU05fQkhJRDsgZ290byBleHRyYWN0X3NmbXRfYmxzZDsKLSAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEZSMzBCRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGRlY29kZWQsIG5vdyBleHRyYWN0IHRoZSBmaWVsZHMuICAqLwotCi0gZXh0cmFjdF9zZm10X2VtcHR5OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2VtcHR5IiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gICAgVUlOVCBmX1JqOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmogPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYWRkIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgICBVSU5UIGZfdTQ7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl91NCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91NCkgPSBmX3U0OwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYWRkaSIsICJmX3U0IDB4JXgiLCAneCcsIGZfdTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgICBTSSBmX200OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfbTQgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX200KSA9IGZfbTQ7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGQyIiwgImZfbTQgMHgleCIsICd4JywgZl9tNCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGRjOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gICAgVUlOVCBmX1JqOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmogPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYWRkYyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKGluX1JqKSA9IGZfUmo7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FkZG46Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGRuIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkbmk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gICAgVUlOVCBmX3U0OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfdTQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdTQpID0gZl91NDsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZG5pIiwgImZfdTQgMHgleCIsICd4JywgZl91NCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGRuMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgICBTSSBmX200OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfbTQgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX200KSA9IGZfbTQ7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGRuMiIsICJmX200IDB4JXgiLCAneCcsIGZfbTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY21wOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXAiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gICAgVUlOVCBmX3U0OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfdTQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdTQpID0gZl91NDsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcGkiLCAiZl91NCAweCV4IiwgJ3gnLCBmX3U0LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY21wMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgICBTSSBmX200OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfbTQgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX200KSA9IGZfbTQ7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXAyIiwgImZfbTQgMHgleCIsICd4JywgZl9tNCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FuZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FuZCIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKGluX1JqKSA9IGZfUmo7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FuZG06Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FuZG0iLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FuZGg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FuZGgiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FuZGI6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FuZGIiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JhbmRsOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICAgIFVJTlQgZl91NDsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX3U0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3U0KSA9IGZfdTQ7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iYW5kbCIsICJmX3U0IDB4JXgiLCAneCcsIGZfdTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9idHN0bDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgICBVSU5UIGZfdTQ7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl91NCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91NCkgPSBmX3U0OwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYnRzdGwiLCAiZl91NCAweCV4IiwgJ3gnLCBmX3U0LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXVsOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdWwiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X211bHU6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X211bHUiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X211bGg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X211bGgiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2RpdjBzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kaXYwcyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kaXYwdToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kaXYwdSIsIChjaGFyICopIDApKTsKLQotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2RpdjE6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2RpdjEiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZGl2MjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZGl2MiIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kaXYzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2RpdjMiLCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kaXY0czoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kaXY0cyIsIChjaGFyICopIDApKTsKLQotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xzbDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICAgIFVJTlQgZl9SajsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JqID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xzbCIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKGluX1JqKSA9IGZfUmo7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xzbGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gICAgVUlOVCBmX3U0OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfdTQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdTQpID0gZl91NDsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xzbGkiLCAiZl91NCAweCV4IiwgJ3gnLCBmX3U0LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkaTg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRpOC5mCi0gICAgVUlOVCBmX2k4OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfaTggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDgpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfaTgpID0gZl9pODsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkaTgiLCAiZl9pOCAweCV4IiwgJ3gnLCBmX2k4LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkaTIwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTIwLmYKLSAgICBVSU5UIGZfaTIwXzE2OwotICAgIFVJTlQgZl9pMjBfNDsKLSAgICBVSU5UIGZfUmk7Ci0gICAgVUlOVCBmX2kyMDsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOwotICAgIGZfaTIwXzE2ID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDE2LCAwLCAxNikgPDwgMCkpOwotICAgIGZfaTIwXzQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLXsKLSAgZl9pMjAgPSAoKCgoZl9pMjBfNCkgPDwgKDE2KSkpIHwgKGZfaTIwXzE2KSk7Ci19Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2kyMCkgPSBmX2kyMDsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkaTIwIiwgImZfaTIwIDB4JXgiLCAneCcsIGZfaTIwLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkaTMyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTMyLmYKLSAgICBVSU5UIGZfaTMyOwotICAgIFVJTlQgZl9SaTsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotICAgIFVJTlQgd29yZF8yOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOwotICB3b3JkXzIgPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX2kzMiA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8yLCAxNiwgMCwgMTYpIDw8IDApfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAxNiwgMCwgMTYpIDw8IDE2KSk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9pMzIpID0gZl9pMzI7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGkzMiIsICJmX2kzMiAweCV4IiwgJ3gnLCBmX2kzMiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gICAgVUlOVCBmX1JqOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmogPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGQiLCAiUmogMHgleCIsICd4JywgZl9SaiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHIxMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gICAgVUlOVCBmX1JqOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmogPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRyMTMiLCAiUmogMHgleCIsICd4JywgZl9SaiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHIxNDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNC5mCi0gICAgU0kgZl9kaXNwMTA7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9kaXNwMTAgPSAoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA0LCA4KSkgPDwgKDIpKTsKLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2Rpc3AxMCkgPSBmX2Rpc3AxMDsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcjE0IiwgImZfZGlzcDEwIDB4JXgiLCAneCcsIGZfZGlzcDEwLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcjE0dWg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTR1aC5mCi0gICAgU0kgZl9kaXNwOTsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX2Rpc3A5ID0gKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgNCwgOCkpIDw8ICgxKSk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9kaXNwOSkgPSBmX2Rpc3A5OwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRyMTR1aCIsICJmX2Rpc3A5IDB4JXgiLCAneCcsIGZfZGlzcDksICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRyMTR1YjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNHViLmYKLSAgICBJTlQgZl9kaXNwODsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX2Rpc3A4ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDQsIDgpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlzcDgpID0gZl9kaXNwODsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcjE0dWIiLCAiZl9kaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcjE1OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1LmYKLSAgICBVU0kgZl91ZGlzcDY7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl91ZGlzcDYgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCkpIDw8ICgyKSk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91ZGlzcDYpID0gZl91ZGlzcDY7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZHIxNSIsICJmX3VkaXNwNiAweCV4IiwgJ3gnLCBmX3VkaXNwNiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHIxNWdyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1Z3IuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfUmkpID0gZl9SaTsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcjE1Z3IiLCAiZl9SaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHIxNWRyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1ZHIuZgotICAgIFVJTlQgZl9SczI7Ci0KLSAgICBmX1JzMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9SczIpID0gZl9SczI7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZHIxNWRyIiwgImZfUnMyIDB4JXgiLCAneCcsIGZfUnMyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRyMTVwczoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRzcC5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRyMTVwcyIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gICAgVUlOVCBmX1JqOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmogPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3QiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cjEzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHIxMyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKGluX1JqKSA9IGZfUmo7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RyMTQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTQuZgotICAgIFNJIGZfZGlzcDEwOwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfZGlzcDEwID0gKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgNCwgOCkpIDw8ICgyKSk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9kaXNwMTApID0gZl9kaXNwMTA7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHIxNCIsICJmX2Rpc3AxMCAweCV4IiwgJ3gnLCBmX2Rpc3AxMCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOwotICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cjE0aDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNGguZgotICAgIFNJIGZfZGlzcDk7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9kaXNwOSA9ICgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDQsIDgpKSA8PCAoMSkpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlzcDkpID0gZl9kaXNwOTsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cjE0aCIsICJmX2Rpc3A5IDB4JXgiLCAneCcsIGZfZGlzcDksICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHIxNGI6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTRiLmYKLSAgICBJTlQgZl9kaXNwODsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX2Rpc3A4ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDQsIDgpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlzcDgpID0gZl9kaXNwODsKLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cjE0YiIsICJmX2Rpc3A4IDB4JXgiLCAneCcsIGZfZGlzcDgsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHIxNToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNS5mCi0gICAgVVNJIGZfdWRpc3A2OwotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfdWRpc3A2ID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpKSA8PCAoMikpOwotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdWRpc3A2KSA9IGZfdWRpc3A2OwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RyMTUiLCAiZl91ZGlzcDYgMHgleCIsICd4JywgZl91ZGlzcDYsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHIxNWdyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE1Z3IuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RyMTVnciIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RyMTVkcjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNWRyLmYKLSAgICBVSU5UIGZfUnMyOwotCi0gICAgZl9SczIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfUnMyKSA9IGZfUnMyOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RyMTVkciIsICJmX1JzMiAweCV4IiwgJ3gnLCBmX1JzMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cjE1cHM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkc3AuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cjE1cHMiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbW92OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3YiLCAiUmogMHgleCIsICd4JywgZl9SaiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9SaikgPSBmX1JqOwotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tb3ZkcjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3Zkci5mCi0gICAgVUlOVCBmX1JzMTsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JzMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9SczEpID0gZl9SczE7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3ZkciIsICJmX1JzMSAweCV4IiwgJ3gnLCBmX1JzMSwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tb3ZwczoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3Zkci5mCi0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3ZwcyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbW92MmRyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gICAgVUlOVCBmX1JzMTsKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JzMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9SczEpID0gZl9SczE7Ci0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3YyZHIiLCAiZl9SczEgMHgleCIsICd4JywgZl9SczEsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tb3YycHM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X21vdjJwcyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9qbXA6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgICBVSU5UIGZfUmk7Ci0KLSAgICBmX1JpID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2ptcCIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jYWxscjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY2FsbHIiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY2FsbDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxsLmYKLSAgICBTSSBmX3JlbDEyOwotCi0gICAgZl9yZWwxMiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgNSwgMTEpKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfbGFiZWwxMikgPSBmX3JlbDEyOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY2FsbCIsICJsYWJlbDEyIDB4JXgiLCAneCcsIGZfcmVsMTIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3JldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9yZXQiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9pbnQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgICBVSU5UIGZfdTg7Ci0KLSAgICBmX3U4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdTgpID0gZl91ODsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2ludCIsICJmX3U4IDB4JXgiLCAneCcsIGZfdTgsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2ludGU6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfaW50ZSIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3JldGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfcmV0aSIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JyYWQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9icmFkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Jub2Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYm5vZCIsIChjaGFyICopIDApKTsKLQotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JlcWQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iZXFkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JjZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgICBTSSBmX3JlbDk7Ci0KLSAgICBmX3JlbDkgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfbGFiZWw5KSA9IGZfcmVsOTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JjZCIsICJsYWJlbDkgMHgleCIsICd4JywgZl9yZWw5LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ibmQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibmQiLCAibGFiZWw5IDB4JXgiLCAneCcsIGZfcmVsOSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYnZkOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICAgIFNJIGZfcmVsOTsKLQotICAgIGZfcmVsOSA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9sYWJlbDkpID0gZl9yZWw5OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYnZkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JsdGQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibHRkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JsZWQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibGVkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Jsc2Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gICAgU0kgZl9yZWw5OwotCi0gICAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibHNkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Rtb3ZyMTM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgICBVU0kgZl9kaXIxMDsKLQotICAgIGZfZGlyMTAgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92cjEzIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZG1vdnIxM2g6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gICAgVVNJIGZfZGlyOTsKLQotICAgIGZfZGlyOSA9ICgoRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlyOSkgPSBmX2Rpcjk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92cjEzaCIsICJmX2RpcjkgMHgleCIsICd4JywgZl9kaXI5LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92cjEzYjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgICBVSU5UIGZfZGlyODsKLQotICAgIGZfZGlyOCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjgpID0gZl9kaXI4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZG1vdnIxM2IiLCAiZl9kaXI4IDB4JXgiLCAneCcsIGZfZGlyOCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZG1vdnIxM3BpOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaS5mCi0gICAgVVNJIGZfZGlyMTA7Ci0KLSAgICBmX2RpcjEwID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9kaXIxMCkgPSBmX2RpcjEwOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZG1vdnIxM3BpIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Rtb3ZyMTNwaWg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gICAgVVNJIGZfZGlyOTsKLQotICAgIGZfZGlyOSA9ICgoRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlyOSkgPSBmX2Rpcjk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92cjEzcGloIiwgImZfZGlyOSAweCV4IiwgJ3gnLCBmX2RpcjksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92cjEzcGliOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICAgIFVJTlQgZl9kaXI4OwotCi0gICAgZl9kaXI4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlyOCkgPSBmX2Rpcjg7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92cjEzcGliIiwgImZfZGlyOCAweCV4IiwgJ3gnLCBmX2RpcjgsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92cjE1cGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxNXBpLmYKLSAgICBVU0kgZl9kaXIxMDsKLQotICAgIGZfZGlyMTAgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92cjE1cGkiLCAiZl9kaXIxMCAweCV4IiwgJ3gnLCBmX2RpcjEwLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZG1vdjJyMTM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgICBVU0kgZl9kaXIxMDsKLQotICAgIGZfZGlyMTAgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92MnIxMyIsICJmX2RpcjEwIDB4JXgiLCAneCcsIGZfZGlyMTAsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92MnIxM2g6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gICAgVVNJIGZfZGlyOTsKLQotICAgIGZfZGlyOSA9ICgoRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDEpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfZGlyOSkgPSBmX2Rpcjk7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92MnIxM2giLCAiZl9kaXI5IDB4JXgiLCAneCcsIGZfZGlyOSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Rtb3YycjEzYjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgICBVSU5UIGZfZGlyODsKLQotICAgIGZfZGlyOCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjgpID0gZl9kaXI4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZG1vdjJyMTNiIiwgImZfZGlyOCAweCV4IiwgJ3gnLCBmX2RpcjgsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92MnIxM3BpOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaS5mCi0gICAgVVNJIGZfZGlyMTA7Ci0KLSAgICBmX2RpcjEwID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9kaXIxMCkgPSBmX2RpcjEwOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZG1vdjJyMTNwaSIsICJmX2RpcjEwIDB4JXgiLCAneCcsIGZfZGlyMTAsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92MnIxM3BpaDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgICBVU0kgZl9kaXI5OwotCi0gICAgZl9kaXI5ID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMSkpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9kaXI5KSA9IGZfZGlyOTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2Rtb3YycjEzcGloIiwgImZfZGlyOSAweCV4IiwgJ3gnLCBmX2RpcjksIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9kbW92MnIxM3BpYjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgICBVSU5UIGZfZGlyODsKLQotICAgIGZfZGlyOCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjgpID0gZl9kaXI4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZG1vdjJyMTNwaWIiLCAiZl9kaXI4IDB4JXgiLCAneCcsIGZfZGlyOCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2Rtb3YycjE1cGQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxNXBpLmYKLSAgICBVU0kgZl9kaXIxMDsKLQotICAgIGZfZGlyMTAgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kbW92MnIxNXBkIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcmVzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRyZXMiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NvcG9wOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgMik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NvcG9wIiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYW5kY2NyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2ludC5mCi0gICAgVUlOVCBmX3U4OwotCi0gICAgZl91OCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3U4KSA9IGZfdTg7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hbmRjY3IiLCAiZl91OCAweCV4IiwgJ3gnLCBmX3U4LCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGlsbToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9pbnQuZgotICAgIFVJTlQgZl91ODsKLQotICAgIGZfdTggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91OCkgPSBmX3U4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RpbG0iLCAiZl91OCAweCV4IiwgJ3gnLCBmX3U4LCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGRzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRzcC5mCi0gICAgU0kgZl9zMTA7Ci0KLSAgICBmX3MxMCA9ICgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zMTApID0gZl9zMTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGRzcCIsICJmX3MxMCAweCV4IiwgJ3gnLCBmX3MxMCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2V4dHNiOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZXh0c2IiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2V4dHViOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZXh0dWIiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2V4dHNoOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZXh0c2giLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2V4dHVoOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICAgIFVJTlQgZl9SaTsKLQotICAgIGZfUmkgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZXh0dWgiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX1JpKSA9IGZfUmk7Ci0gICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkbTA6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMC5mCi0gICAgVUlOVCBmX3JlZ2xpc3RfbG93X2xkOwotCi0gICAgZl9yZWdsaXN0X2xvd19sZCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3JlZ2xpc3RfbG93X2xkKSA9IGZfcmVnbGlzdF9sb3dfbGQ7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZG0wIiwgImZfcmVnbGlzdF9sb3dfbGQgMHgleCIsICd4JywgZl9yZWdsaXN0X2xvd19sZCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzApID0gMDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMSkgPSAxOwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChvdXRfaF9ncl8zKSA9IDM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzQpID0gNDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNSkgPSA1OwotICAgICAgRkxEIChvdXRfaF9ncl82KSA9IDY7Ci0gICAgICBGTEQgKG91dF9oX2dyXzcpID0gNzsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZG0xOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkbTEuZgotICAgIFVJTlQgZl9yZWdsaXN0X2hpX2xkOwotCi0gICAgZl9yZWdsaXN0X2hpX2xkID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA4KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfcmVnbGlzdF9oaV9sZCkgPSBmX3JlZ2xpc3RfaGlfbGQ7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZG0xIiwgImZfcmVnbGlzdF9oaV9sZCAweCV4IiwgJ3gnLCBmX3JlZ2xpc3RfaGlfbGQsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChvdXRfaF9ncl8xMCkgPSAxMDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTEpID0gMTE7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEyKSA9IDEyOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7Ci0gICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdG0wOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmZyMzBiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0bTAuZgotICAgIFVJTlQgZl9yZWdsaXN0X2xvd19zdDsKLQotICAgIGZfcmVnbGlzdF9sb3dfc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9yZWdsaXN0X2xvd19zdCkgPSBmX3JlZ2xpc3RfbG93X3N0OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RtMCIsICJmX3JlZ2xpc3RfbG93X3N0IDB4JXgiLCAneCcsIGZfcmVnbGlzdF9sb3dfc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyXzApID0gMDsKLSAgICAgIEZMRCAoaW5faF9ncl8xKSA9IDE7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChpbl9oX2dyXzMpID0gMzsKLSAgICAgIEZMRCAoaW5faF9ncl80KSA9IDQ7Ci0gICAgICBGTEQgKGluX2hfZ3JfNSkgPSA1OwotICAgICAgRkxEIChpbl9oX2dyXzYpID0gNjsKLSAgICAgIEZMRCAoaW5faF9ncl83KSA9IDc7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0bTE6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RtMS5mCi0gICAgVUlOVCBmX3JlZ2xpc3RfaGlfc3Q7Ci0KLSAgICBmX3JlZ2xpc3RfaGlfc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9yZWdsaXN0X2hpX3N0KSA9IGZfcmVnbGlzdF9oaV9zdDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0bTEiLCAiZl9yZWdsaXN0X2hpX3N0IDB4JXgiLCAneCcsIGZfcmVnbGlzdF9oaV9zdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTApID0gMTA7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTEpID0gMTE7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTIpID0gMTI7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKGluX2hfZ3JfOCkgPSA4OwotICAgICAgRkxEIChpbl9oX2dyXzkpID0gOTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZW50ZXI6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW50ZXIuZgotICAgIFVTSSBmX3UxMDsKLQotICAgIGZfdTEwID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91MTApID0gZl91MTA7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9lbnRlciIsICJmX3UxMCAweCV4IiwgJ3gnLCBmX3UxMCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZWF2ZToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZmcjMwYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbnRlci5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGVhdmUiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3hjaGI6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmZnIzMGJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgICBVSU5UIGZfUmo7Ci0gICAgVUlOVCBmX1JpOwotCi0gICAgZl9SaiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7Ci0gICAgZl9SaSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07Ci0gIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF94Y2hiIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKLSAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKLSAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2RlY29kZS5oIGIvc2ltL2ZyMzAvZGVjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTljNTUuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvZGVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogRGVjb2RlIGhlYWRlciBmb3IgZnIzMGJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBCRl9ERUNPREVfSAotI2RlZmluZSBGUjMwQkZfREVDT0RFX0gKLQotZXh0ZXJuIGNvbnN0IElERVNDICpmcjMwYmZfZGVjb2RlIChTSU1fQ1BVICosIElBRERSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQlVGICopOwotZXh0ZXJuIHZvaWQgZnIzMGJmX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBmcjMwYmZfc2VtX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBmcjMwYmZfc2VtZl9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICopOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbnMgaW4gY3B1IGZhbWlseSBmcjMwYmYuICAqLwotdHlwZWRlZiBlbnVtIGZyMzBiZl9pbnNuX3R5cGUgewotICBGUjMwQkZfSU5TTl9YX0lOVkFMSUQsIEZSMzBCRl9JTlNOX1hfQUZURVIsIEZSMzBCRl9JTlNOX1hfQkVGT1JFLCBGUjMwQkZfSU5TTl9YX0NUSV9DSEFJTgotICwgRlIzMEJGX0lOU05fWF9DSEFJTiwgRlIzMEJGX0lOU05fWF9CRUdJTiwgRlIzMEJGX0lOU05fQURELCBGUjMwQkZfSU5TTl9BRERJCi0gLCBGUjMwQkZfSU5TTl9BREQyLCBGUjMwQkZfSU5TTl9BRERDLCBGUjMwQkZfSU5TTl9BREROLCBGUjMwQkZfSU5TTl9BREROSQotICwgRlIzMEJGX0lOU05fQURETjIsIEZSMzBCRl9JTlNOX1NVQiwgRlIzMEJGX0lOU05fU1VCQywgRlIzMEJGX0lOU05fU1VCTgotICwgRlIzMEJGX0lOU05fQ01QLCBGUjMwQkZfSU5TTl9DTVBJLCBGUjMwQkZfSU5TTl9DTVAyLCBGUjMwQkZfSU5TTl9BTkQKLSAsIEZSMzBCRl9JTlNOX09SLCBGUjMwQkZfSU5TTl9FT1IsIEZSMzBCRl9JTlNOX0FORE0sIEZSMzBCRl9JTlNOX0FOREgKLSAsIEZSMzBCRl9JTlNOX0FOREIsIEZSMzBCRl9JTlNOX09STSwgRlIzMEJGX0lOU05fT1JILCBGUjMwQkZfSU5TTl9PUkIKLSAsIEZSMzBCRl9JTlNOX0VPUk0sIEZSMzBCRl9JTlNOX0VPUkgsIEZSMzBCRl9JTlNOX0VPUkIsIEZSMzBCRl9JTlNOX0JBTkRMCi0gLCBGUjMwQkZfSU5TTl9CT1JMLCBGUjMwQkZfSU5TTl9CRU9STCwgRlIzMEJGX0lOU05fQkFOREgsIEZSMzBCRl9JTlNOX0JPUkgKLSAsIEZSMzBCRl9JTlNOX0JFT1JILCBGUjMwQkZfSU5TTl9CVFNUTCwgRlIzMEJGX0lOU05fQlRTVEgsIEZSMzBCRl9JTlNOX01VTAotICwgRlIzMEJGX0lOU05fTVVMVSwgRlIzMEJGX0lOU05fTVVMSCwgRlIzMEJGX0lOU05fTVVMVUgsIEZSMzBCRl9JTlNOX0RJVjBTCi0gLCBGUjMwQkZfSU5TTl9ESVYwVSwgRlIzMEJGX0lOU05fRElWMSwgRlIzMEJGX0lOU05fRElWMiwgRlIzMEJGX0lOU05fRElWMwotICwgRlIzMEJGX0lOU05fRElWNFMsIEZSMzBCRl9JTlNOX0xTTCwgRlIzMEJGX0lOU05fTFNMSSwgRlIzMEJGX0lOU05fTFNMMgotICwgRlIzMEJGX0lOU05fTFNSLCBGUjMwQkZfSU5TTl9MU1JJLCBGUjMwQkZfSU5TTl9MU1IyLCBGUjMwQkZfSU5TTl9BU1IKLSAsIEZSMzBCRl9JTlNOX0FTUkksIEZSMzBCRl9JTlNOX0FTUjIsIEZSMzBCRl9JTlNOX0xESTgsIEZSMzBCRl9JTlNOX0xESTIwCi0gLCBGUjMwQkZfSU5TTl9MREkzMiwgRlIzMEJGX0lOU05fTEQsIEZSMzBCRl9JTlNOX0xEVUgsIEZSMzBCRl9JTlNOX0xEVUIKLSAsIEZSMzBCRl9JTlNOX0xEUjEzLCBGUjMwQkZfSU5TTl9MRFIxM1VILCBGUjMwQkZfSU5TTl9MRFIxM1VCLCBGUjMwQkZfSU5TTl9MRFIxNAotICwgRlIzMEJGX0lOU05fTERSMTRVSCwgRlIzMEJGX0lOU05fTERSMTRVQiwgRlIzMEJGX0lOU05fTERSMTUsIEZSMzBCRl9JTlNOX0xEUjE1R1IKLSAsIEZSMzBCRl9JTlNOX0xEUjE1RFIsIEZSMzBCRl9JTlNOX0xEUjE1UFMsIEZSMzBCRl9JTlNOX1NULCBGUjMwQkZfSU5TTl9TVEgKLSAsIEZSMzBCRl9JTlNOX1NUQiwgRlIzMEJGX0lOU05fU1RSMTMsIEZSMzBCRl9JTlNOX1NUUjEzSCwgRlIzMEJGX0lOU05fU1RSMTNCCi0gLCBGUjMwQkZfSU5TTl9TVFIxNCwgRlIzMEJGX0lOU05fU1RSMTRILCBGUjMwQkZfSU5TTl9TVFIxNEIsIEZSMzBCRl9JTlNOX1NUUjE1Ci0gLCBGUjMwQkZfSU5TTl9TVFIxNUdSLCBGUjMwQkZfSU5TTl9TVFIxNURSLCBGUjMwQkZfSU5TTl9TVFIxNVBTLCBGUjMwQkZfSU5TTl9NT1YKLSAsIEZSMzBCRl9JTlNOX01PVkRSLCBGUjMwQkZfSU5TTl9NT1ZQUywgRlIzMEJGX0lOU05fTU9WMkRSLCBGUjMwQkZfSU5TTl9NT1YyUFMKLSAsIEZSMzBCRl9JTlNOX0pNUCwgRlIzMEJGX0lOU05fSk1QRCwgRlIzMEJGX0lOU05fQ0FMTFIsIEZSMzBCRl9JTlNOX0NBTExSRAotICwgRlIzMEJGX0lOU05fQ0FMTCwgRlIzMEJGX0lOU05fQ0FMTEQsIEZSMzBCRl9JTlNOX1JFVCwgRlIzMEJGX0lOU05fUkVUX0QKLSAsIEZSMzBCRl9JTlNOX0lOVCwgRlIzMEJGX0lOU05fSU5URSwgRlIzMEJGX0lOU05fUkVUSSwgRlIzMEJGX0lOU05fQlJBRAotICwgRlIzMEJGX0lOU05fQlJBLCBGUjMwQkZfSU5TTl9CTk9ELCBGUjMwQkZfSU5TTl9CTk8sIEZSMzBCRl9JTlNOX0JFUUQKLSAsIEZSMzBCRl9JTlNOX0JFUSwgRlIzMEJGX0lOU05fQk5FRCwgRlIzMEJGX0lOU05fQk5FLCBGUjMwQkZfSU5TTl9CQ0QKLSAsIEZSMzBCRl9JTlNOX0JDLCBGUjMwQkZfSU5TTl9CTkNELCBGUjMwQkZfSU5TTl9CTkMsIEZSMzBCRl9JTlNOX0JORAotICwgRlIzMEJGX0lOU05fQk4sIEZSMzBCRl9JTlNOX0JQRCwgRlIzMEJGX0lOU05fQlAsIEZSMzBCRl9JTlNOX0JWRAotICwgRlIzMEJGX0lOU05fQlYsIEZSMzBCRl9JTlNOX0JOVkQsIEZSMzBCRl9JTlNOX0JOViwgRlIzMEJGX0lOU05fQkxURAotICwgRlIzMEJGX0lOU05fQkxULCBGUjMwQkZfSU5TTl9CR0VELCBGUjMwQkZfSU5TTl9CR0UsIEZSMzBCRl9JTlNOX0JMRUQKLSAsIEZSMzBCRl9JTlNOX0JMRSwgRlIzMEJGX0lOU05fQkdURCwgRlIzMEJGX0lOU05fQkdULCBGUjMwQkZfSU5TTl9CTFNECi0gLCBGUjMwQkZfSU5TTl9CTFMsIEZSMzBCRl9JTlNOX0JISUQsIEZSMzBCRl9JTlNOX0JISSwgRlIzMEJGX0lOU05fRE1PVlIxMwotICwgRlIzMEJGX0lOU05fRE1PVlIxM0gsIEZSMzBCRl9JTlNOX0RNT1ZSMTNCLCBGUjMwQkZfSU5TTl9ETU9WUjEzUEksIEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUgKLSAsIEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUIsIEZSMzBCRl9JTlNOX0RNT1ZSMTVQSSwgRlIzMEJGX0lOU05fRE1PVjJSMTMsIEZSMzBCRl9JTlNOX0RNT1YyUjEzSAotICwgRlIzMEJGX0lOU05fRE1PVjJSMTNCLCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJLCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMEJGX0lOU05fRE1PVjJSMTNQSUIKLSAsIEZSMzBCRl9JTlNOX0RNT1YyUjE1UEQsIEZSMzBCRl9JTlNOX0xEUkVTLCBGUjMwQkZfSU5TTl9TVFJFUywgRlIzMEJGX0lOU05fQ09QT1AKLSAsIEZSMzBCRl9JTlNOX0NPUExELCBGUjMwQkZfSU5TTl9DT1BTVCwgRlIzMEJGX0lOU05fQ09QU1YsIEZSMzBCRl9JTlNOX05PUAotICwgRlIzMEJGX0lOU05fQU5EQ0NSLCBGUjMwQkZfSU5TTl9PUkNDUiwgRlIzMEJGX0lOU05fU1RJTE0sIEZSMzBCRl9JTlNOX0FERFNQCi0gLCBGUjMwQkZfSU5TTl9FWFRTQiwgRlIzMEJGX0lOU05fRVhUVUIsIEZSMzBCRl9JTlNOX0VYVFNILCBGUjMwQkZfSU5TTl9FWFRVSAotICwgRlIzMEJGX0lOU05fTERNMCwgRlIzMEJGX0lOU05fTERNMSwgRlIzMEJGX0lOU05fU1RNMCwgRlIzMEJGX0lOU05fU1RNMQotICwgRlIzMEJGX0lOU05fRU5URVIsIEZSMzBCRl9JTlNOX0xFQVZFLCBGUjMwQkZfSU5TTl9YQ0hCLCBGUjMwQkZfSU5TTl9NQVgKLX0gRlIzMEJGX0lOU05fVFlQRTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igc2VtYW50aWMgZm9ybWF0cyBpbiBjcHUgZmFtaWx5IGZyMzBiZi4gICovCi10eXBlZGVmIGVudW0gZnIzMGJmX3NmbXRfdHlwZSB7Ci0gIEZSMzBCRl9TRk1UX0VNUFRZLCBGUjMwQkZfU0ZNVF9BREQsIEZSMzBCRl9TRk1UX0FEREksIEZSMzBCRl9TRk1UX0FERDIKLSAsIEZSMzBCRl9TRk1UX0FEREMsIEZSMzBCRl9TRk1UX0FERE4sIEZSMzBCRl9TRk1UX0FERE5JLCBGUjMwQkZfU0ZNVF9BREROMgotICwgRlIzMEJGX1NGTVRfQ01QLCBGUjMwQkZfU0ZNVF9DTVBJLCBGUjMwQkZfU0ZNVF9DTVAyLCBGUjMwQkZfU0ZNVF9BTkQKLSAsIEZSMzBCRl9TRk1UX0FORE0sIEZSMzBCRl9TRk1UX0FOREgsIEZSMzBCRl9TRk1UX0FOREIsIEZSMzBCRl9TRk1UX0JBTkRMCi0gLCBGUjMwQkZfU0ZNVF9CVFNUTCwgRlIzMEJGX1NGTVRfTVVMLCBGUjMwQkZfU0ZNVF9NVUxVLCBGUjMwQkZfU0ZNVF9NVUxICi0gLCBGUjMwQkZfU0ZNVF9ESVYwUywgRlIzMEJGX1NGTVRfRElWMFUsIEZSMzBCRl9TRk1UX0RJVjEsIEZSMzBCRl9TRk1UX0RJVjIKLSAsIEZSMzBCRl9TRk1UX0RJVjMsIEZSMzBCRl9TRk1UX0RJVjRTLCBGUjMwQkZfU0ZNVF9MU0wsIEZSMzBCRl9TRk1UX0xTTEkKLSAsIEZSMzBCRl9TRk1UX0xESTgsIEZSMzBCRl9TRk1UX0xESTIwLCBGUjMwQkZfU0ZNVF9MREkzMiwgRlIzMEJGX1NGTVRfTEQKLSAsIEZSMzBCRl9TRk1UX0xEUjEzLCBGUjMwQkZfU0ZNVF9MRFIxNCwgRlIzMEJGX1NGTVRfTERSMTRVSCwgRlIzMEJGX1NGTVRfTERSMTRVQgotICwgRlIzMEJGX1NGTVRfTERSMTUsIEZSMzBCRl9TRk1UX0xEUjE1R1IsIEZSMzBCRl9TRk1UX0xEUjE1RFIsIEZSMzBCRl9TRk1UX0xEUjE1UFMKLSAsIEZSMzBCRl9TRk1UX1NULCBGUjMwQkZfU0ZNVF9TVFIxMywgRlIzMEJGX1NGTVRfU1RSMTQsIEZSMzBCRl9TRk1UX1NUUjE0SAotICwgRlIzMEJGX1NGTVRfU1RSMTRCLCBGUjMwQkZfU0ZNVF9TVFIxNSwgRlIzMEJGX1NGTVRfU1RSMTVHUiwgRlIzMEJGX1NGTVRfU1RSMTVEUgotICwgRlIzMEJGX1NGTVRfU1RSMTVQUywgRlIzMEJGX1NGTVRfTU9WLCBGUjMwQkZfU0ZNVF9NT1ZEUiwgRlIzMEJGX1NGTVRfTU9WUFMKLSAsIEZSMzBCRl9TRk1UX01PVjJEUiwgRlIzMEJGX1NGTVRfTU9WMlBTLCBGUjMwQkZfU0ZNVF9KTVAsIEZSMzBCRl9TRk1UX0NBTExSCi0gLCBGUjMwQkZfU0ZNVF9DQUxMLCBGUjMwQkZfU0ZNVF9SRVQsIEZSMzBCRl9TRk1UX0lOVCwgRlIzMEJGX1NGTVRfSU5URQotICwgRlIzMEJGX1NGTVRfUkVUSSwgRlIzMEJGX1NGTVRfQlJBRCwgRlIzMEJGX1NGTVRfQk5PRCwgRlIzMEJGX1NGTVRfQkVRRAotICwgRlIzMEJGX1NGTVRfQkNELCBGUjMwQkZfU0ZNVF9CTkQsIEZSMzBCRl9TRk1UX0JWRCwgRlIzMEJGX1NGTVRfQkxURAotICwgRlIzMEJGX1NGTVRfQkxFRCwgRlIzMEJGX1NGTVRfQkxTRCwgRlIzMEJGX1NGTVRfRE1PVlIxMywgRlIzMEJGX1NGTVRfRE1PVlIxM0gKLSAsIEZSMzBCRl9TRk1UX0RNT1ZSMTNCLCBGUjMwQkZfU0ZNVF9ETU9WUjEzUEksIEZSMzBCRl9TRk1UX0RNT1ZSMTNQSUgsIEZSMzBCRl9TRk1UX0RNT1ZSMTNQSUIKLSAsIEZSMzBCRl9TRk1UX0RNT1ZSMTVQSSwgRlIzMEJGX1NGTVRfRE1PVjJSMTMsIEZSMzBCRl9TRk1UX0RNT1YyUjEzSCwgRlIzMEJGX1NGTVRfRE1PVjJSMTNCCi0gLCBGUjMwQkZfU0ZNVF9ETU9WMlIxM1BJLCBGUjMwQkZfU0ZNVF9ETU9WMlIxM1BJSCwgRlIzMEJGX1NGTVRfRE1PVjJSMTNQSUIsIEZSMzBCRl9TRk1UX0RNT1YyUjE1UEQKLSAsIEZSMzBCRl9TRk1UX0xEUkVTLCBGUjMwQkZfU0ZNVF9DT1BPUCwgRlIzMEJGX1NGTVRfQU5EQ0NSLCBGUjMwQkZfU0ZNVF9TVElMTQotICwgRlIzMEJGX1NGTVRfQUREU1AsIEZSMzBCRl9TRk1UX0VYVFNCLCBGUjMwQkZfU0ZNVF9FWFRVQiwgRlIzMEJGX1NGTVRfRVhUU0gKLSAsIEZSMzBCRl9TRk1UX0VYVFVILCBGUjMwQkZfU0ZNVF9MRE0wLCBGUjMwQkZfU0ZNVF9MRE0xLCBGUjMwQkZfU0ZNVF9TVE0wCi0gLCBGUjMwQkZfU0ZNVF9TVE0xLCBGUjMwQkZfU0ZNVF9FTlRFUiwgRlIzMEJGX1NGTVRfTEVBVkUsIEZSMzBCRl9TRk1UX1hDSEIKLX0gRlIzMEJGX1NGTVRfVFlQRTsKLQotLyogRnVuY3Rpb24gdW5pdCBoYW5kbGVycyAodXNlciB3cml0dGVuKS4gICovCi0KLWV4dGVybiBpbnQgZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0bSAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnJlZ2xpc3QqLyk7Ci1leHRlcm4gaW50IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sZG0gKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypyZWdsaXN0Ki8pOwotZXh0ZXJuIGludCBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypSaSovLCBJTlQgLypSaiovKTsKLWV4dGVybiBpbnQgZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypSaiovLCBJTlQgLypSaSovKTsKLWV4dGVybiBpbnQgZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKlJpKi8pOwotZXh0ZXJuIGludCBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKlJpKi8sIElOVCAvKlJqKi8sIElOVCAvKlJpKi8pOwotCi0vKiBQcm9maWxpbmcgYmVmb3JlL2FmdGVyIGhhbmRsZXJzICh1c2VyIHdyaXR0ZW4pICovCi0KLWV4dGVybiB2b2lkIGZyMzBiZl9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqLCBpbnQgLypmaXJzdF9wKi8pOwotZXh0ZXJuIHZvaWQgZnIzMGJmX21vZGVsX2luc25fYWZ0ZXIgKFNJTV9DUFUgKiwgaW50IC8qbGFzdF9wKi8sIGludCAvKmN5Y2xlcyovKTsKLQotI2VuZGlmIC8qIEZSMzBCRl9ERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvZGV2aWNlcy5jIGIvc2ltL2ZyMzAvZGV2aWNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Q0N2NmLi4wMDAwMDAwCi0tLSBhL3NpbS9mcjMwL2RldmljZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qIGZyMzAgZGV2aWNlIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEFsbCBvZiB0aGlzIGlzIGp1c3QgdG8gZ2V0IHNvbWV0aGluZyBnb2luZy4gIHdpcCEgICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0jaWZkZWYgSEFWRV9EVl9TT0NLU0VSCi0jaW5jbHVkZSAiZHYtc29ja3Nlci5oIgotI2VuZGlmCi0KLWRldmljZSBmcjMwX2RldmljZXM7Ci0KLWludAotZGV2aWNlX2lvX3JlYWRfYnVmZmVyIChkZXZpY2UgKm1lLCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwKLQkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywKLQkJICAgICAgIFNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQotewotICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSAhPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCi0gICAgcmV0dXJuIG5yX2J5dGVzOwotCi0jaWZkZWYgSEFWRV9EVl9TT0NLU0VSCi0gIGlmIChhZGRyID09IFVBUlRfSU5DSEFSX0FERFIpCi0gICAgewotICAgICAgaW50IGMgPSBkdl9zb2Nrc2VyX3JlYWQgKHNkKTsKLSAgICAgIGlmIChjID09IC0xKQotCXJldHVybiAwOwotICAgICAgKihjaGFyICopIHNvdXJjZSA9IGM7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChhZGRyID09IFVBUlRfU1RBVFVTX0FERFIpCi0gICAgewotICAgICAgaW50IHN0YXR1cyA9IGR2X3NvY2tzZXJfc3RhdHVzIChzZCk7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gc291cmNlOwotICAgICAgcFswXSA9IDA7Ci0gICAgICBwWzFdID0gKCgoc3RhdHVzICYgRFZfU09DS1NFUl9JTlBVVF9FTVBUWSkKLSNpZmRlZiBVQVJUX0lOUFVUX1JFQURZMAotCSAgICAgICA/IFVBUlRfSU5QVVRfUkVBRFkgOiAwKQotI2Vsc2UKLQkgICAgICAgPyAwIDogVUFSVF9JTlBVVF9SRUFEWSkKLSNlbmRpZgotCSAgICAgICsgKChzdGF0dXMgJiBEVl9TT0NLU0VSX09VVFBVVF9FTVBUWSkgPyBVQVJUX09VVFBVVF9SRUFEWSA6IDApKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBucl9ieXRlczsKLX0KLQotaW50Ci1kZXZpY2VfaW9fd3JpdGVfYnVmZmVyIChkZXZpY2UgKm1lLCBjb25zdCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwKLQkJCWFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywKLQkJCVNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQotewotI2lmIFdJVEhfU0NBQ0hFCi0gIGlmIChhZGRyID09IE1DQ1JfQUREUikKLSAgICB7Ci0gICAgICBpZiAoKCooY29uc3QgY2hhciAqKSBzb3VyY2UgJiBNQ0NSX0NQKSAhPSAwKQotCXNjYWNoZV9mbHVzaCAoc2QpOwotICAgICAgcmV0dXJuIG5yX2J5dGVzOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpICE9IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICByZXR1cm4gbnJfYnl0ZXM7Ci0KLSNpZiBIQVZFX0RWX1NPQ0tTRVIKLSAgaWYgKGFkZHIgPT0gVUFSVF9PVVRDSEFSX0FERFIpCi0gICAgewotICAgICAgaW50IHJjID0gZHZfc29ja3Nlcl93cml0ZSAoc2QsICooY2hhciAqKSBzb3VyY2UpOwotICAgICAgcmV0dXJuIHJjID09IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfQotCi12b2lkCi1kZXZpY2VfZXJyb3IgKGRldmljZSAqbWUsIGNoYXIgKm1lc3NhZ2UsIC4uLikKLXsKLX0KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2ZyMzAtc2ltLmggYi9zaW0vZnIzMC9mcjMwLXNpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI4MTE3Li4wMDAwMDAwCi0tLSBhL3NpbS9mcjMwL2ZyMzAtc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBjb2xsZWN0aW9uIG9mIGp1bmsgd2FpdGluZyB0aW1lIHRvIHNvcnQgb3V0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRlIzMF9TSU1fSAotI2RlZmluZSBGUjMwX1NJTV9ICi0KLS8qIGdkYiByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIFBDX1JFR05VTQkxNgotI2RlZmluZSBQU19SRUdOVU0JMTcKLSNkZWZpbmUgVEJSX1JFR05VTQkxOAotI2RlZmluZSBSUF9SRUdOVU0JMTkKLSNkZWZpbmUgU1NQX1JFR05VTQkyMAotI2RlZmluZSBVU1BfUkVHTlVNCTIxCi0jZGVmaW5lIE1ESF9SRUdOVU0JMjIKLSNkZWZpbmUgTURMX1JFR05VTQkyMwotCi1leHRlcm4gQkkgZnIzMGJmX2hfc2JpdF9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKLWV4dGVybiB2b2lkIGZyMzBiZl9oX3NiaXRfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgQkkpOwotCi1leHRlcm4gVVFJIGZyMzBiZl9oX2Njcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKLWV4dGVybiB2b2lkIGZyMzBiZl9oX2Njcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVUUkpOwotCi1leHRlcm4gVVFJIGZyMzBiZl9oX3Njcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKLWV4dGVybiB2b2lkIGZyMzBiZl9oX3Njcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVUUkpOwotCi1leHRlcm4gVVFJIGZyMzBiZl9oX2lsbV9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKLWV4dGVybiB2b2lkIGZyMzBiZl9oX2lsbV9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVUUkpOwotCi1leHRlcm4gVVNJIGZyMzBiZl9oX3BzX2dldF9oYW5kbGVyIChTSU1fQ1BVICopOwotZXh0ZXJuIHZvaWQgZnIzMGJmX2hfcHNfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVVNJKTsKLQotZXh0ZXJuIFNJIGZyMzBiZl9oX2RyX2dldF9oYW5kbGVyIChTSU1fQ1BVICosIFVJTlQpOwotZXh0ZXJuIHZvaWQgZnIzMGJmX2hfZHJfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOwotDAotI2RlZmluZSBHRVRUV0kgR0VUVFNJCi0jZGVmaW5lIFNFVFRXSSBTRVRUU0kKLQwKLS8qIEhhcmR3YXJlL2RldmljZSBzdXBwb3J0LgotICAgPz8/IFdpbGwgZXZlbnR1YWxseSB3YW50IHRvIG1vdmUgZGV2aWNlIHN0dWZmIHRvIGNvbmZpZyBmaWxlcy4gICovCi0KLS8qIFNwZWNpYWwgcHVycG9zZSB0cmFwcy4gICovCi0jZGVmaW5lIFRSQVBfU1lTQ0FMTAkxMAotI2RlZmluZSBUUkFQX0JSRUFLUE9JTlQJOQotCi0vKiBTdXBwb3J0IGZvciB0aGUgTUNDUiByZWdpc3RlciAoQ2FjaGUgQ29udHJvbCBSZWdpc3RlcikgaXMgbmVlZGVkIGluIG9yZGVyCi0gICBmb3Igb3ZlcmxheXMgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgc2NhY2hlOiBjYWNoZWQgaW5zdHJ1Y3Rpb25zIG5lZWQKLSAgIHRvIGJlIGZsdXNoZWQgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gc3BhY2UgaXMgY2hhbmdlZCBhdCBydW50aW1lLiAgKi8KLQotLyogQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNQ0NSX0FERFIgMHhmZmZmZmZmZgotI2RlZmluZSBNQ0NSX0NQIDB4ODAKLS8qIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTUNDUl9DTTAgMgotI2RlZmluZSBNQ0NSX0NNMSAxCi0KLS8qIFNlcmlhbCBkZXZpY2UgYWRkcmVzc2VzLiAgKi8KLS8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGZvciB0aGUgTVNBMjAwMCBib2FyZC4KLSAgID8/PyBXaWxsIGV2ZW50dWFsbHkgbmVlZCB0byBtb3ZlIHRoaXMgdG8gYSBjb25maWcgZmlsZS4gICovCi0jZGVmaW5lIFVBUlRfSU5DSEFSX0FERFIJMHhmZjAwNDAwOQotI2RlZmluZSBVQVJUX09VVENIQVJfQUREUgkweGZmMDA0MDA3Ci0jZGVmaW5lIFVBUlRfU1RBVFVTX0FERFIJMHhmZjAwNDAwMgotCi0jZGVmaW5lIFVBUlRfSU5QVVRfUkVBRFkJMHg0Ci0jZGVmaW5lIFVBUlRfT1VUUFVUX1JFQURZCTB4MQotCi0vKiBTdGFydCBhZGRyZXNzIGFuZCBsZW5ndGggb2YgYWxsIGRldmljZSBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgRlIzMF9ERVZJQ0VfQUREUgkweGZmMDAwMDAwCi0jZGVmaW5lIEZSMzBfREVWSUNFX0xFTgkJMHgwMGZmZmZmZgotCi0vKiBzaW1fY29yZV9hdHRhY2ggZGV2aWNlIGFyZ3VtZW50LiAgKi8KLWV4dGVybiBkZXZpY2UgZnIzMF9kZXZpY2VzOwotCi0vKiBGSVhNRTogVGVtcG9yYXJ5LCB1bnRpbCBkZXZpY2Ugc3VwcG9ydCByZWFkeS4gICovCi1zdHJ1Y3QgX2RldmljZSB7IGludCBmb287IH07Ci0KLS8qIEhhbmRsZSB0aGUgdHJhcCBpbnNuLiAgKi8KLVVTSSBmcjMwX2ludCAoU0lNX0NQVSAqLCBQQ0FERFIsIGludCk7Ci0KLSNlbmRpZiAvKiBGUjMwX1NJTV9IICovCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9mcjMwLmMgYi9zaW0vZnIzMC9mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzM2NTQuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qIGZyMzAgc2ltdWxhdG9yIHN1cHBvcnQgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFdBTlRfQ1BVCi0jZGVmaW5lIFdBTlRfQ1BVX0ZSMzBCRgotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJjZ2VuLW1lbS5oIgotI2luY2x1ZGUgImNnZW4tb3BzLmgiCi0KLS8qIENvbnZlcnQgZ2RiIGRlZGljYXRlZCByZWdpc3RlciBudW1iZXIgdG8gYWN0dWFsIGRyIHJlZyBudW1iZXIuICAqLwotCi1zdGF0aWMgaW50Ci1kZWNvZGVfZ2RiX2RyX3JlZ251bSAoaW50IGdkYl9yZWdudW0pCi17Ci0gIHN3aXRjaCAoZ2RiX3JlZ251bSkKLSAgICB7Ci0gICAgY2FzZSBUQlJfUkVHTlVNIDogcmV0dXJuIEhfRFJfVEJSOwotICAgIGNhc2UgUlBfUkVHTlVNIDogcmV0dXJuIEhfRFJfUlA7Ci0gICAgY2FzZSBTU1BfUkVHTlVNIDogcmV0dXJuIEhfRFJfU1NQOwotICAgIGNhc2UgVVNQX1JFR05VTSA6IHJldHVybiBIX0RSX1VTUDsKLSAgICBjYXNlIE1ESF9SRUdOVU0gOiByZXR1cm4gSF9EUl9NREg7Ci0gICAgY2FzZSBNRExfUkVHTlVNIDogcmV0dXJuIEhfRFJfTURMOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLQotaW50Ci1mcjMwYmZfZmV0Y2hfcmVnaXN0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBpbnQgcm4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgaWYgKHJuIDwgMTYpCi0gICAgU0VUVFdJIChidWYsIGZyMzBiZl9oX2dyX2dldCAoY3VycmVudF9jcHUsIHJuKSk7Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKHJuKQotICAgICAgewotICAgICAgY2FzZSBQQ19SRUdOVU0gOgotCVNFVFRXSSAoYnVmLCBmcjMwYmZfaF9wY19nZXQgKGN1cnJlbnRfY3B1KSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBTX1JFR05VTSA6Ci0JU0VUVFdJIChidWYsIGZyMzBiZl9oX3BzX2dldCAoY3VycmVudF9jcHUpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVEJSX1JFR05VTSA6Ci0gICAgICBjYXNlIFJQX1JFR05VTSA6Ci0gICAgICBjYXNlIFNTUF9SRUdOVU0gOgotICAgICAgY2FzZSBVU1BfUkVHTlVNIDoKLSAgICAgIGNhc2UgTURIX1JFR05VTSA6Ci0gICAgICBjYXNlIE1ETF9SRUdOVU0gOgotCVNFVFRXSSAoYnVmLCBmcjMwYmZfaF9kcl9nZXQgKGN1cnJlbnRfY3B1LAotCQkJCSAgICAgIGRlY29kZV9nZGJfZHJfcmVnbnVtIChybikpKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQgOgotCXJldHVybiAwOwotICAgICAgfQotCi0gIHJldHVybiAtMTsgLypGSVhNRSovCi19Ci0KLS8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLQotaW50Ci1mcjMwYmZfc3RvcmVfcmVnaXN0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBpbnQgcm4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgaWYgKHJuIDwgMTYpCi0gICAgZnIzMGJmX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgcm4sIEdFVFRXSSAoYnVmKSk7Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKHJuKQotICAgICAgewotICAgICAgY2FzZSBQQ19SRUdOVU0gOgotCWZyMzBiZl9oX3BjX3NldCAoY3VycmVudF9jcHUsIEdFVFRXSSAoYnVmKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBTX1JFR05VTSA6Ci0JZnIzMGJmX2hfcHNfc2V0IChjdXJyZW50X2NwdSwgR0VUVFdJIChidWYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVEJSX1JFR05VTSA6Ci0gICAgICBjYXNlIFJQX1JFR05VTSA6Ci0gICAgICBjYXNlIFNTUF9SRUdOVU0gOgotICAgICAgY2FzZSBVU1BfUkVHTlVNIDoKLSAgICAgIGNhc2UgTURIX1JFR05VTSA6Ci0gICAgICBjYXNlIE1ETF9SRUdOVU0gOgotCWZyMzBiZl9oX2RyX3NldCAoY3VycmVudF9jcHUsCi0JCQkgZGVjb2RlX2dkYl9kcl9yZWdudW0gKHJuKSwKLQkJCSBHRVRUV0kgKGJ1ZikpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KLX0KLQwKLS8qIENvdmVyIGZucyB0byBhY2Nlc3MgdGhlIGNjciBiaXRzLiAgKi8KLQotQkkKLWZyMzBiZl9oX3NiaXRfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX3NiaXQpOwotfQotCi12b2lkCi1mcjMwYmZfaF9zYml0X3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBpbnQgb2xkX3NiaXQgPSBDUFUgKGhfc2JpdCk7Ci0gIGludCBuZXdfc2JpdCA9IChuZXd2YWwgIT0gMCk7Ci0KLSAgQ1BVIChoX3NiaXQpID0gbmV3X3NiaXQ7Ci0KLSAgLyogV2hlbiBzd2l0Y2hpbmcgc3RhY2sgbW9kZXMsIHVwZGF0ZSB0aGUgcmVnaXN0ZXJzLiAgKi8KLSAgaWYgKG9sZF9zYml0ICE9IG5ld19zYml0KQotICAgIHsKLSAgICAgIGlmIChvbGRfc2JpdCkKLQl7Ci0JICAvKiBTd2l0Y2hpbmcgdXNlciAtPiBzeXN0ZW0uICAqLwotCSAgQ1BVIChoX2RyW0hfRFJfVVNQXSkgPSBDUFUgKGhfZ3JbSF9HUl9TUF0pOwotCSAgQ1BVIChoX2dyW0hfR1JfU1BdKSA9IENQVSAoaF9kcltIX0RSX1NTUF0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTd2l0Y2hpbmcgc3lzdGVtIC0+IHVzZXIuICAqLwotCSAgQ1BVIChoX2RyW0hfRFJfU1NQXSkgPSBDUFUgKGhfZ3JbSF9HUl9TUF0pOwotCSAgQ1BVIChoX2dyW0hfR1JfU1BdKSA9IENQVSAoaF9kcltIX0RSX1VTUF0pOwotCX0KLSAgICB9Ci0KLSAgLyogVE9ETzogcjE1IGludGVybG9jayAqLwotfQotDAotLyogQ292ZXIgZm5zIHRvIGFjY2VzcyB0aGUgY2NyIGJpdHMuICAqLwotCi1VUUkKLWZyMzBiZl9oX2Njcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIGludCBjY3IgPSAoICAoR0VUX0hfQ0JJVCAoKSA8PCAwKQotCSAgICAgfCAoR0VUX0hfVkJJVCAoKSA8PCAxKQotCSAgICAgfCAoR0VUX0hfWkJJVCAoKSA8PCAyKQotCSAgICAgfCAoR0VUX0hfTkJJVCAoKSA8PCAzKQotCSAgICAgfCAoR0VUX0hfSUJJVCAoKSA8PCA0KQotCSAgICAgfCAoR0VUX0hfU0JJVCAoKSA8PCA1KSk7Ci0KLSAgcmV0dXJuIGNjcjsKLX0KLQotdm9pZAotZnIzMGJmX2hfY2NyX3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgaW50IGNjciA9IG5ld3ZhbCAmIDB4M2Y7Ci0KLSAgU0VUX0hfQ0JJVCAoKGNjciAmIDEpICE9IDApOwotICBTRVRfSF9WQklUICgoY2NyICYgMikgIT0gMCk7Ci0gIFNFVF9IX1pCSVQgKChjY3IgJiA0KSAhPSAwKTsKLSAgU0VUX0hfTkJJVCAoKGNjciAmIDgpICE9IDApOwotICBTRVRfSF9JQklUICgoY2NyICYgMHgxMCkgIT0gMCk7Ci0gIFNFVF9IX1NCSVQgKChjY3IgJiAweDIwKSAhPSAwKTsKLX0KLQwKLS8qIENvdmVyIGZucyB0byBhY2Nlc3MgdGhlIHNjciBiaXRzLiAgKi8KLQotVVFJCi1mcjMwYmZfaF9zY3JfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICBpbnQgc2NyID0gKCAgKEdFVF9IX1RCSVQgKCkgPDwgMCkKLQkgICAgIHwgKEdFVF9IX0QwQklUICgpIDw8IDEpCi0JICAgICB8IChHRVRfSF9EMUJJVCAoKSA8PCAyKSk7Ci0gIHJldHVybiBzY3I7Ci19Ci0KLXZvaWQKLWZyMzBiZl9oX3Njcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCi17Ci0gIGludCBzY3IgPSBuZXd2YWwgJiA3OwotCi0gIFNFVF9IX1RCSVQgICgoc2NyICYgMSkgIT0gMCk7Ci0gIFNFVF9IX0QwQklUICgoc2NyICYgMikgIT0gMCk7Ci0gIFNFVF9IX0QxQklUICgoc2NyICYgNCkgIT0gMCk7Ci19Ci0MCi0vKiBDb3ZlciBmbnMgdG8gYWNjZXNzIHRoZSBpbG0gYml0cy4gICovCi0KLVVRSQotZnIzMGJmX2hfaWxtX2dldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9pbG0pOwotfQotCi12b2lkCi1mcjMwYmZfaF9pbG1fc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQotewotICBpbnQgaWxtID0gbmV3dmFsICYgMHgxZjsKLSAgaW50IGN1cnJlbnRfaWxtID0gQ1BVIChoX2lsbSk7Ci0KLSAgLyogV2UgY2FuIG9ubHkgc2V0IG5ldyBpbG0gdmFsdWVzIDwgMTYgaWYgdGhlIGN1cnJlbnQgaWxtIGlzIDwgMTYuICBPdGhlcndpc2UKLSAgICAgd2UgYWRkIDE2IHRvIHRoZSB2YWx1ZSB3ZSBhcmUgZ2l2ZW4uICAqLwotICBpZiAoY3VycmVudF9pbG0gPj0gMTYgJiYgaWxtIDwgMTYpCi0gICAgaWxtICs9IDE2OwotCi0gIENQVSAoaF9pbG0pID0gaWxtOwotfQotDAotLyogQ292ZXIgZm5zIHRvIGFjY2VzcyB0aGUgcHMgcmVnaXN0ZXIuICAqLwotCi1VU0kKLWZyMzBiZl9oX3BzX2dldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgaW50IGNjciA9IEdFVF9IX0NDUiAoKTsKLSAgaW50IHNjciA9IEdFVF9IX1NDUiAoKTsKLSAgaW50IGlsbSA9IEdFVF9IX0lMTSAoKTsKLQotICByZXR1cm4gY2NyIHwgKHNjciA8PCA4KSB8IChpbG0gPDwgMTYpOwotfQotCi12b2lkCi1mcjMwYmZfaF9wc19zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVTSSBuZXd2YWwpCi17Ci0gIGludCBjY3IgPSBuZXd2YWwgJiAweGZmOwotICBpbnQgc2NyID0gKG5ld3ZhbCA+PiA4KSAmIDc7Ci0gIGludCBpbG0gPSAobmV3dmFsID4+IDE2KSAmIDB4MWY7Ci0KLSAgU0VUX0hfQ0NSIChjY3IpOwotICBTRVRfSF9TQ1IgKHNjcik7Ci0gIFNFVF9IX0lMTSAoaWxtKTsKLX0KLQwKLS8qIENvdmVyIGZucyB0byBhY2Nlc3MgdGhlIGRlZGljYXRlZCByZWdpc3RlcnMuICAqLwotCi1TSQotZnIzMGJmX2hfZHJfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIGRyKQotewotICBzd2l0Y2ggKGRyKQotICAgIHsKLSAgICBjYXNlIEhfRFJfU1NQIDoKLSAgICAgIGlmICghIEdFVF9IX1NCSVQgKCkpCi0JcmV0dXJuIEdFVF9IX0dSIChIX0dSX1NQKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1BVIChoX2RyW0hfRFJfU1NQXSk7Ci0gICAgY2FzZSBIX0RSX1VTUCA6Ci0gICAgICBpZiAoR0VUX0hfU0JJVCAoKSkKLQlyZXR1cm4gR0VUX0hfR1IgKEhfR1JfU1ApOwotICAgICAgZWxzZQotCXJldHVybiBDUFUgKGhfZHJbSF9EUl9VU1BdKTsKLSAgICBjYXNlIEhfRFJfVEJSIDoKLSAgICBjYXNlIEhfRFJfUlAgOgotICAgIGNhc2UgSF9EUl9NREggOgotICAgIGNhc2UgSF9EUl9NREwgOgotICAgICAgcmV0dXJuIENQVSAoaF9kcltkcl0pOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWZyMzBiZl9oX2RyX3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCBkciwgU0kgbmV3dmFsKQotewotICBzd2l0Y2ggKGRyKQotICAgIHsKLSAgICBjYXNlIEhfRFJfU1NQIDoKLSAgICAgIGlmICghIEdFVF9IX1NCSVQgKCkpCi0JU0VUX0hfR1IgKEhfR1JfU1AsIG5ld3ZhbCk7Ci0gICAgICBlbHNlCi0JQ1BVIChoX2RyW0hfRFJfU1NQXSkgPSBuZXd2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhfRFJfVVNQIDoKLSAgICAgIGlmIChHRVRfSF9TQklUICgpKQotCVNFVF9IX0dSIChIX0dSX1NQLCBuZXd2YWwpOwotICAgICAgZWxzZQotCUNQVSAoaF9kcltIX0RSX1VTUF0pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0RSX1RCUiA6Ci0gICAgY2FzZSBIX0RSX1JQIDoKLSAgICBjYXNlIEhfRFJfTURIIDoKLSAgICBjYXNlIEhfRFJfTURMIDoKLSAgICAgIENQVSAoaF9kcltkcl0pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0KLS8qIEZJWE1FOiBTb21lIG9mIHRoZXNlIHNob3VsZCBiZSBpbmxpbmUgb3IgbWFjcm9zLiAgTGF0ZXIuICAqLwotCi0vKiBJbml0aWFsaXplIGN5Y2xlIGNvdW50aW5nIGZvciBhbiBpbnNuLgotICAgRklSU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsCi0gICBpbnNucy4gICovCi0KLXZvaWQKLWZyMzBiZl9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqY3B1LCBpbnQgZmlyc3RfcCkKLXsKLSAgTU9ERUxfRlIzMF8xX0RBVEEgKmQgPSBDUFVfTU9ERUxfREFUQSAoY3B1KTsKLSAgZC0+bG9hZF9yZWdzX3BlbmRpbmcgPSAwOwotfQotCi0vKiBSZWNvcmQgdGhlIGN5Y2xlcyBjb21wdXRlZCBmb3IgYW4gaW5zbi4KLSAgIExBU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMsCi0gICBhbmQgd2UgdXBkYXRlIHRoZSB0b3RhbCBjeWNsZSBjb3VudC4KLSAgIENZQ0xFUyBpcyB0aGUgY3ljbGUgY291bnQgb2YgdGhlIGluc24uICAqLwotCi12b2lkCi1mcjMwYmZfbW9kZWxfaW5zbl9hZnRlciAoU0lNX0NQVSAqY3B1LCBpbnQgbGFzdF9wLCBpbnQgY3ljbGVzKQotewotICBQUk9GSUxFX0RBVEEgKnAgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICBNT0RFTF9GUjMwXzFfREFUQSAqZCA9IENQVV9NT0RFTF9EQVRBIChjcHUpOwotCi0gIFBST0ZJTEVfTU9ERUxfVE9UQUxfQ1lDTEVTIChwKSArPSBjeWNsZXM7Ci0gIFBST0ZJTEVfTU9ERUxfQ1VSX0lOU05fQ1lDTEVTIChwKSA9IGN5Y2xlczsKLSAgZC0+bG9hZF9yZWdzID0gZC0+bG9hZF9yZWdzX3BlbmRpbmc7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgaW50Ci1jaGVja19sb2FkX3N0YWxsIChTSU1fQ1BVICpjcHUsIGludCByZWdubykKLXsKLSAgY29uc3QgTU9ERUxfRlIzMF8xX0RBVEEgKmQgPSBDUFVfTU9ERUxfREFUQSAoY3B1KTsKLSAgVUlOVCBsb2FkX3JlZ3MgPSBkLT5sb2FkX3JlZ3M7Ci0KLSAgaWYgKHJlZ25vICE9IC0xCi0gICAgICAmJiAobG9hZF9yZWdzICYgKDEgPDwgcmVnbm8pKSAhPSAwKQotICAgIHsKLSAgICAgIFBST0ZJTEVfREFUQSAqcCA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gICAgICArKyBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTIChwKTsKLSAgICAgIGlmIChUUkFDRV9JTlNOX1AgKGNwdSkpCi0JY2dlbl90cmFjZV9wcmludGYgKGNwdSwgIiA7IExvYWQgc3RhbGwuIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1mcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCwKLQkJCSAgICBJTlQgaW5fUmksIElOVCBpbl9SaiwgSU5UIG91dF9SaSkKLXsKLSAgaW50IGN5Y2xlcyA9IGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOwotICBjeWNsZXMgKz0gY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBpbl9SaSk7Ci0gIGN5Y2xlcyArPSBjaGVja19sb2FkX3N0YWxsIChjcHUsIGluX1JqKTsKLSAgcmV0dXJuIGN5Y2xlczsKLX0KLQotaW50Ci1mcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICBJTlQgaW5fUmkpCi17Ci0gIFBST0ZJTEVfREFUQSAqcCA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIC8qICgxIDw8IDEpOiBUaGUgcGMgaXMgdGhlIDJuZCBlbGVtZW50IGluIGlucHV0cywgb3V0cHV0cy4KLSAgICAgPz8/IGNhbiBiZSBjbGVhbmVkIHVwICovCi0gIGludCB0YWtlbl9wID0gKHJlZmVyZW5jZWQgJiAoMSA8PCAxKSkgIT0gMDsKLSAgaW50IGN5Y2xlcyA9IGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOwotICBpbnQgZGVsYXlfc2xvdF9wID0gQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBpZGVzYy0+YXR0cnMsIENHRU5fSU5TTl9ERUxBWV9TTE9UKTsKLQotICBjeWNsZXMgKz0gY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBpbl9SaSk7Ci0gIGlmICh0YWtlbl9wKQotICAgIHsKLSAgICAgIC8qID8/PyBIYW5kbGluZyBjdGkncyB3aXRob3V0IGRlbGF5IHNsb3RzIHRoaXMgd2F5IHdpbGwgcnVuIGFmb3VsIG9mCi0JIGFjY3VyYXRlIHN5c3RlbSBzaW11bGF0aW9uLiAgTGF0ZXIuICAqLwotICAgICAgaWYgKCEgZGVsYXlfc2xvdF9wKQotCXsKLQkgICsrY3ljbGVzOwotCSAgKytQUk9GSUxFX01PREVMX0NUSV9TVEFMTF9DWUNMRVMgKHApOwotCX0KLSAgICAgICsrUFJPRklMRV9NT0RFTF9UQUtFTl9DT1VOVCAocCk7Ci0gICAgfQotICBlbHNlCi0gICAgKytQUk9GSUxFX01PREVMX1VOVEFLRU5fQ09VTlQgKHApOwotCi0gIHJldHVybiBjeWNsZXM7Ci19Ci0KLWludAotZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAotCQkJICAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICAgSU5UIGluX1JqLCBJTlQgb3V0X1JpKQotewotICBNT0RFTF9GUjMwXzFfREFUQSAqZCA9IENQVV9NT0RFTF9EQVRBIChjcHUpOwotICBpbnQgY3ljbGVzID0gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci0gIGQtPmxvYWRfcmVnc19wZW5kaW5nIHw9IDEgPDwgb3V0X1JpOwotICBjeWNsZXMgKz0gY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBpbl9Saik7Ci0gIHJldHVybiBjeWNsZXM7Ci19Ci0KLWludAotZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCwKLQkJCSAgICAgSU5UIGluX1JpLCBJTlQgaW5fUmopCi17Ci0gIGludCBjeWNsZXMgPSBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKLSAgY3ljbGVzICs9IGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgaW5fUmkpOwotICBjeWNsZXMgKz0gY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBpbl9Saik7Ci0gIHJldHVybiBjeWNsZXM7Ci19Ci0KLWludAotZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xkbSAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHJlZ2xpc3QpCi17Ci0gIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKLX0KLQotaW50Ci1mcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RtIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICBJTlQgcmVnbGlzdCkKLXsKLSAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOwotfQotCi0jZW5kaWYgLyogV0lUSF9QUk9GSUxFX01PREVMX1AgKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL21sb29wLmluIGIvc2ltL2ZyMzAvbWxvb3AuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODJkODMuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvbWxvb3AuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotIyBTaW11bGF0b3IgbWFpbiBsb29wIGZvciBmcjMwLiAtKi0gQyAtKi0KLSMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgU3ludGF4OgotIyAvYmluL3NoIG1haW5sb29wLmluIGNvbW1hbmQKLSMKLSMgQ29tbWFuZCBpcyBvbmUgb2Y6Ci0jCi0jIGluaXQKLSMgc3VwcG9ydAotIyBleHRyYWN0LXtzaW1wbGUsc2NhY2hlLHBiYn0KLSMge2Z1bGwsZmFzdH0tZXhlYy17c2ltcGxlLHNjYWNoZSxwYmJ9Ci0jCi0jIEEgdGFyZ2V0IG5lZWQgb25seSBwcm92aWRlIGEgImZ1bGwiIHZlcnNpb24gb2Ygb25lIG9mIHNpbXBsZSxzY2FjaGUscGJiLgotIyBJZiB0aGUgdGFyZ2V0IHdhbnRzIGl0IGNhbiBhbHNvIHByb3ZpZGUgYSBmYXN0IHZlcnNpb24gb2Ygc2FtZS4KLSMgSXQgY2FuJ3QgcHJvdmlkZSBtb3JlIHRoYW4gdGhpcywgaG93ZXZlciBmb3IgaWxsdXN0cmF0aW9uJ3Mgc2FrZSB0aGUgRlIzMAotIyBwb3J0IHByb3ZpZGVzIGV4YW1wbGVzIG9mIGFsbC4KLQotIyA/Pz8gQWZ0ZXIgYSBmZXcgbW9yZSBwb3J0cyBhcmUgZG9uZSwgcmV2aXNpdC4KLSMgV2lsbCBldmVudHVhbGx5IG5lZWQgdG8gbWFjaGluZSBnZW5lcmF0ZSBhIGxvdCBvZiB0aGlzLgotCi1jYXNlICJ4JDEiIGluCi0KLXhzdXBwb3J0KQotCi1jYXQgPDxFT0YKLQotc3RhdGljIElOTElORSBjb25zdCBJREVTQyAqCi1leHRyYWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBDR0VOX0lOU05fSU5UIGluc24sIEFSR0JVRiAqYWJ1ZiwKLSAgICAgICAgIGludCBmYXN0X3ApCi17Ci0gIGNvbnN0IElERVNDICppZCA9IEBjcHVAX2RlY29kZSAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBhYnVmKTsKLSAgQGNwdUBfZmlsbF9hcmdidWYgKGN1cnJlbnRfY3B1LCBhYnVmLCBpZCwgcGMsIGZhc3RfcCk7Ci0gIGlmICghIGZhc3RfcCkKLSAgICB7Ci0gICAgICBpbnQgdHJhY2VfcCA9IFBDX0lOX1RSQUNFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBpbnQgcHJvZmlsZV9wID0gUENfSU5fUFJPRklMRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgQGNwdUBfZmlsbF9hcmdidWZfdHAgKGN1cnJlbnRfY3B1LCBhYnVmLCB0cmFjZV9wLCBwcm9maWxlX3ApOwotICAgIH0KLSAgcmV0dXJuIGlkOwotfQotCi1zdGF0aWMgSU5MSU5FIFNFTV9QQwotZXhlY3V0ZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNDQUNIRSAqc2MsIGludCBmYXN0X3ApCi17Ci0gIFNFTV9QQyB2cGM7Ci0KLSAgaWYgKGZhc3RfcCkKLSAgICB7Ci0jaWYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAotI2lmIFdJVEhfU0NBQ0hFCi0gICAgICB2cGMgPSAoKnNjLT5hcmdidWYuc2VtYW50aWMuc2VtX2Zhc3QpIChjdXJyZW50X2NwdSwgc2MpOwotI2Vsc2UKLSAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZmFzdCkgKGN1cnJlbnRfY3B1LCAmc2MtPmFyZ2J1Zik7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZiAvKiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCi0gICAgICBBUkdCVUYgKmFidWYgPSAmc2MtPmFyZ2J1ZjsKLSAgICAgIGNvbnN0IElERVNDICppZGVzYyA9IGFidWYtPmlkZXNjOwotI2lmIFdJVEhfU0NBQ0hFX1BCQgotICAgICAgaW50IHZpcnR1YWxfcCA9IENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgaWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fVklSVFVBTCk7Ci0jZWxzZQotICAgICAgaW50IHZpcnR1YWxfcCA9IDA7Ci0jZW5kaWYKLQotICAgICAgaWYgKCEgdmlydHVhbF9wKQotCXsKLQkgIC8qIEZJWE1FOiBjYWxsIHgtYmVmb3JlICovCi0JICBpZiAoQVJHQlVGX1BST0ZJTEVfUCAoYWJ1ZikpCi0JICAgIFBST0ZJTEVfQ09VTlRfSU5TTiAoY3VycmVudF9jcHUsIGFidWYtPmFkZHIsIGlkZXNjLT5udW0pOwotCSAgLyogRklYTUU6IExhdGVyIG1ha2UgY292ZXIgbWFjcm9zOiBQUk9GSUxFX0lOU05fe0lOSVQsRklOSX0uICAqLwotCSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpCi0JICAgICAgJiYgQVJHQlVGX1BST0ZJTEVfUCAoYWJ1ZikpCi0JICAgIEBjcHVAX21vZGVsX2luc25fYmVmb3JlIChjdXJyZW50X2NwdSwgMSAvKmZpcnN0X3AqLyk7Ci0JICBUUkFDRV9JTlNOX0lOSVQgKGN1cnJlbnRfY3B1LCBhYnVmLCAxKTsKLQkgIFRSQUNFX0lOU04gKGN1cnJlbnRfY3B1LCBpZGVzYy0+aWRhdGEsCi0JCSAgICAgIChjb25zdCBzdHJ1Y3QgYXJnYnVmICopIGFidWYsIGFidWYtPmFkZHIpOwotCX0KLSNpZiBXSVRIX1NDQUNIRQotICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIHNjKTsKLSNlbHNlCi0gICAgICB2cGMgPSAoKnNjLT5hcmdidWYuc2VtYW50aWMuc2VtX2Z1bGwpIChjdXJyZW50X2NwdSwgYWJ1Zik7Ci0jZW5kaWYKLSAgICAgIGlmICghIHZpcnR1YWxfcCkKLQl7Ci0JICAvKiBGSVhNRTogY2FsbCB4LWFmdGVyICovCi0JICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkKLQkgICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKLQkgICAgewotCSAgICAgIGludCBjeWNsZXM7Ci0KLQkgICAgICBjeWNsZXMgPSAoKmlkZXNjLT50aW1pbmctPm1vZGVsX2ZuKSAoY3VycmVudF9jcHUsIHNjKTsKLQkgICAgICBAY3B1QF9tb2RlbF9pbnNuX2FmdGVyIChjdXJyZW50X2NwdSwgMSAvKmxhc3RfcCovLCBjeWNsZXMpOwotCSAgICB9Ci0JICBUUkFDRV9JTlNOX0ZJTkkgKGN1cnJlbnRfY3B1LCBhYnVmLCAxKTsKLQl9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogV0lUSF9TRU1fU1dJVENIX0ZVTEwgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHZwYzsKLX0KLQotRU9GCi0KLTs7Ci0KLXhpbml0KQotCi1jYXQgPDxFT0YKLS8qeHh4aW5pdCovCi1FT0YKLQotOzsKLQoteGV4dHJhY3Qtc2ltcGxlIHwgeGV4dHJhY3Qtc2NhY2hlKQotCi0jIElucHV0czogIGN1cnJlbnRfY3B1LCB2cGMsIHNjLCBGQVNUX1AKLSMgT3V0cHV0czogc2MgZmlsbGVkIGluCi0KLWNhdCA8PEVPRgotewotICBDR0VOX0lOU05fSU5UIGluc24gPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgdnBjKTsKLSAgZXh0cmFjdCAoY3VycmVudF9jcHUsIHZwYywgaW5zbiwgU0VNX0FSR0JVRiAoc2MpLCBGQVNUX1ApOwotfQotRU9GCi0KLTs7Ci0KLXhleHRyYWN0LXBiYikKLQotIyBJbnB1dHM6ICBjdXJyZW50X2NwdSwgcGMsIHNjLCBtYXhfaW5zbnMsIEZBU1RfUAotIyBPdXRwdXRzOiBzYywgcGMKLSMgc2MgbXVzdCBiZSBsZWZ0IHBvaW50aW5nIHBhc3QgdGhlIGxhc3QgY3JlYXRlZCBlbnRyeS4KLSMgcGMgbXVzdCBiZSBsZWZ0IHBvaW50aW5nIHBhc3QgdGhlIGxhc3QgY3JlYXRlZCBlbnRyeS4KLSMgSWYgdGhlIHBiYiBpcyB0ZXJtaW5hdGVkIGJ5IGEgY3RpIGluc24sIFNFVF9DVElfVlBDKHNjKSBtdXN0IGJlIGNhbGxlZAotIyB0byByZWNvcmQgdGhlIHZwYyBvZiB0aGUgY3RpIGluc24uCi0jIFNFVF9JTlNOX0NPVU5UKG4pIG11c3QgYmUgY2FsbGVkIHRvIHJlY29yZCBudW1iZXIgb2YgcmVhbCBpbnNucy4KLQotY2F0IDw8RU9GCi17Ci0gIGNvbnN0IElERVNDICppZGVzYzsKLSAgaW50IGljb3VudCA9IDA7Ci0KLSAgd2hpbGUgKG1heF9pbnNucyA+IDApCi0gICAgewotICAgICAgVUhJIGluc24gPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgaWRlc2MgPSBleHRyYWN0IChjdXJyZW50X2NwdSwgcGMsIGluc24sICZzYy0+YXJnYnVmLCBGQVNUX1ApOwotICAgICAgKytzYzsKLSAgICAgIC0tbWF4X2luc25zOwotICAgICAgKytpY291bnQ7Ci0gICAgICBwYyArPSBpZGVzYy0+bGVuZ3RoOwotICAgICAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCi0JewotCSAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0KLQkgIC8qIERlbGF5IHNsb3Q/ICovCi0JICAvKiA/Pz8gYnJlYWtwb2ludHMgaW4gZGVsYXkgc2xvdHMgKi8KLQkgIGlmIChDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGlkZXNjLT5hdHRycywgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpKQotCSAgICB7Ci0JICAgICAgVUhJIGluc24gPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMpOwotCSAgICAgIGlkZXNjID0gZXh0cmFjdCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKLQkgICAgICBpZiAoQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBpZGVzYy0+YXR0cnMsIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCkpCi0JCXsKLQkJICAvKiBtYWxmb3JtZWQgcHJvZ3JhbSAqLwotCQkgIHNpbV9pb19lcHJpbnRmIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwKLQkJCQkgICJtYWxmb3JtZWQgcHJvZ3JhbSwgXGAlcycgaW5zbiBpbiBkZWxheSBzbG90XG4iLAotCQkJCSAgQ0dFTl9JTlNOX05BTUUgKGlkZXNjLT5pZGF0YSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKytzYzsKLQkJICAtLW1heF9pbnNuczsKLQkJICArK2ljb3VudDsKLQkJICBwYyArPSBpZGVzYy0+bGVuZ3RoOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSBGaW5pc2g6Ci0gIFNFVF9JTlNOX0NPVU5UIChpY291bnQpOwotfQotRU9GCi0KLTs7Ci0KLXhmdWxsLWV4ZWMtKiB8IHhmYXN0LWV4ZWMtKikKLQotIyBJbnB1dHM6IGN1cnJlbnRfY3B1LCBzYywgRkFTVF9QCi0jIE91dHB1dHM6IHZwYwotIyB2cGMgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zbiB0byBleGVjdXRlCi0KLWNhdCA8PEVPRgotewotI2lmICghIEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCkgfHwgKEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCkKLSNkZWZpbmUgREVGSU5FX1NXSVRDSAotI2luY2x1ZGUgInNlbS1zd2l0Y2guYyIKLSNlbHNlCi0gIHZwYyA9IGV4ZWN1dGUgKGN1cnJlbnRfY3B1LCB2cGMsIEZBU1RfUCk7Ci0jZW5kaWYKLX0KLUVPRgotCi07OwotCi0qKQotICBlY2hvICJJbnZhbGlkIGFyZ3VtZW50IHRvIG1haW5sb29wLmluOiAkMSIgPiYyCi0gIGV4aXQgMQotICA7OwotCi1lc2FjCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9tb2RlbC5jIGIvc2ltL2ZyMzAvbW9kZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllNjkwMS4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9tb2RlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAwNCArMCwwIEBACi0vKiBTaW11bGF0b3IgbW9kZWwgc3VwcG9ydCBmb3IgZnIzMGJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jZGVmaW5lIFdBTlRfQ1BVIGZyMzBiZgotI2RlZmluZSBXQU5UX0NQVV9GUjMwQkYKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLS8qIFRoZSBwcm9maWxpbmcgZGF0YSBpcyByZWNvcmRlZCBoZXJlLCBidXQgaXMgYWNjZXNzZWQgdmlhIHRoZSBwcm9maWxpbmcKLSAgIG1lY2hhbmlzbS4gIEFmdGVyIGFsbCwgdGhpcyBpcyBpbmZvcm1hdGlvbiBmb3IgcHJvZmlsaW5nLiAgKi8KLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0KLS8qIE1vZGVsIGhhbmRsZXJzIGZvciBlYWNoIGluc24uICAqLwotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYWRkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYWRkaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYWRkMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYWRkYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2FkZG4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9hZGRuaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYWRkbjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N1YmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdWJuIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfY21wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2NtcGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfY21wMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9hbmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9vciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2VvciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2FuZG0gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYW5kaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9hbmRiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX29ybSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9vcmggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfb3JiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2Vvcm0gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZW9yaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9lb3JiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JhbmRsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYm9ybCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2Jlb3JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmFuZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9ib3JoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmVvcmggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9idHN0bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2J0c3RoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbXVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX211bHUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbXVsaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9tdWx1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kaXYwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2RpdjB1IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kaXYxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kaXYyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kaXYzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kaXY0cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbHNsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xzbGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sc2wyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbHNyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xzcmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sc3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYXNyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2FzcmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9hc3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbGRpOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZGk4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkaTIwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTIwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkaTMyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTMyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHIxMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbGRyMTN1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbGRyMTN1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbGRyMTQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHIxNHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE0dWguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHIxNHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE0dWIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZHIxNSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkcjE1Z3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTVnci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkcjE1ZHIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTVkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfbGRyMTVwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfc3RiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdHIxMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfc3RyMTNoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdHIxM2IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgaW5fUmogPSBGTEQgKGluX1JqKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0cjE0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfc3RyMTRoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE0aC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0cjE0YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNGIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdHIxNSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0cjE1Z3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTVnci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0cjE1ZHIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTVkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdHIxNXBzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZHNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX21vdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JqID0gRkxEIChpbl9Saik7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX21vdmRyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdmRyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX21vdnBzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdmRyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX21vdjJkciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX21vdjJwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2ptcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9qbXBkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2NhbGxyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2NhbGxyZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9jYWxsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfY2FsbGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9yZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9yZXRfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2ludCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9pbnQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9pbnRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9yZXRpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9icmFkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYnJhIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYm5vZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JubyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JlcWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JlcSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYm5lZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYm5lIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9iY2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9ibmNkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9ibmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYm4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JwZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYnAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2J2ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYnYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JudmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JudiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmx0ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmx0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9iZ2VkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9iZ2UgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JsZWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDQpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JsZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgNCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmd0ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgNCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYmd0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCA0KSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9ibHNkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9ibHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JoaWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2JoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZG1vdnIxMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZG1vdnIxM2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92cjEzYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2Rtb3ZyMTNwaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92cjEzcGloIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92cjEzcGliIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92cjE1cGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxNXBpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZG1vdjJyMTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92MnIxM2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZG1vdjJyMTNiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2Rtb3YycjEzcGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZG1vdjJyMTNwaWggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpaC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2Rtb3YycjEzcGliIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9kbW92MnIxNXBkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTVwaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkcmVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9zdHJlcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfY29wb3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2NvcGxkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9jb3BzdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfY29wc3YgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX25vcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfYW5kY2NyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2ludC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX29yY2NyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2ludC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0aWxtIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2ludC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2FkZHNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZHNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZXh0c2IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2V4dHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaSA9IC0xOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9leHRzaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfZXh0dWggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGluX1JpID0gRkxEIChpbl9SaSk7Ci0gICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xkbTAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3JlZ2xpc3QgPSAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbGRtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9sZG0xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkbTEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9yZWdsaXN0ID0gMDsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xkbSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9yZWdsaXN0KTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfc3RtMCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdG0wLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fcmVnbGlzdCA9IDA7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG0gKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fcmVnbGlzdCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX3N0bTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RtMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3JlZ2xpc3QgPSAwOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2ZyMzBfMV9lbnRlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbnRlci5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgSU5UIG91dF9SaSA9IC0xOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfZnIzMF8xX2xlYXZlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VudGVyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fUmkgPSAtMTsKLSAgICBJTlQgaW5fUmogPSAtMTsKLSAgICBJTlQgb3V0X1JpID0gLTE7Ci0gICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9mcjMwXzFfeGNoYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9SaiA9IC0xOwotICAgIElOVCBvdXRfUmkgPSAtMTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX1JpID0gLTE7Ci0gICAgSU5UIGluX1JqID0gLTE7Ci0gICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKLSAgICBpbl9SaiA9IEZMRCAoaW5fUmopOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi0vKiBXZSBhc3N1bWUgVU5JVF9OT05FID09IDAgYmVjYXVzZSB0aGUgdGFibGVzIGRvbid0IGFsd2F5cyB0ZXJtaW5hdGUKLSAgIGVudHJpZXMgd2l0aCBpdC4gICovCi0KLS8qIE1vZGVsIHRpbWluZyBkYXRhIGZvciBgZnIzMC0xJy4gICovCi0KLXN0YXRpYyBjb25zdCBJTlNOX1RJTUlORyBmcjMwXzFfdGltaW5nW10gPSB7Ci0gIHsgRlIzMEJGX0lOU05fWF9JTlZBTElELCAwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1hfQUZURVIsIDAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fWF9CRUZPUkUsIDAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fWF9DVElfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fWF9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9YX0JFR0lOLCAwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0FERCwgbW9kZWxfZnIzMF8xX2FkZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BRERJLCBtb2RlbF9mcjMwXzFfYWRkaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BREQyLCBtb2RlbF9mcjMwXzFfYWRkMiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BRERDLCBtb2RlbF9mcjMwXzFfYWRkYywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BREROLCBtb2RlbF9mcjMwXzFfYWRkbiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BREROSSwgbW9kZWxfZnIzMF8xX2FkZG5pLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0FERE4yLCBtb2RlbF9mcjMwXzFfYWRkbjIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1VCLCBtb2RlbF9mcjMwXzFfc3ViLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NVQkMsIG1vZGVsX2ZyMzBfMV9zdWJjLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NVQk4sIG1vZGVsX2ZyMzBfMV9zdWJuLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0NNUCwgbW9kZWxfZnIzMF8xX2NtcCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9DTVBJLCBtb2RlbF9mcjMwXzFfY21waSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9DTVAyLCBtb2RlbF9mcjMwXzFfY21wMiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BTkQsIG1vZGVsX2ZyMzBfMV9hbmQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fT1IsIG1vZGVsX2ZyMzBfMV9vciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9FT1IsIG1vZGVsX2ZyMzBfMV9lb3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQU5ETSwgbW9kZWxfZnIzMF8xX2FuZG0sIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0FOREgsIG1vZGVsX2ZyMzBfMV9hbmRoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BTkRCLCBtb2RlbF9mcjMwXzFfYW5kYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fT1JNLCBtb2RlbF9mcjMwXzFfb3JtLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9PUkgsIG1vZGVsX2ZyMzBfMV9vcmgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX09SQiwgbW9kZWxfZnIzMF8xX29yYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fRU9STSwgbW9kZWxfZnIzMF8xX2Vvcm0sIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0VPUkgsIG1vZGVsX2ZyMzBfMV9lb3JoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9FT1JCLCBtb2RlbF9mcjMwXzFfZW9yYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkFOREwsIG1vZGVsX2ZyMzBfMV9iYW5kbCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQk9STCwgbW9kZWxfZnIzMF8xX2JvcmwsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JFT1JMLCBtb2RlbF9mcjMwXzFfYmVvcmwsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JBTkRILCBtb2RlbF9mcjMwXzFfYmFuZGgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JPUkgsIG1vZGVsX2ZyMzBfMV9ib3JoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CRU9SSCwgbW9kZWxfZnIzMF8xX2Jlb3JoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CVFNUTCwgbW9kZWxfZnIzMF8xX2J0c3RsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAyIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JUU1RILCBtb2RlbF9mcjMwXzFfYnRzdGgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDIgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTVVMLCBtb2RlbF9mcjMwXzFfbXVsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCA1IH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX01VTFUsIG1vZGVsX2ZyMzBfMV9tdWx1LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCA1IH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX01VTEgsIG1vZGVsX2ZyMzBfMV9tdWxoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAzIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX01VTFVILCBtb2RlbF9mcjMwXzFfbXVsdWgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDMgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fRElWMFMsIG1vZGVsX2ZyMzBfMV9kaXYwcywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ESVYwVSwgbW9kZWxfZnIzMF8xX2RpdjB1LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RJVjEsIG1vZGVsX2ZyMzBfMV9kaXYxLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RJVjIsIG1vZGVsX2ZyMzBfMV9kaXYyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RJVjMsIG1vZGVsX2ZyMzBfMV9kaXYzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RJVjRTLCBtb2RlbF9mcjMwXzFfZGl2NHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTFNMLCBtb2RlbF9mcjMwXzFfbHNsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xTTEksIG1vZGVsX2ZyMzBfMV9sc2xpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xTTDIsIG1vZGVsX2ZyMzBfMV9sc2wyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xTUiwgbW9kZWxfZnIzMF8xX2xzciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MU1JJLCBtb2RlbF9mcjMwXzFfbHNyaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MU1IyLCBtb2RlbF9mcjMwXzFfbHNyMiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BU1IsIG1vZGVsX2ZyMzBfMV9hc3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQVNSSSwgbW9kZWxfZnIzMF8xX2FzcmksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQVNSMiwgbW9kZWxfZnIzMF8xX2FzcjIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERJOCwgbW9kZWxfZnIzMF8xX2xkaTgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERJMjAsIG1vZGVsX2ZyMzBfMV9sZGkyMCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMiB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MREkzMiwgbW9kZWxfZnIzMF8xX2xkaTMyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAzIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xELCBtb2RlbF9mcjMwXzFfbGQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERVSCwgbW9kZWxfZnIzMF8xX2xkdWgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERVQiwgbW9kZWxfZnIzMF8xX2xkdWIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTMsIG1vZGVsX2ZyMzBfMV9sZHIxMywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxM1VILCBtb2RlbF9mcjMwXzFfbGRyMTN1aCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxM1VCLCBtb2RlbF9mcjMwXzFfbGRyMTN1YiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxNCwgbW9kZWxfZnIzMF8xX2xkcjE0LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjE0VUgsIG1vZGVsX2ZyMzBfMV9sZHIxNHVoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjE0VUIsIG1vZGVsX2ZyMzBfMV9sZHIxNHViLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjE1LCBtb2RlbF9mcjMwXzFfbGRyMTUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTVHUiwgbW9kZWxfZnIzMF8xX2xkcjE1Z3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTVEUiwgbW9kZWxfZnIzMF8xX2xkcjE1ZHIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTVQUywgbW9kZWxfZnIzMF8xX2xkcjE1cHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1QsIG1vZGVsX2ZyMzBfMV9zdCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RILCBtb2RlbF9mcjMwXzFfc3RoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9TVEIsIG1vZGVsX2ZyMzBfMV9zdGIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjEzLCBtb2RlbF9mcjMwXzFfc3RyMTMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjEzSCwgbW9kZWxfZnIzMF8xX3N0cjEzaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTNCLCBtb2RlbF9mcjMwXzFfc3RyMTNiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxNCwgbW9kZWxfZnIzMF8xX3N0cjE0LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxNEgsIG1vZGVsX2ZyMzBfMV9zdHIxNGgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjE0QiwgbW9kZWxfZnIzMF8xX3N0cjE0YiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTUsIG1vZGVsX2ZyMzBfMV9zdHIxNSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTVHUiwgbW9kZWxfZnIzMF8xX3N0cjE1Z3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjE1RFIsIG1vZGVsX2ZyMzBfMV9zdHIxNWRyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxNVBTLCBtb2RlbF9mcjMwXzFfc3RyMTVwcywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WLCBtb2RlbF9mcjMwXzFfbW92LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX01PVkRSLCBtb2RlbF9mcjMwXzFfbW92ZHIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WUFMsIG1vZGVsX2ZyMzBfMV9tb3ZwcywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9NT1YyRFIsIG1vZGVsX2ZyMzBfMV9tb3YyZHIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WMlBTLCBtb2RlbF9mcjMwXzFfbW92MnBzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0pNUCwgbW9kZWxfZnIzMF8xX2ptcCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0pNUEQsIG1vZGVsX2ZyMzBfMV9qbXBkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQ0FMTFIsIG1vZGVsX2ZyMzBfMV9jYWxsciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0NBTExSRCwgbW9kZWxfZnIzMF8xX2NhbGxyZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0NBTEwsIG1vZGVsX2ZyMzBfMV9jYWxsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQ0FMTEQsIG1vZGVsX2ZyMzBfMV9jYWxsZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1JFVCwgbW9kZWxfZnIzMF8xX3JldCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1JFVF9ELCBtb2RlbF9mcjMwXzFfcmV0X2QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9JTlQsIG1vZGVsX2ZyMzBfMV9pbnQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDYgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fSU5URSwgbW9kZWxfZnIzMF8xX2ludGUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDYgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fUkVUSSwgbW9kZWxfZnIzMF8xX3JldGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDQgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQlJBRCwgbW9kZWxfZnIzMF8xX2JyYWQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CUkEsIG1vZGVsX2ZyMzBfMV9icmEsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTk9ELCBtb2RlbF9mcjMwXzFfYm5vZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JOTywgbW9kZWxfZnIzMF8xX2JubywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JFUUQsIG1vZGVsX2ZyMzBfMV9iZXFkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkVRLCBtb2RlbF9mcjMwXzFfYmVxLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQk5FRCwgbW9kZWxfZnIzMF8xX2JuZWQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTkUsIG1vZGVsX2ZyMzBfMV9ibmUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CQ0QsIG1vZGVsX2ZyMzBfMV9iY2QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CQywgbW9kZWxfZnIzMF8xX2JjLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQk5DRCwgbW9kZWxfZnIzMF8xX2JuY2QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTkMsIG1vZGVsX2ZyMzBfMV9ibmMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTkQsIG1vZGVsX2ZyMzBfMV9ibmQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTiwgbW9kZWxfZnIzMF8xX2JuLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQlBELCBtb2RlbF9mcjMwXzFfYnBkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQlAsIG1vZGVsX2ZyMzBfMV9icCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JWRCwgbW9kZWxfZnIzMF8xX2J2ZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JWLCBtb2RlbF9mcjMwXzFfYnYsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTlZELCBtb2RlbF9mcjMwXzFfYm52ZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JOViwgbW9kZWxfZnIzMF8xX2JudiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JMVEQsIG1vZGVsX2ZyMzBfMV9ibHRkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkxULCBtb2RlbF9mcjMwXzFfYmx0LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkdFRCwgbW9kZWxfZnIzMF8xX2JnZWQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CR0UsIG1vZGVsX2ZyMzBfMV9iZ2UsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTEVELCBtb2RlbF9mcjMwXzFfYmxlZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JMRSwgbW9kZWxfZnIzMF8xX2JsZSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JHVEQsIG1vZGVsX2ZyMzBfMV9iZ3RkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkdULCBtb2RlbF9mcjMwXzFfYmd0LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQkxTRCwgbW9kZWxfZnIzMF8xX2Jsc2QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CTFMsIG1vZGVsX2ZyMzBfMV9ibHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9CSElELCBtb2RlbF9mcjMwXzFfYmhpZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0JISSwgbW9kZWxfZnIzMF8xX2JoaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTMsIG1vZGVsX2ZyMzBfMV9kbW92cjEzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzSCwgbW9kZWxfZnIzMF8xX2Rtb3ZyMTNoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzQiwgbW9kZWxfZnIzMF8xX2Rtb3ZyMTNiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzUEksIG1vZGVsX2ZyMzBfMV9kbW92cjEzcGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUgsIG1vZGVsX2ZyMzBfMV9kbW92cjEzcGloLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzUElCLCBtb2RlbF9mcjMwXzFfZG1vdnIxM3BpYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVlIxNVBJLCBtb2RlbF9mcjMwXzFfZG1vdnIxNXBpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxMywgbW9kZWxfZnIzMF8xX2Rtb3YycjEzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzSCwgbW9kZWxfZnIzMF8xX2Rtb3YycjEzaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM0IsIG1vZGVsX2ZyMzBfMV9kbW92MnIxM2IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNQSSwgbW9kZWxfZnIzMF8xX2Rtb3YycjEzcGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzUElILCBtb2RlbF9mcjMwXzFfZG1vdjJyMTNwaWgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzUElCLCBtb2RlbF9mcjMwXzFfZG1vdjJyMTNwaWIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjE1UEQsIG1vZGVsX2ZyMzBfMV9kbW92MnIxNXBkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFJFUywgbW9kZWxfZnIzMF8xX2xkcmVzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUkVTLCBtb2RlbF9mcjMwXzFfc3RyZXMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQ09QT1AsIG1vZGVsX2ZyMzBfMV9jb3BvcCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9DT1BMRCwgbW9kZWxfZnIzMF8xX2NvcGxkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0NPUFNULCBtb2RlbF9mcjMwXzFfY29wc3QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQ09QU1YsIG1vZGVsX2ZyMzBfMV9jb3BzdiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9OT1AsIG1vZGVsX2ZyMzBfMV9ub3AsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fQU5EQ0NSLCBtb2RlbF9mcjMwXzFfYW5kY2NyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX09SQ0NSLCBtb2RlbF9mcjMwXzFfb3JjY3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RJTE0sIG1vZGVsX2ZyMzBfMV9zdGlsbSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9BRERTUCwgbW9kZWxfZnIzMF8xX2FkZHNwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0VYVFNCLCBtb2RlbF9mcjMwXzFfZXh0c2IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fRVhUVUIsIG1vZGVsX2ZyMzBfMV9leHR1YiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9FWFRTSCwgbW9kZWxfZnIzMF8xX2V4dHNoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0VYVFVILCBtb2RlbF9mcjMwXzFfZXh0dWgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fTERNMCwgbW9kZWxfZnIzMF8xX2xkbTAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xETSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9MRE0xLCBtb2RlbF9mcjMwXzFfbGRtMSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTERNLCAxLCAxIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX1NUTTAsIG1vZGVsX2ZyMzBfMV9zdG0wLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE0sIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fU1RNMSwgbW9kZWxfZnIzMF8xX3N0bTEsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUTSwgMSwgMSB9IH0gfSwKLSAgeyBGUjMwQkZfSU5TTl9FTlRFUiwgbW9kZWxfZnIzMF8xX2VudGVyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAyIH0gfSB9LAotICB7IEZSMzBCRl9JTlNOX0xFQVZFLCBtb2RlbF9mcjMwXzFfbGVhdmUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgRlIzMEJGX0lOU05fWENIQiwgbW9kZWxfZnIzMF8xX3hjaGIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAotfTsKLQotI2VuZGlmIC8qIFdJVEhfUFJPRklMRV9NT0RFTF9QICovCi0KLXN0YXRpYyB2b2lkCi1mcjMwXzFfbW9kZWxfaW5pdCAoU0lNX0NQVSAqY3B1KQotewotICBDUFVfTU9ERUxfREFUQSAoY3B1KSA9ICh2b2lkICopIHphbGxvYyAoc2l6ZW9mIChNT0RFTF9GUjMwXzFfREFUQSkpOwotfQotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSNkZWZpbmUgVElNSU5HX0RBVEEodGQpIHRkCi0jZWxzZQotI2RlZmluZSBUSU1JTkdfREFUQSh0ZCkgMAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBNT0RFTCBmcjMwX21vZGVsc1tdID0KLXsKLSAgeyAiZnIzMC0xIiwgJiBmcjMwX21hY2gsIE1PREVMX0ZSMzBfMSwgVElNSU5HX0RBVEEgKCYgZnIzMF8xX3RpbWluZ1swXSksIGZyMzBfMV9tb2RlbF9pbml0IH0sCi0gIHsgMCB9Ci19OwotCi0vKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNwdSdzIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgZnIzMGJmX2ltcF9wcm9wZXJ0aWVzID0KLXsKLSAgc2l6ZW9mIChTSU1fQ1BVKSwKLSNpZiBXSVRIX1NDQUNIRQotICBzaXplb2YgKFNDQUNIRSkKLSNlbHNlCi0gIDAKLSNlbmRpZgotfTsKLQotCi1zdGF0aWMgdm9pZAotZnIzMGJmX3ByZXBhcmVfcnVuIChTSU1fQ1BVICpjcHUpCi17Ci0gIGlmIChDUFVfSURFU0MgKGNwdSkgPT0gTlVMTCkKLSAgICBmcjMwYmZfaW5pdF9pZGVzY190YWJsZSAoY3B1KTsKLX0KLQotc3RhdGljIGNvbnN0IENHRU5fSU5TTiAqCi1mcjMwYmZfZ2V0X2lkYXRhIChTSU1fQ1BVICpjcHUsIGludCBpbnVtKQotewotICByZXR1cm4gQ1BVX0lERVNDIChjcHUpIFtpbnVtXS5pZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLWZyMzBfaW5pdF9jcHUgKFNJTV9DUFUgKmNwdSkKLXsKLSAgQ1BVX1JFR19GRVRDSCAoY3B1KSA9IGZyMzBiZl9mZXRjaF9yZWdpc3RlcjsKLSAgQ1BVX1JFR19TVE9SRSAoY3B1KSA9IGZyMzBiZl9zdG9yZV9yZWdpc3RlcjsKLSAgQ1BVX1BDX0ZFVENIIChjcHUpID0gZnIzMGJmX2hfcGNfZ2V0OwotICBDUFVfUENfU1RPUkUgKGNwdSkgPSBmcjMwYmZfaF9wY19zZXQ7Ci0gIENQVV9HRVRfSURBVEEgKGNwdSkgPSBmcjMwYmZfZ2V0X2lkYXRhOwotICBDUFVfTUFYX0lOU05TIChjcHUpID0gRlIzMEJGX0lOU05fTUFYOwotICBDUFVfSU5TTl9OQU1FIChjcHUpID0gY2dlbl9pbnNuX25hbWU7Ci0gIENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KSA9IGZyMzBiZl9lbmdpbmVfcnVuX2Z1bGw7Ci0jaWYgV0lUSF9GQVNUCi0gIENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA9IGZyMzBiZl9lbmdpbmVfcnVuX2Zhc3Q7Ci0jZWxzZQotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBmcjMwYmZfZW5naW5lX3J1bl9mdWxsOwotI2VuZGlmCi19Ci0KLWNvbnN0IE1BQ0ggZnIzMF9tYWNoID0KLXsKLSAgImZyMzAiLCAiZnIzMCIsIE1BQ0hfRlIzMCwKLSAgMzIsIDMyLCAmIGZyMzBfbW9kZWxzWzBdLCAmIGZyMzBiZl9pbXBfcHJvcGVydGllcywKLSAgZnIzMF9pbml0X2NwdSwKLSAgZnIzMGJmX3ByZXBhcmVfcnVuCi19OwotCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9zZW0tc3dpdGNoLmMgYi9zaW0vZnIzMC9zZW0tc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDc3ZTUuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvc2VtLXN3aXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQwMSArMCwwIEBACi0vKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBmcjMwYmYuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZmRlZiBERUZJTkVfTEFCRUxTCi0KLSAgLyogVGhlIGxhYmVscyBoYXZlIHRoZSBjYXNlIHRoZXkgaGF2ZSBiZWNhdXNlIHRoZSBlbnVtIG9mIGluc24gdHlwZXMKLSAgICAgaXMgYWxsIHVwcGVyY2FzZSBhbmQgaW4gdGhlIG5vbi1zdGRjIGNhc2UgdGhlIGluc24gc3ltYm9sIGlzIGJ1aWx0Ci0gICAgIGludG8gdGhlIGVudW0gbmFtZS4gICovCi0KLSAgc3RhdGljIHN0cnVjdCB7Ci0gICAgaW50IGluZGV4OwotICAgIHZvaWQgKmxhYmVsOwotICB9IGxhYmVsc1tdID0gewotICAgIHsgRlIzMEJGX0lOU05fWF9JTlZBTElELCAmJiBjYXNlX3NlbV9JTlNOX1hfSU5WQUxJRCB9LAotICAgIHsgRlIzMEJGX0lOU05fWF9BRlRFUiwgJiYgY2FzZV9zZW1fSU5TTl9YX0FGVEVSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9YX0JFRk9SRSwgJiYgY2FzZV9zZW1fSU5TTl9YX0JFRk9SRSB9LAotICAgIHsgRlIzMEJGX0lOU05fWF9DVElfQ0hBSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9DVElfQ0hBSU4gfSwKLSAgICB7IEZSMzBCRl9JTlNOX1hfQ0hBSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9DSEFJTiB9LAotICAgIHsgRlIzMEJGX0lOU05fWF9CRUdJTiwgJiYgY2FzZV9zZW1fSU5TTl9YX0JFR0lOIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BREQsICYmIGNhc2Vfc2VtX0lOU05fQUREIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BRERJLCAmJiBjYXNlX3NlbV9JTlNOX0FEREkgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0FERDIsICYmIGNhc2Vfc2VtX0lOU05fQUREMiB9LAotICAgIHsgRlIzMEJGX0lOU05fQUREQywgJiYgY2FzZV9zZW1fSU5TTl9BRERDIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BREROLCAmJiBjYXNlX3NlbV9JTlNOX0FERE4gfSwKLSAgICB7IEZSMzBCRl9JTlNOX0FERE5JLCAmJiBjYXNlX3NlbV9JTlNOX0FERE5JIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BREROMiwgJiYgY2FzZV9zZW1fSU5TTl9BREROMiB9LAotICAgIHsgRlIzMEJGX0lOU05fU1VCLCAmJiBjYXNlX3NlbV9JTlNOX1NVQiB9LAotICAgIHsgRlIzMEJGX0lOU05fU1VCQywgJiYgY2FzZV9zZW1fSU5TTl9TVUJDIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVUJOLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk4gfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NNUCwgJiYgY2FzZV9zZW1fSU5TTl9DTVAgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NNUEksICYmIGNhc2Vfc2VtX0lOU05fQ01QSSB9LAotICAgIHsgRlIzMEJGX0lOU05fQ01QMiwgJiYgY2FzZV9zZW1fSU5TTl9DTVAyIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BTkQsICYmIGNhc2Vfc2VtX0lOU05fQU5EIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9PUiwgJiYgY2FzZV9zZW1fSU5TTl9PUiB9LAotICAgIHsgRlIzMEJGX0lOU05fRU9SLCAmJiBjYXNlX3NlbV9JTlNOX0VPUiB9LAotICAgIHsgRlIzMEJGX0lOU05fQU5ETSwgJiYgY2FzZV9zZW1fSU5TTl9BTkRNIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BTkRILCAmJiBjYXNlX3NlbV9JTlNOX0FOREggfSwKLSAgICB7IEZSMzBCRl9JTlNOX0FOREIsICYmIGNhc2Vfc2VtX0lOU05fQU5EQiB9LAotICAgIHsgRlIzMEJGX0lOU05fT1JNLCAmJiBjYXNlX3NlbV9JTlNOX09STSB9LAotICAgIHsgRlIzMEJGX0lOU05fT1JILCAmJiBjYXNlX3NlbV9JTlNOX09SSCB9LAotICAgIHsgRlIzMEJGX0lOU05fT1JCLCAmJiBjYXNlX3NlbV9JTlNOX09SQiB9LAotICAgIHsgRlIzMEJGX0lOU05fRU9STSwgJiYgY2FzZV9zZW1fSU5TTl9FT1JNIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9FT1JILCAmJiBjYXNlX3NlbV9JTlNOX0VPUkggfSwKLSAgICB7IEZSMzBCRl9JTlNOX0VPUkIsICYmIGNhc2Vfc2VtX0lOU05fRU9SQiB9LAotICAgIHsgRlIzMEJGX0lOU05fQkFOREwsICYmIGNhc2Vfc2VtX0lOU05fQkFOREwgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JPUkwsICYmIGNhc2Vfc2VtX0lOU05fQk9STCB9LAotICAgIHsgRlIzMEJGX0lOU05fQkVPUkwsICYmIGNhc2Vfc2VtX0lOU05fQkVPUkwgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JBTkRILCAmJiBjYXNlX3NlbV9JTlNOX0JBTkRIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CT1JILCAmJiBjYXNlX3NlbV9JTlNOX0JPUkggfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JFT1JILCAmJiBjYXNlX3NlbV9JTlNOX0JFT1JIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CVFNUTCwgJiYgY2FzZV9zZW1fSU5TTl9CVFNUTCB9LAotICAgIHsgRlIzMEJGX0lOU05fQlRTVEgsICYmIGNhc2Vfc2VtX0lOU05fQlRTVEggfSwKLSAgICB7IEZSMzBCRl9JTlNOX01VTCwgJiYgY2FzZV9zZW1fSU5TTl9NVUwgfSwKLSAgICB7IEZSMzBCRl9JTlNOX01VTFUsICYmIGNhc2Vfc2VtX0lOU05fTVVMVSB9LAotICAgIHsgRlIzMEJGX0lOU05fTVVMSCwgJiYgY2FzZV9zZW1fSU5TTl9NVUxIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9NVUxVSCwgJiYgY2FzZV9zZW1fSU5TTl9NVUxVSCB9LAotICAgIHsgRlIzMEJGX0lOU05fRElWMFMsICYmIGNhc2Vfc2VtX0lOU05fRElWMFMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RJVjBVLCAmJiBjYXNlX3NlbV9JTlNOX0RJVjBVIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ESVYxLCAmJiBjYXNlX3NlbV9JTlNOX0RJVjEgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RJVjIsICYmIGNhc2Vfc2VtX0lOU05fRElWMiB9LAotICAgIHsgRlIzMEJGX0lOU05fRElWMywgJiYgY2FzZV9zZW1fSU5TTl9ESVYzIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ESVY0UywgJiYgY2FzZV9zZW1fSU5TTl9ESVY0UyB9LAotICAgIHsgRlIzMEJGX0lOU05fTFNMLCAmJiBjYXNlX3NlbV9JTlNOX0xTTCB9LAotICAgIHsgRlIzMEJGX0lOU05fTFNMSSwgJiYgY2FzZV9zZW1fSU5TTl9MU0xJIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MU0wyLCAmJiBjYXNlX3NlbV9JTlNOX0xTTDIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xTUiwgJiYgY2FzZV9zZW1fSU5TTl9MU1IgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xTUkksICYmIGNhc2Vfc2VtX0lOU05fTFNSSSB9LAotICAgIHsgRlIzMEJGX0lOU05fTFNSMiwgJiYgY2FzZV9zZW1fSU5TTl9MU1IyIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BU1IsICYmIGNhc2Vfc2VtX0lOU05fQVNSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BU1JJLCAmJiBjYXNlX3NlbV9JTlNOX0FTUkkgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0FTUjIsICYmIGNhc2Vfc2VtX0lOU05fQVNSMiB9LAotICAgIHsgRlIzMEJGX0lOU05fTERJOCwgJiYgY2FzZV9zZW1fSU5TTl9MREk4IH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MREkyMCwgJiYgY2FzZV9zZW1fSU5TTl9MREkyMCB9LAotICAgIHsgRlIzMEJGX0lOU05fTERJMzIsICYmIGNhc2Vfc2VtX0lOU05fTERJMzIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xELCAmJiBjYXNlX3NlbV9JTlNOX0xEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRFVILCAmJiBjYXNlX3NlbV9JTlNOX0xEVUggfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xEVUIsICYmIGNhc2Vfc2VtX0lOU05fTERVQiB9LAotICAgIHsgRlIzMEJGX0lOU05fTERSMTMsICYmIGNhc2Vfc2VtX0lOU05fTERSMTMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xEUjEzVUgsICYmIGNhc2Vfc2VtX0lOU05fTERSMTNVSCB9LAotICAgIHsgRlIzMEJGX0lOU05fTERSMTNVQiwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxM1VCIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRFIxNCwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNCB9LAotICAgIHsgRlIzMEJGX0lOU05fTERSMTRVSCwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNFVIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRFIxNFVCLCAmJiBjYXNlX3NlbV9JTlNOX0xEUjE0VUIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xEUjE1LCAmJiBjYXNlX3NlbV9JTlNOX0xEUjE1IH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRFIxNUdSLCAmJiBjYXNlX3NlbV9JTlNOX0xEUjE1R1IgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0xEUjE1RFIsICYmIGNhc2Vfc2VtX0lOU05fTERSMTVEUiB9LAotICAgIHsgRlIzMEJGX0lOU05fTERSMTVQUywgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNVBTIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVCwgJiYgY2FzZV9zZW1fSU5TTl9TVCB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RILCAmJiBjYXNlX3NlbV9JTlNOX1NUSCB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RCLCAmJiBjYXNlX3NlbV9JTlNOX1NUQiB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RSMTMsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX1NUUjEzSCwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxM0ggfSwKLSAgICB7IEZSMzBCRl9JTlNOX1NUUjEzQiwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxM0IgfSwKLSAgICB7IEZSMzBCRl9JTlNOX1NUUjE0LCAmJiBjYXNlX3NlbV9JTlNOX1NUUjE0IH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVFIxNEgsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTRIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVFIxNEIsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTRCIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVFIxNSwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxNSB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RSMTVHUiwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxNUdSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9TVFIxNURSLCAmJiBjYXNlX3NlbV9JTlNOX1NUUjE1RFIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX1NUUjE1UFMsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTVQUyB9LAotICAgIHsgRlIzMEJGX0lOU05fTU9WLCAmJiBjYXNlX3NlbV9JTlNOX01PViB9LAotICAgIHsgRlIzMEJGX0lOU05fTU9WRFIsICYmIGNhc2Vfc2VtX0lOU05fTU9WRFIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX01PVlBTLCAmJiBjYXNlX3NlbV9JTlNOX01PVlBTIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9NT1YyRFIsICYmIGNhc2Vfc2VtX0lOU05fTU9WMkRSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9NT1YyUFMsICYmIGNhc2Vfc2VtX0lOU05fTU9WMlBTIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9KTVAsICYmIGNhc2Vfc2VtX0lOU05fSk1QIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9KTVBELCAmJiBjYXNlX3NlbV9JTlNOX0pNUEQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NBTExSLCAmJiBjYXNlX3NlbV9JTlNOX0NBTExSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9DQUxMUkQsICYmIGNhc2Vfc2VtX0lOU05fQ0FMTFJEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9DQUxMLCAmJiBjYXNlX3NlbV9JTlNOX0NBTEwgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NBTExELCAmJiBjYXNlX3NlbV9JTlNOX0NBTExEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9SRVQsICYmIGNhc2Vfc2VtX0lOU05fUkVUIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9SRVRfRCwgJiYgY2FzZV9zZW1fSU5TTl9SRVRfRCB9LAotICAgIHsgRlIzMEJGX0lOU05fSU5ULCAmJiBjYXNlX3NlbV9JTlNOX0lOVCB9LAotICAgIHsgRlIzMEJGX0lOU05fSU5URSwgJiYgY2FzZV9zZW1fSU5TTl9JTlRFIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9SRVRJLCAmJiBjYXNlX3NlbV9JTlNOX1JFVEkgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JSQUQsICYmIGNhc2Vfc2VtX0lOU05fQlJBRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQlJBLCAmJiBjYXNlX3NlbV9JTlNOX0JSQSB9LAotICAgIHsgRlIzMEJGX0lOU05fQk5PRCwgJiYgY2FzZV9zZW1fSU5TTl9CTk9EIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CTk8sICYmIGNhc2Vfc2VtX0lOU05fQk5PIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CRVFELCAmJiBjYXNlX3NlbV9JTlNOX0JFUUQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JFUSwgJiYgY2FzZV9zZW1fSU5TTl9CRVEgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JORUQsICYmIGNhc2Vfc2VtX0lOU05fQk5FRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQk5FLCAmJiBjYXNlX3NlbV9JTlNOX0JORSB9LAotICAgIHsgRlIzMEJGX0lOU05fQkNELCAmJiBjYXNlX3NlbV9JTlNOX0JDRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQkMsICYmIGNhc2Vfc2VtX0lOU05fQkMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JOQ0QsICYmIGNhc2Vfc2VtX0lOU05fQk5DRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQk5DLCAmJiBjYXNlX3NlbV9JTlNOX0JOQyB9LAotICAgIHsgRlIzMEJGX0lOU05fQk5ELCAmJiBjYXNlX3NlbV9JTlNOX0JORCB9LAotICAgIHsgRlIzMEJGX0lOU05fQk4sICYmIGNhc2Vfc2VtX0lOU05fQk4gfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JQRCwgJiYgY2FzZV9zZW1fSU5TTl9CUEQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JQLCAmJiBjYXNlX3NlbV9JTlNOX0JQIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CVkQsICYmIGNhc2Vfc2VtX0lOU05fQlZEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CViwgJiYgY2FzZV9zZW1fSU5TTl9CViB9LAotICAgIHsgRlIzMEJGX0lOU05fQk5WRCwgJiYgY2FzZV9zZW1fSU5TTl9CTlZEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CTlYsICYmIGNhc2Vfc2VtX0lOU05fQk5WIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CTFRELCAmJiBjYXNlX3NlbV9JTlNOX0JMVEQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JMVCwgJiYgY2FzZV9zZW1fSU5TTl9CTFQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JHRUQsICYmIGNhc2Vfc2VtX0lOU05fQkdFRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQkdFLCAmJiBjYXNlX3NlbV9JTlNOX0JHRSB9LAotICAgIHsgRlIzMEJGX0lOU05fQkxFRCwgJiYgY2FzZV9zZW1fSU5TTl9CTEVEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CTEUsICYmIGNhc2Vfc2VtX0lOU05fQkxFIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CR1RELCAmJiBjYXNlX3NlbV9JTlNOX0JHVEQgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JHVCwgJiYgY2FzZV9zZW1fSU5TTl9CR1QgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0JMU0QsICYmIGNhc2Vfc2VtX0lOU05fQkxTRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQkxTLCAmJiBjYXNlX3NlbV9JTlNOX0JMUyB9LAotICAgIHsgRlIzMEJGX0lOU05fQkhJRCwgJiYgY2FzZV9zZW1fSU5TTl9CSElEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9CSEksICYmIGNhc2Vfc2VtX0lOU05fQkhJIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1ZSMTMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNILCAmJiBjYXNlX3NlbV9JTlNOX0RNT1ZSMTNIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzQiwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzQiB9LAotICAgIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1ZSMTNQSSB9LAotICAgIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJSCwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzUElIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzUElCLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1ZSMTNQSUIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTVQSSwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjE1UEkgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1YyUjEzIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM0gsICYmIGNhc2Vfc2VtX0lOU05fRE1PVjJSMTNIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM0IsICYmIGNhc2Vfc2VtX0lOU05fRE1PVjJSMTNCIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1YyUjEzUEkgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzUElILCAmJiBjYXNlX3NlbV9JTlNOX0RNT1YyUjEzUElIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJQiwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WMlIxM1BJQiB9LAotICAgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTVQRCwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WMlIxNVBEIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRFJFUywgJiYgY2FzZV9zZW1fSU5TTl9MRFJFUyB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RSRVMsICYmIGNhc2Vfc2VtX0lOU05fU1RSRVMgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NPUE9QLCAmJiBjYXNlX3NlbV9JTlNOX0NPUE9QIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9DT1BMRCwgJiYgY2FzZV9zZW1fSU5TTl9DT1BMRCB9LAotICAgIHsgRlIzMEJGX0lOU05fQ09QU1QsICYmIGNhc2Vfc2VtX0lOU05fQ09QU1QgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0NPUFNWLCAmJiBjYXNlX3NlbV9JTlNOX0NPUFNWIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9OT1AsICYmIGNhc2Vfc2VtX0lOU05fTk9QIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9BTkRDQ1IsICYmIGNhc2Vfc2VtX0lOU05fQU5EQ0NSIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9PUkNDUiwgJiYgY2FzZV9zZW1fSU5TTl9PUkNDUiB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RJTE0sICYmIGNhc2Vfc2VtX0lOU05fU1RJTE0gfSwKLSAgICB7IEZSMzBCRl9JTlNOX0FERFNQLCAmJiBjYXNlX3NlbV9JTlNOX0FERFNQIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9FWFRTQiwgJiYgY2FzZV9zZW1fSU5TTl9FWFRTQiB9LAotICAgIHsgRlIzMEJGX0lOU05fRVhUVUIsICYmIGNhc2Vfc2VtX0lOU05fRVhUVUIgfSwKLSAgICB7IEZSMzBCRl9JTlNOX0VYVFNILCAmJiBjYXNlX3NlbV9JTlNOX0VYVFNIIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9FWFRVSCwgJiYgY2FzZV9zZW1fSU5TTl9FWFRVSCB9LAotICAgIHsgRlIzMEJGX0lOU05fTERNMCwgJiYgY2FzZV9zZW1fSU5TTl9MRE0wIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9MRE0xLCAmJiBjYXNlX3NlbV9JTlNOX0xETTEgfSwKLSAgICB7IEZSMzBCRl9JTlNOX1NUTTAsICYmIGNhc2Vfc2VtX0lOU05fU1RNMCB9LAotICAgIHsgRlIzMEJGX0lOU05fU1RNMSwgJiYgY2FzZV9zZW1fSU5TTl9TVE0xIH0sCi0gICAgeyBGUjMwQkZfSU5TTl9FTlRFUiwgJiYgY2FzZV9zZW1fSU5TTl9FTlRFUiB9LAotICAgIHsgRlIzMEJGX0lOU05fTEVBVkUsICYmIGNhc2Vfc2VtX0lOU05fTEVBVkUgfSwKLSAgICB7IEZSMzBCRl9JTlNOX1hDSEIsICYmIGNhc2Vfc2VtX0lOU05fWENIQiB9LAotICAgIHsgMCwgMCB9Ci0gIH07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGxhYmVsc1tpXS5sYWJlbCAhPSAwOyArK2kpCi0gICAgewotI2lmIEZBU1RfUAotICAgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Zhc3RfbGFiID0gbGFiZWxzW2ldLmxhYmVsOwotI2Vsc2UKLSAgICAgIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtsYWJlbHNbaV0uaW5kZXhdLnNlbV9mdWxsX2xhYiA9IGxhYmVsc1tpXS5sYWJlbDsKLSNlbmRpZgotICAgIH0KLQotI3VuZGVmIERFRklORV9MQUJFTFMKLSNlbmRpZiAvKiBERUZJTkVfTEFCRUxTICovCi0KLSNpZmRlZiBERUZJTkVfU1dJVENICi0KLS8qIElmIGh5cGVyLWZhc3QgW3dlbGwgbm90IHVubmVjZXNzYXJpbHkgc2xvd10gZXhlY3V0aW9uIGlzIHNlbGVjdGVkLCB0dXJuCi0gICBvZmYgZnJpbGxzIGxpa2UgdHJhY2luZyBhbmQgcHJvZmlsaW5nLiAgKi8KLS8qIEZJWE1FOiBBIGJldHRlciB3YXkgd291bGQgYmUgdG8gaGF2ZSBUUkFDRV9SRVNVTFQgY2hlY2sgZm9yIHNvbWV0aGluZwotICAgdGhhdCBjYW4gY2F1c2UgaXQgdG8gYmUgb3B0aW1pemVkIG91dC4gIEFub3RoZXIgd2F5IHdvdWxkIGJlIHRvIGVtaXQKLSAgIHNwZWNpYWwgaGFuZGxlcnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gInN0cmVhbSIuICAqLwotCi0jaWYgRkFTVF9QCi0jdW5kZWYgVFJBQ0VfUkVTVUxUCi0jZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkKLSNlbmRpZgotCi0jdW5kZWYgR0VUX0FUVFIKLSNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQotCi17Ci0KLSNpZiBXSVRIX1NDQUNIRV9QQkIKLQotLyogQnJhbmNoIHRvIG5leHQgaGFuZGxlciB3aXRob3V0IGdvaW5nIGFyb3VuZCBtYWluIGxvb3AuICAqLwotI2RlZmluZSBORVhUKHZwYykgZ290byAqIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UKLVNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGICh2cGMpIC0+IHNlbWFudGljLnNlbV9jYXNlKQotCi0jZWxzZSAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0jZGVmaW5lIE5FWFQodnBjKSBCUkVBSyAoc2VtKQotI2lmZGVmIF9fR05VQ19fCi0jaWYgRkFTVF9QCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mYXN0X2xhYikKLSNlbHNlCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mdWxsX2xhYikKLSNlbmRpZgotI2Vsc2UKLSAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+bnVtKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0gICAgewotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0lOVkFMSUQpIDogLyogLS1pbnZhbGlkLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0gICAgLyogVXBkYXRlIHRoZSByZWNvcmRlZCBwYyBpbiB0aGUgY3B1IHN0YXRlIHN0cnVjdC4KLSAgICAgICBPbmx5IG5lY2Vzc2FyeSBmb3IgV0lUSF9TQ0FDSEUgY2FzZSwgYnV0IHRvIGF2b2lkIHRoZQotICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIC4uLi4gICovCi0gICAgU0VUX0hfUEMgKHBjKTsKLSAgICAvKiBWaXJ0dWFsIGluc25zIGhhdmUgemVybyBzaXplLiAgT3ZlcndyaXRlIHZwYyB3aXRoIGFkZHJlc3Mgb2YgbmV4dCBpbnNuCi0gICAgICAgdXNpbmcgdGhlIGRlZmF1bHQtaW5zbi1iaXRzaXplIHNwZWMuICBXaGVuIGV4ZWN1dGluZyBpbnNucyBpbiBwYXJhbGxlbAotICAgICAgIHdlIG1heSB3YW50IHRvIHF1ZXVlIHRoZSBmYXVsdCBhbmQgY29udGludWUgZXhlY3V0aW9uLiAgKi8KLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLSAgICB2cGMgPSBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjLCB2cGMpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9BRlRFUikgOiAvKiAtLWFmdGVyLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgotICAgIGZyMzBiZl9wYmJfYWZ0ZXIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9CRUZPUkUpIDogLyogLS1iZWZvcmUtLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfRlIzMEJGCi0gICAgZnIzMGJmX3BiYl9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9DVElfQ0hBSU4pIDogLyogLS1jdGktY2hhaW4tLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfRlIzMEJGCi0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIHZwYyA9IGZyMzBiZl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKLQkJCSAgICAgICBwYmJfYnJfdHlwZSwgcGJiX2JyX25wYyk7Ci0gICAgQlJFQUsgKHNlbSk7Ci0jZWxzZQotICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCi0gICAgdnBjID0gZnIzMGJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAotCQkJICAgICAgIENQVV9QQkJfQlJfVFlQRSAoY3VycmVudF9jcHUpLAotCQkJICAgICAgIENQVV9QQkJfQlJfTlBDIChjdXJyZW50X2NwdSkpOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQ0hBSU4pIDogLyogLS1jaGFpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKLSAgICB2cGMgPSBmcjMwYmZfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIEJSRUFLIChzZW0pOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVHSU4pIDogLyogLS1iZWdpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKLSAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLwotICAgIHZwYyA9IGZyMzBiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOwotI2Vsc2UKLSAgICB2cGMgPSBmcjMwYmZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKLSNlbmRpZgotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BREQpIDogLyogYWRkICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERENGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FEREkpIDogLyogYWRkICR1NCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BREQyKSA6IC8qIGFkZDIgJG00LCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FEREMpIDogLyogYWRkYyAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB0bXBfdG1wID0gQUREQ1NJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKLSAgewotICAgIEJJIG9wdmFsID0gQURET0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FERE4pIDogLyogYWRkbiAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQURETkkpIDogLyogYWRkbiAkdTQsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BREROMikgOiAvKiBhZGRuMiAkbTQsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVUIpIDogLyogc3ViICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQk9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQkMpIDogLyogc3ViYyAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB0bXBfdG1wID0gU1VCQ1NJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQk4pIDogLyogc3VibiAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QKSA6IC8qIGNtcCAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXAxOwotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB0bXBfdG1wMSA9IFNVQlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSSkgOiAvKiBjbXAgJHU0LCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXAxOwotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHRtcF90bXAxID0gU1VCU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QMikgOiAvKiBjbXAyICRtNCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wMTsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB0bXBfdG1wMSA9IFNVQlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCkpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORCkgOiAvKiBhbmQgJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fT1IpIDogLyogb3IgJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FT1IpIDogLyogZW9yICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORE0pIDogLyogYW5kICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRTSSAoR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQU5ESCkgOiAvKiBhbmRoICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIEhJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBISSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQU5EQikgOiAvKiBhbmRiICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFFJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRRSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFRSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBRSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fT1JNKSA6IC8qIG9yICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBPUlNJIChHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUkgpIDogLyogb3JoICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIEhJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBPUkhJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUUhJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUSEkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEhJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUkIpIDogLyogb3JiICRSaixAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFFJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBPUlFJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIFFJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FT1JNKSA6IC8qIGVvciAkUmosQCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SU0kgKEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VPUkgpIDogLyogZW9yaCAkUmosQCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBISSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SSEkgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRSEkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRISSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgSEkgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VPUkIpIDogLyogZW9yYiAkUmosQCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBRSSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SUUkgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRRSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgUUkgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JBTkRMKSA6IC8qIGJhbmRsICR1NCxAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gQU5EUUkgKE9SUUkgKEZMRCAoZl91NCksIDI0MCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JPUkwpIDogLyogYm9ybCAkdTQsQCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9IE9SUUkgKEZMRCAoZl91NCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JFT1JMKSA6IC8qIGJlb3JsICR1NCxAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gWE9SUUkgKEZMRCAoZl91NCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JBTkRIKSA6IC8qIGJhbmRoICR1NCxAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gQU5EUUkgKE9SUUkgKFNMTFFJIChGTEQgKGZfdTQpLCA0KSwgMTUpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CT1JIKSA6IC8qIGJvcmggJHU0LEAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSBPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JFT1JIKSA6IC8qIGJlb3JoICR1NCxAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gWE9SUUkgKFNMTFFJIChGTEQgKGZfdTQpLCA0KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQlRTVEwpIDogLyogYnRzdGwgJHU0LEAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBRSSB0bXBfdG1wOwotICB0bXBfdG1wID0gQU5EUUkgKEZMRCAoZl91NCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JUU1RIKSA6IC8qIGJ0c3RoICR1NCxAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgUUkgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IEFORFFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUwpIDogLyogbXVsICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgREkgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9SaikpLCBFWFRTSURJICgqIEZMRCAoaV9SaSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdG1wKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RtcCwgMzIpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRREkgKHRtcF90bXAsIE1BS0VESSAoMCwgMCkpOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gT1JJRiAoR1RESSAodG1wX3RtcCwgTUFLRURJICgwLCAyMTQ3NDgzNjQ3KSksIExUREkgKHRtcF90bXAsIE5FR0RJIChNQUtFREkgKDAsIDB4ODAwMDAwMDApKSkpOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxVKSA6IC8qIG11bHUgJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBESSB0bXBfdG1wOwotICB0bXBfdG1wID0gTVVMREkgKFpFWFRTSURJICgqIEZMRCAoaV9SaikpLCBaRVhUU0lESSAoKiBGTEQgKGlfUmkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RtcCk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JMREkgKHRtcF90bXAsIDMyKSk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTkVTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMSCkgOiAvKiBtdWxoICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gTVVMSEkgKFRSVU5DU0lISSAoKiBGTEQgKGlfUmopKSwgVFJVTkNTSUhJICgqIEZMRCAoaV9SaSkpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEdFU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01VTFVIKSA6IC8qIG11bHVoICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKEFORFNJICgqIEZMRCAoaV9SaiksIDY1NTM1KSwgQU5EU0kgKCogRkxEIChpX1JpKSwgNjU1MzUpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEdFU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVjBTKSA6IC8qIGRpdjBzICRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfZDBiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImQwYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gWE9SQkkgKENQVSAoaF9kMGJpdCksIExUU0kgKCogRkxEIChpX1JpKSwgMCkpOwotICAgIENQVSAoaF9kMWJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDFiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotaWYgKE5FQkkgKENQVSAoaF9kMGJpdCksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDB4ZmZmZmZmZmY7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0gZWxzZSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWMFUpIDogLyogZGl2MHUgJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfZDBiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImQwYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfZDFiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImQxYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gMDsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ESVYxKSA6IC8qIGRpdjEgJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAxKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLWlmIChMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDEpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAxKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLWlmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgewotewotICB0bXBfdG1wID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKLSAgewotICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLXsKLSAgdG1wX3RtcCA9IFNVQlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSk7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDYpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChOT1RCSSAoWE9SQkkgKFhPUkJJIChDUFUgKGhfZDBiaXQpLCBDUFUgKGhfZDFiaXQpKSwgQ1BVIChoX2NiaXQpKSkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAxKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVjIpIDogLyogZGl2MiAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci1pZiAoRVFCSSAoQ1BVIChoX2QxYml0KSwgMSkpIHsKLXsKLSAgdG1wX3RtcCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSk7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERENGU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci17Ci0gIHRtcF90bXAgPSBTVUJTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJDRlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoRVFTSSAodG1wX3RtcCwgMCkpIHsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gMTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gMDsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWMykgOiAvKiBkaXYzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChFUUJJIChDUFUgKGhfemJpdCksIDEpKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDEpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVjRTKSA6IC8qIGRpdjRzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBORUdTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MU0wpIDogLyogbHNsICRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9zaGlmdDsKLSAgdG1wX3NoaWZ0ID0gQU5EU0kgKCogRkxEIChpX1JqKSwgMzEpOwotaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICgzMiwgdG1wX3NoaWZ0KSkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19IGVsc2UgewotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xTTEkpIDogLyogbHNsICR1NCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEZMRCAoZl91NCk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKDMyLCB0bXBfc2hpZnQpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTFNMMikgOiAvKiBsc2wyICR1NCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKDMyLCB0bXBfc2hpZnQpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTFNSKSA6IC8qIGxzciAkUmosJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEFORFNJICgqIEZMRCAoaV9SaiksIDMxKTsKLWlmIChORVNJICh0bXBfc2hpZnQsIDApKSB7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19IGVsc2UgewotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xTUkkpIDogLyogbHNyICR1NCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEZMRCAoZl91NCk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MU1IyKSA6IC8qIGxzcjIgJHU0LCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9zaGlmdDsKLSAgdG1wX3NoaWZ0ID0gQUREU0kgKEZMRCAoZl91NCksIDE2KTsKLWlmIChORVNJICh0bXBfc2hpZnQsIDApKSB7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19IGVsc2UgewotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FTUikgOiAvKiBhc3IgJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBBTkRTSSAoKiBGTEQgKGlfUmopLCAzMSk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BU1JJKSA6IC8qIGFzciAkdTQsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBGTEQgKGZfdTQpOwotaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICh0bXBfc2hpZnQsIDEpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQVNSMikgOiAvKiBhc3IyICR1NCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREk4KSA6IC8qIGxkaTo4ICRpOCwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfaTgpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJMjApIDogLyogbGRpOjIwICRpMjAsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZGkyMC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9pMjApOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJMzIpIDogLyogbGRpOjMyICRpMzIsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZGkzMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDYpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9pMzIpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTEQpIDogLyogbGQgQCRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVUgpIDogLyogbGR1aCBAJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVUIpIDogLyogbGR1YiBAJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUjEzKSA6IC8qIGxkIEAoJFIxMywkUmopLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERSMTNVSCkgOiAvKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUjEzVUIpIDogLyogbGR1YiBAKCRSMTMsJFJqKSwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFIxNCkgOiAvKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDEwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUjE0VUgpIDogLyogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE0dWguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOSksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFIxNFVCKSA6IC8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNHViLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERSMTUpIDogLyogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTUuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX3VkaXNwNiksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFIxNUdSKSA6IC8qIGxkIEAkUjE1KywkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1Z3IuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLWlmIChORVNJIChGTEQgKGZfUmkpLCAxNSkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERSMTVEUikgOiAvKiBsZCBAJFIxNSssJFJzMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTVkci5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVF9IX0RSIChGTEQgKGZfUnMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSczIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUjE1UFMpIDogLyogbGQgQCRSMTUrLCRwcyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIFNFVF9IX1BTIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1QpIDogLyogc3QgJFJpLEAkUmogKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUSCkgOiAvKiBzdGggJFJpLEAkUmogKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUQikgOiAvKiBzdGIgJFJpLEAkUmogKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUjEzKSA6IC8qIHN0ICRSaSxAKCRSMTMsJFJqKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RSMTNIKSA6IC8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUjEzQikgOiAvKiBzdGIgJFJpLEAoJFIxMywkUmopICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFIxNCkgOiAvKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX2Rpc3AxMCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUjE0SCkgOiAvKiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNGguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOSksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUjE0QikgOiAvKiBzdGIgJFJpLEAoJFIxNCwkZGlzcDgpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNGIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUjE1KSA6IC8qIHN0ICRSaSxAKCRSMTUsJHVkaXNwNikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE1LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgRkxEIChmX3VkaXNwNikpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RSMTVHUikgOiAvKiBzdCAkUmksQC0kUjE1ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNWdyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDsKLSAgdG1wX3RtcCA9ICogRkxEIChpX1JpKTsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFIxNURSKSA6IC8qIHN0ICRSczIsQC0kUjE1ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNWRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IEdFVF9IX0RSIChGTEQgKGZfUnMyKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RSMTVQUykgOiAvKiBzdCAkcHMsQC0kUjE1ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRfSF9QUyAoKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01PVikgOiAvKiBtb3YgJFJqLCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9Saik7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT1ZEUikgOiAvKiBtb3YgJFJzMSwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdmRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUX0hfRFIgKEZMRCAoZl9SczEpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01PVlBTKSA6IC8qIG1vdiAkcHMsJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3Zkci5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVF9IX1BTICgpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTU9WMkRSKSA6IC8qIG1vdiAkUmksJFJzMSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVF9IX0RSIChGTEQgKGZfUnMxKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSczEiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01PVjJQUykgOiAvKiBtb3YgJFJpLCRwcyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRfSF9QUyAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fSk1QKSA6IC8qIGptcCBAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0pNUEQpIDogLyogam1wOmQgQCRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DQUxMUikgOiAvKiBjYWxsIEAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDIpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ0FMTFJEKSA6IC8qIGNhbGw6ZCBAJFJpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSAxKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NBTEwpIDogLyogY2FsbCAkbGFiZWwxMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDIpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NBTExEKSA6IC8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFVCkgOiAvKiByZXQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEdFVF9IX0RSICgoKFVJTlQpIDEpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFVF9EKSA6IC8qIHJldDpkICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBHRVRfSF9EUiAoKChVSU5UKSAxKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9JTlQpIDogLyogaW50ICR1OCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci07IC8qY2xvYmJlciovCi07IC8qY2xvYmJlciovCi07IC8qY2xvYmJlciovCi0gIHsKLSAgICBTSSBvcHZhbCA9IGZyMzBfaW50IChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl91OCkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fSU5URSkgOiAvKiBpbnRlICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci07IC8qY2xvYmJlciovCi07IC8qY2xvYmJlciovCi07IC8qY2xvYmJlciovCi0gIHsKLSAgICBTSSBvcHZhbCA9IGZyMzBfaW50ZSAoY3VycmVudF9jcHUsIHBjKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFVEkpIDogLyogcmV0aSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKEVRQkkgKEdFVF9IX1NCSVQgKCksIDApKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDIpKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDIpKSwgNCk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgMiksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMikpKTsKLSAgICBTRVRfSF9QUyAob3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDIpKSwgNCk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgMiksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDMpKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDYpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMykpKTsKLSAgICBTRVRfSF9QUyAob3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDYpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CUkFEKSA6IC8qIGJyYTpkICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JSQSkgOiAvKiBicmEgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQk5PRCkgOiAvKiBibm86ZCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSgodm9pZCkgMCk7IC8qbm9wKi8KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTk8pIDogLyogYm5vICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotKCh2b2lkKSAwKTsgLypub3AqLwotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JFUUQpIDogLyogYmVxOmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKENQVSAoaF96Yml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkVRKSA6IC8qIGJlcSAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX3piaXQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkVEKSA6IC8qIGJuZTpkICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChOT1RCSSAoQ1BVIChoX3piaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQk5FKSA6IC8qIGJuZSAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoTk9UQkkgKENQVSAoaF96Yml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JDRCkgOiAvKiBiYzpkICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfY2JpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JDKSA6IC8qIGJjICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChDUFUgKGhfY2JpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JOQ0QpIDogLyogYm5jOmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChDUFUgKGhfY2JpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkMpIDogLyogYm5jICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQk5EKSA6IC8qIGJuOmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKENQVSAoaF9uYml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQk4pIDogLyogYm4gJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKENQVSAoaF9uYml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQlBEKSA6IC8qIGJwOmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChDUFUgKGhfbmJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CUCkgOiAvKiBicCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoTk9UQkkgKENQVSAoaF9uYml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JWRCkgOiAvKiBidjpkICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfdmJpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JWKSA6IC8qIGJ2ICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChDUFUgKGhfdmJpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JOVkQpIDogLyogYm52OmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTlYpIDogLyogYm52ICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX3ZiaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkxURCkgOiAvKiBibHQ6ZCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkxUKSA6IC8qIGJsdCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkdFRCkgOiAvKiBiZ2U6ZCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoTk9UQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CR0UpIDogLyogYmdlICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMRUQpIDogLyogYmxlOmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMRSkgOiAvKiBibGUgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JHVEQpIDogLyogYmd0OmQgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChPUkJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpLCBDUFUgKGhfemJpdCkpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkdUKSA6IC8qIGJndCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoTk9UQkkgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTFNEKSA6IC8qIGJsczpkICRsYWJlbDkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChPUkJJIChDUFUgKGhfY2JpdCksIENQVSAoaF96Yml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMUykgOiAvKiBibHMgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkhJRCkgOiAvKiBiaGk6ZCAkbGFiZWw5ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoTk9UQkkgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JISSkgOiAvKiBiaGkgJGxhYmVsOSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChPUkJJIChDUFUgKGhfY2JpdCksIENQVSAoaF96Yml0KSkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzKSA6IC8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRE1PVlIxM0gpIDogLyogZG1vdmggJFIxMyxAJGRpcjkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzQikgOiAvKiBkbW92YiAkUjEzLEAkZGlyOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpYi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RNT1ZSMTNQSSkgOiAvKiBkbW92IEAkUjEzKyxAJGRpcjEwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzUElIKSA6IC8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgSEkgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgMik7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RNT1ZSMTNQSUIpIDogLyogZG1vdmIgQCRSMTMrLEAkZGlyOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpYi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBRSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAxKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRE1PVlIxNVBJKSA6IC8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTVwaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RNT1YyUjEzKSA6IC8qIGRtb3YgQCRkaXIxMCwkUjEzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRE1PVjJSMTNIKSA6IC8qIGRtb3ZoIEAkZGlyOSwkUjEzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRE1PVjJSMTNCKSA6IC8qIGRtb3ZiIEAkZGlyOCwkUjEzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRE1PVjJSMTNQSSkgOiAvKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WMlIxM1BJSCkgOiAvKiBkbW92aCBAJGRpcjksQCRSMTMrICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEhJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDIpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WMlIxM1BJQikgOiAvKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFFJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDEpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ETU9WMlIxNVBEKSA6IC8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTVwaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUkVTKSA6IC8qIGxkcmVzIEAkUmkrLCR1NCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksIDQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RSRVMpIDogLyogc3RyZXMgJHU0LEAkUmkrICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgNCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DT1BPUCkgOiAvKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DT1BMRCkgOiAvKiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DT1BTVCkgOiAvKiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DT1BTVikgOiAvKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1ApIDogLyogbm9wICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BTkRDQ1IpIDogLyogYW5kY2NyICR1OCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVRSSBvcHZhbCA9IEFORFFJIChHRVRfSF9DQ1IgKCksIEZMRCAoZl91OCkpOwotICAgIFNFVF9IX0NDUiAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjY3IiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX09SQ0NSKSA6IC8qIG9yY2NyICR1OCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVRSSBvcHZhbCA9IE9SUUkgKEdFVF9IX0NDUiAoKSwgRkxEIChmX3U4KSk7Ci0gICAgU0VUX0hfQ0NSIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RJTE0pIDogLyogc3RpbG0gJHU4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9pbnQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVFJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl91OCksIDMxKTsKLSAgICBTRVRfSF9JTE0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiaWxtIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERTUCkgOiAvKiBhZGRzcCAkczEwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgRkxEIChmX3MxMCkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FWFRTQikgOiAvKiBleHRzYiAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRRSVNJIChBTkRRSSAoKiBGTEQgKGlfUmkpLCAyNTUpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VYVFVCKSA6IC8qIGV4dHViICRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChBTkRRSSAoKiBGTEQgKGlfUmkpLCAyNTUpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VYVFNIKSA6IC8qIGV4dHNoICRSaSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEFOREhJICgqIEZMRCAoaV9SaSksIDY1NTM1KSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FWFRVSCkgOiAvKiBleHR1aCAkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoQU5ESEkgKCogRkxEIChpX1JpKSwgNjU1MzUpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xETTApIDogLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDEpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA2KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDgpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA3KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDE2KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCAzMikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDkpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgNjQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCAxMjgpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRE0xKSA6IC8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMSkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDkpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci04IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAyKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci05IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA0KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDgpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDExKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDE2KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDgpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMzIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA2NCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA3KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDEyOCkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE0wKSA6IC8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0bTAuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAxKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNyldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAyKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNildKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCA0KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCA4KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAxNikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMzIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDY0KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAxMjgpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUTTEpIDogLyogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdG0xLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAxKSkgewotewotICBTSSB0bXBfc2F2ZV9yMTU7Ci0gIHRtcF9zYXZlX3IxNSA9IENQVSAoaF9nclsoKFVJTlQpIDE1KV0pOwotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfc2F2ZV9yMTU7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAyKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDkpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTIpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAxNikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTEpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAzMikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTApXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCA2NCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgOSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDEyOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgOCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FTlRFUikgOiAvKiBlbnRlciAkdTEwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbnRlci5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdG1wLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl91MTApKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTEVBVkUpIDogLyogbGVhdmUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VudGVyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE0KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YQ0hCKSA6IC8qIHhjaGIgQCRSaiwkUmkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSAqIEZMRCAoaV9SaSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVUUkgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0KLSAgICB9Ci0gIEVORFNXSVRDSCAoc2VtKSAvKiBFbmQgb2Ygc2VtYW50aWMgc3dpdGNoLiAgKi8KLQotICAvKiBBdCB0aGlzIHBvaW50IGB2cGMnIGNvbnRhaW5zIHRoZSBuZXh0IGluc24gdG8gZXhlY3V0ZS4gICovCi19Ci0KLSN1bmRlZiBERUZJTkVfU1dJVENICi0jZW5kaWYgLyogREVGSU5FX1NXSVRDSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvc2VtLmMgYi9zaW0vZnIzMC9zZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4M2YzNi4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9zZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MjIgKzAsMCBAQAotLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIHNlbWFudGljcyBmb3IgZnIzMGJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jZGVmaW5lIFdBTlRfQ1BVIGZyMzBiZgotI2RlZmluZSBXQU5UX0NQVV9GUjMwQkYKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiY2dlbi1tZW0uaCIKLSNpbmNsdWRlICJjZ2VuLW9wcy5oIgotCi0jdW5kZWYgR0VUX0FUVFIKLSNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQotCi0vKiBUaGlzIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gY29tcGlsZSB0d28gY29waWVzIG9mIHRoZSBzZW1hbnRpYyBjb2RlLAotICAgb25lIHdpdGggZnVsbCBmZWF0dXJlIHN1cHBvcnQgYW5kIG9uZSB3aXRob3V0IHRoYXQgcnVucyBmYXN0KGVyKS4KLSAgIEZBU1RfUCwgd2hlbiBkZXNpcmVkLCBpcyBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIC1ERkFTVF9QPTEuICAqLwotI2lmIEZBU1RfUAotI2RlZmluZSBTRU1fRk5fTkFNRShjcHUsZm4pIFhDT05DQVQzIChjcHUsX3NlbWZfLGZuKQotI3VuZGVmIFRSQUNFX1JFU1VMVAotI2RlZmluZSBUUkFDRV9SRVNVTFQoY3B1LCBhYnVmLCBuYW1lLCB0eXBlLCB2YWwpCi0jZWxzZQotI2RlZmluZSBTRU1fRk5fTkFNRShjcHUsZm4pIFhDT05DQVQzIChjcHUsX3NlbV8sZm4pCi0jZW5kaWYKLQotLyogeC1pbnZhbGlkOiAtLWludmFsaWQtLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLHhfaW52YWxpZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0gICAgLyogVXBkYXRlIHRoZSByZWNvcmRlZCBwYyBpbiB0aGUgY3B1IHN0YXRlIHN0cnVjdC4KLSAgICAgICBPbmx5IG5lY2Vzc2FyeSBmb3IgV0lUSF9TQ0FDSEUgY2FzZSwgYnV0IHRvIGF2b2lkIHRoZQotICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIC4uLi4gICovCi0gICAgU0VUX0hfUEMgKHBjKTsKLSAgICAvKiBWaXJ0dWFsIGluc25zIGhhdmUgemVybyBzaXplLiAgT3ZlcndyaXRlIHZwYyB3aXRoIGFkZHJlc3Mgb2YgbmV4dCBpbnNuCi0gICAgICAgdXNpbmcgdGhlIGRlZmF1bHQtaW5zbi1iaXRzaXplIHNwZWMuICBXaGVuIGV4ZWN1dGluZyBpbnNucyBpbiBwYXJhbGxlbAotICAgICAgIHdlIG1heSB3YW50IHRvIHF1ZXVlIHRoZSBmYXVsdCBhbmQgY29udGludWUgZXhlY3V0aW9uLiAgKi8KLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLSAgICB2cGMgPSBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjLCB2cGMpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1hZnRlcjogLS1hZnRlci0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYseF9hZnRlcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgotICAgIGZyMzBiZl9wYmJfYWZ0ZXIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1iZWZvcmU6IC0tYmVmb3JlLS0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZix4X2JlZm9yZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgotICAgIGZyMzBiZl9wYmJfYmVmb3JlIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtY3RpLWNoYWluOiAtLWN0aS1jaGFpbi0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYseF9jdGlfY2hhaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgdnBjID0gZnIzMGJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAotCQkJICAgICAgIHBiYl9icl90eXBlLCBwYmJfYnJfbnBjKTsKLSAgICBCUkVBSyAoc2VtKTsKLSNlbHNlCi0gICAgLyogRklYTUU6IEFsbG93IHByb3Zpc2lvbiBvZiBleHBsaWNpdCBpZm10IHNwZWMgaW4gaW5zbiBzcGVjLiAgKi8KLSAgICB2cGMgPSBmcjMwYmZfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9UWVBFIChjdXJyZW50X2NwdSksCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9OUEMgKGN1cnJlbnRfY3B1KSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1jaGFpbjogLS1jaGFpbi0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYseF9jaGFpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgotICAgIHZwYyA9IGZyMzBiZl9wYmJfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgQlJFQUsgKHNlbSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1iZWdpbjogLS1iZWdpbi0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYseF9iZWdpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgotI2lmZGVmIERFRklORV9TV0lUQ0gKLSAgICAvKiBJbiB0aGUgc3dpdGNoIGNhc2UgRkFTVF9QIGlzIGEgY29uc3RhbnQsIGFsbG93aW5nIHNldmVyYWwgb3B0aW1pemF0aW9ucwotICAgICAgIGluIGFueSBjYWxsZWQgaW5saW5lIGZ1bmN0aW9ucy4gICovCi0gICAgdnBjID0gZnIzMGJmX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIEZBU1RfUCk7Ci0jZWxzZQotICAgIHZwYyA9IGZyMzBiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBTVEFURV9SVU5fRkFTVF9QIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSkpOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZDogYWRkICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixhZGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRpOiBhZGQgJHU0LCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFkZGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gQURET0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERENGU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYWRkMjogYWRkMiAkbTQsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYWRkMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRjOiBhZGRjICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixhZGRjKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IEFERENTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRuOiBhZGRuICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixhZGRuKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZG5pOiBhZGRuICR1NCwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixhZGRuaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZG4yOiBhZGRuMiAkbTQsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYWRkbjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdWI6IHN1YiAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3ViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3ViYzogc3ViYyAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3ViYykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBTVUJDU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Vibjogc3VibiAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3VibikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXA6IGNtcCAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsY21wKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wMTsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgdG1wX3RtcDEgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGk6IGNtcCAkdTQsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsY21waSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wMTsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKLSAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB0bXBfdG1wMSA9IFNVQlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCkpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wMSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcDI6IGNtcDIgJG00LCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGNtcDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDE7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQk9GU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgdG1wX3RtcDEgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcDEsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAodG1wX3RtcDEsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhbmQ6IGFuZCAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYW5kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3I6IG9yICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZW9yOiBlb3IgJFJqLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGVvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFuZG06IGFuZCAkUmosQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFuZG0pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRTSSAoR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYW5kaDogYW5kaCAkUmosQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIEhJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBISSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYW5kYjogYW5kYiAkUmosQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFFJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRRSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFRSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBRSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3JtOiBvciAkUmosQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLG9ybSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IE9SU0kgKEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG9yaDogb3JoICRSaixAJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsb3JoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBISSB0bXBfdG1wOwotICB0bXBfdG1wID0gT1JISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBISSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3JiOiBvcmIgJFJqLEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixvcmIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFFJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBPUlFJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOwotewotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIFFJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBlb3JtOiBlb3IgJFJqLEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixlb3JtKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SU0kgKEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGVvcmg6IGVvcmggJFJqLEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixlb3JoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBISSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SSEkgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRSEkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRISSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgSEkgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGVvcmI6IGVvcmIgJFJqLEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixlb3JiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBRSSB0bXBfdG1wOwotICB0bXBfdG1wID0gWE9SUUkgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRRSSAodG1wX3RtcCwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgUUkgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJhbmRsOiBiYW5kbCAkdTQsQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJhbmRsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9IEFORFFJIChPUlFJIChGTEQgKGZfdTQpLCAyNDApLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBib3JsOiBib3JsICR1NCxAJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYm9ybCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSBPUlFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiZW9ybDogYmVvcmwgJHU0LEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixiZW9ybCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSBYT1JRSSAoRkxEIChmX3U0KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmFuZGg6IGJhbmRoICR1NCxAJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmFuZGgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gQU5EUUkgKE9SUUkgKFNMTFFJIChGTEQgKGZfdTQpLCA0KSwgMTUpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBib3JoOiBib3JoICR1NCxAJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYm9yaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSBPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJlb3JoOiBiZW9yaCAkdTQsQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJlb3JoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9IFhPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJ0c3RsOiBidHN0bCAkdTQsQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJ0c3RsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFFJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBBTkRRSSAoRkxEIChmX3U0KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYnRzdGg6IGJ0c3RoICR1NCxAJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYnRzdGgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgUUkgdG1wX3RtcDsKLSAgdG1wX3RtcCA9IEFORFFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtdWw6IG11bCAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbXVsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBESSB0bXBfdG1wOwotICB0bXBfdG1wID0gTVVMREkgKEVYVFNJREkgKCogRkxEIChpX1JqKSksIEVYVFNJREkgKCogRkxEIChpX1JpKSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90bXApOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdG1wLCAzMikpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gRVFESSAodG1wX3RtcCwgTUFLRURJICgwLCAwKSk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBPUklGIChHVERJICh0bXBfdG1wLCBNQUtFREkgKDAsIDIxNDc0ODM2NDcpKSwgTFRESSAodG1wX3RtcCwgTkVHREkgKE1BS0VESSAoMCwgMHg4MDAwMDAwMCkpKSk7Ci0gICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG11bHU6IG11bHUgJFJqLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLG11bHUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIERJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX1JqKSksIFpFWFRTSURJICgqIEZMRCAoaV9SaSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdG1wKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RtcCwgMzIpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDApOwotICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtdWxoOiBtdWxoICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixtdWxoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxISSAoVFJVTkNTSUhJICgqIEZMRCAoaV9SaikpLCBUUlVOQ1NJSEkgKCogRkxEIChpX1JpKSkpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOwotICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gR0VTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXVsdWg6IG11bHVoICRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixtdWx1aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKEFORFNJICgqIEZMRCAoaV9SaiksIDY1NTM1KSwgQU5EU0kgKCogRkxEIChpX1JpKSwgNjU1MzUpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEdFU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdjBzOiBkaXYwcyAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkaXYwcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7Ci0gICAgQ1BVIChoX2QwYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkMGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFhPUkJJIChDUFUgKGhfZDBiaXQpLCBMVFNJICgqIEZMRCAoaV9SaSksIDApKTsKLSAgICBDUFUgKGhfZDFiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImQxYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLWlmIChORUJJIChDUFUgKGhfZDBiaXQpLCAwKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSAweGZmZmZmZmZmOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOwotICB9Ci19IGVsc2UgewotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdjB1OiBkaXYwdSAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkaXYwdSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9kMGJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDBiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9kMWJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDFiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdjE6IGRpdjEgJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZGl2MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDEpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotaWYgKExUU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgMSk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDEpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotaWYgKEVRQkkgKENQVSAoaF9kMWJpdCksIDEpKSB7Ci17Ci0gIHRtcF90bXAgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSkpOwotICB7Ci0gICAgQkkgb3B2YWwgPSBBRERDRlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA2KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19IGVsc2UgewotewotICB0bXBfdG1wID0gU1VCU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKLSAgewotICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKE5PVEJJIChYT1JCSSAoWE9SQkkgKENQVSAoaF9kMGJpdCksIENQVSAoaF9kMWJpdCkpLCBDUFUgKGhfY2JpdCkpKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDEpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZGl2MjogZGl2MiAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkaXYyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3RtcDsKLWlmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgewotewotICB0bXBfdG1wID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKLSAgewotICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLXsKLSAgdG1wX3RtcCA9IFNVQlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSk7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChFUVNJICh0bXBfdG1wLCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSAxOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19IGVsc2UgewotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkaXYzOiBkaXYzICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZGl2MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKEVRQkkgKENQVSAoaF96Yml0KSwgMSkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMSk7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgNSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZGl2NHM6IGRpdjRzICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZGl2NHMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBORUdTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpKTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsc2w6IGxzbCAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbHNsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBBTkRTSSAoKiBGTEQgKGlfUmopLCAzMSk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKDMyLCB0bXBfc2hpZnQpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbHNsaTogbHNsICR1NCwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsc2xpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9zaGlmdDsKLSAgdG1wX3NoaWZ0ID0gRkxEIChmX3U0KTsKLWlmIChORVNJICh0bXBfc2hpZnQsIDApKSB7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsc2wyOiBsc2wyICR1NCwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsc2wyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9zaGlmdDsKLSAgdG1wX3NoaWZ0ID0gQUREU0kgKEZMRCAoZl91NCksIDE2KTsKLWlmIChORVNJICh0bXBfc2hpZnQsIDApKSB7Ci17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsc3I6IGxzciAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbHNyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBBTkRTSSAoKiBGTEQgKGlfUmopLCAzMSk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsc3JpOiBsc3IgJHU0LCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxzcmkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBGTEQgKGZfdTQpOwotaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICh0bXBfc2hpZnQsIDEpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbHNyMjogbHNyMiAkdTQsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbHNyMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhc3I6IGFzciAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYXNyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBBTkRTSSAoKiBGTEQgKGlfUmopLCAzMSk7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhc3JpOiBhc3IgJHU0LCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFzcmkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX3NoaWZ0OwotICB0bXBfc2hpZnQgPSBGTEQgKGZfdTQpOwotaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKLXsKLSAgewotICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICh0bXBfc2hpZnQsIDEpKSksIDApOwotICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0gZWxzZSB7Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX25iaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOwotICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYXNyMjogYXNyMiAkdTQsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYXNyMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfc2hpZnQ7Ci0gIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7Ci1pZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgewotewotICB7Ci0gICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7Ci0gICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLSAgewotICAgIEJJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKLSAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7Ci0gICAgQ1BVIChoX3piaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGk4OiBsZGk6OCAkaTgsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbGRpOCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZGk4LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfaTgpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRpMjA6IGxkaToyMCAkaTIwLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxkaTIwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkaTIwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfaTIwKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaTMyOiBsZGk6MzIgJGkzMiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZGkzMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZGkzMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX2kzMik7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZDogbGQgQCRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkdWg6IGxkdWggQCRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkdWI6IGxkdWIgQCRSaiwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcjEzOiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcjEzdWg6IGxkdWggQCgkUjEzLCRSaiksJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTN1aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHIxM3ViOiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjEzdWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRyMTQ6IGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwMTApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRyMTR1aDogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE0dWguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX2Rpc3A5KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcjE0dWI6IGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTR1YikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNHViLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHIxNTogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE1KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX3VkaXNwNiksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHIxNWdyOiBsZCBAJFIxNSssJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTVncikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHIxNWdyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLWlmIChORVNJIChGTEQgKGZfUmkpLCAxNSkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRyMTVkcjogbGQgQCRSMTUrLCRSczIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNWRyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1ZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVF9IX0RSIChGTEQgKGZfUnMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSczIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcjE1cHM6IGxkIEAkUjE1KywkcHMgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNXBzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZHNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIFNFVF9IX1BTIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Q6IHN0ICRSaSxAJFJqICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGg6IHN0aCAkUmksQCRSaiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLHN0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0Yjogc3RiICRSaSxAJFJqICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTM6IHN0ICRSaSxAKCRSMTMsJFJqKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjEzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTNoOiBzdGggJFJpLEAoJFIxMywkUmopICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTNoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTNiOiBzdGIgJFJpLEAoJFIxMywkUmopICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTNiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTQ6IHN0ICRSaSxAKCRSMTQsJGRpc3AxMCkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHIxNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDEwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTRoOiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTRoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE0aC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDkpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHIxNGI6IHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTRiLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cjE1OiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RyMTUuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl91ZGlzcDYpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cjE1Z3I6IHN0ICRSaSxALSRSMTUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNWdyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cjE1Z3IuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSAqIEZMRCAoaV9SaSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdG1wOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RyMTVkcjogc3QgJFJzMixALSRSMTUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNWRyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjE1ZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBHRVRfSF9EUiAoRkxEIChmX1JzMikpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cjE1cHM6IHN0ICRwcyxALSRSMTUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNXBzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZHNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUX0hfUFMgKCk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3Y6IG1vdiAkUmosJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbW92KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcjEzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9Saik7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3ZkcjogbW92ICRSczEsJFJpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbW92ZHIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92ZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVF9IX0RSIChGTEQgKGZfUnMxKSk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3ZwczogbW92ICRwcywkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixtb3ZwcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3Zkci5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUX0hfUFMgKCk7Ci0gICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3YyZHI6IG1vdiAkUmksJFJzMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLG1vdjJkcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRfSF9EUiAoRkxEIChmX1JzMSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUnMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3YycHM6IG1vdiAkUmksJHBzICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbW92MnBzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdjJkci5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRVRfSF9QUyAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogam1wOiBqbXAgQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGptcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogam1wZDogam1wOmQgQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGptcGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92MmRyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNhbGxyOiBjYWxsIEAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixjYWxscikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDIpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2FsbHJkOiBjYWxsOmQgQCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxyZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3YyZHIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2FsbDogY2FsbCAkbGFiZWwxMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgMik7Ci0gICAgU0VUX0hfRFIgKCgoVUlOVCkgMSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWwxMik7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2FsbGQ6IGNhbGw6ZCAkbGFiZWwxMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHJldDogcmV0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYscmV0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUX0hfRFIgKCgoVUlOVCkgMSkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmV0OmQ6IHJldDpkICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYscmV0X2QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBHRVRfSF9EUiAoKChVSU5UKSAxKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBpbnQ6IGludCAkdTggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixpbnQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLTsgLypjbG9iYmVyKi8KLTsgLypjbG9iYmVyKi8KLTsgLypjbG9iYmVyKi8KLSAgewotICAgIFNJIG9wdmFsID0gZnIzMF9pbnQgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX3U4KSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBpbnRlOiBpbnRlICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsaW50ZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLTsgLypjbG9iYmVyKi8KLTsgLypjbG9iYmVyKi8KLTsgLypjbG9iYmVyKi8KLSAgewotICAgIFNJIG9wdmFsID0gZnIzMF9pbnRlIChjdXJyZW50X2NwdSwgcGMpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmV0aTogcmV0aSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLHJldGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoRVFCSSAoR0VUX0hfU0JJVCAoKSwgMCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMikpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA3KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgMikpLCA0KTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSAyKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBHRVRfSF9EUiAoKChVSU5UKSAyKSkpOwotICAgIFNFVF9IX1BTIChvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgMikpLCA0KTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSAyKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfSBlbHNlIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMykpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA3KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgMykpLCA0KTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSAzKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBHRVRfSF9EUiAoKChVSU5UKSAzKSkpOwotICAgIFNFVF9IX1BTIChvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgMykpLCA0KTsKLSAgICBTRVRfSF9EUiAoKChVSU5UKSAzKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJyYWQ6IGJyYTpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixicmFkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYnJhOiBicmEgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJyYSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJub2Q6IGJubzpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibm9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0oKHZvaWQpIDApOyAvKm5vcCovCi19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYm5vOiBibm8gJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJubykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotKCh2b2lkKSAwKTsgLypub3AqLwotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJlcWQ6IGJlcTpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixiZXFkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKENQVSAoaF96Yml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmVxOiBiZXEgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJlcSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChDUFUgKGhfemJpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJuZWQ6IGJuZTpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibmVkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChDUFUgKGhfemJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibmU6IGJuZSAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYm5lKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfemJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiY2Q6IGJjOmQgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJjZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfY2JpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJjOiBiYyAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NiaXQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibmNkOiBibmM6ZCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYm5jZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYm5jOiBibmMgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJuYykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYm5kOiBibjpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibmQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoQ1BVIChoX25iaXQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibjogYm4gJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJuKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKENQVSAoaF9uYml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYnBkOiBicDpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixicGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoTk9UQkkgKENQVSAoaF9uYml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJwOiBicCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYnApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoTk9UQkkgKENQVSAoaF9uYml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJ2ZDogYnY6ZCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYnZkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKENQVSAoaF92Yml0KSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYnY6IGJ2ICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixidikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChDUFUgKGhfdmJpdCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJudmQ6IGJudjpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibnZkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibnY6IGJudiAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYm52KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibHRkOiBibHQ6ZCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmx0ZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibHQ6IGJsdCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmx0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJnZWQ6IGJnZTpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixiZ2VkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE5PVEJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmdlOiBiZ2UgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJnZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9icmFkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsZWQ6IGJsZTpkICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibGVkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsZTogYmxlICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixibGUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoT1JCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSwgQ1BVIChoX3piaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmd0ZDogYmd0OmQgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJndGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoTk9UQkkgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiZ3Q6IGJndCAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmd0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChPUkJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpLCBDUFUgKGhfemJpdCkpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmxzZDogYmxzOmQgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJsc2QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBibHM6IGJscyAkbGFiZWw5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsYmxzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JyYWQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmhpZDogYmhpOmQgJGxhYmVsOSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGJoaWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoTk9UQkkgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJoaTogYmhpICRsYWJlbDkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixiaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYnJhZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoTk9UQkkgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRtb3ZyMTM6IGRtb3YgJFIxMyxAJGRpcjEwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXIxMCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92cjEzaDogZG1vdmggJFIxMyxAJGRpcjkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92cjEzYjogZG1vdmIgJFIxMyxAJGRpcjggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGliLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92cjEzcGk6IGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92cjEzcGloOiBkbW92aCBAJFIxMyssQCRkaXI5ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxM3BpaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgSEkgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgMik7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRtb3ZyMTNwaWI6IGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGliKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBRSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAxKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZG1vdnIxNXBpOiBkbW92IEAkUjE1KyxAJGRpcjEwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxNXBpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTVwaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXIxMCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZG1vdjJyMTM6IGRtb3YgQCRkaXIxMCwkUjEzICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZG1vdjJyMTNoOiBkbW92aCBAJGRpcjksJFIxMyAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3YycjEzaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92MnIxM2I6IGRtb3ZiIEAkZGlyOCwkUjEzICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaWIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI4KSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRtb3YycjEzcGk6IGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxM3BpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Rtb3ZyMTNwaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZG1vdjJyMTNwaWg6IGRtb3ZoIEAkZGlyOSxAJFIxMysgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxM3BpaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjEzcGloLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgSEkgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSkpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgMik7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRtb3YycjEzcGliOiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNwaWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZG1vdnIxM3BpYi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFFJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDEpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkbW92MnIxNXBkOiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTVwZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9kbW92cjE1cGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcmVzOiBsZHJlcyBAJFJpKywkdTQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixsZHJlcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCA0KTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cmVzOiBzdHJlcyAkdTQsQCRSaSsgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdHJlcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCA0KTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNvcG9wOiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsY29wb3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjb3BsZDogY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGNvcGxkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0oKHZvaWQpIDApOyAvKm5vcCovCi0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY29wc3Q6IGNvcHN0ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixjb3BzdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotKCh2b2lkKSAwKTsgLypub3AqLwotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNvcHN2OiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsY29wc3YpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSgodm9pZCkgMCk7IC8qbm9wKi8KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3A6IG5vcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLG5vcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotKCh2b2lkKSAwKTsgLypub3AqLwotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFuZGNjcjogYW5kY2NyICR1OCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGNjcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9pbnQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBVUUkgb3B2YWwgPSBBTkRRSSAoR0VUX0hfQ0NSICgpLCBGTEQgKGZfdTgpKTsKLSAgICBTRVRfSF9DQ1IgKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2NyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBvcmNjcjogb3JjY3IgJHU4ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsb3JjY3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVFJIG9wdmFsID0gT1JRSSAoR0VUX0hfQ0NSICgpLCBGTEQgKGZfdTgpKTsKLSAgICBTRVRfSF9DQ1IgKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2NyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGlsbTogc3RpbG0gJHU4ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RpbG0pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfaW50LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVFJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl91OCksIDMxKTsKLSAgICBTRVRfSF9JTE0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiaWxtIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRzcDogYWRkc3AgJHMxMCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGFkZHNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZHNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl9zMTApKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZXh0c2I6IGV4dHNiICRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGV4dHNiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVFFJU0kgKEFORFFJICgqIEZMRCAoaV9SaSksIDI1NSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZXh0dWI6IGV4dHViICRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGV4dHViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChBTkRRSSAoKiBGTEQgKGlfUmkpLCAyNTUpKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGV4dHNoOiBleHRzaCAkUmkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixleHRzaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRISVNJIChBTkRISSAoKiBGTEQgKGlfUmkpLCA2NTUzNSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZXh0dWg6IGV4dHVoICRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGV4dHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChBTkRISSAoKiBGTEQgKGlfUmkpLCA2NTUzNSkpOwotICAgICogRkxEIChpX1JpKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRtMDogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxkbTApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMSkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0wIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgNCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDYpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDMpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDcpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMTYpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDMyKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCA2NCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDYpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDEyOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDcpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDUpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkbTE6IGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGxkbTEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRtMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTgiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEwIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA4KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDgpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMTYpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAzMikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA2KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDY0KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDcpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDgpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMTI4KSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDgpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0bTA6IHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGZyMzBiZixzdG0wKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0bTAuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDEpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDgpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDE2KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMyldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAzMikpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDIpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgNjQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDEyOCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDApXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RtMTogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsc3RtMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdG0xLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDEpKSB7Ci17Ci0gIFNJIHRtcF9zYXZlX3IxNTsKLSAgdG1wX3NhdmVfcjE1ID0gQ1BVIChoX2dyWygoVUlOVCkgMTUpXSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDkpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9zYXZlX3IxNTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDIpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDkpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDE0KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgNCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTMpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLWlmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCA4KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMildKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDE2KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDMyKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDY0KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci1pZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgMTI4KSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA4KV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGVudGVyOiBlbnRlciAkdTEwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsZW50ZXIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW50ZXIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF90bXA7Ci0gIHRtcF90bXAgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdG1wLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90bXA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl91MTApKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGVhdmU6IGxlYXZlICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChmcjMwYmYsbGVhdmUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW50ZXIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeGNoYjogeGNoYiBAJFJqLCRSaSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoZnIzMGJmLHhjaGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfdG1wOwotICB0bXBfdG1wID0gKiBGTEQgKGlfUmkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKLSAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gdG1wX3RtcDsKLSAgICBTRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogVGFibGUgb2YgYWxsIHNlbWFudGljIGZucy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VtX2ZuX2Rlc2Mgc2VtX2Zuc1tdID0gewotICB7IEZSMzBCRl9JTlNOX1hfSU5WQUxJRCwgU0VNX0ZOX05BTUUgKGZyMzBiZix4X2ludmFsaWQpIH0sCi0gIHsgRlIzMEJGX0lOU05fWF9BRlRFUiwgU0VNX0ZOX05BTUUgKGZyMzBiZix4X2FmdGVyKSB9LAotICB7IEZSMzBCRl9JTlNOX1hfQkVGT1JFLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHhfYmVmb3JlKSB9LAotICB7IEZSMzBCRl9JTlNOX1hfQ1RJX0NIQUlOLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHhfY3RpX2NoYWluKSB9LAotICB7IEZSMzBCRl9JTlNOX1hfQ0hBSU4sIFNFTV9GTl9OQU1FIChmcjMwYmYseF9jaGFpbikgfSwKLSAgeyBGUjMwQkZfSU5TTl9YX0JFR0lOLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHhfYmVnaW4pIH0sCi0gIHsgRlIzMEJGX0lOU05fQURELCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9BRERJLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZGkpIH0sCi0gIHsgRlIzMEJGX0lOU05fQUREMiwgU0VNX0ZOX05BTUUgKGZyMzBiZixhZGQyKSB9LAotICB7IEZSMzBCRl9JTlNOX0FEREMsIFNFTV9GTl9OQU1FIChmcjMwYmYsYWRkYykgfSwKLSAgeyBGUjMwQkZfSU5TTl9BREROLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZG4pIH0sCi0gIHsgRlIzMEJGX0lOU05fQURETkksIFNFTV9GTl9OQU1FIChmcjMwYmYsYWRkbmkpIH0sCi0gIHsgRlIzMEJGX0lOU05fQURETjIsIFNFTV9GTl9OQU1FIChmcjMwYmYsYWRkbjIpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1VCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN1YikgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVUJDLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN1YmMpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1VCTiwgU0VNX0ZOX05BTUUgKGZyMzBiZixzdWJuKSB9LAotICB7IEZSMzBCRl9JTlNOX0NNUCwgU0VNX0ZOX05BTUUgKGZyMzBiZixjbXApIH0sCi0gIHsgRlIzMEJGX0lOU05fQ01QSSwgU0VNX0ZOX05BTUUgKGZyMzBiZixjbXBpKSB9LAotICB7IEZSMzBCRl9JTlNOX0NNUDIsIFNFTV9GTl9OQU1FIChmcjMwYmYsY21wMikgfSwKLSAgeyBGUjMwQkZfSU5TTl9BTkQsIFNFTV9GTl9OQU1FIChmcjMwYmYsYW5kKSB9LAotICB7IEZSMzBCRl9JTlNOX09SLCBTRU1fRk5fTkFNRSAoZnIzMGJmLG9yKSB9LAotICB7IEZSMzBCRl9JTlNOX0VPUiwgU0VNX0ZOX05BTUUgKGZyMzBiZixlb3IpIH0sCi0gIHsgRlIzMEJGX0lOU05fQU5ETSwgU0VNX0ZOX05BTUUgKGZyMzBiZixhbmRtKSB9LAotICB7IEZSMzBCRl9JTlNOX0FOREgsIFNFTV9GTl9OQU1FIChmcjMwYmYsYW5kaCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9BTkRCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGIpIH0sCi0gIHsgRlIzMEJGX0lOU05fT1JNLCBTRU1fRk5fTkFNRSAoZnIzMGJmLG9ybSkgfSwKLSAgeyBGUjMwQkZfSU5TTl9PUkgsIFNFTV9GTl9OQU1FIChmcjMwYmYsb3JoKSB9LAotICB7IEZSMzBCRl9JTlNOX09SQiwgU0VNX0ZOX05BTUUgKGZyMzBiZixvcmIpIH0sCi0gIHsgRlIzMEJGX0lOU05fRU9STSwgU0VNX0ZOX05BTUUgKGZyMzBiZixlb3JtKSB9LAotICB7IEZSMzBCRl9JTlNOX0VPUkgsIFNFTV9GTl9OQU1FIChmcjMwYmYsZW9yaCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9FT1JCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGVvcmIpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkFOREwsIFNFTV9GTl9OQU1FIChmcjMwYmYsYmFuZGwpIH0sCi0gIHsgRlIzMEJGX0lOU05fQk9STCwgU0VNX0ZOX05BTUUgKGZyMzBiZixib3JsKSB9LAotICB7IEZSMzBCRl9JTlNOX0JFT1JMLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGJlb3JsKSB9LAotICB7IEZSMzBCRl9JTlNOX0JBTkRILCBTRU1fRk5fTkFNRSAoZnIzMGJmLGJhbmRoKSB9LAotICB7IEZSMzBCRl9JTlNOX0JPUkgsIFNFTV9GTl9OQU1FIChmcjMwYmYsYm9yaCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CRU9SSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiZW9yaCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CVFNUTCwgU0VNX0ZOX05BTUUgKGZyMzBiZixidHN0bCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CVFNUSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixidHN0aCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9NVUwsIFNFTV9GTl9OQU1FIChmcjMwYmYsbXVsKSB9LAotICB7IEZSMzBCRl9JTlNOX01VTFUsIFNFTV9GTl9OQU1FIChmcjMwYmYsbXVsdSkgfSwKLSAgeyBGUjMwQkZfSU5TTl9NVUxILCBTRU1fRk5fTkFNRSAoZnIzMGJmLG11bGgpIH0sCi0gIHsgRlIzMEJGX0lOU05fTVVMVUgsIFNFTV9GTl9OQU1FIChmcjMwYmYsbXVsdWgpIH0sCi0gIHsgRlIzMEJGX0lOU05fRElWMFMsIFNFTV9GTl9OQU1FIChmcjMwYmYsZGl2MHMpIH0sCi0gIHsgRlIzMEJGX0lOU05fRElWMFUsIFNFTV9GTl9OQU1FIChmcjMwYmYsZGl2MHUpIH0sCi0gIHsgRlIzMEJGX0lOU05fRElWMSwgU0VNX0ZOX05BTUUgKGZyMzBiZixkaXYxKSB9LAotICB7IEZSMzBCRl9JTlNOX0RJVjIsIFNFTV9GTl9OQU1FIChmcjMwYmYsZGl2MikgfSwKLSAgeyBGUjMwQkZfSU5TTl9ESVYzLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRpdjMpIH0sCi0gIHsgRlIzMEJGX0lOU05fRElWNFMsIFNFTV9GTl9OQU1FIChmcjMwYmYsZGl2NHMpIH0sCi0gIHsgRlIzMEJGX0lOU05fTFNMLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxzbCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9MU0xJLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxzbGkpIH0sCi0gIHsgRlIzMEJGX0lOU05fTFNMMiwgU0VNX0ZOX05BTUUgKGZyMzBiZixsc2wyKSB9LAotICB7IEZSMzBCRl9JTlNOX0xTUiwgU0VNX0ZOX05BTUUgKGZyMzBiZixsc3IpIH0sCi0gIHsgRlIzMEJGX0lOU05fTFNSSSwgU0VNX0ZOX05BTUUgKGZyMzBiZixsc3JpKSB9LAotICB7IEZSMzBCRl9JTlNOX0xTUjIsIFNFTV9GTl9OQU1FIChmcjMwYmYsbHNyMikgfSwKLSAgeyBGUjMwQkZfSU5TTl9BU1IsIFNFTV9GTl9OQU1FIChmcjMwYmYsYXNyKSB9LAotICB7IEZSMzBCRl9JTlNOX0FTUkksIFNFTV9GTl9OQU1FIChmcjMwYmYsYXNyaSkgfSwKLSAgeyBGUjMwQkZfSU5TTl9BU1IyLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFzcjIpIH0sCi0gIHsgRlIzMEJGX0lOU05fTERJOCwgU0VNX0ZOX05BTUUgKGZyMzBiZixsZGk4KSB9LAotICB7IEZSMzBCRl9JTlNOX0xESTIwLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkaTIwKSB9LAotICB7IEZSMzBCRl9JTlNOX0xESTMyLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkaTMyKSB9LAotICB7IEZSMzBCRl9JTlNOX0xELCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkKSB9LAotICB7IEZSMzBCRl9JTlNOX0xEVUgsIFNFTV9GTl9OQU1FIChmcjMwYmYsbGR1aCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFVCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkdWIpIH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTMsIFNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTMpIH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTNVSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxM3VoKSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjEzVUIsIFNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTN1YikgfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxNCwgU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxNFVILCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE0dWgpIH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTRVQiwgU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNHViKSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjE1LCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE1KSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUjE1R1IsIFNFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTVncikgfSwKLSAgeyBGUjMwQkZfSU5TTl9MRFIxNURSLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE1ZHIpIH0sCi0gIHsgRlIzMEJGX0lOU05fTERSMTVQUywgU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNXBzKSB9LAotICB7IEZSMzBCRl9JTlNOX1NULCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0KSB9LAotICB7IEZSMzBCRl9JTlNOX1NUSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixzdGgpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1RCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0YikgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxMywgU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxMykgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxM0gsIFNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTNoKSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjEzQiwgU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxM2IpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTQsIFNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTQpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTRILCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjE0aCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxNEIsIFNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTRiKSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjE1LCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjE1KSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUjE1R1IsIFNFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTVncikgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVFIxNURSLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjE1ZHIpIH0sCi0gIHsgRlIzMEJGX0lOU05fU1RSMTVQUywgU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNXBzKSB9LAotICB7IEZSMzBCRl9JTlNOX01PViwgU0VNX0ZOX05BTUUgKGZyMzBiZixtb3YpIH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WRFIsIFNFTV9GTl9OQU1FIChmcjMwYmYsbW92ZHIpIH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WUFMsIFNFTV9GTl9OQU1FIChmcjMwYmYsbW92cHMpIH0sCi0gIHsgRlIzMEJGX0lOU05fTU9WMkRSLCBTRU1fRk5fTkFNRSAoZnIzMGJmLG1vdjJkcikgfSwKLSAgeyBGUjMwQkZfSU5TTl9NT1YyUFMsIFNFTV9GTl9OQU1FIChmcjMwYmYsbW92MnBzKSB9LAotICB7IEZSMzBCRl9JTlNOX0pNUCwgU0VNX0ZOX05BTUUgKGZyMzBiZixqbXApIH0sCi0gIHsgRlIzMEJGX0lOU05fSk1QRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixqbXBkKSB9LAotICB7IEZSMzBCRl9JTlNOX0NBTExSLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxyKSB9LAotICB7IEZSMzBCRl9JTlNOX0NBTExSRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixjYWxscmQpIH0sCi0gIHsgRlIzMEJGX0lOU05fQ0FMTCwgU0VNX0ZOX05BTUUgKGZyMzBiZixjYWxsKSB9LAotICB7IEZSMzBCRl9JTlNOX0NBTExELCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxkKSB9LAotICB7IEZSMzBCRl9JTlNOX1JFVCwgU0VNX0ZOX05BTUUgKGZyMzBiZixyZXQpIH0sCi0gIHsgRlIzMEJGX0lOU05fUkVUX0QsIFNFTV9GTl9OQU1FIChmcjMwYmYscmV0X2QpIH0sCi0gIHsgRlIzMEJGX0lOU05fSU5ULCBTRU1fRk5fTkFNRSAoZnIzMGJmLGludCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9JTlRFLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGludGUpIH0sCi0gIHsgRlIzMEJGX0lOU05fUkVUSSwgU0VNX0ZOX05BTUUgKGZyMzBiZixyZXRpKSB9LAotICB7IEZSMzBCRl9JTlNOX0JSQUQsIFNFTV9GTl9OQU1FIChmcjMwYmYsYnJhZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CUkEsIFNFTV9GTl9OQU1FIChmcjMwYmYsYnJhKSB9LAotICB7IEZSMzBCRl9JTlNOX0JOT0QsIFNFTV9GTl9OQU1FIChmcjMwYmYsYm5vZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CTk8sIFNFTV9GTl9OQU1FIChmcjMwYmYsYm5vKSB9LAotICB7IEZSMzBCRl9JTlNOX0JFUUQsIFNFTV9GTl9OQU1FIChmcjMwYmYsYmVxZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CRVEsIFNFTV9GTl9OQU1FIChmcjMwYmYsYmVxKSB9LAotICB7IEZSMzBCRl9JTlNOX0JORUQsIFNFTV9GTl9OQU1FIChmcjMwYmYsYm5lZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CTkUsIFNFTV9GTl9OQU1FIChmcjMwYmYsYm5lKSB9LAotICB7IEZSMzBCRl9JTlNOX0JDRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiY2QpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkMsIFNFTV9GTl9OQU1FIChmcjMwYmYsYmMpIH0sCi0gIHsgRlIzMEJGX0lOU05fQk5DRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibmNkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JOQywgU0VNX0ZOX05BTUUgKGZyMzBiZixibmMpIH0sCi0gIHsgRlIzMEJGX0lOU05fQk5ELCBTRU1fRk5fTkFNRSAoZnIzMGJmLGJuZCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9CTiwgU0VNX0ZOX05BTUUgKGZyMzBiZixibikgfSwKLSAgeyBGUjMwQkZfSU5TTl9CUEQsIFNFTV9GTl9OQU1FIChmcjMwYmYsYnBkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JQLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGJwKSB9LAotICB7IEZSMzBCRl9JTlNOX0JWRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixidmQpIH0sCi0gIHsgRlIzMEJGX0lOU05fQlYsIFNFTV9GTl9OQU1FIChmcjMwYmYsYnYpIH0sCi0gIHsgRlIzMEJGX0lOU05fQk5WRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibnZkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JOViwgU0VNX0ZOX05BTUUgKGZyMzBiZixibnYpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkxURCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibHRkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JMVCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibHQpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkdFRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiZ2VkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JHRSwgU0VNX0ZOX05BTUUgKGZyMzBiZixiZ2UpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkxFRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibGVkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JMRSwgU0VNX0ZOX05BTUUgKGZyMzBiZixibGUpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkdURCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiZ3RkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JHVCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiZ3QpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkxTRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixibHNkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JMUywgU0VNX0ZOX05BTUUgKGZyMzBiZixibHMpIH0sCi0gIHsgRlIzMEJGX0lOU05fQkhJRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixiaGlkKSB9LAotICB7IEZSMzBCRl9JTlNOX0JISSwgU0VNX0ZOX05BTUUgKGZyMzBiZixiaGkpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVlIxMywgU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNILCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3ZyMTNoKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3ZyMTNiKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNQSSwgU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGkpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGloKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUIsIFNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxM3BpYikgfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WUjE1UEksIFNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxNXBpKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3YycjEzKSB9LAotICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxM2gpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNCLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3YycjEzYikgfSwKLSAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3YycjEzcGkpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNQSUgsIFNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNwaWgpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNQSUIsIFNFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNwaWIpIH0sCi0gIHsgRlIzMEJGX0lOU05fRE1PVjJSMTVQRCwgU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxNXBkKSB9LAotICB7IEZSMzBCRl9JTlNOX0xEUkVTLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcmVzKSB9LAotICB7IEZSMzBCRl9JTlNOX1NUUkVTLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cmVzKSB9LAotICB7IEZSMzBCRl9JTlNOX0NPUE9QLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNvcG9wKSB9LAotICB7IEZSMzBCRl9JTlNOX0NPUExELCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNvcGxkKSB9LAotICB7IEZSMzBCRl9JTlNOX0NPUFNULCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNvcHN0KSB9LAotICB7IEZSMzBCRl9JTlNOX0NPUFNWLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGNvcHN2KSB9LAotICB7IEZSMzBCRl9JTlNOX05PUCwgU0VNX0ZOX05BTUUgKGZyMzBiZixub3ApIH0sCi0gIHsgRlIzMEJGX0lOU05fQU5EQ0NSLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGNjcikgfSwKLSAgeyBGUjMwQkZfSU5TTl9PUkNDUiwgU0VNX0ZOX05BTUUgKGZyMzBiZixvcmNjcikgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVElMTSwgU0VNX0ZOX05BTUUgKGZyMzBiZixzdGlsbSkgfSwKLSAgeyBGUjMwQkZfSU5TTl9BRERTUCwgU0VNX0ZOX05BTUUgKGZyMzBiZixhZGRzcCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9FWFRTQiwgU0VNX0ZOX05BTUUgKGZyMzBiZixleHRzYikgfSwKLSAgeyBGUjMwQkZfSU5TTl9FWFRVQiwgU0VNX0ZOX05BTUUgKGZyMzBiZixleHR1YikgfSwKLSAgeyBGUjMwQkZfSU5TTl9FWFRTSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixleHRzaCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9FWFRVSCwgU0VNX0ZOX05BTUUgKGZyMzBiZixleHR1aCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9MRE0wLCBTRU1fRk5fTkFNRSAoZnIzMGJmLGxkbTApIH0sCi0gIHsgRlIzMEJGX0lOU05fTERNMSwgU0VNX0ZOX05BTUUgKGZyMzBiZixsZG0xKSB9LAotICB7IEZSMzBCRl9JTlNOX1NUTTAsIFNFTV9GTl9OQU1FIChmcjMwYmYsc3RtMCkgfSwKLSAgeyBGUjMwQkZfSU5TTl9TVE0xLCBTRU1fRk5fTkFNRSAoZnIzMGJmLHN0bTEpIH0sCi0gIHsgRlIzMEJGX0lOU05fRU5URVIsIFNFTV9GTl9OQU1FIChmcjMwYmYsZW50ZXIpIH0sCi0gIHsgRlIzMEJGX0lOU05fTEVBVkUsIFNFTV9GTl9OQU1FIChmcjMwYmYsbGVhdmUpIH0sCi0gIHsgRlIzMEJGX0lOU05fWENIQiwgU0VNX0ZOX05BTUUgKGZyMzBiZix4Y2hiKSB9LAotICB7IDAsIDAgfQotfTsKLQotLyogQWRkIHRoZSBzZW1hbnRpYyBmbnMgdG8gSURFU0NfVEFCTEUuICAqLwotCi12b2lkCi1TRU1fRk5fTkFNRSAoZnIzMGJmLGluaXRfaWRlc2NfdGFibGUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgSURFU0MgKmlkZXNjX3RhYmxlID0gQ1BVX0lERVNDIChjdXJyZW50X2NwdSk7Ci0gIGNvbnN0IHN0cnVjdCBzZW1fZm5fZGVzYyAqc2Y7Ci0gIGludCBtYWNoX251bSA9IE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKTsKLQotICBmb3IgKHNmID0gJnNlbV9mbnNbMF07IHNmLT5mbiAhPSAwOyArK3NmKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlkZXNjX3RhYmxlW3NmLT5pbmRleF0uaWRhdGE7Ci0gICAgICBpbnQgdmFsaWRfcCA9IChDR0VOX0lOU05fVklSVFVBTF9QIChpbnNuKQotCQkgICAgIHx8IENHRU5fSU5TTl9NQUNIX0hBU19QIChpbnNuLCBtYWNoX251bSkpOwotI2lmIEZBU1RfUAotICAgICAgaWYgKHZhbGlkX3ApCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZmFzdCA9IHNmLT5mbjsKLSAgICAgIGVsc2UKLQlpZGVzY190YWJsZVtzZi0+aW5kZXhdLnNlbV9mYXN0ID0gU0VNX0ZOX05BTUUgKGZyMzBiZix4X2ludmFsaWQpOwotI2Vsc2UKLSAgICAgIGlmICh2YWxpZF9wKQotCWlkZXNjX3RhYmxlW3NmLT5pbmRleF0uc2VtX2Z1bGwgPSBzZi0+Zm47Ci0gICAgICBlbHNlCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZnVsbCA9IFNFTV9GTl9OQU1FIChmcjMwYmYseF9pbnZhbGlkKTsKLSNlbmRpZgotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvc2ltLWlmLmMgYi9zaW0vZnIzMC9zaW0taWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiMzQ0ZC4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9zaW0taWYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiBNYWluIHNpbXVsYXRvciBlbnRyeSBwb2ludHMgc3BlY2lmaWMgdG8gdGhlIEZSMzAuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0KLXN0YXRpYyB2b2lkIGZyZWVfc3RhdGUgKFNJTV9ERVNDKTsKLXN0YXRpYyB2b2lkIHByaW50X2ZyMzBfbWlzY19jcHUgKFNJTV9DUFUgKmNwdSwgaW50IHZlcmJvc2UpOwotCi0vKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIGZyMzBfZHVtcF9yZWdzIGNhbiBiZQotICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KLVNJTV9ERVNDIGN1cnJlbnRfc3RhdGU7Ci0MCi0vKiBDb3ZlciBmdW5jdGlvbiBvZiBzaW1fc3RhdGVfZnJlZSB0byBmcmVlIHRoZSBjcHUgYnVmZmVycyBhcyB3ZWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc3RhdGUgKFNJTV9ERVNDIHNkKQotewotICBpZiAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpCi0gICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgc2ltX2NwdV9mcmVlX2FsbCAoc2QpOwotICBzaW1fc3RhdGVfZnJlZSAoc2QpOwotfQotCi0vKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbXVsYXRvci4gICovCi0KLVNJTV9ERVNDCi1zaW1fb3BlbiAoa2luZCwgY2FsbGJhY2ssIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciBjOwotICBpbnQgaTsKLSAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKLQotICAvKiBUaGUgY3B1IGRhdGEgaXMga2VwdCBpbiBhIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeS4gICovCi0gIGlmIChzaW1fY3B1X2FsbG9jX2FsbCAoc2QsIDEsIGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyAoKSkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmIDAgLyogRklYTUU6IHBjIGlzIGluIG1hY2gtc3BlY2lmaWMgc3RydWN0ICovCi0gIC8qIEZJWE1FOiB3YXRjaHBvaW50cyBjb2RlIHNob3VsZG4ndCBuZWVkIHRoaXMgKi8KLSAgewotICAgIFNJTV9DUFUgKmN1cnJlbnRfY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7Ci0gICAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMgPSAmKFBDKTsKLSAgICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmIDAgLyogRklYTUU6ICd0d291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBkbyB0aGlzICovCi0gIC8qIFRoZXNlIG9wdGlvbnMgb3ZlcnJpZGUgYW55IG1vZHVsZSBvcHRpb25zLgotICAgICBPYnZpb3VzbHkgYW1iaWd1aXR5IHNob3VsZCBiZSBhdm9pZGVkLCBob3dldmVyIHRoZSBjYWxsZXIgbWF5IHdpc2ggdG8KLSAgICAgYXVnbWVudCB0aGUgbWVhbmluZyBvZiBhbiBvcHRpb24uICAqLwotICBpZiAoZXh0cmFfb3B0aW9ucyAhPSBOVUxMKQotICAgIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgZXh0cmFfb3B0aW9ucyk7Ci0jZW5kaWYKLQotICAvKiBnZXRvcHQgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBqdXN0IGhhdmUgdG8gZXhpdCBpZiB0aGlzIGZhaWxzLgotICAgICBGSVhNRTogSG1tbS4uLiAgaW4gdGhlIGNhc2Ugb2YgZ2RiIHdlIG5lZWQgZ2V0b3B0IHRvIGNhbGwKLSAgICAgcHJpbnRfZmlsdGVyZWQuICAqLwotICBpZiAoc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWYgMAotICAvKiBBbGxvY2F0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgb3RoZXIgZGV2aWNlcwotICAgICBpZiBubyBtZW1vcnkgZm9yIHRoYXQgcmFuZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotICAgICBBbGwgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgdG8ga2VlcCB0aGluZ3MgZnJvbSBiZWluZwotICAgICB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgKi8KLSAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCBGUjMwX0RFVklDRV9BRERSLCAxKSA9PSAwKQotICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCi0JCSAgICAgMCAvKmxldmVsKi8sCi0JCSAgICAgYWNjZXNzX3JlYWRfd3JpdGUsCi0JCSAgICAgMCAvKnNwYWNlID8/PyovLAotCQkgICAgIEZSMzBfREVWSUNFX0FERFIsIEZSMzBfREVWSUNFX0xFTiAvKm5yX2J5dGVzKi8sCi0JCSAgICAgMCAvKm1vZHVsbyovLAotCQkgICAgICZmcjMwX2RldmljZXMsCi0JCSAgICAgTlVMTCAvKmJ1ZmZlciovKTsKLSNlbmRpZgotCi0gIC8qIEFsbG9jYXRlIGNvcmUgbWFuYWdlZCBtZW1vcnkgaWYgbm9uZSBzcGVjaWZpZWQgYnkgdXNlci4KLSAgICAgVXNlIGFkZHJlc3MgNCBoZXJlIGluIGNhc2UgdGhlIHVzZXIgd2FudGVkIGFkZHJlc3MgMCB1bm1hcHBlZC4gICovCi0gIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIE5VTEwsIHJlYWRfbWFwLCAmYywgNCwgMSkgPT0gMCkKLSAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAwLDB4JWx4IiwgRlIzMF9ERUZBVUxUX01FTV9TSVpFKTsKLQotICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLwotICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCi0JCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAotCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCi0JCQkgICAgOiBOVUxMKSwKLQkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogRXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgKi8KLSAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE9wZW4gYSBjb3B5IG9mIHRoZSBjcHUgZGVzY3JpcHRvciB0YWJsZS4gICovCi0gIHsKLSAgICBDR0VOX0NQVV9ERVNDIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuXzEgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5wcmludGFibGVfbmFtZSwKLQkJCQkJICAgICBDR0VOX0VORElBTl9CSUcpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotICAgICAgewotCVNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGkpOwotCUNQVV9DUFVfREVTQyAoY3B1KSA9IGNkOwotCUNQVV9ESVNBU1NFTUJMRVIgKGNwdSkgPSBzaW1fY2dlbl9kaXNhc3NlbWJsZV9pbnNuOwotICAgICAgfQotICAgIGZyMzBfY2dlbl9pbml0X2RpcyAoY2QpOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNnZW4gdGhpbmdzIG5vdCBkb25lIGJ5IGNvbW1vbiBmcmFtZXdvcmsuCi0gICAgIE11c3QgYmUgZG9uZSBhZnRlciBmcjMwX2NnZW5fY3B1X29wZW4uICAqLwotICBjZ2VuX2luaXQgKHNkKTsKLQotICAvKiBTdG9yZSBpbiBhIGdsb2JhbCBzbyB0aGluZ3MgbGlrZSBzcGFyYzMyX2R1bXBfcmVncyBjYW4gYmUgaW52b2tlZAotICAgICBmcm9tIHRoZSBnZGIgY29tbWFuZCBsaW5lLiAgKi8KLSAgY3VycmVudF9zdGF0ZSA9IHNkOwotCi0gIHJldHVybiBzZDsKLX0KLQotdm9pZAotc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcXVpdHRpbmc7Ci17Ci0gIGZyMzBfY2dlbl9jcHVfY2xvc2UgKENQVV9DUFVfREVTQyAoU1RBVEVfQ1BVIChzZCwgMCkpKTsKLSAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLX0KLQwKLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudnApCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci0gICAgIGNoYXIgKiplbnZwOwotewotICBTSU1fQ1BVICpjdXJyZW50X2NwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotICBTSU1fQUREUiBhZGRyOwotCi0gIGlmIChhYmZkICE9IE5VTEwpCi0gICAgYWRkciA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBhZGRyID0gMDsKLSAgc2ltX3BjX3NldCAoY3VycmVudF9jcHUsIGFkZHIpOwotCi0jaWYgMAotICBTVEFURV9BUkdWIChzZCkgPSBzaW1fY29weV9hcmd2IChhcmd2KTsKLSAgU1RBVEVfRU5WUCAoc2QpID0gc2ltX2NvcHlfYXJndiAoZW52cCk7Ci0jZW5kaWYKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKmNtZDsKLXsgCi0gIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCi0gICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBjb21tYW5kIGAlcydcbiIsIGNtZCk7Ci19CmRpZmYgLS1naXQgYS9zaW0vZnIzMC9zaW0tbWFpbi5oIGIvc2ltL2ZyMzAvc2ltLW1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZjA4NS4uMDAwMDAwMAotLS0gYS9zaW0vZnIzMC9zaW0tbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogTWFpbiBoZWFkZXIgZm9yIHRoZSBmcjMwLiAgKi8KLQotI2RlZmluZSBVU0lOR19TSU1fQkFTRV9IIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0KLXN0cnVjdCBfc2ltX2NwdTsgLyogRklYTUU6IHNob3VsZCBiZSBpbiBzaW0tYmFzaWNzLmggKi8KLXR5cGVkZWYgc3RydWN0IF9zaW1fY3B1IFNJTV9DUFU7Ci0KLS8qIHNpbS1iYXNpY3MuaCBpbmNsdWRlcyBjb25maWcuaCBidXQgY2dlbi10eXBlcy5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlCi0gICBzaW0tYmFzaWNzLmggYW5kIGNnZW4tdHlwZXMuaCBuZWVkcyBjb25maWcuaC4gICovCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCi0jaW5jbHVkZSAiY2dlbi10eXBlcy5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAiYXJjaC5oIgotCi0vKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHNpbS1iYXNlLmguICAqLwotdHlwZWRlZiBVU0kgc2ltX2NpYTsKLQotI2RlZmluZSBDSUFfR0VUKGNwdSkgICAgIENQVV9QQ19HRVQgKGNwdSkKLSNkZWZpbmUgQ0lBX1NFVChjcHUsdmFsKSBDUFVfUENfU0VUICgoY3B1KSwgKHZhbCkpCi0KLSNpbmNsdWRlICJzaW0tYmFzZS5oIgotI2luY2x1ZGUgImNnZW4tc2ltLmgiCi0jaW5jbHVkZSAiZnIzMC1zaW0uaCIKLQwKLS8qIFRoZSBfc2ltX2NwdSBzdHJ1Y3QuICAqLwotCi1zdHJ1Y3QgX3NpbV9jcHUgewotICAvKiBzaW0vY29tbW9uIGNwdSBiYXNlLiAgKi8KLSAgc2ltX2NwdV9iYXNlIGJhc2U7Ci0KLSAgLyogU3RhdGljIHBhcnRzIG9mIGNnZW4uICAqLwotICBDR0VOX0NQVSBjZ2VuX2NwdTsKLQotICAvKiBDUFUgc3BlY2lmaWMgcGFydHMgZ28gaGVyZS4KLSAgICAgTm90ZSB0aGF0IGluIGZpbGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBhY2Nlc3MgdGhlc2UgcGllY2VzIFdBTlRfQ1BVX0ZPTwotICAgICB3b24ndCBiZSBkZWZpbmVkIGFuZCB0aHVzIHRoZXNlIHBhcnRzIHdvbid0IGFwcGVhci4gIFRoaXMgaXMgb2sgaW4gdGhlCi0gICAgIHNlbnNlIHRoYXQgdGhpbmdzIHdvcmsuICBJdCBpcyBhIHNvdXJjZSBvZiBidWdzIHRob3VnaC4KLSAgICAgT25lIGhhcyB0byBvZiBjb3Vyc2UgYmUgY2FyZWZ1bCB0byBub3QgdGFrZSB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgIHN0cnVjdCBhbmQgbm8gc3RydWN0dXJlIG1lbWJlcnMgYWNjZXNzZWQgaW4gbm9uLWNwdSBzcGVjaWZpYyBmaWxlcyBjYW4KLSAgICAgZ28gYWZ0ZXIgaGVyZS4gIE9oIGZvciBhIGJldHRlciBsYW5ndWFnZS4gICovCi0jaWYgZGVmaW5lZCAoV0FOVF9DUFVfRlIzMEJGKQotICBGUjMwQkZfQ1BVX0RBVEEgY3B1X2RhdGE7Ci0jZW5kaWYKLX07Ci0MCi0vKiBUaGUgc2ltX3N0YXRlIHN0cnVjdC4gICovCi0KLXN0cnVjdCBzaW1fc3RhdGUgewotICBzaW1fY3B1ICpjcHU7Ci0jZGVmaW5lIFNUQVRFX0NQVShzZCwgbikgKC8qJiovIChzZCktPmNwdSkKLQotICBDR0VOX1NUQVRFIGNnZW5fc3RhdGU7Ci0KLSAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKLX07Ci0MCi0vKiBNaXNjLiAgKi8KLQotLyogQ2F0Y2ggYWRkcmVzcyBleGNlcHRpb25zLiAgKi8KLWV4dGVybiBTSU1fQ09SRV9TSUdOQUxfRk4gZnIzMF9jb3JlX3NpZ25hbDsKLSNkZWZpbmUgU0lNX0NPUkVfU0lHTkFMKFNELENQVSxDSUEsTUFQLE5SX0JZVEVTLEFERFIsVFJBTlNGRVIsRVJST1IpIFwKLWZyMzBfY29yZV9zaWduYWwgKChTRCksIChDUFUpLCAoQ0lBKSwgKE1BUCksIChOUl9CWVRFUyksIChBRERSKSwgXAotCQkgIChUUkFOU0ZFUiksIChFUlJPUikpCi0KLS8qIERlZmF1bHQgbWVtb3J5IHNpemUuICAqLwotI2RlZmluZSBGUjMwX0RFRkFVTFRfTUVNX1NJWkUgMHg4MDAwMDAgLyogOE0gKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL3Rjb25maWcuaW4gYi9zaW0vZnIzMC90Y29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdlMjI3Li4wMDAwMDAwCi0tLSBhL3NpbS9mcjMwL3Rjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBGUjMwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAtKi0gQyAtKi0gKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBjYW4gdmFyeSB0aGUgc2l6ZSBvZiBtZW1vcnkuCi0gICBTZWUgdGhlIHh4eCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtbSBzaXplJyBvcHRpb24uCi0gICBUaGUgbWVtb3J5IHNpemUgaXMgc3RvcmVkIGluIFNUQVRFX01FTV9TSVpFLiAgKi8KLS8qIE5vdCB1c2VkIGZvciBGUjMwIHNpbmNlIHdlIHVzZSB0aGUgbWVtb3J5IG1vZHVsZS4gVE9ETyAtLSBjaGVjayB0aGlzICAqLwotLyogI2RlZmluZSBTSU1fSEFWRV9NRU1fU0laRSAqLwotCi0vKiBTZWUgc2ltLWhsb2FkLmMuICBXZSBwcm9wZXJseSBoYW5kbGUgTE1BLiAtLSBUT0RPOiBjaGVjayB0aGlzICovCi0jZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCi0KLS8qIEZvciBNU1BSIHN1cHBvcnQuICBGSVhNRTogcmV2aXNpdC4gICovCi0jZGVmaW5lIFdJVEhfREVWSUNFUyAxCi0KLS8qIEZJWE1FOiBSZXZpc2l0LiAgKi8KLSNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKLU1PRFVMRV9JTlNUQUxMX0ZOIGR2X3NvY2tzZXJfaW5zdGFsbDsKLSNkZWZpbmUgTU9EVUxFX0xJU1QgZHZfc29ja3Nlcl9pbnN0YWxsLAotI2VuZGlmCi0KLSNpZiAwCi0vKiBFbmFibGUgd2F0Y2hwb2ludHMuICAqLwotI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKLSNlbmRpZgotCi0vKiA/Pz8gVGVtcG9yYXJ5IGhhY2sgdW50aWwgbW9kZWwgc3VwcG9ydCB1bmlmaWVkLiAgKi8KLSNkZWZpbmUgU0lNX0hBVkVfTU9ERUwKLQotLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRyaW5zaWMgYnJlYWtwb2ludCBtZWNoYW5pc20uICovCi0vKiBGSVhNRTogbWF5IGJlIGFibGUgdG8gcmVtb3ZlIFNJTV9IQVZFX0JSRUFLUE9JTlRTIHNpbmNlIGl0IGVzc2VudGlhbGx5Ci0gICBkdXBsaWNhdGVzIGlmZGVmIFNJTV9CUkVBS1BPSU5UIChyaWdodD8pICovCi0jaWYgMAotI2RlZmluZSBTSU1fSEFWRV9CUkVBS1BPSU5UUwotI2RlZmluZSBTSU1fQlJFQUtQT0lOVCB7IDB4MTAsIDB4ZjEgfQotI2RlZmluZSBTSU1fQlJFQUtQT0lOVF9TSVpFIDIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcuICBEaWZmZXJlbnQgY3B1IGZhbWlsaWVzIGNhbid0IG1peC1uLW1hdGNoIC1zY2FjaGUKLSAgIGFuZCAtcGJiLiAgSG93ZXZlciBzb21lIGNwdSBmYW1pbGllcyBtYXkgdXNlIC1zaW1wbGUgd2hpbGUgb3RoZXJzIHVzZQotICAgb25lIG9mIC1zY2FjaGUvLXBiYi4gPz8/PyAqLwotI2RlZmluZSBXSVRIX1NDQUNIRV9QQkIgMQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvdHJhcHMuYyBiL3NpbS9mcjMwL3RyYXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2Q3YjkuLjAwMDAwMDAKLS0tIGEvc2ltL2ZyMzAvdHJhcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKiBmcjMwIGV4Y2VwdGlvbiwgaW50ZXJydXB0LCBhbmQgdHJhcCAoRUlUKSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInRhcmctdmFscy5oIgotI2luY2x1ZGUgImNnZW4tZW5naW5lLmgiCi0KLS8qIFRoZSBzZW1hbnRpYyBjb2RlIGludm9rZXMgdGhpcyBmb3IgaW52YWxpZCAodW5yZWNvZ25pemVkKSBpbnN0cnVjdGlvbnMuICAqLwotCi1TRU1fUEMKLXNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgSUFERFIgY2lhLCBTRU1fUEMgdnBjKQotewotICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOwotCi0jaWYgMAotICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCi0gICAgewotICAgICAgaF9ic21fc2V0IChjdXJyZW50X2NwdSwgaF9zbV9nZXQgKGN1cnJlbnRfY3B1KSk7Ci0gICAgICBoX2JpZV9zZXQgKGN1cnJlbnRfY3B1LCBoX2llX2dldCAoY3VycmVudF9jcHUpKTsKLSAgICAgIGhfYmNvbmRfc2V0IChjdXJyZW50X2NwdSwgaF9jb25kX2dldCAoY3VycmVudF9jcHUpKTsKLSAgICAgIC8qIHNtIG5vdCBjaGFuZ2VkICovCi0gICAgICBoX2llX3NldCAoY3VycmVudF9jcHUsIDApOwotICAgICAgaF9jb25kX3NldCAoY3VycmVudF9jcHUsIDApOwotCi0gICAgICBoX2JwY19zZXQgKGN1cnJlbnRfY3B1LCBjaWEpOwotCi0gICAgICBzaW1fZW5naW5lX3Jlc3RhcnQgKENQVV9TVEFURSAoY3VycmVudF9jcHUpLCBjdXJyZW50X2NwdSwgTlVMTCwKLQkJCSAgRUlUX1JTVkRfSU5TTl9BRERSKTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBjaWEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHSUxMKTsKLSAgcmV0dXJuIHZwYzsKLX0KLQotLyogUHJvY2VzcyBhbiBhZGRyZXNzIGV4Y2VwdGlvbi4gICovCi0KLXZvaWQKLWZyMzBfY29yZV9zaWduYWwgKFNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjdXJyZW50X2NwdSwgc2ltX2NpYSBjaWEsCi0JCSAgdW5zaWduZWQgaW50IG1hcCwgaW50IG5yX2J5dGVzLCBhZGRyZXNzX3dvcmQgYWRkciwKLQkJICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLCBzaW1fY29yZV9zaWduYWxzIHNpZykKLXsKLSNpZiAwCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICBoX2JzbV9zZXQgKGN1cnJlbnRfY3B1LCBoX3NtX2dldCAoY3VycmVudF9jcHUpKTsKLSAgICAgIGhfYmllX3NldCAoY3VycmVudF9jcHUsIGhfaWVfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgaF9iY29uZF9zZXQgKGN1cnJlbnRfY3B1LCBoX2NvbmRfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KLSAgICAgIGhfaWVfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0gICAgICBoX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0KLSAgICAgIGhfYnBjX3NldCAoY3VycmVudF9jcHUsIGNpYSk7Ci0KLSAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAotCQkJICBFSVRfQUREUl9FWENQX0FERFIpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgc2ltX2NvcmVfc2lnbmFsIChzZCwgY3VycmVudF9jcHUsIGNpYSwgbWFwLCBucl9ieXRlcywgYWRkciwKLQkJICAgICB0cmFuc2Zlciwgc2lnKTsKLX0KLQwKLS8qIFJlYWQvd3JpdGUgZnVuY3Rpb25zIGZvciBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UuICAqLwotCi1zdGF0aWMgaW50Ci1zeXNjYWxsX3JlYWRfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAotCQkgIHVuc2lnbmVkIGxvbmcgdGFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ5dGVzKQotewotICBTSU1fREVTQyBzZCA9IChTSU1fREVTQykgc2MtPnAxOwotICBTSU1fQ1BVICpjcHUgPSAoU0lNX0NQVSAqKSBzYy0+cDI7Ci0KLSAgcmV0dXJuIHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCByZWFkX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOwotfQotCi1zdGF0aWMgaW50Ci1zeXNjYWxsX3dyaXRlX21lbSAoaG9zdF9jYWxsYmFjayAqY2IsIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKLQkJICAgdW5zaWduZWQgbG9uZyB0YWRkciwgY29uc3QgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCi17Ci0gIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7Ci0gIFNJTV9DUFUgKmNwdSA9IChTSU1fQ1BVICopIHNjLT5wMjsKLQotICByZXR1cm4gc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChzZCwgY3B1LCB3cml0ZV9tYXAsIGJ1ZiwgdGFkZHIsIGJ5dGVzKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2ludCB0byBzYXZlIHRoZSBQUyBhbmQgUEMgYW5kIHNldHVwIGZvciBJTlQgYW5kIElOVEUuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfaW50IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjKQotewotICBVU0kgc3NwID0gZnIzMGJmX2hfZHJfZ2V0IChjdXJyZW50X2NwdSwgSF9EUl9TU1ApOwotICBVU0kgcHMgPSBmcjMwYmZfaF9wc19nZXQgKGN1cnJlbnRfY3B1KTsKLQotICBzc3AgLT0gNDsKLSAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgc3NwLCBwcyk7Ci0gIHNzcCAtPSA0OwotICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBzc3AsIHBjICsgMik7Ci0gIGZyMzBiZl9oX2RyX3NldCAoY3VycmVudF9jcHUsIEhfRFJfU1NQLCBzc3ApOwotICBmcjMwYmZfaF9zYml0X3NldCAoY3VycmVudF9jcHUsIDApOwotfQotCi0vKiBUcmFwIHN1cHBvcnQuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LgotICAgUHJlcHJvY2Vzc2luZyBsaWtlIHNhdmluZyB0aGUgdmFyaW91cyByZWdpc3RlcnMgaGFzIGFscmVhZHkgYmVlbiBkb25lLiAgKi8KLQotVVNJCi1mcjMwX2ludCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgaW50IG51bSkKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKLSAgaG9zdF9jYWxsYmFjayAqY2IgPSBTVEFURV9DQUxMQkFDSyAoc2QpOwotCi0jaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKLSAgLyogQ2hlY2sgZm9yIGJyZWFrcG9pbnRzICJvd25lZCIgYnkgdGhlIHNpbXVsYXRvciBmaXJzdCwgcmVnYXJkbGVzcwotICAgICBvZiAtLWVudmlyb25tZW50LiAgKi8KLSAgaWYgKG51bSA9PSBUUkFQX0JSRUFLUE9JTlQpCi0gICAgewotICAgICAgLyogRmlyc3QgdHJ5IHNpbS1icmVhay5jLiAgSWYgaXQncyBhIGJyZWFrcG9pbnQgdGhlIHNpbXVsYXRvciAib3ducyIKLQkgaXQgZG9lc24ndCByZXR1cm4uICBPdGhlcndpc2UgaXQgcmV0dXJucyBhbmQgbGV0J3MgdXMgdHJ5LiAgKi8KLSAgICAgIHNpbV9oYW5kbGVfYnJlYWtwb2ludCAoc2QsIGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV3IHBjIGlzIHRoZSB0cmFwIHZlY3RvciBlbnRyeS4KLQkgV2UgYXNzdW1lIHRoZXJlJ3MgYSBicmFuY2ggdGhlcmUgdG8gc29tZSBoYW5kbGVyLiAgKi8KLSAgICAgIFVTSSBuZXdfcGM7Ci0gICAgICBzZXR1cF9pbnQgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBmcjMwYmZfaF9pYml0X3NldCAoY3VycmVudF9jcHUsIDApOwotICAgICAgbmV3X3BjID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywKLQkJCSBmcjMwYmZfaF9kcl9nZXQgKGN1cnJlbnRfY3B1LCBIX0RSX1RCUikKLQkJCSArIDEwMjQgLSAoKG51bSArIDEpICogNCkpOwotICAgICAgcmV0dXJuIG5ld19wYzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW0pCi0gICAgewotICAgIGNhc2UgVFJBUF9TWVNDQUxMIDoKLSAgICAgIHsKLQkvKiBUT0RPOiBmaW5kIG91dCB3aGF0IHRoZSBBQkkgZm9yIHRoaXMgaXMgKi8KLQlDQl9TWVNDQUxMIHM7Ci0KLQlDQl9TWVNDQUxMX0lOSVQgKCZzKTsKLQlzLmZ1bmMgPSBmcjMwYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAwKTsKLQlzLmFyZzEgPSBmcjMwYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCA0KTsKLQlzLmFyZzIgPSBmcjMwYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCA1KTsKLQlzLmFyZzMgPSBmcjMwYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCA2KTsKLQotCWlmIChzLmZ1bmMgPT0gVEFSR0VUX1NZU19leGl0KQotCSAgewotCSAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgcGMsIHNpbV9leGl0ZWQsIHMuYXJnMSk7Ci0JICB9Ci0KLQlzLnAxID0gKFBUUikgc2Q7Ci0Jcy5wMiA9IChQVFIpIGN1cnJlbnRfY3B1OwotCXMucmVhZF9tZW0gPSBzeXNjYWxsX3JlYWRfbWVtOwotCXMud3JpdGVfbWVtID0gc3lzY2FsbF93cml0ZV9tZW07Ci0JY2Jfc3lzY2FsbCAoY2IsICZzKTsKLQlmcjMwYmZfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAyLCBzLmVycmNvZGUpOyAvKiBUT0RPOiBjaGVjayB0aGlzIG9uZSAqLwotCWZyMzBiZl9oX2dyX3NldCAoY3VycmVudF9jcHUsIDQsIHMucmVzdWx0KTsKLQlmcjMwYmZfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxLCBzLnJlc3VsdDIpOyAvKiBUT0RPOiBjaGVjayB0aGlzIG9uZSAqLwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBUUkFQX0JSRUFLUE9JTlQ6Ci0gICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgcGMsCi0JCSAgICAgICBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIHsKLQlVU0kgbmV3X3BjOwotCXNldHVwX2ludCAoY3VycmVudF9jcHUsIHBjKTsKLQlmcjMwYmZfaF9pYml0X3NldCAoY3VycmVudF9jcHUsIDApOwotCW5ld19wYyA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsCi0JCQkgICBmcjMwYmZfaF9kcl9nZXQgKGN1cnJlbnRfY3B1LCBIX0RSX1RCUikKLQkJCSAgICsgMTAyNCAtICgobnVtICsgMSkgKiA0KSk7Ci0JcmV0dXJuIG5ld19wYzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLyogRmFrZSBhbiAicmV0aSIgaW5zbi4KLSAgICAgU2luY2Ugd2UgZGlkbid0IHB1c2ggYW55dGhpbmcgdG8gc3RhY2ssIGFsbCB3ZSBuZWVkIHRvIGRvIGlzCi0gICAgIHVwZGF0ZSBwYy4gICovCi0gIHJldHVybiBwYyArIDI7Ci19Ci0KLVVTSQotZnIzMF9pbnRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBpbnQgbnVtKQotewotICAvKiBUaGUgbmV3IHBjIGlzIHRoZSB0cmFwICM5IHZlY3RvciBlbnRyeS4KLSAgICAgV2UgYXNzdW1lIHRoZXJlJ3MgYSBicmFuY2ggdGhlcmUgdG8gc29tZSBoYW5kbGVyLiAgKi8KLSAgVVNJIG5ld19wYzsKLSAgc2V0dXBfaW50IChjdXJyZW50X2NwdSwgcGMpOwotICBmcjMwYmZfaF9pbG1fc2V0IChjdXJyZW50X2NwdSwgNCk7Ci0gIG5ld19wYyA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsCi0JCSAgICAgZnIzMGJmX2hfZHJfZ2V0IChjdXJyZW50X2NwdSwgSF9EUl9UQlIpCi0JCSAgICAgKyAxMDI0IC0gKCg5ICsgMSkgKiA0KSk7Ci0gIHJldHVybiBuZXdfcGM7Ci19CmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvQ2hhbmdlTG9nIGIvc2ltL2g4MzAwL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5NzQxMC4uMDAwMDAwMAotLS0gYS9zaW0vaDgzMDAvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDIgMTg6MTU6NTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTE5OTktMDUtMDggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCQotMTk5OS0wNC0wMiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChQT0xMX1FVSVRfSU5URVJWQUwpOiBEZWZpbmUuIFVzZWQgdG8gdHdlYWsgdGhlCi0JZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBwb2xsX3F1aXQgY2FsbGJhY2sgaXMgdXNlZC4KLQkoc2ltX3Jlc3VtZSk6IFVzZSBQT0xMX1FVSVRfSU5URVJWQUwgaW5zdGVhZCBvZiBoYXJkLWNvZGVkIHZhbHVlLgotCi1UdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVN1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVN1biBBcHIgMjYgMTU6MjA6MTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgotCi1GcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1GcmkgQXByIDI0IDExOjE5OjQ2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgotCi1TYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgRmViIDE3IDEyOjQyOjE4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgTm92IDExIDE2OjUyOjA3IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21waWxlLmM6ICNpbmNsdWRlIHN0ZGlvLmggZm9yIGRlZmluaXRpb24gb2YgTlVMTCBvbgotCXNvbWUgcGxhdGZvcm1zLgotCi1XZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCi0gCXNpbV9sb2FkX2ZpbGUuCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMTcgMTI6MDA6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGlsZS5vKTogRGVwZW5kIG9uIGNvbmZpZy5oIGluIGxvY2FsIGRpcmVjdG9yeS4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAgOSAyMjoxNzoyNiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGluc3QuaCAoc2ltX3N0YXRlKTogcmVuYW1lIHRvIGg4MzAwX3NpbV9zdGF0ZSwgdG8gYXZvaWQgY29uZmxpY3QKLSAJd2l0aCBzaW0vY29tbW9uLgotCSogY29uZmlndXJlLmluOiBjaGVjayBmb3Igc3lzL3BhcmFtLmgKLQkqIGNvbXBpbGUuYzogI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0guCi0JI2RlZmluZSBTSUdUUkFQIGZvciB3aW5nZGIuCi0JKHNpbV9yZXN1bWUpOiBwb2xsIGtleWJvYXJkIGF0IGxlYXN0IG9uY2UgcGVyIGNhbGwuCi0JKHNpbV9yZXN1bWUpOiB1c2UgaG9zdF9jYWxsYmFjayBpbnN0ZWFkIG9mIHByaW50ZiBmb3Igc3lzY2FsbAotIAlvdXRwdXQuCi0KLVRodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1UdWUgQXVnIDI2IDEwOjM4OjQzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fa2lsbCk6IERlbGV0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgotIAkoc2ltX29wZW4sIHNpbV9sb2FkLCBzZXRfaDgzMDBoKTogQWRkIGZpeG1lIGV4cGxhaW5pbmcgd2h5IG11Y2ggb2YKLSAJdGhlIHNpbV9sb2FkIGNvZGUgc2hvdWxkIGJlIG1vdmVkIHRvIHNpbV9vcGVuLgotCi1Nb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotTW9uIEF1ZyAyNSAxNTo0Nzo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotVHVlIE1heSAyMCAxMDoxNjo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgotCi1XZWQgQXByIDMwIDEwOjIyOjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX2xvYWQpOiBDYWxsIGJmZF9nZXRfbWFjaCBpbnN0ZWFkIG9mIGV4YW1pbmluZwotCWJmZCBmaWVsZHMgZGlyZWN0bHkuCi0JKiB0Y29uZmlnLmluIChTSU1fUFJFX0xPQUQpOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgotCi1UaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIEFwciAxOCAxNDozMDowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IFVzZSBwb2xsX3F1aXQgY2FsbGJhY2suCi0JKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgQXByIDE3IDAzOjA2OjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgotCSogY29tcGlsZS5jIChzaW1fa2luZCwgbXluYW1lKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuCi0JKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIFVwZGF0ZSB0ZXN0IGZvciBoODMwMGguCi0JQ2FsbCBzaW1fbG9hZF9maWxlIHRvIGxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzCi0JZnJvbSBiZmQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgotCi1Nb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1XZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDE5IDAxOjE0OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLUZyaSBNYXIgMTQgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgTWFyIDEzIDEyOjQ4OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93IGluCi0JYXJndiBmb3JtLgotCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KLQotVHVlIEZlYiAgNCAxMzozNjoyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCi0JQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQotCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgotCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgotCW1ha2VmaWxlIGZyYWdtZW50LgotCi1XZWQgTm92IDIwIDAxOjM5OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fT0JKUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGluc3QuaCAoZW51bSBzaW1fc3RhdGUpOiBEZWZpbmUuCi0JKGNwdV9zdGF0ZV90eXBlKTogTmV3IG1lbWJlciBgc3RhdGUnLiAgU2V0IGl0IHdoZW5ldmVyIGBleGNlcHRpb24nCi0JaXMgc2V0LgotCSogY29tcGlsZS5jIChzaW1fY2FsbGJhY2spOiBOZXcgZ2xvYmFsLgotCShzaW1fc2V0X3NpbWNhY2hlX3NpemUpOiBSZW5hbWVkIGZyb20gc2ltX2NzaXplLgotCShzaW1fcmVzdW1lLCBjYXNlIE9fU0xFRVApOiBBZGQgcmlnaHQgd2F5IHRvIGRlY29kZSByMCBidXQgI2lmIDAgb3V0Ci0JJ2N1cyBpdCBjYW4ndCB3b3JrLiAgQ2hhbmdlIG1haW4gbG9vcCBleGl0IHRlc3QgdG8gdXNlIGNwdS5zdGF0ZS4KLQkoc2ltX3RyYWNlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fc3RvcF9yZWFzb24pOiBBZGQgcmlnaHQgd2F5IHRvIHNldCByZXN1bHRzLCBidXQgI2lmIDAgb3V0LgotCShzaW1fc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2luZm8pOiBSZWRpcmVjdCBjYWxscyB0byBwcmludGZfZmlsdGVyZWQgdGhyb3VnaCBjYWxsYmFjay4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBSZWNvcmQgY2FsbGJhY2suCi0JKiBydW4uYzogRGVsZXRlZCwgdXNpbmcgb25lIGluIC4uL2NvbW1vbiBub3cuCi0JKiB0Y29uZmlnLmluOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgMyAxNjoxMzoxOCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZyBoZXJlLgotCi1GcmkgQXVnICA5IDIyOjU5OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogcnRzLCBzbGVlcCwgYnB0IGFuZCBub3AgaGF2ZQotCW5vIGFzc29jaWF0ZWQgInNpemUiLgotCi1UdWUgSnVsICA5IDIyOjE1OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogRml4IGFsbCByb3RhdGUtYnktMi1iaXRzIGluc25zLgotCi1UdWUgSnVsICAyIDIzOjA4OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcnVuLmMgKG1haW4pOiBEb24ndCAibG9hZCIgc2VjdGlvbnMgd2hpY2ggZG9uJ3QgaGF2ZQotCVNFQ19MT0FEIHNldC4KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSwgY2FzZSAiT19OT1QiKTogVXNlIE9OT1QgaW5zdGVhZAotCW9mIE9TSElGVFMuCi0JKE9OT1QpOiBEZWZpbmUuCi0JKHNpbV9yZXN1bWUsIHNoaWZ0L3JvdGF0ZSBjYXNlcyk6IEFkZCBzdXBwb3J0IGZvciBzaGlmdC9yb3RhdGUKLQlieSB0d28gYml0cy4KLQkoT1NISUZUUyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1bCAgMiAwMTozNzoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEhhbmRsZSAibGRtLmwiIGFuZCAic3RtLmwiLgotCi1XZWQgSnVuIDI2IDA4OjU4OjUzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChoODMwMHNtb2RlKTogRGVjbGFyZS4KLQotV2VkIEp1biAyNiAxMjoyMDo1NiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVHVlIEp1biAxOCAxNjozMToxMCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFRyZWF0IHRoZSBIOC9TIGxpa2UgdGhlIEg4LzMwMEggZm9yIG5vdy4KLQkqIHJ1bi5jIChtYWluKTogVHJlYXQgdGhlIEg4L1MgbGlrZSB0aGUgSDgvMzAwSCBmb3Igbm93LgotCQotRnJpIE1heSAyNCAxMDozNToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoU0VYVENIQVIpOiBDbGVhciB1cHBlciBiaXRzIHdoZW4gc2lnbgotCWJpdCBpcyBjbGVhci4KLQotV2VkIE1heSAyMiAyMjoyMzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IENvcnJlY3RseSBoYW5kbGUgZGl2dS4KLQotVHVlIE1heSAgNyAwMjoxMzowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IE5ldmVyIGFsbG93IHRoZSBQQyB0byBoYXZlIGFuCi0Jb2RkIHZhbHVlLgotCi1GcmkgQXByIDEyIDE2OjUwOjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW5zdC5oOiBFeHBhbmQgb24gY29tbWVudHMgcmVnYXJkaW5nIEg4MzAwSF9NU0laRS4gIE5vdGUKLQlzZXBhcmF0ZSBtZW1vcnkgaXMgYWxsb2NhdGUgZm9yIHRoZSA4LWJpdCBhcmVhLgotCShzdHJ1Y3QgY3B1X3N0YXRlX3R5cGUpOiBBZGQgbmV3ICJlaWdodGJpdCcgZmllbGQuCi0JKiBjb21waWxlLmMgKEdFVF9NRU1PUllfTCk6IEhhbmRsZSBhY2Nlc3MgaW50byB0aGUgOC1iaXQKLQlhcmVhLgotCShHRVRfTUVNT1JZX1csIEdFVF9NRU1PUllfQik6IExpa2V3aXNlLgotCShTRVRfTUVNT1JZX0wsIFNFVF9NRU1PUllfVywgU0VUX01FTU9SWV9CKTogTGlrZXdpc2UuCi0JKGluaXRfcG9pbnRlcnMpOiBJbml0aWFsaXplIHNwYWNlIGZvciB0aGUgOC1iaXQgYXJlYS4KLQkoc2ltX3dyaXRlKTogSGFuZGxlIHdyaXRpbmcgaW50byB0aGUgOC1iaXQgYXJlYS4KLQkoc2ltX3JlYWQpOiBIYW5kbGUgcmVhZGluZyBmcm9tIHRoZSA4LWJpdCBhcmVhLgotCShzaW1fbG9hZCk6IFJlYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSA4LWJpdCBhcmVhLgotCi0JKiBjb21waWxlLmMgKHNpbV9sb2FkKTogUmUtYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2ltdWxhdG9yCi0JaGVyZS4KLQotRnJpIEFwciAxMiAwOTozOTo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBhbmQgc2ltcGxpZnkgb3ZlcmZsb3cgYW5kIGNhcnJ5Ci0JaGFuZGxpbmcgZm9yIDMyYml0IEFMVSBpbnNucy4KLQotTW9uIEFwciAgOCAyMzo1ODo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBvdmVyZmxvdyBjaGVja3MgZm9yIEFMVSBpbnNucy4KLQotRnJpIEFwciAgNSAxNzoyMDo1OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoZGVjb2RlKTogVXNlICJiaXQiIHRvIGhvbGQgTF8zIGltbWVkaWF0ZXMgaW5zdGVhZAotCW9mIGhvbGRpbmcgdGhlbSBpbiAiYWJzIi4gIEhhbmRsZSBBQlM4TUVNIG1lbW9yeSByZWZlcmVuY2VzIGFrYQotCTgtYml0IGFyZWEuICBSZXBsYWNlIEFCU01PViByZWZlcmVuY2VzIHdpdGggQUJTOE1FTS4KLQotV2VkIE1hciAxMyAxNzo0Mzo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoZmV0Y2gpOiBIYW5kbGUgYWNjZXNzZXMgdG8gdGhlIGV4Y2VwdGlvbi9mdW5jdGlvbgotCXZlY3RvcnMuCi0KLU1vbiBNYXIgMTEgMDk6NTM6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYzogI2luY2x1ZGUgIndhaXQuaCIuCi0gCShzaW1fcmVzdW1lLCBzbGVlcCBpbnNuKTogQ2hlY2sgcHJvZ3JhbSBleGl0IHN0YXR1cyBpbiByMC4KLQkoc2ltX3Jlc3VtZSwgc2hpZnQgaW5zbnMpOiBGaXggc2V0dGluZyBvZiBvdmVyZmxvdyBmbGFnIGZvciBzaGFsLgotCSogcnVuLmM6ICNpbmNsdWRlIDxzaWduYWwuaD4uCi0JKG1haW4pOiBBYm9ydCBpZiBwcm9ncmFtIGdvdCBTSUdJTEwuCi0JUHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBhcmd1bWVudCBpcyBpbnZhbGlkLgotCSh1c2FnZSk6IEltcHJvdmUgdGV4dC4KLQotV2VkIEZlYiAyMSAxMjoxNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotVGh1IEphbiAgNCAxMTo1Mjo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnN0LmggKE1QT1dFUixNU0laRSk6IERlbGV0ZWQuCi0JKEg4MzAweyxIfV9NU0laRSk6IERlZmluZS4KLQkqIGNvbXBpbGUuYyAobWVtb3J5X3NpemUpOiBOZXcgc3RhdGljIGdsb2JhbC4KLQkoaW5pdF9wb2ludGVycyk6IFNldCBtZW1vcnkgc2l6ZSBmcm9tIG9uZSBvZiBIODMwMHssSH1fTVNJWkUuCi0JKHNpbV93cml0ZSxzaW1fcmVhZCk6IFVzZSBtZW1vcnlfc2l6ZS4KLQotRnJpIE9jdCAxMyAxNTowMzoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogTmV3LgotCi1UdWUgT2N0IDEwIDExOjExOjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0KLVdlZCBTZXAgMjAgMTM6MzU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLUZyaSBTZXAgIDggMTI6MTg6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBEb24ndCB0cnkgdG8gdXNlCi0JYmZkL2hvc3RzLyouaCBmaWxlIG9yIGJmZC9jb25maWcvKi5taCBmaWxlLiAgQ2FsbCBBQ19QUk9HX0NDIGFuZAotCUFDX1BST0dfUkFOTElCLiAgU3Vic3RpdHV0ZSBpbiB2YWx1ZXMgZm9yIENGTEFHUywgSERFRklORVMgYW5kIEFSLgotCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyBmb3Igc3RkbGliLmggYW5kIHRpbWUuaC4gIFRvdWNoIHN0YW1wLmggaWYKLQljcmVhdGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluIChBUik6IERlZmluZSBhcyBAQVJALgotCShDQyk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NALgotCShDRkxBR1MpOiBEZWZpbmUgYXMgQENGTEFHU0AuCi0JKFJBTkxJQik6IERlZmluZSBhcyBAUkFOTElCQC4KLQkoSERFRklORVMsIFRERUZJTkVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKGNvbXBpbGUubywgcnVuLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgZGlzdGNsZWFuLgotCShjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCi0JKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4gIEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuCi0JaW52b2tpbmcgY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbXBpbGUuYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgRG9uJ3QgaW5jbHVkZSA8c3lzL3RpbWVzLmg+LgotCUluY2x1ZGUgPHRpbWUuaD4gYW5kIDxzdGRsaWIuaD4gaWYgdGhleSBleGlzdC4gIERvbid0IGluY2x1ZGUKLQkic3lzZGVwLmgiLgotCShnZXRfbm93KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBiLgotCSogcnVuLmM6IEluY2x1ZGUgImNvbmZpZy5oIi4gIEluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0JRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLgotCSogd3JpdGVjb2RlLmM6IERvbid0IGluY2x1ZGUgImJmZC5oIiBvciAic3lzZGVwLmgiLiAgSW5jbHVkZQotCTxzdGRpby5oPi4KLQotVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KLQotV2VkIEp1bCAgNSAxNDozMjo1NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBydW4uCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZS4KLQotCSogaDgzMDAubXQ6IFJlbW92ZWQuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGNvbnZlcnRlZCB0byBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dGNvbmYgMi40LgotCi1GcmkgSnVuIDMwIDE2OjUwOjI0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEp1biAyMCAxNjoxODoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKGdldF9ub3cpOiBEb24ndCBkbyBpZiB3aW4zMi4KLQkoc2ltX3Jlc3VtZSk6IFBvbGwgaW4gd2luMzIgdG9vLgotCi1XZWQgTWF5IDI0IDE2OjMxOjM4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotTW9uIE1hciAyNyAxMDozMjozNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jOiBwYXJzZSBhcmd1bWVudHMgd2l0aCBnZXRvcHQoKS4KLQotVHVlIEZlYiAyOCAxNzozMDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIC4uLy4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oIGlmIHNwZWNpZmljCi0JaG9zdCB1bmF2YWlsYWJsZS4KLQotU3VuIEphbiAyMiAxMjozNTo0MyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogSW5pdGlhbGl6ZSBjcHUubWFzay4KLQotVGh1IFNlcCAgOCAxNjo1MzowMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBpbnN0LmggKE1QT1dFUik6IEJ1bXAgc2ltdWxhdGVkIG1lbW9yeSBzaXplIHRvIDJeMTggYnl0ZXMuCi0KLVdlZCBNYXkgMTggMTM6NDc6NTggMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jOiAjaW5jbHVkZSAiYmZkLmgiLgotCShzaW1fKik6IFNldCByZXN1bHQgdHlwZSB0byB2b2lkIHdoZXJlIHRoZXJlIGlzbid0IG9uZS4KLQkoc2ltX3Jlc3VtZSwgZGVmYXVsdCBjYXNlKTogU2V0IGNwdS5leGNlcHRpb24gdG8gU0lHSUxMLgotCShzaW1fdHJhY2UpOiBEZWxldGUuCi0JKHNpbV9zZXRfcGMpOiBEZWxldGUuCi0JKHNpbV9pbmZvKTogRGVsZXRlIHByaW50Zl9mbiBhcmcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JQ2FsbCBwcmludGZfZmlsdGVyZWQuCi0JKHNldF9oODMwMGgpOiBOZXcgYXJnIGBmbGFnJywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJlbmFtZWQgZnJvbSBzaW1fc2V0X2FyZ3MsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKiBydW4uYzogI2luY2x1ZGUgPHZhcmFyZ3MuaD4sICJyZW1vdGUtc2ltLmgiLgotCShwcmludGZfZmlsdGVyZWQpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBNYXkgMTMgMTg6MzI6MjcgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChkZWNvZGUpOiBGaXggdHlwbyAoMTYgYml0IGJyYW5jaGVzKS4KLQkoKik6IFNvbWUgd2hpdGUgc3BhY2UgY2xlYW4gdXAuCi0KLUZyaSBNYXkgIDYgMTM6NDQ6MDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChkZWNvZGUpOiBDb21waWxlIDE2Yml0IGJyYW5jaGVzIHByb3Blcmx5LgotCi1TYXQgRGVjIDExIDE2OjMyOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmM6IFRpZHkgdXAgZm9ybWF0dGluZy4gKHNpbV9yZXN1bWUpOiBBZGQgb3JjLCB4b3JjLAotCWFuZGMuICBQb2xsIGZvciBpbnRlcnJ1cHRzLgotCi1UaHUgT2N0IDI4IDE5OjI5OjM0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYzogI2luY2x1ZGUgImFuc2lkZWNsLmgiIGZvciByZW1vdGUtc2ltLmguCi0KLVR1ZSBPY3QgMjYgMDk6NDM6MzYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkkKHNyY2RpcikvLi4vLi4vZ2RiCi0JKiBjb21waWxlLmM6ICNpbmNsdWRlICJyZW1vdGUtc2ltLmgiLgotCShzaW1fcmVzdW1lKTogTmV3IGFyZyBzaWdnbmFsLgotCShzaW1fd3JpdGUpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGFkZHIuCi0JQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShzaW1fcmVhZCk6IERpdHRvLgotCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBSZXN1bHQgaXMgdHlwZSBpbnQuCi0JKHNpbV9mZXRjaF9yZWdpc3Rlcik6IERpdHRvLgotCShzaW1fc3RvcF9yZWFzb24pOiBSZW5hbWVkIGZyb20gc2ltX3N0b3Bfc2lnbmFsLgotCShzaW1fc2V0X3BjKTogVXNlIFNJTV9BRERSIGZvciB0eXBlIG9mIGFyZyBwYy4KLQkoc2ltX2luZm8pOiBpbnQgcmVzdWx0LCBuZXcgYXJnIHByaW50Zl9mbi4KLQkoc2ltX2tpbGwpOiBpbnQgcmVzdWx0LgotCShzaW1fb3Blbik6IGludCByZXN1bHQsIG5ldyBhcmcgbmFtZS4KLQkqIHJ1bi5jIChtYWluKTogVXNlIHNpbV9zZXRfcGMgdG8gc2V0IHBjLgotCVVwZGF0ZSBjYWxsIHRvIHNpbV9pbmZvLgotCi1TYXQgT2N0IDIzIDE1OjAxOjE4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3N0b3Bfc2lnbmFsKTogUmVzdWx0IGlzIG5vdyBlbnVtIHNpbV9zdG9wLgotCi1GcmkgT2N0IDE1IDIzOjQ5OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmMgKHNpbV9raWxsLCBzaW1fb3Blbiwgc2ltX3NldF9hcmdzKTogTmV3IGZ1bmN0aW9ucy4KLQotVGh1IE9jdCAgNyAxNjoyNDoxMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmMgKHNpbV9zZXRfcGMpOiBXcml0ZSB0byB0aGUgcGMgZGlyZWNseS4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogTm93IHZhbHVlIGlzIHBhc3NlZCBieSByZWZlcmVuY2UuIChzaW1fcmVhZCwKLQlzaW1fd3JpdGUpOiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLQotVHVlIEF1ZyAxNyAwNzoxNjoxNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmMgKG1vcCk6IE5ldyBmdW5jdGlvbiB0byBkbyBtdWx0aXBsaWVzLgotCi1GcmkgSnVsIDE2IDEzOjUzOjUzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEFkZCBzdXBwb3J0IGZvciBub3AgaW5zbi4KLQotVGh1IEp1bCAxNSAwOTo1OTowMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmM6IFJlc2V0IEhNT0RFIGJhY2sgdG8gemVybyAoYWNjaWRlbnRseSBzZXQgaXQgdG8gMSkuCi0KLQkqIHJ1bi5jIChtYWluKTogSWYgaDgvMzAwaCBiaW5hcnkgZGV0ZWN0ZWQsIGNhbGwgc2V0X2g4MzAwaC4KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBPX05FRyBpbnNuLgotCi1GcmkgSnVsICA5IDE0OjM2OjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHJ1bi5jIChtYWluKTogQWRkIC1oIGZsYWcgdG8gZW5hYmxlIGg4LzMwMGggZW11bGF0aW9uLgotCSogY29tcGlsZS5jOiBSZW5hbWUgSG1vZGUgdG8gSE1PREUgKGNvbnNpc3RlbmN5IHdpdGggZ2RiKS4KLQkoc2V0X2g4MzAwaCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX3Jlc3VtZSk6IEFkZCBzdXBwb3J0IGZvciBleHR1LGV4dHMgaW5zbnMuCi0JKHNpbV9yZXN1bWUpOiBGaXggbG9naWNhbCByaWdodCBzaGlmdGluZy4KLQkoc2ltX3Jlc3VtZSwgbGFiZWwgYWx1MzIpOiBGaXggc2V0dGluZyBvZiBjYXJyeSBmbGFnLgotCQotU3VuIEp1bCAgNCAwMDozNTo0MSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmMgKHNpbV9jc2l6ZSk6IEluaXRpYWxpemUgY3B1LmNhY2hlLgotCi1GcmkgSnVsICAyIDE3OjQyOjU5IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgLUkuLi8uLi9iZmQgdG8gcGljayB1cCBiZmQuaC4KLQotVGh1IEp1biAyNCAxMzo0MDoxMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBydW4uYyAobWFpbik6IEZpeCBwYXJzaW5nIG9mIGFyZ3MuCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBzaGxsIGluc24uCi0KLVR1ZSBKdW4gIDggMTQ6MTY6NDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jOiBOZXcgZmlsZSwgc3VwcG9ydHMgSDgvMzAwSC4KLQkqIHAxLHAzLCBnZW5jb2RlLmMsIHN0YXRlLmgsIHdyaXRlY29kZS5jIEFsbCBkZWFkIGFuZCBvYnNvbGV0ZS4KLQotVHVlIEp1biAgMSAxMToxNDo1OSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcnVuLmMgKG1haW4pOiBBZGQgLXYgdG8gcHJpbnQgaW5mby4KLQkqIHAzLmMgKHNpbV9pbmZvKTogIE5ldyBmdW5jdGlvbi4KLQotTW9uIE1hciAxNSAxNTo0ODozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLm10IChET19JTlNUQUxMKTogUmVuYW1lZCBmcm9tIElOU1RBTEwuCi0KLVdlZCBNYXIgIDMgMTU6MDY6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IERvbid0IHVzZSBjYiBvciBpbmRlbnQKLQkqIHAxLmMsIHN0YXRlLmgsIHdyaXRlY29kZS5jOiBsaW50Ci0KLU1vbiBGZWIgIDEgMTY6NDQ6NTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBTdW5PUyBoYWxmZG9uZSBWUEFUSCB3b3JrLgotCSogcDEuYzogIExpbnQgcGlja2VkIHVwIGJ5IEhQIG5hdGl2ZSBjb21waWxlci4KLQotTW9uIEphbiAgNCAxMjozMjozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B3YWhpbmkuY3lnbnVzLmNvbSkKLQotCSogcDEuYyAoc2ltX3Jlc3VtZSk6IHdoZW4gcnVubmluZyBvbiBkb3MsIGFueSBjaGFyYWN0ZXIgdHlwZWQgdG8KLQl0aGUga2V5Ym9hcmQgd2lsbCBjYXVzZSBhIHNpbXVsYXRlZCBleGNlcHRpb24uCi0KLVN1biBKYW4gIDMgMTQ6MTU6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHAxLmMsIHAzLmMsIHJ1bi5jLCB3cml0ZWNvZGUuYzogYWxsIHVzZWQgaDgvMzAwIG9wY29kZXMgaW4gYW5kCi0JcnVubmluZwotCi1UdWUgRGVjIDIyIDEzOjU2OjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBuZXcgCi0KZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9NYWtlZmlsZS5pbiBiL3NpbS9oODMwMC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZTJlNi4uMDAwMDAwMAotLS0gYS9zaW0vaDgzMDAvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBoODMwMCBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1TSU1fT0JKUyA9IGNvbXBpbGUubyBzaW0tbG9hZC5vCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLWNvbXBpbGUubzogY29tcGlsZS5jIGNvbmZpZy5oCmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvYWNjb25maWcuaCBiL3NpbS9oODMwMC9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9oODMwMC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvY29tcGlsZS5jIGIvc2ltL2g4MzAwL2NvbXBpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNzU5ZC4uMDAwMDAwMAotLS0gYS9zaW0vaDgzMDAvY29tcGlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE3MyArMCwwIEBACi0vKgotICogU2ltdWxhdG9yIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAgYXJjaGl0ZWN0dXJlLgotICoKLSAqIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuIHNhY0BjeWdudXMuY29tCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSDgvMzAwIHNpbQotICoKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAotICoKLSAqIEN5Z251cyBvZmZlcnMgdGhlIGZvbGxvd2luZyBmb3IgdXNlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgQ3lnbnVzIG1ha2VzIG5vCi0gKiB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXRzIHBlcmZvcm1hbmNlIGFuZCB0aGUgdXNlcgotICogYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCi0gKgotICogQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTyBUSElTCi0gKiBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJ3YWl0LmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotI2lmbmRlZiBTSUdUUkFQCi0jIGRlZmluZSBTSUdUUkFQIDUKLSNlbmRpZgotCi1pbnQgZGVidWc7Ci0KLWhvc3RfY2FsbGJhY2sgKnNpbV9jYWxsYmFjazsKLQotc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7Ci1zdGF0aWMgY2hhciAqbXluYW1lOwotCi0vKiBGSVhNRTogTmVlZHMgdG8gbGl2ZSBpbiBoZWFkZXIgZmlsZS4KLSAgIFRoaXMgaGVhZGVyIHNob3VsZCBhbHNvIGluY2x1ZGUgdGhlIHRoaW5ncyBpbiByZW1vdGUtc2ltLmguCi0gICBPbmUgY291bGQgbW92ZSB0aGlzIHRvIHJlbW90ZS1zaW0uaCBidXQgdGhpcyBmdW5jdGlvbiBpc24ndCBuZWVkZWQKLSAgIGJ5IGdkYi4gICovCi12b2lkIHNpbV9zZXRfc2ltY2FjaGVfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSBYKG9wLCBzaXplKSAgb3AqNCtzaXplCi0KLSNkZWZpbmUgU1AgKGg4MzAwaG1vZGUgPyBTTDpTVykKLSNkZWZpbmUgU0IgMAotI2RlZmluZSBTVyAxCi0jZGVmaW5lIFNMIDIKLSNkZWZpbmUgT1BfUkVHIDEKLSNkZWZpbmUgT1BfREVDIDIKLSNkZWZpbmUgT1BfRElTUCAzCi0jZGVmaW5lIE9QX0lOQyA0Ci0jZGVmaW5lIE9QX1BDUkVMIDUKLSNkZWZpbmUgT1BfTUVNIDYKLSNkZWZpbmUgT1BfQ0NSIDcKLSNkZWZpbmUgT1BfSU1NIDgKLSNkZWZpbmUgT1BfQUJTIDEwCi0jZGVmaW5lIGg4X29wY29kZXMgb3BzCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgotCi0jaW5jbHVkZSAiaW5zdC5oIgotCi0vKiBUaGUgcmF0ZSBhdCB3aGljaCB0byBjYWxsIHRoZSBob3N0J3MgcG9sbF9xdWl0IGNhbGxiYWNrLiAqLwotCi0jZGVmaW5lIFBPTExfUVVJVF9JTlRFUlZBTCAweDgwMDAwCi0KLSNkZWZpbmUgTE9XX0JZVEUoeCkgKCh4KSAmIDB4ZmYpCi0jZGVmaW5lIEhJR0hfQllURSh4KSAoKCh4KT4+OCkgJiAweGZmKQotI2RlZmluZSBQKFgsWSkgKChYPDw4KSB8IFkpCi0KLSNkZWZpbmUgQlVJTERTUigpICAgY3B1LmNjciA9IChOIDw8IDMpIHwgKFogPDwgMikgfCAoVjw8MSkgfCBDOwotCi0jZGVmaW5lIEdFVFNSKCkJCSAgICBcCi0gIGMgPSAoY3B1LmNjciA+PiAwKSAmIDE7XAotICB2ID0gKGNwdS5jY3IgPj4gMSkgJiAxO1wKLSAgbnogPSAhKChjcHUuY2NyID4+IDIpICYgMSk7XAotICBuID0gKGNwdS5jY3IgPj4gMykgJiAxOwotCi0jaWZkZWYgX19DSEFSX0lTX1NJR05FRF9fCi0jZGVmaW5lIFNFWFRDSEFSKHgpICgoY2hhcikoeCkpCi0jZW5kaWYKLQotI2lmbmRlZiBTRVhUQ0hBUgotI2RlZmluZSBTRVhUQ0hBUih4KSAoKHggJiAweDgwKSA/ICh4IHwgfjB4ZmYpOiB4ICYgMHhmZikKLSNlbmRpZgotCi0jZGVmaW5lIFVFWFRDSEFSKHgpICgoeCkgJiAweGZmKQotI2RlZmluZSBVRVhUU0hPUlQoeCkgKCh4KSAmIDB4ZmZmZikKLSNkZWZpbmUgU0VYVFNIT1JUKHgpICgoc2hvcnQpKHgpKQotCi1zdGF0aWMgY3B1X3N0YXRlX3R5cGUgY3B1OwotCi1pbnQgaDgzMDBobW9kZSA9IDA7Ci1pbnQgaDgzMDBzbW9kZSA9IDA7Ci0KLXN0YXRpYyBpbnQgbWVtb3J5X3NpemU7Ci0KLQotc3RhdGljIGludAotZ2V0X25vdyAoKQotewotI2lmbmRlZiBXSU4zMgotICByZXR1cm4gdGltZSAoMCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vd19wZXJzZWMgKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotYml0ZnJvbSAoeCkKLXsKLSAgc3dpdGNoICh4ICYgU0laRSkKLSAgICB7Ci0gICAgY2FzZSBMXzg6Ci0gICAgICByZXR1cm4gU0I7Ci0gICAgY2FzZSBMXzE2OgotICAgICAgcmV0dXJuIFNXOwotICAgIGNhc2UgTF8zMjoKLSAgICAgIHJldHVybiBTTDsKLSAgICBjYXNlIExfUDoKLSAgICAgIHJldHVybiBoODMwMGhtb2RlID8gU0wgOiBTVzsKLSAgICB9Ci19Ci0KLXN0YXRpYwotdW5zaWduZWQgaW50Ci1sdmFsdWUgKHgsIHJuKQotewotICBzd2l0Y2ggKHggLyA0KQotICAgIHsKLSAgICBjYXNlIE9QX0RJU1A6Ci0gICAgICBpZiAocm4gPT0gOCkKLQl7Ci0JICByZXR1cm4gWCAoT1BfSU1NLCBTUCk7Ci0JfQotICAgICAgcmV0dXJuIFggKE9QX1JFRywgU1ApOwotCi0gICAgY2FzZSBPUF9NRU06Ci0KLSAgICAgIHJldHVybiBYIChPUF9NRU0sIFNQKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kZWNvZGUgKGFkZHIsIGRhdGEsIGRzdCkKLSAgICAgaW50IGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGRlY29kZWRfaW5zdCAqZHN0OwotCi17Ci0gIGludCBycyA9IDA7Ci0gIGludCByZCA9IDA7Ci0gIGludCByZGlzcCA9IDA7Ci0gIGludCBhYnMgPSAwOwotICBpbnQgcGxlbiA9IDA7Ci0gIGludCBiaXQgPSAwOwotCi0gIHN0cnVjdCBoOF9vcGNvZGUgKnEgPSBoOF9vcGNvZGVzOwotICBpbnQgc2l6ZSA9IDA7Ci0gIGRzdC0+ZHN0LnR5cGUgPSAtMTsKLSAgZHN0LT5zcmMudHlwZSA9IC0xOwotICAvKiBGaW5kIHRoZSBleGFjdCBvcGNvZGUvYXJnIGNvbWJvICovCi0gIHdoaWxlIChxLT5uYW1lKQotICAgIHsKLSAgICAgIG9wX3R5cGUgKm5pYjsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotCi0gICAgICBuaWIgPSBxLT5kYXRhLm5pYjsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgb3BfdHlwZSBsb29raW5nX2ZvciA9ICpuaWI7Ci0JICBpbnQgdGhpc25pYiA9IGRhdGFbbGVuID4+IDFdOwotCi0JICB0aGlzbmliID0gKGxlbiAmIDEpID8gKHRoaXNuaWIgJiAweGYpIDogKCh0aGlzbmliID4+IDQpICYgMHhmKTsKLQotCSAgaWYgKGxvb2tpbmdfZm9yIDwgMTYgJiYgbG9va2luZ19mb3IgPj0gMCkKLQkgICAgewotCSAgICAgIGlmIChsb29raW5nX2ZvciAhPSB0aGlzbmliKQotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMSkKLQkJewotCQkgIGlmICghKCgoaW50KSB0aGlzbmliICYgMHg4KSAhPSAwKSkKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkKLQkJCQkJICAgQjMxKTsKLQkJICB0aGlzbmliICY9IDB4NzsKLQkJfQotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMCkKLQkJewotCQkgIGlmICghKCgoaW50KSB0aGlzbmliICYgMHg4KSA9PSAwKSkKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkgQjMwKTsKLQkJfQotCSAgICAgIGlmIChsb29raW5nX2ZvciAmIERCSVQpCi0JCXsKLQkJICBpZiAoKGxvb2tpbmdfZm9yICYgNSkgIT0gKHRoaXNuaWIgJiA1KSkKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBhYnMgPSAodGhpc25pYiAmIDB4OCkgPyAyIDogMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgKFJFRyB8IElORCB8IElOQyB8IERFQykpCi0JCXsKLQkJICBpZiAobG9va2luZ19mb3IgJiBSRUcpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIENhbiB3b3JrIG91dCBzaXplIGZyb20gdGhlCi0JCSAgICAgICAqIHJlZ2lzdGVyCi0JCSAgICAgICAqLwotCQkgICAgICBzaXplID0gYml0ZnJvbSAobG9va2luZ19mb3IpOwotCQkgICAgfQotCQkgIGlmIChsb29raW5nX2ZvciAmIFNSQykKLQkJICAgIHsKLQkJICAgICAgcnMgPSB0aGlzbmliOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmQgPSB0aGlzbmliOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzE2KQotCQl7Ci0JCSAgYWJzID0gKGRhdGFbbGVuID4+IDFdKSAqIDI1NiArIGRhdGFbKGxlbiArIDIpID4+IDFdOwotCQkgIHBsZW4gPSAxNjsKLQkJICBpZiAobG9va2luZ19mb3IgJiAoUENSRUwgfCBESVNQKSkKLQkJICAgIHsKLQkJICAgICAgYWJzID0gKHNob3J0KSAoYWJzKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgQUJTSk1QKQotCQl7Ci0JCSAgYWJzID0KLQkJICAgIChkYXRhWzFdIDw8IDE2KQotCQkgICAgfCAoZGF0YVsyXSA8PCA4KQotCQkgICAgfCAoZGF0YVszXSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIE1FTUlORCkKLQkJewotCQkgIGFicyA9IGRhdGFbMV07Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMzIpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIGFicyA9IChkYXRhW2ldIDw8IDI0KQotCQkgICAgfCAoZGF0YVtpICsgMV0gPDwgMTYpCi0JCSAgICB8IChkYXRhW2kgKyAyXSA8PCA4KQotCQkgICAgfCAoZGF0YVtpICsgM10pOwotCi0JCSAgcGxlbiA9IDMyOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzI0KQotCQl7Ci0JCSAgaW50IGkgPSBsZW4gPj4gMTsKLQkJICBhYnMgPSAoZGF0YVtpXSA8PCAxNikgfCAoZGF0YVtpICsgMV0gPDwgOCkgfCAoZGF0YVtpICsgMl0pOwotCQkgIHBsZW4gPSAyNDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgSUdOT1JFKQotCQl7Ci0JCSAgLyogbm90aGluZyB0byBkbyAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBESVNQUkVHKQotCQl7Ci0JCSAgcmRpc3AgPSB0aGlzbmliICYgMHg3OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBLQklUKQotCQl7Ci0JCSAgc3dpdGNoICh0aGlzbmliKQotCQkgICAgewotCQkgICAgY2FzZSA5OgotCQkgICAgICBhYnMgPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgODoKLQkJICAgICAgYWJzID0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIGFicyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzgpCi0JCXsKLQkJICBwbGVuID0gODsKLQotCQkgIGlmIChsb29raW5nX2ZvciAmIFBDUkVMKQotCQkgICAgewotCQkgICAgICBhYnMgPSBTRVhUQ0hBUiAoZGF0YVtsZW4gPj4gMV0pOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgQUJTOE1FTSkKLQkJICAgIHsKLQkJICAgICAgcGxlbiA9IDg7Ci0JCSAgICAgIGFicyA9IGg4MzAwaG1vZGUgPyB+MHhmZjAwMDBmZiA6IH4weGZmZmYwMGZmOwotCQkgICAgICBhYnMgfD0gZGF0YVtsZW4gPj4gMV0gJiAweGZmIDsKLQkJICAgIH0KLQkJICAgZWxzZQotCQkgICAgewotCQkgICAgICBhYnMgPSBkYXRhW2xlbiA+PiAxXSAmIDB4ZmY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMykKLQkJewotCQkgIHBsZW4gPSAzOwotCi0JCSAgYml0ID0gdGhpc25pYjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yID09IEUpCi0JCXsKLQkJICBkc3QtPm9wID0gcTsKLQotCQkgIC8qIEZpbGwgaW4gdGhlIGFyZ3MgKi8KLQkJICB7Ci0JCSAgICBvcF90eXBlICphcmdzID0gcS0+YXJncy5uaWI7Ci0JCSAgICBpbnQgaGFkb25lID0gMDsKLQotCQkgICAgd2hpbGUgKCphcmdzICE9IEUpCi0JCSAgICAgIHsKLQkJCWludCB4ID0gKmFyZ3M7Ci0JCQlpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJZWFfdHlwZSAqcDsKLQotCQkJaWYgKHggJiBEU1QpCi0JCQkgIHsKLQkJCSAgICBwID0gJihkc3QtPmRzdCk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIHAgPSAmKGRzdC0+c3JjKTsKLQkJCSAgfQotCi0JCQlpZiAoeCAmIChMXzMpKQotCQkJICB7Ci0JCQkgICAgcC0+dHlwZSA9IFggKE9QX0lNTSwgc2l6ZSk7Ci0JCQkgICAgcC0+bGl0ZXJhbCA9IGJpdDsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIChJTU0gfCBLQklUIHwgREJJVCkpCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfSU1NLCBzaXplKTsKLQkJCSAgICBwLT5saXRlcmFsID0gYWJzOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUkVHKQotCQkJICB7Ci0JCQkgICAgLyogUmVzZXQgdGhlIHNpemUsIHNvbWUKLQkJCSAgICAgICBvcHMgKGxpa2UgbXVsKSBoYXZlIHR3byBzaXplcyAqLwotCi0JCQkgICAgc2l6ZSA9IGJpdGZyb20gKHgpOwotCQkJICAgIHAtPnR5cGUgPSBYIChPUF9SRUcsIHNpemUpOwotCQkJICAgIHAtPnJlZyA9IHJuOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgSU5DKQotCQkJICB7Ci0JCQkgICAgcC0+dHlwZSA9IFggKE9QX0lOQywgc2l6ZSk7Ci0JCQkgICAgcC0+cmVnID0gcm4gJiAweDc7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBERUMpCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfREVDLCBzaXplKTsKLQkJCSAgICBwLT5yZWcgPSBybiAmIDB4NzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIElORCkKLQkJCSAgewotCQkJICAgIHAtPnR5cGUgPSBYIChPUF9ESVNQLCBzaXplKTsKLQkJCSAgICBwLT5yZWcgPSBybiAmIDB4NzsKLQkJCSAgICBwLT5saXRlcmFsID0gMDsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIChBQlMgfCBBQlNKTVAgfCBBQlM4TUVNKSkKLQkJCSAgewotCQkJICAgIHAtPnR5cGUgPSBYIChPUF9ESVNQLCBzaXplKTsKLQkJCSAgICBwLT5saXRlcmFsID0gYWJzOwotCQkJICAgIHAtPnJlZyA9IDg7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBNRU1JTkQpCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfTUVNLCBzaXplKTsKLQkJCSAgICBwLT5saXRlcmFsID0gYWJzOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUENSRUwpCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfUENSRUwsIHNpemUpOwotCQkJICAgIHAtPmxpdGVyYWwgPSBhYnMgKyBhZGRyICsgMjsKLQkJCSAgICBpZiAoeCAmIExfMTYpCi0JCQkgICAgICBwLT5saXRlcmFsICs9IDI7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBBQlNKTVApCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfSU1NLCBTUCk7Ci0JCQkgICAgcC0+bGl0ZXJhbCA9IGFiczsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIERJU1ApCi0JCQkgIHsKLQkJCSAgICBwLT50eXBlID0gWCAoT1BfRElTUCwgc2l6ZSk7Ci0JCQkgICAgcC0+bGl0ZXJhbCA9IGFiczsKLQkJCSAgICBwLT5yZWcgPSByZGlzcCAmIDB4NzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIENDUikKLQkJCSAgewotCQkJICAgIHAtPnR5cGUgPSBPUF9DQ1I7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgcHJpbnRmICgiSG1tbW0gJXgiLCB4KTsKLQotCQkJYXJncysrOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCSAgLyoKLQkJICAgICAqIEJ1dCBhIGptcCBvciBhIGpzciBnZXRzCi0JCSAgICAgKiBhdXRvbWFnaWNhbGx5IGx2YWx1ZWQsIHNpbmNlIHdlCi0JCSAgICAgKiBicmFuY2ggdG8gdGhlaXIgYWRkcmVzcyBub3QgdGhlaXIKLQkJICAgICAqIGNvbnRlbnRzCi0JCSAgICovCi0JCSAgaWYgKHEtPmhvdyA9PSBPIChPX0pTUiwgU0IpCi0JCSAgICAgIHx8IHEtPmhvdyA9PSBPIChPX0pNUCwgU0IpKQotCQkgICAgewotCQkgICAgICBkc3QtPnNyYy50eXBlID0gbHZhbHVlIChkc3QtPnNyYy50eXBlLCBkc3QtPnNyYy5yZWcpOwotCQkgICAgfQotCi0JCSAgaWYgKGRzdC0+ZHN0LnR5cGUgPT0gLTEpCi0JCSAgICBkc3QtPmRzdCA9IGRzdC0+c3JjOwotCi0JCSAgZHN0LT5vcGNvZGUgPSBxLT5ob3c7Ci0JCSAgZHN0LT5jeWNsZXMgPSBxLT50aW1lOwotCi0JCSAgLyogQW5kIGEganNyIHRvIDB4YzQgaXMgdHVybmVkIGludG8gYSBtYWdpYyB0cmFwICovCi0KLQkJICBpZiAoZHN0LT5vcGNvZGUgPT0gTyAoT19KU1IsIFNCKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGRzdC0+c3JjLmxpdGVyYWwgPT0gMHhjNCkKLQkJCXsKLQkJCSAgZHN0LT5vcGNvZGUgPSBPIChPX1NZU0NBTEwsIFNCKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGRzdC0+bmV4dF9wYyA9IGFkZHIgKyBsZW4gLyAyOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHByaW50ZiAoIkRvbnQgdW5kZXJzdGFuZCAleCBcbiIsIGxvb2tpbmdfZm9yKTsKLQkJfQotCSAgICB9Ci0KLQkgIGxlbisrOwotCSAgbmliKys7Ci0JfQotCi0gICAgZmFpbDoKLSAgICAgIHErKzsKLSAgICB9Ci0KLSAgZHN0LT5vcGNvZGUgPSBPIChPX0lMTCwgU0IpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1jb21waWxlIChwYykKLXsKLSAgaW50IGlkeDsKLQotICAvKiBmaW5kIHRoZSBuZXh0IGNhY2hlIGVudHJ5IHRvIHVzZSAqLwotCi0gIGlkeCA9IGNwdS5jYWNoZV90b3AgKyAxOwotICBjcHUuY29tcGlsZXMrKzsKLSAgaWYgKGlkeCA+PSBjcHUuY3NpemUpCi0gICAgewotICAgICAgaWR4ID0gMTsKLSAgICB9Ci0gIGNwdS5jYWNoZV90b3AgPSBpZHg7Ci0KLSAgLyogVGhyb3cgYXdheSBpdHMgb2xkIG1lYW5pbmcgKi8KLSAgY3B1LmNhY2hlX2lkeFtjcHUuY2FjaGVbaWR4XS5vbGRwY10gPSAwOwotCi0gIC8qIHNldCB0byBuZXcgYWRkcmVzcyAqLwotICBjcHUuY2FjaGVbaWR4XS5vbGRwYyA9IHBjOwotCi0gIC8qIGZpbGwgaW4gaW5zdHJ1Y3Rpb24gaW5mbyAqLwotICBkZWNvZGUgKHBjLCBjcHUubWVtb3J5ICsgcGMsIGNwdS5jYWNoZSArIGlkeCk7Ci0KLSAgLyogcG9pbnQgdG8gbmV3IGNhY2hlIGVudHJ5ICovCi0gIGNwdS5jYWNoZV9pZHhbcGNdID0gaWR4OwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpicmVnWzE4XTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqd3JlZ1sxOF07Ci1zdGF0aWMgdW5zaWduZWQgaW50ICpscmVnWzE4XTsKLQotI2RlZmluZSBHRVRfQl9SRUcoeCkgKihicmVnW3hdKQotI2RlZmluZSBTRVRfQl9SRUcoeCx5KSAoKihicmVnW3hdKSkgPSAoeSkKLSNkZWZpbmUgR0VUX1dfUkVHKHgpICood3JlZ1t4XSkKLSNkZWZpbmUgU0VUX1dfUkVHKHgseSkgKCood3JlZ1t4XSkpID0gKHkpCi0KLSNkZWZpbmUgR0VUX0xfUkVHKHgpICoobHJlZ1t4XSkKLSNkZWZpbmUgU0VUX0xfUkVHKHgseSkgKCoobHJlZ1t4XSkpID0gKHkpCi0KLSNkZWZpbmUgR0VUX01FTU9SWV9MKHgpIFwKLSAgKHggPCBtZW1vcnlfc2l6ZSBcCi0gICA/ICgoY3B1Lm1lbW9yeVt4KzBdIDw8IDI0KSB8IChjcHUubWVtb3J5W3grMV0gPDwgMTYpIFwKLSAgICAgIHwgKGNwdS5tZW1vcnlbeCsyXSA8PCA4KSB8IGNwdS5tZW1vcnlbeCszXSkgXAotICAgOiAoKGNwdS5laWdodGJpdFsoeCswKSAmIDB4ZmZdIDw8IDI0KSB8IChjcHUuZWlnaHRiaXRbKHgrMSkgJiAweGZmXSA8PCAxNikgXAotICAgICAgfCAoY3B1LmVpZ2h0Yml0Wyh4KzIpICYgMHhmZl0gPDwgOCkgfCBjcHUuZWlnaHRiaXRbKHgrMykgJiAweGZmXSkpCi0KLSNkZWZpbmUgR0VUX01FTU9SWV9XKHgpIFwKLSAgKHggPCBtZW1vcnlfc2l6ZSBcCi0gICA/ICgoY3B1Lm1lbW9yeVt4KzBdIDw8IDgpIHwgKGNwdS5tZW1vcnlbeCsxXSA8PCAwKSkgXAotICAgOiAoKGNwdS5laWdodGJpdFsoeCswKSAmIDB4ZmZdIDw8IDgpIHwgKGNwdS5laWdodGJpdFsoeCsxKSAmIDB4ZmZdIDw8IDApKSkKLQotCi0jZGVmaW5lIEdFVF9NRU1PUllfQih4KSBcCi0gICh4IDwgbWVtb3J5X3NpemUgPyAoY3B1Lm1lbW9yeVt4XSkgOiAoY3B1LmVpZ2h0Yml0W3ggJiAweGZmXSkpCi0KLSNkZWZpbmUgU0VUX01FTU9SWV9MKHgseSkgIFwKLXsgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKl9wOyByZWdpc3RlciBpbnQgX195ID0geTsgXAotICAgX3AgPSAoeCA8IG1lbW9yeV9zaXplID8gY3B1Lm1lbW9yeSt4IDogY3B1LmVpZ2h0Yml0ICsgKHggJiAweGZmKSk7IFwKLSAgIF9wWzBdID0gKF9feSk+PjI0OyBfcFsxXSA9IChfX3kpPj4xNjsgXAotICAgX3BbMl0gPSAoX195KT4+ODsgX3BbM10gPSAoX195KT4+MDt9Ci0KLSNkZWZpbmUgU0VUX01FTU9SWV9XKHgseSkgXAoteyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqX3A7IHJlZ2lzdGVyIGludCBfX3kgPSB5OyBcCi0gICBfcCA9ICh4IDwgbWVtb3J5X3NpemUgPyBjcHUubWVtb3J5K3ggOiBjcHUuZWlnaHRiaXQgKyAoeCAmIDB4ZmYpKTsgXAotICAgX3BbMF0gPSAoX195KT4+ODsgX3BbMV0gPShfX3kpO30KLQotI2RlZmluZSBTRVRfTUVNT1JZX0IoeCx5KSBcCi0gICh4IDwgbWVtb3J5X3NpemUgPyAoY3B1Lm1lbW9yeVsoeCldID0geSkgOiAoY3B1LmVpZ2h0Yml0W3ggJiAweGZmXSA9IHkpKQotCi1pbnQKLWZldGNoIChhcmcsIG4pCi0gICAgIGVhX3R5cGUgKmFyZzsKLXsKLSAgaW50IHJuID0gYXJnLT5yZWc7Ci0gIGludCBhYnMgPSBhcmctPmxpdGVyYWw7Ci0gIGludCByOwotICBpbnQgdDsKLQotICBzd2l0Y2ggKGFyZy0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBYIChPUF9SRUcsIFNCKToKLSAgICAgIHJldHVybiBHRVRfQl9SRUcgKHJuKTsKLSAgICBjYXNlIFggKE9QX1JFRywgU1cpOgotICAgICAgcmV0dXJuIEdFVF9XX1JFRyAocm4pOwotICAgIGNhc2UgWCAoT1BfUkVHLCBTTCk6Ci0gICAgICByZXR1cm4gR0VUX0xfUkVHIChybik7Ci0gICAgY2FzZSBYIChPUF9JTU0sIFNCKToKLSAgICBjYXNlIFggKE9QX0lNTSwgU1cpOgotICAgIGNhc2UgWCAoT1BfSU1NLCBTTCk6Ci0gICAgICByZXR1cm4gYWJzOwotICAgIGNhc2UgWCAoT1BfREVDLCBTQik6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgWCAoT1BfSU5DLCBTQik6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybik7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgciA9IEdFVF9NRU1PUllfQiAodCk7Ci0gICAgICB0Kys7Ci0gICAgICB0ID0gdCAmIGNwdS5tYXNrOwotICAgICAgU0VUX0xfUkVHIChybiwgdCk7Ci0gICAgICByZXR1cm4gcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWCAoT1BfSU5DLCBTVyk6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybik7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgciA9IEdFVF9NRU1PUllfVyAodCk7Ci0gICAgICB0ICs9IDI7Ci0gICAgICB0ID0gdCAmIGNwdS5tYXNrOwotICAgICAgU0VUX0xfUkVHIChybiwgdCk7Ci0gICAgICByZXR1cm4gcjsKLSAgICBjYXNlIFggKE9QX0lOQywgU0wpOgotICAgICAgdCA9IEdFVF9MX1JFRyAocm4pOwotICAgICAgdCAmPSBjcHUubWFzazsKLSAgICAgIHIgPSBHRVRfTUVNT1JZX0wgKHQpOwotCi0gICAgICB0ICs9IDQ7Ci0gICAgICB0ID0gdCAmIGNwdS5tYXNrOwotICAgICAgU0VUX0xfUkVHIChybiwgdCk7Ci0gICAgICByZXR1cm4gcjsKLQotICAgIGNhc2UgWCAoT1BfRElTUCwgU0IpOgotICAgICAgdCA9IEdFVF9MX1JFRyAocm4pICsgYWJzOwotICAgICAgdCAmPSBjcHUubWFzazsKLSAgICAgIHJldHVybiBHRVRfTUVNT1JZX0IgKHQpOwotCi0gICAgY2FzZSBYIChPUF9ESVNQLCBTVyk6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybikgKyBhYnM7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgcmV0dXJuIEdFVF9NRU1PUllfVyAodCk7Ci0KLSAgICBjYXNlIFggKE9QX0RJU1AsIFNMKToKLSAgICAgIHQgPSBHRVRfTF9SRUcgKHJuKSArIGFiczsKLSAgICAgIHQgJj0gY3B1Lm1hc2s7Ci0gICAgICByZXR1cm4gR0VUX01FTU9SWV9MICh0KTsKLQotICAgIGNhc2UgWCAoT1BfTUVNLCBTTCk6Ci0gICAgICB0ID0gR0VUX01FTU9SWV9MIChhYnMpOwotICAgICAgdCAmPSBjcHUubWFzazsKLSAgICAgIHJldHVybiB0OwotCi0gICAgY2FzZSBYIChPUF9NRU0sIFNXKToKLSAgICAgIHQgPSBHRVRfTUVNT1JZX1cgKGFicyk7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgcmV0dXJuIHQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICB9Ci19Ci0KLQotc3RhdGljCi12b2lkCi1zdG9yZSAoYXJnLCBuKQotICAgICBlYV90eXBlICphcmc7Ci0gICAgIGludCBuOwotewotICBpbnQgcm4gPSBhcmctPnJlZzsKLSAgaW50IGFicyA9IGFyZy0+bGl0ZXJhbDsKLSAgaW50IHQ7Ci0KLSAgc3dpdGNoIChhcmctPnR5cGUpCi0gICAgewotICAgIGNhc2UgWCAoT1BfUkVHLCBTQik6Ci0gICAgICBTRVRfQl9SRUcgKHJuLCBuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWCAoT1BfUkVHLCBTVyk6Ci0gICAgICBTRVRfV19SRUcgKHJuLCBuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWCAoT1BfUkVHLCBTTCk6Ci0gICAgICBTRVRfTF9SRUcgKHJuLCBuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBYIChPUF9ERUMsIFNCKToKLSAgICAgIHQgPSBHRVRfTF9SRUcgKHJuKSAtIDE7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgU0VUX0xfUkVHIChybiwgdCk7Ci0gICAgICBTRVRfTUVNT1JZX0IgKHQsIG4pOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIFggKE9QX0RFQywgU1cpOgotICAgICAgdCA9IChHRVRfTF9SRUcgKHJuKSAtIDIpICYgY3B1Lm1hc2s7Ci0gICAgICBTRVRfTF9SRUcgKHJuLCB0KTsKLSAgICAgIFNFVF9NRU1PUllfVyAodCwgbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgWCAoT1BfREVDLCBTTCk6Ci0gICAgICB0ID0gKEdFVF9MX1JFRyAocm4pIC0gNCkgJiBjcHUubWFzazsKLSAgICAgIFNFVF9MX1JFRyAocm4sIHQpOwotICAgICAgU0VUX01FTU9SWV9MICh0LCBuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBYIChPUF9ESVNQLCBTQik6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybikgKyBhYnM7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgU0VUX01FTU9SWV9CICh0LCBuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBYIChPUF9ESVNQLCBTVyk6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybikgKyBhYnM7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgU0VUX01FTU9SWV9XICh0LCBuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBYIChPUF9ESVNQLCBTTCk6Ci0gICAgICB0ID0gR0VUX0xfUkVHIChybikgKyBhYnM7Ci0gICAgICB0ICY9IGNwdS5tYXNrOwotICAgICAgU0VUX01FTU9SWV9MICh0LCBuKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuaW9uCi17Ci0gIHNob3J0IGludCBpOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGxvdzsKLSAgICAgIGNoYXIgaGlnaDsKLSAgICB9Ci0gIHU7Ci19Ci0KLWxpdHRsZWVuZGlhbjsKLQotc3RhdGljCi12b2lkCi1pbml0X3BvaW50ZXJzICgpCi17Ci0gIHN0YXRpYyBpbnQgaW5pdDsKLQotICBpZiAoIWluaXQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGluaXQgPSAxOwotICAgICAgbGl0dGxlZW5kaWFuLmkgPSAxOwotCi0gICAgICBpZiAoaDgzMDBobW9kZSkKLQltZW1vcnlfc2l6ZSA9IEg4MzAwSF9NU0laRTsKLSAgICAgIGVsc2UKLQltZW1vcnlfc2l6ZSA9IEg4MzAwX01TSVpFOwotICAgICAgY3B1Lm1lbW9yeSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoc2l6ZW9mIChjaGFyKSwgbWVtb3J5X3NpemUpOwotICAgICAgY3B1LmNhY2hlX2lkeCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjYWxsb2MgKHNpemVvZiAoc2hvcnQpLCBtZW1vcnlfc2l6ZSk7Ci0gICAgICBjcHUuZWlnaHRiaXQgPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKHNpemVvZiAoY2hhciksIDI1Nik7Ci0KLSAgICAgIC8qIGBtc2l6ZScgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotICAgICAgaWYgKChtZW1vcnlfc2l6ZSAmIChtZW1vcnlfc2l6ZSAtIDEpKSAhPSAwKQotCWFib3J0ICgpOwotICAgICAgY3B1Lm1hc2sgPSBtZW1vcnlfc2l6ZSAtIDE7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCi0JewotCSAgY3B1LnJlZ3NbaV0gPSAwOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JICB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSk7Ci0JICB1bnNpZ25lZCBjaGFyICplID0gKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSArIDEpOwotCSAgdW5zaWduZWQgc2hvcnQgKnEgPSAodW5zaWduZWQgc2hvcnQgKikgKGNwdS5yZWdzICsgaSk7Ci0JICB1bnNpZ25lZCBzaG9ydCAqdSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY3B1LnJlZ3MgKyBpICsgMSk7Ci0JICBjcHUucmVnc1tpXSA9IDB4MDAxMTIyMzM7Ci0JICB3aGlsZSAocCA8IGUpCi0JICAgIHsKLQkgICAgICBpZiAoKnAgPT0gMHgyMikKLQkJewotCQkgIGJyZWdbaV0gPSBwOwotCQl9Ci0JICAgICAgaWYgKCpwID09IDB4MzMpCi0JCXsKLQkJICBicmVnW2kgKyA4XSA9IHA7Ci0JCX0KLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIHdoaWxlIChxIDwgdSkKLQkgICAgewotCSAgICAgIGlmICgqcSA9PSAweDIyMzMpCi0JCXsKLQkJICB3cmVnW2ldID0gcTsKLQkJfQotCSAgICAgIGlmICgqcSA9PSAweDAwMTEpCi0JCXsKLQkJICB3cmVnW2kgKyA4XSA9IHE7Ci0JCX0KLQkgICAgICBxKys7Ci0JICAgIH0KLQkgIGNwdS5yZWdzW2ldID0gMDsKLQkgIGxyZWdbaV0gPSAmY3B1LnJlZ3NbaV07Ci0JfQotCi0gICAgICBscmVnWzhdID0gJmNwdS5yZWdzWzhdOwotCi0gICAgICAvKiBpbml0aWFsaXplIHRoZSBzZWcgcmVnaXN0ZXJzICovCi0gICAgICBpZiAoIWNwdS5jYWNoZSkKLQlzaW1fc2V0X3NpbWNhY2hlX3NpemUgKENTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb250cm9sX2MgKHNpZywgY29kZSwgc2NwLCBhZGRyKQotICAgICBpbnQgc2lnOwotICAgICBpbnQgY29kZTsKLSAgICAgY2hhciAqc2NwOwotICAgICBjaGFyICphZGRyOwotewotICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfU1RPUFBFRDsKLSAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lOVDsKLX0KLQotI2RlZmluZSBDIChjICE9IDApCi0jZGVmaW5lIFogKG56ID09IDApCi0jZGVmaW5lIFYgKHYgIT0gMCkKLSNkZWZpbmUgTiAobiAhPSAwKQotCi1zdGF0aWMgaW50Ci1tb3AgKGNvZGUsIGJzaXplLCBzaWduKQotICAgICBkZWNvZGVkX2luc3QgKmNvZGU7Ci0gICAgIGludCBic2l6ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGludCBtdWx0aXBsaWVyOwotICBpbnQgbXVsdGlwbGljYW5kOwotICBpbnQgcmVzdWx0OwotICBpbnQgbiwgbno7Ci0KLSAgaWYgKHNpZ24pCi0gICAgewotICAgICAgbXVsdGlwbGljYW5kID0KLQlic2l6ZSA/IFNFWFRDSEFSIChHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpKSA6Ci0JU0VYVFNIT1JUIChHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpKTsKLSAgICAgIG11bHRpcGxpZXIgPQotCWJzaXplID8gU0VYVENIQVIgKEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZykpIDoKLQlTRVhUU0hPUlQgKEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG11bHRpcGxpY2FuZCA9IGJzaXplID8gVUVYVENIQVIgKEdFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZykpIDoKLQlVRVhUU0hPUlQgKEdFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZykpOwotICAgICAgbXVsdGlwbGllciA9Ci0JYnNpemUgPyBVRVhUQ0hBUiAoR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKSkgOgotCVVFWFRTSE9SVCAoR0VUX1dfUkVHIChjb2RlLT5zcmMucmVnKSk7Ci0KLSAgICB9Ci0gIHJlc3VsdCA9IG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7Ci0KLSAgaWYgKHNpZ24pCi0gICAgewotICAgICAgbiA9IHJlc3VsdCAmIChic2l6ZSA/IDB4ODAwMCA6IDB4ODAwMDAwMDApOwotICAgICAgbnogPSByZXN1bHQgJiAoYnNpemUgPyAweGZmZmYgOiAweGZmZmZmZmZmKTsKLSAgICB9Ci0gIGlmIChic2l6ZSkKLSAgICB7Ci0gICAgICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIHJlc3VsdCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU0VUX0xfUkVHIChjb2RlLT5kc3QucmVnLCByZXN1bHQpOwotICAgIH0KLS8qICByZXR1cm4gKChuPT0xKSA8PCAxKSB8IChuej09MSk7ICovCi0KLX0KLQotI2RlZmluZSBPTk9UKG5hbWUsIGhvdykgXAotY2FzZSBPKG5hbWUsIFNCKToJCQkJXAotewkJCQkJCVwKLSAgaW50IHQ7CQkJCQlcCi0gIGludCBobSA9IDB4ODA7CQkJCVwKLSAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpOwkJXAotICBob3c7IAkJCQkJCVwKLSAgZ290byBzaGlmdDg7CQkJCQlcCi19IAkJCQkJCVwKLWNhc2UgTyhuYW1lLCBTVyk6CQkJCVwKLXsgCQkJCQkJXAotICBpbnQgdDsJCQkJCVwKLSAgaW50IGhtID0gMHg4MDAwOwkJCQlcCi0gIHJkID0gR0VUX1dfUkVHIChjb2RlLT5zcmMucmVnKTsgCQlcCi0gIGhvdzsgCQkJCQkJXAotICBnb3RvIHNoaWZ0MTY7CQkJCQlcCi19IAkJCQkJCVwKLWNhc2UgTyhuYW1lLCBTTCk6CQkJCVwKLXsJCQkJCQlcCi0gIGludCB0OwkJCQkJXAotICBpbnQgaG0gPSAweDgwMDAwMDAwOyAJCQkJXAotICByZCA9IEdFVF9MX1JFRyAoY29kZS0+c3JjLnJlZyk7CQlcCi0gIGhvdzsgCQkJCQkJXAotICBnb3RvIHNoaWZ0MzI7CQkJCQlcCi19Ci0KLSNkZWZpbmUgT1NISUZUUyhuYW1lLCBob3cxLCBob3cyKSBcCi1jYXNlIE8obmFtZSwgU0IpOgkJCQlcCi17CQkJCQkJXAotICBpbnQgdDsJCQkJCVwKLSAgaW50IGhtID0gMHg4MDsJCQkJXAotICByZCA9IEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZyk7CQlcCi0gIGlmICgoR0VUX01FTU9SWV9CIChwYyArIDEpICYgMHg0MCkgPT0gMCkJXAotICAgIHsJCQkJCQlcCi0gICAgICBob3cxOwkJCQkJXAotICAgIH0JCQkJCQlcCi0gIGVsc2UJCQkJCQlcCi0gICAgewkJCQkJCVwKLSAgICAgIGhvdzI7CQkJCQlcCi0gICAgfQkJCQkJCVwKLSAgZ290byBzaGlmdDg7CQkJCQlcCi19IAkJCQkJCVwKLWNhc2UgTyhuYW1lLCBTVyk6CQkJCVwKLXsgCQkJCQkJXAotICBpbnQgdDsJCQkJCVwKLSAgaW50IGhtID0gMHg4MDAwOwkJCQlcCi0gIHJkID0gR0VUX1dfUkVHIChjb2RlLT5zcmMucmVnKTsgCQlcCi0gIGlmICgoR0VUX01FTU9SWV9CIChwYyArIDEpICYgMHg0MCkgPT0gMCkJXAotICAgIHsJCQkJCQlcCi0gICAgICBob3cxOwkJCQkJXAotICAgIH0JCQkJCQlcCi0gIGVsc2UJCQkJCQlcCi0gICAgewkJCQkJCVwKLSAgICAgIGhvdzI7CQkJCQlcCi0gICAgfQkJCQkJCVwKLSAgZ290byBzaGlmdDE2OwkJCQkJXAotfSAJCQkJCQlcCi1jYXNlIE8obmFtZSwgU0wpOgkJCQlcCi17CQkJCQkJXAotICBpbnQgdDsJCQkJCVwKLSAgaW50IGhtID0gMHg4MDAwMDAwMDsgCQkJCVwKLSAgcmQgPSBHRVRfTF9SRUcgKGNvZGUtPnNyYy5yZWcpOwkJXAotICBpZiAoKEdFVF9NRU1PUllfQiAocGMgKyAxKSAmIDB4NDApID09IDApCVwKLSAgICB7CQkJCQkJXAotICAgICAgaG93MTsJCQkJCVwKLSAgICB9CQkJCQkJXAotICBlbHNlCQkJCQkJXAotICAgIHsJCQkJCQlcCi0gICAgICBob3cyOwkJCQkJXAotICAgIH0JCQkJCQlcCi0gIGdvdG8gc2hpZnQzMjsJCQkJCVwKLX0KLQotI2RlZmluZSBPQklUT1AobmFtZSxmLCBzLCBvcCkgCQkJXAotY2FzZSAgTyhuYW1lLCBTQik6CQkJCVwKLXsJCQkJCQlcCi0gIGludCBtOwkJCQkJXAotICBpbnQgYjsgCQkJCQlcCi0gIGlmIChmKSBlYSA9IGZldGNoICgmY29kZS0+ZHN0KTsJCVwKLSAgbT0xPDwgZmV0Y2goJmNvZGUtPnNyYyk7CQkJXAotICBvcDsJCQkJCQlcCi0gIGlmKHMpIHN0b3JlICgmY29kZS0+ZHN0LGVhKTsgZ290byBuZXh0OwlcCi19Ci0KLWludAotc2ltX3N0b3AgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7Ci0gIGNwdS5leGNlcHRpb24gPSBTSUdJTlQ7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0gIHN0YXRpYyBpbnQgaW5pdDE7Ci0gIGludCBjeWNsZXMgPSAwOwotICBpbnQgaW5zdHMgPSAwOwotICBpbnQgdGlja19zdGFydCA9IGdldF9ub3cgKCk7Ci0gIHZvaWQgKCpwcmV2KSAoKTsKLSAgaW50IHBvbGxfY291bnQgPSAwOwotICBpbnQgcmVzOwotICBpbnQgdG1wOwotICBpbnQgcmQ7Ci0gIGludCBlYTsKLSAgaW50IGJpdDsKLSAgaW50IHBjOwotICBpbnQgYywgbnosIHYsIG47Ci0gIGludCBvbGRtYXNrOwotICBpbml0X3BvaW50ZXJzICgpOwotCi0gIHByZXYgPSBzaWduYWwgKFNJR0lOVCwgY29udHJvbF9jKTsKLQotICBpZiAoc3RlcCkKLSAgICB7Ci0gICAgICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfU1RPUFBFRDsKLSAgICAgIGNwdS5leGNlcHRpb24gPSBTSUdUUkFQOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9SVU5OSU5HOwotICAgICAgY3B1LmV4Y2VwdGlvbiA9IDA7Ci0gICAgfQotCi0gIHBjID0gY3B1LnBjOwotCi0gIC8qIFRoZSBQQyBzaG91bGQgbmV2ZXIgYmUgb2RkLiAgKi8KLSAgaWYgKHBjICYgMHgxKQotICAgIGFib3J0ICgpOwotCi0gIEdFVFNSICgpOwotICBvbGRtYXNrID0gY3B1Lm1hc2s7Ci0gIGlmICghaDgzMDBobW9kZSkKLSAgICBjcHUubWFzayA9IDB4ZmZmZjsKLSAgZG8KLSAgICB7Ci0gICAgICBpbnQgY2lkeDsKLSAgICAgIGRlY29kZWRfaW5zdCAqY29kZTsKLQotICAgIHRvcDoKLSAgICAgIGNpZHggPSBjcHUuY2FjaGVfaWR4W3BjXTsKLSAgICAgIGNvZGUgPSBjcHUuY2FjaGUgKyBjaWR4OwotCi0KLSNkZWZpbmUgQUxVT1AoU1RPUkUsIE5BTUUsIEhPVykgXAotICAgIGNhc2UgTyhOQU1FLFNCKTogIEhPVzsgaWYoU1RPUkUpZ290byBhbHU4O2Vsc2UgZ290byBqdXN0X2ZsYWdzX2FsdTg7ICBcCi0gICAgY2FzZSBPKE5BTUUsIFNXKTogSE9XOyBpZihTVE9SRSlnb3RvIGFsdTE2O2Vsc2UgZ290byBqdXN0X2ZsYWdzX2FsdTE2OyBcCi0gICAgY2FzZSBPKE5BTUUsU0wpOiAgSE9XOyBpZihTVE9SRSlnb3RvIGFsdTMyO2Vsc2UgZ290byBqdXN0X2ZsYWdzX2FsdTMyOwotCi0KLSNkZWZpbmUgTE9HT1AoTkFNRSwgSE9XKSBcCi0gICAgY2FzZSBPKE5BTUUsU0IpOiBIT1c7IGdvdG8gbG9nODtcCi0gICAgY2FzZSBPKE5BTUUsIFNXKTogSE9XOyBnb3RvIGxvZzE2O1wKLSAgICBjYXNlIE8oTkFNRSxTTCk6IEhPVzsgZ290byBsb2czMjsKLQotCi0KLSNpZiBBREVCVUcKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCIleCAlZCAlc1xuIiwgcGMsIGNvZGUtPm9wY29kZSwKLQkJICBjb2RlLT5vcCA/IGNvZGUtPm9wLT5uYW1lIDogIioqIik7Ci0JfQotICAgICAgY3B1LnN0YXRzW2NvZGUtPm9wY29kZV0rKzsKLQotI2VuZGlmCi0KLSAgICAgIGN5Y2xlcyArPSBjb2RlLT5jeWNsZXM7Ci0gICAgICBpbnN0cysrOwotICAgICAgc3dpdGNoIChjb2RlLT5vcGNvZGUpCi0JewotCWNhc2UgMDoKLQkgIC8qCi0JICAgKiBUaGlzIG9wY29kZSBpcyBhIGZha2UgZm9yIHdoZW4gd2UgZ2V0IHRvIGFuCi0JICAgKiBpbnN0cnVjdGlvbiB3aGljaCBoYXNudCBiZWVuIGNvbXBpbGVkCi0JICAgKi8KLQkgIGNvbXBpbGUgKHBjKTsKLQkgIGdvdG8gdG9wOwotCSAgYnJlYWs7Ci0KLQotCWNhc2UgTyAoT19TVUJYLCBTQik6Ci0JICByZCA9IGZldGNoICgmY29kZS0+ZHN0KTsKLQkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgZWEgPSAtKGVhICsgQyk7Ci0JICByZXMgPSByZCArIGVhOwotCSAgZ290byBhbHU4OwotCi0JY2FzZSBPIChPX0FERFgsIFNCKToKLQkgIHJkID0gZmV0Y2ggKCZjb2RlLT5kc3QpOwotCSAgZWEgPSBmZXRjaCAoJmNvZGUtPnNyYyk7Ci0JICBlYSA9IEMgKyBlYTsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBnb3RvIGFsdTg7Ci0KLSNkZWZpbmUgRUEgICAgZWEgPSBmZXRjaCgmY29kZS0+c3JjKTsKLSNkZWZpbmUgUkRfRUEgZWEgPSBmZXRjaCgmY29kZS0+c3JjKTsgcmQgPSBmZXRjaCgmY29kZS0+ZHN0KTsKLQotCSAgQUxVT1AgKDEsIE9fU1VCLCBSRF9FQTsKLQkJIGVhID0gLWVhOwotCQkgcmVzID0gcmQgKyBlYSk7Ci0JICBBTFVPUCAoMSwgT19ORUcsIEVBOwotCQkgZWEgPSAtZWE7Ci0JCSByZCA9IDA7Ci0JCSByZXMgPSByZCArIGVhKTsKLQotCWNhc2UgTyAoT19BREQsIFNCKToKLQkgIHJkID0gR0VUX0JfUkVHIChjb2RlLT5kc3QucmVnKTsKLQkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIGdvdG8gYWx1ODsKLQljYXNlIE8gKE9fQURELCBTVyk6Ci0JICByZCA9IEdFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZyk7Ci0JICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBnb3RvIGFsdTE2OwotCWNhc2UgTyAoT19BREQsIFNMKToKLQkgIHJkID0gR0VUX0xfUkVHIChjb2RlLT5kc3QucmVnKTsKLQkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIGdvdG8gYWx1MzI7Ci0KLQotCSAgTE9HT1AgKE9fQU5ELCBSRF9FQTsKLQkJIHJlcyA9IHJkICYgZWEpOwotCi0JICBMT0dPUCAoT19PUiwgUkRfRUE7Ci0JCSByZXMgPSByZCB8IGVhKTsKLQotCSAgTE9HT1AgKE9fWE9SLCBSRF9FQTsKLQkJIHJlcyA9IHJkIF4gZWEpOwotCi0KLQljYXNlIE8gKE9fTU9WX1RPX01FTSwgU0IpOgotCSAgcmVzID0gR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKTsKLQkgIGdvdG8gbG9nODsKLQljYXNlIE8gKE9fTU9WX1RPX01FTSwgU1cpOgotCSAgcmVzID0gR0VUX1dfUkVHIChjb2RlLT5zcmMucmVnKTsKLQkgIGdvdG8gbG9nMTY7Ci0JY2FzZSBPIChPX01PVl9UT19NRU0sIFNMKToKLQkgIHJlcyA9IEdFVF9MX1JFRyAoY29kZS0+c3JjLnJlZyk7Ci0JICBnb3RvIGxvZzMyOwotCi0KLQljYXNlIE8gKE9fTU9WX1RPX1JFRywgU0IpOgotCSAgcmVzID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgU0VUX0JfUkVHIChjb2RlLT5kc3QucmVnLCByZXMpOwotCSAgZ290byBqdXN0X2ZsYWdzX2xvZzg7Ci0JY2FzZSBPIChPX01PVl9UT19SRUcsIFNXKToKLQkgIHJlcyA9IGZldGNoICgmY29kZS0+c3JjKTsKLQkgIFNFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKLQkgIGdvdG8ganVzdF9mbGFnc19sb2cxNjsKLQljYXNlIE8gKE9fTU9WX1RPX1JFRywgU0wpOgotCSAgcmVzID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgU0VUX0xfUkVHIChjb2RlLT5kc3QucmVnLCByZXMpOwotCSAgZ290byBqdXN0X2ZsYWdzX2xvZzMyOwotCi0KLQljYXNlIE8gKE9fQUREUywgU0wpOgotCSAgU0VUX0xfUkVHIChjb2RlLT5kc3QucmVnLAotCQkgICAgIEdFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZykKLQkJICAgICArIGNvZGUtPnNyYy5saXRlcmFsKTsKLQotCSAgZ290byBuZXh0OwotCi0JY2FzZSBPIChPX1NVQlMsIFNMKToKLQkgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywKLQkJICAgICBHRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcpCi0JCSAgICAgLSBjb2RlLT5zcmMubGl0ZXJhbCk7Ci0JICBnb3RvIG5leHQ7Ci0KLQljYXNlIE8gKE9fQ01QLCBTQik6Ci0JICByZCA9IGZldGNoICgmY29kZS0+ZHN0KTsKLQkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgZWEgPSAtZWE7Ci0JICByZXMgPSByZCArIGVhOwotCSAgZ290byBqdXN0X2ZsYWdzX2FsdTg7Ci0KLQljYXNlIE8gKE9fQ01QLCBTVyk6Ci0JICByZCA9IGZldGNoICgmY29kZS0+ZHN0KTsKLQkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOwotCSAgZWEgPSAtZWE7Ci0JICByZXMgPSByZCArIGVhOwotCSAgZ290byBqdXN0X2ZsYWdzX2FsdTE2OwotCi0JY2FzZSBPIChPX0NNUCwgU0wpOgotCSAgcmQgPSBmZXRjaCAoJmNvZGUtPmRzdCk7Ci0JICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKLQkgIGVhID0gLWVhOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIGdvdG8ganVzdF9mbGFnc19hbHUzMjsKLQotCi0JY2FzZSBPIChPX0RFQywgU0IpOgotCSAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpOwotCSAgZWEgPSAtMTsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBTRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcsIHJlcyk7Ci0JICBnb3RvIGp1c3RfZmxhZ3NfaW5jODsKLQotCWNhc2UgTyAoT19ERUMsIFNXKToKLQkgIHJkID0gR0VUX1dfUkVHIChjb2RlLT5kc3QucmVnKTsKLQkgIGVhID0gLWNvZGUtPnNyYy5saXRlcmFsOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIFNFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKLQkgIGdvdG8ganVzdF9mbGFnc19pbmMxNjsKLQotCWNhc2UgTyAoT19ERUMsIFNMKToKLQkgIHJkID0gR0VUX0xfUkVHIChjb2RlLT5kc3QucmVnKTsKLQkgIGVhID0gLWNvZGUtPnNyYy5saXRlcmFsOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKLQkgIGdvdG8ganVzdF9mbGFnc19pbmMzMjsKLQotCi0JY2FzZSBPIChPX0lOQywgU0IpOgotCSAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpOwotCSAgZWEgPSAxOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIFNFVF9CX1JFRyAoY29kZS0+c3JjLnJlZywgcmVzKTsKLQkgIGdvdG8ganVzdF9mbGFnc19pbmM4OwotCi0JY2FzZSBPIChPX0lOQywgU1cpOgotCSAgcmQgPSBHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpOwotCSAgZWEgPSBjb2RlLT5zcmMubGl0ZXJhbDsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7Ci0JICBnb3RvIGp1c3RfZmxhZ3NfaW5jMTY7Ci0KLQljYXNlIE8gKE9fSU5DLCBTTCk6Ci0JICByZCA9IEdFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZyk7Ci0JICBlYSA9IGNvZGUtPnNyYy5saXRlcmFsOwotCSAgcmVzID0gcmQgKyBlYTsKLQkgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKLQkgIGdvdG8ganVzdF9mbGFnc19pbmMzMjsKLQotCi0jZGVmaW5lIEdFVF9DQ1IoeCkgQlVJTERTUigpO3ggPSBjcHUuY2NyCi0KLQljYXNlIE8gKE9fQU5EQywgU0IpOgotCSAgR0VUX0NDUiAocmQpOwotCSAgZWEgPSBjb2RlLT5zcmMubGl0ZXJhbDsKLQkgIHJlcyA9IHJkICYgZWE7Ci0JICBnb3RvIHNldGM7Ci0KLQljYXNlIE8gKE9fT1JDLCBTQik6Ci0JICBHRVRfQ0NSIChyZCk7Ci0JICBlYSA9IGNvZGUtPnNyYy5saXRlcmFsOwotCSAgcmVzID0gcmQgfCBlYTsKLQkgIGdvdG8gc2V0YzsKLQotCWNhc2UgTyAoT19YT1JDLCBTQik6Ci0JICBHRVRfQ0NSIChyZCk7Ci0JICBlYSA9IGNvZGUtPnNyYy5saXRlcmFsOwotCSAgcmVzID0gcmQgXiBlYTsKLQkgIGdvdG8gc2V0YzsKLQotCi0JY2FzZSBPIChPX0JSQSwgU0IpOgotCSAgaWYgKDEpCi0JICAgIGdvdG8gY29uZHRydWU7Ci0JICBnb3RvIG5leHQ7Ci0KLQljYXNlIE8gKE9fQlJOLCBTQik6Ci0JICBpZiAoMCkKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQotCWNhc2UgTyAoT19CSEksIFNCKToKLQkgIGlmICgoQyB8fCBaKSA9PSAwKQotCSAgICBnb3RvIGNvbmR0cnVlOwotCSAgZ290byBuZXh0OwotCi0KLQljYXNlIE8gKE9fQkxTLCBTQik6Ci0JICBpZiAoKEMgfHwgWikpCi0JICAgIGdvdG8gY29uZHRydWU7Ci0JICBnb3RvIG5leHQ7Ci0KLQljYXNlIE8gKE9fQkNTLCBTQik6Ci0JICBpZiAoKEMgPT0gMSkpCi0JICAgIGdvdG8gY29uZHRydWU7Ci0JICBnb3RvIG5leHQ7Ci0KLQljYXNlIE8gKE9fQkNDLCBTQik6Ci0JICBpZiAoKEMgPT0gMCkpCi0JICAgIGdvdG8gY29uZHRydWU7Ci0JICBnb3RvIG5leHQ7Ci0KLQljYXNlIE8gKE9fQkVRLCBTQik6Ci0JICBpZiAoWikKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQljYXNlIE8gKE9fQkdULCBTQik6Ci0JICBpZiAoKChaIHx8IChOIF4gVikpID09IDApKQotCSAgICBnb3RvIGNvbmR0cnVlOwotCSAgZ290byBuZXh0OwotCi0KLQljYXNlIE8gKE9fQkxFLCBTQik6Ci0JICBpZiAoKChaIHx8IChOIF4gVikpID09IDEpKQotCSAgICBnb3RvIGNvbmR0cnVlOwotCSAgZ290byBuZXh0OwotCi0JY2FzZSBPIChPX0JHRSwgU0IpOgotCSAgaWYgKChOIF4gVikgPT0gMCkKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQljYXNlIE8gKE9fQkxULCBTQik6Ci0JICBpZiAoKE4gXiBWKSkKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQljYXNlIE8gKE9fQk1JLCBTQik6Ci0JICBpZiAoKE4pKQotCSAgICBnb3RvIGNvbmR0cnVlOwotCSAgZ290byBuZXh0OwotCWNhc2UgTyAoT19CTkUsIFNCKToKLQkgIGlmICgoWiA9PSAwKSkKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQotCWNhc2UgTyAoT19CUEwsIFNCKToKLQkgIGlmIChOID09IDApCi0JICAgIGdvdG8gY29uZHRydWU7Ci0JICBnb3RvIG5leHQ7Ci0JY2FzZSBPIChPX0JWQywgU0IpOgotCSAgaWYgKChWID09IDApKQotCSAgICBnb3RvIGNvbmR0cnVlOwotCSAgZ290byBuZXh0OwotCWNhc2UgTyAoT19CVlMsIFNCKToKLQkgIGlmICgoViA9PSAxKSkKLQkgICAgZ290byBjb25kdHJ1ZTsKLQkgIGdvdG8gbmV4dDsKLQotCWNhc2UgTyAoT19TWVNDQUxMLCBTQik6Ci0JICB7Ci0JICAgIGNoYXIgYyA9IGNwdS5yZWdzWzJdOwotCSAgICBzaW1fY2FsbGJhY2stPndyaXRlX3N0ZG91dCAoc2ltX2NhbGxiYWNrLCAmYywgMSk7Ci0JICB9Ci0JICBnb3RvIG5leHQ7Ci0KLQkgIE9OT1QgKE9fTk9ULCByZCA9IH5yZDsgdiA9IDA7KTsKLQkgIE9TSElGVFMgKE9fU0hMTCwKLQkJICAgYyA9IHJkICYgaG07IHYgPSAwOyByZCA8PD0gMSwKLQkJICAgYyA9IHJkICYgKGhtID4+IDEpOyB2ID0gMDsgcmQgPDw9IDIpOwotCSAgT1NISUZUUyAoT19TSExSLAotCQkgICBjID0gcmQgJiAxOyB2ID0gMDsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAxLAotCQkgICBjID0gcmQgJiAyOyB2ID0gMDsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAyKTsKLQkgIE9TSElGVFMgKE9fU0hBTCwKLQkJICAgYyA9IHJkICYgaG07IHYgPSAocmQgJiBobSkgIT0gKChyZCAmIChobSA+PiAxKSkgPDwgMSk7IHJkIDw8PSAxLAotCQkgICBjID0gcmQgJiAoaG0gPj4gMSk7IHYgPSAocmQgJiAoaG0gPj4gMSkpICE9ICgocmQgJiAoaG0gPj4gMikpIDw8IDIpOyByZCA8PD0gMik7Ci0JICBPU0hJRlRTIChPX1NIQVIsCi0JCSAgIHQgPSByZCAmIGhtOyBjID0gcmQgJiAxOyB2ID0gMDsgcmQgPj49IDE7IHJkIHw9IHQsCi0JCSAgIHQgPSByZCAmIGhtOyBjID0gcmQgJiAyOyB2ID0gMDsgcmQgPj49IDI7IHJkIHw9IHQgfCB0ID4+IDEgKTsKLQkgIE9TSElGVFMgKE9fUk9UTCwKLQkJICAgYyA9IHJkICYgaG07IHYgPSAwOyByZCA8PD0gMTsgcmQgfD0gQywKLQkJICAgYyA9IHJkICYgaG07IHYgPSAwOyByZCA8PD0gMTsgcmQgfD0gQzsgYyA9IHJkICYgaG07IHJkIDw8PSAxOyByZCB8PSBDKTsKLQkgIE9TSElGVFMgKE9fUk9UUiwKLQkJICAgYyA9IHJkICYgMTsgdiA9IDA7IHJkID0gKHVuc2lnbmVkIGludCkgcmQgPj4gMTsgaWYgKGMpIHJkIHw9IGhtLAotCQkgICBjID0gcmQgJiAxOyB2ID0gMDsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAxOyBpZiAoYykgcmQgfD0gaG07IGMgPSByZCAmIDE7IHJkID0gKHVuc2lnbmVkIGludCkgcmQgPj4gMTsgaWYgKGMpIHJkIHw9IGhtKTsKLQkgIE9TSElGVFMgKE9fUk9UWEwsCi0JCSAgIHQgPSByZCAmIGhtOyByZCA8PD0gMTsgcmQgfD0gQzsgYyA9IHQ7IHYgPSAwLAotCQkgICB0ID0gcmQgJiBobTsgcmQgPDw9IDE7IHJkIHw9IEM7IGMgPSB0OyB2ID0gMDsgdCA9IHJkICYgaG07IHJkIDw8PSAxOyByZCB8PSBDOyBjID0gdCk7Ci0JICBPU0hJRlRTIChPX1JPVFhSLAotCQkgICB0ID0gcmQgJiAxOyByZCA9ICh1bnNpZ25lZCBpbnQpIHJkID4+IDE7IGlmIChDKSByZCB8PSBobTsgYyA9IHQ7IHYgPSAwLAotCQkgICB0ID0gcmQgJiAxOyByZCA9ICh1bnNpZ25lZCBpbnQpIHJkID4+IDE7IGlmIChDKSByZCB8PSBobTsgYyA9IHQ7IHYgPSAwOyB0ID0gcmQgJiAxOyByZCA9ICh1bnNpZ25lZCBpbnQpIHJkID4+IDE7IGlmIChDKSByZCB8PSBobTsgYyA9IHQpOwotCi0JY2FzZSBPIChPX0pNUCwgU0IpOgotCSAgewotCSAgICBwYyA9IGZldGNoICgmY29kZS0+c3JjKTsKLQkgICAgZ290byBlbmQ7Ci0KLQkgIH0KLQotCWNhc2UgTyAoT19KU1IsIFNCKToKLQkgIHsKLQkgICAgaW50IHRtcDsKLQkgICAgcGMgPSBmZXRjaCAoJmNvZGUtPnNyYyk7Ci0JICBjYWxsOgotCSAgICB0bXAgPSBjcHUucmVnc1s3XTsKLQotCSAgICBpZiAoaDgzMDBobW9kZSkKLQkgICAgICB7Ci0JCXRtcCAtPSA0OwotCQlTRVRfTUVNT1JZX0wgKHRtcCwgY29kZS0+bmV4dF9wYyk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0bXAgLT0gMjsKLQkJU0VUX01FTU9SWV9XICh0bXAsIGNvZGUtPm5leHRfcGMpOwotCSAgICAgIH0KLQkgICAgY3B1LnJlZ3NbN10gPSB0bXA7Ci0KLQkgICAgZ290byBlbmQ7Ci0JICB9Ci0JY2FzZSBPIChPX0JTUiwgU0IpOgotCSAgcGMgPSBjb2RlLT5zcmMubGl0ZXJhbDsKLQkgIGdvdG8gY2FsbDsKLQotCWNhc2UgTyAoT19SVFMsIFNOKToKLQkgIHsKLQkgICAgaW50IHRtcDsKLQotCSAgICB0bXAgPSBjcHUucmVnc1s3XTsKLQotCSAgICBpZiAoaDgzMDBobW9kZSkKLQkgICAgICB7Ci0JCXBjID0gR0VUX01FTU9SWV9MICh0bXApOwotCQl0bXAgKz0gNDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXBjID0gR0VUX01FTU9SWV9XICh0bXApOwotCQl0bXAgKz0gMjsKLQkgICAgICB9Ci0KLQkgICAgY3B1LnJlZ3NbN10gPSB0bXA7Ci0JICAgIGdvdG8gZW5kOwotCSAgfQotCi0JY2FzZSBPIChPX0lMTCwgU0IpOgotCSAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7Ci0JICBjcHUuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgZ290byBlbmQ7Ci0JY2FzZSBPIChPX1NMRUVQLCBTTik6Ci0JICAvKiBUaGUgZm9ybWF0IG9mIHIwIGlzIGRlZmluZWQgYnkgZGV2by9pbmNsdWRlL3dhaXQuaC4gICovCi0jaWYgMCAvKiBGSVhNRTogVWdoLiAgQSBicmVha3BvaW50IGlzIHRoZSBzbGVlcCBpbnNuLiAgKi8KLQkgIGlmIChXSUZFWElURUQgKGNwdS5yZWdzWzBdKSkKLQkgICAgewotCSAgICAgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9FWElURUQ7Ci0JICAgICAgY3B1LmV4Y2VwdGlvbiA9IFdFWElUU1RBVFVTIChjcHUucmVnc1swXSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFdJRlNUT1BQRUQgKGNwdS5yZWdzWzBdKSkKLQkgICAgewotCSAgICAgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOwotCSAgICAgIGNwdS5leGNlcHRpb24gPSBXU1RPUFNJRyAoY3B1LnJlZ3NbMF0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfU0lHTkFMTEVEOwotCSAgICAgIGNwdS5leGNlcHRpb24gPSBXVEVSTVNJRyAoY3B1LnJlZ3NbMF0pOwotCSAgICB9Ci0jZWxzZQotCSAgLyogRklYTUU6IERvZXNuJ3QgdGhpcyBicmVhayBmb3IgYnJlYWtwb2ludHMgd2hlbiByMAotCSAgICAgY29udGFpbnMganVzdCB0aGUgcmlnaHQgKGVyLCB3cm9uZykgdmFsdWU/ICAqLwotCSAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7Ci0JICBpZiAoISBXSUZFWElURUQgKGNwdS5yZWdzWzBdKSAmJiBXSUZTSUdOQUxFRCAoY3B1LnJlZ3NbMF0pKQotCSAgICBjcHUuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgZWxzZQotCSAgICBjcHUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLSNlbmRpZgotCSAgZ290byBlbmQ7Ci0JY2FzZSBPIChPX0JQVCwgU04pOgotCSAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7Ci0JICBjcHUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLQkgIGdvdG8gZW5kOwotCi0JICBPQklUT1AgKE9fQk5PVCwgMSwgMSwgZWEgXj0gbSk7Ci0JICBPQklUT1AgKE9fQlRTVCwgMSwgMCwgbnogPSBlYSAmIG0pOwotCSAgT0JJVE9QIChPX0JDTFIsIDEsIDEsIGVhICY9IH5tKTsKLQkgIE9CSVRPUCAoT19CU0VULCAxLCAxLCBlYSB8PSBtKTsJCi0JICBPQklUT1AgKE9fQkxELCAxLCAwLCBjID0gZWEgJiBtKTsKLQkgIE9CSVRPUCAoT19CSUxELCAxLCAwLCBjID0gIShlYSAmIG0pKTsKLQkgIE9CSVRPUCAoT19CU1QsIDEsIDEsIGVhICY9IH5tOwotCQkgIGlmIChDKSBlYSB8PSBtKTsKLQkgIE9CSVRPUCAoT19CSVNULCAxLCAxLCBlYSAmPSB+bTsKLQkJICBpZiAoIUMpIGVhIHw9IG0pOwotCSAgT0JJVE9QIChPX0JBTkQsIDEsIDAsIGMgPSAoZWEgJiBtKSAmJiBDKTsKLQkgIE9CSVRPUCAoT19CSUFORCwgMSwgMCwgYyA9ICEoZWEgJiBtKSAmJiBDKTsKLQkgIE9CSVRPUCAoT19CT1IsIDEsIDAsIGMgPSAoZWEgJiBtKSB8fCBDKTsKLQkgIE9CSVRPUCAoT19CSU9SLCAxLCAwLCBjID0gIShlYSAmIG0pIHx8IEMpOwotCSAgT0JJVE9QIChPX0JYT1IsIDEsIDAsIGMgPSAoZWEgJiBtKSAhPSBDKTsKLQkgIE9CSVRPUCAoT19CSVhPUiwgMSwgMCwgYyA9ICEoZWEgJiBtKSAhPSBDKTsKLQotCi0jZGVmaW5lIE1PUChic2l6ZSwgc2lnbmVkKSBtb3AoY29kZSwgYnNpemUsc2lnbmVkKTsgZ290byBuZXh0OwotCi0JY2FzZSBPIChPX01VTFMsIFNCKToKLQkgIE1PUCAoMSwgMSk7Ci0JICBicmVhazsKLQljYXNlIE8gKE9fTVVMUywgU1cpOgotCSAgTU9QICgwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgTyAoT19NVUxVLCBTQik6Ci0JICBNT1AgKDEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBPIChPX01VTFUsIFNXKToKLQkgIE1PUCAoMCwgMCk7Ci0JICBicmVhazsKLQotCi0JY2FzZSBPIChPX0RJVlUsIFNCKToKLQkgIHsKLQkgICAgcmQgPSBHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpOwotCSAgICBlYSA9IEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZyk7Ci0JICAgIGlmIChlYSkKLQkgICAgICB7Ci0JCXRtcCA9ICh1bnNpZ25lZClyZCAlIGVhOwotCQlyZCA9ICh1bnNpZ25lZClyZCAvIGVhOwotCSAgICAgIH0KLQkgICAgU0VUX1dfUkVHIChjb2RlLT5kc3QucmVnLCAocmQgJiAweGZmKSB8ICh0bXAgPDwgOCkpOwotCSAgICBuID0gZWEgJiAweDgwOwotCSAgICBueiA9IGVhICYgMHhmZjsKLQotCSAgICBnb3RvIG5leHQ7Ci0JICB9Ci0JY2FzZSBPIChPX0RJVlUsIFNXKToKLQkgIHsKLQkgICAgcmQgPSBHRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcpOwotCSAgICBlYSA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZyk7Ci0JICAgIG4gPSBlYSAmIDB4ODAwMDsKLQkgICAgbnogPSBlYSAmIDB4ZmZmZjsKLQkgICAgaWYgKGVhKQotCSAgICAgIHsKLQkJdG1wID0gKHVuc2lnbmVkKXJkICUgZWE7Ci0JCXJkID0gKHVuc2lnbmVkKXJkIC8gZWE7Ci0JICAgICAgfQotCSAgICBTRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcsIChyZCAmIDB4ZmZmZikgfCAodG1wIDw8IDE2KSk7Ci0JICAgIGdvdG8gbmV4dDsKLQkgIH0KLQotCWNhc2UgTyAoT19ESVZTLCBTQik6Ci0JICB7Ci0KLQkgICAgcmQgPSBTRVhUU0hPUlQgKEdFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZykpOwotCSAgICBlYSA9IFNFWFRDSEFSIChHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpKTsKLQkgICAgaWYgKGVhKQotCSAgICAgIHsKLQkJdG1wID0gKGludCkgcmQgJSAoaW50KSBlYTsKLQkJcmQgPSAoaW50KSByZCAvIChpbnQpIGVhOwotCQluID0gcmQgJiAweDgwMDA7Ci0JCW56ID0gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBueiA9IDA7Ci0JICAgIFNFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZywgKHJkICYgMHhmZikgfCAodG1wIDw8IDgpKTsKLQkgICAgZ290byBuZXh0OwotCSAgfQotCWNhc2UgTyAoT19ESVZTLCBTVyk6Ci0JICB7Ci0JICAgIHJkID0gR0VUX0xfUkVHIChjb2RlLT5kc3QucmVnKTsKLQkgICAgZWEgPSBTRVhUU0hPUlQgKEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZykpOwotCSAgICBpZiAoZWEpCi0JICAgICAgewotCQl0bXAgPSAoaW50KSByZCAlIChpbnQpIGVhOwotCQlyZCA9IChpbnQpIHJkIC8gKGludCkgZWE7Ci0JCW4gPSByZCAmIDB4ODAwMDAwMDA7Ci0JCW56ID0gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBueiA9IDA7Ci0JICAgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgKHJkICYgMHhmZmZmKSB8ICh0bXAgPDwgMTYpKTsKLQkgICAgZ290byBuZXh0OwotCSAgfQotCWNhc2UgTyAoT19FWFRTLCBTVyk6Ci0JICByZCA9IEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZyArIDgpICYgMHhmZjsgLyogWWVzLCBzcmMsIG5vdCBkc3QuICAqLwotCSAgZWEgPSByZCAmIDB4ODAgPyAtMjU2IDogMDsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBnb3RvIGxvZzE2OwotCWNhc2UgTyAoT19FWFRTLCBTTCk6Ci0JICByZCA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZykgJiAweGZmZmY7Ci0JICBlYSA9IHJkICYgMHg4MDAwID8gLTY1NTM2IDogMDsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBnb3RvIGxvZzMyOwotCWNhc2UgTyAoT19FWFRVLCBTVyk6Ci0JICByZCA9IEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZyArIDgpICYgMHhmZjsKLQkgIGVhID0gMDsKLQkgIHJlcyA9IHJkICsgZWE7Ci0JICBnb3RvIGxvZzE2OwotCWNhc2UgTyAoT19FWFRVLCBTTCk6Ci0JICByZCA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZykgJiAweGZmZmY7Ci0JICBlYSA9IDA7Ci0JICByZXMgPSByZCArIGVhOwotCSAgZ290byBsb2czMjsKLQotCWNhc2UgTyAoT19OT1AsIFNOKToKLQkgIGdvdG8gbmV4dDsKLQotCWNhc2UgTyAoT19TVE0sIFNMKToKLQkgIHsKLQkgICAgaW50IG5yZWdzLCBmaXJzdHJlZywgaTsKLQotCSAgICBucmVncyA9IEdFVF9NRU1PUllfQiAocGMgKyAxKTsKLQkgICAgbnJlZ3MgPj49IDQ7Ci0JICAgIG5yZWdzICY9IDB4ZjsKLQkgICAgZmlyc3RyZWcgPSBHRVRfTUVNT1JZX0IgKHBjICsgMyk7Ci0JICAgIGZpcnN0cmVnICY9IDB4ZjsKLQkgICAgZm9yIChpID0gZmlyc3RyZWc7IGkgPD0gZmlyc3RyZWcgKyBucmVnczsgaSsrKQotCSAgICAgIHsKLQkJY3B1LnJlZ3NbN10gLT0gNDsKLQkJU0VUX01FTU9SWV9MIChjcHUucmVnc1s3XSwgY3B1LnJlZ3NbaV0pOwotCSAgICAgIH0KLQkgIH0KLQkgIGdvdG8gbmV4dDsKLQotCWNhc2UgTyAoT19MRE0sIFNMKToKLQkgIHsKLQkgICAgaW50IG5yZWdzLCBmaXJzdHJlZywgaTsKLQotCSAgICBucmVncyA9IEdFVF9NRU1PUllfQiAocGMgKyAxKTsKLQkgICAgbnJlZ3MgPj49IDQ7Ci0JICAgIG5yZWdzICY9IDB4ZjsKLQkgICAgZmlyc3RyZWcgPSBHRVRfTUVNT1JZX0IgKHBjICsgMyk7Ci0JICAgIGZpcnN0cmVnICY9IDB4ZjsKLQkgICAgZm9yIChpID0gZmlyc3RyZWc7IGkgPj0gZmlyc3RyZWcgLSBucmVnczsgaS0tKQotCSAgICAgIHsKLQkJY3B1LnJlZ3NbaV0gPSBHRVRfTUVNT1JZX0wgKGNwdS5yZWdzWzddKTsKLQkJY3B1LnJlZ3NbN10gKz0gNDsKLQkgICAgICB9Ci0JICB9Ci0JICBnb3RvIG5leHQ7Ci0KLQlkZWZhdWx0OgotCSAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7Ci0JICBjcHUuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgZ290byBlbmQ7Ci0KLQl9Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIHNldGM6Ci0gICAgICBjcHUuY2NyID0gcmVzOwotICAgICAgR0VUU1IgKCk7Ci0gICAgICBnb3RvIG5leHQ7Ci0KLSAgICBjb25kdHJ1ZToKLSAgICAgIC8qIFdoZW4gYSBicmFuY2ggd29ya3MgKi8KLSAgICAgIHBjID0gY29kZS0+c3JjLmxpdGVyYWw7Ci0gICAgICBnb3RvIGVuZDsKLQotICAgICAgLyogU2V0IHRoZSBjb25kIGNvZGVzIGZyb20gcmVzICovCi0gICAgYml0b3A6Ci0KLSAgICAgIC8qIFNldCB0aGUgZmxhZ3MgYWZ0ZXIgYW4gOCBiaXQgaW5jL2RlYyBvcGVyYXRpb24gKi8KLSAgICBqdXN0X2ZsYWdzX2luYzg6Ci0gICAgICBuID0gcmVzICYgMHg4MDsKLSAgICAgIG56ID0gcmVzICYgMHhmZjsKLSAgICAgIHYgPSAocmQgJiAweDdmKSA9PSAweDdmOwotICAgICAgZ290byBuZXh0OwotCi0KLSAgICAgIC8qIFNldCB0aGUgZmxhZ3MgYWZ0ZXIgYW4gMTYgYml0IGluYy9kZWMgb3BlcmF0aW9uICovCi0gICAganVzdF9mbGFnc19pbmMxNjoKLSAgICAgIG4gPSByZXMgJiAweDgwMDA7Ci0gICAgICBueiA9IHJlcyAmIDB4ZmZmZjsKLSAgICAgIHYgPSAocmQgJiAweDdmZmYpID09IDB4N2ZmZjsKLSAgICAgIGdvdG8gbmV4dDsKLQotCi0gICAgICAvKiBTZXQgdGhlIGZsYWdzIGFmdGVyIGFuIDMyIGJpdCBpbmMvZGVjIG9wZXJhdGlvbiAqLwotICAgIGp1c3RfZmxhZ3NfaW5jMzI6Ci0gICAgICBuID0gcmVzICYgMHg4MDAwMDAwMDsKLSAgICAgIG56ID0gcmVzICYgMHhmZmZmZmZmZjsKLSAgICAgIHYgPSAocmQgJiAweDdmZmZmZmZmKSA9PSAweDdmZmZmZmZmOwotICAgICAgZ290byBuZXh0OwotCi0KLSAgICBzaGlmdDg6Ci0gICAgICAvKiBTZXQgZmxhZ3MgYWZ0ZXIgYW4gOCBiaXQgc2hpZnQgb3AsIGNhcnJ5LG92ZXJmbG93IHNldCBpbiBpbnNuICovCi0gICAgICBuID0gKHJkICYgMHg4MCk7Ci0gICAgICBueiA9IHJkICYgMHhmZjsKLSAgICAgIFNFVF9CX1JFRyAoY29kZS0+c3JjLnJlZywgcmQpOwotICAgICAgZ290byBuZXh0OwotCi0gICAgc2hpZnQxNjoKLSAgICAgIC8qIFNldCBmbGFncyBhZnRlciBhbiAxNiBiaXQgc2hpZnQgb3AsIGNhcnJ5LG92ZXJmbG93IHNldCBpbiBpbnNuICovCi0gICAgICBuID0gKHJkICYgMHg4MDAwKTsKLSAgICAgIG56ID0gcmQgJiAweGZmZmY7Ci0gICAgICBTRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcsIHJkKTsKLSAgICAgIGdvdG8gbmV4dDsKLQotICAgIHNoaWZ0MzI6Ci0gICAgICAvKiBTZXQgZmxhZ3MgYWZ0ZXIgYW4gMzIgYml0IHNoaWZ0IG9wLCBjYXJyeSxvdmVyZmxvdyBzZXQgaW4gaW5zbiAqLwotICAgICAgbiA9IChyZCAmIDB4ODAwMDAwMDApOwotICAgICAgbnogPSByZCAmIDB4ZmZmZmZmZmY7Ci0gICAgICBTRVRfTF9SRUcgKGNvZGUtPnNyYy5yZWcsIHJkKTsKLSAgICAgIGdvdG8gbmV4dDsKLQotICAgIGxvZzMyOgotICAgICAgc3RvcmUgKCZjb2RlLT5kc3QsIHJlcyk7Ci0gICAganVzdF9mbGFnc19sb2czMjoKLSAgICAgIC8qIGZsYWdzIGFmdGVyIGEgMzJiaXQgbG9naWNhbCBvcGVyYXRpb24gKi8KLSAgICAgIG4gPSByZXMgJiAweDgwMDAwMDAwOwotICAgICAgbnogPSByZXMgJiAweGZmZmZmZmZmOwotICAgICAgdiA9IDA7Ci0gICAgICBnb3RvIG5leHQ7Ci0KLSAgICBsb2cxNjoKLSAgICAgIHN0b3JlICgmY29kZS0+ZHN0LCByZXMpOwotICAgIGp1c3RfZmxhZ3NfbG9nMTY6Ci0gICAgICAvKiBmbGFncyBhZnRlciBhIDE2Yml0IGxvZ2ljYWwgb3BlcmF0aW9uICovCi0gICAgICBuID0gcmVzICYgMHg4MDAwOwotICAgICAgbnogPSByZXMgJiAweGZmZmY7Ci0gICAgICB2ID0gMDsKLSAgICAgIGdvdG8gbmV4dDsKLQotCi0gICAgbG9nODoKLSAgICAgIHN0b3JlICgmY29kZS0+ZHN0LCByZXMpOwotICAgIGp1c3RfZmxhZ3NfbG9nODoKLSAgICAgIG4gPSByZXMgJiAweDgwOwotICAgICAgbnogPSByZXMgJiAweGZmOwotICAgICAgdiA9IDA7Ci0gICAgICBnb3RvIG5leHQ7Ci0KLSAgICBhbHU4OgotICAgICAgU0VUX0JfUkVHIChjb2RlLT5kc3QucmVnLCByZXMpOwotICAgIGp1c3RfZmxhZ3NfYWx1ODoKLSAgICAgIG4gPSByZXMgJiAweDgwOwotICAgICAgbnogPSByZXMgJiAweGZmOwotICAgICAgYyA9IChyZXMgJiAweDEwMCk7Ci0gICAgICBzd2l0Y2ggKGNvZGUtPm9wY29kZSAvIDQpCi0JewotCWNhc2UgT19BREQ6Ci0JICB2ID0gKChyZCAmIDB4ODApID09IChlYSAmIDB4ODApCi0JICAgICAgICYmIChyZCAmIDB4ODApICE9IChyZXMgJiAweDgwKSk7Ci0JICBicmVhazsKLQljYXNlIE9fU1VCOgotCWNhc2UgT19DTVA6Ci0JICB2ID0gKChyZCAmIDB4ODApICE9ICgtZWEgJiAweDgwKQotCSAgICAgICAmJiAocmQgJiAweDgwKSAhPSAocmVzICYgMHg4MCkpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX05FRzoKLQkgIHYgPSAocmQgPT0gMHg4MCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBnb3RvIG5leHQ7Ci0KLSAgICBhbHUxNjoKLSAgICAgIFNFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKLSAgICBqdXN0X2ZsYWdzX2FsdTE2OgotICAgICAgbiA9IHJlcyAmIDB4ODAwMDsKLSAgICAgIG56ID0gcmVzICYgMHhmZmZmOwotICAgICAgYyA9IChyZXMgJiAweDEwMDAwKTsKLSAgICAgIHN3aXRjaCAoY29kZS0+b3Bjb2RlIC8gNCkKLQl7Ci0JY2FzZSBPX0FERDoKLQkgIHYgPSAoKHJkICYgMHg4MDAwKSA9PSAoZWEgJiAweDgwMDApCi0JICAgICAgICYmIChyZCAmIDB4ODAwMCkgIT0gKHJlcyAmIDB4ODAwMCkpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX1NVQjoKLQljYXNlIE9fQ01QOgotCSAgdiA9ICgocmQgJiAweDgwMDApICE9ICgtZWEgJiAweDgwMDApCi0JICAgICAgICYmIChyZCAmIDB4ODAwMCkgIT0gKHJlcyAmIDB4ODAwMCkpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX05FRzoKLQkgIHYgPSAocmQgPT0gMHg4MDAwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGdvdG8gbmV4dDsKLQotICAgIGFsdTMyOgotICAgICAgU0VUX0xfUkVHIChjb2RlLT5kc3QucmVnLCByZXMpOwotICAgIGp1c3RfZmxhZ3NfYWx1MzI6Ci0gICAgICBuID0gcmVzICYgMHg4MDAwMDAwMDsKLSAgICAgIG56ID0gcmVzICYgMHhmZmZmZmZmZjsKLSAgICAgIHN3aXRjaCAoY29kZS0+b3Bjb2RlIC8gNCkKLQl7Ci0JY2FzZSBPX0FERDoKLQkgIHYgPSAoKHJkICYgMHg4MDAwMDAwMCkgPT0gKGVhICYgMHg4MDAwMDAwMCkKLQkgICAgICAgJiYgKHJkICYgMHg4MDAwMDAwMCkgIT0gKHJlcyAmIDB4ODAwMDAwMDApKTsKLQkgIGMgPSAoKHVuc2lnbmVkKSByZXMgPCAodW5zaWduZWQpIHJkKSB8fCAoKHVuc2lnbmVkKSByZXMgPCAodW5zaWduZWQpIGVhKTsKLQkgIGJyZWFrOwotCWNhc2UgT19TVUI6Ci0JY2FzZSBPX0NNUDoKLQkgIHYgPSAoKHJkICYgMHg4MDAwMDAwMCkgIT0gKC1lYSAmIDB4ODAwMDAwMDApCi0JICAgICAgICYmIChyZCAmIDB4ODAwMDAwMDApICE9IChyZXMgJiAweDgwMDAwMDAwKSk7Ci0JICBjID0gKHVuc2lnbmVkKSByZCA8ICh1bnNpZ25lZCkgLWVhOwotCSAgYnJlYWs7Ci0JY2FzZSBPX05FRzoKLQkgIHYgPSAocmQgPT0gMHg4MDAwMDAwMCk7Ci0JICBjID0gcmVzICE9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgICBnb3RvIG5leHQ7Ci0KLSAgICBuZXh0OjsKLSAgICAgIHBjID0gY29kZS0+bmV4dF9wYzsKLQotICAgIGVuZDoKLSAgICAgIDsKLSAgICAgIC8qICAgICAgaWYgKGNwdS5yZWdzWzhdICkgYWJvcnQoKTsgKi8KLQotICAgICAgaWYgKC0tcG9sbF9jb3VudCA8IDApCi0JewotCSAgcG9sbF9jb3VudCA9IFBPTExfUVVJVF9JTlRFUlZBTDsKLQkgIGlmICgoKnNpbV9jYWxsYmFjay0+cG9sbF9xdWl0KSAhPSBOVUxMCi0JICAgICAgJiYgKCpzaW1fY2FsbGJhY2stPnBvbGxfcXVpdCkgKHNpbV9jYWxsYmFjaykpCi0JICAgIHNpbV9zdG9wIChzZCk7Ci0JfQotCi0gICAgfQotICB3aGlsZSAoY3B1LnN0YXRlID09IFNJTV9TVEFURV9SVU5OSU5HKTsKLSAgY3B1LnRpY2tzICs9IGdldF9ub3cgKCkgLSB0aWNrX3N0YXJ0OwotICBjcHUuY3ljbGVzICs9IGN5Y2xlczsKLSAgY3B1Lmluc3RzICs9IGluc3RzOwotICAKLSAgY3B1LnBjID0gcGM7Ci0gIEJVSUxEU1IgKCk7Ci0gIGNwdS5tYXNrID0gb2xkbWFzazsKLSAgc2lnbmFsIChTSUdJTlQsIHByZXYpOwotfQotCi1pbnQKLXNpbV90cmFjZSAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICAvKiBGSVhNRTogdW5maW5pc2hlZCAqLwotICBhYm9ydCAoKTsKLX0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLQotICBpbml0X3BvaW50ZXJzICgpOwotICBpZiAoYWRkciA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgaWYgKGFkZHIgPCBtZW1vcnlfc2l6ZSkKLQl7Ci0JICBjcHUubWVtb3J5W2FkZHIgKyBpXSA9IGJ1ZmZlcltpXTsKLQkgIGNwdS5jYWNoZV9pZHhbYWRkciArIGldID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JY3B1LmVpZ2h0Yml0WyhhZGRyICsgaSkgJiAweGZmXSA9IGJ1ZmZlcltpXTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW5pdF9wb2ludGVycyAoKTsKLSAgaWYgKGFkZHIgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoYWRkciA8IG1lbW9yeV9zaXplKQotICAgIG1lbWNweSAoYnVmZmVyLCBjcHUubWVtb3J5ICsgYWRkciwgc2l6ZSk7Ci0gIGVsc2UKLSAgICBtZW1jcHkgKGJ1ZmZlciwgY3B1LmVpZ2h0Yml0ICsgKGFkZHIgJiAweGZmKSwgc2l6ZSk7Ci0gIHJldHVybiBzaXplOwotfQotCi0KLSNkZWZpbmUgUjBfUkVHTlVNCTAKLSNkZWZpbmUgUjFfUkVHTlVNCTEKLSNkZWZpbmUgUjJfUkVHTlVNCTIKLSNkZWZpbmUgUjNfUkVHTlVNCTMKLSNkZWZpbmUgUjRfUkVHTlVNCTQKLSNkZWZpbmUgUjVfUkVHTlVNCTUKLSNkZWZpbmUgUjZfUkVHTlVNCTYKLSNkZWZpbmUgUjdfUkVHTlVNCTcKLQotI2RlZmluZSBTUF9SRUdOVU0gICAgICAgUjdfUkVHTlVNCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCi0jZGVmaW5lIEZQX1JFR05VTSAgICAgICBSNl9SRUdOVU0JLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcKLQkJCQkJICAgKiBzdGFjayBmcmFtZSAqLwotCi0jZGVmaW5lIENDUl9SRUdOVU0gICAgICA4CS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KLSNkZWZpbmUgUENfUkVHTlVNICAgICAgIDkJLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCi0KLSNkZWZpbmUgQ1lDTEVfUkVHTlVNICAgIDEwCi0jZGVmaW5lIElOU1RfUkVHTlVNICAgICAxMQotI2RlZmluZSBUSUNLX1JFR05VTSAgICAgMTIKLQotCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoc2QsIHJuLCB2YWx1ZSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgaW50IGxvbmd2YWw7Ci0gIGludCBzaG9ydHZhbDsKLSAgaW50IGludHZhbDsKLSAgbG9uZ3ZhbCA9ICh2YWx1ZVswXSA8PCAyNCkgfCAodmFsdWVbMV0gPDwgMTYpIHwgKHZhbHVlWzJdIDw8IDgpIHwgdmFsdWVbM107Ci0gIHNob3J0dmFsID0gKHZhbHVlWzBdIDw8IDgpIHwgKHZhbHVlWzFdKTsKLSAgaW50dmFsID0gaDgzMDBobW9kZSA/IGxvbmd2YWwgOiBzaG9ydHZhbDsKLQotICBpbml0X3BvaW50ZXJzICgpOwotICBzd2l0Y2ggKHJuKQotICAgIHsKLSAgICBjYXNlIFBDX1JFR05VTToKLSAgICAgIGNwdS5wYyA9IGludHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFIwX1JFR05VTToKLSAgICBjYXNlIFIxX1JFR05VTToKLSAgICBjYXNlIFIyX1JFR05VTToKLSAgICBjYXNlIFIzX1JFR05VTToKLSAgICBjYXNlIFI0X1JFR05VTToKLSAgICBjYXNlIFI1X1JFR05VTToKLSAgICBjYXNlIFI2X1JFR05VTToKLSAgICBjYXNlIFI3X1JFR05VTToKLSAgICAgIGNwdS5yZWdzW3JuXSA9IGludHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0NSX1JFR05VTToKLSAgICAgIGNwdS5jY3IgPSBpbnR2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENZQ0xFX1JFR05VTToKLSAgICAgIGNwdS5jeWNsZXMgPSBsb25ndmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElOU1RfUkVHTlVNOgotICAgICAgY3B1Lmluc3RzID0gbG9uZ3ZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUSUNLX1JFR05VTToKLSAgICAgIGNwdS50aWNrcyA9IGxvbmd2YWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgYnVmLCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgaW50IHY7Ci0gIGludCBsb25ncmVnID0gMDsKLQotICBpbml0X3BvaW50ZXJzICgpOwotCi0gIHN3aXRjaCAocm4pCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDg6Ci0gICAgICB2ID0gY3B1LmNjcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOToKLSAgICAgIHYgPSBjcHUucGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFIwX1JFR05VTToKLSAgICBjYXNlIFIxX1JFR05VTToKLSAgICBjYXNlIFIyX1JFR05VTToKLSAgICBjYXNlIFIzX1JFR05VTToKLSAgICBjYXNlIFI0X1JFR05VTToKLSAgICBjYXNlIFI1X1JFR05VTToKLSAgICBjYXNlIFI2X1JFR05VTToKLSAgICBjYXNlIFI3X1JFR05VTToKLSAgICAgIHYgPSBjcHUucmVnc1tybl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgdiA9IGNwdS5jeWNsZXM7Ci0gICAgICBsb25ncmVnID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTE6Ci0gICAgICB2ID0gY3B1LnRpY2tzOwotICAgICAgbG9uZ3JlZyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgdiA9IGNwdS5pbnN0czsKLSAgICAgIGxvbmdyZWcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAoaDgzMDBobW9kZSB8fCBsb25ncmVnKQotICAgIHsKLSAgICAgIGJ1ZlswXSA9IHYgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2ID4+IDE2OwotICAgICAgYnVmWzJdID0gdiA+PiA4OwotICAgICAgYnVmWzNdID0gdiA+PiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZlswXSA9IHYgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHY7Ci0gICAgfQotICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247Ci0gICAgIGludCAqc2lncmM7Ci17Ci0jaWYgMCAvKiBGSVhNRTogVGhpcyBzaG91bGQgd29yayBidXQgd2UgY2FuJ3QgdXNlIGl0LgotCSBncmVwIGZvciBTTEVFUCBhYm92ZS4gICovCi0gIHN3aXRjaCAoY3B1LnN0YXRlKQotICAgIHsKLSAgICBjYXNlIFNJTV9TVEFURV9FWElURUQgOiAqcmVhc29uID0gc2ltX2V4aXRlZDsgYnJlYWs7Ci0gICAgY2FzZSBTSU1fU1RBVEVfU0lHTkFMTEVEIDogKnJlYXNvbiA9IHNpbV9zaWduYWxsZWQ7IGJyZWFrOwotICAgIGNhc2UgU0lNX1NUQVRFX1NUT1BQRUQgOiAqcmVhc29uID0gc2ltX3N0b3BwZWQ7IGJyZWFrOwotICAgIGRlZmF1bHQgOiBhYm9ydCAoKTsKLSAgICB9Ci0jZWxzZQotICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci0jZW5kaWYKLSAgKnNpZ3JjID0gY3B1LmV4Y2VwdGlvbjsKLX0KLQotLyogRklYTUU6IFJlbmFtZSB0byBzaW1fc2V0X21lbV9zaXplLiAgKi8KLQotdm9pZAotc2ltX3NpemUgKG4pCi0gICAgIGludCBuOwotewotICAvKiBNZW1vcnkgc2l6ZSBpcyBmaXhlZC4gICovCi19Ci0KLXZvaWQKLXNpbV9zZXRfc2ltY2FjaGVfc2l6ZSAobikKLXsKLSAgaWYgKGNwdS5jYWNoZSkKLSAgICBmcmVlIChjcHUuY2FjaGUpOwotICBpZiAobiA8IDIpCi0gICAgbiA9IDI7Ci0gIGNwdS5jYWNoZSA9IChkZWNvZGVkX2luc3QgKikgbWFsbG9jIChzaXplb2YgKGRlY29kZWRfaW5zdCkgKiBuKTsKLSAgbWVtc2V0IChjcHUuY2FjaGUsIDAsIHNpemVvZiAoZGVjb2RlZF9pbnN0KSAqIG4pOwotICBjcHUuY3NpemUgPSBuOwotfQotCi0KLXZvaWQKLXNpbV9pbmZvIChzZCwgdmVyYm9zZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCB2ZXJib3NlOwotewotICBkb3VibGUgdGltZXRha2VuID0gKGRvdWJsZSkgY3B1LnRpY2tzIC8gKGRvdWJsZSkgbm93X3BlcnNlYyAoKTsKLSAgZG91YmxlIHZpcnR0aW1lID0gY3B1LmN5Y2xlcyAvIDEwLjBlNjsKLQotICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAiXG5cbiNpbnN0cnVjdGlvbnMgZXhlY3V0ZWQgICUxMGRcbiIsCi0JCQkJICAgIGNwdS5pbnN0cyk7Ci0gICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCi0JCQkJICAgICIjY3ljbGVzICh2IGFwcHJveGltYXRlKSAlMTBkXG4iLAotCQkJCSAgICBjcHUuY3ljbGVzKTsKLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIiNyZWFsIHRpbWUgdGFrZW4gICAgICAgICUxMC40ZlxuIiwKLQkJCQkgICAgdGltZXRha2VuKTsKLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIiN2aXJ0dWFsIHRpbWUgdGFrZWQgICAgICUxMC40ZlxuIiwKLQkJCQkgICAgdmlydHRpbWUpOwotICBpZiAodGltZXRha2VuICE9IDAuMCkKLSAgICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAgICIjc2ltdWxhdGlvbiByYXRpbyAgICAgICAlMTAuNGZcbiIsCi0JCQkJICAgICAgdmlydHRpbWUgLyB0aW1ldGFrZW4pOwotICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAiI2NvbXBpbGVzICAgICAgICAgICAgICAgJTEwZFxuIiwKLQkJCQkgICAgY3B1LmNvbXBpbGVzKTsKLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIiNjYWNoZSBzaXplICAgICAgICAgICAgICUxMGRcbiIsCi0JCQkJICAgIGNwdS5jc2l6ZSk7Ci0KLSNpZmRlZiBBREVCVUcKLSAgLyogVGhpcyB0byBiZSBjb25kaXRpb25hbCBvbiBgd2hhdCcgKGFrYSBgdmVyYm9zZScpLAotICAgICBob3dldmVyIGl0IHdhcyBuZXZlciBwYXNzZWQgYXMgbm9uLXplcm8uICAqLwotICBpZiAoMSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBPX0xBU1Q7IGkrKykKLQl7Ci0JICBpZiAoY3B1LnN0YXRzW2ldKQotCSAgICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCQkgICAgICAiJWQ6ICVkXG4iLCBpLCBjcHUuc3RhdHNbaV0pOwotCX0KLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogSW5kaWNhdGUgd2hldGhlciB0aGUgY3B1IGlzIGFuIGg4LzMwMCBvciBoOC8zMDBoLgotICAgRkxBRyBpcyBub24temVybyBmb3IgdGhlIGg4LzMwMGguICAqLwotCi12b2lkCi1zZXRfaDgzMDBoIChmbGFnKQotICAgICBpbnQgZmxhZzsKLXsKLSAgLyogRklYTUU6IE11Y2ggb2YgdGhlIGNvZGUgaW4gc2ltX2xvYWQgY2FuIGJlIG1vdmVkIHRvIHNpbV9vcGVuLgotICAgICBUaGlzIGZ1bmN0aW9uIGJlaW5nIHJlcGxhY2VkIGJ5IGEgc2ltX29wZW46QVJHViBjb25maWd1cmF0aW9uCi0gICAgIG9wdGlvbiAqLwotICBoODMwMGhtb2RlID0gZmxhZzsKLX0KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBwdHIsIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpwdHI7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgLyogRklYTUU6IE11Y2ggb2YgdGhlIGNvZGUgaW4gc2ltX2xvYWQgY2FuIGJlIG1vdmVkIGhlcmUgKi8KLQotICBzaW1fa2luZCA9IGtpbmQ7Ci0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0gIHNpbV9jYWxsYmFjayA9IHB0cjsKLSAgLyogZnVkZ2Ugb3VyIGRlc2NyaXB0b3IgKi8KLSAgcmV0dXJuIChTSU1fREVTQykgMTsKLX0KLQotdm9pZAotc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcXVpdHRpbmc7Ci17Ci0gIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotLyogQ2FsbGVkIGJ5IGdkYiB0byBsb2FkIGEgcHJvZ3JhbSBpbnRvIG1lbW9yeS4gICovCi0KLVNJTV9SQwotc2ltX2xvYWQgKHNkLCBwcm9nLCBhYmZkLCBmcm9tX3R0eSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKnByb2c7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBiZmQgKnByb2dfYmZkOwotCi0gIC8qIEZJWE1FOiBUaGUgY29kZSBiZWxvdyB0aGF0IHNldHMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBoOC8zMDAKLSAgICAgYmVpbmcgc2ltdWxhdGVkIHNob3VsZCBiZSBtb3ZlZCB0byBzaW1fb3BlbigpLiAqLwotCi0gIC8qIFNlZSBpZiB0aGUgZmlsZSBpcyBmb3IgdGhlIGg4LzMwMCBvciBoOC8zMDBoLiAgKi8KLSAgLyogPz8/IFRoaXMgbWF5IG5vdCBiZSB0aGUgbW9zdCBlZmZpY2llbnQgd2F5LiAgVGhlIHo4ayBzaW11bGF0b3IKLSAgICAgZG9lcyB0aGlzIHZpYSBhIGRpZmZlcmVudCBtZWNoYW5pc20gKElOSVRfRVhUUkFfU1lNVEFCX0lORk8pLiAgKi8KLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBwcm9nX2JmZCA9IGFiZmQ7Ci0gIGVsc2UKLSAgICBwcm9nX2JmZCA9IGJmZF9vcGVuciAocHJvZywgImNvZmYtaDgzMDAiKTsKLSAgaWYgKHByb2dfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjcHUgdHlwZS4gIFdlIGlnbm9yZSBmYWlsdXJlIGZyb20gYmZkX2NoZWNrX2Zvcm1hdAotCSBhbmQgYmZkX29wZW5yIGFzIHNpbV9sb2FkX2ZpbGUgY2hlY2tzIHRvby4gICovCi0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAocHJvZ19iZmQsIGJmZF9vYmplY3QpKSAKLQl7Ci0JICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfZ2V0X21hY2ggKHByb2dfYmZkKTsKLQkgIHNldF9oODMwMGggKG1hY2ggPT0gYmZkX21hY2hfaDgzMDBoCi0JCSAgICAgIHx8IG1hY2ggPT0gYmZkX21hY2hfaDgzMDBzKTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIHVzaW5nIGdkYiBhdHRhY2hlZCB0byB0aGUgc2ltdWxhdG9yLCB0aGVuIHdlIGhhdmUgdG8KLSAgICAgcmVhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzaW11bGF0b3IuCi0KLSAgICAgV2hlbiBnZGIgZmlyc3Qgc3RhcnRzLCBpdCBjYWxscyBmZXRjaF9yZWdpc3RlcnMgKGFtb25nIG90aGVyCi0gICAgIGZ1bmN0aW9ucyksIHdoaWNoIGluIHR1cm4gY2FsbHMgaW5pdF9wb2ludGVycywgd2hpY2ggYWxsb2NhdGVzCi0gICAgIHNpbXVsYXRvciBtZW1vcnkuCi0KLSAgICAgVGhlIHByb2JsZW0gaXMgd2hlbiB3ZSBkbyB0aGF0LCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgd2UncmUKLSAgICAgZGVidWdnaW5nIGFuIGg4LzMwMCBvciBoOC8zMDBoIHByb2dyYW0uCi0KLSAgICAgVGhpcyBpcyB0aGUgZmlyc3QgcG9pbnQgYXQgd2hpY2ggd2UgY2FuIG1ha2UgdGhhdCBkZXRlcm1pbmF0aW9uLAotICAgICBzbyB3ZSBqdXN0IHJlYWxsb2NhdGUgbWVtb3J5IG5vdzsgdGhpcyB3aWxsIGFsc28gYWxsb3cgdXMgdG8gaGFuZGxlCi0gICAgIHN3aXRjaGluZyBiZXR3ZWVuIGg4LzMwMCBhbmQgaDgvMzAwaCBwcm9ncmFtcyB3aXRob3V0IGV4aXRpbmcKLSAgICAgZ2RiLiAgKi8KLSAgaWYgKGg4MzAwaG1vZGUpCi0gICAgbWVtb3J5X3NpemUgPSBIODMwMEhfTVNJWkU7Ci0gIGVsc2UKLSAgICBtZW1vcnlfc2l6ZSA9IEg4MzAwX01TSVpFOwotCi0gIGlmIChjcHUubWVtb3J5KQotICAgIGZyZWUgKGNwdS5tZW1vcnkpOwotICBpZiAoY3B1LmNhY2hlX2lkeCkKLSAgICBmcmVlIChjcHUuY2FjaGVfaWR4KTsKLSAgaWYgKGNwdS5laWdodGJpdCkKLSAgICBmcmVlIChjcHUuZWlnaHRiaXQpOwotCi0gIGNwdS5tZW1vcnkgPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKHNpemVvZiAoY2hhciksIG1lbW9yeV9zaXplKTsKLSAgY3B1LmNhY2hlX2lkeCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjYWxsb2MgKHNpemVvZiAoc2hvcnQpLCBtZW1vcnlfc2l6ZSk7Ci0gIGNwdS5laWdodGJpdCA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoc2l6ZW9mIChjaGFyKSwgMjU2KTsKLQotICAvKiBgbXNpemUnIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KLSAgaWYgKChtZW1vcnlfc2l6ZSAmIChtZW1vcnlfc2l6ZSAtIDEpKSAhPSAwKQotICAgIGFib3J0ICgpOwotICBjcHUubWFzayA9IG1lbW9yeV9zaXplIC0gMTsKLQotICBpZiAoc2ltX2xvYWRfZmlsZSAoc2QsIG15bmFtZSwgc2ltX2NhbGxiYWNrLCBwcm9nLCBwcm9nX2JmZCwKLQkJICAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLQkJICAgICAwLCBzaW1fd3JpdGUpCi0gICAgICA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENsb3NlIHRoZSBiZmQgaWYgd2Ugb3BlbmVkIGl0LiAgKi8KLSAgICAgIGlmIChhYmZkID09IE5VTEwgJiYgcHJvZ19iZmQgIT0gTlVMTCkKLQliZmRfY2xvc2UgKHByb2dfYmZkKTsKLSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgICB9Ci0KLSAgLyogQ2xvc2UgdGhlIGJmZCBpZiB3ZSBvcGVuZWQgaXQuICAqLwotICBpZiAoYWJmZCA9PSBOVUxMICYmIHByb2dfYmZkICE9IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBjcHUucGMgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBlbHNlCi0gICAgY3B1LnBjID0gMDsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17Ci0gICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCi0JCQkJICAgICJUaGlzIHNpbXVsYXRvciBkb2VzIG5vdCBhY2NlcHQgYW55IGNvbW1hbmRzLlxuIik7Ci19Ci0KLXZvaWQKLXNpbV9zZXRfY2FsbGJhY2tzIChwdHIpCi0gICAgIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqcHRyOwotewotICBzaW1fY2FsbGJhY2sgPSBwdHI7Ci19CmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvY29uZmlnLmluIGIvc2ltL2g4MzAwL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4N2EyYi4uMDAwMDAwMAotLS0gYS9zaW0vaDgzMDAvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvY29uZmlndXJlIGIvc2ltL2g4MzAwL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmFiNmI3NS4uMDAwMDAwMAotLS0gYS9zaW0vaDgzMDAvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDAyNCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLWZvciBhY19oZHIgaW4gc3RkbGliLmggdGltZS5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZwotcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZwotcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZwotcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9jb25maWd1cmUuaW4gYi9zaW0vaDgzMDAvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk1M2RkLi4wMDAwMDAwCi0tLSBhL3NpbS9oODMwMC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotQUNfUFJFUkVRKDIuNSlkbmwKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLVNJTV9BQ19DT01NT04KLQotQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCB0aW1lLmggc3lzL3BhcmFtLmgpCi0KLVNJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9pbnN0LmggYi9zaW0vaDgzMDAvaW5zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTkzMGMzLi4wMDAwMDAwCi0tLSBhL3NpbS9oODMwMC9pbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jZGVmaW5lIERFQlVHCi0KLS8qIFRoZXNlIGRlZmluZSB0aGUgc2l6ZSBvZiBtYWluIG1lbW9yeSBmb3IgdGhlIHNpbXVsYXRvci4KLQotICAgTm90ZSB0aGUgc2l6ZSBvZiBtYWluIG1lbW9yeSBmb3IgdGhlIEg4LzMwMEggaXMgb25seSAyNTZrLiAgS2VlcGluZyBpdAotICAgc21hbGwgbWFrZXMgdGhlIHNpbXVsYXRvciBydW4gbXVjaCBmYXN0ZXIgYW5kIGNvbnN1bWUgbGVzcyBtZW1vcnkuCi0KLSAgIFRoZSBsaW5rZXIga25vd3MgYWJvdXQgdGhlIGxpbWl0ZWQgc2l6ZSBvZiB0aGUgc2ltdWxhdG9yJ3MgbWFpbiBtZW1vcnkKLSAgIG9uIHRoZSBIOC8zMDBIICh2aWEgdGhlIGg4MzAwaC5zYyBsaW5rZXIgc2NyaXB0KS4gIFNvIGlmIHlvdSBjaGFuZ2UKLSAgIEg4MzAwSF9NU0laRSwgYmUgc3VyZSB0byBmaXggdGhlIGxpbmtlciBzY3JpcHQgdG9vLgotCi0gICBBbHNvIG5vdGUgdGhhdCB0aGVyZSdzIGEgc2VwYXJhdGUgImVpZ2h0Yml0IiBhcmVhIGFzaWRlIGZyb20gbWFpbgotICAgbWVtb3J5LiAgRm9yIHNpbXBsaWNpdHksIHRoZSBzaW11bGF0b3IgYXNzdW1lcyBhbnkgZGF0YSBtZW1vcnkgcmVmZXJlbmNlCi0gICBvdXRzaWRlIG9mIG1haW4gbWVtb3J5IHJlZmVycyB0byB0aGUgZWlnaHRiaXQgYXJlYSAoaW4gdGhlb3J5LCB0aGlzCi0gICBjYW4gb25seSBoYXBwZW4gd2hlbiBzaW11bGF0aW5nIEg4LzMwMEggcHJvZ3JhbXMpLiAgV2UgbWFrZSBubyBhdHRlbXB0Ci0gICB0byBjYXRjaCBvdmVybGFwcGluZyBhZGRyZXNzZXMsIHdyYXBwZWQgYWRkcmVzc2VzLCBldGMgZXRjLiAgKi8KLSNkZWZpbmUgSDgzMDBfTVNJWkUgKDE8PDE2KQotI2RlZmluZSBIODMwMEhfTVNJWkUgKDE8PDE4KQotCi0jZGVmaW5lIENTSVpFIDEwMDAKLQotLyogTG9jYWwgcmVnaXN0ZXIgbmFtZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjcsCi0gIFJfWkVSTywKLSAgUl9QQywJCQkJCi0gIFJfQ0NSLAotICBSX0hBUkRfMCwJCQkKLSAgUl9MQVNULAotfSByZWdfdHlwZTsKLQotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhZGRyZXNzaW5nICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCB0eXBlOwotICBpbnQgcmVnOwotICBpbnQgbGl0ZXJhbDsKLX0gZWFfdHlwZTsKLQotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGVhX3R5cGUgc3JjOwotICBlYV90eXBlIGRzdDsKLSAgaW50IG9wY29kZTsKLSAgaW50IG5leHRfcGM7Ci0gIGludCBvbGRwYzsKLSAgaW50IGN5Y2xlczsKLSNpZmRlZiBERUJVRwotc3RydWN0IGg4X29wY29kZSAqb3A7Ci0jZW5kaWYKLX0KLWRlY29kZWRfaW5zdDsKLQotZW51bSBoODMwMF9zaW1fc3RhdGUgewotICBTSU1fU1RBVEVfUlVOTklORywgU0lNX1NUQVRFX0VYSVRFRCwgU0lNX1NUQVRFX1NJR05BTExFRCwgU0lNX1NUQVRFX1NUT1BQRUQKLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGVudW0gaDgzMDBfc2ltX3N0YXRlIHN0YXRlOwotICBpbnQgZXhjZXB0aW9uOwotICB1bnNpZ25lZCAgaW50IHJlZ3NbOV07Ci0gIGludCBwYzsKLSAgaW50IGNjcjsKLSAgCi0KLSAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICB1bnNpZ25lZCBjaGFyICplaWdodGJpdDsKLSAgdW5zaWduZWQgc2hvcnQgKmNhY2hlX2lkeDsKLSAgaW50IGNhY2hlX3RvcDsKLSAgaW50IG1heGltdW07Ci0gIGludCBjc2l6ZTsKLSAgaW50IG1hc2s7Ci0gIAotICBkZWNvZGVkX2luc3QgKmNhY2hlOwotICBpbnQgY3ljbGVzOwotICBpbnQgaW5zdHM7Ci0gIGludCB0aWNrczsKLSAgaW50IGNvbXBpbGVzOwotI2lmZGVmIEFERUJVRwotICBpbnQgc3RhdHNbT19MQVNUXTsKLSNlbmRpZgotfQotY3B1X3N0YXRlX3R5cGU7CmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvdGNvbmZpZy5pbiBiL3NpbS9oODMwMC90Y29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU5OWRiLi4wMDAwMDAwCi0tLSBhL3NpbS9oODMwMC90Y29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogaDgzMDAgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4gICovCi0KLS8qIERlZmluZSB0aGlzIGlmIHRoZSBzaW11bGF0b3Igc3VwcG9ydHMgcHJvZmlsaW5nLgotICAgU2VlIHRoZSBtaXBzIHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KLSAgIFRoaXMgZW5hYmxlcyB0aGUgYC1wIGZvbycgYW5kIGAtcyBiYXInIG9wdGlvbnMuCi0gICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9wcm9maWxleyxfc2l6ZX0uICAqLwotLyogI2RlZmluZSBTSU1fSEFWRV9QUk9GSUxFICovCi0KLS8qIERlZmluZSB0aGlzIGlmIHRoZSBzaW11bGF0b3IgdXNlcyBhbiBpbnN0cnVjdGlvbiBjYWNoZS4KLSAgIFNlZSB0aGUgaDgvMzAwIHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KLSAgIFRoaXMgZW5hYmxlcyB0aGUgYC1jIHNpemUnIG9wdGlvbiB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGNhY2hlLgotICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfc2ltY2FjaGVfc2l6ZS4gICovCi0jZGVmaW5lIFNJTV9IQVZFX1NJTUNBQ0hFCi0KLS8qIEZJWE1FOiBUaGlzIGlzIGEgcXVpY2sgaGFjayBmb3IgcnVuLmMgc28gaXQgY2FuIHN1cHBvcnQgdGhlIGAtaCcgb3B0aW9uLgotICAgSXQgd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIGJ5IGEgbW9yZSBnZW5lcmFsIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgU0lNX0g4MzAwCmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvd3JpdGVjb2RlLmMgYi9zaW0vaDgzMDAvd3JpdGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmJmOWYuLjAwMDAwMDAKLS0tIGEvc2ltL2g4MzAwL3dyaXRlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMyArMCwwIEBACi0vKiBDb2RlIGdlbmVyYXRvciBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwIGFyY2hpdGVjdHVyZSBzaW11bGF0b3IuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBIOC8zMDAgc2ltCi0KLQotCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAotCi0gICBDeWdudXMgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEN5Z251cwotICAgbWFrZXMgbm8gd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UKLSAgIGFuZCB0aGUgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KLQotICAgQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTwotICAgVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0qLwotCi0vKiBUaGlzIHByb2dyYW0gcmVhZHMgdGhlIEg4LzMwMCBvcGNvZGUgdGFibGUgYW5kIHdyaXRlcyBvdXQKLSAgIGEgbGFyZ2Ugc3dpdGNoIHN0YXRlbWVudCB0byB1bmRlcnN0YW5kIHRoZSBvcGNvZGVzICh3aXRoIGlmcyBpZgotICAgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvcGNvZGUgcGVyIGNhc2UpIGFuZCBjb2RlIHRvIGRvIHRoZSBzdHVmZiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jZGVmaW5lIElOU0lNCi0jaW5jbHVkZSJvcGNvZGUvaDgzMDAuaCIKLQotI2RlZmluZSBNQVhTQU1FIDE0MAotCi0jZGVmaW5lIFBUV08gMjU2Ci1zdGF0aWMgc3RydWN0IGg4X29wY29kZSAqaDhfb3Bjb2Rlc19zb3J0ZWRbUFRXT11bTUFYU0FNRV07Ci0KLWNoYXIgKmNzID0gIi8qIjsKLWNoYXIgKmNlID0gIiovIjsKLQotLyogSG93IHRvIGdldCBhdCBuaWJibGUgbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiAqLwotY2hhciAqbmlic1tdID0KLXsKLSAgImZvbyIsCi0gICIoYjAmMHhmKSIsCi0gICIoKGIxPj40KSYweGYpIiwKLSAgIigoYjEpJjB4ZikiLAotICAiKChwY1sxXT4+MTIpJjB4ZikiLAotICAiKChwY1sxXT4+OCkmMHhmKSIsCi0gICIoKHBjWzFdPj40KSYweGYpIiwKLSAgIigocGNbMV0pJjB4ZikiLAotICAwLCAwfTsKLQotLyogaG93IHRvIGdldCBhdCB0aGUgMyBiaXQgaW1tZWRpYXRlIGluIHRoZSBpbnN0cnVjdGlvbiAqLwotY2hhciAqaW1tM1tdID0KLXsiZm9vIiwKLSAiZm9vIiwKLSAiKChiMT4+NCkmMHg3KSIsCi0gImZvbyIsCi0gImZvbyIsCi0gImZvbyIsCi0gIihwY1sxXT4+NCkmMHg3In07Ci0KLS8qIEhvdyB0byBnZXQgYXQgYSBieXRlIHJlZ2lzdGVyIGZyb20gYW4gaW5kZXggaW4gdGhlIGluc3RydWN0aW9uIGF0Ci0gICBuaWJibGUgbiAqLwotY2hhciAqYnJlZ1tdID0KLXsiZm9vIiwKLSAiKihibG93W2IwXSkiLAotICIqKGJoaWdoW2IxXSkiLAotICIqKGJsb3dbYjFdKSIsCi0gMCwgMCwKLSAiKihiaGlnaFtwY1sxXT4+OF0pIn07Ci0KLS8qIEhvdyB0byBnZXQgYXQgYSB3b3JkIHJlZ2lzdGVyIGZyb20gYW4gaW5kZXggaW4gdGhlIGluc3RydWN0aW9uIGF0Ci0gICBuaWJibGUgbiAqLwotCi1jaGFyICp3cmVnW10gPQoteyJmb28iLAotICIqKHdsb3dbYjBdKSIsCi0gIiood2hpZ2hbYjFdKSIsCi0gIiood2xvd1tiMV0pIn07Ci0KLSNkZWZpbmUgc29ydGVkX2tleSBub3BlcmFuZHMKLQotLyogc29ydCB0aGUgb3Bjb2RlIHRhYmxlIGludG8gaDhfb3Bjb2Rlc19zb3J0ZWRbMC4uMjU1XSAqLwotc3RhdGljIHZvaWQKLWluaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0KLSAgZm9yIChwID0gaDhfb3Bjb2RlczsgcC0+bmFtZTsgcCsrKQotICAgIHsKLSAgICAgIGludCBuMSA9IDA7Ci0gICAgICBpbnQgbjIgPSAwOwotICAgICAgaW50IGo7Ci0jaWYgMAotICAgICAgZm9yIChqID0gMDsgcC0+ZGF0YS5uaWJbal0gIT0gRTsgaisrKQotCXsKLQkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SUkVMOFNSQykKLQkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNlNSQzsKLQkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SOFNSQykKLQkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNlNSQzsKLQkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SOERTVCkKLQkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNkRTVDsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzBdIDwgMTYpCi0JewotCSAgbjEgPSAoaW50KSBwLT5kYXRhLm5pYlswXTsKLQl9Ci0gICAgICBlbHNlCi0JbjEgPSAwOwotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCi0JewotCSAgbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKLQl9Ci0gICAgICBlbHNlCi0JbjIgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IE1BWFNBTUU7IGkrKykKLQl7Ci0JICBpbnQgaiA9IC8qICgobjMgPj4gMykgKiA1MTIpICsgKChuNCA+PiAzKSAqIDI1NikgKyAqLyBuMSAqIDE2ICsgbjI7Ci0KLQkgIGlmIChoOF9vcGNvZGVzX3NvcnRlZFtqXVtpXSA9PSAoc3RydWN0IGg4X29wY29kZSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaDhfb3Bjb2Rlc19zb3J0ZWRbal1baV0gPSBwOwotCSAgICAgIHAtPnNvcnRlZF9rZXkgPSBqOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaSA9PSBNQVhTQU1FKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBKdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmUgYW4gZXZlbiBudW1iZXIgb2YgbmliYmxlcyBpbiBpdCwgYW5kCi0gICAgICAgdGhhdCB0aGUgY291bnQgaXMgdGhlIHNhbWUgcyB0aGUgbGVuZ3RoICovCi0gICAgICBmb3IgKGkgPSAwOyBwLT5kYXRhLm5pYltpXSAhPSBFOyBpKyspCi0JLypFTVBUWSovIDsKLSAgICAgIGlmIChpICYgMSkKLQlhYm9ydCAoKTsKLSAgICAgIHAtPmxlbmd0aCA9IGkgLyAyOwotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IFBUV087IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaDhfb3Bjb2Rlc19zb3J0ZWRbaV1bMF0pCi0JcCA9IGg4X29wY29kZXNfc29ydGVkW2ldWzBdOwotICAgICAgZWxzZQotCWg4X29wY29kZXNfc29ydGVkW2ldWzBdID0gcDsKLSAgICB9Ci19Ci0KLS8qIGRlY29kZSB0aGUgbHZhbHVlcywgY3JlYXRpbmcgYSBwb2ludGVyIGluIHJlYWwgc3BhY2UgdG8gb2JqZWN0IC0KLSByZW1lbWJlciBpZiB0aGUgdGhpbmcgaGFzIHRvIGJlIHN3YXBwZWQgb3V0IG9mIHdoZXJlIGl0IGlzICovCi0KLQotaW50IHN3YXBbMl07Ci0KLWx2YWwgKHApCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IHAtPmRhdGEubmliW2ldICE9IEU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgeCA9IHAtPmRhdGEubmliW2ldOwotICAgICAgaW50IHNpemU7Ci0gICAgICBpbnQgb3A7Ci0gICAgICBvcCA9ICh4ICYgRFNUKSA/IDEgOiAwOwotCi0gICAgICBzd2l0Y2ggKHggJiBTSVpFKQotCXsKLQljYXNlIExfMzI6Ci0JICBzaXplID0gMzI7Ci0JICBicmVhazsKLQljYXNlIExfMTY6Ci0JICBzaXplID0gMTY7Ci0JICBicmVhazsKLQljYXNlIExfODoKLQkgIHNpemUgPSA4OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNpemUgPSAxMjM0OwotCX0KLQotICAgICAgaWYgKHggJiBSRUcpCi0JewotCSAgcHJpbnRmICgiaXIlZCA9IEdFVF9MVkFMXyVkX1JFRyglZCk7XG4iLCBvcCwgc2l6ZSwgaSk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIElNTSkKLQl7Ci0JICBwcmludGYgKCIvKiBJbW0gaGFzIG5vIGx2YWx1ZSAqL1xuIik7Ci0JfQotCi0gICAgfQotCi0KLQotfQotCi12b2lkCi1kZWNvZGUgKHAsIGZldGNoLCBzaXplKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBpbnQgZmV0Y2g7Ci0gICAgIGludCBzaXplOwotewotICBpZiAoZmV0Y2gpCi0gICAgewotICAgICAgbHZhbCAocCk7Ci0gICAgfQotCi19Ci0KLQotCi1zdGF0aWMgdm9pZAotZXNsZWVwICgpCi17Ci0gIHByaW50ZiAoInNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9IFNJR1NUT1A7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLW1vdiAocCwgcywgc3opCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0gICAgIGNoYXIgKnM7Ci0gICAgIGludCBzejsKLXsKLSAgcHJpbnRmICgiZHN0ID0gc3JjYTtcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotYW5kYyAocCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKLXsKLSAgcHJpbnRmICgiU0VUX0NDUihHRVRfQ0NSKCkgJiBzcmNhKTtcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotYWRkeCAocCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKLXsKLSAgcHJpbnRmICgiZHN0ID0gc3JjYSArIHNyY2IrIChjICE9IDApO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdWJ4IChwKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotewotICBwcmludGYgKCJkc3QgPSBzcmNiIC0gc3JjYSAtIChjICE9IDApO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGQgKHAsIHMsIHN6KQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICpzOwotICAgICBpbnQgc3o7Ci17Ci0gIHByaW50ZiAoIiVzO1xuIiwgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRzIChwLCBzKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICpzOwotewotICBwcmludGYgKCIlcztcbiIsIHMpOwotfQotCi1zdGF0aWMgdm9pZAotYnJhIChwLCBhKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICphOwotewotICBwcmludGYgKCJpZiAoJXMpIG5wYyArPSAoKGNoYXIgKWIxKT4+MTtcbiIsIGEpOwotfQotCi1zdGF0aWMgdm9pZAotYnNyIChwLCBhKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICphOwotewotICBwcmludGYgKCJyZWdbN10tPTI7XG4iKTsKLSAgcHJpbnRmICgidG1wID0gcmVnWzddO1xuIik7Ci0gIHByaW50ZiAoIlNFVF9XT1JEX01FTSh0bXAsIChucGMtc2F2ZWRfc3RhdGUubWVtKSoyKTtcbiIpOwotICBwcmludGYgKCJucGMgKz0gKChjaGFyKWIxKT4+MTtcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotY21wIChwLCBhLCBzKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICphOwotICAgICBpbnQgczsKLXsKLSAgZGVjb2RlIChwLCAxLCBzKTsKLSAgcHJpbnRmICgic3JjYSA9IC1zcmNhO1xuIik7Ci0gIHByaW50ZiAoImRzdCA9IHNyY2EgKyBzcmNiO1xuIik7Ci19Ci0KLXN0YXRpYwotdm9pZAotanNyIChwLCBhLCBzKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICphOwotICAgICBpbnQgczsKLXsKLSAgcHJpbnRmICgiaWYgKGIxID09IDB4YzQpIHtcbiIpOwotICBwcmludGYgKCJwcmludGYoXCIlJWNcIiwgcmVnWzJdKTtcbiIpOwotICBwcmludGYgKCJ9XG4iKTsKLSAgcHJpbnRmICgiZWxzZSB7XG4iKTsKLSAgcHJpbnRmICgicmVnWzddLT0yO1xuIik7Ci0gIHByaW50ZiAoInRtcCA9IHJlZ1s3XTtcbiIpOwotICBwcmludGYgKCJTRVRfV09SRF9NRU0odG1wLCAobnBjLXNhdmVkX3N0YXRlLm1lbSkqMik7XG4iKTsKLSAgcHJpbnRmICgibnBjID0gKGx2YWw+PjEpICsgc2F2ZWRfc3RhdGUubWVtO1xuIik7Ci0gIHByaW50ZiAoIn0iKTsKLX0KLQotc3RhdGljIHZvaWQKLWptcCAocCwgYSwgcykKLSAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKLSAgICAgY2hhciAqYTsKLSAgICAgaW50IHM7Ci17Ci0gIHByaW50ZiAoIm5wYyA9IChsdmFsPj4xKSArIHNhdmVkX3N0YXRlLm1lbTtcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcnRzIChwLCBhLCBzKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotICAgICBjaGFyICphOwotICAgICBpbnQgczsKLXsKLSAgcHJpbnRmICgidG1wID0gcmVnWzddO1xuIik7Ci0gIHByaW50ZiAoInJlZ1s3XSs9MjtcbiIpOwotICBwcmludGYgKCJucGMgPSBzYXZlZF9zdGF0ZS5tZW0gKyAoV09SRF9NRU0odG1wKT4+MSk7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXJ0ZSAocCwgYSwgcykKLSAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKLSAgICAgY2hhciAqYTsKLSAgICAgaW50IHM7Ci17Ci0gIHByaW50ZiAoInJlZ1s3XSs9MjtcbiIpOwotICBwcmludGYgKCJ0bXAgPSByZWdbN107XG4iKTsKLSAgcHJpbnRmICgicmVnWzddKz0yO1xuIik7Ci0gIHByaW50ZiAoIlNFVF9DQ1IodG1wKTtcbiIpOwotICBwcmludGYgKCJucGMgPSBzYXZlZF9zdGF0ZS5tZW0gKyAoV09SRF9NRU0odG1wKT4+MSk7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldGYgKHAsIGEsIHMpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0gICAgIGNoYXIgKmE7Ci0gICAgIGludCBzOwotewotICBwcmludGYgKCJ0bXAgPSBHRVRfQ0NSKCk7XG4iKTsKLSAgcHJpbnRmICgidG1wICVzPSBzcmNhO1xuIiwgYSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1icHQgKHAsIGEsIHMpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0gICAgIGNoYXIgKmE7Ci0gICAgIGludCBzOwotewotICBwcmludGYgKCJzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQO1xuIik7Ci0gIHByaW50ZiAoIm5wYyA9IHBjO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2cgKHAsIGEsIHMpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0gICAgIGNoYXIgKmE7Ci0gICAgIGludCBzOwotewotICBwcmludGYgKCJkc3QgPSBzcmNiICVzIHNyY2E7XG4iLCBhKTsKLX0KLQotc3RhdGljIHZvaWQKLXVsb2cgKHAsIGEsIHMpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0gICAgIGNoYXIgKmE7Ci0gICAgIGludCBzOwotewotICBwcmludGYgKCJkc3QgPSAlcyBzcmNiIDtcbiIsIGEpOwotfQotCi1zdGF0aWMgdm9pZAotbm9wICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1yb3RsICgpCi17Ci0gIHByaW50ZiAoImMgPSBzcmNiICYgMHg4MDtcbiIpOwotICBwcmludGYgKCJkc3QgPSBzcmNiIDw8IDE7XG4iKTsKLSAgcHJpbnRmICgiaWYgKGMpIGRzdHw9MTtcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcm90ciAoKQotewotICBwcmludGYgKCJjID0gc3JjYiAmIDE7XG4iKTsKLSAgcHJpbnRmICgiZHN0ID0gc3JjYiA+PiAxO1xuIik7Ci0gIHByaW50ZiAoImlmIChjKSBkc3R8PTB4ODA7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXJvdHhsICgpCi17Ci0gIHByaW50ZiAoInRtcCA9IHNyY2IgJiAweDgwO1xuIik7Ci0gIHByaW50ZiAoImRzdCA9IHNyY2IgPDwgMTtcbiIpOwotICBwcmludGYgKCJpZiAoYykgZHN0fD0xO1xuIik7Ci0gIHByaW50ZiAoImMgPSB0bXA7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXJvdHhyICgpCi17Ci0gIHByaW50ZiAoInRtcCA9IHNyY2IgJiAxO1xuIik7Ci0gIHByaW50ZiAoImRzdCA9IHNyY2IgPj4gMTtcbiIpOwotICBwcmludGYgKCJpZiAoYykgZHN0fD0weDgwO1xuIik7Ci0gIHByaW50ZiAoImMgPSB0bXA7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNoYWwgKCkKLXsKLSAgcHJpbnRmICgiYyA9IHNyY2ImMHg4MDtcbiIpOwotICBwcmludGYgKCJkc3QgPSBzcmNiIDw8IDE7XG4iKTsKLX0KLQotc3RhdGljCi12b2lkCi1zaGFyICgpCi17Ci0gIHByaW50ZiAoImMgPSBzcmNiJjB4MTtcbiIpOwotICBwcmludGYgKCJpZiAoc3JjYiYweDgwKSBkc3QgPSAoc3JjYj4+MSkgfCAweDgwO1xuIik7Ci0gIHByaW50ZiAoImVsc2UgIGRzdCA9IChzcmNiPj4xKSAmfiAweDgwO1xuIik7Ci19Ci0KLXN0YXRpYwotdm9pZAotc2hsbCAoKQotewotICBwcmludGYgKCJjID0gc3JjYiYweDgwO1xuIik7Ci0gIHByaW50ZiAoImRzdCA9IHNyY2IgPDwgMTtcbiIpOwotfQotCi1zdGF0aWMKLXZvaWQKLXNobHIgKCkKLXsKLSAgcHJpbnRmICgiYyA9IHNyY2ImMHgxO1xuIik7Ci0gIHByaW50ZiAoImRzdCA9IChzcmNiPj4xKSAmfiAweDgwO1xuIik7Ci19Ci0KLXN0YXRpYwotdm9pZAotZGl2eHUgKCkKLXsKLSAgcHJpbnRmICgic3JjYSA9ICVzO1xuIiwgYnJlZ1syXSk7Ci0gIHByaW50ZiAoInNyY2IgPSAlcztcbiIsIHdyZWdbM10pOwotICBwcmludGYgKCJuID0gc3JjYSAmIDB4ODA7XG4iKTsKLSAgcHJpbnRmICgieiA9ICFzcmNhO1xuIik7Ci0gIHByaW50ZiAoImlmIChzcmNhKSBkc3QgPSBzcmNiIC8gc3JjYTt0bXAgPSBzcmNiICUlIHNyY2E7XG4iKTsKLSAgcHJpbnRmICgiJXMgPSAoZHN0ICYgMHhmZikgfCAodG1wIDw8IDgpO1xuIiwgd3JlZ1szXSk7Ci19Ci0KLXN0YXRpYwotdm9pZAotbXVseHUgKCkKLXsKLSAgcHJpbnRmICgic3JjYSA9ICVzO1xuIiwgYnJlZ1syXSk7Ci0gIHByaW50ZiAoInNyY2IgPSAlcztcbiIsIHdyZWdbM10pOwotCi0gIHByaW50ZiAoImRzdCA9IChzcmNiJjB4ZmYpICogc3JjYTtcbiIpOwotICBwcmludGYgKCIlcyA9IGRzdDtcbiIsIHdyZWdbM10pOwotfQotCi1zdGF0aWMKLXZvaWQKLWluYyAoKQotewotICBwcmludGYgKCJkc3QgPSAlcztcbiIsIGJyZWdbM10pOwotICBwcmludGYgKCJ2ID0gKGRzdD09MHg3Zik7XG4iKTsKLSAgcHJpbnRmICgiZHN0Kys7XG4iKTsKLSAgcHJpbnRmICgiJXM9IGRzdDtcbiIsIGJyZWdbM10pOwotfQotCi1zdGF0aWMKLXZvaWQKLWJpdCAocCwgYSwgcykKLSAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKLSAgICAgY2hhciAqYTsKLSAgICAgaW50IHM7Ci17Ci0gIHByaW50ZiAoIiVzXG4iLCBhKTsKLX0KLQotc3RhdGljCi12b2lkCi1kZWMgKCkKLXsKLSAgcHJpbnRmICgiZHN0ID0gJXM7XG4iLCBicmVnWzNdKTsKLSAgcHJpbnRmICgidiA9IChkc3Q9PTB4ODApO1xuIik7Ci0gIHByaW50ZiAoImRzdC0tO1xuIik7Ci0gIHByaW50ZiAoIiVzID0gZHN0O1xuIiwgYnJlZ1szXSk7Ci19Ci0KLWNoYXIgc2FmW10gPSAiZ290byBzZXRmbGFnczsiOwotY2hhciBzZltdID0gImdvdG8gc2hpZnRmbGFnczsiOwotY2hhciBhZjhbXSA9ICJnb3RvIGFsdWZsYWdzODsiOwotY2hhciBhZjE2W10gPSAiZ290byBhbHVmbGFnczE2OyI7Ci1jaGFyIGxmW10gPSAiZ290byBsb2dmbGFnczsiOwotY2hhciBpY2ZbXSA9ICJnb3RvIGluY2ZsYWdzOyI7Ci1jaGFyIG1mOFtdID0gImdvdG8gbW92ZmxhZ3M4OyI7Ci1jaGFyIG1mMTZbXSA9ICJnb3RvIG1vdmZsYWdzMTY7IjsKLWNoYXIgbnhbXSA9ICJnb3RvIG5leHQ7IjsKLQotc3RydWN0Ci17Ci0gIGNoYXIgKmZ0eXBlOwotICBpbnQgZGVjb2RlOwotICBjaGFyICpuYW1lOwotICB2b2lkICgqZnVuYykgKCk7Ci0gIGNoYXIgKmFyZzsKLSAgaW50IHNpemU7Ci0KLX0KLQotdGFibGVbXSA9Ci17Ci0gIHsKLSAgICBueCwgMSwgImJsZCIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSAoc3JjYj4+c3JjYSkmMTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJiaWxkIiwgYml0LCAiZHN0ID0gc3JjYjsgYyA9ICEoKHNyY2I+PnNyY2EpJjEpOyIsIDgKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJhbmQiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyAmJigoc3JjYj4+c3JjYSkmMSk7IiwgOAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmlhbmQiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyAmJighKChzcmNiPj5zcmNhKSYxKSk7IiwgOAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmlvciIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSBDIHx8KCEoKHNyY2I+PnNyY2EpJjEpKTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJib3IiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyB8fCgoKHNyY2I+PnNyY2EpJjEpKTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJiaXhvciIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSBDIF4oISgoc3JjYj4+c3JjYSkmMSkpOyIsIDgKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJ4b3IiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyBeKCgoc3JjYj4+c3JjYSkmMSkpOyIsIDgKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJub3QiLCBiaXQsICJkc3QgPSBzcmNiIF4gKDE8PHNyY2EpOyIsIDgKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJjbHIiLCBiaXQsICJkc3QgPSBzcmNiICYgfigxPDxzcmNhKTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJic2V0IiwgYml0LCAiZHN0ID0gc3JjYiB8ICgxPDxzcmNhKTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJic3QiLCBiaXQsICJkc3QgPSAoc3JjYiAmIH4oMTw8c3JjYSkpfCAoKEMpPDxzcmNhKTsiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJiaXN0IiwgYml0LCAiZHN0ID0gKHNyY2IgJiB+KDE8PHNyY2EpKXwgKCghQyk8PHNyY2EpOyIsIDgKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJ0c3QiLCBiaXQsICJkc3QgPSBzcmNiOyB6ID0gISgoc3JjYj4+c3JjYSkmMSk7IiwgOAotICB9Ci0gICwKLSAgewotICAgIGljZiwgMCwgImRlYyIsIGRlYywgMCwgMAotICB9Ci0gICwKLSAgewotICAgIGljZiwgMCwgImluYyIsIGluYywgMCwgMAotICB9Ci0gICwKLSAgewotICAgIHNhZiwgMSwgIm9yYyIsIHNldGYsICJ8IiwgMAotICB9Ci0gICwKLSAgewotICAgIHNhZiwgMSwgInhvcmMiLCBzZXRmLCAiXiIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBzYWYsIDEsICJhbmRjIiwgc2V0ZiwgIiYiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJub3AiLCBub3AsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJyYSIsIGJyYSwgIjEiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJicm4iLCBicmEsICIwIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmhpIiwgYnJhLCAiKEN8fFopPT0wIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmxzIiwgYnJhLCAiKEN8fFopPT0xIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmNzIiwgYnJhLCAiQz09MSIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJjYyIsIGJyYSwgIkM9PTAiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJicGwiLCBicmEsICJOPT0wIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYm1pIiwgYnJhLCAiTj09MSIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJ2cyIsIGJyYSwgIlY9PTEiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJidmMiLCBicmEsICJWPT0wIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYmdlIiwgYnJhLCAiKE5eVik9PTAiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJiZ3QiLCBicmEsICIoWnwoTl5WKSk9PTAiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJibHQiLCBicmEsICIoTl5WKT09MSIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJsZSIsIGJyYSwgIihafChOXlYpKT09MSIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgImJlcSIsIGJyYSwgIlo9PTEiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJibmUiLCBicmEsICJaPT0wIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYnNyIiwgYnNyLCAiIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAianNyIiwganNyLCAwLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJqbXAiLCBqbXAsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMCwgInJ0cyIsIHJ0cywgMCwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAwLCAicnRlIiwgcnRlLCAwLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbngsIDEsICJhbmRjIiwgYW5kYywgMCwgMAotICB9Ci0gICwKLSAgewotICAgIHNmLCAxLCAic2hhbCIsIHNoYWwsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBzZiwgMSwgInNoYXIiLCBzaGFyLCAwLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgc2YsIDEsICJzaGxsIiwgc2hsbCwgMCwgMAotICB9Ci0gICwKLSAgewotICAgIHNmLCAxLCAic2hsciIsIHNobHIsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBzZiwgMSwgInJvdHhsIiwgcm90eGwsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBzZiwgMSwgInJvdHhyIiwgcm90eHIsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBzZiwgMSwgInJvdGwiLCByb3RsLCAwLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgc2YsIDEsICJyb3RyIiwgcm90ciwgMCwgMAotICB9Ci0gICwKLSAgewotICAgIGxmLCAxLCAieG9yIiwgbG9nLCAiXiIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBsZiwgMSwgImFuZCIsIGxvZywgIiYiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbGYsIDEsICJvciIsIGxvZywgInwiLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbGYsIDEsICJub3QiLCB1bG9nLCAiIH4iLCAwCi0gIH0KLSAgLAotICB7Ci0gICAgbGYsIDEsICJuZWciLCB1bG9nLCAiIC0gIiwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAiYWRkcyIsIGFkZHMsICJkc3QgPSBzcmNhICsgc3JjYiIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMSwgInN1YnMiLCBhZGRzLCAic3JjYSA9IC1zcmNhOyBkc3QgPSBzcmNiICsgc3JjYSIsIDAKLSAgfQotICAsCi0gIHsKLSAgICBhZjgsIDEsICJhZGQuYiIsIGFkZCwgImRzdCA9IHNyY2EgKyBzcmNiIiwgOAotICB9Ci0gICwKLSAgewotICAgIGFmMTYsIDEsICJhZGQudyIsIGFkZCwgImRzdCA9IHNyY2EgKyBzcmNiIiwgMTYKLSAgfQotICAsCi0gIHsKLSAgICBhZjE2LCAxLCAic3ViLnciLCBhZGQsICJzcmNhID0gLXNyY2E7IGRzdCA9IHNyY2IgKyBzcmNhIiwgMTYKLSAgfQotICAsCi0gIHsKLSAgICBhZjgsIDEsICJzdWIuYiIsIGFkZCwgInNyY2EgPSAtc3JjYTsgZHN0ID0gc3JjYiArIHNyY2EiLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgYWY4LCAxLCAiYWRkeCIsIGFkZHgsIDAsIDgKLSAgfQotICAsCi0gIHsKLSAgICBhZjgsIDEsICJzdWJ4Iiwgc3VieCwgMCwgOAotICB9Ci0gICwKLSAgewotICAgIGFmOCwgMCwgImNtcC5iIiwgY21wLCAwLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgYWYxNiwgMCwgImNtcC53IiwgY21wLCAwLCAxNgotICB9Ci0gICwKLSAgewotICAgIG54LCAxLCAic2xlZXAiLCBlc2xlZXAsIDAsIDAKLSAgfQotICAsCi0gIHsKLSAgICBueCwgMCwgImJwdCIsIGJwdCwgMCwgOAotICB9Ci0gICwKLSAgewotICAgIG54LCAwLCAiZGl2eHUiLCBkaXZ4dSwgMCwgMAotICB9Ci0gICwKLSAgewotICAgIG54LCAwLCAibXVseHUiLCBtdWx4dSwgMCwgMAotICB9Ci0gICwKLSAgewotICAgIG1mOCwgMSwgIm1vdi5iIiwgbW92LCAwLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbWY4LCAxLCAibW92dHBlIiwgbW92LCAwLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbWY4LCAxLCAibW92ZnBlIiwgbW92LCAwLCA4Ci0gIH0KLSAgLAotICB7Ci0gICAgbWYxNiwgMSwgIm1vdi53IiwgbW92LCAwLCAxNgotICB9Ci0gICwKLSAgewotICAgIDAKLSAgfQotfTsKLQotc3RhdGljCi12b2lkCi1lZG8gKHApCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci17Ci0gIGludCBpOwotCi0gIHByaW50ZiAoIiVzICVzICVzXG4iLCBjcywgcC0+bmFtZSwgY2UpOwotCi0gIGZvciAoaSA9IDA7IHRhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICh0YWJsZVtpXS5uYW1lLCBwLT5uYW1lKSA9PSAwKQotCXsKLQkgIHByaW50ZiAoIntcbiIpOwotCSAgaWYgKHRhYmxlW2ldLmRlY29kZSkKLQkgICAgZGVjb2RlIChwLCAxLCB0YWJsZVtpXS5zaXplKTsKLQkgIHByaW50ZiAoImN5Y2xlcyArPSAlZDtcbiIsIHAtPnRpbWUpOwotCSAgcHJpbnRmICgibnBjID0gcGMgKyAlZDtcbiIsIHAtPmxlbmd0aCAvIDIpOwotCSAgdGFibGVbaV0uZnVuYyAocCwgdGFibGVbaV0uYXJnLCB0YWJsZVtpXS5zaXplKTsKLQkgIGlmICh0YWJsZVtpXS5kZWNvZGUpCi0JICAgIGRlY29kZSAocCwgMCwgdGFibGVbaV0uc2l6ZSk7Ci0JICBpZiAodGFibGVbaV0uZnR5cGUpCi0JICAgIHByaW50ZiAodGFibGVbaV0uZnR5cGUpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCJnb3RvIG5leHQ7XG4iKTsKLQkgIHByaW50ZiAoIn1cbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIHByaW50ZiAoIiVzIG5vdCBmb3VuZCAlc1xuIiwgY3MsIGNlKTsKLSAgcHJpbnRmICgic2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMO1xuIik7Ci0gIHByaW50ZiAoImJyZWFrO1xuIik7Ci19Ci0KLXN0YXRpYwotaW50Ci1vd3JpdGUgKGkpCi0gICAgIGludCBpOwotewotICAvKiB3cml0ZSBpZiBzdGF0ZW1lbnRzIHRvIHNlbGVjdCB0aGUgcmlnaHQgb3Bjb2RlICovCi0gIHN0cnVjdCBoOF9vcGNvZGUgKipwOwotICBpbnQgbmVlZGFuZCA9IDE7Ci0KLSAgcCA9IGg4X29wY29kZXNfc29ydGVkW2ldOwotICBwcmludGYgKCJjYXNlIDB4JTAzeDpcbiIsIGkpOwotCi0gIGlmIChwWzFdID09IDApCi0gICAgewotICAgICAgLyogU2VlIGlmIHRoZSBuZXh0IGZldyBhbHNvIG1hdGNoICovCi0gICAgICB3aGlsZSAoaDhfb3Bjb2Rlc19zb3J0ZWRbaSArIDFdWzBdID09ICpwKQotCXsKLQkgIGkrKzsKLQkgIHByaW50ZiAoImNhc2UgMHglMDN4OlxuIiwgaSk7Ci0JfQotCi0gICAgICAvKiBEb250IG5lZWQgYW55IGlmJ3MgdGhpcyBpcyB0aGUgb25seSBvbmUgKi8KLSAgICAgIGVkbyAoKnApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICgqcCkKLQl7Ci0JICAvKiBzdGFydCB0d28gbmliYmxlcyBpbiBzaW5jZSB3ZSBrbm93IHdlIG1hdGNoIGluIHRoZSBmaXJzdCBieXRlICovCi0JICBpbnQgYzsKLQkgIGludCBuaWIgPSAyOwotCSAgaW50IGJ5dGUgPSAxOwotCSAgaW50IG1hc2sxWzVdOwotCSAgaW50IG1hc2swWzVdOwotCSAgaW50IG5pYnNoaWZ0ID0gNDsKLQkgIGludCBhbnkgPSAwOwotCi0JICBmb3IgKGMgPSAwOyBjIDwgNTsgYysrKQotCSAgICB7Ci0JICAgICAgbWFzazFbY10gPSAwOwotCSAgICAgIG1hc2swW2NdID0gMDsKLQkgICAgfQotCSAgcHJpbnRmICgiJXMgJXgleCIsIGNzLCAoKnApLT5kYXRhLm5pYlswXSwgKCpwKS0+ZGF0YS5uaWJbMV0pOwotCSAgd2hpbGUgKChjID0gKCpwKS0+ZGF0YS5uaWJbbmliXSkgIT0gRSkKLQkgICAgewotCSAgICAgIGlmIChjICYgQjMwKQotCQl7Ci0JCSAgLyogYml0IDMgbXVzdCBiZSB6ZXJvICovCi0JCSAgbWFzazBbYnl0ZV0gfD0gMHg4IDw8IG5pYnNoaWZ0OwotCQkgIHByaW50ZiAoIjAiKTsKLQkJICBhbnkgPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyAmIEIzMSkKLQkJewotCQkgIC8qIGJpdCAzIG11c3QgYmUgb25lICovCi0JCSAgbWFzazFbYnl0ZV0gfD0gMHg4IDw8IG5pYnNoaWZ0OwotCQkgIHByaW50ZiAoIjgiKTsKLQkJICBhbnkgPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA8PSBIZXhGKQotCQl7Ci0JCSAgbWFzazBbYnl0ZV0gfD0gKCh+YykgJiAweGYpIDw8IG5pYnNoaWZ0OwotCQkgIG1hc2sxW2J5dGVdIHw9IChjICYgMHhmKSA8PCBuaWJzaGlmdDsKLQkJICBwcmludGYgKCIleCIsIGMpOwotCQkgIGFueSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBwcmludGYgKCJ4Iik7Ci0JCX0KLQkgICAgICBuaWIrKzsKLQkgICAgICBpZiAobmlic2hpZnQgPT0gNCkKLQkJewotCQkgIG5pYnNoaWZ0ID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJ5dGUrKzsKLQkJICBuaWJzaGlmdCA9IDQ7Ci0JCX0KLQkgICAgfQotCSAgcHJpbnRmICgiKi9cbiIpOwotCSAgaWYgKGFueSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoImlmICgiKTsKLQkgICAgICBuZWVkYW5kID0gMDsKLQkgICAgICBmb3IgKGMgPSAxOyBjIDwgYnl0ZTsgYysrKQotCQl7Ci0JCSAgaWYgKG1hc2swW2NdIHwgbWFzazFbY10pCi0JCSAgICB7Ci0JCSAgICAgIGludCBzaDsKLQotCQkgICAgICBpZiAobmVlZGFuZCkKLQkJCXByaW50ZiAoIlxuJiYiKTsKLQkJICAgICAgaWYgKGMgJiAxKQotCQkJc2ggPSAwOwotCQkgICAgICBlbHNlCi0JCQlzaCA9IDg7Ci0JCSAgICAgIGlmIChjIC8gMiA9PSAwICYmIHNoID09IDApCi0JCQlwcmludGYgKCIoKGIxJjB4JXgpPT0weCV4KSIsIG1hc2swW2NdIHwgbWFzazFbY10sCi0JCQkJbWFzazFbY10pOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHByaW50ZiAoIigocGNbJWRdJigweCUwMng8PCVkKSk9PSgweCV4PDwlZCkpIiwKLQkJCQkgIGMgLyAyLCBtYXNrMFtjXSB8IG1hc2sxW2NdLCBzaCwKLQkJCQkgIG1hc2sxW2NdLCBzaCk7Ci0JCQl9Ci0KLQkJICAgICAgbmVlZGFuZCA9IDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBwcmludGYgKCIpXG4iKTsKLQkgICAgfQotCSAgZWRvICgqcCk7Ci0JICBwKys7Ci0KLQl9Ci0gICAgfQotICByZXR1cm4gaTsKLX0KLQotc3RhdGljCi12b2lkCi1yZW1vdmVfZHVwcyAoKQotewotICBzdHJ1Y3QgaDhfb3Bjb2RlICpzOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpkOwotCi0gIGZvciAoZCA9IHMgPSBoOF9vcGNvZGVzOyBzLT5uYW1lOyBzKyspCi0gICAgewotICAgICAgaW50IGRvaXQgPSAxOwotCi0gICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAicHVzaCIpID09IDApCi0JZG9pdCA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAiYmhzIikgPT0gMCkKLQlkb2l0ID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsICJibG8iKSA9PSAwKQotCWRvaXQgPSAwOwotICAgICAgaWYgKHN0cmNtcCAocy0+bmFtZSwgImJ0IikgPT0gMCkKLQlkb2l0ID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsICJiZiIpID09IDApCi0JZG9pdCA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAicG9wIikgPT0gMCkKLQlkb2l0ID0gMDsKLSAgICAgIGlmIChkb2l0KQotCXsKLQkgICpkKysgPSAqczsKLQl9Ci0gICAgfQotICAqZCsrID0gKnMrKzsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCBpOwotCi0gIHJlbW92ZV9kdXBzICgpOwotICBpbml0ICgpOwotCi0gIHByaW50ZiAoIiVzIGRvIHRoZSBvcGVyYXRpb24gJXNcbiIsIGNzLCBjZSk7Ci0gIHByaW50ZiAoInN3aXRjaCAoYjApIFxue1xuIik7Ci0gIGZvciAoaSA9IDA7IGkgPCBQVFdPOyBpKyspCi0gICAgewotICAgICAgaSA9IG93cml0ZSAoaSk7Ci0gICAgfQotICBwcmludGYgKCJ9XG4iKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9DaGFuZ2VMb2cgYi9zaW0vaDg1MDAvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRmNzg0Li4wMDAwMDAwCi0tLSBhL3NpbS9oODUwMC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotVHVlIE1heSAyMyAyMTozOToyMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi1UdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVN1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVN1biBBcHIgMjYgMTU6MjA6MTEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgotCi1GcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1GcmkgQXByIDI0IDExOjE5OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgotCi1TYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgRmViIDE3IDEyOjQzOjQyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFBhc3MgNCBpbnRvIHNpbV9zdG9yZV9yZWdpc3Rlci4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCi0gCXNpbV9sb2FkX2ZpbGUuCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1UdWUgQXVnIDI2IDEwOjM5OjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fa2lsbCk6IERlbGV0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLiAKLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTU6NTE6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCi0KLVR1ZSBNYXkgMjAgMTA6MzM6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgotCShzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KLQotVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBBcHIgMTggMTQ6MDI6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgQXByIDE3IDAzOjExOjA2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgotCSogY29tcGlsZS5jOiAjaW5jbHVkZSBiZmQuaC4KLQkoc2ltX2tpbmQsIG15bmFtZSwgc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLgotCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBDYWxsIHNpbV9sb2FkX2ZpbGUgdG8KLQlsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCi0KLVdlZCBBcHIgMTYgMTc6MzQ6NDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnN0LmggKEg4NTAwX01TSVpFKTogUmVuYW1lIGZyb20gTVNJWkUuCi0JKiBjb21waWxlLmMgKHNpbV9yZWFkLCBzaW1fd3JpdGUsIGluaXRfcG9pbnRlcnMpOiBVcGRhdGUuCi0KLU1vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVdlZCBBcHIgIDIgMTU6MDY6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBNYXIgMTMgMTI6NTA6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cgaW4KLQlhcmd2IGZvcm0uCi0JKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgotCi1UdWUgRmViICA0IDEzOjM2OjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKLQlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgotCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVRodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCi0Jc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCi0JKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCi0JbWFrZWZpbGUgZnJhZ21lbnQuCi0KLVdlZCBOb3YgMjAgMDE6NDg6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBzdHVmZiBtb3ZlZCB0byAuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCi0JKiBjb25maWd1cmUuaW46IFNpbXBsaWZ5IHVzaW5nIG1hY3JvcyBpbiAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKFNJTV9PQkpTLFNJTV9FWFRSQV9DRkxBR1MpOiBEZWZpbmUuCi0JKiBjb21waWxlLmMgKHNpbV9zZXRfc2ltY2FjaGVfc2l6ZSk6IFJlbmFtZWQgZnJvbSBzaW1fY3NpemUuCi0JKHNpbV9zaXplKSBOZXcgZnVuY3Rpb24uCi0JKHNpbV9jYWxsYmFjayk6IE5ldyBnbG9iYWwuICBSZWRpcmVjdCBhbGwgY2FsbHMgdG8gcHJpbnRmX2ZpbHRlcmVkCi0JdGhyb3VnaCBjYWxsYmFjay4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBSZWNvcmQgY2FsbGJhY2suCi0JKiBydW4uYzogRGVsZXRlLCB1c2luZyBvbmUgaW4gLi4vY29tbW9uIG5vdy4KLQkqIHRjb25maWcuaW46IE5ldyBmaWxlLgotCi1UaHUgT2N0ICAzIDE2OjE0OjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZyBoZXJlLgotCi1XZWQgSnVuIDI2IDEyOjIzOjM5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLSAgICAgICAgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLSAgICAgICAgKGRvY2Rpcik6IFJlbW92ZWQuCi0gICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotICAgICAgICAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCi0gICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1XZWQgRmViIDIxIDEyOjE1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi1GcmkgT2N0IDEzIDE1OjAzOjQ4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBOZXcuCi0KLVR1ZSBPY3QgMTAgMTE6MTA6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KLQotV2VkIFNlcCAyMCAxMzozNToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotRnJpIFNlcCAgOCAxMjozODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIERvbid0IHRyeSB0byB1c2UKLQliZmQvaG9zdHMvKi5oIGZpbGUgb3IgYmZkL2NvbmZpZy8qLm1oIGZpbGUuICBDYWxsIEFDX1BST0dfQ0MgYW5kCi0JQUNfUFJPR19SQU5MSUIuICBTdWJzdGl0dXRlIGluIHZhbHVlcyBmb3IgQ0ZMQUdTLCBIREVGSU5FUyBhbmQgQVIuCi0JQ2FsbCBBQ19DSEVDS19IRUFERVJTIGZvciBzdGRsaWIuaCBhbmQgdGltZS5oLiAgVG91Y2ggc3RhbXAuaCBpZgotCWNyZWF0aW5nIGNvbmZpZy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgotCSogTWFrZWZpbGUuaW4gKEFSKTogRGVmaW5lIGFzIEBBUkAuCi0JKENDKTogTmV3IHZhcmlhYmxlLCBkZWZpbmVkIGFzIEBDQ0AuCi0JKENGTEFHUyk6IERlZmluZSBhcyBAQ0ZMQUdTQC4KLQkoUkFOTElCKTogRGVmaW5lIGFzIEBSQU5MSUJALgotCShIREVGSU5FUywgVERFRklORVMpOiBOZXcgdmFyaWFibGVzLgotCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoY29tcGlsZS5vLCBydW4ubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShtb3N0bHljbGVhbik6IE1ha2UgdGhlIHNhbWUgYXMgY2xlYW4sIG5vdCBkaXN0Y2xlYW4uCi0JKGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KLQkoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgdXBvbiBAZnJhZ3NALiAgSnVzdCByZWJ1aWxkIE1ha2VmaWxlIHdoZW4KLQlpbnZva2luZyBjb25maWcuc3RhdHVzLgotCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgotCSogY29tcGlsZS5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlIDxzeXMvdGltZXMuaD4uCi0JSW5jbHVkZSA8dGltZS5oPiBhbmQgPHN0ZGxpYi5oPiBpZiB0aGV5IGV4aXN0LiAgRG9uJ3QgaW5jbHVkZQotCSJzeXNkZXAuaCIuCi0JKiBydW4uYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgSW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KLQlEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlICJiZmQuaCIsIG5vdCAiLi4vLi4vYmZkL2JmZC5oIi4KLQotVGh1IEF1ZyAxMCAxNjoyOToyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb21waWxlLmMgKHRyYXApOiBXYXRjaCBmb3IgYWJvcnQuCi0JKiBydW4uYyAobWFpbik6IFJldHVybiBub24temVybyBleGl0IGNvZGUgaWYgd2UgZGlkbid0Ci0JZXhpdCBjbGVhbmx5LgotCi1UaHUgQXVnIDEwIDA5OjQ0OjIwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBpbGUuYyAoZmluZCk6IEZpeCBhbm90aGVyIHRoaW5rby4KLQkqIHNpbV9yZXN1bWUgKE9fSlNSKTogTWFrZSBzdXJlIGFsbCBKU1JzIHN0YXkgaW4gdGhlIHNhbWUgcGFnZS4KLQotVGh1IEF1ZyAxMCAxMzo0Mzo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb21waWxlLm8pOiBSZW1vdmUgYnVpbGQgcnVsZS4KLQkoLmMubyk6IEFkZCBnZW5lcmljIGJ1aWxkIHJ1bGUuCi0KLVdlZCBBdWcgIDkgMDk6NDY6NDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEZpeCBDU0VBUkNILgotCSogY29tcGlsZS5jIChmaW5kKTogSGFuZGxlIEFCUzI0IGFuZCBBQlMxNiBjb3JyZWN0bHkuCi0JTWFrZSBKTVAgYW5kIEpTUiBzdGF5IGluIHJpZ2h0IHBhZ2UuCi0KLVRodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMuCi0KLVdlZCBKdWwgIDUgMTQ6MzI6NTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgcnVuLgotCSAgKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZS4KLQotCSogaDg1MDAubXQ6IFJlbW92ZWQuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGNvbnZlcnRlZCB0byBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dGNvbmYgMi40LgotCi1GcmkgSnVuIDMwIDE2OjUwOjU2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29tcGlsZS5jIChzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE1heSAyNCAxNjozMTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLU1vbiBNYXIgMjcgMTA6MzI6MzQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBydW4uYzogcGFyc2UgYXJndW1lbnRzIHdpdGggZ2V0b3B0KCkuCi0KLVR1ZSBGZWIgMjggMTc6MzA6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCBpZiBzcGVjaWZpYwotCWhvc3QgdW5hdmFpbGFibGUuCi0KLVdlZCBNYXkgMTggMTM6NTg6MDUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzaW1fKik6IENoYW5nZSByZXN1bHQgdG8gdm9pZCB3aGVyZSB0aGVyZSBpc24ndCBvbmUuCi0JKHNpbV9yZXN1bWUpOiBGaXggc3Vicm91dGluZSBjYWxsaW5nIChwdXNoIHJldHVybiBhZGRyZXNzKS4KLQkoc2ltX3NldF9wYyk6IERlbGV0ZS4KLQkoc2ltX2luZm8pOiBEZWxldGUgcHJpbnRmX2ZuIGFyZywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlDYWxsIHByaW50Zl9maWx0ZXJlZCBpbnN0ZWFkLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmVuYW1lZCBmcm9tIHNpbV9zZXRfYXJncy4KLQkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJ1bi5jOiAjaW5jbHVkZSA8dmFyYXJncy5oPiwgInJlbW90ZS1zaW0uaCIuCi0JKHByaW50Zl9maWx0ZXJlZCk6IE5ldyBmdW5jdGlvbi4KLQotU2F0IERlYyAxMSAxNjozNTozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzZWdmb3JyZWcpOiBOZXcgdmVjdG9yLiAoc2ltX3Jlc3VtZSk6IEdldCBaIGZsYWcKLQlyaWdodCBmb3IgYml0b3BzLiAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIsCi0Jc2ltX3NldF9wYyk6ICBVc2UgbmV3IHJlZ2lzdGVyIG5hbWluZyBjb252ZW50aW9uLgotCi1UaHUgT2N0IDI4IDE5OjMxOjI0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYzogI2luY2x1ZGUgImFuc2lkZWNsLmgiIGZvciByZW1vdGUtc2ltLmguCi0KLVR1ZSBPY3QgMjYgMTA6MDI6MTggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkkKHNyY2RpcikvLi4vLi4vZ2RiLgotCSogY29tcGlsZS5jOiAjaW5jbHVkZSAic3lzZGVwLmgiIGFuZCAicmVtb3RlLXNpbS5oIi4KLQkoU0VUX1NFR1JFRyk6IFByb3RlY3QgYXJnIGB5JyB3aXRoIHBhcmVucy4KLQkoc2ltX3Jlc3VtZSk6IE5ldyBhcmcgYHNpZ2duYWwnLgotCShzaW1fd3JpdGUpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGBhZGRyJywgaW50IHJlc3VsdC4KLQkoc2ltX3JlYWQpOiBEaXR0bywgdXNlIHVuc2lnbmVkIGNoYXIgKiBmb3IgYXJnIGBidWYnLgotCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LCB2YWx1ZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgotCShzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LCB1c2UgdW5zaWduZWQgY2hhciAqIGZvciBhcmcgYGJ1ZicuCi0JKHNpbV90cmFjZSk6IFVwZGF0ZSBjYWxsIHRvIHNpbV9yZXN1bWUuCi0JKHNpbV9zdG9wX3JlYXNvbik6IFJlbmFtZWQgZnJvbSBzaW1fc3RvcF9zaWduYWwsIG5ldyBhcmcgYHJlYXNvbicsCi0JaW50IHJlc3VsdCAoZXJyb3IgY29kZSwgY3VycmVudGx5IGFsd2F5cyAwKS4KLQkoc2ltX3NldF9wYyk6IFVwZGF0ZSBjYWxscyB0byBzaW1fc3RvcmVfcmVnaXN0ZXIuCi0JKHNpbV9pbmZvKTogaW50IHJlc3VsdCwgbmV3IGFyZ3MgYHByaW50X2ZuJywgYHZlcmJvc2UnLgotCShzaW1fa2lsbCk6IGludCByZXN1bHQuCi0JKHNpbV9vcGVuKTogRGl0dG8sIG5ldyBhcmcgYG5hbWUnLgotCSogcnVuLmMgKG1haW4pOiBVcGRhdGUgY2FsbCB0byBzaW1faW5mby4KLQotU2F0IE9jdCAyMyAxNTowNjoxMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb21waWxlLmMgKHNpbV9zdG9wX3NpZ25hbCk6IFJlc3VsdCBpcyBub3cgZW51bSBzaW1fc3RvcC4KLQotRnJpIE9jdCAxNSAyMzo1Mjo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzaW1fa2lsbCwgc2ltX29wZW4sIHNpbV9zZXRfYXJncyk6IE5ldyBmdW5jdGlvbnMuCi0KLVR1ZSBBdWcgMTcgMDc6MTc6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChzaW1faW5mbyk6IERvbid0IHdvcmsgb3V0IHNpbXVsYXRpb24gcmF0aW9uIGlmCi0JdGltZXRha2VuIGlzIHplcm8uCi0KLU1vbiBBdWcgIDIgMTQ6MDg6MjQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jIChnZXRfbm93LCBub3dfcGVyc2VjKTogVXNlIHRpbWUgc3lzdGVtIGNhbGwuIChmaW5kKSBkbwotCXBqbXBzIHJpZ2h0LgotCi1UdWUgSnVsIDEzIDEyOjIwOjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3NldF9wYyk6IHNldCBjcCBhdCB0aGUgc2FtZSB0aW1lLiAoc2ltX3Jlc3VtZSk6Ci0JZml4IHBqc3IgYW5kIHBqbXAuCi0KLVR1ZSBKdW4gIDggMTQ6MzQ6MzcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29tcGlsZS5jOiBSZW1vdmUgZW5kaWFuLmggZGVwZW5kZW5jeS4KLQotTW9uIEFwciAgNSAxMDowODozMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcnVuLmMgKG1haW4pOiBOb3cgdW5kZXJzdGFuZHMgLXYuCi0JKiBjb21waWxlLmM6IFBhc3NlcyBhbGwgdGhlIHRlc3RzIGluIHNtYWxsIG1vZGVsLgotCi1Nb24gTWFyIDI5IDEzOjIwOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBydW4uYywgaW5zdC5oIGNvbXBpbGUuYzogYnVnIGZpeGVzLAotCi1UaHUgTWFyIDI1IDEyOjIxOjE4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbXBpbGUuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyKTogIFVzZSBHREIgbmFtZXMgZm9yIHJlZ2lzdGVycyB0bwotCWF2b2lkIHZlcnNpb24gc2tldyBwcm9ibGVtcy4KLQkqIChzaW1fZmV0Y2hfcmVnaXN0ZXIpOiAgRGl0dG8sIGFsc28gcmV0dXJuIG9ubHkgYml0cyB0aGF0Ci0JYWN0dWFsbHkgZXhpc3QuCi0JKiBjb25maWd1cmUuaW46ICBGaXggc3JjdHJpZ2dlciAmIHNyY25hbWUgdG8gcmVmbGVjdCBoODUwMCwgbm90IGg4MzAwLgotCi1GcmkgTWFyIDE5IDE0OjQ2OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnN0LmgsIGNvbXBpbGUuYywgcnVuLmM6IE5ldyBmaWxlcy4KLQpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL01ha2VmaWxlLmluIGIvc2ltL2g4NTAwL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ4MDhlLi4wMDAwMDAwCi0tLSBhL3NpbS9oODUwMC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIGg4NTAwIHNpbSBsaWJyYXJ5LgotIyAgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLVNJTV9PQkpTID0gY29tcGlsZS5vIHNpbS1sb2FkLm8KLSMgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgYSBoYWNrIHRvIGdldCBhIHN5c2NhbGwuaC4gIGJldHRlciBzdXBwb3J0IGZvcgotIyBzeXNjYWxsLmggaXMgaW4gcHJvZ3Jlc3MuCi1TSU1fRVhUUkFfQ0ZMQUdTID0gLUkkKHNyY2RpcikvLi4vLi4vbmV3bGliL2xpYmMvc3lzL3o4awotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1jb21waWxlLm86IGNvbXBpbGUuYyBjb25maWcuaApkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2FjY29uZmlnLmggYi9zaW0vaDg1MDAvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vaDg1MDAvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2NvbXBpbGUuYyBiL3NpbS9oODUwMC9jb21waWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWQ2NDQuLjAwMDAwMDAKLS0tIGEvc2ltL2g4NTAwL2NvbXBpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MTkgKzAsMCBAQAotLyogU2ltdWxhdG9yIGZvciB0aGUgSGl0YWNoaSBIOC81MDAgYXJjaGl0ZWN0dXJlLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgSDgvNTAwIHNpbQotCi0KLQkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKLQotICAgQ3lnbnVzIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBDeWdudXMKLSAgIG1ha2VzIG5vIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlCi0gICBhbmQgdGhlIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCi0KLSAgIENZR05VUyBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQgVE8KLSAgIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAicmVtb3RlLXNpbS5oIgotCi0jZGVmaW5lIE9fUkVDT01QSUxFIDg1Ci0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKLQotLyogRklYTUU6IE5lZWRzIHRvIGxpdmUgaW4gaGVhZGVyIGZpbGUuCi0gICBUaGlzIGhlYWRlciBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZSB0aGluZ3MgaW4gcmVtb3RlLXNpbS5oLgotICAgT25lIGNvdWxkIG1vdmUgdGhpcyB0byByZW1vdGUtc2ltLmggYnV0IHRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVlZGVkCi0gICBieSBnZGIuICAqLwotdm9pZCBzaW1fc2V0X3NpbWNhY2hlX3NpemUgUEFSQU1TICgoaW50KSk7Ci0KLWludCBkZWJ1ZzsKLQotaG9zdF9jYWxsYmFjayAqc2ltX2NhbGxiYWNrOwotCi1zdGF0aWMgU0lNX09QRU5fS0lORCBzaW1fa2luZDsKLXN0YXRpYyBjaGFyICpteW5hbWU7Ci0KLS8qIFRoaXMgY29kZSBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbnkgb2xkIEMgY29tcGlsZXIsIGluIHdoaWNoIGNhc2UKLSAgIGZvdXIgb3IgZml2ZSBzd2l0Y2ggc3RhdGVtZW50cyB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoCi0gICBpbnN0cnVjdGlvbiBzaW11bGF0ZWQuICBJdCBjYW4gYmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRoZW4gdGhlCi0gICBzaW11bGF0ZWQgaW5zdHJ1Y3Rpb25zIHRocmVhZCB0aHJvdWdoIHRoZSBjb2RlIGZyYWdtZW50cywgYW5kCi0gICBldmVyeXRoaW5nIGdvZXMgbXVjaCBmYXN0ZXIuCi0KLSAgIFRoZXNlIGRlZmluaXRpb25zIG1ha2UgdGhlIGNvZGUgd29yayBlaXRoZXIgd2F5Ci0qLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIERJU1BBVENIKFgpIGdvdG8gKihYKTsgZG8KLSNkZWZpbmUgTEFCRUwoWCkgWCMjX0wKLSNkZWZpbmUgTEFCRUxOKFgsTikgWCMjX0wjI04KLSNkZWZpbmUgTEFCRUxfUkVGKFgpICYmWCMjX0wKLSNkZWZpbmUgTEFCRUxfUkVGTihYLE4pICYmWCMjX0wjI04KLSNkZWZpbmUgRU5ERElTUEFUQ0ggd2hpbGUgKDApOwotI2RlZmluZSBmYXN0cmVmIHZvaWQgKgotCi0jZGVmaW5lIERFRkFVTFQgOwotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVCBkZWZhdWx0IDoKLSNkZWZpbmUgRElTUEFUQ0goWCkgc3dpdGNoIChYKQotI2RlZmluZSBMQUJFTChYKSBjYXNlIFgKLSNkZWZpbmUgTEFCRUxOKFgsTikgY2FzZSBYCi0jZGVmaW5lIExBQkVMX1JFRihYKSBYCi0jZGVmaW5lIExBQkVMX1JFRk4oWCxOKSBYCi0jZGVmaW5lIEVORERJU1BBVENICi0jZGVmaW5lIGZhc3RyZWYgaW50Ci0KLQotCi0jZGVmaW5lIElOTElORQotI2RlZmluZSBTVE9SRV9SRUdfQiAJMQotI2RlZmluZSBTVE9SRV9SRUdfVyAJMgotI2RlZmluZSBTVE9SRV9JTkNfQiAJMwotI2RlZmluZSBTVE9SRV9JTkNfVyAJNAotI2RlZmluZSBTVE9SRV9ERUNfQiAJNQotI2RlZmluZSBTVE9SRV9ERUNfVyAJNgotI2RlZmluZSBTVE9SRV9ESVNQX0IgCTcKLSNkZWZpbmUgU1RPUkVfRElTUF9XIAk4Ci0jZGVmaW5lIFNUT1JFX0NSQiAJOQotI2RlZmluZSBTVE9SRV9DUlcgCTEwCi0jZGVmaW5lIFNUT1JFX1JFR19MIAkxMQotI2RlZmluZSBTVE9SRV9OT1AgCTEyCi0KLSNkZWZpbmUgRkVUQ0hfTk9QIAk5Ci0jZGVmaW5lIEZFVENIX1JFR19CIAkxMAotI2RlZmluZSBGRVRDSF9SRUdfVyAJMTEKLSNkZWZpbmUgRkVUQ0hfSU5DX0IgCTEyCi0jZGVmaW5lIEZFVENIX0lOQ19XIAkxMwotI2RlZmluZSBGRVRDSF9ERUNfQiAJMTQKLSNkZWZpbmUgRkVUQ0hfREVDX1cgCTE1Ci0jZGVmaW5lIEZFVENIX0RJU1BfQiAJMTYKLSNkZWZpbmUgRkVUQ0hfRElTUF9XIAkxNwotI2RlZmluZSBGRVRDSF9JTU0gCTE4Ci0jZGVmaW5lIEZFVENIX0NSQiAJMTkKLSNkZWZpbmUgRkVUQ0hfQ1JXIAkyMAotI2RlZmluZSBGRVRDSF9MVkFMIAkyMQotI2RlZmluZSBGRVRDSF9MVkFMMjQgCTIyCi0jZGVmaW5lIEZFVENIX1JFR19MIAkyMwotCi0jZGVmaW5lIEZMQUdfbSAJCTIwCi0jZGVmaW5lIEZMQUdfTSAJCTIxCi0jZGVmaW5lIEZMQUdfQSAJCTIyCi0jZGVmaW5lIEZMQUdfTk9ORSAJMjMKLSNkZWZpbmUgRkxBR19OT1NUT1JFIAkyNAotI2RlZmluZSBGTEFHX0NMRUFSIAkyNQotI2RlZmluZSBGTEFHX2EgCQkyNgotI2RlZmluZSBGTEFHX0JSQU5DSCAJMjcKLSNkZWZpbmUgRkxBR19zcGVjaWFsIAkyOAotCi0jZGVmaW5lIEZMQUdfc2hpZnR3b3JkIAkyOQotI2RlZmluZSBGTEFHX3NoaWZ0Ynl0ZSAJMzAKLQotI2RlZmluZSBGTEFHX211bHR3b3JkIAkzMQotI2RlZmluZSBGTEFHX211bHRieXRlIAkzMgotI2VuZGlmCi0KLQotI2RlZmluZSBoODUwMF90YWJsZSBoODUwMF9jb21waWxlX3RhYmxlCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaCIKLQotI2luY2x1ZGUgImluc3QuaCIKLQotI2RlZmluZSBMT1dfQllURSh4KSAoKHgpICYgMHhmZikKLSNkZWZpbmUgSElHSF9CWVRFKHgpICgoKHgpPj44KSAmIDB4ZmYpCi0jZGVmaW5lIE5PUk1BTF9DUCAoKGNwdS5yZWdzW1JfQ1BdLmMgLSBjcHUubWVtb3J5KT4+MTYpCi0jZGVmaW5lIE5PUk1BTF9EUCAoKGNwdS5yZWdzW1JfRFBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCi0jZGVmaW5lIE5PUk1BTF9FUCAoKGNwdS5yZWdzW1JfRVBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCi0jZGVmaW5lIE5PUk1BTF9UUCAoKGNwdS5yZWdzW1JfVFBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCi0jZGVmaW5lIFNFVF9OT1JNUkVHKHgseSkgKChjcHUucmVnc1t4XS5sID0gKHkpKSkKLSNkZWZpbmUgR0VUX05PUk1SRUcoeCkgKGNwdS5yZWdzW3hdLmwpCi0jZGVmaW5lIFNFVF9TRUdSRUcoeCx5KSB7IGNwdS5yZWdzW3hdLmMgPSAoKHkpICYgMHhmZjAwMDApICsgY3B1Lm1lbW9yeTt9Ci0jZGVmaW5lIEdFVF9TRUdSRUcoeCkgICggKGNwdS5yZWdzW3hdLmMgIC0gY3B1Lm1lbW9yeSApID4+IDE2KQotI2RlZmluZSBTRVRfTk9STUFMX0NQUEMoeCkgeyBwYyA9ICh4KSAmIDB4ZmZmZjsgU0VUX1NFR1JFRyhSX0NQLCAoeCkpO30KLSNkZWZpbmUgTk9STUFMX1NSICgoTjw8Myl8KFo8PDIpfChWPDwxKXwoQykpCi0jZGVmaW5lIFAoWCxZKSAoKFg8PDgpIHwgWSkKLQotI2RlZmluZSBCVUlMRFNSKCkgICBjcHUucmVnc1tSX1NSXS5zW0xPV10gPSAoTiA8PCAzKSB8IChaIDw8IDIpIHwgKFY8PDEpIHwgQzsKLQotI2RlZmluZSBHRVRTUigpCQkgICAgXAotICBDID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAwKSAmIDE7XAotICBWID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAxKSAmIDE7XAotICBaID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAyKSAmIDE7XAotICBOID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAzKSAmIDE7Ci0KLSNpZmRlZiBfX0NIQVJfSVNfU0lHTkVEX18KLSNkZWZpbmUgU0VYVENIQVIoeCkgKChjaGFyKSh4KSkKLSNlbmRpZgotCi0jaWZuZGVmIFNFWFRDSEFSCi0jZGVmaW5lIFNFWFRDSEFSKHgpICgoeCAmIDB4ODApID8gKHggfCB+MHhmZik6eCkKLSNlbmRpZgotCi0jZGVmaW5lIFNFWFRTSE9SVCh4KSAoKHNob3J0KSh4KSkKLQotLyogV2hpY2ggc2VnbWVudCByZWdpc3RlcnMgZ28gd2l0aCB3aGljaCBwb2ludGVyIHJlZ2lzdGVycyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKipzZWdtYXBbUl9MQVNUXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoocmVncHRyW1JfTEFTVF1bM10pOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKihzZWdyZWdwdHJbUl9MQVNUXVszXSk7Ci1zdGF0aWMgY3B1X3N0YXRlX3R5cGUgY3B1OwotCi1zdGF0aWMgaW50IHNlZ2ZvcnJlZ1tdID0ge1JfRFAsIFJfRFAsIFJfRFAsIFJfRFAsCi0JCQkgICAgUl9FUCwgUl9FUCwgUl9UUCwgUl9UUCwKLQkJCSAgICBSX0RQLCBSX0RQLCBSX0RQLCBSX0RQLAotCQkJICAgIFJfRVAsIFJfRVAsIFJfVFAsIFJfVFB9OwotaW50IExPVzsKLWludCBISUdIOwotCi0vKiByb3V0aW5lcyBmb3IgZ2V0dGluZyBhbmQgc3RvcmluZyBhcmdzICovCi0jZGVmaW5lIGVsdmFsKHN0cnVjdCwgbGl0KSBcCi0gKCgoKihzdHJ1Y3QucmVnLndwdHIpICsgbGl0KSAmIDB4ZmZmZikgKyAoKihzdHJ1Y3QucjIuc2VncmVnKSkpCi0KLSNkZWZpbmUgZGlzcGx2YWwocykgZWx2YWwoKHMpLChzKS5saXRlcmFsKQotCi0jZGVmaW5lIGlyZWdsdmFsKHN0cnVjdCkgZWx2YWwoc3RydWN0LCAwKQotI2RlZmluZSB3b3JkYXQoeCkgKCgoeClbMF0gPDwgOCkgfCAoeClbMV0pCi0jZGVmaW5lIGxvbmdhdCh4KSAoKHdvcmRhdCgoeCkpPDwxNil8KHdvcmRhdCgoeCkrMikpKQotI2RlZmluZSBieXRlYXQoeCkgKCh4KVswXSkKLQotI2RlZmluZSBzZXR3b3JkYXQoeCx5KSB7eFswXSA9KCB5KT4+ODsgeFsxXSA9IHk7fQotI2RlZmluZSBzZXRieXRlYXQoeCx5KSB7eFswXSA9IHk7fQotCi0vKiNkZWZpbmUgc2V0YWxpZ25lZHdvcmRhdCh4LHkpIHsoKHNob3J0ICopeClbMF0gPXk7fSovCi0vKgotc3RhdGljcwotKi8KLQotZWFfdHlwZSByZDsKLWVhX3R5cGUgcnM7Ci1lYV90eXBlIGltbTsKLWVhX3R5cGUgY3I7Ci1lYV90eXBlIGVhOwotZWFfdHlwZSBub3A7Ci1lYV90eXBlIGx2YWw7Ci1lYV90eXBlIGx2YWwyNDsKLQotZWFfdHlwZSBlYXZlY3RvclsyXTsKLQotaW50IGRpc3A7Ci0KLSNkZWZpbmUgSkJZVEUgMAotI2RlZmluZSBKV09SRCAxCi0jZGVmaW5lIEpMT05HIDIKLQotdHlwZWRlZiB1bmlvbgotewotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBmYXN0cmVmIHNyY2FieXRlOwotICAgICAgZmFzdHJlZiBzcmNhd29yZDsKLSAgICAgIGZhc3RyZWYgc3JjYWxvbmc7Ci0KLSAgICAgIGZhc3RyZWYgc3JjYmJ5dGU7Ci0gICAgICBmYXN0cmVmIHNyY2J3b3JkOwotICAgICAgZmFzdHJlZiBzcmNibG9uZzsKLQotICAgICAgZmFzdHJlZiBkc3RieXRlOwotICAgICAgZmFzdHJlZiBkc3R3b3JkOwotICAgICAgZmFzdHJlZiBkc3Rsb25nOwotICAgIH0gczsKLSAgc3RydWN0Ci0gICAgewotICAgICAgZmFzdHJlZiBieXRlOwotICAgICAgZmFzdHJlZiB3b3JkOwotICAgICAgZmFzdHJlZiBsb247Ci0gICAgfSBhWzNdOwotCi0gIGZhc3RyZWYgals5XTsKLX0gc2l6ZV9wdHI7Ci0KLXVuaW9uCi17Ci0gIHN0cnVjdCBlYV9zdHJ1Y3QKLSAgICB7Ci0gICAgICBzaXplX3B0ciBlYV9ub3A7Ci0gICAgICBzaXplX3B0ciBlYV9yZWc7Ci0gICAgICBzaXplX3B0ciBlYV9pbmM7Ci0gICAgICBzaXplX3B0ciBlYV9kZWM7Ci0gICAgICBzaXplX3B0ciBlYV9kaXNwOwotCi0gICAgICBzaXplX3B0ciBlYV9pbW07Ci0gICAgICBzaXplX3B0ciBlYV9jcjsKLSAgICAgIHNpemVfcHRyIGVhX2x2YWw7Ci0gICAgICBzaXplX3B0ciBlYV9sdmFsMjQ7Ci0gICAgfSBzOwotI2RlZmluZSBOX0VBVFlQRVMgKHNpemVvZihzdHJ1Y3QgZWFfc3RydWN0KSAvIHNpemVvZihzaXplX3B0cikpCi0gIHNpemVfcHRyIGFbTl9FQVRZUEVTXTsKLX0gZWFzOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIGVhIHN0cnVjdHVyZSBmaWxsZWQgaW4gZm9yIHRoZSAxc3Qgc291cmNlCi0gb3BlcmFuZCBhbmQgbW9kaWZpZXMgaXQgdG8gYmUgZm9yIGVpdGhlciB0aGUgMXN0LCAybmQgb3IgZHN0IG9wZXJhbmQgKi8KLQotc3RhdGljIHZvaWQKLWhvd3RvX3dvcmtvdXQgKGVuY29kZWQsIHNlbWllbmNvZGVkLCBuKQotICAgICBlYV90eXBlICplbmNvZGVkOwotICAgICBlYV90eXBlICpzZW1pZW5jb2RlZDsKLSAgICAgaW50IG47Ci17Ci0gIGludCBpOwotICAqZW5jb2RlZCA9ICpzZW1pZW5jb2RlZDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTl9FQVRZUEVTOyBpKyspCi0gICAgewotICAgICAgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhYnl0ZSkKLQl7Ci0JICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS5ieXRlOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhd29yZCkKLQl7Ci0JICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS53b3JkOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhbG9uZykKLQl7Ci0JICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS5sb247Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBhYm9ydCAoKTsKLX0KLQotZmFzdHJlZiBmbGFnX3NoaWZ0d29yZDsKLWZhc3RyZWYgZmxhZ19zaGlmdGJ5dGU7Ci1mYXN0cmVmIGZsYWdfbXVsdHdvcmQ7Ci1mYXN0cmVmIGZsYWdfbXVsdGJ5dGU7Ci1mYXN0cmVmIGZsYWdfbXA7Ci1mYXN0cmVmIGZsYWdfc3BlY2lhbDsKLWZhc3RyZWYgZmxhZ19NcDsKLWZhc3RyZWYgZmxhZ19hcDsKLWZhc3RyZWYgZmxhZ19BcDsKLWZhc3RyZWYgZmxhZ19ub25lcDsKLWZhc3RyZWYgZmxhZ19ub3N0b3JlcDsKLWZhc3RyZWYgZmxhZ19jbGVhcnA7Ci1mYXN0cmVmIGZsYWdfYnJhbmNoOwotZmFzdHJlZiBleGVjX2Rpc3BhdGNoWzEwMF07Ci0KLXN0YXRpYyBpbnQKLWdldF9ub3cgKCkKLXsKLSAgcmV0dXJuIHRpbWUgKDApOwotfQotCi1zdGF0aWMgaW50Ci1ub3dfcGVyc2VjICgpCi17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZ290Y3IgKHB0ciwgbikKLSAgICAgZWFfdHlwZSAqcHRyOwotICAgICBpbnQgbjsKLXsKLSAgaW50IHNpemU7Ci0gIG4gJj0gMHg3OwotICBpZiAobiA9PSAwKQotICAgIHsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2NyLmpbSkJZVEVdOwotICAgICAgcHRyLT5yZWcuYnB0ciA9IHNlZ3JlZ3B0cltuXVtKTE9OR107Ci0gICAgfQotfQotc3RhdGljIHZvaWQKLWdvdHJlZyAocHRyLCBuLCBzaXplKQotICAgICBlYV90eXBlICpwdHI7Ci0gICAgIGludCBuOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgbiAmPSAweDc7Ci0gIHB0ci0+dHlwZSA9IGVhcy5zLmVhX3JlZy5qW3NpemVdOwotICBwdHItPnJlZy5icHRyID0gcmVncHRyW25dW3NpemVdOwotfQotCi1zdGF0aWMgdm9pZAotZ290aW5jIChwdHIsIG4sIGluYywgc2l6ZSkKLSAgICAgZWFfdHlwZSAqcHRyOwotICAgICBpbnQgbjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIG4gJj0gMHg3OwotICBpZiAoaW5jID4gMCkKLSAgICB7Ci0gICAgICBwdHItPnR5cGUgPSBlYXMucy5lYV9pbmMualtzaXplXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdHItPnR5cGUgPSBlYXMucy5lYV9kZWMualtzaXplXTsKLSAgICB9Ci0gIHB0ci0+cmVnLmJwdHIgPSByZWdwdHJbbl1bSldPUkRdOwotICBwdHItPnIyLnNlZ3JlZyA9IHNlZ21hcFtuXTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZ290YWJzIChwdHIsIGRpc3AsIHJlZywgc2l6ZSkKLSAgICAgZWFfdHlwZSAqcHRyOwotICAgICBpbnQgZGlzcDsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHNpemU7Ci17Ci0gIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2Rpc3AualtzaXplXTsKLSAgcHRyLT5yZWcuYnB0ciA9IHJlZ3B0cltyZWddW0pXT1JEXTsKLSAgcHRyLT5yMi5zZWdyZWcgPSBzZWdtYXBbcmVnXTsKLSAgcHRyLT5saXRlcmFsID0gZGlzcDsKLX0KLQotc3RhdGljIHZvaWQKLWdvdGluZCAocHRyLCBkaXNwLCByZWcsIHNpemUpCi0gICAgIGVhX3R5cGUgKnB0cjsKLSAgICAgaW50IGRpc3A7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCBzaXplOwotewotICBnb3RhYnMgKHB0ciwgZGlzcCwgcmVnICYgMHg3LCBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLWdvdGltbSAocHRyLCB2YWwpCi0gICAgIGVhX3R5cGUgKnB0cjsKLSAgICAgaW50IHZhbDsKLXsKLSAgcHRyLT50eXBlID0gZWFzLnMuZWFfaW1tLmpbMF07Ci0gIHB0ci0+bGl0ZXJhbCA9IHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLWluZG9mZiAocHRyKQotICAgICBlYV90eXBlICpwdHI7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwdHItPnR5cGUgPT0gZWFzLnMuZWFfZGlzcC5qW2ldKQotCXsKLQkgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2x2YWwualtpXTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi10aGlua2Fib3V0X3NoaWZ0cyAoZCwgYnl0ZXNpemVkKQotICAgICBkZWNvZGVkX2luc3QgKmQ7Ci0gICAgIGludCBieXRlc2l6ZWQ7Ci17Ci0gIGlmIChieXRlc2l6ZWQpCi0gICAgewotICAgICAgLyogR290IGEgYnl0ZSBzaGlmdCwgZmFrZSB1cCBzZWNvbmQgYXJnICovCi0gICAgICBkLT5zcmNiLnR5cGUgPSBlYXMucy5lYV9pbW0ucy5zcmNid29yZDsKLSAgICAgIGQtPnNyY2IubGl0ZXJhbCA9IDg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogZ290IGEgd29yZCBzaGlmdCwgZmFrZSB1cCBzZWNvbmQgYXJnICovCi0gICAgICBkLT5zcmNiLnR5cGUgPSBlYXMucy5lYV9pbW0ucy5zcmNid29yZDsKLSAgICAgIGQtPnNyY2IubGl0ZXJhbCA9IDE2OwotICAgIH0KLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY3ljbGVzIHJlcXVpcmVkIHRvIHJ1biB0aGlzCi0gICBpbnN0cnVjdGlvbgotKi8KLXN0YXRpYyB2b2lkCi1jb21wY3ljbGVzIChkc3QsIG9wY29kZSkKLSAgICAgZGVjb2RlZF9pbnN0ICpkc3Q7Ci0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci17Ci0gIGludCBjeWNsZXMgPSAwOwotICAvKiBHdWVzcyBmb3IgdGhlIHRpbWUgYmVpbmcgLSAxIGN5Y2xlIGZvciB0aGUgZmlyc3QgdHdvIGJ5dGVzIGluIHRoZQotICAgICBvcGNvZGUgLSB0byBmZWN0aCB0aGUgb3BlcmFuZCwgYW5kIDMgY3ljbGVzIGZvciBhbGwgdGhlIHJlc3Qgb2YKLSAgICAgdGhlIGJ5dGVzLCBzaW5jZSB0aGV5IG1lYW4gdGhhdCB0aGVyZSBpcyBwcm9iYWJseSBhbiBvcGVyYW5kIHRvCi0gICAgIGZldGNoICovCi0KLSAgc3dpdGNoIChvcGNvZGUtPmxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICAgIGN5Y2xlcyArPSBvcGNvZGUtPmxlbmd0aDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjeWNsZXMgKz0gb3Bjb2RlLT5sZW5ndGggKiAzOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGRzdC0+Y3ljbGVzID0gY3ljbGVzOwotfQotCi1zdGF0aWMgdm9pZAotdHJhbnNsYXRlIChwdHIsIGZyb20sIHRvKQotICAgICBlYV90eXBlICpwdHI7Ci0gICAgIGZhc3RyZWYgZnJvbTsKLSAgICAgZmFzdHJlZiB0bzsKLXsKLSAgaWYgKHB0ci0+cmVnLndwdHIgPT0gJmNwdS5yZWdzWzddLnNbTE9XXQotICAgICAgJiYgcHRyLT50eXBlID09IGZyb20pCi0gICAgewotICAgICAgcHRyLT50eXBlID0gdG87Ci0gICAgfQotfQotCi1zdGF0aWMKLXZvaWQKLWZpeF9pbmNkZWNzIChkc3QpCi0gICAgIGRlY29kZWRfaW5zdCAqZHN0OwotewotICBpZiAoZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9pbmMucy5kc3RieXRlCi0gICAgICAmJiAoZHN0LT5zcmNhLnR5cGUgPT0gZWFzLnMuZWFfaW5jLnMuc3JjYWJ5dGUKLQkgIHx8IGRzdC0+c3JjYi50eXBlID09IGVhcy5zLmVhX2luYy5zLnNyY2JieXRlKSkKLSAgICB7Ci0gICAgICBkc3QtPmRzdC50eXBlID0gZWFzLnMuZWFfZGlzcC5zLmRzdGJ5dGU7Ci0gICAgfQotCi0gIGlmIChkc3QtPmRzdC50eXBlID09IGVhcy5zLmVhX2luYy5zLmRzdHdvcmQKLSAgICAgICYmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9pbmMucy5zcmNhd29yZAotCSAgfHwgZHN0LT5zcmNiLnR5cGUgPT0gZWFzLnMuZWFfaW5jLnMuc3JjYndvcmQpKQotICAgIHsKLSAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9kaXNwLnMuZHN0d29yZDsKLSAgICB9Ci0KLSAgaWYgKGRzdC0+ZHN0LnR5cGUgPT0gZWFzLnMuZWFfZGVjLnMuZHN0Ynl0ZQotICAgICAgfHwgZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9kZWMucy5kc3R3b3JkKQotICAgIHsKLSAgICAgIGlmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSkKLQl7Ci0JICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNhYnl0ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNhd29yZCkKLQl7Ci0JICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNhd29yZDsKLQl9Ci0gICAgICBlbHNlIGlmIChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNiYnl0ZSkKLQl7Ci0JICBkc3QtPnNyY2IudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNiYnl0ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNid29yZCkKLQl7Ci0JICBkc3QtPnNyY2IudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNid29yZDsKLQl9Ci0gICAgfQotCi0KLSAgLyogVHVybiBhIGJ5dGUgb3BzIGZyb20gdGhlIHNwIGludG8gd29yZCBvcHMgKi8KLSAgdHJhbnNsYXRlICgmZHN0LT5kc3QsIGVhcy5zLmVhX2RlYy5zLmRzdGJ5dGUsIGVhcy5zLmVhX2RlYy5zLmRzdHdvcmQpOwotICB0cmFuc2xhdGUgKCZkc3QtPmRzdCwgZWFzLnMuZWFfaW5jLnMuZHN0Ynl0ZSwgZWFzLnMuZWFfaW5jLnMuZHN0d29yZCk7Ci0KLSAgdHJhbnNsYXRlICgmZHN0LT5zcmNhLCBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSwgZWFzLnMuZWFfZGVjLnMuc3JjYXdvcmQpOwotICB0cmFuc2xhdGUgKCZkc3QtPnNyY2EsIGVhcy5zLmVhX2luYy5zLnNyY2FieXRlLCBlYXMucy5lYV9pbmMucy5zcmNhd29yZCk7Ci0KLSAgdHJhbnNsYXRlICgmZHN0LT5zcmNiLCBlYXMucy5lYV9kZWMucy5zcmNiYnl0ZSwgZWFzLnMuZWFfZGVjLnMuc3JjYndvcmQpOwotICB0cmFuc2xhdGUgKCZkc3QtPnNyY2IsIGVhcy5zLmVhX2luYy5zLnNyY2JieXRlLCBlYXMucy5lYV9pbmMucy5zcmNid29yZCk7Ci0KLQotfQotCi0KLXN0YXRpYyB2b2lkCi1maW5kIChwYywgYnVmZmVyLCBkc3QpCi0gICAgIGludCBwYzsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBkZWNvZGVkX2luc3QgKmRzdDsKLXsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgaW50IGk7Ci0gIGludCBpZHg7Ci0gIGludCBoYWRpbW0gPSAwOwotICBkc3QtPnNyY2EucmVnLnJwdHIgPSAwOwotCi0gIC8qIFJ1biBkb3duIHRoZSB0YWJsZSB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGludCBieXRlOwotICAgICAgaW50IHJuOwotICAgICAgaW50IHJkOwotICAgICAgaW50IHJzOwotICAgICAgaW50IGRpc3A7Ci0gICAgICBpbnQgYWJzOwotICAgICAgaW50IGltbTsKLSAgICAgIGludCBwY3JlbDsKLSAgICAgIGludCBxaW07Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjcjsKLQotCi0gICAgICBkc3QtPm9wY29kZSA9IGV4ZWNfZGlzcGF0Y2hbb3Bjb2RlLT5mbGF2b3IgJiAweDdmXTsKLQotICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG9wY29kZS0+bGVuZ3RoOyBieXRlKyspCi0JewotCSAgaWYgKChidWZmZXJbYnl0ZV0gJiBvcGNvZGUtPmJ5dGVzW2J5dGVdLm1hc2spCi0JICAgICAgIT0gKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uY29udGVudHMpKQotCSAgICB7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBleHRyYWN0IGFueSBpbmZvIHBhcnRzICovCi0JICAgICAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCkKLQkJewotCQljYXNlIDA6Ci0JCWNhc2UgRlA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUk46Ci0JCSAgcm4gPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUlM6Ci0JCSAgcnMgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ1JCOgotCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGlmIChjciA9PSAwKQotCQkgICAgZ290byBuZXh0OwotCQkgIGJyZWFrOwotCQljYXNlIENSVzoKLQkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBpZiAoY3IgIT0gMCkKLQkJICAgIGdvdG8gbmV4dDsKLQkJICBicmVhazsKLQkJY2FzZSBESVNQMTY6Ci0JCSAgZGlzcCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRlBJTkRfRDg6Ci0JCWNhc2UgRElTUDg6Ci0JCSAgZGlzcCA9ICgoY2hhcikgKGJ1ZmZlcltieXRlXSkpOwotCQkgIGJyZWFrOwotCQljYXNlIFJEOgotCQljYXNlIFJESU5EOgotCQkgIHJkID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzI0OgotCQkgIGFicyA9Ci0JCSAgICAoYnVmZmVyW2J5dGVdIDw8IDE2KQotCQkgICAgICB8IChidWZmZXJbYnl0ZSArIDFdIDw8IDgpCi0JCQl8IChidWZmZXJbYnl0ZSArIDJdKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMxNjoKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzg6Ci0JCSAgYWJzID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NMTY6Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU00OgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pICYgMHhmOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTg6Ci0JCWNhc2UgUkxJU1Q6Ci0JCSAgaW1tID0gU0VYVENIQVIgKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwxNjoKLQkJICBwY3JlbCA9IFNFWFRTSE9SVCAoKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUw4OgotCQkgIHBjcmVsID0gU0VYVENIQVIgKChidWZmZXJbYnl0ZV0pKTsKLQkJICBicmVhazsKLQkJY2FzZSBRSU06Ci0JCSAgc3dpdGNoIChidWZmZXJbYnl0ZV0gJiAweDcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIGltbSA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBpbW0gPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgaW1tID0gLTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA1OgotCQkgICAgICBpbW0gPSAtMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKG9wY29kZS0+Zmxhdm9yICYgT19CWVRFKQotCXsKLQkgIGlkeCA9IDA7Ci0JICBzd2l0Y2ggKG9wY29kZS0+ZmxhZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnaCc6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfc2hpZnRieXRlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19tdWx0Ynl0ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfYnJhbmNoOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19tcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfYXA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJy0nOgotCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX25vbmVwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfbm9zdG9yZXA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX2NsZWFycDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgLyogc3BlY2lhbCAqLwotCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX3NwZWNpYWw7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWR4ID0gMTsKLQkgIHN3aXRjaCAob3Bjb2RlLT5mbGFncykKLQkgICAgewotCSAgICBjYXNlICdoJzoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19zaGlmdHdvcmQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX211bHR3b3JkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdCJzoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19icmFuY2g7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX01wOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdhJzoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19BcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnLSc6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfbm9uZXA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19ub3N0b3JlcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfY2xlYXJwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkgICAgICAvKiBzcGVjaWFsICovCi0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfc3BlY2lhbDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bmFyZ3M7IGkrKykKLQl7Ci0JICBlYV90eXBlICpwID0gZWF2ZWN0b3IgKyBpOwotCi0JICBzd2l0Y2ggKG9wY29kZS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIEZQOgotCSAgICAgIGdvdHJlZyAocCwgNiwgaWR4KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORDoKLQkgICAgICBkaXNwID0gMDsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgZ290aW5kIChwLCBkaXNwLCBybiwgaWR4KTsKLQkgICAgICBicmVhazsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBkaXNwID0gMDsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgZ290aW5kIChwLCBkaXNwLCByZCwgaWR4KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICBnb3RpbmQgKHAsIGRpc3AsIDYsIGlkeCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JCOgotCSAgICBjYXNlIENSVzoKLQkgICAgICBnb3RjciAocCwgY3IpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOOgotCSAgICAgIGdvdHJlZyAocCwgcm4sIGlkeCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgZ290cmVnIChwLCByZCwgaWR4KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBnb3RyZWcgKHAsIHJzLCBpZHgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOREVDOgotCSAgICAgIGdvdGluYyAocCwgcm4sIC0xLCBpZHgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5DOgotCSAgICAgIGdvdGluYyAocCwgcm4sIDEsIGlkeCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgZ290aW5jIChwLCA3LCAxLCBpZHgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGdvdGluYyAocCwgNywgLTEsIGlkeCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgIGNhc2UgQUJTMTY6Ci0JICAgICAgZ290YWJzIChwLCBhYnMsIFJfSEFSRF8wLCBpZHgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgZ290YWJzIChwLCBhYnMsIFJfSEFSRDhfMCwgaWR4KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgY2FzZSBSTElTVDoKLQkgICAgY2FzZSBRSU06Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGdvdGltbSAocCwgaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBnb3RpbW0gKHAsCi0JCSAgICAgICgocGNyZWwgKyBwYyArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZikgfCAocGMgJiAweGZmMDAwMCksCi0JCSAgICAgIFJfSEFSRF8wLCBKTE9ORyk7Ci0KLQkgICAgfQotCX0KLQotICAgICAgLyogRmluaXNoZWQgYW5kIGRvbmUgLSB0dXJuIGZyb20gdHdvIG9wZXJhbmQgc3R1ZmYgaW50byB0aHJlZSAqLwotCi0gICAgICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOwotICAgICAgZHN0LT5zcmNiLnR5cGUgPSBlYXMucy5lYV9ub3Aucy5zcmNiYnl0ZTsKLSAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9ub3Aucy5kc3RieXRlOwotCi0gICAgICBpZiAob3Bjb2RlLT5uYXJncykKLQl7Ci0JICBzd2l0Y2ggKG9wY29kZS0+bmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAxOgotCSAgICAgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPnNyY2EsICZlYXZlY3RvclswXSwgMCk7Ci0JICAgICAgaWYgKG9wY29kZS0+ZHN0ICE9ICchJykKLQkJaG93dG9fd29ya291dCAoJmRzdC0+ZHN0LCAmZWF2ZWN0b3JbMF0sIDIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgaWYgKG9wY29kZS0+c3JjMiA9PSAnIScpCi0JCXsKLQkJICBob3d0b193b3Jrb3V0ICgmZHN0LT5zcmNhLCAmZWF2ZWN0b3JbMF0sIDApOwotCQkgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPmRzdCwgJmVhdmVjdG9yWzFdLCAyKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPnNyY2EsICZlYXZlY3RvclswXSwgMCk7Ci0JCSAgaG93dG9fd29ya291dCAoJmRzdC0+c3JjYiwgJmVhdmVjdG9yWzFdLCAxKTsKLQkJICBpZiAob3Bjb2RlLT5kc3QgIT0gJyEnKQotCQkgICAgewotCQkgICAgICBob3d0b193b3Jrb3V0ICgmZHN0LT5kc3QsICZlYXZlY3RvclsxXSwgMik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0KLQotCSAgLyogU29tZSBleHRyYSBzdHVmZiB3aXRoIHByZSBpbmMgYW5kIHBvc3QgZGVjLAotCSAgICAgbWFrZSBzdXJlIHRoYXQgaWYgdGhlIHNhbWUgZWEgaXMgdGhlcmUgdHdpY2UsIG9ubHkgb25lIG9mIHRoZQotCSAgICAgb3BzIGlzIGF1dG8gaW5jL2RlYyAqLwotCi0JICBmaXhfaW5jZGVjcyAoZHN0KTsKLQotCi0JICAvKiBTb21lIHNwZWNpYWwgY2FzZXMgKi8KLQkgIGlmIChkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fUEpTUl0KLQkgICAgICB8fCBkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fUEpNUF0pCi0JICAgIHsKLQkgICAgICAvKiBCb3RoIHRoZSBAYWJzOjI0IGFuZCBAcm4gdHVybiBpbnRvIGEgZGlzcCB3b3JkLAotCQkgY2hvc2UgdGhlIHJpZ2h0IGEgbW9kZSBzaW5jZSAgQGFiczoyNCBpcyA0IGJ5dGVzCi0JCSBsb25nICovCi0KLQkgICAgICBpZiAob3Bjb2RlLT5sZW5ndGggPT0gNCkKLQkJewotCQkgIGRzdC0+c3JjYS50eXBlID0gZWFzLnMuZWFfbHZhbDI0LnMuc3JjYWJ5dGU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX3JlZy5zLnNyY2Fsb25nOwotCQl9Ci0KLQkgICAgICBkc3QtPnNyY2EucjIucnB0ciA9ICZjcHUucmVnc1tSX0hBUkRfMF07Ci0KLQkgICAgICAvKiBGb3IgW1BdSlNSLCBrZWVwIHJldHVybiBhZGRyZXNzIHByZWNvbXB1dGVkICovCi0JICAgICAgZHN0LT5zcmNiLmxpdGVyYWwgPSBwYyArIG9wY29kZS0+bGVuZ3RoOwotCSAgICAgIGRzdC0+c3JjYi50eXBlID0gZWFzLnMuZWFfaW1tLnMuc3JjYndvcmQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19NVUxYVV0pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgbXVsdGlwbHkgLWZpeCB0aGUgZGVzdGluYXRpb24gb3AgKi8KLQkgICAgICBpZiAoZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9yZWcucy5kc3R3b3JkKQotCQl7Ci0JCSAgZHN0LT5kc3QudHlwZSA9IGVhcy5zLmVhX3JlZy5zLmRzdGxvbmc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBkc3QtPmRzdC50eXBlID0gZWFzLnMuZWFfcmVnLnMuZHN0d29yZDsKLQkJfQotCSAgICAgIGRzdC0+ZHN0LnJlZy5icHRyID0gcmVncHRyW3JkXVtKV09SRF07Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19ESVZYVV0pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgd2lkZXIgdGhhbiBub3JtYWwsIGZpeCB0aGUgc291cmNlIG9wZXJhbmQgKi8KLQkgICAgICBkc3QtPnNyY2IudHlwZQotCQk9IChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9yZWcucy5zcmNid29yZCkKLQkJICA/IGVhcy5zLmVhX3JlZy5zLnNyY2Jsb25nCi0JCSAgICA6IGVhcy5zLmVhX3JlZy5zLnNyY2J3b3JkOwotCi0JICAgICAgZHN0LT5kc3QudHlwZQotCQk9IChkc3QtPmRzdC50eXBlID09IGVhcy5zLmVhX3JlZy5zLmRzdHdvcmQpCi0JCSAgPyBlYXMucy5lYV9yZWcucy5kc3Rsb25nCi0JCSAgICA6IGVhcy5zLmVhX3JlZy5zLmRzdHdvcmQ7Ci0KLQkgICAgfQotCi0JICBlbHNlIGlmIChkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fTERNXSkKLQkgICAgewotCSAgICAgIC8qIFR1cm4gb2YgdGhlIHN0YWNrIHJlZiAqLwotCSAgICAgIGRzdC0+c3JjYS50eXBlID0gZWFzLnMuZWFfbm9wLnMuc3JjYWJ5dGU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19TVE1dKQotCSAgICB7Ci0JICAgICAgLyogVHVybiBvZiB0aGUgc3RhY2sgcmVmICovCi0JICAgICAgZHN0LT5zcmNiLnR5cGUgPSBlYXMucy5lYV9ub3Aucy5zcmNiYnl0ZTsKLQkgICAgfQotCi0KLQkgIC8qIGV4dGVuZHMgcmVhZCBvbmUgc2l6ZSBhbmQgd3JpdGUgYW5vdGhlciAqLwotCSAgZWxzZSBpZiAoZHN0LT5vcGNvZGUgPT0gZXhlY19kaXNwYXRjaFtPX0VYVFNdCi0JCSAgIHx8IGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19FWFRVXSkKLQkgICAgewotCSAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9yZWcucy5kc3R3b3JkOwotCSAgICAgIGRzdC0+ZHN0LnJlZy5icHRyID0gcmVncHRyW3JkXVtKV09SRF07Ci0JICAgICAgZHN0LT5mbGFncyA9IGZsYWdfQXA7Ci0JICAgIH0KLQotCi0JICBpZiAob3Bjb2RlLT5mbGFncyA9PSAnaCcpCi0JICAgIHRoaW5rYWJvdXRfc2hpZnRzIChkc3QsIG9wY29kZS0+Zmxhdm9yICYgT19CWVRFKTsKLQotCi0JICAvKiBGb3IgYSBicmFuY2gsIHR1cm4gb2ZmIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLwotCSAgaWYgKG9wY29kZS0+c3JjMSA9PSAnQicpCi0JICAgIHsKLQkgICAgICBpbmRvZmYgKCZkc3QtPnNyY2EsIDApOwotCSAgICB9Ci0KLQl9Ci0gICAgICBkc3QtPm5leHRfcGMgPSBwYyArIG9wY29kZS0+bGVuZ3RoOwotCi0gICAgICBjb21wY3ljbGVzIChkc3QsIG9wY29kZSk7Ci0KLSAgICAgIHJldHVybjsKLQotCi0gICAgbmV4dDo7Ci0gICAgfQotCi0gIC8qIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcgKi8KLSAgZHN0LT5vcGNvZGUgPSBleGVjX2Rpc3BhdGNoW09fVFJBUEFdOwotICBkc3QtPm5leHRfcGMgPSBwYyArIDE7Ci0KLX0KLQotY29tcGlsZSAocGMpCi17Ci0gIGludCBpZHg7Ci0KLSAgLyogZmluZCB0aGUgbmV4dCBjYWNoZSBlbnRyeSB0byB1c2UgKi8KLQotICBpZHggPSBjcHUuY2FjaGVfdG9wICsgMTsKLSAgY3B1LmNvbXBpbGVzKys7Ci0gIGlmIChpZHggPj0gY3B1LmNzaXplKQotICAgIHsKLSAgICAgIGlkeCA9IDE7Ci0gICAgfQotICBjcHUuY2FjaGVfdG9wID0gaWR4OwotCi0gIC8qIFRocm93IGF3YXkgaXRzIG9sZCBtZWFuaW5nICovCi0gIGNwdS5jYWNoZV9pZHhbY3B1LmNhY2hlW2lkeF0ub2xkcGNdID0gMDsKLQotICAvKiBzZXQgdG8gbmV3IGFkZHJlc3MgKi8KLSAgY3B1LmNhY2hlW2lkeF0ub2xkcGMgPSBwYzsKLQotICAvKiBmaWxsIGluIGluc3RydWN0aW9uIGluZm8gKi8KLSAgZmluZCAocGMsIGNwdS5tZW1vcnkgKyBwYywgY3B1LmNhY2hlICsgaWR4KTsKLQotICAvKiBwb2ludCB0byBuZXcgY2FjaGUgZW50cnkgKi8KLSAgY3B1LmNhY2hlX2lkeFtwY10gPSBpZHg7Ci19Ci0KLWJhZGRlZmF1bHQgKHgpCi17Ci0gIHByaW50ZiAoImJhZCBkZWZhdWx0ICVkXG4iLCB4KTsKLX0KLQotc3RhdGljIGludCBmZXRjaF9sIChhcmcpCi0gICAgIGVhX3R5cGUgKmFyZzsKLXsKLSAgaW50IGwsIHI7Ci0KLSAgaW50IGggPSAqKGFyZy0+cmVnLndwdHIpOwotICByID0gKHVuaW9uIHJ0eXBlICopIChhcmctPnJlZy53cHRyKSAtICZjcHUucmVnc1swXTsKLSAgcisrOwotCi0gIGwgPSBjcHUucmVnc1tyXS5zW0xPV107Ci0gIHJldHVybiAoaCA8PCAxNikgfCBsOwotCi19Ci0KLSNkZWZpbmUgRkVUQ0goZHN0LCBhcmcsIG4pICBcCi17IFwKLSBpbnQgcjsgdW5zaWduZWQgY2hhcipsdmFsOyBcCi0gRElTUEFUQ0goKGFyZykudHlwZSkgXAotIHsgTEFCRUxOKEZFVENIX05PUCxuKTogXAotIGRzdD0gMDsgXAotIGJyZWFrOyBcCi0gREVGQVVMVCBiYWRkZWZhdWx0KChhcmcpLnR5cGUpOyBicmVhazsgXAotIExBQkVMTihGRVRDSF9MVkFMLG4pOiAgXAotIGRzdCA9ICgqKCgoYXJnKS5yZWcud3B0cikpICsgKGFyZy5saXRlcmFsKSkgOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfTFZBTDI0LG4pOiAgXAotIGRzdCA9ICgqKCgoYXJnKS5yZWcud3B0cikpICsgKigoKGFyZykucjIud3B0cikpICsgKGFyZy5saXRlcmFsKSkgJjB4ZmZmZmZmOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfQ1JCLG4pOiAgXAotIGRzdCA9ICgqKChhcmcpLnJlZy5zZWdwdHIpIC0gY3B1Lm1lbW9yeSk+PjE2OyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfQ1JXLG4pOiAgXAotICBkc3QgPSBCVUlMRFNSKCk7XAotIGJyZWFrOyBcCi0gTEFCRUxOKEZFVENIX1JFR19CLG4pOiBcCi0gZHN0ID0gKigoYXJnKS5yZWcuYnB0cik7IFwKLSBicmVhazsgXAotIExBQkVMTihGRVRDSF9SRUdfVyxuKTogXAotIGRzdCA9ICooKGFyZykucmVnLndwdHIpOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfUkVHX0wsbik6IFwKLSBkc3QgPSBmZXRjaF9sKCYoYXJnKSk7XAotIGJyZWFrOyBcCi0gTEFCRUxOKEZFVENIX0lOQ19CLG4pOiBcCi0gbHZhbCA9IGVsdmFsICgoYXJnKSwgMCk7IFwKLSBkc3QgPSBieXRlYXQgKGx2YWwpOyBcCi0gKCooKGFyZykucmVnLndwdHIpKSsrOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfSU5DX1csbik6IFwKLSBsdmFsID0gZWx2YWwgKChhcmcpLCAwKTsgXAotIGRzdCA9IHdvcmRhdCAobHZhbCk7IFwKLSAoKigoKGFyZykucmVnLndwdHIpKSkgKz0gMjsgXAotIGJyZWFrOyBcCi0gTEFCRUxOKEZFVENIX0RFQ19CLCBuKTogXAotICgqKGFyZykucmVnLndwdHIpLS07IFwKLSBsdmFsID0gZWx2YWwgKChhcmcpLCAwKTsgXAotIHIgPSBieXRlYXQgKGx2YWwpOyBcCi0gZHN0ID0gcjsgXAotIGJyZWFrOyBcCi0gTEFCRUxOKEZFVENIX0RFQ19XLCBuKTogXAotICgqKChhcmcpLnJlZy53cHRyKSkgLT0gMjsgXAotIGx2YWwgPSBlbHZhbCAoKGFyZyksIDApOyBcCi0gciA9IHdvcmRhdCAobHZhbCk7IFwKLSBkc3QgPSByOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfRElTUF9CLG4pOiBcCi0gbHZhbCA9IGRpc3BsdmFsICgoYXJnKSk7IFwKLSBkc3QgPSBieXRlYXQgKGx2YWwpOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfRElTUF9XLG4pOiBcCi0gbHZhbCA9IGRpc3BsdmFsICgoYXJnKSk7IFwKLSBkc3QgPSB3b3JkYXQgKGx2YWwpOyBcCi0gYnJlYWs7IFwKLSBMQUJFTE4oRkVUQ0hfSU1NLCBuKTogXAotIGRzdCA9IChhcmcpLmxpdGVyYWw7IFwKLSBicmVhazsgXAotIH0gXAotIEVORERJU1BBVENIOyBcCi19Ci0KLXN0YXRpYyB1bmlvbgotewotICBzaG9ydCBpbnQgaTsKLSAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciBsb3c7Ci0gICAgICBjaGFyIGhpZ2g7Ci0gICAgfQotICB1OwotfQotCi1saXR0bGVlbmRpYW47Ci0KLXN0YXRpYwotdm9pZAotaW5pdF9wb2ludGVycyAoKQotewotICBzdGF0aWMgaW50IGluaXQ7Ci0KLSAgaWYgKCFpbml0KQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBpbml0ID0gMTsKLSAgICAgIGxpdHRsZWVuZGlhbi5pID0gMTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIFJfTEFTVDsgaSsrKQotCXsKLQkgIGlmIChsaXR0bGVlbmRpYW4udS5oaWdoKQotCSAgICB7Ci0JICAgICAgLyogYmlnIGVuZGlhbiBob3N0ICovCi0KLQotCSAgICAgIExPVyA9IDE7Ci0JICAgICAgSElHSCA9IDA7Ci0KLQkgICAgICByZWdwdHJbaV1bMF0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSkpICsgMzsKLQkgICAgICByZWdwdHJbaV1bMV0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSkpICsgMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgTE9XID0gMDsKLQkgICAgICBISUdIID0gMTsKLQotCSAgICAgIHJlZ3B0cltpXVswXSA9ICh1bnNpZ25lZCBjaGFyICopICYoY3B1LnJlZ3NbaV0pOwotCSAgICAgIHJlZ3B0cltpXVsxXSA9ICh1bnNpZ25lZCBjaGFyICopICgmKGNwdS5yZWdzW2ldKSk7Ci0JICAgIH0KLQotCSAgcmVncHRyW2ldWzJdID0gKHVuc2lnbmVkIGNoYXIgKikgJihjcHUucmVnc1tpXSk7Ci0JfQotCi0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDAsIHJlZ3B0ciArIFJfU1IsIHNpemVvZiAoc2VncmVncHRyWzBdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDEsIHJlZ3B0ciArIFJfVFAsIHNpemVvZiAoc2VncmVncHRyWzFdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDMsIHJlZ3B0ciArIFJfQlIsIHNpemVvZiAoc2VncmVncHRyWzNdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDQsIHJlZ3B0ciArIFJfRVAsIHNpemVvZiAoc2VncmVncHRyWzRdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDUsIHJlZ3B0ciArIFJfRFAsIHNpemVvZiAoc2VncmVncHRyWzVdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDYsIHJlZ3B0ciArIFJfQ1AsIHNpemVvZiAoc2VncmVncHRyWzZdKSk7Ci0gICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDcsIHJlZ3B0ciArIFJfVFAsIHNpemVvZiAoc2VncmVncHRyWzddKSk7Ci0KLSAgICAgIC8qIFBvaW50ZXJzIHRvIGludG8gdGhlIGNwdSBzdGF0ZSBmb3IgdGhlIHNlZyByZWdpc3RlcnMgKi8KLQotICAgICAgc2VnbWFwW1IwXSA9ICZjcHUucmVnc1tSX0RQXS5jOwotICAgICAgc2VnbWFwW1IxXSA9ICZjcHUucmVnc1tSX0RQXS5jOwotICAgICAgc2VnbWFwW1IyXSA9ICZjcHUucmVnc1tSX0RQXS5jOwotICAgICAgc2VnbWFwW1IzXSA9ICZjcHUucmVnc1tSX0RQXS5jOwotICAgICAgc2VnbWFwW1I0XSA9ICZjcHUucmVnc1tSX0VQXS5jOwotICAgICAgc2VnbWFwW1I1XSA9ICZjcHUucmVnc1tSX0VQXS5jOwotICAgICAgc2VnbWFwW1I2XSA9ICZjcHUucmVnc1tSX1RQXS5jOwotICAgICAgc2VnbWFwW1I3XSA9ICZjcHUucmVnc1tSX1RQXS5jOwotICAgICAgc2VnbWFwW1JfSEFSRF8wXSA9ICZjcHUucmVnc1tSX0RQXS5jOwotICAgICAgc2VnbWFwW1JfSEFSRDhfMF0gPSAmY3B1LnJlZ3NbUl9CUF0uYzsKLQotICAgICAgY3B1Lm1lbW9yeSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoc2l6ZW9mIChjaGFyKSwgSDg1MDBfTVNJWkUpOwotICAgICAgY3B1LmNhY2hlX2lkeCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjYWxsb2MgKHNpemVvZiAoc2hvcnQpLCBIODUwMF9NU0laRSk7Ci0KLSAgICAgIC8qIGluaXRpYWxpemUgdGhlIHNlZyByZWdpc3RlcnMgKi8KLQotICAgICAgY3B1LnJlZ3NbUl9EUF0uYyA9IGNwdS5tZW1vcnk7Ci0gICAgICBjcHUucmVnc1tSX1RQXS5jID0gY3B1Lm1lbW9yeTsKLSAgICAgIGNwdS5yZWdzW1JfQ1BdLmMgPSBjcHUubWVtb3J5OwotICAgICAgY3B1LnJlZ3NbUl9CUF0uYyA9IGNwdS5tZW1vcnk7Ci0gICAgICBjcHUucmVnc1tSX0VQXS5jID0gY3B1Lm1lbW9yeTsKLSAgICAgIGNwdS5yZWdzW1I3XS5zW0xPV10gPSAweGZmZmU7Ci0gICAgICBjcHUucmVnc1tSNl0uc1tMT1ddID0gMHhmZmZlOwotICAgICAgaWYgKCFjcHUuY2FjaGUpCi0Jc2ltX3NldF9zaW1jYWNoZV9zaXplIChDU0laRSk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFBVU0hXT1JEKHgpCQkJCVwKLXsJCQkJCQlcCi0gIGludCBzcCA9IGNwdS5yZWdzW1I3XS5zW0xPV107CQkJXAotICB1bnNpZ25lZCBjaGFyICpwOwkJCQlcCi0JCQkJCQlcCi0gIHNwIC09IDI7CQkJCQlcCi0gIHAgPSAoc3AgJiAweGZmZmYpICsgKGNwdS5yZWdzW1JfVFBdLmMpOwlcCi0gIGNwdS5yZWdzW1I3XS5zW0xPV10gPSBzcDsJCQlcCi0gIHNldHdvcmRhdCAocCwgeCk7CQkJCVwKLX0JCQkJCQlcCi0KLSNkZWZpbmUgUE9QV09SRChkKQkJCQlcCi17CQkJCQkJXAotICBpbnQgc3B4PSBjcHUucmVnc1tSN10uc1tMT1ddOwkJCVwKLSAgdW5zaWduZWQgY2hhciAqcDsJCQkJXAotCSAgICAgICAgCQkJCVwKLSAgcCA9IChzcHgmIDB4ZmZmZikgKyAoY3B1LnJlZ3NbUl9UUF0uYyk7CVwKLSAgc3B4Kz0gMjsJCQkJCVwKLSAgY3B1LnJlZ3NbUjddLnNbTE9XXSA9IHNweDsgICAgICAgICAgICAgICAgICAgIFwKLSAgZCA9IHdvcmRhdCAocCk7CQkJCVwKLX0JCQkJCQlcCi0KLS8qIHNpbXVsYXRlIGEgbW9uaXRvciB0cmFwICovCi10cmFwICgpCi17Ci0gIHN3aXRjaCAoY3B1LnJlZ3NbUjNdLnNbTE9XXSAmIDB4ZmYpCi0gICAgewotICAgIGNhc2UgMzM6Ci0gICAgICAvKiBleGl0ICovCi0gICAgICBjcHUuZXhjZXB0aW9uID0gU0lHUVVJVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzQ6Ci0gICAgICAvKiBhYm9ydCAqLwotICAgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR0FCUlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICAvKiBwcmludCBjaGFyIGluIHIwICovCi0gICAgICBwcmludGYgKCIlYyIsIGNwdS5yZWdzW1IwXS5zW0xPV10pOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZAotY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKLSAgICAgaW50IHNpZzsKLSAgICAgaW50IGNvZGU7Ci0gICAgIGNoYXIgKnNjcDsKLSAgICAgY2hhciAqYWRkcjsKLXsKLSAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lOVDsKLX0KLQotc3RhdGljIGptcF9idWYgamJ1ZjsKLXN0YXRpYyB2b2lkCi1zZWd2ICgpCi17Ci0gIGNwdS5leGNlcHRpb24gPSBTSUdTRUdWOwotICBsb25nam1wIChqYnVmLCAxKTsKLX0KLQotaW50Ci1zaW1fc3RvcCAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBjcHUuZXhjZXB0aW9uID0gU0lHSU5UOwotICByZXR1cm4gMTsKLX0KLQotdm9pZAotc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICBzdGF0aWMgaW50IGluaXQxOwotICBpbnQgcmVzOwotICBpbnQgdG1wOwotICBpbnQgYXJnYTsKLSAgaW50IGFyZ2I7Ci0gIGludCBiaXQ7Ci0gIGludCBwYzsKLSAgaW50IEMsIFosIFYsIE47Ci0gIGludCBjeWNsZXMgPSAwOwotICBpbnQgaW5zdHMgPSAwOwotICBpbnQgdGlja19zdGFydCA9IGdldF9ub3cgKCk7Ci0gIHZvaWQgKCpwcmV2KSAoKTsKLSAgdm9pZCAoKnByZXZfc2VnKSAoKTsKLQotICBpZiAoIWluaXQxKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBpbml0MSA9IDE7Ci0gICAgICBpbml0X3BvaW50ZXJzICgpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTl9FQVRZUEVTOyBpKyspCi0JewotCSAgZWFzLmFbaV0ucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX05PUCwgMCk7Ci0JICBlYXMuYVtpXS5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKLQkgIGVhcy5hW2ldLnMuc3JjYWxvbmcgPSBMQUJFTF9SRUZOIChGRVRDSF9OT1AsIDApOwotCi0JICBlYXMuYVtpXS5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKLQkgIGVhcy5hW2ldLnMuc3JjYndvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9OT1AsIDEpOwotCSAgZWFzLmFbaV0ucy5zcmNibG9uZyA9IExBQkVMX1JFRk4gKEZFVENIX05PUCwgMSk7Ci0KLQkgIGVhcy5hW2ldLnMuZHN0Ynl0ZSA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKLQkgIGVhcy5hW2ldLnMuZHN0d29yZCA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKLQkgIGVhcy5hW2ldLnMuZHN0bG9uZyA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKLQl9Ci0KLSAgICAgIGVhcy5zLmVhX2x2YWwucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwsIDApOwotICAgICAgZWFzLnMuZWFfbHZhbC5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTFZBTCwgMCk7Ci0gICAgICBlYXMucy5lYV9sdmFsMjQucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwyNCwgMCk7Ci0gICAgICBlYXMucy5lYV9sdmFsMjQucy5zcmNhd29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwyNCwgMCk7Ci0KLSAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKLSAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKLSAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKLSAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKLSAgICAgIGVhcy5zLmVhX25vcC5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX05PUCk7Ci0gICAgICBlYXMucy5lYV9ub3Aucy5kc3R3b3JkID0gTEFCRUxfUkVGIChTVE9SRV9OT1ApOwotCi0gICAgICBlYXMucy5lYV9jci5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfQ1JCLCAwKTsKLSAgICAgIGVhcy5zLmVhX2NyLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9DUlcsIDApOwotCi0gICAgICBlYXMucy5lYV9jci5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfQ1JCLCAxKTsKLSAgICAgIGVhcy5zLmVhX2NyLnMuc3JjYndvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9DUlcsIDEpOwotCi0gICAgICBlYXMucy5lYV9jci5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX0NSQik7Ci0gICAgICBlYXMucy5lYV9jci5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0NSVyk7Ci0KLSAgICAgIGVhcy5zLmVhX3JlZy5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfUkVHX0IsIDApOwotICAgICAgZWFzLnMuZWFfcmVnLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9SRUdfVywgMCk7Ci0gICAgICBlYXMucy5lYV9yZWcucy5zcmNhbG9uZyA9IExBQkVMX1JFRk4gKEZFVENIX1JFR19MLCAwKTsKLQotICAgICAgZWFzLnMuZWFfcmVnLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9SRUdfQiwgMSk7Ci0gICAgICBlYXMucy5lYV9yZWcucy5zcmNid29yZCA9IExBQkVMX1JFRk4gKEZFVENIX1JFR19XLCAxKTsKLSAgICAgIGVhcy5zLmVhX3JlZy5zLnNyY2Jsb25nID0gTEFCRUxfUkVGTiAoRkVUQ0hfUkVHX0wsIDEpOwotCi0gICAgICBlYXMucy5lYV9yZWcucy5kc3RieXRlID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfQik7Ci0gICAgICBlYXMucy5lYV9yZWcucy5kc3R3b3JkID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfVyk7Ci0gICAgICBlYXMucy5lYV9yZWcucy5kc3Rsb25nID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfTCk7Ci0KLSAgICAgIGVhcy5zLmVhX2luYy5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU5DX0IsIDApOwotICAgICAgZWFzLnMuZWFfaW5jLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9JTkNfVywgMCk7Ci0gICAgICBlYXMucy5lYV9pbmMucy5zcmNiYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0lOQ19CLCAxKTsKLSAgICAgIGVhcy5zLmVhX2luYy5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU5DX1csIDEpOwotICAgICAgZWFzLnMuZWFfaW5jLnMuZHN0Ynl0ZSA9IExBQkVMX1JFRiAoU1RPUkVfSU5DX0IpOwotICAgICAgZWFzLnMuZWFfaW5jLnMuZHN0d29yZCA9IExBQkVMX1JFRiAoU1RPUkVfSU5DX1cpOwotCi0gICAgICBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0RFQ19CLCAwKTsKLSAgICAgIGVhcy5zLmVhX2RlYy5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfREVDX1csIDApOwotICAgICAgZWFzLnMuZWFfZGVjLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9ERUNfQiwgMSk7Ci0gICAgICBlYXMucy5lYV9kZWMucy5zcmNid29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0RFQ19XLCAxKTsKLSAgICAgIGVhcy5zLmVhX2RlYy5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX0RFQ19CKTsKLSAgICAgIGVhcy5zLmVhX2RlYy5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0RFQ19XKTsKLQotICAgICAgZWFzLnMuZWFfZGlzcC5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfRElTUF9CLCAwKTsKLSAgICAgIGVhcy5zLmVhX2Rpc3Aucy5zcmNhd29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0RJU1BfVywgMCk7Ci0gICAgICBlYXMucy5lYV9kaXNwLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9ESVNQX0IsIDEpOwotICAgICAgZWFzLnMuZWFfZGlzcC5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfRElTUF9XLCAxKTsKLSAgICAgIGVhcy5zLmVhX2Rpc3Aucy5kc3RieXRlID0gTEFCRUxfUkVGIChTVE9SRV9ESVNQX0IpOwotICAgICAgZWFzLnMuZWFfZGlzcC5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0RJU1BfVyk7Ci0KLSAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAwKTsKLSAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAwKTsKLSAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAxKTsKLSAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAxKTsKLQotICAgICAgZmxhZ19zcGVjaWFsID0gTEFCRUxfUkVGIChGTEFHX3NwZWNpYWwpOwotICAgICAgZmxhZ19tcCA9IExBQkVMX1JFRiAoRkxBR19tKTsKLSAgICAgIGZsYWdfTXAgPSBMQUJFTF9SRUYgKEZMQUdfTSk7Ci0gICAgICBmbGFnX2FwID0gTEFCRUxfUkVGIChGTEFHX2EpOwotICAgICAgZmxhZ19BcCA9IExBQkVMX1JFRiAoRkxBR19BKTsKLSAgICAgIGZsYWdfbm9uZXAgPSBMQUJFTF9SRUYgKEZMQUdfTk9ORSk7Ci0gICAgICBmbGFnX25vc3RvcmVwID0gTEFCRUxfUkVGIChGTEFHX05PU1RPUkUpOwotICAgICAgZmxhZ19jbGVhcnAgPSBMQUJFTF9SRUYgKEZMQUdfQ0xFQVIpOwotICAgICAgZmxhZ19zaGlmdGJ5dGUgPSBMQUJFTF9SRUYgKEZMQUdfc2hpZnRieXRlKTsKLSAgICAgIGZsYWdfc2hpZnR3b3JkID0gTEFCRUxfUkVGIChGTEFHX3NoaWZ0d29yZCk7Ci0gICAgICBmbGFnX211bHRieXRlID0gTEFCRUxfUkVGIChGTEFHX211bHRieXRlKTsKLSAgICAgIGZsYWdfbXVsdHdvcmQgPSBMQUJFTF9SRUYgKEZMQUdfbXVsdHdvcmQpOwotCi0KLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERTXSA9IExBQkVMX1JFRiAoT19BRERTKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERYXSA9IExBQkVMX1JFRiAoT19BRERYKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERdID0gTEFCRUxfUkVGIChPX0FERCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQU5EQ10gPSBMQUJFTF9SRUYgKE9fQU5EQyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQU5EXSA9IExBQkVMX1JFRiAoT19BTkQpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JDQ10gPSBMQUJFTF9SRUYgKE9fQkNDKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CQ0xSXSA9IExBQkVMX1JFRiAoT19CQ0xSKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CQ1NdID0gTEFCRUxfUkVGIChPX0JDUyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQkVRXSA9IExBQkVMX1JFRiAoT19CRVEpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JGXSA9IExBQkVMX1JFRiAoT19CRik7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQkdFXSA9IExBQkVMX1JFRiAoT19CR0UpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JHVF0gPSBMQUJFTF9SRUYgKE9fQkdUKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CSEldID0gTEFCRUxfUkVGIChPX0JISSk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQkhTXSA9IExBQkVMX1JFRiAoT19CSFMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JMRV0gPSBMQUJFTF9SRUYgKE9fQkxFKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CTE9dID0gTEFCRUxfUkVGIChPX0JMTyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQkxTXSA9IExBQkVMX1JFRiAoT19CTFMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JMVF0gPSBMQUJFTF9SRUYgKE9fQkxUKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CTUldID0gTEFCRUxfUkVGIChPX0JNSSk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQk5FXSA9IExBQkVMX1JFRiAoT19CTkUpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JOT1RdID0gTEFCRUxfUkVGIChPX0JOT1QpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JQTF0gPSBMQUJFTF9SRUYgKE9fQlBMKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CUFRdID0gTEFCRUxfUkVGIChPX0JQVCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQlJBXSA9IExBQkVMX1JFRiAoT19CUkEpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0JSTl0gPSBMQUJFTF9SRUYgKE9fQlJOKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CU0VUXSA9IExBQkVMX1JFRiAoT19CU0VUKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CU1JdID0gTEFCRUxfUkVGIChPX0JTUik7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQlRTVF0gPSBMQUJFTF9SRUYgKE9fQlRTVCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQlRdID0gTEFCRUxfUkVGIChPX0JUKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CVkNdID0gTEFCRUxfUkVGIChPX0JWQyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fQlZTXSA9IExBQkVMX1JFRiAoT19CVlMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0NMUl0gPSBMQUJFTF9SRUYgKE9fQ0xSKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19DTVBdID0gTEFCRUxfUkVGIChPX0NNUCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fREFERF0gPSBMQUJFTF9SRUYgKE9fREFERCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fRElWWFVdID0gTEFCRUxfUkVGIChPX0RJVlhVKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19EU1VCXSA9IExBQkVMX1JFRiAoT19EU1VCKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19FWFRTXSA9IExBQkVMX1JFRiAoT19FWFRTKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19FWFRVXSA9IExBQkVMX1JFRiAoT19FWFRVKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19KTVBdID0gTEFCRUxfUkVGIChPX0pNUCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fSlNSXSA9IExBQkVMX1JFRiAoT19KU1IpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX0xEQ10gPSBMQUJFTF9SRUYgKE9fTERDKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19MRE1dID0gTEFCRUxfUkVGIChPX0xETSk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fTElOS10gPSBMQUJFTF9SRUYgKE9fTElOSyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fTU9WRlBFXSA9IExBQkVMX1JFRiAoT19NT1ZGUEUpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX01PVlRQRV0gPSBMQUJFTF9SRUYgKE9fTU9WVFBFKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19NT1ZdID0gTEFCRUxfUkVGIChPX01PVik7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fTVVMWFVdID0gTEFCRUxfUkVGIChPX01VTFhVKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ORUddID0gTEFCRUxfUkVGIChPX05FRyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fTk9QXSA9IExBQkVMX1JFRiAoT19OT1ApOwotICAgICAgZXhlY19kaXNwYXRjaFtPX05PVF0gPSBMQUJFTF9SRUYgKE9fTk9UKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19PUkNdID0gTEFCRUxfUkVGIChPX09SQyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fT1JdID0gTEFCRUxfUkVGIChPX09SKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QSk1QXSA9IExBQkVMX1JFRiAoT19QSk1QKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QSlNSXSA9IExBQkVMX1JFRiAoT19QSlNSKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QUlREXSA9IExBQkVMX1JFRiAoT19QUlREKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QUlRTXSA9IExBQkVMX1JFRiAoT19QUlRTKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19SRUNPTVBJTEVdID0gTEFCRUxfUkVGIChPX1JFQ09NUElMRSk7Ci0KLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RMXSA9IExBQkVMX1JFRiAoT19ST1RMKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RSXSA9IExBQkVMX1JFRiAoT19ST1RSKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RYTF0gPSBMQUJFTF9SRUYgKE9fUk9UWEwpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1JPVFhSXSA9IExBQkVMX1JFRiAoT19ST1RYUik7Ci0KLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19SVERdID0gTEFCRUxfUkVGIChPX1JURCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fUlRTXSA9IExBQkVMX1JFRiAoT19SVFMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1NDQl9FUV0gPSBMQUJFTF9SRUYgKE9fU0NCX0VRKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TQ0JfRl0gPSBMQUJFTF9SRUYgKE9fU0NCX0YpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1NDQl9ORV0gPSBMQUJFTF9SRUYgKE9fU0NCX05FKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSEFMXSA9IExBQkVMX1JFRiAoT19TSEFMKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSEFSXSA9IExBQkVMX1JFRiAoT19TSEFSKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSExMXSA9IExBQkVMX1JFRiAoT19TSExMKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSExSXSA9IExBQkVMX1JFRiAoT19TSExSKTsKLQotICAgICAgZXhlY19kaXNwYXRjaFtPX1NMRUVQXSA9IExBQkVMX1JFRiAoT19TTEVFUCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fU1RDXSA9IExBQkVMX1JFRiAoT19TVEMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1NUTV0gPSBMQUJFTF9SRUYgKE9fU1RNKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJTXSA9IExBQkVMX1JFRiAoT19TVUJTKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJYXSA9IExBQkVMX1JFRiAoT19TVUJYKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJdID0gTEFCRUxfUkVGIChPX1NVQik7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fU1dBUF0gPSBMQUJFTF9SRUYgKE9fU1dBUCk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fVEFTXSA9IExBQkVMX1JFRiAoT19UQVMpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1RSQVBBXSA9IExBQkVMX1JFRiAoT19UUkFQQSk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fVFJBUF9WU10gPSBMQUJFTF9SRUYgKE9fVFJBUF9WUyk7Ci0gICAgICBleGVjX2Rpc3BhdGNoW09fVFNUXSA9IExBQkVMX1JFRiAoT19UU1QpOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1VOTEtdID0gTEFCRUxfUkVGIChPX1VOTEspOwotICAgICAgZXhlY19kaXNwYXRjaFtPX1hDSF0gPSBMQUJFTF9SRUYgKE9fWENIKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19YT1JDXSA9IExBQkVMX1JFRiAoT19YT1JDKTsKLSAgICAgIGV4ZWNfZGlzcGF0Y2hbT19YT1JdID0gTEFCRUxfUkVGIChPX1hPUik7Ci0gICAgICBub3AudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOwotICAgICAgY3B1LmNhY2hlWzBdLm9wY29kZSA9IGV4ZWNfZGlzcGF0Y2hbT19SRUNPTVBJTEVdOwotICAgICAgY3B1LmNhY2hlWzBdLnNyY2EudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOwotICAgICAgY3B1LmNhY2hlWzBdLnNyY2IudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2JieXRlOwotICAgIH0KLQotICBwcmV2ID0gc2lnbmFsIChTSUdJTlQsIGNvbnRyb2xfYyk7Ci0gIHByZXZfc2VnID0gc2lnbmFsIChTSUdTRUdWLCBzZWd2KTsKLQotICBpZiAoc3RlcCkKLSAgICB7Ci0gICAgICBjcHUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjcHUuZXhjZXB0aW9uID0gMDsKLSAgICB9Ci0KLSAgcGMgPSBjcHUucmVnc1tSX1BDXS5zW0xPV10gKyAoTk9STUFMX0NQIDw8IDE2KTsKLQotICBHRVRTUiAoKTsKLQotICBpZiAoc2V0am1wIChqYnVmKSA9PSAwKSB7Ci0gICAgZG8KLSAgICAgIHsKLQlpbnQgY2lkeDsKLQlkZWNvZGVkX2luc3QgKmNvZGU7Ci0KLSAgICAgIHRvcDoKLQljaWR4ID0gY3B1LmNhY2hlX2lkeFtwY107Ci0JY29kZSA9IGNwdS5jYWNoZSArIGNpZHg7Ci0KLQlGRVRDSCAoYXJnYSwgY29kZS0+c3JjYSwgMCk7Ci0JRkVUQ0ggKGFyZ2IsIGNvZGUtPnNyY2IsIDEpOwotCi0KLQkKLSNpZmRlZiBERUJVRwotCWlmIChkZWJ1ZykKLQkgIHsKLQkgICAgcHJpbnRmICgiJXggJWQgJXNcbiIsIHBjLCBjb2RlLT5vcGNvZGUsCi0JCSAgICBjb2RlLT5vcCA/IGNvZGUtPm9wLT5uYW1lIDogIioqIik7Ci0JICB9Ci0jZW5kaWYKLQotCWN5Y2xlcyArPSBjb2RlLT5jeWNsZXM7Ci0JaW5zdHMrKzsKLQlESVNQQVRDSCAoY29kZS0+b3Bjb2RlKQotCSAgewotCSAgICBMQUJFTCAoT19SRUNPTVBJTEUpOgotCSAgICAvKiBUaGlzIG9wY29kZSBpcyBhIGZha2UgZm9yIHdoZW4gd2UgZ2V0IHRvIGFuIGluc3RydWN0aW9uIHdoaWNoCi0JICAgICAgIGhhc24ndCBiZWVuIGNvbXBpbGVkICovCi0JICAgIGNvbXBpbGUgKHBjKTsKLQkgICAgZ290byB0b3A7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoT19ORUcpOgotCSAgICBhcmdhID0gLWFyZ2E7Ci0JICAgIGFyZ2IgPSAwOwotCSAgICByZXMgPSBhcmdhICsgYXJnYjsKLQkgICAgYnJlYWs7Ci0JICAgIExBQkVMIChPX1NVQlgpOgotCSAgICBhcmdhICs9IEM7Ci0JICAgIExBQkVMIChPX1NVQik6Ci0JICAgIExBQkVMIChPX1NVQlMpOgotCSAgICBhcmdhID0gLWFyZ2E7Ci0JICAgIExBQkVMIChPX0FERCk6Ci0JICAgIExBQkVMIChPX0FERFMpOgotCSAgICByZXMgPSBhcmdhICsgYXJnYjsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fQUREWCk6Ci0JICAgIHJlcyA9IGFyZ2EgKyBhcmdiICsgQzsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fQU5EKToKLQkgICAgTEFCRUwgKE9fQU5EQyk6Ci0JICAgIHJlcyA9IGFyZ2EgJiBhcmdiOwotCSAgICBicmVhazsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fQkNMUik6Ci0JICAgIGFyZ2EgJj0gMHhmOwotCSAgICBiaXQgPSAoYXJnYiAmICgxIDw8IGFyZ2EpKTsKLQkgICAgcmVzID0gYXJnYiAmIH4oMSA8PCBhcmdhKTsKLQkgICAgZ290byBiaXRvcDsKLQotCi0JICAgIExBQkVMIChPX0JSQSk6Ci0JICAgIExBQkVMIChPX0JUKToKLQkgICAgaWYgKDEpCi0JICAgICAgZ290byBjb25kdHJ1ZTsKLQotCSAgICBMQUJFTCAoT19CUk4pOgotCSAgICBMQUJFTCAoT19CRik6Ci0JICAgIGlmICgwKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX0JISSk6Ci0JICAgIGlmICgoQyB8fCBaKSA9PSAwKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX0JMUyk6Ci0JICAgIGlmICgoQyB8fCBaKSkKLQkgICAgICBnb3RvIGNvbmR0cnVlOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19CQ1MpOgotCSAgICBMQUJFTCAoT19CTE8pOgotCSAgICBpZiAoKEMgPT0gMSkpCi0JICAgICAgZ290byBjb25kdHJ1ZTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fQkNDKToKLQkgICAgTEFCRUwgKE9fQkhTKToKLQkgICAgaWYgKChDID09IDApKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX0JFUSk6Ci0JICAgIGlmIChaKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoT19CR1QpOgotCSAgICBpZiAoKChaIHx8IChOIF4gVikpID09IDApKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCi0KLQkgICAgTEFCRUwgKE9fQkxFKToKLQkgICAgaWYgKCgoWiB8fCAoTiBeIFYpKSA9PSAxKSkKLQkgICAgICBnb3RvIGNvbmR0cnVlOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19CR0UpOgotCSAgICBpZiAoKE4gXiBWKSA9PSAwKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoT19CTFQpOgotCSAgICBpZiAoKE4gXiBWKSkKLQkgICAgICBnb3RvIGNvbmR0cnVlOwotCSAgICBicmVhazsKLQkgICAgTEFCRUwgKE9fQk1JKToKLQkgICAgaWYgKChOKSkKLQkgICAgICBnb3RvIGNvbmR0cnVlOwotCSAgICBicmVhazsKLQkgICAgTEFCRUwgKE9fQk5FKToKLQkgICAgaWYgKChaID09IDApKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoT19CUEwpOgotCSAgICBpZiAoTiA9PSAwKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCSAgICBicmVhazsKLQkgICAgTEFCRUwgKE9fQlZDKToKLQkgICAgaWYgKChWID09IDApKQotCSAgICAgIGdvdG8gY29uZHRydWU7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoT19CVlMpOgotCSAgICBpZiAoKFYgPT0gMSkpCi0JICAgICAgZ290byBjb25kdHJ1ZTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fQk5PVCk6Ci0JICAgIGJpdCA9IGFyZ2IgJiAoMTw8KGFyZ2EgJiAweGYpKTsKLQkgICAgcmVzID0gYXJnYiBeICgxPDwoYXJnYSAmIDB4ZikpOwotCSAgICBnb3RvIGJpdG9wOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19CU0VUKToKLQkgICAgYXJnYSA9IDEgPDwgKGFyZ2EgJiAweGYpOwotCSAgICBiaXQgPSBhcmdiICYgYXJnYTsKLQkgICAgcmVzID0gYXJnYiB8IGFyZ2E7Ci0JICAgIGdvdG8gYml0b3A7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1BKTVApOgotCSAgICBwYyA9IGFyZ2E7Ci0JICAgIGdvdG8gbmV4dDsKLQotCSAgICBMQUJFTCAoT19VTkxLKToKLQkgICAgewotCSAgICAgIGludCB0OwotCSAgICAgIFNFVF9OT1JNUkVHIChSNywgR0VUX05PUk1SRUcgKFI2KSk7Ci0JICAgICAgUE9QV09SRCAodCk7Ci0JICAgICAgU0VUX05PUk1SRUcgKFI2LCB0KTsKLQkgICAgICBwYyA9IGNvZGUtPm5leHRfcGM7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0KLQkgICAgTEFCRUwgKE9fUlRTKToKLQkgICAgewotCSAgICAgIGludCBjcCA9IHBjICYgMHhmZjAwMDA7Ci0JICAgICAgUE9QV09SRCAocGMpOwotCSAgICAgIHBjIHw9IGNwOwotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19QUlRTKToKLQkgICAgewotCSAgICAgIGludCBjcDsKLQkgICAgICBpbnQgb2ZmOwotCSAgICAgIFBPUFdPUkQgKGNwKTsKLQkgICAgICBQT1BXT1JEIChvZmYpOwotCSAgICAgIGNwIDw8PSAxNjsKLQkgICAgICBTRVRfU0VHUkVHIChSX0NQLCBjcCk7Ci0JICAgICAgcGMgPSBjcCArIG9mZjsKLQkgICAgfQotCSAgICBnb3RvIG5leHQ7Ci0KLQkgICAgTEFCRUwgKE9fUEpTUik6Ci0JICAgIFBVU0hXT1JEIChhcmdiICYgMHhmZmZmKTsKLQkgICAgUFVTSFdPUkQgKGFyZ2IgPj4gMTYpOwotCSAgICBwYyA9IChhcmdhICYgMHhmZmZmZmYpOwotCSAgICBnb3RvIG5leHQ7Ci0KLQkgICAgTEFCRUwgKE9fQlNSKToKLQkgICAgTEFCRUwgKE9fSlNSKToKLQkgICAgUFVTSFdPUkQgKGNvZGUtPm5leHRfcGMpOwotCSAgICBwYyA9IGFyZ2EgfCAocGMgJiAweGZmMDAwMCk7Ci0JICAgIGdvdG8gbmV4dDsKLQotCSAgICBMQUJFTCAoT19CVFNUKToKLQkgICAgWiA9ICgoKGFyZ2IgPj4gKGFyZ2EgJiAweGYpKSAmIDEpID09IDApOwotCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7Ci0JICAgIGdvdG8gbmV4dDsKLQotCSAgICBMQUJFTCAoT19DTFIpOgotCSAgICByZXMgPSAwOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19DTVApOgotCSAgICBhcmdhID0gLWFyZ2E7Ci0JICAgIHJlcyA9IGFyZ2EgKyBhcmdiOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19EQUREKToKLQkgICAgcmVzID0gYXJnYSArIGFyZ2IgKyBDOwotCSAgICBpZiAocmVzID4gOTkpCi0JICAgICAgewotCQlyZXMgLT0gMTAwOwotCQlDID0gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUMgPSAwOwotCSAgICAgIH0KLQkgICAgWiA9IFogJiYgKHJlcyA9PSAwKTsKLQkgICAgYnJlYWs7Ci0KLQotCSAgICBMQUJFTCAoT19EU1VCKToKLQkgICAgcmVzID0gYXJnYiAtIGFyZ2EgLSBDOwotCSAgICBpZiAocmVzIDwgMCkKLQkgICAgICB7Ci0JCXJlcyArPSAxMDA7Ci0JCUMgPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJQyA9IDA7Ci0JICAgICAgfQotCSAgICBaID0gWiAmJiAocmVzID09IDApOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19FWFRTKToKLQkgICAgcmVzID0gU0VYVENIQVIgKGFyZ2EpOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19FWFRVKToKLQkgICAgcmVzID0gKHVuc2lnbmVkIGNoYXIpIGFyZ2E7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX0pNUCk6Ci0JICAgIHBjID0gYXJnYSB8IChwYyAmIDB4ZmYwMDAwKTsKLQkgICAgZ290byBuZXh0OwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19MRE0pOgotCi0JICAgIGZvciAodG1wID0gMDsgdG1wIDwgNzsgdG1wKyspCi0JICAgICAgewotCQlpZiAoYXJnYiAmICgxIDw8IHRtcCkpCi0JCSAgewotCQkgICAgUE9QV09SRCAoY3B1LnJlZ3NbdG1wXS5zW0xPV10pOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmIChhcmdiICYgMHg4MCkKLQkgICAgICBQT1BXT1JEICh0bXApOwkvKiBkdW1teSByZWFkeSBmb3Igc3AgKi8KLQkgICAgZ290byBuZXh0cGM7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX0xJTkspOgotCSAgICBQVVNIV09SRCAoY3B1LnJlZ3NbUjZdLnNbTE9XXSk7Ci0JICAgIGNwdS5yZWdzW1I2XS5zW0xPV10gPSBjcHUucmVnc1tSN10uc1tMT1ddOwotCSAgICBjcHUucmVnc1tSN10uc1tMT1ddICs9IGFyZ2I7Ci0JICAgIGdvdG8gbmV4dHBjOwotCi0JICAgIExBQkVMIChPX1NUQyk6Ci0JICAgIExBQkVMIChPX0xEQyk6Ci0JICAgIExBQkVMIChPX01PVkZQRSk6Ci0JICAgIExBQkVMIChPX01PVlRQRSk6Ci0JICAgIExBQkVMIChPX01PVik6Ci0JICAgIExBQkVMIChPX1RTVCk6Ci0JICAgIHJlcyA9IGFyZ2E7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1RSQVBBKToKLQkgICAgaWYgKGFyZ2EgPT0gMTUpCi0JICAgICAgewotCQl0cmFwICgpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJUFVTSFdPUkQgKHBjICYgMHhmZmZmKTsKLQkJaWYgKGNwdS5tYXhpbXVtKQotCQkgIHsKLQkJICAgIFBVU0hXT1JEIChOT1JNQUxfQ1ApOwotCQkgIH0KLQkJUFVTSFdPUkQgKE5PUk1BTF9TUik7Ci0JCWlmIChjcHUubWF4aW11bSkKLQkJICB7Ci0JCSAgICBhcmdhID0gYXJnYSAqIDQgKyAweDQwOwotCQkgICAgU0VUX05PUk1BTF9DUFBDIChsb25nYXQgKGNwdS5tZW1vcnkgKyBhcmdhKSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgYXJnYSA9IGFyZ2EgKiAyICsgMHgyMDsKLQkJICAgIFNFVF9OT1JNQUxfQ1BQQyAod29yZGF0IChjcHUubWVtb3J5ICsgYXJnYSkpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX09SKToKLQkgICAgTEFCRUwgKE9fT1JDKToKLQkgICAgcmVzID0gYXJnYSB8IGFyZ2I7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1hPUik6Ci0JICAgIExBQkVMIChPX1hPUkMpOgotCSAgICByZXMgPSBhcmdhIF4gYXJnYjsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fU0NCX0YpOgotCSAgICB7Ci0JICAgIHNjYl9mOgotCSAgICAgIHJlcyA9IGFyZ2EgLSAxOwotCSAgICAgIGNvZGUtPnNyY2EucmVnLndwdHJbMF0gPSByZXM7Ci0JICAgICAgaWYgKHJlcyAhPSAtMSkKLQkJewotCQkgIHBjID0gYXJnYjsKLQkJICBnb3RvIG5leHQ7Ci0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19TQ0JfRVEpOgotCSAgICBpZiAoWiA9PSAxKQotCSAgICAgIGJyZWFrOwotCSAgICBlbHNlCi0JICAgICAgZ290byBzY2JfZjsKLQotCSAgICBMQUJFTCAoT19TQ0JfTkUpOgotCSAgICBpZiAoWiA9PSAwKQotCSAgICAgIGJyZWFrOwotCSAgICBlbHNlCi0JICAgICAgZ290byBzY2JfZjsKLQotCSAgICBMQUJFTCAoT19OT1ApOgotCSAgICAvKiBJZiBvbmx5IHRoZXkgd2VyZSBhbGwgYXMgc2ltcGxlIGFzIHRoaXMgKi8KLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fUk9UTCk6Ci0JICAgIHJlcyA9IGFyZ2EgPDwgMTsKLQkgICAgQyA9IChyZXMgPj4gYXJnYikgJiAxOwotCSAgICByZXMgfD0gQzsKLQkgICAgYnJlYWs7Ci0KLQotCSAgICBMQUJFTCAoT19ST1RSKToKLQkgICAgQyA9IGFyZ2EgJiAxOwotCSAgICByZXMgPSBhcmdhID4+IDE7Ci0JICAgIHJlcyB8PSAoQyA8PCAoYXJnYiAtIDEpKTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fUk9UWEwpOgotCSAgICByZXMgPSBhcmdhIDw8IDE7Ci0JICAgIHJlcyB8PSBDOwotCSAgICBDID0gKHJlcyA+PiBhcmdiKSAmIDE7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1JPVFhSKToKLQkgICAgcmVzID0gYXJnYSA+PiAxOwotCSAgICByZXMgfD0gKEMgPDwgKGFyZ2IgLSAxKSk7Ci0JICAgIEMgPSBhcmdhICYgMTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fU0hBTCk6Ci0JICAgIHJlcyA9IGFyZ2EgPDwgMTsKLQkgICAgaWYgKGFyZ2IgPT0gMTYpCi0JICAgICAgewotCQlDID0gKHJlcyA+PiAoMTYpKSAmIDE7Ci0JCVogPSAoKHJlcyAmIDB4ZmZmZikgPT0gMCk7Ci0JCU4gPSAoKHJlcyAmIDB4ODAwMCkgIT0gMCk7Ci0JICAgICAgfQotCi0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUMgPSAocmVzID4+ICg4KSkgJiAxOwotCQlaID0gKChyZXMgJiAweGZmKSA9PSAwKTsKLQkJTiA9ICgocmVzICYgMHg4MCkgIT0gMCk7Ci0KLQkgICAgICB9Ci0JICAgIFYgPSBDIF4gTjsKLQkgICAgZ290byBub25lOwotCi0JICAgIExBQkVMIChPX1NIQVIpOgotCSAgICBDID0gYXJnYSAmIDE7Ci0JICAgIGlmIChhcmdiID09IDE2KQotCSAgICAgIHsKLQkJcmVzID0gKChzaG9ydCkgYXJnYSkgPj4gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXJlcyA9IChTRVhUQ0hBUiAoYXJnYSkpID4+IDE7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoT19TSExMKToKLQkgICAgcmVzID0gYXJnYSA8PCAxOwotCSAgICBDID0gKHJlcyA+PiBhcmdiKSAmIDE7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1NITFIpOgotCSAgICBDID0gYXJnYSAmIDE7Ci0JICAgIHJlcyA9IGFyZ2EgPj4gMTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fRElWWFUpOgotCSAgICBpZiAoYXJnYSA9PSAwKQotCSAgICAgIHsKLQkJTiA9IFYgPSBDID0gMDsKLQkJWiA9IDE7Ci0JCWNwdS5leGNlcHRpb24gPSBTSUdJTEw7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgZCA9IGFyZ2IgLyBhcmdhOwotCQlpbnQgbSA9IGFyZ2IgJSBhcmdhOwotCQlpZiAoY29kZS0+ZHN0LnR5cGUgPT0gZWFzLnMuZWFfcmVnLnMuZHN0bG9uZykKLQkJICB7Ci0JCSAgICByZXMgPSAobSA8PCAxNikgfCAoZCAmIDB4ZmZmZik7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgcmVzID0gKG0gPDwgOCkgfCAoZCAmIDB4ZmYpOwotCQkgIH0KLQotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fTVVMWFUpOgotCSAgICByZXMgPSBhcmdhICogYXJnYjsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKE9fTk9UKToKLQkgICAgcmVzID0gfmFyZ2E7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChPX1NXQVApOgotCSAgICByZXMgPSAoKGFyZ2EgPj4gOCkgJiAweGZmKSB8ICgoYXJnYSA8PCA4KSAmIDB4ZmYwMCk7Ci0JICAgIGJyZWFrOwotCi0KLQkgICAgTEFCRUwgKE9fU1RNKToKLQkgICAgZm9yICh0bXAgPSA3OyB0bXAgPj0gMDsgdG1wLS0pCi0JICAgICAgewotCQlpZiAoYXJnYSAmICgxIDw8IHRtcCkpCi0JCSAgewotCQkgICAgUFVTSFdPUkQgKGNwdS5yZWdzW3RtcF0uc1tMT1ddKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBnb3RvIG5leHRwYzsKLQotCSAgICBMQUJFTCAoT19UQVMpOgotCSAgICBDID0gMDsKLQkgICAgViA9IDA7Ci0JICAgIFogPSBhcmdhID09IDA7Ci0JICAgIE4gPSBhcmdhIDwgMDsKLQkgICAgcmVzID0gYXJnYSB8IDB4ODA7Ci0JICAgIGdvdG8gbm9uZTsKLQotCSAgICBMQUJFTCAoT19QUlREKToKLQkgICAgTEFCRUwgKE9fWENIKToKLQkgICAgTEFCRUwgKE9fUlREKToKLQkgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lMTDsKLQkgICAgZ290byBuZXh0OwotCi0JICAgIExBQkVMIChPX1RSQVBfVlMpOgotCSAgICBMQUJFTCAoT19TTEVFUCk6Ci0JICAgIExBQkVMIChPX0JQVCk6Ci0JICAgIGNwdS5leGNlcHRpb24gPSBTSUdUUkFQOwotCSAgICBnb3RvIG5leHQ7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JRU5ERElTUEFUQ0g7Ci0KLQlESVNQQVRDSCAoY29kZS0+ZmxhZ3MpCi0JICB7Ci0JICBiaXRvcDoKLQkgICAgWiA9IChyZXMgJiBiaXQpID09IDA7Ci0JICAgIHBjID0gY29kZS0+bmV4dF9wYzsKLQkgICAgYnJlYWs7Ci0JICAgIExBQkVMIChGTEFHX211bHR3b3JkKToKLQkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7Ci0JICAgIE4gPSAocmVzICYgMHg4MDAwKSAhPSAwOwotCSAgICBWID0gMDsKLQkgICAgQyA9IDA7Ci0JICAgIHBjID0gY29kZS0+bmV4dF9wYzsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKEZMQUdfbXVsdGJ5dGUpOgotCSAgICAvKiA4KjggLT4gMTYgKi8KLQkgICAgWiA9IChyZXMgJiAweGZmKSA9PSAwOwotCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7Ci0JICAgIFYgPSAwOwotCSAgICBDID0gMDsKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19zaGlmdHdvcmQpOgotCSAgICBOID0gKHJlcyAmIDB4ODAwMCkgIT0gMDsKLQkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7Ci0JICAgIFYgPSAwOwotCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChGTEFHX3NoaWZ0Ynl0ZSk6Ci0JICAgIE4gPSAocmVzICYgMHg4MCkgIT0gMDsKLQkgICAgWiA9IChyZXMgJiAweGZmKSA9PSAwOwotCSAgICBWID0gMDsKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19zcGVjaWFsKToKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19tKToKLQkgICAgLyogTW92ZSBieXRlIGZsYWdzICovCi0JICAgIC8qIGFmdGVyIGEgbG9naWNhbCBpbnN0cnVjdGlvbiAqLwotCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7Ci0JICAgIFogPSAocmVzICYgMHhmZikgPT0gMDsKLQkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MCkgIT0gMDsKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19NKToKLQkgICAgLyogTW92ZSB3b3JkIGZsYWdzICovCi0JICAgIC8qIGFmdGVyIGEgbG9naWNhbCBpbnN0cnVjdGlvbiAqLwotCSAgICBOID0gKHJlcyAmIDB4ODAwMCkgIT0gMDsKLQkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7Ci0JICAgIFYgPSAoKCh+YXJnYSAmIH5hcmdiICYgcmVzKSB8IChhcmdhICYgYXJnYiAmIH5yZXMpKSAmIDB4ODAwMCkgIT0gMDsKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19hKToKLQkgICAgLyogYWZ0ZXIgYnl0ZSBzaXplZCBhcml0aCAqLwotCSAgICBDID0gKHJlcyAmIDB4MTAwKSAhPSAwOwotCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7Ci0JICAgIFogPSAocmVzICYgMHhmZikgPT0gMDsKLQkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MCkgIT0gMDsKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoRkxBR19BKToKLQkgICAgLyogYWZ0ZXIgd29yZCBzaXplZCBhcml0aCAqLwotCSAgICBDID0gKHJlcyAmIDB4MTAwMDApICE9IDA7Ci0JICAgIE4gPSAocmVzICYgMHg4MDAwKSAhPSAwOwotCSAgICBaID0gKHJlcyAmIDB4ZmZmZikgPT0gMDsKLQkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MDAwKSAhPSAwOwotCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChGTEFHX05PTkUpOgotCSAgbm9uZTo7Ci0JICAgIC8qIG5vIGZsYWdzIGJ1dCBzdG9yZSAqLwotCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7Ci0JICAgIGJyZWFrOwotCSAgICBMQUJFTCAoRkxBR19OT1NUT1JFKToKLQkgICAgLyogbm8gZmxhZ3MgYW5kIG5vIHN0b3JlICovCi0JICAgIHBjID0gY29kZS0+bmV4dF9wYzsKLQkgICAgYnJlYWs7Ci0JICAgIExBQkVMIChGTEFHX0NMRUFSKToKLQkgICAgLyogY2xlYXIgZmxhZ3MgKi8KLQkgICAgTiA9IDA7Ci0JICAgIFogPSAxOwotCSAgICBWID0gMDsKLQkgICAgQyA9IDA7Ci0JICAgIHBjID0gY29kZS0+bmV4dF9wYzsKLQkgICAgYnJlYWs7Ci0JICBjb25kdHJ1ZToKLQkgICAgcGMgPSBhcmdhOwotCSAgICBnb3RvIG5leHQ7Ci0JICB9Ci0JRU5ERElTUEFUQ0g7Ci0KLQlESVNQQVRDSCAoY29kZS0+ZHN0LnR5cGUpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGNoYXIgKmx2YWw7Ci0KLQkgICAgTEFCRUwgKFNUT1JFX0NSQik6Ci0JICAgICgqKGNvZGUtPmRzdC5yZWcuc2VncHRyKSkgPSBjcHUubWVtb3J5ICsgKHJlcyA8PCAxNik7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChTVE9SRV9OT1ApOgotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoU1RPUkVfUkVHX0IpOgotCSAgICAoKihjb2RlLT5kc3QucmVnLmJwdHIpKSA9IHJlczsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKFNUT1JFX1JFR19XKToKLQkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkgPSByZXM7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChTVE9SRV9SRUdfTCk6Ci0JICAgIHsKLQkgICAgICBpbnQgbCwgcjsKLQotCSAgICAgIHIgPSAodW5pb24gcnR5cGUgKikgKGNvZGUtPmRzdC5yZWcud3B0cikgLSAmY3B1LnJlZ3NbMF07Ci0JICAgICAgcisrOwotCSAgICAgICooY29kZS0+ZHN0LnJlZy53cHRyKSA9IHJlcyA+PiAxNjsKLQkgICAgICBjcHUucmVnc1tyXS5zW0xPV10gPSByZXMgJiAweGZmZmY7Ci0KLQkgICAgfQotCi0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChTVE9SRV9ESVNQX1cpOgotCSAgICBsdmFsID0gZGlzcGx2YWwgKGNvZGUtPmRzdCk7Ci0JICAgIHNldHdvcmRhdCAobHZhbCwgcmVzKTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKFNUT1JFX0RJU1BfQik6Ci0JICAgIGx2YWwgPSBkaXNwbHZhbCAoY29kZS0+ZHN0KTsKLQkgICAgc2V0Ynl0ZWF0IChsdmFsLCByZXMpOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoU1RPUkVfSU5DX0IpOgotCSAgICBsdmFsID0gZWx2YWwgKGNvZGUtPmRzdCwgMCk7Ci0JICAgIHNldGJ5dGVhdCAobHZhbCwgcmVzKTsKLQkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkrKzsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKFNUT1JFX0lOQ19XKToKLQkgICAgbHZhbCA9IGVsdmFsIChjb2RlLT5kc3QsIDApOwotCSAgICBzZXR3b3JkYXQgKGx2YWwsIHJlcyk7Ci0JICAgICgqKGNvZGUtPmRzdC5yZWcud3B0cikpICs9IDI7Ci0JICAgIGJyZWFrOwotCi0JICAgIExBQkVMIChTVE9SRV9ERUNfQik6Ci0JICAgICgqKGNvZGUtPmRzdC5yZWcud3B0cikpLS07Ci0JICAgIGx2YWwgPSBlbHZhbCAoY29kZS0+ZHN0LCAwKTsKLQkgICAgc2V0Ynl0ZWF0IChsdmFsLCByZXMpOwotCSAgICBicmVhazsKLQotCSAgICBMQUJFTCAoU1RPUkVfQ1JXKToKLQkgICAgLyogTWFrZSBhbiB1cCB0byBkYXRlIHNyIGZyb20gdGhlIGZsYWcgc3RhdGUgKi8KLQkgICAgY3B1LnJlZ3NbUl9TUl0uc1tMT1ddID0gcmVzOwotCSAgICBHRVRTUiAoKTsKLQkgICAgYnJlYWs7Ci0KLQkgICAgTEFCRUwgKFNUT1JFX0RFQ19XKToKLQkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkgLT0gMjsKLQkgICAgbHZhbCA9IGVsdmFsIChjb2RlLT5kc3QsIDApOwotCSAgICBzZXR3b3JkYXQgKGx2YWwsIHJlcyk7Ci0KLQkgICAgYnJlYWs7Ci0KLQkgIG5leHRwYzoKLQkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOwotCi0JICB9Ci0JRU5ERElTUEFUQ0g7Ci0gICAgICBuZXh0OjsKLSAgICAgIH0KLSAgICB3aGlsZSAoIWNwdS5leGNlcHRpb24pOwotICB9Ci0KLSAgY3B1LnRpY2tzICs9IGdldF9ub3cgKCkgLSB0aWNrX3N0YXJ0OwotICBjcHUuY3ljbGVzICs9IGN5Y2xlczsKLSAgY3B1Lmluc3RzICs9IGluc3RzOwotICBjcHUucmVnc1tSX1BDXS5zW0xPV10gPSBwYzsKLSAgQlVJTERTUiAoKTsKLQotICBzaWduYWwgKFNJR0lOVCwgcHJldik7Ci0gIHNpZ25hbCAoU0lHU0VHViwgcHJldl9zZWcpOwotfQotCi0KLQotCi1pbnQKLXNpbV93cml0ZSAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpOwotCi0gIGluaXRfcG9pbnRlcnMgKCk7Ci0gIGlmIChhZGRyIDwgMCB8fCBhZGRyICsgc2l6ZSA+IEg4NTAwX01TSVpFKQotICAgIHJldHVybiAwOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGNwdS5tZW1vcnlbYWRkciArIGldID0gYnVmZmVyW2ldOwotICAgICAgY3B1LmNhY2hlX2lkeFthZGRyICsgaV0gPSAwOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWludAotc2ltX3JlYWQgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbml0X3BvaW50ZXJzICgpOwotICBpZiAoYWRkciA8IDAgfHwgYWRkciArIHNpemUgPiBIODUwMF9NU0laRSkKLSAgICByZXR1cm4gMDsKLSAgbWVtY3B5IChidWZmZXIsIGNwdS5tZW1vcnkgKyBhZGRyLCBzaXplKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJpcHBlZCBvZmYgZnJvbSB0bS1oODUwMC5oICovCi0KLSNkZWZpbmUgUjBfUkVHTlVNCTAKLSNkZWZpbmUgUjFfUkVHTlVNCTEKLSNkZWZpbmUgUjJfUkVHTlVNCTIKLSNkZWZpbmUgUjNfUkVHTlVNCTMKLSNkZWZpbmUgUjRfUkVHTlVNCTQKLSNkZWZpbmUgUjVfUkVHTlVNCTUKLSNkZWZpbmUgUjZfUkVHTlVNCTYKLSNkZWZpbmUgUjdfUkVHTlVNCTcKLQotLyogQXMgYWJvdmUsIGJ1dCB3aXRoIGNvcnJlY3Qgc2VnIHJlZ2lzdGVyIGdsdWVkIG9uICovCi0jZGVmaW5lIFBSMF9SRUdOVU0JOAotI2RlZmluZSBQUjFfUkVHTlVNCTkKLSNkZWZpbmUgUFIyX1JFR05VTQkxMAotI2RlZmluZSBQUjNfUkVHTlVNCTExCi0jZGVmaW5lIFBSNF9SRUdOVU0JMTIKLSNkZWZpbmUgUFI1X1JFR05VTQkxMwotI2RlZmluZSBQUjZfUkVHTlVNCTE0Ci0jZGVmaW5lIFBSN19SRUdOVU0JMTUKLQotI2RlZmluZSBTUF9SRUdOVU0gICAgICAgUFI3X1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLwotI2RlZmluZSBGUF9SRUdOVU0gICAgICAgUFI2X1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLwotCi0KLSNkZWZpbmUgU0VHX0NfUkVHTlVNCTE2CS8qIFNlZ21lbnQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNFR19EX1JFR05VTQkxNwotI2RlZmluZSBTRUdfRV9SRUdOVU0JMTgKLSNkZWZpbmUgU0VHX1RfUkVHTlVNCTE5Ci0KLSNkZWZpbmUgQ0NSX1JFR05VTSAgICAgIDIwCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KLSNkZWZpbmUgUENfUkVHTlVNICAgICAgIDIxCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLwotCi0jZGVmaW5lIENZQ0xFX1JFR05VTSAgICAyMgotI2RlZmluZSBJTlNUX1JFR05VTSAgICAgMjMKLSNkZWZpbmUgVElDS19SRUdOVU0gICAgIDI0Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIHZhbHVlLCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotewotICBpbnQgc2VnID0gMDsKLSAgaW50IHJlZyA9IC0xOwotCi0gIGluaXRfcG9pbnRlcnMgKCk7Ci0gIHN3aXRjaCAocm4pCi0gICAgewotICAgIGNhc2UgUENfUkVHTlVNOgotICAgICAgU0VUX1NFR1JFRyAoUl9DUCwgKHZhbHVlWzFdPDwxNikpOwotICAgICAgY3B1LnJlZ3NbUl9QQ10uc1tMT1ddID0gKHZhbHVlWzJdIDw8IDgpIHwgdmFsdWVbM107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNFR19DX1JFR05VTToKLSAgICBjYXNlIFNFR19EX1JFR05VTToKLSAgICBjYXNlIFNFR19FX1JFR05VTToKLSAgICBjYXNlIFNFR19UX1JFR05VTToKLSAgICAgIHNlZyA9IHJuIC0gU0VHX0NfUkVHTlVNICsgUl9DUDsKLSAgICAgIHJlZyA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUjBfUkVHTlVNOgotICAgIGNhc2UgUjFfUkVHTlVNOgotICAgIGNhc2UgUjJfUkVHTlVNOgotICAgIGNhc2UgUjNfUkVHTlVNOgotICAgIGNhc2UgUjRfUkVHTlVNOgotICAgIGNhc2UgUjVfUkVHTlVNOgotICAgIGNhc2UgUjZfUkVHTlVNOgotICAgIGNhc2UgUjdfUkVHTlVNOgotICAgICAgc2VnID0gMDsKLSAgICAgIHJlZyA9IHJuIC0gUjBfUkVHTlVNOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDQ1JfUkVHTlVNOgotICAgICAgc2VnID0gMDsKLSAgICAgIHJlZyA9IFJfU1I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENZQ0xFX1JFR05VTToKLSAgICAgIGNwdS5jeWNsZXMgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgSU5TVF9SRUdOVU06Ci0gICAgICBjcHUuaW5zdHMgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVElDS19SRUdOVU06Ci0gICAgICBjcHUudGlja3MgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgUFIwX1JFR05VTToKLSAgICBjYXNlIFBSMV9SRUdOVU06Ci0gICAgY2FzZSBQUjJfUkVHTlVNOgotICAgIGNhc2UgUFIzX1JFR05VTToKLSAgICBjYXNlIFBSNF9SRUdOVU06Ci0gICAgY2FzZSBQUjVfUkVHTlVNOgotICAgIGNhc2UgUFI2X1JFR05VTToKLSAgICBjYXNlIFBSN19SRUdOVU06Ci0gICAgICBTRVRfU0VHUkVHIChzZWdmb3JyZWdbcm5dLCB2YWx1ZVsxXSk7Ci0gICAgICByZWcgPSBybiAtIFBSMF9SRUdOVU07ICAgICAgCi0gICAgICBjcHUucmVnc1tyZWddLnNbTE9XXSA9ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2VnKQotICAgIFNFVF9TRUdSRUcgKHNlZywgdmFsdWVbMF0gPDwgMTYpOwotCi0gIGlmIChyZWcgPiAwKQotICAgIHsKLSAgICAgIGNwdS5yZWdzW3JlZ10uc1tMT1ddID0gKHZhbHVlWzBdIDw8IDgpIHwgdmFsdWVbMV07Ci0gICAgfQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIGJ1ZiwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGluaXRfcG9pbnRlcnMgKCk7Ci0KLSAgc3dpdGNoIChybikKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgU0VHX0NfUkVHTlVNOgotICAgIGNhc2UgU0VHX0RfUkVHTlVNOgotICAgIGNhc2UgU0VHX0VfUkVHTlVNOgotICAgIGNhc2UgU0VHX1RfUkVHTlVNOgotICAgICAgYnVmWzBdID0gR0VUX1NFR1JFRyhybiAtIFNFR19DX1JFR05VTSArIFJfQ1ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDQ1JfUkVHTlVNOgotICAgICAgYnVmWzBdID0gY3B1LnJlZ3NbUl9TUl0uc1tISUdIXTsKLSAgICAgIGJ1ZlsxXSA9IGNwdS5yZWdzW1JfU1JdLnNbTE9XXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUENfUkVHTlVNOgotICAgICAgYnVmWzBdID0gMDsKLSAgICAgIGJ1ZlsxXSA9IEdFVF9TRUdSRUcoUl9DUCk7Ci0gICAgICBidWZbMl0gPSBISUdIX0JZVEUgKGNwdS5yZWdzW1JfUENdLnNbTE9XXSk7Ci0gICAgICBidWZbM10gPSBMT1dfQllURSAoY3B1LnJlZ3NbUl9QQ10uc1tMT1ddKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQUjBfUkVHTlVNOgotICAgIGNhc2UgUFIxX1JFR05VTToKLSAgICBjYXNlIFBSMl9SRUdOVU06Ci0gICAgY2FzZSBQUjNfUkVHTlVNOgotICAgIGNhc2UgUFI0X1JFR05VTToKLSAgICBjYXNlIFBSNV9SRUdOVU06Ci0gICAgY2FzZSBQUjZfUkVHTlVNOgotICAgIGNhc2UgUFI3X1JFR05VTToKLSAgICAgIHJuIC09IFBSMF9SRUdOVU07Ci0gICAgICBidWZbMF0gPSAwOwotICAgICAgYnVmWzFdID0gR0VUX1NFR1JFRyhzZWdmb3JyZWdbcm5dKTsKLSAgICAgIGJ1ZlsyXSA9IEhJR0hfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7Ci0gICAgICBidWZbM10gPSBMT1dfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFIwX1JFR05VTToKLSAgICBjYXNlIFIxX1JFR05VTToKLSAgICBjYXNlIFIyX1JFR05VTToKLSAgICBjYXNlIFIzX1JFR05VTToKLSAgICBjYXNlIFI0X1JFR05VTToKLSAgICBjYXNlIFI1X1JFR05VTToKLSAgICBjYXNlIFI2X1JFR05VTToKLSAgICBjYXNlIFI3X1JFR05VTToKLSAgICAgIGJ1ZlswXSA9IEhJR0hfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7Ci0gICAgICBidWZbMV0gPSBMT1dfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENZQ0xFX1JFR05VTToKLSAgICAgIGJ1ZlswXSA9IGNwdS5jeWNsZXMgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSBjcHUuY3ljbGVzID4+IDE2OwotICAgICAgYnVmWzJdID0gY3B1LmN5Y2xlcyA+PiA4OwotICAgICAgYnVmWzNdID0gY3B1LmN5Y2xlcyA+PiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRJQ0tfUkVHTlVNOgotICAgICAgYnVmWzBdID0gY3B1LnRpY2tzID4+IDI0OwotICAgICAgYnVmWzFdID0gY3B1LnRpY2tzID4+IDE2OwotICAgICAgYnVmWzJdID0gY3B1LnRpY2tzID4+IDg7Ci0gICAgICBidWZbM10gPSBjcHUudGlja3MgPj4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJTlNUX1JFR05VTToKLSAgICAgIGJ1ZlswXSA9IGNwdS5pbnN0cyA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IGNwdS5pbnN0cyA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IGNwdS5pbnN0cyA+PiA4OwotICAgICAgYnVmWzNdID0gY3B1Lmluc3RzID4+IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fdHJhY2UgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLQotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkgKz0gMikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gY3B1LnJlZ3NbUl9UUF0uYyArICgoY3B1LnJlZ3NbUjZdLnNbTE9XXSArIGkpICYgMHhmZmZmKTsKLSAgICAgIHVuc2lnbmVkIHNob3J0ICpqID0gKHVuc2lnbmVkIHNob3J0ICopIHA7Ci0KLSAgICAgIHByaW50ZiAoIiUwNHggIiwgKmopOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgiJTAyeCAlMDJ4ICUwMnggJTAyeDolMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKLQkgIE5PUk1BTF9EUCwKLQkgIE5PUk1BTF9FUCwKLQkgIE5PUk1BTF9UUCwKLQkgIE5PUk1BTF9DUCwKLQkgIGNwdS5yZWdzW1JfUENdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzBdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzFdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzJdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzNdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzRdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzVdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzZdLnNbTE9XXSwKLQkgIGNwdS5yZWdzWzddLnNbTE9XXSk7Ci0gIHNpbV9yZXN1bWUgKHNkLCAxLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247Ci0gICAgIGludCAqc2lncmM7Ci17Ci0gICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKLSAgKnNpZ3JjID0gY3B1LmV4Y2VwdGlvbjsKLX0KLQotdm9pZAotc2ltX3NldF9zaW1jYWNoZV9zaXplIChuKQotewotICBpZiAoY3B1LmNhY2hlKQotICAgIGZyZWUgKGNwdS5jYWNoZSk7Ci0gIGlmIChuIDwgMikKLSAgICBuID0gMjsKLSAgY3B1LmNhY2hlID0gKGRlY29kZWRfaW5zdCAqKSBtYWxsb2MgKHNpemVvZiAoZGVjb2RlZF9pbnN0KSAqIG4pOwotICBjcHUuY3NpemUgPSBuOwotfQotCi12b2lkCi1zaW1fc2l6ZSAobikKLSAgICAgaW50IG47Ci17Ci0gIC8qIEZpeGVkIHNpemUuICAqLwotfQotCi12b2lkCi1zaW1faW5mbyAoc2QsIHZlcmJvc2UpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgdmVyYm9zZTsKLXsKLSAgZG91YmxlIHRpbWV0YWtlbiA9IChkb3VibGUpIGNwdS50aWNrcyAvIChkb3VibGUpIG5vd19wZXJzZWMgKCk7Ci0gIGRvdWJsZSB2aXJ0dGltZSA9IGNwdS5jeWNsZXMgLyAxMC4wZTY7Ci0KLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIlxuXG5pbnN0cnVjdGlvbnMgZXhlY3V0ZWQgICUxMGRcbiIsCi0JCQkJICAgIGNwdS5pbnN0cyk7Ci0gICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCi0JCQkJICAgICJjeWNsZXMgKHYgYXBwcm94aW1hdGUpICUxMGRcbiIsCi0JCQkJICAgIGNwdS5jeWNsZXMpOwotICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAicmVhbCB0aW1lIHRha2VuICAgICAgICAlMTAuNGZcbiIsCi0JCQkJICAgIHRpbWV0YWtlbik7Ci0gICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCi0JCQkJICAgICJ2aXJ0dWFsIHRpbWUgdGFrZWQgICAgICUxMC40ZlxuIiwKLQkJCQkgICAgdmlydHRpbWUpOwotICBpZiAodGltZXRha2VuKSAKLSAgICB7Ci0gICAgICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCQkic2ltdWxhdGlvbiByYXRpbyAgICAgICAlMTAuNGZcbiIsCi0JCQkJCXZpcnR0aW1lIC8gdGltZXRha2VuKTsKLSAgICB9Ci0gIAotICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAiY29tcGlsZXMgICAgICAgICAgICAgICAlMTBkXG4iLAotCQkJCSAgICBjcHUuY29tcGlsZXMpOwotICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAotCQkJCSAgICAiY2FjaGUgc2l6ZSAgICAgICAgICAgICAlMTBkXG4iLAotCQkJCSAgICBjcHUuY3NpemUpOwotfQotCi1TSU1fREVTQwotc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQotICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7Ci0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIHNpbV9raW5kID0ga2luZDsKLSAgbXluYW1lID0gYXJndlswXTsKLSAgc2ltX2NhbGxiYWNrID0gY2I7Ci0gIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yICovCi0gIHJldHVybiAoU0lNX0RFU0MpIDE7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHF1aXR0aW5nOwotewotICAvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLVNJTV9SQwotc2ltX2xvYWQgKHNkLCBwcm9nLCBhYmZkLCBmcm9tX3R0eSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKnByb2c7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBleHRlcm4gYmZkICpzaW1fbG9hZF9maWxlICgpOyAvKiA/Pz8gRG9uJ3Qga25vdyB3aGVyZSB0aGlzIHNob3VsZCBsaXZlLiAgKi8KLSAgYmZkICpwcm9nX2JmZDsKLQotICBwcm9nX2JmZCA9IHNpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIHNpbV9jYWxsYmFjaywgcHJvZywgYWJmZCwKLQkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLQkJCSAgICAwLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgaW50IHBjOwotICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0gIGlmIChhYmZkICE9IE5VTEwpCi0gICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdGFydF9hZGRyZXNzID0gMDsKLQotICAvKiA/Pz8gV2UgYXNzdW1lIHRoaXMgaXMgYSA0IGJ5dGUgcXVhbnRpdHkuICAqLwotICBwYyA9IHN0YXJ0X2FkZHJlc3M7Ci0KLSAgc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgUENfUkVHTlVNLCAodW5zaWduZWQgY2hhciAqKSAmcGMsIDQpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKmNtZDsKLXsKLSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKLQkJCQkgICAgIlRoaXMgc2ltdWxhdG9yIGRvZXMgbm90IGFjY2VwdCBhbnkgY29tbWFuZHMuXG4iKTsKLX0KLQotdm9pZAotc2ltX3NldF9jYWxsYmFja3MgKHB0cikKLSAgICAgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpwdHI7Ci17Ci0gIHNpbV9jYWxsYmFjayA9IHB0cjsKLX0KZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9jb25maWcuaW4gYi9zaW0vaDg1MDAvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjg3YTJiLi4wMDAwMDAwCi0tLSBhL3NpbS9oODUwMC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX1NFVEZQVUNXCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9jb25maWd1cmUgYi9zaW0vaDg1MDAvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NGU1YTljLi4wMDAwMDAwCi0tLSBhL3NpbS9oODUwMC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0MDI0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Nzk6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzE3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjczNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODA3OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTExOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTg2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI2OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNTk6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMjc6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTEzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExOTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjIyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI3NzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzI5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMzNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMzOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MjE6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTkyOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjI1OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzA0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjU6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDM6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzg3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODE3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTkxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDc6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk3NTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDE4OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi0KLQotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTIxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIxODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyODA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzEzOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM1MjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM1NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzYyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM3OTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MDc6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ0MjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0ODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU3MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY0NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzEzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzOTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2NzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODc3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCi0jIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgotIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KLWZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk4NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5OTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5OTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMjY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBkbGZjbi5oIGVycm5vLmggc3lzL3N0YXQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNjY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDc2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMDU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE2MDogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQotYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZCgpOwotCi1pbnQgbWFpbigpIHsKLWJpbmQoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjA3OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sbnNsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBnZXRob3N0YnluYW1lKCk7Ci0KLWludCBtYWluKCkgewotZ2V0aG9zdGJ5bmFtZSgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0uICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotCi0KLVVTRV9NQUlOVEFJTkVSX01PREU9bm8KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7Ci0gIG5vKQlNQUlOVD0iIyIgOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCi1maQotZWxzZQotICBNQUlOVD0iIyIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKLSAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2Jzd2FwPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKLSAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKLSAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKLSAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCi1maQotZWxzZQotICBzaW1fY2ZsYWdzPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKLSAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OwotICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCi1maQotZWxzZQotICBzaW1fZGVidWc9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKLSAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCi1maQotZWxzZQotICBzaW1fc3RkaW89IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKLSAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7Ci0gIFstMC05XSopCi0Jc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKLSAgW2Etel0qKQotCXNpbV90cmFjZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgotCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3RyYWNlPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKLSAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7Ci0gIFstMC05XSopCi0Jc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKLSAgW2Etel0qKQotCXNpbV9wcm9maWxlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCi1maQotZWxzZQotICBzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiCi1maQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDAyOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQwNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgc2lnbmFsCi0jdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOwotI2Vsc2UKLXZvaWQgKCpzaWduYWwgKCkpICgpOwotI2VuZGlmCi0KLWludCBtYWluKCkgewotaW50IGk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9aW50Ci1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotRU9GCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1zaW1fbGlua19maWxlcz0KLXNpbV9saW5rX2xpbmtzPQotCi1zaW1fbGlua19saW5rcz10Y29uZmlnLmgKLWlmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KLXRoZW4KLSAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgotZWxzZQotICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgotZmkKLQotIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgotY2FzZSAiJHt0YXJnZXR9IiBpbgotKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Ci1lc2FjCi1zaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKLXNpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgotCi0KLQotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2NvbmZpZ3VyZS5pbiBiL3NpbS9oODUwMC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTQ4ODIuLjAwMDAwMDAKLS0tIGEvc2ltL2g4NTAwL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oIHRpbWUuaCkKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2luc3QuaCBiL3NpbS9oODUwMC9pbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOGNhOTQuLjAwMDAwMDAKLS0tIGEvc2ltL2g4NTAwL2luc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0jZGVmaW5lIERFQlVHCi0KLSNkZWZpbmUgSDg1MDBfTVNJWkUgKDgqNjQqMTAyNCkKLSNkZWZpbmUgQ1NJWkUgMTAwMAotCi0KLXVuaW9uIHJ0eXBlIAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNbMl07Ci0gICAgICB1bnNpZ25lZCBjaGFyICpjOwotICAgIH07Ci0KLQotLyogTG9jYWwgcmVnaXN0ZXIgbmFtZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjcsCi0gIFJfU1IsCQkJCS8qIDggKi8KLSAgUl9QQywJCQkJLyogOSAqLwotICBSX0JSLAkJCQkvKiAxMCAqLwotICBSX0JQLAkJCQkvKiAxMSAqLwotICBSX0NQLAkJCQkvKiAxNCAqLwotICBSX0RQLAkJCQkvKiAxMyAqLwotICBSX0VQLAkJCQkvKiAxMiAqLwotICBSX1RQLAkJCQkvKiAxNSAqLwotICBSX0hBUkRfMCwJCQkvKiAxNiAqLwotICBSX0hBUkQ4XzAsCQkJLyogMTcgKi8KLSAgUl9MQVNULAotfSByZWdfdHlwZTsKLQotCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgZmFzdHJlZiB0eXBlOwotICB1bmlvbgotICAgIHsKLSAgICAgIGludCBjb2RlOwotICAgICAgdW5zaWduZWQgY2hhciAqYnB0cjsKLSAgICAgIHVuc2lnbmVkIHNob3J0ICp3cHRyOwotICAgICAgdW5zaWduZWQgbG9uZyAqbHB0cjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKipzZWdwdHI7Ci0gICAgICB1bmlvbiBydHlwZSAqcnB0cjsKLSAgICAgIAotICAgIH0KLSAgcmVnOwotICBpbnQgbGl0ZXJhbDsKLSAgdW5pb24KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICoqc2VncmVnOwotICAgICAgdW5zaWduZWQgc2hvcnQgKndwdHI7Ci0gICAgICB1bmlvbiBydHlwZSAqcnB0cjsKLSAgICB9Ci0gIHIyOwotfQotCi1lYV90eXBlOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgZWFfdHlwZSBzcmNhOwotICBlYV90eXBlIHNyY2I7Ci0gIGVhX3R5cGUgZHN0OwotICBmYXN0cmVmIG9wY29kZTsKLSAgZmFzdHJlZiBmbGFnczsKLSAgaW50IG5leHRfcGM7Ci0gIGludCBvbGRwYzsKLSAgaW50IGN5Y2xlczsKLSNpZmRlZiBERUJVRwotICBoODUwMF9vcGNvZGVfaW5mbyAqb3A7Ci0jZW5kaWYKLX0KLQotZGVjb2RlZF9pbnN0OwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IGV4Y2VwdGlvbjsKLSAgdW5pb24gcnR5cGUgICByZWdzWzIwXTsKLSAgCi0KLQotICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci0gIHVuc2lnbmVkIHNob3J0ICpjYWNoZV9pZHg7Ci0gIGludCBjYWNoZV90b3A7Ci0gIGludCBtYXhpbXVtOwotICBpbnQgY3NpemU7Ci0gIGRlY29kZWRfaW5zdCAqY2FjaGU7Ci0gIGludCBjeWNsZXM7Ci0gIGludCBpbnN0czsKLSAgaW50IHRpY2tzOwotICBpbnQgY29tcGlsZXM7Ci19Ci0KLWNwdV9zdGF0ZV90eXBlOwpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL3Rjb25maWcuaW4gYi9zaW0vaDg1MDAvdGNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMGQwNC4uMDAwMDAwMAotLS0gYS9zaW0vaDg1MDAvdGNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qIGg4NTAwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KLSAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgotICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLwotI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvQ2hhbmdlTG9nIGIvc2ltL2k5NjAvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg3YzVlLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0yMDAwLTAzLTMwICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMTAtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogdHJhcHMuYyAoc2ltX2VuZ2luZV9pbnZhbGlkX2luc24pOiBOZXcgYXJnIGB2cGMnLiAgQ2hhbmdlIHR5cGUgb2YKLQlyZXN1bHQgdG8gU0VNX1BDLiAgUmV0dXJuIHZwYy4KLQotV2VkIFNlcCAyOSAxNDo0NjozNiAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHRyYXBzLmMgKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUmV0dXJuIFBDLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA4LTI4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KLQotMTk5OS0wOC0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KLQotMTk5OS0wOC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxjcHVhbGwuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KLQkqIGk5NjAtZGVzYy5oOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLUZyaSBBcHIgMTYgMTY6NTA6MzEgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRldmljZXMuYyAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfZXJyb3IpOiBHaXZlIHByb3BlciBhcmcgc3BlYy4KLQotMTk5OS0wNC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBpOTYwLWRlc2MuYyxpOTYwLWRlc2MuaDogUmVidWlsZC4KLQotU3VuIEFwciAxMSAwMDoyNToxNyAxOTk5ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIFRPRE86IERvY3VtZW50IG1vcmUgdG9vbGNoYWluIHByb2JsZW1zLgotCSogY3B1LmgsIGRlY29kZS5jLCBtb2RlbC5jLCBzZW0tc3dpdGNoLmMsIHNlbS5jOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KLQotRnJpIEFwciAgOSAxOTozMDowNSAxOTk5ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRSwgVE9ETzogQ2xlYW4gdXAgYW5kIHVwZGF0ZS4KLQkqIHNpbS1pZi5jOiBzL20zMnIvaTk2MC4gIHMvc3BhcmMzMi9pOTYwLgotCSogZGVjb2RlLmMsIGRlY29kZS5oLCBpOTYwLWRlc2MuYywgaTk2MC1kZXNjLmgsIGk5NjAtb3BjLmgsIG1vZGVsLmMsCi0Jc2VtLXN3aXRjaC5jLCBzZW0uYzogUmVidWlsZC4KLQotMTk5OS0wMy0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBkZWNvZGUuYzogUmVidWlsZC4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBhcmNoLmMsYXJjaC5oLG1vZGVsLmMsaTk2MC1kZXNjLmMsaTk2MC1kZXNjLmgsaTk2MC1vcGMuaDogUmVidWlsZC4KLQkqIGk5NjAtc2ltLmggKGFfaTk2MF9oX2dyX2dldCxhX2k5NjBfaF9ncl9zZXQpOiBEZWNsYXJlLgotCShhX2k5NjBfaF9wY19nZXQsYV9pOTYwX2hfcGNfc2V0KTogRGVjbGFyZS4KLQkqIGk5NjAuYyAoYV9pOTYwX2hfZ3JfZ2V0LGFfaTk2MF9oX2dyX3NldCk6IE5ldyBmdW5jdGlvbnMuCi0JKGFfaTk2MF9oX3BjX2dldCxhX2k5NjBfaF9wY19zZXQpOiBEaXR0by4KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IFVwZGF0ZSBjYWxsIHRvIGk5NjBfY2dlbl9jcHVfb3Blbi4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBhcmNoLmMsYXJjaC5oLGNwdS5jLGk5NjAtZGVzYy5jLGk5NjAtZGVzYy5oOiBSZWJ1aWxkLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogVXBkYXRlIGNhbGwgdG8gaTk2MF9jZ2VuX2NwdV9vcGVuLgotCi0xOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGVzYy5jLGk5NjAtZGVzYy5oOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJOTYwX09CSlMpOiBBZGQgaTk2MC1kZXNjLm8uCi0JKFNJTV9FWFRSQV9ERVBTKTogUmVwbGFjZSBjcHUtb3BjLmggd2l0aCBpOTYwLWRlc2MuaCxpOTYwLW9wYy5oLgotCSogY29uZmlndXJlLmluIChzaW1fbGlua19maWxlcyxzaW1fbGlua19saW5rcyk6IERlbGV0ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCSogZGV2aWNlcy5jOiBzL20zMnIvaTk2MC8uCi0JKiBpOTYwLWRlc2MuYzogTmV3IGZpbGUuCi0JKiBpOTYwLWRlc2MuaDogTmV3IGZpbGUuCi0JKiBpOTYwLW9wYy5oOiBOZXcgZmlsZS4KLQkqIGk5NjAtc2ltLmggKEk5NjBfTUlTQ19QUk9GSUxFKTogRGVsZXRlLgotCSogaTk2MC5jIChpOTYwYmFzZV9tb2RlbF9pbnNuX2JlZm9yZSk6IERlbGV0ZSB1bnVzZWQgY29kZS4KLQkoaTk2MGJhc2VfbW9kZWxfaW5zbl9hZnRlcik6IERpdHRvLgotCShpOTYwX21vZGVsX2luaXRfaW5zbl9jeWNsZXMsaTk2MF9tb2RlbF91cGRhdGVfaW5zbl9jeWNsZXMpOiBEaXR0by4KLQkoaTk2MF9tb2RlbF9yZWNvcmRfY3ljbGVzKTogRGl0dG8uCi0JKiBtbG9vcC5pbiAoZXhlY3V0ZSk6IENHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JKGV4dHJhY3QtcGJiKTogVXNlIGlkZXNjLT5sZW5ndGggdG8gZ2V0IGluc24gbGVuZ3RoLgotCSogc2ltLWlmLmMgKGk5NjBfZGlzYXNzZW1ibGVfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX29wZW4pOiBEZWxldGUgbWlzYy4gcHJvZmlsaW5nIHN1cHBvcnQuICBpOTYwX2NnZW5fY3B1X29wZW4gcmVuYW1lZAotCWZyb20gaTk2MF9jZ2VuX29wY29kZV9vcGVuLiAgU2V0IGRpc2Fzc2VtYmxlci4KLQkoc2ltX2Nsb3NlKTogaTk2MF9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQgZnJvbSBpOTYwX2NnZW5fb3Bjb2RlX29wZW4uCi0JKiBzaW0tbWFpbi5oOiBEb24ndCBpbmNsdWRlIGNwdS1vcGMuaCxjcHUtc2ltLmguIEluY2x1ZGUKLQlpOTYwLWRlc2MuaCxpOTYwLW9wYy5oLGk5NjAtc2ltLmguCi0JKHN0cnVjdCBfc2ltX2NwdSk6IERlbGV0ZSBtZW1iZXIgaTk2MF9taXNjX3Byb2ZpbGUuCi0KLTE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0KLTE5OTktMDEtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogYXJjaC5jLGFyY2guYyxjcHVhbGwuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpOTYwLWNsZWFuKTogcm0gZW5nLmguCi0JKiBzaW0tbWFpbi5oOiBEZWxldGUgaW5jbHVzaW9uIG9mIGFuc2lkZWNsLmguCi0JRGVsZXRlIGluY2x1c2lvbiBvZiBjZ2VuLXNjYWNoZS5oLGNnZW4tY3B1LmgsY2dlbi10cmFjZS5oLGNwdWFsbC5oLgotCShTSU1fQ09SRV9TSUdOQUwpOiBtMzJyIC0+IGk5NjAuCi0JKiBjcHUuaDogUmVnZW5lcmF0ZS4KLQkqIHRyYXBzLmM6IG0zMnIgLT4gaTk2MC4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBVc2UgQ0dFTl9JTkNMVURFX0RFUFMuCi0JKE1BSU5fSU5DTFVERV9ERVBTLElOQ0xVREVfREVQUyxPUFNfSU5DTFVERV9ERVBTKTogRGVsZXRlLgotCShzaW0taWYubyk6IFVzZSBTSU1fTUFJTl9ERVBTLgotCShhcmNoLm8pOiBEaXR0by4KLQkodHJhcHMubyk6IERpdHRvLgotCShkZXZpY2VzLm8pOiBEaXR0by4KLQkoSTk2MEJBU0VfSU5DTFVERV9ERVBTKTogVXNlIENHRU5fTUFJTl9DUFVfREVQUy4KLQkoaTk2MC5vKTogVXNlIEk5NjBCQVNFX0lOQ0xVREVfREVQUy4KLQkobWxvb3AubyxjcHUubyxkZWNvZGUubyxzZW0ubyxtb2RlbC5vKTogRGl0dG8uCi0JKHN0YW1wLWFyY2gpOiBQYXNzIG1hY2g9YWxsIHRvIGNnZW4tYXJjaC4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogTW9kZWwgcHJvYmluZyBjb2RlIG1vdmVkIHRvIHNpbS1tb2RlbC5jLgotCi0xOTk4LTEyLTE0ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsIGRlY29kZS5jLCBzZW0tc3dpdGNoLmMsIHNlbS5jOiBSZWJ1aWx0LgotCSogdHJhcHMuYyAoaTk2MF90cmFwKTogU3RvcmUgc3lzY2FsbCByZXN1bHRzIGluIHJlZ3MgMTYgdG8gMTggaW5zdGVhZAotCW9mIHJlZ3MgMCB0byAyLgotCi1Nb24gRGVjIDE0IDIyOjMzOjM4IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbWxvb3AuaW4gKGV4dHJhY3QzMik6IEFkZCBjYWxscyB0byBAY3B1QF9maWxsX2FyZ2J1ZiBhbmQKLQlAY3B1QF9maWxfYXJnYnVmX3RwLgotCi0xOTk4LTEyLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogLS1lbmFibGUtY2dlbi1tYWludCBzdXBwb3J0IG1vdmVkIHRvIGNvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTgtMTItMDkgIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgotCi0JKiBtbG9vcC5pbiBleGVjdXRlKTogVGVzdCBBUkdCVUZfUFJPRklMRV9QIGJlZm9yZSBwcm9maWxpbmcuCi0JVXBkYXRlIGNhbGxzIHRvIFRSQUNFX0lOU05fSU5JVCxUUkFDRV9JTlNOX0ZJTkkuCi0JKiBjcHUuaCwgY3B1YWxsLmgsIGRlY29kZS5jLCBzZW0tc3dpdGNoLmMsIHNlbS5jOiBSZWdlbmVyYXRlLgotCi0xOTk4LTEyLTA4ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KLQotCSogTmV3IGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL01ha2VmaWxlLmluIGIvc2ltL2k5NjAvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI2NzIuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotIyBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgaTk2MCBzaW11bGF0b3IKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLUk5NjBfT0JKUyA9IGk5NjAubyBjcHUubyBkZWNvZGUubyBzZW0ubyBtb2RlbC5vIG1sb29wLm8gaTk2MC1kZXNjLm8KLQotQ09ORklHX0RFVklDRVMgPSBkdi1zb2Nrc2VyLm8KLUNPTkZJR19ERVZJQ0VTID0KLQotU0lNX09CSlMgPSBcCi0JJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCi0Jc2ltLWNwdS5vIFwKLQlzaW0tZW5naW5lLm8gXAotCXNpbS1obG9hZC5vIFwKLQlzaW0taHJ3Lm8gXAotCXNpbS1tb2RlbC5vIFwKLQlzaW0tcmVhc29uLm8gXAotCWNnZW4tdXRpbHMubyBjZ2VuLXRyYWNlLm8gY2dlbi1zY2FjaGUubyBcCi0JY2dlbi1ydW4ubyBzaW0tcmVhc29uLm8gc2ltLWVuZ2luZS5vIHNpbS1zdG9wLm8gXAotCXNpbS1pZi5vIGFyY2gubyBcCi0JJChJOTYwX09CSlMpIFwKLQl0cmFwcy5vIGRldmljZXMubyBcCi0JJChDT05GSUdfREVWSUNFUykKLQotIyBFeHRyYSBoZWFkZXJzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCi1TSU1fRVhUUkFfREVQUyA9IFwKLQkkKENHRU5fSU5DTFVERV9ERVBTKSBcCi0JYXJjaC5oIGNwdWFsbC5oIGk5NjAtc2ltLmggaTk2MC1kZXNjLmggaTk2MC1vcGMuaAotCi1TSU1fRVhUUkFfQ0ZMQUdTID0KLQotU0lNX1JVTl9PQkpTID0gbnJ1bi5vCi1TSU1fRVhUUkFfQ0xFQU4gPSBpOTYwLWNsZWFuCi0KLSMgVGhpcyBzZWxlY3RzIHRoZSBpOTYwIG5ld2xpYi9saWJnbG9zcyBzeXNjYWxsIGRlZmluaXRpb25zLgotIwotIyA/Pz8gVGhpcyBhZmZlY3RzIHdoYXQgc3R1ZmYgZ2V0cyBpbmNsdWRlZCBmcm9tIC4uL2NvbW1vbi9ubHR2YWxzLmRlZi4KLSMgRm9yIG5vdywgd2UgbmVlZCBTWVNfZXhpdCBiZWNhdXNlIG9mIHRyYXBzLmMuICBJZiB3ZSByZWFsbHkgbmVlZCB0aGlzLAotIyB0aGVuIHdlIG5lZWQgdG8gYWRkIGk5NjAgc3BlY2lmaWMgZGVmaW5pdGlvbnMgdG8gbmx0dmFscy5kZWYuCi1OTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9pOTYwCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLWFyY2ggPSBpOTYwCi0KLXNpbS1pZi5vOiBzaW0taWYuYyAkKFNJTV9NQUlOX0RFUFMpICQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWNvcmUuaAotCi1hcmNoLm86IGFyY2guYyAkKFNJTV9NQUlOX0RFUFMpCi0KLXRyYXBzLm86IHRyYXBzLmMgdGFyZy12YWxzLmggJChTSU1fTUFJTl9ERVBTKQotZGV2aWNlcy5vOiBkZXZpY2VzLmMgJChTSU1fTUFJTl9ERVBTKQotCi0jIEk5NjAgb2JqcwotCi1JOTYwQkFTRV9JTkNMVURFX0RFUFMgPSBcCi0JJChDR0VOX01BSU5fQ1BVX0RFUFMpIFwKLQljcHUuaCBkZWNvZGUuaCBlbmcuaAotCi1pOTYwLm86IGk5NjAuYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKLQotIyBGSVhNRTogVXNlIG9mIGBtb25vJyBpcyB3aXAuCi1tbG9vcC5jIGVuZy5oOiBzdGFtcC1tbG9vcAotc3RhbXAtbWxvb3A6ICQoc3JjZGlyKS8uLi9jb21tb24vZ2VubWxvb3Auc2ggbWxvb3AuaW4gTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2NvbSkvZ2VubWxvb3Auc2ggXAotCQktbW9ubyAtZmFzdCAtcGJiIC1zd2l0Y2ggc2VtLXN3aXRjaC5jIFwKLQkJLWNwdSBpOTYwYmFzZSAtaW5maWxlICQoc3JjZGlyKS9tbG9vcC5pbgotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgZW5nLmhpbiBlbmcuaAotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgbWxvb3AuY2luIG1sb29wLmMKLQl0b3VjaCBzdGFtcC1tbG9vcAotIwkkKFNIRUxMKSAkKHNyY2NvbSkvZ2VubWxvb3Auc2ggXAotIwkJLW1vbm8gLXNjYWNoZSAtZmFzdCBpOTYwYmFzZSAkKHNyY2RpcikvbWxvb3AuaW4gXAotIwkJfCBzZWQgLWUgJ3MvQGNwdUAvaTk2MGJhc2UvJyAtZSAncy9AQ1BVQC9JOTYwQkFTRS8nID5tbG9vcC5jCi1tbG9vcC5vOiBtbG9vcC5jIHNlbS1zd2l0Y2guYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKLQotY3B1Lm86IGNwdS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQotZGVjb2RlLm86IGRlY29kZS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQotc2VtLm86IHNlbS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQotbW9kZWwubzogbW9kZWwuYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKLQotaTk2MC1jbGVhbjoKLQlybSAtZiBtbG9vcC5jIGVuZy5oIHN0YW1wLW1sb29wCi0Jcm0gLWYgdG1wLSoKLQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvUkVBRE1FIGIvc2ltL2k5NjAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4YTQwLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLVRoaXMgaXMgdGhlIGk5NjAgc2ltdWxhdG9yIGRpcmVjdG9yeS4KLQotSXQgaXMgc3RpbGwgYSB3b3JrIGluIHByb2dyZXNzLiAgVGhlIGN1cnJlbnQgc291cmNlcyBhcmUgcmVhc29uYWJseQotd2VsbCB0ZXN0ZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgYXJlIGluLiAgSG93ZXZlciwgdGhlcmUncyBsb3RzCi1tb3JlIHlldCB0byBjb21lLgotCi0tLS0KLQotVGhlIHNpbXVsYXRvciBvbmx5IHN1cHBvcnRzIHRoZSBpOTYwS0EgY3VycmVudGx5LiAgTm90IGFsbCBpbnN0cnVjdGlvbnMKLWFyZSBzdXBwb3J0ZWQgeWV0LCBvbmx5IHRob3NlIGluc3RydWN0aW9ucyBuZWVkZWQgYnkgdGhlIGdjYy9nKysgdGVzdHN1aXRlcwotaGF2ZSBiZWVuIGFkZGVkIHNvIGZhci4gIFRoZXJlIGlzIG5vIHByb2ZpbGluZyBzdXBwb3J0IGFzIHlldC4gIFRoZXJlIGlzCi1ubyBwaXBlbGluZSBvciB0aW1pbmcgc3VwcG9ydCBhcyB5ZXQuCi0KLS0tLQotCi1UaGVyZSBhcmUgbG90cyBvZiBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKLVRoZXkgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jZ2VuLW1haW50LAotc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSB1bmRlciBhdXRvbWFrZS9hdXRvY29uZi4KLQotRm9yIGRldGFpbHMgb24gdGhlIGdlbmVyYXRvciwgc2VlIC4uLy4uL2NnZW4uCi0KLWRldm8vY2dlbiBpc24ndCBwYXJ0IG9mIHRoZSBjb21wLXRvb2xzIG1vZHVsZSB5ZXQuCi1Zb3UnbGwgbmVlZCB0byBjaGVjayBpdCBvdXQgbWFudWFsbHkgKGFsc28gYWtpbiB0byBhdXRvbWFrZS9hdXRvY29uZikuCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9UT0RPIGIvc2ltL2k5NjAvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxNTZiMS4uMDAwMDAwMAotLS0gYS9zaW0vaTk2MC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotU2VlID8/PyBjb21tZW50cyBoZXJlIGFuZCBpbiBjZ2VuLCBhbmQgaW4gbGliZ2xvc3MvaTk2MC4KLQotU2ltdWxhdG9yOgotCi1VcGRhdGUgc2ltL2k5NjAgZGlyZWN0b3J5IGZyb20gc2ltL20zMnIgZGlyZWN0b3J5LiAgc2ltL2k5NjAgZGlyIHdhcyBjcmVhdGVkCi1ieSBjb3B5aW5nIHRoZSBzaW0vbTMyciBpbiBTZXB0ZW1iZXIgMTk5OCwgYW5kIGlzIG1pc3NpbmcgYWxsIHNpbS9tMzJyIHVwZGF0ZXMKLXNpbmNlIHRoZW4uCi0KLVJldmlldywgY2xlYW4gdXAsIGZpbmlzaCwgZXRjIHNpbXVsYXRvciBmaWxlcyB0aGF0IGFyZSBub3QgY2dlbiBnZW5lcmF0ZWQuCi1UaGlzIGluY2x1ZGVzIGRldmljZXMuYywgaTk2MC1zaW0uaCwgbWxvb3AuaW4sIHNpbS1pZi5jLCBzaW0tbWFpbi5oLAotdGNvbmZpZy5pbiwgYW5kIHRyYXBzLmMuCi0KLVNvbWUgZnVuY3Rpb25zIGRvIG5vdCBzaG93IHVwIGluIHRyYWNlIG91dHB1dC4gIFRoaXMgb2NjYXNpb25hbGx5IGhhcHBlbnMKLWZvciBtYWluLgotCi1HZGIgY29yZSBkdW1wcyBpZiBjb21waWxlIHdpdGhvdXQgLW1rYS4gIEFwcGFyZW50bHkgYSBwcm9ibGVtIHdpdGggcmVjb2duaXppbmcKLSJjb3JlIiBtYWNoaW5lIHR5cGUuCi0KLUdldCBwcm9maWxpbmcgd29ya2luZy4KLQotQWRkIHBpcGVsaW5pbmcsIGV4ZWN1dGlvbiB1bml0LCB0aW1pbmcsIGV0YyBpbmZvLgotCi1BZGQgc3VwcG9ydCBmb3Igb3RoZXIgbW9kZWxzLCBiZXNpZGVzIEtBLgotCi1BZGQgc3VwcG9ydCBmb3IgbmV3ZXIgYXJjaGl0ZWN0dXJlcywgZS5nLiB2MS4xIGluc3RydWN0aW9ucy4KLQotQ29tcGlsZXI6Ci0KLVJ1bm5pbmcgZ2NjIGdpdmVzIG5tIHdhcm5pbmcgZnJvbSBjb2xsZWN0IGFib3V0IG1pc3NpbmcgYS5vdXQgZmlsZS4KLVRoZSBvdXRwdXQgZmlsZSBpcyBiLm91dCwgbm90IGEub3V0LiAgQ29sbGVjdCBpcyBwcm9iYWJseSBsb29raW5nIGZvcgotdGhlIHdyb25nIGZpbGUgbmFtZS4KLQotVXNlIG9mIC1tY2EgZ2l2ZXMgbG90cyBvZiBsaW5rZXIgd2FybmluZ3MgZm9yIGthL2NhIGFyY2hpdGVjdHVyZSBjb25mbGljdHMsCi1idXQgdGhlIHR3byBhcmNoaXRlY3R1cmVzIGFyZSBjb21wYXRpYmxlLgotCi1OZWVkIDk2IGJpdCBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGZwLWJpdC5jLCBvdGhlcndpc2UgYW55IHRlc3RjYXNlIHVzaW5nCi1sb25nIGRvdWJsZSBhcml0aG1ldGljIGhpdHMgYW4gYWJvcnQgYW5kIHJ1bnRpbWUuCi0KLUNvbXBpbGVyIHRha2VzIGZhciB0b28gbXVjaCB0aW1lIHRvIGNvbXBpbGUgUGx1bUhhbGwgdGVzdGNhc2VzIGF0IGhpZ2gKLW9wdGltaXphdGlvbiBsZXZlbHMuCi0KLXIyIHNlZW1zIHRvIGJlIGFuIGF2YWlsYWJsZSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMsIHNpbmNlIGl0IGlzbid0IHVzZWQKLXVudGlsIGEgY2FsbCBvY2N1cnMsIGFuZCBpcyBkZWFkIHdoZW4gdGhlIGNhbGwgcmV0dXJucy4KLQotQlNQOgotCi1MaWJnbG9zcyBkb2VzIG5vdCBjaGVjayBmb3Igc3lzY2FsbCBlcnJvciByZXR1cm5zLCB3aGljaCBtZWFucyBlcnJubyBuZXZlcgotZ2V0cyBzZXQuCi0KLUxpYmdsb3NzIGRvZXMgbm90IHVzZSB0aGUgc3lzY2FsbC5oIGZpbGUuCi0KLUJpbnV0aWxzOgotCi1PYmpkdW1wIC1kIGZhaWxzIG9uIDY0LWJpdCBob3N0LCBzcGVjaWZpY2FsbHkgaXJpeDYuCi0KLUdkYjoKLQotR2RiIHNvbWV0aW1lcyBwcmludHMgbWVzc2FnZXMgYWJvdXQgdHJhY2UvYnJlYWtwb2ludCB0cmFwIHdoZW4gaGl0dGluZyBhCi1icmVha3BvaW50LgotCi1GcmFtZSwgdXAsIGRvd24gYW5kIHJlbGF0ZWQgY29tbWFuZHMgZG9uJ3Qgd29yay4KLQotR2RiIGZhaWxzIHdoZW4gbmV4dCdpbmcgb3ZlciBhIGxlYWYgZnVuY3Rpb24gY29tcGlsZWQgd2l0aCAtbWxlYWYtcHJvY2VkdXJlLgotR2RiIGZhaWxzIHdoZW4gc3RlcCdpbmcgb3ZlciBhIHJldHVybiBmcm9tIHN1Y2ggYSBsZWFmIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvYWNjb25maWcuaCBiL3NpbS9pOTYwL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg3YTEuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvYXJjaC5jIGIvc2ltL2k5NjAvYXJjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgzM2IwLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2FyY2guYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFNpbXVsYXRvciBzdXBwb3J0IGZvciBpOTYwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotY29uc3QgTUFDSCAqc2ltX21hY2hzW10gPQotewotI2lmZGVmIEhBVkVfQ1BVX0k5NjBCQVNFCi0gICYgaTk2MF9rYV9zYV9tYWNoLAotI2VuZGlmCi0jaWZkZWYgSEFWRV9DUFVfSTk2MEJBU0UKLSAgJiBpOTYwX2NhX21hY2gsCi0jZW5kaWYKLSAgMAotfTsKLQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvYXJjaC5oIGIvc2ltL2k5NjAvYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZiZjM1Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2FyY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIFNpbXVsYXRvciBoZWFkZXIgZm9yIGk5NjAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgSTk2MF9BUkNIX0gKLSNkZWZpbmUgSTk2MF9BUkNIX0gKLQotI2RlZmluZSBUQVJHRVRfQklHX0VORElBTiAxCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1vZGVsIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBtb2RlbF90eXBlIHsKLSAgTU9ERUxfSTk2MEtBLCBNT0RFTF9JOTYwQ0EsIE1PREVMX01BWAotfSBNT0RFTF9UWVBFOwotCi0jZGVmaW5lIE1BWF9NT0RFTFMgKChpbnQpIE1PREVMX01BWCkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgdW5pdCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gdW5pdF90eXBlIHsKLSAgVU5JVF9OT05FLCBVTklUX0k5NjBLQV9VX0VYRUMsIFVOSVRfSTk2MENBX1VfRVhFQywgVU5JVF9NQVgKLX0gVU5JVF9UWVBFOwotCi0jZGVmaW5lIE1BWF9VTklUUyAoMSkKLQotI2VuZGlmIC8qIEk5NjBfQVJDSF9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jb25maWcuaW4gYi9zaW0vaTk2MC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjNiODYuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLwotI3VuZGVmIFdPUkRTX0JJR0VORElBTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jb25maWd1cmUgYi9zaW0vaTk2MC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YzE0NGYuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDI5NCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNnZW4tbWFpbnRbPURJUl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXMiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjczMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzczOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MDA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyMTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4OTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMDA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAwNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDQwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5MTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjA2OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjIyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjM5OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzE4OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Mzk6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTc6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODAxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTkyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk1NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NjE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4OTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDMyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi0KLQotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTM1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNzU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyOTQ6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzI3OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNDc6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2NjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzc2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5MzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MjE6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ1NjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0OTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MzA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU4NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2OTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc2MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg1MzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg4MTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODkxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCi0jIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgotIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KLWZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NjA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTcwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAwMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNDA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBkbGZjbi5oIGVycm5vLmggc3lzL3N0YXQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDkwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE0NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE3NDogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQotYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZCgpOwotCi1pbnQgbWFpbigpIHsKLWJpbmQoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxOTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbHNvY2tldCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjIxOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sbnNsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBnZXRob3N0YnluYW1lKCk7Ci0KLWludCBtYWluKCkgewotZ2V0aG9zdGJ5bmFtZSgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sbnNsICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0uICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotCi0KLVVTRV9NQUlOVEFJTkVSX01PREU9bm8KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7Ci0gIG5vKQlNQUlOVD0iIyIgOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCi1maQotZWxzZQotICBNQUlOVD0iIyIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKLSAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2Jzd2FwPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKLSAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKLSAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKLSAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCi1maQotZWxzZQotICBzaW1fY2ZsYWdzPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKLSAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OwotICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCi1maQotZWxzZQotICBzaW1fZGVidWc9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKLSAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCi1maQotZWxzZQotICBzaW1fc3RkaW89IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKLSAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7Ci0gIFstMC05XSopCi0Jc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKLSAgW2Etel0qKQotCXNpbV90cmFjZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgotCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3RyYWNlPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKLSAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7Ci0gIFstMC05XSopCi0Jc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKLSAgW2Etel0qKQotCXNpbV9wcm9maWxlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCi1maQotZWxzZQotICBzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiCi1maQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDE2OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgc2lnbmFsCi0jdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOwotI2Vsc2UKLXZvaWQgKCpzaWduYWwgKCkpICgpOwotI2VuZGlmCi0KLWludCBtYWluKCkgewotaW50IGk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQzODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9aW50Ci1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotRU9GCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDYwOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1zaW1fbGlua19maWxlcz0KLXNpbV9saW5rX2xpbmtzPQotCi1zaW1fbGlua19saW5rcz10Y29uZmlnLmgKLWlmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KLXRoZW4KLSAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgotZWxzZQotICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgotZmkKLQotIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgotY2FzZSAiJHt0YXJnZXR9IiBpbgotKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Ci1lc2FjCi1zaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKLXNpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgotCi0KLQotCi13aXJlX2VuZGlhbj0iTElUVExFX0VORElBTiIKLWRlZmF1bHRfZW5kaWFuPSIiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW5kaWFuIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKLSAgeWVzKQkgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgZWxzZQotICAgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JICAgZWxzZQotCSAgICAgZWNobyAiTm8gaGFyZC13aXJlZCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCIKLQkgICBmaQotCSBmaTs7Ci0gIG5vKQkgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgotCSBlbHNlCi0JICAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0JICAgZWxzZQotCSAgICAgZWNobyAiTm8gZGVmYXVsdCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2VuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLSAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi1lbHNlCi0gIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLSAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0gIGVsc2UKLSAgICBzaW1fZW5kaWFuPQotICBmaQotZmkKLWZpCi0KLXdpcmVfYWxpZ25tZW50PSJOT05TVFJJQ1RfQUxJR05NRU5UIgotZGVmYXVsdF9hbGlnbm1lbnQ9IiIKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OwotICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OwotICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OwotICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLQkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgICBlbHNlCi0JICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi0gICAgICAgZWxzZQotICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2Ci0gICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgotICAgICAgICAgZmkKLSAgICAgICBmaTs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYWxpZ25tZW50PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgotICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCi1lbHNlCi0gIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICBlbHNlCi0gICAgc2ltX2FsaWdubWVudD0KLSAgZmkKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWhvc3RlbmRpYW4gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2hvc3RlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0ZW5kaWFuIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OwotICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2hvc3RlbmRpYW49IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCi1maQotZWxzZQotICAKLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjE6IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgotIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotaW50IG1haW4oKSB7Ci0KLSNpZiAhQllURV9PUkRFUiB8fCAhQklHX0VORElBTiB8fCAhTElUVExFX0VORElBTgotIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2Mzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjU0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotbWFpbiAoKSB7Ci0gIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGxvbmcgbDsKLSAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07Ci0gIH0gdTsKLSAgdS5sID0gMTsKLSAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKLUVPRgotCi1maQotCi0gIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKLSAgZWxzZQotICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCi0gIGZpCi1lbHNlCi0gIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCi1maQotZmkKLQotCi1kZWZhdWx0X3NpbV9zY2FjaGU9IjEwMjQiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXNjYWNoZSBvciAtLWRpc2FibGUtc2ltLXNjYWNoZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc2NhY2hlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc2NhY2hlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iOzsKLSAgbm8pCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9MCIgOzsKLSAgWzAtOV0qKSBzaW1fY2FjaGU9JHtlbmFibGV2YWx9OzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiQmFkIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zY2FjaGUiIiAxPiYyOyBleGl0IDE7IH07Ci0Jc2ltX3NjYWNoZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NjYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2NhY2hlIHNpemUgPSAkc2ltX3NjYWNoZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iCi1maQotCi0KLQotZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbD0iaTk2MEtBIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIG9yIC0tZGlzYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVmYXVsdF9tb2RlbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJNaXNzaW5nIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIiIgMT4mMjsgZXhpdCAxOyB9OzsKLSAgKikJc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZW5hYmxldmFsfVwiJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWZhdWx0X21vZGVsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBkZWZhdWx0IG1vZGVsID0gJHNpbV9kZWZhdWx0X21vZGVsIiA2PiYxCi1maQotZWxzZQotICBzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsfVwiJyIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVudmlyb25tZW50IG9yIC0tZGlzYWJsZS1zaW0tZW52aXJvbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Vudmlyb25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW52aXJvbm1lbnQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYWxsIHwgQUxMKSAgICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiOzsKLSAgdXNlciB8IFVTRVIpICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1VU0VSX0VOVklST05NRU5UIjs7Ci0gIHZpcnR1YWwgfCBWSVJUVUFMKSAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VklSVFVBTF9FTlZJUk9OTUVOVCI7OwotICBvcGVyYXRpbmcgfCBPUEVSQVRJTkcpIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPU9QRVJBVElOR19FTlZJUk9OTUVOVCI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWVudmlyb25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OwotICAgICAgIHNpbV9lbnZpcm9ubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Vudmlyb25tZW50IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gZW52aXJvbm1lbnQgPSAkc2ltX2Vudmlyb25tZW50IiA2PiYxCi1maQotZWxzZQotICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiCi1maQotCi0KLWNnZW5fbWFpbnQ9bm8KLWNnZW49Z3VpbGUKLWNnZW5kaXI9JyQoc3JjZGlyKS8uLi8uLi9jZ2VuJwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNnZW4tbWFpbnQgb3IgLS1kaXNhYmxlLWNnZW4tbWFpbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY2dlbl9tYWludCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY2dlbl9tYWludCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCWNnZW5fbWFpbnQ9eWVzIDs7Ci0gIG5vKQljZ2VuX21haW50PW5vIDs7Ci0gICopCi0JIyBhcmd1bWVudCBpcyBjZ2VuIGluc3RhbGwgZGlyZWN0b3J5IChub3QgaW1wbGVtZW50ZWQgeWV0KS4KLQkjIEhhdmluZyBhIGBzaGFyZScgZGlyZWN0b3J5IG1pZ2h0IGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAuc2NtLAotCSMgLmNwdSwgZXRjLiBmaWxlcy4KLQljZ2VuZGlyPSR7Y2dlbl9tYWludH0vbGliL2NnZW4KLQljZ2VuPWd1aWxlCi0JOzsKLWVzYWMKLWZpCi1pZiB0ZXN0IHgke2NnZW5fbWFpbnR9ICE9IHhubyA7IHRoZW4KLSAgQ0dFTl9NQUlOVD0nJwotZWxzZQotICBDR0VOX01BSU5UPScjJwotZmkKLQotCi0KLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKLXMlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKLXMlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCi1zJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZwotcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKLXMlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENHRU5fTUFJTlRAJSRDR0VOX01BSU5UJWcKLXMlQGNnZW5kaXJAJSRjZ2VuZGlyJWcKLXMlQGNnZW5AJSRjZ2VuJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1hY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCi1hY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXNyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCi13aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCi0gIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgotICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKLQotICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKLQotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgJGFjX2Rlc3QKLQotICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRzcmNkaXIiIGluCi0gIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICBlc2FjCi0KLSAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKLSAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWRvbmUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotY2FzZSAieCRDT05GSUdfRklMRVMiIGluCi0geE1ha2VmaWxlKikKLSAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKLSAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKLSAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKLQktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCi0JPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKLSAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAotICAgOzsKLSBlc2FjCi0gY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQotCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jb25maWd1cmUuaW4gYi9zaW0vaTk2MC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTU4NzUuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLVNJTV9BQ19PUFRJT05fRU5ESUFOKExJVFRMRV9FTkRJQU4pCi1TSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQotU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCi1TSU1fQUNfT1BUSU9OX1NDQUNIRSgxMDI0KQotU0lNX0FDX09QVElPTl9ERUZBVUxUX01PREVMKGk5NjBLQSkKLVNJTV9BQ19PUFRJT05fRU5WSVJPTk1FTlQKLVNJTV9BQ19PUFRJT05fQ0dFTl9NQUlOVAotCi1TSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jcHUuYyBiL3NpbS9pOTYwL2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFiNjQzLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogTWlzYy4gc3VwcG9ydCBmb3IgQ1BVIGZhbWlseSBpOTYwYmFzZS4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBpOTYwYmFzZQotI2RlZmluZSBXQU5UX0NQVV9JOTYwQkFTRQotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJjZ2VuLW9wcy5oIgotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtcGMuICAqLwotCi1VU0kKLWk5NjBiYXNlX2hfcGNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9wYyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLXBjLiAgKi8KLQotdm9pZAotaTk2MGJhc2VfaF9wY19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVU0kgbmV3dmFsKQotewotICBDUFUgKGhfcGMpID0gbmV3dmFsOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtZ3IuICAqLwotCi1TSQotaTk2MGJhc2VfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICByZXR1cm4gQ1BVIChoX2dyW3JlZ25vXSk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWdyLiAgKi8KLQotdm9pZAotaTk2MGJhc2VfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9ncltyZWdub10pID0gbmV3dmFsOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2MuICAqLwotCi1TSQotaTk2MGJhc2VfaF9jY19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX2NjKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtY2MuICAqLwotCi12b2lkCi1pOTYwYmFzZV9oX2NjX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2NjKSA9IG5ld3ZhbDsKLX0KLQotLyogUmVjb3JkIHRyYWNlIHJlc3VsdHMgZm9yIElOU04uICAqLwotCi12b2lkCi1pOTYwYmFzZV9yZWNvcmRfdHJhY2VfcmVzdWx0cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIENHRU5fSU5TTiAqaW5zbiwKLQkJCSAgICBpbnQgKmluZGljZXMsIFRSQUNFX1JFQ09SRCAqdHIpCi17Ci19CmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jcHUuaCBiL3NpbS9pOTYwL2NwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIyYjY5Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2NwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIENQVSBmYW1pbHkgaGVhZGVyIGZvciBpOTYwYmFzZS4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBDUFVfSTk2MEJBU0VfSAotI2RlZmluZSBDUFVfSTk2MEJBU0VfSAotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgZmV0Y2hlZCBhdCBhIHRpbWUuCi0gICBUaGlzIGlzIGZvciBMSVcgdHlwZSBpbnN0cnVjdGlvbnMgc2V0cyAoZS5nLiBtMzJyKS4gICovCi0jZGVmaW5lIE1BWF9MSVdfSU5TTlMgMQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICAqLwotI2RlZmluZSBNQVhfUEFSQUxMRUxfSU5TTlMgMQotCi0vKiBDUFUgc3RhdGUgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBIYXJkd2FyZSBlbGVtZW50cy4gICovCi0gIHN0cnVjdCB7Ci0gIC8qIHByb2dyYW0gY291bnRlciAqLwotICBVU0kgaF9wYzsKLSNkZWZpbmUgR0VUX0hfUEMoKSBDUFUgKGhfcGMpCi0jZGVmaW5lIFNFVF9IX1BDKHgpIChDUFUgKGhfcGMpID0gKHgpKQotICAvKiBnZW5lcmFsIHJlZ2lzdGVycyAqLwotICBTSSBoX2dyWzMyXTsKLSNkZWZpbmUgR0VUX0hfR1IoYTEpIENQVSAoaF9ncilbYTFdCi0jZGVmaW5lIFNFVF9IX0dSKGExLCB4KSAoQ1BVIChoX2dyKVthMV0gPSAoeCkpCi0gIC8qIGNvbmRpdGlvbiBjb2RlICovCi0gIFNJIGhfY2M7Ci0jZGVmaW5lIEdFVF9IX0NDKCkgQ1BVIChoX2NjKQotI2RlZmluZSBTRVRfSF9DQyh4KSAoQ1BVIChoX2NjKSA9ICh4KSkKLSAgfSBoYXJkd2FyZTsKLSNkZWZpbmUgQ1BVX0NHRU5fSFcoY3B1KSAoJiAoY3B1KS0+Y3B1X2RhdGEuaGFyZHdhcmUpCi19IEk5NjBCQVNFX0NQVV9EQVRBOwotCi0vKiBDb3ZlciBmbnMgZm9yIHJlZ2lzdGVyIGFjY2Vzcy4gICovCi1VU0kgaTk2MGJhc2VfaF9wY19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGk5NjBiYXNlX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7Ci1TSSBpOTYwYmFzZV9oX2dyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKLXZvaWQgaTk2MGJhc2VfaF9ncl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOwotU0kgaTk2MGJhc2VfaF9jY19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIGk5NjBiYXNlX2hfY2Nfc2V0IChTSU1fQ1BVICosIFNJKTsKLQotLyogVGhlc2UgbXVzdCBiZSBoYW5kLXdyaXR0ZW4uICAqLwotZXh0ZXJuIENQVVJFR19GRVRDSF9GTiBpOTYwYmFzZV9mZXRjaF9yZWdpc3RlcjsKLWV4dGVybiBDUFVSRUdfU1RPUkVfRk4gaTk2MGJhc2Vfc3RvcmVfcmVnaXN0ZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGVtcHR5OwotfSBNT0RFTF9JOTYwS0FfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgZW1wdHk7Ci19IE1PREVMX0k5NjBDQV9EQVRBOwotCi0vKiBJbnN0cnVjdGlvbiBhcmd1bWVudCBidWZmZXIuICAqLwotCi11bmlvbiBzZW1fZmllbGRzIHsKLSAgc3RydWN0IHsgLyogbm8gb3BlcmFuZHMgKi8KLSAgICBpbnQgZW1wdHk7Ci0gIH0gZm10X2VtcHR5OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBJQUREUiBpX2N0cmxfZGlzcDsKLSAgfSBzZm10X2JubzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfYnJfc3JjMTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9icl9zcmMxOwotICB9IHNmbXRfdGVzdG5vX3JlZzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgSUFERFIgaV9icl9kaXNwOwotICAgIFNJKiBpX2JyX3NyYzI7Ci0gICAgVUlOVCBmX2JyX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9icl9zcmMyOwotICB9IHNmbXRfY21wb2JlX2xpdDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgSUFERFIgaV9icl9kaXNwOwotICAgIFNJKiBpX2JyX3NyYzE7Ci0gICAgU0kqIGlfYnJfc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2JyX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9icl9zcmMyOwotICB9IHNmbXRfY21wb2JlX3JlZzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHN0OwotICAgIFVJTlQgZl9zcmMxOwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xOwotICB9IHNmbXRfZW11bDM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RzdDsKLSAgICBTSSogaV9zcmMxOwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMTsKLSAgfSBzZm10X2VtdWwyOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kc3Q7Ci0gICAgU0kqIGlfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzE7Ci0gIH0gc2ZtdF9lbXVsMTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHN0OwotICAgIFNJKiBpX3NyYzE7Ci0gICAgU0kqIGlfc3JjMjsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xOwotICB9IHNmbXRfZW11bDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfYWJhc2U7Ci0gICAgU0kqIGlfc3Rfc3JjOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOwotICB9IHNmbXRfc3RxX2luZGlyZWN0X29mZnNldDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfYWJhc2U7Ci0gICAgU0kqIGlfZHN0OwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMzsKLSAgfSBzZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQ7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2FiYXNlOwotICAgIFNJKiBpX2luZGV4OwotICAgIFNJKiBpX3N0X3NyYzsKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7Ci0gIH0gc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfYWJhc2U7Ci0gICAgU0kqIGlfZHN0OwotICAgIFNJKiBpX2luZGV4OwotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzE7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzM7Ci0gIH0gc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHN0OwotICAgIFNJKiBpX3NyYzE7Ci0gICAgVUlOVCBmX3NyYzE7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3NyYzFfMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3NyYzFfMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3NyYzFfMzsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8zOwotICB9IHNmbXRfbW92cTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzA7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEwOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTI7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzI7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzM7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzMxOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl80OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl81OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl82OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl83OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl84OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl85OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzExOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8yOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMzsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzMxOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzU7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl82OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNzsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzg7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl85OwotICB9IHNmbXRfY2FsbHhfZGlzcDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfYWJhc2U7Ci0gICAgVUlOVCBmX29mZnNldDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8wOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEyOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8yOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8zOwotICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8zMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNDsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNzsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfODsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfOTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzA7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTA7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTM7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzM7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8zMTsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzQ7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl81OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzc7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl84OwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfOTsKLSAgfSBzZm10X2NhbGx4X2luZGlyZWN0X29mZnNldDsKLSNpZiBXSVRIX1NDQUNIRV9QQkIKLSAgLyogV3JpdGViYWNrIGhhbmRsZXIuICAqLwotICBzdHJ1Y3QgewotICAgIC8qIFBvaW50ZXIgdG8gYXJnYnVmIGVudHJ5IGZvciBpbnNuIHdob3NlIHJlc3VsdHMgbmVlZCB3cml0aW5nIGJhY2suICAqLwotICAgIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWY7Ci0gIH0gd3JpdGU7Ci0gIC8qIHgtYmVmb3JlIGhhbmRsZXIgKi8KLSAgc3RydWN0IHsKLSAgICAvKmNvbnN0IFNDQUNIRSAqaW5zbnNbTUFYX1BBUkFMTEVMX0lOU05TXTsqLwotICAgIGludCBmaXJzdF9wOwotICB9IGJlZm9yZTsKLSAgLyogeC1hZnRlciBoYW5kbGVyICovCi0gIHN0cnVjdCB7Ci0gICAgaW50IGVtcHR5OwotICB9IGFmdGVyOwotICAvKiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdGVybWluYXRlIGVhY2ggcGJiLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBOdW1iZXIgb2YgaW5zbnMgaW4gcGJiLiAgKi8KLSAgICBpbnQgaW5zbl9jb3VudDsKLSAgICAvKiBOZXh0IHBiYiB0byBleGVjdXRlLiAgKi8KLSAgICBTQ0FDSEUgKm5leHQ7Ci0gICAgU0NBQ0hFICpicmFuY2hfdGFyZ2V0OwotICB9IGNoYWluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCi1zdHJ1Y3QgYXJnYnVmIHsKLSAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLwotICBJQUREUiBhZGRyOwotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGNoYXIgdHJhY2VfcDsKLSAgY2hhciBwcm9maWxlX3A7Ci0gIC8qID8/PyBUZW1wb3JhcnkgaGFjayBmb3Igc2tpcCBpbnNucy4gICovCi0gIGNoYXIgc2tpcF9jb3VudDsKLSAgY2hhciB1bnVzZWQ7Ci0gIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KLSAgdW5pb24gc2VtIHNlbWFudGljOwotICBpbnQgd3JpdHRlbjsKLSAgdW5pb24gc2VtX2ZpZWxkcyBmaWVsZHM7Ci19OwotCi0vKiBBIGNhY2hlZCBpbnNuLgotCi0gICA/Pz8gU0NBQ0hFIHVzZWQgdG8gY29udGFpbiBtb3JlIHRoYW4ganVzdCBhcmdidWYuICBXZSBjb3VsZCBkZWxldGUgdGhlCi0gICB0eXBlIGVudGlyZWx5IGFuZCBhbHdheXMganVzdCB1c2UgQVJHQlVGLCBidXQgZm9yIGZ1dHVyZSBjb25jZXJucyBhbmQgYXMKLSAgIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXQgaXMgbGVmdCBpbi4gICovCi0KLXN0cnVjdCBzY2FjaGUgewotICBzdHJ1Y3QgYXJnYnVmIGFyZ2J1ZjsKLX07Ci0KLS8qIE1hY3JvcyB0byBzaW1wbGlmeSBleHRyYWN0aW9uLCByZWFkaW5nIGFuZCBzZW1hbnRpYyBjb2RlLgotICAgVGhlc2UgZGVmaW5lIGFuZCBhc3NpZ24gdGhlIGxvY2FsIHZhcnMgdGhhdCBjb250YWluIHRoZSBpbnNuJ3MgZmllbGRzLiAgKi8KLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfVkFSUyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTVBUWV9DT0RFIFwKLSAgbGVuZ3RoID0gMDsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPX1ZBUlMgXAotICBVSU5UIGZfb3Bjb2RlOyBcCi0gIFVJTlQgZl9zcmNkc3Q7IFwKLSAgVUlOVCBmX3NyYzI7IFwKLSAgVUlOVCBmX20zOyBcCi0gIFVJTlQgZl9tMjsgXAotICBVSU5UIGZfbTE7IFwKLSAgVUlOVCBmX29wY29kZTI7IFwKLSAgVUlOVCBmX3plcm87IFwKLSAgVUlOVCBmX3NyYzE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE9fQ09ERSBcCi0gIGxlbmd0aCA9IDQ7IFwKLSAgZl9vcGNvZGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCi0gIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAotICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX20zID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKLSAgZl9tMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTksIDEpOyBcCi0gIGZfbTEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxKTsgXAotICBmX29wY29kZTIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIxLCA0KTsgXAotICBmX3plcm8gPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAotICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPMV9WQVJTIFwKLSAgVUlOVCBmX29wY29kZTsgXAotICBVSU5UIGZfc3JjZHN0OyBcCi0gIFVJTlQgZl9zcmMyOyBcCi0gIFVJTlQgZl9tMzsgXAotICBVSU5UIGZfbTI7IFwKLSAgVUlOVCBmX20xOyBcCi0gIFVJTlQgZl9vcGNvZGUyOyBcCi0gIFVJTlQgZl96ZXJvOyBcCi0gIFVJTlQgZl9zcmMxOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPMV9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCi0gIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCi0gIGZfbTMgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE4LCAxKTsgXAotICBmX20yID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOSwgMSk7IFwKLSAgZl9tMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEpOyBcCi0gIGZfb3Bjb2RlMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjEsIDQpOyBcCi0gIGZfemVybyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjUsIDIpOyBcCi0gIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE8yX1ZBUlMgXAotICBVSU5UIGZfb3Bjb2RlOyBcCi0gIFVJTlQgZl9zcmNkc3Q7IFwKLSAgVUlOVCBmX3NyYzI7IFwKLSAgVUlOVCBmX20zOyBcCi0gIFVJTlQgZl9tMjsgXAotICBVSU5UIGZfbTE7IFwKLSAgVUlOVCBmX29wY29kZTI7IFwKLSAgVUlOVCBmX3plcm87IFwKLSAgVUlOVCBmX3NyYzE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE8yX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3Bjb2RlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA4KTsgXAotICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKLSAgZl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7IFwKLSAgZl9tMyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTgsIDEpOyBcCi0gIGZfbTIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE5LCAxKTsgXAotICBmX20xID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMSk7IFwKLSAgZl9vcGNvZGUyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMSwgNCk7IFwKLSAgZl96ZXJvID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNSwgMik7IFwKLSAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVVMTzNfVkFSUyBcCi0gIFVJTlQgZl9vcGNvZGU7IFwKLSAgVUlOVCBmX3NyY2RzdDsgXAotICBVSU5UIGZfc3JjMjsgXAotICBVSU5UIGZfbTM7IFwKLSAgVUlOVCBmX20yOyBcCi0gIFVJTlQgZl9tMTsgXAotICBVSU5UIGZfb3Bjb2RlMjsgXAotICBVSU5UIGZfemVybzsgXAotICBVSU5UIGZfc3JjMTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVVMTzNfQ09ERSBcCi0gIGxlbmd0aCA9IDQ7IFwKLSAgZl9vcGNvZGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCi0gIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAotICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX20zID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKLSAgZl9tMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTksIDEpOyBcCi0gIGZfbTEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxKTsgXAotICBmX29wY29kZTIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIxLCA0KTsgXAotICBmX3plcm8gPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAotICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgXAotICBVSU5UIGZfb3Bjb2RlOyBcCi0gIFVJTlQgZl9zcmNkc3Q7IFwKLSAgVUlOVCBmX2FiYXNlOyBcCi0gIFVJTlQgZl9tb2RlYTsgXAotICBVSU5UIGZfemVyb2E7IFwKLSAgVUlOVCBmX29mZnNldDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCi0gIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX21vZGVhID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKLSAgZl96ZXJvYSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTksIDEpOyBcCi0gIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIFwKLSAgVUlOVCBmX29wY29kZTsgXAotICBVSU5UIGZfc3JjZHN0OyBcCi0gIFVJTlQgZl9hYmFzZTsgXAotICBVSU5UIGZfbW9kZWI7IFwKLSAgVUlOVCBmX3NjYWxlOyBcCi0gIFVJTlQgZl96ZXJvYjsgXAotICBVSU5UIGZfaW5kZXg7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCi0gIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX21vZGViID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgNCk7IFwKLSAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOyBcCi0gIGZfemVyb2IgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAotICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyBcCi0gIFVJTlQgZl9vcGNvZGU7IFwKLSAgVUlOVCBmX29wdGRpc3A7IFwKLSAgVUlOVCBmX3NyY2RzdDsgXAotICBVSU5UIGZfYWJhc2U7IFwKLSAgVUlOVCBmX21vZGViOyBcCi0gIFVJTlQgZl9zY2FsZTsgXAotICBVSU5UIGZfemVyb2I7IFwKLSAgVUlOVCBmX2luZGV4OyBcCi0gIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovIFwKLSAgVUlOVCB3b3JkXzE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUgXAotICBsZW5ndGggPSA4OyBcCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOyBcCi0gIGZfb3Bjb2RlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA4KTsgXAotICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7IFwKLSAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCi0gIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX21vZGViID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgNCk7IFwKLSAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOyBcCi0gIGZfemVyb2IgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAotICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgXAotICBVSU5UIGZfb3Bjb2RlOyBcCi0gIFVJTlQgZl9zcmNkc3Q7IFwKLSAgVUlOVCBmX2FiYXNlOyBcCi0gIFVJTlQgZl9tb2RlYTsgXAotICBVSU5UIGZfemVyb2E7IFwKLSAgVUlOVCBmX29mZnNldDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3Bjb2RlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA4KTsgXAotICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKLSAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCi0gIGZfbW9kZWEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE4LCAxKTsgXAotICBmX3plcm9hID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOSwgMSk7IFwKLSAgZl9vZmZzZXQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxMik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyBcCi0gIFVJTlQgZl9vcGNvZGU7IFwKLSAgVUlOVCBmX3NyY2RzdDsgXAotICBVSU5UIGZfYWJhc2U7IFwKLSAgVUlOVCBmX21vZGViOyBcCi0gIFVJTlQgZl9zY2FsZTsgXAotICBVSU5UIGZfemVyb2I7IFwKLSAgVUlOVCBmX2luZGV4OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVF9JTkRJUkVDVF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCi0gIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX21vZGViID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgNCk7IFwKLSAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOyBcCi0gIGZfemVyb2IgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAotICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIFwKLSAgVUlOVCBmX29wY29kZTsgXAotICBVSU5UIGZfb3B0ZGlzcDsgXAotICBVSU5UIGZfc3JjZHN0OyBcCi0gIFVJTlQgZl9hYmFzZTsgXAotICBVSU5UIGZfbW9kZWI7IFwKLSAgVUlOVCBmX3NjYWxlOyBcCi0gIFVJTlQgZl96ZXJvYjsgXAotICBVSU5UIGZfaW5kZXg7IFwKLSAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8gXAotICBVSU5UIHdvcmRfMTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFIFwKLSAgbGVuZ3RoID0gODsgXAotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOyBcCi0gIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAotICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7IFwKLSAgZl9tb2RlYiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTgsIDQpOyBcCi0gIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsgXAotICBmX3plcm9iID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNSwgMik7IFwKLSAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NNUE9CRV9SRUdfVkFSUyBcCi0gIFVJTlQgZl9vcGNvZGU7IFwKLSAgVUlOVCBmX2JyX3NyYzE7IFwKLSAgVUlOVCBmX2JyX3NyYzI7IFwKLSAgVUlOVCBmX2JyX20xOyBcCi0gIFNJIGZfYnJfZGlzcDsgXAotICBVSU5UIGZfYnJfemVybzsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9icl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAotICBmX2JyX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX2JyX20xID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKLSAgZl9icl9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxOSwgMTEpKSA8PCAoMikpKSArIChwYykpOyBcCi0gIGZfYnJfemVybyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMzAsIDIpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NNUE9CRV9MSVRfVkFSUyBcCi0gIFVJTlQgZl9vcGNvZGU7IFwKLSAgVUlOVCBmX2JyX3NyYzE7IFwKLSAgVUlOVCBmX2JyX3NyYzI7IFwKLSAgVUlOVCBmX2JyX20xOyBcCi0gIFNJIGZfYnJfZGlzcDsgXAotICBVSU5UIGZfYnJfemVybzsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QT0JFX0xJVF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wY29kZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKLSAgZl9icl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAotICBmX2JyX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAotICBmX2JyX20xID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKLSAgZl9icl9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxOSwgMTEpKSA8PCAoMikpKSArIChwYykpOyBcCi0gIGZfYnJfemVybyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMzAsIDIpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JOT19WQVJTIFwKLSAgVUlOVCBmX29wY29kZTsgXAotICBTSSBmX2N0cmxfZGlzcDsgXAotICBVSU5UIGZfY3RybF96ZXJvOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CTk9fQ09ERSBcCi0gIGxlbmd0aCA9IDQ7IFwKLSAgZl9vcGNvZGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCi0gIGZfY3RybF9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCA4LCAyMikpIDw8ICgyKSkpICsgKHBjKSk7IFwKLSAgZl9jdHJsX3plcm8gPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDMwLCAyKTsgXAotCi0vKiBDb2xsZWN0aW9uIG9mIHZhcmlvdXMgdGhpbmdzIGZvciB0aGUgdHJhY2UgaGFuZGxlciB0byB1c2UuICAqLwotCi10eXBlZGVmIHN0cnVjdCB0cmFjZV9yZWNvcmQgewotICBJQUREUiBwYzsKLSAgLyogRklYTUU6d2lwICovCi19IFRSQUNFX1JFQ09SRDsKLQotI2VuZGlmIC8qIENQVV9JOTYwQkFTRV9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jcHVhbGwuaCBiL3NpbS9pOTYwL2NwdWFsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzJjZDlmLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2NwdWFsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogU2ltdWxhdG9yIENQVSBoZWFkZXIgZm9yIGk5NjAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgSTk2MF9DUFVBTExfSAotI2RlZmluZSBJOTYwX0NQVUFMTF9ICi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggY3B1IGZhbWlseS4gICovCi0KLSNpZmRlZiBXQU5UX0NQVV9JOTYwQkFTRQotI2luY2x1ZGUgImVuZy5oIgotI2luY2x1ZGUgImNnZW4tZW5naW5lLmgiCi0jaW5jbHVkZSAiY3B1LmgiCi0jaW5jbHVkZSAiZGVjb2RlLmgiCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IE1BQ0ggaTk2MF9rYV9zYV9tYWNoOwotZXh0ZXJuIGNvbnN0IE1BQ0ggaTk2MF9jYV9tYWNoOwotCi0jaWZuZGVmIFdBTlRfQ1BVCi0vKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCi1zdHJ1Y3QgYXJnYnVmIHsKLSAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLwotICBJQUREUiBhZGRyOwotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGNoYXIgdHJhY2VfcDsKLSAgY2hhciBwcm9maWxlX3A7Ci0gIC8qID8/PyBUZW1wb3JhcnkgaGFjayBmb3Igc2tpcCBpbnNucy4gICovCi0gIGNoYXIgc2tpcF9jb3VudDsKLSAgY2hhciB1bnVzZWQ7Ci0gIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KLX07Ci0jZW5kaWYKLQotI2lmbmRlZiBXQU5UX0NQVQotLyogQSBjYWNoZWQgaW5zbi4KLQotICAgPz8/IFNDQUNIRSB1c2VkIHRvIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgYXJnYnVmLiAgV2UgY291bGQgZGVsZXRlIHRoZQotICAgdHlwZSBlbnRpcmVseSBhbmQgYWx3YXlzIGp1c3QgdXNlIEFSR0JVRiwgYnV0IGZvciBmdXR1cmUgY29uY2VybnMgYW5kIGFzCi0gICBhIGxldmVsIG9mIGFic3RyYWN0aW9uIGl0IGlzIGxlZnQgaW4uICAqLwotCi1zdHJ1Y3Qgc2NhY2hlIHsKLSAgc3RydWN0IGFyZ2J1ZiBhcmdidWY7Ci19OwotI2VuZGlmCi0KLSNlbmRpZiAvKiBJOTYwX0NQVUFMTF9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9kZWNvZGUuYyBiL3NpbS9pOTYwL2RlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ5ZjkwLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2RlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU2OSArMCwwIEBACi0vKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gZGVjb2RlciBmb3IgaTk2MGJhc2UuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNkZWZpbmUgV0FOVF9DUFUgaTk2MGJhc2UKLSNkZWZpbmUgV0FOVF9DUFVfSTk2MEJBU0UKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBhcnJheS4KLSAgIFRoaXMgaXMgY29tcHV0ZWQgYXQgcnVudGltZS4gIFNwYWNlIGZvciBpdCBpcyBub3QgbWFsbG9jJ2QgdG8gc2F2ZSBhCi0gICB0ZWVuc3kgYml0IG9mIGNwdSBpbiB0aGUgZGVjb2Rlci4gIE1vdmluZyBpdCB0byBtYWxsb2Mgc3BhY2UgaXMgdHJpdmlhbAotICAgYnV0IHdvbid0IGJlIGRvbmUgdW50aWwgbmVjZXNzYXJ5ICh3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgcnVudGltZQotICAgYWRkaXRpb24gb2YgaW5zdHJ1Y3Rpb25zIG5vciBhbiBTTVAgbWFjaGluZSB3aXRoIGRpZmZlcmVudCBjcHVzKS4gICovCi1zdGF0aWMgSURFU0MgaTk2MGJhc2VfaW5zbl9kYXRhW0k5NjBCQVNFX0lOU05fTUFYXTsKLQotLyogQ29tbWFzIGJldHdlZW4gZWxlbWVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWFjcm9zLgotICAgU29tZSBvZiB0aGVzZSBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvdXQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIGk5NjBiYXNlX2luc25fc2VtW10gPQotewotICB7IFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsIEk5NjBCQVNFX0lOU05fWF9JTlZBTElELCBJOTYwQkFTRV9TRk1UX0VNUFRZIH0sCi0gIHsgVklSVFVBTF9JTlNOX1hfQUZURVIsIEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgSTk2MEJBU0VfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgSTk2MEJBU0VfSU5TTl9YX0JFRk9SRSwgSTk2MEJBU0VfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0NUSV9DSEFJTiwgSTk2MEJBU0VfSU5TTl9YX0NUSV9DSEFJTiwgSTk2MEJBU0VfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0NIQUlOLCBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sIEk5NjBCQVNFX1NGTVRfRU1QVFkgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9CRUdJTiwgSTk2MEJBU0VfSU5TTl9YX0JFR0lOLCBJOTYwQkFTRV9TRk1UX0VNUFRZIH0sCi0gIHsgSTk2MF9JTlNOX01VTE8sIEk5NjBCQVNFX0lOU05fTVVMTywgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX01VTE8xLCBJOTYwQkFTRV9JTlNOX01VTE8xLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX01VTE8yLCBJOTYwQkFTRV9JTlNOX01VTE8yLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX01VTE8zLCBJOTYwQkFTRV9JTlNOX01VTE8zLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX1JFTU8sIEk5NjBCQVNFX0lOU05fUkVNTywgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX1JFTU8xLCBJOTYwQkFTRV9JTlNOX1JFTU8xLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX1JFTU8yLCBJOTYwQkFTRV9JTlNOX1JFTU8yLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX1JFTU8zLCBJOTYwQkFTRV9JTlNOX1JFTU8zLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX0RJVk8sIEk5NjBCQVNFX0lOU05fRElWTywgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX0RJVk8xLCBJOTYwQkFTRV9JTlNOX0RJVk8xLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX0RJVk8yLCBJOTYwQkFTRV9JTlNOX0RJVk8yLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX0RJVk8zLCBJOTYwQkFTRV9JTlNOX0RJVk8zLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX1JFTUksIEk5NjBCQVNFX0lOU05fUkVNSSwgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX1JFTUkxLCBJOTYwQkFTRV9JTlNOX1JFTUkxLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX1JFTUkyLCBJOTYwQkFTRV9JTlNOX1JFTUkyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX1JFTUkzLCBJOTYwQkFTRV9JTlNOX1JFTUkzLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX0RJVkksIEk5NjBCQVNFX0lOU05fRElWSSwgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX0RJVkkxLCBJOTYwQkFTRV9JTlNOX0RJVkkxLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX0RJVkkyLCBJOTYwQkFTRV9JTlNOX0RJVkkyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX0RJVkkzLCBJOTYwQkFTRV9JTlNOX0RJVkkzLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX0FERE8sIEk5NjBCQVNFX0lOU05fQURETywgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX0FERE8xLCBJOTYwQkFTRV9JTlNOX0FERE8xLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX0FERE8yLCBJOTYwQkFTRV9JTlNOX0FERE8yLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX0FERE8zLCBJOTYwQkFTRV9JTlNOX0FERE8zLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX1NVQk8sIEk5NjBCQVNFX0lOU05fU1VCTywgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX1NVQk8xLCBJOTYwQkFTRV9JTlNOX1NVQk8xLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX1NVQk8yLCBJOTYwQkFTRV9JTlNOX1NVQk8yLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX1NVQk8zLCBJOTYwQkFTRV9JTlNOX1NVQk8zLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX05PVEJJVCwgSTk2MEJBU0VfSU5TTl9OT1RCSVQsIEk5NjBCQVNFX1NGTVRfTk9UQklUIH0sCi0gIHsgSTk2MF9JTlNOX05PVEJJVDEsIEk5NjBCQVNFX0lOU05fTk9UQklUMSwgSTk2MEJBU0VfU0ZNVF9OT1RCSVQxIH0sCi0gIHsgSTk2MF9JTlNOX05PVEJJVDIsIEk5NjBCQVNFX0lOU05fTk9UQklUMiwgSTk2MEJBU0VfU0ZNVF9OT1RCSVQyIH0sCi0gIHsgSTk2MF9JTlNOX05PVEJJVDMsIEk5NjBCQVNFX0lOU05fTk9UQklUMywgSTk2MEJBU0VfU0ZNVF9OT1RCSVQzIH0sCi0gIHsgSTk2MF9JTlNOX0FORCwgSTk2MEJBU0VfSU5TTl9BTkQsIEk5NjBCQVNFX1NGTVRfTVVMTyB9LAotICB7IEk5NjBfSU5TTl9BTkQxLCBJOTYwQkFTRV9JTlNOX0FORDEsIEk5NjBCQVNFX1NGTVRfTVVMTzEgfSwKLSAgeyBJOTYwX0lOU05fQU5EMiwgSTk2MEJBU0VfSU5TTl9BTkQyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX0FORDMsIEk5NjBCQVNFX0lOU05fQU5EMywgSTk2MEJBU0VfU0ZNVF9NVUxPMyB9LAotICB7IEk5NjBfSU5TTl9BTkROT1QsIEk5NjBCQVNFX0lOU05fQU5ETk9ULCBJOTYwQkFTRV9TRk1UX01VTE8gfSwKLSAgeyBJOTYwX0lOU05fQU5ETk9UMSwgSTk2MEJBU0VfSU5TTl9BTkROT1QxLCBJOTYwQkFTRV9TRk1UX01VTE8xIH0sCi0gIHsgSTk2MF9JTlNOX0FORE5PVDIsIEk5NjBCQVNFX0lOU05fQU5ETk9UMiwgSTk2MEJBU0VfU0ZNVF9NVUxPMiB9LAotICB7IEk5NjBfSU5TTl9BTkROT1QzLCBJOTYwQkFTRV9JTlNOX0FORE5PVDMsIEk5NjBCQVNFX1NGTVRfTVVMTzMgfSwKLSAgeyBJOTYwX0lOU05fU0VUQklULCBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgSTk2MEJBU0VfU0ZNVF9OT1RCSVQgfSwKLSAgeyBJOTYwX0lOU05fU0VUQklUMSwgSTk2MEJBU0VfSU5TTl9TRVRCSVQxLCBJOTYwQkFTRV9TRk1UX05PVEJJVDEgfSwKLSAgeyBJOTYwX0lOU05fU0VUQklUMiwgSTk2MEJBU0VfSU5TTl9TRVRCSVQyLCBJOTYwQkFTRV9TRk1UX05PVEJJVDIgfSwKLSAgeyBJOTYwX0lOU05fU0VUQklUMywgSTk2MEJBU0VfSU5TTl9TRVRCSVQzLCBJOTYwQkFTRV9TRk1UX05PVEJJVDMgfSwKLSAgeyBJOTYwX0lOU05fTk9UQU5ELCBJOTYwQkFTRV9JTlNOX05PVEFORCwgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX05PVEFORDEsIEk5NjBCQVNFX0lOU05fTk9UQU5EMSwgSTk2MEJBU0VfU0ZNVF9NVUxPMSB9LAotICB7IEk5NjBfSU5TTl9OT1RBTkQyLCBJOTYwQkFTRV9JTlNOX05PVEFORDIsIEk5NjBCQVNFX1NGTVRfTVVMTzIgfSwKLSAgeyBJOTYwX0lOU05fTk9UQU5EMywgSTk2MEJBU0VfSU5TTl9OT1RBTkQzLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX1hPUiwgSTk2MEJBU0VfSU5TTl9YT1IsIEk5NjBCQVNFX1NGTVRfTVVMTyB9LAotICB7IEk5NjBfSU5TTl9YT1IxLCBJOTYwQkFTRV9JTlNOX1hPUjEsIEk5NjBCQVNFX1NGTVRfTVVMTzEgfSwKLSAgeyBJOTYwX0lOU05fWE9SMiwgSTk2MEJBU0VfSU5TTl9YT1IyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX1hPUjMsIEk5NjBCQVNFX0lOU05fWE9SMywgSTk2MEJBU0VfU0ZNVF9NVUxPMyB9LAotICB7IEk5NjBfSU5TTl9PUiwgSTk2MEJBU0VfSU5TTl9PUiwgSTk2MEJBU0VfU0ZNVF9NVUxPIH0sCi0gIHsgSTk2MF9JTlNOX09SMSwgSTk2MEJBU0VfSU5TTl9PUjEsIEk5NjBCQVNFX1NGTVRfTVVMTzEgfSwKLSAgeyBJOTYwX0lOU05fT1IyLCBJOTYwQkFTRV9JTlNOX09SMiwgSTk2MEJBU0VfU0ZNVF9NVUxPMiB9LAotICB7IEk5NjBfSU5TTl9PUjMsIEk5NjBCQVNFX0lOU05fT1IzLCBJOTYwQkFTRV9TRk1UX01VTE8zIH0sCi0gIHsgSTk2MF9JTlNOX05PUiwgSTk2MEJBU0VfSU5TTl9OT1IsIEk5NjBCQVNFX1NGTVRfTVVMTyB9LAotICB7IEk5NjBfSU5TTl9OT1IxLCBJOTYwQkFTRV9JTlNOX05PUjEsIEk5NjBCQVNFX1NGTVRfTVVMTzEgfSwKLSAgeyBJOTYwX0lOU05fTk9SMiwgSTk2MEJBU0VfSU5TTl9OT1IyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX05PUjMsIEk5NjBCQVNFX0lOU05fTk9SMywgSTk2MEJBU0VfU0ZNVF9NVUxPMyB9LAotICB7IEk5NjBfSU5TTl9YTk9SLCBJOTYwQkFTRV9JTlNOX1hOT1IsIEk5NjBCQVNFX1NGTVRfTVVMTyB9LAotICB7IEk5NjBfSU5TTl9YTk9SMSwgSTk2MEJBU0VfSU5TTl9YTk9SMSwgSTk2MEJBU0VfU0ZNVF9NVUxPMSB9LAotICB7IEk5NjBfSU5TTl9YTk9SMiwgSTk2MEJBU0VfSU5TTl9YTk9SMiwgSTk2MEJBU0VfU0ZNVF9NVUxPMiB9LAotICB7IEk5NjBfSU5TTl9YTk9SMywgSTk2MEJBU0VfSU5TTl9YTk9SMywgSTk2MEJBU0VfU0ZNVF9NVUxPMyB9LAotICB7IEk5NjBfSU5TTl9OT1QsIEk5NjBCQVNFX0lOU05fTk9ULCBJOTYwQkFTRV9TRk1UX05PVCB9LAotICB7IEk5NjBfSU5TTl9OT1QxLCBJOTYwQkFTRV9JTlNOX05PVDEsIEk5NjBCQVNFX1NGTVRfTk9UMSB9LAotICB7IEk5NjBfSU5TTl9OT1QyLCBJOTYwQkFTRV9JTlNOX05PVDIsIEk5NjBCQVNFX1NGTVRfTk9UIH0sCi0gIHsgSTk2MF9JTlNOX05PVDMsIEk5NjBCQVNFX0lOU05fTk9UMywgSTk2MEJBU0VfU0ZNVF9OT1QxIH0sCi0gIHsgSTk2MF9JTlNOX09STk9ULCBJOTYwQkFTRV9JTlNOX09STk9ULCBJOTYwQkFTRV9TRk1UX01VTE8gfSwKLSAgeyBJOTYwX0lOU05fT1JOT1QxLCBJOTYwQkFTRV9JTlNOX09STk9UMSwgSTk2MEJBU0VfU0ZNVF9NVUxPMSB9LAotICB7IEk5NjBfSU5TTl9PUk5PVDIsIEk5NjBCQVNFX0lOU05fT1JOT1QyLCBJOTYwQkFTRV9TRk1UX01VTE8yIH0sCi0gIHsgSTk2MF9JTlNOX09STk9UMywgSTk2MEJBU0VfSU5TTl9PUk5PVDMsIEk5NjBCQVNFX1NGTVRfTVVMTzMgfSwKLSAgeyBJOTYwX0lOU05fQ0xSQklULCBJOTYwQkFTRV9JTlNOX0NMUkJJVCwgSTk2MEJBU0VfU0ZNVF9OT1RCSVQgfSwKLSAgeyBJOTYwX0lOU05fQ0xSQklUMSwgSTk2MEJBU0VfSU5TTl9DTFJCSVQxLCBJOTYwQkFTRV9TRk1UX05PVEJJVDEgfSwKLSAgeyBJOTYwX0lOU05fQ0xSQklUMiwgSTk2MEJBU0VfSU5TTl9DTFJCSVQyLCBJOTYwQkFTRV9TRk1UX05PVEJJVDIgfSwKLSAgeyBJOTYwX0lOU05fQ0xSQklUMywgSTk2MEJBU0VfSU5TTl9DTFJCSVQzLCBJOTYwQkFTRV9TRk1UX05PVEJJVDMgfSwKLSAgeyBJOTYwX0lOU05fU0hMTywgSTk2MEJBU0VfSU5TTl9TSExPLCBJOTYwQkFTRV9TRk1UX1NITE8gfSwKLSAgeyBJOTYwX0lOU05fU0hMTzEsIEk5NjBCQVNFX0lOU05fU0hMTzEsIEk5NjBCQVNFX1NGTVRfU0hMTzEgfSwKLSAgeyBJOTYwX0lOU05fU0hMTzIsIEk5NjBCQVNFX0lOU05fU0hMTzIsIEk5NjBCQVNFX1NGTVRfU0hMTzIgfSwKLSAgeyBJOTYwX0lOU05fU0hMTzMsIEk5NjBCQVNFX0lOU05fU0hMTzMsIEk5NjBCQVNFX1NGTVRfU0hMTzMgfSwKLSAgeyBJOTYwX0lOU05fU0hSTywgSTk2MEJBU0VfSU5TTl9TSFJPLCBJOTYwQkFTRV9TRk1UX1NITE8gfSwKLSAgeyBJOTYwX0lOU05fU0hSTzEsIEk5NjBCQVNFX0lOU05fU0hSTzEsIEk5NjBCQVNFX1NGTVRfU0hMTzEgfSwKLSAgeyBJOTYwX0lOU05fU0hSTzIsIEk5NjBCQVNFX0lOU05fU0hSTzIsIEk5NjBCQVNFX1NGTVRfU0hMTzIgfSwKLSAgeyBJOTYwX0lOU05fU0hSTzMsIEk5NjBCQVNFX0lOU05fU0hSTzMsIEk5NjBCQVNFX1NGTVRfU0hMTzMgfSwKLSAgeyBJOTYwX0lOU05fU0hMSSwgSTk2MEJBU0VfSU5TTl9TSExJLCBJOTYwQkFTRV9TRk1UX1NITE8gfSwKLSAgeyBJOTYwX0lOU05fU0hMSTEsIEk5NjBCQVNFX0lOU05fU0hMSTEsIEk5NjBCQVNFX1NGTVRfU0hMTzEgfSwKLSAgeyBJOTYwX0lOU05fU0hMSTIsIEk5NjBCQVNFX0lOU05fU0hMSTIsIEk5NjBCQVNFX1NGTVRfU0hMTzIgfSwKLSAgeyBJOTYwX0lOU05fU0hMSTMsIEk5NjBCQVNFX0lOU05fU0hMSTMsIEk5NjBCQVNFX1NGTVRfU0hMTzMgfSwKLSAgeyBJOTYwX0lOU05fU0hSSSwgSTk2MEJBU0VfSU5TTl9TSFJJLCBJOTYwQkFTRV9TRk1UX1NITE8gfSwKLSAgeyBJOTYwX0lOU05fU0hSSTEsIEk5NjBCQVNFX0lOU05fU0hSSTEsIEk5NjBCQVNFX1NGTVRfU0hMTzEgfSwKLSAgeyBJOTYwX0lOU05fU0hSSTIsIEk5NjBCQVNFX0lOU05fU0hSSTIsIEk5NjBCQVNFX1NGTVRfU0hMTzIgfSwKLSAgeyBJOTYwX0lOU05fU0hSSTMsIEk5NjBCQVNFX0lOU05fU0hSSTMsIEk5NjBCQVNFX1NGTVRfU0hMTzMgfSwKLSAgeyBJOTYwX0lOU05fRU1VTCwgSTk2MEJBU0VfSU5TTl9FTVVMLCBJOTYwQkFTRV9TRk1UX0VNVUwgfSwKLSAgeyBJOTYwX0lOU05fRU1VTDEsIEk5NjBCQVNFX0lOU05fRU1VTDEsIEk5NjBCQVNFX1NGTVRfRU1VTDEgfSwKLSAgeyBJOTYwX0lOU05fRU1VTDIsIEk5NjBCQVNFX0lOU05fRU1VTDIsIEk5NjBCQVNFX1NGTVRfRU1VTDIgfSwKLSAgeyBJOTYwX0lOU05fRU1VTDMsIEk5NjBCQVNFX0lOU05fRU1VTDMsIEk5NjBCQVNFX1NGTVRfRU1VTDMgfSwKLSAgeyBJOTYwX0lOU05fTU9WLCBJOTYwQkFTRV9JTlNOX01PViwgSTk2MEJBU0VfU0ZNVF9OT1QgfSwKLSAgeyBJOTYwX0lOU05fTU9WMSwgSTk2MEJBU0VfSU5TTl9NT1YxLCBJOTYwQkFTRV9TRk1UX05PVDEgfSwKLSAgeyBJOTYwX0lOU05fTU9WTCwgSTk2MEJBU0VfSU5TTl9NT1ZMLCBJOTYwQkFTRV9TRk1UX01PVkwgfSwKLSAgeyBJOTYwX0lOU05fTU9WTDEsIEk5NjBCQVNFX0lOU05fTU9WTDEsIEk5NjBCQVNFX1NGTVRfTU9WTDEgfSwKLSAgeyBJOTYwX0lOU05fTU9WVCwgSTk2MEJBU0VfSU5TTl9NT1ZULCBJOTYwQkFTRV9TRk1UX01PVlQgfSwKLSAgeyBJOTYwX0lOU05fTU9WVDEsIEk5NjBCQVNFX0lOU05fTU9WVDEsIEk5NjBCQVNFX1NGTVRfTU9WVDEgfSwKLSAgeyBJOTYwX0lOU05fTU9WUSwgSTk2MEJBU0VfSU5TTl9NT1ZRLCBJOTYwQkFTRV9TRk1UX01PVlEgfSwKLSAgeyBJOTYwX0lOU05fTU9WUTEsIEk5NjBCQVNFX0lOU05fTU9WUTEsIEk5NjBCQVNFX1NGTVRfTU9WUTEgfSwKLSAgeyBJOTYwX0lOU05fTU9EUEMsIEk5NjBCQVNFX0lOU05fTU9EUEMsIEk5NjBCQVNFX1NGTVRfTU9EUEMgfSwKLSAgeyBJOTYwX0lOU05fTU9EQUMsIEk5NjBCQVNFX0lOU05fTU9EQUMsIEk5NjBCQVNFX1NGTVRfTU9EUEMgfSwKLSAgeyBJOTYwX0lOU05fTERBX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MREFfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEQV9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEQV9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9MREFfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9MREFfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fTERBX0RJU1AsIEk5NjBCQVNFX0lOU05fTERBX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERBX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERBX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERBX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERBX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERBX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fTERfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERPQl9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERPQl9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERfT0ZGU0VUIH0sCi0gIHsgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRE9CX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYIH0sCi0gIHsgSTk2MF9JTlNOX0xET0JfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9CX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERPQl9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRFWF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRE9TX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRE9TX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gIHsgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fTERPU19ESVNQLCBJOTYwQkFTRV9JTlNOX0xET1NfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRE9TX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPU19JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX0xESUJfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fTERJQl9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUIH0sCi0gIHsgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9MRElCX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJQl9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRJUkVDVF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX0xESUJfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElCX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERJU19PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERfT0ZGU0VUIH0sCi0gIHsgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRElTX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYIH0sCi0gIHsgSTk2MF9JTlNOX0xESVNfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElTX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fTERJU19JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRFWF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRExfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERMX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERMX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xETF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xETF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9MRExfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRExfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRExfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRExfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFRfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERUX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xEVF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xEVF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9MRFRfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFRfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFRfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFRfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFFfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEUV9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERRX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERRX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xEUV9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xEUV9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9MRFFfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFFfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFFfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFFfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9TVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVE9CX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9CX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9TVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfU1RfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gIHsgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfU1RfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fU1RPQl9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT0JfRElTUCwgSTk2MEJBU0VfU0ZNVF9TVF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVE9CX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX1NUT1NfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RPU19JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX1NUX0lORElSRUNUIH0sCi0gIHsgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9TVE9TX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPU19ESVNQLCBJOTYwQkFTRV9TRk1UX1NUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9ESVNQIH0sCi0gIHsgSTk2MF9JTlNOX1NUT1NfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfSU5ERVhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RMX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVExfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUTF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUTF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVExfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVExfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fU1RMX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RMX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RMX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RMX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RMX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFRfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUVF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVFRfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVFRfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fU1RUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RUX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RUX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RRX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFFfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUUV9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUUV9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVFFfSU5ESVJFQ1QgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVFFfSU5ESVJFQ1RfSU5ERVggfSwKLSAgeyBJOTYwX0lOU05fU1RRX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RRX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RRX0lORElSRUNUX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RRX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RRX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgeyBJOTYwX0lOU05fQ01QT0JFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQkVfUkVHLCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9SRUcgfSwKLSAgeyBJOTYwX0lOU05fQ01QT0JFX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBPQkVfTElULCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9MSVQgfSwKLSAgeyBJOTYwX0lOU05fQ01QT0JORV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JORV9SRUcsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX1JFRyB9LAotICB7IEk5NjBfSU5TTl9DTVBPQk5FX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX0xJVCwgSTk2MEJBU0VfU0ZNVF9DTVBPQkVfTElUIH0sCi0gIHsgSTk2MF9JTlNOX0NNUE9CTF9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JMX1JFRywgSTk2MEJBU0VfU0ZNVF9DTVBPQkxfUkVHIH0sCi0gIHsgSTk2MF9JTlNOX0NNUE9CTF9MSVQsIEk5NjBCQVNFX0lOU05fQ01QT0JMX0xJVCwgSTk2MEJBU0VfU0ZNVF9DTVBPQkxfTElUIH0sCi0gIHsgSTk2MF9JTlNOX0NNUE9CTEVfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CTEVfUkVHLCBJOTYwQkFTRV9TRk1UX0NNUE9CTF9SRUcgfSwKLSAgeyBJOTYwX0lOU05fQ01QT0JMRV9MSVQsIEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQsIEk5NjBCQVNFX1NGTVRfQ01QT0JMX0xJVCB9LAotICB7IEk5NjBfSU5TTl9DTVBPQkdfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CR19SRUcsIEk5NjBCQVNFX1NGTVRfQ01QT0JMX1JFRyB9LAotICB7IEk5NjBfSU5TTl9DTVBPQkdfTElULCBJOTYwQkFTRV9JTlNOX0NNUE9CR19MSVQsIEk5NjBCQVNFX1NGTVRfQ01QT0JMX0xJVCB9LAotICB7IEk5NjBfSU5TTl9DTVBPQkdFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX1JFRywgSTk2MEJBU0VfU0ZNVF9DTVBPQkxfUkVHIH0sCi0gIHsgSTk2MF9JTlNOX0NNUE9CR0VfTElULCBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfTElULCBJOTYwQkFTRV9TRk1UX0NNUE9CTF9MSVQgfSwKLSAgeyBJOTYwX0lOU05fQ01QSUJFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQkVfUkVHLCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9SRUcgfSwKLSAgeyBJOTYwX0lOU05fQ01QSUJFX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBJQkVfTElULCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9MSVQgfSwKLSAgeyBJOTYwX0lOU05fQ01QSUJORV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJORV9SRUcsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX1JFRyB9LAotICB7IEk5NjBfSU5TTl9DTVBJQk5FX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX0xJVCwgSTk2MEJBU0VfU0ZNVF9DTVBPQkVfTElUIH0sCi0gIHsgSTk2MF9JTlNOX0NNUElCTF9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJMX1JFRywgSTk2MEJBU0VfU0ZNVF9DTVBPQkVfUkVHIH0sCi0gIHsgSTk2MF9JTlNOX0NNUElCTF9MSVQsIEk5NjBCQVNFX0lOU05fQ01QSUJMX0xJVCwgSTk2MEJBU0VfU0ZNVF9DTVBPQkVfTElUIH0sCi0gIHsgSTk2MF9JTlNOX0NNUElCTEVfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCTEVfUkVHLCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9SRUcgfSwKLSAgeyBJOTYwX0lOU05fQ01QSUJMRV9MSVQsIEk5NjBCQVNFX0lOU05fQ01QSUJMRV9MSVQsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX0xJVCB9LAotICB7IEk5NjBfSU5TTl9DTVBJQkdfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCR19SRUcsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX1JFRyB9LAotICB7IEk5NjBfSU5TTl9DTVBJQkdfTElULCBJOTYwQkFTRV9JTlNOX0NNUElCR19MSVQsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX0xJVCB9LAotICB7IEk5NjBfSU5TTl9DTVBJQkdFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX1JFRywgSTk2MEJBU0VfU0ZNVF9DTVBPQkVfUkVHIH0sCi0gIHsgSTk2MF9JTlNOX0NNUElCR0VfTElULCBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElULCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9MSVQgfSwKLSAgeyBJOTYwX0lOU05fQkJDX1JFRywgSTk2MEJBU0VfSU5TTl9CQkNfUkVHLCBJOTYwQkFTRV9TRk1UX0JCQ19SRUcgfSwKLSAgeyBJOTYwX0lOU05fQkJDX0xJVCwgSTk2MEJBU0VfSU5TTl9CQkNfTElULCBJOTYwQkFTRV9TRk1UX0JCQ19MSVQgfSwKLSAgeyBJOTYwX0lOU05fQkJTX1JFRywgSTk2MEJBU0VfSU5TTl9CQlNfUkVHLCBJOTYwQkFTRV9TRk1UX0JCQ19SRUcgfSwKLSAgeyBJOTYwX0lOU05fQkJTX0xJVCwgSTk2MEJBU0VfSU5TTl9CQlNfTElULCBJOTYwQkFTRV9TRk1UX0JCQ19MSVQgfSwKLSAgeyBJOTYwX0lOU05fQ01QSSwgSTk2MEJBU0VfSU5TTl9DTVBJLCBJOTYwQkFTRV9TRk1UX0NNUEkgfSwKLSAgeyBJOTYwX0lOU05fQ01QSTEsIEk5NjBCQVNFX0lOU05fQ01QSTEsIEk5NjBCQVNFX1NGTVRfQ01QSTEgfSwKLSAgeyBJOTYwX0lOU05fQ01QSTIsIEk5NjBCQVNFX0lOU05fQ01QSTIsIEk5NjBCQVNFX1NGTVRfQ01QSTIgfSwKLSAgeyBJOTYwX0lOU05fQ01QSTMsIEk5NjBCQVNFX0lOU05fQ01QSTMsIEk5NjBCQVNFX1NGTVRfQ01QSTMgfSwKLSAgeyBJOTYwX0lOU05fQ01QTywgSTk2MEJBU0VfSU5TTl9DTVBPLCBJOTYwQkFTRV9TRk1UX0NNUE8gfSwKLSAgeyBJOTYwX0lOU05fQ01QTzEsIEk5NjBCQVNFX0lOU05fQ01QTzEsIEk5NjBCQVNFX1NGTVRfQ01QTzEgfSwKLSAgeyBJOTYwX0lOU05fQ01QTzIsIEk5NjBCQVNFX0lOU05fQ01QTzIsIEk5NjBCQVNFX1NGTVRfQ01QTzIgfSwKLSAgeyBJOTYwX0lOU05fQ01QTzMsIEk5NjBCQVNFX0lOU05fQ01QTzMsIEk5NjBCQVNFX1NGTVRfQ01QTzMgfSwKLSAgeyBJOTYwX0lOU05fVEVTVE5PX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUTk9fUkVHLCBJOTYwQkFTRV9TRk1UX1RFU1ROT19SRUcgfSwKLSAgeyBJOTYwX0lOU05fVEVTVEdfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RHX1JFRywgSTk2MEJBU0VfU0ZNVF9URVNUTk9fUkVHIH0sCi0gIHsgSTk2MF9JTlNOX1RFU1RFX1JFRywgSTk2MEJBU0VfSU5TTl9URVNURV9SRUcsIEk5NjBCQVNFX1NGTVRfVEVTVE5PX1JFRyB9LAotICB7IEk5NjBfSU5TTl9URVNUR0VfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RHRV9SRUcsIEk5NjBCQVNFX1NGTVRfVEVTVE5PX1JFRyB9LAotICB7IEk5NjBfSU5TTl9URVNUTF9SRUcsIEk5NjBCQVNFX0lOU05fVEVTVExfUkVHLCBJOTYwQkFTRV9TRk1UX1RFU1ROT19SRUcgfSwKLSAgeyBJOTYwX0lOU05fVEVTVE5FX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUTkVfUkVHLCBJOTYwQkFTRV9TRk1UX1RFU1ROT19SRUcgfSwKLSAgeyBJOTYwX0lOU05fVEVTVExFX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUTEVfUkVHLCBJOTYwQkFTRV9TRk1UX1RFU1ROT19SRUcgfSwKLSAgeyBJOTYwX0lOU05fVEVTVE9fUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RPX1JFRywgSTk2MEJBU0VfU0ZNVF9URVNUTk9fUkVHIH0sCi0gIHsgSTk2MF9JTlNOX0JOTywgSTk2MEJBU0VfSU5TTl9CTk8sIEk5NjBCQVNFX1NGTVRfQk5PIH0sCi0gIHsgSTk2MF9JTlNOX0JHLCBJOTYwQkFTRV9JTlNOX0JHLCBJOTYwQkFTRV9TRk1UX0JOTyB9LAotICB7IEk5NjBfSU5TTl9CRSwgSTk2MEJBU0VfSU5TTl9CRSwgSTk2MEJBU0VfU0ZNVF9CTk8gfSwKLSAgeyBJOTYwX0lOU05fQkdFLCBJOTYwQkFTRV9JTlNOX0JHRSwgSTk2MEJBU0VfU0ZNVF9CTk8gfSwKLSAgeyBJOTYwX0lOU05fQkwsIEk5NjBCQVNFX0lOU05fQkwsIEk5NjBCQVNFX1NGTVRfQk5PIH0sCi0gIHsgSTk2MF9JTlNOX0JORSwgSTk2MEJBU0VfSU5TTl9CTkUsIEk5NjBCQVNFX1NGTVRfQk5PIH0sCi0gIHsgSTk2MF9JTlNOX0JMRSwgSTk2MEJBU0VfSU5TTl9CTEUsIEk5NjBCQVNFX1NGTVRfQk5PIH0sCi0gIHsgSTk2MF9JTlNOX0JPLCBJOTYwQkFTRV9JTlNOX0JPLCBJOTYwQkFTRV9TRk1UX0JOTyB9LAotICB7IEk5NjBfSU5TTl9CLCBJOTYwQkFTRV9JTlNOX0IsIEk5NjBCQVNFX1NGTVRfQiB9LAotICB7IEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0JYX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9CWF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9CWF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9CWF9JTkRJUkVDVF9JTkRFWCB9LAotICB7IEk5NjBfSU5TTl9CWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0JYX0RJU1AsIEk5NjBCQVNFX1NGTVRfQlhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX1NGTVRfQlhfSU5ESVJFQ1RfRElTUCB9LAotICB7IEk5NjBfSU5TTl9DQUxMWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0NBTExYX0RJU1AsIEk5NjBCQVNFX1NGTVRfQ0FMTFhfRElTUCB9LAotICB7IEk5NjBfSU5TTl9DQUxMWF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9DQUxMWF9JTkRJUkVDVCB9LAotICB7IEk5NjBfSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0NBTExYX0lORElSRUNUX09GRlNFVCB9LAotICB7IEk5NjBfSU5TTl9SRVQsIEk5NjBCQVNFX0lOU05fUkVULCBJOTYwQkFTRV9TRk1UX1JFVCB9LAotICB7IEk5NjBfSU5TTl9DQUxMUywgSTk2MEJBU0VfSU5TTl9DQUxMUywgSTk2MEJBU0VfU0ZNVF9DQUxMUyB9LAotICB7IEk5NjBfSU5TTl9GTUFSSywgSTk2MEJBU0VfSU5TTl9GTUFSSywgSTk2MEJBU0VfU0ZNVF9GTUFSSyB9LAotICB7IEk5NjBfSU5TTl9GTFVTSFJFRywgSTk2MEJBU0VfSU5TTl9GTFVTSFJFRywgSTk2MEJBU0VfU0ZNVF9GTFVTSFJFRyB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBpOTYwYmFzZV9pbnNuX3NlbV9pbnZhbGlkID0gewotICBWSVJUVUFMX0lOU05fWF9JTlZBTElELCBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgSTk2MEJBU0VfU0ZNVF9FTVBUWQotfTsKLQotLyogSW5pdGlhbGl6ZSBhbiBJREVTQyBmcm9tIHRoZSBjb21waWxlLXRpbWUgY29tcHV0YWJsZSBwYXJ0cy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5pdF9pZGVzYyAoU0lNX0NQVSAqY3B1LCBJREVTQyAqaWQsIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSAqdCkKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICppbnNuX3RhYmxlID0gQ0dFTl9DUFVfSU5TTl9UQUJMRSAoQ1BVX0NQVV9ERVNDIChjcHUpKS0+aW5pdF9lbnRyaWVzOwotCi0gIGlkLT5udW0gPSB0LT5pbmRleDsKLSAgaWQtPnNmbXQgPSB0LT5zZm10OwotICBpZiAoKGludCkgdC0+dHlwZSA8PSAwKQotICAgIGlkLT5pZGF0YSA9ICYgY2dlbl92aXJ0dWFsX2luc25fdGFibGVbLSAoaW50KSB0LT50eXBlXTsKLSAgZWxzZQotICAgIGlkLT5pZGF0YSA9ICYgaW5zbl90YWJsZVt0LT50eXBlXTsKLSAgaWQtPmF0dHJzID0gQ0dFTl9JTlNOX0FUVFJTIChpZC0+aWRhdGEpOwotICAvKiBPaCBteSBnb2QsIGEgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaWQtPmxlbmd0aCA9IENHRU5fSU5TTl9CSVRTSVpFIChpZC0+aWRhdGEpIC8gODsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIGlkLT50aW1pbmcgPSAmIE1PREVMX1RJTUlORyAoQ1BVX01PREVMIChjcHUpKSBbdC0+aW5kZXhdOwotICB7Ci0gICAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gICAgU0lNX0FTU0VSVCAodC0+aW5kZXggPT0gaWQtPnRpbWluZy0+bnVtKTsKLSAgfQotI2VuZGlmCi0KLSAgLyogU2VtYW50aWMgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkIGVsc2V3aGVyZS4gICovCi19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGFibGUuICAqLwotCi12b2lkCi1pOTYwYmFzZV9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICpjcHUpCi17Ci0gIElERVNDICppZCwqdGFiZW5kOwotICBjb25zdCBzdHJ1Y3QgaW5zbl9zZW0gKnQsKnRlbmQ7Ci0gIGludCB0YWJzaXplID0gSTk2MEJBU0VfSU5TTl9NQVg7Ci0gIElERVNDICp0YWJsZSA9IGk5NjBiYXNlX2luc25fZGF0YTsKLQotICBtZW1zZXQgKHRhYmxlLCAwLCB0YWJzaXplICogc2l6ZW9mIChJREVTQykpOwotCi0gIC8qIEZpcnN0IHNldCBhbGwgZW50cmllcyB0byB0aGUgYGludmFsaWQgaW5zbicuICAqLwotICB0ID0gJiBpOTYwYmFzZV9pbnNuX3NlbV9pbnZhbGlkOwotICBmb3IgKGlkID0gdGFibGUsIHRhYmVuZCA9IHRhYmxlICsgdGFic2l6ZTsgaWQgPCB0YWJlbmQ7ICsraWQpCi0gICAgaW5pdF9pZGVzYyAoY3B1LCBpZCwgdCk7Ci0KLSAgLyogTm93IGZpbGwgaW4gdGhlIHZhbHVlcyBmb3IgdGhlIGNob3NlbiBjcHUuICAqLwotICBmb3IgKHQgPSBpOTYwYmFzZV9pbnNuX3NlbSwgdGVuZCA9IHQgKyBzaXplb2YgKGk5NjBiYXNlX2luc25fc2VtKSAvIHNpemVvZiAoKnQpOwotICAgICAgIHQgIT0gdGVuZDsgKyt0KQotICAgIHsKLSAgICAgIGluaXRfaWRlc2MgKGNwdSwgJiB0YWJsZVt0LT5pbmRleF0sIHQpOwotICAgIH0KLQotICAvKiBMaW5rIHRoZSBJREVTQyB0YWJsZSBpbnRvIHRoZSBjcHUuICAqLwotICBDUFVfSURFU0MgKGNwdSkgPSB0YWJsZTsKLX0KLQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gaXRzIElERVNDIGVudHJ5LiAgKi8KLQotY29uc3QgSURFU0MgKgotaTk2MGJhc2VfZGVjb2RlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgSUFERFIgcGMsCi0gICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuLAotICAgICAgICAgICAgICBBUkdCVUYgKmFidWYpCi17Ci0gIC8qIFJlc3VsdCBvZiBkZWNvZGVyLiAgKi8KLSAgSTk2MEJBU0VfSU5TTl9UWVBFIGl0eXBlOwotCi0gIHsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAyNCkgJiAoMjU1IDw8IDApKSk7Ci0gICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgIHsKLSAgICAgIGNhc2UgOCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9COyBnb3RvIGV4dHJhY3Rfc2ZtdF9iOwotICAgICAgY2FzZSAxMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9SRVQ7IGdvdG8gZXh0cmFjdF9zZm10X3JldDsKLSAgICAgIGNhc2UgMTYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQk5POyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibm87Ci0gICAgICBjYXNlIDE3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibm87Ci0gICAgICBjYXNlIDE4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JFOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibm87Ci0gICAgICBjYXNlIDE5IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JHRTsgZ290byBleHRyYWN0X3NmbXRfYm5vOwotICAgICAgY2FzZSAyMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9CTDsgZ290byBleHRyYWN0X3NmbXRfYm5vOwotICAgICAgY2FzZSAyMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9CTkU7IGdvdG8gZXh0cmFjdF9zZm10X2JubzsKLSAgICAgIGNhc2UgMjIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQkxFOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibm87Ci0gICAgICBjYXNlIDIzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JPOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibm87Ci0gICAgICBjYXNlIDMyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1RFU1ROT19SRUc7IGdvdG8gZXh0cmFjdF9zZm10X3Rlc3Rub19yZWc7Ci0gICAgICBjYXNlIDMzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1RFU1RHX1JFRzsgZ290byBleHRyYWN0X3NmbXRfdGVzdG5vX3JlZzsKLSAgICAgIGNhc2UgMzQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fVEVTVEVfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF90ZXN0bm9fcmVnOwotICAgICAgY2FzZSAzNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9URVNUR0VfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF90ZXN0bm9fcmVnOwotICAgICAgY2FzZSAzNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9URVNUTF9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X3Rlc3Rub19yZWc7Ci0gICAgICBjYXNlIDM3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1RFU1RORV9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X3Rlc3Rub19yZWc7Ci0gICAgICBjYXNlIDM4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1RFU1RMRV9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X3Rlc3Rub19yZWc7Ci0gICAgICBjYXNlIDM5IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1RFU1RPX1JFRzsgZ290byBleHRyYWN0X3NmbXRfdGVzdG5vX3JlZzsKLSAgICAgIGNhc2UgNDggOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JCQ19SRUc7IGdvdG8gZXh0cmFjdF9zZm10X2JiY19yZWc7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0JCQ19MSVQ7IGdvdG8gZXh0cmFjdF9zZm10X2JiY19saXQ7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA0OSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QT0JHX1JFRzsgZ290byBleHRyYWN0X3NmbXRfY21wb2JsX3JlZzsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QT0JHX0xJVDsgZ290byBleHRyYWN0X3NmbXRfY21wb2JsX2xpdDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDUwIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkVfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkVfTElUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfbGl0OwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgNTEgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmxfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkdFX0xJVDsgZ290byBleHRyYWN0X3NmbXRfY21wb2JsX2xpdDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDUyIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkxfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmxfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkxfTElUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmxfbGl0OwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgNTMgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQk5FX0xJVDsgZ290byBleHRyYWN0X3NmbXRfY21wb2JlX2xpdDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDU0IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPQkxFX1JFRzsgZ290byBleHRyYWN0X3NmbXRfY21wb2JsX3JlZzsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQ7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9ibF9saXQ7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA1NSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQkJTX1JFRzsgZ290byBleHRyYWN0X3NmbXRfYmJjX3JlZzsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQkJTX0xJVDsgZ290byBleHRyYWN0X3NmbXRfYmJjX2xpdDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDU3IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBJQkdfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBJQkdfTElUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfbGl0OwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgNTggOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCRV9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9yZWc7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCRV9MSVQ7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9saXQ7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA1OSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QSUJHRV9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9yZWc7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfbGl0OwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgNjAgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCTF9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9yZWc7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCTF9MSVQ7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9saXQ7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA2MSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QSUJORV9SRUc7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG9iZV9yZWc7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCTkVfTElUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfbGl0OwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgNjIgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUElCTEVfUkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvYmVfcmVnOwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBJQkxFX0xJVDsgZ290byBleHRyYWN0X3NmbXRfY21wb2JlX2xpdDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDg4IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UQklUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3RiaXQ7Ci0gICAgICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9BTkQ7IGdvdG8gZXh0cmFjdF9zZm10X211bG87Ci0gICAgICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9BTkROT1Q7IGdvdG8gZXh0cmFjdF9zZm10X211bG87Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TRVRCSVQ7IGdvdG8gZXh0cmFjdF9zZm10X25vdGJpdDsKLSAgICAgICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX05PVEFORDsgZ290byBleHRyYWN0X3NmbXRfbXVsbzsKLSAgICAgICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YT1I7IGdvdG8gZXh0cmFjdF9zZm10X211bG87Ci0gICAgICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fT1I7IGdvdG8gZXh0cmFjdF9zZm10X211bG87Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9OT1I7IGdvdG8gZXh0cmFjdF9zZm10X211bG87Ci0gICAgICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YTk9SOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3Q7Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9PUk5PVDsgZ290byBleHRyYWN0X3NmbXRfbXVsbzsKLSAgICAgICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NMUkJJVDsgZ290byBleHRyYWN0X3NmbXRfbm90Yml0OwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UQklUMTsgZ290byBleHRyYWN0X3NmbXRfbm90Yml0MTsKLSAgICAgICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0FORDE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQU5ETk9UMTsgZ290byBleHRyYWN0X3NmbXRfbXVsbzE7Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TRVRCSVQxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3RiaXQxOwotICAgICAgICAgICAgICBjYXNlIDggOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UQU5EMTsgZ290byBleHRyYWN0X3NmbXRfbXVsbzE7Ci0gICAgICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWE9SMTsgZ290byBleHRyYWN0X3NmbXRfbXVsbzE7Ci0gICAgICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fT1IxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMTsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX05PUjE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBjYXNlIDIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWE5PUjE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UMTsgZ290byBleHRyYWN0X3NmbXRfbm90MTsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX09STk9UMTsgZ290byBleHRyYWN0X3NmbXRfbXVsbzE7Ci0gICAgICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTFJCSVQxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3RiaXQxOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UQklUMjsgZ290byBleHRyYWN0X3NmbXRfbm90Yml0MjsKLSAgICAgICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0FORDI7IGdvdG8gZXh0cmFjdF9zZm10X211bG8yOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQU5ETk9UMjsgZ290byBleHRyYWN0X3NmbXRfbXVsbzI7Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TRVRCSVQyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3RiaXQyOwotICAgICAgICAgICAgICBjYXNlIDggOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UQU5EMjsgZ290byBleHRyYWN0X3NmbXRfbXVsbzI7Ci0gICAgICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWE9SMjsgZ290byBleHRyYWN0X3NmbXRfbXVsbzI7Ci0gICAgICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fT1IyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX05PUjI7IGdvdG8gZXh0cmFjdF9zZm10X211bG8yOwotICAgICAgICAgICAgICBjYXNlIDIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWE5PUjI7IGdvdG8gZXh0cmFjdF9zZm10X211bG8yOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9UMjsgZ290byBleHRyYWN0X3NmbXRfbm90OwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fT1JOT1QyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NMUkJJVDI7IGdvdG8gZXh0cmFjdF9zZm10X25vdGJpdDI7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9OT1RCSVQzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3RiaXQzOwotICAgICAgICAgICAgICBjYXNlIDIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQU5EMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9BTkROT1QzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NFVEJJVDM7IGdvdG8gZXh0cmFjdF9zZm10X25vdGJpdDM7Ci0gICAgICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9OT1RBTkQzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YT1IzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9PUjM7IGdvdG8gZXh0cmFjdF9zZm10X211bG8zOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDcgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTk9SMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YTk9SMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9OT1QzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3QxOwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fT1JOT1QzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NMUkJJVDM7IGdvdG8gZXh0cmFjdF9zZm10X25vdGJpdDM7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgODkgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9BRERPOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1VCTzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NIUk87IGdvdG8gZXh0cmFjdF9zZm10X3NobG87Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSFJJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvOwotICAgICAgICAgICAgICBjYXNlIDggOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU0hMTzsgZ290byBleHRyYWN0X3NmbXRfc2hsbzsKLSAgICAgICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSExJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQURETzE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1VCTzE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU0hSTzE7IGdvdG8gZXh0cmFjdF9zZm10X3NobG8xOwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU0hSSTE7IGdvdG8gZXh0cmFjdF9zZm10X3NobG8xOwotICAgICAgICAgICAgICBjYXNlIDggOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU0hMTzE7IGdvdG8gZXh0cmFjdF9zZm10X3NobG8xOwotICAgICAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NITEkxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvMTsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0FERE8yOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NVQk8yOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NIUk8yOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvMjsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NIUkkyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvMjsKLSAgICAgICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NITE8yOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zaGxvMjsKLSAgICAgICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSExJMjsgZ290byBleHRyYWN0X3NmbXRfc2hsbzI7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9BRERPMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVUJPMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNyA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSFJPMzsgZ290byBleHRyYWN0X3NmbXRfc2hsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSFJJMzsgZ290byBleHRyYWN0X3NmbXRfc2hsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TSExPMzsgZ290byBleHRyYWN0X3NmbXRfc2hsbzM7Ci0gICAgICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU0hMSTM7IGdvdG8gZXh0cmFjdF9zZm10X3NobG8zOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDkwIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDggOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QTzsgZ290byBleHRyYWN0X3NmbXRfY21wbzsKLSAgICAgICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUEk7IGdvdG8gZXh0cmFjdF9zZm10X2NtcGk7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTAgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QTzE7IGdvdG8gZXh0cmFjdF9zZm10X2NtcG8xOwotICAgICAgICAgICAgICBjYXNlIDIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQ01QSTE7IGdvdG8gZXh0cmFjdF9zZm10X2NtcGkxOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEyIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUE8yOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBvMjsKLSAgICAgICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NNUEkyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBpMjsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBPMzsgZ290byBleHRyYWN0X3NmbXRfY21wbzM7Ci0gICAgICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DTVBJMzsgZ290byBleHRyYWN0X3NmbXRfY21waTM7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgOTIgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NT1Y7IGdvdG8gZXh0cmFjdF9zZm10X25vdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTU9WMTsgZ290byBleHRyYWN0X3NmbXRfbm90MTsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDkzIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTU9WTDsgZ290byBleHRyYWN0X3NmbXRfbW92bDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTU9WTDE7IGdvdG8gZXh0cmFjdF9zZm10X21vdmwxOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgOTQgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NT1ZUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tb3Z0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NT1ZUMTsgZ290byBleHRyYWN0X3NmbXRfbW92dDE7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA5NSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSA1IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX01PVlE7IGdvdG8gZXh0cmFjdF9zZm10X21vdnE7Ci0gICAgICAgICAgY2FzZSA3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX01PVlExOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tb3ZxMTsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDEwMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NT0RBQzsgZ290byBleHRyYWN0X3NmbXRfbW9kcGM7Ci0gICAgICBjYXNlIDEwMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NT0RQQzsgZ290byBleHRyYWN0X3NmbXRfbW9kcGM7Ci0gICAgICBjYXNlIDEwMiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DQUxMUzsgZ290byBleHRyYWN0X3NmbXRfY2FsbHM7Ci0gICAgICAgICAgY2FzZSAxNSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgOCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9GTUFSSzsgZ290byBleHRyYWN0X3NmbXRfZm1hcms7Ci0gICAgICAgICAgICAgIGNhc2UgMTAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fRkxVU0hSRUc7IGdvdG8gZXh0cmFjdF9zZm10X2ZsdXNocmVnOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDEwMyA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0VNVUw7IGdvdG8gZXh0cmFjdF9zZm10X2VtdWw7Ci0gICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0VNVUwxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXVsMTsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fRU1VTDI7IGdvdG8gZXh0cmFjdF9zZm10X2VtdWwyOwotICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9FTVVMMzsgZ290byBleHRyYWN0X3NmbXRfZW11bDM7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxMTIgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NVUxPOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvOwotICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9SRU1POyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvOwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fRElWTzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX01VTE8xOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMTsKLSAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fUkVNTzE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fRElWTzE7IGdvdG8gZXh0cmFjdF9zZm10X211bG8xOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTVVMTzI7IGdvdG8gZXh0cmFjdF9zZm10X211bG8yOwotICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9SRU1PMjsgZ290byBleHRyYWN0X3NmbXRfbXVsbzI7Ci0gICAgICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9ESVZPMjsgZ290byBleHRyYWN0X3NmbXRfbXVsbzI7Ci0gICAgICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9NVUxPMzsgZ290byBleHRyYWN0X3NmbXRfbXVsbzM7Ci0gICAgICAgICAgY2FzZSA3IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1JFTU8zOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0RJVk8zOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxMTYgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9SRU1JOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvOwotICAgICAgICAgICAgICBjYXNlIDYgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fRElWSTsgZ290byBleHRyYWN0X3NmbXRfbXVsbzsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1JFTUkxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMTsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0RJVkkxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMTsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1JFTUkyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0RJVkkyOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMjsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1JFTUkzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgY2FzZSA2IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0RJVkkzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxvMzsKLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxMjggOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRE9CX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGRfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X29mZnNldDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET0JfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfZGlzcDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET0JfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kZXhfZGlzcDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDEzMCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUT0JfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfc3RfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPQl9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTMyIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X2J4X2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfYnhfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ieF9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9CWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ieF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfYnhfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDEzNCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jYWxseF9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2NhbGx4X2luZGlyZWN0X29mZnNldDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0NBTExYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2NhbGx4X2Rpc3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxMzYgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRE9TX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGRfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X29mZnNldDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET1NfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfZGlzcDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET1NfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kZXhfZGlzcDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDEzOCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfc3RfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPU19ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPU19JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTQwIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERBX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGRhX29mZnNldDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZGFfaW5kaXJlY3Q7Ci0gICAgICAgICAgY2FzZSA3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfbGRhX2luZGlyZWN0X2luZGV4OwotICAgICAgICAgIGNhc2UgOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDExIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkYV9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MREFfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRhX2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRhX2luZGlyZWN0X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MREFfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRhX2luZGV4X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxNDQgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkX29mZnNldDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGV4X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTQ2IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVg7IGdvdG8gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0X2luZGV4OwotICAgICAgICAgIGNhc2UgOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDExIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfc3RfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDE1MiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVDsgZ290byBleHRyYWN0X3NmbXRfbGRsX2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVg7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9pbmRpcmVjdF9pbmRleDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZGxfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERMX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9pbmRpcmVjdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERMX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTU0IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RMX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfc3RsX29mZnNldDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdGxfaW5kaXJlY3Q7Ci0gICAgICAgICAgY2FzZSA3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfc3RsX2luZGlyZWN0X2luZGV4OwotICAgICAgICAgIGNhc2UgOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDExIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X3N0bF9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVExfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RsX2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RsX2luZGlyZWN0X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVExfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RsX2luZGV4X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfc3RsX2luZGlyZWN0X2luZGV4X2Rpc3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxNjAgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFRfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X2xkdF9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGR0X2luZGlyZWN0X29mZnNldDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfZGlzcDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kZXhfZGlzcDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDE2MiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVDsgZ290byBleHRyYWN0X3NmbXRfc3R0X2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVg7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9pbmRpcmVjdF9pbmRleDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHRfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RUX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9pbmRpcmVjdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RUX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X3N0dF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTc2IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERRX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGRxX29mZnNldDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZHFfaW5kaXJlY3Q7Ci0gICAgICAgICAgY2FzZSA3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWDsgZ290byBleHRyYWN0X3NmbXRfbGRxX2luZGlyZWN0X2luZGV4OwotICAgICAgICAgIGNhc2UgOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDExIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFFfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRxX2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRxX2luZGlyZWN0X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFFfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRxX2luZGV4X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUDsgZ290byBleHRyYWN0X3NmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSAxNzggOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVFFfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0cV9pbmRpcmVjdDsKLSAgICAgICAgICBjYXNlIDcgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXg7Ci0gICAgICAgICAgY2FzZSA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSA5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTEgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfc3RxX2luZGlyZWN0X29mZnNldDsKLSAgICAgICAgICBjYXNlIDEyIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUUV9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfZGlzcDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfaW5kaXJlY3RfZGlzcDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUUV9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfaW5kZXhfZGlzcDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDE5MiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSA0IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1Q7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0OwotICAgICAgICAgIGNhc2UgNyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9pbmRleDsKLSAgICAgICAgICBjYXNlIDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgY2FzZSAxMSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3Rfb2Zmc2V0OwotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJQl9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kaXNwOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9kaXNwOwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJQl9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRleF9kaXNwOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9pbmRleF9kaXNwOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMjAwIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDMgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkX29mZnNldDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVDsgZ290byBleHRyYWN0X3NmbXRfbGRfaW5kaXJlY3Q7Ci0gICAgICAgICAgY2FzZSA3IDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVg7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X2luZGV4OwotICAgICAgICAgIGNhc2UgOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIGNhc2UgMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICBjYXNlIDExIDogaXR5cGUgPSBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9vZmZzZXQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElTX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElTX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGV4X2Rpc3A7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1A7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X2luZGV4X2Rpc3A7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6IGl0eXBlID0gSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBkZWNvZGVkLCBub3cgZXh0cmFjdCB0aGUgZmllbGRzLiAgKi8KLQotIGV4dHJhY3Rfc2ZtdF9lbXB0eToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2VtcHR5IiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXVsbzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzI7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzJdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdWxvIiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXVsbzE6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzJdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdWxvMSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdWxvMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X211bG8yIiwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X211bG8zOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzI7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyYzEpID0gZl9zcmMxOwotICBGTEQgKGZfc3JjMikgPSBmX3NyYzI7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X211bG8zIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ub3RiaXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbm90Yml0IiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbm90Yml0MToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X25vdGJpdDEiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgInNyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbm90Yml0MjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X25vdGJpdDIiLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbm90Yml0MzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ub3RiaXQzIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ub3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbm90IiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbm90MToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbm90MSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zaGxvOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NobG8iLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zaGxvMToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NobG8xIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3NobG8yOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzI7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc2hsbzIiLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc2hsbzM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc2hsbzMiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2VtdWw6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZW11bCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZW11bDE6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzJdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9lbXVsMSIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2VtdWwyOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzI7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZW11bDIiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9lbXVsMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMyOwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9lbXVsMyIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tb3ZsOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3ZsIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3JjMV8xKSA9ICgoRkxEIChmX3NyYzEpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21vdmwxOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX3NyYzEpID0gZl9zcmMxOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tb3ZsMSIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21vdnQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3ZxLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X21vdnQiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zcmMxXzEpID0gKChGTEQgKGZfc3JjMSkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3JjMV8yKSA9ICgoRkxEIChmX3NyYzEpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21vdnQxOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X21vdnQxIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbW92cToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NyYzE7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyYzEpID0gZl9zcmMxOwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbW92cSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3NyYzFfMSkgPSAoKEZMRCAoZl9zcmMxKSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zcmMxXzIpID0gKChGTEQgKGZfc3JjMSkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3JjMV8zKSA9ICgoRkxEIChmX3NyYzEpKSArICgzKSk7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21vdnExOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X21vdnExIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbW9kcGM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc3JjMjsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbW9kcGMiLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGFfb2Zmc2V0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkYV9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkYV9pbmRpcmVjdF9vZmZzZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGFfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRhX2luZGlyZWN0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkYV9pbmRpcmVjdCIsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGFfaW5kaXJlY3RfaW5kZXg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRhX2luZGlyZWN0X2luZGV4IiwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGFfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkYV9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkYV9pbmRpcmVjdF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGFfaW5kaXJlY3RfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRhX2luZGV4X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkYV9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkX29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX29mZnNldDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZF9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkX2luZGlyZWN0X2luZGV4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX2luZGlyZWN0X2luZGV4IiwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZF9pbmRpcmVjdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZF9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZF9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGxfb2Zmc2V0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkbF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRsX2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkbF9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkbF9pbmRpcmVjdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGxfaW5kaXJlY3QiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGxfaW5kaXJlY3RfaW5kZXg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRsX2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkbF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRsX2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGxfaW5kaXJlY3RfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRsX2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRsX2luZGV4X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkbF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHRfb2Zmc2V0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGR0X2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkdF9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkdF9pbmRpcmVjdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZHRfaW5kaXJlY3QiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kaXJlY3RfaW5kZXg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGR0X2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkdF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGR0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHRfaW5kaXJlY3RfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGR0X2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGR0X2luZGV4X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHFfb2Zmc2V0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcV9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRxX2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcV9pbmRpcmVjdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZHFfaW5kaXJlY3QiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRxX2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcV9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRxX2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZHFfaW5kaXJlY3RfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRxX2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKG91dF9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9kc3RfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRxX2luZGV4X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcV9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfZHN0XzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX2RzdF8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9vZmZzZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9vZmZzZXQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxMik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0X2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RfaW5kaXJlY3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RfaW5kaXJlY3QiLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdF9pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0X2luZGlyZWN0X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0X2luZGlyZWN0X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RfaW5kZXhfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0X2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0bF9vZmZzZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9vZmZzZXQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxMik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RsX29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RsX2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0bF9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGxfaW5kaXJlY3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RsX2luZGlyZWN0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0bF9pbmRpcmVjdF9pbmRleDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdGxfaW5kaXJlY3RfaW5kZXgiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0bF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RsX2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RsX2luZGlyZWN0X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0bF9pbmRpcmVjdF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGxfaW5kZXhfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKLSAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RsX2luZGV4X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3R0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX29mZnNldDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHRfb2Zmc2V0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0dF9pbmRpcmVjdF9vZmZzZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfb2Zmc2V0OwotCi0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHRfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHRfaW5kaXJlY3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3R0X2luZGlyZWN0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3R0X2luZGlyZWN0X2luZGV4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0dF9pbmRpcmVjdF9pbmRleCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHRfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0dF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3R0X2luZGlyZWN0X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0dF9pbmRpcmVjdF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0dF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHRfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7Ci0gICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICBVSU5UIGZfc3JjZHN0OwotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOwotICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RxX29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX29mZnNldDsKLQotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHFfb2Zmc2V0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RxX2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfb2Zmc2V0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RxX2luZGlyZWN0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX3NyY2RzdDsKLSAgICBVSU5UIGZfYWJhc2U7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cV9pbmRpcmVjdCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOwotICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RxX2luZGlyZWN0X2luZGV4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0KLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cV9pbmRpcmVjdF9pbmRleCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cV9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RxX2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cV9pbmRpcmVjdF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfc3JjZHN0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHFfaW5kaXJlY3RfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cV9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX3NjYWxlOwotICAgIFVJTlQgZl9pbmRleDsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLSAgICBmX3NyY2RzdCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9zY2FsZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOwotICAgIGZfaW5kZXggPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOwotICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOwotICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdHFfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9vcHRkaXNwOwotICAgIFVJTlQgZl9zcmNkc3Q7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9zY2FsZTsKLSAgICBVSU5UIGZfaW5kZXg7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0gICAgZl9zcmNkc3QgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX3NjYWxlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7Ci0gICAgZl9pbmRleCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7Ci0gIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICAgIEZMRCAoaW5faF9ncl9hZGRfX0RGTFRfaW5kZXhfb2ZfX0RGTFRfc3Rfc3JjXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOwotICAgICAgRkxEIChpbl9oX2dyX2FkZF9fREZMVF9pbmRleF9vZl9fREZMVF9zdF9zcmNfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7Ci0gICAgICBGTEQgKGluX2hfZ3JfYWRkX19ERkxUX2luZGV4X29mX19ERkxUX3N0X3NyY18zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKLSAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKLSAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcG9iZV9yZWc6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgICBVSU5UIGZfYnJfc3JjMTsKLSAgICBVSU5UIGZfYnJfc3JjMjsKLSAgICBTSSBmX2JyX2Rpc3A7Ci0KLSAgICBmX2JyX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYnJfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfYnJfZGlzcCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTksIDExKSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfYnJfZGlzcCkgPSBmX2JyX2Rpc3A7Ci0gIEZMRCAoaV9icl9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX2JyX3NyYzFdOwotICBGTEQgKGlfYnJfc3JjMikgPSAmIENQVSAoaF9ncilbZl9icl9zcmMyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcG9iZV9yZWciLCAiYnJfZGlzcCAweCV4IiwgJ3gnLCBmX2JyX2Rpc3AsICJicl9zcmMxIDB4JXgiLCAneCcsIGZfYnJfc3JjMSwgImJyX3NyYzIgMHgleCIsICd4JywgZl9icl9zcmMyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYnJfc3JjMSkgPSBmX2JyX3NyYzE7Ci0gICAgICBGTEQgKGluX2JyX3NyYzIpID0gZl9icl9zcmMyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcG9iZV9saXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgICBVSU5UIGZfYnJfc3JjMTsKLSAgICBVSU5UIGZfYnJfc3JjMjsKLSAgICBTSSBmX2JyX2Rpc3A7Ci0KLSAgICBmX2JyX3NyYzEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOwotICAgIGZfYnJfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfYnJfZGlzcCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTksIDExKSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfYnJfc3JjMSkgPSBmX2JyX3NyYzE7Ci0gIEZMRCAoaV9icl9kaXNwKSA9IGZfYnJfZGlzcDsKLSAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXBvYmVfbGl0IiwgImZfYnJfc3JjMSAweCV4IiwgJ3gnLCBmX2JyX3NyYzEsICJicl9kaXNwIDB4JXgiLCAneCcsIGZfYnJfZGlzcCwgImJyX3NyYzIgMHgleCIsICd4JywgZl9icl9zcmMyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYnJfc3JjMikgPSBmX2JyX3NyYzI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY21wb2JsX3JlZzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICAgIFVJTlQgZl9icl9zcmMxOwotICAgIFVJTlQgZl9icl9zcmMyOwotICAgIFNJIGZfYnJfZGlzcDsKLQotICAgIGZfYnJfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9icl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9icl9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxOSwgMTEpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9icl9kaXNwKSA9IGZfYnJfZGlzcDsKLSAgRkxEIChpX2JyX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMV07Ci0gIEZMRCAoaV9icl9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX2JyX3NyYzJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY21wb2JsX3JlZyIsICJicl9kaXNwIDB4JXgiLCAneCcsIGZfYnJfZGlzcCwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfc3JjMiAweCV4IiwgJ3gnLCBmX2JyX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9icl9zcmMxKSA9IGZfYnJfc3JjMTsKLSAgICAgIEZMRCAoaW5fYnJfc3JjMikgPSBmX2JyX3NyYzI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY21wb2JsX2xpdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICAgIFVJTlQgZl9icl9zcmMxOwotICAgIFVJTlQgZl9icl9zcmMyOwotICAgIFNJIGZfYnJfZGlzcDsKLQotICAgIGZfYnJfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0gICAgZl9icl9zcmMyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9icl9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxOSwgMTEpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9icl9zcmMxKSA9IGZfYnJfc3JjMTsKLSAgRkxEIChpX2JyX2Rpc3ApID0gZl9icl9kaXNwOwotICBGTEQgKGlfYnJfc3JjMikgPSAmIENQVSAoaF9ncilbZl9icl9zcmMyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcG9ibF9saXQiLCAiZl9icl9zcmMxIDB4JXgiLCAneCcsIGZfYnJfc3JjMSwgImJyX2Rpc3AgMHgleCIsICd4JywgZl9icl9kaXNwLCAiYnJfc3JjMiAweCV4IiwgJ3gnLCBmX2JyX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9icl9zcmMyKSA9IGZfYnJfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9iYmNfcmVnOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gICAgVUlOVCBmX2JyX3NyYzE7Ci0gICAgVUlOVCBmX2JyX3NyYzI7Ci0gICAgU0kgZl9icl9kaXNwOwotCi0gICAgZl9icl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2JyX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX2JyX2Rpc3AgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE5LCAxMSkpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2JyX2Rpc3ApID0gZl9icl9kaXNwOwotICBGTEQgKGlfYnJfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9icl9zcmMxXTsKLSAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iYmNfcmVnIiwgImJyX2Rpc3AgMHgleCIsICd4JywgZl9icl9kaXNwLCAiYnJfc3JjMSAweCV4IiwgJ3gnLCBmX2JyX3NyYzEsICJicl9zcmMyIDB4JXgiLCAneCcsIGZfYnJfc3JjMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2JyX3NyYzEpID0gZl9icl9zcmMxOwotICAgICAgRkxEIChpbl9icl9zcmMyKSA9IGZfYnJfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9iYmNfbGl0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gICAgVUlOVCBmX2JyX3NyYzE7Ci0gICAgVUlOVCBmX2JyX3NyYzI7Ci0gICAgU0kgZl9icl9kaXNwOwotCi0gICAgZl9icl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA1KTsKLSAgICBmX2JyX3NyYzIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX2JyX2Rpc3AgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE5LCAxMSkpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2JyX3NyYzEpID0gZl9icl9zcmMxOwotICBGTEQgKGlfYnJfZGlzcCkgPSBmX2JyX2Rpc3A7Ci0gIEZMRCAoaV9icl9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX2JyX3NyYzJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmJjX2xpdCIsICJmX2JyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfZGlzcCAweCV4IiwgJ3gnLCBmX2JyX2Rpc3AsICJicl9zcmMyIDB4JXgiLCAneCcsIGZfYnJfc3JjMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2JyX3NyYzIpID0gZl9icl9zcmMyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcGkiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBpMToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXBpMSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBpMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXBpMiIsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBpMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY21waTMiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcG86Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcG8iLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBvMToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXBvMSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBvMjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jbXBvMiIsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBvMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgICBVSU5UIGZfc3JjMjsKLSAgICBVSU5UIGZfc3JjMTsKLQotICAgIGZfc3JjMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKLSAgRkxEIChmX3NyYzIpID0gZl9zcmMyOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY21wbzMiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3Rlc3Rub19yZWc6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgICBVSU5UIGZfYnJfc3JjMTsKLQotICAgIGZfYnJfc3JjMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2JyX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF90ZXN0bm9fcmVnIiwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2JyX3NyYzEpID0gZl9icl9zcmMxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JubzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gICAgU0kgZl9jdHJsX2Rpc3A7Ci0KLSAgICBmX2N0cmxfZGlzcCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgOCwgMjIpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9jdHJsX2Rpc3ApID0gZl9jdHJsX2Rpc3A7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibm8iLCAiY3RybF9kaXNwIDB4JXgiLCAneCcsIGZfY3RybF9kaXNwLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9iOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgICBTSSBmX2N0cmxfZGlzcDsKLQotICAgIGZfY3RybF9kaXNwID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCA4LCAyMikpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2N0cmxfZGlzcCkgPSBmX2N0cmxfZGlzcDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2IiLCAiY3RybF9kaXNwIDB4JXgiLCAneCcsIGZfY3RybF9kaXNwLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ieF9pbmRpcmVjdF9vZmZzZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfYWJhc2U7Ci0gICAgVUlOVCBmX29mZnNldDsKLQotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLSAgICBmX29mZnNldCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMjAsIDEyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYnhfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYnhfaW5kaXJlY3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgICBVSU5UIGZfYWJhc2U7Ci0KLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2J4X2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2J4X2luZGlyZWN0X2luZGV4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICAgIFVJTlQgZl9hYmFzZTsKLSAgICBVSU5UIGZfc2NhbGU7Ci0gICAgVUlOVCBmX2luZGV4OwotCi0gICAgZl9hYmFzZSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOwotICAgIGZfc2NhbGUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsKLSAgICBmX2luZGV4ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ieF9pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYnhfZGlzcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgICBVSU5UIGZfb3B0ZGlzcDsKLSAgICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLwotICAgIFVJTlQgd29yZF8xOwotCi0gIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOwotICAgIGZfb3B0ZGlzcCA9ICgwfChFWFRSQUNUX01TQjBfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ieF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2J4X2luZGlyZWN0X2Rpc3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgVUlOVCBmX2FiYXNlOwotICAgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovCi0gICAgVUlOVCB3b3JkXzE7Ci0KLSAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7Ci0gICAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfTVNCMF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOwotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7Ci0gIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ieF9pbmRpcmVjdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jYWxseF9kaXNwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbHhfZGlzcC5mCi0gICAgVUlOVCBmX29wdGRpc3A7Ci0gICAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8KLSAgICBVSU5UIHdvcmRfMTsKLQotICB3b3JkXzEgPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMgKyA0KTsKLSAgICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9NU0IwX1VJTlQgKHdvcmRfMSwgMzIsIDAsIDMyKSA8PCAwKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY2FsbHhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8wKSA9IDA7Ci0gICAgICBGTEQgKGluX2hfZ3JfMSkgPSAxOwotICAgICAgRkxEIChpbl9oX2dyXzEwKSA9IDEwOwotICAgICAgRkxEIChpbl9oX2dyXzExKSA9IDExOwotICAgICAgRkxEIChpbl9oX2dyXzEyKSA9IDEyOwotICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OwotICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChpbl9oX2dyXzIpID0gMjsKLSAgICAgIEZMRCAoaW5faF9ncl8zKSA9IDM7Ci0gICAgICBGTEQgKGluX2hfZ3JfMzEpID0gMzE7Ci0gICAgICBGTEQgKGluX2hfZ3JfNCkgPSA0OwotICAgICAgRkxEIChpbl9oX2dyXzUpID0gNTsKLSAgICAgIEZMRCAoaW5faF9ncl82KSA9IDY7Ci0gICAgICBGTEQgKGluX2hfZ3JfNykgPSA3OwotICAgICAgRkxEIChpbl9oX2dyXzgpID0gODsKLSAgICAgIEZMRCAoaW5faF9ncl85KSA9IDk7Ci0gICAgICBGTEQgKG91dF9oX2dyXzApID0gMDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMSkgPSAxOwotICAgICAgRkxEIChvdXRfaF9ncl8xMCkgPSAxMDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTEpID0gMTE7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEyKSA9IDEyOwotICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OwotICAgICAgRkxEIChvdXRfaF9ncl8yKSA9IDI7Ci0gICAgICBGTEQgKG91dF9oX2dyXzMpID0gMzsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMzEpID0gMzE7Ci0gICAgICBGTEQgKG91dF9oX2dyXzQpID0gNDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNSkgPSA1OwotICAgICAgRkxEIChvdXRfaF9ncl82KSA9IDY7Ci0gICAgICBGTEQgKG91dF9oX2dyXzcpID0gNzsKLSAgICAgIEZMRCAob3V0X2hfZ3JfOCkgPSA4OwotICAgICAgRkxEIChvdXRfaF9ncl85KSA9IDk7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY2FsbHhfaW5kaXJlY3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9pbmRpcmVjdF9vZmZzZXQuZgotICAgIFVJTlQgZl9hYmFzZTsKLQotICAgIGZfYWJhc2UgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY2FsbHhfaW5kaXJlY3QiLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7Ci0gICAgICBGTEQgKGluX2hfZ3JfMCkgPSAwOwotICAgICAgRkxEIChpbl9oX2dyXzEpID0gMTsKLSAgICAgIEZMRCAoaW5faF9ncl8xMCkgPSAxMDsKLSAgICAgIEZMRCAoaW5faF9ncl8xMSkgPSAxMTsKLSAgICAgIEZMRCAoaW5faF9ncl8xMikgPSAxMjsKLSAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKLSAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKLSAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAoaW5faF9ncl8yKSA9IDI7Ci0gICAgICBGTEQgKGluX2hfZ3JfMykgPSAzOwotICAgICAgRkxEIChpbl9oX2dyXzMxKSA9IDMxOwotICAgICAgRkxEIChpbl9oX2dyXzQpID0gNDsKLSAgICAgIEZMRCAoaW5faF9ncl81KSA9IDU7Ci0gICAgICBGTEQgKGluX2hfZ3JfNikgPSA2OwotICAgICAgRkxEIChpbl9oX2dyXzcpID0gNzsKLSAgICAgIEZMRCAoaW5faF9ncl84KSA9IDg7Ci0gICAgICBGTEQgKGluX2hfZ3JfOSkgPSA5OwotICAgICAgRkxEIChvdXRfaF9ncl8wKSA9IDA7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEpID0gMTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTApID0gMTA7Ci0gICAgICBGTEQgKG91dF9oX2dyXzExKSA9IDExOwotICAgICAgRkxEIChvdXRfaF9ncl8xMikgPSAxMjsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChvdXRfaF9ncl8zKSA9IDM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzMxKSA9IDMxOwotICAgICAgRkxEIChvdXRfaF9ncl80KSA9IDQ7Ci0gICAgICBGTEQgKG91dF9oX2dyXzUpID0gNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNikgPSA2OwotICAgICAgRkxEIChvdXRfaF9ncl83KSA9IDc7Ci0gICAgICBGTEQgKG91dF9oX2dyXzgpID0gODsKLSAgICAgIEZMRCAob3V0X2hfZ3JfOSkgPSA5OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NhbGx4X2luZGlyZWN0X29mZnNldDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2luZGlyZWN0X29mZnNldC5mCi0gICAgVUlOVCBmX2FiYXNlOwotICAgIFVJTlQgZl9vZmZzZXQ7Ci0KLSAgICBmX2FiYXNlID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMywgNSk7Ci0gICAgZl9vZmZzZXQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDIwLCAxMik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKLSAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NhbGx4X2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOwotICAgICAgRkxEIChpbl9oX2dyXzApID0gMDsKLSAgICAgIEZMRCAoaW5faF9ncl8xKSA9IDE7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTApID0gMTA7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTEpID0gMTE7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTIpID0gMTI7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7Ci0gICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChpbl9oX2dyXzMpID0gMzsKLSAgICAgIEZMRCAoaW5faF9ncl8zMSkgPSAzMTsKLSAgICAgIEZMRCAoaW5faF9ncl80KSA9IDQ7Ci0gICAgICBGTEQgKGluX2hfZ3JfNSkgPSA1OwotICAgICAgRkxEIChpbl9oX2dyXzYpID0gNjsKLSAgICAgIEZMRCAoaW5faF9ncl83KSA9IDc7Ci0gICAgICBGTEQgKGluX2hfZ3JfOCkgPSA4OwotICAgICAgRkxEIChpbl9oX2dyXzkpID0gOTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMCkgPSAwOwotICAgICAgRkxEIChvdXRfaF9ncl8xKSA9IDE7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEwKSA9IDEwOwotICAgICAgRkxEIChvdXRfaF9ncl8xMSkgPSAxMTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTIpID0gMTI7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOwotICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzIpID0gMjsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMykgPSAzOwotICAgICAgRkxEIChvdXRfaF9ncl8zMSkgPSAzMTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNCkgPSA0OwotICAgICAgRkxEIChvdXRfaF9ncl81KSA9IDU7Ci0gICAgICBGTEQgKG91dF9oX2dyXzYpID0gNjsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNykgPSA3OwotICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7Ci0gICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9yZXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmaTk2MGJhc2VfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9yZXQiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5faF9ncl8wKSA9IDA7Ci0gICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChpbl9oX2dyXzMxKSA9IDMxOwotICAgICAgRkxEIChvdXRfaF9ncl8wKSA9IDA7Ci0gICAgICBGTEQgKG91dF9oX2dyXzEpID0gMTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTApID0gMTA7Ci0gICAgICBGTEQgKG91dF9oX2dyXzExKSA9IDExOwotICAgICAgRkxEIChvdXRfaF9ncl8xMikgPSAxMjsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMikgPSAyOwotICAgICAgRkxEIChvdXRfaF9ncl8zKSA9IDM7Ci0gICAgICBGTEQgKG91dF9oX2dyXzMxKSA9IDMxOwotICAgICAgRkxEIChvdXRfaF9ncl80KSA9IDQ7Ci0gICAgICBGTEQgKG91dF9oX2dyXzUpID0gNTsKLSAgICAgIEZMRCAob3V0X2hfZ3JfNikgPSA2OwotICAgICAgRkxEIChvdXRfaF9ncl83KSA9IDc7Ci0gICAgICBGTEQgKG91dF9oX2dyXzgpID0gODsKLSAgICAgIEZMRCAob3V0X2hfZ3JfOSkgPSA5OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NhbGxzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICAgIFVJTlQgZl9zcmMxOwotCi0gICAgZl9zcmMxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAyNywgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9jYWxscyIsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2ZtYXJrOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJmk5NjBiYXNlX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZm1hcmsiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9mbHVzaHJlZzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZpOTYwYmFzZV9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2ZsdXNocmVnIiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2RlY29kZS5oIGIvc2ltL2k5NjAvZGVjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGUwMjcuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvZGVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogRGVjb2RlIGhlYWRlciBmb3IgaTk2MGJhc2UuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgSTk2MEJBU0VfREVDT0RFX0gKLSNkZWZpbmUgSTk2MEJBU0VfREVDT0RFX0gKLQotZXh0ZXJuIGNvbnN0IElERVNDICppOTYwYmFzZV9kZWNvZGUgKFNJTV9DUFUgKiwgSUFERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dFTl9JTlNOX0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCVUYgKik7Ci1leHRlcm4gdm9pZCBpOTYwYmFzZV9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICopOwotZXh0ZXJuIHZvaWQgaTk2MGJhc2Vfc2VtX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBpOTYwYmFzZV9zZW1mX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9ucyBpbiBjcHUgZmFtaWx5IGk5NjBiYXNlLiAgKi8KLXR5cGVkZWYgZW51bSBpOTYwYmFzZV9pbnNuX3R5cGUgewotICBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgSTk2MEJBU0VfSU5TTl9YX0FGVEVSLCBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCBJOTYwQkFTRV9JTlNOX1hfQ1RJX0NIQUlOCi0gLCBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sIEk5NjBCQVNFX0lOU05fWF9CRUdJTiwgSTk2MEJBU0VfSU5TTl9NVUxPLCBJOTYwQkFTRV9JTlNOX01VTE8xCi0gLCBJOTYwQkFTRV9JTlNOX01VTE8yLCBJOTYwQkFTRV9JTlNOX01VTE8zLCBJOTYwQkFTRV9JTlNOX1JFTU8sIEk5NjBCQVNFX0lOU05fUkVNTzEKLSAsIEk5NjBCQVNFX0lOU05fUkVNTzIsIEk5NjBCQVNFX0lOU05fUkVNTzMsIEk5NjBCQVNFX0lOU05fRElWTywgSTk2MEJBU0VfSU5TTl9ESVZPMQotICwgSTk2MEJBU0VfSU5TTl9ESVZPMiwgSTk2MEJBU0VfSU5TTl9ESVZPMywgSTk2MEJBU0VfSU5TTl9SRU1JLCBJOTYwQkFTRV9JTlNOX1JFTUkxCi0gLCBJOTYwQkFTRV9JTlNOX1JFTUkyLCBJOTYwQkFTRV9JTlNOX1JFTUkzLCBJOTYwQkFTRV9JTlNOX0RJVkksIEk5NjBCQVNFX0lOU05fRElWSTEKLSAsIEk5NjBCQVNFX0lOU05fRElWSTIsIEk5NjBCQVNFX0lOU05fRElWSTMsIEk5NjBCQVNFX0lOU05fQURETywgSTk2MEJBU0VfSU5TTl9BRERPMQotICwgSTk2MEJBU0VfSU5TTl9BRERPMiwgSTk2MEJBU0VfSU5TTl9BRERPMywgSTk2MEJBU0VfSU5TTl9TVUJPLCBJOTYwQkFTRV9JTlNOX1NVQk8xCi0gLCBJOTYwQkFTRV9JTlNOX1NVQk8yLCBJOTYwQkFTRV9JTlNOX1NVQk8zLCBJOTYwQkFTRV9JTlNOX05PVEJJVCwgSTk2MEJBU0VfSU5TTl9OT1RCSVQxCi0gLCBJOTYwQkFTRV9JTlNOX05PVEJJVDIsIEk5NjBCQVNFX0lOU05fTk9UQklUMywgSTk2MEJBU0VfSU5TTl9BTkQsIEk5NjBCQVNFX0lOU05fQU5EMQotICwgSTk2MEJBU0VfSU5TTl9BTkQyLCBJOTYwQkFTRV9JTlNOX0FORDMsIEk5NjBCQVNFX0lOU05fQU5ETk9ULCBJOTYwQkFTRV9JTlNOX0FORE5PVDEKLSAsIEk5NjBCQVNFX0lOU05fQU5ETk9UMiwgSTk2MEJBU0VfSU5TTl9BTkROT1QzLCBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgSTk2MEJBU0VfSU5TTl9TRVRCSVQxCi0gLCBJOTYwQkFTRV9JTlNOX1NFVEJJVDIsIEk5NjBCQVNFX0lOU05fU0VUQklUMywgSTk2MEJBU0VfSU5TTl9OT1RBTkQsIEk5NjBCQVNFX0lOU05fTk9UQU5EMQotICwgSTk2MEJBU0VfSU5TTl9OT1RBTkQyLCBJOTYwQkFTRV9JTlNOX05PVEFORDMsIEk5NjBCQVNFX0lOU05fWE9SLCBJOTYwQkFTRV9JTlNOX1hPUjEKLSAsIEk5NjBCQVNFX0lOU05fWE9SMiwgSTk2MEJBU0VfSU5TTl9YT1IzLCBJOTYwQkFTRV9JTlNOX09SLCBJOTYwQkFTRV9JTlNOX09SMQotICwgSTk2MEJBU0VfSU5TTl9PUjIsIEk5NjBCQVNFX0lOU05fT1IzLCBJOTYwQkFTRV9JTlNOX05PUiwgSTk2MEJBU0VfSU5TTl9OT1IxCi0gLCBJOTYwQkFTRV9JTlNOX05PUjIsIEk5NjBCQVNFX0lOU05fTk9SMywgSTk2MEJBU0VfSU5TTl9YTk9SLCBJOTYwQkFTRV9JTlNOX1hOT1IxCi0gLCBJOTYwQkFTRV9JTlNOX1hOT1IyLCBJOTYwQkFTRV9JTlNOX1hOT1IzLCBJOTYwQkFTRV9JTlNOX05PVCwgSTk2MEJBU0VfSU5TTl9OT1QxCi0gLCBJOTYwQkFTRV9JTlNOX05PVDIsIEk5NjBCQVNFX0lOU05fTk9UMywgSTk2MEJBU0VfSU5TTl9PUk5PVCwgSTk2MEJBU0VfSU5TTl9PUk5PVDEKLSAsIEk5NjBCQVNFX0lOU05fT1JOT1QyLCBJOTYwQkFTRV9JTlNOX09STk9UMywgSTk2MEJBU0VfSU5TTl9DTFJCSVQsIEk5NjBCQVNFX0lOU05fQ0xSQklUMQotICwgSTk2MEJBU0VfSU5TTl9DTFJCSVQyLCBJOTYwQkFTRV9JTlNOX0NMUkJJVDMsIEk5NjBCQVNFX0lOU05fU0hMTywgSTk2MEJBU0VfSU5TTl9TSExPMQotICwgSTk2MEJBU0VfSU5TTl9TSExPMiwgSTk2MEJBU0VfSU5TTl9TSExPMywgSTk2MEJBU0VfSU5TTl9TSFJPLCBJOTYwQkFTRV9JTlNOX1NIUk8xCi0gLCBJOTYwQkFTRV9JTlNOX1NIUk8yLCBJOTYwQkFTRV9JTlNOX1NIUk8zLCBJOTYwQkFTRV9JTlNOX1NITEksIEk5NjBCQVNFX0lOU05fU0hMSTEKLSAsIEk5NjBCQVNFX0lOU05fU0hMSTIsIEk5NjBCQVNFX0lOU05fU0hMSTMsIEk5NjBCQVNFX0lOU05fU0hSSSwgSTk2MEJBU0VfSU5TTl9TSFJJMQotICwgSTk2MEJBU0VfSU5TTl9TSFJJMiwgSTk2MEJBU0VfSU5TTl9TSFJJMywgSTk2MEJBU0VfSU5TTl9FTVVMLCBJOTYwQkFTRV9JTlNOX0VNVUwxCi0gLCBJOTYwQkFTRV9JTlNOX0VNVUwyLCBJOTYwQkFTRV9JTlNOX0VNVUwzLCBJOTYwQkFTRV9JTlNOX01PViwgSTk2MEJBU0VfSU5TTl9NT1YxCi0gLCBJOTYwQkFTRV9JTlNOX01PVkwsIEk5NjBCQVNFX0lOU05fTU9WTDEsIEk5NjBCQVNFX0lOU05fTU9WVCwgSTk2MEJBU0VfSU5TTl9NT1ZUMQotICwgSTk2MEJBU0VfSU5TTl9NT1ZRLCBJOTYwQkFTRV9JTlNOX01PVlExLCBJOTYwQkFTRV9JTlNOX01PRFBDLCBJOTYwQkFTRV9JTlNOX01PREFDCi0gLCBJOTYwQkFTRV9JTlNOX0xEQV9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0xEQV9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX0xEX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fTERfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUAotICwgSTk2MEJBU0VfSU5TTl9MRE9CX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fTERPQl9ESVNQLCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX0xET1NfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWAotICwgSTk2MEJBU0VfSU5TTl9MRE9TX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1AKLSAsIEk5NjBCQVNFX0lOU05fTERJQl9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0xESUJfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUAotICwgSTk2MEJBU0VfSU5TTl9MRElTX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fTERJU19ESVNQLCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElTX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0xETF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xETF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX0xEVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0xEVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX0xEUV9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0xEUV9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX1NUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fU1RfRElTUCwgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUAotICwgSTk2MEJBU0VfSU5TTl9TVE9CX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fU1RPQl9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQCi0gLCBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWAotICwgSTk2MEJBU0VfSU5TTl9TVE9TX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AKLSAsIEk5NjBCQVNFX0lOU05fU1RMX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fU1RMX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AKLSAsIEk5NjBCQVNFX0lOU05fU1RUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fU1RUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1AKLSAsIEk5NjBCQVNFX0lOU05fU1RRX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgKLSAsIEk5NjBCQVNFX0lOU05fU1RRX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AKLSAsIEk5NjBCQVNFX0lOU05fQ01QT0JFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQkVfTElULCBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfTElUCi0gLCBJOTYwQkFTRV9JTlNOX0NNUE9CTF9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JMX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX0xJVAotICwgSTk2MEJBU0VfSU5TTl9DTVBPQkdfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CR19MSVQsIEk5NjBCQVNFX0lOU05fQ01QT0JHRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JHRV9MSVQKLSAsIEk5NjBCQVNFX0lOU05fQ01QSUJFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQkVfTElULCBJOTYwQkFTRV9JTlNOX0NNUElCTkVfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCTkVfTElUCi0gLCBJOTYwQkFTRV9JTlNOX0NNUElCTF9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJMX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX0xJVAotICwgSTk2MEJBU0VfSU5TTl9DTVBJQkdfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCR19MSVQsIEk5NjBCQVNFX0lOU05fQ01QSUJHRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJHRV9MSVQKLSAsIEk5NjBCQVNFX0lOU05fQkJDX1JFRywgSTk2MEJBU0VfSU5TTl9CQkNfTElULCBJOTYwQkFTRV9JTlNOX0JCU19SRUcsIEk5NjBCQVNFX0lOU05fQkJTX0xJVAotICwgSTk2MEJBU0VfSU5TTl9DTVBJLCBJOTYwQkFTRV9JTlNOX0NNUEkxLCBJOTYwQkFTRV9JTlNOX0NNUEkyLCBJOTYwQkFTRV9JTlNOX0NNUEkzCi0gLCBJOTYwQkFTRV9JTlNOX0NNUE8sIEk5NjBCQVNFX0lOU05fQ01QTzEsIEk5NjBCQVNFX0lOU05fQ01QTzIsIEk5NjBCQVNFX0lOU05fQ01QTzMKLSAsIEk5NjBCQVNFX0lOU05fVEVTVE5PX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUR19SRUcsIEk5NjBCQVNFX0lOU05fVEVTVEVfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RHRV9SRUcKLSAsIEk5NjBCQVNFX0lOU05fVEVTVExfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RORV9SRUcsIEk5NjBCQVNFX0lOU05fVEVTVExFX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUT19SRUcKLSAsIEk5NjBCQVNFX0lOU05fQk5PLCBJOTYwQkFTRV9JTlNOX0JHLCBJOTYwQkFTRV9JTlNOX0JFLCBJOTYwQkFTRV9JTlNOX0JHRQotICwgSTk2MEJBU0VfSU5TTl9CTCwgSTk2MEJBU0VfSU5TTl9CTkUsIEk5NjBCQVNFX0lOU05fQkxFLCBJOTYwQkFTRV9JTlNOX0JPCi0gLCBJOTYwQkFTRV9JTlNOX0IsIEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0lOREVYCi0gLCBJOTYwQkFTRV9JTlNOX0JYX0RJU1AsIEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9DQUxMWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUCi0gLCBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9SRVQsIEk5NjBCQVNFX0lOU05fQ0FMTFMsIEk5NjBCQVNFX0lOU05fRk1BUksKLSAsIEk5NjBCQVNFX0lOU05fRkxVU0hSRUcsIEk5NjBCQVNFX0lOU05fTUFYCi19IEk5NjBCQVNFX0lOU05fVFlQRTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igc2VtYW50aWMgZm9ybWF0cyBpbiBjcHUgZmFtaWx5IGk5NjBiYXNlLiAgKi8KLXR5cGVkZWYgZW51bSBpOTYwYmFzZV9zZm10X3R5cGUgewotICBJOTYwQkFTRV9TRk1UX0VNUFRZLCBJOTYwQkFTRV9TRk1UX01VTE8sIEk5NjBCQVNFX1NGTVRfTVVMTzEsIEk5NjBCQVNFX1NGTVRfTVVMTzIKLSAsIEk5NjBCQVNFX1NGTVRfTVVMTzMsIEk5NjBCQVNFX1NGTVRfTk9UQklULCBJOTYwQkFTRV9TRk1UX05PVEJJVDEsIEk5NjBCQVNFX1NGTVRfTk9UQklUMgotICwgSTk2MEJBU0VfU0ZNVF9OT1RCSVQzLCBJOTYwQkFTRV9TRk1UX05PVCwgSTk2MEJBU0VfU0ZNVF9OT1QxLCBJOTYwQkFTRV9TRk1UX1NITE8KLSAsIEk5NjBCQVNFX1NGTVRfU0hMTzEsIEk5NjBCQVNFX1NGTVRfU0hMTzIsIEk5NjBCQVNFX1NGTVRfU0hMTzMsIEk5NjBCQVNFX1NGTVRfRU1VTAotICwgSTk2MEJBU0VfU0ZNVF9FTVVMMSwgSTk2MEJBU0VfU0ZNVF9FTVVMMiwgSTk2MEJBU0VfU0ZNVF9FTVVMMywgSTk2MEJBU0VfU0ZNVF9NT1ZMCi0gLCBJOTYwQkFTRV9TRk1UX01PVkwxLCBJOTYwQkFTRV9TRk1UX01PVlQsIEk5NjBCQVNFX1NGTVRfTU9WVDEsIEk5NjBCQVNFX1NGTVRfTU9WUQotICwgSTk2MEJBU0VfU0ZNVF9NT1ZRMSwgSTk2MEJBU0VfU0ZNVF9NT0RQQywgSTk2MEJBU0VfU0ZNVF9MREFfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX0xEQV9JTkRJUkVDVF9PRkZTRVQKLSAsIEk5NjBCQVNFX1NGTVRfTERBX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xEQV9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9MREFfRElTUCwgSTk2MEJBU0VfU0ZNVF9MREFfSU5ESVJFQ1RfRElTUAotICwgSTk2MEJBU0VfU0ZNVF9MREFfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9MRF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfT0ZGU0VUCi0gLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNULCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX0xEX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERfSU5ESVJFQ1RfRElTUAotICwgSTk2MEJBU0VfU0ZNVF9MRF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0xEX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERMX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRExfSU5ESVJFQ1RfT0ZGU0VUCi0gLCBJOTYwQkFTRV9TRk1UX0xETF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9MRExfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfTERMX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERMX0lORElSRUNUX0RJU1AKLSAsIEk5NjBCQVNFX1NGTVRfTERMX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERMX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERUX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRFRfSU5ESVJFQ1RfT0ZGU0VUCi0gLCBJOTYwQkFTRV9TRk1UX0xEVF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9MRFRfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfTERUX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERUX0lORElSRUNUX0RJU1AKLSAsIEk5NjBCQVNFX1NGTVRfTERUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERRX09GRlNFVCwgSTk2MEJBU0VfU0ZNVF9MRFFfSU5ESVJFQ1RfT0ZGU0VUCi0gLCBJOTYwQkFTRV9TRk1UX0xEUV9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9MRFFfSU5ESVJFQ1RfSU5ERVgsIEk5NjBCQVNFX1NGTVRfTERRX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERRX0lORElSRUNUX0RJU1AKLSAsIEk5NjBCQVNFX1NGTVRfTERRX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfTERRX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBCQVNFX1NGTVRfU1RfT0ZGU0VULCBJOTYwQkFTRV9TRk1UX1NUX0lORElSRUNUX09GRlNFVAotICwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9TVF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUX0lORElSRUNUX0RJU1AKLSAsIEk5NjBCQVNFX1NGTVRfU1RfSU5ERVhfRElTUCwgSTk2MEJBU0VfU0ZNVF9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUTF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfU1RMX0lORElSRUNUX09GRlNFVAotICwgSTk2MEJBU0VfU0ZNVF9TVExfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfU1RMX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX1NUTF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUTF9JTkRJUkVDVF9ESVNQCi0gLCBJOTYwQkFTRV9TRk1UX1NUTF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfU1RUX0lORElSRUNUX09GRlNFVAotICwgSTk2MEJBU0VfU0ZNVF9TVFRfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfU1RUX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX1NUVF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUVF9JTkRJUkVDVF9ESVNQCi0gLCBJOTYwQkFTRV9TRk1UX1NUVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUUV9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfU1RRX0lORElSRUNUX09GRlNFVAotICwgSTk2MEJBU0VfU0ZNVF9TVFFfSU5ESVJFQ1QsIEk5NjBCQVNFX1NGTVRfU1RRX0lORElSRUNUX0lOREVYLCBJOTYwQkFTRV9TRk1UX1NUUV9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUUV9JTkRJUkVDVF9ESVNQCi0gLCBJOTYwQkFTRV9TRk1UX1NUUV9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0NNUE9CRV9SRUcsIEk5NjBCQVNFX1NGTVRfQ01QT0JFX0xJVAotICwgSTk2MEJBU0VfU0ZNVF9DTVBPQkxfUkVHLCBJOTYwQkFTRV9TRk1UX0NNUE9CTF9MSVQsIEk5NjBCQVNFX1NGTVRfQkJDX1JFRywgSTk2MEJBU0VfU0ZNVF9CQkNfTElUCi0gLCBJOTYwQkFTRV9TRk1UX0NNUEksIEk5NjBCQVNFX1NGTVRfQ01QSTEsIEk5NjBCQVNFX1NGTVRfQ01QSTIsIEk5NjBCQVNFX1NGTVRfQ01QSTMKLSAsIEk5NjBCQVNFX1NGTVRfQ01QTywgSTk2MEJBU0VfU0ZNVF9DTVBPMSwgSTk2MEJBU0VfU0ZNVF9DTVBPMiwgSTk2MEJBU0VfU0ZNVF9DTVBPMwotICwgSTk2MEJBU0VfU0ZNVF9URVNUTk9fUkVHLCBJOTYwQkFTRV9TRk1UX0JOTywgSTk2MEJBU0VfU0ZNVF9CLCBJOTYwQkFTRV9TRk1UX0JYX0lORElSRUNUX09GRlNFVAotICwgSTk2MEJBU0VfU0ZNVF9CWF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9CWF9JTkRJUkVDVF9JTkRFWCwgSTk2MEJBU0VfU0ZNVF9CWF9ESVNQLCBJOTYwQkFTRV9TRk1UX0JYX0lORElSRUNUX0RJU1AKLSAsIEk5NjBCQVNFX1NGTVRfQ0FMTFhfRElTUCwgSTk2MEJBU0VfU0ZNVF9DQUxMWF9JTkRJUkVDVCwgSTk2MEJBU0VfU0ZNVF9DQUxMWF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX1NGTVRfUkVUCi0gLCBJOTYwQkFTRV9TRk1UX0NBTExTLCBJOTYwQkFTRV9TRk1UX0ZNQVJLLCBJOTYwQkFTRV9TRk1UX0ZMVVNIUkVHCi19IEk5NjBCQVNFX1NGTVRfVFlQRTsKLQotLyogRnVuY3Rpb24gdW5pdCBoYW5kbGVycyAodXNlciB3cml0dGVuKS4gICovCi0KLWV4dGVybiBpbnQgaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8pOwotZXh0ZXJuIGludCBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLyk7Ci0KLS8qIFByb2ZpbGluZyBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgKHVzZXIgd3JpdHRlbikgKi8KLQotZXh0ZXJuIHZvaWQgaTk2MGJhc2VfbW9kZWxfaW5zbl9iZWZvcmUgKFNJTV9DUFUgKiwgaW50IC8qZmlyc3RfcCovKTsKLWV4dGVybiB2b2lkIGk5NjBiYXNlX21vZGVsX2luc25fYWZ0ZXIgKFNJTV9DUFUgKiwgaW50IC8qbGFzdF9wKi8sIGludCAvKmN5Y2xlcyovKTsKLQotI2VuZGlmIC8qIEk5NjBCQVNFX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9kZXZpY2VzLmMgYi9zaW0vaTk2MC9kZXZpY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDc1NjkuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvZGV2aWNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qIGk5NjAgZGV2aWNlIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLSNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKLSNpbmNsdWRlICJkdi1zb2Nrc2VyLmgiCi0jZW5kaWYKLQotLyogSGFuZGxpbmcgdGhlIE1TUFIgcmVnaXN0ZXIgaXMgZG9uZSBieSBjcmVhdGluZyBhIGRldmljZSBpbiB0aGUgY29yZQotICAgbWFwcGluZyB0aGF0IHdpbmRzIHVwIGhlcmUuICAqLwotCi1kZXZpY2UgaTk2MF9kZXZpY2VzOwotCi1pbnQKLWRldmljZV9pb19yZWFkX2J1ZmZlciAoZGV2aWNlICptZSwgdm9pZCAqc291cmNlLCBpbnQgc3BhY2UsCi0JCSAgICAgICBhZGRyZXNzX3dvcmQgYWRkciwgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgICBTSU1fREVTQyBzZCwgU0lNX0NQVSAqY3B1LCBzaW1fY2lhIGNpYSkKLXsKLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQotICAgIHJldHVybiBucl9ieXRlczsKLQotI2lmZGVmIEhBVkVfRFZfU09DS1NFUgotICBpZiAoYWRkciA9PSBVQVJUX0lOQ0hBUl9BRERSKQotICAgIHsKLSAgICAgIGludCBjID0gZHZfc29ja3Nlcl9yZWFkIChzZCk7Ci0gICAgICBpZiAoYyA9PSAtMSkKLQlyZXR1cm4gMDsKLSAgICAgICooY2hhciAqKSBzb3VyY2UgPSBjOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYWRkciA9PSBVQVJUX1NUQVRVU19BRERSKQotICAgIHsKLSAgICAgIGludCBzdGF0dXMgPSBkdl9zb2Nrc2VyX3N0YXR1cyAoc2QpOwotICAgICAgdW5zaWduZWQgY2hhciAqcCA9IHNvdXJjZTsKLSAgICAgIHBbMF0gPSAwOwotICAgICAgcFsxXSA9ICgoKHN0YXR1cyAmIERWX1NPQ0tTRVJfSU5QVVRfRU1QVFkpCi0jaWZkZWYgVUFSVF9JTlBVVF9SRUFEWTAKLQkgICAgICAgPyBVQVJUX0lOUFVUX1JFQURZIDogMCkKLSNlbHNlCi0JICAgICAgID8gMCA6IFVBUlRfSU5QVVRfUkVBRFkpCi0jZW5kaWYKLQkgICAgICArICgoc3RhdHVzICYgRFZfU09DS1NFUl9PVVRQVVRfRU1QVFkpID8gVUFSVF9PVVRQVVRfUkVBRFkgOiAwKSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLWludAotZGV2aWNlX2lvX3dyaXRlX2J1ZmZlciAoZGV2aWNlICptZSwgY29uc3Qgdm9pZCAqc291cmNlLCBpbnQgc3BhY2UsCi0JCQlhZGRyZXNzX3dvcmQgYWRkciwgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQlTSU1fREVTQyBzZCwgU0lNX0NQVSAqY3B1LCBzaW1fY2lhIGNpYSkKLXsKLSNpZiBXSVRIX1NDQUNIRQotICAvKiBNU1BSIHN1cHBvcnQgaXMgZGVwcmVjYXRlZCBidXQgaXMga2VwdCBpbiBmb3IgdXB3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgd2l0aCBleGlzdGluZyBvdmVybGF5IHN1cHBvcnQuICAqLwotICBpZiAoYWRkciA9PSBNU1BSX0FERFIpCi0gICAgewotICAgICAgaWYgKCgqKGNvbnN0IGNoYXIgKikgc291cmNlICYgTVNQUl9QVVJHRSkgIT0gMCkKLQlzY2FjaGVfZmx1c2ggKHNkKTsKLSAgICAgIHJldHVybiBucl9ieXRlczsKLSAgICB9Ci0gIGlmIChhZGRyID09IE1DQ1JfQUREUikKLSAgICB7Ci0gICAgICBpZiAoKCooY29uc3QgY2hhciAqKSBzb3VyY2UgJiBNQ0NSX0NQKSAhPSAwKQotCXNjYWNoZV9mbHVzaCAoc2QpOwotICAgICAgcmV0dXJuIG5yX2J5dGVzOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpICE9IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICByZXR1cm4gbnJfYnl0ZXM7Ci0KLSNpZiBIQVZFX0RWX1NPQ0tTRVIKLSAgaWYgKGFkZHIgPT0gVUFSVF9PVVRDSEFSX0FERFIpCi0gICAgewotICAgICAgaW50IHJjID0gZHZfc29ja3Nlcl93cml0ZSAoc2QsICooY2hhciAqKSBzb3VyY2UpOwotICAgICAgcmV0dXJuIHJjID09IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfQotCi12b2lkCi1kZXZpY2VfZXJyb3IgKGRldmljZSAqbWUsIGNoYXIgKm1lc3NhZ2UsIC4uLikKLXsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2k5NjAtZGVzYy5jIGIvc2ltL2k5NjAvaTk2MC1kZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWIyNWMuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvaTk2MC1kZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg2ICswLDAgQEAKLS8qIENQVSBkYXRhIGZvciBpOTYwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiaTk2MC1kZXNjLmgiCi0jaW5jbHVkZSAiaTk2MC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQXR0cmlidXRlcy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQotewotICB7ICIjZiIsIDAgfSwKLSAgeyAiI3QiLCAxIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KLXsKLSAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAotICB7ICJpOTYwX2thX3NhIiwgTUFDSF9JOTYwX0tBX1NBIH0sCi0gIHsgImk5NjBfY2EiLCBNQUNIX0k5NjBfQ0EgfSwKLSAgeyAibWF4IiwgTUFDSF9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgSVNBX2F0dHJbXSA9Ci17Ci0gIHsgImk5NjAiLCBJU0FfSTk2MCB9LAotICB7ICJtYXgiLCBJU0FfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgaTk2MF9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ0FDSEUtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBST0ZJTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgaTk2MF9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJORUdBVElWRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNFTS1PTkxZIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lTQSBpOTYwX2NnZW5faXNhX3RhYmxlW10gPSB7Ci0gIHsgImk5NjAiLCAzMiwgMzIsIDMyLCA2NCwgIH0sCi0gIHsgMCB9Ci19OwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCBpOTYwX2NnZW5fbWFjaF90YWJsZVtdID0gewotICB7ICJpOTYwOmthX3NhIiwgImk5NjA6a2Ffc2EiLCBNQUNIX0k5NjBfS0FfU0EgfSwKLSAgeyAiaTk2MDpjYSIsICJpOTYwOmNhIiwgTUFDSF9JOTYwX0NBIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGk5NjBfY2dlbl9vcHZhbF9oX2dyX2VudHJpZXNbXSA9Ci17Ci0gIHsgImZwIiwgMzEgfSwKLSAgeyAic3AiLCAxIH0sCi0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJnMCIsIDE2IH0sCi0gIHsgImcxIiwgMTcgfSwKLSAgeyAiZzIiLCAxOCB9LAotICB7ICJnMyIsIDE5IH0sCi0gIHsgImc0IiwgMjAgfSwKLSAgeyAiZzUiLCAyMSB9LAotICB7ICJnNiIsIDIyIH0sCi0gIHsgImc3IiwgMjMgfSwKLSAgeyAiZzgiLCAyNCB9LAotICB7ICJnOSIsIDI1IH0sCi0gIHsgImcxMCIsIDI2IH0sCi0gIHsgImcxMSIsIDI3IH0sCi0gIHsgImcxMiIsIDI4IH0sCi0gIHsgImcxMyIsIDI5IH0sCi0gIHsgImcxNCIsIDMwIH0sCi0gIHsgImcxNSIsIDMxIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBpOTYwX2NnZW5fb3B2YWxfaF9nciA9Ci17Ci0gICYgaTk2MF9jZ2VuX29wdmFsX2hfZ3JfZW50cmllc1swXSwKLSAgMzQKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgaTk2MF9jZ2VuX29wdmFsX2hfY2NfZW50cmllc1tdID0KLXsKLSAgeyAiY2MiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBpOTYwX2NnZW5fb3B2YWxfaF9jYyA9Ci17Ci0gICYgaTk2MF9jZ2VuX29wdmFsX2hfY2NfZW50cmllc1swXSwKLSAgMQotfTsKLQotCi0KLS8qIFRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0hXXyxhKSkKLQotY29uc3QgQ0dFTl9IV19FTlRSWSBpOTYwX2NnZW5faHdfdGFibGVbXSA9Ci17Ci0gIHsgImgtbWVtb3J5IiwgSFdfSF9NRU1PUlksIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zaW50IiwgSFdfSF9TSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWludCIsIEhXX0hfVUlOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFkZHIiLCBIV19IX0FERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYWRkciIsIEhXX0hfSUFERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wYyIsIEhXX0hfUEMsIENHRU5fQVNNX05PTkUsIDAsIHsgMHxBKFBST0ZJTEUpfEEoUEMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWdyIiwgSFdfSF9HUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBpOTYwX2NnZW5fb3B2YWxfaF9nciwgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jYyIsIEhXX0hfQ0MsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgaTk2MF9jZ2VuX29wdmFsX2hfY2MsIHsgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIGk5NjBfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IEk5NjBfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX09QQ09ERSwgImYtb3Bjb2RlIiwgMCwgMzIsIDAsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX1NSQ0RTVCwgImYtc3JjZHN0IiwgMCwgMzIsIDgsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX1NSQzIsICJmLXNyYzIiLCAwLCAzMiwgMTMsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX00zLCAiZi1tMyIsIDAsIDMyLCAxOCwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBJOTYwX0ZfTTIsICJmLW0yIiwgMCwgMzIsIDE5LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9NMSwgImYtbTEiLCAwLCAzMiwgMjAsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX09QQ09ERTIsICJmLW9wY29kZTIiLCAwLCAzMiwgMjEsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX1pFUk8sICJmLXplcm8iLCAwLCAzMiwgMjUsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX1NSQzEsICJmLXNyYzEiLCAwLCAzMiwgMjcsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX0FCQVNFLCAiZi1hYmFzZSIsIDAsIDMyLCAxMywgNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBJOTYwX0ZfTU9ERUEsICJmLW1vZGVhIiwgMCwgMzIsIDE4LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9aRVJPQSwgImYtemVyb2EiLCAwLCAzMiwgMTksIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX09GRlNFVCwgImYtb2Zmc2V0IiwgMCwgMzIsIDIwLCAxMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBJOTYwX0ZfTU9ERUIsICJmLW1vZGViIiwgMCwgMzIsIDE4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9TQ0FMRSwgImYtc2NhbGUiLCAwLCAzMiwgMjIsIDMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX1pFUk9CLCAiZi16ZXJvYiIsIDAsIDMyLCAyNSwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBJOTYwX0ZfSU5ERVgsICJmLWluZGV4IiwgMCwgMzIsIDI3LCA1LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9PUFRESVNQLCAiZi1vcHRkaXNwIiwgMzIsIDMyLCAwLCAzMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBJOTYwX0ZfQlJfU1JDMSwgImYtYnItc3JjMSIsIDAsIDMyLCA4LCA1LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9CUl9TUkMyLCAiZi1ici1zcmMyIiwgMCwgMzIsIDEzLCA1LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEk5NjBfRl9CUl9NMSwgImYtYnItbTEiLCAwLCAzMiwgMTgsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX0JSX0RJU1AsICJmLWJyLWRpc3AiLCAwLCAzMiwgMTksIDExLCB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX0JSX1pFUk8sICJmLWJyLXplcm8iLCAwLCAzMiwgMzAsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX0NUUkxfRElTUCwgImYtY3RybC1kaXNwIiwgMCwgMzIsIDgsIDIyLCB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgSTk2MF9GX0NUUkxfWkVSTywgImYtY3RybC16ZXJvIiwgMCwgMzIsIDMwLCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIG9wZXJhbmQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSkKLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoSTk2MF9PUEVSQU5EXyxvcCkKLQotY29uc3QgQ0dFTl9PUEVSQU5EIGk5NjBfY2dlbl9vcGVyYW5kX3RhYmxlW10gPQotewotLyogcGM6IHByb2dyYW0gY291bnRlciAqLwotICB7ICJwYyIsIEk5NjBfT1BFUkFORF9QQywgSFdfSF9QQywgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMTogc291cmNlIHJlZ2lzdGVyIDEgKi8KLSAgeyAic3JjMSIsIEk5NjBfT1BFUkFORF9TUkMxLCBIV19IX0dSLCAyNywgNSwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMjogc291cmNlIHJlZ2lzdGVyIDIgKi8KLSAgeyAic3JjMiIsIEk5NjBfT1BFUkFORF9TUkMyLCBIV19IX0dSLCAxMywgNSwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZHN0OiBzb3VyY2UvZGVzdCByZWdpc3RlciAqLwotICB7ICJkc3QiLCBJOTYwX09QRVJBTkRfRFNULCBIV19IX0dSLCA4LCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBsaXQxOiBsaXRlcmFsIDEgKi8KLSAgeyAibGl0MSIsIEk5NjBfT1BFUkFORF9MSVQxLCBIV19IX1VJTlQsIDI3LCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBsaXQyOiBsaXRlcmFsIDIgKi8KLSAgeyAibGl0MiIsIEk5NjBfT1BFUkFORF9MSVQyLCBIV19IX1VJTlQsIDEzLCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzdF9zcmM6IHN0b3JlIHNyYyAqLwotICB7ICJzdF9zcmMiLCBJOTYwX09QRVJBTkRfU1RfU1JDLCBIV19IX0dSLCA4LCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBhYmFzZTogYWJhc2UgKi8KLSAgeyAiYWJhc2UiLCBJOTYwX09QRVJBTkRfQUJBU0UsIEhXX0hfR1IsIDEzLCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBvZmZzZXQ6IG9mZnNldCAqLwotICB7ICJvZmZzZXQiLCBJOTYwX09QRVJBTkRfT0ZGU0VULCBIV19IX1VJTlQsIDIwLCAxMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2NhbGU6IHNjYWxlICovCi0gIHsgInNjYWxlIiwgSTk2MF9PUEVSQU5EX1NDQUxFLCBIV19IX1VJTlQsIDIyLCAzLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpbmRleDogaW5kZXggKi8KLSAgeyAiaW5kZXgiLCBJOTYwX09QRVJBTkRfSU5ERVgsIEhXX0hfR1IsIDI3LCA1LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBvcHRkaXNwOiBvcHRpb25hbCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAib3B0ZGlzcCIsIEk5NjBfT1BFUkFORF9PUFRESVNQLCBIV19IX1VJTlQsIDAsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBicl9zcmMxOiBicmFuY2ggc3JjMSAqLwotICB7ICJicl9zcmMxIiwgSTk2MF9PUEVSQU5EX0JSX1NSQzEsIEhXX0hfR1IsIDgsIDUsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGJyX3NyYzI6IGJyYW5jaCBzcmMyICovCi0gIHsgImJyX3NyYzIiLCBJOTYwX09QRVJBTkRfQlJfU1JDMiwgSFdfSF9HUiwgMTMsIDUsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGJyX2Rpc3A6IGJyYW5jaCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiYnJfZGlzcCIsIEk5NjBfT1BFUkFORF9CUl9ESVNQLCBIV19IX0lBRERSLCAxOSwgMTEsCi0gICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogYnJfbGl0MTogYnJhbmNoIGxpdGVyYWwgMSAqLwotICB7ICJicl9saXQxIiwgSTk2MF9PUEVSQU5EX0JSX0xJVDEsIEhXX0hfVUlOVCwgOCwgNSwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY3RybF9kaXNwOiBjdHJsIGJyYW5jaCBkaXNwICovCi0gIHsgImN0cmxfZGlzcCIsIEk5NjBfT1BFUkFORF9DVFJMX0RJU1AsIEhXX0hfSUFERFIsIDgsIDIyLAotICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBpOTYwX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IDAsIDAsIDAgfSwKLS8qIG11bG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTVVMTywgIm11bG8iLCAibXVsbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTVVMTzEsICJtdWxvMSIsICJtdWxvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9NVUxPMiwgIm11bG8yIiwgIm11bG8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWxvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01VTE8zLCAibXVsbzMiLCAibXVsbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbW8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fUkVNTywgInJlbW8iLCAicmVtbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbW8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fUkVNTzEsICJyZW1vMSIsICJyZW1vIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmVtbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9SRU1PMiwgInJlbW8yIiwgInJlbW8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW1vICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1JFTU8zLCAicmVtbzMiLCAicmVtbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdm8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fRElWTywgImRpdm8iLCAiZGl2byIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdm8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fRElWTzEsICJkaXZvMSIsICJkaXZvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2byAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9ESVZPMiwgImRpdm8yIiwgImRpdm8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXZvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0RJVk8zLCAiZGl2bzMiLCAiZGl2byIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbWkgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fUkVNSSwgInJlbWkiLCAicmVtaSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJlbWkgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fUkVNSTEsICJyZW1pMSIsICJyZW1pIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmVtaSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9SRU1JMiwgInJlbWkyIiwgInJlbWkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW1pICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1JFTUkzLCAicmVtaTMiLCAicmVtaSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdmkgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fRElWSSwgImRpdmkiLCAiZGl2aSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdmkgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fRElWSTEsICJkaXZpMSIsICJkaXZpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2aSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9ESVZJMiwgImRpdmkyIiwgImRpdmkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXZpICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0RJVkkzLCAiZGl2aTMiLCAiZGl2aSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQURETywgImFkZG8iLCAiYWRkbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQURETzEsICJhZGRvMSIsICJhZGRvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9BRERPMiwgImFkZG8yIiwgImFkZG8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0FERE8zLCAiYWRkbzMiLCAiYWRkbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1Ym8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1VCTywgInN1Ym8iLCAic3VibyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1Ym8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1VCTzEsICJzdWJvMSIsICJzdWJvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3VibyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVUJPMiwgInN1Ym8yIiwgInN1Ym8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NVQk8zLCAic3VibzMiLCAic3VibyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vdGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1RCSVQsICJub3RiaXQiLCAibm90Yml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90Yml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX05PVEJJVDEsICJub3RiaXQxIiwgIm5vdGJpdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vdGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1RCSVQyLCAibm90Yml0MiIsICJub3RiaXQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3RiaXQgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTk9UQklUMywgIm5vdGJpdDMiLCAibm90Yml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQU5EMSwgImFuZDEiLCAiYW5kIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0FORDIsICJhbmQyIiwgImFuZCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9BTkQzLCAiYW5kMyIsICJhbmQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQU5ETk9ULCAiYW5kbm90IiwgImFuZG5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZG5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9BTkROT1QxLCAiYW5kbm90MSIsICJhbmRub3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQU5ETk9UMiwgImFuZG5vdDIiLCAiYW5kbm90IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0FORE5PVDMsICJhbmRub3QzIiwgImFuZG5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNldGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TRVRCSVQsICJzZXRiaXQiLCAic2V0Yml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2V0Yml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NFVEJJVDEsICJzZXRiaXQxIiwgInNldGJpdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNldGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TRVRCSVQyLCAic2V0Yml0MiIsICJzZXRiaXQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzZXRiaXQgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU0VUQklUMywgInNldGJpdDMiLCAic2V0Yml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90YW5kICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX05PVEFORCwgIm5vdGFuZCIsICJub3RhbmQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3RhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTk9UQU5EMSwgIm5vdGFuZDEiLCAibm90YW5kIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90YW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX05PVEFORDIsICJub3RhbmQyIiwgIm5vdGFuZCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vdGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1RBTkQzLCAibm90YW5kMyIsICJub3RhbmQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fWE9SLCAieG9yIiwgInhvciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhvciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9YT1IxLCAieG9yMSIsICJ4b3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fWE9SMiwgInhvcjIiLCAieG9yIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogeG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1hPUjMsICJ4b3IzIiwgInhvciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX09SLCAib3IiLCAib3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9PUjEsICJvcjEiLCAib3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9PUjIsICJvcjIiLCAib3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9PUjMsICJvcjMiLCAib3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTk9SLCAibm9yIiwgIm5vciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1IxLCAibm9yMSIsICJub3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTk9SMiwgIm5vcjIiLCAibm9yIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX05PUjMsICJub3IzIiwgIm5vciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fWE5PUiwgInhub3IiLCAieG5vciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhub3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fWE5PUjEsICJ4bm9yMSIsICJ4bm9yIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogeG5vciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9YTk9SMiwgInhub3IyIiwgInhub3IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4bm9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1hOT1IzLCAieG5vcjMiLCAieG5vciIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1QsICJub3QiLCAibm90IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX05PVDEsICJub3QxIiwgIm5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9OT1QyLCAibm90MiIsICJub3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3QgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTk9UMywgIm5vdDMiLCAibm90IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3Jub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fT1JOT1QsICJvcm5vdCIsICJvcm5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9ybm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX09STk9UMSwgIm9ybm90MSIsICJvcm5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9ybm90ICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX09STk9UMiwgIm9ybm90MiIsICJvcm5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9ybm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX09STk9UMywgIm9ybm90MyIsICJvcm5vdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNscmJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTFJCSVQsICJjbHJiaXQiLCAiY2xyYml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2xyYml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NMUkJJVDEsICJjbHJiaXQxIiwgImNscmJpdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNscmJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTFJCSVQyLCAiY2xyYml0MiIsICJjbHJiaXQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbHJiaXQgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ0xSQklUMywgImNscmJpdDMiLCAiY2xyYml0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSExPLCAic2hsbyIsICJzaGxvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hsbyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSExPMSwgInNobG8xIiwgInNobG8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzaGxvICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NITE8yLCAic2hsbzIiLCAic2hsbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNobG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU0hMTzMsICJzaGxvMyIsICJzaGxvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hybyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSFJPLCAic2hybyIsICJzaHJvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hybyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSFJPMSwgInNocm8xIiwgInNocm8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzaHJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NIUk8yLCAic2hybzIiLCAic2hybyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNocm8gJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU0hSTzMsICJzaHJvMyIsICJzaHJvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hsaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSExJLCAic2hsaSIsICJzaGxpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hsaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSExJMSwgInNobGkxIiwgInNobGkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzaGxpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NITEkyLCAic2hsaTIiLCAic2hsaSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNobGkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU0hMSTMsICJzaGxpMyIsICJzaGxpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hyaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSFJJLCAic2hyaSIsICJzaHJpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2hyaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TSFJJMSwgInNocmkxIiwgInNocmkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzaHJpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NIUkkyLCAic2hyaTIiLCAic2hyaSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNocmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU0hSSTMsICJzaHJpMyIsICJzaHJpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW11bCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9FTVVMLCAiZW11bCIsICJlbXVsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW11bCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9FTVVMMSwgImVtdWwxIiwgImVtdWwiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlbXVsICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0VNVUwyLCAiZW11bDIiLCAiZW11bCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVtdWwgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fRU1VTDMsICJlbXVsMyIsICJlbXVsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRzcmMxLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTU9WLCAibW92IiwgIm1vdiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkbGl0MSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01PVjEsICJtb3YxIiwgIm1vdiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdmwgJHNyYzEsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9NT1ZMLCAibW92bCIsICJtb3ZsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92bCAkbGl0MSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01PVkwxLCAibW92bDEiLCAibW92bCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdnQgJHNyYzEsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9NT1ZULCAibW92dCIsICJtb3Z0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92dCAkbGl0MSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01PVlQxLCAibW92dDEiLCAibW92dCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdnEgJHNyYzEsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9NT1ZRLCAibW92cSIsICJtb3ZxIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92cSAkbGl0MSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01PVlExLCAibW92cTEiLCAibW92cSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vZHBjICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX01PRFBDLCAibW9kcGMiLCAibW9kcGMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb2RhYyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9NT0RBQywgIm1vZGFjIiwgIm1vZGFjIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRhICRvZmZzZXQsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MREFfT0ZGU0VULCAibGRhLW9mZnNldCIsICJsZGEiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgImxkYS1pbmRpcmVjdC1vZmZzZXQiLCAibGRhIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRhICgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERBX0lORElSRUNULCAibGRhLWluZGlyZWN0IiwgImxkYSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkYSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsICJsZGEtaW5kaXJlY3QtaW5kZXgiLCAibGRhIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRhICRvcHRkaXNwLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERBX0RJU1AsICJsZGEtZGlzcCIsICJsZGEiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGEgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQLCAibGRhLWluZGlyZWN0LWRpc3AiLCAibGRhIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRhICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEQV9JTkRFWF9ESVNQLCAibGRhLWluZGV4LWRpc3AiLCAibGRhIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRhICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AsICJsZGEtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJsZGEiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkb2Zmc2V0LCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfT0ZGU0VULCAibGQtb2Zmc2V0IiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCAibGQtaW5kaXJlY3Qtb2Zmc2V0IiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRF9JTkRJUkVDVCwgImxkLWluZGlyZWN0IiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsICJsZC1pbmRpcmVjdC1pbmRleCIsICJsZCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRvcHRkaXNwLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfRElTUCwgImxkLWRpc3AiLCAibGQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgImxkLWluZGlyZWN0LWRpc3AiLCAibGQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRF9JTkRFWF9ESVNQLCAibGQtaW5kZXgtZGlzcCIsICJsZCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG9iICRvZmZzZXQsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9CX09GRlNFVCwgImxkb2Itb2Zmc2V0IiwgImxkb2IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG9iICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCAibGRvYi1pbmRpcmVjdC1vZmZzZXQiLCAibGRvYiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkb2IgKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9CX0lORElSRUNULCAibGRvYi1pbmRpcmVjdCIsICJsZG9iIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvYiAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYLCAibGRvYi1pbmRpcmVjdC1pbmRleCIsICJsZG9iIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvYiAkb3B0ZGlzcCwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xET0JfRElTUCwgImxkb2ItZGlzcCIsICJsZG9iIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvYiAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCAibGRvYi1pbmRpcmVjdC1kaXNwIiwgImxkb2IiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG9iICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xET0JfSU5ERVhfRElTUCwgImxkb2ItaW5kZXgtZGlzcCIsICJsZG9iIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvYiAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkb2ItaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJsZG9iIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvcyAkb2Zmc2V0LCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERPU19PRkZTRVQsICJsZG9zLW9mZnNldCIsICJsZG9zIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCwgImxkb3MtaW5kaXJlY3Qtb2Zmc2V0IiwgImxkb3MiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG9zICgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERPU19JTkRJUkVDVCwgImxkb3MtaW5kaXJlY3QiLCAibGRvcyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkb3MgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWCwgImxkb3MtaW5kaXJlY3QtaW5kZXgiLCAibGRvcyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkb3MgJG9wdGRpc3AsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9TX0RJU1AsICJsZG9zLWRpc3AiLCAibGRvcyIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkb3MgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgImxkb3MtaW5kaXJlY3QtZGlzcCIsICJsZG9zIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRvcyAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9TX0lOREVYX0RJU1AsICJsZG9zLWluZGV4LWRpc3AiLCAibGRvcyIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkb3MgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1AsICJsZG9zLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGRvcyIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaWIgJG9mZnNldCwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESUJfT0ZGU0VULCAibGRpYi1vZmZzZXQiLCAibGRpYiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQsICJsZGliLWluZGlyZWN0LW9mZnNldCIsICJsZGliIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpYiAoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1QsICJsZGliLWluZGlyZWN0IiwgImxkaWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGliICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgsICJsZGliLWluZGlyZWN0LWluZGV4IiwgImxkaWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGliICRvcHRkaXNwLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERJQl9ESVNQLCAibGRpYi1kaXNwIiwgImxkaWIiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGliICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0RJU1AsICJsZGliLWluZGlyZWN0LWRpc3AiLCAibGRpYiIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaWIgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERJQl9JTkRFWF9ESVNQLCAibGRpYi1pbmRleC1kaXNwIiwgImxkaWIiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGliICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCAibGRpYi1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkaWIiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGlzICRvZmZzZXQsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRElTX09GRlNFVCwgImxkaXMtb2Zmc2V0IiwgImxkaXMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGlzICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCAibGRpcy1pbmRpcmVjdC1vZmZzZXQiLCAibGRpcyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaXMgKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRElTX0lORElSRUNULCAibGRpcy1pbmRpcmVjdCIsICJsZGlzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0lOREVYLCAibGRpcy1pbmRpcmVjdC1pbmRleCIsICJsZGlzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpcyAkb3B0ZGlzcCwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESVNfRElTUCwgImxkaXMtZGlzcCIsICJsZGlzIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCAibGRpcy1pbmRpcmVjdC1kaXNwIiwgImxkaXMiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGlzICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESVNfSU5ERVhfRElTUCwgImxkaXMtaW5kZXgtZGlzcCIsICJsZGlzIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpcyAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkaXMtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJsZGlzIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRsICRvZmZzZXQsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRExfT0ZGU0VULCAibGRsLW9mZnNldCIsICJsZGwiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGwgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERMX0lORElSRUNUX09GRlNFVCwgImxkbC1pbmRpcmVjdC1vZmZzZXQiLCAibGRsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRsICgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERMX0lORElSRUNULCAibGRsLWluZGlyZWN0IiwgImxkbCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkbCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsICJsZGwtaW5kaXJlY3QtaW5kZXgiLCAibGRsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRsICRvcHRkaXNwLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERMX0RJU1AsICJsZGwtZGlzcCIsICJsZGwiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGwgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xETF9JTkRJUkVDVF9ESVNQLCAibGRsLWluZGlyZWN0LWRpc3AiLCAibGRsIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xETF9JTkRFWF9ESVNQLCAibGRsLWluZGV4LWRpc3AiLCAibGRsIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERMX0lORElSRUNUX0lOREVYX0RJU1AsICJsZGwtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJsZGwiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHQgJG9mZnNldCwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEVF9PRkZTRVQsICJsZHQtb2Zmc2V0IiwgImxkdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCAibGR0LWluZGlyZWN0LW9mZnNldCIsICJsZHQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHQgKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1QsICJsZHQtaW5kaXJlY3QiLCAibGR0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR0ICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWCwgImxkdC1pbmRpcmVjdC1pbmRleCIsICJsZHQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHQgJG9wdGRpc3AsICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFRfRElTUCwgImxkdC1kaXNwIiwgImxkdCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERUX0lORElSRUNUX0RJU1AsICJsZHQtaW5kaXJlY3QtZGlzcCIsICJsZHQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHQgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERUX0lOREVYX0RJU1AsICJsZHQtaW5kZXgtZGlzcCIsICJsZHQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkdC1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkdCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcSAkb2Zmc2V0LCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERRX09GRlNFVCwgImxkcS1vZmZzZXQiLCAibGRxIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRxICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsICJsZHEtaW5kaXJlY3Qtb2Zmc2V0IiwgImxkcSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcSAoJGFiYXNlKSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVCwgImxkcS1pbmRpcmVjdCIsICJsZHEiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHEgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fTERRX0lORElSRUNUX0lOREVYLCAibGRxLWluZGlyZWN0LWluZGV4IiwgImxkcSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcSAkb3B0ZGlzcCwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEUV9ESVNQLCAibGRxLWRpc3AiLCAibGRxIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRxICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgImxkcS1pbmRpcmVjdC1kaXNwIiwgImxkcSIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLSAgewotICAgIEk5NjBfSU5TTl9MRFFfSU5ERVhfRElTUCwgImxkcS1pbmRleC1kaXNwIiwgImxkcSIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkcSAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCAibGRxLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGRxIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHN0X3NyYywgJG9mZnNldCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUX09GRlNFVCwgInN0LW9mZnNldCIsICJzdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUX0lORElSRUNUX09GRlNFVCwgInN0LWluZGlyZWN0LW9mZnNldCIsICJzdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzdF9zcmMsICgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RfSU5ESVJFQ1QsICJzdC1pbmRpcmVjdCIsICJzdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUX0lORElSRUNUX0lOREVYLCAic3QtaW5kaXJlY3QtaW5kZXgiLCAic3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUX0RJU1AsICJzdC1kaXNwIiwgInN0IiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUX0lORElSRUNUX0RJU1AsICJzdC1pbmRpcmVjdC1kaXNwIiwgInN0IiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVF9JTkRFWF9ESVNQLCAic3QtaW5kZXgtZGlzcCIsICJzdCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCwgInN0LWluZGlyZWN0LWluZGV4LWRpc3AiLCAic3QiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9iICRzdF9zcmMsICRvZmZzZXQgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9CX09GRlNFVCwgInN0b2Itb2Zmc2V0IiwgInN0b2IiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9iICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VULCAic3RvYi1pbmRpcmVjdC1vZmZzZXQiLCAic3RvYiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0b2IgJHN0X3NyYywgKCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9CX0lORElSRUNULCAic3RvYi1pbmRpcmVjdCIsICJzdG9iIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYLCAic3RvYi1pbmRpcmVjdC1pbmRleCIsICJzdG9iIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUT0JfRElTUCwgInN0b2ItZGlzcCIsICJzdG9iIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9ESVNQLCAic3RvYi1pbmRpcmVjdC1kaXNwIiwgInN0b2IiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPQl9JTkRFWF9ESVNQLCAic3RvYi1pbmRleC1kaXNwIiwgInN0b2IiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3RvYi1pbmRpcmVjdC1pbmRleC1kaXNwIiwgInN0b2IiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9zICRzdF9zcmMsICRvZmZzZXQgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9TX09GRlNFVCwgInN0b3Mtb2Zmc2V0IiwgInN0b3MiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9zICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VULCAic3Rvcy1pbmRpcmVjdC1vZmZzZXQiLCAic3RvcyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0b3MgJHN0X3NyYywgKCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9TX0lORElSRUNULCAic3Rvcy1pbmRpcmVjdCIsICJzdG9zIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvcyAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYLCAic3Rvcy1pbmRpcmVjdC1pbmRleCIsICJzdG9zIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUT1NfRElTUCwgInN0b3MtZGlzcCIsICJzdG9zIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQLCAic3Rvcy1pbmRpcmVjdC1kaXNwIiwgInN0b3MiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9zICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPU19JTkRFWF9ESVNQLCAic3Rvcy1pbmRleC1kaXNwIiwgInN0b3MiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG9zICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3Rvcy1pbmRpcmVjdC1pbmRleC1kaXNwIiwgInN0b3MiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGwgJHN0X3NyYywgJG9mZnNldCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUTF9PRkZTRVQsICJzdGwtb2Zmc2V0IiwgInN0bCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0bCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCAic3RsLWluZGlyZWN0LW9mZnNldCIsICJzdGwiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGwgJHN0X3NyYywgKCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVExfSU5ESVJFQ1QsICJzdGwtaW5kaXJlY3QiLCAic3RsIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RsICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCwgInN0bC1pbmRpcmVjdC1pbmRleCIsICJzdGwiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGwgJHN0X3NyYywgJG9wdGRpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVExfRElTUCwgInN0bC1kaXNwIiwgInN0bCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RMX0lORElSRUNUX0RJU1AsICJzdGwtaW5kaXJlY3QtZGlzcCIsICJzdGwiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGwgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVExfSU5ERVhfRElTUCwgInN0bC1pbmRleC1kaXNwIiwgInN0bCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3RsLWluZGlyZWN0LWluZGV4LWRpc3AiLCAic3RsIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3R0ICRzdF9zcmMsICRvZmZzZXQgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVFRfT0ZGU0VULCAic3R0LW9mZnNldCIsICJzdHQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdHQgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgInN0dC1pbmRpcmVjdC1vZmZzZXQiLCAic3R0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3R0ICRzdF9zcmMsICgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RUX0lORElSRUNULCAic3R0LWluZGlyZWN0IiwgInN0dCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0dCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgsICJzdHQtaW5kaXJlY3QtaW5kZXgiLCAic3R0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RUX0RJU1AsICJzdHQtZGlzcCIsICJzdHQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQLCAic3R0LWluZGlyZWN0LWRpc3AiLCAic3R0IiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RUX0lOREVYX0RJU1AsICJzdHQtaW5kZXgtZGlzcCIsICJzdHQiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgInN0dC1pbmRpcmVjdC1pbmRleC1kaXNwIiwgInN0dCIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cSAkc3Rfc3JjLCAkb2Zmc2V0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RRX09GRlNFVCwgInN0cS1vZmZzZXQiLCAic3RxIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RxICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQsICJzdHEtaW5kaXJlY3Qtb2Zmc2V0IiwgInN0cSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cSAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVCwgInN0cS1pbmRpcmVjdCIsICJzdHEiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdHEgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCAic3RxLWluZGlyZWN0LWluZGV4IiwgInN0cSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUUV9ESVNQLCAic3RxLWRpc3AiLCAic3RxIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgInN0cS1pbmRpcmVjdC1kaXNwIiwgInN0cSIsIDY0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1NUUV9JTkRFWF9ESVNQLCAic3RxLWluZGV4LWRpc3AiLCAic3RxIiwgNjQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsICJzdHEtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJzdHEiLCA2NCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBvYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUE9CRV9SRUcsICJjbXBvYmUtcmVnIiwgImNtcG9iZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG9iZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QT0JFX0xJVCwgImNtcG9iZS1saXQiLCAiY21wb2JlIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wb2JuZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QT0JORV9SRUcsICJjbXBvYm5lLXJlZyIsICJjbXBvYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wb2JuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QT0JORV9MSVQsICJjbXBvYm5lLWxpdCIsICJjbXBvYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wb2JsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBPQkxfUkVHLCAiY21wb2JsLXJlZyIsICJjbXBvYmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBvYmwgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUE9CTF9MSVQsICJjbXBvYmwtbGl0IiwgImNtcG9ibCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG9ibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUE9CTEVfUkVHLCAiY21wb2JsZS1yZWciLCAiY21wb2JsZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG9ibGUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUE9CTEVfTElULCAiY21wb2JsZS1saXQiLCAiY21wb2JsZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG9iZyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QT0JHX1JFRywgImNtcG9iZy1yZWciLCAiY21wb2JnIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wb2JnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBPQkdfTElULCAiY21wb2JnLWxpdCIsICJjbXBvYmciLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBvYmdlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBPQkdFX1JFRywgImNtcG9iZ2UtcmVnIiwgImNtcG9iZ2UiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBvYmdlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBPQkdFX0xJVCwgImNtcG9iZ2UtbGl0IiwgImNtcG9iZ2UiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUElCRV9SRUcsICJjbXBpYmUtcmVnIiwgImNtcGliZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGliZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSUJFX0xJVCwgImNtcGliZS1saXQiLCAiY21waWJlIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21waWJuZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSUJORV9SRUcsICJjbXBpYm5lLXJlZyIsICJjbXBpYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21waWJuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSUJORV9MSVQsICJjbXBpYm5lLWxpdCIsICJjbXBpYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21waWJsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBJQkxfUkVHLCAiY21waWJsLXJlZyIsICJjbXBpYmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpYmwgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUElCTF9MSVQsICJjbXBpYmwtbGl0IiwgImNtcGlibCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGlibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUElCTEVfUkVHLCAiY21waWJsZS1yZWciLCAiY21waWJsZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGlibGUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUElCTEVfTElULCAiY21waWJsZS1saXQiLCAiY21waWJsZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGliZyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSUJHX1JFRywgImNtcGliZy1yZWciLCAiY21waWJnIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21waWJnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBJQkdfTElULCAiY21waWJnLWxpdCIsICJjbXBpYmciLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpYmdlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBJQkdFX1JFRywgImNtcGliZ2UtcmVnIiwgImNtcGliZ2UiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpYmdlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBJQkdFX0xJVCwgImNtcGliZ2UtbGl0IiwgImNtcGliZ2UiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYmMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0JCQ19SRUcsICJiYmMtcmVnIiwgImJiYyIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJiYyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQkJDX0xJVCwgImJiYy1saXQiLCAiYmJjIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmJzICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CQlNfUkVHLCAiYmJzLXJlZyIsICJiYnMiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYnMgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0JCU19MSVQsICJiYnMtbGl0IiwgImJicyIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGkgJHNyYzEsICRzcmMyICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSSwgImNtcGkiLCAiY21waSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcGkgJGxpdDEsICRzcmMyICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QSTEsICJjbXBpMSIsICJjbXBpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21waSAkc3JjMSwgJGxpdDIgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBJMiwgImNtcGkyIiwgImNtcGkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpICRsaXQxLCAkbGl0MiAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUEkzLCAiY21waTMiLCAiY21waSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG8gJHNyYzEsICRzcmMyICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QTywgImNtcG8iLCAiY21wbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcG8gJGxpdDEsICRzcmMyICovCi0gIHsKLSAgICBJOTYwX0lOU05fQ01QTzEsICJjbXBvMSIsICJjbXBvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wbyAkc3JjMSwgJGxpdDIgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DTVBPMiwgImNtcG8yIiwgImNtcG8iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBvICRsaXQxLCAkbGl0MiAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NNUE8zLCAiY21wbzMiLCAiY21wbyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRlc3RubyAkYnJfc3JjMSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1RFU1ROT19SRUcsICJ0ZXN0bm8tcmVnIiwgInRlc3RubyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRlc3RnICRicl9zcmMxICovCi0gIHsKLSAgICBJOTYwX0lOU05fVEVTVEdfUkVHLCAidGVzdGctcmVnIiwgInRlc3RnIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogdGVzdGUgJGJyX3NyYzEgKi8KLSAgewotICAgIEk5NjBfSU5TTl9URVNURV9SRUcsICJ0ZXN0ZS1yZWciLCAidGVzdGUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB0ZXN0Z2UgJGJyX3NyYzEgKi8KLSAgewotICAgIEk5NjBfSU5TTl9URVNUR0VfUkVHLCAidGVzdGdlLXJlZyIsICJ0ZXN0Z2UiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB0ZXN0bCAkYnJfc3JjMSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1RFU1RMX1JFRywgInRlc3RsLXJlZyIsICJ0ZXN0bCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRlc3RuZSAkYnJfc3JjMSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1RFU1RORV9SRUcsICJ0ZXN0bmUtcmVnIiwgInRlc3RuZSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRlc3RsZSAkYnJfc3JjMSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX1RFU1RMRV9SRUcsICJ0ZXN0bGUtcmVnIiwgInRlc3RsZSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRlc3RvICRicl9zcmMxICovCi0gIHsKLSAgICBJOTYwX0lOU05fVEVTVE9fUkVHLCAidGVzdG8tcmVnIiwgInRlc3RvIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5vICRjdHJsX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CTk8sICJibm8iLCAiYm5vIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmcgJGN0cmxfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0JHLCAiYmciLCAiYmciLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZSAkY3RybF9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQkUsICJiZSIsICJiZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJnZSAkY3RybF9kaXNwICovCi0gIHsKLSAgICBJOTYwX0lOU05fQkdFLCAiYmdlIiwgImJnZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsICRjdHJsX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CTCwgImJsIiwgImJsIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lICRjdHJsX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxlICRjdHJsX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CTEUsICJibGUiLCAiYmxlIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm8gJGN0cmxfZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0JPLCAiYm8iLCAiYm8iLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiICRjdHJsX2Rpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CLCAiYiIsICJiIiwgMzIsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBieCAkb2Zmc2V0KCRhYmFzZSkgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQsICJieC1pbmRpcmVjdC1vZmZzZXQiLCAiYngiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJ4ICgkYWJhc2UpICovCi0gIHsKLSAgICBJOTYwX0lOU05fQlhfSU5ESVJFQ1QsICJieC1pbmRpcmVjdCIsICJieCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnggKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0gIHsKLSAgICBJOTYwX0lOU05fQlhfSU5ESVJFQ1RfSU5ERVgsICJieC1pbmRpcmVjdC1pbmRleCIsICJieCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnggJG9wdGRpc3AgKi8KLSAgewotICAgIEk5NjBfSU5TTl9CWF9ESVNQLCAiYngtZGlzcCIsICJieCIsIDY0LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnggJG9wdGRpc3AoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0JYX0lORElSRUNUX0RJU1AsICJieC1pbmRpcmVjdC1kaXNwIiwgImJ4IiwgNjQsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxseCAkb3B0ZGlzcCAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NBTExYX0RJU1AsICJjYWxseC1kaXNwIiwgImNhbGx4IiwgNjQsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxseCAoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NBTExYX0lORElSRUNULCAiY2FsbHgtaW5kaXJlY3QiLCAiY2FsbHgiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGx4ICRvZmZzZXQoJGFiYXNlKSAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgImNhbGx4LWluZGlyZWN0LW9mZnNldCIsICJjYWxseCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmV0ICovCi0gIHsKLSAgICBJOTYwX0lOU05fUkVULCAicmV0IiwgInJldCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbHMgJHNyYzEgKi8KLSAgewotICAgIEk5NjBfSU5TTl9DQUxMUywgImNhbGxzIiwgImNhbGxzIiwgMzIsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBmbWFyayAqLwotICB7Ci0gICAgSTk2MF9JTlNOX0ZNQVJLLCAiZm1hcmsiLCAiZm1hcmsiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGZsdXNocmVnICovCi0gIHsKLSAgICBJOTYwX0lOU05fRkxVU0hSRUcsICJmbHVzaHJlZyIsICJmbHVzaHJlZyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgaTk2MF9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGk5NjBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIGk5NjBfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgaTk2MF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBpOTYwX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBpOTYwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgaTk2MF9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGk5NjBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGk5NjBfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgaTk2MF9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1pOTYwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgaTk2MF9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIGk5NjBfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWk5NjBfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAoaTk2MF9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJpOTYwX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJpOTYwX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gaTk2MF9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBpOTYwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICByZXR1cm4gKENHRU5fQ1BVX0RFU0MpIGNkOwotfQotCi0vKiBDb3ZlciBmbiB0byBpOTYwX2NnZW5fY3B1X29wZW4gdG8gaGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBvZiAxIGlzYSwgMSBtYWNoLgotICAgTUFDSF9OQU1FIGlzIHRoZSBiZmQgbmFtZSBvZiB0aGUgbWFjaC4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWk5NjBfY2dlbl9jcHVfb3Blbl8xIChtYWNoX25hbWUsIGVuZGlhbikKLSAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLXsKLSAgcmV0dXJuIGk5NjBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIGVuZGlhbiwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORCk7Ci19Ci0KLS8qIENsb3NlIGEgY3B1IHRhYmxlLgotICAgPz8/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQotICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCi0gICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCi0KLXZvaWQKLWk5NjBfY2dlbl9jcHVfY2xvc2UgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKLSAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKLSAgZnJlZSAoY2QpOwotfQotCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLWRlc2MuaCBiL3NpbS9pOTYwL2k5NjAtZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI2NTk5Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL2k5NjAtZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qIENQVSBkYXRhIGhlYWRlciBmb3IgaTk2MC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBJOTYwX0NQVV9ICi0jZGVmaW5lIEk5NjBfQ1BVX0gKLQotI2RlZmluZSBDR0VOX0FSQ0ggaTk2MAotCi0vKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIGk5NjBfY2dlbl88Uz4uICAqLwotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChpOTYwLF9jZ2VuXyxzKQotCi0vKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLwotI2RlZmluZSBIQVZFX0NQVV9JOTYwQkFTRQotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNaW5pbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUlOX0lOU05fU0laRSA0Ci0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDgKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMAotCi0vKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCi0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgYW55IGluc24gb3IgbWFjcm8taW5zbiBoYXMuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX09QRVJBTkRTIDE2Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgOQotCi0vKiBFbnVtcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3Bjb2RlIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wY29kZSB7Ci0gIE9QQ09ERV8wMCwgT1BDT0RFXzAxLCBPUENPREVfMDIsIE9QQ09ERV8wMwotICwgT1BDT0RFXzA0LCBPUENPREVfMDUsIE9QQ09ERV8wNiwgT1BDT0RFXzA3Ci0gLCBPUENPREVfMDgsIE9QQ09ERV8wOSwgT1BDT0RFXzBBLCBPUENPREVfMEIKLSAsIE9QQ09ERV8wQywgT1BDT0RFXzBELCBPUENPREVfMEUsIE9QQ09ERV8wRgotICwgT1BDT0RFXzEwLCBPUENPREVfMTEsIE9QQ09ERV8xMiwgT1BDT0RFXzEzCi0gLCBPUENPREVfMTQsIE9QQ09ERV8xNSwgT1BDT0RFXzE2LCBPUENPREVfMTcKLSAsIE9QQ09ERV8xOCwgT1BDT0RFXzE5LCBPUENPREVfMUEsIE9QQ09ERV8xQgotICwgT1BDT0RFXzFDLCBPUENPREVfMUQsIE9QQ09ERV8xRSwgT1BDT0RFXzFGCi0gLCBPUENPREVfMjAsIE9QQ09ERV8yMSwgT1BDT0RFXzIyLCBPUENPREVfMjMKLSAsIE9QQ09ERV8yNCwgT1BDT0RFXzI1LCBPUENPREVfMjYsIE9QQ09ERV8yNwotICwgT1BDT0RFXzI4LCBPUENPREVfMjksIE9QQ09ERV8yQSwgT1BDT0RFXzJCCi0gLCBPUENPREVfMkMsIE9QQ09ERV8yRCwgT1BDT0RFXzJFLCBPUENPREVfMkYKLSAsIE9QQ09ERV8zMCwgT1BDT0RFXzMxLCBPUENPREVfMzIsIE9QQ09ERV8zMwotICwgT1BDT0RFXzM0LCBPUENPREVfMzUsIE9QQ09ERV8zNiwgT1BDT0RFXzM3Ci0gLCBPUENPREVfMzgsIE9QQ09ERV8zOSwgT1BDT0RFXzNBLCBPUENPREVfM0IKLSAsIE9QQ09ERV8zQywgT1BDT0RFXzNELCBPUENPREVfM0UsIE9QQ09ERV8zRgotICwgT1BDT0RFXzQwLCBPUENPREVfNDEsIE9QQ09ERV80MiwgT1BDT0RFXzQzCi0gLCBPUENPREVfNDQsIE9QQ09ERV80NSwgT1BDT0RFXzQ2LCBPUENPREVfNDcKLSAsIE9QQ09ERV80OCwgT1BDT0RFXzQ5LCBPUENPREVfNEEsIE9QQ09ERV80QgotICwgT1BDT0RFXzRDLCBPUENPREVfNEQsIE9QQ09ERV80RSwgT1BDT0RFXzRGCi0gLCBPUENPREVfNTAsIE9QQ09ERV81MSwgT1BDT0RFXzUyLCBPUENPREVfNTMKLSAsIE9QQ09ERV81NCwgT1BDT0RFXzU1LCBPUENPREVfNTYsIE9QQ09ERV81NwotICwgT1BDT0RFXzU4LCBPUENPREVfNTksIE9QQ09ERV81QSwgT1BDT0RFXzVCCi0gLCBPUENPREVfNUMsIE9QQ09ERV81RCwgT1BDT0RFXzVFLCBPUENPREVfNUYKLSAsIE9QQ09ERV82MCwgT1BDT0RFXzYxLCBPUENPREVfNjIsIE9QQ09ERV82MwotICwgT1BDT0RFXzY0LCBPUENPREVfNjUsIE9QQ09ERV82NiwgT1BDT0RFXzY3Ci0gLCBPUENPREVfNjgsIE9QQ09ERV82OSwgT1BDT0RFXzZBLCBPUENPREVfNkIKLSAsIE9QQ09ERV82QywgT1BDT0RFXzZELCBPUENPREVfNkUsIE9QQ09ERV82RgotICwgT1BDT0RFXzcwLCBPUENPREVfNzEsIE9QQ09ERV83MiwgT1BDT0RFXzczCi0gLCBPUENPREVfNzQsIE9QQ09ERV83NSwgT1BDT0RFXzc2LCBPUENPREVfNzcKLSAsIE9QQ09ERV83OCwgT1BDT0RFXzc5LCBPUENPREVfN0EsIE9QQ09ERV83QgotICwgT1BDT0RFXzdDLCBPUENPREVfN0QsIE9QQ09ERV83RSwgT1BDT0RFXzdGCi0gLCBPUENPREVfODAsIE9QQ09ERV84MSwgT1BDT0RFXzgyLCBPUENPREVfODMKLSAsIE9QQ09ERV84NCwgT1BDT0RFXzg1LCBPUENPREVfODYsIE9QQ09ERV84NwotICwgT1BDT0RFXzg4LCBPUENPREVfODksIE9QQ09ERV84QSwgT1BDT0RFXzhCCi0gLCBPUENPREVfOEMsIE9QQ09ERV84RCwgT1BDT0RFXzhFLCBPUENPREVfOEYKLSAsIE9QQ09ERV85MCwgT1BDT0RFXzkxLCBPUENPREVfOTIsIE9QQ09ERV85MwotICwgT1BDT0RFXzk0LCBPUENPREVfOTUsIE9QQ09ERV85NiwgT1BDT0RFXzk3Ci0gLCBPUENPREVfOTgsIE9QQ09ERV85OSwgT1BDT0RFXzlBLCBPUENPREVfOUIKLSAsIE9QQ09ERV85QywgT1BDT0RFXzlELCBPUENPREVfOUUsIE9QQ09ERV85RgotICwgT1BDT0RFX0EwLCBPUENPREVfQTEsIE9QQ09ERV9BMiwgT1BDT0RFX0EzCi0gLCBPUENPREVfQTQsIE9QQ09ERV9BNSwgT1BDT0RFX0E2LCBPUENPREVfQTcKLSAsIE9QQ09ERV9BOCwgT1BDT0RFX0E5LCBPUENPREVfQUEsIE9QQ09ERV9BQgotICwgT1BDT0RFX0FDLCBPUENPREVfQUQsIE9QQ09ERV9BRSwgT1BDT0RFX0FGCi0gLCBPUENPREVfQjAsIE9QQ09ERV9CMSwgT1BDT0RFX0IyLCBPUENPREVfQjMKLSAsIE9QQ09ERV9CNCwgT1BDT0RFX0I1LCBPUENPREVfQjYsIE9QQ09ERV9CNwotICwgT1BDT0RFX0I4LCBPUENPREVfQjksIE9QQ09ERV9CQSwgT1BDT0RFX0JCCi0gLCBPUENPREVfQkMsIE9QQ09ERV9CRCwgT1BDT0RFX0JFLCBPUENPREVfQkYKLSAsIE9QQ09ERV9DMCwgT1BDT0RFX0MxLCBPUENPREVfQzIsIE9QQ09ERV9DMwotICwgT1BDT0RFX0M0LCBPUENPREVfQzUsIE9QQ09ERV9DNiwgT1BDT0RFX0M3Ci0gLCBPUENPREVfQzgsIE9QQ09ERV9DOSwgT1BDT0RFX0NBLCBPUENPREVfQ0IKLSAsIE9QQ09ERV9DQywgT1BDT0RFX0NELCBPUENPREVfQ0UsIE9QQ09ERV9DRgotICwgT1BDT0RFX0QwLCBPUENPREVfRDEsIE9QQ09ERV9EMiwgT1BDT0RFX0QzCi0gLCBPUENPREVfRDQsIE9QQ09ERV9ENSwgT1BDT0RFX0Q2LCBPUENPREVfRDcKLSAsIE9QQ09ERV9EOCwgT1BDT0RFX0Q5LCBPUENPREVfREEsIE9QQ09ERV9EQgotICwgT1BDT0RFX0RDLCBPUENPREVfREQsIE9QQ09ERV9ERSwgT1BDT0RFX0RGCi0gLCBPUENPREVfRTAsIE9QQ09ERV9FMSwgT1BDT0RFX0UyLCBPUENPREVfRTMKLSAsIE9QQ09ERV9FNCwgT1BDT0RFX0U1LCBPUENPREVfRTYsIE9QQ09ERV9FNwotICwgT1BDT0RFX0U4LCBPUENPREVfRTksIE9QQ09ERV9FQSwgT1BDT0RFX0VCCi0gLCBPUENPREVfRUMsIE9QQ09ERV9FRCwgT1BDT0RFX0VFLCBPUENPREVfRUYKLSAsIE9QQ09ERV9GMCwgT1BDT0RFX0YxLCBPUENPREVfRjIsIE9QQ09ERV9GMwotICwgT1BDT0RFX0Y0LCBPUENPREVfRjUsIE9QQ09ERV9GNiwgT1BDT0RFX0Y3Ci0gLCBPUENPREVfRjgsIE9QQ09ERV9GOSwgT1BDT0RFX0ZBLCBPUENPREVfRkIKLSAsIE9QQ09ERV9GQywgT1BDT0RFX0ZELCBPUENPREVfRkUsIE9QQ09ERV9GRgotfSBJTlNOX09QQ09ERTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcGNvZGUyIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wY29kZTIgewotICBPUENPREUyXzAsIE9QQ09ERTJfMSwgT1BDT0RFMl8yLCBPUENPREUyXzMKLSAsIE9QQ09ERTJfNCwgT1BDT0RFMl81LCBPUENPREUyXzYsIE9QQ09ERTJfNwotICwgT1BDT0RFMl84LCBPUENPREUyXzksIE9QQ09ERTJfQSwgT1BDT0RFMl9CCi0gLCBPUENPREUyX0MsIE9QQ09ERTJfRCwgT1BDT0RFMl9FLCBPUENPREUyX0YKLX0gSU5TTl9PUENPREUyOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG0zIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX20zIHsKLSAgTTNfMCwgTTNfMQotfSBJTlNOX00zOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG0zIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX20yIHsKLSAgTTJfMCwgTTJfMQotfSBJTlNOX00yOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG0xIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX20xIHsKLSAgTTFfMCwgTTFfMQotfSBJTlNOX00xOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIHplcm8gZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25femVybyB7Ci0gIFpFUk9fMAotfSBJTlNOX1pFUk87Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gbW9kZSBhIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX21vZGVhIHsKLSAgTU9ERUFfT0ZGU0VULCBNT0RFQV9JTkRJUkVDVF9PRkZTRVQKLX0gSU5TTl9NT0RFQTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiB6ZXJvIGEgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25femVyb2EgewotICBaRVJPQV8wCi19IElOU05fWkVST0E7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gbW9kZSBiIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX21vZGViIHsKLSAgTU9ERUJfSUxMMCwgTU9ERUJfSUxMMSwgTU9ERUJfSUxMMiwgTU9ERUJfSUxMMwotICwgTU9ERUJfSU5ESVJFQ1QsIE1PREVCX0lQX0RJU1AsIE1PREVCX1JFUzYsIE1PREVCX0lORElSRUNUX0lOREVYCi0gLCBNT0RFQl9JTEw4LCBNT0RFQl9JTEw5LCBNT0RFQl9JTEwxMCwgTU9ERUJfSUxMMTEKLSAsIE1PREVCX0RJU1AsIE1PREVCX0lORElSRUNUX0RJU1AsIE1PREVCX0lOREVYX0RJU1AsIE1PREVCX0lORElSRUNUX0lOREVYX0RJU1AKLX0gSU5TTl9NT0RFQjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiB6ZXJvIGIgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25femVyb2IgewotICBaRVJPQl8wCi19IElOU05fWkVST0I7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gYnJhbmNoIG0xIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX2JyX20xIHsKLSAgQlJfTTFfMCwgQlJfTTFfMQotfSBJTlNOX0JSX00xOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGJyYW5jaCB6ZXJvIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX2JyX3plcm8gewotICBCUl9aRVJPXzAKLX0gSU5TTl9CUl9aRVJPOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGN0cmwgemVybyBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9jdHJsX3plcm8gewotICBDVFJMX1pFUk9fMAotfSBJTlNOX0NUUkxfWkVSTzsKLQotLyogQXR0cmlidXRlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7Ci0gIE1BQ0hfQkFTRSwgTUFDSF9JOTYwX0tBX1NBLCBNQUNIX0k5NjBfQ0EsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfSTk2MCwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgaTk2MF9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX0VORF9CT09MUywgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKLX0gQ0dFTl9JRkxEX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaTk2MCBpZmllbGQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKLSAgSTk2MF9GX05JTCwgSTk2MF9GX09QQ09ERSwgSTk2MF9GX1NSQ0RTVCwgSTk2MF9GX1NSQzIKLSAsIEk5NjBfRl9NMywgSTk2MF9GX00yLCBJOTYwX0ZfTTEsIEk5NjBfRl9PUENPREUyCi0gLCBJOTYwX0ZfWkVSTywgSTk2MF9GX1NSQzEsIEk5NjBfRl9BQkFTRSwgSTk2MF9GX01PREVBCi0gLCBJOTYwX0ZfWkVST0EsIEk5NjBfRl9PRkZTRVQsIEk5NjBfRl9NT0RFQiwgSTk2MF9GX1NDQUxFCi0gLCBJOTYwX0ZfWkVST0IsIEk5NjBfRl9JTkRFWCwgSTk2MF9GX09QVERJU1AsIEk5NjBfRl9CUl9TUkMxCi0gLCBJOTYwX0ZfQlJfU1JDMiwgSTk2MF9GX0JSX00xLCBJOTYwX0ZfQlJfRElTUCwgSTk2MF9GX0JSX1pFUk8KLSAsIEk5NjBfRl9DVFJMX0RJU1AsIEk5NjBfRl9DVFJMX1pFUk8sIEk5NjBfRl9NQVgKLX0gSUZJRUxEX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIEk5NjBfRl9NQVgpCi0KLS8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKLSAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQotICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCi19IENHRU5fSFdfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaTk2MCBoYXJkd2FyZSB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKLSAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKLSAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfR1IsIEhXX0hfQ0MKLSAsIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX09QRVJBTkRfTUFDSCwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaTk2MCBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIEk5NjBfT1BFUkFORF9QQywgSTk2MF9PUEVSQU5EX1NSQzEsIEk5NjBfT1BFUkFORF9TUkMyLCBJOTYwX09QRVJBTkRfRFNUCi0gLCBJOTYwX09QRVJBTkRfTElUMSwgSTk2MF9PUEVSQU5EX0xJVDIsIEk5NjBfT1BFUkFORF9TVF9TUkMsIEk5NjBfT1BFUkFORF9BQkFTRQotICwgSTk2MF9PUEVSQU5EX09GRlNFVCwgSTk2MF9PUEVSQU5EX1NDQUxFLCBJOTYwX09QRVJBTkRfSU5ERVgsIEk5NjBfT1BFUkFORF9PUFRESVNQCi0gLCBJOTYwX09QRVJBTkRfQlJfU1JDMSwgSTk2MF9PUEVSQU5EX0JSX1NSQzIsIEk5NjBfT1BFUkFORF9CUl9ESVNQLCBJOTYwX09QRVJBTkRfQlJfTElUMQotICwgSTk2MF9PUEVSQU5EX0NUUkxfRElTUCwgSTk2MF9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBJOTYwX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDgKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9FTkRfQk9PTFMsIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9FTkRfTkJPT0xTCi19IENHRU5fSU5TTl9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLwotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBpOTYwX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBpOTYwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgaTk2MF9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBpOTYwX2NnZW5faW5zbl9hdHRyX3RhYmxlW107Ci0KLS8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KLQotZXh0ZXJuIENHRU5fS0VZV09SRCBpOTYwX2NnZW5fb3B2YWxfaF9ncjsKLWV4dGVybiBDR0VOX0tFWVdPUkQgaTk2MF9jZ2VuX29wdmFsX2hfY2M7Ci0KLQotCi0KLSNlbmRpZiAvKiBJOTYwX0NQVV9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLW9wYy5oIGIvc2ltL2k5NjAvaTk2MC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZGE3OC4uMDAwMDAwMAotLS0gYS9zaW0vaTk2MC9pOTYwLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSBoZWFkZXIgZm9yIGk5NjAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgSTk2MF9PUENfSAotI2RlZmluZSBJOTYwX09QQ19ICi0KLS8qIC0tIG9wYy5oICovCi0KLSN1bmRlZiBDR0VOX0RJU19IQVNIX1NJWkUKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgotI3VuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSAoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzNdCi0KLS8qID8/PyBVbnRpbCBjZ2VuIGRpc2Fzc2VtYmxlciBjb21wbGV0ZSBhbmQgZnVuY3Rpb25pbmcgd2VsbCwgcmVkaXJlY3QgYmFjawotICAgdG8gb2xkIGRpc2Fzc2VtYmxlci4gICovCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTihvZCwgcGMsIGluZm8pIHByaW50X2luc25faTk2MF9vcmlnIChwYywgaW5mbykKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGk5NjAgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgSTk2MF9JTlNOX0lOVkFMSUQsIEk5NjBfSU5TTl9NVUxPLCBJOTYwX0lOU05fTVVMTzEsIEk5NjBfSU5TTl9NVUxPMgotICwgSTk2MF9JTlNOX01VTE8zLCBJOTYwX0lOU05fUkVNTywgSTk2MF9JTlNOX1JFTU8xLCBJOTYwX0lOU05fUkVNTzIKLSAsIEk5NjBfSU5TTl9SRU1PMywgSTk2MF9JTlNOX0RJVk8sIEk5NjBfSU5TTl9ESVZPMSwgSTk2MF9JTlNOX0RJVk8yCi0gLCBJOTYwX0lOU05fRElWTzMsIEk5NjBfSU5TTl9SRU1JLCBJOTYwX0lOU05fUkVNSTEsIEk5NjBfSU5TTl9SRU1JMgotICwgSTk2MF9JTlNOX1JFTUkzLCBJOTYwX0lOU05fRElWSSwgSTk2MF9JTlNOX0RJVkkxLCBJOTYwX0lOU05fRElWSTIKLSAsIEk5NjBfSU5TTl9ESVZJMywgSTk2MF9JTlNOX0FERE8sIEk5NjBfSU5TTl9BRERPMSwgSTk2MF9JTlNOX0FERE8yCi0gLCBJOTYwX0lOU05fQURETzMsIEk5NjBfSU5TTl9TVUJPLCBJOTYwX0lOU05fU1VCTzEsIEk5NjBfSU5TTl9TVUJPMgotICwgSTk2MF9JTlNOX1NVQk8zLCBJOTYwX0lOU05fTk9UQklULCBJOTYwX0lOU05fTk9UQklUMSwgSTk2MF9JTlNOX05PVEJJVDIKLSAsIEk5NjBfSU5TTl9OT1RCSVQzLCBJOTYwX0lOU05fQU5ELCBJOTYwX0lOU05fQU5EMSwgSTk2MF9JTlNOX0FORDIKLSAsIEk5NjBfSU5TTl9BTkQzLCBJOTYwX0lOU05fQU5ETk9ULCBJOTYwX0lOU05fQU5ETk9UMSwgSTk2MF9JTlNOX0FORE5PVDIKLSAsIEk5NjBfSU5TTl9BTkROT1QzLCBJOTYwX0lOU05fU0VUQklULCBJOTYwX0lOU05fU0VUQklUMSwgSTk2MF9JTlNOX1NFVEJJVDIKLSAsIEk5NjBfSU5TTl9TRVRCSVQzLCBJOTYwX0lOU05fTk9UQU5ELCBJOTYwX0lOU05fTk9UQU5EMSwgSTk2MF9JTlNOX05PVEFORDIKLSAsIEk5NjBfSU5TTl9OT1RBTkQzLCBJOTYwX0lOU05fWE9SLCBJOTYwX0lOU05fWE9SMSwgSTk2MF9JTlNOX1hPUjIKLSAsIEk5NjBfSU5TTl9YT1IzLCBJOTYwX0lOU05fT1IsIEk5NjBfSU5TTl9PUjEsIEk5NjBfSU5TTl9PUjIKLSAsIEk5NjBfSU5TTl9PUjMsIEk5NjBfSU5TTl9OT1IsIEk5NjBfSU5TTl9OT1IxLCBJOTYwX0lOU05fTk9SMgotICwgSTk2MF9JTlNOX05PUjMsIEk5NjBfSU5TTl9YTk9SLCBJOTYwX0lOU05fWE5PUjEsIEk5NjBfSU5TTl9YTk9SMgotICwgSTk2MF9JTlNOX1hOT1IzLCBJOTYwX0lOU05fTk9ULCBJOTYwX0lOU05fTk9UMSwgSTk2MF9JTlNOX05PVDIKLSAsIEk5NjBfSU5TTl9OT1QzLCBJOTYwX0lOU05fT1JOT1QsIEk5NjBfSU5TTl9PUk5PVDEsIEk5NjBfSU5TTl9PUk5PVDIKLSAsIEk5NjBfSU5TTl9PUk5PVDMsIEk5NjBfSU5TTl9DTFJCSVQsIEk5NjBfSU5TTl9DTFJCSVQxLCBJOTYwX0lOU05fQ0xSQklUMgotICwgSTk2MF9JTlNOX0NMUkJJVDMsIEk5NjBfSU5TTl9TSExPLCBJOTYwX0lOU05fU0hMTzEsIEk5NjBfSU5TTl9TSExPMgotICwgSTk2MF9JTlNOX1NITE8zLCBJOTYwX0lOU05fU0hSTywgSTk2MF9JTlNOX1NIUk8xLCBJOTYwX0lOU05fU0hSTzIKLSAsIEk5NjBfSU5TTl9TSFJPMywgSTk2MF9JTlNOX1NITEksIEk5NjBfSU5TTl9TSExJMSwgSTk2MF9JTlNOX1NITEkyCi0gLCBJOTYwX0lOU05fU0hMSTMsIEk5NjBfSU5TTl9TSFJJLCBJOTYwX0lOU05fU0hSSTEsIEk5NjBfSU5TTl9TSFJJMgotICwgSTk2MF9JTlNOX1NIUkkzLCBJOTYwX0lOU05fRU1VTCwgSTk2MF9JTlNOX0VNVUwxLCBJOTYwX0lOU05fRU1VTDIKLSAsIEk5NjBfSU5TTl9FTVVMMywgSTk2MF9JTlNOX01PViwgSTk2MF9JTlNOX01PVjEsIEk5NjBfSU5TTl9NT1ZMCi0gLCBJOTYwX0lOU05fTU9WTDEsIEk5NjBfSU5TTl9NT1ZULCBJOTYwX0lOU05fTU9WVDEsIEk5NjBfSU5TTl9NT1ZRCi0gLCBJOTYwX0lOU05fTU9WUTEsIEk5NjBfSU5TTl9NT0RQQywgSTk2MF9JTlNOX01PREFDLCBJOTYwX0lOU05fTERBX09GRlNFVAotICwgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MREFfRElTUAotICwgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERBX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEX09GRlNFVAotICwgSTk2MF9JTlNOX0xEX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xEX0lORElSRUNULCBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRF9ESVNQCi0gLCBJOTYwX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX0xEX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERPQl9PRkZTRVQKLSAsIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERPQl9ESVNQCi0gLCBJOTYwX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERPQl9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERPU19PRkZTRVQKLSAsIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERPU19ESVNQCi0gLCBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERPU19JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERJQl9PRkZTRVQKLSAsIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERJQl9ESVNQCi0gLCBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERJQl9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERJU19PRkZTRVQKLSAsIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERJU19ESVNQCi0gLCBJOTYwX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERJU19JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERMX09GRlNFVAotICwgSTk2MF9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRExfRElTUAotICwgSTk2MF9JTlNOX0xETF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERMX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEVF9PRkZTRVQKLSAsIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERUX0lORElSRUNULCBJOTYwX0lOU05fTERUX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERUX0RJU1AKLSAsIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX0xEVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRFFfT0ZGU0VUCi0gLCBJOTYwX0lOU05fTERRX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVCwgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX0xEUV9ESVNQCi0gLCBJOTYwX0lOU05fTERRX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRFFfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RfT0ZGU0VUCi0gLCBJOTYwX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fU1RfSU5ESVJFQ1QsIEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX1NUX0RJU1AKLSAsIEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fU1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVE9CX09GRlNFVAotICwgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVCwgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9TVE9CX0RJU1AKLSAsIEk5NjBfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9TVE9CX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVE9TX09GRlNFVAotICwgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fU1RPU19JTkRJUkVDVCwgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9TVE9TX0RJU1AKLSAsIEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9TVE9TX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVExfT0ZGU0VUCi0gLCBJOTYwX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVCwgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX1NUTF9ESVNQCi0gLCBJOTYwX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9TVExfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RUX09GRlNFVAotICwgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1QsIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9TVFRfRElTUAotICwgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fU1RUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUUV9PRkZTRVQKLSAsIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fU1RRX0lORElSRUNULCBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fU1RRX0RJU1AKLSAsIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX1NUUV9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9DTVBPQkVfUkVHCi0gLCBJOTYwX0lOU05fQ01QT0JFX0xJVCwgSTk2MF9JTlNOX0NNUE9CTkVfUkVHLCBJOTYwX0lOU05fQ01QT0JORV9MSVQsIEk5NjBfSU5TTl9DTVBPQkxfUkVHCi0gLCBJOTYwX0lOU05fQ01QT0JMX0xJVCwgSTk2MF9JTlNOX0NNUE9CTEVfUkVHLCBJOTYwX0lOU05fQ01QT0JMRV9MSVQsIEk5NjBfSU5TTl9DTVBPQkdfUkVHCi0gLCBJOTYwX0lOU05fQ01QT0JHX0xJVCwgSTk2MF9JTlNOX0NNUE9CR0VfUkVHLCBJOTYwX0lOU05fQ01QT0JHRV9MSVQsIEk5NjBfSU5TTl9DTVBJQkVfUkVHCi0gLCBJOTYwX0lOU05fQ01QSUJFX0xJVCwgSTk2MF9JTlNOX0NNUElCTkVfUkVHLCBJOTYwX0lOU05fQ01QSUJORV9MSVQsIEk5NjBfSU5TTl9DTVBJQkxfUkVHCi0gLCBJOTYwX0lOU05fQ01QSUJMX0xJVCwgSTk2MF9JTlNOX0NNUElCTEVfUkVHLCBJOTYwX0lOU05fQ01QSUJMRV9MSVQsIEk5NjBfSU5TTl9DTVBJQkdfUkVHCi0gLCBJOTYwX0lOU05fQ01QSUJHX0xJVCwgSTk2MF9JTlNOX0NNUElCR0VfUkVHLCBJOTYwX0lOU05fQ01QSUJHRV9MSVQsIEk5NjBfSU5TTl9CQkNfUkVHCi0gLCBJOTYwX0lOU05fQkJDX0xJVCwgSTk2MF9JTlNOX0JCU19SRUcsIEk5NjBfSU5TTl9CQlNfTElULCBJOTYwX0lOU05fQ01QSQotICwgSTk2MF9JTlNOX0NNUEkxLCBJOTYwX0lOU05fQ01QSTIsIEk5NjBfSU5TTl9DTVBJMywgSTk2MF9JTlNOX0NNUE8KLSAsIEk5NjBfSU5TTl9DTVBPMSwgSTk2MF9JTlNOX0NNUE8yLCBJOTYwX0lOU05fQ01QTzMsIEk5NjBfSU5TTl9URVNUTk9fUkVHCi0gLCBJOTYwX0lOU05fVEVTVEdfUkVHLCBJOTYwX0lOU05fVEVTVEVfUkVHLCBJOTYwX0lOU05fVEVTVEdFX1JFRywgSTk2MF9JTlNOX1RFU1RMX1JFRwotICwgSTk2MF9JTlNOX1RFU1RORV9SRUcsIEk5NjBfSU5TTl9URVNUTEVfUkVHLCBJOTYwX0lOU05fVEVTVE9fUkVHLCBJOTYwX0lOU05fQk5PCi0gLCBJOTYwX0lOU05fQkcsIEk5NjBfSU5TTl9CRSwgSTk2MF9JTlNOX0JHRSwgSTk2MF9JTlNOX0JMCi0gLCBJOTYwX0lOU05fQk5FLCBJOTYwX0lOU05fQkxFLCBJOTYwX0lOU05fQk8sIEk5NjBfSU5TTl9CCi0gLCBJOTYwX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fQlhfSU5ESVJFQ1QsIEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX0JYX0RJU1AKLSAsIEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fQ0FMTFhfRElTUCwgSTk2MF9JTlNOX0NBTExYX0lORElSRUNULCBJOTYwX0lOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUCi0gLCBJOTYwX0lOU05fUkVULCBJOTYwX0lOU05fQ0FMTFMsIEk5NjBfSU5TTl9GTUFSSywgSTk2MF9JTlNOX0ZMVVNIUkVHCi0gLCBJOTYwX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBJOTYwX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIEk5NjBfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wY29kZTsKLSAgbG9uZyBmX3NyY2RzdDsKLSAgbG9uZyBmX3NyYzI7Ci0gIGxvbmcgZl9tMzsKLSAgbG9uZyBmX20yOwotICBsb25nIGZfbTE7Ci0gIGxvbmcgZl9vcGNvZGUyOwotICBsb25nIGZfemVybzsKLSAgbG9uZyBmX3NyYzE7Ci0gIGxvbmcgZl9hYmFzZTsKLSAgbG9uZyBmX21vZGVhOwotICBsb25nIGZfemVyb2E7Ci0gIGxvbmcgZl9vZmZzZXQ7Ci0gIGxvbmcgZl9tb2RlYjsKLSAgbG9uZyBmX3NjYWxlOwotICBsb25nIGZfemVyb2I7Ci0gIGxvbmcgZl9pbmRleDsKLSAgbG9uZyBmX29wdGRpc3A7Ci0gIGxvbmcgZl9icl9zcmMxOwotICBsb25nIGZfYnJfc3JjMjsKLSAgbG9uZyBmX2JyX20xOwotICBsb25nIGZfYnJfZGlzcDsKLSAgbG9uZyBmX2JyX3plcm87Ci0gIGxvbmcgZl9jdHJsX2Rpc3A7Ci0gIGxvbmcgZl9jdHJsX3plcm87Ci19OwotCi0jZGVmaW5lIENHRU5fSU5JVF9QQVJTRShvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0lOU0VSVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0VYVFJBQ1Qob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9QUklOVChvZCkgXAote1wKLX0KLQotCi0jZW5kaWYgLyogSTk2MF9PUENfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvaTk2MC1zaW0uaCBiL3NpbS9pOTYwL2k5NjAtc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWIwM2UuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvaTk2MC1zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSNpZm5kZWYgSTk2MF9TSU1fSAotI2RlZmluZSBJOTYwX1NJTV9ICi0KLS8qIGdkYiByZWdpc3RlciBudW1iZXJzICovCi0vKiBDb3BpZWQgZnJvbSBnZGIvY29uZmlnL2k5NjAvdGMtaTk2MC5oLiAgKi8KLSNkZWZpbmUgUENXX1JFR05VTSAzMiAgIC8qIHByb2Nlc3MgY29udHJvbCB3b3JkICovCi0jZGVmaW5lIEFDV19SRUdOVU0gMzMgICAvKiBhcml0aG1ldGljIGNvbnRyb2wgd29yZCAqLwotI2RlZmluZSBUQ1dfUkVHTlVNIDM0ICAgLyogdHJhY2UgY29udHJvbCB3b3JkICovCi0jZGVmaW5lIElQX1JFR05VTSAgMzUgICAvKiBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0jZGVmaW5lIEZQMF9SRUdOVU0gMzYgICAvKiBGaXJzdCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotLyogU29tZSByZWdpc3RlcnMgaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWUgKi8KLSNkZWZpbmUgUENfUkVHTlVNICBJUF9SRUdOVU0gICAgLyogR0RCIHJlZmVycyB0byBpcCBhcyB0aGUgUHJvZ3JhbSBDb3VudGVyICovCi0KLVNJIGFfaTk2MF9oX2dyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKLXZvaWQgYV9pOTYwX2hfZ3Jfc2V0IChTSU1fQ1BVICosIFVJTlQsIFNJKTsKLUlBRERSIGFfaTk2MF9oX3BjX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgYV9pOTYwX2hfcGNfc2V0IChTSU1fQ1BVICosIElBRERSKTsKLQwKLSNkZWZpbmUgR0VUVFdJIEdFVFRTSQotI2RlZmluZSBTRVRUV0kgU0VUVFNJCi0MCi0vKiBFeGNlcHRpb24sIEludGVycnVwdCwgYW5kIFRyYXAgYWRkcmVzc2VzICovCi0vKiA/Pz8gSGFjayBmb3IgdHJhcHMuYy4gICovCi0jZGVmaW5lIEVJVF9UUkFQX0JBU0VfQUREUgkweDQwCi0KLS8qIFNwZWNpYWwgcHVycG9zZSB0cmFwcy4gICovCi0vKiA/Pz8gSGFjayBmb3IgdHJhcHMuYy4gICovCi0jZGVmaW5lIFRSQVBfU1lTQ0FMTAkwCi0jZGVmaW5lIFRSQVBfQlJFQUtQT0lOVAkxCi0KLS8qIENhY2hlIFB1cmdlIENvbnRyb2wgKG9ubHkgZXhpc3RzIG9uIGVhcmx5IHZlcnNpb25zIG9mIGNoaXBzKSAqLwotLyogPz8/IEhhY2sgZm9yIGRldmljZXMuYy4gICovCi0jZGVmaW5lIE1TUFJfQUREUiAweGZmZmZmZmY3Ci0jZGVmaW5lIE1TUFJfUFVSR0UgMQotCi0vKiBDYWNoZSBDb250cm9sIFJlZ2lzdGVyICovCi0vKiA/Pz8gSGFjayBmb3IgZGV2aWNlcy5jLiAgKi8KLSNkZWZpbmUgTUNDUl9BRERSIDB4ZmZmZmZmZmYKLSNkZWZpbmUgTUNDUl9DUCAweDgwCi0KLS8qIFN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhbGwgZGV2aWNlIHN1cHBvcnQuICAqLwotLyogPz8/IEhhY2sgZm9yIHNpbS1pZi5jLiAgKi8KLSNkZWZpbmUgSTk2MF9ERVZJQ0VfQUREUgkweGZmMDAwMDAwCi0jZGVmaW5lIEk5NjBfREVWSUNFX0xFTgkJMHgwMGZmZmZmZgotCi0vKiBzaW1fY29yZV9hdHRhY2ggZGV2aWNlIGFyZ3VtZW50LiAgKi8KLS8qID8/PyBIYWNrIGZvciBzaW0taWYuYy4gICovCi1leHRlcm4gZGV2aWNlIGk5NjBfZGV2aWNlczsKLQotLyogRklYTUU6IFRlbXBvcmFyeSwgdW50aWwgZGV2aWNlIHN1cHBvcnQgcmVhZHkuICAqLwotLyogPz8/IEhhY2sgZm9yIGRldmljZXMuYy4gICovCi1zdHJ1Y3QgX2RldmljZSB7IGludCBmb287IH07Ci0KLSNlbmRpZiBJOTYwX1NJTV9ICmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLmMgYi9zaW0vaTk2MC9pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmFjMzcuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIGk5NjAgc2ltdWxhdG9yIHN1cHBvcnQgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBXQU5UX0NQVQotI2RlZmluZSBXQU5UX0NQVV9JOTYwQkFTRQotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJjZ2VuLW1lbS5oIgotI2luY2x1ZGUgImNnZW4tb3BzLmgiCi0KLS8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLQotaW50Ci1pOTYwYmFzZV9mZXRjaF9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJIGludCBsZW4pCi17Ci0gIGlmIChybiA8IDMyKQotICAgIFNFVFRXSSAoYnVmLCBhX2k5NjBfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCBybikpOwotICBlbHNlCi0gICAgc3dpdGNoIChybikKLSAgICAgIHsKLSAgICAgIGNhc2UgUENfUkVHTlVNIDoKLQlTRVRUV0kgKGJ1ZiwgYV9pOTYwX2hfcGNfZ2V0IChjdXJyZW50X2NwdSkpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KLQotfQotCi0vKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLWludAotaTk2MGJhc2Vfc3RvcmVfcmVnaXN0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBpbnQgcm4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKLQkJCSBpbnQgbGVuKQotewotICBpZiAocm4gPCAzMikKLSAgICBhX2k5NjBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCBybiwgR0VUVFdJIChidWYpKTsKLSAgZWxzZQotICAgIHN3aXRjaCAocm4pCi0gICAgICB7Ci0gICAgICBjYXNlIFBDX1JFR05VTSA6Ci0JYV9pOTYwX2hfcGNfc2V0IChjdXJyZW50X2NwdSwgR0VUVFdJIChidWYpKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQgOgotCXJldHVybiAwOwotICAgICAgfQotCi0gIHJldHVybiAtMTsgLypGSVhNRSovCi19Ci0MCi0vKiBDb3ZlciBmbnMgZm9yIG1hY2ggaW5kZXBlbmRlbnQgcmVnaXN0ZXIgYWNjZXNzZXMuICAqLwotCi1TSQotYV9pOTYwX2hfZ3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKLXsKLSAgc3dpdGNoIChNQUNIX05VTSAoQ1BVX01BQ0ggKGN1cnJlbnRfY3B1KSkpCi0gICAgewotI2lmZGVmIEhBVkVfQ1BVX0k5NjBCQVNFCi0gICAgY2FzZSBNQUNIX0k5NjBfS0FfU0EgOgotICAgIGNhc2UgTUFDSF9JOTYwX0NBIDoKLSAgICAgIHJldHVybiBpOTYwYmFzZV9oX2dyX2dldCAoY3VycmVudF9jcHUsIHJlZ25vKTsKLSNlbmRpZgotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1hX2k5NjBfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCi17Ci0gIHN3aXRjaCAoTUFDSF9OVU0gKENQVV9NQUNIIChjdXJyZW50X2NwdSkpKQotICAgIHsKLSNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQotICAgIGNhc2UgTUFDSF9JOTYwX0tBX1NBIDoKLSAgICBjYXNlIE1BQ0hfSTk2MF9DQSA6Ci0gICAgICBpOTYwYmFzZV9oX2dyX3NldCAoY3VycmVudF9jcHUsIHJlZ25vLCBuZXd2YWwpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotSUFERFIKLWFfaTk2MF9oX3BjX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHN3aXRjaCAoTUFDSF9OVU0gKENQVV9NQUNIIChjdXJyZW50X2NwdSkpKQotICAgIHsKLSNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQotICAgIGNhc2UgTUFDSF9JOTYwX0tBX1NBIDoKLSAgICBjYXNlIE1BQ0hfSTk2MF9DQSA6Ci0gICAgICByZXR1cm4gaTk2MGJhc2VfaF9wY19nZXQgKGN1cnJlbnRfY3B1KTsKLSNlbmRpZgotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1hX2k5NjBfaF9wY19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBuZXd2YWwpCi17Ci0gIHN3aXRjaCAoTUFDSF9OVU0gKENQVV9NQUNIIChjdXJyZW50X2NwdSkpKQotICAgIHsKLSNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQotICAgIGNhc2UgTUFDSF9JOTYwX0tBX1NBIDoKLSAgICBjYXNlIE1BQ0hfSTk2MF9DQSA6Ci0gICAgICBpOTYwYmFzZV9oX3BjX3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotDAotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0KLS8qIEZJWE1FOiBTb21lIG9mIHRoZXNlIHNob3VsZCBiZSBpbmxpbmUgb3IgbWFjcm9zLiAgTGF0ZXIuICAqLwotCi0vKiBJbml0aWFsaXplIGN5Y2xlIGNvdW50aW5nIGZvciBhbiBpbnNuLgotICAgRklSU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsCi0gICBpbnNucy4gICovCi0KLXZvaWQKLWk5NjBiYXNlX21vZGVsX2luc25fYmVmb3JlIChTSU1fQ1BVICpjcHUsIGludCBmaXJzdF9wKQotewotfQotCi0vKiBSZWNvcmQgdGhlIGN5Y2xlcyBjb21wdXRlZCBmb3IgYW4gaW5zbi4KLSAgIExBU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMsCi0gICBhbmQgd2UgdXBkYXRlIHRoZSB0b3RhbCBjeWNsZSBjb3VudC4KLSAgIENZQ0xFUyBpcyB0aGUgY3ljbGUgY291bnQgb2YgdGhlIGluc24uICAqLwotCi12b2lkCi1pOTYwYmFzZV9tb2RlbF9pbnNuX2FmdGVyIChTSU1fQ1BVICpjcHUsIGludCBsYXN0X3AsIGludCBjeWNsZXMpCi17Ci19Ci0KLS8qIEluaXRpYWxpemUgY3ljbGUgY291bnRpbmcgZm9yIGFuIGluc24uCi0gICBGSVJTVF9QIGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwKLSAgIGluc25zLiAgKi8KLQotdm9pZAotaTk2MF9tb2RlbF9pbml0X2luc25fY3ljbGVzIChTSU1fQ1BVICpjcHUsIGludCBmaXJzdF9wKQotewotfQotCi0vKiBSZWNvcmQgdGhlIGN5Y2xlcyBjb21wdXRlZCBmb3IgYW4gaW5zbi4KLSAgIExBU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMsCi0gICBhbmQgd2UgdXBkYXRlIHRoZSB0b3RhbCBjeWNsZSBjb3VudC4gICovCi0KLXZvaWQKLWk5NjBfbW9kZWxfdXBkYXRlX2luc25fY3ljbGVzIChTSU1fQ1BVICpjcHUsIGludCBsYXN0X3ApCi17Ci19Ci0KLXZvaWQKLWk5NjBfbW9kZWxfcmVjb3JkX2N5Y2xlcyAoU0lNX0NQVSAqY3B1LCB1bnNpZ25lZCBsb25nIGN5Y2xlcykKLXsKLX0KLQotdm9pZAotaTk2MGJhc2VfbW9kZWxfbWFya19nZXRfaF9nciAoU0lNX0NQVSAqY3B1LCBBUkdCVUYgKmFidWYpCi17Ci19Ci0KLXZvaWQKLWk5NjBiYXNlX21vZGVsX21hcmtfc2V0X2hfZ3IgKFNJTV9DUFUgKmNwdSwgQVJHQlVGICphYnVmKQotewotfQotCi0jZW5kaWYgLyogV0lUSF9QUk9GSUxFX01PREVMX1AgKi8KLQwKLWludAotaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkKQotewotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkKQotewotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19CmRpZmYgLS1naXQgYS9zaW0vaTk2MC9tbG9vcC5pbiBiL3NpbS9pOTYwL21sb29wLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNhZDQ3Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL21sb29wLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLSMgU2ltdWxhdG9yIG1haW4gbG9vcCBmb3IgaTk2MC4gLSotIEMgLSotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFN5bnRheDoKLSMgL2Jpbi9zaCBtYWlubG9vcC5pbiBjb21tYW5kCi0jCi0jIENvbW1hbmQgaXMgb25lIG9mOgotIwotIyBpbml0Ci0jIHN1cHBvcnQKLSMgZXh0cmFjdC17c2ltcGxlLHNjYWNoZSxwYmJ9Ci0jIHtmdWxsLGZhc3R9LWV4ZWMte3NpbXBsZSxzY2FjaGUscGJifQotIwotIyBBIHRhcmdldCBuZWVkIG9ubHkgcHJvdmlkZSBhICJmdWxsIiB2ZXJzaW9uIG9mIG9uZSBvZiBzaW1wbGUsc2NhY2hlLHBiYi4KLSMgSWYgdGhlIHRhcmdldCB3YW50cyBpdCBjYW4gYWxzbyBwcm92aWRlIGEgZmFzdCB2ZXJzaW9uIG9mIHNhbWUuCi0jIEl0IGNhbid0IHByb3ZpZGUgbW9yZSB0aGFuIHRoaXMsIGhvd2V2ZXIgZm9yIGlsbHVzdHJhdGlvbidzIHNha2UgdGhlIE0zMlIKLSMgcG9ydCBwcm92aWRlcyBleGFtcGxlcyBvZiBhbGwuCi0KLSMgPz8/IEFmdGVyIGEgZmV3IG1vcmUgcG9ydHMgYXJlIGRvbmUsIHJldmlzaXQuCi0jIFdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIG1hY2hpbmUgZ2VuZXJhdGUgYSBsb3Qgb2YgdGhpcy4KLQotY2FzZSAieCQxIiBpbgotCi14c3VwcG9ydCkKLQotY2F0IDw8RU9GCi0KLS8qc3RhdGljIElOTElORSovIGNvbnN0IElERVNDICoKLWV4dHJhY3QzMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLAotCSAgIEFSR0JVRiAqYWJ1ZiwgaW50IGZhc3RfcCkKLXsKLSAgLyogPz8/IHdpbHNvbiwgaW5zdHJ1Y3Rpb25zIGFyZSAzMiBiaXRzLiAgKi8KLSAgY29uc3QgSURFU0MgKmQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgKFVTSSkgaW5zbiwgYWJ1Zik7Ci0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgZCwgcGMsIGZhc3RfcCk7Ci0gIGlmICghIGZhc3RfcCkKLSAgICB7Ci0gICAgICBpbnQgdHJhY2VfcCA9IFBDX0lOX1RSQUNFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBpbnQgcHJvZmlsZV9wID0gUENfSU5fUFJPRklMRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgQGNwdUBfZmlsbF9hcmdidWZfdHAgKGN1cnJlbnRfY3B1LCBhYnVmLCB0cmFjZV9wLCBwcm9maWxlX3ApOwotICAgIH0KLSAgcmV0dXJuIGQ7Ci19Ci0KLSNpZiAwCi0vKnN0YXRpYyBJTkxJTkUqLyBjb25zdCBJREVTQyAqCi0vKiA/Pz8gd2lsc29uLCBTb21lIGluc3RydWN0aW9ucyBhcmUgNjQgYml0cy4gICovCi1leHRyYWN0NjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGluc25fdCBpbnNuLAotCSAgIEFSR0JVRiAqYWJ1ZiwgaW50IGZhc3RfcCkKLXsKLSAgY29uc3QgSURFU0MgKmQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgKFVESSkgaW5zbiA+PiAzMiwgYWJ1Zik7Ci0gIFNFTV9TRVRfQ09ERSAoYWJ1ZiwgZCwgZmFzdF9wKTsKLSAgYWJ1Zi0+aWRlc2MgPSBkOwotICBhYnVmLT5hZGRyID0gcGM7Ci0gIHJldHVybiBkOwotfQotI2VuZGlmCi0KLXN0YXRpYyBJTkxJTkUgU0VNX1BDCi1leGVjdXRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYywgaW50IGZhc3RfcCkKLXsKLSAgU0VNX1BDIHZwYzsKLQotICBpZiAoZmFzdF9wKQotICAgIHsKLSNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GQVNUCi0jaWYgV0lUSF9TQ0FDSEUKLSAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZmFzdCkgKGN1cnJlbnRfY3B1LCBzYyk7Ci0jZWxzZQotICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mYXN0KSAoY3VycmVudF9jcHUsICZzYy0+YXJnYnVmKTsKLSNlbmRpZgotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmIC8qIFdJVEhfU0VNX1NXSVRDSF9GQVNUICovCi0gICAgfQotICBlbHNlCi0gICAgewotI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKLSAgICAgIEFSR0JVRiAqYWJ1ZiA9ICZzYy0+YXJnYnVmOwotICAgICAgY29uc3QgSURFU0MgKmlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpZGVzYy0+aWRhdGE7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCCi0gICAgICBpbnQgdmlydHVhbF9wID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9WSVJUVUFMKTsKLSNlbHNlCi0gICAgICBpbnQgdmlydHVhbF9wID0gMDsKLSNlbmRpZgotCi0gICAgICBpZiAoISB2aXJ0dWFsX3ApCi0JewotCSAgLyogRklYTUU6IGNhbGwgeC1iZWZvcmUgKi8KLQkgIGlmIChBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKLQkgICAgUFJPRklMRV9DT1VOVF9JTlNOIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkciwgaWRlc2MtPm51bSk7Ci0JICAvKiBGSVhNRTogTGF0ZXIgbWFrZSBjb3ZlciBtYWNyb3M6IFBST0ZJTEVfSU5TTl97SU5JVCxGSU5JfS4gICovCi0JICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0JICAgIEBjcHVAX21vZGVsX2luc25fYmVmb3JlIChjdXJyZW50X2NwdSwgMSAvKmZpcnN0X3AqLyk7Ci0JICBUUkFDRV9JTlNOX0lOSVQgKGN1cnJlbnRfY3B1LCBhYnVmLCAxKTsKLQkgIFRSQUNFX0lOU04gKGN1cnJlbnRfY3B1LCBpbnNuLAotCQkgICAgICAoY29uc3Qgc3RydWN0IGFyZ2J1ZiAqKSBhYnVmLCBhYnVmLT5hZGRyKTsKLQl9Ci0jaWYgV0lUSF9TQ0FDSEUKLSAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZnVsbCkgKGN1cnJlbnRfY3B1LCBzYyk7Ci0jZWxzZQotICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIGFidWYpOwotI2VuZGlmCi0gICAgICBpZiAoISB2aXJ0dWFsX3ApCi0JewotCSAgLyogRklYTUU6IGNhbGwgeC1hZnRlciAqLwotCSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotCSAgICB7Ci0JICAgICAgaW50IGN5Y2xlczsKLQotCSAgICAgIGN5Y2xlcyA9ICgqaWRlc2MtPnRpbWluZy0+bW9kZWxfZm4pIChjdXJyZW50X2NwdSwgc2MpOwotCSAgICAgIEBjcHVAX21vZGVsX2luc25fYWZ0ZXIgKGN1cnJlbnRfY3B1LCAxIC8qbGFzdF9wKi8sIGN5Y2xlcyk7Ci0JICAgIH0KLQkgIFRSQUNFX0lOU05fRklOSSAoY3VycmVudF9jcHUsIGFidWYsIDEpOwotCX0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZiAvKiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAqLwotICAgIH0KLQotICByZXR1cm4gdnBjOwotfQotCi1FT0YKLQotOzsKLQoteGluaXQpCi0KLWNhdCA8PEVPRgotLyp4eHhpbml0Ki8KLUVPRgotCi07OwotCi14ZXh0cmFjdC1zaW1wbGUgfCB4ZXh0cmFjdC1zY2FjaGUpCi0KLWNhdCA8PEVPRgotewotICBpZiAoKHBjICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSNpZiAwCi0gICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgotCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCi0JIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCi0gICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiAmIDB4N2ZmZiwgc2MsIEZBU1RfUCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBVU0kgaW5zbiA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICAvKiA/Pz8gd2lsc29uLCBpbnNucyBhcmUgMzIgYml0cywgdW5sZXNzIE1FTUIgd2l0aCBkaXNwbGFjZW1lbnQsIHdoaWNoCi0JIGhhcyBoaWdoIGJpdCBzZXQsIGJpdCAxMiBzZXQsIGFuZCBtb2RlIG9mIDUsIDEyLCAxMywgMTQsIG9yIDE1LiAgKi8KLSAgICAgIGlmICgoKFNJKSBpbnNuID4gMCkKLQkgIHx8ICEgKCgoaW5zbiAmIDB4MzAwMCkgPT0gMHgzMDAwKQotCQl8fCAoKGluc24gJiAweDNDMDApID09IDB4MTQwMCkpKQotCXsKLQkgIGV4dHJhY3QzMiAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywgRkFTVF9QKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgVURJIGxsaW5zbiA9ICgoKFVESSkgaW5zbiA8PCAzMikgfHwgR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKzQpKTsKLQkgIGV4dHJhY3Q2NCAoY3VycmVudF9jcHUsIHBjLCBsbGluc24sIHNjLCBGQVNUX1ApOwotCX0KLSAgICB9Ci19Ci1FT0YKLQotOzsKLQoteGV4dHJhY3QtcGJiKQotCi0jIElucHV0czogIGN1cnJlbnRfY3B1LCBwYywgc2MsIG1heF9pbnNucywgRkFTVF9QCi0jIE91dHB1dHM6IHNjLCBwYwotIyBzYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgotIyBwYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgotIyBJZiB0aGUgcGJiIGlzIHRlcm1pbmF0ZWQgYnkgYSBjdGkgaW5zbiwgU0VUX0NUSV9WUEMoc2MpIG11c3QgYmUgY2FsbGVkCi0jIHRvIHJlY29yZCB0aGUgdnBjIG9mIHRoZSBjdGkgaW5zbi4KLSMgU0VUX0lOU05fQ09VTlQobikgbXVzdCBiZSBjYWxsZWQgdG8gcmVjb3JkIG51bWJlciBvZiByZWFsIGluc25zLgotCi1jYXQgPDxFT0YKLXsKLSAgY29uc3QgSURFU0MgKmlkZXNjOwotICBpbnQgaWNvdW50ID0gMDsKLQotICBpZiAoKHBjICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSNpZiAwCi0gICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgotCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCi0JIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCi0gICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBpZGVzYyA9IGV4dHJhY3QxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKLSAgICAgICsrc2M7Ci0gICAgICAtLW1heF9pbnNuczsKLSAgICAgICsraWNvdW50OwotICAgICAgcGMgKz0gMjsKLSAgICAgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCXsKLQkgIFNFVF9DVElfVlBDIChzYyAtIDEpOwotCSAgZ290byBGaW5pc2g7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHdoaWxlIChtYXhfaW5zbnMgPiAwKQotICAgIHsKLSAgICAgIFVTSSBpbnNuID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKTsKLSNpZiAwCi0gICAgICAvKiA/Pz8gd2lsc29uLCBpbnNucyBhcmUgMzIgYml0cywgdW5sZXNzIE1FTUIgd2l0aCBkaXNwbGFjZW1lbnQsIHdoaWNoCi0JIGhhcyBoaWdoIGJpdCBzZXQsIGJpdCAxMiBzZXQsIGFuZCBtb2RlIG9mIDUsIDEyLCAxMywgMTQsIG9yIDE1LiAgKi8KLSAgICAgIGlmICgoKFNJKSBpbnNuID4gMCkKLQkgIHx8ICEgKCgoaW5zbiAmIDB4MzAwMCkgPT0gMHgzMDAwKQotCQl8fCAoKGluc24gJiAweDNDMDApID09IDB4MTQwMCkpKQotCXsKLQkgIGlkZXNjID0gZXh0cmFjdDMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sICZzYy0+YXJnYnVmLCBGQVNUX1ApOwotCSAgKytzYzsKLQkgIC0tbWF4X2luc25zOwotCSAgKytpY291bnQ7Ci0JICBwYyArPSA0OwotCSAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCi0JICAgIHsKLQkgICAgICBTRVRfQ1RJX1ZQQyAoc2MgLSAxKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZGVzYyA9IGV4dHJhY3Q2NCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKLQkgICsrc2M7Ci0JICAtLW1heF9pbnNuczsKLQkgICsraWNvdW50OwotCSAgcGMgKz0gODsKLQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCSAgICB7Ci0JICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0jZWxzZQotICAgICAgaWRlc2MgPSBleHRyYWN0MzIgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgJnNjLT5hcmdidWYsIEZBU1RfUCk7Ci0gICAgICArK3NjOwotICAgICAgLS1tYXhfaW5zbnM7Ci0gICAgICArK2ljb3VudDsKLSAgICAgIHBjICs9IGlkZXNjLT5sZW5ndGg7Ci0gICAgICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKLSAgICAgICAgewotICAgICAgICAgIFNFVF9DVElfVlBDIChzYyAtIDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gRmluaXNoOgotICBTRVRfSU5TTl9DT1VOVCAoaWNvdW50KTsKLX0KLUVPRgotCi07OwotCi14ZnVsbC1leGVjLSogfCB4ZmFzdC1leGVjLSopCi0KLSMgSW5wdXRzOiBjdXJyZW50X2NwdSwgdnBjLCBGQVNUX1AKLSMgT3V0cHV0czogdnBjCi0jIHZwYyBpcyB0aGUgdmlydHVhbCBwcm9ncmFtIGNvdW50ZXIuCi0KLWNhdCA8PEVPRgotI2lmICghIEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCkgfHwgKEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCkKLSNkZWZpbmUgREVGSU5FX1NXSVRDSAotI2luY2x1ZGUgInNlbS1zd2l0Y2guYyIKLSNlbHNlCi0gIHZwYyA9IGV4ZWN1dGUgKGN1cnJlbnRfY3B1LCB2cGMsIEZBU1RfUCk7Ci0jZW5kaWYKLUVPRgotCi07OwotCi0qKQotICBlY2hvICJJbnZhbGlkIGFyZ3VtZW50IHRvIG1haW5sb29wLmluOiAkMSIgPiYyCi0gIGV4aXQgMQotICA7OwotCi1lc2FjCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9tb2RlbC5jIGIvc2ltL2k5NjAvbW9kZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZDllYS4uMDAwMDAwMAotLS0gYS9zaW0vaTk2MC9tb2RlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNjUgKzAsMCBAQAotLyogU2ltdWxhdG9yIG1vZGVsIHN1cHBvcnQgZm9yIGk5NjBiYXNlLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jZGVmaW5lIFdBTlRfQ1BVIGk5NjBiYXNlCi0jZGVmaW5lIFdBTlRfQ1BVX0k5NjBCQVNFCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0vKiBUaGUgcHJvZmlsaW5nIGRhdGEgaXMgcmVjb3JkZWQgaGVyZSwgYnV0IGlzIGFjY2Vzc2VkIHZpYSB0aGUgcHJvZmlsaW5nCi0gICBtZWNoYW5pc20uICBBZnRlciBhbGwsIHRoaXMgaXMgaW5mb3JtYXRpb24gZm9yIHByb2ZpbGluZy4gICovCi0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotCi0vKiBNb2RlbCBoYW5kbGVycyBmb3IgZWFjaCBpbnNuLiAgKi8KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX211bG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX211bG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbXVsbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tdWxvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3JlbW8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3JlbW8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfcmVtbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9yZW1vMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2Rpdm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2Rpdm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfZGl2bzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9kaXZvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3JlbWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3JlbWkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfcmVtaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9yZW1pMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2RpdmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2RpdmkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfZGl2aTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9kaXZpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2FkZG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2FkZG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYWRkbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9hZGRvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N1Ym8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N1Ym8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3VibzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdWJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vdGJpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffbm90Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vdGJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ub3RiaXQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9hbmQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYW5kMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9hbmRub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2FuZG5vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9hbmRub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYW5kbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NldGJpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc2V0Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NldGJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zZXRiaXQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffbm90YW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ub3RhbmQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffbm90YW5kMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vdGFuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV94b3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3hvcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV94b3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfeG9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX29yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ub3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ub3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffbm9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3hub3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3hub3IxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfeG5vcjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV94bm9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX25vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX29ybm90IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcm5vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcm5vdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9vcm5vdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbHJiaXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NscmJpdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbHJiaXQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY2xyYml0MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NobG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NobG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc2hsbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zaGxvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3Nocm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3Nocm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc2hybzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zaHJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NobGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NobGkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc2hsaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zaGxpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NocmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3NocmkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc2hyaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zaHJpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2VtdWwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2VtdWwxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfZW11bDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9lbXVsMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX21vdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX21vdjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tb3ZsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tb3ZsMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX21vdnQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX21vdnQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tb3ZxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tb3ZxMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3ZxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbW9kcGMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9tb2RhYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkYV9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRhX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZGFfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkYV9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb2Jfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb2JfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb2JfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb2JfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb3Nfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb3NfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb3NfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb3NfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaWJfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaWJfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaWJfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaWJfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaXNfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaXNfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaXNfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaXNfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkbF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRsX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZGxfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkbF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHRfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkdF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHRfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRxX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRxX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRxX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHFfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfbGRxX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RvYl9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdG9iX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdG9iX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RvYl9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RvYl9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3Rvc19vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdG9zX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdG9zX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3Rvc19kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3Rvc19pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RsX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RsX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RsX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdGxfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RsX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0dF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3R0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdHRfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0dF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdHFfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0cV9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0cV9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9zdHFfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wb2JlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wb2JlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wb2JuZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcG9ibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBvYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBvYmxfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBvYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wb2JsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcG9iZ19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcG9iZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcG9iZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBvYmdlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waWJlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waWJlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waWJuZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcGlibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBpYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBpYmxfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBpYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waWJsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcGliZ19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcGliZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcGliZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBpYmdlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmJjX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmJjX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmJzX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmJzX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21waTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBpMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcGkzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY21wbzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9jbXBvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2NtcG8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfdGVzdG5vX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfdGVzdGdfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV90ZXN0ZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3Rlc3RnZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3Rlc3RsX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfdGVzdG5lX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfdGVzdGxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfdGVzdG9fcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ibm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYmdlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2JuZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ibGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2J4X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX2J4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY2FsbHhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY2FsbHhfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MEtBX3JldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfY2FsbHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBLQV9mbWFyayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwS0FfZmx1c2hyZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX211bG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX211bG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbXVsbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tdWxvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3JlbW8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3JlbW8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfcmVtbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9yZW1vMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2Rpdm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2Rpdm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfZGl2bzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9kaXZvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3JlbWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3JlbWkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfcmVtaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9yZW1pMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2RpdmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2RpdmkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfZGl2aTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9kaXZpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2FkZG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2FkZG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYWRkbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9hZGRvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N1Ym8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N1Ym8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3VibzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdWJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vdGJpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffbm90Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vdGJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ub3RiaXQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9hbmQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYW5kMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9hbmRub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2FuZG5vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9hbmRub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYW5kbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NldGJpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc2V0Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NldGJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zZXRiaXQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffbm90YW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ub3RhbmQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffbm90YW5kMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vdGFuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV94b3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3hvcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV94b3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfeG9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX29yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ub3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ub3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffbm9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3hub3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3hub3IxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfeG5vcjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV94bm9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX25vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX29ybm90IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcm5vdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcm5vdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9vcm5vdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbHJiaXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NscmJpdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbHJiaXQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY2xyYml0MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NobG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NobG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc2hsbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zaGxvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3Nocm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3Nocm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc2hybzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zaHJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NobGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NobGkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc2hsaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zaGxpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NocmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3NocmkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc2hyaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zaHJpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2VtdWwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2VtdWwxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfZW11bDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9lbXVsMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX21vdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX21vdjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tb3ZsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tb3ZsMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX21vdnQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX21vdnQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tb3ZxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tb3ZxMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3ZxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbW9kcGMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9tb2RhYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkYV9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRhX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkYV9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb2Jfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZG9iX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb2JfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb2JfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb3Nfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZG9zX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb3NfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb3NfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaWJfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZGliX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaWJfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaWJfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaXNfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZGlzX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaXNfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaXNfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkbF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRsX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkbF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHRfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHRfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRxX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHFfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2xkcV9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfbGRxX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RvYl9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RvYl9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RvYl9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RvYl9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3Rvc19vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3Rvc19kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3Rvc19pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3Rvc19pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RsX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdGxfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0bF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RsX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0dF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3R0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0dF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdHFfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0cV9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9zdHFfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wb2JlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wb2JlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wb2JuZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcG9ibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBvYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBvYmxfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBvYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wb2JsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcG9iZ19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcG9iZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcG9iZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBvYmdlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waWJlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waWJlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waWJuZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcGlibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBpYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBpYmxfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBpYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waWJsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcGliZ19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcGliZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcGliZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBpYmdlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmJjX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmJjX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmJzX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmJzX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21waTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBpMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcGkzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY21wbzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9jbXBvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2NtcG8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfdGVzdG5vX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfdGVzdGdfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV90ZXN0ZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3Rlc3RnZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3Rlc3RsX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfdGVzdG5lX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfdGVzdGxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfdGVzdG9fcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ibm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYmdlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2JuZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ibGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2J4X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX2J4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY2FsbHhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY2FsbHhfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2luZGlyZWN0X29mZnNldC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfaTk2MENBX3JldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfY2FsbHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX2k5NjBDQV9mbWFyayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9pOTYwQ0FfZmx1c2hyZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotLyogV2UgYXNzdW1lIFVOSVRfTk9ORSA9PSAwIGJlY2F1c2UgdGhlIHRhYmxlcyBkb24ndCBhbHdheXMgdGVybWluYXRlCi0gICBlbnRyaWVzIHdpdGggaXQuICAqLwotCi0vKiBNb2RlbCB0aW1pbmcgZGF0YSBmb3IgYGk5NjBLQScuICAqLwotCi1zdGF0aWMgY29uc3QgSU5TTl9USU1JTkcgaTk2MEtBX3RpbWluZ1tdID0gewotICB7IEk5NjBCQVNFX0lOU05fWF9JTlZBTElELCAwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9DVElfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9CRUdJTiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01VTE8sIG1vZGVsX2k5NjBLQV9tdWxvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTVVMTzEsIG1vZGVsX2k5NjBLQV9tdWxvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01VTE8yLCBtb2RlbF9pOTYwS0FfbXVsbzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NVUxPMywgbW9kZWxfaTk2MEtBX211bG8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNTywgbW9kZWxfaTk2MEtBX3JlbW8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1PMSwgbW9kZWxfaTk2MEtBX3JlbW8xLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNTzIsIG1vZGVsX2k5NjBLQV9yZW1vMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTU8zLCBtb2RlbF9pOTYwS0FfcmVtbzMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZPLCBtb2RlbF9pOTYwS0FfZGl2bywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVk8xLCBtb2RlbF9pOTYwS0FfZGl2bzEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZPMiwgbW9kZWxfaTk2MEtBX2Rpdm8yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWTzMsIG1vZGVsX2k5NjBLQV9kaXZvMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTUksIG1vZGVsX2k5NjBLQV9yZW1pLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNSTEsIG1vZGVsX2k5NjBLQV9yZW1pMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTUkyLCBtb2RlbF9pOTYwS0FfcmVtaTIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1JMywgbW9kZWxfaTk2MEtBX3JlbWkzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWSSwgbW9kZWxfaTk2MEtBX2RpdmksIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZJMSwgbW9kZWxfaTk2MEtBX2RpdmkxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWSTIsIG1vZGVsX2k5NjBLQV9kaXZpMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVkkzLCBtb2RlbF9pOTYwS0FfZGl2aTMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BRERPLCBtb2RlbF9pOTYwS0FfYWRkbywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FERE8xLCBtb2RlbF9pOTYwS0FfYWRkbzEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BRERPMiwgbW9kZWxfaTk2MEtBX2FkZG8yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQURETzMsIG1vZGVsX2k5NjBLQV9hZGRvMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NVQk8sIG1vZGVsX2k5NjBLQV9zdWJvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1VCTzEsIG1vZGVsX2k5NjBLQV9zdWJvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NVQk8yLCBtb2RlbF9pOTYwS0Ffc3VibzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVUJPMywgbW9kZWxfaTk2MEtBX3N1Ym8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQklULCBtb2RlbF9pOTYwS0Ffbm90Yml0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMSwgbW9kZWxfaTk2MEtBX25vdGJpdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQyLCBtb2RlbF9pOTYwS0Ffbm90Yml0MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDMsIG1vZGVsX2k5NjBLQV9ub3RiaXQzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5ELCBtb2RlbF9pOTYwS0FfYW5kLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5EMSwgbW9kZWxfaTk2MEtBX2FuZDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkQyLCBtb2RlbF9pOTYwS0FfYW5kMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORDMsIG1vZGVsX2k5NjBLQV9hbmQzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5ETk9ULCBtb2RlbF9pOTYwS0FfYW5kbm90LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMSwgbW9kZWxfaTk2MEtBX2FuZG5vdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QyLCBtb2RlbF9pOTYwS0FfYW5kbm90MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDMsIG1vZGVsX2k5NjBLQV9hbmRub3QzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0VUQklULCBtb2RlbF9pOTYwS0Ffc2V0Yml0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMSwgbW9kZWxfaTk2MEtBX3NldGJpdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQyLCBtb2RlbF9pOTYwS0Ffc2V0Yml0MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDMsIG1vZGVsX2k5NjBLQV9zZXRiaXQzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQU5ELCBtb2RlbF9pOTYwS0Ffbm90YW5kLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMSwgbW9kZWxfaTk2MEtBX25vdGFuZDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQyLCBtb2RlbF9pOTYwS0Ffbm90YW5kMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDMsIG1vZGVsX2k5NjBLQV9ub3RhbmQzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE9SLCBtb2RlbF9pOTYwS0FfeG9yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE9SMSwgbW9kZWxfaTk2MEtBX3hvcjEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YT1IyLCBtb2RlbF9pOTYwS0FfeG9yMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hPUjMsIG1vZGVsX2k5NjBLQV94b3IzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fT1IsIG1vZGVsX2k5NjBLQV9vciwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09SMSwgbW9kZWxfaTk2MEtBX29yMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09SMiwgbW9kZWxfaTk2MEtBX29yMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09SMywgbW9kZWxfaTk2MEtBX29yMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PUiwgbW9kZWxfaTk2MEtBX25vciwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PUjEsIG1vZGVsX2k5NjBLQV9ub3IxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9SMiwgbW9kZWxfaTk2MEtBX25vcjIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1IzLCBtb2RlbF9pOTYwS0Ffbm9yMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hOT1IsIG1vZGVsX2k5NjBLQV94bm9yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE5PUjEsIG1vZGVsX2k5NjBLQV94bm9yMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hOT1IyLCBtb2RlbF9pOTYwS0FfeG5vcjIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YTk9SMywgbW9kZWxfaTk2MEtBX3hub3IzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9ULCBtb2RlbF9pOTYwS0Ffbm90LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UMSwgbW9kZWxfaTk2MEtBX25vdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1QyLCBtb2RlbF9pOTYwS0Ffbm90MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVDMsIG1vZGVsX2k5NjBLQV9ub3QzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fT1JOT1QsIG1vZGVsX2k5NjBLQV9vcm5vdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09STk9UMSwgbW9kZWxfaTk2MEtBX29ybm90MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09STk9UMiwgbW9kZWxfaTk2MEtBX29ybm90MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09STk9UMywgbW9kZWxfaTk2MEtBX29ybm90MywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVCwgbW9kZWxfaTk2MEtBX2NscmJpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDEsIG1vZGVsX2k5NjBLQV9jbHJiaXQxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMiwgbW9kZWxfaTk2MEtBX2NscmJpdDIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQzLCBtb2RlbF9pOTYwS0FfY2xyYml0MywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITE8sIG1vZGVsX2k5NjBLQV9zaGxvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMTzEsIG1vZGVsX2k5NjBLQV9zaGxvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITE8yLCBtb2RlbF9pOTYwS0Ffc2hsbzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExPMywgbW9kZWxfaTk2MEtBX3NobG8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSTywgbW9kZWxfaTk2MEtBX3Nocm8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJPMSwgbW9kZWxfaTk2MEtBX3Nocm8xLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSTzIsIG1vZGVsX2k5NjBLQV9zaHJvMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUk8zLCBtb2RlbF9pOTYwS0Ffc2hybzMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExJLCBtb2RlbF9pOTYwS0Ffc2hsaSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITEkxLCBtb2RlbF9pOTYwS0Ffc2hsaTEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExJMiwgbW9kZWxfaTk2MEtBX3NobGkyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMSTMsIG1vZGVsX2k5NjBLQV9zaGxpMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUkksIG1vZGVsX2k5NjBLQV9zaHJpLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSSTEsIG1vZGVsX2k5NjBLQV9zaHJpMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUkkyLCBtb2RlbF9pOTYwS0Ffc2hyaTIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJJMywgbW9kZWxfaTk2MEtBX3NocmkzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRU1VTCwgbW9kZWxfaTk2MEtBX2VtdWwsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9FTVVMMSwgbW9kZWxfaTk2MEtBX2VtdWwxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRU1VTDIsIG1vZGVsX2k5NjBLQV9lbXVsMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0VNVUwzLCBtb2RlbF9pOTYwS0FfZW11bDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1YsIG1vZGVsX2k5NjBLQV9tb3YsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1YxLCBtb2RlbF9pOTYwS0FfbW92MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVkwsIG1vZGVsX2k5NjBLQV9tb3ZsLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WTDEsIG1vZGVsX2k5NjBLQV9tb3ZsMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlQsIG1vZGVsX2k5NjBLQV9tb3Z0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WVDEsIG1vZGVsX2k5NjBLQV9tb3Z0MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlEsIG1vZGVsX2k5NjBLQV9tb3ZxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WUTEsIG1vZGVsX2k5NjBLQV9tb3ZxMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PRFBDLCBtb2RlbF9pOTYwS0FfbW9kcGMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT0RBQywgbW9kZWxfaTk2MEtBX21vZGFjLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkYV9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9ESVNQLCBtb2RlbF9pOTYwS0FfbGRhX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGFfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0RJU1AsIG1vZGVsX2k5NjBLQV9sZF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZG9iX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvYl9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvYl9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZG9zX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19ESVNQLCBtb2RlbF9pOTYwS0FfbGRvc19kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvc19pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGliX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpYl9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpYl9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGlzX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19ESVNQLCBtb2RlbF9pOTYwS0FfbGRpc19kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpc19pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkbF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRsX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGxfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGR0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZHRfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZHFfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfRElTUCwgbW9kZWxfaTk2MEtBX2xkcV9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRxX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3RvYl9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfRElTUCwgbW9kZWxfaTk2MEtBX3N0b2JfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0b2JfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3Rvc19vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfRElTUCwgbW9kZWxfaTk2MEtBX3N0b3NfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0b3NfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdGxfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfRElTUCwgbW9kZWxfaTk2MEtBX3N0bF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RsX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0dF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3R0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHRfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3RxX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNULCBtb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHFfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0cV9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CRV9SRUcsIG1vZGVsX2k5NjBLQV9jbXBvYmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9iZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9ibmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBvYm5lX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9SRUcsIG1vZGVsX2k5NjBLQV9jbXBvYmxfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9ibF9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9ibGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBvYmxlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR19SRUcsIG1vZGVsX2k5NjBLQV9jbXBvYmdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9iZ19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9iZ2VfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHRV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBvYmdlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCRV9SRUcsIG1vZGVsX2k5NjBLQV9jbXBpYmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGliZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX1JFRywgbW9kZWxfaTk2MEtBX2NtcGlibmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBpYm5lX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9SRUcsIG1vZGVsX2k5NjBLQV9jbXBpYmxfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGlibF9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX1JFRywgbW9kZWxfaTk2MEtBX2NtcGlibGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBpYmxlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR19SRUcsIG1vZGVsX2k5NjBLQV9jbXBpYmdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGliZ19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX1JFRywgbW9kZWxfaTk2MEtBX2NtcGliZ2VfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHRV9MSVQsIG1vZGVsX2k5NjBLQV9jbXBpYmdlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JCQ19SRUcsIG1vZGVsX2k5NjBLQV9iYmNfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkJDX0xJVCwgbW9kZWxfaTk2MEtBX2JiY19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CQlNfUkVHLCBtb2RlbF9pOTYwS0FfYmJzX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JCU19MSVQsIG1vZGVsX2k5NjBLQV9iYnNfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSSwgbW9kZWxfaTk2MEtBX2NtcGksIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJMSwgbW9kZWxfaTk2MEtBX2NtcGkxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSTIsIG1vZGVsX2k5NjBLQV9jbXBpMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUEkzLCBtb2RlbF9pOTYwS0FfY21waTMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPLCBtb2RlbF9pOTYwS0FfY21wbywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE8xLCBtb2RlbF9pOTYwS0FfY21wbzEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPMiwgbW9kZWxfaTk2MEtBX2NtcG8yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QTzMsIG1vZGVsX2k5NjBLQV9jbXBvMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1ROT19SRUcsIG1vZGVsX2k5NjBLQV90ZXN0bm9fcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVEdfUkVHLCBtb2RlbF9pOTYwS0FfdGVzdGdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVEVfUkVHLCBtb2RlbF9pOTYwS0FfdGVzdGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVEdFX1JFRywgbW9kZWxfaTk2MEtBX3Rlc3RnZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTF9SRUcsIG1vZGVsX2k5NjBLQV90ZXN0bF9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTkVfUkVHLCBtb2RlbF9pOTYwS0FfdGVzdG5lX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RMRV9SRUcsIG1vZGVsX2k5NjBLQV90ZXN0bGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVE9fUkVHLCBtb2RlbF9pOTYwS0FfdGVzdG9fcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQk5PLCBtb2RlbF9pOTYwS0FfYm5vLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkcsIG1vZGVsX2k5NjBLQV9iZywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JFLCBtb2RlbF9pOTYwS0FfYmUsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CR0UsIG1vZGVsX2k5NjBLQV9iZ2UsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CTCwgbW9kZWxfaTk2MEtBX2JsLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQk5FLCBtb2RlbF9pOTYwS0FfYm5lLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkxFLCBtb2RlbF9pOTYwS0FfYmxlLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQk8sIG1vZGVsX2k5NjBLQV9ibywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0IsIG1vZGVsX2k5NjBLQV9iLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfYnhfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0FfYnhfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CWF9ESVNQLCBtb2RlbF9pOTYwS0FfYnhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfRElTUCwgbW9kZWxfaTk2MEtBX2NhbGx4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2NhbGx4X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVULCBtb2RlbF9pOTYwS0FfcmV0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0FMTFMsIG1vZGVsX2k5NjBLQV9jYWxscywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0ZNQVJLLCBtb2RlbF9pOTYwS0FfZm1hcmssIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9GTFVTSFJFRywgbW9kZWxfaTk2MEtBX2ZsdXNocmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotfTsKLQotLyogTW9kZWwgdGltaW5nIGRhdGEgZm9yIGBpOTYwQ0EnLiAgKi8KLQotc3RhdGljIGNvbnN0IElOU05fVElNSU5HIGk5NjBDQV90aW1pbmdbXSA9IHsKLSAgeyBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hfQUZURVIsIDAsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YX0JFRk9SRSwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hfQ1RJX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hfQkVHSU4sIDAsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NVUxPLCBtb2RlbF9pOTYwQ0FfbXVsbywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01VTE8xLCBtb2RlbF9pOTYwQ0FfbXVsbzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NVUxPMiwgbW9kZWxfaTk2MENBX211bG8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTVVMTzMsIG1vZGVsX2k5NjBDQV9tdWxvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTU8sIG1vZGVsX2k5NjBDQV9yZW1vLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNTzEsIG1vZGVsX2k5NjBDQV9yZW1vMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTU8yLCBtb2RlbF9pOTYwQ0FfcmVtbzIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1PMywgbW9kZWxfaTk2MENBX3JlbW8zLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWTywgbW9kZWxfaTk2MENBX2Rpdm8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZPMSwgbW9kZWxfaTk2MENBX2Rpdm8xLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWTzIsIG1vZGVsX2k5NjBDQV9kaXZvMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVk8zLCBtb2RlbF9pOTYwQ0FfZGl2bzMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1JLCBtb2RlbF9pOTYwQ0FfcmVtaSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTUkxLCBtb2RlbF9pOTYwQ0FfcmVtaTEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1JMiwgbW9kZWxfaTk2MENBX3JlbWkyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNSTMsIG1vZGVsX2k5NjBDQV9yZW1pMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVkksIG1vZGVsX2k5NjBDQV9kaXZpLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWSTEsIG1vZGVsX2k5NjBDQV9kaXZpMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVkkyLCBtb2RlbF9pOTYwQ0FfZGl2aTIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZJMywgbW9kZWxfaTk2MENBX2RpdmkzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQURETywgbW9kZWxfaTk2MENBX2FkZG8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BRERPMSwgbW9kZWxfaTk2MENBX2FkZG8xLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQURETzIsIG1vZGVsX2k5NjBDQV9hZGRvMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FERE8zLCBtb2RlbF9pOTYwQ0FfYWRkbzMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVUJPLCBtb2RlbF9pOTYwQ0Ffc3VibywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NVQk8xLCBtb2RlbF9pOTYwQ0Ffc3VibzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVUJPMiwgbW9kZWxfaTk2MENBX3N1Ym8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1VCTzMsIG1vZGVsX2k5NjBDQV9zdWJvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVCwgbW9kZWxfaTk2MENBX25vdGJpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDEsIG1vZGVsX2k5NjBDQV9ub3RiaXQxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMiwgbW9kZWxfaTk2MENBX25vdGJpdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQzLCBtb2RlbF9pOTYwQ0Ffbm90Yml0MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORCwgbW9kZWxfaTk2MENBX2FuZCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORDEsIG1vZGVsX2k5NjBDQV9hbmQxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5EMiwgbW9kZWxfaTk2MENBX2FuZDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkQzLCBtb2RlbF9pOTYwQ0FfYW5kMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVCwgbW9kZWxfaTk2MENBX2FuZG5vdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDEsIG1vZGVsX2k5NjBDQV9hbmRub3QxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMiwgbW9kZWxfaTk2MENBX2FuZG5vdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QzLCBtb2RlbF9pOTYwQ0FfYW5kbm90MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgbW9kZWxfaTk2MENBX3NldGJpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDEsIG1vZGVsX2k5NjBDQV9zZXRiaXQxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMiwgbW9kZWxfaTk2MENBX3NldGJpdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQzLCBtb2RlbF9pOTYwQ0Ffc2V0Yml0MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEFORCwgbW9kZWxfaTk2MENBX25vdGFuZCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDEsIG1vZGVsX2k5NjBDQV9ub3RhbmQxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMiwgbW9kZWxfaTk2MENBX25vdGFuZDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQzLCBtb2RlbF9pOTYwQ0Ffbm90YW5kMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hPUiwgbW9kZWxfaTk2MENBX3hvciwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hPUjEsIG1vZGVsX2k5NjBDQV94b3IxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE9SMiwgbW9kZWxfaTk2MENBX3hvcjIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YT1IzLCBtb2RlbF9pOTYwQ0FfeG9yMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09SLCBtb2RlbF9pOTYwQ0Ffb3IsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjEsIG1vZGVsX2k5NjBDQV9vcjEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjIsIG1vZGVsX2k5NjBDQV9vcjIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjMsIG1vZGVsX2k5NjBDQV9vcjMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1IsIG1vZGVsX2k5NjBDQV9ub3IsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1IxLCBtb2RlbF9pOTYwQ0Ffbm9yMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PUjIsIG1vZGVsX2k5NjBDQV9ub3IyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9SMywgbW9kZWxfaTk2MENBX25vcjMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YTk9SLCBtb2RlbF9pOTYwQ0FfeG5vciwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hOT1IxLCBtb2RlbF9pOTYwQ0FfeG5vcjEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YTk9SMiwgbW9kZWxfaTk2MENBX3hub3IyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE5PUjMsIG1vZGVsX2k5NjBDQV94bm9yMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVCwgbW9kZWxfaTk2MENBX25vdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVDEsIG1vZGVsX2k5NjBDQV9ub3QxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UMiwgbW9kZWxfaTk2MENBX25vdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1QzLCBtb2RlbF9pOTYwQ0Ffbm90MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09STk9ULCBtb2RlbF9pOTYwQ0Ffb3Jub3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDEsIG1vZGVsX2k5NjBDQV9vcm5vdDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDIsIG1vZGVsX2k5NjBDQV9vcm5vdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDMsIG1vZGVsX2k5NjBDQV9vcm5vdDMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQsIG1vZGVsX2k5NjBDQV9jbHJiaXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQxLCBtb2RlbF9pOTYwQ0FfY2xyYml0MSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDIsIG1vZGVsX2k5NjBDQV9jbHJiaXQyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMywgbW9kZWxfaTk2MENBX2NscmJpdDMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExPLCBtb2RlbF9pOTYwQ0Ffc2hsbywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITE8xLCBtb2RlbF9pOTYwQ0Ffc2hsbzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExPMiwgbW9kZWxfaTk2MENBX3NobG8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMTzMsIG1vZGVsX2k5NjBDQV9zaGxvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUk8sIG1vZGVsX2k5NjBDQV9zaHJvLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSTzEsIG1vZGVsX2k5NjBDQV9zaHJvMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUk8yLCBtb2RlbF9pOTYwQ0Ffc2hybzIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJPMywgbW9kZWxfaTk2MENBX3Nocm8zLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMSSwgbW9kZWxfaTk2MENBX3NobGksIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExJMSwgbW9kZWxfaTk2MENBX3NobGkxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMSTIsIG1vZGVsX2k5NjBDQV9zaGxpMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITEkzLCBtb2RlbF9pOTYwQ0Ffc2hsaTMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJJLCBtb2RlbF9pOTYwQ0Ffc2hyaSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUkkxLCBtb2RlbF9pOTYwQ0Ffc2hyaTEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJJMiwgbW9kZWxfaTk2MENBX3NocmkyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSSTMsIG1vZGVsX2k5NjBDQV9zaHJpMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0VNVUwsIG1vZGVsX2k5NjBDQV9lbXVsLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRU1VTDEsIG1vZGVsX2k5NjBDQV9lbXVsMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0VNVUwyLCBtb2RlbF9pOTYwQ0FfZW11bDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9FTVVMMywgbW9kZWxfaTk2MENBX2VtdWwzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WLCBtb2RlbF9pOTYwQ0FfbW92LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WMSwgbW9kZWxfaTk2MENBX21vdjEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZMLCBtb2RlbF9pOTYwQ0FfbW92bCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVkwxLCBtb2RlbF9pOTYwQ0FfbW92bDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZULCBtb2RlbF9pOTYwQ0FfbW92dCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlQxLCBtb2RlbF9pOTYwQ0FfbW92dDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZRLCBtb2RlbF9pOTYwQ0FfbW92cSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlExLCBtb2RlbF9pOTYwQ0FfbW92cTEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT0RQQywgbW9kZWxfaTk2MENBX21vZHBjLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9EQUMsIG1vZGVsX2k5NjBDQV9tb2RhYywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZGFfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfRElTUCwgbW9kZWxfaTk2MENBX2xkYV9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRhX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRvYl9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfRElTUCwgbW9kZWxfaTk2MENBX2xkb2JfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkb2JfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRvc19vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfRElTUCwgbW9kZWxfaTk2MENBX2xkb3NfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkb3NfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRpYl9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfRElTUCwgbW9kZWxfaTk2MENBX2xkaWJfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkaWJfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRpc19vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfRElTUCwgbW9kZWxfaTk2MENBX2xkaXNfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkaXNfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZGxfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfRElTUCwgbW9kZWxfaTk2MENBX2xkbF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRsX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGR0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHRfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRxX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHFfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkcV9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNULCBtb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX3N0X2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfRElTUCwgbW9kZWxfaTk2MENBX3N0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0X2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0b2Jfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9iX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9iX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0b3Nfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9zX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9zX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3RsX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNULCBtb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0RJU1AsIG1vZGVsX2k5NjBDQV9zdGxfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0bF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdHRfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfRElTUCwgbW9kZWxfaTk2MENBX3N0dF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3R0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0cV9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RxX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdHFfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkVfUkVHLCBtb2RlbF9pOTYwQ0FfY21wb2JlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYmVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYm5lX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfTElULCBtb2RlbF9pOTYwQ0FfY21wb2JuZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxfUkVHLCBtb2RlbF9pOTYwQ0FfY21wb2JsX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYmxfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYmxlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTEVfTElULCBtb2RlbF9pOTYwQ0FfY21wb2JsZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdfUkVHLCBtb2RlbF9pOTYwQ0FfY21wb2JnX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR19MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYmdfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYmdlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfTElULCBtb2RlbF9pOTYwQ0FfY21wb2JnZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkVfUkVHLCBtb2RlbF9pOTYwQ0FfY21waWJlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYmVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYm5lX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTkVfTElULCBtb2RlbF9pOTYwQ0FfY21waWJuZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxfUkVHLCBtb2RlbF9pOTYwQ0FfY21waWJsX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYmxfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYmxlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTEVfTElULCBtb2RlbF9pOTYwQ0FfY21waWJsZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdfUkVHLCBtb2RlbF9pOTYwQ0FfY21waWJnX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR19MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYmdfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYmdlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElULCBtb2RlbF9pOTYwQ0FfY21waWJnZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CQkNfUkVHLCBtb2RlbF9pOTYwQ0FfYmJjX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JCQ19MSVQsIG1vZGVsX2k5NjBDQV9iYmNfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkJTX1JFRywgbW9kZWxfaTk2MENBX2Jic19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CQlNfTElULCBtb2RlbF9pOTYwQ0FfYmJzX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUEksIG1vZGVsX2k5NjBDQV9jbXBpLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSTEsIG1vZGVsX2k5NjBDQV9jbXBpMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUEkyLCBtb2RlbF9pOTYwQ0FfY21waTIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJMywgbW9kZWxfaTk2MENBX2NtcGkzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QTywgbW9kZWxfaTk2MENBX2NtcG8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPMSwgbW9kZWxfaTk2MENBX2NtcG8xLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QTzIsIG1vZGVsX2k5NjBDQV9jbXBvMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE8zLCBtb2RlbF9pOTYwQ0FfY21wbzMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTk9fUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdG5vX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RHX1JFRywgbW9kZWxfaTk2MENBX3Rlc3RnX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RFX1JFRywgbW9kZWxfaTk2MENBX3Rlc3RlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RHRV9SRUcsIG1vZGVsX2k5NjBDQV90ZXN0Z2VfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVExfUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdGxfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVE5FX1JFRywgbW9kZWxfaTk2MENBX3Rlc3RuZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTEVfUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdGxlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RPX1JFRywgbW9kZWxfaTk2MENBX3Rlc3RvX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JOTywgbW9kZWxfaTk2MENBX2JubywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JHLCBtb2RlbF9pOTYwQ0FfYmcsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CRSwgbW9kZWxfaTk2MENBX2JlLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkdFLCBtb2RlbF9pOTYwQ0FfYmdlLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkwsIG1vZGVsX2k5NjBDQV9ibCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JORSwgbW9kZWxfaTk2MENBX2JuZSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JMRSwgbW9kZWxfaTk2MENBX2JsZSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JPLCBtb2RlbF9pOTYwQ0FfYm8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CLCBtb2RlbF9pOTYwQ0FfYiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2J4X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfYnhfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX2J4X2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQlhfRElTUCwgbW9kZWxfaTk2MENBX2J4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfYnhfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0RJU1AsIG1vZGVsX2k5NjBDQV9jYWxseF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9jYWxseF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2NhbGx4X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFVCwgbW9kZWxfaTk2MENBX3JldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExTLCBtb2RlbF9pOTYwQ0FfY2FsbHMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9GTUFSSywgbW9kZWxfaTk2MENBX2ZtYXJrLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IEk5NjBCQVNFX0lOU05fRkxVU0hSRUcsIG1vZGVsX2k5NjBDQV9mbHVzaHJlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKLX07Ci0KLSNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwotCi1zdGF0aWMgdm9pZAotaTk2MEtBX21vZGVsX2luaXQgKFNJTV9DUFUgKmNwdSkKLXsKLSAgQ1BVX01PREVMX0RBVEEgKGNwdSkgPSAodm9pZCAqKSB6YWxsb2MgKHNpemVvZiAoTU9ERUxfSTk2MEtBX0RBVEEpKTsKLX0KLQotc3RhdGljIHZvaWQKLWk5NjBDQV9tb2RlbF9pbml0IChTSU1fQ1BVICpjcHUpCi17Ci0gIENQVV9NT0RFTF9EQVRBIChjcHUpID0gKHZvaWQgKikgemFsbG9jIChzaXplb2YgKE1PREVMX0k5NjBDQV9EQVRBKSk7Ci19Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotI2RlZmluZSBUSU1JTkdfREFUQSh0ZCkgdGQKLSNlbHNlCi0jZGVmaW5lIFRJTUlOR19EQVRBKHRkKSAwCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IE1PREVMIGk5NjBfa2Ffc2FfbW9kZWxzW10gPQotewotICB7ICJpOTYwS0EiLCAmIGk5NjBfa2Ffc2FfbWFjaCwgTU9ERUxfSTk2MEtBLCBUSU1JTkdfREFUQSAoJiBpOTYwS0FfdGltaW5nWzBdKSwgaTk2MEtBX21vZGVsX2luaXQgfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBNT0RFTCBpOTYwX2NhX21vZGVsc1tdID0KLXsKLSAgeyAiaTk2MENBIiwgJiBpOTYwX2NhX21hY2gsIE1PREVMX0k5NjBDQSwgVElNSU5HX0RBVEEgKCYgaTk2MENBX3RpbWluZ1swXSksIGk5NjBDQV9tb2RlbF9pbml0IH0sCi0gIHsgMCB9Ci19OwotCi0vKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNwdSdzIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgaTk2MGJhc2VfaW1wX3Byb3BlcnRpZXMgPQotewotICBzaXplb2YgKFNJTV9DUFUpLAotI2lmIFdJVEhfU0NBQ0hFCi0gIHNpemVvZiAoU0NBQ0hFKQotI2Vsc2UKLSAgMAotI2VuZGlmCi19OwotCi0KLXN0YXRpYyB2b2lkCi1pOTYwYmFzZV9wcmVwYXJlX3J1biAoU0lNX0NQVSAqY3B1KQotewotICBpZiAoQ1BVX0lERVNDIChjcHUpID09IE5VTEwpCi0gICAgaTk2MGJhc2VfaW5pdF9pZGVzY190YWJsZSAoY3B1KTsKLX0KLQotc3RhdGljIGNvbnN0IENHRU5fSU5TTiAqCi1pOTYwYmFzZV9nZXRfaWRhdGEgKFNJTV9DUFUgKmNwdSwgaW50IGludW0pCi17Ci0gIHJldHVybiBDUFVfSURFU0MgKGNwdSkgW2ludW1dLmlkYXRhOwotfQotCi1zdGF0aWMgdm9pZAotaTk2MF9rYV9zYV9pbml0X2NwdSAoU0lNX0NQVSAqY3B1KQotewotICBDUFVfUkVHX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfZmV0Y2hfcmVnaXN0ZXI7Ci0gIENQVV9SRUdfU1RPUkUgKGNwdSkgPSBpOTYwYmFzZV9zdG9yZV9yZWdpc3RlcjsKLSAgQ1BVX1BDX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfaF9wY19nZXQ7Ci0gIENQVV9QQ19TVE9SRSAoY3B1KSA9IGk5NjBiYXNlX2hfcGNfc2V0OwotICBDUFVfR0VUX0lEQVRBIChjcHUpID0gaTk2MGJhc2VfZ2V0X2lkYXRhOwotICBDUFVfTUFYX0lOU05TIChjcHUpID0gSTk2MEJBU0VfSU5TTl9NQVg7Ci0gIENQVV9JTlNOX05BTUUgKGNwdSkgPSBjZ2VuX2luc25fbmFtZTsKLSAgQ1BVX0ZVTExfRU5HSU5FX0ZOIChjcHUpID0gaTk2MGJhc2VfZW5naW5lX3J1bl9mdWxsOwotI2lmIFdJVEhfRkFTVAotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Zhc3Q7Ci0jZWxzZQotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Z1bGw7Ci0jZW5kaWYKLX0KLQotY29uc3QgTUFDSCBpOTYwX2thX3NhX21hY2ggPQotewotICAiaTk2MDprYV9zYSIsICJpOTYwOmthX3NhIiwgTUFDSF9JOTYwX0tBX1NBLAotICAzMiwgMzIsICYgaTk2MF9rYV9zYV9tb2RlbHNbMF0sICYgaTk2MGJhc2VfaW1wX3Byb3BlcnRpZXMsCi0gIGk5NjBfa2Ffc2FfaW5pdF9jcHUsCi0gIGk5NjBiYXNlX3ByZXBhcmVfcnVuCi19OwotCi1zdGF0aWMgdm9pZAotaTk2MF9jYV9pbml0X2NwdSAoU0lNX0NQVSAqY3B1KQotewotICBDUFVfUkVHX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfZmV0Y2hfcmVnaXN0ZXI7Ci0gIENQVV9SRUdfU1RPUkUgKGNwdSkgPSBpOTYwYmFzZV9zdG9yZV9yZWdpc3RlcjsKLSAgQ1BVX1BDX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfaF9wY19nZXQ7Ci0gIENQVV9QQ19TVE9SRSAoY3B1KSA9IGk5NjBiYXNlX2hfcGNfc2V0OwotICBDUFVfR0VUX0lEQVRBIChjcHUpID0gaTk2MGJhc2VfZ2V0X2lkYXRhOwotICBDUFVfTUFYX0lOU05TIChjcHUpID0gSTk2MEJBU0VfSU5TTl9NQVg7Ci0gIENQVV9JTlNOX05BTUUgKGNwdSkgPSBjZ2VuX2luc25fbmFtZTsKLSAgQ1BVX0ZVTExfRU5HSU5FX0ZOIChjcHUpID0gaTk2MGJhc2VfZW5naW5lX3J1bl9mdWxsOwotI2lmIFdJVEhfRkFTVAotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Zhc3Q7Ci0jZWxzZQotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Z1bGw7Ci0jZW5kaWYKLX0KLQotY29uc3QgTUFDSCBpOTYwX2NhX21hY2ggPQotewotICAiaTk2MDpjYSIsICJpOTYwOmNhIiwgTUFDSF9JOTYwX0NBLAotICAzMiwgMzIsICYgaTk2MF9jYV9tb2RlbHNbMF0sICYgaTk2MGJhc2VfaW1wX3Byb3BlcnRpZXMsCi0gIGk5NjBfY2FfaW5pdF9jcHUsCi0gIGk5NjBiYXNlX3ByZXBhcmVfcnVuCi19OwotCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9zZW0tc3dpdGNoLmMgYi9zaW0vaTk2MC9zZW0tc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmQzMzYuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvc2VtLXN3aXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0NSArMCwwIEBACi0vKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBpOTYwYmFzZS4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmZGVmIERFRklORV9MQUJFTFMKLQotICAvKiBUaGUgbGFiZWxzIGhhdmUgdGhlIGNhc2UgdGhleSBoYXZlIGJlY2F1c2UgdGhlIGVudW0gb2YgaW5zbiB0eXBlcwotICAgICBpcyBhbGwgdXBwZXJjYXNlIGFuZCBpbiB0aGUgbm9uLXN0ZGMgY2FzZSB0aGUgaW5zbiBzeW1ib2wgaXMgYnVpbHQKLSAgICAgaW50byB0aGUgZW51bSBuYW1lLiAgKi8KLQotICBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgaW5kZXg7Ci0gICAgdm9pZCAqbGFiZWw7Ci0gIH0gbGFiZWxzW10gPSB7Ci0gICAgeyBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgJiYgY2FzZV9zZW1fSU5TTl9YX0lOVkFMSUQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgJiYgY2FzZV9zZW1fSU5TTl9YX0FGVEVSIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVGT1JFIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hfQ1RJX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ1RJX0NIQUlOIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9DSEFJTiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9YX0JFR0lOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVHSU4gfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTVVMTywgJiYgY2FzZV9zZW1fSU5TTl9NVUxPIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01VTE8xLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8xIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01VTE8yLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8yIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01VTE8zLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8zIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1JFTU8sICYmIGNhc2Vfc2VtX0lOU05fUkVNTyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMSwgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMiwgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMywgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZPLCAmJiBjYXNlX3NlbV9JTlNOX0RJVk8gfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fRElWTzEsICYmIGNhc2Vfc2VtX0lOU05fRElWTzEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fRElWTzIsICYmIGNhc2Vfc2VtX0lOU05fRElWTzIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fRElWTzMsICYmIGNhc2Vfc2VtX0lOU05fRElWTzMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fUkVNSSwgJiYgY2FzZV9zZW1fSU5TTl9SRU1JIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkxLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkyLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkzLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0RJVkksICYmIGNhc2Vfc2VtX0lOU05fRElWSSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMSwgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMiwgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMywgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9BRERPLCAmJiBjYXNlX3NlbV9JTlNOX0FERE8gfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQURETzEsICYmIGNhc2Vfc2VtX0lOU05fQURETzEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQURETzIsICYmIGNhc2Vfc2VtX0lOU05fQURETzIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQURETzMsICYmIGNhc2Vfc2VtX0lOU05fQURETzMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1VCTywgJiYgY2FzZV9zZW1fSU5TTl9TVUJPIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8xLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8xIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8yLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8yIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8zLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8zIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVCwgJiYgY2FzZV9zZW1fSU5TTl9OT1RCSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMSwgJiYgY2FzZV9zZW1fSU5TTl9OT1RCSVQxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDIsICYmIGNhc2Vfc2VtX0lOU05fTk9UQklUMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQzLCAmJiBjYXNlX3NlbV9JTlNOX05PVEJJVDMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQU5ELCAmJiBjYXNlX3NlbV9JTlNOX0FORCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9BTkQxLCAmJiBjYXNlX3NlbV9JTlNOX0FORDEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQU5EMiwgJiYgY2FzZV9zZW1fSU5TTl9BTkQyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0FORDMsICYmIGNhc2Vfc2VtX0lOU05fQU5EMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QsICYmIGNhc2Vfc2VtX0lOU05fQU5ETk9UIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDEsICYmIGNhc2Vfc2VtX0lOU05fQU5ETk9UMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QyLCAmJiBjYXNlX3NlbV9JTlNOX0FORE5PVDIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMywgJiYgY2FzZV9zZW1fSU5TTl9BTkROT1QzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgJiYgY2FzZV9zZW1fSU5TTl9TRVRCSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMSwgJiYgY2FzZV9zZW1fSU5TTl9TRVRCSVQxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDIsICYmIGNhc2Vfc2VtX0lOU05fU0VUQklUMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQzLCAmJiBjYXNlX3NlbV9JTlNOX1NFVEJJVDMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTk9UQU5ELCAmJiBjYXNlX3NlbV9JTlNOX05PVEFORCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQxLCAmJiBjYXNlX3NlbV9JTlNOX05PVEFORDEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMiwgJiYgY2FzZV9zZW1fSU5TTl9OT1RBTkQyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDMsICYmIGNhc2Vfc2VtX0lOU05fTk9UQU5EMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9YT1IsICYmIGNhc2Vfc2VtX0lOU05fWE9SIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hPUjEsICYmIGNhc2Vfc2VtX0lOU05fWE9SMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9YT1IyLCAmJiBjYXNlX3NlbV9JTlNOX1hPUjIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fWE9SMywgJiYgY2FzZV9zZW1fSU5TTl9YT1IzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX09SLCAmJiBjYXNlX3NlbV9JTlNOX09SIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX09SMSwgJiYgY2FzZV9zZW1fSU5TTl9PUjEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fT1IyLCAmJiBjYXNlX3NlbV9JTlNOX09SMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9PUjMsICYmIGNhc2Vfc2VtX0lOU05fT1IzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PUiwgJiYgY2FzZV9zZW1fSU5TTl9OT1IgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTk9SMSwgJiYgY2FzZV9zZW1fSU5TTl9OT1IxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PUjIsICYmIGNhc2Vfc2VtX0lOU05fTk9SMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9OT1IzLCAmJiBjYXNlX3NlbV9JTlNOX05PUjMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fWE5PUiwgJiYgY2FzZV9zZW1fSU5TTl9YTk9SIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hOT1IxLCAmJiBjYXNlX3NlbV9JTlNOX1hOT1IxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hOT1IyLCAmJiBjYXNlX3NlbV9JTlNOX1hOT1IyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1hOT1IzLCAmJiBjYXNlX3NlbV9JTlNOX1hOT1IzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PVCwgJiYgY2FzZV9zZW1fSU5TTl9OT1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTk9UMSwgJiYgY2FzZV9zZW1fSU5TTl9OT1QxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX05PVDIsICYmIGNhc2Vfc2VtX0lOU05fTk9UMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9OT1QzLCAmJiBjYXNlX3NlbV9JTlNOX05PVDMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fT1JOT1QsICYmIGNhc2Vfc2VtX0lOU05fT1JOT1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fT1JOT1QxLCAmJiBjYXNlX3NlbV9JTlNOX09STk9UMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDIsICYmIGNhc2Vfc2VtX0lOU05fT1JOT1QyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX09STk9UMywgJiYgY2FzZV9zZW1fSU5TTl9PUk5PVDMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ0xSQklULCAmJiBjYXNlX3NlbV9JTlNOX0NMUkJJVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQxLCAmJiBjYXNlX3NlbV9JTlNOX0NMUkJJVDEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMiwgJiYgY2FzZV9zZW1fSU5TTl9DTFJCSVQyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDMsICYmIGNhc2Vfc2VtX0lOU05fQ0xSQklUMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TSExPLCAmJiBjYXNlX3NlbV9JTlNOX1NITE8gfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hMTzEsICYmIGNhc2Vfc2VtX0lOU05fU0hMTzEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hMTzIsICYmIGNhc2Vfc2VtX0lOU05fU0hMTzIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hMTzMsICYmIGNhc2Vfc2VtX0lOU05fU0hMTzMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hSTywgJiYgY2FzZV9zZW1fSU5TTl9TSFJPIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NIUk8xLCAmJiBjYXNlX3NlbV9JTlNOX1NIUk8xIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NIUk8yLCAmJiBjYXNlX3NlbV9JTlNOX1NIUk8yIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NIUk8zLCAmJiBjYXNlX3NlbV9JTlNOX1NIUk8zIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NITEksICYmIGNhc2Vfc2VtX0lOU05fU0hMSSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TSExJMSwgJiYgY2FzZV9zZW1fSU5TTl9TSExJMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TSExJMiwgJiYgY2FzZV9zZW1fSU5TTl9TSExJMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TSExJMywgJiYgY2FzZV9zZW1fSU5TTl9TSExJMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TSFJJLCAmJiBjYXNlX3NlbV9JTlNOX1NIUkkgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hSSTEsICYmIGNhc2Vfc2VtX0lOU05fU0hSSTEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hSSTIsICYmIGNhc2Vfc2VtX0lOU05fU0hSSTIgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU0hSSTMsICYmIGNhc2Vfc2VtX0lOU05fU0hSSTMgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fRU1VTCwgJiYgY2FzZV9zZW1fSU5TTl9FTVVMIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0VNVUwxLCAmJiBjYXNlX3NlbV9JTlNOX0VNVUwxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0VNVUwyLCAmJiBjYXNlX3NlbV9JTlNOX0VNVUwyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0VNVUwzLCAmJiBjYXNlX3NlbV9JTlNOX0VNVUwzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01PViwgJiYgY2FzZV9zZW1fSU5TTl9NT1YgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTU9WMSwgJiYgY2FzZV9zZW1fSU5TTl9NT1YxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01PVkwsICYmIGNhc2Vfc2VtX0lOU05fTU9WTCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9NT1ZMMSwgJiYgY2FzZV9zZW1fSU5TTl9NT1ZMMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9NT1ZULCAmJiBjYXNlX3NlbV9JTlNOX01PVlQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTU9WVDEsICYmIGNhc2Vfc2VtX0lOU05fTU9WVDEgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTU9WUSwgJiYgY2FzZV9zZW1fSU5TTl9NT1ZRIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01PVlExLCAmJiBjYXNlX3NlbV9JTlNOX01PVlExIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01PRFBDLCAmJiBjYXNlX3NlbV9JTlNOX01PRFBDIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX01PREFDLCAmJiBjYXNlX3NlbV9JTlNOX01PREFDIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERBX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xEX0lORElSRUNUX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0lORElSRUNUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0lORElSRUNUX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xET0JfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERPU19JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVggfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPU19ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPU19JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9TX0lOREVYX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfSU5ESVJFQ1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfSU5ESVJFQ1RfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERJQl9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERJU19PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERJU19JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0lORElSRUNUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERJU19ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0lORElSRUNUX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xESVNfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERMX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xETF9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xETF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xETF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xETF9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xETF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERUX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERRX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUX0lORElSRUNUX09GRlNFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVF9JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVF9JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0lORElSRUNUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0lORElSRUNUX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUT0JfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19JTkRJUkVDVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVggfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9TX0lOREVYX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfSU5ESVJFQ1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfSU5ESVJFQ1RfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfSU5ESVJFQ1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfSU5ESVJFQ1QgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkVfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CRV9SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkVfTElUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CTkVfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CTkVfTElUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JMX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CTF9MSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JMRV9SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JMRV9MSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkdfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR19MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JHX0xJVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkdFX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkdFX0xJVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkVfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCRV9SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkVfTElUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTkVfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCTkVfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTkVfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCTkVfTElUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJMX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCTF9MSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJMRV9SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJMRV9MSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkdfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR19MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJHX0xJVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkdFX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkdFX0xJVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CQkNfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0JCQ19SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQkJDX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9CQkNfTElUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JCU19SRUcsICYmIGNhc2Vfc2VtX0lOU05fQkJTX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CQlNfTElULCAmJiBjYXNlX3NlbV9JTlNOX0JCU19MSVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ01QSSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUEkxLCAmJiBjYXNlX3NlbV9JTlNOX0NNUEkxIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUEkyLCAmJiBjYXNlX3NlbV9JTlNOX0NNUEkyIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUEkzLCAmJiBjYXNlX3NlbV9JTlNOX0NNUEkzIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NNUE8sICYmIGNhc2Vfc2VtX0lOU05fQ01QTyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPMSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPMSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPMiwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPMiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPMywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPMyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9URVNUTk9fUkVHLCAmJiBjYXNlX3NlbV9JTlNOX1RFU1ROT19SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fVEVTVEdfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX1RFU1RHX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9URVNURV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVEVfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1RFU1RHRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVEdFX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9URVNUTF9SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVExfUkVHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX1RFU1RORV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVE5FX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9URVNUTEVfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX1RFU1RMRV9SRUcgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fVEVTVE9fUkVHLCAmJiBjYXNlX3NlbV9JTlNOX1RFU1RPX1JFRyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CTk8sICYmIGNhc2Vfc2VtX0lOU05fQk5PIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JHLCAmJiBjYXNlX3NlbV9JTlNOX0JHIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JFLCAmJiBjYXNlX3NlbV9JTlNOX0JFIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JHRSwgJiYgY2FzZV9zZW1fSU5TTl9CR0UgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQkwsICYmIGNhc2Vfc2VtX0lOU05fQkwgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQk5FLCAmJiBjYXNlX3NlbV9JTlNOX0JORSB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CTEUsICYmIGNhc2Vfc2VtX0lOU05fQkxFIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JPLCAmJiBjYXNlX3NlbV9JTlNOX0JPIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0IsICYmIGNhc2Vfc2VtX0lOU05fQiB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0JYX0lORElSRUNUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX0JYX0lORElSRUNUX0lOREVYIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0JYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fQlhfRElTUCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0JYX0lORElSRUNUX0RJU1AgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9DQUxMWF9ESVNQIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0NBTExYX0lORElSRUNUIH0sCi0gICAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQgfSwKLSAgICB7IEk5NjBCQVNFX0lOU05fUkVULCAmJiBjYXNlX3NlbV9JTlNOX1JFVCB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9DQUxMUywgJiYgY2FzZV9zZW1fSU5TTl9DQUxMUyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9GTUFSSywgJiYgY2FzZV9zZW1fSU5TTl9GTUFSSyB9LAotICAgIHsgSTk2MEJBU0VfSU5TTl9GTFVTSFJFRywgJiYgY2FzZV9zZW1fSU5TTl9GTFVTSFJFRyB9LAotICAgIHsgMCwgMCB9Ci0gIH07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGxhYmVsc1tpXS5sYWJlbCAhPSAwOyArK2kpCi0gICAgewotI2lmIEZBU1RfUAotICAgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Zhc3RfbGFiID0gbGFiZWxzW2ldLmxhYmVsOwotI2Vsc2UKLSAgICAgIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtsYWJlbHNbaV0uaW5kZXhdLnNlbV9mdWxsX2xhYiA9IGxhYmVsc1tpXS5sYWJlbDsKLSNlbmRpZgotICAgIH0KLQotI3VuZGVmIERFRklORV9MQUJFTFMKLSNlbmRpZiAvKiBERUZJTkVfTEFCRUxTICovCi0KLSNpZmRlZiBERUZJTkVfU1dJVENICi0KLS8qIElmIGh5cGVyLWZhc3QgW3dlbGwgbm90IHVubmVjZXNzYXJpbHkgc2xvd10gZXhlY3V0aW9uIGlzIHNlbGVjdGVkLCB0dXJuCi0gICBvZmYgZnJpbGxzIGxpa2UgdHJhY2luZyBhbmQgcHJvZmlsaW5nLiAgKi8KLS8qIEZJWE1FOiBBIGJldHRlciB3YXkgd291bGQgYmUgdG8gaGF2ZSBUUkFDRV9SRVNVTFQgY2hlY2sgZm9yIHNvbWV0aGluZwotICAgdGhhdCBjYW4gY2F1c2UgaXQgdG8gYmUgb3B0aW1pemVkIG91dC4gIEFub3RoZXIgd2F5IHdvdWxkIGJlIHRvIGVtaXQKLSAgIHNwZWNpYWwgaGFuZGxlcnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gInN0cmVhbSIuICAqLwotCi0jaWYgRkFTVF9QCi0jdW5kZWYgVFJBQ0VfUkVTVUxUCi0jZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkKLSNlbmRpZgotCi0jdW5kZWYgR0VUX0FUVFIKLSNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQotCi17Ci0KLSNpZiBXSVRIX1NDQUNIRV9QQkIKLQotLyogQnJhbmNoIHRvIG5leHQgaGFuZGxlciB3aXRob3V0IGdvaW5nIGFyb3VuZCBtYWluIGxvb3AuICAqLwotI2RlZmluZSBORVhUKHZwYykgZ290byAqIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UKLVNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGICh2cGMpIC0+IHNlbWFudGljLnNlbV9jYXNlKQotCi0jZWxzZSAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0jZGVmaW5lIE5FWFQodnBjKSBCUkVBSyAoc2VtKQotI2lmZGVmIF9fR05VQ19fCi0jaWYgRkFTVF9QCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mYXN0X2xhYikKLSNlbHNlCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mdWxsX2xhYikKLSNlbmRpZgotI2Vsc2UKLSAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+bnVtKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0gICAgewotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0lOVkFMSUQpIDogLyogLS1pbnZhbGlkLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0gICAgLyogVXBkYXRlIHRoZSByZWNvcmRlZCBwYyBpbiB0aGUgY3B1IHN0YXRlIHN0cnVjdC4KLSAgICAgICBPbmx5IG5lY2Vzc2FyeSBmb3IgV0lUSF9TQ0FDSEUgY2FzZSwgYnV0IHRvIGF2b2lkIHRoZQotICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIC4uLi4gICovCi0gICAgU0VUX0hfUEMgKHBjKTsKLSAgICAvKiBWaXJ0dWFsIGluc25zIGhhdmUgemVybyBzaXplLiAgT3ZlcndyaXRlIHZwYyB3aXRoIGFkZHJlc3Mgb2YgbmV4dCBpbnNuCi0gICAgICAgdXNpbmcgdGhlIGRlZmF1bHQtaW5zbi1iaXRzaXplIHNwZWMuICBXaGVuIGV4ZWN1dGluZyBpbnNucyBpbiBwYXJhbGxlbAotICAgICAgIHdlIG1heSB3YW50IHRvIHF1ZXVlIHRoZSBmYXVsdCBhbmQgY29udGludWUgZXhlY3V0aW9uLiAgKi8KLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLSAgICB2cGMgPSBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjLCB2cGMpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9BRlRFUikgOiAvKiAtLWFmdGVyLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCi0gICAgaTk2MGJhc2VfcGJiX2FmdGVyIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVGT1JFKSA6IC8qIC0tYmVmb3JlLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCi0gICAgaTk2MGJhc2VfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0NUSV9DSEFJTikgOiAvKiAtLWN0aS1jaGFpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9JOTYwQkFTRQotI2lmZGVmIERFRklORV9TV0lUQ0gKLSAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKLQkJCSAgICAgICBwYmJfYnJfdHlwZSwgcGJiX2JyX25wYyk7Ci0gICAgQlJFQUsgKHNlbSk7Ci0jZWxzZQotICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCi0gICAgdnBjID0gaTk2MGJhc2VfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9UWVBFIChjdXJyZW50X2NwdSksCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9OUEMgKGN1cnJlbnRfY3B1KSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9DSEFJTikgOiAvKiAtLWNoYWluLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCi0gICAgdnBjID0gaTk2MGJhc2VfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIEJSRUFLIChzZW0pOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVHSU4pIDogLyogLS1iZWdpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9JOTYwQkFTRQotI2lmZGVmIERFRklORV9TV0lUQ0gKLSAgICAvKiBJbiB0aGUgc3dpdGNoIGNhc2UgRkFTVF9QIGlzIGEgY29uc3RhbnQsIGFsbG93aW5nIHNldmVyYWwgb3B0aW1pemF0aW9ucwotICAgICAgIGluIGFueSBjYWxsZWQgaW5saW5lIGZ1bmN0aW9ucy4gICovCi0gICAgdnBjID0gaTk2MGJhc2VfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgRkFTVF9QKTsKLSNlbHNlCi0gICAgdnBjID0gaTk2MGJhc2VfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKLSNlbmRpZgotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxPKSA6IC8qIG11bG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01VTE8xKSA6IC8qIG11bG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE1VTFNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMTzIpIDogLyogbXVsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxPMykgOiAvKiBtdWxvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1PKSA6IC8qIHJlbW8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVU1PRFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1PMSkgOiAvKiByZW1vICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBVTU9EU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1PMikgOiAvKiByZW1vICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBVTU9EU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1PMykgOiAvKiByZW1vICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBVTU9EU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWTykgOiAvKiBkaXZvICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWTzEpIDogLyogZGl2byAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVURJVlNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWTzIpIDogLyogZGl2byAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVURJVlNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWTzMpIDogLyogZGl2byAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVURJVlNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFTUkpIDogLyogcmVtaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNT0RTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUkVNSTEpIDogLyogcmVtaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1JMikgOiAvKiByZW1pICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNT0RTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFTUkzKSA6IC8qIHJlbWkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE1PRFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVkkpIDogLyogZGl2aSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWSTEpIDogLyogZGl2aSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRElWU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ESVZJMikgOiAvKiBkaXZpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBESVZTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVkkzKSA6IC8qIGRpdmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FERE8pIDogLyogYWRkbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQURETzEpIDogLyogYWRkbyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERPMikgOiAvKiBhZGRvICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FERE8zKSA6IC8qIGFkZG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQk8pIDogLyogc3VibyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1VCTzEpIDogLyogc3VibyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVUJPMikgOiAvKiBzdWJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQk8zKSA6IC8qIHN1Ym8gJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVEJJVCkgOiAvKiBub3RiaXQgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9UQklUMSkgOiAvKiBub3RiaXQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1RCSVQyKSA6IC8qIG5vdGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVEJJVDMpIDogLyogbm90Yml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoU0xMU0kgKDEsIEZMRCAoZl9zcmMxKSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORCkgOiAvKiBhbmQgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORDEpIDogLyogYW5kICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORDIpIDogLyogYW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORDMpIDogLyogYW5kICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BTkROT1QpIDogLyogYW5kbm90ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORE5PVDEpIDogLyogYW5kbm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3JjMiksIElOVlNJIChGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQU5ETk9UMikgOiAvKiBhbmRub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChGTEQgKGZfc3JjMiksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BTkROT1QzKSA6IC8qIGFuZG5vdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TRVRCSVQpIDogLyogc2V0Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0VUQklUMSkgOiAvKiBzZXRiaXQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NFVEJJVDIpIDogLyogc2V0Yml0ICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TRVRCSVQzKSA6IC8qIHNldGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoU0xMU0kgKDEsIEZMRCAoZl9zcmMxKSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVEFORCkgOiAvKiBub3RhbmQgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJICgqIEZMRCAoaV9zcmMyKSksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9UQU5EMSkgOiAvKiBub3RhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoKiBGTEQgKGlfc3JjMikpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1RBTkQyKSA6IC8qIG5vdGFuZCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChGTEQgKGZfc3JjMikpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVEFORDMpIDogLyogbm90YW5kICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUikgOiAvKiB4b3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUjEpIDogLyogeG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUjIpIDogLyogeG9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUjMpIDogLyogeG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUikgOiAvKiBvciAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUjEpIDogLyogb3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUjIpIDogLyogb3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUjMpIDogLyogb3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9SKSA6IC8qIG5vciAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PUjEpIDogLyogbm9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1IyKSA6IC8qIG5vciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChGTEQgKGZfc3JjMikpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9SMykgOiAvKiBub3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoRkxEIChmX3NyYzIpKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YTk9SKSA6IC8qIHhub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKFhPUlNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWE5PUjEpIDogLyogeG5vciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKFhPUlNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hOT1IyKSA6IC8qIHhub3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IElOVlNJIChYT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YTk9SMykgOiAvKiB4bm9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoWE9SU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVCkgOiAvKiBub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVDEpIDogLyogbm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9UMikgOiAvKiBub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05PVDMpIDogLyogbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fT1JOT1QpIDogLyogb3Jub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3JjMiksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUk5PVDEpIDogLyogb3Jub3QgJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX3NyYzIpLCBJTlZTSSAoRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX09STk9UMikgOiAvKiBvcm5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoRkxEIChmX3NyYzIpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fT1JOT1QzKSA6IC8qIG9ybm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJIChGTEQgKGZfc3JjMiksIElOVlNJIChGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ0xSQklUKSA6IC8qIGNscmJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSkpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NMUkJJVDEpIDogLyogY2xyYml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTFJCSVQyKSA6IC8qIGNscmJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpKSwgRkxEIChmX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ0xSQklUMykgOiAvKiBjbHJiaXQgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoU0xMU0kgKDEsIEZMRCAoZl9zcmMxKSkpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSExPKSA6IC8qIHNobG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/ICgwKSA6IChTTExTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NITE8xKSA6IC8qIHNobG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoRkxEIChmX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NITE8yKSA6IC8qIHNobG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0hMTzMpIDogLyogc2hsbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJIChGTEQgKGZfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NIUk8pIDogLyogc2hybyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKCogRkxEIChpX3NyYzEpLCAzMikpID8gKDApIDogKFNSTFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0hSTzEpIDogLyogc2hybyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJIChGTEQgKGZfc3JjMSksIDMyKSkgPyAoMCkgOiAoU1JMU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0hSTzIpIDogLyogc2hybyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/ICgwKSA6IChTUkxTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSFJPMykgOiAvKiBzaHJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/ICgwKSA6IChTUkxTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0hMSSkgOiAvKiBzaGxpICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSExJMSkgOiAvKiBzaGxpICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/ICgwKSA6IChTTExTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSExJMikgOiAvKiBzaGxpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKCogRkxEIChpX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NITEkzKSA6IC8qIHNobGkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoRkxEIChmX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSFJJKSA6IC8qIHNocmkgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/IChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDMxKSkgOiAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TSFJJMSkgOiAvKiBzaHJpICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/IChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDMxKSkgOiAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0hSSTIpIDogLyogc2hyaSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/IChTUkFTSSAoRkxEIChmX3NyYzIpLCAzMSkpIDogKFNSQVNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NIUkkzKSA6IC8qIHNocmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoRkxEIChmX3NyYzEpLCAzMikpID8gKFNSQVNJIChGTEQgKGZfc3JjMiksIDMxKSkgOiAoU1JBU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VNVUwpIDogLyogZW11bCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBESSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzIpKSk7Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdGVtcCwgMzIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9FTVVMMSkgOiAvKiBlbXVsICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBESSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKEZMRCAoZl9zcmMxKSksIFpFWFRTSURJICgqIEZMRCAoaV9zcmMyKSkpOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRU1VTDIpIDogLyogZW11bCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgREkgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF90ZW1wID0gTVVMREkgKFpFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIFpFWFRTSURJIChGTEQgKGZfc3JjMikpKTsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JMREkgKHRtcF90ZW1wLCAzMikpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0VNVUwzKSA6IC8qIGVtdWwgJGxpdDEsICRsaXQyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIERJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfdGVtcCA9IE1VTERJIChaRVhUU0lESSAoRkxEIChmX3NyYzEpKSwgWkVYVFNJREkgKEZMRCAoZl9zcmMyKSkpOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTU9WKSA6IC8qIG1vdiAkc3JjMSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTU9WMSkgOiAvKiBtb3YgJGxpdDEsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT1ZMKSA6IC8qIG1vdmwgJHNyYzEsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfZHJlZ25vOwotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjMSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyYzEpKSArICgxKSldKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT1ZMMSkgOiAvKiBtb3ZsICRsaXQxLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT1ZUKSA6IC8qIG1vdnQgJHNyYzEsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfZHJlZ25vOwotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjMSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyYzEpKSArICgxKSldKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyYzEpKSArICgyKSldKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT1ZUMSkgOiAvKiBtb3Z0ICRsaXQxLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3ZxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01PVlEpIDogLyogbW92cSAkc3JjMSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDIpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDMpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01PVlExKSA6IC8qIG1vdnEgJGxpdDEsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9zcmMxKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTU9EUEMpIDogLyogbW9kcGMgJHNyYzEsICRzcmMyLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzIpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NT0RBQykgOiAvKiBtb2RhYyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMik7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEQV9PRkZTRVQpIDogLyogbGRhICRvZmZzZXQsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfb2Zmc2V0KTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERBX0lORElSRUNUX09GRlNFVCkgOiAvKiBsZGEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREFfSU5ESVJFQ1QpIDogLyogbGRhICgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfYWJhc2UpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgpIDogLyogbGRhICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERBX0RJU1ApIDogLyogbGRhICRvcHRkaXNwLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9vcHRkaXNwKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERBX0lORElSRUNUX0RJU1ApIDogLyogbGRhICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERBX0lOREVYX0RJU1ApIDogLyogbGRhICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogbGRhICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERfT0ZGU0VUKSA6IC8qIGxkICRvZmZzZXQsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX0lORElSRUNUX09GRlNFVCkgOiAvKiBsZCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRF9JTkRJUkVDVCkgOiAvKiBsZCAoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX0lORElSRUNUX0lOREVYKSA6IC8qIGxkICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX0RJU1ApIDogLyogbGQgJG9wdGRpc3AsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRF9JTkRFWF9ESVNQKSA6IC8qIGxkICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogbGQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPQl9PRkZTRVQpIDogLyogbGRvYiAkb2Zmc2V0LCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRvYiAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVCkgOiAvKiBsZG9iICgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgpIDogLyogbGRvYiAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPQl9ESVNQKSA6IC8qIGxkb2IgJG9wdGRpc3AsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET0JfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZG9iICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRE9CX0lOREVYX0RJU1ApIDogLyogbGRvYiAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkb2IgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfT0ZGU0VUKSA6IC8qIGxkb3MgJG9mZnNldCwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkb3MgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1QpIDogLyogbGRvcyAoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRE9TX0lORElSRUNUX0lOREVYKSA6IC8qIGxkb3MgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfRElTUCkgOiAvKiBsZG9zICRvcHRkaXNwLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRE9TX0lORElSRUNUX0RJU1ApIDogLyogbGRvcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERPU19JTkRFWF9ESVNQKSA6IC8qIGxkb3MgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZG9zICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRElCX09GRlNFVCkgOiAvKiBsZGliICRvZmZzZXQsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJQl9JTkRJUkVDVCkgOiAvKiBsZGliICgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJQl9JTkRJUkVDVF9JTkRFWCkgOiAvKiBsZGliICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ERVhfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESVNfT0ZGU0VUKSA6IC8qIGxkaXMgJG9mZnNldCwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRpcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRElTX0lORElSRUNUKSA6IC8qIGxkaXMgKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRElTX0lORElSRUNUX0lOREVYKSA6IC8qIGxkaXMgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJU19ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJU19JTkRFWF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERMX09GRlNFVCkgOiAvKiBsZGwgJG9mZnNldCwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gRkxEIChmX29mZnNldCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRsICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRExfSU5ESVJFQ1QpIDogLyogbGRsICgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xETF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBsZGwgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xETF9ESVNQKSA6IC8qIGxkbCAkb3B0ZGlzcCwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEZMRCAoZl9vcHRkaXNwKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERMX0lORElSRUNUX0RJU1ApIDogLyogbGRsICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRExfSU5ERVhfRElTUCkgOiAvKiBsZGwgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkbCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERUX09GRlNFVCkgOiAvKiBsZHQgJG9mZnNldCwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gRkxEIChmX29mZnNldCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkdCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVF9JTkRJUkVDVCkgOiAvKiBsZHQgKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9ICogRkxEIChpX2FiYXNlKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBsZHQgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFRfRElTUCkgOiAvKiBsZHQgJG9wdGRpc3AsICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBGTEQgKGZfb3B0ZGlzcCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZHQgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ERVhfRElTUCkgOiAvKiBsZHQgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZHQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFFfT0ZGU0VUKSA6IC8qIGxkcSAkb2Zmc2V0LCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERRX0lORElSRUNUX09GRlNFVCkgOiAvKiBsZHEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUV9JTkRJUkVDVCkgOiAvKiBsZHEgKCRhYmFzZSksICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9ICogRkxEIChpX2FiYXNlKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERRX0lORElSRUNUX0lOREVYKSA6IC8qIGxkcSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERRX0RJU1ApIDogLyogbGRxICRvcHRkaXNwLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gRkxEIChmX29wdGRpc3ApOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZHEgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEUV9JTkRFWF9ESVNQKSA6IC8qIGxkcSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogbGRxICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9PRkZTRVQpIDogLyogc3QgJHN0X3NyYywgJG9mZnNldCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQpIDogLyogc3QgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9JTkRJUkVDVCkgOiAvKiBzdCAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RfSU5ESVJFQ1RfSU5ERVgpIDogLyogc3QgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9ESVNQKSA6IC8qIHN0ICRzdF9zcmMsICRvcHRkaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX0lOREVYX0RJU1ApIDogLyogc3QgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogc3QgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9CX09GRlNFVCkgOiAvKiBzdG9iICRzdF9zcmMsICRvZmZzZXQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQpIDogLyogc3RvYiAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfSU5ESVJFQ1QpIDogLyogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdG9iICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RPQl9ESVNQKSA6IC8qIHN0b2IgJHN0X3NyYywgJG9wdGRpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9CX0lORElSRUNUX0RJU1ApIDogLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfSU5ERVhfRElTUCkgOiAvKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUT1NfT0ZGU0VUKSA6IC8qIHN0b3MgJHN0X3NyYywgJG9mZnNldCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCkgOiAvKiBzdG9zICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RPU19JTkRJUkVDVCkgOiAvKiBzdG9zICRzdF9zcmMsICgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9TX0lORElSRUNUX0lOREVYKSA6IC8qIHN0b3MgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVE9TX0RJU1ApIDogLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdG9zICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RPU19JTkRFWF9ESVNQKSA6IC8qIHN0b3MgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdG9zICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RMX09GRlNFVCkgOiAvKiBzdGwgJHN0X3NyYywgJG9mZnNldCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQpIDogLyogc3RsICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RMX0lORElSRUNUKSA6IC8qIHN0bCAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RMX0lORElSRUNUX0lOREVYKSA6IC8qIHN0bCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RMX0RJU1ApIDogLyogc3RsICRzdF9zcmMsICRvcHRkaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RMX0lORElSRUNUX0RJU1ApIDogLyogc3RsICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRFWF9ESVNQKSA6IC8qIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFRfT0ZGU0VUKSA6IC8qIHN0dCAkc3Rfc3JjLCAkb2Zmc2V0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RUX0lORElSRUNUX09GRlNFVCkgOiAvKiBzdHQgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RUX0lORElSRUNUKSA6IC8qIHN0dCAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdHQgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUVF9ESVNQKSA6IC8qIHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFRfSU5ERVhfRElTUCkgOiAvKiBzdHQgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9PRkZTRVQpIDogLyogc3RxICRzdF9zcmMsICRvZmZzZXQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgMTIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RRX0lORElSRUNUX09GRlNFVCkgOiAvKiBzdHEgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFFfSU5ESVJFQ1QpIDogLyogc3RxICRzdF9zcmMsICgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgpIDogLyogc3RxICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgMTIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RRX0RJU1ApIDogLyogc3RxICRzdF9zcmMsICRvcHRkaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgMTIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RRX0lORElSRUNUX0RJU1ApIDogLyogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgMTIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RRX0lOREVYX0RJU1ApIDogLyogc3RxICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdHEgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBPQkVfUkVHKSA6IC8qIGNtcG9iZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CRV9MSVQpIDogLyogY21wb2JlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTkVfUkVHKSA6IC8qIGNtcG9ibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBPQk5FX0xJVCkgOiAvKiBjbXBvYm5lICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTF9SRUcpIDogLyogY21wb2JsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMVFVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTF9MSVQpIDogLyogY21wb2JsICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMVFVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBPQkxFX1JFRykgOiAvKiBjbXBvYmxlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMRVVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTEVfTElUKSA6IC8qIGNtcG9ibGUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKExFVVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CR19SRUcpIDogLyogY21wb2JnICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CR19MSVQpIDogLyogY21wb2JnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBPQkdFX1JFRykgOiAvKiBjbXBvYmdlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHRVVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CR0VfTElUKSA6IC8qIGNtcG9iZ2UgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdFVVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCRV9SRUcpIDogLyogY21waWJlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSUJFX0xJVCkgOiAvKiBjbXBpYmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEVRU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSUJORV9SRUcpIDogLyogY21waWJuZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCTkVfTElUKSA6IC8qIGNtcGlibmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSUJMX1JFRykgOiAvKiBjbXBpYmwgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKExUU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJQkxfTElUKSA6IC8qIGNtcGlibCAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTFRTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJQkxFX1JFRykgOiAvKiBjbXBpYmxlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMRVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSUJMRV9MSVQpIDogLyogY21waWJsZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTEVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJQkdfUkVHKSA6IC8qIGNtcGliZyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR1RTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCR19MSVQpIDogLyogY21waWJnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCR0VfUkVHKSA6IC8qIGNtcGliZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdFU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJQkdFX0xJVCkgOiAvKiBjbXBpYmdlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHRVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JCQ19SRUcpIDogLyogYmJjICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJIChBTkRTSSAoU0xMU0kgKDEsICogRkxEIChpX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JCQ19MSVQpIDogLyogYmJjICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJIChBTkRTSSAoU0xMU0kgKDEsIEZMRCAoZl9icl9zcmMxKSksICogRkxEIChpX2JyX3NyYzIpKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CQlNfUkVHKSA6IC8qIGJicyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoQU5EU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9icl9zcmMxKSksICogRkxEIChpX2JyX3NyYzIpKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CQlNfTElUKSA6IC8qIGJicyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoQU5EU0kgKFNMTFNJICgxLCBGTEQgKGZfYnJfc3JjMSkpLCAqIEZMRCAoaV9icl9zcmMyKSksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSSkgOiAvKiBjbXBpICRzcmMxLCAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChMVFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICg0KSA6IChFUVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJMSkgOiAvKiBjbXBpICRsaXQxLCAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJMikgOiAvKiBjbXBpICRzcmMxLCAkbGl0MiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBJMykgOiAvKiBjbXBpICRsaXQxLCAkbGl0MiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICg0KSA6IChFUVNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDIpIDogKDEpOwotICAgIENQVSAoaF9jYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE8pIDogLyogY21wbyAkc3JjMSwgJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRVU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDIpIDogKDEpOwotICAgIENQVSAoaF9jYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUE8xKSA6IC8qIGNtcG8gJGxpdDEsICRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChMVFVTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBPMikgOiAvKiBjbXBvICRzcmMxLCAkbGl0MiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRVU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICg0KSA6IChFUVNJICgqIEZMRCAoaV9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoMikgOiAoMSk7Ci0gICAgQ1BVIChoX2NjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QTzMpIDogLyogY21wbyAkbGl0MSwgJGxpdDIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKExUVVNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoMikgOiAoMSk7Ci0gICAgQ1BVIChoX2NjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fVEVTVE5PX1JFRykgOiAvKiB0ZXN0bm8gJGJyX3NyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFUVNJIChDUFUgKGhfY2MpLCAwKTsKLSAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9URVNUR19SRUcpIDogLyogdGVzdGcgJGJyX3NyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMSksIDApOwotICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1RFU1RFX1JFRykgOiAvKiB0ZXN0ZSAkYnJfc3JjMSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAyKSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fVEVTVEdFX1JFRykgOiAvKiB0ZXN0Z2UgJGJyX3NyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMyksIDApOwotICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1RFU1RMX1JFRykgOiAvKiB0ZXN0bCAkYnJfc3JjMSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA0KSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fVEVTVE5FX1JFRykgOiAvKiB0ZXN0bmUgJGJyX3NyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNSksIDApOwotICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1RFU1RMRV9SRUcpIDogLyogdGVzdGxlICRicl9zcmMxICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90ZXN0bm9fcmVnLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDYpLCAwKTsKLSAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9URVNUT19SRUcpIDogLyogdGVzdG8gJGJyX3NyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNyksIDApOwotICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JOTykgOiAvKiBibm8gJGN0cmxfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoQ1BVIChoX2NjKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JHKSA6IC8qIGJnICRjdHJsX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAxKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JFKSA6IC8qIGJlICRjdHJsX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JHRSkgOiAvKiBiZ2UgJGN0cmxfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDMpLCAwKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2N0cmxfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkwpIDogLyogYmwgJGN0cmxfZGlzcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYm5vLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDQpLCAwKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2N0cmxfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQk5FKSA6IC8qIGJuZSAkY3RybF9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNSksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTEUpIDogLyogYmxlICRjdHJsX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA2KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JPKSA6IC8qIGJvICRjdHJsX2Rpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA3KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0IpIDogLyogYiAkY3RybF9kaXNwICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JYX0lORElSRUNUX09GRlNFVCkgOiAvKiBieCAkb2Zmc2V0KCRhYmFzZSkgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JYX0lORElSRUNUKSA6IC8qIGJ4ICgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBieCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JYX0RJU1ApIDogLyogYnggJG9wdGRpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQlhfSU5ESVJFQ1RfRElTUCkgOiAvKiBieCAkb3B0ZGlzcCgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NBTExYX0RJU1ApIDogLyogY2FsbHggJG9wdGRpc3AgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIHRtcF90ZW1wID0gQU5EU0kgKEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxKV0pLCA2MyksIElOVlNJICg2MykpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDgpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOwotICB9Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApLCBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNCksIENQVSAoaF9nclsoKFVJTlQpIDEpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSwgQ1BVIChoX2dyWygoVUlOVCkgMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSwgQ1BVIChoX2dyWygoVUlOVCkgMyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDE2KSwgQ1BVIChoX2dyWygoVUlOVCkgNCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSwgQ1BVIChoX2dyWygoVUlOVCkgNSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSwgQ1BVIChoX2dyWygoVUlOVCkgNildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI4KSwgQ1BVIChoX2dyWygoVUlOVCkgNyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSwgQ1BVIChoX2dyWygoVUlOVCkgOCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSwgQ1BVIChoX2dyWygoVUlOVCkgOSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCksIENQVSAoaF9nclsoKFVJTlQpIDExKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NiksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNjApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NBTExYX0lORElSRUNUKSA6IC8qIGNhbGx4ICgkYWJhc2UpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9pbmRpcmVjdF9vZmZzZXQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIHRtcF90ZW1wID0gQU5EU0kgKEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxKV0pLCA2MyksIElOVlNJICg2MykpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOwotICB9Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApLCBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNCksIENQVSAoaF9nclsoKFVJTlQpIDEpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSwgQ1BVIChoX2dyWygoVUlOVCkgMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSwgQ1BVIChoX2dyWygoVUlOVCkgMyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDE2KSwgQ1BVIChoX2dyWygoVUlOVCkgNCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSwgQ1BVIChoX2dyWygoVUlOVCkgNSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSwgQ1BVIChoX2dyWygoVUlOVCkgNildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI4KSwgQ1BVIChoX2dyWygoVUlOVCkgNyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSwgQ1BVIChoX2dyWygoVUlOVCkgOCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSwgQ1BVIChoX2dyWygoVUlOVCkgOSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCksIENQVSAoaF9nclsoKFVJTlQpIDExKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NiksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNjApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci1DUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDQpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDcpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEwKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDExKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gMHhkZWFkYmVlZjsKLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMzEpXSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0wIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RlbXA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMzEpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMzEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAodG1wX3RlbXAsIDY0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGNhbGx4ICRvZmZzZXQoJGFiYXNlKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICB0bXBfdGVtcCA9IEFORFNJIChBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMSldKSwgNjMpLCBJTlZTSSAoNjMpKTsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTIiLCAneCcsIG9wdmFsKTsKLSAgfQotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSwgQ1BVIChoX2dyWygoVUlOVCkgMCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgOCksIENQVSAoaF9nclsoKFVJTlQpIDIpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMiksIENQVSAoaF9nclsoKFVJTlQpIDMpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxNiksIENQVSAoaF9nclsoKFVJTlQpIDQpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyMCksIENQVSAoaF9nclsoKFVJTlQpIDUpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCksIENQVSAoaF9nclsoKFVJTlQpIDYpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyOCksIENQVSAoaF9nclsoKFVJTlQpIDcpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzMiksIENQVSAoaF9nclsoKFVJTlQpIDgpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNiksIENQVSAoaF9nclsoKFVJTlQpIDkpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0MCksIENQVSAoaF9nclsoKFVJTlQpIDEwKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ4KSwgQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1MiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDYwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOwotICB7Ci0gICAgVVNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFVCkgOiAvKiByZXQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2Rpc3AuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMCldKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOwotICB9Ci1DUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMikpOwotQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCkpOwotQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNikpOwotQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCkpOwotQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCkpOwotICB7Ci0gICAgVVNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMildKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NBTExTKSA6IC8qIGNhbGxzICRzcmMxICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBpOTYwX3RyYXAgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMSkpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRk1BUkspIDogLyogZm1hcmsgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gaTk2MF9icmVha3BvaW50IChjdXJyZW50X2NwdSwgcGMpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRkxVU0hSRUcpIDogLyogZmx1c2hyZWcgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotKCh2b2lkKSAwKTsgLypub3AqLwotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLQotICAgIH0KLSAgRU5EU1dJVENIIChzZW0pIC8qIEVuZCBvZiBzZW1hbnRpYyBzd2l0Y2guICAqLwotCi0gIC8qIEF0IHRoaXMgcG9pbnQgYHZwYycgY29udGFpbnMgdGhlIG5leHQgaW5zbiB0byBleGVjdXRlLiAgKi8KLX0KLQotI3VuZGVmIERFRklORV9TV0lUQ0gKLSNlbmRpZiAvKiBERUZJTkVfU1dJVENIICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9zZW0uYyBiL3NpbS9pOTYwL3NlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIzNDBlLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL3NlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkxOCArMCwwIEBACi0vKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBpOTYwYmFzZS4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBpOTYwYmFzZQotI2RlZmluZSBXQU5UX0NQVV9JOTYwQkFTRQotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJjZ2VuLW1lbS5oIgotI2luY2x1ZGUgImNnZW4tb3BzLmgiCi0KLSN1bmRlZiBHRVRfQVRUUgotI2RlZmluZSBHRVRfQVRUUihjcHUsIG51bSwgYXR0cikgQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBhYnVmLT5pZGVzYy0+YXR0cnMsIENHRU5fSU5TTl8jI2F0dHIpCi0KLS8qIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBjb21waWxlIHR3byBjb3BpZXMgb2YgdGhlIHNlbWFudGljIGNvZGUsCi0gICBvbmUgd2l0aCBmdWxsIGZlYXR1cmUgc3VwcG9ydCBhbmQgb25lIHdpdGhvdXQgdGhhdCBydW5zIGZhc3QoZXIpLgotICAgRkFTVF9QLCB3aGVuIGRlc2lyZWQsIGlzIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgLURGQVNUX1A9MS4gICovCi0jaWYgRkFTVF9QCi0jZGVmaW5lIFNFTV9GTl9OQU1FKGNwdSxmbikgWENPTkNBVDMgKGNwdSxfc2VtZl8sZm4pCi0jdW5kZWYgVFJBQ0VfUkVTVUxUCi0jZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkKLSNlbHNlCi0jZGVmaW5lIFNFTV9GTl9OQU1FKGNwdSxmbikgWENPTkNBVDMgKGNwdSxfc2VtXyxmbikKLSNlbmRpZgotCi0vKiB4LWludmFsaWQ6IC0taW52YWxpZC0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2ludmFsaWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotICAgIC8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgcGMgaW4gdGhlIGNwdSBzdGF0ZSBzdHJ1Y3QuCi0gICAgICAgT25seSBuZWNlc3NhcnkgZm9yIFdJVEhfU0NBQ0hFIGNhc2UsIGJ1dCB0byBhdm9pZCB0aGUKLSAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiAuLi4uICAqLwotICAgIFNFVF9IX1BDIChwYyk7Ci0gICAgLyogVmlydHVhbCBpbnNucyBoYXZlIHplcm8gc2l6ZS4gIE92ZXJ3cml0ZSB2cGMgd2l0aCBhZGRyZXNzIG9mIG5leHQgaW5zbgotICAgICAgIHVzaW5nIHRoZSBkZWZhdWx0LWluc24tYml0c2l6ZSBzcGVjLiAgV2hlbiBleGVjdXRpbmcgaW5zbnMgaW4gcGFyYWxsZWwKLSAgICAgICB3ZSBtYXkgd2FudCB0byBxdWV1ZSB0aGUgZmF1bHQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gICovCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0gICAgdnBjID0gc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYywgdnBjKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtYWZ0ZXI6IC0tYWZ0ZXItLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UseF9hZnRlcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCi0gICAgaTk2MGJhc2VfcGJiX2FmdGVyIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtYmVmb3JlOiAtLWJlZm9yZS0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2JlZm9yZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCi0gICAgaTk2MGJhc2VfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB4LWN0aS1jaGFpbjogLS1jdGktY2hhaW4tLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UseF9jdGlfY2hhaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9JOTYwQkFTRQotI2lmZGVmIERFRklORV9TV0lUQ0gKLSAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKLQkJCSAgICAgICBwYmJfYnJfdHlwZSwgcGJiX2JyX25wYyk7Ci0gICAgQlJFQUsgKHNlbSk7Ci0jZWxzZQotICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCi0gICAgdnBjID0gaTk2MGJhc2VfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9UWVBFIChjdXJyZW50X2NwdSksCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9OUEMgKGN1cnJlbnRfY3B1KSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1jaGFpbjogLS1jaGFpbi0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2NoYWluKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKLSAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgQlJFQUsgKHNlbSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeC1iZWdpbjogLS1iZWdpbi0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2JlZ2luKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKLSAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLwotICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIEZBU1RfUCk7Ci0jZWxzZQotICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIFNUQVRFX1JVTl9GQVNUX1AgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXVsbzogbXVsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG11bG8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG11bG8xOiBtdWxvICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE1VTFNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXVsbzI6IG11bG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtdWxvMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtdWxvMzogbXVsbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG11bG8zKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiByZW1vOiByZW1vICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBVTU9EU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHJlbW8xOiByZW1vICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHJlbW8yOiByZW1vICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVNT0RTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHJlbW8zOiByZW1vICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVNT0RTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkaXZvOiBkaXZvICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBVRElWU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdm8xOiBkaXZvICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdm8yOiBkaXZvICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdm8zOiBkaXZvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiByZW1pOiByZW1pICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNT0RTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmVtaTE6IHJlbWkgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiByZW1pMjogcmVtaSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJlbWkyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNT0RTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHJlbWkzOiByZW1pICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtaTMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE1PRFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdmk6IGRpdmkgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkaXZpMTogZGl2aSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdmkxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGRpdmkyOiBkaXZpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2aTIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZGl2aTM6IGRpdmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRElWU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYWRkbzogYWRkbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFkZG8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZG8xOiBhZGRvICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYWRkbzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYWRkbzI6IGFkZG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRvMzogYWRkbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFkZG8zKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdWJvOiBzdWJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3VibykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3VibzE6IHN1Ym8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdWJvMjogc3VibyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN1Ym8yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN1Ym8zOiBzdWJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3VibzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNVQlNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG5vdGJpdDogbm90Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90Yml0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG5vdGJpdDE6IG5vdGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGJpdDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3RiaXQyOiBub3RiaXQgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RiaXQyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSwgRkxEIChmX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm90Yml0Mzogbm90Yml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90Yml0MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhbmQ6IGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYW5kMTogYW5kICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhbmQyOiBhbmQgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxhbmQyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFuZDM6IGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFuZG5vdDogYW5kbm90ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kbm90KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFuZG5vdDE6IGFuZG5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZG5vdDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhbmRub3QyOiBhbmRub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxhbmRub3QyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3NyYzIpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYW5kbm90MzogYW5kbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kbm90MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzZXRiaXQ6IHNldGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNldGJpdDE6IHNldGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNldGJpdDI6IHNldGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNldGJpdDM6IHNldGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3RhbmQ6IG5vdGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGFuZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgKiBGTEQgKGlfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3RhbmQxOiBub3RhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RhbmQxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm90YW5kMjogbm90YW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90YW5kMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChGTEQgKGZfc3JjMikpLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG5vdGFuZDM6IG5vdGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGFuZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoRkxEIChmX3NyYzIpKSwgRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeG9yOiB4b3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHhvcjE6IHhvciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhvcjEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeG9yMjogeG9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UseG9yMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB4b3IzOiB4b3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBvcjogb3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBvcjE6IG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usb3IxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3IyOiBvciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9yMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG9yMzogb3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcjMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm9yOiBub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJICgqIEZMRCAoaV9zcmMyKSksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3IxOiBub3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3IyOiBub3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3IzOiBub3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIElOVlNJIChGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeG5vcjogeG5vciAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhub3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKFhPUlNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogeG5vcjE6IHhub3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx4bm9yMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKFhPUlNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHhub3IyOiB4bm9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UseG5vcjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IElOVlNJIChYT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB4bm9yMzogeG5vciAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhub3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoWE9SU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG5vdDogbm90ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3QxOiBub3QgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3QxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoRkxEIChmX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm90Mjogbm90ICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90MikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKCogRkxEIChpX3NyYzEpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm90Mzogbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKEZMRCAoZl9zcmMxKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG9ybm90OiBvcm5vdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9ybm90KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX3NyYzIpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3Jub3QxOiBvcm5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9ybm90MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3JjMiksIElOVlNJIChGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3Jub3QyOiBvcm5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9ybm90MikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoRkxEIChmX3NyYzIpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3Jub3QzOiBvcm5vdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9ybm90MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoRkxEIChmX3NyYzIpLCBJTlZTSSAoRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNscmJpdDogY2xyYml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2xyYml0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2xyYml0MTogY2xyYml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2xyYml0MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSksICogRkxEIChpX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2xyYml0MjogY2xyYml0ICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2xyYml0MikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpKSwgRkxEIChmX3NyYzIpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2xyYml0MzogY2xyYml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2xyYml0MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSksIEZMRCAoZl9zcmMyKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNobG86IHNobG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzaGxvMTogc2hsbyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobG8xKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/ICgwKSA6IChTTExTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzaGxvMjogc2hsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobG8yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKCogRkxEIChpX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNobG8zOiBzaGxvICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsbzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoRkxEIChmX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzaHJvOiBzaHJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hybykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKCogRkxEIChpX3NyYzEpLCAzMikpID8gKDApIDogKFNSTFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2hybzE6IHNocm8gJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJIChGTEQgKGZfc3JjMSksIDMyKSkgPyAoMCkgOiAoU1JMU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2hybzI6IHNocm8gJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/ICgwKSA6IChTUkxTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzaHJvMzogc2hybyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocm8zKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/ICgwKSA6IChTUkxTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2hsaTogc2hsaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJICgqIEZMRCAoaV9zcmMxKSwgMzIpKSA/ICgwKSA6IChTTExTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNobGkxOiBzaGxpICRsaXQxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsaTEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoRkxEIChmX3NyYzEpLCAzMikpID8gKDApIDogKFNMTFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNobGkyOiBzaGxpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsaTIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2hsaTM6IHNobGkgJGxpdDEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxpMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJIChGTEQgKGZfc3JjMSksIDMyKSkgPyAoMCkgOiAoU0xMU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNocmk6IHNocmkgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAzMSkpIDogKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2hyaTE6IHNocmkgJGxpdDEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJpMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKEdFVVNJIChGTEQgKGZfc3JjMSksIDMyKSkgPyAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAzMSkpIDogKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNocmkyOiBzaHJpICRzcmMxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hyaTIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVVTSSAoKiBGTEQgKGlfc3JjMSksIDMyKSkgPyAoU1JBU0kgKEZMRCAoZl9zcmMyKSwgMzEpKSA6IChTUkFTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzaHJpMzogc2hyaSAkbGl0MSwgJGxpdDIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocmkzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VVU0kgKEZMRCAoZl9zcmMxKSwgMzIpKSA/IChTUkFTSSAoRkxEIChmX3NyYzIpLCAzMSkpIDogKFNSQVNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBlbXVsOiBlbXVsICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZW11bCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBESSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzIpKSk7Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdGVtcCwgMzIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBlbXVsMTogZW11bCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGVtdWwxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBESSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKEZMRCAoZl9zcmMxKSksIFpFWFRTSURJICgqIEZMRCAoaV9zcmMyKSkpOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogZW11bDI6IGVtdWwgJHNyYzEsICRsaXQyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgREkgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF90ZW1wID0gTVVMREkgKFpFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIFpFWFRTSURJIChGTEQgKGZfc3JjMikpKTsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JMREkgKHRtcF90ZW1wLCAzMikpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGVtdWwzOiBlbXVsICRsaXQxLCAkbGl0MiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsZW11bDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIERJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfdGVtcCA9IE1VTERJIChaRVhUU0lESSAoRkxEIChmX3NyYzEpKSwgWkVYVFNJREkgKEZMRCAoZl9zcmMyKSkpOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbW92OiBtb3YgJHNyYzEsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1vdjE6IG1vdiAkbGl0MSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3ZsOiBtb3ZsICRzcmMxLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3ZsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1vdmwxOiBtb3ZsICRsaXQxLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3ZsMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSAwOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1vdnQ6IG1vdnQgJHNyYzEsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdnQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbW92cS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX2RyZWdubzsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyYzEpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMSkpXSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMikpXSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbW92dDE6IG1vdnQgJGxpdDEsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdnQxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gMDsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb3ZxOiBtb3ZxICRzcmMxLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3ZxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21vdnEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDIpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDMpKV0pOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1vdnExOiBtb3ZxICRsaXQxLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3ZxMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tb3ZxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9zcmMxKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbW9kcGM6IG1vZHBjICRzcmMxLCAkc3JjMiwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW9kcGMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzIpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtb2RhYzogbW9kYWMgJHNyYzEsICRzcmMyLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb2RhYykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMik7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkYS1vZmZzZXQ6IGxkYSAkb2Zmc2V0LCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9vZmZzZXQpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGEtaW5kaXJlY3Qtb2Zmc2V0OiBsZGEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRhLWluZGlyZWN0OiBsZGEgKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkYS1pbmRpcmVjdC1pbmRleDogbGRhICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRhLWRpc3A6IGxkYSAkb3B0ZGlzcCwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9vcHRkaXNwKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRhLWluZGlyZWN0LWRpc3A6IGxkYSAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRhLWluZGV4LWRpc3A6IGxkYSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRhLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkYSAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQtb2Zmc2V0OiBsZCAkb2Zmc2V0LCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZC1pbmRpcmVjdC1vZmZzZXQ6IGxkICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkLWluZGlyZWN0OiBsZCAoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQtaW5kaXJlY3QtaW5kZXg6IGxkICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQtZGlzcDogbGQgJG9wdGRpc3AsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkLWluZGlyZWN0LWRpc3A6IGxkICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZC1pbmRleC1kaXNwOiBsZCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQtaW5kaXJlY3QtaW5kZXgtZGlzcDogbGQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb2Itb2Zmc2V0OiBsZG9iICRvZmZzZXQsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2Jfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb2ItaW5kaXJlY3Qtb2Zmc2V0OiBsZG9iICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb2ItaW5kaXJlY3Q6IGxkb2IgKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb2ItaW5kaXJlY3QtaW5kZXg6IGxkb2IgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9iX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZG9iLWRpc3A6IGxkb2IgJG9wdGRpc3AsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb2ItaW5kaXJlY3QtZGlzcDogbGRvYiAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9iX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRvYi1pbmRleC1kaXNwOiBsZG9iICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZG9iLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkb2IgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb3Mtb2Zmc2V0OiBsZG9zICRvZmZzZXQsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3Nfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb3MtaW5kaXJlY3Qtb2Zmc2V0OiBsZG9zICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb3MtaW5kaXJlY3Q6IGxkb3MgKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb3MtaW5kaXJlY3QtaW5kZXg6IGxkb3MgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZG9zLWRpc3A6IGxkb3MgJG9wdGRpc3AsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkb3MtaW5kaXJlY3QtZGlzcDogbGRvcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRvcy1pbmRleC1kaXNwOiBsZG9zICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZG9zLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkb3MgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaWItb2Zmc2V0OiBsZGliICRvZmZzZXQsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRpYi1pbmRpcmVjdC1vZmZzZXQ6IGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGliX2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGliLWluZGlyZWN0OiBsZGliICgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGliX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaWItaW5kaXJlY3QtaW5kZXg6IGxkaWIgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGliX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaWItZGlzcDogbGRpYiAkb3B0ZGlzcCwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGliLWluZGlyZWN0LWRpc3A6IGxkaWIgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRpYi1pbmRleC1kaXNwOiBsZGliICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaWItaW5kaXJlY3QtaW5kZXgtZGlzcDogbGRpYiAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGlzLW9mZnNldDogbGRpcyAkb2Zmc2V0LCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGlzX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaXMtaW5kaXJlY3Qtb2Zmc2V0OiBsZGlzICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRpcy1pbmRpcmVjdDogbGRpcyAoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGlzLWluZGlyZWN0LWluZGV4OiBsZGlzICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGlzLWRpc3A6IGxkaXMgJG9wdGRpc3AsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRpcy1pbmRpcmVjdC1kaXNwOiBsZGlzICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaXMtaW5kZXgtZGlzcDogbGRpcyAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGlzLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkaXMgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRsLW9mZnNldDogbGRsICRvZmZzZXQsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRsLWluZGlyZWN0LW9mZnNldDogbGRsICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRsX2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRsLWluZGlyZWN0OiBsZGwgKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9ICogRkxEIChpX2FiYXNlKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRsLWluZGlyZWN0LWluZGV4OiBsZGwgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkbC1kaXNwOiBsZGwgJG9wdGRpc3AsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEZMRCAoZl9vcHRkaXNwKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRsLWluZGlyZWN0LWRpc3A6IGxkbCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGwtaW5kZXgtZGlzcDogbGRsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRsX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkbC1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZGwgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGR0LW9mZnNldDogbGR0ICRvZmZzZXQsICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkdC1pbmRpcmVjdC1vZmZzZXQ6IGxkdCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHQtaW5kaXJlY3Q6IGxkdCAoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGR0LWluZGlyZWN0LWluZGV4OiBsZHQgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHQtZGlzcDogbGR0ICRvcHRkaXNwLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBGTEQgKGZfb3B0ZGlzcCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHQtaW5kaXJlY3QtZGlzcDogbGR0ICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHQtaW5kZXgtZGlzcDogbGR0ICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHQtaW5kaXJlY3QtaW5kZXgtZGlzcDogbGR0ICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHEtb2Zmc2V0OiBsZHEgJG9mZnNldCwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEZMRCAoZl9vZmZzZXQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHEtaW5kaXJlY3Qtb2Zmc2V0OiBsZHEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHEtaW5kaXJlY3Q6IGxkcSAoJGFiYXNlKSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHEtaW5kaXJlY3QtaW5kZXg6IGxkcSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkcV9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRxLWRpc3A6IGxkcSAkb3B0ZGlzcCwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gRkxEIChmX29wdGRpc3ApOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZHEtaW5kaXJlY3QtZGlzcDogbGRxICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkcV9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgU0kgdG1wX2RyZWdubzsKLSAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKLSAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkcS1pbmRleC1kaXNwOiBsZHEgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIFNJIHRtcF9kcmVnbm87Ci0gIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOwotICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOwotICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQtLURGTFQtaW5kZXgtb2YtLURGTFQtZHN0LTIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRxLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkcSAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF90ZW1wOwotICBTSSB0bXBfZHJlZ25vOwotICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7Ci0gICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7Ci0gICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZC0tREZMVC1pbmRleC1vZi0tREZMVC1kc3QtMiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKLSAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkLS1ERkxULWluZGV4LW9mLS1ERkxULWRzdC0zIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdC1vZmZzZXQ6IHN0ICRzdF9zcmMsICRvZmZzZXQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3QtaW5kaXJlY3Qtb2Zmc2V0OiBzdCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LWluZGlyZWN0OiBzdCAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdC1pbmRpcmVjdC1pbmRleDogc3QgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdF9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LWluZGlyZWN0LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LWluZGV4LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3QtaW5kaXJlY3QtaW5kZXgtZGlzcDogc3QgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RvYi1vZmZzZXQ6IHN0b2IgJHN0X3NyYywgJG9mZnNldCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0b2ItaW5kaXJlY3Qtb2Zmc2V0OiBzdG9iICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9iLWluZGlyZWN0OiBzdG9iICRzdF9zcmMsICgkYWJhc2UpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RvYi1pbmRpcmVjdC1pbmRleDogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9iLWRpc3A6IHN0b2IgJHN0X3NyYywgJG9wdGRpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9iLWluZGlyZWN0LWRpc3A6IHN0b2IgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9iLWluZGV4LWRpc3A6IHN0b2IgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0b2ItaW5kaXJlY3QtaW5kZXgtZGlzcDogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0b3Mtb2Zmc2V0OiBzdG9zICRzdF9zcmMsICRvZmZzZXQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3Nfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9zLWluZGlyZWN0LW9mZnNldDogc3RvcyAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Rvcy1pbmRpcmVjdDogc3RvcyAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3Rvc19pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0b3MtaW5kaXJlY3QtaW5kZXg6IHN0b3MgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Rvcy1kaXNwOiBzdG9zICRzdF9zcmMsICRvcHRkaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Rvcy1pbmRpcmVjdC1kaXNwOiBzdG9zICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3Rvcy1pbmRleC1kaXNwOiBzdG9zICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdG9zLWluZGlyZWN0LWluZGV4LWRpc3A6IHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGwtb2Zmc2V0OiBzdGwgJHN0X3NyYywgJG9mZnNldCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGwtaW5kaXJlY3Qtb2Zmc2V0OiBzdGwgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RsLWluZGlyZWN0OiBzdGwgJHN0X3NyYywgKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0bC1pbmRpcmVjdC1pbmRleDogc3RsICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGwtZGlzcDogc3RsICRzdF9zcmMsICRvcHRkaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGwtaW5kaXJlY3QtZGlzcDogc3RsICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RsLWluZGV4LWRpc3A6IHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0bC1pbmRpcmVjdC1pbmRleC1kaXNwOiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0dC1vZmZzZXQ6IHN0dCAkc3Rfc3JjLCAkb2Zmc2V0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0dC1pbmRpcmVjdC1vZmZzZXQ6IHN0dCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3R0LWluZGlyZWN0OiBzdHQgJHN0X3NyYywgKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHQtaW5kaXJlY3QtaW5kZXg6IHN0dCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3R0LWRpc3A6IHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3R0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0dC1pbmRpcmVjdC1kaXNwOiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3R0X2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0dC1pbmRleC1kaXNwOiBzdHQgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHQtaW5kaXJlY3QtaW5kZXgtZGlzcDogc3R0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RxLW9mZnNldDogc3RxICRzdF9zcmMsICRvZmZzZXQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDEyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cS1pbmRpcmVjdC1vZmZzZXQ6IHN0cSAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHEtaW5kaXJlY3Q6IHN0cSAkc3Rfc3JjLCAoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgMTIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RxLWluZGlyZWN0LWluZGV4OiBzdHEgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRtcF9zcmVnbm87Ci0gIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHEtZGlzcDogc3RxICRzdF9zcmMsICRvcHRkaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHEtaW5kaXJlY3QtZGlzcDogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdHEtaW5kZXgtZGlzcDogc3RxICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3NyZWdubzsKLSAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDEyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0cS1pbmRpcmVjdC1pbmRleC1kaXNwOiBzdHEgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKLQotewotICBTSSB0bXBfc3JlZ25vOwotICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgOCksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOwotICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDEyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG9iZS1yZWc6IGNtcG9iZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEVRU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBvYmUtbGl0OiBjbXBvYmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JlX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG9ibmUtcmVnOiBjbXBvYm5lICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9ibmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBvYm5lLWxpdDogY21wb2JuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYm5lX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG9ibC1yZWc6IGNtcG9ibCAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmxfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKExUVVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21wb2JsLWxpdDogY21wb2JsICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9ibF9saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTFRVU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21wb2JsZS1yZWc6IGNtcG9ibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JsZV9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTEVVU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBvYmxlLWxpdDogY21wb2JsZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmxlX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMRVVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBvYmctcmVnOiBjbXBvYmcgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JnX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG9iZy1saXQ6IGNtcG9iZyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmdfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdUVVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG9iZ2UtcmVnOiBjbXBvYmdlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9iZ2VfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdFVVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21wb2JnZS1saXQ6IGNtcG9iZ2UgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JnZV9saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX2xpdC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR0VVU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJlLXJlZzogY21waWJlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGliZV9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGliZS1saXQ6IGNtcGliZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmVfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEVRU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJuZS1yZWc6IGNtcGlibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJuZV9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGlibmUtbGl0OiBjbXBpYm5lICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGlibmVfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJsLXJlZzogY21waWJsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGlibF9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTFRTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGlibC1saXQ6IGNtcGlibCAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmxfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKExUU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJsZS1yZWc6IGNtcGlibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJsZV9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTEVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGlibGUtbGl0OiBjbXBpYmxlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGlibGVfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKExFU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJnLXJlZzogY21waWJnICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGliZ19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR1RTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGliZy1saXQ6IGNtcGliZyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmdfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdUU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21waWJnZS1yZWc6IGNtcGliZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJnZV9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR0VTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGliZ2UtbGl0OiBjbXBpYmdlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGliZ2VfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEdFU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmJjLXJlZzogYmJjICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJiY19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY21wb2JlX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoQU5EU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9icl9zcmMxKSksICogRkxEIChpX2JyX3NyYzIpKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiYmMtbGl0OiBiYmMgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmJjX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfbGl0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJIChBTkRTSSAoU0xMU0kgKDEsIEZMRCAoZl9icl9zcmMxKSksICogRkxEIChpX2JyX3NyYzIpKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiYnMtcmVnOiBiYnMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmJzX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jbXBvYmVfcmVnLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJIChBTkRTSSAoU0xMU0kgKDEsICogRkxEIChpX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJicy1saXQ6IGJicyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxiYnNfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NtcG9iZV9saXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChTTExTSSAoMSwgRkxEIChmX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcGk6IGNtcGkgJHNyYzEsICRzcmMyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChMVFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICg0KSA6IChFUVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBpMTogY21waSAkbGl0MSwgJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGkxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBpMjogY21waSAkc3JjMSwgJGxpdDIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGkyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwyLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBpMzogY21waSAkbGl0MSwgJGxpdDIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGkzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICg0KSA6IChFUVNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDIpIDogKDEpOwotICAgIENQVSAoaF9jYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG86IGNtcG8gJHNyYzEsICRzcmMyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChMVFVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoMikgOiAoMSk7Ci0gICAgQ1BVIChoX2NjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY21wbzE6IGNtcG8gJGxpdDEsICRzcmMyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKExUVVNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDIpIDogKDEpOwotICAgIENQVSAoaF9jYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcG8yOiBjbXBvICRzcmMxLCAkbGl0MiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wbzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfZW11bDIuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChMVFVTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBvMzogY21wbyAkbGl0MSwgJGxpdDIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG8zKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2VtdWwzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoTFRVU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKLSAgICBDUFUgKGhfY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB0ZXN0bm8tcmVnOiB0ZXN0bm8gJGJyX3NyYzEgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHRlc3Rub19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdGVzdG5vX3JlZy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRVFTSSAoQ1BVIChoX2NjKSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdGctcmVnOiB0ZXN0ZyAkYnJfc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGdfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAxKSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdGUtcmVnOiB0ZXN0ZSAkYnJfc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAyKSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdGdlLXJlZzogdGVzdGdlICRicl9zcmMxICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0Z2VfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAzKSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdGwtcmVnOiB0ZXN0bCAkYnJfc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGxfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA0KSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdG5lLXJlZzogdGVzdG5lICRicl9zcmMxICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0bmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA1KSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdGxlLXJlZzogdGVzdGxlICRicl9zcmMxICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0bGVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA2KSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdGVzdG8tcmVnOiB0ZXN0byAkYnJfc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdG9fcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3Rlc3Rub19yZWcuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA3KSwgMCk7Ci0gICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYm5vOiBibm8gJGN0cmxfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYm5vKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2Juby5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoQ1BVIChoX2NjKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJnOiBiZyAkY3RybF9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxiZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAxKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJlOiBiZSAkY3RybF9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxiZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJnZTogYmdlICRjdHJsX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJnZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAzKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsOiBibCAkY3RybF9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxibCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA0KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJuZTogYm5lICRjdHJsX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJuZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA1KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsZTogYmxlICRjdHJsX2Rpc3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJsZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA2KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJvOiBibyAkY3RybF9kaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxibykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA3KSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGI6IGIgJGN0cmxfZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibm8uZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2N0cmxfZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYngtaW5kaXJlY3Qtb2Zmc2V0OiBieCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJ4X2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJ4LWluZGlyZWN0OiBieCAoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBieC1pbmRpcmVjdC1pbmRleDogYnggKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxieF9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJ4LWRpc3A6IGJ4ICRvcHRkaXNwICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxieF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoZl9vcHRkaXNwKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBieC1pbmRpcmVjdC1kaXNwOiBieCAkb3B0ZGlzcCgkYWJhc2UpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxieF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjYWxseC1kaXNwOiBjYWxseCAkb3B0ZGlzcCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2FsbHhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9kaXNwLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIHRtcF90ZW1wID0gQU5EU0kgKEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxKV0pLCA2MyksIElOVlNJICg2MykpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDgpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOwotICB9Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApLCBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNCksIENQVSAoaF9nclsoKFVJTlQpIDEpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSwgQ1BVIChoX2dyWygoVUlOVCkgMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSwgQ1BVIChoX2dyWygoVUlOVCkgMyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDE2KSwgQ1BVIChoX2dyWygoVUlOVCkgNCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSwgQ1BVIChoX2dyWygoVUlOVCkgNSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSwgQ1BVIChoX2dyWygoVUlOVCkgNildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI4KSwgQ1BVIChoX2dyWygoVUlOVCkgNyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSwgQ1BVIChoX2dyWygoVUlOVCkgOCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSwgQ1BVIChoX2dyWygoVUlOVCkgOSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCksIENQVSAoaF9nclsoKFVJTlQpIDExKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NiksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNjApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNhbGx4LWluZGlyZWN0OiBjYWxseCAoJGFiYXNlKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2FsbHhfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdG1wX3RlbXA7Ci0gIHRtcF90ZW1wID0gQU5EU0kgKEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxKV0pLCA2MyksIElOVlNJICg2MykpOwotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOwotICB9Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApLCBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNCksIENQVSAoaF9nclsoKFVJTlQpIDEpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSwgQ1BVIChoX2dyWygoVUlOVCkgMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSwgQ1BVIChoX2dyWygoVUlOVCkgMyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDE2KSwgQ1BVIChoX2dyWygoVUlOVCkgNCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSwgQ1BVIChoX2dyWygoVUlOVCkgNSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSwgQ1BVIChoX2dyWygoVUlOVCkgNildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI4KSwgQ1BVIChoX2dyWygoVUlOVCkgNyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSwgQ1BVIChoX2dyWygoVUlOVCkgOCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSwgQ1BVIChoX2dyWygoVUlOVCkgOSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCksIENQVSAoaF9nclsoKFVJTlQpIDExKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NiksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNjApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci1DUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDQpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDcpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEwKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDExKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gMHhkZWFkYmVlZjsKLSAgewotICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMzEpXSk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0wIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX3RlbXA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMzEpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMzEiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAodG1wX3RlbXAsIDY0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2FsbHgtaW5kaXJlY3Qtb2Zmc2V0OiBjYWxseCAkb2Zmc2V0KCRhYmFzZSkgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNhbGx4X2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9jYWxseF9pbmRpcmVjdF9vZmZzZXQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0bXBfdGVtcDsKLSAgdG1wX3RlbXAgPSBBTkRTSSAoQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEpXSksIDYzKSwgSU5WU0kgKDYzKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMCksIENQVSAoaF9nclsoKFVJTlQpIDApXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSwgQ1BVIChoX2dyWygoVUlOVCkgMSldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpLCBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjApLCBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjQpLCBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpLCBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzIpLCBDUFUgKGhfZ3JbKChVSU5UKSA4KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzYpLCBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDApLCBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ0KSwgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCksIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pKTsKLVNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7Ci1TRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDU2KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpOwotU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKLSAgewotICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLUNQVSAoaF9nclsoKFVJTlQpIDApXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDMpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA1KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDYpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IDB4ZGVhZGJlZWY7Ci1DUFUgKGhfZ3JbKChVSU5UKSA4KV0pID0gMHhkZWFkYmVlZjsKLUNQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSAweGRlYWRiZWVmOwotQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSAweGRlYWRiZWVmOwotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTAiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSB0bXBfdGVtcDsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICh0bXBfdGVtcCwgNjQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiByZXQ6IHJldCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAoaTk2MGJhc2UscmV0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2NhbGx4X2Rpc3AuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLUNQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApKTsKLUNQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDgpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDMpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxNikpOwotQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjApKTsKLUNQVSAoaF9nclsoKFVJTlQpIDYpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyOCkpOwotQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzIpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDApKTsKLUNQVSAoaF9nclsoKFVJTlQpIDExKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCkpOwotQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ4KSk7Ci1DUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTIpKTsKLUNQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NikpOwotQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDYwKSk7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogY2FsbHM6IGNhbGxzICRzcmMxICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChpOTYwYmFzZSxjYWxscykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9lbXVsMi5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IGk5NjBfdHJhcCAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMxKSk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBmbWFyazogZm1hcmsgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGZtYXJrKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBpOTYwX2JyZWFrcG9pbnQgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBmbHVzaHJlZzogZmx1c2hyZWcgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGZsdXNocmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0oKHZvaWQpIDApOyAvKm5vcCovCi0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogVGFibGUgb2YgYWxsIHNlbWFudGljIGZucy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VtX2ZuX2Rlc2Mgc2VtX2Zuc1tdID0gewotICB7IEk5NjBCQVNFX0lOU05fWF9JTlZBTElELCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UseF9pbnZhbGlkKSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfYWZ0ZXIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YX0JFRk9SRSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfYmVmb3JlKSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9DVElfQ0hBSU4sIFNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2N0aV9jaGFpbikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sIFNFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2NoYWluKSB9LAotICB7IEk5NjBCQVNFX0lOU05fWF9CRUdJTiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfYmVnaW4pIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NVUxPLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01VTE8xLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbzEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NVUxPMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG11bG8yKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTVVMTzMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxtdWxvMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTU8sIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1vKSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNTzEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1vMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTU8yLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbzIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1PMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJlbW8zKSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWTywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdm8pIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZPMSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdm8xKSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWTzIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZvMikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVk8zLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bzMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1JLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtaSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFTUkxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtaTEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9SRU1JMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJlbWkyKSB9LAotICB7IEk5NjBCQVNFX0lOU05fUkVNSTMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVkksIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpKSB9LAotICB7IEk5NjBCQVNFX0lOU05fRElWSTEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0RJVkkyLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2aTIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9ESVZJMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdmkzKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQURETywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFkZG8pIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BRERPMSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFkZG8xKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQURETzIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvMikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FERE8zLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYWRkbzMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVUJPLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3VibykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NVQk8xLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3VibzEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVUJPMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN1Ym8yKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1VCTzMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGJpdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RiaXQxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGJpdDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90Yml0MykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxhbmQxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5EMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkQzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZG5vdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxhbmRub3QxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZG5vdDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kbm90MykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzZXRiaXQxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNldGJpdDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2V0Yml0MykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEFORCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGFuZCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RhbmQxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGFuZDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90YW5kMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hPUiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhvcikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hPUjEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE9SMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhvcjIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YT1IzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UseG9yMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09SLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usb3IpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcjEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcjIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUjMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcjMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1IsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1IxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm9yMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PUjIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IyKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9SMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vcjMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YTk9SLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UseG5vcikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1hOT1IxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UseG5vcjEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9YTk9SMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhub3IyKSB9LAotICB7IEk5NjBCQVNFX0lOU05fWE5PUjMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSx4bm9yMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX05PVDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxub3QxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTk9UMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9OT1QzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90MykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX09STk9ULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usb3Jub3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcm5vdDEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcm5vdDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9PUk5PVDMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxvcm5vdDMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbHJiaXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2xyYml0MSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbHJiaXQyKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNscmJpdDMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExPLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsbykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITE8xLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsbzEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExPMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobG8yKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMTzMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxvMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUk8sIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSTzEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUk8yLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hybzIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJPMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocm8zKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMSSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobGkpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSExJMSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobGkxKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hMSTIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxpMikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NITEkzLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsaTMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJJLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hyaSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NIUkkxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hyaTEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TSFJJMiwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocmkyKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU0hSSTMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJpMykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0VNVUwsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsKSB9LAotICB7IEk5NjBCQVNFX0lOU05fRU1VTDEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0VNVUwyLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsZW11bDIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9FTVVMMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGVtdWwzKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9WMSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdjEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZMLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92bCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVkwxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92bDEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92dCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlQxLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92dDEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT1ZRLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92cSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX01PVlExLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92cTEpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9NT0RQQywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vZHBjKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTU9EQUMsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxtb2RhYykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9pbmRpcmVjdF9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9pbmRpcmVjdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9pbmRpcmVjdF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdF9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRsX2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0X2luZGV4KSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkcV9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X2luZGV4KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdF9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2Jfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3Nfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3Rfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0X2luZGV4KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9PRkZTRVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfb2Zmc2V0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3RfaW5kZXgpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3R0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9vZmZzZXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdF9pbmRleCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fU1RRX0lOREVYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kZXhfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkVfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CRV9MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmVfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYm5lX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JuZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JsX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmxfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmxlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTEVfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JsZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JnX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR19MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmdfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHRV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmdlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JnZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkVfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCRV9MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmVfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYm5lX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTkVfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJuZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJsX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmxfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmxlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTEVfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJsZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJnX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR19MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmdfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHRV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmdlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJnZV9saXQpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CQkNfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmJjX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JCQ19MSVQsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxiYmNfbGl0KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkJTX1JFRywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJic19yZWcpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CQlNfTElULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmJzX2xpdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUEksIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QSTEsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpMSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUEkyLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waTIpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBJMywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGkzKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QTywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG8pIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9DTVBPMSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG8xKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ01QTzIsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvMikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NNUE8zLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wbzMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTk9fUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdG5vX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RHX1JFRywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHRlc3RnX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RFX1JFRywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHRlc3RlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RHRV9SRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0Z2VfcmVnKSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVExfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGxfcmVnKSB9LAotICB7IEk5NjBCQVNFX0lOU05fVEVTVE5FX1JFRywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHRlc3RuZV9yZWcpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9URVNUTEVfUkVHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGxlX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1RFU1RPX1JFRywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHRlc3RvX3JlZykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JOTywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJubykgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JHLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmcpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CRSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJlKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkdFLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmdlKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQkwsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxibCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JORSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJuZSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JMRSwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJsZSkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JPLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYm8pIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYikgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJ4X2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNULCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfaW5kaXJlY3QpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJ4X2luZGlyZWN0X2luZGV4KSB9LAotICB7IEk5NjBCQVNFX0lOU05fQlhfRElTUCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJ4X2Rpc3ApIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9ESVNQLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfaW5kaXJlY3RfZGlzcCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0RJU1AsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjYWxseF9kaXNwKSB9LAotICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1QsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxjYWxseF9pbmRpcmVjdCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNhbGx4X2luZGlyZWN0X29mZnNldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX1JFVCwgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJldCkgfSwKLSAgeyBJOTYwQkFTRV9JTlNOX0NBTExTLCBTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2FsbHMpIH0sCi0gIHsgSTk2MEJBU0VfSU5TTl9GTUFSSywgU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGZtYXJrKSB9LAotICB7IEk5NjBCQVNFX0lOU05fRkxVU0hSRUcsIFNFTV9GTl9OQU1FIChpOTYwYmFzZSxmbHVzaHJlZykgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLS8qIEFkZCB0aGUgc2VtYW50aWMgZm5zIHRvIElERVNDX1RBQkxFLiAgKi8KLQotdm9pZAotU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGluaXRfaWRlc2NfdGFibGUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgSURFU0MgKmlkZXNjX3RhYmxlID0gQ1BVX0lERVNDIChjdXJyZW50X2NwdSk7Ci0gIGNvbnN0IHN0cnVjdCBzZW1fZm5fZGVzYyAqc2Y7Ci0gIGludCBtYWNoX251bSA9IE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKTsKLQotICBmb3IgKHNmID0gJnNlbV9mbnNbMF07IHNmLT5mbiAhPSAwOyArK3NmKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlkZXNjX3RhYmxlW3NmLT5pbmRleF0uaWRhdGE7Ci0gICAgICBpbnQgdmFsaWRfcCA9IChDR0VOX0lOU05fVklSVFVBTF9QIChpbnNuKQotCQkgICAgIHx8IENHRU5fSU5TTl9NQUNIX0hBU19QIChpbnNuLCBtYWNoX251bSkpOwotI2lmIEZBU1RfUAotICAgICAgaWYgKHZhbGlkX3ApCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZmFzdCA9IHNmLT5mbjsKLSAgICAgIGVsc2UKLQlpZGVzY190YWJsZVtzZi0+aW5kZXhdLnNlbV9mYXN0ID0gU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfaW52YWxpZCk7Ci0jZWxzZQotICAgICAgaWYgKHZhbGlkX3ApCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZnVsbCA9IHNmLT5mbjsKLSAgICAgIGVsc2UKLQlpZGVzY190YWJsZVtzZi0+aW5kZXhdLnNlbV9mdWxsID0gU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfaW52YWxpZCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3NpbS1pZi5jIGIvc2ltL2k5NjAvc2ltLWlmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzk3MzkuLjAwMDAwMDAKLS0tIGEvc2ltL2k5NjAvc2ltLWlmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyogTWFpbiBzaW11bGF0b3IgZW50cnkgcG9pbnRzIGZvciB0aGUgaTk2MC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljIHZvaWQgZnJlZV9zdGF0ZSAoU0lNX0RFU0MpOwotCi0vKiBTaW5jZSB3ZSBkb24ndCBidWlsZCB0aGUgY2dlbi1vcGNvZGUgdGFibGUsIHdlIHVzZSB0aGUgb2xkCi0gICBkaXNhc3NlbWJsZXIuICAqLwotc3RhdGljIENHRU5fRElTQVNTRU1CTEVSIGk5NjBfZGlzYXNzZW1ibGVfaW5zbjsKLQotLyogUmVjb3JkcyBzaW11bGF0b3IgZGVzY3JpcHRvciBzbyB1dGlsaXRpZXMgbGlrZSBpOTYwX2R1bXBfcmVncyBjYW4gYmUKLSAgIGNhbGxlZCBmcm9tIGdkYi4gICovCi1TSU1fREVTQyBjdXJyZW50X3N0YXRlOwotDAotLyogQ292ZXIgZnVuY3Rpb24gb2Ygc2ltX3N0YXRlX2ZyZWUgdG8gZnJlZSB0aGUgY3B1IGJ1ZmZlcnMgYXMgd2VsbC4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3N0YXRlIChTSU1fREVTQyBzZCkKLXsKLSAgaWYgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKQotICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gIHNpbV9jcHVfZnJlZV9hbGwgKHNkKTsKLSAgc2ltX3N0YXRlX2ZyZWUgKHNkKTsKLX0KLQotLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzaW11bGF0b3IuICAqLwotCi1TSU1fREVTQwotc2ltX29wZW4gKGtpbmQsIGNhbGxiYWNrLCBhYmZkLCBhcmd2KQotICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7Ci0gICAgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgYzsKLSAgaW50IGk7Ci0gIFNJTV9ERVNDIHNkID0gc2ltX3N0YXRlX2FsbG9jIChraW5kLCBjYWxsYmFjayk7Ci0KLSAgLyogVGhlIGNwdSBkYXRhIGlzIGtlcHQgaW4gYSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBjaHVuayBvZiBtZW1vcnkuICAqLwotICBpZiAoc2ltX2NwdV9hbGxvY19hbGwgKHNkLCAxLCBjZ2VuX2NwdV9tYXhfZXh0cmFfYnl0ZXMgKCkpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZiAwIC8qIEZJWE1FOiBwYyBpcyBpbiBtYWNoLXNwZWNpZmljIHN0cnVjdCAqLwotICAvKiBGSVhNRTogd2F0Y2hwb2ludHMgY29kZSBzaG91bGRuJ3QgbmVlZCB0aGlzICovCi0gIHsKLSAgICBTSU1fQ1BVICpjdXJyZW50X2NwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotICAgIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjID0gJihQQyk7Ci0gICAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+c2l6ZW9mX3BjID0gc2l6ZW9mIChQQyk7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChzaW1fcHJlX2FyZ3ZfaW5pdCAoc2QsIGFyZ3ZbMF0pICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZiAwIC8qIEZJWE1FOiAndHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZG8gdGhpcyAqLwotICAvKiBUaGVzZSBvcHRpb25zIG92ZXJyaWRlIGFueSBtb2R1bGUgb3B0aW9ucy4KLSAgICAgT2J2aW91c2x5IGFtYmlndWl0eSBzaG91bGQgYmUgYXZvaWRlZCwgaG93ZXZlciB0aGUgY2FsbGVyIG1heSB3aXNoIHRvCi0gICAgIGF1Z21lbnQgdGhlIG1lYW5pbmcgb2YgYW4gb3B0aW9uLiAgKi8KLSAgaWYgKGV4dHJhX29wdGlvbnMgIT0gTlVMTCkKLSAgICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIGV4dHJhX29wdGlvbnMpOwotI2VuZGlmCi0KLSAgLyogZ2V0b3B0IHdpbGwgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2Ugc28gd2UganVzdCBoYXZlIHRvIGV4aXQgaWYgdGhpcyBmYWlscy4KLSAgICAgRklYTUU6IEhtbW0uLi4gIGluIHRoZSBjYXNlIG9mIGdkYiB3ZSBuZWVkIGdldG9wdCB0byBjYWxsCi0gICAgIHByaW50X2ZpbHRlcmVkLiAgKi8KLSAgaWYgKHNpbV9wYXJzZV9hcmdzIChzZCwgYXJndikgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgb3RoZXIgZGV2aWNlcwotICAgICBpZiBubyBtZW1vcnkgZm9yIHRoYXQgcmFuZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotICAgICBBbGwgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgdG8ga2VlcCB0aGluZ3MgZnJvbSBiZWluZwotICAgICB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgKi8KLSAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCBJOTYwX0RFVklDRV9BRERSLCAxKSA9PSAwKQotICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCi0JCSAgICAgMCAvKmxldmVsKi8sCi0JCSAgICAgYWNjZXNzX3JlYWRfd3JpdGUsCi0JCSAgICAgMCAvKnNwYWNlID8/PyovLAotCQkgICAgIEk5NjBfREVWSUNFX0FERFIsIEk5NjBfREVWSUNFX0xFTiAvKm5yX2J5dGVzKi8sCi0JCSAgICAgMCAvKm1vZHVsbyovLAotCQkgICAgICZpOTYwX2RldmljZXMsCi0JCSAgICAgTlVMTCAvKmJ1ZmZlciovKTsKLQotICAvKiBBbGxvY2F0ZSBjb3JlIG1hbmFnZWQgbWVtb3J5IGlmIG5vbmUgc3BlY2lmaWVkIGJ5IHVzZXIuCi0gICAgIFVzZSBhZGRyZXNzIDQgaGVyZSBpbiBjYXNlIHRoZSB1c2VyIHdhbnRlZCBhZGRyZXNzIDAgdW5tYXBwZWQuICAqLwotICBpZiAoc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCByZWFkX21hcCwgJmMsIDQsIDEpID09IDApCi0gICAgLyogPz8/IHdpbHNvbiAqLwotICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4JWx4LDB4JWx4IiwgSTk2MF9ERUZBVUxUX01FTV9TVEFSVCwKLQkJICAgICBJOTYwX0RFRkFVTFRfTUVNX1NJWkUpOwotCi0gIC8qIGNoZWNrIGZvci9lc3RhYmxpc2ggdGhlIHJlZmVyZW5jZSBwcm9ncmFtIGltYWdlICovCi0gIGlmIChzaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwKLQkJCSAgIChTVEFURV9QUk9HX0FSR1YgKHNkKSAhPSBOVUxMCi0JCQkgICAgPyAqU1RBVEVfUFJPR19BUkdWIChzZCkKLQkJCSAgICA6IE5VTEwpLAotCQkJICAgYWJmZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBFc3RhYmxpc2ggYW55IHJlbWFpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMuICAqLwotICBpZiAoc2ltX2NvbmZpZyAoc2QpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNpbV9wb3N0X2FyZ3ZfaW5pdCAoc2QpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogT3BlbiBhIGNvcHkgb2YgdGhlIGNwdSBkZXNjcmlwdG9yIHRhYmxlLiAgKi8KLSAgewotICAgIENHRU5fQ1BVX0RFU0MgY2QgPSBpOTYwX2NnZW5fY3B1X29wZW5fMSAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPnByaW50YWJsZV9uYW1lLAotCQkJCQkgICAgIENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCi0gICAgICB7Ci0JU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgaSk7Ci0JQ1BVX0NQVV9ERVNDIChjcHUpID0gY2Q7Ci0JQ1BVX0RJU0FTU0VNQkxFUiAoY3B1KSA9IGk5NjBfZGlzYXNzZW1ibGVfaW5zbjsKLSAgICAgIH0KLSAgfQotCi0gIC8qIEluaXRpYWxpemUgdmFyaW91cyBjZ2VuIHRoaW5ncyBub3QgZG9uZSBieSBjb21tb24gZnJhbWV3b3JrLgotICAgICBNdXN0IGJlIGRvbmUgYWZ0ZXIgaTk2MF9jZ2VuX2NwdV9vcGVuLiAgKi8KLSAgY2dlbl9pbml0IChzZCk7Ci0KLSAgLyogU3RvcmUgaW4gYSBnbG9iYWwgc28gdGhpbmdzIGxpa2UgaTk2MF9kdW1wX3JlZ3MgY2FuIGJlIGludm9rZWQKLSAgICAgZnJvbSB0aGUgZ2RiIGNvbW1hbmQgbGluZS4gICovCi0gIGN1cnJlbnRfc3RhdGUgPSBzZDsKLQotICByZXR1cm4gc2Q7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHF1aXR0aW5nOwotewotICBpOTYwX2NnZW5fY3B1X2Nsb3NlIChDUFVfQ1BVX0RFU0MgKFNUQVRFX0NQVSAoc2QsIDApKSk7Ci0gIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci19Ci0MCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnZwKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52cDsKLXsKLSAgU0lNX0NQVSAqY3VycmVudF9jcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLSAgU0lNX0FERFIgYWRkcjsKLQotICBpZiAoYWJmZCAhPSBOVUxMKQotICAgIGFkZHIgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBlbHNlCi0gICAgYWRkciA9IDA7Ci0gIHNpbV9wY19zZXQgKGN1cnJlbnRfY3B1LCBhZGRyKTsKLQotI2lmIDAKLSAgU1RBVEVfQVJHViAoc2QpID0gc2ltX2NvcHlfYXJndiAoYXJndik7Ci0gIFNUQVRFX0VOVlAgKHNkKSA9IHNpbV9jb3B5X2FyZ3YgKGVudnApOwotI2VuZGlmCi0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotI2lmIDAKLWludAotc2ltX3N0b3AgKFNJTV9ERVNDIHNkKQotewotICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2EgOgotICAgICAgcmV0dXJuIGk5NjBiYXNlX2VuZ2luZV9zdG9wIChzZCwgTlVMTCwgTlVMTF9DSUEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHSU5UKTsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogVGhpcyBpc24ndCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBpbnRlcmZhY2UuCi0gICBUaGlzIGlzIGp1c3QgYSBnb29kIHBsYWNlIHRvIHB1dCB0aGlzIGZvciBub3cuICAqLwotCi12b2lkCi1zaW1fc3luY19zdG9wIChTSU1fREVTQyBzZCwgU0lNX0NQVSAqY3B1LCBQQ0FERFIgcGMsIGVudW0gc2ltX3N0b3AgcmVhc29uLCBpbnQgc2lncmMpCi17Ci0gIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6Ci0gICAgICAodm9pZCkgaTk2MGJhc2VfZW5naW5lX3N0b3AgKHNkLCBjcHUsIHBjLCByZWFzb24sIHNpZ3JjKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1zaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBzdGVwLCBzaWdnbmFsOwotewotICBzaW1fbW9kdWxlX3Jlc3VtZSAoc2QpOwotCi0gIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6Ci0gICAgICBpOTYwYmFzZV9lbmdpbmVfcnVuIChzZCwgc3RlcCwgc2lnZ25hbCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBzaW1fbW9kdWxlX3N1c3BlbmQgKHNkKTsKLX0KLSNlbmRpZgotCi0vKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIGJ1ZiwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOwotCi0gIHJldHVybiAoKiBDUFVfUkVHX0ZFVENIIChjcHUpKSAoY3B1LCBybiwgYnVmLCBsZW5ndGgpOwotfQotIAotLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLwotCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoc2QsIHJuLCBidWYsIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLQotICByZXR1cm4gKCogQ1BVX1JFR19TVE9SRSAoY3B1KSkgKGNwdSwgcm4sIGJ1ZiwgbGVuZ3RoKTsKLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17IAotICBpZiAoc2ltX2FyZ3NfY29tbWFuZCAoc2QsIGNtZCkgIT0gU0lNX1JDX09LKQotICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gY29tbWFuZCBgJXMnXG4iLCBjbWQpOwotfQotDAotLyogRGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaTk2MF9kaXNhc3NlbWJsZV9pbnNuIChTSU1fQ1BVICpjcHUsIGNvbnN0IENHRU5fSU5TTiAqaW5zbiwKLQkJICAgICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiwgSUFERFIgcGMsIGNoYXIgKmJ1ZikKLXsKLSAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87Ci0gIFNGSUxFIHNmaWxlOwotICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKLSAgaW50IGluc25fbGVuZ3RoID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pIC8gODsKLQotICBzZmlsZS5idWZmZXIgPSBzZmlsZS5jdXJyZW50ID0gYnVmOwotICBJTklUX0RJU0FTU0VNQkxFX0lORk8gKGRpc2FzbV9pbmZvLCAoRklMRSAqKSAmc2ZpbGUsCi0JCQkgKGZwcmludGZfZnR5cGUpIHNpbV9kaXNhc21fc3ByaW50Zik7Ci0gIGRpc2FzbV9pbmZvLmVuZGlhbiA9Ci0gICAgKGJmZF9iaWdfZW5kaWFuIChTVEFURV9QUk9HX0JGRCAoc2QpKSA/IEJGRF9FTkRJQU5fQklHCi0gICAgIDogYmZkX2xpdHRsZV9lbmRpYW4gKFNUQVRFX1BST0dfQkZEIChzZCkpID8gQkZEX0VORElBTl9MSVRUTEUKLSAgICAgOiBCRkRfRU5ESUFOX1VOS05PV04pOwotICBkaXNhc21faW5mby5yZWFkX21lbW9yeV9mdW5jID0gc2ltX2Rpc2FzbV9yZWFkX21lbW9yeTsKLSAgZGlzYXNtX2luZm8ubWVtb3J5X2Vycm9yX2Z1bmMgPSBzaW1fZGlzYXNtX3BlcnJvcl9tZW1vcnk7Ci0gIGRpc2FzbV9pbmZvLmFwcGxpY2F0aW9uX2RhdGEgPSAoUFRSKSBjcHU7Ci0KLSAgcHJpbnRfaW5zbl9pOTYwIChwYywgJmRpc2FzbV9pbmZvKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3NpbS1tYWluLmggYi9zaW0vaTk2MC9zaW0tbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFjNWZjLi4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL3NpbS1tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmb3IgdGhlIGk5NjAuICAqLwotCi0jZGVmaW5lIFVTSU5HX1NJTV9CQVNFX0ggLyogRklYTUU6IHF1aWNrIGhhY2sgKi8KLQotc3RydWN0IF9zaW1fY3B1OyAvKiBGSVhNRTogc2hvdWxkIGJlIGluIHNpbS1iYXNpY3MuaCAqLwotdHlwZWRlZiBzdHJ1Y3QgX3NpbV9jcHUgU0lNX0NQVTsKLQotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJjZ2VuLXR5cGVzLmgiCi0jaW5jbHVkZSAiaTk2MC1kZXNjLmgiCi0jaW5jbHVkZSAiaTk2MC1vcGMuaCIKLSNpbmNsdWRlICJhcmNoLmgiCi0KLS8qIFRoZXNlIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgc2ltLWJhc2UuaC4gICovCi10eXBlZGVmIFVTSSBzaW1fY2lhOwotI2RlZmluZSBDSUFfR0VUKGNwdSkgICAgIDAgLyogRklYTUU6KENQVV9DR0VOX0hXIChjcHUpLT5oX3BjKSAqLwotI2RlZmluZSBDSUFfU0VUKGNwdSx2YWwpIDAgLyogRklYTUU6KENQVV9DR0VOX0hXIChjcHUpLT5oX3BjID0gKHZhbCkpICovCi0KLS8qIEZJWE1FOiBTaG91bGRuJ3QgYmUgcmVxdWlyZWQgdG8gZGVmaW5lIHRoZXNlIHRoaXMgZWFybHkuICAqLwotI2RlZmluZSBTSU1fRU5HSU5FX0hBTFRfSE9PSyhTRCwgTEFTVF9DUFUsIENJQSkKLSNkZWZpbmUgU0lNX0VOR0lORV9SRVNUQVJUX0hPT0soU0QsIExBU1RfQ1BVLCBDSUEpCi0KLSNpbmNsdWRlICJzaW0tYmFzZS5oIgotI2luY2x1ZGUgImNnZW4tc2ltLmgiCi0jaW5jbHVkZSAiaTk2MC1zaW0uaCIKLQwKLS8qIFRoZSBfc2ltX2NwdSBzdHJ1Y3QuICAqLwotCi1zdHJ1Y3QgX3NpbV9jcHUgewotICBzaW1fY3B1X2Jhc2UgYmFzZTsKLQotICAvKiBTdGF0aWMgcGFydHMgb2YgY2dlbi4gICovCi0gIENHRU5fQ1BVIGNnZW5fY3B1OwotCi0gIC8qIENQVSBzcGVjaWZpYyBwYXJ0cyBnbyBoZXJlLgotICAgICBOb3RlIHRoYXQgaW4gZmlsZXMgdGhhdCBkb24ndCBuZWVkIHRvIGFjY2VzcyB0aGVzZSBwaWVjZXMgV0FOVF9DUFVfRk9PCi0gICAgIHdvbid0IGJlIGRlZmluZWQgYW5kIHRodXMgdGhlc2UgcGFydHMgd29uJ3QgYXBwZWFyLiAgVGhpcyBpcyBvay4KLSAgICAgT25lIGhhcyB0byBvZiBjb3Vyc2UgYmUgY2FyZWZ1bCB0byBub3QgdGFrZSB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgIHN0cnVjdCBhbmQgbm8gc3RydWN0dXJlIG1lbWJlcnMgYWNjZXNzZWQgaW4gbm9uLWNwdSBzcGVjaWZpYyBmaWxlcyBjYW4KLSAgICAgZ28gYWZ0ZXIgaGVyZS4gICovCi0jaWYgZGVmaW5lZCAoV0FOVF9DUFVfSTk2MEJBU0UpCi0gIEk5NjBCQVNFX0NQVV9EQVRBIGNwdV9kYXRhOwotI2VuZGlmCi19OwotDAotLyogVGhlIHNpbV9zdGF0ZSBzdHJ1Y3QuICAqLwotCi1zdHJ1Y3Qgc2ltX3N0YXRlIHsKLSAgc2ltX2NwdSAqY3B1OwotI2RlZmluZSBTVEFURV9DUFUoc2QsIG4pICgvKiYqLyAoc2QpLT5jcHUpCi0KLSAgQ0dFTl9TVEFURSBjZ2VuX3N0YXRlOwotCi0gIHNpbV9zdGF0ZV9iYXNlIGJhc2U7Ci19OwotDAotLyogTWlzYy4gICovCi0KLS8qIENhdGNoIGFkZHJlc3MgZXhjZXB0aW9ucy4gICovCi1leHRlcm4gU0lNX0NPUkVfU0lHTkFMX0ZOIGk5NjBfY29yZV9zaWduYWw7Ci0jZGVmaW5lIFNJTV9DT1JFX1NJR05BTChTRCxDUFUsQ0lBLE1BUCxOUl9CWVRFUyxBRERSLFRSQU5TRkVSLEVSUk9SKSBcCi1pOTYwX2NvcmVfc2lnbmFsICgoU0QpLCAoQ1BVKSwgKENJQSksIChNQVApLCAoTlJfQllURVMpLCAoQUREUiksIFwKLQkJICAoVFJBTlNGRVIpLCAoRVJST1IpKQotCi0vKiBEZWZhdWx0IG1lbW9yeSBzaXplLiAgKi8KLS8qIFRoaXMgdmFsdWUgY29tZXMgZnJvbSB0aGUgbGliZ2xvc3MvaTk2MC9tb245NjAubGQgbGlua2VyIHNjcmlwdC4gICovCi0jZGVmaW5lIEk5NjBfREVGQVVMVF9NRU1fU1RBUlQgMHhhMDAwODAwMAotI2RlZmluZSBJOTYwX0RFRkFVTFRfTUVNX1NJWkUgMHg4MDAwMDAgLyogOE0gKi8KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3Rjb25maWcuaW4gYi9zaW0vaTk2MC90Y29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNmNDU2Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL3Rjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBJOTYwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAtKi0gQyAtKi0gKi8KLQotLyogU2VlIHNpbS1obG9hZC5jLiAgV2UgcHJvcGVybHkgaGFuZGxlIExNQS4gICovCi0jZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCi0KLS8qIEZvciBNU1BSIHN1cHBvcnQuICBGSVhNRTogcmV2aXNpdC4gICovCi0jZGVmaW5lIFdJVEhfREVWSUNFUyAxCi0KLS8qIEZJWE1FOiBSZXZpc2l0LiAgKi8KLSNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKLU1PRFVMRV9JTlNUQUxMX0ZOIGR2X3NvY2tzZXJfaW5zdGFsbDsKLSNkZWZpbmUgTU9EVUxFX0xJU1QgZHZfc29ja3Nlcl9pbnN0YWxsLAotI2VuZGlmCi0KLSNpZiAwCi0vKiBFbmFibGUgd2F0Y2hwb2ludHMuICAqLwotI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKLSNlbmRpZgotCi0vKiA/Pz8gVGVtcG9yYXJ5IGhhY2sgdW50aWwgbW9kZWwgc3VwcG9ydCB1bmlmaWVkLiAgKi8KLSNkZWZpbmUgU0lNX0hBVkVfTU9ERUwKLQotLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRyaW5zaWMgYnJlYWtwb2ludCBtZWNoYW5pc20uICovCi0vKiBGSVhNRTogbWF5IGJlIGFibGUgdG8gcmVtb3ZlIFNJTV9IQVZFX0JSRUFLUE9JTlQgc2luY2UgaXQgZXNzZW50aWFsbHkKLSAgIGR1cGxpY2F0ZXMgaWZkZWYgU0lNX0JSRUFLUE9JTlQgKHJpZ2h0PykgKi8KLSNpZiAwCi0jZGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTCi0jZGVmaW5lIFNJTV9CUkVBS1BPSU5UIHsgMHgxMCwgMHhmMSB9Ci0jZGVmaW5lIFNJTV9CUkVBS1BPSU5UX1NJWkUgMgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZy4gIERpZmZlcmVudCBjcHUgZmFtaWxpZXMgY2FuJ3QgbWl4LW4tbWF0Y2ggLXNjYWNoZQotICAgYW5kIC1wYmIuICBIb3dldmVyIHNvbWUgY3B1IGZhbWlsaWVzIG1heSB1c2UgLXNpbXBsZSB3aGlsZSBvdGhlcnMgdXNlCi0gICBvbmUgb2YgLXNjYWNoZS8tcGJiLiAgKi8KLSNkZWZpbmUgV0lUSF9TQ0FDSEVfUEJCIDEKLQotI2lmIDAKLS8qID8/PyBUaGlzIHdhcyBvYnNvbGV0ZWQgYnkgdGhlIFBCQiBjb2RlLiAgKi8KLS8qIFRoZSBzZW1hbnRpYyBjb2RlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgdXNlIGEgc3dpdGNoKCkuCi0gICBIb3dldmVyLCBpbiBjYXNlIHRoYXQncyBub3QgcG9zc2libGUgaW4gc29tZSBjaXJjdW1zdGFuY2UsIHdlIGFsbG93Ci0gICB0aGUgdGFyZ2V0IHRvIGNob29zZS4gIFBlcmhhcHMgdGhpcyBjYW4gYmUgYXV0b2NvbmYnZCBvbiB3aGV0aGVyIHRoZQotICAgc3dpdGNoIGlzIHRvbyBiaWc/ICBJIGNhbid0ICh5ZXQpIHRoaW5rIG9mIGEgcmVhc29uIGZvciBhbGxvd2luZyB0aGUKLSAgIHVzZXIgdG8gY2hvb3NlLCB0aG91Z2ggdGhlIGRldmVsb3BlciBtYXkgY2VydGFpbmx5IHdpc2ggdG8uICAqLwotI2lmZGVmIFdBTlRfQ1BVX0k5NjBCQVNFCi0jZGVmaW5lIFdJVEhfRkFTVCAxCi0jZGVmaW5lIFdJVEhfU0VNX1NXSVRDSF9GVUxMIDAKLSNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3RyYXBzLmMgYi9zaW0vaTk2MC90cmFwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBmYzk1Li4wMDAwMDAwCi0tLSBhL3NpbS9pOTYwL3RyYXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyogaTk2MCBleGNlcHRpb24sIGludGVycnVwdCwgYW5kIHRyYXAgKEVJVCkgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKLQotLyogVGhlIHNlbWFudGljIGNvZGUgaW52b2tlcyB0aGlzIGZvciBpbGxlZ2FsICh1bnJlY29nbml6ZWQpIGluc3RydWN0aW9ucy4gICovCi0KLVNFTV9QQwotc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBjaWEsIFNFTV9QQyB2cGMpCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0KLSNpZiAwCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICBoX2JzbV9zZXQgKGN1cnJlbnRfY3B1LCBoX3NtX2dldCAoY3VycmVudF9jcHUpKTsKLSAgICAgIGhfYmllX3NldCAoY3VycmVudF9jcHUsIGhfaWVfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgaF9iY29uZF9zZXQgKGN1cnJlbnRfY3B1LCBoX2NvbmRfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KLSAgICAgIGhfaWVfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0gICAgICBoX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0KLSAgICAgIGhfYnBjX3NldCAoY3VycmVudF9jcHUsIGNpYSk7Ci0KLSAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAotCQkJICBFSVRfUlNWRF9JTlNOX0FERFIpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTEwpOwotICByZXR1cm4gdnBjOwotfQotCi0vKiBQcm9jZXNzIGFuIGFkZHJlc3MgZXhjZXB0aW9uLiAgKi8KLQotdm9pZAotaTk2MF9jb3JlX3NpZ25hbCAoU0lNX0RFU0Mgc2QsIFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBzaW1fY2lhIGNpYSwKLQkJICB1bnNpZ25lZCBpbnQgbWFwLCBpbnQgbnJfYnl0ZXMsIGFkZHJlc3Nfd29yZCBhZGRyLAotCQkgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsIHNpbV9jb3JlX3NpZ25hbHMgc2lnKQotewotI2lmIDAKLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQotICAgIHsKLSAgICAgIGhfYnNtX3NldCAoY3VycmVudF9jcHUsIGhfc21fZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgaF9iaWVfc2V0IChjdXJyZW50X2NwdSwgaF9pZV9nZXQgKGN1cnJlbnRfY3B1KSk7Ci0gICAgICBoX2Jjb25kX3NldCAoY3VycmVudF9jcHUsIGhfY29uZF9nZXQgKGN1cnJlbnRfY3B1KSk7Ci0gICAgICAvKiBzbSBub3QgY2hhbmdlZCAqLwotICAgICAgaF9pZV9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKLSAgICAgIGhfY29uZF9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKLQotICAgICAgaF9icGNfc2V0IChjdXJyZW50X2NwdSwgY2lhKTsKLQotICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgY3VycmVudF9jcHUsIE5VTEwsCi0JCQkgIEVJVF9BRERSX0VYQ1BfQUREUik7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICBzaW1fY29yZV9zaWduYWwgKHNkLCBjdXJyZW50X2NwdSwgY2lhLCBtYXAsIG5yX2J5dGVzLCBhZGRyLAotCQkgICAgIHRyYW5zZmVyLCBzaWcpOwotfQotDAotLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCi0KLXN0YXRpYyBpbnQKLXN5c2NhbGxfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCi0JCSAgdW5zaWduZWQgbG9uZyB0YWRkciwgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCi17Ci0gIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7Ci0gIFNJTV9DUFUgKmNwdSA9IChTSU1fQ1BVICopIHNjLT5wMjsKLQotICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN5c2NhbGxfd3JpdGVfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAotCQkgICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjb25zdCBjaGFyICpidWYsIGludCBieXRlcykKLXsKLSAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKLSAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgc2MtPnAyOwotCi0gIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOwotfQotCi0vKiBUcmFwIHN1cHBvcnQuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LgotICAgUHJlcHJvY2Vzc2luZyBsaWtlIHNhdmluZyB0aGUgdmFyaW91cyByZWdpc3RlcnMgaGFzIGFscmVhZHkgYmVlbiBkb25lLiAgKi8KLQotVVNJCi1pOTYwX3RyYXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGludCBudW0pCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0gIGhvc3RfY2FsbGJhY2sgKmNiID0gU1RBVEVfQ0FMTEJBQ0sgKHNkKTsKLQotI2lmZGVmIFNJTV9IQVZFX0JSRUFLUE9JTlRTCi0gIC8qIENoZWNrIGZvciBicmVha3BvaW50cyAib3duZWQiIGJ5IHRoZSBzaW11bGF0b3IgZmlyc3QsIHJlZ2FyZGxlc3MKLSAgICAgb2YgLS1lbnZpcm9ubWVudC4gICovCi0gIGlmIChudW0gPT0gVFJBUF9CUkVBS1BPSU5UKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IHRyeSBzaW0tYnJlYWsuYy4gIElmIGl0J3MgYSBicmVha3BvaW50IHRoZSBzaW11bGF0b3IgIm93bnMiCi0JIGl0IGRvZXNuJ3QgcmV0dXJuLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYW5kIGxldCdzIHVzIHRyeS4gICovCi0gICAgICBzaW1faGFuZGxlX2JyZWFrcG9pbnQgKHNkLCBjdXJyZW50X2NwdSwgcGMpOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICB9Ci0jZW5kaWYKLQotI2lmIDAKLSAgLyogPz8/IHdpbHNvbiwgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcy4gICovCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV3IHBjIGlzIHRoZSB0cmFwIHZlY3RvciBlbnRyeS4KLQkgV2UgYXNzdW1lIHRoZXJlJ3MgYSBicmFuY2ggdGhlcmUgdG8gc29tZSBoYW5kbGVyLiAgKi8KLSAgICAgIFVTSSBuZXdfcGMgPSBFSVRfVFJBUF9CQVNFX0FERFIgKyBudW0gKiA0OwotICAgICAgcmV0dXJuIG5ld19wYzsKLSAgICB9Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG51bSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIFRSQVBfU1lTQ0FMTCA6Ci0gICAgICB7Ci0JQ0JfU1lTQ0FMTCBzOwotCi0JQ0JfU1lTQ0FMTF9JTklUICgmcyk7Ci0Jcy5mdW5jID0gbnVtOwotCXMuYXJnMSA9IGFfaTk2MF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDE2KTsKLQlzLmFyZzIgPSBhX2k5NjBfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAxNyk7Ci0Jcy5hcmczID0gYV9pOTYwX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMTgpOwotCi0JaWYgKHMuZnVuYyA9PSBUQVJHRVRfU1lTX2V4aXQpCi0JICB7Ci0JICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBwYywgc2ltX2V4aXRlZCwgcy5hcmcxKTsKLQkgIH0KLQotCXMucDEgPSAoUFRSKSBzZDsKLQlzLnAyID0gKFBUUikgY3VycmVudF9jcHU7Ci0Jcy5yZWFkX21lbSA9IHN5c2NhbGxfcmVhZF9tZW07Ci0Jcy53cml0ZV9tZW0gPSBzeXNjYWxsX3dyaXRlX21lbTsKLQljYl9zeXNjYWxsIChjYiwgJnMpOwotCS8qID8/PyBUaGlzIHN0dWZmIGlzIHByb2JhYmx5IHdyb25nLCBidXQgbGliZ2xvc3MgZG9lc24ndCBsb29rIGF0Ci0JICAgdGhlc2UgdmFsdWVzLCBzbyBpdCBzaG91bGRuJ3QgbWF0dGVyLiAgKi8KLQlhX2k5NjBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxOCwgcy5lcnJjb2RlKTsKLQlhX2k5NjBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxNiwgcy5yZXN1bHQpOwotCWFfaTk2MF9oX2dyX3NldCAoY3VycmVudF9jcHUsIDE3LCBzLnJlc3VsdDIpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBUUkFQX0JSRUFLUE9JTlQ6Ci0gICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgTlVMTF9DSUEsCi0JCSAgICAgICBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotICAgICAgYnJlYWs7Ci0KLSNpZiAwCi0gICAgICAvKiA/Pz8gd2lsc29uLCBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzLiAgKi8KLSAgICBkZWZhdWx0IDoKLSAgICAgIHsKLQlVU0kgbmV3X3BjID0gRUlUX1RSQVBfQkFTRV9BRERSICsgbnVtICogNDsKLQlyZXR1cm4gbmV3X3BjOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gIC8qIEZha2UgYW4gInJ0ZSIgaW5zbi4gICovCi0gIC8qIEZJWE1FOiBTaG91bGQgZHVwbGljYXRlIGFsbCBvZiBydGUgcHJvY2Vzc2luZy4gICovCi0gIHJldHVybiAocGMgJiAtNCkgKyA0OwotfQotCi0vKiBCcmVha3BvaW50IHN1cHBvcnQuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LiAgKi8KLS8qID8/PyBUaGlzIGlzIGFuIGVkaXR0ZWQgY29weSBvZiB0aGUgYWJvdmUuICAqLwotCi1VU0kKLWk5NjBfYnJlYWtwb2ludCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYykKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKLSAgaG9zdF9jYWxsYmFjayAqY2IgPSBTVEFURV9DQUxMQkFDSyAoc2QpOwotCi0jaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKLSAgLyogQ2hlY2sgZm9yIGJyZWFrcG9pbnRzICJvd25lZCIgYnkgdGhlIHNpbXVsYXRvciBmaXJzdCwgcmVnYXJkbGVzcwotICAgICBvZiAtLWVudmlyb25tZW50LiAgKi8KLSAgaWYgKG51bSA9PSBUUkFQX0JSRUFLUE9JTlQpCi0gICAgewotICAgICAgLyogRmlyc3QgdHJ5IHNpbS1icmVhay5jLiAgSWYgaXQncyBhIGJyZWFrcG9pbnQgdGhlIHNpbXVsYXRvciAib3ducyIKLQkgaXQgZG9lc24ndCByZXR1cm4uICBPdGhlcndpc2UgaXQgcmV0dXJucyBhbmQgbGV0J3MgdXMgdHJ5LiAgKi8KLSAgICAgIHNpbV9oYW5kbGVfYnJlYWtwb2ludCAoc2QsIGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIH0KLSNlbmRpZgotCi0gIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBOVUxMX0NJQSwKLQkJICAgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKLQotICAvKiBGYWtlIGFuICJydGUiIGluc24uICAqLwotICAvKiBGSVhNRTogU2hvdWxkIGR1cGxpY2F0ZSBhbGwgb2YgcnRlIHByb2Nlc3NpbmcuICAqLwotICByZXR1cm4gKHBjICYgLTQpICsgNDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL0NoYW5nZUxvZyBiL3NpbS9pZ2VuL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4OGZiMC4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIwICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTIwMDAtMDQtMTIgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQHJlZGhhdC5jb20+Ci0KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IFVzZSBHUFJfQ0xFQVIoTikgaW5zdGVhZAotCW9mIEdQUl9TRVQoTiwwKSBmb3IgZ2VuLXplcm8tck4uCi0KLVRodSBTZXAgIDIgMTg6MTU6NTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX1dBUk5JTkdTKTogUmVwbGFjZSB0aGlzIHdpdGguCi0JKElHRU5fV0VSUk9SX0NGTEFHUywgSUdFTl9XQVJOX0NGTEFHUywgV0VSUk9SX0NGTEFHUywKLSAJV0FSTl9DRkxBR1MpOiBXaXRoIHRoZXNlLgotCShCVUlMRF9DRkxBR1MpOiBVcGRhdGUuCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi1GcmkgRGVjICA0IDE1OjE0OjA5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChtYWluKTogRml4IC1QaXRhYmxlPS4KLQotCSogZ2VuLWVuZ2luZS5jIChwcmludF9ydW5fYm9keSk6IFByZWZpeCBpbnN0cnVjdGlvbl9hZGRyZXNzLgotCi1XZWQgT2N0IDI4IDE4OjEyOjQzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9XQVJOSU5HUyk6IFVwZGF0ZSB0byBtYXRjaCAuLi9jb21tb24vYWNsb2NhbC5tNAotIAljaGFuZ2VzLgotCi1XZWQgQXVnIDEyIDEwOjU1OjI4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiAjdW5kZWYgYSBnZW5lcmF0ZWQKLSAJc3ltYm9sIGJlZm9yZSAjZGVmaW5lJ2luZyBpdCwgdG8gcmVtb3ZlIGNvbmZsaWN0IHdpdGggc3lzdGVtCi0gCW1hY3Jvcy4KLQotV2VkIEp1bCAyOSAxMDowNzoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi5jIChnZW5fZW50cnlfZXhwYW5kX29wY29kZSk6IEZvciBjb25kaXRpb25hbCwgZmllbGRzLiAgRml4Ci0gCXRoZSBleHRyYWN0aW9uIG9mIHRoZSB2YWx1ZSBmcm9tIGl0cyBzb3VyY2UgLSBib3RoIHRhYmxlIGFuZCBiaXQKLSAJY2FzZXMgd2VyZSB3cm9uZy4KLQotVHVlIEp1bCAyOCAxMToxOTo0MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl93b3JkKTogRm9yIGNvbnN0YW50IGNvbmRpdGlvbmFsIHN0cmluZ3MsCi0gCWVuY29kZSB0aGVpciBiaXQgdmFsdWUuCi0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl93b3JkLCBwYXJzZV9pbnNuX3dvcmRzKTogQWxsb3cgY29uZGl0aW9uYWwKLSAJb3BlcmFuZHMgdG8gcmVmZXIgdG8gZmllbGRzIGluIGVhcmxpZXIgaW5zdHJ1Y3Rpb24gd29yZHMuCi0KLQkqIGdlbi5jIChzdWJfdmFsKTogUmVwbGFjZSBmaWVsZCBhcmd1bWVudCB3aXRoIHZhbF9sYXN0X3Bvcy4KLQkoZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUpOiBMb29rIGluIHByZXZpb3VzIHRhYmxlcyBmb3IgYSB2YWx1ZSBmb3IKLSAJYSBjb25kaXRpb25hbCBmaWVsZCBhcyB3ZWxsIGFzIHRoZSBiaXRzIGZyb20gdGhlIGN1cnJlbnQgdGFibGUuCi0JKGluc25fbGlzdF9pbnNlcnQpOiBBZGQgc29ydCBrZXkgb2YgaW5zdHJ1Y3Rpb25zIHdoZXJlCi0gCXRoZWlyIG9wZXJhbmQgZmllbGRzIGhhdmUgZGlmZmVyZW50IGNvbmRpdGlvbmFscy4KLQkoaW5zbl9maWVsZF9jbXApOiBOZXcgZnVuY3Rpb24uCi0JCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxOTozMyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotRnJpIEFwciAyNCAxOTo0NTowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEbyBub3QgdHlwZSBjYXN0Ci0gCXBvaW50ZXJzLgotCQotCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBUZXJtaW5hdGUgZXJyb3Igd2l0aCBOTC4KLQotCSogZ2VuLmMgKGluc25zX2JpdF91c2VsZXNzKTogUGVyZm9ybSB1bnNpZ25lZCBiaXQgY29tcGFyaXNvbnMuCi0KLQkqIGZpbHRlci5jIChpc19maWx0ZXJlZF9vdXQsIGZpbHRlcl9wYXJzZSk6IFBhY2lmeSBHQ0MsIGxlbiBpcwotIAl1bnNpZ25lZC4KLQotV2VkIEFwciAyMiAxNDoyNzozOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWNvbmZpZ3VyZSB0byBwaWNrIHVwIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMKLQl0byBzdXBwcmVzcyBpbmxpbmluZyBieSBkZWZhdWx0LgotCi1UdWUgQXByIDIxIDAxOjM3OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IFdoZW4gZ2VuZXJhdGluZyAjZGVmaW5lCi0gCWZvcmNlIHRoZSBleHByZXNzaW9uIHRvIHRoZSBjb3JyZWN0IHR5cGUuCi0KLVRodSBBcHIgMTYgMDg6NTA6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXNjLmMgKG5hbWUyaSk6IHN0cmxlbiByZXR1cm5zIGFuIHVuc2lnbmVkLgotCi1UdWUgQXByIDE0IDE5OjA0OjI4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWdlbi5oIChzdHJ1Y3QgaWdlbl93YXJuX29wdGlvbnMpOiBBZGQgdW5pbXBsZW1lbnRlZCBvcHRpb24uCi0JKiBpZ2VuLmMgKG1haW4pOiBVcGRhdGUKLQotCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBSZXBvcnQgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbnMuCi0KLVR1ZSBBcHIgMTQgMTA6NTc6MjYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fd29yZCk6IFRyZWF0IGAhJyBhbmQgYD0nIGFzIHZhbGlkCi0gCXNlcGFyYXRvciB0b2tlbnMgd2hlbiBwYXJzaW5nIGEgY29uZGl0aW9uYWwuCi0KLQkqIGlnZW4uaCAobWFpbik6IEFkZCBvcHRpb24gLVMgc28gdGhhdCBzdWZmaXggY2FuIGJlIHNwZWNpZmllZC4KLQotVHVlIEFwciAxNCAwODo0NDo1MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uaCAoc3RydWN0IGlnZW5fdHJhY2Vfb3B0aW9ucyk6IEFkZCBtZW1iZXJzIGluc25fZXhwYW5zaW9uCi0gCWFuZCBpbnNuX2luc2VydGlvbi4KLQotCSogaWdlbi5jIChtYWluKTogQWRkIG9wdGlvbnMgLUd0cmFjZS1pbnNuLWV4cGFuc2lvbiwKLSAJLUd0cmFjZS1pbnNuLWluc2VydGlvbiBhbmQgLUd0cmFjZS1hbGwuCi0KLQkqIGdlbi5jIChnZW5fZW50cnlfZXhwYW5kX2luc25zKTogVHJhY2UgZWFjaCBpbnN0cnVjdGlvbiBhcyBpdCBpcwotIAlzZWxlY3RlZCBmb3IgZXhwYW5zaW9uLgotCShnZW5fZW50cnlfZXhwYW5kX29wY29kZSk6IFRyYWNlIGVhY2ggZXhwYW5kZWQgaW5zdHJ1Y3Rpb24gYXMgaXQKLSAJaXMgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUuCi0JCi1Nb24gQXByIDEzIDE5OjIxOjQ3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBQYXJzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMuCi0JKHBhcnNlX2luc25fd29yZCk6IFZlcmlmeSBmaWVsZCBjb25kaXRpb25hbHMuCi0KLQkqIGxkLWluc24uaDogRXh0ZW5kIHN5bnRheCB0byBhbGxvdyBtYWNyb3MgYW5kIGZpZWxkIGVxdWFsaXR5LgotCShzdHJ1Y3QgaW5zbl9maWVsZF9jb25kKTogUmVuYW1lIGluc25fZmllbGRfZXhjbHVzaW9uLCBhZGQgdHlwZS4KLQotCSogZ2VuLmMgKGdlbl9lbnRyeV9leHBhbmRfb3Bjb2RlKTogQ2hlY2sgdHlwZSBvZiBjb25kaXRpb25hbC4KLQkoaW5zbnNfYml0X3VzZWxlc3MpOiBEaXR0by4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9tYWNyb19yZWNvcmQpOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBBcHIgMTMgMjI6Mzc6NDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmggKGVudW0gaW5zbl9maWVsZF90eXBlKTogQWRkIGluc25fZmllbGRfaW52YWxpZC4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBDaGVjayBpbnN0cnVjdGlvbiBmaWVsZCB0eXBlCi0gCWNvcnJlY3RseSBpbml0aWFsaXplZC4KLQkocHJpbnRfaW5zbl93b3Jkcyk6IERpdHRvLgotCShpbnNuX2ZpZWxkX3R5cGVfdG9fc3RyKTogRGl0dG8uCi0JKGR1bXBfaW5zbl9maWVsZCk6IERpdHRvLgotCi0JKiBnZW4uYyAoaW5zbnNfYml0X3VzZWxlc3MpOiBEaXR0by4KLQotRnJpIEFwciAgMyAxODowODoxNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi5oLCBpZ2VuLmMgKHByaW50X2luY2x1ZGVfaW5saW5lLCBwcmludF9pbmNsdWRlcywKLSAJcHJpbnRfaW5jbHVkZXMpOiBOZXcgZnVuY3Rpb25zLiAgR2VuZXJhdGUgaW5jbHVkZSBsaXN0LiAgRm9yIGZvcgotIAlzZW1hbnRpY3MgZXQuYWwuIGdlbmVyYXRlIENQUCBjb2RlIHRvIGlubGluZSB3aGVuCi0gCUNfUkVWRUFMU19NT0RVTEVfUC4KLQkKLQkqIGlnZW4uYyAoZ2VuX3NlbWFudGljc19jKTogQ2FsbCBwcmludF9pbmNsdWRlcy4KLQkqIGdlbi1lbmdpbmUuYyAoZ2VuX2VuZ2luZV9jKTogRGl0dG8uCi0KLVNhdCBBcHIgIDQgMjE6MDk6MTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmg6IChzdHJ1Y3QgX2lnZW5fbmFtZV9vcHRpb24pOiBSZXBsYWNlIHdpdGggc3RydWN0Ci0gCWlnZW5fbW9kdWxlX29wdGlvbi4gQ29udGFpbnMgYm90aCBtb2R1bGUgcHJlZml4IGFuZCBzdWZmaXguCi0JKElOSVRfT1BUSU9OUyk6IEluaXRpYWxpemUuCi0JCi0JKiBpZ2VuLmMgKG1haW4pOiBVcGRhdGUgLVAgb3B0aW9uIHRvIGZpbGwgaW4gZnVsbCBtb2R1bGUgaW5mby4KLQkoZ2VuLWVuZ2luZS5jLCBnZW4taWNhY2hlLmMsIGdlbi1pdGFibGUuYywgZ2VuLXNlbWFudGljcy5jLAotIAlnZW4tc3VwcG9ydC5jKTogVXBkYXRlLgotCi1TYXQgQXByICA0IDAyOjE1OjM1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBVc2UgVFJBQ0VfQU5ZX1AgbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGFueQotIAl0cmFjaW5nIGlzIG5lZWRlZC4KLQotVGh1IE1hciAyNiAyMDo1MToyMyAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIHRhYmxlLmMgKHRhYmxlX3B1c2gpOiAgUmVkbywgdXNpbmcgc3RkaW8uICBGaXhlcyBOVCBuYXRpdmUKLQlwcm9ibGVtIHdpdGggPENSTEY+PT48TEY+IHRyYW5zbGF0aW9uLi4uCi0KLVR1ZSBNYXIgMjQgMjM6MzA6MDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogUmUtZXh0cmFjdCB0aGUgQ0lBIGFmdGVyCi0gCXByb2Nlc3NpbmcgYW55IGV2ZW50cy4KLQotVHVlIE1hciAyNCAxNzo0NjowOCAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIE1ha2VmaWxlLmluOiAgR2V0IFNIRUxMIGZyb20gY29uZmlndXJlLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzIGZvcgotCU5UIG5hdGl2ZSBidWlsZHMuCi0KLU1vbiBNYXIgMTYgMTI6NTE6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmM6IFBhc3Mgc2ltX2NpYSB0byB0cmFjZV9wcmVmaXguCi0KLVRodSBGZWIgMjYgMTk6MjU6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IENoZWNrIG1vZGVscyBhcmUgdmFsaWQuCi0JKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IE9ubHkgZGlzY2FyZCBmdW5jdGlvbiB3aGVuIG5vIG1vZGVsIGlzCi0gCWNvbW1vbi4KLQotVHVlIEZlYiAyNCAwMTo0MjowMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1lbmdpbmUuYyAocHJpbnRfcnVuX2JvZHkpOiBBbHdheXMgd3JhcCBnZW5lcmF0ZWQgaWRlY29kZQotIAlib2R5IGluIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSyAvIEVOR0lORV9JU1NVRV9QT1NURklYX0hPT0suCi0KLUZyaSBGZWIgMjAgMTY6MjI6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IFdoZW4gLVdub2Rpc2NhcmQsIHN1cHByZXNzCi0gCWRpc2NhcmRlZCBmdW5jdGlvbiB3YXJuaW5nLgotCi0JKiBpZ2VuLmMgKG1haW4pOiBDbGFyaWZ5IC1Xbm9kaXNjYXJkLgotCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IEZvciBmdW5jdGlvbnMsIGFsbG93IHVzZSBvZgotIAlpbnN0cnVjdGlvbiBzdHlsZSBmdW5jdGlvbiBtb2RlbCByZWNvcmRzCi0KLQkqIGxkLWluc24uaCAobnJfZnVuY3Rpb25fbW9kZWxfZmllbGRzKTogRGVmaW5lLgotCQotVHVlIEZlYiAxNyAxNjozNjoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAocHJpbnRfaXRyYWNlX3ByZWZpeCk6IEdlbmVyYXRlIGNhbGwgdG8gdHJhY2VfcHJlZml4Ci0gCWluc3RlYWQgb2YgdHJhY2Vfb25lX2luc24uCi0JKHByaW50X2l0cmFjZSk6IEdlbmVyYXRlIHRyYWNlX3ByZWZpeCBjYWxsIGlmIGFueSB0cmFjaW5nIGVuYWJsZWQsCi0JKHByaW50X2l0cmFjZSk6IE5lc3QgZ2VuZXJhdGVkIGNhbGwgdG8gdHJhY2VfZ2VuZXJpYyBpbnNpZGUKLSAJY29uZGl0aW9uYWwgZm9yIGFueSB0cmFjaW5nIGVuYWJsZWQuCi0JKHByaW50X2l0cmFjZV9wcmVmaXgpOiBEbyBub3QgcGFzcyBQSEFTRSB0byB0cmFjZV9wcmVmaXguCi0KLVR1ZSBGZWIgIDMgMTQ6MDA6MzIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogQWRkIGJpdHNpemUgc3VmZml4IHRvIElNRU0gbWFjcm8uCi0JKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogRGl0dG8uCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lmZXRjaCk6IERpdHRvLgotCi0JKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogTWFyayBzdWNjZXNzaXZlIGluc3RydWN0aW9uCi0gCXdvcmRzIGFzIHVudXNlZC4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBPbmx5IHJlcG9ydCBpbnNuLXdpZHRoIHByb2JsZW1zCi0gCXdoZW4gd2FybmluZyBlbmFibGVkLgotCi0JKiBpZ2VuLmg6IEFkZCBmbGFnIGZvciB3YXJuaW5nIGFib3V0IGludmFsaWQgaW5zdHJ1Y3Rpb24gd2lkdGhzLgotCSogaWdlbi5jOiBQYXJzZSAtV3dpZHRoIG9wdGlvbi4KLQkKLQkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBNYXAgaW5zdHJ1Y3Rpb25fd29yZCBvbnRvCi0gCTxQUkVGSVg+X2luc3RydWN0aW9uX3dvcmQgd2hlbiBuZWVkZWQuCi0JKHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSk6IFVzZSBzdXBwb3J0IHByZWZpeC4KLQkoZ2VuX3N1cHBvcnRfaCk6IERpdHRvIGZvciA8UFJFRklYPl9pZGVjb2RlX2lzc3VlLgotCQotU3VuIEZlYiAgMSAxMTowODo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBHZW5lcmF0ZSBuZXcgbWFjcm8gQ1BVXy4KLQotU2F0IEphbiAzMSAxNDo1MDoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1lbmdpbmUuYyAoZ2VuX2VuZ2luZV9oKTogRG9uJ3QgYXNzdW1lIGEgbW9kZWwgaXMgcHJlc2VudC4KLQkoZ2VuX2VuZ2luZV9jKTogRGl0dG8uCi0KLQkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogRGl0dG8uCi0KLQkqIGdlbi1lbmdpbmUuYyAocHJpbnRfcnVuX2JvZHkpOiBVc2UgQ0lBX0dFVCAmIENJQV9TRVQgaW5zdGVhZCBvZgotIAlDUFVfQ0lBLiAgUGFyYW1ldGVyaXplIHdpdGggQ1BVIGFyZ3VtZW50LgotCQotRnJpIEphbiAzMCAwOTowOTozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi5oIChzdHJ1Y3QgX2dlbl9saXN0KTogUmVwbGFjZSBwcm9jZXNzb3Igd2l0aCBtb2RlbC4KLQotCSogaWdlbi5jIChnZW5faWRlY29kZV9oKTogVXBkYXRlLgotCShnZW5fcnVuX2MpOiBGb3IgZ2VuZXJhdGVkIHN3aXRjaCwgdXNlIG1vZGVsLT5mdWxsX25hbWUuCi0KLQkqIGdlbi5jIChwcmludF9nZW5fZW50cnlfcGF0aCk6IERpdHRvLgotCShtYWtlX3RhYmxlKTogIERpdHRvLgotCShnZW5fZW50cnlfZXhwYW5kX2luc25zKTogIERpdHRvLgotCShtYWtlX2dlbl90YWJsZXMpOiAgRGl0dG8uCi0KLQkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogQWRkIGV4dHJhIGFyZ3VtZW50IGBucl9jcHVzJyB0byBnZW5lcmF0ZWQKLSAJZnVuY3Rpb24gc2ltX2VuZ2luZV9ydW4uICBQYXNzIGFyZ3VtZW50IG9uIHRvIGVuZ2luZV9ydW4uCi0KLQkqIGdlbi1lbmdpbmUuYyAocHJpbnRfZW5naW5lX3J1bl9mdW5jdGlvbl9oZWFkZXIpOiBBZGQgZXh0cmEKLSAJYXJndW1lbnQgYG5yX2NwdXMnIHRvIGdlbmVyYXRlZCBmdW5jdGlvbiBlbmdpbmVfcnVuLgotCShwcmludF9ydW5fYm9keSk6IEZpeCBTTVAgY2FzZS4KLQotCSogZ2VuLXN1cHBvcnQuYyAoc3VwcG9ydF9jX2Z1bmN0aW9uKTogQ2FsbCBzaW1fZW5naW5lX2Fib3J0IHdoZW4KLSAJaW50ZXJuYWwgZnVuY3Rpb24gZmFpbHMgdG8gbG9uZyBqdW1wLgotCi1XZWQgSmFuIDIxIDE4OjAwOjIyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVXNlIEdQUl9TRVQgdG8gemVybwotIAloYXJkd2lyZWQgcmVnaXN0ZXIuCi0KLVdlZCBEZWMgMTcgMTQ6NDk6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBGaXggaGFuZGxpbmcgb2YKLQloYXJkd2lyZWQgemVybyByZWdpc3Rlci4KLQotVHVlIERlYyAgOSAxMjo0NTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uaCAoc3RydWN0IF9pZ2VuX2dlbl9vcHRpb25zKTogQWRkIG1lbWJlciBkZWZhdWx0X21vZGVsLgotCi0JKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IERlZmF1bHQgdG8gdGhlIGZpcnN0IG1hY2hpbmUgaW4gdGhlCi0gCW11bHRpLXNpbSBsaXN0LgotCShtYWluKTogQWRkIE1PREVMIHBhcmFtZXRlciB0byBnZW4tbXVsdGktc2ltIG9wdGlvbi4KLQotCSogZ2VuLmggKGZ1bmN0aW9uX2RlY2xfdHlwZSk6IERlY2xhcmUgZW51bS4KLQotCSogZ2VuLWVuZ2luZS5jIChwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciksIGdlbi1lbmdpbmUuaDoKLSAJTWFrZSBnbG9iYWwsIHBhc3MgZnVuY3Rpb25fZGVjbF90eXBlIGFzIGFyZ3VtZW50LgotCShnZW5fZW5naW5lX2gsIGdlbl9lbmdpbmVfYyk6IFVwZGF0ZSBjYWxsLgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlciksCi0gCWdlbi1pZGVjb2RlLmg6IFBhc3MgZnVuY3Rpb25fZGVjbF90eXBlIGFzIGFyZ3VtZW50LgotCi0JKiBpZ2VuLmMgKGdlbl9pZGVjb2RlX2gpOiBGb3IgbXVsdGktc2ltLCBkZWxjYXJlIGdsb2JhbCB2YXJpYWJsZQotIAlpZGVjb2RlX2lzc3VlLgotCi0JKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IEZvciBtdWx0aS1zaW0sIGluaXRpYWxpemUgZ2xvYmFscwotIAlpZGVjb2RlX2lzc3VlIGFuZCBlbmdpbmVfcnVuLgotCi1GcmkgTm92IDE0IDEwOjUxOjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX21vZGVsX3JlY29yZCk6IEFsbG93IG11bHRpcGxlIG1vZGVsIG5hbWVzCi0gCXRvIGJlIHNwZWNpZmllZCBpbiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBtb2RlbCByZWNvcmQuCi0JKGR1bXBfaW5zbl9tb2RlbF9lbnRyeSk6IFVwZGF0ZS4KLQotCSogbGQtaW5zbi5oIChzdHJ1Y3QgX2luc25fbW9kZWxfZW50cnkpOiBSZXBsYWNlIG1lbWJlciBuYW1lIHdpdGgKLSAJdGhlIGZpbHRlciBuYW1lcy4gIERvY3VtZW50IHN5bnRheCBjaGFuZ2UuCi0KLVdlZCBOb3YgMTIgMTU6NDU6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogQWRkIGhvb2tzIGZvciBhZGRpbmcgY29kZSBiZWZvcmUKLSAJYW5kIGFmdGVyIGFuIGluc3RydWN0aW9uIGhhcyBiZWVuIGlzc3VlZC4KLQotMTk5Ny0xMS0wNCAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX3VudGlsX3N0b3BfYm9keSk6IFVzZSBgI2lmIDAnIGluc3RlYWQgb2YKLQlgI2lmZGVmIDAnIGFyb3VuZCB0aGlzLgotCi1UdWUgTm92ICA0IDA4OjE4OjI5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZC1kZWNvZGUuYyAobG9hZF9kZWNvZGVfdGFibGUpOiBEb24ndCBhc3N1bWUgTlVMTCBpcyBhbiBpbnRlZ2VyCi0JY29uc3RhbnQuCi0KLVdlZCBPY3QgMjkgMTM6MTc6MTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmg6IERvY3VtZW50IG1uZW1vbmljIHN0cmluZyBmb3JtYXQuCi0KLVR1ZSBPY3QgMjggMTA6NTA6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9leHRyYWN0aW9uKTogRm9yY2UgcmVzdWx0IG9mIGF0b2wgdG8KLSAJdW5zaWduZWQuCi0KLQkqIGxkLWluc24uYyAocGFyc2VfZnVuY3Rpb25fcmVjb3JkKTogU2VwYXJhdGUgaGFuZGxpbmcgb2Ygb2xkIGFuZAotIAluZXkgZnluY3Rpb24gcmVjb3Jkcy4KLQkobG9hZF9pbnNuX3RhYmxlKTogRm9yICVzIHJlY29yZCwgaGFjayBmdW5jdGlvbiBuYW1lICYgdHlwZSBhZnRlcgotIAlpdCBoYXMgYmVlbiBwYXJzZWQuCi0KLQkqIGZpbHRlci5oIChmaWx0ZXJfaXNfc3Vic2V0KTogUmV2ZXJzZSBhcmd1bWVudCBuYW1lcywgd3JvbmcKLSAJb3JkZXIuCi0KLQkqIGxkLWluc24uYyAobG9hZF9pbnNuX3RhYmxlKTogTW92ZSBpbmNsdWRlIGNvZGUgdG8uCi0JKHBhcnNlX2luY2x1ZGVfcmVjb3JkKTogTmV3IGZ1bmN0aW9uLiAgQ2hlY2sgZm9yIGZpbHRlcmluZyBvZgotIAlpbmNsdWRlIHN0YXRlbWVudCBieSBib3RoIGZsYWdzIGFuZCBtb2RlbHMuCi0JKGxvYWRfaW5zbl90YWJsZSk6IENoZWNrIGZvciBtb2RlbCBmaWx0ZXJpbmcgb2YgY2FjaGUgYW5kIG1vZGVsCi0gCXJlY29yZHMuCi0JKHBhcnNlX21vZGVsX2RhdGFfcmVjb3JkKTogQ2hlY2sgZm9yIG1vZGVsICYgZmxhZyBmaWx0ZXJpbmcgb2YKLSAJbW9kZWwgZGF0YSByZWNvcmRzLgotCShwYXJzZV9mdW5jdGlvbl9yZWNvcmQpOiBDaGVjayBmb3IgbW9kZWwgJiBmbGFnIGZpbHRlcmluZyBvZgotIAlmdW5jdGlvbiByZWNvcmRzLgotCi0JKiBsZC1pbnNuLmg6IERlZmluZSByZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZC4gIEFkZCBmaWx0ZXItbW9kZWxzCi0gCWZpZWxkIHRvIGFsbCBidXQgaW5zdHJ1Y3Rpb24gcmVjb3Jkcy4KLQkoc3RydWN0IF9mdW5jdGlvbl9lbnRyeSwgc3RydWN0IF9jYWNoZV9lbnRyeSk6IEFkZCBtb2RlbHMgZmllbGQuCi0JKG5yX2Z1bmN0aW9uX2ZpZWxkcyk6IE1ha2UgcGFybSBmaWVsZCBtYW5kYXRvcnkuCi0KLU1vbiBPY3QgMjcgMTU6MTQ6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKG1haW4pOiBDaGFuZ2UgLUkgb3B0aW9uIHRvIC1JPGRpcmVjdG9yeT4uICBBZGQgb3B0aW9uYWwKLSAJc2l6ZSB0byAtR2dlbi1pY2FjaGUgb3B0aW9uLiAgQWRkIC1Hbm8tLi4uIHN1cHBvcnQuCi0JCi0JKiBpZ2VuLmggKHN0cnVjdCBfaWdlbl9vcHRpb25zKTogQWRkIGluY2x1ZGUgZmllbGQuCi0JCi0JKiBsZC1pbnNuLmMgKGVudW0gaW5zbl9yZWNvcmRfdHlwZSwgaW5zbl90eXBlX21hcCk6IEFkZAotIAlpbmNsdWRlX3JlY29yZC4KLQkobG9hZF9pbnNuX3RhYmxlKTogQ2FsbCB0YWJsZV9wdXNoIHdoZW4gaW5jbHVkZSByZWNvcmQuCi0JCi0JKiB0YWJsZS5jIChzdHJ1Y3QgX29wZW4gdGFibGUsIHN0cnVjdCB0YWJsZSk6IE1ha2UgdGFibGUgb2JqZWN0IGFuCi0gCWluZGlyZWN0IHB0ciB0byB0aGUgY3VycmVudCB0YWJsZSBmaWxlLgotCShjdXJyZW50X2xpbmUsIG5ld190YWJsZV9lbnRyeSwgbmV4dF9saW5lKTogTWFrZSBmaWxlIGFyZyB0eXBlCi0gCW9wZW5fdGFibGUuCi0JKHRhYmxlX29wZW4pOiBVc2UgdGFibGVfcHVzaC4KLQkodGFibGVfcmVhZCk6IFBvaW50IHZhcmlhYmxlIGZpbGUgYXQgY3VycmVudCB0YWJsZSwgYXQgZW9mLCBwb3AKLSAJbGFzdCBvcGVuIHRhYmxlLgotCi0JKiB0YWJsZS5oLCB0YWJsZS5jICh0YWJsZV9wdXNoKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgT2N0IDE2IDExOjAzOjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVXNlIENJQSBub3QKLSAJY2lhLmlwLiBFc2NhcGUgbmV3bGluZXMgYXQgZW5kIG9mIGdlbmVyYXRlZCBjYWxsIHRvCi0gCXNpbV9lbmdpbmVfYWJvcnQuCi0KLVR1ZSBPY3QgMTQgMTE6MTM6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IE91dHB1dCBsaW5lLXJlZiB0byBpZ2VuIHNvdXJjZSBmaWxlIHdoZW4KLSAJZ2VuZXJhdGluZyB0cmFjZSBzdGF0ZW1lbnRzLgotCShwcmludF9pdHJhY2VfcHJlZml4LCBwcmludF9pdHJhY2VfZm9ybWF0KTogRXNjYXBlIG5ld2xpbmUgYXQgZW5kCi0gCW9mIGVhY2ggbGluZSBvZiBnZW5lcmF0ZWQgY2FsbCB0byB0cmFjZSBmdW5jdGlvbi4KLQotTW9uIE9jdCAxMyAxMToyNzozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBHZW5lcmF0ZSAjZGVmaW5lIE5JQS4gRGVmaW5pdGlvbgotIAlkZXBlbmRhbnQgb24gZ2VuLWRlbGF5ZWQtYnJhbmNoIG1vZGUuCi0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9tbmVtb25pY19yZWNvcmQpOiBDaGVjayBmb3Igb3BlbmluZyBhbmQKLSAJY2xvc2luZyBkb3VibGUgcXVvdGUgaW4gbW5lbW9uaWMgZmllbGQuCi0JKHBhcnNlX29wdGlvbl9yZWNvcmQpOiBBZGQgZ2VuLWRlbGF5ZWQtYnJhbmNoIG9wdGlvbi4KLQotV2VkIE9jdCAgOCAxMzoxMDoxNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi5jIChpbnNuX2xpc3RfaW5zZXJ0KTogTWlzc2luZyBcbiBpbiB3YXJuaW5nLgotCi0JKiBsZC1pbnNuLmMgKGxvYWRfaW5zbl90YWJsZSk6IE9ubHkgbm90aWZ5IG9mIGRpc2NhcmRlZAotIAlpbnN0cmN0aW9ucyB3aGVuIHdhcm4uZGlzY2FyZCBlbmFibGVkLgotCi0JKiBpZ2VuLmg6IEFkZCBvcHRpb24ud2Fybi5kaXNjYXJkLCBkZWZhdWx0IGVuYWJsZWQuCi0KLQkqIGlnZW4uYyAobWFpbik6IEFkZCAtV25vZGlzY2FyZCBvcHRpb24uCi0KLQkqIGxkLWluc24uYyAocmVjb3JkX3R5cGUpOiBGb3Igb2xkIHJlY29yZCB0eXBlLCBjaGVjayB0aGUgbnVtYmVyCi0gCW9mIGZpZWxkcyBpcyBjb3JyZWN0LgotCShsb2FkX2luc25fdGFibGUpOiBBbGxvdyBpbnNuIGFzc2VtYmxlciBhbmQgaW5zbiBtb2RlbCByZWNvcmRzIHRvCi0gCWFwcGVhciBpbiBhbnkgb3JkZXIuCi0JKHBhcnNlX2luc25fbW9kZWxfcmVjb3JkKTogUmVuYW1lIGZyb20gcGFyc2VfaW5zbl9tb2RlbF9yZWNvcmRzLgotICAJUGFyc2Ugb25seSBvbmUgcmVjb3JkLgotCShwYXJzZV9pbnNuX21uZW1vbmljX3JlY29yZCk6IFJlbmFtZSBmcm9tCi0gCXBhcnNlX2luc25fbW5lbW9uaWNfcmVjb3Jkcy4gIFBhcnNlIG9ubHkgb25lIHJlY29yZC4KLQotVHVlIFNlcCAyMyAxNTo1MjowNiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgotCi0JKiBnZW4taXRhYmxlLmMgKGdlbl9pdGFibGVfaCk6IFtucl9pdGFibGVfKiArIDFdIHRvIGF2b2lkCi0gCWlsbGVnYWwgemVyby1zaXplZCBhcnJheS4KLQkoaXRhYmxlX3ByaW50X3NldCk6IGxpa2V3aXNlLCBhdm9pZCBlbXB0eSBpbml0aWFsaXplcnMuCi0KLU1vbiBTZXAgMjIgMTg6NDk6MDcgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGkzODYtd2luZG93cyBpcyBhIGNyb3NzLCBzbyBkb24ndCBleHBlY3QKLSAJbGliaWJlcnR5IHRvIGJlIHRoZXJlLgotCSogY29uZmlndXJlOiB1cGRhdGVkLgotCQotRnJpIFNlcCAxOSAxMDozNjozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAocHJpbnRfZnVuY3Rpb25fbmFtZSk6IFB1dCB0aGUgZm9ybWF0IG5hbWUgYWZ0ZXIgdGhlCi0gCWZ1bmN0aW9uIC8gaW5zdHJ1Y3Rpb24gbmFtZSwgbm90IGJlZm9yZS4KLQkocHJpbnRfaXRyYWNlKTogQmV0dGVyIGZvcm1hdCB0cmFjZSBjb2RlLgotCi1UdWUgU2VwIDE2IDExOjAxOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLmMgKGluc25zX2JpdF91c2VsZXNzKTogRG9uJ3QgdHJlYXQgc3RyaW5nIGZpZWxkcyByZXN0cmljdGVkCi0gCXRvIGEgcmFuZ2Ugb2YgdmFsdWVzIGFzIHVzZWxlc3MuCi0KLU1vbiBTZXAgMTUgMTU6NDc6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IEhhbmRsZSBub24tbXVsdGktc2ltIGNhc2UuCi0KLQkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBEZWZpbmUgU0RfIC0gdG8gcmVwbGFjZSBfU0QuCi0gIAlEZWZpbmUgQ0lBIGZyb20gY2lhLgotCi1UaHUgU2VwIDExIDEwOjI3OjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVHJhY2UgdGhlIGluc3RydWN0aW9uCi0gCWFmdGVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZC4KLQkocHJpbnRfc2VtYW50aWNfYm9keSk6IENvdW50IHRoZSBpbnN0cnVjdGlvbiB1c2luZyBzaW0tcHJvZmlsZS4KLQkKLVdlZCBTZXAgMTAgMTM6MzU6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4taXRhYmxlLmMgKGdlbl9pdGFibGVfaCk6IENvbGxlY3Qgc3VtbWFyeSBpbmZvIG9uIGluc3RydWN0aW9uCi0gCXRhYmxlIHdoZW4gdHJhdmVyc2luZyBpdC4KLQkoZ2VuX2l0YWJsZV9oKTogT3V0cHV0IGFuIGVudW0gZGVmaW5pbmcgdGhlIG1heCBzaXplIG9mIGVhY2ggb2YKLSAJdGhlIGl0YWJsZSBzdHJpbmcgbWVtYmVycy4KLQotVHVlIFNlcCAgOSAwMzozMDoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogTmV3IGZ1bmN0aW9uLiBHZW5lcmF0ZSBzaW1fZW5naW5lX3J1biB0aGF0Ci0gCWxvb2tzIGF0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlLgotCi0JKiBnZW4tZW5naW5lLmMsIGdlbi1pZGVjb2RlLmM6IEFkZCBtdWx0aS1zaW0gc3VwcG9ydCAtIGdlbmVyYXRlCi0gCW9uZSBlbmdpbmUgcGVyIG1vZGVsLgotCQotCSogZ2VuLXNlbWFudGljcy5jLCBnZW4taWNhY2hlLmMgZ2VuLXN1cHBvcnQuYzoKLSAJVXBkYXRlLgotCi0JKiBsZC1pbnNuLmgsIGxkLWluc24taCAobG9hZF9pbnNuX3RhYmxlKTogUmV3cml0ZS4gIHRhYmxlLmggb25seQotIAlyZXR1cm5zIGEgbGluZSBhdCBhIHRpbWUuICBQYXJzZSBtdWx0aS13b3JkIGluc3RydWN0aW9ucy4gIEFkZAotIAltdWx0aS1zaW0gc3VwcG9ydC4KLQotCSogdGFibGUuaCwgdGFibGUuYzogU2ltcGxpZnkuICBPbmx5IHBhcnNlIGEgc2luZ2xlIGxpbmUgYXQgYSB0aW1lLgotICAJbGQtaW5zbiBjYW4gaGFuZGxlIHRoZSByZXN0LgotCi0JKiBmaWx0ZXIuaCwgZmlsdGVyLmMgKGZpbHRlcl9wYXJzZSwgZmlsdGVyX2FkZCwgZmlsdGVyX2lzX3N1YnNldCwKLSAJZmlsdGVyX2lzX2NvbW1vbiwgZmlsdGVyX2lzX21lbWJlciwgZmlsdGVyX25leHQpOiBOZXcgZmlsdGVyCi0gCW9wZXJhdGlvbnMuCi0JKGR1bXBfZmlsdGVyKTogRGl0dG8uCi0JCi0JKiBnZW4uaCwgZ2VuLmM6IE5ldyBmaWxlLiAgVGFrZXMgdGhlIGluc24gdGFibGUgYW5kIHR1cm5zIGl0IGludG8KLSAJYSBzZXQgb2YgZGVjb2RlIHRhYmxlcyBhbmQgc2VtYW50aWMgZnVuY3Rpb25zLgotCQotCSogbGQtaW5zbi5jOiBDb3B5IGdlbmVyYXRvciBjb2RlIGZyb20gaGVyZS4KLQkqIGdlbi5jOiBUbyBoZXJlLgotCi1GcmkgQXVnICA4IDExOjQzOjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlzYy5oIChOWkFMTE9DKTogQWxsb2NhdGUgYW4gTiBlbGVtZW50IGFycmF5IG9mIFRZUEUuCi0KLQkqIHRhYmxlLmgsIHRhYmxlLmM6IFNpbXBsaWZ5IHRhYmxlIHBhcnNlciBzbyB0aGF0IGl0IG9ubHkKLSAJdW5kZXJzdGFuZHMgY29sb24gZGVsaW1pdGVkIGxpbmVzIGFuZCBjb2RlIGJsb2Nrcy4KLQkodGFibGVfcmVhZCk6IFBhcnNlICd7JyAuLi4gJ30nIGFzIGEgY29kZSBibG9jay4KLQkodGFibGVfcHJpbnRfY29kZSk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgb3V0IGEgY29kZSBibG9jayB0byBmaWxlLgotCShtYWluKTogQWRkIHN1cG9ydCBmb3Igc3RhbmRhbG9uZSB0ZXN0aW5nLgotCQotCSogbGQtaW5zbi5oLCBsZC1pbnNuLmM6Ci0JCi0JCi1Nb24gU2VwICAxIDExOjQxOjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLWlkZWNvZGUuYyAoZXJyb3JfbGVhZl9jb250YWluc19tdWx0aXBsZV9pbnNuKTogTWFrZSBzdGF0aWMuCi0JKHByaW50X2p1bXBfZGVmaW5pdGlvbiwgcHJpbnRfanVtcCwgcHJpbnRfanVtcF9pbnRlcm5hbF9mdW5jdGlvbiwKLSAJcHJpbnRfanVtcF9pbnNuLCBwcmludF9qdW1wX3VudGlsX3N0b3BfYm9keSk6IERlbGV0ZSwgbW92ZWQgdG8KLSAJc2ltLWVuZ2luZS5jCi0KLQkqIGlnZW4uYyAocHJpbnRfaXRyYWNlX2Zvcm1hdCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUgY2hwLgotCShnZW4tZW5naW5lLmgpOiBJbmNsdWRlLgotCi0JKiB0YWJsZS5jIChjdXJyZW50X2ZpbGVfbmFtZSwgY3VycmVudF9saW5lX2VudHJ5LAotIAljdXJyZW50X2xpbmVfZW50cnkpOiBNYWtlIHN0YXRpYy4KLQotV2VkIEF1ZyAgNiAxMjozMToxNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEFSX0ZPUl9CVUlMRCwgQVJfRkxBR1NfRk9SX0JVSUxELAotIAlSQU5MSUJfRk9SX0JVSUxEIGFuZCBDRkxBR1NfRk9SX0JVSUxELgotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIHNpbXVsYXRvciBjb21tb24vYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIC0tZW5hYmxlLXNpbS13YXJuaW5ncyBvcHRpb24uCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotCSogTWFrZWZpbGUuaW46IFVzZS4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC1maWx0ZXIpOiBOZXcgcnVsZS4KLQkoaWdlbi5vLCB0bXAtdGFibGUsIHRtcC1sZC1kZWNvZGUsIHRtcC1sZC1jYWNoZSwgdG1wLWxkLWluc24sCi0gCWxkLWRlY29kZS5vLCBsZC1jYWNoZS5vLCBsZC1pbnNuLm8pOiBGaXggZGVwZW5kZW5jaWVzLgotCQotCSogZ2VuLmgsIGdlbi5jOiBOZXcgZmlsZXMuCi0gIAkKLQkqIE1ha2VmaWxlLmluIChnZW4ubywgdG1wLWdlbik6IE5ldyBydWxlcywgdXBkYXRlIGFsbAotIAlkZXBlbmRlbmNpZXMuCi0JCi1UdWUgSnVuIDI0IDExOjQ2OjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBBY2NlcHQgJXMgYXMgYSBmdW5jdGlvbiB0eXBlLgotCi1UaHUgSnVuICA1IDE3OjE0OjMyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChwcmludF9pdHJhY2VfcHJlZml4KTogTW92ZSBwcmludGluZyBvZiBpbnNuIHByZWZpeCB0bwotIAloZXJlLgotCShwcmludF9pdHJhY2VfZm9ybWF0KTogRHJvcCBwcmludGluZyBvZiBNWV9OQU1FIGluIGluc3RydWN0aW9uCi0gCXRyYWNlLiAgUHJpbnRpbmcgb2YgaW5zbiBwcmVmaXggbW92ZWQuCi0JKHByaW50X2l0cmFjZSk6IERpdHRvLgotCi1GcmkgTWF5IDMwIDExOjI3OjM3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyKTogUGFzcwotIAl0YWJsZV9saW5lX2VudHJ5IGluc3RlYWQgb2Ygc2VwYXJhdGUgZmlsZSBhbmQgbGluZS4KLQotCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFNldCBhc3NlbWJsZXIgc291cmNlIGZpbGUvbGluZS1uciB0bwotIAl0aGUgY3VycmVudCBub3QgaW5pdGlhbCBmaWxlLgotCSh0YWJsZV9lbnRyeV9yZWFkKTogRml4IGxpbmUgbnVtYmVyaW5nIG9mIHNvdXJjZSBmaWxlcy4KLQotCXRhYmxlLmggKHRhYmxlX2xpbmVfZW50cnkpOiBOZXcgc3RydWN0dXJlLiAgRXhhY3RseSBzcGVjaWZpZXMgYQotIAlzb3VyY2UgZmlsZS9saW5lLW5yLgotCSh0YWJsZV8qX2VudHJ5KTogQWRkIHRoaXMgdG8gYWxsLgotCQotCXRhYmxlLmMgKHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKTogQ2hhbmdlIHRvIHVzZSB2YWx1ZXMgZnJvbQotIAlhIHRhYmxlX2xpbmVfZW50cnkgc3RydWN0LgotCSh0YWJsZV9lbnRyeV9yZWFkKTogU2F2ZSB0YWJsZV9saW5lX2VudHJ5IGluIGFsbCBzdHJ1Y3R1cmVzIHJlYWQuCi0KLQlnZW4taWNhY2hlLmMsIGdlbi1zdXBwb3J0LmMsIGdlbi1pZGVjb2RlLmMsIGdlbi1zZW1hbnRpY3MuYywKLSAJZ2VuLW1vZGVsLmM6IFVwZGF0ZSBhbGwgcmVmZXJlbmNlcy4KLQkKLVRodSBNYXkgMjkgMTA6Mjk6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHByaW50X215X2RlZmluZXMpOiBEZWZpbmUgTVlfTkFNRSAtIGEgc3RyaW5nLiAgRm9yCi0gCU1ZX1BSRUZJWCwgdW5kZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluY2FzZSBzb21lIGR1bWIKLSAJaGVhZGVyIGRlZmluZWQgaXQuICBpdC4KLQkocHJpbnRfaXRyYWNlKTogVXNlIE1ZX05BTUUgbm90IE1ZX1BSRUZJWC4KLQotCSogbGYuYyAobGZfd3JpdGUpOiBOZXcgZnVuY3Rpb24gd3JpdGUgYW4gTiBjaGFyYWN0ZXIgYnVmZmVyIHRvIHRoZQotIAlmaWxlLgotCi0JKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IFdoZW4gYXZhaWxhYmxlLCB1c2UgdGhlIGFzc2VtYmxlciB0bwotIAlwcmludCB0aGUgaW5zbi10cmFjZS4KLQkocHJpbnRfaXRyYWNlX3ByZWZpeCk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgZmlyc3QgcGFydCBvZiBjYWxsIHRvCi0gCXByaW50X29uZV9pbnNuLgotCShwcmludF9pdHJhY2VfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLCBwcmludCBmbXQgYXJndW1lbnQgZm9yCi0gCXByaW50X29uZV9pbnNuLgotCQotCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFNhdmUgYW55IGFzc2VtYmxlciBsaW5lcyBpbnN0ZWFkIG9mCi0gCWRpc2NhcmRpbmcgdGhlbS4KLQotV2VkIE1heSAyOCAwOTo1NToyOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2JvZHkpOiBQcm9jZXNzIGltbWVkcy4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogV2hlbiBjb21wdXRpbmcgTklBLCBza2lwCi0gCWFueSBpbW1lZCB3b3JkcyB0aGF0IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX2Zvcm1hdCk6IFBhcnNlIGltbWVkcyBhcHBlbmRlZCB0byBhbgotIAlpbnN0cnVjdGlvbi4KLQotCSogaWdlbi5jIChtYWluKTogQWxsb3cgYW55IHJlZ2lzdGVyIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgemVybwotIAlyZWdpc3Rlci4KLQkoc2VtYW50aWNfemVyb19yZWcpOiBHbG9iYWwsIGluZGV4IHRvIHplcm8gcmVnaXN0ZXIuCi0KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IFplcm8gc2VsZWN0ZWQgcmVnaXN0ZXIuCi0KLVR1ZSBNYXkgMjcgMTQ6MTI6MzIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmg6IFN0b3Agb3B0aW9ucyBhbmQgY29kZSBnZW4gdHlwZSBiaXQgbWFza3Mgb3ZlcmxhcGluZy4KLQotRnJpIE1heSAyMyAxMjowMTowOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IEluY29ycmVjdCB0ZXN0IGZvcgotIAl6ZXJvLXIwIGNvZGUuCi0KLUZyaSBNYXkgMTYgMTQ6MzI6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBVc2UgY29tbW9uIHNpbS1lbmdpbmUKLSAJaW50ZXJmYWNlLgotCi1GcmkgTWF5IDE2IDExOjQ4OjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogQWRkIGNvZGUgdG8gY2xlYXIgcjAuCi0KLQkqIGlnZW4uYyAobWFpbik6IEFkZCBuZXcgb3B0aW9uIHplcm8tcjAsIHdoaWNoIGFkZHMgY29kZSB0byBjbGVhcgotIAlHUFIoMCkgZWFjaCBjeWNsZS4KLQotV2VkIE1heSAgNyAxMjozMTozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAocHJpbnRfaXRyYWNlKTogRml4IHNvIGxpbmUtbnIgaXMgcGFzc2VkIHRvIHRyYWNlCi0gCWZ1bmN0aW9uLgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogQ29ycmVjdCBGUCBjb2RlLgotCi0JKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9oKTogQWx3YXlzIHBhc3MgTVlfSU5ERVggdG8gc3VwcG9ydAotIAlmdW5jdGlvbnMuCi0JKHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSk6IERpdHRvLgotCi1UdWUgTWF5ICA2IDA2OjEyOjA0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IENhbGwgdHJhY2Vfb25lX2luc24gdG8gdHJhY2UKLQlpbnN0cnVjdGlvbnMsIHJhdGhlciB0aGFuIGRvaW5nIGl0IGRpcmVjdGx5LgotCi1Nb24gTWF5ICA1IDE0OjExOjQ2IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBnZW4tZW5naW5lLmMgKGVuZ2luZV9zd2l0Y2hfbGVhZik6IFJlbW92ZSBleHRyYSAlcy4KLQkocHJpbnRfZW5naW5lX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKTogV3JhcCBpbiAjaWZkZWYKLQlVTlVTRUQvI2VuZGlmLCB1bnRpbCBzb21lYm9keSB1c2VzIGl0LgotCi0JKiBnZW4taWRlY29kZS5jIChlcnJvcl9sZWFmX2NvbnRhaW5zX211bHRpcGxlX2luc24pOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUuCi0JKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogV3JhcCBpbiAjaWZkZWYgVU5VU0VELyNlbmRpZiwgdW50aWwKLQlzb21lYm9keSB1c2VzIGl0LgotCShwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogVXNlIGxvbmcgZm9ybWF0cyB0byBwcmludCBsb25nIHZhbHVlcy4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9pZGVjb2RlX2ludmFsaWQpOiBTZXQgbmFtZSB0byAidW5rbm93biIKLQlpZiB3ZSBnZXQgYW4gdW5leHBlY3RlZCB0eXBlLgotCi1GcmkgTWF5ICAyIDEzOjI4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBQYXNzIFNEIGFzIHdlbGwgYXMgQ1BVIHRvIGNhbGxzIHRvCi0gCXRyYWNlX3ByaW50Zi4KLQotCSogZ2VuLXN1cHBvcnQuYyAoZ2VuX3N1cHBvcnRfaCk6IEFsd2F5cyBwYXNzIHNpbV9jaWEgY2lhIHRvCi0gCXN1cHBvcnQgZnVuY3Rpb25zLgotCShwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBEaXR0by4KLQotV2VkIEFwciAzMCAxNzozNTo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbi1zdXBwb3J0LmMgKHN1cHBvcnRfY19mdW5jdGlvbik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBtZW1zZXQgb2YKLSAJY2lhLgotICAJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBXYXNuJ3QgY2xvc2luZwotIAlnZW5lcmF0ZWQgY29tbWVudC4KLQotVHVlIEFwciAyOSAxMToxMToxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGxkLWluc24uYyAobG9hZF9pbnNuX3RhYmxlKTogUmVwb3J0IGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdAotIAloYXZlIGF0IGxlYXN0IGEgZm9ybWF0IGFuZCBuYW1lLgotCShpbnNuX3RhYmxlX2ZpbmRfb3Bjb2RlX2ZpZWxkKTogQ2hlY2sgcHJvZ3Jlc3MgaXMgYmVpbmcgbWFkZS4KLQotCSogZ2VuLXN1cHBvcnQuYyAoc3VwcG9ydF9jX2Z1bmN0aW9uKTogUmVwb3J0IGVtcHR5IGZ1bmN0aW9uIGJvZHkuCi0KLVRodSBBcHIgMjQgMTE6NDM6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmMgKGluc25fdGFibGVfZXhwYW5kX29wY29kZSk6IEFsbG93IHJlc2VydmVkIGZpZWxkcyB0bwotIAliZSBicm9rZW4gdXAuCi0JKGluc25fdGFibGVfZXhwYW5kX2luc25zKTogQWxsb3cgc3BlY2lhbCBydWxlcyB0byBhcHBseSB0byBncm91cHMKLSAJb2YgaW5zdHJ1Y3Rpb25zIHdoZW4gYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwIG1hdGNoIHRoZSBzcGVjaWFsCi0gCW1hc2svdmFsdWUuCi0KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfY19zZW1hbnRpYyk6IERpdHRvLgotCSogaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KLQkocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSk6IERpdHRvLgotCSogaWdlbi5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsKTogRGl0dG8uCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2JvZHkpOiBEaXR0by4KLQotCSogZ2VuLWlkZWNvZGUuYyAoZ2VuX2lkZWNvZGVfaCk6IFByZXBlbmQgdGhlIGdsb2JhbF9wcmVmaXggdG8gdGhlCi0gCWluc3RydWN0aW9uX2FkZHJlc3MgdHlwZS4KLQotCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogQ2FsbCBjcHVfZXJyb3Igd2hlbiBhbgotIAl1bmltcGxlbWVudGVkIGluc3RydWN0aW9uIGlzIGVuY291bnRlcmVkIC0gZ2l2ZXMgdGhlIGludGVycHJldGVyCi0gCXRoZSBjaGFuY2UgdG8gc3RvcCBjb3JyZWN0bHkuCi0KLVdlZCBBcHIgMjMgMjA6MDY6MzYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHByaW50X2Z1bmN0aW9uX25hbWUpOiBBbGxvdyBkb3QncyBpbiBpbnN0cnVjdGlvbiBuYW1lcy4KLQotVHVlIEFwciAyMiAyMTo0NjoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAobWFpbiksIGlnZW4uaDogU3VwcG9ydCBuZXcgb3B0aW9uIC0gZGVsYXllZC1icmFuY2ggLQotIAlnZW5lcmF0ZSBjb2RlIHRvIGRyaXZlIGEgZGVsYXllZCBicmFuY2ggcHJvY2Vzc29yLgotCi0JKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9oKTogRGVmaW5lIGluc3RydWN0aW9uX2FkZHJlc3MgdHlwZS4KLQotCSogaWdlbi5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsKTogUmVwbGFjZSBhZGRyZXNzX3dvcmQgd2l0aAotIAlpbnN0cnVjdGlvbl9hZGRyZXNzLgotCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KLQkocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSk6IERpdHRvLgotCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9ib2R5KTogRGl0dG8uCi0KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IERpdHRvLgotCShwcmludF9jX3NlbWFudGljKTogRGl0dG8uCi0KLQkqIGdlbi1zdXBwb3J0LmMgKHN1cHBvcnRfY19mdW5jdGlvbik6IFJldHVybiBhIHplcm9lZCBDSUEgaW5zdGVhZAotIAlvZiBqdXN0IHplcm8gLSB3b3JrcyB3aXRoIGFueSBjaWEgdHlwZS4KLQotCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBGb3IgZGVsYXllZCBicmFuY2ggY2FzZSwgcHJpbnQganVzdCB0aGUKLSAJY3VycmVudCBpbnN0cnVjdGlvbi4KLQkKLVRodSBBcHIgMTcgMDc6MDI6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBVc2UgVFJBQ0VfRk9PX1AgYW5kIHRyYWNlX3ByaW50Zi4KLQotVHVlIEFwciAxNSAxNToyMDozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0KLU1vbiBBcHIgMTQgMTY6Mjk6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLVdlZCBBcHIgIDIgMTg6NTE6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2VuLXN1cHBvcnQuYyAoZ2VuX3N1cHBvcnRfYyk6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KLQkqIGdlbi1pZGVjb2RlLmMgKGdlbl9pZGVjb2RlX2MpOiBMaWtld2lzZS4KLQkqIGlnZW4uYyAoZ2VuX3NlbWFudGljc19jKTogTGlrZXdpc2UuCi0KLU1vbiBNYXIgMjQgMTA6MTA6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2JvZHkpOiBObyBsb25nZXIgZGVmaW5lIGNwdS9zZCwKLSAJc3VwcG9ydC5oIG5vdyBkZWZpbmVzIENQVS9TRCBnbG9iYWxseS4KLQotCSogZ2VuLW1vZGVsLmMgKGdlbl9tb2RlbF9oKTogRGl0dG8uCi0KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25fYm9keSk6IERpdHRvLgotCShwcmludF9qdW1wKTogRGl0dG8uCi0JKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogRGl0dG8uCi0JKHByaW50X2lkZWNvZGVfdmFsaWRhdGUpOiBEaXR0by4KLQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IERpdHRvLgotCi0JKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBEaXR0by4KLQotCSogaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBSZW5hbWUgY3B1IHRvIHNpbV9jcHUsCi0gCXByb2Nlc3NvciB0byBjcHUuCi0JKHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KLQotCSogZ2VuLXN1cHBvcnQuYyAocHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKTogSW5jbHVkZSBzZC9jcHUgYXJnCi0gCWluIHN1cHBvcnQgZnVuY3Rpb24gYXJndW1lbnQgbGlzdC4KLQkoc3VwcG9ydF9jX2Z1bmN0aW9uKTogR2VuZXJhdGUgY29kZSB0byBjcHUvc2QgZnJvbSBzZC9jcHUuCi0JKGdlbl9zdXBwb3J0X2gpOiBEZWZpbmUgX1NEIHRoZSBhcmd1bWVudCBwcmVmaXggZm9yIGFsbCBzdXBwb3J0Ci0gCWZ1bmN0aW9ucy4gIERlZmluZSBTRC9DUFUgdG8gZGV0ZXJtaW5lIHNkL2NwdSBmcm9tIHZhbHVlIG9mIF9TRAotCW1hY3JvLgotCi1UdWUgTWFyIDE4IDE1OjUyOjI0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogVXBkYXRlIGZvciByZW5hbWluZyBvZiBlbmdpbmUgdG8KLSAJc2ltLXN0YXRlLgotCQotCSogaWdlbi5jOiBEaXR0by4KLQkqIGdlbi1pZGVjb2RlLmMgKGdlbl9pZGVjb2RlX2MpOiBEaXR0by4KLQotTW9uIE1hciAxNyAxNToxNzowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogbGQtZGVjb2RlLmMgKGxvYWRfZGVjb2RlX3RhYmxlKTogUmVuYW1lIHNsYXNoIHRvIHJlc2VydmVkLgotCShkdW1wX2RlY29kZV9ydWxlKTogRGl0dG8uCi0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBgLycgLQotIAlyZXNlcnZlZCBiaXQgLSBhbmQgYSBgKicgLSB3aWxkIGNhcmQuCi0JKHBhcnNlX2luc25fZm9ybWF0KTogQ2hhbmdlIGlzX3NsYXNoIHRvIG1vcmUgaW5mb3JtYXRpdmUgcmVzZXJ2ZWQuCi0JKGR1bXBfaW5zbl9maWVsZCk6IERpdHRvLgotCShpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KTogRGl0dG8uCi0JKGluc25fdGFibGVfZXhwYW5kX29wY29kZSk6IERpdHRvLgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogTWFrZSBjaGVja19tYXNrIGFuZAotIAljaGVja192YWwgdGhlIGNvcnJlY3QgaW50ZWdlciBzaXplLgotCShwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogRml4IHJlc2VydmVkIGJpdCBjaGVjayBmb3IgNjQgYml0Ci0gCXRhcmdldHMuCi0KLUZyaSBNYXIgMTQgMTE6MjQ6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBBY2NlcHQgJyonIGFzIGFuIGFsdGVybmF0aXZlIG9mCi0gCWAvJyBpbiBiaXQgZmllbGRzLiAgYC8nIGRlbm90ZXMgYSB3aWxkIGJpdC4KLQotRnJpIE1hciAgNyAxODoyMDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogaWdlbi5oLCBpZ2VuLmMgKG1haW4pOiBOZXcgb3B0aW9ucy4gQ29udHJvbCBnZW5lcmF0aW9uIG9mCi0gCWNvbmRpdGlvbmFsIGlzc3VlIGFuZCBzbG90IHZlcmlmaWNhdGlvbiBjb2RlLgotCi1GcmkgTWFyICA3IDE4OjE3OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBnZW4tc3VwcG9ydC5jIChwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBQcmVwZW5kIHRoZSBnbG9iYWwKLSAJbmFtZSBwcmVmaXggd2hlbiBhcHBsaWNhYmxlLiAgUHJvdmlkZSAjZGVmaW5lIHRvIG1hcCB0aGUgdXNlcgotIAlzcGVjaWZpZWQgbmFtZSB0aGUgZ2VuZXJhdGVkIGdsb2JhbHkgdW5pcXVlIG9uZS4KLQotRnJpIE1hciAgNyAxODowNzo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV92YWxpZGF0ZSk6IFdyYXAgZWFjaCBvZiB0aGUgY2hlY2tzCi0gCS0gcmVzZXJ2ZWQgYml0cywgZmxvYXRpbmcgcG9pbnQgYW5kIHNsb3QgdmFsaWRhdGlvbiAtIHdpdGggYQotIAkjaWZkZWYgc28gdGhhdCB0aGV5IGFyZSBvcHRpb25hbC4KLQkKLUZyaSBNYXIgIDcgMTY6MzU6MTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGdlbi1pZGVjb2RlLmMgKGVycm9yX2xlYWZfY29udGFpbnNfbXVsdGlwbGVfaW5zbik6IE5ldyBmdW5jdGlvbgotIAktIHJlcG9ydCB0aGUgZXJyb3Igb2YgYSBsZWFmIG5vZGUgaW4gdGhlIGRlY2lzaW9uIHRyZWUgY29udGFpbmluZwotIAlzZXZlcmFsIGluc3RydWN0aW9ucy4KLQkocHJpbnRfaWRlY29kZV90YWJsZV9sZWFmKTogRGV0ZWN0IGEgbGVhZiB3aXRoIG11bHRpcGxlIGluc3RydWN0aW9ucy4KLQkocHJpbnRfaWRlY29kZV9zd2l0Y2hfbGVhZik6IERpdHRvLgotCi0JKiBnZW4tc2VtYW50aWNzLmgsIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfaWRlY29kZV9pbGxlZ2FsLAotIAlwcmludF9pZGVjb2RlX2ludmFsaWQpOiBSZW5hbWUgZm9ybWVyIHRvIGxhdHRlci4gIEFkZCBhcmd1bWVudCBzbwotIAl0aGF0IG9uZSBmdW5jdGlvbiBjYW4gZ2VuZXJhdGUgYWxsIGludmFsaWQgaW5zdHJ1Y3Rpb24gY2FzZXMgLQotIAlpbGxlZ2FsLCBmcC11bmF2YWlsYWJsZSwgd3Jvbmctc2xvdC4KLQkqIGdlbi1lbmdpbmUuYzogVXBkYXRlLgotCi0JKiBnZW4taWRlY29kZS5jOiBVc2UgcHJpbnRfaWRlY29kZV9pbnZhbGlkIHRvIGdlbmVyYXRlIGEgZnVuY3Rpb24KLSAJY2FsbCBmb3IgY2FzZXMgd2hlbiBmcC11bmF2YWlsYWJsZSBhbmQgdGhlIHNsb3QgaXMgd3JvbmcuCi0KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfdmFsaWRhdGUpOiBOZXcgY2hlY2ssIGdlbmVyYXRlIGNvZGUKLSAJdG8gdmVyaWZ5IHRoYXQgdGhlIGluc3RydWN0aW9uIHNsb3QgaXMgY29ycmVjdC4KLQkKLQkqIGlnZW4uYyAobWFpbik6IFNpbXBsaWZ5IG9wdGlvbnMuCi0KLVdlZCBNYXIgIDUgMDk6NTU6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAocHJpbnRfaXRyYWNlKTogUmVtb3ZlIHNvdXJjZSBsaW5lIHJlZmVyZW5jZSBmb3IgdHJhY2UKLSAJY29kZSAtIGxldCB0aGUgdXNlciBzZWUgdGhlIGdlbmVyYXRlZCBmaWxlLgotCShwcmludF9pdHJhY2UpOiBQcmludCB0aGUgdHJhY2UgY29kZSByYXRoZXIgdGhhbiByZWZlcmVuY2UgYQotCW1hY3JvLgotCi1UdWUgTWFyICA0IDE3OjMxOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbCk6IFBhc3MgZWl0aGVyIHRoZQotIAlwcm9jZXNzb3IgLSBzbXAgLSBvciB0aGUgZW5naW5lIC0gbW9ubyAtIGludG8gc2VtYW50aWMgZnVuY3Rpb25zLgotICAJRG9uJ3QgcGFzcyBpbiBib3RoLgotCi0JKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogRGVwZW5kYW50IG9uIHNtcCwgZGVyaXZlCi0gCXByb2Nlc3NvciBmcm9tIGVuZ2luZSBvciBlbmdpbmUgZnJvbSBwcm9jZXNzb3IsIGFuZCBoZW5jZSBlbnN1cmluZwotIAl0aGF0IGJvdGggYXJlIGRlZmluZWQgaW4gYWxsIHNlbWFudGljIGZ1bmN0aW9ucy4KLQotTW9uIE1hciAgMyAxNzoxMToyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX2Zvcm1hdCk6IE1ha2UgdGhlIHdpZHRoIGZpZWxkIG9wdGlvbmFsLgotICAJSWYgbWlzc2luZyBhc3N1bWUgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHZhbHVlCi0gCWRldGVybWluZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaWVsZC4KLQkKLVRodSBGZWIgMjcgMTE6Mjc6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGxkLWluc24uYyAoaW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKTogUmVwbGFjZSBhc3NlcnRpb24gd2l0aAotIAltb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgotCi1UdWUgRmViIDI1IDE2OjQzOjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBtaXNjLmMgKGVycm9yKTogT3V0cHV0IGVycm9ycyBvbiBzdGRlcnIuCi0KLQkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBTa2lwIGFueSBsZWFkaW5nIHNwYWNlcy4KLSAgCVZlcmlmeSB0aGUgd2lkdGggb2YgaW5zdHJ1Y3Rpb25zIGJlaW5nIHBhcnNlZC4KLQotCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFBhcnNlIENQUCdzIGNvbnZlbnRpb24gZm9yCi0gCXNwZWNpZnlpbmcgb3JpZ2luYWwgZmlsZSBuYW1lL2xpbmUtbnIuCi0KLVdlZCBGZWIgMTkgMTI6MzA6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fZm9ybWF0KTogQWxsb3cgdHJhaWxpbmcgc3BhY2VzIGluCi0gCWluc3RydWN0aW9uIGZpZWxkcy4KLQotCSogTWFrZWZpbGUuaW46IENyZWF0ZSB1c2luZyAuLi9wcGMvTWFrZWZpbGUuaW4gYXMgYSBzdGFydGluZwotIAlwb2ludC4KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8gdmlzIC4uL3BwYy9jb25maWd1cmUuaW4KLQkKLU1vbiBGZWIgMTcgMTA6NDQ6MTggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogQWx3YXlzIGluY2x1ZGUgZW5naW5lLmggaW5zdGVhZAotIAlvZiBjcHUuaAotCSogZ2VuLWlkZWNvZGUuYyAoZ2VuX2lkZWNvZGVfYyk6IERpdHRvLgotCi0JKiB3b3Jkcy5oIChpbnN0cnVjdGlvbl93b3JkKTogUmVtb3ZlIGluc3RydWN0aW9uX3dvcmQgLSBub3cKLSAJZ2VuZXJhdGVkIGJ5IGlnZW4uCi0JKGFkZHJlc3Nfd29yZCk6IE5ldy4gIFVzZWQgYnkgaWdlbi4KLQkKLQkqIGxmLmMgKGxmX3ByaW50X2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24pOiBOZXcsIHBhc3MgYSBmdW5jdGlvbiB0bwotIAlwcmludCBvdXQgdGhlIHR5cGUgaW5zdGVhZCBvZiBhIGNvbnN0YW50IHN0cmluZy4KLQkKLQkqIGlnZW4uaCwgaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwsCi0gCVNFTUFOVElDX0ZVTkNUSU9OX0ZPUk1BTCk6IFJlbGFjZSBtYWNybyB3aXRoIGZ1bmN0aW9uLgotCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl9hY3R1YWwsIFNFTUFOVElDX0ZVTkNUSU9OX0FDVFVBTCk6IERpdHRvLgotCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlLCBTRU1BTlRJQ19GVU5DVElPTl9UWVBFKTogRGl0dG8uCi0JKHByaW50X2ljYWNoZV9mdW5jdGlvbl90eXBlLCBJQ0FDSEVfRlVOQ1RJT05fVFlQRSk6IERpdHRvLgotCShwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTogRGl0dG8uCi0JKHByaW50X2ljYWNoZV9mdW5jdGlvbl9hY3R1YWwsIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwpOiBEaXR0by4KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfdGFibGUpOiBVcGRhdGUuCi0JKGlkZWNvZGVfc3dpdGNoX2xlYWYpOiBVcGRhdGUuCi0JKHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlcik6IERpdHRvLgotCShwcmludF9pZGVjb2RlX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKTogRGl0dG8uCi0JKHByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25faGVhZGVyKTogRGl0dG8uCi0JKiBpZ2VuLmMgKGdlbl9pY2FjaGVfaCk6IERpdHRvLgotCSogZ2VuLWVuZ2luZS5jIChwcmludF9lbmdpbmVfdGFibGUpOiBEaXR0by4KLQkoZW5naW5lX3N3aXRjaF9sZWFmKTogRGl0dG8uCi0JKiBnZW4tc3VwcG9ydC5jIChwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBEaXR0by4KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKTogVXBkYXRlLgotCVVwZGF0ZS4KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2hlYWRlcik6IFVwZGF0ZS4KLQkocHJpbnRfaWNhY2hlX2Z1bmN0aW9uKTogVXBkYXRlLgotCShwcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVjbGFyYXRpb24pOiBVcGRhdGUuCi0JKHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uKTogVXBkYXRlLgotCi0JKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9oKTogRHJvcCBpbmNsdWRpbmcgb2YgaWRlY29kZV8qLmgKLSAJZmlsZXMsIHdpbGwgYXQgc29tZSBzdGFnZSBuZWVkIHRvIG1vdmUgaXQgaW50byBzdXBwb3J0LgotCi0JKiBpZ2VuLmgsIGlnZW4uYyAobWFpbik6IE5ldyBvcHRpb24gLWUgPGVuZ2luZT4gLSBnZW5lcmF0ZSBhIGZ1bGwKLSAJc2ltdWxhdGlvbiBlbmdpbmUuICBQcmV2aW91c2x5IHRoaXMgd2FzIHRoZSAtZCA8aWRlY29kZS1maWxlPgotIAlvcHRpb24uCi0JKiBnZW4tZW5naW5lLmgsIGdlbi1lbmdpbmUuYzogQ29waWVzIG9mIGdlbi1pZGVjb2RlLiouICBXaWxsIG5lZWQKLSAJdG8gY2xlYW4gdGhlc2UgdXAgc28gdGhhdCB0aGF0IGNhbGwgdXBvbiB0aGUgdXBkYXRlZCBnZW4taWRlY29kZQotCWNvZGUuCi0JCi0JKiBnZW4taWRlY29kZS5oLCBnZW4taWRlY29kZS5jOiBQcnVuZSBvdXQgYW55IGNvZGUgbm90IHJlbGV2YW50IHRvCi0gCWdlbmVyYXRpbmcgYSBkZWNvZGUgdGFibGUuCi0JCi0JKiBNYWtlZmlsZS5pbiAoaWdlbik6IEFkZCBkZXBlbmRlbmNpZXMgZm9yIG5ldyBnZW4tZW5naW5lLiogZmlsZXMuCi0KLQkqIGlnZW4uaCwgaWdlbi5jIChtYWluKTogTmV3IG9wdGlvbiAtTSAtIENvbnRyb2wgd2hhdCBpcyByZXR1cm5lZAotIAlieSBzZW1hbnRpYyBmdW5jdGlvbnMgLSAtMS9OSUEgdnMgQ0lBK04vTklBLiAgQWRkCi0gCWdlbmVyYXRlX3NlbWFudGljX3JldHVybmluZ19tb2RpZmllZF9uaWFfb25seSB0byBpZ2VuX2NvZGUgZW51bS4KLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IEFzIGFuIGFsdGVybmF0aXZlLCBtYWtlCi0gCU5JQSA9PSAtMSBpbnN0ZWFkIG9mIENJQStpbnNuX3NpemUgYnkgZGVmYXVsdC4KLQkKLQkqIGlnZW4uaCwgaWdlbi5jIChtYWluLCBnbG9iYWxfbmFtZV9wcmVmaXgsIGdsb2JhbF91bmFtZV9wcmVmaXgpOgotIAlOZXcgb3B0aW9uIC1QIDxwcmVmaXg+IC0gUHJlcGVuZCBhbGwgZ2VuZXJhdGVkIGZ1bmN0aW9ucyB3aXRoIHRoZQotIAlzcGVjaWZpZWQgcHJlZml4LgotCShnZW5faWRlY29kZV9jKTogQWRqdXN0LgotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfc3RydWN0KTogRGl0dG8uCi0JKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogRGl0dG8uCi0KLVN1biBGZWIgMTYgMTU6MjM6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKG1haW4pOiBDb3JyZWN0IHVzYWdlLiBNaXNzbGVhZGluZyBtZXNzYWdlIGFib3V0IHVjYXNlCi0gCW9wdGlvbnMgZHVtcGluZyBpbnRlcm5hbCB0YWJsZXMuICAtRiBub3cgaW5jbHVkZXMgcmF0aGVyIHRoZW4KLSAJZXhjbHVkZXMgaW5zdHJ1Y3Rpb25zLgotCi0JKiBtaXNjLmgsIG1pc2MuYyAoYTJpKTogTWFrZSA2NGJpdC4KLQotCSogbGQtaW5zbi5oIChtYXhfaW5zbl9iaXRfc2l6ZSwgZGVmYXVsdF9pbnNuX2JpdF9zaXplKTogSW5jcmVhc2UKLSAJbWF4IHRvIDY0Yml0cywgZXhwZWN0IHRyb3VibGUuICBNYWtlIHRoZSBkZWZhdWx0IDMyIGJpdHMuCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3RhYmxlKTogQ2hhbmdlIEVYVFJBQ1RFRCoKLSAJZXQuYWwuIG1hY3JvJ3MgdG8gdXNlIHRoZSBpbnNuX2JpdF9zaXplIGluc3RlYWQgb2YgYXNzdW1pbmcgMzIKLSAJYml0cy4KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEaXR0by4KLQkqIGdlbi1pZGVjb2RlLmMgKGlkZWNvZGVfc3dpdGNoX3N0YXJ0KTogRGl0dG8uCi0JKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9jKTogRGl0dG8KLQotCSogaWdlbi5oIChpbnNuX3NwZWNpZnlpbmdfd2lkdGhzKSwgaWdlbi5jIChtYWluKTogTmV3IG9wdGlvbiAtVy4KLSAgCUluZGljYXRlcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBmaWVsZCBvZiB0aGUgdGFibGUgaXMgc3BlY2lmeWluZwotIAliaXQgd2lkdGhzIGluc3RlYWQgb2YgYml0IG9mZnNldHMuCi0JKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fZm9ybWF0KTogUGFyc2UgaW5zdHJ1Y3Rpb24gZmllbGRzCi0gCXNwZWNpZnlpbmcgd2lkdGhzLgotCi0JKiBtaXNjLmMgKGEyaSk6IEFsbG93IGJpbmFyeSBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUKLSAJc3ludGF4IDBiTk5OTi4KLQkqIGxkLWluc24uYzogQWxsb3cgc3VjaCBudW1iZXJzIHRvIGFwcGVhciBpbiB0aGUgaW5zdHJ1Y3Rpb24KLSAJZm9ybWF0LgotCi0JKiB0YWJsZS5jICh0YWJsZV9lbnRyeV9yZWFkKTogTWFrZSAvLyBhIHZhbGlkIGNvbW1lbnQgY2hhcmFjdGVyLgotCSh0YWJsZV9lbnRyeV9yZWFkKTogU2tpcCBsaW5lcyBjb250YWluaW5nIGEgbGVhZGluZyAiIC0gdGhlc2UgbWF5Ci0gCWV2ZW50dWFsbHkgYmUgdXNlZCBpbiBhIGRpc2FzZW1ibGVyLgotCi1GcmkgRmViIDE0IDE1OjIzOjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogZmlsdGVyLmMsIGZpbHRlci5oLCBnZW4tZW5naW5lLmMsIGdlbi1lbmdpbmUuaCwgZ2VuLWljYWNoZS5jLAotIAlnZW4taWNhY2hlLmgsIGdlbi1pZGVjb2RlLmMsIGdlbi1pZGVjb2RlLmgsIGdlbi1pdGFibGUuYywKLSAJZ2VuLWl0YWJsZS5oLCBnZW4tbW9kZWwuYywgZ2VuLW1vZGVsLmgsIGdlbi1zZW1hbnRpY3MuYywKLSAJZ2VuLXNlbWFudGljcy5oLCBnZW4tc3VwcG9ydC5jLCBnZW4tc3VwcG9ydC5oLCBpZ2VuLmMsIGlnZW4uaCwKLSAJbGQtY2FjaGUuYywgbGQtY2FjaGUuaCwgbGQtZGVjb2RlLmMsIGxkLWRlY29kZS5oLCBsZC1pbnNuLmMsCi0gCWxkLWluc24uaCwgbGYuYywgbGYuaCwgbWlzYy5jLCBtaXNjLmgsIHRhYmxlLmMsIHRhYmxlLmg6IENvcHkgaW4KLSAJZnJvbSB0aGUgLi4vcHBjIGRpcmVjdG9yeS4KLQotCSogZmlsdGVyX2hvc3QuYywgZmlsdGVyX2hvc3QuaDogQ29weSBpbiBmcm9tIHRoZSAuLi9wcGMgZGlyZWN0b3J5Ci0gCXJlbmFtaW5nIGZyb20gZmlsdGVyX2ZpbGVuYW1lLltoY10KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL01ha2VmaWxlLmluIGIvc2ltL2lnZW4vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZmY0YTAuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi1kZWZhdWx0OiBhbGwKLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXNyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4KLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotYmluZGlyID0gQGJpbmRpckAKLWxpYmRpciA9IEBsaWJkaXJACi10b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQotCi1kYXRhZGlyID0gQGRhdGFkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotCi1TSEVMTCA9IEBTSEVMTEAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLUFSID0gQEFSQAotQ0MgPSBAQ0NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotUkFOTElCID0gQFJBTkxJQkAKLQotQVJfRk9SX0JVSUxEID0gQEFSX0ZPUl9CVUlMREAKLUFSX0ZMQUdTX0ZPUl9CVUlMRCA9IEBBUl9GTEFHU19GT1JfQlVJTERACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAotUkFOTElCX0ZPUl9CVUlMRCA9IEBSQU5MSUJfRk9SX0JVSUxEQAotCi1XQVJOX0NGTEFHUyA9IEBXQVJOX0NGTEFHU0AKLVdFUlJPUl9DRkxBR1MgPSBAV0VSUk9SX0NGTEFHU0AKLUlHRU5fV0FSTl9DRkxBR1MgPSAkKFdBUk5fQ0ZMQUdTKQotSUdFTl9XRVJST1JfQ0ZMQUdTID0gJChXRVJST1JfQ0ZMQUdTKQotCi1CSVNPTiA9IGJpc29uCi1NQUtFSU5GTyA9IG1ha2VpbmZvCi0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLUxJQl9JTkNMVURFUwk9IC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUKLUlOQ0xVREVTCT0gLUkuIC1JJChzcmNkaXIpICQoTElCX0lOQ0xVREVTKQotCi1MSUJJQkVSVFlfTElCCT0gQExJQklCRVJUWV9MSUJACi0KLUJVSUxEX0NGTEFHUyA9IFwKLQkkKENGTEFHU19GT1JfQlVJTEQpIFwKLQkkKElHRU5fV0FSTl9DRkxBR1MpIFwKLQkkKElHRU5fV0VSUk9SX0NGTEFHUykgXAotCSQoSU5DTFVERVMpIC1PMAotQlVJTERfTERGTEFHUyA9IAotCi1hbGw6CWlnZW4KLSNhbGw6CXRtcC1maWx0ZXIgdG1wLXRhYmxlIHRtcC1sZC1pbnNuIHRtcC1sZC1jYWNoZSB0bXAtbGQtZGVjb2RlIHRtcC1nZW4KLQotLmMubzoKLQkkKENDX0ZPUl9CVUlMRCkgLWMgJChCVUlMRF9DRkxBR1MpICQ8Ci0KLQotZmlsdGVyX2ZpbGVuYW1lLm86IGZpbHRlcl9maWxlbmFtZS5jIGZpbHRlcl9maWxlbmFtZS5oIGNvbmZpZy5oIHBwYy1jb25maWcuaAotCi1JR0VOX09CSlM9XAotCXRhYmxlLm8gXAotCWxmLm8gbWlzYy5vIFwKLQlmaWx0ZXJfaG9zdC5vIFwKLQlsZC1kZWNvZGUubyBcCi0JbGQtY2FjaGUubyBcCi0JZmlsdGVyLm8gXAotCWxkLWluc24ubyBcCi0JZ2VuLW1vZGVsLm8gXAotCWdlbi1pdGFibGUubyBcCi0JZ2VuLWljYWNoZS5vIFwKLQlnZW4tc2VtYW50aWNzLm8gXAotCWdlbi1pZGVjb2RlLm8gXAotCWdlbi1zdXBwb3J0Lm8gXAotCWdlbi1lbmdpbmUubyBcCi0JZ2VuLm8KLQotaWdlbjogaWdlbi5vICQoSUdFTl9PQkpTKQotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0xERkxBR1MpIC1vIGlnZW4gaWdlbi5vICQoSUdFTl9PQkpTKSAkKExJQklCRVJUWV9MSUIpCi0KLWlnZW4ubzogaWdlbi5jIG1pc2MuaCBmaWx0ZXJfaG9zdC5oIGxmLmggdGFibGUuaCBsZC1kZWNvZGUuaCBsZC1jYWNoZS5oIGxkLWluc24uaCBmaWx0ZXIuaCBnZW4tbW9kZWwuaCBnZW4taXRhYmxlLmggZ2VuLWljYWNoZS5oIGdlbi1pZGVjb2RlLmggZ2VuLWVuZ2luZS5oIGdlbi1zZW1hbnRpY3MuaCBnZW4tc3VwcG9ydC5oIGdlbi5oIGlnZW4uaCAKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9pZ2VuLmMKLQotdG1wLXRhYmxlOiB0YWJsZS5jIHRhYmxlLmggbWlzYy5vIGxmLm8gZmlsdGVyX2hvc3QubyAKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLXRhYmxlIC1ETUFJTiAkKHNyY2RpcikvdGFibGUuYyBtaXNjLm8gbGYubyAgZmlsdGVyX2hvc3QubyAkKEJVSUxEX0xJQlMpCi0KLXRtcC1maWx0ZXI6IGZpbHRlci5jIGZpbHRlci5oIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWZpbHRlciAtRE1BSU4gJChzcmNkaXIpL2ZpbHRlci5jIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQotCi10bXAtbGQtZGVjb2RlOiBsZC1kZWNvZGUuaCBsZC1kZWNvZGUuYyBmaWx0ZXIubyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gZ2VuLmggaWdlbi5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1sZC1kZWNvZGUgLURNQUlOICQoc3JjZGlyKS9sZC1kZWNvZGUuYyBmaWx0ZXIubyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQotCi10bXAtbGQtY2FjaGU6IGxkLWNhY2hlLmMgbGQtY2FjaGUuaCBsZC1pbnNuLm8gbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vIGdlbi5oIGlnZW4uaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyB0bXAtbGQtY2FjaGUgLURNQUlOICQoc3JjZGlyKS9sZC1jYWNoZS5jIGxkLWluc24ubyBmaWx0ZXIubyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQotCi10bXAtbGQtaW5zbjogbGQtaW5zbi5jIGxkLWluc24uaCBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gZmlsdGVyLm8gZ2VuLmggaWdlbi5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1sZC1pbnNuIC1ETUFJTiAkKHNyY2RpcikvbGQtaW5zbi5jIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyBmaWx0ZXIubyAkKEJVSUxEX0xJQlMpCi0KLXRtcC1nZW46IGdlbi5jIGdlbi5oIGxkLWluc24ubyBsZC1kZWNvZGUubyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gZmlsdGVyLm8gZ2VuLmggaWdlbi5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1nZW4gLURNQUlOICQoc3JjZGlyKS9nZW4uYyBtaXNjLm8gbGQtaW5zbi5vIGxkLWRlY29kZS5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vIGZpbHRlci5vICQoQlVJTERfTElCUykKLQotZmlsdGVyX2hvc3QubzogZmlsdGVyX2hvc3QuYyBmaWx0ZXJfaG9zdC5oCi10YWJsZS5vOiB0YWJsZS5jIG1pc2MuaCBmaWx0ZXJfaG9zdC5oIGxmLmggdGFibGUuaAotbGYubzogbGYuYyBtaXNjLmggZmlsdGVyX2hvc3QuaCBsZi5oCi1maWx0ZXIubzogZmlsdGVyLmMgbWlzYy5oIGxmLmggdGFibGUuaCBmaWx0ZXIuaAotbGQtZGVjb2RlLm86IGxkLWRlY29kZS5jIG1pc2MuaCBsZi5oIHRhYmxlLmggbGQtZGVjb2RlLmggaWdlbi5oCi1sZC1jYWNoZS5vOiBsZC1jYWNoZS5jIG1pc2MuaCBsZi5oIHRhYmxlLmggbGQtY2FjaGUuaCBpZ2VuLmgKLWxkLWluc24ubzogbGQtaW5zbi5jIG1pc2MuaCBsZi5oIHRhYmxlLmggbGQtaW5zbi5oIGdlbi5oIGlnZW4uaAotZ2VuLW1vZGVsLm86IGdlbi1tb2RlbC5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLW1vZGVsLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaAotZ2VuLWl0YWJsZS5vOiBnZW4taXRhYmxlLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4taXRhYmxlLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaCBnZW4uaCBmaWx0ZXIuaAotZ2VuLWljYWNoZS5vOiBnZW4taWNhY2hlLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4taWNhY2hlLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaCBnZW4tc2VtYW50aWNzLmggZ2VuLWlkZWNvZGUuaCBmaWx0ZXIuaAotZ2VuLXNlbWFudGljcy5vOiBnZW4tc2VtYW50aWNzLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4tc2VtYW50aWNzLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaCBmaWx0ZXIuaAotZ2VuLWlkZWNvZGUubzogZ2VuLWlkZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pZGVjb2RlLmggZ2VuLWljYWNoZS5oIGdlbi1zZW1hbnRpY3MuaCBsZC1kZWNvZGUuaCBnZW4uaCBpZ2VuLmggbGQtaW5zbi5oICBmaWx0ZXIuaAotZ2VuLWVuZ2luZS5vOiBnZW4tZW5naW5lLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4taWRlY29kZS5oIGdlbi1lbmdpbmUuaCBnZW4taWNhY2hlLmggZ2VuLXNlbWFudGljcy5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmggZmlsdGVyLmgKLWdlbi1zdXBwb3J0Lm86IGdlbi1zdXBwb3J0LmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4tc3VwcG9ydC5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmggZmlsdGVyLmgKLWdlbi5vOiBnZW4uYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pY2FjaGUuaCBsZC1kZWNvZGUuaCBnZW4uaCBpZ2VuLmggbGQtaW5zbi5oIGdlbi1zZW1hbnRpY3MuaCBnZW4taWRlY29kZS5oIGZpbHRlci5oCi1taXNjLm86IG1pc2MuYyBtaXNjLmggZmlsdGVyX2hvc3QuaAotCi0KLXRhZ3MgZXRhZ3M6IFRBR1MKLQotVEFHUzoKLQlldGFncyAkKHNyY2RpcikvKi5oICQoc3JjZGlyKS8qLmMKLQotY2xlYW4gbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgdG1wLSogKi5bb2FzaV0gY29yZSBpZ2VuCi0KLWRpc3RjbGVhbiByZWFsY2xlYW46IGNsZWFuCi0Jcm0gLWYgVEFHUyBNYWtlZmlsZSBjb25maWcuY2FjaGUgY29uZmlnLnN0YXR1cyBjb25maWcuaCBkZWZpbmVzLmggc3RhbXAtaCBjb25maWcubG9nCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCXJtIC1mICp+ICoubG9nIHBwYy1jb25maWcuaCBjb3JlICouY29yZQotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6IGNvbmZpZ3VyZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotaW5zdGFsbDoKLSMKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2FjY29uZmlnLmggYi9zaW0vaWdlbi9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2NvbmZpZy5pbiBiL3NpbS9pZ2VuL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjUxOS4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2NvbmZpZ3VyZSBiL3NpbS9pZ2VuL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ2MDA5Yy4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwxODM4ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1idWlsZC13YXJuaW5nc1s9TElTVF0JCUVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT10YWJsZS5oCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5MzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODYxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSA4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Nzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTAzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTA4OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTM2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCi0gIGJ1aWxkX3dhcm5pbmdzPSItV2FsbCAtV3BvaW50ZXItYXJpdGggLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIgotY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCTs7Ci0gIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKLSAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0JYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKLSAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCi0JYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKLSAgKikJYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKLWZpCi1XQVJOX0NGTEFHUz0iIgotV0VSUk9SX0NGTEFHUz0iIgotaWYgdGVzdCAieCR7YnVpbGRfd2FybmluZ3N9IiAhPSB4IC1hICJ4JEdDQyIgPSB4eWVzCi10aGVuCi0gICMgU2VwYXJhdGUgb3V0IHRoZSAtV2Vycm9yIGZsYWcgYXMgc29tZSBmaWxlcyBqdXN0IGNhbm5vdCBiZQotICAjIGNvbXBpbGVkIHdpdGggaXQgZW5hYmxlZC4KLSAgZm9yIHcgaW4gJHtidWlsZF93YXJuaW5nc307IGRvCi0gICAgY2FzZSAkdyBpbgotICAgIC1XZXJyKikgV0VSUk9SX0NGTEFHUz0tV2Vycm9yIDs7Ci0gICAgKikgV0FSTl9DRkxBR1M9IiR7V0FSTl9DRkxBR1N9ICR3IgotICAgIGVzYWMKLSAgZG9uZQotZmkKLWVsc2UKLSAgYnVpbGRfd2FybmluZ3M9IiIKLWZpCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyIgLWEgIngkaG9zdCIgIT0gInhpMzg2LXdpbmRvd3MiOyB0aGVuCi0gIEFSX0ZPUl9CVUlMRD0nJChBUiknCi0gIEFSX0ZMQUdTX0ZPUl9CVUlMRD0nJChBUl9GTEFHUyknCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIENGTEFHU19GT1JfQlVJTEQ9JyQoQ0ZMQUdTKScKLSAgUkFOTElCX0ZPUl9CVUlMRD0nJChSQU5MSUIpJwotICBMSUJJQkVSVFlfTElCPS4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZWxzZQotICBBUl9GT1JfQlVJTEQ9JHtBUl9GT1JfQlVJTEQtYXJ9Ci0gIEFSX0ZMQUdTX0ZPUl9CVUlMRD0ke0FSX0ZMQUdTX0ZPUl9CVUlMRC1yY30KLSAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KLSAgQ0ZMQUdTX0ZPUl9CVUlMRD0ke0NGTEFHU19GT1JfQlVJTEQtIi1nIn0KLSAgUkFOTElCX0ZPUl9CVUlMRD0ke1JBTkxJQl9GT1JfQlVJTEQtcmFubGlifQotICBMSUJJQkVSVFlfTElCPQotZmkKLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4OTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwNzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE5MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzeXMvc3RhdC5oIHN5cy90eXBlcy5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIzNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEyNDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1hY19oZWFkZXJfZGlyZW50PW5vCi1mb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI3ODogY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgbWFpbigpIHsKLURJUiAqZGlycCA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI5MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl9kaXJlbnRfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIGFjX2hlYWRlcl9kaXJlbnQ9JGFjX2hkcjsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgotaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxNjogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkaXInXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRpciAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1sZGlyIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1NzogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8geCdfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1seCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQxMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ0AlJENDJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBUl9GT1JfQlVJTERAJSRBUl9GT1JfQlVJTEQlZwotcyVAQVJfRkxBR1NfRk9SX0JVSUxEQCUkQVJfRkxBR1NfRk9SX0JVSUxEJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBDRkxBR1NfRk9SX0JVSUxEQCUkQ0ZMQUdTX0ZPUl9CVUlMRCVnCi1zJUBSQU5MSUJfRk9SX0JVSUxEQCUkUkFOTElCX0ZPUl9CVUlMRCVnCi1zJUBMSUJJQkVSVFlfTElCQCUkTElCSUJFUlRZX0xJQiVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlIHgkQ09ORklHX0hFQURFUlMgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2NvbmZpZ3VyZS5pbiBiL3NpbS9pZ2VuL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4MzZkOS4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotQUNfUFJFUkVRKDIuNSlkbmwKLUFDX0lOSVQodGFibGUuaCkKLQotQUNfUFJPR19JTlNUQUxMCi1BQ19QUk9HX0NDCi0KLVNJTV9BQ19PUFRJT05fV0FSTklOR1MKLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyIgLWEgIngkaG9zdCIgIT0gInhpMzg2LXdpbmRvd3MiOyB0aGVuCi0gIEFSX0ZPUl9CVUlMRD0nJChBUiknCi0gIEFSX0ZMQUdTX0ZPUl9CVUlMRD0nJChBUl9GTEFHUyknCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIENGTEFHU19GT1JfQlVJTEQ9JyQoQ0ZMQUdTKScKLSAgUkFOTElCX0ZPUl9CVUlMRD0nJChSQU5MSUIpJwotICBMSUJJQkVSVFlfTElCPS4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZWxzZQotICBBUl9GT1JfQlVJTEQ9JHtBUl9GT1JfQlVJTEQtYXJ9Ci0gIEFSX0ZMQUdTX0ZPUl9CVUlMRD0ke0FSX0ZMQUdTX0ZPUl9CVUlMRC1yY30KLSAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KLSAgQ0ZMQUdTX0ZPUl9CVUlMRD0ke0NGTEFHU19GT1JfQlVJTEQtIi1nIn0KLSAgUkFOTElCX0ZPUl9CVUlMRD0ke1JBTkxJQl9GT1JfQlVJTEQtcmFubGlifQotICBMSUJJQkVSVFlfTElCPQotZmkKLQotCi1BQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uKQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfQVJHX1BST0dSQU0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzeXMvc3RhdC5oIHN5cy90eXBlcy5oIHVuaXN0ZC5oKQotQUNfSEVBREVSX0RJUkVOVAotCi1BQ19TVUJTVChBUl9GT1JfQlVJTEQpCi1BQ19TVUJTVChBUl9GTEFHU19GT1JfQlVJTEQpCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi1BQ19TVUJTVChDRkxBR1NfRk9SX0JVSUxEKQotQUNfU1VCU1QoUkFOTElCX0ZPUl9CVUlMRCkKLUFDX1NVQlNUKExJQklCRVJUWV9MSUIpCi0KLUFDX1NVQlNUKEFSKQotQUNfU1VCU1QoQ0ZMQUdTKQotQUNfUFJPR19SQU5MSUIKLQotQUNfT1VUUFVUKE1ha2VmaWxlLAotW2Nhc2UgeCRDT05GSUdfSEVBREVSUyBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjXSkKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2ZpbHRlci5jIGIvc2ltL2lnZW4vZmlsdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzUxODguLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLXN0cnVjdCBfZmlsdGVyIHsKLSAgY2hhciAqbWVtYmVyOwotICBmaWx0ZXIgKm5leHQ7Ci19OwotCi0KLXZvaWQKLWZpbHRlcl9wYXJzZSAoZmlsdGVyICoqZmlsdGVycywKLQkgICAgICBjb25zdCBjaGFyICpmaWx0KQotewotICB3aGlsZSAoc3RybGVuIChmaWx0KSA+IDApCi0gICAgewotICAgICAgZmlsdGVyICpuZXdfZmlsdGVyOwotICAgICAgZmlsdGVyICoqbGFzdDsKLSAgICAgIC8qIGJyZWFrIG91dCBhIG1lbWJlciBvZiB0aGUgZmlsdGVyIGxpc3QgKi8KLSAgICAgIGNvbnN0IGNoYXIgKmZsYWcgPSBmaWx0OwotICAgICAgdW5zaWduZWQgLypzaXplX3QqLyBsZW47Ci0gICAgICBmaWx0ID0gc3RyY2hyIChmaWx0LCAnLCcpOwotICAgICAgaWYgKGZpbHQgPT0gTlVMTCkKLQl7Ci0JICBmaWx0ID0gc3RyY2hyIChmbGFnLCAnXDAnKTsKLQkgIGxlbiA9IHN0cmxlbiAoZmxhZyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IGZpbHQgLSBmbGFnOwotCSAgZmlsdCA9IGZpbHQgKyAxOwotCX0KLSAgICAgIC8qIGZpbmQgYW4gaW5zZXJ0aW9uIHBvaW50IC0gc29ydGVkIG9yZGVyICovCi0gICAgICBsYXN0ID0gZmlsdGVyczsKLSAgICAgIHdoaWxlICgqbGFzdCAhPSBOVUxMCi0JICAgICAmJiBzdHJuY21wIChmbGFnLCAoKmxhc3QpLT5tZW1iZXIsIGxlbikgPiAwKQotCWxhc3QgPSAmKCpsYXN0KS0+bmV4dDsKLSAgICAgIGlmICgqbGFzdCAhPSBOVUxMCi0JICAmJiBzdHJuY21wIChmbGFnLCAoKmxhc3QpLT5tZW1iZXIsIGxlbikgPT0gMAotCSAgJiYgc3RybGVuICgoKmxhc3QpLT5tZW1iZXIpID09IGxlbikKLQljb250aW51ZTsgLyogZHVwbGljYXRlICovCi0gICAgICAvKiBjcmVhdGUgYW4gZW50cnkgZm9yIHRoYXQgbWVtYmVyICovCi0gICAgICBuZXdfZmlsdGVyID0gWkFMTE9DIChmaWx0ZXIpOwotICAgICAgbmV3X2ZpbHRlci0+bWVtYmVyID0gTlpBTExPQyAoY2hhciwgbGVuICsgMSk7Ci0gICAgICBzdHJuY3B5IChuZXdfZmlsdGVyLT5tZW1iZXIsIGZsYWcsIGxlbik7Ci0gICAgICAvKiBpbnNlcnQgaXQgKi8KLSAgICAgIG5ld19maWx0ZXItPm5leHQgPSAqbGFzdDsKLSAgICAgICpsYXN0ID0gbmV3X2ZpbHRlcjsKLSAgICB9Ci19Ci0KLQotdm9pZAotZmlsdGVyX2FkZCAoZmlsdGVyICoqc2V0LAotCSAgICBmaWx0ZXIgKmFkZCkKLXsKLSAgd2hpbGUgKGFkZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjbXA7Ci0gICAgICBpZiAoKnNldCA9PSBOVUxMKQotCWNtcCA9IDE7IC8qIHNldC0+bWVtYmVyID4gYWRkLT5tZW1iZXIgKi8KLSAgICAgIGVsc2UKLQljbXAgPSBzdHJjbXAgKCgqc2V0KS0+bWVtYmVyLCBhZGQtPm1lbWJlcik7Ci0gICAgICBpZiAoY21wID4gMCkKLQl7Ci0JICAvKiBpbnNlcnQgaXQgaGVyZSAqLwotCSAgZmlsdGVyICpuZXcgPSBaQUxMT0MgKGZpbHRlcik7Ci0JICBuZXctPm1lbWJlciA9IE5aQUxMT0MgKGNoYXIsIHN0cmxlbiAoYWRkLT5tZW1iZXIpICsgMSk7Ci0JICBzdHJjcHkgKG5ldy0+bWVtYmVyLCBhZGQtPm1lbWJlcik7Ci0JICBuZXctPm5leHQgPSAqc2V0OwotCSAgKnNldCA9IG5ldzsKLQkgIGFkZCA9IGFkZC0+bmV4dDsKLQl9Ci0gICAgICBlbHNlIGlmIChjbXAgPT0gMCkKLQl7Ci0JICAvKiBhbHJlYWR5IGluIHNldCAqLwotCSAgYWRkID0gYWRkLT5uZXh0OwotCX0KLSAgICAgIGVsc2UgLyogY21wIDwgMCAqLwotCXsKLQkgIC8qIG5vdCByZWFjaGVkIGluc2VydGlvbiBwb2ludCAqLwotCSAgc2V0ID0gJigqc2V0KS0+bmV4dDsKLQl9Ci0gICAgfQotfQotCi0KLWludAotZmlsdGVyX2lzX3N1YnNldCAoZmlsdGVyICpzdXBlcnNldCwKLQkJICBmaWx0ZXIgKnN1YnNldCkKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IGNtcDsKLSAgICAgIGlmIChzdWJzZXQgPT0gTlVMTCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmIChzdXBlcnNldCA9PSBOVUxMKQotCXJldHVybiAwOyAvKiBzdWJzZXQgaXNuJ3QgZmluaXNoZWQgKi8KLSAgICAgIGNtcCA9IHN0cmNtcCAoc3Vic2V0LT5tZW1iZXIsIHN1cGVyc2V0LT5tZW1iZXIpOwotICAgICAgaWYgKGNtcCA8IDApCi0JcmV0dXJuIDA7IC8qIG5vdCBmb3VuZCAqLwotICAgICAgZWxzZSBpZiAoY21wID09IDApCi0Jc3Vic2V0ID0gc3Vic2V0LT5uZXh0OyAvKiBmb3VuZCAqLwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlzdXBlcnNldCA9IHN1cGVyc2V0LT5uZXh0OyAvKiBsYXRlciBpbiBsaXN0PyAqLwotICAgIH0KLX0KLQotCi1pbnQKLWZpbHRlcl9pc19jb21tb24gKGZpbHRlciAqbCwKLQkJICBmaWx0ZXIgKnIpCi17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCBjbXA7Ci0gICAgICBpZiAobCA9PSBOVUxMKQotCXJldHVybiAwOwotICAgICAgaWYgKHIgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICAgIGNtcCA9IHN0cmNtcCAobC0+bWVtYmVyLCByLT5tZW1iZXIpOwotICAgICAgaWYgKGNtcCA8IDApCi0JbCA9IGwtPm5leHQ7Ci0gICAgICBlbHNlIGlmIChjbXAgPT0gMCkKLQlyZXR1cm4gMTsgLyogY29tbW9uIG1lbWJlciAqLwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlyID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLQotaW50Ci1maWx0ZXJfaXNfbWVtYmVyIChmaWx0ZXIgKmZpbHQsCi0JCSAgY29uc3QgY2hhciAqZmxhZykKLXsKLSAgaW50IGluZGV4ID0gMTsKLSAgd2hpbGUgKGZpbHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChmbGFnLCBmaWx0LT5tZW1iZXIpID09IDApCi0JcmV0dXJuIGluZGV4OwotICAgICAgZmlsdCA9IGZpbHQtPm5leHQ7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1pc19maWx0ZXJlZF9vdXQgKGZpbHRlciAqZmlsdGVycywKLQkJIGNvbnN0IGNoYXIgKmZsYWdzKQotewotICB3aGlsZSAoc3RybGVuKGZsYWdzKSA+IDApIHsKLSAgICBpbnQgcHJlc2VudDsKLSAgICBmaWx0ZXIgKmZpbHQgPSBmaWx0ZXJzOwotICAgIC8qIGJyZWFrIHRoZSBzdHJpbmcgdXAgKi8KLSAgICBjaGFyICplbmQgPSBzdHJjaHIoZmxhZ3MsICcsJyk7Ci0gICAgY2hhciAqbmV4dDsKLSAgICB1bnNpZ25lZCAvKnNpemVfdCovIGxlbjsKLSAgICBpZiAoZW5kID09IE5VTEwpIHsKLSAgICAgIGVuZCA9IHN0cmNocihmbGFncywgJ1wwJyk7Ci0gICAgICBuZXh0ID0gZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5leHQgPSBlbmQgKyAxOwotICAgIH0KLSAgICBsZW4gPSBlbmQgLSBmbGFnczsKLSAgICAvKiBjaGVjayB0aGF0IGl0IGlzIHByZXNlbnQgKi8KLSAgICBwcmVzZW50ID0gMDsKLSAgICBmaWx0ID0gZmlsdGVyczsKLSAgICB3aGlsZSAoZmlsdCAhPSBOVUxMKSB7Ci0gICAgICBpZiAoc3RybmNtcChmbGFncywgZmlsdC0+bWVtYmVyLCBsZW4pID09IDAKLQkgICYmIHN0cmxlbihmaWx0LT5tZW1iZXIpID09IGxlbikgewotCXByZXNlbnQgPSAxOwotCWJyZWFrOwotICAgICAgfQotICAgICAgZmlsdCA9IGZpbHQtPm5leHQ7Ci0gICAgfQotICAgIGlmICghcHJlc2VudCkKLSAgICAgIHJldHVybiAxOwotICAgIGZsYWdzID0gbmV4dDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi0jaWYgMAotaW50Ci1pdF9pcyAoY29uc3QgY2hhciAqZmxhZywKLSAgICAgICBjb25zdCBjaGFyICpmbGFncykKLXsKLSAgaW50IGZsYWdfbGVuID0gc3RybGVuKGZsYWcpOwotICB3aGlsZSAoKmZsYWdzICE9ICdcMCcpIHsKLSAgICBpZiAoIXN0cm5jbXAoZmxhZ3MsIGZsYWcsIGZsYWdfbGVuKQotCSYmIChmbGFnc1tmbGFnX2xlbl0gPT0gJywnIHx8IGZsYWdzW2ZsYWdfbGVuXSA9PSAnXDAnKSkKLSAgICAgIHJldHVybiAxOwotICAgIHdoaWxlICgqZmxhZ3MgIT0gJywnKSB7Ci0gICAgICBpZiAoKmZsYWdzID09ICdcMCcpCi0JcmV0dXJuIDA7Ci0gICAgICBmbGFncysrOwotICAgIH0KLSAgICBmbGFncysrOwotICB9Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotY2hhciAqCi1maWx0ZXJfbmV4dCAoZmlsdGVyICpzZXQsCi0JICAgICBjaGFyICptZW1iZXIpCi17Ci0gIHdoaWxlIChzZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChzZXQtPm1lbWJlciwgbWVtYmVyKSA+IDApCi0JcmV0dXJuIHNldC0+bWVtYmVyOwotICAgICAgc2V0ID0gc2V0LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotdm9pZAotZHVtcF9maWx0ZXIgKGxmICpmaWxlLAotCSAgICAgY2hhciAqcHJlZml4LCAKLQkgICAgIGZpbHRlciAqc2V0LAotCSAgICAgY2hhciAqc3VmZml4KQotewotICBjaGFyICptZW1iZXI7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcHJlZml4KTsKLSAgbWVtYmVyID0gZmlsdGVyX25leHQgKHNldCwgIiIpOwotICBpZiAobWVtYmVyICE9IE5VTEwpCi0gICAgewotICAgICAgd2hpbGUgKDEpCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBtZW1iZXIpOwotCSAgbWVtYmVyID0gZmlsdGVyX25leHQgKHNldCwgbWVtYmVyKTsKLQkgIGlmIChtZW1iZXIgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICBsZl9wcmludGYgKGZpbGUsICIsIik7Ci0JfQotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLSNpZmRlZiBNQUlOCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBmaWx0ZXIgKnN1YnNldCA9IE5VTEw7Ci0gIGZpbHRlciAqc3VwZXJzZXQgPSBOVUxMOwotICBsZiAqbDsKLSAgaW50IGk7Ci0gIGlmIChhcmdjIDwgMikgewotICAgIHByaW50ZigiVXNhZ2U6IGZpbHRlciA8c3Vic2V0PiA8ZmlsdGVyPiAuLi5cbiIpOwotICAgIGV4aXQgKDEpOwotICB9Ci0KLSAgLyogbG9hZCB0aGUgZmlsdGVyIHVwICovCi0gIGZpbHRlcl9wYXJzZSAoJnN1YnNldCwgYXJndlsxXSk7Ci0gIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIAotICAgIGZpbHRlcl9wYXJzZSAoJnN1cGVyc2V0LCBhcmd2W2ldKTsKLQotICAvKiBkdW1wIHZhcmlvdXMgaW5mbyAqLwotICBsID0gbGZfb3BlbiAoIi0iLCAic3Rkb3V0IiwgbGZfb21pdF9yZWZlcmVuY2VzLCBsZl9pc190ZXh0LCAidG1wLWZpbHRlciIpOwotI2lmIDAKLSAgaWYgKGlzX2ZpbHRlcmVkX291dCAoYXJndlsxXSwgc3VwZXJzZXQpKQotICAgIGxmX3ByaW50ZiAobCwgImV4Y2x1ZGVkXG4iKTsKLSAgZWxzZQotICAgIGxmX3ByaW50ZiAobCwgImluY2x1ZGVkXG4iKTsKLSNlbmRpZgotICAvKiBzdWJzZXQgKi8KLSAgewotICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIHN1YnNldCwgIiB9Iik7Ci0gICAgaWYgKGZpbHRlcl9pc19zdWJzZXQgKHN1cGVyc2V0LCBzdWJzZXQpKQotICAgICAgbGZfcHJpbnRmIChsLCAiIHN1YnNldCBvZiAiKTsKLSAgICBlbHNlCi0gICAgICBsZl9wcmludGYgKGwsICIgIXN1YnNldCBvZiAiKTsKLSAgICBkdW1wX2ZpbHRlciAobCwgInsiLCBzdXBlcnNldCwgIiB9Iik7Ci0gICAgbGZfcHJpbnRmIChsLCAiXG4iKTsKLSAgfQotICAvKiBpbnRlcnNlY3Rpb24gKi8KLSAgewotICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIHN1YnNldCwgIiB9Iik7Ci0gICAgaWYgKGZpbHRlcl9pc19jb21tb24gKHN1YnNldCwgc3VwZXJzZXQpKQotICAgICAgbGZfcHJpbnRmIChsLCAiIGludGVyc2VjdHMgIik7Ci0gICAgZWxzZQotICAgICAgbGZfcHJpbnRmIChsLCAiICFpbnRlcnNlY3RzICIpOwotICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIHN1cGVyc2V0LCAiIH0iKTsKLSAgICBsZl9wcmludGYgKGwsICJcbiIpOwotICB9Ci0gIC8qIG1lbWJlcnNoaXAgKi8KLSAgewotICAgIGZpbHRlciAqbWVtYiA9IHN1YnNldDsKLSAgICB3aGlsZSAobWVtYiAhPSBOVUxMKQotICAgICAgewotCWxmX3ByaW50ZiAobCwgIiVzIiwgbWVtYi0+bWVtYmVyKTsKLQlpZiAoZmlsdGVyX2lzX21lbWJlciAoc3VwZXJzZXQsIG1lbWItPm1lbWJlcikpCi0JICBsZl9wcmludGYgKGwsICIgaW4gIik7Ci0JZWxzZQotCSAgbGZfcHJpbnRmIChsLCAiICFpbiAiKTsKLQlkdW1wX2ZpbHRlciAobCwgInsiLCBzdXBlcnNldCwgIiB9Iik7Ci0JbGZfcHJpbnRmIChsLCAiXG4iKTsKLQltZW1iID0gbWVtYi0+bmV4dDsKLSAgICAgIH0KLSAgfQotICAvKiBhZGRpdGlvbiAqLwotICB7Ci0gICAgZmlsdGVyICphZGQgPSBOVUxMOwotICAgIGZpbHRlcl9hZGQgKCZhZGQsIHN1cGVyc2V0KTsKLSAgICBmaWx0ZXJfYWRkICgmYWRkLCBzdWJzZXQpOwotICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIGFkZCwgIiB9Iik7Ci0gICAgbGZfcHJpbnRmIChsLCAiID0gIik7Ci0gICAgZHVtcF9maWx0ZXIgKGwsICJ7Iiwgc3Vic2V0LCAiIH0iKTsKLSAgICBsZl9wcmludGYgKGwsICIgKyAiKTsKLSAgICBkdW1wX2ZpbHRlciAobCwgInsiLCBzdXBlcnNldCwgIiB9Iik7Ci0gICAgbGZfcHJpbnRmIChsLCAiXG4iKTsKLSAgfQotICAgICAgCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9maWx0ZXIuaCBiL3NpbS9pZ2VuL2ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODViODAzLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2ZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogTkIsIGFuIGVtcHR5IGZpbHRlciBpcyBOVUxMICovCi10eXBlZGVmIHN0cnVjdCBfZmlsdGVyIGZpbHRlcjsKLQotCi0vKiBwYXJzZSB0aGUgbGlzdCBtZXJnaW5nIGFueSBmbGFncyBpbnRvIHRoZSBmaWx0ZXIgKi8KLQotZXh0ZXJuIHZvaWQgZmlsdGVyX3BhcnNlCi0oZmlsdGVyICoqZmlsdGVycywKLSBjb25zdCBjaGFyICpmaWx0KTsKLQotCi0vKiBhZGQgdGhlIHNlY29uZCBmaWx0ZXIgdG8gdGhlIGZpcnN0ICovCi0KLWV4dGVybiB2b2lkIGZpbHRlcl9hZGQKLShmaWx0ZXIgKipmaWx0ZXJzLAotIGZpbHRlciAqYWRkKTsKLQotCi0KLS8qIHJldHVybnMgdHJ1ZSBpZiBTVUIgaXMgYSBzdHJpY3Qgc3Vic2V0IG9mIFNVUEVSLiAgRm9yIGFuIGVtcHR5IHNldAotICAgaXMgYSBtZW1iZXIgb2YgYW55IHNldCAqLwotCi1leHRlcm4gaW50IGZpbHRlcl9pc19zdWJzZXQKLShmaWx0ZXIgKnN1cGVyc2V0LAotIGZpbHRlciAqc3Vic2V0KTsKLQotCi0vKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbWVtYmVyIGNvbW1vbiB0byB0aGUgdHdvCi0gICBmaWx0ZXJzICovCi0KLWV4dGVybiBpbnQgZmlsdGVyX2lzX2NvbW1vbgotKGZpbHRlciAqbCwKLSBmaWx0ZXIgKnIpOwotCi0KLS8qIHJldHVybnMgdGhlIGluZGV4IChwb3MgKyAxKSBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgZmlsdGVyLiAgKi8KLQotZXh0ZXJuIGludCBmaWx0ZXJfaXNfbWVtYmVyCi0oZmlsdGVyICpzZXQsCi0gY29uc3QgY2hhciAqZmxhZyk7Ci0KLQotLyogcmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgZmxhZ3MgaXMgbm90IHByZXNlbnQgaW4gdGhlIGZpbHRlci4KLSAgID09PSAhZmlsdGVyX2lzX3N1YnNldCAoZmlsdGVyX3BhcnNlIChOVUxMLCBmbGFncyksIGZpbHRlcnMpICovCi1pbnQgaXNfZmlsdGVyZWRfb3V0Ci0oZmlsdGVyICpmaWx0ZXJzLAotIGNvbnN0IGNoYXIgKmZsYWdzKTsKLQotCi0vKiByZXR1cm5zIHRoZSBuZXh0IG1lbWJlciBvZiB0aGUgZmlsdGVyIHNldCB0aGF0IGZvbGxvd3MgTUVNQkVSLgotICAgTWVtYmVyIGRvZXMgbm90IG5lZWQgdG8gYmUgYW4gZWxlbWVtdCBvZiB0aGUgZmlsdGVyIHNldC4gIE5leHQgb2YKLSAgICIiIGlzIHRoZSBmaXJzdCBub24tZW1wdHkgbWVtYmVyICovCi1jaGFyICpmaWx0ZXJfbmV4dAotKGZpbHRlciAqc2V0LAotIGNoYXIgKm1lbWJlcik7Ci0KLQotCi0vKiBmb3IgZGVidWdnaW5nICovCi0KLWV4dGVybiB2b2lkIGR1bXBfZmlsdGVyCi0obGYgKmZpbGUsCi0gY2hhciAqcHJlZml4LAotIGZpbHRlciAqZmlsdCwKLSBjaGFyICpzdWZmaXgpOwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZmlsdGVyX2hvc3QuYyBiL3NpbS9pZ2VuL2ZpbHRlcl9ob3N0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGM5M2YuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZmlsdGVyX2hvc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiZmlsdGVyX2hvc3QuaCIKLQotLyogU2hvcnRlbiB0cmFjZXMgYnkgZWxpbWluYXRpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgdG8gZmlsZW5hbWVzLiAgKi8KLWNvbnN0IGNoYXIgKgotZmlsdGVyX2ZpbGVuYW1lIChjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZpbGVuYW1lOwotICBjb25zdCBjaGFyICpsYXN0ID0gZmlsZW5hbWU7Ci0gIGludCBjaDsKLQotICB3aGlsZSAoKGNoID0gKnArKykgIT0gJ1wwJyAmJiBjaCAhPSAnOicpCi0gICAgaWYgKGNoID09ICcvJykKLSAgICAgIGxhc3QgPSBwOwotCi0gIHJldHVybiBsYXN0OwotfQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZmlsdGVyX2hvc3QuaCBiL3NpbS9pZ2VuL2ZpbHRlcl9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZmE2YmMuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZmlsdGVyX2hvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaWZuZGVmIF9GSUxURVJfSE9TVF9ICi0jZGVmaW5lIF9GSUxURVJfSE9TVF9ICi0KLS8qIFJlbW92ZSBkaXJlY3RvcnkgcGFydCBmcm9tIGZpbGVuYW1lICovCi1leHRlcm4gY29uc3QgY2hhciAqCi1maWx0ZXJfZmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tZW5naW5lLmMgYi9zaW0vaWdlbi9nZW4tZW5naW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjg2MWUuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZ2VuLWVuZ2luZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImxkLWluc24uaCIKLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLQotI2luY2x1ZGUgImdlbi5oIgotCi0jaW5jbHVkZSAiZ2VuLWlkZWNvZGUuaCIKLSNpbmNsdWRlICJnZW4tZW5naW5lLmgiCi0jaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgotI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChsZiAqZmlsZSkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKCVzRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LKVxuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LKCk7XG4iLAotCSAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2VuZGlmXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2VuZ2luZV9pc3N1ZV9wb3N0Zml4X2hvb2sgKGxmICpmaWxlKQotewotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICBsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZCAoJXNFTkdJTkVfSVNTVUVfUE9TVEZJWF9IT09LKVxuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzRU5HSU5FX0lTU1VFX1BPU1RGSVhfSE9PSygpO1xuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3J1bl9ib2R5IChsZiAqZmlsZSwKLQkgICAgICAgIGdlbl9lbnRyeSAqdGFibGUpCi17Ci0gIC8qIE91dHB1dCB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSByZWFsIGNvZGU6Ci0gICAgIAotICAgICBVbmZvcnR1bmF0bHksIHRoZXJlIGFyZSBtdWx0aXBsZSBjYXNlcyB0byBjb25zaWRlciB2aXM6Ci0gICAgIAotICAgICA8aWNhY2hlPiBYIDxzbXA+Ci0gICAgIAotICAgICBDb25zZXF1ZW50bHkgdGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIGluIG11bHRpcGxlIGRpZmZlcmVudCB3YXlzICovCi0gIAotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIGlmICghb3B0aW9ucy5nZW4uc21wKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBjaWE7XG4iLCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiaW50IGN1cnJlbnRfY3B1ID0gbmV4dF9jcHVfbnI7XG4iKTsKLSAgCi0gIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogZmx1c2ggdGhlIGljYWNoZSBvZiBhIHBvc3NpYmxlIGJyZWFrIGluc24gKi9cbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIGludCBjcHVfbnI7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBucl9jcHVzOyBjcHVfbnIrKylcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICAgIGNwdV9mbHVzaF9pY2FjaGUgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpO1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci0gIAotICBpZiAoIW9wdGlvbnMuZ2VuLnNtcCkKLSAgICB7Ci0gICAgICAKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIgotLyogQ0FTRSAxOiBOTyBTTVAgKHdpdGggb3Igd2l0aCBvdXQgaW5zdHJ1Y3Rpb24gY2FjaGUpLgotCi1JbiB0aGlzIGNhc2UsIHdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50Ci1pbnN0cnVjdGlvbiBhZGRyZXNzIChDSUEpIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVhZCBmcm9tIC8gd3JpdHRlbiB0bwotdGhlIENQVSBvYmplY3QgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiBhbiBpbnN0cnVjdGlvbi4KLQotSW5zdGVhZCwgQ0lBIGlzIG9ubHkgc2F2ZWQgd2hlbiB0aGUgbWFpbiBsb29wIGV4aXRzLiAgVGhpcyBvY2N1cmVzCi13aGVuIGVpdGhlciBzaW1fZW5naW5lX2hhbHQgb3Igc2ltX2VuZ2luZV9yZXN0YXJ0IGlzIGNhbGxlZC4gIEJvdGggb2YKLXRoZXNlIGZ1bmN0aW9ucyBzYXZlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFkZHJlc3MgYmVmb3JlIGhhbHRpbmcgLwotcmVzdGFydGluZyB0aGUgc2ltdWxhdG9yLgotCi1BcyBhIHZhcmlhdGlvbiwgdGhlcmUgbWF5IGFsc28gYmUgc3VwcG9ydCBmb3IgYW4gaW5zdHJ1Y3Rpb24gY3JhY2tpbmcKLWNhY2hlLiAqLwotCi0iKTsKLQotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIi8qIHByaW1lIHRoZSBtYWluIGxvb3AgKi9cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiU0lNX0FTU0VSVCAoY3VycmVudF9jcHUgPT0gMCk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlNJTV9BU1NFUlQgKG5yX2NwdXMgPT0gMSk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImNpYSA9IENJQV9HRVQgKENQVSk7XG4iKTsKLQotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIndoaWxlICgxKVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArNCk7Ci0gICAgICAKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBuaWE7XG4iLAotCQkgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKLQotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlKQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8wID0gSU1FTSVkIChjaWEpO1xuIiwKLQkJICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsCi0JCSAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplKTsKLQkgIHByaW50X2VuZ2luZV9pc3N1ZV9wcmVmaXhfaG9vayAoZmlsZSk7Ci0JICBwcmludF9pZGVjb2RlX2JvZHkgKGZpbGUsIHRhYmxlLCAibmlhID0gIik7Ci0JICBwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGZfcHV0c3RyIChmaWxlLCAiaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkgPVxuIik7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIgIGNwdV9pY2FjaGVfZW50cnkgKGNwdSwgY2lhKTtcbiIpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IGNpYSlcbiIpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKLQkgIGxmX2luZGVudCAoZmlsZSwgLTQpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiLyogY2FjaGUgaGl0ICovXG4iKTsKLQkgIGxmX3B1dHN0ciAoZmlsZSwgImlkZWNvZGVfc2VtYW50aWMgKmNvbnN0IHNlbWFudGljID0gY2FjaGVfZW50cnktPnNlbWFudGljO1xuIik7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICJjaWEgPSBzZW1hbnRpYyAoY3B1LCBjYWNoZV9lbnRyeSwgY2lhKTtcbiIpOwotCSAgLyogdGFpbCAqLwotCSAgbGZfaW5kZW50IChmaWxlLCAtNCk7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiZWxzZVxuIik7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOwotCSAgbGZfaW5kZW50IChmaWxlLCArNCk7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIvKiBjYWNoZSBtaXNzICovXG4iKTsKLQkgIGlmICghb3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQotCSAgICB7Ci0JICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqc2VtYW50aWM7XG4iKTsKLQkgICAgfQotCSAgbGZfcHJpbnRmIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9IElNRU0lZCAoY2lhKTtcbiIsCi0JCSAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplKTsKLQkgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChXSVRIX01PTiAhPSAwKVxuIik7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIgIG1vbl9ldmVudCAobW9uX2V2ZW50X2ljYWNoZV9taXNzLCBjcHUsIGNpYSk7XG4iKTsKLQkgIGlmIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUpCi0JICAgIHsKLQkgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ7XG4iKTsKLQkgICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQkgICAgICBwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOwotCSAgICAgIHByaW50X2lkZWNvZGVfYm9keSAoZmlsZSwgdGFibGUsICJuaWEgPSIpOwotCSAgICAgIHByaW50X2VuZ2luZV9pc3N1ZV9wb3N0Zml4X2hvb2sgKGZpbGUpOwotCSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotCSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOwotCSAgICAgIHByaW50X2lkZWNvZGVfYm9keSAoZmlsZSwgdGFibGUsICJzZW1hbnRpYyA9Iik7Ci0JICAgICAgbGZfcHV0c3RyIChmaWxlLCAibmlhID0gc2VtYW50aWMgKGNwdSwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKLQkgICAgICBwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKLQkgICAgfQotCSAgbGZfaW5kZW50IChmaWxlLCAtNCk7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotCX0KLSAgICAgIAotICAgICAgLyogdXBkYXRlIHRoZSBjcHUgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBzd2l0Y2ggKG9wdGlvbnMuZ2VuLm5pYSkKLQl7Ci0JY2FzZSBuaWFfaXNfY2lhX3BsdXNfb25lOgotCSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqL1xuIik7Ci0JICBsZl9wcmludGYgKGZpbGUsICJjaWEgPSBuaWE7XG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgbmlhX2lzX3ZvaWQ6Ci0JY2FzZSBuaWFfaXNfaW52YWxpZDoKLQkgIEVSUk9SICgiZW5naW5lIGdlbiB3aGVuIE5JQSBjb21wbGV4Iik7Ci0JfQotCi0gICAgICAvKiBldmVudHMgKi8KLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIvKiBwcm9jZXNzIGFueSBldmVudHMgKi9cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKHNpbV9ldmVudHNfdGljayAoc2QpKVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIENJQV9TRVQgKENQVSwgY2lhKTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIHNpbV9ldmVudHNfcHJvY2VzcyAoc2QpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY2lhID0gQ0lBX0dFVCAoQ1BVKTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKLQotICAgICAgbGZfaW5kZW50IChmaWxlLCAtNCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIH1cbiIpOwotICAgIH0KLSAgCi0gIGlmIChvcHRpb25zLmdlbi5zbXApCi0gICAgewotICAgICAgCi0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIKLS8qIENBU0UgMjogU01QIChXaXRoIG9yIHdpdGhvdXQgSUNBQ0hFKQotCi1UaGUgY29tcGxleGl0eSBoZXJlIGNvbWVzIGZyb20gbmVlZGluZyB0byBjb3JyZWN0bHkgaGFsdCB0aGUgc2ltdWxhdG9yCi13aGVuIGl0IGlzIGFib3J0ZWQuICBGb3IgaW5zdGFuY2UsIGlmIGNwdTAgcmVxdWVzdHMgYSByZXN0YXJ0IHRoZW4KLWNwdTEgd2lsbCBub3JtYWxseSBiZSB0aGUgbmV4dCBjcHUgdGhhdCBpcyBydW4uICBDcHUwIGJlaW5nIHJlc3RhcnRlZAotYWZ0ZXIgYWxsIHRoZSBvdGhlciBDUFUncyBhbmQgdGhlIGV2ZW50IHF1ZXVlIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KLQotIik7Ci0gICAgICAKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIvKiBoYXZlIGVuc3VyZWQgdGhhdCB0aGUgZXZlbnQgcXVldWUgaXMgTk9UIG5leHQgKi9cbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiU0lNX0FTU0VSVCAoY3VycmVudF9jcHUgPj0gMCk7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9BU1NFUlQgKGN1cnJlbnRfY3B1IDw9IG5yX2NwdXMgLSAxKTtcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiU0lNX0FTU0VSVCAobnJfY3B1cyA8PSBNQVhfTlJfUFJPQ0VTU09SUyk7XG4iKTsKLQotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIndoaWxlICgxKVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArNCk7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjdXJyZW50X2NwdSk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImluc3RydWN0aW9uX2FkZHJlc3MgY2lhID0gQ0lBX0dFVCAoY3B1KTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLQotICAgICAgaWYgKCFvcHRpb25zLmdlbi5pY2FjaGUpCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8wID0gSU1FTSVkIChjaWEpO1xuIiwKLQkJICAgICBvcHRpb25zLmluc25fYml0X3NpemUpOwotCSAgcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKLQkgIHByaW50X2lkZWNvZGVfYm9keSAoZmlsZSwgdGFibGUsICJjaWEgPSIpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiQ0lBX1NFVCAoY3B1LCBjaWEpO1xuIik7Ci0JICBwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0JewotCSAgbGZfcHV0c3RyIChmaWxlLCAiZW5naW5lX2NhY2hlICpjYWNoZV9lbnRyeSA9XG4iKTsKLQkgIGxmX3B1dHN0ciAoZmlsZSwgIiAgY3B1X2ljYWNoZV9lbnRyeShwcm9jZXNzb3IsIGNpYSk7XG4iKTsKLQkgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoY2FjaGVfZW50cnktPmFkZHJlc3MgPT0gY2lhKSB7XG4iKTsKLQkgIHsKLQkgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgIi8qIGNhY2hlIGhpdCAqL1xuIik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgImVuZ2luZV9zZW1hbnRpYyAqc2VtYW50aWMgPSBjYWNoZV9lbnRyeS0+c2VtYW50aWM7XG4iKTsKLQkgICAgbGZfcHV0c3RyIChmaWxlLCAiY2lhID0gc2VtYW50aWMocHJvY2Vzc29yLCBjYWNoZV9lbnRyeSwgY2lhKTtcbiIpOwotCSAgICAvKiB0YWlsICovCi0JICAgIGxmX3B1dHN0ciAoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgY2lhKTtcbiIpOwotCSAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotCSAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLQkgIH0KLQkgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotCSAgbGZfcHV0c3RyIChmaWxlLCAiZWxzZSB7XG4iKTsKLQkgIHsKLQkgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgIi8qIGNhY2hlIG1pc3MgKi9cbiIpOwotCSAgICBpZiAoIW9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKLQkgICAgICB7Ci0JCWxmX3B1dHN0ciAoZmlsZSwgImVuZ2luZV9zZW1hbnRpYyAqc2VtYW50aWM7XG4iKTsKLQkgICAgICB9Ci0JICAgIGxmX3ByaW50ZiAoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24gPSBJTUVNJWQgKGNpYSk7XG4iLAotCQkgICAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplKTsKLQkgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKFdJVEhfTU9OICE9IDApXG4iKTsKLQkgICAgbGZfcHV0c3RyIChmaWxlLCAiICBtb25fZXZlbnQobW9uX2V2ZW50X2ljYWNoZV9taXNzLCBwcm9jZXNzb3JzW2N1cnJlbnRfY3B1XSwgY2lhKTtcbiIpOwotCSAgICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQotCSAgICAgIHsKLQkJbGZfcHV0c3RyIChmaWxlLCAie1xuIik7Ci0JCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCQlwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOwotCQlwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICJjaWEgPSIpOwotCQlwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKLQkJbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JCWxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKLQkJcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAic2VtYW50aWMgPSAiKTsKLQkJbGZfcHV0c3RyIChmaWxlLCAiY2lhID0gc2VtYW50aWMocHJvY2Vzc29yLCBjYWNoZV9lbnRyeSwgY2lhKTtcbiIpOwotCQlwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKLQkgICAgICB9Ci0JICAgIC8qIHRhaWwgKi8KLQkgICAgbGZfcHV0c3RyIChmaWxlLCAiY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0JICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0JICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotCSAgfQotCSAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0JfQotICAgICAgCi0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiY3VycmVudF9jcHUgKz0gMTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGN1cnJlbnRfY3B1ID09IG5yX2NwdXMpXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAge1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgaWYgKHNpbV9ldmVudHNfdGljayAoc2QpKVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgICB7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgIH1cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGN1cnJlbnRfY3B1ID0gMDtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKLSAgICAgIAotICAgICAgLyogdGFpbCAqLwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtNCk7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotICAgIH0KLSAgCi0gIAotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotcHJpbnRfanVtcCAobGYgKmZpbGUsCi0JICAgIGludCBpc190YWlsKQotewotICBpZiAoIW9wdGlvbnMuZ2VuLnNtcCkKLSAgICB7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoZXZlbnRfcXVldWVfdGljayAoc2QpKVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIENQVV9DSUEgKHByb2Nlc3NvcikgPSBuaWE7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotICAgIH0KLSAgCi0gIGlmIChvcHRpb25zLmdlbi5zbXApCi0gICAgewotICAgICAgaWYgKGlzX3RhaWwpCi0JbGZfcHV0c3RyIChmaWxlLCAiY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBuaWEpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJjdXJyZW50X2NwdSArPSAxO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoY3VycmVudF9jcHUgPj0gbnJfY3B1cylcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgICBzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgfVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3VycmVudF9jcHUgPSAwO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAicHJvY2Vzc29yID0gcHJvY2Vzc29yc1tjdXJyZW50X2NwdV07XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIm5pYSA9IGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3Nvcik7XG4iKTsKLSAgICB9Ci0gIAotICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQotICAgIHsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImNhY2hlX2VudHJ5ID0gY3B1X2ljYWNoZV9lbnRyeShwcm9jZXNzb3IsIG5pYSk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChjYWNoZV9lbnRyeS0+YWRkcmVzcyA9PSBuaWEpIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAvKiBjYWNoZSBoaXQgKi9cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBnb3RvICpjYWNoZV9lbnRyeS0+c2VtYW50aWM7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotICAgICAgaWYgKGlzX3RhaWwpIHsKLQlsZl9wdXRzdHIgKGZpbGUsICJnb3RvIGNhY2hlX21pc3M7XG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIAotICBpZiAoIW9wdGlvbnMuZ2VuLmljYWNoZSAmJiBpc190YWlsKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gZW5naW5lO1xuIik7Ci0gICAgfQotICAKLX0KLSNlbmRpZgotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotcHJpbnRfanVtcF9pbnNuIChsZiAqZmlsZSwKLQkJIGluc25fZW50cnkgKmluc3RydWN0aW9uLAotCQkgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSBvcGNvZGVfZmllbGQgKm9wY29kZXMsCi0JCSBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCi17Ci0gIGluc25fb3Bjb2RlcyBvcGNvZGVfcGF0aDsKLQotICBtZW1zZXQgKCZvcGNvZGVfcGF0aCwgMCwgc2l6ZW9mIChvcGNvZGVfcGF0aCkpOwotICBvcGNvZGVfcGF0aC5vcGNvZGUgPSBvcGNvZGVzOwotCi0gIC8qIHdoYXQgd2UgYXJlIGZvciB0aGUgbW9tZW50ICovCi0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIHByaW50X215X2RlZmluZXMgKGZpbGUsCi0JCSAgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKLQkJICAgIGV4cGFuZGVkX2JpdHMpOwotICAKLSAgLyogb3V0cHV0IHRoZSBpY2FjaGUgZW50cnkgKi8KLSAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCQkgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgZXhwYW5kZWRfYml0cywKLQkJCSAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImNvbnN0IHVuc2lnbmVkX3dvcmQgY2lhID0gbmlhO1xuIik7Ci0gICAgICBwcmludF9pdHJhY2UgKGZpbGUsIGluc3RydWN0aW9uLCAxLypwdXR0aW5nLXZhbHVlLWluLWNhY2hlKi8pOwotICAgICAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sICZvcGNvZGVfcGF0aCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAotCQkJIGluc3RydWN0aW9uLAotCQkJIGV4cGFuZGVkX2JpdHMsCi0JCQkgY2FjaGVfcnVsZXMsCi0JCQkgMCwgLyp1c2VfZGVmaW5lcyovCi0JCQkgcHV0X3ZhbHVlc19pbl9pY2FjaGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiY2FjaGVfZW50cnktPmFkZHJlc3MgPSBuaWE7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX2VudHJ5LT5zZW1hbnRpYyA9ICYmIik7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCQkgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgZXhwYW5kZWRfYml0cywKLQkJCSAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKLSAgICAgIGlmIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUpCi0JewotCSAgcHJpbnRfc2VtYW50aWNfYm9keSAoZmlsZSwKLQkJCSAgICAgICBpbnN0cnVjdGlvbiwKLQkJCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkJICAgICAgICZvcGNvZGVfcGF0aCk7Ci0JICBwcmludF9qdW1wKGZpbGUsIDEvKmlzLXRhaWwqLyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIGdvdG8gIik7Ci0JICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgICAgIGluc3RydWN0aW9uLT5uYW1lLAotCQkJICAgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKLQkJCSAgICAgICBOVUxMLAotCQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIjsgKi9cbiIpOwotCX0KLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotICAgIH0KLSAgCi0gIC8qIHByaW50IHRoZSBzZW1hbnRpY3MgKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJICAgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiOlxuIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgImNvbnN0IHVuc2lnbmVkX3dvcmQgY2lhID0gbmlhO1xuIik7Ci0gIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAotCQkgICAgIGluc3RydWN0aW9uLAotCQkgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgY2FjaGVfcnVsZXMsCi0JCSAgICAgKG9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MKLQkJICAgICAgPyBkZWZpbmVfdmFyaWFibGVzCi0JCSAgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAotCQkgICAgIChvcHRpb25zLmdlbi5pY2FjaGUKLQkJICAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCi0JCSAgICAgIDogZG9fbm90X3VzZV9pY2FjaGUpKTsKLSAgcHJpbnRfc2VtYW50aWNfYm9keSAoZmlsZSwKLQkJICAgICAgIGluc3RydWN0aW9uLAotCQkgICAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICAgICZvcGNvZGVfcGF0aCk7Ci0gIGlmIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzKQotICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAotCQkgICAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgY2FjaGVfcnVsZXMsCi0JCSAgICAgICB1bmRlZl92YXJpYWJsZXMsCi0JCSAgICAgICAob3B0aW9ucy5nZW4uaWNhY2hlCi0JCQk/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKLQkJCTogZG9fbm90X3VzZV9pY2FjaGUpKTsKLSAgcHJpbnRfanVtcChmaWxlLCAxLyppcyB0YWlsKi8pOwotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci19Ci0jZW5kaWYKLQotCi0jaWYgMAotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfZGVmaW5pdGlvbiAobGYgKmZpbGUsCi0JCSAgICAgICBnZW5fZW50cnkgKmVudHJ5LAotCQkgICAgICAgaW50IGRlcHRoLAotCQkgICAgICAgdm9pZCAqZGF0YSkKLXsKLSAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzID0gKGNhY2hlX2VudHJ5KilkYXRhOwotICBpZiAoZW50cnktPm9wY29kZV9ydWxlLT53aXRoX2R1cGxpY2F0ZXMpCi0gICAgewotICAgICAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMQotCSAgICAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAotCSAgICAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAotCSAgICAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKLSAgICAgIEFTU0VSVCAoZW50cnktPm5yX2luc25zID09IDEKLQkgICAgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKLQkgICAgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKLQkgICAgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTAotCSAgICAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlICE9IE5VTEwpOwotICAgICAgcHJpbnRfanVtcF9pbnNuIChmaWxlLAotCQkgICAgICAgZW50cnktPmluc25zLT5pbnNuLAotCQkgICAgICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCSAgICAgICBlbnRyeS0+b3Bjb2RlLAotCQkgICAgICAgY2FjaGVfcnVsZXMpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBwcmludF9qdW1wX2luc24gKGZpbGUsCi0JCSAgICAgICBlbnRyeS0+aW5zbnMtPmluc24sCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgTlVMTCwKLQkJICAgICAgIGNhY2hlX3J1bGVzKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotCi0jaWYgMAotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24gKGxmICpmaWxlLAotCQkJICAgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAotCQkJICAgICAgdm9pZCAqZGF0YSkKLXsKLSAgaWYgKGZ1bmN0aW9uLT5pc19pbnRlcm5hbCkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBmdW5jdGlvbi0+bGluZSk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICBmdW5jdGlvbi0+bmFtZSwKLQkJCSAgIE5VTEwsCi0JCQkgICBOVUxMLAotCQkJICAgTlVMTCwKLQkJCSAgIChvcHRpb25zLmdlbi5pY2FjaGUKLQkJCSAgICA/IGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZQotCQkJICAgIDogZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNvbnN0IHVuc2lnbmVkX3dvcmQgY2lhID0gbmlhO1xuIik7Ci0gICAgICB0YWJsZV9wcmludF9jb2RlIChmaWxlLCBmdW5jdGlvbi0+Y29kZSk7Ci0gICAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImVycm9yKFwiSW50ZXJuYWwgZnVuY3Rpb24gbXVzdCBsb25nanVtcFxcblwiKTtcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotCi0jaWYgMAotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfYm9keSAobGYgKmZpbGUsCi0JCSBnZW5fZW50cnkgKmVudHJ5LAotCQkgaW5zbl90YWJsZSAqaXNhLAotCQkgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgImptcF9idWYgaGFsdDtcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJqbXBfYnVmIHJlc3RhcnQ7XG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiY3B1ICpwcm9jZXNzb3IgPSBOVUxMO1xuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhID0gLTE7XG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9IDA7XG4iKTsKLSAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKLSAgICB7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJlbmdpbmVfY2FjaGUgKmNhY2hlX2VudHJ5ID0gTlVMTDtcbiIpOwotICAgIH0KLSAgaWYgKG9wdGlvbnMuZ2VuLnNtcCkKLSAgICB7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJpbnQgY3VycmVudF9jcHUgPSAtMTtcbiIpOwotICAgIH0KLSAgCi0gIC8qIGFsbCB0aGUgc3dpdGNoZXMgYW5kIHRhYmxlcyAtIHRoZXkga25vdyBhYm91dCBqdW1waW5nICovCi0gIHByaW50X2lkZWNvZGVfbG9va3VwcyAoZmlsZSwgZW50cnksIGNhY2hlX3J1bGVzKTsKLSAgCi0gIC8qIHN0YXJ0IHRoZSBzaW11bGF0aW9uIHVwICovCi0gIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIntcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBpbnQgY3B1X25yO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBjcHVfZmx1c2hfaWNhY2hlKHByb2Nlc3NvcnNbY3B1X25yXSk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOwotICAgIH0KLSAgCi0gIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgInBzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQoc3lzdGVtLCAmaGFsdCwgJnJlc3RhcnQpO1xuIik7Ci0gIAotICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoc2V0am1wKGhhbHQpKVxuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgIiAgcmV0dXJuO1xuIik7Ci0gIAotICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJzZXRqbXAocmVzdGFydCk7XG4iKTsKLSAgCi0gIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0gIGlmICghb3B0aW9ucy5nZW4uc21wKQotICAgIHsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgInByb2Nlc3NvciA9IHByb2Nlc3NvcnNbMF07XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIm5pYSA9IGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3Nvcik7XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJjdXJyZW50X2NwdSA9IHBzaW1fbGFzdF9jcHUoc3lzdGVtKTtcbiIpOwotICAgIH0KLSAgCi0gIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImVuZ2luZTpcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgfQotICAKLSAgcHJpbnRfanVtcChmaWxlLCAwLyppc190YWlsKi8pOwotICAKLSAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX21pc3M6XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgIH0KLSAgCi0JICBwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOwotICBsZl9wdXRzdHIgKGZpbGUsICJpbnN0cnVjdGlvblxuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgIiAgPSB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3NvciksXG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwgbmlhKTtcbiIpOwotICBwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOwotICBwcmludF9pZGVjb2RlX2JvZHkgKGZpbGUsIGVudHJ5LCAiLypJR09SRSovIik7Ci0gIHByaW50X2VuZ2luZV9pc3N1ZV9wb3N0Zml4X2hvb2sgKGZpbGUpOwotICAKLSAgLyogcHJpbnQgb3V0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnRlcm5hbHMgZnVuY3Rpb25zICovCi0gIGZ1bmN0aW9uX2VudHJ5X3RyYXZlcnNlIChmaWxlLCBpc2EtPmZ1bmN0aW9ucywKLQkJCSAgIHByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24sCi0JCQkgICBOVUxMKTsKLSAgCi0gIC8qIHByaW50IG91dCBhIHRhYmxlIG9mIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zICovCi0gIEVSUk9SICgiVXNlIHRoZSBsaXN0IG9mIHNlbWFudGljIGZ1bmN0aW9ucywgbm90IHRyYXZlcmVfdHJlZSIpOwotICBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAoZmlsZSwgZW50cnksCi0JCQkgICAxLAotCQkJICAgTlVMTCwgLyogc3RhcnQgKi8KLQkJCSAgIHByaW50X2p1bXBfZGVmaW5pdGlvbiwgLyogbGVhZiAqLwotCQkJICAgTlVMTCwgLyogZW5kICovCi0JCQkgICBjYWNoZV9ydWxlcyk7Ci0gIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLX0KLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXZvaWQKLXByaW50X2VuZ2luZV9ydW5fZnVuY3Rpb25faGVhZGVyIChsZiAqZmlsZSwKLQkJCQkgIGNoYXIgKnByb2Nlc3NvciwKLQkJCQkgIGZ1bmN0aW9uX2RlY2xfdHlwZSBkZWNsX3R5cGUpCi17Ci0gIGludCBpbmRlbnQ7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIHN3aXRjaCAoZGVjbF90eXBlKQotICAgIHsKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uOgotICAgICAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGUgKGZpbGUsICJ2b2lkIiwgIklOTElORV9FTkdJTkUiLCAiXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKLSAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlIChmaWxlLCAidm9pZCIsICJJTkxJTkVfRU5HSU5FIiwgIiAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ2b2lkICgqIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGluZGVudCA9IHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkJInJ1biIsCi0JCQkJTlVMTCwgLyogZm9ybWF0IG5hbWUgKi8KLQkJCQlwcm9jZXNzb3IsCi0JCQkJTlVMTCwgLyogZXhwYW5kZWQgYml0cyAqLwotCQkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X2VuZ2luZSk7Ci0gIHN3aXRjaCAoZGVjbF90eXBlKQotICAgIHsKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlZmluaXRpb246Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJcbigiKTsKLSAgICAgIGluZGVudCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uOgotICAgICAgaW5kZW50ICs9IGxmX3ByaW50ZiAoZmlsZSwgIiAoIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlOgotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiKVxuKCIpOwotICAgICAgaW5kZW50ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgbGZfaW5kZW50IChmaWxlLCAraW5kZW50KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiU0lNX0RFU0Mgc2QsXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiaW50IG5leHRfY3B1X25yLFxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImludCBucl9jcHVzLFxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImludCBzaWdnbmFsKSIpOwotICBsZl9pbmRlbnQgKGZpbGUsIC1pbmRlbnQpOwotICBzd2l0Y2ggKGRlY2xfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBpc19mdW5jdGlvbl9kZWZpbml0aW9uOgotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6Ci0gICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIjtcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXZvaWQKLWdlbl9lbmdpbmVfaCAobGYgKmZpbGUsCi0JICAgICAgZ2VuX3RhYmxlICpnZW4sCi0JICAgICAgaW5zbl90YWJsZSAqaXNhLAotCSAgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKLXsKLSAgZ2VuX2xpc3QgKmVudHJ5OwotICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgcHJpbnRfZW5naW5lX3J1bl9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCi0JCQkJCShvcHRpb25zLmdlbi5tdWx0aV9zaW0KLQkJCQkJID8gZW50cnktPm1vZGVsLT5uYW1lCi0JCQkJCSA6IE5VTEwpLAotCQkJCQlpc19mdW5jdGlvbl9kZWNsYXJhdGlvbik7Ci0gICAgfQotfQotCi0KLXZvaWQKLWdlbl9lbmdpbmVfYyhsZiAqZmlsZSwKLQkgICAgIGdlbl90YWJsZSAqZ2VuLAotCSAgICAgaW5zbl90YWJsZSAqaXNhLAotCSAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICBnZW5fbGlzdCAqZW50cnk7Ci0gIC8qIHRoZSBpbnRybyAqLwotICBwcmludF9pbmNsdWRlcyAoZmlsZSk7Ci0gIHByaW50X2luY2x1ZGVfaW5saW5lIChmaWxlLCBvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3MpOwotICBwcmludF9pbmNsdWRlIChmaWxlLCBvcHRpb25zLm1vZHVsZS5lbmdpbmUpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcInNpbS1hc3NlcnQuaFwiXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgcHJpbnRfaWRlY29kZV9nbG9iYWxzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChvcHRpb25zLmdlbi5jb2RlKQotCXsKLQljYXNlIGdlbmVyYXRlX2NhbGxzOgotCSAgcHJpbnRfaWRlY29kZV9sb29rdXBzIChmaWxlLCBlbnRyeS0+dGFibGUsIGNhY2hlX3J1bGVzKTsKLQkgIAotCSAgLyogb3V0cHV0IHRoZSBtYWluIGVuZ2luZSByb3V0aW5lICovCi0JICBwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkJICAgIChvcHRpb25zLmdlbi5tdWx0aV9zaW0KLQkJCQkJICAgICA/IGVudHJ5LT5tb2RlbC0+bmFtZQotCQkJCQkgICAgIDogTlVMTCksCi0JCQkJCSAgICBpc19mdW5jdGlvbl9kZWZpbml0aW9uKTsKLQkgIHByaW50X3J1bl9ib2R5IChmaWxlLCBlbnRyeS0+dGFibGUpOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGdlbmVyYXRlX2p1bXBzOgotCSAgRVJST1IgKCJKdW1wcyBjdXJyZW50bHkgdW5pbXBsZW1lbnRlZCIpOwotI2lmIDAKLQkgIHByaW50X2VuZ2luZV9ydW5fZnVuY3Rpb25faGVhZGVyIChmaWxlLAotCQkJCQkgICAgZW50cnktPnByb2Nlc3NvciwKLQkJCQkJICAgIGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pOwotCSAgcHJpbnRfanVtcF9ib2R5IChmaWxlLCBlbnRyeS0+dGFibGUsCi0JCQkgICBpc2EsIGNhY2hlX3J1bGVzKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1lbmdpbmUuaCBiL3NpbS9pZ2VuL2dlbi1lbmdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiZDg3YS4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9nZW4tZW5naW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotZXh0ZXJuIHZvaWQgZ2VuX2VuZ2luZV9oCi0obGYgKmZpbGUsCi0gZ2VuX3RhYmxlICpnZW4sCi0gaW5zbl90YWJsZSAqaXNhLAotIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcyk7Ci0KLWV4dGVybiB2b2lkIGdlbl9lbmdpbmVfYwotKGxmICpmaWxlLAotIGdlbl90YWJsZSAqZ2VuLAotIGluc25fdGFibGUgKmlzYSwKLSBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpOwotCi1leHRlcm4gdm9pZCBwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlcgotKGxmICpmaWxlLAotIGNoYXIgKnByb2Nlc3NvciwKLSBmdW5jdGlvbl9kZWNsX3R5cGUgZGVjbF90eXBlKTsKLQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLWljYWNoZS5jIGIvc2ltL2lnZW4vZ2VuLWljYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQ1ZDQxLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi1pY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1OSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLSNpbmNsdWRlICJpZ2VuLmgiCi0KLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0jaW5jbHVkZSAibGQtZGVjb2RlLmgiCi0KLSNpbmNsdWRlICJnZW4uaCIKLQotI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKLSNpbmNsdWRlICJnZW4taWRlY29kZS5oIgotI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyIChsZiAqZmlsZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotCQkJICAgICAgY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCi0JCQkgICAgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJCSAgICAgIGludCBpc19mdW5jdGlvbl9kZWZpbml0aW9uLAotCQkJICAgICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGZpbGUsIHByaW50X2ljYWNoZV9mdW5jdGlvbl90eXBlLAotCQkJCSAgICAiRVhURVJOX0lDQUNIRSIsICIgIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBiYXNlbmFtZSwgZm9ybWF0X25hbWUsIE5VTEwsCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7Ci0gIHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0gIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLSAgICBsZl9wcmludGYgKGZpbGUsICI7Iik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci19Ci0KLQotdm9pZAotcHJpbnRfaWNhY2hlX2RlY2xhcmF0aW9uIChsZiAqZmlsZSwKLQkJCSAgaW5zbl9lbnRyeSAqaW5zbiwKLQkJCSAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCQkgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKLQkJCSAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIHByaW50X2ljYWNoZV9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCi0JCQkJaW5zbi0+bmFtZSwKLQkJCQlpbnNuLT5mb3JtYXRfbmFtZSwKLQkJCQlleHBhbmRlZF9iaXRzLAotCQkJCTAvKiBpcyBub3QgZnVuY3Rpb24gZGVmaW5pdGlvbiAqLywKLQkJCQlucl9wcmVmZXRjaGVkX3dvcmRzKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pY2FjaGVfZXh0cmFjdGlvbiAobGYgKmZpbGUsCi0JCQkgY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCi0JCQkgY2FjaGVfZW50cnlfdHlwZSBjYWNoZV90eXBlLAotCQkJIGNvbnN0IGNoYXIgKmVudHJ5X25hbWUsCi0JCQkgY29uc3QgY2hhciAqZW50cnlfdHlwZSwKLQkJCSBjb25zdCBjaGFyICplbnRyeV9leHByZXNzaW9uLAotCQkJIGNoYXIgKnNpbmdsZV9pbnNuX2ZpZWxkLAotCQkJIGxpbmVfcmVmICpsaW5lLAotCQkJIGluc25fZmllbGRfZW50cnkgKmN1cl9maWVsZCwKLQkJCSBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJCSBpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKLQkJCSBpY2FjaGVfYm9keV90eXBlIHdoYXRfdG9fZG8pCi17Ci0gIGNvbnN0IGNoYXIgKmV4cHJlc3Npb247Ci0gIG9wY29kZV9iaXRzICpiaXRzOwotICBjaGFyICpyZWFzb247Ci0gIEFTU0VSVCAoZm9ybWF0X25hbWUgIT0gTlVMTCk7Ci0gIEFTU0VSVCAoZW50cnlfbmFtZSAhPSBOVUxMKTsKLSAgCi0gIC8qIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGF0IHNob3VsZCBiZSBnb2luZyBvbiBoZXJlICovCi0gIHN3aXRjaCAoY2FjaGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBzY3JhdGNoX3ZhbHVlOgotICAgICAgaWYgKCh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpCi0JICB8fCB3aGF0X3RvX2RvID09IGRvX25vdF91c2VfaWNhY2hlKQotCXsKLQkgIHJlYXNvbiA9ICJzY3JhdGNoIjsKLQkgIHdoYXRfdG9fZG8gPSBkb19ub3RfdXNlX2ljYWNoZTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb21wdXRlX3ZhbHVlOgotICAgICAgaWYgKCh3aGF0X3RvX2RvICYgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSkKLQkgIHx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpCi0JewotCSAgcmVhc29uID0gImNvbXB1dGUiOwotCSAgd2hhdF90b19kbyA9IGRvX25vdF91c2VfaWNhY2hlOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNhY2hlX3ZhbHVlOgotICAgICAgaWYgKCh3aGF0X3RvX2RlY2xhcmUgIT0gdW5kZWZfdmFyaWFibGVzKQotCSAgfHwgISh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpKQotCXsKLQkgIHJlYXNvbiA9ICJjYWNoZSI7Ci0JICB3aGF0X3RvX2RlY2xhcmUgPSAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKLQkJCSAgICAgPyBkZWNsYXJlX3ZhcmlhYmxlcwotCQkJICAgICA6IHdoYXRfdG9fZGVjbGFyZSk7Ci0JfQotICAgICAgZWxzZQotCXJldHVybjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIC8qIEZvciB0aGUgdHlwZSwgZGVmYXVsdCB0byBhIHNpbXBsZSB1bnNpZ25lZCAqLwotICBpZiAoZW50cnlfdHlwZSA9PSBOVUxMIHx8IHN0cmxlbiAoZW50cnlfdHlwZSkgPT0gMCkKLSAgICBlbnRyeV90eXBlID0gInVuc2lnbmVkIjsKLSAgCi0gIC8qIGxvb2sgdGhyb3VnaCB0aGUgc2V0IG9mIGV4cGFuZGVkIHN1YiBmaWVsZHMgdG8gc2VlIGlmIHRoaXMgZmllbGQKLSAgICAgaGFzIGJlZW4gZ2l2ZW4gYSBjb25zdGFudCB2YWx1ZSAqLwotICBmb3IgKGJpdHMgPSBleHBhbmRlZF9iaXRzOwotICAgICAgIGJpdHMgIT0gTlVMTDsKLSAgICAgICBiaXRzID0gYml0cy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoYml0cy0+ZmllbGQgPT0gY3VyX2ZpZWxkKQotCWJyZWFrOwotICAgIH0KLSAgCi0gIC8qIERlZmluZSBhIHN0b3JhZ2UgYXJlYSBmb3IgdGhlIGNhY2hlIGVsZW1lbnQgKi8KLSAgc3dpdGNoICh3aGF0X3RvX2RlY2xhcmUpCi0gICAgewotICAgIGNhc2UgdW5kZWZfdmFyaWFibGVzOgotICAgICAgLyogV2UndmUgZmluaXNoZWQgd2l0aCB0aGUgI2RlZmluZSB2YWx1ZSAtIGRlc3RvcnkgaXQgKi8KLSAgICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjdW5kZWYgJXNcbiIsIGVudHJ5X25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZGVmaW5lX3ZhcmlhYmxlczoKLSAgICAgIC8qIFVzaW5nIGRpcmVjdCBhY2Nlc3MgZm9yIHRoaXMgZW50cnksIGNsZWFyIGFueSBwcmlvcgotICAgICAgICAgZGVmaW5pdGlvbiwgdGhlbiBkZWZpbmUgaXQgKi8KLSAgICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjdW5kZWYgJXNcbiIsIGVudHJ5X25hbWUpOwotICAgICAgLyogRG9uJ3QgdHlwZSBjYXN0IHBvaW50ZXIgdHlwZXMhICovCi0gICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICAgICAgaWYgKHN0cmNociAoZW50cnlfdHlwZSwgJyonKSAhPSBOVUxMKQotCWxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgJXMgKCIsIGVudHJ5X25hbWUpOwotICAgICAgZWxzZQotCWxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgJXMgKCglcykgIiwgZW50cnlfbmFtZSwgZW50cnlfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRlY2xhcmVfdmFyaWFibGVzOgotICAgICAgLyogdXNpbmcgdmFyaWFibGVzIHRvIGRlZmluZSB0aGUgdmFsdWUgKi8KLSAgICAgIGlmIChsaW5lICE9IE5VTEwpCi0JbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBsaW5lKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIGNvbnN0ICVzIFVOVVNFRCA9ICIsIGVudHJ5X3R5cGUsIGVudHJ5X25hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgCi0gIC8qIGRlZmluZSBhIHZhbHVlIGZvciB0aGF0IHN0b3JhZ2UgYXJlYSBhcyBkZXRlcm1pbmVkIGJ5IHdoYXQgaXMgaW4KLSAgICAgdGhlIGNhY2hlICovCi0gIGlmIChiaXRzICE9IE5VTEwKLSAgICAgICYmIHNpbmdsZV9pbnNuX2ZpZWxkICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAoZW50cnlfbmFtZSwgc2luZ2xlX2luc25fZmllbGQpID09IDAKLSAgICAgICYmIHN0cmNtcCAoZW50cnlfbmFtZSwgY3VyX2ZpZWxkLT52YWxfc3RyaW5nKSA9PSAwCi0gICAgICAmJiAoKGJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbiAmJiBiaXRzLT52YWx1ZSA9PSAwKQotCSAgfHwgKCFiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgY2FjaGUgcnVsZSBpcyBzcGVjaWZ5aW5nIHdoYXQgdG8gZG8gd2l0aCBhIHNpbXBsZQotICAgICAgICAgaW5zdHJ1Y3Rpb24gZmllbGQuCi0JIAotCSBCZWNhdXNlIG9mIGluc3RydWN0aW9uIGV4cGFuc2lvbiwgdGhlIGZpZWxkIGlzIGVpdGhlciBhCi0JIGNvbnN0YW50IHZhbHVlIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgKGJvb2xlYW4KLQkgY29tcGFyaXNvbikuIChUaGUgbGF0dGVyIGluZGljYXRlZCBieSBiaXRzLT52YWx1ZSA9PSAwKS4KLQkgCi0gICAgICAgICBUaGUgY2FzZSBvZiBhIGZpZWxkIG5vdCBiZWluZyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIGJvb2xlYW4KLSAgICAgICAgIHZhbHVlIGlzIGhhbmRsZWQgbGF0ZXIuICovCi0gICAgICBleHByZXNzaW9uID0gImNvbnN0YW50IGZpZWxkIjsKLSAgICAgIEFTU0VSVCAoYml0cy0+ZmllbGQgPT0gY3VyX2ZpZWxkKTsKLSAgICAgIGlmIChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pCi0JewotCSAgQVNTRVJUIChiaXRzLT52YWx1ZSA9PSAwKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIiwgYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiaXRzLT5vcGNvZGUtPmxhc3QgPCBiaXRzLT5maWVsZC0+bGFzdCkKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICIlZCIsCi0JCSAgICAgYml0cy0+dmFsdWUgPDwgKGJpdHMtPmZpZWxkLT5sYXN0IC0gYml0cy0+b3Bjb2RlLT5sYXN0KSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIiwgYml0cy0+dmFsdWUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGJpdHMgIT0gTlVMTAotCSAgICYmIHNpbmdsZV9pbnNuX2ZpZWxkICE9IE5VTEwKLQkgICAmJiBzdHJuY21wIChlbnRyeV9uYW1lLAotCQkgICAgICAgc2luZ2xlX2luc25fZmllbGQsCi0JCSAgICAgICBzdHJsZW4gKHNpbmdsZV9pbnNuX2ZpZWxkKSkgPT0gMAotCSAgICYmIHN0cm5jbXAgKGVudHJ5X25hbWUgKyBzdHJsZW4gKHNpbmdsZV9pbnNuX2ZpZWxkKSwKLQkJICAgICAgICJfaXNfIiwKLQkJICAgICAgIHN0cmxlbiAoIl9pc18iKSkgPT0gMAotCSAgICYmICgoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuCi0JCSYmICgodW5zaWduZWQpIGF0b2wgKGVudHJ5X25hbWUgKyBzdHJsZW4gKHNpbmdsZV9pbnNuX2ZpZWxkKSArIHN0cmxlbiAoIl9pc18iKSkKLQkJICAgID09IGJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCkpCi0JICAgICAgIHx8ICghYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKSkpCi0gICAgewotICAgICAgLyogVGhlIGNhY2hlIHJ1bGUgZGVmaW5lcyBhbiBlbnRyeSBmb3IgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBhCi0JIHNpbmdsZSBpbnN0cnVjdGlvbiBmaWVsZCBhbmQgYSBjb25zdGFudC4gIFRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tcGFyaXNvbiBpbiBzb21ld2F5IG1hdGNoZXMgdGhhdCBvZiB0aGUgb3Bjb2RlIGZpZWxkIHRoYXQKLQkgd2FzIG1hZGUgY29uc3RhbnQgdGhyb3VnaCBleHBhbnNpb24uICovCi0gICAgICBleHByZXNzaW9uID0gImNvbnN0YW50IGNvbXBhcmUiOwotICAgICAgaWYgKGJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbikKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICIlZCAvKiAlcyA9PSAlZCAqLyIsCi0JCSAgICAgYml0cy0+dmFsdWUgPT0gMCwKLQkJICAgICBzaW5nbGVfaW5zbl9maWVsZCwKLQkJICAgICBiaXRzLT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJpdHMtPm9wY29kZS0+bGFzdCA8IGJpdHMtPmZpZWxkLT5sYXN0KQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKLQkJICAgICAoYXRvbCAoZW50cnlfbmFtZSArIHN0cmxlbiAoc2luZ2xlX2luc25fZmllbGQpICsgc3RybGVuICgiX2lzXyIpKQotCQkgICAgICA9PSAoYml0cy0+dmFsdWUgPDwgKGJpdHMtPmZpZWxkLT5sYXN0IC0gYml0cy0+b3Bjb2RlLT5sYXN0KSkpLAotCQkgICAgIHNpbmdsZV9pbnNuX2ZpZWxkLAotCQkgICAgIChiaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKLQkJICAgICAoYXRvbCAoZW50cnlfbmFtZSArIHN0cmxlbiAoc2luZ2xlX2luc25fZmllbGQpICsgc3RybGVuICgiX2lzXyIpKQotCQkgICAgICA9PSBiaXRzLT52YWx1ZSksCi0JCSAgICAgc2luZ2xlX2luc25fZmllbGQsCi0JCSAgICAgYml0cy0+dmFsdWUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBwdXQgdGhlIGZpZWxkIGluIHRoZSBsb2NhbCB2YXJpYWJsZSwgcG9zc2libHkgYWxzbyBlbnRlciBpdAotCSBpbnRvIHRoZSBjYWNoZSAqLwotICAgICAgZXhwcmVzc2lvbiA9ICJleHRyYWN0aW9uIjsKLSAgICAgIC8qIGhhbmRsZSB0aGUgY2FjaGUgKi8KLSAgICAgIGlmICgod2hhdF90b19kbyAmIGdldF92YWx1ZXNfZnJvbV9pY2FjaGUpCi0JICB8fCAod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKSkKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9lbnRyeS0+Y3JhY2suJXMuJXMiLAotCQkgICAgIGZvcm1hdF9uYW1lLAotCQkgICAgIGVudHJ5X25hbWUpOwotCSAgaWYgKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkgLyogYWxzbyBwdXQgaXQgaW4gdGhlIGNhY2hlPyAqLwotCSAgICB7Ci0JICAgICAgbGZfcHJpbnRmIChmaWxlLCAiID0gIik7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKLQkgIHx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpCi0JewotCSAgaWYgKGN1cl9maWVsZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGVudHJ5X2V4cHJlc3Npb24gIT0gTlVMTCAmJiBzdHJsZW4gKGVudHJ5X2V4cHJlc3Npb24pID4gMCkKLQkJZXJyb3IgKGxpbmUsICJJbnN0cnVjdGlvbiBmaWVsZCBlbnRyeSB3aXRoIG5vbmVtcHR5IGV4cHJlc3Npb25cbiIpOwotCSAgICAgIGlmIChjdXJfZmllbGQtPmZpcnN0ID09IDAgJiYgY3VyX2ZpZWxkLT5sYXN0ID09IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIDEpCi0JCWxmX3ByaW50ZiAoZmlsZSwgIihpbnN0cnVjdGlvbl8lZCkiLAotCQkJICAgY3VyX2ZpZWxkLT53b3JkX25yKTsKLQkgICAgICBlbHNlIGlmIChjdXJfZmllbGQtPmxhc3QgPT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKLQkJbGZfcHJpbnRmIChmaWxlLCAiTUFTS0VEJWQgKGluc3RydWN0aW9uXyVkLCAlZCwgJWQpIiwKLQkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSwKLQkJCSAgIGN1cl9maWVsZC0+d29yZF9uciwKLQkJCSAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgY3VyX2ZpZWxkLT5maXJzdCksCi0JCQkgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIGN1cl9maWVsZC0+bGFzdCkpOwotCSAgICAgIGVsc2UKLQkJbGZfcHJpbnRmIChmaWxlLCAiRVhUUkFDVEVEJWQgKGluc3RydWN0aW9uXyVkLCAlZCwgJWQpIiwKLQkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSwKLQkJCSAgIGN1cl9maWVsZC0+d29yZF9uciwKLQkJCSAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgY3VyX2ZpZWxkLT5maXJzdCksCi0JCQkgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIGN1cl9maWVsZC0+bGFzdCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyIsIGVudHJ5X2V4cHJlc3Npb24pOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIHN3aXRjaCAod2hhdF90b19kZWNsYXJlKQotICAgIHsKLSAgICBjYXNlIGRlZmluZV92YXJpYWJsZXM6Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHVuZGVmX3ZhcmlhYmxlczoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZGVjbGFyZV92YXJpYWJsZXM6Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI7Iik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgQVNTRVJUIChyZWFzb24gIT0gTlVMTCAmJiBleHByZXNzaW9uICE9IE5VTEwpOwotICBsZl9wcmludGYgKGZpbGUsICIgLyogJXMgLSAlcyAqL1xuIiwgcmVhc29uLCBleHByZXNzaW9uKTsKLX0KLQotCi12b2lkCi1wcmludF9pY2FjaGVfYm9keSAobGYgKmZpbGUsCi0JCSAgIGluc25fZW50cnkgKmluc3RydWN0aW9uLAotCQkgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotCQkgICBpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKLQkJICAgaWNhY2hlX2JvZHlfdHlwZSB3aGF0X3RvX2RvLAotCQkgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKLXsKLSAgLyogZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMgKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAiLyogRXh0cmFjdGlvbjogJXNcbiIsIGluc3RydWN0aW9uLT5uYW1lKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAiKTsKLSAgc3dpdGNoICh3aGF0X3RvX2RlY2xhcmUpCi0gICAgewotICAgIGNhc2UgZGVmaW5lX3ZhcmlhYmxlczoKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZGVjbGFyZV92YXJpYWJsZXM6Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJkZWNsYXJlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHVuZGVmX3ZhcmlhYmxlczoKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIgIik7Ci0gIHN3aXRjaCAod2hhdF90b19kbykKLSAgICB7Ci0gICAgY2FzZSBnZXRfdmFsdWVzX2Zyb21faWNhY2hlOgotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiZ2V0LXZhbHVlcy1mcm9tLWljYWNoZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwdXRfdmFsdWVzX2luX2ljYWNoZToKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInB1dC12YWx1ZXMtaW4taWNhY2hlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJvdGhfdmFsdWVzX2FuZF9pY2FjaGU6Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJnZXQtdmFsdWVzLWZyb20taWNhY2hlfHB1dC12YWx1ZXMtaW4taWNhY2hlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRvX25vdF91c2VfaWNhY2hlOgotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiZG8tbm90LXVzZS1pY2FjaGUiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4gICAgICIpOwotICBwcmludF9pbnNuX3dvcmRzIChmaWxlLCBpbnN0cnVjdGlvbik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICovXG4iKTsKLSAgCi0gIC8qIHBhc3MgemVybyAtIGZldGNoIGZyb20gbWVtb3J5IGFueSBtaXNzaW5nIGluc3RydWN0aW9ucy4KLQotICAgICBTb21lIG9mIHRoZSBpbnN0cnVjdGlvbnMgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBmZXRjaGVkIChpbiB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYXJyYXkpLCBvdGhlcnMgd2lsbCBzdGlsbCBuZWVkIGZldGNoaW5nLiAqLwotICBzd2l0Y2ggKHdoYXRfdG9fZG8pCi0gICAgewotICAgIGNhc2UgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHV0X3ZhbHVlc19pbl9pY2FjaGU6Ci0gICAgY2FzZSBib3RoX3ZhbHVlc19hbmRfaWNhY2hlOgotICAgIGNhc2UgZG9fbm90X3VzZV9pY2FjaGU6Ci0gICAgICB7Ci0JaW50IHdvcmRfbnI7Ci0Jc3dpdGNoICh3aGF0X3RvX2RlY2xhcmUpCi0JICB7Ci0JICBjYXNlIHVuZGVmX3ZhcmlhYmxlczoKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGRlZmluZV92YXJpYWJsZXM6Ci0JICBjYXNlIGRlY2xhcmVfdmFyaWFibGVzOgotCSAgICBmb3IgKHdvcmRfbnIgPSBucl9wcmVmZXRjaGVkX3dvcmRzOwotCQkgd29yZF9uciA8IGluc3RydWN0aW9uLT5ucl93b3JkczsKLQkJIHdvcmRfbnIrKykKLQkgICAgICB7Ci0JCS8qIEZJWE1FIC0gc2hvdWxkIGJlIHVzaW5nIHByaW50X2ljYWNoZV9leHRyYWN0aW9uPyAqLwotCQlsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fJWQgVU5VU0VEID0gIiwKLQkJCSAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCwKLQkJCSAgIHdvcmRfbnIpOwotCQlsZl9wcmludGYgKGZpbGUsICJJTUVNJWRfSU1NRUQgKGNpYSwgJWQpIiwKLQkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSwgd29yZF9ucik7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgLyogaWYgcHV0dGluZyB0aGUgaW5zdHJ1Y3Rpb24gd29yZHMgaW4gdGhlIGNhY2hlLCBkZWZpbmUgcmVmZXJlbmNlcwotICAgICBmb3IgdGhlbSAqLwotICBpZiAob3B0aW9ucy5nZW4uaW5zbl9pbl9pY2FjaGUpIHsKLSAgICAvKiBGSVhNRTogaXMgdGhlIGluc3RydWN0aW9uX3dvcmQgdHlwZSBjb3JyZWN0PyAqLwotICAgIHByaW50X2ljYWNoZV9leHRyYWN0aW9uIChmaWxlLAotCQkJICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkgICAgIGNhY2hlX3ZhbHVlLAotCQkJICAgICAiaW5zbiIsIC8qIG5hbWUgKi8KLQkJCSAgICAgImluc3RydWN0aW9uX3dvcmQiLCAvKiB0eXBlICovCi0JCQkgICAgICJpbnN0cnVjdGlvbiIsIC8qIGV4cHJlc3Npb24gKi8KLQkJCSAgICAgTlVMTCwgLyogb3JpZ2luICovCi0JCQkgICAgIE5VTEwsIC8qIGxpbmUgKi8KLQkJCSAgICAgTlVMTCwgTlVMTCwKLQkJCSAgICAgd2hhdF90b19kZWNsYXJlLAotCQkJICAgICB3aGF0X3RvX2RvKTsKLSAgfQotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgLyogcGFzcyBvbmUgLSBwcm9jZXNzIGluc3RydWN0aW9uIGZpZWxkcy4KLQotICAgICBJZiB0aGVyZSBpcyBubyBjYWNoZSBydWxlLCB0aGUgZGVmYXVsdCBpcyB0byBlbnRlciB0aGUgZmllbGQgaW50bwotICAgICB0aGUgY2FjaGUgKi8KLSAgewotICAgIGluc25fd29yZF9lbnRyeSAqd29yZDsKLSAgICBmb3IgKHdvcmQgPSBpbnN0cnVjdGlvbi0+d29yZHM7Ci0JIHdvcmQgIT0gTlVMTDsKLQkgd29yZCA9IHdvcmQtPm5leHQpCi0gICAgICB7Ci0JaW5zbl9maWVsZF9lbnRyeSAqY3VyX2ZpZWxkOwotCWZvciAoY3VyX2ZpZWxkID0gd29yZC0+Zmlyc3Q7Ci0JICAgICBjdXJfZmllbGQtPmZpcnN0IDwgb3B0aW9ucy5pbnNuX2JpdF9zaXplOwotCSAgICAgY3VyX2ZpZWxkID0gY3VyX2ZpZWxkLT5uZXh0KQotCSAgewotCSAgICBpZiAoY3VyX2ZpZWxkLT50eXBlID09IGluc25fZmllbGRfc3RyaW5nKQotCSAgICAgIHsKLQkJY2FjaGVfZW50cnkgKmNhY2hlX3J1bGU7Ci0JCWNhY2hlX2VudHJ5X3R5cGUgdmFsdWVfdHlwZSA9IGNhY2hlX3ZhbHVlOwotCQlsaW5lX3JlZiAqdmFsdWVfbGluZSA9IGluc3RydWN0aW9uLT5saW5lOwotCQkvKiBjaGVjayB0aGUgY2FjaGUgdGFibGUgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGEgcnVsZQotCQkgICBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGNhY2hlIGFjdGlvbiBmb3IgYW4KLQkJICAgaW5zdHJ1Y3Rpb24gZmllbGQgKi8KLQkJZm9yIChjYWNoZV9ydWxlID0gY2FjaGVfcnVsZXM7Ci0JCSAgICAgY2FjaGVfcnVsZSAhPSBOVUxMOwotCQkgICAgIGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmIChmaWx0ZXJfaXNfc3Vic2V0IChpbnN0cnVjdGlvbi0+ZmllbGRfbmFtZXMsCi0JCQkJCSAgY2FjaGVfcnVsZS0+b3JpZ2luYWxfZmllbGRzKQotCQkJJiYgc3RyY21wIChjYWNoZV9ydWxlLT5uYW1lLCBjdXJfZmllbGQtPnZhbF9zdHJpbmcpID09IDApCi0JCSAgICAgIHsKLQkJCXZhbHVlX3R5cGUgPSBjYWNoZV9ydWxlLT5lbnRyeV90eXBlOwotCQkJdmFsdWVfbGluZSA9IGNhY2hlX3J1bGUtPmxpbmU7Ci0JCQlpZiAodmFsdWVfdHlwZSA9PSBjb21wdXRlX3ZhbHVlKQotCQkJICB7Ci0JCQkgICAgb3B0aW9ucy53YXJuaW5nIChjYWNoZV9ydWxlLT5saW5lLAotCQkJCQkgICAgICJpbnN0cnVjdGlvbiBmaWVsZCBvZiB0eXBlIGBjb21wdXRlJyBjaGFuZ2VkIHRvIGBjYWNoZSdcbiIpOwotCQkJICAgIGNhY2hlX3J1bGUtPmVudHJ5X3R5cGUgPSBjYWNoZV92YWx1ZTsKLQkJCSAgfQotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCS8qIERlZmluZSBhbiBlbnRyeSBmb3IgdGhlIGZpZWxkIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiAqLwotCQlwcmludF9pY2FjaGVfZXh0cmFjdGlvbiAoZmlsZSwKLQkJCQkJIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKLQkJCQkJIHZhbHVlX3R5cGUsCi0JCQkJCSBjdXJfZmllbGQtPnZhbF9zdHJpbmcsIC8qIG5hbWUgKi8KLQkJCQkJIE5VTEwsIC8qIHR5cGUgKi8KLQkJCQkJIE5VTEwsIC8qIGV4cHJlc3Npb24gKi8KLQkJCQkJIGN1cl9maWVsZC0+dmFsX3N0cmluZywgLyogaW5zbiBmaWVsZCAqLwotCQkJCQkgdmFsdWVfbGluZSwKLQkJCQkJIGN1cl9maWVsZCwKLQkJCQkJIGV4cGFuZGVkX2JpdHMsCi0JCQkJCSB3aGF0X3RvX2RlY2xhcmUsCi0JCQkJCSB3aGF0X3RvX2RvKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBwYXNzIHR3byAtIGFueSBjYWNoZSBmaWVsZHMgbm90IHByb2Nlc3NlZCBhYm92ZSAqLwotICB7Ci0gICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGU7Ci0gICAgZm9yIChjYWNoZV9ydWxlID0gY2FjaGVfcnVsZXM7Ci0JIGNhY2hlX3J1bGUgIT0gTlVMTDsKLQkgY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGUtPm5leHQpCi0gICAgICB7Ci0JaWYgKGZpbHRlcl9pc19zdWJzZXQgKGluc3RydWN0aW9uLT5maWVsZF9uYW1lcywKLQkJCSAgICAgIGNhY2hlX3J1bGUtPm9yaWdpbmFsX2ZpZWxkcykKLQkgICAgJiYgIWZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5maWVsZF9uYW1lcywKLQkJCQkgIGNhY2hlX3J1bGUtPm5hbWUpKQotCSAgewotCSAgICBjaGFyICpzaW5nbGVfZmllbGQgPSBmaWx0ZXJfbmV4dCAoY2FjaGVfcnVsZS0+b3JpZ2luYWxfZmllbGRzLCAiIik7Ci0JICAgIGlmIChmaWx0ZXJfbmV4dCAoY2FjaGVfcnVsZS0+b3JpZ2luYWxfZmllbGRzLCBzaW5nbGVfZmllbGQpICE9IE5VTEwpCi0JICAgICAgc2luZ2xlX2ZpZWxkID0gTlVMTDsKLQkgICAgcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24gKGZpbGUsCi0JCQkJICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkJICAgICBjYWNoZV9ydWxlLT5lbnRyeV90eXBlLAotCQkJCSAgICAgY2FjaGVfcnVsZS0+bmFtZSwKLQkJCQkgICAgIGNhY2hlX3J1bGUtPnR5cGUsCi0JCQkJICAgICBjYWNoZV9ydWxlLT5leHByZXNzaW9uLAotCQkJCSAgICAgc2luZ2xlX2ZpZWxkLAotCQkJCSAgICAgY2FjaGVfcnVsZS0+bGluZSwKLQkJCQkgICAgIE5VTEwsIC8qIGN1cl9maWVsZCAqLwotCQkJCSAgICAgZXhwYW5kZWRfYml0cywKLQkJCQkgICAgIHdoYXRfdG9fZGVjbGFyZSwKLQkJCQkgICAgIHdoYXRfdG9fZG8pOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7Ci19Ci0KLQotCi10eXBlZGVmIHN0cnVjdCBfZm9ybV9maWVsZHMgZm9ybV9maWVsZHM7Ci1zdHJ1Y3QgX2Zvcm1fZmllbGRzIHsKLSAgY2hhciAqbmFtZTsKLSAgZmlsdGVyICpmaWVsZHM7Ci0gIGZvcm1fZmllbGRzICpuZXh0OwotfTsKLQotc3RhdGljIGZvcm1fZmllbGRzICoKLWluc25fdGFibGVfY2FjaGVfZmllbGRzIChpbnNuX3RhYmxlICppc2EpCi17Ci0gIGZvcm1fZmllbGRzICpmb3JtcyA9IE5VTEw7Ci0gIGluc25fZW50cnkgKmluc247Ci0gIGZvciAoaW5zbiA9IGlzYS0+aW5zbnM7Ci0gICAgICAgaW5zbiAhPSBOVUxMOwotICAgICAgIGluc24gPSBpbnNuLT5uZXh0KSB7Ci0gICAgZm9ybV9maWVsZHMgKipmb3JtID0gJmZvcm1zOwotICAgIHdoaWxlICgxKQotICAgICAgewotCWlmICgqZm9ybSA9PSBOVUxMKQotCSAgewotCSAgICAvKiBuZXcgZm9ybWF0IG5hbWUsIGFkZCBpdCAqLwotCSAgICBmb3JtX2ZpZWxkcyAqbmV3X2Zvcm0gPSBaQUxMT0MgKGZvcm1fZmllbGRzKTsKLQkgICAgbmV3X2Zvcm0tPm5hbWUgPSBpbnNuLT5mb3JtYXRfbmFtZTsKLQkgICAgZmlsdGVyX2FkZCAoJm5ld19mb3JtLT5maWVsZHMsIGluc24tPmZpZWxkX25hbWVzKTsKLQkgICAgKmZvcm0gPSBuZXdfZm9ybTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZWxzZSBpZiAoc3RyY21wICgoKmZvcm0pLT5uYW1lLCBpbnNuLT5mb3JtYXRfbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgLyogYWxyZWFkeSBwcmVzZW50LCBhZGQgZmllbGQgbmFtZXMgdG8gdGhlIGV4aXN0aW5nIGxpc3QgKi8KLQkgICAgZmlsdGVyX2FkZCAoJigqZm9ybSktPmZpZWxkcywgaW5zbi0+ZmllbGRfbmFtZXMpOwotCSAgICBicmVhazsKLQkgIH0KLQlmb3JtID0gJigqZm9ybSktPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIGZvcm1zOwotfQotCi0KLQotZXh0ZXJuIHZvaWQKLXByaW50X2ljYWNoZV9zdHJ1Y3QgKGxmICpmaWxlLAotCQkgICAgIGluc25fdGFibGUgKmlzYSwKLQkJICAgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCi17Ci0gIC8qIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gZm9ybWF0cyB3aXRoIHRoZWlyCi0gICAgIGNvcnJlc3BvbmRpbmcgZmllbGQgbmFtZXMuICovCi0gIGZvcm1fZmllbGRzICpmb3JtYXRzID0gaW5zbl90YWJsZV9jYWNoZV9maWVsZHMgKGlzYSk7Ci0gIAotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lIFdJVEhfJXNJREVDT0RFX0NBQ0hFX1NJWkUgJWRcbiIsCi0JICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LnUsCi0JICAgICAob3B0aW9ucy5nZW4uaWNhY2hlID8gb3B0aW9ucy5nZW4uaWNhY2hlX3NpemUgOiAwKSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIAotICAvKiBjcmVhdGUgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUgaWYgYmVpbmcgdXNlZCAqLwotICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKSB7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgXyVzaWRlY29kZV9jYWNoZSB7XG4iLAotCSAgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgIHsKLSAgICAgIGZvcm1fZmllbGRzICpmb3JtYXQ7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ1bnNpZ25lZF93b3JkIGFkZHJlc3M7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInZvaWQgKnNlbWFudGljO1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ1bmlvbiB7XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgICAgZm9yIChmb3JtYXQgPSBmb3JtYXRzOwotCSAgIGZvcm1hdCAhPSBOVUxMOwotCSAgIGZvcm1hdCA9IGZvcm1hdC0+bmV4dCkKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICJzdHJ1Y3Qge1xuIik7Ci0JICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQkgIHsKLQkgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGU7Ci0JICAgIGNoYXIgKmZpZWxkOwotCSAgICAvKiBzcGFjZSBmb3IgYW55IGluc3RydWN0aW9uIHdvcmRzICovCi0JICAgIGlmIChvcHRpb25zLmdlbi5pbnNuX2luX2ljYWNoZSkKLQkgICAgICBsZl9wcmludGYgKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc25bJWRdO1xuIiwgaXNhLT5tYXhfbnJfd29yZHMpOwotCSAgICAvKiBkZWZpbmUgYW4gZW50cnkgZm9yIGFueSBhcHBsaWNhYmxlIGNhY2hlIHJ1bGVzICovCi0JICAgIGZvciAoY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGVzOwotCQkgY2FjaGVfcnVsZSAhPSBOVUxMOwotCQkgY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGUtPm5leHQpCi0JICAgICAgewotCQkvKiBuYiAtIHNvcnQgb2YgY29ycmVjdCAtIHNob3VsZCByZWFsbHkgY2hlY2sgYWdhaW5zdAotICAgICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb25zICovCi0JCWlmIChmaWx0ZXJfaXNfc3Vic2V0IChmb3JtYXQtPmZpZWxkcywgY2FjaGVfcnVsZS0+b3JpZ2luYWxfZmllbGRzKSkKLQkJICB7Ci0JCSAgICBjaGFyICptZW1iOwotCQkgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMgJXM7IiwKLQkJCSAgICAgICAoY2FjaGVfcnVsZS0+dHlwZSA9PSBOVUxMCi0JCQkJPyAidW5zaWduZWQiIAotCQkJCTogY2FjaGVfcnVsZS0+dHlwZSksCi0JCQkgICAgICAgY2FjaGVfcnVsZS0+bmFtZSk7Ci0JCSAgICBsZl9wcmludGYgKGZpbGUsICIgLyoiKTsKLQkJICAgIGZvciAobWVtYiA9IGZpbHRlcl9uZXh0IChjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMsICIiKTsKLQkJCSBtZW1iICE9IE5VTEw7Ci0JCQkgbWVtYiA9IGZpbHRlcl9uZXh0IChjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMsIG1lbWIpKQotCQkgICAgICB7Ci0JCQlsZl9wcmludGYgKGZpbGUsICIgJXMiLCBtZW1iKTsKLQkJICAgICAgfQotCQkgICAgbGZfcHJpbnRmIChmaWxlLCAiICovXG4iKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAvKiBkZWZpbmUgYW4gZW50cnkgZm9yIGFueSBmaWVsZHMgbm90IGNvdmVyZWQgYnkgYSBjYWNoZSBydWxlICovCi0JICAgIGZvciAoZmllbGQgPSBmaWx0ZXJfbmV4dCAoZm9ybWF0LT5maWVsZHMsICIiKTsKLQkJIGZpZWxkICE9IE5VTEw7Ci0JCSBmaWVsZCA9IGZpbHRlcl9uZXh0IChmb3JtYXQtPmZpZWxkcywgZmllbGQpKQotCSAgICAgIHsKLQkJY2FjaGVfZW50cnkgKmNhY2hlX3J1bGU7Ci0JCWludCBmb3VuZF9ydWxlID0gMDsKLQkJZm9yIChjYWNoZV9ydWxlID0gY2FjaGVfcnVsZXM7Ci0JCSAgICAgY2FjaGVfcnVsZSAhPSBOVUxMOwotCQkgICAgIGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmIChzdHJjbXAgKGNhY2hlX3J1bGUtPm5hbWUsIGZpZWxkKSA9PSAwKQotCQkgICAgICB7Ci0JCQlmb3VuZF9ydWxlID0gMTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQlpZiAoIWZvdW5kX3J1bGUpCi0JCSAgbGZfcHJpbnRmIChmaWxlLCAidW5zaWduZWQgJXM7IC8qIGRlZmF1bHQgKi9cbiIsIGZpZWxkKTsKLQkgICAgICB9Ci0JICB9Ci0JICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIn0gJXM7XG4iLCBmb3JtYXQtPm5hbWUpOwotCX0KLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAifSBjcmFjaztcbiIpOwotICAgIH0KLSAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICJ9ICVzaWRlY29kZV9jYWNoZTtcbiIsIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFsZXJuYXRpdmx5LCBzaW5jZSBubyBjYWNoZSwgZW1pdCBhIGR1bW15IGRlZmluaXRpb24gZm9yCi0JIGlkZWNvZGVfY2FjaGUgc28gdGhhdCBjb2RlIHJlZmVyaW5nIHRvIHRoZSB0eXBlIGNhbiBzdGlsbCBjb21waWxlICovCi0gICAgICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgdm9pZCAlc2lkZWNvZGVfY2FjaGU7XG4iLAotCQlvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pY2FjaGVfZnVuY3Rpb24gKGxmICpmaWxlLAotCQkgICAgICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0JCSAgICAgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJICAgICAgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKLQkJICAgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKLQkJICAgICAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICBpbnQgaW5kZW50OwotCi0gIC8qIGdlbmVyYXRlIGNvZGUgdG8gZW50ZXIgZGVjb2RlZCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBpY2FjaGUgKi8KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUsCi0JCQkJICAgICJFWFRFUk5fSUNBQ0hFIiwgIlxuIik7Ci0gIGluZGVudCA9IHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkJaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCQkJaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAotCQkJCU5VTEwsCi0JCQkJZXhwYW5kZWRfYml0cywKLQkJCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOwotICBpbmRlbnQgKz0gbGZfcHJpbnRmIChmaWxlLCAiICIpOwotICBsZl9pbmRlbnQgKGZpbGUsICtpbmRlbnQpOwotICBsZl9wcmludGYgKGZpbGUsICIoIik7Ci0gIHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICBsZl9wcmludGYgKGZpbGUsICIpXG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKLSAgCi0gIC8qIGZ1bmN0aW9uIGhlYWRlciAqLwotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIAotICBwcmludF9teV9kZWZpbmVzIChmaWxlLAotCQkgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCSAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCSAgICBleHBhbmRlZF9iaXRzKTsKLSAgcHJpbnRfaXRyYWNlIChmaWxlLCBpbnN0cnVjdGlvbiwgMS8qcHV0dGluZy12YWx1ZS1pbi1jYWNoZSovKTsKLSAgCi0gIHByaW50X2lkZWNvZGVfdmFsaWRhdGUgKGZpbGUsIGluc3RydWN0aW9uLCBvcGNvZGVzKTsKLSAgCi0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgaWYgKG9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKLSAgICBsZl9wcmludGYgKGZpbGUsICJ1bnNpZ25lZF93b3JkIG5pYTtcbiIpOwotICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKLQkJICAgICBpbnN0cnVjdGlvbiwKLQkJICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgIGNhY2hlX3J1bGVzLAotCQkgICAgIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzCi0JCSAgICAgID8gZGVmaW5lX3ZhcmlhYmxlcwotCQkgICAgICA6IGRlY2xhcmVfdmFyaWFibGVzKSwKLQkJICAgICAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlCi0JCSAgICAgID8gYm90aF92YWx1ZXNfYW5kX2ljYWNoZQotCQkgICAgICA6IHB1dF92YWx1ZXNfaW5faWNhY2hlKSwKLQkJICAgICBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLSAgCi0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX2VudHJ5LT5hZGRyZXNzID0gY2lhO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX2VudHJ5LT5zZW1hbnRpYyA9ICIpOwotICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkgICAgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCSAgICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGlmIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUpIHsKLSAgICBsZl9wcmludGYgKGZpbGUsICIvKiBzZW1hbnRpYyByb3V0aW5lICovXG4iKTsKLSAgICBwcmludF9zZW1hbnRpY19ib2R5IChmaWxlLAotCQkJIGluc3RydWN0aW9uLAotCQkJIGV4cGFuZGVkX2JpdHMsCi0JCQkgb3Bjb2Rlcyk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAicmV0dXJuIG5pYTtcbiIpOwotICB9Ci0gIAotICBpZiAoIW9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIvKiByZXR1cm4gdGhlIGZ1bmN0aW9uIHByb3BlciAqL1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gIik7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCQkgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgZXhwYW5kZWRfYml0cywKLQkJCSAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKLSAgICB9Ci0gIAotICBpZiAob3B0aW9ucy5nZW4uZGlyZWN0X2FjY2VzcykKLSAgICB7Ci0gICAgICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKLQkJCSBpbnN0cnVjdGlvbiwKLQkJCSBleHBhbmRlZF9iaXRzLAotCQkJIGNhY2hlX3J1bGVzLAotCQkJIHVuZGVmX3ZhcmlhYmxlcywKLQkJCSAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlCi0JCQkgID8gYm90aF92YWx1ZXNfYW5kX2ljYWNoZQotCQkJICA6IHB1dF92YWx1ZXNfaW5faWNhY2hlKSwKLQkJCSBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLSAgICB9Ci0gIAotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLX0KLQotCi12b2lkCi1wcmludF9pY2FjaGVfZGVmaW5pdGlvbiAobGYgKmZpbGUsCi0JCQkgaW5zbl9lbnRyeSAqaW5zbiwKLQkJCSBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJCSBpbnNuX29wY29kZXMgKm9wY29kZXMsCi0JCQkgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotCQkJIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICBwcmludF9pY2FjaGVfZnVuY3Rpb24gKGZpbGUsCi0JCQkgaW5zbiwKLQkJCSBleHBhbmRlZF9iaXRzLAotCQkJIG9wY29kZXMsCi0JCQkgY2FjaGVfcnVsZXMsCi0JCQkgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci19Ci0KLQotCi12b2lkCi1wcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVjbGFyYXRpb24gKGxmICpmaWxlLAotCQkJCQkgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAotCQkJCQkgICAgdm9pZCAqZGF0YSkKLXsKLSAgQVNTRVJUIChvcHRpb25zLmdlbi5pY2FjaGUpOwotICBpZiAoZnVuY3Rpb24tPmlzX2ludGVybmFsKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUsCi0JCQkJCSJJTkxJTkVfSUNBQ0hFIiwgIlxuIik7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgZnVuY3Rpb24tPm5hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgTlVMTCwKLQkJCSAgIE5VTEwsCi0JCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7Ci0gICAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsIChmaWxlLCAwKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlZmluaXRpb24gKGxmICpmaWxlLAotCQkJCQkgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb24sCi0JCQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0gIEFTU0VSVCAob3B0aW9ucy5nZW4uaWNhY2hlKTsKLSAgaWYgKGZ1bmN0aW9uLT5pc19pbnRlcm5hbCkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGZpbGUsIHByaW50X2ljYWNoZV9mdW5jdGlvbl90eXBlLAotCQkJCQkiSU5MSU5FX0lDQUNIRSIsICJcbiIpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgIGZ1bmN0aW9uLT5uYW1lLAotCQkJICAgTlVMTCwKLQkJCSAgIE5VTEwsCi0JCQkgICBOVUxMLAotCQkJICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKCIpOwotICAgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2Zvcm1hbCAoZmlsZSwgMCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpXG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIvKiBzZW1hbnRpYyByb3V0aW5lICovXG4iKTsKLSAgICAgIGlmIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUpCi0JewotCSAgbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBmdW5jdGlvbi0+Y29kZS0+bGluZSk7Ci0JICB0YWJsZV9wcmludF9jb2RlIChmaWxlLCBmdW5jdGlvbi0+Y29kZSk7Ci0JICBsZl9wcmludGYgKGZpbGUsICJlcnJvciAoXCJJbnRlcm5hbCBmdW5jdGlvbiBtdXN0IGxvbmdqdW1wXFxuXCIpO1xuIik7Ci0JICBsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gMDtcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gIik7Ci0JICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgICAgIGZ1bmN0aW9uLT5uYW1lLAotCQkJICAgICAgIE5VTEwsCi0JCQkgICAgICAgTlVMTCwKLQkJCSAgICAgICBOVUxMLAotCQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0JICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKLQl9Ci0gICAgICAKLSAgICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taWNhY2hlLmggYi9zaW0vaWdlbi9nZW4taWNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzczZjYuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZ2VuLWljYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotCi0vKiBPdXRwdXQgY29kZSB0byBtYW5pcHVsYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZTogZWl0aGVyIGNyZWF0ZSBpdAotICAgb3IgcmVmZXJlbmNlIGl0ICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGRlY2xhcmVfdmFyaWFibGVzLAotICBkZWZpbmVfdmFyaWFibGVzLAotICB1bmRlZl92YXJpYWJsZXMsCi19IGljYWNoZV9kZWNsX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGRvX25vdF91c2VfaWNhY2hlID0gMCwKLSAgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSA9IDB4MSwKLSAgcHV0X3ZhbHVlc19pbl9pY2FjaGUgPSAweDIsCi0gIGJvdGhfdmFsdWVzX2FuZF9pY2FjaGUgPSAweDMsCi19IGljYWNoZV9ib2R5X3R5cGU7Ci0KLWV4dGVybiB2b2lkIHByaW50X2ljYWNoZV9ib2R5Ci0obGYgKmZpbGUsCi0gaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0gb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0gY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotIGljYWNoZV9kZWNsX3R5cGUgd2hhdF90b19kZWNsYXJlLAotIGljYWNoZV9ib2R5X3R5cGUgd2hhdF90b19kbywKLSBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLQotLyogT3V0cHV0IGFuIGluc3RydWN0aW9uIGNhY2hlIGRlY29kZSBmdW5jdGlvbiAqLwotCi1leHRlcm4gdm9pZCBwcmludF9pY2FjaGVfZGVjbGFyYXRpb24KLShsZiAqZmlsZSwKLSBpbnNuX2VudHJ5ICppbnNuLAotIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKLSBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0gCi1leHRlcm4gdm9pZCBwcmludF9pY2FjaGVfZGVmaW5pdGlvbgotKGxmICpmaWxlLAotIGluc25fZW50cnkgKmluc24sCi0gb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0gaW5zbl9vcGNvZGVzICpvcGNvZGVzLAotIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKLSBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLQotLyogT3V0cHV0IGFuIGluc3RydWN0aW9uIGNhY2hlIHN1cHBvcnQgZnVuY3Rpb24gKi8KLQotZXh0ZXJuIGZ1bmN0aW9uX2VudHJ5X2hhbmRsZXIgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlY2xhcmF0aW9uOwotZXh0ZXJuIGZ1bmN0aW9uX2VudHJ5X2hhbmRsZXIgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlZmluaXRpb247Ci0KLQotLyogT3V0cHV0IHRoZSBpbnN0cnVjdGlvbiBjYWNoZSB0YWJsZSBkYXRhIHN0cnVjdHVyZSAqLwotCi1leHRlcm4gdm9pZCBwcmludF9pY2FjaGVfc3RydWN0Ci0obGYgKmZpbGUsCi0gaW5zbl90YWJsZSAqaW5zdHJ1Y3Rpb25zLAotIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcyk7Ci0KLQotLyogT3V0cHV0IGEgc2luZ2xlIGluc3RydWN0aW9ucyBkZWNvZGVyICovCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taWRlY29kZS5jIGIvc2ltL2lnZW4vZ2VuLWlkZWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3MGUzZC4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9nZW4taWRlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5MSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0jaW5jbHVkZSAiaWdlbi5oIgotCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotI2luY2x1ZGUgImxkLWRlY29kZS5oIgotCi0jaW5jbHVkZSAiZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4taWRlY29kZS5oIgotI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKLSNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCi0KLQotCi1zdGF0aWMgdm9pZAotbGZfcHJpbnRfb3Bjb2RlcyAobGYgKmZpbGUsCi0JCSAgZ2VuX2VudHJ5ICp0YWJsZSkKLXsKLSAgaWYgKHRhYmxlICE9IE5VTEwpCi0gICAgewotICAgICAgd2hpbGUgKDEpCi0JewotCSAgQVNTRVJUICh0YWJsZS0+b3Bjb2RlICE9IE5VTEwpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiXyVkXyVkIiwKLQkJICAgICB0YWJsZS0+b3Bjb2RlLT5maXJzdCwKLQkJICAgICB0YWJsZS0+b3Bjb2RlLT5sYXN0KTsKLQkgIGlmICh0YWJsZS0+cGFyZW50ID09IE5VTEwpIGJyZWFrOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiX18lZCIsIHRhYmxlLT5vcGNvZGVfbnIpOwotCSAgdGFibGUgPSB0YWJsZS0+cGFyZW50OwotCX0KLSAgICB9Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX2lmZXRjaCAobGYgKmZpbGUsCi0JCSAgICAgIGludCBwcmV2aW91c19ucl9wcmVmZXRjaGVkX3dvcmRzLAotCQkgICAgICBpbnQgY3VycmVudF9ucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICBpbnQgd29yZF9ucjsKLSAgZm9yICh3b3JkX25yID0gcHJldmlvdXNfbnJfcHJlZmV0Y2hlZF93b3JkczsKLSAgICAgICB3b3JkX25yIDwgY3VycmVudF9ucl9wcmVmZXRjaGVkX3dvcmRzOwotICAgICAgIHdvcmRfbnIgKyspCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8lZCA9IElNRU0lZF9JTU1FRCAoY2lhLCAlZCk7XG4iLAotCQkgd29yZF9uciwgb3B0aW9ucy5pbnNuX2JpdF9zaXplLCB3b3JkX25yKTsKLSAgICAgIAotICAgIH0KLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkCi1sZl9wcmludF90YWJsZV9uYW1lIChsZiAqZmlsZSwKLQkJICAgICBnZW5fZW50cnkgKnRhYmxlKQotewotICBsZl9wcmludGYgKGZpbGUsICJpZGVjb2RlX3RhYmxlIik7Ci0gIGxmX3ByaW50X29wY29kZXMgKGZpbGUsIHRhYmxlKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX3RhYmxlIChsZiAqZmlsZSwKLQkJICAgICBnZW5fZW50cnkgKmVudHJ5LAotCQkgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiLyogcHJpbWUgdGhlIHNlYXJjaCAqL1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImlkZWNvZGVfdGFibGVfZW50cnkgKnRhYmxlID0gIik7Ci0gIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImludCBvcGNvZGUgPSBFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb24sICVkLCAlZCk7XG4iLAotCSAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAotCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JICAgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmxhc3QpKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiaWRlY29kZV90YWJsZV9lbnRyeSAqdGFibGVfZW50cnkgPSB0YWJsZSArIG9wY29kZTtcbiIpOwotICAKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiLyogaXRlcmF0ZSB1bnRpbCBhIGxlYWYgKi9cbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJ3aGlsZSAoMSkge1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgc2lnbmVkIHNoaWZ0ID0gdGFibGVfZW50cnktPnNoaWZ0O1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImlmIChzaGlmdCA9PSBmdW5jdGlvbl9lbnRyeSkgYnJlYWs7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICBpZiAoc2hpZnQgPj0gMCkge1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICB0YWJsZSA9ICgoaWRlY29kZV90YWJsZV9lbnRyeSopXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgIHRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSk7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgIG9wY29kZSA9ICgoaW5zdHJ1Y3Rpb24gJiB0YWJsZV9lbnRyeS0+bWFzaylcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgICAgICAgICAgICAgID4+IHNoaWZ0KTtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgICAgdGFibGVfZW50cnkgPSB0YWJsZSArIG9wY29kZTtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIH1cbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGVsc2Uge1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAvKiBtdXN0IGJlIGEgYm9vbGVhbiAqL1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICBBU1NFUlQodGFibGVfZW50cnktPnNoaWZ0ID09IGJvb2xlYW5fZW50cnkpO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICBvcGNvZGUgPSAoKGluc3RydWN0aW9uICYgdGFibGVfZW50cnktPm1hc2spXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgICAhPSB0YWJsZV9lbnRyeS0+dmFsdWUpO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICB0YWJsZSA9ICgoaWRlY29kZV90YWJsZV9lbnRyeSopXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgIHRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSk7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgIHRhYmxlX2VudHJ5ID0gdGFibGUgKyBvcGNvZGU7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0gIAotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIvKiBjYWxsIHRoZSBsZWFmIGNvZGUgKi9cbiIpOwotICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9qdW1wcykKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJnb3RvICp0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIlcyAiLCByZXN1bHQpOwotICAgICAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICIoKChpZGVjb2RlX2ljYWNoZSopdGFibGVfZW50cnktPmZ1bmN0aW9uX29yX3RhYmxlKVxuIik7Ci0JICBsZl9wcmludGYgKGZpbGUsICIgICgiKTsKLQkgIHByaW50X2ljYWNoZV9mdW5jdGlvbl9hY3R1YWwgKGZpbGUsIDEpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiKSk7XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAiKChpZGVjb2RlX3NlbWFudGljKil0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpXG4iKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiAgKCIpOwotCSAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fYWN0dWFsIChmaWxlLCAxKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX3RhYmxlX3N0YXJ0IChsZiAqZmlsZSwKLQkJCSAgIGdlbl9lbnRyeSAqdGFibGUsCi0JCQkgICBpbnQgZGVwdGgsCi0JCQkgICB2b2lkICpkYXRhKQotewotICBBU1NFUlQgKGRlcHRoID09IDApOwotICAvKiBzdGFydCBvZiB0aGUgdGFibGUgKi8KLSAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAic3RhdGljIGlkZWNvZGVfdGFibGVfZW50cnkgIik7Ci0gICAgICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCB0YWJsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJbXSA9IHtcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfdGFibGVfbGVhZiAobGYgKmZpbGUsCi0JCQkgIGdlbl9lbnRyeSAqZW50cnksCi0JCQkgIGludCBkZXB0aCwKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLSAgZ2VuX2VudHJ5ICptYXN0ZXJfZW50cnk7Ci0gIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKLSAgQVNTRVJUIChkZXB0aCA9PSAwKTsKLSAgaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKLSAgICBtYXN0ZXJfZW50cnkgPSBlbnRyeTsKLSAgZWxzZQotICAgIG1hc3Rlcl9lbnRyeSA9IGVudHJ5LT5jb21iaW5lZF9wYXJlbnQ7Ci0KLSAgLyogYWRkIGFuIGVudHJ5IHRvIHRoZSB0YWJsZSAqLwotICBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICAvKiVkKi8geyAiLCBlbnRyeS0+b3Bjb2RlX25yKTsKLSAgICAgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpCi0JewotCSAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMSk7Ci0JICAvKiB0YWJsZSBsZWFmIGVudHJ5ICovCi0JICBsZl9wcmludGYgKGZpbGUsICJmdW5jdGlvbl9lbnRyeSwgMCwgMCwgIik7Ci0JICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9qdW1wcykKLQkgICAgewotCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiYmIik7Ci0JICAgIH0KLQkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICAgICAgZW50cnktPmluc25zLT5pbnNuLT5uYW1lLAotCQkJICAgICAgIGVudHJ5LT5pbnNucy0+aW5zbi0+Zm9ybWF0X25hbWUsCi0JCQkgICAgICAgTlVMTCwKLQkJCSAgICAgICBtYXN0ZXJfZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkgICAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQotCQkJCT8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCi0JCQkJOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0JICAgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotCSAgICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikKLQl7Ci0JICAvKiB0YWJsZSBjYWxsaW5nIHN3aXRjaCBzdGF0ZW1lbnQgKi8KLQkgIGxmX3ByaW50ZiAoZmlsZSwgImZ1bmN0aW9uX2VudHJ5LCAwLCAwLCAiKTsKLQkgIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzKQotCSAgICB7Ci0JICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJiYiKTsKLQkgICAgfQotCSAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgZW50cnkpOwotCX0KLSAgICAgIGVsc2UgaWYgKGVudHJ5LT5vcGNvZGUtPmlzX2Jvb2xlYW4pCi0JewotCSAgLyogdGFibGUgYGNhbGxpbmcnIGJvb2xlYW4gdGFibGUgKi8KLQkgIGxmX3ByaW50ZiAoZmlsZSwgImJvb2xlYW5fZW50cnksICIpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiTUFTSzMyKCVkLCAlZCksICIsCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7Ci0JICBsZl9wcmludGYgKGZpbGUsICJJTlNFUlRFRDMyKCVkLCAlZCwgJWQpLCAiLAotCQkgICAgIGVudHJ5LT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQsCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7Ci0JICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCBlbnRyeSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHRhYmxlIGBjYWxsaW5nJyBhbm90aGVyIHRhYmxlICovCi0JICBsZl9wcmludGYgKGZpbGUsICIlZCwgIiwgb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gZW50cnktPm9wY29kZS0+bGFzdCAtIDEpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiTUFTSyVkKCVkLCVkKSwgIiwKLQkJICAgICBvcHRpb25zLmluc25fYml0X3NpemUsCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7Ci0JICBsZl9wcmludGYgKGZpbGUsICIwLCAiKTsKLQkgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5KTsKLQl9Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgfSxcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfdGFibGVfZW5kIChsZiAqZmlsZSwKLQkJCSBnZW5fZW50cnkgKnRhYmxlLAotCQkJIGludCBkZXB0aCwKLQkJCSB2b2lkICpkYXRhKQotewotICBBU1NFUlQgKGRlcHRoID09IDApOwotICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAifTtcbiIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9nb3RvX3N3aXRjaF9uYW1lIChsZiAqZmlsZSwKLQkJCWdlbl9lbnRyeSAqZW50cnkpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImNhc2VfIik7Ci0gIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgIGVudHJ5LT5pbnNucy0+aW5zbi0+bmFtZSwKLQkJCSAgIGVudHJ5LT5pbnNucy0+aW5zbi0+Zm9ybWF0X25hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkgICAob3B0aW9ucy5nZW4uaWNhY2hlCi0JCQkgICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKLQkJCSAgICA6IGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2dvdG9fc3dpdGNoX3RhYmxlX2xlYWYgKGxmICpmaWxlLAotCQkJICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKLQkJCSAgICAgIGludCBkZXB0aCwKLQkJCSAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKLSAgQVNTRVJUIChkZXB0aCA9PSAwKTsKLSAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbik7Ci0gIEFTU0VSVCAoZW50cnktPnBhcmVudC0+b3Bjb2RlKTsKLSAgCi0gIGxmX3ByaW50ZiAoZmlsZSwgIi8qICVkICovICYmIiwgZW50cnktPm9wY29kZV9ucik7Ci0gIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ICE9IE5VTEwpCi0gICAgcHJpbnRfZ290b19zd2l0Y2hfbmFtZSAoZmlsZSwgZW50cnktPmNvbWJpbmVkX3BhcmVudCk7Ci0gIGVsc2UKLSAgICBwcmludF9nb3RvX3N3aXRjaF9uYW1lIChmaWxlLCBlbnRyeSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIixcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsgKGxmICpmaWxlLAotCQkJIGdlbl9lbnRyeSAqZW50cnkpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gYnJlYWtfIik7Ci0gIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5LT5wYXJlbnQpOwotICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ290b19zd2l0Y2hfdGFibGUgKGxmICpmaWxlLAotCQkJIGdlbl9lbnRyeSAqdGFibGUpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImNvbnN0IHN0YXRpYyB2b2lkICoiKTsKLSAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOwotICBsZl9wcmludGYgKGZpbGUsICJbXSA9IHtcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKGZpbGUsIHRhYmxlLAotCQkJICAgMCwKLQkJCSAgIE5VTEwvKnN0YXJ0Ki8sCi0JCQkgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZV9sZWFmLAotCQkJICAgTlVMTC8qZW5kKi8sCi0JCQkgICBOVUxMLypkYXRhKi8pOwotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifTtcbiIpOwotfQotCi0KLXZvaWQgcHJpbnRfaWRlY29kZV9zd2l0Y2gKLShsZiAqZmlsZSwgCi0gZ2VuX2VudHJ5ICp0YWJsZSwKLSBjb25zdCBjaGFyICpyZXN1bHQpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV9zd2l0Y2hfc3RhcnQgKGxmICpmaWxlLAotCQkJICAgIGdlbl9lbnRyeSAqdGFibGUsCi0JCQkgICAgaW50IGRlcHRoLAotCQkJICAgIHZvaWQgKmRhdGEpCi17Ci0gIC8qIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7ICovCi0gIEFTU0VSVCAoZGVwdGggPT0gMCk7Ci0gIEFTU0VSVCAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7Ci0gIAotICBpZiAodGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbgotICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAic3dpdGNoIChFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZCkpXG4iLAotCQkgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAotCQkgdGFibGUtPm9wY29kZV9ydWxlLT53b3JkX25yLAotCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5maXJzdCksCi0JCSBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgfQotICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCi0gICAgewotICAgICAgaWYgKHRhYmxlLT5wYXJlbnQgIT0gTlVMTAotCSAgJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICAgICAgfHwgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikpCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0JICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQl9Ci0gICAgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZSAoZmlsZSwgdGFibGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiQVNTRVJUIChFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZClcbiIsCi0JCSBvcHRpb25zLmluc25fYml0X3NpemUsCi0JCSB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAotCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5maXJzdCksCi0JCSBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgPCAoc2l6ZW9mICgiKTsKLSAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIHRhYmxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikgLyBzaXplb2Yodm9pZCopKSk7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gKiIpOwotICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiW0VYVFJBQ1RFRCVkIChpbnN0cnVjdGlvbl8lZCwgJWQsICVkKV07XG4iLAotCQkgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAotCQkgdGFibGUtPm9wY29kZS0+d29yZF9uciwKLQkJIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAotCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5sYXN0KSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfc3dpdGNoX2xlYWYgKGxmICpmaWxlLAotCQkJICAgZ2VuX2VudHJ5ICplbnRyeSwKLQkJCSAgIGludCBkZXB0aCwKLQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7Ci0gIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKLSAgQVNTRVJUIChkZXB0aCA9PSAwKTsKLSAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgIHx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICB8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKTsKLSAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGUpOwotICAKLSAgLyogc2tpcCBvdmVyIGFueSBpbnN0cnVjdGlvbnMgY29tYmluZWQgaW50byBhbm90aGVyIGVudHJ5ICovCi0gIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ICE9IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQkgICAmJiBlbnRyeS0+b3Bjb2RlX25yID09IDApCi0gICAgewotICAgICAgLyogY2FzZTogYm9vbGVhbiBmYWxzZSB0YXJnZXQgKi8KLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNhc2UgJWQ6XG4iLCBlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOwotICAgIH0KLSAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlLT5pc19ib29sZWFuCi0JICAgJiYgZW50cnktPm9wY29kZV9uciAhPSAwKQotICAgIHsKLSAgICAgIC8qIGNhc2U6IGJvb2xlYW4gdHJ1ZSBjYXNlICovCi0gICAgICBsZl9wcmludGYgKGZpbGUsICJkZWZhdWx0OlxuIik7Ci0gICAgfQotICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgICB8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQotICAgIHsKLSAgICAgIC8qIGNhc2U6IDxvcGNvZGUtbnI+IC0gc3dpdGNoICovCi0gICAgICBnZW5fZW50cnkgKmNvYjsKLSAgICAgIGZvciAoY29iID0gZW50cnk7IGNvYiAhPSBOVUxMOyBjb2IgPSBjb2ItPmNvbWJpbmVkX25leHQpCi0JbGZfcHJpbnRmIChmaWxlLCAiY2FzZSAlZDpcbiIsIGNvYi0+b3Bjb2RlX25yKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKQotICAgIHsKLSAgICAgIC8qIGNhc2U6IDxvcGNvZGUtbnI+IC0gZ290by1zd2l0Y2ggKi8KLSAgICAgIHByaW50X2dvdG9fc3dpdGNoX25hbWUgKGZpbGUsIGVudHJ5KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVSUk9SICgiYmFkIHN3aXRjaCIpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiICB7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArNCk7Ci0gIHsKLSAgICBpZiAoZW50cnktPm9wY29kZSA9PSBOVUxMKQotICAgICAgewotCS8qIHN3aXRjaCBjYWxsaW5nIGxlYWYgKi8KLQlBU1NFUlQgKGVudHJ5LT5ucl9pbnNucyA9PSAxKTsKLQlwcmludF9pZGVjb2RlX2lmZXRjaCAoZmlsZSwgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMsCi0JCQkgICAgICBlbnRyeS0+aW5zbnMtPnNlbWFudGljLT5ucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQlzd2l0Y2ggKG9wdGlvbnMuZ2VuLmNvZGUpCi0JICB7Ci0JICBjYXNlIGdlbmVyYXRlX2p1bXBzOgotCSAgICBsZl9wcmludGYgKGZpbGUsICJnb3RvICIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgZ2VuZXJhdGVfY2FsbHM6Ci0JICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcmVzdWx0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgICAgZW50cnktPmluc25zLT5pbnNuLT5uYW1lLAotCQkJICAgICBlbnRyeS0+aW5zbnMtPmluc24tPmZvcm1hdF9uYW1lLAotCQkJICAgICBOVUxMLAotCQkJICAgICBlbnRyeS0+ZXhwYW5kZWRfYml0cywKLQkJCSAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQotCQkJICAgICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKLQkJCSAgICAgIDogZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKSk7Ci0JaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCi0JICB7Ci0JICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAoIik7Ci0JICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbCAoZmlsZSwgZW50cnktPmluc25zLT5zZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0JICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKLQkgIH0KLQlsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0JICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KLQkgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQotICAgICAgewotCS8qIHN3aXRjaCBjYWxsaW5nIHN3aXRjaCAqLwotCWxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCXByaW50X2lkZWNvZGVfaWZldGNoIChmaWxlLCBlbnRyeS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzLAotCQkJICAgICAgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMpOwotCXByaW50X2lkZWNvZGVfc3dpdGNoIChmaWxlLCBlbnRyeSwgcmVzdWx0KTsKLQlsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLQlsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogc3dpdGNoIGxvb2tpbmcgdXAgYSB0YWJsZSAqLwotCWxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCXByaW50X2lkZWNvZGVfaWZldGNoIChmaWxlLCBlbnRyeS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzLAotCQkJICAgICAgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMpOwotCXByaW50X2lkZWNvZGVfdGFibGUgKGZpbGUsIGVudHJ5LCByZXN1bHQpOwotCWxmX2luZGVudCAoZmlsZSwgLTIpOwotCWxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotICAgICAgfQotICAgIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQl8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQl8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQotICAgICAgewotCWxmX3ByaW50ZiAoZmlsZSwgImJyZWFrO1xuIik7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCi0gICAgICB7Ci0JcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsoZmlsZSwgZW50cnkpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlFUlJPUiAoImJhZCBzd2l0Y2giKTsKLSAgICAgIH0KLSAgfQotICBsZl9pbmRlbnQgKGZpbGUsIC00KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV9zd2l0Y2hfaWxsZWdhbCAobGYgKmZpbGUsCi0JCQkgICAgICBjb25zdCBjaGFyICpyZXN1bHQpCi17Ci0gIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICBwcmludF9pZGVjb2RlX2ludmFsaWQgKGZpbGUsIHJlc3VsdCwgaW52YWxpZF9pbGxlZ2FsKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX3N3aXRjaF9lbmQgKGxmICpmaWxlLAotCQkJICBnZW5fZW50cnkgKnRhYmxlLAotCQkJICBpbnQgZGVwdGgsCi0JCQkgIHZvaWQgKmRhdGEpCi17Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7Ci0gIEFTU0VSVCAoZGVwdGggPT0gMCk7Ci0gIEFTU0VSVCAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7Ci0gIEFTU0VSVCAodGFibGUtPm9wY29kZSk7Ci0gIAotICBpZiAodGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbikKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgIH0KLSAgZWxzZSBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImRlZmF1bHQ6XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgICAgaWYgKHRhYmxlLT5ucl9lbnRyaWVzID09IHRhYmxlLT5vcGNvZGUtPm5yX29wY29kZXMpCi0JewotCSAgcHJpbnRfc2ltX2VuZ2luZV9hYm9ydCAoZmlsZSwgIkludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCBnZW5lcmF0ZWQiKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzTlVMTF9DSUE7XG4iLCByZXN1bHQpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfaWxsZWdhbCAoZmlsZSwgcmVzdWx0KTsKLQl9Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gICAgfQotICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiaWxsZWdhbF8iKTsKLSAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIHRhYmxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOwotICAgICAgcHJpbnRfaWRlY29kZV9pbnZhbGlkIChmaWxlLCByZXN1bHQsIGludmFsaWRfaWxsZWdhbCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJicmVha18iKTsKLSAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOjtcbiIpOwotICAgICAgaWYgKHRhYmxlLT5wYXJlbnQgIT0gTlVMTAotCSAgJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICAgICAgfHwgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikpCi0JewotCSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRVJST1IgKCJiYWQgc3dpdGNoIik7Ci0gICAgfQotfQotCi0KLXZvaWQKLXByaW50X2lkZWNvZGVfc3dpdGNoIChsZiAqZmlsZSwgCi0JCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKLXsKLSAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKGZpbGUsIHRhYmxlLAotCQkJICAgMCwKLQkJCSAgIHByaW50X2lkZWNvZGVfc3dpdGNoX3N0YXJ0LAotCQkJICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfbGVhZiwKLQkJCSAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2VuZCwKLQkJCSAgICh2b2lkKilyZXN1bHQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX3N3aXRjaF9mdW5jdGlvbl9oZWFkZXIgKGxmICpmaWxlLAotCQkJCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCi0JCQkJICAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24sCi0JCQkJICAgICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2NhbGxzKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInN0YXRpYyAiKTsKLSAgICAgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgInVuc2lnbmVkX3dvcmQiKTsKLQl9Ci0gICAgICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICIgIik7Ci0JfQotICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7Ci0gICAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsIChmaWxlLCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKLSAgICAgIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICI7Iik7Ci0JfQotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzICYmIGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCB0YWJsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaWRlY29kZV9kZWNsYXJlX2lmX3N3aXRjaCAobGYgKmZpbGUsCi0JCQkgICBnZW5fZW50cnkgKnRhYmxlLAotCQkJICAgaW50IGRlcHRoLAotCQkJICAgdm9pZCAqZGF0YSkKLXsKLSAgaWYgKCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0gICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0gICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCi0gICAgICAmJiB0YWJsZS0+cGFyZW50ICE9IE5VTEwgLyogZG9uJ3QgZGVjbGFyZSB0aGUgdG9wIG9uZSB5ZXQgKi8KLSAgICAgICYmIHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKQotICAgIHsKLSAgICAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkJICAgIHRhYmxlLAotCQkJCQkgICAgMC8qaXNudCBmdW5jdGlvbiBkZWZpbml0aW9uKi8sCi0JCQkJCSAgICAwKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWlkZWNvZGVfZXhwYW5kX2lmX3N3aXRjaCAobGYgKmZpbGUsCi0JCQkgIGdlbl9lbnRyeSAqdGFibGUsCi0JCQkgIGludCBkZXB0aCwKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLSAgaWYgKCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0gICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0gICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCi0gICAgICAmJiB0YWJsZS0+cGFyZW50ICE9IE5VTEwgLyogZG9uJ3QgZXhwYW5kIHRoZSB0b3Agb25lIHlldCAqLwotICAgICAgJiYgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pCi0gICAgewotICAgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfZnVuY3Rpb25faGVhZGVyKGZpbGUsCi0JCQkJCSAgIHRhYmxlLAotCQkJCQkgICAxLyppcyBmdW5jdGlvbiBkZWZpbml0aW9uKi8sCi0JCQkJCSAgIDApOwotICAgICAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCi0JewotCSAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0JICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQl9Ci0gICAgICBwcmludF9pZGVjb2RlX3N3aXRjaChmaWxlLCB0YWJsZSwgInJldHVybiIpOwotICAgICAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCi0JewotCSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLQl9Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXZvaWQKLXByaW50X2lkZWNvZGVfbG9va3VwcyAobGYgKmZpbGUsCi0JCSAgICAgICBnZW5fZW50cnkgKnRhYmxlLAotCQkgICAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICBpbnQgZGVwdGg7Ci0gIAotICAvKiBvdXRwdXQgc3dpdGNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGVyZSBuZWVkZWQgYnkgdGFibGVzICovCi0gIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCB0YWJsZSwKLQkJCSAgIDEsCi0JCQkgICBpZGVjb2RlX2RlY2xhcmVfaWZfc3dpdGNoLCAvKiBTVEFSVCAqLwotCQkJICAgTlVMTCwgTlVMTCwKLQkJCSAgIE5VTEwpOwotICAKLSAgLyogb3V0cHV0IHRhYmxlcyB3aGVyZSBuZWVkZWQgKi8KLSAgZm9yIChkZXB0aCA9IGdlbl9lbnRyeV9kZXB0aCAodGFibGUpOwotICAgICAgIGRlcHRoID4gMDsKLSAgICAgICBkZXB0aC0tKQotICAgIHsKLSAgICAgIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCB0YWJsZSwKLQkJCSAgICAgICAxLWRlcHRoLAotCQkJICAgICAgIHByaW50X2lkZWNvZGVfdGFibGVfc3RhcnQsCi0JCQkgICAgICAgcHJpbnRfaWRlY29kZV90YWJsZV9sZWFmLAotCQkJICAgICAgIHByaW50X2lkZWNvZGVfdGFibGVfZW5kLAotCQkJICAgICAgIE5VTEwpOwotICAgIH0KLSAgCi0gIC8qIG91dHB1dCBzd2l0Y2ggZnVuY3Rpb25zIHdoZXJlIG5lZWRlZCAqLwotICBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAoZmlsZSwgdGFibGUsCi0JCQkgICAgMSwKLQkJCSAgICBpZGVjb2RlX2V4cGFuZF9pZl9zd2l0Y2gsIC8qIFNUQVJUICovCi0JCQkgICAgTlVMTCwgTlVMTCwKLQkJCSAgICBOVUxMKTsKLX0KLQotCi12b2lkCi1wcmludF9pZGVjb2RlX2JvZHkgKGxmICpmaWxlLAotCQkgICAgZ2VuX2VudHJ5ICp0YWJsZSwKLQkJICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKLXsKLSAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLSAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCi0gICAgewotICAgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2ggKGZpbGUsIHRhYmxlLCByZXN1bHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X2lkZWNvZGVfdGFibGUgKGZpbGUsIHRhYmxlLCByZXN1bHQpOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1wcmludF9qdW1wIChsZiAqZmlsZSwKLQkgICAgaW50IGlzX3RhaWwpCi17Ci0gIGlmIChpc190YWlsKQotICAgIHsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBjcHVfaGFsdChjcHUsIG5pYSwgd2FzX2NvbnRpbnVpbmcsIDAvKm5hKi8pO1xuIik7Ci0gICAgfQotICAKLSAgaWYgKCFvcHRpb25zLmdlbmVyYXRlX3NtcCkKLSAgICB7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihjcHUsIG5pYSk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihjcHUpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgfQotICAKLSAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVfc21wKQotICAgIHsKLSAgICAgIGlmIChpc190YWlsKQotCXsKLQkgIGxmX3B1dHN0ciAoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKGNwdSwgbmlhKTtcbiIpOwotCX0KLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChXSVRIX0VWRU5UUykge1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGN1cnJlbnRfY3B1ICs9IDE7XG4iKTsKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgaWYgKGN1cnJlbnRfY3B1ID49IG5yX2NwdXMpIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGlmIChldmVudF9xdWV1ZV90aWNrKGV2ZW50cykpIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgfVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3VycmVudF9jcHUgPSAwO1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJlbHNlIHtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBjdXJyZW50X2NwdSA9IChjdXJyZW50X2NwdSArIDEpICUgbnJfY3B1cztcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJjcHUgPSBjcHVzW2N1cnJlbnRfY3B1XTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAibmlhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIoY3B1KTtcbiIpOwotICAgIH0KLSAgCi0gIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiY2FjaGVfZW50cnkgPSBjcHVfaWNhY2hlX2VudHJ5KGNwdSwgbmlhKTtcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IG5pYSkge1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIC8qIGNhY2hlIGhpdCAqL1xuIik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGdvdG8gKmNhY2hlX2VudHJ5LT5zZW1hbnRpYztcbiIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgICBpZiAoaXNfdGFpbCkKLQl7Ci0JICBsZl9wdXRzdHIgKGZpbGUsICJnb3RvIGNhY2hlX21pc3M7XG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlICYmIGlzX3RhaWwpCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiZ290byBpZGVjb2RlO1xuIik7Ci0gICAgfQotICAKLX0KLSNlbmRpZgotCi0KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1wcmludF9qdW1wX2luc24gKGxmICpmaWxlLAotCQkgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0JCSBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSBvcGNvZGVfZmllbGQgKm9wY29kZXMsCi0JCSBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCi17Ci0gIAotICAvKiB3aGF0IHdlIGFyZSBmb3IgdGhlIG1vbWVudCAqLwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBwcmludF9teV9kZWZpbmVzIChmaWxlLCBleHBhbmRlZF9iaXRzLCBpbnN0cnVjdGlvbi0+bmFtZSk7Ci0gIAotICAvKiBvdXRwdXQgdGhlIGljYWNoZSBlbnRyeSAqLwotICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJCSAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOlxuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOwotICAgICAgcHJpbnRfaXRyYWNlIChmaWxlLCBpbnN0cnVjdGlvbiwgMS8qcHV0dGluZy12YWx1ZS1pbi1jYWNoZSovKTsKLSAgICAgIHByaW50X2lkZWNvZGVfdmFsaWRhdGUgKGZpbGUsIGluc3RydWN0aW9uLCBvcGNvZGVzKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgICAgcHJpbnRfaWNhY2hlX2JvZHkgKGZpbGUsCi0JCQkgaW5zdHJ1Y3Rpb24sCi0JCQkgZXhwYW5kZWRfYml0cywKLQkJCSBjYWNoZV9ydWxlcywKLQkJCSAwLCAvKnVzZV9kZWZpbmVzKi8KLQkJCSBwdXRfdmFsdWVzX2luX2ljYWNoZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9lbnRyeS0+YWRkcmVzcyA9IG5pYTtcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiY2FjaGVfZW50cnktPnNlbWFudGljID0gJiYiKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJCSAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7Ci0gICAgICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQotCXsKLQkgIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCi0JCQkgICAgICAgaW5zdHJ1Y3Rpb24sCi0JCQkgICAgICAgZXhwYW5kZWRfYml0cywKLQkJCSAgICAgICBvcGNvZGVzKTsKLQkgIHByaW50X2p1bXAgKGZpbGUsIDEvKmlzLXRhaWwqLyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIGdvdG8gIik7Ci0JICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgICAgIGluc3RydWN0aW9uLT5uYW1lLAotCQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIjsgKi9cbiIpOwotCX0KLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotICAgIH0KLSAgCi0gIC8qIHByaW50IHRoZSBzZW1hbnRpY3MgKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKLSAgcHJpbnRfaWNhY2hlX2JvZHkgKGZpbGUsCi0JCSAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICBjYWNoZV9ydWxlcywKLQkJICAgICAob3B0aW9ucy5nZW4uZGlyZWN0X2FjY2VzcwotCQkgICAgICA/IGRlZmluZV92YXJpYWJsZXMKLQkJICAgICAgOiBkZWNsYXJlX3ZhcmlhYmxlcyksCi0JCSAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQotCQkgICAgICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKLQkJICAgICAgOiBkb19ub3RfdXNlX2ljYWNoZSkpOwotICBwcmludF9zZW1hbnRpY19ib2R5IChmaWxlLAotCQkgICAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgb3Bjb2Rlcyk7Ci0gIGlmIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzKQotICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAotCQkgICAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgY2FjaGVfcnVsZXMsCi0JCSAgICAgICB1bmRlZl92YXJpYWJsZXMsCi0JCSAgICAgICAob3B0aW9ucy5nZW4uaWNhY2hlCi0JCQk/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKLQkJCTogZG9fbm90X3VzZV9pY2FjaGUpKTsKLSAgcHJpbnRfanVtcCAoZmlsZSwgMS8qaXMgdGFpbCovKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotfQotI2VuZGlmCi0KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1wcmludF9qdW1wX2RlZmluaXRpb24gKGxmICpmaWxlLAotCQkgICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKLQkJICAgICAgIGluc25fZW50cnkgKmluc24sCi0JCSAgICAgICBpbnQgZGVwdGgsCi0JCSAgICAgICB2b2lkICpkYXRhKQotewotICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMgPSAoY2FjaGVfZW50cnkqKWRhdGE7Ci0gIGlmIChvcHRpb25zLmdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKLSAgICB7Ci0gICAgICBBU1NFUlQgKGVudHJ5LT5ucl9pbnNucyA9PSAxCi0JICAgICAgJiYgZW50cnktPm9wY29kZSA9PSBOVUxMCi0JICAgICAgJiYgZW50cnktPnBhcmVudCAhPSBOVUxMCi0JICAgICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlICE9IE5VTEwpOwotICAgICAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMQotCSAgICAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAotCSAgICAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAotCSAgICAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMCi0JICAgICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUgIT0gTlVMTCk7Ci0gICAgICBwcmludF9qdW1wX2luc24gKGZpbGUsCi0JCSAgICAgICBlbnRyeS0+aW5zbnMtPndvcmRzWzBdLT5pbnNuLAotCQkgICAgICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCSAgICAgICBlbnRyeS0+b3Bjb2RlLAotCQkgICAgICAgY2FjaGVfcnVsZXMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X2p1bXBfaW5zbiAoZmlsZSwKLQkJICAgICAgIGluc3RydWN0aW9uLT53b3Jkc1swXS0+aW5zbiwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgY2FjaGVfcnVsZXMpOwotICAgIH0KLX0KLSNlbmRpZgotCi0jaWYgMAotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24gKGxmICpmaWxlLAotCQkJICAgICAgZ2VuX2VudHJ5ICp0YWJsZSwKLQkJCSAgICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKLQkJCSAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIGlmIChmdW5jdGlvbi0+aXNfaW50ZXJuYWwpCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgZnVuY3Rpb24tPmxpbmUpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgZnVuY3Rpb24tPm5hbWUsCi0JCQkgICBOVUxMLAotCQkJICAgKG9wdGlvbnMuZ2VuLmljYWNoZQotCQkJICAgID8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCi0JCQkgICAgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKLSAgICAgIHRhYmxlX3ByaW50X2NvZGUgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlKTsKLSAgICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOwotICAgICAgcHJpbnRfc2ltX2VuZ2luZV9hYm9ydCAoZmlsZSwgIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXAiKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0gICAgfQotfQotI2VuZGlmCi0KLQotCi0jaWYgMAotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KGxmICpmaWxlLAotCQkJICAgaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiam1wX2J1ZiBoYWx0O1xuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgImptcF9idWYgcmVzdGFydDtcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJzaW1fY3B1ICpjcHUgPSBOVUxMO1xuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhID0gLTE7XG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9IDA7XG4iKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfcHV0c3RyIChmaWxlLCAiaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkgPSBOVUxMO1xuIik7Ci0gIH0KLSAgaWYgKGdlbmVyYXRlX3NtcCkgewotICAgIGxmX3B1dHN0ciAoZmlsZSwgImludCBjdXJyZW50X2NwdSA9IC0xO1xuIik7Ci0gIH0KLQotICAvKiBhbGwgdGhlIHN3aXRjaGVzIGFuZCB0YWJsZXMgLSB0aGV5IGtub3cgYWJvdXQganVtcGluZyAqLwotICBwcmludF9pZGVjb2RlX2xvb2t1cHMoZmlsZSwgdGFibGUsIGNhY2hlX3J1bGVzKTsKLSAKLSAgLyogc3RhcnQgdGhlIHNpbXVsYXRpb24gdXAgKi8KLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIgKGZpbGUsICJ7XG4iKTsKLSAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGludCBjcHVfbnI7XG4iKTsKLSAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKLSAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3B1X2ZsdXNoX2ljYWNoZShjcHVzW2NwdV9ucl0pO1xuIik7Ci0gICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7Ci0gIH0KLQotICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJwc2ltX3NldF9oYWx0X2FuZF9yZXN0YXJ0KHN5c3RlbSwgJmhhbHQsICZyZXN0YXJ0KTtcbiIpOwotCi0gIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgImlmIChzZXRqbXAoaGFsdCkpXG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiICByZXR1cm47XG4iKTsKLQotICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIgKGZpbGUsICJzZXRqbXAocmVzdGFydCk7XG4iKTsKLQotICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOwotICBpZiAoIWdlbmVyYXRlX3NtcCkgewotICAgIGxmX3B1dHN0ciAoZmlsZSwgImNwdSA9IGNwdXNbMF07XG4iKTsKLSAgICBsZl9wdXRzdHIgKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihjcHUpO1xuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbGZfcHV0c3RyIChmaWxlLCAiY3VycmVudF9jcHUgPSBwc2ltX2xhc3RfY3B1KHN5c3RlbSk7XG4iKTsKLSAgfQotCi0gIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKLSAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgImlkZWNvZGU6XG4iKTsKLSAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgfQotCi0gIHByaW50X2p1bXAoZmlsZSwgMC8qaXNfdGFpbCovKTsKLQotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKLSAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9taXNzOlxuIik7Ci0gICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gIH0KLQotICBsZl9wdXRzdHIgKGZpbGUsICJpbnN0cnVjdGlvblxuIik7Ci0gIGxmX3B1dHN0ciAoZmlsZSwgIiAgPSB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKGNwdSksXG4iKTsKLSAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSwgbmlhKTtcbiIpOwotICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICIvKklHT1JFKi8iKTsKLQotICAvKiBwcmludCBvdXQgYSB0YWJsZSBvZiBhbGwgdGhlIGludGVybmFscyBmdW5jdGlvbnMgKi8KLSAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBOVUxMLAotCQkJICAgICAgIHByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24pOwotCi0gLyogcHJpbnQgb3V0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KLSAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKLSAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCi0JCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAotCQkJICAgICAxLAotCQkJICAgICBOVUxMLCAvKiBzdGFydCAqLwotCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24sIC8qIGxlYWYgKi8KLQkJCSAgICAgTlVMTCwgLyogZW5kICovCi0JCQkgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCi0gIGVsc2UKLSAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCi0JCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAotCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24pOwotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0vKiBPdXRwdXQgY29kZSB0byBkbyBhbnkgZmluYWwgY2hlY2tzIG9uIHRoZSBkZWNvZGVkIGluc3RydWN0aW9uLgotICAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB2ZXJpZnlpbmcgYW55IG9uIGRlY29kZWQgZmllbGRzIGhhdmUgdGhlCi0gICBjb3JyZWN0IHZhbHVlIGFuZCBjaGVja2luZyB0aGF0IChmb3IgZmxvYXRpbmcgcG9pbnQpIGZsb2F0aW5nIHBvaW50Ci0gICBoYXJkd2FyZSBpc24ndCBkaXNhYmxlZCAqLwotCi12b2lkCi1wcmludF9pZGVjb2RlX3ZhbGlkYXRlIChsZiAqZmlsZSwKLQkJCWluc25fZW50cnkgKmluc3RydWN0aW9uLAotCQkJaW5zbl9vcGNvZGVzICpvcGNvZGVfcGF0aHMpCi17Ci0gIC8qIFZhbGlkYXRlOiB1bmNoZWNrZWQgaW5zdHJ1Y3Rpb24gZmllbGRzCi0KLSAgICAgSWYgYW55IGNvbnN0YW50IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gd2VyZSBub3QgY2hlY2tlZCBieSB0aGUKLSAgICAgaWRlY29kZSB0YWJsZXMsIG91dHB1dCBjb2RlIHRvIGNoZWNrIHRoYXQgdGhleSBoYXZlIHRoZSBjb3JyZWN0Ci0gICAgIHZhbHVlIGhlcmUgKi8KLSAgewotICAgIGludCBucl9jaGVja3MgPSAwOwotICAgIGludCB3b3JkX25yOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZCAoV0lUSF9SRVNFUlZFRF9CSVRTKVxuIik7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiLyogdmFsaWRhdGU6ICIpOwotICAgIHByaW50X2luc25fd29yZHMgKGZpbGUsIGluc3RydWN0aW9uKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICIgKi9cbiIpOwotICAgIGZvciAod29yZF9uciA9IDA7IHdvcmRfbnIgPCBpbnN0cnVjdGlvbi0+bnJfd29yZHM7IHdvcmRfbnIrKykKLSAgICAgIHsKLQlpbnNuX3VpbnQgY2hlY2tfbWFzayA9IDA7Ci0JaW5zbl91aW50IGNoZWNrX3ZhbCA9IDA7Ci0JaW5zbl93b3JkX2VudHJ5ICp3b3JkID0gaW5zdHJ1Y3Rpb24tPndvcmRbd29yZF9ucl07Ci0JaW50IGJpdF9ucjsKLQotCS8qIGZvcm0gY2hlY2tfbWFzay9jaGVja192YWwgY29udGFpbmluZyB3aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQKLQkgICBpbiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLQlmb3IgKGJpdF9uciA9IDA7IGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsgYml0X25yKyspCi0JICB7Ci0JICAgIGluc25fYml0X2VudHJ5ICpiaXQgPSB3b3JkLT5iaXRbYml0X25yXTsKLQkgICAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQgPSBiaXQtPmZpZWxkOwotCi0JICAgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBuZXh0IGJpdCAqLwotCSAgICBjaGVja19tYXNrIDw8PSAxOwotCSAgICBjaGVja192YWwgPDw9IDE7Ci0JICAgIAotCSAgICAvKiBPbmx5IG5lZWQgdG8gdmFsaWRhdGUgY29uc3RhbnQgKGFuZCByZXNlcnZlZCkKLSAgICAgICAgICAgICAgIGJpdHMuIFNraXAgYW55IG90aGVycyAqLwotCSAgICBpZiAoZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9pbnQKLQkJJiYgZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9yZXNlcnZlZCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAvKiBMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2Ygb3Bjb2RlIHBhdGhzIHRoYXQgbGVhZCB0byB0aGlzCi0gICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIFNlZSBpZiBhbnkgaGF2ZSBmYWlsZWQgdG8gY2hlY2sgdGhlCi0gICAgICAgICAgICAgICByZWxldmFudCBiaXQgKi8KLQkgICAgaWYgKG9wY29kZV9wYXRocyAhPSBOVUxMKQotCSAgICAgIHsKLQkJaW5zbl9vcGNvZGVzICplbnRyeTsKLQkJZm9yIChlbnRyeSA9IG9wY29kZV9wYXRoczsKLQkJICAgICBlbnRyeSAhPSBOVUxMOwotCQkgICAgIGVudHJ5ID0gZW50cnktPm5leHQpCi0JCSAgewotCQkgICAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7Ci0JCSAgICBmb3IgKG9wY29kZSA9IGVudHJ5LT5vcGNvZGU7Ci0JCQkgb3Bjb2RlICE9IE5VTEw7Ci0JCQkgb3Bjb2RlID0gb3Bjb2RlLT5wYXJlbnQpCi0JCSAgICAgIHsKLQkJCWlmIChvcGNvZGUtPndvcmRfbnIgPT0gd29yZF9ucgotCQkJICAgICYmIG9wY29kZS0+Zmlyc3QgPD0gYml0X25yCi0JCQkgICAgJiYgb3Bjb2RlLT5sYXN0ID49IGJpdF9ucikKLQkJCSAgLyogd2UndmUgZGVjb2RlZCBvbiB0aGlzIGJpdCAqLwotCQkJICBicmVhazsKLQkJICAgICAgfQotCQkgICAgaWYgKG9wY29kZSA9PSBOVUxMKQotCQkgICAgICAvKiB0aGUgYml0IHdhc24ndCBkZWNvZGVkIG9uICovCi0JCSAgICAgIGJyZWFrOwotCQkgIH0KLQkJaWYgKGVudHJ5ID09IE5VTEwpCi0JCSAgLyogYWxsIHRoZSBvcGNvZGUgcGF0aHMgZGVjb2RlZCBvbiBCSVRfTlIsIG5vIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgIHRvIGNoZWNrIGl0ICovCi0JCSAgY29udGludWU7Ci0JICAgICAgfQotCSAgICAKLQkgICAgY2hlY2tfbWFzayB8PSAxOwotCSAgICBjaGVja192YWwgfD0gYml0LT52YWx1ZTsKLQkgIH0KLQkKLQkvKiBpZiBhbnkgYml0cyBub3QgY2hlY2tlZCBieSBvcGNvZGUgdGFibGVzLCBvdXRwdXQgY29kZSB0byBjaGVjayB0aGVtICovCi0JaWYgKGNoZWNrX21hc2spCi0JICB7Ci0JICAgIGlmIChucl9jaGVja3MgPT0gMCkKLQkgICAgICB7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgImlmIChXSVRIX1JFU0VSVkVEX0JJVFMpXG4iKTsKLQkJbGZfcHJpbnRmIChmaWxlLCAiICB7XG4iKTsKLQkJbGZfaW5kZW50IChmaWxlLCArNCk7Ci0JICAgICAgfQotCSAgICBucl9jaGVja3MgKys7Ci0JICAgIGlmIChvcHRpb25zLmluc25fYml0X3NpemUgPiAzMikKLQkgICAgICB7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgImlmICgoaW5zdHJ1Y3Rpb25fJWRcbiIsIHdvcmRfbnIpOyAKLQkJbGZfcHJpbnRmIChmaWxlLCAiICAgICAmIFVOU0lHTkVENjQgKDB4JTA4bHglMDhseCkpXG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2sgPj4gMzIpLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2spKTsKLQkJbGZfcHJpbnRmIChmaWxlLCAiICAgICE9IFVOU0lHTkVENjQgKDB4JTA4bHglMDhseCkpXG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX3ZhbCA+PiAzMiksCi0JCQkgICAodW5zaWduZWQgbG9uZykoY2hlY2tfdmFsKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlsZl9wcmludGYgKGZpbGUsICJpZiAoKGluc3RydWN0aW9uXyVkICYgMHglMDhseCkgIT0gMHglMDhseClcbiIsCi0JCQkgICB3b3JkX25yLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2spLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX3ZhbCkpOwotCSAgICAgIH0KLQkgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0JICAgIHByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfaWxsZWdhbCk7Ci0JICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotCSAgfQotICAgICAgfQotICAgIGlmIChucl9jaGVja3MgPiAwKQotICAgICAgewotCWxmX2luZGVudCAoZmlsZSwgLTQpOwotCWxmX3ByaW50ZiAoZmlsZSwgIiAgfVxuIik7Ci0gICAgICB9Ci0gICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZTogRmxvYXRpbmcgUG9pbnQgaGFyZHdhcmUKLSAgICAgCi0gICAgIElmIHRoZSBzaW11bGF0b3IgaXMgYmVpbmcgYnVpbHQgd2l0aCBvdXQgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKLSAgICAgKGRpZmZlcmVudCB0byBpdCBiZWluZyBkaXNhYmxlZCBpbiB0aGUgTVNSKSB0aGVuIGZsb2F0aW5nIHBvaW50Ci0gICAgIGluc3RydWN0aW9ucyBhcmUgaW52YWxpZCAqLwotICB7Ci0gICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5mbGFncywgImYiKSkKLSAgICAgIHsKLQlsZl9wcmludGYgKGZpbGUsICJcbiIpOwotCWxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0JbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQoQ1VSUkVOVF9GTE9BVElOR19QT0lOVClcbiIpOwotCWxmX3ByaW50ZiAoZmlsZSwgIi8qIFZhbGlkYXRlOiBGUCBoYXJkd2FyZSBleGlzdHMgKi9cbiIpOwotCWxmX3ByaW50ZiAoZmlsZSwgImlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UICE9IEhBUkRfRkxPQVRJTkdfUE9JTlQpIHtcbiIpOwotCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCXByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfaWxsZWdhbCk7Ci0JbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0JbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLQlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOwotICAgICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGU6IEZsb2F0aW5nIFBvaW50IGF2YWlsYWJsZQotCi0gICAgIElmIGZsb2F0aW5nIHBvaW50IGlzIG5vdCBhdmFpbGFibGUsIHdlIGVudGVyIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgdW5hdmFpbGFibGUgaW50ZXJydXB0IGludG8gdGhlIGNhY2hlIGluc3RlYWQgb2YgdGhlIGluc3RydWN0aW9uCi0gICAgIHByb3Blci4KLQotICAgICBUaGUgUG93ZXJQQyBzcGVjIHJlcXVpcmVzIGEgQ1NJIGFmdGVyIE1TUltGUF0gaXMgY2hhbmdlZCBhbmQgd2hlbgotICAgICBldmVyIGEgQ1NJIG9jY3VyZXMgd2UgZmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlLiAqLwotCi0gIHsKLSAgICBpZiAoZmlsdGVyX2lzX21lbWJlciAoaW5zdHJ1Y3Rpb24tPmZsYWdzLCAiZiIpKQotICAgICAgewotCWxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0JbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLQlsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZChJU19GUF9BVkFJTEFCTEUpXG4iKTsKLQlsZl9wcmludGYgKGZpbGUsICIvKiBWYWxpZGF0ZTogRlAgYXZhaWxhYmxlIGFjY29yZGluZyB0byBjcHUgKi9cbiIpOwotCWxmX3ByaW50ZiAoZmlsZSwgImlmICghSVNfRlBfQVZBSUxBQkxFKSB7XG4iKTsKLQlsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQlwcmludF9pZGVjb2RlX2ludmFsaWQgKGZpbGUsICJyZXR1cm4iLCAgaW52YWxpZF9mcF91bmF2YWlsYWJsZSk7Ci0JbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0JbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLQlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOwotICAgICAgfQotICB9Ci0gIAotICAvKiBWYWxpZGF0ZTogVmFsaWRhdGUgSW5zdHJ1Y3Rpb24gaW4gY29ycmVjdCBzbG90Ci0KLSAgICAgU29tZSBhcmNoaXRlY3R1cmVzIHBsYWNlIHJlc3RyaWN0aW9ucyBvbiB0aGUgc2xvdCB0aGF0IGFuCi0gICAgIGluc3RydWN0aW9uIGNhbiBiZSBpc3N1ZWQgaW4gKi8KLQotICB7Ci0gICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAicyIpCi0JfHwgb3B0aW9ucy5nZW4uc2xvdF92ZXJpZmljYXRpb24pCi0gICAgICB7Ci0JbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQlsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotCWxmX3ByaW50ZiAoZmlsZSwgIiNpZiBkZWZpbmVkKElTX1dST05HX1NMT1QpXG4iKTsKLQlsZl9wcmludGYgKGZpbGUsICIvKiBWYWxpZGF0ZTogSW5zdHJ1Y3Rpb24gaXNzdWVkIGluIGNvcnJlY3Qgc2xvdCAqL1xuIik7Ci0JbGZfcHJpbnRmIChmaWxlLCAiaWYgKElTX1dST05HX1NMT1QpIHtcbiIpOwotCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCXByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfd3Jvbmdfc2xvdCk7Ci0JbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0JbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLQlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOwotICAgICAgfQotICB9Ci0gIAotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXZvaWQKLXByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25faGVhZGVyIChsZiAqZmlsZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb2Nlc3NvciwKLQkJCQkgICAgIGZ1bmN0aW9uX2RlY2xfdHlwZSBkZWNsX3R5cGUsCi0JCQkJICAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKLXsKLSAgaW50IGluZGVudDsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgc3dpdGNoIChkZWNsX3R5cGUpCi0gICAgewotICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVjbGFyYXRpb246Ci0gICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSwKLQkJCQkJIklOTElORV9JREVDT0RFIiwKLQkJCQkJIiAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKLSAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlX2Z1bmN0aW9uIChmaWxlLCBwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlLAotCQkJCQkiSU5MSU5FX0lERUNPREUiLAotCQkJCQkiXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6Ci0gICAgICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlIChmaWxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAoKiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpbmRlbnQgPSBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJCSJpc3N1ZSIsCi0JCQkJTlVMTCwKLQkJCQlwcm9jZXNzb3IsCi0JCQkJTlVMTCwKLQkJCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlKTsKLSAgc3dpdGNoIChkZWNsX3R5cGUpCi0gICAgewotICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKLSAgICAgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgKCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKLSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuKCIpOwotICAgICAgaW5kZW50ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6Ci0gICAgICBsZl9wdXRzdHIgKGZpbGUsICIpXG4oIik7Ci0gICAgICBpbmRlbnQgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBsZl9pbmRlbnQgKGZpbGUsICtpbmRlbnQpOwotICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICBsZl9wdXRzdHIgKGZpbGUsICIpIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgLWluZGVudCk7Ci0gIHN3aXRjaCAoZGVjbF90eXBlKQotICAgIHsKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlZmluaXRpb246Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKLSAgICBjYXNlIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlOgotICAgICAgbGZfcHV0c3RyIChmaWxlLCAiO1xuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotCi12b2lkCi1wcmludF9pZGVjb2RlX2dsb2JhbHMgKGxmICpmaWxlKQotewotICBsZl9wcmludGYgKGZpbGUsICJlbnVtIHtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIC8qIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVybyA9PiB0YWJsZSAqL1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgZnVuY3Rpb25fZW50cnkgPSAtMSxcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGJvb2xlYW5fZW50cnkgPSAtMixcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJ9O1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pZGVjb2RlX3RhYmxlX2VudHJ5IHtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGludCBzaGlmdDtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIHVuc2lnbmVkJWQgbWFzaztcbiIsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgdW5zaWduZWQlZCB2YWx1ZTtcbiIsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgdm9pZCAqZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifSBpZGVjb2RlX3RhYmxlX2VudHJ5O1xuIik7Ci19CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taWRlY29kZS5oIGIvc2ltL2lnZW4vZ2VuLWlkZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2MDkwNC4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9nZW4taWRlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLXZvaWQgcHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9oZWFkZXIKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpwcm9jZXNzb3IsCi0gZnVuY3Rpb25fZGVjbF90eXBlIGRlY2xfdHlwZSwKLSBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLXZvaWQgcHJpbnRfaWRlY29kZV9nbG9iYWxzCi0obGYgKmZpbGUpOwotCi12b2lkIHByaW50X2lkZWNvZGVfbG9va3VwcwotKGxmICpmaWxlLAotIGdlbl9lbnRyeSAqdGFibGUsCi0gY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKTsKLQotdm9pZCBwcmludF9pZGVjb2RlX2JvZHkKLShsZiAqZmlsZSwKLSBnZW5fZW50cnkgKnRhYmxlLAotIGNvbnN0IGNoYXIgKnJlc3VsdCk7Ci0KLQotCi0vKiBPdXRwdXQgY29kZSB0byBkbyBhbnkgZmluYWwgY2hlY2tzIG9uIHRoZSBkZWNvZGVkIGluc3RydWN0aW9uLgotICAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB2ZXJpZnlpbmcgYW55IG9uIGRlY29kZWQgZmllbGRzIGhhdmUgdGhlCi0gICBjb3JyZWN0IHZhbHVlIGFuZCBjaGVja2luZyB0aGF0IChmb3IgZmxvYXRpbmcgcG9pbnQpIGZsb2F0aW5nIHBvaW50Ci0gICBoYXJkd2FyZSBpc24ndCBkaXNhYmxlZCAqLwotCi1leHRlcm4gdm9pZCBwcmludF9pZGVjb2RlX3ZhbGlkYXRlCi0obGYgKmZpbGUsCi0gaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0gaW5zbl9vcGNvZGVzICpvcGNvZGVfcGF0aHMpOwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLWl0YWJsZS5jIGIvc2ltL2lnZW4vZ2VuLWl0YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U5MDUzLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi1pdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotI2luY2x1ZGUgImZpbHRlci5oIgotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImxkLWluc24uaCIKLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLQotI2luY2x1ZGUgImdlbi5oIgotCi0jaW5jbHVkZSAiZ2VuLWl0YWJsZS5oIgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotCi0KLXR5cGVkZWYgc3RydWN0IF9pdGFibGVfaW5mbyB7Ci0gIGludCBzaXplb2ZfZm9ybTsKLSAgaW50IHNpemVvZl9uYW1lOwotICBpbnQgc2l6ZW9mX2ZpbGU7Ci19IGl0YWJsZV9pbmZvOwotCi0KLXN0YXRpYyB2b2lkCi1pdGFibGVfaF9pbnNuIChsZiAqZmlsZSwKLQkgICAgICAgaW5zbl90YWJsZSAqZW50cnksCi0JICAgICAgIGluc25fZW50cnkgKmluc3RydWN0aW9uLAotCSAgICAgICB2b2lkICpkYXRhKQotewotICBpbnQgbGVuOwotICBpdGFibGVfaW5mbyAqaW5mbyA9IGRhdGE7Ci0gIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgaW5zdHJ1Y3Rpb24tPmxpbmUpOwotICBsZl9wcmludGYgKGZpbGUsICIgICIpOwotICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkgICAgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCSAgICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgTlVMTCwKLQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIixcbiIpOwotICAvKiB1cGRhdGUgc3VtbWFyeSBpbmZvICovCi0gIGxlbiA9IHN0cmxlbiAoaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lKTsKLSAgaWYgKGluZm8tPnNpemVvZl9mb3JtIDw9IGxlbikKLSAgICBpbmZvLT5zaXplb2ZfZm9ybSA9IGxlbiArIDE7Ci0gIGxlbiA9IHN0cmxlbiAoaW5zdHJ1Y3Rpb24tPm5hbWUpOwotICBpZiAoaW5mby0+c2l6ZW9mX25hbWUgPD0gbGVuKQotICAgIGluZm8tPnNpemVvZl9uYW1lID0gbGVuICsgMTsKLSAgbGVuID0gc3RybGVuIChmaWx0ZXJfZmlsZW5hbWUgKGluc3RydWN0aW9uLT5saW5lLT5maWxlX25hbWUpKTsKLSAgaWYgKGluZm8tPnNpemVvZl9maWxlIDw9IGxlbikKLSAgICBpbmZvLT5zaXplb2ZfZmlsZSA9IGxlbiArIDE7Ci19Ci0KLQotLyogcHJpbnQgdGhlIGxpc3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotaXRhYmxlX3ByaW50X2VudW0gKGxmICpmaWxlLAotCQkgICBmaWx0ZXIgKnNldCwKLQkJICAgY2hhciAqbmFtZSkKLXsKLSAgY2hhciAqZWxlbTsKLSAgbGZfcHJpbnRmIChmaWxlLCAidHlwZWRlZiBlbnVtIHtcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgZm9yIChlbGVtID0gZmlsdGVyX25leHQgKHNldCwgIiIpOwotICAgICAgIGVsZW0gIT0gTlVMTDsKLSAgICAgICBlbGVtID0gZmlsdGVyX25leHQgKHNldCwgZWxlbSkpCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXNpdGFibGVfJXNfJXMsXG4iLAotCQkgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBuYW1lLCBlbGVtKTsKLSAgICAgIGlmIChzdHJsZW4gKG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCkgPiAwKQotCXsKLQkgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0JICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lIGl0YWJsZV8lc18lcyAlc2l0YWJsZV8lc18lc1xuIiwKLQkJICAgICBuYW1lLCBlbGVtLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUsIGVsZW0pOwotCX0KLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIm5yXyVzaXRhYmxlXyVzcyxcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSk7Ci0gIAotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifSAlc2l0YWJsZV8lc3M7XG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUpOwotICBpZiAoc3RybGVuIChvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpID4gMCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSBpdGFibGVfJXNzICVzaXRhYmxlXyVzc1xuIiwKLQkJIG5hbWUsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSk7Ci0gICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSBucl9pdGFibGVfJXNzIG5yXyVzaXRhYmxlXyVzc1xuIiwKLQkJIG5hbWUsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSk7Ci0gICAgfQotfQotCi0vKiBwcmludCBhbiBhcnJheSBvZiB0aGUgb3B0aW9uIG5hbWVzIGFzIHN0cmluZ3MgKi8KLQotc3RhdGljIHZvaWQKLWl0YWJsZV9wcmludF9uYW1lcyAobGYgKmZpbGUsCi0JCSAgICBmaWx0ZXIgKnNldCwKLQkJICAgIGNoYXIgKm5hbWUpCi17Ci0gIGNoYXIgKmVsZW07Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImNvbnN0IGNoYXIgKiVzaXRhYmxlXyVzX25hbWVzW25yXyVzaXRhYmxlXyVzcyArIDFdID0ge1xuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSk7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICBmb3IgKGVsZW0gPSBmaWx0ZXJfbmV4dCAoc2V0LCAiIik7Ci0gICAgICAgZWxlbSAhPSBOVUxMOwotICAgICAgIGVsZW0gPSBmaWx0ZXJfbmV4dCAoc2V0LCBlbGVtKSkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcIiVzXCIsXG4iLCBlbGVtKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIjAsXG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIn07XG4iKTsKLX0KLQotZXh0ZXJuIHZvaWQgCi1nZW5faXRhYmxlX2ggKGxmICpmaWxlLAotCSAgICAgIGluc25fdGFibGUgKmlzYSkKLXsKLSAgaXRhYmxlX2luZm8gKmluZm8gPSBaQUxMT0MgKGl0YWJsZV9pbmZvKTsKLQotICAvKiBvdXRwdXQgYW4gZW51bWVyYXRlZCB0eXBlIGZvciBlYWNoIGluc3RydWN0aW9uICovCi0gIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKLSAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuIChmaWxlLCBpc2EsIGl0YWJsZV9oX2luc24sIGluZm8pOwotICBsZl9wcmludGYgKGZpbGUsICIgIG5yXyVzaXRhYmxlX2VudHJpZXMsXG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICJ9ICVzaXRhYmxlX2luZGV4O1xuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICAvKiBvdXRwdXQgYW4gZW51bWVyYXRpb24gdHlwZSBmb3IgZWFjaCBmbGFnICovCi0gIGl0YWJsZV9wcmludF9lbnVtIChmaWxlLCBpc2EtPmZsYWdzLCAiZmxhZyIpOwotICBsZl9wcmludGYgKGZpbGUsICJleHRlcm4gY29uc3QgY2hhciAqJXNpdGFibGVfZmxhZ19uYW1lc1tdO1xuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgCi0gIC8qIG91dHB1dCBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgdGhlIHBvc3NpYmxlIG9wdGlvbnMgKi8KLSAgaXRhYmxlX3ByaW50X2VudW0gKGZpbGUsIGlzYS0+b3B0aW9ucywgIm9wdGlvbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJleHRlcm4gY29uc3QgY2hhciAqJXNpdGFibGVfb3B0aW9uX25hbWVzW107XG4iLAotCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICAvKiBvdXRwdXQgYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSBwcm9jZXNzb3IgbW9kZWxzICovCi0gIGl0YWJsZV9wcmludF9lbnVtIChmaWxlLCBpc2EtPm1vZGVsLT5wcm9jZXNzb3JzLCAicHJvY2Vzc29yIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyIColc2l0YWJsZV9wcm9jZXNzb3JfbmFtZXNbXTtcbiIsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotCi0gIC8qIG91dHB1dCB0aGUgdGFibGUgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGluc3RydWN0aW9uIGluZm8gKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgXyVzaXRhYmxlX2luc3RydWN0aW9uX2luZm8ge1xuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgJXNpdGFibGVfaW5kZXggbnI7XG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgKmZvcm1hdDtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgKmZvcm07XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpmbGFncztcbiIpOwotCi0gIC8qIG5yX2l0YWJsZV8qIG1heSBiZSB6ZXJvLCBzbyB3ZSBhZGQgMSB0byBhdm9pZCBhbgotICAgICBpbGxlZ2FsIHplcm8tc2l6ZWQgYXJyYXkuICovCi0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciBmbGFnW25yXyVzaXRhYmxlX2ZsYWdzICsgMV07XG4iLAotCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpvcHRpb25zO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciBvcHRpb25bbnJfJXNpdGFibGVfb3B0aW9ucyArIDFdO1xuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciAqcHJvY2Vzc29ycztcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgcHJvY2Vzc29yW25yXyVzaXRhYmxlX3Byb2Nlc3NvcnMgKyAxXTtcbiIsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgKm5hbWU7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpmaWxlO1xuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgaW50IGxpbmVfbnI7XG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifSAlc2l0YWJsZV9pbmZvO1xuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiZXh0ZXJuICVzaXRhYmxlX2luZm8gJXNpdGFibGVbbnJfJXNpdGFibGVfZW50cmllc107XG4iLAotCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBpZiAoc3RybGVuIChvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpID4gMCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSBpdGFibGUgJXNpdGFibGVcbiIsCi0JCSBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICAvKiBvdXRwdXQgYW4gZW51bSBkZWZpbmluZyB0aGUgbWF4IHNpemUgb2YgdmFyaW91cyBpdGFibGUgbWVtYmVycyAqLwotICBsZl9wcmludGYgKGZpbGUsICJlbnVtIHtcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIgIHNpemVvZl8lc2l0YWJsZV9mb3JtID0gJWQsXG4iLAotCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBpbmZvLT5zaXplb2ZfZm9ybSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgc2l6ZW9mXyVzaXRhYmxlX25hbWUgPSAlZCxcbiIsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIGluZm8tPnNpemVvZl9uYW1lKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICBzaXplb2ZfJXNpdGFibGVfZmlsZSA9ICVkLFxuIiwKLQkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgaW5mby0+c2l6ZW9mX2ZpbGUpOwotICBsZl9wcmludGYgKGZpbGUsICJ9O1xuIik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1pdGFibGVfcHJpbnRfc2V0IChsZiAqZmlsZSwKLQkJICBmaWx0ZXIgKnNldCwKLQkJICBmaWx0ZXIgKm1lbWJlcnMpCi17Ci0gIGNoYXIgKmVsZW07Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlwiIik7Ci0gIGVsZW0gPSBmaWx0ZXJfbmV4dCAobWVtYmVycywgIiIpOwotICBpZiAoZWxlbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgZWxlbSk7Ci0JICBlbGVtID0gZmlsdGVyX25leHQgKG1lbWJlcnMsIGVsZW0pOwotCSAgaWYgKGVsZW0gPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICBsZl9wcmludGYgKGZpbGUsICIsIik7Ci0JfQotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiXCIsXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgInsiKTsKLSAgZm9yIChlbGVtID0gZmlsdGVyX25leHQgKHNldCwgIiIpOwotICAgICAgIGVsZW0gIT0gTlVMTDsKLSAgICAgICBlbGVtID0gZmlsdGVyX25leHQgKHNldCwgZWxlbSkpCi0gICAgewotICAgICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKG1lbWJlcnMsIGVsZW0pKQotCXsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiAxLCIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICIgMCwiKTsKLQl9Ci0gICAgICAKLSAgICB9Ci0gIC8qIGFsd2F5cyBwcmludCBhIGR1bW15IGVsZW1lbnQsIHRvIGF2b2lkIGVtcHR5IGluaXRpYWxpemVycy4gKi8KLSAgbGZfcHJpbnRmKGZpbGUsICIgOTkgfSxcbiIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1pdGFibGVfY19pbnNuIChsZiAqZmlsZSwKLQkgICAgICAgaW5zbl90YWJsZSAqaXNhLAotCSAgICAgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKLQkgICAgICAgdm9pZCAqZGF0YSkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAieyAiKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJICAgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaXRhYmxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiLFxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlwiIik7Ci0gIHByaW50X2luc25fd29yZHMgKGZpbGUsIGluc3RydWN0aW9uKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXCIsXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXCIlc1wiLFxuIiwgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lKTsKLQotICBpdGFibGVfcHJpbnRfc2V0IChmaWxlLCBpc2EtPmZsYWdzLCBpbnN0cnVjdGlvbi0+ZmxhZ3MpOwotICBpdGFibGVfcHJpbnRfc2V0IChmaWxlLCBpc2EtPm9wdGlvbnMsIGluc3RydWN0aW9uLT5vcHRpb25zKTsKLSAgaXRhYmxlX3ByaW50X3NldCAoZmlsZSwgaXNhLT5tb2RlbC0+cHJvY2Vzc29ycywgaW5zdHJ1Y3Rpb24tPnByb2Nlc3NvcnMpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAiXCIlc1wiLFxuIiwgaW5zdHJ1Y3Rpb24tPm5hbWUpOwotICBsZl9wcmludGYoZmlsZSwgIlwiJXNcIixcbiIsCi0JICAgIGZpbHRlcl9maWxlbmFtZSAoaW5zdHJ1Y3Rpb24tPmxpbmUtPmZpbGVfbmFtZSkpOwotICBsZl9wcmludGYoZmlsZSwgIiVkLFxuIiwgaW5zdHJ1Y3Rpb24tPmxpbmUtPmxpbmVfbnIpOwotICBsZl9wcmludGYoZmlsZSwgIn0sXG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci19Ci0KLQotZXh0ZXJuIHZvaWQgCi1nZW5faXRhYmxlX2MgKGxmICpmaWxlLAotCSAgICAgIGluc25fdGFibGUgKmlzYSkKLXsKLSAgLyogbGVhZGVyICovCi0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCIlc2l0YWJsZS5oXCJcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICAvKiBGSVhNRSAtIG91dHB1dCBtb2RlbCBkYXRhPz8/ICovCi0gIC8qIEZJWE1FIC0gb3V0cHV0IGFzc2VtYmxlciBkYXRhPz8/ICovCi0KLSAgLyogb3V0cHV0IHRoZSBmbGFnLCBvcHRpb24gYW5kIHByb2Nlc3NvciBuYW1lIHRhYmxlcyAqLwotICBpdGFibGVfcHJpbnRfbmFtZXMgKGZpbGUsIGlzYS0+ZmxhZ3MsICJmbGFnIik7Ci0gIGl0YWJsZV9wcmludF9uYW1lcyAoZmlsZSwgaXNhLT5vcHRpb25zLCAib3B0aW9uIik7Ci0gIGl0YWJsZV9wcmludF9uYW1lcyAoZmlsZSwgaXNhLT5tb2RlbC0+cHJvY2Vzc29ycywgInByb2Nlc3NvciIpOwotCi0gIC8qIG91dHB1dCB0aGUgdGFibGUgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGluc3RydWN0aW9uIGluZm8gKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXNpdGFibGVfaW5mbyAlc2l0YWJsZVtucl8lc2l0YWJsZV9lbnRyaWVzXSA9IHtcbiIsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsCi0JICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24gKGZpbGUsIGlzYSwgaXRhYmxlX2NfaW5zbiwgTlVMTCk7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Ci19CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taXRhYmxlLmggYi9zaW0vaWdlbi9nZW4taXRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Yzg2NTkuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZ2VuLWl0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogT3V0cHV0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KLQotZXh0ZXJuIHZvaWQgZ2VuX2l0YWJsZV9oCi0obGYgKmZpbGUsCi0gaW5zbl90YWJsZSAqdGFibGUpOwotCi1leHRlcm4gdm9pZCBnZW5faXRhYmxlX2MKLShsZiAqZmlsZSwKLSBpbnNuX3RhYmxlICp0YWJsZSk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tbW9kZWwuYyBiL3NpbS9pZ2VuL2dlbi1tb2RlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2IzMDBhLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi1tb2RlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJnZW4tbW9kZWwuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1tb2RlbF9jX29yX2hfZGF0YShpbnNuX3RhYmxlICp0YWJsZSwKLQkJICBsZiAqZmlsZSwKLQkJICB0YWJsZV9lbnRyeSAqZGF0YSkKLXsKLSAgaWYgKGRhdGEtPmFubmV4KSB7Ci0gICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZGF0YS0+YW5uZXhfbGluZSk7Ci0gICAgbGZfcHJpbnRfX2NfY29kZShmaWxlLCBkYXRhLT5hbm5leCk7Ci0gICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLW1vZGVsX2Nfb3JfaF9mdW5jdGlvbihpbnNuX3RhYmxlICplbnRyeSwKLQkJICAgICAgbGYgKmZpbGUsCi0JCSAgICAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbiwKLQkJICAgICAgY2hhciAqcHJlZml4KQotewotICBpZiAoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSA9PSBOVUxMCi0gICAgICB8fCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdWzBdID09ICdcMCcpIHsKLSAgICBlcnJvcigiTW9kZWwgZnVuY3Rpb24gdHlwZSBub3Qgc3BlY2lmaWVkIGZvciAlcyIsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0pOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdLCBwcmVmaXgsICIgIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiJXNcbiglcyk7XG4iLAotCSAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdLAotCSAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3BhcmFtXSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotdm9pZCAKLWdlbl9tb2RlbF9oKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKLXsKLSAgaW5zbiAqaW5zbl9wdHI7Ci0gIG1vZGVsICptb2RlbF9wdHI7Ci0gIGluc24gKm1hY3JvOwotICBjaGFyICpuYW1lOwotICBpbnQgbW9kZWxfY3JlYXRlX3AgPSAwOwotICBpbnQgbW9kZWxfaW5pdF9wID0gMDsKLSAgaW50IG1vZGVsX2hhbHRfcCA9IDA7Ci0gIGludCBtb2RlbF9tb25faW5mb19wID0gMDsKLSAgaW50IG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDA7Ci0KLSAgZm9yKG1hY3JvID0gbW9kZWxfbWFjcm9zOyBtYWNybzsgbWFjcm8gPSBtYWNyby0+bmV4dCkgewotICAgIG1vZGVsX2Nfb3JfaF9kYXRhKHRhYmxlLCBmaWxlLCBtYWNyby0+ZmlsZV9lbnRyeSk7Ci0gIH0KLQotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSBfbW9kZWxfZW51bSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIE1PREVMX05PTkUsXG4iKTsKLSAgZm9yIChtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIE1PREVMXyVzLFxuIiwgbW9kZWxfcHRyLT5uYW1lKTsKLSAgfQotICBsZl9wcmludGYoZmlsZSwgIiAgbnJfbW9kZWxzXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9IG1vZGVsX2VudW07XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBERUZBVUxUX01PREVMIE1PREVMXyVzXG4iLCAobW9kZWxzKSA/IG1vZGVscy0+bmFtZSA6ICJOT05FIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9tb2RlbF9kYXRhIG1vZGVsX2RhdGE7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHN0cnVjdCBfbW9kZWxfdGltZSBtb2RlbF90aW1lO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBtb2RlbF9lbnVtIGN1cnJlbnRfbW9kZWw7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJleHRlcm4gY29uc3QgY2hhciAqbW9kZWxfbmFtZVsgKGludClucl9tb2RlbHMgXTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyICpjb25zdCAqY29uc3QgbW9kZWxfZnVuY191bml0X25hbWVbIChpbnQpbnJfbW9kZWxzIF07XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJleHRlcm4gY29uc3QgbW9kZWxfdGltZSAqY29uc3QgbW9kZWxfdGltZV9tYXBwaW5nWyAoaW50KW5yX21vZGVscyBdO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9mdW5jdGlvbnM7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7Ci0gICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIklOTElORV9NT0RFTCIpOwotICAgIG5hbWUgPSBpbnNuX3B0ci0+ZmlsZV9lbnRyeS0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdOwotICAgIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9jcmVhdGUiKSA9PSAwKQotICAgICAgbW9kZWxfY3JlYXRlX3AgPSAxOwotICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2luaXQiKSA9PSAwKQotICAgICAgbW9kZWxfaW5pdF9wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9oYWx0IikgPT0gMCkKLSAgICAgIG1vZGVsX2hhbHRfcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm8iKSA9PSAwKQotICAgICAgbW9kZWxfbW9uX2luZm9fcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm9fZnJlZSIpID09IDApCi0gICAgICBtb2RlbF9tb25faW5mb19mcmVlX3AgPSAxOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9jcmVhdGVfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX2RhdGEgKiIsICJJTkxJTkVfTU9ERUwiLCAiICIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfY3JlYXRlXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIihzaW1fY3B1ICpjcHUpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9pbml0X3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICIgIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9pbml0XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIihtb2RlbF9kYXRhICptb2RlbF9wdHIpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9oYWx0X3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICIgIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9oYWx0XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIihtb2RlbF9kYXRhICptb2RlbF9wdHIpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9tb25faW5mb19wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfcHJpbnQgKiIsICJJTkxJTkVfTU9ERUwiLCAiICIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm9cbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cik7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBpZiAoIW1vZGVsX21vbl9pbmZvX2ZyZWVfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX21vbl9pbmZvX2ZyZWVcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cixcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiIG1vZGVsX3ByaW50ICppbmZvX3B0cik7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICIgIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfc2V0XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIoY29uc3QgY2hhciAqbmFtZSk7XG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IF9tb2RlbF9jX3Bhc3NlZF9kYXRhIG1vZGVsX2NfcGFzc2VkX2RhdGE7Ci1zdHJ1Y3QgX21vZGVsX2NfcGFzc2VkX2RhdGEgewotICBsZiAqZmlsZTsKLSAgbW9kZWwgKm1vZGVsX3B0cjsKLX07Ci0KLXN0YXRpYyB2b2lkCi1tb2RlbF9jX2luc24oaW5zbl90YWJsZSAqZW50cnksCi0JICAgICBsZiAqcGhvbnlfZmlsZSwKLQkgICAgIHZvaWQgKmRhdGEsCi0JICAgICBpbnNuICppbnN0cnVjdGlvbiwKLQkgICAgIGludCBkZXB0aCkKLXsKLSAgbW9kZWxfY19wYXNzZWRfZGF0YSAqZGF0YV9wdHIgPSAobW9kZWxfY19wYXNzZWRfZGF0YSAqKWRhdGE7Ci0gIGxmICpmaWxlID0gZGF0YV9wdHItPmZpbGU7Ci0gIGNoYXIgKmN1cnJlbnRfbmFtZSA9IGRhdGFfcHRyLT5tb2RlbF9wdHItPnByaW50YWJsZV9uYW1lOwotICB0YWJsZV9tb2RlbF9lbnRyeSAqbW9kZWxfcHRyID0gaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPm1vZGVsX2ZpcnN0OwotCi0gIHdoaWxlIChtb2RlbF9wdHIpIHsKLSAgICBpZiAobW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9uYW1lXSA9PSBjdXJyZW50X25hbWUpIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICB7ICUtKnMgfSwgIC8qICVzICovXG4iLAotCQltYXhfbW9kZWxfZmllbGRzX2xlbiwKLQkJbW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9maWVsZHNdLAotCQlpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dDsKLSAgfQotCi0gIGxmX3ByaW50ZihmaWxlLCAiICB7ICUtKnMgfSwgIC8qICVzICovXG4iLAotCSAgICBtYXhfbW9kZWxfZmllbGRzX2xlbiwKLQkgICAgZGF0YV9wdHItPm1vZGVsX3B0ci0+aW5zbl9kZWZhdWx0LAotCSAgICBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0pOwotfQotCi1zdGF0aWMgdm9pZAotbW9kZWxfY19mdW5jdGlvbihpbnNuX3RhYmxlICp0YWJsZSwKLQkJIGxmICpmaWxlLAotCQkgdGFibGVfZW50cnkgKmZ1bmN0aW9uLAotCQkgY29uc3QgY2hhciAqcHJlZml4KQotewotICBpZiAoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSA9PSBOVUxMCi0gICAgICB8fCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdWzBdID09ICdcMCcpCi0gICAgewotICAgICAgZXJyb3IoIk1vZGVsIGZ1bmN0aW9uIHJldHVybiB0eXBlIG5vdCBzcGVjaWZpZWQgZm9yICVzIiwKLQkgICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdLCBwcmVmaXgsICJcbiIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIlcyglcylcbiIsCi0JCWZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0sCi0JCWZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fcGFyYW1dKTsKLSAgICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGlmIChmdW5jdGlvbi0+YW5uZXgpCi0gICAgewotICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgICAgIHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKGZpbGUsIGZ1bmN0aW9uLT5hbm5leF9saW5lKTsKLSAgICAgIGxmX3ByaW50X19jX2NvZGUoZmlsZSwgZnVuY3Rpb24tPmFubmV4KTsKLSAgICAgIGxmX2luZGVudChmaWxlLCAtMik7Ci0gICAgfQotICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOwotICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci19Ci0KLXZvaWQgCi1nZW5fbW9kZWxfYyhpbnNuX3RhYmxlICp0YWJsZSwgbGYgKmZpbGUpCi17Ci0gIGluc24gKmluc25fcHRyOwotICBtb2RlbCAqbW9kZWxfcHRyOwotICBjaGFyICpuYW1lOwotICBpbnQgbW9kZWxfY3JlYXRlX3AgPSAwOwotICBpbnQgbW9kZWxfaW5pdF9wID0gMDsKLSAgaW50IG1vZGVsX2hhbHRfcCA9IDA7Ci0gIGludCBtb2RlbF9tb25faW5mb19wID0gMDsKLSAgaW50IG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDA7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiY3B1LmhcIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJtb24uaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpZmRlZiBIQVZFX1NURExJQl9IXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSA8c3RkbGliLmg+XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgZm9yKGluc25fcHRyID0gbW9kZWxfZGF0YTsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX29yX2hfZGF0YSh0YWJsZSwgZmlsZSwgaW5zbl9wdHItPmZpbGVfZW50cnkpOwotICB9Ci0KLSAgZm9yKGluc25fcHRyID0gbW9kZWxfc3RhdGljOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2Nfb3JfaF9mdW5jdGlvbih0YWJsZSwgZmlsZSwgaW5zbl9wdHItPmZpbGVfZW50cnksICIvKmgqL1NUQVRJQyIpOwotICB9Ci0KLSAgZm9yKGluc25fcHRyID0gbW9kZWxfaW50ZXJuYWw7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7Ci0gICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIlNUQVRJQ19JTkxJTkVfTU9ERUwiKTsKLSAgfQotCi0gIGZvcihpbnNuX3B0ciA9IG1vZGVsX3N0YXRpYzsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIi8qYyovU1RBVElDIik7Ci0gIH0KLQotICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9pbnRlcm5hbDsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIlNUQVRJQ19JTkxJTkVfTU9ERUwiKTsKLSAgfQotCi0gIGZvcihpbnNuX3B0ciA9IG1vZGVsX2Z1bmN0aW9uczsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIklOTElORV9NT0RFTCIpOwotICAgIG5hbWUgPSBpbnNuX3B0ci0+ZmlsZV9lbnRyeS0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdOwotICAgIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9jcmVhdGUiKSA9PSAwKQotICAgICAgbW9kZWxfY3JlYXRlX3AgPSAxOwotICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2luaXQiKSA9PSAwKQotICAgICAgbW9kZWxfaW5pdF9wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9oYWx0IikgPT0gMCkKLSAgICAgIG1vZGVsX2hhbHRfcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm8iKSA9PSAwKQotICAgICAgbW9kZWxfbW9uX2luZm9fcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm9fZnJlZSIpID09IDApCi0gICAgICBtb2RlbF9tb25faW5mb19mcmVlX3AgPSAxOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9jcmVhdGVfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX2RhdGEgKiIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2NyZWF0ZShzaW1fY3B1ICpjcHUpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICByZXR1cm4gKG1vZGVsX2RhdGEgKikwO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBpZiAoIW1vZGVsX2luaXRfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9pbml0KG1vZGVsX2RhdGEgKm1vZGVsX3B0cilcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBpZiAoIW1vZGVsX2hhbHRfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9oYWx0KG1vZGVsX2RhdGEgKm1vZGVsX3B0cilcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBpZiAoIW1vZGVsX21vbl9pbmZvX3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJtb2RlbF9wcmludCAqIiwgIklOTElORV9NT0RFTCIsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm8obW9kZWxfZGF0YSAqbW9kZWxfcHRyKVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgcmV0dXJuIChtb2RlbF9wcmludCAqKTA7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotCi0gIGlmICghbW9kZWxfbW9uX2luZm9fZnJlZV9wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX21vbl9pbmZvX2ZyZWUobW9kZWxfZGF0YSAqbW9kZWxfcHRyLFxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAgICAgICAgICAgICAgIG1vZGVsX3ByaW50ICppbmZvX3B0cilcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBsZl9wcmludGYoZmlsZSwgIi8qIEluc24gZnVuY3Rpb25hbCB1bml0IGluZm8gKi9cbiIpOwotICBmb3IobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2NfcGFzc2VkX2RhdGEgZGF0YTsKLQotICAgIGxmX3ByaW50ZihmaWxlLCAic3RhdGljIGNvbnN0IG1vZGVsX3RpbWUgbW9kZWxfdGltZV8lc1tdID0ge1xuIiwgbW9kZWxfcHRyLT5uYW1lKTsKLSAgICBkYXRhLmZpbGUgPSBmaWxlOwotICAgIGRhdGEubW9kZWxfcHRyID0gbW9kZWxfcHRyOwotICAgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKLQkJCSAgICAgTlVMTCwgKHZvaWQgKikmZGF0YSwKLQkJCSAgICAgbW9kZWxfY19pbnNuKTsKLQotICAgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxmXG4iKTsKLSAgfQotCi0gIGxmX3ByaW50ZihmaWxlLCAiI2lmbmRlZiBfSU5MSU5FX0NfXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJjb25zdCBtb2RlbF90aW1lICpjb25zdCBtb2RlbF90aW1lX21hcHBpbmdbIChpbnQpbnJfbW9kZWxzIF0gPSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIChjb25zdCBtb2RlbF90aW1lICpjb25zdCkwLFxuIik7Ci0gIGZvcihtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIG1vZGVsX3RpbWVfJXMsXG4iLCBtb2RlbF9wdHItPm5hbWUpOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgIlxmXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIvKiBtYXAgbW9kZWwgZW51bWVyYXRpb24gaW50byBwcmludGFibGUgc3RyaW5nICovXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaWZuZGVmIF9JTkxJTkVfQ19cbiIpOwotICBsZl9wcmludGYoZmlsZSwgImNvbnN0IGNoYXIgKm1vZGVsX25hbWVbIChpbnQpbnJfbW9kZWxzIF0gPSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIFwiTk9ORVwiLFxuIik7Ci0gIGZvciAobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiICBcIiVzXCIsXG4iLCBtb2RlbF9wdHItPnByaW50YWJsZV9uYW1lKTsKLSAgfQotICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9zZXQoY29uc3QgY2hhciAqbmFtZSlcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICBpZiAobW9kZWxzKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIG1vZGVsX2VudW0gbW9kZWw7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgZm9yKG1vZGVsID0gTU9ERUxfJXM7IG1vZGVsIDwgbnJfbW9kZWxzOyBtb2RlbCsrKSB7XG4iLCBtb2RlbHMtPm5hbWUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgIGlmKHN0cmNtcChuYW1lLCBtb2RlbF9uYW1lW21vZGVsXSkgPT0gMCkge1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICBjdXJyZW50X21vZGVsID0gbW9kZWw7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgIHJldHVybjtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgIH1cbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICB9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIGVycm9yKFwiVW5rbm93biBtb2RlbCAnJSVzJywgTW9kZWxzIHdoaWNoIGFyZSBrbm93biBhcmU6JSVzXG5cIixcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICBuYW1lLFxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAgIFwiIik7Ci0gICAgZm9yKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiXFxuXFx0JXMiLCBtb2RlbF9wdHItPnByaW50YWJsZV9uYW1lKTsKLSAgICB9Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcIik7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgZXJyb3IoXCJObyBtb2RlbHMgYXJlIGN1cnJlbnRseSBrbm93biBhYm91dFwiKTtcbiIpOwotICB9Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLX0KLQotI2VuZGlmCi0KLQotCi12b2lkCi1nZW5fbW9kZWxfaCAobGYgKmZpbGUsCi0JICAgICBpbnNuX3RhYmxlICp0YWJsZSkKLXsKLSAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgInN1ZmZlcmluZyBiaXQgcm90Iik7Ci19Ci0KLQotdm9pZAotZ2VuX21vZGVsX2MgKGxmICpmaWxlLAotCSAgICAgaW5zbl90YWJsZSAqdGFibGUpCi17Ci0gIGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkgKGZpbGUsICJzdWZmZXJpbmcgYml0IHJvdCIpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLW1vZGVsLmggYi9zaW0vaWdlbi9nZW4tbW9kZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4OGUxYi4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9nZW4tbW9kZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLQotZXh0ZXJuIHZvaWQgZ2VuX21vZGVsX2gKLShsZiAqZmlsZSwKLSBpbnNuX3RhYmxlICppc2EpOwotCi1leHRlcm4gdm9pZCBnZW5fbW9kZWxfYwotKGxmICpmaWxlLAotIGluc25fdGFibGUgKmlzYSk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmMgYi9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTRmODIuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0jaW5jbHVkZSAiaWdlbi5oIgotCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotI2luY2x1ZGUgImxkLWRlY29kZS5oIgotCi0jaW5jbHVkZSAiZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCi0jaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0KLQotc3RhdGljIHZvaWQKLXByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlciAobGYgKmZpbGUsCi0JCQkJY29uc3QgY2hhciAqYmFzZW5hbWUsCi0JCQkJY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCi0JCQkJb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCQkJaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24sCi0JCQkJaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIGludCBpbmRlbnQ7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGZpbGUsIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUsCi0JCQkJICAgICJFWFRFUk5fU0VNQU5USUNTIiwKLQkJCQkgICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7Ci0gIGluZGVudCA9IHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkJYmFzZW5hbWUsCi0JCQkJZm9ybWF0X25hbWUsCi0JCQkJTlVMTCwKLQkJCQlleHBhbmRlZF9iaXRzLAotCQkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gIGlmIChpc19mdW5jdGlvbl9kZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICtpbmRlbnQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIoIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOwotICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC1pbmRlbnQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjsiKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci19Ci0KLXZvaWQKLXByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uIChsZiAqZmlsZSwKLQkJCSAgICBpbnNuX2VudHJ5ICppbnNuLAotCQkJICAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkJICAgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKLQkJCSAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKLXsKLSAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyIChmaWxlLAotCQkJCSAgaW5zbi0+bmFtZSwKLQkJCQkgIGluc24tPmZvcm1hdF9uYW1lLAotCQkJCSAgZXhwYW5kZWRfYml0cywKLQkJCQkgIDAvKiBpcyBub3QgZnVuY3Rpb24gZGVmaW5pdGlvbiovLAotCQkJCSAgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci19Ci0KLQotDAotLyogZ2VuZXJhdGUgdGhlIHNlbWFudGljcy5jIGZpbGUgKi8KLQotCi12b2lkCi1wcmludF9pZGVjb2RlX2ludmFsaWQgKGxmICpmaWxlLAotCQkgICAgICAgY29uc3QgY2hhciAqcmVzdWx0LAotCQkgICAgICAgaW52YWxpZF90eXBlIHR5cGUpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDogbmFtZSA9ICJ1bmtub3duIjsgYnJlYWs7Ci0gICAgY2FzZSBpbnZhbGlkX2lsbGVnYWw6IG5hbWUgPSAiaWxsZWdhbCI7IGJyZWFrOwotICAgIGNhc2UgaW52YWxpZF9mcF91bmF2YWlsYWJsZTogbmFtZSA9ICJmcF91bmF2YWlsYWJsZSI7IGJyZWFrOwotICAgIGNhc2UgaW52YWxpZF93cm9uZ19zbG90OiBuYW1lID0gIndyb25nX3Nsb3QiOyBicmVhazsKLSAgICB9Ci0gIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gJXNfJXM7XG4iLAotCQkgKG9wdGlvbnMuZ2VuLmljYWNoZSA/ICJpY2FjaGUiIDogInNlbWFudGljIiksCi0JCSBuYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIlcyAlc2ljYWNoZV8lcyAoIiwgcmVzdWx0LCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsIG5hbWUpOwotICAgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2FjdHVhbCAoZmlsZSwgMCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpO1xuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMgJXNzZW1hbnRpY18lcyAoIiwgcmVzdWx0LCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsIG5hbWUpOwotICAgICAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fYWN0dWFsIChmaWxlLCAwKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotcHJpbnRfc2VtYW50aWNfYm9keSAobGYgKmZpbGUsCi0JCSAgICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0JCSAgICAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSAgICAgaW5zbl9vcGNvZGVzICpvcGNvZGVzKQotewotICAvKiB2YWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGEgY2FjaGUgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KLSAgaWYgKCFvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZXMpOwotICAgIH0KLSAgCi0gIHByaW50X2l0cmFjZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sIDAvKnB1dF92YWx1ZV9pbl9jYWNoZSovKTsKLSAgCi0gIC8qIGdlbmVyYXRlIHRoZSBpbnN0cnVjdGlvbiBwcm9maWxlIGNhbGwgLSB0aGlzIGlzIGRlbGF5ZWQgdW50aWwKLSAgICAgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkLiAgVGhlIGNvdW50IG1hY3JvCi0gICAgIGdlbmVyYXRlZCBpcyBwcmVmaXhlZCBieSBJVEFCTEVfUFJFRklYICovCi0gIHsKLSAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKCVzUFJPRklMRV9DT1VOVF9JTlNOKVxuIiwKLQkgICAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC51KTsKLSAgICBsZl9wcmludGYgKGZpbGUsICIlc1BST0ZJTEVfQ09VTlRfSU5TTiAoQ1BVLCBDSUEsIE1ZX0lOREVYKTtcbiIsCi0JICAgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgudSk7Ci0gICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOwotICB9Ci0KLSAgLyogZ2VuZXJhdGUgdGhlIG1vZGVsIGNhbGwgLSB0aGlzIGlzIGRlbGF5ZWQgdW50aWwgYWZ0ZXIgdGhlCi0gICAgIGluc3RydWN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkICovCi0gIHsKLSAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKFdJVEhfTU9OKVxuIik7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiLyogbW9uaXRvcmluZzogKi9cbiIpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChXSVRIX01PTiAmIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpXG4iKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICIgIG1vbl9pc3N1ZSAoIik7Ci0gICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSBpbnN0cnVjdGlvbi0+bmFtZSwKLQkJCSBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCQkgTlVMTCwKLQkJCSBOVUxMLAotCQkJIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiLCBjcHUsIGNpYSk7XG4iKTsKLSAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgfQotICAKLSAgLyogZGV0ZXJtaW5lIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotICB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIvKiBrZWVwIHRoZSBuZXh0IGluc3RydWN0aW9uIGFkZHJlc3MgaGFuZHkgKi9cbiIpOwotICAgIGlmIChvcHRpb25zLmdlbi5uaWEgPT0gbmlhX2lzX2ludmFsaWQpCi0gICAgICB7Ci0JbGZfcHJpbnRmKGZpbGUsICJuaWEgPSAlc0lOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUztcbiIsCi0JCSAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC51KTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JaW50IG5yX2ltbWVkcyA9IGluc3RydWN0aW9uLT5ucl93b3JkcyAtIDE7Ci0JaWYgKG9wdGlvbnMuZ2VuLmRlbGF5ZWRfYnJhbmNoKQotCSAgewotCSAgICBpZiAobnJfaW1tZWRzID4gMCkKLQkgICAgICB7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgImNpYS5kcCArPSAlZCAqICVkOyAlc1xuIiwKLQkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgsIG5yX2ltbWVkcywKLQkJCSAgICIvKiBza2lwIGRwIGltbWVkcyAqLyIpOwotCSAgICAgIH0KLQkgICAgbGZfcHJpbnRmIChmaWxlLCAibmlhLmlwID0gY2lhLmRwOyAlc1xuIiwKLQkJICAgICAgICIvKiBpbnN0cnVjdGlvbiBwb2ludGVyICovIik7Ci0JICAgIGxmX3ByaW50ZiAoZmlsZSwgIm5pYS5kcCA9IGNpYS5kcCArICVkOyAlc1xuIiwKLQkJICAgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgsCi0JCSAgICAgICAiLyogZGVsYXllZC1zbG90IHBvaW50ZXIgKi8iKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChucl9pbW1lZHMgPiAwKQotCSAgICAgIHsKLQkJbGZfcHJpbnRmIChmaWxlLCAibmlhID0gY2lhICsgJWQgKiAoJWQgKyAxKTsgJXNcbiIsCi0JCQkgICBvcHRpb25zLmluc25fYml0X3NpemUgLyA4LCBucl9pbW1lZHMsCi0JCQkgICAiLyogc2tpcCBpbW1lZHMgYXMgd2VsbCAqLyIpOwotCQkKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgIm5pYSA9IGNpYSArICVkO1xuIiwKLQkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotICAKLSAgLyogaWYgY29uZGl0aW9uYWwsIGdlbmVyYXRlIGNvZGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGluc3RydWN0aW9uCi0gICAgIHNob3VsZCBiZSBpc3N1ZWQgKi8KLSAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAiYyIpCi0gICAgICB8fCBvcHRpb25zLmdlbi5jb25kaXRpb25hbF9pc3N1ZSkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogZXhlY3V0ZSBvbmx5IGlmIGNvbmRpdGlvbmFsIHBhc3NlcyAqL1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJpZiAoSVNfQ09ORElUSU9OX09LKVxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIHtcbiIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArNCk7Ci0gICAgICAvKiBGSVhNRSAtIG5lZWQgdG8gbG9nIGEgY29uZGl0aW9uYWwgZmFpbHVyZSAqLwotICAgIH0KLSAgCi0gIC8qIEFyY2hpdGVjdHVyZSBleHBlY3RzIGEgUkVHIHRvIGJlIHplcm8uICBJbnN0ZWFkIG9mIGhhdmluZyB0bwotICAgICBjaGVjayBldmVyeSByZWFkIHRvIHNlZSBpZiBpdCBpcyByZWZlcmluZyB0byB0aGF0IFJFRyBqdXN0IHphcCBpdAotICAgICBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gKi8KLSAgaWYgKG9wdGlvbnMuZ2VuLnplcm9fcmVnKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIvKiBBcmNoaXRlY3R1cmUgZXhwZWN0cyBSRUcgdG8gYmUgemVybyAqL1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJHUFJfQ0xFQVIoJWQpO1xuIiwgb3B0aW9ucy5nZW4uemVyb19yZWdfbnIpOwotICAgIH0KLSAgCi0gIC8qIGdlbmVyYXRlIHRoZSBjb2RlIChvciBhdCBsZWFzdCBzb21ldGhpbmcgKi8KLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiLyogc2VtYW50aWNzOiAqL1xuIik7Ci0gIGlmIChpbnN0cnVjdGlvbi0+Y29kZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHRydWUgY29kZSAqLwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgICAgIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgaW5zdHJ1Y3Rpb24tPmNvZGUtPmxpbmUpOwotICAgICAgdGFibGVfcHJpbnRfY29kZSAoZmlsZSwgaW5zdHJ1Y3Rpb24tPmNvZGUpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKLSAgICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOwotICAgIH0KLSAgZWxzZSBpZiAoZmlsdGVyX2lzX21lbWJlciAoaW5zdHJ1Y3Rpb24tPm9wdGlvbnMsICJub3AiKSkKLSAgICB7Ci0gICAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAic2ltX2VuZ2luZV9hYm9ydCAoIjsKLSAgICAgIGludCBpbmRlbnQgPSBzdHJsZW4gKHByZWZpeCk7Ci0gICAgICAvKiBhYm9ydCBzbyBpdCBpcyBpbXBsZW1lbnRlZCBub3cgKi8KLSAgICAgIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgaW5zdHJ1Y3Rpb24tPmxpbmUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXNTRCwgQ1BVLCBjaWEsIFxcXG4iLCBwcmVmaXgpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAraW5kZW50KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlwiJXM6JWQ6MHglJTA4bHg6JSVzIHVuaW1wbGVtZW50ZWRcXG5cIiwgXFxcbiIsCi0JCSBmaWx0ZXJfZmlsZW5hbWUgKGluc3RydWN0aW9uLT5saW5lLT5maWxlX25hbWUpLAotCQkgaW5zdHJ1Y3Rpb24tPmxpbmUtPmxpbmVfbnIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKGxvbmcpIENJQSwgXFxcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXNpdGFibGVbTVlfSU5ERVhdLm5hbWUpO1xuIiwKLQkJIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC1pbmRlbnQpOwotICAgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7Ci0gICAgfQotICAKLSAgLyogQ2xvc2Ugb2ZmIHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gKi8KLSAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAiYyIpCi0gICAgICB8fCBvcHRpb25zLmdlbi5jb25kaXRpb25hbF9pc3N1ZSkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC00KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgfVxuIik7Ci0gICAgfSAgCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jX3NlbWFudGljIChsZiAqZmlsZSwKLQkJICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKLQkJICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKLQkJICBpbnNuX29wY29kZXMgKm9wY29kZXMsCi0JCSAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotCQkgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICAKLSAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzIpOwotICAKLSAgcHJpbnRfbXlfZGVmaW5lcyAoZmlsZSwKLQkJICAgIGluc3RydWN0aW9uLT5uYW1lLAotCQkgICAgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAotCQkgICAgZXhwYW5kZWRfYml0cyk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAotCQkgICAgIGluc3RydWN0aW9uLAotCQkgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgY2FjaGVfcnVsZXMsCi0JCSAgICAgKG9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MKLQkJICAgICAgPyBkZWZpbmVfdmFyaWFibGVzCi0JCSAgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAotCQkgICAgIChvcHRpb25zLmdlbi5pY2FjaGUKLQkJICAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCi0JCSAgICAgIDogZG9fbm90X3VzZV9pY2FjaGUpLAotCQkgICAgIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICAKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXNpbnN0cnVjdGlvbl9hZGRyZXNzIG5pYTtcbiIsIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCi0JCSAgICAgICBpbnN0cnVjdGlvbiwKLQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgICBvcGNvZGVzKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAicmV0dXJuIG5pYTtcbiIpOwotICAKLSAgLyogZ2VuZXJhdGUgc29tZXRoaW5nIHRvIGNsZWFuIHVwIGFueSAjZGVmaW5lcyBjcmVhdGVkIGZvciB0aGUgY2FjaGUgKi8KLSAgaWYgKG9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MpCi0gICAgewotICAgICAgcHJpbnRfaWNhY2hlX2JvZHkgKGZpbGUsCi0JCQkgaW5zdHJ1Y3Rpb24sCi0JCQkgZXhwYW5kZWRfYml0cywKLQkJCSBjYWNoZV9ydWxlcywKLQkJCSB1bmRlZl92YXJpYWJsZXMsCi0JCQkgKG9wdGlvbnMuZ2VuLmljYWNoZQotCQkJICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKLQkJCSAgOiBkb19ub3RfdXNlX2ljYWNoZSksCi0JCQkgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0gICAgfQotICAKLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbiAobGYgKmZpbGUsCi0JCQkgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKLQkJCSAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkJICAgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAotCQkJICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotCQkJICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIC8qIGJ1aWxkIHRoZSBzZW1hbnRpYyByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uICovCi0gIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkgIGluc3RydWN0aW9uLT5uYW1lLAotCQkJCSAgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAotCQkJCSAgZXhwYW5kZWRfYml0cywKLQkJCQkgIDEvKmlzLWZ1bmN0aW9uLWRlZmluaXRpb24qLywKLQkJCQkgIG5yX3ByZWZldGNoZWRfd29yZHMpOwotICBwcmludF9jX3NlbWFudGljIChmaWxlLAotCQkgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgb3Bjb2RlcywKLQkJICAgIGNhY2hlX3J1bGVzLAotCQkgICAgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci19Ci0KLXZvaWQKLXByaW50X3NlbWFudGljX2RlZmluaXRpb24gKGxmICpmaWxlLAotCQkJICAgaW5zbl9lbnRyeSAqaW5zbiwKLQkJCSAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkJICAgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAotCQkJICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAotCQkJICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIHByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24gKGZpbGUsCi0JCQkgICAgIGluc24sCi0JCQkgICAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICAgIG9wY29kZXMsCi0JCQkgICAgIGNhY2hlX3J1bGVzLAotCQkJICAgICBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLX0KLQotCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmggYi9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWQxZWQuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLS8qIENyZWF0ZXMgdGhlIGZpbGVzIHNlbWFudGljcy5baGNdLgotCi0gICBUaGUgZ2VuZXJhdGVkIGZpbGUgc2VtYW50aWNzIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGltcGxlbWVudCB0aGUKLSAgIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbW9kZWwgYSBzaW5nbGUgdGFyZ2V0IHByb2Nlc3NvciBpbnN0cnVjdGlvbi4KLQotICAgU2V2ZXJhbCBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvbiB0aGUgc2VtYW50aWNzIGZpbGUgY2FuIGJlIGNyZWF0ZWQ6Ci0KLQlvCXVuY2FjaGVkCi0KLSAgICAgICAgCU5vIGluc3RydWN0aW9uIGNhY2hlIGV4aXN0cy4gIFRoZSBzZW1hbnRpYyBmdW5jdGlvbgotCQluZWVkcyB0byBnZW5lcmF0ZSBhbnkgcmVxdWlyZWQgdmFsdWVzIGxvY2FsbHkuCi0KLQlvCWNhY2hlZCAtIHNlcGFyYXRlIGNyYWNrZXIgYW5kIHNlbWFudGljCi0KLQkJVHdvIGluZGVwZW5kYW50IGZ1bmN0aW9ucyBhcmUgY3JlYXRlZC4gIEZpcnN0bHkgdGhlCi0JCWZ1bmN0aW9uIHRoYXQgY3JhY2tzIGFuIGluc3RydWN0aW9uIGVudGVyaW5nIGl0IGludG8gYQotCQljYWNoZSBhbmQgc2Vjb25kbHkgdGhlIHNlbWFudGljIGZ1bmN0aW9uIHByb3BwZXIgdGhhdAotCQl1c2VzIHRoZSBjYWNoZS4KLQotCW8JY2FjaGVkIC0gc2VtYW50aWMgKyBjcmFja2luZyBzZW1hbnRpYwotCi0JCVRoZSBmdW5jdGlvbiB0aGF0IGNyYWNrcyB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGVudGVycwotCQlhbGwgdmFsdWVzIGludG8gdGhlIGNhY2hlIGFsc28gY29udGFpbnMgYSBjb3B5IG9mIHRoZQotCQlzZW1hbnRpYyBjb2RlIChhdm9pZGluZyB0aGUgbmVlZCB0byBjYWxsIGJvdGggdGhlCi0JCWNyYWNrZXIgYW5kIHRoZSBzZW1hbnRpYyBmdW5jdGlvbiB3aGVuIHRoZXJlIGlzIGEKLQkJY2FjaGUgbWlzcykuCi0KLSAgIEZvciBlYWNoIG9mIHRoZXNlIGdlbmVyYWwgZm9ybXMsIHNldmVyYWwgcmVmaW5lbWVudHMgY2FuIG9jY3VyZToKLQotCW8JZG8vZG9uJ3QgZHVwbGljYXRlL2V4cGFuZCBzZW1hbnRpYyBmdW5jdGlvbnMKLQotCQlBcyBhIGNvbnNlcXVlbmNlIG9mIGRlY29kaW5nIGFuIGluc3RydWN0aW9uLCB0aGUKLQkJZGVjb2RlciwgYXMgcGFydCBvZiBpdHMgdGFibGUgbWF5IGhhdmUgZWZmZWN0aXZseSBtYWRlCi0JCWNlcnRhaW4gb2YgdGhlIHZhcmlhYmxlIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbgotCQljb25zdGFudC4gU2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZQotCQlhbHRlcm5hdGl2ZSB2YWx1ZXMgZm9yIHdoYXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMKLQkJYSB2YXJpYWJsZSBwYXJ0IGNhbiBiZSBjcmVhdGVkLgotCi0Jbwl1c2UgY2FjaGUgc3RydWN0IGRpcmVjdGx5LgotCi0JCVdoZW4gYSBjcmFja2luZyBjYWNoZSBpcyBwcmVzZW50LCB0aGUgc2VtYW50aWMKLQkJZnVuY3Rpb25zIGNhbiBiZSBnZW5lcmF0ZWQgdG8gZWl0aGVyIGhvbGQgaW50ZXJtZWRpYXRlCi0JCWNhY2hlIHZhbHVlcyBpbiBsb2NhbCB2YXJpYWJsZXMgb3IgYWx3YXlzIHJlZmVyIHRvIHRoZQotCQljb250ZW50cyBvZiB0aGUgY2FjaGUgZGlyZWN0bHkuICovCi0KLQotCi0KLQotCi1leHRlcm4gdm9pZCBwcmludF9zZW1hbnRpY19kZWNsYXJhdGlvbgotKGxmICpmaWxlLAotIGluc25fZW50cnkgKmluc24sCi0gb3Bjb2RlX2JpdHMgKmJpdHMsCi0gaW5zbl9vcGNvZGVzICpvcGNvZGVzLAotIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfc2VtYW50aWNfZGVmaW5pdGlvbgotKGxmICpmaWxlLAotIGluc25fZW50cnkgKmluc24sCi0gb3Bjb2RlX2JpdHMgKmJpdHMsCi0gaW5zbl9vcGNvZGVzICpvcGNvZGVzLAotIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKLSBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLQotdHlwZWRlZiBlbnVtIHsKLSAgaW52YWxpZF9pbGxlZ2FsLAotICBpbnZhbGlkX2ZwX3VuYXZhaWxhYmxlLAotICBpbnZhbGlkX3dyb25nX3Nsb3QsCi19IGludmFsaWRfdHlwZTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfaWRlY29kZV9pbnZhbGlkCi0obGYgKmZpbGUsCi0gY29uc3QgY2hhciAqcmVzdWx0LAotIGludmFsaWRfdHlwZSB0eXBlKTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfc2VtYW50aWNfYm9keQotKGxmICpmaWxlLAotIGluc25fZW50cnkgKmluc3RydWN0aW9uLAotIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotIGluc25fb3Bjb2RlcyAqb3Bjb2Rlcyk7Ci0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmMgYi9zaW0vaWdlbi9nZW4tc3VwcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2VmYWE3Li4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotI2luY2x1ZGUgImZpbHRlci5oIgotCi0jaW5jbHVkZSAiaWdlbi5oIgotCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotI2luY2x1ZGUgImxkLWRlY29kZS5oIgotCi0jaW5jbHVkZSAiZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCi0jaW5jbHVkZSAiZ2VuLXN1cHBvcnQuaCIKLQotc3RhdGljIHZvaWQKLXByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSAobGYgKmZpbGUsCi0JCQkgICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKLQkJCSAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi17Ci0gIGlmIChmdW5jdGlvbi0+aXNfaW50ZXJuYWwpCi0gICAgewotICAgICAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGZpbGUsIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUsCi0JCQkJCSJJTkxJTkVfU1VQUE9SVCIsCi0JCQkJCShpc19mdW5jdGlvbl9kZWZpbml0aW9uID8gIlxuIiA6ICIgIikpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgIGZ1bmN0aW9uLT5uYW1lLAotCQkJICAgTlVMTCwKLQkJCSAgIE5VTEwsCi0JCQkgICBOVUxMLAotCQkJICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKCIpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIDApOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0gICAgICBpZiAoIWlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi0JbGZfcHJpbnRmIChmaWxlLCAiOyIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBtYXAgdGhlIG5hbWUgb250byBhIGdsb2JhbGx5IHZhbGlkIG5hbWUgKi8KLSAgICAgIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbgotCSAgJiYgc3RyY21wIChvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnByZWZpeC5sLCAiIikgIT0gMCkKLQl7Ci0JICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSAlcyAlcyVzXG4iLAotCQkgICAgIGZ1bmN0aW9uLT5uYW1lLAotCQkgICAgIG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwsCi0JCSAgICAgZnVuY3Rpb24tPm5hbWUpOwotCX0KLSAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlIChmaWxlLAotCQkJICAgICAgIGZ1bmN0aW9uLT50eXBlLAotCQkJICAgICAgICJJTkxJTkVfU1VQUE9SVCIsCi0JCQkgICAgICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIlcyVzXG4oIiwKLQkJIG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwsCi0JCSBmdW5jdGlvbi0+bmFtZSk7Ci0gICAgICBpZiAob3B0aW9ucy5nZW4uc21wKQotCWxmX3ByaW50ZiAoZmlsZSwKLQkJICAgInNpbV9jcHUgKmNwdSwgJXNpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSwgaW50IE1ZX0lOREVYIiwKLQkJICAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXgubCk7Ci0gICAgICBlbHNlCi0JbGZfcHJpbnRmIChmaWxlLAotCQkgICAiU0lNX0RFU0Mgc2QsICVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBjaWEsIGludCBNWV9JTkRFWCIsCi0JCSAgIG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwpOwotICAgICAgaWYgKGZ1bmN0aW9uLT5wYXJhbSAhPSBOVUxMCi0JICAmJiBzdHJsZW4gKGZ1bmN0aW9uLT5wYXJhbSkgPiAwKQotCWxmX3ByaW50ZiAoZmlsZSwgIiwgJXMiLCBmdW5jdGlvbi0+cGFyYW0pOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKSVzIiwgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIjtcbiIpKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXN1cHBvcnRfaF9mdW5jdGlvbiAobGYgKmZpbGUsCi0JCSAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb24sCi0JCSAgICB2b2lkICpkYXRhKQotewotICBBU1NFUlQgKGZ1bmN0aW9uLT50eXBlICE9IE5VTEwpOwotICBwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICAgICAgZnVuY3Rpb24sCi0JCQkgICAgICAgMC8qIWlzX2RlZmluaXRpb24qLyk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotCi1leHRlcm4gdm9pZAotZ2VuX3N1cHBvcnRfaCAobGYgKmZpbGUsCi0JICAgICAgIGluc25fdGFibGUgKnRhYmxlKQotewotICAvKiBvdXRwdXQgdGhlIGRlZmluaXRpb24gb2YgYFNEXycqLwotICBpZiAob3B0aW9ucy5nZW4uc21wKSAKLSAgICB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgU0QgQ1BVX1NUQVRFIChjcHUpXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDUFUgY3B1XG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDUFVfIGNwdVxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIFNEIHNkXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDUFUgKFNUQVRFX0NQVSAoc2QsIDApKVxuIik7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgQ1BVXyBzZFxuIik7Ci0gICAgfQotCi0gIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDSUFfIGNpYVxuIik7Ci0gIGlmIChvcHRpb25zLmdlbi5kZWxheWVkX2JyYW5jaCkKLSAgICB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgQ0lBIGNpYS5pcFxuIik7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIi8qICNkZWZpbmUgTklBIG5pYS5kcCAtLSBkbyBub3QgZGVmaW5lLCBhbWJpZ2lvdXMgKi9cbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDSUEgY2lhXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBOSUEgbmlhXG4iKTsKLSAgICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgU0RfIENQVV8sIENJQV8sIE1ZX0lOREVYXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIF9TRCBTRF8gLyogZGVwcmVjYXRlZCAqL1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICAvKiBNYXAgPFBSRUZJWD5faW5zdHJ1Y3Rpb25fd29yZCBhbmQgPFBSRUZJWD5faWRlY29kZV9pc3N1ZSBvbnRvIHRoZQotICAgICBzaG9ydGVyIGluc3RydWN0aW9uX3dvcmQgYW5kIGlkZWNvZGVfaXNzdWUuICBNYXAgZGVmaW5lZCBoZXJlIGFzLAotICAgICBuYW1lIHNwYWNlIHByb2JsZW1zIGFyZSBjcmVhdGVkIHdoZW4gdGhlIG5hbWUgaXMgZGVmaW5lZCBpbgotICAgICBpZGVjb2RlLmggKi8KLSAgaWYgKHN0cmNtcCAob3B0aW9ucy5tb2R1bGUuaWRlY29kZS5wcmVmaXgubCwgIiIpICE9IDApCi0gICAgewotICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgJXMgJXMlc1xuIiwKLQkJICJpbnN0cnVjdGlvbl93b3JkIiwKLQkJIG9wdGlvbnMubW9kdWxlLmlkZWNvZGUucHJlZml4LmwsCi0JCSAiaW5zdHJ1Y3Rpb25fd29yZCIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lICVzICVzJXNcbiIsCi0JCSAiaWRlY29kZV9pc3N1ZSIsCi0JCSBvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnByZWZpeC5sLAotCQkgImlkZWNvZGVfaXNzdWUiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIC8qIG91dHB1dCBhIGRlY2xhcmF0aW9uIGZvciBhbGwgZnVuY3Rpb25zICovCi0gIGZ1bmN0aW9uX2VudHJ5X3RyYXZlcnNlIChmaWxlLCB0YWJsZS0+ZnVuY3Rpb25zLAotCQkJICAgc3VwcG9ydF9oX2Z1bmN0aW9uLAotCQkJICAgTlVMTCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaWYgZGVmaW5lZChTVVBQT1JUX0lOTElORSlcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiMgaWYgKChTVVBQT1JUX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKVxcXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAmJiAoU1VQUE9SVF9JTkxJTkUgJiBJTkNMVURFRF9CWV9NT0RVTEUpKVxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiIyAgaW5jbHVkZSBcIiVzc3VwcG9ydC5jXCJcbiIsIG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwpOwotICBsZl9wcmludGYoZmlsZSwgIiMgZW5kaWZcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdXBwb3J0X2NfZnVuY3Rpb24gKGxmICpmaWxlLAotCQkgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAotCQkgICAgdm9pZCAqZGF0YSkKLXsKLSAgQVNTRVJUIChmdW5jdGlvbi0+dHlwZSAhPSBOVUxMKTsKLSAgcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgICAgIGZ1bmN0aW9uLAotCQkJICAgICAgIDEvKiFpc19kZWZpbml0aW9uKi8pOwotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIGlmIChmdW5jdGlvbi0+Y29kZSA9PSBOVUxMKQotICAgIGVycm9yIChmdW5jdGlvbi0+bGluZSwKLQkgICAiRnVuY3Rpb24gd2l0aG91dCBib2R5IChvciBudWxsIHN0YXRlbWVudCkiKTsKLSAgbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBmdW5jdGlvbi0+Y29kZS0+bGluZSk7Ci0gIHRhYmxlX3ByaW50X2NvZGUgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlKTsKLSAgaWYgKGZ1bmN0aW9uLT5pc19pbnRlcm5hbCkKLSAgICB7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsIFwiSW50ZXJuYWwgZnVuY3Rpb24gbXVzdCBsb25nanVtcFxcblwiKTtcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAicmV0dXJuIGNpYTtcbiIpOwotICAgIH0KLSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOwotICBsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLX0KLQotCi12b2lkCi1nZW5fc3VwcG9ydF9jIChsZiAqZmlsZSwKLQkgICAgICAgaW5zbl90YWJsZSAqdGFibGUpCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJzaW0tbWFpbi5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiJXNpZGVjb2RlLmhcIlxuIiwgb3B0aW9ucy5tb2R1bGUuaWRlY29kZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCIlc2l0YWJsZS5oXCJcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCIlc3N1cHBvcnQuaFwiXG4iLCBvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnByZWZpeC5sKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIC8qIG91dHB1dCBhIGRlZmluaXRpb24gKGMtY29kZSkgZm9yIGFsbCBmdW5jdGlvbnMgKi8KLSAgZnVuY3Rpb25fZW50cnlfdHJhdmVyc2UgKGZpbGUsIHRhYmxlLT5mdW5jdGlvbnMsCi0JCQkgICBzdXBwb3J0X2NfZnVuY3Rpb24sCi0JCQkgICBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmggYi9zaW0vaWdlbi9nZW4tc3VwcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFmMWFlLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi1leHRlcm4gdm9pZCBnZW5fc3VwcG9ydF9oCi0obGYgKmZpbGUsCi0gaW5zbl90YWJsZSAqdGFibGUpOwotCi1leHRlcm4gdm9pZCBnZW5fc3VwcG9ydF9jCi0obGYgKmZpbGUsCi0gaW5zbl90YWJsZSAqdGFibGUpOwotCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4uYyBiL3NpbS9pZ2VuL2dlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg4NjE5Li4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2NSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0jaW5jbHVkZSAibGQtZGVjb2RlLmgiCi0jaW5jbHVkZSAiZ2VuLmgiCi0KLXN0YXRpYyBpbnNuX3VpbnQKLXN1Yl92YWwgKGluc25fdWludCB2YWwsCi0JIGludCB2YWxfbGFzdF9wb3MsCi0JIGludCBmaXJzdF9wb3MsCi0JIGludCBsYXN0X3BvcykKLXsKLSAgcmV0dXJuICgodmFsID4+ICh2YWxfbGFzdF9wb3MgLSBsYXN0X3BvcykpCi0JICAmICgoKGluc25fdWludCkxIDw8IChsYXN0X3BvcyAtIGZpcnN0X3BvcyArIDEpKSAtIDEpKTsKLX0KLQotc3RhdGljIHZvaWQKLXVwZGF0ZV9kZXB0aCAobGYgKmZpbGUsCi0JICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKLQkgICAgICBpbnQgZGVwdGgsCi0JICAgICAgdm9pZCAqZGF0YSkKLXsKLSAgaW50ICptYXhfZGVwdGggPSAoaW50KilkYXRhOwotICBpZiAoKm1heF9kZXB0aCA8IGRlcHRoKQotICAgICptYXhfZGVwdGggPSBkZXB0aDsKLX0KLQotCi1pbnQKLWdlbl9lbnRyeV9kZXB0aCAoZ2VuX2VudHJ5ICp0YWJsZSkKLXsKLSAgaW50IGRlcHRoID0gMDsKLSAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKE5VTEwsCi0JCQkgICB0YWJsZSwKLQkJCSAgIDEsCi0JCQkgICBOVUxMLCAvKnN0YXJ0Ki8KLQkJCSAgIHVwZGF0ZV9kZXB0aCwKLQkJCSAgIE5VTEwsIC8qZW5kKi8KLQkJCSAgICZkZXB0aCk7IC8qIGRhdGEgKi8KLSAgcmV0dXJuIGRlcHRoOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9nZW5fZW50cnlfcGF0aCAobGluZV9yZWYgKmxpbmUsCi0JCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCi0JCSAgICAgIGVycm9yX2Z1bmMgKnByaW50KQotewotICBpZiAodGFibGUtPnBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0YWJsZS0+dG9wLT5tb2RlbCAhPSBOVUxMKQotCXByaW50IChsaW5lLCAiJXMiLCB0YWJsZS0+dG9wLT5tb2RlbC0+bmFtZSk7Ci0gICAgICBlbHNlCi0JcHJpbnQgKGxpbmUsICIiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludF9nZW5fZW50cnlfcGF0aCAobGluZSwgdGFibGUtPnBhcmVudCwgcHJpbnQpOwotICAgICAgcHJpbnQgKE5VTEwsICIuJWQiLCB0YWJsZS0+b3Bjb2RlX25yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9nZW5fZW50cnlfaW5zbnMgKGdlbl9lbnRyeSAqdGFibGUsCi0JCSAgICAgICBlcnJvcl9mdW5jICpwcmludCwKLQkJICAgICAgIGNoYXIgKmZpcnN0X21lc3NhZ2UsCi0JCSAgICAgICBjaGFyICpuZXh0X21lc3NhZ2UpCi17Ci0gIGluc25fbGlzdCAqaTsKLSAgY2hhciAqbWVzc2FnZTsKLSAgbWVzc2FnZSA9IGZpcnN0X21lc3NhZ2U7Ci0gIGZvciAoaSA9IHRhYmxlLT5pbnNuczsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnNuX2VudHJ5ICppbnNuID0gaS0+aW5zbjsKLSAgICAgIHByaW50X2dlbl9lbnRyeV9wYXRoIChpbnNuLT5saW5lLCB0YWJsZSwgcHJpbnQpOwotICAgICAgcHJpbnQgKE5VTEwsICI6ICVzLiVzICVzXG4iLAotCSAgICAgaW5zbi0+Zm9ybWF0X25hbWUsCi0JICAgICBpbnNuLT5uYW1lLAotCSAgICAgbWVzc2FnZSk7Ci0gICAgICBpZiAobmV4dF9tZXNzYWdlICE9IE5VTEwpCi0JbWVzc2FnZSA9IG5leHRfbWVzc2FnZTsKLSAgICB9Ci19Ci0KLS8qIHNhbWUgYXMgc3RyY21wICovCi1zdGF0aWMgaW50Ci1pbnNuX2ZpZWxkX2NtcCAoaW5zbl93b3JkX2VudHJ5ICpsLCBpbnNuX3dvcmRfZW50cnkgKnIpCi17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCBiaXRfbnI7Ci0gICAgICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKLQlyZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGZpZWxkcyB0aGUgc2FtZSAqLwotICAgICAgaWYgKGwgPT0gTlVMTCkKLQlyZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCi0gICAgICBpZiAociA9PSBOVUxMKQotCXJldHVybiArMTsgLyogbGVmdCBsb25nZXIgdGhhbiByaWdodCAqLwotICAgICAgZm9yIChiaXRfbnIgPSAwOwotCSAgIGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKLQkgICBiaXRfbnIrKykKLQl7Ci0JICBpZiAobC0+Yml0W2JpdF9ucl0tPmZpZWxkLT50eXBlICE9IGluc25fZmllbGRfc3RyaW5nKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChyLT5iaXRbYml0X25yXS0+ZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9zdHJpbmcpCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucyA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChyLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoMCkKLQkgICAgcHJpbnRmICgiJXMlcyVzIFZTICVzJXMlc1xuIiwKLQkJICAgIGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+dmFsX3N0cmluZywKLQkJICAgIGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEgPyAiPSIgOiAiISIsCi0JCSAgICBsLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnN0cmluZywJCi0JCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPnZhbF9zdHJpbmcsCi0JCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnRlc3QgPT0gaW5zbl9maWVsZF9jb25kX2VxID8gIj0iIDogIiEiLAotCQkgICAgci0+Yml0W2JpdF9ucl0tPmZpZWxkLT5jb25kaXRpb25zLT5zdHJpbmcpOwotCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEKLQkgICAgICAmJiByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnRlc3QgPT0gaW5zbl9maWVsZF9jb25kX2VxKQotCSAgICB7Ci0JICAgICAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dHlwZSA9PSBpbnNuX2ZpZWxkX2NvbmRfZmllbGQKLQkJICAmJiByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX2ZpZWxkKQotCQkvKiBzb21ld2hhdCBhcmJpdHJhcnkgKi8KLQkJewotCQkgIGludCBjbXAgPSBzdHJjbXAgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+c3RyaW5nLAotCQkJCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnN0cmluZyk7Ci0JCSAgaWYgKGNtcCAhPSAwKQotCQkgICAgcmV0dXJuIGNtcDsKLQkJICBlbHNlCi0JCSAgICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChsLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX2ZpZWxkKQotCQlyZXR1cm4gKzE7Ci0JICAgICAgaWYgKHItPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dHlwZSA9PSBpbnNuX2ZpZWxkX2NvbmRfZmllbGQpCi0JCXJldHVybiAtMTsKLQkgICAgICAvKiBUaGUgY2FzZSBvZiBib3RoIGZpZWxkcyBoYXZpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBoYXZlCi0JCSBhbHJlYWR5IGhhdmUgYmVlbiBoYW5kbGVkIGJlY2F1c2Ugc3VjaCBmaWVsZHMgYXJlIGNvbnZlcnRlZAotCQkgaW50byBub3JtYWwgY29uc3RhbnQgZmllbGRzLiAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAobC0+Yml0W2JpdF9ucl0tPmZpZWxkLT5jb25kaXRpb25zLT50ZXN0ID09IGluc25fZmllbGRfY29uZF9lcSkKLQkgICAgcmV0dXJuICsxOyAvKiBsZWZ0ID0gb25seSAqLwotCSAgaWYgKHItPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEpCi0JICAgIHJldHVybiAtMTsgLyogcmlnaHQgPSBvbmx5ICovCi0JICAvKiBGSVhNRTogTmVlZCB0byBzb21lIHdoYXQgYXJiaXRyYXJpbHkgb3JkZXIgY29uZGl0aW9uYWwgbGlzdHMgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGwgPSBsLT5uZXh0OwotICAgICAgciA9IHItPm5leHQ7Ci0gICAgfQotfQotCi0vKiBzYW1lIGFzIHN0cmNtcCAqLwotc3RhdGljIGludAotaW5zbl93b3JkX2NtcCAoaW5zbl93b3JkX2VudHJ5ICpsLCBpbnNuX3dvcmRfZW50cnkgKnIpCi17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCBiaXRfbnI7Ci0gICAgICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKLQlyZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGZpZWxkcyB0aGUgc2FtZSAqLwotICAgICAgaWYgKGwgPT0gTlVMTCkKLQlyZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCi0gICAgICBpZiAociA9PSBOVUxMKQotCXJldHVybiArMTsgLyogbGVmdCBsb25nZXIgdGhhbiByaWdodCAqLwotICAgICAgZm9yIChiaXRfbnIgPSAwOwotCSAgIGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKLQkgICBiaXRfbnIrKykKLQl7Ci0JICBpZiAobC0+Yml0W2JpdF9ucl0tPm1hc2sgPCByLT5iaXRbYml0X25yXS0+bWFzaykKLQkgICAgcmV0dXJuIC0xOwotCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5tYXNrID4gci0+Yml0W2JpdF9ucl0tPm1hc2spCi0JICAgIHJldHVybiAxOwotCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT52YWx1ZSA8IHItPmJpdFtiaXRfbnJdLT52YWx1ZSkKLQkgICAgcmV0dXJuIC0xOwotCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT52YWx1ZSA+IHItPmJpdFtiaXRfbnJdLT52YWx1ZSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgICAgbCA9IGwtPm5leHQ7Ci0gICAgICByID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIHNhbWUgYXMgc3RyY21wICovCi1zdGF0aWMgaW50Ci1vcGNvZGVfYml0X2NtcCAob3Bjb2RlX2JpdHMgKmwsCi0JCW9wY29kZV9iaXRzICpyKQotewotICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGJpdHMgdGhlIHNhbWUgKi8KLSAgaWYgKGwgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCi0gIGlmIChyID09IE5VTEwpCi0gICAgcmV0dXJuICsxOyAvKiBsZWZ0IGxvbmdlciB0aGFuIHJpZ2h0ICovCi0gIC8qIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCAqLwotICBpZiAobC0+ZmllbGQtPndvcmRfbnIgPCByLT5maWVsZC0+d29yZF9ucikKLSAgICByZXR1cm4gKzE7IC8qIGxlZnQgaGFzIG1vcmUgc2lnbmlmaWNhbnQgd29yZCAqLwotICBpZiAobC0+ZmllbGQtPndvcmRfbnIgPiByLT5maWVsZC0+d29yZF9ucikKLSAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGhhcyBtb3JlIHNpZ25pZmljYW50IHdvcmQgKi8KLSAgLyogbW9zdCBzaWduaWZpY2FudCBiaXQ/ICovCi0gIGlmIChsLT5maXJzdCA8IHItPmZpcnN0KQotICAgIHJldHVybiArMTsgLyogbGVmdCBhcyBtb3JlIHNpZ25pZmljYW50IGJpdCAqLwotICBpZiAobC0+Zmlyc3QgPiByLT5maXJzdCkKLSAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGFzIG1vcmUgc2lnbmlmaWNhbnQgYml0ICovCi0gIC8qIG5yIGJpdHM/ICovCi0gIGlmIChsLT5sYXN0IDwgci0+bGFzdCkKLSAgICByZXR1cm4gKzE7IC8qIGxlZnQgYXMgbGVzcyBiaXRzICovCi0gIGlmIChsLT5sYXN0ID4gci0+bGFzdCkKLSAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGFzIGxlc3MgYml0cyAqLwotICAvKiB2YWx1ZT8gKi8KLSAgaWYgKGwtPnZhbHVlIDwgci0+dmFsdWUpCi0gICAgcmV0dXJuIC0xOwotICBpZiAobC0+dmFsdWUgPiByLT52YWx1ZSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogc2FtZSBhcyBzdHJjbXAgKi8KLXN0YXRpYyBpbnQKLW9wY29kZV9iaXRzX2NtcCAob3Bjb2RlX2JpdHMgKmwsCi0JCSBvcGNvZGVfYml0cyAqcikKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IGNtcDsKLSAgICAgIGlmIChsID09IE5VTEwgJiYgciA9PSBOVUxMKQotCXJldHVybiAwOyAvKiBhbGwgcHJldmlvdXMgYml0cyB0aGUgc2FtZSAqLwotICAgICAgY21wID0gb3Bjb2RlX2JpdF9jbXAgKGwsIHIpOwotICAgICAgaWYgKGNtcCAhPSAwKQotCXJldHVybiBjbXA7Ci0gICAgICBsID0gbC0+bmV4dDsKLSAgICAgIHIgPSByLT5uZXh0OwotICAgIH0KLX0KLQotLyogc2FtZSBhcyBzdHJjbXAgKi8KLXN0YXRpYyBvcGNvZGVfYml0cyAqCi1uZXdfb3Bjb2RlX2JpdHMgKG9wY29kZV9iaXRzICpvbGRfYml0cywKLQkJIGludCB2YWx1ZSwKLQkJIGludCBmaXJzdCwKLQkJIGludCBsYXN0LAotCQkgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQsCi0JCSBvcGNvZGVfZmllbGQgKm9wY29kZSkKLXsKLSAgb3Bjb2RlX2JpdHMgKm5ld19iaXRzID0gWkFMTE9DIChvcGNvZGVfYml0cyk7Ci0gIG5ld19iaXRzLT5maWVsZCA9IGZpZWxkOwotICBuZXdfYml0cy0+dmFsdWUgPSB2YWx1ZTsKLSAgbmV3X2JpdHMtPmZpcnN0ID0gZmlyc3Q7Ci0gIG5ld19iaXRzLT5sYXN0ID0gbGFzdDsKLSAgbmV3X2JpdHMtPm9wY29kZSA9IG9wY29kZTsKLSAgCi0gIGlmIChvbGRfYml0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIG9wY29kZV9iaXRzICpuZXdfbGlzdDsKLSAgICAgIG9wY29kZV9iaXRzICoqbGFzdCA9ICZuZXdfbGlzdDsKLSAgICAgIG5ld19saXN0ID0gbmV3X29wY29kZV9iaXRzIChvbGRfYml0cy0+bmV4dCwKLQkJCQkgIG9sZF9iaXRzLT52YWx1ZSwKLQkJCQkgIG9sZF9iaXRzLT5maXJzdCwKLQkJCQkgIG9sZF9iaXRzLT5sYXN0LAotCQkJCSAgb2xkX2JpdHMtPmZpZWxkLAotCQkJCSAgb2xkX2JpdHMtPm9wY29kZSk7Ci0gICAgICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKLQl7Ci0JICBpbnQgY21wID0gb3Bjb2RlX2JpdF9jbXAgKG5ld19iaXRzLCAqbGFzdCk7Ci0JICBpZiAoY21wIDwgMCkgLyogbmV3IDwgbmV3X2xpc3QgKi8KLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoY21wID09IDApCi0JICAgIHsKLQkgICAgICBFUlJPUiAoIkR1cGxpY2F0ZWQgaW5zbiBiaXRzIGluIGxpc3QiKTsKLQkgICAgfQotCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCX0KLSAgICAgIG5ld19iaXRzLT5uZXh0ID0gKmxhc3Q7Ci0gICAgICAqbGFzdCA9IG5ld19iaXRzOwotICAgICAgcmV0dXJuIG5ld19saXN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXdfYml0czsKLSAgICB9Ci19Ci0KLQotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIG1lcmdlX2R1cGxpY2F0ZV9pbnNucywKLSAgcmVwb3J0X2R1cGxpY2F0ZV9pbnNucywKLX0gZHVwbGljYXRlX2luc25fYWN0aW9uczsKLQotc3RhdGljIGluc25fbGlzdCAqCi1pbnNuX2xpc3RfaW5zZXJ0IChpbnNuX2xpc3QgKipjdXJfaW5zbl9wdHIsCi0JCSAgaW50ICpucl9pbnNucywKLQkJICBpbnNuX2VudHJ5ICppbnNuLAotCQkgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkgIG9wY29kZV9maWVsZCAqb3Bjb2RlcywKLQkJICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcywKLQkJICBkdXBsaWNhdGVfaW5zbl9hY3Rpb25zIGR1cGxpY2F0ZV9hY3Rpb24pCi17Ci0gIC8qIGluc2VydCBpdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIG9mIHRoZSBmaWVsZHMgJiBiaXRzICovCi0gIGZvciAoOyAoKmN1cl9pbnNuX3B0cikgIT0gTlVMTDsgY3VyX2luc25fcHRyID0gJigqY3VyX2luc25fcHRyKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY21wOwotCi0gICAgICAvKiBrZXkjMSBzb3J0IGFjY29yZGluZyB0byB0aGUgY29uc3RhbnQgZmllbGRzIG9mIGVhY2ggaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGNtcCA9IGluc25fd29yZF9jbXAgKGluc24tPndvcmRzLCAoKmN1cl9pbnNuX3B0ciktPmluc24tPndvcmRzKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWJyZWFrOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQljb250aW51ZTsKLQotICAgICAgLyoga2V5IzIgc29ydCBhY2NvcmRpbmcgdG8gdGhlIGV4cGFuZGVkIGJpdHMgb2YgZWFjaCBpbnN0cnVjdGlvbiAqLwotICAgICAgY21wID0gb3Bjb2RlX2JpdHNfY21wIChleHBhbmRlZF9iaXRzLCAoKmN1cl9pbnNuX3B0ciktPmV4cGFuZGVkX2JpdHMpOwotICAgICAgaWYgKGNtcCA8IDApCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBrZXkjMyBzb3J0IGFjY29yZGluZyB0byB0aGUgbm9uLWNvbnN0YW50IGZpZWxkcyBvZiBlYWNoIGluc3RydWN0aW9uICovCi0gICAgICBjbXAgPSBpbnNuX2ZpZWxkX2NtcCAoaW5zbi0+d29yZHMsICgqY3VyX2luc25fcHRyKS0+aW5zbi0+d29yZHMpOwotICAgICAgaWYgKGNtcCA8IDApCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBkdXBsaWNhdGUga2V5cywgcmVwb3J0IHByb2JsZW0gKi8KLSAgICAgIHN3aXRjaCAoZHVwbGljYXRlX2FjdGlvbikKLQl7Ci0JY2FzZSByZXBvcnRfZHVwbGljYXRlX2luc25zOgotCSAgLyogSXQgd291bGQgYXBwZWFyIHRoYXQgd2UgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIHdpdGggdGhlCi0JICAgICBzYW1lIGNvbnN0YW50IGZpZWxkIHZhbHVlcyBhY3Jvc3MgYWxsIHdvcmRzIGFuZCBiaXRzLgotCSAgICAgVGhpcyBlcnJvciBjYW4gYWxzbyBvY2N1cmUgd2hlbiBpbnNuX2ZpZWxkX2NtcCgpIGlzCi0JICAgICBmYWlsaW5nIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0d28gaW5zdHJ1Y3Rpb25zIHRoYXQKLQkgICAgIGRpZmZlciBvbmx5IGluIHRoZWlyIGNvbmRpdGlvbmFsIGZpZWxkcy4gKi8KLQkgIHdhcm5pbmcgKGluc24tPmxpbmUsCi0JCSAgICJUd28gaW5zdHJ1Y3Rpb25zIHdpdGggaWRlbnRpY2FsIGNvbnN0YW50IGZpZWxkc1xuIik7Ci0JICBlcnJvciAoKCpjdXJfaW5zbl9wdHIpLT5pbnNuLT5saW5lLAotCQkgIkxvY2F0aW9uIG9mIGR1cGxpY2F0ZSBpbnN0cnVjdGlvblxuIik7Ci0JY2FzZSBtZXJnZV9kdXBsaWNhdGVfaW5zbnM6Ci0JICAvKiBBZGQgdGhlIG9wY29kZSBwYXRoIHRvIHRoZSBpbnN0cnVjdGlvbnMgbGlzdCAqLwotCSAgaWYgKG9wY29kZXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGluc25fb3Bjb2RlcyAqKmxhc3QgPSAmKCpjdXJfaW5zbl9wdHIpLT5vcGNvZGVzOwotCSAgICAgIHdoaWxlICgqbGFzdCAhPSBOVUxMKQotCQl7Ci0JCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCQl9Ci0JICAgICAgKCpsYXN0KSA9IFpBTExPQyAoaW5zbl9vcGNvZGVzKTsKLQkgICAgICAoKmxhc3QpLT5vcGNvZGUgPSBvcGNvZGVzOwotCSAgICB9Ci0JICAvKiBVc2UgdGhlIGxhcmdlciBucl9wcmVmZXRjaGVkX3dvcmRzICovCi0JICBpZiAoKCpjdXJfaW5zbl9wdHIpLT5ucl9wcmVmZXRjaGVkX3dvcmRzIDwgbnJfcHJlZmV0Y2hlZF93b3JkcykKLQkgICAgKCpjdXJfaW5zbl9wdHIpLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gbnJfcHJlZmV0Y2hlZF93b3JkczsKLQkgIHJldHVybiAoKmN1cl9pbnNuX3B0cik7Ci0JfQotCi0gICAgfQotICAKLSAgLyogY3JlYXRlIGEgbmV3IGxpc3QgZW50cnkgYW5kIGluc2VydCBpdCAqLwotICB7Ci0gICAgaW5zbl9saXN0ICpuZXdfaW5zbiA9IFpBTExPQyAoaW5zbl9saXN0KTsKLSAgICBuZXdfaW5zbi0+aW5zbiA9IGluc247Ci0gICAgbmV3X2luc24tPmV4cGFuZGVkX2JpdHMgPSBleHBhbmRlZF9iaXRzOwotICAgIG5ld19pbnNuLT5uZXh0ID0gKCpjdXJfaW5zbl9wdHIpOwotICAgIG5ld19pbnNuLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gbnJfcHJlZmV0Y2hlZF93b3JkczsKLSAgICBpZiAob3Bjb2RlcyAhPSBOVUxMKQotICAgICAgewotCW5ld19pbnNuLT5vcGNvZGVzID0gWkFMTE9DIChpbnNuX29wY29kZXMpOwotCW5ld19pbnNuLT5vcGNvZGVzLT5vcGNvZGUgPSBvcGNvZGVzOwotICAgICAgfQotICAgICgqY3VyX2luc25fcHRyKSA9IG5ld19pbnNuOwotICB9Ci0gIAotICAqbnJfaW5zbnMgKz0gMTsKLQotICByZXR1cm4gKCpjdXJfaW5zbl9wdHIpOwotfQotCi0KLWV4dGVybiB2b2lkCi1nZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAobGYgKmZpbGUsCi0JCQkgZ2VuX2VudHJ5ICp0YWJsZSwKLQkJCSBpbnQgZGVwdGgsCi0JCQkgZ2VuX2VudHJ5X2hhbmRsZXIgKnN0YXJ0LAotCQkJIGdlbl9lbnRyeV9oYW5kbGVyICpsZWFmLAotCQkJIGdlbl9lbnRyeV9oYW5kbGVyICplbmQsCi0JCQkgdm9pZCAqZGF0YSkKLXsKLSAgZ2VuX2VudHJ5ICplbnRyeTsKLSAgCi0gIEFTU0VSVCAodGFibGUgIT0gTlVMTCk7Ci0gIEFTU0VSVCAodGFibGUtPm9wY29kZSAhPSBOVUxMKTsKLSAgQVNTRVJUICh0YWJsZS0+bnJfZW50cmllcyA+IDApOwotICBBU1NFUlQgKHRhYmxlLT5lbnRyaWVzICE9IDApOwotICAKLSAgLyogcHJlZml4ICovCi0gIGlmIChzdGFydCAhPSBOVUxMICYmIGRlcHRoID49IDApCi0gICAgewotICAgICAgc3RhcnQgKGZpbGUsIHRhYmxlLCBkZXB0aCwgZGF0YSk7Ci0gICAgfQotICAvKiBpbmZpeCBsZWF2ZXMgKi8KLSAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOwotICAgICAgIGVudHJ5ICE9IE5VTEw7Ci0gICAgICAgZW50cnkgPSBlbnRyeS0+c2libGluZykKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPmVudHJpZXMgIT0gTlVMTCAmJiBkZXB0aCAhPSAwKQotCXsKLQkgIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCBlbnRyeSwgZGVwdGggKyAxLAotCQkJCSAgIHN0YXJ0LCBsZWFmLCBlbmQsIGRhdGEpOwotCX0KLSAgICAgIGVsc2UgaWYgKGRlcHRoID49IDApCi0JewotCSAgaWYgKGxlYWYgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxlYWYgKGZpbGUsIGVudHJ5LCBkZXB0aCwgZGF0YSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBwb3N0Zml4ICovCi0gIGlmIChlbmQgIT0gTlVMTCAmJiBkZXB0aCA+PSAwKQotICAgIHsKLSAgICAgIGVuZCAoZmlsZSwgdGFibGUsIGRlcHRoLCBkYXRhKTsKLSAgICB9Ci19Ci0KLQotCi0vKiBjcmVhdGUgYSBsaXN0IGVsZW1lbnQgY29udGFpbmluZyBhIHNpbmdsZSBnZW5fdGFibGUgZW50cnkgKi8KLQotc3RhdGljIGdlbl9saXN0ICoKLW1ha2VfdGFibGUgKGluc25fdGFibGUgKmlzYSwKLQkgICAgZGVjb2RlX3RhYmxlICpydWxlcywKLQkgICAgbW9kZWxfZW50cnkgKm1vZGVsKQotewotICBpbnNuX2VudHJ5ICppbnNuOwotICBnZW5fbGlzdCAqZW50cnkgPSBaQUxMT0MgKGdlbl9saXN0KTsKLSAgZW50cnktPnRhYmxlID0gWkFMTE9DIChnZW5fZW50cnkpOwotICBlbnRyeS0+dGFibGUtPnRvcCA9IGVudHJ5OwotICBlbnRyeS0+bW9kZWwgPSBtb2RlbDsKLSAgZW50cnktPmlzYSA9IGlzYTsKLSAgZm9yIChpbnNuID0gaXNhLT5pbnNuczsgaW5zbiAhPSBOVUxMOyBpbnNuID0gaW5zbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWwgPT0gTlVMTAotCSAgfHwgaW5zbi0+cHJvY2Vzc29ycyA9PSBOVUxMCi0JICB8fCBmaWx0ZXJfaXNfbWVtYmVyIChpbnNuLT5wcm9jZXNzb3JzLCBtb2RlbC0+bmFtZSkpCi0JewotCSAgaW5zbl9saXN0X2luc2VydCAoJmVudHJ5LT50YWJsZS0+aW5zbnMsCi0JCQkgICAgJmVudHJ5LT50YWJsZS0+bnJfaW5zbnMsCi0JCQkgICAgaW5zbiwKLQkJCSAgICBOVUxMLCAvKiBleHBhbmRlZF9iaXRzIC0gbm9uZSB5ZXQgKi8KLQkJCSAgICBOVUxMLCAvKiBvcGNvZGVzIC0gbm9uZSB5ZXQgKi8KLQkJCSAgICAwLCAvKiBucl9wcmVmZXRjaGVkX3dvcmRzIC0gbm9uZSB5ZXQgKi8KLQkJCSAgICByZXBvcnRfZHVwbGljYXRlX2luc25zKTsKLQl9Ci0gICAgfQotICBlbnRyeS0+dGFibGUtPm9wY29kZV9ydWxlID0gcnVsZXM7Ci0gIHJldHVybiBlbnRyeTsKLX0KLQotCi1nZW5fdGFibGUgKgotbWFrZV9nZW5fdGFibGVzIChpbnNuX3RhYmxlICppc2EsCi0JCSBkZWNvZGVfdGFibGUgKnJ1bGVzKQotewotICBnZW5fdGFibGUgKmdlbiA9IFpBTExPQyAoZ2VuX3RhYmxlKTsKLSAgZ2VuLT5pc2EgPSBpc2E7Ci0gIGdlbi0+cnVsZXMgPSBydWxlczsKLSAgaWYgKG9wdGlvbnMuZ2VuLm11bHRpX3NpbSkKLSAgICB7Ci0gICAgICBnZW5fbGlzdCAqKmxhc3QgPSAmZ2VuLT50YWJsZXM7Ci0gICAgICBtb2RlbF9lbnRyeSAqbW9kZWw7Ci0gICAgICBmaWx0ZXIgKnByb2Nlc3NvcnM7Ci0gICAgICBpZiAob3B0aW9ucy5tb2RlbF9maWx0ZXIgIT0gTlVMTCkKLQlwcm9jZXNzb3JzID0gb3B0aW9ucy5tb2RlbF9maWx0ZXI7Ci0gICAgICBlbHNlCi0JcHJvY2Vzc29ycyA9IGlzYS0+bW9kZWwtPnByb2Nlc3NvcnM7Ci0gICAgICBmb3IgKG1vZGVsID0gaXNhLT5tb2RlbC0+bW9kZWxzOwotCSAgIG1vZGVsICE9IE5VTEw7Ci0JICAgbW9kZWwgPSBtb2RlbC0+bmV4dCkKLQl7Ci0JICBpZiAoZmlsdGVyX2lzX21lbWJlciAocHJvY2Vzc29ycywgbW9kZWwtPm5hbWUpKQotCSAgICB7Ci0JICAgICAgKmxhc3QgPSBtYWtlX3RhYmxlIChpc2EsIHJ1bGVzLCBtb2RlbCk7Ci0JICAgICAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdlbi0+dGFibGVzID0gbWFrZV90YWJsZSAoaXNhLCBydWxlcywgTlVMTCk7Ci0gICAgfQotICByZXR1cm4gZ2VuOwotfQotICAKLSAgCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLXR5cGVkZWYgZW51bSB7Ci0gIGZpZWxkX2lzX25vdF9jb25zdGFudCA9IDAsCi0gIGZpZWxkX2NvbnN0YW50X2ludCA9IDEsCi0gIGZpZWxkX2NvbnN0YW50X3Jlc2VydmVkID0gMiwKLSAgZmllbGRfY29uc3RhbnRfc3RyaW5nID0gMwotfSBjb25zdGFudF9maWVsZF90eXBlczsKLQotc3RhdGljIGNvbnN0YW50X2ZpZWxkX3R5cGVzCi1pbnNuX2ZpZWxkX2lzX2NvbnN0YW50IChpbnNuX2ZpZWxkICpmaWVsZCwKLQkJICAgICAgICBkZWNvZGVfdGFibGUgKnJ1bGUpCi17Ci0gIHN3aXRjaCAoZmllbGQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgaW5zbl9maWVsZF9pbnQ6Ci0gICAgICAvKiBmaWVsZCBpcyBhbiBpbnRlZ2VyICovCi0gICAgICByZXR1cm4gZmllbGRfY29uc3RhbnRfaW50OwotICAgIGNhc2UgaW5zbl9maWVsZF9yZXNlcnZlZDoKLSAgICAgIC8qIGZpZWxkIGlzIGAvJyBhbmQgdHJlYXRpbmcgdGhhdCBhcyBhIGNvbnN0YW50ICovCi0gICAgICBpZiAocnVsZS0+d2l0aF96ZXJvX3Jlc2VydmVkKQotCXJldHVybiBmaWVsZF9jb25zdGFudF9yZXNlcnZlZDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OwotICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOgotICAgICAgcmV0dXJuIGZpZWxkX2lzX25vdF9jb25zdGFudDsgLyogbmV2ZXIgY29uc3RhbnQgKi8KLSAgICBjYXNlIGluc25fZmllbGRfc3RyaW5nOgotICAgICAgLyogZmllbGQsIHRob3VnaCB2YXJpYWJsZSwgaXMgb24gdGhlIGxpc3Qgb2YgZm9yY2VkIGNvbnN0YW50cyAqLwotICAgICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKHJ1bGUtPmNvbnN0YW50X2ZpZWxkX25hbWVzLCBmaWVsZC0+dmFsX3N0cmluZykpCi0JcmV0dXJuIGZpZWxkX2NvbnN0YW50X3N0cmluZzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OwotICAgIH0KLSAgRVJST1IgKCJJbnRlcm5hbCBlcnJvciIpOwotICByZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OwotfQotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogSXMgdGhlIGJpdCwgYWNjb3JkaW5nIHRvIHRoZSBkZWNvZGUgcnVsZSwgaWRlbnRpY2FsIGFjcm9zcyBhbGwgdGhlCi0gICBpbnN0cnVjdGlvbnM/ICovCi1zdGF0aWMgaW50Ci1pbnNuc19iaXRfdXNlbGVzcyAoaW5zbl9saXN0ICppbnNucywKLQkJICAgZGVjb2RlX3RhYmxlICpydWxlLAotCQkgICBpbnQgYml0X25yKQotewotICBpbnNuX2xpc3QgKmVudHJ5OwotICBpbnQgdmFsdWUgPSAtMTsKLSAgaW50IGlzX3VzZWxlc3MgPSAxOyAvKiBjbGVhcmVkIGlmIHNvbWV0aGluZyBhY3R1YWxseSBmb3VuZCAqLwotCi0gIC8qIGNoZWNrIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHNvbWUgY29uc3RhbnQgdmFsdWUgaW4gYXQgbGVhc3Qgb25lIG9mCi0gICAgIHRoZSBiaXQgZmllbGRzICovCi0gIGZvciAoZW50cnkgPSBpbnNuczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnNuX3dvcmRfZW50cnkgKndvcmQgPSBlbnRyeS0+aW5zbi0+d29yZFtydWxlLT53b3JkX25yXTsKLSAgICAgIGluc25fYml0X2VudHJ5ICpiaXQgPSB3b3JkLT5iaXRbYml0X25yXTsKLSAgICAgIHN3aXRjaCAoYml0LT5maWVsZC0+dHlwZSkKLQl7Ci0JY2FzZSBpbnNuX2ZpZWxkX2ludmFsaWQ6Ci0JICBBU1NFUlQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX3dpbGQ6Ci0JY2FzZSBpbnNuX2ZpZWxkX3Jlc2VydmVkOgotCSAgLyogbmVpdGhlciB1c2VsZXNzIG9yIHVzZWZ1bCAtIGlnbm9yZSAqLwotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX2ludDoKLQkgIHN3aXRjaCAocnVsZS0+c2VhcmNoKQotCSAgICB7Ci0JICAgIGNhc2UgZGVjb2RlX2ZpbmRfc3RyaW5nczoKLQkgICAgICAvKiBhbiBpbnRlZ2VyIGlzbid0IGEgc3RyaW5nICovCi0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgotCSAgICBjYXNlIGRlY29kZV9maW5kX21peGVkOgotCSAgICAgIC8qIGFuIGludGVnZXIgaXMgdXNlZnVsIGlmIGl0cyB2YWx1ZSBpc24ndCB0aGUgc2FtZQotICAgICAgICAgICAgICAgICBiZXR3ZWVuIGFsbCBpbnN0cnVjdGlvbnMuICBUaGUgZmlyc3QgdGltZSB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBzYXZlZCwgdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggKGlmIHRoZQotICAgICAgICAgICAgICAgICB2YWx1ZXMgZGlmZmVyKSBpdCBpcyBtYXJrZWQgYXMgdXNlZnVsLiAqLwotCSAgICAgIGlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gYml0LT52YWx1ZTsKLQkgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBiaXQtPnZhbHVlKQotCQlpc191c2VsZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKLQkgIHN3aXRjaCAocnVsZS0+c2VhcmNoKQotCSAgICB7Ci0JICAgIGNhc2UgZGVjb2RlX2ZpbmRfc3RyaW5nczoKLQkgICAgICAvKiBhdCBsZWFzdCBvbmUgc3RyaW5nLCBrZWVwIGNoZWNraW5nICovCi0JICAgICAgaXNfdXNlbGVzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgotCSAgICBjYXNlIGRlY29kZV9maW5kX21peGVkOgotCSAgICAgIGlmIChmaWx0ZXJfaXNfbWVtYmVyIChydWxlLT5jb25zdGFudF9maWVsZF9uYW1lcywKLQkJCQkgICAgYml0LT5maWVsZC0+dmFsX3N0cmluZykpCi0JCS8qIGEgc3RyaW5nIGZpZWxkIGZvcmNlZCB0byBjb25zdGFudD8gKi8KLQkJaXNfdXNlbGVzcyA9IDA7Ci0JICAgICAgZWxzZSBpZiAocnVsZS0+c2VhcmNoID09IGRlY29kZV9maW5kX2NvbnN0YW50cykKLQkJLyogdGhlIHN0cmluZyBmaWVsZCBpc24ndCBjb25zdGFudCAqLwotCQlyZXR1cm4gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogR2l2ZW4gb25seSBvbmUgY29uc3RhbnQgdmFsdWUgaGFzIGJlZW4gZm91bmQsIGNoZWNrIHRocm91Z2ggYWxsCi0gICAgIHRoZSBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGF0IGxlYXN0IG9uZSBjb25kaXRpb25hbCBtYWtlcyBpdAotICAgICB1c2VmdWxsICovCi0gIGlmICh2YWx1ZSA+PSAwICYmIGlzX3VzZWxlc3MpCi0gICAgewotICAgICAgZm9yIChlbnRyeSA9IGluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCXsKLQkgIGluc25fd29yZF9lbnRyeSAqd29yZCA9IGVudHJ5LT5pbnNuLT53b3JkW3J1bGUtPndvcmRfbnJdOwotCSAgaW5zbl9iaXRfZW50cnkgKmJpdCA9IHdvcmQtPmJpdFtiaXRfbnJdOwotCSAgc3dpdGNoIChiaXQtPmZpZWxkLT50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgaW5zbl9maWVsZF9pbnZhbGlkOgotCSAgICAgIEFTU0VSVCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOgotCSAgICBjYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6Ci0JICAgIGNhc2UgaW5zbl9maWVsZF9pbnQ6Ci0JICAgICAgLyogYWxyZWFkeSBwcm9jZXNzZWQgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKLQkgICAgICBzd2l0Y2ggKHJ1bGUtPnNlYXJjaCkKLQkJewotCQljYXNlIGRlY29kZV9maW5kX3N0cmluZ3M6Ci0JCWNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgotCQkgIC8qIGFscmVhZHkgcHJvY2Vzc2VkICovCi0JCSAgYnJlYWs7Ci0JCWNhc2UgZGVjb2RlX2ZpbmRfbWl4ZWQ6Ci0JCSAgLyogc3RyaW5nIGZpZWxkIHdpdGggY29uZGl0aW9ucy4gIElmIHRoaXMgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICBlbGltaW5hdGVzIHRoZSB2YWx1ZSB0aGVuIHRoZSBjb21wYXJlIGlzIHVzZWZ1bCAqLwotCQkgIGlmIChiaXQtPmZpZWxkLT5jb25kaXRpb25zICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGluc25fZmllbGRfY29uZCAqY29uZGl0aW9uOwotCQkgICAgICBpbnQgc2hpZnQgPSBiaXQtPmZpZWxkLT5sYXN0IC0gYml0X25yOwotCQkgICAgICBmb3IgKGNvbmRpdGlvbiA9IGJpdC0+ZmllbGQtPmNvbmRpdGlvbnM7Ci0JCQkgICBjb25kaXRpb24gIT0gTlVMTDsKLQkJCSAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi0+bmV4dCkKLQkJCXsKLQkJCSAgc3dpdGNoIChjb25kaXRpb24tPnR5cGUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgaW5zbl9maWVsZF9jb25kX3ZhbHVlOgotCQkJICAgICAgc3dpdGNoIChjb25kaXRpb24tPnRlc3QpCi0JCQkJewotCQkJCWNhc2UgaW5zbl9maWVsZF9jb25kX25lOgotCQkJCSAgaWYgKCgoY29uZGl0aW9uLT52YWx1ZSA+PiBzaGlmdCkgJiAxKQotCQkJCSAgICAgID09ICh1bnNpZ25lZCkgdmFsdWUpCi0JCQkJICAgIC8qIGNvbmRpdGlvbmFsIGZpZWxkIGV4Y2x1ZGVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZSAqLwotCQkJCSAgICBpc191c2VsZXNzID0gMDsKLQkJCQkgIGJyZWFrOwotCQkJCWNhc2UgaW5zbl9maWVsZF9jb25kX2VxOgotCQkJCSAgaWYgKCgoY29uZGl0aW9uLT52YWx1ZSA+PiBzaGlmdCkgJiAxKQotCQkJCSAgICAgICE9ICh1bnNpZ25lZCkgdmFsdWUpCi0JCQkJICAgIC8qIGNvbmRpdGlvbmFsIGZpZWxkIHJlcXVpcmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZSAqLwotCQkJCSAgICBpc191c2VsZXNzID0gMDsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgaW5zbl9maWVsZF9jb25kX2ZpZWxkOgotCQkJICAgICAgLyogYXJlIHRoZXNlIGhhbmRsZWQgc2VwYXJhdGx5PyAqLwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBpc191c2VsZXNzOwotfQotCi0KLS8qIGdvIHRocm91Z2ggYSBnZW4tdGFibGUncyBsaXN0IG9mIGluc3RydWN0aW9uIGZvcm1hdHMgbG9va2luZyBmb3IgYQotICAgcmFuZ2Ugb2YgYml0cyB0aGF0IG1lZXQgdGhlIGRlY29kZSB0YWJsZSBSVUxFcyByZXF1aXJlbWVudHMgKi8KLQotc3RhdGljIG9wY29kZV9maWVsZCAqCi1nZW5fZW50cnlfZmluZF9vcGNvZGVfZmllbGQgKGluc25fbGlzdCAqaW5zbnMsCi0JCQkgICAgIGRlY29kZV90YWJsZSAqcnVsZSwKLQkJCSAgICAgaW50IHN0cmluZ19vbmx5KQotewotICBvcGNvZGVfZmllbGQgY3Vycl9vcGNvZGU7Ci0gIEFTU0VSVCAocnVsZSAhPSBOVUxMKTsKLQotICBtZW1zZXQgKCZjdXJyX29wY29kZSwgMCwgc2l6ZW9mIChjdXJyX29wY29kZSkpOwotICBjdXJyX29wY29kZS53b3JkX25yID0gcnVsZS0+d29yZF9ucjsKLSAgY3Vycl9vcGNvZGUuZmlyc3QgPSBydWxlLT5maXJzdDsKLSAgY3Vycl9vcGNvZGUubGFzdCA9IHJ1bGUtPmxhc3Q7Ci0KLSAgLyogVHJ5IHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiBmaXJzdC4ubGFzdCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICAgIGRlY29kZSBydWxlcyAqLwotCi0gIHdoaWxlIChjdXJyX29wY29kZS5maXJzdCA8PSBydWxlLT5sYXN0KQotICAgIHsKLSAgICAgIGlmIChpbnNuc19iaXRfdXNlbGVzcyAoaW5zbnMsIHJ1bGUsIGN1cnJfb3Bjb2RlLmZpcnN0KSkKLQljdXJyX29wY29kZS5maXJzdCArKzsKLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0gIHdoaWxlIChjdXJyX29wY29kZS5sYXN0ID49IHJ1bGUtPmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChpbnNuc19iaXRfdXNlbGVzcyAoaW5zbnMsIHJ1bGUsIGN1cnJfb3Bjb2RlLmxhc3QpKQotCWN1cnJfb3Bjb2RlLmxhc3QgLS07Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0KLSNpZiAwCi0gIGZvciAoZW50cnkgPSBpbnNuczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnNuX3dvcmRfZW50cnkgKmZpZWxkcyA9IGVudHJ5LT5pbnNuLT53b3JkW3J1bGUtPndvcmRfbnJdOwotICAgICAgb3Bjb2RlX2ZpZWxkIG5ld19vcGNvZGU7Ci0gICAgICAKLSAgICAgIEFTU0VSVCAoZmllbGRzICE9IE5VTEwpOwotICAgICAgCi0gICAgICAvKiBmaW5kIGEgc3RhcnQgcG9pbnQgZm9yIHRoZSBvcGNvZGUgZmllbGQgKi8KLSAgICAgIG5ld19vcGNvZGUuZmlyc3QgPSBydWxlLT5maXJzdDsKLSAgICAgIHdoaWxlIChuZXdfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QKLQkgICAgICYmICghc3RyaW5nX29ubHkKLQkJIHx8IChpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUuZmlyc3RdLCBydWxlKQotCQkgICAgICE9IGZpZWxkX2NvbnN0YW50X3N0cmluZykpCi0JICAgICAmJiAoc3RyaW5nX29ubHkKLQkJIHx8IChpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUuZmlyc3RdLCBydWxlKQotCQkgICAgID09IGZpZWxkX2lzX25vdF9jb25zdGFudCkpKQotCXsKLQkgIGludCBuZXdfZmlyc3QgPSBmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XS0+bGFzdCArIDE7Ci0JICBBU1NFUlQgKG5ld19maXJzdCA+IG5ld19vcGNvZGUuZmlyc3QpOwotCSAgbmV3X29wY29kZS5maXJzdCA9IG5ld19maXJzdDsKLQl9Ci0gICAgICBBU1NFUlQobmV3X29wY29kZS5maXJzdCA+IHJ1bGUtPmxhc3QKLQkgICAgIHx8IChzdHJpbmdfb25seQotCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XSwKLQkJCQkJICAgcnVsZSkgPT0gZmllbGRfY29uc3RhbnRfc3RyaW5nKQotCSAgICAgfHwgKCFzdHJpbmdfb25seQotCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XSwKLQkJCQkJICAgcnVsZSkpKTsKLSAgICAgIAotICAgICAgLyogZmluZCB0aGUgZW5kIHBvaW50IGZvciB0aGUgb3Bjb2RlIGZpZWxkICovCi0gICAgICBuZXdfb3Bjb2RlLmxhc3QgPSBydWxlLT5sYXN0OwotICAgICAgd2hpbGUgKG5ld19vcGNvZGUubGFzdCA+PSBydWxlLT5maXJzdAotCSAgICAgJiYgKCFzdHJpbmdfb25seQotCQkgfHwgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmxhc3RdLAotCQkJCQkgICBydWxlKSAhPSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCi0JICAgICAmJiAoc3RyaW5nX29ubHkKLQkJIHx8ICFpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUubGFzdF0sCi0JCQkJCSAgICBydWxlKSkpCi0JewotCSAgaW50IG5ld19sYXN0ID0gZmllbGRzLT5iaXRbbmV3X29wY29kZS5sYXN0XS0+Zmlyc3QgLSAxOwotCSAgQVNTRVJUIChuZXdfbGFzdCA8IG5ld19vcGNvZGUubGFzdCk7Ci0JICBuZXdfb3Bjb2RlLmxhc3QgPSBuZXdfbGFzdDsKLQl9Ci0gICAgICBBU1NFUlQobmV3X29wY29kZS5sYXN0IDwgcnVsZS0+Zmlyc3QKLQkgICAgIHx8IChzdHJpbmdfb25seQotCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmxhc3RdLAotCQkJCQkgICBydWxlKSA9PSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCi0JICAgICB8fCAoIXN0cmluZ19vbmx5Ci0JCSAmJiBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUubGFzdF0sCi0JCQkJCSAgIHJ1bGUpKSk7Ci0gICAgICAKLSAgICAgIC8qIG5vdyBzZWUgaWYgb3VyIGN1cnJlbnQgb3Bjb2RlIG5lZWRzIGV4cGFuZGluZyB0byBpbmNsdWRlIHRoZQotCSBpbnRlcmVzdGluZyBmaWVsZHMgd2l0aGluIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmIChuZXdfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QKLQkgICYmIGN1cnJfb3Bjb2RlLmZpcnN0ID4gbmV3X29wY29kZS5maXJzdCkKLQljdXJyX29wY29kZS5maXJzdCA9IG5ld19vcGNvZGUuZmlyc3Q7Ci0gICAgICBpZiAobmV3X29wY29kZS5sYXN0ID49IHJ1bGUtPmZpcnN0Ci0JICAmJiBjdXJyX29wY29kZS5sYXN0IDwgbmV3X29wY29kZS5sYXN0KQotCWN1cnJfb3Bjb2RlLmxhc3QgPSBuZXdfb3Bjb2RlLmxhc3Q7Ci0gICAgICAKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBkaWQgdGhlIGZpbmFsIG9wY29kZSBmaWVsZCBlbmQgdXAgYmVpbmcgZW1wdHk/ICovCi0gIGlmIChjdXJyX29wY29kZS5maXJzdCA+IGN1cnJfb3Bjb2RlLmxhc3QpCi0gICAgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmxhc3QgPj0gcnVsZS0+Zmlyc3QpOwotICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QpOwotICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmZpcnN0IDw9IGN1cnJfb3Bjb2RlLmxhc3QpOwotCi0gIC8qIEVuc3VyZSB0aGF0LCBmb3IgdGhlIG5vbiBzdHJpbmcgb25seSBjYXNlLCB0aGUgb3Bjb2RlIGluY2x1ZGVzCi0gICAgIHRoZSByYW5nZSBmb3JjZWRfZmlyc3QgLi4gZm9yY2VkX2xhc3QgKi8KLSAgaWYgKCFzdHJpbmdfb25seQotICAgICAgJiYgY3Vycl9vcGNvZGUuZmlyc3QgPiBydWxlLT5mb3JjZV9maXJzdCkKLSAgICB7Ci0gICAgICBjdXJyX29wY29kZS5maXJzdCA9IHJ1bGUtPmZvcmNlX2ZpcnN0OwotICAgIH0KLSAgaWYgKCFzdHJpbmdfb25seQotICAgICAgJiYgY3Vycl9vcGNvZGUubGFzdCA8IHJ1bGUtPmZvcmNlX2xhc3QpCi0gICAgewotICAgICAgY3Vycl9vcGNvZGUubGFzdCA9IHJ1bGUtPmZvcmNlX2xhc3Q7Ci0gICAgfQotCi0gIC8qIEZvciB0aGUgc3RyaW5nIG9ubHkgY2FzZSwgZm9yY2UganVzdCB0aGUgbG93ZXIgYm91bmQgKHNvIHRoYXQgdGhlCi0gICAgIHNoaWZ0IGNhbiBiZSBlbGltaW5hdGVkKSAqLwotICBpZiAoc3RyaW5nX29ubHkKLSAgICAgICYmIHJ1bGUtPmZvcmNlX2xhc3QgPT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKLSAgICB7Ci0gICAgICBjdXJyX29wY29kZS5sYXN0ID0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMTsKLSAgICB9Ci0KLSAgLyogaGFuZGxlIGFueSBzcGVjaWFsIGNhc2VzICovCi0gIHN3aXRjaCAocnVsZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBub3JtYWxfZGVjb2RlX3J1bGU6Ci0gICAgICAvKiBsZXQgdGhlIGFib3ZlIGFwcGx5ICovCi0gICAgICBjdXJyX29wY29kZS5ucl9vcGNvZGVzID0KLQkoMSA8PCAoY3Vycl9vcGNvZGUubGFzdCAtIGN1cnJfb3Bjb2RlLmZpcnN0ICsgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBib29sZWFuX3J1bGU6Ci0gICAgICBjdXJyX29wY29kZS5pc19ib29sZWFuID0gMTsKLSAgICAgIGN1cnJfb3Bjb2RlLmJvb2xlYW5fY29uc3RhbnQgPSBydWxlLT5jb25zdGFudDsKLSAgICAgIGN1cnJfb3Bjb2RlLm5yX29wY29kZXMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHsKLSAgICBvcGNvZGVfZmllbGQgKm5ld19maWVsZCA9IFpBTExPQyAob3Bjb2RlX2ZpZWxkKTsKLSAgICBtZW1jcHkgKG5ld19maWVsZCwgJmN1cnJfb3Bjb2RlLCBzaXplb2YgKG9wY29kZV9maWVsZCkpOwotICAgIHJldHVybiBuZXdfZmllbGQ7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZ2VuX2VudHJ5X2luc2VydF9pbnNuIChnZW5fZW50cnkgKnRhYmxlLAotCQkgICAgICAgaW5zbl9lbnRyeSAqb2xkX2luc24sCi0JCSAgICAgICBpbnQgbmV3X3dvcmRfbnIsCi0JCSAgICAgICBpbnQgbmV3X25yX3ByZWZldGNoZWRfd29yZHMsCi0JCSAgICAgICBpbnQgbmV3X29wY29kZV9uciwKLQkJICAgICAgIG9wY29kZV9iaXRzICpuZXdfYml0cykKLXsKLSAgZ2VuX2VudHJ5ICoqZW50cnkgPSAmdGFibGUtPmVudHJpZXM7Ci0gIAotICAvKiBmaW5kIHRoZSBuZXcgdGFibGUgZm9yIHRoaXMgZW50cnkgKi8KLSAgd2hpbGUgKCgqZW50cnkpICE9IE5VTEwgJiYgKCplbnRyeSktPm9wY29kZV9uciA8IG5ld19vcGNvZGVfbnIpCi0gICAgewotICAgICAgZW50cnkgPSAmKCplbnRyeSktPnNpYmxpbmc7Ci0gICAgfQotICAKLSAgaWYgKCgqZW50cnkpID09IE5VTEwgfHwgKCplbnRyeSktPm9wY29kZV9uciAhPSBuZXdfb3Bjb2RlX25yKQotICAgIHsKLSAgICAgIC8qIGluc2VydCB0aGUgbWlzc2luZyBlbnRyeSAqLwotICAgICAgZ2VuX2VudHJ5ICpuZXdfZW50cnkgPSBaQUxMT0MgKGdlbl9lbnRyeSk7Ci0gICAgICBuZXdfZW50cnktPnNpYmxpbmcgPSAoKmVudHJ5KTsKLSAgICAgICgqZW50cnkpID0gbmV3X2VudHJ5OwotICAgICAgdGFibGUtPm5yX2VudHJpZXMrKzsKLSAgICAgIC8qIGZpbGwgaXQgaW4gKi8KLSAgICAgIG5ld19lbnRyeS0+dG9wID0gdGFibGUtPnRvcDsKLSAgICAgIG5ld19lbnRyeS0+b3Bjb2RlX25yID0gbmV3X29wY29kZV9ucjsKLSAgICAgIG5ld19lbnRyeS0+d29yZF9uciA9IG5ld193b3JkX25yOwotICAgICAgbmV3X2VudHJ5LT5leHBhbmRlZF9iaXRzID0gbmV3X2JpdHM7Ci0gICAgICBuZXdfZW50cnktPm9wY29kZV9ydWxlID0gdGFibGUtPm9wY29kZV9ydWxlLT5uZXh0OwotICAgICAgbmV3X2VudHJ5LT5wYXJlbnQgPSB0YWJsZTsKLSAgICAgIG5ld19lbnRyeS0+bnJfcHJlZmV0Y2hlZF93b3JkcyA9IG5ld19ucl9wcmVmZXRjaGVkX3dvcmRzOwotICAgIH0KLSAgLyogQVNTRVJUIG5ld19iaXRzID09IGN1cl9lbnRyeSBiaXRzICovCi0gIEFTU0VSVCAoKCplbnRyeSkgIT0gTlVMTCAmJiAoKmVudHJ5KS0+b3Bjb2RlX25yID09IG5ld19vcGNvZGVfbnIpOwotICBpbnNuX2xpc3RfaW5zZXJ0ICgmKCplbnRyeSktPmluc25zLAotCQkgICAgJigqZW50cnkpLT5ucl9pbnNucywKLQkJICAgIG9sZF9pbnNuLAotCQkgICAgTlVMTCwgLyogZXhwYW5kZWRfYml0cyAtIG9ubHkgaW4gZmluYWwgbGlzdCAqLwotCQkgICAgTlVMTCwgLyogb3Bjb2RlcyAtIG9ubHkgaW4gZmluYWwgbGlzdCAqLwotCQkgICAgbmV3X25yX3ByZWZldGNoZWRfd29yZHMsIC8qIGZvciB0aGlzIHRhYmxlICovCi0JCSAgICByZXBvcnRfZHVwbGljYXRlX2luc25zKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKGdlbl9lbnRyeSAqdGFibGUsCi0JCQkgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCi0JCQkgaW50IGJpdF9uciwKLQkJCSBpbnQgb3Bjb2RlX25yLAotCQkJIG9wY29kZV9iaXRzICpiaXRzKQotewotICBpZiAoYml0X25yID4gdGFibGUtPm9wY29kZS0+bGFzdCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGluY2x1ZGUgdGhlIGhhcmR3aXJlZCBiaXQgaW5mb3JtYXRpb24gd2l0aCBhbiBlbnRyeSBJRgotICAgICAgICAgdGhhdCBlbnRyeSAoYW5kIGhlbmNlIGl0cyBmdW5jdGlvbnMpIGFyZSBiZWluZyBkdXBsaWNhdGVkLiAgKi8KLSAgICAgIGlmIChvcHRpb25zLnRyYWNlLmluc25fZXhwYW5zaW9uKQotCXsKLQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCBub3RpZnkpOwotCSAgbm90aWZ5IChOVUxMLCAiOiBpbnNlcnQgJWQgLSAlcy4lcyVzXG4iLAotCQkgIG9wY29kZV9uciwKLQkJICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCi0JCSAgaW5zdHJ1Y3Rpb24tPm5hbWUsCi0JCSAgKHRhYmxlLT5vcGNvZGVfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID8gIiAoZHVwbGljYXRlZCkiIDogIiIpKTsKLQl9Ci0gICAgICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT53aXRoX2R1cGxpY2F0ZXMpCi0JewotCSAgZ2VuX2VudHJ5X2luc2VydF9pbnNuICh0YWJsZSwgaW5zdHJ1Y3Rpb24sCi0JCQkJIHRhYmxlLT5vcGNvZGUtPndvcmRfbnIsCi0JCQkJIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzLAotCQkJCSBvcGNvZGVfbnIsIGJpdHMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBnZW5fZW50cnlfaW5zZXJ0X2luc24gKHRhYmxlLCBpbnN0cnVjdGlvbiwKLQkJCQkgdGFibGUtPm9wY29kZS0+d29yZF9uciwKLQkJCQkgdGFibGUtPm5yX3ByZWZldGNoZWRfd29yZHMsCi0JCQkJIG9wY29kZV9uciwgTlVMTCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluc25fd29yZF9lbnRyeSAqd29yZCA9IGluc3RydWN0aW9uLT53b3JkW3RhYmxlLT5vcGNvZGUtPndvcmRfbnJdOwotICAgICAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQgPSB3b3JkLT5iaXRbYml0X25yXS0+ZmllbGQ7Ci0gICAgICBpbnQgbGFzdF9wb3MgPSAoKGZpZWxkLT5sYXN0IDwgdGFibGUtPm9wY29kZS0+bGFzdCkKLQkJICAgICAgPyBmaWVsZC0+bGFzdAotCQkgICAgICA6IHRhYmxlLT5vcGNvZGUtPmxhc3QpOwotICAgICAgaW50IGZpcnN0X3BvcyA9ICgoZmllbGQtPmZpcnN0ID4gdGFibGUtPm9wY29kZS0+Zmlyc3QpCi0JCSAgICAgICA/IGZpZWxkLT5maXJzdAotCQkgICAgICAgOiB0YWJsZS0+b3Bjb2RlLT5maXJzdCk7Ci0gICAgICBpbnQgd2lkdGggPSBsYXN0X3BvcyAtIGZpcnN0X3BvcyArIDE7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLT50eXBlKQotCXsKLQljYXNlIGluc25fZmllbGRfaW50OgotCSAgewotCSAgICBpbnQgdmFsOwotCSAgICB2YWwgPSBzdWJfdmFsIChmaWVsZC0+dmFsX2ludCwgZmllbGQtPmxhc3QsCi0JCQkgICBmaXJzdF9wb3MsIGxhc3RfcG9zKTsKLQkgICAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLCBpbnN0cnVjdGlvbiwKLQkJCQkgICAgIGxhc3RfcG9zICsgMSwKLQkJCQkgICAgICgob3Bjb2RlX25yIDw8IHdpZHRoKSB8IHZhbCksCi0JCQkJICAgICBiaXRzKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgaWYgKGZpZWxkLT50eXBlID09IGluc25fZmllbGRfcmVzZXJ2ZWQpCi0JICAgICAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLCBpbnN0cnVjdGlvbiwKLQkJCQkgICAgICAgbGFzdF9wb3MgKyAxLAotCQkJCSAgICAgICAoKG9wY29kZV9uciA8PCB3aWR0aCkpLAotCQkJCSAgICAgICBiaXRzKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IHZhbDsKLQkJaW50IGxhc3RfdmFsID0gKHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQkJCQk/IDIKLQkJCQk6ICgxIDw8IHdpZHRoKSk7Ci0JCWZvciAodmFsID0gMDsgdmFsIDwgbGFzdF92YWw7IHZhbCsrKQotCQkgIHsKLQkJICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gcHJlY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgIChieSBhIGNvbmRpdGlvbmFsKSBpbiBzb21lIHdheSAqLwotCQkgICAgaW50IGlzX3ByZWNsdWRlZDsKLQkJICAgIGluc25fZmllbGRfY29uZCAqY29uZGl0aW9uOwotCQkgICAgZm9yIChjb25kaXRpb24gPSBmaWVsZC0+Y29uZGl0aW9ucywgaXNfcHJlY2x1ZGVkID0gMDsKLQkJCSBjb25kaXRpb24gIT0gTlVMTCAmJiAhaXNfcHJlY2x1ZGVkOwotCQkJIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi0+bmV4dCkKLQkJICAgICAgewotCQkJc3dpdGNoIChjb25kaXRpb24tPnR5cGUpCi0JCQkgIHsKLQkJCSAgY2FzZSBpbnNuX2ZpZWxkX2NvbmRfdmFsdWU6Ci0JCQkgICAgewotCQkJICAgICAgaW50IHZhbHVlID0gc3ViX3ZhbCAoY29uZGl0aW9uLT52YWx1ZSwgZmllbGQtPmxhc3QsCi0JCQkJCQkgICBmaXJzdF9wb3MsIGxhc3RfcG9zKTsKLQkJCSAgICAgIHN3aXRjaCAoY29uZGl0aW9uLT50ZXN0KQotCQkJCXsKLQkJCQljYXNlIGluc25fZmllbGRfY29uZF9uZToKLQkJCQkgIGlmICh2YWx1ZSA9PSB2YWwpCi0JCQkJICAgIGlzX3ByZWNsdWRlZCA9IDE7Ci0JCQkJICBicmVhazsKLQkJCQljYXNlIGluc25fZmllbGRfY29uZF9lcToKLQkJCQkgIGlmICh2YWx1ZSAhPSB2YWwpCi0JCQkJICAgIGlzX3ByZWNsdWRlZCA9IDE7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGNhc2UgaW5zbl9maWVsZF9jb25kX2ZpZWxkOgotCQkJICAgIHsKLQkJCSAgICAgIGludCB2YWx1ZTsKLQkJCSAgICAgIG9wY29kZV9iaXRzICpiaXQ7Ci0JCQkgICAgICBnZW5fZW50cnkgKnQ7Ci0JCQkgICAgICAvKiBUcnkgdG8gZmluZCBhIHZhbHVlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJ5IGxvb2tpbmcgYmFjayB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXNseSBkZWZpbmVkIGJpdHMgZm9yIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3ZlcnMgdGhlIGRlc2lnbmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGZpZWxkICovCi0JCQkgICAgICBmb3IgKGJpdCA9IGJpdHM7Ci0JCQkJICAgYml0ICE9IE5VTEw7Ci0JCQkJICAgYml0ID0gYml0LT5uZXh0KQotCQkJCXsKLQkJCQkgIGlmIChiaXQtPmZpZWxkLT53b3JkX25yID09IGNvbmRpdGlvbi0+ZmllbGQtPndvcmRfbnIKLQkJCQkgICAgICAmJiBiaXQtPmZpcnN0IDw9IGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0Ci0JCQkJICAgICAgJiYgYml0LT5sYXN0ID49IGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpCi0JCQkJICAgIHsKLQkJCQkgICAgICAvKiB0aGUgYml0IGZpZWxkIGZ1bGx5IHNwZWNpZmllZAotCQkJCQkgdGhlIGNvbmRpdGlvbmFsIGZpZWxkJ3MgdmFsdWUgKi8KLQkJCQkgICAgICB2YWx1ZSA9IHN1Yl92YWwgKGJpdC0+dmFsdWUsIGJpdC0+bGFzdCwKLQkJCQkJCSAgICAgICBjb25kaXRpb24tPmZpZWxkLT5maXJzdCwKLQkJCQkJCSAgICAgICBjb25kaXRpb24tPmZpZWxkLT5sYXN0KTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCSAgICAgIC8qIFRyeSB0byBmaW5kIGEgdmFsdWUgYnkgbG9va2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGlzIGFuZCBwcmV2aW91cyB0YWJsZXMgKi8KLQkJCSAgICAgIGlmIChiaXQgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJICBmb3IgKHQgPSB0YWJsZTsKLQkJCQkgICAgICAgdC0+cGFyZW50ICE9IE5VTEw7Ci0JCQkJICAgICAgIHQgPSB0LT5wYXJlbnQpCi0JCQkJICAgIHsKLQkJCQkgICAgICBpZiAodC0+cGFyZW50LT5vcGNvZGUtPndvcmRfbnIgPT0gY29uZGl0aW9uLT5maWVsZC0+d29yZF9ucgotCQkJCQkgICYmIHQtPnBhcmVudC0+b3Bjb2RlLT5maXJzdCA8PSBjb25kaXRpb24tPmZpZWxkLT5maXJzdAotCQkJCQkgICYmIHQtPnBhcmVudC0+b3Bjb2RlLT5sYXN0ID49IGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpCi0JCQkJCXsKLQkJCQkJICAvKiB0aGUgdGFibGUgZW50cnkgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0aGUgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCdzIHZhbHVlICovCi0JCQkJCSAgLyogZXh0cmFjdCB0aGUgZmllbGQncyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3Bjb2RlICovCi0JCQkJCSAgdmFsdWUgPSBzdWJfdmFsICh0LT5vcGNvZGVfbnIsIHQtPnBhcmVudC0+b3Bjb2RlLT5sYXN0LAotCQkJCQkJCSAgIGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0LCBjb25kaXRpb24tPmZpZWxkLT5sYXN0KTsKLQkJCQkJICAvKiB0aGlzIGlzIGEgcmVxdWlyZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29uZGl0b25hbCBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJpbmcgdG8gYW5vdGhlciBmaWVsZCAqLwotCQkJCQkgIEFTU0VSVCAoKGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0IC0gY29uZGl0aW9uLT5maWVsZC0+bGFzdCkKLQkJCQkJCSAgPT0gKGZpcnN0X3BvcyAtIGxhc3RfcG9zKSk7Ci1wcmludGYgKCJ2YWx1ZT0lZCwgb3Bjb2RlX25yPSVkLCBsYXN0PSVkLCBbJWQuLiVkXVxuIiwKLQl2YWx1ZSwgdC0+b3Bjb2RlX25yLCB0LT5wYXJlbnQtPm9wY29kZS0+bGFzdCwgY29uZGl0aW9uLT5maWVsZC0+Zmlyc3QsIGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgICAgICBpZiAoYml0ID09IE5VTEwgJiYgdCA9PSBOVUxMKQotCQkJCWVycm9yIChpbnN0cnVjdGlvbi0+bGluZSwKLQkJCQkgICAgICAgIkNvbmRpdGlvbmFsIGAlcycgb2YgZmllbGQgYCVzJyBpc24ndCBleHBhbmRlZCIsCi0JCQkJICAgICAgIGNvbmRpdGlvbi0+c3RyaW5nLCBmaWVsZC0+dmFsX3N0cmluZyk7Ci0JCQkgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi0+dGVzdCkKLQkJCQl7Ci0JCQkJY2FzZSBpbnNuX2ZpZWxkX2NvbmRfbmU6Ci0JCQkJICBpZiAodmFsdWUgPT0gdmFsKQotCQkJCSAgICBpc19wcmVjbHVkZWQgPSAxOwotCQkJCSAgYnJlYWs7Ci0JCQkJY2FzZSBpbnNuX2ZpZWxkX2NvbmRfZXE6Ci0JCQkJICBpZiAodmFsdWUgIT0gdmFsKQotCQkJCSAgICBpc19wcmVjbHVkZWQgPSAxOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmICghaXNfcHJlY2x1ZGVkKQotCQkgICAgICB7Ci0JCQkvKiBPbmx5IGFkZCBhZGRpdGlvbmFsIGhhcmR3aXJlZCBiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGlmIHRoZSBlbnRyeSBpcyBub3QgZ29pbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyIGJlIGNvbWJpbmVkICovCi0JCQlpZiAodGFibGUtPm9wY29kZV9ydWxlLT53aXRoX2NvbWJpbmUpCi0JCQkgIHsKLQkJCSAgICBnZW5fZW50cnlfZXhwYW5kX29wY29kZSAodGFibGUsIGluc3RydWN0aW9uLAotCQkJCQkJICAgICBsYXN0X3BvcyArIDEsCi0JCQkJCQkgICAgICgob3Bjb2RlX25yIDw8IHdpZHRoKSB8IHZhbCksCi0JCQkJCQkgICAgIGJpdHMpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBvcGNvZGVfYml0cyAqbmV3X2JpdHMgPSBuZXdfb3Bjb2RlX2JpdHMgKGJpdHMsIHZhbCwKLQkJCQkJCQkJICAgICBmaXJzdF9wb3MsIGxhc3RfcG9zLAotCQkJCQkJCQkgICAgIGZpZWxkLAotCQkJCQkJCQkgICAgIHRhYmxlLT5vcGNvZGUpOwotCQkJICAgIGdlbl9lbnRyeV9leHBhbmRfb3Bjb2RlICh0YWJsZSwgaW5zdHJ1Y3Rpb24sCi0JCQkJCQkgICAgIGxhc3RfcG9zICsgMSwKLQkJCQkJCSAgICAgKChvcGNvZGVfbnIgPDwgd2lkdGgpIHwgdmFsKSwKLQkJCQkJCSAgICAgbmV3X2JpdHMpOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZW50cnlfaW5zZXJ0X2V4cGFuZGluZyAoZ2VuX2VudHJ5ICp0YWJsZSwKLQkJCSAgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbikKLXsKLSAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLAotCQkJICAgaW5zdHJ1Y3Rpb24sCi0JCQkgICB0YWJsZS0+b3Bjb2RlLT5maXJzdCwKLQkJCSAgIDAsCi0JCQkgICB0YWJsZS0+ZXhwYW5kZWRfYml0cyk7Ci19Ci0KLQotc3RhdGljIGludAotaW5zbnNfbWF0Y2hfZm9ybWF0X25hbWVzIChpbnNuX2xpc3QgKmluc25zLAotCQkJICBmaWx0ZXIgKmZvcm1hdF9uYW1lcykKLXsKLSAgaWYgKGZvcm1hdF9uYW1lcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGluc25fbGlzdCAqaTsKLSAgICAgIGZvciAoaSA9IGluc25zOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KQotCXsKLQkgIGlmICggaS0+aW5zbi0+Zm9ybWF0X25hbWUgIT0gTlVMTAotCSAgICAgICAmJiAhZmlsdGVyX2lzX21lbWJlciAoZm9ybWF0X25hbWVzLCBpLT5pbnNuLT5mb3JtYXRfbmFtZSkpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci10YWJsZV9tYXRjaGVzX3BhdGggKGdlbl9lbnRyeSAqdGFibGUsCi0JCSAgICBkZWNvZGVfcGF0aF9saXN0ICpwYXRocykKLXsKLSAgaWYgKHBhdGhzID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIHdoaWxlIChwYXRocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGdlbl9lbnRyeSAqZW50cnkgPSB0YWJsZTsKLSAgICAgIGRlY29kZV9wYXRoICpwYXRoID0gcGF0aHMtPnBhdGg7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoZW50cnkgPT0gTlVMTCAmJiBwYXRoID09IE5VTEwpCi0JICAgIHJldHVybiAxOwotCSAgaWYgKGVudHJ5ID09IE5VTEwgfHwgcGF0aCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIGlmIChlbnRyeS0+b3Bjb2RlX25yICE9IHBhdGgtPm9wY29kZV9ucikKLQkgICAgYnJlYWs7Ci0JICBlbnRyeSA9IGVudHJ5LT5wYXJlbnQ7Ci0JICBwYXRoID0gcGF0aC0+cGFyZW50OwotCX0KLSAgICAgIHBhdGhzID0gcGF0aHMtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1pbnNuc19tYXRjaF9jb25kaXRpb25zIChpbnNuX2xpc3QgKmluc25zLAotCQkJZGVjb2RlX2NvbmQgKmNvbmRpdGlvbnMpCi17Ci0gIGlmIChjb25kaXRpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgaW5zbl9saXN0ICppOwotICAgICAgZm9yIChpID0gaW5zbnM7IGkgIT0gTlVMTDsgaSA9IGktPm5leHQpCi0JewotCSAgZGVjb2RlX2NvbmQgKmNvbmQ7Ci0JICBmb3IgKGNvbmQgPSBjb25kaXRpb25zOyBjb25kICE9IE5VTEw7IGNvbmQgPSBjb25kLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IGJpdF9ucjsKLQkgICAgICBpZiAoaS0+aW5zbi0+bnJfd29yZHMgPD0gY29uZC0+d29yZF9ucikKLQkJcmV0dXJuIDA7Ci0JICAgICAgZm9yIChiaXRfbnIgPSAwOyBiaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemU7IGJpdF9ucisrKQotCQl7Ci0JCSAgaWYgKCFjb25kLT5tYXNrW2JpdF9ucl0pCi0JCSAgICBjb250aW51ZTsKLQkJICBpZiAoIWktPmluc24tPndvcmRbY29uZC0+d29yZF9ucl0tPmJpdFtiaXRfbnJdLT5tYXNrKQotCQkgICAgcmV0dXJuIDA7Ci0JCSAgaWYgKChpLT5pbnNuLT53b3JkW2NvbmQtPndvcmRfbnJdLT5iaXRbYml0X25yXS0+dmFsdWUKLQkJICAgICAgID09IGNvbmQtPnZhbHVlW2JpdF9ucl0pCi0JCSAgICAgID09ICFjb25kLT5pc19lcXVhbCkKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaW5zbnNfbWF0Y2hfbnJfd29yZHMgKGluc25fbGlzdCAqaW5zbnMsCi0JCSAgICAgIGludCBucl93b3JkcykKLXsKLSAgaW5zbl9saXN0ICppOwotICBmb3IgKGkgPSBpbnNuczsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoaS0+aW5zbi0+bnJfd29yZHMgPCBucl93b3JkcykKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1pbnNuX2xpc3RfY21wIChpbnNuX2xpc3QgKmwsCi0JICAgICAgIGluc25fbGlzdCAqcikKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW5zbl9lbnRyeSAqaW5zbjsKLSAgICAgIGlmIChsID09IE5VTEwgJiYgciA9PSBOVUxMKQotCXJldHVybiAwOwotICAgICAgaWYgKGwgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAociA9PSBOVUxMKQotCXJldHVybiAxOwotICAgICAgaWYgKGwtPmluc24gIT0gci0+aW5zbikKLQlyZXR1cm4gLTE7IC8qIHNvbWV3aGF0IGFyYml0cmFyeSBhdCBwcmVzZW50ICovCi0gICAgICAvKiBza2lwIHRoaXMgaW5zbiAqLwotICAgICAgaW5zbiA9IGwtPmluc247Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMICYmIGwtPmluc24gPT0gaW5zbikKLQlsID0gbC0+bmV4dDsKLSAgICAgIHdoaWxlIChyICE9IE5VTEwgJiYgci0+aW5zbiA9PSBpbnNuKQotCXIgPSByLT5uZXh0OwotICAgIH0KLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1nZW5fZW50cnlfZXhwYW5kX2luc25zIChnZW5fZW50cnkgKnRhYmxlKQotewotICBkZWNvZGVfdGFibGUgKm9wY29kZV9ydWxlOwotCi0gIEFTU0VSVCh0YWJsZS0+bnJfaW5zbnMgPj0gMSk7Ci0gIAotICAvKiBkZXRlcm1pbmUgYSB2YWxpZCBvcGNvZGUgKi8KLSAgZm9yIChvcGNvZGVfcnVsZSA9IHRhYmxlLT5vcGNvZGVfcnVsZTsKLSAgICAgICBvcGNvZGVfcnVsZSAhPSBOVUxMOwotICAgICAgIG9wY29kZV9ydWxlID0gb3Bjb2RlX3J1bGUtPm5leHQpCi0gICAgewotICAgICAgY2hhciAqZGlzY2FyZF9yZWFzb247Ci0gICAgICBpZiAodGFibGUtPnRvcC0+bW9kZWwgIT0gTlVMTAotCSAgJiYgb3Bjb2RlX3J1bGUtPm1vZGVsX25hbWVzICE9IE5VTEwKLQkgICYmICFmaWx0ZXJfaXNfbWVtYmVyIChvcGNvZGVfcnVsZS0+bW9kZWxfbmFtZXMsCi0JCQkJdGFibGUtPnRvcC0+bW9kZWwtPm5hbWUpKQotCXsKLQkgIC8qIHRoZSBydWxlIGlzbid0IGFwcGxpY2FibGUgdG8gdGhpcyBwcm9jZXNzb3IgKi8KLQkgIGRpc2NhcmRfcmVhc29uID0gIndyb25nIG1vZGVsIjsKLQl9Ci0gICAgICBlbHNlIGlmICh0YWJsZS0+bnJfaW5zbnMgPT0gMSAmJiBvcGNvZGVfcnVsZS0+Y29uZGl0aW9ucyA9PSBOVUxMKQotCXsKLQkgIC8qIGZvciBzYWZldHksIHJlcXVpcmUgYSBwcmUtY29kaXRpb24gd2hlbiBhdHRlbXB0aW5nIHRvCi0gICAgICAgICAgICAgYXBwbHkgYSBydWxlIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uICovCi0JICBkaXNjYXJkX3JlYXNvbiA9ICJuZWVkIHByZS1jb25kaXRpb24gd2hlbiBuci1pbnNuID09IDEiOwotCX0KLSAgICAgIGVsc2UgaWYgKHRhYmxlLT5ucl9pbnNucyA9PSAxICYmICFvcGNvZGVfcnVsZS0+d2l0aF9kdXBsaWNhdGVzKQotCXsKLQkgIC8qIExpdHRsZSBwb2ludCBpbiBleHBhbmRpbmcgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2hlbiB3ZSdyZQotICAgICAgICAgICAgIG5vdCBkdXBsaWNhdGluZyB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIHRoYXQgdGhpcyB0YWJsZQotICAgICAgICAgICAgIGNhbGxzICovCi0JICBkaXNjYXJkX3JlYXNvbiA9ICJuZWVkIGR1cGxpY2F0aW9uIHdpdGggbnItaW5zbnMgPT0gMSI7Ci0JfQotICAgICAgZWxzZSBpZiAoIWluc25zX21hdGNoX2Zvcm1hdF9uYW1lcyAodGFibGUtPmluc25zLCBvcGNvZGVfcnVsZS0+Zm9ybWF0X25hbWVzKSkKLQl7Ci0JICBkaXNjYXJkX3JlYXNvbiA9ICJ3cm9uZyBmb3JtYXQgbmFtZSI7Ci0JfQotICAgICAgZWxzZSBpZiAoIWluc25zX21hdGNoX25yX3dvcmRzICh0YWJsZS0+aW5zbnMsIG9wY29kZV9ydWxlLT53b3JkX25yICsgMSkpCi0JewotCSAgZGlzY2FyZF9yZWFzb24gPSAid3JvbmcgbnIgd29yZHMiOwotCX0KLSAgICAgIGVsc2UgaWYgKCF0YWJsZV9tYXRjaGVzX3BhdGggKHRhYmxlLCBvcGNvZGVfcnVsZS0+cGF0aHMpKQotCXsKLQkgIGRpc2NhcmRfcmVhc29uID0gInBhdGggZmFpbGVkIjsKLQl9Ci0gICAgICBlbHNlIGlmICghaW5zbnNfbWF0Y2hfY29uZGl0aW9ucyAodGFibGUtPmluc25zLCBvcGNvZGVfcnVsZS0+Y29uZGl0aW9ucykpCi0JewotCSAgZGlzY2FyZF9yZWFzb24gPSAiY29uZGl0aW9uIGZhaWxlZCI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpc2NhcmRfcmVhc29uID0gIm5vIG9wY29kZSBmaWVsZCI7Ci0JICB0YWJsZS0+b3Bjb2RlID0KLQkgICAgZ2VuX2VudHJ5X2ZpbmRfb3Bjb2RlX2ZpZWxkICh0YWJsZS0+aW5zbnMsCi0JCQkJCSBvcGNvZGVfcnVsZSwKLQkJCQkJIHRhYmxlLT5ucl9pbnNucyA9PSAxLypzdHJpbmctb25seSovCi0JCQkJCSApOwotCSAgaWYgKHRhYmxlLT5vcGNvZGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHRhYmxlLT5vcGNvZGVfcnVsZSA9IG9wY29kZV9ydWxlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAob3B0aW9ucy50cmFjZS5ydWxlX3JlamVjdGlvbikKLQl7Ci0JICBwcmludF9nZW5fZW50cnlfcGF0aCAob3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCBub3RpZnkpOwotCSAgbm90aWZ5IChOVUxMLCAiOiBydWxlIGRpc2NhcmRlZCAtICVzXG4iLCBkaXNjYXJkX3JlYXNvbik7Ci0JfQotICAgIH0KLSAgCi0gIC8qIGRpZCB3ZSBmaW5kIGFueXRoaW5nICovCi0gIGlmIChvcGNvZGVfcnVsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHRoZSBkZWNvZGUgdGFibGUgZmFpbGVkLCB0aGlzIHNldCBvZiBpbnN0cnVjdGlvbnMgaGF2ZW4ndAotICAgICAgICAgYmVlbiB1bmlxdWVseSBpZGVudGlmaWVkICovCi0gICAgICBpZiAodGFibGUtPm5yX2luc25zID4gMSkKLQl7Ci0JICBwcmludF9nZW5fZW50cnlfaW5zbnMgKHRhYmxlLCB3YXJuaW5nLAotCQkJCSAid2FzIG5vdCB1bmlxdWVseSBkZWNvZGVkIiwKLQkJCQkgImRlY29kZXMgdG8gdGhlIHNhbWUgZW50cnkiKTsKLQkgIGVycm9yIChOVUxMLCAiIik7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB3b3JkcyB0aGF0IG11c3QgaGF2ZSBiZWVuIHByZWZldGNoZWQgZm9yCi0gICAgIHRoaXMgdGFibGUgdG8gZnVuY3Rpb24gKi8KLSAgaWYgKHRhYmxlLT5wYXJlbnQgPT0gTlVMTCkKLSAgICB0YWJsZS0+bnJfcHJlZmV0Y2hlZF93b3JkcyA9IHRhYmxlLT5vcGNvZGVfcnVsZS0+d29yZF9uciArIDE7Ci0gIGVsc2UgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+d29yZF9uciArIDEgPiB0YWJsZS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzKQotICAgIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gdGFibGUtPm9wY29kZV9ydWxlLT53b3JkX25yICsgMTsKLSAgZWxzZQotICAgIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gdGFibGUtPnBhcmVudC0+bnJfcHJlZmV0Y2hlZF93b3JkczsKLQotICAvKiBiYWNrIGxpbmsgd2hhdCB3ZSBmb3VuZCB0byBpdHMgcGFyZW50ICovCi0gIGlmICh0YWJsZS0+cGFyZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgQVNTRVJUKHRhYmxlLT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKLSAgICAgIHRhYmxlLT5vcGNvZGUtPnBhcmVudCA9IHRhYmxlLT5wYXJlbnQtPm9wY29kZTsKLSAgICB9Ci0KLSAgLyogcmVwb3J0IHRoZSBydWxlIGJlaW5nIHVzZWQgdG8gZXhwYW5kIHRoZSBpbnN0cnVjdGlvbnMgKi8KLSAgaWYgKG9wdGlvbnMudHJhY2UucnVsZV9zZWxlY3Rpb24pCi0gICAgewotICAgICAgcHJpbnRfZ2VuX2VudHJ5X3BhdGggKHRhYmxlLT5vcGNvZGVfcnVsZS0+bGluZSwgdGFibGUsIG5vdGlmeSk7Ci0gICAgICBub3RpZnkgKE5VTEwsCi0JICAgICAgIjogZGVjb2RlIC0gd29yZCAlZCwgYml0cyBbJWQuLiVkXSBpbiBbJWQuLiVkXSwgb3Bjb2RlcyAlZCwgZW50cmllcyAlZFxuIiwKLQkgICAgICB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAotCSAgICAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAotCSAgICAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+bGFzdCksCi0JICAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmZpcnN0KSwKLQkgICAgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGVfcnVsZS0+bGFzdCksCi0JICAgICAgdGFibGUtPm9wY29kZS0+bnJfb3Bjb2RlcywKLQkgICAgICB0YWJsZS0+bnJfZW50cmllcyk7Ci0gICAgfQotCi0gIC8qIGV4cGFuZCB0aGUgcmF3IGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIG9wY29kZSAqLwotICB7Ci0gICAgaW5zbl9saXN0ICplbnRyeTsKLSAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgICAgewotCWlmIChvcHRpb25zLnRyYWNlLmluc25fZXhwYW5zaW9uKQotCSAgewotCSAgICBwcmludF9nZW5fZW50cnlfcGF0aCAodGFibGUtPm9wY29kZV9ydWxlLT5saW5lLCB0YWJsZSwgbm90aWZ5KTsKLQkgICAgbm90aWZ5IChOVUxMLCAiOiBleHBhbmQgLSAlcy4lc1xuIiwKLQkJICAgIGVudHJ5LT5pbnNuLT5mb3JtYXRfbmFtZSwKLQkJICAgIGVudHJ5LT5pbnNuLT5uYW1lKTsKLQkgIH0KLQlnZW5fZW50cnlfaW5zZXJ0X2V4cGFuZGluZyAodGFibGUsIGVudHJ5LT5pbnNuKTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIGR1bXAgdGhlIHJlc3VsdHMgKi8KLSAgaWYgKG9wdGlvbnMudHJhY2UuZW50cmllcykKLSAgICB7Ci0gICAgICBnZW5fZW50cnkgKmVudHJ5OwotICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5zaWJsaW5nKQotCXsKLQkgIGluc25fbGlzdCAqbDsKLQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIGVudHJ5LCBub3RpZnkpOwotCSAgbm90aWZ5IChOVUxMLCAiOiAlZCAtIGVudHJpZXMgJWQgLSIsCi0JCSAgZW50cnktPm9wY29kZV9uciwKLQkJICBlbnRyeS0+bnJfaW5zbnMpOwotCSAgZm9yIChsID0gZW50cnktPmluc25zOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICBub3RpZnkgKE5VTEwsICIgJXMuJXMiLCBsLT5pbnNuLT5mb3JtYXRfbmFtZSwgbC0+aW5zbi0+bmFtZSk7Ci0JICBub3RpZnkgKE5VTEwsICJcbiIpOwotCX0KLSAgICB9Ci0JCi0gIC8qIHBlcmZvcm0gYSBjb21iaW5lIHBhc3MgaWYgbmVlZGVkICovCi0gIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPndpdGhfY29tYmluZSkKLSAgICB7Ci0gICAgICBnZW5fZW50cnkgKmVudHJ5OwotICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5zaWJsaW5nKQotCXsKLQkgIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBnZW5fZW50cnkgKipsYXN0ID0gJmVudHJ5LT5jb21iaW5lZF9uZXh0OwotCSAgICAgIGdlbl9lbnRyeSAqYWx0OwotCSAgICAgIGZvciAoYWx0ID0gZW50cnktPnNpYmxpbmc7IGFsdCAhPSBOVUxMOyBhbHQgPSBhbHQtPnNpYmxpbmcpCi0JCXsKLQkJICBpZiAoYWx0LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTAotCQkgICAgICAmJiBpbnNuX2xpc3RfY21wIChlbnRyeS0+aW5zbnMsIGFsdC0+aW5zbnMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGFsdC0+Y29tYmluZWRfcGFyZW50ID0gZW50cnk7Ci0JCSAgICAgICpsYXN0ID0gYWx0OwotCQkgICAgICBsYXN0ID0gJmFsdC0+Y29tYmluZWRfbmV4dDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKG9wdGlvbnMudHJhY2UuY29tYmluZSkKLQl7Ci0JICBpbnQgbnJfdW5pcXVlID0gMDsKLQkgIGdlbl9lbnRyeSAqZW50cnk7Ci0JICBmb3IgKGVudHJ5ID0gdGFibGUtPmVudHJpZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPnNpYmxpbmcpCi0JICAgIHsKLQkgICAgICBpZiAoZW50cnktPmNvbWJpbmVkX3BhcmVudCA9PSBOVUxMKQotCQl7Ci0JCSAgaW5zbl9saXN0ICpsOwotCQkgIGdlbl9lbnRyeSAqZHVwbGljYXRlOwotCQkgIG5yX3VuaXF1ZSsrOwotCQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIGVudHJ5LCBub3RpZnkpOwotCQkgIGZvciAoZHVwbGljYXRlID0gZW50cnktPmNvbWJpbmVkX25leHQ7Ci0JCSAgICAgICBkdXBsaWNhdGUgIT0gTlVMTDsKLQkJICAgICAgIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZS0+Y29tYmluZWRfbmV4dCkKLQkJICAgIHsKLQkJICAgICAgbm90aWZ5IChOVUxMLCAiKyVkIiwgZHVwbGljYXRlLT5vcGNvZGVfbnIpOwotCQkgICAgfQotCQkgIG5vdGlmeSAoTlVMTCwgIjogZW50cmllcyAlZCAtIiwgZW50cnktPm5yX2luc25zKTsKLQkJICBmb3IgKGwgPSBlbnRyeS0+aW5zbnM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIG5vdGlmeSAoTlVMTCwgIiAlcy4lcyIsCi0JCQkgICAgICBsLT5pbnNuLT5mb3JtYXRfbmFtZSwKLQkJCSAgICAgIGwtPmluc24tPm5hbWUpOwotCQkgICAgfQotCQkgIG5vdGlmeSAoTlVMTCwgIlxuIik7Ci0JCX0KLQkgICAgfQotCSAgcHJpbnRfZ2VuX2VudHJ5X3BhdGggKHRhYmxlLT5vcGNvZGVfcnVsZS0+bGluZSwgdGFibGUsIG5vdGlmeSk7Ci0JICBub3RpZnkgKE5VTEwsICI6IGNvbWJpbmUgLSB3b3JkICVkLCBiaXRzIFslZC4uJWRdIGluIFslZC4uJWRdLCBvcGNvZGVzICVkLCBlbnRyaWVzICVkLCB1bmlxdWUgJWRcbiIsCi0JCSAgdGFibGUtPm9wY29kZS0+d29yZF9uciwKLQkJICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmZpcnN0KSwKLQkJICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpLAotCQkgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZV9ydWxlLT5maXJzdCksCi0JCSAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmxhc3QpLAotCQkgIHRhYmxlLT5vcGNvZGUtPm5yX29wY29kZXMsCi0JCSAgdGFibGUtPm5yX2VudHJpZXMsCi0JCSAgbnJfdW5pcXVlKTsKLQl9Ci0gICAgfQotCQotICAvKiBDaGVjayB0aGF0IHRoZSBydWxlIGRpZCBtb3JlIHRoYW4gcmUtYXJhbmdlIHRoZSBvcmRlciBvZiB0aGUKLSAgICAgaW5zdHJ1Y3Rpb25zICovCi0gIHsKLSAgICAgIGdlbl9lbnRyeSAqZW50cnk7Ci0gICAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmVudHJpZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPnNpYmxpbmcpCi0JewotCSAgaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChpbnNuX2xpc3RfY21wICh0YWJsZS0+aW5zbnMsIGVudHJ5LT5pbnNucykgPT0gMCkKLQkJewotCQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCB3YXJuaW5nKTsKLQkJICB3YXJuaW5nIChOVUxMLCAiOiBBcHBseWluZyBydWxlIGp1c3QgY29waWVkIGFsbCBpbnN0cnVjdGlvbnNcbiIpOwotCQkgIHByaW50X2dlbl9lbnRyeV9pbnNucyAoZW50cnksIHdhcm5pbmcsICJDb3BpZWQiLCBOVUxMKTsKLQkJICBlcnJvciAoTlVMTCwgIiIpOwotCQl9Ci0JICAgIH0KLQl9ICAgIAotICB9Ci0KLSAgLyogaWYgc29tZSBmb3JtIG9mIGV4cGFuZGVkIHRhYmxlLCBmaWxsIGluIHRoZSBtaXNzaW5nIGRvdHMgKi8KLSAgc3dpdGNoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbikKLSAgICB7Ci0gICAgY2FzZSBwYWRkZWRfc3dpdGNoX2dlbjoKLSAgICBjYXNlIGFycmF5X2dlbjoKLSAgICBjYXNlIGdvdG9fc3dpdGNoX2dlbjoKLSAgICAgIGlmICghdGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbikKLQl7Ci0JICBnZW5fZW50cnkgKiplbnRyeSA9ICZ0YWJsZS0+ZW50cmllczsKLQkgIGdlbl9lbnRyeSAqaWxsZWdhbHMgPSBOVUxMOwotCSAgZ2VuX2VudHJ5ICoqbGFzdF9pbGxlZ2FsID0gJmlsbGVnYWxzOwotCSAgaW50IG9wY29kZV9uciA9IDA7Ci0JICB3aGlsZSAob3Bjb2RlX25yIDwgdGFibGUtPm9wY29kZS0+bnJfb3Bjb2RlcykKLQkgICAgewotCSAgICAgIGlmICgoKmVudHJ5KSA9PSBOVUxMIHx8ICgqZW50cnkpLT5vcGNvZGVfbnIgIT0gb3Bjb2RlX25yKQotCQl7Ci0JCSAgLyogbWlzc2luZyAtIGluc2VydCBpdCB1bmRlciBvdXIgZmVldCBhdCAqZW50cnkgKi8KLQkJICBnZW5fZW50cnlfaW5zZXJ0X2luc24gKHRhYmxlLAotCQkJCQkgdGFibGUtPnRvcC0+aXNhLT5pbGxlZ2FsX2luc24sCi0JCQkJCSB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAotCQkJCQkgMCwgLyogbnJfcHJlZmV0Y2hlZF93b3JkcyA9PSAwIGZvciBpbnZhbGlkICovCi0JCQkJCSBvcGNvZGVfbnIsIE5VTEwpOwotCQkgIEFTU0VSVCAoKCplbnRyeSkgIT0gTlVMTCk7Ci0JCSAgQVNTRVJUICgoKmVudHJ5KS0+b3Bjb2RlX25yID09IG9wY29kZV9ucik7Ci0JCSAgKCpsYXN0X2lsbGVnYWwpID0gKmVudHJ5OwotCQkgICgqbGFzdF9pbGxlZ2FsKS0+Y29tYmluZWRfcGFyZW50ID0gaWxsZWdhbHM7Ci0JCSAgbGFzdF9pbGxlZ2FsID0gJigqbGFzdF9pbGxlZ2FsKS0+Y29tYmluZWRfbmV4dDsKLQkJfQotCSAgICAgIGVudHJ5ID0gJigqZW50cnkpLT5zaWJsaW5nOwotCSAgICAgIG9wY29kZV9ucisrOwotCSAgICB9Ci0JICAvKiBvb3BzLCB3aWxsIGhhdmUgcG9pbnRlZCB0aGUgZmlyc3QgaWxsZWdhbCBpbnNuIGJhY2sgdG8KLSAgICAgICAgICAgICBpdHMgc2VsZi4gIEZpeCB0aGlzICovCi0JICBpZiAoaWxsZWdhbHMgIT0gTlVMTCkKLQkgICAgaWxsZWdhbHMtPmNvbWJpbmVkX3BhcmVudCA9IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzd2l0Y2hfZ2VuOgotICAgIGNhc2UgaW52YWxpZF9nZW46Ci0gICAgICAvKiBpZ25vcmUgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBhbmQgZG8gdGhlIHNhbWUgZm9yIHRoZSBuZXdseSBjcmVhdGVkIHN1YiBlbnRyaWVzIGJ1dCAqb25seSoKLSAgICAgZXhwYW5kIGVudHJpZXMgdGhhdCBoYXZlbid0IGJlZW4gY29tYmluZWQuICovCi0gIHsKLSAgICBnZW5fZW50cnkgKmVudHJ5OwotICAgIGZvciAoZW50cnkgPSB0YWJsZS0+ZW50cmllczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSAgZW50cnktPnNpYmxpbmcpCi0gICAgICB7Ci0JaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKLQkgIHsKLQkgICAgZ2VuX2VudHJ5X2V4cGFuZF9pbnNucyAoZW50cnkpOwotCSAgfQotICAgICAgfQotICB9Ci19Ci0KLXZvaWQKLWdlbl90YWJsZXNfZXhwYW5kX2luc25zIChnZW5fdGFibGUgKmdlbikKLXsKLSAgZ2VuX2xpc3QgKmVudHJ5OwotICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgZ2VuX2VudHJ5X2V4cGFuZF9pbnNucyAoZW50cnktPnRhYmxlKTsKLSAgICB9Ci19Ci0KLQotLyogY3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIHNlbWFudGljIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUKLSAgIGdlbmVyYXRlZC4gIEVsaW1pbmF0ZSBhbnkgZHVwbGljYXRlcy4gVmVyaWZ5IHRoYXQgdGhlIGRlY29kZSBzdGFnZQotICAgd29ya2VkLiAqLwotCi1zdGF0aWMgdm9pZAotbWFrZV9nZW5fc2VtYW50aWNzX2xpc3QgKGxmICpmaWxlLAotCQkJIGdlbl9lbnRyeSAqZW50cnksCi0JCQkgaW50IGRlcHRoLAotCQkJIHZvaWQgKmRhdGEpCi17Ci0gIGdlbl90YWJsZSAqZ2VuID0gKGdlbl90YWJsZSopIGRhdGE7Ci0gIGluc25fbGlzdCAqaW5zbjsKLSAgLyogTm90IGludGVyZXN0ZWQgaW4gYW4gZW50cmllIHRoYXQgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gc29tZQotICAgICBvdGhlciBlbnRyeSBhdCB0aGUgc2FtZSBsZXZlbCAqLwotICBpZiAoZW50cnktPmNvbWJpbmVkX3BhcmVudCAhPSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBhIGxlYWYgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgaW5zdHJ1Y3Rpb24uIElmIG5vdCB0aGUgZGVjb2RlCi0gICAgIHN0YWdlIGZhaWxlZC4gKi8KLSAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMSk7Ci0KLSAgLyogRW50ZXIgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIHRoZSBsaXN0IG9mIHNlbWFudGljIGZ1bmN0aW9ucy4gKi8KLSAgaW5zbiA9IGluc25fbGlzdF9pbnNlcnQgKCZnZW4tPnNlbWFudGljcywgJmdlbi0+bnJfc2VtYW50aWNzLAotCQkJICAgZW50cnktPmluc25zLT5pbnNuLAotCQkJICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkgICBlbnRyeS0+cGFyZW50LT5vcGNvZGUsCi0JCQkgICBlbnRyeS0+aW5zbnMtPm5yX3ByZWZldGNoZWRfd29yZHMsCi0JCQkgICBtZXJnZV9kdXBsaWNhdGVfaW5zbnMpOwotICAvKiBwb2ludCB0aGUgdGFibGUgZW50cnkgYXQgdGhlIHJlYWwgc2VtYW50aWMgZnVuY3Rpb24gKi8KLSAgQVNTRVJUIChpbnNuICE9IE5VTEwpOwotICBlbnRyeS0+aW5zbnMtPnNlbWFudGljID0gaW5zbjsKLX0KLQotCi12b2lkCi1nZW5fdGFibGVzX2V4cGFuZF9zZW1hbnRpY3MgKGdlbl90YWJsZSAqZ2VuKQotewotICBnZW5fbGlzdCAqZW50cnk7Ci0gIGZvciAoZW50cnkgPSBnZW4tPnRhYmxlczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAoTlVMTCwKLQkJCSAgICAgICBlbnRyeS0+dGFibGUsCi0JCQkgICAgICAgMSwgLyogZGVwdGggKi8KLQkJCSAgICAgICBOVUxMLCAvKiBzdGFydC1oYW5kbGVyICovCi0JCQkgICAgICAgbWFrZV9nZW5fc2VtYW50aWNzX2xpc3QsIC8qIGxlYWYtaGFuZGxlciAqLwotCQkJICAgICAgIE5VTEwsIC8qIGVuZC1oYW5kbGVyICovCi0JCQkgICAgICAgZ2VuKTsgLyogZGF0YSAqLwotICB9Ci19Ci0KLQotCi0jaWZkZWYgTUFJTgotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX29wY29kZV9maWVsZCAobGYgKmZpbGUsCi0JCSAgIGNoYXIgKnByZWZpeCwKLQkJICAgb3Bjb2RlX2ZpZWxkICpmaWVsZCwKLQkJICAgY2hhciAqc3VmZml4LAotCQkgICBpbnQgbGV2ZWxzKQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhvcGNvZGVfZmllbGQgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBmaWVsZCk7Ci0gIGlmIChsZXZlbHMgJiYgZmllbGQgIT0gTlVMTCkgewotICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZpcnN0ICVkKSIsIGZpZWxkLT5maXJzdCk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obGFzdCAlZCkiLCBmaWVsZC0+bGFzdCk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfb3Bjb2RlcyAlZCkiLCBmaWVsZC0+bnJfb3Bjb2Rlcyk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaXNfYm9vbGVhbiAlZCkiLCBmaWVsZC0+aXNfYm9vbGVhbik7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oYm9vbGVhbl9jb25zdGFudCAlZCkiLCBmaWVsZC0+Ym9vbGVhbl9jb25zdGFudCk7Ci0gICAgZHVtcF9vcGNvZGVfZmllbGQoZmlsZSwgIlxuKHBhcmVudCAiLCBmaWVsZC0+cGFyZW50LCAiKSIsIGxldmVscyAtIDEpOwotICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZHVtcF9vcGNvZGVfYml0cyAobGYgKmZpbGUsCi0JCSAgY2hhciAqcHJlZml4LAotCQkgIG9wY29kZV9iaXRzICpiaXRzLAotCQkgIGNoYXIgKnN1ZmZpeCwKLQkJICBpbnQgbGV2ZWxzKQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhvcGNvZGVfYml0cyAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGJpdHMpOwotICAKLSAgaWYgKGxldmVscyAmJiBiaXRzICE9IE5VTEwpCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbih2YWx1ZSAlZCkiLCBiaXRzLT52YWx1ZSk7Ci0gICAgICBkdW1wX29wY29kZV9maWVsZCAoZmlsZSwgIlxuKG9wY29kZSAiLCBiaXRzLT5vcGNvZGUsICIpIiwgMCk7Ci0gICAgICBkdW1wX2luc25fZmllbGQgKGZpbGUsICJcbihmaWVsZCAiLCBiaXRzLT5maWVsZCwgIikiKTsKLSAgICAgIGR1bXBfb3Bjb2RlX2JpdHMgKGZpbGUsICJcbihuZXh0ICIsIGJpdHMtPm5leHQsICIpIiwgbGV2ZWxzIC0gMSk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2luc25fbGlzdCAobGYgKmZpbGUsCi0JCWNoYXIgKnByZWZpeCwKLQkJaW5zbl9saXN0ICplbnRyeSwKLQkJY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX2xpc3QgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBlbnRyeSk7Ci0KLSAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKLSAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICBkdW1wX2luc25fZW50cnkgKGZpbGUsICJcbihpbnNuICIsIGVudHJ5LT5pbnNuLCAiKSIpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKLSAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWR1bXBfaW5zbl93b3JkX2VudHJ5X2xpc3RfZW50cmllcyAobGYgKmZpbGUsCi0JCQkgICAgICAgY2hhciAqcHJlZml4LAotCQkJICAgICAgIGluc25fbGlzdCAqZW50cnksCi0JCQkgICAgICAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIHdoaWxlIChlbnRyeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGR1bXBfaW5zbl9saXN0IChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7Ci0gICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2dlbl9lbnRyeSAobGYgKmZpbGUsCi0JCWNoYXIgKnByZWZpeCwKLQkJZ2VuX2VudHJ5ICp0YWJsZSwKLQkJY2hhciAqc3VmZml4LAotCQlpbnQgbGV2ZWxzKQotewotCi0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGdlbl9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIHRhYmxlKTsKLQotICBpZiAobGV2ZWxzICYmIHRhYmxlICE9IE5VTEwpIHsKLQotICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG9wY29kZV9uciAlZCkiLCB0YWJsZS0+b3Bjb2RlX25yKTsKLSAgICBsZl9wcmludGYgKGZpbGUsICJcbih3b3JkX25yICVkKSIsIHRhYmxlLT53b3JkX25yKTsKLSAgICBkdW1wX29wY29kZV9iaXRzIChmaWxlLCAiXG4oZXhwYW5kZWRfYml0cyAiLCB0YWJsZS0+ZXhwYW5kZWRfYml0cywgIikiLCAtMSk7Ci0gICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfaW5zbnMgJWQpIiwgdGFibGUtPm5yX2luc25zKTsKLSAgICBkdW1wX2luc25fd29yZF9lbnRyeV9saXN0X2VudHJpZXMgKGZpbGUsICJcbihpbnNucyAiLCB0YWJsZS0+aW5zbnMsICIpIik7Ci0gICAgZHVtcF9kZWNvZGVfcnVsZSAoZmlsZSwgIlxuKG9wY29kZV9ydWxlICIsIHRhYmxlLT5vcGNvZGVfcnVsZSwgIikiKTsKLSAgICBkdW1wX29wY29kZV9maWVsZCAoZmlsZSwgIlxuKG9wY29kZSAiLCB0YWJsZS0+b3Bjb2RlLCAiKSIsIDApOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5yX2VudHJpZXMgJWQpIiwgdGFibGUtPm5yX2VudHJpZXMpOwotICAgIGR1bXBfZ2VuX2VudHJ5IChmaWxlLCAiXG4oZW50cmllcyAiLCB0YWJsZS0+ZW50cmllcywgIikiLCB0YWJsZS0+bnJfZW50cmllcyk7Ci0gICAgZHVtcF9nZW5fZW50cnkgKGZpbGUsICJcbihzaWJsaW5nICIsIHRhYmxlLT5zaWJsaW5nLCAiKSIsIGxldmVscyAtIDEpOwotICAgIGR1bXBfZ2VuX2VudHJ5IChmaWxlLCAiXG4ocGFyZW50ICIsIHRhYmxlLT5wYXJlbnQsICIpIiwgMCk7Ci0gICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9nZW5fbGlzdCAobGYgKmZpbGUsCi0JICAgICAgIGNoYXIgKnByZWZpeCwKLQkgICAgICAgZ2VuX2xpc3QgKmVudHJ5LAotCSAgICAgICBjaGFyICpzdWZmaXgsCi0JICAgICAgIGludCBsZXZlbHMpCi17Ci0gIHdoaWxlIChlbnRyeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGdlbl9saXN0ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOwotICAgICAgZHVtcF9nZW5fZW50cnkgKGZpbGUsICJcbigiLCBlbnRyeS0+dGFibGUsICIpIiwgbGV2ZWxzKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgKGdlbl9saXN0ICopIDB4JWx4KSIsIChsb25nKSBlbnRyeS0+bmV4dCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2dlbl90YWJsZSAobGYgKmZpbGUsCi0JCWNoYXIgKnByZWZpeCwKLQkJZ2VuX3RhYmxlICpnZW4sCi0JCWNoYXIgKnN1ZmZpeCwKLQkJaW50IGxldmVscykKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMoZ2VuX3RhYmxlICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZ2VuKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaXNhIChpbnNuX3RhYmxlICopIDB4JWx4KSIsIChsb25nKSBnZW4tPmlzYSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHJ1bGVzIChkZWNvZGVfdGFibGUgKikgMHglbHgpIiwgKGxvbmcpIGdlbi0+cnVsZXMpOwotICBkdW1wX2dlbl9saXN0IChmaWxlLCAiXG4oIiwgZ2VuLT50YWJsZXMsICIpIiwgbGV2ZWxzKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLWlnZW5fb3B0aW9ucyBvcHRpb25zOwotCi1pbnQKLW1haW4gKGludCBhcmdjLAotICAgICAgY2hhciAqKmFyZ3YpCi17Ci0gIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzOwotICBpbnNuX3RhYmxlICppbnN0cnVjdGlvbnM7Ci0gIGdlbl90YWJsZSAqZ2VuOwotICBsZiAqbDsKLQotICBpZiAoYXJnYyAhPSA3KQotICAgIGVycm9yIChOVUxMLCAiVXNhZ2U6IGluc24gPGZpbHRlci1pbj4gPGhpLWJpdC1ucj4gPGluc24tYml0LXNpemU+IDx3aWR0aHM+IDxkZWNvZGUtdGFibGU+IDxpbnNuLXRhYmxlPlxuIik7Ci0KLSAgSU5JVF9PUFRJT05TIChvcHRpb25zKTsKLQotICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLmZsYWdzX2ZpbHRlciwgYXJndlsxXSk7Ci0KLSAgb3B0aW9ucy5oaV9iaXRfbnIgPSBhMmkoYXJndlsyXSk7Ci0gIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSA9IGEyaShhcmd2WzNdKTsKLSAgb3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzID0gYTJpKGFyZ3ZbNF0pOwotICBBU1NFUlQob3B0aW9ucy5oaV9iaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemUpOwotCi0gIGluc3RydWN0aW9ucyA9IGxvYWRfaW5zbl90YWJsZSAoYXJndls2XSwgTlVMTCk7Ci0gIGRlY29kZV9ydWxlcyA9IGxvYWRfZGVjb2RlX3RhYmxlIChhcmd2WzVdKTsKLSAgZ2VuID0gbWFrZV9nZW5fdGFibGVzIChpbnN0cnVjdGlvbnMsIGRlY29kZV9ydWxlcyk7Ci0KLSAgZ2VuX3RhYmxlc19leHBhbmRfaW5zbnMgKGdlbik7Ci0KLSAgbCA9IGxmX29wZW4gKCItIiwgInN0ZG91dCIsIGxmX29taXRfcmVmZXJlbmNlcywgbGZfaXNfdGV4dCwgInRtcC1sZC1pbnNuIik7Ci0KLSAgZHVtcF9nZW5fdGFibGUgKGwsICIoIiwgZ2VuLCAiKVxuIiwgLTEpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4uaCBiL3NpbS9pZ2VuL2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRlMjc3Li4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX29wY29kZV9maWVsZCBvcGNvZGVfZmllbGQ7Ci1zdHJ1Y3QgX29wY29kZV9maWVsZCB7Ci0gIGludCB3b3JkX25yOwotICBpbnQgZmlyc3Q7Ci0gIGludCBsYXN0OwotICBpbnQgaXNfYm9vbGVhbjsKLSAgaW50IG5yX29wY29kZXM7Ci0gIHVuc2lnbmVkIGJvb2xlYW5fY29uc3RhbnQ7Ci0gIG9wY29kZV9maWVsZCAqcGFyZW50OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29wY29kZV9iaXRzIG9wY29kZV9iaXRzOwotc3RydWN0IF9vcGNvZGVfYml0cyB7Ci0gIGludCB2YWx1ZTsKLSAgaW50IGZpcnN0OwotICBpbnQgbGFzdDsKLSAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQ7Ci0gIG9wY29kZV9maWVsZCAqb3Bjb2RlOwotICBvcGNvZGVfYml0cyAqbmV4dDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9pbnNuX29wY29kZXMgaW5zbl9vcGNvZGVzOwotc3RydWN0IF9pbnNuX29wY29kZXMgewotICBvcGNvZGVfZmllbGQgKm9wY29kZTsKLSAgaW5zbl9vcGNvZGVzICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2luc25fbGlzdCBpbnNuX2xpc3Q7Ci1zdHJ1Y3QgX2luc25fbGlzdCB7Ci0gIC8qIHRoZSBpbnN0cnVjdGlvbiAqLwotICBpbnNuX2VudHJ5ICppbnNuOwotICAvKiBsaXN0IG9mIG5vbiBjb25zdGFudCBiaXRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgY29uc3RhbnQgKi8KLSAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHM7Ci0gIC8qIGxpc3Qgb2YgdGhlIHZhcmlvdXMgb3Bjb2RlIGZpZWxkIHBhdGhzIHVzZWQgdG8gcmVhY2ggdGhpcwotICAgICBpbnN0cnVjdGlvbiAqLwotICBpbnNuX29wY29kZXMgKm9wY29kZXM7Ci0gIC8qIG51bWJlciBvZiBwcmVmZXRjaGVkIHdvcmRzIGZvciB0aGlzIGluc3RydWN0aW9uICovCi0gIGludCBucl9wcmVmZXRjaGVkX3dvcmRzOwotICAvKiBUaGUgc2VtYW50aWMgZnVuY3Rpb24gbGlzdF9lbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaW5zbiAqLwotICBpbnNuX2xpc3QgKnNlbWFudGljOwotICAvKiBsaW5rZWQgbGlzdCAqLwotICBpbnNuX2xpc3QgKm5leHQ7Ci19OwotCi0vKiBmb3J3YXJkICovCi10eXBlZGVmIHN0cnVjdCBfZ2VuX2xpc3QgZ2VuX2xpc3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9nZW5fZW50cnkgZ2VuX2VudHJ5Owotc3RydWN0IF9nZW5fZW50cnkgewotCi0gIC8qIGFzIGFuIGVudHJ5IGluIGEgdGFibGUgKi8KLSAgaW50IHdvcmRfbnI7Ci0gIGludCBvcGNvZGVfbnI7Ci0gIGdlbl9lbnRyeSAqc2libGluZzsKLSAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHM7Ci0gIGdlbl9lbnRyeSAqcGFyZW50OyAvKiBwYXJlbnQgaGFzIHRoZSBvcGNvZGUqIGRhdGEgKi8KLQotICAvKiBhcyBhIHRhYmxlIGNvbnRhaW5pbmcgZW50cmllcyAqLwotICBkZWNvZGVfdGFibGUgKm9wY29kZV9ydWxlOwotICBvcGNvZGVfZmllbGQgKm9wY29kZTsKLSAgaW50IG5yX3ByZWZldGNoZWRfd29yZHM7Ci0gIGludCBucl9lbnRyaWVzOwotICBnZW5fZW50cnkgKmVudHJpZXM7Ci0KLSAgLyogYXMgYm90aCBhbiBlbnRyeSBhbmQgYSB0YWJsZSAqLwotICBpbnQgbnJfaW5zbnM7Ci0gIGluc25fbGlzdCAqaW5zbnM7Ci0KLSAgLyogaWYgc2libGluZ3MgYXJlIGJlaW5nIGNvbWJpbmVkICovCi0gIGdlbl9lbnRyeSAqY29tYmluZWRfbmV4dDsKLSAgZ2VuX2VudHJ5ICpjb21iaW5lZF9wYXJlbnQ7Ci0KLSAgLyogb3VyIHRvcC1vZi10cmVlICovCi0gIGdlbl9saXN0ICp0b3A7Ci19OwotCi0KLXN0cnVjdCBfZ2VuX2xpc3QgewotICBtb2RlbF9lbnRyeSAqbW9kZWw7Ci0gIGluc25fdGFibGUgKmlzYTsKLSAgZ2VuX2VudHJ5ICp0YWJsZTsKLSAgZ2VuX2xpc3QgKm5leHQ7Ci19OwotCi0KLXR5cGVkZWYgc3RydWN0IF9nZW5fdGFibGUgZ2VuX3RhYmxlOwotc3RydWN0IF9nZW5fdGFibGUgewotICAvKiBsaXN0IG9mIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zICovCi0gIGluc25fdGFibGUgKmlzYTsKLSAgLyogbGlzdCBvZiBhbGwgdGhlIHNlbWFudGljIGZ1bmN0aW9ucyAqLwotICBkZWNvZGVfdGFibGUgKnJ1bGVzOwotICAvKiBsaXN0IG9mIGFsbCB0aGUgZ2VuZXJhdGVkIGluc3RydWN0aW9uIHRhYmxlcyAqLwotICBnZW5fbGlzdCAqdGFibGVzOwotICAvKiBsaXN0IG9mIGFsbCB0aGUgc2VtYW50aWMgZnVuY3Rpb25zICovCi0gIGludCBucl9zZW1hbnRpY3M7Ci0gIGluc25fbGlzdCAqc2VtYW50aWNzOwotfTsKLQotCi1leHRlcm4gZ2VuX3RhYmxlICptYWtlX2dlbl90YWJsZXMKLShpbnNuX3RhYmxlICppc2EsCi0gZGVjb2RlX3RhYmxlICpydWxlcyk7Ci0KLQotZXh0ZXJuIHZvaWQgZ2VuX3RhYmxlc19leHBhbmRfaW5zbnMKLShnZW5fdGFibGUgKmdlbik7Ci0KLWV4dGVybiB2b2lkIGdlbl90YWJsZXNfZXhwYW5kX3NlbWFudGljcwotKGdlbl90YWJsZSAqZ2VuKTsKLQotZXh0ZXJuIGludCBnZW5fZW50cnlfZGVwdGgKLShnZW5fZW50cnkgKnRhYmxlKTsKLQotCi0KLS8qIFRyYXZlcnNlIHRoZSBjcmVhdGVkIGRhdGEgc3RydWN0dXJlICovCi0KLXR5cGVkZWYgdm9pZCBnZW5fZW50cnlfaGFuZGxlcgotKGxmICpmaWxlLAotIGdlbl9lbnRyeSAqZW50cnksCi0gaW50IGRlcHRoLAotIHZvaWQgKmRhdGEpOwotCi1leHRlcm4gdm9pZCBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZQotKGxmICpmaWxlLAotIGdlbl9lbnRyeSAqdGFibGUsCi0gaW50IGRlcHRoLAotIGdlbl9lbnRyeV9oYW5kbGVyICpzdGFydCwKLSBnZW5fZW50cnlfaGFuZGxlciAqbGVhZiwKLSBnZW5fZW50cnlfaGFuZGxlciAqZW5kLAotIHZvaWQgKmRhdGEpOwotCi0KLQotLyogTWlzYyBmdW5jdGlvbnMgLSBhY3R1YWxseSBpbiBpZ2VuLmMgKi8KLQotCi0vKiBDYWNoZSBmdW5jdGlvbnM6ICovCi0KLWV4dGVybiBpbnQgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2Zvcm1hbAotKGxmICpmaWxlLCBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLWV4dGVybiBpbnQgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2FjdHVhbAotKGxmICpmaWxlLCBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0KLWV4dGVybiBpbnQgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fZm9ybWFsCi0obGYgKmZpbGUsIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQotZXh0ZXJuIGludCBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9hY3R1YWwKLShsZiAqZmlsZSwgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOwotCi1leHRlcm4gaW50IHByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgcHJpbnRfaWRlY29kZV9mdW5jdGlvbl9mb3JtYWwKLShsZiAqZmlsZSwgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOwotCi1leHRlcm4gaW50IHByaW50X2lkZWNvZGVfZnVuY3Rpb25fYWN0dWFsCi0obGYgKmZpbGUsIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzLAotICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlLAotICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUsCi0gIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSwKLSAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfZW5naW5lLAotICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9ub25lCi19IGxmX2Z1bmN0aW9uX25hbWVfcHJlZml4ZXM7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGlzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uID0gMCwKLSAgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA9IDEsCi0gIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlLAotfSBmdW5jdGlvbl9kZWNsX3R5cGU7Ci0KLWV4dGVybiBpbnQgcHJpbnRfZnVuY3Rpb25fbmFtZQotKGxmICpmaWxlLAotIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotIGNvbnN0IGNoYXIgKmZvcm1hdF9uYW1lLAotIGNvbnN0IGNoYXIgKm1vZGVsX25hbWUsCi0gb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0gbGZfZnVuY3Rpb25fbmFtZV9wcmVmaXhlcyBwcmVmaXgpOwotCi1leHRlcm4gdm9pZCBwcmludF9teV9kZWZpbmVzCi0obGYgKmZpbGUsCi0gY29uc3QgY2hhciAqYmFzZW5hbWUsCi0gY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCi0gb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMpOwotCi1leHRlcm4gdm9pZCBwcmludF9pdHJhY2UKLShsZiAqZmlsZSwKLSBpbnNuX2VudHJ5ICppbnNuLAotIGludCBpZGVjb2RlKTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfc2ltX2VuZ2luZV9hYm9ydAotKGxmICpmaWxlLAotIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwotCi0KLWV4dGVybiB2b2lkIHByaW50X2luY2x1ZGUgKGxmICpmaWxlLCBpZ2VuX21vZHVsZSBtb2R1bGUpOwotZXh0ZXJuIHZvaWQgcHJpbnRfaW5jbHVkZV9pbmxpbmUgIChsZiAqZmlsZSwgaWdlbl9tb2R1bGUgbW9kdWxlKTsKLWV4dGVybiB2b2lkIHByaW50X2luY2x1ZGVzIChsZiAqZmlsZSk7Ci0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2lnZW4uYyBiL3NpbS9pZ2VuL2lnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0ZjBjZC4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9pZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIxICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLQotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImxkLWluc24uaCIKLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1jYWNoZS5oIgotCi0jaW5jbHVkZSAiZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4tbW9kZWwuaCIKLSNpbmNsdWRlICJnZW4taWNhY2hlLmgiCi0jaW5jbHVkZSAiZ2VuLWl0YWJsZS5oIgotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0jaW5jbHVkZSAiZ2VuLXNlbWFudGljcy5oIgotI2luY2x1ZGUgImdlbi1lbmdpbmUuaCIKLSNpbmNsdWRlICJnZW4tc3VwcG9ydC5oIgotI2luY2x1ZGUgImdlbi1lbmdpbmUuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBTZW1hbnRpYyBmdW5jdGlvbnMgKi8KLQotaW50Ci1wcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGxmICpmaWxlLAotCQkJCWludCBucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICBpbnQgbnIgPSAwOwotICBpbnQgd29yZF9ucjsKLSAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSB8fCBucl9wcmVmZXRjaGVkX3dvcmRzIDwgMCkKLSAgICB7Ci0gICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJTSU1fREVTQyBzZCxcbiIpOwotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNpZGVjb2RlX2NhY2hlICpjYWNoZV9lbnRyeSxcbiIsCi0JCSAgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSIsCi0JCSAgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIH0KLSAgZWxzZSBpZiAob3B0aW9ucy5nZW4uc21wKQotICAgIHsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNpbV9jcHUgKmNwdSxcbiIpOwotICAgICAgZm9yICh3b3JkX25yID0gMDsgd29yZF9uciA8IG5yX3ByZWZldGNoZWRfd29yZHM7IHdvcmRfbnIrKykKLQl7Ci0JICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fJWQsXG4iLAotCQkJICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sLAotCQkJICAgd29yZF9ucik7Ci0JfQotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSIsCi0JCSAgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9ERVNDIHNkLFxuIik7Ci0gICAgICBmb3IgKHdvcmRfbnIgPSAwOyB3b3JkX25yIDwgbnJfcHJlZmV0Y2hlZF93b3Jkczsgd29yZF9ucisrKQotCXsKLQkgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8lZCxcbiIsCi0JCQkgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsCi0JCQkgICB3b3JkX25yKTsKLQl9Ci0gICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX2FkZHJlc3MgY2lhIiwKLQkJICAgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gICAgfQotICByZXR1cm4gbnI7Ci19Ci0KLWludAotcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fYWN0dWFsIChsZiAqZmlsZSwKLQkJCQlpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKLXsKLSAgaW50IG5yID0gMDsKLSAgaW50IHdvcmRfbnI7Ci0gIGlmIChvcHRpb25zLmdlbi5pY2FjaGUgfHwgbnJfcHJlZmV0Y2hlZF93b3JkcyA8IDApCi0gICAgewotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAic2QsIGNhY2hlX2VudHJ5LCBjaWEiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3B0aW9ucy5nZW4uc21wKQotCW5yICs9IGxmX3ByaW50ZiAoZmlsZSwgImNwdSIpOwotICAgICAgZWxzZQotCW5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNkIik7Ci0gICAgICBmb3IgKHdvcmRfbnIgPSAwOyB3b3JkX25yIDwgbnJfcHJlZmV0Y2hlZF93b3Jkczsgd29yZF9ucisrKQotCW5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiwgaW5zdHJ1Y3Rpb25fJWQiLCB3b3JkX25yKTsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiwgY2lhIik7Ci0gICAgfQotICByZXR1cm4gbnI7Ci19Ci0KLWludAotcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSAobGYgKmZpbGUpCi17Ci0gIGludCBuciA9IDA7Ci0gIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyIsCi0JCSAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIHJldHVybiBucjsKLX0KLQotCi0vKiBJZGVjb2RlIGZ1bmN0aW9ucyAqLwotCi1pbnQKLXByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwgKGxmICpmaWxlLAotCQkJICAgICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCi17Ci0gIGludCBuciA9IDA7Ci0gIGludCB3b3JkX25yOwotICBpZiAob3B0aW9ucy5nZW4uc21wKQotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAic2ltX2NwdSAqY3B1LFxuIik7Ci0gIGVsc2UKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9ERVNDIHNkLFxuIik7Ci0gIGZvciAod29yZF9uciA9IDA7IHdvcmRfbnIgPCBucl9wcmVmZXRjaGVkX3dvcmRzOyB3b3JkX25yKyspCi0gICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiICVzaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8lZCxcbiIsCi0JCSAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sLCB3b3JkX25yKTsKLSAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiICVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBjaWEsXG4iLAotCQkgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICBuciArPSBsZl9wcmludGYgKGZpbGUsICIgJXNpZGVjb2RlX2NhY2hlICpjYWNoZV9lbnRyeSIsCi0JCSAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1wcmludF9pY2FjaGVfZnVuY3Rpb25fYWN0dWFsIChsZiAqZmlsZSwKLQkJCSAgICAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQotewotICBpbnQgbnIgPSAwOwotICBpbnQgd29yZF9ucjsKLSAgaWYgKG9wdGlvbnMuZ2VuLnNtcCkKLSAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJjcHUiKTsKLSAgZWxzZQotICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNkIik7Ci0gIGZvciAod29yZF9uciA9IDA7IHdvcmRfbnIgPCBucl9wcmVmZXRjaGVkX3dvcmRzOyB3b3JkX25yKyspCi0gICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiLCBpbnN0cnVjdGlvbl8lZCIsIHdvcmRfbnIpOwotICBuciArPSBsZl9wcmludGYgKGZpbGUsICIsIGNpYSwgY2FjaGVfZW50cnkiKTsKLSAgcmV0dXJuIG5yOwotfQotCi1pbnQKLXByaW50X2ljYWNoZV9mdW5jdGlvbl90eXBlIChsZiAqZmlsZSkKLXsKLSAgaW50IG5yOwotICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQotICAgIHsKLSAgICAgIG5yID0gcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSAoZmlsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnIgPSBsZl9wcmludGYgKGZpbGUsICIlc2lkZWNvZGVfc2VtYW50aWMgKiIsCi0JCSAgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gICAgfQotICByZXR1cm4gbnI7Ci19Ci0KLQotLyogRnVuY3Rpb24gbmFtZXMgKi8KLQotc3RhdGljIGludAotcHJpbnRfb3Bjb2RlX2JpdHMgKGxmICpmaWxlLAotCQkgICBvcGNvZGVfYml0cyAqYml0cykKLXsKLSAgaW50IG5yID0gMDsKLSAgaWYgKGJpdHMgPT0gTlVMTCkKLSAgICByZXR1cm4gbnI7Ci0gIG5yICs9IGxmX3B1dGNociAoZmlsZSwgJ18nKTsKLSAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCBiaXRzLT5maWVsZC0+dmFsX3N0cmluZyk7Ci0gIGlmIChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4gJiYgYml0cy0+dmFsdWUgPT0gMCkKLSAgICBuciArPSBsZl9wdXRpbnQgKGZpbGUsIGJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCk7Ci0gIGVsc2UgaWYgKCFiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pIHsKLSAgICBpZiAoYml0cy0+b3Bjb2RlLT5sYXN0IDwgYml0cy0+ZmllbGQtPmxhc3QpCi0gICAgICBuciArPSBsZl9wdXRpbnQgKGZpbGUsIGJpdHMtPnZhbHVlIDw8IChiaXRzLT5maWVsZC0+bGFzdCAtIGJpdHMtPm9wY29kZS0+bGFzdCkpOwotICAgIGVsc2UKLSAgICAgIG5yICs9IGxmX3B1dGludCAoZmlsZSwgYml0cy0+dmFsdWUpOwotICB9Ci0gIG5yICs9IHByaW50X29wY29kZV9iaXRzIChmaWxlLCBiaXRzLT5uZXh0KTsKLSAgcmV0dXJuIG5yOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9jX25hbWUgKGxmICpmaWxlLAotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIGludCBuciA9IDA7Ci0gIGNvbnN0IGNoYXIgKnBvczsKLSAgZm9yIChwb3MgPSBuYW1lOyAqcG9zICE9ICdcMCc7IHBvcysrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKnBvcykKLQl7Ci0JY2FzZSAnLyc6Ci0JY2FzZSAnLSc6Ci0JICBicmVhazsKLQljYXNlICcgJzoKLQljYXNlICcuJzoKLQkgIG5yICs9IGxmX3B1dGNociAoZmlsZSwgJ18nKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBuciArPSBsZl9wdXRjaHIgKGZpbGUsICpwb3MpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIG5yOwotfQotCi1leHRlcm4gaW50Ci1wcmludF9mdW5jdGlvbl9uYW1lIChsZiAqZmlsZSwKLQkJICAgICBjb25zdCBjaGFyICpiYXNlbmFtZSwKLQkJICAgICBjb25zdCBjaGFyICpmb3JtYXRfbmFtZSwKLQkJICAgICBjb25zdCBjaGFyICptb2RlbF9uYW1lLAotCQkgICAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkgICAgIGxmX2Z1bmN0aW9uX25hbWVfcHJlZml4ZXMgcHJlZml4KQotewotICBpbnQgbnIgPSAwOwotICAvKiB0aGUgcHJlZml4ICovCi0gIHN3aXRjaCAocHJlZml4KQotICAgIHsKLSAgICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljczoKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnByZWZpeC5sKTsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNlbWFudGljXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlOgotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnByZWZpeC5sKTsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgImlkZWNvZGVfIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZToKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaXRhYmxlXyIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZToKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgb3B0aW9ucy5tb2R1bGUuaWNhY2hlLnByZWZpeC5sKTsKLSAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgImljYWNoZV8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZnVuY3Rpb25fbmFtZV9wcmVmaXhfZW5naW5lOgotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBvcHRpb25zLm1vZHVsZS5lbmdpbmUucHJlZml4LmwpOwotICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiZW5naW5lXyIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICBpZiAobW9kZWxfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG5yICs9IHByaW50X2NfbmFtZSAoZmlsZSwgbW9kZWxfbmFtZSk7Ci0gICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJfIik7Ci0gICAgfQotCi0gIC8qIHRoZSBmdW5jdGlvbiBuYW1lICovCi0gIG5yICs9IHByaW50X2NfbmFtZSAoZmlsZSwgYmFzZW5hbWUpOwotICAKLSAgLyogdGhlIGZvcm1hdCBuYW1lIGlmIGF2YWlsYWJsZSAqLwotICBpZiAoZm9ybWF0X25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJfIik7Ci0gICAgICBuciArPSBwcmludF9jX25hbWUgKGZpbGUsIGZvcm1hdF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogdGhlIHN1ZmZpeCAqLwotICBuciArPSBwcmludF9vcGNvZGVfYml0cyAoZmlsZSwgZXhwYW5kZWRfYml0cyk7Ci0KLSAgcmV0dXJuIG5yOwotfQotCi0KLXZvaWQKLXByaW50X215X2RlZmluZXMgKGxmICpmaWxlLAotCQkgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotCQkgIGNvbnN0IGNoYXIgKmZvcm1hdF9uYW1lLAotCQkgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzKQotewotICAvKiAjZGVmaW5lIE1ZX0lOREVYIHh4eHh4ICovCi0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiBNWV9JTkRFWFxuIik7Ci0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgTVlfSU5ERVggIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBiYXNlbmFtZSwgZm9ybWF0X25hbWUsIE5VTEwsCi0JCSAgICAgICBOVUxMLAotCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaXRhYmxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgLyogI2RlZmluZSBNWV9QUkVGSVggeHh4eHh4ICovCi0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiAiKTsKLSAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJICAgICAgIGJhc2VuYW1lLCBmb3JtYXRfbmFtZSwgTlVMTCwKLQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9ub25lKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI3VuZGVmIE1ZX1BSRUZJWFxuIik7Ci0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgTVlfUFJFRklYICIpOwotICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkgICAgICAgYmFzZW5hbWUsIGZvcm1hdF9uYW1lLCBOVUxMLAotCQkgICAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X25vbmUpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAvKiAjZGVmaW5lIE1ZX05BTUUgeHh4eHh4ICovCi0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiBNWV9OQU1FXG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSBNWV9OQU1FIFwiIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICBiYXNlbmFtZSwgZm9ybWF0X25hbWUsIE5VTEwsCi0JCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfbm9uZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlwiXG4iKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1wcmludF9pdHJhY2VfcHJlZml4IChsZiAqZmlsZSkKLXsKLSAgY29uc3QgY2hhciAqcHJlZml4ID0gInRyYWNlX3ByZWZpeCAoIjsKLSAgaW50IGluZGVudCA9IHN0cmxlbiAocHJlZml4KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXNTRCwgQ1BVLCBjaWEsIENJQSwgVFJBQ0VfTElORU5VTV9QIChDUFUpLCBcXFxuIiwgcHJlZml4KTsKLSAgbGZfaW5kZW50IChmaWxlLCAraW5kZW50KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXNpdGFibGVbTVlfSU5ERVhdLmZpbGUsIFxcXG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICIlc2l0YWJsZVtNWV9JTkRFWF0ubGluZV9uciwgXFxcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlwiIik7Ci0gIHJldHVybiBpbmRlbnQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2l0cmFjZV9mb3JtYXQgKGxmICpmaWxlLAotCQkgICAgIGluc25fbW5lbW9uaWNfZW50cnkgKmFzc2VtYmxlcikKLXsKLSAgLyogcGFzcz0xIGlzIGZtdCBzdHJpbmc7IHBhc3M9MiBpcyBhcmd1bWVudHMgKi8KLSAgaW50IHBhc3M7Ci0gIC8qIHByaW50IHRoZSBmb3JtYXQgc3RyaW5nICovCi0gIGZvciAocGFzcyA9IDE7IHBhc3MgPD0gMjsgcGFzcysrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmNocCA9IGFzc2VtYmxlci0+Zm9ybWF0OwotICAgICAgY2hwKys7IC8qIHNraXAgdGhlIGxlYWRpbmcgcXVvdGUgKi8KLSAgICAgIC8qIHdyaXRlIG91dCB0aGUgZm9ybWF0L2FyZ3MgKi8KLSAgICAgIHdoaWxlICgqY2hwICE9ICdcMCcpCi0JewotCSAgaWYgKGNocFswXSA9PSAnXFwnICYmIChjaHBbMV0gPT0gJzwnIHx8IGNocFsxXSA9PSAnPicpKQotCSAgICB7Ci0JICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJbGZfcHV0Y2hyIChmaWxlLCBjaHBbMV0pOwotCSAgICAgIGNocCArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChjaHBbMF0gPT0gJzwnIHx8IGNocFswXSA9PSAnJScpCi0JICAgIHsKLQkgICAgICAvKiBwYXJzZSBbICIlIiAuLi4gXSAiPCIgWyBmdW5jICIjIiBdIHBhcmFtICI+IiAqLwotCSAgICAgIGNvbnN0IGNoYXIgKmZtdDsKLQkgICAgICBjb25zdCBjaGFyICpmdW5jOwotCSAgICAgIGludCBzdHJsZW5fZnVuYzsKLQkgICAgICBjb25zdCBjaGFyICpwYXJhbTsKLQkgICAgICBpbnQgc3RybGVuX3BhcmFtOwotCSAgICAgIC8qIHRoZSAiJSIgLi4uICI8IiBmb3JtYXQgKi8KLQkgICAgICBmbXQgPSBjaHA7Ci0JICAgICAgd2hpbGUgKGNocFswXSAhPSAnPCcgJiYgY2hwWzBdICE9ICdcMCcpCi0JCWNocCsrOwotCSAgICAgIGlmIChjaHBbMF0gIT0gJzwnKQotCQllcnJvciAoYXNzZW1ibGVyLT5saW5lLCAiTWlzc2luZyBgPCcgYWZ0ZXIgYCUlJ1xuIik7Ci0JICAgICAgY2hwKys7Ci0JICAgICAgLyogWyAiZnVuYyIgIyBdIE9SICJwYXJhbSIgKi8KLQkgICAgICBmdW5jID0gY2hwOwotCSAgICAgIHBhcmFtID0gY2hwOwotCSAgICAgIHdoaWxlIChjaHBbMF0gIT0gJz4nICYmIGNocFswXSAhPSAnIycgJiYgY2hwWzBdICE9ICdcMCcpCi0JCWNocCsrOwotCSAgICAgIHN0cmxlbl9mdW5jID0gY2hwIC0gZnVuYzsKLQkgICAgICBpZiAoY2hwWzBdID09ICcjJykKLQkJewotCQkgIGNocCsrOwotCQkgIHBhcmFtID0gY2hwOwotCQkgIHdoaWxlIChjaHBbMF0gIT0gJz4nICYmIGNocFswXSAhPSAnXDAnKQotCQkgICAgY2hwKys7Ci0JCX0KLQkgICAgICBzdHJsZW5fcGFyYW0gPSBjaHAgLSBwYXJhbTsKLQkgICAgICBpZiAoY2hwWzBdICE9ICc+JykKLQkJZXJyb3IgKGFzc2VtYmxlci0+bGluZSwgIk1pc3NpbmcgY2xvc2luZyBgPicgaW4gYXNzZW1ibGVyIHN0cmluZ1xuIik7Ci0JICAgICAgY2hwKys7Ci0JICAgICAgLyogbm93IHByb2Nlc3MgaXQgKi8KLQkgICAgICBpZiAocGFzcyA9PSAyKQotCQlsZl9wcmludGYgKGZpbGUsICIsIFxcXG4iKTsKLQkgICAgICBpZiAoc3RybmNtcCAoZm10LCAiPCIsIDEpID09IDApCi0JCS8qIGltcGxpY2l0IGxvbmcgaW50IGZvcm1hdCAqLwotCQl7Ci0JCSAgaWYgKHBhc3MgPT0gMSkKLQkJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiUlbGQiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIihsb25nKSAiKTsKLQkJICAgICAgbGZfd3JpdGUgKGZpbGUsIHBhcmFtLCBzdHJsZW5fcGFyYW0pOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZm10LCAiJTwiLCAyKSA9PSAwKQotCQkvKiBleHBsaWNpdCBmb3JtYXQgKi8KLQkJewotCQkgIGlmIChwYXNzID09IDEpCi0JCSAgICBsZl9wcmludGYgKGZpbGUsICIlJSIpOwotCQkgIGVsc2UKLQkJICAgIGxmX3dyaXRlIChmaWxlLCBwYXJhbSwgc3RybGVuX3BhcmFtKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGZtdCwgIiVzPCIsIDMpID09IDApCi0JCS8qIHN0cmluZyBmb3JtYXQgKi8KLQkJewotCQkgIGlmIChwYXNzID09IDEpCi0JCSAgICBsZl9wcmludGYgKGZpbGUsICIlJXMiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzc3RyXyIsIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0JCSAgICAgIGxmX3dyaXRlIChmaWxlLCBmdW5jLCBzdHJsZW5fZnVuYyk7Ci0JCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAoU0RfLCAiKTsKLQkJICAgICAgbGZfd3JpdGUgKGZpbGUsIHBhcmFtLCBzdHJsZW5fcGFyYW0pOwotCQkgICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChmbXQsICIlbHg8IiwgNCkgPT0gMCkKLQkJLyogc2ltcGxlIGhleCAqLwotCQl7Ci0JCSAgaWYgKHBhc3MgPT0gMSkKLQkJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiUlbHgiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIih1bnNpZ25lZCBsb25nKSAiKTsKLQkJICAgICAgbGZfd3JpdGUgKGZpbGUsIHBhcmFtLCBzdHJsZW5fcGFyYW0pOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZm10LCAiJTA4bHg8IiwgNikgPT0gMCkKLQkJLyogc2ltcGxlIGhleCAqLwotCQl7Ci0JCSAgaWYgKHBhc3MgPT0gMSkKLQkJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiUlMDhseCIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKHVuc2lnbmVkIGxvbmcpICIpOwotCQkgICAgICBsZl93cml0ZSAoZmlsZSwgcGFyYW0sIHN0cmxlbl9wYXJhbSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWVycm9yIChhc3NlbWJsZXItPmxpbmUsICJVbmtub3duIGFzc2VtYmxlciBzdHJpbmcgZm9ybWF0XG4iKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJbGZfcHV0Y2hyIChmaWxlLCBjaHBbMF0pOwotCSAgICAgIGNocCArPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiKTtcbiIpOwotfQotCi0KLXZvaWQKLXByaW50X2l0cmFjZSAobGYgKmZpbGUsCi0JICAgICAgaW5zbl9lbnRyeSAqaW5zbiwKLQkgICAgICBpbnQgaWRlY29kZSkKLXsKLSAgLyogTkI6IEhlcmUgd2UgZXNjYXBlIGVhY2ggRU9MTi4gVGhpcyBpcyBzbyB0aGF0IHRoZSB0aGUgY29tcGlsZXIKLSAgICAgdHJlYXRzIGEgdHJhY2UgZnVuY3Rpb24gY2FsbCBhcyBhIHNpbmdsZSBsaW5lLiAgQ29uc2VxdWVudGx5IGFueQotICAgICBlcnJvcnMgaW4gdGhlIGxpbmUgYXJlIHJlZmVyZWQgYmFjayB0byB0aGUgc2FtZSBpZ2VuIGFzc2VtYmxlcgotICAgICBzb3VyY2UgbGluZSAqLwotICBjb25zdCBjaGFyICpwaGFzZSA9IChpZGVjb2RlKSA/ICJERUNPREUiIDogIklOU04iOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOwotICBsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZCAoV0lUSF9UUkFDRSlcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIvKiBnZW5lcmF0ZSBhIHRyYWNlIHByZWZpeCBpZiBhbnkgdHJhY2luZyBlbmFibGVkICovXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiaWYgKFRSQUNFX0FOWV9QIChDUFUpKVxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAge1xuIik7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzQpOwotICB7Ci0gICAgaWYgKGluc24tPm1uZW1vbmljcyAhPSBOVUxMKQotICAgICAgewotCWluc25fbW5lbW9uaWNfZW50cnkgKmFzc2VtYmxlciA9IGluc24tPm1uZW1vbmljczsKLQlpbnQgaXNfZmlyc3QgPSAxOwotCWRvCi0JICB7Ci0JICAgIGlmIChhc3NlbWJsZXItPmNvbmRpdGlvbiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaW50IGluZGVudDsKLQkJbGZfcHJpbnRmIChmaWxlLCAiJXNpZiAoJXMpXG4iLAotCQkJICAgaXNfZmlyc3QgPyAiIiA6ICJlbHNlICIsCi0JCQkgICBhc3NlbWJsZXItPmNvbmRpdGlvbik7Ci0JCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCQlsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGFzc2VtYmxlci0+bGluZSk7Ci0JCWluZGVudCA9IHByaW50X2l0cmFjZV9wcmVmaXggKGZpbGUpOwotCQlwcmludF9pdHJhY2VfZm9ybWF0IChmaWxlLCBhc3NlbWJsZXIpOwotCQlsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKLQkJbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKLQkJbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JCWlmIChhc3NlbWJsZXItPm5leHQgPT0gTlVMTCkKLQkJICBlcnJvciAoYXNzZW1ibGVyLT5saW5lLCAiTWlzc2luZyBmaW5hbCB1bmNvbmRpdGlvbmFsIGFzc2VtYmxlclxuIik7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgaW5kZW50OwotCQlpZiAoIWlzX2ZpcnN0KQotCQkgIHsKLQkJICAgIGxmX3ByaW50ZiAoZmlsZSwgImVsc2VcbiIpOwotCQkgICAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0JCSAgfQotCQlsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGFzc2VtYmxlci0+bGluZSk7Ci0JCWluZGVudCA9IHByaW50X2l0cmFjZV9wcmVmaXggKGZpbGUpOwotCQlwcmludF9pdHJhY2VfZm9ybWF0IChmaWxlLCBhc3NlbWJsZXIpOwotCQlsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKLQkJbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKLQkJaWYgKCFpc19maXJzdCkKLQkJICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLQkJaWYgKGFzc2VtYmxlci0+bmV4dCAhPSBOVUxMKQotCQkgIGVycm9yIChhc3NlbWJsZXItPmxpbmUsICJVbmNvbmRpdGlvbmFsIGFzc2VtYmxlciBpcyBub3QgbGFzdFxuIik7Ci0JICAgICAgfQotCSAgICBpc19maXJzdCA9IDA7Ci0JICAgIGFzc2VtYmxlciA9IGFzc2VtYmxlci0+bmV4dDsKLQkgIH0KLQl3aGlsZSAoYXNzZW1ibGVyICE9IE5VTEwpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpbnQgaW5kZW50OwotCWxmX2luZGVudCAoZmlsZSwgKzIpOwotCWxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgaW5zbi0+bGluZSk7Ci0JaW5kZW50ID0gcHJpbnRfaXRyYWNlX3ByZWZpeCAoZmlsZSk7Ci0JbGZfcHJpbnRmIChmaWxlLCAiJSVzXCIsIFxcXG4iKTsKLQlsZl9wcmludGYgKGZpbGUsICJpdGFibGVbTVlfSU5ERVhdLm5hbWUpO1xuIik7Ci0JbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7Ci0JbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKLQlsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgICAgIH0KLSAgICBsZl9wcmludGYgKGZpbGUsICIvKiB0cmFjZSB0aGUgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uIGlmIGVuYWJsZWQgKi9cbiIpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChUUkFDRV8lc19QIChDUFUpKVxuIiwgcGhhc2UpOwotICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgdHJhY2VfZ2VuZXJpYyAoU0QsIENQVSwgVFJBQ0VfJXNfSURYLCBcIiAlJXNcIiwgaXRhYmxlW01ZX0lOREVYXS5uYW1lKTtcbiIsIHBoYXNlKTsKLSAgfQotICBsZl9pbmRlbnQgKGZpbGUsIC00KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2VuZGlmXG4iKTsKLX0KLQotCi12b2lkCi1wcmludF9zaW1fZW5naW5lX2Fib3J0IChsZiAqZmlsZSwKLQkJCWNvbnN0IGNoYXIgKm1lc3NhZ2UpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgInNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlwiJXNcIiIsIG1lc3NhZ2UpOwotICBsZl9wcmludGYgKGZpbGUsICIpO1xuIik7Ci19Ci0KLQotdm9pZAotcHJpbnRfaW5jbHVkZSAobGYgKmZpbGUsCi0JICAgICAgIGlnZW5fbW9kdWxlIG1vZHVsZSkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCIlcyVzLmhcIlxuIiwgbW9kdWxlLnByZWZpeC5sLCBtb2R1bGUuc3VmZml4LmwpOwotfQotCi12b2lkCi1wcmludF9pbmNsdWRlX2lubGluZSAobGYgKmZpbGUsCi0JCSAgICAgIGlnZW5fbW9kdWxlIG1vZHVsZSkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoJXNfSU5MSU5FKVxuIiwgbW9kdWxlLnN1ZmZpeC51KTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCIlcyVzLmNcIlxuIiwgbW9kdWxlLnByZWZpeC5sLCBtb2R1bGUuc3VmZml4LmwpOwotICBsZl9wcmludGYgKGZpbGUsICIjZWxzZVxuIik7Ci0gIHByaW50X2luY2x1ZGUgKGZpbGUsIG1vZHVsZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci19Ci0KLXZvaWQKLXByaW50X2luY2x1ZGVzIChsZiAqZmlsZSkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJzaW0taW5saW5lLmNcIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIHByaW50X2luY2x1ZGVfaW5saW5lIChmaWxlLCBvcHRpb25zLm1vZHVsZS5pdGFibGUpOwotICBwcmludF9pbmNsdWRlX2lubGluZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuaWRlY29kZSk7Ci0gIHByaW50X2luY2x1ZGVfaW5saW5lIChmaWxlLCBvcHRpb25zLm1vZHVsZS5zdXBwb3J0KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotZ2VuX3NlbWFudGljc19oIChsZiAqZmlsZSwKLQkJIGluc25fbGlzdCAqc2VtYW50aWNzLAotCQkgaW50IG1heF9ucl93b3JkcykKLXsKLSAgaW50IHdvcmRfbnI7Ci0gIGluc25fbGlzdCAqc2VtYW50aWM7Ci0gIGZvciAod29yZF9uciA9IC0xOyB3b3JkX25yIDw9IG1heF9ucl93b3Jkczsgd29yZF9ucisrKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgIik7Ci0gICAgICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlIChmaWxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAlc2lkZWNvZGVfc2VtYW50aWMiLAotCQkgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKLSAgICAgIGlmICh3b3JkX25yID49IDApCi0JbGZfcHJpbnRmIChmaWxlLCAiXyVkIiwgd29yZF9ucik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbigiKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fZm9ybWFsIChmaWxlLCB3b3JkX25yKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKTtcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIHN3aXRjaCAob3B0aW9ucy5nZW4uY29kZSkKLSAgICB7Ci0gICAgY2FzZSBnZW5lcmF0ZV9jYWxsczoKLSAgICAgIGZvciAoc2VtYW50aWMgPSBzZW1hbnRpY3M7IHNlbWFudGljICE9IE5VTEw7IHNlbWFudGljID0gc2VtYW50aWMtPm5leHQpCi0JewotCSAgLyogSWdub3JlIGFueSBzcGVjaWFsL2ludGVybmFsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKHNlbWFudGljLT5pbnNuLT5ucl93b3JkcyA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIHByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uIChmaWxlLAotCQkJCSAgICAgIHNlbWFudGljLT5pbnNuLAotCQkJCSAgICAgIHNlbWFudGljLT5leHBhbmRlZF9iaXRzLAotCQkJCSAgICAgIHNlbWFudGljLT5vcGNvZGVzLAotCQkJCSAgICAgIHNlbWFudGljLT5ucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGdlbmVyYXRlX2p1bXBzOgotICAgICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgImdlbmVyYXRpbmcganVtcHMiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZ2VuX3NlbWFudGljc19jIChsZiAqZmlsZSwKLQkJIGluc25fbGlzdCAqc2VtYW50aWNzLAotCQkgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9jYWxscykKLSAgICB7Ci0gICAgICBpbnNuX2xpc3QgKnNlbWFudGljOwotICAgICAgcHJpbnRfaW5jbHVkZXMgKGZpbGUpOwotICAgICAgcHJpbnRfaW5jbHVkZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgICAgIGZvciAoc2VtYW50aWMgPSBzZW1hbnRpY3M7IHNlbWFudGljICE9IE5VTEw7IHNlbWFudGljID0gc2VtYW50aWMtPm5leHQpCi0JewotCSAgLyogSWdub3JlIGFueSBzcGVjaWFsL2ludGVybmFsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKHNlbWFudGljLT5pbnNuLT5ucl93b3JkcyA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIHByaW50X3NlbWFudGljX2RlZmluaXRpb24gKGZpbGUsCi0JCQkJICAgICBzZW1hbnRpYy0+aW5zbiwKLQkJCQkgICAgIHNlbWFudGljLT5leHBhbmRlZF9iaXRzLAotCQkJCSAgICAgc2VtYW50aWMtPm9wY29kZXMsCi0JCQkJICAgICBjYWNoZV9ydWxlcywKLQkJCQkgICAgIHNlbWFudGljLT5ucl9wcmVmZXRjaGVkX3dvcmRzKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgImdlbmVyYXRpbmcganVtcCBlbmdpbmUiKTsKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIHZvaWQKLWdlbl9pY2FjaGVfaCAobGYgKmZpbGUsCi0JICAgICAgaW5zbl9saXN0ICpzZW1hbnRpYywKLQkgICAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zLAotCSAgICAgIGludCBtYXhfbnJfd29yZHMpCi17Ci0gIGludCB3b3JkX25yOwotICBmb3IgKHdvcmRfbnIgPSAwOyB3b3JkX25yIDw9IG1heF9ucl93b3Jkczsgd29yZF9ucisrKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgIik7Ci0gICAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25fdHlwZShmaWxlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAlc2lkZWNvZGVfaWNhY2hlXyVkXG4oIiwKLQkJIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCwKLQkJIHdvcmRfbnIpOwotICAgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2Zvcm1hbChmaWxlLCB3b3JkX25yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgfQotICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9jYWxscwotICAgICAgJiYgb3B0aW9ucy5nZW4uaWNhY2hlKQotICAgIHsKLSAgICAgIGZ1bmN0aW9uX2VudHJ5X3RyYXZlcnNlIChmaWxlLCBmdW5jdGlvbnMsCi0JCQkgICAgICAgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlY2xhcmF0aW9uLAotCQkJICAgICAgIE5VTEwpOwotICAgICAgd2hpbGUgKHNlbWFudGljICE9IE5VTEwpCi0JewotCSAgcHJpbnRfaWNhY2hlX2RlY2xhcmF0aW9uIChmaWxlLAotCQkJCSAgICBzZW1hbnRpYy0+aW5zbiwKLQkJCQkgICAgc2VtYW50aWMtPmV4cGFuZGVkX2JpdHMsCi0JCQkJICAgIHNlbWFudGljLT5vcGNvZGVzLAotCQkJCSAgICBzZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0JICBzZW1hbnRpYyA9IHNlbWFudGljLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5IChmaWxlLCAiZ2VuZXJhdGluZyBqdW1wIGVuZ2luZSIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWdlbl9pY2FjaGVfYyAobGYgKmZpbGUsCi0JICAgICAgaW5zbl9saXN0ICpzZW1hbnRpYywKLQkgICAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zLAotCSAgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKLXsKLSAgLyogb3V0cHV0IGBpbnRlcm5hbCcgaW52YWxpZC9mbG9hdGluZy1wb2ludCB1bmF2YWlsYWJsZSBmdW5jdGlvbnMKLSAgICAgd2hlcmUgbmVlZGVkICovCi0gIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2NhbGxzCi0gICAgICAmJiBvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwiY3B1LmhcIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGUuaFwiXG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwic2VtYW50aWNzLmhcIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImljYWNoZS5oXCJcbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJzdXBwb3J0LmhcIlxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgZnVuY3Rpb25fZW50cnlfdHJhdmVyc2UgKGZpbGUsIGZ1bmN0aW9ucywKLQkJCSAgICAgICBwcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVmaW5pdGlvbiwKLQkJCSAgICAgICBOVUxMKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICB3aGlsZSAoc2VtYW50aWMgIT0gTlVMTCkKLQl7Ci0JICBwcmludF9pY2FjaGVfZGVmaW5pdGlvbiAoZmlsZSwKLQkJCQkgICBzZW1hbnRpYy0+aW5zbiwKLQkJCQkgICBzZW1hbnRpYy0+ZXhwYW5kZWRfYml0cywKLQkJCQkgICBzZW1hbnRpYy0+b3Bjb2RlcywKLQkJCQkgICBjYWNoZV9ydWxlcywKLQkJCQkgICBzZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7Ci0JICBzZW1hbnRpYyA9IHNlbWFudGljLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5IChmaWxlLCAiZ2VuZXJhdGluZyBqdW1wIGVuZ2luZSIpOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotZ2VuX2lkZWNvZGVfaCAobGYgKmZpbGUsCi0JICAgICAgIGdlbl90YWJsZSAqZ2VuLAotCSAgICAgICBpbnNuX3RhYmxlICppbnNucywKLQkgICAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmIHVuc2lnbmVkJWQgJXNpbnN0cnVjdGlvbl93b3JkO1xuIiwKLQkgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSwgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKLSAgaWYgKG9wdGlvbnMuZ2VuLmRlbGF5ZWRfYnJhbmNoKQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgc3RydWN0IF8lc2luc3RydWN0aW9uX2FkZHJlc3Mge1xuIiwKLQkJIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIGFkZHJlc3Nfd29yZCBpcDsgLyogaW5zdHJ1Y3Rpb24gcG9pbnRlciAqL1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIGFkZHJlc3Nfd29yZCBkcDsgLyogZGVsYXllZC1zbG90IHBvaW50ZXIgKi9cbiIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAifSAlc2luc3RydWN0aW9uX2FkZHJlc3M7XG4iLCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgYWRkcmVzc193b3JkICVzaW5zdHJ1Y3Rpb25fYWRkcmVzcztcbiIsCi0JCSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOwotICAgICAgCi0gICAgfQotICBpZiAob3B0aW9ucy5nZW4ubmlhID09IG5pYV9pc19pbnZhbGlkCi0gICAgICAmJiBzdHJsZW4gKG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgudSkgPiAwKQotICAgIHsKLSAgICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lICVzSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTICIsCi0JCSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LnUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTXG4iKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIHByaW50X2ljYWNoZV9zdHJ1Y3QgKGZpbGUsIGluc25zLCBjYWNoZV9ydWxlcyk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCi0gICAgewotICAgICAgRVJST1IgKCJGSVhNRSAtIGlkZWNvZGUgd2l0aCBpY2FjaGUgc3VmZmVyaW5nIGZyb20gYml0LXJvdCIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdlbl9saXN0ICplbnRyeTsKLSAgICAgIGZvciAoZW50cnkgPSBnZW4tPnRhYmxlczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQl7Ci0JICBwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkJICAgICAgIChvcHRpb25zLmdlbi5tdWx0aV9zaW0KLQkJCQkJCT8gZW50cnktPm1vZGVsLT5uYW1lCi0JCQkJCQk6IE5VTEwpLAotCQkJCQkgICAgICAgaXNfZnVuY3Rpb25fZGVjbGFyYXRpb24sCi0JCQkJCSAgICAgICAxLypBTFdBWVMgT05FIFdPUkQqLyk7Ci0JfQotICAgICAgaWYgKG9wdGlvbnMuZ2VuLm11bHRpX3NpbSkKLQl7Ci0JICBwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkJICAgICAgIE5VTEwsCi0JCQkJCSAgICAgICBpc19mdW5jdGlvbl92YXJpYWJsZSwKLQkJCQkJICAgICAgIDEvKkFMV0FZUyBPTkUgV09SRCovKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1nZW5faWRlY29kZV9jIChsZiAqZmlsZSwKLQkgICAgICAgZ2VuX3RhYmxlICpnZW4sCi0JICAgICAgIGluc25fdGFibGUgKmlzYSwKLQkgICAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQotewotICAvKiB0aGUgaW50cm8gKi8KLSAgcHJpbnRfaW5jbHVkZXMgKGZpbGUpOwotICBwcmludF9pbmNsdWRlX2lubGluZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBwcmludF9pZGVjb2RlX2dsb2JhbHMgKGZpbGUpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotICAKLSAgc3dpdGNoIChvcHRpb25zLmdlbi5jb2RlKQotICAgIHsKLSAgICBjYXNlIGdlbmVyYXRlX2NhbGxzOgotICAgICAgewotCWdlbl9saXN0ICplbnRyeTsKLQlmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JICB7Ci0JICAgIHByaW50X2lkZWNvZGVfbG9va3VwcyAoZmlsZSwgZW50cnktPnRhYmxlLCBjYWNoZV9ydWxlcyk7Ci0JCi0JICAgIC8qIG91dHB1dCB0aGUgbWFpbiBpZGVjb2RlIHJvdXRpbmUgKi8KLQkgICAgaWYgKCFvcHRpb25zLmdlbi5pY2FjaGUpCi0JICAgICAgewotCQlwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKLQkJCQkJCSAgICAgKG9wdGlvbnMuZ2VuLm11bHRpX3NpbQotCQkJCQkJICAgICAgPyBlbnRyeS0+bW9kZWwtPm5hbWUKLQkJCQkJCSAgICAgIDogTlVMTCksCi0JCQkJCQkgICAgIDEvKmlzIGRlZmluaXRpb24qLywKLQkJCQkJCSAgICAgMS8qQUxXQVlTIE9ORSBXT1JEKi8pOwotCQlsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLQkJbGZfaW5kZW50IChmaWxlLCArMik7Ci0JCWxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBuaWE7XG4iLAotCQkJICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKLQkJcHJpbnRfaWRlY29kZV9ib2R5IChmaWxlLCBlbnRyeS0+dGFibGUsICJuaWEgPSIpOwotCQlsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gbmlhOyIpOwotCQlsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLQkJbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci0JICAgICAgfQotCSAgfQotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgZ2VuZXJhdGVfanVtcHM6Ci0gICAgICB7Ci0JbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgImdlbmVyYXRpbmcgYSBqdW1wIGVuZ2luZSIpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotZ2VuX3J1bl9jIChsZiAqZmlsZSwKLQkgICBnZW5fdGFibGUgKmdlbikKLXsKLSAgZ2VuX2xpc3QgKmVudHJ5OwotICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcInNpbS1tYWluLmhcIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwiZW5naW5lLmhcIlxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwiaWRlY29kZS5oXCJcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImJmZC5oXCJcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGlmIChvcHRpb25zLmdlbi5tdWx0aV9zaW0pCi0gICAgewotICAgICAgcHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsIE5VTEwsIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlLCAxKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwgTlVMTCwgaXNfZnVuY3Rpb25fdmFyaWFibGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIAotICBsZl9wcmludGYgKGZpbGUsICJ2b2lkXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAic2ltX2VuZ2luZV9ydW4gKFNJTV9ERVNDIHNkLFxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgICAgICAgICBpbnQgbmV4dF9jcHVfbnIsXG4iKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgICAgIGludCBucl9jcHVzLFxuIik7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgICAgICAgICBpbnQgc2lnZ25hbClcbiIpOwotICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50IChmaWxlLCArMik7Ci0gIGlmIChvcHRpb25zLmdlbi5tdWx0aV9zaW0pCi0gICAgewotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiaW50IG1hY2g7XG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSA9PSBOVUxMKVxuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIgIG1hY2ggPSAwO1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJlbHNlXG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgbWFjaCA9IFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoO1xuIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJzd2l0Y2ggKG1hY2gpXG4iKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAge1xuIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLSAgICAgIGZvciAoZW50cnkgPSBnZW4tPnRhYmxlczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQl7Ci0JICBpZiAob3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCAhPSBOVUxMCi0JICAgICAgJiYgKHN0cmNtcCAoZW50cnktPm1vZGVsLT5uYW1lLCBvcHRpb25zLmdlbi5kZWZhdWx0X21vZGVsKSA9PSAwCi0JCSAgfHwgc3RyY21wIChlbnRyeS0+bW9kZWwtPmZ1bGxfbmFtZSwgb3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCkgPT0gMCkpCi0JICAgIGxmX3ByaW50ZiAoZmlsZSwgImRlZmF1bHQ6XG4iKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgImNhc2UgYmZkX21hY2hfJXM6XG4iLCBlbnRyeS0+bW9kZWwtPmZ1bGxfbmFtZSk7Ci0JICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCQkgICAgICAgImlzc3VlIiwKLQkJCSAgICAgICBOVUxMLCAvKiBmb3JtYXQgbmFtZSAqLwotCQkJICAgICAgIE5VTEwsIC8qIE5PIHByb2Nlc3NvciAqLwotCQkJICAgICAgIE5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KLQkJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiA9ICIpOwotCSAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgICAgICAiaXNzdWUiLAotCQkJICAgICAgIE5VTEwsIC8qIGZvcm1hdCBuYW1lICovCi0JCQkgICAgICAgZW50cnktPm1vZGVsLT5uYW1lLAotCQkJICAgICAgIE5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KLQkJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOwotCSAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKLQkJCSAgICAgICAicnVuIiwKLQkJCSAgICAgICBOVUxMLCAvKiBmb3JtYXQgbmFtZSAqLwotCQkJICAgICAgIE5VTEwsIC8qIE5PIHByb2Nlc3NvciAqLwotCQkJICAgICAgIE5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KLQkJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9lbmdpbmUpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiID0gIik7Ci0JICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAotCQkJICAgICAgICJydW4iLAotCQkJICAgICAgIE5VTEwsIC8qIGZvcm1hdCBuYW1lICovCi0JCQkgICAgICAgZW50cnktPm1vZGVsLT5uYW1lLAotCQkJICAgICAgIE5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KLQkJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9lbmdpbmUpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7Ci0JICBsZl9wcmludGYgKGZpbGUsICJicmVhaztcbiIpOwotCSAgbGZfaW5kZW50IChmaWxlLCAtMik7Ci0JfQotICAgICAgaWYgKG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwgPT0gTlVMTCkKLQl7Ci0JICBsZl9wcmludGYgKGZpbGUsICJkZWZhdWx0OlxuIik7Ci0JICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgInNpbV9lbmdpbmVfYWJvcnQgKHNkLCBOVUxMLCBOVUxMX0NJQSxcbiIpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgICAgICAgXCJzaW1fZW5naW5lX3J1biAtIHVua25vd24gbWFjaGluZVwiKTtcbiIpOwotCSAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKLQkgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotCX0KLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKLSAgICB9Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCi0JCSAgICAgICAicnVuIiwKLQkJICAgICAgIE5VTEwsIC8qIGZvcm1hdCBuYW1lICovCi0JCSAgICAgICBOVUxMLCAvKiBOTyBwcm9jZXNzb3IgKi8KLQkJICAgICAgIE5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KLQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2VuZ2luZSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiAoc2QsIG5leHRfY3B1X25yLCBucl9jcHVzLCBzaWdnbmFsKTtcbiIpOwotICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgZ2VuX3RhYmxlICoKLWRvX2dlbiAoaW5zbl90YWJsZSAqaXNhLAotCWRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzKQotewotICBnZW5fdGFibGUgKmdlbjsKLSAgaWYgKGRlY29kZV9ydWxlcyA9PSBOVUxMKQotICAgIGVycm9yIChOVUxMLCAiTXVzdCBzcGVjaWZ5IGEgZGVjb2RlIHRhYmxlXG4iKTsKLSAgaWYgKGlzYSA9PSBOVUxMKQotICAgIGVycm9yIChOVUxMLCAiTXVzdCBzcGVjaWZ5IGFuIGluc3RydWN0aW9uIHRhYmxlXG4iKTsKLSAgaWYgKGRlY29kZV90YWJsZV9tYXhfd29yZF9uciAoZGVjb2RlX3J1bGVzKSA+IDApCi0gICAgb3B0aW9ucy5nZW4ubXVsdGlfd29yZCA9IGRlY29kZV90YWJsZV9tYXhfd29yZF9uciAoZGVjb2RlX3J1bGVzKTsKLSAgZ2VuID0gbWFrZV9nZW5fdGFibGVzIChpc2EsIGRlY29kZV9ydWxlcyk7Ci0gIGdlbl90YWJsZXNfZXhwYW5kX2luc25zIChnZW4pOwotICBnZW5fdGFibGVzX2V4cGFuZF9zZW1hbnRpY3MgKGdlbik7Ci0gIHJldHVybiBnZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pZ2VuX29wdGlvbnMgb3B0aW9uczsKLQotaW50Ci1tYWluIChpbnQgYXJnYywKLSAgICAgIGNoYXIgKiphcmd2LAotICAgICAgY2hhciAqKmVudnApCi17Ci0gIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcyA9IE5VTEw7Ci0gIGxmX2ZpbGVfcmVmZXJlbmNlcyBmaWxlX3JlZmVyZW5jZXMgPSBsZl9pbmNsdWRlX3JlZmVyZW5jZXM7Ci0gIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzID0gTlVMTDsKLSAgaW5zbl90YWJsZSAqaXNhID0gTlVMTDsKLSAgZ2VuX3RhYmxlICpnZW4gPSBOVUxMOwotICBjaGFyICpyZWFsX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gIGludCBpc19oZWFkZXIgPSAwOwotICBpbnQgY2g7Ci0gIGxmICpzdGFuZGFyZF9vdXQgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJpZ2VuIik7Ci0KLSAgSU5JVF9PUFRJT05TICgpOwotCi0gIGlmIChhcmdjID09IDEpCi0gICAgewotICAgICAgcHJpbnRmICgiVXNhZ2U6XG4iKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCIgIGlnZW4gPGNvbmZpZy1vcHRzPiAuLi4gPGlucHV0LW9wdHM+Li4uIDxvdXRwdXQtb3B0cz4uLi5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIkNvbmZpZyBvcHRpb25zOlxuIik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiICAtQiA8Yml0LXNpemU+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IFNldCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW5zdHJ1Y3Rpb24gKGRlcHJlY2lhdGVkKS5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgVGhpcyBvcHRpb24gY2FuIG5vdyBiZSBzZXQgZGlyZWN0bHkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlLlxuIik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiICAtRCA8ZGF0YS1zdHJ1Y3R1cmU+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IER1bXAgdGhlIHNwZWNpZmllZCBkYXRhIHN0cnVjdHVyZSB0byBzdGRvdXQuIFZhbGlkIHN0cnVjdHVyZXMgaW5jbHVkZTpcbiIpOwotICAgICAgcHJpbnRmICgiXHQgcHJvY2Vzc29yLW5hbWVzIC0gbGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBwcm9jZXNzb3JzIChtb2RlbHMpXG4iKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCIgIC1GIDxmaWx0ZXItbGlzdD5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgRmlsdGVyIG91dCBhbnkgaW5zdHJ1Y3Rpb25zIHdpdGggYSBub24tZW1wdHkgZmxhZ3MgZmllbGQgdGhhdCBjb250YWluc1xuIik7Ci0gICAgICBwcmludGYgKCJcdCBhIGZsYWcgbm90IGxpc3RlZCBpbiB0aGUgPGZpbHRlci1saXN0Pi5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLUggPGhpZ2gtYml0PlxuIik7Ci0gICAgICBwcmludGYgKCJcdCBTZXQgdGhlIG51bWJlciBvZiB0aGUgaGlnaCAobW9zdCBzaWduaWZpY2FudCkgaW5zdHJ1Y3Rpb24gYml0IChkZXByZWNpYXRlZCkuXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IFRoaXMgb3B0aW9uIGNhbiBub3cgYmUgc2V0IGRpcmVjdGx5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLUkgPGRpcmVjdG9yeT5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgQWRkIDxkaXJlY3Rvcnk+IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlYXJjaGVkIHdoZW4gb3BlbmluZyBhIGZpbGVcbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLU0gPG1vZGVsLWxpc3Q+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IEZpbHRlciBvdXQgYW55IGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBvZiB0aGUgbGlzdGVkXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IG1vZGVscyAoQW4gaW5zdHJ1Y3Rpb25zIHdpdGggbm8gbW9kZWwgaW5mb3JtYXRpb24gaXMgY29uc2lkZXJlZCB0byBzdXBwb3J0XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGFsbCBtb2RlbHMuKS5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLU4gPG5yLWNwdXM+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IEdlbmVyYXRlIGEgc2ltdWxhdG9yIHN1cHBvcnRpbmcgPG5yLWNwdXM+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IFNwZWNpZnkgYC1OIDAnIHRvIGRpc2FibGUgZ2VuZXJhdGlvbiBvZiB0aGUgU01QLiBTcGVjaWZ5aW5nIGAtTiAxJyB3aWxsXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IHN0aWxsIGdlbmVyYXRlIGFuIFNNUCBlbmFibGVkIHNpbXVsYXRvciBidXQgd2lsbCBvbmx5IHN1cHBvcnQgb25lIENQVS5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVQgPG1lY2hhbmlzbT5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgT3ZlcnJpZGUgdGhlIGRlY29kZSBtZWNoYW5pc20gc3BlY2lmaWVkIGJ5IHRoZSBkZWNvZGUgcnVsZXNcbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVAgPHByZWZpeD5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgUHJlcGVuZCBnbG9iYWwgbmFtZXMgKGV4Y2VwdCBpdGFibGUpIHdpdGggdGhlIHN0cmluZyA8cHJlZml4Pi5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgU3BlY2lmeSAtUCA8bW9kdWxlPj08cHJlZml4PiB0byBzZXQgYSBzcGVjaWZpYyA8bW9kdWxlPidzIHByZWZpeC5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVMgPHN1ZmZpeD5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgUmVwbGFjZSBhIGdsb2JhbCBuYW1lIChzdWZmaXgpIChleGNlcHQgaXRhYmxlKSB3aXRoIHRoZSBzdHJpbmcgPHN1ZmZpeD4uXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IFNwZWNpZnkgLVMgPG1vZHVsZT49PHN1ZmZpeD4gdG8gY2hhbmdlIGEgc3BlY2lmaWMgPG1vZHVsZT4ncyBuYW1lIChzdWZmaXgpLlxuIik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiICAtV2Vycm9yXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IE1ha2Ugd2FybmluZ3MgZXJyb3JzXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVdub2Rpc2NhcmRcbiIpOwotICAgICAgcHJpbnRmICgiXHQgU3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgZGlzY2FyZGVkIGZ1bmN0aW9ucyBhbmQgaW5zdHJ1Y3Rpb25zXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVdub3dpZHRoXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGluc3RydWN0aW9ucyB3aXRoIGludmFsaWQgd2lkdGhzXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLVdub3VuaW1wbGVtZW50ZWRcbiIpOwotICAgICAgcHJpbnRmICgiXHQgU3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgdW5pbXBsZW1lbnRlZCBpbnN0cnVjdGlvbnNcbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLUcgWyFdPGdlbi1vcHRpb24+XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IEFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4iKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCJcdCBkZWNvZGUtZHVwbGljYXRlICAgICAgIC0gT3ZlcnJpZGUgdGhlIGRlY29kZSBydWxlcywgZm9yY2luZyB0aGUgZHVwbGljYXRpb24gb2ZcbiIpOwotICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljIGZ1bmN0aW9uc1xuIik7Ci0gICAgICBwcmludGYgKCJcdCBkZWNvZGUtY29tYmluZSAgICAgICAgIC0gQ29tYmluZSBhbnkgZHVwbGljYXRlZCBlbnRyaWVzIHdpdGhpbiBhIHRhYmxlXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGRlY29kZS16ZXJvLXJlc2VydmVkICAgLSBPdmVycmlkZSB0aGUgZGVjb2RlIHJ1bGVzLCBmb3JjaW5nIHJlc2VydmVkIGJpdHMgdG8gYmVcbiIpOwotICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWF0ZWQgYXMgemVyby5cbiIpOwotICAgICAgcHJpbnRmICgiXHQgZGVjb2RlLXN3aXRjaC1pcy1nb3RvICAtIE92ZXJmaWRlIHRoZSBwYWRkZWQtc3dpdGNoIGNvZGUgdHlwZSBhcyBhIGdvdG8tc3dpdGNoXG4iKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCJcdCBnZW4tY29uZGl0aW9uYWwtaXNzdWUgIC0gY29uZGl0aW9uYWxseSBpc3N1ZSBlYWNoIGluc3RydWN0aW9uXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1kZWxheWVkLWJyYW5jaCAgICAgLSBuZWVkIGJvdGggY2lhIGFuZCBuaWEgcGFzc2VkIGFyb3VuZFxuIik7Ci0gICAgICBwcmludGYgKCJcdCBnZW4tZGlyZWN0LWFjY2VzcyAgICAgIC0gdXNlICNkZWZpbmVzIHRvIGRpcmVjdGx5IGFjY2VzcyB2YWx1ZXNcbiIpOwotICAgICAgcHJpbnRmICgiXHQgZ2VuLXplcm8tcjxOPiAgICAgICAgICAtIGFyY2ggYXNzdW1lcyBHUFIoPE4+KSA9PSAwLCBrZWVwIGl0IHRoYXQgd2F5XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1pY2FjaGVbPTxOPiAgICAgICAgLSBnZW5lcmF0ZSBhbiBpbnN0cnVjdGlvbiBjcmFja2luZyBjYWNoZSBvZiBzaXplIDxOPlxuIik7Ci0gICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzaXplIGlzICVkXG4iLCBvcHRpb25zLmdlbi5pY2FjaGVfc2l6ZSk7Ci0gICAgICBwcmludGYgKCJcdCBnZW4taW5zbi1pbi1pY2FjaGUgICAgIC0gc2F2ZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiB3aGVuIGNyYWNraW5nXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1tdWx0aS1zaW1bPU1PREVMXSAgLSBnZW5lcmF0ZSBtdWx0aXBsZSBzaW11bGF0b3JzIC0gb25lIHBlciBtb2RlbFxuIik7Ci0gICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3BlY2lmaWVkIE1PREVMIGlzIG1hZGUgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlLlxuIik7Ci0gICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgYSBzaW5nbGUgc2ltdWxhdG9yIHRoYXQgd2lsbFxuIik7Ci0gICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSBhbnkgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1tdWx0aS13b3JkICAgICAgICAgLSBnZW5lcmF0ZSBjb2RlIGFsbG93aW5nIGZvciBtdWx0aS13b3JkIGluc25zXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1zZW1hbnRpYy1pY2FjaGUgICAgLSBpbmNsdWRlIHNlbWFudGljIGNvZGUgaW4gY3JhY2tpbmcgZnVuY3Rpb25zXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1zbG90LXZlcmlmaWNhdGlvbiAgLSBwZXJmb3JtIHNsb3QgdmVyaWZpY2F0aW9uIGFzIHBhcnQgb2YgZGVjb2RlXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGdlbi1uaWEtaW52YWxpZCAgICAgICAgLSBOSUEgZGVmYXVsdHMgdG8gbmlhX2ludmFsaWRcbiIpOwotICAgICAgcHJpbnRmICgiXHQgZ2VuLW5pYS12b2lkICAgICAgICAgICAtIGRvIG5vdCBjb21wdXRlL3JldHVybiBOSUFcbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IHRyYWNlLWNvbWJpbmUgICAgICAgICAgLSByZXBvcnQgY29tYmluZWQgZW50cmllcyBhIHJ1bGUgYXBwbGljYXRpb25cbiIpOwotICAgICAgcHJpbnRmICgiXHQgdHJhY2UtZW50cmllcyAgICAgICAgICAtIHJlcG9ydCBlbnRyaWVzIGFmdGVyIGEgcnVsZXMgYXBwbGljYXRpb25cbiIpOwotICAgICAgcHJpbnRmICgiXHQgdHJhY2UtcnVsZS1yZWplY3Rpb24gICAtIHJlcG9ydCBlYWNoIHJ1bGUgYXMgcmVqZWN0ZWRcbiIpOwotICAgICAgcHJpbnRmICgiXHQgdHJhY2UtcnVsZS1zZWxlY3Rpb24gICAtIHJlcG9ydCBlYWNoIHJ1bGUgYXMgc2VsZWN0ZWRcbiIpOwotICAgICAgcHJpbnRmICgiXHQgdHJhY2UtaW5zbi1pbnNlcnRpb24gICAtIHJlcG9ydCBlYWNoIGluc3RydWN0aW9uIGFzIGl0IGlzIGluc2VydGVkIGludG8gYSBkZWNvZGUgdGFibGVcbiIpOwotICAgICAgcHJpbnRmICgiXHQgdHJhY2UtcnVsZS1leHBhbnNpb24gICAtIHJlcG9ydCBlYWNoIGluc3RydWN0aW9uIGFzIGl0IGlzIGV4cGFuZGVkIChiZWZvcmUgaW5zZXJ0aW9uIGludG8gYSBkZWNvZGUgdGFibGUpXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IHRyYWNlLWFsbCAgICAgICAgICAgICAgLSBlbmFibGUgYWxsIHRyYWNlIG9wdGlvbnNcbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IGZpZWxkLXdpZHRocyAgICAgICAgICAgLSBpbnN0cnVjdGlvbiBmb3JtYXRzIHNwZWNpZnkgd2lkdGhzIChkZXByZWNpYXRlZClcbiIpOwotICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIGFuIGluc3RydWN0aW9uIGZvcm1hdCBzcGVjaWZpZXMgYml0XG4iKTsKLSAgICAgIHByaW50ZiAoIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnNcbiIpOwotICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGNhbiBub3cgYmUgc2V0IGRpcmVjdGx5IGluIHRoZVxuIik7Ci0gICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gdGFibGVcbiIpOwotICAgICAgcHJpbnRmICgiXHQganVtcHMgICAgICAgICAgICAgICAgICAtIHVzZSBqdW1wcyBpbnN0ZWFkIG9mIGZ1bmN0aW9uIGNhbGxzXG4iKTsKLSAgICAgIHByaW50ZiAoIlx0IG9taXQtbGluZS1udW1iZXJzICAgICAgLSBkbyBub3QgaW5jbHVkZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0XG4iKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCJJbnB1dCBvcHRpb25zOlxuIik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiICAtayA8Y2FjaGUtcnVsZXM+IChkZXByZWNpYXRlZClcbiIpOwotICAgICAgcHJpbnRmICgiICAtbyA8ZGVjb2RlLXJ1bGVzPlxuIik7Ci0gICAgICBwcmludGYgKCIgIC1pIDxpbnN0cnVjdGlvbi10YWJsZT5cbiIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIk91dHB1dCBvcHRpb25zOlxuIik7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmICgiICAteCAgICAgICAgICAgICAgICAgICAgUGVyZm9ybSBleHBhbnNpb24gKHJlcXVpcmVkKVxuIik7Ci0gICAgICBwcmludGYgKCIgIC1uIDxyZWFsLW5hbWU+ICAgICAgICBTcGVjaWZ5IHRoZSByZWFsIG5hbWUgb2YgdGhlIG5leHQgb3V0cHV0IGZpbGVcbiIpOyAKLSAgICAgIHByaW50ZiAoIiAgLWggCQkgICAgICAgR2VuZXJhdGUgdGhlIGhlYWRlciAoLmgpIGZpbGUgcmF0aGVyIHRoYW4gdGhlIGJvZHkgKC5jKVxuIik7Ci0gICAgICBwcmludGYgKCIgIC1jIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaWNhY2hlXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLWQgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBpZGVjb2RlXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLWUgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBlbmdpbmVcbiIpOwotICAgICAgcHJpbnRmICgiICAtZiA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IHN1cHBvcnQgZnVuY3Rpb25zXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLW0gPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBtb2RlbFxuIik7Ci0gICAgICBwcmludGYgKCIgIC1yIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgbXVsdGktc2ltIHJ1blxuIik7Ci0gICAgICBwcmludGYgKCIgIC1zIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgc2NoZW1hdGljXG4iKTsKLSAgICAgIHByaW50ZiAoIiAgLXQgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBpdGFibGVcbiIpOwotICAgIH0KLSAgCi0gIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwKLQkJICAgICAgIkI6RDpGOkc6SDpJOk06TjpQOlQ6VzpvOms6aTpuOmhjOmQ6ZTptOnI6czp0OmY6eCIpKQotCSAhPSAtMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIC0lYyAiLCBjaCk7Ci0gICAgICBpZiAob3B0YXJnKQotCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIG9wdGFyZyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcXFxuIik7Ci0gICAgICAKLSAgICAgIHN3aXRjaChjaCkKLQl7Ci0JICAKLQljYXNlICdNJzoKLQkgIGZpbHRlcl9wYXJzZSAoJm9wdGlvbnMubW9kZWxfZmlsdGVyLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgInByb2Nlc3Nvci1uYW1lcyIpKQotCSAgICB7Ci0JICAgICAgY2hhciAqcHJvY2Vzc29yOwotCSAgICAgIGZvciAocHJvY2Vzc29yID0gZmlsdGVyX25leHQgKG9wdGlvbnMubW9kZWxfZmlsdGVyLCAiIik7Ci0JCSAgIHByb2Nlc3NvciAhPSBOVUxMOwotCQkgICBwcm9jZXNzb3IgPSBmaWx0ZXJfbmV4dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsIHByb2Nlc3NvcikpCi0JCWxmX3ByaW50ZiAoc3RhbmRhcmRfb3V0LCAiJXNcbiIsIHByb2Nlc3Nvcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZXJyb3IgKE5VTEwsICJVbmtub3duIGRhdGEgc3RydWN0dXJlICVzLCBub3QgZHVtcGVkXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIGZpbHRlcl9wYXJzZSAoJm9wdGlvbnMuZmxhZ3NfZmlsdGVyLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlICdJJzoKLQkgIHsKLQkgICAgdGFibGVfaW5jbHVkZSAqKmRpciA9ICZvcHRpb25zLmluY2x1ZGU7Ci0JICAgIHdoaWxlICgoKmRpcikgIT0gTlVMTCkKLQkgICAgICBkaXIgPSAmKCpkaXIpLT5uZXh0OwotCSAgICAoKmRpcikgPSBaQUxMT0MgKHRhYmxlX2luY2x1ZGUpOwotCSAgICAoKmRpciktPmRpciA9IHN0cmR1cCAob3B0YXJnKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSAnQic6Ci0JICBvcHRpb25zLmluc25fYml0X3NpemUgPSBhMmkgKG9wdGFyZyk7Ci0JICBpZiAob3B0aW9ucy5pbnNuX2JpdF9zaXplIDw9IDAKLQkgICAgICB8fCBvcHRpb25zLmluc25fYml0X3NpemUgPiBtYXhfaW5zbl9iaXRfc2l6ZSkKLQkgICAgewotCSAgICAgIGVycm9yIChOVUxMLCAiSW5zdHJ1Y3Rpb24gYml0c2l6ZSBtdXN0IGJlIGluIHJhbmdlIDEuLiVkXG4iLAotCQkgICAgIG1heF9pbnNuX2JpdF9zaXplKTsKLQkgICAgfQotCSAgaWYgKG9wdGlvbnMuaGlfYml0X25yICE9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIDEKLQkgICAgICAmJiBvcHRpb25zLmhpX2JpdF9uciAhPSAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKE5VTEwsICJDb25mbGljdCBiZXR3ZWVtIGhpLWJpdC1uciBhbmQgaW5zbi1iaXQtc2l6ZVxuIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSAnSCc6Ci0JICBvcHRpb25zLmhpX2JpdF9uciA9IGEyaSAob3B0YXJnKTsKLQkgIGlmIChvcHRpb25zLmhpX2JpdF9uciAhPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxCi0JICAgICAgJiYgb3B0aW9ucy5oaV9iaXRfbnIgIT0gMCkKLQkgICAgewotCSAgICAgIGVycm9yIChOVUxMLCAiQ29uZmxpY3QgYmV0d2VlbiBoaS1iaXQtbnIgYW5kIGluc24tYml0LXNpemVcbiIpOwotCSAgICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgJ04nOgotCSAgb3B0aW9ucy5nZW4uc21wID0gYTJpIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlICdQJzoKLQljYXNlICdTJzoKLQkgIHsKLQkgICAgaWdlbl9tb2R1bGUgKm5hbWVzOwotCSAgICBpZ2VuX25hbWUgKm5hbWU7Ci0JICAgIGNoYXIgKmNocDsKLQkgICAgY2hwID0gc3RyY2hyIChvcHRhcmcsICc9Jyk7Ci0JICAgIGlmIChjaHAgPT0gTlVMTCkKLQkgICAgICB7Ci0JCW5hbWVzID0gJm9wdGlvbnMubW9kdWxlLmdsb2JhbDsKLQkJY2hwID0gb3B0YXJnOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY2hwID0gY2hwICsgMTsgLyogc2tpcCBgPScgKi8KLQkJbmFtZXMgPSBOVUxMOwotCQlpZiAoc3RybmNtcCAob3B0YXJnLCAiZ2xvYmFsPSIsIGNocCAtIG9wdGFyZykgPT0gMCkKLQkJICB7Ci0JCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5nbG9iYWw7Ci0JCSAgfQotCQlpZiAoc3RybmNtcCAob3B0YXJnLCAiZW5naW5lPSIsIGNocCAtIG9wdGFyZykgPT0gMCkKLQkJICB7Ci0JCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5lbmdpbmU7Ci0JCSAgfQotCQlpZiAoc3RybmNtcCAob3B0YXJnLCAiaWNhY2hlPSIsIGNocCAtIG9wdGFyZykgPT0gMCkKLQkJICB7Ci0JCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5pY2FjaGU7Ci0JCSAgfQotCQlpZiAoc3RybmNtcCAob3B0YXJnLCAiaWRlY29kZT0iLCBjaHAgLSBvcHRhcmcpID09IDApCi0JCSAgewotCQkgICAgbmFtZXMgPSAmb3B0aW9ucy5tb2R1bGUuaWRlY29kZTsKLQkJICB9Ci0JCWlmIChzdHJuY21wIChvcHRhcmcsICJpdGFibGU9IiwgY2hwIC0gb3B0YXJnKSA9PSAwKQotCQkgIHsKLQkJICAgIG5hbWVzID0gJm9wdGlvbnMubW9kdWxlLml0YWJsZTsKLQkJICB9Ci0JCWlmIChzdHJuY21wIChvcHRhcmcsICJzZW1hbnRpY3M9IiwgY2hwIC0gb3B0YXJnKSA9PSAwKQotCQkgIHsKLQkJICAgIG5hbWVzID0gJm9wdGlvbnMubW9kdWxlLnNlbWFudGljczsKLQkJICB9Ci0JCWlmIChzdHJuY21wIChvcHRhcmcsICJzdXBwb3J0PSIsIGNocCAtIG9wdGFyZykgPT0gMCkKLQkJICB7Ci0JCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5zdXBwb3J0OwotCQkgIH0KLQkJaWYgKG5hbWVzID09IE5VTEwpCi0JCSAgewotCQkgICAgZXJyb3IgKE5VTEwsICJQcmVmaXggYCVzJyB1bnJlY29uaXplZFxuIiwgb3B0YXJnKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBzd2l0Y2ggKGNoKQotCSAgICAgIHsKLQkgICAgICBjYXNlICdQJzoKLQkJbmFtZSA9ICZuYW1lcy0+cHJlZml4OwotCQlicmVhazsKLQkgICAgICBjYXNlICdTJzoKLQkJbmFtZSA9ICZuYW1lcy0+c3VmZml4OwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIG5hbWUtPnUgPSBzdHJkdXAgKGNocCk7Ci0JICAgIG5hbWUtPmwgPSBzdHJkdXAgKGNocCk7Ci0JICAgIGNocCA9IG5hbWUtPnU7Ci0JICAgIHdoaWxlICgqY2hwKSB7Ci0JICAgICAgaWYgKGlzbG93ZXIoKmNocCkpCi0JCSpjaHAgPSB0b3VwcGVyKCpjaHApOwotCSAgICAgIGNocCsrOwotCSAgICB9Ci0JICAgIGlmIChuYW1lID09ICZvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4KQotCSAgICAgIHsKLQkJb3B0aW9ucy5tb2R1bGUuZW5naW5lLnByZWZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXg7Ci0JCW9wdGlvbnMubW9kdWxlLmljYWNoZS5wcmVmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4OwotCQlvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnByZWZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXg7Ci0JCS8qIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4OyAqLwotCQlvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3MucHJlZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeDsKLQkJb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4OwotCSAgICAgIH0KLQkgICAgaWYgKG5hbWUgPT0gJm9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXgpCi0JICAgICAgewotCQlvcHRpb25zLm1vZHVsZS5lbmdpbmUuc3VmZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnN1ZmZpeDsKLQkJb3B0aW9ucy5tb2R1bGUuaWNhY2hlLnN1ZmZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXg7Ci0JCW9wdGlvbnMubW9kdWxlLmlkZWNvZGUuc3VmZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnN1ZmZpeDsKLQkJLyogb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnN1ZmZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXg7ICovCi0JCW9wdGlvbnMubW9kdWxlLnNlbWFudGljcy5zdWZmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwuc3VmZml4OwotCQlvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnN1ZmZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXg7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlICdXJzoKLQkgIHsKLQkgICAgaWYgKHN0cmNtcCAob3B0YXJnLCAiZXJyb3IiKSA9PSAwKQotCSAgICAgIG9wdGlvbnMud2FybmluZyA9IGVycm9yOwotCSAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIm5vZGlzY2FyZCIpID09IDApCi0JICAgICAgb3B0aW9ucy53YXJuLmRpc2NhcmQgPSAwOwotCSAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImRpc2NhcmQiKSA9PSAwKQotCSAgICAgIG9wdGlvbnMud2Fybi5kaXNjYXJkID0gMTsKLQkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub3dpZHRoIikgPT0gMCkKLQkgICAgICBvcHRpb25zLndhcm4ud2lkdGggPSAwOwotCSAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIndpZHRoIikgPT0gMCkKLQkgICAgICBvcHRpb25zLndhcm4ud2lkdGggPSAxOwotCSAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIm5vdW5pbXBsZW1lbnRlZCIpID09IDApCi0JICAgICAgb3B0aW9ucy53YXJuLnVuaW1wbGVtZW50ZWQgPSAwOwotCSAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgInVuaW1wbGVtZW50ZWQiKSA9PSAwKQotCSAgICAgIG9wdGlvbnMud2Fybi51bmltcGxlbWVudGVkID0gMTsKLQkgICAgZWxzZQotCSAgICAgIGVycm9yIChOVUxMLCAiVW5rbm93biAtVyBhcmd1bWVudCBgJXMnXG4iLCBvcHRhcmcpOwotCSAgICBicmVhazsKLQkgIH0KLQotCi0JY2FzZSAnRyc6Ci0JICB7Ci0JICAgIGludCBlbmFibGVfcDsKLQkgICAgY2hhciAqYXJncDsKLQkgICAgaWYgKHN0cm5jbXAgKG9wdGFyZywgIm5vLSIsIHN0cmxlbiAoIm5vLSIpKSA9PSAwKQotCSAgICAgIHsKLQkJYXJncCA9IG9wdGFyZyArIHN0cmxlbiAoIm5vLSIpOwotCQllbmFibGVfcCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJuY21wIChvcHRhcmcsICIhIiwgc3RybGVuICgiISIpKSA9PSAwKQotCSAgICAgIHsKLQkJYXJncCA9IG9wdGFyZyArIHN0cmxlbiAoIm5vLSIpOwotCQllbmFibGVfcCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlhcmdwID0gb3B0YXJnOwotCQllbmFibGVfcCA9IDE7Ci0JICAgICAgfQotCSAgICBpZiAoc3RyY21wIChhcmdwLCAiZGVjb2RlLWR1cGxpY2F0ZSIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmRlY29kZS5kdXBsaWNhdGUgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImRlY29kZS1jb21iaW5lIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZGVjb2RlLmNvbWJpbmUgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImRlY29kZS16ZXJvLXJlc2VydmVkIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZGVjb2RlLnplcm9fcmVzZXJ2ZWQgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIAotCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJnZW4tY29uZGl0aW9uYWwtaXNzdWUiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4uY29uZGl0aW9uYWxfaXNzdWUgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImNvbmRpdGlvbmFsLWlzc3VlIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLmNvbmRpdGlvbmFsX2lzc3VlID0gZW5hYmxlX3A7Ci0JCW9wdGlvbnMud2FybmluZyAoTlVMTCwgIk9wdGlvbiBjb25kaXRpb25hbC1pc3N1ZSByZXBsYWNlZCBieSBnZW4tY29uZGl0aW9uYWwtaXNzdWVcbiIpOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLWRlbGF5ZWQtYnJhbmNoIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLmRlbGF5ZWRfYnJhbmNoID0gZW5hYmxlX3A7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJkZWxheWVkLWJyYW5jaCIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmdlbi5kZWxheWVkX2JyYW5jaCA9IGVuYWJsZV9wOwotCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJPcHRpb24gZGVsYXllZC1icmFuY2ggcmVwbGFjZWQgYnkgZ2VuLWRlbGF5ZWQtYnJhbmNoXG4iKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1kaXJlY3QtYWNjZXNzIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImRpcmVjdC1hY2Nlc3MiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4uZGlyZWN0X2FjY2VzcyA9IGVuYWJsZV9wOwotCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJPcHRpb24gZGlyZWN0LWFjY2VzcyByZXBsYWNlZCBieSBnZW4tZGlyZWN0LWFjY2Vzc1xuIik7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJuY21wIChhcmdwLCAiZ2VuLXplcm8tciIsIHN0cmxlbiAoImdlbi16ZXJvLXIiKSkgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLnplcm9fcmVnID0gZW5hYmxlX3A7Ci0JCW9wdGlvbnMuZ2VuLnplcm9fcmVnX25yID0gYXRvaSAoYXJncCArIHN0cmxlbiAoImdlbi16ZXJvLXIiKSk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJuY21wIChhcmdwLCAiemVyby1yIiwgc3RybGVuICgiemVyby1yIikpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmdlbi56ZXJvX3JlZyA9IGVuYWJsZV9wOwotCQlvcHRpb25zLmdlbi56ZXJvX3JlZ19uciA9IGF0b2kgKGFyZ3AgKyBzdHJsZW4gKCJ6ZXJvLXIiKSk7Ci0JCW9wdGlvbnMud2FybmluZyAoTlVMTCwgIk9wdGlvbiB6ZXJvLXI8Tj4gcmVwbGFjZWQgYnkgZ2VuLXplcm8tcjxOPlxuIik7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJuY21wIChhcmdwLCAiZ2VuLWljYWNoZSIsIHN0cmxlbiAoImdlbi1pY2FjaGUiKSkgPT0gMCkKLQkgICAgICB7Ci0JCXN3aXRjaCAoYXJncFtzdHJsZW4gKCJnZW4taWNhY2hlIildKQotCQkgIHsKLQkJICBjYXNlICc9JzoKLQkJICAgIG9wdGlvbnMuZ2VuLmljYWNoZV9zaXplID0gYXRvaSAoYXJncCArIHN0cmxlbiAoImdlbi1pY2FjaGUiKSArIDEpOwotCQkgICAgb3B0aW9ucy5nZW4uaWNhY2hlID0gZW5hYmxlX3A7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdcMCc6Ci0JCSAgICBvcHRpb25zLmdlbi5pY2FjaGUgPSBlbmFibGVfcDsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBlcnJvciAoTlVMTCwgIkV4cGVjdGluZyAtR2dlbi1pY2FjaGUgb3IgLUdnZW4taWNhY2hlPTxOPlxuIik7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLWluc24taW4taWNhY2hlIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLmluc25faW5faWNhY2hlID0gZW5hYmxlX3A7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJuY21wIChhcmdwLCAiZ2VuLW11bHRpLXNpbSIsIHN0cmxlbiAoImdlbi1tdWx0aS1zaW0iKSkgPT0gMCkKLQkgICAgICB7Ci0JCWNoYXIgKmFyZyA9ICZhcmdwW3N0cmxlbiAoImdlbi1tdWx0aS1zaW0iKV07Ci0JCXN3aXRjaCAoYXJnWzBdKQotCQkgIHsKLQkJICBjYXNlICc9JzoKLQkJICAgIG9wdGlvbnMuZ2VuLm11bHRpX3NpbSA9IGVuYWJsZV9wOwotCQkgICAgb3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCA9IGFyZyArIDE7Ci0JCSAgICBpZiAoISBmaWx0ZXJfaXNfbWVtYmVyIChvcHRpb25zLm1vZGVsX2ZpbHRlciwgb3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCkpCi0JCSAgICAgIGVycm9yIChOVUxMLCAibXVsdGktc2ltIG1vZGVsICVzIHVua25vd25cbiIsIG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnXDAnOgotCQkgICAgb3B0aW9ucy5nZW4ubXVsdGlfc2ltID0gZW5hYmxlX3A7Ci0JCSAgICBvcHRpb25zLmdlbi5kZWZhdWx0X21vZGVsID0gTlVMTDsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBlcnJvciAoTlVMTCwgIkV4cGVjdGluZyAtR2dlbi1tdWx0aS1zaW0gb3IgLUdnZW4tbXVsdGktc2ltPTxNT0RFTD5cbiIpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLW11bHRpLXdvcmQiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4ubXVsdGlfd29yZCA9IGVuYWJsZV9wOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLXNlbWFudGljLWljYWNoZSIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1zbG90LXZlcmlmaWNhdGlvbiIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmdlbi5zbG90X3ZlcmlmaWNhdGlvbiA9IGVuYWJsZV9wOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAidmVyaWZ5LXNsb3QiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4uc2xvdF92ZXJpZmljYXRpb24gPSBlbmFibGVfcDsKLQkJb3B0aW9ucy53YXJuaW5nIChOVUxMLCAiT3B0aW9uIHZlcmlmeS1zbG90IHJlcGxhY2VkIGJ5IGdlbi1zbG90LXZlcmlmaWNhdGlvblxuIik7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJnZW4tbmlhLWludmFsaWQiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4ubmlhID0gbmlhX2lzX2ludmFsaWQ7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJkZWZhdWx0LW5pYS1taW51cy1vbmUiKSA9PSAwKQotCSAgICAgIHsKLQkJb3B0aW9ucy5nZW4ubmlhID0gbmlhX2lzX2ludmFsaWQ7Ci0JCW9wdGlvbnMud2FybmluZyAoTlVMTCwgIk9wdGlvbiBkZWZhdWx0LW5pYS1taW51cy1vbmUgcmVwbGFjZWQgYnkgZ2VuLW5pYS1pbnZhbGlkXG4iKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1uaWEtdm9pZCIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmdlbi5uaWEgPSBuaWFfaXNfdm9pZDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLWFsbCIpID09IDApCi0JICAgICAgewotCQltZW1zZXQgKCZvcHRpb25zLnRyYWNlLCBlbmFibGVfcCwgc2l6ZW9mIChvcHRpb25zLnRyYWNlKSk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1jb21iaW5lIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMudHJhY2UuY29tYmluZSA9IGVuYWJsZV9wOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAidHJhY2UtZW50cmllcyIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLnRyYWNlLmVudHJpZXMgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLXJ1bGUtcmVqZWN0aW9uIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMudHJhY2UucnVsZV9yZWplY3Rpb24gPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLXJ1bGUtc2VsZWN0aW9uIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMudHJhY2UucnVsZV9zZWxlY3Rpb24gPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLWluc24taW5zZXJ0aW9uIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMudHJhY2UuaW5zbl9pbnNlcnRpb24gPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLWluc24tZXhwYW5zaW9uIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMudHJhY2UuaW5zbl9leHBhbnNpb24gPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImp1bXBzIikgPT0gMCkKLQkgICAgICB7Ci0JCW9wdGlvbnMuZ2VuLmNvZGUgPSBnZW5lcmF0ZV9qdW1wczsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImZpZWxkLXdpZHRocyIpID09IDApCi0JICAgICAgewotCQlvcHRpb25zLmluc25fc3BlY2lmeWluZ193aWR0aHMgPSBlbmFibGVfcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgIm9taXQtbGluZS1udW1iZXJzIikgPT0gMCkKLQkgICAgICB7Ci0JCWZpbGVfcmVmZXJlbmNlcyA9IGxmX29taXRfcmVmZXJlbmNlczsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWVycm9yIChOVUxMLCAiVW5rbm93biBvcHRpb24gJXNcbiIsIG9wdGFyZyk7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlICdpJzoKLQkgIGlzYSA9IGxvYWRfaW5zbl90YWJsZSAob3B0YXJnLCBjYWNoZV9ydWxlcyk7Ci0JICBpZiAoaXNhLT5pbGxlZ2FsX2luc24gPT0gTlVMTCkKLQkgICAgZXJyb3IgKE5VTEwsICJpbGxlZ2FsLWluc3RydWN0aW9uIG1pc3NpbmcgZnJvbSBpbnNuIHRhYmxlXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JICBnZW4gPSBkb19nZW4gKGlzYSwgZGVjb2RlX3J1bGVzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICBkZWNvZGVfcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnayc6Ci0JICBpZiAoaXNhICE9IE5VTEwpCi0JICAgIGVycm9yIChOVUxMLCAiQ2FjaGUgZmlsZSBtdXN0IGFwcGVhciBiZWZvcmUgdGhlIGluc24gZmlsZVxuIik7Ci0JICBjYWNoZV9ydWxlcyA9IGxvYWRfY2FjaGVfdGFibGUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ24nOgotCSAgcmVhbF9maWxlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JICBpc19oZWFkZXIgPSAxOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlICdjJzoKLQljYXNlICdkJzoKLQljYXNlICdlJzoKLQljYXNlICdmJzoKLQljYXNlICdtJzoKLQljYXNlICdyJzoKLQljYXNlICdzJzoKLQljYXNlICd0JzoKLQkgIHsKLQkgICAgbGYgKmZpbGUgPSBsZl9vcGVuKG9wdGFyZywgcmVhbF9maWxlX25hbWUsIGZpbGVfcmVmZXJlbmNlcywKLQkJCSAgICAgICAoaXNfaGVhZGVyID8gbGZfaXNfaCA6IGxmX2lzX2MpLAotCQkJICAgICAgIGFyZ3ZbMF0pOwotCSAgICBpZiAoZ2VuID09IE5VTEwgJiYgY2ggIT0gJ3QnICYmIGNoICE9ICdtJyAmJiBjaCAhPSAnZicpCi0JICAgICAgewotCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJFeHBsaWNpdGx5IGdlbmVyYXRlIHRhYmxlcyB3aXRoIC14IG9wdGlvblxuIik7Ci0JCWdlbiA9IGRvX2dlbiAoaXNhLCBkZWNvZGVfcnVsZXMpOwotCSAgICAgIH0KLQkgICAgbGZfcHJpbnRfX2ZpbGVfc3RhcnQoZmlsZSk7Ci0JICAgIHN3aXRjaCAoY2gpCi0JICAgICAgewotCSAgICAgIGNhc2UgJ20nOgotCQlpZiAoaXNfaGVhZGVyKQotCQkgIGdlbl9tb2RlbF9oIChmaWxlLCBpc2EpOwotCQllbHNlCi0JCSAgZ2VuX21vZGVsX2MgKGZpbGUsIGlzYSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ3QnOgotCQlpZiAoaXNfaGVhZGVyKQotCQkgIGdlbl9pdGFibGVfaCAoZmlsZSwgaXNhKTsKLQkJZWxzZQotCQkgIGdlbl9pdGFibGVfYyAoZmlsZSwgaXNhKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnZic6Ci0JCWlmIChpc19oZWFkZXIpCi0JCSAgZ2VuX3N1cHBvcnRfaCAoZmlsZSwgaXNhKTsKLQkJZWxzZQotCQkgIGdlbl9zdXBwb3J0X2MgKGZpbGUsIGlzYSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ3InOgotCQlpZiAoaXNfaGVhZGVyKQotCQkgIG9wdGlvbnMud2FybmluZyAoTlVMTCwgIi1ociBvcHRpb24gaWdub3JlZFxuIik7Ci0JCWVsc2UKLQkJICBnZW5fcnVuX2MgKGZpbGUsIGdlbik7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ3MnOgotCQlpZihpc19oZWFkZXIpCi0JCSAgZ2VuX3NlbWFudGljc19oIChmaWxlLCBnZW4tPnNlbWFudGljcywgaXNhLT5tYXhfbnJfd29yZHMpOwotCQllbHNlCi0JCSAgZ2VuX3NlbWFudGljc19jIChmaWxlLCBnZW4tPnNlbWFudGljcywgaXNhLT5jYWNoZXMpOwotCQlicmVhazsKLQkgICAgICBjYXNlICdkJzoKLQkJaWYgKGlzX2hlYWRlcikKLQkJICBnZW5faWRlY29kZV9oIChmaWxlLCBnZW4sIGlzYSwgY2FjaGVfcnVsZXMpOwotCQllbHNlCi0JCSAgZ2VuX2lkZWNvZGVfYyAoZmlsZSwgZ2VuLCBpc2EsIGNhY2hlX3J1bGVzKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnZSc6Ci0JCWlmIChpc19oZWFkZXIpCi0JCSAgZ2VuX2VuZ2luZV9oIChmaWxlLCBnZW4sIGlzYSwgY2FjaGVfcnVsZXMpOwotCQllbHNlCi0JCSAgZ2VuX2VuZ2luZV9jIChmaWxlLCBnZW4sIGlzYSwgY2FjaGVfcnVsZXMpOwotCQlicmVhazsKLQkgICAgICBjYXNlICdjJzoKLQkJaWYgKGlzX2hlYWRlcikKLQkJICBnZW5faWNhY2hlX2ggKGZpbGUsCi0JCQkJZ2VuLT5zZW1hbnRpY3MsCi0JCQkJaXNhLT5mdW5jdGlvbnMsCi0JCQkJaXNhLT5tYXhfbnJfd29yZHMpOwotCQllbHNlCi0JCSAgZ2VuX2ljYWNoZV9jIChmaWxlLAotCQkJCWdlbi0+c2VtYW50aWNzLAotCQkJCWlzYS0+ZnVuY3Rpb25zLAotCQkJCWNhY2hlX3J1bGVzKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBsZl9wcmludF9fZmlsZV9maW5pc2goZmlsZSk7Ci0JICAgIGxmX2Nsb3NlKGZpbGUpOwotCSAgICBpc19oZWFkZXIgPSAwOwotCSAgfQotCXJlYWxfZmlsZV9uYW1lID0gTlVMTDsKLQlicmVhazsKLQlkZWZhdWx0OgotCSAgRVJST1IgKCJCYWQgc3dpdGNoIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2lnZW4uaCBiL3NpbS9pZ2VuL2lnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZGI4My4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9pZ2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIGNvZGUtZ2VuZXJhdGlvbiBvcHRpb25zOiAqLwotCi10eXBlZGVmIGVudW0gewotCi0gIC8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gYW4gaW5zdHJ1Y3Rpb25zIHNlbWFudGljIGNvZGUgdXNpbmcgdGhlIHRoZQotICAgICBzdGFuZGFyZCBjYWxsL3JldHVybiBtZWNoYW5pc20gKi8KLQotICBnZW5lcmF0ZV9jYWxscywKLQotICAvKiBUcmFuc2ZlciBjb250cm9sIHRvIGFuIGluc3RydWN0aW9ucyBzZW1hbnRpYyBjb2RlIHVzaW5nCi0gICAgIChjb21wdXRlZCkgZ290bydzIGluc3RlYWQgb2YgdGhlIG1vcmUgY29udmVudGlvbmFsIGNhbGwvcmV0dXJuCi0gICAgIG1lY2hhbmlzbSAqLwotCi0gIGdlbmVyYXRlX2p1bXBzLAotCi19IGlnZW5fY29kZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgbmlhX2lzX2NpYV9wbHVzX29uZSwKLSAgbmlhX2lzX3ZvaWQsCi0gIG5pYV9pc19pbnZhbGlkLAotfSBpZ2VuX25pYTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IF9pZ2VuX2dlbl9vcHRpb25zIGlnZW5fZ2VuX29wdGlvbnM7Ci1zdHJ1Y3QgX2lnZW5fZ2VuX29wdGlvbnMgewotICBpbnQgZGlyZWN0X2FjY2VzczsKLSAgaW50IHNlbWFudGljX2ljYWNoZTsKLSAgaW50IGluc25faW5faWNhY2hlOwotICBpbnQgY29uZGl0aW9uYWxfaXNzdWU7Ci0gIGludCBzbG90X3ZlcmlmaWNhdGlvbjsKLSAgaW50IGRlbGF5ZWRfYnJhbmNoOwotCi0gIC8qIElmIHplcm9pbmcgYSByZWdpc3Rlciwgd2hpY2ggb25lPyAqLwotICBpbnQgemVyb19yZWc7Ci0gIGludCB6ZXJvX3JlZ19ucjsKLQotICAvKiBzaG91bGQgbXVsdGlwbGUgc2ltdWxhdG9ycyBiZSBnZW5lcmF0ZWQ/ICovCi0gIGludCBtdWx0aV9zaW07Ci0KLSAgLyogbmFtZSBvZiB0aGUgZGVmYXVsdCBtdWx0aS1zaW0gbW9kZWwgKi8KLSAgY2hhciAqZGVmYXVsdF9tb2RlbDsKLQotICAvKiBzaG91bGQgdGhlIHNpbXVsYXRvciBzdXBwb3J0IG11bHRpIHdvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBpZiBzbywKLSAgICAgd2hhdCBpcyB0aGUgbWF4IG5yIG9mIHdvcmRzLiAqLwotICBpbnQgbXVsdGlfd29yZDsKLQotICAvKiBTTVA/ICBTaG91bGQgdGhlIGdlbmVyYXRlZCBjb2RlIGluY2x1ZGUgU01QIHN1cHBvcnQgKD4wKSBhbmQgaWYKLSAgICAgc28sIGZvciBob3cgbWFueSBwcm9jZXNzb3JzPyAqLwotICBpbnQgc21wOwotCi0gIC8qIGhvdyBzaG91bGQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBiZSBjb21wdXRlZD8gKi8KLSAgaWdlbl9uaWEgbmlhOwotCi0gIC8qIG5yIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBjYWNoZSAqLwotICBpbnQgaWNhY2hlOwotICBpbnQgaWNhY2hlX3NpemU7Ci0KLSAgLyogc2VlIGFib3ZlICovCi0gIGlnZW5fY29kZSBjb2RlOwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfaWdlbl90cmFjZV9vcHRpb25zIGlnZW5fdHJhY2Vfb3B0aW9uczsKLXN0cnVjdCBfaWdlbl90cmFjZV9vcHRpb25zIHsKLSAgaW50IHJ1bGVfc2VsZWN0aW9uOwotICBpbnQgcnVsZV9yZWplY3Rpb247Ci0gIGludCBpbnNuX2luc2VydGlvbjsKLSAgaW50IGluc25fZXhwYW5zaW9uOwotICBpbnQgZW50cmllczsKLSAgaW50IGNvbWJpbmU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfaWdlbl9uYW1lIHsKLSAgY2hhciAqdTsKLSAgY2hhciAqbDsKLX0gaWdlbl9uYW1lOwotdHlwZWRlZiBzdHJ1Y3QgX2lnZW5fbW9kdWxlIHsKLSAgaWdlbl9uYW1lIHByZWZpeDsKLSAgaWdlbl9uYW1lIHN1ZmZpeDsKLX0gaWdlbl9tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9pZ2VuX21vZHVsZV9vcHRpb25zIHsKLSAgaWdlbl9tb2R1bGUgZ2xvYmFsOwotICBpZ2VuX21vZHVsZSBlbmdpbmU7Ci0gIGlnZW5fbW9kdWxlIGljYWNoZTsKLSAgaWdlbl9tb2R1bGUgaWRlY29kZTsKLSAgaWdlbl9tb2R1bGUgaXRhYmxlOwotICBpZ2VuX21vZHVsZSBzZW1hbnRpY3M7Ci0gIGlnZW5fbW9kdWxlIHN1cHBvcnQ7Ci19IGlnZW5fbW9kdWxlX29wdGlvbnM7Ci0KLXR5cGVkZWYgc3RydWN0IF9pZ2VuX2RlY29kZV9vcHRpb25zIGlnZW5fZGVjb2RlX29wdGlvbnMgOwotc3RydWN0IF9pZ2VuX2RlY29kZV9vcHRpb25zIHsKLQotICAvKiBDb21iaW5lIHRhYmxlcz8gIFNob3VsZCB0aGUgZ2VuZXJhdG9yIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoCi0gICAgIGVhY2ggZ2VuZXJhdGVkIHRhYmxlIGxvb2tpbmcgZm9yIGFueSBzdWItZW50cmllcyB0aGF0IGNvbnRhaW4gdGhlCi0gICAgIHNhbWUgaW5zdHJ1Y3Rpb25zLiAgVGhvc2UgZW50cmllcyBiZWluZyBtZXJnZWQgaW50byBhIHNpbmdsZQotICAgICB0YWJsZSAqLwotICBpbnQgY29tYmluZTsKLQotICAvKiBJbnN0cnVjdGlvbiBleHBhbnNpb24/IFNob3VsZCB0aGUgc2VtYW50aWMgY29kZSBmb3IgZWFjaAotICAgICBpbnN0cnVjdGlvbiwgd2hlbiB0aGUgb3BvcnR1bml0eSBhcnJpc2VzLCBiZSBleHBhbmRlZCBhY2NvcmRpbmcKLSAgICAgdG8gdGhlIHZhcmlhYmxlIG9wY29kZSBmaWxlcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgcHJvY2VzcwotICAgICByZW5kZXJzIGNvbnN0YW50ICovCi0gIGludCBkdXBsaWNhdGU7Ci0KLSAgLyogVHJlYXQgcmVzZXJ2ZWQgZmllbGRzIGFzIGNvbnN0YW50ICh6ZXJvKSBpbnN0ZWFkIG9mIGlnbm9yaW5nCi0gICAgIHRoZWlyIHZhbHVlIHdoZW4gZGV0ZXJtaW5pbmcgZGVjb2RlIHRhYmxlcyAqLwotICBpbnQgemVyb19yZXNlcnZlZDsKLQotICAvKiBDb252ZXJ0IGFueSBwYWRkZWQgc3dpdGNoIHJ1bGVzIGludG8gZ290b19zd2l0Y2ggKi8KLSAgaW50IHN3aXRjaF9hc19nb3RvOwotCi0gIC8qIEZvcmNlIGFsbCB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkIHdpdGggdGhpcyBsb29rdXAgbWVjaGFuaXNtICovCi0gIGNoYXIgKm92ZXJyaWRpbmdfZ2VuOwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfaWdlbl93YXJuX29wdGlvbnMgaWdlbl93YXJuX29wdGlvbnM7Ci1zdHJ1Y3QgX2lnZW5fd2Fybl9vcHRpb25zIHsKLQotICAvKiBJc3N1ZSB3YXJuaW5nIGFib3V0IGRpc2NhcmRlZCBpbnN0cnVjdGlvbnMgKi8KLSAgaW50IGRpc2NhcmQ7Ci0KLSAgLyogSXNzdWUgd2FybmluZyBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9uIHdpZHRocyAqLwotICBpbnQgd2lkdGg7Ci0KLSAgLyogSXNzdWUgd2FybmluZyBhYm91dCB1bmltcGxlbWVudGVkIGluc3RydWN0aW9ucyAqLwotICBpbnQgdW5pbXBsZW1lbnRlZDsKLQotfTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IF9pZ2VuX29wdGlvbnMgaWdlbl9vcHRpb25zOwotc3RydWN0IF9pZ2VuX29wdGlvbnMgewotCi0gIC8qIFdoYXQgZG9lcyB0aGUgaW5zdHJ1Y3Rpb24gbG9vayBsaWtlIC0gYml0IG9yZGVyaW5nLCBzaXplLCB3aWR0aHMgb3IKLSAgICAgb2ZmZXNldHMgKi8KLSAgaW50IGhpX2JpdF9ucjsKLSAgaW50IGluc25fYml0X3NpemU7Ci0gIGludCBpbnNuX3NwZWNpZnlpbmdfd2lkdGhzOwotCi0gIC8qIHdoYXQgc2hvdWxkIGdsb2JhbCBuYW1lcyBiZSBwcmVmaXhlZCB3aXRoPyAqLwotICBpZ2VuX21vZHVsZV9vcHRpb25zIG1vZHVsZTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIG9wdGlvbnMgYW5kIGZsYWdzICovCi0gIGlnZW5fZ2VuX29wdGlvbnMgZ2VuOwotCi0gIC8qIFNlZSBhYm92ZSBmb3IgdHJhY2Ugb3B0aW9ucyAqLwotICBpZ2VuX3RyYWNlX29wdGlvbnMgdHJhY2U7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciBpbmNsdWRlIG9wdGlvbnMgKi8KLSAgdGFibGVfaW5jbHVkZSAqaW5jbHVkZTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRlY29kZSBvcHRpb25zICovCi0gIGlnZW5fZGVjb2RlX29wdGlvbnMgZGVjb2RlOwotCi0gIC8qIEZpbHRlciBzZXQgdG8gYmUgdXNlZCBvbiB0aGUgZmxhZyBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUgKi8KLSAgZmlsdGVyICpmbGFnc19maWx0ZXI7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciB3YXJuIG9wdGlvbnMgKi8KLSAgaWdlbl93YXJuX29wdGlvbnMgd2FybjsKLQotICAvKiBCZSBtb3JlIHBpY2t5IGFib3V0IHRoZSBpbnB1dCAqLwotICBlcnJvcl9mdW5jICgqd2FybmluZyk7Ci0KLSAgLyogTW9kZWwgKHByb2Nlc3Nvcikgc2V0IC0gbGlrZSBmbGFnc19maWx0ZXIuIFVzZWQgdG8gc2VsZWN0IHRoZQotICAgICBzcGVjaWZpYyBJU0Egd2l0aGluIGEgcHJvY2Vzc29yIGZhbWlseS4gKi8KLSAgZmlsdGVyICptb2RlbF9maWx0ZXI7Ci0KLSAgLyogRm9ybWF0IG5hbWUgc2V0ICovCi0gIGZpbHRlciAqZm9ybWF0X25hbWVfZmlsdGVyOwotfTsKLQotZXh0ZXJuIGlnZW5fb3B0aW9ucyBvcHRpb25zOwotCi0vKiBkZWZhdWx0IG9wdGlvbnMgLSBob3BlZnVsbHkgYmFja3dhcmQgY29tcGF0aWJsZSAqLyBcCi0jZGVmaW5lIElOSVRfT1BUSU9OUygpIFwKLWRvIHsgXAotICBtZW1zZXQgKCZvcHRpb25zLCAwLCBzaXplb2Ygb3B0aW9ucyk7IFwKLSAgbWVtc2V0ICgmb3B0aW9ucy53YXJuLCAtMSwgc2l6ZW9mIChvcHRpb25zLndhcm4pKTsgXAotICBvcHRpb25zLmhpX2JpdF9uciA9IDA7IFwKLSAgb3B0aW9ucy5pbnNuX2JpdF9zaXplID0gZGVmYXVsdF9pbnNuX2JpdF9zaXplOyBcCi0gIG9wdGlvbnMuaW5zbl9zcGVjaWZ5aW5nX3dpZHRocyA9IDA7IFwKLSAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC51ID0gIiI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sID0gIiI7IFwKLSAgLyogdGhlIHByZWZpeGVzICovIFwKLSAgb3B0aW9ucy5tb2R1bGUuZW5naW5lID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsOyBcCi0gIG9wdGlvbnMubW9kdWxlLmljYWNoZSA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAotICBvcHRpb25zLm1vZHVsZS5pZGVjb2RlID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsOyBcCi0gIG9wdGlvbnMubW9kdWxlLml0YWJsZSA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAotICBvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3MgPSBvcHRpb25zLm1vZHVsZS5nbG9iYWw7IFwKLSAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAotICAvKiB0aGUgc3VmZml4ZXMgKi8gXAotICBvcHRpb25zLm1vZHVsZS5lbmdpbmUuc3VmZml4LmwgPSAiZW5naW5lIjsgXAotICBvcHRpb25zLm1vZHVsZS5lbmdpbmUuc3VmZml4LnUgPSAiRU5HSU5FIjsgXAotICBvcHRpb25zLm1vZHVsZS5pY2FjaGUuc3VmZml4LmwgPSAiaWNhY2hlIjsgXAotICBvcHRpb25zLm1vZHVsZS5pY2FjaGUuc3VmZml4LnUgPSAiSUNBQ0hFIjsgXAotICBvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnN1ZmZpeC5sID0gImlkZWNvZGUiOyBcCi0gIG9wdGlvbnMubW9kdWxlLmlkZWNvZGUuc3VmZml4LnUgPSAiSURFQ09ERSI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnN1ZmZpeC5sID0gIml0YWJsZSI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnN1ZmZpeC51ID0gIklUQUJMRSI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnN1ZmZpeC5sID0gInNlbWFudGljcyI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnN1ZmZpeC51ID0gIlNFTUFOVElDUyI7IFwKLSAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5zdWZmaXgubCA9ICJzdXBwb3J0IjsgXAotICBvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnN1ZmZpeC51ID0gIlNVUFBPUlQiOyBcCi0gIC8qIG1pc2Mgc3R1ZmYgKi8gXAotICBvcHRpb25zLmdlbi5jb2RlID0gZ2VuZXJhdGVfY2FsbHM7IFwKLSAgb3B0aW9ucy5nZW4uaWNhY2hlX3NpemUgPSAxMDI0OyBcCi0gIG9wdGlvbnMud2FybmluZyA9IHdhcm5pbmc7IFwKLX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1jYWNoZS5jIGIvc2ltL2lnZW4vbGQtY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiZDExMS4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9sZC1jYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0jaW5jbHVkZSAiaWdlbi5oIgotCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotI2luY2x1ZGUgImxkLWNhY2hlLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0KLWVudW0gewotICBjYV90eXBlLAotICBjYV9maWVsZF9uYW1lLAotICBjYV9kZXJpdmVkX25hbWUsCi0gIGNhX3R5cGVfZGVmLAotICBjYV9leHByZXNzaW9uLAotICBucl9jYWNoZV9ydWxlX2ZpZWxkcywKLX07Ci0KLXN0YXRpYyBjb25zdCBuYW1lX21hcCBjYWNoZV90eXBlX21hcFtdID0gewotICB7ICJjYWNoZSIsIGNhY2hlX3ZhbHVlIH0sCi0gIHsgImNvbXB1dGUiLCBjb21wdXRlX3ZhbHVlIH0sCi0gIHsgInNjcmF0Y2giLCBzY3JhdGNoX3ZhbHVlIH0sCi0gIHsgTlVMTCwgMCB9LAotfTsKLQotCi1jYWNoZV9lbnRyeSAqCi1sb2FkX2NhY2hlX3RhYmxlIChjaGFyICpmaWxlX25hbWUpCi17Ci0gIGNhY2hlX2VudHJ5ICpjYWNoZSA9IE5VTEw7Ci0gIGNhY2hlX2VudHJ5ICoqbGFzdCA9ICZjYWNoZTsKLSAgdGFibGUgKmZpbGUgPSB0YWJsZV9vcGVuIChmaWxlX25hbWUpOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIHdoaWxlICgoZW50cnkgPSB0YWJsZV9yZWFkIChmaWxlKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjYWNoZV9lbnRyeSAqbmV3X3J1bGUgPSBaQUxMT0MgKGNhY2hlX2VudHJ5KTsKLSAgICAgIG5ld19ydWxlLT5saW5lID0gZW50cnktPmxpbmU7Ci0gICAgICBuZXdfcnVsZS0+ZW50cnlfdHlwZSA9IG5hbWUyaSAoZW50cnktPmZpZWxkW2NhX3R5cGVdLCBjYWNoZV90eXBlX21hcCk7Ci0gICAgICBuZXdfcnVsZS0+bmFtZSA9IGVudHJ5LT5maWVsZFtjYV9kZXJpdmVkX25hbWVdOwotICAgICAgZmlsdGVyX3BhcnNlICgmbmV3X3J1bGUtPm9yaWdpbmFsX2ZpZWxkcywKLQkJICAgIGVudHJ5LT5maWVsZFtjYV9maWVsZF9uYW1lXSk7Ci0gICAgICBuZXdfcnVsZS0+dHlwZSA9IGVudHJ5LT5maWVsZFtjYV90eXBlX2RlZl07Ci0gICAgICAvKiBleHByZXNzaW9uIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByZW1haW5pbmcgZmllbGRzICovCi0gICAgICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IGNhX2V4cHJlc3Npb24pCi0JewotCSAgaW50IGxlbiA9IDA7Ci0JICBpbnQgY2hpOwotCSAgZm9yIChjaGkgPSBjYV9leHByZXNzaW9uOyBjaGkgPCBlbnRyeS0+bnJfZmllbGRzOyBjaGkrKykKLQkgICAgewotCSAgICAgIGxlbiArPSBzdHJsZW4gKCIgOiAiKSArIHN0cmxlbiAoZW50cnktPmZpZWxkW2NoaV0pOwotCSAgICB9Ci0JICBuZXdfcnVsZS0+ZXhwcmVzc2lvbiA9IE5aQUxMT0MgKGNoYXIsIGxlbik7Ci0JICBzdHJjcHkgKG5ld19ydWxlLT5leHByZXNzaW9uLCBlbnRyeS0+ZmllbGRbY2FfZXhwcmVzc2lvbl0pOwotCSAgZm9yIChjaGkgPSBjYV9leHByZXNzaW9uICsgMTsgY2hpIDwgZW50cnktPm5yX2ZpZWxkczsgY2hpKyspCi0JICAgIHsKLQkgICAgICBzdHJjYXQgKG5ld19ydWxlLT5leHByZXNzaW9uLCAiIDogIik7Ci0JICAgICAgc3RyY2F0IChuZXdfcnVsZS0+ZXhwcmVzc2lvbiwgZW50cnktPmZpZWxkW2NoaV0pOwotCSAgICB9Ci0JfQotICAgICAgLyogaW5zZXJ0IGl0ICovCi0gICAgICAqbGFzdCA9IG5ld19ydWxlOwotICAgICAgbGFzdCA9ICZuZXdfcnVsZS0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBjYWNoZTsKLX0KLQotCi0KLSNpZmRlZiBNQUlOCi0KLWlnZW5fb3B0aW9ucyBvcHRpb25zOwotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBjYWNoZV9lbnRyeSAqcnVsZXMgPSBOVUxMOwotICBsZiAqbDsKLQotICBpZiAoYXJnYyAhPSAyKQotICAgIGVycm9yIChOVUxMLCAiVXNhZ2U6IGNhY2hlIDxjYWNoZS1maWxlPlxuIik7Ci0KLSAgcnVsZXMgPSBsb2FkX2NhY2hlX3RhYmxlIChhcmd2WzFdKTsKLSAgbCA9IGxmX29wZW4gKCItIiwgInN0ZG91dCIsIGxmX29taXRfcmVmZXJlbmNlcywgbGZfaXNfdGV4dCwgInRtcC1sZC1pbnNuIik7Ci0gIGR1bXBfY2FjaGVfZW50cmllcyAobCwgIigiLCBydWxlcywgIilcbiIpOwotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1jYWNoZS5oIGIvc2ltL2lnZW4vbGQtY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4MWU2YS4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9sZC1jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0KLS8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgLSBsb2FkIGEgc3RhbmRhbG9uZSBjYWNoZSBtYWNybyB0YWJsZSAqLwotCi0vKiBJbnN0cnVjdGlvbiB1bnBhY2tpbmc6Ci0KLSAgIE9uY2UgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGRlY29kZWQsIHRoZSByZWdpc3RlciAoYW5kIG90aGVyKQotICAgZmllbGRzIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24gbmVlZCB0byBiZSBleHRyYWN0ZWQuCi0KLSAgIFRoZSB0YWJsZSB0aGF0IGZvbGxvd3MgZGV0ZXJtaW5lcyBob3cgZWFjaCBmaWVsZCBzaG91bGQgYmUgdHJlYXRlZC4KLSAgIEltcG9ydGFudGx5IGl0IGNvbnNpZGVycyB0aGUgY2FzZSB3aGVyZSB0aGUgZXh0cmFjdGVkIGZpZWxkIGlzIHRvCi0gICBiZSB1c2VkIGltbWVkaWF0bHkgb3Igc3RvcmVkIGluIGFuIGluc3RydWN0aW9uIGNhY2hlLgotCi0gICA8dHlwZT4KLQotICAgSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgY2FjaGUgZW50cnkuICBJZiBhIGNhY2hlIGlzIHRvIGJlCi0gICB1c2VkLiAgU0NSQVRDSCBhbmQgQ0FDSEUgdmFsdWVzIGFyZSBkZWZpbmVkIHdoZW4gYSBjYWNoZSBlbnRyeSBpcwotICAgYmVpbmcgZmlsbGVkIHdoaWxlIENBQ0hFIGFuZCBDT01QVVRFIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB0aGUKLSAgIHNlbWFudGljIGNvZGUuCi0KLSAgIFplcm8gbWFya3MgdGhlIGVuZCBvZiB0aGUgdGFibGUuICBNb3JlIGltcG9ydGFudGx5IDEuIGluZGljYXRlcwotICAgdGhhdCB0aGUgZW50cnkgaXMgdmFsaWQgYW5kIGNhbiBiZSBjYWNoZWQuIDIuIGluZGljYXRlcyB0aGF0IHRoYXQKLSAgIHRoZSBlbnRyeSBpcyB2YWxpZCBidXQgY2FuIG5vdCBiZSBjYWNoZWQuCi0KLSAgIDxmaWVsZF9uYW1lPgotCi0gICBUaGUgZmllbGQgbmFtZSBhcyBnaXZlbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3BlYy4KLQotICAgPGRlcml2ZWRfbmFtZT4KLQotICAgQSBuZXcgbmFtZSBmb3IgPGZpZWxkX25hbWU+IG9uY2UgaXQgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlCi0gICBpbnN0cnVjdGlvbiAoYW5kIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUpLgotCi0gICA8dHlwZT4KLQotICAgU3RyaW5nIHNwZWNpZnlpbmcgdGhlIHN0b3JhZ2UgdHlwZSBmb3IgPG5ld19uYW1lPiAodGhlIGV4dHJhY3RlZAotICAgZmllbGQ+LgotCi0gICA8ZXhwcmVzc2lvbj4KLQotICAgU3BlY2lmaWVzIGhvdyB0byBnZXQgPG5ld19uYW1lPiBmcm9tIDxvbGRfbmFtZT4uICBJZiBudWxsLCBvbGQgYW5kCi0gICBuZXcgbmFtZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAqLwotCi0KLWV4dGVybiBjYWNoZV9lbnRyeSAqbG9hZF9jYWNoZV90YWJsZQotKGNoYXIgKmZpbGVfbmFtZSk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1kZWNvZGUuYyBiL3NpbS9pZ2VuL2xkLWRlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWVhNDA0Li4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2xkLWRlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIGxvYWQgdGhlIG9wY29kZSBzdGF0IHN0cnVjdHVyZSAqLwotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImxkLWRlY29kZS5oIgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotCi1zdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX3R5cGVfbWFwW10gPSB7Ci0gIHsgIm5vcm1hbCIsIG5vcm1hbF9kZWNvZGVfcnVsZSB9LAotICB7ICJib29sZWFuIiwgYm9vbGVhbl9ydWxlIH0sCi0gIHsgTlVMTCwgbm9ybWFsX2RlY29kZV9ydWxlIH0sCi19OwotCi1zdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2dlbl9tYXBbXSA9IHsKLSAgeyAiYXJyYXkiLCBhcnJheV9nZW4gfSwKLSAgeyAic3dpdGNoIiwgc3dpdGNoX2dlbiB9LAotICB7ICJwYWRkZWQtc3dpdGNoIiwgcGFkZGVkX3N3aXRjaF9nZW4gfSwKLSAgeyAiZ290by1zd2l0Y2giLCBnb3RvX3N3aXRjaF9nZW4gfSwKLSAgeyBOVUxMLCAtMSB9LAotfTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9yZXNlcnZlZF9tYXBbXSA9IHsKLSAgeyAiemVyby1yZXNlcnZlZCIsIDEgfSwKLSAgeyBOVUxMLCAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2R1cGxpY2F0ZXNfbWFwW10gPSB7Ci0gIHsgImR1cGxpY2F0ZSIsIDEgfSwKLSAgeyBOVUxMLCAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2NvbWJpbmVfbWFwW10gPSB7Ci0gIHsgImNvbWJpbmUiLCAxIH0sCi0gIHsgTlVMTCwgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9zZWFyY2hfbWFwW10gPSB7Ci0gIHsgImNvbnN0YW50cyIsIGRlY29kZV9maW5kX2NvbnN0YW50cyB9LAotICB7ICJtaXhlZCIsIGRlY29kZV9maW5kX21peGVkIH0sCi0gIHsgInN0cmluZ3MiLCBkZWNvZGVfZmluZF9zdHJpbmdzIH0sCi0gIHsgTlVMTCwgZGVjb2RlX2ZpbmRfbWl4ZWQgfSwKLX07Ci0KLQotc3RhdGljIHZvaWQKLXNldF9iaXRzIChpbnQgYml0W21heF9pbnNuX2JpdF9zaXplXSwKLQkgIHVuc2lnbmVkNjQgdmFsdWUpCi17Ci0gIGludCBiaXRfbnI7Ci0gIGZvciAoYml0X25yID0gMDsgYml0X25yIDwgbWF4X2luc25fYml0X3NpemU7IGJpdF9ucisrKQotICAgIHsKLSAgICAgIGlmIChiaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemUpCi0JYml0W2JpdF9ucl0gPSAodmFsdWUgPj4gKG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIGJpdF9uciAtIDEpKSAmIDE7Ci0gICAgICBlbHNlCi0JYml0W2JpdF9ucl0gPSAwOwotICAgIH0KLX0KLQotZGVjb2RlX3RhYmxlICoKLWxvYWRfZGVjb2RlX3RhYmxlKGNoYXIgKmZpbGVfbmFtZSkKLXsKLSAgdGFibGUgKmZpbGUgPSB0YWJsZV9vcGVuIChmaWxlX25hbWUpOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIGRlY29kZV90YWJsZSAqdGFibGUgPSBOVUxMOwotICBkZWNvZGVfdGFibGUgKipjdXJyX3J1bGUgPSAmdGFibGU7Ci0gIHdoaWxlICgoZW50cnkgPSB0YWJsZV9yZWFkIChmaWxlKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpkZWNvZGVfb3B0aW9ucyA9IGVudHJ5LT5maWVsZFtkZWNvZGVfb3B0aW9uc19maWVsZF07Ci0gICAgICBkZWNvZGVfdGFibGUgKm5ld19ydWxlID0gWkFMTE9DIChkZWNvZGVfdGFibGUpOwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPCBtaW5fbnJfZGVjb2RlX2ZpZWxkcykKLQllcnJvciAoZW50cnktPmxpbmUsICJNaXNzaW5nIGRlY29kZSB0YWJsZSBmaWVsZHNcbiIpOwotICAgICAgbmV3X3J1bGUtPmxpbmUgPSBlbnRyeS0+bGluZTsKLQotICAgICAgLyogdGhlIG9wdGlvbnMgZmllbGQgKi8KLSAgICAgIG5ld19ydWxlLT50eXBlID0gbmFtZTJpIChkZWNvZGVfb3B0aW9ucywgZGVjb2RlX3R5cGVfbWFwKTsKLSAgICAgIGlmIChvcHRpb25zLmRlY29kZS5vdmVycmlkaW5nX2dlbiAhPSBOVUxMKQotCW5ld19ydWxlLT5nZW4gPSBuYW1lMmkgKG9wdGlvbnMuZGVjb2RlLm92ZXJyaWRpbmdfZ2VuLCBkZWNvZGVfZ2VuX21hcCk7Ci0gICAgICBlbHNlCi0JbmV3X3J1bGUtPmdlbiA9IG5hbWUyaSAoZGVjb2RlX29wdGlvbnMsIGRlY29kZV9nZW5fbWFwKTsKLSAgICAgIGlmIChuZXdfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuCi0JICAmJiBvcHRpb25zLmRlY29kZS5zd2l0Y2hfYXNfZ290bykKLQluZXdfcnVsZS0+Z2VuID0gZ290b19zd2l0Y2hfZ2VuOwotICAgICAgaWYgKG9wdGlvbnMuZGVjb2RlLnplcm9fcmVzZXJ2ZWQpCi0JbmV3X3J1bGUtPndpdGhfemVyb19yZXNlcnZlZCA9IDE7Ci0gICAgICBlbHNlCi0JbmV3X3J1bGUtPndpdGhfemVyb19yZXNlcnZlZCA9IG5hbWUyaSAoZGVjb2RlX29wdGlvbnMsIGRlY29kZV9yZXNlcnZlZF9tYXApOwotICAgICAgaWYgKG9wdGlvbnMuZGVjb2RlLmR1cGxpY2F0ZSkKLQluZXdfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID0gMTsKLSAgICAgIGVsc2UKLQluZXdfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID0gbmFtZTJpIChkZWNvZGVfb3B0aW9ucywgZGVjb2RlX2R1cGxpY2F0ZXNfbWFwKTsKLSAgICAgIGlmIChvcHRpb25zLmRlY29kZS5jb21iaW5lKQotCW5ld19ydWxlLT53aXRoX2NvbWJpbmUgPSAxOwotICAgICAgZWxzZQotCW5ld19ydWxlLT53aXRoX2NvbWJpbmUgPSBuYW1lMmkgKGRlY29kZV9vcHRpb25zLCBkZWNvZGVfY29tYmluZV9tYXApOwotICAgICAgaWYgKG5ld19ydWxlLT50eXBlID09IGJvb2xlYW5fcnVsZSkKLQl7Ci0JICBjaGFyICpjaHAgPSBkZWNvZGVfb3B0aW9uczsKLQkgIHdoaWxlICgqY2hwICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoaXNkaWdpdCAoKmNocCkpCi0JCXsKLQkJICBuZXdfcnVsZS0+Y29uc3RhbnQgPSBhMmkgKGNocCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBjaHAgPSBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiLCIpOwotCSAgICAgIGNocCA9IHNraXBfc3BhY2VzIChjaHApOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaXJzdCBhbmQgbGFzdCAqLwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfZmlyc3RfZmllbGQKLQkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9maXJzdF9maWVsZF0pID4gMCkKLQl7Ci0JICBuZXdfcnVsZS0+Zmlyc3QgPSB0YXJnZXRfYTJpIChvcHRpb25zLmhpX2JpdF9uciwKLQkJCQkJZW50cnktPmZpZWxkW2RlY29kZV9maXJzdF9maWVsZF0pOwotCSAgaWYgKG5ld19ydWxlLT5maXJzdCA8IDAgfHwgbmV3X3J1bGUtPmZpcnN0ID49IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSkKLQkgICAgZXJyb3IgKG5ld19ydWxlLT5saW5lLCAiRmlyc3QgZmllbGQgb3V0IG9mIHJhbmdlXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV3X3J1bGUtPmZpcnN0ID0gMDsKLSAgICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZGVjb2RlX2xhc3RfZmllbGQKLQkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9sYXN0X2ZpZWxkXSkgPiAwKQotCXsKLQkgIG5ld19ydWxlLT5sYXN0ID0gdGFyZ2V0X2EyaSAob3B0aW9ucy5oaV9iaXRfbnIsCi0JCQkJICAgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfbGFzdF9maWVsZF0pOwotCSAgaWYgKG5ld19ydWxlLT5sYXN0IDwgMCB8fCBuZXdfcnVsZS0+bGFzdCA+PSBvcHRpb25zLmluc25fYml0X3NpemUpCi0JICAgIGVycm9yIChuZXdfcnVsZS0+bGluZSwgIkxhc3QgZmllbGQgb3V0IG9mIHJhbmdlXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV3X3J1bGUtPmxhc3QgPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxOwotICAgICAgaWYgKG5ld19ydWxlLT5maXJzdCA+IG5ld19ydWxlLT5sYXN0KQotCWVycm9yIChuZXdfcnVsZS0+bGluZSwgIkZpcnN0IG11c3QgcHJlY2VlZCBsYXN0XG4iKTsKLQotICAgICAgLyogZm9yY2UgZmlyc3QvbGFzdCwgd2l0aCBkZWZhdWx0IHZhbHVlcyBiYXNlZCBvbiBmaXJzdC9sYXN0ICovCi0gICAgICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IGRlY29kZV9mb3JjZV9maXJzdF9maWVsZAotCSAgJiYgc3RybGVuIChlbnRyeS0+ZmllbGRbZGVjb2RlX2ZvcmNlX2ZpcnN0X2ZpZWxkXSkgPiAwKQotCXsKLQkgIG5ld19ydWxlLT5mb3JjZV9maXJzdCA9IHRhcmdldF9hMmkgKG9wdGlvbnMuaGlfYml0X25yLAotCQkJCQkgICAgICBlbnRyeS0+ZmllbGRbZGVjb2RlX2ZvcmNlX2ZpcnN0X2ZpZWxkXSk7Ci0JICBpZiAobmV3X3J1bGUtPmZvcmNlX2ZpcnN0IDwgbmV3X3J1bGUtPmZpcnN0Ci0JICAgICAgfHwgbmV3X3J1bGUtPmZvcmNlX2ZpcnN0ID4gbmV3X3J1bGUtPmxhc3QgKyAxKQotCSAgICBlcnJvciAobmV3X3J1bGUtPmxpbmUsICJGb3JjZSBmaXJzdCBvdXQgb2YgcmFuZ2VcbiIpOwotCX0KLSAgICAgIGVsc2UKLQluZXdfcnVsZS0+Zm9yY2VfZmlyc3QgPSBuZXdfcnVsZS0+bGFzdCArIDE7Ci0gICAgICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IGRlY29kZV9mb3JjZV9sYXN0X2ZpZWxkCi0JICAmJiBzdHJsZW4gKGVudHJ5LT5maWVsZFtkZWNvZGVfZm9yY2VfbGFzdF9maWVsZF0pID4gMCkKLQl7Ci0JICBuZXdfcnVsZS0+Zm9yY2VfbGFzdCA9IHRhcmdldF9hMmkgKG9wdGlvbnMuaGlfYml0X25yLAotCQkJCQkgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfZm9yY2VfbGFzdF9maWVsZF0pOwotCSAgaWYgKG5ld19ydWxlLT5mb3JjZV9sYXN0ID4gbmV3X3J1bGUtPmxhc3QKLQkgICAgICB8fCBuZXdfcnVsZS0+Zm9yY2VfbGFzdCA8IG5ld19ydWxlLT5maXJzdCAtIDEpCi0JICAgIGVycm9yIChuZXdfcnVsZS0+bGluZSwgIkZvcmNlLWxhc3Qgb3V0IG9mIHJhbmdlXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV3X3J1bGUtPmZvcmNlX2xhc3QgPSBuZXdfcnVsZS0+Zmlyc3QgLSAxOwotCi0gICAgICAvKiBmaWVsZHMgdG8gYmUgdHJlYXRlZCBhcyBjb25zdGFudCAqLwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfY29uc3RhbnRfZmllbGRfbmFtZXNfZmllbGQpCi0JZmlsdGVyX3BhcnNlICgmbmV3X3J1bGUtPmNvbnN0YW50X2ZpZWxkX25hbWVzLAotCQkgICAgICBlbnRyeS0+ZmllbGRbZGVjb2RlX2NvbnN0YW50X2ZpZWxkX25hbWVzX2ZpZWxkXSk7Ci0KLSAgICAgIC8qIGFwcGxpY2FibGUgd29yZCBuciAqLwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfd29yZF9ucl9maWVsZCkKLQluZXdfcnVsZS0+d29yZF9uciA9IGEyaSAoZW50cnktPmZpZWxkW2RlY29kZV93b3JkX25yX2ZpZWxkXSk7Ci0KLSAgICAgIC8qIHJlcXVpcmVkIGluc3RydWN0aW9uIGZvcm1hdCBuYW1lcyAqLwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfZm9ybWF0X25hbWVzX2ZpZWxkKQotCWZpbHRlcl9wYXJzZSAoJm5ld19ydWxlLT5mb3JtYXRfbmFtZXMsCi0JCSAgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfZm9ybWF0X25hbWVzX2ZpZWxkXSk7Ci0KLSAgICAgIC8qIHJlcXVpcmVkIHByb2Nlc3NvciBtb2RlbHMgKi8KLSAgICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZGVjb2RlX21vZGVsX25hbWVzX2ZpZWxkKQotCWZpbHRlcl9wYXJzZSAoJm5ld19ydWxlLT5tb2RlbF9uYW1lcywKLQkJICAgICAgZW50cnktPmZpZWxkW2RlY29kZV9tb2RlbF9uYW1lc19maWVsZF0pOwotCi0gICAgICAvKiByZXF1aXJlZCBwYXRocyAqLwotICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfcGF0aHNfZmllbGQKLQkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9wYXRoc19maWVsZF0pID4gMCkKLQl7Ci0JICBkZWNvZGVfcGF0aF9saXN0ICoqbGFzdCA9ICZuZXdfcnVsZS0+cGF0aHM7Ci0JICBjaGFyICpjaHAgPSBlbnRyeS0+ZmllbGRbZGVjb2RlX3BhdGhzX2ZpZWxkXTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICAoKmxhc3QpID0gWkFMTE9DIChkZWNvZGVfcGF0aF9saXN0KTsKLQkgICAgICAvKiBleHRyYSByb290L3plcm8gZW50cnkgKi8KLQkgICAgICAoKmxhc3QpLT5wYXRoID0gWkFMTE9DIChkZWNvZGVfcGF0aCk7IAotCSAgICAgIGRvCi0JCXsKLQkJICBkZWNvZGVfcGF0aCAqZW50cnkgPSBaQUxMT0MgKGRlY29kZV9wYXRoKTsKLQkJICBlbnRyeS0+b3Bjb2RlX25yID0gYTJpIChjaHApOwotCQkgIGVudHJ5LT5wYXJlbnQgPSAoKmxhc3QpLT5wYXRoOwotCQkgICgqbGFzdCktPnBhdGggPSBlbnRyeTsKLQkJICBjaHAgPSBza2lwX2RpZ2l0cyAoY2hwKTsKLQkJICBjaHAgPSBza2lwX3NwYWNlcyAoY2hwKTsKLQkJfQotCSAgICAgIHdoaWxlICgqY2hwID09ICcuJyk7Ci0JICAgICAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoKmNocCA9PSAnLCcpOwotCSAgaWYgKCpjaHAgIT0gJ1wwJykKLQkgICAgZXJyb3IgKGVudHJ5LT5saW5lLCAiSW52YWxpZCBwYXRoIGZpZWxkXG4iKTsKLQl9Ci0KLSAgICAgIC8qIGNvbGxlY3QgdXAgdGhlIGxpc3Qgb2Ygb3B0aW9uYWwgc3BlY2lhbCBjb25kaXRpb25zIGFwcGxpY2FibGUKLSAgICAgICAgIHRvIHRoZSBydWxlICovCi0gICAgICB7Ci0JaW50IGZpZWxkX25yID0gbnJfZGVjb2RlX2ZpZWxkczsKLQl3aGlsZSAoZW50cnktPm5yX2ZpZWxkcyA+IGZpZWxkX25yKQotCSAgewotCSAgICBkZWNvZGVfY29uZCAqY29uZCA9IFpBTExPQyAoZGVjb2RlX2NvbmQpOwotCSAgICBkZWNvZGVfY29uZCAqKmxhc3Q7Ci0JICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZmllbGRfbnIgKyBkZWNvZGVfY29uZF9tYXNrX2ZpZWxkKQotCSAgICAgIHNldF9iaXRzIChjb25kLT5tYXNrLCBhMmkgKGVudHJ5LT5maWVsZFtmaWVsZF9uciArIGRlY29kZV9jb25kX21hc2tfZmllbGRdKSk7Ci0JICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZCkKLSAgICAgICAgICAgICAgewotCSAgICAgIGlmIChlbnRyeS0+ZmllbGRbZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZF1bMF0gPT0gJyEnKQotCQl7Ci0JCSAgY29uZC0+aXNfZXF1YWwgPSAwOwotCQkgIHNldF9iaXRzIChjb25kLT52YWx1ZSwgYTJpIChlbnRyeS0+ZmllbGRbZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZF0gKyAxKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25kLT5pc19lcXVhbCA9IDE7Ci0JCSAgc2V0X2JpdHMgKGNvbmQtPnZhbHVlLCBhMmkgKGVudHJ5LT5maWVsZFtmaWVsZF9uciArIGRlY29kZV9jb25kX3ZhbHVlX2ZpZWxkXSkpOwotCQl9Ci0gICAgICAgICAgICAgIH0KLQkgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBmaWVsZF9uciArIGRlY29kZV9jb25kX3dvcmRfbnJfZmllbGQpCi0JICAgICAgY29uZC0+d29yZF9uciA9IGEyaSAoZW50cnktPmZpZWxkW2ZpZWxkX25yICsgZGVjb2RlX2NvbmRfd29yZF9ucl9maWVsZF0pOwotCSAgICBmaWVsZF9uciArPSBucl9kZWNvZGVfY29uZF9maWVsZHM7Ci0JICAgIC8qIGluc2VydCBpdCAqLwotCSAgICBsYXN0ID0gJm5ld19ydWxlLT5jb25kaXRpb25zOwotCSAgICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKLQkgICAgICBsYXN0ID0gJigqbGFzdCktPm5leHQ7Ci0JICAgICpsYXN0ID0gY29uZDsKLQkgIH0KLSAgICAgIH0KLSAgICAgICpjdXJyX3J1bGUgPSBuZXdfcnVsZTsKLSAgICAgIGN1cnJfcnVsZSA9ICZuZXdfcnVsZS0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiB0YWJsZTsKLX0KLQotICAKLWludAotZGVjb2RlX3RhYmxlX21heF93b3JkX25yIChkZWNvZGVfdGFibGUgKmVudHJ5KQotewotICBpbnQgbWF4X3dvcmRfbnIgPSAwOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWNvZGVfY29uZCAqY29uZDsKLSAgICAgIGlmIChlbnRyeS0+d29yZF9uciA+IG1heF93b3JkX25yKQotCW1heF93b3JkX25yID0gZW50cnktPndvcmRfbnI7Ci0gICAgICBmb3IgKGNvbmQgPSBlbnRyeS0+Y29uZGl0aW9uczsgY29uZCAhPSBOVUxMOyBjb25kID0gY29uZC0+bmV4dCkKLQl7Ci0JICBpZiAoY29uZC0+d29yZF9uciA+IG1heF93b3JkX25yKQotCSAgICBtYXhfd29yZF9uciA9IGNvbmQtPndvcmRfbnI7Ci0JfQotICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBtYXhfd29yZF9ucjsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2RlY29kZV9jb25kIChsZiAqZmlsZSwKLQkJICBjaGFyICpwcmVmaXgsCi0JCSAgZGVjb2RlX2NvbmQgKmNvbmQsCi0JCSAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhkZWNvZGVfY29uZCAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGNvbmQpOwotICBpZiAoY29uZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od29yZF9uciAlZCkiLCBjb25kLT53b3JkX25yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG1hc2sgMHglbHgpIiwgKGxvbmcpIGNvbmQtPm1hc2spOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odmFsdWUgMHglbHgpIiwgKGxvbmcpIGNvbmQtPnZhbHVlKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGlzX2VxdWFsIDB4JWx4KSIsIChsb25nKSBjb25kLT5pc19lcXVhbCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuZXh0IChkZWNvZGVfY29uZCAqKSAwJWx4KSIsIChsb25nKSBjb25kLT5uZXh0KTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2RlY29kZV9jb25kcyAobGYgKmZpbGUsCi0JCSAgIGNoYXIgKnByZWZpeCwKLQkJICAgZGVjb2RlX2NvbmQgKmNvbmQsCi0JCSAgIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMoZGVjb2RlX2NvbmQgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBjb25kKTsKLSAgd2hpbGUgKGNvbmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2RlY29kZV9jb25kIChmaWxlLCAiXG4oIiwgY29uZCwgIikiKTsKLSAgICAgIGNvbmQgPSBjb25kLT5uZXh0OwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLXZvaWQKLWR1bXBfZGVjb2RlX3J1bGUgKGxmICpmaWxlLAotCQkgIGNoYXIgKnByZWZpeCwKLQkJICBkZWNvZGVfdGFibGUgKnJ1bGUsCi0JCSAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhkZWNvZGVfdGFibGUgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBydWxlKTsKLSAgaWYgKHJ1bGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIHJ1bGUtPmxpbmUsICIpIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbih0eXBlICVzKSIsIGkybmFtZShydWxlLT50eXBlLCBkZWNvZGVfdHlwZV9tYXApKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGdlbiAlcykiLCBpMm5hbWUocnVsZS0+Z2VuLCBkZWNvZGVfZ2VuX21hcCkpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZmlyc3QgJWQpIiwgcnVsZS0+Zmlyc3QpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obGFzdCAlZCkiLCBydWxlLT5sYXN0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZvcmNlX2ZpcnN0ICVkKSIsIHJ1bGUtPmZvcmNlX2ZpcnN0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZvcmNlX2xhc3QgJWQpIiwgcnVsZS0+Zm9yY2VfbGFzdCk7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGNvbnN0YW50X2ZpZWxkX25hbWVzIFwiIiwgcnVsZS0+Y29uc3RhbnRfZmllbGRfbmFtZXMsICJcIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGNvbnN0YW50IDB4JXgpIiwgcnVsZS0+Y29uc3RhbnQpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od29yZF9uciAlZCkiLCBydWxlLT53b3JkX25yKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHdpdGhfemVyb19yZXNlcnZlZCAlZCkiLCBydWxlLT53aXRoX3plcm9fcmVzZXJ2ZWQpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od2l0aF9kdXBsaWNhdGVzICVkKSIsIHJ1bGUtPndpdGhfZHVwbGljYXRlcyk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbih3aXRoX2NvbWJpbmUgJWQpIiwgcnVsZS0+d2l0aF9jb21iaW5lKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZm9ybWF0X25hbWVzIFwiIiwgcnVsZS0+Zm9ybWF0X25hbWVzLCAiXCIpIik7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKG1vZGVsX25hbWVzIFwiIiwgcnVsZS0+bW9kZWxfbmFtZXMsICJcIikiKTsKLSAgICAgIGR1bXBfZGVjb2RlX2NvbmRzIChmaWxlLCAiXG4oY29uZGl0aW9ucyAiLCBydWxlLT5jb25kaXRpb25zLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgcnVsZS0+bmV4dCk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi0jaWZkZWYgTUFJTgotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWNvZGVfcnVsZXMgKGxmICpmaWxlLAotCQkgICBjaGFyICpwcmVmaXgsCi0JCSAgIGRlY29kZV90YWJsZSAqcnVsZSwKLQkJICAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIHdoaWxlIChydWxlICE9IE5VTEwpCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBkdW1wX2RlY29kZV9ydWxlIChmaWxlLCAiXG4oIiwgcnVsZSwgIikiKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgICAgcnVsZSA9IHJ1bGUtPm5leHQ7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLWlnZW5fb3B0aW9ucyBvcHRpb25zOwotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBsZiAqbDsKLSAgZGVjb2RlX3RhYmxlICpydWxlczsKLQotICBJTklUX09QVElPTlMgKG9wdGlvbnMpOwotCi0gIGlmIChhcmdjICE9IDMpCi0gICAgZXJyb3IgKE5VTEwsICJVc2FnZTogZGVjb2RlIDxkZWNvZGUtZmlsZT4gPGhpLWJpdC1ucj5cbiIpOwotCi0gIG9wdGlvbnMuaGlfYml0X25yID0gYTJpIChhcmd2WzJdKTsKLSAgcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZSAoYXJndlsxXSk7Ci0gIGwgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJ0bXAtbGQtaW5zbiIpOwotICBkdW1wX2RlY29kZV9ydWxlcyAobCwgIihydWxlcyAiLCBydWxlcywgIilcbiIpOwotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1kZWNvZGUuaCBiL3NpbS9pZ2VuL2xkLWRlY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRhMjMxLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2xkLWRlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIEluc3RydWN0aW9uIGRlY29kZSB0YWJsZToKLQotICAgPGRlY29kZS1ydWxlPiA6Oj0KLSAgICAgICB7IDxvcHRpb24+IH0KLSAgICAgICAiOiIgWyA8Zmlyc3Q+IF0KLSAgICAgICAiOiIgWyA8bGFzdD4gXQotICAgICAgICI6IiBbIDxmb3JjZS1maXJzdD4gXQotICAgICAgICI6IiBbIDxmb3JjZS1sYXN0PiBdCi0gICAgICAgIjoiIFsgPGNvbnN0YW50LWZpZWxkLW5hbWVzPiBdCi0gICAgICAgIjoiIFsgPHdvcmQtbnI+IF0KLSAgICAgICAiOiIgWyA8Zm9ybWF0LW5hbWVzPiBdCi0gICAgICAgIjoiIFsgPG1vZGVsLW5hbWVzPiBdCi0gICAgICAgIjoiIFsgPGNvbnN0YW50PiBdCi0gICAgICAgIjoiIFsgPHBhdGg+IHsgIiwiIDxwYXRoPiB9IF0KLSAgICAgICB7ICI6IiA8c3BlY2lhbC1tYXNrPgotICAgICAgICAgIjoiIFsgIiEiIF0gPHNwZWNpYWwtdmFsdWU+Ci0gICAgICAgICAiOiIgPHdvcmQtbnI+IH0KLSAgICAgICA8bmw+Ci0gICAgICAgOwotCi0KLSAgIDxwYXRoPiA6Oj0gPGludD4gIiwiIDxpbnQ+IDs7Ci0KLSAgIDxvcHRpb24+IDo6PQotICAgICAgIDxyZXNlcnZlZC1vcHRpb25zPgotICAgICAgIHwgPGNvZGUtb3B0aW9ucz4KLSAgICAgICB8IDxvcHRpbWl6ZS1vcHRpb25zPgotICAgICAgIHwgPGRlY29kZS1vcHRpb25zPgotICAgICAgIHwgPGNvbnN0YW50PgotICAgICAgIHwgPHNlYXJjaC1vcHRpb25zPgotICAgICAgIDsKLQotICAgPHJlc2VydmVkLW9wdGlvbnM+IDo6PSAiemVyby1yZXNlcnZlZCIgOwotICAgPGdlbi1vcHRpb25zPiA6Oj0gImFycmF5IiB8ICJzd2l0Y2giIHwgInBhZGRlZC1zd2l0Y2giIHwgImdvdG8tc3dpdGNoIiA7Ci0gICA8b3B0aW1pemUtb3B0aW9ucz4gOjo9ICJkdXBsaWNhdGUiIHwgImNvbWJpbmUiCi0gICA8ZGVjb2RlLW9wdGlvbnM+IDo6PSAibm9ybWFsIiB8ICJib29sZWFuIiA7Ci0gICA8c2VhcmNoLW9wdGlvbnM+IDo6PSAiY29uc3RhbnRzIiB8ICJ2YXJpYWJsZXMiIHwgIm1peGVkIgotCi0gICBJZ25vcmUgdGhlIGJlbG93OgotCi0KLSAgIFRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgdGFibGUgY29udGFpbnMgcnVsZXMgdGhhdCBkaWN0YXRlIGhvdyBpZ2VuCi0gICBpcyBnb2luZyB0byBmaXJzdGx5IGJyZWFrIGRvd24gdGhlIG9wY29kZSB0YWJsZSBhbmQgc2Vjb25kbHkKLQotICAgVGhlIHRhYmxlIHRoYXQgZm9sbG93cyBpcyB1c2VkIGJ5IGdlbiB0byBjb25zdHJ1Y3QgYSBkZWNpc2lvbiB0cmVlCi0gICB0aGF0IGNhbiBpZGVudGlmeSBlYWNoIHBvc3NpYmxlIGluc3RydWN0aW9uLiAgR2VuIHRoZW4gb3V0cHV0cyB0aGlzCi0gICBkZWNpc2lvbiB0cmVlIGFzIChhY2NvcmRpbmcgdG8gY29uZmlnKSBhIHRhYmxlIG9yIHN3aXRjaCBzdGF0ZW1lbnQKLSAgIGFzIHRoZSBmdW5jdGlvbiBpZGVjb2RlLgotCi0gICBJbiBwYXJhbGxlbCB0byB0aGlzLCBhcyBtZW50aW9uZWQgYWJvdmUsIFdJVEhfRVhQQU5ERURfU0VNQU5USUNTCi0gICBkZXRlcm1pbmVzIG9mIHRoZSBzZW1hbnRpYyBmdW5jdGlvbnMgdGhlbXNlbHZlcyBzaG91bGQgYmUgZXhwYW5kZWQKLSAgIGluIGEgc2ltaWxhciB3YXkuCi0KLSAgIDxmaXJzdD4KLSAgIDxsYXN0PgotCi0gICBSYW5nZSBvZiBiaXRzICh3aXRoaW4gdGhlIGluc3RydWN0aW9uKSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IKLSAgIGFuIGluc3RydWN0aW9uIGZpZWxkLiAgV2l0aGluIHN1Y2ggcmFuZ2VzLCBnZW4gbG9va3MgZm9yIG9wY29kZXMKLSAgIChjb25zdGFudHMpLCByZWdpc3RlcnMgKHN0cmluZ3MpIGFuZCByZXNlcnZlZCBiaXRzIChzbGFzaCkgYW5kCi0gICBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHRoYXQgZm9sbG93cyBpbmNsdWRlcyBvciBleGNsdWRlcyB0aGVtIGZyb20KLSAgIGEgcG9zc2libGUgaW5zdHJ1Y3Rpb24gZmllbGQuCi0KLSAgIDxmb3JjZV9maXJzdD4KLSAgIDxmb3JjZV9sYXN0PgotCi0gICBJZiBhbiBpbnN0cnVjdGlvbiBmaWVsZCB3YXMgZm91bmQsIGVubGFyZ2UgdGhlIGZpZWxkIHNpemUgc28gdGhhdAotICAgaXQgaXMgZm9yY2VkIHRvIGF0IGxlYXN0IGluY2x1ZGUgYml0cyBzdGFydGluZyBmcm9tIDxmb3JjZV9maXJzdD4KLSAgICg8Zm9yY2VfbGFzdD4pLiAgVG8gc3RvcCB0aGlzIG9jY3VyaW5nLCB1c2UgPGZvcmNlX2ZpcnN0PiA9IDxsYXN0PgotICAgKyAxIGFuZCA8Zm9yY2VfbGFzdD4gPSA8Zmlyc3Q+IC0gMS4KLQotICAgPGZvcmNlX3Jlc2VydmVkPgotCi0gICBUcmVhdCBgLycgKHJlc2VydmVkKSBmaWVsZHMgYXMgYSBjb25zdGFudCAoemVybykgaW5zdGVhZCBvZgotICAgdmFyaWFibGUgd2hlbiBsb29raW5nIGZvciBhbiBpbnN0cnVjdGlvbiBmaWVsZC4KLQotICAgPGZvcmNlX2V4cGFuc2lvbj4KLQotICAgVHJlYXQgYW55IGNvbnRhaW5lZCByZWdpc3RlciAoc3RyaW5nKSBmaWVsZHMgYXMgY29uc3RhbnQgd2hlbgotICAgZGV0ZXJtaW5pbmcgdGhlIGluc3RydWN0aW9uIGZpZWxkLiAgRm9yIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgKGFuZAotICAgY29udHJvbGVkIGJ5IElERUNPREVfRVhQQU5EX1NFTUFOVElDUykgdGhpcyBmb3JjZXMgdGhlIGV4cGFuc2lvbiBvZgotICAgd2hhdCB3b3VsZCBvdGhlcndpemUgYmUgbm9uIGNvbnN0YW50IGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0KLSAgIDx1c2Vfc3dpdGNoPgotCi0gICBTaG91bGQgdGhpcyB0YWJsZSBiZSBleHBhbmRlZCB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgKHZhbCAxKSBhbmQKLSAgIGlmIHNvLCBzaG91bGQgaXQgYmUgcGFkZGVkIHdpdGggZW50cmllcyBzbyBhcyB0byBmb3JjZSB0aGUgY29tcGlsZXIKLSAgIHRvIGdlbmVyYXRlIGEganVtcCB0YWJsZSAodmFsIDIpLiBPciBhIGJyYW5jaCB0YWJsZSAodmFsIDMpLgotCi0gICA8c3BlY2lhbF9tYXNrPgotICAgPHNwZWNpYWxfdmFsdWU+Ci0gICA8c3BlY2lhbF9ydWxlPgotICAgPHNwZWNpYWxfY29uc3RhbnQ+Ci0KLSAgIFNwZWNpYWwgcnVsZSB0byBmaW5lIHR1bmUgaG93IHNwZWNpZmljIChvciBncm91cHMpIG9mIGluc3RydWN0aW9ucwotICAgYXJlIGV4cGFuZGVkLiAgVGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhlIHJ1bGUgaXMgZGV0ZXJtaW5lZCBieQotCi0gICAgIDxzcGVjaWFsX21hc2s+ICE9IDAgJiYgKGluc3RydWN0aW9uPiAmIDxzcGVjaWFsX21hc2s+KSA9PSA8c3BlY2lhbF92YWx1ZT4KLQotICAgV2hlcmUgPGluc3RydWN0aW9uPiBpcyBvYnRhaW5lZCBieSBsb29raW5nIG9ubHkgYXQgY29uc3RhbnQgZmllbGRzCi0gICB3aXRoIGluIGFuIGluc3RydWN0aW9ucyBzcGVjLiAgV2hlbiBkZXRlcm1pbmluZyBhbiBleHBhbnNpb24sIHRoZQotICAgcnVsZSBpcyBvbmx5IGNvbnNpZGVyZWQgd2hlbiBhIG5vZGUgY29udGFpbnMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCi0gICA8c3BlY2lhbF9ydWxlPiBjYW4gYmUgYW55IG9mOgotCi0gICAgICAgIDA6IGZvciB0aGlzIGluc3RydWN0aW9uLCBleHBhbmQgYnkgZWFybGllciBydWxlcwotICAgCTE6IGV4cGFuZCBiaXRzIDxmb3JjZV9sb3c+IC4uIDxmb3JjZV9oaT4gb25seQotCTI6IGJvb2xlYW4gZXhwYW5zaW9uIG9mIG9ubHkgemVyby9ub24temVybyBjYXNlcwotCTM6IGJvb2xlYW4gZXhwYW5zaW9uIG9mIGVxdWFsaXR5IG9mIHNwZWNpYWwgY29uc3RhbnQKLQotCSovCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgbm9ybWFsX2RlY29kZV9ydWxlLAotICBib29sZWFuX3J1bGUsCi19IGRlY29kZV9zcGVjaWFsX3R5cGU7Ci0KLQotdHlwZWRlZiBlbnVtIHsKLSAgaW52YWxpZF9nZW4sCi0gIGFycmF5X2dlbiwKLSAgc3dpdGNoX2dlbiwKLSAgcGFkZGVkX3N3aXRjaF9nZW4sCi0gIGdvdG9fc3dpdGNoX2dlbiwKLX0gZGVjb2RlX2dlbl90eXBlOwotCi0KLWVudW0gewotICBkZWNvZGVfY29uZF9tYXNrX2ZpZWxkLAotICBkZWNvZGVfY29uZF92YWx1ZV9maWVsZCwKLSAgZGVjb2RlX2NvbmRfd29yZF9ucl9maWVsZCwKLSAgbnJfZGVjb2RlX2NvbmRfZmllbGRzLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2RlY29kZV9wYXRoIGRlY29kZV9wYXRoOwotc3RydWN0IF9kZWNvZGVfcGF0aCB7Ci0gIGludCBvcGNvZGVfbnI7Ci0gIGRlY29kZV9wYXRoICpwYXJlbnQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfZGVjb2RlX3BhdGhfbGlzdCBkZWNvZGVfcGF0aF9saXN0Owotc3RydWN0IF9kZWNvZGVfcGF0aF9saXN0IHsKLSAgZGVjb2RlX3BhdGggKnBhdGg7Ci0gIGRlY29kZV9wYXRoX2xpc3QgKm5leHQ7Ci19OwotCi0KLXR5cGVkZWYgc3RydWN0IF9kZWNvZGVfY29uZCBkZWNvZGVfY29uZDsKLXN0cnVjdCBfZGVjb2RlX2NvbmQgewotICBpbnQgd29yZF9ucjsKLSAgaW50IG1hc2tbbWF4X2luc25fYml0X3NpemVdOwotICBpbnQgdmFsdWVbbWF4X2luc25fYml0X3NpemVdOwotICBpbnQgaXNfZXF1YWw7Ci0gIGRlY29kZV9jb25kICpuZXh0OwotfTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgZGVjb2RlX2ZpbmRfbWl4ZWQsCi0gIGRlY29kZV9maW5kX2NvbnN0YW50cywKLSAgZGVjb2RlX2ZpbmRfc3RyaW5ncywKLX0gZGVjb2RlX3NlYXJjaF90eXBlOwotCi1lbnVtIHsKLSAgZGVjb2RlX29wdGlvbnNfZmllbGQsCi0gIGRlY29kZV9maXJzdF9maWVsZCwKLSAgZGVjb2RlX2xhc3RfZmllbGQsCi0gIGRlY29kZV9mb3JjZV9maXJzdF9maWVsZCwKLSAgZGVjb2RlX2ZvcmNlX2xhc3RfZmllbGQsCi0gIGRlY29kZV9jb25zdGFudF9maWVsZF9uYW1lc19maWVsZCwKLSAgZGVjb2RlX3dvcmRfbnJfZmllbGQsCi0gIGRlY29kZV9mb3JtYXRfbmFtZXNfZmllbGQsCi0gIGRlY29kZV9tb2RlbF9uYW1lc19maWVsZCwKLSAgZGVjb2RlX3BhdGhzX2ZpZWxkLAotICBucl9kZWNvZGVfZmllbGRzLAotICBtaW5fbnJfZGVjb2RlX2ZpZWxkcyA9IGRlY29kZV9sYXN0X2ZpZWxkICsgMSwKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2RlY29kZV90YWJsZSBkZWNvZGVfdGFibGU7Ci1zdHJ1Y3QgX2RlY29kZV90YWJsZSB7Ci0gIGxpbmVfcmVmICpsaW5lOwotICBkZWNvZGVfc3BlY2lhbF90eXBlIHR5cGU7Ci0gIGRlY29kZV9nZW5fdHlwZSBnZW47Ci0gIGRlY29kZV9zZWFyY2hfdHlwZSBzZWFyY2g7Ci0gIGludCBmaXJzdDsKLSAgaW50IGxhc3Q7Ci0gIGludCBmb3JjZV9maXJzdDsKLSAgaW50IGZvcmNlX2xhc3Q7Ci0gIGZpbHRlciAqY29uc3RhbnRfZmllbGRfbmFtZXM7Ci0gIGludCB3b3JkX25yOwotICAvKiBpZiBhIGJvb2xlYW4gKi8KLSAgdW5zaWduZWQgY29uc3RhbnQ7Ci0gIC8qIG9wdGlvbnMgKi8KLSAgaW50IHdpdGhfemVyb19yZXNlcnZlZDsKLSAgaW50IHdpdGhfZHVwbGljYXRlczsKLSAgaW50IHdpdGhfY29tYmluZTsKLSAgLyogY29uZGl0aW9ucyBvbiB0aGUgcnVsZSBiZWluZyBhcHBsaWVkICovCi0gIGRlY29kZV9wYXRoX2xpc3QgKnBhdGhzOwotICBmaWx0ZXIgKmZvcm1hdF9uYW1lczsKLSAgZmlsdGVyICptb2RlbF9uYW1lczsKLSAgZGVjb2RlX2NvbmQgKmNvbmRpdGlvbnM7Ci0gIGRlY29kZV90YWJsZSAqbmV4dDsKLX07Ci0KLQotZXh0ZXJuIGRlY29kZV90YWJsZSAqbG9hZF9kZWNvZGVfdGFibGUKLShjaGFyICpmaWxlX25hbWUpOwotCi1leHRlcm4gaW50IGRlY29kZV90YWJsZV9tYXhfd29yZF9ucgotKGRlY29kZV90YWJsZSAqcnVsZSk7Ci0KLWV4dGVybiB2b2lkIGR1bXBfZGVjb2RlX3J1bGUKLShsZiAqZmlsZSwKLSBjaGFyICpwcmVmaXgsCi0gZGVjb2RlX3RhYmxlICpydWxlLAotIGNoYXIgKnN1ZmZpeCk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1pbnNuLmMgYi9zaW0vaWdlbi9sZC1pbnNuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTIxOTkuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vbGQtaW5zbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJmaWx0ZXIuaCIKLSNpbmNsdWRlICJpZ2VuLmgiCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotCi1zdGF0aWMgaW5zbl93b3JkX2VudHJ5ICoKLXBhcnNlX2luc25fd29yZCAobGluZV9yZWYgKmxpbmUsCi0JCSBjaGFyICpzdHJpbmcsCi0JCSBpbnQgd29yZF9ucikKLXsKLSAgY2hhciAqY2hwOwotICBpbnNuX3dvcmRfZW50cnkgKndvcmQgPSBaQUxMT0MgKGluc25fd29yZF9lbnRyeSk7Ci0KLSAgLyogY3JlYXRlIGEgbGVhZGluZyBzZW50aW5hbCAqLwotICB3b3JkLT5maXJzdCA9IFpBTExPQyAoaW5zbl9maWVsZF9lbnRyeSk7Ci0gIHdvcmQtPmZpcnN0LT5maXJzdCA9IC0xOwotICB3b3JkLT5maXJzdC0+bGFzdCA9IC0xOwotICB3b3JkLT5maXJzdC0+d2lkdGggPSAwOwotCi0gIC8qIGFuZCBhIHRyYWlsaW5nIHNlbnRpbmFsICovCi0gIHdvcmQtPmxhc3QgPSBaQUxMT0MgKGluc25fZmllbGRfZW50cnkpOwotICB3b3JkLT5sYXN0LT5maXJzdCA9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKLSAgd29yZC0+bGFzdC0+bGFzdCA9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKLSAgd29yZC0+bGFzdC0+d2lkdGggPSAwOwotCi0gIC8qIGxpbmsgdGhlbSB0b2dldGhlciAqLwotICB3b3JkLT5maXJzdC0+bmV4dCA9IHdvcmQtPmxhc3Q7Ci0gIHdvcmQtPmxhc3QtPnByZXYgPSB3b3JkLT5maXJzdDsKLQotICAvKiBub3cgd29yayB0aHJvdWdoIHRoZSBmb3JtYXRzICovCi0gIGNocCA9IHNraXBfc3BhY2VzIChzdHJpbmcpOwotCi0gIHdoaWxlICgqY2hwICE9ICdcMCcpIHsKLSAgICBjaGFyICpzdGFydF9wb3M7Ci0gICAgaW50IHN0cmxlbl9wb3M7Ci0gICAgY2hhciAqc3RhcnRfdmFsOwotICAgIGludCBzdHJsZW5fdmFsOwotICAgIGluc25fZmllbGRfZW50cnkgKm5ld19maWVsZDsKLQotICAgIC8qIGNyZWF0ZSAvIGxpbmsgaW4gdGhlIG5ldyBmaWVsZCAqLwotICAgIG5ld19maWVsZCA9IFpBTExPQyAoaW5zbl9maWVsZF9lbnRyeSk7Ci0gICAgbmV3X2ZpZWxkLT5uZXh0ID0gd29yZC0+bGFzdDsKLSAgICBuZXdfZmllbGQtPnByZXYgPSB3b3JkLT5sYXN0LT5wcmV2OwotICAgIG5ld19maWVsZC0+bmV4dC0+cHJldiA9IG5ld19maWVsZDsKLSAgICBuZXdfZmllbGQtPnByZXYtPm5leHQgPSBuZXdfZmllbGQ7Ci0gICAgbmV3X2ZpZWxkLT53b3JkX25yID0gd29yZF9ucjsKLQotICAgIC8qIGJyZWFrIG91dCB0aGUgZmlyc3QgZmllbGQgKGlmIHByZXNlbnQpICovCi0gICAgc3RhcnRfcG9zID0gY2hwOwotICAgIGNocCA9IHNraXBfdG9fc2VwYXJhdG9yIChjaHAsICIuLCEiKTsKLSAgICBzdHJsZW5fcG9zID0gYmFja19zcGFjZXMgKHN0YXJ0X3BvcywgY2hwKSAtIHN0YXJ0X3BvczsKLQotICAgIC8qIGJyZWFrIG91dCB0aGUgc2Vjb25kIGZpZWxkIChpZiBwcmVzZW50KSAqLwotICAgIGlmICgqY2hwICE9ICcuJykKLSAgICAgIHsKLQkvKiBhc3N1bWUgd2hhdCB3YXMgc3BlY2lmaWVkIHdhcyB0aGUgdmFsdWUgKGFuZCBub3QgdGhlIHN0YXJ0Ci0gICAgICAgICAgIHBvc2l0aW9uKS4gIEFzc3VtZSB0aGUgdmFsdWUgbGVuZ3RoIGltcGxpY2l0bHkgc3BlY2lmaWVzCi0gICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyAqLwotCXN0YXJ0X3ZhbCA9IHN0YXJ0X3BvczsKLQlzdHJsZW5fdmFsID0gc3RybGVuX3BvczsKLQlzdGFydF9wb3MgPSAiIjsKLQlzdHJsZW5fcG9zID0gMDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JY2hwKys7IC8qIHNraXAgYC4nICovCi0JY2hwID0gc2tpcF9zcGFjZXMgKGNocCk7Ci0Jc3RhcnRfdmFsID0gY2hwOwotCWlmICgqY2hwID09ICcvJyB8fCAqY2hwID09ICcqJykKLQkgIHsKLQkgICAgZG8KLQkgICAgICB7Ci0JCWNocCsrOwotCSAgICAgIH0KLQkgICAgd2hpbGUgKCpjaHAgPT0gJy8nIHx8ICpjaHAgPT0gJyonKTsKLQkgIH0KLQllbHNlIGlmIChpc2FscGhhKCpzdGFydF92YWwpKQotCSAgewotCSAgICBkbwotCSAgICAgIHsKLQkJY2hwKys7Ci0JICAgICAgfQotCSAgICB3aGlsZSAoaXNhbG51bSgqY2hwKSB8fCAqY2hwID09ICdfJyk7Ci0JICB9Ci0JZWxzZSBpZiAoaXNkaWdpdCgqc3RhcnRfdmFsKSkKLQkgIHsKLQkgICAgZG8gewotCSAgICAgIGNocCsrOwotCSAgICB9Ci0JICAgIHdoaWxlIChpc2FsbnVtKCpjaHApKTsKLQkgIH0KLQlzdHJsZW5fdmFsID0gY2hwIC0gc3RhcnRfdmFsOwotCWNocCA9IHNraXBfc3BhY2VzIChjaHApOwotICAgICAgfQotICAgIGlmIChzdHJsZW5fdmFsID09IDApCi0gICAgICBlcnJvciAobGluZSwgIkVtcHR5IHZhbHVlIGZpZWxkXG4iKTsKLSAgICAKLSAgICAvKiBicmVhayBvdXQgYW55IGNvbmRpdGlvbmFsIGZpZWxkcyAtIHsgWyAiISIgfCAiPSIgWyA8dmFsdWU+IHwgPGZpZWxkLW5hbWU+IH0gKi8KLSAgICB3aGlsZSAoKmNocCA9PSAnIScgfHwgKmNocCA9PSAnPScpCi0gICAgICB7Ci0JY2hhciAqc3RhcnQ7Ci0JY2hhciAqZW5kOwotCWludCBsZW47Ci0JaW5zbl9maWVsZF9jb25kICpuZXdfY29uZCA9IFpBTExPQyAoaW5zbl9maWVsZF9jb25kKTsKLQkKLQkvKiBkZXRlcm1pbmUgdGhlIGNvbmRpdGlvbmFsIHRlc3QgKi8KLQlzd2l0Y2ggKCpjaHApCi0JICB7Ci0JICBjYXNlICc9JzoKLQkgICAgbmV3X2NvbmQtPnRlc3QgPSBpbnNuX2ZpZWxkX2NvbmRfZXE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnISc6Ci0JICAgIG5ld19jb25kLT50ZXN0ID0gaW5zbl9maWVsZF9jb25kX25lOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIEFTU0VSVCAoMCk7Ci0JICB9Ci0JICAKLQkvKiBzYXZlIHRoZSB2YWx1ZSAqLwotCWNocCsrOyAKLQljaHAgPSBza2lwX3NwYWNlcyAoY2hwKTsKLQlzdGFydCA9IGNocDsKLQljaHAgPSBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiKyw6IT0iKTsKLQllbmQgPSBiYWNrX3NwYWNlcyAoc3RhcnQsIGNocCk7Ci0JbGVuID0gZW5kIC0gc3RhcnQ7Ci0JaWYgKGxlbiA9PSAwKQotCSAgZXJyb3IgKGxpbmUsICJNaXNzaW5nIG9yIGludmFsaWQgY29uZGl0aW9uYWwgdmFsdWVcbiIpOwotCW5ld19jb25kLT5zdHJpbmcgPSBOWkFMTE9DIChjaGFyLCBsZW4gKyAxKTsKLQlzdHJuY3B5IChuZXdfY29uZC0+c3RyaW5nLCBzdGFydCwgbGVuKTsKLQotCS8qIGRldGVybWluZSB0aGUgY29uZGl0aW9uYWwgdHlwZSAqLwotCWlmIChpc2RpZ2l0ICgqc3RhcnQpKQotCSAgewotCSAgICAvKiBbICIhIiB8ICI9IiBdIDx2YWx1ZT4gKi8KLQkgICAgbmV3X2NvbmQtPnR5cGUgPSBpbnNuX2ZpZWxkX2NvbmRfdmFsdWU7Ci0JICAgIG5ld19jb25kLT52YWx1ZSA9IGEyaSAobmV3X2NvbmQtPnN0cmluZyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBbICIhIiB8ICI9IiBdIDxmaWVsZD4gIC0gY2hlY2sgZmllbGQgdmFsaWQgKi8KLQkgICAgbmV3X2NvbmQtPnR5cGUgPSBpbnNuX2ZpZWxkX2NvbmRfZmllbGQ7Ci0JICAgIC8qIG5ld19jb25kLT5maWVsZCBpcyBkZXRlcm1pbmVkIGluIGxhdGVyICovCi0JICB9Ci0JICAKLQkvKiBPbmx5IGEgc2luZ2xlIGA9JyBpcyBwZXJtaXR0ZWQuICovCi0JaWYgKChuZXdfY29uZC0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEKLQkgICAgICYmIG5ld19maWVsZC0+Y29uZGl0aW9ucyAhPSBOVUxMKQotCSAgICB8fCAobmV3X2ZpZWxkLT5jb25kaXRpb25zICE9IE5VTEwKLQkJJiYgbmV3X2ZpZWxkLT5jb25kaXRpb25zLT50ZXN0ID09IGluc25fZmllbGRfY29uZF9lcSkpCi0JICBlcnJvciAobGluZSwgIk9ubHkgc2luZ2xlIGNvbmRpdGlvbmFsIHdoZW4gYD0nIGFsbG93ZWRcbiIpOwotCi0JLyogaW5zZXJ0IGl0ICovCi0JewotCSAgaW5zbl9maWVsZF9jb25kICoqbGFzdCA9ICZuZXdfZmllbGQtPmNvbmRpdGlvbnM7Ci0JICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKLQkgICAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCSAgKmxhc3QgPSBuZXdfY29uZDsKLQl9Ci0gICAgICB9Ci0KLSAgICAvKiBOT1cgdmVyaWZ5IHRoYXQgdGhlIGZpZWxkIHdhcyBmaW5pc2hlZCAqLwotICAgIGlmICgqY2hwID09ICcsJykKLSAgICAgIHsKLQljaHAgPSBza2lwX3NwYWNlcyAoY2hwICsgMSk7Ci0JaWYgKCpjaHAgPT0gJ1wwJykKLQkgIGVycm9yIChsaW5lLCAiZW1wdHkgZmllbGRcbiIpOwotICAgICAgfQotICAgIGVsc2UgaWYgKCpjaHAgIT0gJ1wwJykKLSAgICAgIHsKLQllcnJvciAobGluZSwgIk1pc3NpbmcgZmllbGQgc2VwYXJhdG9yXG4iKTsKLSAgICAgIH0KLQotICAgIC8qIGNvcHkgdGhlIHZhbHVlICovCi0gICAgbmV3X2ZpZWxkLT52YWxfc3RyaW5nID0gTlpBTExPQyAoY2hhciwgc3RybGVuX3ZhbCsxKTsKLSAgICBzdHJuY3B5IChuZXdfZmllbGQtPnZhbF9zdHJpbmcsIHN0YXJ0X3ZhbCwgc3RybGVuX3ZhbCk7Ci0gICAgaWYgKGlzZGlnaXQgKG5ld19maWVsZC0+dmFsX3N0cmluZ1swXSkpCi0gICAgICB7Ci0JaWYgKHN0cmxlbl9wb3MgPT0gMCkKLQkgIHsKLQkgICAgLyogd2hlbiB0aGUgbGVuZ3RoL3BvcyBmaWVsZCBpcyBvbWl0ZWQsIGFuIGludGVnZXIgZmllbGQKLSAgICAgICAgICAgICAgIGlzIGFsd2F5cyBiaW5hcnkgKi8KLQkgICAgdW5zaWduZWQ2NCB2YWwgPSAwOwotCSAgICBpbnQgaTsKLQkgICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbl92YWw7IGkrKykKLQkgICAgICB7Ci0JCWlmIChuZXdfZmllbGQtPnZhbF9zdHJpbmdbaV0gIT0gJzAnCi0JCSAgICAmJiBuZXdfZmllbGQtPnZhbF9zdHJpbmdbaV0gIT0gJzEnKQotCQkgIGVycm9yIChsaW5lLCAiaW52YWxpZCBiaW5hcnkgZmllbGQgJXNcbiIsCi0JCQkgbmV3X2ZpZWxkLT52YWxfc3RyaW5nKTsKLQkJdmFsID0gKHZhbCA8PCAxKSArIChuZXdfZmllbGQtPnZhbF9zdHJpbmdbaV0gPT0gJzEnKTsKLQkgICAgICB9Ci0JICAgIG5ld19maWVsZC0+dmFsX2ludCA9IHZhbDsKLQkgICAgbmV3X2ZpZWxkLT50eXBlID0gaW5zbl9maWVsZF9pbnQ7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBuZXdfZmllbGQtPnZhbF9pbnQgPSBhMmkgKG5ld19maWVsZC0+dmFsX3N0cmluZyk7Ci0JICAgIG5ld19maWVsZC0+dHlwZSA9IGluc25fZmllbGRfaW50OwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKG5ld19maWVsZC0+dmFsX3N0cmluZ1swXSA9PSAnLycpCi0gICAgICB7Ci0JbmV3X2ZpZWxkLT50eXBlID0gaW5zbl9maWVsZF9yZXNlcnZlZDsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChuZXdfZmllbGQtPnZhbF9zdHJpbmdbMF0gPT0gJyonKQotICAgICAgewotCW5ld19maWVsZC0+dHlwZSA9IGluc25fZmllbGRfd2lsZDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JbmV3X2ZpZWxkLT50eXBlID0gaW5zbl9maWVsZF9zdHJpbmc7Ci0JaWYgKGZpbHRlcl9pc19tZW1iZXIgKHdvcmQtPmZpZWxkX25hbWVzLCBuZXdfZmllbGQtPnZhbF9zdHJpbmcpKQotCSAgZXJyb3IgKGxpbmUsICJGaWVsZCBuYW1lICVzIGlzIGR1cGxpY2F0ZWRcbiIsIG5ld19maWVsZC0+dmFsX3N0cmluZyk7Ci0JZmlsdGVyX3BhcnNlICgmd29yZC0+ZmllbGRfbmFtZXMsIG5ld19maWVsZC0+dmFsX3N0cmluZyk7Ci0gICAgICB9Ci0gICAgaWYgKG5ld19maWVsZC0+dHlwZSAhPSBpbnNuX2ZpZWxkX3N0cmluZwotCSYmIG5ld19maWVsZC0+Y29uZGl0aW9ucyAhPSBOVUxMKQotICAgICAgZXJyb3IgKGxpbmUsICJDb25kaXRpb25hbHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBuYW1lZCBmaWVsZHNcbiIpOwotCi0gICAgLyogdGhlIGNvcHkgdGhlIHBvc2l0aW9uICovCi0gICAgbmV3X2ZpZWxkLT5wb3Nfc3RyaW5nID0gTlpBTExPQyAoY2hhciwgc3RybGVuX3BvcyArIDEpOwotICAgIHN0cm5jcHkgKG5ld19maWVsZC0+cG9zX3N0cmluZywgc3RhcnRfcG9zLCBzdHJsZW5fcG9zKTsKLSAgICBpZiAoc3RybGVuX3BvcyA9PSAwKQotICAgICAgewotCW5ld19maWVsZC0+Zmlyc3QgPSBuZXdfZmllbGQtPnByZXYtPmxhc3QgKyAxOwotCWlmIChuZXdfZmllbGQtPmZpcnN0ID09IDAgLyogZmlyc3QgZmllbGQgKi8KLQkgICAgJiYgKmNocCA9PSAnXDAnIC8qIG5vIGZ1cnRoZXIgZmllbGRzICovCi0JICAgICYmIG5ld19maWVsZC0+dHlwZSA9PSBpbnNuX2ZpZWxkX3N0cmluZykKLQkgIHsKLQkgICAgLyogQSBzaW5nbGUgc3RyaW5nIHdpdGhvdXQgYW55IHBvc2l0aW9uLCBhc3N1bWUgdGhhdCBpdAotICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZW50aXJlIGluc3RydWN0aW9uIHdvcmQgKi8KLQkgICAgbmV3X2ZpZWxkLT53aWR0aCA9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIE5vIGV4cGxpY2l0IHdpZHRoL3Bvc2l0aW9uLCBhc3N1bWUgdmFsdWUgaW1wbGljaXRseQotCSAgICAgICBzdXBwbGllcyB0aGUgd2lkdGggKi8KLQkgICAgbmV3X2ZpZWxkLT53aWR0aCA9IHN0cmxlbl92YWw7Ci0JICB9Ci0JbmV3X2ZpZWxkLT5sYXN0ID0gbmV3X2ZpZWxkLT5maXJzdCArIG5ld19maWVsZC0+d2lkdGggLSAxOwotCWlmIChuZXdfZmllbGQtPmxhc3QgPj0gb3B0aW9ucy5pbnNuX2JpdF9zaXplKQotCSAgZXJyb3IgKGxpbmUsICJCaXQgcG9zaXRpb24gJWQgZXhjZWVkIGluc3RydWN0aW9uIGJpdCBzaXplICglZClcbiIsCi0JCSBuZXdfZmllbGQtPmxhc3QsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAob3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzKQotICAgICAgewotCW5ld19maWVsZC0+Zmlyc3QgPSBuZXdfZmllbGQtPnByZXYtPmxhc3QgKyAxOwotCW5ld19maWVsZC0+d2lkdGggPSBhMmkobmV3X2ZpZWxkLT5wb3Nfc3RyaW5nKTsKLQluZXdfZmllbGQtPmxhc3QgPSBuZXdfZmllbGQtPmZpcnN0ICsgbmV3X2ZpZWxkLT53aWR0aCAtIDE7Ci0JaWYgKG5ld19maWVsZC0+bGFzdCA+PSBvcHRpb25zLmluc25fYml0X3NpemUpCi0JICBlcnJvciAobGluZSwgIkJpdCBwb3NpdGlvbiAlZCBleGNlZWQgaW5zdHJ1Y3Rpb24gYml0IHNpemUgKCVkKVxuIiwKLQkJIG5ld19maWVsZC0+bGFzdCwgb3B0aW9ucy5pbnNuX2JpdF9zaXplKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JbmV3X2ZpZWxkLT5maXJzdCA9IHRhcmdldF9hMmkob3B0aW9ucy5oaV9iaXRfbnIsCi0JCQkJICAgICAgbmV3X2ZpZWxkLT5wb3Nfc3RyaW5nKTsKLQluZXdfZmllbGQtPmxhc3QgPSBuZXdfZmllbGQtPm5leHQtPmZpcnN0IC0gMTsgLyogZ3Vlc3MgKi8KLQluZXdfZmllbGQtPndpZHRoID0gbmV3X2ZpZWxkLT5sYXN0IC0gbmV3X2ZpZWxkLT5maXJzdCArIDE7IC8qIGd1ZXNzICovCi0JbmV3X2ZpZWxkLT5wcmV2LT5sYXN0ID0gbmV3X2ZpZWxkLT5maXJzdCAtIDE7IC8qZml4Ki8KLQluZXdfZmllbGQtPnByZXYtPndpZHRoID0gbmV3X2ZpZWxkLT5maXJzdCAtIG5ld19maWVsZC0+cHJldi0+Zmlyc3Q7IC8qZml4Ki8KLSAgICAgIH0KLSAgfQotCi0gIC8qIGZpZGRsZSBmaXJzdC9sYXN0IHNvIHRoYXQgdGhlIHNlbnRpbmFscyBkaXNhcGVhciAqLwotICBBU1NFUlQod29yZC0+Zmlyc3QtPmxhc3QgPCAwKTsKLSAgQVNTRVJUKHdvcmQtPmxhc3QtPmZpcnN0ID49IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7Ci0gIHdvcmQtPmZpcnN0ID0gd29yZC0+Zmlyc3QtPm5leHQ7Ci0gIHdvcmQtPmxhc3QgPSB3b3JkLT5sYXN0LT5wcmV2OwotCi0gIC8qIGNoZWNrIHRoYXQgdGhlIGxhc3QgZmllbGQgZ29lcyBhbGwgdGhlIHdheSB0byB0aGUgbGFzdCBiaXQgKi8KLSAgaWYgKHdvcmQtPmxhc3QtPmxhc3QgIT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKLSAgICB7Ci0gICAgICBpZiAob3B0aW9ucy53YXJuLndpZHRoKQotCW9wdGlvbnMud2FybmluZyAobGluZSwgIkluc3RydWN0aW9uIGZvcm1hdCBpcyBub3QgJWQgYml0cyB3aWRlXG4iLAotCQkJIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7Ci0gICAgICB3b3JkLT5sYXN0LT5sYXN0ID0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMTsKLSAgICB9Ci0KLSAgLyogbm93IGdvIG92ZXIgdGhpcyBhZ2FpbiwgcG9pbnRpbmcgZWFjaCBiaXQgcG9zaXRpb24gYXQgYSBmaWVsZAotICAgICByZWNvcmQgKi8KLSAgewotICAgIGluc25fZmllbGRfZW50cnkgKmZpZWxkOwotICAgIGZvciAoZmllbGQgPSB3b3JkLT5maXJzdDsKLQkgZmllbGQtPmxhc3QgPCBvcHRpb25zLmluc25fYml0X3NpemU7Ci0JIGZpZWxkID0gZmllbGQtPm5leHQpCi0gICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpID0gZmllbGQtPmZpcnN0OyBpIDw9IGZpZWxkLT5sYXN0OyBpKyspCi0JICB7Ci0JICAgIHdvcmQtPmJpdFtpXSA9IFpBTExPQyAoaW5zbl9iaXRfZW50cnkpOwotCSAgICB3b3JkLT5iaXRbaV0tPmZpZWxkID0gZmllbGQ7Ci0JICAgIHN3aXRjaCAoZmllbGQtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgaW5zbl9maWVsZF9pbnZhbGlkOgotCQlBU1NFUlQgKDApOwotCQlicmVhazsKLQkgICAgICBjYXNlIGluc25fZmllbGRfaW50OgotCQl3b3JkLT5iaXRbaV0tPm1hc2sgPSAxOwotCQl3b3JkLT5iaXRbaV0tPnZhbHVlID0gKChmaWVsZC0+dmFsX2ludAotCQkJCQkmICgoaW5zbl91aW50KTEgPDwgKGZpZWxkLT5sYXN0IC0gaSkpKQotCQkJCSAgICAgICAhPSAwKTsKLQkgICAgICBjYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6Ci0JICAgICAgY2FzZSBpbnNuX2ZpZWxkX3dpbGQ6Ci0JICAgICAgY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKLQkJLyogaWYgd2UgZW5jb3VudGVyIGEgY29uc3RhbnQgY29uZGl0aW9uYWwsIGVuY29kZQotICAgICAgICAgICAgICAgICAgIHRoZWlyIGJpdCB2YWx1ZS4gKi8KLQkJaWYgKGZpZWxkLT5jb25kaXRpb25zICE9IE5VTEwKLQkJICAgICYmIGZpZWxkLT5jb25kaXRpb25zLT50ZXN0ID09IGluc25fZmllbGRfY29uZF9lcQotCQkgICAgJiYgZmllbGQtPmNvbmRpdGlvbnMtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX3ZhbHVlKQotCQkgIHsKLQkJICAgIHdvcmQtPmJpdFtpXS0+bWFzayA9IDE7Ci0JCSAgICB3b3JkLT5iaXRbaV0tPnZhbHVlID0gKChmaWVsZC0+Y29uZGl0aW9ucy0+dmFsdWUKLQkJCQkJICAgICYgKChpbnNuX3VpbnQpMSA8PCAoZmllbGQtPmxhc3QgLSBpKSkpCi0JCQkJCSAgICE9IDApOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIHdvcmQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2luc25fd29yZHMgKGluc25fZW50cnkgKmluc24sCi0JCSAgY2hhciAqZm9ybWF0cykKLXsKLSAgaW5zbl93b3JkX2VudHJ5ICoqbGFzdF93b3JkID0gJmluc24tPndvcmRzOwotICBjaGFyICpjaHA7Ci0KLSAgLyogbm93IHdvcmsgdGhyb3VnaCB0aGUgZm9ybWF0cyAqLwotICBpbnNuLT5ucl93b3JkcyA9IDA7Ci0gIGNocCA9IGZvcm1hdHM7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqc3RhcnRfcG9zOwotICAgICAgY2hhciAqZW5kX3BvczsKLSAgICAgIGludCBzdHJsZW5fcG9zOwotICAgICAgY2hhciAqZm9ybWF0OwotICAgICAgaW5zbl93b3JkX2VudHJ5ICpuZXdfd29yZDsKLQotICAgICAgLyogc2tpcCBsZWFkaW5nIHNwYWNlcyAqLwotICAgICAgY2hwID0gc2tpcF9zcGFjZXMgKGNocCk7Ci0KLSAgICAgIC8qIGJyZWFrIG91dCB0aGUgZm9ybWF0ICovCi0gICAgICBzdGFydF9wb3MgPSBjaHA7Ci0gICAgICBjaHAgPSBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiKyIpOwotICAgICAgZW5kX3BvcyA9IGJhY2tfc3BhY2VzIChzdGFydF9wb3MsIGNocCk7Ci0gICAgICBzdHJsZW5fcG9zID0gZW5kX3BvcyAtIHN0YXJ0X3BvczsKLQotICAgICAgLyogY2hlY2sgdGhhdCBzb21ldGhpbmcgd2FzIHRoZXJlICovCi0gICAgICBpZiAoc3RybGVuX3BvcyA9PSAwKQotCWVycm9yIChpbnNuLT5saW5lLCAibWlzc2luZyBvciBlbXB0eSBpbnN0cnVjdGlvbiBmb3JtYXRcbiIpOwotCi0gICAgICAvKiBwYXJzZSB0aGUgZmllbGQgKi8KLSAgICAgIGZvcm1hdCA9IE5aQUxMT0MgKGNoYXIsIHN0cmxlbl9wb3MgKyAxKTsKLSAgICAgIHN0cm5jcHkgKGZvcm1hdCwgc3RhcnRfcG9zLCBzdHJsZW5fcG9zKTsKLSAgICAgIG5ld193b3JkID0gcGFyc2VfaW5zbl93b3JkIChpbnNuLT5saW5lLCBmb3JtYXQsIGluc24tPm5yX3dvcmRzKTsKLSAgICAgIGluc24tPm5yX3dvcmRzKys7Ci0gICAgICBpZiAoZmlsdGVyX2lzX2NvbW1vbiAoaW5zbi0+ZmllbGRfbmFtZXMsIG5ld193b3JkLT5maWVsZF9uYW1lcykpCi0JZXJyb3IgKGluc24tPmxpbmUsICJGaWVsZCBuYW1lIGR1cGxpY2F0ZWQgYmV0d2VlbiB0d28gd29yZHNcbiIpOwotICAgICAgZmlsdGVyX2FkZCAoJmluc24tPmZpZWxkX25hbWVzLCBuZXdfd29yZC0+ZmllbGRfbmFtZXMpOwotCi0gICAgICAvKiBpbnNlcnQgaXQgKi8KLSAgICAgICpsYXN0X3dvcmQgPSBuZXdfd29yZDsKLSAgICAgIGxhc3Rfd29yZCA9ICZuZXdfd29yZC0+bmV4dDsKLQotICAgICAgLyogbGFzdCBmb3JtYXQ/ICovCi0gICAgICBpZiAoKmNocCA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgQVNTRVJUICgqY2hwID09ICcrJyk7Ci0gICAgICBjaHArKzsKLSAgICB9Ci0KLSAgLyogY3JlYXRlIGEgcXVpY2sgYWNjZXNzIGFycmF5IChpbmRleGVkIGJ5IHdvcmQpIG9mIHRoZSBzYW1lIHN0cnVjdHVyZSAqLwotICB7Ci0gICAgaW50IGk7Ci0gICAgaW5zbl93b3JkX2VudHJ5ICp3b3JkOwotICAgIGluc24tPndvcmQgPSBOWkFMTE9DIChpbnNuX3dvcmRfZW50cnkgKiwgaW5zbi0+bnJfd29yZHMgKyAxKTsKLSAgICBmb3IgKGkgPSAwLCB3b3JkID0gaW5zbi0+d29yZHM7Ci0JIGkgPCBpbnNuLT5ucl93b3JkczsKLQkgaSsrLCB3b3JkID0gd29yZC0+bmV4dCkKLSAgICAgIGluc24tPndvcmRbaV0gPSB3b3JkOwotICB9Ci0KLSAgLyogR28gb3ZlciBhbGwgZmllbGRzIHRoYXQgaGF2ZSBjb25kaXRpb25hbHMgcmVmZXJpbmcgdG8gb3RoZXIKLSAgICAgZmllbGRzLiAgTGluayB0aGUgZmllbGRzIHVwLiAgVmVyaWZ5IHRoYXQgdGhlIHR3byBmaWVsZHMgaGF2ZSB0aGUKLSAgICAgc2FtZSBzaXplLiBWZXJpZnkgdGhhdCB0aGUgdHdvIGZpZWxkcyBhcmUgZGlmZmVyZW50ICovCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bnJfd29yZHM7IGkrKykKLSAgICAgIHsKLQlpbnNuX3dvcmRfZW50cnkgKndvcmQgPSBpbnNuLT53b3JkW2ldOwotCWluc25fZmllbGRfZW50cnkgKmY7Ci0JZm9yIChmID0gd29yZC0+Zmlyc3Q7Ci0JICAgICBmLT5sYXN0IDwgb3B0aW9ucy5pbnNuX2JpdF9zaXplOwotCSAgICAgZiA9IGYtPm5leHQpCi0JICB7Ci0JICAgIGluc25fZmllbGRfY29uZCAqY29uZDsKLQkgICAgZm9yIChjb25kID0gZi0+Y29uZGl0aW9uczsKLQkJIGNvbmQgIT0gTlVMTDsKLQkJIGNvbmQgPSBjb25kLT5uZXh0KQotCSAgICAgIHsKLQkJaWYgKGNvbmQtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX2ZpZWxkKQotCQkgIHsKLQkJICAgIGludCBqOwotCQkgICAgaWYgKHN0cmNtcCAoY29uZC0+c3RyaW5nLCBmLT52YWxfc3RyaW5nKSA9PSAwKQotCQkgICAgICBlcnJvciAoaW5zbi0+bGluZSwKLQkJCSAgICAgIkNvbmRpdGlvbmFsIGAlcycgb2YgZmllbGQgYCVzJyByZWZlcnMgdG8gaXRzIHNlbGZcbiIsCi0JCQkgICAgIGNvbmQtPnN0cmluZywgZi0+dmFsX3N0cmluZyk7Ci0JCSAgICBmb3IgKGogPSAwOyBqIDw9IGkgJiYgY29uZC0+ZmllbGQgPT0gTlVMTDsgaisrKQotCQkgICAgICB7Ci0JCQlpbnNuX3dvcmRfZW50cnkgKnJlZmVyZWRfd29yZCA9IGluc24tPndvcmRbal07Ci0JCQlpbnNuX2ZpZWxkX2VudHJ5ICpyZWZlcmVkX2ZpZWxkOwotCQkJZm9yIChyZWZlcmVkX2ZpZWxkID0gcmVmZXJlZF93b3JkLT5maXJzdDsKLQkJCSAgICAgcmVmZXJlZF9maWVsZCAhPSBOVUxMICYmIGNvbmQtPmZpZWxkID09IE5VTEw7Ci0JCQkgICAgIHJlZmVyZWRfZmllbGQgPSByZWZlcmVkX2ZpZWxkLT5uZXh0KQotCQkJICB7Ci0JCQkgICAgaWYgKHJlZmVyZWRfZmllbGQtPnR5cGUgPT0gaW5zbl9maWVsZF9zdHJpbmcKLQkJCQkmJiBzdHJjbXAgKHJlZmVyZWRfZmllbGQtPnZhbF9zdHJpbmcsIGNvbmQtPnN0cmluZykgPT0gMCkKLQkJCSAgICAgIHsKLQkJCQkvKiBmb3VuZCBmaWVsZCBiZWluZyByZWZlcmVkIHRvIGJ5IGNvbmRpdG9uYWwgKi8KLQkJCQljb25kLT5maWVsZCA9IHJlZmVyZWRfZmllbGQ7Ci0JCQkJLyogY2hlY2sgcmVmZXJlZCB0byBhbmQgdGhpcyBmaWVsZCBhcmUKLQkJCQkgICB0aGUgc2FtZSBzaXplICovCi0JCQkJaWYgKGYtPndpZHRoICE9IHJlZmVyZWRfZmllbGQtPndpZHRoKQotCQkJCSAgZXJyb3IgKGluc24tPmxpbmUsCi0JCQkJCSAiQ29uZGl0aW9uYWwgYCVzJyBvZiBmaWVsZCBgJXMnIHNob3VsZCBiZSBvZiBzaXplICVzXG4iLAotCQkJCQkgY29uZC0+c3RyaW5nLCBmLT52YWxfc3RyaW5nLCByZWZlcmVkX2ZpZWxkLT53aWR0aCk7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgaWYgKGNvbmQtPmZpZWxkID09IE5VTEwpCi0JCSAgICAgIGVycm9yIChpbnNuLT5saW5lLAotCQkJICAgICAiQ29uZGl0aW9uYWwgYCVzJyBvZiBmaWVsZCBgJXMnIG5vdCB5ZXQgZGVmaW5lZFxuIiwKLQkJCSAgICAgY29uZC0+c3RyaW5nLCBmLT52YWxfc3RyaW5nKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0gIAotfQotCi10eXBlZGVmIGVudW0gewotICB1bmtub3duX3JlY29yZCA9IDAsCi0gIGluc25fcmVjb3JkLCAvKiBkZWZhdWx0ICovCi0gIGNvZGVfcmVjb3JkLAotICBjYWNoZV9yZWNvcmQsCi0gIGNvbXB1dGVfcmVjb3JkLAotICBzY3JhdGNoX3JlY29yZCwKLSAgb3B0aW9uX3JlY29yZCwKLSAgc3RyaW5nX2Z1bmN0aW9uX3JlY29yZCwKLSAgZnVuY3Rpb25fcmVjb3JkLAotICBpbnRlcm5hbF9yZWNvcmQsCi0gIGRlZmluZV9yZWNvcmQsCi0gIGluY2x1ZGVfcmVjb3JkLAotICBtb2RlbF9wcm9jZXNzb3JfcmVjb3JkLAotICBtb2RlbF9tYWNyb19yZWNvcmQsCi0gIG1vZGVsX2RhdGFfcmVjb3JkLAotICBtb2RlbF9zdGF0aWNfcmVjb3JkLAotICBtb2RlbF9mdW5jdGlvbl9yZWNvcmQsCi0gIG1vZGVsX2ludGVybmFsX3JlY29yZCwKLX0gaW5zbl9yZWNvcmRfdHlwZTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGluc25fdHlwZV9tYXBbXSA9IHsKLSAgeyAib3B0aW9uIiwgb3B0aW9uX3JlY29yZCB9LAotICB7ICJjYWNoZSIsIGNhY2hlX3JlY29yZCB9LAotICB7ICJjb21wdXRlIiwgY29tcHV0ZV9yZWNvcmQgfSwKLSAgeyAic2NyYXRjaCIsIHNjcmF0Y2hfcmVjb3JkIH0sCi0gIHsgImRlZmluZSIsIGRlZmluZV9yZWNvcmQgfSwKLSAgeyAiaW5jbHVkZSIsIGluY2x1ZGVfcmVjb3JkIH0sCi0gIHsgIiVzIiwgc3RyaW5nX2Z1bmN0aW9uX3JlY29yZCB9LAotICB7ICJmdW5jdGlvbiIsIGZ1bmN0aW9uX3JlY29yZCB9LAotICB7ICJpbnRlcm5hbCIsIGludGVybmFsX3JlY29yZCB9LAotICB7ICJtb2RlbCIsIG1vZGVsX3Byb2Nlc3Nvcl9yZWNvcmQgfSwKLSAgeyAibW9kZWwtbWFjcm8iLCBtb2RlbF9tYWNyb19yZWNvcmQgfSwKLSAgeyAibW9kZWwtZGF0YSIsIG1vZGVsX2RhdGFfcmVjb3JkIH0sCi0gIHsgIm1vZGVsLXN0YXRpYyIsIG1vZGVsX3N0YXRpY19yZWNvcmQgfSwKLSAgeyAibW9kZWwtaW50ZXJuYWwiLCBtb2RlbF9pbnRlcm5hbF9yZWNvcmQgfSwKLSAgeyAibW9kZWwtZnVuY3Rpb24iLCBtb2RlbF9mdW5jdGlvbl9yZWNvcmQgfSwKLSAgeyBOVUxMLCBpbnNuX3JlY29yZCB9LAotfTsKLQotCi1zdGF0aWMgaW50Ci1yZWNvcmRfaXNfb2xkICh0YWJsZV9lbnRyeSAqZW50cnkpCi17Ci0gIGlmIChlbnRyeS0+bnJfZmllbGRzID4gcmVjb3JkX3R5cGVfZmllbGQKLSAgICAgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW3JlY29yZF90eXBlX2ZpZWxkXSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnNuX3JlY29yZF90eXBlCi1yZWNvcmRfdHlwZSAodGFibGVfZW50cnkgKmVudHJ5KQotewotICBzd2l0Y2ggKGVudHJ5LT50eXBlKQotICAgIHsKLSAgICBjYXNlIHRhYmxlX2NvZGVfZW50cnk6Ci0gICAgICByZXR1cm4gY29kZV9yZWNvcmQ7Ci0KLSAgICBjYXNlIHRhYmxlX2NvbG9uX2VudHJ5OgotICAgICAgaWYgKHJlY29yZF9pc19vbGQgKGVudHJ5KSkKLQl7Ci0JICAvKiBvbGQtZm9ybWF0PyAqLwotCSAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBvbGRfcmVjb3JkX3R5cGVfZmllbGQpCi0JICAgIHsKLQkgICAgICBpbnQgaSA9IG5hbWUyaSAoZW50cnktPmZpZWxkW29sZF9yZWNvcmRfdHlwZV9maWVsZF0sCi0JCQkgICAgICBpbnNuX3R5cGVfbWFwKTsKLQkgICAgICByZXR1cm4gaTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmV0dXJuIHVua25vd25fcmVjb3JkOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IHJlY29yZF90eXBlX2ZpZWxkCi0JICAgICAgICYmIGVudHJ5LT5maWVsZFswXVswXSA9PSAnXDAnKQotCXsKLQkgIC8qIG5ldy1mb3JtYXQ/ICovCi0JICBpbnQgaSA9IG5hbWUyaSAoZW50cnktPmZpZWxkW3JlY29yZF90eXBlX2ZpZWxkXSwKLQkJCSAgaW5zbl90eXBlX21hcCk7Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGluc25fcmVjb3JkOyAvKiBkZWZhdWx0ICovCi0gICAgfQotICByZXR1cm4gdW5rbm93bl9yZWNvcmQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlY29yZF9wcmVmaXhfaXMgKHRhYmxlX2VudHJ5ICplbnRyeSwKLQkJICBjaGFyIGNoLAotCQkgIGludCBucl9maWVsZHMpCi17Ci0gIGlmIChlbnRyeS0+dHlwZSAhPSB0YWJsZV9jb2xvbl9lbnRyeSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPCBucl9maWVsZHMpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChlbnRyeS0+ZmllbGRbMF1bMF0gIT0gY2ggJiYgY2ggIT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB0YWJsZV9lbnRyeSAqCi1wYXJzZV9tb2RlbF9kYXRhX3JlY29yZCAoaW5zbl90YWJsZSAqaXNhLAotCQkJIHRhYmxlICpmaWxlLAotCQkJIHRhYmxlX2VudHJ5ICpyZWNvcmQsCi0JCQkgaW50IG5yX2ZpZWxkcywKLQkJCSBtb2RlbF9kYXRhICoqbGlzdCkKLXsKLSAgdGFibGVfZW50cnkgKm1vZGVsX3JlY29yZCA9IHJlY29yZDsKLSAgdGFibGVfZW50cnkgKmNvZGVfcmVjb3JkID0gTlVMTDsKLSAgbW9kZWxfZGF0YSAqbmV3X2RhdGE7Ci0gIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2ZpZWxkcykKLSAgICBlcnJvciAocmVjb3JkLT5saW5lLCAiSW5jb3JyZWN0IG51bWJlciBvZiBmaWVsZHNcbiIpOwotICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSAgaWYgKHJlY29yZC0+dHlwZSA9PSB0YWJsZV9jb2RlX2VudHJ5KQotICAgIHsKLSAgICAgIGNvZGVfcmVjb3JkID0gcmVjb3JkOwotICAgICAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7Ci0gICAgfQotICAvKiBjcmVhdGUgdGhlIG5ldyBkYXRhIHJlY29yZCAqLwotICBuZXdfZGF0YSA9IFpBTExPQyAobW9kZWxfZGF0YSk7Ci0gIG5ld19kYXRhLT5saW5lID0gbW9kZWxfcmVjb3JkLT5saW5lOwotICBmaWx0ZXJfcGFyc2UgKCZuZXdfZGF0YS0+ZmxhZ3MsCi0JCW1vZGVsX3JlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pOwotICBuZXdfZGF0YS0+ZW50cnkgPSBtb2RlbF9yZWNvcmQ7Ci0gIG5ld19kYXRhLT5jb2RlID0gY29kZV9yZWNvcmQ7Ci0gIC8qIGFwcGVuZCBpdCBpZiBub3QgZmlsdGVyZWQgb3V0ICovCi0gIGlmICghaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLmZsYWdzX2ZpbHRlciwKLQkJCW1vZGVsX3JlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pCi0gICAgICAmJiAhaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLm1vZGVsX2ZpbHRlciwKLQkJCSAgIG1vZGVsX3JlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKmxpc3QgIT0gTlVMTCkKLQlsaXN0ID0gJigqbGlzdCktPm5leHQ7Ci0gICAgICAqbGlzdCA9IG5ld19kYXRhOwotICAgIH0KLSAgcmV0dXJuIHJlY29yZDsKLX0KLQotCi10eXBlZGVmIGVudW0gewotICBpbnNuX2JpdF9zaXplX29wdGlvbiA9IDEsCi0gIGluc25fc3BlY2lmeWluZ193aWR0aHNfb3B0aW9uLAotICBoaV9iaXRfbnJfb3B0aW9uLAotICBmbGFnc19maWx0ZXJfb3B0aW9uLAotICBtb2RlbF9maWx0ZXJfb3B0aW9uLAotICBtdWx0aV9zaW1fb3B0aW9uLAotICBmb3JtYXRfbmFtZXNfb3B0aW9uLAotICBnZW5fZGVsYXllZF9icmFuY2gsCi0gIHVua25vd25fb3B0aW9uLAotfSBvcHRpb25fbmFtZXM7Ci0KLXN0YXRpYyBjb25zdCBuYW1lX21hcCBvcHRpb25fbWFwW10gPSB7Ci0gIHsgImluc24tYml0LXNpemUiLCBpbnNuX2JpdF9zaXplX29wdGlvbiB9LAotICB7ICJpbnNuLXNwZWNpZnlpbmctd2lkdGhzIiwgaW5zbl9zcGVjaWZ5aW5nX3dpZHRoc19vcHRpb24gfSwKLSAgeyAiaGktYml0LW5yIiwgaGlfYml0X25yX29wdGlvbiB9LAotICB7ICJmbGFncy1maWx0ZXIiLCBmbGFnc19maWx0ZXJfb3B0aW9uIH0sCi0gIHsgIm1vZGVsLWZpbHRlciIsIG1vZGVsX2ZpbHRlcl9vcHRpb24gfSwKLSAgeyAibXVsdGktc2ltIiwgbXVsdGlfc2ltX29wdGlvbiB9LAotICB7ICJmb3JtYXQtbmFtZXMiLCBmb3JtYXRfbmFtZXNfb3B0aW9uIH0sCi0gIHsgImdlbi1kZWxheWVkLWJyYW5jaCIsIGdlbl9kZWxheWVkX2JyYW5jaCB9LAotICB7IE5VTEwsIHVua25vd25fb3B0aW9uIH0sCi19OwotCi1zdGF0aWMgdGFibGVfZW50cnkgKgotcGFyc2VfaW5jbHVkZV9yZWNvcmQgKHRhYmxlICpmaWxlLAotCQkgICAgICB0YWJsZV9lbnRyeSAqcmVjb3JkKQotewotICAvKiBwYXJzZSB0aGUgaW5jbHVkZSByZWNvcmQgKi8KLSAgaWYgKHJlY29yZC0+bnJfZmllbGRzIDwgbnJfaW5jbHVkZV9maWVsZHMpCi0gICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBuciBmaWVsZHMgZm9yIGluY2x1ZGUgcmVjb3JkXG4iKTsKLSAgLyogcHJvY2VzcyBpdCAqLwotICBpZiAoIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5mbGFnc19maWx0ZXIsCi0JCQlyZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKQotICAgICAgJiYgIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsCi0JCQkgICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSkpCi0gICAgewotICAgICAgdGFibGVfcHVzaCAoZmlsZSwgcmVjb3JkLT5saW5lLCBvcHRpb25zLmluY2x1ZGUsCi0JCSAgcmVjb3JkLT5maWVsZFtpbmNsdWRlX2ZpbGVuYW1lX2ZpZWxkXSk7Ci0gICAgfSAgCi0gIC8qIG5iOiBjYW4ndCByZWFkIG5leHQgcmVjb3JkIHVudGlsIGFmdGVyIHRoZSBmaWxlIGhhcyBiZWVuIHB1c2hlZCAqLwotICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSAgcmV0dXJuIHJlY29yZDsKLX0KLQotCi1zdGF0aWMgdGFibGVfZW50cnkgKgotcGFyc2Vfb3B0aW9uX3JlY29yZCAodGFibGUgKmZpbGUsCi0JCSAgICAgdGFibGVfZW50cnkgKnJlY29yZCkKLXsKLSAgdGFibGVfZW50cnkgKm9wdGlvbl9yZWNvcmQ7Ci0gIC8qIHBhcnNlIHRoZSBvcHRpb24gcmVjb3JkICovCi0gIG9wdGlvbl9yZWNvcmQgPSByZWNvcmQ7Ci0gIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX29wdGlvbl9maWVsZHMpCi0gICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBuciBvZiBmaWVsZHMgZm9yIG9wdGlvbiByZWNvcmRcbiIpOwotICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSAgLyogcHJvY2VzcyBpdCAqLwotICBpZiAoIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5mbGFnc19maWx0ZXIsCi0JCQlvcHRpb25fcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkXSkKLSAgICAgICYmICFpc19maWx0ZXJlZF9vdXQgKG9wdGlvbnMubW9kZWxfZmlsdGVyLAotCQkJICAgb3B0aW9uX3JlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gb3B0aW9uX3JlY29yZC0+ZmllbGRbb3B0aW9uX25hbWVfZmllbGRdOwotICAgICAgb3B0aW9uX25hbWVzIG9wdGlvbiA9IG5hbWUyaSAobmFtZSwgb3B0aW9uX21hcCk7Ci0gICAgICBjaGFyICp2YWx1ZSA9IG9wdGlvbl9yZWNvcmQtPmZpZWxkW29wdGlvbl92YWx1ZV9maWVsZF07Ci0gICAgICBzd2l0Y2ggKG9wdGlvbikKLQl7Ci0JY2FzZSBpbnNuX2JpdF9zaXplX29wdGlvbjoKLQkgIHsKLQkgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplID0gYTJpICh2YWx1ZSk7Ci0JICAgIGlmIChvcHRpb25zLmluc25fYml0X3NpemUgPCAwCi0JCXx8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSA+IG1heF9pbnNuX2JpdF9zaXplKQotCSAgICAgIGVycm9yIChvcHRpb25fcmVjb3JkLT5saW5lLCAiSW5zdHJ1Y3Rpb24gYml0IHNpemUgb3V0IG9mIHJhbmdlXG4iKTsKLQkgICAgaWYgKG9wdGlvbnMuaGlfYml0X25yICE9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIDEKLQkJJiYgb3B0aW9ucy5oaV9iaXRfbnIgIT0gMCkKLQkgICAgICBlcnJvciAob3B0aW9uX3JlY29yZC0+bGluZSwgImluc24tYml0LXNpemUgLyBoaS1iaXQtbnIgY29uZmxpY3RcbiIpOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIGluc25fc3BlY2lmeWluZ193aWR0aHNfb3B0aW9uOgotCSAgewotCSAgICBvcHRpb25zLmluc25fc3BlY2lmeWluZ193aWR0aHMgPSBhMmkgKHZhbHVlKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBoaV9iaXRfbnJfb3B0aW9uOgotCSAgewotCSAgICBvcHRpb25zLmhpX2JpdF9uciA9IGEyaSAodmFsdWUpOwotCSAgICBpZiAob3B0aW9ucy5oaV9iaXRfbnIgIT0gMAotCQkmJiBvcHRpb25zLmhpX2JpdF9uciAhPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxKQotCSAgICAgIGVycm9yIChvcHRpb25fcmVjb3JkLT5saW5lLCAiaGktYml0LW5yIC8gaW5zbi1iaXQtc2l6ZSBjb25mbGljdFxuIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgZmxhZ3NfZmlsdGVyX29wdGlvbjoKLQkgIHsKLQkgICAgZmlsdGVyX3BhcnNlICgmb3B0aW9ucy5mbGFnc19maWx0ZXIsIHZhbHVlKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBtb2RlbF9maWx0ZXJfb3B0aW9uOgotCSAgewotCSAgICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLm1vZGVsX2ZpbHRlciwgdmFsdWUpOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIG11bHRpX3NpbV9vcHRpb246Ci0JICB7Ci0JICAgIG9wdGlvbnMuZ2VuLm11bHRpX3NpbSA9IGEyaSAodmFsdWUpOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIGZvcm1hdF9uYW1lc19vcHRpb246Ci0JICB7Ci0JICAgIGZpbHRlcl9wYXJzZSAoJm9wdGlvbnMuZm9ybWF0X25hbWVfZmlsdGVyLCB2YWx1ZSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgZ2VuX2RlbGF5ZWRfYnJhbmNoOgotCSAgewotCSAgICBvcHRpb25zLmdlbi5kZWxheWVkX2JyYW5jaCA9IGEyaSAodmFsdWUpOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIHVua25vd25fb3B0aW9uOgotCSAgewotCSAgICBlcnJvciAob3B0aW9uX3JlY29yZC0+bGluZSwgIlVua25vd24gb3B0aW9uIC0gJXNcbiIsIG5hbWUpOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfSAgCi0gIHJldHVybiByZWNvcmQ7Ci19Ci0KLQotc3RhdGljIHRhYmxlX2VudHJ5ICoKLXBhcnNlX2Z1bmN0aW9uX3JlY29yZCAodGFibGUgKmZpbGUsCi0JCSAgICAgICB0YWJsZV9lbnRyeSAqcmVjb3JkLAotCQkgICAgICAgZnVuY3Rpb25fZW50cnkgKipsaXN0LAotCQkgICAgICAgZnVuY3Rpb25fZW50cnkgKipsaXN0X2VudHJ5LAotCQkgICAgICAgaW50IGlzX2ludGVybmFsLAotCQkgICAgICAgbW9kZWxfdGFibGUgKm1vZGVsKQotewotICBmdW5jdGlvbl9lbnRyeSAqbmV3X2Z1bmN0aW9uOwotICBuZXdfZnVuY3Rpb24gPSBaQUxMT0MgKGZ1bmN0aW9uX2VudHJ5KTsKLSAgbmV3X2Z1bmN0aW9uLT5saW5lID0gcmVjb3JkLT5saW5lOwotICBuZXdfZnVuY3Rpb24tPmlzX2ludGVybmFsID0gaXNfaW50ZXJuYWw7Ci0gIC8qIHBhcnNlIHRoZSBmdW5jdGlvbiBoZWFkZXIgKi8KLSAgaWYgKHJlY29yZF9pc19vbGQgKHJlY29yZCkpCi0gICAgewotICAgICAgaWYgKHJlY29yZC0+bnJfZmllbGRzIDwgbnJfb2xkX2Z1bmN0aW9uX2ZpZWxkcykKLQllcnJvciAocmVjb3JkLT5saW5lLCAiTWlzc2luZyBmaWVsZHMgZnJvbSAob2xkKSBmdW5jdGlvbiByZWNvcmRcbiIpOwotICAgICAgbmV3X2Z1bmN0aW9uLT50eXBlID0gcmVjb3JkLT5maWVsZFtvbGRfZnVuY3Rpb25fdHlwZWRlZl9maWVsZF07Ci0gICAgICBuZXdfZnVuY3Rpb24tPnR5cGUgPSByZWNvcmQtPmZpZWxkW29sZF9mdW5jdGlvbl90eXBlZGVmX2ZpZWxkXTsKLSAgICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA+IG9sZF9mdW5jdGlvbl9wYXJhbV9maWVsZCkKLQluZXdfZnVuY3Rpb24tPnBhcmFtID0gcmVjb3JkLT5maWVsZFtvbGRfZnVuY3Rpb25fcGFyYW1fZmllbGRdOwotICAgICAgbmV3X2Z1bmN0aW9uLT5uYW1lID0gcmVjb3JkLT5maWVsZFtvbGRfZnVuY3Rpb25fbmFtZV9maWVsZF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJlY29yZC0+bnJfZmllbGRzIDwgbnJfZnVuY3Rpb25fZmllbGRzKQotCWVycm9yIChyZWNvcmQtPmxpbmUsICJNaXNzaW5nIGZpZWxkcyBmcm9tIGZ1bmN0aW9uIHJlY29yZFxuIik7Ci0gICAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfZnVuY3Rpb24tPmZsYWdzLAotCQkgICAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkXSk7Ci0gICAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfZnVuY3Rpb24tPm1vZGVscywKLQkJICAgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKTsKLSAgICAgIG5ld19mdW5jdGlvbi0+dHlwZSA9IHJlY29yZC0+ZmllbGRbZnVuY3Rpb25fdHlwZWRlZl9maWVsZF07Ci0gICAgICBuZXdfZnVuY3Rpb24tPnBhcmFtID0gcmVjb3JkLT5maWVsZFtmdW5jdGlvbl9wYXJhbV9maWVsZF07Ci0gICAgICBuZXdfZnVuY3Rpb24tPm5hbWUgPSByZWNvcmQtPmZpZWxkW2Z1bmN0aW9uX25hbWVfZmllbGRdOwotICAgIH0KLSAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7Ci0gIC8qIHBhcnNlIGFueSBmdW5jdGlvbi1tb2RlbCByZWNvcmRzICovCi0gIHdoaWxlIChyZWNvcmQgIT0gTlVMTAotCSAmJiByZWNvcmRfcHJlZml4X2lzIChyZWNvcmQsICcqJywgbnJfZnVuY3Rpb25fbW9kZWxfZmllbGRzKSkKLSAgICB7Ci0gICAgICBjaGFyICptb2RlbF9uYW1lID0gcmVjb3JkLT5maWVsZFtmdW5jdGlvbl9tb2RlbF9uYW1lX2ZpZWxkXSArIDE7IC8qc2tpcCBgKicqLwotICAgICAgZmlsdGVyX3BhcnNlICgmbmV3X2Z1bmN0aW9uLT5tb2RlbHMsIG1vZGVsX25hbWUpOwotICAgICAgaWYgKCFmaWx0ZXJfaXNfc3Vic2V0IChtb2RlbC0+cHJvY2Vzc29ycywgbmV3X2Z1bmN0aW9uLT5tb2RlbHMpKQotCXsKLQkgIGVycm9yIChyZWNvcmQtPmxpbmUsICJtYWNoaW5lIG1vZGVsIGAlcycgdW5kZWZpbmVkXG4iLCBtb2RlbF9uYW1lKTsKLQl9Ci0gICAgICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSAgICB9Ci0gIC8qIHBhcnNlIHRoZSBmdW5jdGlvbiBib2R5ICovCi0gIGlmIChyZWNvcmQtPnR5cGUgPT0gdGFibGVfY29kZV9lbnRyeSkKLSAgICB7Ci0gICAgICBuZXdfZnVuY3Rpb24tPmNvZGUgPSByZWNvcmQ7Ci0gICAgICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSAgICB9Ci0gIC8qIGluc2VydCBpdCAqLwotICBpZiAoIWZpbHRlcl9pc19zdWJzZXQgKG9wdGlvbnMuZmxhZ3NfZmlsdGVyLCBuZXdfZnVuY3Rpb24tPmZsYWdzKSkKLSAgICB7Ci0gICAgICBpZiAob3B0aW9ucy53YXJuLmRpc2NhcmQpCi0Jbm90aWZ5IChuZXdfZnVuY3Rpb24tPmxpbmUsICJEaXNjYXJkaW5nIGZ1bmN0aW9uICVzIC0gZmlsdGVyIGZsYWdzXG4iLAotCQluZXdfZnVuY3Rpb24tPm5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAobmV3X2Z1bmN0aW9uLT5tb2RlbHMgIT0gTlVMTAotCSAgICYmICFmaWx0ZXJfaXNfY29tbW9uIChvcHRpb25zLm1vZGVsX2ZpbHRlciwgbmV3X2Z1bmN0aW9uLT5tb2RlbHMpKQotICAgIHsKLSAgICAgIGlmIChvcHRpb25zLndhcm4uZGlzY2FyZCkKLQlub3RpZnkgKG5ld19mdW5jdGlvbi0+bGluZSwgIkRpc2NhcmRpbmcgZnVuY3Rpb24gJXMgLSBmaWx0ZXIgbW9kZWxzXG4iLAotCQluZXdfZnVuY3Rpb24tPm5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICgqbGlzdCAhPSBOVUxMKQotCWxpc3QgPSAmKCpsaXN0KS0+bmV4dDsKLSAgICAgICpsaXN0ID0gbmV3X2Z1bmN0aW9uOwotICAgICAgaWYgKGxpc3RfZW50cnkgIT0gTlVMTCkKLQkqbGlzdF9lbnRyeSA9IG5ld19mdW5jdGlvbjsKLSAgICB9Ci0gIC8qIGRvbmUgKi8KLSAgcmV0dXJuIHJlY29yZDsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2luc25fbW9kZWxfcmVjb3JkICh0YWJsZSAqZmlsZSwKLQkJCSB0YWJsZV9lbnRyeSAqcmVjb3JkLAotCQkJIGluc25fZW50cnkgKmluc24sCi0JCQkgbW9kZWxfdGFibGUgKm1vZGVsKQotewotICBpbnNuX21vZGVsX2VudHJ5ICoqbGFzdF9pbnNuX21vZGVsOwotICBpbnNuX21vZGVsX2VudHJ5ICpuZXdfaW5zbl9tb2RlbCA9IFpBTExPQyAoaW5zbl9tb2RlbF9lbnRyeSk7Ci0gIC8qIHBhcnNlIGl0ICovCi0gIG5ld19pbnNuX21vZGVsLT5saW5lID0gcmVjb3JkLT5saW5lOwotICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPiBpbnNuX21vZGVsX3VuaXRfZGF0YV9maWVsZCkKLSAgICBuZXdfaW5zbl9tb2RlbC0+dW5pdF9kYXRhID0gcmVjb3JkLT5maWVsZFtpbnNuX21vZGVsX3VuaXRfZGF0YV9maWVsZF07Ci0gIG5ld19pbnNuX21vZGVsLT5pbnNuID0gaW5zbjsKLSAgLyogcGFyc2UgdGhlIG1vZGVsIG5hbWVzLCB2ZXJpZnkgdGhhdCBhbGwgd2VyZSBkZWZpbmVkICovCi0gIG5ld19pbnNuX21vZGVsLT5uYW1lcyA9IE5VTEw7Ci0gIGZpbHRlcl9wYXJzZSAoJm5ld19pbnNuX21vZGVsLT5uYW1lcywKLQkJcmVjb3JkLT5maWVsZFtpbnNuX21vZGVsX25hbWVfZmllbGRdICsgMSAvKnNraXAgYConKi8pOwotICBpZiAobmV3X2luc25fbW9kZWwtPm5hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm8gcHJvY2Vzc29yIG5hbWVzIC0gYSBnZW5lcmljIG1vZGVsIGVudHJ5LCBlbnRlciBpdCBpbnRvIGFsbAotCSB0aGUgbm9uLWVtcHR5IGZpZWxkcyAqLwotICAgICAgaW50IGluZGV4OwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbW9kZWwtPm5yX21vZGVsczsgaW5kZXgrKykKLQlpZiAoaW5zbi0+bW9kZWxbaW5kZXhdID09IDApCi0JICB7Ci0JICAgIGluc24tPm1vZGVsW2luZGV4XSA9IG5ld19pbnNuX21vZGVsOwotCSAgfQotICAgICAgLyogYWxzbyBhZGQgdGhlIGNvbXBsZXRlIHByb2Nlc3NvciBzZXQgdG8gdGhpcyBwcm9jZXNzb3IncyBzZXQgKi8KLSAgICAgIGZpbHRlcl9hZGQgKCZpbnNuLT5wcm9jZXNzb3JzLCBtb2RlbC0+cHJvY2Vzc29ycyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRmluZCB0aGUgY29ycmVzcG9uZGluZyBtYXN0ZXIgbW9kZWwgcmVjb3JkIGZvciBlYWNoIG5hbWUgc28KLSAgICAgICAgIHRoYXQgdGhleSBjYW4gYmUgbGlua2VkIGluLiAqLwotICAgICAgaW50IGluZGV4OwotICAgICAgY2hhciAqbmFtZSA9ICIiOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgbmFtZSA9IGZpbHRlcl9uZXh0IChuZXdfaW5zbl9tb2RlbC0+bmFtZXMsIG5hbWUpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkgYnJlYWs7Ci0JICBpbmRleCA9IGZpbHRlcl9pc19tZW1iZXIgKG1vZGVsLT5wcm9jZXNzb3JzLCBuYW1lKSAtIDE7Ci0JICBpZiAoaW5kZXggPCAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKG5ld19pbnNuX21vZGVsLT5saW5lLAotCQkgICAgICJtYWNoaW5lIG1vZGVsIGAlcycgdW5kZWZpbmVkXG4iLCBuYW1lKTsKLQkgICAgfQotCSAgLyogc3RvcmUgaXQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwgYXJyYXkgZW50cnkgKi8KLQkgIGlmIChpbnNuLT5tb2RlbFtpbmRleF0gIT0gTlVMTAotCSAgICAgICYmIGluc24tPm1vZGVsW2luZGV4XS0+bmFtZXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHdhcm5pbmcgKG5ld19pbnNuX21vZGVsLT5saW5lLAotCQkgICAgICAgIm1hY2hpbmUgbW9kZWwgYCVzJyBwcmV2aW91c2x5IGRlZmluZWRcbiIsIG5hbWUpOwotCSAgICAgIGVycm9yIChpbnNuLT5tb2RlbFtpbmRleF0tPmxpbmUsICJlYXJsaWVyIGRlZmluaXRpb25cbiIpOwotCSAgICB9Ci0JICBpbnNuLT5tb2RlbFtpbmRleF0gPSBuZXdfaW5zbl9tb2RlbDsKLQkgIC8qIGFsc28gYWRkIHRoZSBuYW1lIHRvIHRoZSBpbnN0cnVjdGlvbnMgcHJvY2Vzc29yIHNldCBhcyBhbgotCSAgICAgYWx0ZXJuYXRpdmUgbG9va3VwIG1lY2hhbmlzbSAqLwotCSAgZmlsdGVyX3BhcnNlICgmaW5zbi0+cHJvY2Vzc29ycywgbmFtZSk7Ci0JfQotICAgIH0KLSNpZiAwCi0gIC8qIGZvciBzb21lIHJlYXNvbiByZWNvcmQgdGhlIG1heCBsZW5ndGggb2YgYW55Ci0gICAgIGZ1bmN0aW9uIHVuaXQgZmllbGQgKi8KLSAgaW50IGxlbiA9IHN0cmxlbiAoaW5zbl9tb2RlbF9wdHItPmZpZWxkW2luc25fbW9kZWxfZmllbGRzXSk7Ci0gIGlmIChtb2RlbC0+bWF4X21vZGVsX2ZpZWxkc19sZW4gPCBsZW4pCi0gICAgbW9kZWwtPm1heF9tb2RlbF9maWVsZHNfbGVuID0gbGVuOwotI2VuZGlmCi0gIC8qIGxpbmsgaXQgaW4gKi8KLSAgbGFzdF9pbnNuX21vZGVsID0gJmluc24tPm1vZGVsczsKLSAgd2hpbGUgKCgqbGFzdF9pbnNuX21vZGVsKSAhPSBOVUxMKQotICAgIGxhc3RfaW5zbl9tb2RlbCA9ICYoKmxhc3RfaW5zbl9tb2RlbCktPm5leHQ7Ci0gICpsYXN0X2luc25fbW9kZWwgPSBuZXdfaW5zbl9tb2RlbDsKLX0KLQotCi1zdGF0aWMgdm9pZAotcGFyc2VfaW5zbl9tbmVtb25pY19yZWNvcmQgKHRhYmxlICpmaWxlLAotCQkJICAgIHRhYmxlX2VudHJ5ICpyZWNvcmQsCi0JCQkgICAgaW5zbl9lbnRyeSAqaW5zbikKLXsKLSAgaW5zbl9tbmVtb25pY19lbnRyeSAqKmxhc3RfaW5zbl9tbmVtb25pYzsKLSAgaW5zbl9tbmVtb25pY19lbnRyeSAqbmV3X2luc25fbW5lbW9uaWMgPSBaQUxMT0MgKGluc25fbW5lbW9uaWNfZW50cnkpOwotICAvKiBwYXJzZSBpdCAqLwotICBuZXdfaW5zbl9tbmVtb25pYy0+bGluZSA9IHJlY29yZC0+bGluZTsKLSAgQVNTRVJUIChyZWNvcmQtPm5yX2ZpZWxkcyA+IGluc25fbW5lbW9uaWNfZm9ybWF0X2ZpZWxkKTsKLSAgbmV3X2luc25fbW5lbW9uaWMtPmZvcm1hdCA9IHJlY29yZC0+ZmllbGRbaW5zbl9tbmVtb25pY19mb3JtYXRfZmllbGRdOwotICBBU1NFUlQgKG5ld19pbnNuX21uZW1vbmljLT5mb3JtYXRbMF0gPT0gJyInKTsKLSAgaWYgKG5ld19pbnNuX21uZW1vbmljLT5mb3JtYXRbc3RybGVuIChuZXdfaW5zbl9tbmVtb25pYy0+Zm9ybWF0KSAtIDFdICE9ICciJykKLSAgICBlcnJvciAobmV3X2luc25fbW5lbW9uaWMtPmxpbmUsICJNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlIGluIG1uZW1vbmljIGZpZWxkXG4iKTsKLSAgaWYgKHJlY29yZC0+bnJfZmllbGRzID4gaW5zbl9tbmVtb25pY19jb25kaXRpb25fZmllbGQpCi0gICAgbmV3X2luc25fbW5lbW9uaWMtPmNvbmRpdGlvbiA9IHJlY29yZC0+ZmllbGRbaW5zbl9tbmVtb25pY19jb25kaXRpb25fZmllbGRdOwotICBuZXdfaW5zbl9tbmVtb25pYy0+aW5zbiA9IGluc247Ci0gIC8qIGluc2VydCBpdCAqLwotICBsYXN0X2luc25fbW5lbW9uaWMgPSAmaW5zbi0+bW5lbW9uaWNzOwotICB3aGlsZSAoKCpsYXN0X2luc25fbW5lbW9uaWMpICE9IE5VTEwpCi0gICAgbGFzdF9pbnNuX21uZW1vbmljID0gJigqbGFzdF9pbnNuX21uZW1vbmljKS0+bmV4dDsKLSAgaW5zbi0+bnJfbW5lbW9uaWNzKys7Ci0gICpsYXN0X2luc25fbW5lbW9uaWMgPSBuZXdfaW5zbl9tbmVtb25pYzsKLX0KLQotCi1zdGF0aWMgdGFibGVfZW50cnkgKgotcGFyc2VfbWFjcm9fcmVjb3JkICh0YWJsZSAqZmlsZSwKLQkJICAgIHRhYmxlX2VudHJ5ICpyZWNvcmQpCi17Ci0jaWYgMQotICBlcnJvciAocmVjb3JkLT5saW5lLCAiTWFjcm9zIGFyZSBub3QgaW1wbGVtZW50ZWQiKTsKLSNlbHNlCi0gIC8qIHBhcnNlIHRoZSBkZWZpbmUgcmVjb3JkICovCi0gIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2RlZmluZV9maWVsZHMpCi0gICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBuciBmaWVsZHMgZm9yIGRlZmluZSByZWNvcmRcbiIpOwotICAvKiBwcm9jZXNzIGl0ICovCi0gIGlmICghaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLmZsYWdzX2ZpbHRlciwKLQkJCXJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pCi0gICAgICAmJiAhaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLm1vZGVsX2ZpbHRlciwKLQkJCSAgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKSkKLSAgICB7Ci0gICAgICB0YWJsZV9kZWZpbmUgKGZpbGUsCi0JCSAgICByZWNvcmQtPmxpbmUsCi0JCSAgICByZWNvcmQtPmZpZWxkW21hY3JvX25hbWVfZmllbGRdLAotCQkgICAgcmVjb3JkLT5maWVsZFttYWNyb19hcmdzX2ZpZWxkXSwKLQkJICAgIHJlY29yZC0+ZmllbGRbbWFjcm9fZXhwcl9maWVsZF0pOwotICAgIH0gIAotICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLSNlbmRpZgotICByZXR1cm4gcmVjb3JkOwotfQotCi0KLWluc25fdGFibGUgKgotbG9hZF9pbnNuX3RhYmxlIChjaGFyICpmaWxlX25hbWUsCi0JCSBjYWNoZV9lbnRyeSAqY2FjaGUpCi17Ci0gIHRhYmxlICpmaWxlID0gdGFibGVfb3BlbiAoZmlsZV9uYW1lKTsKLSAgdGFibGVfZW50cnkgKnJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOwotCi0gIGluc25fdGFibGUgKmlzYSA9IFpBTExPQyAoaW5zbl90YWJsZSk7Ci0gIG1vZGVsX3RhYmxlICptb2RlbCA9IFpBTExPQyAobW9kZWxfdGFibGUpOwotICAKLSAgaXNhLT5tb2RlbCA9IG1vZGVsOwotICBpc2EtPmNhY2hlcyA9IGNhY2hlOwotCi0gIHdoaWxlIChyZWNvcmQgIT0gTlVMTCkKLSAgICB7Ci0KLSAgICAgIHN3aXRjaCAocmVjb3JkX3R5cGUgKHJlY29yZCkpCi0JewotCi0JY2FzZSBpbmNsdWRlX3JlY29yZDoKLQkgIHsKLQkgICAgcmVjb3JkID0gcGFyc2VfaW5jbHVkZV9yZWNvcmQgKGZpbGUsIHJlY29yZCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBvcHRpb25fcmVjb3JkOgotCSAgewotCSAgICBpZiAoaXNhLT5pbnNucyAhPSBOVUxMKQotCSAgICAgIGVycm9yIChyZWNvcmQtPmxpbmUsICJPcHRpb24gYWZ0ZXIgZmlyc3QgaW5zdHJ1Y3Rpb25cbiIpOwotCSAgICByZWNvcmQgPSBwYXJzZV9vcHRpb25fcmVjb3JkIChmaWxlLCByZWNvcmQpOwotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlIHN0cmluZ19mdW5jdGlvbl9yZWNvcmQ6Ci0JICB7Ci0JICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiA9IE5VTEw7Ci0JICAgIHJlY29yZCA9IHBhcnNlX2Z1bmN0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkLAotCQkJCQkgICAgJmlzYS0+ZnVuY3Rpb25zLAotCQkJCQkgICAgJmZ1bmN0aW9uLAotCQkJCQkgICAgMC8qaXMtaW50ZXJuYWwqLywKLQkJCQkJICAgIG1vZGVsKTsKLQkgICAgLyogY29udmVydCBhIHN0cmluZyBmdW5jdGlvbiByZWNvcmQgaW50byBhbiBpbnRlcm5hbCBmdW5jdGlvbiAqLwotCSAgICBpZiAoZnVuY3Rpb24gIT0gTlVMTCkKLQkgICAgICB7Ci0JCWNoYXIgKm5hbWUgPSBOWkFMTE9DIChjaGFyLAotCQkJCSAgICAgIChzdHJsZW4gKCJzdHJfIikKLQkJCQkgICAgICAgKyBzdHJsZW4gKGZ1bmN0aW9uLT5uYW1lKQotCQkJCSAgICAgICArIDEpKTsKLQkJc3RyY2F0IChuYW1lLCAic3RyXyIpOwotCQlzdHJjYXQgKG5hbWUsIGZ1bmN0aW9uLT5uYW1lKTsKLQkJZnVuY3Rpb24tPm5hbWUgPSBuYW1lOwotCQlmdW5jdGlvbi0+dHlwZSA9ICJjb25zdCBjaGFyICoiOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JCi0JY2FzZSBmdW5jdGlvbl9yZWNvcmQ6IC8qIGZ1bmN0aW9uIHJlY29yZCAqLwotCSAgewotCSAgICByZWNvcmQgPSBwYXJzZV9mdW5jdGlvbl9yZWNvcmQgKGZpbGUsIHJlY29yZCwKLQkJCQkJICAgICZpc2EtPmZ1bmN0aW9ucywKLQkJCQkJICAgIE5VTEwsCi0JCQkJCSAgICAwLyppcy1pbnRlcm5hbCovLAotCQkJCQkgICAgbW9kZWwpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgaW50ZXJuYWxfcmVjb3JkOgotCSAgewotCSAgICAvKiBvbmx5IGluc2VydCBpdCBpbnRvIHRoZSBmdW5jdGlvbiBsaXN0IGlmIGl0IGlzIHVua25vd24gKi8KLQkgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uID0gTlVMTDsKLQkgICAgcmVjb3JkID0gcGFyc2VfZnVuY3Rpb25fcmVjb3JkIChmaWxlLCByZWNvcmQsCi0JCQkJCSAgICAmaXNhLT5mdW5jdGlvbnMsCi0JCQkJCSAgICAmZnVuY3Rpb24sCi0JCQkJCSAgICAxLyppcy1pbnRlcm5hbCovLAotCQkJCQkgICAgbW9kZWwpOwotCSAgICAvKiBjaGVjayB3aGF0IHdhcyBpbnNlcnRlZCB0byBzZWUgaWYgYSBwc2V1ZG8taW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgIGVudHJ5IGFsc28gbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotCSAgICBpZiAoZnVuY3Rpb24gIT0gTlVMTCkKLQkgICAgICB7Ci0JCWluc25fZW50cnkgKippbnNuID0gTlVMTDsKLQkJaWYgKHN0cmNtcCAoZnVuY3Rpb24tPm5hbWUsICJpbGxlZ2FsIikgPT0gMCkKLQkJICB7Ci0JCSAgICAvKiBpbGxlZ2FsIGZ1bmN0aW9uIHNhdmUgaXQgYXdheSAqLwotCQkgICAgaWYgKGlzYS0+aWxsZWdhbF9pbnNuICE9IE5VTEwpCi0JCSAgICAgIHsKLQkJCXdhcm5pbmcgKGZ1bmN0aW9uLT5saW5lLAotCQkJCSAiTXVsdGlwbGUgaWxsZWdhbCBpbnN0cnVjdGlvbiBkZWZpbml0aW9uc1xuIik7Ci0JCQllcnJvciAoaXNhLT5pbGxlZ2FsX2luc24tPmxpbmUsCi0JCQkgICAgICAgIkxvY2F0aW9uIG9mIGZpcnN0IGlsbGVnYWwgaW5zdHJ1Y3Rpb25cbiIpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIGluc24gPSAmaXNhLT5pbGxlZ2FsX2luc247Ci0JCSAgfQotCQlpZiAoaW5zbiAhPSBOVUxMKQotCQkgIHsKLQkJICAgICppbnNuID0gWkFMTE9DIChpbnNuX2VudHJ5KTsKLQkJICAgICgqaW5zbiktPmxpbmUgPSBmdW5jdGlvbi0+bGluZTsKLQkJICAgICgqaW5zbiktPm5hbWUgPSBmdW5jdGlvbi0+bmFtZTsKLQkJICAgICgqaW5zbiktPmNvZGUgPSBmdW5jdGlvbi0+Y29kZTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLQkgIAotCWNhc2Ugc2NyYXRjaF9yZWNvcmQ6IC8qIGNhY2hlIG1hY3JvIHJlY29yZHMgKi8KLQljYXNlIGNhY2hlX3JlY29yZDoKLQljYXNlIGNvbXB1dGVfcmVjb3JkOgotCSAgewotCSAgICBjYWNoZV9lbnRyeSAqbmV3X2NhY2hlOwotCSAgICAvKiBwYXJzZSB0aGUgY2FjaGUgcmVjb3JkICovCi0JICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2NhY2hlX2ZpZWxkcykKLQkgICAgICBlcnJvciAocmVjb3JkLT5saW5lLAotCQkgICAgICJJbmNvcnJlY3QgbnIgb2YgZmllbGRzIGZvciBzY3JhdGNoL2NhY2hlL2NvbXB1dGUgcmVjb3JkXG4iKTsKLQkgICAgLyogY3JlYXRlIGl0ICovCi0JICAgIG5ld19jYWNoZSA9IFpBTExPQyAoY2FjaGVfZW50cnkpOwotCSAgICBuZXdfY2FjaGUtPmxpbmUgPSByZWNvcmQtPmxpbmU7Ci0JICAgIGZpbHRlcl9wYXJzZSAoJm5ld19jYWNoZS0+ZmxhZ3MsCi0JCQkgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pOwotCSAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfY2FjaGUtPm1vZGVscywKLQkJCSAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZF0pOwotCSAgICBuZXdfY2FjaGUtPnR5cGUgPSByZWNvcmQtPmZpZWxkW2NhY2hlX3R5cGVkZWZfZmllbGRdOwotCSAgICBuZXdfY2FjaGUtPm5hbWUgPSByZWNvcmQtPmZpZWxkW2NhY2hlX25hbWVfZmllbGRdOwotCSAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfY2FjaGUtPm9yaWdpbmFsX2ZpZWxkcywKLQkJCSAgcmVjb3JkLT5maWVsZFtjYWNoZV9vcmlnaW5hbF9maWVsZHNfZmllbGRdKTsKLQkgICAgbmV3X2NhY2hlLT5leHByZXNzaW9uID0gcmVjb3JkLT5maWVsZFtjYWNoZV9leHByZXNzaW9uX2ZpZWxkXTsKLQkgICAgLyogaW5zZXJ0IGl0IGJ1dCBvbmx5IGlmIG5vdCBmaWx0ZXJlZCBvdXQgKi8KLQkgICAgaWYgKCFmaWx0ZXJfaXNfc3Vic2V0IChvcHRpb25zLmZsYWdzX2ZpbHRlciwgbmV3X2NhY2hlLT5mbGFncykpCi0JICAgICAgewotCQlub3RpZnkgKG5ld19jYWNoZS0+bGluZSwgIkRpc2NhcmRpbmcgY2FjaGUgZW50cnkgJXMgLSBmaWx0ZXIgZmxhZ3NcbiIsCi0JCQluZXdfY2FjaGUtPm5hbWUpOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLm1vZGVsX2ZpbHRlciwKLQkJCQkgICAgICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSkpCi0JICAgICAgewotCQlub3RpZnkgKG5ld19jYWNoZS0+bGluZSwgIkRpc2NhcmRpbmcgY2FjaGUgZW50cnkgJXMgLSBmaWx0ZXIgbW9kZWxzXG4iLAotCQkJbmV3X2NhY2hlLT5uYW1lKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNhY2hlX2VudHJ5ICoqbGFzdDsKLQkJbGFzdCA9ICZpc2EtPmNhY2hlczsKLQkJd2hpbGUgKCpsYXN0ICE9IE5VTEwpCi0JCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCQkqbGFzdCA9IG5ld19jYWNoZTsKLQkgICAgICB9Ci0JICAgIC8qIGFkdmFuY2UgdGhpbmdzICovCi0JICAgIHJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOwotCSAgICBicmVhazsKLQkgIH0KLQkKLQkvKiBtb2RlbCByZWNvcmRzICovCi0JY2FzZSBtb2RlbF9wcm9jZXNzb3JfcmVjb3JkOgotCSAgewotCSAgICBtb2RlbF9lbnRyeSAqbmV3X21vZGVsOwotCSAgICAvKiBwYXJzZSB0aGUgbW9kZWwgKi8KLQkgICAgaWYgKHJlY29yZC0+bnJfZmllbGRzIDwgbnJfbW9kZWxfcHJvY2Vzc29yX2ZpZWxkcykKLQkgICAgICBlcnJvciAocmVjb3JkLT5saW5lLCAiSW5jb3JyZWN0IG5yIG9mIGZpZWxkcyBmb3IgbW9kZWwgcmVjb3JkXG4iKTsKLQkgICAgaWYgKGlzYS0+aW5zbnMgIT0gTlVMTCkKLQkgICAgICBlcnJvciAocmVjb3JkLT5saW5lLCAiTW9kZWwgYXBwZWFycyBhZnRlciBmaXJzdCBpbnN0cnVjdGlvblxuIik7Ci0JICAgIG5ld19tb2RlbCA9IFpBTExPQyAobW9kZWxfZW50cnkpOwotCSAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfbW9kZWwtPmZsYWdzLAotCQkJICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKTsKLQkgICAgbmV3X21vZGVsLT5saW5lID0gcmVjb3JkLT5saW5lOwotCSAgICBuZXdfbW9kZWwtPm5hbWUgPSByZWNvcmQtPmZpZWxkW21vZGVsX25hbWVfZmllbGRdOwotCSAgICBuZXdfbW9kZWwtPmZ1bGxfbmFtZSA9IHJlY29yZC0+ZmllbGRbbW9kZWxfZnVsbF9uYW1lX2ZpZWxkXTsKLQkgICAgbmV3X21vZGVsLT51bml0X2RhdGEgPSByZWNvcmQtPmZpZWxkW21vZGVsX3VuaXRfZGF0YV9maWVsZF07Ci0JICAgIC8qIG9ubHkgaW5zZXJ0IGl0IGlmIG5vdCBmaWx0ZXJlZCBvdXQgKi8KLQkgICAgaWYgKCFmaWx0ZXJfaXNfc3Vic2V0IChvcHRpb25zLmZsYWdzX2ZpbHRlciwgbmV3X21vZGVsLT5mbGFncykpCi0JICAgICAgewotCQlub3RpZnkgKG5ld19tb2RlbC0+bGluZSwgIkRpc2NhcmRpbmcgcHJvY2Vzc29yIG1vZGVsICVzIC0gZmlsdGVyIGZsYWdzXG4iLAotCQkJbmV3X21vZGVsLT5uYW1lKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsCi0JCQkJICAgICAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZF0pKQotCSAgICAgIHsKLQkJbm90aWZ5IChuZXdfbW9kZWwtPmxpbmUsICJEaXNjYXJkaW5nIHByb2Nlc3NvciBtb2RlbCAlcyAtIGZpbHRlciBtb2RlbHNcbiIsCi0JCQluZXdfbW9kZWwtPm5hbWUpOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoZmlsdGVyX2lzX21lbWJlciAobW9kZWwtPnByb2Nlc3NvcnMsIG5ld19tb2RlbC0+bmFtZSkpCi0JICAgICAgewotCQllcnJvciAobmV3X21vZGVsLT5saW5lLCAiRHVwbGljYXRlIHByb2Nlc3NvciBtb2RlbCAlc1xuIiwKLQkJICAgICAgIG5ld19tb2RlbC0+bmFtZSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltb2RlbF9lbnRyeSAqKmxhc3Q7Ci0JCWxhc3QgPSAmbW9kZWwtPm1vZGVsczsKLQkJd2hpbGUgKCpsYXN0ICE9IE5VTEwpCi0JCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OwotCQkqbGFzdCA9IG5ld19tb2RlbDsKLQkJLyogY291bnQgaXQgKi8KLQkJbW9kZWwtPm5yX21vZGVscyArKzsKLQkJZmlsdGVyX3BhcnNlICgmbW9kZWwtPnByb2Nlc3NvcnMsIG5ld19tb2RlbC0+bmFtZSk7Ci0JICAgICAgfQotCSAgICAvKiBhZHZhbmNlIHRoaW5ncyAqLwotCSAgICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBtb2RlbF9tYWNyb19yZWNvcmQ6Ci0JICByZWNvcmQgPSBwYXJzZV9tb2RlbF9kYXRhX3JlY29yZCAoaXNhLCBmaWxlLCByZWNvcmQsCi0JCQkJCSAgICBucl9tb2RlbF9tYWNyb19maWVsZHMsCi0JCQkJCSAgICAmbW9kZWwtPm1hY3Jvcyk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgbW9kZWxfZGF0YV9yZWNvcmQ6Ci0JICByZWNvcmQgPSBwYXJzZV9tb2RlbF9kYXRhX3JlY29yZCAoaXNhLCBmaWxlLCByZWNvcmQsCi0JCQkJCSAgICBucl9tb2RlbF9kYXRhX2ZpZWxkcywKLQkJCQkJICAgICZtb2RlbC0+ZGF0YSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgbW9kZWxfc3RhdGljX3JlY29yZDoKLQkgIHJlY29yZCA9IHBhcnNlX2Z1bmN0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkLAotCQkJCQkgICZtb2RlbC0+c3RhdGljcywKLQkJCQkJICBOVUxMLAotCQkJCQkgIDAvKmlzIGludGVybmFsKi8sCi0JCQkJCSAgbW9kZWwpOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIG1vZGVsX2ludGVybmFsX3JlY29yZDoKLQkgIHJlY29yZCA9IHBhcnNlX2Z1bmN0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkLAotCQkJCQkgICZtb2RlbC0+aW50ZXJuYWxzLAotCQkJCQkgIE5VTEwsCi0JCQkJCSAgMS8qaXMgaW50ZXJuYWwqLywKLQkJCQkJICBtb2RlbCk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgbW9kZWxfZnVuY3Rpb25fcmVjb3JkOgotCSAgcmVjb3JkID0gcGFyc2VfZnVuY3Rpb25fcmVjb3JkIChmaWxlLCByZWNvcmQsCi0JCQkJCSAgJm1vZGVsLT5mdW5jdGlvbnMsCi0JCQkJCSAgTlVMTCwKLQkJCQkJICAwLyppcyBpbnRlcm5hbCovLAotCQkJCQkgIG1vZGVsKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBpbnNuX3JlY29yZDogLyogaW5zdHJ1Y3Rpb24gcmVjb3JkcyAqLwotCSAgewotCSAgICBpbnNuX2VudHJ5ICpuZXdfaW5zbjsKLQkgICAgY2hhciAqZm9ybWF0OwotCSAgICAvKiBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgaWYgKHJlY29yZC0+bnJfZmllbGRzIDwgbnJfaW5zbl9maWVsZHMpCi0JICAgICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBuciBvZiBmaWVsZHMgZm9yIGluc24gcmVjb3JkXG4iKTsKLQkgICAgbmV3X2luc24gPSBaQUxMT0MgKGluc25fZW50cnkpOwotCSAgICBuZXdfaW5zbi0+bGluZSA9IHJlY29yZC0+bGluZTsKLQkgICAgZmlsdGVyX3BhcnNlICgmbmV3X2luc24tPmZsYWdzLAotCQkJICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKTsKLQkgICAgLyogc2F2ZSB0aGUgZm9ybWF0IGZpZWxkLiAgQ2FuJ3QgcGFyc2UgaXQgdW50aWwgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICBmaWx0ZXItb3V0IGNoZWNrcy4gIENvdWxkIGJlIGZpbHRlcmVkIG91dCBiZWNhdXNlIHRoZQotICAgICAgICAgICAgICAgZm9ybWF0IGlzIGludmFsaWQgKi8KLQkgICAgZm9ybWF0ID0gcmVjb3JkLT5maWVsZFtpbnNuX3dvcmRfZmllbGRdOwotCSAgICBuZXdfaW5zbi0+Zm9ybWF0X25hbWUgPSByZWNvcmQtPmZpZWxkW2luc25fZm9ybWF0X25hbWVfZmllbGRdOwotCSAgICBpZiAob3B0aW9ucy5mb3JtYXRfbmFtZV9maWx0ZXIgIT0gTlVMTAotCQkmJiAhZmlsdGVyX2lzX21lbWJlciAob3B0aW9ucy5mb3JtYXRfbmFtZV9maWx0ZXIsCi0JCQkJICAgICAgbmV3X2luc24tPmZvcm1hdF9uYW1lKSkKLQkgICAgICBlcnJvciAobmV3X2luc24tPmxpbmUsICJVbnJlY29uaXplZCBpbnN0cnVjdGlvbiBmb3JtYXQgbmFtZSBgJXMnXG4iLAotCQkgICAgIG5ld19pbnNuLT5mb3JtYXRfbmFtZSk7Ci0JICAgIGZpbHRlcl9wYXJzZSAoJm5ld19pbnNuLT5vcHRpb25zLAotCQkJICByZWNvcmQtPmZpZWxkW2luc25fb3B0aW9uc19maWVsZF0pOwotCSAgICBuZXdfaW5zbi0+bmFtZSA9IHJlY29yZC0+ZmllbGRbaW5zbl9uYW1lX2ZpZWxkXTsKLQkgICAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7Ci0JICAgIC8qIFBhcnNlIGFueSBtb2RlbC9hc3NlbWJlciByZWNvcmRzICovCi0JICAgIG5ld19pbnNuLT5ucl9tb2RlbHMgPSBtb2RlbC0+bnJfbW9kZWxzOwotCSAgICBuZXdfaW5zbi0+bW9kZWwgPSBOWkFMTE9DIChpbnNuX21vZGVsX2VudHJ5KiwgbW9kZWwtPm5yX21vZGVscyArIDEpOwotCSAgICB3aGlsZSAocmVjb3JkICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAocmVjb3JkX3ByZWZpeF9pcyAocmVjb3JkLCAnKicsIG5yX2luc25fbW9kZWxfZmllbGRzKSkKLQkJICBwYXJzZV9pbnNuX21vZGVsX3JlY29yZCAoZmlsZSwgcmVjb3JkLCBuZXdfaW5zbiwgbW9kZWwpOwotCQllbHNlIGlmIChyZWNvcmRfcHJlZml4X2lzIChyZWNvcmQsICciJywgbnJfaW5zbl9tbmVtb25pY19maWVsZHMpKQotCQkgIHBhcnNlX2luc25fbW5lbW9uaWNfcmVjb3JkIChmaWxlLCByZWNvcmQsIG5ld19pbnNuKTsKLQkJZWxzZQotCQkgIGJyZWFrOwotCQkvKiBhZHZhbmNlICovCi0JCXJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOwotCSAgICAgIH0KLQkgICAgLyogUGFyc2UgdGhlIGNvZGUgcmVjb3JkICovCi0JICAgIGlmIChyZWNvcmQgIT0gTlVMTCAmJiByZWNvcmQtPnR5cGUgPT0gdGFibGVfY29kZV9lbnRyeSkKLQkgICAgICB7Ci0JCW5ld19pbnNuLT5jb2RlID0gcmVjb3JkOwotCQlyZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKG9wdGlvbnMud2Fybi51bmltcGxlbWVudGVkKQotCSAgICAgIG5vdGlmeSAobmV3X2luc24tPmxpbmUsICJ1bmltcGxlbWVudGVkXG4iKTsKLQkgICAgLyogaW5zZXJ0IGl0ICovCi0JICAgIGlmICghZmlsdGVyX2lzX3N1YnNldCAob3B0aW9ucy5mbGFnc19maWx0ZXIsIG5ld19pbnNuLT5mbGFncykpCi0JICAgICAgewotCQlpZiAob3B0aW9ucy53YXJuLmRpc2NhcmQpCi0JCSAgbm90aWZ5IChuZXdfaW5zbi0+bGluZSwKLQkJCSAgIkRpc2NhcmRpbmcgaW5zdHJ1Y3Rpb24gJXMgKGZsYWdzLWZpbHRlcilcbiIsCi0JCQkgIG5ld19pbnNuLT5uYW1lKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKG5ld19pbnNuLT5wcm9jZXNzb3JzICE9IE5VTEwKLQkJICAgICAmJiBvcHRpb25zLm1vZGVsX2ZpbHRlciAhPSBOVUxMCi0JCSAgICAgJiYgIWZpbHRlcl9pc19jb21tb24gKG9wdGlvbnMubW9kZWxfZmlsdGVyLAotCQkJCQkgICBuZXdfaW5zbi0+cHJvY2Vzc29ycykpCi0JICAgICAgewotCQkvKiBvbmx5IGRpc2NhcmQgYW4gaW5zdHJ1Y3Rpb24gYmFzZWQgaW4gdGhlIHByb2Nlc3NvcgotICAgICAgICAgICAgICAgICAgIG1vZGVsIHdoZW4gYm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcHRpb25zIGFyZQotICAgICAgICAgICAgICAgICAgIG5vbmVtcHR5ICovCi0JCWlmIChvcHRpb25zLndhcm4uZGlzY2FyZCkKLQkJICBub3RpZnkgKG5ld19pbnNuLT5saW5lLAotCQkJICAiRGlzY2FyZGluZyBpbnN0cnVjdGlvbiAlcyAocHJvY2Vzc29yLW1vZGVsKVxuIiwKLQkJCSAgbmV3X2luc24tPm5hbWUpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW5zbl9lbnRyeSAqKmxhc3Q7Ci0JCS8qIGZpbmlzaCB0aGUgcGFyc2luZyAqLwotCQlwYXJzZV9pbnNuX3dvcmRzIChuZXdfaW5zbiwgZm9ybWF0KTsKLQkJLyogYXBwZW5kIGl0ICovCi0JCWxhc3QgPSAmaXNhLT5pbnNuczsKLQkJd2hpbGUgKCpsYXN0KQotCQkgIGxhc3QgPSAmKCpsYXN0KS0+bmV4dDsKLQkJKmxhc3QgPSBuZXdfaW5zbjsKLQkJLyogdXBkYXRlIGdsb2JhbCBpc2EgY291bnRlcnMgKi8KLQkJaXNhLT5ucl9pbnNucyArKzsKLQkJaWYgKGlzYS0+bWF4X25yX3dvcmRzIDwgbmV3X2luc24tPm5yX3dvcmRzKQotCQkgIGlzYS0+bWF4X25yX3dvcmRzID0gbmV3X2luc24tPm5yX3dvcmRzOwotCQlmaWx0ZXJfYWRkICgmaXNhLT5mbGFncywgbmV3X2luc24tPmZsYWdzKTsKLQkJZmlsdGVyX2FkZCAoJmlzYS0+b3B0aW9ucywgbmV3X2luc24tPm9wdGlvbnMpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICAKLQljYXNlIGRlZmluZV9yZWNvcmQ6Ci0JICByZWNvcmQgPSBwYXJzZV9tYWNyb19yZWNvcmQgKGZpbGUsIHJlY29yZCk7Ci0JICBicmVhazsKLQotCWNhc2UgdW5rbm93bl9yZWNvcmQ6Ci0JY2FzZSBjb2RlX3JlY29yZDoKLQkgIGVycm9yIChyZWNvcmQtPmxpbmUsICJVbmtub3duIG9yIHVuZXhwZWN0ZWQgZW50cnlcbiIpOwotCi0KLQl9Ci0gICAgfQotICByZXR1cm4gaXNhOwotfQotCi0KLXZvaWQKLXByaW50X2luc25fd29yZHMgKGxmICpmaWxlLAotCQkgIGluc25fZW50cnkgKmluc24pCi17Ci0gIGluc25fd29yZF9lbnRyeSAqd29yZCA9IGluc24tPndvcmRzOwotICBpZiAod29yZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGluc25fZmllbGRfZW50cnkgKmZpZWxkID0gd29yZC0+Zmlyc3Q7Ci0JICB3aGlsZSAoMSkKLQkgICAgewotCSAgICAgIGlmIChvcHRpb25zLmluc25fc3BlY2lmeWluZ193aWR0aHMpCi0JCWxmX3ByaW50ZiAoZmlsZSwgIiVkLiIsIGZpZWxkLT53aWR0aCk7Ci0JICAgICAgZWxzZQotCQlsZl9wcmludGYgKGZpbGUsICIlZC4iLCBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIGZpZWxkLT5maXJzdCkpOwotCSAgICAgIHN3aXRjaCAoZmllbGQtPnR5cGUpCi0JCXsKLQkJY2FzZSBpbnNuX2ZpZWxkX2ludmFsaWQ6Ci0JCSAgQVNTRVJUICgwKTsKLQkJICBicmVhazsKLQkJY2FzZSBpbnNuX2ZpZWxkX2ludDoKLQkJICBsZl9wcmludGYgKGZpbGUsICIweCVseCIsIChsb25nKSBmaWVsZC0+dmFsX2ludCk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgaW5zbl9maWVsZF9yZXNlcnZlZDoKLQkJICBsZl9wcmludGYgKGZpbGUsICIvIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgaW5zbl9maWVsZF93aWxkOgotCQkgIGxmX3ByaW50ZiAoZmlsZSwgIioiKTsKLQkJICBicmVhazsKLQkJY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKLQkJICBsZl9wcmludGYgKGZpbGUsICIlcyIsIGZpZWxkLT52YWxfc3RyaW5nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChmaWVsZCA9PSB3b3JkLT5sYXN0KQotCQlicmVhazsKLQkgICAgICBmaWVsZCA9IGZpZWxkLT5uZXh0OwotCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiwiKTsKLQkgICAgfQotCSAgd29yZCA9IHdvcmQtPm5leHQ7Ci0JICBpZiAod29yZCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIisiKTsKLQl9Ci0gICAgfQotfQotCi0KLQwKLXZvaWQKLWZ1bmN0aW9uX2VudHJ5X3RyYXZlcnNlIChsZiAqZmlsZSwKLQkJCSBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zLAotCQkJIGZ1bmN0aW9uX2VudHJ5X2hhbmRsZXIgKmhhbmRsZXIsCi0JCQkgdm9pZCAqZGF0YSkKLXsKLSAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uOwotICBmb3IgKGZ1bmN0aW9uID0gZnVuY3Rpb25zOyBmdW5jdGlvbiAhPSBOVUxMOyBmdW5jdGlvbiA9IGZ1bmN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGhhbmRsZXIgKGZpbGUsIGZ1bmN0aW9uLCBkYXRhKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWluc25fdGFibGVfdHJhdmVyc2VfaW5zbiAobGYgKmZpbGUsCi0JCQkgIGluc25fdGFibGUgKmlzYSwKLQkJCSAgaW5zbl9lbnRyeV9oYW5kbGVyICpoYW5kbGVyLAotCQkJICB2b2lkICpkYXRhKQotewotICBpbnNuX2VudHJ5ICppbnNuOwotICBmb3IgKGluc24gPSBpc2EtPmluc25zOyBpbnNuICE9IE5VTEw7IGluc24gPSBpbnNuLT5uZXh0KQotICAgIHsKLSAgICAgIGhhbmRsZXIgKGZpbGUsIGlzYSwgaW5zbiwgZGF0YSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotZHVtcF9mdW5jdGlvbl9lbnRyeSAobGYgKmZpbGUsCi0JCSAgICAgY2hhciAqcHJlZml4LAotCQkgICAgIGZ1bmN0aW9uX2VudHJ5ICplbnRyeSwKLQkJICAgICBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGZ1bmN0aW9uX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOwotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBlbnRyeS0+bGluZSwgIikiKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmxhZ3MgIiwgZW50cnktPmZsYWdzLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odHlwZSBcIiVzXCIpIiwgZW50cnktPnR5cGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmFtZSBcIiVzXCIpIiwgZW50cnktPm5hbWUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4ocGFyYW0gXCIlc1wiKSIsIGVudHJ5LT5wYXJhbSk7Ci0gICAgICBkdW1wX3RhYmxlX2VudHJ5IChmaWxlLCAiXG4oY29kZSAiLCBlbnRyeS0+Y29kZSwgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGlzX2ludGVybmFsICVkKSIsIGVudHJ5LT5pc19pbnRlcm5hbCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuZXh0IDB4JWx4KSIsIChsb25nKSBlbnRyeS0+bmV4dCk7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2Z1bmN0aW9uX2VudHJpZXMgKGxmICpmaWxlLAotCQkgICAgICAgY2hhciAqcHJlZml4LAotCQkgICAgICAgZnVuY3Rpb25fZW50cnkgKmVudHJ5LAotCQkgICAgICAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2Z1bmN0aW9uX2VudHJ5IChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7Ci0gICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OwotICAgIH0KLSAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotc3RhdGljIGNoYXIgKgotY2FjaGVfZW50cnlfdHlwZV90b19zdHIgKGNhY2hlX2VudHJ5X3R5cGUgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIHNjcmF0Y2hfdmFsdWU6IHJldHVybiAic2NyYXRjaCI7Ci0gICAgY2FzZSBjYWNoZV92YWx1ZTogcmV0dXJuICJjYWNoZSI7Ci0gICAgY2FzZSBjb21wdXRlX3ZhbHVlOiByZXR1cm4gImNvbXB1dGUiOwotICAgIH0KLSAgRVJST1IgKCJCYWQgc3dpdGNoIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jYWNoZV9lbnRyeSAobGYgKmZpbGUsCi0JCSAgY2hhciAqcHJlZml4LAotCQkgIGNhY2hlX2VudHJ5ICplbnRyeSwKLQkJICBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGNhY2hlX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOwotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBlbnRyeS0+bGluZSwgIikiKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmxhZ3MgIiwgZW50cnktPmZsYWdzLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZW50cnlfdHlwZSBcIiVzXCIpIiwgY2FjaGVfZW50cnlfdHlwZV90b19zdHIgKGVudHJ5LT5lbnRyeV90eXBlKSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuYW1lIFwiJXNcIikiLCBlbnRyeS0+bmFtZSk7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKG9yaWdpbmFsX2ZpZWxkcyAiLCBlbnRyeS0+b3JpZ2luYWxfZmllbGRzLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odHlwZSBcIiVzXCIpIiwgZW50cnktPnR5cGUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZXhwcmVzc2lvbiBcIiVzXCIpIiwgZW50cnktPmV4cHJlc3Npb24pOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgZW50cnktPm5leHQpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi12b2lkCi1kdW1wX2NhY2hlX2VudHJpZXMgKGxmICpmaWxlLAotCQkgICAgY2hhciAqcHJlZml4LAotCQkgICAgY2FjaGVfZW50cnkgKmVudHJ5LAotCQkgICAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2NhY2hlX2VudHJ5IChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7Ci0gICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OwotICAgIH0KLSAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfbW9kZWxfZGF0YSAobGYgKmZpbGUsCi0JCSBjaGFyICpwcmVmaXgsCi0JCSBtb2RlbF9kYXRhICplbnRyeSwKLQkJIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMobW9kZWxfZGF0YSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKLSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBlbnRyeS0+bGluZSwgIikiKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmxhZ3MgIiwgZW50cnktPmZsYWdzLCAiKSIpOwotICAgICAgZHVtcF90YWJsZV9lbnRyeSAoZmlsZSwgIlxuKGVudHJ5ICIsIGVudHJ5LT5lbnRyeSwgIikiKTsKLSAgICAgIGR1bXBfdGFibGVfZW50cnkgKGZpbGUsICJcbihjb2RlICIsIGVudHJ5LT5jb2RlLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgZW50cnktPm5leHQpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX21vZGVsX2RhdGFzIChsZiAqZmlsZSwKLQkJICBjaGFyICpwcmVmaXgsCi0JCSAgbW9kZWxfZGF0YSAqZW50cnksCi0JCSAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX21vZGVsX2RhdGEgKGZpbGUsICJcbigiLCBlbnRyeSwgIikiKTsKLSAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9tb2RlbF9lbnRyeSAobGYgKmZpbGUsCi0JCSAgY2hhciAqcHJlZml4LAotCQkgIG1vZGVsX2VudHJ5ICplbnRyeSwKLQkJICBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKG1vZGVsX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOwotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIGVudHJ5LT5saW5lLCAiKSIpOwotICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihmbGFncyAiLCBlbnRyeS0+ZmxhZ3MsICIpIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuYW1lIFwiJXNcIikiLCBlbnRyeS0+bmFtZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihmdWxsX25hbWUgXCIlc1wiKSIsIGVudHJ5LT5mdWxsX25hbWUpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odW5pdF9kYXRhIFwiJXNcIikiLCBlbnRyeS0+dW5pdF9kYXRhKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9tb2RlbF9lbnRyaWVzIChsZiAqZmlsZSwKLQkJICAgIGNoYXIgKnByZWZpeCwKLQkJICAgIG1vZGVsX2VudHJ5ICplbnRyeSwKLQkJICAgIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOwotICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCi0gICAgewotICAgICAgZHVtcF9tb2RlbF9lbnRyeSAoZmlsZSwgIlxuKCIsIGVudHJ5LCAiKSIpOwotICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLSAgICB9Ci0gIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWR1bXBfbW9kZWxfdGFibGUgKGxmICpmaWxlLAotCQkgIGNoYXIgKnByZWZpeCwKLQkJICBtb2RlbF90YWJsZSAqZW50cnksCi0JCSAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhtb2RlbF90YWJsZSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKLSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKHByb2Nlc3NvcnMgIiwgZW50cnktPnByb2Nlc3NvcnMsICIpIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihucl9tb2RlbHMgJWQpIiwgZW50cnktPm5yX21vZGVscyk7Ci0gICAgICBkdW1wX21vZGVsX2VudHJpZXMgKGZpbGUsICJcbihtb2RlbHMgIiwgZW50cnktPm1vZGVscywgIikiKTsKLSAgICAgIGR1bXBfbW9kZWxfZGF0YXMgKGZpbGUsICJcbihtYWNyb3MgIiwgZW50cnktPm1hY3JvcywgIikiKTsKLSAgICAgIGR1bXBfbW9kZWxfZGF0YXMgKGZpbGUsICJcbihkYXRhICIsIGVudHJ5LT5kYXRhLCAiKSIpOwotICAgICAgZHVtcF9mdW5jdGlvbl9lbnRyaWVzIChmaWxlLCAiXG4oc3RhdGljcyAiLCBlbnRyeS0+c3RhdGljcywgIikiKTsKLSAgICAgIGR1bXBfZnVuY3Rpb25fZW50cmllcyAoZmlsZSwgIlxuKGludGVybmFscyAiLCBlbnRyeS0+ZnVuY3Rpb25zLCAiKSIpOwotICAgICAgZHVtcF9mdW5jdGlvbl9lbnRyaWVzIChmaWxlLCAiXG4oZnVuY3Rpb25zICIsIGVudHJ5LT5mdW5jdGlvbnMsICIpIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi1zdGF0aWMgY2hhciAqCi1pbnNuX2ZpZWxkX3R5cGVfdG9fc3RyIChpbnNuX2ZpZWxkX3R5cGUgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIGluc25fZmllbGRfaW52YWxpZDogQVNTRVJUICgwKTsgcmV0dXJuICIoaW52YWxpZCkiOwotICAgIGNhc2UgaW5zbl9maWVsZF9pbnQ6IHJldHVybiAiaW50IjsKLSAgICBjYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6IHJldHVybiAicmVzZXJ2ZWQiOwotICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOiByZXR1cm4gIndpbGQiOwotICAgIGNhc2UgaW5zbl9maWVsZF9zdHJpbmc6IHJldHVybiAic3RyaW5nIjsKLSAgICB9Ci0gIEVSUk9SICgiYmFkIHN3aXRjaCIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZHVtcF9pbnNuX2ZpZWxkIChsZiAqZmlsZSwKLQkJIGNoYXIgKnByZWZpeCwKLQkJIGluc25fZmllbGRfZW50cnkgKmZpZWxkLAotCQkgY2hhciAqc3VmZml4KQotewotICBjaGFyICpzZXAgPSAiICI7Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGluc25fZmllbGRfZW50cnkgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBmaWVsZCk7Ci0gIGlmIChmaWVsZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMoZmlyc3QgJWQpIiwgc2VwLCBmaWVsZC0+Zmlyc3QpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMobGFzdCAlZCkiLCBzZXAsIGZpZWxkLT5sYXN0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHdpZHRoICVkKSIsIHNlcCwgZmllbGQtPndpZHRoKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHR5cGUgJXMpIiwgc2VwLCBpbnNuX2ZpZWxkX3R5cGVfdG9fc3RyIChmaWVsZC0+dHlwZSkpOwotICAgICAgc3dpdGNoIChmaWVsZC0+dHlwZSkKLQl7Ci0JY2FzZSBpbnNuX2ZpZWxkX2ludmFsaWQ6Ci0JICBBU1NFUlQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX2ludDoKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHZhbCAweCVseCkiLCBzZXAsIChsb25nKSBmaWVsZC0+dmFsX2ludCk7Ci0JICBicmVhazsKLQljYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6Ci0JICAvKiBub3RoaW5nIG91dHB1dCAqLwotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX3dpbGQ6Ci0JICAvKiBub3RoaW5nIG91dHB1dCAqLwotCSAgYnJlYWs7Ci0JY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKLQkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHZhbCBcIiVzXCIpIiwgc2VwLCBmaWVsZC0+dmFsX3N0cmluZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIlcyhuZXh0IDB4JWx4KSIsIHNlcCwgKGxvbmcpIGZpZWxkLT5uZXh0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHByZXYgMHglbHgpIiwgc2VwLCAobG9uZykgZmllbGQtPnByZXYpOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLXZvaWQKLWR1bXBfaW5zbl93b3JkX2VudHJ5IChsZiAqZmlsZSwKLQkJICAgICAgY2hhciAqcHJlZml4LAotCQkgICAgICBpbnNuX3dvcmRfZW50cnkgKndvcmQsCi0JCSAgICAgIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMoaW5zbl93b3JkX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgd29yZCk7Ci0gIGlmICh3b3JkICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZDsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZmlyc3QgMHglbHgpIiwgKGxvbmcpIHdvcmQtPmZpcnN0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGxhc3QgMHglbHgpIiwgKGxvbmcpIHdvcmQtPmxhc3QpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oYml0Iik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5pbnNuX2JpdF9zaXplOyBpKyspCi0JbGZfcHJpbnRmIChmaWxlLCAiXG4gKCh2YWx1ZSAlZCkgKG1hc2sgJWQpIChmaWVsZCAweCVseCkpIiwKLQkJICAgd29yZC0+Yml0W2ldLT52YWx1ZSwgd29yZC0+Yml0W2ldLT5tYXNrLCAobG9uZykgd29yZC0+Yml0W2ldLT5maWVsZCk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0gICAgICBmb3IgKGZpZWxkID0gd29yZC0+Zmlyc3Q7IGZpZWxkICE9IE5VTEw7IGZpZWxkID0gZmllbGQtPm5leHQpCi0JZHVtcF9pbnNuX2ZpZWxkIChmaWxlLCAiXG4oIiwgZmllbGQsICIpIik7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGZpZWxkX25hbWVzICIsIHdvcmQtPmZpZWxkX25hbWVzLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgd29yZC0+bmV4dCk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaW5zbl93b3JkX2VudHJpZXMgKGxmICpmaWxlLAotCQkJY2hhciAqcHJlZml4LAotCQkJaW5zbl93b3JkX2VudHJ5ICp3b3JkLAotCQkJY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIHdoaWxlICh3b3JkICE9IE5VTEwpCi0gICAgewotICAgICAgZHVtcF9pbnNuX3dvcmRfZW50cnkgKGZpbGUsICJcbigiLCB3b3JkLCAiKSIpOwotICAgICAgd29yZCA9IHdvcmQtPm5leHQ7Ci0gICAgfQotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2luc25fbW9kZWxfZW50cnkgKGxmICpmaWxlLAotCQkgICAgICAgY2hhciAqcHJlZml4LAotCQkgICAgICAgaW5zbl9tb2RlbF9lbnRyeSAqbW9kZWwsCi0JCSAgICAgICBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGluc25fbW9kZWxfZW50cnkgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBtb2RlbCk7Ci0gIGlmIChtb2RlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgbW9kZWwtPmxpbmUsICIpIik7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKG5hbWVzICIsIG1vZGVsLT5uYW1lcywgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZ1bGxfbmFtZSBcIiVzXCIpIiwgbW9kZWwtPmZ1bGxfbmFtZSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbih1bml0X2RhdGEgXCIlc1wiKSIsIG1vZGVsLT51bml0X2RhdGEpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaW5zbiAoaW5zbl9lbnRyeSAqKSAweCVseCkiLCAobG9uZykgbW9kZWwtPmluc24pOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAoaW5zbl9tb2RlbF9lbnRyeSAqKSAweCVseCkiLAotCQkgKGxvbmcpIG1vZGVsLT5uZXh0KTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9pbnNuX21vZGVsX2VudHJpZXMgKGxmICpmaWxlLAotCQkJIGNoYXIgKnByZWZpeCwKLQkJCSBpbnNuX21vZGVsX2VudHJ5ICptb2RlbCwKLQkJCSBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcHJlZml4KTsKLSAgd2hpbGUgKG1vZGVsICE9IE5VTEwpCi0gICAgewotICAgICAgZHVtcF9pbnNuX21vZGVsX2VudHJ5IChmaWxlLCAiXG4iLCBtb2RlbCwgIiIpOwotICAgICAgbW9kZWwgPSBtb2RlbC0+bmV4dDsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZHVtcF9pbnNuX21uZW1vbmljX2VudHJ5IChsZiAqZmlsZSwKLQkJCSAgY2hhciAqcHJlZml4LAotCQkJICBpbnNuX21uZW1vbmljX2VudHJ5ICptbmVtb25pYywKLQkJCSAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX21uZW1vbmljX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgbW5lbW9uaWMpOwotICBpZiAobW5lbW9uaWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIG1uZW1vbmljLT5saW5lLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZm9ybWF0IFwiJXNcIikiLCBtbmVtb25pYy0+Zm9ybWF0KTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGNvbmRpdGlvbiBcIiVzXCIpIiwgbW5lbW9uaWMtPmNvbmRpdGlvbik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihpbnNuIChpbnNuX2VudHJ5ICopIDB4JWx4KSIsCi0JCSAobG9uZykgbW5lbW9uaWMtPmluc24pOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAoaW5zbl9tbmVtb25pY19lbnRyeSAqKSAweCVseCkiLAotCQkgKGxvbmcpIG1uZW1vbmljLT5uZXh0KTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9pbnNuX21uZW1vbmljX2VudHJpZXMgKGxmICpmaWxlLAotCQkJICAgIGNoYXIgKnByZWZpeCwKLQkJCSAgICBpbnNuX21uZW1vbmljX2VudHJ5ICptbmVtb25pYywKLQkJCSAgICBjaGFyICpzdWZmaXgpCi17Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcHJlZml4KTsKLSAgd2hpbGUgKG1uZW1vbmljICE9IE5VTEwpCi0gICAgewotICAgICAgZHVtcF9pbnNuX21uZW1vbmljX2VudHJ5IChmaWxlLCAiXG4iLCBtbmVtb25pYywgIiIpOwotICAgICAgbW5lbW9uaWMgPSBtbmVtb25pYy0+bmV4dDsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotdm9pZAotZHVtcF9pbnNuX2VudHJ5IChsZiAqZmlsZSwKLQkJIGNoYXIgKnByZWZpeCwKLQkJIGluc25fZW50cnkgKmVudHJ5LAotCQkgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOwotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgZW50cnktPmxpbmUsICIpIik7Ci0gICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGZsYWdzICIsIGVudHJ5LT5mbGFncywgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5yX3dvcmRzICVkKSIsIGVudHJ5LT5ucl93b3Jkcyk7Ci0gICAgICBkdW1wX2luc25fd29yZF9lbnRyaWVzIChmaWxlLCAiXG4od29yZHMgIiwgZW50cnktPndvcmRzLCAiKSIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od29yZCIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVudHJ5LT5ucl9tb2RlbHM7IGkrKykKLQlsZl9wcmludGYgKGZpbGUsICIgMHglbHgiLCAobG9uZykgZW50cnktPndvcmRbaV0pOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOwotICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihmaWVsZF9uYW1lcyAiLCBlbnRyeS0+ZmllbGRfbmFtZXMsICIpIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihmb3JtYXRfbmFtZSBcIiVzXCIpIiwgZW50cnktPmZvcm1hdF9uYW1lKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4ob3B0aW9ucyAiLCBlbnRyeS0+b3B0aW9ucywgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5hbWUgXCIlc1wiKSIsIGVudHJ5LT5uYW1lKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5yX21vZGVscyAlZCkiLCBlbnRyeS0+bnJfbW9kZWxzKTsKLSAgICAgIGR1bXBfaW5zbl9tb2RlbF9lbnRyaWVzIChmaWxlLCAiXG4obW9kZWxzICIsIGVudHJ5LT5tb2RlbHMsICIpIik7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihtb2RlbCIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVudHJ5LT5ucl9tb2RlbHM7IGkrKykKLQlsZl9wcmludGYgKGZpbGUsICIgMHglbHgiLCAobG9uZykgZW50cnktPm1vZGVsW2ldKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKLSAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4ocHJvY2Vzc29ycyAiLCBlbnRyeS0+cHJvY2Vzc29ycywgIikiKTsKLSAgICAgIGR1bXBfaW5zbl9tbmVtb25pY19lbnRyaWVzIChmaWxlLCAiXG4obW5lbW9uaWNzICIsIGVudHJ5LT5tbmVtb25pY3MsICIpIik7Ci0gICAgICBkdW1wX3RhYmxlX2VudHJ5IChmaWxlLCAiXG4oY29kZSAiLCBlbnRyeS0+Y29kZSwgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaW5zbl9lbnRyaWVzIChsZiAqZmlsZSwKLQkJICAgY2hhciAqcHJlZml4LAotCQkgICBpbnNuX2VudHJ5ICplbnRyeSwKLQkJICAgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7Ci0gIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkdW1wX2luc25fZW50cnkgKGZpbGUsICJcbigiLCBlbnRyeSwgIikiKTsKLSAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0KLQotdm9pZAotZHVtcF9pbnNuX3RhYmxlIChsZiAqZmlsZSwKLQkJIGNoYXIgKnByZWZpeCwKLQkJIGluc25fdGFibGUgKmlzYSwKLQkJIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMoaW5zbl90YWJsZSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGlzYSk7Ci0gIGlmIChpc2EgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKLSAgICAgIGR1bXBfY2FjaGVfZW50cmllcyAoZmlsZSwgIlxuKGNhY2hlcyAiLCBpc2EtPmNhY2hlcywgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5yX2luc25zICVkKSIsIGlzYS0+bnJfaW5zbnMpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obWF4X25yX3dvcmRzICVkKSIsIGlzYS0+bWF4X25yX3dvcmRzKTsKLSAgICAgIGR1bXBfaW5zbl9lbnRyaWVzIChmaWxlLCAiXG4oaW5zbnMgIiwgaXNhLT5pbnNucywgIikiKTsKLSAgICAgIGR1bXBfZnVuY3Rpb25fZW50cmllcyAoZmlsZSwgIlxuKGZ1bmN0aW9ucyAiLCBpc2EtPmZ1bmN0aW9ucywgIikiKTsKLSAgICAgIGR1bXBfaW5zbl9lbnRyeSAoZmlsZSwgIlxuKGlsbGVnYWxfaW5zbiAiLCBpc2EtPmlsbGVnYWxfaW5zbiwgIikiKTsKLSAgICAgIGR1bXBfbW9kZWxfdGFibGUgKGZpbGUsICJcbihtb2RlbCAiLCBpc2EtPm1vZGVsLCAiKSIpOwotICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihmbGFncyAiLCBpc2EtPmZsYWdzLCAiKSIpOwotICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihvcHRpb25zICIsIGlzYS0+b3B0aW9ucywgIikiKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOwotICAgIH0KLSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOwotfQotCi0jaWZkZWYgTUFJTgotCi1pZ2VuX29wdGlvbnMgb3B0aW9uczsKLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGluc25fdGFibGUgKmlzYTsKLSAgbGYgKmw7Ci0KLSAgSU5JVF9PUFRJT05TIChvcHRpb25zKTsKLQotICBpZiAoYXJnYyA9PSAzKQotICAgIGZpbHRlcl9wYXJzZSAoJm9wdGlvbnMuZmxhZ3NfZmlsdGVyLCBhcmd2WzJdKTsKLSAgZWxzZSBpZiAoYXJnYyAhPSAyKQotICAgIGVycm9yIChOVUxMLCAiVXNhZ2U6IGluc24gPGluc24tdGFibGU+IFsgPGZpbHRlci1pbj4gXVxuIik7Ci0KLSAgaXNhID0gbG9hZF9pbnNuX3RhYmxlIChhcmd2WzFdLCBOVUxMKTsKLSAgbCA9IGxmX29wZW4gKCItIiwgInN0ZG91dCIsIGxmX29taXRfcmVmZXJlbmNlcywgbGZfaXNfdGV4dCwgInRtcC1sZC1pbnNuIik7Ci0gIGR1bXBfaW5zbl90YWJsZSAobCwgIihpc2EgIiwgaXNhLCAiKVxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vbGQtaW5zbi5oIGIvc2ltL2lnZW4vbGQtaW5zbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjlkMjQwLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2xkLWluc24uaAorKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4IEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLQotdHlwZWRlZiB1bnNpZ25lZDY0IGluc25fdWludDsKLQotCi0vKiBDb21tb24gYW1vbmcgbW9zdCBlbnRyaWVzOgotCi0gICBBbGwgbm9uIGluc3RydWN0aW9uIHJlY29yZHMgaGF2ZSB0aGUgZm9ybWF0OgotCi0gICA8Li4uPiA6Oj0KLSAgICAgICAiOiIgPHJlY29yZC1uYW1lPgotICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgotICAgICAgICI6IiA8ZmlsdGVyLW1vZGVscz4KLSAgICAgICAiOiIgLi4uCi0gICAKLSAqLwotCi1lbnVtIHsKLSAgcmVjb3JkX3R5cGVfZmllbGQgPSAxLAotICBvbGRfcmVjb3JkX3R5cGVfZmllbGQgPSAyLAotICByZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkID0gMiwKLSAgcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGQgPSAzLAotfTsKLQotCi0vKiBJbmNsdWRlOgotCi0gICBJbmNsdWRlIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQotICAgPGluY2x1ZGU+IDo6PQotICAgICAgICI6IiAiaW5jbHVkZSIKLSAgICAgICAiOiIgPGZpbHRlci1mbGFncz4KLSAgICAgICAiOiIgPGZpbHRlci1tb2RlbHM+Ci0gICAgICAgIjoiIDxmaWxlbmFtZT4KLSAgICAgICA8bmw+Ci0gICAgICAgOwotCi0gICAqLwotCi1lbnVtIHsKLSAgaW5jbHVkZV9maWxlbmFtZV9maWVsZCA9IDQsCi0gIG5yX2luY2x1ZGVfZmllbGRzLAotfTsKLQotCi0KLS8qIE9wdGlvbnM6Ci0KLSAgIFZhbGlkIG9wdGlvbnMgYXJlOiBoaS1iaXQtbnIgKGRlZmF1bHQgMCksIGluc24tYml0LXNpemUgKGRlZmF1bHQKLSAgIDMyKSwgaW5zbi1zcGVjaWZ5aW5nLXdpZHRocyAoZGVmYXVsdCB0cnVlKSwgbXVsdGktc2ltIChkZWZhdWx0IGZhbHNlKS4KLQotICAgPG9wdGlvbj4gOjo9Ci0gICAgICAgIjoiICJvcHRpb24iCi0gICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0gICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgotICAgICAgICI6IiA8b3B0aW9uLW5hbWU+Ci0gICAgICAgIjoiIDxvcHRpb24tdmFsdWU+Ci0gICAgICAgPG5sPgotICAgICAgIDsKLQotICAgPG9wdGlvbi1uYW1lPiA6Oj0KLSAgICAgICAiaW5zbi1iaXQtc2l6ZSIKLSAgICAgICB8ICJpbnNuLXNwZWNpZnlpbmctd2lkdGhzIgotICAgICAgIHwgImhpLWJpdC1uciIKLSAgICAgICB8ICJmbGFncy1maWx0ZXIiCi0gICAgICAgfCAibW9kZWwtZmlsdGVyIgotICAgICAgIHwgIm11bHRpLXNpbSIKLSAgICAgICB8ICJmb3JtYXQtbmFtZXMiCi0gICAgICAgOwotCi0gICA8b3B0aW9uLXZhbHVlPiA6Oj0KLSAgICAgICAidHJ1ZSIKLSAgICAgICB8ICJmYWxzZSIKLSAgICAgICB8IDxpbnRlZ2VyPgotICAgICAgIHwgPGxpc3Q+Ci0gICAgICAgOwotCi0KLSAgIFRoZXNlIHVwZGF0ZSB0aGUgZ2xvYmFsIG9wdGlvbnMgc3RydWN0dXJlLiAqLyAgICAgICAKLQotCi1lbnVtIHsKLSAgb3B0aW9uX25hbWVfZmllbGQgPSA0LAotICBvcHRpb25fdmFsdWVfZmllbGQsCi0gIG5yX29wdGlvbl9maWVsZHMsCi19OwotCi0KLQotLyogTWFjcm8gZGVmaW5pdGlvbnM6Ci0KLSAgIDxpbnNuLW1hY3JvPiA6Oj0KLSAgICAgICAiOiIgImRlZmluZSIKLSAgICAgICAiOiIgPGZpbHRlci1mbGFncz4KLSAgICAgICAiOiIgPGZpbHRlci1tb2RlbHM+Ci0gICAgICAgIjoiIDxuYW1lPgotICAgICAgICI6IiA8YXJnLWxpc3Q+Ci0gICAgICAgIjoiIDxleHByZXNzaW9uPgotICAgICAgIDxubD4KLSAgICAgICA7Ci0KLSAgIDxhcmctbGlzdD4gOjo9Ci0gICAgICAgWyA8bmFtZT4geyAiLCIgPGFyZy1saXN0PiB9IF0KLSAgICAgICA7Ci0KLSAgICovCi0KLQotZW51bSB7Ci0gIG1hY3JvX25hbWVfZmllbGQgPSA0LAotICBtYWNyb19hcmdzX2ZpZWxkLAotICBtYWNyb19leHByX2ZpZWxkLAotICBucl9tYWNyb19maWVsZHMsCi19OwotCi0KLQotLyogRnVuY3Rpb25zIGFuZCBpbnRlcm5hbCByb3V0aW5zOgotCi0gICBOQjogPGZpbHRlci1tb2RlbHM+IGFuZCA8ZnVuY3Rpb24tbW9kZWxzPiBhcmUgZXF1aXZhbGVudC4KLQotCi0gICA8ZnVuY3Rpb24+IDo6PQotICAgICAgICI6IiAiZnVuY3Rpb24iCi0gICAgICAgPGZ1bmN0aW9uLXNwZWM+Ci0gICAgICAgOwotCi0gICA8aW50ZXJuYWw+IDo6PQotICAgICAgICI6IiAiaW50ZXJuYWwiCi0gICAgICAgPGZ1bmN0aW9uLXNwZWM+Ci0gICAgICAgOwotCi0gICA8Zm9ybWF0PiA6Oj0KLSAgICAgICAiOiIgKCAiJXMiIHwgLi4uICkKLSAgICAgICA8ZnVuY3Rpb24tc3BlYz4KLSAgICAgICA7Ci0KLSAgIDxmdW5jdGlvbi1tb2RlbD4gOjo9Ci0gICAgICAgIioiIFsgPHByb2Nlc3Nvci1saXN0PiBdCi0gICAgICAgIjoiCi0gICAgICAgPG5sPgotICAgICAgIDsKLQotICAgPGZ1bmN0aW9uLXNwZWM+IDo6PQotICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgotICAgICAgICI6IiA8ZmlsdGVyLW1vZGVscz4KLSAgICAgICAiOiIgPHR5cGVkZWY+Ci0gICAgICAgIjoiIDxuYW1lPgotICAgICAgIFsgIjoiIDxwYXJhbWV0ZXItbGlzdD4gXQotICAgICAgIDxubD4KLSAgICAgICBbIDxmdW5jdGlvbi1tb2RlbD4gXQotICAgICAgIDxjb2RlLWJsb2NrPgotICAgICAgIDsKLQotICAgKi8KLQotZW51bSB7Ci0gIGZ1bmN0aW9uX3R5cGVkZWZfZmllbGQgPSA0LAotICBmdW5jdGlvbl9uYW1lX2ZpZWxkLAotICBmdW5jdGlvbl9wYXJhbV9maWVsZCwKLSAgbnJfZnVuY3Rpb25fZmllbGRzLAotfTsKLQotZW51bSB7Ci0gIGZ1bmN0aW9uX21vZGVsX25hbWVfZmllbGQgPSAwLAotICBucl9mdW5jdGlvbl9tb2RlbF9maWVsZHMgPSAxLAotfTsKLQotZW51bSB7Ci0gIG9sZF9mdW5jdGlvbl90eXBlZGVmX2ZpZWxkID0gMCwKLSAgb2xkX2Z1bmN0aW9uX3R5cGVfZmllbGQgPSAyLAotICBvbGRfZnVuY3Rpb25fbmFtZV9maWVsZCA9IDQsCi0gIG9sZF9mdW5jdGlvbl9wYXJhbV9maWVsZCA9IDUsCi0gIG5yX29sZF9mdW5jdGlvbl9maWVsZHMgPSA1LCAvKiBwYXJhbWV0ZXItbGlzdCBpcyBvcHRpb25hbCAqLwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfZnVuY3Rpb25fZW50cnkgZnVuY3Rpb25fZW50cnk7Ci1zdHJ1Y3QgX2Z1bmN0aW9uX2VudHJ5IHsKLSAgbGluZV9yZWYgKmxpbmU7Ci0gIGZpbHRlciAqZmxhZ3M7Ci0gIGZpbHRlciAqbW9kZWxzOwotICBjaGFyICp0eXBlOwotICBjaGFyICpuYW1lOwotICBjaGFyICpwYXJhbTsKLSAgdGFibGVfZW50cnkgKmNvZGU7Ci0gIGludCBpc19pbnRlcm5hbDsKLSAgZnVuY3Rpb25fZW50cnkgKm5leHQ7Ci19OwotCi0KLXR5cGVkZWYgdm9pZCBmdW5jdGlvbl9lbnRyeV9oYW5kbGVyCi0obGYgKmZpbGUsCi0gZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAotIHZvaWQgKmRhdGEpOwotCi1leHRlcm4gdm9pZCBmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZQotKGxmICpmaWxlLAotIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbnMsCi0gZnVuY3Rpb25fZW50cnlfaGFuZGxlciAqaGFuZGxlciwKLSB2b2lkICpkYXRhKTsKLQotCi0vKiBjYWNoZS1tYWNybzoKLQotICAgPGNhY2hlLW1hY3JvPiA6Oj0KLSAgICAgICAiOiIgPG1hY3JvLXR5cGU+Ci0gICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0gICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgotICAgICAgICI6IiA8dHlwZWRlZj4KLSAgICAgICAiOiIgPG5hbWU+Ci0gICAgICAgIjoiIDxmaWVsZC1uYW1lPiB7ICIsIiA8ZmllbGQtbmFtZT4gfQotICAgICAgICI6IiA8ZXhwcmVzc2lvbj4KLSAgICAgICA8bmw+Ci0gICAgICAgOwotCi0gICA8Y2FjaGUtbWFjcm8tdHlwZT4gOjo9Ci0gICAgICAgInNjcmF0Y2giCi0gICAgICAgfCAiY2FjaGUiCi0gICAgICAgfCAiY29tcHV0ZSIKLSAgICAgICA7Ci0KLSAgIDxuYW1lPiA6Oj0KLSAgICAgICA8aWRlbnQ+Ci0gICAgICAgfCA8aWRlbnQ+ICJfaXNfIiA8aW50ZWdlcj4KLSAgICAgICA7Ci0KLSAgIEEgY2FjaGUgZW50cnkgaXMgZGVmaW5lZCAoZm9yIGFuIGluc3RydWN0aW9uKSB3aGVuIGFsbAotICAgPGZpZWxkLW5hbWU+cyBhcmUgcHJlc2VudCBhcyBuYW1lZCBvcGNvZGUgZmllbGRzIHdpdGhpbiB0aGUKLSAgIGluc3RydWN0aW9ucyBmb3JtYXQuCi0KLSAgIFNDUkFUQ0ggYW5kIENBQ0hFIG1hY3JvcyBhcmUgZGVmaW5lZCBkdXJpbmcgdGhlIGNhY2hlIGZpbGwgc3RhZ2UKLSAgIHdoaWxlIENBQ0hFIGFuZCBDT01QVVRFIG1hY3JvcyBhcmUgZGVmaW5lZCBkdXJpbmcgdGhlIGluc3RydWN0aW9uCi0gICBleGVjdXRpb24gc3RhZ2UuCi0KLSAgICovCi0KLWVudW0gewotICBjYWNoZV90eXBlZGVmX2ZpZWxkID0gNCwKLSAgY2FjaGVfbmFtZV9maWVsZCwKLSAgY2FjaGVfb3JpZ2luYWxfZmllbGRzX2ZpZWxkLAotICBjYWNoZV9leHByZXNzaW9uX2ZpZWxkLAotICBucl9jYWNoZV9maWVsZHMsCi19OwotCi10eXBlZGVmIGVudW0gewotICBzY3JhdGNoX3ZhbHVlLAotICBjYWNoZV92YWx1ZSwKLSAgY29tcHV0ZV92YWx1ZSwKLX0gY2FjaGVfZW50cnlfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2NhY2hlX2VudHJ5IGNhY2hlX2VudHJ5Owotc3RydWN0IF9jYWNoZV9lbnRyeSB7Ci0gIGxpbmVfcmVmICpsaW5lOwotICBmaWx0ZXIgKmZsYWdzOwotICBmaWx0ZXIgKm1vZGVsczsKLSAgY2FjaGVfZW50cnlfdHlwZSBlbnRyeV90eXBlOwotICBjaGFyICpuYW1lOwotICBmaWx0ZXIgKm9yaWdpbmFsX2ZpZWxkczsKLSAgY2hhciAqdHlwZTsKLSAgY2hhciAqZXhwcmVzc2lvbjsKLSAgY2FjaGVfZW50cnkgKm5leHQ7Ci19OwotCi0KLQotLyogTW9kZWwgc3BlY3M6Ci0KLSAgIDxtb2RlbC1wcm9jZXNzb3I+IDo6PQotICAgICAgICI6IiAibW9kZWwiCi0gICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0gICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgotICAgICAgICI6IiA8cHJvY2Vzc29yPgotICAgICAgICI6IiA8QkZELXByb2Nlc3Nvcj4KLSAgICAgICAiOiIgPGZ1bmN0aW9uLXVuaXQtZGF0YT4KLSAgICAgICA8bmw+Ci0gICAgICAgOwotCi0gICA8bW9kZWwtbWFjcm8+IDo6PQotICAgICAgICI6IiAibW9kZWwtbWFjcm8iCi0gICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0gICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgotICAgICAgIDxubD4KLSAgICAgICA8Y29kZS1ibG9jaz4KLSAgICAgICA7Ci0KLSAgIDxtb2RlbC1kYXRhPiA6Oj0KLSAgICAgICAiOiIgIm1vZGVsLWRhdGEiCi0gICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0gICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgotICAgICAgIDxubD4KLSAgICAgICA8Y29kZS1ibG9jaz4KLSAgICAgICA7Ci0KLSAgIDxtb2RlbC1zdGF0aWM+IDo6PQotICAgICAgICI6IiAibW9kZWwtc3RhdGljIgotICAgICAgIDxmdW5jdGlvbi1zcGVjPgotICAgICAgIDsKLQotICAgPG1vZGVsLWludGVybmFsPiA6Oj0KLSAgICAgICAiOiIgIm1vZGVsLWludGVybmFsIgotICAgICAgIDxmdW5jdGlvbi1zcGVjPgotICAgICAgIDsKLQotICAgPG1vZGVsLWZ1bmN0aW9uPiA6Oj0KLSAgICAgICAiOiIgIm1vZGVsLWludGVybmFsIgotICAgICAgIDxmdW5jdGlvbi1zcGVjPgotICAgICAgIDsKLQotICovCi0KLWVudW0gewotICBucl9tb2RlbF9tYWNyb19maWVsZHMgPSA0LAotICBucl9tb2RlbF9kYXRhX2ZpZWxkcyA9IDQsCi0gIG5yX21vZGVsX3N0YXRpY19maWVsZHMgPSBucl9mdW5jdGlvbl9maWVsZHMsCi0gIG5yX21vZGVsX2ludGVybmFsX2ZpZWxkcyA9IG5yX2Z1bmN0aW9uX2ZpZWxkcywKLSAgbnJfbW9kZWxfZnVuY3Rpb25fZmllbGRzID0gbnJfZnVuY3Rpb25fZmllbGRzLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2RhdGEgbW9kZWxfZGF0YTsKLXN0cnVjdCBfbW9kZWxfZGF0YSB7Ci0gIGxpbmVfcmVmICpsaW5lOwotICBmaWx0ZXIgKmZsYWdzOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIHRhYmxlX2VudHJ5ICpjb2RlOwotICBtb2RlbF9kYXRhICpuZXh0OwotfTsKLQotZW51bSB7Ci0gIG1vZGVsX25hbWVfZmllbGQgPSA0LAotICBtb2RlbF9mdWxsX25hbWVfZmllbGQsCi0gIG1vZGVsX3VuaXRfZGF0YV9maWVsZCwKLSAgbnJfbW9kZWxfcHJvY2Vzc29yX2ZpZWxkcywKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9tb2RlbF9lbnRyeSBtb2RlbF9lbnRyeTsKLXN0cnVjdCBfbW9kZWxfZW50cnkgewotICBsaW5lX3JlZiAqbGluZTsKLSAgZmlsdGVyICpmbGFnczsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqZnVsbF9uYW1lOwotICBjaGFyICp1bml0X2RhdGE7Ci0gIG1vZGVsX2VudHJ5ICpuZXh0OwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfbW9kZWxfdGFibGUgbW9kZWxfdGFibGU7Ci1zdHJ1Y3QgX21vZGVsX3RhYmxlIHsKLSAgZmlsdGVyICpwcm9jZXNzb3JzOwotICBpbnQgbnJfbW9kZWxzOwotICBtb2RlbF9lbnRyeSAqbW9kZWxzOwotICBtb2RlbF9kYXRhICptYWNyb3M7Ci0gIG1vZGVsX2RhdGEgKmRhdGE7Ci0gIGZ1bmN0aW9uX2VudHJ5ICpzdGF0aWNzOwotICBmdW5jdGlvbl9lbnRyeSAqaW50ZXJuYWxzOwotICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zOwotfTsKLQotCi0KLS8qIEluc3RydWN0aW9uIGZvcm1hdDoKLQotICAgQW4gaW5zdHJ1Y3Rpb24gaXMgY29tcG9zZWQgb2YgYSBzZXF1ZW5jZSBvZiBOIGJpdCBpbnN0cnVjdGlvbgotICAgd29yZHMuICBFYWNoIHdvcmQgYnJva2VuIGludG8gYSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gZmllbGRzLgotICAgVGhvc2UgZmllbGRzIGJlaW5nIGNvbnN0YW50IChleC4gYW4gb3Bjb2RlKSBvciB2YXJpYWJsZSAocmVnaXN0ZXIKLSAgIHNwZWMpLgotCi0gICA8aW5zbi13b3JkPiA6Oj0KLSAgICAgICA8aW5zbi1maWVsZD4geyAiLCIgPGluc24tZmllbGQ+IH0gOwotCi0gICA8aW5zbi1maWVsZD4gOjo9Ci0gICAgICAgKCA8YmluYXJ5LXZhbHVlLWltcGx5aW5nLXdpZHRoPgotICAgICAgIHwgPGZpZWxkLW5hbWUtaW1wbHlpbmctd2lkdGg+Ci0gICAgICAgfCBbIDxzdGFydC1vci13aWR0aD4gIi4iIF0gPGZpZWxkPiAKLSAgICAgICApCi0gICAgICAgeyBbICIhIiB8ICI9IiBdIFsgPHZhbHVlPiB8IDxmaWVsZC1uYW1lPiBdIH0KLSAgICAgICA7Ci0KLSAgIDxmaWVsZD4gOjo9Ci0gICAgICAgICB7ICIqIiB9KwotICAgICAgIHwgeyAiLyIgfSsKLSAgICAgICB8IDxmaWVsZC1uYW1lPgotICAgICAgIHwgIjB4IiA8aGV4LXZhbHVlPgotICAgICAgIHwgIjBiIiA8YmluYXJ5LXZhbHVlPgotICAgICAgIHwgIjAiIDxvY3RhbC12YWx1ZT4KLSAgICAgICB8IDxpbnRlZ2VyLXZhbHVlPiA7Ci0KLSovCi0KLXR5cGVkZWYgZW51bSBfaW5zbl9maWVsZF9jb25kX3R5cGUgewotICBpbnNuX2ZpZWxkX2NvbmRfdmFsdWUsCi0gIGluc25fZmllbGRfY29uZF9maWVsZCwKLX0gaW5zbl9maWVsZF9jb25kX3R5cGU7Ci10eXBlZGVmIGVudW0gX2luc25fZmllbGRfY29uZF90ZXN0IHsKLSAgaW5zbl9maWVsZF9jb25kX2VxLAotICBpbnNuX2ZpZWxkX2NvbmRfbmUsCi19IGluc25fZmllbGRfY29uZF90ZXN0OwotdHlwZWRlZiBzdHJ1Y3QgX2luc25fZmllbGRfY29uZCBpbnNuX2ZpZWxkX2NvbmQ7Ci1zdHJ1Y3QgX2luc25fZmllbGRfY29uZCB7Ci0gIGluc25fZmllbGRfY29uZF90eXBlIHR5cGU7Ci0gIGluc25fZmllbGRfY29uZF90ZXN0IHRlc3Q7Ci0gIGluc25fdWludCB2YWx1ZTsKLSAgc3RydWN0IF9pbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZDsKLSAgY2hhciAqc3RyaW5nOwotICBpbnNuX2ZpZWxkX2NvbmQgKm5leHQ7Ci19OwotCi0KLXR5cGVkZWYgZW51bSBfaW5zbl9maWVsZF90eXBlIHsKLSAgaW5zbl9maWVsZF9pbnZhbGlkLAotICBpbnNuX2ZpZWxkX2ludCwKLSAgaW5zbl9maWVsZF9yZXNlcnZlZCwKLSAgaW5zbl9maWVsZF93aWxkLAotICBpbnNuX2ZpZWxkX3N0cmluZywKLX0gaW5zbl9maWVsZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfaW5zbl9maWVsZF9lbnRyeSBpbnNuX2ZpZWxkX2VudHJ5Owotc3RydWN0IF9pbnNuX2ZpZWxkX2VudHJ5IHsKLSAgaW50IGZpcnN0OwotICBpbnQgbGFzdDsKLSAgaW50IHdpZHRoOwotICBpbnQgd29yZF9ucjsKLSAgaW5zbl9maWVsZF90eXBlIHR5cGU7Ci0gIGluc25fdWludCB2YWxfaW50OwotICBjaGFyICpwb3Nfc3RyaW5nOwotICBjaGFyICp2YWxfc3RyaW5nOwotICBpbnNuX2ZpZWxkX2NvbmQgKmNvbmRpdGlvbnM7Ci0gIGluc25fZmllbGRfZW50cnkgKm5leHQ7Ci0gIGluc25fZmllbGRfZW50cnkgKnByZXY7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfaW5zbl9iaXRfZW50cnkgaW5zbl9iaXRfZW50cnk7Ci1zdHJ1Y3QgX2luc25fYml0X2VudHJ5IHsKLSAgaW50IHZhbHVlOwotICBpbnQgbWFzazsKLSAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQ7Ci19OwotCi0KLQotCi10eXBlZGVmIHN0cnVjdCBfaW5zbl9lbnRyeSBpbnNuX2VudHJ5OyAvKiBmb3J3YXJkICovCi0KLXR5cGVkZWYgc3RydWN0IF9pbnNuX3dvcmRfZW50cnkgaW5zbl93b3JkX2VudHJ5Owotc3RydWN0IF9pbnNuX3dvcmRfZW50cnkgewotICAvKiBsaXN0IG9mIHN1Yi1maWVsZHMgbWFraW5nIHVwIHRoZSBpbnN0cnVjdGlvbi4gIGJpdCBwcm92aWRlcwotICAgICBmYXN0ZXIgYWNjZXNzIHRvIHRoZSBmaWVsZCBkYXRhIGZvciBiaXQgTi4gICovCi0gIGluc25fZmllbGRfZW50cnkgKmZpcnN0OwotICBpbnNuX2ZpZWxkX2VudHJ5ICpsYXN0OwotICBpbnNuX2JpdF9lbnRyeSAqYml0W21heF9pbnNuX2JpdF9zaXplXTsKLSAgLyogc2V0IG9mIGFsbCB0aGUgc3RyaW5nIGZpZWxkcyAqLwotICBmaWx0ZXIgKmZpZWxkX25hbWVzOwotICAvKiBGb3IgbXVsdGktd29yZCBpbnN0cnVjdGlvbnMsIFRoZSBOdGggd29yZCAoZnJvbSB6ZXJvKS4gKi8KLSAgaW5zbl93b3JkX2VudHJ5ICpuZXh0OwotfTsKLQotCi0KLS8qIEluc3RydWN0aW9uIG1vZGVsOgotCi0gICBQcm92aWRlcyBzY2hlZHVsaW5nIGFuZCBvdGhlciBkYXRhIGZvciB0aGUgY29kZSBtb2RlbGluZyB0aGUKLSAgIGluc3RydWN0aW9uIHVuaXQuCi0KLSAgIDxpbnNuLW1vZGVsPiA6Oj0KLSAgICAgICAiKiIgWyA8cHJvY2Vzc29yLWxpc3Q+IF0KLSAgICAgICAiOiIgWyA8ZnVuY3Rpb24tdW5pdC1kYXRhPiBdCi0gICAgICAgPG5sPgotICAgICAgIDsKLQotICAgPHByb2Nlc3Nvci1saXN0PiA6Oj0KLSAgICAgICA8cHJvY2Vzc29yPiB7ICIsIiA8cHJvY2Vzc29yPiIgfQotICAgICAgIDsKLQotICAgSWYgdGhlIDxwcm9jZXNzb3ItbGlzdD4gaXMgZW1wdHksIHRoZSBtb2RlbCBpcyBtYWRlIHRoZSBkZWZhdWx0IGZvcgotICAgdGhpcyBpbnN0cnVjdGlvbi4KLQotICAgKi8KLQotZW51bSB7Ci0gIGluc25fbW9kZWxfbmFtZV9maWVsZCA9IDAsCi0gIGluc25fbW9kZWxfdW5pdF9kYXRhX2ZpZWxkID0gMSwKLSAgbnJfaW5zbl9tb2RlbF9maWVsZHMgPSAxLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2luc25fbW9kZWxfZW50cnkgaW5zbl9tb2RlbF9lbnRyeTsKLXN0cnVjdCBfaW5zbl9tb2RlbF9lbnRyeSB7Ci0gIGxpbmVfcmVmICpsaW5lOwotICBpbnNuX2VudHJ5ICppbnNuOwotICBmaWx0ZXIgKm5hbWVzOwotICBjaGFyICpmdWxsX25hbWU7Ci0gIGNoYXIgKnVuaXRfZGF0YTsKLSAgaW5zbl9tb2RlbF9lbnRyeSAqbmV4dDsKLX07Ci0KLQotCi0vKiBJbnN0cnVjdGlvbiBtbmVtb25pYzoKLQotICAgTGlzdCBvZiBhc3NlbWJsZXIgbW5lbW9uaWNzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIDxpbnNuLW1uZW5vbmljPiA6Oj0KLSAgICAgICAiXCIiIDxhc3NlbWJsZXItbW5lbW9uaWM+ICJcIiIKLSAgICAgICBbICI6IiA8Y29uZGl0aW9uYWwtZXhwcmVzc2lvbj4gXQotICAgICAgIDxubD4KLSAgICAgICA7Ci0KLSAgIEFuIGFzc2VtYmxlciBtbmVtb25pYyBzdHJpbmcgaGFzIHRoZSBzeW50YXg6Ci0KLSAgIDxhc3NlbWJsZXItbW5lbW9uaWM+ICA6Oj0KLSAgICAgICAoIFsgIiUiIDxmb3JtYXQtc3BlYz4gXSAiPCIgPGZ1bmM+IFsgIiMiIDxwYXJhbS1saXN0PiBdICI+IgotICAgICAgIHwgIiUlIgotICAgICAgIHwgPG90aGVyLWxldHRlcj4KLSAgICAgICApKwotCi0gICAgV2hlcmUsIGZvciBpbnN0YW5jZSwgdGhlIHRleHQgaXMgdHJhbnNsYXRlZCBpbnRvIGEgcHJpbnRmIGZvcm1hdAotICAgIGFuZCBhcmd1bWVudCBwYWlyOgotCi0gICAgICAgIjxGVU5DPiIgICAgICAgICA6ICIlbGQiLCAobG9uZykgRlVOQwotICAgICAgICIlPEZVTkM+Li4uIiAgICAgOiAiJS4uLiIsIEZVTkMKLSAgICAgICAiJXM8RlVOQz4iICAgICAgIDogIiVzIiwgPCVzPkZVTkMgKFNEXywgRlVOQykKLSAgICAgICAiJXM8RlVOQyNQMSxQMj4iIDogIiVzIiwgPCVzPkZVTkMgKFNEXywgUDEsUDIpCi0gICAgICAgIiVseDxGVU5DPiIgICAgICA6ICIlbHgiLCAodW5zaWduZWQgbG9uZykgRlVOQwotICAgICAgICIlMDhseDxGVU5DPiIgICAgOiAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgRlVOQwotCi0gICAgQW5kICI8JXM+RlVOQyIgZGVub3RlcyBhIGZ1bmN0aW9uIGRlY2xhcmVkIHVzaW5nIHRoZSAiJXMiIHJlY29yZAotICAgIHNwZWNpZmllci4KLQotCi0KLSAgICAgICA7Ci0KLSAgICovCi0KLWVudW0gewotICBpbnNuX21uZW1vbmljX2Zvcm1hdF9maWVsZCA9IDAsCi0gIGluc25fbW5lbW9uaWNfY29uZGl0aW9uX2ZpZWxkID0gMSwKLSAgbnJfaW5zbl9tbmVtb25pY19maWVsZHMgPSAxLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2luc25fbW5lbW9uaWNfZW50cnkgaW5zbl9tbmVtb25pY19lbnRyeTsKLXN0cnVjdCBfaW5zbl9tbmVtb25pY19lbnRyeSB7Ci0gIGxpbmVfcmVmICpsaW5lOwotICBpbnNuX2VudHJ5ICppbnNuOwotICBjaGFyICpmb3JtYXQ7Ci0gIGNoYXIgKmNvbmRpdGlvbjsKLSAgaW5zbl9tbmVtb25pY19lbnRyeSAqbmV4dDsKLX07Ci0KLQotCi0vKiBJbnN0cnVjdGlvbjoKLQotICAgPGluc24+IDo6PQotICAgICAgIDxpbnNuLXdvcmQ+IHsgIisiIDxpbnNuLXdvcmQ+IH0KLSAgICAgICAiOiIgPGZvcm1hdC1uYW1lPgotICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgotICAgICAgICI6IiA8b3B0aW9ucz4KLSAgICAgICAiOiIgPG5hbWU+Ci0gICAgICAgPG5sPgotICAgICAgIHsgPGluc24tbW9kZWw+IH0KLSAgICAgICB7IDxpbnNuLW1uZW1vbmljPiB9Ci0gICAgICAgPGNvZGUtYmxvY2s+Ci0KLSAqLwotCi1lbnVtIHsKLSAgaW5zbl93b3JkX2ZpZWxkID0gMCwKLSAgaW5zbl9mb3JtYXRfbmFtZV9maWVsZCA9IDEsCi0gIGluc25fZmlsdGVyX2ZsYWdzX2ZpZWxkID0gMiwKLSAgaW5zbl9vcHRpb25zX2ZpZWxkID0gMywKLSAgaW5zbl9uYW1lX2ZpZWxkID0gNCwKLSAgbnJfaW5zbl9maWVsZHMgPSA1LAotfTsKLQotCi0vKiB0eXBlZGVmIHN0cnVjdCBfaW5zbl9lbnRyeSBpbnNuX2VudHJ5OyAqLwotc3RydWN0IF9pbnNuX2VudHJ5IHsKLSAgbGluZV9yZWYgKmxpbmU7Ci0gIGZpbHRlciAqZmxhZ3M7IC8qIGZpbHRlcmVkIGJ5IG9wdGlvbnMuZmlsdGVycyAqLwotICBjaGFyICpmb3JtYXRfbmFtZTsKLSAgZmlsdGVyICpvcHRpb25zOwotICBjaGFyICpuYW1lOwotICAvKiB0aGUgd29yZHMgdGhhdCBtYWtlIHVwIHRoZSBpbnN0cnVjdGlvbi4gV29yZCBwcm92aWRlcyBkaXJlY3QKLSAgICAgYWNjZXNzIHRvIHdvcmQgTi4gUHNldWRvIGluc3RydWN0aW9ucyBjYW4gYmUgaWRlbnRpZmllZCBieQotICAgICBucl93b3JkcyA9PSAwLiAqLwotICBpbnQgbnJfd29yZHM7Ci0gIGluc25fd29yZF9lbnRyeSAqd29yZHM7Ci0gIGluc25fd29yZF9lbnRyeSAqKndvcmQ7Ci0gIC8qIGEgc2V0IG9mIGFsbCB0aGUgZmllbGRzIGZyb20gYWxsIHRoZSB3b3JkcyAqLwotICBmaWx0ZXIgKmZpZWxkX25hbWVzOwotICAvKiBhbiBhcnJheSBvZiBwcm9jZXNzb3IgbW9kZWxzLCBtaXNzaW5nIG1vZGVscyBhcmUgTlVMTCEgKi8KLSAgaW50IG5yX21vZGVsczsKLSAgaW5zbl9tb2RlbF9lbnRyeSAqbW9kZWxzOwotICBpbnNuX21vZGVsX2VudHJ5ICoqbW9kZWw7Ci0gIGZpbHRlciAqcHJvY2Vzc29yczsKLSAgLyogbGlzdCBvZiBhc3NlbWJlciBmb3JtYXRzICovCi0gIGludCBucl9tbmVtb25pY3M7Ci0gIGluc25fbW5lbW9uaWNfZW50cnkgKm1uZW1vbmljczsKLSAgLyogY29kZSBib2R5ICovCi0gIHRhYmxlX2VudHJ5ICpjb2RlOwotICBpbnNuX2VudHJ5ICpuZXh0OwotfTsKLQotCi0vKiBJbnN0cnVjdGlvbiB0YWJsZToKLQotICovCi0KLXR5cGVkZWYgc3RydWN0IF9pbnNuX3RhYmxlIGluc25fdGFibGU7Ci1zdHJ1Y3QgX2luc25fdGFibGUgewotICBjYWNoZV9lbnRyeSAqY2FjaGVzOwotICBpbnQgbWF4X25yX3dvcmRzOwotICBpbnQgbnJfaW5zbnM7Ci0gIGluc25fZW50cnkgKmluc25zOwotICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zOwotICBpbnNuX2VudHJ5ICppbGxlZ2FsX2luc247Ci0gIG1vZGVsX3RhYmxlICptb2RlbDsKLSAgZmlsdGVyICpvcHRpb25zOwotICBmaWx0ZXIgKmZsYWdzOwotfTsKLQotZXh0ZXJuIGluc25fdGFibGUgKmxvYWRfaW5zbl90YWJsZQotKGNoYXIgKmZpbGVfbmFtZSwKLSBjYWNoZV9lbnRyeSAqY2FjaGUpOwotCi10eXBlZGVmIHZvaWQgaW5zbl9lbnRyeV9oYW5kbGVyCi0obGYgKmZpbGUsCi0gaW5zbl90YWJsZSAqaXNhLAotIGluc25fZW50cnkgKmluc24sCi0gdm9pZCAqZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbgotKGxmICpmaWxlLAotIGluc25fdGFibGUgKmlzYSwKLSBpbnNuX2VudHJ5X2hhbmRsZXIgKmhhbmRsZXIsCi0gdm9pZCAqZGF0YSk7Ci0KLQotCi0vKiBQcmludGluZyAqLwotCi1leHRlcm4gdm9pZCBwcmludF9pbnNuX3dvcmRzCi0obGYgKmZpbGUsCi0gaW5zbl9lbnRyeSAqaW5zbik7Ci0KLQotCi0vKiBEZWJ1Z2dpbmcgKi8KLQotdm9pZAotZHVtcF9pbnNuX2ZpZWxkCi0obGYgKmZpbGUsCi0gY2hhciAqcHJlZml4LAotIGluc25fZmllbGRfZW50cnkgKmZpZWxkLAotIGNoYXIgKnN1ZmZpeCk7Ci0KLXZvaWQKLWR1bXBfaW5zbl93b3JkX2VudHJ5Ci0obGYgKmZpbGUsCi0gY2hhciAqcHJlZml4LAotIGluc25fd29yZF9lbnRyeSAqd29yZCwKLSBjaGFyICpzdWZmaXgpOwotCi12b2lkCi1kdW1wX2luc25fZW50cnkKLShsZiAqZmlsZSwKLSBjaGFyICpwcmVmaXgsCi0gaW5zbl9lbnRyeSAqaW5zbiwKLSBjaGFyICpzdWZmaXgpOwotCi12b2lkCi1kdW1wX2NhY2hlX2VudHJpZXMKLShsZiAqZmlsZSwKLSBjaGFyICpwcmVmaXgsCi0gY2FjaGVfZW50cnkgKmVudHJ5LAotIGNoYXIgKnN1ZmZpeCk7Ci0KLXZvaWQKLWR1bXBfaW5zbl90YWJsZQotKGxmICpmaWxlLAotIGNoYXIgKnByZWZpeCwKLSBpbnNuX3RhYmxlICppc2EsCi0gY2hhciAqc3VmZml4KTsKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xmLmMgYi9zaW0vaWdlbi9sZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjRhNWYxLi4wMDAwMDAwCi0tLSBhL3NpbS9pZ2VuL2xmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotc3RydWN0IF9sZiB7Ci0gIEZJTEUgKnN0cmVhbTsKLSAgaW50IGxpbmVfbnI7IC8qIG5yIGNvbXBsZXRlIGxpbmVzIHdyaXR0ZW4sIGN1cnIgbGluZSBpcyBsaW5lX25yKzEgKi8KLSAgaW50IGluZGVudDsKLSAgaW50IGxpbmVfYmxhbms7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gIGxmX2ZpbGVfcmVmZXJlbmNlcyByZWZlcmVuY2VzOwotICBsZl9maWxlX3R5cGUgdHlwZTsKLX07Ci0KLQotbGYgKgotbGZfb3BlbiAoY2hhciAqbmFtZSwKLQkgY2hhciAqcmVhbF9uYW1lLAotCSBsZl9maWxlX3JlZmVyZW5jZXMgcmVmZXJlbmNlcywKLQkgbGZfZmlsZV90eXBlIHR5cGUsCi0JIGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gIC8qIGNyZWF0ZSBhIGZpbGUgb2JqZWN0ICovCi0gIGxmICpuZXdfbGYgPSBaQUxMT0MobGYpOwotICBBU1NFUlQgKG5ld19sZiAhPSBOVUxMKTsKLSAgbmV3X2xmLT5yZWZlcmVuY2VzID0gcmVmZXJlbmNlczsKLSAgbmV3X2xmLT50eXBlID0gdHlwZTsKLSAgbmV3X2xmLT5uYW1lID0gKHJlYWxfbmFtZSA9PSBOVUxMID8gbmFtZSA6IHJlYWxfbmFtZSk7Ci0gIG5ld19sZi0+cHJvZ3JhbSA9IHByb2dyYW07Ci0gIC8qIGF0dGFjaCB0byBzdGRvdXQgaWYgcGlwZSAqLwotICBpZiAoIXN0cmNtcChuYW1lLCAiLSIpKSB7Ci0gICAgbmV3X2xmLT5zdHJlYW0gPSBzdGRvdXQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogY3JlYXRlIGEgbmV3IGZpbGUgKi8KLSAgICBuZXdfbGYtPnN0cmVhbSA9IGZvcGVuKG5hbWUsICJ3Iik7Ci0gICAgaWYgKG5ld19sZi0+c3RyZWFtID09IE5VTEwpIHsKLSAgICAgIHBlcnJvcihuYW1lKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdfbGY7Ci19Ci0KLQotdm9pZAotbGZfY2xvc2UobGYgKmZpbGUpCi17Ci0gIGlmIChmaWxlLT5zdHJlYW0gIT0gc3Rkb3V0KSB7Ci0gICAgaWYgKGZjbG9zZShmaWxlLT5zdHJlYW0pKSB7Ci0gICAgICBwZXJyb3IoImxmX2Nsb3NlLmZjbG9zZSIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZnJlZShmaWxlKTsKLSAgfQotfQotCi0KLWludAotbGZfcHV0Y2hyKGxmICpmaWxlLAotCSAgY29uc3QgY2hhciBjaHIpCi17Ci0gIGludCBuciA9IDA7Ci0gIGlmIChjaHIgPT0gJ1xuJykgewotICAgIGZpbGUtPmxpbmVfbnIgKz0gMTsKLSAgICBmaWxlLT5saW5lX2JsYW5rID0gMTsKLSAgfQotICBlbHNlIGlmIChmaWxlLT5saW5lX2JsYW5rKSB7Ci0gICAgaW50IHBhZDsKLSAgICBmb3IgKHBhZCA9IGZpbGUtPmluZGVudDsgcGFkID4gMDsgcGFkLS0pCi0gICAgICBwdXRjKCcgJywgZmlsZS0+c3RyZWFtKTsKLSAgICBuciArPSBmaWxlLT5pbmRlbnQ7Ci0gICAgZmlsZS0+bGluZV9ibGFuayA9IDA7Ci0gIH0KLSAgcHV0YyhjaHIsIGZpbGUtPnN0cmVhbSk7Ci0gIG5yICs9IDE7Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl93cml0ZSAobGYgKmZpbGUsCi0JICBjb25zdCBjaGFyICpzdHJpbmcsCi0JICBpbnQgc3RybGVuX3N0cmluZykKLXsKLSAgaW50IG5yID0gMDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzdHJsZW5fc3RyaW5nOyBpKyspCi0gICAgbnIgKz0gbGZfcHV0Y2hyIChmaWxlLCBzdHJpbmdbaV0pOwotICByZXR1cm4gbnI7Ci19Ci0KLQotdm9pZAotbGZfaW5kZW50X3N1cHByZXNzKGxmICpmaWxlKQotewotICBmaWxlLT5saW5lX2JsYW5rID0gMDsKLX0KLQotCi1pbnQKLWxmX3B1dHN0cihsZiAqZmlsZSwKLQkgIGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgaW50IG5yID0gMDsKLSAgY29uc3QgY2hhciAqY2hwOwotICBpZiAoc3RyaW5nICE9IE5VTEwpIHsKLSAgICBmb3IgKGNocCA9IHN0cmluZzsgKmNocCAhPSAnXDAnOyBjaHArKykgewotICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICpjaHApOwotICAgIH0KLSAgfQotICByZXR1cm4gbnI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2xmX3B1dHVuc2lnbmVkKGxmICpmaWxlLAotCSAgICAgIHVuc2lnbmVkIHUpCi17Ci0gIGludCBuciA9IDA7Ci0gIGlmICh1ID4gMCkgewotICAgIG5yICs9IGRvX2xmX3B1dHVuc2lnbmVkKGZpbGUsIHUgLyAxMCk7Ci0gICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICh1ICUgMTApICsgJzAnKTsKLSAgfQotICByZXR1cm4gbnI7Ci19Ci0KLQotaW50Ci1sZl9wdXRpbnQobGYgKmZpbGUsCi0JICBpbnQgZGVjaW1hbCkKLXsKLSAgaW50IG5yID0gMDsKLSAgaWYgKGRlY2ltYWwgPT0gMCkKLSAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJzAnKTsKLSAgZWxzZSBpZiAoZGVjaW1hbCA8IDApIHsKLSAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJy0nKTsKLSAgICBuciArPSBkb19sZl9wdXR1bnNpZ25lZChmaWxlLCAtZGVjaW1hbCk7Ci0gIH0KLSAgZWxzZSBpZiAoZGVjaW1hbCA+IDApIHsKLSAgICBuciArPSBkb19sZl9wdXR1bnNpZ25lZChmaWxlLCBkZWNpbWFsKTsKLSAgfQotICBlbHNlCi0gICAgQVNTRVJUKDApOwotICByZXR1cm4gbnI7Ci19Ci0KLQotaW50Ci1sZl9wcmludGYgKGxmICpmaWxlLAotCSAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICAuLi4pCi17Ci0gIGludCBuciA9IDA7Ci0gIGNoYXIgYnVmWzEwMjRdOwotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSAgdnNwcmludGYgKGJ1ZiwgZm10LCBhcCk7Ci0gIC8qIEZJWE1FIC0gdGhpcyBpcyByZWFsbHkgc3R1ZmZlZCBidXQgc28gaXMgdnNwcmludGYoKSBvbiBhIHN1biEgKi8KLSAgQVNTRVJUIChzdHJsZW4gKGJ1ZikgPCBzaXplb2YgKGJ1ZikpOwotICBuciArPSBsZl9wdXRzdHIgKGZpbGUsIGJ1Zik7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBucjsKLX0KLQotCi1pbnQKLWxmX3ByaW50X19saW5lX3JlZiAobGYgKmZpbGUsCi0JCSAgICBsaW5lX3JlZiAqbGluZSkKLXsKLSAgcmV0dXJuIGxmX3ByaW50X19leHRlcm5hbF9yZWYgKGZpbGUsIGxpbmUtPmxpbmVfbnIsIGxpbmUtPmZpbGVfbmFtZSk7Ci19Ci0KLWludAotbGZfcHJpbnRfX2V4dGVybmFsX3JlZiAobGYgKmZpbGUsCi0JCQlpbnQgbGluZV9uciwKLQkJCWNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKLXsKLSAgaW50IG5yID0gMDsKLSAgc3dpdGNoIChmaWxlLT5yZWZlcmVuY2VzKQotICAgIHsKLSAgICBjYXNlIGxmX2luY2x1ZGVfcmVmZXJlbmNlczoKLSAgICAgIGxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKLSAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgIiNsaW5lICIpOwotICAgICAgbnIgKz0gbGZfcHV0aW50IChmaWxlLCBsaW5lX25yKTsKLSAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgIiBcIiIpOwotICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCBmaWxlX25hbWUpOwotICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCAiXCJcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsZl9vbWl0X3JlZmVyZW5jZXM6Ci0gICAgICBuciArPSBsZl9wdXRzdHIgKGZpbGUsICIvKiAiKTsKLSAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgZmlsZV9uYW1lKTsKLSAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgIjoiKTsKLSAgICAgIG5yICs9IGxmX3B1dGludCAoZmlsZSwgbGluZV9ucik7Ci0gICAgICBuciArPSBsZl9wdXRzdHIgKGZpbGUsICIqL1xuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl9wcmludF9faW50ZXJuYWxfcmVmIChsZiAqZmlsZSkKLXsKLSAgaW50IG5yID0gMDsKLSAgbnIgKz0gbGZfcHJpbnRfX2V4dGVybmFsX3JlZiAoZmlsZSwgZmlsZS0+bGluZV9ucisyLCBmaWxlLT5uYW1lKTsKLSAgLyogbGluZV9uciA9PSBsYXN0X2xpbmUsIHdhbnQgdG8gbnVtYmVyIGZyb20gbmV4dCAqLwotICByZXR1cm4gbnI7Ci19Ci0KLXZvaWQKLWxmX2luZGVudCAobGYgKmZpbGUsIGludCBkZWx0YSkKLXsKLSAgZmlsZS0+aW5kZW50ICs9IGRlbHRhOwotfQotCi0KLWludAotbGZfcHJpbnRfX2dudV9jb3B5bGVmdCAobGYgKmZpbGUpCi17Ci0gIGludCBuciA9IDA7Ci0gIHN3aXRjaCAoZmlsZS0+dHlwZSkgewotICBjYXNlIGxmX2lzX2M6Ci0gIGNhc2UgbGZfaXNfaDoKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlwKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAtLQotCi0gICAgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHByb2dyYW0gJXMgKi8KLSIsIGZpbHRlcl9maWxlbmFtZShmaWxlLT5wcm9ncmFtKSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgQVNTRVJUKDApOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotCi1pbnQKLWxmX3B1dGJpbihsZiAqZmlsZSwgaW50IGRlY2ltYWwsIGludCB3aWR0aCkKLXsKLSAgaW50IG5yID0gMDsKLSAgaW50IGJpdDsKLSAgQVNTRVJUKHdpZHRoID4gMCk7Ci0gIGZvciAoYml0ID0gMSA8PCAod2lkdGgtMSk7IGJpdCAhPSAwOyBiaXQgPj49IDEpIHsKLSAgICBpZiAoZGVjaW1hbCAmIGJpdCkKLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnMScpOwotICAgIGVsc2UKLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnMCcpOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5KGxmICpmaWxlLAotCQkJICAgICBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0gIGludCBuciA9IDA7Ci0gIHN3aXRjaCAoZmlsZS0+dHlwZSkgewotICBjYXNlIGxmX2lzX2M6Ci0gIGNhc2UgbGZfaXNfaDoKLSAgICBuciArPSBsZl9wcmludGYgKGZpbGUsCi0JCSAgICAiLyogVGhpcyBnZW5lcmF0ZWQgZmlsZSAoJXMpIGlzIGludGVudGlvbmFsbHkgbGVmdCBibGFuayIsCi0JCSAgICBmaWxlLT5uYW1lKTsKLSAgICBpZiAocmVhc29uICE9IE5VTEwpCi0gICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIgLSAlcyIsIHJlYXNvbik7Ci0gICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiICovXG4iKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJPUiAoIkJhZCBzd2l0Y2giKTsKLSAgfQotICByZXR1cm4gbnI7Ci19Ci0KLWludAotbGZfcHJpbnRfX3VjYXNlX2ZpbGVuYW1lKGxmICpmaWxlKQotewotICBpbnQgbnIgPSAwOwotICBjb25zdCBjaGFyICpjaHAgPSBmaWxlLT5uYW1lOwotICB3aGlsZSAoKmNocCAhPSAnXDAnKSB7Ci0gICAgY2hhciBjaCA9ICpjaHA7Ci0gICAgaWYgKGlzbG93ZXIoY2gpKSB7Ci0gICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgdG91cHBlcihjaCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChjaCA9PSAnLicpCi0gICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKLSAgICBlbHNlCi0gICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgY2gpOwotICAgIGNocCsrOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl9wcmludF9fZmlsZV9zdGFydChsZiAqZmlsZSkKLXsKLSAgaW50IG5yID0gMDsKLSAgc3dpdGNoIChmaWxlLT50eXBlKSB7Ci0gIGNhc2UgbGZfaXNfaDoKLSAgY2FzZSBsZl9pc19jOgotICAgIG5yICs9IGxmX3ByaW50X19nbnVfY29weWxlZnQoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiI2lmbmRlZiAiKTsKLSAgICBuciArPSBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSAiKTsKLSAgICBuciArPSBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBBU1NFUlQoMCk7Ci0gIH0KLSAgcmV0dXJuIG5yOwotfQotCi0KLWludAotbGZfcHJpbnRfX2ZpbGVfZmluaXNoKGxmICpmaWxlKQotewotICBpbnQgbnIgPSAwOwotICBzd2l0Y2ggKGZpbGUtPnR5cGUpIHsKLSAgY2FzZSBsZl9pc19oOgotICBjYXNlIGxmX2lzX2M6Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmIC8qIF8iKTsKLSAgICBuciArPSBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJfKi9cbiIpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEFTU0VSVCgwKTsKLSAgfQotICByZXR1cm4gbnI7Ci19Ci0KLQotaW50Ci1sZl9wcmludF9fZnVuY3Rpb25fdHlwZSAobGYgKmZpbGUsCi0JCQkgY29uc3QgY2hhciAqdHlwZSwKLQkJCSBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQkgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpCi17Ci0gIGludCBuciA9IDA7Ci0gIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzXFxcbiglcykiLCBwcmVmaXgsIHR5cGUpOwotICBpZiAodHJhaWxpbmdfc3BhY2UgIT0gTlVMTCkKLSAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlcyIsIHRyYWlsaW5nX3NwYWNlKTsKLSAgcmV0dXJuIG5yOwotfQotCi1pbnQKLWxmX3ByaW50X19mdW5jdGlvbl90eXBlX2Z1bmN0aW9uIChsZiAqZmlsZSwKLQkJCQkgIHByaW50X2Z1bmN0aW9uICpwcmludF90eXBlLAotCQkJCSAgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCSAgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpCi17Ci0gIGludCBuciA9IDA7Ci0gIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzXFxcbigiLCBwcmVmaXgpOwotICBuciArPSBwcmludF90eXBlIChmaWxlKTsKLSAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiKSIpOwotICBpZiAodHJhaWxpbmdfc3BhY2UgIT0gTlVMTCkKLSAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlcyIsIHRyYWlsaW5nX3NwYWNlKTsKLSAgcmV0dXJuIG5yOwotfQotCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZi5oIGIvc2ltL2lnZW4vbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2OGY1Zi4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9sZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLS8qIExGOiBMaW5lIE51bWJlcmVkIE91dHB1dCBTdHJlYW0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2xmIGxmOwotCi10eXBlZGVmIGVudW0gewotICBsZl9pc19oLAotICBsZl9pc19jLAotICBsZl9pc190ZXh0LAotfSBsZl9maWxlX3R5cGU7Ci0KLQotdHlwZWRlZiBlbnVtIHsKLSAgbGZfaW5jbHVkZV9yZWZlcmVuY2VzLAotICBsZl9vbWl0X3JlZmVyZW5jZXMsCi19IGxmX2ZpbGVfcmVmZXJlbmNlczsKLQotCi0vKiBPcGVuIHRoZSBmaWxlIE5BTUUgZm9yIHdyaXRpbmcgKCItIiBmb3Igc3Rkb3V0KS4gIFVzZSBSRUFMX05BTUUKLSAgIHdoZW4gcmVmZXJpbmcgdG8gdGhlIG9wZW5lZCBmaWxlLiAgTGluZSBudW1iZXIgaW5mb3JtYXRpb24gKGluIHRoZQotICAgb3V0cHV0KSBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIEZJTEVfUkVGRVJFTkNFUyA9PQotICAgTEZfT01JVF9SRUZFUkVOQ0VTLiAgVFlQRSBpcyB0byBkZXRlcm1pbmUgdGhlIGZvcm1hdHRpbmcgb2Ygc29tZSBvZgotICAgdGhlIHByaW50IG1lc3NhZ2VzIGJlbG93LiAqLwotCi1leHRlcm4gbGYgKmxmX29wZW4KLShjaGFyICpuYW1lLAotIGNoYXIgKnJlYWxfbmFtZSwKLSBsZl9maWxlX3JlZmVyZW5jZXMgZmlsZV9yZWZlcmVuY2VzLAotIGxmX2ZpbGVfdHlwZSB0eXBlLAotIGNvbnN0IGNoYXIgKnByb2dyYW0pOwotCi1leHRlcm4gdm9pZCBsZl9jbG9zZQotKGxmICpmaWxlKTsKLQotCi0vKiBCYXNpYyBvdXRwdXQgZnVuY3Rpb25zICovCi0KLWV4dGVybiBpbnQgbGZfd3JpdGUKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpzdHJpbmcsCi0gaW50IGxlbik7Ci0KLWV4dGVybiBpbnQgbGZfcHV0Y2hyCi0obGYgKmZpbGUsCi0gY29uc3QgY2hhciBjaCk7Ci0KLWV4dGVybiBpbnQgbGZfcHV0c3RyCi0obGYgKmZpbGUsCi0gY29uc3QgY2hhciAqc3RyaW5nKTsKLQotZXh0ZXJuIGludCBsZl9wdXRpbnQKLShsZiAqZmlsZSwKLSBpbnQgZGVjaW1hbCk7Ci0KLWV4dGVybiBpbnQgbGZfcHV0YmluCi0obGYgKmZpbGUsCi0gaW50IGRlY2ltYWwsCi0gaW50IHdpZHRoKTsKLQotZXh0ZXJuIGludCBsZl9wcmludGYKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpmbXQsCi0gLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwotCi0KLS8qIEluZGVudGF0aW9uIGNvbnRyb2wuCi0KLSAgIGxmX2luZGVudF9zdXBwcmVzcyBzdXBwcmVzc2VzIGluZGVudGF0aW9uIG9uIHRoZSBuZXh0IGxpbmUgKGN1cnJlbnQKLSAgIGxpbmUgaWYgdGhhdCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQpICovCi0KLWV4dGVybiB2b2lkIGxmX2luZGVudF9zdXBwcmVzcwotKGxmICpmaWxlKTsKLQotZXh0ZXJuIHZvaWQgbGZfaW5kZW50Ci0obGYgKmZpbGUsCi0gaW50IGRlbHRhKTsKLQotCi0vKiBQcmludCBnZW5lcmljIHRleHQ6ICovCi0KLQotZXh0ZXJuIGludCBsZl9wcmludF9fZ251X2NvcHlsZWZ0Ci0obGYgKmZpbGUpOwotCi1leHRlcm4gaW50IGxmX3ByaW50X19maWxlX3N0YXJ0Ci0obGYgKmZpbGUpOwotCi1leHRlcm4gaW50IGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpyZWFzb24pOwotCi1leHRlcm4gaW50IGxmX3ByaW50X19maWxlX2ZpbmlzaAotKGxmICpmaWxlKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9faW50ZXJuYWxfcmVmCi0obGYgKmZpbGUpOwotCi1leHRlcm4gaW50IGxmX3ByaW50X19leHRlcm5hbF9yZWYKLShsZiAqZmlsZSwKLSBpbnQgbGluZV9uciwKLSBjb25zdCBjaGFyICpmaWxlX25hbWUpOwotCi1leHRlcm4gaW50IGxmX3ByaW50X19saW5lX3JlZgotKGxmICpmaWxlLAotIGxpbmVfcmVmICpsaW5lKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGUKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICp0eXBlLAotIGNvbnN0IGNoYXIgKnByZWZpeCwKLSBjb25zdCBjaGFyICp0cmFpbGluZ19zcGFjZSk7Ci0KLXR5cGVkZWYgaW50IHByaW50X2Z1bmN0aW9uKGxmICpmaWxlKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbgotKGxmICpmaWxlLAotIHByaW50X2Z1bmN0aW9uICpwcmludF90eXBlLAotIGNvbnN0IGNoYXIgKnByZWZpeCwKLSBjb25zdCBjaGFyICp0cmFpbGluZ19zcGFjZSk7Ci0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL21pc2MuYyBiL3NpbS9pZ2VuL21pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MDEzMi4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9taXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLS8qIE5COiBCZWNhdXNlIHdhcm5pbmcgYW5kIGVycm9yIGNhbiBiZSBpbnRlcmNoYW5nZWQsIG5laXRoZXIgYXBwZW5kIGEKLSAgIHRyYWlsaW5nICdcbicgKi8KLQotdm9pZAotZXJyb3IgKGNvbnN0IGxpbmVfcmVmICpsaW5lLAotICAgICAgIGNoYXIgKm1zZywKLSAgICAgICAuLi4pCi17Ci0gIHZhX2xpc3QgYXA7Ci0gIGlmIChsaW5lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICIsIGxpbmUtPmZpbGVfbmFtZSwgbGluZS0+bGluZV9ucik7Ci0gIHZhX3N0YXJ0IChhcCwgbXNnKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotICBleGl0ICgxKTsKLX0KLQotdm9pZAotd2FybmluZyAoY29uc3QgbGluZV9yZWYgKmxpbmUsCi0JIGNoYXIgKm1zZywKLQkgLi4uKQotewotICB2YV9saXN0IGFwOwotICBpZiAobGluZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiB3YXJuaW5nOiAiLCBsaW5lLT5maWxlX25hbWUsIGxpbmUtPmxpbmVfbnIpOwotICB2YV9zdGFydCAoYXAsIG1zZyk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgYXApOwotICB2YV9lbmQgKGFwKTsKLX0KLQotdm9pZAotbm90aWZ5IChjb25zdCBsaW5lX3JlZiAqbGluZSwKLQljaGFyICptc2csCi0JLi4uKQotewotICB2YV9saXN0IGFwOwotICBpZiAobGluZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZG91dCwgIiVzICVkOiBpbmZvOiAiLCBsaW5lLT5maWxlX25hbWUsIGxpbmUtPmxpbmVfbnIpOwotICB2YV9zdGFydChhcCwgbXNnKTsKLSAgdmZwcmludGYgKHN0ZG91dCwgbXNnLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgKgotemFsbG9jKGxvbmcgc2l6ZSkKLXsKLSAgdm9pZCAqbWVtb3J5ID0gbWFsbG9jKHNpemUpOwotICBpZiAobWVtb3J5ID09IE5VTEwpCi0gICAgRVJST1IgKCJ6YWxsb2MgZmFpbGVkIik7Ci0gIG1lbXNldChtZW1vcnksIDAsIHNpemUpOwotICByZXR1cm4gbWVtb3J5OwotfQotCi0KLXVuc2lnbmVkIGxvbmcgbG9uZwotYTJpIChjb25zdCBjaGFyICphKQotewotICBpbnQgbmVnID0gMDsKLSAgaW50IGJhc2UgPSAxMDsKLSAgdW5zaWduZWQgbG9uZyBsb25nIG51bSA9IDA7Ci0gIGludCBsb29waW5nOwotICAKLSAgd2hpbGUgKGlzc3BhY2UgKCphKSkKLSAgICBhKys7Ci0gIAotICBpZiAoc3RyY21wIChhLCAidHJ1ZSIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoYSwgIlRSVUUiKSA9PSAwKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzdHJjbXAgKGEsICJmYWxzZSIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoYSwgImZhbHNlIikgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKmEgPT0gJy0nKQotICAgIHsKLSAgICAgIG5lZyA9IDE7Ci0gICAgICBhKys7Ci0gICAgfQotICAKLSAgaWYgKCphID09ICcwJykKLSAgICB7Ci0gICAgICBpZiAoYVsxXSA9PSAneCcgfHwgYVsxXSA9PSAnWCcpCi0JewotCSAgYSArPSAyOwotCSAgYmFzZSA9IDE2OwotCX0KLSAgICAgIGVsc2UgaWYgKGFbMV0gPT0gJ2InIHx8IGFbMV0gPT0gJ2InKQotCXsKLQkgIGEgKz0gMjsKLQkgIGJhc2UgPSAyOwotCX0KLSAgICAgIGVsc2UKLQliYXNlID0gODsKLSAgICB9Ci0gIAotICBsb29waW5nID0gMTsKLSAgd2hpbGUgKGxvb3BpbmcpCi0gICAgewotICAgICAgaW50IGNoID0gKmErKzsKLSAgICAgIAotICAgICAgc3dpdGNoIChiYXNlKQotCXsKLQlkZWZhdWx0OgotCSAgbG9vcGluZyA9IDA7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgMjoKLQkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzEnKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG51bSAqIDIpICsgKGNoIC0gJzAnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9vcGluZyA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSAxMDoKLQkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG51bSAqIDEwKSArIChjaCAtICcwJyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxvb3BpbmcgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgODoKLQkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG51bSAqIDgpICsgKGNoIC0gJzAnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9vcGluZyA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSAxNjoKLQkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG51bSAqIDE2KSArIChjaCAtICcwJyk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCi0JICAgIHsKLQkgICAgICBudW0gPSAobnVtICogMTYpICsgKGNoIC0gJ2EnICsgMTApOwotCSAgICB9Ci0JICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG51bSAqIDE2KSArIChjaCAtICdBJyArIDEwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9vcGluZyA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIAotICBpZiAobmVnKQotICAgIG51bSA9IC0gbnVtOwotCi0gIHJldHVybiBudW07Ci19Ci0KLXVuc2lnbmVkCi10YXJnZXRfYTJpKGludCBtc19iaXRfbnIsCi0JICAgY29uc3QgY2hhciAqYSkKLXsKLSAgaWYgKG1zX2JpdF9ucikKLSAgICByZXR1cm4gKG1zX2JpdF9uciAtIGEyaShhKSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gYTJpKGEpOwotfQotCi11bnNpZ25lZAotaTJ0YXJnZXQoaW50IG1zX2JpdF9uciwKLQkgdW5zaWduZWQgYml0KQotewotICBpZiAobXNfYml0X25yKQotICAgIHJldHVybiBtc19iaXRfbnIgLSBiaXQ7Ci0gIGVsc2UKLSAgICByZXR1cm4gYml0OwotfQotCi0KLWludAotbmFtZTJpIChjb25zdCBjaGFyICpuYW1lcywKLSAgICAgICAgY29uc3QgbmFtZV9tYXAgKm1hcCkKLXsKLSAgY29uc3QgbmFtZV9tYXAgKmN1cnI7Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBuYW1lczsKLSAgd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0gICAgewotICAgICAgLyogZmluZCBvdXIgbmFtZSAqLwotICAgICAgY2hhciAqZW5kID0gc3RyY2hyKG5hbWUsICcsJyk7Ci0gICAgICBjaGFyICpuZXh0OwotICAgICAgdW5zaWduZWQgbGVuOwotICAgICAgaWYgKGVuZCA9PSBOVUxMKQotCXsKLQkgIGVuZCA9IHN0cmNocihuYW1lLCAnXDAnKTsKLQkgIG5leHQgPSBlbmQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5leHQgPSBlbmQgKyAxOwotCX0KLSAgICAgIGxlbiA9IGVuZCAtIG5hbWU7Ci0gICAgICAvKiBsb29rIGl0IHVwICovCi0gICAgICBjdXJyID0gbWFwOwotICAgICAgd2hpbGUgKGN1cnItPm5hbWUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoc3RybmNtcCAoY3Vyci0+bmFtZSwgbmFtZSwgbGVuKSA9PSAwCi0JICAgICAgJiYgc3RybGVuIChjdXJyLT5uYW1lKSA9PSBsZW4pCi0JICAgIHJldHVybiBjdXJyLT5pOwotCSAgY3VycisrOwotCX0KLSAgICAgIG5hbWUgPSBuZXh0OwotICAgIH0KLSAgLyogbm90aGluZyBmb3VuZCwgcG9zc2libHkgcmV0dXJuIGEgZGVmYXVsdCAqLwotICBjdXJyID0gbWFwOwotICB3aGlsZSAoY3Vyci0+bmFtZSAhPSBOVUxMKQotICAgIGN1cnIrKzsKLSAgaWYgKGN1cnItPmkgPj0gMCkKLSAgICByZXR1cm4gY3Vyci0+aTsKLSAgZWxzZQotICAgIGVycm9yIChOVUxMLCAiJXMgY29udGFpbnMgbm8gdmFsaWQgbmFtZXMiLCBuYW1lcyk7Ci0gIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICoKLWkybmFtZSAoY29uc3QgaW50IGksCi0gICAgICAgIGNvbnN0IG5hbWVfbWFwICptYXApCi17Ci0gIHdoaWxlIChtYXAtPm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobWFwLT5pID09IGkpCi0JcmV0dXJuIG1hcC0+bmFtZTsKLSAgICAgIG1hcCsrOwotICAgIH0KLSAgZXJyb3IgKE5VTEwsICJtYXAgbG9va3VwIGZhaWxlZCBmb3IgJWRcbiIsIGkpOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL21pc2MuaCBiL3NpbS9pZ2VuL21pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODA3Zi4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi9taXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogRnJ1c3RyYXRpbmcgaGVhZGVyIGp1bmsgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0KLWVudW0gewotICBkZWZhdWx0X2luc25fYml0X3NpemUgPSAzMiwKLSAgbWF4X2luc25fYml0X3NpemUgPSA2NCwKLX07Ci0KLQotLyogRGVmaW5lIGEgNjRiaXQgZGF0YSB0eXBlICovCi0KLSNpZiBkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX1dJTjMyCi0jaWZkZWYgX19HTlVDX18KLQotdHlwZWRlZiBsb25nIGxvbmcgc2lnbmVkNjQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZDY0OwotCi0jZWxzZQkvKiBfV0lOMzIgKi8KLQotdHlwZWRlZiBfX2ludDY0IHNpZ25lZDY0OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVuc2lnbmVkNjQ7Ci0KLSNlbmRpZiAvKiBfV0lOMzIgKi8KLSNlbHNlIC8qIE5vdCBHTlVDIG9yIFdJTjMyICovCi0vKiBOb3Qgc3VwcG9ydGVkICovCi0jZW5kaWYKLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfX2F0dHJpYnV0ZV9fKSAmJiAoIWRlZmluZWQoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpKQotI2RlZmluZSBfX2F0dHJpYnV0ZV9fKGFyZykKLSNlbmRpZgotCi0KLQotI2luY2x1ZGUgImZpbHRlcl9ob3N0LmgiCi0KLXR5cGVkZWYgc3RydWN0IF9saW5lX3JlZiBsaW5lX3JlZjsKLXN0cnVjdCBfbGluZV9yZWYgewotICBjb25zdCBjaGFyICpmaWxlX25hbWU7Ci0gIGludCBsaW5lX25yOwotfTsKLQotLyogRXJyb3IgYXBwZW5kcyBhIG5ldyBsaW5lLCB3YXJuaW5nIGFuZCBub3RpZnkgZG8gbm90ICovCi10eXBlZGVmIHZvaWQgZXJyb3JfZnVuYwotKGNvbnN0IGxpbmVfcmVmICpsaW5lLAotIGNoYXIgKm1zZywKLSAuLi4pOwotCi1leHRlcm4gZXJyb3JfZnVuYyBlcnJvcjsKLWV4dGVybiBlcnJvcl9mdW5jIHdhcm5pbmc7Ci1leHRlcm4gZXJyb3JfZnVuYyBub3RpZnk7Ci0KLQotI2RlZmluZSBFUlJPUihFWFBSRVNTSU9OKSBcCi1kbyB7IFwKLSAgbGluZV9yZWYgbGluZTsgXAotICBsaW5lLmZpbGVfbmFtZSA9IGZpbHRlcl9maWxlbmFtZSAoX19GSUxFX18pOyBcCi0gIGxpbmUubGluZV9uciA9IF9fTElORV9fOyBcCi0gIGVycm9yICgmbGluZSwgRVhQUkVTU0lPTik7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVNTRVJUKEVYUFJFU1NJT04pIFwKLWRvIHsgXAotICBpZiAoIShFWFBSRVNTSU9OKSkgeyBcCi0gICAgbGluZV9yZWYgbGluZTsgXAotICAgIGxpbmUuZmlsZV9uYW1lID0gZmlsdGVyX2ZpbGVuYW1lIChfX0ZJTEVfXyk7IFwKLSAgICBsaW5lLmxpbmVfbnIgPSBfX0xJTkVfXzsgXAotICAgIGVycm9yKCZsaW5lLCAiYXNzZXJ0aW9uIGZhaWxlZCAtICVzXG4iLCAjRVhQUkVTU0lPTik7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFpBTExPQyhUWVBFKSAoKFRZUEUqKSB6YWxsb2MgKHNpemVvZihUWVBFKSkpCi0jZGVmaW5lIE5aQUxMT0MoVFlQRSxOKSAoKFRZUEUqKSB6YWxsb2MgKHNpemVvZihUWVBFKSAqIChOKSkpCi0jaWYgMAotI2RlZmluZSBTVFJEVVAoU1RSSU5HKSAoc3RyY3B5ICh6YWxsb2MgKHN0cmxlbiAoU1RSSU5HKSArIDEpLCAoU1RSSU5HKSkpCi0jZGVmaW5lIFNUUk5EVVAoU1RSSU5HLExFTikgKHN0cm5jcHkgKHphbGxvYyAoKExFTikgKyAxKSwgKFNUUklORyksIChMRU4pKSkKLSNlbmRpZgotCi1leHRlcm4gdm9pZCAqemFsbG9jCi0obG9uZyBzaXplKTsKLQotZXh0ZXJuIHVuc2lnbmVkIHRhcmdldF9hMmkKLShpbnQgbXNfYml0X25yLAotIGNvbnN0IGNoYXIgKmEpOwotCi1leHRlcm4gdW5zaWduZWQgaTJ0YXJnZXQKLShpbnQgbXNfYml0X25yLAotIHVuc2lnbmVkIGJpdCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgYTJpCi0oY29uc3QgY2hhciAqYSk7Ci0KLQotLyogVHJ5IGxvb2tpbmcgZm9yIG5hbWUgaW4gdGhlIG1hcCB0YWJsZSAocmV0dXJuaW5nIHRoZSBjb3JyZXNwb25kaW5nCi0gICBpbnRlZ2VyIHZhbHVlKS4KLQotICAgSWYgdGhlIHRoZSBzZW50aW5hbCAoTkFNRSA9PSBOVUxMKSBpdHMgdmFsdWUgaWYgPj0gemVybyBpcyByZXR1cm5lZAotICAgYXMgdGhlIGRlZmF1bHQuICovCi0KLXR5cGVkZWYgc3RydWN0IF9uYW1lX21hcCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCBpOwotfSBuYW1lX21hcDsKLQotZXh0ZXJuIGludCBuYW1lMmkKLShjb25zdCBjaGFyICpuYW1lLAotIGNvbnN0IG5hbWVfbWFwICptYXApOwotCi1leHRlcm4gY29uc3QgY2hhciAqaTJuYW1lCi0oY29uc3QgaW50IGksCi0gY29uc3QgbmFtZV9tYXAgKm1hcCk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi90YWJsZS5jIGIvc2ltL2lnZW4vdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhOWU5Yi4uMDAwMDAwMAotLS0gYS9zaW0vaWdlbi90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBfb3Blbl90YWJsZSBvcGVuX3RhYmxlOwotc3RydWN0IF9vcGVuX3RhYmxlIHsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKmJ1ZmZlcjsKLSAgY2hhciAqcG9zOwotICBsaW5lX3JlZiBwc2V1ZG9fbGluZTsKLSAgbGluZV9yZWYgcmVhbF9saW5lOwotICBvcGVuX3RhYmxlICpwYXJlbnQ7Ci0gIHRhYmxlICpyb290OwotfTsKLXN0cnVjdCBfdGFibGUgewotICBvcGVuX3RhYmxlICpjdXJyZW50OwotfTsKLQotCi1zdGF0aWMgbGluZV9yZWYgKgotY3VycmVudF9saW5lIChvcGVuX3RhYmxlICpmaWxlKQotewotICBsaW5lX3JlZiAqZW50cnkgPSBaQUxMT0MgKGxpbmVfcmVmKTsKLSAgKmVudHJ5ID0gZmlsZS0+cHNldWRvX2xpbmU7Ci0gIHJldHVybiBlbnRyeTsKLX0KLQotc3RhdGljIHRhYmxlX2VudHJ5ICoKLW5ld190YWJsZV9lbnRyeSAob3Blbl90YWJsZSAqZmlsZSwKLQkJIHRhYmxlX2VudHJ5X3R5cGUgdHlwZSkKLXsKLSAgdGFibGVfZW50cnkgKmVudHJ5OwotICBlbnRyeSA9IFpBTExPQyAodGFibGVfZW50cnkpOwotICBlbnRyeS0+ZmlsZSA9IGZpbGUtPnJvb3Q7Ci0gIGVudHJ5LT5saW5lID0gY3VycmVudF9saW5lIChmaWxlKTsKLSAgZW50cnktPnR5cGUgPSB0eXBlOwotICByZXR1cm4gZW50cnk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfbnJfdGFibGVfZW50cnlfZmllbGRzICh0YWJsZV9lbnRyeSAqZW50cnksCi0JCQkgICBpbnQgbnJfZmllbGRzKQotewotICBlbnRyeS0+ZmllbGQgPSBOWkFMTE9DIChjaGFyKiwgbnJfZmllbGRzICsgMSk7Ci0gIGVudHJ5LT5ucl9maWVsZHMgPSBucl9maWVsZHM7Ci19Ci0KLQotdm9pZAotdGFibGVfcHVzaCAodGFibGUgKnJvb3QsCi0JICAgIGxpbmVfcmVmICpsaW5lLAotCSAgICB0YWJsZV9pbmNsdWRlICppbmNsdWRlcywKLQkgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQotewotICBGSUxFICpmZjsKLSAgb3Blbl90YWJsZSAqZmlsZTsKLSAgdGFibGVfaW5jbHVkZSBkdW1teTsKLSAgdGFibGVfaW5jbHVkZSAqaW5jbHVkZSA9ICZkdW1teTsKLQotICAvKiBkdW1teSB1cCBhIHNlYXJjaCBvZiB0aGlzIGRpcmVjdG9yeSAqLwotICBkdW1teS5uZXh0ID0gaW5jbHVkZXM7Ci0gIGR1bW15LmRpciA9ICIiOwotCi0gIC8qIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciAqLwotICBmaWxlID0gWkFMTE9DIChvcGVuX3RhYmxlKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVfbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGZpbGUtPnJvb3QgPSByb290OwotICBmaWxlLT5wYXJlbnQgPSByb290LT5jdXJyZW50OwotICByb290LT5jdXJyZW50ID0gZmlsZTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBzYXZlIHRoZSBmaWxlIG5hbWUgKi8KLSAgICAgIGNoYXIgKmR1cF9uYW1lID0gTlpBTExPQyAoY2hhciwgc3RybGVuIChpbmNsdWRlLT5kaXIpICsgc3RybGVuIChmaWxlX25hbWUpICsgMik7Ci0gICAgICBpZiAoZHVwX25hbWUgPT0gTlVMTCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVfbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpZiAoaW5jbHVkZS0+ZGlyWzBdICE9ICdcMCcpCi0JewotCSAgc3RyY2F0IChkdXBfbmFtZSwgaW5jbHVkZS0+ZGlyKTsKLQkgIHN0cmNhdCAoZHVwX25hbWUsICIvIik7Ci0JfQotICAgICAgc3RyY2F0IChkdXBfbmFtZSwgZmlsZV9uYW1lKTsKLSAgICAgIGZpbGUtPnJlYWxfbGluZS5maWxlX25hbWUgPSBkdXBfbmFtZTsKLSAgICAgIGZpbGUtPnBzZXVkb19saW5lLmZpbGVfbmFtZSA9IGR1cF9uYW1lOwotICAgICAgLyogb3BlbiB0aGUgZmlsZSAqLwotCi0gICAgICBmZiA9IGZvcGVuIChkdXBfbmFtZSwgInJiIik7Ci0gICAgICBpZiAoZmYpCi0JYnJlYWs7Ci0gICAgICAvKiB6ZnJlZSAoZHVwX25hbWUpOyAqLwotICAgICAgaWYgKGluY2x1ZGUtPm5leHQgPT0gTlVMTCkKLQl7Ci0JICBpZiAobGluZSAhPSBOVUxMKQotCSAgICBlcnJvciAobGluZSwgIlByb2JsZW0gb3BlbmluZyBmaWxlIGAlcydcbiIsIGZpbGVfbmFtZSk7Ci0JICBwZXJyb3IgKGZpbGVfbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpbmNsdWRlID0gaW5jbHVkZS0+bmV4dDsKLSAgfQotCi0KLSAgLyogZGV0ZXJtaW5lIHRoZSBzaXplICovCi0gIGZzZWVrIChmZiwgMCwgU0VFS19FTkQpOwotICBmaWxlLT5zaXplID0gZnRlbGwgKGZmKTsKLSAgZnNlZWsgKGZmLCAwLCBTRUVLX1NFVCk7Ci0KLSAgLyogYWxsb2NhdGUgdGhpcyBtdWNoIG1lbW9yeSAqLwotICBmaWxlLT5idWZmZXIgPSAoY2hhciopIHphbGxvYyAoZmlsZS0+c2l6ZSArIDEpOwotICBpZiAoZmlsZS0+YnVmZmVyID09IE5VTEwpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBmaWxlLT5wb3MgPSBmaWxlLT5idWZmZXI7Ci0KLSAgLyogcmVhZCBpdCBhbGwgaW4gKi8KLSAgaWYgKGZyZWFkIChmaWxlLT5idWZmZXIsIDEsIGZpbGUtPnNpemUsIGZmKSA8IGZpbGUtPnNpemUpIHsKLSAgICBwZXJyb3IgKGZpbGVfbmFtZSk7Ci0gICAgZXhpdCAoMSk7Ci0gIH0KLSAgZmlsZS0+YnVmZmVyW2ZpbGUtPnNpemVdID0gJ1wwJzsKLQotICAvKiBzZXQgdGhlIGluaXRpYWwgbGluZSBudW1iZXJpbmcgKi8KLSAgZmlsZS0+cmVhbF9saW5lLmxpbmVfbnIgPSAxOyAvKiBzcGVjaWZpZXMgY3VycmVudCBsaW5lICovCi0gIGZpbGUtPnBzZXVkb19saW5lLmxpbmVfbnIgPSAxOyAvKiBzcGVjaWZpZXMgY3VycmVudCBsaW5lICovCi0KLSAgLyogZG9uZSAqLwotICBmY2xvc2UgKGZmKTsKLX0KLQotdGFibGUgKgotdGFibGVfb3BlbiAoY29uc3QgY2hhciAqZmlsZV9uYW1lKQotewotICB0YWJsZSAqcm9vdDsKLQotICAvKiBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgcm9vdCA9IFpBTExPQyAodGFibGUpOwotICBpZiAocm9vdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICB0YWJsZV9wdXNoIChyb290LCBOVUxMLCBOVUxMLCBmaWxlX25hbWUpOwotICByZXR1cm4gcm9vdDsKLX0KLQotY2hhciAqCi1za2lwX3NwYWNlcyAoY2hhciAqY2hwKQotewotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoKmNocCA9PSAnXDAnCi0JICB8fCAqY2hwID09ICdcbicKLQkgIHx8ICFpc3NwYWNlICgqY2hwKSkKLQlyZXR1cm4gY2hwOwotICAgICAgY2hwKys7Ci0gICAgfQotfQotCi0KLWNoYXIgKgotYmFja19zcGFjZXMgKGNoYXIgKnN0YXJ0LCBjaGFyICpjaHApCi17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChjaHAgPD0gc3RhcnQKLQkgIHx8ICFpc3NwYWNlIChjaHBbLTFdKSkKLQlyZXR1cm4gY2hwOwotICAgICAgY2hwLS07Ci0gICAgfQotfQotCi1jaGFyICoKLXNraXBfZGlnaXRzIChjaGFyICpjaHApCi17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICgqY2hwID09ICdcMCcKLQkgIHx8ICpjaHAgPT0gJ1xuJwotCSAgfHwgIWlzZGlnaXQgKCpjaHApKQotCXJldHVybiBjaHA7Ci0gICAgICBjaHArKzsKLSAgICB9Ci19Ci0KLWNoYXIgKgotc2tpcF90b19zZXBhcmF0b3IgKGNoYXIgKmNocCwKLQkJICAgY2hhciAqc2VwYXJhdG9ycykKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqc2VwID0gc2VwYXJhdG9yczsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGlmICgqY2hwID09ICpzZXApCi0JICAgIHJldHVybiBjaHA7Ci0JICBpZiAoKnNlcCA9PSAnXDAnKQotCSAgICBicmVhazsKLQkgIHNlcCsrOwotCX0KLSAgICAgIGNocCsrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotc2tpcF90b19udWxsIChjaGFyICpjaHApCi17Ci0gIHJldHVybiBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiIik7Ci19Ci0KLQotc3RhdGljIGNoYXIgKgotc2tpcF90b19ubCAoY2hhciAqIGNocCkKLXsKLSAgcmV0dXJuIHNraXBfdG9fc2VwYXJhdG9yIChjaHAsICJcbiIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZXh0X2xpbmUgKG9wZW5fdGFibGUgKmZpbGUpCi17Ci0gIGZpbGUtPnBvcyA9IHNraXBfdG9fbmwgKGZpbGUtPnBvcyk7Ci0gIGlmICgqZmlsZS0+cG9zID09ICcwJykKLSAgICBlcnJvciAoJmZpbGUtPnBzZXVkb19saW5lLCAiTWlzc2luZyA8bmw+IGF0IGVuZCBvZiBsaW5lXG4iKTsKLSAgKmZpbGUtPnBvcyA9ICdcMCc7Ci0gIGZpbGUtPnBvcyArPSAxOwotICBmaWxlLT5yZWFsX2xpbmUubGluZV9uciArPSAxOwotICBmaWxlLT5wc2V1ZG9fbGluZS5saW5lX25yICs9IDE7Ci19Ci0KLQotZXh0ZXJuIHRhYmxlX2VudHJ5ICoKLXRhYmxlX3JlYWQgKHRhYmxlICpyb290KQotewotICBvcGVuX3RhYmxlICpmaWxlID0gcm9vdC0+Y3VycmVudDsKLSAgdGFibGVfZW50cnkgKmVudHJ5ID0gTlVMTDsKLSAgd2hpbGUoMSkKLSAgICB7Ci0KLSAgICAgIC8qIGVuZC1vZi1maWxlPyAqLwotICAgICAgd2hpbGUgKCpmaWxlLT5wb3MgPT0gJ1wwJykKLQl7Ci0JICBpZiAoZmlsZS0+cGFyZW50ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmaWxlID0gZmlsZS0+cGFyZW50OwotCSAgICAgIHJvb3QtPmN1cnJlbnQgPSBmaWxlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgLyogY29kZV9ibG9jaz8gKi8KLSAgICAgIGlmICgqZmlsZS0+cG9zID09ICd7JykKLQl7Ci0JICBjaGFyICpjaHA7Ci0JICBuZXh0X2xpbmUgKGZpbGUpOyAvKiBkaXNjYXJkIGxlYWRpbmcgYnJhY2UgKi8KLQkgIGVudHJ5ID0gbmV3X3RhYmxlX2VudHJ5IChmaWxlLCB0YWJsZV9jb2RlX2VudHJ5KTsKLQkgIGNocCA9IGZpbGUtPnBvczsKLQkgIC8qIGRldGVybWluZSBob3cgbWFueSBsaW5lcyBhcmUgaW52b2x2ZWQgLSBsb29rIGZvciA8bmw+ICJ9IiAqLwotCSAgewotCSAgICBpbnQgbnJfbGluZXMgPSAwOwotCSAgICB3aGlsZSAoKmZpbGUtPnBvcyAhPSAnfScpCi0JICAgICAgewotCQluZXh0X2xpbmUgKGZpbGUpOwotCQlucl9saW5lcysrOwotCSAgICAgIH0KLQkgICAgc2V0X25yX3RhYmxlX2VudHJ5X2ZpZWxkcyAoZW50cnksIG5yX2xpbmVzKTsKLQkgIH0KLQkgIC8qIG5vdyBlbnRlciBlYWNoIGxpbmUgKi8KLQkgIHsKLQkgICAgaW50IGxpbmVfbnI7Ci0JICAgIGZvciAobGluZV9uciA9IDA7IGxpbmVfbnIgPCBlbnRyeS0+bnJfZmllbGRzOyBsaW5lX25yKyspCi0JICAgICAgewotCQlpZiAoc3RybmNtcCAoY2hwLCAiICAiLCAyKSA9PSAwKQotCQkgIGVudHJ5LT5maWVsZFtsaW5lX25yXSA9IGNocCArIDI7Ci0JCWVsc2UKLQkJICBlbnRyeS0+ZmllbGRbbGluZV9ucl0gPSBjaHA7Ci0JCWNocCA9IHNraXBfdG9fbnVsbCAoY2hwKSArIDE7Ci0JICAgICAgfQotCSAgICAvKiBza2lwIHRyYWlsaW5nIGJyYWNlICovCi0JICAgIEFTU0VSVCAoKmZpbGUtPnBvcyA9PSAnfScpOwotCSAgICBuZXh0X2xpbmUgKGZpbGUpOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiB0YWIgYmxvY2s/ICovCi0gICAgICBpZiAoKmZpbGUtPnBvcyA9PSAnXHQnKQotCXsKLQkgIGNoYXIgKmNocCA9IGZpbGUtPnBvczsKLQkgIGVudHJ5ID0gbmV3X3RhYmxlX2VudHJ5IChmaWxlLCB0YWJsZV9jb2RlX2VudHJ5KTsKLQkgIC8qIGRldGVybWluZSBob3cgbWFueSBsaW5lcyBhcmUgaW52b2x2ZWQgLSBsb29rIGZvciA8bmw+ICE8dGFiPiAqLwotCSAgewotCSAgICBpbnQgbnJfbGluZXMgPSAwOwotCSAgICBpbnQgbnJfYmxhbmtfbGluZXMgPSAwOwotCSAgICB3aGlsZSAoMSkKLQkgICAgICB7Ci0JCWlmICgqZmlsZS0+cG9zID09ICdcdCcpCi0JCSAgewotCQkgICAgbnJfbGluZXMgPSBucl9saW5lcyArIG5yX2JsYW5rX2xpbmVzICsgMTsKLQkJICAgIG5yX2JsYW5rX2xpbmVzID0gMDsKLQkJICAgIG5leHRfbGluZSAoZmlsZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZmlsZS0+cG9zID0gc2tpcF9zcGFjZXMgKGZpbGUtPnBvcyk7Ci0JCSAgICBpZiAoKmZpbGUtPnBvcyAhPSAnXG4nKQotCQkgICAgICBicmVhazsKLQkJICAgIG5yX2JsYW5rX2xpbmVzKys7Ci0JCSAgICBuZXh0X2xpbmUgKGZpbGUpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIHNldF9ucl90YWJsZV9lbnRyeV9maWVsZHMgKGVudHJ5LCBucl9saW5lcyk7Ci0JICB9Ci0JICAvKiBub3cgZW50ZXIgZWFjaCBsaW5lICovCi0JICB7Ci0JICAgIGludCBsaW5lX25yOwotCSAgICBmb3IgKGxpbmVfbnIgPSAwOyBsaW5lX25yIDwgZW50cnktPm5yX2ZpZWxkczsgbGluZV9ucisrKQotCSAgICAgIHsKLQkJaWYgKCpjaHAgPT0gJ1x0JykKLQkJICBlbnRyeS0+ZmllbGRbbGluZV9ucl0gPSBjaHAgKyAxOwotCQllbHNlCi0JCSAgZW50cnktPmZpZWxkW2xpbmVfbnJdID0gIiI7IC8qIGJsYW5rICovCi0JCWNocCA9IHNraXBfdG9fbnVsbCAoY2hwKSArIDE7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBjcHAgZGlyZWN0aXZlPyAqLwotICAgICAgaWYgKGZpbGUtPnBvc1swXSA9PSAnIycpCi0JewotCSAgY2hhciAqY2hwID0gc2tpcF9zcGFjZXMgKGZpbGUtPnBvcyArIDEpOwotCi0JICAvKiBjcHAgbGluZS1uciBkaXJlY3RpdmUgLSAjIDxsaW5lLW5yPiAiPGZpbGU+IiAqLwotCSAgaWYgKGlzZGlnaXQgKCpjaHApCi0JICAgICAgJiYgKnNraXBfZGlnaXRzIChjaHApID09ICcgJwotCSAgICAgICYmICpza2lwX3NwYWNlcyAoc2tpcF9kaWdpdHMgKGNocCkpID09ICciJykKLQkgICAgewotCSAgICAgIGludCBsaW5lX25yOwotCSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLQkgICAgICBmaWxlLT5wb3MgPSBjaHA7Ci0JICAgICAgLyogcGFyc2UgdGhlIG51bWJlciAqLwotCSAgICAgIGxpbmVfbnIgPSBhdG9pKGZpbGUtPnBvcykgLSAxOwotCSAgICAgIC8qIHNraXAgdG8gdGhlIGZpbGUgbmFtZSAqLwotCSAgICAgIHdoaWxlIChmaWxlLT5wb3NbMF0gIT0gJzAnCi0JCSAgICAgJiYgZmlsZS0+cG9zWzBdICE9ICciJwotCQkgICAgICYmIGZpbGUtPnBvc1swXSAhPSAnXDAnKQotCQlmaWxlLT5wb3MrKzsKLQkgICAgICBpZiAoZmlsZS0+cG9zWzBdICE9ICciJykKLQkJZXJyb3IgKCZmaWxlLT5yZWFsX2xpbmUsICJNaXNzaW5nIG9wZW5pbmcgcXVvdGUgaW4gY3BwIGRpcmVjdGl2ZVxuIik7Ci0JICAgICAgLyogcGFyc2UgdGhlIGZpbGUgbmFtZSAqLwotCSAgICAgIGZpbGUtPnBvcysrOwotCSAgICAgIGZpbGVfbmFtZSA9IGZpbGUtPnBvczsKLQkgICAgICB3aGlsZSAoZmlsZS0+cG9zWzBdICE9ICciJwotCQkgICAgICYmIGZpbGUtPnBvc1swXSAhPSAnXDAnKQotCQlmaWxlLT5wb3MrKzsKLQkgICAgICBpZiAoZmlsZS0+cG9zWzBdICE9ICciJykKLQkJZXJyb3IgKCZmaWxlLT5yZWFsX2xpbmUsICJNaXNzaW5nIGNsb3NpbmcgcXVvdGUgaW4gY3BwIGRpcmVjdGl2ZVxuIik7Ci0JICAgICAgZmlsZS0+cG9zWzBdID0gJ1wwJzsKLQkgICAgICBmaWxlLT5wb3MrKzsKLQkgICAgICBmaWxlLT5wb3MgPSBza2lwX3RvX25sIChmaWxlLT5wb3MpOwotCSAgICAgIGlmIChmaWxlLT5wb3NbMF0gIT0gJ1xuJykKLQkJZXJyb3IgKCZmaWxlLT5yZWFsX2xpbmUsICJNaXNzaW5nIG5ld2xpbmUgaW4gY3BwIGRpcmVjdGl2ZVxuIik7Ci0JICAgICAgZmlsZS0+cHNldWRvX2xpbmUuZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgICAgIGZpbGUtPnBzZXVkb19saW5lLmxpbmVfbnIgPSBsaW5lX25yOwotCSAgICAgIG5leHRfbGluZSAoZmlsZSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogI2RlZmluZSBhbmQgI3VuZGVmIC0gbm90IGltcGxlbWVudGVkIHlldCAqLwotCi0JICAvKiBPbGQgc3R5bGUgIyBjb21tZW50ICovCi0JICBuZXh0X2xpbmUgKGZpbGUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBibGFuayBsaW5lIG9yIGVuZC1vZi1maWxlPyAqLwotICAgICAgZmlsZS0+cG9zID0gc2tpcF9zcGFjZXMgKGZpbGUtPnBvcyk7Ci0gICAgICBpZiAoKmZpbGUtPnBvcyA9PSAnXDAnKQotCWVycm9yICgmZmlsZS0+cHNldWRvX2xpbmUsICJNaXNzaW5nIDxubD4gYXQgZW5kIG9mIGZpbGVcbiIpOwotICAgICAgaWYgKCpmaWxlLT5wb3MgPT0gJ1xuJykKLQl7Ci0JICBuZXh0X2xpbmUgKGZpbGUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBjb21tZW50IC0gbGVhZGluZyAvLyBvciAjIC0gc2tpcCAqLwotICAgICAgaWYgKChmaWxlLT5wb3NbMF0gPT0gJy8nICYmIGZpbGUtPnBvc1sxXSA9PSAnLycpCi0JICB8fCAoZmlsZS0+cG9zWzBdID09ICcjJykpCi0JewotCSAgbmV4dF9saW5lIChmaWxlKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogY29sb24gZmllbGQgKi8KLSAgICAgIHsKLQljaGFyICpjaHAgPSBmaWxlLT5wb3M7Ci0JZW50cnkgPSBuZXdfdGFibGVfZW50cnkgKGZpbGUsIHRhYmxlX2NvbG9uX2VudHJ5KTsKLQluZXh0X2xpbmUgKGZpbGUpOwotCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgZmllbGRzICovCi0JewotCSAgaW50IG5yX2ZpZWxkcyA9IDE7Ci0JICBjaGFyICp0bXBjaCA9IGNocDsKLQkgIHdoaWxlICgxKQotCSAgICB7Ci0JICAgICAgdG1wY2ggPSBza2lwX3RvX3NlcGFyYXRvciAodG1wY2gsICJcXDoiKTsKLQkgICAgICBpZiAoKnRtcGNoID09ICdcXCcpCi0JCXsKLQkJICAvKiBlYXQgdGhlIGVzY2FwZWQgY2hhcmFjdGVyICovCi0JCSAgY2hhciAqY3AgPSB0bXBjaDsKLQkJICB3aGlsZSAoY3BbMV0gIT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgY3BbMF0gPSBjcFsxXTsKLQkJICAgICAgY3ArKzsKLQkJICAgIH0KLQkJICBjcFswXSA9ICdcMCc7Ci0JCSAgdG1wY2grKzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCp0bXBjaCAhPSAnOicpCi0JCWJyZWFrOwotCSAgICAgIGVsc2UKLQkJewotCQkgICp0bXBjaCA9ICdcMCc7Ci0JCSAgdG1wY2grKzsKLQkJICBucl9maWVsZHMrKzsKLQkJfQotCSAgICB9Ci0JICBzZXRfbnJfdGFibGVfZW50cnlfZmllbGRzIChlbnRyeSwgbnJfZmllbGRzKTsKLQl9Ci0JLyogbm93IHBhcnNlIHRoZW0gKi8KLQl7Ci0JICBpbnQgZmllbGRfbnI7Ci0JICBmb3IgKGZpZWxkX25yID0gMDsgZmllbGRfbnIgPCBlbnRyeS0+bnJfZmllbGRzOyBmaWVsZF9ucisrKQotCSAgICB7Ci0JICAgICAgY2hwID0gc2tpcF9zcGFjZXMgKGNocCk7Ci0JICAgICAgZW50cnktPmZpZWxkW2ZpZWxkX25yXSA9IGNocDsKLQkgICAgICBjaHAgPSBza2lwX3RvX251bGwgKGNocCk7Ci0JICAgICAgKmJhY2tfc3BhY2VzIChlbnRyeS0+ZmllbGRbZmllbGRfbnJdLCBjaHApID0gJ1wwJzsKLQkgICAgICBjaHArKzsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICBBU1NFUlQgKGVudHJ5ID09IE5VTEwgfHwgZW50cnktPmZpZWxkW2VudHJ5LT5ucl9maWVsZHNdID09IE5VTEwpOwotICByZXR1cm4gZW50cnk7Ci19Ci0KLWV4dGVybiB2b2lkCi10YWJsZV9wcmludF9jb2RlIChsZiAqZmlsZSwKLQkJICB0YWJsZV9lbnRyeSAqZW50cnkpCi17Ci0gIGludCBmaWVsZF9ucjsKLSAgaW50IG5yID0gMDsKLSAgZm9yIChmaWVsZF9uciA9IDA7Ci0gICAgICAgZmllbGRfbnIgPCBlbnRyeS0+bnJfZmllbGRzOwotICAgICAgIGZpZWxkX25yKyspCi0gICAgewotICAgICAgY2hhciAqY2hwID0gZW50cnktPmZpZWxkW2ZpZWxkX25yXTsKLSAgICAgIGludCBpbl9iaXRfZmllbGQgPSAwOwotICAgICAgaWYgKCpjaHAgPT0gJyMnKQotCWxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKLSAgICAgIHdoaWxlICgqY2hwICE9ICdcMCcpIAotCXsKLQkgIGlmIChjaHBbMF0gPT0gJ3snCi0JICAgICAgJiYgIWlzc3BhY2UoY2hwWzFdKQotCSAgICAgICYmIGNocFsxXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaW5fYml0X2ZpZWxkID0gMTsKLQkgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5fYml0X2ZpZWxkICYmIGNocFswXSA9PSAnOicpCi0JICAgIHsKLQkgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5fYml0X2ZpZWxkICYmICpjaHAgPT0gJ30nKQotCSAgICB7Ci0JICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7Ci0JICAgICAgaW5fYml0X2ZpZWxkID0gMDsKLQkgICAgfQotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAqY2hwKTsKLQkgICAgfQotCSAgY2hwKys7Ci0JfQotICAgICAgaWYgKGluX2JpdF9maWVsZCkKLQl7Ci0JICBsaW5lX3JlZiBsaW5lID0gKmVudHJ5LT5saW5lOwotCSAgbGluZS5saW5lX25yICs9IGZpZWxkX25yOwotCSAgZXJyb3IgKCZsaW5lLCAiQml0IGZpZWxkIGJyYWNlIG1pc3MgbWF0Y2hcbiIpOwotCX0KLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnXG4nKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkCi1kdW1wX2xpbmVfcmVmIChsZiAqZmlsZSwKLQkJIGNoYXIgKnByZWZpeCwKLQkJIGNvbnN0IGxpbmVfcmVmICpsaW5lLAotCQkgY2hhciAqc3VmZml4KQotewotICBsZl9wcmludGYgKGZpbGUsICIlcyhsaW5lX3JlZiopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgbGluZSk7Ci0gIGlmIChsaW5lICE9IE5VTEwpCi0gICAgewotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihsaW5lX25yICVkKSIsIGxpbmUtPmxpbmVfbnIpOwotICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZmlsZV9uYW1lICVzKSIsIGxpbmUtPmZpbGVfbmFtZSk7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi10YWJsZV9lbnRyeV90eXBlX3RvX3N0ciAodGFibGVfZW50cnlfdHlwZSB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgdGFibGVfY29kZV9lbnRyeTogcmV0dXJuICJjb2RlLWVudHJ5IjsKLSAgICBjYXNlIHRhYmxlX2NvbG9uX2VudHJ5OiByZXR1cm4gImNvbG9uLWVudHJ5IjsKLSAgICB9Ci0gIHJldHVybiAiKmludmFsaWQqIjsKLX0KLQotdm9pZAotZHVtcF90YWJsZV9lbnRyeShsZiAqZmlsZSwKLQkJIGNoYXIgKnByZWZpeCwKLQkJIGNvbnN0IHRhYmxlX2VudHJ5ICplbnRyeSwKLQkJIGNoYXIgKnN1ZmZpeCkKLXsKLSAgbGZfcHJpbnRmIChmaWxlLCAiJXModGFibGVfZW50cnkqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKLSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZpZWxkOwotICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7Ci0gICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBlbnRyeS0+bGluZSwgIikiKTsKLSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHR5cGUgJXMpIiwgdGFibGVfZW50cnlfdHlwZV90b19zdHIgKGVudHJ5LT50eXBlKSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihucl9maWVsZHMgJWQpIiwgZW50cnktPm5yX2ZpZWxkcyk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICJcbihmaWVsZHMiKTsKLSAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOwotICAgICAgZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgZW50cnktPm5yX2ZpZWxkczsgZmllbGQrKykKLQlsZl9wcmludGYgKGZpbGUsICJcblwiJXNcIiIsIGVudHJ5LT5maWVsZFtmaWVsZF0pOwotICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7Ci0gICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7Ci0gICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKLSAgICB9Ci0gIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKLX0KLQotCi0jaWZkZWYgTUFJTgotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgdGFibGUgKnQ7Ci0gIHRhYmxlX2VudHJ5ICplbnRyeTsKLSAgbGYgKmw7Ci0gIGludCBsaW5lX25yOwotCi0gIGlmIChhcmdjICE9IDIpCi0gICAgewotICAgICAgcHJpbnRmKCJVc2FnZTogdGFibGUgPGZpbGU+XG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICB0ID0gdGFibGVfb3BlbiAoYXJndlsxXSk7Ci0gIGwgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJ0bXAtdGFibGUiKTsKLQotICBsaW5lX25yID0gMDsKLSAgZG8KLSAgICB7Ci0gICAgICBjaGFyIGxpbmVbMTBdOwotICAgICAgZW50cnkgPSB0YWJsZV9yZWFkICh0KTsKLSAgICAgIGxpbmVfbnIgKys7Ci0gICAgICBzcHJpbnRmIChsaW5lLCAiKCVkICIsIGxpbmVfbnIpOwotICAgICAgZHVtcF90YWJsZV9lbnRyeSAobCwgbGluZSwgZW50cnksICIpXG4iKTsKLSAgICB9Ci0gIHdoaWxlIChlbnRyeSAhPSBOVUxMKTsKLQotICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vdGFibGUuaCBiL3NpbS9pZ2VuL3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmM4MWIuLjAwMDAwMDAKLS0tIGEvc2ltL2lnZW4vdGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0vKiBSZWFkIGEgdGFibGUsIGxpbmUgYnkgbGluZSwgZnJvbSBhIGZpbGUuCi0KLSAgIEEgdGFibGUgbGluZSBoYXMgc2V2ZXJhbCBmb3JtczoKLQotICAgRmllbGQgbGluZToKLQotICAgICAgIDx0ZXh0PiB7ICI6IiA8dGV4dD4gfQotICAgICAgIHR5cGUgPT0gdGFibGVfY29sb25fZW50cnkKLQotICAgICAgIEZpZWxkcyBwb2ludHMgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBwb2ludGVycy4KLQotICAgVGFiIGluZGVudGVkIGJsb2NrOgotCi0gICAgIDx0YWI+IDx0ZXh0PiA8bmw+IHsgPHRhYj4gPHRleHQ+IDxubD4gfQotICAgICB0eXBlID09IHRhYmxlX2NvZGVfZW50cnkKLQotICAgICBUaGUgbGVhZGluZyB0YWIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSBpcyBkaXNjYXJkZWQuCi0gICAgIGZpZWxkc1tpXSBpcyB0aGUgaSd0aCBsaW5lIHdpdGggdGhlIDxubD4gZGlzY2FyZGVkLgotICAgICAKLQotICAgQ29kZSBibG9jazoKLQotICAgICAieyIgPGlnbm9yZS10ZXh0PiA8bmw+IHsgPHRleHQ+IDxubD4gfSAifSIgPGlnbm9yZS10ZXh0PiA8bmw+Ci0gICAgIHR5cGUgPT0gdGFibGVfY29kZV9lbnRyeQotCi0gICAgIFRoZSBsZWFkaW5nL3RyYWlsaW5nIHsvfSBsaW5lcyBhcmUgZGlzY2FyZGVkLgotICAgICBMaW5lcyBjb250YWluaW5nIHR3byBsZWFkaW5nIHNwYWNlcyBoYXZlIHRob3NlIHNwYWNlcyBzdHJpcGVkLgotICAgICBmaWVsZHNbaV0gaXMgdGhlIGkndGggbGluZSB3aXRoIHRoZSA8bmw+IGRpc2NhcmRlZC4KLQotICAgSW4gYWRkaXRpb24sIHRoZSB0YWJsZSBwYXJzZXIgcmVjb25pc2VzIGFuZCBoYW5kbGVzIGludGVybmFsbHkgdGhlCi0gICBmb2xsb3dpbmcgKHdoZW4gbm90IGluIGEgY29kZSBibG9jayk6Ci0KLSAgICAgIiMiIDxsaW5lLW5yPiAnIicgPGZpbGU+ICciJwotCi0gICAgIEFzIHBlciBDUFAvQ0MsIHRyZWF0IGZvbGxvd2luZyBsaW5lcyBhcyBpZiB0aGV5IHdlcmUgdGFrZW4gZnJvbQotICAgICA8ZmlsZT4gc3RhcnRpbmcgYXQgPGxpbmUtbnI+Ci0KLSAgIE5vIHN1cHBvcnQgZm9yIENQUCdzICIjaWYvI2Vsc2UvI2VuZGlmIiBzdHlsZSBjb25kaXRpb25zIGFyZQotICAgcGxhbm5lZC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3RhYmxlIHRhYmxlOwotCi10eXBlZGVmIGVudW0gewotICB0YWJsZV9jb2xvbl9lbnRyeSwKLSAgdGFibGVfY29kZV9lbnRyeSwKLX0gdGFibGVfZW50cnlfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBfdGFibGVfZW50cnkgdGFibGVfZW50cnk7Ci1zdHJ1Y3QgX3RhYmxlX2VudHJ5IHsKLSAgdGFibGUgKmZpbGU7Ci0gIGxpbmVfcmVmICpsaW5lOwotICB0YWJsZV9lbnRyeV90eXBlIHR5cGU7Ci0gIGludCBucl9maWVsZHM7Ci0gIGNoYXIgKipmaWVsZDsKLX07Ci0KLS8qIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHdoZW4gb3BlbmluZyBhIHB1c2hlZCBmaWxlLiAgQ3VycmVudAotICAgZGlyZWN0b3J5IGlzIGFsd2F5cyBzZWFyY2hlZCBmaXJzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgX3RhYmxlX2luY2x1ZGUgdGFibGVfaW5jbHVkZTsKLXN0cnVjdCBfdGFibGVfaW5jbHVkZSB7Ci0gIGNoYXIgKmRpcjsKLSAgdGFibGVfaW5jbHVkZSAqbmV4dDsKLX07Ci0KLQotLyogT3Blbi9yZWFkIGEgdGFibGUgZmlsZS4gIFNpbmNlIHRoZSBmaWxlIGlzIHJlYWQgb25jZSBkdXJpbmcgb3BlbgotICAgKGFuZCB0aGVuIGNsb3NlZCBpbW1lZGlhdGx5KSB0aGVyZSBpcyBubyBjbG9zZSBtZXRob2QuICovCi0KLWV4dGVybiB0YWJsZSAqdGFibGVfb3BlbgotKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7Ci0KLWV4dGVybiB0YWJsZV9lbnRyeSAqdGFibGVfcmVhZAotKHRhYmxlICpmaWxlKTsKLQotCi0vKiBQdXNoIHRoZSB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgZmlsZSBhbmQgb3BlbiBGSUxFX05BTUUuICBXaGVuCi0gICB0aGUgZW5kIG9mIEZJTEVfTkFNRSBpcyByZWFjaGVkLCByZXR1cm4gdG8gdGhlIHB1c2hlZCBmaWxlICovCi0KLWV4dGVybiB2b2lkIHRhYmxlX3B1c2gKLSh0YWJsZSAqZmlsZSwKLSBsaW5lX3JlZiAqbGluZSwKLSB0YWJsZV9pbmNsdWRlICpzZWFyY2gsCi0gY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKLQotCi0vKiBFeHBhbmQgdGhlIHNwZWNpZmllZCBmaWVsZF9uciB1c2luZyB0aGUgaW50ZXJuYWwgZXhwYW5zaW9uIHRhYmxlLgotICAgQSBmaWVsZCBpcyBvbmx5IGV4cGFuZGVkIHdoZW4gZXhwbGljaXRseSBzcGVjaWZpZWQuICAqLwotCi1leHRlcm4gdm9pZCB0YWJsZV9leHBhbmRfZmllbGQKLSh0YWJsZV9lbnRyeSAqZW50cnksCi0gaW50IGZpZWxkX25yKTsKLQotCi0vKiBHaXZlbiBhIGNvZGUgZW50cnksIHdyaXRlIHRoZSBjb2RlIHRvIEZJTEUuICBTaW5jZSBhbnkKLSAgIGxlYWRpbmcvdHJhaWxpbmcgYnJhY2VzIHdlcmUgc3RyaXBlZCBhcyBwYXJ0IG9mIHRoZSByZWFkLCB0aGV5IGFyZQotICAgbm90IHdyaXR0ZW4uICovCi0KLWV4dGVybiB2b2lkIHRhYmxlX3ByaW50X2NvZGUKLShsZiAqZmlsZSwKLSB0YWJsZV9lbnRyeSAqZW50cnkpOwotCi0KLS8qIERlYnVnZ2luZyAqLwotCi1leHRlcm4gdm9pZCBkdW1wX2xpbmVfcmVmCi0obGYgKmZpbGUsCi0gY2hhciAqcHJlZml4LAotIGNvbnN0IGxpbmVfcmVmICpsaW5lLAotIGNoYXIgKnN1ZmZpeCk7Ci0KLWV4dGVybiB2b2lkIGR1bXBfdGFibGVfZW50cnkKLShsZiAqZmlsZSwKLSBjaGFyICpwcmVmaXgsCi0gY29uc3QgdGFibGVfZW50cnkgKmVudHJ5LAotIGNoYXIgKnN1ZmZpeCk7Ci0KLQotCi0vKiBVdGlsaXRpZXMgZm9yIHNraXBwaW5nIGFyb3VuZCB0ZXh0ICovCi0KLWV4dGVybiBjaGFyICpza2lwX2RpZ2l0cwotKGNoYXIgKmNocCk7Ci0KLWV4dGVybiBjaGFyICpza2lwX3NwYWNlcwotKGNoYXIgKmNocCk7Ci0KLWV4dGVybiBjaGFyICpza2lwX3RvX3NlcGFyYXRvcgotKGNoYXIgKmNocCwKLSBjaGFyICpzZXBhcmF0b3JzKTsKLQotZXh0ZXJuIGNoYXIgKmJhY2tfc3BhY2VzCi0oY2hhciAqc3RhcnQsCi0gY2hhciAqY2hwKTsKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL0NoYW5nZUxvZyBiL3NpbS9tMzJyL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMWRiOC4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA2ICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTIwMDAtMDMtMzAgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0xMC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBhcmNoLmMsYXJjaC5oLGNwdWFsbC5oOiBSZWJ1aWxkLgotCSogY3B1eC5oLGRlY29kZXguYyxkZWNvZGV4LmgsbW9kZWx4LmMsc2VteC1zd2l0Y2guYzogUmVidWlsZC4KLQotMTk5OS0wOS0yOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtbG9vcC5pbjogVXBkYXRlIGNhbGwgdG8gc2ltX2VuZ2luZV9pbnZhbGlkX2luc24uCi0JKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlYnVpbGQuCi0JKiB0cmFwcy5jIChzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IE5ldyBhcmcgYHZwYycuICBDaGFuZ2UgdHlwZSBvZgotCXJlc3VsdCB0byBTRU1fUEMuICBSZXR1cm4gdnBjLgotCSogbWxvb3B4LmluOiBEaXR0by4KLQkqIHNlbXgtc3dpdGNoLmM6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjkgMTQ6NDc6MjAgMTk5OSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiB0cmFwcy5jIChzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IFJldHVybiBQQy4KLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMTk5OS0wOS0wMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBkZWNvZGV4LmM6IFJlYnVpbGQuCi0KLTE5OTktMDgtMjggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogc2VtLmM6IFJlYnVpbGQKLQotCSogY3B1eC5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCSogY3B1eC5oLGRlY29kZXguYyxkZWNvZGV4LmgsbW9kZWx4LmMsc2VteC1zd2l0Y2guYzogUmVidWlsZC4KLQotMTk5OS0wOC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLXNpbS5oIChTRU1fU0tJUF9JTlNOKTogRGVsZXRlLgotCSogY3B1LmgsY3B1YWxsLmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0JKiBjcHV4LmgsZGVjb2RleC5jLG1vZGVseC5jLHNlbXgtc3dpdGNoLmM6IFJlYnVpbGQuCi0JKiBtbG9vcHguaW4gKGVtaXRfcGFyYWxsZWwpOiBDYWxsIFNFTV9TS0lQX0NPTVBJTEUuCi0JKGVtaXRfZnVsbF9wYXJhbGxlbCk6IERpdHRvLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLUZyaSBBcHIgMTYgMTY6NDc6NDMgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRldmljZXMuYyAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKTogTmV3IGFyZyBgc2QnLgotCShkZXZpY2VfZXJyb3IpOiBHaXZlIHByb3BlciBhcmcgc3BlYy4KLQotMTk5OS0wNC0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0JKiBjcHV4Lmgsc2VteC1zd2l0Y2guYzogUmVidWlsZC4KLQotMTk5OS0wMy0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBkZWNvZGUuYzogUmVidWlsZC4KLQkqIGRlY29kZXguYzogUmVidWlsZC4KLQotMTk5OS0wMy0yNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLXNpbS5oIChNMzJSX0RFVklDRV9MRU4pOiBGaXggb2ZmIGJ5IG9uZSBlcnJvci4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBhcmNoLmMsYXJjaC5oLG1vZGVsLmM6IFJlYnVpbGQuCi0JKiBtb2RlbHguYzogUmVidWlsZC4KLQkqIG0zMnItc2ltLmggKGFfbTMycl9oX2dyX2dldCxhX20zMnJfaF9ncl9zZXQpOiBEZWNsYXJlLgotCShhX20zMnJfaF9jcl9nZXQsYV9tMzJyX2hfY3Jfc2V0KTogRGVjbGFyZS4KLQkqIG0zMnIuYyAobTMycmJmX2ZldGNoX3JlZ2lzdGVyKTogUmVwbGFjZSBjYWxscyB0byBhX20zMnJfaF9wY19nZXQsCi0JYV9tMzJyX2hfYWNjdW1fZ2V0IHdpdGggYXBwcm9wcmlhdGUgY2FsbHMgdG8gbTMycmJmXyouCi0JKG0zMnJiZl9zdG9yZV9yZWdpc3Rlcik6IERpdHRvLgotCShhX20zMnJfaF9ncl9nZXQsYV9tMzJyX2hfZ3Jfc2V0KTogTmV3IGZ1bmN0aW9ucy4KLQkoYV9tMzJyX2hfY3JfZ2V0LGFfbTMycl9oX2NyX3NldCk6IERpdHRvLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2NwdV9vcGVuLgotCSogdHJhcHMuYyAobTMycl9jb3JlX3NpZ25hbCk6IFJlcGxhY2UgY2FsbHMgdG8gYV9tMzJyX2hfKiwKLQl3aXRoIGFwcHJvcHJpYXRlIGNhbGxzIHRvIG0zMnJiZl8qLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGFyY2guYyxhcmNoLmgsY3B1LmMsY3B1Lmgsc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogY3B1eC5jLGNwdXguaCxzZW14LXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogbTMyci1zaW0uaCAoR0VUX0hfKixTRVRfSF8qLCBleGNlcHQgR0VUX0hfU00pOiBEZWxldGUuCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fY3B1X29wZW4uCi0KLTE5OTktMDItMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY3B1LmMsY3B1Lmg6IFJlYnVpbGQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9ERVBTKTogQWRkIG0zMnItZGVzYy5oLCBkZWxldGUgY3B1LW9wYy5oLgotCShzdGFtcC14bWxvb3ApOiBzLy1wYXJhbGxlbC8tcGFyYWxsZWwtd3JpdGUvLgotCSogY29uZmlndXJlLmluIChzaW1fbGlua19maWxlcyxzaW1fbGlua19saW5rcyk6IERlbGV0ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGRlY29kZS5jLGRlY29kZS5oLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgotCSogZGVjb2RleC5jLGRlY29kZXguaCxtb2RlbHguYyxzZW14LXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogbWxvb3AuaW4gKGV4ZWN1dGUpOiBDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvIENHRU5fSU5TTl9BVFRSX1ZBTFVFLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogbTMycl9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQgZnJvbQotCW0zMnJfY2dlbl9vcGNvZGVfb3Blbi4gIFNldCBkaXNhc3NlbWJsZXIuCi0JKHNpbV9jbG9zZSk6IG0zMnJfY2dlbl9jcHVfb3BlbiByZW5hbWVkIGZyb20gbTMycl9jZ2VuX29wY29kZV9vcGVuLgotCSogc2ltLW1haW4uaDogRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsY3B1LXNpbS5oLiBJbmNsdWRlCi0JbTMyci1kZXNjLmgsbTMyci1vcGMuaCxtMzJyLXNpbS5oLgotCi1UaHUgRmViICA0IDE2OjA0OjI2IDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwdXguaCxkZWNvZGV4LmMsbW9kZWx4LmMsc2VteC1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KLQkqIGNwdXguaCxkZWNvZGV4LmMsbW9kZWx4LmMsc2VteC1zd2l0Y2guYzogUmVidWlsZC4KLQotMTk5OS0wMS0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBkZWNvZGUuaCxtb2RlbC5jOiBSZWdlbmVyYXRlLgotCSogZGVjb2RleC5oLG1vZGVseC5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGFyY2guYyxhcmNoLmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCi0JKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIHRyYXBzLmMgKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUENBRERSLT5JQUREUi4KLQkqIGNwdXguYyxjcHV4LmgsZGVjb2RleC5jLGRlY29kZXguaCxtb2RlbHguYyxzZW14LXN3aXRjaC5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtMzJyLWNsZWFuKTogcm0gZW5nLmguCi0JKiBzaW0tbWFpbi5oOiBEZWxldGUgaW5jbHVzaW9uIG9mIGFuc2lkZWNsLmguCi0JKiBjcHUuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdXguaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdXguaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFJTl9JTkNMVURFX0RFUFMpOiBEZWxldGUuCi0JKElOQ0xVREVfREVQUyxPUFNfSU5DTFVERV9ERVBTKTogRGVsZXRlLgotCShzaW0taWYubyk6IFVzZSBTSU1fTUFJTl9ERVBTLgotCShhcmNoLm8sdHJhcHMubyxkZXZpY2VzLm8pOiBEaXR0by4KLQkoTTMyUkJGX0lOQ0xVREVfREVQUyk6IFVzZSBDR0VOX01BSU5fQ1BVX0RFUFMuCi0JKG0zMnIubyxtbG9vcC5vLGNwdS5vLGRlY29kZS5vLHNlbS5vLG1vZGVsLm8pOiBTaW1wbGlmeSBkZXBlbmRlbmNpZXMuCi0JKG0zMnJ4Lm8sbWxvb3B4Lm8sY3B1eC5vLGRlY29kZXgubyxzZW14Lm8sbW9kZWx4Lm8pOiBEaXR0by4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1zaW0uaCAobTMycmJmX2hfY3JfW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgotCShbR1NdRVRfSF9DUik6IERlZmluZS4KLQkobTMycmJmX2hfcHN3X1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KLQkoW0dTXUVUX0hfUFNXKTogRGVmaW5lLgotCShtMzJyYmZfaF9hY2N1bV9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCi0JKFtHU11FVF9IX0FDQ1VNKTogRGVmaW5lLgotCShtMzJyeGZfaF97Y3IscHN3LGFjY3VtfV9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCi0JKG0zMnJ4Zl9oX2FjY3Vtc19bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCi0JKFtHU11FVF9IX0FDQ1VNUyk6IERlZmluZS4KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IE1vZGVsIHByb2JpbmcgY29kZSBtb3ZlZCB0byBzaW0tbW9kZWwuYy4KLQkqIG0zMnIuYyAoV0FOVF9DUFUpOiBEZWZpbmUgYXMgbTMycmJmLgotCShhbGwgcmVnaXN0ZXIgYWNjZXNzIGZucyk6IFJlbmFtZSB0byAuLi5faGFuZGxlci4KLQkqIGNwdXguYyxjcHV4LmgsZGVjb2RleC5jLG1vZGVseC5jLHNlbXguYzogUmVnZW5lcmF0ZS4KLQkqIG0zMnJ4LmMgKFdBTlRfQ1BVKTogRGVmaW5lIGFzIG0zMnJ4Zi4KLQkoYWxsIHJlZ2lzdGVyIGFjY2VzcyBmbnMpOiBSZW5hbWUgdG8gLi4uX2hhbmRsZXIuCi0KLTE5OTgtMTItMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAtLWVuYWJsZS1jZ2VuLW1haW50IHN1cHBvcnQgbW92ZWQgdG8gY29tbW9uL2FjbG9jYWwubTQuCi0JKFNJTV9BQ19PUFRJT05fQUxJR05NRU5UKTogTWFrZSBzdHJpY3QuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIHNlbS1zd2l0Y2guYyxzZW0uYyxzZW14LXN3aXRjaC5jOiBSZWdlbmVyYXRlLgotCSogc2ltLW1haW4uaCAoU0lNX0VOR0lORV9IQUxUX0hPT0ssU0lNX0VOR0lORV9SRVNUQVJUX0hPT0spOiBEZWZpbmUuCi0JKiB0cmFwcy5jIChtMzJyX2NvcmVfc2lnbmFsKTogSGFuZGxlIC0tZW52aXJvbm1lbnQ9b3BlcmF0aW5nLgotCi0xOTk4LTEyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIGNwdXguaCxkZWNvZGV4LmMsc2VteC1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KLQotCSogc2ltLWlmLmM6IEluY2x1ZGUgc3RyaW5nLmggb3Igc3RyaW5ncy5oIGlmIHByZXNlbnQuCi0KLTE5OTgtMTItMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIFNJTV9BQ19PUFRJT05fSU5MSU5FLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogc2ltLW1haW4uaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KLQlEb24ndCBpbmNsdWRlIGNnZW4tc2NhY2hlLmgsY2dlbi1jcHUuaCxjZ2VuLXRyYWNlLmgsY3B1YWxsLmguCi0JRG9uZSBieSBjZ2VuLXNpbS5oIG5vdy4KLQkqIHRjb25maWcuaW4gKFNJTV9IQVZFX01PREVMKTogRGVsZXRlLCBtb3ZlZCB0byBjZ2VuLXR5cGVzLmguCi0JKiBjcHVhbGwuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIG1sb29wLmluIChleHRyYWN0MTYpOiBNYWtlIHN0YXRpYyBpbmxpbmUgYWdhaW4uCi0JU2ltcGxpZnkgd2l0aCBjYWxsIHRvIEBjcHVAX2ZpbGxfYXJnYnVmLEBjcHVAX2ZpbGxfYXJnYnVmX3RwLgotCShleHRyYWN0MzIpOiBEaXR0by4KLQlTaW1wbGlmeSB3aXRoIGNhbGwgdG8gQGNwdUBfZmlsbF9hcmdidWYsQGNwdUBfZmlsbF9hcmdidWZfdHAuCi0JKGV4ZWN1dGUpOiBUZXN0IEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlIHByb2ZpbGluZy4KLQlVcGRhdGUgY2FsbHMgdG8gVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSS4KLQkqIGNwdXguaCxkZWNvZGV4LmMsbW9kZWx4LmMsc2VteC1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KLQkqIG1sb29weC5pbjogUmV3cml0ZS4KLQotMTk5OC0xMS0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBkZXZpY2VzLmMgKGRldmljZV9pb193cml0ZV9idWZmZXIpOiBGaXggdHlwby4KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IEhhY2sgaW4gY2FsbCB0byBkdl9zb2Nrc2VyX2luc3RhbGwuCi0JKiB0Y29uZmlnLmluIChIQVZFX0RWX1NPQ0tTRVIpOiBBZGQgYnV0IGNvbW1lbnQgb3V0LgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNMzJSX09CSlMpOiBEZWxldGUgZXh0cmFjdC5vLgotCShleHRyYWN0Lm8pOiBEZWxldGUuCi0JKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCi0JKiBtbG9vcC5pbiAoZXh0cmFjdDE2KTogVXBkYXRlIHR5cGUgb2YgYGluc24nIGFyZy4KLQlEZWxldGUgY2FsbCB0byBkLT5leHRyYWN0LgotCShleHRyYWN0MzIpOiBEaXR0by4KLQkqIGNwdXguYyxjcHV4LmgsZGVjb2RleC5jLGRlY29kZXguaCxzZW14LXN3aXRjaC5jOiBSZWJ1aWxkLgotCSogbWxvb3B4LmluIChleHRyYWN0eDE2KTogVXBkYXRlIHR5cGUgb2YgYGluc24nIGFyZy4KLQlEZWxldGUgY2FsbCB0byBkLT5leHRyYWN0LiAgRGVsZXRlIGFyZyBwYmJfcC4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKGV4dHJhY3Qtc2ltcGxlLGZ1bGwtZXhlYy1zaW1wbGUsZmFzdC1leGVjLXNpbXBsZSk6IERlbGV0ZS4KLQkoZXh0cmFjdHgzMik6IERpdHRvLgotCi1XZWQgTm92ICA0IDIzOjU1OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oOiBEZWxldGUgaW5jbHVzaW9uIG9mIGNvbmZpZy5oLCBpbmNsdWRlIHNpbS1iYXNpY3MuaAotCWJlZm9yZSBjZ2VuLXR5cGVzLmguCi0JKiB0Y29uZmlnLmluOiBHdWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KLQkqIGNwdS5oOiBEZWxldGUgZGVjbHMgbW92ZWQgdG8gZ2VubWxvb3Auc2guCi0JKiBjcHV4Lmg6IERpdHRvLgotCi1Nb24gT2N0IDE5IDE0OjEzOjA1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oOiAjaW5jbHVkZSBjcHUtb3BjLmguCi0JKiBhcmNoLmMsYXJjaC5oLGRlY29kZS5jLGV4dHJhY3QuYyxtb2RlbC5jLHNlbS5jOiBSZWdlbmVyYXRlCi0JdG8gZ2V0ICNpbmNsdWRlIGNsZWFudXAuCi0JKiBkZWNvZGV4LmMsZXh0cmFjdHguYyxtb2RlbHguYzogRGl0dG8uCi0KLQkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfREVQUyk6IFJlcGxhY2UgY2dlbiBoZWFkZXJzIHdpdGgKLQlDR0VOX0lOQ0xVREVfREVQUy4KLQkoTTMyUkJGX0lOQ0xVREVfREVQUyk6IERlZmluZS4KLQkobTMyciAubydzKTogRGVwZW5kIG9uIGl0LgotCShtbG9vcC5jKTogVXBkYXRlIGNhbGwgdG8gZ2VubWxvb3Auc2guCi0JKiBjcHUuaCxjcHVhbGwuaDogUmVnZW5lcmF0ZS4KLQkqIHNpbS1tYWluLmg6IERlbGV0ZSBpbmNsdXNpb24gb2YgY3B1LmgsZGVjb2RlLmgsIG1vdmVkIHRvIGNwdWFsbC5oLgotCSNpbmNsdWRlIGNnZW4tc2NhY2hlLmgsY2dlbi1jcHUuaC4KLQkqIHRjb25maWcuaW4gKFdJVEhfRk9PIHNlbWFudGljIG1hY3Jvcyk6IERlbGV0ZS4KLQkqIE1ha2VmaWxlLmluIChNMzJSWEZfSU5DTFVERV9ERVBTKTogRGVmaW5lLgotCShtMzJyeCAubydzKTogRGVwZW5kIG9uIGl0LgotCShtbG9vcHguYyk6IFVwZGF0ZSBjYWxsIHRvIGdlbm1sb29wLnNoLgotCSogY3B1eC5oOiBSZWdlbmVyYXRlLgotCi1GcmkgT2N0IDE2IDA5OjE1OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzaW0taWYuYyAoc2ltX2RvX2NvbW1hbmQpOiBIYW5kbGUgInNpbSBpbmZvIHJlZyB7YmJwc3csYmJwY30iLgotCi1GcmkgT2N0ICA5IDE2OjExOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JQWRkIHBzZXVkby1iYXNpYy1ibG9jayBleGVjdXRpb24gc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tcmVnLm8sIGNnZW4tcnVuLm8sIHNpbS1zdG9wLm8uCi0JKFNJTV9FWFRSQV9ERVBTKTogQWRkIGluY2x1ZGUvb3Bjb2RlL2NnZW4uaC4KLQkoSU5DTFVERV9ERVBTKTogRGVsZXRlIGNwdS1zaW0uaCwgaW5jbHVkZS9vcGNvZGUvY2dlbi5oLgotCShtbG9vcC5jKTogQnVpbGQgcHNldWRvLWJhc2ljLWJsb2NrIHZlcnNpb24uICBEZXBlbmQgb24gc3RhbXAtY3B1LgotCSogYXJjaC5jLGFyY2guaCxjcHVhbGwuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLGV4dHJhY3QuYyxtb2RlbC5jOiBSZWdlbmVyYXRlLgotCSogc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1zaW0uaCAoTTMyUl9NSVNDX1BST0ZJTEUpOiBOZXcgbWVtYmVycyBsb2FkX3JlZ3MsCi0JbG9hZF9yZWdzX3BlbmRpbmcuCi0JKiBtMzJyLmMgKG0zMnJiZl9mZXRjaF9yZWdpc3Rlcik6IFJlbmFtZWQgZnJvbSBtMzJyYl9mZXRjaF9yZWdpc3Rlci4KLQkobTMycmJmX3N0b3JlX3JlZ2lzdGVyLG0zMnJiZl9oX2NyX2dldCxtMzJyYmZfaF9jcl9zZXQsCi0JbTMycmJmX2hfcHN3X2dldCxtMzJyYmZfaF9wc3dfc2V0LG0zMnJiZl9oX2FjY3VtX2dldCwKLQltMzJyYmZfaF9hY2N1bV9zZXQpOiBMaWtld2lzZS4KLQkobTMycl9tb2RlbF97aW5pdCx1cGRhdGV9X2luc25fY3ljbGVzKTogRGVsZXRlLgotCShtMzJyYmZfbW9kZWxfaW5zbl97YmVmb3JlLGFmdGVyfSk6IE5ldyBmbnMuCi0JKG0zMnJfbW9kZWxfcmVjb3JkX2N0aSxtMzJyX21vZGVsX3JlY29yZF9jeWNsZXMpOiBEZWxldGUuCi0JKG0zMnJiX21vZGVsX21hcmtfZ2V0X2hfZ3IsbTMycmJfbW9kZWxfbWFya19zZXRfaF9ncik6IERlbGV0ZS4KLQkobTMycmJfbW9kZWxfbWFya19idXN5X3JlZyxtMzJyYl9tb2RlbF9tYXJrX3VuYnVzeV9yZWcpOiBEZWxldGUuCi0JKGNoZWNrX2xvYWRfc3RhbGwpOiBOZXcgZm4uCi0JKG0zMnJiZl9tb2RlbF9tMzJyX2RfdV97ZXhlYyxjbXAsbWFjLGN0aSxsb2FkLHN0b3JlfSk6IE5ldyBmbnMuCi0JKG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyk6IE5ldyBmbi4KLQkqIG1sb29wLmluOiBSZXdyaXRlLCB1c2UgcGJiIHN1cHBvcnQuCi0JKiBzaW0taWYuYyAoc2ltX3N0b3Asc2ltX3N5bmNfc3RvcCxzaW1fcmVzdW1lKTogRGVsZXRlLgotCShzaW1fZmV0Y2hfcmVnaXN0ZXIsc2ltX3N0b3JlX3JlZ2lzdGVyKTogRGVsZXRlLgotCSogc2ltLW1haW4uaCAoQ0lBX0dFVCxDSUFfU0VUKTogRml4LgotCShTSU1fRU5HSU5FX0hBTFRfSE9PSyxTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSyk6IERlbGV0ZS4KLQkqIHRjb25maWcuaW4gKFdJVEhfU0NBQ0hFX1BCQik6IERlZmluZS4KLQkoV0lUSF9TQ0FDSEVfUEJCX00zMlJCRik6IERlZmluZS4KLQkqIHRyYXBzLmMgKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUmVuYW1lZCBmcm9tIC4uLl9pbGxlZ2FsXy4uLi4KLQkobTMycl90cmFwKTogUGFzcyBwYyB0byBzaW1fZW5naW5lX2hhbHQuCi0JKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fU0NBQ0hFKTogQ2hhbmdlIDEwMjQgdG8gMTYzODQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5pbiAoTTMyUlhfT0JKUyk6IERlbGV0ZSBzZW14Lm8sIGFkZCBleHRyYWN0Lm8uCi0JKG1sb29weC5jKTogQnVpbGQgcHNldWRvLWJhc2ljLWJsb2NrIHZlcnNpb24uCi0JKHNlbXgubyk6IERlbGV0ZS4KLQkoZXh0cmFjdHgubyk6IEFkZC4KLQkqIGNwdXguYyxjcHV4LmgsZGVjb2RleC5jLGRlY29kZXguaCxtb2RlbHguYzogUmVnZW5lcmF0ZS4KLQkqIHJlYWR4LmM6IERlbGV0ZS4KLQkqIHNlbXguYzogRGVsZXRlLgotCSogZXh0cmFjdHguYzogTmV3IGZpbGUuCi0JKiBzZW14LXN3aXRjaC5jOiBOZXcgZmlsZS4KLQkqIG0zMnItc2ltLmggKEJSQU5DSF9ORVdfUEMpOiBEZWxldGUuCi0JKFNFTV9TS0lQX0lOU04pOiBOZXcgbWFjcm8uCi0JKiBtMzJyeC5jIChtMzJyeGZfZmV0Y2hfcmVnaXN0ZXIpOiBSZW5hbWVkIGZyb20gbTMycnhfZmV0Y2hfcmVnaXN0ZXIuCi0JKG0zMnJ4Zl9zdG9yZV9yZWdpc3RlcixtMzJyeGZfaF9jcl9nZXQsbTMycnhmX2hfY3Jfc2V0LAotCW0zMnJ4Zl9oX3Bzd19nZXQsbTMycnhmX2hfcHN3X3NldCxtMzJyeGZfaF9hY2N1bV9nZXQsCi0JbTMycnhmX2hfYWNjdW1fc2V0LG0zMnJ4Zl9oX2FjY3Vtc19nZXQsbTMycnhmX2hfYWNjdW1zX3NldCk6IExpa2V3aXNlLgotCShtMzJyeGZfbW9kZWxfaW5zbl97YmVmb3JlLGFmdGVyfSk6IE5ldyBmbnMuCi0JKG0zMnJ4X21vZGVsX21hcmtfZ2V0X2hfZ3IsbTMycnhfbW9kZWxfbWFya19zZXRfaF9ncik6IERlbGV0ZS4KLQkobTMycnhfbW9kZWxfbWFya19idXN5X3JlZyxtMzJyeF9tb2RlbF9tYXJrX3VuYnVzeV9yZWcpOiBEZWxldGUuCi0JKGNoZWNrX2xvYWRfc3RhbGwpOiBOZXcgZm4uCi0JKG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3tleGVjLGNtcCxtYWMsY3RpLGxvYWQsc3RvcmV9KTogTmV3IGZucy4KLQkqIG1sb29weC5pbjogUmV3cml0ZSwgdXNlIHBiYiBzdXBwb3J0LgotCSogdGNvbmZpZy5pbiAoV0lUSF9TQ0FDSEVfUEJCX00zMlJYRik6IERlZmluZS4KLQkoV0lUSF9TRU1fU1dJVENIX0ZVTEwpOiBDaGFuZ2UgZnJvbSAwIHRvIDEuCi0KLVdlZCBTZXAgMTYgMTg6MjI6MjcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1zaW0uaCAoe1BTVyxDQlIsU1BJLFNQVSxCUEMsQkJQU1csQkJQQ31fUkVHTlVNKTogTmV3IG1hY3Jvcy4KLQkoe0FDQzFMLEFDQzFIfV9SRUdOVU0pOiBOZXcgbWFjcm9zLgotCShtMzJyX2RlY29kZV9nZGJfY3RybF9yZWdudW0pOiBBZGQgcHJvdG90eXBlLgotCSogbTMyci5jIChtMzJyX2RlY29kZV9nZGJfY3RybF9yZWdudW0pOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZmV0Y2hfcmVnaXN0ZXIsbTMycl9zdG9yZV9yZWdpc3Rlcik6IFJld3JpdGUuCi0JKiBtMzJyeC5jIChtMzJyeF9mZXRjaF9yZWdpc3RlcixtMzJyeF9zdG9yZV9yZWdpc3Rlcik6IFJld3JpdGUuCi0KLVR1ZSBTZXAgMTUgMTU6MDE6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1zaW0uaCAoR0VUX0hfU00pOiBOZXcgbWFjcm8uCi0JKFVBUlQgcGFyYW1zKTogVXBkYXRlIHRvIG1zYTIwMDAuCi0JKiBkZXZpY2VzLmMgKGRldmljZV9pb19yZWFkX2J1ZmZlcik6IFVwZGF0ZSB0byBtc2EyMDAwLgotCSogbTMyci5jIChtMzJyYl9oX2NyX2dldCxtMzJyYl9oX2NyX3NldCk6IEhhbmRsZSBiYnBjLGJicHN3LgotCShtMzJyYl9oX3Bzd19nZXQsbTMycmJfaF9wc3dfc2V0KTogTmV3IGZ1bmN0aW9ucy4KLQkqIGFyY2guYyxhcmNoLmgsY3B1LmMsY3B1Lmgsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogbTMycnguYyAobTMycnhfaF9jcl9nZXQsbTMycnhfaF9jcl9zZXQpOiBIYW5kbGUgYmJwYyxiYnBzdy4KLQkobTMycnhfaF9wc3dfZ2V0LG0zMnJ4X2hfcHN3X3NldCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjcHV4LmMsY3B1eC5oLHJlYWR4LmMsc2VteC5jOiBSZWdlbmVyYXRlLgotCi1XZWQgU2VwICA5IDE1OjI5OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItc2ltLmggKG0zMnJfdHJhcCk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiB0cmFwcy5jIChtMzJyX3RyYXApOiBOZXcgYXJnIGBwYycuCi0JKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgotCSogY3B1eC5oLHJlYWR4LmMsc2VteC5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIEF1ZyAgMyAxMjo1OToxNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCVJlbmFtZSBjcHUgbTMyciB0byBtMzJyYiB0byBkaXN0aW5ndWlzaCBmcm9tIGFyY2hpdGVjdHVyZSBuYW1lLgotCSogTWFrZWZpbGUuaW4gKG1sb29wLmMpOiBjcHUgbTMyciByZW5hbWVkIHRvIG0zMnJiLgotCSogc2ltLW1haW4uaCAoV0FOVF9DUFVfTTMyUkIpOiBSZW5hbWVkIGZyb20gV0FOVF9DUFVfTTMyUi4KLQkqIHRjb25maWcuaW4gKFdBTlRfQ1BVX00zMlJCKTogRGl0dG8uCi0JKiBtMzJyLmMgKFdBTlRfQ1BVX00zMlJCKTogRGl0dG8uCi0JKCopOiBtMzJyXyBjcHUgZm5zIHJlbmFtZWQgdG8gbTMycmJfLgotCSogc2ltLWlmLmMgKHNpbV9zdG9wLHNpbV9zeW5jX3N0b3Asc2ltX3Jlc3VtZSk6IFVwZGF0ZS4KLQkqIGFyY2guaCxhcmNoLmM6IFJlZ2VuZXJhdGUuCi0JKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxleHRyYWN0LmMsbW9kZWwuYzogUmVnZW5lcmF0ZS4KLQkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogRG9uJ3QgYWxsb2NhdGUgbWVtb3J5IG9uIHRvcCBvZiBhbnkgdXNlcgotCXNwZWNpZmllZCBtZW1vcnkuCi0JKGhfZ3JfZ2V0LGhfZ3Jfc2V0KTogRGVsZXRlLgotCSogc2ltLW1haW4uaCAoaF9ncl9nZXQsaF9ncl9zZXQpOiBEZWxldGUuCi0JKiB0cmFwcy5jIChtMzJyX3RyYXApOiBSZXBsYWNlIGNhbGxzIHRvIGhfZ3JfW2dzXWV0IHdpdGgKLQlhX20zMnJfaF9ncl9bZ3NdZXQuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFX0RFUFMpOiBBZGQgaW5jbHVkZS9vcGNvZGUvY2dlbi5oLgotCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBPcGVuIG9wY29kZSB0YWJsZS4KLQkoc2ltX2Nsb3NlKTogQ2xvc2UgaXQuCi0KLVR1ZSBKdWwgMjggMTM6MDY6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBuZXcgdmVyc2lvbnMgb2YgbXVsd2hpLG11bHdsbyxtYWN3aGksbWFjd2xvIHRoYXQKLQlhY2NlcHQgYW4gYWNjdW11bGF0b3IgY2hvaWNlLgotCSogY3B1eC5jLGRlY29kZXguYyxkZWNvZGV4LmgsbW9kZWx4LmMscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTM6MDA6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci5jOiBJbmNsdWRlIGNnZW4tbWVtLmguCi0JKiB0cmFwcy5jIChtMzJyX3RyYXApOiBUd2VhayBmb3IgLVdhbGwuCi0JKiBtMzJyeC5jOiBJbmNsdWRlIGNnZW4tbWVtLmguCi0JKiBzZW14LmM6IFJlZ2VuZXJhdGUsIGdldCAtV2FsbCBjbGVhbnVwcy4KLQotVHVlIEp1bCAyMSAxNjo1MzoxMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY3B1LmgsZXh0cmFjdC5jOiBSZWdlbmVyYXRlLiAgcGMtcmVsIGNhbGNzIGRvbmUgb24gZl9kaXNwTk4gbm93LgotCSogY3B1eC5oLHJlYWR4LmMsc2VteC5jOiBEaXR0by4KLQotV2VkIEp1bCAgMSAxNjo1MToxNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGNnZW5fbWFpbnQgLT4gQ0dFTl9NQUlOVC4KLQkqIGNvbmZpZ3VyZS5pbjogQUNfU1VCU1QgY2dlbixjZ2VuZGlyLiAgTm8gbG9uZ2VyIGxvb2sgZm9yIGd1aWxlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogYXJjaC5jLGFyY2guaCxjcHVhbGwuaDogUmVnZW5lcmF0ZS4KLQkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLGV4dHJhY3QuYyxtb2RlbC5jOiBSZWdlbmVyYXRlLgotCSogc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogY3B1eC5jLGNwdXguaCxkZWNvZGV4LmMsZGVjb2RleC5oLG1vZGVseC5jLHJlYWR4LmM6IFJlZ2VuZXJhdGUuCi0JKiBzZW14LmM6IFJlZ2VuZXJhdGUuCi0JKiBtbG9vcHguaW4gKGljb3VudCk6IE1vdmVkIGhlcmUgZnJvbSBnZW5tbG9vcC5zaC4KLQotU2F0IEp1biAxMyAwNzo0OToyMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGZhbGxpcy5jeWdudXMuY29tPgotCi0JKiBtMzJyLXNpbS5oIChNMzJSX01JU0NfUFJPRklMRSk6IE5ldyBtZW1iZXJzIGluc25fY3ljbGVzLCBjdGlfc3RhbGwsCi0JbG9hZF9zdGFsbCxiaWdnZXN0X2N5Y2xlcy4KLQkqIG0zMnIuYyAobTMycl9tb2RlbF9tYXJrX2dldF9oX2dyKTogVXBkYXRlLgotCShtMzJyX21vZGVsX2luaXRfaW5zbl9jeWNsZXMsbTMycl9tb2RlbF91cGRhdGVfaW5zbl9jeWNsZXMpOiBOZXcgZm5zLgotCShtMzJyX21vZGVsX3JlY29yZF9jdGksbTMycl9tb2RlbF9yZWNvcmRfY3ljbGVzKTogTmV3IGZ1bmN0aW9ucy4KLQkqIG1sb29wLmluOiBDYWxsIGN5Y2xlIGluaXQvdXBkYXRlIGZucy4KLQkqIG1vZGVsLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyeC5jIChtMzJyeF9tb2RlbF9tYXJrX2dldF9oX2dyKTogVXBkYXRlLgotCSogbWxvb3B4LmluOiBDYWxsIGN5Y2xlIGluaXQvdXBkYXRlIGZucy4KLQkqIG1vZGVseC5jOiBSZWdlbmVyYXRlLgotCi1XZWQgSnVuIDEwIDE3OjM5OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHRyYXBzLmM6IE5ldyBmaWxlLiAgVHJhcCBzdXBwb3J0IG1vdmVkIGhlcmUgZnJvbSBzaW0taWYuYy4KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCB0cmFwcy5vCi0JKiBzaW0taWYuYzogRG9uJ3QgaW5jbHVkZSB0YXJnLXZhbHMuaC4KLQkoc2ltX2VuZ2luZV9pbGxlZ2FsX2luc24pOiBNb3ZlZCB0byB0cmFwcy5jCi0JKiBzaW0tbWFpbi5oIChTSU1fQ09SRV9TSUdOQUwpOiBEZWZpbmUuCi0JKG0zMnJfY29yZV9zaWduYWwpOiBEZWNsYXJlLgotCSogbTMyci1zaW0uaCAobTMycl90cmFwKTogRGVjbGFyZS4KLQotCSogZGV2aWNlcy5jIChkZXZpY2VfaW9fcmVhZF9idWZmZXIpOiBIYW5kbGUgY2FjaGUgcHVyZ2luZyB2aWEgTUNDUgotCXJlZ2lzdGVyLgotCi0JKiBtMzJyLXNpbS5oIChNMzJSX01JU0NfUFJPRklMRSk6IE1vdmUgaGVyZSBmcm9tIHNpbS1tYWluLmguCi0JKFBST0ZJTEVfQ09VTlRfU0hPUlRJTlNOUyxQUk9GSUxFX0NPVU5UX0xPTkdJTlNOUyk6IE5ldyBtYWNyb3MuCi0JKFRSQVBfU1lTQ0FMTCxUUkFQX0JSRUFLUE9JTlQpOiBOZXcgbWFjcm9zLgotCi0JKiBleHRyYWN0LmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogY3B1eC5oLHJlYWR4LmMsc2VteC5jOiBSZWdlbmVyYXRlLgotCi1XZWQgTWF5IDIwIDAwOjEwOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLXNpbS5oIChQUk9GSUxFX0NPVU5UX1BBUklOU05TKTogTmV3IG1hY3JvLgotCSogbWxvb3B4LmluIChleHRyYWN0KTogU2V0IGFidWYuYWRkciBmb3IgcHJvcGVyIGZpbGwgbm9wIGNvdW50aW5nLgotCShleGVjdXRlKTogQ291bnQgcGFyYWxsZWwgaW5zbnMuCi0JKiBzaW0taWYuYyAocHJpbnRfbTMycl9taXNjX2NwdSk6IFByaW50IGNvdW50LgotCSogc2ltLW1haW4uaCAoTTMyUl9NSVNDX1BST0ZJTEUpOiBOZXcgbWVtYmVyIHBhcmFsbGVsX2NvdW50LgotCi0JWmVybyBib3R0b20gdHdvIGJpdHMgb2YgcGMgaW4gam1wLGpsIGluc25zLgotCSogc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlLgotCSogc2VteC5jOiBSZWdlbmVyYXRlLgotCi1UdWUgTWF5IDE5IDE2OjQ1OjMzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0taWYuYyAoZG9fdHJhcCk6IFRyZWF0IHRyYXBzIDItMTUgYXMgaGFyZHdhcmUgZG9lcy4KLQotU2F0IE1heSAxNiAxMzowNDozMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlmLmMgKHNpbV9zdG9wKTogVXBkYXRlIGNhbGwgdG8gQGNwdUBfZW5naW5lX3N0b3AuCi0JKHNpbV9zeW5jX3N0b3ApOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBNYXkgMTUgMTY6NDM6MjcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkZXZpY2VzLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCi0JKiBhcmNoLmgsY3B1LmMsY3B1LmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0JKiBtbG9vcC5pbiAoZXhlY3V0ZSk6IFVwZGF0ZSBjYWxscyB0byBUUkFDRV9JTlNOX3tJTklULEZJTkl9LgotCSogY3B1eC5jLGNwdXguaCxtb2RlbHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyeC5jIChtMzJyeF9tb2RlbF9tYXJrX3tidXN5LHVuYnVzeX1fcmVnKTogTmV3IGZ1bmN0aW9ucy4KLQkqIG1sb29weC5pbiAoZXhlY3V0ZSk6IFVwZGF0ZSBjYWxscyB0byBUUkFDRV9JTlNOX3tJTklULEZJTkl9LgotCUZpeCBwYyB2YWx1ZSBwYXNzZWQgdG8gVFJBQ0VfSU5TTiBmb3Igc2Vjb25kIHBhcmFsbGVsIGluc24uCi0KLVRodSBNYXkgIDcgMDI6NTE6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tY3B1Lm8uCi0KLVdlZCBNYXkgIDYgMTQ6NTE6MzkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGFyY2guaCxhcmNoLmMsY3B1LmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUsIHR3ZWFrcyBtb3N0bHkuCi0JKiBtb2RlbC5jOiBEaXR0by4gIFJlb3JnYW5pemUgbW9kZWwvbWFjaCBkYXRhLgotCSogY3B1eC5oOiBEaXR0by4KLQkqIG1vZGVseC5jOiBEaXR0by4KLQotCSogTWFrZWZpbGUuaW4gKG0zMnIubyxtbG9vcC5vLGNwdS5vLG1vZGVsLm8pOiBBZGQgZGVjb2RlLmggZGVwZW5kZW5jeS4KLQkobTMycngubyxtbG9vcHgubyxjcHV4Lm8sbW9kZWx4Lm8pOiBBZGQgZGVjb2RleC5oIGRlcGVuZGVuY3kuCi0JKiBkZWNvZGUuYyxkZWNvZGUuaDogUmVnZW5lcmF0ZSwgaW50cm9kdWNlcyBJREVTQyB0YWJsZS4KLQkqIG1sb29wLmluIChleHRyYWN0MTYsZXh0cmFjdDMyKTogQWRkIElERVNDIHN1cHBvcnQuCi0JVXBkYXRlIG5hbWVzIG9mIHNlbWFudGljIGhhbmRsZXIgbWVtYmVyIG5hbWVzLgotCShleGVjdXRlKTogRGl0dG8uICBEZWxldGUgY2FsbCB0byBQUk9GSUxFX0NPVU5UX0lOU04uCi0JKiBkZWNvZGV4LmMsZGVjb2RleC5oOiBSZWdlbmVyYXRlLCBpbnRyb2R1Y2VzIElERVNDIHRhYmxlLgotCSogbWxvb3B4LmluOiBBZGQgSURFU0Mgc3VwcG9ydC4KLQlVcGRhdGUgbmFtZXMgb2Ygc2VtYW50aWMgaGFuZGxlciBtZW1iZXIgbmFtZXMuCi0JRGVsZXRlIGNhbGwgdG8gUFJPRklMRV9DT1VOVF9JTlNOLgotCi0JKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuICBSZWRvIGNvbXB1dGVkIGdvdG8gbGFiZWwgaGFuZGxpbmcuCi0JKiBzZW0uYzogUmVnZW5lcmF0ZS4gIENhbGwgUFJPRklMRV9DT1VOVF9JTlNOLgotCSogcmVhZHguYzogUmVnZW5lcmF0ZS4gIFJlZG8gY29tcHV0ZWQgZ290byBsYWJlbCBoYW5kbGluZy4KLQkqIHNlbXguYzogUmVnZW5lcmF0ZS4gIENhbGwgUFJPRklMRV9DT1VOVF9JTlNOLiAgRmluaXNoIHByb2ZpbGluZwotCXN1cHBvcnQuCi0KLQkqIG0zMnIuYyAobTMycl9mZXRjaF9yZWdpc3Rlcik6IENoYW5nZSByZXN1bHQgdHlwZSBhbmQgYXJncyB0bwotCWNvbmZvcm0gdG8gc2ltX2ZldGNoX3JlZ2lzdGVyIGludGVyZmFjZS4KLQkobTMycl9zdG9yZV9yZWdpc3Rlcik6IERpdHRvIGZvciBzaW1fc3RvcmVfcmVnaXN0ZXIgaW50ZXJmYWNlLgotCSogbTMycnguYyAobTMycnhfZmV0Y2hfcmVnaXN0ZXIpOiBDaGFuZ2UgcmVzdWx0IHR5cGUgYW5kIGFyZ3MgdG8KLQljb25mb3JtIHRvIHNpbV9mZXRjaF9yZWdpc3RlciBpbnRlcmZhY2UuCi0JKG0zMnJ4X3N0b3JlX3JlZ2lzdGVyKTogRGl0dG8gZm9yIHNpbV9zdG9yZV9yZWdpc3RlciBpbnRlcmZhY2UuCi0KLQkqIHNpbS1pZi5jIChhbGxvY19jcHUpOiBEZWxldGUuCi0JKGZyZWVfc3RhdGUpOiBVbmluc3RhbGwgbW9kdWxlcyBoZXJlIC4uLgotCShzaW1fb3Blbik6IC4uLiBhbmQgbm90IGhlcmUuICBDYWxsIHNpbV9jcHVfYWxsb2NfYWxsLgotCVNldCBkZWZhdWx0IGFyY2hpdGVjdHVyZS9tb2RlbCBpZiBub3Qgc3BlY2lmaWVkLgotCShzaW1fZmV0Y2hfcmVnaXN0ZXIsc2ltX3N0b3JlX3JlZ2lzdGVyKTogUmV3cml0ZS4KLQotCSogc2ltLWlmLmMgKGhfcGNfZ2V0LGhfcGNfc2V0KTogRGVsZXRlLiAgUmVuYW1lZCB0byBzaW1fcGNfW2dzXWV0Ci0JYW5kIG1vdmVkIHRvIGNvbW1vbi9zaW0tY3B1LmMuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBVcGRhdGUuCi0JKGRvX3RyYXApOiBVcGRhdGUuCi0JKiBzaW0tbWFpbi5oIChoX3BjX2dldCxoX3BjX3NldCk6IERlbGV0ZS4KLQotCSogc2ltLW1haW4uaCAoc2ltX2NpYSk6IENoYW5nZSB0byBVU0kuCi0JKHNpbV9jcHUpOiBNb3ZlIG0zMnJfbWlzY19wcm9maWxlIGJlZm9yZSBtYWNoaW5lIGdlbmVyYXRlZCBwYXJ0LgotCi1UdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjggMTg6MDU6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbW9kZWwuYzogUmVidWlsdC4KLQkqIG1vZGVseC5jOiBSZWJ1aWx0LgotCi1Nb24gQXByIDI3IDE1OjM2OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZWQuICBNb3N0bHkgY29tbWVudAotCWFuZCB2YXJpYWJsZSByZW5hbWluZyBkdWUgdG8gbWFjcm8gaW5zbiBhZGRpdGlvbnMuCi0JKiBtbG9vcC5pbjogVXBkYXRlIHRvIHVzZSBDR0VOX0lOU05fTlVNLgotCSogY3B1eC5oLG1vZGVseC5jLHJlYWR4LmMsc2VteC5jOiBSZWdlbmVyYXRlZC4KLQkqIG1sb29weC5pbjogVXBkYXRlIHRvIHVzZSBDR0VOX0lOU05fTlVNLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjIwOjA1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxOToyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotTW9uIEFwciAyMCAxNjoxMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjcHUuYyxzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuICBGcm9tCi0JLSBjZ2VuL20zMnIuY3B1IChoLWFjY3VtKTogQWRkIGF0dHJpYnV0ZSBGVU4tQUNDRVNTLgotCSogbTMyci5jIChtMzJyX2hfYWNjdW1fZ2V0LG0zMnJfaF9hY2N1bV9zZXQpOiBOZXcgZnVuY3Rpb25zLgotCSNpbmNsdWRlIGNnZW4tb3BzLmguCi0JKiBjcHV4LmMscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyeC5jIChtMzJyX2hfYWNjdW1fZ2V0LG0zMnJfaF9hY2N1bV9zZXQpOiBOZXcgZnVuY3Rpb25zLgotCSNpbmNsdWRlIGNnZW4tb3BzLmguICBEZWxldGUgaW5jbHVzaW9uIG9mIHNldmVyYWwgdW5uZWNlc3NhcnkgaGVhZGVycy4KLQkobTMycl9oX2FjY3Vtc19nZXQpOiBTaWduIGV4dGVuZCB0b3AgOCBiaXRzLgotCi1UdWUgQXByIDE0IDE0OjA0OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNlbXguYzogUmVnZW5lcmF0ZS4KLQotRnJpIEFwciAxMCAxODoyMjo0MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxleHRyYWN0LmMsc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlLgotCSogY3B1eC5oLGRlY29kZXguYyxkZWNvZGV4LmgscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBNYXIgMjcgMTY6MTU6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMjUgMTI6MzU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVNhdCBNYXIgMTQgMjA6NTM6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbiAoSEFWRV9GQ05UTF9IKTogQWRkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIGRldmljZXMuby4KLQkqIG0zMnItc2ltLmggKG0zMnJfZGV2aWNlcyk6IFJlbmFtZWQgZnJvbSBtMzJyX21zcHJfZGV2aWNlLgotCShVQVJUXyopOiBEZWZpbmUgbTMyciBzZXJpYWwgcG9ydCBwYXJhbWV0ZXJzLgotCShNMzJSX0RFVklDRV9BRERSLE0zMlJfREVWSUNFX0xFTik6IERlZmluZS4KLQkqIG0zMnIuYyAoZGV2aWNlX2lvX3tyZWFkLHdyaXRlfV9idWZmZXIsZGV2aWNlX2Vycm9yKTogTW92ZSBmcm9tIGhlcmUsCi0JKiBkZXZpY2VzLmM6IFRvIGhlcmUuCi0JKiBzaW0taWYuYzogRG9uJ3QgaW5jbHVkZSBzaWduYWwuaCxzaW0tY29yZS5oLgotCShzaW1fb3Blbik6IFVzZSBNMzJSX0RFVklDRV97QUREUixMRU59IGluIHNpbV9jb3JlX2F0dGFjaCBjYWxsLgotCShzaW1fcmVzdW1lKTogQ2FsbCBzaW1fbW9kdWxlX3tyZXN1bWUsc3VzcGVuZH0uCi0JKiBtMzJyLmMgKG0zMnJfaF9jcl97Z2V0LHNldH0pOiBVc2UgcmVnaXN0ZXIgbnVtYmVyIGVudW1zLgotCi0JKiB0Y29uZmlnLmluIChTSU1fSEFORExFU19MTUEpOiBEZWZpbmUuCi0KLQkqIHNpbS1pZi5jIChkb190cmFwKTogUmVzdWx0IGlzIG5ldyBwYy4KLQlIYW5kbGUgLS1lbnZpcm9ubWVudD1vcGVyYXRpbmcuCi0JKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0JKiBzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLVdlZCBNYXIgMTEgMTQ6MDc6MzkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0taWYuYyAoc3lzY2FsbF9yZWFkX21lbSwgc3lzY2FsbF93cml0ZV9tZW0pOiBSZXBsYWNlCi0gCXNpbV9jb3JlXypfbWFwIHdpdGggcmVhZF9tYXAsIHdyaXRlX21hcCwgZXhlY19tYXAgcmVzcC4KLQotV2VkIE1hciAgNCAxMTozNjo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9ERVBTKTogQWRkIGNwdS1vcGMuaC4KLQkoYXJjaC5vKTogRGVsZXRlIGNwdS1vcGMuaCBkZXBlbmRlbmN5LgotCShkZWNvZGUubyxtb2RlbC5vKTogTGlrZXdpc2UuCi0JKGRlY29kZXgubyxtb2RlbHgubyk6IExpa2V3aXNlLgotCi0JKiBjcHUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIGNwdXguaCxkZWNvZGV4LltjaF0sbW9kZWx4LmMscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMjYgMTg6Mzg6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBJbml0aWFsaXplIFBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0suCi0KLQkqIHNpbS1pZi5jIChzaW1faW5mbyk6IERlbGV0ZS4KLQotRnJpIEZlYiAyNyAxMDoxNDoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtbG9vcHguaW46IEZpeCBoYW5kbGluZyBvZiBicmFuY2ggaW4gcGFyYWxsZWwgd2l0aCBhbm90aGVyIGluc24uCi0JKiBzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgMjMgMTM6MzA6NDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmg6ICNpbmNsdWRlIHN5bWNhdC5oLgotCSogbTMyci1zaW0uaCAoQlJBTkNIX05FV19QQyk6IERlbGV0ZSBjdXJyZW50X2NwdSBhcmcuCi0JKE5FV19QQ197QkFTRSxTS0lQLDIsNCxCUkFOQ0hfUH0pOiBOZXcgbWFjcm9zLgotCSogY3B1LltjaF0sZGVjb2RlLltjaF0sZXh0cmFjdC5jLG1vZGVsLmM6IFJlZ2VuZXJhdGUuCi0JKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLXNpbS5oIChTRU1fTkVYVF9QQyk6IE1vZGlmeSB0byBoYW5kbGUgcGFyYWxsZWwgZXhlYy4KLQkqIG1sb29weC5pbjogUmV3cml0ZS4KLQkqIGNwdXguW2NoXSxkZWNvZGV4LltjaF0scmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgMjMgMTI6Mjc6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci5jIChtMzJyX2hfY3Jfc2V0LCBtMzJyX2hfY3JfZ2V0KTogU2hhZG93IGNvbnRyb2wgcmVnaXN0ZXIgNgotCWluIHRoZSBiYWNrdXAgUEMgcmVnaXN0ZXIuCi0JKiBtMzJyeC5jIChtMzJyX2hfY3Jfc2V0LCBtMzJyX2hfY3JfZ2V0KTogU2hhZG93IGNvbnRyb2wgcmVnaXN0ZXIgNgotCWluIHRoZSBiYWNrdXAgUEMgcmVnaXN0ZXIuCi0KLVRodSBGZWIgMTkgMTY6Mzk6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci5jIChkb19sb2NrLGRvX3VubG9jayk6IERlbGV0ZS4KLQkqIGNwdS5bY2hdLGRlY29kZS5bY2hdLGV4dHJhY3QuYyxtb2RlbC5jOiBSZWdlbmVyYXRlLgotCSogc2VtLmMsc2VtLXN3aXRjaC5jOiBSZWdlbmVyYXRlLgotCSogY3B1eC5bY2hdLGRlY29kZXguW2NoXSxyZWFkeC5jLHNlbXguYzogUmVnZW5lcmF0ZS4KLQotVHVlIEZlYiAxNyAxODoxODoxMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE0zMlJfT0JKUyk6IEFkZCBjcHUuby4KLQkoY3B1Lm8pOiBBZGQgcnVsZSBmb3IuCi0JKE5MX1RBUkdFVCk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0NIRUNLX1BST0coU0NIRU1FKS4KLQkqIGNwdS5jOiBOZXcgZmlsZS4KLQkqIGNwdWFsbC5oLGNwdS5oLGRlY29kZS5jLGRlY29kZS5oLGV4dHJhY3QuYyxtb2RlbC5jOiBSZWdlbmVyYXRlLgotCSogc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgotCSogbWxvb3AuaW4gKGV4ZWN1dGUpOiBVcGRhdGUgY2FsbCB0byBzZW1hbnRpYyBmbi4KLQkoTTMyUlhfT0JKUyk6IEFkZCBjcHV4Lm8uCi0JKGNwdXgubyk6IEFkZCBydWxlIGZvci4KLQljcHV4LmM6IE5ldyBmaWxlLgotCSogY3B1eC5oLGRlY29kZXguYyxkZWNvZGV4LmgsbW9kZWx4LmMscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyeC5jIChtMzJyeF9oX2FjY3Vtc197Z2V0LHNldH0pOiBSZXdyaXRlLgotCShtMzJyeF9oX2NyX3tnZXQsc2V0fSk6IE5ldyBmdW5jdGlvbnMuCi0JKG0zMnJ4X2hfYWNjdW1zX3tnZXQsc2V0fSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBtbG9vcHguaW46IFJld3JpdGUgbWFpbiBsb29wLgotCi0JKiBtMzJyLmMgKGRvX3RyYXApOiBNb3ZlIGZyb20gaGVyZS4KLQkqIHNpbS1pZi5jIChkb190cmFwKTogVG8gaGVyZSwgYW5kIHJld3JpdGUgdG8gdXNlIENCX1NZU0NBTEwgc3VwcG9ydC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFVzZSBoX3BjX3NldC4KLQkoaF9wY197Z2V0LHNldH0pOiBOZXcgZnVuY3Rpb25zLgotCShoX2dyX3tnZXQsc2V0fSk6IE5ldyBmdW5jdGlvbnMuCi0JKHN5c2NhbGxfe3JlYWQsd3JpdGV9X21lbSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzaW0tbWFpbi5oIChoX3tncixwY31fe2dldCxzZXR9KTogRGVjbGFyZS4KLQotVHVlIEZlYiAxNyAxMjo0NDozOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pZi5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFBhc3MgNCBzaW1fc3RvcmVfcmVnaXN0ZXIuCi0KLVdlZCBGZWIgMTEgMTk6NTM6NDggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoQ0lBX0dFVCxDSUFfU0VUKTogUHJvdmlkZSBkdW1teSBkZWZpbml0aW9ucyBmb3Igbm93LgotCi0JKiBkZWNvZGUuYywgZGVjb2RlLmgsIHNlbS5jLCBzZW0tc3dpdGNoLmMsIG1vZGVsLmM6IFJlZ2VuZXJhdGUuCi0JKiBjcHV4LmMsIGRlY29kZXguYywgZGVjb2RleC5oLCByZWFkeC5jLCBzZW14LmMsIG1vZGVseC5jOiBSZWdlbmVyYXRlLgotCi1Nb24gRmViICA5IDE5OjQxOjU0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRlY29kZS5jLCBzZW0uYzogUmVnZW5lcmF0ZS4KLQkqIGNwdXguaCwgZGVjb2RleC5jLCByZWFkeC5jLCBzZW14LmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyeC5jIChtMzJyeF9oX2FjY3Vtc19zZXQpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJ4X21vZGVsX21hcmtfW2dzXWV0X2hfZ3IpOiBOZXcgZnVuY3Rpb24uCi0JKiBtbG9vcHguaW46IFJld3JpdGUuCi0JKiBNYWtlZmlsZS5pbiAobWxvb3B4Lm8pOiBCdWlsZCB3aXRoIC1wYXJhbGxlbC4KLQkqIHNpbS1tYWluLmggKF9zaW1fY3B1KTogRGVsZXRlIG1lbWJlciBgcGFyX2V4ZWMnLgotCSogdGNvbmZpZy5pbiAoV0lUSF9TRU1fU1dJVENIX0ZVTEwpOiBEZWZpbmUgYXMgMCBmb3IgbTMycnguCi0KLVRodSBGZWIgIDUgMTI6NDQ6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtMzJyLm8pOiBEZXBlbmQgb24gY3B1LmgKLQkoZXh0cmFjdC5vKTogUGFzcyAtRFNDQUNIRV9QLgotCSogbWxvb3AuaW4gKGV4dHJhY3R7MTYsMzJ9KTogVXBkYXRlIGNhbGwgdG8gbTMycl9kZWNvZGUuCi0JKiBhcmNoLmgsY3B1LmgsY3B1YWxsLmgsZGVjb2RlLltjaF06IFJlZ2VuZXJhdGUuCi0JKiBleHRyYWN0LmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCi0JKiBzaW0tbWFpbi5oOiAjaW5jbHVkZSAiYW5zaWRlY2wuaCIuCi0JRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsIGRvbmUgYnkgYXJjaC5oLgotCSogTWFrZWZpbGUuaW4gKE0zMlJYX09CSlMpOiBCdWlsZCBtMzJyeCBzdXBwb3J0IG5vdy4KLQkobTMycngubyk6IE5ldyBydWxlLgotCSogbTMyci1zaW0uaCAobTMycnhfaF9jcl9bZ3NdZXQpOiBEZWZpbmUuCi0JKiBtMzJyeC5jIChtMzJyeF97ZmV0Y2gsc3RvcmV9X3JlZ2lzdGVyKTogVXBkYXRlIHtnZXQsc2V0fSBvZiBQQy4KLQkobTMycnhfaF9hY2N1bXNfZ2V0KTogTmV3IGZ1bmN0aW9uLgotCSogbWxvb3B4LmluOiBVcGRhdGUgY2FsbCB0byBtMzJyeF9kZWNvZGUuICBSZXdyaXRlIGV4ZWMgbG9vcC4KLQkqIGNwdXguaCxkZWNvZGV4LltjaF0sbW9kZWx4LmMscmVhZHguYyxzZW14LmM6IFJlZ2VuZXJhdGUuCi0KLVN1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVNhdCBKYW4gMzEgMTg6MTU6NDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBKYW4gMjkgMTE6MjI6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE0zMlJYX09CSlMpOiBDb21tZW50IG91dCB1bnRpbCBtMzJyeCBwb3J0IHdvcmtpbmcuCi0JKiBhcmNoLmggKEhBVkVfQ1BVX00zMlJ7LFh9KTogRGVsZXRlLCBtb3ZlZCB0byBtMzJyLW9wYy5oLgotCSogYXJjaC5jIChtYWNocyk6IENoZWNrIGlmZGVmIEhBVkVfQ1BVX0ZPTyBmb3IgZWFjaCBlbnRyeS4KLQotVHVlIEphbiAyMCAxNDoxNjowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHV4Lmg6IEZpeCBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBoX2FjY3VtcyBmaWVsZCBmb3IKLQlmbXRfNTNfc2FkZCBzdHJ1Y3R1cmUuCi0KLVR1ZSBKYW4gMjAgMDE6NDI6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbTMycnggb2JqcywgYW5kIHJ1bGVzIHRvIGJ1aWxkIHRoZW0uCi0JKiBjcHV4LmgsIGRlY29kZXguaCwgZGVjb2RleC5jLCByZWFkeC5jLCBzZW14LmMsIG1vZGVseC5jOiBOZXcgZmlsZXMuCi0JKiBtMzJyeC5jLCBtbG9vcHguaW46IE5ldyBmaWxlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAxNDoxMzo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogYXJjaC5jLCBhcmNoLmgsIGNwdWFsbC5oOiBOZXcgZmlsZXMuCi0JKiBhcmNoLWRlZnMuaDogRGVsZXRlZC4KLQkqIG1sb29wLmluOiBSZW5hbWVkIGZyb20gbWFpbmxvb3AuaW4uCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlLgotCSogc2VtLW9wcy5oOiBEZWxldGVkLgotCSogbWVtLW9wcy5oOiBEZWxldGVkLgotCShhcmNoKTogUmVuYW1lZCBmcm9tIENQVS4KLQkqIGNwdS5oOiBOZXcgZmlsZS4KLQkqIGRlY29kZS5jOiBSZWRvbmUuCi0JKiBkZWNvZGUuaDogUmVkb25lLgotCSogZXh0cmFjdC5jOiBSZWRvbmUuCi0JKiBtb2RlbC5jOiBSZWRvbmUuCi0JKiBzZW0tc3dpdGNoLmM6IFJlZG9uZS4KLQkqIHNlbS5jOiBSZW5hbWVkIGZyb20gc2VtYW50aWNzLmMsIGFuZCByZWRvbmUuCi0JKiBtMzJyLXNpbS5oIChQUk9GSUxFX0NPVU5UX0ZJTExOT1BTKTogVXBkYXRlLgotCShHRVRUV0ksU0VUVFdJLEJSQU5DSF9ORVdfUEMpOiBEZWZpbmUuCi0JKiBtMzJyLmMgKFdBTlRfQ1BVLFdBTlRfQ1BVX00zMlIpOiBEZWZpbmUuCi0JKG0zMnJfe2ZldGNoLHN0b3JlfV9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbnMuCi0JKG1vZGVsX21hcmtfe2dldCxzZXR9X2hfZ3IpOiBQcmVmaXggd2l0aCBtMzJyXy4KLQkobTMycl9tb2RlbF9tYXJrX3tidXN5LHVuYnVzeX1fcmVnKTogUHJlZml4IHdpdGggbTMycl8uCi0JKGhfY3Jfe2dldCxzZXR9KTogUHJlZml4IHdpdGggbTMycl8uCi0JKGRvX3RyYXApOiBGZXRjaCBzdGF0ZSBmcm9tIGN1cnJlbnRfY3B1LCBub3QgY3VycmVudF9zdGF0ZS4KLQlDYWxsIHNpbV9lbmdpbmVfaGFsdCBpbnN0ZWFkIG9mIGVuZ2luZV9oYWx0LgotCSogc2ltLWlmLmMgKGFsbG9jX2NwdSk6IE5ldyBmdW5jdGlvbi4KLQkoZnJlZV9zdGF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX29wZW4pOiBDYWxsIHNpbV9zdGF0ZV9hbGxvYywgYW5kIG1hbGxvYyBzcGFjZSBmb3Igc2VsZWN0ZWQgY3B1Ci0JdHlwZS4gIENhbGwgc2ltX2FuYWx5emVfcHJvZ3JhbS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEhhbmRsZSBzZWxlY3RlZCBjcHUgdHlwZSB3aGVuIHNldHRpbmcgUEMuCi0JKHNpbV9yZXN1bWUpOiBIYW5kbGUgbTMycnguCi0JKHNpbV9zdG9wX3JlYXNvbik6IERlbGV0ZWQuCi0JKHByaW50X20zMnJfbWlzY19jcHUpOiBVcGRhdGUuCi0JKHNpbV97ZmV0Y2gsc3RvcmV9X3JlZ2lzdGVyKTogSGFuZGxlIG0zMnJ4LgotCShzaW1fe3JlYWQsd3JpdGV9KTogRGVsZXRlZC4KLQkoc2ltX2VuZ2luZV9pbGxlZ2FsX2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKiBzaW0tbWFpbi5oOiBEb24ndCBpbmNsdWRlIGFyY2gtZGVmcy5oLHNpbS1jb3JlLmgsc2ltLWV2ZW50cy5oLgotCUluY2x1ZGUgYXJjaC5oLGNwdWFsbC5oLiAgSW5jbHVkZSBjcHUuaCxkZWNvZGUuaCBpZiBtMzJyLgotCUluY2x1ZGUgY3B1eC5oLGRlY29kZXguaCBpZiBtMzJyeC4KLQkoX3NpbV9jcHUpOiBJbmNsdWRlIG1lbWJlciBhcHByb3ByaWF0ZSBjcHVfZGF0YSBtZW1iZXIgZm9yIHRoZSBjcHUuCi0JKE0zMlJfTUlTQ19QUk9GSUxFKTogUmVuYW1lZCBmcm9tIE0zMlJfUFJPRklMRS4KLQkoc2ltX3N0YXRlKTogRGVsZXRlIG1lbWJlcnMgY29yZSxldmVudHMsaGFsdF9qbXBfYnVmLgotCUNoYW5nZSBgY3B1JyBtZW1iZXIgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBjcHUncyBzdHJ1Y3QsIHJhdGhlciB0aGFuCi0JcmVjb3JkIGluc2lkZSB0aGUgc3RhdGUgc3RydWN0LgotCSogdGNvbmZpZy5pbiAoV0lUSF9ERVZJQ0VTKTogRGVmaW5lIGhlcmUuCi0JKFdJVEhfRkFTVCxXSVRIX1NFTV9TV0lUQ0hfe0ZVTEwsRkFTVH0pOiBEZWZpbmUgZm9yIHRoZSBjcHUuCi0KLUZyaSBKYW4gMTYgMTI6MTY6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaC1kZWZzLmggKElOU05fTkFNRSk6IEZpeCB0eXBvLgotCi1Nb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLXNpbS5oIChNU1BSX0FERFIpOiBOZXcgbWFjcm8uCi0JKG0zMnJfbXNwcl9kZXZpY2UpOiBEZWNsYXJlLgotCShzdHJ1Y3QgX2RldmljZSk6IERlZmluZS4KLQkqIG0zMnIuYyAobTMycl9tc3ByX2RldmljZSk6IE5ldyBnbG9iYWwuCi0JKGRldmljZV97aW9fe3JlYWQsd3JpdGV9X2J1ZmZlcixlcnJvcn0pOiBOZXcgZnVuY3Rpb25zLgotCSogbWVtLW9wcy5oIChTRVRNRU0qKTogVXNlIHNpbV9jb3JlX3dyaXRlX21hcCwgbm90IHJlYWQgbWFwLgotCSogc2ltLWlmLmM6IERlbGV0ZSByZWR1bmRhbnQgaW5jbHVzaW9uIG9mIGNwdS1zaW0uaC4KLQkoc2ltX29wZW4pOiBBdHRhY2ggZGV2aWNlIHRvIGhhbmRsZSBNU1BSIHJlZ2lzdGVyLgotCSogc2ltLW1haW4uaCAoV0lUSF9ERVZJQ0VTKTogRGVmaW5lIGFzIDEuCi0JSW5jbHVkZSBjcHUtc2ltLmguCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIERlYyAgMyAxODowODo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fRU5WSVJPTk1FTlQpOiBDYWxsLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotV2VkIE5vdiAxOSAxMjoxNzowOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtZW0tb3BzLmg6IFJlbmFtZSBTSU1fU0lHe0FDQ0VTUyxBTElHTn0gdG8gU0lNX1NJR3tTRUdWLEJVU30uCi0JKiBzaW0taWYuYyAoc2ltX29wZW4pOiBDYWxsIHNpbV9jb25maWcuCi0JKHNpbV9zdG9wX3JlYXNvbik6IFVwZGF0ZSBjYWxsIHRvIHNpbV9zaWduYWxfdG9faG9zdC4KLQotVHVlIE5vdiAxOCAxNTozMzo0OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBVc2UgJChTSU1fTkVXX0NPTU1PTl9PQkpTKS4KLQotRnJpIE9jdCAzMSAxODo0Njo0NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IERlbGV0ZSBkZWFkIGNhbGwgdG8gc2ltX2NvcmVfYXR0YWNoLgotCi1Nb24gT2N0IDI3IDEyOjQzOjU0IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNlbS1vcHMuaCAoVXtESVYsTU9EfVtCSFNEXUkpOiBVc2UgdW5zaWduZWQgZGl2aXNpb24uCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTA6MTk6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VORElBTiwgU0lNX0hPU1RFTkRJQU4sIFNJTV9TQ0FDSEUsCi0gCVNJTV9ERUZBVUxUX01PREVMKTogRGVsZXRlLCBtb3ZlZCB0byBjb21tb24uCi0JKFNJTV9FWFRSQV9DRkxBR1MpOiBVcGRhdGUuCi0JCi1Nb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzaW1fbGlua19saW5rcyk6IENvbmZpZ3VyZSBub24tc3RyaWN0IG1lbW9yeQotIAlhbGlnbm1lbnQuCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIFNlcCAxNyAxNzo0NDo0MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IEFsbG9jYXRlIG1lbW9yeSB1bmRlciBzaW0tbWVtb3B0IG1vZHVsZQotIAl1c2luZyBzaW1fZG9fY29tbWFuZGYuCi0JKHNpbV9vcGVuKTogU2V0IG1hZ2ljLW51bWJlciBhdCB0aGUgc3RhcnQuCi0JKHNpbV9kb19jb21tYW5kKTogSW1wbGVtZW50LgotCi0JKiBzaW0tbWFpbi5oIChzaW1fZW5naW5lX2hhbHQpOiBNYXAgb250byBlbmdpbmVfaGFsdC4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAgNSAxMDoyMTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbWVtb3B0Lm8gbW9kdWxlLgotCi1UaHUgU2VwICA0IDEwOjMwOjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogUGFzcyB6ZXJvIG1vZHVsbyBhcmcgdG8gc2ltX2NvcmVfYXR0YWNoLgotCi1XZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVHVlIEF1ZyAyNiAxMDozOTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1pZi5jIChzaW1fa2lsbCk6IERlbGV0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgotCShzaW1fbG9hZCk6IERlbGV0ZSwgdXNlIHNpbS1obG9hZC5jIGluc3RlYWQuCi0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0taGxvYWQubyBtb2R1bGUuCi0KLU1vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1Nb24gQXVnIDI1IDE1OjU0OjA4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCi0KLVR1ZSBKdWwgMjIgMTA6MTY6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoTTMyUl9ERUZBVUxUX01FTV9TSVpFKTogTmV3IG1hY3JvLgotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogVXNlIGl0LgotCi1XZWQgSnVuICA0IDEyOjQ4OjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoV0lUSF9FTkdJTkUpOiBEaXNhYmxlIHRoZSBjb21tb24gZW5naW5lIGZvciBub3cuCi0KLVR1ZSBNYXkgMjcgMTQ6MTU6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0taWYuYyAoc2ltX3JlYWQpOiBQYXNzIE5VTEwgY3B1IHRvIHNpbV9jb3JlX3JlYWRfYnVmZmVyLgotCShzaW1fd3JpdGUpOiBEaXR0byBmb3Igd3JpdGUuCi0KLQkqIG0zMnIuYyAoZG9fdHJhcCk6IERpdHRvIGZvciByZWFkL3dyaXRlLgotCi1UdWUgTWF5IDIwIDEwOjE4OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgotCShzaW1fc2V0X2NhbGxiYWNrcywgc2ltX2NhbGxiYWNrKTogRGVsZXRlLgotCShzaW1fbG9hZCk6IFNldCBTVEFURV9MT0FERURfUC4KLQotTW9uIE1heSAxOSAxMjo1NTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IExpbmsgaW4gc2ltLWFib3J0Lm8gYXMgYSBzdHViIGZvcgotIAlzaW1fZW5naW5lX2Fib3J0LgotCi1Nb24gTWF5ICA1IDEyOjQ1OjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBjb3JlIGluCi0gCS4uL2NvbW1vbi8uCi0JKiBtZW0tb3BzLmggKEdFVE1FTVFJLCBHRVRNRU1ISSwgR0VUTUVNU0ksIEdFVE1FTURJLCBHRVRNRU1VUUksCi0gCUdFVE1FTVVISSwgR0VUTUVNVVNJLCBHRVRNRU1VREksIFNFVE1FTVFJLCBTRVRNRU1ISSwgU0VUTUVNU0ksCi0gCVNFVE1FTURJLCBTRVRNRU1VUUksIFNFVE1FTVVISSwgU0VUTUVNVVNJLCBTRVRNRU1VREkpOiBEaXR0by4KLQotU2F0IE1heSAgMyAwODozODo1NSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZGVjb2RlLmMgKGRlY29kZSk6IEFkZCBjb21wdXRlZCBnb3RvIHN1cHBvcnQuCi0KLUZyaSBNYXkgIDIgMTY6MzA6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtZW0tb3BzLmg6IFN0dWIgYWRkaXRpb25hbCBjb3JlIHJlYWQvd3JpdGUgYXJndW1lbnRzLgotCi0JKiBzaW0tbWFpbi5oOiBEZWNsYXJlIHNpbV9jaWEgLSB0eXBlIFNJLgotCShzdHJ1Y3QgX3NpbV9jcHUpOiBNb3ZlIGJhc2UgdHlwZSB0byBlbmQgcGVyIGNvbW1vbi4KLQkoc3RydWN0IF9zaW1fc3RhdGUpOiBEaXR0by4KLQotVGh1IE1heSAgMSAxMToxNTozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JTWVyZ2UgZnJvbSBicmFuY2ggaW50byBkZXZvLiAgQ0dFTiBnZW5lcmljIGZpbGVzIG1vdmVkIHRvIGNvbW1vbgotCWRpcmVjdG9yeS4gIEsmUiBDIHN1cHBvcnQgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLgotCi1UaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEFwciAxMiAxMjo1NzozMyAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgc2VtYW4tY2FjaGUuYzogbmV3IGZpbGUsIGZvciB3aW5nZGIgYnVpbGQuCi0JKiBzaW0tYWxsb2NhLmg6IGZpeGVkIGZvciB3aW5nZGIuCi0JCi1Nb24gQXByICA3IDEzOjMzOjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBkZWNvZGUuYyAoKik6IG0zMnJfY2dlbl9pbnNuX3RhYmxlIHJlbmFtZWQgdG8gLi4uX2VudHJpZXMuCi0JKiBtYWlubG9vcC5pbjogVXNlIENHRU5fSU5TTl9JTkRFWCBpbnN0ZWFkIG9mIENHRU5fSU5TTl9UWVBFLgotCSogc2ltZGVmcy5oIChJTlNOX05BTUUpOiBtMzJyX2NnZW5faW5zbl90YWJsZSByZW5hbWVkIHRvIC4uLl9lbnRyaWVzLgotCi1GcmkgQXByICA0IDE5OjIzOjEyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tdXRpbHMuaW4gKGV4X2lsbGVnYWwpOiBGaWxsIGluIGFidWYtPmxlbmd0aCwgYWJ1Zi0+YWRkci4KLQkoZXhjX2lsbGVnYWwpOiBMaWtld2lzZS4KLQkqIGRlY29kZS5jIChkZWNvZGVfdmFycyk6IEFkZCBkZWNvZGVfaWxsZWdhbC4KLQkqIGdlbm1sb29wLnNoOiAjaW5jbHVkZSAiY3B1LW9wYy5oIi4KLQkqIHNlbS1zd2l0Y2guYyAoY2FzZV9JTlNOX0lMTEVHQUwpOiBEZWNsYXJlLgotCShsYWJlbHMpOiBBZGQgY2FzZV9JTlNOX0lMTEVHQUwuCi0JKFNXSVRDSCk6IEFkZCBJTlNOX0lMTEVHQUwgY2FzZS4KLQotV2VkIE1hciAyNiAxMjozNDowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtb2RlbC5jIChtb2RlbF9tb2R1bGUpOiBVc2UgMCBub3QgTlVMTC4KLQotCSogZ2VubWxvb3Auc2ggKHNpbV9tYWluX2xvb3ApOiBIYW5kbGUgayZyIGMuCi0KLQkqIHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZSB0byBnZXQgayZyIGMgc3VwcG9ydC4KLQkqIHNlbWFudGljcy5jOiBMaWtld2lzZS4KLQotCSogbTMyci5jIChBRERfe09WLENBfV9TSSxTVUJfe09WLENBfV9TSSk6IFJlbmFtZWQgdG8ge0FERCxTVUJ9W09DXUZTSS4KLQkoQUREQ1NJLFNVQkNTSSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzZW0tc3dpdGNoLmMgKGFkZHYsYWRkdjMsYWRkeCxzdWJ2LHN1YngpOiBGaXggY2FycnkgYml0IGhhbmRsaW5nLgotCSogc2VtYW50aWNzLmMgKGFkZHYsYWRkdjMsYWRkeCxzdWJ2LHN1YngpOiBGaXggY2FycnkgYml0IGhhbmRsaW5nLgotCi0JKiBzaW1jYWNoZS5jIChzaW1jYWNoZV97aW5zdGFsbCxpbml0LHVuaW5zdGFsbH0pOiBVc2UKLQlERUNMQVJFX01PRFVMRV9JTlNUQUxMX0hBTkRMRVIuCi0JKHNpbWNhY2hlX29wdGlvbl9oYW5kbGVyKTogVXNlIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIuCi0KLQkqIHV0aWxzLmM6ICNpbmNsdWRlICJzZW1vcHMuaCIuCi0KLVR1ZSBNYXIgMTEgMTQ6MzA6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9zaW1jYWNoZSk6IEZpeCB0aGlua28gaW4gcHJpbnRmIHRleHQuCi0KLQkqIHNpbWRlZnMuaCAoc3RydWN0IGFyZ2J1Zik6IEFkZCBtZW1iZXIgdG8gZm10XzIwIHNvIGl0J3Mgbm90IGVtcHR5LgotCi1Nb24gTWFyIDEwIDExOjA2OjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmMgKGhfY3JfZ2V0KTogUmV3cml0ZS4KLQkoaF9jcl9zZXQpOiBSZXdyaXRlLgotCSogc2VtLXN3aXRjaC5jIChydGUpOiBiY2FycnkgcmVuYW1lZCB0byBiY29uZC4KLQkqIHNlbWFudGljcy5jIChydGUpOiBMaWtld2lzZS4KLQkqIHNpbWRlZnMuaCAoQ1BVX1NUQVRFKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy5pbiAoSEFWRV9TWVNfVElNRV9IKTogQWRkLgotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc3lzL3RpbWUuaC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiB1dGlscy5jOiBJbmNsdWRlIHN5cy90aW1lLmggaWYgcHJlc2VudC4KLQotCSogY29tbW9uLmMgKHNpbV9wYXJzZV9hcmdzKTogQWNjb3VudCBmb3IgTlVMTCB0ZXJtaW5hdGluZyBlbnRyeQotCWluIGxvbmdfb3B0aW9ucyB0YWJsZS4KLQotCSogZ2VubWxvb3Auc2ggKFJVTl9GQVNUX1ApOiBEb24ndCBydW4gZmFzdCBpZiB0cmFjaW5nLgotCUFsd2F5cyB1c2UgY2FjaGUgaWYgY29uZmlndXJlZCBpbi4KLQkqIG1haW5sb29wLmluIChkb19leHRyYWN0X2luc257MTYsMzJ9KTogTmV3IGZ1bmN0aW9ucy4KLQkobm9ybWFsLGZhc3QpOiBDYWxsIHRoZW0uICBIYW5kbGUgc3RhcnRpbmcgaW4gbGVmdCBzbG90LgotCSogc2ltY2FjaGUuYyAoc2ltY2FjaGVfb3B0aW9uX2hhbmRsZXIpOiBEaXNhbGxvdyAtYzAuCi0JKiBzZW0tc3dpdGNoLmMgKFRSQUNFX1JFU1VMVCk6IFJlZGVmaW5lIHNvIG5vIHRyYWNpbmcuCi0KLQkqIHByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9zaW1jYWNoZSk6IEZpeCBwZXJjZW50YWdlIGNhbGMuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFX0RFUFMpOiBEZWxldGUgc2ltY29tbW9uLmguCi0KLVN1biBNYXIgIDkgMjA6NDI6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyk6IEFkZCBkZWxpbWl0ZXJzIGZvci4KLQkoTTMyUl9JTkNMVURFX0RFUFMpOiBVc2UgY3B1LXNpbS5oIGluc3RlYWQgb2YgbTMyci1zaW0uaC4KLQlBZGQgbW9kLWxpc3QuaC4KLQkobXJ1bi5vKTogRG9uJ3QgZGVwZW5kIG9uIE0zMlJfSU5DTFVERV9ERVBTLgotCShzaW0taWYubyxtMzJyLm8sdXRpbHMubyk6IExpa2V3aXNlLgotCShjb21tb24ubyk6IERvbid0IGV4cGxpY2l0bHkgZGVwZW5kIG9uIG1vZC1saXN0LmguCi0JKG1haW5sb29wLmMpOiBQYXNzIENQVSB0byBnZW5tbG9vcC5zaC4KLQkoc3RhbXAtbW9kdWxlcyk6IERlcGVuZCBvbiBjb25maWd1cmUuCi0JKGRlY29kZS5vKTogRGVwZW5kIG9uIGRlY29kZSxoLCBtZW1vcHMuaCwgc2Vtb3BzLmgsIGNwdS1vcGMuaC4KLQkoZXh0cmFjdC5vKTogRGVwZW5kIG9uIGRlY29kZS5oLCBtZW1vcHMuaCwgc2Vtb3BzLmguCi0JKHNlbWFudGljcy5vLHNlbWFuLWNhY2hlLm8pOiBMaWtld2lzZS4KLQkobW9kZWwubyxvcHMubyk6IERlcGVuZCBvbiBtZW1vcHMuaC4KLQkoZXh0ci1jYWNoZS5vKTogRGlzYWJsZSBidWlsZGluZyBmb3IgdGhlIG1vbWVudC4KLQotCSogc2ltY29tbW9uLmg6IERlbGV0ZSwgbW92ZSBjb250ZW50cyBpbnRvIGNnZW4tc2ltLmguCi0JKiBjZ2VuLXNpbS5oOiBEb24ndCBpbmNsdWRlIGFuc2lkZWNsLmgsYmZkLmgsc2ltZm5zLmguCi0JKFVJTlQsQ0dFTl9DQVQzKTogRGVmaW5lLgotCSh7ZXh0cmFjdCxzZW1hbnRpY31fZm5fdCk6IFJlbmFtZWQgdG8ge0VYVFJBQ1QsU0VNQU5USUN9X0ZOLgotCShkZWNvZGVfdCk6IFJlbmFtZWQgdG8gREVDT0RFLgotCi0JKiBzaW1mbnMuaDogRGVsZXRlLCBjb250ZW50cyBtb3ZlZCB0byBtZW1vcHMuaCxzZW1vcHMuaC4KLQkqIG1lbW9wcy5oOiBOZXcgZmlsZS4KLQkqIHNlbW9wcy5oOiBOZXcgZmlsZS4KLQkqIGRlY29kZS5oOiBSZW5hbWVkIGZyb20gc2VtYW50aWNzLmguCi0KLQkqIHNpbS1hcmd2Lmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKG1lbW9yeS5vLHRyYWNlLm8scHJvZmlsZS5vLHNpbWNhY2hlLm8sY29tbW9uKTogQWRkCi0JZGVwZW5kZW5jeSBvZiBzaW0tYXJndi5oLgotCi0JKiBzaW0tYWxsb2NhLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmM6IEluY2x1ZGUgaXQuCi0JKiBNYWtlZmlsZS5pbiAoY29tbW9uLm8pOiBBZGQgZGVwZW5kZW5jeS4KLQotCSogY29uZmlnLmluIChIQVZFX1RJTUVfSCxIQVZFX1NZU19SRVNPVVJDRV9IKTogQWRkLgotCShIQVZFX0dFVFJVU0FHRSxIQVZFX1RJTUUpOiBBZGQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCUNoZWNrIGZvciBoZWFkZXJzIHRpbWUuaCwgc3lzL3Jlc291cmNlLmguCi0JQ2hlY2sgZm9yIGZ1bmN0aW9ucyB0aW1lLCBnZXRydXNhZ2UuCi0JKHNpbV9saW5rX3tmaWxlcyxsaW5rc30pOiBBZGQgbGluayBjcHUtb3BjLmguCi0JKHNpbV9wcm9maWxlKTogQWRkIHNpbWNhY2hlLgotCShTSU1fQUNfUFJPRklMRSk6IEFkZCBzaW1jYWNoZSwgcHJvZmlsZS5vLgotCShzaW1jYWNoZSBtb2R1bGUpOiBEZWxldGUgZXh0ci1jYWNoZS5vIGZvciBub3cuCi0JKC0tZW5hYmxlLXNpbS1jYWNoZSk6IEFsbG93IHNwZWNpZmljYXRpb24gb2YgZGVmYXVsdCBjYWNoZSBzaXplLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogZGVjb2RlLmM6ICNpbmNsdWRlIGNnZW4tc2ltLmgsbWVtb3BzLmgsc2Vtb3BzLmgsZGVjb2RlLmgsCi0JY3B1LXNpbS5oLGNwdS1vcGMuaC4gIERvbid0IGluY2x1ZGUgbTMyci1zaW0uaC4KLQlSZWdlbmVyYXRlLgotCi0JKiBleHRyYWN0LmM6ICNpbmNsdWRlIGNnZW4tc2ltLmgsZGVjb2RlLmgsY3B1LXNpbS5oLgotCURvbid0IGluY2x1ZGUgbTMyci1zaW0uaC4KLQkoKik6IERlZmluZS9VbmRlZiBGTEQgbWFjcm8uICBVc2UgaXQgdG8gcmVmZXJlbmNlIEFSR0JVRi4KLQlTaW1wbGlmeSBwcm9maWxpbmcgdGVzdCB3aXRoIFBST0ZJTEVfTU9ERUxfUC4KLQkobXZmYyxtdnRjKTogRml4IGFjY2VzcyBvZiBjb250cm9sIHJlZ2lzdGVycy4KLQkqIHNlbWFudGljLmM6ICNpbmNsdWRlIGNnZW4tc2ltLmgsbWVtb3BzLmgsc2Vtb3BzLmgsZGVjb2RlLmgsY3B1LXNpbS5oLgotCURvbid0IGluY2x1ZGUgbTMyci1zaW0uaC4KLQkoKik6IERlZmluZS9VbmRlZiBGTEQgbWFjcm8uICBVc2UgaXQgdG8gcmVmZXJlbmNlIEFSR0JVRi4KLQlTaW1wbGlmeSBwcm9maWxpbmcgdGVzdCB3aXRoIFBST0ZJTEVfTU9ERUxfUC4KLQkobXZmYyxtdnRjKTogRml4IGFjY2VzcyBvZiBjb250cm9sIHJlZ2lzdGVycy4KLQotCSogc2VtLXN3aXRjaC5jOiBOZXcgZmlsZSwgZm9yIEdDQyBjb21wdXRlZCBnb3RvIHN1cHBvcnQuCi0KLQkqIGdlbm1sb29wLnNoOiBBZGQgI2luY2x1ZGUncyBvZiBiZmQuaCxjYWxsYmFjay5oLGNnZW4tc2ltLmgsCi0JbWVtb3BzLmgsc2Vtb3BzLmgsdHJhY2UuaCxjcHUtc2ltLmguCi0JKFJVTl9GQVNUX1ApOiBDaGFuZ2UgZGVmYXVsdCB0byBydW4gZmFzdCBpZiBjYWNoZSBzaXplID4gMAotCWFuZCBub3QgcHJvZmlsaW5nLgotCShzaW1fbWFpbl9sb29wKTogUmVjb3JkIGV4ZWN1dGlvbiB0aW1lLgotCVJlY29yZCBpbnN0cnVjdGlvbiBjb3VudCBldmVuIGluIGZhc3QgbW9kZS4KLQkoaW5pdCk6IEFsbG93IGNwdSB0byBwcm92aWRlIGluaXQgY29kZSBpbiBtYWlubG9vcC5pbi4KLQkoRkFTVCk6IERlZmluZSBhcyAwIG9yIDEgZGVwZW5kaW5nIG9uIGZhc3QgbW9kZS4KLQkqIG1haW5sb29wLmluIChub3JtYWwpOiBDb21iaW5lIHdpdGggZmFzdCBjYXNlLgotCUFkZCBzdXBwb3J0IGZvciBHQ0MgY29tcHV0ZWQgZ290b3MuICBDb3VudCBzaW1jYWNoZSBoaXRzL21pc3Nlcy4KLQkoaW5pdCk6IEluaXRpYWxpemUgInN3aXRjaCIgbGFiZWxzIGlmIEdOVUMuCi0KLQkqIGNnZW4tdXRpbHMuaW46IERvbid0IGluY2x1ZGUgb3Bjb2RlL2NnZW4uaC4KLQlJbmNsdWRlIGNnZW4tc2ltLmgsIGNwdS1vcGMuaC4KLQkqIGNvbW1vbi5jOiBEb24ndCBpbmNsdWRlIHNpbWNvbW1vbi5oLG1vZC1saXN0LmguICBJbmNsdWRlIGNnZW4tc2ltLmguCi0JKiBtMzJyLXNpbS5oOiBEb24ndCBpbmNsdWRlIG1vZC1saXN0LmgKLQkoUlVOX0ZBU1RfUCk6IERlbGV0ZS4KLQkqIG0zMnIuYzogRG9uJ3QgaW5jbHVkZSBwcm9maWxlLmguICAjaW5jbHVkZSBhbnNpZGVjbC5oLGNnZW4tc2ltLmgsCi0Jc2Vtb3BzLmgsbWVtb3J5LmgsdHJhY2UuaAotCShoX2NyX2dldCxoX2NyX3NldCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBtZW1vcnkuYzogI2luY2x1ZGUgY2dlbi1zaW0uaCxjYWxsYmFjay5oLgotCSogb3BzLmM6IERvbid0IGluY2x1ZGUgcHJvZmlsZS5oLG0zMnItc2ltLmguCi0JSW5jbHVkZSBjZ2VuLXNpbS5oLG1lbW9wcy5oLGNwdS1zaW0uaC4KLQkoTUVNT1BTX0RFRklORV9JTkxJTkUpOiBSZW5hbWVkIGZyb20gU0lNRk5TX0RFRklORV9JTkxJTkUuCi0JKiB0cmFjZS5jOiBJbmNsdWRlIGNnZW4tc2ltLmgsY3B1LW9wYy5oLgotCSogdHJhY2UuaCAodHJhY2VfaW5zbl97aW5pdCxmaW5pfSk6IERlY2xhcmUuCi0KLQkqIG1vZGVsLmM6IERvbid0IGluY2x1ZGUgc2lnbmFsLmgsc3RkbGliLmgsbTMyci1zaW0uaC4KLQlJbmNsdWRlIGNnZW4tc2ltLmgsY3B1LXNpbS5oLGNwdS1vcGMuaC4KLQlSZWdlbmVyYXRlIHRvIGdldCBuZXcgaW5zbiBhbGlhc2VzLgotCi0JKiBtcnVuLmM6ICNpbmNsdWRlICJhbnNpZGVjbC5oIi4KLQkoU1RBVEUpOiBVc2Ugc3RydWN0IHNpbV9zdGF0ZSBpbnN0ZWFkLgotCi0JKiBwcm9maWxlLmM6IFN1cnJvdW5kICNpbmNsdWRlIDxzdGRsaWIuaD4gd2l0aCBIQVZFX1NURExJQl9ILgotCURvbid0IGluY2x1ZGUgc2ltY29tbW9uLmguICBJbmNsdWRlIGNnZW4tc2ltLmgsY3B1LW9wYy5oLgotCShQUk9GSUxFX3tSRUFELFdSSVRFfV9NQVNLKTogUmVwbGFjZSB3aXRoIFBST0ZJTEVfTUVNT1JZX01BU0suCi0JKHByb2ZpbGVfcHJpbnRfc2ltY2FjaGUpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2ZpbGVfcHJpbnQpOiBDYWxsIGl0LiAgUHJpbnQgc2ltdWxhdG9yIHNwZWVkIHN0YXRzLgotCSogcHJvZmlsZS5oIChQUk9GSUxFX3tSRUFELFdSSVRFfV9NQVNLKTogUmVwbGFjZSB3aXRoCi0JUFJPRklMRV9NRU1PUllfTUFTSy4KLQkoTU9EVUxFX1BST0ZJTEVfU0lNQ0FDSEVfUCk6IERlZmluZS4KLQkoUFJPRklMRV9TSU1DQUNIRV9NQVNLKTogRGVmaW5lLgotCShQUk9GSUxFX0NPVU5UKTogTmV3IG1lbWJlcnMgdG90YWxfaW5zbl9jb3VudCxleGVjX3RpbWUuCi0JTmV3IG1lbWJlcnMgc2ltY2FjaGVfaGl0cyxzaW1jYWNoZV9taXNzZXMuCi0JKFBST0ZJTEVfU0lNQ0FDSEVfe0hJVFMsTUlTU0VTfSk6IERlZmluZS4KLQkoUFJPRklMRV9NT0RFTF9QKTogTmV3IG1hY3JvLgotCShQUk9GSUxFX0NPVU5UX1NJTUNBQ0hFX3tISVQsTUlTU30pOiBOZXcgbWFjcm9zLgotCi0JKiBzaW0taWYuYzogU3Vycm91bmQgI2luY2x1ZGUgPHN0ZGxpYi5oPiB3aXRoIEhBVkVfU1RETElCX0guCi0JRG9uJ3QgaW5jbHVkZSBzaW1jb21tb24uaCxtMzJyLXNpbS5oLiAgSW5jbHVkZSBjZ2VuLXNpbS5oLGNwdS1zaW0uaC4KLQkoc2ltX3Jlc3VtZSk6IFVzZSBVU0lOR19TSU1DQUNIRV9QIGluc3RlYWQgb2YgUlVOX0ZBU1RfUC4KLQkoc2ltX2luZm8pOiBQYXNzIHZlcmJvc2UgdG8gcHJvZmlsZV9wcmludC4KLQotCSogc2ltY2FjaGUuYzogSW5jbHVkZSBjZ2VuLXNpbS5oLGNhbGxiYWNrLmguCi0JKFVTSU5HX1NJTUNBQ0hFX1ApOiBSZXBsYWNlIHdpdGggU0lNQ0FDSEVfUC4KLQkoc2ltY2FjaGVfb3B0aW9uX2hhbmRsZXIpOiBFbnN1cmUgY2FjaGUgc2l6ZSBhdCBsZWFzdCAyLgotCUFsbG93IGNvbmZpZyB0aW1lIHNwZWNpZmljYXRpb24gb2YgZGVmYXVsdCBjYWNoZSBzaXplLgotCSogc2ltY2FjaGUuaCAoc3RydWN0IHNpbWNhY2hlKTogU3VwcG9ydCBHQ0MgY29tcHV0ZWQgZ290b3MuCi0JKFNJTUNBQ0hFX0RFRkFVTFRfQ0FDSEVfU0laRSk6IFVTZSBDT05GSUdfU0lNX0NBQ0hFX1NJWkUgaWYgZGVmaW5lZC4KLQkoVVNJTkdfU0lNQ0FDSEVfUCk6IE5ldyBtYWNyby4KLQotCSogc2ltZGVmcy5oOiBEb24ndCBpbmNsdWRlIG0zMnItb3BjLmguCi0JKENHRU5fTUFYX1NJTV9JTlNOUyk6IERlZmluZS4KLQkoQ1BVX1NUQVRFKTogUmVnZW5lcmF0ZS4KLQkoQVJHQlVGKTogUmVnZW5lcmF0ZS4KLQkoZXh0cmFjdCxzZW1hbnRpYyBoYW5kbGVyIGRlY2xzKTogRGVsZXRlLCBtb3ZlZCB0byBkZWNvZGUuaC4KLQotCSogdGNvbmZpZy5pbjogRG9uJ3QgaW5jbHVkZSBjZ2VuLXNpbS5oLG0zMnItc2ltLmguCi0JKFVTRV9TRU1fU1dJVENIKTogRGVmaW5lLgotCi0JKiB1dGlscy5jOiBJbmNsdWRlIGJmZC5oLHRpbWUuaCxzeXMvcmVzb3VyY2UuaC4KLQkoc2ltX3RpbWVfZ2V0LHNpbV90aW1lX2VsYXBzZWQpOiBOZXcgZnVuY3Rpb25zLgotCSogY2dlbi1zaW0uaCAoU0lNX1RJTUUsc2ltX3RpbWVfZ2V0LHNpbV90aW1lX2VsYXBzZWQpOiBEZWNsYXJlLgotCi1GcmkgSmFuIDMxIDIwOjI1OjA2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IEhhbmRsZSBpMzg2LXdpbmRvd3MuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogbW9kZWwuYzogI2luY2x1ZGUgPHN0ZGxpYi5oPi4KLQkqIHNpbWNhY2hlLmM6ICNpbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKiBzaW1jb21tb24uaCAoYWxsb2NhKTogSGFuZGxlIGkzODYtd2luZG93cy4KLQotCSogY29tbW9uLmM6ICNpbmNsdWRlIGxpYmliZXJ0eS5oLgotCShzaW1fc2lnbmFsX3RvX2hvc3QpOiBSZXR1cm4gNSBpZiB3aW5nZGIuCi0KLU1vbiBKYW4gMjcgMTU6MjI6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX2NhY2hlKTogRW5hYmxlZCBieSBkZWZhdWx0IG5vdywgcGFzcyBkZWZhdWx0Ci0JY2FjaGUgc2l6ZSB0byAtLWVuYWJsZS1zaW0tY2FjaGUuCi0JKiBzaW1jYWNoZS5jIChzaW1jYWNoZV9vcHRpb25faGFuZGxlcik6IEFsbG93IC1jIDAuCi0KLQkqIHNpbWRlZnMuaCxzaW1mbnMuaDogUmVnZW5lcmF0ZQotCSogZGVjb2RlLmMsZXh0cmFjdC5jLG1vZGVsLmMsb3BzLmMsc2VtYW50aWNzLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBKYW4gMjEgMTY6MjE6MDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQlBZGQgbW9kZWwgcHJvZmlsaW5nIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSAtLWVuYWJsZS1zaW0tbW9kZWwuCi0JKHNpbV9wcm9maWxlKTogQWRkIG1vZGVsLgotCSogTWFrZWZpbGUuaW4gKG1vZGVsLm8pOiBBZGQgcnVsZS4KLQkqIGNnZW4tc2ltLmggKFVOSVQsSU5TTl9USU1JTkcsTUFDSCxNT0RFTCk6IE5ldyB0eXBlcy4KLQkqIGV4dHJhY3QuYyAoKik6IEFkZCBtb2RlbCBwcm9maWxpbmcgc3VwcG9ydC4KLQkqIG0zMnIuYyAobW9kZWxfbWFya197Z2V0LHNldH1faF9ncik6IE5ldyBmdW5jdGlvbnMuCi0JKG1vZGVsX21hcmtfe2J1c3ksdW5idXN5fV9yZWcpOiBOZXcgZnVuY3Rpb25zLgotCSogcHJvZmlsZS5jIChwcm9maWxlX29wdGlvbl9oYW5kbGVyKTogUmVjb2duaXplIC0tcHJvZmlsZSBtb2RlbC4KLQkocHJvZmlsZV9wcmludF9tb2RlbCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvZmlsZV9wcmludCk6IENhbGwgaXQuCi0JKiBwcm9maWxlLmggKE1PRFVMRV9wcm9maWxlX21vZGVsLE1PRFVMRV9QUk9GSUxFX01PREVMX1ApOiBEZWZpbmUuCi0JKFBST0ZJTEVfTU9ERUxfTUFTSyxQUk9GSUxFX0xBQkVMX1dJRFRIKTogRGVmaW5lLgotCShQUk9GSUxFX0NPVU5UKTogTmV3IG1lbWJlcnMgY3ljbGVfY291bnQsY3RpX3N0YWxsX2NvdW50LAotCWxvYWRfc3RhbGxfY291bnQsdGFrZW5fY291bnQsdW50YWtlbl9jb3VudC4KLQkqIHNlbWFudGljcy5jICgqKTogQWRkIG1vZGVsIHByb2ZpbGluZyBzdXBwb3J0LgotCSogc2ltY29tbW9uLmggKHN0cnVjdCBzaW1fc3RhdGUpOiBOZXcgbWVtYmVycyBtYWNoLG1vZGVsLgotCSogc2ltZGVmcy5oIChDUFVfUFJPRklMRSxNT0RFTF9UWVBFLFVOSVRfVFlQRSk6IE5ldyB0eXBlLgotCShNQVhfTU9ERUxTLE1BWF9VTklUUyk6IERlZmluZS4KLQkqIHRjb25maWcuaW4gKFNUQVRFX0VYVFJBX01FTUJFUlMpOiBBZGQgY3B1X3Byb2ZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFX0RFUFMpOiBBZGQgJChTSU1fTU9EVUxFU19IRFJTKS4KLQkoc3RhbXAtbW9kdWxlcyk6IERlcGVuZCBvbiBnZW5tb2RsaXN0LnNoLgotCSogY29tbW9uLmMgKHN0YW5kYXJkX29wdGlvbnMpOiBBZGQgLS1tYXgtaW5zbnMuCi0JKGNvcHlfYXJndik6IE5ldyBmdW5jdGlvbi4KLQkqIHRjb25maWcuaW4gKFNJTV9IQVZFX01BWF9JTlNOUyk6IERlZmluZS4KLQkqIGdlbm1sb29wLnNoOiBBbGxvdyBtYWlubG9vcC5pbiB0byBjb250YWluIHN1cHBvcnQgY29kZS4KLQkqIG1haW5sb29wLmluOiBNb3ZlIGRvX2luc24xNixkb19pbnNuMzIgaGVyZS4KLQkqIG0zMnIuYyAoZG9fdHJhcCk6IEhhbmRsZSBTWVNfYXJndmxlbixTWVNfYXJndixTWVNfcmVhZC4KLQkqIHNpbS1pZi5jIChzaW1fb3Blbik6IERvbid0IHNldCBtYXggaW5zbiBjb3VudC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFNhdmUgYXJndixlbnZwLgotCSogc2ltY29tbW9uLmggKHN0cnVjdCBzaW1fc3RhdGUpOiBOZXcgbWVtYmVycyBhcmd2LGVudnAuCi0JKiBzaW1kZWZzLmggKFtHU11FVFRXSSxbR1NdRVRUVVdJLFtHU11FVFRBSSk6IERlZmluZS4KLQkoW0dTXUVUTUVNV0ksW0dTXUVUTUVNVVdJLFtHU11FVE1FTUFJKTogRGVmaW5lLgotCShBUkdCVUYpOiBOZXcgbWVtYmVycyBoX2dyX2dldCwgaF9ncl9zZXQuCi0JKiB0cmFjZS5jICh0cmFjZV9pbnNuX2luaXQsdHJhY2VfaW5zbl9maW5pKTogTmV3IGZ1bmN0aW9ucy4KLQkodHJhY2VfcHJpbnRmKTogUHJpbnQgdG8gYnVmZmVyLCBvdXRwdXQgbGF0ZXIgYnkgdHJhY2VfaW5zbl9maW5pLgotCSogdHJhY2UuaCAoVFJBQ0VfSU5TTl97SU5JVCxGSU5JfSk6IERlZmluZS4KLQotVGh1IERlYyAxOSAxNjowMTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKEFDX0ZVTkNfQUxMT0NBKTogQ2FsbC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy5oIChIQVZFX0FMTE9DQV9IKTogQWRkLgotCSogc2ltY29tbW9uLmg6IEFkZCBhbGxvY2Egc3VwcG9ydC4KLQkoREVDTEFSRV9NT0RVTEVfSU5TVEFMTF9IQU5ETEVSKTogRGVmaW5lLgotCShERUNMQVJFX09QVElPTl9IQU5ETEVSKTogRGVmaW5lLgotCShNRU1fRk4pOiBEZWNsYXJlIHVzaW5nIFBBUkFNUy4KLQkoREVDTEFSRV9NRU1fRk4pOiBEZWZpbmUuCi0JKiB0cmFjZS5jICh0cmFjZV9yZXN1bHQpOiBUd2VhayBmb3IgIVNUREMuCi0JKiBjZ2VuLXNpbS5oIChVRElfRk5fU1VQUE9SVCk6IERlZmluZSBpZiAhIEhBVkVfTE9OR0xPTkcuCi0JKiBjZ2VuLXV0aWxzLmluIChkaXNhc21fc3ByaW50Zik6IEZpeCB2YV9hcmcgY2FsbCBpbiAhU1REQyBjYXNlLgotCSogY29tbW9uLmMgKHNpbV9wcmludF9oZWxwX2ZuKTogVXNlIFBBUkFNUy4KLQkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBGaXggZGVjbCBmb3IgIVNUREMgc3lzdGVtcy4KLQkqIG1lbW9yeS5jOiAjaW5jbHVkZSA8c3RkaW8uaD4KLQkobWVtX2ZsYXRfe2luc3RhbGwsaW5pdCx1bmluc3RhbGx9KTogRml4IGRlY2wgZm9yICFTVERDIHN5c3RlbXMuCi0JKG1lbV9mbGF0X3tyZWFkLHdyaXRlfSxtZW1fZmxhdF9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgotCSogcHJvZmlsZS5jIChwcm9maWxlX2luc3RhbGwpOiBMaWtld2lzZS4KLQkocHJvZmlsZV9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgotCi1UaHUgRGVjIDE5IDExOjA2OjE5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzZW1hbnRpY3MuYyAoKik6IERvbid0IHN1ZmZpeCBiaWcgdW5zaWduZWQgbnVtYmVycyB3aXRoICJVIi4KLQlQcmVmaXggdGhlbSB3aXRoIDB4IGluc3RlYWQuCi0KLQkqIGNnZW4tc2ltLmggKERJX0ZOX1NVUFBPUlQpOiBEZWZpbmUgaWYgISBIQVZFX0xPTkdMT05HLgotCShTTEFESSxTUkFESSxDT05WU0lESSxDT05WRElTSSk6IERlbGV0ZSwgbW92ZWQgdG8gc2ltZm5zLmguCi0JKiBzZW1hbnRpY3MuYyAobWFjaGksbWFjbG8sbWFjd2hpLG1hY3dsbyxtdWxoaSxtdWxsbyk6IEltcGxlbWVudC4KLQkobXVsd2hpLG11bHdsbyxtdnRhY2hpLG12dGFjbG8scmFjLHJhY2gpOiBJbXBsZW1lbnQuCi0JKiBzaW1mbnMuaDogQWRkIGRlY2xzIGZvciBmdW5jdGlvbmFsIERJLFVESSxTRixERixYRixURiBzdXBwb3J0LgotCUFkZCBzdXBwb3J0IGZvciBib29sZWFuIGFuZC9vci4KLQkqIHV0aWxzLmM6IFJlZG8gbmFtaW5nIG9mIERJIGZ1bmN0aW9uYWwgc3VwcG9ydC4KLQkoQU5EREksT1JESSxBRERESSxNVUxESSxHRURJLExFREksQ09OVkhJREkpOiBOZXcgZnVuY3Rpb25zLgotCi1UdWUgRGVjIDE3IDEyOjU3OjQ4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBEaXJlY3RvcnkgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL01ha2VmaWxlLmluIGIvc2ltL20zMnIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjk2ZTUuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotIyBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgbTMyciBzaW11bGF0b3IKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLU0zMlJfT0JKUyA9IG0zMnIubyBjcHUubyBkZWNvZGUubyBzZW0ubyBtb2RlbC5vIG1sb29wLm8KLU0zMlJYX09CSlMgPSBtMzJyeC5vIGNwdXgubyBkZWNvZGV4Lm8gbW9kZWx4Lm8gbWxvb3B4Lm8KLQotQ09ORklHX0RFVklDRVMgPSBkdi1zb2Nrc2VyLm8KLUNPTkZJR19ERVZJQ0VTID0KLQotU0lNX09CSlMgPSBcCi0JJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCi0Jc2ltLWNwdS5vIFwKLQlzaW0taGxvYWQubyBcCi0Jc2ltLWhydy5vIFwKLQlzaW0tbW9kZWwubyBcCi0Jc2ltLXJlZy5vIFwKLQljZ2VuLXV0aWxzLm8gY2dlbi10cmFjZS5vIGNnZW4tc2NhY2hlLm8gXAotCWNnZW4tcnVuLm8gc2ltLXJlYXNvbi5vIHNpbS1lbmdpbmUubyBzaW0tc3RvcC5vIFwKLQlzaW0taWYubyBhcmNoLm8gXAotCSQoTTMyUl9PQkpTKSBcCi0JJChNMzJSWF9PQkpTKSBcCi0JdHJhcHMubyBkZXZpY2VzLm8gXAotCSQoQ09ORklHX0RFVklDRVMpCi0KLSMgRXh0cmEgaGVhZGVycyBpbmNsdWRlZCBieSBzaW0tbWFpbi5oLgotU0lNX0VYVFJBX0RFUFMgPSBcCi0JJChDR0VOX0lOQ0xVREVfREVQUykgXAotCWFyY2guaCBjcHVhbGwuaCBtMzJyLXNpbS5oICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL20zMnItZGVzYy5oCi0KLVNJTV9FWFRSQV9DRkxBR1MgPQotCi1TSU1fUlVOX09CSlMgPSBucnVuLm8KLVNJTV9FWFRSQV9DTEVBTiA9IG0zMnItY2xlYW4KLQotIyBUaGlzIHNlbGVjdHMgdGhlIG0zMnIgbmV3bGliL2xpYmdsb3NzIHN5c2NhbGwgZGVmaW5pdGlvbnMuCi1OTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9tMzJyCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLWFyY2ggPSBtMzJyCi0KLXNpbS1pZi5vOiBzaW0taWYuYyAkKFNJTV9NQUlOX0RFUFMpICQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWNvcmUuaAotCi1hcmNoLm86IGFyY2guYyAkKFNJTV9NQUlOX0RFUFMpCi0KLXRyYXBzLm86IHRyYXBzLmMgdGFyZy12YWxzLmggJChTSU1fTUFJTl9ERVBTKQotZGV2aWNlcy5vOiBkZXZpY2VzLmMgJChTSU1fTUFJTl9ERVBTKQotCi0jIE0zMlIgb2JqcwotCi1NMzJSQkZfSU5DTFVERV9ERVBTID0gXAotCSQoQ0dFTl9NQUlOX0NQVV9ERVBTKSBcCi0JY3B1LmggZGVjb2RlLmggZW5nLmgKLQotbTMyci5vOiBtMzJyLmMgJChNMzJSQkZfSU5DTFVERV9ERVBTKQotCi0jIEZJWE1FOiBVc2Ugb2YgYG1vbm8nIGlzIHdpcC4KLW1sb29wLmMgZW5nLmg6IHN0YW1wLW1sb29wCi1zdGFtcC1tbG9vcDogJChzcmNkaXIpLy4uL2NvbW1vbi9nZW5tbG9vcC5zaCBtbG9vcC5pbiBNYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjY29tKS9nZW5tbG9vcC5zaCBcCi0JCS1tb25vIC1mYXN0IC1wYmIgLXN3aXRjaCBzZW0tc3dpdGNoLmMgXAotCQktY3B1IG0zMnJiZiAtaW5maWxlICQoc3JjZGlyKS9tbG9vcC5pbgotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgZW5nLmhpbiBlbmcuaAotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgbWxvb3AuY2luIG1sb29wLmMKLQl0b3VjaCBzdGFtcC1tbG9vcAotbWxvb3AubzogbWxvb3AuYyBzZW0tc3dpdGNoLmMgJChNMzJSQkZfSU5DTFVERV9ERVBTKQotCi1jcHUubzogY3B1LmMgJChNMzJSQkZfSU5DTFVERV9ERVBTKQotZGVjb2RlLm86IGRlY29kZS5jICQoTTMyUkJGX0lOQ0xVREVfREVQUykKLXNlbS5vOiBzZW0uYyAkKE0zMlJCRl9JTkNMVURFX0RFUFMpCi1tb2RlbC5vOiBtb2RlbC5jICQoTTMyUkJGX0lOQ0xVREVfREVQUykKLQotIyBNMzJSWCBvYmpzCi0KLU0zMlJYRl9JTkNMVURFX0RFUFMgPSBcCi0JJChDR0VOX01BSU5fQ1BVX0RFUFMpIFwKLQljcHV4LmggZGVjb2RleC5oIGVuZ3guaAotCi1tMzJyeC5vOiBtMzJyeC5jICQoTTMyUlhGX0lOQ0xVREVfREVQUykKLQotIyBGSVhNRTogVXNlIG9mIGBtb25vJyBpcyB3aXAuCi1tbG9vcHguYyBlbmd4Lmg6IHN0YW1wLXhtbG9vcAotc3RhbXAteG1sb29wOiAkKHNyY2RpcikvLi4vY29tbW9uL2dlbm1sb29wLnNoIG1sb29weC5pbiBNYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjY29tKS9nZW5tbG9vcC5zaCBcCi0JCS1tb25vIC1uby1mYXN0IC1wYmIgLXBhcmFsbGVsLXdyaXRlIC1zd2l0Y2ggc2VteC1zd2l0Y2guYyBcCi0JCS1jcHUgbTMycnhmIC1pbmZpbGUgJChzcmNkaXIpL21sb29weC5pbgotCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgZW5nLmhpbiBlbmd4LmgKLQkkKFNIRUxMKSAkKHNyY3Jvb3QpL21vdmUtaWYtY2hhbmdlIG1sb29wLmNpbiBtbG9vcHguYwotCXRvdWNoIHN0YW1wLXhtbG9vcAotbWxvb3B4Lm86IG1sb29weC5jIHNlbXgtc3dpdGNoLmMgJChNMzJSWEZfSU5DTFVERV9ERVBTKQotCi1jcHV4Lm86IGNwdXguYyAkKE0zMlJYRl9JTkNMVURFX0RFUFMpCi1kZWNvZGV4Lm86IGRlY29kZXguYyAkKE0zMlJYRl9JTkNMVURFX0RFUFMpCi1zZW14Lm86IHNlbXguYyAkKE0zMlJYRl9JTkNMVURFX0RFUFMpCi1tb2RlbHgubzogbW9kZWx4LmMgJChNMzJSWEZfSU5DTFVERV9ERVBTKQotCi1tMzJyLWNsZWFuOgotCXJtIC1mIG1sb29wLmMgZW5nLmggc3RhbXAtbWxvb3AKLQlybSAtZiBtbG9vcHguYyBlbmd4Lmggc3RhbXAteG1sb29wCi0Jcm0gLWYgdG1wLSoKLQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvUkVBRE1FIGIvc2ltL20zMnIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmMzZjUwLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVRoaXMgaXMgdGhlIG0zMnIgc2ltdWxhdG9yIGRpcmVjdG9yeS4KLQotSXQgaXMgc3RpbGwgd29yay1pbi1wcm9ncmVzcy4gIFRoZSBjdXJyZW50IHNvdXJjZXMgYXJlIHJlYXNvbmFibHkKLXdlbGwgdGVzdGVkIGFuZCBsb3RzIG9mIGZlYXR1cmVzIGFyZSBpbi4gIEhvd2V2ZXIsIHRoZXJlJ3MgbG90cwotbW9yZSB5ZXQgdG8gY29tZS4KLQotVGhlcmUgYXJlIGxvdHMgb2YgbWFjaGluZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkhCi1UaGV5IGFyZSBvbmx5IGdlbmVyYXRlZCBpZiB5b3UgY29uZmlndXJlIHdpdGggLS1lbmFibGUtY2dlbi1tYWludCwKLXNpbWlsYXIgaW4gYmVoYXZpb3VyIHRvIE1ha2VmaWxlLmluLCBjb25maWd1cmUgdW5kZXIgYXV0b21ha2UvYXV0b2NvbmYuCi0KLUZvciBkZXRhaWxzIG9uIHRoZSBnZW5lcmF0b3IsIHNlZSAuLi8uLi9jZ2VuLgotCi1kZXZvL2NnZW4gaXNuJ3QgcGFydCBvZiB0aGUgY29tcC10b29scyBtb2R1bGUgeWV0LgotWW91J2xsIG5lZWQgdG8gY2hlY2sgaXQgb3V0IG1hbnVhbGx5IChhbHNvIGFraW4gdG8gYXV0b21ha2UvYXV0b2NvbmYpLgpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvVE9ETyBiL3NpbS9tMzJyL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2RhYWMuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLSBoZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXMgcmV2aXNpdAotLSBob29rcyBjbGVhbnVwCi0tIHRlc3RzdWl0ZXMKLS0gRklYTUUncwotLSBtZW1vcnkgYWNjZXNzZXMgc3RpbGwgdGVzdCBpZiBwcm9maWxpbmcgaXMgb24gZXZlbiBpbiBmYXN0IG1vZGUKLS0gZmlsbCBub3AgY291bnRpbmcgZG9uZSBldmVuIGluIGZhc3QgbW9kZQotLSBoYXZlIHNlbWFudGljIGNvZGUgdXNlIEcvU0VUX0hfRk9PIGlmIG5vdCBkZWZhdWx0IFtpbmNsIGZ1bi1hY2Nlc3NdCi0tIGhhdmUgRy9TRVRfSF9GT08gbWFjcm9zIGNhbGwgZnVuY3Rpb24gaWYgZnVuLWFjY2VzcwotLSAtLT4gY2FuIGFsd2F5cyB1c2UgRy9TX0hfRk9PIG1hY3JvcwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvYWNjb25maWcuaCBiL3NpbS9tMzJyL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg3YTEuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvYXJjaC5jIGIvc2ltL20zMnIvYXJjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUxMDEwLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2FyY2guYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFNpbXVsYXRvciBzdXBwb3J0IGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotY29uc3QgTUFDSCAqc2ltX21hY2hzW10gPQotewotI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgotICAmIG0zMnJfbWFjaCwKLSNlbmRpZgotI2lmZGVmIEhBVkVfQ1BVX00zMlJYRgotICAmIG0zMnJ4X21hY2gsCi0jZW5kaWYKLSAgMAotfTsKLQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvYXJjaC5oIGIvc2ltL20zMnIvYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzczYjFhLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2FyY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIFNpbXVsYXRvciBoZWFkZXIgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgTTMyUl9BUkNIX0gKLSNkZWZpbmUgTTMyUl9BUkNIX0gKLQotI2RlZmluZSBUQVJHRVRfQklHX0VORElBTiAxCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1vZGVsIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBtb2RlbF90eXBlIHsKLSAgTU9ERUxfTTMyUl9ELCBNT0RFTF9URVNULCBNT0RFTF9NMzJSWCwgTU9ERUxfTUFYCi19IE1PREVMX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX01PREVMUyAoKGludCkgTU9ERUxfTUFYKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciB1bml0IHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSB1bml0X3R5cGUgewotICBVTklUX05PTkUsIFVOSVRfTTMyUl9EX1VfU1RPUkUsIFVOSVRfTTMyUl9EX1VfTE9BRCwgVU5JVF9NMzJSX0RfVV9DVEkKLSAsIFVOSVRfTTMyUl9EX1VfTUFDLCBVTklUX00zMlJfRF9VX0NNUCwgVU5JVF9NMzJSX0RfVV9FWEVDLCBVTklUX1RFU1RfVV9FWEVDCi0gLCBVTklUX00zMlJYX1VfU1RPUkUsIFVOSVRfTTMyUlhfVV9MT0FELCBVTklUX00zMlJYX1VfQ1RJLCBVTklUX00zMlJYX1VfTUFDCi0gLCBVTklUX00zMlJYX1VfQ01QLCBVTklUX00zMlJYX1VfRVhFQywgVU5JVF9NQVgKLX0gVU5JVF9UWVBFOwotCi0jZGVmaW5lIE1BWF9VTklUUyAoMikKLQotI2VuZGlmIC8qIE0zMlJfQVJDSF9IICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci9jb25maWcuaW4gYi9zaW0vbTMyci9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjNiODYuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLwotI3VuZGVmIFdPUkRTX0JJR0VORElBTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vbTMyci9jb25maWd1cmUgYi9zaW0vbTMyci9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFhZDU1NzQuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDM0MSArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1pbmxpbmU9aW5saW5lcwkJU3BlY2lmeSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGlubGluZWQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY2dlbi1tYWludFs9RElSXSAgICBidWlsZCBjZ2VuIGdlbmVyYXRlZCBmaWxlcyIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzMzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwMjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIzOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI3OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5ODE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwMjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNDI6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3NTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTEwOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0MzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA4OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjkzOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzUwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzU1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDg6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDE6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTU4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTkxOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzQ6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5NjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjk6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0OTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY4OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzk1OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyMzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDU4OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTg3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYyMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Mjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzY1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODU1OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODgzOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk2MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDAyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEyMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTc2OiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjM6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTg6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDQwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjI6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi0KLXdpcmVfZW5kaWFuPSJCSUdfRU5ESUFOIgotZGVmYXVsdF9lbmRpYW49IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0tZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSBlbHNlCi0gICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JIGVsc2UKLQkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLSAgZWxzZQotICAgIHNpbV9lbmRpYW49Ci0gIGZpCi1maQotZmkKLQotd2lyZV9hbGlnbm1lbnQ9IlNUUklDVF9BTElHTk1FTlQiCi1kZWZhdWx0X2FsaWdubWVudD0iIgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7Ci0gIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLQkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyMzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY0MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpCi1maQotCi0KLWRlZmF1bHRfc2ltX3NjYWNoZT0iMTYzODQiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXNjYWNoZSBvciAtLWRpc2FibGUtc2ltLXNjYWNoZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc2NhY2hlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc2NhY2hlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iOzsKLSAgbm8pCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9MCIgOzsKLSAgWzAtOV0qKSBzaW1fY2FjaGU9JHtlbmFibGV2YWx9OzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiQmFkIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zY2FjaGUiIiAxPiYyOyBleGl0IDE7IH07Ci0Jc2ltX3NjYWNoZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NjYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2NhY2hlIHNpemUgPSAkc2ltX3NjYWNoZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iCi1maQotCi0KLQotZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbD0ibTMyci9kIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIG9yIC0tZGlzYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVmYXVsdF9tb2RlbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJNaXNzaW5nIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIiIgMT4mMjsgZXhpdCAxOyB9OzsKLSAgKikJc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZW5hYmxldmFsfVwiJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWZhdWx0X21vZGVsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBkZWZhdWx0IG1vZGVsID0gJHNpbV9kZWZhdWx0X21vZGVsIiA2PiYxCi1maQotZWxzZQotICBzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsfVwiJyIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVudmlyb25tZW50IG9yIC0tZGlzYWJsZS1zaW0tZW52aXJvbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Vudmlyb25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW52aXJvbm1lbnQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYWxsIHwgQUxMKSAgICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiOzsKLSAgdXNlciB8IFVTRVIpICAgICAgICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1VU0VSX0VOVklST05NRU5UIjs7Ci0gIHZpcnR1YWwgfCBWSVJUVUFMKSAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VklSVFVBTF9FTlZJUk9OTUVOVCI7OwotICBvcGVyYXRpbmcgfCBPUEVSQVRJTkcpIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPU9QRVJBVElOR19FTlZJUk9OTUVOVCI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWVudmlyb25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OwotICAgICAgIHNpbV9lbnZpcm9ubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Vudmlyb25tZW50IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gZW52aXJvbm1lbnQgPSAkc2ltX2Vudmlyb25tZW50IiA2PiYxCi1maQotZWxzZQotICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1BTExfRU5WSVJPTk1FTlQiCi1maQotCi0KLWRlZmF1bHRfc2ltX2lubGluZT0iIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pbmxpbmUgb3IgLS1kaXNhYmxlLXNpbS1pbmxpbmUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2lubGluZSIKLSAgc2ltX2lubGluZT0iIgotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLSAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKLSAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9DX0lOTElORSI7OwotICAxKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1JTkxJTkVfTE9DQUxTIjs7Ci0gICopIGZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotICAgICAgIG5ld19mbGFnPSIiCi0gICAgICAgY2FzZSAiJHgiIGluCi0JICpfSU5MSU5FPSopCW5ld19mbGFnPSItRCR4Ijs7Ci0JICo9KikJCW5ld19mbGFnPWBlY2hvICIkeCIgfCBzZWQgLWUgInMvPS9fSU5MSU5FPS8iIC1lICJzL14vLUQvImA7OwotCSAqX0lOTElORSkJbmV3X2ZsYWc9Ii1EJHg9QUxMX0NfSU5MSU5FIjs7Ci0JICopCQluZXdfZmxhZz0iLUQkeCIiX0lOTElORT1BTExfQ19JTkxJTkUiOzsKLSAgICAgICBlc2FjCi0gICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgotCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCi0gICAgICAgZWxzZQotCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCi0gICAgICAgZmkKLSAgICAgZG9uZTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgaWYgdGVzdCB4IiRHQ0MiICE9ICJ4IiAtYSB4IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIgIT0gIngiIDsgdGhlbgotICAgIHNpbV9pbmxpbmU9IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIKLSAgICBpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCi0gICAgZmkKLSAgZWxzZQotICAgIHNpbV9pbmxpbmU9IiIKLSAgZmkKLWVsc2UKLSAgc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotZmkKLWZpCi0KLQotY2dlbl9tYWludD1ubwotY2dlbj1ndWlsZQotY2dlbmRpcj0nJChzcmNkaXIpLy4uLy4uL2NnZW4nCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2dlbi1tYWludCBvciAtLWRpc2FibGUtY2dlbi1tYWludCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jZ2VuX21haW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jZ2VuX21haW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJY2dlbl9tYWludD15ZXMgOzsKLSAgbm8pCWNnZW5fbWFpbnQ9bm8gOzsKLSAgKikKLQkjIGFyZ3VtZW50IGlzIGNnZW4gaW5zdGFsbCBkaXJlY3RvcnkgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpLgotCSMgSGF2aW5nIGEgYHNoYXJlJyBkaXJlY3RvcnkgbWlnaHQgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIC5zY20sCi0JIyAuY3B1LCBldGMuIGZpbGVzLgotCWNnZW5kaXI9JHtjZ2VuX21haW50fS9saWIvY2dlbgotCWNnZW49Z3VpbGUKLQk7OwotZXNhYwotZmkKLWlmIHRlc3QgeCR7Y2dlbl9tYWludH0gIT0geG5vIDsgdGhlbgotICBDR0VOX01BSU5UPScnCi1lbHNlCi0gIENHRU5fTUFJTlQ9JyMnCi1maQotCi0KLQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZwotcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZwotcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZwotcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ0dFTl9NQUlOVEAlJENHRU5fTUFJTlQlZwotcyVAY2dlbmRpckAlJGNnZW5kaXIlZwotcyVAY2dlbkAlJGNnZW4lZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2NvbmZpZ3VyZS5pbiBiL3NpbS9tMzJyL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5OGYyOS4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotQUNfUFJFUkVRKDIuNSlkbmwKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLVNJTV9BQ19DT01NT04KLQotU0lNX0FDX09QVElPTl9FTkRJQU4oQklHX0VORElBTikKLVNJTV9BQ19PUFRJT05fQUxJR05NRU5UKFNUUklDVF9BTElHTk1FTlQpCi1TSU1fQUNfT1BUSU9OX0hPU1RFTkRJQU4KLVNJTV9BQ19PUFRJT05fU0NBQ0hFKDE2Mzg0KQotU0lNX0FDX09QVElPTl9ERUZBVUxUX01PREVMKG0zMnIvZCkKLVNJTV9BQ19PUFRJT05fRU5WSVJPTk1FTlQKLVNJTV9BQ19PUFRJT05fSU5MSU5FKCkKLVNJTV9BQ19PUFRJT05fQ0dFTl9NQUlOVAotCi1TSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vbTMyci9jcHUuYyBiL3NpbS9tMzJyL2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ3NGEwLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIE1pc2MuIHN1cHBvcnQgZm9yIENQVSBmYW1pbHkgbTMycmJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jZGVmaW5lIFdBTlRfQ1BVIG0zMnJiZgotI2RlZmluZSBXQU5UX0NQVV9NMzJSQkYKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiY2dlbi1vcHMuaCIKLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXBjLiAgKi8KLQotVVNJCi1tMzJyYmZfaF9wY19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX3BjKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtcGMuICAqLwotCi12b2lkCi1tMzJyYmZfaF9wY19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVU0kgbmV3dmFsKQotewotICBDUFUgKGhfcGMpID0gbmV3dmFsOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtZ3IuICAqLwotCi1TSQotbTMycmJmX2hfZ3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKLXsKLSAgcmV0dXJuIENQVSAoaF9ncltyZWdub10pOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1nci4gICovCi0KLXZvaWQKLW0zMnJiZl9oX2dyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIFNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2dyW3JlZ25vXSkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1jci4gICovCi0KLVVTSQotbTMycmJmX2hfY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKLXsKLSAgcmV0dXJuIEdFVF9IX0NSIChyZWdubyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWNyLiAgKi8KLQotdm9pZAotbTMycmJmX2hfY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgVVNJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfQ1IgKHJlZ25vLCBuZXd2YWwpOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtYWNjdW0uICAqLwotCi1ESQotbTMycmJmX2hfYWNjdW1fZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIEdFVF9IX0FDQ1VNICgpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1hY2N1bS4gICovCi0KLXZvaWQKLW0zMnJiZl9oX2FjY3VtX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIERJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfQUNDVU0gKG5ld3ZhbCk7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1jb25kLiAgKi8KLQotQkkKLW0zMnJiZl9oX2NvbmRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9jb25kKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtY29uZC4gICovCi0KLXZvaWQKLW0zMnJiZl9oX2NvbmRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfY29uZCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1wc3cuICAqLwotCi1VUUkKLW0zMnJiZl9oX3Bzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gR0VUX0hfUFNXICgpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1wc3cuICAqLwotCi12b2lkCi1tMzJyYmZfaF9wc3dfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfUFNXIChuZXd2YWwpOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtYnBzdy4gICovCi0KLVVRSQotbTMycmJmX2hfYnBzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX2Jwc3cpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1icHN3LiAgKi8KLQotdm9pZAotbTMycmJmX2hfYnBzd19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQotewotICBDUFUgKGhfYnBzdykgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1iYnBzdy4gICovCi0KLVVRSQotbTMycmJmX2hfYmJwc3dfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9iYnBzdyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWJicHN3LiAgKi8KLQotdm9pZAotbTMycmJmX2hfYmJwc3dfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2JicHN3KSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWxvY2suICAqLwotCi1CSQotbTMycmJmX2hfbG9ja19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX2xvY2spOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1sb2NrLiAgKi8KLQotdm9pZAotbTMycmJmX2hfbG9ja19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9sb2NrKSA9IG5ld3ZhbDsKLX0KLQotLyogUmVjb3JkIHRyYWNlIHJlc3VsdHMgZm9yIElOU04uICAqLwotCi12b2lkCi1tMzJyYmZfcmVjb3JkX3RyYWNlX3Jlc3VsdHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBDR0VOX0lOU04gKmluc24sCi0JCQkgICAgaW50ICppbmRpY2VzLCBUUkFDRV9SRUNPUkQgKnRyKQotewotfQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvY3B1LmggYi9zaW0vbTMyci9jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0NzVkNS4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9jcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKiBDUFUgZmFtaWx5IGhlYWRlciBmb3IgbTMycmJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIENQVV9NMzJSQkZfSAotI2RlZmluZSBDUFVfTTMyUkJGX0gKLQotLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGZldGNoZWQgYXQgYSB0aW1lLgotICAgVGhpcyBpcyBmb3IgTElXIHR5cGUgaW5zdHJ1Y3Rpb25zIHNldHMgKGUuZy4gbTMycikuICAqLwotI2RlZmluZSBNQVhfTElXX0lOU05TIDIKLQotLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgKi8KLSNkZWZpbmUgTUFYX1BBUkFMTEVMX0lOU05TIDEKLQotLyogQ1BVIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogSGFyZHdhcmUgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgewotICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgVVNJIGhfcGM7Ci0jZGVmaW5lIEdFVF9IX1BDKCkgQ1BVIChoX3BjKQotI2RlZmluZSBTRVRfSF9QQyh4KSAoQ1BVIChoX3BjKSA9ICh4KSkKLSAgLyogZ2VuZXJhbCByZWdpc3RlcnMgKi8KLSAgU0kgaF9nclsxNl07Ci0jZGVmaW5lIEdFVF9IX0dSKGExKSBDUFUgKGhfZ3IpW2ExXQotI2RlZmluZSBTRVRfSF9HUihhMSwgeCkgKENQVSAoaF9ncilbYTFdID0gKHgpKQotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICBVU0kgaF9jclsxNl07Ci0jZGVmaW5lIEdFVF9IX0NSKGluZGV4KSBtMzJyYmZfaF9jcl9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIGluZGV4KQotI2RlZmluZSBTRVRfSF9DUihpbmRleCwgeCkgXAotZG8geyBcCi1tMzJyYmZfaF9jcl9zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIChpbmRleCksICh4KSk7XAotfSB3aGlsZSAoMCkKLSAgLyogYWNjdW11bGF0b3IgKi8KLSAgREkgaF9hY2N1bTsKLSNkZWZpbmUgR0VUX0hfQUNDVU0oKSBtMzJyYmZfaF9hY2N1bV9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCi0jZGVmaW5lIFNFVF9IX0FDQ1VNKHgpIFwKLWRvIHsgXAotbTMycmJmX2hfYWNjdW1fc2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCAoeCkpO1wKLX0gd2hpbGUgKDApCi0gIC8qIGNvbmRpdGlvbiBiaXQgKi8KLSAgQkkgaF9jb25kOwotI2RlZmluZSBHRVRfSF9DT05EKCkgQ1BVIChoX2NvbmQpCi0jZGVmaW5lIFNFVF9IX0NPTkQoeCkgKENQVSAoaF9jb25kKSA9ICh4KSkKLSAgLyogcHN3IHBhcnQgb2YgcHN3ICovCi0gIFVRSSBoX3BzdzsKLSNkZWZpbmUgR0VUX0hfUFNXKCkgbTMycmJmX2hfcHN3X2dldF9oYW5kbGVyIChjdXJyZW50X2NwdSkKLSNkZWZpbmUgU0VUX0hfUFNXKHgpIFwKLWRvIHsgXAotbTMycmJmX2hfcHN3X3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHgpKTtcCi19IHdoaWxlICgwKQotICAvKiBiYWNrdXAgcHN3ICovCi0gIFVRSSBoX2Jwc3c7Ci0jZGVmaW5lIEdFVF9IX0JQU1coKSBDUFUgKGhfYnBzdykKLSNkZWZpbmUgU0VUX0hfQlBTVyh4KSAoQ1BVIChoX2Jwc3cpID0gKHgpKQotICAvKiBiYWNrdXAgYnBzdyAqLwotICBVUUkgaF9iYnBzdzsKLSNkZWZpbmUgR0VUX0hfQkJQU1coKSBDUFUgKGhfYmJwc3cpCi0jZGVmaW5lIFNFVF9IX0JCUFNXKHgpIChDUFUgKGhfYmJwc3cpID0gKHgpKQotICAvKiBsb2NrICovCi0gIEJJIGhfbG9jazsKLSNkZWZpbmUgR0VUX0hfTE9DSygpIENQVSAoaF9sb2NrKQotI2RlZmluZSBTRVRfSF9MT0NLKHgpIChDUFUgKGhfbG9jaykgPSAoeCkpCi0gIH0gaGFyZHdhcmU7Ci0jZGVmaW5lIENQVV9DR0VOX0hXKGNwdSkgKCYgKGNwdSktPmNwdV9kYXRhLmhhcmR3YXJlKQotfSBNMzJSQkZfQ1BVX0RBVEE7Ci0KLS8qIENvdmVyIGZucyBmb3IgcmVnaXN0ZXIgYWNjZXNzLiAgKi8KLVVTSSBtMzJyYmZfaF9wY19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJiZl9oX3BjX3NldCAoU0lNX0NQVSAqLCBVU0kpOwotU0kgbTMycmJmX2hfZ3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwotdm9pZCBtMzJyYmZfaF9ncl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOwotVVNJIG0zMnJiZl9oX2NyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKLXZvaWQgbTMycmJmX2hfY3Jfc2V0IChTSU1fQ1BVICosIFVJTlQsIFVTSSk7Ci1ESSBtMzJyYmZfaF9hY2N1bV9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJiZl9oX2FjY3VtX3NldCAoU0lNX0NQVSAqLCBESSk7Ci1CSSBtMzJyYmZfaF9jb25kX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgbTMycmJmX2hfY29uZF9zZXQgKFNJTV9DUFUgKiwgQkkpOwotVVFJIG0zMnJiZl9oX3Bzd19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJiZl9oX3Bzd19zZXQgKFNJTV9DUFUgKiwgVVFJKTsKLVVRSSBtMzJyYmZfaF9icHN3X2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgbTMycmJmX2hfYnBzd19zZXQgKFNJTV9DUFUgKiwgVVFJKTsKLVVRSSBtMzJyYmZfaF9iYnBzd19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJiZl9oX2JicHN3X3NldCAoU0lNX0NQVSAqLCBVUUkpOwotQkkgbTMycmJmX2hfbG9ja19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJiZl9oX2xvY2tfc2V0IChTSU1fQ1BVICosIEJJKTsKLQotLyogVGhlc2UgbXVzdCBiZSBoYW5kLXdyaXR0ZW4uICAqLwotZXh0ZXJuIENQVVJFR19GRVRDSF9GTiBtMzJyYmZfZmV0Y2hfcmVnaXN0ZXI7Ci1leHRlcm4gQ1BVUkVHX1NUT1JFX0ZOIG0zMnJiZl9zdG9yZV9yZWdpc3RlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBVSU5UIGhfZ3I7Ci19IE1PREVMX00zMlJfRF9EQVRBOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBlbXB0eTsKLX0gTU9ERUxfVEVTVF9EQVRBOwotCi0vKiBJbnN0cnVjdGlvbiBhcmd1bWVudCBidWZmZXIuICAqLwotCi11bmlvbiBzZW1fZmllbGRzIHsKLSAgc3RydWN0IHsgLyogbm8gb3BlcmFuZHMgKi8KLSAgICBpbnQgZW1wdHk7Ci0gIH0gZm10X2VtcHR5OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBVSU5UIGZfdWltbTQ7Ci0gIH0gc2ZtdF90cmFwOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBJQUREUiBpX2Rpc3AyNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICB9IHNmbXRfYmwyNDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgSUFERFIgaV9kaXNwODsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICB9IHNmbXRfYmw4OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBVSU5UIGZfaGkxNjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X3NldGg7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX3NyOwotICAgIFVJTlQgZl9yMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyOwotICB9IHNmbXRfbXZ0YzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHI7Ci0gICAgVUlOVCBmX3IyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOwotICB9IHNmbXRfbXZmYzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgQUREUiBpX3VpbW0yNDsKLSAgICBTSSogaV9kcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2xkMjQ7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX3NyOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKLSAgfSBzZm10X2psOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBVSU5UIGZfdWltbTU7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9kcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X3NsbGk7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIElOVCBmX3NpbW04OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fZHI7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHI7Ci0gIH0gc2ZtdF9hZGRpOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9zcmMxOwotICAgIFNJKiBpX3NyYzI7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9zcmMyOwotICB9IHNmbXRfc3RfcGx1czsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfc3JjMTsKLSAgICBTSSogaV9zcmMyOwotICAgIElOVCBmX3NpbW0xNjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOwotICB9IHNmbXRfc3RfZDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHI7Ci0gICAgU0kqIGlfc3I7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9zcjsKLSAgfSBzZm10X2xkX3BsdXM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIElBRERSIGlfZGlzcDE2OwotICAgIFNJKiBpX3NyYzE7Ci0gICAgU0kqIGlfc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOwotICB9IHNmbXRfYmVxOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBTSSogaV9zcjsKLSAgICBVSU5UIGZfdWltbTE2OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHI7Ci0gIH0gc2ZtdF9hbmQzOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBTSSogaV9zcjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2FkZDM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIFNJKiBpX3NyOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fZHI7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2FkZDsKLSNpZiBXSVRIX1NDQUNIRV9QQkIKLSAgLyogV3JpdGViYWNrIGhhbmRsZXIuICAqLwotICBzdHJ1Y3QgewotICAgIC8qIFBvaW50ZXIgdG8gYXJnYnVmIGVudHJ5IGZvciBpbnNuIHdob3NlIHJlc3VsdHMgbmVlZCB3cml0aW5nIGJhY2suICAqLwotICAgIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWY7Ci0gIH0gd3JpdGU7Ci0gIC8qIHgtYmVmb3JlIGhhbmRsZXIgKi8KLSAgc3RydWN0IHsKLSAgICAvKmNvbnN0IFNDQUNIRSAqaW5zbnNbTUFYX1BBUkFMTEVMX0lOU05TXTsqLwotICAgIGludCBmaXJzdF9wOwotICB9IGJlZm9yZTsKLSAgLyogeC1hZnRlciBoYW5kbGVyICovCi0gIHN0cnVjdCB7Ci0gICAgaW50IGVtcHR5OwotICB9IGFmdGVyOwotICAvKiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdGVybWluYXRlIGVhY2ggcGJiLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBOdW1iZXIgb2YgaW5zbnMgaW4gcGJiLiAgKi8KLSAgICBpbnQgaW5zbl9jb3VudDsKLSAgICAvKiBOZXh0IHBiYiB0byBleGVjdXRlLiAgKi8KLSAgICBTQ0FDSEUgKm5leHQ7Ci0gICAgU0NBQ0hFICpicmFuY2hfdGFyZ2V0OwotICB9IGNoYWluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCi1zdHJ1Y3QgYXJnYnVmIHsKLSAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLwotICBJQUREUiBhZGRyOwotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGNoYXIgdHJhY2VfcDsKLSAgY2hhciBwcm9maWxlX3A7Ci0gIC8qID8/PyBUZW1wb3JhcnkgaGFjayBmb3Igc2tpcCBpbnNucy4gICovCi0gIGNoYXIgc2tpcF9jb3VudDsKLSAgY2hhciB1bnVzZWQ7Ci0gIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KLSAgdW5pb24gc2VtIHNlbWFudGljOwotICBpbnQgd3JpdHRlbjsKLSAgdW5pb24gc2VtX2ZpZWxkcyBmaWVsZHM7Ci19OwotCi0vKiBBIGNhY2hlZCBpbnNuLgotCi0gICA/Pz8gU0NBQ0hFIHVzZWQgdG8gY29udGFpbiBtb3JlIHRoYW4ganVzdCBhcmdidWYuICBXZSBjb3VsZCBkZWxldGUgdGhlCi0gICB0eXBlIGVudGlyZWx5IGFuZCBhbHdheXMganVzdCB1c2UgQVJHQlVGLCBidXQgZm9yIGZ1dHVyZSBjb25jZXJucyBhbmQgYXMKLSAgIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXQgaXMgbGVmdCBpbi4gICovCi0KLXN0cnVjdCBzY2FjaGUgewotICBzdHJ1Y3QgYXJnYnVmIGFyZ2J1ZjsKLX07Ci0KLS8qIE1hY3JvcyB0byBzaW1wbGlmeSBleHRyYWN0aW9uLCByZWFkaW5nIGFuZCBzZW1hbnRpYyBjb2RlLgotICAgVGhlc2UgZGVmaW5lIGFuZCBhc3NpZ24gdGhlIGxvY2FsIHZhcnMgdGhhdCBjb250YWluIHRoZSBpbnNuJ3MgZmllbGRzLiAgKi8KLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfVkFSUyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTVBUWV9DT0RFIFwKLSAgbGVuZ3RoID0gMDsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BREQzX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQU5EM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgVUlOVCBmX3VpbW0xNjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQU5EM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3VpbW0xNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9PUjNfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIFVJTlQgZl91aW1tMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX09SM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3VpbW0xNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBJTlQgZl9zaW1tODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQURESV9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9zaW1tOCA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERWM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERWM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDOF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgU0kgZl9kaXNwODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQkM4X0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2Rpc3A4ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDMjRfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFNJIGZfZGlzcDI0OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CQzI0X0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX2Rpc3AyNCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgOCwgMjQpKSA8PCAoMikpKSArIChwYykpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JFUV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgU0kgZl9kaXNwMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JFUV9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CRVFaX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBTSSBmX2Rpc3AxNjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQkVRWl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QSV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBJX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBJTlQgZl9zaW1tMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RJVl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0pMX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfSkxfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTEQyNF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX3VpbW0yNDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTEQyNF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl91aW1tMjQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDI0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkxNl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkxNl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkFDSElfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVkZBQ0hJX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkNfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVkZDX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVEFDSElfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVlRBQ0hJX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVENfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVlRDX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX05PUF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX05PUF9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TRVRIX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBVSU5UIGZfaGkxNjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfU0VUSF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX2hpMTYgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU0xMSV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX3NoaWZ0X29wMjsgXAotICBVSU5UIGZfdWltbTU7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1NMTElfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfc2hpZnRfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCAzKTsgXAotICBmX3VpbW01ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMSwgNSk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfRF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVF9EX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfVFJBUF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfdWltbTQ7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1RSQVBfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3VpbW00ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotLyogQ29sbGVjdGlvbiBvZiB2YXJpb3VzIHRoaW5ncyBmb3IgdGhlIHRyYWNlIGhhbmRsZXIgdG8gdXNlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdHJhY2VfcmVjb3JkIHsKLSAgSUFERFIgcGM7Ci0gIC8qIEZJWE1FOndpcCAqLwotfSBUUkFDRV9SRUNPUkQ7Ci0KLSNlbmRpZiAvKiBDUFVfTTMyUkJGX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2NwdWFsbC5oIGIvc2ltL20zMnIvY3B1YWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDgyY2EuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvY3B1YWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBTaW11bGF0b3IgQ1BVIGhlYWRlciBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBNMzJSX0NQVUFMTF9ICi0jZGVmaW5lIE0zMlJfQ1BVQUxMX0gKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCBjcHUgZmFtaWx5LiAgKi8KLQotI2lmZGVmIFdBTlRfQ1BVX00zMlJCRgotI2luY2x1ZGUgImVuZy5oIgotI2luY2x1ZGUgImNnZW4tZW5naW5lLmgiCi0jaW5jbHVkZSAiY3B1LmgiCi0jaW5jbHVkZSAiZGVjb2RlLmgiCi0jZW5kaWYKLQotI2lmZGVmIFdBTlRfQ1BVX00zMlJYRgotI2luY2x1ZGUgImVuZ3guaCIKLSNpbmNsdWRlICJjZ2VuLWVuZ2luZS5oIgotI2luY2x1ZGUgImNwdXguaCIKLSNpbmNsdWRlICJkZWNvZGV4LmgiCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IE1BQ0ggbTMycl9tYWNoOwotZXh0ZXJuIGNvbnN0IE1BQ0ggbTMycnhfbWFjaDsKLQotI2lmbmRlZiBXQU5UX0NQVQotLyogVGhlIEFSR0JVRiBzdHJ1Y3QuICAqLwotc3RydWN0IGFyZ2J1ZiB7Ci0gIC8qIFRoZXNlIGFyZSB0aGUgYmFzZWNsYXNzIGRlZmluaXRpb25zLiAgKi8KLSAgSUFERFIgYWRkcjsKLSAgY29uc3QgSURFU0MgKmlkZXNjOwotICBjaGFyIHRyYWNlX3A7Ci0gIGNoYXIgcHJvZmlsZV9wOwotICAvKiA/Pz8gVGVtcG9yYXJ5IGhhY2sgZm9yIHNraXAgaW5zbnMuICAqLwotICBjaGFyIHNraXBfY291bnQ7Ci0gIGNoYXIgdW51c2VkOwotICAvKiBjcHUgc3BlY2lmaWMgZGF0YSBmb2xsb3dzICovCi19OwotI2VuZGlmCi0KLSNpZm5kZWYgV0FOVF9DUFUKLS8qIEEgY2FjaGVkIGluc24uCi0KLSAgID8/PyBTQ0FDSEUgdXNlZCB0byBjb250YWluIG1vcmUgdGhhbiBqdXN0IGFyZ2J1Zi4gIFdlIGNvdWxkIGRlbGV0ZSB0aGUKLSAgIHR5cGUgZW50aXJlbHkgYW5kIGFsd2F5cyBqdXN0IHVzZSBBUkdCVUYsIGJ1dCBmb3IgZnV0dXJlIGNvbmNlcm5zIGFuZCBhcwotICAgYSBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpdCBpcyBsZWZ0IGluLiAgKi8KLQotc3RydWN0IHNjYWNoZSB7Ci0gIHN0cnVjdCBhcmdidWYgYXJnYnVmOwotfTsKLSNlbmRpZgotCi0jZW5kaWYgLyogTTMyUl9DUFVBTExfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvY3B1eC5jIGIvc2ltL20zMnIvY3B1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FhMGI3Li4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2NwdXguYworKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKiBNaXNjLiBzdXBwb3J0IGZvciBDUFUgZmFtaWx5IG0zMnJ4Zi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBtMzJyeGYKLSNkZWZpbmUgV0FOVF9DUFVfTTMyUlhGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImNnZW4tb3BzLmgiCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1wYy4gICovCi0KLVVTSQotbTMycnhmX2hfcGNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9wYyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLXBjLiAgKi8KLQotdm9pZAotbTMycnhmX2hfcGNfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVNJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX3BjKSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWdyLiAgKi8KLQotU0kKLW0zMnJ4Zl9oX2dyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCi17Ci0gIHJldHVybiBDUFUgKGhfZ3JbcmVnbm9dKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtZ3IuICAqLwotCi12b2lkCi1tMzJyeGZfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9ncltyZWdub10pID0gbmV3dmFsOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtY3IuICAqLwotCi1VU0kKLW0zMnJ4Zl9oX2NyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCi17Ci0gIHJldHVybiBHRVRfSF9DUiAocmVnbm8pOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1jci4gICovCi0KLXZvaWQKLW0zMnJ4Zl9oX2NyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIFVTSSBuZXd2YWwpCi17Ci0gIFNFVF9IX0NSIChyZWdubywgbmV3dmFsKTsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWFjY3VtLiAgKi8KLQotREkKLW0zMnJ4Zl9oX2FjY3VtX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCi17Ci0gIHJldHVybiBHRVRfSF9BQ0NVTSAoKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtYWNjdW0uICAqLwotCi12b2lkCi1tMzJyeGZfaF9hY2N1bV9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBESSBuZXd2YWwpCi17Ci0gIFNFVF9IX0FDQ1VNIChuZXd2YWwpOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtYWNjdW1zLiAgKi8KLQotREkKLW0zMnJ4Zl9oX2FjY3Vtc19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICByZXR1cm4gR0VUX0hfQUNDVU1TIChyZWdubyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWFjY3Vtcy4gICovCi0KLXZvaWQKLW0zMnJ4Zl9oX2FjY3Vtc19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBESSBuZXd2YWwpCi17Ci0gIFNFVF9IX0FDQ1VNUyAocmVnbm8sIG5ld3ZhbCk7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1jb25kLiAgKi8KLQotQkkKLW0zMnJ4Zl9oX2NvbmRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9jb25kKTsKLX0KLQotLyogU2V0IGEgdmFsdWUgZm9yIGgtY29uZC4gICovCi0KLXZvaWQKLW0zMnJ4Zl9oX2NvbmRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQotewotICBDUFUgKGhfY29uZCkgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1wc3cuICAqLwotCi1VUUkKLW0zMnJ4Zl9oX3Bzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gR0VUX0hfUFNXICgpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1wc3cuICAqLwotCi12b2lkCi1tMzJyeGZfaF9wc3dfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgU0VUX0hfUFNXIChuZXd2YWwpOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGgtYnBzdy4gICovCi0KLVVRSQotbTMycnhmX2hfYnBzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX2Jwc3cpOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1icHN3LiAgKi8KLQotdm9pZAotbTMycnhmX2hfYnBzd19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQotewotICBDUFUgKGhfYnBzdykgPSBuZXd2YWw7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgaC1iYnBzdy4gICovCi0KLVVRSQotbTMycnhmX2hfYmJwc3dfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgcmV0dXJuIENQVSAoaF9iYnBzdyk7Ci19Ci0KLS8qIFNldCBhIHZhbHVlIGZvciBoLWJicHN3LiAgKi8KLQotdm9pZAotbTMycnhmX2hfYmJwc3dfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2JicHN3KSA9IG5ld3ZhbDsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWxvY2suICAqLwotCi1CSQotbTMycnhmX2hfbG9ja19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gQ1BVIChoX2xvY2spOwotfQotCi0vKiBTZXQgYSB2YWx1ZSBmb3IgaC1sb2NrLiAgKi8KLQotdm9pZAotbTMycnhmX2hfbG9ja19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9sb2NrKSA9IG5ld3ZhbDsKLX0KLQotLyogUmVjb3JkIHRyYWNlIHJlc3VsdHMgZm9yIElOU04uICAqLwotCi12b2lkCi1tMzJyeGZfcmVjb3JkX3RyYWNlX3Jlc3VsdHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBDR0VOX0lOU04gKmluc24sCi0JCQkgICAgaW50ICppbmRpY2VzLCBUUkFDRV9SRUNPUkQgKnRyKQotewotfQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvY3B1eC5oIGIvc2ltL20zMnIvY3B1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxNGZhLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2NwdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDk0NSArMCwwIEBACi0vKiBDUFUgZmFtaWx5IGhlYWRlciBmb3IgbTMycnhmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIENQVV9NMzJSWEZfSAotI2RlZmluZSBDUFVfTTMyUlhGX0gKLQotLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGZldGNoZWQgYXQgYSB0aW1lLgotICAgVGhpcyBpcyBmb3IgTElXIHR5cGUgaW5zdHJ1Y3Rpb25zIHNldHMgKGUuZy4gbTMycikuICAqLwotI2RlZmluZSBNQVhfTElXX0lOU05TIDIKLQotLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgKi8KLSNkZWZpbmUgTUFYX1BBUkFMTEVMX0lOU05TIDIKLQotLyogQ1BVIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogSGFyZHdhcmUgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgewotICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgVVNJIGhfcGM7Ci0jZGVmaW5lIEdFVF9IX1BDKCkgQ1BVIChoX3BjKQotI2RlZmluZSBTRVRfSF9QQyh4KSAoQ1BVIChoX3BjKSA9ICh4KSkKLSAgLyogZ2VuZXJhbCByZWdpc3RlcnMgKi8KLSAgU0kgaF9nclsxNl07Ci0jZGVmaW5lIEdFVF9IX0dSKGExKSBDUFUgKGhfZ3IpW2ExXQotI2RlZmluZSBTRVRfSF9HUihhMSwgeCkgKENQVSAoaF9ncilbYTFdID0gKHgpKQotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICBVU0kgaF9jclsxNl07Ci0jZGVmaW5lIEdFVF9IX0NSKGluZGV4KSBtMzJyeGZfaF9jcl9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIGluZGV4KQotI2RlZmluZSBTRVRfSF9DUihpbmRleCwgeCkgXAotZG8geyBcCi1tMzJyeGZfaF9jcl9zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIChpbmRleCksICh4KSk7XAotfSB3aGlsZSAoMCkKLSAgLyogYWNjdW11bGF0b3IgKi8KLSAgREkgaF9hY2N1bTsKLSNkZWZpbmUgR0VUX0hfQUNDVU0oKSBtMzJyeGZfaF9hY2N1bV9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCi0jZGVmaW5lIFNFVF9IX0FDQ1VNKHgpIFwKLWRvIHsgXAotbTMycnhmX2hfYWNjdW1fc2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCAoeCkpO1wKLX0gd2hpbGUgKDApCi0gIC8qIGFjY3VtdWxhdG9ycyAqLwotICBESSBoX2FjY3Vtc1syXTsKLSNkZWZpbmUgR0VUX0hfQUNDVU1TKGluZGV4KSBtMzJyeGZfaF9hY2N1bXNfZ2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCBpbmRleCkKLSNkZWZpbmUgU0VUX0hfQUNDVU1TKGluZGV4LCB4KSBcCi1kbyB7IFwKLW0zMnJ4Zl9oX2FjY3Vtc19zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIChpbmRleCksICh4KSk7XAotfSB3aGlsZSAoMCkKLSAgLyogY29uZGl0aW9uIGJpdCAqLwotICBCSSBoX2NvbmQ7Ci0jZGVmaW5lIEdFVF9IX0NPTkQoKSBDUFUgKGhfY29uZCkKLSNkZWZpbmUgU0VUX0hfQ09ORCh4KSAoQ1BVIChoX2NvbmQpID0gKHgpKQotICAvKiBwc3cgcGFydCBvZiBwc3cgKi8KLSAgVVFJIGhfcHN3OwotI2RlZmluZSBHRVRfSF9QU1coKSBtMzJyeGZfaF9wc3dfZ2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1KQotI2RlZmluZSBTRVRfSF9QU1coeCkgXAotZG8geyBcCi1tMzJyeGZfaF9wc3dfc2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCAoeCkpO1wKLX0gd2hpbGUgKDApCi0gIC8qIGJhY2t1cCBwc3cgKi8KLSAgVVFJIGhfYnBzdzsKLSNkZWZpbmUgR0VUX0hfQlBTVygpIENQVSAoaF9icHN3KQotI2RlZmluZSBTRVRfSF9CUFNXKHgpIChDUFUgKGhfYnBzdykgPSAoeCkpCi0gIC8qIGJhY2t1cCBicHN3ICovCi0gIFVRSSBoX2JicHN3OwotI2RlZmluZSBHRVRfSF9CQlBTVygpIENQVSAoaF9iYnBzdykKLSNkZWZpbmUgU0VUX0hfQkJQU1coeCkgKENQVSAoaF9iYnBzdykgPSAoeCkpCi0gIC8qIGxvY2sgKi8KLSAgQkkgaF9sb2NrOwotI2RlZmluZSBHRVRfSF9MT0NLKCkgQ1BVIChoX2xvY2spCi0jZGVmaW5lIFNFVF9IX0xPQ0soeCkgKENQVSAoaF9sb2NrKSA9ICh4KSkKLSAgfSBoYXJkd2FyZTsKLSNkZWZpbmUgQ1BVX0NHRU5fSFcoY3B1KSAoJiAoY3B1KS0+Y3B1X2RhdGEuaGFyZHdhcmUpCi19IE0zMlJYRl9DUFVfREFUQTsKLQotLyogQ292ZXIgZm5zIGZvciByZWdpc3RlciBhY2Nlc3MuICAqLwotVVNJIG0zMnJ4Zl9oX3BjX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgbTMycnhmX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7Ci1TSSBtMzJyeGZfaF9ncl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Ci12b2lkIG0zMnJ4Zl9oX2dyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7Ci1VU0kgbTMycnhmX2hfY3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwotdm9pZCBtMzJyeGZfaF9jcl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgVVNJKTsKLURJIG0zMnJ4Zl9oX2FjY3VtX2dldCAoU0lNX0NQVSAqKTsKLXZvaWQgbTMycnhmX2hfYWNjdW1fc2V0IChTSU1fQ1BVICosIERJKTsKLURJIG0zMnJ4Zl9oX2FjY3Vtc19nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Ci12b2lkIG0zMnJ4Zl9oX2FjY3Vtc19zZXQgKFNJTV9DUFUgKiwgVUlOVCwgREkpOwotQkkgbTMycnhmX2hfY29uZF9nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJ4Zl9oX2NvbmRfc2V0IChTSU1fQ1BVICosIEJJKTsKLVVRSSBtMzJyeGZfaF9wc3dfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBtMzJyeGZfaF9wc3dfc2V0IChTSU1fQ1BVICosIFVRSSk7Ci1VUUkgbTMycnhmX2hfYnBzd19nZXQgKFNJTV9DUFUgKik7Ci12b2lkIG0zMnJ4Zl9oX2Jwc3dfc2V0IChTSU1fQ1BVICosIFVRSSk7Ci1VUUkgbTMycnhmX2hfYmJwc3dfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBtMzJyeGZfaF9iYnBzd19zZXQgKFNJTV9DUFUgKiwgVVFJKTsKLUJJIG0zMnJ4Zl9oX2xvY2tfZ2V0IChTSU1fQ1BVICopOwotdm9pZCBtMzJyeGZfaF9sb2NrX3NldCAoU0lNX0NQVSAqLCBCSSk7Ci0KLS8qIFRoZXNlIG11c3QgYmUgaGFuZC13cml0dGVuLiAgKi8KLWV4dGVybiBDUFVSRUdfRkVUQ0hfRk4gbTMycnhmX2ZldGNoX3JlZ2lzdGVyOwotZXh0ZXJuIENQVVJFR19TVE9SRV9GTiBtMzJyeGZfc3RvcmVfcmVnaXN0ZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGVtcHR5OwotfSBNT0RFTF9NMzJSWF9EQVRBOwotCi0vKiBJbnN0cnVjdGlvbiBhcmd1bWVudCBidWZmZXIuICAqLwotCi11bmlvbiBzZW1fZmllbGRzIHsKLSAgc3RydWN0IHsgLyogbm8gb3BlcmFuZHMgKi8KLSAgICBpbnQgZW1wdHk7Ci0gIH0gZm10X2VtcHR5OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBVSU5UIGZfdWltbTQ7Ci0gIH0gc2ZtdF90cmFwOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBJQUREUiBpX2Rpc3AyNDsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICB9IHNmbXRfYmwyNDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgSUFERFIgaV9kaXNwODsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICB9IHNmbXRfYmw4OwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBVSU5UIGZfaGkxNjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X3NldGg7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJIGZfaW1tMTsKLSAgICBVSU5UIGZfYWNjZDsKLSAgICBVSU5UIGZfYWNjczsKLSAgfSBzZm10X3JhY19kc2k7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX3NyOwotICAgIFVJTlQgZl9yMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyOwotICB9IHNmbXRfbXZ0YzsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfc3JjMTsKLSAgICBVSU5UIGZfYWNjczsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gIH0gc2ZtdF9tdnRhY2hpX2E7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIFVJTlQgZl9yMjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X212ZmM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIFVJTlQgZl9hY2NzOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOwotICB9IHNmbXRfbXZmYWNoaV9hOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBBRERSIGlfdWltbTI0OwotICAgIFNJKiBpX2RyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOwotICB9IHNmbXRfbGQyNDsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfc3I7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OwotICB9IHNmbXRfamw7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIFVJTlQgZl91aW1tNTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2RyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOwotICB9IHNmbXRfc2xsaTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHI7Ci0gICAgSU5UIGZfc2ltbTg7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9kcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2FkZGk7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX3NyYzE7Ci0gICAgU0kqIGlfc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOwotICAgIHVuc2lnbmVkIGNoYXIgb3V0X3NyYzI7Ci0gIH0gc2ZtdF9zdF9wbHVzOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9zcmMxOwotICAgIFNJKiBpX3NyYzI7Ci0gICAgSU5UIGZfc2ltbTE2OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7Ci0gIH0gc2ZtdF9zdF9kOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9zcmMxOwotICAgIFNJKiBpX3NyYzI7Ci0gICAgVUlOVCBmX2FjYzsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOwotICB9IHNmbXRfbWFjaGlfYTsKLSAgc3RydWN0IHsgLyogICovCi0gICAgU0kqIGlfZHI7Ci0gICAgU0kqIGlfc3I7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9zcjsKLSAgfSBzZm10X2xkX3BsdXM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIElBRERSIGlfZGlzcDE2OwotICAgIFNJKiBpX3NyYzE7Ci0gICAgU0kqIGlfc3JjMjsKLSAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOwotICB9IHNmbXRfYmVxOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBTSSogaV9zcjsKLSAgICBVSU5UIGZfdWltbTE2OwotICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7Ci0gICAgdW5zaWduZWQgY2hhciBvdXRfZHI7Ci0gIH0gc2ZtdF9hbmQzOwotICBzdHJ1Y3QgeyAvKiAgKi8KLSAgICBTSSogaV9kcjsKLSAgICBTSSogaV9zcjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2FkZDM7Ci0gIHN0cnVjdCB7IC8qICAqLwotICAgIFNJKiBpX2RyOwotICAgIFNJKiBpX3NyOwotICAgIHVuc2lnbmVkIGNoYXIgaW5fZHI7Ci0gICAgdW5zaWduZWQgY2hhciBpbl9zcjsKLSAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKLSAgfSBzZm10X2FkZDsKLSNpZiBXSVRIX1NDQUNIRV9QQkIKLSAgLyogV3JpdGViYWNrIGhhbmRsZXIuICAqLwotICBzdHJ1Y3QgewotICAgIC8qIFBvaW50ZXIgdG8gYXJnYnVmIGVudHJ5IGZvciBpbnNuIHdob3NlIHJlc3VsdHMgbmVlZCB3cml0aW5nIGJhY2suICAqLwotICAgIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWY7Ci0gIH0gd3JpdGU7Ci0gIC8qIHgtYmVmb3JlIGhhbmRsZXIgKi8KLSAgc3RydWN0IHsKLSAgICAvKmNvbnN0IFNDQUNIRSAqaW5zbnNbTUFYX1BBUkFMTEVMX0lOU05TXTsqLwotICAgIGludCBmaXJzdF9wOwotICB9IGJlZm9yZTsKLSAgLyogeC1hZnRlciBoYW5kbGVyICovCi0gIHN0cnVjdCB7Ci0gICAgaW50IGVtcHR5OwotICB9IGFmdGVyOwotICAvKiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdGVybWluYXRlIGVhY2ggcGJiLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBOdW1iZXIgb2YgaW5zbnMgaW4gcGJiLiAgKi8KLSAgICBpbnQgaW5zbl9jb3VudDsKLSAgICAvKiBOZXh0IHBiYiB0byBleGVjdXRlLiAgKi8KLSAgICBTQ0FDSEUgKm5leHQ7Ci0gICAgU0NBQ0hFICpicmFuY2hfdGFyZ2V0OwotICB9IGNoYWluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCi1zdHJ1Y3QgYXJnYnVmIHsKLSAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLwotICBJQUREUiBhZGRyOwotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGNoYXIgdHJhY2VfcDsKLSAgY2hhciBwcm9maWxlX3A7Ci0gIC8qID8/PyBUZW1wb3JhcnkgaGFjayBmb3Igc2tpcCBpbnNucy4gICovCi0gIGNoYXIgc2tpcF9jb3VudDsKLSAgY2hhciB1bnVzZWQ7Ci0gIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KLSAgdW5pb24gc2VtIHNlbWFudGljOwotICBpbnQgd3JpdHRlbjsKLSAgdW5pb24gc2VtX2ZpZWxkcyBmaWVsZHM7Ci19OwotCi0vKiBBIGNhY2hlZCBpbnNuLgotCi0gICA/Pz8gU0NBQ0hFIHVzZWQgdG8gY29udGFpbiBtb3JlIHRoYW4ganVzdCBhcmdidWYuICBXZSBjb3VsZCBkZWxldGUgdGhlCi0gICB0eXBlIGVudGlyZWx5IGFuZCBhbHdheXMganVzdCB1c2UgQVJHQlVGLCBidXQgZm9yIGZ1dHVyZSBjb25jZXJucyBhbmQgYXMKLSAgIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXQgaXMgbGVmdCBpbi4gICovCi0KLXN0cnVjdCBzY2FjaGUgewotICBzdHJ1Y3QgYXJnYnVmIGFyZ2J1ZjsKLX07Ci0KLS8qIE1hY3JvcyB0byBzaW1wbGlmeSBleHRyYWN0aW9uLCByZWFkaW5nIGFuZCBzZW1hbnRpYyBjb2RlLgotICAgVGhlc2UgZGVmaW5lIGFuZCBhc3NpZ24gdGhlIGxvY2FsIHZhcnMgdGhhdCBjb250YWluIHRoZSBpbnNuJ3MgZmllbGRzLiAgKi8KLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfVkFSUyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTVBUWV9DT0RFIFwKLSAgbGVuZ3RoID0gMDsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BREQzX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQU5EM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgVUlOVCBmX3VpbW0xNjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQU5EM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3VpbW0xNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9PUjNfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIFVJTlQgZl91aW1tMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX09SM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3VpbW0xNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBJTlQgZl9zaW1tODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQURESV9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9zaW1tOCA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERWM19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERWM19DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDOF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgU0kgZl9kaXNwODsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQkM4X0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2Rpc3A4ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDMjRfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFNJIGZfZGlzcDI0OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CQzI0X0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX2Rpc3AyNCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgOCwgMjQpKSA8PCAoMikpKSArIChwYykpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JFUV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgU0kgZl9kaXNwMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0JFUV9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9CRVFaX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBTSSBmX2Rpc3AxNjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfQkVRWl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QSV9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBJX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QWl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0NNUFpfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBJTlQgZl9zaW1tMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0RJVl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX0pDX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfSkNfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTEQyNF9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX3VpbW0yNDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTEQyNF9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl91aW1tMjQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDI0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkxNl9WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgSU5UIGZfc2ltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkxNl9DT0RFIFwKLSAgbGVuZ3RoID0gNDsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDQpOyBcCi0gIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAotICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01BQ0hJX0FfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9hY2M7IFwKLSAgVUlOVCBmX29wMjM7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9NQUNISV9BX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX2FjYyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgMSk7IFwKLSAgZl9vcDIzID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA5LCAzKTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVZGQUNISV9BX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9hY2NzOyBcCi0gIFVJTlQgZl9vcDM7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkFDSElfQV9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfYWNjcyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDIpOyBcCi0gIGZfb3AzID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxNCwgMik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVZGQ19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkNfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVZUQUNISV9BX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9hY2NzOyBcCi0gIFVJTlQgZl9vcDM7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVEFDSElfQV9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfYWNjcyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDIpOyBcCi0gIGZfb3AzID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxNCwgMik7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTVZUQ19WQVJTIFwKLSAgVUlOVCBmX29wMTsgXAotICBVSU5UIGZfcjE7IFwKLSAgVUlOVCBmX29wMjsgXAotICBVSU5UIGZfcjI7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVENfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKLQotI2RlZmluZSBFWFRSQUNUX0lGTVRfTk9QX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfTk9QX0NPREUgXAotICBsZW5ndGggPSAyOyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1JBQ19EU0lfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX2FjY2Q7IFwKLSAgVUlOVCBmX2JpdHM2NzsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9hY2NzOyBcCi0gIFVJTlQgZl9iaXQxNDsgXAotICBTSSBmX2ltbTE7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1JBQ19EU0lfQ09ERSBcCi0gIGxlbmd0aCA9IDI7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCi0gIGZfYWNjZCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgMik7IFwKLSAgZl9iaXRzNjcgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDYsIDIpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAotICBmX2FjY3MgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCAyKTsgXAotICBmX2JpdDE0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxNCwgMSk7IFwKLSAgZl9pbW0xID0gKChFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDE1LCAxKSkgKyAoMSkpOyBcCi0KLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1NFVEhfVkFSUyBcCi0gIFVJTlQgZl9vcDE7IFwKLSAgVUlOVCBmX3IxOyBcCi0gIFVJTlQgZl9vcDI7IFwKLSAgVUlOVCBmX3IyOyBcCi0gIFVJTlQgZl9oaTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TRVRIX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfaGkxNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TTExJX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfc2hpZnRfb3AyOyBcCi0gIFVJTlQgZl91aW1tNTsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfU0xMSV9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9zaGlmdF9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDMpOyBcCi0gIGZfdWltbTUgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDExLCA1KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVF9EX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBJTlQgZl9zaW1tMTY7IFwKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUX0RfQ09ERSBcCi0gIGxlbmd0aCA9IDQ7IFwKLSAgZl9vcDEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDAsIDQpOyBcCi0gIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCi0gIGZfb3AyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCA0KTsgXAotICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7IFwKLSAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9UUkFQX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl91aW1tNDsgXAotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotI2RlZmluZSBFWFRSQUNUX0lGTVRfVFJBUF9DT0RFIFwKLSAgbGVuZ3RoID0gMjsgXAotICBmX29wMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKLSAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKLSAgZl9vcDIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCi0gIGZfdWltbTQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAotCi0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TQVRCX1ZBUlMgXAotICBVSU5UIGZfb3AxOyBcCi0gIFVJTlQgZl9yMTsgXAotICBVSU5UIGZfb3AyOyBcCi0gIFVJTlQgZl9yMjsgXAotICBVSU5UIGZfdWltbTE2OyBcCi0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0jZGVmaW5lIEVYVFJBQ1RfSUZNVF9TQVRCX0NPREUgXAotICBsZW5ndGggPSA0OyBcCi0gIGZfb3AxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAotICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsgXAotICBmX29wMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKLSAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCi0gIGZfdWltbTE2ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCi0KLS8qIFF1ZXVlZCBvdXRwdXQgdmFsdWVzIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IHBhcmV4ZWMgewotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsgLyogZW1wdHkgc2Zvcm1hdCBmb3IgdW5zcGVjaWZpZWQgZmllbGQgbGlzdCAqLwotICAgICAgaW50IGVtcHR5OwotICAgIH0gc2ZtdF9lbXB0eTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZCAkZHIsJHNyICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfYWRkOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfYWRkMzsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFuZDMgJGRyLCRzciwkdWltbTE2ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfYW5kMzsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfb3IzOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkaSAkZHIsJHNpbW04ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfYWRkaTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZHYgJGRyLCRzciAqLwotICAgICAgQkkgY29uZGJpdDsKLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9hZGR2OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gICAgICBCSSBjb25kYml0OwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X2FkZHYzOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkeCAkZHIsJHNyICovCi0gICAgICBCSSBjb25kYml0OwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X2FkZHg7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBiYy5zICRkaXNwOCAqLwotICAgICAgVVNJIHBjOwotICAgIH0gc2ZtdF9iYzg7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBiYy5sICRkaXNwMjQgKi8KLSAgICAgIFVTSSBwYzsKLSAgICB9IHNmbXRfYmMyNDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2JlcTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJlcXogJHNyYzIsJGRpc3AxNiAqLwotICAgICAgVVNJIHBjOwotICAgIH0gc2ZtdF9iZXF6OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYmwucyAkZGlzcDggKi8KLSAgICAgIFNJIGhfZ3JfMTQ7Ci0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2JsODsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJsLmwgJGRpc3AyNCAqLwotICAgICAgU0kgaF9ncl8xNDsKLSAgICAgIFVTSSBwYzsKLSAgICB9IHNmbXRfYmwyNDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJjbC5zICRkaXNwOCAqLwotICAgICAgU0kgaF9ncl8xNDsKLSAgICAgIFVTSSBwYzsKLSAgICB9IHNmbXRfYmNsODsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJjbC5sICRkaXNwMjQgKi8KLSAgICAgIFNJIGhfZ3JfMTQ7Ci0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2JjbDI0OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gYnJhLnMgJGRpc3A4ICovCi0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2JyYTg7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBicmEubCAkZGlzcDI0ICovCi0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2JyYTI0OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gY21wICRzcmMxLCRzcmMyICovCi0gICAgICBCSSBjb25kYml0OwotICAgIH0gc2ZtdF9jbXA7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgICAgIEJJIGNvbmRiaXQ7Ci0gICAgfSBzZm10X2NtcGk7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBjbXB6ICRzcmMyICovCi0gICAgICBCSSBjb25kYml0OwotICAgIH0gc2ZtdF9jbXB6OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gZGl2ICRkciwkc3IgKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9kaXY7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBqYyAkc3IgKi8KLSAgICAgIFVTSSBwYzsKLSAgICB9IHNmbXRfamM7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBqbCAkc3IgKi8KLSAgICAgIFNJIGhfZ3JfMTQ7Ci0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X2psOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gam1wICRzciAqLwotICAgICAgVVNJIHBjOwotICAgIH0gc2ZtdF9qbXA7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBsZCAkZHIsQCRzciAqLwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X2xkOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9sZF9kOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgJGRyLEAkc3IrICovCi0gICAgICBTSSBkcjsKLSAgICAgIFNJIHNyOwotICAgIH0gc2ZtdF9sZF9wbHVzOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQyNCAkZHIsJHVpbW0yNCAqLwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X2xkMjQ7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBsZGk4ICRkciwkc2ltbTggKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9sZGk4OwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfbGRpMTY7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBsb2NrICRkcixAJHNyICovCi0gICAgICBTSSBkcjsKLSAgICAgIEJJIGhfbG9jazsKLSAgICB9IHNmbXRfbG9jazsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgICAgIERJIGFjYzsKLSAgICB9IHNmbXRfbWFjaGlfYTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG11bGhpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgICAgIERJIGFjYzsKLSAgICB9IHNmbXRfbXVsaGlfYTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG12ICRkciwkc3IgKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9tdjsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG12ZmFjaGkgJGRyLCRhY2NzICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfbXZmYWNoaV9hOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbXZmYyAkZHIsJHNjciAqLwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X212ZmM7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBtdnRhY2hpICRzcmMxLCRhY2NzICovCi0gICAgICBESSBhY2NzOwotICAgIH0gc2ZtdF9tdnRhY2hpX2E7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBtdnRjICRzciwkZGNyICovCi0gICAgICBVU0kgZGNyOwotICAgIH0gc2ZtdF9tdnRjOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gbm9wICovCi0gICAgICBpbnQgZW1wdHk7Ci0gICAgfSBzZm10X25vcDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICAgICAgREkgYWNjZDsKLSAgICB9IHNmbXRfcmFjX2RzaTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHJ0ZSAqLwotICAgICAgVVFJIGhfYnBzdzsKLSAgICAgIFVTSSBoX2NyXzY7Ci0gICAgICBVUUkgaF9wc3c7Ci0gICAgICBVU0kgcGM7Ci0gICAgfSBzZm10X3J0ZTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9zZXRoOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgICAgIFNJIGRyOwotICAgIH0gc2ZtdF9zbGwzOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gc2xsaSAkZHIsJHVpbW01ICovCi0gICAgICBTSSBkcjsKLSAgICB9IHNmbXRfc2xsaTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzcmMxLEAkc3JjMiAqLwotICAgICAgU0kgaF9tZW1vcnlfc3JjMjsKLSAgICAgIFVTSSBoX21lbW9yeV9zcmMyX2lkeDsKLSAgICB9IHNmbXRfc3Q7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgICAgIFNJIGhfbWVtb3J5X2FkZF9fREZMVF9zcmMyX3NsbzE2OwotICAgICAgVVNJIGhfbWVtb3J5X2FkZF9fREZMVF9zcmMyX3NsbzE2X2lkeDsKLSAgICB9IHNmbXRfc3RfZDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgICAgIFFJIGhfbWVtb3J5X3NyYzI7Ci0gICAgICBVU0kgaF9tZW1vcnlfc3JjMl9pZHg7Ci0gICAgfSBzZm10X3N0YjsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgICAgIFFJIGhfbWVtb3J5X2FkZF9fREZMVF9zcmMyX3NsbzE2OwotICAgICAgVVNJIGhfbWVtb3J5X2FkZF9fREZMVF9zcmMyX3NsbzE2X2lkeDsKLSAgICB9IHNmbXRfc3RiX2Q7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBzdGggJHNyYzEsQCRzcmMyICovCi0gICAgICBISSBoX21lbW9yeV9zcmMyOwotICAgICAgVVNJIGhfbWVtb3J5X3NyYzJfaWR4OwotICAgIH0gc2ZtdF9zdGg7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gICAgICBISSBoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNjsKLSAgICAgIFVTSSBoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNl9pZHg7Ci0gICAgfSBzZm10X3N0aF9kOwotICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJHNyYzEsQCskc3JjMiAqLwotICAgICAgU0kgaF9tZW1vcnlfbmV3X3NyYzI7Ci0gICAgICBVU0kgaF9tZW1vcnlfbmV3X3NyYzJfaWR4OwotICAgICAgU0kgc3JjMjsKLSAgICB9IHNmbXRfc3RfcGx1czsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHRyYXAgJHVpbW00ICovCi0gICAgICBVUUkgaF9iYnBzdzsKLSAgICAgIFVRSSBoX2Jwc3c7Ci0gICAgICBVU0kgaF9jcl8xNDsKLSAgICAgIFVTSSBoX2NyXzY7Ci0gICAgICBVUUkgaF9wc3c7Ci0gICAgICBTSSBwYzsKLSAgICB9IHNmbXRfdHJhcDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgICAgIEJJIGhfbG9jazsKLSAgICAgIFNJIGhfbWVtb3J5X3NyYzI7Ci0gICAgICBVU0kgaF9tZW1vcnlfc3JjMl9pZHg7Ci0gICAgfSBzZm10X3VubG9jazsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHNhdGIgJGRyLCRzciAqLwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X3NhdGI7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBzYXQgJGRyLCRzciAqLwotICAgICAgU0kgZHI7Ci0gICAgfSBzZm10X3NhdDsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHNhZGQgKi8KLSAgICAgIERJIGhfYWNjdW1zXzA7Ci0gICAgfSBzZm10X3NhZGQ7Ci0gICAgc3RydWN0IHsgLyogZS5nLiBtYWN3dTEgJHNyYzEsJHNyYzIgKi8KLSAgICAgIERJIGhfYWNjdW1zXzE7Ci0gICAgfSBzZm10X21hY3d1MTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1zYmxvICRzcmMxLCRzcmMyICovCi0gICAgICBESSBhY2N1bTsKLSAgICB9IHNmbXRfbXNibG87Ci0gICAgc3RydWN0IHsgLyogZS5nLiBtdWx3dTEgJHNyYzEsJHNyYzIgKi8KLSAgICAgIERJIGhfYWNjdW1zXzE7Ci0gICAgfSBzZm10X211bHd1MTsKLSAgICBzdHJ1Y3QgeyAvKiBlLmcuIHNjICovCi0gICAgICBpbnQgZW1wdHk7Ci0gICAgfSBzZm10X3NjOwotICB9IG9wZXJhbmRzOwotICAvKiBGb3IgY29uZGl0aW9uYWxseSB3cml0dGVuIG9wZXJhbmRzLCBiaXRtYXNrIG9mIHdoaWNoIG9uZXMgd2VyZS4gICovCi0gIGludCB3cml0dGVuOwotfTsKLQotLyogQ29sbGVjdGlvbiBvZiB2YXJpb3VzIHRoaW5ncyBmb3IgdGhlIHRyYWNlIGhhbmRsZXIgdG8gdXNlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdHJhY2VfcmVjb3JkIHsKLSAgSUFERFIgcGM7Ci0gIC8qIEZJWE1FOndpcCAqLwotfSBUUkFDRV9SRUNPUkQ7Ci0KLSNlbmRpZiAvKiBDUFVfTTMyUlhGX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2RlY29kZS5jIGIvc2ltL20zMnIvZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmI3NzQuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIwICswLDAgQEAKLS8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBkZWNvZGVyIGZvciBtMzJyYmYuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNkZWZpbmUgV0FOVF9DUFUgbTMycmJmCi0jZGVmaW5lIFdBTlRfQ1BVX00zMlJCRgotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIGFycmF5LgotICAgVGhpcyBpcyBjb21wdXRlZCBhdCBydW50aW1lLiAgU3BhY2UgZm9yIGl0IGlzIG5vdCBtYWxsb2MnZCB0byBzYXZlIGEKLSAgIHRlZW5zeSBiaXQgb2YgY3B1IGluIHRoZSBkZWNvZGVyLiAgTW92aW5nIGl0IHRvIG1hbGxvYyBzcGFjZSBpcyB0cml2aWFsCi0gICBidXQgd29uJ3QgYmUgZG9uZSB1bnRpbCBuZWNlc3NhcnkgKHdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBydW50aW1lCi0gICBhZGRpdGlvbiBvZiBpbnN0cnVjdGlvbnMgbm9yIGFuIFNNUCBtYWNoaW5lIHdpdGggZGlmZmVyZW50IGNwdXMpLiAgKi8KLXN0YXRpYyBJREVTQyBtMzJyYmZfaW5zbl9kYXRhW00zMlJCRl9JTlNOX01BWF07Ci0KLS8qIENvbW1hcyBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb250YWluZWQgaW4gdGhlIG1hY3Jvcy4KLSAgIFNvbWUgb2YgdGhlc2UgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgb3V0LiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBtMzJyYmZfaW5zbl9zZW1bXSA9Ci17Ci0gIHsgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCwgTTMyUkJGX0lOU05fWF9JTlZBTElELCBNMzJSQkZfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0FGVEVSLCBNMzJSQkZfSU5TTl9YX0FGVEVSLCBNMzJSQkZfU0ZNVF9FTVBUWSB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgTTMyUkJGX0lOU05fWF9CRUZPUkUsIE0zMlJCRl9TRk1UX0VNUFRZIH0sCi0gIHsgVklSVFVBTF9JTlNOX1hfQ1RJX0NIQUlOLCBNMzJSQkZfSU5TTl9YX0NUSV9DSEFJTiwgTTMyUkJGX1NGTVRfRU1QVFkgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9DSEFJTiwgTTMyUkJGX0lOU05fWF9DSEFJTiwgTTMyUkJGX1NGTVRfRU1QVFkgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9CRUdJTiwgTTMyUkJGX0lOU05fWF9CRUdJTiwgTTMyUkJGX1NGTVRfRU1QVFkgfSwKLSAgeyBNMzJSX0lOU05fQURELCBNMzJSQkZfSU5TTl9BREQsIE0zMlJCRl9TRk1UX0FERCB9LAotICB7IE0zMlJfSU5TTl9BREQzLCBNMzJSQkZfSU5TTl9BREQzLCBNMzJSQkZfU0ZNVF9BREQzIH0sCi0gIHsgTTMyUl9JTlNOX0FORCwgTTMyUkJGX0lOU05fQU5ELCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fQU5EMywgTTMyUkJGX0lOU05fQU5EMywgTTMyUkJGX1NGTVRfQU5EMyB9LAotICB7IE0zMlJfSU5TTl9PUiwgTTMyUkJGX0lOU05fT1IsIE0zMlJCRl9TRk1UX0FERCB9LAotICB7IE0zMlJfSU5TTl9PUjMsIE0zMlJCRl9JTlNOX09SMywgTTMyUkJGX1NGTVRfT1IzIH0sCi0gIHsgTTMyUl9JTlNOX1hPUiwgTTMyUkJGX0lOU05fWE9SLCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fWE9SMywgTTMyUkJGX0lOU05fWE9SMywgTTMyUkJGX1NGTVRfQU5EMyB9LAotICB7IE0zMlJfSU5TTl9BRERJLCBNMzJSQkZfSU5TTl9BRERJLCBNMzJSQkZfU0ZNVF9BRERJIH0sCi0gIHsgTTMyUl9JTlNOX0FERFYsIE0zMlJCRl9JTlNOX0FERFYsIE0zMlJCRl9TRk1UX0FERFYgfSwKLSAgeyBNMzJSX0lOU05fQUREVjMsIE0zMlJCRl9JTlNOX0FERFYzLCBNMzJSQkZfU0ZNVF9BRERWMyB9LAotICB7IE0zMlJfSU5TTl9BRERYLCBNMzJSQkZfSU5TTl9BRERYLCBNMzJSQkZfU0ZNVF9BRERYIH0sCi0gIHsgTTMyUl9JTlNOX0JDOCwgTTMyUkJGX0lOU05fQkM4LCBNMzJSQkZfU0ZNVF9CQzggfSwKLSAgeyBNMzJSX0lOU05fQkMyNCwgTTMyUkJGX0lOU05fQkMyNCwgTTMyUkJGX1NGTVRfQkMyNCB9LAotICB7IE0zMlJfSU5TTl9CRVEsIE0zMlJCRl9JTlNOX0JFUSwgTTMyUkJGX1NGTVRfQkVRIH0sCi0gIHsgTTMyUl9JTlNOX0JFUVosIE0zMlJCRl9JTlNOX0JFUVosIE0zMlJCRl9TRk1UX0JFUVogfSwKLSAgeyBNMzJSX0lOU05fQkdFWiwgTTMyUkJGX0lOU05fQkdFWiwgTTMyUkJGX1NGTVRfQkVRWiB9LAotICB7IE0zMlJfSU5TTl9CR1RaLCBNMzJSQkZfSU5TTl9CR1RaLCBNMzJSQkZfU0ZNVF9CRVFaIH0sCi0gIHsgTTMyUl9JTlNOX0JMRVosIE0zMlJCRl9JTlNOX0JMRVosIE0zMlJCRl9TRk1UX0JFUVogfSwKLSAgeyBNMzJSX0lOU05fQkxUWiwgTTMyUkJGX0lOU05fQkxUWiwgTTMyUkJGX1NGTVRfQkVRWiB9LAotICB7IE0zMlJfSU5TTl9CTkVaLCBNMzJSQkZfSU5TTl9CTkVaLCBNMzJSQkZfU0ZNVF9CRVFaIH0sCi0gIHsgTTMyUl9JTlNOX0JMOCwgTTMyUkJGX0lOU05fQkw4LCBNMzJSQkZfU0ZNVF9CTDggfSwKLSAgeyBNMzJSX0lOU05fQkwyNCwgTTMyUkJGX0lOU05fQkwyNCwgTTMyUkJGX1NGTVRfQkwyNCB9LAotICB7IE0zMlJfSU5TTl9CTkM4LCBNMzJSQkZfSU5TTl9CTkM4LCBNMzJSQkZfU0ZNVF9CQzggfSwKLSAgeyBNMzJSX0lOU05fQk5DMjQsIE0zMlJCRl9JTlNOX0JOQzI0LCBNMzJSQkZfU0ZNVF9CQzI0IH0sCi0gIHsgTTMyUl9JTlNOX0JORSwgTTMyUkJGX0lOU05fQk5FLCBNMzJSQkZfU0ZNVF9CRVEgfSwKLSAgeyBNMzJSX0lOU05fQlJBOCwgTTMyUkJGX0lOU05fQlJBOCwgTTMyUkJGX1NGTVRfQlJBOCB9LAotICB7IE0zMlJfSU5TTl9CUkEyNCwgTTMyUkJGX0lOU05fQlJBMjQsIE0zMlJCRl9TRk1UX0JSQTI0IH0sCi0gIHsgTTMyUl9JTlNOX0NNUCwgTTMyUkJGX0lOU05fQ01QLCBNMzJSQkZfU0ZNVF9DTVAgfSwKLSAgeyBNMzJSX0lOU05fQ01QSSwgTTMyUkJGX0lOU05fQ01QSSwgTTMyUkJGX1NGTVRfQ01QSSB9LAotICB7IE0zMlJfSU5TTl9DTVBVLCBNMzJSQkZfSU5TTl9DTVBVLCBNMzJSQkZfU0ZNVF9DTVAgfSwKLSAgeyBNMzJSX0lOU05fQ01QVUksIE0zMlJCRl9JTlNOX0NNUFVJLCBNMzJSQkZfU0ZNVF9DTVBJIH0sCi0gIHsgTTMyUl9JTlNOX0RJViwgTTMyUkJGX0lOU05fRElWLCBNMzJSQkZfU0ZNVF9ESVYgfSwKLSAgeyBNMzJSX0lOU05fRElWVSwgTTMyUkJGX0lOU05fRElWVSwgTTMyUkJGX1NGTVRfRElWIH0sCi0gIHsgTTMyUl9JTlNOX1JFTSwgTTMyUkJGX0lOU05fUkVNLCBNMzJSQkZfU0ZNVF9ESVYgfSwKLSAgeyBNMzJSX0lOU05fUkVNVSwgTTMyUkJGX0lOU05fUkVNVSwgTTMyUkJGX1NGTVRfRElWIH0sCi0gIHsgTTMyUl9JTlNOX0pMLCBNMzJSQkZfSU5TTl9KTCwgTTMyUkJGX1NGTVRfSkwgfSwKLSAgeyBNMzJSX0lOU05fSk1QLCBNMzJSQkZfSU5TTl9KTVAsIE0zMlJCRl9TRk1UX0pNUCB9LAotICB7IE0zMlJfSU5TTl9MRCwgTTMyUkJGX0lOU05fTEQsIE0zMlJCRl9TRk1UX0xEIH0sCi0gIHsgTTMyUl9JTlNOX0xEX0QsIE0zMlJCRl9JTlNOX0xEX0QsIE0zMlJCRl9TRk1UX0xEX0QgfSwKLSAgeyBNMzJSX0lOU05fTERCLCBNMzJSQkZfSU5TTl9MREIsIE0zMlJCRl9TRk1UX0xEIH0sCi0gIHsgTTMyUl9JTlNOX0xEQl9ELCBNMzJSQkZfSU5TTl9MREJfRCwgTTMyUkJGX1NGTVRfTERfRCB9LAotICB7IE0zMlJfSU5TTl9MREgsIE0zMlJCRl9JTlNOX0xESCwgTTMyUkJGX1NGTVRfTEQgfSwKLSAgeyBNMzJSX0lOU05fTERIX0QsIE0zMlJCRl9JTlNOX0xESF9ELCBNMzJSQkZfU0ZNVF9MRF9EIH0sCi0gIHsgTTMyUl9JTlNOX0xEVUIsIE0zMlJCRl9JTlNOX0xEVUIsIE0zMlJCRl9TRk1UX0xEIH0sCi0gIHsgTTMyUl9JTlNOX0xEVUJfRCwgTTMyUkJGX0lOU05fTERVQl9ELCBNMzJSQkZfU0ZNVF9MRF9EIH0sCi0gIHsgTTMyUl9JTlNOX0xEVUgsIE0zMlJCRl9JTlNOX0xEVUgsIE0zMlJCRl9TRk1UX0xEIH0sCi0gIHsgTTMyUl9JTlNOX0xEVUhfRCwgTTMyUkJGX0lOU05fTERVSF9ELCBNMzJSQkZfU0ZNVF9MRF9EIH0sCi0gIHsgTTMyUl9JTlNOX0xEX1BMVVMsIE0zMlJCRl9JTlNOX0xEX1BMVVMsIE0zMlJCRl9TRk1UX0xEX1BMVVMgfSwKLSAgeyBNMzJSX0lOU05fTEQyNCwgTTMyUkJGX0lOU05fTEQyNCwgTTMyUkJGX1NGTVRfTEQyNCB9LAotICB7IE0zMlJfSU5TTl9MREk4LCBNMzJSQkZfSU5TTl9MREk4LCBNMzJSQkZfU0ZNVF9MREk4IH0sCi0gIHsgTTMyUl9JTlNOX0xESTE2LCBNMzJSQkZfSU5TTl9MREkxNiwgTTMyUkJGX1NGTVRfTERJMTYgfSwKLSAgeyBNMzJSX0lOU05fTE9DSywgTTMyUkJGX0lOU05fTE9DSywgTTMyUkJGX1NGTVRfTE9DSyB9LAotICB7IE0zMlJfSU5TTl9NQUNISSwgTTMyUkJGX0lOU05fTUFDSEksIE0zMlJCRl9TRk1UX01BQ0hJIH0sCi0gIHsgTTMyUl9JTlNOX01BQ0xPLCBNMzJSQkZfSU5TTl9NQUNMTywgTTMyUkJGX1NGTVRfTUFDSEkgfSwKLSAgeyBNMzJSX0lOU05fTUFDV0hJLCBNMzJSQkZfSU5TTl9NQUNXSEksIE0zMlJCRl9TRk1UX01BQ0hJIH0sCi0gIHsgTTMyUl9JTlNOX01BQ1dMTywgTTMyUkJGX0lOU05fTUFDV0xPLCBNMzJSQkZfU0ZNVF9NQUNISSB9LAotICB7IE0zMlJfSU5TTl9NVUwsIE0zMlJCRl9JTlNOX01VTCwgTTMyUkJGX1NGTVRfQUREIH0sCi0gIHsgTTMyUl9JTlNOX01VTEhJLCBNMzJSQkZfSU5TTl9NVUxISSwgTTMyUkJGX1NGTVRfTVVMSEkgfSwKLSAgeyBNMzJSX0lOU05fTVVMTE8sIE0zMlJCRl9JTlNOX01VTExPLCBNMzJSQkZfU0ZNVF9NVUxISSB9LAotICB7IE0zMlJfSU5TTl9NVUxXSEksIE0zMlJCRl9JTlNOX01VTFdISSwgTTMyUkJGX1NGTVRfTVVMSEkgfSwKLSAgeyBNMzJSX0lOU05fTVVMV0xPLCBNMzJSQkZfSU5TTl9NVUxXTE8sIE0zMlJCRl9TRk1UX01VTEhJIH0sCi0gIHsgTTMyUl9JTlNOX01WLCBNMzJSQkZfSU5TTl9NViwgTTMyUkJGX1NGTVRfTVYgfSwKLSAgeyBNMzJSX0lOU05fTVZGQUNISSwgTTMyUkJGX0lOU05fTVZGQUNISSwgTTMyUkJGX1NGTVRfTVZGQUNISSB9LAotICB7IE0zMlJfSU5TTl9NVkZBQ0xPLCBNMzJSQkZfSU5TTl9NVkZBQ0xPLCBNMzJSQkZfU0ZNVF9NVkZBQ0hJIH0sCi0gIHsgTTMyUl9JTlNOX01WRkFDTUksIE0zMlJCRl9JTlNOX01WRkFDTUksIE0zMlJCRl9TRk1UX01WRkFDSEkgfSwKLSAgeyBNMzJSX0lOU05fTVZGQywgTTMyUkJGX0lOU05fTVZGQywgTTMyUkJGX1NGTVRfTVZGQyB9LAotICB7IE0zMlJfSU5TTl9NVlRBQ0hJLCBNMzJSQkZfSU5TTl9NVlRBQ0hJLCBNMzJSQkZfU0ZNVF9NVlRBQ0hJIH0sCi0gIHsgTTMyUl9JTlNOX01WVEFDTE8sIE0zMlJCRl9JTlNOX01WVEFDTE8sIE0zMlJCRl9TRk1UX01WVEFDSEkgfSwKLSAgeyBNMzJSX0lOU05fTVZUQywgTTMyUkJGX0lOU05fTVZUQywgTTMyUkJGX1NGTVRfTVZUQyB9LAotICB7IE0zMlJfSU5TTl9ORUcsIE0zMlJCRl9JTlNOX05FRywgTTMyUkJGX1NGTVRfTVYgfSwKLSAgeyBNMzJSX0lOU05fTk9QLCBNMzJSQkZfSU5TTl9OT1AsIE0zMlJCRl9TRk1UX05PUCB9LAotICB7IE0zMlJfSU5TTl9OT1QsIE0zMlJCRl9JTlNOX05PVCwgTTMyUkJGX1NGTVRfTVYgfSwKLSAgeyBNMzJSX0lOU05fUkFDLCBNMzJSQkZfSU5TTl9SQUMsIE0zMlJCRl9TRk1UX1JBQyB9LAotICB7IE0zMlJfSU5TTl9SQUNILCBNMzJSQkZfSU5TTl9SQUNILCBNMzJSQkZfU0ZNVF9SQUMgfSwKLSAgeyBNMzJSX0lOU05fUlRFLCBNMzJSQkZfSU5TTl9SVEUsIE0zMlJCRl9TRk1UX1JURSB9LAotICB7IE0zMlJfSU5TTl9TRVRILCBNMzJSQkZfSU5TTl9TRVRILCBNMzJSQkZfU0ZNVF9TRVRIIH0sCi0gIHsgTTMyUl9JTlNOX1NMTCwgTTMyUkJGX0lOU05fU0xMLCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fU0xMMywgTTMyUkJGX0lOU05fU0xMMywgTTMyUkJGX1NGTVRfU0xMMyB9LAotICB7IE0zMlJfSU5TTl9TTExJLCBNMzJSQkZfSU5TTl9TTExJLCBNMzJSQkZfU0ZNVF9TTExJIH0sCi0gIHsgTTMyUl9JTlNOX1NSQSwgTTMyUkJGX0lOU05fU1JBLCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fU1JBMywgTTMyUkJGX0lOU05fU1JBMywgTTMyUkJGX1NGTVRfU0xMMyB9LAotICB7IE0zMlJfSU5TTl9TUkFJLCBNMzJSQkZfSU5TTl9TUkFJLCBNMzJSQkZfU0ZNVF9TTExJIH0sCi0gIHsgTTMyUl9JTlNOX1NSTCwgTTMyUkJGX0lOU05fU1JMLCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fU1JMMywgTTMyUkJGX0lOU05fU1JMMywgTTMyUkJGX1NGTVRfU0xMMyB9LAotICB7IE0zMlJfSU5TTl9TUkxJLCBNMzJSQkZfSU5TTl9TUkxJLCBNMzJSQkZfU0ZNVF9TTExJIH0sCi0gIHsgTTMyUl9JTlNOX1NULCBNMzJSQkZfSU5TTl9TVCwgTTMyUkJGX1NGTVRfU1QgfSwKLSAgeyBNMzJSX0lOU05fU1RfRCwgTTMyUkJGX0lOU05fU1RfRCwgTTMyUkJGX1NGTVRfU1RfRCB9LAotICB7IE0zMlJfSU5TTl9TVEIsIE0zMlJCRl9JTlNOX1NUQiwgTTMyUkJGX1NGTVRfU1RCIH0sCi0gIHsgTTMyUl9JTlNOX1NUQl9ELCBNMzJSQkZfSU5TTl9TVEJfRCwgTTMyUkJGX1NGTVRfU1RCX0QgfSwKLSAgeyBNMzJSX0lOU05fU1RILCBNMzJSQkZfSU5TTl9TVEgsIE0zMlJCRl9TRk1UX1NUSCB9LAotICB7IE0zMlJfSU5TTl9TVEhfRCwgTTMyUkJGX0lOU05fU1RIX0QsIE0zMlJCRl9TRk1UX1NUSF9EIH0sCi0gIHsgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJCRl9JTlNOX1NUX1BMVVMsIE0zMlJCRl9TRk1UX1NUX1BMVVMgfSwKLSAgeyBNMzJSX0lOU05fU1RfTUlOVVMsIE0zMlJCRl9JTlNOX1NUX01JTlVTLCBNMzJSQkZfU0ZNVF9TVF9QTFVTIH0sCi0gIHsgTTMyUl9JTlNOX1NVQiwgTTMyUkJGX0lOU05fU1VCLCBNMzJSQkZfU0ZNVF9BREQgfSwKLSAgeyBNMzJSX0lOU05fU1VCViwgTTMyUkJGX0lOU05fU1VCViwgTTMyUkJGX1NGTVRfQUREViB9LAotICB7IE0zMlJfSU5TTl9TVUJYLCBNMzJSQkZfSU5TTl9TVUJYLCBNMzJSQkZfU0ZNVF9BRERYIH0sCi0gIHsgTTMyUl9JTlNOX1RSQVAsIE0zMlJCRl9JTlNOX1RSQVAsIE0zMlJCRl9TRk1UX1RSQVAgfSwKLSAgeyBNMzJSX0lOU05fVU5MT0NLLCBNMzJSQkZfSU5TTl9VTkxPQ0ssIE0zMlJCRl9TRk1UX1VOTE9DSyB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBtMzJyYmZfaW5zbl9zZW1faW52YWxpZCA9IHsKLSAgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCwgTTMyUkJGX0lOU05fWF9JTlZBTElELCBNMzJSQkZfU0ZNVF9FTVBUWQotfTsKLQotLyogSW5pdGlhbGl6ZSBhbiBJREVTQyBmcm9tIHRoZSBjb21waWxlLXRpbWUgY29tcHV0YWJsZSBwYXJ0cy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5pdF9pZGVzYyAoU0lNX0NQVSAqY3B1LCBJREVTQyAqaWQsIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSAqdCkKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICppbnNuX3RhYmxlID0gQ0dFTl9DUFVfSU5TTl9UQUJMRSAoQ1BVX0NQVV9ERVNDIChjcHUpKS0+aW5pdF9lbnRyaWVzOwotCi0gIGlkLT5udW0gPSB0LT5pbmRleDsKLSAgaWQtPnNmbXQgPSB0LT5zZm10OwotICBpZiAoKGludCkgdC0+dHlwZSA8PSAwKQotICAgIGlkLT5pZGF0YSA9ICYgY2dlbl92aXJ0dWFsX2luc25fdGFibGVbLSAoaW50KSB0LT50eXBlXTsKLSAgZWxzZQotICAgIGlkLT5pZGF0YSA9ICYgaW5zbl90YWJsZVt0LT50eXBlXTsKLSAgaWQtPmF0dHJzID0gQ0dFTl9JTlNOX0FUVFJTIChpZC0+aWRhdGEpOwotICAvKiBPaCBteSBnb2QsIGEgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaWQtPmxlbmd0aCA9IENHRU5fSU5TTl9CSVRTSVpFIChpZC0+aWRhdGEpIC8gODsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIGlkLT50aW1pbmcgPSAmIE1PREVMX1RJTUlORyAoQ1BVX01PREVMIChjcHUpKSBbdC0+aW5kZXhdOwotICB7Ci0gICAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7Ci0gICAgU0lNX0FTU0VSVCAodC0+aW5kZXggPT0gaWQtPnRpbWluZy0+bnVtKTsKLSAgfQotI2VuZGlmCi0KLSAgLyogU2VtYW50aWMgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkIGVsc2V3aGVyZS4gICovCi19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGFibGUuICAqLwotCi12b2lkCi1tMzJyYmZfaW5pdF9pZGVzY190YWJsZSAoU0lNX0NQVSAqY3B1KQotewotICBJREVTQyAqaWQsKnRhYmVuZDsKLSAgY29uc3Qgc3RydWN0IGluc25fc2VtICp0LCp0ZW5kOwotICBpbnQgdGFic2l6ZSA9IE0zMlJCRl9JTlNOX01BWDsKLSAgSURFU0MgKnRhYmxlID0gbTMycmJmX2luc25fZGF0YTsKLQotICBtZW1zZXQgKHRhYmxlLCAwLCB0YWJzaXplICogc2l6ZW9mIChJREVTQykpOwotCi0gIC8qIEZpcnN0IHNldCBhbGwgZW50cmllcyB0byB0aGUgYGludmFsaWQgaW5zbicuICAqLwotICB0ID0gJiBtMzJyYmZfaW5zbl9zZW1faW52YWxpZDsKLSAgZm9yIChpZCA9IHRhYmxlLCB0YWJlbmQgPSB0YWJsZSArIHRhYnNpemU7IGlkIDwgdGFiZW5kOyArK2lkKQotICAgIGluaXRfaWRlc2MgKGNwdSwgaWQsIHQpOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRoZSBjaG9zZW4gY3B1LiAgKi8KLSAgZm9yICh0ID0gbTMycmJmX2luc25fc2VtLCB0ZW5kID0gdCArIHNpemVvZiAobTMycmJmX2luc25fc2VtKSAvIHNpemVvZiAoKnQpOwotICAgICAgIHQgIT0gdGVuZDsgKyt0KQotICAgIHsKLSAgICAgIGluaXRfaWRlc2MgKGNwdSwgJiB0YWJsZVt0LT5pbmRleF0sIHQpOwotICAgIH0KLQotICAvKiBMaW5rIHRoZSBJREVTQyB0YWJsZSBpbnRvIHRoZSBjcHUuICAqLwotICBDUFVfSURFU0MgKGNwdSkgPSB0YWJsZTsKLX0KLQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gaXRzIElERVNDIGVudHJ5LiAgKi8KLQotY29uc3QgSURFU0MgKgotbTMycmJmX2RlY29kZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIElBRERSIHBjLAotICAgICAgICAgICAgICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbiwgQ0dFTl9JTlNOX0lOVCBlbnRpcmVfaW5zbiwKLSAgICAgICAgICAgICAgQVJHQlVGICphYnVmKQotewotICAvKiBSZXN1bHQgb2YgZGVjb2Rlci4gICovCi0gIE0zMlJCRl9JTlNOX1RZUEUgaXR5cGU7Ci0KLSAgewotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKLQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDQpKSB8ICgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOwotICAgICAgc3dpdGNoICh2YWwpCi0gICAgICB7Ci0gICAgICBjYXNlIDAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NVQlY7IGdvdG8gZXh0cmFjdF9zZm10X2FkZHY7Ci0gICAgICBjYXNlIDEgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NVQlg7IGdvdG8gZXh0cmFjdF9zZm10X2FkZHg7Ci0gICAgICBjYXNlIDIgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NVQjsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAzIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9ORUc7IGdvdG8gZXh0cmFjdF9zZm10X212OwotICAgICAgY2FzZSA0IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9DTVA7IGdvdG8gZXh0cmFjdF9zZm10X2NtcDsKLSAgICAgIGNhc2UgNSA6IGl0eXBlID0gTTMyUkJGX0lOU05fQ01QVTsgZ290byBleHRyYWN0X3NmbXRfY21wOwotICAgICAgY2FzZSA4IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9BRERWOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGR2OwotICAgICAgY2FzZSA5IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9BRERYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGR4OwotICAgICAgY2FzZSAxMCA6IGl0eXBlID0gTTMyUkJGX0lOU05fQUREOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDExIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9OT1Q7IGdvdG8gZXh0cmFjdF9zZm10X212OwotICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUkJGX0lOU05fQU5EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDEzIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9YT1I7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX09SOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDE2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TUkw7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMTggOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NSQTsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAyMCA6IGl0eXBlID0gTTMyUkJGX0lOU05fU0xMOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDIyIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NVUw7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMjQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX01WOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdjsKLSAgICAgIGNhc2UgMjUgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX01WRkM7IGdvdG8gZXh0cmFjdF9zZm10X212ZmM7Ci0gICAgICBjYXNlIDI2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NVlRDOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdnRjOwotICAgICAgY2FzZSAyOCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA4KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9KTDsgZ290byBleHRyYWN0X3NmbXRfamw7Ci0gICAgICAgICAgY2FzZSAxNSA6IGl0eXBlID0gTTMyUkJGX0lOU05fSk1QOyBnb3RvIGV4dHJhY3Rfc2ZtdF9qbXA7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUkJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMjkgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1JURTsgZ290byBleHRyYWN0X3NmbXRfcnRlOwotICAgICAgY2FzZSAzMSA6IGl0eXBlID0gTTMyUkJGX0lOU05fVFJBUDsgZ290byBleHRyYWN0X3NmbXRfdHJhcDsKLSAgICAgIGNhc2UgMzIgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NUQjsgZ290byBleHRyYWN0X3NmbXRfc3RiOwotICAgICAgY2FzZSAzNCA6IGl0eXBlID0gTTMyUkJGX0lOU05fU1RIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdGg7Ci0gICAgICBjYXNlIDM2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TVDsgZ290byBleHRyYWN0X3NmbXRfc3Q7Ci0gICAgICBjYXNlIDM3IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9VTkxPQ0s7IGdvdG8gZXh0cmFjdF9zZm10X3VubG9jazsKLSAgICAgIGNhc2UgMzggOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NUX1BMVVM7IGdvdG8gZXh0cmFjdF9zZm10X3N0X3BsdXM7Ci0gICAgICBjYXNlIDM5IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TVF9NSU5VUzsgZ290byBleHRyYWN0X3NmbXRfc3RfcGx1czsKLSAgICAgIGNhc2UgNDAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xEQjsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDQxIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9MRFVCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZDsKLSAgICAgIGNhc2UgNDIgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xESDsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDQzIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9MRFVIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZDsKLSAgICAgIGNhc2UgNDQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZDsKLSAgICAgIGNhc2UgNDUgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xPQ0s7IGdvdG8gZXh0cmFjdF9zZm10X2xvY2s7Ci0gICAgICBjYXNlIDQ2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9MRF9QTFVTOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9wbHVzOwotICAgICAgY2FzZSA0OCA6IGl0eXBlID0gTTMyUkJGX0lOU05fTVVMSEk7IGdvdG8gZXh0cmFjdF9zZm10X211bGhpOwotICAgICAgY2FzZSA0OSA6IGl0eXBlID0gTTMyUkJGX0lOU05fTVVMTE87IGdvdG8gZXh0cmFjdF9zZm10X211bGhpOwotICAgICAgY2FzZSA1MCA6IGl0eXBlID0gTTMyUkJGX0lOU05fTVVMV0hJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxoaTsKLSAgICAgIGNhc2UgNTEgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX01VTFdMTzsgZ290byBleHRyYWN0X3NmbXRfbXVsaGk7Ci0gICAgICBjYXNlIDUyIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NQUNISTsgZ290byBleHRyYWN0X3NmbXRfbWFjaGk7Ci0gICAgICBjYXNlIDUzIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NQUNMTzsgZ290byBleHRyYWN0X3NmbXRfbWFjaGk7Ci0gICAgICBjYXNlIDU0IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NQUNXSEk7IGdvdG8gZXh0cmFjdF9zZm10X21hY2hpOwotICAgICAgY2FzZSA1NSA6IGl0eXBlID0gTTMyUkJGX0lOU05fTUFDV0xPOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tYWNoaTsKLSAgICAgIGNhc2UgNjQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzkgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0FEREk7IGdvdG8gZXh0cmFjdF9zZm10X2FkZGk7Ci0gICAgICBjYXNlIDgwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDgxIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TUkxJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zbGxpOwotICAgICAgY2FzZSA4MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA4MyA6IGl0eXBlID0gTTMyUkJGX0lOU05fU1JBSTsgZ290byBleHRyYWN0X3NmbXRfc2xsaTsKLSAgICAgIGNhc2UgODQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODUgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NMTEk7IGdvdG8gZXh0cmFjdF9zZm10X3NsbGk7Ci0gICAgICBjYXNlIDg3IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDApICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gTTMyUkJGX0lOU05fTVZUQUNISTsgZ290byBleHRyYWN0X3NmbXRfbXZ0YWNoaTsKLSAgICAgICAgICBjYXNlIDEgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX01WVEFDTE87IGdvdG8gZXh0cmFjdF9zZm10X212dGFjaGk7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUkJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgODggOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1JBQ0g7IGdvdG8gZXh0cmFjdF9zZm10X3JhYzsKLSAgICAgIGNhc2UgODkgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1JBQzsgZ290byBleHRyYWN0X3NmbXRfcmFjOwotICAgICAgY2FzZSA5NSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAwKSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX01WRkFDSEk7IGdvdG8gZXh0cmFjdF9zZm10X212ZmFjaGk7Ci0gICAgICAgICAgY2FzZSAxIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9NVkZBQ0xPOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdmZhY2hpOwotICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gTTMyUkJGX0lOU05fTVZGQUNNSTsgZ290byBleHRyYWN0X3NmbXRfbXZmYWNoaTsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSA5NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5OCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA5OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTAxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA0IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwNSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA3IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTEwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExMSA6IGl0eXBlID0gTTMyUkJGX0lOU05fTERJODsgZ290byBleHRyYWN0X3NmbXRfbGRpODsKLSAgICAgIGNhc2UgMTEyIDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gTTMyUkJGX0lOU05fTk9QOyBnb3RvIGV4dHJhY3Rfc2ZtdF9ub3A7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUkJGX0lOU05fQkM4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYzg7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUkJGX0lOU05fQk5DODsgZ290byBleHRyYWN0X3NmbXRfYmM4OwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JMODsgZ290byBleHRyYWN0X3NmbXRfYmw4OwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JSQTg7IGdvdG8gZXh0cmFjdF9zZm10X2JyYTg7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUkJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTEzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExNCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExNyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTIyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTI1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjcgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUkJGX0lOU05fQkM4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYzg7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUkJGX0lOU05fQk5DODsgZ290byBleHRyYWN0X3NmbXRfYmM4OwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JMODsgZ290byBleHRyYWN0X3NmbXRfYmw4OwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JSQTg7IGdvdG8gZXh0cmFjdF9zZm10X2JyYTg7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUkJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTMyIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9DTVBJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBpOwotICAgICAgY2FzZSAxMzMgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0NNUFVJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBpOwotICAgICAgY2FzZSAxMzYgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0FERFYzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGR2MzsKLSAgICAgIGNhc2UgMTM4IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9BREQzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQzOwotICAgICAgY2FzZSAxNDAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0FORDM7IGdvdG8gZXh0cmFjdF9zZm10X2FuZDM7Ci0gICAgICBjYXNlIDE0MSA6IGl0eXBlID0gTTMyUkJGX0lOU05fWE9SMzsgZ290byBleHRyYWN0X3NmbXRfYW5kMzsKLSAgICAgIGNhc2UgMTQyIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9PUjM7IGdvdG8gZXh0cmFjdF9zZm10X29yMzsKLSAgICAgIGNhc2UgMTQ0IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9ESVY7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjsKLSAgICAgIGNhc2UgMTQ1IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9ESVZVOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kaXY7Ci0gICAgICBjYXNlIDE0NiA6IGl0eXBlID0gTTMyUkJGX0lOU05fUkVNOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kaXY7Ci0gICAgICBjYXNlIDE0NyA6IGl0eXBlID0gTTMyUkJGX0lOU05fUkVNVTsgZ290byBleHRyYWN0X3NmbXRfZGl2OwotICAgICAgY2FzZSAxNTIgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NSTDM7IGdvdG8gZXh0cmFjdF9zZm10X3NsbDM7Ci0gICAgICBjYXNlIDE1NCA6IGl0eXBlID0gTTMyUkJGX0lOU05fU1JBMzsgZ290byBleHRyYWN0X3NmbXRfc2xsMzsKLSAgICAgIGNhc2UgMTU2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TTEwzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zbGwzOwotICAgICAgY2FzZSAxNTkgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xESTE2OyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZGkxNjsKLSAgICAgIGNhc2UgMTYwIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9TVEJfRDsgZ290byBleHRyYWN0X3NmbXRfc3RiX2Q7Ci0gICAgICBjYXNlIDE2MiA6IGl0eXBlID0gTTMyUkJGX0lOU05fU1RIX0Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0aF9kOwotICAgICAgY2FzZSAxNjQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NUX0Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0X2Q7Ci0gICAgICBjYXNlIDE2OCA6IGl0eXBlID0gTTMyUkJGX0lOU05fTERCX0Q7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2Q7Ci0gICAgICBjYXNlIDE2OSA6IGl0eXBlID0gTTMyUkJGX0lOU05fTERVQl9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kOwotICAgICAgY2FzZSAxNzAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xESF9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kOwotICAgICAgY2FzZSAxNzEgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0xEVUhfRDsgZ290byBleHRyYWN0X3NmbXRfbGRfZDsKLSAgICAgIGNhc2UgMTcyIDogaXR5cGUgPSBNMzJSQkZfSU5TTl9MRF9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kOwotICAgICAgY2FzZSAxNzYgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JFUTsgZ290byBleHRyYWN0X3NmbXRfYmVxOwotICAgICAgY2FzZSAxNzcgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JORTsgZ290byBleHRyYWN0X3NmbXRfYmVxOwotICAgICAgY2FzZSAxODQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JFUVo7IGdvdG8gZXh0cmFjdF9zZm10X2JlcXo7Ci0gICAgICBjYXNlIDE4NSA6IGl0eXBlID0gTTMyUkJGX0lOU05fQk5FWjsgZ290byBleHRyYWN0X3NmbXRfYmVxejsKLSAgICAgIGNhc2UgMTg2IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9CTFRaOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXF6OwotICAgICAgY2FzZSAxODcgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JHRVo7IGdvdG8gZXh0cmFjdF9zZm10X2JlcXo7Ci0gICAgICBjYXNlIDE4OCA6IGl0eXBlID0gTTMyUkJGX0lOU05fQkxFWjsgZ290byBleHRyYWN0X3NmbXRfYmVxejsKLSAgICAgIGNhc2UgMTg5IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9CR1RaOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXF6OwotICAgICAgY2FzZSAyMjAgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1NFVEg7IGdvdG8gZXh0cmFjdF9zZm10X3NldGg7Ci0gICAgICBjYXNlIDIyNCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMjUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjI2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIyNyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMjggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjI5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjMyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjM1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjM4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzOSA6IGl0eXBlID0gTTMyUkJGX0lOU05fTEQyNDsgZ290byBleHRyYWN0X3NmbXRfbGQyNDsKLSAgICAgIGNhc2UgMjQwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0MSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQ2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0NyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQ5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI1MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNTEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjUyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI1MyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNTQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjU1IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX0JDMjQ7IGdvdG8gZXh0cmFjdF9zZm10X2JjMjQ7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUkJGX0lOU05fQk5DMjQ7IGdvdG8gZXh0cmFjdF9zZm10X2JjMjQ7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gTTMyUkJGX0lOU05fQkwyNDsgZ290byBleHRyYWN0X3NmbXRfYmwyNDsKLSAgICAgICAgICBjYXNlIDE1IDogaXR5cGUgPSBNMzJSQkZfSU5TTl9CUkEyNDsgZ290byBleHRyYWN0X3NmbXRfYnJhMjQ7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUkJGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IE0zMlJCRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGRlY29kZWQsIG5vdyBleHRyYWN0IHRoZSBmaWVsZHMuICAqLwotCi0gZXh0cmFjdF9zZm10X2VtcHR5OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZW1wdHkiLCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZCIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAic3IgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2RyKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FkZDM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIElOVCBmX3NpbW0xNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGQzIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hbmQzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBVSU5UIGZfdWltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfdWltbTE2ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91aW1tMTYpID0gZl91aW1tMTY7Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hbmQzIiwgImZfdWltbTE2IDB4JXgiLCAneCcsIGZfdWltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9vcjM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hbmQzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIFVJTlQgZl91aW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl91aW1tMTYgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3VpbW0xNikgPSBmX3VpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X29yMyIsICJmX3VpbW0xNiAweCV4IiwgJ3gnLCBmX3VpbW0xNiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICAgIFVJTlQgZl9yMTsKLSAgICBJTlQgZl9zaW1tODsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfc2ltbTggPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW04KSA9IGZfc2ltbTg7Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGRpIiwgImZfc2ltbTggMHgleCIsICd4JywgZl9zaW1tOCwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9kcikgPSBmX3IxOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGR2OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGR2IiwgImRyIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkdjM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIElOVCBmX3NpbW0xNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGR2MyIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkeDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYWRkeCIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAic3IgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2RyKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JjODoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gICAgU0kgZl9kaXNwODsKLQotICAgIGZfZGlzcDggPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpKSArICgoKHBjKSAmICgtNCkpKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2Rpc3A4KSA9IGZfZGlzcDg7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iYzgiLCAiZGlzcDggMHgleCIsICd4JywgZl9kaXNwOCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmMyNDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICAgIFNJIGZfZGlzcDI0OwotCi0gICAgZl9kaXNwMjQgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDgsIDI0KSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDI0KSA9IGZfZGlzcDI0OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmMyNCIsICJkaXNwMjQgMHgleCIsICd4JywgZl9kaXNwMjQsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JlcToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBTSSBmX2Rpc3AxNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDE2KSA9IGZfZGlzcDE2OwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JlcSIsICJkaXNwMTYgMHgleCIsICd4JywgZl9kaXNwMTYsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9iZXF6OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgICBVSU5UIGZfcjI7Ci0gICAgU0kgZl9kaXNwMTY7Ci0KLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl9kaXNwMTYgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNikpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2Rpc3AxNikgPSBmX2Rpc3AxNjsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmVxeiIsICJkaXNwMTYgMHgleCIsICd4JywgZl9kaXNwMTYsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmw4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgICBTSSBmX2Rpc3A4OwotCi0gICAgZl9kaXNwOCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSkpICsgKCgocGMpICYgKC00KSkpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDgpID0gZl9kaXNwODsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JsOCIsICJkaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmwyNDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICAgIFNJIGZfZGlzcDI0OwotCi0gICAgZl9kaXNwMjQgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDgsIDI0KSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDI0KSA9IGZfZGlzcDI0OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmwyNCIsICJkaXNwMjQgMHgleCIsICd4JywgZl9kaXNwMjQsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9icmE4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgICBTSSBmX2Rpc3A4OwotCi0gICAgZl9kaXNwOCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSkpICsgKCgocGMpICYgKC00KSkpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDgpID0gZl9kaXNwODsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JyYTgiLCAiZGlzcDggMHgleCIsICd4JywgZl9kaXNwOCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYnJhMjQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgICBTSSBmX2Rpc3AyNDsKLQotICAgIGZfZGlzcDI0ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCA4LCAyNCkpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2Rpc3AyNCkgPSBmX2Rpc3AyNDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JyYTI0IiwgImRpc3AyNCAweCV4IiwgJ3gnLCBmX2Rpc3AyNCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfY21wOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcCIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXBpOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gICAgVUlOVCBmX3IyOwotICAgIElOVCBmX3NpbW0xNjsKLQotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcGkiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfZGl2OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9kaXYiLCAiZHIgMHgleCIsICd4JywgZl9yMSwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9kcikgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9qbDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2psLmYKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2psIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9qbXA6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2ptcCIsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRfZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX2QiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkX3BsdXM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZF9wbHVzIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgICBGTEQgKG91dF9zcikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkMjQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZDI0LmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3VpbW0yNDsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfdWltbTI0ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA4LCAyNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3VpbW0yNCkgPSBmX3VpbW0yNDsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkMjQiLCAidWltbTI0IDB4JXgiLCAneCcsIGZfdWltbTI0LCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkaTg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgSU5UIGZfc2ltbTg7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3NpbW04ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMTYsIDgsIDgpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tOCkgPSBmX3NpbW04OwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRpOCIsICJmX3NpbW04IDB4JXgiLCAneCcsIGZfc2ltbTgsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRpMTY6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRpMTYiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbG9jazoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xvY2siLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tYWNoaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tYWNoaSIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdWxoaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdWxoaSIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X212IiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXZmYWNoaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICAgIFVJTlQgZl9yMTsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdmZhY2hpIiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdmZjOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfcjIpID0gZl9yMjsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X212ZmMiLCAiZl9yMiAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X212dGFjaGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tdnRhY2hpIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdnRjOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfcjEpID0gZl9yMTsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X212dGMiLCAiZl9yMSAweCV4IiwgJ3gnLCBmX3IxLCAic3IgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbm9wOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbm9wIiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfcmFjOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfcmFjIiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfcnRlOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfcnRlIiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc2V0aDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfaGkxNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfaGkxNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfaGkxNikgPSBmX2hpMTY7Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zZXRoIiwgImZfaGkxNiAweCV4IiwgJ3gnLCBmX2hpMTYsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc2xsMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NsbDMiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3NsbGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3VpbW01OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl91aW1tNSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTEsIDUpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91aW1tNSkgPSBmX3VpbW01OwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc2xsaSIsICJmX3VpbW01IDB4JXgiLCAneCcsIGZfdWltbTUsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3QiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RfZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdF9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RiOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0YiIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGJfZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdGJfZCIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0aDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdGgiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RoX2Q6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIElOVCBmX3NpbW0xNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RoX2QiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9wbHVzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJiZl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0X3BsdXMiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfdHJhcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyYmZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3RyYXAuZgotICAgIFVJTlQgZl91aW1tNDsKLQotICAgIGZfdWltbTQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdWltbTQpID0gZl91aW1tNDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3RyYXAiLCAiZl91aW1tNCAweCV4IiwgJ3gnLCBmX3VpbW00LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF91bmxvY2s6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycmJmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfdW5sb2NrIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9zaW0vbTMyci9kZWNvZGUuaCBiL3NpbS9tMzJyL2RlY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ5YWNjLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2RlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogRGVjb2RlIGhlYWRlciBmb3IgbTMycmJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJCRl9ERUNPREVfSAotI2RlZmluZSBNMzJSQkZfREVDT0RFX0gKLQotZXh0ZXJuIGNvbnN0IElERVNDICptMzJyYmZfZGVjb2RlIChTSU1fQ1BVICosIElBRERSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fSU5TTl9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQlVGICopOwotZXh0ZXJuIHZvaWQgbTMycmJmX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyYmZfc2VtX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyYmZfc2VtZl9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICopOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbnMgaW4gY3B1IGZhbWlseSBtMzJyYmYuICAqLwotdHlwZWRlZiBlbnVtIG0zMnJiZl9pbnNuX3R5cGUgewotICBNMzJSQkZfSU5TTl9YX0lOVkFMSUQsIE0zMlJCRl9JTlNOX1hfQUZURVIsIE0zMlJCRl9JTlNOX1hfQkVGT1JFLCBNMzJSQkZfSU5TTl9YX0NUSV9DSEFJTgotICwgTTMyUkJGX0lOU05fWF9DSEFJTiwgTTMyUkJGX0lOU05fWF9CRUdJTiwgTTMyUkJGX0lOU05fQURELCBNMzJSQkZfSU5TTl9BREQzCi0gLCBNMzJSQkZfSU5TTl9BTkQsIE0zMlJCRl9JTlNOX0FORDMsIE0zMlJCRl9JTlNOX09SLCBNMzJSQkZfSU5TTl9PUjMKLSAsIE0zMlJCRl9JTlNOX1hPUiwgTTMyUkJGX0lOU05fWE9SMywgTTMyUkJGX0lOU05fQURESSwgTTMyUkJGX0lOU05fQUREVgotICwgTTMyUkJGX0lOU05fQUREVjMsIE0zMlJCRl9JTlNOX0FERFgsIE0zMlJCRl9JTlNOX0JDOCwgTTMyUkJGX0lOU05fQkMyNAotICwgTTMyUkJGX0lOU05fQkVRLCBNMzJSQkZfSU5TTl9CRVFaLCBNMzJSQkZfSU5TTl9CR0VaLCBNMzJSQkZfSU5TTl9CR1RaCi0gLCBNMzJSQkZfSU5TTl9CTEVaLCBNMzJSQkZfSU5TTl9CTFRaLCBNMzJSQkZfSU5TTl9CTkVaLCBNMzJSQkZfSU5TTl9CTDgKLSAsIE0zMlJCRl9JTlNOX0JMMjQsIE0zMlJCRl9JTlNOX0JOQzgsIE0zMlJCRl9JTlNOX0JOQzI0LCBNMzJSQkZfSU5TTl9CTkUKLSAsIE0zMlJCRl9JTlNOX0JSQTgsIE0zMlJCRl9JTlNOX0JSQTI0LCBNMzJSQkZfSU5TTl9DTVAsIE0zMlJCRl9JTlNOX0NNUEkKLSAsIE0zMlJCRl9JTlNOX0NNUFUsIE0zMlJCRl9JTlNOX0NNUFVJLCBNMzJSQkZfSU5TTl9ESVYsIE0zMlJCRl9JTlNOX0RJVlUKLSAsIE0zMlJCRl9JTlNOX1JFTSwgTTMyUkJGX0lOU05fUkVNVSwgTTMyUkJGX0lOU05fSkwsIE0zMlJCRl9JTlNOX0pNUAotICwgTTMyUkJGX0lOU05fTEQsIE0zMlJCRl9JTlNOX0xEX0QsIE0zMlJCRl9JTlNOX0xEQiwgTTMyUkJGX0lOU05fTERCX0QKLSAsIE0zMlJCRl9JTlNOX0xESCwgTTMyUkJGX0lOU05fTERIX0QsIE0zMlJCRl9JTlNOX0xEVUIsIE0zMlJCRl9JTlNOX0xEVUJfRAotICwgTTMyUkJGX0lOU05fTERVSCwgTTMyUkJGX0lOU05fTERVSF9ELCBNMzJSQkZfSU5TTl9MRF9QTFVTLCBNMzJSQkZfSU5TTl9MRDI0Ci0gLCBNMzJSQkZfSU5TTl9MREk4LCBNMzJSQkZfSU5TTl9MREkxNiwgTTMyUkJGX0lOU05fTE9DSywgTTMyUkJGX0lOU05fTUFDSEkKLSAsIE0zMlJCRl9JTlNOX01BQ0xPLCBNMzJSQkZfSU5TTl9NQUNXSEksIE0zMlJCRl9JTlNOX01BQ1dMTywgTTMyUkJGX0lOU05fTVVMCi0gLCBNMzJSQkZfSU5TTl9NVUxISSwgTTMyUkJGX0lOU05fTVVMTE8sIE0zMlJCRl9JTlNOX01VTFdISSwgTTMyUkJGX0lOU05fTVVMV0xPCi0gLCBNMzJSQkZfSU5TTl9NViwgTTMyUkJGX0lOU05fTVZGQUNISSwgTTMyUkJGX0lOU05fTVZGQUNMTywgTTMyUkJGX0lOU05fTVZGQUNNSQotICwgTTMyUkJGX0lOU05fTVZGQywgTTMyUkJGX0lOU05fTVZUQUNISSwgTTMyUkJGX0lOU05fTVZUQUNMTywgTTMyUkJGX0lOU05fTVZUQwotICwgTTMyUkJGX0lOU05fTkVHLCBNMzJSQkZfSU5TTl9OT1AsIE0zMlJCRl9JTlNOX05PVCwgTTMyUkJGX0lOU05fUkFDCi0gLCBNMzJSQkZfSU5TTl9SQUNILCBNMzJSQkZfSU5TTl9SVEUsIE0zMlJCRl9JTlNOX1NFVEgsIE0zMlJCRl9JTlNOX1NMTAotICwgTTMyUkJGX0lOU05fU0xMMywgTTMyUkJGX0lOU05fU0xMSSwgTTMyUkJGX0lOU05fU1JBLCBNMzJSQkZfSU5TTl9TUkEzCi0gLCBNMzJSQkZfSU5TTl9TUkFJLCBNMzJSQkZfSU5TTl9TUkwsIE0zMlJCRl9JTlNOX1NSTDMsIE0zMlJCRl9JTlNOX1NSTEkKLSAsIE0zMlJCRl9JTlNOX1NULCBNMzJSQkZfSU5TTl9TVF9ELCBNMzJSQkZfSU5TTl9TVEIsIE0zMlJCRl9JTlNOX1NUQl9ECi0gLCBNMzJSQkZfSU5TTl9TVEgsIE0zMlJCRl9JTlNOX1NUSF9ELCBNMzJSQkZfSU5TTl9TVF9QTFVTLCBNMzJSQkZfSU5TTl9TVF9NSU5VUwotICwgTTMyUkJGX0lOU05fU1VCLCBNMzJSQkZfSU5TTl9TVUJWLCBNMzJSQkZfSU5TTl9TVUJYLCBNMzJSQkZfSU5TTl9UUkFQCi0gLCBNMzJSQkZfSU5TTl9VTkxPQ0ssIE0zMlJCRl9JTlNOX01BWAotfSBNMzJSQkZfSU5TTl9UWVBFOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBzZW1hbnRpYyBmb3JtYXRzIGluIGNwdSBmYW1pbHkgbTMycmJmLiAgKi8KLXR5cGVkZWYgZW51bSBtMzJyYmZfc2ZtdF90eXBlIHsKLSAgTTMyUkJGX1NGTVRfRU1QVFksIE0zMlJCRl9TRk1UX0FERCwgTTMyUkJGX1NGTVRfQUREMywgTTMyUkJGX1NGTVRfQU5EMwotICwgTTMyUkJGX1NGTVRfT1IzLCBNMzJSQkZfU0ZNVF9BRERJLCBNMzJSQkZfU0ZNVF9BRERWLCBNMzJSQkZfU0ZNVF9BRERWMwotICwgTTMyUkJGX1NGTVRfQUREWCwgTTMyUkJGX1NGTVRfQkM4LCBNMzJSQkZfU0ZNVF9CQzI0LCBNMzJSQkZfU0ZNVF9CRVEKLSAsIE0zMlJCRl9TRk1UX0JFUVosIE0zMlJCRl9TRk1UX0JMOCwgTTMyUkJGX1NGTVRfQkwyNCwgTTMyUkJGX1NGTVRfQlJBOAotICwgTTMyUkJGX1NGTVRfQlJBMjQsIE0zMlJCRl9TRk1UX0NNUCwgTTMyUkJGX1NGTVRfQ01QSSwgTTMyUkJGX1NGTVRfRElWCi0gLCBNMzJSQkZfU0ZNVF9KTCwgTTMyUkJGX1NGTVRfSk1QLCBNMzJSQkZfU0ZNVF9MRCwgTTMyUkJGX1NGTVRfTERfRAotICwgTTMyUkJGX1NGTVRfTERfUExVUywgTTMyUkJGX1NGTVRfTEQyNCwgTTMyUkJGX1NGTVRfTERJOCwgTTMyUkJGX1NGTVRfTERJMTYKLSAsIE0zMlJCRl9TRk1UX0xPQ0ssIE0zMlJCRl9TRk1UX01BQ0hJLCBNMzJSQkZfU0ZNVF9NVUxISSwgTTMyUkJGX1NGTVRfTVYKLSAsIE0zMlJCRl9TRk1UX01WRkFDSEksIE0zMlJCRl9TRk1UX01WRkMsIE0zMlJCRl9TRk1UX01WVEFDSEksIE0zMlJCRl9TRk1UX01WVEMKLSAsIE0zMlJCRl9TRk1UX05PUCwgTTMyUkJGX1NGTVRfUkFDLCBNMzJSQkZfU0ZNVF9SVEUsIE0zMlJCRl9TRk1UX1NFVEgKLSAsIE0zMlJCRl9TRk1UX1NMTDMsIE0zMlJCRl9TRk1UX1NMTEksIE0zMlJCRl9TRk1UX1NULCBNMzJSQkZfU0ZNVF9TVF9ECi0gLCBNMzJSQkZfU0ZNVF9TVEIsIE0zMlJCRl9TRk1UX1NUQl9ELCBNMzJSQkZfU0ZNVF9TVEgsIE0zMlJCRl9TRk1UX1NUSF9ECi0gLCBNMzJSQkZfU0ZNVF9TVF9QTFVTLCBNMzJSQkZfU0ZNVF9UUkFQLCBNMzJSQkZfU0ZNVF9VTkxPQ0sKLX0gTTMyUkJGX1NGTVRfVFlQRTsKLQotLyogRnVuY3Rpb24gdW5pdCBoYW5kbGVycyAodXNlciB3cml0dGVuKS4gICovCi0KLWV4dGVybiBpbnQgbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3JjMSovLCBJTlQgLypzcmMyKi8pOwotZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyKi8sIElOVCAvKmRyKi8pOwotZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3IqLyk7Ci1leHRlcm4gaW50IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzcmMxKi8sIElOVCAvKnNyYzIqLyk7Ci1leHRlcm4gaW50IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzcmMxKi8sIElOVCAvKnNyYzIqLyk7Ci1leHRlcm4gaW50IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3IqLywgSU5UIC8qZHIqLywgSU5UIC8qZHIqLyk7Ci1leHRlcm4gaW50IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8pOwotCi0vKiBQcm9maWxpbmcgYmVmb3JlL2FmdGVyIGhhbmRsZXJzICh1c2VyIHdyaXR0ZW4pICovCi0KLWV4dGVybiB2b2lkIG0zMnJiZl9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqLCBpbnQgLypmaXJzdF9wKi8pOwotZXh0ZXJuIHZvaWQgbTMycmJmX21vZGVsX2luc25fYWZ0ZXIgKFNJTV9DUFUgKiwgaW50IC8qbGFzdF9wKi8sIGludCAvKmN5Y2xlcyovKTsKLQotI2VuZGlmIC8qIE0zMlJCRl9ERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvZGVjb2RleC5jIGIvc2ltL20zMnIvZGVjb2RleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg4ODRhLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL2RlY29kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDIyMjMgKzAsMCBAQAotLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIGRlY29kZXIgZm9yIG0zMnJ4Zi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBtMzJyeGYKLSNkZWZpbmUgV0FOVF9DUFVfTTMyUlhGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLQotLyogSW5zbiBjYW4ndCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLSAgIE9yIGlzIHRoYXQgImRvIE5PdCBQYXNzIHRvIEFpciBkZWZlbnNlIFJhZGFyIj8gOi0pICovCi0jZGVmaW5lIE5PUEFSICgtMSkKLQotLyogVGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgYXJyYXkuCi0gICBUaGlzIGlzIGNvbXB1dGVkIGF0IHJ1bnRpbWUuICBTcGFjZSBmb3IgaXQgaXMgbm90IG1hbGxvYydkIHRvIHNhdmUgYQotICAgdGVlbnN5IGJpdCBvZiBjcHUgaW4gdGhlIGRlY29kZXIuICBNb3ZpbmcgaXQgdG8gbWFsbG9jIHNwYWNlIGlzIHRyaXZpYWwKLSAgIGJ1dCB3b24ndCBiZSBkb25lIHVudGlsIG5lY2Vzc2FyeSAod2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhlIHJ1bnRpbWUKLSAgIGFkZGl0aW9uIG9mIGluc3RydWN0aW9ucyBub3IgYW4gU01QIG1hY2hpbmUgd2l0aCBkaWZmZXJlbnQgY3B1cykuICAqLwotc3RhdGljIElERVNDIG0zMnJ4Zl9pbnNuX2RhdGFbTTMyUlhGX0lOU05fTUFYXTsKLQotLyogQ29tbWFzIGJldHdlZW4gZWxlbWVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWFjcm9zLgotICAgU29tZSBvZiB0aGVzZSBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvdXQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIG0zMnJ4Zl9pbnNuX3NlbVtdID0KLXsKLSAgeyBWSVJUVUFMX0lOU05fWF9JTlZBTElELCBNMzJSWEZfSU5TTl9YX0lOVkFMSUQsIE0zMlJYRl9TRk1UX0VNUFRZLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgVklSVFVBTF9JTlNOX1hfQUZURVIsIE0zMlJYRl9JTlNOX1hfQUZURVIsIE0zMlJYRl9TRk1UX0VNUFRZLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgVklSVFVBTF9JTlNOX1hfQkVGT1JFLCBNMzJSWEZfSU5TTl9YX0JFRk9SRSwgTTMyUlhGX1NGTVRfRU1QVFksIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBWSVJUVUFMX0lOU05fWF9DVElfQ0hBSU4sIE0zMlJYRl9JTlNOX1hfQ1RJX0NIQUlOLCBNMzJSWEZfU0ZNVF9FTVBUWSwgTk9QQVIsIE5PUEFSICB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0NIQUlOLCBNMzJSWEZfSU5TTl9YX0NIQUlOLCBNMzJSWEZfU0ZNVF9FTVBUWSwgTk9QQVIsIE5PUEFSICB9LAotICB7IFZJUlRVQUxfSU5TTl9YX0JFR0lOLCBNMzJSWEZfSU5TTl9YX0JFR0lOLCBNMzJSWEZfU0ZNVF9FTVBUWSwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9BREQsIE0zMlJYRl9JTlNOX0FERCwgTTMyUlhGX1NGTVRfQURELCBNMzJSWEZfSU5TTl9QQVJfQURELCBNMzJSWEZfSU5TTl9XUklURV9BREQgfSwKLSAgeyBNMzJSX0lOU05fQUREMywgTTMyUlhGX0lOU05fQUREMywgTTMyUlhGX1NGTVRfQUREMywgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9BTkQsIE0zMlJYRl9JTlNOX0FORCwgTTMyUlhGX1NGTVRfQURELCBNMzJSWEZfSU5TTl9QQVJfQU5ELCBNMzJSWEZfSU5TTl9XUklURV9BTkQgfSwKLSAgeyBNMzJSX0lOU05fQU5EMywgTTMyUlhGX0lOU05fQU5EMywgTTMyUlhGX1NGTVRfQU5EMywgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9PUiwgTTMyUlhGX0lOU05fT1IsIE0zMlJYRl9TRk1UX0FERCwgTTMyUlhGX0lOU05fUEFSX09SLCBNMzJSWEZfSU5TTl9XUklURV9PUiB9LAotICB7IE0zMlJfSU5TTl9PUjMsIE0zMlJYRl9JTlNOX09SMywgTTMyUlhGX1NGTVRfT1IzLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1hPUiwgTTMyUlhGX0lOU05fWE9SLCBNMzJSWEZfU0ZNVF9BREQsIE0zMlJYRl9JTlNOX1BBUl9YT1IsIE0zMlJYRl9JTlNOX1dSSVRFX1hPUiB9LAotICB7IE0zMlJfSU5TTl9YT1IzLCBNMzJSWEZfSU5TTl9YT1IzLCBNMzJSWEZfU0ZNVF9BTkQzLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0FEREksIE0zMlJYRl9JTlNOX0FEREksIE0zMlJYRl9TRk1UX0FEREksIE0zMlJYRl9JTlNOX1BBUl9BRERJLCBNMzJSWEZfSU5TTl9XUklURV9BRERJIH0sCi0gIHsgTTMyUl9JTlNOX0FERFYsIE0zMlJYRl9JTlNOX0FERFYsIE0zMlJYRl9TRk1UX0FERFYsIE0zMlJYRl9JTlNOX1BBUl9BRERWLCBNMzJSWEZfSU5TTl9XUklURV9BRERWIH0sCi0gIHsgTTMyUl9JTlNOX0FERFYzLCBNMzJSWEZfSU5TTl9BRERWMywgTTMyUlhGX1NGTVRfQUREVjMsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fQUREWCwgTTMyUlhGX0lOU05fQUREWCwgTTMyUlhGX1NGTVRfQUREWCwgTTMyUlhGX0lOU05fUEFSX0FERFgsIE0zMlJYRl9JTlNOX1dSSVRFX0FERFggfSwKLSAgeyBNMzJSX0lOU05fQkM4LCBNMzJSWEZfSU5TTl9CQzgsIE0zMlJYRl9TRk1UX0JDOCwgTTMyUlhGX0lOU05fUEFSX0JDOCwgTTMyUlhGX0lOU05fV1JJVEVfQkM4IH0sCi0gIHsgTTMyUl9JTlNOX0JDMjQsIE0zMlJYRl9JTlNOX0JDMjQsIE0zMlJYRl9TRk1UX0JDMjQsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fQkVRLCBNMzJSWEZfSU5TTl9CRVEsIE0zMlJYRl9TRk1UX0JFUSwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9CRVFaLCBNMzJSWEZfSU5TTl9CRVFaLCBNMzJSWEZfU0ZNVF9CRVFaLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0JHRVosIE0zMlJYRl9JTlNOX0JHRVosIE0zMlJYRl9TRk1UX0JFUVosIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fQkdUWiwgTTMyUlhGX0lOU05fQkdUWiwgTTMyUlhGX1NGTVRfQkVRWiwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9CTEVaLCBNMzJSWEZfSU5TTl9CTEVaLCBNMzJSWEZfU0ZNVF9CRVFaLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0JMVFosIE0zMlJYRl9JTlNOX0JMVFosIE0zMlJYRl9TRk1UX0JFUVosIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fQk5FWiwgTTMyUlhGX0lOU05fQk5FWiwgTTMyUlhGX1NGTVRfQkVRWiwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9CTDgsIE0zMlJYRl9JTlNOX0JMOCwgTTMyUlhGX1NGTVRfQkw4LCBNMzJSWEZfSU5TTl9QQVJfQkw4LCBNMzJSWEZfSU5TTl9XUklURV9CTDggfSwKLSAgeyBNMzJSX0lOU05fQkwyNCwgTTMyUlhGX0lOU05fQkwyNCwgTTMyUlhGX1NGTVRfQkwyNCwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9CQ0w4LCBNMzJSWEZfSU5TTl9CQ0w4LCBNMzJSWEZfU0ZNVF9CQ0w4LCBNMzJSWEZfSU5TTl9QQVJfQkNMOCwgTTMyUlhGX0lOU05fV1JJVEVfQkNMOCB9LAotICB7IE0zMlJfSU5TTl9CQ0wyNCwgTTMyUlhGX0lOU05fQkNMMjQsIE0zMlJYRl9TRk1UX0JDTDI0LCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0JOQzgsIE0zMlJYRl9JTlNOX0JOQzgsIE0zMlJYRl9TRk1UX0JDOCwgTTMyUlhGX0lOU05fUEFSX0JOQzgsIE0zMlJYRl9JTlNOX1dSSVRFX0JOQzggfSwKLSAgeyBNMzJSX0lOU05fQk5DMjQsIE0zMlJYRl9JTlNOX0JOQzI0LCBNMzJSWEZfU0ZNVF9CQzI0LCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0JORSwgTTMyUlhGX0lOU05fQk5FLCBNMzJSWEZfU0ZNVF9CRVEsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fQlJBOCwgTTMyUlhGX0lOU05fQlJBOCwgTTMyUlhGX1NGTVRfQlJBOCwgTTMyUlhGX0lOU05fUEFSX0JSQTgsIE0zMlJYRl9JTlNOX1dSSVRFX0JSQTggfSwKLSAgeyBNMzJSX0lOU05fQlJBMjQsIE0zMlJYRl9JTlNOX0JSQTI0LCBNMzJSWEZfU0ZNVF9CUkEyNCwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9CTkNMOCwgTTMyUlhGX0lOU05fQk5DTDgsIE0zMlJYRl9TRk1UX0JDTDgsIE0zMlJYRl9JTlNOX1BBUl9CTkNMOCwgTTMyUlhGX0lOU05fV1JJVEVfQk5DTDggfSwKLSAgeyBNMzJSX0lOU05fQk5DTDI0LCBNMzJSWEZfSU5TTl9CTkNMMjQsIE0zMlJYRl9TRk1UX0JDTDI0LCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0NNUCwgTTMyUlhGX0lOU05fQ01QLCBNMzJSWEZfU0ZNVF9DTVAsIE0zMlJYRl9JTlNOX1BBUl9DTVAsIE0zMlJYRl9JTlNOX1dSSVRFX0NNUCB9LAotICB7IE0zMlJfSU5TTl9DTVBJLCBNMzJSWEZfSU5TTl9DTVBJLCBNMzJSWEZfU0ZNVF9DTVBJLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0NNUFUsIE0zMlJYRl9JTlNOX0NNUFUsIE0zMlJYRl9TRk1UX0NNUCwgTTMyUlhGX0lOU05fUEFSX0NNUFUsIE0zMlJYRl9JTlNOX1dSSVRFX0NNUFUgfSwKLSAgeyBNMzJSX0lOU05fQ01QVUksIE0zMlJYRl9JTlNOX0NNUFVJLCBNMzJSWEZfU0ZNVF9DTVBJLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0NNUEVRLCBNMzJSWEZfSU5TTl9DTVBFUSwgTTMyUlhGX1NGTVRfQ01QLCBNMzJSWEZfSU5TTl9QQVJfQ01QRVEsIE0zMlJYRl9JTlNOX1dSSVRFX0NNUEVRIH0sCi0gIHsgTTMyUl9JTlNOX0NNUFosIE0zMlJYRl9JTlNOX0NNUFosIE0zMlJYRl9TRk1UX0NNUFosIE0zMlJYRl9JTlNOX1BBUl9DTVBaLCBNMzJSWEZfSU5TTl9XUklURV9DTVBaIH0sCi0gIHsgTTMyUl9JTlNOX0RJViwgTTMyUlhGX0lOU05fRElWLCBNMzJSWEZfU0ZNVF9ESVYsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fRElWVSwgTTMyUlhGX0lOU05fRElWVSwgTTMyUlhGX1NGTVRfRElWLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1JFTSwgTTMyUlhGX0lOU05fUkVNLCBNMzJSWEZfU0ZNVF9ESVYsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fUkVNVSwgTTMyUlhGX0lOU05fUkVNVSwgTTMyUlhGX1NGTVRfRElWLCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0RJVkgsIE0zMlJYRl9JTlNOX0RJVkgsIE0zMlJYRl9TRk1UX0RJViwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9KQywgTTMyUlhGX0lOU05fSkMsIE0zMlJYRl9TRk1UX0pDLCBNMzJSWEZfSU5TTl9QQVJfSkMsIE0zMlJYRl9JTlNOX1dSSVRFX0pDIH0sCi0gIHsgTTMyUl9JTlNOX0pOQywgTTMyUlhGX0lOU05fSk5DLCBNMzJSWEZfU0ZNVF9KQywgTTMyUlhGX0lOU05fUEFSX0pOQywgTTMyUlhGX0lOU05fV1JJVEVfSk5DIH0sCi0gIHsgTTMyUl9JTlNOX0pMLCBNMzJSWEZfSU5TTl9KTCwgTTMyUlhGX1NGTVRfSkwsIE0zMlJYRl9JTlNOX1BBUl9KTCwgTTMyUlhGX0lOU05fV1JJVEVfSkwgfSwKLSAgeyBNMzJSX0lOU05fSk1QLCBNMzJSWEZfSU5TTl9KTVAsIE0zMlJYRl9TRk1UX0pNUCwgTTMyUlhGX0lOU05fUEFSX0pNUCwgTTMyUlhGX0lOU05fV1JJVEVfSk1QIH0sCi0gIHsgTTMyUl9JTlNOX0xELCBNMzJSWEZfSU5TTl9MRCwgTTMyUlhGX1NGTVRfTEQsIE0zMlJYRl9JTlNOX1BBUl9MRCwgTTMyUlhGX0lOU05fV1JJVEVfTEQgfSwKLSAgeyBNMzJSX0lOU05fTERfRCwgTTMyUlhGX0lOU05fTERfRCwgTTMyUlhGX1NGTVRfTERfRCwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9MREIsIE0zMlJYRl9JTlNOX0xEQiwgTTMyUlhGX1NGTVRfTEQsIE0zMlJYRl9JTlNOX1BBUl9MREIsIE0zMlJYRl9JTlNOX1dSSVRFX0xEQiB9LAotICB7IE0zMlJfSU5TTl9MREJfRCwgTTMyUlhGX0lOU05fTERCX0QsIE0zMlJYRl9TRk1UX0xEX0QsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fTERILCBNMzJSWEZfSU5TTl9MREgsIE0zMlJYRl9TRk1UX0xELCBNMzJSWEZfSU5TTl9QQVJfTERILCBNMzJSWEZfSU5TTl9XUklURV9MREggfSwKLSAgeyBNMzJSX0lOU05fTERIX0QsIE0zMlJYRl9JTlNOX0xESF9ELCBNMzJSWEZfU0ZNVF9MRF9ELCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0xEVUIsIE0zMlJYRl9JTlNOX0xEVUIsIE0zMlJYRl9TRk1UX0xELCBNMzJSWEZfSU5TTl9QQVJfTERVQiwgTTMyUlhGX0lOU05fV1JJVEVfTERVQiB9LAotICB7IE0zMlJfSU5TTl9MRFVCX0QsIE0zMlJYRl9JTlNOX0xEVUJfRCwgTTMyUlhGX1NGTVRfTERfRCwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9MRFVILCBNMzJSWEZfSU5TTl9MRFVILCBNMzJSWEZfU0ZNVF9MRCwgTTMyUlhGX0lOU05fUEFSX0xEVUgsIE0zMlJYRl9JTlNOX1dSSVRFX0xEVUggfSwKLSAgeyBNMzJSX0lOU05fTERVSF9ELCBNMzJSWEZfSU5TTl9MRFVIX0QsIE0zMlJYRl9TRk1UX0xEX0QsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fTERfUExVUywgTTMyUlhGX0lOU05fTERfUExVUywgTTMyUlhGX1NGTVRfTERfUExVUywgTTMyUlhGX0lOU05fUEFSX0xEX1BMVVMsIE0zMlJYRl9JTlNOX1dSSVRFX0xEX1BMVVMgfSwKLSAgeyBNMzJSX0lOU05fTEQyNCwgTTMyUlhGX0lOU05fTEQyNCwgTTMyUlhGX1NGTVRfTEQyNCwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9MREk4LCBNMzJSWEZfSU5TTl9MREk4LCBNMzJSWEZfU0ZNVF9MREk4LCBNMzJSWEZfSU5TTl9QQVJfTERJOCwgTTMyUlhGX0lOU05fV1JJVEVfTERJOCB9LAotICB7IE0zMlJfSU5TTl9MREkxNiwgTTMyUlhGX0lOU05fTERJMTYsIE0zMlJYRl9TRk1UX0xESTE2LCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX0xPQ0ssIE0zMlJYRl9JTlNOX0xPQ0ssIE0zMlJYRl9TRk1UX0xPQ0ssIE0zMlJYRl9JTlNOX1BBUl9MT0NLLCBNMzJSWEZfSU5TTl9XUklURV9MT0NLIH0sCi0gIHsgTTMyUl9JTlNOX01BQ0hJX0EsIE0zMlJYRl9JTlNOX01BQ0hJX0EsIE0zMlJYRl9TRk1UX01BQ0hJX0EsIE0zMlJYRl9JTlNOX1BBUl9NQUNISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NQUNISV9BIH0sCi0gIHsgTTMyUl9JTlNOX01BQ0xPX0EsIE0zMlJYRl9JTlNOX01BQ0xPX0EsIE0zMlJYRl9TRk1UX01BQ0hJX0EsIE0zMlJYRl9JTlNOX1BBUl9NQUNMT19BLCBNMzJSWEZfSU5TTl9XUklURV9NQUNMT19BIH0sCi0gIHsgTTMyUl9JTlNOX01BQ1dISV9BLCBNMzJSWEZfSU5TTl9NQUNXSElfQSwgTTMyUlhGX1NGTVRfTUFDSElfQSwgTTMyUlhGX0lOU05fUEFSX01BQ1dISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NQUNXSElfQSB9LAotICB7IE0zMlJfSU5TTl9NQUNXTE9fQSwgTTMyUlhGX0lOU05fTUFDV0xPX0EsIE0zMlJYRl9TRk1UX01BQ0hJX0EsIE0zMlJYRl9JTlNOX1BBUl9NQUNXTE9fQSwgTTMyUlhGX0lOU05fV1JJVEVfTUFDV0xPX0EgfSwKLSAgeyBNMzJSX0lOU05fTVVMLCBNMzJSWEZfSU5TTl9NVUwsIE0zMlJYRl9TRk1UX0FERCwgTTMyUlhGX0lOU05fUEFSX01VTCwgTTMyUlhGX0lOU05fV1JJVEVfTVVMIH0sCi0gIHsgTTMyUl9JTlNOX01VTEhJX0EsIE0zMlJYRl9JTlNOX01VTEhJX0EsIE0zMlJYRl9TRk1UX01VTEhJX0EsIE0zMlJYRl9JTlNOX1BBUl9NVUxISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVUxISV9BIH0sCi0gIHsgTTMyUl9JTlNOX01VTExPX0EsIE0zMlJYRl9JTlNOX01VTExPX0EsIE0zMlJYRl9TRk1UX01VTEhJX0EsIE0zMlJYRl9JTlNOX1BBUl9NVUxMT19BLCBNMzJSWEZfSU5TTl9XUklURV9NVUxMT19BIH0sCi0gIHsgTTMyUl9JTlNOX01VTFdISV9BLCBNMzJSWEZfSU5TTl9NVUxXSElfQSwgTTMyUlhGX1NGTVRfTVVMSElfQSwgTTMyUlhGX0lOU05fUEFSX01VTFdISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVUxXSElfQSB9LAotICB7IE0zMlJfSU5TTl9NVUxXTE9fQSwgTTMyUlhGX0lOU05fTVVMV0xPX0EsIE0zMlJYRl9TRk1UX01VTEhJX0EsIE0zMlJYRl9JTlNOX1BBUl9NVUxXTE9fQSwgTTMyUlhGX0lOU05fV1JJVEVfTVVMV0xPX0EgfSwKLSAgeyBNMzJSX0lOU05fTVYsIE0zMlJYRl9JTlNOX01WLCBNMzJSWEZfU0ZNVF9NViwgTTMyUlhGX0lOU05fUEFSX01WLCBNMzJSWEZfSU5TTl9XUklURV9NViB9LAotICB7IE0zMlJfSU5TTl9NVkZBQ0hJX0EsIE0zMlJYRl9JTlNOX01WRkFDSElfQSwgTTMyUlhGX1NGTVRfTVZGQUNISV9BLCBNMzJSWEZfSU5TTl9QQVJfTVZGQUNISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVkZBQ0hJX0EgfSwKLSAgeyBNMzJSX0lOU05fTVZGQUNMT19BLCBNMzJSWEZfSU5TTl9NVkZBQ0xPX0EsIE0zMlJYRl9TRk1UX01WRkFDSElfQSwgTTMyUlhGX0lOU05fUEFSX01WRkFDTE9fQSwgTTMyUlhGX0lOU05fV1JJVEVfTVZGQUNMT19BIH0sCi0gIHsgTTMyUl9JTlNOX01WRkFDTUlfQSwgTTMyUlhGX0lOU05fTVZGQUNNSV9BLCBNMzJSWEZfU0ZNVF9NVkZBQ0hJX0EsIE0zMlJYRl9JTlNOX1BBUl9NVkZBQ01JX0EsIE0zMlJYRl9JTlNOX1dSSVRFX01WRkFDTUlfQSB9LAotICB7IE0zMlJfSU5TTl9NVkZDLCBNMzJSWEZfSU5TTl9NVkZDLCBNMzJSWEZfU0ZNVF9NVkZDLCBNMzJSWEZfSU5TTl9QQVJfTVZGQywgTTMyUlhGX0lOU05fV1JJVEVfTVZGQyB9LAotICB7IE0zMlJfSU5TTl9NVlRBQ0hJX0EsIE0zMlJYRl9JTlNOX01WVEFDSElfQSwgTTMyUlhGX1NGTVRfTVZUQUNISV9BLCBNMzJSWEZfSU5TTl9QQVJfTVZUQUNISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVlRBQ0hJX0EgfSwKLSAgeyBNMzJSX0lOU05fTVZUQUNMT19BLCBNMzJSWEZfSU5TTl9NVlRBQ0xPX0EsIE0zMlJYRl9TRk1UX01WVEFDSElfQSwgTTMyUlhGX0lOU05fUEFSX01WVEFDTE9fQSwgTTMyUlhGX0lOU05fV1JJVEVfTVZUQUNMT19BIH0sCi0gIHsgTTMyUl9JTlNOX01WVEMsIE0zMlJYRl9JTlNOX01WVEMsIE0zMlJYRl9TRk1UX01WVEMsIE0zMlJYRl9JTlNOX1BBUl9NVlRDLCBNMzJSWEZfSU5TTl9XUklURV9NVlRDIH0sCi0gIHsgTTMyUl9JTlNOX05FRywgTTMyUlhGX0lOU05fTkVHLCBNMzJSWEZfU0ZNVF9NViwgTTMyUlhGX0lOU05fUEFSX05FRywgTTMyUlhGX0lOU05fV1JJVEVfTkVHIH0sCi0gIHsgTTMyUl9JTlNOX05PUCwgTTMyUlhGX0lOU05fTk9QLCBNMzJSWEZfU0ZNVF9OT1AsIE0zMlJYRl9JTlNOX1BBUl9OT1AsIE0zMlJYRl9JTlNOX1dSSVRFX05PUCB9LAotICB7IE0zMlJfSU5TTl9OT1QsIE0zMlJYRl9JTlNOX05PVCwgTTMyUlhGX1NGTVRfTVYsIE0zMlJYRl9JTlNOX1BBUl9OT1QsIE0zMlJYRl9JTlNOX1dSSVRFX05PVCB9LAotICB7IE0zMlJfSU5TTl9SQUNfRFNJLCBNMzJSWEZfSU5TTl9SQUNfRFNJLCBNMzJSWEZfU0ZNVF9SQUNfRFNJLCBNMzJSWEZfSU5TTl9QQVJfUkFDX0RTSSwgTTMyUlhGX0lOU05fV1JJVEVfUkFDX0RTSSB9LAotICB7IE0zMlJfSU5TTl9SQUNIX0RTSSwgTTMyUlhGX0lOU05fUkFDSF9EU0ksIE0zMlJYRl9TRk1UX1JBQ19EU0ksIE0zMlJYRl9JTlNOX1BBUl9SQUNIX0RTSSwgTTMyUlhGX0lOU05fV1JJVEVfUkFDSF9EU0kgfSwKLSAgeyBNMzJSX0lOU05fUlRFLCBNMzJSWEZfSU5TTl9SVEUsIE0zMlJYRl9TRk1UX1JURSwgTTMyUlhGX0lOU05fUEFSX1JURSwgTTMyUlhGX0lOU05fV1JJVEVfUlRFIH0sCi0gIHsgTTMyUl9JTlNOX1NFVEgsIE0zMlJYRl9JTlNOX1NFVEgsIE0zMlJYRl9TRk1UX1NFVEgsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fU0xMLCBNMzJSWEZfSU5TTl9TTEwsIE0zMlJYRl9TRk1UX0FERCwgTTMyUlhGX0lOU05fUEFSX1NMTCwgTTMyUlhGX0lOU05fV1JJVEVfU0xMIH0sCi0gIHsgTTMyUl9JTlNOX1NMTDMsIE0zMlJYRl9JTlNOX1NMTDMsIE0zMlJYRl9TRk1UX1NMTDMsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fU0xMSSwgTTMyUlhGX0lOU05fU0xMSSwgTTMyUlhGX1NGTVRfU0xMSSwgTTMyUlhGX0lOU05fUEFSX1NMTEksIE0zMlJYRl9JTlNOX1dSSVRFX1NMTEkgfSwKLSAgeyBNMzJSX0lOU05fU1JBLCBNMzJSWEZfSU5TTl9TUkEsIE0zMlJYRl9TRk1UX0FERCwgTTMyUlhGX0lOU05fUEFSX1NSQSwgTTMyUlhGX0lOU05fV1JJVEVfU1JBIH0sCi0gIHsgTTMyUl9JTlNOX1NSQTMsIE0zMlJYRl9JTlNOX1NSQTMsIE0zMlJYRl9TRk1UX1NMTDMsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fU1JBSSwgTTMyUlhGX0lOU05fU1JBSSwgTTMyUlhGX1NGTVRfU0xMSSwgTTMyUlhGX0lOU05fUEFSX1NSQUksIE0zMlJYRl9JTlNOX1dSSVRFX1NSQUkgfSwKLSAgeyBNMzJSX0lOU05fU1JMLCBNMzJSWEZfSU5TTl9TUkwsIE0zMlJYRl9TRk1UX0FERCwgTTMyUlhGX0lOU05fUEFSX1NSTCwgTTMyUlhGX0lOU05fV1JJVEVfU1JMIH0sCi0gIHsgTTMyUl9JTlNOX1NSTDMsIE0zMlJYRl9JTlNOX1NSTDMsIE0zMlJYRl9TRk1UX1NMTDMsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fU1JMSSwgTTMyUlhGX0lOU05fU1JMSSwgTTMyUlhGX1NGTVRfU0xMSSwgTTMyUlhGX0lOU05fUEFSX1NSTEksIE0zMlJYRl9JTlNOX1dSSVRFX1NSTEkgfSwKLSAgeyBNMzJSX0lOU05fU1QsIE0zMlJYRl9JTlNOX1NULCBNMzJSWEZfU0ZNVF9TVCwgTTMyUlhGX0lOU05fUEFSX1NULCBNMzJSWEZfSU5TTl9XUklURV9TVCB9LAotICB7IE0zMlJfSU5TTl9TVF9ELCBNMzJSWEZfSU5TTl9TVF9ELCBNMzJSWEZfU0ZNVF9TVF9ELCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1NUQiwgTTMyUlhGX0lOU05fU1RCLCBNMzJSWEZfU0ZNVF9TVEIsIE0zMlJYRl9JTlNOX1BBUl9TVEIsIE0zMlJYRl9JTlNOX1dSSVRFX1NUQiB9LAotICB7IE0zMlJfSU5TTl9TVEJfRCwgTTMyUlhGX0lOU05fU1RCX0QsIE0zMlJYRl9TRk1UX1NUQl9ELCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1NUSCwgTTMyUlhGX0lOU05fU1RILCBNMzJSWEZfU0ZNVF9TVEgsIE0zMlJYRl9JTlNOX1BBUl9TVEgsIE0zMlJYRl9JTlNOX1dSSVRFX1NUSCB9LAotICB7IE0zMlJfSU5TTl9TVEhfRCwgTTMyUlhGX0lOU05fU1RIX0QsIE0zMlJYRl9TRk1UX1NUSF9ELCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJYRl9JTlNOX1NUX1BMVVMsIE0zMlJYRl9TRk1UX1NUX1BMVVMsIE0zMlJYRl9JTlNOX1BBUl9TVF9QTFVTLCBNMzJSWEZfSU5TTl9XUklURV9TVF9QTFVTIH0sCi0gIHsgTTMyUl9JTlNOX1NUX01JTlVTLCBNMzJSWEZfSU5TTl9TVF9NSU5VUywgTTMyUlhGX1NGTVRfU1RfUExVUywgTTMyUlhGX0lOU05fUEFSX1NUX01JTlVTLCBNMzJSWEZfSU5TTl9XUklURV9TVF9NSU5VUyB9LAotICB7IE0zMlJfSU5TTl9TVUIsIE0zMlJYRl9JTlNOX1NVQiwgTTMyUlhGX1NGTVRfQURELCBNMzJSWEZfSU5TTl9QQVJfU1VCLCBNMzJSWEZfSU5TTl9XUklURV9TVUIgfSwKLSAgeyBNMzJSX0lOU05fU1VCViwgTTMyUlhGX0lOU05fU1VCViwgTTMyUlhGX1NGTVRfQUREViwgTTMyUlhGX0lOU05fUEFSX1NVQlYsIE0zMlJYRl9JTlNOX1dSSVRFX1NVQlYgfSwKLSAgeyBNMzJSX0lOU05fU1VCWCwgTTMyUlhGX0lOU05fU1VCWCwgTTMyUlhGX1NGTVRfQUREWCwgTTMyUlhGX0lOU05fUEFSX1NVQlgsIE0zMlJYRl9JTlNOX1dSSVRFX1NVQlggfSwKLSAgeyBNMzJSX0lOU05fVFJBUCwgTTMyUlhGX0lOU05fVFJBUCwgTTMyUlhGX1NGTVRfVFJBUCwgTTMyUlhGX0lOU05fUEFSX1RSQVAsIE0zMlJYRl9JTlNOX1dSSVRFX1RSQVAgfSwKLSAgeyBNMzJSX0lOU05fVU5MT0NLLCBNMzJSWEZfSU5TTl9VTkxPQ0ssIE0zMlJYRl9TRk1UX1VOTE9DSywgTTMyUlhGX0lOU05fUEFSX1VOTE9DSywgTTMyUlhGX0lOU05fV1JJVEVfVU5MT0NLIH0sCi0gIHsgTTMyUl9JTlNOX1NBVEIsIE0zMlJYRl9JTlNOX1NBVEIsIE0zMlJYRl9TRk1UX1NBVEIsIE5PUEFSLCBOT1BBUiAgfSwKLSAgeyBNMzJSX0lOU05fU0FUSCwgTTMyUlhGX0lOU05fU0FUSCwgTTMyUlhGX1NGTVRfU0FUQiwgTk9QQVIsIE5PUEFSICB9LAotICB7IE0zMlJfSU5TTl9TQVQsIE0zMlJYRl9JTlNOX1NBVCwgTTMyUlhGX1NGTVRfU0FULCBOT1BBUiwgTk9QQVIgIH0sCi0gIHsgTTMyUl9JTlNOX1BDTVBCWiwgTTMyUlhGX0lOU05fUENNUEJaLCBNMzJSWEZfU0ZNVF9DTVBaLCBNMzJSWEZfSU5TTl9QQVJfUENNUEJaLCBNMzJSWEZfSU5TTl9XUklURV9QQ01QQlogfSwKLSAgeyBNMzJSX0lOU05fU0FERCwgTTMyUlhGX0lOU05fU0FERCwgTTMyUlhGX1NGTVRfU0FERCwgTTMyUlhGX0lOU05fUEFSX1NBREQsIE0zMlJYRl9JTlNOX1dSSVRFX1NBREQgfSwKLSAgeyBNMzJSX0lOU05fTUFDV1UxLCBNMzJSWEZfSU5TTl9NQUNXVTEsIE0zMlJYRl9TRk1UX01BQ1dVMSwgTTMyUlhGX0lOU05fUEFSX01BQ1dVMSwgTTMyUlhGX0lOU05fV1JJVEVfTUFDV1UxIH0sCi0gIHsgTTMyUl9JTlNOX01TQkxPLCBNMzJSWEZfSU5TTl9NU0JMTywgTTMyUlhGX1NGTVRfTVNCTE8sIE0zMlJYRl9JTlNOX1BBUl9NU0JMTywgTTMyUlhGX0lOU05fV1JJVEVfTVNCTE8gfSwKLSAgeyBNMzJSX0lOU05fTVVMV1UxLCBNMzJSWEZfSU5TTl9NVUxXVTEsIE0zMlJYRl9TRk1UX01VTFdVMSwgTTMyUlhGX0lOU05fUEFSX01VTFdVMSwgTTMyUlhGX0lOU05fV1JJVEVfTVVMV1UxIH0sCi0gIHsgTTMyUl9JTlNOX01BQ0xIMSwgTTMyUlhGX0lOU05fTUFDTEgxLCBNMzJSWEZfU0ZNVF9NQUNXVTEsIE0zMlJYRl9JTlNOX1BBUl9NQUNMSDEsIE0zMlJYRl9JTlNOX1dSSVRFX01BQ0xIMSB9LAotICB7IE0zMlJfSU5TTl9TQywgTTMyUlhGX0lOU05fU0MsIE0zMlJYRl9TRk1UX1NDLCBNMzJSWEZfSU5TTl9QQVJfU0MsIE0zMlJYRl9JTlNOX1dSSVRFX1NDIH0sCi0gIHsgTTMyUl9JTlNOX1NOQywgTTMyUlhGX0lOU05fU05DLCBNMzJSWEZfU0ZNVF9TQywgTTMyUlhGX0lOU05fUEFSX1NOQywgTTMyUlhGX0lOU05fV1JJVEVfU05DIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIG0zMnJ4Zl9pbnNuX3NlbV9pbnZhbGlkID0gewotICBWSVJUVUFMX0lOU05fWF9JTlZBTElELCBNMzJSWEZfSU5TTl9YX0lOVkFMSUQsIE0zMlJYRl9TRk1UX0VNUFRZLCBOT1BBUiwgTk9QQVIKLX07Ci0KLS8qIEluaXRpYWxpemUgYW4gSURFU0MgZnJvbSB0aGUgY29tcGlsZS10aW1lIGNvbXB1dGFibGUgcGFydHMuICAqLwotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWluaXRfaWRlc2MgKFNJTV9DUFUgKmNwdSwgSURFU0MgKmlkLCBjb25zdCBzdHJ1Y3QgaW5zbl9zZW0gKnQpCi17Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5zbl90YWJsZSA9IENHRU5fQ1BVX0lOU05fVEFCTEUgKENQVV9DUFVfREVTQyAoY3B1KSktPmluaXRfZW50cmllczsKLQotICBpZC0+bnVtID0gdC0+aW5kZXg7Ci0gIGlkLT5zZm10ID0gdC0+c2ZtdDsKLSAgaWYgKChpbnQpIHQtPnR5cGUgPD0gMCkKLSAgICBpZC0+aWRhdGEgPSAmIGNnZW5fdmlydHVhbF9pbnNuX3RhYmxlWy0gKGludCkgdC0+dHlwZV07Ci0gIGVsc2UKLSAgICBpZC0+aWRhdGEgPSAmIGluc25fdGFibGVbdC0+dHlwZV07Ci0gIGlkLT5hdHRycyA9IENHRU5fSU5TTl9BVFRSUyAoaWQtPmlkYXRhKTsKLSAgLyogT2ggbXkgZ29kLCBhIG1hZ2ljIG51bWJlci4gICovCi0gIGlkLT5sZW5ndGggPSBDR0VOX0lOU05fQklUU0laRSAoaWQtPmlkYXRhKSAvIDg7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICBpZC0+dGltaW5nID0gJiBNT0RFTF9USU1JTkcgKENQVV9NT0RFTCAoY3B1KSkgW3QtPmluZGV4XTsKLSAgewotICAgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICAgIFNJTV9BU1NFUlQgKHQtPmluZGV4ID09IGlkLT50aW1pbmctPm51bSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIFNlbWFudGljIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZCBlbHNld2hlcmUuICAqLwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHRhYmxlLiAgKi8KLQotdm9pZAotbTMycnhmX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKmNwdSkKLXsKLSAgSURFU0MgKmlkLCp0YWJlbmQ7Ci0gIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSAqdCwqdGVuZDsKLSAgaW50IHRhYnNpemUgPSBNMzJSWEZfSU5TTl9NQVg7Ci0gIElERVNDICp0YWJsZSA9IG0zMnJ4Zl9pbnNuX2RhdGE7Ci0KLSAgbWVtc2V0ICh0YWJsZSwgMCwgdGFic2l6ZSAqIHNpemVvZiAoSURFU0MpKTsKLQotICAvKiBGaXJzdCBzZXQgYWxsIGVudHJpZXMgdG8gdGhlIGBpbnZhbGlkIGluc24nLiAgKi8KLSAgdCA9ICYgbTMycnhmX2luc25fc2VtX2ludmFsaWQ7Ci0gIGZvciAoaWQgPSB0YWJsZSwgdGFiZW5kID0gdGFibGUgKyB0YWJzaXplOyBpZCA8IHRhYmVuZDsgKytpZCkKLSAgICBpbml0X2lkZXNjIChjcHUsIGlkLCB0KTsKLQotICAvKiBOb3cgZmlsbCBpbiB0aGUgdmFsdWVzIGZvciB0aGUgY2hvc2VuIGNwdS4gICovCi0gIGZvciAodCA9IG0zMnJ4Zl9pbnNuX3NlbSwgdGVuZCA9IHQgKyBzaXplb2YgKG0zMnJ4Zl9pbnNuX3NlbSkgLyBzaXplb2YgKCp0KTsKLSAgICAgICB0ICE9IHRlbmQ7ICsrdCkKLSAgICB7Ci0gICAgICBpbml0X2lkZXNjIChjcHUsICYgdGFibGVbdC0+aW5kZXhdLCB0KTsKLSAgICAgIGlmICh0LT5wYXJfaW5kZXggIT0gTk9QQVIpCi0JewotCSAgaW5pdF9pZGVzYyAoY3B1LCAmdGFibGVbdC0+cGFyX2luZGV4XSwgdCk7Ci0JICB0YWJsZVt0LT5pbmRleF0ucGFyX2lkZXNjID0gJnRhYmxlW3QtPnBhcl9pbmRleF07Ci0JfQotICAgICAgaWYgKHQtPnBhcl9pbmRleCAhPSBOT1BBUikKLQl7Ci0JICBpbml0X2lkZXNjIChjcHUsICZ0YWJsZVt0LT53cml0ZV9pbmRleF0sIHQpOwotCSAgdGFibGVbdC0+cGFyX2luZGV4XS5wYXJfaWRlc2MgPSAmdGFibGVbdC0+d3JpdGVfaW5kZXhdOwotCX0KLSAgICB9Ci0KLSAgLyogTGluayB0aGUgSURFU0MgdGFibGUgaW50byB0aGUgY3B1LiAgKi8KLSAgQ1BVX0lERVNDIChjcHUpID0gdGFibGU7Ci19Ci0KLS8qIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm4gYSBwb2ludGVyIHRvIGl0cyBJREVTQyBlbnRyeS4gICovCi0KLWNvbnN0IElERVNDICoKLW0zMnJ4Zl9kZWNvZGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBwYywKLSAgICAgICAgICAgICAgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc24sIENHRU5fSU5TTl9JTlQgZW50aXJlX2luc24sCi0gICAgICAgICAgICAgIEFSR0JVRiAqYWJ1ZikKLXsKLSAgLyogUmVzdWx0IG9mIGRlY29kZXIuICAqLwotICBNMzJSWEZfSU5TTl9UWVBFIGl0eXBlOwotCi0gIHsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247Ci0KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA4KSAmICgxNSA8PCA0KSkgfCAoKGluc24gPj4gNCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgIHN3aXRjaCAodmFsKQotICAgICAgewotICAgICAgY2FzZSAwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVUJWOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGR2OwotICAgICAgY2FzZSAxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVUJYOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGR4OwotICAgICAgY2FzZSAyIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVUI7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMyA6IGl0eXBlID0gTTMyUlhGX0lOU05fTkVHOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdjsKLSAgICAgIGNhc2UgNCA6IGl0eXBlID0gTTMyUlhGX0lOU05fQ01QOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXA7Ci0gICAgICBjYXNlIDUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0NNUFU7IGdvdG8gZXh0cmFjdF9zZm10X2NtcDsKLSAgICAgIGNhc2UgNiA6IGl0eXBlID0gTTMyUlhGX0lOU05fQ01QRVE7IGdvdG8gZXh0cmFjdF9zZm10X2NtcDsKLSAgICAgIGNhc2UgNyA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA4KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0NNUFo7IGdvdG8gZXh0cmFjdF9zZm10X2NtcHo7Ci0gICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9QQ01QQlo7IGdvdG8gZXh0cmFjdF9zZm10X2NtcHo7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgOCA6IGl0eXBlID0gTTMyUlhGX0lOU05fQUREVjsgZ290byBleHRyYWN0X3NmbXRfYWRkdjsKLSAgICAgIGNhc2UgOSA6IGl0eXBlID0gTTMyUlhGX0lOU05fQUREWDsgZ290byBleHRyYWN0X3NmbXRfYWRkeDsKLSAgICAgIGNhc2UgMTAgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0FERDsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAxMSA6IGl0eXBlID0gTTMyUlhGX0lOU05fTk9UOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdjsKLSAgICAgIGNhc2UgMTIgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0FORDsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUlhGX0lOU05fWE9SOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDE0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9PUjsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAxNiA6IGl0eXBlID0gTTMyUlhGX0lOU05fU1JMOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDE4IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TUkE7IGdvdG8gZXh0cmFjdF9zZm10X2FkZDsKLSAgICAgIGNhc2UgMjAgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NMTDsgZ290byBleHRyYWN0X3NmbXRfYWRkOwotICAgICAgY2FzZSAyMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTVVMOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hZGQ7Ci0gICAgICBjYXNlIDI0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVjsgZ290byBleHRyYWN0X3NmbXRfbXY7Ci0gICAgICBjYXNlIDI1IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVkZDOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdmZjOwotICAgICAgY2FzZSAyNiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTVZUQzsgZ290byBleHRyYWN0X3NmbXRfbXZ0YzsKLSAgICAgIGNhc2UgMjggOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fSkM7IGdvdG8gZXh0cmFjdF9zZm10X2pjOwotICAgICAgICAgIGNhc2UgMTMgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0pOQzsgZ290byBleHRyYWN0X3NmbXRfamM7Ci0gICAgICAgICAgY2FzZSAxNCA6IGl0eXBlID0gTTMyUlhGX0lOU05fSkw7IGdvdG8gZXh0cmFjdF9zZm10X2psOwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0pNUDsgZ290byBleHRyYWN0X3NmbXRfam1wOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDI5IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9SVEU7IGdvdG8gZXh0cmFjdF9zZm10X3J0ZTsKLSAgICAgIGNhc2UgMzEgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1RSQVA7IGdvdG8gZXh0cmFjdF9zZm10X3RyYXA7Ci0gICAgICBjYXNlIDMyIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVEI7IGdvdG8gZXh0cmFjdF9zZm10X3N0YjsKLSAgICAgIGNhc2UgMzQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NUSDsgZ290byBleHRyYWN0X3NmbXRfc3RoOwotICAgICAgY2FzZSAzNiA6IGl0eXBlID0gTTMyUlhGX0lOU05fU1Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0OwotICAgICAgY2FzZSAzNyA6IGl0eXBlID0gTTMyUlhGX0lOU05fVU5MT0NLOyBnb3RvIGV4dHJhY3Rfc2ZtdF91bmxvY2s7Ci0gICAgICBjYXNlIDM4IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVF9QTFVTOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9wbHVzOwotICAgICAgY2FzZSAzOSA6IGl0eXBlID0gTTMyUlhGX0lOU05fU1RfTUlOVVM7IGdvdG8gZXh0cmFjdF9zZm10X3N0X3BsdXM7Ci0gICAgICBjYXNlIDQwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MREI7IGdvdG8gZXh0cmFjdF9zZm10X2xkOwotICAgICAgY2FzZSA0MSA6IGl0eXBlID0gTTMyUlhGX0lOU05fTERVQjsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDQyIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MREg7IGdvdG8gZXh0cmFjdF9zZm10X2xkOwotICAgICAgY2FzZSA0MyA6IGl0eXBlID0gTTMyUlhGX0lOU05fTERVSDsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDQ0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MRDsgZ290byBleHRyYWN0X3NmbXRfbGQ7Ci0gICAgICBjYXNlIDQ1IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MT0NLOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sb2NrOwotICAgICAgY2FzZSA0NiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTERfUExVUzsgZ290byBleHRyYWN0X3NmbXRfbGRfcGx1czsKLSAgICAgIGNhc2UgNDggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNTYgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX01VTEhJX0E7IGdvdG8gZXh0cmFjdF9zZm10X211bGhpX2E7Ci0gICAgICBjYXNlIDQ5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDU3IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVUxMT19BOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdWxoaV9hOwotICAgICAgY2FzZSA1MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA1OCA6IGl0eXBlID0gTTMyUlhGX0lOU05fTVVMV0hJX0E7IGdvdG8gZXh0cmFjdF9zZm10X211bGhpX2E7Ci0gICAgICBjYXNlIDUxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDU5IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVUxXTE9fQTsgZ290byBleHRyYWN0X3NmbXRfbXVsaGlfYTsKLSAgICAgIGNhc2UgNTIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjAgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX01BQ0hJX0E7IGdvdG8gZXh0cmFjdF9zZm10X21hY2hpX2E7Ci0gICAgICBjYXNlIDUzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDYxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NQUNMT19BOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tYWNoaV9hOwotICAgICAgY2FzZSA1NCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA2MiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTUFDV0hJX0E7IGdvdG8gZXh0cmFjdF9zZm10X21hY2hpX2E7Ci0gICAgICBjYXNlIDU1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDYzIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NQUNXTE9fQTsgZ290byBleHRyYWN0X3NmbXRfbWFjaGlfYTsKLSAgICAgIGNhc2UgNjQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNjkgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzIgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgNzkgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0FEREk7IGdvdG8gZXh0cmFjdF9zZm10X2FkZGk7Ci0gICAgICBjYXNlIDgwIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDgxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TUkxJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zbGxpOwotICAgICAgY2FzZSA4MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSA4MyA6IGl0eXBlID0gTTMyUlhGX0lOU05fU1JBSTsgZ290byBleHRyYWN0X3NmbXRfc2xsaTsKLSAgICAgIGNhc2UgODQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgODUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NMTEk7IGdvdG8gZXh0cmFjdF9zZm10X3NsbGk7Ci0gICAgICBjYXNlIDg3IDoKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVlRBQ0hJX0E7IGdvdG8gZXh0cmFjdF9zZm10X212dGFjaGlfYTsKLSAgICAgICAgICBjYXNlIDEgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX01WVEFDTE9fQTsgZ290byBleHRyYWN0X3NmbXRfbXZ0YWNoaV9hOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDg4IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9SQUNIX0RTSTsgZ290byBleHRyYWN0X3NmbXRfcmFjX2RzaTsKLSAgICAgIGNhc2UgODkgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1JBQ19EU0k7IGdvdG8gZXh0cmFjdF9zZm10X3JhY19kc2k7Ci0gICAgICBjYXNlIDkwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVUxXVTE7IGdvdG8gZXh0cmFjdF9zZm10X211bHd1MTsKLSAgICAgIGNhc2UgOTEgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX01BQ1dVMTsgZ290byBleHRyYWN0X3NmbXRfbWFjd3UxOwotICAgICAgY2FzZSA5MiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTUFDTEgxOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tYWN3dTE7Ci0gICAgICBjYXNlIDkzIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NU0JMTzsgZ290byBleHRyYWN0X3NmbXRfbXNibG87Ci0gICAgICBjYXNlIDk0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TQUREOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zYWRkOwotICAgICAgY2FzZSA5NSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gTTMyUlhGX0lOU05fTVZGQUNISV9BOyBnb3RvIGV4dHJhY3Rfc2ZtdF9tdmZhY2hpX2E7Ci0gICAgICAgICAgY2FzZSAxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9NVkZBQ0xPX0E7IGdvdG8gZXh0cmFjdF9zZm10X212ZmFjaGlfYTsKLSAgICAgICAgICBjYXNlIDIgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX01WRkFDTUlfQTsgZ290byBleHRyYWN0X3NmbXRfbXZmYWNoaV9hOwotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDk2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDk3IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDk4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDk5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTAyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMDcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTA4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEwOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTExIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MREk4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZGk4OwotICAgICAgY2FzZSAxMTIgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9OT1A7IGdvdG8gZXh0cmFjdF9zZm10X25vcDsKLSAgICAgICAgICBjYXNlIDQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NDOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zYzsKLSAgICAgICAgICBjYXNlIDUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NOQzsgZ290byBleHRyYWN0X3NmbXRfc2M7Ci0gICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CQ0w4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iY2w4OwotICAgICAgICAgIGNhc2UgOSA6IGl0eXBlID0gTTMyUlhGX0lOU05fQk5DTDg7IGdvdG8gZXh0cmFjdF9zZm10X2JjbDg7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fQkM4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYzg7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUlhGX0lOU05fQk5DODsgZ290byBleHRyYWN0X3NmbXRfYmM4OwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JMODsgZ290byBleHRyYWN0X3NmbXRfYmw4OwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JSQTg7IGdvdG8gZXh0cmFjdF9zZm10X2JyYTg7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTEzIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExNCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTUgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE2IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDExNyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMTggOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTE5IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyMCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTIyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyMyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTI1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDEyNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxMjcgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSA4IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CQ0w4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iY2w4OwotICAgICAgICAgIGNhc2UgOSA6IGl0eXBlID0gTTMyUlhGX0lOU05fQk5DTDg7IGdvdG8gZXh0cmFjdF9zZm10X2JjbDg7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fQkM4OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iYzg7Ci0gICAgICAgICAgY2FzZSAxMyA6IGl0eXBlID0gTTMyUlhGX0lOU05fQk5DODsgZ290byBleHRyYWN0X3NmbXRfYmM4OwotICAgICAgICAgIGNhc2UgMTQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JMODsgZ290byBleHRyYWN0X3NmbXRfYmw4OwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JSQTg7IGdvdG8gZXh0cmFjdF9zZm10X2JyYTg7Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTMyIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9DTVBJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBpOwotICAgICAgY2FzZSAxMzMgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0NNUFVJOyBnb3RvIGV4dHJhY3Rfc2ZtdF9jbXBpOwotICAgICAgY2FzZSAxMzQgOgotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKLSAgICAgICAgICAvKiBNdXN0IGZldGNoIG1vcmUgYml0cy4gICovCi0gICAgICAgICAgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOwotICAgICAgICAgIHZhbCA9ICgoKGluc24gPj4gMTIpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDApKSk7Ci0gICAgICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMCA6IGl0eXBlID0gTTMyUlhGX0lOU05fU0FUOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zYXQ7Ci0gICAgICAgICAgICAgIGNhc2UgMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fU0FUSDsgZ290byBleHRyYWN0X3NmbXRfc2F0YjsKLSAgICAgICAgICAgICAgY2FzZSAzIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TQVRCOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zYXRiOwotICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMTM2IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9BRERWMzsgZ290byBleHRyYWN0X3NmbXRfYWRkdjM7Ci0gICAgICBjYXNlIDEzOCA6IGl0eXBlID0gTTMyUlhGX0lOU05fQUREMzsgZ290byBleHRyYWN0X3NmbXRfYWRkMzsKLSAgICAgIGNhc2UgMTQwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9BTkQzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9hbmQzOwotICAgICAgY2FzZSAxNDEgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1hPUjM7IGdvdG8gZXh0cmFjdF9zZm10X2FuZDM7Ci0gICAgICBjYXNlIDE0MiA6IGl0eXBlID0gTTMyUlhGX0lOU05fT1IzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9vcjM7Ci0gICAgICBjYXNlIDE0NCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotICAgICAgICAgIC8qIE11c3QgZmV0Y2ggbW9yZSBiaXRzLiAgKi8KLSAgICAgICAgICBpbnNuID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgMik7Ci0gICAgICAgICAgdmFsID0gKCgoaW5zbiA+PiAxMikgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHZhbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKLSAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgICAgICAgICAgc3dpdGNoICh2YWwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDAgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0RJVjsgZ290byBleHRyYWN0X3NmbXRfZGl2OwotICAgICAgICAgICAgICAgICAgY2FzZSAxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9ESVZIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9kaXY7Ci0gICAgICAgICAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGRlZmF1bHQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1hfSU5WQUxJRDsgZ290byBleHRyYWN0X3NmbXRfZW1wdHk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIDE0NSA6IGl0eXBlID0gTTMyUlhGX0lOU05fRElWVTsgZ290byBleHRyYWN0X3NmbXRfZGl2OwotICAgICAgY2FzZSAxNDYgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1JFTTsgZ290byBleHRyYWN0X3NmbXRfZGl2OwotICAgICAgY2FzZSAxNDcgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1JFTVU7IGdvdG8gZXh0cmFjdF9zZm10X2RpdjsKLSAgICAgIGNhc2UgMTUyIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TUkwzOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zbGwzOwotICAgICAgY2FzZSAxNTQgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NSQTM7IGdvdG8gZXh0cmFjdF9zZm10X3NsbDM7Ci0gICAgICBjYXNlIDE1NiA6IGl0eXBlID0gTTMyUlhGX0lOU05fU0xMMzsgZ290byBleHRyYWN0X3NmbXRfc2xsMzsKLSAgICAgIGNhc2UgMTU5IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MREkxNjsgZ290byBleHRyYWN0X3NmbXRfbGRpMTY7Ci0gICAgICBjYXNlIDE2MCA6IGl0eXBlID0gTTMyUlhGX0lOU05fU1RCX0Q7IGdvdG8gZXh0cmFjdF9zZm10X3N0Yl9kOwotICAgICAgY2FzZSAxNjIgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX1NUSF9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdGhfZDsKLSAgICAgIGNhc2UgMTY0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TVF9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zdF9kOwotICAgICAgY2FzZSAxNjggOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0xEQl9EOyBnb3RvIGV4dHJhY3Rfc2ZtdF9sZF9kOwotICAgICAgY2FzZSAxNjkgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0xEVUJfRDsgZ290byBleHRyYWN0X3NmbXRfbGRfZDsKLSAgICAgIGNhc2UgMTcwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MREhfRDsgZ290byBleHRyYWN0X3NmbXRfbGRfZDsKLSAgICAgIGNhc2UgMTcxIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9MRFVIX0Q7IGdvdG8gZXh0cmFjdF9zZm10X2xkX2Q7Ci0gICAgICBjYXNlIDE3MiA6IGl0eXBlID0gTTMyUlhGX0lOU05fTERfRDsgZ290byBleHRyYWN0X3NmbXRfbGRfZDsKLSAgICAgIGNhc2UgMTc2IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CRVE7IGdvdG8gZXh0cmFjdF9zZm10X2JlcTsKLSAgICAgIGNhc2UgMTc3IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CTkU7IGdvdG8gZXh0cmFjdF9zZm10X2JlcTsKLSAgICAgIGNhc2UgMTg0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CRVFaOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXF6OwotICAgICAgY2FzZSAxODUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JORVo7IGdvdG8gZXh0cmFjdF9zZm10X2JlcXo7Ci0gICAgICBjYXNlIDE4NiA6IGl0eXBlID0gTTMyUlhGX0lOU05fQkxUWjsgZ290byBleHRyYWN0X3NmbXRfYmVxejsKLSAgICAgIGNhc2UgMTg3IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CR0VaOyBnb3RvIGV4dHJhY3Rfc2ZtdF9iZXF6OwotICAgICAgY2FzZSAxODggOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JMRVo7IGdvdG8gZXh0cmFjdF9zZm10X2JlcXo7Ci0gICAgICBjYXNlIDE4OSA6IGl0eXBlID0gTTMyUlhGX0lOU05fQkdUWjsgZ290byBleHRyYWN0X3NmbXRfYmVxejsKLSAgICAgIGNhc2UgMjIwIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9TRVRIOyBnb3RvIGV4dHJhY3Rfc2ZtdF9zZXRoOwotICAgICAgY2FzZSAyMjQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjI1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIyNiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMjcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjI4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIyOSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjMxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzMiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjM0IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzNSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzYgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjM3IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDIzOCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyMzkgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0xEMjQ7IGdvdG8gZXh0cmFjdF9zZm10X2xkMjQ7Ci0gICAgICBjYXNlIDI0MCA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDEgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQyIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0MyA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDQgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQ1IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0NiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNDcgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjQ4IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI0OSA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNTAgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjUxIDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI1MiA6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyNTMgOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjU0IDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI1NSA6Ci0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA4KSAmICgxNSA8PCAwKSkpOwotICAgICAgICAgIHN3aXRjaCAodmFsKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDggOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JDTDI0OyBnb3RvIGV4dHJhY3Rfc2ZtdF9iY2wyNDsKLSAgICAgICAgICBjYXNlIDkgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JOQ0wyNDsgZ290byBleHRyYWN0X3NmbXRfYmNsMjQ7Ci0gICAgICAgICAgY2FzZSAxMiA6IGl0eXBlID0gTTMyUlhGX0lOU05fQkMyNDsgZ290byBleHRyYWN0X3NmbXRfYmMyNDsKLSAgICAgICAgICBjYXNlIDEzIDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CTkMyNDsgZ290byBleHRyYWN0X3NmbXRfYmMyNDsKLSAgICAgICAgICBjYXNlIDE0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9CTDI0OyBnb3RvIGV4dHJhY3Rfc2ZtdF9ibDI0OwotICAgICAgICAgIGNhc2UgMTUgOiBpdHlwZSA9IE0zMlJYRl9JTlNOX0JSQTI0OyBnb3RvIGV4dHJhY3Rfc2ZtdF9icmEyNDsKLSAgICAgICAgICBkZWZhdWx0IDogaXR5cGUgPSBNMzJSWEZfSU5TTl9YX0lOVkFMSUQ7IGdvdG8gZXh0cmFjdF9zZm10X2VtcHR5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6IGl0eXBlID0gTTMyUlhGX0lOU05fWF9JTlZBTElEOyBnb3RvIGV4dHJhY3Rfc2ZtdF9lbXB0eTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZGVjb2RlZCwgbm93IGV4dHJhY3QgdGhlIGZpZWxkcy4gICovCi0KLSBleHRyYWN0X3NmbXRfZW1wdHk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9lbXB0eSIsIChjaGFyICopIDApKTsKLQotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FkZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYWRkIiwgImRyIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYWRkMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZDMiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FuZDM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hbmQzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIFVJTlQgZl91aW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl91aW1tMTYgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3VpbW0xNikgPSBmX3VpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FuZDMiLCAiZl91aW1tMTYgMHgleCIsICd4JywgZl91aW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X29yMzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgVUlOVCBmX3VpbW0xNjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX3VpbW0xNiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfdWltbTE2KSA9IGZfdWltbTE2OwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfb3IzIiwgImZfdWltbTE2IDB4JXgiLCAneCcsIGZfdWltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGRpOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gICAgVUlOVCBmX3IxOwotICAgIElOVCBmX3NpbW04OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9zaW1tOCA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTgpID0gZl9zaW1tODsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZGkiLCAiZl9zaW1tOCAweCV4IiwgJ3gnLCBmX3NpbW04LCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX2RyKSA9IGZfcjE7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2FkZHY6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZHYiLCAiZHIgMHgleCIsICd4JywgZl9yMSwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9kcikgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGR2MzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2FkZHYzIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9hZGR4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9hZGR4IiwgImRyIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmM4OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgICBTSSBmX2Rpc3A4OwotCi0gICAgZl9kaXNwOCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSkpICsgKCgocGMpICYgKC00KSkpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDgpID0gZl9kaXNwODsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JjOCIsICJkaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9iYzI0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gICAgU0kgZl9kaXNwMjQ7Ci0KLSAgICBmX2Rpc3AyNCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgOCwgMjQpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwMjQpID0gZl9kaXNwMjQ7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iYzI0IiwgImRpc3AyNCAweCV4IiwgJ3gnLCBmX2Rpc3AyNCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmVxOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotICAgIFNJIGZfZGlzcDE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfZGlzcDE2ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwMTYpID0gZl9kaXNwMTY7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmVxIiwgImRpc3AxNiAweCV4IiwgJ3gnLCBmX2Rpc3AxNiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JlcXo6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICAgIFVJTlQgZl9yMjsKLSAgICBTSSBmX2Rpc3AxNjsKLQotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLSAgICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDE2KSA9IGZfZGlzcDE2OwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9iZXF6IiwgImRpc3AxNiAweCV4IiwgJ3gnLCBmX2Rpc3AxNiwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ibDg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICAgIFNJIGZfZGlzcDg7Ci0KLSAgICBmX2Rpc3A4ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwOCkgPSBmX2Rpc3A4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmw4IiwgImRpc3A4IDB4JXgiLCAneCcsIGZfZGlzcDgsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ibDI0OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gICAgU0kgZl9kaXNwMjQ7Ci0KLSAgICBmX2Rpc3AyNCA9ICgoKChFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgOCwgMjQpKSA8PCAoMikpKSArIChwYykpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwMjQpID0gZl9kaXNwMjQ7Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ibDI0IiwgImRpc3AyNCAweCV4IiwgJ3gnLCBmX2Rpc3AyNCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JjbDg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICAgIFNJIGZfZGlzcDg7Ci0KLSAgICBmX2Rpc3A4ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwOCkgPSBmX2Rpc3A4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYmNsOCIsICJkaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfYmNsMjQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgICBTSSBmX2Rpc3AyNDsKLQotICAgIGZfZGlzcDI0ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCA4LCAyNCkpIDw8ICgyKSkpICsgKHBjKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX2Rpc3AyNCkgPSBmX2Rpc3AyNDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2JjbDI0IiwgImRpc3AyNCAweCV4IiwgJ3gnLCBmX2Rpc3AyNCwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2JyYTg6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICAgIFNJIGZfZGlzcDg7Ci0KLSAgICBmX2Rpc3A4ID0gKCgoKEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9kaXNwOCkgPSBmX2Rpc3A4OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYnJhOCIsICJkaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9icmEyNDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICAgIFNJIGZfZGlzcDI0OwotCi0gICAgZl9kaXNwMjQgPSAoKCgoRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDgsIDI0KSkgPDwgKDIpKSkgKyAocGMpKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZGlzcDI0KSA9IGZfZGlzcDI0OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfYnJhMjQiLCAiZGlzcDI0IDB4JXgiLCAneCcsIGZfZGlzcDI0LCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXA6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY21wIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2NtcGk6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfY21waSIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9jbXB6OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2NtcHoiLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2RpdjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfZGl2IiwgImRyIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfamM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2pjIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2psOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfamwuZgotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfamwiLCAic3IgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2ptcDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfam1wIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X2xkOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGQiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZF9kOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGRfZCIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRfcGx1czoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X2xkX3BsdXMiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICAgIEZMRCAob3V0X3NyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGQyNDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkMjQuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfdWltbTI0OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl91aW1tMjQgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMzIsIDgsIDI0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfdWltbTI0KSA9IGZfdWltbTI0OwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbGQyNCIsICJ1aW1tMjQgMHgleCIsICd4JywgZl91aW1tMjQsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbGRpODoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICAgIFVJTlQgZl9yMTsKLSAgICBJTlQgZl9zaW1tODsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfc2ltbTggPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAxNiwgOCwgOCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW04KSA9IGZfc2ltbTg7Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGk4IiwgImZfc2ltbTggMHgleCIsICd4JywgZl9zaW1tOCwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sZGkxNjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBJTlQgZl9zaW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3NpbW0xNiA9IEVYVFJBQ1RfTVNCMF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9sZGkxNiIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9sb2NrOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbG9jayIsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyKSA9IGZfcjI7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21hY2hpX2E6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX2FjYzsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX2FjYyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgMSk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9hY2MpID0gZl9hY2M7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbWFjaGlfYSIsICJmX2FjYyAweCV4IiwgJ3gnLCBmX2FjYywgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X211bGhpX2E6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX2FjYzsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX2FjYyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgOCwgMSk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9hY2MpID0gZl9hY2M7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbXVsaGlfYSIsICJmX2FjYyAweCV4IiwgJ3gnLCBmX2FjYywgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X212OgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbXYiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9tdmZhY2hpX2E6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfYWNjczsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfYWNjcyA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDIpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9hY2NzKSA9IGZfYWNjczsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X212ZmFjaGlfYSIsICJmX2FjY3MgMHgleCIsICd4JywgZl9hY2NzLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKG91dF9kcikgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X212ZmM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZjLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9yMikgPSBmX3IyOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbXZmYyIsICJmX3IyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXZ0YWNoaV9hOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0YWNoaV9hLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX2FjY3M7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX2FjY3MgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCAyKTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfYWNjcykgPSBmX2FjY3M7Ci0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X212dGFjaGlfYSIsICJmX2FjY3MgMHgleCIsICd4JywgZl9hY2NzLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X212dGM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9yMSkgPSBmX3IxOwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbXZ0YyIsICJmX3IxIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ub3A6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ub3AiLCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9yYWNfZHNpOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfcmFjX2RzaS5mCi0gICAgVUlOVCBmX2FjY2Q7Ci0gICAgVUlOVCBmX2FjY3M7Ci0gICAgU0kgZl9pbW0xOwotCi0gICAgZl9hY2NkID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCAyKTsKLSAgICBmX2FjY3MgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCAyKTsKLSAgICBmX2ltbTEgPSAoKEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTUsIDEpKSArICgxKSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX2FjY3MpID0gZl9hY2NzOwotICBGTEQgKGZfaW1tMSkgPSBmX2ltbTE7Ci0gIEZMRCAoZl9hY2NkKSA9IGZfYWNjZDsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3JhY19kc2kiLCAiZl9hY2NzIDB4JXgiLCAneCcsIGZfYWNjcywgImZfaW1tMSAweCV4IiwgJ3gnLCBmX2ltbTEsICJmX2FjY2QgMHgleCIsICd4JywgZl9hY2NkLCAoY2hhciAqKSAwKSk7Ci0KLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9ydGU6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLQotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9ydGUiLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zZXRoOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2V0aC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9oaTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9oaTE2ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxNiwgMTYpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl9oaTE2KSA9IGZfaGkxNjsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NldGgiLCAiZl9oaTE2IDB4JXgiLCAneCcsIGZfaGkxNiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zbGwzOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OwotICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc2xsMyIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc2xsaToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfdWltbTU7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3VpbW01ID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMSwgNSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3VpbW01KSA9IGZfdWltbTU7Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zbGxpIiwgImZfdWltbTUgMHgleCIsICd4JywgZl91aW1tNSwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9kcikgPSBmX3IxOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdCIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdF9kOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0X2QiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGI6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RiIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0Yl9kOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLSAgICBJTlQgZl9zaW1tMTY7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0gICAgZl9zaW1tMTYgPSBFWFRSQUNUX01TQjBfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0Yl9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc3RoOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3N0aCIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zdGhfZDoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0gICAgSU5UIGZfc2ltbTE2OwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotICAgIGZfc2ltbTE2ID0gRVhUUkFDVF9NU0IwX0lOVCAoaW5zbiwgMzIsIDE2LCAxNik7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zdGhfZCIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOwotCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCi0gIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKLSAgICB7Ci0gICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKLSAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOwotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3N0X3BsdXM6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc3RfcGx1cyIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICAgIEZMRCAob3V0X3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF90cmFwOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdHJhcC5mCi0gICAgVUlOVCBmX3VpbW00OwotCi0gICAgZl91aW1tNCA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoZl91aW1tNCkgPSBmX3VpbW00OwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfdHJhcCIsICJmX3VpbW00IDB4JXgiLCAneCcsIGZfdWltbTQsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgIH0KLSNlbmRpZgotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X3VubG9jazoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF91bmxvY2siLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfc2F0YjoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDMyLCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NhdGIiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zYXQ6Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9zYXQiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcikgPSBmX3IyOwotICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zYWRkOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0KLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfc2FkZCIsIChjaGFyICopIDApKTsKLQotI3VuZGVmIEZMRAotICAgIHJldHVybiBpZGVzYzsKLSAgfQotCi0gZXh0cmFjdF9zZm10X21hY3d1MToKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICAgIFVJTlQgZl9yMTsKLSAgICBVSU5UIGZfcjI7Ci0KLSAgICBmX3IxID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCA0LCA0KTsKLSAgICBmX3IyID0gRVhUUkFDVF9NU0IwX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOwotICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07Ci0gIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAic2ZtdF9tYWN3dTEiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXNibG86Ci0gIHsKLSAgICBjb25zdCBJREVTQyAqaWRlc2MgPSAmbTMycnhmX2luc25fZGF0YVtpdHlwZV07Ci0gICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgICBVSU5UIGZfcjE7Ci0gICAgVUlOVCBmX3IyOwotCi0gICAgZl9yMSA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7Ci0gICAgZl9yMiA9IEVYVFJBQ1RfTVNCMF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOwotCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCi0gIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKLSAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOwotICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgInNmbXRfbXNibG8iLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KLSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQotICAgIHsKLSAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOwotICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7Ci0gICAgfQotI2VuZGlmCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLSBleHRyYWN0X3NmbXRfbXVsd3UxOgotICB7Ci0gICAgY29uc3QgSURFU0MgKmlkZXNjID0gJm0zMnJ4Zl9pbnNuX2RhdGFbaXR5cGVdOwotICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gICAgVUlOVCBmX3IxOwotICAgIFVJTlQgZl9yMjsKLQotICAgIGZfcjEgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOwotICAgIGZfcjIgPSBFWFRSQUNUX01TQjBfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsKLQotICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLwotICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07Ci0gIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X211bHd1MSIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0gIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLwotICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCi0gICAgewotICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7Ci0gICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKLSAgICB9Ci0jZW5kaWYKLSN1bmRlZiBGTEQKLSAgICByZXR1cm4gaWRlc2M7Ci0gIH0KLQotIGV4dHJhY3Rfc2ZtdF9zYzoKLSAgewotICAgIGNvbnN0IElERVNDICppZGVzYyA9ICZtMzJyeGZfaW5zbl9kYXRhW2l0eXBlXTsKLSAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotCi0KLSAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KLSAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJzZm10X3NjIiwgKGNoYXIgKikgMCkpOwotCi0jdW5kZWYgRkxECi0gICAgcmV0dXJuIGlkZXNjOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2RlY29kZXguaCBiL3NpbS9tMzJyL2RlY29kZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2YzIxOC4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9kZWNvZGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyogRGVjb2RlIGhlYWRlciBmb3IgbTMycnhmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJYRl9ERUNPREVfSAotI2RlZmluZSBNMzJSWEZfREVDT0RFX0gKLQotZXh0ZXJuIGNvbnN0IElERVNDICptMzJyeGZfZGVjb2RlIChTSU1fQ1BVICosIElBRERSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fSU5TTl9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQlVGICopOwotZXh0ZXJuIHZvaWQgbTMycnhmX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyeGZfc2VtX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyeGZfc2VtZl9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICopOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbnMgaW4gY3B1IGZhbWlseSBtMzJyeGYuICAqLwotdHlwZWRlZiBlbnVtIG0zMnJ4Zl9pbnNuX3R5cGUgewotICBNMzJSWEZfSU5TTl9YX0lOVkFMSUQsIE0zMlJYRl9JTlNOX1hfQUZURVIsIE0zMlJYRl9JTlNOX1hfQkVGT1JFLCBNMzJSWEZfSU5TTl9YX0NUSV9DSEFJTgotICwgTTMyUlhGX0lOU05fWF9DSEFJTiwgTTMyUlhGX0lOU05fWF9CRUdJTiwgTTMyUlhGX0lOU05fQURELCBNMzJSWEZfSU5TTl9BREQzCi0gLCBNMzJSWEZfSU5TTl9BTkQsIE0zMlJYRl9JTlNOX0FORDMsIE0zMlJYRl9JTlNOX09SLCBNMzJSWEZfSU5TTl9PUjMKLSAsIE0zMlJYRl9JTlNOX1hPUiwgTTMyUlhGX0lOU05fWE9SMywgTTMyUlhGX0lOU05fQURESSwgTTMyUlhGX0lOU05fQUREVgotICwgTTMyUlhGX0lOU05fQUREVjMsIE0zMlJYRl9JTlNOX0FERFgsIE0zMlJYRl9JTlNOX0JDOCwgTTMyUlhGX0lOU05fQkMyNAotICwgTTMyUlhGX0lOU05fQkVRLCBNMzJSWEZfSU5TTl9CRVFaLCBNMzJSWEZfSU5TTl9CR0VaLCBNMzJSWEZfSU5TTl9CR1RaCi0gLCBNMzJSWEZfSU5TTl9CTEVaLCBNMzJSWEZfSU5TTl9CTFRaLCBNMzJSWEZfSU5TTl9CTkVaLCBNMzJSWEZfSU5TTl9CTDgKLSAsIE0zMlJYRl9JTlNOX0JMMjQsIE0zMlJYRl9JTlNOX0JDTDgsIE0zMlJYRl9JTlNOX0JDTDI0LCBNMzJSWEZfSU5TTl9CTkM4Ci0gLCBNMzJSWEZfSU5TTl9CTkMyNCwgTTMyUlhGX0lOU05fQk5FLCBNMzJSWEZfSU5TTl9CUkE4LCBNMzJSWEZfSU5TTl9CUkEyNAotICwgTTMyUlhGX0lOU05fQk5DTDgsIE0zMlJYRl9JTlNOX0JOQ0wyNCwgTTMyUlhGX0lOU05fQ01QLCBNMzJSWEZfSU5TTl9DTVBJCi0gLCBNMzJSWEZfSU5TTl9DTVBVLCBNMzJSWEZfSU5TTl9DTVBVSSwgTTMyUlhGX0lOU05fQ01QRVEsIE0zMlJYRl9JTlNOX0NNUFoKLSAsIE0zMlJYRl9JTlNOX0RJViwgTTMyUlhGX0lOU05fRElWVSwgTTMyUlhGX0lOU05fUkVNLCBNMzJSWEZfSU5TTl9SRU1VCi0gLCBNMzJSWEZfSU5TTl9ESVZILCBNMzJSWEZfSU5TTl9KQywgTTMyUlhGX0lOU05fSk5DLCBNMzJSWEZfSU5TTl9KTAotICwgTTMyUlhGX0lOU05fSk1QLCBNMzJSWEZfSU5TTl9MRCwgTTMyUlhGX0lOU05fTERfRCwgTTMyUlhGX0lOU05fTERCCi0gLCBNMzJSWEZfSU5TTl9MREJfRCwgTTMyUlhGX0lOU05fTERILCBNMzJSWEZfSU5TTl9MREhfRCwgTTMyUlhGX0lOU05fTERVQgotICwgTTMyUlhGX0lOU05fTERVQl9ELCBNMzJSWEZfSU5TTl9MRFVILCBNMzJSWEZfSU5TTl9MRFVIX0QsIE0zMlJYRl9JTlNOX0xEX1BMVVMKLSAsIE0zMlJYRl9JTlNOX0xEMjQsIE0zMlJYRl9JTlNOX0xESTgsIE0zMlJYRl9JTlNOX0xESTE2LCBNMzJSWEZfSU5TTl9MT0NLCi0gLCBNMzJSWEZfSU5TTl9NQUNISV9BLCBNMzJSWEZfSU5TTl9NQUNMT19BLCBNMzJSWEZfSU5TTl9NQUNXSElfQSwgTTMyUlhGX0lOU05fTUFDV0xPX0EKLSAsIE0zMlJYRl9JTlNOX01VTCwgTTMyUlhGX0lOU05fTVVMSElfQSwgTTMyUlhGX0lOU05fTVVMTE9fQSwgTTMyUlhGX0lOU05fTVVMV0hJX0EKLSAsIE0zMlJYRl9JTlNOX01VTFdMT19BLCBNMzJSWEZfSU5TTl9NViwgTTMyUlhGX0lOU05fTVZGQUNISV9BLCBNMzJSWEZfSU5TTl9NVkZBQ0xPX0EKLSAsIE0zMlJYRl9JTlNOX01WRkFDTUlfQSwgTTMyUlhGX0lOU05fTVZGQywgTTMyUlhGX0lOU05fTVZUQUNISV9BLCBNMzJSWEZfSU5TTl9NVlRBQ0xPX0EKLSAsIE0zMlJYRl9JTlNOX01WVEMsIE0zMlJYRl9JTlNOX05FRywgTTMyUlhGX0lOU05fTk9QLCBNMzJSWEZfSU5TTl9OT1QKLSAsIE0zMlJYRl9JTlNOX1JBQ19EU0ksIE0zMlJYRl9JTlNOX1JBQ0hfRFNJLCBNMzJSWEZfSU5TTl9SVEUsIE0zMlJYRl9JTlNOX1NFVEgKLSAsIE0zMlJYRl9JTlNOX1NMTCwgTTMyUlhGX0lOU05fU0xMMywgTTMyUlhGX0lOU05fU0xMSSwgTTMyUlhGX0lOU05fU1JBCi0gLCBNMzJSWEZfSU5TTl9TUkEzLCBNMzJSWEZfSU5TTl9TUkFJLCBNMzJSWEZfSU5TTl9TUkwsIE0zMlJYRl9JTlNOX1NSTDMKLSAsIE0zMlJYRl9JTlNOX1NSTEksIE0zMlJYRl9JTlNOX1NULCBNMzJSWEZfSU5TTl9TVF9ELCBNMzJSWEZfSU5TTl9TVEIKLSAsIE0zMlJYRl9JTlNOX1NUQl9ELCBNMzJSWEZfSU5TTl9TVEgsIE0zMlJYRl9JTlNOX1NUSF9ELCBNMzJSWEZfSU5TTl9TVF9QTFVTCi0gLCBNMzJSWEZfSU5TTl9TVF9NSU5VUywgTTMyUlhGX0lOU05fU1VCLCBNMzJSWEZfSU5TTl9TVUJWLCBNMzJSWEZfSU5TTl9TVUJYCi0gLCBNMzJSWEZfSU5TTl9UUkFQLCBNMzJSWEZfSU5TTl9VTkxPQ0ssIE0zMlJYRl9JTlNOX1NBVEIsIE0zMlJYRl9JTlNOX1NBVEgKLSAsIE0zMlJYRl9JTlNOX1NBVCwgTTMyUlhGX0lOU05fUENNUEJaLCBNMzJSWEZfSU5TTl9TQURELCBNMzJSWEZfSU5TTl9NQUNXVTEKLSAsIE0zMlJYRl9JTlNOX01TQkxPLCBNMzJSWEZfSU5TTl9NVUxXVTEsIE0zMlJYRl9JTlNOX01BQ0xIMSwgTTMyUlhGX0lOU05fU0MKLSAsIE0zMlJYRl9JTlNOX1NOQywgTTMyUlhGX0lOU05fUEFSX0FERCwgTTMyUlhGX0lOU05fV1JJVEVfQURELCBNMzJSWEZfSU5TTl9QQVJfQU5ECi0gLCBNMzJSWEZfSU5TTl9XUklURV9BTkQsIE0zMlJYRl9JTlNOX1BBUl9PUiwgTTMyUlhGX0lOU05fV1JJVEVfT1IsIE0zMlJYRl9JTlNOX1BBUl9YT1IKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX1hPUiwgTTMyUlhGX0lOU05fUEFSX0FEREksIE0zMlJYRl9JTlNOX1dSSVRFX0FEREksIE0zMlJYRl9JTlNOX1BBUl9BRERWCi0gLCBNMzJSWEZfSU5TTl9XUklURV9BRERWLCBNMzJSWEZfSU5TTl9QQVJfQUREWCwgTTMyUlhGX0lOU05fV1JJVEVfQUREWCwgTTMyUlhGX0lOU05fUEFSX0JDOAotICwgTTMyUlhGX0lOU05fV1JJVEVfQkM4LCBNMzJSWEZfSU5TTl9QQVJfQkw4LCBNMzJSWEZfSU5TTl9XUklURV9CTDgsIE0zMlJYRl9JTlNOX1BBUl9CQ0w4Ci0gLCBNMzJSWEZfSU5TTl9XUklURV9CQ0w4LCBNMzJSWEZfSU5TTl9QQVJfQk5DOCwgTTMyUlhGX0lOU05fV1JJVEVfQk5DOCwgTTMyUlhGX0lOU05fUEFSX0JSQTgKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX0JSQTgsIE0zMlJYRl9JTlNOX1BBUl9CTkNMOCwgTTMyUlhGX0lOU05fV1JJVEVfQk5DTDgsIE0zMlJYRl9JTlNOX1BBUl9DTVAKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX0NNUCwgTTMyUlhGX0lOU05fUEFSX0NNUFUsIE0zMlJYRl9JTlNOX1dSSVRFX0NNUFUsIE0zMlJYRl9JTlNOX1BBUl9DTVBFUQotICwgTTMyUlhGX0lOU05fV1JJVEVfQ01QRVEsIE0zMlJYRl9JTlNOX1BBUl9DTVBaLCBNMzJSWEZfSU5TTl9XUklURV9DTVBaLCBNMzJSWEZfSU5TTl9QQVJfSkMKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX0pDLCBNMzJSWEZfSU5TTl9QQVJfSk5DLCBNMzJSWEZfSU5TTl9XUklURV9KTkMsIE0zMlJYRl9JTlNOX1BBUl9KTAotICwgTTMyUlhGX0lOU05fV1JJVEVfSkwsIE0zMlJYRl9JTlNOX1BBUl9KTVAsIE0zMlJYRl9JTlNOX1dSSVRFX0pNUCwgTTMyUlhGX0lOU05fUEFSX0xECi0gLCBNMzJSWEZfSU5TTl9XUklURV9MRCwgTTMyUlhGX0lOU05fUEFSX0xEQiwgTTMyUlhGX0lOU05fV1JJVEVfTERCLCBNMzJSWEZfSU5TTl9QQVJfTERICi0gLCBNMzJSWEZfSU5TTl9XUklURV9MREgsIE0zMlJYRl9JTlNOX1BBUl9MRFVCLCBNMzJSWEZfSU5TTl9XUklURV9MRFVCLCBNMzJSWEZfSU5TTl9QQVJfTERVSAotICwgTTMyUlhGX0lOU05fV1JJVEVfTERVSCwgTTMyUlhGX0lOU05fUEFSX0xEX1BMVVMsIE0zMlJYRl9JTlNOX1dSSVRFX0xEX1BMVVMsIE0zMlJYRl9JTlNOX1BBUl9MREk4Ci0gLCBNMzJSWEZfSU5TTl9XUklURV9MREk4LCBNMzJSWEZfSU5TTl9QQVJfTE9DSywgTTMyUlhGX0lOU05fV1JJVEVfTE9DSywgTTMyUlhGX0lOU05fUEFSX01BQ0hJX0EKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01BQ0hJX0EsIE0zMlJYRl9JTlNOX1BBUl9NQUNMT19BLCBNMzJSWEZfSU5TTl9XUklURV9NQUNMT19BLCBNMzJSWEZfSU5TTl9QQVJfTUFDV0hJX0EKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01BQ1dISV9BLCBNMzJSWEZfSU5TTl9QQVJfTUFDV0xPX0EsIE0zMlJYRl9JTlNOX1dSSVRFX01BQ1dMT19BLCBNMzJSWEZfSU5TTl9QQVJfTVVMCi0gLCBNMzJSWEZfSU5TTl9XUklURV9NVUwsIE0zMlJYRl9JTlNOX1BBUl9NVUxISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVUxISV9BLCBNMzJSWEZfSU5TTl9QQVJfTVVMTE9fQQotICwgTTMyUlhGX0lOU05fV1JJVEVfTVVMTE9fQSwgTTMyUlhGX0lOU05fUEFSX01VTFdISV9BLCBNMzJSWEZfSU5TTl9XUklURV9NVUxXSElfQSwgTTMyUlhGX0lOU05fUEFSX01VTFdMT19BCi0gLCBNMzJSWEZfSU5TTl9XUklURV9NVUxXTE9fQSwgTTMyUlhGX0lOU05fUEFSX01WLCBNMzJSWEZfSU5TTl9XUklURV9NViwgTTMyUlhGX0lOU05fUEFSX01WRkFDSElfQQotICwgTTMyUlhGX0lOU05fV1JJVEVfTVZGQUNISV9BLCBNMzJSWEZfSU5TTl9QQVJfTVZGQUNMT19BLCBNMzJSWEZfSU5TTl9XUklURV9NVkZBQ0xPX0EsIE0zMlJYRl9JTlNOX1BBUl9NVkZBQ01JX0EKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01WRkFDTUlfQSwgTTMyUlhGX0lOU05fUEFSX01WRkMsIE0zMlJYRl9JTlNOX1dSSVRFX01WRkMsIE0zMlJYRl9JTlNOX1BBUl9NVlRBQ0hJX0EKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01WVEFDSElfQSwgTTMyUlhGX0lOU05fUEFSX01WVEFDTE9fQSwgTTMyUlhGX0lOU05fV1JJVEVfTVZUQUNMT19BLCBNMzJSWEZfSU5TTl9QQVJfTVZUQwotICwgTTMyUlhGX0lOU05fV1JJVEVfTVZUQywgTTMyUlhGX0lOU05fUEFSX05FRywgTTMyUlhGX0lOU05fV1JJVEVfTkVHLCBNMzJSWEZfSU5TTl9QQVJfTk9QCi0gLCBNMzJSWEZfSU5TTl9XUklURV9OT1AsIE0zMlJYRl9JTlNOX1BBUl9OT1QsIE0zMlJYRl9JTlNOX1dSSVRFX05PVCwgTTMyUlhGX0lOU05fUEFSX1JBQ19EU0kKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX1JBQ19EU0ksIE0zMlJYRl9JTlNOX1BBUl9SQUNIX0RTSSwgTTMyUlhGX0lOU05fV1JJVEVfUkFDSF9EU0ksIE0zMlJYRl9JTlNOX1BBUl9SVEUKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX1JURSwgTTMyUlhGX0lOU05fUEFSX1NMTCwgTTMyUlhGX0lOU05fV1JJVEVfU0xMLCBNMzJSWEZfSU5TTl9QQVJfU0xMSQotICwgTTMyUlhGX0lOU05fV1JJVEVfU0xMSSwgTTMyUlhGX0lOU05fUEFSX1NSQSwgTTMyUlhGX0lOU05fV1JJVEVfU1JBLCBNMzJSWEZfSU5TTl9QQVJfU1JBSQotICwgTTMyUlhGX0lOU05fV1JJVEVfU1JBSSwgTTMyUlhGX0lOU05fUEFSX1NSTCwgTTMyUlhGX0lOU05fV1JJVEVfU1JMLCBNMzJSWEZfSU5TTl9QQVJfU1JMSQotICwgTTMyUlhGX0lOU05fV1JJVEVfU1JMSSwgTTMyUlhGX0lOU05fUEFSX1NULCBNMzJSWEZfSU5TTl9XUklURV9TVCwgTTMyUlhGX0lOU05fUEFSX1NUQgotICwgTTMyUlhGX0lOU05fV1JJVEVfU1RCLCBNMzJSWEZfSU5TTl9QQVJfU1RILCBNMzJSWEZfSU5TTl9XUklURV9TVEgsIE0zMlJYRl9JTlNOX1BBUl9TVF9QTFVTCi0gLCBNMzJSWEZfSU5TTl9XUklURV9TVF9QTFVTLCBNMzJSWEZfSU5TTl9QQVJfU1RfTUlOVVMsIE0zMlJYRl9JTlNOX1dSSVRFX1NUX01JTlVTLCBNMzJSWEZfSU5TTl9QQVJfU1VCCi0gLCBNMzJSWEZfSU5TTl9XUklURV9TVUIsIE0zMlJYRl9JTlNOX1BBUl9TVUJWLCBNMzJSWEZfSU5TTl9XUklURV9TVUJWLCBNMzJSWEZfSU5TTl9QQVJfU1VCWAotICwgTTMyUlhGX0lOU05fV1JJVEVfU1VCWCwgTTMyUlhGX0lOU05fUEFSX1RSQVAsIE0zMlJYRl9JTlNOX1dSSVRFX1RSQVAsIE0zMlJYRl9JTlNOX1BBUl9VTkxPQ0sKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX1VOTE9DSywgTTMyUlhGX0lOU05fUEFSX1BDTVBCWiwgTTMyUlhGX0lOU05fV1JJVEVfUENNUEJaLCBNMzJSWEZfSU5TTl9QQVJfU0FERAotICwgTTMyUlhGX0lOU05fV1JJVEVfU0FERCwgTTMyUlhGX0lOU05fUEFSX01BQ1dVMSwgTTMyUlhGX0lOU05fV1JJVEVfTUFDV1UxLCBNMzJSWEZfSU5TTl9QQVJfTVNCTE8KLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01TQkxPLCBNMzJSWEZfSU5TTl9QQVJfTVVMV1UxLCBNMzJSWEZfSU5TTl9XUklURV9NVUxXVTEsIE0zMlJYRl9JTlNOX1BBUl9NQUNMSDEKLSAsIE0zMlJYRl9JTlNOX1dSSVRFX01BQ0xIMSwgTTMyUlhGX0lOU05fUEFSX1NDLCBNMzJSWEZfSU5TTl9XUklURV9TQywgTTMyUlhGX0lOU05fUEFSX1NOQwotICwgTTMyUlhGX0lOU05fV1JJVEVfU05DLCBNMzJSWEZfSU5TTl9NQVgKLX0gTTMyUlhGX0lOU05fVFlQRTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igc2VtYW50aWMgZm9ybWF0cyBpbiBjcHUgZmFtaWx5IG0zMnJ4Zi4gICovCi10eXBlZGVmIGVudW0gbTMycnhmX3NmbXRfdHlwZSB7Ci0gIE0zMlJYRl9TRk1UX0VNUFRZLCBNMzJSWEZfU0ZNVF9BREQsIE0zMlJYRl9TRk1UX0FERDMsIE0zMlJYRl9TRk1UX0FORDMKLSAsIE0zMlJYRl9TRk1UX09SMywgTTMyUlhGX1NGTVRfQURESSwgTTMyUlhGX1NGTVRfQUREViwgTTMyUlhGX1NGTVRfQUREVjMKLSAsIE0zMlJYRl9TRk1UX0FERFgsIE0zMlJYRl9TRk1UX0JDOCwgTTMyUlhGX1NGTVRfQkMyNCwgTTMyUlhGX1NGTVRfQkVRCi0gLCBNMzJSWEZfU0ZNVF9CRVFaLCBNMzJSWEZfU0ZNVF9CTDgsIE0zMlJYRl9TRk1UX0JMMjQsIE0zMlJYRl9TRk1UX0JDTDgKLSAsIE0zMlJYRl9TRk1UX0JDTDI0LCBNMzJSWEZfU0ZNVF9CUkE4LCBNMzJSWEZfU0ZNVF9CUkEyNCwgTTMyUlhGX1NGTVRfQ01QCi0gLCBNMzJSWEZfU0ZNVF9DTVBJLCBNMzJSWEZfU0ZNVF9DTVBaLCBNMzJSWEZfU0ZNVF9ESVYsIE0zMlJYRl9TRk1UX0pDCi0gLCBNMzJSWEZfU0ZNVF9KTCwgTTMyUlhGX1NGTVRfSk1QLCBNMzJSWEZfU0ZNVF9MRCwgTTMyUlhGX1NGTVRfTERfRAotICwgTTMyUlhGX1NGTVRfTERfUExVUywgTTMyUlhGX1NGTVRfTEQyNCwgTTMyUlhGX1NGTVRfTERJOCwgTTMyUlhGX1NGTVRfTERJMTYKLSAsIE0zMlJYRl9TRk1UX0xPQ0ssIE0zMlJYRl9TRk1UX01BQ0hJX0EsIE0zMlJYRl9TRk1UX01VTEhJX0EsIE0zMlJYRl9TRk1UX01WCi0gLCBNMzJSWEZfU0ZNVF9NVkZBQ0hJX0EsIE0zMlJYRl9TRk1UX01WRkMsIE0zMlJYRl9TRk1UX01WVEFDSElfQSwgTTMyUlhGX1NGTVRfTVZUQwotICwgTTMyUlhGX1NGTVRfTk9QLCBNMzJSWEZfU0ZNVF9SQUNfRFNJLCBNMzJSWEZfU0ZNVF9SVEUsIE0zMlJYRl9TRk1UX1NFVEgKLSAsIE0zMlJYRl9TRk1UX1NMTDMsIE0zMlJYRl9TRk1UX1NMTEksIE0zMlJYRl9TRk1UX1NULCBNMzJSWEZfU0ZNVF9TVF9ECi0gLCBNMzJSWEZfU0ZNVF9TVEIsIE0zMlJYRl9TRk1UX1NUQl9ELCBNMzJSWEZfU0ZNVF9TVEgsIE0zMlJYRl9TRk1UX1NUSF9ECi0gLCBNMzJSWEZfU0ZNVF9TVF9QTFVTLCBNMzJSWEZfU0ZNVF9UUkFQLCBNMzJSWEZfU0ZNVF9VTkxPQ0ssIE0zMlJYRl9TRk1UX1NBVEIKLSAsIE0zMlJYRl9TRk1UX1NBVCwgTTMyUlhGX1NGTVRfU0FERCwgTTMyUlhGX1NGTVRfTUFDV1UxLCBNMzJSWEZfU0ZNVF9NU0JMTwotICwgTTMyUlhGX1NGTVRfTVVMV1UxLCBNMzJSWEZfU0ZNVF9TQwotfSBNMzJSWEZfU0ZNVF9UWVBFOwotCi0vKiBGdW5jdGlvbiB1bml0IGhhbmRsZXJzICh1c2VyIHdyaXR0ZW4pLiAgKi8KLQotZXh0ZXJuIGludCBtMzJyeGZfbW9kZWxfbTMycnhfdV9zdG9yZSAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyYzEqLywgSU5UIC8qc3JjMiovKTsKLWV4dGVybiBpbnQgbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyKi8sIElOVCAvKmRyKi8pOwotZXh0ZXJuIGludCBtMzJyeGZfbW9kZWxfbTMycnhfdV9jdGkgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzciovKTsKLWV4dGVybiBpbnQgbTMycnhmX21vZGVsX20zMnJ4X3VfbWFjIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3JjMSovLCBJTlQgLypzcmMyKi8pOwotZXh0ZXJuIGludCBtMzJyeGZfbW9kZWxfbTMycnhfdV9jbXAgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzcmMxKi8sIElOVCAvKnNyYzIqLyk7Ci1leHRlcm4gaW50IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzciovLCBJTlQgLypkciovLCBJTlQgLypkciovKTsKLQotLyogUHJvZmlsaW5nIGJlZm9yZS9hZnRlciBoYW5kbGVycyAodXNlciB3cml0dGVuKSAqLwotCi1leHRlcm4gdm9pZCBtMzJyeGZfbW9kZWxfaW5zbl9iZWZvcmUgKFNJTV9DUFUgKiwgaW50IC8qZmlyc3RfcCovKTsKLWV4dGVybiB2b2lkIG0zMnJ4Zl9tb2RlbF9pbnNuX2FmdGVyIChTSU1fQ1BVICosIGludCAvKmxhc3RfcCovLCBpbnQgLypjeWNsZXMqLyk7Ci0KLSNlbmRpZiAvKiBNMzJSWEZfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2RldmljZXMuYyBiL3NpbS9tMzJyL2RldmljZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyYzhlNy4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9kZXZpY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogbTMyciBkZXZpY2Ugc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLQotI2lmZGVmIEhBVkVfRFZfU09DS1NFUgotI2luY2x1ZGUgImR2LXNvY2tzZXIuaCIKLSNlbmRpZgotCi0vKiBIYW5kbGluZyB0aGUgTVNQUiByZWdpc3RlciBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgZGV2aWNlIGluIHRoZSBjb3JlCi0gICBtYXBwaW5nIHRoYXQgd2luZHMgdXAgaGVyZS4gICovCi0KLWRldmljZSBtMzJyX2RldmljZXM7Ci0KLWludAotZGV2aWNlX2lvX3JlYWRfYnVmZmVyIChkZXZpY2UgKm1lLCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwKLQkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywKLQkJICAgICAgIFNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQotewotICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSAhPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCi0gICAgcmV0dXJuIG5yX2J5dGVzOwotCi0jaWZkZWYgSEFWRV9EVl9TT0NLU0VSCi0gIGlmIChhZGRyID09IFVBUlRfSU5DSEFSX0FERFIpCi0gICAgewotICAgICAgaW50IGMgPSBkdl9zb2Nrc2VyX3JlYWQgKHNkKTsKLSAgICAgIGlmIChjID09IC0xKQotCXJldHVybiAwOwotICAgICAgKihjaGFyICopIHNvdXJjZSA9IGM7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChhZGRyID09IFVBUlRfU1RBVFVTX0FERFIpCi0gICAgewotICAgICAgaW50IHN0YXR1cyA9IGR2X3NvY2tzZXJfc3RhdHVzIChzZCk7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gc291cmNlOwotICAgICAgcFswXSA9IDA7Ci0gICAgICBwWzFdID0gKCgoc3RhdHVzICYgRFZfU09DS1NFUl9JTlBVVF9FTVBUWSkKLSNpZmRlZiBVQVJUX0lOUFVUX1JFQURZMAotCSAgICAgICA/IFVBUlRfSU5QVVRfUkVBRFkgOiAwKQotI2Vsc2UKLQkgICAgICAgPyAwIDogVUFSVF9JTlBVVF9SRUFEWSkKLSNlbmRpZgotCSAgICAgICsgKChzdGF0dXMgJiBEVl9TT0NLU0VSX09VVFBVVF9FTVBUWSkgPyBVQVJUX09VVFBVVF9SRUFEWSA6IDApKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBucl9ieXRlczsKLX0KLQotaW50Ci1kZXZpY2VfaW9fd3JpdGVfYnVmZmVyIChkZXZpY2UgKm1lLCBjb25zdCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwKLQkJCWFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywKLQkJCVNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQotewotI2lmIFdJVEhfU0NBQ0hFCi0gIC8qIE1TUFIgc3VwcG9ydCBpcyBkZXByZWNhdGVkIGJ1dCBpcyBrZXB0IGluIGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eQotICAgICB3aXRoIGV4aXN0aW5nIG92ZXJsYXkgc3VwcG9ydC4gICovCi0gIGlmIChhZGRyID09IE1TUFJfQUREUikKLSAgICB7Ci0gICAgICBpZiAoKCooY29uc3QgY2hhciAqKSBzb3VyY2UgJiBNU1BSX1BVUkdFKSAhPSAwKQotCXNjYWNoZV9mbHVzaCAoc2QpOwotICAgICAgcmV0dXJuIG5yX2J5dGVzOwotICAgIH0KLSAgaWYgKGFkZHIgPT0gTUNDUl9BRERSKQotICAgIHsKLSAgICAgIGlmICgoKihjb25zdCBjaGFyICopIHNvdXJjZSAmIE1DQ1JfQ1ApICE9IDApCi0Jc2NhY2hlX2ZsdXNoIChzZCk7Ci0gICAgICByZXR1cm4gbnJfYnl0ZXM7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQotICAgIHJldHVybiBucl9ieXRlczsKLQotI2lmZGVmIEhBVkVfRFZfU09DS1NFUgotICBpZiAoYWRkciA9PSBVQVJUX09VVENIQVJfQUREUikKLSAgICB7Ci0gICAgICBpbnQgcmMgPSBkdl9zb2Nrc2VyX3dyaXRlIChzZCwgKihjaGFyICopIHNvdXJjZSk7Ci0gICAgICByZXR1cm4gcmMgPT0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLXZvaWQKLWRldmljZV9lcnJvciAoZGV2aWNlICptZSwgY2hhciAqbWVzc2FnZSwgLi4uKQotewotfQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvbTMyci1zaW0uaCBiL3NpbS9tMzJyL20zMnItc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzI0MTAuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvbTMyci1zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKiBjb2xsZWN0aW9uIG9mIGp1bmsgd2FpdGluZyB0aW1lIHRvIHNvcnQgb3V0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE0zMlJfU0lNX0gKLSNkZWZpbmUgTTMyUl9TSU1fSAotCi0vKiBnZGIgcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBQU1dfUkVHTlVNCTE2Ci0jZGVmaW5lIENCUl9SRUdOVU0JMTcKLSNkZWZpbmUgU1BJX1JFR05VTQkxOAotI2RlZmluZSBTUFVfUkVHTlVNCTE5Ci0jZGVmaW5lIEJQQ19SRUdOVU0JMjAKLSNkZWZpbmUgUENfUkVHTlVNCTIxCi0jZGVmaW5lIEFDQ0xfUkVHTlVNCTIyCi0jZGVmaW5lIEFDQ0hfUkVHTlVNCTIzCi0jZGVmaW5lIEFDQzFMX1JFR05VTQkyNAotI2RlZmluZSBBQ0MxSF9SRUdOVU0JMjUKLSNkZWZpbmUgQkJQU1dfUkVHTlVNCTI2Ci0jZGVmaW5lIEJCUENfUkVHTlVNCTI3Ci0KLWV4dGVybiBpbnQgbTMycl9kZWNvZGVfZ2RiX2N0cmxfcmVnbnVtIChpbnQpOwotCi0vKiBDb3ZlciBtYWNyb3MgZm9yIGhhcmR3YXJlIGFjY2Vzc2VzLgotICAgRklYTUU6IEV2ZW50dWFsbHkgbW92ZSB0byBjZ2VuLiAgKi8KLSNkZWZpbmUgR0VUX0hfU00oKSAoKENQVSAoaF9wc3cpICYgMHg4MCkgIT0gMCkKLQotZXh0ZXJuIFNJIGFfbTMycl9oX2dyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKLWV4dGVybiB2b2lkIGFfbTMycl9oX2dyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7Ci1leHRlcm4gVVNJIGFfbTMycl9oX2NyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKLWV4dGVybiB2b2lkIGFfbTMycl9oX2NyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBVU0kpOwotCi1leHRlcm4gVVNJIG0zMnJiZl9oX2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICosIFVJTlQpOwotZXh0ZXJuIHZvaWQgbTMycmJmX2hfY3Jfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCwgVVNJKTsKLQotZXh0ZXJuIFVRSSBtMzJyYmZfaF9wc3dfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyYmZfaF9wc3dfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVVFJKTsKLQotZXh0ZXJuIERJIG0zMnJiZl9oX2FjY3VtX2dldF9oYW5kbGVyIChTSU1fQ1BVICopOwotZXh0ZXJuIHZvaWQgbTMycmJmX2hfYWNjdW1fc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgREkpOwotCi1leHRlcm4gVVNJIG0zMnJ4Zl9oX2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICosIFVJTlQpOwotZXh0ZXJuIHZvaWQgbTMycnhmX2hfY3Jfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCwgVVNJKTsKLWV4dGVybiBVUUkgbTMycnhmX2hfcHN3X2dldF9oYW5kbGVyIChTSU1fQ1BVICopOwotZXh0ZXJuIHZvaWQgbTMycnhmX2hfcHN3X3NldF9oYW5kbGVyIChTSU1fQ1BVICosIFVRSSk7Ci1leHRlcm4gREkgbTMycnhmX2hfYWNjdW1fZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKik7Ci1leHRlcm4gdm9pZCBtMzJyeGZfaF9hY2N1bV9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBESSk7Ci0KLWV4dGVybiBESSBtMzJyeGZfaF9hY2N1bXNfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCk7Ci1leHRlcm4gdm9pZCBtMzJyeGZfaF9hY2N1bXNfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCwgREkpOwotDAotLyogTWlzYy4gcHJvZmlsZSBkYXRhLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBub3AgaW5zbiBzbG90IGZpbGxlciBjb3VudCAqLwotICB1bnNpZ25lZCBpbnQgZmlsbG5vcF9jb3VudDsKLSAgLyogbnVtYmVyIG9mIHBhcmFsbGVsIGluc25zICovCi0gIHVuc2lnbmVkIGludCBwYXJhbGxlbF9jb3VudDsKLQotICAvKiBGSVhNRTogZ2VuZXJhbGl6ZSB0aGlzIHRvIGhhbmRsZSBhbGwgaW5zbiBsZW5ndGhzLCBtb3ZlIHRvIGNvbW1vbi4gICovCi0gIC8qIG51bWJlciBvZiBzaG9ydCBpbnNucywgbm90IGluY2x1ZGluZyBwYXJhbGxlbCBvbmVzICovCi0gIHVuc2lnbmVkIGludCBzaG9ydF9jb3VudDsKLSAgLyogbnVtYmVyIG9mIGxvbmcgaW5zbnMgKi8KLSAgdW5zaWduZWQgaW50IGxvbmdfY291bnQ7Ci0KLSAgLyogV29ya2luZyBhcmVhIGZvciBjb21wdXRpbmcgY3ljbGUgY291bnRzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpbnNuX2N5Y2xlczsgLyogRklYTUU6IGRlbGV0ZSAqLwotICB1bnNpZ25lZCBsb25nIGN0aV9zdGFsbDsKLSAgdW5zaWduZWQgbG9uZyBsb2FkX3N0YWxsOwotICB1bnNpZ25lZCBsb25nIGJpZ2dlc3RfY3ljbGVzOwotCi0gIC8qIEJpdG1hc2sgb2YgcmVnaXN0ZXJzIGxvYWRlZCBieSBwcmV2aW91cyBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGxvYWRfcmVnczsKLSAgLyogQml0bWFzayBvZiByZWdpc3RlcnMgbG9hZGVkIGJ5IGN1cnJlbnQgaW5zbi4gICovCi0gIHVuc2lnbmVkIGludCBsb2FkX3JlZ3NfcGVuZGluZzsKLX0gTTMyUl9NSVNDX1BST0ZJTEU7Ci0KLS8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgYXJlYS4gICovCi12b2lkIG0zMnJfaW5pdF9pbnNuX2N5Y2xlcyAoU0lNX0NQVSAqLCBpbnQpOwotLyogVXBkYXRlIHRoZSB0b3RhbHMgZm9yIHRoZSBpbnNuLiAgKi8KLXZvaWQgbTMycl9yZWNvcmRfaW5zbl9jeWNsZXMgKFNJTV9DUFUgKiwgaW50KTsKLQotLyogVGhpcyBpcyBpbnZva2VkIGJ5IHRoZSBub3AgcGF0dGVybiBpbiB0aGUgLmNwdSBmaWxlLiAgKi8KLSNkZWZpbmUgUFJPRklMRV9DT1VOVF9GSUxMTk9QUyhjcHUsIGFkZHIpIFwKLWRvIHsgXAotICBpZiAoUFJPRklMRV9JTlNOX1AgKGNwdSkgXAotICAgICAgJiYgKGFkZHIgJiAzKSAhPSAwKSBcCi0gICAgKysgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5maWxsbm9wX2NvdW50OyBcCi19IHdoaWxlICgwKQotCi0vKiBUaGlzIGlzIGludm9rZWQgYnkgdGhlIGV4ZWN1dGUgc2VjdGlvbiBvZiBtbG9vcHsseH0uaW4uICAqLwotI2RlZmluZSBQUk9GSUxFX0NPVU5UX1BBUklOU05TKGNwdSkgXAotZG8geyBcCi0gIGlmIChQUk9GSUxFX0lOU05fUCAoY3B1KSkgXAotICAgICsrIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+cGFyYWxsZWxfY291bnQ7IFwKLX0gd2hpbGUgKDApCi0KLS8qIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgZXhlY3V0ZSBzZWN0aW9uIG9mIG1sb29weyx4fS5pbi4gICovCi0jZGVmaW5lIFBST0ZJTEVfQ09VTlRfU0hPUlRJTlNOUyhjcHUpIFwKLWRvIHsgXAotICBpZiAoUFJPRklMRV9JTlNOX1AgKGNwdSkpIFwKLSAgICArKyBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPnNob3J0X2NvdW50OyBcCi19IHdoaWxlICgwKQotCi0vKiBUaGlzIGlzIGludm9rZWQgYnkgdGhlIGV4ZWN1dGUgc2VjdGlvbiBvZiBtbG9vcHsseH0uaW4uICAqLwotI2RlZmluZSBQUk9GSUxFX0NPVU5UX0xPTkdJTlNOUyhjcHUpIFwKLWRvIHsgXAotICBpZiAoUFJPRklMRV9JTlNOX1AgKGNwdSkpIFwKLSAgICArKyBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmxvbmdfY291bnQ7IFwKLX0gd2hpbGUgKDApCi0MCi0jZGVmaW5lIEdFVFRXSSBHRVRUU0kKLSNkZWZpbmUgU0VUVFdJIFNFVFRTSQotDAotLyogQWRkaXRpb25hbCBleGVjdXRpb24gc3VwcG9ydC4gICovCi0KLS8qIFJlc3VsdCBvZiBzZW1hbnRpYyBmdW5jdGlvbiBpcyBvbmUgb2YKLSAgIC0gbmV4dCBhZGRyZXNzLCBicmFuY2ggb25seQotICAgLSBORVdfUENfU0tJUCwgc2Mvc25jIGluc24KLSAgIC0gTkVXX1BDXzIsIDIgYnl0ZSBub24tYnJhbmNoIG5vbi1zYy9zbmMgaW5zbgotICAgLSBORVdfUENfNCwgNCBieXRlIG5vbi1icmFuY2ggaW5zbgotICAgVGhlIHNwZWNpYWwgdmFsdWVzIGhhdmUgYml0IDEgc2V0IHNvIGl0J3MgY2hlYXAgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KLSAgIFRoaXMgd29ya3MgYmVjYXVzZSBhbGwgY3RpJ3MgYXJlIGRlZmluZWQgdG8gemVybyB0aGUgYm90dG9tIHR3byBiaXRzCi0gICBOb3RlIHRoYXQgdGhlIG0zMnJ4IG5vIGxvbmdlciBkb2Vzbid0IGltcGxlbWVudCBpdHMgc2VtYW50aWNzIHdpdGgKLSAgIGZ1bmN0aW9ucywgc28gdGhpcyBpc24ndCB1c2VkLiAgSXQncyBrZXB0IGFyb3VuZCBzaG91bGQgaXQgYmUgbmVlZGVkCi0gICBhZ2Fpbi4gICovCi0vKiBGSVhNRTogcmVwbGFjZSAweGZmZmYwMDAxIHdpdGggMT8gICovCi0jZGVmaW5lIE5FV19QQ19CQVNFIDB4ZmZmZjAwMDEKLSNkZWZpbmUgTkVXX1BDX1NLSVAgTkVXX1BDX0JBU0UKLSNkZWZpbmUgTkVXX1BDXzIgKE5FV19QQ19CQVNFICsgMikKLSNkZWZpbmUgTkVXX1BDXzQgKE5FV19QQ19CQVNFICsgNCkKLSNkZWZpbmUgTkVXX1BDX0JSQU5DSF9QKGFkZHIpICgoKGFkZHIpICYgMSkgPT0gMCkKLQotLyogTW9kaWZ5ICJuZXh0IHBjIiBzdXBwb3J0IHRvIGhhbmRsZSBwYXJhbGxlbCBleGVjdXRpb24uCi0gICBUaGlzIGlzIGZvciB0aGUgbm9uLXBiYiBjYXNlLiAgVGhlIG0zMnJ4IG5vIGxvbmdlciBpbXBsZW1lbnRzIHRoaXMuCi0gICBJdCdzIGtlcHQgYXJvdW5kIHNob3VsZCBpdCBiZSBuZWVkZWQgYWdhaW4uICAqLwotI2lmIGRlZmluZWQgKFdBTlRfQ1BVX00zMlJYRikgJiYgISBXSVRIX1NDQUNIRV9QQkJfTTMyUlhGCi0jdW5kZWYgU0VNX05FWFRfVlBDCi0jZGVmaW5lIFNFTV9ORVhUX1ZQQyhhYnVmLCBsZW4pIChORVdfUENfQkFTRSArIChsZW4pKQotI3VuZGVmIFNFTV9TS0lQX0lOU04KLSNkZWZpbmUgU0VNX1NLSVBfSU5TTihjcHUsIHNjLCB2cGN2YXIsIHllcykgRklYTUUKLSNlbmRpZgotDAotLyogSGFyZHdhcmUvZGV2aWNlIHN1cHBvcnQuCi0gICA/Pz8gV2lsbCBldmVudHVhbGx5IHdhbnQgdG8gbW92ZSBkZXZpY2Ugc3R1ZmYgdG8gY29uZmlnIGZpbGVzLiAgKi8KLQotLyogRXhjZXB0aW9uLCBJbnRlcnJ1cHQsIGFuZCBUcmFwIGFkZHJlc3NlcyAqLwotI2RlZmluZSBFSVRfU1lTQlJFQUtfQUREUgkweDEwCi0jZGVmaW5lIEVJVF9SU1ZEX0lOU05fQUREUgkweDIwCi0jZGVmaW5lIEVJVF9BRERSX0VYQ1BfQUREUgkweDMwCi0jZGVmaW5lIEVJVF9UUkFQX0JBU0VfQUREUgkweDQwCi0jZGVmaW5lIEVJVF9FWFRFUk5fQUREUgkJMHg4MAotI2RlZmluZSBFSVRfUkVTRVRfQUREUgkJMHg3ZmZmZmZmMAotI2RlZmluZSBFSVRfV0FLRVVQX0FERFIJCTB4N2ZmZmZmZjAKLQotLyogU3BlY2lhbCBwdXJwb3NlIHRyYXBzLiAgKi8KLSNkZWZpbmUgVFJBUF9TWVNDQUxMCTAKLSNkZWZpbmUgVFJBUF9CUkVBS1BPSU5UCTEKLQotLyogU3VwcG9ydCBmb3IgdGhlIE1TUFIgcmVnaXN0ZXIgKENhY2hlIFB1cmdlIENvbnRyb2wgUmVnaXN0ZXIpCi0gICBhbmQgdGhlIE1DQ1IgcmVnaXN0ZXIgKENhY2hlIENvbnRyb2wgUmVnaXN0ZXIpIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yCi0gICBvdmVybGF5cyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBzY2FjaGUuCi0gICBNU1BSIG5vIGxvbmdlciBleGlzdHMgYnV0IGlzIHN1cHBvcnRlZCBmb3IgdXB3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotICAgZWFybHkgb3ZlcmxheSBzdXBwb3J0LiAgKi8KLQotLyogQ2FjaGUgUHVyZ2UgQ29udHJvbCAob25seSBleGlzdHMgb24gZWFybHkgdmVyc2lvbnMgb2YgY2hpcHMpICovCi0jZGVmaW5lIE1TUFJfQUREUiAweGZmZmZmZmY3Ci0jZGVmaW5lIE1TUFJfUFVSR0UgMQotCi0vKiBMb2NrIENvbnRyb2wgUmVnaXN0ZXIgKG5vdCBzdXBwb3J0ZWQpICovCi0jZGVmaW5lIE1MQ1JfQUREUiAweGZmZmZmZmY3Ci0jZGVmaW5lIE1MQ1JfTE0gMQotCi0vKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKG5vdCBzdXBwb3J0ZWQpICovCi0jZGVmaW5lIE1QTVJfQUREUiAweGZmZmZmZmZiCi0KLS8qIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUNDUl9BRERSIDB4ZmZmZmZmZmYKLSNkZWZpbmUgTUNDUl9DUCAweDgwCi0vKiBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE1DQ1JfQ00wIDIKLSNkZWZpbmUgTUNDUl9DTTEgMQotCi0vKiBTZXJpYWwgZGV2aWNlIGFkZHJlc3Nlcy4gICovCi0jaWZkZWYgTTMyUl9FVkEgLyogb3JpZyBldmEgYm9hcmQsIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgVUFSVF9JTkNIQVJfQUREUgkweGZmMTAyMDEzCi0jZGVmaW5lIFVBUlRfT1VUQ0hBUl9BRERSCTB4ZmYxMDIwMGYKLSNkZWZpbmUgVUFSVF9TVEFUVVNfQUREUgkweGZmMTAyMDA2Ci0vKiBJbmRpY2F0ZSByZWFkeSBiaXQgaXMgaW52ZXJ0ZWQuICAqLwotI2RlZmluZSBVQVJUX0lOUFVUX1JFQURZMAotI2Vsc2UKLS8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGZvciB0aGUgTVNBMjAwMCBib2FyZC4KLSAgID8/PyBXaWxsIGV2ZW50dWFsbHkgbmVlZCB0byBtb3ZlIHRoaXMgdG8gYSBjb25maWcgZmlsZS4gICovCi0jZGVmaW5lIFVBUlRfSU5DSEFSX0FERFIJMHhmZjAwNDAwOQotI2RlZmluZSBVQVJUX09VVENIQVJfQUREUgkweGZmMDA0MDA3Ci0jZGVmaW5lIFVBUlRfU1RBVFVTX0FERFIJMHhmZjAwNDAwMgotI2VuZGlmCi0KLSNkZWZpbmUgVUFSVF9JTlBVVF9SRUFEWQkweDQKLSNkZWZpbmUgVUFSVF9PVVRQVVRfUkVBRFkJMHgxCi0KLS8qIFN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhbGwgZGV2aWNlIHN1cHBvcnQuICAqLwotI2RlZmluZSBNMzJSX0RFVklDRV9BRERSCTB4ZmYwMDAwMDAKLSNkZWZpbmUgTTMyUl9ERVZJQ0VfTEVOCQkweDAxMDAwMDAwCi0KLS8qIHNpbV9jb3JlX2F0dGFjaCBkZXZpY2UgYXJndW1lbnQuICAqLwotZXh0ZXJuIGRldmljZSBtMzJyX2RldmljZXM7Ci0KLS8qIEZJWE1FOiBUZW1wb3JhcnksIHVudGlsIGRldmljZSBzdXBwb3J0IHJlYWR5LiAgKi8KLXN0cnVjdCBfZGV2aWNlIHsgaW50IGZvbzsgfTsKLQotLyogSGFuZGxlIHRoZSB0cmFwIGluc24uICAqLwotVVNJIG0zMnJfdHJhcCAoU0lNX0NQVSAqLCBQQ0FERFIsIGludCk7Ci0KLSNlbmRpZiAvKiBNMzJSX1NJTV9IICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci9tMzJyLmMgYi9zaW0vbTMyci9tMzJyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNWU0YWEuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qIG0zMnIgc2ltdWxhdG9yIHN1cHBvcnQgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBXQU5UX0NQVSBtMzJyYmYKLSNkZWZpbmUgV0FOVF9DUFVfTTMyUkJGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImNnZW4tbWVtLmgiCi0jaW5jbHVkZSAiY2dlbi1vcHMuaCIKLQotLyogRGVjb2RlIGdkYiBjdHJsIHJlZ2lzdGVyIG51bWJlci4gICovCi0KLWludAotbTMycl9kZWNvZGVfZ2RiX2N0cmxfcmVnbnVtIChpbnQgZ2RiX3JlZ251bSkKLXsKLSAgc3dpdGNoIChnZGJfcmVnbnVtKQotICAgIHsKLSAgICAgIGNhc2UgUFNXX1JFR05VTSA6IHJldHVybiBIX0NSX1BTVzsKLSAgICAgIGNhc2UgQ0JSX1JFR05VTSA6IHJldHVybiBIX0NSX0NCUjsKLSAgICAgIGNhc2UgU1BJX1JFR05VTSA6IHJldHVybiBIX0NSX1NQSTsKLSAgICAgIGNhc2UgU1BVX1JFR05VTSA6IHJldHVybiBIX0NSX1NQVTsKLSAgICAgIGNhc2UgQlBDX1JFR05VTSA6IHJldHVybiBIX0NSX0JQQzsKLSAgICAgIGNhc2UgQkJQU1dfUkVHTlVNIDogcmV0dXJuIEhfQ1JfQkJQU1c7Ci0gICAgICBjYXNlIEJCUENfUkVHTlVNIDogcmV0dXJuIEhfQ1JfQkJQQzsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLWludAotbTMycmJmX2ZldGNoX3JlZ2lzdGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgaW50IHJuLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gIGludCBtYWNoID0gTUFDSF9OVU0gKENQVV9NQUNIIChjdXJyZW50X2NwdSkpOwotCi0gIGlmIChybiA8IDE2KQotICAgIFNFVFRXSSAoYnVmLCBhX20zMnJfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCBybikpOwotICBlbHNlCi0gICAgc3dpdGNoIChybikKLSAgICAgIHsKLSAgICAgIGNhc2UgUFNXX1JFR05VTSA6Ci0gICAgICBjYXNlIENCUl9SRUdOVU0gOgotICAgICAgY2FzZSBTUElfUkVHTlVNIDoKLSAgICAgIGNhc2UgU1BVX1JFR05VTSA6Ci0gICAgICBjYXNlIEJQQ19SRUdOVU0gOgotICAgICAgY2FzZSBCQlBTV19SRUdOVU0gOgotICAgICAgY2FzZSBCQlBDX1JFR05VTSA6Ci0JU0VUVFdJIChidWYsIGFfbTMycl9oX2NyX2dldCAoY3VycmVudF9jcHUsCi0JCQkJICAgICAgbTMycl9kZWNvZGVfZ2RiX2N0cmxfcmVnbnVtIChybikpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgUENfUkVHTlVNIDoKLQlpZiAobWFjaCA9PSBNQUNIX00zMlIpCi0JICBTRVRUV0kgKGJ1ZiwgbTMycmJmX2hfcGNfZ2V0IChjdXJyZW50X2NwdSkpOwotCWVsc2UKLQkgIFNFVFRXSSAoYnVmLCBtMzJyeGZfaF9wY19nZXQgKGN1cnJlbnRfY3B1KSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEFDQ0xfUkVHTlVNIDoKLQlpZiAobWFjaCA9PSBNQUNIX00zMlIpCi0JICBTRVRUV0kgKGJ1ZiwgR0VUTE9ESSAobTMycmJmX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSkpKTsKLQllbHNlCi0JICBTRVRUV0kgKGJ1ZiwgR0VUTE9ESSAobTMycnhmX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSkpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgQUNDSF9SRUdOVU0gOgotCWlmIChtYWNoID09IE1BQ0hfTTMyUikKLQkgIFNFVFRXSSAoYnVmLCBHRVRISURJIChtMzJyYmZfaF9hY2N1bV9nZXQgKGN1cnJlbnRfY3B1KSkpOwotCWVsc2UKLQkgIFNFVFRXSSAoYnVmLCBHRVRISURJIChtMzJyeGZfaF9hY2N1bV9nZXQgKGN1cnJlbnRfY3B1KSkpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KLX0KLQotLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLwotCi1pbnQKLW0zMnJiZl9zdG9yZV9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICBpbnQgbWFjaCA9IE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKTsKLQotICBpZiAocm4gPCAxNikKLSAgICBhX20zMnJfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCBybiwgR0VUVFdJIChidWYpKTsKLSAgZWxzZQotICAgIHN3aXRjaCAocm4pCi0gICAgICB7Ci0gICAgICBjYXNlIFBTV19SRUdOVU0gOgotICAgICAgY2FzZSBDQlJfUkVHTlVNIDoKLSAgICAgIGNhc2UgU1BJX1JFR05VTSA6Ci0gICAgICBjYXNlIFNQVV9SRUdOVU0gOgotICAgICAgY2FzZSBCUENfUkVHTlVNIDoKLSAgICAgIGNhc2UgQkJQU1dfUkVHTlVNIDoKLSAgICAgIGNhc2UgQkJQQ19SRUdOVU0gOgotCWFfbTMycl9oX2NyX3NldCAoY3VycmVudF9jcHUsCi0JCQkgbTMycl9kZWNvZGVfZ2RiX2N0cmxfcmVnbnVtIChybiksCi0JCQkgR0VUVFdJIChidWYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgUENfUkVHTlVNIDoKLQlpZiAobWFjaCA9PSBNQUNIX00zMlIpCi0JICBtMzJyYmZfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBHRVRUV0kgKGJ1ZikpOwotCWVsc2UKLQkgIG0zMnJ4Zl9oX3BjX3NldCAoY3VycmVudF9jcHUsIEdFVFRXSSAoYnVmKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEFDQ0xfUkVHTlVNIDoKLQl7Ci0JICBESSB2YWw7Ci0JICBpZiAobWFjaCA9PSBNQUNIX00zMlIpCi0JICAgIHZhbCA9IG0zMnJiZl9oX2FjY3VtX2dldCAoY3VycmVudF9jcHUpOwotCSAgZWxzZQotCSAgICB2YWwgPSBtMzJyeGZfaF9hY2N1bV9nZXQgKGN1cnJlbnRfY3B1KTsKLQkgIFNFVExPREkgKHZhbCwgR0VUVFdJIChidWYpKTsKLQkgIGlmIChtYWNoID09IE1BQ0hfTTMyUikKLQkgICAgbTMycmJmX2hfYWNjdW1fc2V0IChjdXJyZW50X2NwdSwgdmFsKTsKLQkgIGVsc2UKLQkgICAgbTMycnhmX2hfYWNjdW1fc2V0IChjdXJyZW50X2NwdSwgdmFsKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNhc2UgQUNDSF9SRUdOVU0gOgotCXsKLQkgIERJIHZhbDsKLQkgIGlmIChtYWNoID09IE1BQ0hfTTMyUikKLQkgICAgdmFsID0gbTMycmJmX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSk7Ci0JICBlbHNlCi0JICAgIHZhbCA9IG0zMnJ4Zl9oX2FjY3VtX2dldCAoY3VycmVudF9jcHUpOwotCSAgU0VUSElESSAodmFsLCBHRVRUV0kgKGJ1ZikpOwotCSAgaWYgKG1hY2ggPT0gTUFDSF9NMzJSKQotCSAgICBtMzJyYmZfaF9hY2N1bV9zZXQgKGN1cnJlbnRfY3B1LCB2YWwpOwotCSAgZWxzZQotCSAgICBtMzJyeGZfaF9hY2N1bV9zZXQgKGN1cnJlbnRfY3B1LCB2YWwpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZGVmYXVsdCA6Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KLX0KLQwKLS8qIENvdmVyIGZucyBmb3IgbWFjaCBpbmRlcGVuZGVudCByZWdpc3RlciBhY2Nlc3Nlcy4gICovCi0KLVNJCi1hX20zMnJfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICBzd2l0Y2ggKE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9DUFVfTTMyUkJGCi0gICAgY2FzZSBNQUNIX00zMlIgOiAKLSAgICAgIHJldHVybiBtMzJyYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NQVV9NMzJSWEYKLSAgICBjYXNlIE1BQ0hfTTMyUlggOiAKLSAgICAgIHJldHVybiBtMzJyeGZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotdm9pZAotYV9tMzJyX2hfZ3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQotewotICBzd2l0Y2ggKE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9DUFVfTTMyUkJGCi0gICAgY2FzZSBNQUNIX00zMlIgOiAKLSAgICAgIG0zMnJiZl9oX2dyX3NldCAoY3VycmVudF9jcHUsIHJlZ25vLCBuZXd2YWwpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NQVV9NMzJSWEYKLSAgICBjYXNlIE1BQ0hfTTMyUlggOiAKLSAgICAgIG0zMnJ4Zl9oX2dyX3NldCAoY3VycmVudF9jcHUsIHJlZ25vLCBuZXd2YWwpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotVVNJCi1hX20zMnJfaF9jcl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICBzd2l0Y2ggKE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9DUFVfTTMyUkJGCi0gICAgY2FzZSBNQUNIX00zMlIgOiAKLSAgICAgIHJldHVybiBtMzJyYmZfaF9jcl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NQVV9NMzJSWEYKLSAgICBjYXNlIE1BQ0hfTTMyUlggOiAKLSAgICAgIHJldHVybiBtMzJyeGZfaF9jcl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotdm9pZAotYV9tMzJyX2hfY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgVVNJIG5ld3ZhbCkKLXsKLSAgc3dpdGNoIChNQUNIX05VTSAoQ1BVX01BQ0ggKGN1cnJlbnRfY3B1KSkpCi0gICAgewotI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgotICAgIGNhc2UgTUFDSF9NMzJSIDogCi0gICAgICBtMzJyYmZfaF9jcl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9DUFVfTTMyUlhGCi0gICAgY2FzZSBNQUNIX00zMlJYIDogCi0gICAgICBtMzJyeGZfaF9jcl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0MCi1VU0kKLW0zMnJiZl9oX2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCBjcikKLXsKLSAgc3dpdGNoIChjcikKLSAgICB7Ci0gICAgY2FzZSBIX0NSX1BTVyA6IC8qIHBzdyAqLwotICAgICAgcmV0dXJuICgoKENQVSAoaF9icHN3KSAmIDB4YzEpIDw8IDgpCi0JICAgICAgfCAoKENQVSAoaF9wc3cpICYgMHhjMCkgPDwgMCkKLQkgICAgICB8IEdFVF9IX0NPTkQgKCkpOwotICAgIGNhc2UgSF9DUl9CQlBTVyA6IC8qIGJhY2t1cCBiYWNrdXAgcHN3ICovCi0gICAgICByZXR1cm4gQ1BVIChoX2JicHN3KSAmIDB4YzE7Ci0gICAgY2FzZSBIX0NSX0NCUiA6IC8qIGNvbmRpdGlvbiBiaXQgKi8KLSAgICAgIHJldHVybiBHRVRfSF9DT05EICgpOwotICAgIGNhc2UgSF9DUl9TUEkgOiAvKiBpbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotICAgICAgaWYgKCEgR0VUX0hfU00gKCkpCi0JcmV0dXJuIENQVSAoaF9ncltIX0dSX1NQXSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIENQVSAoaF9jcltIX0NSX1NQSV0pOwotICAgIGNhc2UgSF9DUl9TUFUgOiAvKiB1c2VyIHN0YWNrIHBvaW50ZXIgKi8KLSAgICAgIGlmIChHRVRfSF9TTSAoKSkKLQlyZXR1cm4gQ1BVIChoX2dyW0hfR1JfU1BdKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1BVIChoX2NyW0hfQ1JfU1BVXSk7Ci0gICAgY2FzZSBIX0NSX0JQQyA6IC8qIGJhY2t1cCBwYyAqLwotICAgICAgcmV0dXJuIENQVSAoaF9jcltIX0NSX0JQQ10pICYgMHhmZmZmZmZmZTsKLSAgICBjYXNlIEhfQ1JfQkJQQyA6IC8qIGJhY2t1cCBiYWNrdXAgcGMgKi8KLSAgICAgIHJldHVybiBDUFUgKGhfY3JbSF9DUl9CQlBDXSkgJiAweGZmZmZmZmZlOwotICAgIGNhc2UgNCA6IC8qID8/PyB1bnNwZWNpZmllZCwgYnV0IGFwcGFyZW50bHkgYXZhaWxhYmxlICovCi0gICAgY2FzZSA1IDogLyogPz8/IHVuc3BlY2lmaWVkLCBidXQgYXBwYXJlbnRseSBhdmFpbGFibGUgKi8KLSAgICAgIHJldHVybiBDUFUgKGhfY3JbY3JdKTsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotdm9pZAotbTMycmJmX2hfY3Jfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIGNyLCBVU0kgbmV3dmFsKQotewotICBzd2l0Y2ggKGNyKQotICAgIHsKLSAgICBjYXNlIEhfQ1JfUFNXIDogLyogcHN3ICovCi0gICAgICB7Ci0JaW50IG9sZF9zbSA9IChDUFUgKGhfcHN3KSAmIDB4ODApICE9IDA7Ci0JaW50IG5ld19zbSA9IChuZXd2YWwgJiAweDgwKSAhPSAwOwotCUNQVSAoaF9icHN3KSA9IChuZXd2YWwgPj4gOCkgJiAweGZmOwotCUNQVSAoaF9wc3cpID0gbmV3dmFsICYgMHhmZjsKLQlTRVRfSF9DT05EIChuZXd2YWwgJiAxKTsKLQkvKiBXaGVuIHN3aXRjaGluZyBzdGFjayBtb2RlcywgdXBkYXRlIHRoZSByZWdpc3RlcnMuICAqLwotCWlmIChvbGRfc20gIT0gbmV3X3NtKQotCSAgewotCSAgICBpZiAob2xkX3NtKQotCSAgICAgIHsKLQkJLyogU3dpdGNoaW5nIHVzZXIgLT4gc3lzdGVtLiAgKi8KLQkJQ1BVIChoX2NyW0hfQ1JfU1BVXSkgPSBDUFUgKGhfZ3JbSF9HUl9TUF0pOwotCQlDUFUgKGhfZ3JbSF9HUl9TUF0pID0gQ1BVIChoX2NyW0hfQ1JfU1BJXSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBTd2l0Y2hpbmcgc3lzdGVtIC0+IHVzZXIuICAqLwotCQlDUFUgKGhfY3JbSF9DUl9TUEldKSA9IENQVSAoaF9ncltIX0dSX1NQXSk7Ci0JCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBDUFUgKGhfY3JbSF9DUl9TUFVdKTsKLQkgICAgICB9Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBIX0NSX0JCUFNXIDogLyogYmFja3VwIGJhY2t1cCBwc3cgKi8KLSAgICAgIENQVSAoaF9iYnBzdykgPSBuZXd2YWwgJiAweGZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX0NCUiA6IC8qIGNvbmRpdGlvbiBiaXQgKi8KLSAgICAgIFNFVF9IX0NPTkQgKG5ld3ZhbCAmIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX1NQSSA6IC8qIGludGVycnVwdCBzdGFjayBwb2ludGVyICovCi0gICAgICBpZiAoISBHRVRfSF9TTSAoKSkKLQlDUFUgKGhfZ3JbSF9HUl9TUF0pID0gbmV3dmFsOwotICAgICAgZWxzZQotCUNQVSAoaF9jcltIX0NSX1NQSV0pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX1NQVSA6IC8qIHVzZXIgc3RhY2sgcG9pbnRlciAqLwotICAgICAgaWYgKEdFVF9IX1NNICgpKQotCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBuZXd2YWw7Ci0gICAgICBlbHNlCi0JQ1BVIChoX2NyW0hfQ1JfU1BVXSkgPSBuZXd2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhfQ1JfQlBDIDogLyogYmFja3VwIHBjICovCi0gICAgICBDUFUgKGhfY3JbSF9DUl9CUENdKSA9IG5ld3ZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSF9DUl9CQlBDIDogLyogYmFja3VwIGJhY2t1cCBwYyAqLwotICAgICAgQ1BVIChoX2NyW0hfQ1JfQkJQQ10pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0IDogLyogPz8/IHVuc3BlY2lmaWVkLCBidXQgYXBwYXJlbnRseSBhdmFpbGFibGUgKi8KLSAgICBjYXNlIDUgOiAvKiA/Pz8gdW5zcGVjaWZpZWQsIGJ1dCBhcHBhcmVudGx5IGF2YWlsYWJsZSAqLwotICAgICAgQ1BVIChoX2NyW2NyXSkgPSBuZXd2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIGlnbm9yZSAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDb3ZlciBmbnMgdG8gYWNjZXNzIGgtcHN3LiAgKi8KLQotVVFJCi1tMzJyYmZfaF9wc3dfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gKENQVSAoaF9wc3cpICYgMHhmZSkgfCAoQ1BVIChoX2NvbmQpICYgMSk7Ci19Ci0KLXZvaWQKLW0zMnJiZl9oX3Bzd19zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9wc3cpID0gbmV3dmFsOwotICBDUFUgKGhfY29uZCkgPSBuZXd2YWwgJiAxOwotfQotCi0vKiBDb3ZlciBmbnMgdG8gYWNjZXNzIGgtYWNjdW0uICAqLwotCi1ESQotbTMycmJmX2hfYWNjdW1fZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICAvKiBTaWduIGV4dGVuZCB0aGUgdG9wIDggYml0cy4gICovCi0gIERJIHI7Ci0jaWYgMQotICByID0gQU5EREkgKENQVSAoaF9hY2N1bSksIE1BS0VESSAoMHhmZmZmZmYsIDB4ZmZmZmZmZmYpKTsKLSAgciA9IFhPUkRJIChyLCBNQUtFREkgKDB4ODAwMDAwLCAwKSk7Ci0gIHIgPSBTVUJESSAociwgTUFLRURJICgweDgwMDAwMCwgMCkpOwotI2Vsc2UKLSAgU0kgaGksbG87Ci0gIHIgPSBDUFUgKGhfYWNjdW0pOwotICBoaSA9IEdFVEhJREkgKHIpOwotICBsbyA9IEdFVExPREkgKHIpOwotICBoaSA9ICgoaGkgJiAweGZmZmZmZikgXiAweDgwMDAwMCkgLSAweDgwMDAwMDsKLSAgciA9IE1BS0VESSAoaGksIGxvKTsKLSNlbmRpZgotICByZXR1cm4gcjsKLX0KLQotdm9pZAotbTMycmJmX2hfYWNjdW1fc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBESSBuZXd2YWwpCi17Ci0gIENQVSAoaF9hY2N1bSkgPSBuZXd2YWw7Ci19Ci0MCi0jaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKLQotLyogRklYTUU6IFNvbWUgb2YgdGhlc2Ugc2hvdWxkIGJlIGlubGluZSBvciBtYWNyb3MuICBMYXRlci4gICovCi0KLS8qIEluaXRpYWxpemUgY3ljbGUgY291bnRpbmcgZm9yIGFuIGluc24uCi0gICBGSVJTVF9QIGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwKLSAgIGluc25zLiAgKi8KLQotdm9pZAotbTMycmJmX21vZGVsX2luc25fYmVmb3JlIChTSU1fQ1BVICpjcHUsIGludCBmaXJzdF9wKQotewotICBNMzJSX01JU0NfUFJPRklMRSAqbXAgPSBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSk7Ci0gIG1wLT5jdGlfc3RhbGwgPSAwOwotICBtcC0+bG9hZF9zdGFsbCA9IDA7Ci0gIGlmIChmaXJzdF9wKQotICAgIHsKLSAgICAgIG1wLT5sb2FkX3JlZ3NfcGVuZGluZyA9IDA7Ci0gICAgICBtcC0+YmlnZ2VzdF9jeWNsZXMgPSAwOwotICAgIH0KLX0KLQotLyogUmVjb3JkIHRoZSBjeWNsZXMgY29tcHV0ZWQgZm9yIGFuIGluc24uCi0gICBMQVNUX1AgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsIGluc25zLAotICAgYW5kIHdlIHVwZGF0ZSB0aGUgdG90YWwgY3ljbGUgY291bnQuCi0gICBDWUNMRVMgaXMgdGhlIGN5Y2xlIGNvdW50IG9mIHRoZSBpbnNuLiAgKi8KLQotdm9pZAotbTMycmJmX21vZGVsX2luc25fYWZ0ZXIgKFNJTV9DUFUgKmNwdSwgaW50IGxhc3RfcCwgaW50IGN5Y2xlcykKLXsKLSAgUFJPRklMRV9EQVRBICpwID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKLSAgTTMyUl9NSVNDX1BST0ZJTEUgKm1wID0gQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpOwotICB1bnNpZ25lZCBsb25nIHRvdGFsID0gY3ljbGVzICsgbXAtPmN0aV9zdGFsbCArIG1wLT5sb2FkX3N0YWxsOwotCi0gIGlmIChsYXN0X3ApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBiaWdnZXN0ID0gdG90YWwgPiBtcC0+YmlnZ2VzdF9jeWNsZXMgPyB0b3RhbCA6IG1wLT5iaWdnZXN0X2N5Y2xlczsKLSAgICAgIFBST0ZJTEVfTU9ERUxfVE9UQUxfQ1lDTEVTIChwKSArPSBiaWdnZXN0OwotICAgICAgUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMgKHApID0gdG90YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSGVyZSB3ZSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0ICFsYXN0X3AgLT4gZmlyc3RfcC4gICovCi0gICAgICBtcC0+YmlnZ2VzdF9jeWNsZXMgPSB0b3RhbDsKLSAgICAgIFBST0ZJTEVfTU9ERUxfQ1VSX0lOU05fQ1lDTEVTIChwKSA9IHRvdGFsOwotICAgIH0KLQotICAvKiBCcmFuY2ggYW5kIGxvYWQgc3RhbGwgY291bnRzIGFyZSByZWNvcmRlZCBpbmRlcGVuZGVudGx5IG9mIHRoZQotICAgICB0b3RhbCBjeWNsZSBjb3VudC4gICovCi0gIFBST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyAocCkgKz0gbXAtPmN0aV9zdGFsbDsKLSAgUFJPRklMRV9NT0RFTF9MT0FEX1NUQUxMX0NZQ0xFUyAocCkgKz0gbXAtPmxvYWRfc3RhbGw7Ci0KLSAgbXAtPmxvYWRfcmVncyA9IG1wLT5sb2FkX3JlZ3NfcGVuZGluZzsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1jaGVja19sb2FkX3N0YWxsIChTSU1fQ1BVICpjcHUsIGludCByZWdubykKLXsKLSAgVUlOVCBoX2dyID0gQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5sb2FkX3JlZ3M7Ci0KLSAgaWYgKHJlZ25vICE9IC0xCi0gICAgICAmJiAoaF9nciAmICgxIDw8IHJlZ25vKSkgIT0gMCkKLSAgICB7Ci0gICAgICBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmxvYWRfc3RhbGwgKz0gMjsKLSAgICAgIGlmIChUUkFDRV9JTlNOX1AgKGNwdSkpCi0JY2dlbl90cmFjZV9wcmludGYgKGNwdSwgIiA7IExvYWQgc3RhbGwgb2YgMiBjeWNsZXMuIik7Ci0gICAgfQotfQotCi1pbnQKLW0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgIElOVCBzciwgSU5UIHNyMiwgSU5UIGRyKQotewotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyKTsKLSAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcjIpOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHNyYzEsIElOVCBzcmMyKQotewotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzEpOwotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzIpOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycmJmX21vZGVsX20zMnJfZF91X21hYyAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHNyYzEsIElOVCBzcmMyKQotewotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzEpOwotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzIpOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHNyKQotewotICBQUk9GSUxFX0RBVEEgKnByb2ZpbGUgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOwotICBpbnQgdGFrZW5fcCA9IChyZWZlcmVuY2VkICYgKDEgPDwgMSkpICE9IDA7Ci0KLSAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcik7Ci0gIGlmICh0YWtlbl9wKQotICAgIHsKLSAgICAgIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+Y3RpX3N0YWxsICs9IDI7Ci0gICAgICBQUk9GSUxFX01PREVMX1RBS0VOX0NPVU5UIChwcm9maWxlKSArPSAxOwotICAgIH0KLSAgZWxzZQotICAgIFBST0ZJTEVfTU9ERUxfVU5UQUtFTl9DT1VOVCAocHJvZmlsZSkgKz0gMTsKLSAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOwotfQotCi1pbnQKLW0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgIElOVCBzciwgSU5UIGRyKQotewotICBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmxvYWRfcmVnc19wZW5kaW5nIHw9ICgxIDw8IGRyKTsKLSAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcik7Ci0gIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKLX0KLQotaW50Ci1tMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAotCQkJICAgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgICBJTlQgc3JjMSwgSU5UIHNyYzIpCi17Ci0gIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMSk7Ci0gIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMik7Ci0gIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKLX0KLQotaW50Ci1tMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAotCQkJICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkKQotewotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLSNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvbTMycnguYyBiL3NpbS9tMzJyL20zMnJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzE5ZjYuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvbTMycnguYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBtMzJyeCBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFdBTlRfQ1BVIG0zMnJ4ZgotI2RlZmluZSBXQU5UX0NQVV9NMzJSWEYKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiY2dlbi1tZW0uaCIKLSNpbmNsdWRlICJjZ2VuLW9wcy5oIgotCi0vKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLWludAotbTMycnhmX2ZldGNoX3JlZ2lzdGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgaW50IHJuLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gIHJldHVybiBtMzJyYmZfZmV0Y2hfcmVnaXN0ZXIgKGN1cnJlbnRfY3B1LCBybiwgYnVmLCBsZW4pOwotfQotCi0vKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLWludAotbTMycnhmX3N0b3JlX3JlZ2lzdGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgaW50IHJuLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gIHJldHVybiBtMzJyYmZfc3RvcmVfcmVnaXN0ZXIgKGN1cnJlbnRfY3B1LCBybiwgYnVmLCBsZW4pOwotfQotDAotLyogQ292ZXIgZm5zIHRvIGdldC9zZXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotICAgRklYTUU6IER1cGxpY2F0ZWQgZnJvbSBtMzJyLmMuICBUaGUgaXNzdWUgaXMgc3RydWN0dXJlIG9mZnNldHMuICAqLwotCi1VU0kKLW0zMnJ4Zl9oX2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCBjcikKLXsKLSAgc3dpdGNoIChjcikKLSAgICB7Ci0gICAgY2FzZSBIX0NSX1BTVyA6IC8qIHBzdyAqLwotICAgICAgcmV0dXJuICgoKENQVSAoaF9icHN3KSAmIDB4YzEpIDw8IDgpCi0JICAgICAgfCAoKENQVSAoaF9wc3cpICYgMHhjMCkgPDwgMCkKLQkgICAgICB8IEdFVF9IX0NPTkQgKCkpOwotICAgIGNhc2UgSF9DUl9CQlBTVyA6IC8qIGJhY2t1cCBiYWNrdXAgcHN3ICovCi0gICAgICByZXR1cm4gQ1BVIChoX2JicHN3KSAmIDB4YzE7Ci0gICAgY2FzZSBIX0NSX0NCUiA6IC8qIGNvbmRpdGlvbiBiaXQgKi8KLSAgICAgIHJldHVybiBHRVRfSF9DT05EICgpOwotICAgIGNhc2UgSF9DUl9TUEkgOiAvKiBpbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotICAgICAgaWYgKCEgR0VUX0hfU00gKCkpCi0JcmV0dXJuIENQVSAoaF9ncltIX0dSX1NQXSk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIENQVSAoaF9jcltIX0NSX1NQSV0pOwotICAgIGNhc2UgSF9DUl9TUFUgOiAvKiB1c2VyIHN0YWNrIHBvaW50ZXIgKi8KLSAgICAgIGlmIChHRVRfSF9TTSAoKSkKLQlyZXR1cm4gQ1BVIChoX2dyW0hfR1JfU1BdKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1BVIChoX2NyW0hfQ1JfU1BVXSk7Ci0gICAgY2FzZSBIX0NSX0JQQyA6IC8qIGJhY2t1cCBwYyAqLwotICAgICAgcmV0dXJuIENQVSAoaF9jcltIX0NSX0JQQ10pICYgMHhmZmZmZmZmZTsKLSAgICBjYXNlIEhfQ1JfQkJQQyA6IC8qIGJhY2t1cCBiYWNrdXAgcGMgKi8KLSAgICAgIHJldHVybiBDUFUgKGhfY3JbSF9DUl9CQlBDXSkgJiAweGZmZmZmZmZlOwotICAgIGNhc2UgNCA6IC8qID8/PyB1bnNwZWNpZmllZCwgYnV0IGFwcGFyZW50bHkgYXZhaWxhYmxlICovCi0gICAgY2FzZSA1IDogLyogPz8/IHVuc3BlY2lmaWVkLCBidXQgYXBwYXJlbnRseSBhdmFpbGFibGUgKi8KLSAgICAgIHJldHVybiBDUFUgKGhfY3JbY3JdKTsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotdm9pZAotbTMycnhmX2hfY3Jfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIGNyLCBVU0kgbmV3dmFsKQotewotICBzd2l0Y2ggKGNyKQotICAgIHsKLSAgICBjYXNlIEhfQ1JfUFNXIDogLyogcHN3ICovCi0gICAgICB7Ci0JaW50IG9sZF9zbSA9IChDUFUgKGhfcHN3KSAmIDB4ODApICE9IDA7Ci0JaW50IG5ld19zbSA9IChuZXd2YWwgJiAweDgwKSAhPSAwOwotCUNQVSAoaF9icHN3KSA9IChuZXd2YWwgPj4gOCkgJiAweGZmOwotCUNQVSAoaF9wc3cpID0gbmV3dmFsICYgMHhmZjsKLQlTRVRfSF9DT05EIChuZXd2YWwgJiAxKTsKLQkvKiBXaGVuIHN3aXRjaGluZyBzdGFjayBtb2RlcywgdXBkYXRlIHRoZSByZWdpc3RlcnMuICAqLwotCWlmIChvbGRfc20gIT0gbmV3X3NtKQotCSAgewotCSAgICBpZiAob2xkX3NtKQotCSAgICAgIHsKLQkJLyogU3dpdGNoaW5nIHVzZXIgLT4gc3lzdGVtLiAgKi8KLQkJQ1BVIChoX2NyW0hfQ1JfU1BVXSkgPSBDUFUgKGhfZ3JbSF9HUl9TUF0pOwotCQlDUFUgKGhfZ3JbSF9HUl9TUF0pID0gQ1BVIChoX2NyW0hfQ1JfU1BJXSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBTd2l0Y2hpbmcgc3lzdGVtIC0+IHVzZXIuICAqLwotCQlDUFUgKGhfY3JbSF9DUl9TUEldKSA9IENQVSAoaF9ncltIX0dSX1NQXSk7Ci0JCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBDUFUgKGhfY3JbSF9DUl9TUFVdKTsKLQkgICAgICB9Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBIX0NSX0JCUFNXIDogLyogYmFja3VwIGJhY2t1cCBwc3cgKi8KLSAgICAgIENQVSAoaF9iYnBzdykgPSBuZXd2YWwgJiAweGZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX0NCUiA6IC8qIGNvbmRpdGlvbiBiaXQgKi8KLSAgICAgIFNFVF9IX0NPTkQgKG5ld3ZhbCAmIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX1NQSSA6IC8qIGludGVycnVwdCBzdGFjayBwb2ludGVyICovCi0gICAgICBpZiAoISBHRVRfSF9TTSAoKSkKLQlDUFUgKGhfZ3JbSF9HUl9TUF0pID0gbmV3dmFsOwotICAgICAgZWxzZQotCUNQVSAoaF9jcltIX0NSX1NQSV0pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIX0NSX1NQVSA6IC8qIHVzZXIgc3RhY2sgcG9pbnRlciAqLwotICAgICAgaWYgKEdFVF9IX1NNICgpKQotCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBuZXd2YWw7Ci0gICAgICBlbHNlCi0JQ1BVIChoX2NyW0hfQ1JfU1BVXSkgPSBuZXd2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhfQ1JfQlBDIDogLyogYmFja3VwIHBjICovCi0gICAgICBDUFUgKGhfY3JbSF9DUl9CUENdKSA9IG5ld3ZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSF9DUl9CQlBDIDogLyogYmFja3VwIGJhY2t1cCBwYyAqLwotICAgICAgQ1BVIChoX2NyW0hfQ1JfQkJQQ10pID0gbmV3dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0IDogLyogPz8/IHVuc3BlY2lmaWVkLCBidXQgYXBwYXJlbnRseSBhdmFpbGFibGUgKi8KLSAgICBjYXNlIDUgOiAvKiA/Pz8gdW5zcGVjaWZpZWQsIGJ1dCBhcHBhcmVudGx5IGF2YWlsYWJsZSAqLwotICAgICAgQ1BVIChoX2NyW2NyXSkgPSBuZXd2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIGlnbm9yZSAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDb3ZlciBmbnMgdG8gYWNjZXNzIGgtcHN3LiAgKi8KLQotVVFJCi1tMzJyeGZfaF9wc3dfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICByZXR1cm4gKENQVSAoaF9wc3cpICYgMHhmZSkgfCAoQ1BVIChoX2NvbmQpICYgMSk7Ci19Ci0KLXZvaWQKLW0zMnJ4Zl9oX3Bzd19zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCi17Ci0gIENQVSAoaF9wc3cpID0gbmV3dmFsOwotICBDUFUgKGhfY29uZCkgPSBuZXd2YWwgJiAxOwotfQotCi0vKiBDb3ZlciBmbnMgdG8gYWNjZXNzIGgtYWNjdW0uICAqLwotCi1ESQotbTMycnhmX2hfYWNjdW1fZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQotewotICAvKiBTaWduIGV4dGVuZCB0aGUgdG9wIDggYml0cy4gICovCi0gIERJIHI7Ci0gIHIgPSBBTkRESSAoQ1BVIChoX2FjY3VtKSwgTUFLRURJICgweGZmZmZmZiwgMHhmZmZmZmZmZikpOwotICByID0gWE9SREkgKHIsIE1BS0VESSAoMHg4MDAwMDAsIDApKTsKLSAgciA9IFNVQkRJIChyLCBNQUtFREkgKDB4ODAwMDAwLCAwKSk7Ci0gIHJldHVybiByOwotfQotCi12b2lkCi1tMzJyeGZfaF9hY2N1bV9zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIERJIG5ld3ZhbCkKLXsKLSAgQ1BVIChoX2FjY3VtKSA9IG5ld3ZhbDsKLX0KLQotLyogQ292ZXIgZm5zIHRvIGFjY2VzcyBoLWFjY3Vtcy4gICovCi0KLURJCi1tMzJyeGZfaF9hY2N1bXNfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQotewotICAvKiBGSVhNRTogWWVzLCB0aGlzIGlzIGp1c3QgYSBxdWljayBoYWNrLiAgKi8KLSAgREkgcjsKLSAgaWYgKHJlZ25vID09IDApCi0gICAgciA9IENQVSAoaF9hY2N1bSk7Ci0gIGVsc2UKLSAgICByID0gQ1BVIChoX2FjY3Vtc1sxXSk7Ci0gIC8qIFNpZ24gZXh0ZW5kIHRoZSB0b3AgOCBiaXRzLiAgKi8KLSAgciA9IEFORERJIChyLCBNQUtFREkgKDB4ZmZmZmZmLCAweGZmZmZmZmZmKSk7Ci0gIHIgPSBYT1JESSAociwgTUFLRURJICgweDgwMDAwMCwgMCkpOwotICByID0gU1VCREkgKHIsIE1BS0VESSAoMHg4MDAwMDAsIDApKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQKLW0zMnJ4Zl9oX2FjY3Vtc19zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIERJIG5ld3ZhbCkKLXsKLSAgLyogRklYTUU6IFllcywgdGhpcyBpcyBqdXN0IGEgcXVpY2sgaGFjay4gICovCi0gIGlmIChyZWdubyA9PSAwKQotICAgIENQVSAoaF9hY2N1bSkgPSBuZXd2YWw7Ci0gIGVsc2UKLSAgICBDUFUgKGhfYWNjdW1zWzFdKSA9IG5ld3ZhbDsKLX0KLQwKLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotCi0vKiBJbml0aWFsaXplIGN5Y2xlIGNvdW50aW5nIGZvciBhbiBpbnNuLgotICAgRklSU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsCi0gICBpbnNucy4gICovCi0KLXZvaWQKLW0zMnJ4Zl9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqY3B1LCBpbnQgZmlyc3RfcCkKLXsKLSAgbTMycmJmX21vZGVsX2luc25fYmVmb3JlIChjcHUsIGZpcnN0X3ApOwotfQotCi0vKiBSZWNvcmQgdGhlIGN5Y2xlcyBjb21wdXRlZCBmb3IgYW4gaW5zbi4KLSAgIExBU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMsCi0gICBhbmQgd2UgdXBkYXRlIHRoZSB0b3RhbCBjeWNsZSBjb3VudC4KLSAgIENZQ0xFUyBpcyB0aGUgY3ljbGUgY291bnQgb2YgdGhlIGluc24uICAqLwotCi12b2lkCi1tMzJyeGZfbW9kZWxfaW5zbl9hZnRlciAoU0lNX0NQVSAqY3B1LCBpbnQgbGFzdF9wLCBpbnQgY3ljbGVzKQotewotICBtMzJyYmZfbW9kZWxfaW5zbl9hZnRlciAoY3B1LCBsYXN0X3AsIGN5Y2xlcyk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotY2hlY2tfbG9hZF9zdGFsbCAoU0lNX0NQVSAqY3B1LCBpbnQgcmVnbm8pCi17Ci0gIFVJTlQgaF9nciA9IENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+bG9hZF9yZWdzOwotCi0gIGlmIChyZWdubyAhPSAtMQotICAgICAgJiYgKGhfZ3IgJiAoMSA8PCByZWdubykpICE9IDApCi0gICAgewotICAgICAgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5sb2FkX3N0YWxsICs9IDI7Ci0gICAgICBpZiAoVFJBQ0VfSU5TTl9QIChjcHUpKQotCWNnZW5fdHJhY2VfcHJpbnRmIChjcHUsICIgOyBMb2FkIHN0YWxsIG9mIDIgY3ljbGVzLiIpOwotICAgIH0KLX0KLQotaW50Ci1tMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICBJTlQgc3IsIElOVCBzcjIsIElOVCBkcikKLXsKLSAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcik7Ci0gIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3IyKTsKLSAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOwotfQotCi1pbnQKLW0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHNyYzEsIElOVCBzcmMyKQotewotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzEpOwotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyYzIpOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycnhmX21vZGVsX20zMnJ4X3VfbWFjIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKLQkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICBJTlQgc3JjMSwgSU5UIHNyYzIpCi17Ci0gIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMSk7Ci0gIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMik7Ci0gIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKLX0KLQotaW50Ci1tMzJyeGZfbW9kZWxfbTMycnhfdV9jdGkgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAotCQkJICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICBJTlQgc3IpCi17Ci0gIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7Ci0gIGludCB0YWtlbl9wID0gKHJlZmVyZW5jZWQgJiAoMSA8PCAxKSkgIT0gMDsKLQotICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyKTsKLSAgaWYgKHRha2VuX3ApCi0gICAgewotICAgICAgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5jdGlfc3RhbGwgKz0gMjsKLSAgICAgIFBST0ZJTEVfTU9ERUxfVEFLRU5fQ09VTlQgKHByb2ZpbGUpICs9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgUFJPRklMRV9NT0RFTF9VTlRBS0VOX0NPVU5UIChwcm9maWxlKSArPSAxOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCi0JCQkgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAotCQkJICAgSU5UIHNyLCBJTlQgZHIpCi17Ci0gIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+bG9hZF9yZWdzX3BlbmRpbmcgfD0gKDEgPDwgZHIpOwotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLWludAotbTMycnhmX21vZGVsX20zMnJ4X3Vfc3RvcmUgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAotCQkJICAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCi0JCQkgICAgSU5UIHNyYzEsIElOVCBzcmMyKQotewotICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Ci19Ci0KLSNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvbWxvb3AuaW4gYi9zaW0vbTMyci9tbG9vcC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlMTZiYi4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci9tbG9vcC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0jIFNpbXVsYXRvciBtYWluIGxvb3AgZm9yIG0zMnIuIC0qLSBDIC0qLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSMgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBTeW50YXg6Ci0jIC9iaW4vc2ggbWFpbmxvb3AuaW4gY29tbWFuZAotIwotIyBDb21tYW5kIGlzIG9uZSBvZjoKLSMKLSMgaW5pdAotIyBzdXBwb3J0Ci0jIGV4dHJhY3Qte3NpbXBsZSxzY2FjaGUscGJifQotIyB7ZnVsbCxmYXN0fS1leGVjLXtzaW1wbGUsc2NhY2hlLHBiYn0KLSMKLSMgQSB0YXJnZXQgbmVlZCBvbmx5IHByb3ZpZGUgYSAiZnVsbCIgdmVyc2lvbiBvZiBvbmUgb2Ygc2ltcGxlLHNjYWNoZSxwYmIuCi0jIElmIHRoZSB0YXJnZXQgd2FudHMgaXQgY2FuIGFsc28gcHJvdmlkZSBhIGZhc3QgdmVyc2lvbiBvZiBzYW1lLCBvciBpZgotIyB0aGUgc2xvdyAoZnVsbCBmZWF0dXJlZCkgdmVyc2lvbiBpcyBgc2ltcGxlJywgdGhlbiB0aGUgZmFzdCB2ZXJzaW9uIGNhbiBiZQotIyBvbmUgb2Ygc2NhY2hlL3BiYi4KLSMgQSB0YXJnZXQgY2FuJ3QgcHJvdmlkZSBtb3JlIHRoYW4gdGhpcy4KLSMgSG93ZXZlciBmb3IgaWxsdXN0cmF0aW9uJ3Mgc2FrZSB0aGlzIGZpbGUgcHJvdmlkZXMgZXhhbXBsZXMgb2YgYWxsLgotCi0jID8/PyBBZnRlciBhIGZldyBtb3JlIHBvcnRzIGFyZSBkb25lLCByZXZpc2l0LgotIyBXaWxsIGV2ZW50dWFsbHkgbmVlZCB0byBtYWNoaW5lIGdlbmVyYXRlIGEgbG90IG9mIHRoaXMuCi0KLWNhc2UgIngkMSIgaW4KLQoteHN1cHBvcnQpCi0KLWNhdCA8PEVPRgotCi1zdGF0aWMgSU5MSU5FIGNvbnN0IElERVNDICoKLWV4dHJhY3QxNiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLAotCSAgIEFSR0JVRiAqYWJ1ZiwgaW50IGZhc3RfcCkKLXsKLSAgY29uc3QgSURFU0MgKmlkID0gQGNwdUBfZGVjb2RlIChjdXJyZW50X2NwdSwgcGMsIGluc24sIGluc24sIGFidWYpOwotCi0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCBmYXN0X3ApOwotICBpZiAoISBmYXN0X3ApCi0gICAgewotICAgICAgaW50IHRyYWNlX3AgPSBQQ19JTl9UUkFDRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgaW50IHByb2ZpbGVfcCA9IFBDX0lOX1BST0ZJTEVfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKLSAgICAgIEBjcHVAX2ZpbGxfYXJnYnVmX3RwIChjdXJyZW50X2NwdSwgYWJ1ZiwgdHJhY2VfcCwgcHJvZmlsZV9wKTsKLSAgICB9Ci0gIHJldHVybiBpZDsKLX0KLQotc3RhdGljIElOTElORSBjb25zdCBJREVTQyAqCi1leHRyYWN0MzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIENHRU5fSU5TTl9JTlQgaW5zbiwKLQkgICBBUkdCVUYgKmFidWYsIGludCBmYXN0X3ApCi17Ci0gIGNvbnN0IElERVNDICppZCA9IEBjcHVAX2RlY29kZSAoY3VycmVudF9jcHUsIHBjLCAoVVNJKSBpbnNuID4+IDE2LCBpbnNuLCBhYnVmKTsKLQotICBAY3B1QF9maWxsX2FyZ2J1ZiAoY3VycmVudF9jcHUsIGFidWYsIGlkLCBwYywgZmFzdF9wKTsKLSAgaWYgKCEgZmFzdF9wKQotICAgIHsKLSAgICAgIGludCB0cmFjZV9wID0gUENfSU5fVFJBQ0VfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKLSAgICAgIGludCBwcm9maWxlX3AgPSBQQ19JTl9QUk9GSUxFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBAY3B1QF9maWxsX2FyZ2J1Zl90cCAoY3VycmVudF9jcHUsIGFidWYsIHRyYWNlX3AsIHByb2ZpbGVfcCk7Ci0gICAgfQotICByZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgU0VNX1BDCi1leGVjdXRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYywgaW50IGZhc3RfcCkKLXsKLSAgU0VNX1BDIHZwYzsKLQotICBpZiAoZmFzdF9wKQotICAgIHsKLSNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GQVNUCi0jaWYgV0lUSF9TQ0FDSEUKLSAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZmFzdCkgKGN1cnJlbnRfY3B1LCBzYyk7Ci0jZWxzZQotICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mYXN0KSAoY3VycmVudF9jcHUsICZzYy0+YXJnYnVmKTsKLSNlbmRpZgotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmIC8qIFdJVEhfU0VNX1NXSVRDSF9GQVNUICovCi0gICAgfQotICBlbHNlCi0gICAgewotI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKLSAgICAgIEFSR0JVRiAqYWJ1ZiA9ICZzYy0+YXJnYnVmOwotICAgICAgY29uc3QgSURFU0MgKmlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmlkYXRhID0gaWRlc2MtPmlkYXRhOwotI2lmIFdJVEhfU0NBQ0hFX1BCQgotICAgICAgaW50IHZpcnR1YWxfcCA9IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpZGF0YSwgQ0dFTl9JTlNOX1ZJUlRVQUwpOwotI2Vsc2UKLSAgICAgIGludCB2aXJ0dWFsX3AgPSAwOwotI2VuZGlmCi0KLSAgICAgIGlmICghIHZpcnR1YWxfcCkKLQl7Ci0JICAvKiBGSVhNRTogY2FsbCB4LWJlZm9yZSAqLwotCSAgaWYgKEFSR0JVRl9QUk9GSUxFX1AgKGFidWYpKQotCSAgICBQUk9GSUxFX0NPVU5UX0lOU04gKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyLCBpZGVzYy0+bnVtKTsKLQkgIC8qIEZJWE1FOiBMYXRlciBtYWtlIGNvdmVyIG1hY3JvczogUFJPRklMRV9JTlNOX3tJTklULEZJTkl9LiAgKi8KLQkgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KQotCSAgICAgICYmIEFSR0JVRl9QUk9GSUxFX1AgKGFidWYpKQotCSAgICBAY3B1QF9tb2RlbF9pbnNuX2JlZm9yZSAoY3VycmVudF9jcHUsIDEgLypmaXJzdF9wKi8pOwotCSAgVFJBQ0VfSU5TTl9JTklUIChjdXJyZW50X2NwdSwgYWJ1ZiwgMSk7Ci0JICBUUkFDRV9JTlNOIChjdXJyZW50X2NwdSwgaWRhdGEsCi0JCSAgICAgIChjb25zdCBzdHJ1Y3QgYXJnYnVmICopIGFidWYsIGFidWYtPmFkZHIpOwotCX0KLSNpZiBXSVRIX1NDQUNIRQotICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIHNjKTsKLSNlbHNlCi0gICAgICB2cGMgPSAoKnNjLT5hcmdidWYuc2VtYW50aWMuc2VtX2Z1bGwpIChjdXJyZW50X2NwdSwgYWJ1Zik7Ci0jZW5kaWYKLSAgICAgIGlmICghIHZpcnR1YWxfcCkKLQl7Ci0JICAvKiBGSVhNRTogY2FsbCB4LWFmdGVyICovCi0JICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkKLQkgICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKLQkgICAgewotCSAgICAgIGludCBjeWNsZXM7Ci0KLQkgICAgICBjeWNsZXMgPSAoKmlkZXNjLT50aW1pbmctPm1vZGVsX2ZuKSAoY3VycmVudF9jcHUsIHNjKTsKLQkgICAgICBAY3B1QF9tb2RlbF9pbnNuX2FmdGVyIChjdXJyZW50X2NwdSwgMSAvKmxhc3RfcCovLCBjeWNsZXMpOwotCSAgICB9Ci0JICBUUkFDRV9JTlNOX0ZJTkkgKGN1cnJlbnRfY3B1LCBhYnVmLCAxKTsKLQl9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogV0lUSF9TRU1fU1dJVENIX0ZVTEwgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHZwYzsKLX0KLQotRU9GCi0KLTs7Ci0KLXhpbml0KQotCi0jIE5vdGhpbmcgbmVlZGVkLgotCi07OwotCi14ZXh0cmFjdC1zaW1wbGUgfCB4ZXh0cmFjdC1zY2FjaGUpCi0KLWNhdCA8PEVPRgotewotICBpZiAoKHBjICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgotCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCi0JIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCi0gICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiAmIDB4N2ZmZiwgc2MsIEZBU1RfUCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgVVNJIGluc24gPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgaWYgKChTSSkgaW5zbiA8IDApCi0JewotCSAgZXh0cmFjdDMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sIHNjLCBGQVNUX1ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiA+PiAxNiwgc2MsIEZBU1RfUCk7Ci0JICBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYyArIDIsIGluc24gJiAweDdmZmYsIHNjICsgMSwgRkFTVF9QKTsKLQkgIC8qIFRoZSBtMzJyIGRvZXNuJ3Qgc3VwcG9ydCBwYXJhbGxlbCBleGVjdXRpb24uICAqLwotCSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwCi0JICAgICAgJiYgKGluc24gJiAweDdmZmYpICE9IDB4NzAwMCkgLyogcGFyYWxsZWwgbm9wcyBhcmUgb2sgKi8KLQkgICAgc2ltX2VuZ2luZV9pbGxlZ2FsX2luc24gKGN1cnJlbnRfY3B1LCBwYyk7Ci0JfQotICAgIH0KLX0KLUVPRgotCi07OwotCi14ZXh0cmFjdC1wYmIpCi0KLSMgSW5wdXRzOiAgY3VycmVudF9jcHUsIHBjLCBzYywgbWF4X2luc25zLCBGQVNUX1AKLSMgT3V0cHV0czogc2MsIHBjCi0jIHNjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCi0jIHBjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCi0jIElmIHRoZSBwYmIgaXMgdGVybWluYXRlZCBieSBhIGN0aSBpbnNuLCBTRVRfQ1RJX1ZQQyhzYykgbXVzdCBiZSBjYWxsZWQKLSMgdG8gcmVjb3JkIHRoZSB2cGMgb2YgdGhlIGN0aSBpbnNuLgotIyBTRVRfSU5TTl9DT1VOVChuKSBtdXN0IGJlIGNhbGxlZCB0byByZWNvcmQgbnVtYmVyIG9mIHJlYWwgaW5zbnMuCi0KLWNhdCA8PEVPRgotewotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGludCBpY291bnQgPSAwOwotCi0gIGlmICgocGMgJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgb25seSBvY2N1cnMgd2hlbiBzaW5nbGUgc3RlcHBpbmcuCi0JIFRoZSB0ZXN0IGlzIHVubmVjZXNzYXJ5IG90aGVyd2lzZSwgYnV0IHRoZSBjb3N0IGlzIHRlZW5zeSwKLQkgY29tcGFyZWQgd2l0aCBkZWNvZGluZy9leHRyYWN0aW9uLiAgKi8KLSAgICAgIFVISSBpbnNuID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjKTsKLSAgICAgIGlkZXNjID0gZXh0cmFjdDE2IChjdXJyZW50X2NwdSwgcGMsIGluc24gJiAweDdmZmYsICZzYy0+YXJnYnVmLCBGQVNUX1ApOwotICAgICAgKytzYzsKLSAgICAgIC0tbWF4X2luc25zOwotICAgICAgKytpY291bnQ7Ci0gICAgICBwYyArPSAyOwotICAgICAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCi0JewotCSAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0JICBnb3RvIEZpbmlzaDsKLQl9Ci0gICAgfQotCi0gIHdoaWxlIChtYXhfaW5zbnMgPiAwKQotICAgIHsKLSAgICAgIFVTSSBpbnNuID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKTsKLSAgICAgIGlmICgoU0kpIGluc24gPCAwKQotCXsKLQkgIGlkZXNjID0gZXh0cmFjdDMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sICZzYy0+YXJnYnVmLCBGQVNUX1ApOwotCSAgKytzYzsKLQkgIC0tbWF4X2luc25zOwotCSAgKytpY291bnQ7Ci0JICBwYyArPSA0OwotCSAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCi0JICAgIHsKLQkgICAgICBTRVRfQ1RJX1ZQQyAoc2MgLSAxKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZGVzYyA9IGV4dHJhY3QxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuID4+IDE2LCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKLQkgICsrc2M7Ci0JICAtLW1heF9pbnNuczsKLQkgICsraWNvdW50OwotCSAgcGMgKz0gMjsKLQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCSAgICB7Ci0JICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIFRoZSBtMzJyIGRvZXNuJ3Qgc3VwcG9ydCBwYXJhbGxlbCBleGVjdXRpb24uICAqLwotCSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogPz8/IERlZmVyIHNpZ25hbGxpbmcgdG8gZXhlY3V0aW9uLiAgKi8KLQkgICAgICBpZiAoKGluc24gJiAweDdmZmYpICE9IDB4NzAwMCkgLyogcGFyYWxsZWwgbm9wcyBhcmUgb2sgKi8KLQkJc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYyAtIDIsIDApOwotCSAgICAgIC8qIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gcHJvY2Vzc2luZyBwYXJhbGxlbCBub3BzIGluIGZhc3QgbW9kZS4KLQkJIFdlIG1pZ2h0IGFzIHdlbGwgZG8gdGhpcyB0ZXN0IHNpbmNlIHdlJ3ZlIGFscmVhZHkgdGVzdGVkCi0JCSB0aGF0IHdlIGhhdmUgYSBwYXJhbGxlbCBub3AuICAqLwotCSAgICAgIGlmICgwICYmIEZBU1RfUCkKLQkJewotCQkgIHBjICs9IDI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm9uLXBhcmFsbGVsIGNhc2UuCi0JCSBXaGlsZSB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhlcmUncyByb29tIHRvIGV4dHJhY3QgdGhlCi0JCSBpbnNuLCB3aGVuIHNpbmdsZSBzdGVwcGluZyB3ZSBjYW4ndDsgdGhlIHBiYiBtdXN0IHN0b3AKLQkJIGFmdGVyIHRoZSBmaXJzdCBpbnNuLiAgKi8KLQkgICAgICBpZiAobWF4X2luc25zID09IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JICAvKiBXZSdyZSBndWFyYW50ZWVkIHRoYXQgd2UgY2FuIGFsd2F5cyBwcm9jZXNzIDE2IGJpdCBpbnNucyBpbgotCSAgICAgcGFpcnMuICAqLwotCSAgaWRlc2MgPSBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiAmIDB4N2ZmZiwgJnNjLT5hcmdidWYsIEZBU1RfUCk7Ci0JICArK3NjOwotCSAgLS1tYXhfaW5zbnM7Ci0JICArK2ljb3VudDsKLQkgIHBjICs9IDI7Ci0JICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKLQkgICAgewotCSAgICAgIFNFVF9DVElfVlBDIChzYyAtIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotIEZpbmlzaDoKLSAgU0VUX0lOU05fQ09VTlQgKGljb3VudCk7Ci19Ci1FT0YKLQotOzsKLQoteGZ1bGwtZXhlYy0qIHwgeGZhc3QtZXhlYy0qKQotCi0jIElucHV0czogY3VycmVudF9jcHUsIHZwYywgRkFTVF9QCi0jIE91dHB1dHM6IHZwYwotIyB2cGMgaXMgdGhlIHZpcnR1YWwgcHJvZ3JhbSBjb3VudGVyLgotCi1jYXQgPDxFT0YKLSNpZiAoISBGQVNUX1AgJiYgV0lUSF9TRU1fU1dJVENIX0ZVTEwpIHx8IChGQVNUX1AgJiYgV0lUSF9TRU1fU1dJVENIX0ZBU1QpCi0jZGVmaW5lIERFRklORV9TV0lUQ0gKLSNpbmNsdWRlICJzZW0tc3dpdGNoLmMiCi0jZWxzZQotICB2cGMgPSBleGVjdXRlIChjdXJyZW50X2NwdSwgdnBjLCBGQVNUX1ApOwotI2VuZGlmCi1FT0YKLQotOzsKLQotKikKLSAgZWNobyAiSW52YWxpZCBhcmd1bWVudCB0byBtYWlubG9vcC5pbjogJDEiID4mMgotICBleGl0IDEKLSAgOzsKLQotZXNhYwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvbWxvb3B4LmluIGIvc2ltL20zMnIvbWxvb3B4LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY2M2Y3Li4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL21sb29weC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0jIFNpbXVsYXRvciBtYWluIGxvb3AgZm9yIG0zMnJ4LiAtKi0gQyAtKi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgU3ludGF4OgotIyAvYmluL3NoIG1haW5sb29wLmluIGNvbW1hbmQKLSMKLSMgQ29tbWFuZCBpcyBvbmUgb2Y6Ci0jCi0jIGluaXQKLSMgc3VwcG9ydAotIyBleHRyYWN0LXtzaW1wbGUsc2NhY2hlLHBiYn0KLSMge2Z1bGwsZmFzdH0tZXhlYy17c2ltcGxlLHNjYWNoZSxwYmJ9Ci0jCi0jIEEgdGFyZ2V0IG5lZWQgb25seSBwcm92aWRlIGEgImZ1bGwiIHZlcnNpb24gb2Ygb25lIG9mIHNpbXBsZSxzY2FjaGUscGJiLgotIyBJZiB0aGUgdGFyZ2V0IHdhbnRzIGl0IGNhbiBhbHNvIHByb3ZpZGUgYSBmYXN0IHZlcnNpb24gb2Ygc2FtZSwgb3IgaWYKLSMgdGhlIHNsb3cgKGZ1bGwgZmVhdHVyZWQpIHZlcnNpb24gaXMgYHNpbXBsZScsIHRoZW4gdGhlIGZhc3QgdmVyc2lvbiBjYW4gYmUKLSMgb25lIG9mIHNjYWNoZS9wYmIuCi0jIEEgdGFyZ2V0IGNhbid0IHByb3ZpZGUgbW9yZSB0aGFuIHRoaXMuCi0KLSMgPz8/IEFmdGVyIGEgZmV3IG1vcmUgcG9ydHMgYXJlIGRvbmUsIHJldmlzaXQuCi0jIFdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIG1hY2hpbmUgZ2VuZXJhdGUgYSBsb3Qgb2YgdGhpcy4KLQotY2FzZSAieCQxIiBpbgotCi14c3VwcG9ydCkKLQotY2F0IDw8RU9GCi0KLS8qIEVtaXQgaW5zbnMgdG8gd3JpdGUgYmFjayB0aGUgcmVzdWx0cyBvZiBpbnNucyBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLSAgIFNDIHBvaW50cyB0byBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHNjYWNoZSBlbnRyaWVzIGZvciB0aGUgd3JpdGViYWNrCi0gICBoYW5kbGVycy4KLSAgIFNDMS9JRDEgaXMgdGhlIGZpcnN0IGluc24gKGxlZnQgc2xvdCwgbG93ZXIgYWRkcmVzcykuCi0gICBTQzIvSUQyIGlzIHRoZSBzZWNvbmQgaW5zbiAocmlnaHQgc2xvdCwgaGlnaGVyIGFkZHJlc3MpLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1lbWl0X3Bhcl9maW5pc2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIFNDQUNIRSAqc2MsCi0JCSBTQ0FDSEUgKnNjMSwgY29uc3QgSURFU0MgKmlkMSwgU0NBQ0hFICpzYzIsIGNvbnN0IElERVNDICppZDIpCi17Ci0gIEFSR0JVRiAqYWJ1ZjsKLQotICBhYnVmID0gJnNjLT5hcmdidWY7Ci0gIGlkMSA9IGlkMS0+cGFyX2lkZXNjOwotICBhYnVmLT5maWVsZHMud3JpdGUuYWJ1ZiA9ICZzYzEtPmFyZ2J1ZjsKLSAgQGNwdUBfZmlsbF9hcmdidWYgKGN1cnJlbnRfY3B1LCBhYnVmLCBpZDEsIHBjLCAwKTsKLSAgLyogbm8gbmVlZCB0byBzZXQgdHJhY2VfcCxwcm9maWxlX3AgKi8KLSNpZiAwIC8qIG5vdCBjdXJyZW50bHkgbmVlZGVkIGZvciBpZDIgc2luY2UgcmVzdWx0cyB3cml0dGVuIGRpcmVjdGx5ICovCi0gIGFidWYgPSAmc2NbMV0uYXJnYnVmOwotICBpZDIgPSBpZDItPnBhcl9pZGVzYzsKLSAgYWJ1Zi0+ZmllbGRzLndyaXRlLmFidWYgPSAmc2MyLT5hcmdidWY7Ci0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQyLCBwYyArIDIsIDApOwotICAvKiBubyBuZWVkIHRvIHNldCB0cmFjZV9wLHByb2ZpbGVfcCAqLwotI2VuZGlmCi19Ci0KLXN0YXRpYyBJTkxJTkUgY29uc3QgSURFU0MgKgotZW1pdF8xNiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLAotCSBTQ0FDSEUgKnNjLCBpbnQgZmFzdF9wLCBpbnQgcGFyYWxsZWxfcCkKLXsKLSAgQVJHQlVGICphYnVmID0gJnNjLT5hcmdidWY7Ci0gIGNvbnN0IElERVNDICppZCA9IEBjcHVAX2RlY29kZSAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBpbnNuLCBhYnVmKTsKLQotICBpZiAocGFyYWxsZWxfcCkKLSAgICBpZCA9IGlkLT5wYXJfaWRlc2M7Ci0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCBmYXN0X3ApOwotICByZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgY29uc3QgSURFU0MgKgotZW1pdF9mdWxsMTYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIENHRU5fSU5TTl9JTlQgaW5zbiwgU0NBQ0hFICpzYywKLQkgICAgIGludCB0cmFjZV9wLCBpbnQgcHJvZmlsZV9wKQotewotICBjb25zdCBJREVTQyAqaWQ7Ci0KLSAgQGNwdUBfZW1pdF9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzYywgcGMsIDEpOwotICBpZCA9IGVtaXRfMTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgc2MgKyAxLCAwLCAwKTsKLSAgQGNwdUBfZW1pdF9hZnRlciAoY3VycmVudF9jcHUsIHNjICsgMiwgcGMpOwotICBzY1sxXS5hcmdidWYudHJhY2VfcCA9IHRyYWNlX3A7Ci0gIHNjWzFdLmFyZ2J1Zi5wcm9maWxlX3AgPSBwcm9maWxlX3A7Ci0gIHJldHVybiBpZDsKLX0KLQotc3RhdGljIElOTElORSBjb25zdCBJREVTQyAqCi1lbWl0X3BhcmFsbGVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBDR0VOX0lOU05fSU5UIGluc24sCi0JICAgICAgIFNDQUNIRSAqc2MsIGludCBmYXN0X3ApCi17Ci0gIGNvbnN0IElERVNDICppZCwqaWQyOwotCi0gIC8qIEVtaXQgYm90aCBpbnNucywgdGhlbiBlbWl0IGEgZmluaXNoZXItdXBwZXIuCi0gICAgIFdlIHNwZWVkIHRoaW5ncyB1cCBieSBoYW5kbGluZyB0aGUgc2Vjb25kIGluc24gc2VyaWFsbHkKLSAgICAgW25vdCBwYXJhbGxlbGx5XS4gIFRoZW4gdGhlIHdyaXRlYmFjayBvbmx5IGhhcyB0byBkZWFsCi0gICAgIHdpdGggdGhlIGZpcnN0IGluc24uICAqLwotICAvKiA/Pz8gUmV2aXNpdCB0byBoYW5kbGUgZXhjZXB0aW9ucyByaWdodC4gICovCi0KLSAgLyogRklYTUU6IE5vIG5lZWQgdG8gaGFuZGxlIHRoaXMgcGFyYWxsZWx5IGlmIHNlY29uZCBpcyBub3AuICAqLwotICBpZCA9IGVtaXRfMTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiA+PiAxNiwgc2MsIGZhc3RfcCwgMSk7Ci0KLSAgLyogTm90ZSB0aGF0IHRoaXMgY2FuIG5ldmVyIGJlIGEgY3RpLiAgTm8gY3RpJ3MgZ28gaW4gdGhlIFMgcGlwZWxpbmUuICAqLwotICBpZDIgPSBlbWl0XzE2IChjdXJyZW50X2NwdSwgcGMgKyAyLCBpbnNuICYgMHg3ZmZmLCBzYyArIDEsIGZhc3RfcCwgMCk7Ci0KLSAgLyogU2V0IHNjL3NuYyBpbnNucyBub3Rpb24gb2Ygd2hlcmUgdG8gc2tpcCB0by4gICovCi0gIGlmIChJREVTQ19TS0lQX1AgKGlkKSkKLSAgICBTRU1fU0tJUF9DT01QSUxFIChjdXJyZW50X2NwdSwgc2MsIDEpOwotCi0gIC8qIEVtaXQgY29kZSB0byBmaW5pc2ggZXhlY3V0aW5nIHRoZSBzZW1hbnRpY3MKLSAgICAgKHdyaXRlIGJhY2sgdGhlIHJlc3VsdHMpLiAgKi8KLSAgZW1pdF9wYXJfZmluaXNoIChjdXJyZW50X2NwdSwgcGMsIHNjICsgMiwgc2MsIGlkLCBzYyArIDEsIGlkMik7Ci0KLSAgcmV0dXJuIGlkOwotfQotCi1zdGF0aWMgSU5MSU5FIGNvbnN0IElERVNDICoKLWVtaXRfZnVsbF9wYXJhbGxlbCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLAotCQkgICAgU0NBQ0hFICpzYywgaW50IHRyYWNlX3AsIGludCBwcm9maWxlX3ApCi17Ci0gIGNvbnN0IElERVNDICppZCwqaWQyOwotCi0gIC8qIEVtaXQgYm90aCBpbnNucywgdGhlbiBlbWl0IGEgZmluaXNoZXItdXBwZXIuCi0gICAgIFdlIHNwZWVkIHRoaW5ncyB1cCBieSBoYW5kbGluZyB0aGUgc2Vjb25kIGluc24gc2VyaWFsbHkKLSAgICAgW25vdCBwYXJhbGxlbGx5XS4gIFRoZW4gdGhlIHdyaXRlYmFjayBvbmx5IGhhcyB0byBkZWFsCi0gICAgIHdpdGggdGhlIGZpcnN0IGluc24uICAqLwotICAvKiA/Pz8gUmV2aXNpdCB0byBoYW5kbGUgZXhjZXB0aW9ucyByaWdodC4gICovCi0KLSAgQGNwdUBfZW1pdF9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzYywgcGMsIDEpOwotCi0gIC8qIEZJWE1FOiBObyBuZWVkIHRvIGhhbmRsZSB0aGlzIHBhcmFsbGVsbHkgaWYgc2Vjb25kIGlzIG5vcC4gICovCi0gIGlkID0gZW1pdF8xNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuID4+IDE2LCBzYyArIDEsIDAsIDEpOwotICBzY1sxXS5hcmdidWYudHJhY2VfcCA9IHRyYWNlX3A7Ci0gIHNjWzFdLmFyZ2J1Zi5wcm9maWxlX3AgPSBwcm9maWxlX3A7Ci0KLSAgQGNwdUBfZW1pdF9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzYyArIDIsIHBjLCAwKTsKLQotICAvKiBOb3RlIHRoYXQgdGhpcyBjYW4gbmV2ZXIgYmUgYSBjdGkuICBObyBjdGkncyBnbyBpbiB0aGUgUyBwaXBlbGluZS4gICovCi0gIGlkMiA9IGVtaXRfMTYgKGN1cnJlbnRfY3B1LCBwYyArIDIsIGluc24gJiAweDdmZmYsIHNjICsgMywgMCwgMCk7Ci0gIHNjWzNdLmFyZ2J1Zi50cmFjZV9wID0gdHJhY2VfcDsKLSAgc2NbM10uYXJnYnVmLnByb2ZpbGVfcCA9IHByb2ZpbGVfcDsKLQotICAvKiBTZXQgc2Mvc25jIGluc25zIG5vdGlvbiBvZiB3aGVyZSB0byBza2lwIHRvLiAgKi8KLSAgaWYgKElERVNDX1NLSVBfUCAoaWQpKQotICAgIFNFTV9TS0lQX0NPTVBJTEUgKGN1cnJlbnRfY3B1LCBzYywgNCk7Ci0KLSAgLyogRW1pdCBjb2RlIHRvIGZpbmlzaCBleGVjdXRpbmcgdGhlIHNlbWFudGljcwotICAgICAod3JpdGUgYmFjayB0aGUgcmVzdWx0cykuICAqLwotICBlbWl0X3Bhcl9maW5pc2ggKGN1cnJlbnRfY3B1LCBwYywgc2MgKyA0LCBzYyArIDEsIGlkLCBzYyArIDMsIGlkMik7Ci0KLSAgQGNwdUBfZW1pdF9hZnRlciAoY3VycmVudF9jcHUsIHNjICsgNSwgcGMpOwotCi0gIHJldHVybiBpZDsKLX0KLQotc3RhdGljIElOTElORSBjb25zdCBJREVTQyAqCi1lbWl0XzMyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBDR0VOX0lOU05fSU5UIGluc24sCi0JIFNDQUNIRSAqc2MsIGludCBmYXN0X3ApCi17Ci0gIEFSR0JVRiAqYWJ1ZiA9ICZzYy0+YXJnYnVmOwotICBjb25zdCBJREVTQyAqaWQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywKLQkJCQkgIChVU0kpIGluc24gPj4gMTYsIGluc24sIGFidWYpOwotCi0gIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCBmYXN0X3ApOwotICByZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgY29uc3QgSURFU0MgKgotZW1pdF9mdWxsMzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIENHRU5fSU5TTl9JTlQgaW5zbiwgU0NBQ0hFICpzYywKLQkgICAgIGludCB0cmFjZV9wLCBpbnQgcHJvZmlsZV9wKQotewotICBjb25zdCBJREVTQyAqaWQ7Ci0KLSAgQGNwdUBfZW1pdF9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzYywgcGMsIDEpOwotICBpZCA9IGVtaXRfMzIgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgc2MgKyAxLCAwKTsKLSAgQGNwdUBfZW1pdF9hZnRlciAoY3VycmVudF9jcHUsIHNjICsgMiwgcGMpOwotICBzY1sxXS5hcmdidWYudHJhY2VfcCA9IHRyYWNlX3A7Ci0gIHNjWzFdLmFyZ2J1Zi5wcm9maWxlX3AgPSBwcm9maWxlX3A7Ci0gIHJldHVybiBpZDsKLX0KLQotRU9GCi0KLTs7Ci0KLXhpbml0KQotCi0jIE5vdGhpbmcgbmVlZGVkLgotCi07OwotCi14ZXh0cmFjdC1wYmIpCi0KLSMgSW5wdXRzOiAgY3VycmVudF9jcHUsIHBjLCBzYywgbWF4X2luc25zLCBGQVNUX1AKLSMgT3V0cHV0czogc2MsIHBjCi0jIHNjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCi0jIHBjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCi0jIElmIHRoZSBwYmIgaXMgdGVybWluYXRlZCBieSBhIGN0aSBpbnNuLCBTRVRfQ1RJX1ZQQyhzYykgbXVzdCBiZSBjYWxsZWQKLSMgdG8gcmVjb3JkIHRoZSB2cGMgb2YgdGhlIGN0aSBpbnNuLgotIyBTRVRfSU5TTl9DT1VOVChuKSBtdXN0IGJlIGNhbGxlZCB0byByZWNvcmQgbnVtYmVyIG9mIHJlYWwgaW5zbnMuCi0KLWNhdCA8PEVPRgotewotICBjb25zdCBJREVTQyAqaWRlc2M7Ci0gIGludCBpY291bnQgPSAwOwotCi0gIGlmICgocGMgJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nIGFuZCB3aGVuIGNvbXBpbGluZyB0aGUgbm90LXRha2VuCi0JIHBhcnQgb2YgY29uZGl0aW9uYWwgYnJhbmNoZXMuICAqLwotICAgICAgVUhJIGluc24gPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgaW50IHRyYWNlX3AgPSBQQ19JTl9UUkFDRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOwotICAgICAgaW50IHByb2ZpbGVfcCA9IFBDX0lOX1BST0ZJTEVfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKLSAgICAgIFNDQUNIRSAqY3RpX3NjOyAvKiA/Pz8gdG1wIGhhY2sgKi8KLQotICAgICAgLyogQSBwYXJhbGxlbCBpbnNuIGlzbid0IGFsbG93ZWQgaGVyZSwgYnV0IHdlIGRvbid0IG1pbmQgbm9wcy4KLQkgPz8/IFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgaW5zbiBpcyBleGVjdXRlZCBiZWZvcmUgc2lnbmFsbGluZwotCSB0aGUgZXJyb3IsIGZvciBzaXR1YXRpb25zIHdoZXJlIHN1Y2ggc2lnbmFsbGluZyBpcyB3YW50ZWQuICAqLwotI2lmIDAKLSAgICAgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMAotCSAgJiYgKGluc24gJiAweDdmZmYpICE9IDB4NzAwMCkgLyogcGFyYWxsZWwgbm9wcyBhcmUgb2sgKi8KLQlzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjLCAwKTsKLSNlbmRpZgotCi0gICAgICAvKiBPbmx5IGVtaXQgYmVmb3JlL2FmdGVyIGhhbmRsZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoRkFTVF9QIHx8ICghIHRyYWNlX3AgJiYgISBwcm9maWxlX3ApKQotCXsKLQkgIGlkZXNjID0gZW1pdF8xNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCBzYywgRkFTVF9QLCAwKTsKLQkgIGN0aV9zYyA9IHNjOwotCSAgKytzYzsKLQkgIC0tbWF4X2luc25zOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZGVzYyA9IGVtaXRfZnVsbDE2IChjdXJyZW50X2NwdSwgcGMsIGluc24gJiAweDdmZmYsIHNjLAotCQkJICAgICAgIHRyYWNlX3AsIHByb2ZpbGVfcCk7Ci0JICBjdGlfc2MgPSBzYyArIDE7Ci0JICBzYyArPSAzOwotCSAgbWF4X2luc25zIC09IDM7Ci0JfQotICAgICAgKytpY291bnQ7Ci0gICAgICBwYyArPSAyOwotICAgICAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCi0JewotCSAgU0VUX0NUSV9WUEMgKGN0aV9zYyk7Ci0JICBnb3RvIEZpbmlzaDsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZXJlIGFyZSB0d28gY29waWVzIG9mIHRoZSBjb21waWxlcjogZnVsbCghZmFzdCkgYW5kIGZhc3QuCi0gICAgIFRoZSAiZnVsbCIgY2FzZSBlbWl0cyBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgZm9yIGVhY2ggaW5zbi4KLSAgICAgSGF2aW5nIHR3byBjb3BpZXMgb2YgdGhpcyBjb2RlIGlzIGEgdHJhZGVvZmYsIGhhdmluZyBvbmUgY29weQotICAgICBzZWVtZWQgYSBiaXQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZCAoZHVlIHRvIGNvbnN0YW50bHkgdGVzdGluZwotICAgICBGQVNUX1ApLiAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCB3aXRoIGFkZHJlc3MgcmFuZ2VzIHdlJ2xsIHdhbnQgdG8KLSAgICAgb21pdCBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgZm9yIHVud2FudGVkIGluc25zLiAgSGF2aW5nIHNlcGFyYXRlIGxvb3BzCi0gICAgIGZvciBGQVNULyFGQVNUIGF2b2lkcyBjb25zdGFudGx5IGRvaW5nIHRoZSB0ZXN0IGluIHRoZSBsb29wLCBidXQKLSAgICAgdHlwaWNhbGx5IEZBU1RfUCBpcyBhIGNvbnN0YW50IGFuZCBzdWNoIHRlc3RzIHdpbGwgZ2V0IG9wdGltaXplZCBvdXQuICAqLwotCi0gIGlmIChGQVNUX1ApCi0gICAgewotICAgICAgd2hpbGUgKG1heF9pbnNucyA+IDApCi0JewotCSAgVVNJIGluc24gPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMpOwotCSAgaWYgKChTSSkgaW5zbiA8IDApCi0JICAgIHsKLQkgICAgICAvKiAzMiBiaXQgaW5zbiAqLwotCSAgICAgIGlkZXNjID0gZW1pdF8zMiAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywgMSk7Ci0JICAgICAgKytzYzsKLQkgICAgICAtLW1heF9pbnNuczsKLQkgICAgICArK2ljb3VudDsKLQkgICAgICBwYyArPSA0OwotCSAgICAgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCQl7Ci0JCSAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKSAvKiBwYXJhbGxlbD8gKi8KLQkJewotCQkgIC8qIFllcC4gIEhlcmUncyB0aGUgImludGVyZXN0aW5nIiBbc2ljXSBwYXJ0LiAgKi8KLQkJICBpZGVzYyA9IGVtaXRfcGFyYWxsZWwgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgc2MsIDEpOwotCQkgIHNjICs9IDM7Ci0JCSAgbWF4X2luc25zIC09IDM7Ci0JCSAgaWNvdW50ICs9IDI7Ci0JCSAgcGMgKz0gNDsKLQkJICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKLQkJICAgIHsKLQkJICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSAvKiAyIHNlcmlhbCAxNiBiaXQgaW5zbnMgKi8KLQkJewotCQkgIGlkZXNjID0gZW1pdF8xNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuID4+IDE2LCBzYywgMSwgMCk7Ci0JCSAgKytzYzsKLQkJICAtLW1heF9pbnNuczsKLQkJICArK2ljb3VudDsKLQkJICBwYyArPSAyOwotCQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCQkgICAgewotCQkgICAgICBTRVRfQ1RJX1ZQQyAoc2MgLSAxKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogV2hpbGUgd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlJ3Mgcm9vbSB0byBleHRyYWN0IHRoZQotCQkgICAgIGluc24sIHdoZW4gc2luZ2xlIHN0ZXBwaW5nIHdlIGNhbid0OyB0aGUgcGJiIG11c3Qgc3RvcAotCQkgICAgIGFmdGVyIHRoZSBmaXJzdCBpbnNuLiAgKi8KLQkJICBpZiAobWF4X2luc25zID09IDApCi0JCSAgICBicmVhazsKLQkJICBpZGVzYyA9IGVtaXRfMTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiAmIDB4N2ZmZiwgc2MsIDEsIDApOwotCQkgICsrc2M7Ci0JCSAgLS1tYXhfaW5zbnM7Ci0JCSAgKytpY291bnQ7Ci0JCSAgcGMgKz0gMjsKLQkJICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKLQkJICAgIHsKLQkJICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIC8qICEgRkFTVF9QICovCi0gICAgewotICAgICAgd2hpbGUgKG1heF9pbnNucyA+IDApCi0JewotCSAgVVNJIGluc24gPSBHRVRJTUVNVVNJIChjdXJyZW50X2NwdSwgcGMpOwotCSAgaW50IHRyYWNlX3AgPSBQQ19JTl9UUkFDRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOwotCSAgaW50IHByb2ZpbGVfcCA9IFBDX0lOX1BST0ZJTEVfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKLQkgIFNDQUNIRSAqY3RpX3NjOyAvKiA/Pz8gdG1wIGhhY2sgKi8KLQkgIGlmICgoU0kpIGluc24gPCAwKQotCSAgICB7Ci0JICAgICAgLyogMzIgYml0IGluc24KLQkJIE9ubHkgZW1pdCBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLQkgICAgICBpZiAodHJhY2VfcCB8fCBwcm9maWxlX3ApCi0JCXsKLQkJICBpZGVzYyA9IGVtaXRfZnVsbDMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sIHNjLAotCQkJCSAgICAgICB0cmFjZV9wLCBwcm9maWxlX3ApOwotCQkgIGN0aV9zYyA9IHNjICsgMTsKLQkJICBzYyArPSAzOwotCQkgIG1heF9pbnNucyAtPSAzOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWRlc2MgPSBlbWl0XzMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sIHNjLCAwKTsKLQkJICBjdGlfc2MgPSBzYzsKLQkJICArK3NjOwotCQkgIC0tbWF4X2luc25zOwotCQl9Ci0JICAgICAgKytpY291bnQ7Ci0JICAgICAgcGMgKz0gNDsKLQkgICAgICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKLQkJewotCQkgIFNFVF9DVElfVlBDIChjdGlfc2MpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkgLyogcGFyYWxsZWw/ICovCi0JCXsKLQkJICAvKiBZZXAuICBIZXJlJ3MgdGhlICJpbnRlcmVzdGluZyIgW3NpY10gcGFydC4KLQkJICAgICBPbmx5IGVtaXQgYmVmb3JlL2FmdGVyIGhhbmRsZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0JCSAgaWYgKHRyYWNlX3AgfHwgcHJvZmlsZV9wKQotCQkgICAgewotCQkgICAgICBpZGVzYyA9IGVtaXRfZnVsbF9wYXJhbGxlbCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywKLQkJCQkJCSAgdHJhY2VfcCwgcHJvZmlsZV9wKTsKLQkJICAgICAgY3RpX3NjID0gc2MgKyAxOwotCQkgICAgICBzYyArPSA2OwotCQkgICAgICBtYXhfaW5zbnMgLT0gNjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlkZXNjID0gZW1pdF9wYXJhbGxlbCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywgMCk7Ci0JCSAgICAgIGN0aV9zYyA9IHNjOwotCQkgICAgICBzYyArPSAzOwotCQkgICAgICBtYXhfaW5zbnMgLT0gMzsKLQkJICAgIH0KLQkJICBpY291bnQgKz0gMjsKLQkJICBwYyArPSA0OwotCQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCQkgICAgewotCQkgICAgICBTRVRfQ1RJX1ZQQyAoY3RpX3NjKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIC8qIDIgc2VyaWFsIDE2IGJpdCBpbnNucyAqLwotCQl7Ci0JCSAgLyogT25seSBlbWl0IGJlZm9yZS9hZnRlciBoYW5kbGVycyBpZiBuZWNlc3NhcnkuICAqLwotCQkgIGlmICh0cmFjZV9wIHx8IHByb2ZpbGVfcCkKLQkJICAgIHsKLQkJICAgICAgaWRlc2MgPSBlbWl0X2Z1bGwxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuID4+IDE2LCBzYywKLQkJCQkJICAgdHJhY2VfcCwgcHJvZmlsZV9wKTsKLQkJICAgICAgY3RpX3NjID0gc2MgKyAxOwotCQkgICAgICBzYyArPSAzOwotCQkgICAgICBtYXhfaW5zbnMgLT0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlkZXNjID0gZW1pdF8xNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuID4+IDE2LCBzYywgMCwgMCk7Ci0JCSAgICAgIGN0aV9zYyA9IHNjOwotCQkgICAgICArK3NjOwotCQkgICAgICAtLW1heF9pbnNuczsKLQkJICAgIH0KLQkJICArK2ljb3VudDsKLQkJICBwYyArPSAyOwotCQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCQkgICAgewotCQkgICAgICBTRVRfQ1RJX1ZQQyAoY3RpX3NjKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogV2hpbGUgd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlJ3Mgcm9vbSB0byBleHRyYWN0IHRoZQotCQkgICAgIGluc24sIHdoZW4gc2luZ2xlIHN0ZXBwaW5nIHdlIGNhbid0OyB0aGUgcGJiIG11c3Qgc3RvcAotCQkgICAgIGFmdGVyIHRoZSBmaXJzdCBpbnNuLiAgKi8KLQkJICBpZiAobWF4X2luc25zIDw9IDApCi0JCSAgICBicmVhazsKLQkJICAvKiBVc2UgdGhlIHNhbWUgdHJhY2UvcHJvZmlsZSBhZGRyZXNzIGZvciB0aGUgMm5kIGluc24uCi0JCSAgICAgU2F2ZXMgdXMgaGF2aW5nIHRvIGNvbXB1dGUgaXQgYW5kIHRoZXkgY29tZSBpbiBwYWlycwotCQkgICAgIGFueXdheSAoZS5nLiBjYW4gbmV2ZXIgYnJhbmNoIHRvIHRoZSAybmQgaW5zbikuICAqLwotCQkgIGlmICh0cmFjZV9wIHx8IHByb2ZpbGVfcCkKLQkJICAgIHsKLQkJICAgICAgaWRlc2MgPSBlbWl0X2Z1bGwxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCBzYywKLQkJCQkJICAgdHJhY2VfcCwgcHJvZmlsZV9wKTsKLQkJICAgICAgY3RpX3NjID0gc2MgKyAxOwotCQkgICAgICBzYyArPSAzOwotCQkgICAgICBtYXhfaW5zbnMgLT0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlkZXNjID0gZW1pdF8xNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCBzYywgMCwgMCk7Ci0JCSAgICAgIGN0aV9zYyA9IHNjOwotCQkgICAgICArK3NjOwotCQkgICAgICAtLW1heF9pbnNuczsKLQkJICAgIH0KLQkJICArK2ljb3VudDsKLQkJICBwYyArPSAyOwotCQkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQotCQkgICAgewotCQkgICAgICBTRVRfQ1RJX1ZQQyAoY3RpX3NjKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSBGaW5pc2g6Ci0gIFNFVF9JTlNOX0NPVU5UIChpY291bnQpOwotfQotRU9GCi0KLTs7Ci0KLXhmdWxsLWV4ZWMtcGJiKQotCi0jIElucHV0czogY3VycmVudF9jcHUsIHZwYywgRkFTVF9QCi0jIE91dHB1dHM6IHZwYwotIyB2cGMgaXMgdGhlIHZpcnR1YWwgcHJvZ3JhbSBjb3VudGVyLgotCi1jYXQgPDxFT0YKLSNkZWZpbmUgREVGSU5FX1NXSVRDSAotI2luY2x1ZGUgInNlbXgtc3dpdGNoLmMiCi1FT0YKLQotOzsKLQotKikKLSAgZWNobyAiSW52YWxpZCBhcmd1bWVudCB0byBtYWlubG9vcC5pbjogJDEiID4mMgotICBleGl0IDEKLSAgOzsKLQotZXNhYwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvbW9kZWwuYyBiL3NpbS9tMzJyL21vZGVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Y2EzY2QuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvbW9kZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNjggKzAsMCBAQAotLyogU2ltdWxhdG9yIG1vZGVsIHN1cHBvcnQgZm9yIG0zMnJiZi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBtMzJyYmYKLSNkZWZpbmUgV0FOVF9DUFVfTTMyUkJGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotCi0vKiBUaGUgcHJvZmlsaW5nIGRhdGEgaXMgcmVjb3JkZWQgaGVyZSwgYnV0IGlzIGFjY2Vzc2VkIHZpYSB0aGUgcHJvZmlsaW5nCi0gICBtZWNoYW5pc20uICBBZnRlciBhbGwsIHRoaXMgaXMgaW5mb3JtYXRpb24gZm9yIHByb2ZpbGluZy4gICovCi0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotCi0vKiBNb2RlbCBoYW5kbGVycyBmb3IgZWFjaCBpbnNuLiAgKi8KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2FkZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2FkZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2FuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX29yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2Rfb3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF94b3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF94b3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9hZGRpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9hZGR2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfYWRkdjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2FkZHggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9iYzggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfYmMyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfYmVxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9iZXF6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9iZ2V6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9iZ3R6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibGV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibHR6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibmV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibDggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2JsMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibmM4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2JuYzI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2JyYTggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2JyYTI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfY21wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2NtcHUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9jbXB1aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2RpdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9kaXZ1IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3JlbSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9yZW11IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2psIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2psLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2Rfam1wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGRfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGRiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZGJfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGRoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZGhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGR1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGR1Yl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZHVoX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2xkX3BsdXMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX2RyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfc3IpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX2xkMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGQyNC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sZGk4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbGRpMTYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9sb2NrIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9tYWNoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX21hY2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbWFjd2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbWFjd2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbXVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbXVsaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9tdWxsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX211bHdoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX211bHdsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX212IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9tdmZhY2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbXZmYWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX212ZmFjbWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2V0aC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9tdmZjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2RfbXZ0YWNoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyYzEpOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX212dGFjbG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcmMxKTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9tdnRjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX25lZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2Rfbm9wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3JhYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3JhY2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9ydGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3NldGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2V0aC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zbGwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zbGwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zbGxpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmEzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmFpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zcmxpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3N0X2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAwOwotICAgIElOVCBpbl9zcmMyID0gMDsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAwOwotICAgIElOVCBpbl9zcmMyID0gMDsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdGJfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3N0aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3N0aF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2Rfc3RfcGx1cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX2RyID0gRkxEIChpbl9zcmMyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9zcmMyKTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdF9taW51cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX2RyID0gRkxEIChpbl9zcmMyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9zcmMyKTsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdWIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJfZF9zdWJ2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyX2Rfc3VieCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3RyYXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdHJhcC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycl9kX3VubG9jayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2FkZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9hZGQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9hbmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYW5kMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hbmQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfb3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfb3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF94b3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfeG9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hbmQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYWRkaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYWRkdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9hZGR2MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYWRkeCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9iYzggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYmMyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYmVxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2JlcXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYmdleiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9iZ3R6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2JsZXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYmx0eiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ibmV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2JsOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ibDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ibmM4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2JuYzI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfYnJhOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9icmEyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfY21wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9jbXBpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9jbXB1IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9jbXB1aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfZGl2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2RpdnUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfcmVtIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3JlbXUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfamwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfamwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9qbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9sZF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9sZGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xkYl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9sZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xkaF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9sZHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9sZHViX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xkdWggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xkdWhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbGRfcGx1cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbGQyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbGRpOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbGRpMTYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X2xvY2sgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X21hY2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9tYWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbWFjd2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9tYWN3bG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X211bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9tdWxoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXVsbG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X211bHdoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXVsd2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9tdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZmYWNoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZmYWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZmYWNtaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZmYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZjLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZ0YWNoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZ0YWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbXZ0YyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfbmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ub3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X25vdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3RfcmFjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9yYWNoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9ydGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3NldGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2V0aC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3NsbCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zbGwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zbGxpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zcmEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfc3JhMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfc3JhaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfc3JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3NybDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3NybGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3N0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zdF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zdGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3N0Yl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zdGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3N0aF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zdF9wbHVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF9zdF9taW51cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfc3ViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF90ZXN0X3N1YnYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX3Rlc3Rfc3VieCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF90cmFwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3RyYXAuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfdGVzdF91bmxvY2sgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi0vKiBXZSBhc3N1bWUgVU5JVF9OT05FID09IDAgYmVjYXVzZSB0aGUgdGFibGVzIGRvbid0IGFsd2F5cyB0ZXJtaW5hdGUKLSAgIGVudHJpZXMgd2l0aCBpdC4gICovCi0KLS8qIE1vZGVsIHRpbWluZyBkYXRhIGZvciBgbTMyci9kJy4gICovCi0KLXN0YXRpYyBjb25zdCBJTlNOX1RJTUlORyBtMzJyX2RfdGltaW5nW10gPSB7Ci0gIHsgTTMyUkJGX0lOU05fWF9JTlZBTElELCAwLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1hfQUZURVIsIDAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWF9CRUZPUkUsIDAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWF9DVElfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWF9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9YX0JFR0lOLCAwLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0FERCwgbW9kZWxfbTMycl9kX2FkZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9BREQzLCBtb2RlbF9tMzJyX2RfYWRkMywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9BTkQsIG1vZGVsX20zMnJfZF9hbmQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQU5EMywgbW9kZWxfbTMycl9kX2FuZDMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fT1IsIG1vZGVsX20zMnJfZF9vciwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9PUjMsIG1vZGVsX20zMnJfZF9vcjMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWE9SLCBtb2RlbF9tMzJyX2RfeG9yLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1hPUjMsIG1vZGVsX20zMnJfZF94b3IzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0FEREksIG1vZGVsX20zMnJfZF9hZGRpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0FERFYsIG1vZGVsX20zMnJfZF9hZGR2LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0FERFYzLCBtb2RlbF9tMzJyX2RfYWRkdjMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQUREWCwgbW9kZWxfbTMycl9kX2FkZHgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQkM4LCBtb2RlbF9tMzJyX2RfYmM4LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQkMyNCwgbW9kZWxfbTMycl9kX2JjMjQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CRVEsIG1vZGVsX20zMnJfZF9iZXEsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JFUVosIG1vZGVsX20zMnJfZF9iZXF6LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMCB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CR0VaLCBtb2RlbF9tMzJyX2RfYmdleiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQkdUWiwgbW9kZWxfbTMycl9kX2JndHosIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMRVosIG1vZGVsX20zMnJfZF9ibGV6LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMCB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CTFRaLCBtb2RlbF9tMzJyX2RfYmx0eiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQk5FWiwgbW9kZWxfbTMycl9kX2JuZXosIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMOCwgbW9kZWxfbTMycl9kX2JsOCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMMjQsIG1vZGVsX20zMnJfZF9ibDI0LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQk5DOCwgbW9kZWxfbTMycl9kX2JuYzgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CTkMyNCwgbW9kZWxfbTMycl9kX2JuYzI0LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQk5FLCBtb2RlbF9tMzJyX2RfYm5lLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMCB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CUkE4LCBtb2RlbF9tMzJyX2RfYnJhOCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JSQTI0LCBtb2RlbF9tMzJyX2RfYnJhMjQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9DTVAsIG1vZGVsX20zMnJfZF9jbXAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9DTVBJLCBtb2RlbF9tMzJyX2RfY21waSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0NNUFUsIG1vZGVsX20zMnJfZF9jbXB1LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQ01QVUksIG1vZGVsX20zMnJfZF9jbXB1aSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0RJViwgbW9kZWxfbTMycl9kX2RpdiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMzcgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fRElWVSwgbW9kZWxfbTMycl9kX2RpdnUsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDM3IH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1JFTSwgbW9kZWxfbTMycl9kX3JlbSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMzcgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fUkVNVSwgbW9kZWxfbTMycl9kX3JlbXUsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDM3IH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0pMLCBtb2RlbF9tMzJyX2RfamwsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9KTVAsIG1vZGVsX20zMnJfZF9qbXAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRCwgbW9kZWxfbTMycl9kX2xkLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEX0QsIG1vZGVsX20zMnJfZF9sZF9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEQiwgbW9kZWxfbTMycl9kX2xkYiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MREJfRCwgbW9kZWxfbTMycl9kX2xkYl9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xESCwgbW9kZWxfbTMycl9kX2xkaCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MREhfRCwgbW9kZWxfbTMycl9kX2xkaF9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEVUIsIG1vZGVsX20zMnJfZF9sZHViLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEVUJfRCwgbW9kZWxfbTMycl9kX2xkdWJfZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMiB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRFVILCBtb2RlbF9tMzJyX2RfbGR1aCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRFVIX0QsIG1vZGVsX20zMnJfZF9sZHVoX2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTERfUExVUywgbW9kZWxfbTMycl9kX2xkX3BsdXMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTEQyNCwgbW9kZWxfbTMycl9kX2xkMjQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTERJOCwgbW9kZWxfbTMycl9kX2xkaTgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTERJMTYsIG1vZGVsX20zMnJfZF9sZGkxNiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MT0NLLCBtb2RlbF9tMzJyX2RfbG9jaywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NQUNISSwgbW9kZWxfbTMycl9kX21hY2hpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTUFDTE8sIG1vZGVsX20zMnJfZF9tYWNsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ1dISSwgbW9kZWxfbTMycl9kX21hY3doaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ1dMTywgbW9kZWxfbTMycl9kX21hY3dsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01VTCwgbW9kZWxfbTMycl9kX211bCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgNCB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NVUxISSwgbW9kZWxfbTMycl9kX211bGhpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVVMTE8sIG1vZGVsX20zMnJfZF9tdWxsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01VTFdISSwgbW9kZWxfbTMycl9kX211bHdoaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01VTFdMTywgbW9kZWxfbTMycl9kX211bHdsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01WLCBtb2RlbF9tMzJyX2RfbXYsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQUNISSwgbW9kZWxfbTMycl9kX212ZmFjaGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQUNMTywgbW9kZWxfbTMycl9kX212ZmFjbG8sIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQUNNSSwgbW9kZWxfbTMycl9kX212ZmFjbWksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQywgbW9kZWxfbTMycl9kX212ZmMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZUQUNISSwgbW9kZWxfbTMycl9kX212dGFjaGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZUQUNMTywgbW9kZWxfbTMycl9kX212dGFjbG8sIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZUQywgbW9kZWxfbTMycl9kX212dGMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTkVHLCBtb2RlbF9tMzJyX2RfbmVnLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX05PUCwgbW9kZWxfbTMycl9kX25vcCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMCB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9OT1QsIG1vZGVsX20zMnJfZF9ub3QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fUkFDLCBtb2RlbF9tMzJyX2RfcmFjLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fUkFDSCwgbW9kZWxfbTMycl9kX3JhY2gsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9SVEUsIG1vZGVsX20zMnJfZF9ydGUsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU0VUSCwgbW9kZWxfbTMycl9kX3NldGgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU0xMLCBtb2RlbF9tMzJyX2Rfc2xsLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NMTDMsIG1vZGVsX20zMnJfZF9zbGwzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NMTEksIG1vZGVsX20zMnJfZF9zbGxpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NSQSwgbW9kZWxfbTMycl9kX3NyYSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkEzLCBtb2RlbF9tMzJyX2Rfc3JhMywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkFJLCBtb2RlbF9tMzJyX2Rfc3JhaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkwsIG1vZGVsX20zMnJfZF9zcmwsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1JMMywgbW9kZWxfbTMycl9kX3NybDMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1JMSSwgbW9kZWxfbTMycl9kX3NybGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1QsIG1vZGVsX20zMnJfZF9zdCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RfRCwgbW9kZWxfbTMycl9kX3N0X2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX1NUT1JFLCAxLCAyIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NUQiwgbW9kZWxfbTMycl9kX3N0YiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RCX0QsIG1vZGVsX20zMnJfZF9zdGJfZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RILCBtb2RlbF9tMzJyX2Rfc3RoLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TVEhfRCwgbW9kZWxfbTMycl9kX3N0aF9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMiB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TVF9QTFVTLCBtb2RlbF9tMzJyX2Rfc3RfcGx1cywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RfTUlOVVMsIG1vZGVsX20zMnJfZF9zdF9taW51cywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1VCLCBtb2RlbF9tMzJyX2Rfc3ViLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NVQlYsIG1vZGVsX20zMnJfZF9zdWJ2LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NVQlgsIG1vZGVsX20zMnJfZF9zdWJ4LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1RSQVAsIG1vZGVsX20zMnJfZF90cmFwLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1VOTE9DSywgbW9kZWxfbTMycl9kX3VubG9jaywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9IH0gfSwKLX07Ci0KLS8qIE1vZGVsIHRpbWluZyBkYXRhIGZvciBgdGVzdCcuICAqLwotCi1zdGF0aWMgY29uc3QgSU5TTl9USU1JTkcgdGVzdF90aW1pbmdbXSA9IHsKLSAgeyBNMzJSQkZfSU5TTl9YX0lOVkFMSUQsIDAsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1hfQUZURVIsIDAsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1hfQkVGT1JFLCAwLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9YX0NUSV9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWF9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fWF9CRUdJTiwgMCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQURELCBtb2RlbF90ZXN0X2FkZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQUREMywgbW9kZWxfdGVzdF9hZGQzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9BTkQsIG1vZGVsX3Rlc3RfYW5kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9BTkQzLCBtb2RlbF90ZXN0X2FuZDMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX09SLCBtb2RlbF90ZXN0X29yLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9PUjMsIG1vZGVsX3Rlc3Rfb3IzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9YT1IsIG1vZGVsX3Rlc3RfeG9yLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9YT1IzLCBtb2RlbF90ZXN0X3hvcjMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0FEREksIG1vZGVsX3Rlc3RfYWRkaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQUREViwgbW9kZWxfdGVzdF9hZGR2LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9BRERWMywgbW9kZWxfdGVzdF9hZGR2MywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQUREWCwgbW9kZWxfdGVzdF9hZGR4LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CQzgsIG1vZGVsX3Rlc3RfYmM4LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CQzI0LCBtb2RlbF90ZXN0X2JjMjQsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JFUSwgbW9kZWxfdGVzdF9iZXEsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JFUVosIG1vZGVsX3Rlc3RfYmVxeiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQkdFWiwgbW9kZWxfdGVzdF9iZ2V6LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CR1RaLCBtb2RlbF90ZXN0X2JndHosIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMRVosIG1vZGVsX3Rlc3RfYmxleiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQkxUWiwgbW9kZWxfdGVzdF9ibHR6LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CTkVaLCBtb2RlbF90ZXN0X2JuZXosIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMOCwgbW9kZWxfdGVzdF9ibDgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0JMMjQsIG1vZGVsX3Rlc3RfYmwyNCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQk5DOCwgbW9kZWxfdGVzdF9ibmM4LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CTkMyNCwgbW9kZWxfdGVzdF9ibmMyNCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQk5FLCBtb2RlbF90ZXN0X2JuZSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQlJBOCwgbW9kZWxfdGVzdF9icmE4LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9CUkEyNCwgbW9kZWxfdGVzdF9icmEyNCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQ01QLCBtb2RlbF90ZXN0X2NtcCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fQ01QSSwgbW9kZWxfdGVzdF9jbXBpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9DTVBVLCBtb2RlbF90ZXN0X2NtcHUsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0NNUFVJLCBtb2RlbF90ZXN0X2NtcHVpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9ESVYsIG1vZGVsX3Rlc3RfZGl2LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9ESVZVLCBtb2RlbF90ZXN0X2RpdnUsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1JFTSwgbW9kZWxfdGVzdF9yZW0sIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1JFTVUsIG1vZGVsX3Rlc3RfcmVtdSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fSkwsIG1vZGVsX3Rlc3RfamwsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0pNUCwgbW9kZWxfdGVzdF9qbXAsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xELCBtb2RlbF90ZXN0X2xkLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRF9ELCBtb2RlbF90ZXN0X2xkX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEQiwgbW9kZWxfdGVzdF9sZGIsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEQl9ELCBtb2RlbF90ZXN0X2xkYl9kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MREgsIG1vZGVsX3Rlc3RfbGRoLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MREhfRCwgbW9kZWxfdGVzdF9sZGhfZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTERVQiwgbW9kZWxfdGVzdF9sZHViLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRFVCX0QsIG1vZGVsX3Rlc3RfbGR1Yl9kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MRFVILCBtb2RlbF90ZXN0X2xkdWgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEVUhfRCwgbW9kZWxfdGVzdF9sZHVoX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xEX1BMVVMsIG1vZGVsX3Rlc3RfbGRfcGx1cywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTEQyNCwgbW9kZWxfdGVzdF9sZDI0LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MREk4LCBtb2RlbF90ZXN0X2xkaTgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX0xESTE2LCBtb2RlbF90ZXN0X2xkaTE2LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9MT0NLLCBtb2RlbF90ZXN0X2xvY2ssIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ0hJLCBtb2RlbF90ZXN0X21hY2hpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NQUNMTywgbW9kZWxfdGVzdF9tYWNsbywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTUFDV0hJLCBtb2RlbF90ZXN0X21hY3doaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTUFDV0xPLCBtb2RlbF90ZXN0X21hY3dsbywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVVMLCBtb2RlbF90ZXN0X211bCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVVMSEksIG1vZGVsX3Rlc3RfbXVsaGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01VTExPLCBtb2RlbF90ZXN0X211bGxvLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NVUxXSEksIG1vZGVsX3Rlc3RfbXVsd2hpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NVUxXTE8sIG1vZGVsX3Rlc3RfbXVsd2xvLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NViwgbW9kZWxfdGVzdF9tdiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQUNISSwgbW9kZWxfdGVzdF9tdmZhY2hpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NVkZBQ0xPLCBtb2RlbF90ZXN0X212ZmFjbG8sIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01WRkFDTUksIG1vZGVsX3Rlc3RfbXZmYWNtaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQywgbW9kZWxfdGVzdF9tdmZjLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9NVlRBQ0hJLCBtb2RlbF90ZXN0X212dGFjaGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX01WVEFDTE8sIG1vZGVsX3Rlc3RfbXZ0YWNsbywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fTVZUQywgbW9kZWxfdGVzdF9tdnRjLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9ORUcsIG1vZGVsX3Rlc3RfbmVnLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9OT1AsIG1vZGVsX3Rlc3Rfbm9wLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9OT1QsIG1vZGVsX3Rlc3Rfbm90LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9SQUMsIG1vZGVsX3Rlc3RfcmFjLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9SQUNILCBtb2RlbF90ZXN0X3JhY2gsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1JURSwgbW9kZWxfdGVzdF9ydGUsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NFVEgsIG1vZGVsX3Rlc3Rfc2V0aCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU0xMLCBtb2RlbF90ZXN0X3NsbCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU0xMMywgbW9kZWxfdGVzdF9zbGwzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TTExJLCBtb2RlbF90ZXN0X3NsbGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NSQSwgbW9kZWxfdGVzdF9zcmEsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NSQTMsIG1vZGVsX3Rlc3Rfc3JhMywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1JBSSwgbW9kZWxfdGVzdF9zcmFpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkwsIG1vZGVsX3Rlc3Rfc3JsLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkwzLCBtb2RlbF90ZXN0X3NybDMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NSTEksIG1vZGVsX3Rlc3Rfc3JsaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1QsIG1vZGVsX3Rlc3Rfc3QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NUX0QsIG1vZGVsX3Rlc3Rfc3RfZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RCLCBtb2RlbF90ZXN0X3N0YiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fU1RCX0QsIG1vZGVsX3Rlc3Rfc3RiX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NUSCwgbW9kZWxfdGVzdF9zdGgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NUSF9ELCBtb2RlbF90ZXN0X3N0aF9kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TVF9QTFVTLCBtb2RlbF90ZXN0X3N0X3BsdXMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NUX01JTlVTLCBtb2RlbF90ZXN0X3N0X21pbnVzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TVUIsIG1vZGVsX3Rlc3Rfc3ViLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9TVUJWLCBtb2RlbF90ZXN0X3N1YnYsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJCRl9JTlNOX1NVQlgsIG1vZGVsX3Rlc3Rfc3VieCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUkJGX0lOU05fVFJBUCwgbW9kZWxfdGVzdF90cmFwLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSQkZfSU5TTl9VTkxPQ0ssIG1vZGVsX3Rlc3RfdW5sb2NrLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKLX07Ci0KLSNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9kX21vZGVsX2luaXQgKFNJTV9DUFUgKmNwdSkKLXsKLSAgQ1BVX01PREVMX0RBVEEgKGNwdSkgPSAodm9pZCAqKSB6YWxsb2MgKHNpemVvZiAoTU9ERUxfTTMyUl9EX0RBVEEpKTsKLX0KLQotc3RhdGljIHZvaWQKLXRlc3RfbW9kZWxfaW5pdCAoU0lNX0NQVSAqY3B1KQotewotICBDUFVfTU9ERUxfREFUQSAoY3B1KSA9ICh2b2lkICopIHphbGxvYyAoc2l6ZW9mIChNT0RFTF9URVNUX0RBVEEpKTsKLX0KLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0jZGVmaW5lIFRJTUlOR19EQVRBKHRkKSB0ZAotI2Vsc2UKLSNkZWZpbmUgVElNSU5HX0RBVEEodGQpIDAKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgTU9ERUwgbTMycl9tb2RlbHNbXSA9Ci17Ci0gIHsgIm0zMnIvZCIsICYgbTMycl9tYWNoLCBNT0RFTF9NMzJSX0QsIFRJTUlOR19EQVRBICgmIG0zMnJfZF90aW1pbmdbMF0pLCBtMzJyX2RfbW9kZWxfaW5pdCB9LAotICB7ICJ0ZXN0IiwgJiBtMzJyX21hY2gsIE1PREVMX1RFU1QsIFRJTUlOR19EQVRBICgmIHRlc3RfdGltaW5nWzBdKSwgdGVzdF9tb2RlbF9pbml0IH0sCi0gIHsgMCB9Ci19OwotCi0vKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNwdSdzIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgbTMycmJmX2ltcF9wcm9wZXJ0aWVzID0KLXsKLSAgc2l6ZW9mIChTSU1fQ1BVKSwKLSNpZiBXSVRIX1NDQUNIRQotICBzaXplb2YgKFNDQUNIRSkKLSNlbHNlCi0gIDAKLSNlbmRpZgotfTsKLQotCi1zdGF0aWMgdm9pZAotbTMycmJmX3ByZXBhcmVfcnVuIChTSU1fQ1BVICpjcHUpCi17Ci0gIGlmIChDUFVfSURFU0MgKGNwdSkgPT0gTlVMTCkKLSAgICBtMzJyYmZfaW5pdF9pZGVzY190YWJsZSAoY3B1KTsKLX0KLQotc3RhdGljIGNvbnN0IENHRU5fSU5TTiAqCi1tMzJyYmZfZ2V0X2lkYXRhIChTSU1fQ1BVICpjcHUsIGludCBpbnVtKQotewotICByZXR1cm4gQ1BVX0lERVNDIChjcHUpIFtpbnVtXS5pZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLW0zMnJfaW5pdF9jcHUgKFNJTV9DUFUgKmNwdSkKLXsKLSAgQ1BVX1JFR19GRVRDSCAoY3B1KSA9IG0zMnJiZl9mZXRjaF9yZWdpc3RlcjsKLSAgQ1BVX1JFR19TVE9SRSAoY3B1KSA9IG0zMnJiZl9zdG9yZV9yZWdpc3RlcjsKLSAgQ1BVX1BDX0ZFVENIIChjcHUpID0gbTMycmJmX2hfcGNfZ2V0OwotICBDUFVfUENfU1RPUkUgKGNwdSkgPSBtMzJyYmZfaF9wY19zZXQ7Ci0gIENQVV9HRVRfSURBVEEgKGNwdSkgPSBtMzJyYmZfZ2V0X2lkYXRhOwotICBDUFVfTUFYX0lOU05TIChjcHUpID0gTTMyUkJGX0lOU05fTUFYOwotICBDUFVfSU5TTl9OQU1FIChjcHUpID0gY2dlbl9pbnNuX25hbWU7Ci0gIENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KSA9IG0zMnJiZl9lbmdpbmVfcnVuX2Z1bGw7Ci0jaWYgV0lUSF9GQVNUCi0gIENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA9IG0zMnJiZl9lbmdpbmVfcnVuX2Zhc3Q7Ci0jZWxzZQotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBtMzJyYmZfZW5naW5lX3J1bl9mdWxsOwotI2VuZGlmCi19Ci0KLWNvbnN0IE1BQ0ggbTMycl9tYWNoID0KLXsKLSAgIm0zMnIiLCAibTMyciIsIE1BQ0hfTTMyUiwKLSAgMzIsIDMyLCAmIG0zMnJfbW9kZWxzWzBdLCAmIG0zMnJiZl9pbXBfcHJvcGVydGllcywKLSAgbTMycl9pbml0X2NwdSwKLSAgbTMycmJmX3ByZXBhcmVfcnVuCi19OwotCmRpZmYgLS1naXQgYS9zaW0vbTMyci9tb2RlbHguYyBiL3NpbS9tMzJyL21vZGVseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2UxNTIyLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL21vZGVseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg5OSArMCwwIEBACi0vKiBTaW11bGF0b3IgbW9kZWwgc3VwcG9ydCBmb3IgbTMycnhmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jZGVmaW5lIFdBTlRfQ1BVIG0zMnJ4ZgotI2RlZmluZSBXQU5UX0NQVV9NMzJSWEYKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0KLS8qIFRoZSBwcm9maWxpbmcgZGF0YSBpcyByZWNvcmRlZCBoZXJlLCBidXQgaXMgYWNjZXNzZWQgdmlhIHRoZSBwcm9maWxpbmcKLSAgIG1lY2hhbmlzbS4gIEFmdGVyIGFsbCwgdGhpcyBpcyBpbmZvcm1hdGlvbiBmb3IgcHJvZmlsaW5nLiAgKi8KLQotI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCi0KLS8qIE1vZGVsIGhhbmRsZXJzIGZvciBlYWNoIGluc24uICAqLwotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9hZGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYWRkMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2FuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9hbmQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfb3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfb3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfeG9yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3hvcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9hZGRpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYWRkdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9hZGR2MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2FkZHggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYmM4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9iYzI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYmVxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9iZXF6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9iZ2V6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9iZ3R6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibGV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibHR6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibmV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibDggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2JjbDggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgNCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2JjbDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCA0KSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYm5jOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYm5jMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2JyYTggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9icmEyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ibmNsOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCA0KSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfYm5jbDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCA0KSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfY21wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2NtcGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfY21wdSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9jbXB1aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9jbXBlcSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9jbXB6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2RpdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfZGl2dSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfcmVtIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9yZW11IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9kaXZoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9qYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAxKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9qbmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMSkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfamwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfamwuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfam1wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGRiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGRiX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZGhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2xkdWIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZHViX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGR1aF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IDA7Ci0gICAgSU5UIG91dF9kciA9IDA7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGRfcGx1cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X3NyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbGQyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZDI0LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9sZGk4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2xkaTE2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X2xvY2sgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gMDsKLSAgICBJTlQgb3V0X2RyID0gMDsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9tYWNoaV9hIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X21hY2xvX2EgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbWFjd2hpX2EgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbWFjd2xvX2EgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X211bGhpX2EgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXVsbG9fYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9tdWx3aGlfYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9tdWx3bG9fYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9tdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X212ZmFjaGlfYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X212ZmFjbG9fYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X212ZmFjbWlfYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X212ZmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXZ0YWNoaV9hIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcmMxKTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXZ0YWNsb19hIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcmMxKTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXZ0YyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbm9wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbm90IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfcmFjX2RzaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9yYWNfZHNpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9yYWNoX2RzaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9yYWNfZHNpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9ydGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zZXRoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3NsbCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zbGwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc2xsaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3NyYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zcmEzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc3JhaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3NybCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zcmwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc3JsaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N0X2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAwOwotICAgIElOVCBpbl9zcmMyID0gMDsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc3RiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N0Yl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N0aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zdGhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IDA7Ci0gICAgSU5UIGluX3NyYzIgPSAwOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zdF9wbHVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fc3JjMik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfc3JjMik7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N0X21pbnVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gMDsKLSAgICBJTlQgaW5fc3JjMiA9IDA7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9kciA9IEZMRCAoaW5fc3JjMik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfc3JjMik7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIGluX2RyID0gRkxEIChpbl9kcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zdWJ2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKLSAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3N1YnggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKLSAgICBpbl9kciA9IEZMRCAoaW5fZHIpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfdHJhcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90cmFwLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3VubG9jayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAwOwotICAgIElOVCBvdXRfZHIgPSAwOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3NhdGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyID0gLTE7Ci0gICAgSU5UIGluX2RyID0gLTE7Ci0gICAgSU5UIG91dF9kciA9IC0xOwotICAgIGluX3NyID0gRkxEIChpbl9zcik7Ci0gICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zYXRoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc2F0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zciA9IC0xOwotICAgIElOVCBpbl9kciA9IC0xOwotICAgIElOVCBvdXRfZHIgPSAtMTsKLSAgICBpbl9zciA9IEZMRCAoaW5fc3IpOwotICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKLSAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMSkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9wY21wYnogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfc2FkZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9tYWN3dTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXNibG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOwotICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOwotICBpbnQgY3ljbGVzID0gMDsKLSAgewotICAgIGludCByZWZlcmVuY2VkID0gMDsKLSAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47Ci0gICAgSU5UIGluX3NyYzEgPSAtMTsKLSAgICBJTlQgaW5fc3JjMiA9IC0xOwotICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOwotICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOwotICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOwotICAgIGN5Y2xlcyArPSBtMzJyeGZfbW9kZWxfbTMycnhfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7Ci0gIH0KLSAgcmV0dXJuIGN5Y2xlczsKLSN1bmRlZiBGTEQKLX0KLQotc3RhdGljIGludAotbW9kZWxfbTMycnhfbXVsd3UxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKLSAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKLSAgaW50IGN5Y2xlcyA9IDA7Ci0gIHsKLSAgICBpbnQgcmVmZXJlbmNlZCA9IDA7Ci0gICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOwotICAgIElOVCBpbl9zcmMxID0gLTE7Ci0gICAgSU5UIGluX3NyYzIgPSAtMTsKLSAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKLSAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKLSAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKLSAgICBjeWNsZXMgKz0gbTMycnhmX21vZGVsX20zMnJ4X3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X21hY2xoMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3JjMSA9IC0xOwotICAgIElOVCBpbl9zcmMyID0gLTE7Ci0gICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7Ci0gICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7Ci0gICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X21hYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKLSAgfQotICByZXR1cm4gY3ljbGVzOwotI3VuZGVmIEZMRAotfQotCi1zdGF0aWMgaW50Ci1tb2RlbF9tMzJyeF9zYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLXN0YXRpYyBpbnQKLW1vZGVsX20zMnJ4X3NuYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7Ci0gIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7Ci0gIGludCBjeWNsZXMgPSAwOwotICB7Ci0gICAgaW50IHJlZmVyZW5jZWQgPSAwOwotICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJTlQgaW5fc3IgPSAtMTsKLSAgICBJTlQgaW5fZHIgPSAtMTsKLSAgICBJTlQgb3V0X2RyID0gLTE7Ci0gICAgY3ljbGVzICs9IG0zMnJ4Zl9tb2RlbF9tMzJyeF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOwotICB9Ci0gIHJldHVybiBjeWNsZXM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIFdlIGFzc3VtZSBVTklUX05PTkUgPT0gMCBiZWNhdXNlIHRoZSB0YWJsZXMgZG9uJ3QgYWx3YXlzIHRlcm1pbmF0ZQotICAgZW50cmllcyB3aXRoIGl0LiAgKi8KLQotLyogTW9kZWwgdGltaW5nIGRhdGEgZm9yIGBtMzJyeCcuICAqLwotCi1zdGF0aWMgY29uc3QgSU5TTl9USU1JTkcgbTMycnhfdGltaW5nW10gPSB7Ci0gIHsgTTMyUlhGX0lOU05fWF9JTlZBTElELCAwLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fWF9BRlRFUiwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1hfQkVGT1JFLCAwLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fWF9DVElfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9YX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fWF9CRUdJTiwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0FERCwgbW9kZWxfbTMycnhfYWRkLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQUREMywgbW9kZWxfbTMycnhfYWRkMywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0FORCwgbW9kZWxfbTMycnhfYW5kLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQU5EMywgbW9kZWxfbTMycnhfYW5kMywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX09SLCBtb2RlbF9tMzJyeF9vciwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX09SMywgbW9kZWxfbTMycnhfb3IzLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fWE9SLCBtb2RlbF9tMzJyeF94b3IsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9YT1IzLCBtb2RlbF9tMzJyeF94b3IzLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQURESSwgbW9kZWxfbTMycnhfYWRkaSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0FERFYsIG1vZGVsX20zMnJ4X2FkZHYsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9BRERWMywgbW9kZWxfbTMycnhfYWRkdjMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9BRERYLCBtb2RlbF9tMzJyeF9hZGR4LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQkM4LCBtb2RlbF9tMzJyeF9iYzgsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JDMjQsIG1vZGVsX20zMnJ4X2JjMjQsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JFUSwgbW9kZWxfbTMycnhfYmVxLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9DTVAsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQkVRWiwgbW9kZWxfbTMycnhfYmVxeiwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JHRVosIG1vZGVsX20zMnJ4X2JnZXosIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSWF9VX0NNUCwgMSwgMCB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9CR1RaLCBtb2RlbF9tMzJyeF9iZ3R6LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9DTVAsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQkxFWiwgbW9kZWxfbTMycnhfYmxleiwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JMVFosIG1vZGVsX20zMnJ4X2JsdHosIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSWF9VX0NNUCwgMSwgMCB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9CTkVaLCBtb2RlbF9tMzJyeF9ibmV6LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9DTVAsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQkw4LCBtb2RlbF9tMzJyeF9ibDgsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JMMjQsIG1vZGVsX20zMnJ4X2JsMjQsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JDTDgsIG1vZGVsX20zMnJ4X2JjbDgsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JDTDI0LCBtb2RlbF9tMzJyeF9iY2wyNCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQk5DOCwgbW9kZWxfbTMycnhfYm5jOCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQk5DMjQsIG1vZGVsX20zMnJ4X2JuYzI0LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9CTkUsIG1vZGVsX20zMnJ4X2JuZSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JSQTgsIG1vZGVsX20zMnJ4X2JyYTgsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0JSQTI0LCBtb2RlbF9tMzJyeF9icmEyNCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQk5DTDgsIG1vZGVsX20zMnJ4X2JuY2w4LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9CTkNMMjQsIG1vZGVsX20zMnJ4X2JuY2wyNCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DVEksIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQ01QLCBtb2RlbF9tMzJyeF9jbXAsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0NNUEksIG1vZGVsX20zMnJ4X2NtcGksIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0NNUFUsIG1vZGVsX20zMnJ4X2NtcHUsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0NNUFVJLCBtb2RlbF9tMzJyeF9jbXB1aSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9DTVAsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fQ01QRVEsIG1vZGVsX20zMnJ4X2NtcGVxLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NNUCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9DTVBaLCBtb2RlbF9tMzJyeF9jbXB6LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NNUCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9ESVYsIG1vZGVsX20zMnJ4X2RpdiwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAzNyB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9ESVZVLCBtb2RlbF9tMzJyeF9kaXZ1LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDM3IH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1JFTSwgbW9kZWxfbTMycnhfcmVtLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDM3IH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1JFTVUsIG1vZGVsX20zMnJ4X3JlbXUsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMzcgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fRElWSCwgbW9kZWxfbTMycnhfZGl2aCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAyMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9KQywgbW9kZWxfbTMycnhfamMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0pOQywgbW9kZWxfbTMycnhfam5jLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9KTCwgbW9kZWxfbTMycnhfamwsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ1RJLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0pNUCwgbW9kZWxfbTMycnhfam1wLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0NUSSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MRCwgbW9kZWxfbTMycnhfbGQsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MRF9ELCBtb2RlbF9tMzJyeF9sZF9kLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0xPQUQsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTERCLCBtb2RlbF9tMzJyeF9sZGIsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MREJfRCwgbW9kZWxfbTMycnhfbGRiX2QsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMiB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MREgsIG1vZGVsX20zMnJ4X2xkaCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0xESF9ELCBtb2RlbF9tMzJyeF9sZGhfZCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0xEVUIsIG1vZGVsX20zMnJ4X2xkdWIsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MRFVCX0QsIG1vZGVsX20zMnJ4X2xkdWJfZCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0xEVUgsIG1vZGVsX20zMnJ4X2xkdWgsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MRFVIX0QsIG1vZGVsX20zMnJ4X2xkdWhfZCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9MT0FELCAxLCAyIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0xEX1BMVVMsIG1vZGVsX20zMnJ4X2xkX3BsdXMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX0xEMjQsIG1vZGVsX20zMnJ4X2xkMjQsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9MREk4LCBtb2RlbF9tMzJyeF9sZGk4LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTERJMTYsIG1vZGVsX20zMnJ4X2xkaTE2LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTE9DSywgbW9kZWxfbTMycnhfbG9jaywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9MT0FELCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01BQ0hJX0EsIG1vZGVsX20zMnJ4X21hY2hpX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01BQ0xPX0EsIG1vZGVsX20zMnJ4X21hY2xvX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01BQ1dISV9BLCBtb2RlbF9tMzJyeF9tYWN3aGlfYSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTUFDV0xPX0EsIG1vZGVsX20zMnJ4X21hY3dsb19hLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NVUwsIG1vZGVsX20zMnJ4X211bCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCA0IH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01VTEhJX0EsIG1vZGVsX20zMnJ4X211bGhpX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01VTExPX0EsIG1vZGVsX20zMnJ4X211bGxvX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01VTFdISV9BLCBtb2RlbF9tMzJyeF9tdWx3aGlfYSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTVVMV0xPX0EsIG1vZGVsX20zMnJ4X211bHdsb19hLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NViwgbW9kZWxfbTMycnhfbXYsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NVkZBQ0hJX0EsIG1vZGVsX20zMnJ4X212ZmFjaGlfYSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAyIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01WRkFDTE9fQSwgbW9kZWxfbTMycnhfbXZmYWNsb19hLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTVZGQUNNSV9BLCBtb2RlbF9tMzJyeF9tdmZhY21pX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMiB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NVkZDLCBtb2RlbF9tMzJyeF9tdmZjLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTVZUQUNISV9BLCBtb2RlbF9tMzJyeF9tdnRhY2hpX2EsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NVlRBQ0xPX0EsIG1vZGVsX20zMnJ4X212dGFjbG9fYSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01WVEMsIG1vZGVsX20zMnJ4X212dGMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9ORUcsIG1vZGVsX20zMnJ4X25lZywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX05PUCwgbW9kZWxfbTMycnhfbm9wLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDAgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fTk9ULCBtb2RlbF9tMzJyeF9ub3QsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9SQUNfRFNJLCBtb2RlbF9tMzJyeF9yYWNfZHNpLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9SQUNIX0RTSSwgbW9kZWxfbTMycnhfcmFjaF9kc2ksIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1JURSwgbW9kZWxfbTMycnhfcnRlLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU0VUSCwgbW9kZWxfbTMycnhfc2V0aCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NMTCwgbW9kZWxfbTMycnhfc2xsLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU0xMMywgbW9kZWxfbTMycnhfc2xsMywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NMTEksIG1vZGVsX20zMnJ4X3NsbGksIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TUkEsIG1vZGVsX20zMnJ4X3NyYSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NSQTMsIG1vZGVsX20zMnJ4X3NyYTMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TUkFJLCBtb2RlbF9tMzJyeF9zcmFpLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU1JMLCBtb2RlbF9tMzJyeF9zcmwsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TUkwzLCBtb2RlbF9tMzJyeF9zcmwzLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU1JMSSwgbW9kZWxfbTMycnhfc3JsaSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NULCBtb2RlbF9tMzJyeF9zdCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TVF9ELCBtb2RlbF9tMzJyeF9zdF9kLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX1NUT1JFLCAxLCAyIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NUQiwgbW9kZWxfbTMycnhfc3RiLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX1NUT1JFLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NUQl9ELCBtb2RlbF9tMzJyeF9zdGJfZCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9TVE9SRSwgMSwgMiB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TVEgsIG1vZGVsX20zMnJ4X3N0aCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9TVE9SRSwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TVEhfRCwgbW9kZWxfbTMycnhfc3RoX2QsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfU1RPUkUsIDEsIDIgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU1RfUExVUywgbW9kZWxfbTMycnhfc3RfcGx1cywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9TVE9SRSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NUX01JTlVTLCBtb2RlbF9tMzJyeF9zdF9taW51cywgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9TVE9SRSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAwIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NVQiwgbW9kZWxfbTMycnhfc3ViLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU1VCViwgbW9kZWxfbTMycnhfc3VidiwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NVQlgsIG1vZGVsX20zMnJ4X3N1YngsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9UUkFQLCBtb2RlbF9tMzJyeF90cmFwLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fVU5MT0NLLCBtb2RlbF9tMzJyeF91bmxvY2ssIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTE9BRCwgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9TQVRCLCBtb2RlbF9tMzJyeF9zYXRiLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU0FUSCwgbW9kZWxfbTMycnhfc2F0aCwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9FWEVDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NBVCwgbW9kZWxfbTMycnhfc2F0LCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fUENNUEJaLCBtb2RlbF9tMzJyeF9wY21wYnosIHsgeyAoaW50KSBVTklUX00zMlJYX1VfQ01QLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX1NBREQsIG1vZGVsX20zMnJ4X3NhZGQsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01BQ1dVMSwgbW9kZWxfbTMycnhfbWFjd3UxLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NU0JMTywgbW9kZWxfbTMycnhfbXNibG8sIHsgeyAoaW50KSBVTklUX00zMlJYX1VfTUFDLCAxLCAxIH0gfSB9LAotICB7IE0zMlJYRl9JTlNOX01VTFdVMSwgbW9kZWxfbTMycnhfbXVsd3UxLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX01BQywgMSwgMSB9IH0gfSwKLSAgeyBNMzJSWEZfSU5TTl9NQUNMSDEsIG1vZGVsX20zMnJ4X21hY2xoMSwgeyB7IChpbnQpIFVOSVRfTTMyUlhfVV9NQUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU0MsIG1vZGVsX20zMnJ4X3NjLCB7IHsgKGludCkgVU5JVF9NMzJSWF9VX0VYRUMsIDEsIDEgfSB9IH0sCi0gIHsgTTMyUlhGX0lOU05fU05DLCBtb2RlbF9tMzJyeF9zbmMsIHsgeyAoaW50KSBVTklUX00zMlJYX1VfRVhFQywgMSwgMSB9IH0gfSwKLX07Ci0KLSNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwotCi1zdGF0aWMgdm9pZAotbTMycnhfbW9kZWxfaW5pdCAoU0lNX0NQVSAqY3B1KQotewotICBDUFVfTU9ERUxfREFUQSAoY3B1KSA9ICh2b2lkICopIHphbGxvYyAoc2l6ZW9mIChNT0RFTF9NMzJSWF9EQVRBKSk7Ci19Ci0KLSNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAotI2RlZmluZSBUSU1JTkdfREFUQSh0ZCkgdGQKLSNlbHNlCi0jZGVmaW5lIFRJTUlOR19EQVRBKHRkKSAwCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IE1PREVMIG0zMnJ4X21vZGVsc1tdID0KLXsKLSAgeyAibTMycngiLCAmIG0zMnJ4X21hY2gsIE1PREVMX00zMlJYLCBUSU1JTkdfREFUQSAoJiBtMzJyeF90aW1pbmdbMF0pLCBtMzJyeF9tb2RlbF9pbml0IH0sCi0gIHsgMCB9Ci19OwotCi0vKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNwdSdzIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgbTMycnhmX2ltcF9wcm9wZXJ0aWVzID0KLXsKLSAgc2l6ZW9mIChTSU1fQ1BVKSwKLSNpZiBXSVRIX1NDQUNIRQotICBzaXplb2YgKFNDQUNIRSkKLSNlbHNlCi0gIDAKLSNlbmRpZgotfTsKLQotCi1zdGF0aWMgdm9pZAotbTMycnhmX3ByZXBhcmVfcnVuIChTSU1fQ1BVICpjcHUpCi17Ci0gIGlmIChDUFVfSURFU0MgKGNwdSkgPT0gTlVMTCkKLSAgICBtMzJyeGZfaW5pdF9pZGVzY190YWJsZSAoY3B1KTsKLX0KLQotc3RhdGljIGNvbnN0IENHRU5fSU5TTiAqCi1tMzJyeGZfZ2V0X2lkYXRhIChTSU1fQ1BVICpjcHUsIGludCBpbnVtKQotewotICByZXR1cm4gQ1BVX0lERVNDIChjcHUpIFtpbnVtXS5pZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLW0zMnJ4X2luaXRfY3B1IChTSU1fQ1BVICpjcHUpCi17Ci0gIENQVV9SRUdfRkVUQ0ggKGNwdSkgPSBtMzJyeGZfZmV0Y2hfcmVnaXN0ZXI7Ci0gIENQVV9SRUdfU1RPUkUgKGNwdSkgPSBtMzJyeGZfc3RvcmVfcmVnaXN0ZXI7Ci0gIENQVV9QQ19GRVRDSCAoY3B1KSA9IG0zMnJ4Zl9oX3BjX2dldDsKLSAgQ1BVX1BDX1NUT1JFIChjcHUpID0gbTMycnhmX2hfcGNfc2V0OwotICBDUFVfR0VUX0lEQVRBIChjcHUpID0gbTMycnhmX2dldF9pZGF0YTsKLSAgQ1BVX01BWF9JTlNOUyAoY3B1KSA9IE0zMlJYRl9JTlNOX01BWDsKLSAgQ1BVX0lOU05fTkFNRSAoY3B1KSA9IGNnZW5faW5zbl9uYW1lOwotICBDUFVfRlVMTF9FTkdJTkVfRk4gKGNwdSkgPSBtMzJyeGZfZW5naW5lX3J1bl9mdWxsOwotI2lmIFdJVEhfRkFTVAotICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBtMzJyeGZfZW5naW5lX3J1bl9mYXN0OwotI2Vsc2UKLSAgQ1BVX0ZBU1RfRU5HSU5FX0ZOIChjcHUpID0gbTMycnhmX2VuZ2luZV9ydW5fZnVsbDsKLSNlbmRpZgotfQotCi1jb25zdCBNQUNIIG0zMnJ4X21hY2ggPQotewotICAibTMycngiLCAibTMycngiLCBNQUNIX00zMlJYLAotICAzMiwgMzIsICYgbTMycnhfbW9kZWxzWzBdLCAmIG0zMnJ4Zl9pbXBfcHJvcGVydGllcywKLSAgbTMycnhfaW5pdF9jcHUsCi0gIG0zMnJ4Zl9wcmVwYXJlX3J1bgotfTsKLQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvc2VtLXN3aXRjaC5jIGIvc2ltL20zMnIvc2VtLXN3aXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiNDQ3Li4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL3NlbS1zd2l0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDI1MDcgKzAsMCBAQAotLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIHNlbWFudGljcyBmb3IgbTMycmJmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZkZWYgREVGSU5FX0xBQkVMUwotCi0gIC8qIFRoZSBsYWJlbHMgaGF2ZSB0aGUgY2FzZSB0aGV5IGhhdmUgYmVjYXVzZSB0aGUgZW51bSBvZiBpbnNuIHR5cGVzCi0gICAgIGlzIGFsbCB1cHBlcmNhc2UgYW5kIGluIHRoZSBub24tc3RkYyBjYXNlIHRoZSBpbnNuIHN5bWJvbCBpcyBidWlsdAotICAgICBpbnRvIHRoZSBlbnVtIG5hbWUuICAqLwotCi0gIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludCBpbmRleDsKLSAgICB2b2lkICpsYWJlbDsKLSAgfSBsYWJlbHNbXSA9IHsKLSAgICB7IE0zMlJCRl9JTlNOX1hfSU5WQUxJRCwgJiYgY2FzZV9zZW1fSU5TTl9YX0lOVkFMSUQgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1hfQUZURVIsICYmIGNhc2Vfc2VtX0lOU05fWF9BRlRFUiB9LAotICAgIHsgTTMyUkJGX0lOU05fWF9CRUZPUkUsICYmIGNhc2Vfc2VtX0lOU05fWF9CRUZPUkUgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1hfQ1RJX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ1RJX0NIQUlOIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9YX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ0hBSU4gfSwKLSAgICB7IE0zMlJCRl9JTlNOX1hfQkVHSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9CRUdJTiB9LAotICAgIHsgTTMyUkJGX0lOU05fQURELCAmJiBjYXNlX3NlbV9JTlNOX0FERCB9LAotICAgIHsgTTMyUkJGX0lOU05fQUREMywgJiYgY2FzZV9zZW1fSU5TTl9BREQzIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9BTkQsICYmIGNhc2Vfc2VtX0lOU05fQU5EIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9BTkQzLCAmJiBjYXNlX3NlbV9JTlNOX0FORDMgfSwKLSAgICB7IE0zMlJCRl9JTlNOX09SLCAmJiBjYXNlX3NlbV9JTlNOX09SIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9PUjMsICYmIGNhc2Vfc2VtX0lOU05fT1IzIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9YT1IsICYmIGNhc2Vfc2VtX0lOU05fWE9SIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9YT1IzLCAmJiBjYXNlX3NlbV9JTlNOX1hPUjMgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0FEREksICYmIGNhc2Vfc2VtX0lOU05fQURESSB9LAotICAgIHsgTTMyUkJGX0lOU05fQUREViwgJiYgY2FzZV9zZW1fSU5TTl9BRERWIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9BRERWMywgJiYgY2FzZV9zZW1fSU5TTl9BRERWMyB9LAotICAgIHsgTTMyUkJGX0lOU05fQUREWCwgJiYgY2FzZV9zZW1fSU5TTl9BRERYIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CQzgsICYmIGNhc2Vfc2VtX0lOU05fQkM4IH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CQzI0LCAmJiBjYXNlX3NlbV9JTlNOX0JDMjQgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0JFUSwgJiYgY2FzZV9zZW1fSU5TTl9CRVEgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0JFUVosICYmIGNhc2Vfc2VtX0lOU05fQkVRWiB9LAotICAgIHsgTTMyUkJGX0lOU05fQkdFWiwgJiYgY2FzZV9zZW1fSU5TTl9CR0VaIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CR1RaLCAmJiBjYXNlX3NlbV9JTlNOX0JHVFogfSwKLSAgICB7IE0zMlJCRl9JTlNOX0JMRVosICYmIGNhc2Vfc2VtX0lOU05fQkxFWiB9LAotICAgIHsgTTMyUkJGX0lOU05fQkxUWiwgJiYgY2FzZV9zZW1fSU5TTl9CTFRaIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CTkVaLCAmJiBjYXNlX3NlbV9JTlNOX0JORVogfSwKLSAgICB7IE0zMlJCRl9JTlNOX0JMOCwgJiYgY2FzZV9zZW1fSU5TTl9CTDggfSwKLSAgICB7IE0zMlJCRl9JTlNOX0JMMjQsICYmIGNhc2Vfc2VtX0lOU05fQkwyNCB9LAotICAgIHsgTTMyUkJGX0lOU05fQk5DOCwgJiYgY2FzZV9zZW1fSU5TTl9CTkM4IH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CTkMyNCwgJiYgY2FzZV9zZW1fSU5TTl9CTkMyNCB9LAotICAgIHsgTTMyUkJGX0lOU05fQk5FLCAmJiBjYXNlX3NlbV9JTlNOX0JORSB9LAotICAgIHsgTTMyUkJGX0lOU05fQlJBOCwgJiYgY2FzZV9zZW1fSU5TTl9CUkE4IH0sCi0gICAgeyBNMzJSQkZfSU5TTl9CUkEyNCwgJiYgY2FzZV9zZW1fSU5TTl9CUkEyNCB9LAotICAgIHsgTTMyUkJGX0lOU05fQ01QLCAmJiBjYXNlX3NlbV9JTlNOX0NNUCB9LAotICAgIHsgTTMyUkJGX0lOU05fQ01QSSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9DTVBVLCAmJiBjYXNlX3NlbV9JTlNOX0NNUFUgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0NNUFVJLCAmJiBjYXNlX3NlbV9JTlNOX0NNUFVJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9ESVYsICYmIGNhc2Vfc2VtX0lOU05fRElWIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9ESVZVLCAmJiBjYXNlX3NlbV9JTlNOX0RJVlUgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1JFTSwgJiYgY2FzZV9zZW1fSU5TTl9SRU0gfSwKLSAgICB7IE0zMlJCRl9JTlNOX1JFTVUsICYmIGNhc2Vfc2VtX0lOU05fUkVNVSB9LAotICAgIHsgTTMyUkJGX0lOU05fSkwsICYmIGNhc2Vfc2VtX0lOU05fSkwgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0pNUCwgJiYgY2FzZV9zZW1fSU5TTl9KTVAgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xELCAmJiBjYXNlX3NlbV9JTlNOX0xEIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MRF9ELCAmJiBjYXNlX3NlbV9JTlNOX0xEX0QgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xEQiwgJiYgY2FzZV9zZW1fSU5TTl9MREIgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xEQl9ELCAmJiBjYXNlX3NlbV9JTlNOX0xEQl9EIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MREgsICYmIGNhc2Vfc2VtX0lOU05fTERIIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MREhfRCwgJiYgY2FzZV9zZW1fSU5TTl9MREhfRCB9LAotICAgIHsgTTMyUkJGX0lOU05fTERVQiwgJiYgY2FzZV9zZW1fSU5TTl9MRFVCIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MRFVCX0QsICYmIGNhc2Vfc2VtX0lOU05fTERVQl9EIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MRFVILCAmJiBjYXNlX3NlbV9JTlNOX0xEVUggfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xEVUhfRCwgJiYgY2FzZV9zZW1fSU5TTl9MRFVIX0QgfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xEX1BMVVMsICYmIGNhc2Vfc2VtX0lOU05fTERfUExVUyB9LAotICAgIHsgTTMyUkJGX0lOU05fTEQyNCwgJiYgY2FzZV9zZW1fSU5TTl9MRDI0IH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MREk4LCAmJiBjYXNlX3NlbV9JTlNOX0xESTggfSwKLSAgICB7IE0zMlJCRl9JTlNOX0xESTE2LCAmJiBjYXNlX3NlbV9JTlNOX0xESTE2IH0sCi0gICAgeyBNMzJSQkZfSU5TTl9MT0NLLCAmJiBjYXNlX3NlbV9JTlNOX0xPQ0sgfSwKLSAgICB7IE0zMlJCRl9JTlNOX01BQ0hJLCAmJiBjYXNlX3NlbV9JTlNOX01BQ0hJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NQUNMTywgJiYgY2FzZV9zZW1fSU5TTl9NQUNMTyB9LAotICAgIHsgTTMyUkJGX0lOU05fTUFDV0hJLCAmJiBjYXNlX3NlbV9JTlNOX01BQ1dISSB9LAotICAgIHsgTTMyUkJGX0lOU05fTUFDV0xPLCAmJiBjYXNlX3NlbV9JTlNOX01BQ1dMTyB9LAotICAgIHsgTTMyUkJGX0lOU05fTVVMLCAmJiBjYXNlX3NlbV9JTlNOX01VTCB9LAotICAgIHsgTTMyUkJGX0lOU05fTVVMSEksICYmIGNhc2Vfc2VtX0lOU05fTVVMSEkgfSwKLSAgICB7IE0zMlJCRl9JTlNOX01VTExPLCAmJiBjYXNlX3NlbV9JTlNOX01VTExPIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NVUxXSEksICYmIGNhc2Vfc2VtX0lOU05fTVVMV0hJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NVUxXTE8sICYmIGNhc2Vfc2VtX0lOU05fTVVMV0xPIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NViwgJiYgY2FzZV9zZW1fSU5TTl9NViB9LAotICAgIHsgTTMyUkJGX0lOU05fTVZGQUNISSwgJiYgY2FzZV9zZW1fSU5TTl9NVkZBQ0hJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NVkZBQ0xPLCAmJiBjYXNlX3NlbV9JTlNOX01WRkFDTE8gfSwKLSAgICB7IE0zMlJCRl9JTlNOX01WRkFDTUksICYmIGNhc2Vfc2VtX0lOU05fTVZGQUNNSSB9LAotICAgIHsgTTMyUkJGX0lOU05fTVZGQywgJiYgY2FzZV9zZW1fSU5TTl9NVkZDIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9NVlRBQ0hJLCAmJiBjYXNlX3NlbV9JTlNOX01WVEFDSEkgfSwKLSAgICB7IE0zMlJCRl9JTlNOX01WVEFDTE8sICYmIGNhc2Vfc2VtX0lOU05fTVZUQUNMTyB9LAotICAgIHsgTTMyUkJGX0lOU05fTVZUQywgJiYgY2FzZV9zZW1fSU5TTl9NVlRDIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9ORUcsICYmIGNhc2Vfc2VtX0lOU05fTkVHIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9OT1AsICYmIGNhc2Vfc2VtX0lOU05fTk9QIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9OT1QsICYmIGNhc2Vfc2VtX0lOU05fTk9UIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9SQUMsICYmIGNhc2Vfc2VtX0lOU05fUkFDIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9SQUNILCAmJiBjYXNlX3NlbV9JTlNOX1JBQ0ggfSwKLSAgICB7IE0zMlJCRl9JTlNOX1JURSwgJiYgY2FzZV9zZW1fSU5TTl9SVEUgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NFVEgsICYmIGNhc2Vfc2VtX0lOU05fU0VUSCB9LAotICAgIHsgTTMyUkJGX0lOU05fU0xMLCAmJiBjYXNlX3NlbV9JTlNOX1NMTCB9LAotICAgIHsgTTMyUkJGX0lOU05fU0xMMywgJiYgY2FzZV9zZW1fSU5TTl9TTEwzIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TTExJLCAmJiBjYXNlX3NlbV9JTlNOX1NMTEkgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NSQSwgJiYgY2FzZV9zZW1fSU5TTl9TUkEgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NSQTMsICYmIGNhc2Vfc2VtX0lOU05fU1JBMyB9LAotICAgIHsgTTMyUkJGX0lOU05fU1JBSSwgJiYgY2FzZV9zZW1fSU5TTl9TUkFJIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TUkwsICYmIGNhc2Vfc2VtX0lOU05fU1JMIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TUkwzLCAmJiBjYXNlX3NlbV9JTlNOX1NSTDMgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NSTEksICYmIGNhc2Vfc2VtX0lOU05fU1JMSSB9LAotICAgIHsgTTMyUkJGX0lOU05fU1QsICYmIGNhc2Vfc2VtX0lOU05fU1QgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NUX0QsICYmIGNhc2Vfc2VtX0lOU05fU1RfRCB9LAotICAgIHsgTTMyUkJGX0lOU05fU1RCLCAmJiBjYXNlX3NlbV9JTlNOX1NUQiB9LAotICAgIHsgTTMyUkJGX0lOU05fU1RCX0QsICYmIGNhc2Vfc2VtX0lOU05fU1RCX0QgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NUSCwgJiYgY2FzZV9zZW1fSU5TTl9TVEggfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NUSF9ELCAmJiBjYXNlX3NlbV9JTlNOX1NUSF9EIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TVF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX1NUX1BMVVMgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NUX01JTlVTLCAmJiBjYXNlX3NlbV9JTlNOX1NUX01JTlVTIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TVUIsICYmIGNhc2Vfc2VtX0lOU05fU1VCIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9TVUJWLCAmJiBjYXNlX3NlbV9JTlNOX1NVQlYgfSwKLSAgICB7IE0zMlJCRl9JTlNOX1NVQlgsICYmIGNhc2Vfc2VtX0lOU05fU1VCWCB9LAotICAgIHsgTTMyUkJGX0lOU05fVFJBUCwgJiYgY2FzZV9zZW1fSU5TTl9UUkFQIH0sCi0gICAgeyBNMzJSQkZfSU5TTl9VTkxPQ0ssICYmIGNhc2Vfc2VtX0lOU05fVU5MT0NLIH0sCi0gICAgeyAwLCAwIH0KLSAgfTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgbGFiZWxzW2ldLmxhYmVsICE9IDA7ICsraSkKLSAgICB7Ci0jaWYgRkFTVF9QCi0gICAgICBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbbGFiZWxzW2ldLmluZGV4XS5zZW1fZmFzdF9sYWIgPSBsYWJlbHNbaV0ubGFiZWw7Ci0jZWxzZQotICAgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Z1bGxfbGFiID0gbGFiZWxzW2ldLmxhYmVsOwotI2VuZGlmCi0gICAgfQotCi0jdW5kZWYgREVGSU5FX0xBQkVMUwotI2VuZGlmIC8qIERFRklORV9MQUJFTFMgKi8KLQotI2lmZGVmIERFRklORV9TV0lUQ0gKLQotLyogSWYgaHlwZXItZmFzdCBbd2VsbCBub3QgdW5uZWNlc3NhcmlseSBzbG93XSBleGVjdXRpb24gaXMgc2VsZWN0ZWQsIHR1cm4KLSAgIG9mZiBmcmlsbHMgbGlrZSB0cmFjaW5nIGFuZCBwcm9maWxpbmcuICAqLwotLyogRklYTUU6IEEgYmV0dGVyIHdheSB3b3VsZCBiZSB0byBoYXZlIFRSQUNFX1JFU1VMVCBjaGVjayBmb3Igc29tZXRoaW5nCi0gICB0aGF0IGNhbiBjYXVzZSBpdCB0byBiZSBvcHRpbWl6ZWQgb3V0LiAgQW5vdGhlciB3YXkgd291bGQgYmUgdG8gZW1pdAotICAgc3BlY2lhbCBoYW5kbGVycyBpbnRvIHRoZSBpbnN0cnVjdGlvbiAic3RyZWFtIi4gICovCi0KLSNpZiBGQVNUX1AKLSN1bmRlZiBUUkFDRV9SRVNVTFQKLSNkZWZpbmUgVFJBQ0VfUkVTVUxUKGNwdSwgYWJ1ZiwgbmFtZSwgdHlwZSwgdmFsKQotI2VuZGlmCi0KLSN1bmRlZiBHRVRfQVRUUgotI2RlZmluZSBHRVRfQVRUUihjcHUsIG51bSwgYXR0cikgQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBhYnVmLT5pZGVzYy0+YXR0cnMsIENHRU5fSU5TTl8jI2F0dHIpCi0KLXsKLQotI2lmIFdJVEhfU0NBQ0hFX1BCQgotCi0vKiBCcmFuY2ggdG8gbmV4dCBoYW5kbGVyIHdpdGhvdXQgZ29pbmcgYXJvdW5kIG1haW4gbG9vcC4gICovCi0jZGVmaW5lIE5FWFQodnBjKSBnb3RvICogU0VNX0FSR0JVRiAodnBjKSAtPiBzZW1hbnRpYy5zZW1fY2FzZQotU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UpCi0KLSNlbHNlIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCi0KLSNkZWZpbmUgTkVYVCh2cGMpIEJSRUFLIChzZW0pCi0jaWZkZWYgX19HTlVDX18KLSNpZiBGQVNUX1AKLSAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+c2VtX2Zhc3RfbGFiKQotI2Vsc2UKLSAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+c2VtX2Z1bGxfbGFiKQotI2VuZGlmCi0jZWxzZQotICBTV0lUQ0ggKHNlbSwgU0VNX0FSR0JVRiAoc2MpIC0+IGlkZXNjLT5udW0pCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCi0KLSAgICB7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfSU5WQUxJRCkgOiAvKiAtLWludmFsaWQtLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSAgICAvKiBVcGRhdGUgdGhlIHJlY29yZGVkIHBjIGluIHRoZSBjcHUgc3RhdGUgc3RydWN0LgotICAgICAgIE9ubHkgbmVjZXNzYXJ5IGZvciBXSVRIX1NDQUNIRSBjYXNlLCBidXQgdG8gYXZvaWQgdGhlCi0gICAgICAgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gLi4uLiAgKi8KLSAgICBTRVRfSF9QQyAocGMpOwotICAgIC8qIFZpcnR1YWwgaW5zbnMgaGF2ZSB6ZXJvIHNpemUuICBPdmVyd3JpdGUgdnBjIHdpdGggYWRkcmVzcyBvZiBuZXh0IGluc24KLSAgICAgICB1c2luZyB0aGUgZGVmYXVsdC1pbnNuLWJpdHNpemUgc3BlYy4gIFdoZW4gZXhlY3V0aW5nIGluc25zIGluIHBhcmFsbGVsCi0gICAgICAgd2UgbWF5IHdhbnQgdG8gcXVldWUgdGhlIGZhdWx0IGFuZCBjb250aW51ZSBleGVjdXRpb24uICAqLwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotICAgIHZwYyA9IHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChjdXJyZW50X2NwdSwgcGMsIHZwYyk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0FGVEVSKSA6IC8qIC0tYWZ0ZXItLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCi0gICAgbTMycmJmX3BiYl9hZnRlciAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0JFRk9SRSkgOiAvKiAtLWJlZm9yZS0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSAgICBtMzJyYmZfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0NUSV9DSEFJTikgOiAvKiAtLWN0aS1jaGFpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgdnBjID0gbTMycmJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAotCQkJICAgICAgIHBiYl9icl90eXBlLCBwYmJfYnJfbnBjKTsKLSAgICBCUkVBSyAoc2VtKTsKLSNlbHNlCi0gICAgLyogRklYTUU6IEFsbG93IHByb3Zpc2lvbiBvZiBleHBsaWNpdCBpZm10IHNwZWMgaW4gaW5zbiBzcGVjLiAgKi8KLSAgICB2cGMgPSBtMzJyYmZfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9UWVBFIChjdXJyZW50X2NwdSksCi0JCQkgICAgICAgQ1BVX1BCQl9CUl9OUEMgKGN1cnJlbnRfY3B1KSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9DSEFJTikgOiAvKiAtLWNoYWluLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX00zMlJCRgotICAgIHZwYyA9IG0zMnJiZl9wYmJfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgQlJFQUsgKHNlbSk7Ci0jZW5kaWYKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9CRUdJTikgOiAvKiAtLWJlZ2luLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX00zMlJCRgotI2lmZGVmIERFRklORV9TV0lUQ0gKLSAgICAvKiBJbiB0aGUgc3dpdGNoIGNhc2UgRkFTVF9QIGlzIGEgY29uc3RhbnQsIGFsbG93aW5nIHNldmVyYWwgb3B0aW1pemF0aW9ucwotICAgICAgIGluIGFueSBjYWxsZWQgaW5saW5lIGZ1bmN0aW9ucy4gICovCi0gICAgdnBjID0gbTMycmJmX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIEZBU1RfUCk7Ci0jZWxzZQotICAgIHZwYyA9IG0zMnJiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBTVEFURV9SVU5fRkFTVF9QIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSkpOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FERCkgOiAvKiBhZGQgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FERDMpIDogLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQU5EKSA6IC8qIGFuZCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQU5EMykgOiAvKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX09SKSA6IC8qIG9yICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX09SMykgOiAvKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3VpbW0xNikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWE9SKSA6IC8qIHhvciAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWE9SMykgOiAvKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FEREkpIDogLyogYWRkaSAkZHIsJHNpbW04ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3NpbW04KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERWKSA6IC8qIGFkZHYgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7QkkgdGVtcDE7Ci0gIHRlbXAwID0gQUREU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgdGVtcDEgPSBBRERPRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgMCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IHRlbXAxOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERWMykgOiAvKiBhZGR2MyAkZHIsJHNyLCRzaW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSk7Ci0gIHRlbXAxID0gQURET0ZTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSwgMCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IHRlbXAxOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERYKSA6IC8qIGFkZHggJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7QkkgdGVtcDE7Ci0gIHRlbXAwID0gQUREQ1NJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgdGVtcDEgPSBBRERDRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JDOCkgOiAvKiBiYy5zICRkaXNwOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JDMjQpIDogLyogYmMubCAkZGlzcDI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CRVEpIDogLyogYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JlcS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JFUVopIDogLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JHRVopIDogLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHRVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JHVFopIDogLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMRVopIDogLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMRVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMVFopIDogLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMVFNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JORVopIDogLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JMOCkgOiAvKiBibC5zICRkaXNwOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTDI0KSA6IC8qIGJsLmwgJGRpc3AyNCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JOQzgpIDogLyogYm5jLnMgJGRpc3A4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkMyNCkgOiAvKiBibmMubCAkZGlzcDI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTk9UQkkgKENQVSAoaF9jb25kKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JORSkgOiAvKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQlJBOCkgOiAvKiBicmEucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CUkEyNCkgOiAvKiBicmEubCAkZGlzcDI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVApIDogLyogY21wICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QSSkgOiAvKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBVKSA6IC8qIGNtcHUgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QVUkpIDogLyogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUVVNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ESVYpIDogLyogZGl2ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fRElWVSkgOiAvKiBkaXZ1ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBVRElWU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFTSkgOiAvKiByZW0gJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IE1PRFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SRU1VKSA6IC8qIHJlbXUgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fSkwpIDogLyogamwgJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9qbC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtVU0kgdGVtcDE7Ci0gIHRlbXAwID0gQUREU0kgKEFORFNJIChwYywgLTQpLCA0KTsKLSAgdGVtcDEgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCAtNCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IHRlbXAxOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fSk1QKSA6IC8qIGptcCAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEKSA6IC8qIGxkICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX0QpIDogLyogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERCKSA6IC8qIGxkYiAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERCX0QpIDogLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREgpIDogLyogbGRoICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREhfRCkgOiAvKiBsZGggJGRyLEAoJHNsbzE2LCRzcikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVUIpIDogLyogbGR1YiAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEVUJfRCkgOiAvKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWkVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERVSCkgOiAvKiBsZHVoICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWkVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERVSF9EKSA6IC8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRF9QTFVTKSA6IC8qIGxkICRkcixAJHNyKyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO1NJIHRlbXAxOwotICB0ZW1wMCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gQUREU0kgKCogRkxEIChpX3NyKSwgNCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAxOwotICAgICogRkxEIChpX3NyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTEQyNCkgOiAvKiBsZDI0ICRkciwkdWltbTI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChpX3VpbW0yNCk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREk4KSA6IC8qIGxkaTggJGRyLCRzaW1tOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9zaW1tOCk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREkxNikgOiAvKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGZfc2ltbTE2KTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xPQ0spIDogLyogbG9jayAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDE7Ci0gICAgQ1BVIChoX2xvY2spID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImxvY2siLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTUFDSEkpIDogLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTVVMREkgKEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMxKSwgMHhmZmZmMDAwMCkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NQUNMTykgOiAvKiBtYWNsbyAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NQUNXSEkpIDogLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChBRERESSAoR0VUX0hfQUNDVU0gKCksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01BQ1dMTykgOiAvKiBtYWN3bG8gJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSksIDgpLCA4KTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMKSA6IC8qIG11bCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMSEkpIDogLyogbXVsaGkgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJIChBTkRTSSAoKiBGTEQgKGlfc3JjMSksIDB4ZmZmZjAwMDApKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSwgMTYpLCAxNik7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01VTExPKSA6IC8qIG11bGxvICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCAxNiksIDE2KTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMV0hJKSA6IC8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxXTE8pIDogLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01WKSA6IC8qIG12ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcik7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZBQ0hJKSA6IC8qIG12ZmFjaGkgJGRyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkFESSAoR0VUX0hfQUNDVU0gKCksIDMyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZBQ0xPKSA6IC8qIG12ZmFjbG8gJGRyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChHRVRfSF9BQ0NVTSAoKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZBQ01JKSA6IC8qIG12ZmFjbWkgJGRyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zZXRoLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkFESSAoR0VUX0hfQUNDVU0gKCksIDE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZDKSA6IC8qIG12ZmMgJGRyLCRzY3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRfSF9DUiAoRkxEIChmX3IyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVlRBQ0hJKSA6IC8qIG12dGFjaGkgJHNyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBPUkRJIChBTkRESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMCwgMHhmZmZmZmZmZikpLCBTTExESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCAzMikpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVlRBQ0xPKSA6IC8qIG12dGFjbG8gJHNyYzEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBPUkRJIChBTkRESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMHhmZmZmZmZmZiwgMCkpLCBaRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVZUQykgOiAvKiBtdnRjICRzciwkZGNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX3NyKTsKLSAgICBTRVRfSF9DUiAoRkxEIChmX3IxKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkY3IiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX05FRykgOiAvKiBuZWcgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FR1NJICgqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9QKSA6IC8qIG5vcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1QUk9GSUxFX0NPVU5UX0ZJTExOT1BTIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkcik7Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTk9UKSA6IC8qIG5vdCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gSU5WU0kgKCogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SQUMpIDogLyogcmFjICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgREkgdG1wX3RtcDE7Ci0gIHRtcF90bXAxID0gU0xMREkgKEdFVF9IX0FDQ1VNICgpLCAxKTsKLSAgdG1wX3RtcDEgPSBBRERESSAodG1wX3RtcDEsIE1BS0VESSAoMCwgMzI3NjgpKTsKLSAgewotICAgIERJIG9wdmFsID0gKEdUREkgKHRtcF90bXAxLCBNQUtFREkgKDMyNzY3LCAweGZmZmYwMDAwKSkpID8gKE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSA6IChMVERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmY4MDAwLCAwKSkpID8gKE1BS0VESSAoMHhmZmZmODAwMCwgMCkpIDogKEFORERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmZmZmZmLCAweGZmZmYwMDAwKSkpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SQUNIKSA6IC8qIHJhY2ggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBESSB0bXBfdG1wMTsKLSAgdG1wX3RtcDEgPSBBTkRESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMTY3NzcyMTUsIDB4ZmZmZmZmZmYpKTsKLWlmIChBTkRJRiAoR0VESSAodG1wX3RtcDEsIE1BS0VESSAoMTYzODMsIDB4ODAwMDAwMDApKSwgTEVESSAodG1wX3RtcDEsIE1BS0VESSAoODM4ODYwNywgMHhmZmZmZmZmZikpKSkgewotICB0bXBfdG1wMSA9IE1BS0VESSAoMTYzODMsIDB4ODAwMDAwMDApOwotfSBlbHNlIHsKLWlmIChBTkRJRiAoR0VESSAodG1wX3RtcDEsIE1BS0VESSAoODM4ODYwOCwgMCkpLCBMRURJICh0bXBfdG1wMSwgTUFLRURJICgxNjc2MDgzMiwgMCkpKSkgewotICB0bXBfdG1wMSA9IE1BS0VESSAoMTY3NjA4MzIsIDApOwotfSBlbHNlIHsKLSAgdG1wX3RtcDEgPSBBTkRESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDAsIDEwNzM3NDE4MjQpKSwgTUFLRURJICgweGZmZmZmZmZmLCAweDgwMDAwMDAwKSk7Ci19Ci19Ci0gIHRtcF90bXAxID0gU0xMREkgKHRtcF90bXAxLCAxKTsKLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJICh0bXBfdG1wMSwgNyksIDcpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SVEUpIDogLyogcnRlICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBTkRTSSAoR0VUX0hfQ1IgKCgoVUlOVCkgNikpLCAtNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBHRVRfSF9DUiAoKChVSU5UKSAxNCkpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2Jwc3cpOwotICAgIFNFVF9IX1BTVyAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2JicHN3KTsKLSAgICBDUFUgKGhfYnBzdykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TRVRIKSA6IC8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX2hpMTYpLCAxNik7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TTEwpIDogLyogc2xsICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TTEwzKSA6IC8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX3NyKSwgQU5EU0kgKEZMRCAoZl9zaW1tMTYpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0xMSSkgOiAvKiBzbGxpICRkciwkdWltbTUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSQSkgOiAvKiBzcmEgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSQTMpIDogLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfc3IpLCBBTkRTSSAoRkxEIChmX3NpbW0xNiksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TUkFJKSA6IC8qIHNyYWkgJGRyLCR1aW1tNSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1JMKSA6IC8qIHNybCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1JMMykgOiAvKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9zciksIEFORFNJIChGTEQgKGZfc2ltbTE2KSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSTEkpIDogLyogc3JsaSAkZHIsJHVpbW01ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVCkgOiAvKiBzdCAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX0QpIDogLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVEIpIDogLyogc3RiICRzcmMxLEAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RCX0QpIDogLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RIKSA6IC8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUSF9EKSA6IC8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX1BMVVMpIDogLyogc3QgJHNyYzEsQCskc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9uZXdfc3JjMjsKLSAgdG1wX25ld19zcmMyID0gQUREU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKLSAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9NSU5VUykgOiAvKiBzdCAkc3JjMSxALSRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX25ld19zcmMyOwotICB0bXBfbmV3X3NyYzIgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksIDQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfbmV3X3NyYzIsIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX25ld19zcmMyOwotICAgICogRkxEIChpX3NyYzIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyYzIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQikgOiAvKiBzdWIgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQlYpIDogLyogc3VidiAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICB0ZW1wMSA9IFNVQk9GU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCAwKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQlgpIDogLyogc3VieCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJDU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB0ZW1wMSA9IFNVQkNGU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fVFJBUCkgOiAvKiB0cmFwICR1aW1tNCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdHJhcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgNikpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDE0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2Jwc3cpOwotICAgIENQVSAoaF9iYnBzdykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYmJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gR0VUX0hfUFNXICgpOwotICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IEFORFFJIChHRVRfSF9QU1cgKCksIDEyOCk7Ci0gICAgU0VUX0hfUFNXIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IG0zMnJfdHJhcCAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfdWltbTQpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1VOTE9DSykgOiAvKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfbG9jaykpIHsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9sb2NrKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJsb2NrIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotCi0gICAgfQotICBFTkRTV0lUQ0ggKHNlbSkgLyogRW5kIG9mIHNlbWFudGljIHN3aXRjaC4gICovCi0KLSAgLyogQXQgdGhpcyBwb2ludCBgdnBjJyBjb250YWlucyB0aGUgbmV4dCBpbnNuIHRvIGV4ZWN1dGUuICAqLwotfQotCi0jdW5kZWYgREVGSU5FX1NXSVRDSAotI2VuZGlmIC8qIERFRklORV9TV0lUQ0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL3NlbS5jIGIvc2ltL20zMnIvc2VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTBhYmYuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvc2VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjk2ICswLDAgQEAKLS8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBzZW1hbnRpY3MgZm9yIG0zMnJiZi4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2RlZmluZSBXQU5UX0NQVSBtMzJyYmYKLSNkZWZpbmUgV0FOVF9DUFVfTTMyUkJGCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImNnZW4tbWVtLmgiCi0jaW5jbHVkZSAiY2dlbi1vcHMuaCIKLQotI3VuZGVmIEdFVF9BVFRSCi0jZGVmaW5lIEdFVF9BVFRSKGNwdSwgbnVtLCBhdHRyKSBDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGFidWYtPmlkZXNjLT5hdHRycywgQ0dFTl9JTlNOXyMjYXR0cikKLQotLyogVGhpcyBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIGNvbXBpbGUgdHdvIGNvcGllcyBvZiB0aGUgc2VtYW50aWMgY29kZSwKLSAgIG9uZSB3aXRoIGZ1bGwgZmVhdHVyZSBzdXBwb3J0IGFuZCBvbmUgd2l0aG91dCB0aGF0IHJ1bnMgZmFzdChlcikuCi0gICBGQVNUX1AsIHdoZW4gZGVzaXJlZCwgaXMgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCAtREZBU1RfUD0xLiAgKi8KLSNpZiBGQVNUX1AKLSNkZWZpbmUgU0VNX0ZOX05BTUUoY3B1LGZuKSBYQ09OQ0FUMyAoY3B1LF9zZW1mXyxmbikKLSN1bmRlZiBUUkFDRV9SRVNVTFQKLSNkZWZpbmUgVFJBQ0VfUkVTVUxUKGNwdSwgYWJ1ZiwgbmFtZSwgdHlwZSwgdmFsKQotI2Vsc2UKLSNkZWZpbmUgU0VNX0ZOX05BTUUoY3B1LGZuKSBYQ09OQ0FUMyAoY3B1LF9zZW1fLGZuKQotI2VuZGlmCi0KLS8qIHgtaW52YWxpZDogLS1pbnZhbGlkLS0gKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZix4X2ludmFsaWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotICAgIC8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgcGMgaW4gdGhlIGNwdSBzdGF0ZSBzdHJ1Y3QuCi0gICAgICAgT25seSBuZWNlc3NhcnkgZm9yIFdJVEhfU0NBQ0hFIGNhc2UsIGJ1dCB0byBhdm9pZCB0aGUKLSAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiAuLi4uICAqLwotICAgIFNFVF9IX1BDIChwYyk7Ci0gICAgLyogVmlydHVhbCBpbnNucyBoYXZlIHplcm8gc2l6ZS4gIE92ZXJ3cml0ZSB2cGMgd2l0aCBhZGRyZXNzIG9mIG5leHQgaW5zbgotICAgICAgIHVzaW5nIHRoZSBkZWZhdWx0LWluc24tYml0c2l6ZSBzcGVjLiAgV2hlbiBleGVjdXRpbmcgaW5zbnMgaW4gcGFyYWxsZWwKLSAgICAgICB3ZSBtYXkgd2FudCB0byBxdWV1ZSB0aGUgZmF1bHQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gICovCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0gICAgdnBjID0gc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYywgdnBjKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtYWZ0ZXI6IC0tYWZ0ZXItLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHhfYWZ0ZXIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSAgICBtMzJyYmZfcGJiX2FmdGVyIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtYmVmb3JlOiAtLWJlZm9yZS0tICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYseF9iZWZvcmUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSAgICBtMzJyYmZfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOwotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB4LWN0aS1jaGFpbjogLS1jdGktY2hhaW4tLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHhfY3RpX2NoYWluKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCi0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIHZwYyA9IG0zMnJiZl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKLQkJCSAgICAgICBwYmJfYnJfdHlwZSwgcGJiX2JyX25wYyk7Ci0gICAgQlJFQUsgKHNlbSk7Ci0jZWxzZQotICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCi0gICAgdnBjID0gbTMycmJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAotCQkJICAgICAgIENQVV9QQkJfQlJfVFlQRSAoY3VycmVudF9jcHUpLAotCQkJICAgICAgIENQVV9QQkJfQlJfTlBDIChjdXJyZW50X2NwdSkpOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtY2hhaW46IC0tY2hhaW4tLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHhfY2hhaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSAgICB2cGMgPSBtMzJyYmZfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIEJSRUFLIChzZW0pOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHgtYmVnaW46IC0tYmVnaW4tLSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHhfYmVnaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKLSAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLwotICAgIHZwYyA9IG0zMnJiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOwotI2Vsc2UKLSAgICB2cGMgPSBtMzJyYmZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKLSNlbmRpZgotI2VuZGlmCi0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGQ6IGFkZCAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsYWRkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZDM6IGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGFkZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYW5kOiBhbmQgJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGFuZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhbmQzOiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGFuZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3VpbW0xNikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogb3I6IG9yICRkciwkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG9yMzogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixvcjMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYW5kMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfdWltbTE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiB4b3I6IHhvciAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYseG9yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHhvcjM6IHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYseG9yMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hbmQzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfdWltbTE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBhZGRpOiBhZGRpICRkciwkc2ltbTggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixhZGRpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9kciksIEZMRCAoZl9zaW1tOCkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYWRkdjogYWRkdiAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsYWRkdikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IEFERFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gQURET0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIDApOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYWRkdjM6IGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGFkZHYzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKTsKLSAgdGVtcDEgPSBBRERPRlNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpLCAwKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGFkZHg6IGFkZHggJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGFkZHgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBBRERDU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB0ZW1wMSA9IEFERENGU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmM4OiBiYy5zICRkaXNwOCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJjOCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKENQVSAoaF9jb25kKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBiYzI0OiBiYy5sICRkaXNwMjQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixiYzI0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKENQVSAoaF9jb25kKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYmVxOiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJlcSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJlcXo6IGJlcXogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJlcXopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJnZXo6IGJnZXogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJnZXopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHRVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJndHo6IGJndHogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJndHopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChHVFNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsZXo6IGJsZXogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJsZXopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMRVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsdHo6IGJsdHogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJsdHopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChMVFNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJuZXo6IGJuZXogJHNyYzIsJGRpc3AxNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJuZXopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsODogYmwucyAkZGlzcDggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixibDgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKEFORFNJIChwYywgLTQpLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJsMjQ6IGJsLmwgJGRpc3AyNCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGJsMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogYm5jODogYm5jLnMgJGRpc3A4ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsYm5jOCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfY29uZCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJuYzI0OiBibmMubCAkZGlzcDI0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsYm5jMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTk9UQkkgKENQVSAoaF9jb25kKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJuZTogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixibmUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBicmE4OiBicmEucyAkZGlzcDggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixicmE4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGJyYTI0OiBicmEubCAkZGlzcDI0ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsYnJhMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXA6IGNtcCAkc3JjMSwkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGNtcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXBpOiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixjbXBpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSk7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGNtcHU6IGNtcHUgJHNyYzEsJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixjbXB1KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUVVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBjbXB1aTogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGNtcHVpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUVVNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkaXY6IGRpdiAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsZGl2KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBkaXZ1OiBkaXZ1ICRkciwkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixkaXZ1KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmVtOiByZW0gJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHJlbSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBNT0RTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmVtdTogcmVtdSAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYscmVtdSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSBVTU9EU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGpsOiBqbCAkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixqbCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9qbC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO1VTSSB0ZW1wMTsKLSAgdGVtcDAgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOwotICB0ZW1wMSA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gdGVtcDE7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBqbXA6IGptcCAkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixqbXApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCAtNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZDogbGQgJGRyLEAkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQtZDogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZF9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGI6IGxkYiAkZHIsQCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGxkYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkYi1kOiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZGJfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkaDogbGRoICRkcixAJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbGRoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGRoLWQ6IGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGxkaF9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGR1YjogbGR1YiAkZHIsQCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGxkdWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWkVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGR1Yi1kOiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbGR1Yl9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkdWg6IGxkdWggJGRyLEAkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIGxkdWgtZDogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGxkdWhfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZC1wbHVzOiBsZCAkZHIsQCRzcisgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZF9wbHVzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO1NJIHRlbXAxOwotICB0ZW1wMCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gQUREU0kgKCogRkxEIChpX3NyKSwgNCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAxOwotICAgICogRkxEIChpX3NyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbGQyNDogbGQyNCAkZHIsJHVpbW0yNCAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLGxkMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGQyNC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChpX3VpbW0yNCk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGk4OiBsZGk4ICRkciwkc2ltbTggKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixsZGk4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9zaW1tOCk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsZGkxNjogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbGRpMTYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NpbW0xNik7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBsb2NrOiBsb2NrICRkcixAJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbG9jaykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSAxOwotICAgIENQVSAoaF9sb2NrKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJsb2NrIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1hY2hpOiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG1hY2hpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoQU5EU0kgKCogRkxEIChpX3NyYzEpLCAweGZmZmYwMDAwKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG1hY2xvOiBtYWNsbyAkc3JjMSwkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG1hY2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtYWN3aGk6IG1hY3doaSAkc3JjMSwkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG1hY3doaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSksIDgpLCA4KTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbWFjd2xvOiBtYWN3bG8gJHNyYzEsJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtYWN3bG8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChBRERESSAoR0VUX0hfQUNDVU0gKCksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG11bDogbXVsICRkciwkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdWwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXVsaGk6IG11bGhpICRzcmMxLCRzcmMyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbXVsaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoQU5EU0kgKCogRkxEIChpX3NyYzEpLCAweGZmZmYwMDAwKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSksIDE2KSwgMTYpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtdWxsbzogbXVsbG8gJHNyYzEsJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdWxsbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJIChTTExTSSAoKiBGTEQgKGlfc3JjMSksIDE2KSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSksIDE2KSwgMTYpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBtdWx3aGk6IG11bHdoaSAkc3JjMSwkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG11bHdoaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSksIDgpLCA4KTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXVsd2xvOiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdWx3bG8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG12OiBtdiAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbXYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZmYWNoaTogbXZmYWNoaSAkZHIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdmZhY2hpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JBREkgKEdFVF9IX0FDQ1VNICgpLCAzMikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZmYWNsbzogbXZmYWNsbyAkZHIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdmZhY2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoR0VUX0hfQUNDVU0gKCkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZmYWNtaTogbXZmYWNtaSAkZHIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdmZhY21pKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JBREkgKEdFVF9IX0FDQ1VNICgpLCAxNikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZmYzogbXZmYyAkZHIsJHNjciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG12ZmMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gR0VUX0hfQ1IgKEZMRCAoZl9yMikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZ0YWNoaTogbXZ0YWNoaSAkc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG12dGFjaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gT1JESSAoQU5EREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDAsIDB4ZmZmZmZmZmYpKSwgU0xMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgMzIpKTsKLSAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbXZ0YWNsbzogbXZ0YWNsbyAkc3JjMSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLG12dGFjbG8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gT1JESSAoQU5EREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDApKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSk7Ci0gICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIG12dGM6IG12dGMgJHNyLCRkY3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixtdnRjKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9zcik7Ci0gICAgU0VUX0hfQ1IgKEZMRCAoZl9yMSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZGNyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBuZWc6IG5lZyAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE5FR1NJICgqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogbm9wOiBub3AgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixub3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLVBST0ZJTEVfQ09VTlRfRklMTE5PUFMgKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyKTsKLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBub3Q6IG5vdCAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsbm90KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogcmFjOiByYWMgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixyYWMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgREkgdG1wX3RtcDE7Ci0gIHRtcF90bXAxID0gU0xMREkgKEdFVF9IX0FDQ1VNICgpLCAxKTsKLSAgdG1wX3RtcDEgPSBBRERESSAodG1wX3RtcDEsIE1BS0VESSAoMCwgMzI3NjgpKTsKLSAgewotICAgIERJIG9wdmFsID0gKEdUREkgKHRtcF90bXAxLCBNQUtFREkgKDMyNzY3LCAweGZmZmYwMDAwKSkpID8gKE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSA6IChMVERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmY4MDAwLCAwKSkpID8gKE1BS0VESSAoMHhmZmZmODAwMCwgMCkpIDogKEFORERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmZmZmZmLCAweGZmZmYwMDAwKSkpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiByYWNoOiByYWNoICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYscmFjaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBESSB0bXBfdG1wMTsKLSAgdG1wX3RtcDEgPSBBTkRESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMTY3NzcyMTUsIDB4ZmZmZmZmZmYpKTsKLWlmIChBTkRJRiAoR0VESSAodG1wX3RtcDEsIE1BS0VESSAoMTYzODMsIDB4ODAwMDAwMDApKSwgTEVESSAodG1wX3RtcDEsIE1BS0VESSAoODM4ODYwNywgMHhmZmZmZmZmZikpKSkgewotICB0bXBfdG1wMSA9IE1BS0VESSAoMTYzODMsIDB4ODAwMDAwMDApOwotfSBlbHNlIHsKLWlmIChBTkRJRiAoR0VESSAodG1wX3RtcDEsIE1BS0VESSAoODM4ODYwOCwgMCkpLCBMRURJICh0bXBfdG1wMSwgTUFLRURJICgxNjc2MDgzMiwgMCkpKSkgewotICB0bXBfdG1wMSA9IE1BS0VESSAoMTY3NjA4MzIsIDApOwotfSBlbHNlIHsKLSAgdG1wX3RtcDEgPSBBTkRESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDAsIDEwNzM3NDE4MjQpKSwgTUFLRURJICgweGZmZmZmZmZmLCAweDgwMDAwMDAwKSk7Ci19Ci19Ci0gIHRtcF90bXAxID0gU0xMREkgKHRtcF90bXAxLCAxKTsKLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJICh0bXBfdG1wMSwgNyksIDcpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBydGU6IHJ0ZSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHJ0ZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIFVTSSBvcHZhbCA9IEFORFNJIChHRVRfSF9DUiAoKChVSU5UKSA2KSksIC00KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEdFVF9IX0NSICgoKFVJTlQpIDE0KSk7Ci0gICAgU0VUX0hfQ1IgKCgoVUlOVCkgNiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY3ItNiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVUUkgb3B2YWwgPSBDUFUgKGhfYnBzdyk7Ci0gICAgU0VUX0hfUFNXIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVUUkgb3B2YWwgPSBDUFUgKGhfYmJwc3cpOwotICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNldGg6IHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzZXRoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJIChGTEQgKGZfaGkxNiksIDE2KTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNsbDogc2xsICRkciwkc3IgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzbGwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc2xsMzogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzbGwzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9zciksIEFORFNJIChGTEQgKGZfc2ltbTE2KSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNsbGk6IHNsbGkgJGRyLCR1aW1tNSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHNsbGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzcmE6IHNyYSAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsc3JhKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHNyYTM6IHNyYTMgJGRyLCRzciwkc2ltbTE2ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsc3JhMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfc3IpLCBBTkRTSSAoRkxEIChmX3NpbW0xNiksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzcmFpOiBzcmFpICRkciwkdWltbTUgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzcmFpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3JsOiBzcmwgJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHNybCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzcmwzOiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHNybDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX3NyKSwgQU5EU0kgKEZMRCAoZl9zaW1tMTYpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3JsaTogc3JsaSAkZHIsJHVpbW01ICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsc3JsaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0OiBzdCAkc3JjMSxAJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LWQ6IHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHN0X2QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGI6IHN0YiAkc3JjMSxAJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzdGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdGItZDogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHN0Yl9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RoOiBzdGggJHNyYzEsQCRzcmMyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsc3RoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBISSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogc3RoLWQ6IHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzdGhfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN0LXBsdXM6IHN0ICRzcmMxLEArJHNyYzIgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZixzdF9wbHVzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9uZXdfc3JjMjsKLSAgdG1wX25ld19zcmMyID0gQUREU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKLSAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdC1taW51czogc3QgJHNyYzEsQC0kc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHN0X21pbnVzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9uZXdfc3JjMjsKLSAgdG1wX25ld19zcmMyID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKLSAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBzdWI6IHN1YiAkZHIsJHNyICovCi0KLXN0YXRpYyBTRU1fUEMKLVNFTV9GTl9OQU1FIChtMzJyYmYsc3ViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN1YnY6IHN1YnYgJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHN1YnYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICB0ZW1wMSA9IFNVQk9GU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCAwKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHN1Yng6IHN1YnggJGRyLCRzciAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHN1YngpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQotewotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJDU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB0ZW1wMSA9IFNVQkNGU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgcmV0dXJuIHZwYzsKLSN1bmRlZiBGTEQKLX0KLQotLyogdHJhcDogdHJhcCAkdWltbTQgKi8KLQotc3RhdGljIFNFTV9QQwotU0VNX0ZOX05BTUUgKG0zMnJiZix0cmFwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKLXsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3RyYXAuZgotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgNikpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDE0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2Jwc3cpOwotICAgIENQVSAoaF9iYnBzdykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYmJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gR0VUX0hfUFNXICgpOwotICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IEFORFFJIChHRVRfSF9QU1cgKCksIDEyOCk7Ci0gICAgU0VUX0hfUFNXIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IG0zMnJfdHJhcCAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfdWltbTQpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0gIHJldHVybiB2cGM7Ci0jdW5kZWYgRkxECi19Ci0KLS8qIHVubG9jazogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotCi1zdGF0aWMgU0VNX1BDCi1TRU1fRk5fTkFNRSAobTMycmJmLHVubG9jaykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCi17Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotaWYgKENQVSAoaF9sb2NrKSkgewotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgQ1BVIChoX2xvY2spID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImxvY2siLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICByZXR1cm4gdnBjOwotI3VuZGVmIEZMRAotfQotCi0vKiBUYWJsZSBvZiBhbGwgc2VtYW50aWMgZm5zLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZW1fZm5fZGVzYyBzZW1fZm5zW10gPSB7Ci0gIHsgTTMyUkJGX0lOU05fWF9JTlZBTElELCBTRU1fRk5fTkFNRSAobTMycmJmLHhfaW52YWxpZCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9YX0FGVEVSLCBTRU1fRk5fTkFNRSAobTMycmJmLHhfYWZ0ZXIpIH0sCi0gIHsgTTMyUkJGX0lOU05fWF9CRUZPUkUsIFNFTV9GTl9OQU1FIChtMzJyYmYseF9iZWZvcmUpIH0sCi0gIHsgTTMyUkJGX0lOU05fWF9DVElfQ0hBSU4sIFNFTV9GTl9OQU1FIChtMzJyYmYseF9jdGlfY2hhaW4pIH0sCi0gIHsgTTMyUkJGX0lOU05fWF9DSEFJTiwgU0VNX0ZOX05BTUUgKG0zMnJiZix4X2NoYWluKSB9LAotICB7IE0zMlJCRl9JTlNOX1hfQkVHSU4sIFNFTV9GTl9OQU1FIChtMzJyYmYseF9iZWdpbikgfSwKLSAgeyBNMzJSQkZfSU5TTl9BREQsIFNFTV9GTl9OQU1FIChtMzJyYmYsYWRkKSB9LAotICB7IE0zMlJCRl9JTlNOX0FERDMsIFNFTV9GTl9OQU1FIChtMzJyYmYsYWRkMykgfSwKLSAgeyBNMzJSQkZfSU5TTl9BTkQsIFNFTV9GTl9OQU1FIChtMzJyYmYsYW5kKSB9LAotICB7IE0zMlJCRl9JTlNOX0FORDMsIFNFTV9GTl9OQU1FIChtMzJyYmYsYW5kMykgfSwKLSAgeyBNMzJSQkZfSU5TTl9PUiwgU0VNX0ZOX05BTUUgKG0zMnJiZixvcikgfSwKLSAgeyBNMzJSQkZfSU5TTl9PUjMsIFNFTV9GTl9OQU1FIChtMzJyYmYsb3IzKSB9LAotICB7IE0zMlJCRl9JTlNOX1hPUiwgU0VNX0ZOX05BTUUgKG0zMnJiZix4b3IpIH0sCi0gIHsgTTMyUkJGX0lOU05fWE9SMywgU0VNX0ZOX05BTUUgKG0zMnJiZix4b3IzKSB9LAotICB7IE0zMlJCRl9JTlNOX0FEREksIFNFTV9GTl9OQU1FIChtMzJyYmYsYWRkaSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9BRERWLCBTRU1fRk5fTkFNRSAobTMycmJmLGFkZHYpIH0sCi0gIHsgTTMyUkJGX0lOU05fQUREVjMsIFNFTV9GTl9OQU1FIChtMzJyYmYsYWRkdjMpIH0sCi0gIHsgTTMyUkJGX0lOU05fQUREWCwgU0VNX0ZOX05BTUUgKG0zMnJiZixhZGR4KSB9LAotICB7IE0zMlJCRl9JTlNOX0JDOCwgU0VNX0ZOX05BTUUgKG0zMnJiZixiYzgpIH0sCi0gIHsgTTMyUkJGX0lOU05fQkMyNCwgU0VNX0ZOX05BTUUgKG0zMnJiZixiYzI0KSB9LAotICB7IE0zMlJCRl9JTlNOX0JFUSwgU0VNX0ZOX05BTUUgKG0zMnJiZixiZXEpIH0sCi0gIHsgTTMyUkJGX0lOU05fQkVRWiwgU0VNX0ZOX05BTUUgKG0zMnJiZixiZXF6KSB9LAotICB7IE0zMlJCRl9JTlNOX0JHRVosIFNFTV9GTl9OQU1FIChtMzJyYmYsYmdleikgfSwKLSAgeyBNMzJSQkZfSU5TTl9CR1RaLCBTRU1fRk5fTkFNRSAobTMycmJmLGJndHopIH0sCi0gIHsgTTMyUkJGX0lOU05fQkxFWiwgU0VNX0ZOX05BTUUgKG0zMnJiZixibGV6KSB9LAotICB7IE0zMlJCRl9JTlNOX0JMVFosIFNFTV9GTl9OQU1FIChtMzJyYmYsYmx0eikgfSwKLSAgeyBNMzJSQkZfSU5TTl9CTkVaLCBTRU1fRk5fTkFNRSAobTMycmJmLGJuZXopIH0sCi0gIHsgTTMyUkJGX0lOU05fQkw4LCBTRU1fRk5fTkFNRSAobTMycmJmLGJsOCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9CTDI0LCBTRU1fRk5fTkFNRSAobTMycmJmLGJsMjQpIH0sCi0gIHsgTTMyUkJGX0lOU05fQk5DOCwgU0VNX0ZOX05BTUUgKG0zMnJiZixibmM4KSB9LAotICB7IE0zMlJCRl9JTlNOX0JOQzI0LCBTRU1fRk5fTkFNRSAobTMycmJmLGJuYzI0KSB9LAotICB7IE0zMlJCRl9JTlNOX0JORSwgU0VNX0ZOX05BTUUgKG0zMnJiZixibmUpIH0sCi0gIHsgTTMyUkJGX0lOU05fQlJBOCwgU0VNX0ZOX05BTUUgKG0zMnJiZixicmE4KSB9LAotICB7IE0zMlJCRl9JTlNOX0JSQTI0LCBTRU1fRk5fTkFNRSAobTMycmJmLGJyYTI0KSB9LAotICB7IE0zMlJCRl9JTlNOX0NNUCwgU0VNX0ZOX05BTUUgKG0zMnJiZixjbXApIH0sCi0gIHsgTTMyUkJGX0lOU05fQ01QSSwgU0VNX0ZOX05BTUUgKG0zMnJiZixjbXBpKSB9LAotICB7IE0zMlJCRl9JTlNOX0NNUFUsIFNFTV9GTl9OQU1FIChtMzJyYmYsY21wdSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9DTVBVSSwgU0VNX0ZOX05BTUUgKG0zMnJiZixjbXB1aSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9ESVYsIFNFTV9GTl9OQU1FIChtMzJyYmYsZGl2KSB9LAotICB7IE0zMlJCRl9JTlNOX0RJVlUsIFNFTV9GTl9OQU1FIChtMzJyYmYsZGl2dSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9SRU0sIFNFTV9GTl9OQU1FIChtMzJyYmYscmVtKSB9LAotICB7IE0zMlJCRl9JTlNOX1JFTVUsIFNFTV9GTl9OQU1FIChtMzJyYmYscmVtdSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9KTCwgU0VNX0ZOX05BTUUgKG0zMnJiZixqbCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9KTVAsIFNFTV9GTl9OQU1FIChtMzJyYmYsam1wKSB9LAotICB7IE0zMlJCRl9JTlNOX0xELCBTRU1fRk5fTkFNRSAobTMycmJmLGxkKSB9LAotICB7IE0zMlJCRl9JTlNOX0xEX0QsIFNFTV9GTl9OQU1FIChtMzJyYmYsbGRfZCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9MREIsIFNFTV9GTl9OQU1FIChtMzJyYmYsbGRiKSB9LAotICB7IE0zMlJCRl9JTlNOX0xEQl9ELCBTRU1fRk5fTkFNRSAobTMycmJmLGxkYl9kKSB9LAotICB7IE0zMlJCRl9JTlNOX0xESCwgU0VNX0ZOX05BTUUgKG0zMnJiZixsZGgpIH0sCi0gIHsgTTMyUkJGX0lOU05fTERIX0QsIFNFTV9GTl9OQU1FIChtMzJyYmYsbGRoX2QpIH0sCi0gIHsgTTMyUkJGX0lOU05fTERVQiwgU0VNX0ZOX05BTUUgKG0zMnJiZixsZHViKSB9LAotICB7IE0zMlJCRl9JTlNOX0xEVUJfRCwgU0VNX0ZOX05BTUUgKG0zMnJiZixsZHViX2QpIH0sCi0gIHsgTTMyUkJGX0lOU05fTERVSCwgU0VNX0ZOX05BTUUgKG0zMnJiZixsZHVoKSB9LAotICB7IE0zMlJCRl9JTlNOX0xEVUhfRCwgU0VNX0ZOX05BTUUgKG0zMnJiZixsZHVoX2QpIH0sCi0gIHsgTTMyUkJGX0lOU05fTERfUExVUywgU0VNX0ZOX05BTUUgKG0zMnJiZixsZF9wbHVzKSB9LAotICB7IE0zMlJCRl9JTlNOX0xEMjQsIFNFTV9GTl9OQU1FIChtMzJyYmYsbGQyNCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9MREk4LCBTRU1fRk5fTkFNRSAobTMycmJmLGxkaTgpIH0sCi0gIHsgTTMyUkJGX0lOU05fTERJMTYsIFNFTV9GTl9OQU1FIChtMzJyYmYsbGRpMTYpIH0sCi0gIHsgTTMyUkJGX0lOU05fTE9DSywgU0VNX0ZOX05BTUUgKG0zMnJiZixsb2NrKSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ0hJLCBTRU1fRk5fTkFNRSAobTMycmJmLG1hY2hpKSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ0xPLCBTRU1fRk5fTkFNRSAobTMycmJmLG1hY2xvKSB9LAotICB7IE0zMlJCRl9JTlNOX01BQ1dISSwgU0VNX0ZOX05BTUUgKG0zMnJiZixtYWN3aGkpIH0sCi0gIHsgTTMyUkJGX0lOU05fTUFDV0xPLCBTRU1fRk5fTkFNRSAobTMycmJmLG1hY3dsbykgfSwKLSAgeyBNMzJSQkZfSU5TTl9NVUwsIFNFTV9GTl9OQU1FIChtMzJyYmYsbXVsKSB9LAotICB7IE0zMlJCRl9JTlNOX01VTEhJLCBTRU1fRk5fTkFNRSAobTMycmJmLG11bGhpKSB9LAotICB7IE0zMlJCRl9JTlNOX01VTExPLCBTRU1fRk5fTkFNRSAobTMycmJmLG11bGxvKSB9LAotICB7IE0zMlJCRl9JTlNOX01VTFdISSwgU0VNX0ZOX05BTUUgKG0zMnJiZixtdWx3aGkpIH0sCi0gIHsgTTMyUkJGX0lOU05fTVVMV0xPLCBTRU1fRk5fTkFNRSAobTMycmJmLG11bHdsbykgfSwKLSAgeyBNMzJSQkZfSU5TTl9NViwgU0VNX0ZOX05BTUUgKG0zMnJiZixtdikgfSwKLSAgeyBNMzJSQkZfSU5TTl9NVkZBQ0hJLCBTRU1fRk5fTkFNRSAobTMycmJmLG12ZmFjaGkpIH0sCi0gIHsgTTMyUkJGX0lOU05fTVZGQUNMTywgU0VNX0ZOX05BTUUgKG0zMnJiZixtdmZhY2xvKSB9LAotICB7IE0zMlJCRl9JTlNOX01WRkFDTUksIFNFTV9GTl9OQU1FIChtMzJyYmYsbXZmYWNtaSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9NVkZDLCBTRU1fRk5fTkFNRSAobTMycmJmLG12ZmMpIH0sCi0gIHsgTTMyUkJGX0lOU05fTVZUQUNISSwgU0VNX0ZOX05BTUUgKG0zMnJiZixtdnRhY2hpKSB9LAotICB7IE0zMlJCRl9JTlNOX01WVEFDTE8sIFNFTV9GTl9OQU1FIChtMzJyYmYsbXZ0YWNsbykgfSwKLSAgeyBNMzJSQkZfSU5TTl9NVlRDLCBTRU1fRk5fTkFNRSAobTMycmJmLG12dGMpIH0sCi0gIHsgTTMyUkJGX0lOU05fTkVHLCBTRU1fRk5fTkFNRSAobTMycmJmLG5lZykgfSwKLSAgeyBNMzJSQkZfSU5TTl9OT1AsIFNFTV9GTl9OQU1FIChtMzJyYmYsbm9wKSB9LAotICB7IE0zMlJCRl9JTlNOX05PVCwgU0VNX0ZOX05BTUUgKG0zMnJiZixub3QpIH0sCi0gIHsgTTMyUkJGX0lOU05fUkFDLCBTRU1fRk5fTkFNRSAobTMycmJmLHJhYykgfSwKLSAgeyBNMzJSQkZfSU5TTl9SQUNILCBTRU1fRk5fTkFNRSAobTMycmJmLHJhY2gpIH0sCi0gIHsgTTMyUkJGX0lOU05fUlRFLCBTRU1fRk5fTkFNRSAobTMycmJmLHJ0ZSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9TRVRILCBTRU1fRk5fTkFNRSAobTMycmJmLHNldGgpIH0sCi0gIHsgTTMyUkJGX0lOU05fU0xMLCBTRU1fRk5fTkFNRSAobTMycmJmLHNsbCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9TTEwzLCBTRU1fRk5fTkFNRSAobTMycmJmLHNsbDMpIH0sCi0gIHsgTTMyUkJGX0lOU05fU0xMSSwgU0VNX0ZOX05BTUUgKG0zMnJiZixzbGxpKSB9LAotICB7IE0zMlJCRl9JTlNOX1NSQSwgU0VNX0ZOX05BTUUgKG0zMnJiZixzcmEpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1JBMywgU0VNX0ZOX05BTUUgKG0zMnJiZixzcmEzKSB9LAotICB7IE0zMlJCRl9JTlNOX1NSQUksIFNFTV9GTl9OQU1FIChtMzJyYmYsc3JhaSkgfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkwsIFNFTV9GTl9OQU1FIChtMzJyYmYsc3JsKSB9LAotICB7IE0zMlJCRl9JTlNOX1NSTDMsIFNFTV9GTl9OQU1FIChtMzJyYmYsc3JsMykgfSwKLSAgeyBNMzJSQkZfSU5TTl9TUkxJLCBTRU1fRk5fTkFNRSAobTMycmJmLHNybGkpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1QsIFNFTV9GTl9OQU1FIChtMzJyYmYsc3QpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1RfRCwgU0VNX0ZOX05BTUUgKG0zMnJiZixzdF9kKSB9LAotICB7IE0zMlJCRl9JTlNOX1NUQiwgU0VNX0ZOX05BTUUgKG0zMnJiZixzdGIpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1RCX0QsIFNFTV9GTl9OQU1FIChtMzJyYmYsc3RiX2QpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1RILCBTRU1fRk5fTkFNRSAobTMycmJmLHN0aCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9TVEhfRCwgU0VNX0ZOX05BTUUgKG0zMnJiZixzdGhfZCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9TVF9QTFVTLCBTRU1fRk5fTkFNRSAobTMycmJmLHN0X3BsdXMpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1RfTUlOVVMsIFNFTV9GTl9OQU1FIChtMzJyYmYsc3RfbWludXMpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1VCLCBTRU1fRk5fTkFNRSAobTMycmJmLHN1YikgfSwKLSAgeyBNMzJSQkZfSU5TTl9TVUJWLCBTRU1fRk5fTkFNRSAobTMycmJmLHN1YnYpIH0sCi0gIHsgTTMyUkJGX0lOU05fU1VCWCwgU0VNX0ZOX05BTUUgKG0zMnJiZixzdWJ4KSB9LAotICB7IE0zMlJCRl9JTlNOX1RSQVAsIFNFTV9GTl9OQU1FIChtMzJyYmYsdHJhcCkgfSwKLSAgeyBNMzJSQkZfSU5TTl9VTkxPQ0ssIFNFTV9GTl9OQU1FIChtMzJyYmYsdW5sb2NrKSB9LAotICB7IDAsIDAgfQotfTsKLQotLyogQWRkIHRoZSBzZW1hbnRpYyBmbnMgdG8gSURFU0NfVEFCTEUuICAqLwotCi12b2lkCi1TRU1fRk5fTkFNRSAobTMycmJmLGluaXRfaWRlc2NfdGFibGUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKLXsKLSAgSURFU0MgKmlkZXNjX3RhYmxlID0gQ1BVX0lERVNDIChjdXJyZW50X2NwdSk7Ci0gIGNvbnN0IHN0cnVjdCBzZW1fZm5fZGVzYyAqc2Y7Ci0gIGludCBtYWNoX251bSA9IE1BQ0hfTlVNIChDUFVfTUFDSCAoY3VycmVudF9jcHUpKTsKLQotICBmb3IgKHNmID0gJnNlbV9mbnNbMF07IHNmLT5mbiAhPSAwOyArK3NmKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlkZXNjX3RhYmxlW3NmLT5pbmRleF0uaWRhdGE7Ci0gICAgICBpbnQgdmFsaWRfcCA9IChDR0VOX0lOU05fVklSVFVBTF9QIChpbnNuKQotCQkgICAgIHx8IENHRU5fSU5TTl9NQUNIX0hBU19QIChpbnNuLCBtYWNoX251bSkpOwotI2lmIEZBU1RfUAotICAgICAgaWYgKHZhbGlkX3ApCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZmFzdCA9IHNmLT5mbjsKLSAgICAgIGVsc2UKLQlpZGVzY190YWJsZVtzZi0+aW5kZXhdLnNlbV9mYXN0ID0gU0VNX0ZOX05BTUUgKG0zMnJiZix4X2ludmFsaWQpOwotI2Vsc2UKLSAgICAgIGlmICh2YWxpZF9wKQotCWlkZXNjX3RhYmxlW3NmLT5pbmRleF0uc2VtX2Z1bGwgPSBzZi0+Zm47Ci0gICAgICBlbHNlCi0JaWRlc2NfdGFibGVbc2YtPmluZGV4XS5zZW1fZnVsbCA9IFNFTV9GTl9OQU1FIChtMzJyYmYseF9pbnZhbGlkKTsKLSNlbmRpZgotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvc2VteC1zd2l0Y2guYyBiL3NpbS9tMzJyL3NlbXgtc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OGQxOGIuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvc2VteC1zd2l0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDYyNjYgKzAsMCBAQAotLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIHNlbWFudGljcyBmb3IgbTMycnhmLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZkZWYgREVGSU5FX0xBQkVMUwotCi0gIC8qIFRoZSBsYWJlbHMgaGF2ZSB0aGUgY2FzZSB0aGV5IGhhdmUgYmVjYXVzZSB0aGUgZW51bSBvZiBpbnNuIHR5cGVzCi0gICAgIGlzIGFsbCB1cHBlcmNhc2UgYW5kIGluIHRoZSBub24tc3RkYyBjYXNlIHRoZSBpbnNuIHN5bWJvbCBpcyBidWlsdAotICAgICBpbnRvIHRoZSBlbnVtIG5hbWUuICAqLwotCi0gIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludCBpbmRleDsKLSAgICB2b2lkICpsYWJlbDsKLSAgfSBsYWJlbHNbXSA9IHsKLSAgICB7IE0zMlJYRl9JTlNOX1hfSU5WQUxJRCwgJiYgY2FzZV9zZW1fSU5TTl9YX0lOVkFMSUQgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1hfQUZURVIsICYmIGNhc2Vfc2VtX0lOU05fWF9BRlRFUiB9LAotICAgIHsgTTMyUlhGX0lOU05fWF9CRUZPUkUsICYmIGNhc2Vfc2VtX0lOU05fWF9CRUZPUkUgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1hfQ1RJX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ1RJX0NIQUlOIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9YX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ0hBSU4gfSwKLSAgICB7IE0zMlJYRl9JTlNOX1hfQkVHSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9CRUdJTiB9LAotICAgIHsgTTMyUlhGX0lOU05fQURELCAmJiBjYXNlX3NlbV9JTlNOX0FERCB9LAotICAgIHsgTTMyUlhGX0lOU05fQUREMywgJiYgY2FzZV9zZW1fSU5TTl9BREQzIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9BTkQsICYmIGNhc2Vfc2VtX0lOU05fQU5EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9BTkQzLCAmJiBjYXNlX3NlbV9JTlNOX0FORDMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX09SLCAmJiBjYXNlX3NlbV9JTlNOX09SIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9PUjMsICYmIGNhc2Vfc2VtX0lOU05fT1IzIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9YT1IsICYmIGNhc2Vfc2VtX0lOU05fWE9SIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9YT1IzLCAmJiBjYXNlX3NlbV9JTlNOX1hPUjMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0FEREksICYmIGNhc2Vfc2VtX0lOU05fQURESSB9LAotICAgIHsgTTMyUlhGX0lOU05fQUREViwgJiYgY2FzZV9zZW1fSU5TTl9BRERWIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9BRERWMywgJiYgY2FzZV9zZW1fSU5TTl9BRERWMyB9LAotICAgIHsgTTMyUlhGX0lOU05fQUREWCwgJiYgY2FzZV9zZW1fSU5TTl9BRERYIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CQzgsICYmIGNhc2Vfc2VtX0lOU05fQkM4IH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CQzI0LCAmJiBjYXNlX3NlbV9JTlNOX0JDMjQgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JFUSwgJiYgY2FzZV9zZW1fSU5TTl9CRVEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JFUVosICYmIGNhc2Vfc2VtX0lOU05fQkVRWiB9LAotICAgIHsgTTMyUlhGX0lOU05fQkdFWiwgJiYgY2FzZV9zZW1fSU5TTl9CR0VaIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CR1RaLCAmJiBjYXNlX3NlbV9JTlNOX0JHVFogfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JMRVosICYmIGNhc2Vfc2VtX0lOU05fQkxFWiB9LAotICAgIHsgTTMyUlhGX0lOU05fQkxUWiwgJiYgY2FzZV9zZW1fSU5TTl9CTFRaIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CTkVaLCAmJiBjYXNlX3NlbV9JTlNOX0JORVogfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JMOCwgJiYgY2FzZV9zZW1fSU5TTl9CTDggfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JMMjQsICYmIGNhc2Vfc2VtX0lOU05fQkwyNCB9LAotICAgIHsgTTMyUlhGX0lOU05fQkNMOCwgJiYgY2FzZV9zZW1fSU5TTl9CQ0w4IH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CQ0wyNCwgJiYgY2FzZV9zZW1fSU5TTl9CQ0wyNCB9LAotICAgIHsgTTMyUlhGX0lOU05fQk5DOCwgJiYgY2FzZV9zZW1fSU5TTl9CTkM4IH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CTkMyNCwgJiYgY2FzZV9zZW1fSU5TTl9CTkMyNCB9LAotICAgIHsgTTMyUlhGX0lOU05fQk5FLCAmJiBjYXNlX3NlbV9JTlNOX0JORSB9LAotICAgIHsgTTMyUlhGX0lOU05fQlJBOCwgJiYgY2FzZV9zZW1fSU5TTl9CUkE4IH0sCi0gICAgeyBNMzJSWEZfSU5TTl9CUkEyNCwgJiYgY2FzZV9zZW1fSU5TTl9CUkEyNCB9LAotICAgIHsgTTMyUlhGX0lOU05fQk5DTDgsICYmIGNhc2Vfc2VtX0lOU05fQk5DTDggfSwKLSAgICB7IE0zMlJYRl9JTlNOX0JOQ0wyNCwgJiYgY2FzZV9zZW1fSU5TTl9CTkNMMjQgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0NNUCwgJiYgY2FzZV9zZW1fSU5TTl9DTVAgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0NNUEksICYmIGNhc2Vfc2VtX0lOU05fQ01QSSB9LAotICAgIHsgTTMyUlhGX0lOU05fQ01QVSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBVIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9DTVBVSSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBVSSB9LAotICAgIHsgTTMyUlhGX0lOU05fQ01QRVEsICYmIGNhc2Vfc2VtX0lOU05fQ01QRVEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0NNUFosICYmIGNhc2Vfc2VtX0lOU05fQ01QWiB9LAotICAgIHsgTTMyUlhGX0lOU05fRElWLCAmJiBjYXNlX3NlbV9JTlNOX0RJViB9LAotICAgIHsgTTMyUlhGX0lOU05fRElWVSwgJiYgY2FzZV9zZW1fSU5TTl9ESVZVIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9SRU0sICYmIGNhc2Vfc2VtX0lOU05fUkVNIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9SRU1VLCAmJiBjYXNlX3NlbV9JTlNOX1JFTVUgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0RJVkgsICYmIGNhc2Vfc2VtX0lOU05fRElWSCB9LAotICAgIHsgTTMyUlhGX0lOU05fSkMsICYmIGNhc2Vfc2VtX0lOU05fSkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0pOQywgJiYgY2FzZV9zZW1fSU5TTl9KTkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0pMLCAmJiBjYXNlX3NlbV9JTlNOX0pMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9KTVAsICYmIGNhc2Vfc2VtX0lOU05fSk1QIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MRCwgJiYgY2FzZV9zZW1fSU5TTl9MRCB9LAotICAgIHsgTTMyUlhGX0lOU05fTERfRCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MREIsICYmIGNhc2Vfc2VtX0lOU05fTERCIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MREJfRCwgJiYgY2FzZV9zZW1fSU5TTl9MREJfRCB9LAotICAgIHsgTTMyUlhGX0lOU05fTERILCAmJiBjYXNlX3NlbV9JTlNOX0xESCB9LAotICAgIHsgTTMyUlhGX0lOU05fTERIX0QsICYmIGNhc2Vfc2VtX0lOU05fTERIX0QgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0xEVUIsICYmIGNhc2Vfc2VtX0lOU05fTERVQiB9LAotICAgIHsgTTMyUlhGX0lOU05fTERVQl9ELCAmJiBjYXNlX3NlbV9JTlNOX0xEVUJfRCB9LAotICAgIHsgTTMyUlhGX0lOU05fTERVSCwgJiYgY2FzZV9zZW1fSU5TTl9MRFVIIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MRFVIX0QsICYmIGNhc2Vfc2VtX0lOU05fTERVSF9EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MRF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX0xEX1BMVVMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX0xEMjQsICYmIGNhc2Vfc2VtX0lOU05fTEQyNCB9LAotICAgIHsgTTMyUlhGX0lOU05fTERJOCwgJiYgY2FzZV9zZW1fSU5TTl9MREk4IH0sCi0gICAgeyBNMzJSWEZfSU5TTl9MREkxNiwgJiYgY2FzZV9zZW1fSU5TTl9MREkxNiB9LAotICAgIHsgTTMyUlhGX0lOU05fTE9DSywgJiYgY2FzZV9zZW1fSU5TTl9MT0NLIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NQUNISV9BLCAmJiBjYXNlX3NlbV9JTlNOX01BQ0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX01BQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fTUFDTE9fQSB9LAotICAgIHsgTTMyUlhGX0lOU05fTUFDV0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fTUFDV0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX01BQ1dMT19BLCAmJiBjYXNlX3NlbV9JTlNOX01BQ1dMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NVUwsICYmIGNhc2Vfc2VtX0lOU05fTVVMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NVUxISV9BLCAmJiBjYXNlX3NlbV9JTlNOX01VTEhJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX01VTExPX0EsICYmIGNhc2Vfc2VtX0lOU05fTVVMTE9fQSB9LAotICAgIHsgTTMyUlhGX0lOU05fTVVMV0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fTVVMV0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX01VTFdMT19BLCAmJiBjYXNlX3NlbV9JTlNOX01VTFdMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NViwgJiYgY2FzZV9zZW1fSU5TTl9NViB9LAotICAgIHsgTTMyUlhGX0lOU05fTVZGQUNISV9BLCAmJiBjYXNlX3NlbV9JTlNOX01WRkFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fTVZGQUNMT19BLCAmJiBjYXNlX3NlbV9JTlNOX01WRkFDTE9fQSB9LAotICAgIHsgTTMyUlhGX0lOU05fTVZGQUNNSV9BLCAmJiBjYXNlX3NlbV9JTlNOX01WRkFDTUlfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fTVZGQywgJiYgY2FzZV9zZW1fSU5TTl9NVkZDIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NVlRBQ0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fTVZUQUNISV9BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NVlRBQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fTVZUQUNMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NVlRDLCAmJiBjYXNlX3NlbV9JTlNOX01WVEMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX05FRywgJiYgY2FzZV9zZW1fSU5TTl9ORUcgfSwKLSAgICB7IE0zMlJYRl9JTlNOX05PUCwgJiYgY2FzZV9zZW1fSU5TTl9OT1AgfSwKLSAgICB7IE0zMlJYRl9JTlNOX05PVCwgJiYgY2FzZV9zZW1fSU5TTl9OT1QgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1JBQ19EU0ksICYmIGNhc2Vfc2VtX0lOU05fUkFDX0RTSSB9LAotICAgIHsgTTMyUlhGX0lOU05fUkFDSF9EU0ksICYmIGNhc2Vfc2VtX0lOU05fUkFDSF9EU0kgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1JURSwgJiYgY2FzZV9zZW1fSU5TTl9SVEUgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NFVEgsICYmIGNhc2Vfc2VtX0lOU05fU0VUSCB9LAotICAgIHsgTTMyUlhGX0lOU05fU0xMLCAmJiBjYXNlX3NlbV9JTlNOX1NMTCB9LAotICAgIHsgTTMyUlhGX0lOU05fU0xMMywgJiYgY2FzZV9zZW1fSU5TTl9TTEwzIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TTExJLCAmJiBjYXNlX3NlbV9JTlNOX1NMTEkgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NSQSwgJiYgY2FzZV9zZW1fSU5TTl9TUkEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NSQTMsICYmIGNhc2Vfc2VtX0lOU05fU1JBMyB9LAotICAgIHsgTTMyUlhGX0lOU05fU1JBSSwgJiYgY2FzZV9zZW1fSU5TTl9TUkFJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TUkwsICYmIGNhc2Vfc2VtX0lOU05fU1JMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TUkwzLCAmJiBjYXNlX3NlbV9JTlNOX1NSTDMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NSTEksICYmIGNhc2Vfc2VtX0lOU05fU1JMSSB9LAotICAgIHsgTTMyUlhGX0lOU05fU1QsICYmIGNhc2Vfc2VtX0lOU05fU1QgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NUX0QsICYmIGNhc2Vfc2VtX0lOU05fU1RfRCB9LAotICAgIHsgTTMyUlhGX0lOU05fU1RCLCAmJiBjYXNlX3NlbV9JTlNOX1NUQiB9LAotICAgIHsgTTMyUlhGX0lOU05fU1RCX0QsICYmIGNhc2Vfc2VtX0lOU05fU1RCX0QgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NUSCwgJiYgY2FzZV9zZW1fSU5TTl9TVEggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NUSF9ELCAmJiBjYXNlX3NlbV9JTlNOX1NUSF9EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TVF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX1NUX1BMVVMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NUX01JTlVTLCAmJiBjYXNlX3NlbV9JTlNOX1NUX01JTlVTIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TVUIsICYmIGNhc2Vfc2VtX0lOU05fU1VCIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TVUJWLCAmJiBjYXNlX3NlbV9JTlNOX1NVQlYgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NVQlgsICYmIGNhc2Vfc2VtX0lOU05fU1VCWCB9LAotICAgIHsgTTMyUlhGX0lOU05fVFJBUCwgJiYgY2FzZV9zZW1fSU5TTl9UUkFQIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9VTkxPQ0ssICYmIGNhc2Vfc2VtX0lOU05fVU5MT0NLIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9TQVRCLCAmJiBjYXNlX3NlbV9JTlNOX1NBVEIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NBVEgsICYmIGNhc2Vfc2VtX0lOU05fU0FUSCB9LAotICAgIHsgTTMyUlhGX0lOU05fU0FULCAmJiBjYXNlX3NlbV9JTlNOX1NBVCB9LAotICAgIHsgTTMyUlhGX0lOU05fUENNUEJaLCAmJiBjYXNlX3NlbV9JTlNOX1BDTVBCWiB9LAotICAgIHsgTTMyUlhGX0lOU05fU0FERCwgJiYgY2FzZV9zZW1fSU5TTl9TQUREIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NQUNXVTEsICYmIGNhc2Vfc2VtX0lOU05fTUFDV1UxIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9NU0JMTywgJiYgY2FzZV9zZW1fSU5TTl9NU0JMTyB9LAotICAgIHsgTTMyUlhGX0lOU05fTVVMV1UxLCAmJiBjYXNlX3NlbV9JTlNOX01VTFdVMSB9LAotICAgIHsgTTMyUlhGX0lOU05fTUFDTEgxLCAmJiBjYXNlX3NlbV9JTlNOX01BQ0xIMSB9LAotICAgIHsgTTMyUlhGX0lOU05fU0MsICYmIGNhc2Vfc2VtX0lOU05fU0MgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1NOQywgJiYgY2FzZV9zZW1fSU5TTl9TTkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9BREQsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0FERCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQURELCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0FERCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0FORCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfQU5EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9BTkQsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQU5EIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfT1IsICYmIGNhc2Vfc2VtX0lOU05fUEFSX09SIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9PUiwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9PUiB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1hPUiwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfWE9SIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9YT1IsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfWE9SIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfQURESSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfQURESSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQURESSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9BRERJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfQUREViwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfQUREViB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQUREViwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9BRERWIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfQUREWCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfQUREWCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQUREWCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9BRERYIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfQkM4LCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9CQzggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0JDOCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9CQzggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9CTDgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0JMOCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQkw4LCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0JMOCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0JDTDgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0JDTDggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0JDTDgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQkNMOCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0JOQzgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0JOQzggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0JOQzgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQk5DOCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0JSQTgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0JSQTggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0JSQTgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQlJBOCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0JOQ0w4LCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9CTkNMOCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQk5DTDgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQk5DTDggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9DTVAsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0NNUCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQ01QLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0NNUCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0NNUFUsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0NNUFUgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0NNUFUsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQ01QVSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0NNUEVRLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9DTVBFUSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfQ01QRVEsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfQ01QRVEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9DTVBaLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9DTVBaIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9DTVBaLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0NNUFogfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9KQywgJiYgY2FzZV9zZW1fSU5TTl9QQVJfSkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0pDLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0pDIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfSk5DLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9KTkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0pOQywgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9KTkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9KTCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfSkwgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0pMLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0pMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfSk1QLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9KTVAgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0pNUCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9KTVAgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9MRCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTEQgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xELCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0xEIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTERCLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9MREIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xEQiwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9MREIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9MREgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xESCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTERILCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX0xESCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0xEVUIsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xEVUIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xEVUIsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTERVQiB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0xEVUgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xEVUggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xEVUgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTERVSCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0xEX1BMVVMsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xEX1BMVVMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xEX1BMVVMsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTERfUExVUyB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0xESTgsICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xESTggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xESTgsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTERJOCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX0xPQ0ssICYmIGNhc2Vfc2VtX0lOU05fUEFSX0xPQ0sgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX0xPQ0ssICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTE9DSyB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01BQ0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01BQ0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01BQ0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTUFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01BQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01BQ0xPX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01BQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTUFDTE9fQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01BQ1dISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NQUNXSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTUFDV0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTUFDV0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NQUNXTE9fQSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTUFDV0xPX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01BQ1dMT19BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01BQ1dMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTVVMLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVUwgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01VTCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NVUwgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVUxISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVUxISV9BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVUxISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01VTEhJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVUxMT19BLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVUxMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVUxMT19BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01VTExPX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVUxXSElfQSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTVVMV0hJX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01VTFdISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01VTFdISV9BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTVVMV0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01VTFdMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVUxXTE9fQSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NVUxXTE9fQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01WLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NViB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTVYsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTVYgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVkZBQ0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01WRkFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTVZGQUNISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01WRkFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01WRkFDTE9fQSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTVZGQUNMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVkZBQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTVZGQUNMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTVZGQUNNSV9BLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVkZBQ01JX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01WRkFDTUlfQSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NVkZBQ01JX0EgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVkZDLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVkZDIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVkZDLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01WRkMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NVlRBQ0hJX0EsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01WVEFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTVZUQUNISV9BLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01WVEFDSElfQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX01WVEFDTE9fQSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTVZUQUNMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9NVlRBQ0xPX0EsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTVZUQUNMT19BIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTVZUQywgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTVZUQyB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTVZUQywgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NVlRDIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTkVHLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9ORUcgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX05FRywgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9ORUcgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9OT1AsICYmIGNhc2Vfc2VtX0lOU05fUEFSX05PUCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTk9QLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX05PUCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX05PVCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTk9UIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9OT1QsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfTk9UIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfUkFDX0RTSSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfUkFDX0RTSSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfUkFDX0RTSSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9SQUNfRFNJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfUkFDSF9EU0ksICYmIGNhc2Vfc2VtX0lOU05fUEFSX1JBQ0hfRFNJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9SQUNIX0RTSSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9SQUNIX0RTSSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1JURSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfUlRFIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9SVEUsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfUlRFIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU0xMLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TTEwgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX1NMTCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TTEwgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TTExJLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TTExJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TTExJLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NMTEkgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TUkEsICYmIGNhc2Vfc2VtX0lOU05fUEFSX1NSQSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfU1JBLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NSQSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1NSQUksICYmIGNhc2Vfc2VtX0lOU05fUEFSX1NSQUkgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX1NSQUksICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfU1JBSSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1NSTCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfU1JMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TUkwsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfU1JMIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU1JMSSwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfU1JMSSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfU1JMSSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TUkxJIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU1QsICYmIGNhc2Vfc2VtX0lOU05fUEFSX1NUIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TVCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TVCB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1NUQiwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfU1RCIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TVEIsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfU1RCIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU1RILCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TVEggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX1NUSCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TVEggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TVF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TVF9QTFVTIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TVF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NUX1BMVVMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TVF9NSU5VUywgJiYgY2FzZV9zZW1fSU5TTl9QQVJfU1RfTUlOVVMgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX1NUX01JTlVTLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NUX01JTlVTIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU1VCLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TVUIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX1NVQiwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TVUIgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TVUJWLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TVUJWIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TVUJWLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NVQlYgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TVUJYLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TVUJYIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9TVUJYLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NVQlggfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9UUkFQLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9UUkFQIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9UUkFQLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1RSQVAgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9VTkxPQ0ssICYmIGNhc2Vfc2VtX0lOU05fUEFSX1VOTE9DSyB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfVU5MT0NLLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1VOTE9DSyB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1BDTVBCWiwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfUENNUEJaIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9XUklURV9QQ01QQlosICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfUENNUEJaIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfU0FERCwgJiYgY2FzZV9zZW1fSU5TTl9QQVJfU0FERCB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfU0FERCwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9TQUREIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTUFDV1UxLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NQUNXVTEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01BQ1dVMSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NQUNXVTEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NU0JMTywgJiYgY2FzZV9zZW1fSU5TTl9QQVJfTVNCTE8gfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01TQkxPLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01TQkxPIH0sCi0gICAgeyBNMzJSWEZfSU5TTl9QQVJfTVVMV1UxLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9NVUxXVTEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1dSSVRFX01VTFdVMSwgJiYgY2FzZV9zZW1fSU5TTl9XUklURV9NVUxXVTEgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9NQUNMSDEsICYmIGNhc2Vfc2VtX0lOU05fUEFSX01BQ0xIMSB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfTUFDTEgxLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX01BQ0xIMSB9LAotICAgIHsgTTMyUlhGX0lOU05fUEFSX1NDLCAmJiBjYXNlX3NlbV9JTlNOX1BBUl9TQyB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfU0MsICYmIGNhc2Vfc2VtX0lOU05fV1JJVEVfU0MgfSwKLSAgICB7IE0zMlJYRl9JTlNOX1BBUl9TTkMsICYmIGNhc2Vfc2VtX0lOU05fUEFSX1NOQyB9LAotICAgIHsgTTMyUlhGX0lOU05fV1JJVEVfU05DLCAmJiBjYXNlX3NlbV9JTlNOX1dSSVRFX1NOQyB9LAotICAgIHsgMCwgMCB9Ci0gIH07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGxhYmVsc1tpXS5sYWJlbCAhPSAwOyArK2kpCi0gICAgewotI2lmIEZBU1RfUAotICAgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Zhc3RfbGFiID0gbGFiZWxzW2ldLmxhYmVsOwotI2Vsc2UKLSAgICAgIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtsYWJlbHNbaV0uaW5kZXhdLnNlbV9mdWxsX2xhYiA9IGxhYmVsc1tpXS5sYWJlbDsKLSNlbmRpZgotICAgIH0KLQotI3VuZGVmIERFRklORV9MQUJFTFMKLSNlbmRpZiAvKiBERUZJTkVfTEFCRUxTICovCi0KLSNpZmRlZiBERUZJTkVfU1dJVENICi0KLS8qIElmIGh5cGVyLWZhc3QgW3dlbGwgbm90IHVubmVjZXNzYXJpbHkgc2xvd10gZXhlY3V0aW9uIGlzIHNlbGVjdGVkLCB0dXJuCi0gICBvZmYgZnJpbGxzIGxpa2UgdHJhY2luZyBhbmQgcHJvZmlsaW5nLiAgKi8KLS8qIEZJWE1FOiBBIGJldHRlciB3YXkgd291bGQgYmUgdG8gaGF2ZSBUUkFDRV9SRVNVTFQgY2hlY2sgZm9yIHNvbWV0aGluZwotICAgdGhhdCBjYW4gY2F1c2UgaXQgdG8gYmUgb3B0aW1pemVkIG91dC4gIEFub3RoZXIgd2F5IHdvdWxkIGJlIHRvIGVtaXQKLSAgIHNwZWNpYWwgaGFuZGxlcnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gInN0cmVhbSIuICAqLwotCi0jaWYgRkFTVF9QCi0jdW5kZWYgVFJBQ0VfUkVTVUxUCi0jZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkKLSNlbmRpZgotCi0jdW5kZWYgR0VUX0FUVFIKLSNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQotCi17Ci0KLSNpZiBXSVRIX1NDQUNIRV9QQkIKLQotLyogQnJhbmNoIHRvIG5leHQgaGFuZGxlciB3aXRob3V0IGdvaW5nIGFyb3VuZCBtYWluIGxvb3AuICAqLwotI2RlZmluZSBORVhUKHZwYykgZ290byAqIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UKLVNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGICh2cGMpIC0+IHNlbWFudGljLnNlbV9jYXNlKQotCi0jZWxzZSAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0jZGVmaW5lIE5FWFQodnBjKSBCUkVBSyAoc2VtKQotI2lmZGVmIF9fR05VQ19fCi0jaWYgRkFTVF9QCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mYXN0X2xhYikKLSNlbHNlCi0gIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mdWxsX2xhYikKLSNlbmRpZgotI2Vsc2UKLSAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+bnVtKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLwotCi0gICAgewotCi0gIENBU0UgKHNlbSwgSU5TTl9YX0lOVkFMSUQpIDogLyogLS1pbnZhbGlkLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0gICAgLyogVXBkYXRlIHRoZSByZWNvcmRlZCBwYyBpbiB0aGUgY3B1IHN0YXRlIHN0cnVjdC4KLSAgICAgICBPbmx5IG5lY2Vzc2FyeSBmb3IgV0lUSF9TQ0FDSEUgY2FzZSwgYnV0IHRvIGF2b2lkIHRoZQotICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIC4uLi4gICovCi0gICAgU0VUX0hfUEMgKHBjKTsKLSAgICAvKiBWaXJ0dWFsIGluc25zIGhhdmUgemVybyBzaXplLiAgT3ZlcndyaXRlIHZwYyB3aXRoIGFkZHJlc3Mgb2YgbmV4dCBpbnNuCi0gICAgICAgdXNpbmcgdGhlIGRlZmF1bHQtaW5zbi1iaXRzaXplIHNwZWMuICBXaGVuIGV4ZWN1dGluZyBpbnNucyBpbiBwYXJhbGxlbAotICAgICAgIHdlIG1heSB3YW50IHRvIHF1ZXVlIHRoZSBmYXVsdCBhbmQgY29udGludWUgZXhlY3V0aW9uLiAgKi8KLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLSAgICB2cGMgPSBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjLCB2cGMpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9BRlRFUikgOiAvKiAtLWFmdGVyLS0gKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICB7Ci0jaWYgV0lUSF9TQ0FDSEVfUEJCX00zMlJYRgotICAgIG0zMnJ4Zl9wYmJfYWZ0ZXIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9CRUZPUkUpIDogLyogLS1iZWZvcmUtLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUlhGCi0gICAgbTMycnhmX3BiYl9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKLSNlbmRpZgotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fWF9DVElfQ0hBSU4pIDogLyogLS1jdGktY2hhaW4tLSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIHsKLSNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUlhGCi0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIHZwYyA9IG0zMnJ4Zl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKLQkJCSAgICAgICBwYmJfYnJfdHlwZSwgcGJiX2JyX25wYyk7Ci0gICAgQlJFQUsgKHNlbSk7Ci0jZWxzZQotICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCi0gICAgdnBjID0gbTMycnhmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAotCQkJICAgICAgIENQVV9QQkJfQlJfVFlQRSAoY3VycmVudF9jcHUpLAotCQkJICAgICAgIENQVV9QQkJfQlJfTlBDIChjdXJyZW50X2NwdSkpOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQ0hBSU4pIDogLyogLS1jaGFpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSWEYKLSAgICB2cGMgPSBtMzJyeGZfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7Ci0jaWZkZWYgREVGSU5FX1NXSVRDSAotICAgIEJSRUFLIChzZW0pOwotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVHSU4pIDogLyogLS1iZWdpbi0tICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgewotI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSWEYKLSNpZmRlZiBERUZJTkVfU1dJVENICi0gICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKLSAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLwotICAgIHZwYyA9IG0zMnJ4Zl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOwotI2Vsc2UKLSAgICB2cGMgPSBtMzJyeGZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKLSNlbmRpZgotI2VuZGlmCi0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BREQpIDogLyogYWRkICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BREQzKSA6IC8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORCkgOiAvKiBhbmQgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0FORDMpIDogLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfdWltbTE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUikgOiAvKiBvciAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9PUjMpIDogLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUikgOiAvKiB4b3IgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1hPUjMpIDogLyogeG9yMyAkZHIsJHNyLCR1aW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FuZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfdWltbTE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9BRERJKSA6IC8qIGFkZGkgJGRyLCRzaW1tOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9kciksIEZMRCAoZl9zaW1tOCkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQUREVikgOiAvKiBhZGR2ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IEFERFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gQURET0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIDApOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQUREVjMpIDogLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgU0kgdGVtcDA7QkkgdGVtcDE7Ci0gIHRlbXAwID0gQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpOwotICB0ZW1wMSA9IEFERE9GU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNiksIDApOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQUREWCkgOiAvKiBhZGR4ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IEFERENTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7Ci0gIHRlbXAxID0gQUREQ0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAwOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IHRlbXAxOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CQzgpIDogLyogYmMucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKENQVSAoaF9jb25kKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CQzI0KSA6IC8qIGJjLmwgJGRpc3AyNCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmwyNC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKENQVSAoaF9jb25kKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkVRKSA6IC8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9iZXEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChFUVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CRVFaKSA6IC8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoRVFTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CR0VaKSA6IC8qIGJnZXogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR0VTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CR1RaKSA6IC8qIGJndHogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoR1RTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTEVaKSA6IC8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTEVTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTFRaKSA6IC8qIGJsdHogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTFRTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkVaKSA6IC8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTDgpIDogLyogYmwucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQkwyNCkgOiAvKiBibC5sICRkaXNwMjQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLXsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CQ0w4KSA6IC8qIGJjbC5zICRkaXNwOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JDTDI0KSA6IC8qIGJjbC5sICRkaXNwMjQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChDUFUgKGhfY29uZCkpIHsKLXsKLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKLSAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JOQzgpIDogLyogYm5jLnMgJGRpc3A4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkMyNCkgOiAvKiBibmMubCAkZGlzcDI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTk9UQkkgKENQVSAoaF9jb25kKSkpIHsKLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0JORSkgOiAvKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmVxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi1pZiAoTkVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQlJBOCkgOiAvKiBicmEucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CUkEyNCkgOiAvKiBicmEubCAkZGlzcDI0ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDI0LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkNMOCkgOiAvKiBibmNsLnMgJGRpc3A4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9CTkNMMjQpIDogLyogYm5jbC5sICRkaXNwMjQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsMjQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICBTRU1fQlJBTkNIX0lOSVQKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgewotewotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QKSA6IC8qIGNtcCAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUEkpIDogLyogY21waSAkc3JjMiwkc2ltbTE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QVSkgOiAvKiBjbXB1ICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEJJIG9wdmFsID0gTFRVU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0NNUFVJKSA6IC8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBMVFVTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fQ01QRVEpIDogLyogY21wZXEgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOwotICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9DTVBaKSA6IC8qIGNtcHogJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9zcmMyKSwgMCk7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0RJVikgOiAvKiBkaXYgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ESVZVKSA6IC8qIGRpdnUgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUkVNKSA6IC8qIHJlbSAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKCogRkxEIChpX3NyKSwgMCkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JFTVUpIDogLyogcmVtdSAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotaWYgKE5FU0kgKCogRkxEIChpX3NyKSwgMCkpIHsKLSAgewotICAgIFNJIG9wdmFsID0gVU1PRFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9ESVZIKSA6IC8qIGRpdmggJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLWlmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7Ci0gIHsKLSAgICBTSSBvcHZhbCA9IERJVlNJIChFWFRISVNJIChUUlVOQ1NJSEkgKCogRkxEIChpX2RyKSkpLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fSkMpIDogLyogamMgJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCAtNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9KTkMpIDogLyogam5jICRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfY29uZCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCAtNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9KTCkgOiAvKiBqbCAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2psLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO1VTSSB0ZW1wMTsKLSAgdGVtcDAgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOwotICB0ZW1wMSA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gdGVtcDE7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9KTVApIDogLyogam1wICRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyKSwgLTQpOwotICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTEQpIDogLyogbGQgJGRyLEAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERfRCkgOiAvKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREIpIDogLyogbGRiICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MREJfRCkgOiAvKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESCkgOiAvKiBsZGggJGRyLEAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESF9EKSA6IC8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERVQikgOiAvKiBsZHViICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWkVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTERVQl9EKSA6IC8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBaRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFVIKSA6IC8qIGxkdWggJGRyLEAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRFVIX0QpIDogLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xEX1BMVVMpIDogLyogbGQgJGRyLEAkc3IrICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7U0kgdGVtcDE7Ci0gIHRlbXAwID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKLSAgdGVtcDEgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDE7Ci0gICAgKiBGTEQgKGlfc3IpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9MRDI0KSA6IC8qIGxkMjQgJGRyLCR1aW1tMjQgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkMjQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBGTEQgKGlfdWltbTI0KTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESTgpIDogLyogbGRpOCAkZHIsJHNpbW04ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NpbW04KTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX0xESTE2KSA6IC8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEZMRCAoZl9zaW1tMTYpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTE9DSykgOiAvKiBsb2NrICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgewotICAgIEJJIG9wdmFsID0gMTsKLSAgICBDUFUgKGhfbG9jaykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibG9jayIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NQUNISV9BKSA6IC8qIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpKSwgTVVMREkgKEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMxKSwgMHhmZmZmMDAwMCkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYyksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NQUNMT19BKSA6IC8qIG1hY2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpKSwgTVVMREkgKEVYVFNJREkgKFNMTFNJICgqIEZMRCAoaV9zcmMxKSwgMTYpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSksIDgpLCA4KTsKLSAgICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTUFDV0hJX0EpIDogLyogbWFjd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBBRERESSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSkpOwotICAgIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYyksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NQUNXTE9fQSkgOiAvKiBtYWN3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IEFERERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpKSwgTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSk7Ci0gICAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2MiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01VTCkgOiAvKiBtdWwgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01VTEhJX0EpIDogLyogbXVsaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMxKSwgMHhmZmZmMDAwMCkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpLCAxNiksIDE2KTsKLSAgICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMTE9fQSkgOiAvKiBtdWxsbyAkc3JjMSwkc3JjMiwkYWNjICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCAxNiksIDE2KTsKLSAgICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVVMV0hJX0EpIDogLyogbXVsd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpOwotICAgIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYyksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxXTE9fQSkgOiAvKiBtdWx3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSk7Ci0gICAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2MiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01WKSA6IC8qIG12ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcik7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZBQ0hJX0EpIDogLyogbXZmYWNoaSAkZHIsJGFjY3MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JBREkgKEdFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY3MpKSwgMzIpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01WRkFDTE9fQSkgOiAvKiBtdmZhY2xvICRkciwkYWNjcyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYWNoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVZGQUNNSV9BKSA6IC8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSQURJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIDE2KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVkZDKSA6IC8qIG12ZmMgJGRyLCRzY3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRfSF9DUiAoRkxEIChmX3IyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVlRBQ0hJX0EpIDogLyogbXZ0YWNoaSAkc3JjMSwkYWNjcyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0YWNoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gT1JESSAoQU5EREkgKEdFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY3MpKSwgTUFLRURJICgwLCAweGZmZmZmZmZmKSksIFNMTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIDMyKSk7Ci0gICAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjcyksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjcyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTVZUQUNMT19BKSA6IC8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IE9SREkgKEFORERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIE1BS0VESSAoMHhmZmZmZmZmZiwgMCkpLCBaRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2NzIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVlRDKSA6IC8qIG12dGMgJHNyLCRkY3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOwotICAgIFNFVF9IX0NSIChGTEQgKGZfcjEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRjciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTkVHKSA6IC8qIG5lZyAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gTkVHU0kgKCogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1ApIDogLyogbm9wICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLVBST0ZJTEVfQ09VTlRfRklMTE5PUFMgKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyKTsKLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9OT1QpIDogLyogbm90ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JBQ19EU0kpIDogLyogcmFjICRhY2NkLCRhY2NzLCRpbW0xICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9yYWNfZHNpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgREkgdG1wX3RtcDE7Ci0gIHRtcF90bXAxID0gU0xMREkgKEdFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY3MpKSwgRkxEIChmX2ltbTEpKTsKLSAgdG1wX3RtcDEgPSBBRERESSAodG1wX3RtcDEsIE1BS0VESSAoMCwgMzI3NjgpKTsKLSAgewotICAgIERJIG9wdmFsID0gKEdUREkgKHRtcF90bXAxLCBNQUtFREkgKDMyNzY3LCAweGZmZmYwMDAwKSkpID8gKE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSA6IChMVERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmY4MDAwLCAwKSkpID8gKE1BS0VESSAoMHhmZmZmODAwMCwgMCkpIDogKEFORERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmZmZmZmLCAweGZmZmYwMDAwKSkpOwotICAgIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY2QpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY2QiLCAnRCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1JBQ0hfRFNJKSA6IC8qIHJhY2ggJGFjY2QsJGFjY3MsJGltbTEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3JhY19kc2kuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBESSB0bXBfdG1wMTsKLSAgdG1wX3RtcDEgPSBTTExESSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjcykpLCBGTEQgKGZfaW1tMSkpOwotICB0bXBfdG1wMSA9IEFERERJICh0bXBfdG1wMSwgTUFLRURJICgwLCAweDgwMDAwMDAwKSk7Ci0gIHsKLSAgICBESSBvcHZhbCA9IChHVERJICh0bXBfdG1wMSwgTUFLRURJICgzMjc2NywgMCkpKSA/IChNQUtFREkgKDMyNzY3LCAwKSkgOiAoTFRESSAodG1wX3RtcDEsIE1BS0VESSAoMHhmZmZmODAwMCwgMCkpKSA/IChNQUtFREkgKDB4ZmZmZjgwMDAsIDApKSA6IChBTkRESSAodG1wX3RtcDEsIE1BS0VESSAoMHhmZmZmZmZmZiwgMCkpKTsKLSAgICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NkKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2NkIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9SVEUpIDogLyogcnRlICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgU0VNX0JSQU5DSF9JTklUCi0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBTkRTSSAoR0VUX0hfQ1IgKCgoVUlOVCkgNikpLCAtNCk7Ci0gICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBHRVRfSF9DUiAoKChVSU5UKSAxNCkpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2Jwc3cpOwotICAgIFNFVF9IX1BTVyAob3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2JicHN3KTsKLSAgICBDUFUgKGhfYnBzdykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TRVRIKSA6IC8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NldGguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX2hpMTYpLCAxNik7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TTEwpIDogLyogc2xsICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TTEwzKSA6IC8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX3NyKSwgQU5EU0kgKEZMRCAoZl9zaW1tMTYpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0xMSSkgOiAvKiBzbGxpICRkciwkdWltbTUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSQSkgOiAvKiBzcmEgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSQTMpIDogLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZDMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfc3IpLCBBTkRTSSAoRkxEIChmX3NpbW0xNiksIDMxKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TUkFJKSA6IC8qIHNyYWkgJGRyLCR1aW1tNSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1JMKSA6IC8qIHNybCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1JMMykgOiAvKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkMy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9zciksIEFORFNJIChGTEQgKGZfc2ltbTE2KSwgMzEpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NSTEkpIDogLyogc3JsaSAkZHIsJHVpbW01ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVCkgOiAvKiBzdCAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX0QpIDogLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9kLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVEIpIDogLyogc3RiICRzcmMxLEAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RCX0QpIDogLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU1RIKSA6IC8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUSF9EKSA6IC8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X2QuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NUX1BMVVMpIDogLyogc3QgJHNyYzEsQCskc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRtcF9uZXdfc3JjMjsKLSAgdG1wX25ld19zcmMyID0gQUREU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKLSAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TVF9NSU5VUykgOiAvKiBzdCAkc3JjMSxALSRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX25ld19zcmMyOwotICB0bXBfbmV3X3NyYzIgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksIDQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfbmV3X3NyYzIsIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX25ld19zcmMyOwotICAgICogRkxEIChpX3NyYzIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyYzIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQikgOiAvKiBzdWIgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQlYpIDogLyogc3VidiAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICB0ZW1wMSA9IFNVQk9GU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCAwKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1NVQlgpIDogLyogc3VieCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0ZW1wMDtCSSB0ZW1wMTsKLSAgdGVtcDAgPSBTVUJDU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB0ZW1wMSA9IFNVQkNGU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgQkkgb3B2YWwgPSB0ZW1wMTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fVFJBUCkgOiAvKiB0cmFwICR1aW1tNCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfdHJhcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIFNFTV9CUkFOQ0hfSU5JVAotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgNikpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDE0KSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci0xNCIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOwotICAgIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTYiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gQ1BVIChoX2Jwc3cpOwotICAgIENQVSAoaF9iYnBzdykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYmJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVFJIG9wdmFsID0gR0VUX0hfUFNXICgpOwotICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IEFORFFJIChHRVRfSF9QU1cgKCksIDEyOCk7Ci0gICAgU0VUX0hfUFNXIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IG0zMnJfdHJhcCAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfdWltbTQpKTsKLSAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1VOTE9DSykgOiAvKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfbG9jaykpIHsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDQpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotICB7Ci0gICAgQkkgb3B2YWwgPSAwOwotICAgIENQVSAoaF9sb2NrKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJsb2NrIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0FUQikgOiAvKiBzYXRiICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSAoR0VTSSAoKiBGTEQgKGlfc3IpLCAxMjcpKSA/ICgxMjcpIDogKExFU0kgKCogRkxEIChpX3NyKSwgLTEyOCkpID8gKC0xMjgpIDogKCogRkxEIChpX3NyKSk7Ci0gICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TQVRIKSA6IC8qIHNhdGggJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IChHRVNJICgqIEZMRCAoaV9zciksIDMyNzY3KSkgPyAoMzI3NjcpIDogKExFU0kgKCogRkxEIChpX3NyKSwgLTMyNzY4KSkgPyAoLTMyNzY4KSA6ICgqIEZMRCAoaV9zcikpOwotICAgICogRkxEIChpX2RyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0FUKSA6IC8qIHNhdCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gKChDUFUgKGhfY29uZCkpID8gKCgoTFRTSSAoKiBGTEQgKGlfc3IpLCAwKSkgPyAoMjE0NzQ4MzY0NykgOiAoMHg4MDAwMDAwMCkpKSA6ICgqIEZMRCAoaV9zcikpKTsKLSAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BDTVBCWikgOiAvKiBwY21wYnogJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSAoRVFTSSAoQU5EU0kgKCogRkxEIChpX3NyYzIpLCAyNTUpLCAwKSkgPyAoMSkgOiAoRVFTSSAoQU5EU0kgKCogRkxEIChpX3NyYzIpLCA2NTI4MCksIDApKSA/ICgxKSA6IChFUVNJIChBTkRTSSAoKiBGTEQgKGlfc3JjMiksIDE2NzExNjgwKSwgMCkpID8gKDEpIDogKEVRU0kgKEFORFNJICgqIEZMRCAoaV9zcmMyKSwgMHhmZjAwMDAwMCksIDApKSA/ICgxKSA6ICgwKTsKLSAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0FERCkgOiAvKiBzYWRkICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gQUREREkgKFNSQURJIChHRVRfSF9BQ0NVTVMgKCgoVUlOVCkgMSkpLCAxNiksIEdFVF9IX0FDQ1VNUyAoKChVSU5UKSAwKSkpOwotICAgIFNFVF9IX0FDQ1VNUyAoKChVSU5UKSAwKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bXMtMCIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fTUFDV1UxKSA6IC8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNUyAoKChVSU5UKSAxKSksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMyKSwgNjU1MzUpKSkpLCA4KSwgOCk7Ci0gICAgU0VUX0hfQUNDVU1TICgoKFVJTlQpIDEpLCBvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3Vtcy0xIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NU0JMTykgOiAvKiBtc2JsbyAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoU1VCREkgKEdFVF9IX0FDQ1VNICgpLCBTUkFESSAoU0xMREkgKE1VTERJIChFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzEpKSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSksIDMyKSwgMTYpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9NVUxXVTEpIDogLyogbXVsd3UxICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRTSURJIChBTkRTSSAoKiBGTEQgKGlfc3JjMiksIDY1NTM1KSkpLCAxNiksIDE2KTsKLSAgICBTRVRfSF9BQ0NVTVMgKCgoVUlOVCkgMSksIG9wdmFsKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW1zLTEiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX01BQ0xIMSkgOiAvKiBtYWNsaDEgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTVMgKCgoVUlOVCkgMSkpLCBTTExESSAoRVhUU0lESSAoTVVMU0kgKEVYVEhJU0kgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMSkpKSwgU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSwgMTYpKSwgOCksIDgpOwotICAgIFNFVF9IX0FDQ1VNUyAoKChVSU5UKSAxKSwgb3B2YWwpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bXMtMSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fU0MpIDogLyogc2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKFpFWFRCSVNJIChDUFUgKGhfY29uZCkpKQotICBTRU1fU0tJUF9JTlNOIChjdXJyZW50X2NwdSwgc2VtX2FyZywgdnBjKTsKLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9TTkMpIDogLyogc25jICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChaRVhUQklTSSAoTk9UQkkgKENQVSAoaF9jb25kKSkpKQotICBTRU1fU0tJUF9JTlNOIChjdXJyZW50X2NwdSwgc2VtX2FyZywgdnBjKTsKLQotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfQUREKSA6IC8qIGFkZCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0FERCkgOiAvKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9BTkQpIDogLyogYW5kICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfQU5EKSA6IC8qIGFuZCAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX09SKSA6IC8qIG9yICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9PUikgOiAvKiBvciAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1hPUikgOiAvKiB4b3IgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9YT1IpIDogLyogeG9yICRkciwkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfQURESSkgOiAvKiBhZGRpICRkciwkc2ltbTggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGRpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3NpbW04KSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfQURESSkgOiAvKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGRpLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkaS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9BRERWKSA6IC8qIGFkZHYgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkdi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IEFERFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gQURET0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIDApOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0FERFYpIDogLyogYWRkdiAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkdi5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIENQVSAoaF9jb25kKSA9IE9QUk5EIChjb25kYml0KTsKLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0FERFgpIDogLyogYWRkeCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGR4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7QkkgdGVtcDE7Ci0gIHRlbXAwID0gQUREQ1NJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgdGVtcDEgPSBBRERDRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IHRlbXAxOwotICAgIE9QUk5EIChjb25kYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9BRERYKSA6IC8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZHguZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBDUFUgKGhfY29uZCkgPSBPUFJORCAoY29uZGJpdCk7Ci0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9CQzgpIDogLyogYmMucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2JjOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0JDOCkgOiAvKiBiYy5zICRkaXNwOCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2JjOC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIFNFTV9CUkFOQ0hfSU5JVAotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIGlmICh3cml0dGVuICYgKDEgPDwgMikpCi0gICAgewotICAgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIE9QUk5EIChwYyksIHZwYyk7Ci0gICAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9CTDgpIDogLyogYmwucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2JsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7Ci0gICAgT1BSTkQgKGhfZ3JfMTQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7Ci0gICAgT1BSTkQgKHBjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfQkw4KSA6IC8qIGJsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYmw4LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBPUFJORCAoaF9ncl8xNCk7Ci0gIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBPUFJORCAocGMpLCB2cGMpOwotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9CQ0w4KSA6IC8qIGJjbC5zICRkaXNwOCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYmNsOC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoQ1BVIChoX2NvbmQpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7Ci0gICAgT1BSTkQgKGhfZ3JfMTQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBPUFJORCAocGMpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9CQ0w4KSA6IC8qIGJjbC5zICRkaXNwOCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2JjbDguZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICBTRU1fQlJBTkNIX0lOSVQKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBpZiAod3JpdHRlbiAmICgxIDw8IDMpKQotICAgIHsKLSAgICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gT1BSTkQgKGhfZ3JfMTQpOwotICAgIH0KLSAgaWYgKHdyaXR0ZW4gJiAoMSA8PCA0KSkKLSAgICB7Ci0gICAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgT1BSTkQgKHBjKSwgdnBjKTsKLSAgICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0JOQzgpIDogLyogYm5jLnMgJGRpc3A4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9iYzguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfY29uZCkpKSB7Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0JOQzgpIDogLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYmM4LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgaWYgKHdyaXR0ZW4gJiAoMSA8PCAyKSkKLSAgICB7Ci0gICAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgT1BSTkQgKHBjKSwgdnBjKTsKLSAgICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0JSQTgpIDogLyogYnJhLnMgJGRpc3A4ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9icmE4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7Ci0gICAgT1BSTkQgKHBjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfQlJBOCkgOiAvKiBicmEucyAkZGlzcDggKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9ibDguZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9icmE4LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIE9QUk5EIChwYyksIHZwYyk7Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0JOQ0w4KSA6IC8qIGJuY2wucyAkZGlzcDggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2JsOC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2JjbDguZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKE5PVEJJIChDUFUgKGhfY29uZCkpKSB7Ci17Ci0gIHsKLSAgICBTSSBvcHZhbCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7Ci0gICAgT1BSTkQgKGhfZ3JfMTQpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKLSAgICBPUFJORCAocGMpID0gb3B2YWw7Ci0gICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotfQotCi0gIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9CTkNMOCkgOiAvKiBibmNsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYmw4LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYmNsOC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIFNFTV9CUkFOQ0hfSU5JVAotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIGlmICh3cml0dGVuICYgKDEgPDwgMykpCi0gICAgewotICAgICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBPUFJORCAoaF9ncl8xNCk7Ci0gICAgfQotICBpZiAod3JpdHRlbiAmICgxIDw8IDQpKQotICAgIHsKLSAgICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBPUFJORCAocGMpLCB2cGMpOwotICAgIH0KLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfQ01QKSA6IC8qIGNtcCAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2NtcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0NNUCkgOiAvKiBjbXAgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfY21wLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2NvbmQpID0gT1BSTkQgKGNvbmRiaXQpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfQ01QVSkgOiAvKiBjbXB1ICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfY21wLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEJJIG9wdmFsID0gTFRVU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0NNUFUpIDogLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9jbXAuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBDUFUgKGhfY29uZCkgPSBPUFJORCAoY29uZGJpdCk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9DTVBFUSkgOiAvKiBjbXBlcSAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2NtcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0NNUEVRKSA6IC8qIGNtcGVxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2NtcC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIENQVSAoaF9jb25kKSA9IE9QUk5EIChjb25kYml0KTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0NNUFopIDogLyogY21weiAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2NtcHouZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9zcmMyKSwgMCk7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0NNUFopIDogLyogY21weiAkc3JjMiAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9jbXB6LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2NvbmQpID0gT1BSTkQgKGNvbmRiaXQpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfSkMpIDogLyogamMgJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfamMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotaWYgKENQVSAoaF9jb25kKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyKSwgLTQpOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0pDKSA6IC8qIGpjICRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9qYy5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIFNFTV9CUkFOQ0hfSU5JVAotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIGlmICh3cml0dGVuICYgKDEgPDwgMikpCi0gICAgewotICAgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIE9QUk5EIChwYyksIHZwYyk7Ci0gICAgfQotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9KTkMpIDogLyogam5jICRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2pjLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLWlmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgewotICB7Ci0gICAgVVNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyKSwgLTQpOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICB3cml0dGVuIHw9ICgxIDw8IDIpOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0pOQykgOiAvKiBqbmMgJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2pjLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgaWYgKHdyaXR0ZW4gJiAoMSA8PCAyKSkKLSAgICB7Ci0gICAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgT1BSTkQgKHBjKSwgdnBjKTsKLSAgICB9Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0pMKSA6IC8qIGpsICRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfamwuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9qbC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO1VTSSB0ZW1wMTsKLSAgdGVtcDAgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOwotICB0ZW1wMSA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgT1BSTkQgKGhfZ3JfMTQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IHRlbXAxOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0pMKSA6IC8qIGpsICRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2psLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfamwuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICBTRU1fQlJBTkNIX0lOSVQKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IE9QUk5EIChoX2dyXzE0KTsKLSAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIE9QUk5EIChwYyksIHZwYyk7Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0pNUCkgOiAvKiBqbXAgJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRjLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfam1wLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKLSAgICBPUFJORCAocGMpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9KTVApIDogLyogam1wICRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9qbXAuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICBTRU1fQlJBTkNIX0lOSVQKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgT1BSTkQgKHBjKSwgdnBjKTsKLQotICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTEQpIDogLyogbGQgJGRyLEAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTEQpIDogLyogbGQgJGRyLEAkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbGQuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTERCKSA6IC8qIGxkYiAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2xkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTERCKSA6IC8qIGxkYiAkZHIsQCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9MREgpIDogLyogbGRoICRkcixAJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9MREgpIDogLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2xkLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0xEVUIpIDogLyogbGR1YiAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2xkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gWkVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0xEVUIpIDogLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9MRFVIKSA6IC8qIGxkdWggJGRyLEAkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9MRFVIKSA6IC8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbGQuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTERfUExVUykgOiAvKiBsZCAkZHIsQCRzcisgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7U0kgdGVtcDE7Ci0gIHRlbXAwID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKLSAgdGVtcDEgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCA0KTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRlbXAxOwotICAgIE9QUk5EIChzcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAic3IiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0xEX1BMVVMpIDogLyogbGQgJGRyLEAkc3IrICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2xkX3BsdXMuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotICAqIEZMRCAoaV9zcikgPSBPUFJORCAoc3IpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTERJOCkgOiAvKiBsZGk4ICRkciwkc2ltbTggKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZGk4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gRkxEIChmX3NpbW04KTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9MREk4KSA6IC8qIGxkaTggJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZGkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sZGk4LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX0xPQ0spIDogLyogbG9jayAkZHIsQCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2xvY2suZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgQkkgb3B2YWwgPSAxOwotICAgIE9QUk5EIChoX2xvY2spID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImxvY2siLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX0xPQ0spIDogLyogbG9jayAkZHIsQCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9sb2NrLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLSAgQ1BVIChoX2xvY2spID0gT1BSTkQgKGhfbG9jayk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NQUNISV9BKSA6IC8qIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tYWNoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChBRERESSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSksIE1VTERJIChFWFRTSURJIChBTkRTSSAoKiBGTEQgKGlfc3JjMSksIDB4ZmZmZjAwMDApKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSksIDgpLCA4KTsKLSAgICBPUFJORCAoYWNjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2MiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01BQ0hJX0EpIDogLyogbWFjaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tYWNoaV9hLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSwgT1BSTkQgKGFjYykpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTUFDTE9fQSkgOiAvKiBtYWNsbyAkc3JjMSwkc3JjMiwkYWNjICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbWFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYykpLCBNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOwotICAgIE9QUk5EIChhY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTUFDTE9fQSkgOiAvKiBtYWNsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X21hY2hpX2EuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBPUFJORCAoYWNjKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NQUNXSElfQSkgOiAvKiBtYWN3aGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X21hY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBBRERESSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSkpOwotICAgIE9QUk5EIChhY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTUFDV0hJX0EpIDogLyogbWFjd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbWFjaGlfYS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYyksIE9QUk5EIChhY2MpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01BQ1dMT19BKSA6IC8qIG1hY3dsbyAkc3JjMSwkc3JjMiwkYWNjICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbWFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IEFERERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpKSwgTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSk7Ci0gICAgT1BSTkQgKGFjYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NQUNXTE9fQSkgOiAvKiBtYWN3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tYWNoaV9hLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSwgT1BSTkQgKGFjYykpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTVVMKSA6IC8qIG11bCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBNVUxTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01VTCkgOiAvKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NVUxISV9BKSA6IC8qIG11bGhpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWxoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoQU5EU0kgKCogRkxEIChpX3NyYzEpLCAweGZmZmYwMDAwKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSksIDE2KSwgMTYpOwotICAgIE9QUk5EIChhY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVVMSElfQSkgOiAvKiBtdWxoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X211bGhpX2EuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBPUFJORCAoYWNjKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NVUxMT19BKSA6IC8qIG11bGxvICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWxoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCAxNiksIDE2KTsKLSAgICBPUFJORCAoYWNjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2MiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01VTExPX0EpIDogLyogbXVsbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWxoaV9hLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjKSwgT1BSTkQgKGFjYykpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTVVMV0hJX0EpIDogLyogbXVsd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X21hY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWxoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKTsKLSAgICBPUFJORCAoYWNjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2MiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01VTFdISV9BKSA6IC8qIG11bHdoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X211bGhpX2EuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2MpLCBPUFJORCAoYWNjKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NVUxXTE9fQSkgOiAvKiBtdWx3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbWFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X211bGhpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpOwotICAgIE9QUk5EIChhY2MpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjYyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVVMV0xPX0EpIDogLyogbXVsd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXVsaGlfYS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjYyksIE9QUk5EIChhY2MpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01WKSA6IC8qIG12ICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2xkX3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NVikgOiAvKiBtdiAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbGRfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01WRkFDSElfQSkgOiAvKiBtdmZhY2hpICRkciwkYWNjcyAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXZmYWNoaV9hLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkFESSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjcykpLCAzMikpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01WRkFDSElfQSkgOiAvKiBtdmZhY2hpICRkciwkYWNjcyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212ZmFjaGlfYS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NVkZBQ0xPX0EpIDogLyogbXZmYWNsbyAkZHIsJGFjY3MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212ZmFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212ZmFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoR0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjcykpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NVkZBQ0xPX0EpIDogLyogbXZmYWNsbyAkZHIsJGFjY3MgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdmZhY2hpX2EuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTVZGQUNNSV9BKSA6IC8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdmZhY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdmZhY2hpX2EuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSQURJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIDE2KSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVZGQUNNSV9BKSA6IC8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYWNoaV9hLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXZmYWNoaV9hLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01WRkMpIDogLyogbXZmYyAkZHIsJHNjciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212ZmMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBHRVRfSF9DUiAoRkxEIChmX3IyKSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVZGQykgOiAvKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZmYy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212ZmMuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTVZUQUNISV9BKSA6IC8qIG12dGFjaGkgJHNyYzEsJGFjY3MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212dGFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IE9SREkgKEFORERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIE1BS0VESSAoMCwgMHhmZmZmZmZmZikpLCBTTExESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCAzMikpOwotICAgIE9QUk5EIChhY2NzKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2NzIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NVlRBQ0hJX0EpIDogLyogbXZ0YWNoaSAkc3JjMSwkYWNjcyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212dGFjaGlfYS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY3MpLCBPUFJORCAoYWNjcykpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTVZUQUNMT19BKSA6IC8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X212dGFjaGlfYS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212dGFjaGlfYS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IE9SREkgKEFORERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIE1BS0VESSAoMHhmZmZmZmZmZiwgMCkpLCBaRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpKTsKLSAgICBPUFJORCAoYWNjcykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjcyIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVZUQUNMT19BKSA6IC8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9tdnRhY2hpX2EuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdnRhY2hpX2EuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSwgT1BSTkQgKGFjY3MpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01WVEMpIDogLyogbXZ0YyAkc3IsJGRjciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212dGMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOwotICAgIE9QUk5EIChkY3IpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRjciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVZUQykgOiAvKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfbXZ0Yy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X212dGMuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9DUiAoRkxEIChmX3IxKSwgT1BSTkQgKGRjcikpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTkVHKSA6IC8qIG5lZyAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXYuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBORUdTSSAoKiBGTEQgKGlfc3IpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9ORUcpIDogLyogbmVnICRkciwkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXYuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTk9QKSA6IC8qIG5vcCAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X25vcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1QUk9GSUxFX0NPVU5UX0ZJTExOT1BTIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTk9QKSA6IC8qIG5vcCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9ub3AuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTk9UKSA6IC8qIG5vdCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXYuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBJTlZTSSAoKiBGTEQgKGlfc3IpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9OT1QpIDogLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9sZF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXYuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfUkFDX0RTSSkgOiAvKiByYWMgJGFjY2QsJGFjY3MsJGltbTEgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3JhY19kc2kuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9yYWNfZHNpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgREkgdG1wX3RtcDE7Ci0gIHRtcF90bXAxID0gU0xMREkgKEdFVF9IX0FDQ1VNUyAoRkxEIChmX2FjY3MpKSwgRkxEIChmX2ltbTEpKTsKLSAgdG1wX3RtcDEgPSBBRERESSAodG1wX3RtcDEsIE1BS0VESSAoMCwgMzI3NjgpKTsKLSAgewotICAgIERJIG9wdmFsID0gKEdUREkgKHRtcF90bXAxLCBNQUtFREkgKDMyNzY3LCAweGZmZmYwMDAwKSkpID8gKE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSA6IChMVERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmY4MDAwLCAwKSkpID8gKE1BS0VESSAoMHhmZmZmODAwMCwgMCkpIDogKEFORERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmZmZmZmLCAweGZmZmYwMDAwKSkpOwotICAgIE9QUk5EIChhY2NkKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2NkIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9SQUNfRFNJKSA6IC8qIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3JhY19kc2kuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9yYWNfZHNpLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TIChGTEQgKGZfYWNjZCksIE9QUk5EIChhY2NkKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9SQUNIX0RTSSkgOiAvKiByYWNoICRhY2NkLCRhY2NzLCRpbW0xICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9yYWNfZHNpLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfcmFjX2RzaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIERJIHRtcF90bXAxOwotICB0bXBfdG1wMSA9IFNMTERJIChHRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NzKSksIEZMRCAoZl9pbW0xKSk7Ci0gIHRtcF90bXAxID0gQUREREkgKHRtcF90bXAxLCBNQUtFREkgKDAsIDB4ODAwMDAwMDApKTsKLSAgewotICAgIERJIG9wdmFsID0gKEdUREkgKHRtcF90bXAxLCBNQUtFREkgKDMyNzY3LCAwKSkpID8gKE1BS0VESSAoMzI3NjcsIDApKSA6IChMVERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmY4MDAwLCAwKSkpID8gKE1BS0VESSAoMHhmZmZmODAwMCwgMCkpIDogKEFORERJICh0bXBfdG1wMSwgTUFLRURJICgweGZmZmZmZmZmLCAwKSkpOwotICAgIE9QUk5EIChhY2NkKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2NkIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9SQUNIX0RTSSkgOiAvKiByYWNoICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfcmFjX2RzaS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3JhY19kc2kuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKEZMRCAoZl9hY2NkKSwgT1BSTkQgKGFjY2QpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1JURSkgOiAvKiBydGUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9ydGUuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICB7Ci0gICAgVVNJIG9wdmFsID0gQU5EU0kgKEdFVF9IX0NSICgoKFVJTlQpIDYpKSwgLTQpOwotICAgIE9QUk5EIChwYykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgMTQpKTsKLSAgICBPUFJORCAoaF9jcl82KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci02IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IENQVSAoaF9icHN3KTsKLSAgICBPUFJORCAoaF9wc3cpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzdyIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVUUkgb3B2YWwgPSBDUFUgKGhfYmJwc3cpOwotICAgIE9QUk5EIChoX2Jwc3cpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1JURSkgOiAvKiBydGUgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfcnRlLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2Jwc3cpID0gT1BSTkQgKGhfYnBzdyk7Ci0gIFNFVF9IX0NSICgoKFVJTlQpIDYpLCBPUFJORCAoaF9jcl82KSk7Ci0gIFNFVF9IX1BTVyAoT1BSTkQgKGhfcHN3KSk7Ci0gIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBPUFJORCAocGMpLCB2cGMpOwotCi0gIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9TTEwpIDogLyogc2xsICRkciwkc3IgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfU0xMKSA6IC8qIHNsbCAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1NMTEkpIDogLyogc2xsaSAkZHIsJHVpbW01ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc2xsaS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NMTEkpIDogLyogc2xsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3NsbGkuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU1JBKSA6IC8qIHNyYSAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NSQSkgOiAvKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9TUkFJKSA6IC8qIHNyYWkgJGRyLCR1aW1tNSAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc2xsaS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3NsbGkuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9TUkFJKSA6IC8qIHNyYWkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zbGxpLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1NSTCkgOiAvKiBzcmwgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9TUkwpIDogLyogc3JsICRkciwkc3IgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICAqIEZMRCAoaV9kcikgPSBPUFJORCAoZHIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU1JMSSkgOiAvKiBzcmxpICRkciwkdWltbTUgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3NsbGkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zbGxpLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfU1JMSSkgOiAvKiBzcmxpICRkciwkdWltbTUgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zbGxpLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc2xsaS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9TVCkgOiAvKiBzdCAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zdC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIE9QUk5EIChoX21lbW9yeV9zcmMyX2lkeCkgPSAqIEZMRCAoaV9zcmMyKTsKLSAgICBPUFJORCAoaF9tZW1vcnlfc3JjMikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9TVCkgOiAvKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc3QuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBPUFJORCAoaF9tZW1vcnlfc3JjMl9pZHgpLCBPUFJORCAoaF9tZW1vcnlfc3JjMikpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU1RCKSA6IC8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zdGIuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBPUFJORCAoaF9tZW1vcnlfc3JjMl9pZHgpID0gKiBGTEQgKGlfc3JjMik7Ci0gICAgT1BSTkQgKGhfbWVtb3J5X3NyYzIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfU1RCKSA6IC8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc3RiLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgT1BSTkQgKGhfbWVtb3J5X3NyYzJfaWR4KSwgT1BSTkQgKGhfbWVtb3J5X3NyYzIpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1NUSCkgOiAvKiBzdGggJHNyYzEsQCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc3RoLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgT1BSTkQgKGhfbWVtb3J5X3NyYzJfaWR4KSA9ICogRkxEIChpX3NyYzIpOwotICAgIE9QUk5EIChoX21lbW9yeV9zcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NUSCkgOiAvKiBzdGggJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3N0aC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIE9QUk5EIChoX21lbW9yeV9zcmMyX2lkeCksIE9QUk5EIChoX21lbW9yeV9zcmMyKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9TVF9QTFVTKSA6IC8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zdF9wbHVzLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdG1wX25ld19zcmMyOwotICB0bXBfbmV3X3NyYzIgPSBBRERTSSAoKiBGTEQgKGlfc3JjMiksIDQpOwotICB7Ci0gICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKLSAgICBPUFJORCAoaF9tZW1vcnlfbmV3X3NyYzJfaWR4KSA9IHRtcF9uZXdfc3JjMjsKLSAgICBPUFJORCAoaF9tZW1vcnlfbmV3X3NyYzIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKLSAgICBPUFJORCAoc3JjMikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAic3JjMiIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfU1RfUExVUykgOiAvKiBzdCAkc3JjMSxAKyRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3N0X3BsdXMuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBPUFJORCAoaF9tZW1vcnlfbmV3X3NyYzJfaWR4KSwgT1BSTkQgKGhfbWVtb3J5X25ld19zcmMyKSk7Ci0gICogRkxEIChpX3NyYzIpID0gT1BSTkQgKHNyYzIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU1RfTUlOVVMpIDogLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3N0X3BsdXMuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotewotICBTSSB0bXBfbmV3X3NyYzI7Ci0gIHRtcF9uZXdfc3JjMiA9IFNVQlNJICgqIEZMRCAoaV9zcmMyKSwgNCk7Ci0gIHsKLSAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOwotICAgIE9QUk5EIChoX21lbW9yeV9uZXdfc3JjMl9pZHgpID0gdG1wX25ld19zcmMyOwotICAgIE9QUk5EIChoX21lbW9yeV9uZXdfc3JjMikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFNJIG9wdmFsID0gdG1wX25ld19zcmMyOwotICAgIE9QUk5EIChzcmMyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9TVF9NSU5VUykgOiAvKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3N0X3BsdXMuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBPUFJORCAoaF9tZW1vcnlfbmV3X3NyYzJfaWR4KSwgT1BSTkQgKGhfbWVtb3J5X25ld19zcmMyKSk7Ci0gICogRkxEIChpX3NyYzIpID0gT1BSTkQgKHNyYzIpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU1VCKSA6IC8qIHN1YiAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGQuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOwotICAgIE9QUk5EIChkcikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NVQikgOiAvKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZC5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9TVUJWKSA6IC8qIHN1YnYgJGRyLCRzciAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkdi5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIFNJIHRlbXAwO0JJIHRlbXAxOwotICB0ZW1wMCA9IFNVQlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7Ci0gIHRlbXAxID0gU1VCT0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIDApOwotICB7Ci0gICAgU0kgb3B2YWwgPSB0ZW1wMDsKLSAgICBPUFJORCAoZHIpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIEJJIG9wdmFsID0gdGVtcDE7Ci0gICAgT1BSTkQgKGNvbmRiaXQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKLSAgfQotfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NVQlYpIDogLyogc3VidiAkZHIsJHNyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfYWRkLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfYWRkdi5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIENQVSAoaF9jb25kKSA9IE9QUk5EIChjb25kYml0KTsKLSAgKiBGTEQgKGlfZHIpID0gT1BSTkQgKGRyKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1NVQlgpIDogLyogc3VieCAkZHIsJHNyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9hZGQuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9hZGR4LmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLSAgU0kgdGVtcDA7QkkgdGVtcDE7Ci0gIHRlbXAwID0gU1VCQ1NJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgdGVtcDEgPSBTVUJDRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKLSAgewotICAgIFNJIG9wdmFsID0gdGVtcDA7Ci0gICAgT1BSTkQgKGRyKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBCSSBvcHZhbCA9IHRlbXAxOwotICAgIE9QUk5EIChjb25kYml0KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLX0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9TVUJYKSA6IC8qIHN1YnggJGRyLCRzciAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X2FkZC5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2FkZHguZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBDUFUgKGhfY29uZCkgPSBPUFJORCAoY29uZGJpdCk7Ci0gICogRkxEIChpX2RyKSA9IE9QUk5EIChkcik7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9UUkFQKSA6IC8qIHRyYXAgJHVpbW00ICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF90cmFwLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfdHJhcC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi17Ci0gIHsKLSAgICBVU0kgb3B2YWwgPSBHRVRfSF9DUiAoKChVSU5UKSA2KSk7Ci0gICAgT1BSTkQgKGhfY3JfMTQpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNyLTE0IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7Ci0gICAgT1BSTkQgKGhfY3JfNikgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY3ItNiIsICd4Jywgb3B2YWwpOwotICB9Ci0gIHsKLSAgICBVUUkgb3B2YWwgPSBDUFUgKGhfYnBzdyk7Ci0gICAgT1BSTkQgKGhfYmJwc3cpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IEdFVF9IX1BTVyAoKTsKLSAgICBPUFJORCAoaF9icHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3IiwgJ3gnLCBvcHZhbCk7Ci0gIH0KLSAgewotICAgIFVRSSBvcHZhbCA9IEFORFFJIChHRVRfSF9QU1cgKCksIDEyOCk7Ci0gICAgT1BSTkQgKGhfcHN3KSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwc3ciLCAneCcsIG9wdmFsKTsKLSAgfQotICB7Ci0gICAgU0kgb3B2YWwgPSBtMzJyX3RyYXAgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX3VpbW00KSk7Ci0gICAgT1BSTkQgKHBjKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfVFJBUCkgOiAvKiB0cmFwICR1aW1tNCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3RyYXAuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF90cmFwLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgU0VNX0JSQU5DSF9JTklUCi0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2JicHN3KSA9IE9QUk5EIChoX2JicHN3KTsKLSAgQ1BVIChoX2Jwc3cpID0gT1BSTkQgKGhfYnBzdyk7Ci0gIFNFVF9IX0NSICgoKFVJTlQpIDE0KSwgT1BSTkQgKGhfY3JfMTQpKTsKLSAgU0VUX0hfQ1IgKCgoVUlOVCkgNiksIE9QUk5EIChoX2NyXzYpKTsKLSAgU0VUX0hfUFNXIChPUFJORCAoaF9wc3cpKTsKLSAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIE9QUk5EIChwYyksIHZwYyk7Ci0KLSAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOwotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1VOTE9DSykgOiAvKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfdW5sb2NrLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLXsKLWlmIChDUFUgKGhfbG9jaykpIHsKLSAgewotICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7Ci0gICAgT1BSTkQgKGhfbWVtb3J5X3NyYzJfaWR4KSA9ICogRkxEIChpX3NyYzIpOwotICAgIE9QUk5EIChoX21lbW9yeV9zcmMyKSA9IG9wdmFsOwotICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0gIHsKLSAgICBCSSBvcHZhbCA9IDA7Ci0gICAgT1BSTkQgKGhfbG9jaykgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibG9jayIsICd4Jywgb3B2YWwpOwotICB9Ci19Ci0KLSAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47Ci0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1VOTE9DSykgOiAvKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3VubG9jay5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIENQVSAoaF9sb2NrKSA9IE9QUk5EIChoX2xvY2spOwotICBpZiAod3JpdHRlbiAmICgxIDw8IDQpKQotICAgIHsKLSAgICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIE9QUk5EIChoX21lbW9yeV9zcmMyX2lkeCksIE9QUk5EIChoX21lbW9yeV9zcmMyKSk7Ci0gICAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfUENNUEJaKSA6IC8qIHBjbXBieiAkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X2NtcHouZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgQkkgb3B2YWwgPSAoRVFTSSAoQU5EU0kgKCogRkxEIChpX3NyYzIpLCAyNTUpLCAwKSkgPyAoMSkgOiAoRVFTSSAoQU5EU0kgKCogRkxEIChpX3NyYzIpLCA2NTI4MCksIDApKSA/ICgxKSA6IChFUVNJIChBTkRTSSAoKiBGTEQgKGlfc3JjMiksIDE2NzExNjgwKSwgMCkpID8gKDEpIDogKEVRU0kgKEFORFNJICgqIEZMRCAoaV9zcmMyKSwgMHhmZjAwMDAwMCksIDApKSA/ICgxKSA6ICgwKTsKLSAgICBPUFJORCAoY29uZGJpdCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfUENNUEJaKSA6IC8qIHBjbXBieiAkc3JjMiAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9jbXB6LmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgQ1BVIChoX2NvbmQpID0gT1BSTkQgKGNvbmRiaXQpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU0FERCkgOiAvKiBzYWRkICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfc2FkZC5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IEFERERJIChTUkFESSAoR0VUX0hfQUNDVU1TICgoKFVJTlQpIDEpKSwgMTYpLCBHRVRfSF9BQ0NVTVMgKCgoVUlOVCkgMCkpKTsKLSAgICBPUFJORCAoaF9hY2N1bXNfMCkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW1zLTAiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NBREQpIDogLyogc2FkZCAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zYWRkLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TICgoKFVJTlQpIDApLCBPUFJORCAoaF9hY2N1bXNfMCkpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfTUFDV1UxKSA6IC8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotewotICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X21hY3d1MS5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi0gIHsKLSAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNUyAoKChVSU5UKSAxKSksIE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMyKSwgNjU1MzUpKSkpLCA4KSwgOCk7Ci0gICAgT1BSTkQgKGhfYWNjdW1zXzEpID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3Vtcy0xIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NQUNXVTEpIDogLyogbWFjd3UxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLnNmbXRfc3RfcGx1cy5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X21hY3d1MS5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVF9IX0FDQ1VNUyAoKChVSU5UKSAxKSwgT1BSTkQgKGhfYWNjdW1zXzEpKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01TQkxPKSA6IC8qIG1zYmxvICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbXNibG8uZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKFNVQkRJIChHRVRfSF9BQ0NVTSAoKSwgU1JBREkgKFNMTERJIChNVUxESSAoRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMxKSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpLCAzMiksIDE2KSksIDgpLCA4KTsKLSAgICBPUFJORCAoYWNjdW0pID0gb3B2YWw7Ci0gICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7Ci0gIH0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi19Ci0gIE5FWFQgKHZwYyk7Ci0KLUNBU0UgKHNlbSwgSU5TTl9XUklURV9NU0JMTykgOiAvKiBtc2JsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tc2Jsby5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0gIFNFVF9IX0FDQ1VNIChPUFJORCAoYWNjdW0pKTsKLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX01VTFdVMSkgOiAvKiBtdWx3dTEgJHNyYzEsJHNyYzIgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWx3dTEuZgotICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOwotICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKLQotICB7Ci0gICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMyKSwgNjU1MzUpKSksIDE2KSwgMTYpOwotICAgIE9QUk5EIChoX2FjY3Vtc18xKSA9IG9wdmFsOwotICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bXMtMSIsICdEJywgb3B2YWwpOwotICB9Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfTVVMV1UxKSA6IC8qIG11bHd1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5zZm10X3N0X3BsdXMuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9tdWx3dTEuZgotICAgIGludCBVTlVTRUQgd3JpdHRlbiA9IGFidWYtPndyaXR0ZW47Ci0gICAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKLQotICBTRVRfSF9BQ0NVTVMgKCgoVUlOVCkgMSksIE9QUk5EIChoX2FjY3Vtc18xKSk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLSAgQ0FTRSAoc2VtLCBJTlNOX1BBUl9NQUNMSDEpIDogLyogbWFjbGgxICRzcmMxLCRzcmMyICovCi17Ci0gIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbWFjd3UxLmYKLSAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKLSAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKLSAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7Ci0KLSAgewotICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChBRERESSAoR0VUX0hfQUNDVU1TICgoKFVJTlQpIDEpKSwgU0xMREkgKEVYVFNJREkgKE1VTFNJIChFWFRISVNJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzEpKSksIFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSksIDE2KSksIDgpLCA4KTsKLSAgICBPUFJORCAoaF9hY2N1bXNfMSkgPSBvcHZhbDsKLSAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW1zLTEiLCAnRCcsIG9wdmFsKTsKLSAgfQotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX01BQ0xIMSkgOiAvKiBtYWNsaDEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKLSAgICBjb25zdCBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLndyaXRlLmFidWY7Ci0jZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuc2ZtdF9zdF9wbHVzLmYKLSNkZWZpbmUgT1BSTkQoZikgcGFyX2V4ZWMtPm9wZXJhbmRzLnNmbXRfbWFjd3UxLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLSAgU0VUX0hfQUNDVU1TICgoKFVJTlQpIDEpLCBPUFJORCAoaF9hY2N1bXNfMSkpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLSAgfQotICBORVhUICh2cGMpOwotCi0gIENBU0UgKHNlbSwgSU5TTl9QQVJfU0MpIDogLyogc2MgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zYy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoWkVYVEJJU0kgKENQVSAoaF9jb25kKSkpCi0gIFNFTV9TS0lQX0lOU04gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCB2cGMpOwotCi0jdW5kZWYgT1BSTkQKLSN1bmRlZiBGTEQKLX0KLSAgTkVYVCAodnBjKTsKLQotQ0FTRSAoc2VtLCBJTlNOX1dSSVRFX1NDKSA6IC8qIHNjICovCi0gIHsKLSAgICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7Ci0gICAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyktPmZpZWxkcy53cml0ZS5hYnVmOwotI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCi0jZGVmaW5lIE9QUk5EKGYpIHBhcl9leGVjLT5vcGVyYW5kcy5zZm10X3NjLmYKLSAgICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSBhYnVmLT53cml0dGVuOwotICAgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gICAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7Ci0KLQotI3VuZGVmIE9QUk5ECi0jdW5kZWYgRkxECi0gIH0KLSAgTkVYVCAodnBjKTsKLQotICBDQVNFIChzZW0sIElOU05fUEFSX1NOQykgOiAvKiBzbmMgKi8KLXsKLSAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zYy5mCi0gIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7Ci0gIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7Ci0gIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOwotCi1pZiAoWkVYVEJJU0kgKE5PVEJJIChDUFUgKGhfY29uZCkpKSkKLSAgU0VNX1NLSVBfSU5TTiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIHZwYyk7Ci0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotfQotICBORVhUICh2cGMpOwotCi1DQVNFIChzZW0sIElOU05fV1JJVEVfU05DKSA6IC8qIHNuYyAqLwotICB7Ci0gICAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOwotICAgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpLT5maWVsZHMud3JpdGUuYWJ1ZjsKLSNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgotI2RlZmluZSBPUFJORChmKSBwYXJfZXhlYy0+b3BlcmFuZHMuc2ZtdF9zYy5mCi0gICAgaW50IFVOVVNFRCB3cml0dGVuID0gYWJ1Zi0+d3JpdHRlbjsKLSAgICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOwotICAgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOwotCi0KLSN1bmRlZiBPUFJORAotI3VuZGVmIEZMRAotICB9Ci0gIE5FWFQgKHZwYyk7Ci0KLQotICAgIH0KLSAgRU5EU1dJVENIIChzZW0pIC8qIEVuZCBvZiBzZW1hbnRpYyBzd2l0Y2guICAqLwotCi0gIC8qIEF0IHRoaXMgcG9pbnQgYHZwYycgY29udGFpbnMgdGhlIG5leHQgaW5zbiB0byBleGVjdXRlLiAgKi8KLX0KLQotI3VuZGVmIERFRklORV9TV0lUQ0gKLSNlbmRpZiAvKiBERUZJTkVfU1dJVENIICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci9zaW0taWYuYyBiL3NpbS9tMzJyL3NpbS1pZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NiZTFjLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL3NpbS1pZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cyBzcGVjaWZpYyB0byB0aGUgTTMyUi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGZyZWVfc3RhdGUgKFNJTV9ERVNDKTsKLXN0YXRpYyB2b2lkIHByaW50X20zMnJfbWlzY19jcHUgKFNJTV9DUFUgKmNwdSwgaW50IHZlcmJvc2UpOwotCi0vKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIG0zMnJfZHVtcF9yZWdzIGNhbiBiZQotICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KLVNJTV9ERVNDIGN1cnJlbnRfc3RhdGU7Ci0MCi0vKiBDb3ZlciBmdW5jdGlvbiBvZiBzaW1fc3RhdGVfZnJlZSB0byBmcmVlIHRoZSBjcHUgYnVmZmVycyBhcyB3ZWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc3RhdGUgKFNJTV9ERVNDIHNkKQotewotICBpZiAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpCi0gICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgc2ltX2NwdV9mcmVlX2FsbCAoc2QpOwotICBzaW1fc3RhdGVfZnJlZSAoc2QpOwotfQotCi0vKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbXVsYXRvci4gICovCi0KLVNJTV9ERVNDCi1zaW1fb3BlbiAoa2luZCwgY2FsbGJhY2ssIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKLSAgY2hhciBjOwotICBpbnQgaTsKLQotICAvKiBUaGUgY3B1IGRhdGEgaXMga2VwdCBpbiBhIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeS4gICovCi0gIGlmIChzaW1fY3B1X2FsbG9jX2FsbCAoc2QsIDEsIGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyAoKSkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmIDAgLyogRklYTUU6IHBjIGlzIGluIG1hY2gtc3BlY2lmaWMgc3RydWN0ICovCi0gIC8qIEZJWE1FOiB3YXRjaHBvaW50cyBjb2RlIHNob3VsZG4ndCBuZWVkIHRoaXMgKi8KLSAgewotICAgIFNJTV9DUFUgKmN1cnJlbnRfY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7Ci0gICAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMgPSAmKFBDKTsKLSAgICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIEhBVkVfRFZfU09DS1NFUiAvKiBGSVhNRTogd2FzIGRvbmUgZGlmZmVyZW50bHkgYmVmb3JlICovCi0gIGlmIChkdl9zb2Nrc2VyX2luc3RhbGwgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0KLSNpZiAwIC8qIEZJWE1FOiAndHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZG8gdGhpcyAqLwotICAvKiBUaGVzZSBvcHRpb25zIG92ZXJyaWRlIGFueSBtb2R1bGUgb3B0aW9ucy4KLSAgICAgT2J2aW91c2x5IGFtYmlndWl0eSBzaG91bGQgYmUgYXZvaWRlZCwgaG93ZXZlciB0aGUgY2FsbGVyIG1heSB3aXNoIHRvCi0gICAgIGF1Z21lbnQgdGhlIG1lYW5pbmcgb2YgYW4gb3B0aW9uLiAgKi8KLSAgaWYgKGV4dHJhX29wdGlvbnMgIT0gTlVMTCkKLSAgICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIGV4dHJhX29wdGlvbnMpOwotI2VuZGlmCi0KLSAgLyogZ2V0b3B0IHdpbGwgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2Ugc28gd2UganVzdCBoYXZlIHRvIGV4aXQgaWYgdGhpcyBmYWlscy4KLSAgICAgRklYTUU6IEhtbW0uLi4gIGluIHRoZSBjYXNlIG9mIGdkYiB3ZSBuZWVkIGdldG9wdCB0byBjYWxsCi0gICAgIHByaW50X2ZpbHRlcmVkLiAgKi8KLSAgaWYgKHNpbV9wYXJzZV9hcmdzIChzZCwgYXJndikgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGZyZWVfc3RhdGUgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgb3RoZXIgZGV2aWNlcwotICAgICBpZiBubyBtZW1vcnkgZm9yIHRoYXQgcmFuZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotICAgICBBbGwgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgdG8ga2VlcCB0aGluZ3MgZnJvbSBiZWluZwotICAgICB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgKi8KLSAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCBNMzJSX0RFVklDRV9BRERSLCAxKSA9PSAwKQotICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCi0JCSAgICAgMCAvKmxldmVsKi8sCi0JCSAgICAgYWNjZXNzX3JlYWRfd3JpdGUsCi0JCSAgICAgMCAvKnNwYWNlID8/PyovLAotCQkgICAgIE0zMlJfREVWSUNFX0FERFIsIE0zMlJfREVWSUNFX0xFTiAvKm5yX2J5dGVzKi8sCi0JCSAgICAgMCAvKm1vZHVsbyovLAotCQkgICAgICZtMzJyX2RldmljZXMsCi0JCSAgICAgTlVMTCAvKmJ1ZmZlciovKTsKLQotICAvKiBBbGxvY2F0ZSBjb3JlIG1hbmFnZWQgbWVtb3J5IGlmIG5vbmUgc3BlY2lmaWVkIGJ5IHVzZXIuCi0gICAgIFVzZSBhZGRyZXNzIDQgaGVyZSBpbiBjYXNlIHRoZSB1c2VyIHdhbnRlZCBhZGRyZXNzIDAgdW5tYXBwZWQuICAqLwotICBpZiAoc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCByZWFkX21hcCwgJmMsIDQsIDEpID09IDApCi0gICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMCwweCV4IiwgTTMyUl9ERUZBVUxUX01FTV9TSVpFKTsKLQotICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLwotICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCi0JCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAotCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCi0JCQkgICAgOiBOVUxMKSwKLQkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBmcmVlX3N0YXRlIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogRXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgKi8KLSAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgZnJlZV9zdGF0ZSAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE9wZW4gYSBjb3B5IG9mIHRoZSBjcHUgZGVzY3JpcHRvciB0YWJsZS4gICovCi0gIHsKLSAgICBDR0VOX0NQVV9ERVNDIGNkID0gbTMycl9jZ2VuX2NwdV9vcGVuXzEgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5wcmludGFibGVfbmFtZSwKLQkJCQkJICAgICBDR0VOX0VORElBTl9CSUcpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQotICAgICAgewotCVNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGkpOwotCUNQVV9DUFVfREVTQyAoY3B1KSA9IGNkOwotCUNQVV9ESVNBU1NFTUJMRVIgKGNwdSkgPSBzaW1fY2dlbl9kaXNhc3NlbWJsZV9pbnNuOwotICAgICAgfQotICAgIG0zMnJfY2dlbl9pbml0X2RpcyAoY2QpOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNnZW4gdGhpbmdzIG5vdCBkb25lIGJ5IGNvbW1vbiBmcmFtZXdvcmsuCi0gICAgIE11c3QgYmUgZG9uZSBhZnRlciBtMzJyX2NnZW5fY3B1X29wZW4uICAqLwotICBjZ2VuX2luaXQgKHNkKTsKLQotICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKLSAgICB7Ci0gICAgICAvKiBPbmx5IG5lZWRlZCBmb3IgcHJvZmlsaW5nLCBidXQgdGhlIHN0cnVjdHVyZSBtZW1iZXIgaXMgc21hbGwuICAqLwotICAgICAgbWVtc2V0IChDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKFNUQVRFX0NQVSAoc2QsIGkpKSwgMCwKLQkgICAgICBzaXplb2YgKCogQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChTVEFURV9DUFUgKHNkLCBpKSkpKTsKLSAgICAgIC8qIEhvb2sgaW4gY2FsbGJhY2sgZm9yIHJlcG9ydGluZyB0aGVzZSBzdGF0cyAqLwotICAgICAgUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDSyAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpKQotCT0gcHJpbnRfbTMycl9taXNjX2NwdTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgaW4gYSBnbG9iYWwgc28gdGhpbmdzIGxpa2Ugc3BhcmMzMl9kdW1wX3JlZ3MgY2FuIGJlIGludm9rZWQKLSAgICAgZnJvbSB0aGUgZ2RiIGNvbW1hbmQgbGluZS4gICovCi0gIGN1cnJlbnRfc3RhdGUgPSBzZDsKLQotICByZXR1cm4gc2Q7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHF1aXR0aW5nOwotewotICBtMzJyX2NnZW5fY3B1X2Nsb3NlIChDUFVfQ1BVX0RFU0MgKFNUQVRFX0NQVSAoc2QsIDApKSk7Ci0gIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci19Ci0MCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnZwKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52cDsKLXsKLSAgU0lNX0NQVSAqY3VycmVudF9jcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKLSAgU0lNX0FERFIgYWRkcjsKLQotICBpZiAoYWJmZCAhPSBOVUxMKQotICAgIGFkZHIgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBlbHNlCi0gICAgYWRkciA9IDA7Ci0gIHNpbV9wY19zZXQgKGN1cnJlbnRfY3B1LCBhZGRyKTsKLQotI2lmIDAKLSAgU1RBVEVfQVJHViAoc2QpID0gc2ltX2NvcHlfYXJndiAoYXJndik7Ci0gIFNUQVRFX0VOVlAgKHNkKSA9IHNpbV9jb3B5X2FyZ3YgKGVudnApOwotI2VuZGlmCi0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotLyogUFJPRklMRV9DUFVfQ0FMTEJBQ0sgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X20zMnJfbWlzY19jcHUgKFNJTV9DUFUgKmNwdSwgaW50IHZlcmJvc2UpCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOwotICBjaGFyIGJ1ZlsyMF07Ci0KLSAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChjcHUpIFtQUk9GSUxFX0lOU05fSURYXSkKLSAgICB7Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIk1pc2NlbGxhbmVvdXMgU3RhdGlzdGljc1xuXG4iKTsKLSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG5cbiIsCi0JCSAgICAgUFJPRklMRV9MQUJFTF9XSURUSCwgIkZpbGwgbm9wczoiLAotCQkgICAgIHNpbV9hZGRfY29tbWFzIChidWYsIHNpemVvZiAoYnVmKSwKLQkJCQkgICAgIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+ZmlsbG5vcF9jb3VudCkpOwotICAgICAgaWYgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoID09IGJmZF9tYWNoX20zMnJ4KQotCXNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG5cbiIsCi0JCSAgICAgICBQUk9GSUxFX0xBQkVMX1dJRFRILCAiUGFyYWxsZWwgaW5zbnM6IiwKLQkJICAgICAgIHNpbV9hZGRfY29tbWFzIChidWYsIHNpemVvZiAoYnVmKSwKLQkJCQkgICAgICAgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5wYXJhbGxlbF9jb3VudCkpOwotICAgIH0KLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17IAotICBjaGFyICoqYXJndjsKLQotICBpZiAoY21kID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGFyZ3YgPSBidWlsZGFyZ3YgKGNtZCk7Ci0KLSAgaWYgKGFyZ3ZbMF0gIT0gTlVMTAotICAgICAgJiYgc3RyY2FzZWNtcCAoYXJndlswXSwgImluZm8iKSA9PSAwCi0gICAgICAmJiBhcmd2WzFdICE9IE5VTEwKLSAgICAgICYmIHN0cm5jYXNlY21wIChhcmd2WzFdLCAicmVnIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBTSSB2YWw7Ci0KLSAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCBwcmludGluZyBiYnBzdyxiYnBjIGhlcmUgYXMgdGhlcmUgaXMgbm8gZXF1aXZhbGVudAotCSBmdW5jdGlvbmFsaXR5IGluIGdkYi4gICovCi0gICAgICBpZiAoYXJndlsyXSA9PSBOVUxMKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIk1pc3NpbmcgcmVnaXN0ZXIgaW4gYCVzJ1xuIiwgY21kKTsKLSAgICAgIGVsc2UgaWYgKGFyZ3ZbM10gIT0gTlVMTCkKLQlzaW1faW9fZXByaW50ZiAoc2QsICJUb28gbWFueSBhcmd1bWVudHMgaW4gYCVzJ1xuIiwgY21kKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGFyZ3ZbMl0sICJiYnBzdyIpID09IDApCi0JewotCSAgdmFsID0gYV9tMzJyX2hfY3JfZ2V0IChTVEFURV9DUFUgKHNkLCAwKSwgSF9DUl9CQlBTVyk7Ci0JICBzaW1faW9fcHJpbnRmIChzZCwgImJicHN3IDB4JXggJWRcbiIsIHZhbCwgdmFsKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChhcmd2WzJdLCAiYmJwYyIpID09IDApCi0JewotCSAgdmFsID0gYV9tMzJyX2hfY3JfZ2V0IChTVEFURV9DUFUgKHNkLCAwKSwgSF9DUl9CQlBDKTsKLQkgIHNpbV9pb19wcmludGYgKHNkLCAiYmJwYyAweCV4ICVkXG4iLCB2YWwsIHZhbCk7Ci0JfQotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlByaW50aW5nIG9mIHJlZ2lzdGVyIGAlcycgbm90IHN1cHBvcnRlZCB3aXRoIGBzaW0gaW5mbydcbiIsCi0JCQlhcmd2WzJdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2ltX2FyZ3NfY29tbWFuZCAoc2QsIGNtZCkgIT0gU0lNX1JDX09LKQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gc2ltIGNvbW1hbmQgYCVzJ1xuIiwgY21kKTsKLSAgICB9Ci0KLSAgZnJlZWFyZ3YgKGFyZ3YpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvc2ltLW1haW4uaCBiL3NpbS9tMzJyL3NpbS1tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZDFlOTEuLjAwMDAwMDAKLS0tIGEvc2ltL20zMnIvc2ltLW1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLQotLyogTWFpbiBoZWFkZXIgZm9yIHRoZSBtMzJyLiAgKi8KLQotI2lmbmRlZiBTSU1fTUFJTl9ICi0jZGVmaW5lIFNJTV9NQUlOX0gKLQotI2RlZmluZSBVU0lOR19TSU1fQkFTRV9IIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0KLXN0cnVjdCBfc2ltX2NwdTsgLyogRklYTUU6IHNob3VsZCBiZSBpbiBzaW0tYmFzaWNzLmggKi8KLXR5cGVkZWYgc3RydWN0IF9zaW1fY3B1IFNJTV9DUFU7Ci0KLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCi0jaW5jbHVkZSAiY2dlbi10eXBlcy5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAiYXJjaC5oIgotCi0vKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHNpbS1iYXNlLmguICAqLwotdHlwZWRlZiBVU0kgc2ltX2NpYTsKLQotI2RlZmluZSBDSUFfR0VUKGNwdSkgICAgIENQVV9QQ19HRVQgKGNwdSkKLSNkZWZpbmUgQ0lBX1NFVChjcHUsdmFsKSBDUFVfUENfU0VUICgoY3B1KSwgKHZhbCkpCi0KLSNkZWZpbmUgU0lNX0VOR0lORV9IQUxUX0hPT0soc2QsIGNwdSwgY2lhKSBcCi1kbyB7IFwKLSAgaWYgKGNwdSkgLyogbnVsbCBpZiBjdHJsLWMgKi8gXAotICAgIHNpbV9wY19zZXQgKChjcHUpLCAoY2lhKSk7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKHNkLCBjcHUsIGNpYSkgXAotZG8geyBcCi0gIHNpbV9wY19zZXQgKChjcHUpLCAoY2lhKSk7IFwKLX0gd2hpbGUgKDApCi0KLSNpbmNsdWRlICJzaW0tYmFzZS5oIgotI2luY2x1ZGUgImNnZW4tc2ltLmgiCi0jaW5jbHVkZSAibTMyci1zaW0uaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotDAotLyogVGhlIF9zaW1fY3B1IHN0cnVjdC4gICovCi0KLXN0cnVjdCBfc2ltX2NwdSB7Ci0gIC8qIHNpbS9jb21tb24gY3B1IGJhc2UuICAqLwotICBzaW1fY3B1X2Jhc2UgYmFzZTsKLQotICAvKiBTdGF0aWMgcGFydHMgb2YgY2dlbi4gICovCi0gIENHRU5fQ1BVIGNnZW5fY3B1OwotCi0gIE0zMlJfTUlTQ19QUk9GSUxFIG0zMnJfbWlzY19wcm9maWxlOwotI2RlZmluZSBDUFVfTTMyUl9NSVNDX1BST0ZJTEUoY3B1KSAoJiAoY3B1KS0+bTMycl9taXNjX3Byb2ZpbGUpCi0KLSAgLyogQ1BVIHNwZWNpZmljIHBhcnRzIGdvIGhlcmUuCi0gICAgIE5vdGUgdGhhdCBpbiBmaWxlcyB0aGF0IGRvbid0IG5lZWQgdG8gYWNjZXNzIHRoZXNlIHBpZWNlcyBXQU5UX0NQVV9GT08KLSAgICAgd29uJ3QgYmUgZGVmaW5lZCBhbmQgdGh1cyB0aGVzZSBwYXJ0cyB3b24ndCBhcHBlYXIuICBUaGlzIGlzIG9rIGluIHRoZQotICAgICBzZW5zZSB0aGF0IHRoaW5ncyB3b3JrLiAgSXQgaXMgYSBzb3VyY2Ugb2YgYnVncyB0aG91Z2guCi0gICAgIE9uZSBoYXMgdG8gb2YgY291cnNlIGJlIGNhcmVmdWwgdG8gbm90IHRha2UgdGhlIHNpemUgb2YgdGhpcwotICAgICBzdHJ1Y3QgYW5kIG5vIHN0cnVjdHVyZSBtZW1iZXJzIGFjY2Vzc2VkIGluIG5vbi1jcHUgc3BlY2lmaWMgZmlsZXMgY2FuCi0gICAgIGdvIGFmdGVyIGhlcmUuICBPaCBmb3IgYSBiZXR0ZXIgbGFuZ3VhZ2UuICAqLwotI2lmIGRlZmluZWQgKFdBTlRfQ1BVX00zMlJCRikKLSAgTTMyUkJGX0NQVV9EQVRBIGNwdV9kYXRhOwotI2VsaWYgZGVmaW5lZCAoV0FOVF9DUFVfTTMyUlhGKQotICBNMzJSWEZfQ1BVX0RBVEEgY3B1X2RhdGE7Ci0jZW5kaWYKLX07Ci0MCi0vKiBUaGUgc2ltX3N0YXRlIHN0cnVjdC4gICovCi0KLXN0cnVjdCBzaW1fc3RhdGUgewotICBzaW1fY3B1ICpjcHU7Ci0jZGVmaW5lIFNUQVRFX0NQVShzZCwgbikgKC8qJiovIChzZCktPmNwdSkKLQotICBDR0VOX1NUQVRFIGNnZW5fc3RhdGU7Ci0KLSAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKLX07Ci0MCi0vKiBNaXNjLiAgKi8KLQotLyogQ2F0Y2ggYWRkcmVzcyBleGNlcHRpb25zLiAgKi8KLWV4dGVybiBTSU1fQ09SRV9TSUdOQUxfRk4gbTMycl9jb3JlX3NpZ25hbDsKLSNkZWZpbmUgU0lNX0NPUkVfU0lHTkFMKFNELENQVSxDSUEsTUFQLE5SX0JZVEVTLEFERFIsVFJBTlNGRVIsRVJST1IpIFwKLW0zMnJfY29yZV9zaWduYWwgKChTRCksIChDUFUpLCAoQ0lBKSwgKE1BUCksIChOUl9CWVRFUyksIChBRERSKSwgXAotCQkgIChUUkFOU0ZFUiksIChFUlJPUikpCi0KLS8qIERlZmF1bHQgbWVtb3J5IHNpemUuICAqLwotI2RlZmluZSBNMzJSX0RFRkFVTFRfTUVNX1NJWkUgMHg4MDAwMDAgLyogOE0gKi8KLQotI2VuZGlmIC8qIFNJTV9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL3Rjb25maWcuaW4gYi9zaW0vbTMyci90Y29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjU5OWUzLi4wMDAwMDAwCi0tLSBhL3NpbS9tMzJyL3Rjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBNMzJSIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAtKi0gQyAtKi0gKi8KLQotI2lmbmRlZiBNMzJSX1RDT05GSUdfSAotI2RlZmluZSBNMzJSX1RDT05GSUdfSAotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIGNhbiB2YXJ5IHRoZSBzaXplIG9mIG1lbW9yeS4KLSAgIFNlZSB0aGUgeHh4IHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KLSAgIFRoaXMgZW5hYmxlcyB0aGUgYC1tIHNpemUnIG9wdGlvbi4KLSAgIFRoZSBtZW1vcnkgc2l6ZSBpcyBzdG9yZWQgaW4gU1RBVEVfTUVNX1NJWkUuICAqLwotLyogTm90IHVzZWQgZm9yIE0zMlIgc2luY2Ugd2UgdXNlIHRoZSBtZW1vcnkgbW9kdWxlLiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfTUVNX1NJWkUgKi8KLQotLyogU2VlIHNpbS1obG9hZC5jLiAgV2UgcHJvcGVybHkgaGFuZGxlIExNQS4gICovCi0jZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCi0KLS8qIEZvciBNU1BSIHN1cHBvcnQuICBGSVhNRTogcmV2aXNpdC4gICovCi0jZGVmaW5lIFdJVEhfREVWSUNFUyAxCi0KLS8qIEZJWE1FOiBSZXZpc2l0LiAgKi8KLSNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKLU1PRFVMRV9JTlNUQUxMX0ZOIGR2X3NvY2tzZXJfaW5zdGFsbDsKLSNkZWZpbmUgTU9EVUxFX0xJU1QgZHZfc29ja3Nlcl9pbnN0YWxsLAotI2VuZGlmCi0KLSNpZiAwCi0vKiBFbmFibGUgd2F0Y2hwb2ludHMuICAqLwotI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhpcyB0byBlbmFibGUgdGhlIGludHJpbnNpYyBicmVha3BvaW50IG1lY2hhbmlzbS4gKi8KLS8qIEZJWE1FOiBtYXkgYmUgYWJsZSB0byByZW1vdmUgU0lNX0hBVkVfQlJFQUtQT0lOVCBzaW5jZSBpdCBlc3NlbnRpYWxseQotICAgZHVwbGljYXRlcyBpZmRlZiBTSU1fQlJFQUtQT0lOVCAocmlnaHQ/KSAqLwotI2lmIDAKLSNkZWZpbmUgU0lNX0hBVkVfQlJFQUtQT0lOVFMKLSNkZWZpbmUgU0lNX0JSRUFLUE9JTlQgeyAweDEwLCAweGYxIH0KLSNkZWZpbmUgU0lNX0JSRUFLUE9JTlRfU0laRSAyCi0jZW5kaWYKLSNpZiAwCi0jZGVmaW5lIEhBVkVfRFZfU09DS1NFUgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZy4gIERpZmZlcmVudCBjcHUgZmFtaWxpZXMgY2FuJ3QgbWl4LW4tbWF0Y2ggLXNjYWNoZQotICAgYW5kIC1wYmIuICBIb3dldmVyIHNvbWUgY3B1IGZhbWlsaWVzIG1heSB1c2UgLXNpbXBsZSB3aGlsZSBvdGhlcnMgdXNlCi0gICBvbmUgb2YgLXNjYWNoZS8tcGJiLiAgKi8KLSNkZWZpbmUgV0lUSF9TQ0FDSEVfUEJCIDEKLQotI2VuZGlmIC8qIE0zMlJfVENPTkZJR19IICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci90cmFwcy5jIGIvc2ltL20zMnIvdHJhcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyMWFkOC4uMDAwMDAwMAotLS0gYS9zaW0vbTMyci90cmFwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qIG0zMnIgZXhjZXB0aW9uLCBpbnRlcnJ1cHQsIGFuZCB0cmFwIChFSVQpIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAidGFyZy12YWxzLmgiCi0KLS8qIFRoZSBzZW1hbnRpYyBjb2RlIGludm9rZXMgdGhpcyBmb3IgaW52YWxpZCAodW5yZWNvZ25pemVkKSBpbnN0cnVjdGlvbnMuCi0gICBDSUEgaXMgdGhlIGFkZHJlc3Mgd2l0aCB0aGUgaW52YWxpZCBpbnNuLgotICAgVlBDIGlzIHRoZSB2aXJ0dWFsIHBjIG9mIHRoZSBmb2xsb3dpbmcgaW5zbi4gICovCi0KLVNFTV9QQwotc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBjaWEsIFNFTV9QQyB2cGMpCi17Ci0gIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7Ci0KLSNpZiAwCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICBoX2JzbV9zZXQgKGN1cnJlbnRfY3B1LCBoX3NtX2dldCAoY3VycmVudF9jcHUpKTsKLSAgICAgIGhfYmllX3NldCAoY3VycmVudF9jcHUsIGhfaWVfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgaF9iY29uZF9zZXQgKGN1cnJlbnRfY3B1LCBoX2NvbmRfZ2V0IChjdXJyZW50X2NwdSkpOwotICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KLSAgICAgIGhfaWVfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0gICAgICBoX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgMCk7Ci0KLSAgICAgIGhfYnBjX3NldCAoY3VycmVudF9jcHUsIGNpYSk7Ci0KLSAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAotCQkJICBFSVRfUlNWRF9JTlNOX0FERFIpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTEwpOwotICByZXR1cm4gdnBjOwotfQotCi0vKiBQcm9jZXNzIGFuIGFkZHJlc3MgZXhjZXB0aW9uLiAgKi8KLQotdm9pZAotbTMycl9jb3JlX3NpZ25hbCAoU0lNX0RFU0Mgc2QsIFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBzaW1fY2lhIGNpYSwKLQkJICB1bnNpZ25lZCBpbnQgbWFwLCBpbnQgbnJfYnl0ZXMsIGFkZHJlc3Nfd29yZCBhZGRyLAotCQkgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsIHNpbV9jb3JlX3NpZ25hbHMgc2lnKQotewotICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCi0gICAgewotICAgICAgYV9tMzJyX2hfY3Jfc2V0IChjdXJyZW50X2NwdSwgSF9DUl9CQlBDLAotCQkgICAgICAgYV9tMzJyX2hfY3JfZ2V0IChjdXJyZW50X2NwdSwgSF9DUl9CUEMpKTsKLSAgICAgIGlmIChNQUNIX05VTSAoQ1BVX01BQ0ggKGN1cnJlbnRfY3B1KSkgPT0gTUFDSF9NMzJSKQotCXsKLQkgIG0zMnJiZl9oX2Jwc3dfc2V0IChjdXJyZW50X2NwdSwgbTMycmJmX2hfcHN3X2dldCAoY3VycmVudF9jcHUpKTsKLQkgIC8qIHNtIG5vdCBjaGFuZ2VkICovCi0JICBtMzJyYmZfaF9wc3dfc2V0IChjdXJyZW50X2NwdSwgbTMycmJmX2hfcHN3X2dldCAoY3VycmVudF9jcHUpICYgMHg4MCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG0zMnJ4Zl9oX2Jwc3dfc2V0IChjdXJyZW50X2NwdSwgbTMycnhmX2hfcHN3X2dldCAoY3VycmVudF9jcHUpKTsKLQkgIC8qIHNtIG5vdCBjaGFuZ2VkICovCi0JICBtMzJyeGZfaF9wc3dfc2V0IChjdXJyZW50X2NwdSwgbTMycnhmX2hfcHN3X2dldCAoY3VycmVudF9jcHUpICYgMHg4MCk7Ci0JfQotICAgICAgYV9tMzJyX2hfY3Jfc2V0IChjdXJyZW50X2NwdSwgSF9DUl9CUEMsIGNpYSk7Ci0KLSAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAotCQkJICBFSVRfQUREUl9FWENQX0FERFIpOwotICAgIH0KLSAgZWxzZQotICAgIHNpbV9jb3JlX3NpZ25hbCAoc2QsIGN1cnJlbnRfY3B1LCBjaWEsIG1hcCwgbnJfYnl0ZXMsIGFkZHIsCi0JCSAgICAgdHJhbnNmZXIsIHNpZyk7Ci19Ci0MCi0vKiBSZWFkL3dyaXRlIGZ1bmN0aW9ucyBmb3Igc3lzdGVtIGNhbGwgaW50ZXJmYWNlLiAgKi8KLQotc3RhdGljIGludAotc3lzY2FsbF9yZWFkX21lbSAoaG9zdF9jYWxsYmFjayAqY2IsIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKLQkJICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjaGFyICpidWYsIGludCBieXRlcykKLXsKLSAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKLSAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgc2MtPnAyOwotCi0gIHJldHVybiBzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgcmVhZF9tYXAsIGJ1ZiwgdGFkZHIsIGJ5dGVzKTsKLX0KLQotc3RhdGljIGludAotc3lzY2FsbF93cml0ZV9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgdGFkZHIsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGJ5dGVzKQotewotICBTSU1fREVTQyBzZCA9IChTSU1fREVTQykgc2MtPnAxOwotICBTSU1fQ1BVICpjcHUgPSAoU0lNX0NQVSAqKSBzYy0+cDI7Ci0KLSAgcmV0dXJuIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoc2QsIGNwdSwgd3JpdGVfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Ci19Ci0KLS8qIFRyYXAgc3VwcG9ydC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHBjIGFkZHJlc3MgdG8gY29udGludWUgYXQuCi0gICBQcmVwcm9jZXNzaW5nIGxpa2Ugc2F2aW5nIHRoZSB2YXJpb3VzIHJlZ2lzdGVycyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuICAqLwotCi1VU0kKLW0zMnJfdHJhcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgaW50IG51bSkKLXsKLSAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKLSAgaG9zdF9jYWxsYmFjayAqY2IgPSBTVEFURV9DQUxMQkFDSyAoc2QpOwotCi0jaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKLSAgLyogQ2hlY2sgZm9yIGJyZWFrcG9pbnRzICJvd25lZCIgYnkgdGhlIHNpbXVsYXRvciBmaXJzdCwgcmVnYXJkbGVzcwotICAgICBvZiAtLWVudmlyb25tZW50LiAgKi8KLSAgaWYgKG51bSA9PSBUUkFQX0JSRUFLUE9JTlQpCi0gICAgewotICAgICAgLyogRmlyc3QgdHJ5IHNpbS1icmVhay5jLiAgSWYgaXQncyBhIGJyZWFrcG9pbnQgdGhlIHNpbXVsYXRvciAib3ducyIKLQkgaXQgZG9lc24ndCByZXR1cm4uICBPdGhlcndpc2UgaXQgcmV0dXJucyBhbmQgbGV0J3MgdXMgdHJ5LiAgKi8KLSAgICAgIHNpbV9oYW5kbGVfYnJlYWtwb2ludCAoc2QsIGN1cnJlbnRfY3B1LCBwYyk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV3IHBjIGlzIHRoZSB0cmFwIHZlY3RvciBlbnRyeS4KLQkgV2UgYXNzdW1lIHRoZXJlJ3MgYSBicmFuY2ggdGhlcmUgdG8gc29tZSBoYW5kbGVyLiAgKi8KLSAgICAgIFVTSSBuZXdfcGMgPSBFSVRfVFJBUF9CQVNFX0FERFIgKyBudW0gKiA0OwotICAgICAgcmV0dXJuIG5ld19wYzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW0pCi0gICAgewotICAgIGNhc2UgVFJBUF9TWVNDQUxMIDoKLSAgICAgIHsKLQlDQl9TWVNDQUxMIHM7Ci0KLQlDQl9TWVNDQUxMX0lOSVQgKCZzKTsKLQlzLmZ1bmMgPSBhX20zMnJfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAwKTsKLQlzLmFyZzEgPSBhX20zMnJfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAxKTsKLQlzLmFyZzIgPSBhX20zMnJfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAyKTsKLQlzLmFyZzMgPSBhX20zMnJfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAzKTsKLQotCWlmIChzLmZ1bmMgPT0gVEFSR0VUX1NZU19leGl0KQotCSAgewotCSAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgcGMsIHNpbV9leGl0ZWQsIHMuYXJnMSk7Ci0JICB9Ci0KLQlzLnAxID0gKFBUUikgc2Q7Ci0Jcy5wMiA9IChQVFIpIGN1cnJlbnRfY3B1OwotCXMucmVhZF9tZW0gPSBzeXNjYWxsX3JlYWRfbWVtOwotCXMud3JpdGVfbWVtID0gc3lzY2FsbF93cml0ZV9tZW07Ci0JY2Jfc3lzY2FsbCAoY2IsICZzKTsKLQlhX20zMnJfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAyLCBzLmVycmNvZGUpOwotCWFfbTMycl9oX2dyX3NldCAoY3VycmVudF9jcHUsIDAsIHMucmVzdWx0KTsKLQlhX20zMnJfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxLCBzLnJlc3VsdDIpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBUUkFQX0JSRUFLUE9JTlQ6Ci0gICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgcGMsCi0JCSAgICAgICBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIHsKLQlVU0kgbmV3X3BjID0gRUlUX1RSQVBfQkFTRV9BRERSICsgbnVtICogNDsKLQlyZXR1cm4gbmV3X3BjOwotICAgICAgfQotICAgIH0KLQotICAvKiBGYWtlIGFuICJydGUiIGluc24uICAqLwotICAvKiBGSVhNRTogU2hvdWxkIGR1cGxpY2F0ZSBhbGwgb2YgcnRlIHByb2Nlc3NpbmcuICAqLwotICByZXR1cm4gKHBjICYgLTQpICsgNDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9tY29yZS9DaGFuZ2VMb2cgYi9zaW0vbWNvcmUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWU1ZWY5Li4wMDAwMDAwCi0tLSBhL3NpbS9tY29yZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0yMDAwLTAyLTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoaGFuZGxlX3RyYXAxKTogRml4IGhhbmRsaW5nIG9mIGZjbG9zZSBzeXN0ZW0gY2FsbC4KLQlQYXRjaCBzdWJtaXR0ZWQgYnkgPGRyZXcuc2Fya2lzaWFuQG1vdG9yb2xhLmNvbT4uCi0KLTIwMDAtMDItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jICh0YXJnZXRfYmlnX2VuZGlhbik6IE5ldyB2YXJpYWJsZS4KLQkobWNvcmVfZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyLCBtY29yZV9zdG9yZV91bnNpZ25lZF9pbnRlZ2VyLAotCXdsYXQsIHJsYXQsIHNpbV9yZXN1bWUsIHNpbV9sb2FkKTogQWRkIHN1cHByb3QgZm9yIGxpdHRsZQotCWVuZGlhbiB0YXJnZXRzLiAKLQotMjAwMC0wMS0xMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBEbyBub3QgcmVseSB1cG9uIGhvc3Qgc2VtYW50aWNzIG9mIHNoaWZ0Ci0Jb3BlcmF0b3JzIHRvIGltcGxlbWVudCBNKkNvcmUgc2VtYW50aWNzLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA2LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzeXNkZXAuaDogRG8gbm90IGRlZmluZSBwcm90b3R5cGVzIGZvciBtZW1jcHkgYW5kIHN0cmNociBpZiB0aGV5Ci0JYXJlIG1hY3Jvcy4KLQotMTk5OS0wNS0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBBZGQgbW9yZSB0cmFjaW5nIG91dHB1dC4KLQotMTk5OS0wNS0xNyAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKE5VTV9NQ09SRV9SRUdTKTogSW5jcmVhc2UgYnkgb25lIHRvIGFsbG93IGFjY2VzcyB0byBQQy4KLQkoc2ltX3Jlc3VtZSk6IENvcnJlY3Qgb2ZmIGJ5IG9uZSBpbnN0cnVjdGlvbiBlcnJvciB3aGVuIGEgYnJlYWtwb2ludAotCWlzIGhpdC4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi0xOTk5LTA1LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IFJlY29yZCBQQyBpbiBjYXNlIGl0IGlzIG5lZWRlZCBmb3IgZXJyb3IKLQltZXNzYWdlcyBhbmQgdGhlIG9yaWdpbmFsIGhhcyBiZWVuIGNvcnJ1cHRlZC4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGaXggdHlwbyAnb3plJyAtPiAnZG96ZScuCi0JKHV0aWwpOiBIYW5kbGUgMHg1MEZGIHN0dWJzIHByb3Blcmx5LgotCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzZXRfaW5pdGlhbF9ncHJzKTogT25seSBkaXNwbGF5IG1lbW9yeSByYW5nZSBpZgotCXZlcmJvc2Ugb3B0aW9uIGhhcyBiZWVuIHNldC4KLQotMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IEFkZCB0cmFjaW5nIGFuZCB2ZXJib3NlIG9wdGlvbnMuCi0JRml4ZWQgdHJhcCBhbmQgc3lzY2FsbCBlbXVsYXRpb25zLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogTmV3IGZpbGU6IFNpbXVsYXRvciBmb3IgTUNvcmUuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGU6IFN5c3RlbXMgZGVmaW5pdGlvbnMgZm9yIE1Db3JlIHNpbXVsYXRvci4KLQkqIGNvbmZpZ3VyZS5pbjogTmV3IGZpbGU6IENvbmZpZ3VyZSBzY3JpcHQgZm9yIE1Db3JlIHNpbXVsYXRvci4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGU6IEdlbnJlYXRlZC4KLQkqIGNvbmZpZyxpbjogTmV3IGZpbGU6IENvbmZpZyBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW46IE5ldyBmaWxlOiBNZXRhIG1ha2VmaWxlIGZvciBNQ29yZSBzaW11bGF0b3IuCi0KZGlmZiAtLWdpdCBhL3NpbS9tY29yZS9NYWtlZmlsZS5pbiBiL3NpbS9tY29yZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjODU1Ny4uMDAwMDAwMAotLS0gYS9zaW0vbWNvcmUvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBNQ29yZSBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCA5NiwgMTksIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1TSU1fT0JKUyA9IGludGVycC5vIHNpbS1sb2FkLm8KLVNJTV9FWFRSQV9MSUJTID0gLWxtCi1TSU1fRVhUUkFfQ0xFQU4gPSBtY29yZS1jbGVhbgotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1pbnRlcnAubzogaW50ZXJwLmMKLQotbWNvcmUtY2xlYW46CmRpZmYgLS1naXQgYS9zaW0vbWNvcmUvY29uZmlnLmluIGIvc2ltL21jb3JlL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3MjRiYy4uMDAwMDAwMAotLS0gYS9zaW0vbWNvcmUvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSApkaWZmIC0tZ2l0IGEvc2ltL21jb3JlL2NvbmZpZ3VyZSBiL3NpbS9tY29yZS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3MjBkNmIuLjAwMDAwMDAKLS0tIGEvc2ltL21jb3JlL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQwMjQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1zaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi0KLQotCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLQotCi0KLQotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODY6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA1OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMjI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjc3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1OTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTc1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMTg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjE4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4MDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMTM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzUyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwNzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTcxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODM5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Nzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTYwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZwotcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZwotcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZwotcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9tY29yZS9jb25maWd1cmUuaW4gYi9zaW0vbWNvcmUvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzNiMGJjLi4wMDAwMDAwCi0tLSBhL3NpbS9tY29yZS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotQUNfUFJFUkVRKDIuNSlkbmwKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLVNJTV9BQ19DT01NT04KLQotQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL21jb3JlL2ludGVycC5jIGIvc2ltL21jb3JlL2ludGVycC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTZlNDgxLi4wMDAwMDAwCi0tLSBhL3NpbS9tY29yZS9pbnRlcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMTQgKzAsMCBAQAotLyogU2ltdWxhdG9yIGZvciBNb3Rvcm9sYSdzIE1Db3JlIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgkvKiBmb3IgYnl0ZSBvcmRlcmluZyBtYWNyb3MgKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShBKSAoc2l6ZW9mIChBKSAvIHNpemVvZiAoQSlbMF0pCi0jZW5kaWYKLQotCi10eXBlZGVmIGxvbmcgaW50ICAgICAgICAgICB3b3JkOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCAgdXdvcmQ7Ci0KLXN0YXRpYyBpbnQgICAgICAgICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgaGVhcF9wdHIgPSAwOwotaG9zdF9jYWxsYmFjayAqICAgICAgIGNhbGxiYWNrOwotCi0KLXVuc2lnbmVkIGxvbmcKLW1jb3JlX2V4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYWRkciwgbGVuKQotICAgICB1bnNpZ25lZCBjaGFyICogYWRkcjsKLSAgICAgaW50IGxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXR2YWw7Ci0gIHVuc2lnbmVkIGNoYXIgKiBwOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnRhZGRyID0gKHVuc2lnbmVkIGNoYXIgKilhZGRyOwotICB1bnNpZ25lZCBjaGFyICogZW5kYWRkciA9IHN0YXJ0YWRkciArIGxlbjsKLSAKLSAgaWYgKGxlbiA+IChpbnQpIHNpemVvZiAodW5zaWduZWQgbG9uZykpCi0gICAgcHJpbnRmICgiVGhhdCBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSBvbiBpbnRlZ2VycyBvZiBtb3JlIHRoYW4gJWQgYnl0ZXMuIiwKLQkgICAgc2l6ZW9mICh1bnNpZ25lZCBsb25nKSk7Ci0gCi0gIC8qIFN0YXJ0IGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGVuZCBvZiB0aGUgaW50ZWdlciwgYW5kIHdvcmsgdG93YXJkcwotICAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLwotICByZXR2YWwgPSAwOwotCi0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAocCA9IGVuZGFkZHI7IHAgPiBzdGFydGFkZHI7KQotCXJldHZhbCA9IChyZXR2YWwgPDwgOCkgfCAqIC0tIHA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChwID0gc3RhcnRhZGRyOyBwIDwgZW5kYWRkcjspCi0JcmV0dmFsID0gKHJldHZhbCA8PCA4KSB8ICogcCArKzsKLSAgICB9Ci0gIAotICByZXR1cm4gcmV0dmFsOwotfQotCi12b2lkCi1tY29yZV9zdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChhZGRyLCBsZW4sIHZhbCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGFkZHI7Ci0gICAgIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotewotICB1bnNpZ25lZCBjaGFyICogcDsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0YWRkciA9ICh1bnNpZ25lZCBjaGFyICopYWRkcjsKLSAgdW5zaWduZWQgY2hhciAqIGVuZGFkZHIgPSBzdGFydGFkZHIgKyBsZW47Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChwID0gc3RhcnRhZGRyOyBwIDwgZW5kYWRkcjspCi0JewotCSAgKiBwICsrID0gdmFsICYgMHhmZjsKLQkgIHZhbCA+Pj0gODsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChwID0gZW5kYWRkcjsgcCA+IHN0YXJ0YWRkcjspCi0JewotCSAgKiAtLSBwID0gdmFsICYgMHhmZjsKLQkgIHZhbCA+Pj0gODsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGUgbWFjaGluZSBzdGF0ZS4KLSAgIFRoaXMgc3RhdGUgaXMgbWFpbnRhaW5lZCBpbiBob3N0IGJ5dGUgb3JkZXIuICBUaGUgCi0gICBmZXRjaC9zdG9yZSByZWdpc3RlciBmdW5jdGlvbnMgbXVzdCB0cmFuc2xhdGUgYmV0d2VlbiBob3N0Ci0gICBieXRlIG9yZGVyIGFuZCB0aGUgdGFyZ2V0IHByb2Nlc3NvciBieXRlIG9yZGVyLiAgCi0gICBLZWVwaW5nIHRoaXMgZGF0YSBpbiB0YXJnZXQgYnl0ZSBvcmRlciBzaW1wbGlmaWVzIHRoZSByZWdpc3RlcgotICAgcmVhZC93cml0ZSBmdW5jdGlvbnMuICBLZWVwaW5nIHRoaXMgZGF0YSBpbiBuYXRpdmUgb3JkZXIgaW1wcm92ZXMKLSAgIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc2ltdWxhdG9yLiAgU2ltdWxhdGlvbiBzcGVlZCBpcyBkZWVtZWQgbW9yZQotICAgaW1wb3J0YW50LiAgKi8KLQotLyogVGhlIG9yZGVyaW5nIG9mIHRoZSBtY29yZV9yZWdzZXQgc3RydWN0dXJlIGlzIG1hdGNoZWQgaW4gdGhlCi0gICBnZGIvY29uZmlnL21jb3JlL3RtLW1jb3JlLmggZmlsZSBpbiB0aGUgUkVHSVNURVJfTkFNRVMgbWFjcm8uICAqLwotc3RydWN0IG1jb3JlX3JlZ3NldAotewotICB3b3JkCSAgICAgICAgICBncmVncyBbMTZdOwkJLyogcHJpbWFyeSByZWdpc3RlcnMgKi8KLSAgd29yZAkgICAgICAgICAgYWx0X2dyZWdzIFsxNl07CS8qIGFsdCByZWdpc3RlciBmaWxlICovCi0gIHdvcmQJICAgICAgICAgIGNyZWdzIFszMl07CQkvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB3b3JkCSAgICAgICAgICBwYzsJCQkvKiB0aGUgcGMgKi8KLSAgaW50CQkgIHRpY2tzOwotICBpbnQJCSAgc3RhbGxzOwotICBpbnQJCSAgY3ljbGVzOwotICBpbnQJCSAgaW5zdHM7Ci0gIGludAkJICBleGNlcHRpb247Ci0gIHVuc2lnbmVkIGxvbmcgICBtc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqIG1lbW9yeTsKLSAgd29yZCAqICAgICAgICAgIGFjdGl2ZV9ncmVnczsKLX07Ci0KLXVuaW9uCi17Ci0gIHN0cnVjdCBtY29yZV9yZWdzZXQgYXNyZWdzOwotICB3b3JkIGFzaW50cyBbMV07CQkvKiBidXQgYWNjZXNzZWQgbGFyZ2VyLi4uICovCi19IGNwdTsKLQotI2RlZmluZSBMQVNUX1ZBTElEX0NSRUcJMzIJCS8qIG9ubHkgMC4uMTIgaW1wbGVtZW50ZWQgKi8KLSNkZWZpbmUJTlVNX01DT1JFX1JFR1MJKDE2ICsgMTYgKyBMQVNUX1ZBTElEX0NSRUcgKyAxKQotCi1pbnQgbWVtY3ljbGVzID0gMTsKLQotc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7Ci1zdGF0aWMgY2hhciAqIG15bmFtZTsKLQotc3RhdGljIGludCBpc3N1ZV9tZXNzYWdlcyA9IDA7Ci0KLSNkZWZpbmUgZ3IJYXNyZWdzLmFjdGl2ZV9ncmVncwotI2RlZmluZSBjcglhc3JlZ3MuY3JlZ3MKLSNkZWZpbmUgc3IJYXNyZWdzLmNyZWdzWzBdCi0jZGVmaW5lCXZicglhc3JlZ3MuY3JlZ3NbMV0KLSNkZWZpbmUJZXNyCWFzcmVncy5jcmVnc1syXQotI2RlZmluZQlmc3IJYXNyZWdzLmNyZWdzWzNdCi0jZGVmaW5lCWVwYwlhc3JlZ3MuY3JlZ3NbNF0KLSNkZWZpbmUJZnBjCWFzcmVncy5jcmVnc1s1XQotI2RlZmluZQlzczAJYXNyZWdzLmNyZWdzWzZdCi0jZGVmaW5lCXNzMQlhc3JlZ3MuY3JlZ3NbN10KLSNkZWZpbmUJc3MyCWFzcmVncy5jcmVnc1s4XQotI2RlZmluZQlzczMJYXNyZWdzLmNyZWdzWzldCi0jZGVmaW5lCXNzNAlhc3JlZ3MuY3JlZ3NbMTBdCi0jZGVmaW5lCWdjcglhc3JlZ3MuY3JlZ3NbMTFdCi0jZGVmaW5lCWdzcglhc3JlZ3MuY3JlZ3NbMTJdCi0jZGVmaW5lIG1lbQlhc3JlZ3MubWVtb3J5Ci0KLS8qIG1hbml1cGxhdGUgdGhlIGNhcnJ5IGJpdCAqLwotI2RlZmluZQlDX09OKCkJIChjcHUuc3IgJiAxKQotI2RlZmluZQlDX1ZBTFVFKCkgKGNwdS5zciAmIDEpCi0jZGVmaW5lCUNfT0ZGKCkJICgoY3B1LnNyICYgMSkgPT0gMCkKLSNkZWZpbmUJU0VUX0MoKQkge2NwdS5zciB8PSAxO30KLSNkZWZpbmUJQ0xSX0MoKQkge2NwdS5zciAmPSAweGZmZmZmZmZlO30KLSNkZWZpbmUJTkVXX0Modikge0NMUl9DKCk7IGNwdS5zciB8PSAoKHYpICYgMSk7fQotCi0jZGVmaW5lCVNSX0FGKCkgKChjcHUuc3IgPj4gMSkgJiAxKQotCi0jZGVmaW5lCVRSQVBDT0RFCTEJLyogcjEgaG9sZHMgd2hpY2ggZnVuY3Rpb24gd2Ugd2FudCAqLwotI2RlZmluZQlQQVJNMQkyCQkvKiBmaXJzdCBwYXJhbWV0ZXIgICovCi0jZGVmaW5lCVBBUk0yCTMKLSNkZWZpbmUJUEFSTTMJNAotI2RlZmluZQlQQVJNNAk1Ci0jZGVmaW5lCVJFVDEJMgkJLyogcmVnaXN0ZXIgZm9yIHJldHVybiB2YWx1ZXMuICovCi0KLWxvbmcKLWludF9zYnJrIChpbmNfYnl0ZXMpCi0gICAgIGludCBpbmNfYnl0ZXM7Ci17Ci0gIGxvbmcgYWRkcjsKLSAgCi0gIGFkZHIgPSBoZWFwX3B0cjsKLSAgCi0gIGhlYXBfcHRyICs9IGluY19ieXRlczsKLSAgCi0gIGlmIChpc3N1ZV9tZXNzYWdlcyAmJiBoZWFwX3B0cj5jcHUuZ3JbMF0pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogaGVhcF9wdHIgb3ZlcmxhcHMgc3RhY2shXG4iKTsKLSAgCi0gIHJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgdm9pZCBJTkxJTkUgCi13YmF0ICh4LCB2KQotICAgICB3b3JkIHgsIHY7Ci17Ci0gIGlmICgoKHV3b3JkKXgpID49IGNwdS5hc3JlZ3MubXNpemUpCi0gICAgewotICAgICAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCWZwcmludGYgKHN0ZGVyciwgImJ5dGUgd3JpdGUgdG8gMHgleCBvdXRzaWRlIG1lbW9yeSByYW5nZVxuIiwgeCk7Ci0gICAgICAKLSAgICAgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHU0VHVjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gY3B1Lm1lbSArIHg7Ci0gICAgICBwWzBdID0gdjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIElOTElORSAKLXdsYXQgKHgsIHYpCi0gICAgIHdvcmQgeCwgdjsKLXsKLSAgaWYgKCgodXdvcmQpeCkgPj0gY3B1LmFzcmVncy5tc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoaXNzdWVfbWVzc2FnZXMpCi0JZnByaW50ZiAoc3RkZXJyLCAid29yZCB3cml0ZSB0byAweCV4IG91dHNpZGUgbWVtb3J5IHJhbmdlXG4iLCB4KTsKLSAgICAgIAotICAgICAgY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdTRUdWOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoeCAmIDMpICE9IDApCi0JewotCSAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJ3b3JkIHdyaXRlIHRvIHVuYWxpZ25lZCBtZW1vcnkgYWRkcmVzczogMHgleFxuIiwgeCk7Ci0gICAgICAKLQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHQlVTOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgdW5zaWduZWQgY2hhciAqIHAgPSBjcHUubWVtICsgeDsKLQkgIHBbM10gPSB2ID4+IDI0OwotCSAgcFsyXSA9IHYgPj4gMTY7Ci0JICBwWzFdID0gdiA+PiA4OwotCSAgcFswXSA9IHY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKiBwID0gY3B1Lm1lbSArIHg7Ci0JICBwWzBdID0gdiA+PiAyNDsKLQkgIHBbMV0gPSB2ID4+IDE2OwotCSAgcFsyXSA9IHYgPj4gODsKLQkgIHBbM10gPSB2OwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIElOTElORSAKLXdoYXQgKHgsIHYpCi0gICAgIHdvcmQgeCwgdjsKLXsKLSAgaWYgKCgodXdvcmQpeCkgPj0gY3B1LmFzcmVncy5tc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoaXNzdWVfbWVzc2FnZXMpCi0JZnByaW50ZiAoc3RkZXJyLCAic2hvcnQgd3JpdGUgdG8gMHgleCBvdXRzaWRlIG1lbW9yeSByYW5nZVxuIiwgeCk7Ci0gICAgICAKLSAgICAgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHU0VHVjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKHggJiAxKSAhPSAwKQotCXsKLQkgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAic2hvcnQgd3JpdGUgdG8gdW5hbGlnbmVkIG1lbW9yeSBhZGRyZXNzOiAweCV4XG4iLAotCQkgICAgIHgpOwotICAgICAgCi0JICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0JVUzsKLQl9Ci0gICAgICBlbHNlIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKiBwID0gY3B1Lm1lbSArIHg7Ci0JICBwWzFdID0gdiA+PiA4OwotCSAgcFswXSA9IHY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKiBwID0gY3B1Lm1lbSArIHg7Ci0JICBwWzBdID0gdiA+PiA4OwotCSAgcFsxXSA9IHY7Ci0JfQotICAgIH0KLX0KLQotLyogUmVhZCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCBJTkxJTkUgCi1yYmF0ICh4KQotICAgICB3b3JkIHg7Ci17Ci0gIGlmICgoKHV3b3JkKXgpID49IGNwdS5hc3JlZ3MubXNpemUpCi0gICAgewotICAgICAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCWZwcmludGYgKHN0ZGVyciwgImJ5dGUgcmVhZCBmcm9tIDB4JXggb3V0c2lkZSBtZW1vcnkgcmFuZ2VcbiIsIHgpOwotICAgICAgCi0gICAgICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1NFR1Y7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogcCA9IGNwdS5tZW0gKyB4OwotICAgICAgcmV0dXJuIHBbMF07Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IElOTElORSAKLXJsYXQgKHgpCi0gICAgIHdvcmQgeDsKLXsKLSAgaWYgKCgodXdvcmQpIHgpID49IGNwdS5hc3JlZ3MubXNpemUpCi0gICAgewotICAgICAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCWZwcmludGYgKHN0ZGVyciwgIndvcmQgcmVhZCBmcm9tIDB4JXggb3V0c2lkZSBtZW1vcnkgcmFuZ2VcbiIsIHgpOwotICAgICAgCi0gICAgICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1NFR1Y7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKHggJiAzKSAhPSAwKQotCXsKLQkgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAid29yZCByZWFkIGZyb20gdW5hbGlnbmVkIGFkZHJlc3M6IDB4JXhcbiIsIHgpOwotICAgICAgCi0JICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0JVUzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgdW5zaWduZWQgY2hhciAqIHAgPSBjcHUubWVtICsgeDsKLQkgIHJldHVybiAocFszXSA8PCAyNCkgfCAocFsyXSA8PCAxNikgfCAocFsxXSA8PCA4KSB8IHBbMF07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKiBwID0gY3B1Lm1lbSArIHg7Ci0JICByZXR1cm4gKHBbMF0gPDwgMjQpIHwgKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCBwWzNdOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgSU5MSU5FIAotcmhhdCAoeCkKLSAgICAgd29yZCB4OwotewotICBpZiAoKCh1d29yZCl4KSA+PSBjcHUuYXNyZWdzLm1zaXplKQotICAgIHsKLSAgICAgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQlmcHJpbnRmIChzdGRlcnIsICJzaG9ydCByZWFkIGZyb20gMHgleCBvdXRzaWRlIG1lbW9yeSByYW5nZVxuIiwgeCk7Ci0gICAgICAKLSAgICAgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHU0VHVjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoeCAmIDEpICE9IDApCi0JewotCSAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJzaG9ydCByZWFkIGZyb20gdW5hbGlnbmVkIGFkZHJlc3M6IDB4JXhcbiIsIHgpOwotICAgICAgCi0JICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0JVUzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgdW5zaWduZWQgY2hhciAqIHAgPSBjcHUubWVtICsgeDsKLQkgIHJldHVybiAocFsxXSA8PCA4KSB8IHBbMF07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKiBwID0gY3B1Lm1lbSArIHg7Ci0JICByZXR1cm4gKHBbMF0gPDwgOCkgfCBwWzFdOwotCX0KLSAgICB9Ci19Ci0KLQotI2RlZmluZSBTRVhUQih4KSAgICAgCSgoKHggJiAweGZmKSBeICh+IDB4N2YpKSArIDB4ODApCi0jZGVmaW5lIFNFWFRXKHkpICAgIAkoKGludCkoKHNob3J0KXkpKQotCi1zdGF0aWMgaW50Ci1JT01FTSAoYWRkciwgd3JpdGUsIHZhbHVlKQotICAgICBpbnQgYWRkcjsKLSAgICAgaW50IHdyaXRlOwotICAgICBpbnQgdmFsdWU7Ci17Ci19Ci0KLS8qIERlZmF1bHQgdG8gYSA4IE1ieXRlICg9PSAyXjIzKSBtZW1vcnkgc3BhY2UuICAqLwotc3RhdGljIGludCBzaW1fbWVtb3J5X3NpemUgPSAyMzsKLQotI2RlZmluZQlNRU1fU0laRV9GTE9PUgk2NAotdm9pZAotc2ltX3NpemUgKHBvd2VyKQotICAgICBpbnQgcG93ZXI7Ci17Ci0gIHNpbV9tZW1vcnlfc2l6ZSA9IHBvd2VyOwotICBjcHUuYXNyZWdzLm1zaXplID0gMSA8PCBzaW1fbWVtb3J5X3NpemU7Ci0KLSAgaWYgKGNwdS5tZW0pCi0gICAgZnJlZSAoY3B1Lm1lbSk7Ci0KLSAgLyogV2F0Y2ggb3V0IGZvciB0aGUgJzAgY291bnQnIHByb2JsZW0uIFRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIKLSAgICAgd2F5Li4gZS5nLiwgd2h5IGRvIHdlIHVzZSA2NCBoZXJlPyAgKi8KLSAgaWYgKGNwdS5hc3JlZ3MubXNpemUgPCA2NCkJLyogRW5zdXJlIGEgYm91bmRhcnkuICAqLwotICAgIGNwdS5tZW0gPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKDY0LCAoNjQgKyBjcHUuYXNyZWdzLm1zaXplKSAvIDY0KTsKLSAgZWxzZQotICAgIGNwdS5tZW0gPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKDY0LCBjcHUuYXNyZWdzLm1zaXplIC8gNjQpOwotCi0gIGlmICghY3B1Lm1lbSkKLSAgICB7Ci0gICAgICBpZiAoaXNzdWVfbWVzc2FnZXMpCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgIk5vdCBlbm91Z2ggVk0gZm9yIHNpbXVsYXRpb24gb2YgJWQgYnl0ZXMgb2YgUkFNXG4iLAotCQkgY3B1LmFzcmVncy5tc2l6ZSk7Ci0KLSAgICAgIGNwdS5hc3JlZ3MubXNpemUgPSAxOwotICAgICAgY3B1Lm1lbSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoMSwgMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotaW5pdF9wb2ludGVycyAoKQotewotICBpZiAoY3B1LmFzcmVncy5tc2l6ZSAhPSAoMSA8PCBzaW1fbWVtb3J5X3NpemUpKQotICAgIHNpbV9zaXplIChzaW1fbWVtb3J5X3NpemUpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2luaXRpYWxfZ3BycyAoKQotewotICBpbnQgaTsKLSAgbG9uZyBzcGFjZTsKLSAgdW5zaWduZWQgbG9uZyBtZW1zaXplOwotICAKLSAgaW5pdF9wb2ludGVycyAoKTsKLQotICAvKiBTZXQgdXAgbWFjaGluZSBqdXN0IG91dCBvZiByZXNldC4gICovCi0gIGNwdS5hc3JlZ3MucGMgPSAwOwotICBjcHUuc3IgPSAwOwotICAKLSAgbWVtc2l6ZSA9IGNwdS5hc3JlZ3MubXNpemUgLyAoMTAyNCAqIDEwMjQpOwotCi0gIGlmIChpc3N1ZV9tZXNzYWdlcyA+IDEpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiU2ltdWxhdGVkIG1lbW9yeSBvZiAlZCBNYnl0ZXMgKDB4MCAuLiAweCUwOHgpXG4iLAotCSAgICAgbWVtc2l6ZSwgY3B1LmFzcmVncy5tc2l6ZSAtIDEpOwotCi0gIC8qIENsZWFuIG91dCB0aGUgR1BScyBhbmQgYWx0ZXJuYXRlIEdQUnMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBjcHUuYXNyZWdzLmdyZWdzW2ldID0gMDsKLSAgICAgIGNwdS5hc3JlZ3MuYWx0X2dyZWdzW2ldID0gMDsKLSAgICB9Ci0gIAotICAvKiBNYWtlIG91ciByZWdpc3RlciBzZXQgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgaWYgKFNSX0FGKCkpCi0gICAgY3B1LmFzcmVncy5hY3RpdmVfZ3JlZ3MgPSAmY3B1LmFzcmVncy5hbHRfZ3JlZ3NbMF07Ci0gIGVsc2UKLSAgICBjcHUuYXNyZWdzLmFjdGl2ZV9ncmVncyA9ICZjcHUuYXNyZWdzLmdyZWdzWzBdOwotICAKLSAgLyogQUJJIHNwZWNpZmllcyBpbml0aWFsIHZhbHVlcyBmb3IgdGhlc2UgcmVnaXN0ZXJzLiAgKi8KLSAgY3B1LmdyWzBdID0gY3B1LmFzcmVncy5tc2l6ZSAtIDQ7Ci0gCi0gIC8qIGRhYyBmaXgsIHRoZSBzdGFjayBhZGRyZXNzIG11c3QgYmUgOC1ieXRlIGFsaWduZWQhICovCi0gIGNwdS5nclswXSA9IGNwdS5nclswXSAtIGNwdS5nclswXSAlIDg7Ci0gIGNwdS5ncltQQVJNMV0gPSAwOwotICBjcHUuZ3JbUEFSTTJdID0gMDsKLSAgY3B1LmdyW1BBUk0zXSA9IDA7Ci0gIGNwdS5ncltQQVJNNF0gPSBjcHUuZ3JbMF07Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnRlcnJ1cHQgKCkKLXsKLSAgY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdJTlQ7Ci19Ci0KLS8qIEZ1bmN0aW9ucyBzbyB0aGF0IHRyYXBwZWQgb3Blbi9jbG9zZSBkb24ndCBpbnRlcmZlcmUgd2l0aCB0aGUKLSAgIHBhcmVudCdzIGZ1bmN0aW9ucy4gIFdlIHNheSB0aGF0IHdlIGNhbid0IGNsb3NlIHRoZSBkZXNjcmlwdG9ycwotICAgdGhhdCB3ZSBkaWRuJ3Qgb3Blbi4gIGV4aXQoKSBhbmQgY2xlYW51cCgpIGdldCBpbiB0cm91YmxlIGhlcmUsCi0gICB0byBzb21lIGV4dGVudC4gIFRoYXQncyB0aGUgcHJpY2Ugb2YgZW11bGF0aW9uLiAgKi8KLQotdW5zaWduZWQgY2hhciBvcGVuZWRbMTAwXTsKLQotc3RhdGljIHZvaWQKLWxvZ19vcGVuIChmZCkKLSAgICBpbnQgZmQ7Ci17Ci0gIGlmIChmZCA8IDAgfHwgZmQgPiBOVU1fRUxFTSAob3BlbmVkKSkKLSAgICByZXR1cm47Ci0gIAotICBvcGVuZWRbZmRdID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWxvZ19jbG9zZSAoZmQpCi0gICAgIGludCBmZDsKLXsKLSAgaWYgKGZkIDwgMCB8fCBmZCA+IE5VTV9FTEVNIChvcGVuZWQpKQotICAgIHJldHVybjsKLSAgCi0gIG9wZW5lZFtmZF0gPSAwOwotfQotCi1zdGF0aWMgaW50Ci1pc19vcGVuZWQgKGZkKQotICAgIGludCBmZDsKLXsKLSAgaWYgKGZkIDwgMCB8fCBmZCA+IE5VTV9FTEVNIChvcGVuZWQpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBvcGVuZWRbZmRdOwotfQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX3RyYXAxICgpCi17Ci0gIHVuc2lnbmVkIGxvbmcgYVszXTsKLQotICBzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSAoY3B1LmdyIFtUUkFQQ09ERV0pKQotICAgIHsKLSAgICBjYXNlIDM6Ci0gICAgICBhWzBdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUuZ3JbUEFSTTFdKTsKLSAgICAgIGFbMV0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5tZW0gKyBjcHUuZ3JbUEFSTTJdKTsKLSAgICAgIGFbMl0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNM10pOwotICAgICAgY3B1LmdyW1JFVDFdID0gY2FsbGJhY2stPnJlYWQgKGNhbGxiYWNrLCBhWzBdLCAoY2hhciAqKSBhWzFdLCBhWzJdKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSA0OgotICAgICAgYVswXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1LmdyW1BBUk0xXSk7Ci0gICAgICBhWzFdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUubWVtICsgY3B1LmdyW1BBUk0yXSk7Ci0gICAgICBhWzJdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUuZ3JbUEFSTTNdKTsKLSAgICAgIGNwdS5ncltSRVQxXSA9IChpbnQpY2FsbGJhY2stPndyaXRlIChjYWxsYmFjaywgYVswXSwgKGNoYXIgKikgYVsxXSwgYVsyXSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgNToKLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5tZW0gKyBjcHUuZ3JbUEFSTTFdKTsKLSAgICAgIGFbMV0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNMl0pOwotICAgICAgLyogYVsyXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1LmdyW1BBUk0zXSk7ICovCi0gICAgICBjcHUuZ3JbUkVUMV0gPSBjYWxsYmFjay0+b3BlbiAoY2FsbGJhY2ssIChjaGFyICopIGFbMF0sIGFbMV0pOwotICAgICAgbG9nX29wZW4gKGNwdS5ncltSRVQxXSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgNjoKLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNMV0pOwotICAgICAgLyogV2F0Y2ggb3V0IGZvciBkZWJ1Z2dlcidzIGZpbGVzLiAqLwotICAgICAgaWYgKGlzX29wZW5lZCAoYVswXSkpCi0JewotCSAgbG9nX2Nsb3NlIChhWzBdKTsKLQkgIGNwdS5ncltSRVQxXSA9IGNhbGxiYWNrLT5jbG9zZSAoY2FsbGJhY2ssIGFbMF0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBsZXQgaGltIGNsb3NlIGl0LiAgKi8KLQkgIGNwdS5ncltSRVQxXSA9ICgtMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIDk6Ci0gICAgICBhWzBdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUubWVtICsgY3B1LmdyW1BBUk0xXSk7Ci0gICAgICBhWzFdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUubWVtICsgY3B1LmdyW1BBUk0yXSk7Ci0gICAgICBjcHUuZ3JbUkVUMV0gPSBsaW5rICgoY2hhciAqKSBhWzBdLCAoY2hhciAqKSBhWzFdKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAxMDoKLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5tZW0gKyBjcHUuZ3JbUEFSTTFdKTsKLSAgICAgIGNwdS5ncltSRVQxXSA9IGNhbGxiYWNrLT51bmxpbmsgKGNhbGxiYWNrLCAoY2hhciAqKSBhWzBdKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAxMzoKLSAgICAgIC8qIGhhbmRsZSB0aW1lKDApIHZzIHRpbWUoJnZhcikgKi8KLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNMV0pOwotICAgICAgaWYgKGFbMF0pCi0JYVswXSArPSAodW5zaWduZWQgbG9uZykgY3B1Lm1lbTsKLSAgICAgIGNwdS5ncltSRVQxXSA9IGNhbGxiYWNrLT50aW1lIChjYWxsYmFjaywgKHRpbWVfdCAqKSBhWzBdKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAxOToKLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNMV0pOwotICAgICAgYVsxXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1LmdyW1BBUk0yXSk7Ci0gICAgICBhWzJdID0gKHVuc2lnbmVkIGxvbmcpIChjcHUuZ3JbUEFSTTNdKTsKLSAgICAgIGNwdS5ncltSRVQxXSA9IGNhbGxiYWNrLT5sc2VlayAoY2FsbGJhY2ssIGFbMF0sIGFbMV0sIGFbMl0pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIDMzOgotICAgICAgYVswXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1Lm1lbSArIGNwdS5ncltQQVJNMV0pOwotICAgICAgYVsxXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1LmdyW1BBUk0yXSk7Ci0gICAgICBjcHUuZ3JbUkVUMV0gPSBhY2Nlc3MgKChjaGFyICopIGFbMF0sIGFbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIDQzOgotICAgICAgYVswXSA9ICh1bnNpZ25lZCBsb25nKSAoY3B1Lm1lbSArIGNwdS5ncltQQVJNMV0pOwotI2lmIDAKLSAgICAgIGNwdS5ncltSRVQxXSA9IHRpbWVzICgoY2hhciAqKWFbMF0pOwotI2Vsc2UKLSAgICAgIHsKLQkvKiBHaXZlIGhpbSBzaW11bGF0ZWQgY3ljbGVzIGZvciB1dGltZQotCSAgIGFuZCBhbiBpbnN0cnVjdGlvbiBjb3VudCBmb3Igc3RpbWUuICovCi0Jc3RydWN0IHRtcwotCXsKLQkgIHRpbWVfdCB0bXNfdXRpbWU7Ci0JICB0aW1lX3QgdG1zX3N0aW1lOwotCSAgdGltZV90IHRtc19jdXRpbWU7Ci0JICB0aW1lX3QgdG1zX2NzdGltZTsKLQl9IHQ7Ci0KLQl0LnRtc191dGltZSA9IGNwdS5hc3JlZ3MuY3ljbGVzOwotCXQudG1zX3N0aW1lID0gY3B1LmFzcmVncy5pbnN0czsKLQl0LnRtc19jdXRpbWUgPSB0LnRtc191dGltZTsKLQl0LnRtc19jc3RpbWUgPSB0LnRtc19zdGltZTsKLQkJCSAgICAKLQltZW1jcHkgKChzdHJ1Y3QgdG1zICopKGFbMF0pLCAmdCwgc2l6ZW9mICh0KSk7Ci0JCQkgICAgCi0JY3B1LmdyW1JFVDFdID0gY3B1LmFzcmVncy5jeWNsZXM7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSA2OToKLSAgICAgIGFbMF0gPSAodW5zaWduZWQgbG9uZykgKGNwdS5ncltQQVJNMV0pOwotICAgICAgY3B1LmdyW1JFVDFdID0gaW50X3NicmsgKGFbMF0pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCWZwcmludGYgKHN0ZGVyciwgIldBUk5JTkc6IHN5cyBjYWxsICVkIHVuaW1wbGVtZW50ZWRcbiIsCi0JCSBjcHUuZ3JbVFJBUENPREVdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfc3R1YiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIC8qIFRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggdGhvc2UgaW4gbGliZ2xvc3MvbWNvcmUvc3lzY2FsbHMucy4gICovCi0gIHN3aXRjaCAod2hhdCkKLSAgICB7Ci0gICAgY2FzZSAzOiAgLyogX3JlYWQgKi8KLSAgICBjYXNlIDQ6ICAvKiBfd3JpdGUgKi8KLSAgICBjYXNlIDU6ICAvKiBfb3BlbiAqLwotICAgIGNhc2UgNjogIC8qIF9jbG9zZSAqLwotICAgIGNhc2UgMTA6IC8qIF91bmxpbmsgKi8KLSAgICBjYXNlIDE5OiAvKiBfbHNlZWsgKi8KLSAgICBjYXNlIDQzOiAvKiBfdGltZXMgKi8KLSAgICAgIGNwdS5nciBbVFJBUENPREVdID0gd2hhdDsKLSAgICAgIGhhbmRsZV90cmFwMSAoKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQlmcHJpbnRmIChzdGRlcnIsICJVbmhhbmRsZWQgc3R1YiBvcGNvZGU6ICVkXG4iLCB3aGF0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXV0aWwgKHdoYXQpCi0gICAgIHVuc2lnbmVkIHdoYXQ7Ci17Ci0gIHN3aXRjaCAod2hhdCkKLSAgICB7Ci0gICAgY2FzZSAwOgkvKiBleGl0ICovCi0gICAgICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToJLyogcHJpbnRmICovCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBhWzZdOwotCXVuc2lnbmVkIGNoYXIgKnM7Ci0JaW50IGk7Ci0KLQlhWzBdID0gKHVuc2lnbmVkIGxvbmcpKGNwdS5tZW0gKyBjcHUuZ3JbUEFSTTFdKTsKLQotCWZvciAocyA9ICh1bnNpZ25lZCBjaGFyICopYVswXSwgaSA9IDEgOyAqcyAmJiBpIDwgNiA7IHMrKykKLQkgIHsKLQkgICAgaWYgKCpzID09ICclJykKLQkgICAgICB7Ci0JCWlmICgqKytzID09ICdzJykKLQkJICBhW2ldID0gKHVuc2lnbmVkIGxvbmcpKGNwdS5tZW0gKyBjcHUuZ3JbUEFSTTEraV0pOwotCQllbHNlCi0JCSAgYVtpXSA9IGNwdS5ncltpK1BBUk0xXTsKLQkJaSsrOwotCSAgICAgIH0KLQkgIH0KLQkKLQljcHUuZ3JbUkVUMV0gPSBwcmludGYgKChjaGFyICopYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgMjoJLyogc2NhbmYgKi8KLSAgICAgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQlmcHJpbnRmIChzdGRlcnIsICJXQVJOSU5HOiBzY2FuZiB1bmltcGxlbWVudGVkXG4iKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSAzOgkvKiB1dGltZSAqLwotICAgICAgY3B1LmdyW1JFVDFdID0gY3B1LmFzcmVncy5pbnN0czsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweEZGOgotICAgICAgcHJvY2Vzc19zdHViIChjcHUuZ3JbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCWZwcmludGYgKHN0ZGVyciwgIlVuaGFuZGxlZCB1dGlsIGNvZGU6ICV4XG4iLCB3aGF0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0JCi0KLS8qIEZvciBmaWd1cmluZyBvdXQgd2hldGhlciB3ZSBjYXJyaWVkOyBhZGRjL3N1YmMgdXNlIHRoaXMuICovCi1zdGF0aWMgaW50Ci1pdV9jYXJyeSAoYSwgYiwgY2luKQotICAgICB1bnNpZ25lZCBsb25nIGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYjsKLSAgICAgaW50IGNpbjsKLXsKLSAgdW5zaWduZWQgbG9uZwl4OwotICAKLSAgeCA9IChhICYgMHhmZmZmKSArIChiICYgMHhmZmZmKSArIGNpbjsKLSAgeCA9ICh4ID4+IDE2KSArIChhID4+IDE2KSArIChiID4+IDE2KTsKLSAgeCA+Pj0gMTY7Ci0KLSAgcmV0dXJuICh4ICE9IDApOwotfQotCi0jZGVmaW5lIFdBVENIRlVOQ1RJT05TIDEKLSNpZmRlZiBXQVRDSEZVTkNUSU9OUwotCi0jZGVmaW5lIE1BWFdMIDgwCi13b3JkIFdMW01BWFdMXTsKLWNoYXIgKiBXTHN0cltNQVhXTF07Ci0KLWludCBFTkRXTD0wOwotaW50IFdMaW5jeWM7Ci1pbnQgV0xjeWNbTUFYV0xdOwotaW50IFdMY250c1tNQVhXTF07Ci1pbnQgV0xtYXhbTUFYV0xdOwotaW50IFdMbWluW01BWFdMXTsKLXdvcmQgV0xlbmRwYzsKLWludCBXTGJjeWM7Ci1pbnQgV0xXOwotI2VuZGlmCi0KLSNkZWZpbmUgUkQJKGluc3QgICAgICAgICYgMHhGKQotI2RlZmluZSBSUwkoKGluc3QgPj4gNCkgJiAweEYpCi0jZGVmaW5lIFJYCSgoaW5zdCA+PiA4KSAmIDB4RikKLSNkZWZpbmUgSU1NNQkoKGluc3QgPj4gNCkgJiAweDFGKQotI2RlZmluZSBJTU00CSgoaW5zdCkgJiAweEYpCi0KLXN0YXRpYyBpbnQgdHJhY2luZyA9IDA7Ci0KLXZvaWQKLXNpbV9yZXN1bWUgKHNkLCBzdGVwLCBzaWdnbmFsKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHN0ZXAsIHNpZ2duYWw7Ci17Ci0gIGludCBuZWVkZmV0Y2g7Ci0gIHdvcmQgaWJ1ZjsKLSAgd29yZCBwYzsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdDsKLSAgdm9pZCAoKiBzaWdzYXZlKSgpOwotICBpbnQgbWVtb3BzOwotICBpbnQgYm9udXNfY3ljbGVzOwotICBpbnQgaW5zdHM7Ci0gIGludCB3OwotICBpbnQgY3ljczsKLSAgd29yZCBXTGhhc2g7Ci0KLSAgc2lnc2F2ZSA9IHNpZ25hbCAoU0lHSU5ULCBpbnRlcnJ1cHQpOwotICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IHN0ZXAgPyBTSUdUUkFQOiAwOwotICBwYyA9IGNwdS5hc3JlZ3MucGM7Ci0KLSAgLyogRmV0Y2ggdGhlIGluaXRpYWwgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UnbGwgZGVjb2RlLiAqLwotICBpYnVmID0gcmxhdCAocGMgJiAweEZGRkZGRkZDKTsKLSAgbmVlZGZldGNoID0gMDsKLQotICBtZW1vcHMgPSAwOwotICBib251c19jeWNsZXMgPSAwOwotICBpbnN0cyA9IDA7Ci0gIAotICAvKiBtYWtlIG91ciByZWdpc3RlciBzZXQgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChTUl9BRiAoKSkKLSAgICBjcHUuYXNyZWdzLmFjdGl2ZV9ncmVncyA9ICYgY3B1LmFzcmVncy5hbHRfZ3JlZ3NbMF07Ci0gIGVsc2UKLSAgICBjcHUuYXNyZWdzLmFjdGl2ZV9ncmVncyA9ICYgY3B1LmFzcmVncy5ncmVnc1swXTsKLSAgCi0gIC8qIG1ha2UgYSBoYXNoIHRvIHNwZWVkIGV4ZWMgbG9vcCwgaG9wZSBpdCdzIG5vbnplcm8gKi8KLSAgV0xoYXNoID0gMHhGRkZGRkZGRjsKLQotICBmb3IgKHcgPSAxOyB3IDw9IEVORFdMOyB3KyspCi0gICAgV0xoYXNoID0gV0xoYXNoICYgV0xbd107Ci0KLSAgZG8KLSAgICB7Ci0gICAgICB3b3JkIG9sZHBjOwotICAgICAgCi0gICAgICBpbnN0cyArKzsKLSAgICAgIAotICAgICAgaWYgKHBjICYgMDIpCi0JewotCSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGluc3QgPSBpYnVmID4+IDE2OwotCSAgZWxzZQotCSAgICBpbnN0ID0gaWJ1ZiAmIDB4RkZGRjsKLQkgIG5lZWRmZXRjaCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICBpbnN0ID0gaWJ1ZiAmIDB4RkZGRjsKLQkgIGVsc2UKLQkgICAgaW5zdCA9IGlidWYgPj4gMTY7Ci0JfQotCi0jaWZkZWYgV0FUQ0hGVU5DVElPTlMKLSAgICAgIC8qIG5vdyBzY2FuIGxpc3Qgb2Ygd2F0Y2ggYWRkcmVzc2VzLCBpZiBtYXRjaCwgY291bnQgaXQgYW5kCi0JIG5vdGUgcmV0dXJuIGFkZHJlc3MgYW5kIGNvdW50IGN5Y2xlcyB1bnRpbCBwYz1yZXR1cm4gYWRkcmVzcyAqLwotICAgICAgCi0gICAgICBpZiAoKFdMaW5jeWMgPT0gMSkgJiYgKHBjID09IFdMZW5kcGMpKQotCXsKLQkgIGN5Y3MgPSAoY3B1LmFzcmVncy5jeWNsZXMgKyAoaW5zdHMgKyBib251c19jeWNsZXMgKwotCQkJCSAgICAgICAobWVtb3BzICogbWVtY3ljbGVzKSkgLSBXTGJjeWMpOwotCSAgCi0JICBpZiAoV0xjbnRzW1dMV10gPT0gMSkKLQkgICAgewotCSAgICAgIFdMbWF4W1dMV10gPSBjeWNzOwotCSAgICAgIFdMbWluW1dMV10gPSBjeWNzOwotCSAgICAgIFdMY3ljW1dMV10gPSAwOwotCSAgICB9Ci0JICAKLQkgIGlmIChjeWNzID4gV0xtYXhbV0xXXSkKLQkgICAgewotCSAgICAgIFdMbWF4W1dMV10gPSBjeWNzOwotCSAgICB9Ci0JICAKLQkgIGlmIChjeWNzIDwgV0xtaW5bV0xXXSkKLQkgICAgewotCSAgICAgIFdMbWluW1dMV10gPSBjeWNzOwotCSAgICB9Ci0JICAKLQkgIFdMY3ljW1dMV10gKz0gY3ljczsKLQkgIFdMaW5jeWMgPSAwOwotCSAgV0xlbmRwYyA9IDA7Ci0JfSAKLQotICAgICAgLyogT3B0aW1pemUgd2l0aCBhIGhhc2ggdG8gc3BlZWQgbG9vcC4gICovCi0gICAgICBpZiAoV0xpbmN5YyA9PSAwKQotCXsKLSAgICAgICAgICBpZiAoKFdMaGFzaCA9PSAwKSB8fCAoKFdMaGFzaCAmIHBjKSAhPSAwKSkKLQkgICAgewotCSAgICAgIGZvciAodz0xOyB3IDw9IEVORFdMOyB3KyspCi0JCXsKLQkJICBpZiAocGMgPT0gV0xbd10pCi0JCSAgICB7Ci0JCSAgICAgIFdMY250c1t3XSsrOwotCQkgICAgICBXTGJjeWMgPSBjcHUuYXNyZWdzLmN5Y2xlcyArIGluc3RzIAotCQkJKyBib251c19jeWNsZXMgKyAobWVtb3BzICogbWVtY3ljbGVzKTsKLQkJICAgICAgV0xlbmRwYyA9IGNwdS5nclsxNV07Ci0JCSAgICAgIFdMaW5jeWMgPSAxOwotCQkgICAgICBXTFcgPSB3OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmICh0cmFjaW5nKQotCWZwcmludGYgKHN0ZGVyciwgIiUuNHg6IGluc3QgPSAlLjR4ICIsIHBjLCBpbnN0KTsKLQotICAgICAgb2xkcGMgPSBwYzsKLSAgICAgIAotICAgICAgcGMgKz0gMjsKLSAgICAgIAotICAgICAgc3dpdGNoIChpbnN0ID4+IDgpCi0JewotCWNhc2UgMHgwMDoKLQkgIHN3aXRjaCBSUwotCSAgICB7Ci0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN3aXRjaCBSRAotCQl7Ci0JCWNhc2UgMHgwOgkJCQkvKiBia3B0ICovCi0JCSAgY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdUUkFQOwotCQkgIHBjIC09IDI7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgMHgxOgkJCQkvKiBzeW5jICovCi0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgMHgyOgkJCQkvKiBydGUgKi8KLQkJICBwYyA9IGNwdS5lcGM7Ci0JCSAgY3B1LnNyID0gY3B1LmVzcjsKLQkJICBuZWVkZmV0Y2ggPSAxOwotCQkgIAotCQkgIGlmIChTUl9BRiAoKSkKLQkJICAgIGNwdS5hc3JlZ3MuYWN0aXZlX2dyZWdzID0gJiBjcHUuYXNyZWdzLmFsdF9ncmVnc1swXTsKLQkJICBlbHNlCi0JCSAgICBjcHUuYXNyZWdzLmFjdGl2ZV9ncmVncyA9ICYgY3B1LmFzcmVncy5ncmVnc1swXTsKLQkJICBicmVhazsKLQotCQljYXNlIDB4MzoJCQkJLyogcmZpICovCi0JCSAgcGMgPSBjcHUuZnBjOwotCQkgIGNwdS5zciA9IGNwdS5mc3I7Ci0JCSAgbmVlZGZldGNoID0gMTsKLQotCQkgIGlmIChTUl9BRiAoKSkKLQkJICAgIGNwdS5hc3JlZ3MuYWN0aXZlX2dyZWdzID0gJmNwdS5hc3JlZ3MuYWx0X2dyZWdzWzBdOwotCQkgIGVsc2UKLQkJICAgIGNwdS5hc3JlZ3MuYWN0aXZlX2dyZWdzID0gJmNwdS5hc3JlZ3MuZ3JlZ3NbMF07Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgMHg0OgkJCQkvKiBzdG9wICovCi0JCSAgaWYgKGlzc3VlX21lc3NhZ2VzKQotCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiV0FSTklORzogc3RvcCB1bmltcGxlbWVudGVkXG4iKTsKLQkJICBicmVhazsKLQkJICAgIAotCQljYXNlIDB4NToJCQkJLyogd2FpdCAqLwotCQkgIGlmIChpc3N1ZV9tZXNzYWdlcykKLQkJICAgIGZwcmludGYgKHN0ZGVyciwgIldBUk5JTkc6IHdhaXQgdW5pbXBsZW1lbnRlZFxuIik7Ci0JCSAgYnJlYWs7Ci0JCSAgICAKLQkJY2FzZSAweDY6CQkJCS8qIGRvemUgKi8KLQkJICBpZiAoaXNzdWVfbWVzc2FnZXMpCi0JCSAgICBmcHJpbnRmIChzdGRlcnIsICJXQVJOSU5HOiBkb3plIHVuaW1wbGVtZW50ZWRcbiIpOwotCQkgIGJyZWFrOwotCQkgICAgCi0JCWNhc2UgMHg3OgotCQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSUxMOwkvKiBpbGxlZ2FsICovCi0JCSAgYnJlYWs7Ci0JCSAgICAKLQkJY2FzZSAweDg6CQkJCS8qIHRyYXAgMCAqLwotCQljYXNlIDB4QToJCQkJLyogdHJhcCAyICovCi0JCWNhc2UgMHhCOgkJCQkvKiB0cmFwIDMgKi8KLQkJICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1RSQVA7Ci0JCSAgYnJlYWs7Ci0JCSAgICAKLQkJY2FzZSAweEM6CQkJCS8qIHRyYXAgNCAqLwotCQljYXNlIDB4RDoJCQkJLyogdHJhcCA1ICovCi0JCWNhc2UgMHhFOgkJCQkvKiB0cmFwIDYgKi8KLQkJICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0lMTDsJLyogaWxsZWdhbCAqLwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIDB4RjogCQkJCS8qIHRyYXAgNyAqLwotCQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHVFJBUDsJLyogaW50ZWdlciBkaXYtYnktMCAqLwotCQkgIGJyZWFrOwotCQkgICAgCi0JCWNhc2UgMHg5OgkJCQkvKiB0cmFwIDEgKi8KLQkJICBoYW5kbGVfdHJhcDEgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdJTEw7CQkvKiBpbGxlZ2FsICovCi0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgMHgyOgkJCQkJLyogbXZjICovCi0JICAgICAgY3B1LmdyW1JEXSA9IENfVkFMVUUoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDM6CQkJCQkvKiBtdmN2ICovCi0JICAgICAgY3B1LmdyW1JEXSA9IENfT0ZGKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHg0OgkJCQkJLyogbGRxICovCi0JICAgICAgewotCQljaGFyICphZGRyID0gKGNoYXIgKiljcHUuZ3JbUkRdOwotCQlpbnQgcmVnbm8gPSA0OwkJCS8qIGFsd2F5cyByNC1yNyAqLwotCQkKLQkJYm9udXNfY3ljbGVzKys7Ci0JCW1lbW9wcyArPSA0OwotCQlkbwotCQkgIHsKLQkJICAgIGNwdS5ncltyZWdub10gPSBybGF0KGFkZHIpOwotCQkgICAgYWRkciArPSA0OwotCQkgICAgcmVnbm8rKzsKLQkJICB9Ci0JCXdoaWxlICgocmVnbm8mMHgzKSAhPSAwKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHg1OgkJCQkJLyogc3RxICovCi0JICAgICAgewotCQljaGFyICphZGRyID0gKGNoYXIgKiljcHUuZ3JbUkRdOwotCQlpbnQgcmVnbm8gPSA0OwkJCS8qIGFsd2F5cyByNC1yNyAqLwotCQkKLQkJbWVtb3BzICs9IDQ7Ci0JCWJvbnVzX2N5Y2xlcysrOwotCQlkbwotCQkgIHsKLQkJICAgIHdsYXQoYWRkciwgY3B1LmdyW3JlZ25vXSk7Ci0JCSAgICBhZGRyICs9IDQ7Ci0JCSAgICByZWdubysrOwotCQkgIH0KLQkJd2hpbGUgKChyZWdubyAmIDB4MykgIT0gMCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4NjoJCQkJCS8qIGxkbSAqLwotCSAgICAgIHsKLQkJY2hhciAqYWRkciA9IChjaGFyICopY3B1LmdyWzBdOwotCQlpbnQgcmVnbm8gPSBSRDsKLQkJCi0JCS8qIGJvbnVzIGN5Y2xlIGlzIHJlYWxseSBvbmx5IG5lZWRlZCBpZgotCQkgICB0aGUgbmV4dCBpbnNuIHNoaWZ0cyB0aGUgbGFzdCByZWcgbG9hZGVkLgotCQkgICAKLQkJICAgYm9udXNfY3ljbGVzKys7Ci0JCSovCi0JCW1lbW9wcyArPSAxNi1yZWdubzsKLQkJd2hpbGUgKHJlZ25vIDw9IDB4RikKLQkJICB7Ci0JCSAgICBjcHUuZ3JbcmVnbm9dID0gcmxhdChhZGRyKTsKLQkJICAgIGFkZHIgKz0gNDsKLQkJICAgIHJlZ25vKys7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDc6CQkJCQkvKiBzdG0gKi8KLQkgICAgICB7Ci0JCWNoYXIgKmFkZHIgPSAoY2hhciAqKWNwdS5nclswXTsKLQkJaW50IHJlZ25vID0gUkQ7Ci0JCQotCQkvKiB0aGlzIHNob3VsZCBiZSByZW1vdmVkISAqLwotCQkvKiAgYm9udXNfY3ljbGVzICsrOyAqLwotCi0JCW1lbW9wcyArPSAxNiAtIHJlZ25vOwotCQl3aGlsZSAocmVnbm8gPD0gMHhGKQotCQkgIHsKLQkJICAgIHdsYXQoYWRkciwgY3B1LmdyW3JlZ25vXSk7Ci0JCSAgICBhZGRyICs9IDQ7Ci0JCSAgICByZWdubysrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAweDg6CQkJCQkvKiBkZWN0ICovCi0JICAgICAgY3B1LmdyW1JEXSAtPSBDX1ZBTFVFKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHg5OgkJCQkJLyogZGVjZiAqLwotCSAgICAgIGNwdS5ncltSRF0gLT0gQ19PRkYoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEE6CQkJCQkvKiBpbmN0ICovCi0JICAgICAgY3B1LmdyW1JEXSArPSBDX1ZBTFVFKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHhCOgkJCQkJLyogaW5jZiAqLwotCSAgICAgIGNwdS5ncltSRF0gKz0gQ19PRkYoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEM6CQkJCQkvKiBqbXAgKi8KLQkgICAgICBwYyA9IGNwdS5ncltSRF07Ci0JICAgICAgaWYgKHRyYWNpbmcgJiYgUkQgPT0gMTUpCi0JCWZwcmludGYgKHN0ZGVyciwgIkZ1bmMgcmV0dXJuLCByMiA9ICV4LCByMyA9ICV4XG4iLAotCQkJIGNwdS5nclsyXSwgY3B1LmdyWzNdKTsKLQkgICAgICBib251c19jeWNsZXMrKzsKLQkgICAgICBuZWVkZmV0Y2ggPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4RDoJCQkJCS8qIGpzciAqLwotCSAgICAgIGNwdS5nclsxNV0gPSBwYzsKLQkgICAgICBwYyA9IGNwdS5ncltSRF07Ci0JICAgICAgYm9udXNfY3ljbGVzKys7Ci0JICAgICAgbmVlZGZldGNoID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEU6CQkJCQkvKiBmZjEgKi8KLQkgICAgICB7Ci0JCXdvcmQgdG1wLCBpOwotCQl0bXAgPSBjcHUuZ3JbUkRdOwotCQlmb3IgKGkgPSAwOyAhKHRtcCAmIDB4ODAwMDAwMDApICYmIGkgPCAzMjsgaSsrKQotCQkgIHRtcCA8PD0gMTsKLQkJY3B1LmdyW1JEXSA9IGk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4RjoJCQkJCS8qIGJyZXYgKi8KLQkgICAgICB7Ci0JCXdvcmQgdG1wOwotCQl0bXAgPSBjcHUuZ3JbUkRdOwotCQl0bXAgPSAoKHRtcCAmIDB4YWFhYWFhYWEpID4+ICAxKSB8ICgodG1wICYgMHg1NTU1NTU1NSkgPDwgIDEpOwotCQl0bXAgPSAoKHRtcCAmIDB4Y2NjY2NjY2MpID4+ICAyKSB8ICgodG1wICYgMHgzMzMzMzMzMykgPDwgIDIpOwotCQl0bXAgPSAoKHRtcCAmIDB4ZjBmMGYwZjApID4+ICA0KSB8ICgodG1wICYgMHgwZjBmMGYwZikgPDwgIDQpOwotCQl0bXAgPSAoKHRtcCAmIDB4ZmYwMGZmMDApID4+ICA4KSB8ICgodG1wICYgMHgwMGZmMDBmZikgPDwgIDgpOwotCQljcHUuZ3JbUkRdID0gKCh0bXAgJiAweGZmZmYwMDAwKSA+PiAxNikgfCAoKHRtcCAmIDB4MDAwMGZmZmYpIDw8IDE2KTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgwMToKLQkgIHN3aXRjaCBSUwotCSAgICB7Ci0JICAgIGNhc2UgMHgwOgkJCQkJLyogeHRyYjMgKi8JCi0JICAgICAgY3B1LmdyWzFdID0gKGNwdS5ncltSRF0pICYgMHhGRjsKLQkgICAgICBORVdfQyAoY3B1LmdyW1JEXSAhPSAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDE6CQkJCQkvKiB4dHJiMiAqLwotCSAgICAgIGNwdS5nclsxXSA9IChjcHUuZ3JbUkRdPj44KSAmIDB4RkY7Ci0JICAgICAgTkVXX0MgKGNwdS5ncltSRF0gIT0gMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgyOgkJCQkJLyogeHRyYjEgKi8KLQkgICAgICBjcHUuZ3JbMV0gPSAoY3B1LmdyW1JEXT4+MTYpICYgMHhGRjsKLQkgICAgICBORVdfQyAoY3B1LmdyW1JEXSAhPSAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDM6CQkJCQkvKiB4dHJiMCAqLwotCSAgICAgIGNwdS5nclsxXSA9IChjcHUuZ3JbUkRdPj4yNCkgJiAweEZGOwotCSAgICAgIE5FV19DIChjcHUuZ3JbUkRdICE9IDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4NDoJCQkJCS8qIHpleHRiICovCi0JICAgICAgY3B1LmdyW1JEXSAmPSAweDAwMDAwMEZGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4NToJCQkJCS8qIHNleHRiICovCi0JICAgICAgewotCQlsb25nIHRtcDsKLQkJdG1wID0gY3B1LmdyW1JEXTsKLQkJdG1wIDw8PSAyNDsKLQkJdG1wID4+PSAyNDsKLQkJY3B1LmdyW1JEXSA9IHRtcDsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHg2OgkJCQkJLyogemV4dGggKi8KLQkgICAgICBjcHUuZ3JbUkRdICY9IDB4MDAwMEZGRkY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHg3OgkJCQkJLyogc2V4dGggKi8KLQkgICAgICB7Ci0JCWxvbmcgdG1wOwotCQl0bXAgPSBjcHUuZ3JbUkRdOwotCQl0bXAgPDw9IDE2OwotCQl0bXAgPj49IDE2OwotCQljcHUuZ3JbUkRdID0gdG1wOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDg6CQkJCQkvKiBkZWNsdCAqLyAKLQkgICAgICAtLWNwdS5ncltSRF07Ci0JICAgICAgTkVXX0MgKChsb25nKWNwdS5ncltSRF0gPCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDk6CQkJCQkvKiB0c3RuYnogKi8KLQkgICAgICB7Ci0JCXdvcmQgdG1wID0gY3B1LmdyW1JEXTsKLQkJTkVXX0MgKCh0bXAgJiAweEZGMDAwMDAwKSAhPSAwICYmCi0JCSAgICAgICAodG1wICYgMHgwMEZGMDAwMCkgIT0gMCAmJiAodG1wICYgMHgwMDAwRkYwMCkgIT0gMCAmJgotCQkgICAgICAgKHRtcCAmIDB4MDAwMDAwRkYpICE9IDApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsgCi0JICAgIGNhc2UgMHhBOgkJCQkJLyogZGVjZ3QgKi8KLQkgICAgICAtLWNwdS5ncltSRF07Ci0JICAgICAgTkVXX0MgKChsb25nKWNwdS5ncltSRF0gPiAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEI6CQkJCQkvKiBkZWNuZSAqLwotCSAgICAgIC0tY3B1LmdyW1JEXTsKLQkgICAgICBORVdfQyAoKGxvbmcpY3B1LmdyW1JEXSAhPSAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEM6CQkJCQkvKiBjbHJ0ICovCi0JICAgICAgaWYgKENfT04oKSkKLQkJY3B1LmdyW1JEXSA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHhEOgkJCQkJLyogY2xyZiAqLwotCSAgICAgIGlmIChDX09GRigpKQotCQljcHUuZ3JbUkRdID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweEU6CQkJCQkvKiBhYnMgKi8KLQkgICAgICBpZiAoY3B1LmdyW1JEXSAmIDB4ODAwMDAwMDApCi0JCWNwdS5ncltSRF0gPSB+Y3B1LmdyW1JEXSArIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHhGOgkJCQkJLyogbm90ICovCi0JICAgICAgY3B1LmdyW1JEXSA9IH5jcHUuZ3JbUkRdOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4MDI6CQkJCQkvKiBtb3Z0ICovCi0JICBpZiAoQ19PTigpKQotCSAgICBjcHUuZ3JbUkRdID0gY3B1LmdyW1JTXTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzoJCQkJCS8qIG11bHQgKi8KLQkgIC8qIGNvbnN1bWUgMiBiaXRzIHBlciBjeWNsZSBmcm9tIHJzLCB1bnRpbCBycyBpcyAwICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCB0ID0gY3B1LmdyW1JTXTsKLQkgICAgaW50IHRpY2tzOwotCSAgICBmb3IgKHRpY2tzID0gMDsgdCAhPSAwIDsgdCA+Pj0gMikgCi0JICAgICAgdGlja3MrKzsKLQkgICAgYm9udXNfY3ljbGVzICs9IHRpY2tzOwotCSAgfQotCSAgYm9udXNfY3ljbGVzICs9IDI7ICAvKiBtaW4uIGlzIDMsIHNvIGFkZCAyLCBwbHVzIHRpY2tzIGFib3ZlICovCi0JICBpZiAodHJhY2luZykKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiICBtdWx0ICV4IGJ5ICV4IHRvIGdpdmUgJXgiLAotCQkgICAgIGNwdS5ncltSRF0sIGNwdS5ncltSU10sIGNwdS5ncltSRF0gKiBjcHUuZ3JbUlNdKTsKLQkgIGNwdS5ncltSRF0gPSBjcHUuZ3JbUkRdICogY3B1LmdyW1JTXTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNDoJCQkJCS8qIGxvb3B0ICovCi0JICBpZiAoQ19PTigpKQotCSAgICB7Ci0JICAgICAgcGMgKz0gKElNTTQgPDwgMSkgLSAzMjsKLQkgICAgICBib251c19jeWNsZXMgKys7Ci0JICAgICAgbmVlZGZldGNoID0gMTsKLQkgICAgfQotCSAgLS1jcHUuZ3JbUlNdOwkJCQkvKiBub3QgUkQhICovCi0JICBORVdfQyAoKChsb25nKWNwdS5ncltSU10pID4gMCk7Ci0JICBicmVhazsgCi0JY2FzZSAweDA1OgkJCQkJLyogc3VidSAqLwotCSAgY3B1LmdyW1JEXSAtPSBjcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0JY2FzZSAweDA2OgkJCQkJLyogYWRkYyAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHRtcCwgYSwgYjsKLQkgICAgYSA9IGNwdS5ncltSRF07Ci0JICAgIGIgPSBjcHUuZ3JbUlNdOwotCSAgICBjcHUuZ3JbUkRdID0gYSArIGIgKyBDX1ZBTFVFICgpOwotCSAgICB0bXAgPSBpdV9jYXJyeSAoYSwgYiwgQ19WQUxVRSAoKSk7Ci0JICAgIE5FV19DICh0bXApOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDA3OgkJCQkJLyogc3ViYyAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHRtcCwgYSwgYjsKLQkgICAgYSA9IGNwdS5ncltSRF07Ci0JICAgIGIgPSBjcHUuZ3JbUlNdOwotCSAgICBjcHUuZ3JbUkRdID0gYSAtIGIgKyBDX1ZBTFVFICgpIC0gMTsKLQkgICAgdG1wID0gaXVfY2FycnkgKGEsfmIsIENfVkFMVUUgKCkpOwotCSAgICBORVdfQyAodG1wKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgwODoJCQkJCS8qIGlsbGVnYWwgKi8KLQljYXNlIDB4MDk6CQkJCQkvKiBpbGxlZ2FsKi8KLQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAweDBBOgkJCQkJLyogbW92ZiAqLwotCSAgaWYgKENfT0ZGKCkpCi0JICAgIGNwdS5ncltSRF0gPSBjcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0JY2FzZSAweDBCOgkJCQkJLyogbHNyICovCi0JICB7IAotCSAgICB1bnNpZ25lZCBsb25nIGRzdCwgc3JjOwotCSAgICBkc3QgPSBjcHUuZ3JbUkRdOwotCSAgICBzcmMgPSBjcHUuZ3JbUlNdOwotCSAgICAvKiBXZSBtdXN0IG5vdCByZWx5IHNvbGVseSB1cG9uIHRoZSBuYXRpdmUgc2hpZnQgb3BlcmF0aW9ucywgc2luY2UgdGhleQotCSAgICAgICBtYXkgbm90IG1hdGNoIHRoZSBNKkNvcmUncyBiZWhhdmlvdXIgb24gYm91bmRhcnkgY29uZGl0aW9ucy4gICovCi0JICAgIGRzdCA9IHNyYyA+IDMxID8gMCA6IGRzdCA+PiBzcmM7Ci0JICAgIGNwdS5ncltSRF0gPSBkc3Q7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MEM6CQkJCQkvKiBjbXBocyAqLwotCSAgTkVXX0MgKCh1bnNpZ25lZCBsb25nICljcHUuZ3JbUkRdID49IAotCQkgKHVuc2lnbmVkIGxvbmcpY3B1LmdyW1JTXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MEQ6CQkJCQkvKiBjbXBsdCAqLwotCSAgTkVXX0MgKChsb25nKWNwdS5ncltSRF0gPCAobG9uZyljcHUuZ3JbUlNdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwRToJCQkJCS8qIHRzdCAqLwotCSAgTkVXX0MgKChjcHUuZ3JbUkRdICYgY3B1LmdyW1JTXSkgIT0gMCk7Ci0JICBicmVhazsKLQljYXNlIDB4MEY6CQkJCQkvKiBjbXBuZSAqLwotCSAgTkVXX0MgKGNwdS5ncltSRF0gIT0gY3B1LmdyW1JTXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MTA6IGNhc2UgMHgxMToJCQkJLyogbWZjciAqLwotCSAgewotCSAgICB1bnNpZ25lZCByOwotCSAgICByID0gSU1NNTsKLQkgICAgaWYgKHIgPD0gTEFTVF9WQUxJRF9DUkVHKQotCSAgICAgIGNwdS5ncltSRF0gPSBjcHUuY3Jbcl07Ci0JICAgIGVsc2UKLQkgICAgICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAweDEyOgkJCQkJLyogbW92ICovCi0JICBjcHUuZ3JbUkRdID0gY3B1LmdyW1JTXTsKLQkgIGlmICh0cmFjaW5nKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJNT1YgJXggaW50byByZWcgJWQiLCBjcHUuZ3JbUkRdLCBSRCk7Ci0JICBicmVhazsKLQotCWNhc2UgMHgxMzoJCQkJCS8qIGJnZW5yICovCi0JICBpZiAoY3B1LmdyW1JTXSAmIDB4MjApCi0JICAgIGNwdS5ncltSRF0gPSAwOwotCSAgZWxzZQotCSAgICBjcHUuZ3JbUkRdID0gMSA8PCAoY3B1LmdyW1JTXSAmIDB4MUYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MTQ6CQkJCQkvKiByc3ViICovCi0JICBjcHUuZ3JbUkRdID0gY3B1LmdyW1JTXSAtIGNwdS5ncltSRF07Ci0JICBicmVhazsKLQotCWNhc2UgMHgxNToJCQkJCS8qIGl4dyAqLwotCSAgY3B1LmdyW1JEXSArPSBjcHUuZ3JbUlNdPDwyOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MTY6CQkJCQkvKiBhbmQgKi8KLQkgIGNwdS5ncltSRF0gJj0gY3B1LmdyW1JTXTsKLQkgIGJyZWFrOwotCi0JY2FzZSAweDE3OgkJCQkJLyogeG9yICovCi0JICBjcHUuZ3JbUkRdIF49IGNwdS5ncltSU107Ci0JICBicmVhazsKLQotCWNhc2UgMHgxODogY2FzZSAweDE5OgkJCQkvKiBtdGNyICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIHI7Ci0JICAgIHIgPSBJTU01OwotCSAgICBpZiAociA8PSBMQVNUX1ZBTElEX0NSRUcpCi0JICAgICAgY3B1LmNyW3JdID0gY3B1LmdyW1JEXTsKLQkgICAgZWxzZQotCSAgICAgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgICAKLQkgICAgLyogd2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIHJlZ2lzdGVyIHNldHMuLi4gKi8KLQkgICAgaWYgKFNSX0FGICgpKQotCSAgICAgIGNwdS5hc3JlZ3MuYWN0aXZlX2dyZWdzID0gJiBjcHUuYXNyZWdzLmFsdF9ncmVnc1swXTsKLQkgICAgZWxzZQotCSAgICAgIGNwdS5hc3JlZ3MuYWN0aXZlX2dyZWdzID0gJiBjcHUuYXNyZWdzLmdyZWdzWzBdOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MUE6CQkJCQkvKiBhc3IgKi8KLQkgIC8qIFdlIG11c3Qgbm90IHJlbHkgc29sZWx5IHVwb24gdGhlIG5hdGl2ZSBzaGlmdCBvcGVyYXRpb25zLCBzaW5jZSB0aGV5Ci0JICAgICBtYXkgbm90IG1hdGNoIHRoZSBNKkNvcmUncyBiZWhhdmlvdXIgb24gYm91bmRhcnkgY29uZGl0aW9ucy4gICovCi0JICBpZiAoY3B1LmdyW1JTXSA+IDMwKQotCSAgICBjcHUuZ3JbUkRdID0gKChsb25nKSBjcHUuZ3JbUkRdKSA8IDAgPyAtMSA6IDA7Ci0JICBlbHNlCi0JICAgIGNwdS5ncltSRF0gPSAobG9uZykgY3B1LmdyW1JEXSA+PiBjcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MUI6CQkJCQkvKiBsc2wgKi8KLQkgIC8qIFdlIG11c3Qgbm90IHJlbHkgc29sZWx5IHVwb24gdGhlIG5hdGl2ZSBzaGlmdCBvcGVyYXRpb25zLCBzaW5jZSB0aGV5Ci0JICAgICBtYXkgbm90IG1hdGNoIHRoZSBNKkNvcmUncyBiZWhhdmlvdXIgb24gYm91bmRhcnkgY29uZGl0aW9ucy4gICovCi0JICBjcHUuZ3JbUkRdID0gY3B1LmdyW1JTXSA+IDMxID8gMCA6IGNwdS5ncltSRF0gPDwgY3B1LmdyW1JTXTsKLQkgIGJyZWFrOwotCi0JY2FzZSAweDFDOgkJCQkJLyogYWRkdSAqLwotCSAgY3B1LmdyW1JEXSArPSBjcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MUQ6CQkJCQkvKiBpeGggKi8KLQkgIGNwdS5ncltSRF0gKz0gY3B1LmdyW1JTXSA8PCAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MUU6CQkJCQkvKiBvciAqLwotCSAgY3B1LmdyW1JEXSB8PSBjcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4MUY6CQkJCQkvKiBhbmRuICovCi0JICBjcHUuZ3JbUkRdICY9IH5jcHUuZ3JbUlNdOwotCSAgYnJlYWs7Ci0JY2FzZSAweDIwOiBjYXNlIDB4MjE6CQkJCS8qIGFkZGkgKi8KLQkgIGNwdS5ncltSRF0gPQotCSAgICBjcHUuZ3JbUkRdICsgKElNTTUgKyAxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgyMjogY2FzZSAweDIzOgkJCQkvKiBjbXBsdGkgKi8KLQkgIHsKLQkgICAgaW50IHRtcCA9IChJTU01ICsgMSk7Ci0JICAgIGlmIChjcHUuZ3JbUkRdIDwgdG1wKQotCSAgICAgIHsKLQkgICAgICAgIFNFVF9DKCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCSAgICAgICAgQ0xSX0MoKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MjQ6IGNhc2UgMHgyNToJCQkJLyogc3ViaSAqLwotCSAgY3B1LmdyW1JEXSA9Ci0JICAgIGNwdS5ncltSRF0gLSAoSU1NNSArIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDI2OiBjYXNlIDB4Mjc6CQkJCS8qIGlsbGVnYWwgKi8KLQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAweDI4OiBjYXNlIDB4Mjk6CQkJCS8qIHJzdWJpICovCi0JICBjcHUuZ3JbUkRdID0KLQkgICAgSU1NNSAtIGNwdS5ncltSRF07Ci0JICBicmVhazsKLQljYXNlIDB4MkE6IGNhc2UgMHgyQjoJCQkJLyogY21wbmVpICovCi0JICBpZiAoY3B1LmdyW1JEXSAhPSBJTU01KQotCSAgICB7Ci0JICAgICAgU0VUX0MoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQ0xSX0MoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIDB4MkM6IGNhc2UgMHgyRDoJCQkJLyogYm1hc2tpLCBkaXZ1ICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGltbSA9IElNTTU7Ci0JICAgIAotCSAgICBpZiAoaW1tID09IDEpCi0JICAgICAgewotCQlpbnQgZXhlOwotCQlpbnQgcnhubHosIHIxbmx6OwotCQl1bnNpZ25lZCBpbnQgcngsIHIxOwotCi0JCXJ4ID0gY3B1LmdyW1JEXTsKLQkJcjEgPSBjcHUuZ3JbMV07Ci0JCWV4ZSA9IDA7Ci0KLQkJLyogdW5zaWduZWQgZGl2aWRlICovCi0JCWNwdS5ncltSRF0gPSAod29yZCkgKCh1bnNpZ25lZCBpbnQpIGNwdS5ncltSRF0gLyAodW5zaWduZWQgaW50KWNwdS5nclsxXSApOwotCQkKLQkJLyogY29tcHV0ZSBib251c19jeWNsZXMgZm9yIGRpdnUgKi8KLQkJZm9yIChyMW5seiA9IDA7ICgocjEgJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAocjFubHogPCAzMik7IHIxbmx6ICsrKQotCQkgIHIxID0gcjEgPDwgMTsKLQotCQlmb3IgKHJ4bmx6ID0gMDsgKChyeCAmIDB4ODAwMDAwMDApID09IDApICYmIChyeG5seiA8IDMyKTsgcnhubHogKyspCi0JCSAgcnggPSByeCA8PCAxOwotCi0JCWlmIChyMW5seiA8IHJ4bmx6KQotCQkgIGV4ZSArPSA0OwotCQllbHNlCi0JCSAgZXhlICs9IDUgKyByMW5seiAtIHJ4bmx6OwotCi0JCWlmIChleGUgPj0gKDIgKiBtZW1jeWNsZXMgLSAxKSkKLQkJICB7Ci0JCSAgICBib251c19jeWNsZXMgKz0gZXhlIC0gKDIgKiBtZW1jeWNsZXMpICsgMTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChpbW0gPT0gMCB8fCBpbW0gPj0gOCkKLQkgICAgICB7Ci0JCS8qIGJtYXNraSAqLwotCQlpZiAoaW1tID09IDApCi0JCSAgY3B1LmdyW1JEXSA9IC0xOwotCQllbHNlCi0JCSAgY3B1LmdyW1JEXSA9ICgxIDw8IGltbSkgLSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogaWxsZWdhbCAqLwotCQljcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4MkU6IGNhc2UgMHgyRjoJCQkJLyogYW5kaSAqLwotCSAgY3B1LmdyW1JEXSA9IGNwdS5ncltSRF0gJiBJTU01OwotCSAgYnJlYWs7Ci0JY2FzZSAweDMwOiBjYXNlIDB4MzE6CQkJCS8qIGJjbHJpICovCi0JICBjcHUuZ3JbUkRdID0gY3B1LmdyW1JEXSAmIH4oMTw8SU1NNSk7Ci0JICBicmVhazsKLQljYXNlIDB4MzI6IGNhc2UgMHgzMzoJCQkJLyogYmdlbmksIGRpdnMgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW1tID0gSU1NNTsKLQkgICAgaWYgKGltbSA9PSAxKQotCSAgICAgIHsKLQkJaW50IGV4ZSxzYzsKLQkJaW50IHJ4bmx6LCByMW5sejsKLQkJc2lnbmVkIGludCByeCwgcjE7Ci0JCQotCQkvKiBjb21wdXRlIGJvbnVzX2N5Y2xlcyBmb3IgZGl2dSAqLwotCQlyeCA9IGNwdS5ncltSRF07Ci0JCXIxID0gY3B1LmdyWzFdOwotCQlleGUgPSAwOwotCQkKLQkJaWYgKCgocnggPCAwKSAmJiAocjEgPiAwKSkgfHwgKChyeCA+PSAwKSAmJiAocjEgPCAwKSkpCi0JCSAgc2MgPSAxOwotCQllbHNlCi0JCSAgc2MgPSAwOwotCQkKLQkJcnggPSBhYnMgKHJ4KTsKLQkJcjEgPSBhYnMgKHIxKTsKLQkJCi0JCS8qIHNpZ25lZCBkaXZpZGUsIGdlbmVyYWwgcmVnaXN0ZXJzIGFyZSBvZiB0eXBlIGludCwgc28gLyBvcCBpcyBPSyAqLwotCQljcHUuZ3JbUkRdID0gY3B1LmdyW1JEXSAvIGNwdS5nclsxXTsKLQkgICAgICAKLQkJZm9yIChyMW5seiA9IDA7ICgocjEgJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAocjFubHogPCAzMikgOyByMW5seiArKyApCi0JCSAgcjEgPSByMSA8PCAxOwotCQkKLQkJZm9yIChyeG5seiA9IDA7ICgocnggJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAocnhubHogPCAzMikgOyByeG5seiArKyApCi0JCSAgcnggPSByeCA8PCAxOwotCQkKLQkJaWYgKHIxbmx6IDwgcnhubHopCi0JCSAgZXhlICs9IDU7Ci0JCWVsc2UKLQkJICBleGUgKz0gNiArIHIxbmx6IC0gcnhubHogKyBzYzsKLQkJCi0JCWlmIChleGUgPj0gKDIgKiBtZW1jeWNsZXMgLSAxKSkKLQkJICB7Ci0JCSAgICBib251c19jeWNsZXMgKz0gZXhlIC0gKDIgKiBtZW1jeWNsZXMpICsgMTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChpbW0gPj0gNykKLQkgICAgICB7Ci0JCS8qIGJnZW5pICovCi0JCWNwdS5ncltSRF0gPSAoMSA8PCBJTU01KTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIGlsbGVnYWwgKi8KLQkJY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdJTEw7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIDB4MzQ6IGNhc2UgMHgzNToJCQkJLyogYnNldGkgKi8KLQkgIGNwdS5ncltSRF0gPSBjcHUuZ3JbUkRdIHwgKDEgPDwgSU1NNSk7Ci0JICBicmVhazsKLQljYXNlIDB4MzY6IGNhc2UgMHgzNzoJCQkJLyogYnRzdGkgKi8KLQkgIE5FV19DIChjcHUuZ3JbUkRdID4+IElNTTUpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDM4OiBjYXNlIDB4Mzk6CQkJCS8qIHhzciwgcm90bGkgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW1tID0gSU1NNTsKLQkgICAgdW5zaWduZWQgbG9uZyB0bXAgPSBjcHUuZ3JbUkRdOwotCSAgICBpZiAoaW1tID09IDApCi0JICAgICAgewotCQl3b3JkIGNiaXQ7Ci0JCWNiaXQgPSBDX1ZBTFVFKCk7Ci0JCU5FV19DICh0bXApOwotCQljcHUuZ3JbUkRdID0gKGNiaXQgPDwgMzEpIHwgKHRtcCA+PiAxKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBjcHUuZ3JbUkRdID0gKHRtcCA8PCBpbW0pIHwgKHRtcCA+PiAoMzIgLSBpbW0pKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgzQTogY2FzZSAweDNCOgkJCQkvKiBhc3JjLCBhc3JpICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGltbSA9IElNTTU7Ci0JICAgIGxvbmcgdG1wID0gY3B1LmdyW1JEXTsKLQkgICAgaWYgKGltbSA9PSAwKQotCSAgICAgIHsKLQkJTkVXX0MgKHRtcCk7Ci0JCWNwdS5ncltSRF0gPSB0bXAgPj4gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBjcHUuZ3JbUkRdID0gdG1wID4+IGltbTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgzQzogY2FzZSAweDNEOgkJCQkvKiBsc2xjLCBsc2xpICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGltbSA9IElNTTU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdG1wID0gY3B1LmdyW1JEXTsKLQkgICAgaWYgKGltbSA9PSAwKQotCSAgICAgIHsKLQkJTkVXX0MgKHRtcCA+PiAzMSk7Ci0JCWNwdS5ncltSRF0gPSB0bXAgPDwgMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBjcHUuZ3JbUkRdID0gdG1wIDw8IGltbTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgzRTogY2FzZSAweDNGOgkJCQkvKiBsc3JjLCBsc3JpICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGltbSA9IElNTTU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdG1wID0gY3B1LmdyW1JEXTsKLQkgICAgaWYgKGltbSA9PSAwKQotCSAgICAgIHsKLQkJTkVXX0MgKHRtcCk7Ci0JCWNwdS5ncltSRF0gPSB0bXAgPj4gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBjcHUuZ3JbUkRdID0gdG1wID4+IGltbTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHg0MDogY2FzZSAweDQxOiBjYXNlIDB4NDI6IGNhc2UgMHg0MzoKLQljYXNlIDB4NDQ6IGNhc2UgMHg0NTogY2FzZSAweDQ2OiBjYXNlIDB4NDc6Ci0JY2FzZSAweDQ4OiBjYXNlIDB4NDk6IGNhc2UgMHg0QTogY2FzZSAweDRCOgotCWNhc2UgMHg0QzogY2FzZSAweDREOiBjYXNlIDB4NEU6IGNhc2UgMHg0RjoKLQkgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAweDUwOgotCSAgdXRpbCAoaW5zdCAmIDB4RkYpOyAKLQkgIGJyZWFrOwotCWNhc2UgMHg1MTogY2FzZSAweDUyOiBjYXNlIDB4NTM6Ci0JY2FzZSAweDU0OiBjYXNlIDB4NTU6IGNhc2UgMHg1NjogY2FzZSAweDU3OgotCWNhc2UgMHg1ODogY2FzZSAweDU5OiBjYXNlIDB4NUE6IGNhc2UgMHg1QjoKLQljYXNlIDB4NUM6IGNhc2UgMHg1RDogY2FzZSAweDVFOiBjYXNlIDB4NUY6Ci0JICBjcHUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0lMTDsKLQkgIGJyZWFrOwotCWNhc2UgMHg2MDogY2FzZSAweDYxOiBjYXNlIDB4NjI6IGNhc2UgMHg2MzoJLyogbW92aSAgKi8KLQljYXNlIDB4NjQ6IGNhc2UgMHg2NTogY2FzZSAweDY2OiBjYXNlIDB4Njc6Ci0JICBjcHUuZ3JbUkRdID0gKGluc3QgPj4gNCkgJiAweDdGOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY4OiBjYXNlIDB4Njk6IGNhc2UgMHg2QTogY2FzZSAweDZCOgotCWNhc2UgMHg2QzogY2FzZSAweDZEOiBjYXNlIDB4NkU6IGNhc2UgMHg2RjoJLyogaWxsZWdhbCAqLwotCSAgY3B1LmFzcmVncy5leGNlcHRpb24gPSBTSUdJTEw7Ci0JICBicmVhazsKLQljYXNlIDB4NzE6IGNhc2UgMHg3MjogY2FzZSAweDczOgotCWNhc2UgMHg3NDogY2FzZSAweDc1OiBjYXNlIDB4NzY6IGNhc2UgMHg3NzoKLQljYXNlIDB4Nzg6IGNhc2UgMHg3OTogY2FzZSAweDdBOiBjYXNlIDB4N0I6Ci0JY2FzZSAweDdDOiBjYXNlIDB4N0Q6IGNhc2UgMHg3RToJCS8qIGxydyAqLwotCSAgY3B1LmdyW1JYXSA9ICBybGF0ICgocGMgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgIGlmICh0cmFjaW5nKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJMUlcgb2YgMHgleCBmcm9tIDB4JXggdG8gcmVnICVkIiwKLQkJICAgICBybGF0ICgocGMgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKSwKLQkJICAgICAocGMgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDLCBSWCk7Ci0JICBtZW1vcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgMHg3RjoJCQkJCS8qIGpzcmkgKi8KLQkgIGNwdS5nclsxNV0gPSBwYzsKLQkgIGlmICh0cmFjaW5nKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJmdW5jIGNhbGw6IHIyID0gJXggcjMgPSAleCByNCA9ICV4IHI1ID0gJXggcjYgPSAleCByNyA9ICV4XG4iLAotCQkgICAgIGNwdS5nclsyXSwgY3B1LmdyWzNdLCBjcHUuZ3JbNF0sIGNwdS5ncls1XSwgY3B1LmdyWzZdLCBjcHUuZ3JbN10pOwotCWNhc2UgMHg3MDoJCQkJCS8qIGptcGkgKi8KLQkgIHBjID0gcmxhdCAoKHBjICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQyk7Ci0JICBtZW1vcHMrKzsKLQkgIGJvbnVzX2N5Y2xlcysrOwotCSAgbmVlZGZldGNoID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAweDgwOiBjYXNlIDB4ODE6IGNhc2UgMHg4MjogY2FzZSAweDgzOgotCWNhc2UgMHg4NDogY2FzZSAweDg1OiBjYXNlIDB4ODY6IGNhc2UgMHg4NzoKLQljYXNlIDB4ODg6IGNhc2UgMHg4OTogY2FzZSAweDhBOiBjYXNlIDB4OEI6Ci0JY2FzZSAweDhDOiBjYXNlIDB4OEQ6IGNhc2UgMHg4RTogY2FzZSAweDhGOgkvKiBsZCAqLwotCSAgY3B1LmdyW1JYXSA9IHJsYXQgKGNwdS5ncltSRF0gKyAoKGluc3QgPj4gMikgJiAweDAwM0MpKTsKLQkgIGlmICh0cmFjaW5nKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJsb2FkIHJlZyAlZCBmcm9tIDB4JXggd2l0aCAweCV4IiwKLQkJICAgICBSWCwKLQkJICAgICBjcHUuZ3JbUkRdICsgKChpbnN0ID4+IDIpICYgMHgwMDNDKSwgY3B1LmdyW1JYXSk7Ci0JICBtZW1vcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgMHg5MDogY2FzZSAweDkxOiBjYXNlIDB4OTI6IGNhc2UgMHg5MzoKLQljYXNlIDB4OTQ6IGNhc2UgMHg5NTogY2FzZSAweDk2OiBjYXNlIDB4OTc6Ci0JY2FzZSAweDk4OiBjYXNlIDB4OTk6IGNhc2UgMHg5QTogY2FzZSAweDlCOgotCWNhc2UgMHg5QzogY2FzZSAweDlEOiBjYXNlIDB4OUU6IGNhc2UgMHg5RjoJLyogc3QgKi8KLQkgIHdsYXQgKGNwdS5ncltSRF0gKyAoKGluc3QgPj4gMikgJiAweDAwM0MpLCBjcHUuZ3JbUlhdKTsKLQkgIGlmICh0cmFjaW5nKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJzdG9yZSByZWcgJWQgKGNvbnRhaW5pbmcgMHgleCkgdG8gMHgleCIsCi0JCSAgICAgUlgsIGNwdS5ncltSWF0sCi0JCSAgICAgY3B1LmdyW1JEXSArICgoaW5zdCA+PiAyKSAmIDB4MDAzQykpOwotCSAgbWVtb3BzKys7Ci0JICBicmVhazsKLQljYXNlIDB4QTA6IGNhc2UgMHhBMTogY2FzZSAweEEyOiBjYXNlIDB4QTM6Ci0JY2FzZSAweEE0OiBjYXNlIDB4QTU6IGNhc2UgMHhBNjogY2FzZSAweEE3OgotCWNhc2UgMHhBODogY2FzZSAweEE5OiBjYXNlIDB4QUE6IGNhc2UgMHhBQjoKLQljYXNlIDB4QUM6IGNhc2UgMHhBRDogY2FzZSAweEFFOiBjYXNlIDB4QUY6CS8qIGxkLmIgKi8KLQkgIGNwdS5ncltSWF0gPSByYmF0IChjcHUuZ3JbUkRdICsgUlMpOwotCSAgbWVtb3BzKys7Ci0JICBicmVhazsKLQljYXNlIDB4QjA6IGNhc2UgMHhCMTogY2FzZSAweEIyOiBjYXNlIDB4QjM6Ci0JY2FzZSAweEI0OiBjYXNlIDB4QjU6IGNhc2UgMHhCNjogY2FzZSAweEI3OgotCWNhc2UgMHhCODogY2FzZSAweEI5OiBjYXNlIDB4QkE6IGNhc2UgMHhCQjoKLQljYXNlIDB4QkM6IGNhc2UgMHhCRDogY2FzZSAweEJFOiBjYXNlIDB4QkY6CS8qIHN0LmIgKi8KLQkgIHdiYXQgKGNwdS5ncltSRF0gKyBSUywgY3B1LmdyW1JYXSk7Ci0JICBtZW1vcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgMHhDMDogY2FzZSAweEMxOiBjYXNlIDB4QzI6IGNhc2UgMHhDMzoKLQljYXNlIDB4QzQ6IGNhc2UgMHhDNTogY2FzZSAweEM2OiBjYXNlIDB4Qzc6Ci0JY2FzZSAweEM4OiBjYXNlIDB4Qzk6IGNhc2UgMHhDQTogY2FzZSAweENCOgotCWNhc2UgMHhDQzogY2FzZSAweENEOiBjYXNlIDB4Q0U6IGNhc2UgMHhDRjoJLyogbGQuaCAqLwotCSAgY3B1LmdyW1JYXSA9IHJoYXQgKGNwdS5ncltSRF0gKyAoKGluc3QgPj4gMykgJiAweDAwMUUpKTsKLQkgIG1lbW9wcysrOwotCSAgYnJlYWs7Ci0JY2FzZSAweEQwOiBjYXNlIDB4RDE6IGNhc2UgMHhEMjogY2FzZSAweEQzOgotCWNhc2UgMHhENDogY2FzZSAweEQ1OiBjYXNlIDB4RDY6IGNhc2UgMHhENzoKLQljYXNlIDB4RDg6IGNhc2UgMHhEOTogY2FzZSAweERBOiBjYXNlIDB4REI6Ci0JY2FzZSAweERDOiBjYXNlIDB4REQ6IGNhc2UgMHhERTogY2FzZSAweERGOgkvKiBzdC5oICovCi0JICB3aGF0IChjcHUuZ3JbUkRdICsgKChpbnN0ID4+IDMpICYgMHgwMDFFKSwgY3B1LmdyW1JYXSk7Ci0JICBtZW1vcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgMHhFODogY2FzZSAweEU5OiBjYXNlIDB4RUE6IGNhc2UgMHhFQjoKLQljYXNlIDB4RUM6IGNhc2UgMHhFRDogY2FzZSAweEVFOiBjYXNlIDB4RUY6CS8qIGJmICovCQotCSAgaWYgKENfT0ZGKCkpCi0JICAgIHsKLQkgICAgICBpbnQgZGlzcDsKLQkgICAgICBkaXNwID0gaW5zdCAmIDB4MDNGRjsKLQkgICAgICBpZiAoaW5zdCAmIDB4MDQwMCkKLQkJZGlzcCB8PSAweEZGRkZGQzAwOwotCSAgICAgIHBjICs9IGRpc3A8PDE7Ci0JICAgICAgYm9udXNfY3ljbGVzKys7Ci0JICAgICAgbmVlZGZldGNoID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweEUwOiBjYXNlIDB4RTE6IGNhc2UgMHhFMjogY2FzZSAweEUzOgotCWNhc2UgMHhFNDogY2FzZSAweEU1OiBjYXNlIDB4RTY6IGNhc2UgMHhFNzoJLyogYnQgKi8KLQkgIGlmIChDX09OKCkpCi0JICAgIHsKLQkgICAgICBpbnQgZGlzcDsKLQkgICAgICBkaXNwID0gaW5zdCAmIDB4MDNGRjsKLQkgICAgICBpZiAoaW5zdCAmIDB4MDQwMCkKLQkJZGlzcCB8PSAweEZGRkZGQzAwOwotCSAgICAgIHBjICs9IGRpc3A8PDE7Ci0JICAgICAgYm9udXNfY3ljbGVzKys7Ci0JICAgICAgbmVlZGZldGNoID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDB4Rjg6IGNhc2UgMHhGOTogY2FzZSAweEZBOiBjYXNlIDB4RkI6Ci0JY2FzZSAweEZDOiBjYXNlIDB4RkQ6IGNhc2UgMHhGRTogY2FzZSAweEZGOgkvKiBic3IgKi8JCi0JICBjcHUuZ3JbMTVdID0gcGM7Ci0JY2FzZSAweEYwOiBjYXNlIDB4RjE6IGNhc2UgMHhGMjogY2FzZSAweEYzOgotCWNhc2UgMHhGNDogY2FzZSAweEY1OiBjYXNlIDB4RjY6IGNhc2UgMHhGNzoJLyogYnIgKi8KLQkgIHsKLQkgICAgaW50IGRpc3A7Ci0JICAgIGRpc3AgPSBpbnN0ICYgMHgwM0ZGOwotCSAgICBpZiAoaW5zdCAmIDB4MDQwMCkKLQkgICAgICBkaXNwIHw9IDB4RkZGRkZDMDA7Ci0JICAgIHBjICs9IGRpc3A8PDE7Ci0JICAgIGJvbnVzX2N5Y2xlcysrOwotCSAgICBuZWVkZmV0Y2ggPSAxOwotCSAgfQotCSAgYnJlYWs7Ci0KLQl9Ci0KLSAgICAgIGlmICh0cmFjaW5nKQotCWZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0KLSAgICAgIGlmIChuZWVkZmV0Y2gpICAgCi0JewotCSAgLyogRG8gbm90IGxldCBoaW0gZmV0Y2ggZnJvbSBhIGJhZCBhZGRyZXNzISAqLwotCSAgaWYgKCgodXdvcmQpcGMpID49IGNwdS5hc3JlZ3MubXNpemUpCi0JICAgIHsKLQkgICAgICBpZiAoaXNzdWVfbWVzc2FnZXMpCi0JCWZwcmludGYgKHN0ZGVyciwgIlBDIGxvYWRlZCBhdCAweCV4IGlzIG91dHNpZGUgb2YgYXZhaWxhYmxlIG1lbW9yeSEgKDB4JXgpXG4iLCBvbGRwYywgcGMpOwotCSAgICAgIAotCSAgICAgIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHU0VHVjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWJ1ZiA9IHJsYXQgKHBjICYgMHhGRkZGRkZGQyk7Ci0JICAgICAgbmVlZGZldGNoID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlICghY3B1LmFzcmVncy5leGNlcHRpb24pOwotCi0gIC8qIEhpZGUgYXdheSB0aGUgdGhpbmdzIHdlJ3ZlIGNhY2hlZCB3aGlsZSBleGVjdXRpbmcuICAqLwotICBjcHUuYXNyZWdzLnBjID0gcGM7Ci0gIGNwdS5hc3JlZ3MuaW5zdHMgKz0gaW5zdHM7CQkvKiBpbnN0cnVjdGlvbnMgZG9uZSAuLi4gKi8KLSAgY3B1LmFzcmVncy5jeWNsZXMgKz0gaW5zdHM7CQkvKiBhbmQgZWFjaCB0YWtlcyBhIGN5Y2xlICovCi0gIGNwdS5hc3JlZ3MuY3ljbGVzICs9IGJvbnVzX2N5Y2xlczsJLyogYW5kIGV4dHJhIGN5Y2xlcyBmb3IgYnJhbmNoZXMgKi8KLSAgY3B1LmFzcmVncy5jeWNsZXMgKz0gbWVtb3BzICogbWVtY3ljbGVzOwkvKiBhbmQgbWVtb3AgY3ljbGUgZGVsYXlzICovCi0gIAotICBzaWduYWwgKFNJR0lOVCwgc2lnc2F2ZSk7Ci19Ci0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICogYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGk7Ci0gIGluaXRfcG9pbnRlcnMgKCk7Ci0gIAotICBtZW1jcHkgKCYgY3B1Lm1lbVthZGRyXSwgYnVmZmVyLCBzaXplKTsKLSAgCi0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpOwotICBpbml0X3BvaW50ZXJzICgpOwotICAKLSAgbWVtY3B5IChidWZmZXIsICYgY3B1Lm1lbVthZGRyXSwgc2l6ZSk7Ci0gIAotICByZXR1cm4gc2l6ZTsKLX0KLQotCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqIG1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgaW5pdF9wb2ludGVycyAoKTsKLQotICBpZiAocm4gPCBOVU1fTUNPUkVfUkVHUyAmJiBybiA+PSAwKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPT0gNCkKLQl7Ci0JICBsb25nIGl2YWw7Ci0JICAKLQkgIC8qIG1pc2FsaWdubWVudCBzYWZlICovCi0JICBpdmFsID0gbWNvcmVfZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChtZW1vcnksIDQpOwotCSAgY3B1LmFzaW50c1tybl0gPSBpdmFsOwotCX0KLQotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICogbWVtb3J5OwotICAgICBpbnQgbGVuZ3RoOwotewotICBpbml0X3BvaW50ZXJzICgpOwotICAKLSAgaWYgKHJuIDwgTlVNX01DT1JFX1JFR1MgJiYgcm4gPj0gMCkKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoID09IDQpCi0JewotCSAgbG9uZyBpdmFsID0gY3B1LmFzaW50c1tybl07Ci0KLQkgIC8qIG1pc2FsaWdubWVudC1zYWZlICovCi0JICBtY29yZV9zdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChtZW1vcnksIDQsIGl2YWwpOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1zaW1fdHJhY2UgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgdHJhY2luZyA9IDE7Ci0gIAotICBzaW1fcmVzdW1lIChzZCwgMCwgMCk7Ci0KLSAgdHJhY2luZyA9IDA7Ci0gIAotICByZXR1cm4gMTsKLX0KLQotdm9pZAotc2ltX3N0b3BfcmVhc29uIChzZCwgcmVhc29uLCBzaWdyYykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGVudW0gc2ltX3N0b3AgKiByZWFzb247Ci0gICAgIGludCAqIHNpZ3JjOwotewotICBpZiAoY3B1LmFzcmVncy5leGNlcHRpb24gPT0gU0lHUVVJVCkKLSAgICB7Ci0gICAgICAqIHJlYXNvbiA9IHNpbV9leGl0ZWQ7Ci0gICAgICAqIHNpZ3JjID0gY3B1LmdyW1BBUk0xXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqIHJlYXNvbiA9IHNpbV9zdG9wcGVkOwotICAgICAgKiBzaWdyYyA9IGNwdS5hc3JlZ3MuZXhjZXB0aW9uOwotICAgIH0KLX0KLQotCi1pbnQKLXNpbV9zdG9wIChzZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0gIGNwdS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHSU5UOwotICByZXR1cm4gMTsKLX0KLQotCi12b2lkCi1zaW1faW5mbyAoc2QsIHZlcmJvc2UpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgdmVyYm9zZTsKLXsKLSNpZmRlZiBXQVRDSEZVTkNUSU9OUwotICBpbnQgdywgd2N5YzsKLSNlbmRpZgotICBkb3VibGUgdmlydHRpbWUgPSBjcHUuYXNyZWdzLmN5Y2xlcyAvIDM2LjBlNjsKLQotICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIlxuXG4jIGluc3RydWN0aW9ucyBleGVjdXRlZCAgJTEwZFxuIiwKLQkJCSAgICAgY3B1LmFzcmVncy5pbnN0cyk7Ci0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBjeWNsZXMgICAgICAgICAgICAgICAgICUxMGRcbiIsCi0JCQkgICAgIGNwdS5hc3JlZ3MuY3ljbGVzKTsKLSAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICIjIHBpcGVsaW5lIHN0YWxscyAgICAgICAgJTEwZFxuIiwKLQkJCSAgICAgY3B1LmFzcmVncy5zdGFsbHMpOwotICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgdmlydHVhbCB0aW1lIHRha2VuICAgICAlMTAuNGZcbiIsCi0JCQkgICAgIHZpcnR0aW1lKTsKLQotI2lmZGVmIFdBVENIRlVOQ1RJT05TCi0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiXG5OdW1iZXIgb2Ygd2F0Y2hlZCBmdW5jdGlvbnM6ICVkXG4iLAotCQkJICAgICBFTkRXTCk7Ci0KLSAgd2N5YyA9IDA7Ci0gIAotICBmb3IgKHcgPSAxOyB3IDw9IEVORFdMOyB3KyspCi0gICAgewotICAgICAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICJXTCA9ICVzICU4eFxuIixXTHN0clt3XSxXTFt3XSk7Ci0gICAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiAgY2FsbHMgPSAlZCwgY3ljbGVzID0gJWRcbiIsCi0JCQkJIFdMY250c1t3XSxXTGN5Y1t3XSk7Ci0gICAgICAKLSAgICAgIGlmIChXTGNudHNbd10gIT0gMCkKLQljYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywKLQkJCQkgICAiICBtYXhjcGMgPSAlZCwgbWluY3BjID0gJWQsIGF2ZWNwYyA9ICVkXG4iLAotCQkJCSAgIFdMbWF4W3ddLFdMbWluW3ddLFdMY3ljW3ddL1dMY250c1t3XSk7Ci0gICAgICB3Y3ljICs9IFdMY3ljW3ddOwotICAgIH0KLSAgCi0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLAotCQkJICAgICAiVG90YWwgY3ljbGVzIGZvciB3YXRjaGVkIGZ1bmN0aW9uczogJWRcbiIsd2N5Yyk7Ci0jZW5kaWYKLX0KLQotc3RydWN0CWFvdXQKLXsKLSAgdW5zaWduZWQgY2hhciAgc2FfbWFjaHR5cGVbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIHNhX21hZ2ljWzJdOwotICB1bnNpZ25lZCBjaGFyICBzYV90c2l6ZVs0XTsKLSAgdW5zaWduZWQgY2hhciAgc2FfZHNpemVbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIHNhX2JzaXplWzRdOwotICB1bnNpZ25lZCBjaGFyICBzYV9zeW1zWzRdOwotICB1bnNpZ25lZCBjaGFyICBzYV9lbnRyeVs0XTsKLSAgdW5zaWduZWQgY2hhciAgc2FfdHJlbG9bNF07Ci0gIHVuc2lnbmVkIGNoYXIgIHNhX2RyZWxvWzRdOwotfSBhb3V0OwotCi0jZGVmaW5lCUxPTkcoeCkJCSgoKHgpWzBdPDwyNCl8KCh4KVsxXTw8MTYpfCgoeClbMl08PDgpfCh4KVszXSkKLSNkZWZpbmUJU0hPUlQoeCkJKCgoeClbMF08PDgpfCh4KVsxXSkKLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKLSAgICAgU0lNX09QRU5fS0lORCBraW5kOwotICAgICBob3N0X2NhbGxiYWNrICogY2I7Ci0gICAgIHN0cnVjdCBfYmZkICogYWJmZDsKLSAgICAgY2hhciAqKiBhcmd2OwotewotICBpbnQgb3NpemUgPSBzaW1fbWVtb3J5X3NpemU7Ci0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0gIGNhbGxiYWNrID0gY2I7Ci0gIAotICBpZiAoa2luZCA9PSBTSU1fT1BFTl9TVEFOREFMT05FKQotICAgIGlzc3VlX21lc3NhZ2VzID0gMTsKLSAgCi0gIC8qIERpc2NhcmQgYW5kIHJlYWNxdWlyZSBtZW1vcnkgLS0gc3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLiAgKi8KLSAgc2ltX3NpemUgKDEpOwkJLyogc21hbGwgKi8KLSAgc2ltX3NpemUgKG9zaXplKTsJLyogYW5kIGJhY2sgYWdhaW4gKi8KLQotICBzZXRfaW5pdGlhbF9ncHJzICgpOwkvKiBSZXNldCB0aGUgR1BSIHJlZ2lzdGVycy4gICovCi0gIAotICAvKiBGdWRnZSBvdXIgZGVzY3JpcHRvciBmb3Igbm93LiAgKi8KLSAgcmV0dXJuIChTSU1fREVTQykgMTsKLX0KLQotdm9pZAotc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcXVpdHRpbmc7Ci17Ci0gIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotU0lNX1JDCi1zaW1fbG9hZCAoc2QsIHByb2csIGFiZmQsIGZyb21fdHR5KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqIHByb2c7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgLyogRG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBFTEYgZXhlY3V0YWJsZXM7IHRoaXMgdHVybnMgb3V0IHRvIGJlCi0gICAgIGp1c3QgYWJvdXQgdGhlIHJpZ2h0IHRoaW5nIGZvciBhbnkgb2JqZWN0IGZvcm1hdCB0aGF0OgotICAgICAgIC0gd2UgY3JhY2sgdXNpbmcgQkZEIHJvdXRpbmVzCi0gICAgICAgLSBmb2xsb3dzIHRoZSB0cmFkaXRpb25hbCBVTklYIHRleHQvZGF0YS9ic3MgbGF5b3V0Ci0gICAgICAgLSBjYWxscyB0aGUgYnNzIHNlY3Rpb24gIi5ic3MiLiAgICovCi0KLSAgZXh0ZXJuIGJmZCAqIHNpbV9sb2FkX2ZpbGUgKCk7IC8qID8/PyBEb24ndCBrbm93IHdoZXJlIHRoaXMgc2hvdWxkIGxpdmUuICAqLwotICBiZmQgKiBwcm9nX2JmZDsKLQotICB7Ci0gICAgYmZkICogaGFuZGxlOwotICAgIGFzZWN0aW9uICogc19ic3M7Ci0gICAgaGFuZGxlID0gYmZkX29wZW5yIChwcm9nLCAwKTsJLyogY291bGQgYmUgIm1jb3JlIiAqLwotICAgIAotICAgIGlmICghaGFuZGxlKQotICAgICAgewotCXByaW50ZigiYGAlcycnIGNvdWxkIG5vdCBiZSBvcGVuZWQuXG4iLCBwcm9nKTsKLQlyZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gICAgICB9Ci0gICAgCi0gICAgLyogTWFrZXMgc3VyZSB0aGF0IHdlIGhhdmUgYW4gb2JqZWN0IGZpbGUsIGFsc28gY2xlYW5zIGdldHMgdGhlIAotICAgICAgIHNlY3Rpb24gaGVhZGVycyBpbiBwbGFjZS4gICovCi0gICAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChoYW5kbGUsIGJmZF9vYmplY3QpKQotICAgICAgewotCS8qIHdhc24ndCBhbiBvYmplY3QgZmlsZSAqLwotCWJmZF9jbG9zZSAoaGFuZGxlKTsKLQlwcmludGYgKCJgYCVzJycgaXMgbm90IGFwcHJvcHJpYXRlIG9iamVjdCBmaWxlLlxuIiwgcHJvZyk7Ci0JcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgICAgfQotCi0gICAgLyogTG9vayBmb3IgdGhhdCBic3Mgc2VjdGlvbi4gICovCi0gICAgc19ic3MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaGFuZGxlLCAiLmJzcyIpOwotICAgIAotICAgIGlmICghc19ic3MpCi0gICAgICB7Ci0JcHJpbnRmKCJgYCVzJycgaGFzIG5vIGJzcyBzZWN0aW9uLlxuIiwgcHJvZyk7Ci0JcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgICAgfQotCi0gICAgLyogQXBwcm9wcmlhdGVseSBwYXJhbm9pZCB3b3VsZCBjaGVjayB0aGF0IHdlIGhhdmUKLSAgICAgICBhIHRyYWRpdGlvbmFsIHRleHQvZGF0YS9ic3Mgb3JkZXJpbmcgd2l0aGluIG1lbW9yeS4gICovCi0KLSAgICAvKiBmaWd1cmUgdGhlIGVuZCBvZiB0aGUgYnNzIHNlY3Rpb24gKi8KLSNpZiAwCi0gICAgcHJpbnRmICgiYnNzIHNlY3Rpb24gYXQgMHglMDh4IGZvciAweCUwOHggYnl0ZXNcbiIsCi0JKHVuc2lnbmVkIGxvbmcpIHNfYnNzLT52bWEgLCAodW5zaWduZWQgbG9uZykgc19ic3MtPl9jb29rZWRfc2l6ZSk7Ci0jZW5kaWYKLSAgICBoZWFwX3B0ciA9ICh1bnNpZ25lZCBsb25nKSBzX2Jzcy0+dm1hICsgKHVuc2lnbmVkIGxvbmcpIHNfYnNzLT5fY29va2VkX3NpemU7Ci0KLSAgICAvKiBDbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuICAqLwotICAgIGJmZF9jbG9zZSAoaGFuZGxlKTsKLSAgICAKLSAgICAvKiBYWFg6IGRvIHdlIG5lZWQgdG8gZnJlZSB0aGUgc19ic3MgYW5kIGhhbmRsZSBzdHJ1Y3R1cmVzPyAqLwotICB9Ci0KLSAgLyogZnJvbSBzaCAtLSBkYWMgKi8KLSAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBjYWxsYmFjaywgcHJvZywgYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIAotICB0YXJnZXRfYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChwcm9nX2JmZCk7Ci0gICAgCi0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotU0lNX1JDCi1zaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgcHJvZ19iZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHN0cnVjdCBfYmZkICogcHJvZ19iZmQ7Ci0gICAgIGNoYXIgKiogYXJndjsKLSAgICAgY2hhciAqKiBlbnY7Ci17Ci0gIGNoYXIgKiogYXZwOwotICBpbnQgbmFyZ3MgPSAwOwotICBpbnQgbmVudiA9IDA7Ci0gIGludCBzX2xlbmd0aDsKLSAgaW50IGw7Ci0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nczsKLSAgdW5zaWduZWQgbG9uZyBwb2ludGVyczsKLSAgdW5zaWduZWQgbG9uZyBoaV9zdGFjazsKLQotCi0gIC8qIFNldCB0aGUgaW5pdGlhbCByZWdpc3RlciBzZXQuICAqLwotICBsID0gaXNzdWVfbWVzc2FnZXM7Ci0gIGlzc3VlX21lc3NhZ2VzID0gMDsKLSAgc2V0X2luaXRpYWxfZ3BycyAoKTsKLSAgaXNzdWVfbWVzc2FnZXMgPSBsOwotICAKLSAgaGlfc3RhY2sgPSBjcHUuYXNyZWdzLm1zaXplIC0gNDsKLSAgY3B1LmFzcmVncy5wYyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgYXJndW1lbnQgYW5kIGVudmlyb25tZW50IHN0cmluZ3MuICAqLwotICBzX2xlbmd0aCA9IDA7Ci0gIG5hcmdzID0gMDsKLSAgYXZwID0gYXJndjsKLSAgd2hpbGUgKGF2cCAmJiAqYXZwKQotICAgIHsKLSAgICAgIGwgPSBzdHJsZW4gKCphdnApICsgMTsJLyogaW5jbHVkZSB0aGUgbnVsbCAqLwotICAgICAgc19sZW5ndGggKz0gKGwgKyAzKSAmIH4zOwkvKiBtYWtlIGl0IGEgNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgICBuYXJncysrOyBhdnArKzsKLSAgICB9Ci0KLSAgbmVudiA9IDA7Ci0gIGF2cCA9IGVudjsKLSAgd2hpbGUgKGF2cCAmJiAqYXZwKQotICAgIHsKLSAgICAgIGwgPSBzdHJsZW4gKCphdnApICsgMTsJLyogaW5jbHVkZSB0aGUgbnVsbCAqLwotICAgICAgc19sZW5ndGggKz0gKGwgKyAzKSAmIH4gMzsvKiBtYWtlIGl0IGEgNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgICBuZW52Kys7IGF2cCsrOwotICAgIH0KLQotICAvKiBDbGFpbSBzb21lIG1lbW9yeSBmb3IgdGhlIHBvaW50ZXJzIGFuZCBzdHJpbmdzLiAqLwotICBwb2ludGVycyA9IGhpX3N0YWNrIC0gc2l6ZW9mKHdvcmQpICogKG5lbnYrMStuYXJncysxKTsKLSAgcG9pbnRlcnMgJj0gfjM7CQkvKiBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkICovCi0gIGNwdS5nclswXSA9IHBvaW50ZXJzOwotCi0gIHN0cmluZ3MgPSBjcHUuZ3JbMF0gLSBzX2xlbmd0aDsKLSAgc3RyaW5ncyAmPSB+MzsJCS8qIHdhbnQgdG8gbWFrZSBpdCA0LWJ5dGUgYWxpZ25lZCAqLwotICBjcHUuZ3JbMF0gPSBzdHJpbmdzOwotICAvKiBkYWMgZml4LCB0aGUgc3RhY2sgYWRkcmVzcyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkISAqLwotICBjcHUuZ3JbMF0gPSBjcHUuZ3JbMF0gLSBjcHUuZ3JbMF0gJSA4OwotCi0gIC8qIExvb3AgdGhyb3VnaCB0aGUgYXJndW1lbnRzIGFuZCBmaWxsIHRoZW0gaW4uICAqLwotICBjcHUuZ3JbUEFSTTFdID0gbmFyZ3M7Ci0gIGlmIChuYXJncyA9PSAwKQotICAgIHsKLSAgICAgIC8qIE5vIHN0cmluZ3MgdG8gZmlsbCBpbi4gICovCi0gICAgICBjcHUuZ3JbUEFSTTJdID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjcHUuZ3JbUEFSTTJdID0gcG9pbnRlcnM7Ci0gICAgICBhdnAgPSBhcmd2OwotICAgICAgd2hpbGUgKGF2cCAmJiAqYXZwKQotCXsKLQkgIC8qIFNhdmUgd2hlcmUgd2UncmUgcHV0dGluZyBpdC4gICovCi0JICB3bGF0IChwb2ludGVycywgc3RyaW5ncyk7Ci0KLQkgIC8qIENvcHkgdGhlIHN0cmluZy4gICovCi0JICBsID0gc3RybGVuICgqIGF2cCkgKyAxOwotCSAgc3RyY3B5ICgoY2hhciAqKShjcHUubWVtICsgc3RyaW5ncyksICphdnApOwotCi0JICAvKiBCdW1wIHRoZSBwb2ludGVycy4gICovCi0JICBhdnArKzsKLQkgIHBvaW50ZXJzICs9IDQ7Ci0JICBzdHJpbmdzICs9IGwrMTsKLQl9Ci0gICAgICAKLSAgICAgIC8qIEEgbnVsbCB0byBmaW5pc2ggdGhlIGxpc3QuICAqLwotICAgICAgd2xhdCAocG9pbnRlcnMsIDApOwotICAgICAgcG9pbnRlcnMgKz0gNDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBlbnZpcm9ubWVudCBwb2ludGVycy4gICovCi0gIGlmIChuZW52ID09IDApCi0gICAgewotICAgICAgLyogTm8gc3RyaW5ncyB0byBmaWxsIGluLiAgKi8KLSAgICAgIGNwdS5ncltQQVJNM10gPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNwdS5ncltQQVJNM10gPSBwb2ludGVyczsKLSAgICAgIGF2cCA9IGVudjsKLSAgICAgIAotICAgICAgd2hpbGUgKGF2cCAmJiAqYXZwKQotCXsKLQkgIC8qIFNhdmUgd2hlcmUgd2UncmUgcHV0dGluZyBpdC4gICovCi0JICB3bGF0IChwb2ludGVycywgc3RyaW5ncyk7Ci0KLQkgIC8qIENvcHkgdGhlIHN0cmluZy4gICovCi0JICBsID0gc3RybGVuICgqIGF2cCkgKyAxOwotCSAgc3RyY3B5ICgoY2hhciAqKShjcHUubWVtICsgc3RyaW5ncyksICphdnApOwotCi0JICAvKiBCdW1wIHRoZSBwb2ludGVycy4gICovCi0JICBhdnArKzsKLQkgIHBvaW50ZXJzICs9IDQ7Ci0JICBzdHJpbmdzICs9IGwrMTsKLQl9Ci0gICAgICAKLSAgICAgIC8qIEEgbnVsbCB0byBmaW5pc2ggdGhlIGxpc3QuICAqLwotICAgICAgd2xhdCAocG9pbnRlcnMsIDApOwotICAgICAgcG9pbnRlcnMgKz0gNDsKLSAgICB9Ci0gIAotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi12b2lkCi1zaW1fa2lsbCAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICAvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLXZvaWQKLXNpbV9kb19jb21tYW5kIChzZCwgY21kKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqIGNtZDsKLXsKLSAgLyogTm90aGluZyB0aGVyZSB5ZXQ7IGl0J3MgYWxsIGFuIGVycm9yLiAgKi8KLSAgCi0gIGlmIChjbWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICoqIHNpbWFyZ3YgPSBidWlsZGFyZ3YgKGNtZCk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJjbXAgKHNpbWFyZ3ZbMF0sICJ3YXRjaCIpID09IDApCi0JewotCSAgaWYgKChzaW1hcmd2WzFdID09IE5VTEwpIHx8IChzaW1hcmd2WzJdID09IE5VTEwpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gd2F0Y2ggY21kLlxuIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAKLQkgIEVORFdMKys7Ci0JICAKLQkgIFdMW0VORFdMXSA9IHN0cnRvbCAoc2ltYXJndlsyXSwgTlVMTCwgMCk7Ci0JICBXTHN0cltFTkRXTF0gPSBzdHJkdXAgKHNpbWFyZ3ZbMV0pOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkZWQgJXMgKCV4KSB0byB3YXRjaGxpc3QsICMlZFxuIixXTHN0cltFTkRXTF0sCi0JCSAgIFdMW0VORFdMXSwgRU5EV0wpOwotCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChzaW1hcmd2WzBdLCAiZHVtcG1lbSIpID09IDApCi0JewotCSAgdW5zaWduZWQgY2hhciAqIHA7Ci0JICBGSUxFICogZHVtcGZpbGU7Ci0KLQkgIGlmIChzaW1hcmd2WzFdID09IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIGR1bXBtZW0gY21kLlxuIik7Ci0KLQkgIGZwcmludGYgKHN0ZGVyciwgIldyaXRpbmcgZHVtcGZpbGUgJXMuLi4iLHNpbWFyZ3ZbMV0pOwotCSAgCi0JICBkdW1wZmlsZSA9IGZvcGVuIChzaW1hcmd2WzFdLCAidyIpOwotCSAgcCA9IGNwdS5tZW07Ci0JICBmd3JpdGUgKHAsIGNwdS5hc3JlZ3MubXNpemUtMSwgMSwgZHVtcGZpbGUpOwotCSAgZmNsb3NlIChkdW1wZmlsZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwgImRvbmUuXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNpbWFyZ3ZbMF0sICJjbGVhcnN0YXRzIikgPT0gMCkKLQl7Ci0JICBjcHUuYXNyZWdzLmN5Y2xlcyA9IDA7Ci0JICBjcHUuYXNyZWdzLmluc3RzID0gMDsKLQkgIGNwdS5hc3JlZ3Muc3RhbGxzID0gMDsKLQkgIEVORFdMID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNpbWFyZ3ZbMF0sICJ2ZXJib3NlIikgPT0gMCkKLQl7Ci0JICBpc3N1ZV9tZXNzYWdlcyA9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwiRXJyb3I6IFwiJXNcIiBpcyBub3QgYSB2YWxpZCBNLkNPUkUgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLAotCQkgICBjbWQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJNLkNPUkUgc2ltIGNvbW1hbmRzOiBcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICB3YXRjaCA8ZnVuY25hbWU+IDxhZGRyPlxuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIGR1bXBtZW0gPGZpbGVuYW1lPlxuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIGNsZWFyc3RhdHNcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICB2ZXJib3NlXG4iKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXNpbV9zZXRfY2FsbGJhY2tzIChwdHIpCi0gICAgIGhvc3RfY2FsbGJhY2sgKiBwdHI7Ci17Ci0gIGNhbGxiYWNrID0gcHRyOyAKLX0KZGlmZiAtLWdpdCBhL3NpbS9tY29yZS9zeXNkZXAuaCBiL3NpbS9tY29yZS9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NzQwYS4uMDAwMDAwMAotLS0gYS9zaW0vbWNvcmUvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBTeXN0ZW0gaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIE1vdG9yb2xhIE1Db3JlIHNpbXVsYXRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9ICi0jZGVmaW5lIF9fU1lTREVQX0gKLQotI2lmbmRlZglob3N0c19zdGRfaG9zdF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2lmbmRlZglPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0jaWZuZGVmCVNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotI2lmbmRlZglTRUVLX0NVUgotI2RlZmluZSBTRUVLX0NVUiAxCi0jZW5kaWYKLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS8qI2luY2x1ZGUgPHN0cmluZy5oPiovCi0jZWxzZQotZXh0ZXJuIGNoYXIgKiBta3RlbXAgKCk7Ci0jaWZuZGVmIG1lbXNldAotZXh0ZXJuIFBUUiAgICBtZW1zZXQgKCk7Ci0jZW5kaWYKLQotI2lmbmRlZglET05UREVDTEFSRV9NQUxMT0MKLWV4dGVybiBQVFIgICBtYWxsb2MgKCk7Ci1leHRlcm4gUFRSICAgcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZuZGVmCV9fR05VQ19fCi1leHRlcm4gUFRSICAgbWVtY3B5ICgpOwotI2Vsc2UKLS8qIGNoYXIgKiBtZW1jcHkgKCk7ICovCi0jZW5kaWYKLQotI2lmZGVmIF9fU1REQ19fCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2Vsc2UKLWV4dGVybiBpbnQgZnJlZSgpOwotI2VuZGlmCi0KLSNpZm5kZWYgc3RyY2hyCi1leHRlcm4gY2hhciAqIHN0cmNocigpOwotI2VuZGlmCi1leHRlcm4gY2hhciAqIGdldGVudigpOwotZXh0ZXJuIFBUUiAgICBtZW1jaHIoKTsKLWV4dGVybiBjaGFyICogc3RycmNocigpOwotCi1leHRlcm4gY2hhciAqIHN0cnJjaHIoKTsKLWV4dGVybiBjaGFyICogY3RpbWUoKTsKLWV4dGVybiBsb25nICAgYXRvbCgpOwotZXh0ZXJuIGNoYXIgKiBnZXRlbnYoKTsKLSNlbmRpZiAvKiBTVERDX0hFQURFUlMgKi8KLQotI2lmbmRlZglCWVRFU19JTl9QUklOVEZfSU5UCi0jZGVmaW5lIEJZVEVTX0lOX1BSSU5URl9JTlQgNAotI2VuZGlmCi0KLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZGVmaW5lIGhvc3RzX3N0ZF9ob3N0X0gKLSNlbmRpZgotCi0jaWZkZWYJU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYgLyogU1REQ19IRUFERVJTICovCi0KLSNlbmRpZiAvKiBfX1NZU0RFUF9IICovCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9DaGFuZ2VMb2cgYi9zaW0vbWlwcy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTA1OWMuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjE4NCArMCwwIEBACi0yMDAwLTA1LTI0ICBNaWNoYWVsIEhheWVzICA8bWhheWVzQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoZG9fZG11bHR4KTogRml4IHR5cG8uCi0KLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBBcHIgMjggMjA6NDg6MzYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW4gKERNeEMxKTogRml4IGZvcm1hdCBhcmd1bWVudHMgZm9yIHNpbV9pb19lcHJpbnRmIGNhbGwuCi0KLTIwMDAtMDQtMTIgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQHJlZGhhdC5jb20+Ci0KLQkqIHNpbS1tYWluLmggKEdQUl9DTEVBUik6IERlZmluZSBtYWNyby4KLQotTW9uIEFwciAxMCAwMDowNzowOSAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogT3V0cHV0IGxvbmcgdXNpbmcgJWx4IGFuZCBub3QgJXMuCi0KLTIwMDAtMDMtMjEgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQHJlZGhhdC5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IFNvcnQgJiBleHRlbmQgZHVtbXkgbWVtb3J5IHJlZ2lvbnMgZm9yCi0JLS1ib2FyZD1qbXIzOTA0IGZvciBlQ29zLgotCi0yMDAwLTAzLTAyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRmViICA4IDE4OjM1OjAxIDIwMDAgIERvbmFsZCBMaW5kc2F5ICA8ZGxpbmRzYXlAaG91bmQuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMsIG1pcHMuaWdlbjogYWxsIDUgREVBREMwREUgc2l0dWF0aW9ucyBub3cgaGF2ZSBzaW1faW9fZXByaW50ZgotCWNhbGxzLCBjb25kaXRpb25hbCBvbiB0aGUgc2ltdWxhdG9yIGJlaW5nIGluIHZlcmJvc2UgbW9kZS4KLQotRnJpIEZlYiAgNCAwOTo0NToxNSAyMDAwICBEb25hbGQgTGluZHNheSAgPGRsaW5kc2F5QGN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmMgKGNhY2hlX29wKTogQWRkZWQgY2FzZSBhcm0gc28gdGhhdCBDQUNIRSBvcHMgdG8gYSBzZWNvbmRhcnkKLQljYWNoZSBkb24ndCBnZXQgUmVzZXJ2ZWRJbnN0cnVjdGlvbiB0cmFwcy4KLQotMTk5OS0xMS0yOSAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGR2LXR4MzkwNHNpby5jICh0eDM5MDRzaW9faW9fd3JpdGVfYnVmZmVyKTogVXNlIHdyaXRlIHZhbHVlIGFzIGEgbWFzawotCXRvIGNsZWFyIHN0YXR1cyBiaXRzIGluIHNkaXNyIHJlZ2lzdGVyLiBUaGlzIGlzIGhvdyB0aGUgaGFyZHdhcmUgd29ya3MuCi0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZGVkIG1vcmUgbWVtb3J5IGFsaWFzZXMgZm9yIGptcjM5MDQgaGFyZHdhcmUKLQliZWluZyB1c2VkIGJ5IGN5Z21vbi4KLQotMTk5OS0xMS0xMSAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogQ29ycmVjdGx5IGhhbmRsZSBETUZDMCBhbmQgRE1UQzAKLQlpbnN0cnVjdGlvbnMuCi0KLVRodSBTZXAgIDkgMTU6MTI6MDggMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW4gKE1VTFQpOiBDb3JyZWN0IHByZXZpb3VzIG1pcy1hcHBsaWVkIHBhdGNoLgotCi1UdWUgU2VwICA3IDEzOjM0OjU0IDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChkZWxheXNsb3QzMik6IEhhbmRsZSBzZXF1ZW5jZSBsaWtlCi0JbXRjMSAkYXQsJGYxMiA7IGphbCBmcF9hZGQgOyBtb3YucyAkZjEzLCRmMTIKLQljb3JyZWN0bHkgYnkgY2FsbGluZyBFTkdJTkVfSVNTVUVfUFJFRklYX0hPT0soKSBiZWZvcmUgaXNzdWUuCi0JKE1VTFQpOiBBY3R1YWxseSBwYXNzIHRoZSB0aGlyZCByZWdpc3Rlci4uLgotCi0xOTk5LTA5LTAzICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkZWQgbW9yZSBtZW1vcnkgYWxpYXNlcyBmb3IgYWRkaXRpb25hbAotCWhhcmR3YXJlIGJlaW5nIHRvdWNoZWQgYnkgY3lnbW9uIG9uIGptcjM5MDQgYm9hcmQuCi0KLVRodSBTZXAgIDIgMTg6MTU6NTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBKdWwgMjcgMTY6MzY6NTEgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlcik6IEhhbmRsZSBjYXNlIHdoZXJlIGNsaWVudCAtIEdEQiAtCi0gCXNwZWNpZmllcyB0aGF0IGEgNCBieXRlIHJlZ2lzdGVyIGlzIDggYnl0ZXMgaW4gc2l6ZS4KLQkoc2ltX2ZldGNoX3JlZ2lzdGVyKTogRGl0dG8uCi0JCi0xOTk5LTA3LTE0ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JSW1wbGVtZW50ICJzaW0gZmlybXdhcmUiIG9wdGlvbiwgaW5zcGlyZWQgYnkgamltYidzIHZlcnNpb24gb2YgMTk5OC0wMS4KLQkqIGludGVycC5jIChmaXJtd2FyZV9vcHRpb25fcCk6IE5ldyBnbG9iYWwgZmxhZzogInNpbSBmaXJtd2FyZSIgZ2l2ZW4uCi0JKGlkdF9tb25pdG9yX2Jhc2UpOiBCYXNlIGFkZHJlc3MgZm9yIElEVCBtb25pdG9yIHRyYXBzLgotCShwbW9uX21vbml0b3JfYmFzZSk6IERpdHRvIGZvciBQTU9OLgotCShsc2lwbW9uX21vbml0b3JfYmFzZSk6IERpdHRvIGZvciBMU0kgUE1PTi4KLQkoTU9OSVRPUl9CQVNFLCBNT05JVE9SX1NJWkUpOiBSZW1vdmVkIG1hY3Jvcy4KLQkobWlwc19vcHRpb24pOiBBZGQgImZpcm13YXJlIiBvcHRpb24gd2l0aCBuZXcgT1BUSU9OX0ZJUk1XQVJFIGtleS4KLQkoc2ltX2Zpcm13YXJlX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBDYWxsIGl0IGZvciBPUFRJT05fRklSTVdBUkUuCi0JKHNpbV9vcGVuKTogQWxsb2NhdGUgbWVtb3J5IGZvciBpZHRfbW9uaXRvciByZWdpb24uICBJZiAiLS1ib2FyZCIKLQlvcHRpb24gd2FzIGdpdmVuLCBhZGQgbm8gbW9uaXRvciBieSBkZWZhdWx0LiAgQWRkIEJSRUFLIGhvb2tzIG9ubHkgaWYKLQltb25pdG9ycyBhcmUgYWxzbyB0aGVyZS4KLQkKLU1vbiBKdWwgMTIgMDA6MDI6MjcgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogRmx1c2ggb3V0cHV0IGJlZm9yZSByZWFkaW5nIGlucHV0LgotCi1TdW4gSnVsIDExIDE5OjI4OjExIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdGNvbmZpZy5pbiAoU0lNX0hBTkRMRVNfTE1BKTogQWx3YXlzIGRlZmluZS4KLQotVGh1IEp1bCAgOCAxNjowNjo1OSAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQlGcm9tIE1hcmsgU2FsdGVyIDxtc2FsdGVyQGN5Z251cy5jb20+OgotCSogaW50ZXJwLmMgKEJPQVJEX0JTUCk6IERlZmluZS4gIEFkZCB0byBsaXN0IG9mIHBvc3NpYmxlIGJvYXJkcy4KLQkoc2ltX29wZW4pOiBBZGQgc2V0dXAgZm9yIEJTUCBib2FyZC4KLQotV2VkIEp1bCAgNyAxMjo0NTo1OCAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoTVVMVCwgTVVMVFUpOiBBZGQgc3ludGF4IGZvciB0d28gb3BlcmFuZCB2ZXJzaW9uLgotCShETUZDMCwgRE1UQzApOiBSZWNvZ25pemUuICBDYWxsIERlY29kZUNvcHJvYyB3aGljaCB3aWxsIHJlcG9ydAotIAl0aGVtIGFzIHVuaW1wbGVtZW50ZWQuCi0KLTE5OTktMDUtMDggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCQotMTk5OS0wNC0yMSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChiYzBmKTogRm9yIHRoZSBUWDM5IG9ubHksIGRlY29kZSB0aGlzIGFzIGEgbm8tb3Agc3R1Yi4KLQotVGh1IEFwciAxNSAxNDoxNToxNyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGFteS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFueSBtaXBzNjR2cjUqLSotKiB0YXJnZXQgc2hvdWxkIGhhdmUKLSAJLURUQVJHRVRfRU5BQkxFX0ZSPTEuCi0JKGRlZmF1bHRfZW5kaWFuKTogQW55IG1pcHM2NHZyKmVsLSotKiB0YXJnZXQgc2hvdWxkIGRlZmF1bHQgdG8KLQlMSVRUTEVfRU5ESUFOLgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotMTk5OS0wMi0xOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAobGRsKTogRXh0ZW5kIGZyb20gXzE2Xywgbm90IDMyLgotCi1XZWQgSmFuIDI3IDE4OjUxOjM4IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlcik6IEZvcmNlIHJlZ2lzdGVycyB3cml0dGVuIHRvIGJ5IEdEQgotIAlpbnRvIGFuIHVuLWludGVycHJldGVkIHN0YXRlLgotCi0xOTk5LTAyLTA1ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkdi10eDM5MDRzaW8uYyAodHgzOTA0c2lvX3RpY2tsZSk6IEFmdGVyIGEgcG9sbGVkIEkvTyBmcm9tIHRoZQotIAlDUFUsIHN0YXJ0IHBlcmlvZGljIGJhY2tncm91bmQgSS9PIHBvbGxzLgotCSh0eDM5MDRzaW9fcG9sbCk6IE5ldyBmdW5jdGlvbjogcGVyaW9kaWMgSS9PIHBvbGxlci4gCi0KLTE5OTgtMTItMzAgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoQlJFQUspOiBDYWxsIHNpZ25hbF9leGNlcHRpb24gaW5zdGVhZCBvZiBzaW1fZW5naW5lX2hhbHQuCi0JCi1UdWUgRGVjIDI5IDE2OjAzOjUzIDE5OTggIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAobWlwczY0dnI1Ki0qLSopOiBBZGRlZCBtaXNzaW5nIDs7IGluCi0gCWNhc2Ugc3RhdGVtZW50LgotCi0xOTk4LTEyLTI5ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWxsb2NhdGUgam0zOTA0IG1lbW9yeSBpbiBzbWFsbGVyIGNodW5rcy4gCi0JKGxvYWRfd29yZCk6IENhbGwgU0lNX0NPUkVfU0lHTkFMIGhvb2sgb24gZXJyb3IuCi0JKHNpZ25hbF9leGNlcHRpb24pOiBDYWxsIFNJTV9DUFVfRVhDRVBUSU9OX1RSSUdHRVIgaG9vayBiZWZvcmUKLQlzdGFydGluZy4gIEZvciBleGNlcHRpb24gZGlzcGF0Y2hpbmcsIHBhc3MgUEMgaW5zdGVhZCBvZiBOVUxMX0NJQS4KLQkoZGVjb2RlX2NvcHJvYyk6IFVzZSBDT1AwX0JBRFZBRERSIHRvIHN0b3JlIGZhdWx0aW5nIGFkZHJlc3MuCi0JKiBzaW0tbWFpbi5oIChDT1AwX0JBRFZBRERSKTogRGVmaW5lLiAKLQkoU0lNX0NPUkVfU0lHTkFMKTogRGVmaW5lIGhvb2sgdG8gY2FsbCBtaXBzX2NvcmVfc2lnbmFsLgotCShTSU1fQ1BVX0VYQ0VQVElPTiopOiBEZWZpbmUgaG9va3MgdG8gY2FsbCBtaXBzX2NwdV9leGNlcHRpb24qKCkuCi0JKF9zaW1fY3B1KTogQWRkIGV4Y18qIGZpZWxkcyB0byBzdG9yZSByZWdpc3RlciB2YWx1ZSBzbmFwc2hvdHMuCQotCSogbWlwcy5pZ2VuICgqKTogUmVwbGFjZSBtZW1vcnktcmVsYXRlZCBTaWduYWxFeGNlcHRpb24qIGNhbGxzCi0Jd2l0aCByZWZlcmVuY2VzIHRvIFNJTV9DT1JFX1NJR05BTCBob29rLgotCQotCSogZHYtdHgzOTA0aXJjLmMgKHR4MzkwNGlyY19wb3J0X2V2ZW50KTogcHJpbnRmIGZvcm1hdCB3YXJuaW5nCi0JZml4LgotCSogc2ltLW1haW4uYyAoKik6IE1pbm9yIHdhcm5pbmcgY2xlYW51cHMuCi0JCi0xOTk4LTEyLTI0ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbTE2LmlnZW4gKERBRERJVTUpOiBDb3JyZWN0IHR5cGUtby4KLQotTW9uIERlYyAyMSAxMDozNDo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgotCi0JKiBtaXBzLmlnZW4gKGRvX2RkaXYsIGRvX2RkaXZ1KTogUGFjaWZ5IEdDQy4gVXBkYXRlIGhpL2xvIHZpYSB0bXAKLSAJdmFyaWFibGVzLgotCi1XZWQgRGVjIDE2IDE4OjIwOjI4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0ZMQUdTKTogTm8gbG9uZ2VyIG5lZWQgdG8gYWRkIC4uLi9uZXdsaWIKLSAJdG8gaW5jbHVkZSBwYXRoLgotCShpbnRlcnAubyk6IEFkZCBkZXBlbmRlbmN5IG9uIGl0YWJsZS5oCi0JKG9lbmdpbmUuYywgZ2VuY29kZSk6IERlbGV0ZSByZW1haW5pbmcgcmVmZXJlbmNlcy4KLQkoQlVJTFRfU1JDX0ZST01fR0VOKTogQ2xlYW4gdXAuCi0JCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQkKLQkqIHZyNHJ1bi5jOiBOZXcuCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0hBQ0tfT0JKLEhBQ0tfT0JKUyxIQUNLX0dFTl9TUkNTLGxpYmhhY2suYSwKLQl0bXAtaGFjayx0bXAtbTMyLWhhY2ssdG1wLW0xNi1oYWNrLHRtcC1pdGFibGUtaGFjaywKLQl0bXAtcnVuLWhhY2spIDogTmV3LgotCSogbTE2LmlnZW4gKExELERBRERJVSxEQUREVUk1LERBREpTUCxEQURESVVTUCxEQURESSxEQUREVSxEU1VCVSwKLQlEU0xMLERTUkwsRFNSQSxEU0xMVixEU1JBVixETVVMVCxETVVMVFUsRERJVixERElWVSxKQUxYMzIsSkFMWCk6IAotCURyb3AgdGhlICI2NCIgcXVhbGlmaWVyIHRvIGdldCB0aGUgSEFDSyBnZW5lcmF0b3Igd29ya2luZy4KLQlVc2UgSU1NRURJQVRFIHJhdGhlciB0aGFuIElNTUVELiAgVXNlIFNIQU1UIHJhdGhlciB0aGFuIFNISUZULgotCSogbWlwcy5pZ2VuIChkb19kYWRkaXUsZG9fZGRpdixkb19kaXZ1KTogUmVtb3ZlIHRoZSA2NC1vbmx5Ci0JcXVhbGlmaWVyIHRvIGdldCB0aGUgaGFjayBnZW5lcmF0b3Igd29ya2luZy4KLQkoZG9fZHNsbCxkb19kc2xsdixkb19kc3JhLGRvX2RzcmwsZG9fZHNybHYpOiBOZXcuCi0JKERTTEwpOiBVc2UgZG9fZHNsbC4KLQkoRFNMTFYpOiBVc2UgZG9fZHNsbHYuCi0JKERTUkEpOiBVc2UgZG9fZHNyYS4KLQkoRFNSTCk6IFVzZSBkb19kc3JsLgotCShEU1JMVik6IFVzZSBkb19kc3Jsdi4KLQkoQkMxKTogTW92ZSAqdnI0MTAwIHRvIGdldCB0aGUgSEFDSyBnZW5lcmF0b3Igd29ya2luZy4KLQkoQ3hDMSwgRE14QzEsIE14QzEsTUFDQ1UsTUFDQ0hJLE1BQ0NISVUpOiBSZW5hbWUgdG8gCi0JZ2V0IHRoZSBIQUNLIGdlbmVyYXRvciB3b3JraW5nLgotCShNQUNDKSBSZW5hbWUgdG8gZ2V0IHRoZSBIQUNLIGdlbmVyYXRvciB3b3JraW5nLgotCShETUFDQyxNQUNDUyxETUFDQ1MpOiBBZGQgdGhlIDY0LgotCQotMTk5OC0xMi0xMiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoQkMxKTogUmVuYW1lZCB0byBCQzFhIGFuZCBCQzFiIHRvIGF2b2lkIGNvbmZsaWN0cy4KLQkqIHNpbS1tYWluLmggKFNpemVGR1IpOiBIYW5kbGUgVEFSR0VUX0VOQUJMRV9GUi4KLQkKLTE5OTgtMTItMTEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0gICAgKiBtaXBzL2ludGVycC5jIChERUJVRyk6IENsZWFudXBzLgotCi0xOTk4LTEyLTEwICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkdi10eDM5MDRzaW8uYyAodHgzOTA0c2lvX2lvX3JlYWRfYnVmZmVyKTogRW5kaWFubmVzcyBmaXhlcy4KLQkodHgzOTA0c2lvX3RpY2tsZSk6IGZmbHVzaCBhZnRlciBhIHN0ZG91dCBjaGFyYWN0ZXIgb3V0cHV0LgotCQotMTk5OC0xMi0wMyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9jbG9zZSk6IFVuaW5zdGFsbCBtb2R1bGVzLgotCi1XZWQgTm92IDI1IDEzOjQxOjAzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCwgaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogQ2hhbmdlIHRvIGdsb2JhbAotIAlmdW5jdGlvbi4KLQotV2VkIE5vdiAyNSAxNzozMzoyNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodnI0MTAwKTogT25seSBpbmNsdWRlIHZyNDEwMCBpbnN0cnVjdGlvbnMgaW4KLSAJc2ltdWxhdG9yLgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQkqIG0xNi5pZ2VuICgqKTogVGFnIGFsbCBtaXBzMTYgaW5zdHJ1Y3Rpb25zIGFzIGFsc28gYmVpbmcgdnI0MTAwLgotCi1Nb24gTm92IDIzIDE4OjIwOjM2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9DRkxBR1MpOiBEbyBub3QgZGVmaW5lIFdJVEhfSUdFTi4KLQkqIHNpbS1tYWluLmgsIHNpbS1tYWluLmMsIGludGVycC5jOiBEZWxldGUgI2lmIFdJVEhfSUdFTiBrZWVwaW5nCi0gCXRydWUgYWx0ZXJuYXRpdmUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX2RlZmF1bHRfZ2VuLCBzaW1fdXNlX2dlbik6IFJlcGxhY2Ugd2l0aAotIAlzaW1fZ2VuLgotCSgtLWVuYWJsZS1zaW0taWdlbik6IERlbGV0ZSBjb25maWcgb3B0aW9uLiBBbHdheXMgdXNpbmcgSUdFTi4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi0JKiBNYWtlZmlsZS5pbiAoZ2VuY29kZSk6IEtpbGwsIGtpbGwsIGtpbGwuCi0JKiBnZW5jb2RlLmM6IERpdHRvLgotCQotTW9uIE5vdiAyMyAxODowNzozNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIG1pcHM2NHZyNDEwMC1lbGYgbmVlIG1pcHM2NHZyNDEqIGFzIGEgNjQKLSAJYml0IG1pcHMxNiBpZ2VuIHNpbXVsYXRvci4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLQkqIG1pcHMuaWdlbiAoY2hlY2tfZGl2X2hpbG8sIGNoZWNrX211bHRfaGlsbywgY2hlY2tfbWZfaGlsbyk6IE1hcmsKLSAJYXMgcGFydCBvZiB2cjQxMDAgSVNBLgotCSogdnIuaWdlbjogTWFyayBhbGwgaW5zdHJ1Y3Rpb25zIGFzIDY0IGJpdCBvbmx5LgotCi1Nb24gTm92IDIzIDE3OjA3OjM3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGdldF9jZWxsLCBzaW1fbW9uaXRvciwgZmV0Y2hfc3RyLCBDb1Byb2NQcmVzZW50KToKLSAJUGFjaWZ5IEdDQy4KLQotTW9uIE5vdiAyMyAxMzoyMzo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIG1pcHMtbHNpLWVsZiBuZWUgbWlwcypsc2kqIGFzIGEKLSAJbWlwc0lJSS9taXBzMTYgaWdlbiBzaW11bGF0b3IuICBGaXggc2ltX2dlbiBWUyBzaW1faWdlbiB0eXBvcy4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLQkqIG0xNi5pZ2VuIChCUkVBSyk6IERlZmluZSBicmVha3BvaW50IGluc3RydWN0aW9uLgotCShKQUxYMzIpOiBNYXJrIGluc3RydWN0aW9uIGFzIG1pcHMxNiBhbmQgbm90IHIzOTAwLgotCSogbWlwcy5pZ2VuIChDLmNvbmQuZm10KTogRml4IHR5cG8gaW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LgotCi0JKiBzaW0tbWFpbi5oIChQRU5ESU5HX0ZJTEwpOiBXcmFwIEMgc3RhdGVtZW50cyBpbiBkby93aGlsZS4KLQotU2F0IE5vdiAgNyAwOTo1NDozOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24gLSBCUkVBSyk6IEZvciBNSVBTMTYsIGhhbmRsZSBCUkVBSwotIAlpbnNuIGFzIGEgZGVidWcgYnJlYWtwb2ludC4KLQotCSogc2ltLW1haW4uaCAoUEVORElOR19TTE9UX0JJVCk6IEZpeCwgd2FzIGluY29ycmVjdGx5IGRlZmluZWQgYXMKLSAJcGVuZGluZy5zbG90X3NpemUuCi0JKFBFTkRJTkdfU0NIRUQpOiBDbGVhbiB1cCB0cmFjZSBzdGF0ZW1lbnQuCi0JKFBFTkRJTkdfU0NIRUQpOiBJbmNyZW1lbnQgUEVORElOR19JTiBhbmQgUEVORElOR19UT1RBTC4KLQkoUEVORElOR19GSUxMKTogRGVsYXkgd3JpdGUgYnkgb25seSBvbmUgY3ljbGUuCi0JKFBFTkRJTkdfRklMTCk6IEZvciBGU1JzLCB3cml0ZSBmbXRfdW5pbnRlcnByZXRlZCB0byBGUFJfU1RBVEUuCi0KLQkqIHNpbS1tYWluLmMgKHBlbmRpbmdfdGljayk6IENsZWFuIHVwIHRyYWNlIHN0YXRlbWVudHMuIEFkZCB0cmFjZQotIAlvZiBwZW5kaW5nIHdyaXRlcy4KLQkocGVuZGluZ190aWNrKTogRml4IHNpemVzIGluIHN3aXRjaCBzdGF0ZW1lbnRzLCA0ICYgOCBpbnN0ZWFkIG9mCi0gCTMyICYgNjQuCi0JKHBlbmRpbmdfdGljayk6IE1vdmUgaW5jcmVtZW50aW5nIG9mIGluZGV4IHRvIEZPUiBzdGF0ZW1lbnQuCi0JKHBlbmRpbmdfdGljayk6IE9ubHkgdXBkYXRlIFBFTkRJTkdfT1VUIGFmdGVyIGEgd3JpdGUgaGFzIG9jY3VyZWQuCi0JCi0JKiBjb25maWd1cmUuaW46IEFkZCBleHBsaWNpdCBtaXBzLWxzaS0qIHRhcmdldC4gIFVzZSBnZW5jb2RlIHRvCi0gCWJ1aWxkIHNpbXVsYXRvci4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi0JKiBpbnRlcnAuYyAoc2ltX2VuZ2luZV9ydW4gT0xEKTogRGVsZXRlIGV4cGxpY2l0IGNhbGwgdG8KLSAJUEVORElOR19USUNLLiBOb3cgY2FsbGVkIHZpYSBFTkdJTkVfSVNTVUVfUFJFRklYX0hPT0suCi0JCi1TYXQgT2N0IDMwIDA5OjQ5OjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGR2LXR4MzkwNGNwdS5jIChkZWxpdmVyX3R4MzkwNGNwdV9pbnRlcnJ1cHQpOiBBZGQgZHVtbXkKLQlpbnRlcnJ1cHQgbGV2ZWwgbnVtYmVyIHRvIG1hdGNoIGNoYW5nZWQgU2lnbmFsRXhjZXB0aW9uSW50ZXJydXB0Ci0JbWFjcm8uCi0KLUZyaSBPY3QgIDkgMTg6MDI6MjUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6ICNpbmNsdWRlICJpdGFibGUuaCIgaWYgV0lUSF9JR0VOLgotCShnZXRfaW5zbl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fb3Blbik6IEluaXRpYWxpemUgQ1BVX0lOU05fTkFNRSxDUFVfTUFYX0lOU05TLgotCSogc2ltLW1haW4uaCAoTUFYX0lOU05TLElOU05fTkFNRSk6IERlbGV0ZS4KLQotTW9uIFNlcCAxNCAxMjozNjo0NCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbHQgdG8gaW5oYWxlIG5ldyBjb21tb24vYWNsb2NhbC5tNC4KLQotVHVlIFNlcCAgMSAxNTozOToxOCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkdi10eDM5MDRzaW8uYzogSW5jbHVkZSBzaW0tYXNzZXJ0LmguCi0KLVR1ZSBBdWcgMjUgMTI6NDk6NDYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZHYtdHgzOTA0c2lvLmM6IE5ldyBmaWxlOiB0eDM5MDQgc2VyaWFsIEkvTyBtb2R1bGUuCi0JKiBjb25maWd1cmUuaW46IEFkZCBkdi10eDM5MDRzaW8sIGR2LXNvY2tzZXIgZm9yIHR4MzkgdGFyZ2V0LgotCVJlb3JnYW5pemUgdGFyZ2V0LXNwZWNpZmljIHNpbS1oYXJkd2FyZSBjaGVja3MuCi0JKiBjb25maWd1cmU6IHJlYnVpbHQuCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBGb3IgdHgzOSB0YXJnZXQgYm9hcmRzLCBzZXQKLQlPUEVSQVRJTkdfRU5WSVJPTk1FTlQsIGFkZCB0eDM5MDRzaW8gZGV2aWNlcy4KLQkqIHRjb25maWcuaW46IEZvciB0eDM5IHRhcmdldCwgc2V0IFNJTV9IQU5ETEVTX0xNQSBmb3IgbG9hZGluZwotCVJPTSBleGVjdXRhYmxlcy4gIEluc3RhbGwgZHYtc29ja3NlciBpbnRvIHNpbS1tb2R1bGVzIGxpc3QuCi0JCi0JKiBkdi10eDM5MDRpcmMuYzogQ29tcGlsZXIgd2FybmluZyBjbGVhbi11cC4KLQkqIGR2LXR4MzkwNHRtci5jOiBDb21waWxlciB3YXJuaW5nIGNsZWFuLXVwLiAgUmVtb3ZlIHBhcnRpY3VsYXJseQotCWZyZXF1ZW50IGh3LXRyYWNlIG1lc3NhZ2VzLgotCi1GcmkgSnVsIDMxIDE4OjE0OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdnIuaWdlbiAoTXVsQWNjKTogSWRlbnRpZnkgYXMgYSB2cjQxMDAgc3BlY2lmaWMgZnVuY3Rpb24uCi0KLVNhdCBKdWwgMjUgMTY6MDM6MTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSUdFTl9JTkNMVURFKTogQWRkIHZyLmlnZW4uCi0KLQkqIHZyLmlnZW46IE5ldyBmaWxlLgotCShNQUMvTUFERDE2LCBETUFDL0RNQUREMTYpOiBJbXBsZW1lbnQgdXNpbmcgY29kZSBmcm9tIGdlbmNvZGUuYy4KLQkqIG1pcHMuaWdlbjogRGVmaW5lIHZyNDEwMCBtb2RlbC4gSW5jbHVkZSB2ci5pZ2VuLgotTW9uIEp1biAyOSAwOToyMTowNyAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChjaGVja19tZl9oaWxvKTogQ29ycmVjdCBjaGVjay4KLQotV2VkIEp1biAxNyAxMjoyMDo0OSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKGludGVycnVwdF9ldmVudCk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGR2LXR4MzkwNHRtci5jICh0eDM5MDR0bXJfaW9fd3JpdGVfYnVmZmVyKTogRGVsZXRlIHVudXNlZAotIAlyZWdpc3Rlcl9wdHIsIHJlZ2lzdGVyX3ZhbHVlLgotCShkZWxpdmVyX3R4MzkwNHRtcl90aWNrKTogRml4IHR5cGVzIHBhc3NlZCB0byBwcmludGYgZm10LgotCi0JKiBzaW0tbWFpbi5oICh0cmFjZWZoKTogTWFrZSBleHRlcm4uCi0KLVR1ZSBKdW4gMTYgMTQ6Mzk6MDAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZHYtdHgzOTA0dG1yLmM6IERlc2NoZWR1bGUgdGltZXIgZXZlbnQgYWZ0ZXIgZGlzcGF0Y2hpbmcuCi0JUmVkdWNlIHVubmVjZXNzYXJpbHkgaGlnaCB0aW1lciBldmVudCBmcmVxdWVuY3kuICAKLQkqIGR2LXR4MzkwNGNwdS5jOiBEaXR0byBmb3IgaW50ZXJydXB0IGV2ZW50LgotCQotV2VkIEp1biAxMCAxMzoyMjozMiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoZGVjb2RlX2NvcHJvYyk6IEZvciBUWDM5LCBhZGQgc3R1YiBDT1AwIHJlZ2lzdGVyICM3LAotIAl0byBhbGxheSB3YXJuaW5ncy4KLQkoaW50ZXJydXB0X2V2ZW50KTogTWFkZSBub24tc3RhdGljLgotCQotCSogZHYtdHgzOTA0dG1yLmMgKGRlbGl2ZXJfdHgzOTA0dG1yX3RpY2spOiBDb3JyZWN0IGFjY2lkZW50YWwKLSAJaW50ZXJjaGFuZ2Ugb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIGV4dGVybmFsIHZzLiBpbnRlcm5hbAotIAljbG9jayBkaXZpZGVycy4KLQkKLVR1ZSBKdW4gIDkgMTI6NDY6MjQgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoQlJFQUspOiBNb3ZlZCBjb2RlIHRvIGhlcmUgZm9yIAotCXNpbXVsYXRvci1yZXNlcnZlZCBicmVhayBpbnN0cnVjdGlvbnMuCi0JKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogRGl0dG8uCi0JKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbik6IENvZGUgbW92ZWQgZnJvbSBoZXJlLiAgTm9uLQotCXJlc2VydmVkIGluc3RydWN0aW9ucyBub3cgdXNlIGV4Y2VwdGlvbiB2ZWN0b3IsIHJhdGhlciAKLQl0aGFuIGhhbHRpbmcgc2ltLgotCSogc2ltLW1haW4uaDogTW92ZWQgbWFnaWMgY29uc3RhbnRzIHRvIGhlcmUuCi0KLVR1ZSBKdW4gIDkgMTI6Mjk6NTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZHYtdHgzOTA0Y3B1LmMgKGRlbGl2ZXJfKl9pbnRlcnJ1cHQsKl9wb3J0X2V2ZW50KTogU2V0IHRoZSBDQVVTRQotIAlyZWdpc3RlciB1cG9uIG5vbi16ZXJvIGludGVycnVwdCBldmVudCBsZXZlbCwgY2xlYXIgdXBvbiB6ZXJvCi0gCWV2ZW50IHZhbHVlLgotCSogZHYtdHgzOTA0aXJjLmMgKCpfcG9ydF9ldmVudCk6IEhhbmRsZSBkZWFjdGl2YXRlZCBpbnRlcnJ1cHQgc2lnbmFsCi0JYnkgcGFzc2luZyB6ZXJvIGV2ZW50IHZhbHVlLgotCSgqX2lvX3tyZWFkLHdyaXRlfV9idWZmZXIpOiBFbmRpYW5uZXNzIGZpeGVzLgotCSogZHYtdHgzOTA0dG1yLmMgKCpfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcik6IEVuZGlhbm5lc3MgZml4ZXMuCi0JKGRlbGl2ZXJfKl90aWNrKTogUmVkdWNlIHNpbSBldmVudCBpbnRlcnZhbCB0byA3NSUgb2YgY291bnQgaW50ZXJ2YWwuCi0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZGVkIGptcjM5MDRwYWwgYm9hcmQgdHlwZSB0aGF0IGFkZHMgUEFMLWJhc2VkCi0Jc2VyaWFsIEkvTyBhbmQgdGltZXIgbW9kdWxlIGF0IGJhc2UgYWRkcmVzcyAweEZGRkYwMDAwLgotCQotVHVlIEp1biAgOSAxMTo1MjoyOSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChTV0MxKSA6IENvcnJlY3QgdGhlIGhhbmRsaW5nIG9mIFJldmVyc2VFbmRpYW4gCi0JYW5kIEJpZ0VuZGlhbkNQVS4KLQotVHVlIEp1biAgOSAxMTo0MDo1NyAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzX2ZwdV9iaXRzaXplKSA6IFNldCB0aGlzIGNvcnJlY3RseSBmb3IgMzItYml0IG1pcHMKLQlwYXJ0cy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCi1UaHUgSnVuICA0IDE1OjM3OjMzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGR2LXR4MzkwNHRtci5jOiBOZXcgZmlsZSAtIGltcGxlbWVudHMgdHgzOTA0IHRpbWVyLgotCSogZHYtdHgzOTA0e2lyYyxjcHV9LmM6IE1pbGQgcmVmb3JtYXR0aW5nLgotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIHR4MzkwNHRtciBpbiBod19kZXZpY2UgbGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEluc3RhbnRpYXRlIHRocmVlIHRpbWVyIGluc3RhbmNlcy4KLQlGaXggYWRkcmVzcyB0eXBvIG9mIHR4MzkwNGlyYyBpbnN0YW5jZS4KLQotVHVlIEp1biAgMiAxNTo0ODowMiAxOTk4ICBJYW4gQ2FybWljaGFlbCAgPGlhbmNhcm1AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpZ25hbF9leGNlcHRpb24pOiBTeXN0ZW1DYWxsIGV4Y2VwdGlvbiBub3cgdXNlcwotCXRoZSBleGNlcHRpb24gdmVjdG9yLgotCi1Nb24gSnVuICAxIDE4OjE4OjI2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogRm9yIFRYMzksIGFkZCBzdHViIENPUDAgcmVnaXN0ZXIgIzMsCi0JdG8gYWxsYXkgd2FybmluZ3MuCi0KLUZyaSBNYXkgMjkgMTE6NDA6MzkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNpbV9pZ2VuX2ZpbHRlcik6IE1hdGNoIG1pcHMqdHgzOSBub3QgbWlwc3QqdHgzOS4KLQotTW9uIE1heSAyNSAyMDo0Nzo0NSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LXR4MzkwNGNwdS5jLCBkdi10eDM5MDRpcmMuYzogUmVuYW1lICpfY2FsbGJhY2sgdG8gKl9tZXRob2QuCi0KLQkqIGR2LXR4MzkwNGNwdS5jLCBkdi10eDM5MDRpcmMuYzogSW5jbHVkZSBody1tYWluLmggYW5kCi0gCXNpbS1tYWluLmguIERlY2xhcmUgYSBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBpbnN0ZWFkIG9mIHN0cnVjdAotIAlod19kZXZpY2VfZGVzY3JpcHRvci4KLQotTW9uIE1heSAyNSAxMjo0MTozOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoZG9fc3RvcmVfbGVmdCwgZG9fbG9hZF9sZWZ0KTogQ29tcHV0ZSBuciBvZiBsZWZ0IGFuZAotIAlyaWdodCBiaXRzIGFuZCB0aGVuIHJlLWFsaWduIGxlZnQgaGFuZCBieXRlcyB0byBjb3JyZWN0IGJ5dGUKLSAJbGFuZXMuICBGaXggaW5jb3JyZWN0IGNvbXB1dGF0aW9uIGluIGRvX3N0b3JlX2xlZnQgd2hlbiBsb2FkaW5nCi0gCWJ5dGVzIGZyb20gc2Vjb25kIHdvcmQuCi0KLUZyaSBNYXkgMjIgMTM6MzQ6MjAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fSEFSRFdBUkUpOiBPbmx5IGVuYWJsZSB3aGVuIHR4MzkwNC4KLQkqIGludGVycC5jIChzaW1fb3Blbik6IE9ubHkgY3JlYXRlIGEgZGV2aWNlIHRyZWUgd2hlbiBIVyBpcwotIAllbmFibGVkLgotCi0JKiBkdi10eDM5MDRpcmMuYyAodHgzOTA0aXJjX2ZpbmlzaCk6IFBhY2lmeSBHQ0MuCi0JKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbik6IERpdHRvLgotCi1UaHUgTWF5IDIxIDE0OjI0OjExIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmM6IE1hcmsgQkVHRVpBTEwgYXMgTElLRUxZLgotCi1UaHUgTWF5IDIxIDE4OjU3OjE5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoQUxVMzJfRU5EKTogU2lnbiBleHRlbmQgMzIgYml0IHJlc3VsdHMuCi0JKiBtaXBzLmlnZW4gKEFERCwgU1VCLCBBRERJLCBEQURELCBEU1VCKTogVHJhY2UuCi0JCi1Nb24gTWF5IDE4IDE4OjIyOjQyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9IQVJEV0FSRSk6IEFkZGVkIGNvbW1vbiBoYXJkd2FyZQotIAltb2R1bGVzLiAgUmVjb2duaXplIFRYMzkgdGFyZ2V0IHdpdGggIm1pcHMqdHgzOSIgcGF0dGVybi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIHNpbS1tYWluLmggKCopOiBBZGRlZCBtYW55IG1hY3JvcyBkZWZpbmluZyBiaXRzIGluCi0gCVRYMzkgY29udHJvbCByZWdpc3RlcnMuCi0JKFNpZ25hbEludGVycnVwdCk6IFNlbmQgYWN0dWFsIFBDIGluc3RlYWQgb2YgTlVMTC4KLQkoU2lnbmFsTk1JUmVzZXQpOiBOZXcgZXhjZXB0aW9uIHR5cGUuCi0JKiBpbnRlcnAuYyAoYm9hcmQpOiBOZXcgdmFyaWFibGUgZm9yIGZ1dHVyZSB1c2UgdG8gaWRlbnRpZnkKLQlhIHBhcnRpY3VsYXIgYm9hcmQgYmVpbmcgc2ltdWxhdGVkLgotCShtaXBzX29wdGlvbl9oYW5kbGVyLG1pcHNfb3B0aW9ucyk6IEFkZGVkICItLWJvYXJkIiBvcHRpb24uCi0JKGludGVycnVwdF9ldmVudCk6IFNlbmQgYWN0dWFsIFBDLgotCShzaW1fb3Blbik6IE1ha2UgbWVtb3J5IGxheW91dCBjb25kaXRpb25hbCBvbiBib2FyZCBzZXR0aW5nLgotCShzaWduYWxfZXhjZXB0aW9uKTogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBoYXJkd2FyZSBpbnRlcnJ1cHQKLSAJaGFuZGxpbmcuICBBY2NlcHQgYW5vdGhlciBicmVhayBpbnN0cnVjdGlvbiB2YXJpYW50IGZvciBzaW11bGF0b3IKLSAJZXhpdC4KLQkoZGVjb2RlX2NvcHJvYyk6IEltcGxlbWVudCBSRkUgaW5zdHJ1Y3Rpb24gZm9yIFRYMzkuCi0JKG1pcHMuaWdlbik6IERlY29kZSBSRkUgaW5zdHJ1Y3Rpb24gYXMgc3VjaC4KLQkqIGNvbmZpZ3VyZS5pbiAodHgzOTA0Y3B1LHR4MzkwNGlyYyk6IEFkZGVkIGRldmljZXMgZm9yIHR4MzkwNC4KLQkqIGludGVycC5jOiBEZWZpbmUgImptcjM5MDQiIGFuZCAiam1yMzkwNGRlYnVnIiBib2FyZCB0eXBlcyBhbmQKLQliYmVnaW4gdG8gaW1wbGVtZW50IG1lbW9yeSBtYXAuCi0JKiBkdi10eDM5MDRjcHUuYzogTmV3IGZpbGUuCi0JKiBkdi10eDM5MDRpcmMuYzogTmV3IGZpbGUuCi0KLVdlZCBNYXkgMTMgMTQ6NDA6MTEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoY2hlY2tfbXRfaGlsbyk6IENyZWF0ZSBhIHNlcGFyYXRlIHIzOTAwIHZlcnNpb24uCi0KLVdlZCBNYXkgMTMgMTQ6MTE6NDYgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIHR4LmlnZW4gKG1hZGQsbWFkZHUpOiAgUmVwbGFjZSBjYWxscyB0byBjaGVja19vcF9oaWxvCi0Jd2l0aCBjYWxscyB0byBjaGVja19kaXZfaGlsby4KLQotV2VkIE1heSAxMyAwOTo1OToyNyAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy9taXBzLmlnZW4gKGNoZWNrX29wX2hpbG8sY2hlY2tfbXVsdF9oaWxvLGNoZWNrX2Rpdl9oaWxvKToKLQlSZXBsYWNlIGNoZWNrX29wX2hpbG8gd2l0aCBjaGVja19tdWx0X2hpbG8gYW5kIGNoZWNrX2Rpdl9oaWxvLgotCUFkZCBzcGVjaWFsIHIzOTAwIHZlcnNpb24gb2YgZG9fbXVsdF9oaWxvLiAgCi0JKGRvX2RtdWx0eCxkb19tdWx0LGRvX211bHR1KTogUmVwbGFjZSBjYWxscyB0byBjaGVja19vcF9oaWxvCi0Jd2l0aCBjYWxscyB0byBjaGVja19tdWx0X2hpbG8uCi0JKGRvX2RkaXYsZG9fZGRpdnUsZG9fZGl2LGRvX2RpdnUpOiBSZXBsYWNlIGNhbGxzIHRvIGNoZWNrX29wX2hpbG8KLQl3aXRoIGNhbGxzIHRvIGNoZWNrX2Rpdl9oaWxvLgotCi1UdWUgTWF5IDEyIDE1OjIyOjExIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChTVUJUQVJHRVRfUjM5MDApOiBEZWZpbmUgZm9yIG1pcHN0eDM5IHRhcmdldC4KLSAgCURvY3VtZW50IGEgcmVwbGFjZW1lbnQuCi0KLUZyaSBNYXkgIDggMTc6NDg6MTkgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fbW9uaXRvcik6IE1ha2UgbW9uX3ByaW50ZiB3b3JrLgotCi1XZWQgTWF5ICA2IDE5OjQyOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKElOU05fTkFNRSk6IE5ldyBhcmcgYGNwdScuCi0KLVR1ZSBBcHIgMjggMTg6MzM6MzEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU3VuIEFwciAyNiAxNTozMTo1NSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotU3VuIEFwciAyNiAxNToyMDowMSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSZXZlcnRlZCBjaGFuZ2Ugb2YgQXByIDI0OyB1c2Ugc2luY2x1ZGUgYWdhaW4uCi0KLUZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLUZyaSBBcHIgMjQgMTE6MTk6MjAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNhbGwgc2luY2x1ZGUuCi0KLUZyaSBBcHIgMjQgMTE6MzU6MDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vay5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW4gKGRvX3N0b3JlX2xlZnQpOiBQYXNzIDAgbm90IE5VTEwgdG8gc3RvcmVfbWVtb3J5LgotCi1UdWUgQXByIDIxIDExOjU5OjUwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChFUkVUKTogSW1wbGVtZW50LgotCi0JKiBpbnRlcnAuYyAoZGVjb2RlX2NvcHJvYyk6IFJldHVybiBzaWduLWV4dGVuZGVkIEVQQy4KLQotCSogbWlwcy5pZ2VuIChBTkRJLCBMVUksIE1GQzApOiBBZGQgdHJhY2luZyBjb2RlLgotCi0JKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbik6IERvIG5vdCBpZ25vcmUgVHJhcC4KLQkoc2lnbmFsX2V4Y2VwdGlvbik6IE9uIFRSQVAsIHJlc3RhcnQgYXQgZXhjZXB0aW9uIGFkZHJlc3MuCi0JKEhBTFRfSU5TVFJVQ1RJT04sIEhBTFRfSU5TVFJVQ1RJT05fTUFTSyk6IERlZmluZS4KLQkoc2lnbmFsX2V4Y2VwdGlvbik6IFVwZGF0ZS4KLQkoc2ltX29wZW4pOiBQYXRjaCBWX0NPTU1PTiBpbnRlcnJ1cHQgdmVjdG9yIHdpdGggYW4gYWJvcnQgc2VxdWVuY2UKLSAJc28gdGhhdCBUUkFQIGluc3RydWN0aW9ucyBhcmUgY2F1Z2h0LgotCi1Nb24gQXByIDIwIDExOjI2OjU1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoc3RydWN0IGhpbG9fYWNjZXNzLCBzdHJ1Y3QgaGlsb19oaXN0b3J5KTogRGVmaW5lLAotIAljb250YWlucyBISS9MTyBhY2Nlc3MgaGlzdG9yeS4KLQkoc3RydWN0IF9zaW1fY3B1KTogTWFrZSBoaWFjY2VzcyBhbmQgbG9hY2Nlc3Mgb2YgdHlwZSBoaWxvX2FjY2Vzcy4KLQkoSElBQ0NFU1MsIExPQUNDRVNTKTogRGVsZXRlLCByZXBsYWNlIHdpdGgKLQkoSElISVNUT1JZLCBMT0hJU1RPUlkpOiBOZXcgbWFjcm9zLgotCShDSEVDS0hJTE8pOiBEZWxldGUgYWxsLCBtb3ZlZCB0byBtaXBzLmlnZW4KLQkKLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBEbyBub3QgZ2VuZXJhdGUgY2hlY2tzIGZvcgotIAljb3JyZWN0IEhJL0xPIHJlZ2lzdGVyIHVzYWdlLgotCi0JKiBpbnRlcnAuYyAob2xkX2VuZ2luZV9ydW4pOiBEZWxldGUgY2hlY2tzIGZvciBjb3JyZWN0IEhJL0xPCi0gCXJlZ2lzdGVyIHVzYWdlLgotCi0JKiBtaXBzLmlnZW4gKGNoZWNrX210X2hpbG8sIGNoZWNrX21mX2hpbG8sIGNoZWNrX29wX2hpbG8sCi0gCWNoZWNrX21mX2N5Y2xlcyk6IE5ldyBmdW5jdGlvbnMuCi0JKGRvX21maGksIGRvX21mbG8sICJtdGhpIiwgIm10bG8iLCBkb19kZGl2LCBkb19kZGl2dSwgZG9fZGl2LAotIAlkb19kaXZ1LCBkb211bHR4LCBkb19tdWx0LCBkb19tdWx0dSk6IFVzZS4KLQotCSogdHguaWdlbiAoIm1hZGQiLCAibWFkZHUiKTogVXNlLgotCQotV2VkIEFwciAxNSAxODozMTo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoRFNSQVYpOiBVc2UgZnVuY3Rpb24gZG9fZHNyYXYuCi0JKFNSQVYpOiBVc2UgbmV3IGZ1bmN0aW9uIGRvX3NyYXYuCi0KLQkqIG0xNi5pZ2VuIChCRVFaLCBCTkVaKTogQ29tcGFyZSBHUFJbVFJYXSBub3QgR1BSW1JYXS4KLQkoQik6IFNpZ24gZXh0ZW5kIDExIGJpdCBpbW1lZGlhdGUuCi0JKEVYVC1CKik6IFNoaWZ0IDE2IGJpdCBpbW1lZGlhdGUgbGVmdCBieSAxLgotCShBRERJVSopOiBEb24ndCBzaWduIGV4dGVuZCBpbW1lZGlhdGUgdmFsdWUuCi0KLVdlZCBBcHIgMTUgMTA6MzI6MTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtMTZydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBSZXN0b3JlIENJQSBhZnRlciBoYW5kbGluZyBhbiBldmVudC4KLQotCSogc2ltLW1haW4uaCAoREVMQVlfU0xPVCwgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OKTogRm9yIElHRU4sIHVzZQotIAlmdW5jdGlvbnMuCi0KLQkqIG1pcHMuaWdlbiAoZGVsYXlzbG90MzIsIG51bGxpZnlfbmV4dF9pbnNuKTogTmV3IGZ1bmN0aW9ucy4KLQkobTE2LmlnZW4pOiBBbHdheXMgaW5jbHVkZS4KLQkoZG9fKik6IEFkZCBtb3JlIHRyYWNpbmcuCi0KLQkqIG0xNi5pZ2VuIChkZWxheXNsb3QxNik6IEFkZCBOSUEgYXJndW1lbnQsIGNvdWxkIGJlIGNhbGxlZCBieSBhCi0gCTMyIGJpdCBNSVBTMTYgaW5zdHJ1Y3Rpb24uCi0JCi0JKiBpbnRlcnAuYyAoaWZldGNoMTYpOiBNb3ZlIGZ1bmN0aW9uIGZyb20gaGVyZS4KLQkqIHNpbS1tYWluLmMgKGlmZXRjaDE2KTogVG8gaGVyZS4KLQkKLQkqIHNpbS1tYWluLmMgKGlmZXRjaDE2LCBpZmV0Y2gzMik6IFVwZGF0ZSB0byBtYXRjaCBjdXJyZW50Ci0gCWltcGxlbWVudGF0aW9ucyBvZiBMSCwgTFcuCi0JKHNpZ25hbF9leGNlcHRpb24pOiBEb24ndCBwcmludCBvdXQgaW5jb3JyZWN0IGhleCB2YWx1ZSBvZiBpbGxlZ2FsCi0gCWluc3RydWN0aW9uLgotCi1XZWQgQXByIDE1IDAwOjE3OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbTE2cnVuLmMgKHNpbV9lbmdpbmVfcnVuKTogVXNlIElNRU0xNiBhbmQgSU1FTTMyIHRvIGZldGNoIGFuCi0gCWluc3RydWN0aW9uLgotCi0JKiBtMTYuaWdlbjogSW1wbGVtZW50IE1JUFMxNiBpbnN0cnVjdGlvbnMuCi0JCi0JKiBtaXBzLmlnZW4gKGRvX2FkZGl1LCBkb19hZGR1LCBkb19hbmQsIGRvX2RhZGRpdSwgZG9fZGFkZHUsCi0gCWRvX2RkaXYsIGRvX2RkaXZ1LCBkb19kaXYsIGRvX2RpdnUsIGRvX2RtdWx0eCwgZG9fZG11bHR1LCBkb19zcmF2LAotIAlkb19kc3VidSwgZG9fbWZoaSwgZG9fbWZsbywgZG9fbXVsdCwgZG9fbXVsdHUsIGRvX25vciwgZG9fb3IsCi0gCWRvX3NsbCwgZG9fc2xsdiwgZG9fc2x0LCBkb19zbHRpLCBkb19zbHRpdSwgZG9fc2x0dSwgZG9fc3JhLAotIAlkb19zcmwsIGRvX3NybHYsIGRvX3N1YnUsIGRvX3hvciwgZG9feG9yaSk6IE5ldyBmdW5jdGlvbnMuICBNb3ZlCi0gCWJvZGllcyBvZiBjb3JyZXNwb25kaW5nIGNvZGUgZnJvbSAzMiBiaXQgaW5zbiB0byB0aGVzZS4gIEFsc28gdXNlZAotIAlieSBNSVBTMTYgdmVyc2lvbnMgb2YgZnVuY3Rpb25zLgotCQotCSogc2ltLW1haW4uaCAoUkFJRFgsIFQ4SURYLCBUOCwgU1BJRFgpOiBEZWZpbmUuCi0JKElNRU0xNik6IERyb3AgTlIgYXJndW1lbnQgZnJvbSBtYWNyby4KLQotU2F0IEFwciAgNCAyMjozOTo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbWFpbi5vLgotCi0JKiBzaW0tbWFpbi5oIChhZGRyZXNzX3RyYW5zbGF0aW9uLCBsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5LAotIAljYWNoZV9vcCwgc3luY19vcGVyYXRpb24sIHByZWZldGNoLCBpZmV0Y2gzMiwgcGVuZGluZ190aWNrKTogTWFyawotIAlhcyBJTkxJTkVfU0lNX01BSU4uCi0JKHByX2FkZHIsIHByX3V3b3JkNjQpOiBEZWNsYXJlLgotCShzaW0tbWFpbi5jKTogSW5jbHVkZSB3aGVuIEhfUkVWRUFMU19NT0RVTEVfUC4KLQkKLQkqIGludGVycC5jIChhZGRyZXNzX3RyYW5zbGF0aW9uLCBsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5LAotIAljYWNoZV9vcCwgc3luY19vcGVyYXRpb24sIHByZWZldGNoLCBpZmV0Y2gzMiwgcGVuZGluZ190aWNrKTogTW92ZQotIAlmcm9tIGhlcmUuCi0JKiBzaW0tbWFpbi5jOiBUbyBoZXJlLiBGaXggY29tcGlsYXRpb24gcHJvYmxlbXMuCi0JCi0JKiBjb25maWd1cmUuaW46IEVuYWJsZSBpbmxpbmluZy4KLQkqIGNvbmZpZ3VyZTogUmUtY29uZmlnLgotCi1TYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgQXByICAzIDA0OjMyOjM1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuOiBJbmNsdWRlIHR4LmlnZW4uCi0JKiBNYWtlZmlsZS5pbiAoSUdFTl9JTkNMVURFKTogQWRkIHR4LmlnZW4uCi0JKiB0eC5pZ2VuOiBOZXcgZmlsZSwgY29udGFpbnMgTUFERCBhbmQgTUFERFUuCi0KLQkqIGludGVycC5jIChsb2FkX21lbW9yeSk6IFdoZW4gc2hpZnRpbmcgYnl0ZXMsIHVzZSBMT0FERFJNQVNLIG5vdAotIAl0aGUgaGFyZHdpcmVkIGNvbnN0YW50IGA3Jy4KLQkoc3RvcmVfbWVtb3J5KTogRGl0dG8uCi0JKExPQUREUk1BU0spOiBNb3ZlIGRlZmluaXRpb24gdG8gc2ltLW1haW4uaC4KLQotCW1pcHMuaWdlbiAoTVRDMCk6IEVuYWJsZSBmb3IgcjM5MDAuCi0JKEFERFUpOiBBZGQgdHJhY2UuCi0KLQltaXBzLmlnZW4gKGRvX2xvYWRfYnl0ZSk6IERlbGV0ZS4KLQkoZG9fbG9hZCwgZG9fc3RvcmUsIGRvX2xvYWRfbGVmdCwgZG9fbG9hZF93cml0ZSwgZG9fc3RvcmVfbGVmdCwKLSAJZG9fc3RvcmVfcmlnaHQpOiBOZXcgZnVuY3Rpb25zLgotCShTVyosIExXKiwgU0QqLCBMRCosIFNILCBMSCwgU0IsIExCKTogVXNlLgotCi0JY29uZmlndXJlLmluOiBMZXQgdGhlIHR4MzkgdXNlIGlnZW4gYWdhaW4uCi0JY29uZmlndXJlOiBVcGRhdGUuCi0JCi1UaHUgQXByICAyIDEwOjU5OjM5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogZ2V0X21lbV9pbmZvIHJldHVybnMgYSA0IGJ5dGUgcXVhbnRpdHksCi0gCW5vdCBhbiBhZGRyZXNzIHNpemVkIHF1YW50aXR5LiAgUmV0dXJuIHplcm8gZm9yIGNhY2hlIHNpemVzLgotCi1XZWQgQXByICAxIDIzOjQ3OjUzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChyMzkwMCk6IHIzOTAwIGRvZXMgbm90IHN1cHBvcnQgNjQgYml0IGludGVnZXIKLSAJb3BlcmF0aW9ucy4KLQotTW9uIE1hciAzMCAxNDo0NjowNSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzdHgzOSotKi0qKTogVXNlIGdlbmNvZGUgc2ltdWxhdG9yIHJhdGhlcgotCXRoYW4gaWdlbiBvbmUuCi0JKiBjb25maWd1cmUgOiBSZWJ1aWxkLgotCQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIE1hciAyNyAxNTowMTo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChtaXBzX29wdGlvbl9oYW5kbGVyKTogSXRlcmF0ZSBvdmVyIE1BWF9OUl9QUk9DRVNTT1JTLgotCi1XZWQgTWFyIDI1IDE2OjQ0OjI3IDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMjUgMTI6MzU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMjUgMTA6MDU6NDYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoTWF4LCBNaW4pOiBDb21tZW50IG91dCBmdW5jdGlvbnMuIE5vdCB5ZXQgdXNlZC4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIE1hciAxNyAxOTowNToyMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUlQU19FWFRSQV9MSUJTLCBTSU1fRVhUUkFfTElCUyk6IEFkZGVkCi0gCWNvbmZpZ3VyYWJsZSBzZXR0aW5ncyBmb3Igc3RhbmQtYWxvbmUgc2ltdWxhdG9yLgotCQotCSogY29uZmlndXJlLmluOiBBZGRlZCBYMTEgc2VhcmNoLCBqdXN0IGluIGNhc2UuCi0JCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1XZWQgTWFyIDExIDE0OjA5OjEwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV93cml0ZSwgc2ltX3JlYWQsIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnkpOgotIAlSZXBsYWNlIHNpbV9jb3JlXypfbWFwIHdpdGggcmVhZF9tYXAsIHdyaXRlX21hcCwgZXhlY19tYXAgcmVzcC4KLQotVHVlIE1hciAgMyAxMzo1ODo0MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKEdFVEZDQyk6IFJldHVybiBhbiB1bnNpZ25lZCB2YWx1ZS4KLQotVHVlIE1hciAgMyAxMzoyMTozNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaWdlbiAoRElWKTogRml4IGNoZWNrIGZvciAtMSAvIE1JTl9JTlQuCi0JKERBREQpOiBSZXN1bHQgZGVzdGluYXRpb24gaXMgUkQgbm90IFJULgotCi1GcmkgRmViIDI3IDEzOjQ5OjQ5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoSElBQ0NFU1MsIExPQUNDRVNTKTogQWx3YXlzIGRlZmluZS4KLQotCSogbWRteC5pZ2VuIChNYXhpLCBNaW5pKTogUmVuYW1lIE1heCwgTWluLgotCi0JKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBEZWxldGUuCi0KLUZyaSBGZWIgMjcgMTg6NDE6MDEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIpOiBVc2UgaXQuCi0JKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBOZXcgYXJndW1lbnQgYGNwdScuCi0JKHNpbV9vcGVuKTogVXBkYXRlIGNhbGwgdG8gc2ltX2FkZF9vcHRpb25fdGFibGUuCi0KLVdlZCBGZWIgMjUgMTg6NTY6MjIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW4gKEN4QzEpOiBBZGQgdHJhY2luZy4KLQotRnJpIEZlYiAyMCAxNzo0MzoyMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKE1heCwgTWluKTogRGVjbGFyZS4KLQotCSogaW50ZXJwLmMgKE1heCwgTWluKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogbWlwcy5pZ2VuIChCQzEpOiBBZGQgdHJhY2luZy4KLQkKLVRodSBGZWIgMTkgMTQ6NTA6MDAgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQkKLQkqIGludGVycC5jIEFkZGVkIG1lbW9yeSBtYXAgZm9yIHN0YWNrIGluIHZyNDEwMAotCQotVGh1IEZlYiAxOSAxMDoyMToyMSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGxvYWRfbWVtb3J5KTogQWRkIG1pc3NpbmcgImJyZWFrIidzLgotCi1UdWUgRmViIDE3IDEyOjQ1OjM1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgotIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgotCi1UdWUgRmViIDEwIDExOjU3OjQwIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogQWRkZWQgaGFyZHdhcmUgaW5pdCBob29rLCBmaXhlZCB3YXJuaW5ncy4KLQotU2F0IEZlYiAgNyAxNzoxNjoyMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpdGFibGUuaCBpdGFibGUuYyk6IERlcGVuZCBvbiBTSU1fQHNpbV9nZW5AX0FMTC4KLQotVHVlIEZlYiAgMyAxMTozNjowMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChpZmV0Y2gxNik6IE5ldyBmdW5jdGlvbi4KLQotCSogc2ltLW1haW4uaCAoSU1FTTMyKTogUmVuYW1lIElNRU0uCi0JKElNRU0xNl9JTU1FRCk6IERlZmluZS4KLQkoSU1FTTE2KTogRGVmaW5lLgotCShERUxBWV9TTE9UKTogVXBkYXRlLgotCQotCSogbTE2cnVuLmMgKHNpbV9lbmdpbmVfcnVuKTogTmV3IGZpbGUuCi0JCi0JKiBtMTYuaWdlbjogQWxsIGluc3RydWN0aW9ucyBleGNlcHQgTEIuCi0JKExCKTogQ2FsbCBkb19sb2FkX2J5dGUuCi0JKiBtaXBzLmlnZW4gKGRvX2xvYWRfYnl0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoTEIpOiBDYWxsIGRvX2xvYWRfYnl0ZS4KLQotCSogbWlwcy5pZ2VuOiBNb3ZlIHNwZWMgZm9yIGluc24gYml0IHNpemUgYW5kIGhpZ2ggYml0IGZyb20gaGVyZS4KLQkqIE1ha2VmaWxlLmluICh0bXAtaWdlbiwgdG1wLW0xNik6IFRvIGhlcmUuCi0KLQkqIG0xNi5kYzogTmV3IGZpbGUsIGRlY29kZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zLgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX05PX0FMTCk6IERlZmluZS4KLQkodG1wLW0xNik6IEdlbmVyYXRlIGJvdGggMTYgYml0IGFuZCAzMiBiaXQgc2ltdWxhdG9yIGVuZ2luZXMuCi0KLVR1ZSBGZWIgIDMgMTE6Mjg6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHNfZnB1X2JpdHNpemUpOiBGb3IgdHgzOSwgcmVzdHJpY3QgZmxvYXRpbmcKLSAJcG9pbnQgdW5pdCB0byAzMiBiaXQgcmVnaXN0ZXJzLgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotU3VuIEZlYiAgMSAxNTo0NzoxNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX3VzZV9nZW4pOiBNYWtlIElHRU4gdGhlIGRlZmF1bHQgc2ltdWxhdG9yCi0gCWdlbmVyYXRvciBmb3IgZ2VuZXJpYyAzMiBhbmQgNjQgYml0IG1pcHMgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLVN1biBGZWIgIDEgMTY6NTI6MzcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oIChTaXplRkdSKTogRGV0ZXJtaW5lIGZyb20gZmxvYXRpbmctcG9pbnQgYW5kIG5vdCBncHIKLSAJYml0c2l6ZS4KLQotCSogaW50ZXJwLmMgKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogUmVhZC93cml0ZQotIAlGR1IgZnJvbSBjb3JyZWN0IGxvY2F0aW9uLgotCShzaW1fb3Blbik6IFNldCBzaXplIG9mIEZHUidzIGFjY29yZGluZyB0bwotIAlXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFLgotCQotCSogc2ltLW1haW4uaCAoRkdSKTogU3RvcmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluIGEgc2VwYXJhdGUKLSAJYXJyYXkuCi0KLVN1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBGZWIgIDMgMDA6MTA6NTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoQ29sZFJlc2V0KTogQ2FsbCBQRU5ESU5HX0lOVkFMSURBVEUuCi0KLQkqIHNpbS1tYWluLmggKEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSyk6IENhbGwgUEVORElOR19USUNLLgotCi0JKiBpbnRlcnAuYyAocGVuZGluZ190aWNrKTogTmV3IGZ1bmN0aW9uLiAgRGVsaXZlciBwZW5kaW5nIHdyaXRlcy4KLQotCSogc2ltLW1haW4uaCAoUEVORElOR19GSUxMLCBQRU5ESU5HX1RJQ0ssIFBFTkRJTkdfU0NIRUQsCi0gCVBFTkRJTkdfQklULCBQRU5ESU5HX0lOVkFMSURBVEUpOiBSZS13cml0ZSBwaXBlbGluZSBjb2RlIHNvIHRoYXQKLSAJaXQgY2FuIGhhbmRsZSBtaXhlZCBzaXplZCBxdWFudGl0ZXMgYW5kIHNpbmdsZSBiaXRzLgotCQotTW9uIEZlYiAgMiAxNzo0MzoxNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChvZW5naW5lLmgpOiBEbyBub3QgaW5jbHVkZSB3aGVuIGJ1aWxkaW5nIHdpdGggSUdFTi4KLQkoc2ltX29wZW4pOiBSZXBsYWNlIEdQUkxFTiBieSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUuCi0JKHNpbV9pbmZvKTogRGl0dG8gZm9yIFBST0NFU1NPUl82NEJJVC4KLQkoc2ltX21vbml0b3IpOiBSZXBsYWNlIHV0X3JlZyB3aXRoIHVuc2lnbmVkX3dvcmQuCi0JKCopOiBEaXR0byBmb3IgdF9yZWcuCi0JKExPQUREUk1BU0spOiBEZWZpbmUuCi0JKHNpbV9vcGVuKTogUmVtb3ZlIGRlZnVuY3QgY2hlY2sgdGhhdCBob3N0IEZQIGlzIElFRUUgY29tcGxpYW50LAotIAl1c2luZyBzb2Z0d2FyZSB0byBlbXVsYXRlIGZsb2F0aW5nIHBvaW50LgotCSh2YWx1ZV9mcHIsIC4uLik6IEFsd2F5cyBjb21waWxlLCB3YXMgY29uZGl0aW9uYWwgb24gSEFTRlBVLgotCi1TdW4gRmViICAxIDExOjE1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoc2ltX3N0YXRlKTogTWFrZSB0aGUgY3B1IGFycmF5IE1BWF9OUl9QUk9DRVNTT1JTIGluCi0gCXNpemUuCi0KLQkqIGludGVycC5jIChTRCwgQ1BVKTogRGVmaW5lLgotCShtaXBzX29wdGlvbl9oYW5kbGVyKTogU2V0IGZsYWdzIGluIGVhY2ggQ1BVLgotCShpbnRlcnJ1cHRfZXZlbnQpOiBBc3N1bWUgQ1BVIDAgaXMgdGhlIG9uZSBiZWluZyBpdGVycnVwdGVkLgotCShzaW1fY2xvc2UpOiBEbyBub3QgY2xlYXIgU1RBVEUsIGRlbGV0ZWQgYW55d2F5LgotCShzaW1fd3JpdGUsIHNpbV9yZWFkKTogQXNzdW1lIENQVSB6ZXJvJ3Mgdm0gc2hvdWxkIGJlIHVzZWQgZm9yCi0gCWRhdGEgdHJhbnNmZXJzLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogU2V0IHRoZSBQQyBmb3IgYWxsIHByb2Nlc3NvcnMuCi0JKHNpbV9tb25pdG9yLCBzdG9yZV93b3JkLCBsb2FkX3dvcmQsIG1pcHMxNl9lbnRyeSk6IEFkZCBjcHUKLSAJYXJndW1lbnQuCi0JKG1pcHMxNl9lbnRyeSk6IFBhc3MgY29ycmVjdCBuciBvZiBhcmdzIHRvIHN0b3JlX3dvcmQsIGxvYWRfd29yZC4KLQkoQ29sZFJlc2V0KTogQ29sZCByZXNldCBhbGwgY3B1J3MuCi0JKHNpZ25hbF9leGNlcHRpb24pOiBQYXNzIGNwdSB0byBzaW1fbW9uaXRvciAmIG1pcHMxNl9lbnRyeS4KLQkoc2ltX21vbml0b3IsIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksIHNpZ25hbF9leGNlcHRpb24pOiBVc2UKLSAJYENQVScgaW5zdGVhZCBvZiBTVEFURV9DUFUuCi0KLQotCSogc2ltLW1haW4uaDogUmVwbGFjZSB1c2VzIG9mIFNUQVRFX0NQVSB3aXRoIENQVS4gUmVwbGFjZSBzZCB3aXRoCi0gCVNEIG9yIENQVV8uCi0JCi0JKiBzaW0tbWFpbi5oIChzaWduYWxfZXhjZXB0aW9uKTogQWRkIHNpbV9jcHUgYXJnLgotCShTaWduYWxFeGNlcHRpb24qKTogUGFzcyBib3RoIFNEIGFuZCBDUFUgdG8gc2lnbmFsX2V4Y2VwdGlvbi4KLQkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogVXBkYXRlLgotCQotCSogc2ltLW1haW4uaCAodmFsdWVfZnByLCBzdG9yZV9mcHIsIGRvdHJhY2UsIGlmZXRjaDMyKSwgaW50ZXJwLmM6Ci0gCURpdHRvCi0JKHN5bmNfb3BlcmF0aW9uLCBwcmVmZXRjaCwgY2FjaGVfb3AsIHN0b3JlX21lbW9yeSwgbG9hZF9tZW1vcnksCi0gCWFkZHJlc3NfdHJhbnNsYXRpb24pOiBEaXR0bwotCShkZWNvZGVfY29wcm9jLCBjb3BfbHcsIGNvcF9sZCwgY29wX3N3LCBjb3Bfc2QpOiBEaXR0by4KLQkKLVNhdCBKYW4gMzEgMTg6MTU6NDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVNhdCBKYW4gMzEgMTQ6NDk6MjQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2VuZ2luZV9ydW4pOiBBZGQgYG5yX2NwdXMnIGFyZ3VtZW50LgotCi0JKiBtaXBzLmlnZW4gKG1vZGVsKTogTWFwIHByb2Nlc3NvciBuYW1lcyBvbnRvIEJGRCBuYW1lLgkKLQotCSogc2ltLW1haW4uaCAoQ1BVX0NJQSk6IERlbGV0ZS4KLSAJKFNFVF9DSUEsIEdFVF9DSUEpOiBEZWZpbmUKLQotV2VkIEphbiAyMSAxNjoxNjoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKEdQUl9TRVQpOiBEZWZpbmUsIHVzZWQgYnkgaWdlbiB3aGVuIHplcm9pbmcgYQotIAlyZWdpc2VyLgotCi0JKiBjb25maWd1cmUuaW4gKGRlZmF1bHRfZW5kaWFuKTogQ29uZmlndXJlIGEgYmlnLWVuZGlhbiBzaW11bGF0b3IKLSAJYnkgZGVmYXVsdC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi1Nb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gSmFuICA1IDIwOjM4OjU0IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogSGFuZGxlIERlbnNhbiBtb25pdG9yIG91dGJ5dGUKLQlhbmQgaW5ieXRlIGZ1bmN0aW9ucy4KLQotMTk5Ny0xMi0yOSAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2VuZ2luZV9ydW4pOiBtc3ZjIGNwcCBiYXJmcyBvbiAjaWYgKGE9PWIhPWMpLgotCi1XZWQgRGVjIDE3IDE0OjQ4OjIwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogQXJyYW5nZSBmb3IgJHplcm8gdG8gYWx3YXlzIGJlCi0JcmVzZXQgdG8gemVybyBhZnRlciBldmVyeSBpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVdlZCBEZWMgMTAgMTc6MTA6NDUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLmlnZW4gKE1TVUIpOiBGaXggdG8gd29yayBsaWtlIE1BREQuCi0JKiBnZW5jb2RlLmMgKE1TVUIpOiBTaW1pbGFybHkuCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTm92IDI2IDExOjAwOjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuIChMV0MxKTogQ29ycmVjdCBhc3NlbWJsZXIgLSBsd2MxIG5vdCBzd2MxLgotCi1TdW4gTm92IDIzIDAxOjQ1OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoc2ltLWZwdS5oKTogSW5jbHVkZS4KLQotCSogaW50ZXJwLmMgKGNvbnZlcnQsIFNxdWFyZVJvb3QsIFJlY2lwLCBEaXZpZGUsIE11bHRpcGx5LCBTdWIsCi0gCUFkZCwgTmVnYXRlLCBBYnNvbHV0ZVZhbHVlLCBFcXVhbCwgTGVzcywgSW5maW5pdHksIE5hTik6IFJld3JpdGUKLSAJdXNpbmcgaG9zdCBpbmRlcGVuZGFudCBzaW1fZnB1IG1vZHVsZS4KLQotVGh1IE5vdiAyMCAxOTo1NjoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogUmVwb3J0IGludGVybmFsIGVycm9ycyB3aXRoIFNJR0FCUlQKLSAJbm90IFNJR1FVSVQuCi0KLQkqIHNpbS1tYWluLmggKEMwX0NPTkZJRyk6IE5ldyByZWdpc3Rlci4KLQkoc2lnbmFsLmgpOiBObyBsb25nZXIgaW5jbHVkZS4KLQotCSogaW50ZXJwLmMgKGRlY29kZV9jb3Byb2MpOiBBbGxvdyBhY2Nlc3MgQzBfQ09ORklHIHRvIHJlZ2lzdGVyLgotCi1UdWUgTm92IDE4IDE1OjMzOjQ4IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IFVzZSAkKFNJTV9ORVdfQ09NTU9OX09CSlMpLgotCi1GcmkgTm92IDE0IDExOjU2OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5pZ2VuOiBUYWcgdnI1MDAwIGluc3RydWN0aW9ucy4KLQkoQU5ESSk6IFdhcyBtaXNzaW5nIG1pcHNJViBtb2RlbCwgZml4IGFzc2VtYmxlciBzeW50YXguCi0JKGRvX2NfY29uZF9mbXQpOiBOZXcgZnVuY3Rpb24uCi0JKEMuY29uZC5mbXQpOiBIYW5kbGUgbWlwcyBJLUlJSSB3aGljaCBkbyBub3Qgc3VwcG9ydCBDQyBmaWVsZAotIAlzZXBhcmF0bHkuCi0JKGJjMSk6IEhhbmRsZSBtaXBzIElWIHdoaWNoIGRvIG5vdCBoYXZlIGEgZGVsYWVkIEZDQyBzZXBhcmF0bHkuCi0JKFNEUik6IE1hc2sgcGFkZHIgd2hlbiBCaWdFbmRpYW5NZW0sIG5vdCB0aGUgY29udmVyc2UgYXMgc3BlY2lmaWVkCi0gCWluIElWMy4yIHNwZWMuCi0JKERNVUxULCBETVVMVFUpOiBGb3JjZSB1c2Ugb2YgaG9zdHMgNjRiaXQgbXVsdGlwbGljYXRpb24uICBIYW5kbGUKLSAJdnI1MDAwIHdoaWNoIHNhdmVzIExPIGluIGEgR1BSIHNlcGFyYXRseS4KLQkKLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1pZ2VuKTogRm9yIHZyNTAwMCwgc2VsZWN0IHZyNTAwMAotIAlzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotV2VkIE5vdiAxMiAxNDo0Mjo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tZnB1IG1vZHVsZS4KLQotCSogaW50ZXJwLmMgKHN0b3JlX2ZwciksIHNpbS1tYWluLmg6IEFkZCBzZXBhcmF0ZSBmbXRfdW5pbnRlcnByZXRlZF8zMiBhbmQKLSAJZm10X3VuaW50ZXJwcmV0ZWRfNjQgYml0IGNhc2VzIHRvIHN3aXRjaC4gIENvbnZlcnQgdG8KLSAJZm10X2Zvcm1hdHRlZCwKLQotCSogc2ltLW1haW4uaCAoRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LKTogRGVmaW5lLAotCi0JKiBtaXBzLmlnZW4gKFNXUik6IE1hc2sgcGFkZHIgd2hlbiBCaWdFbmRpYW5NZW0sIG5vdCB0aGUgY29udmVyc2UKLSAJYXMgc3BlY2lmaWVkIGluIElWMy4yIHNwZWMuCi0JKE1UQzEsIERNVEMxKTogQ2FsbCBTdG9yZUZQUiB0byBzdG9yZSB0aGUgR1BSIGluIHRoZSBGUFIuCi0KLVR1ZSBOb3YgMTEgMTI6Mzg6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW46IERlbGF5IHNsb3QgYnJhbmNoZXMgYWRkIE9GRlNFVCB0byBOSUEgbm90IENJQS4KLSAJKE1GQzAsIE1UQzAsIFNXQzEsIExXQzEsIFNEQzEsIExEQzEpOiBJbXBsZW1lbnQuCi0JKE1UQzEsIE1GQzEsIERNVEMxLCBETUZDMSwgQ0ZDMSwgQ1RDMSk6IEltcGxlbWVudCBzZXBhcmF0ZSBub24KLSAJUEVORElOR19GSUxMIHZlcnNpb25zIG9mIGluc3RydWN0aW9ucy4gIFNpbXBsaWZ5LgotCShYKTogTmV3IGZ1bmN0aW9uLgotCShNVUxULCBNVUxUVSk6IEltcGxlbWVudCBzZXBhcmF0ZSBSRD09MCBhbmQgUkQhPTAgdmVyc2lvbnMgb2YKLSAJaW5zdHJ1Y3Rpb25zLgotCShCRVFaLCAuLi4sIFNMVCwgU0xUSSwgVExULCBUTEUsIFRMSSwgLi4uKTogRXhwbGljaXRseSBjYXN0IEdQUiB0bwotIAlhIHNpZ25lZCB2YWx1ZS4KLQkoTVRISSwgTUZISSk6IERpc2FibGUgY29kZSBjaGVja2luZyBISS1MTy4KLQkKLQkqIHNpbS1tYWluLmggKGRvdHJhY2UsdHJhY2VmaCksIGludGVycC5jOiBNYWtlIGRvdHJhY2UgJiB0cmFjZWZoCi0gCWdsb2JhbC4KLQkoTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OKTogQ2FsbCBkb3RyYWNlLgotCi1UaHUgTm92ICA2IDE2OjM2OjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChidWlsZF9taXBzMTZfb3BlcmFuZHMpOiBSZXBsYWNlIElQQyB3aXRoIGNpYS4KLQotCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yLCBzaWduYWxfZXhjZXB0aW9uLCBjYWNoZV9vcCwgc3RvcmVfZnByLAotIAl2YWx1ZV9mcHIsIGNvcF9sZCwgY29wX2x3LCBjb3Bfc3csIGNvcF9zZCwgZGVjb2RlX2NvcHJvYyk6IFJlcGxhY2UKLSAJSVBDIHRvIGBjaWEnLgotCShVbmRlZmluZWRSZXN1bHQpOiBSZXBsYWNlIGZ1bmN0aW9uIHdpdGggbWFjcm8vZnVuY3Rpb24KLSAJY29tYmluYXRpb24uCi0JKHNpbV9lbmdpbmVfcnVuKTogRG9uJ3Qgc2F2ZSBQQyBpbiBJUEMuCi0KLQkqIHNpbS1tYWluLmggKElQQyk6IERlbGV0ZS4KLQotCi0JKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbiwgc3RvcmVfd29yZCwgbG9hZF93b3JkLAotIAlhZGRyZXNzX3RyYW5zbGF0aW9uLCBsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5LCBjYWNoZV9vcCwKLSAJcHJlZmV0Y2gsIHN5bmNfb3BlcmF0aW9uLCBpZmV0Y2gsIHZhbHVlX2Zwciwgc3RvcmVfZnByLCBjb252ZXJ0LAotIAljb3BfbHcsIGNvcF9sZCwgY29wX3N3LCBjb3Bfc2QsIGRlY29kZV9jb3Byb2MsIHNpbV9tb25pdG9yKTogQWRkCi0gCWN1cnJlbnQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAtIGNpYSAtIGFyZ3VtZW50LgotCShzaW1fcmVhZCwgc2ltX3dyaXRlKTogQ2FsbCBhZGRyZXNzX3RyYW5zbGF0aW9uIGRpcmVjdGx5LgotCShzaW1fZW5naW5lX3J1bik6IFJlbmFtZSB2YXJpYWJsZSB2YWRkciB0byBjaWEuCi0JKHNpZ25hbF9leGNlcHRpb24pOiBQYXNzIGNpYSB0byBzaW1fbW9uaXRvcgotCQotCSogc2ltLW1haW4uaCAoU2lnbmFsRXhjZXB0aW9uLCBMb2FkV29yZCwgU3RvcmVXb3JkLCBDYWNoZU9wLAotIAlQcmVmZXRjaCwgU3luY09wZXJhdGlvbiwgVmFsdWVGUFIsIFN0b3JlRlBSLCBDb252ZXJ0LCBDT1BfTFcsCi0gCUNPUF9MRCwgQ09QX1NXLCBDT1BfU0QsIERlY29kZUNvcHJvYyk6IFVwZGF0ZS4KLQotCSogc2ltLW1haW4uaCAoU2lnbmFsRXhjZXB0aW9uU2ltdWxhdG9yRmF1bHQpOiBEZWxldGUgZGVmaW5pdGlvbi4KLSAgCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogUmVwbGFjZSBTaWduYWxFeGNlcHRpb25TaW11bGF0b3JGYXVsdCB3aXRoCi0gCVNJTV9BU1NFUlQuCi0JCi0JKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbik6IFBhc3MgcmVzdGFydCBhZGRyZXNzIHRvCi0gCXNpbV9lbmdpbmVfcmVzdGFydC4KLQotCSogTWFrZWZpbGUuaW4gKHNlbWFudGljcy5vLCBlbmdpbmUubywgc3VwcG9ydC5vLCBpdGFibGUubywKLSAJaWRlY29kZS5vKTogQWRkIGRlcGVuZGVuY3kuCi0KLQkqIHNpbS1tYWluLmggKFNJTV9FTkdJTkVfSEFMVF9IT09LLCBTSU1fRU5HSU5FX1JFU1VNRV9IT09LKToKLSAJRGVsZXRlIGRlZmluaXRpb25zCi0JKERFTEFZX1NMT1QpOiBVcGRhdGUgTklBIG5vdCBQQyB3aXRoIGJyYW5jaCBhZGRyZXNzLgotCShOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04pOiBTZXQgTklBIHRvIGluc3RydWN0aW9uIGFmdGVyIG5leHQuCi0KLQkqIG1pcHMuaWdlbjogVXNlIENJQSBub3QgUEMgaW4gYnJhbmNoIGNhbGN1bGF0aW9ucy4KLQkoaWxsZWdhbCk6IENhbGwgU2lnbmFsRXhjZXB0aW9uLgotIAkoQkVRLCBBRERJVSk6IEZpeCBhc3NlbWJsZXIuCi0KLVdlZCBOb3YgIDUgMTI6MTk6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtMTYuaWdlbiAoSkFMWCk6IFdhcyBtaXNzaW5nLgotCi0JKiBjb25maWd1cmUuaW4gKGVuYWJsZS1zaW0taWdlbik6IE5ldyBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi0JKiBzaW0tbWFpbi5oIChNQVhfSU5TTlMsIElOU05fTkFNRSk6IERlZmluZS4KLQotCSogaW50ZXJwLmMgKGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnkpOiBEZWxldGUgcGFyYW1ldGVyIFJBVy4KLQkoc2ltX3JlYWQsIHNpbV93cml0ZSk6IFVzZSBzaW1fY29yZV97cmVhZCx3cml0ZX1fYnVmZmVyIGRpcmVjdGx5Ci0gCWJ5cGFzc2luZyB7bG9hZCxzdG9yZX1fbWVtb3J5LgotCi0JKiBzaW0tbWFpbi5oIChCeXRlU3dhcE1lbSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLW1lbW9wdCBtb2R1bGUuCi0KLQkqIGludGVycC5jIChzaW1fZG9fY29tbWFuZCwgc2ltX2NvbW1hbmRzKTogRGVsZXRlIG1pcHMgc3BlY2lmaWMKLSAJY29tbWFuZHMuICBIYW5kbGVkIGJ5IG1vZHVsZSBzaW0tb3B0aW9ucy4KLQkJCi0JKiBzaW0tbWFpbi5oIChTSU1fSEFWRV9GTEFUTUVNKTogVW5kZWZpbmUsIHVzZSBzaW0tY29yZS5vIG1vZHVsZS4KLQkoV0lUSF9NT0RVTE9fTUVNT1JZKTogRGVmaW5lLgotCi0JKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBEZWxldGUgY29kZSBwcmludGluZyBtZW1vcnkgc2l6ZS4KLQotCSogaW50ZXJwLmMgKG1pcHNfc2l6ZSk6IE5lZSBzaW1fc2l6ZSwgZGVsZXRlIGZ1bmN0aW9uLgotCShwb3dlcjIpOiBEZWxldGUuCi0JKG1vbml0b3IsIG1vbml0b3JfYmFzZSwgbW9uaXRvcl9zaXplKTogRGVsZXRlIGdsb2JhbCB2YXJpYWJsZXMuCi0JKHNpbV9vcGVuLCBzaW1fY2xvc2UpOiBEZWxldGUgY29kZSBjcmVhdGluZyBtb25pdG9yIGFuZCBvdGhlcgotIAltZW1vcnkgcmVnaW9ucy4gIFVzZSBzaW0tbWVtb3B0cyBtb2R1bGUsIHZpYSBzaW1fZG9fY29tbWFuZGYsIHRvCi0gCW1hbmFnZSBtZW1vcnkgcmVnaW9ucy4KLQkobG9hZF9tZW1vcnksIHN0b3JlX21lbW9yeSk6IFVzZSBzaW0tY29yZSBmb3IgbWVtb3J5IG1vZGVsLgotCQotCSogaW50ZXJwLmMgKGFkZHJlc3NfdHJhbnNsYXRpb24pOiBEZWxldGUgYWxsIG1lbW9yeSBtYXAgY29kZQotIAlleGNlcHQgbGluZSBmb3JjaW5nIDMyIGJpdCBhZGRyZXNzZXMuCi0KLVdlZCBOb3YgIDUgMTE6MjE6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oIChXSVRIX1RSQUNFKTogRGVsZXRlIGRlZmluaXRpb24uICBFbmFibGVzIGNvbW1vbgotIAl0cmFjZSBvcHRpb25zLgotCi0JKiBpbnRlcnAuYyAobG9nZmgsIGxvZ2ZpbGUpOiBEZWxldGUgZ2xvYmFscy4KLQkoc2ltX29wZW4sIHNpbV9jbG9zZSk6IERlbGV0ZSBjb2RlIG9wZW5pbmcgJiBjbG9zaW5nIGxvZyBmaWxlLgotCShtaXBzX29wdGlvbl9oYW5kbGVyKTogRGVsZXRlIC1sIGFuZCAtbiBvcHRpb25zLgotCShPUFRJT04gbWlwc19vcHRpb25zKTogRGl0dG8uCi0KLQkqIGludGVycC5jIChPUFRJT04gbWlwc19vcHRpb25zKTogUmVuYW1lIG9wdGlvbiB0cmFjZSB0byBkaW5lcm8uCi0JKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCi0KLVdlZCBOb3YgIDUgMDk6MzU6NTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoZmV0Y2hfc3RyKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fbW9uaXRvcik6IFJld3JpdGUgdXNpbmcgc2ltX3JlYWQgJiBzaW1fd3JpdGUuCi0JKHNpbV9vcGVuKTogQ2hlY2sgbWFnaWMgbnVtYmVyLgotCShzaW1fb3Blbik6IFdyaXRlIG1vbml0b3IgdmVjdG9ycyBpbnRvIG1lbW9yeSB1c2luZyBzaW1fd3JpdGUuCi0JKE1PTklUT1JfQkFTRSwgTU9OSVRPUl9TSVpFLCBNRU1fU0laRSk6IERlZmluZS4KLQkoc2ltX3JlYWQsIHNpbV93cml0ZSk6IFNpbXBsaWZ5IC0gdHJhbnNmZXIgZGF0YSBvbmUgYnl0ZSBhdCBhCi0gCXRpbWUuCi0JKGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnkpOiBDbGFyaWZ5IG1lYW5pbmcgb2YgcGFyYW1ldGVyIFJBVy4KLQotCSogc2ltLW1haW4uaCAoaXNIT1NUKTogRGVmZXRlIGRlZmluaXRpb24uCi0JKGlzVEFSR0VUKTogTWFyayBhcyBkZXByZWNpYXRlZC4KLQkoYWRkcmVzc190cmFuc2xhdGlvbik6IERlbGV0ZSBwYXJhbWV0ZXIgSE9TVC4KLQotCSogaW50ZXJwLmMgKGFkZHJlc3NfdHJhbnNsYXRpb24pOiBEZWxldGUgcGFyYW1ldGVyIEhPU1QuCi0KLVdlZCBPY3QgMjkgMTE6MTM6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW46IAotCi0JKiBNYWtlZmlsZS5pbiAoSUdFTl9JTkNMVURFKTogRmlsZXMgaW5jbHVkZWQgYnkgbWlwcy5pZ2VuLgotCSh0bXAtaWdlbiwgdG1wLW0xNik6IERlcGVuZCBvbiBJR0VOX0lOQ0xVREUuCi0KLVR1ZSBPY3QgMjggMTE6MDY6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmlnZW46IEFkZCBtb2RlbCBmaWx0ZXIgZmllbGQgdG8gcmVjb3Jkcy4KLQotTW9uIE9jdCAyNyAxNzo1Mzo1OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fTk9fQ0ZMQUdTKTogRGVmaW5lLiAgRGVmaW5lIFdJVEhfSUdFTj0wLgotCQotCWludGVycC5jIChzaW1fZW5naW5lX3J1bik6IERvIG5vdCBjb21waWxlIGZ1bmN0aW9uIHNpbV9lbmdpbmVfcnVuCi0gCXdoZW4gV0lUSF9JR0VOID09IDEuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX2lnZW5fZmxhZ3MsIHNpbV9tMTZfZmxhZ3MpOiBTZXQgYWNjb3JkaW5nIHRvCi0gCXRhcmdldCBhcmNoaXRlY3R1cmUuCi0KLQlNYWtlZmlsZS5pbiAodG1wLWlnZW4sIHRtcC1tMTYpOiBEcm9wIC1GIGFuZCAtTSBvcHRpb25zIHRvCi0gCWlnZW4uIFJlcGxhY2Ugd2l0aCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBzaW1faWdlbl9mbGFncyAvCi0gCXNpbV9tMTZfZmxhZ3MuCi0KLQkqIG0xNi5pZ2VuOiBOZXcgZmlsZS4gIENvcHkgbWlwczE2IGluc25zIGhlcmUuCi0JKiBtaXBzLmlnZW46IEZyb20gaGVyZS4KLQotTW9uIE9jdCAyNyAxMzo1Mzo1OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fTk9fT0JKKTogRGVmaW5lLCBtb3ZlIFNJTV9NMTZfT0JKLCBTSU1fSUdFTl9PQkoKLSAJdG8gdG9wLgotCSh0bXAtaWdlbiwgdG1wLW0xNik6IFBhc3MgLUkgc3JjZGlyIHRvIGlnZW4uCi0KLVNhdCBPY3QgMjUgMTY6NTE6NDAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBGb2xsb3cgc2ltX3dyaXRlJ3MgbGVhZCBpbiB1c2luZwotCUJpZ0VuZGlhbk1lbSBpbnN0ZWFkIG9mICFCeXRlU3dhcE1lbS4KLQotRnJpIE9jdCAyNCAxNzo0MTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX2dlbik6IERlcGVuZGVudCBvbiB0YXJnZXQsIHNlbGVjdCB0eXBlIG9mCi0gCWdlbmVyYXRvci4gIEFsd2F5cyBzZWxlY3Qgb2xkIHN0eWxlIGdlbmVyYXRvci4KLQotCWNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLQlNYWtlZmlsZS5pbiAodG1wLWlnZW4sIHRtcC1tMTYsIGNsZWFuLW0xNiwgY2xlYW4taWdlbik6IE5ldwotIAl0YXJnZXRzLgotCShTSU1fTTE2X0NGTEFHUywgU0lNX00xNl9BTEwsIFNJTV9NMTZfT0JKLCBCVUlMVF9TUkNfRlJPTV9NMTYsCi0gCVNJTV9JR0VOX0NGTEFHUywgU0lNX0lHRU5fQUxMLCBTSU1fSUdFTl9PQkosIEJVSUxUX1NSQ19GUk9NX0lHRU4sCi0gCUlHRU5fVFJBQ0UsIElHRU5fSU5TTiwgSUdFTl9EQyk6IERlZmluZQotCShTSU1fRVhUUkFfQ0ZMQUdTLCBTSU1fRVhUUkFfQUxMLCBTSU1fT0JKUyk6IEFkZCBtZW1iZXIKLSAJU0lNX0BzaW1fZ2VuQF8qLCBzZXQgYnkgYXV0b2NvbmYuCi0JCi1XZWQgT2N0IDIyIDEyOjUyOjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OLCBERUxBWV9TTE9UKTogRGVmaW5lLgotCi0JKiBpbnRlcnAuYyAoQ29sZFJlc2V0KTogUmVtb3ZlICNpZmRlZiBIQVNGUFUsIGNoZWNrCi0gCUNVUlJFTlRfRkxPQVRJTkdfUE9JTlQgaW5zdGVhZC4KLQotCSogaW50ZXJwLmMgKGlmZXRjaDMyKTogTmV3IGZ1bmN0aW9uLiBGZXRjaCAzMiBiaXQgaW5zdHJ1Y3Rpb24uCi0JKGFkZHJlc3NfdHJhbnNsYXRpb24pOiBSYWlzZSBleGNlcHRpb24gSW5zdHJ1Y3Rpb25GZXRjaCB3aGVuCi0gCXRyYW5zbGF0aW9uIGZhaWxzIGFuZCBpc0lOU1RSVUNUSU9OLgotCQotCSogaW50ZXJwLmMgKHNpbV9vcGVuLCBzaW1fd3JpdGUsIHNpbV9tb25pdG9yLCBzdG9yZV93b3JkLAotIAlzaW1fZW5naW5lX3J1bik6IENoYW5nZSB0eXBlIG9mIG9mIHZhZGRyIGFuZCBwYWRkciB0bwotIAlhZGRyZXNzX3dvcmQuCi0JKGFkZHJlc3NfdHJhbnNsYXRpb24sIHByZWZldGNoLCBsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5LAotIAljYWNoZV9vcCk6IENoYW5nZSB0eXBlIG9mIHZBZGRyIGFuZCBwQWRkciB0byBhZGRyZXNzX3dvcmQuCi0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBDaGFuZ2UgdHlwZSBvZiB2YWRkciBhbmQgcGFkZHIgdG8KLSAJYWRkcmVzc193b3JkLgotCi1Nb24gT2N0IDIwIDE1OjI5OjA0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoQUxVNjRfRU5ELCBBTFUzMl9FTkQpOiBVc2UgQUxVKl9PVkVSRkxPV19SRVNVTFQKLSAJbWFjcm8gdG8gb2J0YWluIHJlc3VsdCBvZiBBTFUgb3AuCi0KLVR1ZSBPY3QgMjEgMTc6Mzk6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBDYWxsIHByb2ZpbGVfcHJpbnQuCi0KLU1vbiBPY3QgMjAgMTM6MzE6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLXByb2ZpbGUubyBtb2R1bGUuCi0KLQkqIHNpbS1tYWluLmggKFdJVEhfUFJPRklMRSk6IERvIG5vdCBkZWZpbmUsIGRlZmluZWQgaW4KLSAJY29tbW9uL3NpbS1jb25maWcuaC4gIFVzZSBzaW0tcHJvZmlsZSBtb2R1bGUuCi0JKHNpbVBST0ZJTEUpOiBEZWxldGUgZGVmaW50aW9uLgotCi0JKiBpbnRlcnAuYyAoUFJPRklMRSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShtaXBzX29wdGlvbl9oYW5kbGVyKTogRGVsZXRlICdwJywgJ3knIGFuZCAneCcgcHJvZmlsZSBvcHRpb25zLgotCShzaW1fY2xvc2UpOiBEZWxldGUgY29kZSB3cml0aW5nIHByb2ZpbGUgaGlzdG9ncmFtLgotCShtaXBzX3NldF9wcm9maWxlLCBtaXBzX3NldF9wcm9maWxlX3NpemUsIHdyaXRlb3V0MTYsIHdyaXRlb3V0MzIpOgotIAlEZWxldGUuCi0JKHNpbV9lbmdpbmVfcnVuKTogRGVsZXRlIGNvZGUgcHJvZmlsaW5nIHRoZSBQQy4KLQotTW9uIE9jdCAyMCAxMzozMToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKFNJR05FWFRFTkQpOiBGb3JjZSB0eXBlIG9mIHJlc3VsdCB0byB1bnNpZ25lZF93b3JkLgotCi0JKiBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBNYWtlIHJlZ2lzdGVyIHBvaW50ZXJzIG9mIHR5cGUKLSAJdW5zaWduZWRfd29yZCouCi0KLQkqIHNpbS1tYWluLmg6IE1ha2UgcmVnaXN0ZXJzIG9mIHR5cGUgdW5zaWduZWRfd29yZCBub3QKLSAJc2lnbmVkX3dvcmQuCi0KLVRodSBPY3QgMTYgMTA6MzE6MzkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc3luY19vcGVyYXRpb24pOiBSZW5hbWUgZnJvbSBTeW5jT3BlcmF0aW9uLCBtYWtlCi0gCWdsb2JhbCwgYWRkIFNEIGFyZ3VtZW50LgotCShwcmVmZXRjaCk6IFJlbmFtZSBmcm9tIFByZWZldGNoLCBtYWtlIGdsb2JhbCwgYWRkIFNEIGFyZ3VtZW50LgotCShkZWNvZGVfY29wcm9jKTogTWFrZSBnbG9iYWwuCi0KLQkqIHNpbS1tYWluLmggKFN5bmNPcGVyYXRpb24sIERlY29kZUNvcHJvYywgUGVmZXRjaCk6IERlZmluZS4KLQotCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IEdlbmVyYXRlIERlY29kZUNvcHJvYyBub3QKLSAJZGVjb2RlX2NvcHJvYyBjYWxscy4KLQotCSogaW50ZXJwLmMgKFNFVEZDQywgR0VURkNDLCBQUkVWQ09DMSk6IE1vdmUgdG8gc2ltLW1haW4uaAotCShTaXplRkdSKTogTW92ZSB0byBzaW0tbWFpbi5oCi0JKHNpbUhBTFRFWCwgc2ltSEFMVElOLCBzaW1UUkFDRSwgc2ltUFJPRklMRSwgc2ltREVMQVlTTE9ULAotIAlzaW1TSUdJTlQsIHNpbUpBTERFTEFZU0xPVCk6IE1vdmUgdG8gc2ltLW1haW4uaAotCShGUF9GTEFHUywgRlBfRU5BQkxFLCBGUF9DQVVTRSwgSVIsIFVGLCBPRiwgRFosIElPLCBVTyk6IE1vdmUgdG8KLSAJc2ltLW1haW4uaC4KLQkoRlBfRlMsIEZQX01BU0tfUk0sIEZQX1NIX1JNLCBGUF9STV9ORUFSRVNULCBGUF9STV9UT1BJTkYsCi0gCUZQX1JNX1RPTUlORiwgR0VUUk0pOiBNb3ZlIHRvIHNpbS1tYWluLmguCi0JKFVuY2FjaGVkLCBDYWNoZWROb25jb2hlcmVudCwgQ2FjaGVkQ29oZXJlbnQsIENhY2hlZCwKLSAJaXNJTlNUUlVDVElPTiwgLi4uLCBBY2Nlc3NMZW5ndGhfQllURSwgLi4uKTogTW92ZSB0byBzaW0tbWFpbi5oLgotCShVc2VyTW9kZSwgQmlnRW5kaWFuTWVtLCBCeXRlU3dhcE1lbSwgUmV2ZXJzZUVuZGlhbiwKLSAJQmlnRW5kaWFuQ1BVLCBzdGF0dXNfS1NVX21hc2ssIC4uLikuIE1vdmVkIHRvIHNpbS1tYWluLmgKLQkKLQkqIHNpbS1tYWluLmggKEFMVTMyX0VORCwgQUxVNjRfRU5EKTogRGVmaW5lLiBXaGVuIG92ZXJmbG93IHJhaXNlCi0gCWV4Y2VwdGlvbi4KLQkoc2ltLWFsdS5oKTogSW5jbHVkZS4KLQkoTlVMTElGWV9OSUEsIE5VTExfQ0lBLCBDUFVfQ0lBKTogRGVmaW5lLgotIAkoc2ltX2NpYSk6IFR5cGVkZWYgdG8gaW5zdHJ1Y3Rpb25fYWRkcmVzcy4KLQkKLVRodSBPY3QgMTYgMTA6MzE6NDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW50ZXJwLm8pOiBSZW5hbWUgZ2VuZXJhdGVkIGZpbGUgZW5naW5lLmMgdG8KLQlvZW5naW5lLmMuCi0gIAkKLQkqIGludGVycC5jOiBVcGRhdGUuCi0JCi1UaHUgT2N0IDE2IDEwOjMxOjQwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IFVzZSBGUFJfU1RBVEUgbm90IGZwcl9zdGF0ZS4KLQkKLVRodSBPY3QgMTYgMTA6MzE6MzkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogRm9yICJGUFNRUlQiLCBvdXRwdXQgY29ycmVjdAotIAludW1iZXIgb2YgYXJndW1lbnRzIHRvIFJlY2lwLgotCQotVHVlIE9jdCAxNCAxNzozODoxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnRlcnAubyk6IERlcGVuZHMgb24gc2ltLW1haW4uaAotCi0JKiBpbnRlcnAuYyAobWlwczE2X2VudHJ5LCBDb2xkUmVzZXQsZG90cmFjZSk6IEFkZCBTRCBhcmd1bWVudC4gVXNlIEdQUiBub3QgcmVnaXN0ZXJzLgotCi0JKiBzaW0tbWFpbi5oIChzaW1fY3B1KTogQWRkIHJlZ2lzdGVycywgcmVnaXN0ZXJfd2lkdGhzLCBmcHJfc3RhdGUsCi0gCWlwYywgZHNwYywgcGVuZGluZ18qLCBoaWFjY2VzcywgbG9hY2Nlc3MsIHN0YXRlLCBkc3N0YXRlIGZpZWxkcy4KLSAJKFJFR0lTVEVSUywgUkVHSVNURVJfV0lEVEhTLCBGUFJfU1RBVEUsIElQQywgRFNQQywgUEVORElOR18qLAotIAlTVEFURSwgRFNTVEFURSk6IERlZmluZQotCShHUFIsIEZHUklEWCwgLi4pOiBEZWZpbmUuCi0KLQkqIGludGVycC5jIChyZWdpc3RlcnMsIHJlZ2lzdGVyX3dpZHRocywgZnByX3N0YXRlLCBpcGMsIGRzcGMsCi0gCXBlbmRpbmdfKiwgaGlhY2Nlc3MsIGxvYWNjZXNzLCBzdGF0ZSwgZHNzdGF0ZSk6IERlbGV0ZSBnbG9iYWxzLgotCShHUFIsIEZHUklEWCwgLi4uKTogRGVsZXRlIG1hY3Jvcy4KLQkKLQkqIGludGVycC5jOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggZGVmaW5lcyBmcm9tIHNpbS1tYWluLmgKLQkKLVR1ZSBPY3QgMTQgMTU6MTE6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBBZGQgU0QgYXJndW1lbnQuCi0JKHNpbV93YXJuaW5nKTogRGVsZXRlLiAgUmVwbGFjZSBjYWxscyB3aXRoIGNhbGxzIHRvCi0gCXNpbV9pb19lcHJpbnRmLgotCShzaW1fZXJyb3IpOiBEZWxldGUuIFJlcGxhY2UgY2FsbHMgd2l0aCBzaW1faW9fZXJyb3IuCi0JKG9wZW5fdHJhY2UsIHdyaXRlb3V0MzIsIHdyaXRlb3V0MTYsIGdldG51bSk6IEFkZCBTRCBhcmd1bWVudC4KLQkobWlwc19zZXRfcHJvZmlsZSk6IFJlbmFtZSBmcm9tIHNpbV9zZXRfcHJvZmlsZS4gQWRkIFNEIGFyZ3VtZW50LgotCShtaXBzX3NldF9wcm9maWxlX3NpemUpOiBSZW5hbWUgZnJvbSBzaW1fc2V0X3Byb2ZpbGVfc2l6ZS4gQWRkIFNECi0gCWFyZ3VtZW50LgotCShtaXBzX3NpemUpOiBSZW5hbWUgZnJvbSBzaW1fc2l6ZS4gQWRkIFNEIGFyZ3VtZW50LgotCi0JKiBpbnRlcnAuYyAoc2ltdWxhdG9yKTogRGVsZXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkoY2FsbGJhY2spOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlLgotCShtaXBzX29wdGlvbl9oYW5kbGVyLCBzaW1fb3Blbiwgc2ltX3dyaXRlLCBzaW1fcmVhZCwKLSAJc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9pbmZvLCBzaW1fZG9fY29tbWFuZCwKLSAJc2ltX3NpemUsc2ltX21vbml0b3IpOiBVc2Ugc2ltX2lvXyogbm90IGNhbGxiYWNrLT4qLgotCShzaW1fb3Blbik6IFpBTExPQyBzaW11bGF0b3Igc3RydWN0LgotCShQUk9GSUxFKTogRG8gbm90IGRlZmluZS4KLQotVHVlIE9jdCAxNCAxMzozNTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3BlbiksIHN1cHBvcnQuaDogUmVwbGFjZSBDSEVDS1NJTSBtYWNybyBmb3VuZCBpbgotIAlzdXBwb3J0Lmggd2l0aCBjb3JyZXNwb25kaW5nIGNvZGUuCi0KLQkqIHNpbS1tYWluLmggKHdvcmQ2NCwgdXdvcmQ2NCksIHN1cHBvcnQuaDogTW92ZSBkZWZpbml0aW9uIHRvCi0gCXNpbS1tYWluLmguCi0JKFdPUkQ2NExPLCBXT1JENjRISSwgU0VUNjRMTywgU0VUNjRISSwgV09SRDY0LCBVV09SRDY0KTogRGl0dG8uCi0KLQkqIHN1cHBvcnQuaDogRGVsZXRlCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcwotCSogaW50ZXJwLmM6IERvIG5vdCBpbmNsdWRlLgotCQotVHVlIE9jdCAxNCAxMzozNTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChhZGRyZXNzX3RyYW5zbGF0aW9uLCBsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5LAotIAljYWNoZV9vcCk6IFJlbmFtZSB0byBmcm9tIEFkZHJlc3NUcmFuc2xhdGlvbiBldC5hbC4sIG1ha2UgZ2xvYmFsLAotIAlhZGQgU0QgYXJndW1lbnQKLQkKLQkqIHNpbS1tYWluLmggKEFkZHJlc3NUcmFuc2xhdGlvbiwgTG9hZE1lbW9yeSwgU3RvcmVNZW1vcnksCi0gCUNhY2hlT3ApOiBEZWZpbmUuCi0JCi0JKiBpbnRlcnAuYyAoU2lnbmFsRXhjZXB0aW9uKTogUmVuYW1lIHRvIHNpZ25hbF9leGNlcHRpb24sIG1ha2UKLSAJZ2xvYmFsLgotCi0JKiBpbnRlcnAuYyAoSW50ZXJydXB0LCAuLi4pOiBNb3ZlIGRlZmluaXRpb25zIHRvIHNpbS1tYWluLmguCi0JCi0JKiBzaW0tbWFpbi5oIChTaWduYWxFeGNlcHRpb24sIFNpZ25hbEV4Y2VwdGlvbkludGVycnVwdCwKLSAJU2lnbmFsRXhjZXB0aW9uSW5zdHJ1Y3Rpb25GZXRjaCwgU2lnbmFsRXhjZXB0aW9uQWRkcmVzc1N0b3JlLAotIAlTaWduYWxFeGNlcHRpb25BZGRyZXNzTG9hZCwgU2lnbmFsRXhjZXB0aW9uU2ltdWxhdG9yRmF1bHQsCi0gCVNpZ25hbEV4Y2VwdGlvbkludGVnZXJPdmVyZmxvdywgU2lnbmFsRXhjZXB0aW9uQ29Qcm9jZXNzb3JVbnVzYWJsZSk6Ci0gCURlZmluZS4KLSAgCQotCSogaW50ZXJwLmMsIHN1cHBvcnQuaDogVXNlLgotCQotVHVlIE9jdCAxNCAxMzoxOToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChWYWx1ZUZQUiwgU3RvcmVGUFIpLCBzaW0tbWFpbi5oOiBNYWtlIGdsb2JhbCwgcmVuYW1lCi0gCXRvIHZhbHVlX2ZwciAvIHN0b3JlX2Zwci4gQWRkIFNEIGFyZ3VtZW50LgotCShOYU4sIEluZmluaXR5LCBMZXNzLCBFcXVhbCwgQWJzb2x1dGVWYWx1ZSwgTmVnYXRlLCBBZGQsIFN1YiwKLSAJTXVsdGlwbHksIERpdmlkZSwgUmVjaXAsIFNxdWFyZVJvb3QsIENvbnZlcnQpOiBNYWtlIGdsb2JhbC4KLQotCSogc2ltLW1haW4uaCAoVmFsdWVGUFIsIFN0b3JlRlBSKTogRGVmaW5lLgotCQotVHVlIE9jdCAxNCAxMzowNjo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fZW5naW5lX3J1bik6IENoZWNrIGNvbnNpc3RlbmN5IGJldHdlZW4gY29uZmlndXJlCi0gCVdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSBhbmQgV0lUSF9GTE9BVElOR19QT0lOVCBhbmQgZ2Vuc2ltIEdQUkxFTgotIAlhbmQgSEFTRlBVLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHNfYml0c2l6ZSk6IENvbmZpZ3VyZSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUuCi0gICAgICAgIChtaXBzX2ZwdSk6IENvbmZpZ3VyZSBXSVRIX0ZMT0FUSU5HX1BPSU5ULgotCShtaXBzX2VuZGlhbik6IENvbmZpZ3VyZSBXSVRIX1RBUkdFVF9FTkRJQU4uCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQotRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAyOSAxNDo0NTowMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIFNlcCAyNiAxMjo0ODoxOCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jOiBBbGxvdyBEZWJ1ZywgREVQQywgYW5kIEVQQyByZWdpc3RlcnMgdG8gYmUgZXhhbWluZWQgaW4gR0RCLgotCi1UaHUgU2VwIDI1IDExOjE1OjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChwcmludF9pZ2VuX2luc25fbW9kZWxzKTogQXNzdW1lIGNlcnRhaW4gYXJjaGl0ZWN0dXJlcwotIAlpbmNsdWRlIGFsbCBtaXBzKiBpbnN0cnVjdGlvbnMuCi0JKHByaW50X2lnZW5faW5zbl9mb3JtYXQpOiBVc2UgZGF0YV9zaXplPT0tMSBhcyBtYXJrZXIgZm9yIE1JUFMxNgotIAlpbnN0cnVjdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC5pZ2VuKTogQWRkIHRhcmdldC4gR2VuZXJhdGUgaWdlbiBpbnB1dCBmcm9tCi0gCWdlbmNvZGUgZmlsZS4KLQotCSogZ2VuY29kZS5jIChGRUFUVVJFX0lHRU4pOiBEZWZpbmUuCi0JKG1haW4pOiBBZGQgLS1pZ2VuIG9wdGlvbi4gIEdlbmVyYXRlIG91dHB1dCBpbiBpZ2VuIGZvcm1hdC4KLQkocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBGb3JtYXQgb3V0cHV0IGFjY29yZGluZyB0byBpZ2VuIG9wdGlvbi4KLQkocHJpbnRfaWdlbl9pbnNuX2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaWdlbl9pbnNuX21vZGVscyk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBPbmx5IGlzc3VlIHdhcm5pbmdzIGFuZCBpZ25vcmUKLSAJaW5zdHJ1Y3Rpb25zIHdoZW4gbm8gRkVBVFVSRV9JR0VOLgotCi1XZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKENPUF9TRCwgQ09QX0xEKTogQWRkIFVOVVNFRCB0byBwYWNpZnkgR0NDIGZvciBzb21lCi0gCU1JUFMgdGFyZ2V0cy4KLQotVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAyMyAxMDoxOTo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fQUxJR05NRU5ULCBTSU1fRU5ESUFOLCBTSU1fSE9TVEVORElBTiwKLSAJU0lNX1JFU0VSVkVEX0JJVFMpOiBEZWxldGUsIG1vdmVkIHRvIGNvbW1vbi4KLQkoU0lNX0VYVFJBX0NGTEFHUyk6IFVwZGF0ZS4KLQkKLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBub24tc3RyaWN0IG1lbW9yeSBhbGlnbm1lbnQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVNhdCBTZXAgMjAgMTQ6MDc6MjggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoU0RCQlAsREVSRVQpOiBBZGRlZCAoMzkwMCkgaW5zbnMuCi0JKFJGRSk6IFR1cm4gb24gZm9yIDM5MDAuCi0JKiBpbnRlcnAuYyAoRGVidWdCcmVha1BvaW50LERFUEMsRGVidWcsRGVidWdfKik6IEFkZGVkLgotCShkc3N0YXRlKTogTWFkZSBnbG9iYWwuCi0JKFNVQlRBUkdFVF9SMzkwMCk6IEFkZGVkLgotCShDQU5DRUxERUxBWVNMT1QpOiBOZXcuCi0JKFNpZ25hbEV4Y2VwdGlvbik6IElnbm9yZSBTeXN0ZW1DYWxsIHJhdGhlciB0aGFuIGlnbm9yZSBhbmQKLQl0ZXJtaW5hdGUuICBBZGQgRGVidWdCcmVha1BvaW50IGhhbmRsaW5nLgotCShkZWNvZGVfY29wcm9jKTogTmV3IGluc25zIFJGRSwgREVSRVQ7IGFuZCBuZXcgcmVnaXN0ZXJzIERlYnVnCi0JYW5kIERFUEMgcHJvdGVjdGVkIGJ5IFNVQlRBUkdFVF9SMzkwMC4KLQkoc2ltX2VuZ2luZV9ydW4pOiBVc2UgQ0FOQ0VMREVMQVlTTE9UIHJhdGhlciB0aGFuIGNsZWFyaW5nCi0JYml0cyBleHBsaWNpdGx5LgotCSogTWFrZWZpbGUuaW4sY29uZmlndXJlLmluOiBBZGQgbWlwcyBzdWJ0YXJnZXQgb3B0aW9uLgotCSogY29uZmlndXJlOiBVcGRhdGUuCQotCi1GcmkgU2VwIDE5IDA5OjMzOjI3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmM6IEFkZCByMzkwMCAodHgzOSkuCi0JCi0KLVR1ZSBTZXAgMTYgMTU6NTI6MDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBEb24ndCBuZWVkIHRvIHN1YnRyYWN0IDQgZm9yCi0JSkFMUiwganVzdCAyLgotCi1UdWUgU2VwIDE2IDExOjMyOjI4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogQ29ycmVjdCBzb21lIEhBU0ZQVSBwcm9ibGVtcy4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxMiAxMjowMTozOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChtaXBzX29wdGlvbnMpOiBGaXggc2FtcGxlcyBvcHRpb24gc2hvcnQgZm9ybSwgc2hvdWxkCi0gCWJlIGB4Jy4KLQotVGh1IFNlcCAxMSAwOTozNToyOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1faW5mbyk6IEVuYWJsZSBpbmZvIGNvZGUuICBXYXMganVzdCByZXR1cm5pbmcuCi0KLVR1ZSBTZXAgIDkgMTc6MzA6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoZGVjb2RlX2NvcHJvYyk6IENsYXJpZnkgd2FybmluZyBhYm91dCB1bnN1cG9ydGVkIE1UQzAsCi0gCU1GQzAuCi0KLVR1ZSBTZXAgIDkgMTY6Mjg6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogVXNlIFNJR05FRDY0IGZvciA2NCBiaXQKLSAJY29uc3RhbnRzLgotCShidWlsZF9pbnN0cnVjdGlvbik6IERpdHRvIGZvciBMTC4KLQotVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVdlZCBBdWcgMjcgMTQ6MTI6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgY2FsbCB0byBzaW1fYW5hbHl6ZV9wcm9ncmFtLCB1cGRhdGUKLSAJY2FsbCB0byBzaW1fY29uZmlnLgotCi1UdWUgQXVnIDI2IDEwOjQwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9raWxsKTogRGVsZXRlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJndW1lbnQuIFNldCBQQyBmcm9tIHNhbWUuCi0JKHNpbV9sb2FkKTogTW92ZSBjb2RlIGluaXRpYWxpemluZyB0cmFwIGhhbmRsZXJzIGZyb20gaGVyZS4KLQkoc2ltX29wZW4pOiBUbyBoZXJlLgotCShzaW1fbG9hZCk6IERlbGV0ZSwgdXNlIHNpbS1obG9hZC5jLgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhsb2FkLm8gbW9kdWxlLgotCi1Nb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotTW9uIEF1ZyAyNSAxNTo1OTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShzaW1fbG9hZCk6IE1vdmUgY2FsbCB0byBzaW1fY29uZmlnIGZyb20gaGVyZS4KLQkoc2ltX29wZW4pOiBUbyBoZXJlLiAgQ2hlY2sgcmV0dXJuIHN0YXR1cy4KLQotRnJpIEp1bCAyNSAxNTowMDo0NSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLSAKLSAJKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogVHdvIGFyZyBNQUREIHNob3VsZAotIAlub3QgYXNzaWduIHJlc3VsdCB0byAkMC4KLSAKLVRodSBKdW4gMjYgMTI6MTM6MTcgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIHNpbS9taXBzL2NvbmZpZ3VyZTogQ2hhbmdlIGRlZmF1bHRfc2ltX2VuZGlhbiB0byAwIChiaS1lbmRpYW4pCi0JKiBzaW0vbWlwcy9jb25maWd1cmUuaW46IFJlZ2VuZXJhdGUuCi0KLVdlZCBKdWwgIDkgMTA6Mjk6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoU1VCX1JFR19VVywgU1VCX1JFR19TVywgU1VCX1JFR18qKTogVXNlIG1vcmUgZXhwbGljaXQKLSAJc2lnbmVkOCwgdW5zaWduZWQ4IGV0LmFsLiB0eXBlcy4KLQotCSogaW50ZXJwLmMgKFNVQl9SRUdfRkVUQ0gpOiBIYW5kbGUgYm90aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4KLSAJaG9zdHMgd2hlbiBzZWxlY3Rpbmcgc3VicmVnLgotCi1XZWQgSnVsICAyIDExOjU0OjEwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKHNpbV9lbmdpbmVfcnVuKTogUmVzZXQgdGhlIFpFUk8gcmVnaXN0ZXIgdG8gemVybwotCXJlZ2FyZGxlc3Mgb2YgRkVBVFVSRV9XQVJOX1pFUk8uCi0JKiBnZW5jb2RlLmMgKEZFQVRVUkVfV0FSTklOR1MpOiBSZW1vdmUgRkVBVFVSRV9XQVJOX1pFUk8uCi0KLVdlZCBKdW4gIDQgMTA6NDM6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoZGVjb2RlX2NvcHJvYyk6IEltcGxlbWVudCBNVEMwIE4sIENBVVNFLgotCShTaWduYWxFeGNlcHRpb24pOiBGb3IgQnJlYWtQb2ludHMgaWdub3JlIGFueSBtb2RlIGJpdHMgYW5kIGp1c3QKLSAJc2F2ZSB0aGUgUEMuCi0JKFNpZ25hbEV4Y2VwdGlvbik6IEFsd2F5cyBzZXQgdGhlIENBVVNFIHJlZ2lzdGVyLgotCi1UdWUgSnVuICAzIDA1OjAwOjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKFNpZ25hbEV4Y2VwdGlvbik6IENsZWFyIHRoZSBzaW1ERUxBWVNMT1QgZmxhZyB3aGVuIGFuCi0gCWV4Y2VwdGlvbiBoYXMgYmVlbiB0YWtlbi4KLQotCSogaW50ZXJwLmM6IEltcGxlbWVudCB0aGUgRVJFVCBhbmQgbXQvZiBzciBpbnN0cnVjdGlvbnMuCi0KLVNhdCBNYXkgMzEgMDA6NDQ6MTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoU2lnbmFsRXhjZXB0aW9uKTogRG9uJ3QgYm90aGVyIHJlc3RhcnRpbmcgYW4KLSAJaW50ZXJydXB0LgotCi1GcmkgTWF5IDMwIDIzOjQxOjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKFNpZ25hbEV4Y2VwdGlvbik6IFJlYWxseSB0YWtlIGFuIGludGVycnVwdC4KLQkoaW50ZXJydXB0X2V2ZW50KTogT25seSBkZWxpdmVyIGludGVycnVwdHMgd2hlbiBlbmFibGVkLgotCi1UdWUgTWF5IDI3IDIwOjA4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9pbmZvKTogT25seSBwcmludCBpbmZvIHdoZW4gdmVyYm9zZS4KLQkoc2ltX2luZm8pIFVzZSBzaW1faW9fcHJpbnRmIGZvciBvdXRwdXQuCi0JCi1UdWUgTWF5IDI3IDE0OjIyOjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKENvUHJvY1ByZXNlbnQpOiBBZGQgVU5VU0VEIGF0dHJpYnV0ZSAtIG5vdCB1c2VkIGJ5IGFsbAotIAltaXBzIGFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBNYXkgMjcgMTQ6MjI6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2RvX2NvbW1hbmQpOiBDaGVjayBmb3IgY29tbW9uIGNvbW1hbmRzIGlmIGEKLSAJc2ltdWxhdG9yIHNwZWNpZmljIGNvbW1hbmQgZmFpbHMuCi0KLVRodSBNYXkgMjIgMDk6MzI6MDMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fZW5naW5lX3J1bik6IGlmZGVmIG91dCB1c2VzIG9mIHNpbVNUT1AsIHNpbVNURVAKLQlhbmQgc2ltQkUgd2hlbiBERUJVRyBpcyBkZWZpbmVkLgotCi1XZWQgTWF5IDIxIDA5OjA4OjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKGludGVycnVwdF9ldmVudCk6IE5ldyBmdW5jdGlvbi4gIFBhc3MgZXhjZXB0aW9uIGV2ZW50Ci0gCW9udG8gZXhjZXB0aW9uIGhhbmRsZXIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHN0ZGxpYi5oLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogQWRkIFVOVVNFRCBhdHRyaWJ1dGUgdG8gdGVtcFMKLSAJdmFyaWFibGUgZGVjbGFyYXRpb24uCi0JKGJ1aWxkX2luc3RydWN0aW9uKTogSW5pdGlhbGl6ZSBtZW12YWwxLgotCShidWlsZF9pbnN0cnVjdGlvbik6IEFkZCBVTlVTRUQgYXR0cmlidXRlIHRvIGJ5dGUsIGJpZ2VuZCwKLSAJcmV2ZXJzZS4KLQkoYnVpbGRfb3BlcmFuZHMpOiBEaXR0by4KLQotCSogaW50ZXJwLmM6IEZpeCBHQ0Mgd2FybmluZ3MuCi0JKHNpbV9nZXRfcXVpdF9jb2RlKTogRGVsZXRlLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBJTkxJTkUsIEVORElBTiwgSE9TVEVORElBTiBhbmQgV0FSTklOR1MuCi0JKiBNYWtlZmlsZS5pbjogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS13YXRjaC5vIG1vZHVsZS4KLQotVHVlIE1heSAyMCAxNTowODo1NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChtaXBzX29wdGlvbl9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uIHBhcnNlIGFyZ3VtZXMgdXNpbmcKLSAJc2ltLW9wdGlvbnMuCi0JKG15bmFtZSk6IFJlcGxhY2Ugd2l0aCBTVEFURV9NWV9OQU1FLgotCShzaW1fb3Blbik6IERlbGV0ZSBjaGVjayBmb3IgaG9zdCBlbmRpYW5uZXNzIC0gcGVyZm9ybWVkIGJ5Ci0gCXNpbV9jb25maWcuCi0JKHNpbUhPU1RCRSwgc2ltQkUpOiBEZWxldGUsIHJlcGxhY2VkIGJ5IHNpbS1lbmRpYW4gZmxhZ3MuCi0JKHNpbV9vcGVuKTogTW92ZSBtdWNoIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmcm9tIGhlcmUuCi0JKHNpbV9sb2FkKTogVG8gaGVyZS4gIEFmdGVyIHRoZSBpbWFnZSBoYXMgYmVlbiBsb2FkZWQgYW5kCi0gCWVuZGlhbm5lc3Mgc2V0LgotCShzaW1fb3Blbik6IE1vdmUgQ29sZFJlc2V0IGZyb20gaGVyZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFRvIGhlcmUuCi0JKHNpbV9vcGVuKTogTWFrZSBGUCBjaGVjayBsZXNzIGRlcGVuZGFudCBvbiBob3N0IGVuZGlhbm5lc3MuCi0KLQkqIE1ha2VmaWxlLmluIChTSU1fUlVOX09CSlMpOiBTZXQgdG8gbnJ1bi5vIC0gdXNlIG5ldyB2ZXJzaW9uIG9yCi0gCXJ1bi4KLQkqIGludGVycC5jIChzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZS4KLQotCSogaW50ZXJwLmMgKG1lbWJhbmssIG1lbWJhbmtfYmFzZSwgbWVtYmFua19zaXplKTogUmVwbGFjZSB3aXRoCi0gCVNUQVRFX01FTU9SWSwgU1RBVEVfTUVNX1NJWkUsIFNUQVRFX01FTV9CQVNFLgotCShzaW1fb3Blbik6IFJlbW92ZSBjYWxsIHRvIGNhbGxiYWNrLT5pbml0LiBnZGIvcnVuIGRvIHRoaXMuCi0KLQkqIGludGVycC5jOiBVcGRhdGUKLQotCSogc2ltLW1haW4uaCAoU0lNX0hBVkVfRkxBVE1FTSk6IERlZmluZS4KLQotCSogaW50ZXJwLmMgKGJpZ19lbmRpYW5fcCk6IERlbGV0ZSwgcmVwbGFjZWQgYnkKLSAJY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlci4KLQotVHVlIE1heSAyMCAxMzo1NTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChob3N0X3JlYWRfbG9uZywgaG9zdF9yZWFkX3dvcmQsIGhvc3Rfc3dhcF93b3JkLAotIAlob3N0X3N3YXBfbG9uZyk6IERlbGV0ZS4gVXNpbmcgY29tbW9uIHNpbS1lbmRpYW4uCi0JKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogVXNlIEgyVC4KLQkocGlwZWxpbmVfdGlja3MpOiBEZWxldGUuICBIYW5kbGVkIGJ5IHNpbS1ldmVudHMuCi0JKHNpbV9pbmZvKTogVXBkYXRlLgotCShzaW1fZW5naW5lX3J1bik6IFVwZGF0ZS4KLQotVHVlIE1heSAyMCAxMzo0MjowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcF9yZWFzb24pOiBNb3ZlIGNvZGUgZGV0ZXJtaW5pbmcgc2ltRVhDRVBUSU9OCi0gCXJlYXNvbiBmcm9tIGhlcmUuCi0JKFNpZ25hbEV4Y2VwdGlvbik6IFRvIGhlcmUuIFNpZ25hbCB1c2luZyBzaW1fZW5naW5lX2hhbHQuCi0JKHNpbV9zdG9wX3JlYXNvbik6IERlbGV0ZSwgbW92ZWQgdG8gY29tbW9uLgotCQotVHVlIE1heSAyMCAxMDoxOTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIyLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCi0JKHNpbV9zaXplKTogRGl0dG8uCi0KLU1vbiBNYXkgMTkgMTg6MjA6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgY29tbW9uIG1vZHVsZXMuCi0KLQkqIGludGVycC5jIChzaW1fc2V0X2NhbGxiYWNrcyk6IEFsc28gc2V0IFNEIGNhbGxiYWNrLgotCShzZXRfZW5kaWFubmVzcywgeGZlcl8qLCBzd2FwXyopOiBEZWxldGUuCi0JKGhvc3RfcmVhZF93b3JkLCBob3N0X3JlYWRfbG9uZywgaG9zdF9zd2FwX3dvcmQsIGhvc3Rfc3dhcF9sb25nKToKLSAJQ2hhbmdlIHRvIGZ1bmN0aW9ucyB1c2luZyBzaW0tZW5kaWFuIG1hY3Jvcy4KLQkoY29udHJvbF9jLCBzaW1fc3RvcCk6IERlbGV0ZSwgdXNlIGNvbW1vbiB2ZXJzaW9uLgotCShzaW11bGF0ZSk6IENvbnZlcnQgaW50by4KLQkoc2ltX2VuZ2luZV9ydW4pOiBUaGlzIGZ1bmN0aW9uLgotCShzaW1fcmVzdW1lKTogRGVsZXRlLgotCQotCSogaW50ZXJwLmMgKHNpbXVsYXRpb24pOiBOZXcgdmFyaWFibGUgLSB0aGUgc2ltdWxhdG9yIG9iamVjdC4KLQkoc2ltX2tpbmQpOiBEZWxldGUgZ2xvYmFsIC0gbWVyZ2VkIGludG8gc2ltdWxhdGlvbi4KLQkoc2ltX2xvYWQpOiBDbGVhbnVwLiAgTW92ZSBQQyBhc3NpZ25tZW50IGZyb20gaGVyZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFRvIGhlcmUuCi0KLQkqIHNpbS1tYWluLmg6IE5ldyBmaWxlLgotCSogaW50ZXJwLmMgKHNpbS1tYWluLmgpOiBJbmNsdWRlLgotCQotVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgMjMgMTc6MzI6MTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogdGNvbmZpZy5pbiAoU0lNX0hBVkVfQklFTkRJQU4pOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjEgMTc6MTY6MTMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBESVYgaW5zdHJ1Y3Rpb25zOiBjaGVjayAKLQlmb3IgZGl2aXNpb24gYnkgemVybyBhbmQgaW50ZWdlciBvdmVyZmxvdyBiZWZvcmUgdXNpbmcgCi0JaG9zdCdzIGRpdmlzaW9uIG9wZXJhdGlvbi4KLQotVGh1IEFwciAxNyAwMzoxODoxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWxvYWQuby4KLQkqIGludGVycC5jOiAjaW5jbHVkZSBiZmQuaC4KLQkodGFyZ2V0X2J5dGVfb3JkZXIpOiBEZWxldGUuCi0JKHNpbV9raW5kLCBteW5hbWUsIGJpZ19lbmRpYW5fcCk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLiAgTW92ZSBjYWxsIHRvIHNldF9lbmRpYW5uZXNzIHRvCi0JYWZ0ZXIgYXJndW1lbnQgcGFyc2luZy4gIFJlY29nbml6ZSAtRSBhcmcsIHNldCBlbmRpYW5uZXNzIGFjY29yZGluZ2x5LgotCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBDYWxsIHNpbV9sb2FkX2ZpbGUgdG8KLQlsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuICBTZXQgUEMgZnJvbSBiZmQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgotCShzZXRfZW5kaWFubmVzcyk6IFVzZSBiaWdfZW5kaWFuX3AgaW5zdGVhZCBvZiB0YXJnZXRfYnl0ZV9vcmRlci4KLQotV2VkIEFwciAxNiAxNzo1NTozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc2l6ZSk6IERlbGV0ZSBwcm90b3R5cGUgLSBjb25mbGljdHMgd2l0aAotIAlkZWZpbml0aW9uIGluIHJlbW90ZS1zaW0uaC4gIENvcnJlY3QgZGVmaW5pdGlvbi4KLQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgTWFyIDI1IDExOjM4OjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IFNldCBvcHRpbmQgdG8gMCBiZWZvcmUgY2FsbGluZyBnZXRvcHQuCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxMDo1Mjo1OSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY2V0dXMuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgOiBSZXBsYWNlIHVzZXMgb2YgcHJfYWRkciB3aXRoIHByX3V3b3JkNjQKLQl3aGVyZSB0aGUgYml0IGxlbmd0aCBpcyBhbHdheXMgNjQgaW5kZXBlbmRlbnQgb2YgU0lNX0FERFIuCi0JKHByX3V3b3JkNjQpIDogYWRkZWQuCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLUZyaSBNYXIgMTQgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgTWFyIDEzIDEyOjUxOjM2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cKLQlpbiBhcmd2IGZvcm0uCi0JKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgotCi1Nb24gRmViIDI0IDIyOjQ3OjE0IDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IEZpeCBwcmludGluZyBvZiBhZGRyZXNzZXMgZm9yIG5vbi02NC1iaXQgdGFyZ2V0cy4KLQkocHJfYWRkcik6IEFkZCBmdW5jdGlvbiB0byBwcmludCBhZGRyZXNzIGJhc2VkIG9uIHNpemUuCi0KLVdlZCBGZWIgMTkgMTQ6NDI6MDkgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltb3Blbik6IEFkZCBzdXBwb3J0IGZvciBMU0kgTWluaVJJU0MgUE1PTiB2ZWN0b3JzLgotCi1UaHUgRmViIDEzIDE0OjA4OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChidWlsZF9taXBzMTZfb3BlcmFuZHMpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIGJhc2UKLQlhZGRyZXNzIGZvciBleHRlbmRlZCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbi4KLQotVGh1IEZlYiAgNiAxNzoxNjoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChtaXBzMTZfZW50cnkpOiBBZGQgc3VwcG9ydCBmb3IgZmxvYXRpbmcgcG9pbnQgY2FzZXMuCi0JKFNpZ25hbEV4Y2VwdGlvbik6IFBhc3MgZmxvYXRpbmcgcG9pbnQgY2FzZXMgdG8gbWlwczE2X2VudHJ5LgotCShWYWx1ZUZQUik6IERvbid0IHJlc3RyaWN0IGZtdF9zaW5nbGUgYW5kIGZtdF93b3JkIHRvIGV2ZW4KLQlyZWdpc3RlcnMuCi0JKFN0b3JlRlBSKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBjbG9iYmVyIGZwciArIDEgZm9yIGZtdF9zaW5nbGUKLQlvciBmbXRfd29yZC4KLQkoQ09QX0xXKTogUGFzcyBmbXRfd29yZCByYXRoZXIgdGhhbiBmbXRfdW5pbnRlcnByZXRlZCB0byBTdG9yZUZQUiwKLQlhbmQgdGhlbiBzZXQgdGhlIHN0YXRlIHRvIGZtdF91bmludGVycHJldGVkLgotCShDT1BfU1cpOiBUZW1wb3JhcmlseSBzZXQgdGhlIHN0YXRlIHRvIGZtdF93b3JkIHdoaWxlIGNhbGxpbmcKLQlWYWx1ZUZQUi4KLQotVHVlIEZlYiAgNCAxNjo0ODoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBUaGUgaGlnaCBvcmRlciBtYXkgYmUgc2V0IGluIHRoZQotCWNvbXBhcmlzb24gZmxhZ3MgYXQgYW55IElTQSBsZXZlbCwgbm90IGp1c3QgSVNBIDQuCi0KLVR1ZSBGZWIgIDQgMTM6MzM6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEBDT01NT05fTUFLRUZJTEVfRlJBRyk6IFVzZQotCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAzMSAxMToxMTo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCBhZnRlciBjaGFuZ2UgdG8gYWNsb2NhbC5tNC4KLQotVGh1IEphbiAyMyAxMTo0NjoyMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKLQlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgotCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KLQltYWtlZmlsZSBmcmFnbWVudC4KLQotV2VkIEphbiAgOCAxMjozOTowMyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBVc2UgQmlnRW5kaWFuQ1BVIGluc3RlYWQgb2YKLQlCeXRlU3dhcE1lbS4KLQotVGh1IEphbiAwMiAyMjoyMzowNCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fbW9uaXRvcik6IE1ha2Ugb3V0cHV0IHRvIHN0ZG91dCB2aXNpYmxlIGluCi0Jd2luZ2RiJ3MgSS9PIGxvZyB3aW5kb3cuCi0KLVR1ZSBEZWMgMzEgMDc6MDQ6MDAgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzdXBwb3J0Lmg6IFVuZG8gcHJldmlvdXMgY2hhbmdlIHRvIFNJR1RSQVAKLQlhbmQgU0lHUVVJVCB2YWx1ZXMuCi0KLU1vbiBEZWMgMzAgMTc6MzY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc3RvcmVfd29yZCwgbG9hZF93b3JkKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKG1pcHMxNl9lbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFNpZ25hbEV4Y2VwdGlvbik6IExvb2sgZm9yIG1pcHMxNiBlbnRyeSBhbmQgZXhpdCBpbnN0cnVjdGlvbnMuCi0JKHNpbXVsYXRlKTogVXNlIHRoZSBjb3JyZWN0IGluZGV4IHdoZW4gc2V0dGluZyBmcHJfc3RhdGUgYWZ0ZXIKLQlkb2luZyBhIHBlbmRpbmcgbW92ZS4KLQotU3VuIERlYyAyOSAwOTozNzoxOCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jOiBGaXggYnl0ZS1zd2FwcGluZyBjb2RlIHRocm91Z2hvdXQgdG8gd29yayBvbgotCWJvdGggbGl0dGxlLSBhbmQgYmlnLWVuZGlhbiBob3N0cy4KLQotU3VuIERlYyAyOSAwOToxODozMiAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHN1cHBvcnQuaDogTWFrZSBkZWZpbml0aW9ucyBvZiBTSUdUUkFQIGFuZCBTSUdRVUlUIGNvbnNpc3RlbnQKLQl3aXRoIGdkYi9jb25maWcvaTM4Ni94bS13aW5kb3dzLmguCi0KLUZyaSBEZWMgMjcgMjI6NDg6NTEgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogV29yayBhcm91bmQgTVNWQysrIGNvZGUgZ2VuIGJ1ZwotCXRoYXQgbWVzc2VzIHVwIGFyaXRobWV0aWMgc2hpZnRzLgotCi1GcmkgRGVjIDIwIDExOjA0OjA1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHN1cHBvcnQuaDogIFVzZSBfV0lOMzIgaW5zdGVhZCBvZiBfX1dJTjMyX18uICBBbHNvIGFkZCBkZWZzIGZvcgotCVNJR1RSQVAgYW5kIFNJR1FVSVQgZm9yIF9XSU4zMi4KLQotVGh1IERlYyAxOSAxNDowNzoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pIFtNVUxdOiBDYXN0IG9wZXJhbmRzIHRvIHdvcmQ2NCwgdG8KLQlmb3JjZSBhIDY0IGJpdCBtdWx0aXBsaWNhdGlvbi4KLQkoYnVpbGRfaW5zdHJ1Y3Rpb24pIFtPUl06IEluIG1pcHMxNiBtb2RlLCBkb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlkZXN0aW5hdGlvbiByZWdpc3RlciBpcyAwLCBzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0IG1pcHMxNiBub3AKLQlpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAxNiAxNDo1OTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoTUlQUzE2X0RFQ09ERSk6IFNXUkFTUCBpcyBJOCwgbm90IFJJLgotCShidWlsZF9lbmRpYW5fc2hpZnQpOiBEb24ndCBjaGVjayBwcm9jNjQuCi0JKGJ1aWxkX2luc3RydWN0aW9uKTogQWx3YXlzIHNldCBtZW12YWwgdG8gdXdvcmQ2NC4gIENhc3Qgb3AyIHRvCi0JdXdvcmQ2NCB3aGVuIHNoaWZ0aW5nIGl0IGxlZnQgaW4gbWVtb3J5IGluc3RydWN0aW9ucy4gIEFsd2F5cyB1c2UKLQl0aGUgc2FtZSBjb2RlIGZvciBzdG9yZXMtLWRvbid0IHNwZWNpYWwgY2FzZSBwcm9jNjQuCi0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfbWlwczE2X29wZXJhbmRzKTogRml4IGJhc2UgUEMgdmFsdWUgZm9yIFBDCi0JcmVsYXRpdmUgb3BlcmFuZHMuCi0JKGJ1aWxkX2luc3RydWN0aW9uKTogQ2FsbCBKQUxERUxBWVNMT1QgcmF0aGVyIHRoYW4gREVMQVlTTE9UIGZvciBhCi0JamFsIGluc3RydWN0aW9uLgotCSogaW50ZXJwLmMgKHNpbUpBTERFTEFZU0xPVCk6IERlZmluZS4KLSAJKEpBTERFTEFZU0xPVCk6IERlZmluZS4KLQkoSU5ERUxBWVNMT1QsIElOSkFMREVMQVlTTE9UKTogRGVmaW5lLgotCShzaW11bGF0ZSk6IENsZWFyIHNpbUpBTERFTEFZU0xPVCB3aGVuIHNpbURFTEFZU0xPVCBpcyBjbGVhcmVkLgotCi1UdWUgRGVjIDI0IDIyOjExOjIwIDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBhZGQgZmx1c2hfY2FjaGUgYXMgYSBQTU9OIHJvdXRpbmUKLQkoc2ltX21vbml0b3IpOiBoYW5kbGUgZmx1c2hfY2FjaGUgYnkgaWdub3JpbmcgaXQKLQotV2VkIERlYyAxMSAxMzo1Mzo1MSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBVc2UgIUJ5dGVTd2FwTWVtIGluc3RlYWQgb2YKLQlCaWdFbmRpYW5NZW0uCi0JKiBpbnRlcnAuYyAoQ09ORklHLCBjb25maWdfRVBfe21hc2ssc2hpZnQsRCxEeHhEeHgsIGNvbmZpZ19CRSk6IERlbGV0ZS4KLQkoQmlnRW5kaWFuTWVtKTogUmVuYW1lIHRvIEJ5dGVTd2FwTWVtIGFuZCBjaGFuZ2Ugc2Vuc2UuCi0JKEJpZ0VuZGlhbkNQVSwgc2ltX3dyaXRlLCBMb2FkTWVtb3J5LCBTdG9yZU1lbW9yeSk6IENoYW5nZQotCUJpZ0VuZGlhbk1lbSByZWZlcmVuY2VzIHRvICFCeXRlU3dhcE1lbS4KLQkoc2V0X2VuZGlhbm5lc3MpOiBOZXcgZnVuY3Rpb24sIHdpdGggcHJvdG90eXBlLgotCShzaW1fb3Blbik6IENhbGwgc2V0X2VuZGlhbm5lc3MuCi0JKHNpbV9pbmZvKTogVXNlIHNpbUJFIGluc3RlYWQgb2YgQmlnRW5kaWFuTWVtLgotCSh4ZmVyX2RpcmVjdF93b3JkLCB4ZmVyX2RpcmVjdF9sb25nLCBzd2FwX2RpcmVjdF93b3JkLAotCXN3YXBfZGlyZWN0X2xvbmcsIHhmZXJfYmlnX3dvcmQsIHhmZXJfYmlnX2xvbmcsIHhmZXJfbGl0dGxlX3dvcmQsCi0JeGZlcl9saXR0bGVfbG9uZywgc3dhcF93b3JkLCBzd2FwX2xvbmcpOiBEZWxldGUgdW5uZWNlc3NhcnkgTVNDX1ZFUgotCWlmZGVmcywga2VlcGluZyB0aGUgcHJvdG90eXBlIGRlY2xhcmF0aW9uLgotCShzd2FwX3dvcmQpOiBSZXdyaXRlIGNvcnJlY3RseS4KLQkoQ29sZFJlc2V0KTogRGVsZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHLiAgRGVsZXRlIGVuZGlhbm5lc3MgcmVsYXRlZAotCWNvZGU7IG1vdmVkIHRvIHNldF9lbmRpYW5uZXNzLgotCQotVHVlIERlYyAxMCAxMTozMjowNCAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24sIGNhc2UgSlVNUCk6IFRydW5jYXRlIFBDIHRvIDMyIGJpdHMuCi0JKiBpbnRlcnAuYyAoQ0hFQ0tISUxPKTogRGVmaW5lIGF3YXkuCi0JKHNpbVNJR0lOVCk6IE5ldyBtYWNyby4KLQkobWVtYmFua19zaXplKTogSW5jcmVhc2UgZnJvbSAxTUIgdG8gMk1CLgotCShjb250cm9sX2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9yZXN1bWUpOiBSZW5hbWUgcGFyYW1ldGVyIHNpZ25hbCB0byBzaWduYWxfbnVtYmVyLiAgQWRkIGxvY2FsCi0JdmFyaWFibGUgcHJldi4gIENhbGwgc2lnbmFsIGJlZm9yZSBhbmQgYWZ0ZXIgc2ltdWxhdGUuCi0JKHNpbV9zdG9wX3JlYXNvbik6IEFkZCBzaW1TSUdJTlQgc3VwcG9ydC4KLQkoc2ltX3dhcm5pbmcsIHNpbV9lcnJvciwgZG90cmFjZSwgU2lnbmFsRXhjZXB0aW9uKTogRGVmaW5lIGFzIHN0ZGFyZwotCWZ1bmN0aW9ucyBhbHdheXMuCi0JKHNpbV93YXJuaW5nKTogRGVsZXRlIGNhbGwgdG8gU2lnbmFsRXhjZXB0aW9uLiAgRG8gY2FsbCBwcmludGZfZmlsdGVyZWQKLQlpZiBsb2dmaCBpcyBOVUxMLgotCShBZGRyZXNzVHJhbnNsYXRpb24pOiBBZGQgI2lmZGVmIERFQlVHIGFyb3VuZCBkZWJ1Z2dpbmcgbWVzc2FnZSBhbmQKLQlhIGNhbGwgdG8gc2ltX3dhcm5pbmcuCi0KLVdlZCBOb3YgMjcgMTE6NTM6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogSWYgISBwcm9jNjQsIHNraXAgRE9VQkxFV09SRAotCTE2IGJpdCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBOb3YgMjYgMTE6NTM6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIG1pcHMxNiAoMTYgYml0IE1JUFMgaW1wbGVtZW50YXRpb24pOgotCSogZ2VuY29kZS5jIChpbnN0X3R5cGUpOiBBZGQgbWlwczE2IGluc3RydWN0aW9uIGVuY29kaW5nIHR5cGVzLgotCShHRVREQVRBU0laRUlOU04pOiBEZWZpbmUuCi0JKE1JUFNfREVDT0RFKTogQWRkIFJFRyBmbGFnIHRvIGRzbGx2LCBkc3JhdiwgYW5kIGRzcmx2LiAgQWRkCi0JamFseC4gIEFkZCBMRUZUIGZsYWcgdG8gbWZoaSBhbmQgbWZsby4gIEFkZCBSSUdIVCBmbGFnIHRvIG10aGkgYW5kCi0JbXRsby4KLQkoTUlQUzE2X0RFQ09ERSk6IE5ldyB0YWJsZSwgZm9yIG1pcHMxNiBpbnN0cnVjdGlvbnMuCi0JKGJpdG1hcF92YWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgbWlwczE2X29wKTogRGVmaW5lLgotCShtaXBzMTZfb3BfdGFibGUpOiBOZXcgdGFibGUsIGZvciBtaXBzMTYgb3BlcmFuZHMuCi0JKGJ1aWxkX21pcHMxNl9vcGVyYW5kcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogSWYgUEMgaXMgb2RkLCBkZWNvZGUgYSBtaXBzMTYKLQlpbnN0cnVjdGlvbi4gIEJyZWFrIG91dCBpbnN0cnVjdGlvbiBoYW5kbGluZyBpbnRvIG5ldwotCWJ1aWxkX2luc3RydWN0aW9uIGZ1bmN0aW9uLgotCShidWlsZF9pbnN0cnVjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlwcm9jZXNzX2luc3RydWN0aW9ucy4gIENoZWNrIG1vZGlmaWVycyByYXRoZXIgdGhhbiBmbGFncyBmb3IgU0hJRlQKLQliaXQgY291bnQgYW5kIG1bZnRde2hpLGxvfSBkaXJlY3Rpb24uCi0JKHVzYWdlKTogUGFzcyBwcm9ncmFtIG5hbWUgdG8gZnByaW50Zi4KLQkobWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdGhpc19vcHRpb25fb3B0aW5kLiAgQ2hhbmdlCi0JYGAqbG9wdGFyZysrJycgdG8gYGBsb3B0YXJnKysnJy4KLQkobXlfc3RydG91bCk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0JKiBpbnRlcnAuYyAoTG9hZE1lbW9yeSk6IEFjY2VwdCBhIGhhbGZ3b3JkIHBBZGRyIGlmIHZBZGRyIGlzIG9kZC4KLQkoc2ltdWxhdGUpOiBJZiBQQyBpcyBvZGQsIGZldGNoIGEgMTYgYml0IGluc3RydWN0aW9uLCBhbmQKLQlpbmNyZW1lbnQgUEMgYnkgMiByYXRoZXIgdGhhbiA0LgotCSogY29uZmlndXJlLmluOiBBZGQgY2FzZSBmb3IgbWlwczE2Ki0qLSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBOb3YgMjIgMDg6NDk6MzYgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogQWxsb3cgLXQgdG8gZW5hYmxlIHRyYWNpbmcgaW4gc3RhbmRhbG9uZSBzaW11bGF0b3IuCi0JRml4IGdhcmJhZ2Ugb3V0cHV0IGluIHRyYWNlIGZpbGUgYW5kIGVycm9yIG1lc3NhZ2VzLgotCi1XZWQgTm92IDIwIDAxOjU0OjM3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fe09CSlMsRVhUUkFfQ0ZMQUdTLEVYVFJBX0NMRUFOfSk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIHRjb25maWcuaW46IE5ldyBmaWxlLgotCi1UdWUgTm92IDEyIDEzOjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IEZpeCBidWdzIGluIDY0LWJpdCBwb3J0LgotCVVzZSBhbnNpIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgbXN2YyBjb21waWxlci4KLQlJbml0aWFsaXplIGFuZCB0ZXN0IGZpbGUgcG9pbnRlciBpbiB0cmFjZSBjb2RlLgotCVByZXZlbnQgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgTEFTVF9FTUVEX1JFR05VTS4KLQotVHVlIE9jdCAxNSAxMTowNzowNiAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jICh4ZmVyX2JpZ19sb25nKTogUHJldmVudCB1bndhbnRlZCBzaWduIGV4dGVuc2lvbi4KLQotVGh1IFNlcCAyNiAxNzozNTowMCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGludGVycC5jIChTaWduYWxFeGNlcHRpb24pOiBDaGVjayBmb3IgZXhwbGljaXQgdGVybWluYXRpbmcKLSAJYnJlYWtwb2ludCB2YWx1ZS4KLQkqIGdlbmNvZGUuYzogUGFzcyBpbnN0cnVjdGlvbiB2YWx1ZSB0aHJvdWdoIFNpZ25hbEV4Y2VwdGlvbigpCi0gCWNhbGxzIGZvciBUcmFwLCBCcmVha3BvaW50IGFuZCBTeXNjYWxsLgotCi1UaHUgU2VwIDI2IDExOjM1OjE3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogaW50ZXJwLmMgKFNxdWFyZVJvb3QpOiBBZGQgSEFWRV9TUVJUIGNoZWNrIHRvIGVuc3VyZSBzcXJ0KCkgaXMKLSAJb25seSB1c2VkIG9uIHRob3NlIGhvc3RzIHRoYXQgcHJvdmlkZSBpdC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHNxcnQoKSB0byBsaXN0IG9mIGZ1bmN0aW9ucyB0byBiZSBjaGVja2VkIGZvci4KLQkqIGNvbmZpZy5pbjogUmUtZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZWQuCi0KLUZyaSBTZXAgMjAgMTU6NDc6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogQ2FsbCBidWlsZF9lbmRpYW5fc2hpZnQgd2hlbgotCWV4cGFuZGluZyBTVE9SRSBSSUdIVCwgdG8gZml4IHN3ci4KLQkqIHN1cHBvcnQuaCAoU0lHTkVYVEVORCk6IElmIHRoZSBzaWduIGJpdCBpcyBub3Qgc2V0LCBleHBsaWNpdGx5Ci0JY2xlYXIgdGhlIGhpZ2ggYml0cy4KLQkqIGludGVycC5jIChDb252ZXJ0KTogRml4IGZtdF9zaW5nbGUgdG8gZm10X2xvbmcgdG8gbm90IHRydW5jYXRlLgotCUZpeCBmbG9hdCB0byBpbnQgY29udmVyc2lvbnMgdG8gcHJvZHVjZSBzaWduZWQgdmFsdWVzLgotCi1UaHUgU2VwIDE5IDE1OjM0OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChNSVBTX0RFQ09ERSk6IFNldCBVTlNJR05FRCBmb3IgbXVsdHUgaW5zdHJ1Y3Rpb24uCi0JKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogQ29ycmVjdCBoYW5kbGluZyBvZiBub3IgaW5zdHJ1Y3Rpb24uCi0JQ29ycmVjdCBzaGlmdCBjb3VudCBmb3IgMzIgYml0IHNoaWZ0IGluc3RydWN0aW9ucy4gQ29ycmVjdCBzaWduCi0JZXh0ZW5zaW9uIGZvciBhcml0aG1ldGljIHNoaWZ0cyB0byBub3Qgc2hpZnQgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JdGhlIHR5cGUuICBGaXggNjQgYml0IG11bHRpcGx5IGhpZ2ggd29yZCBjYWxjdWxhdGlvbi4gIEZpeCAzMiBiaXQKLQl1bnNpZ25lZCBtdWx0aXBseS4gIEZpeCBsZHhjMSBhbmQgZnJpZW5kcyB0byB1c2UgY29wcm9jZXNzb3IgMS4KLQlGaXggbWFkZC4KLQkqIGludGVycC5jIChDSEVDS0hJTE8pOiBEb24ndCBzZXQgSElBQ0NFU1MsIExPQUNDRVNTLCBvciBITFBDLgotCUl0J3MgT0sgdG8gaGF2ZSBhIG11bHQgZm9sbG93IGEgbXVsdC4gIFdoYXQncyBub3QgT0sgaXMgdG8gaGF2ZSBhCi0JbXVsdCBmb2xsb3cgYW4gbWZoaS4KLQkoQ29udmVydCk6IENvbW1lbnQgb3V0IGluY29ycmVjdCByb3VuZGluZyBjb2RlLgotCi1Nb24gU2VwIDE2IDExOjM4OjE2IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogSW1wcm92ZWQgbW9uaXRvciBwcmludGYKLSAJc2ltdWxhdGlvbi4gVGlkaWVkIHVwIHNpbXVsYXRvciB3YXJuaW5ncywgYW5kIGFkZGVkICItLWxvZyIgb3B0aW9uCi0gCWZvciBkaXJlY3Rpbmcgd2FybmluZyBtZXNzYWdlIG91dHB1dC4KLQkqIGdlbmNvZGUuYzogVXNlIHNpbV93YXJuaW5nKCkgcmF0aGVyIHRoYW4gV0FSTklORyBtYWNyby4KLQotVGh1IEF1ZyAyMiAxNTowMzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChnZW5jb2RlKTogRGVwZW5kIHVwb24gZ2VuY29kZS5vLCBnZXRvcHQubywgYW5kCi0JZ2V0b3B0MS5vLCByYXRoZXIgdGhhbiBvbiBnZW5jb2RlLmMuICBMaW5rIG9iamVjdHMgdG9nZXRoZXIuCi0JRG9uJ3QgbGluayBhZ2FpbnN0IC1saWJlcnR5LgotCShnZW5jb2RlLm8sIGdldG9wdC5vLCBnZXRvcHQxLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIGdlbmNvZGUuYzogSW5jbHVkZSA8Y3R5cGUuaD4gYW5kICJhbnNpZGVjbC5oIi4KLQkoQU5EKTogVW5kZWZpbmUgYWZ0ZXIgaW5jbHVkaW5nICJhbnNpZGVjbC5oIi4KLQkoVUxPTkdfTUFYKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShPUF8qKTogRG9uJ3QgZGVmaW5lIG1hY3Jvczsgbm93IGRlZmluZWQgaW4gb3Bjb2RlL21pcHMuaC4KLQkobWFpbik6IENhbGwgbXlfc3RydG91bCByYXRoZXIgdGhhbiBzdHJ0b3VsLgotCShteV9zdHJ0b3VsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotV2VkIEp1bCAxNyAxODoxMjozOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmMgKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogIEdlbmVyYXRlIHdvcmQ2NCBhbmQgdXdvcmQ2NAotCWluc3RlYWQgb2YgYGxvbmcgbG9uZycgYW5kIGB1bnNpZ25lZCBsb25nIGxvbmcnIGRhdGEgdHlwZXMuCi0JKiBpbnRlcnAuYzogICNpbmNsdWRlIHN5c2RlcC5oIHRvIGdldCBzaWduYWxzLCBhbmQgZGVmaW5lIGRlZmF1bHQKLQlmb3IgU0lHQlVTLgotCSogKENvbnZlcnQpOiAgV29yayBhcm91bmQgZm9yIFZpc3VhbC1DKysgY29tcGlsZXIgYnVnIHdpdGggdHlwZQotCWNvbnZlcnNpb24uCi0JKiBzdXBwb3J0Lmg6ICBNYWtlIHRoaW5ncyBjb21waWxlIHVuZGVyIFZpc3VhbC1DKysgYnkgdXNpbmcKLQlfX2ludDY0IGluc3RlYWQgb2YgYGxvbmcgbG9uZycuICBDaGFuZ2UgbWFueSByZWZzIHRvIGxvbmcgbG9uZwotCWludG8gd29yZDY0L3V3b3JkNjQgdHlwZWRlZnMuCi0KLVdlZCBKdW4gMjYgMTI6MjQ6NTUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotICAgICAgICBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotICAgICAgICAoZG9jZGlyKTogUmVtb3ZlZC4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0gICAgICAgIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkoQUNfUFJPR19DQyk6IE1vdmVkIHRvIGJlZm9yZSBjb25maWd1cmUuaG9zdCBjYWxsLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkKLVdlZCBKdW4gIDUgMDg6Mjg6MTMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBAU0lNQ09ORkAgZGVwZW5kaW5nIG9uIG1pcHMgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHJ1bik6IEFkZCBAU0lNQ09ORkAgdG8gY29udHJvbCBzaW11bGF0b3IKLSAJY29uc3RydWN0aW9uLgotCSogZ2VuY29kZS5jOiBDaGFuZ2UgTE9BRERSTUFTSyB0byA2NGJpdCBtZW1vcnkgbW9kZWwgb25seS4KLQkqIGludGVycC5jOiBSZW1vdmUgc29tZSBkZWJ1Z2dpbmcsIHByb3ZpZGUgbW9yZSBkZXRhaWxlZCBlcnJvcgotIAltZXNzYWdlcywgdXBkYXRlIG1lbW9yeSBhY2Nlc3NlcyB0byB1c2UgTE9BRERSTUFTSy4KLQkKLU1vbiBKdW4gIDMgMTE6NTU6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYWxscyB0byBBQ19DT05GSUdfSEVBREVSLCBBQ19DSEVDS19IRUFERVJTLAotCUFDX0NIRUNLX0xJQiwgYW5kIEFDX0NIRUNLX0ZVTkNTLiAgQ2hhbmdlIEFDX09VVFBVVCB0byBzZXQKLQlzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBpbnRlcnAuYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgSW5jbHVkZSA8c3RkbGliLmg+LCA8c3RyaW5nLmg+LAotCWFuZCA8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LiAgUmVwbGFjZSAjaWZkZWYgc3VuIHdpdGggI2lmZGVmCi0JSEFWRV9BTklOVCBhbmQgSEFWRV9BSU5ULCBhcyBhcHByb3ByaWF0ZS4KLQkqIE1ha2VmaWxlLmluIChydW4pOiBVc2UgQExJQlNAIHJhdGhlciB0aGFuIC1sbS4KLQkoaW50ZXJwLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUuCi0JKGNsZWFuKTogUmVtb3ZlIHN0YW1wLWguCi0JKG1vc3RseWNsZWFuKTogTWFrZSB0aGUgc2FtZSBhcyBjbGVhbiwgbm90IGFzIGRpc3RjbGVhbi4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQotRnJpIE1heSAxMCAwMDo0MToxNyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGludGVycC5jIChDb2xkUmVzZXQpOiBGaXggYm9vbGVhbiB0ZXN0LiBNYWtlIGFsbCBzaW11bGF0b3IKLSAJZ2xvYmFscyBzdGF0aWMuCi0KLVdlZCBNYXkgIDggMTU6MTI6NTggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBpbnRlcnAuYyAoeGZlcl9kaXJlY3Rfd29yZCwgeGZlcl9kaXJlY3RfbG9uZywKLQlzd2FwX2RpcmVjdF93b3JkLCBzd2FwX2RpcmVjdF9sb25nLCB4ZmVyX2JpZ193b3JkLAotCXhmZXJfYmlnX2xvbmcsIHhmZXJfbGl0dGxlX3dvcmQsIHhmZXJfbGl0dGxlX2xvbmcsCi0Jc3dhcF93b3JkLHN3YXBfbG9uZyk6IEFkZGVkLgotCSogaW50ZXJwLmMgKENvbGRSZXNldCk6IFByb3ZpZGUgZnVuY3Rpb24gaW5kaXJlY3Rpb24gdG8KLSAJaG9zdDwtPnNpbXVsYXRlZF90YXJnZXQgdHJhbnNmZXIgcm91dGluZXMuCi0JKiBpbnRlcnAuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBVcGRhdGVkIHRvCi0gCW1ha2UgdXNlIG9mIGluZGlyZWN0ZWQgdHJhbnNmZXIgcm91dGluZXMuCi0KLUZyaSBBcHIgMTkgMTU6NDg6MjQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnZW5jb2RlLmMgKHByb2Nlc3NfaW5zdHJ1Y3Rpb25zKTogRW5zdXJlIEZQIEFCUyBpbnN0cnVjdGlvbgotIAlyZWNvZ25pc2VkLgotCSogaW50ZXJwLmMgKEFic29sdXRlVmFsdWUpOiBBZGQgcm91dGluZS4gQWxzbyBwcm92aWRlIHNpbXBsZSBQTU9OCi0gCXN5c3RlbSBjYWxsIHN1cHBvcnQuCi0KLVdlZCBBcHIgMTAgMDk6NTE6MzggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBpbnRlcnAuYyAoc2ltX2RvX2NvbW1hbmQpOiBDb21wbGFpbiBpZiBjYWxsYmFjayBzdHJ1Y3R1cmUgbm90Ci0gCWluaXRpYWxpc2VkLgotCi1UaHUgTWFyIDI4IDEzOjUwOjUxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogaW50ZXJwLmMgKENvbnZlcnQpOiBQcm92aWRlIHJvdW5kLXRvLW5lYXJlc3QgYW5kIHJvdW5kLXRvLXplcm8KLSAJc3VwcG9ydCBmb3IgU3VuIGhvc3RzLgotCSogTWFrZWZpbGUuaW4gKGdlbmNvZGUpOiBFbnN1cmUgdGhlIGhvc3QgY29tcGlsZXIgYW5kIGxpYnJhcmllcwotIAl1c2VkIGZvciBjcm9zcy1ob3N0ZWQgYnVpbGQuCi0KLVdlZCBNYXIgMjcgMTQ6NDI6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBpbnRlcnAuYywgZ2VuY29kZS5jOiBTb21lIG1vcmUgKFRPRE8pIHRpZHlpbmcuCi0KLVRodSBNYXIgIDcgMTE6MTk6MzMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnZW5jb2RlLmMsIGludGVycC5jOiBSZXBsYWNlZCBleHBsaWNpdCBsb25nIGxvbmcgcmVmZXJlbmNlcyB3aXRoCi0gCVdPUkQ2NEhJLCBXT1JENjRMTywgU0VUNjRISSBhbmQgU0VUNjRMTyBtYWNybyBjYWxscy4KLQkqIHN1cHBvcnQuaCAoU0VUNjRMTywgU0VUNjRISSk6IE1hY3JvcyBhZGRlZC4KLQotV2VkIEZlYiAyMSAxMjoxNjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIEphbiAzMCAwODo0ODoxOCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKExvYWRNZW1vcnkpOiBFbmNsb3NlIHRleHQgZm9sbG93aW5nICNlbmRpZiBpbiAvKiAqLy4KLQkqIHN1cHBvcnQuaDogUmVtb3ZlIHN1cGVyZmx1b3VzICIxIiBmcm9tICNpZi4KLQkqIHN1cHBvcnQuaCAoQ0hFQ0tTSU0pOiBSZW1vdmUgc3RyYXkgJ2EnIGF0IGVuZCBvZiBsaW5lLgotCi1Nb24gRGVjICA0IDExOjQ0OjQwIDE5OTUgIEphbWllIFNtaXRoICA8anNtaXRoQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChTdG9yZUZQUik6IENvbnRyb2wgVW5kZWZpbmVkUmVzdWx0KCkgY2FsbCBvbgotIAlXQVJOX1JFU1VMVCBtYW5pZmVzdC4KLQotRnJpIERlYyAgMSAxNjozNzoxOSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdlbmNvZGUuYzogVGlkaWVkIGluc3RydWN0aW9uIGRlY29kaW5nLCBhbmQgYWRkZWQgRlAgaW5zdHJ1Y3Rpb24KLSAJc3VwcG9ydC4KLQotCSogaW50ZXJwLmM6IEFkZGVkIGRpbmVyb0lJSSwgYW5kIEJTRCBwcm9maWxpbmcgc3VwcG9ydC4gQWxzbwotIAlydW4tdGltZSBGUCBoYW5kbGluZy4KLQotU3VuIE9jdCAyMiAwMDo1NzoxOCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogQ2hhbmdlbG9nLCBNYWtlZmlsZS5pbiwgUkVBRE1FLkN5Z251cywgY29uZmlndXJlLCBjb25maWd1cmUuaW4sCi0gCWdlbmNvZGUuYywgaW50ZXJwLmMsIHN1cHBvcnQuaDogY3JlYXRlZC4KZGlmZiAtLWdpdCBhL3NpbS9taXBzL01ha2VmaWxlLmluIGIvc2ltL21pcHMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGJkNWYuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgTUlQUyBzaW11bGF0b3IuCi0jICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotc3JjZGlyPUBzcmNkaXJACi1zcmNyb290PSQoc3JjZGlyKS8uLi8uLi8KLQotIyBPYmplY3QgZmlsZXMgY3JlYXRlZCBieSB2YXJpb3VzIHNpbXVsYXRvciBnZW5lcmF0b3JzLgotCi0KLVNJTV9JR0VOX09CSiA9IFwKLQlzdXBwb3J0Lm8gXAotCWl0YWJsZS5vIFwKLQlzZW1hbnRpY3MubyBcCi0JaWRlY29kZS5vIFwKLQlpY2FjaGUubyBcCi0JQG1pcHNfaWdlbl9lbmdpbmVAIFwKLQlpcnVuLm8gXAotCi0KLVNJTV9NMTZfT0JKID0gXAotCW0xNl9zdXBwb3J0Lm8gXAotCW0xNl9zZW1hbnRpY3MubyBcCi0JbTE2X2lkZWNvZGUubyBcCi0JbTE2X2ljYWNoZS5vIFwKLQlcCi0JbTMyX3N1cHBvcnQubyBcCi0JbTMyX3NlbWFudGljcy5vIFwKLQltMzJfaWRlY29kZS5vIFwKLQltMzJfaWNhY2hlLm8gXAotCVwKLQlpdGFibGUubyBcCi0JbTE2cnVuLm8gXAotCi0KLU1JUFNfRVhUUkFfT0JKUyA9IEBtaXBzX2V4dHJhX29ianNACi1NSVBTX0VYVFJBX0xJQlMgPSBAbWlwc19leHRyYV9saWJzQAotCi1TSU1fT0JKUyA9IFwKLQkkKFNJTV9Ac2ltX2dlbkBfT0JKKSBcCi0JJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCi0JJChNSVBTX0VYVFJBX09CSlMpIFwKLQlpbnRlcnAubyBcCi0Jc2ltLW1haW4ubyBcCi0Jc2ltLWhsb2FkLm8gXAotCXNpbS1lbmdpbmUubyBcCi0Jc2ltLXN0b3AubyBcCi0Jc2ltLXJlc3VtZS5vIFwKLQlzaW0tcmVhc29uLm8gXAotCi0KLSMgTGlzdCBvZiBmbGFncyB0byBhbHdheXMgcGFzcyB0byAkKENDKS4KLVNJTV9TVUJUQVJHRVQ9QFNJTV9TVUJUQVJHRVRACi1TSU1fRVhUUkFfQ0ZMQUdTID0gJChTSU1fU1VCVEFSR0VUKQotCi1TSU1fRVhUUkFfQ0xFQU4gPSBjbGVhbi1leHRyYQotCi1TSU1fRVhUUkFfQUxMID0gJChTSU1fQHNpbV9nZW5AX0FMTCkKLQotU0lNX0VYVFJBX0xJQlMgPSAkKE1JUFNfRVhUUkFfTElCUykKLQotIyBMaXN0IG9mIG1haW4gb2JqZWN0IGZpbGVzIGZvciBgcnVuJy4KLVNJTV9SVU5fT0JKUyA9IG5ydW4ubwotCi0KLQotIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKLQotaW50ZXJwLm86ICQoc3JjZGlyKS9pbnRlcnAuYyBjb25maWcuaCBzaW0tbWFpbi5oIGl0YWJsZS5oCi0KLQotLi4vaWdlbi9pZ2VuOgotCWNkIC4uL2lnZW4gJiYgJChNQUtFKQotCi1JR0VOX1RSQUNFPSAjIC1HIG9taXQtbGluZS1udW1iZXJzICMgLUcgdHJhY2UtcnVsZS1zZWxlY3Rpb24gLUcgdHJhY2UtcnVsZS1yZWplY3Rpb24gLUcgdHJhY2UtZW50cmllcyAjIC1HIHRyYWNlLWFsbAotSUdFTl9JTlNOPSQoc3JjZGlyKS9taXBzLmlnZW4KLUlHRU5fREM9JChzcmNkaXIpL21pcHMuZGMKLU0xNl9EQz0kKHNyY2RpcikvbTE2LmRjCi1JR0VOX0lOQ0xVREU9XAotCSQoc3JjZGlyKS9tMTYuaWdlbiBcCi0JJChzcmNkaXIpL3R4LmlnZW4gXAotCSQoc3JjZGlyKS92ci5pZ2VuIFwKLQotIyBOQjoJU2luY2UgdGhlc2UgY2FuIGJlIGJ1aWx0IGJ5IGEgbnVtYmVyIG9mIGdlbmVyYXRvcnMsIGNhcmUKLSMJbXVzdCBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBvbmx5IGRlcGVuZGFudCBvbgotIwlvbmUgb2YgdGhvc2UgZ2VuZXJhdG9ycy4KLUJVSUxUX1NSQ19GUk9NX0dFTiA9IFwKLQlpdGFibGUuaCBcCi0JaXRhYmxlLmMgXAotCi1TSU1fSUdFTl9BTEwgPSB0bXAtaWdlbgotU0lNX00xNl9BTEwgPSB0bXAtbTE2Ci0KLSQoQlVJTFRfU1JDX0ZST01fR0VOKTogJChTSU1fQHNpbV9nZW5AX0FMTCkKLQotCi0KLUJVSUxUX1NSQ19GUk9NX0lHRU4gPSBcCi0JaWNhY2hlLmggXAotCWljYWNoZS5jIFwKLQlpZGVjb2RlLmggXAotCWlkZWNvZGUuYyBcCi0Jc2VtYW50aWNzLmggXAotCXNlbWFudGljcy5jIFwKLQltb2RlbC5oIFwKLQltb2RlbC5jIFwKLQlzdXBwb3J0LmggXAotCXN1cHBvcnQuYyBcCi0JZW5naW5lLmggXAotCWVuZ2luZS5jIFwKLQlpcnVuLmMgXAotCi0kKEJVSUxUX1NSQ19GUk9NX0lHRU4pOiB0bXAtaWdlbgotCi10bXAtaWdlbjogJChJR0VOX0lOU04pICQoSUdFTl9EQykgLi4vaWdlbi9pZ2VuICQoSUdFTl9JTkNMVURFKQotCWNkIC4uL2lnZW4gJiYgJChNQUtFKQotCS4uL2lnZW4vaWdlbiBcCi0JCSQoSUdFTl9UUkFDRSkgXAotCQktSSAkKHNyY2RpcikgXAotCQktV2Vycm9yIFwKLQkJLVdub2Rpc2NhcmQgXAotCQlAc2ltX2lnZW5fZmxhZ3NAIFwKLQkJLUcgZ2VuLWRpcmVjdC1hY2Nlc3MgXAotCQktRyBnZW4temVyby1yMCBcCi0JCS1CIDMyIFwKLQkJLUggMzEgXAotCQktaSAkKElHRU5fSU5TTikgXAotCQktbyAkKElHRU5fREMpIFwKLQkJLXggXAotCQktbiBpY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKLQkJLW4gaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCi0JCS1uIHNlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAotCQktbiBzZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKLQkJLW4gaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAotCQktbiBpZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCi0JCS1uIG1vZGVsLmggICAgIC1obSB0bXAtbW9kZWwuaCBcCi0JCS1uIG1vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCi0JCS1uIHN1cHBvcnQuaCAgIC1oZiB0bXAtc3VwcG9ydC5oIFwKLQkJLW4gc3VwcG9ydC5jICAgLWYgIHRtcC1zdXBwb3J0LmMgXAotCQktbiBpdGFibGUuaCAgICAtaHQgdG1wLWl0YWJsZS5oIFwKLQkJLW4gaXRhYmxlLmMgICAgLXQgIHRtcC1pdGFibGUuYyBcCi0JCS1uIGVuZ2luZS5oICAgIC1oZSB0bXAtZW5naW5lLmggXAotCQktbiBlbmdpbmUuYyAgICAtZSAgdG1wLWVuZ2luZS5jIFwKLQkJLW4gaXJ1bi5jICAgICAgLXIgIHRtcC1pcnVuLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5oIGljYWNoZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuYyBpY2FjaGUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5oIGlkZWNvZGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5jIGlkZWNvZGUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmggc2VtYW50aWNzLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5jIHNlbWFudGljcy5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5oIG1vZGVsLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmMgbW9kZWwuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5oIHN1cHBvcnQuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5jIHN1cHBvcnQuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmggaXRhYmxlLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5jIGl0YWJsZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1lbmdpbmUuaCBlbmdpbmUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZW5naW5lLmMgZW5naW5lLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlydW4uYyBpcnVuLmMKLQl0b3VjaCB0bXAtaWdlbgotCi1zZW1hbnRpY3Mubzogc2ltLW1haW4uaCBzZW1hbnRpY3MuYyAkKFNJTV9FWFRSQV9ERVBTKQotZW5naW5lLm86IHNpbS1tYWluLmggZW5naW5lLmMgJChTSU1fRVhUUkFfREVQUykKLXN1cHBvcnQubzogc2ltLW1haW4uaCBzdXBwb3J0LmMgJChTSU1fRVhUUkFfREVQUykKLWlkZWNvZGUubzogc2ltLW1haW4uaCBpZGVjb2RlLmMgJChTSU1fRVhUUkFfREVQUykKLWl0YWJsZS5vOiBzaW0tbWFpbi5oIGl0YWJsZS5jICQoU0lNX0VYVFJBX0RFUFMpCi0KLQotCi0KLUJVSUxUX1NSQ19GUk9NX00xNiA9IFwKLQltMTZfaWNhY2hlLmggXAotCW0xNl9pY2FjaGUuYyBcCi0JbTE2X2lkZWNvZGUuaCBcCi0JbTE2X2lkZWNvZGUuYyBcCi0JbTE2X3NlbWFudGljcy5oIFwKLQltMTZfc2VtYW50aWNzLmMgXAotCW0xNl9tb2RlbC5oIFwKLQltMTZfbW9kZWwuYyBcCi0JbTE2X3N1cHBvcnQuaCBcCi0JbTE2X3N1cHBvcnQuYyBcCi0JXAotCW0zMl9pY2FjaGUuaCBcCi0JbTMyX2ljYWNoZS5jIFwKLQltMzJfaWRlY29kZS5oIFwKLQltMzJfaWRlY29kZS5jIFwKLQltMzJfc2VtYW50aWNzLmggXAotCW0zMl9zZW1hbnRpY3MuYyBcCi0JbTMyX21vZGVsLmggXAotCW0zMl9tb2RlbC5jIFwKLQltMzJfc3VwcG9ydC5oIFwKLQltMzJfc3VwcG9ydC5jIFwKLQotJChCVUlMVF9TUkNfRlJPTV9NMTYpOiB0bXAtbTE2Ci0KLXRtcC1tMTY6ICQoSUdFTl9JTlNOKSAkKElHRU5fREMpIC4uL2lnZW4vaWdlbiAkKElHRU5fSU5DTFVERSkKLQljZCAuLi9pZ2VuICYmICQoTUFLRSkKLQkuLi9pZ2VuL2lnZW4gXAotCQkkKElHRU5fVFJBQ0UpIFwKLQkJLUkgJChzcmNkaXIpIFwKLQkJLVdlcnJvciBcCi0JCS1Xbm9kaXNjYXJkIFwKLQkJQHNpbV9tMTZfZmxhZ3NAIFwKLQkJLUcgZ2VuLWRpcmVjdC1hY2Nlc3MgXAotCQktRyBnZW4temVyby1yMCBcCi0JCS1CIDE2IFwKLQkJLUggMTUgXAotCQktaSAkKElHRU5fSU5TTikgXAotCQktbyAkKE0xNl9EQykgXAotCQktUCBtMTZfIFwKLQkJLXggXAotCQktbiBtMTZfaWNhY2hlLmggICAgLWhjIHRtcC1pY2FjaGUuaCBcCi0JCS1uIG0xNl9pY2FjaGUuYyAgICAtYyAgdG1wLWljYWNoZS5jIFwKLQkJLW4gbTE2X3NlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAotCQktbiBtMTZfc2VtYW50aWNzLmMgLXMgIHRtcC1zZW1hbnRpY3MuYyBcCi0JCS1uIG0xNl9pZGVjb2RlLmggICAtaGQgdG1wLWlkZWNvZGUuaCBcCi0JCS1uIG0xNl9pZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCi0JCS1uIG0xNl9tb2RlbC5oICAgICAtaG0gdG1wLW1vZGVsLmggXAotCQktbiBtMTZfbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKLQkJLW4gbTE2X3N1cHBvcnQuaCAgIC1oZiB0bXAtc3VwcG9ydC5oIFwKLQkJLW4gbTE2X3N1cHBvcnQuYyAgIC1mICB0bXAtc3VwcG9ydC5jIFwKLQkJIwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggbTE2X2ljYWNoZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuYyBtMTZfaWNhY2hlLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuaCBtMTZfaWRlY29kZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgbTE2X2lkZWNvZGUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmggbTE2X3NlbWFudGljcy5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuYyBtMTZfc2VtYW50aWNzLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmggbTE2X21vZGVsLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmMgbTE2X21vZGVsLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBtMTZfc3VwcG9ydC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmMgbTE2X3N1cHBvcnQuYwotCS4uL2lnZW4vaWdlbiBcCi0JCSQoSUdFTl9UUkFDRSkgXAotCQktSSAkKHNyY2RpcikgXAotCQktV2Vycm9yIFwKLQkJLVdub2Rpc2NhcmQgXAotCQlAc2ltX2lnZW5fZmxhZ3NAIFwKLQkJLUcgZ2VuLWRpcmVjdC1hY2Nlc3MgXAotCQktRyBnZW4temVyby1yMCBcCi0JCS1CIDMyIFwKLQkJLUggMzEgXAotCQktaSAkKElHRU5fSU5TTikgXAotCQktbyAkKElHRU5fREMpIFwKLQkJLVAgbTMyXyBcCi0JCS14IFwKLQkJLW4gbTMyX2ljYWNoZS5oICAgIC1oYyB0bXAtaWNhY2hlLmggXAotCQktbiBtMzJfaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCi0JCS1uIG0zMl9zZW1hbnRpY3MuaCAtaHMgdG1wLXNlbWFudGljcy5oIFwKLQkJLW4gbTMyX3NlbWFudGljcy5jIC1zICB0bXAtc2VtYW50aWNzLmMgXAotCQktbiBtMzJfaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAotCQktbiBtMzJfaWRlY29kZS5jICAgLWQgIHRtcC1pZGVjb2RlLmMgXAotCQktbiBtMzJfbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKLQkJLW4gbTMyX21vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCi0JCS1uIG0zMl9zdXBwb3J0LmggICAtaGYgdG1wLXN1cHBvcnQuaCBcCi0JCS1uIG0zMl9zdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYyBcCi0JCSMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5oIG0zMl9pY2FjaGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgbTMyX2ljYWNoZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggbTMyX2lkZWNvZGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5jIG0zMl9pZGVjb2RlLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIG0zMl9zZW1hbnRpY3MuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgbTMyX3NlbWFudGljcy5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5oIG0zMl9tb2RlbC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG0zMl9tb2RlbC5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmggbTMyX3N1cHBvcnQuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5jIG0zMl9zdXBwb3J0LmMKLQkuLi9pZ2VuL2lnZW4gXAotCQkkKElHRU5fVFJBQ0UpIFwKLQkJLUkgJChzcmNkaXIpIFwKLQkJLVdlcnJvciBcCi0JCS1Xbm9kaXNjYXJkIFwKLQkJLVdub3dpZHRoIFwKLQkJQHNpbV9pZ2VuX2ZsYWdzQCBAc2ltX20xNl9mbGFnc0AgXAotCQktRyBnZW4tZGlyZWN0LWFjY2VzcyBcCi0JCS1HIGdlbi16ZXJvLXIwIFwKLQkJLWkgJChJR0VOX0lOU04pIFwKLQkJLW4gaXRhYmxlLmggICAgLWh0IHRtcC1pdGFibGUuaCBcCi0JCS1uIGl0YWJsZS5jICAgIC10ICB0bXAtaXRhYmxlLmMgXAotCQkjCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuaCBpdGFibGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmMgaXRhYmxlLmMKLQl0b3VjaCB0bXAtbTE2Ci0KLQotY2xlYW4tZXh0cmE6Ci0Jcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9HRU4pCi0Jcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9JR0VOKQotCXJtIC1mICQoQlVJTFRfU1JDX0ZST01fTTE2KQotCXJtIC1mIHRtcC0qCi0Jcm0gLWYgbTE2KiBtMzIqIGl0YWJsZSoKLQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvYWNjb25maWcuaCBiL3NpbS9taXBzL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg3YTEuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvY29uZmlnLmluIGIvc2ltL21pcHMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ2NTA4Li4wMDAwMDAwCi0tLSBhL3NpbS9taXBzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gICBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAgKi8KLSN1bmRlZiBXT1JEU19CSUdFTkRJQU4KLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fU0VURlBVQ1cKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhaW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FJTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhbmludCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BTklOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzcXJ0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NRUlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbSBsaWJyYXJ5ICgtbG0pLiAgKi8KLSN1bmRlZiBIQVZFX0xJQk0KZGlmZiAtLWdpdCBhL3NpbS9taXBzL2NvbmZpZ3VyZSBiL3NpbS9taXBzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I5NDAwNS4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0OTg4ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1pbmxpbmU9aW5saW5lcwkJU3BlY2lmeSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGlubGluZWQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYml0c2l6ZT1OCQlTcGVjaWZ5IHRhcmdldCBiaXRzaXplICgzMiBvciA2NCkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWZsb2F0CQkJU3BlY2lmeSB0aGF0IHRoZSB0YXJnZXQgcHJvY2Vzc29yIGhhcyBmbG9hdGluZyBwb2ludCBoYXJkd2FyZS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc21wPW4JCQlTcGVjaWZ5IG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIGNvbmZpZ3VyZSBmb3IgKGRlZmF1bHQgJHtkZWZhdWx0X3NpbV9zbXB9KS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9TElTVAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC14ICAgICAgICAgICAgICAgIHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDc0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODA2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4Mjc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDgzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MzE6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDA2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDIwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA0NjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDc5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjE3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM0OTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzNTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYxMjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYyODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY0NTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjUwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzYzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgzNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NjI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTY3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTc2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxNTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTgxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzAwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzUzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM4MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzOTk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQxMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NjI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NTk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4ODc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4OTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDE2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTI1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxODA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIyNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQyMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ2NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLQotZGVmYXVsdF9zaW1faW5saW5lPSIiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWlubGluZSBvciAtLWRpc2FibGUtc2ltLWlubGluZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faW5saW5lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faW5saW5lIgotICBzaW1faW5saW5lPSIiCi1jYXNlICIkZW5hYmxldmFsIiBpbgotICBubykJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICAwKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7Ci0gIHllcyB8IDIpCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7Ci0gIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKLSAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0gICAgICAgbmV3X2ZsYWc9IiIKLSAgICAgICBjYXNlICIkeCIgaW4KLQkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKLQkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7Ci0JICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfQ19JTkxJTkUiOzsKLQkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9DX0lOTElORSI7OwotICAgICAgIGVzYWMKLSAgICAgICBpZiB0ZXN0IHgiJHNpbV9pbmxpbmUiID0geCIiOyB0aGVuCi0JIHNpbV9pbmxpbmU9IiRuZXdfZmxhZyIKLSAgICAgICBlbHNlCi0JIHNpbV9pbmxpbmU9IiRzaW1faW5saW5lICRuZXdfZmxhZyIKLSAgICAgICBmaQotICAgICBkb25lOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faW5saW5lIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQotZmkKLWVsc2UKLSAgCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCi0gICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgotICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLSAgICBmaQotICBlbHNlCi0gICAgc2ltX2lubGluZT0iIgotICBmaQotZWxzZQotICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCi1maQotZmkKLQotd2lyZV9hbGlnbm1lbnQ9Ik5PTlNUUklDVF9BTElHTk1FTlQiCi1kZWZhdWx0X2FsaWdubWVudD0iIgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7Ci0gIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLQkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyNjogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgotICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7Ci0gICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7Ci0gICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCi1maQotV0FSTl9DRkxBR1M9IiIKLVdFUlJPUl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotdGhlbgotICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKLSAgIyBjb21waWxlZCB3aXRoIGl0IGVuYWJsZWQuCi0gIGZvciB3IGluICR7YnVpbGRfd2FybmluZ3N9OyBkbwotICAgIGNhc2UgJHcgaW4KLSAgICAtV2VyciopIFdFUlJPUl9DRkxBR1M9LVdlcnJvciA7OwotICAgICopIFdBUk5fQ0ZMQUdTPSIke1dBUk5fQ0ZMQUdTfSAkdyIKLSAgICBlc2FjCi0gIGRvbmUKLWZpCi1lbHNlCi0gIGJ1aWxkX3dhcm5pbmdzPSIiCi1maQotCi0KLSMgREVQUkVDQVRFRAotIwotIyBJbnN0ZWFkIG9mIGRlZmluaW5nIGEgYHN1YnRhcmdldCcgbWFjcm8sIGNvZGUgc2hvdWxkIGJlIGNoZWNraW5nCi0jIHRoZSB2YWx1ZSBvZiB7U1RBVEUsQ1BVfV9BUkNISVRFQ1RVUkUgdG8gaWRlbnRpZnkgdGhlIGFyY2hpdGVjdHVyZQotIyBpbiBxdWVzdGlvbi4KLSMKLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgbWlwcyp0eDM5KikgICAgICAgICAgIFNJTV9TVUJUQVJHRVQ9Ii1EU1VCVEFSR0VUX1IzOTAwPTEiOzsKLSAgKikgICAgICAgICAgICAgICAgICAgIFNJTV9TVUJUQVJHRVQ9IiI7OwotZXNhYwotCi0KLQotCi0jCi0jIFNlbGVjdCB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgdGFyZ2V0Ci0jCi1taXBzX2VuZGlhbj0KLWRlZmF1bHRfZW5kaWFuPQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzNjRlbCotKi0qKQltaXBzX2VuZGlhbj1MSVRUTEVfRU5ESUFOIDs7Ci0gIG1pcHM2NHZyKmVsLSotKikgICAgICBkZWZhdWx0X2VuZGlhbj1MSVRUTEVfRU5ESUFOIDs7Ci0gIG1pcHM2NCotKi0qKSAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gIG1pcHMxNiotKi0qKSAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gIG1pcHMqLSotKikgICAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gICopICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci1lc2FjCi0KLXdpcmVfZW5kaWFuPSIkbWlwc19lbmRpYW4iCi1kZWZhdWx0X2VuZGlhbj0iJGRlZmF1bHRfZW5kaWFuIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKLSAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gIHllcykJIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCi0JIGVsc2UKLSAgICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgotCSAgIGVsc2UKLQkgICAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICBubykJIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgZWxzZQotCSAgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSAgIGVsc2UKLQkgICAgIGVjaG8gIk5vIGRlZmF1bHQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgotCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9MCIKLQkgICBmaQotCSBmaTs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0gIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgotZWxzZQotICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0gICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotICBlbHNlCi0gICAgc2ltX2VuZGlhbj0KLSAgZmkKLWZpCi1maQotCi0KLQotCi0jCi0jIFNlbGVjdCB0aGUgYml0c2l6ZSBvZiB0aGUgdGFyZ2V0Ci0jCi1taXBzX2FkZHJfYml0c2l6ZT0KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgbWlwczY0Ki0qLSopICAgICAgICAgIG1pcHNfYml0c2l6ZT02NCA7IG1pcHNfbXNiPTYzIDs7Ci0gIG1pcHMxNiotKi0qKSAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OwotICBtaXBzKi0qLSopICAgICAgICAgICAgbWlwc19iaXRzaXplPTMyIDsgbWlwc19tc2I9MzEgOzsKLSAgKikgICAgICAgICAgICAgICAgICAgIG1pcHNfYml0c2l6ZT02NCA7IG1pcHNfbXNiPTYzIDs7Ci1lc2FjCi13aXJlX3dvcmRfYml0c2l6ZT0iJG1pcHNfYml0c2l6ZSIKLXdpcmVfd29yZF9tc2I9IiRtaXBzX21zYiIKLXdpcmVfYWRkcmVzc19iaXRzaXplPSIkbWlwc19hZGRyX2JpdHNpemUiCi13aXJlX2NlbGxfYml0c2l6ZT0iIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1iaXRzaXplIG9yIC0tZGlzYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYml0c2l6ZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2JpdHNpemUiCi0gIHNpbV9iaXRzaXplPQotY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICA2NCw2MyB8IDY0LDYzLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyI7OwotICAzMiwzMSB8IDMyLDMxLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSI7OwotICA2NCwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OwotICAzMiwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OwotICAzMikgaWYgdGVzdCB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4IC1hIHgiJHdpcmVfd29yZF9tc2IiICE9IHgwOyB0aGVuCi0gICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTMxIgotICAgICAgZWxzZQotICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIgotICAgICAgZmkgOzsKLSAgNjQpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgotICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyIKLSAgICAgIGVsc2UKLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKLSAgICAgIGZpIDs7Ci0gICopICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0jIGFkZHJlc3MgYml0c2l6ZQotdG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bMC05XSosKlswLTldKiwqLy8iYAotY2FzZSB4IiR7dG1wfSIgaW4KLSAgeCApIDs7Ci0gIHgzMiB8IHgzMiwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFPTMyIiA7OwotICB4NjQgfCB4NjQsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT02NCIgOzsKLSAgKiApIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiBhZGRyZXNzIHNpemUgJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0jIGNlbGwgYml0c2l6ZQotdG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bMC05XSosKlswLTkqXSosKlswLTldKiwqLy8iYAotY2FzZSB4IiR7dG1wfSIgaW4KLSAgeCApIDs7Ci0gIHgzMiB8IHgzMiwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPTMyIiA7OwotICB4NjQgfCB4NjQsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT02NCIgOzsKLSAgKiApIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiBjZWxsIHNpemUgJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2JpdHNpemUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGJpdHNpemUgZmxhZ3MgPSAkc2ltX2JpdHNpemUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9iaXRzaXplPSIiCi1pZiB0ZXN0IHgiJHdpcmVfd29yZF9iaXRzaXplIiAhPSB4OyB0aGVuCi0gIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9JHdpcmVfd29yZF9iaXRzaXplIgotZmkKLWlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9JHdpcmVfd29yZF9tc2IiCi1maQotaWYgdGVzdCB4IiR3aXJlX2FkZHJlc3NfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFPSR3aXJlX2FkZHJlc3NfYml0c2l6ZSIKLWZpCi1pZiB0ZXN0IHgiJHdpcmVfY2VsbF9iaXRzaXplIiAhPSB4OyB0aGVuCi0gIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9JHdpcmVfY2VsbF9iaXRzaXplIgotZmkKLWZpCi0KLQotCi0KLSMKLSMgU2VsZWN0IHRoZSBmbG9hdGluZyBoYXJkd2FyZSBzdXBwb3J0IG9mIHRoZSB0YXJnZXQKLSMKLW1pcHNfZnB1PUhBUkRXQVJFX0ZMT0FUSU5HX1BPSU5UCi1taXBzX2ZwdV9iaXRzaXplPQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKnR4MzkqKQkJbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVAotCQkJbWlwc19mcHVfYml0c2l6ZT0zMgotCQkJOzsKLSAgbWlwczY0Ki0qLSopICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOzsKLSAgbWlwczE2Ki0qLSopICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOzsKLSAgbWlwcyotKi0qKSAgICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOyBtaXBzX2ZwdV9iaXRzaXplPTMyIDs7Ci0gICopICAgICAgICAgICAgICAgICAgICBtaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UIDs7Ci1lc2FjCi0KLWRlZmF1bHRfc2ltX2Zsb2F0PSIkbWlwc19mcHUiCi1kZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplPSIkbWlwc19mcHVfYml0c2l6ZSIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZmxvYXQgb3IgLS1kaXNhYmxlLXNpbS1mbG9hdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZmxvYXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9mbG9hdCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCBoYXJkKQlzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1IQVJEX0ZMT0FUSU5HX1BPSU5UIjs7Ci0gIG5vIHwgc29mdCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9U09GVF9GTE9BVElOR19QT0lOVCI7OwotICAzMikgICAgICAgICAgIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPUhBUkRfRkxPQVRJTkdfUE9JTlQgLURXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFPTMyIjs7Ci0gIDY0KSAgICAgICAgICAgc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCAtRFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkU9NjQiOzsKLSAgKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWZsb2F0IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZmxvYXQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9mbG9hdCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZmxvYXQgZmxhZ3MgPSAkc2ltX2Zsb2F0IiA2PiYxCi1maQotZWxzZQotICAKLXNpbV9mbG9hdD0KLWlmIHRlc3QgeCIke2RlZmF1bHRfc2ltX2Zsb2F0fSIgIT0geCIiOyB0aGVuCi0gIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPSR7ZGVmYXVsdF9zaW1fZmxvYXR9IgotZmkKLWlmIHRlc3QgeCIke2RlZmF1bHRfc2ltX2Zsb2F0X2JpdHNpemV9IiAhPSB4IiI7IHRoZW4KLSAgc2ltX2Zsb2F0PSIkc2ltX2Zsb2F0IC1EV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRT0ke2RlZmF1bHRfc2ltX2Zsb2F0X2JpdHNpemV9IgotZmkKLQotZmkKLQotCi0KLQotIwotIyBTZWxlY3QgdGhlIGxldmVsIG9mIFNNUCBzdXBwb3J0Ci0jCi1jYXNlICIke3RhcmdldH0iIGluCi0gICopICAgICAgICAgICAgICAgICAgICBtaXBzX3NtcD0wIDs7Ci1lc2FjCi0KLWRlZmF1bHRfc2ltX3NtcD0iJG1pcHNfc21wIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zbXAgb3IgLS1kaXNhYmxlLXNpbS1zbXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3NtcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3NtcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiOzsKLSAgbm8pCXNpbV9zbXA9Ii1EV0lUSF9TTVA9MCIgOyBzaW1faWdlbl9zbXA9Ii1OIDAiOzsKLSAgKikJc2ltX3NtcD0iLURXSVRIX1NNUD0kZW5hYmxldmFsIiA7IHNpbV9pZ2VuX3NtcD0iLU4gJGVuYWJsZXZhbCI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zbXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNtcCBmbGFncyA9ICRzaW1fc21wIiA2PiYxCi1maQotZWxzZQotICBzaW1fc21wPSItRFdJVEhfU01QPSR7ZGVmYXVsdF9zaW1fc21wfSIgOyBzaW1faWdlbl9zbXA9Ii1OICR7ZGVmYXVsdF9zaW1fc21wfSIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzbXAgZmxhZ3MgPSAkc2ltX3NtcCIgNj4mMQotZmkKLWZpCi0KLQotCi0KLSMKLSMgU2VsZWN0IHRoZSBJR0VOIGFyY2hpdGVjdHVyZQotIwotc2ltX2dlbj1JR0VOCi1zaW1faWdlbl9tYWNoaW5lPSItTSBtaXBzSVYiCi1zaW1fbTE2X21hY2hpbmU9Ii1NIG1pcHMxNiIKLXNpbV9pZ2VuX2ZpbHRlcj0iMzIsNjQsZiIKLXNpbV9tMTZfZmlsdGVyPSIxNiIKLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgbWlwcyp0eDM5KikJCXNpbV9nZW49SUdFTgotCQkJc2ltX2lnZW5fZmlsdGVyPSIzMixmIgotCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gcjM5MDAiCi0JCQk7OwotICBtaXBzNjR2cjQzKi0qLSopCXNpbV9nZW49SUdFTgotCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gbWlwc0lWIgotCQkJOzsKLSAgbWlwczY0dnI1Ki0qLSopCXNpbV9nZW49SUdFTgotCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gdnI1MDAwIgotCQkJOzsKLSAgbWlwczY0dnI0MSopCQlzaW1fZ2VuPU0xNgotCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gdnI0MTAwIgotCQkJc2ltX20xNl9tYWNoaW5lPSItTSB2cjQxMDAiCi0JCQlzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCi0JCQlzaW1fbTE2X2ZpbHRlcj0iMTYiCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICBtaXBzNjQqLSotKikJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsNjQsZiIKLQkJCXNpbV9nZW49SUdFTgotCQkJOzsKLSAgbWlwczE2Ki0qLSopCQlzaW1fZ2VuPU0xNgotCQkJc2ltX2lnZW5fZmlsdGVyPSIzMiw2NCxmIgotCQkJc2ltX20xNl9maWx0ZXI9IjE2IgotCQkJOzsKLSAgbWlwcypsc2kqKQkgICAgICAgIHNpbV9nZW49TTE2Ci0JCQlzaW1faWdlbl9tYWNoaW5lPSItTSBtaXBzSUlJLG1pcHMxNiIKLQkJCXNpbV9tMTZfbWFjaGluZT0iLU0gbWlwczE2LG1pcHNJSUkiCi0JCQlzaW1faWdlbl9maWx0ZXI9IjMyLGYiCi0JCQlzaW1fbTE2X2ZpbHRlcj0iMTYiCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICBtaXBzKi0qLSopCQlzaW1fZ2VuPUlHRU4KLQkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsZiIKLQkJCTs7Ci1lc2FjCi1zaW1faWdlbl9mbGFncz0iLUYgJHtzaW1faWdlbl9maWx0ZXJ9ICR7c2ltX2lnZW5fbWFjaGluZX0gJHtzaW1faWdlbl9zbXB9Igotc2ltX20xNl9mbGFncz0iIC1GICR7c2ltX20xNl9maWx0ZXJ9ICAke3NpbV9tMTZfbWFjaGluZX0gICR7c2ltX2lnZW5fc21wfSIKLQotCi0KLQotCi0jCi0jIEFkZCBzaW11bGF0ZWQgaGFyZHdhcmUgZGV2aWNlcwotIwotaHdfZW5hYmxlZD1ubwotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKnR4MzkqKQotCWh3X2VuYWJsZWQ9eWVzCi0JaHdfZXh0cmFfZGV2aWNlcz0idHgzOTA0Y3B1IHR4MzkwNGlyYyB0eDM5MDR0bXIgdHgzOTA0c2lvIiAKLQltaXBzX2V4dHJhX29ianM9ImR2LXNvY2tzZXIubyIKLQlTSU1fU1VCVEFSR0VUPSIkU0lNX1NVQlRBUkdFVCAtRFRBUkdFVF9UWDM5MDQ9MSIKLQk7OwotICAqKQotCW1pcHNfZXh0cmFfb2Jqcz0iIiAKLQk7OwotZXNhYwotCi1pZiB0ZXN0IHgiJGh3X2VuYWJsZWQiID0geCJ5ZXMiOyB0aGVuCi0gIHNpbV9od19wPXllcwotZWxzZQotICBzaW1faHdfcD1ubwotZmkKLWlmIHRlc3QgIiRod19kZXZpY2VzIjsgdGhlbgotICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSIKLWVsc2UKLSAgaGFyZHdhcmU9ImNvcmUgcGFsIGdsdWUgJGh3X2V4dHJhX2RldmljZXMiCi1maQotc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTEiCi1zaW1faHc9IiRoYXJkd2FyZSIKLXNpbV9od19vYmpzPSJcJChTSU1fQ09NTU9OX0hXX09CSlMpIGBlY2hvICRzaW1faHcgfCBzZWQgLWUgJ3MvXChbXiBdW14gXSpcKS9kdi1cMS5vL2cnYCIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taGFyZHdhcmUgb3IgLS1kaXNhYmxlLXNpbS1oYXJkd2FyZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faGFyZHdhcmUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9oYXJkd2FyZSIKLSAgCi1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2h3X3A9eWVzOzsKLSAgbm8pCXNpbV9od19wPW5vOzsKLSAgLCopICAgc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iJHtoYXJkd2FyZX0gYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCI7OwotICAqLCkgICBzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSJgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgICR7aGFyZHdhcmV9Ijs7Ci0gICopCXNpbV9od19wPXllczsgaGFyZHdhcmU9ImBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AiJyc7OwotZXNhYwotaWYgdGVzdCAiJHNpbV9od19wIiAhPSB5ZXM7IHRoZW4KLSAgc2ltX2h3X29ianM9Ci0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0wIgotICBzaW1faHc9Ci1lbHNlCi0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgotICAjIHJlbW92ZSBkdXBsaWNhdGVzCi0gIHNpbV9odz0iIgotICBzaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSIKLSAgZm9yIGkgaW4geCAkaGFyZHdhcmUgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgICB4KSA7OwotICAgICAgKiIgJGkgIiopIDs7Ci0gICAgICAqKSBzaW1faHc9IiRzaW1faHcgJGkiIDsgc2ltX2h3X29ianM9IiRzaW1faHdfb2JqcyBkdi0kaS5vIjs7Ci0gICAgZXNhYwotICBkb25lCi1maQotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0ICIkc2ltX2h3X3AiID0gInllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgotZmkKLWVsc2UKLSAgCi1pZiB0ZXN0ICIkc2ltX2h3X3AiICE9IHllczsgdGhlbgotICBzaW1faHdfb2Jqcz0KLSAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTAiCi0gIHNpbV9odz0KLWZpCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKLWZpCi1maQotCi0KLQotCi0jIENob29zZSBzaW11bGF0b3IgZW5naW5lCi1jYXNlICIke3RhcmdldH0iIGluCi0gICopICAgIG1pcHNfaWdlbl9lbmdpbmU9ImVuZ2luZS5vIgotCTs7Ci1lc2FjCi0KLQotCi0jIElmIHdlIGZpbmQgWCwgc2V0IHNoZWxsIHZhcnMgeF9pbmNsdWRlcyBhbmQgeF9saWJyYXJpZXMgdG8gdGhlCi0jIHBhdGhzLCBvdGhlcndpc2Ugc2V0IG5vX3g9eWVzLgotIyBVc2VzIGFjXyB2YXJzIGFzIHRlbXBzIHRvIGFsbG93IGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSBjYWNoZSBhbmQgY2hlY2tzLgotIyAtLXdpdGhvdXQteCBvdmVycmlkZXMgZXZlcnl0aGluZyBlbHNlLCBidXQgZG9lcyBub3QgdG91Y2ggdGhlIGNhY2hlLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMjA6IGNoZWNraW5nIGZvciBYIiA+JjUKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX3giCi0gIDoKLWZpCi0KLSMgJGhhdmVfeCBpcyBgeWVzJywgYG5vJywgYGRpc2FibGVkJywgb3IgZW1wdHkgd2hlbiB3ZSBkbyBub3QgeWV0IGtub3cuCi1pZiB0ZXN0ICJ4JHdpdGhfeCIgPSB4bm87IHRoZW4KLSAgIyBUaGUgdXNlciBleHBsaWNpdGx5IGRpc2FibGVkIFguCi0gIGhhdmVfeD1kaXNhYmxlZAotZWxzZQotICBpZiB0ZXN0ICJ4JHhfaW5jbHVkZXMiICE9IHhOT05FICYmIHRlc3QgIngkeF9saWJyYXJpZXMiICE9IHhOT05FOyB0aGVuCi0gICAgIyBCb3RoIHZhcmlhYmxlcyBhcmUgYWxyZWFkeSBzZXQuCi0gICAgaGF2ZV94PXllcwotICBlbHNlCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGF2ZV94JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KLWFjX3hfaW5jbHVkZXM9Tk8gYWNfeF9saWJyYXJpZXM9Tk8KLXJtIC1mciBjb25mdGVzdGRpcgotaWYgbWtkaXIgY29uZnRlc3RkaXI7IHRoZW4KLSAgY2QgY29uZnRlc3RkaXIKLSAgIyBNYWtlIHN1cmUgdG8gbm90IHB1dCAibWFrZSIgaW4gdGhlIEltYWtlZmlsZSBydWxlcywgc2luY2Ugd2UgZ3JlcCBpdCBvdXQuCi0gIGNhdCA+IEltYWtlZmlsZSA8PCdFT0YnCi1hY2ZpbmR4OgotCUBlY2hvICdhY19pbV9pbmNyb290PSIke0lOQ1JPT1R9IjsgYWNfaW1fdXNybGliZGlyPSIke1VTUkxJQkRJUn0iOyBhY19pbV9saWJkaXI9IiR7TElCRElSfSInCi1FT0YKLSAgaWYgKHhta21mKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYmIHRlc3QgLWYgTWFrZWZpbGU7IHRoZW4KLSAgICAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLSAgICBldmFsIGAke01BS0UtbWFrZX0gYWNmaW5keCAyPi9kZXYvbnVsbCB8IGdyZXAgLXYgbWFrZWAKLSAgICAjIE9wZW4gV2luZG93cyB4bWttZiByZXBvcnRlZGx5IHNldHMgTElCRElSIGluc3RlYWQgb2YgVVNSTElCRElSLgotICAgIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbDsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAkYWNfaW1fdXNybGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uICYmCi0gICAgICAgIHRlc3QgLWYgJGFjX2ltX2xpYmRpci9saWJYMTEuJGFjX2V4dGVuc2lvbjsgdGhlbgotICAgICAgICBhY19pbV91c3JsaWJkaXI9JGFjX2ltX2xpYmRpcjsgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgICMgU2NyZWVuIG91dCBib2d1cyB2YWx1ZXMgZnJvbSB0aGUgaW1ha2UgY29uZmlndXJhdGlvbi4gIFRoZXkgYXJlCi0gICAgIyBib2d1cyBib3RoIGJlY2F1c2UgdGhleSBhcmUgdGhlIGRlZmF1bHQgYW55d2F5LCBhbmQgYmVjYXVzZQotICAgICMgdXNpbmcgdGhlbSB3b3VsZCBicmVhayBnY2Mgb24gc3lzdGVtcyB3aGVyZSBpdCBuZWVkcyBmaXhlZCBpbmNsdWRlcy4KLSAgICBjYXNlICIkYWNfaW1faW5jcm9vdCIgaW4KLQkvdXNyL2luY2x1ZGUpIDs7Ci0JKikgdGVzdCAtZiAiJGFjX2ltX2luY3Jvb3QvWDExL1hvcy5oIiAmJiBhY194X2luY2x1ZGVzPSIkYWNfaW1faW5jcm9vdCIgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiJGFjX2ltX3VzcmxpYmRpciIgaW4KLQkvdXNyL2xpYiB8IC9saWIpIDs7Ci0JKikgdGVzdCAtZCAiJGFjX2ltX3VzcmxpYmRpciIgJiYgYWNfeF9saWJyYXJpZXM9IiRhY19pbV91c3JsaWJkaXIiIDs7Ci0gICAgZXNhYwotICBmaQotICBjZCAuLgotICBybSAtZnIgY29uZnRlc3RkaXIKLWZpCi0KLWlmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IE5POyB0aGVuCi0gICMgR3Vlc3Mgd2hlcmUgdG8gZmluZCBpbmNsdWRlIGZpbGVzLCBieSBsb29raW5nIGZvciB0aGlzIG9uZSBYMTEgLmggZmlsZS4KLSAgdGVzdCAteiAiJHhfZGlyZWN0X3Rlc3RfaW5jbHVkZSIgJiYgeF9kaXJlY3RfdGVzdF9pbmNsdWRlPVgxMS9JbnRyaW5zaWMuaAotCi0gICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkeF9kaXJlY3RfdGVzdF9pbmNsdWRlPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAjIFdlIGNhbiBjb21waWxlIHVzaW5nIFggaGVhZGVycyB3aXRoIG5vIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkuCi1hY194X2luY2x1ZGVzPQotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgIyBMb29rIGZvciB0aGUgaGVhZGVyIGZpbGUgaW4gYSBzdGFuZGFyZCBzZXQgb2YgY29tbW9uIGRpcmVjdG9yaWVzLgotIyBDaGVjayBYMTEgYmVmb3JlIFgxMVJuIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBzeW1saW5rIHRvIHRoZSBjdXJyZW50IHJlbGVhc2UuCi0gIGZvciBhY19kaXIgaW4gICAgICAgICAgICAgICBcCi0gICAgL3Vzci9YMTEvaW5jbHVkZSAgICAgICAgICBcCi0gICAgL3Vzci9YMTFSNi9pbmNsdWRlICAgICAgICBcCi0gICAgL3Vzci9YMTFSNS9pbmNsdWRlICAgICAgICBcCi0gICAgL3Vzci9YMTFSNC9pbmNsdWRlICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9pbmNsdWRlL1gxMSAgICAgICAgICBcCi0gICAgL3Vzci9pbmNsdWRlL1gxMVI2ICAgICAgICBcCi0gICAgL3Vzci9pbmNsdWRlL1gxMVI1ICAgICAgICBcCi0gICAgL3Vzci9pbmNsdWRlL1gxMVI0ICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9sb2NhbC9YMTEvaW5jbHVkZSAgICBcCi0gICAgL3Vzci9sb2NhbC9YMTFSNi9pbmNsdWRlICBcCi0gICAgL3Vzci9sb2NhbC9YMTFSNS9pbmNsdWRlICBcCi0gICAgL3Vzci9sb2NhbC9YMTFSNC9pbmNsdWRlICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9sb2NhbC9pbmNsdWRlL1gxMSAgICBcCi0gICAgL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI2ICBcCi0gICAgL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI1ICBcCi0gICAgL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9YMzg2L2luY2x1ZGUgICAgICAgICBcCi0gICAgL3Vzci94Mzg2L2luY2x1ZGUgICAgICAgICBcCi0gICAgL3Vzci9YRnJlZTg2L2luY2x1ZGUvWDExICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9pbmNsdWRlICAgICAgICAgICAgICBcCi0gICAgL3Vzci9sb2NhbC9pbmNsdWRlICAgICAgICBcCi0gICAgL3Vzci91bnN1cHBvcnRlZC9pbmNsdWRlICBcCi0gICAgL3Vzci9hdGhlbmEvaW5jbHVkZSAgICAgICBcCi0gICAgL3Vzci9sb2NhbC94MTFyNS9pbmNsdWRlICBcCi0gICAgL3Vzci9scHAvWGFtcGxlcy9pbmNsdWRlICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9vcGVud2luL2luY2x1ZGUgICAgICBcCi0gICAgL3Vzci9vcGVud2luL3NoYXJlL2luY2x1ZGUgXAotICAgIDsgXAotICBkbwotICAgIGlmIHRlc3QgLXIgIiRhY19kaXIvJHhfZGlyZWN0X3Rlc3RfaW5jbHVkZSI7IHRoZW4KLSAgICAgIGFjX3hfaW5jbHVkZXM9JGFjX2RpcgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotcm0gLWYgY29uZnRlc3QqCi1maSAjICRhY194X2luY2x1ZGVzID0gTk8KLQotaWYgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IE5POyB0aGVuCi0gICMgQ2hlY2sgZm9yIHRoZSBsaWJyYXJpZXMuCi0KLSAgdGVzdCAteiAiJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSIgJiYgeF9kaXJlY3RfdGVzdF9saWJyYXJ5PVh0Ci0gIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2Z1bmN0aW9uIiAmJiB4X2RpcmVjdF90ZXN0X2Z1bmN0aW9uPVh0TWFsbG9jCi0KLSAgIyBTZWUgaWYgd2UgZmluZCB0aGVtIHdpdGhvdXQgYW55IHNwZWNpYWwgb3B0aW9ucy4KLSAgIyBEb24ndCBhZGQgdG8gJExJQlMgcGVybWFuZW50bHkuCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi0gIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLSR7eF9kaXJlY3RfdGVzdF9mdW5jdGlvbn0oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIExJQlM9IiRhY19zYXZlX0xJQlMiCi0jIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KLWFjX3hfbGlicmFyaWVzPQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotIyBGaXJzdCBzZWUgaWYgcmVwbGFjaW5nIHRoZSBpbmNsdWRlIGJ5IGxpYiB3b3Jrcy4KLSMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgotZm9yIGFjX2RpciBpbiBgZWNobyAiJGFjX3hfaW5jbHVkZXMiIHwgc2VkIHMvaW5jbHVkZS9saWIvYCBcCi0gICAgL3Vzci9YMTEvbGliICAgICAgICAgIFwKLSAgICAvdXNyL1gxMVI2L2xpYiAgICAgICAgXAotICAgIC91c3IvWDExUjUvbGliICAgICAgICBcCi0gICAgL3Vzci9YMTFSNC9saWIgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC91c3IvbGliL1gxMSAgICAgICAgICBcCi0gICAgL3Vzci9saWIvWDExUjYgICAgICAgIFwKLSAgICAvdXNyL2xpYi9YMTFSNSAgICAgICAgXAotICAgIC91c3IvbGliL1gxMVI0ICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvdXNyL2xvY2FsL1gxMS9saWIgICAgXAotICAgIC91c3IvbG9jYWwvWDExUjYvbGliICBcCi0gICAgL3Vzci9sb2NhbC9YMTFSNS9saWIgIFwKLSAgICAvdXNyL2xvY2FsL1gxMVI0L2xpYiAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9sb2NhbC9saWIvWDExICAgIFwKLSAgICAvdXNyL2xvY2FsL2xpYi9YMTFSNiAgXAotICAgIC91c3IvbG9jYWwvbGliL1gxMVI1ICBcCi0gICAgL3Vzci9sb2NhbC9saWIvWDExUjQgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC91c3IvWDM4Ni9saWIgICAgICAgICBcCi0gICAgL3Vzci94Mzg2L2xpYiAgICAgICAgIFwKLSAgICAvdXNyL1hGcmVlODYvbGliL1gxMSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgL3Vzci9saWIgICAgICAgICAgICAgIFwKLSAgICAvdXNyL2xvY2FsL2xpYiAgICAgICAgXAotICAgIC91c3IvdW5zdXBwb3J0ZWQvbGliICBcCi0gICAgL3Vzci9hdGhlbmEvbGliICAgICAgIFwKLSAgICAvdXNyL2xvY2FsL3gxMXI1L2xpYiAgXAotICAgIC91c3IvbHBwL1hhbXBsZXMvbGliICBcCi0gICAgL2xpYi91c3IvbGliL1gxMQkgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC91c3Ivb3Blbndpbi9saWIgICAgICBcCi0gICAgL3Vzci9vcGVud2luL3NoYXJlL2xpYiBcCi0gICAgOyBcCi1kbwotICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2w7IGRvCi0gICAgaWYgdGVzdCAtciAkYWNfZGlyL2xpYiR7eF9kaXJlY3RfdGVzdF9saWJyYXJ5fS4kYWNfZXh0ZW5zaW9uOyB0aGVuCi0gICAgICBhY194X2xpYnJhcmllcz0kYWNfZGlyCi0gICAgICBicmVhayAyCi0gICAgZmkKLSAgZG9uZQotZG9uZQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkgIyAkYWNfeF9saWJyYXJpZXMgPSBOTwotCi1pZiB0ZXN0ICIkYWNfeF9pbmNsdWRlcyIgPSBOTyB8fCB0ZXN0ICIkYWNfeF9saWJyYXJpZXMiID0gTk87IHRoZW4KLSAgIyBEaWRuJ3QgZmluZCBYIGFueXdoZXJlLiAgQ2FjaGUgdGhlIGtub3duIGFic2VuY2Ugb2YgWC4KLSAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9bm8iCi1lbHNlCi0gICMgUmVjb3JkIHdoZXJlIHdlIGZvdW5kIFggZm9yIHRoZSBjYWNoZS4KLSAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzIFwKLQkgICAgICAgIGFjX3hfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMgYWNfeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzIgotZmkKLWZpCi0gIGZpCi0gIGV2YWwgIiRhY19jdl9oYXZlX3giCi1maSAjICR3aXRoX3ggIT0gbm8KLQotaWYgdGVzdCAiJGhhdmVfeCIgIT0geWVzOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkaGF2ZV94IiAxPiY2Ci0gIG5vX3g9eWVzCi1lbHNlCi0gICMgSWYgZWFjaCBvZiB0aGUgdmFsdWVzIHdhcyBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBvdmVycmlkZXMgZWFjaCBndWVzcy4KLSAgdGVzdCAieCR4X2luY2x1ZGVzIiA9IHhOT05FICYmIHhfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMKLSAgdGVzdCAieCR4X2xpYnJhcmllcyIgPSB4Tk9ORSAmJiB4X2xpYnJhcmllcz0kYWNfeF9saWJyYXJpZXMKLSAgIyBVcGRhdGUgdGhlIGNhY2hlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZXMuCi0gIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllcyBcCi0JCWFjX3hfaW5jbHVkZXM9JHhfaW5jbHVkZXMgYWNfeF9saWJyYXJpZXM9JHhfbGlicmFyaWVzIgotICBlY2hvICIkYWNfdCIibGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlcyIgMT4mNgotZmkKLQotbWlwc19leHRyYV9saWJzPSIiCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggc3RkbGliLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzU2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM2NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmYWJzIGluIC1sbSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM5MzogY2hlY2tpbmcgZm9yIGZhYnMgaW4gLWxtIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbSdfJ2ZhYnMgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sbSAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZmFicygpOwotCi1pbnQgbWFpbigpIHsKLWZhYnMoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbSB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxtICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZm9yIGFjX2Z1bmMgaW4gYWludCBhbmludCBzcXJ0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDQyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBTSU1fU1VCVEFSR0VUQCUkU0lNX1NVQlRBUkdFVCVnCi1zJUBzaW1faWdlbl9mbGFnc0AlJHNpbV9pZ2VuX2ZsYWdzJWcKLXMlQHNpbV9tMTZfZmxhZ3NAJSRzaW1fbTE2X2ZsYWdzJWcKLXMlQHNpbV9nZW5AJSRzaW1fZ2VuJWcKLXMlQG1pcHNfZXh0cmFfb2Jqc0AlJG1pcHNfZXh0cmFfb2JqcyVnCi1zJUBtaXBzX2lnZW5fZW5naW5lQCUkbWlwc19pZ2VuX2VuZ2luZSVnCi1zJUBtaXBzX2V4dHJhX2xpYnNAJSRtaXBzX2V4dHJhX2xpYnMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9taXBzL2NvbmZpZ3VyZS5pbiBiL3NpbS9taXBzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmNGJjMy4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLWRubCBPcHRpb25zIGF2YWlsYWJsZSBpbiB0aGlzIG1vZHVsZQotU0lNX0FDX09QVElPTl9JTkxJTkUoKQotU0lNX0FDX09QVElPTl9BTElHTk1FTlQoTk9OU1RSSUNUX0FMSUdOTUVOVCkKLVNJTV9BQ19PUFRJT05fSE9TVEVORElBTgotU0lNX0FDX09QVElPTl9XQVJOSU5HUwotCi0jIERFUFJFQ0FURUQKLSMKLSMgSW5zdGVhZCBvZiBkZWZpbmluZyBhIGBzdWJ0YXJnZXQnIG1hY3JvLCBjb2RlIHNob3VsZCBiZSBjaGVja2luZwotIyB0aGUgdmFsdWUgb2Yge1NUQVRFLENQVX1fQVJDSElURUNUVVJFIHRvIGlkZW50aWZ5IHRoZSBhcmNoaXRlY3R1cmUKLSMgaW4gcXVlc3Rpb24uCi0jCi1jYXNlICIke3RhcmdldH0iIGluCi0gIG1pcHMqdHgzOSopICAgICAgICAgICBTSU1fU1VCVEFSR0VUPSItRFNVQlRBUkdFVF9SMzkwMD0xIjs7Ci0gICopICAgICAgICAgICAgICAgICAgICBTSU1fU1VCVEFSR0VUPSIiOzsKLWVzYWMKLUFDX1NVQlNUKFNJTV9TVUJUQVJHRVQpCi0KLQotCi0jCi0jIFNlbGVjdCB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgdGFyZ2V0Ci0jCi1taXBzX2VuZGlhbj0KLWRlZmF1bHRfZW5kaWFuPQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzNjRlbCotKi0qKQltaXBzX2VuZGlhbj1MSVRUTEVfRU5ESUFOIDs7Ci0gIG1pcHM2NHZyKmVsLSotKikgICAgICBkZWZhdWx0X2VuZGlhbj1MSVRUTEVfRU5ESUFOIDs7Ci0gIG1pcHM2NCotKi0qKSAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gIG1pcHMxNiotKi0qKSAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gIG1pcHMqLSotKikgICAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci0gICopICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2VuZGlhbj1CSUdfRU5ESUFOIDs7Ci1lc2FjCi1TSU1fQUNfT1BUSU9OX0VORElBTigkbWlwc19lbmRpYW4sJGRlZmF1bHRfZW5kaWFuKQotCi0KLQotIwotIyBTZWxlY3QgdGhlIGJpdHNpemUgb2YgdGhlIHRhcmdldAotIwotbWlwc19hZGRyX2JpdHNpemU9Ci1jYXNlICIke3RhcmdldH0iIGluCi0gIG1pcHM2NCotKi0qKSAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OwotICBtaXBzMTYqLSotKikgICAgICAgICAgbWlwc19iaXRzaXplPTY0IDsgbWlwc19tc2I9NjMgOzsKLSAgbWlwcyotKi0qKSAgICAgICAgICAgIG1pcHNfYml0c2l6ZT0zMiA7IG1pcHNfbXNiPTMxIDs7Ci0gICopICAgICAgICAgICAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OwotZXNhYwotU0lNX0FDX09QVElPTl9CSVRTSVpFKCRtaXBzX2JpdHNpemUsJG1pcHNfbXNiLCRtaXBzX2FkZHJfYml0c2l6ZSkKLQotCi0KLSMKLSMgU2VsZWN0IHRoZSBmbG9hdGluZyBoYXJkd2FyZSBzdXBwb3J0IG9mIHRoZSB0YXJnZXQKLSMKLW1pcHNfZnB1PUhBUkRXQVJFX0ZMT0FUSU5HX1BPSU5UCi1taXBzX2ZwdV9iaXRzaXplPQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKnR4MzkqKQkJbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVAotCQkJbWlwc19mcHVfYml0c2l6ZT0zMgotCQkJOzsKLSAgbWlwczY0Ki0qLSopICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOzsKLSAgbWlwczE2Ki0qLSopICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOzsKLSAgbWlwcyotKi0qKSAgICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOyBtaXBzX2ZwdV9iaXRzaXplPTMyIDs7Ci0gICopICAgICAgICAgICAgICAgICAgICBtaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UIDs7Ci1lc2FjCi1TSU1fQUNfT1BUSU9OX0ZMT0FUKCRtaXBzX2ZwdSwkbWlwc19mcHVfYml0c2l6ZSkKLQotCi0KLSMKLSMgU2VsZWN0IHRoZSBsZXZlbCBvZiBTTVAgc3VwcG9ydAotIwotY2FzZSAiJHt0YXJnZXR9IiBpbgotICAqKSAgICAgICAgICAgICAgICAgICAgbWlwc19zbXA9MCA7OwotZXNhYwotU0lNX0FDX09QVElPTl9TTVAoJG1pcHNfc21wKQotCi0KLQotIwotIyBTZWxlY3QgdGhlIElHRU4gYXJjaGl0ZWN0dXJlCi0jCi1zaW1fZ2VuPUlHRU4KLXNpbV9pZ2VuX21hY2hpbmU9Ii1NIG1pcHNJViIKLXNpbV9tMTZfbWFjaGluZT0iLU0gbWlwczE2Igotc2ltX2lnZW5fZmlsdGVyPSIzMiw2NCxmIgotc2ltX20xNl9maWx0ZXI9IjE2IgotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKnR4MzkqKQkJc2ltX2dlbj1JR0VOCi0JCQlzaW1faWdlbl9maWx0ZXI9IjMyLGYiCi0JCQlzaW1faWdlbl9tYWNoaW5lPSItTSByMzkwMCIKLQkJCTs7Ci0gIG1pcHM2NHZyNDMqLSotKikJc2ltX2dlbj1JR0VOCi0JCQlzaW1faWdlbl9tYWNoaW5lPSItTSBtaXBzSVYiCi0JCQk7OwotICBtaXBzNjR2cjUqLSotKikJc2ltX2dlbj1JR0VOCi0JCQlzaW1faWdlbl9tYWNoaW5lPSItTSB2cjUwMDAiCi0JCQk7OwotICBtaXBzNjR2cjQxKikJCXNpbV9nZW49TTE2Ci0JCQlzaW1faWdlbl9tYWNoaW5lPSItTSB2cjQxMDAiCi0JCQlzaW1fbTE2X21hY2hpbmU9Ii1NIHZyNDEwMCIKLQkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsNjQsZiIKLQkJCXNpbV9tMTZfZmlsdGVyPSIxNiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gIG1pcHM2NCotKi0qKQkJc2ltX2lnZW5fZmlsdGVyPSIzMiw2NCxmIgotCQkJc2ltX2dlbj1JR0VOCi0JCQk7OwotICBtaXBzMTYqLSotKikJCXNpbV9nZW49TTE2Ci0JCQlzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCi0JCQlzaW1fbTE2X2ZpbHRlcj0iMTYiCi0JCQk7OwotICBtaXBzKmxzaSopCSAgICAgICAgc2ltX2dlbj1NMTYKLQkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIG1pcHNJSUksbWlwczE2IgotCQkJc2ltX20xNl9tYWNoaW5lPSItTSBtaXBzMTYsbWlwc0lJSSIKLQkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsZiIKLQkJCXNpbV9tMTZfZmlsdGVyPSIxNiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gIG1pcHMqLSotKikJCXNpbV9nZW49SUdFTgotCQkJc2ltX2lnZW5fZmlsdGVyPSIzMixmIgotCQkJOzsKLWVzYWMKLXNpbV9pZ2VuX2ZsYWdzPSItRiAke3NpbV9pZ2VuX2ZpbHRlcn0gJHtzaW1faWdlbl9tYWNoaW5lfSAke3NpbV9pZ2VuX3NtcH0iCi1zaW1fbTE2X2ZsYWdzPSIgLUYgJHtzaW1fbTE2X2ZpbHRlcn0gICR7c2ltX20xNl9tYWNoaW5lfSAgJHtzaW1faWdlbl9zbXB9IgotQUNfU1VCU1Qoc2ltX2lnZW5fZmxhZ3MpCi1BQ19TVUJTVChzaW1fbTE2X2ZsYWdzKQotQUNfU1VCU1Qoc2ltX2dlbikKLQotCi0jCi0jIEFkZCBzaW11bGF0ZWQgaGFyZHdhcmUgZGV2aWNlcwotIwotaHdfZW5hYmxlZD1ubwotY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKnR4MzkqKQotCWh3X2VuYWJsZWQ9eWVzCi0JaHdfZXh0cmFfZGV2aWNlcz0idHgzOTA0Y3B1IHR4MzkwNGlyYyB0eDM5MDR0bXIgdHgzOTA0c2lvIiAKLQltaXBzX2V4dHJhX29ianM9ImR2LXNvY2tzZXIubyIKLQlTSU1fU1VCVEFSR0VUPSIkU0lNX1NVQlRBUkdFVCAtRFRBUkdFVF9UWDM5MDQ9MSIKLQk7OwotICAqKQotCW1pcHNfZXh0cmFfb2Jqcz0iIiAKLQk7OwotZXNhYwotU0lNX0FDX09QVElPTl9IQVJEV0FSRSgkaHdfZW5hYmxlZCwkaHdfZGV2aWNlcywkaHdfZXh0cmFfZGV2aWNlcykKLUFDX1NVQlNUKG1pcHNfZXh0cmFfb2JqcykKLQotCi0jIENob29zZSBzaW11bGF0b3IgZW5naW5lCi1jYXNlICIke3RhcmdldH0iIGluCi0gICopICAgIG1pcHNfaWdlbl9lbmdpbmU9ImVuZ2luZS5vIgotCTs7Ci1lc2FjCi1BQ19TVUJTVChtaXBzX2lnZW5fZW5naW5lKQotCi0KLUFDX1BBVEhfWAotbWlwc19leHRyYV9saWJzPSIiCi1BQ19TVUJTVChtaXBzX2V4dHJhX2xpYnMpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHN0ZGxpYi5oKQotQUNfQ0hFQ0tfTElCKG0sIGZhYnMpCi1BQ19DSEVDS19GVU5DUyhhaW50IGFuaW50IHNxcnQpCi0KLVNJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9taXBzL2R2LXR4MzkwNGNwdS5jIGIvc2ltL21pcHMvZHYtdHgzOTA0Y3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Yjg1MjEuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvZHYtdHgzOTA0Y3B1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJody1tYWluLmgiCi0KLS8qIERFVklDRQotCi0gICAKLSAgIHR4MzkwNGNwdSAtIHR4MzkwNCBjcHUgdmlydHVhbCBkZXZpY2UKLQotICAgCi0gICBERVNDUklQVElPTgotCi0gICAKLSAgIEltcGxlbWVudHMgdGhlIGV4dGVybmFsIHR4MzkwNCBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpbmNsdWRlcyB0aGUKLSAgIGRlbGl2ZXJ5IG9mIG9mIGludGVycnVwdHMgZ2VuZXJhdGVkIGZyb20gb3RoZXIgZGV2aWNlcyBhbmQgdGhlCi0gICBoYW5kbGluZyBvZiBkZXZpY2Ugc3BlY2lmaWMgcmVnaXN0ZXJzLgotCi0KLSAgIFBST1BFUlRJRVMKLSAgIAotICAgbm9uZQotCi0KLSAgIFBPUlRTCi0KLQotICAgcmVzZXQgKGlucHV0KQotCi0gICBDdXJyZW50bHkgaWdub3JlZC4KLQotCi0gICBubWkgKGlucHV0KQotCi0gICBEZWxpdmVyIGEgbm9uLW1hc2thYmxlIGludGVycnVwdCB0byB0aGUgcHJvY2Vzc29yLgotCi0KLSAgIGxldmVsIChpbnB1dCkKLQotICAgRGVsaXZlciBhIG1hc2thYmxlIGludGVycnVwdCBvZiBnaXZlbiBsZXZlbCwgY29ycmVzcG9uZGluZyB0bwotICAgSVBbNTowXSwgdG8gcHJvY2Vzc29yLgotCi0KLQotICAgQlVHUwotCi0KLSAgIFdoZW4gZGVsaXZlcmluZyBhbiBpbnRlcnJ1cHQsIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seQotICAgb25lIHByb2Nlc3NvciAobnVtYmVyIDApLgotCi0gICBUaGlzIGNvZGUgZG9lcyBub3QgYXR0ZW1wdCB0byBiZSBlZmZpY2llbnQgYXQgaGFuZGxpbmcgcGVuZGluZwotICAgaW50ZXJydXB0cy4gIEl0IHNpbXBseSBzY2hlZHVsZXMgdGhlIGludGVycnVwdCBkZWxpdmVyeSBoYW5kbGVyCi0gICBldmVyeSBpbnN0cnVjdGlvbiBjeWNsZSB1bnRpbCBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzIGdvIGF3YXkuICBBbgotICAgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbWlnaHQgbW9kaWZ5IGluc3RydWN0aW9ucyB0aGF0IGNoYW5nZQotICAgdGhlIFBTVyBhbmQgaGF2ZSB0aGVtIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbmdlIG1ha2VzIGFuIGludGVycnVwdAotICAgZGVsaXZlcnkgcG9zc2libGUuCi0KLSAgICovCi0KLQotCi1zdHJ1Y3QgdHgzOTA0Y3B1IHsKLSAgLyogUGVuZGluZyBpbnRlcnJ1cHRzIGZvciBkZWxpdmVyeSBieSBldmVudCBoYW5kbGVyICovCi0gIGludCBwZW5kaW5nX3Jlc2V0LCBwZW5kaW5nX25taSwgcGVuZGluZ19sZXZlbDsKLSAgc3RydWN0IGh3X2V2ZW50KiBldmVudDsKLX07Ci0KLQotCi0vKiBpbnB1dCBwb3J0IElEJ3MgKi8gCi0KLWVudW0gewotICBSRVNFVF9QT1JULAotICBOTUlfUE9SVCwKLSAgTEVWRUxfUE9SVCwKLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgdHgzOTA0Y3B1X3BvcnRzW10gPSB7Ci0KLSAgLyogaW50ZXJydXB0IGlucHV0cyAqLwotICB7ICJyZXNldCIsIFJFU0VUX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgIm5taSIsIE5NSV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJsZXZlbCIsIExFVkVMX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyBOVUxMLCB9LAotfTsKLQotCi0vKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCi0gICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLwotCi1zdGF0aWMgaHdfcG9ydF9ldmVudF9tZXRob2QgdHgzOTA0Y3B1X3BvcnRfZXZlbnQ7Ci0KLQotCi1zdGF0aWMgdm9pZAotdHgzOTA0Y3B1X2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKLXsKLSAgc3RydWN0IHR4MzkwNGNwdSAqY29udHJvbGxlcjsKLQotICBjb250cm9sbGVyID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IHR4MzkwNGNwdSk7Ci0gIHNldF9od19kYXRhIChtZSwgY29udHJvbGxlcik7Ci0gIHNldF9od19wb3J0cyAobWUsIHR4MzkwNGNwdV9wb3J0cyk7Ci0gIHNldF9od19wb3J0X2V2ZW50IChtZSwgdHgzOTA0Y3B1X3BvcnRfZXZlbnQpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIHBlbmRpbmcgaW50ZXJydXB0IGZsYWdzICovCi0gIGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPSAwOwotICBjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0ID0gMDsKLSAgY29udHJvbGxlci0+cGVuZGluZ19ubWkgPSAwOwotICBjb250cm9sbGVyLT5ldmVudCA9IE5VTEw7Ci19Ci0KLQotCi0vKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCi0KLXN0YXRpYyB2b2lkCi1kZWxpdmVyX3R4MzkwNGNwdV9pbnRlcnJ1cHQgKHN0cnVjdCBodyAqbWUsCi0JCQkgICAgdm9pZCAqZGF0YSkKLXsKLSAgc3RydWN0IHR4MzkwNGNwdSAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgU0lNX0RFU0Mgc2QgPSBod19zeXN0ZW0gKG1lKTsKLSAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7IC8qIE5COiBmaXggQ1BVIDAuICovCi0gIGFkZHJlc3Nfd29yZCBjaWEgPSBDSUFfR0VUIChjcHUpOwotCi0jZGVmaW5lIENQVSBjcHUKLSNkZWZpbmUgU0QgY3VycmVudF9zdGF0ZQotCi0gIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0KQotICAgIHsKLSAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfcmVzZXQgPSAwOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInJlc2V0IHBjPTB4JTA4bHgiLCAobG9uZykgQ0lBX0dFVCAoY3B1KSkpOwotICAgICAgU2lnbmFsRXhjZXB0aW9uTk1JUmVzZXQoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNvbnRyb2xsZXItPnBlbmRpbmdfbm1pKQotICAgIHsKLSAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfbm1pID0gMDsKLSAgICAgIEhXX1RSQUNFICgobWUsICJubWkgcGM9MHglMDhseCIsIChsb25nKSBDSUFfR0VUIChjcHUpKSk7Ci0gICAgICBTaWduYWxFeGNlcHRpb25OTUlSZXNldCgpOwotICAgIH0KLSAgZWxzZSBpZiAoY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCkKLSAgICB7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAiaW50ZXJydXB0IGxldmVsPSVkIHBjPTB4JTA4bHggc3I9MHglMDhseCIsCi0JCSBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsLAotCQkgKGxvbmcpIENJQV9HRVQgKGNwdSksIChsb25nKSBTUikpOwotCi0gICAgICAvKiBDbGVhciBDQVVTRSByZWdpc3Rlci4gIEl0IG1heSBzdGF5IHRoaXMgd2F5IGlmIHRoZSBpbnRlcnJ1cHQKLQkgd2FzIGNsZWFyZWQgd2l0aCBhIG5lZ2F0aXZlIHBlbmRpbmdfbGV2ZWwuICovCi0gICAgICBDQVVTRSAmPSB+IChjYXVzZV9JUF9tYXNrIDw8IGNhdXNlX0lQX3NoaWZ0KTsKLQotICAgICAgaWYoY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCA+IDApIC8qIGludGVycnVwdCBzZXQgKi8KLQl7Ci0JICAvKiBzZXQgaGFyZHdhcmUtaW50ZXJydXB0IHN1YmZpZWxkcyBvZiBDQVVTRSByZWdpc3RlciAqLwotCSAgQ0FVU0UgfD0gKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgJiBjYXVzZV9JUF9tYXNrKSA8PCBjYXVzZV9JUF9zaGlmdDsKLQotCSAgLyogY2hlY2sgZm9yIGVuYWJsZWQgLyB1bm1hc2tlZCBpbnRlcnJ1cHRzICovCi0JICBpZigoU1IgJiBzdGF0dXNfSUVjKSAmJgotCSAgICAgKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgJiAoKFNSID4+IHN0YXR1c19JTV9zaGlmdCkgJiBzdGF0dXNfSU1fbWFzaykpKQotCSAgICB7Ci0JICAgICAgY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCA9IDA7Ci0JICAgICAgU2lnbmFsRXhjZXB0aW9uSW50ZXJydXB0KDAgLyogZHVtbXkgdmFsdWUgKi8pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiByZXNjaGVkdWxlIHNvb24gKi8KLQkgICAgICBpZihjb250cm9sbGVyLT5ldmVudCAhPSBOVUxMKQotCQlod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCBjb250cm9sbGVyLT5ldmVudCk7Ci0JICAgICAgY29udHJvbGxlci0+ZXZlbnQgPQotCQlod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIGRlbGl2ZXJfdHgzOTA0Y3B1X2ludGVycnVwdCwgTlVMTCk7Ci0JICAgIH0KLQl9IC8qIGludGVycnVwdCBzZXQgKi8KLSAgICB9Ci0jdW5kZWYgQ1BVIGNwdQotI3VuZGVmIFNEIGN1cnJlbnRfc3RhdGUKLX0KLQotCi1zdGF0aWMgdm9pZAotdHgzOTA0Y3B1X3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgaW50IG15X3BvcnQsCi0JCSAgICAgc3RydWN0IGh3ICpzb3VyY2UsCi0JCSAgICAgaW50IHNvdXJjZV9wb3J0LAotCQkgICAgIGludCBsZXZlbCkKLXsKLSAgc3RydWN0IHR4MzkwNGNwdSAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLQotICBzd2l0Y2ggKG15X3BvcnQpCi0gICAgeyAgICAgIAotICAgIGNhc2UgUkVTRVRfUE9SVDoKLSAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfcmVzZXQgPSAxOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gcmVzZXQiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTk1JX1BPUlQ6Ci0gICAgICBjb250cm9sbGVyLT5wZW5kaW5nX25taSA9IDE7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBubWkiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTEVWRUxfUE9SVDoKLSAgICAgIC8qIGxldmVsID09IDAgbWVhbnMgdGhhdCB0aGUgaW50ZXJydXB0IHdhcyBjbGVhcmVkICovCi0gICAgICBpZihsZXZlbCA9PSAwKQotCWNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPSAtMTsgLyogc2lnbmFsIGVuZCBvZiBpbnRlcnJ1cHQgKi8KLSAgICAgIGVsc2UKLQljb250cm9sbGVyLT5wZW5kaW5nX2xldmVsID0gbGV2ZWw7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBsZXZlbD0lZCIsIGxldmVsKSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgc3dpdGNoIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogU2NoZWR1bGUgYW4gZXZlbnQgdG8gYmUgZGVsaXZlcmVkIGltbWVkaWF0ZWx5IGFmdGVyIGN1cnJlbnQKLSAgICAgaW5zdHJ1Y3Rpb24uICovCi0gIGlmKGNvbnRyb2xsZXItPmV2ZW50ICE9IE5VTEwpCi0gICAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZShtZSwgY29udHJvbGxlci0+ZXZlbnQpOwotICBjb250cm9sbGVyLT5ldmVudCA9Ci0gICAgaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAwLCBkZWxpdmVyX3R4MzkwNGNwdV9pbnRlcnJ1cHQsIE5VTEwpOwotfQotCi0KLWNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X3R4MzkwNGNwdV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgInR4MzkwNGNwdSIsIHR4MzkwNGNwdV9maW5pc2gsIH0sCi0gIHsgTlVMTCB9LAotfTsKZGlmZiAtLWdpdCBhL3NpbS9taXBzL2R2LXR4MzkwNGlyYy5jIGIvc2ltL21pcHMvZHYtdHgzOTA0aXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODRlNWMuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvZHYtdHgzOTA0aXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJody1tYWluLmgiCi0KLQotLyogREVWSUNFCi0KLSAgIAotICAgdHgzOTA0aXJjIC0gdHgzOTA0IGludGVycnVwdCBjb250cm9sbGVyCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLQotICAgCi0gICBJbXBsZW1lbnRzIHRoZSB0eDM5MDQgaW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpYmVkIGluIHRoZSB0eDM5MDQKLSAgIHVzZXIgZ3VpZGUuICBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBpbnRlcnJ1cHQgZGV0ZWN0aW9uIGNpcmN1aXQKLSAgIHRoYXQgcHJlcHJvY2Vzc2VzIHRoZSBlaWdodCBleHRlcm5hbCBpbnRlcnJ1cHRzLCBzbyBhc3N1bWVzIHRoYXQKLSAgIGVhY2ggZXZlbnQgb24gYW4gaW5wdXQgaW50ZXJydXB0IHBvcnQgc2lnbmFscyBhIG5ldyBpbnRlcnJ1cHQuCi0gICBUaGF0IGlzLCBpdCBpbXBsZW1lbnRzIGVkZ2UtIHJhdGhlciB0aGFuIGxldmVsLXRyaWdnZXJlZAotICAgaW50ZXJydXB0cy4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQKLSAgIGludGVycnVwdHMuCi0KLQotICAgUFJPUEVSVElFUwotCi0KLSAgIHJlZyA8YmFzZT4gPGxlbmd0aD4KLQotICAgQmFzZSBvZiBJUkMgY29udHJvbCByZWdpc3RlciBiYW5rLiAgPGxlbmd0aD4gbXVzdCBlcXVhbCAweDIwLgotICAgUmVnaXN0ZXJzIG9mZnNldHM6ICAgICAgIDA6IElTUjogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IElNUjogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OiBJTFIwOiBpbnRlcnJ1cHQgbGV2ZWwgcmVnaXN0ZXIgMy4uMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6IElMUjE6IGludGVycnVwdCBsZXZlbCByZWdpc3RlciA3Li40Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAyNDogSUxSMjogaW50ZXJydXB0IGxldmVsIHJlZ2lzdGVyIDExLi44Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAyODogSUxSMzogaW50ZXJydXB0IGxldmVsIHJlZ2lzdGVyIDE1Li4xMgotCi0KLQotICAgUE9SVFMKLQotCi0gICBpcCAob3V0cHV0KQotCi0gICBJbnRlcnJ1cHQgcHJpb3JpdHkgcG9ydC4gIEFuIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludGVycnVwdAotICAgb2YgYSBzdWZmaWNpZW50IHByaW9yaXR5IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBJUkMuICBUaGUgdmFsdWUKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgaXMgdGhlIGludGVycnVwdCBsZXZlbCAoMTYtMzEpLCBhcyBnaXZlbgotICAgZm9yIGJpdHMgSVBbNTowXSBpbiB0aGUgYm9vayBUTVBSMzkwNEYgUmV2LiAyLjAsIHBnLiAxMS0zLiAgTm90ZQotICAgdGhhdCBldmVuIHRob3VnaCBJTlRbMF0gaXMgdGllZCBleHRlcm5hbGx5IHRvIElQWzVdLCB3ZSBzaW11bGF0ZQotICAgaXQgYXMgcGFzc2luZyB0aHJvdWdoIHRoZSBjb250cm9sbGVyLgotCi0gICBBbiBvdXRwdXQgbGV2ZWwgb2YgemVybyBzaWduYWxzIHRoZSBjbGVhcmluZyBvZiBhIGxldmVsIGludGVycnVwdC4KLQotCi0gICBpbnQwLTcgKGlucHV0KQotCi0gICBFeHRlcm5hbCBpbnRlcnJ1cHRzLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgotCi0gICAKLSAgIGRtYWMwLTMgKGlucHV0KQotCi0gICBETUEgaW50ZXJuYWwgaW50ZXJydXB0cywgY29ycmVzcG9uZCB0byBETUEgY2hhbm5lbHMgMC0zLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgotCi0KLSAgIHNpbzAtMSAoaW5wdXQpCi0KLSAgIFNJTyBpbnRlcm5hbCBpbnRlcnJ1cHRzLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgotCi0KLSAgIHRtcjAtMiAoaW5wdXQpCi0KLSAgIFRpbWVyIGludGVybmFsIGludGVycnVwdHMuICBMZXZlbCA9IDAgLT4gbGV2ZWwgaW50ZXJydXB0IGNsZWFyZWQuCi0KLSAgICovCi0KLQotCi0KLQotLyogcmVnaXN0ZXIgbnVtYmVyczsgZWFjaCBpcyBvbmUgd29yZCBsb25nICovCi1lbnVtCi17Ci0gIElTUl9SRUcgPSAwLAotICBJTVJfUkVHID0gMSwKLSAgSUxSMF9SRUcgPSA0LAotICBJTFIxX1JFRyA9IDUsCi0gIElMUjJfUkVHID0gNiwKLSAgSUxSM19SRUcgPSA3LAotfTsKLQotCi0vKiBwb3J0IElEJ3MgKi8KLQotZW51bQotewotICAvKiBpbnB1dHMsIG9yZGVyZWQgdG8gY29ycmVzcG9uZCB0byBpbnRlcnJ1cHQgc291cmNlcyAwLi4xNSAqLwotICBJTlQxX1BPUlQgPSAwLCBJTlQyX1BPUlQsIElOVDNfUE9SVCwgSU5UNF9QT1JULCBJTlQ1X1BPUlQsIElOVDZfUE9SVCwgSU5UN19QT1JULAotICBETUFDM19QT1JULCBETUFDMl9QT1JULCBETUFDMV9QT1JULCBETUFDMF9QT1JULCBTSU8wX1BPUlQsIFNJTzFfUE9SVCwKLSAgVE1SMF9QT1JULCBUTVIxX1BPUlQsIFRNUjJfUE9SVCwKLQotICAvKiBzcGVjaWFsIElOVFswXSBwb3J0ICovCi0gIElOVDBfUE9SVCwKLQotICAvKiByZXNldCAqLwotICBSRVNFVF9QT1JULAotCi0gIC8qIG91dHB1dCAqLwotICBJUF9QT1JUCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHR4MzkwNGlyY19wb3J0c1tdID0gewotCi0gIC8qIGludGVycnVwdCBvdXRwdXQgKi8KLQotICB7ICJpcCIsIElQX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAotCi0gIC8qIGludGVycnVwdCBpbnB1dHMgKGFzIG5hbWVzKSAqLwotICAvKiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGxldmVsIG51bWJlciAqLwotCi0gIHsgImludDEiLCBJTlQxX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDIiLCBJTlQyX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDMiLCBJTlQzX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDQiLCBJTlQ0X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDUiLCBJTlQ1X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDYiLCBJTlQ2X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDciLCBJTlQ3X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyAiZG1hYzMiLCBETUFDM19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJkbWFjMiIsIERNQUMyX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImRtYWMxIiwgRE1BQzFfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAiZG1hYzAiLCBETUFDMF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotCi0gIHsgInNpbzAiLCBTSU8wX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgInNpbzEiLCBTSU8xX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyAidG1yMCIsIFRNUjBfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAidG1yMSIsIFRNUjFfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAidG1yMiIsIFRNUjJfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLQotICB7ICJyZXNldCIsIFJFU0VUX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludDAiLCBJTlQwX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyBOVUxMLCB9LAotfTsKLQotCi0jZGVmaW5lIE5SX1NPVVJDRVMgKFRNUjNfUE9SVCAtIElOVDFfUE9SVCArIDEpIC8qIDE2OiBudW1iZXIgb2YgaW50ZXJydXB0IHNvdXJjZXMgKi8KLQotCi0vKiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgaW50ZXJuYWwgc3RhdGUuICBOb3RlIHRoYXQgd2UKLSAgIHN0b3JlIHN0YXRlIHVzaW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGltYWdlcywgaW4gaG9zdCBlbmRpYW4KLSAgIG9yZGVyLiAqLwotCi1zdHJ1Y3QgdHgzOTA0aXJjIHsKLSAgYWRkcmVzc193b3JkIGJhc2VfYWRkcmVzczsgLyogY29udHJvbCByZWdpc3RlciBiYXNlICovCi0gIHVuc2lnbmVkXzQgaXNyOwotI2RlZmluZSBJU1JfU0VUKGMscykgKChjKS0+aXNyICY9IH4gKDEgPDwgKHMpKSkKLSAgdW5zaWduZWRfNCBpbXI7Ci0jZGVmaW5lIElNUl9HRVQoYykgKChjKS0+aW1yKQotICB1bnNpZ25lZF80IGlscls0XTsKLSNkZWZpbmUgSUxSX0dFVChjLHMpIExTRVhUUkFDVEVEMzIoKGMpLT5pbHJbKHMpLzRdLCAocykgJSA0ICogOCArIDIsIChzKSAlIDQgKiA4KQotfTsKLQotCi0KLS8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKLSAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCi0KLXN0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgdHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyOwotc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgdHgzOTA0aXJjX2lvX3dyaXRlX2J1ZmZlcjsKLXN0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCB0eDM5MDRpcmNfcG9ydF9ldmVudDsKLQotc3RhdGljIHZvaWQKLWF0dGFjaF90eDM5MDRpcmNfcmVncyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlcikKLXsKLSAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKLSAgaW50IGF0dGFjaF9zcGFjZTsKLSAgdW5zaWduZWQgYXR0YWNoX3NpemU7Ci0gIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKLQotICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJyZWciKSA9PSBOVUxMKQotICAgIGh3X2Fib3J0IChtZSwgIk1pc3NpbmcgXCJyZWdcIiBwcm9wZXJ0eSIpOwotCi0gIGlmICghaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkgKG1lLCAicmVnIiwgMCwgJnJlZykpCi0gICAgaHdfYWJvcnQgKG1lLCAiXCJyZWdcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gb25lIGFkZHIvc2l6ZSBlbnRyeSIpOwotCi0gIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCi0JCQkJICAgICAmcmVnLmFkZHJlc3MsCi0JCQkJICAgICAmYXR0YWNoX3NwYWNlLAotCQkJCSAgICAgJmF0dGFjaF9hZGRyZXNzLAotCQkJCSAgICAgbWUpOwotICBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAotCQkJICAgICAgICZyZWcuc2l6ZSwKLQkJCSAgICAgICAmYXR0YWNoX3NpemUsIG1lKTsKLQotICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksIDAsCi0JCSAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCi0JCSAgICAgbWUpOwotCi0gIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcyA9IGF0dGFjaF9hZGRyZXNzOwotfQotCi0KLXN0YXRpYyB2b2lkCi10eDM5MDRpcmNfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQotewotICBzdHJ1Y3QgdHgzOTA0aXJjICpjb250cm9sbGVyOwotCi0gIGNvbnRyb2xsZXIgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgdHgzOTA0aXJjKTsKLSAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKLSAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgdHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyKTsKLSAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIHR4MzkwNGlyY19pb193cml0ZV9idWZmZXIpOwotICBzZXRfaHdfcG9ydHMgKG1lLCB0eDM5MDRpcmNfcG9ydHMpOwotICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHR4MzkwNGlyY19wb3J0X2V2ZW50KTsKLQotICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBhdHRhY2hfdHgzOTA0aXJjX3JlZ3MgKG1lLCBjb250cm9sbGVyKTsKLQotICAvKiBJbml0aWFsaXplIHRvIHJlc2V0IHN0YXRlICovCi0gIGNvbnRyb2xsZXItPmlzciA9IDB4MDAwMGZmZmY7Ci0gIGNvbnRyb2xsZXItPmltciA9IDA7Ci0gIGNvbnRyb2xsZXItPmlsclswXSA9Ci0gICAgY29udHJvbGxlci0+aWxyWzFdID0KLSAgICBjb250cm9sbGVyLT5pbHJbMl0gPQotICAgIGNvbnRyb2xsZXItPmlsclszXSA9IDA7Ci19Ci0KLQotCi0vKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCi0KLXN0YXRpYyB2b2lkCi10eDM5MDRpcmNfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICAgICBpbnQgbXlfcG9ydCwKLQkJICAgICBzdHJ1Y3QgaHcgKnNvdXJjZV9kZXYsCi0JCSAgICAgaW50IHNvdXJjZV9wb3J0LAotCQkgICAgIGludCBsZXZlbCkKLXsKLSAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLQotICAvKiBoYW5kbGUgZGVhY3RpdmF0ZWQgaW50ZXJydXB0ICovCi0gIGlmKGxldmVsID09IDApCi0gICAgewotICAgICAgSFdfVFJBQ0UgKChtZSwgImludGVycnVwdCBjbGVhcmVkIG9uIHBvcnQgJWQiLCBteV9wb3J0KSk7Ci0gICAgICBod19wb3J0X2V2ZW50KG1lLCBJUF9QT1JULCAwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChteV9wb3J0KQotICAgIHsKLSAgICBjYXNlIElOVDBfUE9SVDogCi0gICAgICB7Ci0JaW50IGlwX251bWJlciA9IDMyOyAvKiBjb21wdXRlIElQWzU6MF0gKi8KLQlIV19UUkFDRSAoKG1lLCAicG9ydC1ldmVudCBJTlRbMF0iKSk7Ci0JaHdfcG9ydF9ldmVudChtZSwgSVBfUE9SVCwgaXBfbnVtYmVyKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgSU5UMV9QT1JUOiBjYXNlIElOVDJfUE9SVDogY2FzZSBJTlQzX1BPUlQ6IGNhc2UgSU5UNF9QT1JUOgotICAgIGNhc2UgSU5UNV9QT1JUOiBjYXNlIElOVDZfUE9SVDogY2FzZSBJTlQ3X1BPUlQ6IGNhc2UgRE1BQzNfUE9SVDoKLSAgICBjYXNlIERNQUMyX1BPUlQ6IGNhc2UgRE1BQzFfUE9SVDogY2FzZSBETUFDMF9QT1JUOiBjYXNlIFNJTzBfUE9SVDoKLSAgICBjYXNlIFNJTzFfUE9SVDogY2FzZSBUTVIwX1BPUlQ6IGNhc2UgVE1SMV9QT1JUOiBjYXNlIFRNUjJfUE9SVDoKLSAgICAgIHsKLQlpbnQgc291cmNlID0gbXlfcG9ydCAtIElOVDFfUE9SVDsKLQotCUhXX1RSQUNFICgobWUsICJpbnRlcnJ1cHQgYXNzZXJ0ZWQgb24gcG9ydCAlZCIsIHNvdXJjZSkpOwotCUlTUl9TRVQoY29udHJvbGxlciwgc291cmNlKTsKLQlpZihJTFJfR0VUKGNvbnRyb2xsZXIsIHNvdXJjZSkgPiBJTVJfR0VUKGNvbnRyb2xsZXIpKQotCSAgewotCSAgICBpbnQgaXBfbnVtYmVyID0gMTYgKyBzb3VyY2U7IC8qIGNvbXB1dGUgSVBbNDowXSAqLwotCSAgICBIV19UUkFDRSAoKG1lLCAiaW50ZXJydXB0IGxldmVsICVkIiwgSUxSX0dFVChjb250cm9sbGVyLHNvdXJjZSkpKTsKLQkgICAgaHdfcG9ydF9ldmVudChtZSwgSVBfUE9SVCwgaXBfbnVtYmVyKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUkVTRVRfUE9SVDoKLSAgICAgIHsKLQlIV19UUkFDRSAoKG1lLCAicmVzZXQiKSk7Ci0JY29udHJvbGxlci0+aXNyID0gMHgwMDAwZmZmZjsKLQljb250cm9sbGVyLT5pbXIgPSAwOwotCWNvbnRyb2xsZXItPmlsclswXSA9Ci0JICBjb250cm9sbGVyLT5pbHJbMV0gPQotCSAgY29udHJvbGxlci0+aWxyWzJdID0KLQkgIGNvbnRyb2xsZXItPmlsclszXSA9IDA7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIElQX1BPUlQ6Ci0gICAgICBod19hYm9ydCAobWUsICJFdmVudCBvbiBvdXRwdXQgcG9ydCAlZCIsIG15X3BvcnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQgKG1lLCAiRXZlbnQgb24gdW5rbm93biBwb3J0ICVkIiwgbXlfcG9ydCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotLyogZ2VuZXJpYyByZWFkL3dyaXRlICovCi0KLXN0YXRpYyB1bnNpZ25lZAotdHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHZvaWQgKmRlc3QsCi0JCQkgaW50IHNwYWNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICBIV19UUkFDRSAoKG1lLCAicmVhZCAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7Ci0gIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBucl9ieXRlczsgYnl0ZSsrKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfd29yZCBhZGRyZXNzID0gYmFzZSArIGJ5dGU7Ci0gICAgICBpbnQgcmVnX251bWJlciA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAvIDQ7Ci0gICAgICBpbnQgcmVnX29mZnNldCA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAlIDQ7Ci0gICAgICB1bnNpZ25lZF80IHJlZ2lzdGVyX3ZhbHVlOyAvKiBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi0gICAgICAvKiBmaWxsIGluIGVudGlyZSByZWdpc3Rlcl92YWx1ZSB3b3JkICovCi0gICAgICBzd2l0Y2ggKHJlZ19udW1iZXIpCi0JewotCWNhc2UgSVNSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pc3I7IGJyZWFrOwotCWNhc2UgSU1SX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pbXI7IGJyZWFrOwotCWNhc2UgSUxSMF9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+aWxyWzBdOyBicmVhazsKLQljYXNlIElMUjFfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPmlsclsxXTsgYnJlYWs7Ci0JY2FzZSBJTFIyX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pbHJbMl07IGJyZWFrOwotCWNhc2UgSUxSM19SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+aWxyWzNdOyBicmVhazsKLQlkZWZhdWx0OiByZWdpc3Rlcl92YWx1ZSA9IDA7Ci0JfQotCi0gICAgICAvKiB3cml0ZSByZXF1ZXN0ZWQgYnl0ZSBvdXQgKi8KLSAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gSDJUXzQocmVnaXN0ZXJfdmFsdWUpOwotICAgICAgbWVtY3B5ICgoY2hhciopIGRlc3QgKyBieXRlLCAoKGNoYXIqKSYgcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIDEpOwotICAgIH0KLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19ICAgICAKLQotCi0KLXN0YXRpYyB1bnNpZ25lZAotdHgzOTA0aXJjX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCB0eDM5MDRpcmMgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKLSAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKLSAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKLSAgICAgIGludCByZWdfb2Zmc2V0ID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpICUgNDsKLSAgICAgIHVuc2lnbmVkXzQqIHJlZ2lzdGVyX3B0cjsKLSAgICAgIHVuc2lnbmVkXzQgcmVnaXN0ZXJfdmFsdWU7Ci0KLSAgICAgIC8qIGZpbGwgaW4gZW50aXJlIHJlZ2lzdGVyX3ZhbHVlIHdvcmQgKi8KLSAgICAgIHN3aXRjaCAocmVnX251bWJlcikKLQl7Ci0JY2FzZSBJU1JfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmlzcjsgYnJlYWs7Ci0JY2FzZSBJTVJfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmltcjsgYnJlYWs7Ci0JY2FzZSBJTFIwX1JFRzogcmVnaXN0ZXJfcHRyID0gJiBjb250cm9sbGVyLT5pbHJbMF07IGJyZWFrOwotCWNhc2UgSUxSMV9SRUc6IHJlZ2lzdGVyX3B0ciA9ICYgY29udHJvbGxlci0+aWxyWzFdOyBicmVhazsKLQljYXNlIElMUjJfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmlsclsyXTsgYnJlYWs7Ci0JY2FzZSBJTFIzX1JFRzogcmVnaXN0ZXJfcHRyID0gJiBjb250cm9sbGVyLT5pbHJbM107IGJyZWFrOwotCWRlZmF1bHQ6IHJlZ2lzdGVyX3B0ciA9ICYgcmVnaXN0ZXJfdmFsdWU7IC8qIHVzZWQgYXMgYSBkdW1teSAqLwotCX0KLQotICAgICAgLyogSFdfVFJBQ0UgKChtZSwgInJlZyAlZCBwcmU6ICUwOGx4IiwgcmVnX251bWJlciwgKGxvbmcpICpyZWdpc3Rlcl9wdHIpKTsgKi8KLQotICAgICAgLyogb3ZlcndyaXRlIHJlcXVlc3RlZCBieXRlICovCi0gICAgICByZWdpc3Rlcl92YWx1ZSA9IEgyVF80KCogcmVnaXN0ZXJfcHRyKTsKLSAgICAgIG1lbWNweSAoKChjaGFyKikmcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIChjb25zdCBjaGFyKilzb3VyY2UgKyBieXRlLCAxKTsKLSAgICAgICogcmVnaXN0ZXJfcHRyID0gVDJIXzQocmVnaXN0ZXJfdmFsdWUpOwotCi0gICAgICAvKiBIV19UUkFDRSAoKG1lLCAicG9zdDogJTA4bHgiLCAobG9uZykgKnJlZ2lzdGVyX3B0cikpOyAqLwotICAgIH0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfSAgICAgCi0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfdHgzOTA0aXJjX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAidHgzOTA0aXJjIiwgdHgzOTA0aXJjX2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvZHYtdHgzOTA0c2lvLmMgYi9zaW0vbWlwcy9kdi10eDM5MDRzaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhOGUzNy4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9kdi10eDM5MDRzaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJkdi1zb2Nrc2VyLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0KLS8qIERFVklDRQotCi0gICAKLSAgIHR4MzkwNHNpbyAtIHR4MzkwNCBzZXJpYWwgSS9PCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLQotICAgCi0gICBJbXBsZW1lbnRzIG9uZSB0eDM5MDQgc2VyaWFsIEkvTyBjb250cm9sbGVyIGRlc2NyaWJlZCBpbiB0aGUgdHgzOTA0Ci0gICB1c2VyIGd1aWRlLiAgVGhyZWUgaW5zdGFuY2VzIGFyZSByZXF1aXJlZCBmb3IgU0lPMCBhbmQgU0lPMSB3aXRoaW4KLSAgIHRoZSB0eDM5MDQsIGF0IGRpZmZlcmVudCBiYXNlIGFkZHJlc3Nlcy4KLQotICAgQm90aCBpbnRlcm5hbCBhbmQgc3lzdGVtIGNsb2NrcyBhcmUgc3ludGhlc2l6ZWQgYXMgZGl2aWRlZCB2ZXJzaW9ucwotICAgb2YgdGhlIHNpbXVsYXRvciBjbG9jay4KLSAgIAotICAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3I6Ci0gICAgLSBDVFMvUlRTIGZsb3cgY29udHJvbAotICAgIC0gYmF1ZCByYXRlIGVtdWxhdGlvbiAtIHVzZSBpbmZpbml0ZSBzcGVlZCBpbnN0ZWFkCi0gICAgLSBnZW5lcmFsIGZyYW1lIGZvcm1hdCAtIHVzZSA4TjEKLSAgICAtIG11bHRpLWNvbnRyb2xsZXIgc3lzdGVtCi0gICAgLSBETUEgLSB1c2UgaW50ZXJydXB0LWRyaXZlbiBvciBwb2xsZWQtSS9PIGluc3RlYWQKLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgcmVnIDxiYXNlPiA8bGVuZ3RoPgotCi0gICBCYXNlIG9mIFNJTyBjb250cm9sIHJlZ2lzdGVyIGJhbmsuICA8bGVuZ3RoPiBtdXN0IGVxdWFsIDB4MTAwLgotICAgUmVnaXN0ZXIgb2Zmc2V0czogICAgICAgMDogU0xDUjogbGluZSBjb250cm9sIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA0OiBTTFNSOiBsaW5lIHN0YXR1cyByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgODogU0RJQ1I6IERNQS9pbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAxMjogU0RJU1I6IERNQS9pbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDE2OiBTRkNSOiBGSUZPIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCSAgMjA6IFNCR1I6IGJhdWQgcmF0ZSBjb250cm9sIHJlZ2lzdGVyCi0JCQkgIDMyOiB0cmFuc2ZlciBGSUZPIGJ1ZmZlcgotCQkJICA0ODogdHJhbnNmZXIgRklGTyBidWZmZXIKLQotICAgYmFja2VuZCB7dGNwIHwgc3RkaW99Ci0KLSAgIFVzZSBkdi1zb2Nrc2VyIFRDUC1wb3J0IGJhY2tlbmQgb3Igc3RkaW8gZm9yIGJhY2tlbmQuICBEZWZhdWx0OiBzdGRpby4KLQotCi0KLSAgIFBPUlRTCi0KLQotICAgaW50IChvdXRwdXQpCi0KLSAgIEludGVycnVwdCBwb3J0LiAgQW4gZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gYSB0aW1lciBpbnRlcnJ1cHQKLSAgIG9jY3Vycy4KLQotCi0gICByZXNldCAoaW5wdXQpCi0KLSAgIFJlc2V0IHBvcnQuCi0KLSAgICovCi0KLQotCi0vKiBzdGF0aWMgZnVuY3Rpb25zICovCi0KLXN0cnVjdCB0eDM5MDRzaW9fZmlmbzsKLQotc3RhdGljIHZvaWQgdHgzOTA0c2lvX3RpY2tsZShzdHJ1Y3QgaHcqKTsKLXN0YXRpYyBpbnQgdHgzOTA0c2lvX2ZpZm9fbm9uZW1wdHkoc3RydWN0IGh3Kiwgc3RydWN0IHR4MzkwNHNpb19maWZvKik7Ci1zdGF0aWMgY2hhciB0eDM5MDRzaW9fZmlmb19wb3Aoc3RydWN0IGh3Kiwgc3RydWN0IHR4MzkwNHNpb19maWZvKik7Ci1zdGF0aWMgdm9pZCB0eDM5MDRzaW9fZmlmb19wdXNoKHN0cnVjdCBodyosIHN0cnVjdCB0eDM5MDRzaW9fZmlmbyosIGNoYXIpOwotc3RhdGljIHZvaWQgdHgzOTA0c2lvX2ZpZm9fcmVzZXQoc3RydWN0IGh3Kiwgc3RydWN0IHR4MzkwNHNpb19maWZvKik7Ci1zdGF0aWMgdm9pZCB0eDM5MDRzaW9fcG9sbChzdHJ1Y3QgaHcqLCB2b2lkKiBkYXRhKTsKLQotCi0vKiByZWdpc3RlciBudW1iZXJzOyBlYWNoIGlzIG9uZSB3b3JkIGxvbmcgKi8KLWVudW0gCi17Ci0gIFNMQ1JfUkVHID0gMCwKLSAgU0xTUl9SRUcgPSAxLAotICBTRElDUl9SRUcgPSAyLAotICBTRElTUl9SRUcgPSAzLAotICBTRkNSX1JFRyA9IDQsCi0gIFNCR1JfUkVHID0gNSwKLSAgVEZJRk9fUkVHID0gOCwKLSAgU0ZJRk9fUkVHID0gMTIsCi19OwotCi0KLQotLyogcG9ydCBJRCdzICovCi0KLWVudW0KLSB7Ci0gIFJFU0VUX1BPUlQsCi0gIElOVF9QT1JULAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciB0eDM5MDRzaW9fcG9ydHNbXSA9IAotewotICB7ICJpbnQiLCBJTlRfUE9SVCwgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgInJlc2V0IiwgUkVTRVRfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyBOVUxMLCB9LAotfTsKLQotCi0KLS8qIEdlbmVyaWMgRklGTyAqLwotc3RydWN0IHR4MzkwNHNpb19maWZvIAotewotICBpbnQgc2l6ZSwgdXNlZDsKLSAgdW5zaWduZWRfMSAqYnVmZmVyOwotfTsKLQotCi0KLS8qIFRoZSB0aW1lci9jb3VudGVyIHJlZ2lzdGVyIGludGVybmFsIHN0YXRlLiAgTm90ZSB0aGF0IHdlIHN0b3JlCi0gICBzdGF0ZSB1c2luZyB0aGUgY29udHJvbCByZWdpc3RlciBpbWFnZXMsIGluIGhvc3QgZW5kaWFuIG9yZGVyLiAqLwotCi1zdHJ1Y3QgdHgzOTA0c2lvIAotewotICBhZGRyZXNzX3dvcmQgYmFzZV9hZGRyZXNzOyAvKiBjb250cm9sIHJlZ2lzdGVyIGJhc2UgKi8KLSAgZW51bSB7c2lvX3RjcCwgc2lvX3N0ZGlvfSBiYWNrZW5kOyAvKiBiYWNrZW5kICovCi0KLSAgc3RydWN0IHR4MzkwNHNpb19maWZvIHJ4X2ZpZm8sIHR4X2ZpZm87IC8qIEZJRk9zICovCi0KLSAgdW5zaWduZWRfNCBzbGNyOwotI2RlZmluZSBTTENSX1dSX01BU0sgICAgICAgIDB4ZTE3ZjAwMDBVCi0jZGVmaW5lIFNMQ1JfU0VUX0JZVEUoYyxvLGIpICgoYyktPnNsY3IgPSBTTENSX1dSX01BU0sgJiAoKChjKS0+c2xjciAmIH5MU01BU0szMigobykqOCs3LChvKSo4KSkgfCAoKGIpPDwgKG8pKjgpKSkKLSAgdW5zaWduZWRfNCBzbHNyOwotI2RlZmluZSBTTFNSX1dSX01BU0sgICAgICAgIDB4MDAwMDAwMDAgLyogVUZFUi9VUEVSL1VPRVIgdW5pbXBsZW1lbnRlZCAqLwotICB1bnNpZ25lZF80IHNkaWNyOwotI2RlZmluZSBTRElDUl9XUl9NQVNLICAgICAgIDB4MDAwZjAwMDBVCi0jZGVmaW5lIFNESUNSX1NFVF9CWVRFKGMsbyxiKSAoKGMpLT5zZGljciA9IFNESUNSX1dSX01BU0sgJiAoKChjKS0+c2RpY3IgJiB+TFNNQVNLMzIoKG8pKjgrNywobykqOCkpIHwgKChiKTw8IChvKSo4KSkpCi0jZGVmaW5lIFNESUNSX0dFVF9TRE1BRShjKSAgKChjKS0+c2RpY3IgJiAweDAwMDgwMDAwKQotI2RlZmluZSBTRElDUl9HRVRfRVJJRShjKSAgICgoYyktPnNkaWNyICYgMHgwMDA0MDAwMCkKLSNkZWZpbmUgU0RJQ1JfR0VUX1RESUUoYykgICAoKGMpLT5zZGljciAmIDB4MDAwMjAwMDApCi0jZGVmaW5lIFNESUNSX0dFVF9SRElFKGMpICAgKChjKS0+c2RpY3IgJiAweDAwMDEwMDAwKQotICB1bnNpZ25lZF80IHNkaXNyOwotI2RlZmluZSBTRElTUl9XUl9NQVNLICAgICAgIDB4MDAwNzAwMDBVCi0jZGVmaW5lIFNESVNSX1NFVF9CWVRFKGMsbyxiKSAoKGMpLT5zZGlzciA9IFNESVNSX1dSX01BU0sgJiAoKChjKS0+c2Rpc3IgJiB+TFNNQVNLMzIoKG8pKjgrNywobykqOCkpIHwgKChiKTw8IChvKSo4KSkpCi0jZGVmaW5lIFNESVNSX0NMRUFSX0ZMQUdfQllURShjLG8sYikgKChjKS0+c2Rpc3IgPSBTRElTUl9XUl9NQVNLICYgKCgoYyktPnNkaXNyICYgfkxTTUFTSzMyKChvKSo4KzcsKG8pKjgpKSAmICgoYik8PCAobykqOCkpKQotI2RlZmluZSBTRElTUl9HRVRfVERJUyhjKSAgICgoYyktPnNkaXNyICYgMHgwMDAyMDAwMCkKLSNkZWZpbmUgU0RJU1JfU0VUX1RESVMoYykgICAoKGMpLT5zZGlzciB8PSAweDAwMDIwMDAwKQotI2RlZmluZSBTRElTUl9HRVRfUkRJUyhjKSAgICgoYyktPnNkaXNyICYgMHgwMDAxMDAwMCkKLSNkZWZpbmUgU0RJU1JfU0VUX1JESVMoYykgICAoKGMpLT5zZGlzciB8PSAweDAwMDEwMDAwKQotICB1bnNpZ25lZF80IHNmY3I7Ci0jZGVmaW5lIFNGQ1JfV1JfTUFTSyAgICAgICAweDAwMWYwMDAwVQotI2RlZmluZSBTRkNSX1NFVF9CWVRFKGMsbyxiKSAoKGMpLT5zZmNyID0gU0ZDUl9XUl9NQVNLICYgKCgoYyktPnNmY3IgJiB+TFNNQVNLMzIoKG8pKjgrNywobykqOCkpIHwgKChiKTw8IChvKSo4KSkpCi0jZGVmaW5lIFNGQ1JfR0VUX1RGUlNUKGMpICAgKChjKS0+c2ZjciAmIDB4MDAwNDAwMDApCi0jZGVmaW5lIFNGQ1JfR0VUX1JGUlNUKGMpICAgKChjKS0+c2ZjciAmIDB4MDAwMjAwMDApCi0jZGVmaW5lIFNGQ1JfR0VUX0ZSU1RFKGMpICAgKChjKS0+c2ZjciAmIDB4MDAwMTAwMDApCi0gIHVuc2lnbmVkXzQgc2JncjsKLSNkZWZpbmUgU0JHUl9XUl9NQVNLICAgICAgIDB4MDNmZjAwMDBVCi0jZGVmaW5lIFNCR1JfU0VUX0JZVEUoYyxvLGIpICgoYyktPnNiZ3IgPSBTQkdSX1dSX01BU0sgJiAoKChjKS0+c2JnciAmIH5MU01BU0szMigobykqOCs3LChvKSo4KSkgfCAoKGIpPDwgKG8pKjgpKSkKLQotICAvKiBQZXJpb2RpYyBJL08gcG9sbGluZyAqLwotICBzdHJ1Y3QgaHdfZXZlbnQqIHBvbGxfZXZlbnQ7Ci19OwotCi0KLQotLyogRmluaXNoIG9mZiB0aGUgcGFydGlhbGx5IGNyZWF0ZWQgaHcgZGV2aWNlLiAgQXR0YWNoIG91ciBsb2NhbAotICAgY2FsbGJhY2tzLiAgV2lyZSB1cCBvdXIgcG9ydCBuYW1lcyBldGMgKi8KLQotc3RhdGljIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCB0eDM5MDRzaW9faW9fcmVhZF9idWZmZXI7Ci1zdGF0aWMgaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCB0eDM5MDRzaW9faW9fd3JpdGVfYnVmZmVyOwotc3RhdGljIGh3X3BvcnRfZXZlbnRfbWV0aG9kIHR4MzkwNHNpb19wb3J0X2V2ZW50OwotCi0KLXN0YXRpYyB2b2lkCi1hdHRhY2hfdHgzOTA0c2lvX3JlZ3MgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgIHN0cnVjdCB0eDM5MDRzaW8gKmNvbnRyb2xsZXIpCi17Ci0gIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7Ci0gIGludCBhdHRhY2hfc3BhY2U7Ci0gIHVuc2lnbmVkIGF0dGFjaF9zaXplOwotICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0KLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLQotICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIDAsICZyZWcpKQotICAgIGh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIG9uZSBhZGRyL3NpemUgZW50cnkiKTsKLQotICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCSAgICAgJnJlZy5hZGRyZXNzLAotCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwKLQkJCQkgICAgICZhdHRhY2hfYWRkcmVzcywKLQkJCQkgICAgIG1lKTsKLSAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKLQkJCSAgICAgICAmcmVnLnNpemUsCi0JCQkgICAgICAgJmF0dGFjaF9zaXplLCBtZSk7Ci0KLSAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLCAwLAotCQkgICAgIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAotCQkgICAgIG1lKTsKLQotICBpZihod19maW5kX3Byb3BlcnR5KG1lLCAiYmFja2VuZCIpICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciogdmFsdWUgPSBod19maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgImJhY2tlbmQiKTsKLSAgICAgIGlmKCEgc3RyY21wKHZhbHVlLCAidGNwIikpCi0JY29udHJvbGxlci0+YmFja2VuZCA9IHNpb190Y3A7Ci0gICAgICBlbHNlIGlmKCEgc3RyY21wKHZhbHVlLCAic3RkaW8iKSkKLQljb250cm9sbGVyLT5iYWNrZW5kID0gc2lvX3N0ZGlvOwotICAgICAgZWxzZQotCWh3X2Fib3J0KG1lLCAiaWxsZWdhbCB2YWx1ZSBmb3IgYmFja2VuZCBwYXJhbWV0ZXIgYCVzJzogdXNlIHRjcCBvciBzdGRpbyIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgY29udHJvbGxlci0+YmFzZV9hZGRyZXNzID0gYXR0YWNoX2FkZHJlc3M7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXR4MzkwNHNpb19maW5pc2ggKHN0cnVjdCBodyAqbWUpCi17Ci0gIHN0cnVjdCB0eDM5MDRzaW8gKmNvbnRyb2xsZXI7Ci0KLSAgY29udHJvbGxlciA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCB0eDM5MDRzaW8pOwotICBzZXRfaHdfZGF0YSAobWUsIGNvbnRyb2xsZXIpOwotICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCB0eDM5MDRzaW9faW9fcmVhZF9idWZmZXIpOwotICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgdHgzOTA0c2lvX2lvX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od19wb3J0cyAobWUsIHR4MzkwNHNpb19wb3J0cyk7Ci0gIHNldF9od19wb3J0X2V2ZW50IChtZSwgdHgzOTA0c2lvX3BvcnRfZXZlbnQpOwotCi0gIC8qIFByZXNldCBkZWZhdWx0cyAqLwotICBjb250cm9sbGVyLT5iYWNrZW5kID0gc2lvX3N0ZGlvOwotCi0gIC8qIEF0dGFjaCBvdXJzZWxmIHRvIG91ciBwYXJlbnQgYnVzICovCi0gIGF0dGFjaF90eDM5MDRzaW9fcmVncyAobWUsIGNvbnRyb2xsZXIpOwotCi0gIC8qIEluaXRpYWxpemUgdG8gcmVzZXQgc3RhdGUgKi8KLSAgdHgzOTA0c2lvX2ZpZm9fcmVzZXQobWUsICYgY29udHJvbGxlci0+cnhfZmlmbyk7Ci0gIHR4MzkwNHNpb19maWZvX3Jlc2V0KG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pOwotICBjb250cm9sbGVyLT5zbHNyID0gY29udHJvbGxlci0+c2RpY3IKLSAgICA9IGNvbnRyb2xsZXItPnNkaXNyID0gY29udHJvbGxlci0+c2ZjcgotICAgID0gY29udHJvbGxlci0+c2JnciA9IDA7Ci0gIGNvbnRyb2xsZXItPnNsY3IgPSAweDQwMDAwMDAwOyAvKiBzZXQgVFdVQiAqLwotICBjb250cm9sbGVyLT5zYmdyID0gMHgwM2ZmMDAwMDsgLyogc2V0IEJDTEs9MywgQlJEPUZGICovCi0gIGNvbnRyb2xsZXItPnBvbGxfZXZlbnQgPSBOVUxMOwotfQotCi0KLQotLyogQW4gZXZlbnQgYXJyaXZlcyBvbiBhbiBpbnRlcnJ1cHQgcG9ydCAqLwotCi1zdGF0aWMgdm9pZAotdHgzOTA0c2lvX3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgaW50IG15X3BvcnQsCi0JCSAgICAgc3RydWN0IGh3ICpzb3VyY2UsCi0JCSAgICAgaW50IHNvdXJjZV9wb3J0LAotCQkgICAgIGludCBsZXZlbCkKLXsKLSAgc3RydWN0IHR4MzkwNHNpbyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLQotICBzd2l0Y2ggKG15X3BvcnQpCi0gICAgewotICAgIGNhc2UgUkVTRVRfUE9SVDoKLSAgICAgIHsKLQlIV19UUkFDRSAoKG1lLCAicmVzZXQiKSk7Ci0KLQl0eDM5MDRzaW9fZmlmb19yZXNldChtZSwgJiBjb250cm9sbGVyLT5yeF9maWZvKTsKLQl0eDM5MDRzaW9fZmlmb19yZXNldChtZSwgJiBjb250cm9sbGVyLT50eF9maWZvKTsKLQljb250cm9sbGVyLT5zbHNyID0gY29udHJvbGxlci0+c2RpY3IKLQkgID0gY29udHJvbGxlci0+c2Rpc3IgPSBjb250cm9sbGVyLT5zZmNyCi0JICA9IGNvbnRyb2xsZXItPnNiZ3IgPSAwOwotCWNvbnRyb2xsZXItPnNsY3IgPSAweDQwMDAwMDAwOyAvKiBzZXQgVFdVQiAqLwotCWNvbnRyb2xsZXItPnNiZ3IgPSAweDAzZmYwMDAwOyAvKiBzZXQgQkNMSz0zLCBCUkQ9RkYgKi8KLQkvKiBEb24ndCBpbnRlcmZlcmUgd2l0aCBJL08gcG9sbGVyLiAqLwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGh3X2Fib3J0IChtZSwgIkV2ZW50IG9uIHVua25vd24gcG9ydCAlZCIsIG15X3BvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qIGdlbmVyaWMgcmVhZC93cml0ZSAqLwotCi1zdGF0aWMgdW5zaWduZWQKLXR4MzkwNHNpb19pb19yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSB2b2lkICpkZXN0LAotCQkJIGludCBzcGFjZSwKLQkJCSB1bnNpZ25lZF93b3JkIGJhc2UsCi0JCQkgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCB0eDM5MDRzaW8gKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgSFdfVFJBQ0UgKChtZSwgInJlYWQgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOwotCi0gIC8qIHRpY2tsZSBmaWZvcyAqLwotICB0eDM5MDRzaW9fdGlja2xlKG1lKTsKLQotICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbnJfYnl0ZXM7IGJ5dGUrKykKLSAgICB7Ci0gICAgICBhZGRyZXNzX3dvcmQgYWRkcmVzcyA9IGJhc2UgKyBieXRlOwotICAgICAgaW50IHJlZ19udW1iZXIgPSAoYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcykgLyA0OwotICAgICAgaW50IHJlZ19vZmZzZXQgPSAoYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcykgJSA0OwotICAgICAgdW5zaWduZWRfNCByZWdpc3Rlcl92YWx1ZTsgLyogaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotICAgICAgLyogZmlsbCBpbiBlbnRpcmUgcmVnaXN0ZXJfdmFsdWUgd29yZCAqLwotICAgICAgc3dpdGNoIChyZWdfbnVtYmVyKQotCXsKLQljYXNlIFNMQ1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNsY3I7IGJyZWFrOwotCWNhc2UgU0xTUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+c2xzcjsgYnJlYWs7Ci0JY2FzZSBTRElDUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+c2RpY3I7IGJyZWFrOwotCWNhc2UgU0RJU1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNkaXNyOyBicmVhazsKLQljYXNlIFNGQ1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNmY3I7IGJyZWFrOwotCWNhc2UgU0JHUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+c2JncjsgYnJlYWs7Ci0JY2FzZSBURklGT19SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gMDsgYnJlYWs7Ci0JY2FzZSBTRklGT19SRUc6Ci0JICAvKiBjb25zdW1lIHJ4IGZpZm8gZm9yIE1TIGJ5dGUgKi8KLQkgIGlmKHJlZ19vZmZzZXQgPT0gMCAmJiB0eDM5MDRzaW9fZmlmb19ub25lbXB0eShtZSwgJiBjb250cm9sbGVyLT5yeF9maWZvKSkKLQkgICAgcmVnaXN0ZXJfdmFsdWUgPSAodHgzOTA0c2lvX2ZpZm9fcG9wKG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8pIDw8IDI0KTsKLQkgIGVsc2UKLQkgICAgcmVnaXN0ZXJfdmFsdWUgPSAwOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDogcmVnaXN0ZXJfdmFsdWUgPSAwOwotCX0KLQotICAgICAgLyogd3JpdGUgcmVxdWVzdGVkIGJ5dGUgb3V0ICovCi0gICAgICByZWdpc3Rlcl92YWx1ZSA9IEgyVF80KHJlZ2lzdGVyX3ZhbHVlKTsKLSAgICAgIC8qIEhXX1RSQUNFICgobWUsICJieXRlICVkICUwMngiLCByZWdfb2Zmc2V0LCAoKGNoYXIqKSYgcmVnaXN0ZXJfdmFsdWUpW3JlZ19vZmZzZXRdKSk7ICovCi0gICAgICBtZW1jcHkgKChjaGFyKikgZGVzdCArIGJ5dGUsICgoY2hhciopJiByZWdpc3Rlcl92YWx1ZSkrcmVnX29mZnNldCwgMSk7Ci0gICAgfQotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi0KLQotc3RhdGljIHVuc2lnbmVkCi10eDM5MDRzaW9faW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgIGludCBzcGFjZSwKLQkJCSAgdW5zaWduZWRfd29yZCBiYXNlLAotCQkJICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IHR4MzkwNHNpbyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICBIV19UUkFDRSAoKG1lLCAid3JpdGUgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOwotICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbnJfYnl0ZXM7IGJ5dGUrKykKLSAgICB7Ci0gICAgICBhZGRyZXNzX3dvcmQgYWRkcmVzcyA9IGJhc2UgKyBieXRlOwotICAgICAgdW5zaWduZWRfMSB3cml0ZV9ieXRlID0gKChjb25zdCB1bnNpZ25lZCBjaGFyKikgc291cmNlKVtieXRlXTsKLSAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKLSAgICAgIGludCByZWdfb2Zmc2V0ID0gMyAtIChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAlIDQ7Ci0KLSAgICAgIC8qIEhXX1RSQUNFICgobWUsICJieXRlICVkICUwMngiLCByZWdfb2Zmc2V0LCB3cml0ZV9ieXRlKSk7ICovCi0KLSAgICAgIC8qIGZpbGwgaW4gZW50aXJlIHJlZ2lzdGVyX3ZhbHVlIHdvcmQgKi8KLSAgICAgIHN3aXRjaCAocmVnX251bWJlcikKLQl7Ci0JY2FzZSBTTENSX1JFRzoKLQkgIFNMQ1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7Ci0JICBicmVhazsKLQotCWNhc2UgU0xTUl9SRUc6IC8qIHVud3JpdGVhYmxlICovIGJyZWFrOwotCi0JY2FzZSBTRElDUl9SRUc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkXzQgbGFzdF9pbnQsIG5leHRfaW50OwotCSAgICAKLQkgICAgLyogZGVhc3NlcnQgaW50ZXJydXB0IHVwb24gY2xlYXIgKi8KLQkgICAgbGFzdF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOwotCSAgICAvKiBIV19UUkFDRSAoKG1lLCAic2RpY3IgLSBzZGlzciAlMDh4IHNkaWNyICUwOHgiLAotCSAgICAgICBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KLQkgICAgU0RJQ1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7Ci0JICAgIC8qIEhXX1RSQUNFICgobWUsICJzZGljciArIHNkaXNyICUwOHggc2RpY3IgJTA4eCIsCi0JICAgICAgIGNvbnRyb2xsZXItPnNkaXNyLCBjb250cm9sbGVyLT5zZGljcikpOyAqLwotCSAgICBuZXh0X2ludCA9IGNvbnRyb2xsZXItPnNkaXNyICYgY29udHJvbGxlci0+c2RpY3I7Ci0JICAgIAotCSAgICBpZihTRElDUl9HRVRfU0RNQUUoY29udHJvbGxlcikpCi0JICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgc3VwcG9ydCBETUEtZHJpdmVuIHNpby4iKTsKLQotCSAgICBpZih+bGFzdF9pbnQgJiBuZXh0X2ludCkgLyogYW55IGJpdHMgc2V0PyAqLwotCSAgICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKLQkgICAgaWYobGFzdF9pbnQgJiB+bmV4dF9pbnQpIC8qIGFueSBiaXRzIGNsZWFyZWQ/ICovCi0JICAgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDApOwotCSAgfQotCWJyZWFrOwotCi0JY2FzZSBTRElTUl9SRUc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkXzQgbGFzdF9pbnQsIG5leHRfaW50OwotCi0JICAgIC8qIGRlYXNzZXJ0IGludGVycnVwdCB1cG9uIGNsZWFyICovCi0JICAgIGxhc3RfaW50ID0gY29udHJvbGxlci0+c2Rpc3IgJiBjb250cm9sbGVyLT5zZGljcjsKLQkgICAgLyogSFdfVFJBQ0UgKChtZSwgInNkaXNyIC0gc2Rpc3IgJTA4eCBzZGljciAlMDh4IiwgCi0JICAgICAgIGNvbnRyb2xsZXItPnNkaXNyLCBjb250cm9sbGVyLT5zZGljcikpOyAqLwotCSAgICBTRElTUl9DTEVBUl9GTEFHX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7Ci0JICAgIC8qIEhXX1RSQUNFICgobWUsICJzZGlzciArIHNkaXNyICUwOHggc2RpY3IgJTA4eCIsIAotCSAgICAgICBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KLQkgICAgbmV4dF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOwotCi0JICAgIGlmKH5sYXN0X2ludCAmIG5leHRfaW50KSAvKiBhbnkgYml0cyBzZXQ/ICovCi0JICAgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDEpOwotCSAgICBpZihsYXN0X2ludCAmIH5uZXh0X2ludCkgLyogYW55IGJpdHMgY2xlYXJlZD8gKi8KLQkgICAgICBod19wb3J0X2V2ZW50KG1lLCBJTlRfUE9SVCwgMCk7Ci0JICB9Ci0JYnJlYWs7Ci0JCi0JY2FzZSBTRkNSX1JFRzoKLQkgIFNGQ1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7Ci0JICBpZihTRkNSX0dFVF9GUlNURShjb250cm9sbGVyKSkKLQkgICAgewotCSAgICAgIGlmKFNGQ1JfR0VUX1RGUlNUKGNvbnRyb2xsZXIpKSB0eDM5MDRzaW9fZmlmb19yZXNldChtZSwgJiBjb250cm9sbGVyLT50eF9maWZvKTsKLQkgICAgICBpZihTRkNSX0dFVF9SRlJTVChjb250cm9sbGVyKSkgdHgzOTA0c2lvX2ZpZm9fcmVzZXQobWUsICYgY29udHJvbGxlci0+cnhfZmlmbyk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBTQkdSX1JFRzoKLQkgIFNCR1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgU0ZJRk9fUkVHOiAvKiB1bndyaXRlYWJsZSAqLyBicmVhazsKLQkgIAotCWNhc2UgVEZJRk9fUkVHOiAKLQkgIGlmKHJlZ19vZmZzZXQgPT0gMykgLyogZmlyc3QgYnl0ZSAqLwotCSAgICB0eDM5MDRzaW9fZmlmb19wdXNoKG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8sIHdyaXRlX2J5dGUpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OiAKLQkgIEhXX1RSQUNFICgobWUsICJ3cml0ZSB0byBpbGxlZ2FsIHJlZ2lzdGVyICVkIiwgcmVnX251bWJlcikpOwotCX0KLSAgICB9IC8qIGxvb3Agb3ZlciBieXRlcyAqLwotCi0gIC8qIHRpY2tsZSBmaWZvcyAqLwotICB0eDM5MDRzaW9fdGlja2xlKG1lKTsKLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19ICAgICAKLQotCi0KLQotCi0KLS8qIFNlbmQgZW5xdWV1ZWQgY2hhcmFjdGVycyBmcm9tIHR4X2ZpZm8gYW5kIHRyaWdnZXIgVFggaW50ZXJydXB0LgotUmVjZWl2ZSBjaGFyYWN0ZXJzIGludG8gcnhfZmlmbyBhbmQgdHJpZ2dlciBSWCBpbnRlcnJ1cHQuICovCi12b2lkCi10eDM5MDRzaW9fdGlja2xlKHN0cnVjdCBodyAqbWUpCi17Ci0gIHN0cnVjdCB0eDM5MDRzaW8qIGNvbnRyb2xsZXIgPSBod19kYXRhKG1lKTsKLSAgaW50IGM7Ci0gIGNoYXIgY2M7Ci0gIHVuc2lnbmVkXzQgbGFzdF9pbnQsIG5leHRfaW50OwotCi0gIC8qIEhXX1RSQUNFICgobWUsICJ0aWNrbGUgYmFja2VuZDogJTAyeCIsIGNvbnRyb2xsZXItPmJhY2tlbmQpKTsgKi8KLSAgc3dpdGNoKGNvbnRyb2xsZXItPmJhY2tlbmQpIAotICAgIHsKLSAgICBjYXNlIHNpb190Y3A6Ci0KLSAgICAgIHdoaWxlKHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pKQotCXsKLQkgIGNjID0gdHgzOTA0c2lvX2ZpZm9fcG9wKG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pOwotCSAgZHZfc29ja3Nlcl93cml0ZShod19zeXN0ZW0obWUpLCBjYyk7Ci0JICBIV19UUkFDRSAoKG1lLCAidGNwIG91dHB1dDogJTAyeCIsIGNjKSk7Ci0JfQotCi0gICAgICBjID0gZHZfc29ja3Nlcl9yZWFkKGh3X3N5c3RlbShtZSkpOwotICAgICAgd2hpbGUoYyAhPSAtMSkKLQl7Ci0JICBjYyA9IChjaGFyKSBjOwotCSAgSFdfVFJBQ0UgKChtZSwgInRjcCBpbnB1dDogJTAyeCIsIGNjKSk7Ci0JICB0eDM5MDRzaW9fZmlmb19wdXNoKG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8sIGNjKTsKLQkgIGMgPSBkdl9zb2Nrc2VyX3JlYWQoaHdfc3lzdGVtKG1lKSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHNpb19zdGRpbzoKLQotICAgICAgd2hpbGUodHgzOTA0c2lvX2ZpZm9fbm9uZW1wdHkobWUsICYgY29udHJvbGxlci0+dHhfZmlmbykpCi0JewotCSAgY2MgPSB0eDM5MDRzaW9fZmlmb19wb3AobWUsICYgY29udHJvbGxlci0+dHhfZmlmbyk7Ci0JICBzaW1faW9fd3JpdGVfc3Rkb3V0KGh3X3N5c3RlbShtZSksICYgY2MsIDEpOwotCSAgc2ltX2lvX2ZsdXNoX3N0ZG91dChod19zeXN0ZW0obWUpKTsKLQkgIEhXX1RSQUNFICgobWUsICJzdGRpbyBvdXRwdXQ6ICUwMngiLCBjYykpOwotCX0KLQotICAgICAgYyA9IHNpbV9pb19wb2xsX3JlYWQoaHdfc3lzdGVtKG1lKSwgMCAvKiBzdGRpbiAqLywgJiBjYywgMSk7Ci0gICAgICB3aGlsZShjID09IDEpCi0JewotCSAgSFdfVFJBQ0UgKChtZSwgInN0ZGlvIGlucHV0OiAlMDJ4IiwgY2MpKTsKLQkgIHR4MzkwNHNpb19maWZvX3B1c2gobWUsICYgY29udHJvbGxlci0+cnhfZmlmbywgY2MpOwotCSAgYyA9IHNpbV9pb19wb2xsX3JlYWQoaHdfc3lzdGVtKG1lKSwgMCAvKiBzdGRpbiAqLywgJiBjYywgMSk7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBod19hYm9ydChtZSwgIklsbGVnYWwgYmFja2VuZCBtb2RlOiAlZCIsIGNvbnRyb2xsZXItPmJhY2tlbmQpOwotICAgIH0KLQotICAvKiBVcGRhdGUgUkRJUyAvIFRESVMgZmxhZ3MgKi8KLSAgbGFzdF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOwotICAvKiBIV19UUkFDRSAoKG1lLCAidGlja2xlIC0gc2Rpc3IgJTA4eCBzZGljciAlMDh4IiwgY29udHJvbGxlci0+c2Rpc3IsIGNvbnRyb2xsZXItPnNkaWNyKSk7ICovCi0gIGlmKHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8pKQotICAgIFNESVNSX1NFVF9SRElTKGNvbnRyb2xsZXIpOwotICBpZighIHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pKQotICAgIFNESVNSX1NFVF9URElTKGNvbnRyb2xsZXIpOwotICBuZXh0X2ludCA9IGNvbnRyb2xsZXItPnNkaXNyICYgY29udHJvbGxlci0+c2RpY3I7Ci0gIC8qIEhXX1RSQUNFICgobWUsICJ0aWNrbGUgKyBzZGlzciAlMDh4IHNkaWNyICUwOHgiLCBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KLQotICBpZih+bGFzdF9pbnQgJiBuZXh0X2ludCkgLyogYW55IGJpdHMgc2V0PyAqLwotICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKLSAgaWYobGFzdF9pbnQgJiB+bmV4dF9pbnQpIC8qIGFueSBiaXRzIGNsZWFyZWQ/ICovCi0gICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDApOwotCi0gIC8qIEFkZCBwZXJpb2RpYyBwb2xsaW5nIGZvciB0aGlzIHBvcnQsIGlmIGl0J3Mgbm90IGFscmVhZHkgZ29pbmcuICovCi0gIGlmKGNvbnRyb2xsZXItPnBvbGxfZXZlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb250cm9sbGVyLT5wb2xsX2V2ZW50ID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxMDAwLAotCQkJCQkJCXR4MzkwNHNpb19wb2xsLCBOVUxMKTsKLQotICAgIH0KLX0KLQotCi0KLQotaW50Ci10eDM5MDRzaW9fZmlmb19ub25lbXB0eShzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCi17Ci0gIC8qIEhXX1RSQUNFICgobWUsICJmaWZvIHVzZWQ6ICVkIiwgZmlmby0+dXNlZCkpOyAqLwotICByZXR1cm4oZmlmby0+dXNlZCA+IDApOwotfQotCi0KLWNoYXIKLXR4MzkwNHNpb19maWZvX3BvcChzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCi17Ci0gIGNoYXIgaXQ7Ci0gIEFTU0VSVChmaWZvLT51c2VkID4gMCk7Ci0gIEFTU0VSVChmaWZvLT5idWZmZXIgIT0gTlVMTCk7Ci0gIGl0ID0gZmlmby0+YnVmZmVyWzBdOwotICBtZW1jcHkoJiBmaWZvLT5idWZmZXJbMF0sICYgZmlmby0+YnVmZmVyWzFdLCBmaWZvLT51c2VkIC0gMSk7Ci0gIGZpZm8tPnVzZWQgLS07Ci0gIC8qIEhXX1RSQUNFICgobWUsICJwb3AgZmlmbyAtPiAlMDJ4IiwgaXQpKTsgKi8KLSAgcmV0dXJuIGl0OwotfQotCi0KLXZvaWQKLXR4MzkwNHNpb19maWZvX3B1c2goc3RydWN0IGh3KiBtZSwgc3RydWN0IHR4MzkwNHNpb19maWZvKiBmaWZvLCBjaGFyIGl0KQotewotICAvKiBIV19UUkFDRSAoKG1lLCAicHVzaCAlMDJ4IC0+IGZpZm8iLCBpdCkpOyAqLwotICBpZihmaWZvLT5zaXplID09IGZpZm8tPnVzZWQpIC8qIGZ1bGwgKi8KLSAgICB7Ci0gICAgICBpbnQgbmV4dF9zaXplID0gZmlmby0+c2l6ZSAqIDIgKyAxNjsKLSAgICAgIGNoYXIqIG5leHRfYnVmID0gemFsbG9jKG5leHRfc2l6ZSk7Ci0gICAgICBtZW1jcHkobmV4dF9idWYsIGZpZm8tPmJ1ZmZlciwgZmlmby0+dXNlZCk7Ci0KLSAgICAgIGlmKGZpZm8tPmJ1ZmZlciAhPSBOVUxMKSB6ZnJlZShmaWZvLT5idWZmZXIpOwotICAgICAgZmlmby0+YnVmZmVyID0gbmV4dF9idWY7Ci0gICAgICBmaWZvLT5zaXplID0gbmV4dF9zaXplOwotICAgIH0KLQotICBmaWZvLT5idWZmZXJbZmlmby0+dXNlZF0gPSBpdDsKLSAgZmlmby0+dXNlZCArKzsKLX0KLQotCi12b2lkCi10eDM5MDRzaW9fZmlmb19yZXNldChzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCi17Ci0gIC8qIEhXX1RSQUNFICgobWUsICJyZXNldCBmaWZvIikpOyAqLwotICBmaWZvLT51c2VkID0gMDsKLSAgZmlmby0+c2l6ZSA9IDA7Ci0gIHpmcmVlKGZpZm8tPmJ1ZmZlcik7Ci0gIGZpZm8tPmJ1ZmZlciA9IDA7Ci19Ci0KLQotdm9pZAotdHgzOTA0c2lvX3BvbGwoc3RydWN0IGh3KiBtZSwgdm9pZCogaWdub3JlZCkKLXsKLSAgc3RydWN0IHR4MzkwNHNpbyogY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgdHgzOTA0c2lvX3RpY2tsZSAobWUpOwotICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgY29udHJvbGxlci0+cG9sbF9ldmVudCk7Ci0gIGNvbnRyb2xsZXItPnBvbGxfZXZlbnQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEwMDAsCi0JCQkJCQkgICAgdHgzOTA0c2lvX3BvbGwsIE5VTEwpOwotfQotCi0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfdHgzOTA0c2lvX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAidHgzOTA0c2lvIiwgdHgzOTA0c2lvX2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvZHYtdHgzOTA0dG1yLmMgYi9zaW0vbWlwcy9kdi10eDM5MDR0bXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjN2I4Yy4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9kdi10eDM5MDR0bXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5OCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImh3LW1haW4uaCIKLQotCi0vKiBERVZJQ0UKLQotICAgCi0gICB0eDM5MDR0bXIgLSB0eDM5MDQgdGltZXIKLQotICAgCi0gICBERVNDUklQVElPTgotCi0gICAKLSAgIEltcGxlbWVudHMgb25lIHR4MzkwNCB0aW1lci9jb3VudGVyIGRlc2NyaWJlZCBpbiB0aGUgdHgzOTA0Ci0gICB1c2VyIGd1aWRlLiAgVGhyZWUgaW5zdGFuY2VzIGFyZSByZXF1aXJlZCBmb3IgVE1SMCwgVE1SMSwgYW5kCi0gICBUTVIzIHdpdGhpbiB0aGUgdHgzOTA0LCBhdCBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzZXMuICAKLQotICAgQm90aCBpbnRlcm5hbCBhbmQgc3lzdGVtIGNsb2NrcyBhcmUgc3ludGhlc2l6ZWQgYXMgZGl2aWRlZCB2ZXJzaW9ucwotICAgb2YgdGhlIHNpbXVsYXRvciBjbG9jay4KLSAgIAotICAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3I6Ci0gICAgLSBlZGdlIHNlbnNpdGl2aXR5IG9mIGV4dGVybmFsIGNsb2NrCi0gICAgLSBkaWZmZXJlbnQgbW9kZSByZXN0cmljdGlvbnMgZm9yIFRNUjAuLjIKLSAgICAtIGxldmVsIGludGVycnVwdHMgKGludGVycnVwdHMgYXJlIHRyZWF0ZWQgYXMgZXZlbnRzIHRoYXQgb2NjdXIgYXQgZWRnZXMpCi0KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgcmVnIDxiYXNlPiA8bGVuZ3RoPgotCi0gICBCYXNlIG9mIFRNUiBjb250cm9sIHJlZ2lzdGVyIGJhbmsuICA8bGVuZ3RoPiBtdXN0IGVxdWFsIDB4MTAwLgotICAgUmVnaXN0ZXIgb2Zmc2V0czogICAgICAgMDogVENSOiB0aW1lciBjb250cm9sICByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgNDogVElTUjogdGltZXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgODogQ1BSQTogY29tcGFyZSByZWdpc3RlciBBCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEyOiBDUFJCOiBjb21wYXJlIHJlZ2lzdGVyIEIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6IElUTVI6IGludGVydmFsIHRpbWVyIG1vZGUgcmVnaXN0ZXIKLQkJCSAgMzI6IENDRFI6IGRpdmlkZXIgcmVnaXN0ZXIKLQkJCSAgNDg6IFBNR1I6IHB1bHNlIGdlbmVyYXRvciBtb2RlIHJlZ2lzdGVyCi0JCQkgIDY0OiBXVE1SOiB3YXRjaGRvZyB0aW1lciBtb2RlIHJlZ2lzdGVyCi0JCQkgMjQwOiBUUlI6IHRpbWVyIHJlYWQgcmVnaXN0ZXIKLQotCi0gICBjbG9jayA8dGlja3M+Ci0KLSAgIFJhdGUgb2YgdGltZXIgY2xvY2sgc2lnbmFsLiAgVGhpcyBudW1iZXIgaXMgdGhlIG51bWJlciBvZiBzaW11bGF0b3IKLSAgIHRpY2tzIHBlciBjbG9jayBzaWduYWwgdGljay4gIERlZmF1bHQgMS4KLQotICAgCi0gICBleHQgPHRpY2tzPgotCi0gICBSYXRlIG9mICJleHRlcm5hbCBpbnB1dCBjbG9jayBzaWduYWwiLCB0aGUgb3RoZXIgY2xvY2sgaW5wdXQgb2YgdGhlCi0gICB0aW1lci4gIEl0IHVzZXMgdGhlIHNhbWUgc2NhbGUgYXMgYWJvdmUuICBEZWZhdWx0IDEwMC4KLQotCi0KLSAgIFBPUlRTCi0KLQotICAgaW50IChvdXRwdXQpCi0KLSAgIEludGVycnVwdCBwb3J0LiAgQW4gZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gYSB0aW1lciBpbnRlcnJ1cHQKLSAgIG9jY3Vycy4KLQotCi0gICBmZiAob3V0cHV0KQotCi0gICBGbGlwLWZsb3Agb3V0cHV0LCBjb3JyZXNwb25kcyB0byB0aGUgVE1GRk9VVCBwb3J0LiAgQW4gZXZlbnQgaXMKLSAgIGdlbmVyYXRlZCB3aGVuIGZsaXAtZmxvcCBjaGFuZ2VzIHZhbHVlLiAgVGhlIGludGVnZXIgYXNzb2NpYXRlZAotICAgd2l0aCB0aGUgZXZlbnQgaXMgMS8wIGFjY29yZGluZyB0byBmbGlwLWZsb3AgdmFsdWUuCi0KLQotICAgcmVzZXQgKGlucHV0KQotCi0gICBSZXNldCBwb3J0LgotCi0gICAqLwotCi0KLQotLyogc3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBkZWxpdmVyX3R4MzkwNHRtcl90aWNrIChzdHJ1Y3QgaHcgKm1lLCB2b2lkICpkYXRhKTsKLQotCi0vKiByZWdpc3RlciBudW1iZXJzOyBlYWNoIGlzIG9uZSB3b3JkIGxvbmcgKi8KLWVudW0gCi17Ci0gIFRDUl9SRUcgPSAwLAotICBUSVNSX1JFRyA9IDEsCi0gIENQUkFfUkVHID0gMiwKLSAgQ1BSQl9SRUcgPSAzLAotICBJVE1SX1JFRyA9IDQsCi0gIENDRFJfUkVHID0gOCwKLSAgUE1HUl9SRUcgPSAxMiwKLSAgV1RNUl9SRUcgPSAxNiwKLSAgVFJSX1JFRyA9IDYwCi19OwotCi0KLQotLyogcG9ydCBJRCdzICovCi0KLWVudW0KLSB7Ci0gIFJFU0VUX1BPUlQsCi0gIElOVF9QT1JULAotICBGRl9QT1JUCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHR4MzkwNHRtcl9wb3J0c1tdID0gCi17Ci0gIHsgImludCIsIElOVF9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAiZmYiLCBGRl9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAicmVzZXQiLCBSRVNFVF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7IE5VTEwsIH0sCi19OwotCi0KLQotLyogVGhlIHRpbWVyL2NvdW50ZXIgcmVnaXN0ZXIgaW50ZXJuYWwgc3RhdGUuICBOb3RlIHRoYXQgd2Ugc3RvcmUKLSAgIHN0YXRlIHVzaW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGltYWdlcywgaW4gaG9zdCBlbmRpYW4gb3JkZXIuICovCi0KLXN0cnVjdCB0eDM5MDR0bXIgewotICBhZGRyZXNzX3dvcmQgYmFzZV9hZGRyZXNzOyAvKiBjb250cm9sIHJlZ2lzdGVyIGJhc2UgKi8KLSAgdW5zaWduZWRfNCBjbG9ja190aWNrcywgZXh0X3RpY2tzOyAvKiBjbG9jayBmcmVxdWVuY2llcyAqLwotICBzaWduZWRfOCBsYXN0X3RpY2tzOyAvKiB0aW1lIGF0IGxhc3QgZGVsaXZlcl8qX3RpY2sgY2FsbCAqLwotICBzaWduZWRfOCByb3VuZG9mZl90aWNrczsgLyogc2ltIHRpY2tzIHVucHJvY2Vzc2VkIGR1cmluZyBsYXN0IHRpY2sgY2FsbCAqLwotICBpbnQgZmY7IC8qIHB1bHNlIGdlbmVyYXRvciBmbGlwLWZsb3AgdmFsdWU6IDEvMCAqLwotICBzdHJ1Y3QgaHdfZXZlbnQqIGV2ZW50OyAvKiBsYXN0IHNjaGVkdWxlZCBldmVudCAqLwotCi0gIHVuc2lnbmVkXzQgdGNyOwotI2RlZmluZSBHRVRfVENSX1RDRShjKSAgICAgICgoKGMpLT50Y3IgJiAweDgwKSA+PiA3KQotI2RlZmluZSBHRVRfVENSX0NDREUoYykgICAgICgoKGMpLT50Y3IgJiAweDQwKSA+PiA2KQotI2RlZmluZSBHRVRfVENSX0NSRShjKSAgICAgICgoKGMpLT50Y3IgJiAweDIwKSA+PiA1KQotI2RlZmluZSBHRVRfVENSX0NDUyhjKSAgICAgICgoKGMpLT50Y3IgJiAweDA0KSA+PiAyKQotI2RlZmluZSBHRVRfVENSX1RNT0RFKGMpICAgICgoKGMpLT50Y3IgJiAweDAzKSA+PiAwKQotICB1bnNpZ25lZF80IHRpc3I7Ci0jZGVmaW5lIFNFVF9USVNSX1RXSVMoYykgICAgKChjKS0+dGlzciB8PSAweDA4KQotI2RlZmluZSBTRVRfVElTUl9UUElCUyhjKSAgICgoYyktPnRpc3IgfD0gMHgwNCkKLSNkZWZpbmUgU0VUX1RJU1JfVFBJQVMoYykgICAoKGMpLT50aXNyIHw9IDB4MDIpCi0jZGVmaW5lIFNFVF9USVNSX1RJSVMoYykgICAgKChjKS0+dGlzciB8PSAweDAxKQotICB1bnNpZ25lZF80IGNwcmE7Ci0gIHVuc2lnbmVkXzQgY3ByYjsKLSAgdW5zaWduZWRfNCBpdG1yOwotI2RlZmluZSBHRVRfSVRNUl9USUlFKGMpICAgICgoKGMpLT5pdG1yICYgMHg4MDAwKSA+PiAxNSkKLSNkZWZpbmUgU0VUX0lUTVJfVElJRShjLHYpICBCTElUMzIoKGMpLT5pdG1yLCAxNSwgKHYpID8gMSA6IDApCi0jZGVmaW5lIEdFVF9JVE1SX1RaQ0UoYykgICAgKCgoYyktPml0bXIgJiAweDAwMDEpID4+IDApCi0jZGVmaW5lIFNFVF9JVE1SX1RaQ0UoYyx2KSAgQkxJVDMyKChjKS0+aXRtciwgMCwgKHYpID8gMSA6IDApCi0gIHVuc2lnbmVkXzQgY2NkcjsKLSNkZWZpbmUgR0VUX0NDRFJfQ0RSKGMpICAgICAoKChjKS0+Y2NkciAmIDB4MDcpID4+IDApCi0gIHVuc2lnbmVkXzQgcG1ncjsKLSNkZWZpbmUgR0VUX1BNR1JfVFBJQkUoYykgICAoKChjKS0+cG1nciAmIDB4ODAwMCkgPj4gMTUpCi0jZGVmaW5lIFNFVF9QTUdSX1RQSUJFKGMsdikgQkxJVDMyKChjKS0+cG1nciwgMTUsICh2KSA/IDEgOiAwKQotI2RlZmluZSBHRVRfUE1HUl9UUElBRShjKSAgICgoKGMpLT5wbWdyICYgMHg0MDAwKSA+PiAxNCkKLSNkZWZpbmUgU0VUX1BNR1JfVFBJQUUoYyx2KSBCTElUMzIoKGMpLT5wbWdyLCAxNCwgKHYpID8gMSA6IDApCi0jZGVmaW5lIEdFVF9QTUdSX0ZGSShjKSAgICAgKCgoYyktPnBtZ3IgJiAweDAwMDEpID4+IDApCi0jZGVmaW5lIFNFVF9QTUdSX0ZGSShjLHYpICAgQkxJVDMyKChjKS0+cG1nciwgMCwgKHYpID8gMSA6IDApCi0gIHVuc2lnbmVkXzQgd3RtcjsKLSNkZWZpbmUgR0VUX1dUTVJfVFdJRShjKSAgICAoKChjKS0+d3RtciAmIDB4ODAwMCkgPj4gMTUpCi0jZGVmaW5lIFNFVF9XVE1SX1RXSUUoYyx2KSAgQkxJVDMyKChjKS0+d3RtciwgMTUsICh2KSA/IDEgOiAwKQotI2RlZmluZSBHRVRfV1RNUl9XRElTKGMpICAgICgoKGMpLT53dG1yICYgMHgwMDgwKSA+PiA3KQotI2RlZmluZSBTRVRfV1RNUl9XRElTKGMsdikgIEJMSVQzMigoYyktPnd0bXIsIDcsICh2KSA/IDEgOiAwKQotI2RlZmluZSBHRVRfV1RNUl9UV0MoYykgICAgICgoKGMpLT53dG1yICYgMHgwMDAxKSA+PiAwKQotI2RlZmluZSBTRVRfV1RNUl9UV0MoYyx2KSAgIEJMSVQzMigoYyktPnd0bXIsIDAsICh2KSA/IDEgOiAwKQotICB1bnNpZ25lZF80IHRycjsKLX07Ci0KLQotCi0vKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCi0gICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLwotCi1zdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIHR4MzkwNHRtcl9pb19yZWFkX2J1ZmZlcjsKLXN0YXRpYyBod19pb193cml0ZV9idWZmZXJfbWV0aG9kIHR4MzkwNHRtcl9pb193cml0ZV9idWZmZXI7Ci1zdGF0aWMgaHdfcG9ydF9ldmVudF9tZXRob2QgdHgzOTA0dG1yX3BvcnRfZXZlbnQ7Ci0KLXN0YXRpYyB2b2lkCi1hdHRhY2hfdHgzOTA0dG1yX3JlZ3MgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgIHN0cnVjdCB0eDM5MDR0bXIgKmNvbnRyb2xsZXIpCi17Ci0gIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7Ci0gIGludCBhdHRhY2hfc3BhY2U7Ci0gIHVuc2lnbmVkIGF0dGFjaF9zaXplOwotICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0KLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLQotICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIDAsICZyZWcpKQotICAgIGh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIG9uZSBhZGRyL3NpemUgZW50cnkiKTsKLQotICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCSAgICAgJnJlZy5hZGRyZXNzLAotCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwKLQkJCQkgICAgICZhdHRhY2hfYWRkcmVzcywKLQkJCQkgICAgIG1lKTsKLSAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKLQkJCSAgICAgICAmcmVnLnNpemUsCi0JCQkgICAgICAgJmF0dGFjaF9zaXplLCBtZSk7Ci0KLSAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLCAwLAotCQkgICAgIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAotCQkgICAgIG1lKTsKLQotICBpZihod19maW5kX3Byb3BlcnR5KG1lLCAiY2xvY2siKSAhPSBOVUxMKQotICAgIGNvbnRyb2xsZXItPmNsb2NrX3RpY2tzID0gKHVuc2lnbmVkXzQpIGh3X2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImNsb2NrIik7Ci0KLSAgaWYoaHdfZmluZF9wcm9wZXJ0eShtZSwgImV4dCIpICE9IE5VTEwpCi0gICAgY29udHJvbGxlci0+ZXh0X3RpY2tzID0gKHVuc2lnbmVkXzQpIGh3X2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImV4dCIpOwotCi0gIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcyA9IGF0dGFjaF9hZGRyZXNzOwotfQotCi0KLXN0YXRpYyB2b2lkCi10eDM5MDR0bXJfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQotewotICBzdHJ1Y3QgdHgzOTA0dG1yICpjb250cm9sbGVyOwotCi0gIGNvbnRyb2xsZXIgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgdHgzOTA0dG1yKTsKLSAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKLSAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgdHgzOTA0dG1yX2lvX3JlYWRfYnVmZmVyKTsKLSAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIHR4MzkwNHRtcl9pb193cml0ZV9idWZmZXIpOwotICBzZXRfaHdfcG9ydHMgKG1lLCB0eDM5MDR0bXJfcG9ydHMpOwotICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHR4MzkwNHRtcl9wb3J0X2V2ZW50KTsKLQotICAvKiBQcmVzZXQgY2xvY2sgZGl2aWRlcnMgKi8KLSAgY29udHJvbGxlci0+Y2xvY2tfdGlja3MgPSAxOwotICBjb250cm9sbGVyLT5leHRfdGlja3MgPSAxMDA7Ci0KLSAgLyogQXR0YWNoIG91cnNlbGYgdG8gb3VyIHBhcmVudCBidXMgKi8KLSAgYXR0YWNoX3R4MzkwNHRtcl9yZWdzIChtZSwgY29udHJvbGxlcik7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0byByZXNldCBzdGF0ZSAqLwotICBjb250cm9sbGVyLT50Y3IgPSAKLSAgICBjb250cm9sbGVyLT5pdG1yID0KLSAgICBjb250cm9sbGVyLT5jY2RyID0KLSAgICBjb250cm9sbGVyLT5wbWdyID0gCi0gICAgY29udHJvbGxlci0+d3RtciA9Ci0gICAgY29udHJvbGxlci0+dGlzciA9IAotICAgIGNvbnRyb2xsZXItPnRyciA9IDA7Ci0gIGNvbnRyb2xsZXItPmNwcmEgPSBjb250cm9sbGVyLT5jcHJiID0gMHgwMEZGRkZGRjsKLSAgY29udHJvbGxlci0+ZmYgPSAwOwotICBjb250cm9sbGVyLT5sYXN0X3RpY2tzID0gY29udHJvbGxlci0+cm91bmRvZmZfdGlja3MgPSAwOwotICBjb250cm9sbGVyLT5ldmVudCA9IE5VTEw7Ci19Ci0KLQotCi0vKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCi0KLXN0YXRpYyB2b2lkCi10eDM5MDR0bXJfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICAgICBpbnQgbXlfcG9ydCwKLQkJICAgICBzdHJ1Y3QgaHcgKnNvdXJjZSwKLQkJICAgICBpbnQgc291cmNlX3BvcnQsCi0JCSAgICAgaW50IGxldmVsKQotewotICBzdHJ1Y3QgdHgzOTA0dG1yICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOwotCi0gIHN3aXRjaCAobXlfcG9ydCkKLSAgICB7Ci0gICAgY2FzZSBSRVNFVF9QT1JUOgotICAgICAgewotCUhXX1RSQUNFICgobWUsICJyZXNldCIpKTsKLQotCS8qIHByZXNldCBmbGlwLWZsb3AgdG8gRkZJIHZhbHVlICovCi0JY29udHJvbGxlci0+ZmYgPSBHRVRfUE1HUl9GRkkoY29udHJvbGxlcik7Ci0KLQljb250cm9sbGVyLT50Y3IgPSAKLQkgIGNvbnRyb2xsZXItPml0bXIgPQotCSAgY29udHJvbGxlci0+Y2NkciA9Ci0JICBjb250cm9sbGVyLT5wbWdyID0gCi0JICBjb250cm9sbGVyLT53dG1yID0KLQkgIGNvbnRyb2xsZXItPnRpc3IgPSAKLQkgIGNvbnRyb2xsZXItPnRyciA9IDA7Ci0JY29udHJvbGxlci0+Y3ByYSA9IGNvbnRyb2xsZXItPmNwcmIgPSAweDAwRkZGRkZGOwotCWNvbnRyb2xsZXItPmxhc3RfdGlja3MgPSBjb250cm9sbGVyLT5yb3VuZG9mZl90aWNrcyA9IDA7Ci0JaWYoY29udHJvbGxlci0+ZXZlbnQgIT0gTlVMTCkKLQkgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUobWUsIGNvbnRyb2xsZXItPmV2ZW50KTsKLQljb250cm9sbGVyLT5ldmVudCA9IE5VTEw7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQgKG1lLCAiRXZlbnQgb24gdW5rbm93biBwb3J0ICVkIiwgbXlfcG9ydCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotLyogZ2VuZXJpYyByZWFkL3dyaXRlICovCi0KLXN0YXRpYyB1bnNpZ25lZAotdHgzOTA0dG1yX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHZvaWQgKmRlc3QsCi0JCQkgaW50IHNwYWNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IHR4MzkwNHRtciAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICBIV19UUkFDRSAoKG1lLCAicmVhZCAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7Ci0gIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBucl9ieXRlczsgYnl0ZSsrKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfd29yZCBhZGRyZXNzID0gYmFzZSArIGJ5dGU7Ci0gICAgICBpbnQgcmVnX251bWJlciA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAvIDQ7Ci0gICAgICBpbnQgcmVnX29mZnNldCA9IDMgLSAoYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcykgJSA0OwotICAgICAgdW5zaWduZWRfNCByZWdpc3Rlcl92YWx1ZTsgLyogaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotICAgICAgLyogZmlsbCBpbiBlbnRpcmUgcmVnaXN0ZXJfdmFsdWUgd29yZCAqLwotICAgICAgc3dpdGNoIChyZWdfbnVtYmVyKQotCXsKLQljYXNlIFRDUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+dGNyOyBicmVhazsKLQljYXNlIFRJU1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnRpc3I7IGJyZWFrOwotCWNhc2UgQ1BSQV9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+Y3ByYTsgYnJlYWs7Ci0JY2FzZSBDUFJCX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5jcHJiOyBicmVhazsKLQljYXNlIElUTVJfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPml0bXI7IGJyZWFrOwotCWNhc2UgQ0NEUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+Y2NkcjsgYnJlYWs7Ci0JY2FzZSBQTUdSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5wbWdyOyBicmVhazsKLQljYXNlIFdUTVJfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnd0bXI7IGJyZWFrOwotCWNhc2UgVFJSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT50cnI7IGJyZWFrOwotCWRlZmF1bHQ6IHJlZ2lzdGVyX3ZhbHVlID0gMDsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIHJlcXVlc3RlZCBieXRlIG91dCAqLwotICAgICAgbWVtY3B5ICgoY2hhciopIGRlc3QgKyBieXRlLCAoKGNoYXIqKSYgcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIDEpOwotICAgIH0KLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19ICAgICAKLQotCi0KLXN0YXRpYyB1bnNpZ25lZAotdHgzOTA0dG1yX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCB0eDM5MDR0bXIgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKLSAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKLSAgICAgIHVuc2lnbmVkXzEgd3JpdGVfYnl0ZSA9ICgoY29uc3QgY2hhciopIHNvdXJjZSlbYnl0ZV07Ci0gICAgICBpbnQgcmVnX251bWJlciA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAvIDQ7Ci0gICAgICBpbnQgcmVnX29mZnNldCA9IDMgLSAoYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcykgJSA0OwotCi0gICAgICAvKiBmaWxsIGluIGVudGlyZSByZWdpc3Rlcl92YWx1ZSB3b3JkICovCi0gICAgICBzd2l0Y2ggKHJlZ19udW1iZXIpCi0JewotCWNhc2UgVENSX1JFRzoKLQkgIGlmKHJlZ19vZmZzZXQgPT0gMCkgLyogZmlyc3QgYnl0ZSAqLwotCSAgICB7Ci0JICAgICAgLyogdXBkYXRlIHJlZ2lzdGVyLCBidXQgbWFzayBvdXQgTk9QIGJpdHMgKi8KLQkgICAgICBjb250cm9sbGVyLT50Y3IgPSAodW5zaWduZWRfNCkgKHdyaXRlX2J5dGUgJiAweGVmKTsKLQotCSAgICAgIC8qIFJlc2V0IGNvdW50ZXIgdmFsdWUgaWYgdGltZXIgc3VzcGVuZGVkIGFuZCBDUkUgaXMgc2V0LiAqLwotCSAgICAgIGlmKEdFVF9UQ1JfVENFKGNvbnRyb2xsZXIpID09IDAgJiYKLQkJIEdFVF9UQ1JfQ1JFKGNvbnRyb2xsZXIpID09IDEpCi0JCWNvbnRyb2xsZXItPnRyciA9IDA7Ci0JICAgIH0KLQkgIC8qIEhXX1RSQUNFICgobWUsICJ0Y3I6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPnRjcikpOyAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIElUTVJfUkVHOgotCSAgaWYocmVnX29mZnNldCA9PSAxKSAvKiBzZWNvbmQgYnl0ZSAqLwotCSAgICB7Ci0JICAgICAgU0VUX0lUTVJfVElJRShjb250cm9sbGVyLCB3cml0ZV9ieXRlICYgMHg4MCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYocmVnX29mZnNldCA9PSAwKSAvKiBmaXJzdCBieXRlICovCi0JICAgIHsKLQkgICAgICBTRVRfSVRNUl9UWkNFKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDAxKTsKLQkgICAgfQotCSAgLyogSFdfVFJBQ0UgKChtZSwgIml0bXI6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPml0bXIpKTsgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDQ0RSX1JFRzoKLQkgIGlmKHJlZ19vZmZzZXQgPT0gMCkgLyogZmlyc3QgYnl0ZSAqLwotCSAgICB7Ci0JICAgICAgY29udHJvbGxlci0+Y2NkciA9IHdyaXRlX2J5dGUgJiAweDA3OwotCSAgICB9Ci0JICAvKiBIV19UUkFDRSAoKG1lLCAiY2NkcjogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+Y2NkcikpOyAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIFBNR1JfUkVHOgotCSAgaWYocmVnX29mZnNldCA9PSAxKSAvKiBzZWNvbmQgYnl0ZSAqLwotCSAgICB7Ci0JICAgICAgU0VUX1BNR1JfVFBJQkUoY29udHJvbGxlciwgd3JpdGVfYnl0ZSAmIDB4ODApOwotCSAgICAgIFNFVF9QTUdSX1RQSUFFKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDQwKTsKLQkgICAgfQotCSAgZWxzZSBpZihyZWdfb2Zmc2V0ID09IDApIC8qIGZpcnN0IGJ5dGUgKi8KLQkgICAgewotCSAgICAgIFNFVF9QTUdSX0ZGSShjb250cm9sbGVyLCB3cml0ZV9ieXRlICYgMHgwMSk7Ci0JICAgIH0KLQkgIC8qIEhXX1RSQUNFICgobWUsICJwbWdyOiAlMDhseCIsIChsb25nKSBjb250cm9sbGVyLT5wbWdyKSk7ICovCi0JICBicmVhazsKLQotCWNhc2UgV1RNUl9SRUc6Ci0JICBpZihyZWdfb2Zmc2V0ID09IDEpIC8qIHNlY29uZCBieXRlICovCi0JICAgIHsKLQkgICAgICBTRVRfV1RNUl9UV0lFKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDgwKTsKLQkgICAgfQotCSAgZWxzZSBpZihyZWdfb2Zmc2V0ID09IDApIC8qIGZpcnN0IGJ5dGUgKi8KLQkgICAgewotCSAgICAgIFNFVF9XVE1SX1dESVMoY29udHJvbGxlciwgd3JpdGVfYnl0ZSAmIDB4ODApOwotCSAgICAgIFNFVF9XVE1SX1RXQyhjb250cm9sbGVyLCB3cml0ZV9ieXRlICYgMHgwMSk7Ci0JICAgIH0KLQkgIC8qIEhXX1RSQUNFICgobWUsICJ3dG1yOiAlMDhseCIsIChsb25nKSBjb250cm9sbGVyLT53dG1yKSk7ICovCi0JICBicmVhazsKLQotCWNhc2UgVElTUl9SRUc6Ci0JICBpZihyZWdfb2Zmc2V0ID09IDApIC8qIGZpcnN0IGJ5dGUgKi8KLQkgICAgewotCSAgICAgIC8qIEFsbCBiaXRzIG11c3QgYmUgemVybyBpbiBnaXZlbiBieXRlLCBhY2NvcmRpbmcgdG8KLSAgICAgICAgICAgICAgICAgc3BlYy4gKi8KLQotCSAgICAgIC8qIFNlbmQgYW4gImludGVycnVwdCBvZmYiIGV2ZW50IG9uIHRoZSBpbnRlcnJ1cHQgcG9ydCAqLwotCSAgICAgIGlmKGNvbnRyb2xsZXItPnRpc3IgIT0gMCkgLyogYW55IGludGVycnVwdHMgYWN0aXZlPyAqLwotCQl7Ci0JCSAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDApOwkJICAKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkgICAgICBjb250cm9sbGVyLT50aXNyID0gMDsKLQkgICAgfQotCSAgLyogSFdfVFJBQ0UgKChtZSwgInRpc3I6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPnRpc3IpKTsgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDUFJBX1JFRzoKLQkgIGlmKHJlZ19vZmZzZXQgPCAzKSAvKiBmaXJzdCwgc2Vjb25kLCBvciB0aGlyZCBieXRlICovCi0JICAgIHsKLQkgICAgICBNQkxJVDMyKGNvbnRyb2xsZXItPmNwcmEsIChyZWdfb2Zmc2V0KjgpKzcsIChyZWdfb2Zmc2V0KjgpLCB3cml0ZV9ieXRlKTsKLQkgICAgfQotCSAgLyogSFdfVFJBQ0UgKChtZSwgImNwcmE6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPmNwcmEpKTsgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDUFJCX1JFRzoKLQkgIGlmKHJlZ19vZmZzZXQgPCAzKSAvKiBmaXJzdCwgc2Vjb25kLCBvciB0aGlyZCBieXRlICovCi0JICAgIHsKLQkgICAgICBNQkxJVDMyKGNvbnRyb2xsZXItPmNwcmIsIChyZWdfb2Zmc2V0KjgpKzcsIChyZWdfb2Zmc2V0KjgpLCB3cml0ZV9ieXRlKTsKLQkgICAgfQotCSAgLyogSFdfVFJBQ0UgKChtZSwgImNwcmI6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPmNwcmIpKTsgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDogCi0JICBIV19UUkFDRSAoKG1lLCAid3JpdGUgdG8gaWxsZWdhbCByZWdpc3RlciAlZCIsIHJlZ19udW1iZXIpKTsKLQl9Ci0gICAgfSAvKiBsb29wIG92ZXIgYnl0ZXMgKi8KLQotICAvKiBTY2hlZHVsZSBhIHRpbWVyIGV2ZW50IGluIG5lYXIgZnV0dXJlLCBzbyB3ZSBjYW4gaW5jcmVtZW50IG9yCi0gICAgIHN0b3AgdGhlIGNvdW50ZXIsIHRvIHJlc3BvbmQgdG8gcmVnaXN0ZXIgdXBkYXRlcy4gKi8KLSAgaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIDEsIGRlbGl2ZXJfdHgzOTA0dG1yX3RpY2ssIE5VTEwpOwotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi0KLQotLyogRGVsaXZlciBhIGNsb2NrIHRpY2sgdG8gdGhlIGNvdW50ZXIuICovCi1zdGF0aWMgdm9pZAotZGVsaXZlcl90eDM5MDR0bXJfdGljayAoc3RydWN0IGh3ICptZSwKLQkJCXZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCB0eDM5MDR0bXIgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7Ci0gIFNJTV9ERVNDIHNkID0gaHdfc3lzdGVtIChtZSk7Ci0gIHNpZ25lZF84IHRoaXNfdGlja3MgPSBzaW1fZXZlbnRzX3RpbWUoc2QpOwotCi0gIHNpZ25lZF84IHdhcnA7Ci0gIHNpZ25lZF84IGRpdmlzb3I7Ci0gIHNpZ25lZF84IHF1b3RpZW50LCByZW1haW5kZXI7Ci0KLSAgLyogY29tcHV0ZSBzaW11bGF0aW9uIHRpY2tzIGJldHdlZW4gbGFzdCB0aWNrIGFuZCB0aGlzIHRpY2sgKi8KLSAgaWYoY29udHJvbGxlci0+bGFzdF90aWNrcyAhPSAwKQotICAgIHdhcnAgPSB0aGlzX3RpY2tzIC0gY29udHJvbGxlci0+bGFzdF90aWNrcyArIGNvbnRyb2xsZXItPnJvdW5kb2ZmX3RpY2tzOwotICBlbHNlCi0gICAgewotICAgICAgY29udHJvbGxlci0+bGFzdF90aWNrcyA9IHRoaXNfdGlja3M7IC8qIGluaXRpYWxpemUgKi8KLSAgICAgIHdhcnAgPSBjb250cm9sbGVyLT5yb3VuZG9mZl90aWNrczsKLSAgICB9Ci0KLSAgaWYoY29udHJvbGxlci0+ZXZlbnQgIT0gTlVMTCkKLSAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCBjb250cm9sbGVyLT5ldmVudCk7Ci0gIGNvbnRyb2xsZXItPmV2ZW50ID0gTlVMTDsKLQotICAvKiBDaGVjayB3aGV0aGVyIHRoZSB0aW1lciB0aWNraW5nIGlzIGVuYWJsZWQgYXQgdGhpcyBtb21lbnQuICBUaGlzCi0gICAgIGxhcmdlbHkgYSBmdW5jdGlvbiBvZiB0aGUgVENFIGJpdCwgYnV0IGlzIGFsc28gc2xpZ2h0bHkKLSAgICAgbW9kZS1kZXBlbmRlbnQuICovCi0gIHN3aXRjaCgoaW50KSBHRVRfVENSX1RNT0RFKGNvbnRyb2xsZXIpKQotICAgIHsKLSAgICBjYXNlIDA6IC8qIGludGVydmFsICovCi0gICAgICAvKiBkbyBub3QgYWR2YW5jZSBjb3VudGVyIGlmIFRDRSA9IDAgb3IgaWYgaG9sZGluZyBhdCBjb3VudCA9IENQUkEgKi8KLSAgICAgIGlmKEdFVF9UQ1JfVENFKGNvbnRyb2xsZXIpID09IDAgfHwKLQkgY29udHJvbGxlci0+dHJyID09IGNvbnRyb2xsZXItPmNwcmEpCi0JcmV0dXJuOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6IC8qIHB1bHNlIGdlbmVyYXRvciAqLwotICAgICAgLyogZG8gbm90IGFkdmFuY2UgY291bnRlciBpZiBUQ0UgPSAwICovCi0gICAgICBpZihHRVRfVENSX1RDRShjb250cm9sbGVyKSA9PSAwKQotCXJldHVybjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAvKiB3YXRjaGRvZyAqLwotICAgICAgLyogZG8gbm90IGFkdmFuY2UgY291bnRlciBpZiBUQ0UgPSAwIGFuZCBXRElTID0gMSAqLwotICAgICAgaWYoR0VUX1RDUl9UQ0UoY29udHJvbGxlcikgPT0gMCAmJgotCSBHRVRfV1RNUl9XRElTKGNvbnRyb2xsZXIpID09IDEpCi0JcmV0dXJuOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6IC8qIGRpc2FibGVkICovCi0gICAgICAvKiByZWdhcmRsZXNzIG9mIFRDRSwgZG8gbm90IGFkdmFuY2UgY291bnRlciAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJbiBhbnkgb2YgdGhlIGFib3ZlIGNhc2VzIHRoYXQgcmV0dXJuLCBhIHN1YnNlcXVlbnQgcmVnaXN0ZXIKLSAgICAgd3JpdGUgd2lsbCBiZSBuZWVkZWQgdG8gcmVzdGFydCB0aGUgdGltZXIuICBBIHRpY2sgZXZlbnQgaXMKLSAgICAgc2NoZWR1bGVkIGJ5IGFueSByZWdpc3RlciB3cml0ZSwgc28gaXQgaXMgbW9yZSBlZmZpY2llbnQgbm90IHRvCi0gICAgIHJlc2NoZWR1bGUgZHVtbXkgZXZlbnRzIGhlcmUuICovCi0KLQotICAvKiBmaW5kIGFwcHJvcHJpYXRlIGRpdmlzb3IgZXRjLiAqLyAKLSAgaWYoR0VUX1RDUl9DQ1MoY29udHJvbGxlcikgPT0gMCkgLyogaW50ZXJuYWwgc3lzdGVtIGNsb2NrICovCi0gICAgewotICAgICAgLyogYXBwbHkgaW50ZXJuYWwgY2xvY2sgZGl2aWRlciAqLwotICAgICAgaWYoR0VUX1RDUl9DQ0RFKGNvbnRyb2xsZXIpKSAvKiBkaXZpc29yIGNpcmN1aXQgZW5hYmxlZD8gKi8KLQlkaXZpc29yID0gY29udHJvbGxlci0+Y2xvY2tfdGlja3MgKiAoMSA8PCAoMSArIEdFVF9DQ0RSX0NEUihjb250cm9sbGVyKSkpOwotICAgICAgZWxzZQotCWRpdmlzb3IgPSBjb250cm9sbGVyLT5jbG9ja190aWNrczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkaXZpc29yID0gY29udHJvbGxlci0+ZXh0X3RpY2tzOwotICAgIH0KLQotICAvKiBob3cgbWFueSB0aW1lcyB0byBpbmNyZWFzZSBjb3VudGVyPyAqLwotICBxdW90aWVudCA9IHdhcnAgLyBkaXZpc29yOwotICByZW1haW5kZXIgPSB3YXJwICUgZGl2aXNvcjsKLQotICAvKiBOT1RFOiBJZiB0aGUgZXZlbnQgcmVzY2hlZHVsaW5nIGNvZGUgd29ya3MgcHJvcGVybHksIHRoZSBxdW90aWVudAotICAgICBzaG91bGQgbmV2ZXIgYmUgbGFyZ2VyIHRoYW4gMS4gIFRoYXQgaXMsIHdlIHNob3VsZCByZWNlaXZlIGV2ZW50cwotICAgICBoZXJlIGF0IGxlYXN0IGFzIGZyZXF1ZW50bHkgYXMgdGhlIHNpbXVsYXRlZCBjb3VudGVyIGlzIHN1cHBvc2VkCi0gICAgIHRvIGRlY3JlbWVudC4gIFNvIHRoZSByZW1haW5kZXIgKC0+IHJvdW5kb2ZmX3RpY2tzKSB3aWxsIHNsb3dseQotICAgICBhY2N1bXVsYXRlLCB3aXRoIHRoZSBxdW90aWVudCA9PSAwLiAgT25jZSBpbiBhIHdoaWxlLCBxdW90aWVudAotICAgICB3aWxsIGVxdWFsIDEuICovCi0KLSAgY29udHJvbGxlci0+cm91bmRvZmZfdGlja3MgPSByZW1haW5kZXI7Ci0gIGNvbnRyb2xsZXItPmxhc3RfdGlja3MgPSB0aGlzX3RpY2tzOwotICB3aGlsZShxdW90aWVudCA+IDApIC8qIElzIGl0IHRpbWUgdG8gaW5jcmVtZW50IGNvdW50ZXI/ICovCi0gICAgewotICAgICAgLyogbmV4dCAyNC1iaXQgY291bnRlciB2YWx1ZSAqLwotICAgICAgdW5zaWduZWRfNCBuZXh0X3RyciA9IChjb250cm9sbGVyLT50cnIgKyAxKSAlICgxIDw8IDI0KTsKLSAgICAgIHF1b3RpZW50IC0tOwotICAgICAgCi0gICAgICBzd2l0Y2goKGludCkgR0VUX1RDUl9UTU9ERShjb250cm9sbGVyKSkKLQl7Ci0JY2FzZSAwOiAvKiBpbnRlcnZhbCB0aW1lciBtb2RlICovCi0JICB7Ci0JICAgIC8qIEN1cnJlbnQgb3IgbmV4dCBjb3VudGVyIHZhbHVlIG1hdGNoZXMgQ1BSQSB2YWx1ZT8gIFRoZQotCSAgICAgICBmaXJzdCBjYXNlIGNvdmVycyBjb3VudGVyIGhvbGRpbmcgYXQgbWF4aW11bSBiZWZvcmUKLQkgICAgICAgcmVzZXQuICBUaGUgc2Vjb25kIGNhc2UgY292ZXJzIG5vcm1hbCBjb3VudGluZwotCSAgICAgICBiZWhhdmlvci4gKi8KLQkgICAgaWYoY29udHJvbGxlci0+dHJyID09IGNvbnRyb2xsZXItPmNwcmEgfHwKLQkgICAgICAgbmV4dF90cnIgPT0gY29udHJvbGxlci0+Y3ByYSkKLQkgICAgICB7Ci0JCS8qIGxpa2VseSBob2xkIENQUkEgdmFsdWUgKi8KLQkJaWYoY29udHJvbGxlci0+dHJyID09IGNvbnRyb2xsZXItPmNwcmEpCi0JCSAgbmV4dF90cnIgPSBjb250cm9sbGVyLT5jcHJhOwotCi0JCVNFVF9USVNSX1RJSVMoY29udHJvbGxlcik7Ci0KLQkJLyogU2lnbmFsIGFuIGludGVycnVwdCBpZiBpdCBpcyBlbmFibGVkIHdpdGggVElJRSwKLQkJICAgYW5kIGlmIHdlIGp1c3QgYXJyaXZlZCBhdCBDUFJBLiAgRG9uJ3QgcmVwZWF0ZWRseQotCQkgICBpbnRlcnJ1cHQgaWYgaG9sZGluZyBkdWUgdG8gVFpDRT0wICovCi0JCWlmKEdFVF9JVE1SX1RJSUUoY29udHJvbGxlcikgJiYKLQkJICAgbmV4dF90cnIgIT0gY29udHJvbGxlci0+dHJyKQotCQkgIHsKLQkJICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKLQkJICB9Ci0KLQkJLyogUmVzZXQgY291bnRlcj8gKi8KLQkJaWYoR0VUX0lUTVJfVFpDRShjb250cm9sbGVyKSkKLQkJICB7Ci0JCSAgICBuZXh0X3RyciA9IDA7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQlicmVhazsKLQotCWNhc2UgMTogLyogcHVsc2UgZ2VuZXJhdG9yIG1vZGUgKi8KLQkgIHsKLQkgICAgLyogZmlyc3QgdHJpcCBwb2ludCAqLwotCSAgICBpZihuZXh0X3RyciA9PSBjb250cm9sbGVyLT5jcHJhKQotCSAgICAgIHsKLQkJLyogZmxpcCBmbGlwLWZsb3AgJiByZXBvcnQgKi8KLQkJY29udHJvbGxlci0+ZmYgXj0gMTsKLQkJaHdfcG9ydF9ldmVudChtZSwgRkZfUE9SVCwgY29udHJvbGxlci0+ZmYpOwotCQlTRVRfVElTUl9UUElBUyhjb250cm9sbGVyKTsKLQotCQkvKiBzaWduYWwgaW50ZXJydXB0ICovCi0JCWlmKEdFVF9QTUdSX1RQSUFFKGNvbnRyb2xsZXIpKQotCQkgIHsKLQkJICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKLQkJICB9Ci0KLQkgICAgICB9Ci0JICAgIC8qIHNlY29uZCB0cmlwIHBvaW50ICovCi0JICAgIGVsc2UgaWYobmV4dF90cnIgPT0gY29udHJvbGxlci0+Y3ByYikKLQkgICAgICB7Ci0JCS8qIGZsaXAgZmxpcC1mbG9wICYgcmVwb3J0ICovCi0JCWNvbnRyb2xsZXItPmZmIF49IDE7Ci0JCWh3X3BvcnRfZXZlbnQobWUsIEZGX1BPUlQsIGNvbnRyb2xsZXItPmZmKTsKLQkJU0VUX1RJU1JfVFBJQlMoY29udHJvbGxlcik7Ci0KLQkJLyogc2lnbmFsIGludGVycnVwdCAqLwotCQlpZihHRVRfUE1HUl9UUElCRShjb250cm9sbGVyKSkKLQkJICB7Ci0JCSAgICBod19wb3J0X2V2ZW50KG1lLCBJTlRfUE9SVCwgMSk7Ci0JCSAgfQotCi0JCS8qIGNsZWFyIGNvdW50ZXIgKi8KLQkJbmV4dF90cnIgPSAwOwotCSAgICAgIH0KLQkgIH0KLQlicmVhazsKLQotCWNhc2UgMjogLyogd2F0Y2hkb2cgdGltZXIgbW9kZSAqLwotCSAgewotCSAgICAvKiB3YXRjaGRvZyB0aW1lciBleHBpcnkgKi8KLQkgICAgaWYobmV4dF90cnIgPT0gY29udHJvbGxlci0+Y3ByYSkKLQkgICAgICB7Ci0JCVNFVF9USVNSX1RXSVMoY29udHJvbGxlcik7Ci0KLQkJLyogc2lnbmFsIGludGVycnVwdCAqLwotCQlpZihHRVRfV1RNUl9UV0lFKGNvbnRyb2xsZXIpKQotCQkgIHsKLQkJICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKLQkJICB9Ci0KLQkJLyogY2xlYXIgY291bnRlciAqLwotCQluZXh0X3RyciA9IDA7Ci0JICAgICAgfQotCSAgfQotCWJyZWFrOwotCi0JY2FzZSAzOiAvKiBkaXNhYmxlZCAqLwotCWRlZmF1bHQ6Ci0JfQotCi0gICAgICAvKiB1cGRhdGUgY291bnRlciBhbmQgcmVwb3J0ICovCi0gICAgICBjb250cm9sbGVyLT50cnIgPSBuZXh0X3RycjsKLSAgICAgIC8qIEhXX1RSQUNFICgobWUsICJjb3VudGVyIHRyciAlbGQgdGlzciAlbHgiLAotCSAobG9uZykgY29udHJvbGxlci0+dHJyLCAobG9uZykgY29udHJvbGxlci0+dGlzcikpOyAqLwotICAgIH0gLyogZW5kIHF1b3RpZW50IGxvb3AgKi8KLQotICAvKiBSZXNjaGVkdWxlIGEgdGltZXIgZXZlbnQgaW4gbmVhciBmdXR1cmUsIHNvIHdlIGNhbiBpbmNyZW1lbnQgdGhlCi0gICAgIGNvdW50ZXIgYWdhaW4uICBTZXQgdGhlIGV2ZW50IGFib3V0IDc1JSBvZiBkaXZpc29yIHRpbWUgYXdheSwgc28KLSAgICAgd2Ugd2lsbCBleHBlcmllbmNlIHJvdWdobHkgMS4zIGV2ZW50cyBwZXIgY291bnRlciBpbmNyZW1lbnQuICovCi0gIGNvbnRyb2xsZXItPmV2ZW50ID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIGRpdmlzb3IqMy80LCBkZWxpdmVyX3R4MzkwNHRtcl90aWNrLCBOVUxMKTsKLX0KLQotCi0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfdHgzOTA0dG1yX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAidHgzOTA0dG1yIiwgdHgzOTA0dG1yX2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvaW50ZXJwLmMgYi9zaW0vbWlwcy9pbnRlcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyYWQ3ZS4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9pbnRlcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NjUgKzAsMCBAQAotLyo+IGludGVycC5jIDwqLwotLyogU2ltdWxhdG9yIGZvciB0aGUgTUlQUyBhcmNoaXRlY3R1cmUuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBNSVBTIHNpbQotCi0JCVRISVMgU09GVFdBUkUgSVMgTk9UIENPUFlSSUdIVEVECi0KLSAgIEN5Z251cyBvZmZlcnMgdGhlIGZvbGxvd2luZyBmb3IgdXNlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgQ3lnbnVzCi0gICBtYWtlcyBubyB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXQncyBwZXJmb3JtYW5jZQotICAgYW5kIHRoZSB1c2VyIGFjY2VwdHMgdGhlIHNvZnR3YXJlICJBUyBJUyIgd2l0aCBhbGwgZmF1bHRzLgotCi0gICBDWUdOVVMgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFdJVEggUkVHQVJEIFRPCi0gICBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLU5PVEVzOgotCi1UaGUgSURUIG1vbml0b3IgKGZvdW5kIG9uIHRoZSBWUjQzMDAgYm9hcmQpLCBzZWVtcyB0byBsaWUgYWJvdXQKLXJlZ2lzdGVyIGNvbnRlbnRzLiBJdCBzZWVtcyB0byB0cmVhdCB0aGUgcmVnaXN0ZXJzIGFzIHNpZ24tZXh0ZW5kZWQKLTMyLWJpdCB2YWx1ZXMuIFRoaXMgY2F1c2UgKlJFQUwqIHByb2JsZW1zIHdoZW4gc2luZ2xlLXN0ZXBwaW5nIDY0LWJpdAotY29kZSBvbiB0aGUgaGFyZHdhcmUuCi0KLSovCi0KLS8qIFRoZSBUUkFDRSBtYW5pZmVzdHMgZW5hYmxlIHRoZSBwcm92aXNpb24gb2YgZXh0cmEgZmVhdHVyZXMuIElmIHRoZXkKLSAgIGFyZSBub3QgZGVmaW5lZCB0aGVuIGEgc2ltcGxlciAocXVpY2tlcikgc2ltdWxhdG9yIGlzIGNvbnN0cnVjdGVkCi0gICB3aXRob3V0IHRoZSByZXF1aXJlZCBydW4tdGltZSBjaGVja3MsIGV0Yy4gKi8KLSNpZiAxIC8qIDAgdG8gYWxsb3cgdXNlciBidWlsZCBzZWxlY3Rpb24sIDEgdG8gZm9yY2UgaW5jbHVzaW9uICovCi0jZGVmaW5lIFRSQUNFICgxKQotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgInNpbS11dGlscy5oIgotI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotI2luY2x1ZGUgInNpbS1ody5oIgotCi0jaW5jbHVkZSAiaXRhYmxlLmgiCi0KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIgICAvKiBHREIgc2ltdWxhdG9yIGNhbGxiYWNrIGludGVyZmFjZSAqLwotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIgLyogR0RCIHNpbXVsYXRvciBpbnRlcmZhY2UgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFBBUkFNUwotI2RlZmluZSBQQVJBTVMoeCkgCi0jZW5kaWYKLQotY2hhciogcHJfYWRkciBQQVJBTVMgKChTSU1fQUREUiBhZGRyKSk7Ci1jaGFyKiBwcl91d29yZDY0IFBBUkFNUyAoKHV3b3JkNjQgYWRkcikpOwotCi0KLS8qIFdpdGhpbiBpbnRlcnAuYyB3ZSByZWZlciB0byB0aGUgc2ltX3N0YXRlIGFuZCBzaW1fY3B1IGRpcmVjdGx5LiAqLwotI2RlZmluZSBDUFUgY3B1Ci0jZGVmaW5lIFNEIHNkCi0KLQotLyogVGhlIGZvbGxvd2luZyByZXNlcnZlZCBpbnN0cnVjdGlvbiB2YWx1ZSBpcyB1c2VkIHdoZW4gYSBzaW11bGF0b3IKLSAgIHRyYXAgaXMgcmVxdWlyZWQuIE5PVEU6IENhcmUgbXVzdCBiZSB0YWtlbiwgc2luY2UgdGhpcyB2YWx1ZSBtYXkgYmUKLSAgIHVzZWQgaW4gbGF0ZXIgcmV2aXNpb25zIG9mIHRoZSBNSVBTIElTQS4gKi8KLQotI2RlZmluZSBSU1ZEX0lOU1RSVUNUSU9OICAgICAgICAgICAoMHgwMDAwMDAwNSkKLSNkZWZpbmUgUlNWRF9JTlNUUlVDVElPTl9NQVNLICAgICAgKDB4RkMwMDAwM0YpCi0KLSNkZWZpbmUgUlNWRF9JTlNUUlVDVElPTl9BUkdfU0hJRlQgNgotI2RlZmluZSBSU1ZEX0lOU1RSVUNUSU9OX0FSR19NQVNLICAweEZGRkZGICAKLQotCi0vKiBCaXRzIGluIHRoZSBEZWJ1ZyByZWdpc3RlciAqLwotI2RlZmluZSBEZWJ1Z19EQkQgMHg4MDAwMDAwMCAgIC8qIERlYnVnIEJyYW5jaCBEZWxheSAqLwotI2RlZmluZSBEZWJ1Z19ETSAgMHg0MDAwMDAwMCAgIC8qIERlYnVnIE1vZGUgICAgICAgICAqLwotI2RlZmluZSBEZWJ1Z19EQnAgMHgwMDAwMDAwMiAgIC8qIERlYnVnIEJyZWFrcG9pbnQgaW5kaWNhdG9yICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0gR0RCIHNpbXVsYXRvciBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgQ29sZFJlc2V0IFBBUkFNUygoU0lNX0RFU0Mgc2QpKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLQotI2RlZmluZSBERUxBWVNMT1QoKSAgICAge1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNUQVRFICYgc2ltREVMQVlTTE9UKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1faW9fZXByaW50ZihzZCwiRGVsYXkgc2xvdCBhbHJlYWR5IGFjdGl2YXRlZCAoYnJhbmNoIGluIGRlbGF5IHNsb3Q/KVxuIik7XAotICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSB8PSBzaW1ERUxBWVNMT1Q7XAotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZGVmaW5lIEpBTERFTEFZU0xPVCgpCXtcCi0JCQkgIERFTEFZU0xPVCAoKTtcCi0JCQkgIFNUQVRFIHw9IHNpbUpBTERFTEFZU0xPVDtcCi0JCQl9Ci0KLSNkZWZpbmUgTlVMTElGWSgpICAgICAgIHtcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7XAotICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSB8PSBzaW1TS0lQTkVYVDtcCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNkZWZpbmUgQ0FOQ0VMREVMQVlTTE9UKCkge1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1NUQVRFID0gMDtcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEUgJj0gfihzaW1ERUxBWVNMT1QgfCBzaW1KQUxERUxBWVNMT1QpO1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZGVmaW5lIElOREVMQVlTTE9UKCkJKChTVEFURSAmIHNpbURFTEFZU0xPVCkgIT0gMCkKLSNkZWZpbmUgSU5KQUxERUxBWVNMT1QoKSAoKFNUQVRFICYgc2ltSkFMREVMQVlTTE9UKSAhPSAwKQotCi0vKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgY29kZSBlc3NlbnRpYWxseSBhc3N1bWVzIHRoaXMgbGF5b3V0IG9mIG1lbW9yeS4KLSAgIElmIHlvdSBjaGFuZ2UgdGhlc2UsIGNoYW5nZSB0aGUgbW9uaXRvciBjb2RlLCB0b28uICAqLwotI2RlZmluZSBLMEJBU0UgICgweDgwMDAwMDAwKQotI2RlZmluZSBLMFNJWkUgICgweDIwMDAwMDAwKQotI2RlZmluZSBLMUJBU0UgICgweEEwMDAwMDAwKQotI2RlZmluZSBLMVNJWkUgICgweDIwMDAwMDAwKQotCi0vKiBTaW1wbGUgcnVuLXRpbWUgbW9uaXRvciBzdXBwb3J0LgotICAgCi0gICBXZSBlbXVsYXRlIHRoZSBtb25pdG9yIGJ5IHBsYWNpbmcgbWFnaWMgcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb25zIGF0Ci0gICB0aGUgbW9uaXRvcidzIGVudHJ5IHBvaW50czsgd2hlbiB3ZSBoaXQgdGhlc2UgaW5zdHJ1Y3Rpb25zLCBpbnN0ZWFkCi0gICBvZiByYWlzaW5nIGFuIGV4Y2VwdGlvbiAoYXMgd2Ugd291bGQgbm9ybWFsbHkpLCB3ZSBsb29rIGF0IHRoZQotICAgaW5zdHJ1Y3Rpb24gYW5kIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIG1vbml0b3J5IG9wZXJhdGlvbi4KLSAgIAotICAgYCpfbW9uaXRvcl9iYXNlJyBhcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3NlcyBhdCB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgbW9uaXRvciB2ZWN0b3JzIGFyZSBsb2NhdGVkLiAgYDAnIG1lYW5zIG5vbmUuICBCeSBkZWZhdWx0LAotICAgICAgICBpbnN0YWxsIGFsbCB0aHJlZS4KLSAgICBUaGUgUlNWRF9JTlNUUlVDVElPTi4uLiBtYWNyb3Mgc3BlY2lmeSB0aGUgbWFnaWMgaW5zdHJ1Y3Rpb25zIHdlCi0gICAgdXNlIGF0IHRoZSBtb25pdG9yIGVudHJ5IHBvaW50cy4gICovCi1zdGF0aWMgaW50IGZpcm13YXJlX29wdGlvbl9wID0gMDsKLXN0YXRpYyBTSU1fQUREUiBpZHRfbW9uaXRvcl9iYXNlID0gICAgIDB4QkZDMDAwMDA7Ci1zdGF0aWMgU0lNX0FERFIgcG1vbl9tb25pdG9yX2Jhc2UgPSAgICAweEJGQzAwNTAwOwotc3RhdGljIFNJTV9BRERSIGxzaXBtb25fbW9uaXRvcl9iYXNlID0gMHhCRkMwMDIwMDsKLQotc3RhdGljIFNJTV9SQyBzaW1fZmlybXdhcmVfY29tbWFuZCAoU0lNX0RFU0Mgc2QsIGNoYXIqIGFyZyk7Ci0KLQotI2RlZmluZSBNRU1fU0laRSAoMiA8PCAyMCkKLQotCi0jaWYgZGVmaW5lZChUUkFDRSkKLXN0YXRpYyBjaGFyICp0cmFjZWZpbGUgPSAidHJhY2UuZGluIjsgLyogZGVmYXVsdCBmaWxlbmFtZSBmb3IgdHJhY2UgbG9nICovCi1GSUxFICp0cmFjZWZoID0gTlVMTDsKLXN0YXRpYyB2b2lkIG9wZW5fdHJhY2UgUEFSQU1TKChTSU1fREVTQyBzZCkpOwotI2VuZGlmIC8qIFRSQUNFICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogZ2V0X2luc25fbmFtZSAoc2ltX2NwdSAqLCBpbnQpOwotCi0vKiBzaW11bGF0aW9uIHRhcmdldCBib2FyZC4gIE5VTEw9Y2Fub25pY2FsICovCi1zdGF0aWMgY2hhciogYm9hcmQgPSBOVUxMOwotCi0KLXN0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChtaXBzX29wdGlvbl9oYW5kbGVyKTsKLQotZW51bSB7Ci0gIE9QVElPTl9ESU5FUk9fVFJBQ0UgPSBPUFRJT05fU1RBUlQsCi0gIE9QVElPTl9ESU5FUk9fRklMRSwKLSAgT1BUSU9OX0ZJUk1XQVJFLAotICBPUFRJT05fQk9BUkQKLX07Ci0KLQotc3RhdGljIFNJTV9SQwotbWlwc19vcHRpb25faGFuZGxlciAoc2QsIGNwdSwgb3B0LCBhcmcsIGlzX2NvbW1hbmQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzaW1fY3B1ICpjcHU7Ci0gICAgIGludCBvcHQ7Ci0gICAgIGNoYXIgKmFyZzsKLSAgICAgaW50IGlzX2NvbW1hbmQ7Ci17Ci0gIGludCBjcHVfbnI7Ci0gIHN3aXRjaCAob3B0KQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9ESU5FUk9fVFJBQ0U6IC8qID8/PyAqLwotI2lmIGRlZmluZWQoVFJBQ0UpCi0gICAgICAvKiBFdmVudHVhbGx5IHRoZSBzaW1UUkFDRSBmbGFnIGNvdWxkIGJlIHRyZWF0ZWQgYXMgYSB0b2dnbGUsIHRvCi0JIGFsbG93IGV4dGVybmFsIGNvbnRyb2wgb2YgdGhlIHByb2dyYW0gcG9pbnRzIGJlaW5nIHRyYWNlZAotCSAoaS5lLiBvbmx5IGZyb20gbWFpbiBvbndhcmRzLCBleGNsdWRpbmcgdGhlIHJ1bi10aW1lIHNldHVwLAotCSBldGMuKS4gKi8KLSAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQotCXsKLQkgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGNwdV9ucik7Ci0JICBpZiAoYXJnID09IE5VTEwpCi0JICAgIFNUQVRFIHw9IHNpbVRSQUNFOwotCSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ5ZXMiKSA9PSAwKQotCSAgICBTVEFURSB8PSBzaW1UUkFDRTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwKQotCSAgICBTVEFURSAmPSB+c2ltVFJBQ0U7Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm9uIikgPT0gMCkKLQkgICAgU1RBVEUgfD0gc2ltVFJBQ0U7Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm9mZiIpID09IDApCi0JICAgIFNUQVRFICY9IH5zaW1UUkFDRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVucmVjb2duaXplZCBkaW5lcm8tdHJhY2Ugb3B0aW9uIGAlcydcbiIsIGFyZyk7Ci0JICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLSNlbHNlIC8qICFUUkFDRSAqLwotICAgICAgZnByaW50ZihzdGRlcnIsIlwKLVNpbXVsYXRvciBjb25zdHJ1Y3RlZCB3aXRob3V0IGRpbmVybyB0cmFjaW5nIHN1cHBvcnQgKGZvciBwZXJmb3JtYW5jZSkuXG5cCi1SZS1jb21waWxlIHNpbXVsYXRvciB3aXRoIFwiLURUUkFDRVwiIHRvIGVuYWJsZSB0aGlzIG9wdGlvbi5cbiIpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotI2VuZGlmIC8qICFUUkFDRSAqLwotCi0gICAgY2FzZSBPUFRJT05fRElORVJPX0ZJTEU6Ci0jaWYgZGVmaW5lZChUUkFDRSkKLSAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewotCWNoYXIgKnRtcDsKLQl0bXAgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ob3B0YXJnKSArIDEpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkgIHsKLQkgICAgc2ltX2lvX3ByaW50ZihzZCwiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhY2VmaWxlIG5hbWUgXCIlc1wiXG4iLG9wdGFyZyk7Ci0JICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLQkgIH0KLQllbHNlIHsKLQkgIHN0cmNweSh0bXAsb3B0YXJnKTsKLQkgIHRyYWNlZmlsZSA9IHRtcDsKLQkgIHNpbV9pb19wcmludGYoc2QsIlBsYWNpbmcgdHJhY2UgaW5mb3JtYXRpb24gaW50byBmaWxlIFwiJXNcIlxuIix0cmFjZWZpbGUpOwotCX0KLSAgICAgIH0KLSNlbmRpZiAvKiBUUkFDRSAqLwotICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKLQotICAgIGNhc2UgT1BUSU9OX0ZJUk1XQVJFOgotICAgICAgcmV0dXJuIHNpbV9maXJtd2FyZV9jb21tYW5kIChzZCwgYXJnKTsKLQotICAgIGNhc2UgT1BUSU9OX0JPQVJEOgotICAgICAgewotCWlmIChhcmcpCi0JICB7Ci0JICAgIGJvYXJkID0gemFsbG9jKHN0cmxlbihhcmcpICsgMSk7Ci0JICAgIHN0cmNweShib2FyZCwgYXJnKTsKLQkgIH0KLQlyZXR1cm4gU0lNX1JDX09LOwotICAgICAgfQotICAgIH0KLSAgCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLQotc3RhdGljIGNvbnN0IE9QVElPTiBtaXBzX29wdGlvbnNbXSA9Ci17Ci0gIHsgeyJkaW5lcm8tdHJhY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJTkVST19UUkFDRX0sCi0gICAgICAnXDAnLCAib258b2ZmIiwgIkVuYWJsZSBkaW5lcm8gdHJhY2luZyIsCi0gICAgICBtaXBzX29wdGlvbl9oYW5kbGVyIH0sCi0gIHsgeyJkaW5lcm8tZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElORVJPX0ZJTEV9LAotICAgICAgJ1wwJywgIkZJTEUiLCAiV3JpdGUgZGluZXJvIHRyYWNlIHRvIEZJTEUiLAotICAgICAgbWlwc19vcHRpb25faGFuZGxlciB9LAotICB7IHsiZmlybXdhcmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJUk1XQVJFfSwKLSAgICAnXDAnLCAiW2lkdHxwbW9ufGxzaXBtb258bm9uZV1bQEFERFJFU1NdIiwgIkVtdWxhdGUgUk9NIG1vbml0b3IiLAotICAgIG1pcHNfb3B0aW9uX2hhbmRsZXIgfSwKLSAgeyB7ImJvYXJkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CT0FSRH0sCi0gICAgICdcMCcsICJub25lIiAvKiByZWx5IG9uIGNvbXBpbGUtdGltZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3Igb3RoZXIgb3B0aW9ucyAqLwotCi0jZGVmaW5lIEJPQVJEX0pNUjM5MDQgImptcjM5MDQiCi0gICAgICAgICAgICJ8IiBCT0FSRF9KTVIzOTA0Ci0jZGVmaW5lIEJPQVJEX0pNUjM5MDRfUEFMICJqbXIzOTA0cGFsIgotICAgICAgICAgICAifCIgQk9BUkRfSk1SMzkwNF9QQUwKLSNkZWZpbmUgQk9BUkRfSk1SMzkwNF9ERUJVRyAiam1yMzkwNGRlYnVnIgotICAgICAgICAgICAifCIgQk9BUkRfSk1SMzkwNF9ERUJVRwotI2RlZmluZSBCT0FSRF9CU1AgImJzcCIKLSAgICAgICAgICAgInwiIEJPQVJEX0JTUAotCi0gICAgLCAiQ3VzdG9taXplIHNpbXVsYXRpb24gZm9yIGEgcGFydGljdWxhciBib2FyZC4iLCBtaXBzX29wdGlvbl9oYW5kbGVyIH0sCi0KLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KLX07Ci0KLQotaW50IGludGVycnVwdF9wZW5kaW5nOwotCi12b2lkCi1pbnRlcnJ1cHRfZXZlbnQgKFNJTV9ERVNDIHNkLCB2b2lkICpkYXRhKQotewotICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsgLyogRklYTUUgKi8KLSAgYWRkcmVzc193b3JkIGNpYSA9IENJQV9HRVQgKGNwdSk7Ci0gIGlmIChTUiAmIHN0YXR1c19JRSkKLSAgICB7Ci0gICAgICBpbnRlcnJ1cHRfcGVuZGluZyA9IDA7Ci0gICAgICBTaWduYWxFeGNlcHRpb25JbnRlcnJ1cHQgKDEpOyAvKiBpbnRlcnJ1cHQgIjEiICovCi0gICAgfQotICBlbHNlIGlmICghaW50ZXJydXB0X3BlbmRpbmcpCi0gICAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsIDEsIGludGVycnVwdF9ldmVudCwgZGF0YSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLSBEZXZpY2UgcmVnaXN0cmF0aW9uIGhvb2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgZGV2aWNlX2luaXQoU0lNX0RFU0Mgc2QpIHsKLSNpZmRlZiBERVZJQ0VfSU5JVAotICBleHRlcm4gdm9pZCByZWdpc3Rlcl9kZXZpY2VzKFNJTV9ERVNDKTsKLSAgcmVnaXN0ZXJfZGV2aWNlcyhzZCk7Ci0jZW5kaWYKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLSBHREIgc2ltdWxhdG9yIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1TSU1fREVTQwotc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQotICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7Ci0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIFNJTV9ERVNDIHNkID0gc2ltX3N0YXRlX2FsbG9jIChraW5kLCBjYik7Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0KLSAgLyogRklYTUU6IHdhdGNocG9pbnRzIGNvZGUgc2hvdWxkbid0IG5lZWQgdGhpcyAqLwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYyA9ICYoUEMpOwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKLSAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X2hhbmRsZXIgPSBpbnRlcnJ1cHRfZXZlbnQ7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWVjaGFuaXNtIGZvciBkb2luZyBpbnNuIHByb2ZpbGluZy4gICovCi0gIENQVV9JTlNOX05BTUUgKGNwdSkgPSBnZXRfaW5zbl9uYW1lOwotICBDUFVfTUFYX0lOU05TIChjcHUpID0gbnJfaXRhYmxlX2VudHJpZXM7Ci0KLSAgU1RBVEUgPSAwOwotICAKLSAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQotICAgIHJldHVybiAwOwotICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIG1pcHNfb3B0aW9ucyk7Ci0KLQotICAvKiBnZXRvcHQgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBqdXN0IGhhdmUgdG8gZXhpdCBpZiB0aGlzIGZhaWxzLgotICAgICBGSVhNRTogSG1tbS4uLiAgaW4gdGhlIGNhc2Ugb2YgZ2RiIHdlIG5lZWQgZ2V0b3B0IHRvIGNhbGwKLSAgICAgcHJpbnRfZmlsdGVyZWQuICAqLwotICBpZiAoc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKLQkgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLwotICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBoYW5kbGUgYm9hcmQtc3BlY2lmaWMgbWVtb3J5IG1hcHMgKi8KLSAgaWYgKGJvYXJkID09IE5VTEwpCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgY29yZSBtYW5hZ2VkIG1lbW9yeSAqLwotICAgICAgCi0KLSAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBjb2RlIC0gdW5kZXIgdGhpcyAoYXQgbGV2ZWwgb25lKQotCSBhcmUgdGhlIGtlcm5lbCBzcGFjZXMgSzAgJiBLMS4gIEJvdGggb2YgdGhlc2UgbWFwIHRvIGEgc2luZ2xlCi0JIHNtYWxsZXIgc3ViIHJlZ2lvbiAqLwotICAgICAgc2ltX2RvX2NvbW1hbmQoc2QsIiBtZW1vcnkgcmVnaW9uIDB4N2ZmZjgwMDAsMHg4MDAwIikgOyAvKiBNVFotIDMyIGsgc3RhY2sgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCUlMHglbHgsMHglMHgiLAotCQkgICAgICAgSzFCQVNFLCBLMFNJWkUsCi0JCSAgICAgICBNRU1fU0laRSwgLyogYWN0dWFsIHNpemUgKi8KLQkJICAgICAgIEswQkFTRSk7Ci0gICAgICAKLSAgICAgIGRldmljZV9pbml0KHNkKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJvYXJkICE9IE5VTEwKLQkgICAmJiAoc3RyY21wKGJvYXJkLCBCT0FSRF9CU1ApID09IDApKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBTVEFURV9FTlZJUk9OTUVOVCAoc2QpID0gT1BFUkFUSU5HX0VOVklST05NRU5UOwotCi0gICAgICAvKiBST006IDB4OUZDMF8wMDAwIC0gMHg5RkZGX0ZGRkYgYW5kIDB4QkZDMF8wMDAwIC0gMHhCRkZGX0ZGRkYgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCwweCUweCIsCi0JCSAgICAgICAweDlGQzAwMDAwLCAKLQkJICAgICAgIDQgKiAxMDI0ICogMTAyNCwgLyogNCBNQiAqLwotCQkgICAgICAgMHhCRkMwMDAwMCk7Ci0KLSAgICAgIC8qIFNSQU06IDB4ODAwMF8wMDAwIC0gMHg4MDNGX0ZGRkYgYW5kIDB4QTAwMF8wMDAwIC0gMHhBMDNGX0ZGRkYgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCwweCUweCIsCi0JCSAgICAgICAweDgwMDAwMDAwLCAKLQkJICAgICAgIDQgKiAxMDI0ICogMTAyNCwgLyogNCBNQiAqLwotCQkgICAgICAgMHhBMDAwMDAwMCk7Ci0KLSAgICAgIC8qIERSQU06IDB4ODgwMF8wMDAwIC0gMHg4OUZGX0ZGRkYgYW5kIDB4QTgwMF8wMDAwIC0gMHhBOUZGX0ZGRkYgKi8KLSAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykgLyogMzIgTUIgdG90YWwgKi8KLQl7Ci0JICB1bnNpZ25lZCBzaXplID0gNCAqIDEwMjQgKiAxMDI0OyAgLyogNCBNQiAqLwotCSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4LDB4JTB4IiwKLQkJCSAgIDB4ODgwMDAwMDAgKyAoaSAqIHNpemUpLCAKLQkJCSAgIHNpemUsIAotCQkJICAgMHhBODAwMDAwMCArIChpICogc2l6ZSkpOwotCX0KLSAgICB9Ci0jaWYgKFdJVEhfSFcpCi0gIGVsc2UgaWYgKGJvYXJkICE9IE5VTEwKLQkgICAmJiAoc3RyY21wKGJvYXJkLCBCT0FSRF9KTVIzOTA0KSA9PSAwIHx8Ci0JICAgICAgIHN0cmNtcChib2FyZCwgQk9BUkRfSk1SMzkwNF9QQUwpID09IDAgfHwKLQkgICAgICAgc3RyY21wKGJvYXJkLCBCT0FSRF9KTVIzOTA0X0RFQlVHKSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBtYXRjaCBWSVJUVUFMIG1lbW9yeSBsYXlvdXQgb2YgSk1SLVRYMzkwNCBib2FyZCAqLwotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIC0tLSBkaXNhYmxlIG1vbml0b3IgdW5sZXNzIGZvcmNlZCBvbiBieSB1c2VyIC0tLSAqLwotCi0gICAgICBpZiAoISBmaXJtd2FyZV9vcHRpb25fcCkKLQl7Ci0JICBpZHRfbW9uaXRvcl9iYXNlID0gMDsKLQkgIHBtb25fbW9uaXRvcl9iYXNlID0gMDsKLQkgIGxzaXBtb25fbW9uaXRvcl9iYXNlID0gMDsKLQl9Ci0KLSAgICAgIC8qIC0tLSBlbnZpcm9ubWVudCAtLS0gKi8KLQotICAgICAgU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9IE9QRVJBVElOR19FTlZJUk9OTUVOVDsKLQotICAgICAgLyogLS0tIG1lbW9yeSAtLS0gKi8KLQotICAgICAgLyogUk9NOiAweDlGQzBfMDAwMCAtIDB4OUZGRl9GRkZGIGFuZCAweEJGQzBfMDAwMCAtIDB4QkZGRl9GRkZGICovCi0gICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgsMHglMHgiLAotCQkgICAgICAgMHg5RkMwMDAwMCwgCi0JCSAgICAgICA0ICogMTAyNCAqIDEwMjQsIC8qIDQgTUIgKi8KLQkJICAgICAgIDB4QkZDMDAwMDApOwotCi0gICAgICAvKiBTUkFNOiAweDgwMDBfMDAwMCAtIDB4ODAzRl9GRkZGIGFuZCAweEEwMDBfMDAwMCAtIDB4QTAzRl9GRkZGICovCi0gICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgsMHglMHgiLAotCQkgICAgICAgMHg4MDAwMDAwMCwgCi0JCSAgICAgICA0ICogMTAyNCAqIDEwMjQsIC8qIDQgTUIgKi8KLQkJICAgICAgIDB4QTAwMDAwMDApOwotCi0gICAgICAvKiBEUkFNOiAweDg4MDBfMDAwMCAtIDB4ODlGRl9GRkZGIGFuZCAweEE4MDBfMDAwMCAtIDB4QTlGRl9GRkZGICovCi0gICAgICBmb3IgKGk9MDsgaTw4OyBpKyspIC8qIDMyIE1CIHRvdGFsICovCi0JewotCSAgdW5zaWduZWQgc2l6ZSA9IDQgKiAxMDI0ICogMTAyNDsgIC8qIDQgTUIgKi8KLQkgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCwweCUweCIsCi0JCQkgICAweDg4MDAwMDAwICsgKGkgKiBzaXplKSwgCi0JCQkgICBzaXplLCAKLQkJCSAgIDB4QTgwMDAwMDAgKyAoaSAqIHNpemUpKTsKLQl9Ci0KLSAgICAgIC8qIER1bW15IG1lbW9yeSByZWdpb25zIGZvciB1bnNpbXVsYXRlZCBkZXZpY2VzIC0gc29ydGVkIGJ5IGFkZHJlc3MgKi8KLQotICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4IiwgMHhCMTAwMDAwMCwgMHg0MDApOyAvKiBJU0EgSS9PICovCi0gICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgiLCAweEIyMTAwMDAwLCAweDAwNCk7IC8qIElTQSBjdGwgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCIsIDB4QjI1MDAwMDAsIDB4MDA0KTsgLyogTEVEL3N3aXRjaCAqLwotICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4IiwgMHhCMjcwMDAwMCwgMHgwMDQpOyAvKiBSVEMgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCIsIDB4QjNDMDAwMDAsIDB4MDA0KTsgLyogUlRDICovCi0gICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgiLCAweEZGRkY4MDAwLCAweDkwMCk7IC8qIERSQU1DICovCi0gICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgiLCAweEZGRkY5MDAwLCAweDIwMCk7IC8qIEVCSUYgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCIsIDB4RkZGRkUwMDAsIDB4MDFjKTsgLyogRUJJRiAqLwotICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4IiwgMHhGRkZGRjUwMCwgMHgzMDApOyAvKiBQSU8gKi8KLQotCi0gICAgICAvKiAtLS0gc2ltdWxhdGVkIGRldmljZXMgLS0tICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNGlyY0AweGZmZmZjMDAwL3JlZyAweGZmZmZjMDAwIDB4MjAiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0Y3B1Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHRtckAweGZmZmZmMDAwL3JlZyAweGZmZmZmMDAwIDB4MTAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHRtckAweGZmZmZmMTAwL3JlZyAweGZmZmZmMTAwIDB4MTAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHRtckAweGZmZmZmMjAwL3JlZyAweGZmZmZmMjAwIDB4MTAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmMzAwL3JlZyAweGZmZmZmMzAwIDB4MTAwIik7Ci0gICAgICB7Ci0JLyogRklYTUU6IHBva2luZyBhdCBkdi1zb2Nrc2VyIGludGVybmFscywgdXNlIHRjcCBiYWNrZW5kIGlmCi0JIC0tc29ja3Nlcl9hZGRyIG9wdGlvbiB3YXMgZ2l2ZW4uKi8KLQlleHRlcm4gY2hhciogc29ja3Nlcl9hZGRyOwotCWlmKHNvY2tzZXJfYWRkciA9PSBOVUxMKQotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjMwMC9iYWNrZW5kIHN0ZGlvIik7Ci0JZWxzZQotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjMwMC9iYWNrZW5kIHRjcCIpOwotICAgICAgfQotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjQwMC9yZWcgMHhmZmZmZjQwMCAweDEwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjQwMC9iYWNrZW5kIHN0ZGlvIik7Ci0KLSAgICAgIC8qIC0tIGRldmljZSBjb25uZWN0aW9ucyAtLS0gKi8KLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0aXJjID4gaXAgbGV2ZWwgL3R4MzkwNGNwdSIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDR0bXJAMHhmZmZmZjAwMCA+IGludCB0bXIwIC90eDM5MDRpcmMiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0dG1yQDB4ZmZmZmYxMDAgPiBpbnQgdG1yMSAvdHgzOTA0aXJjIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHRtckAweGZmZmZmMjAwID4gaW50IHRtcjIgL3R4MzkwNGlyYyIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjMwMCA+IGludCBzaW8wIC90eDM5MDRpcmMiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0c2lvQDB4ZmZmZmY0MDAgPiBpbnQgc2lvMSAvdHgzOTA0aXJjIik7Ci0KLSAgICAgIC8qIGFkZCBQQUwgdGltZXIgJiBJL08gbW9kdWxlICovCi0gICAgICBpZighIHN0cmNtcChib2FyZCwgQk9BUkRfSk1SMzkwNF9QQUwpKQotCXsKLQkgLyogdGhlIGRldmljZSAqLwotCSBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweGZmZmYwMDAwIik7Ci0JIHNpbV9od19wYXJzZSAoc2QsICIvcGFsQDB4ZmZmZjAwMDAvcmVnIDB4ZmZmZjAwMDAgNjQiKTsKLQotCSAvKiB3aXJlIHVwIGludGVycnVwdCBwb3J0cyB0byBpcmMgKi8KLQkgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IGNvdW50ZG93biB0bXIwIC90eDM5MDRpcmMiKTsKLQkgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IHRpbWVyIHRtcjEgL3R4MzkwNGlyYyIpOwotCSBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gaW50IGludDAgL3R4MzkwNGlyYyIpOwotCX0KLQotICAgICAgaWYoISBzdHJjbXAoYm9hcmQsIEJPQVJEX0pNUjM5MDRfREVCVUcpKQotCXsKLQkgIC8qIC0tIERFQlVHOiBnbHVlIGludGVycnVwdCBnZW5lcmF0b3JzIC0tLSAqLwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAvcmVnIDB4ZmZmZjAwMDAgMHg1MCIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQwIGludDAgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxIGludDEgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQyIGludDIgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQzIGludDMgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ0IGludDQgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ1IGludDUgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ2IGludDYgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ3IGludDcgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ4IGRtYWMwIC90eDM5MDRpcmMiKTsKLQkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50OSBkbWFjMSAvdHgzOTA0aXJjIik7Ci0JICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDEwIGRtYWMyIC90eDM5MDRpcmMiKTsKLQkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTEgZG1hYzMgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxMiBzaW8wIC90eDM5MDRpcmMiKTsKLQkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTMgc2lvMSAvdHgzOTA0aXJjIik7Ci0JICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDE0IHRtcjAgL3R4MzkwNGlyYyIpOwotCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxNSB0bXIxIC90eDM5MDRpcmMiKTsKLQkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTYgdG1yMiAvdHgzOTA0aXJjIik7Ci0JICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDE3IG5taSAvdHgzOTA0Y3B1Iik7Ci0JfQotCi0gICAgICBkZXZpY2VfaW5pdChzZCk7Ci0gICAgfQotI2VuZGlmCi0KLQotICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSBhIHJlZmVyZW5jZSBwcm9ncmFtIGltYWdlICovCi0gIGlmIChzaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwKLQkJCSAgIChTVEFURV9QUk9HX0FSR1YgKHNkKSAhPSBOVUxMCi0JCQkgICAgPyAqU1RBVEVfUFJPR19BUkdWIChzZCkKLQkJCSAgICA6IE5VTEwpLAotCQkJICAgYWJmZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ29uZmlndXJlL3ZlcmlmeSB0aGUgdGFyZ2V0IGJ5dGUgb3JkZXIgYW5kIG90aGVyIHJ1bnRpbWUKLSAgICAgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0gIGlmIChzaW1fY29uZmlnIChzZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNpbV9wb3N0X2FyZ3ZfaW5pdCAoc2QpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAotCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCi0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIHZlcmlmeSBhc3N1bXB0aW9ucyB0aGUgc2ltdWxhdG9yIG1hZGUgYWJvdXQgdGhlIGhvc3QgdHlwZSBzeXN0ZW0uCi0gICAgIFRoaXMgbWFjcm8gZG9lcyBub3QgcmV0dXJuIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSAqLwotICBTSU1fQVNTRVJUIChzaXplb2YoaW50KSA9PSAoNCAqIHNpemVvZihjaGFyKSkpOwotICBTSU1fQVNTRVJUIChzaXplb2Yod29yZDY0KSA9PSAoOCAqIHNpemVvZihjaGFyKSkpOwotCi0gIC8qIFRoaXMgaXMgTkFTVFksIGluIHRoYXQgd2UgYXJlIGFzc3VtaW5nIHRoZSBzaXplIG9mIHNwZWNpZmljCi0gICAgIHJlZ2lzdGVyczogKi8KLSAgewotICAgIGludCBybjsKLSAgICBmb3IgKHJuID0gMDsgKHJuIDwgKExBU1RfRU1CRURfUkVHTlVNICsgMSkpOyBybisrKQotICAgICAgewotCWlmIChybiA8IDMyKQotCSAgY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID0gV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFOwotCWVsc2UgaWYgKChybiA+PSBGR1JJRFgpICYmIChybiA8IChGR1JJRFggKyBOUl9GR1IpKSkKLQkgIGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9IFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkU7Ci0JZWxzZSBpZiAoKHJuID49IDMzKSAmJiAocm4gPD0gMzcpKQotCSAgY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID0gV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFOwotCWVsc2UgaWYgKChybiA9PSBTUklEWCkKLQkJIHx8IChybiA9PSBGQ1IwSURYKQotCQkgfHwgKHJuID09IEZDUjMxSURYKQotCQkgfHwgKChybiA+PSA3MikgJiYgKHJuIDw9IDg5KSkpCi0JICBjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPSAzMjsKLQllbHNlCi0JICBjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPSAwOwotICAgICAgfQotCi0KLSAgfQotCi0jaWYgZGVmaW5lZChUUkFDRSkKLSAgaWYgKFNUQVRFICYgc2ltVFJBQ0UpCi0gICAgb3Blbl90cmFjZShzZCk7Ci0jZW5kaWYgLyogVFJBQ0UgKi8KLQotICAvKgotICBzaW1faW9fZXByaW50ZiAoc2QsICJpZHRAJXggcG1vbkAleCBsc2lwbW9uQCV4XG4iLCAKLQkJICBpZHRfbW9uaXRvcl9iYXNlLAotCQkgIHBtb25fbW9uaXRvcl9iYXNlLCAKLQkJICBsc2lwbW9uX21vbml0b3JfYmFzZSk7Ci0gICovCi0KLSAgLyogV3JpdGUgdGhlIG1vbml0b3IgdHJhcCBhZGRyZXNzIGhhbmRsZXJzIGludG8gdGhlIG1vbml0b3IgKGVlcHJvbSkKLSAgICAgYWRkcmVzcyBzcGFjZS4gIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlIHRoZSB0YXJnZXQgZW5kaWFubmVzcwotICAgICBoYXMgYmVlbiBkZXRlcm1pbmVkLiAqLwotICBpZiAoaWR0X21vbml0b3JfYmFzZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvb3A7Ci0gICAgICB1bnNpZ25lZCBpZHRfbW9uaXRvcl9zaXplID0gMSA8PCAxMTsKLQotICAgICAgLyogdGhlIGRlZmF1bHQgbW9uaXRvciByZWdpb24gKi8KLSAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4JXgsMHgleCIsCi0JCSAgICAgICBpZHRfbW9uaXRvcl9iYXNlLCBpZHRfbW9uaXRvcl9zaXplKTsKLQotICAgICAgLyogRW50cnkgaW50byB0aGUgSURUIG1vbml0b3IgaXMgdmlhIGZpeGVkIGFkZHJlc3MgdmVjdG9ycywgYW5kCi0JIG5vdCB1c2luZyBtYWNoaW5lIGluc3RydWN0aW9ucy4gVG8gYXZvaWQgY2xhc2hpbmcgd2l0aCB1c2Ugb2YKLQkgdGhlIE1JUFMgVFJBUCBzeXN0ZW0sIHdlIHBsYWNlIG91ciBvd24gKHNpbXVsYXRvciBzcGVjaWZpYykKLQkgInVuZGVmaW5lZCIgaW5zdHJ1Y3Rpb25zIGludG8gdGhlIHJlbGV2YW50IHZlY3RvciBzbG90cy4gKi8KLSAgICAgIGZvciAobG9vcCA9IDA7IChsb29wIDwgaWR0X21vbml0b3Jfc2l6ZSk7IGxvb3AgKz0gNCkKLQl7Ci0JICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoaWR0X21vbml0b3JfYmFzZSArIGxvb3ApOwotCSAgdW5zaWduZWQzMiBpbnNuID0gKFJTVkRfSU5TVFJVQ1RJT04gfAotCQkJICAgICAoKChsb29wID4+IDIpICYgUlNWRF9JTlNUUlVDVElPTl9BUkdfTUFTSykKLQkJCSAgICAgIDw8IFJTVkRfSU5TVFJVQ1RJT05fQVJHX1NISUZUKSk7Ci0JICBIMlQgKGluc24pOwotCSAgc2ltX3dyaXRlIChzZCwgdmFkZHIsIChjaGFyICopJmluc24sIHNpemVvZiAoaW5zbikpOwotCX0KLSAgICB9Ci0KLSAgaWYgKChwbW9uX21vbml0b3JfYmFzZSAhPSAwKSB8fCAobHNpcG1vbl9tb25pdG9yX2Jhc2UgIT0gMCkpCi0gICAgewotICAgIC8qIFRoZSBQTU9OIG1vbml0b3IgdXNlcyB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlLCBidXQgcmF0aGVyIHRoYW4KLSAgICAgICBicmFuY2hpbmcgaW50byBpdCB0aGUgYWRkcmVzcyBvZiBhIHJvdXRpbmUgaXMgbG9hZGVkLiBXZSBjYW4KLSAgICAgICBjaGVhdCBmb3IgdGhlIG1vbWVudCwgYW5kIGRpcmVjdCB0aGUgUE1PTiByb3V0aW5lIHRvIElEVCBzdHlsZQotICAgICAgIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlIG1vbml0b3Igc3BhY2UuIFRoaXMgcmVsaWVzIG9uIHRoZSBJRFQKLSAgICAgICBtb25pdG9yIG5vdCB1c2luZyB0aGUgbG9jYXRpb25zIGZyb20gMHhCRkMwMDUwMCBvbndhcmRzIGFzIGl0cwotICAgICAgIGVudHJ5IHBvaW50cy4qLwotICAgICAgdW5zaWduZWQgbG9vcDsKLSAgICAgIGZvciAobG9vcCA9IDA7IChsb29wIDwgMjQpOyBsb29wKyspCi0JewotCSAgdW5zaWduZWQzMiB2YWx1ZSA9ICgoMHg1MDAgLSA4KSAvIDgpOyAvKiBkZWZhdWx0IFVOREVGSU5FRCByZWFzb24gY29kZSAqLwotCSAgc3dpdGNoIChsb29wKQotCSAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIHJlYWQgKi8KLSAgICAgICAgICAgICAgdmFsdWUgPSA3OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogLyogd3JpdGUgKi8KLSAgICAgICAgICAgICAgdmFsdWUgPSA4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogLyogb3BlbiAqLwotICAgICAgICAgICAgICB2YWx1ZSA9IDY7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiAvKiBjbG9zZSAqLwotICAgICAgICAgICAgICB2YWx1ZSA9IDEwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogLyogcHJpbnRmICovCi0gICAgICAgICAgICAgIHZhbHVlID0gKCgweDUwMCAtIDE2KSAvIDgpOyAvKiBub3QgYW4gSURUIHJlYXNvbiBjb2RlICovCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OiAvKiBjbGlleGl0ICovCi0gICAgICAgICAgICAgIHZhbHVlID0gMTc7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMTogLyogZmx1c2hfY2FjaGUgKi8KLSAgICAgICAgICAgICAgdmFsdWUgPSAyODsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0JU0lNX0FTU0VSVCAoaWR0X21vbml0b3JfYmFzZSAhPSAwKTsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgaWR0X21vbml0b3JfYmFzZSArICh2YWx1ZSAqIDgpKTsKLQlIMlQgKHZhbHVlKTsKLQotCWlmIChwbW9uX21vbml0b3JfYmFzZSAhPSAwKQotCSAgewotCSAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAocG1vbl9tb25pdG9yX2Jhc2UgKyAobG9vcCAqIDQpKTsKLQkgICAgc2ltX3dyaXRlIChzZCwgdmFkZHIsIChjaGFyICopJnZhbHVlLCBzaXplb2YgKHZhbHVlKSk7Ci0JICB9Ci0KLQlpZiAobHNpcG1vbl9tb25pdG9yX2Jhc2UgIT0gMCkKLQkgIHsKLQkgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKGxzaXBtb25fbW9uaXRvcl9iYXNlICsgKGxvb3AgKiA0KSk7Ci0JICAgIHNpbV93cml0ZSAoc2QsIHZhZGRyLCAoY2hhciAqKSZ2YWx1ZSwgc2l6ZW9mICh2YWx1ZSkpOwotCSAgfQotICAgICAgfQotCi0gIC8qIFdyaXRlIGFuIGFib3J0IHNlcXVlbmNlIGludG8gdGhlIFRSQVAgKGNvbW1vbikgZXhjZXB0aW9uIHZlY3RvcgotICAgICBhZGRyZXNzZXMuICBUaGlzIGlzIHRvIGNhdGNoIGNvZGUgZXhlY3V0aW5nIGEgVFJBUCAoZXQuYWwuKQotICAgICBpbnN0cnVjdGlvbiB3aXRob3V0IGluc3RhbGxpbmcgYSB0cmFwIGhhbmRsZXIuICovCi0gIGlmICgoaWR0X21vbml0b3JfYmFzZSAhPSAwKSB8fCAKLSAgICAgIChwbW9uX21vbml0b3JfYmFzZSAhPSAwKSB8fCAKLSAgICAgIChsc2lwbW9uX21vbml0b3JfYmFzZSAhPSAwKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZDMyIGhhbHRbMl0gPSB7IDB4MjQwNDAwMmYgLyogYWRkaXUgcjQsIHIwLCA0NyAqLywKLQkJCSAgICAgSEFMVF9JTlNUUlVDVElPTiAvKiBCUkVBSyAqLyB9OwotICAgICAgSDJUIChoYWx0WzBdKTsKLSAgICAgIEgyVCAoaGFsdFsxXSk7Ci0gICAgICBzaW1fd3JpdGUgKHNkLCAweDgwMDAwMDAwLCAoY2hhciAqKSBoYWx0LCBzaXplb2YgKGhhbHQpKTsKLSAgICAgIHNpbV93cml0ZSAoc2QsIDB4ODAwMDAxODAsIChjaGFyICopIGhhbHQsIHNpemVvZiAoaGFsdCkpOwotICAgICAgc2ltX3dyaXRlIChzZCwgMHg4MDAwMDIwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7Ci0gICAgICAvKiBYWFg6IFdyaXRlIGhlcmUgdW5jb25kaXRpb25hbGx5PyAqLwotICAgICAgc2ltX3dyaXRlIChzZCwgMHhCRkMwMDIwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7Ci0gICAgICBzaW1fd3JpdGUgKHNkLCAweEJGQzAwMzgwLCAoY2hhciAqKSBoYWx0LCBzaXplb2YgKGhhbHQpKTsKLSAgICAgIHNpbV93cml0ZSAoc2QsIDB4QkZDMDA0MDAsIChjaGFyICopIGhhbHQsIHNpemVvZiAoaGFsdCkpOwotICAgIH0KLSAgfQotCi0KLQotICByZXR1cm4gc2Q7Ci19Ci0KLSNpZiBkZWZpbmVkKFRSQUNFKQotc3RhdGljIHZvaWQKLW9wZW5fdHJhY2Uoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICB0cmFjZWZoID0gZm9wZW4odHJhY2VmaWxlLCJ3YisiKTsKLSAgaWYgKHRyYWNlZmggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZihzZCwiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIFwiJXNcIiwgd3JpdGluZyB0cmFjZSBpbmZvcm1hdGlvbiB0byBzdGRlcnIuXG4iLHRyYWNlZmlsZSk7Ci0gICAgICB0cmFjZWZoID0gc3RkZXJyOwotICB9Ci19Ci0jZW5kaWYgLyogVFJBQ0UgKi8KLQotLyogUmV0dXJuIG5hbWUgb2YgYW4gaW5zbiwgdXNlZCBieSBpbnNuIHByb2ZpbGluZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfaW5zbl9uYW1lIChzaW1fY3B1ICpjcHUsIGludCBpKQotewotICByZXR1cm4gaXRhYmxlW2ldLm5hbWU7Ci19Ci0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHF1aXR0aW5nOwotewotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBzaW1fY2xvc2U6IGVudGVyZWQgKHF1aXR0aW5nID0gJWQpXG4iLHF1aXR0aW5nKTsKLSNlbmRpZgotCi0KLSAgLyogInF1aXR0aW5nIiBpcyBub24temVybyBpZiB3ZSBjYW5ub3QgaGFuZyBvbiBlcnJvcnMgKi8KLQotICAvKiBzaHV0IGRvd24gbW9kdWxlcyAqLwotICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotCi0gIC8qIEVuc3VyZSB0aGF0IGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIHRocm91Z2ggdGhlIGNhbGxiYWNrCi0gICAgIG1lY2hhbmlzbSBhcmUgcmVsZWFzZWQ6ICovCi0gIHNpbV9pb19zaHV0ZG93biAoc2QpOwotCi0jaWYgZGVmaW5lZChUUkFDRSkKLSAgaWYgKHRyYWNlZmggIT0gTlVMTCAmJiB0cmFjZWZoICE9IHN0ZGVycikKLSAgIGZjbG9zZSh0cmFjZWZoKTsKLSAgdHJhY2VmaCA9IE5VTEw7Ci0jZW5kaWYgLyogVFJBQ0UgKi8KLQotICAvKiBGSVhNRSAtIGZyZWUgU0QgKi8KLQotICByZXR1cm47Ci19Ci0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLGFkZHIsYnVmZmVyLHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaW5kZXg7Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLwotCi0gIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIHplcm8gaWYgZXJyb3IuICovCi0jaWZkZWYgREVCVUcKLSAgc2ltX2lvX3ByaW50ZihzZCwic2ltX3dyaXRlKDB4JXMsYnVmZmVyLCVkKTtcbiIscHJfYWRkcihhZGRyKSxzaXplKTsKLSNlbmRpZgotCi0gIC8qIFdlIHVzZSByYXcgcmVhZCBhbmQgd3JpdGUgcm91dGluZXMsIHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIGNvdW50Ci0gICAgIHRoZSBHREIgbWVtb3J5IGFjY2Vzc2VzIGluIG91ciBzdGF0aXN0aWNzIGdhdGhlcmluZy4gKi8KLQotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9IChhZGRyZXNzX3dvcmQpYWRkciArIGluZGV4OwotICAgICAgYWRkcmVzc193b3JkIHBhZGRyOwotICAgICAgaW50IGNjYTsKLSAgICAgIGlmICghYWRkcmVzc190cmFuc2xhdGlvbiAoU0QsIENQVSwgTlVMTF9DSUEsIHZhZGRyLCBpc0RBVEEsIGlzU1RPUkUsICZwYWRkciwgJmNjYSwgaXNSQVcpKQotCWJyZWFrOwotICAgICAgaWYgKHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoU0QsIENQVSwgcmVhZF9tYXAsIGJ1ZmZlciArIGluZGV4LCBwYWRkciwgMSkgIT0gMSkKLQlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuKGluZGV4KTsKLX0KLQotaW50Ci1zaW1fcmVhZCAoc2QsYWRkcixidWZmZXIsc2l6ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpbmRleDsKLSAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7IC8qIEZJWE1FICovCi0KLSAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgemVybyBpZiBlcnJvci4gKi8KLSNpZmRlZiBERUJVRwotICBzaW1faW9fcHJpbnRmKHNkLCJzaW1fcmVhZCgweCVzLGJ1ZmZlciwlZCk7XG4iLHByX2FkZHIoYWRkciksc2l6ZSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICBmb3IgKGluZGV4ID0gMDsgKGluZGV4IDwgc2l6ZSk7IGluZGV4KyspCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKGFkZHJlc3Nfd29yZClhZGRyICsgaW5kZXg7Ci0gICAgICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gICAgICBpbnQgY2NhOwotICAgICAgaWYgKCFhZGRyZXNzX3RyYW5zbGF0aW9uIChTRCwgQ1BVLCBOVUxMX0NJQSwgdmFkZHIsIGlzREFUQSwgaXNMT0FELCAmcGFkZHIsICZjY2EsIGlzUkFXKSkKLQlicmVhazsKLSAgICAgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoU0QsIENQVSwgcmVhZF9tYXAsIGJ1ZmZlciArIGluZGV4LCBwYWRkciwgMSkgIT0gMSkKLQlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuKGluZGV4KTsKLX0KLQotaW50Ci1zaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLHJuLG1lbW9yeSxsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7IC8qIEZJWE1FICovCi0gIC8qIE5PVEU6IGdkYiAodGhlIGNsaWVudCkgc3RvcmVzIHJlZ2lzdGVycyBpbiB0YXJnZXQgYnl0ZSBvcmRlcgotICAgICB3aGlsZSB0aGUgc2ltdWxhdG9yIHVzZXMgaG9zdCBieXRlIG9yZGVyICovCi0jaWZkZWYgREVCVUcKLSAgc2ltX2lvX3ByaW50ZihzZCwic2ltX3N0b3JlX3JlZ2lzdGVyKCVkLCptZW1vcnk9MHglcyk7XG4iLHJuLHByX2FkZHIoKigoU0lNX0FERFIgKiltZW1vcnkpKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBVbmZvcnR1bmF0ZWx5IHRoaXMgc3VmZmVycyBmcm9tIHRoZSBzYW1lIHByb2JsZW0gYXMgdGhlIHJlZ2lzdGVyCi0gICAgIG51bWJlcmluZyBvbmUuIFdlIG5lZWQgdG8ga25vdyB3aGF0IHRoZSB3aWR0aCBvZiBlYWNoIGxvZ2ljYWwKLSAgICAgcmVnaXN0ZXIgbnVtYmVyIGlzIGZvciB0aGUgYXJjaGl0ZWN0dXJlIGJlaW5nIHNpbXVsYXRlZC4gKi8KLQotICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDApCi0gICAgewotICAgICAgc2ltX2lvX2VwcmludGYoc2QsIkludmFsaWQgcmVnaXN0ZXIgd2lkdGggZm9yICVkIChyZWdpc3RlciBzdG9yZSBpZ25vcmVkKVxuIixybik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLQotCi0gIGlmIChybiA+PSBGR1JJRFggJiYgcm4gPCBGR1JJRFggKyBOUl9GR1IpCi0gICAgewotICAgICAgY3B1LT5mcHJfc3RhdGVbcm4gLSBGR1JJRFhdID0gZm10X3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDMyKQotCXsKLQkgIGlmIChsZW5ndGggPT0gOCkKLQkgICAgewotCSAgICAgIGNwdS0+ZmdyW3JuIC0gRkdSSURYXSA9IAotCQkodW5zaWduZWQzMikgVDJIXzggKCoodW5zaWduZWQ2NCopbWVtb3J5KTsKLQkgICAgICByZXR1cm4gODsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3B1LT5mZ3Jbcm4gLSBGR1JJRFhdID0gVDJIXzQgKCoodW5zaWduZWQzMiopbWVtb3J5KTsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjcHUtPmZncltybiAtIEZHUklEWF0gPSBUMkhfOCAoKih1bnNpZ25lZDY0KiltZW1vcnkpOwotCSAgcmV0dXJuIDg7Ci0JfQotICAgIH0KLQotICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDMyKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPT0gOCkKLQl7Ci0JICBjcHUtPnJlZ2lzdGVyc1tybl0gPQotCSAgICAodW5zaWduZWQzMikgVDJIXzggKCoodW5zaWduZWQ2NCopbWVtb3J5KTsKLQkgIHJldHVybiA4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjcHUtPnJlZ2lzdGVyc1tybl0gPSBUMkhfNCAoKih1bnNpZ25lZDMyKiltZW1vcnkpOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNwdS0+cmVnaXN0ZXJzW3JuXSA9IFQySF84ICgqKHVuc2lnbmVkNjQqKW1lbW9yeSk7Ci0gICAgICByZXR1cm4gODsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCxybixtZW1vcnksbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLwotICAvKiBOT1RFOiBnZGIgKHRoZSBjbGllbnQpIHN0b3JlcyByZWdpc3RlcnMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIKLSAgICAgd2hpbGUgdGhlIHNpbXVsYXRvciB1c2VzIGhvc3QgYnl0ZSBvcmRlciAqLwotI2lmZGVmIERFQlVHCi0jaWYgMCAgLyogRklYTUU6IGRvZXNuJ3QgY29tcGlsZSAqLwotICBzaW1faW9fcHJpbnRmKHNkLCJzaW1fZmV0Y2hfcmVnaXN0ZXIoJWQ9MHglcyxtZW0pIDogcGxhY2Ugc2ltdWxhdG9yIHJlZ2lzdGVycyBpbnRvIG1lbW9yeVxuIixybixwcl9hZGRyKHJlZ2lzdGVyc1tybl0pKTsKLSNlbmRpZgotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgaWYgKGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9PSAwKQotICAgIHsKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIkludmFsaWQgcmVnaXN0ZXIgd2lkdGggZm9yICVkIChyZWdpc3RlciBmZXRjaCBpZ25vcmVkKVxuIixybik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLQotCi0gIC8qIEFueSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotICBpZiAocm4gPj0gRkdSSURYICYmIHJuIDwgRkdSSURYICsgTlJfRkdSKQotICAgIHsKLSAgICAgIGlmIChjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPT0gMzIpCi0JewotCSAgaWYgKGxlbmd0aCA9PSA4KQotCSAgICB7Ci0JICAgICAgKih1bnNpZ25lZDY0KiltZW1vcnkgPQotCQlIMlRfOCAoKHVuc2lnbmVkMzIpIChjcHUtPmZncltybiAtIEZHUklEWF0pKTsKLQkgICAgICByZXR1cm4gODsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKih1bnNpZ25lZDMyKiltZW1vcnkgPSBIMlRfNCAoY3B1LT5mZ3Jbcm4gLSBGR1JJRFhdKTsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqKHVuc2lnbmVkNjQqKW1lbW9yeSA9IEgyVF84IChjcHUtPmZncltybiAtIEZHUklEWF0pOwotCSAgcmV0dXJuIDg7Ci0JfQotICAgIH0KLQotICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDMyKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPT0gOCkKLQl7Ci0JICAqKHVuc2lnbmVkNjQqKW1lbW9yeSA9Ci0JICAgIEgyVF84ICgodW5zaWduZWQzMikgKGNwdS0+cmVnaXN0ZXJzW3JuXSkpOwotCSAgcmV0dXJuIDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICoodW5zaWduZWQzMiopbWVtb3J5ID0gSDJUXzQgKCh1bnNpZ25lZDMyKShjcHUtPnJlZ2lzdGVyc1tybl0pKTsKLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqKHVuc2lnbmVkNjQqKW1lbW9yeSA9IEgyVF84ICgodW5zaWduZWQ2NCkoY3B1LT5yZWdpc3RlcnNbcm5dKSk7Ci0gICAgICByZXR1cm4gODsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotU0lNX1JDCi1zaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgYWJmZCwgYXJndixlbnYpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci0gICAgIGNoYXIgKiplbnY7Ci17Ci0KLSNpZmRlZiBERUJVRwotI2lmIDAgLyogRklYTUU6IGRvZXNuJ3QgY29tcGlsZSAqLwotICBwcmludGYoIkRCRzogc2ltX2NyZWF0ZV9pbmZlcmlvciBlbnRlcmVkOiBzdGFydF9hZGRyZXNzID0gMHglc1xuIiwKLQkgcHJfYWRkcihQQykpOwotI2VuZGlmCi0jZW5kaWYgLyogREVCVUcgKi8KLQotICBDb2xkUmVzZXQoc2QpOwotCi0gIGlmIChhYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogb3ZlcnJpZGUgUEMgdmFsdWUgc2V0IGJ5IENvbGRSZXNldCAoKSAqLwotICAgICAgaW50IGNwdV9ucjsKLSAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgc2ltX2VuZ2luZV9ucl9jcHVzIChzZCk7IGNwdV9ucisrKQotCXsKLQkgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGNwdV9ucik7Ci0JICBDSUFfU0VUIChjcHUsICh1bnNpZ25lZDY0KSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKLQl9Ci0gICAgfQotCi0jaWYgMCAvKiBkZWYgREVCVUcgKi8KLSAgaWYgKGFyZ3YgfHwgZW52KQotICAgIHsKLSAgICAgIC8qIFdlIHNob3VsZCByZWFsbHkgcGxhY2UgdGhlIGFyZ3Ygc2xvdCB2YWx1ZXMgaW50byB0aGUgYXJndW1lbnQKLQkgcmVnaXN0ZXJzLCBhbmQgb250byB0aGUgc3RhY2sgYXMgcmVxdWlyZWQuIEhvd2V2ZXIsIHRoaXMKLQkgYXNzdW1lcyB0aGF0IHdlIGhhdmUgYSBzdGFjayBkZWZpbmVkLCB3aGljaCBpcyBub3QKLQkgbmVjZXNzYXJpbHkgdHJ1ZSBhdCB0aGUgbW9tZW50LiAqLwotICAgICAgY2hhciAqKmNwdHI7Ci0gICAgICBzaW1faW9fcHJpbnRmKHNkLCJzaW1fY3JlYXRlX2luZmVyaW9yKCkgOiBwYXNzZWQgYXJndW1lbnRzIGlnbm9yZWRcbiIpOwotICAgICAgZm9yIChjcHRyID0gYXJndjsgKGNwdHIgJiYgKmNwdHIpOyBjcHRyKyspCi0JcHJpbnRmKCJEQkc6IGFyZyBcIiVzXCJcbiIsKmNwdHIpOwotICAgIH0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXZvaWQKLXNpbV9kb19jb21tYW5kIChzZCxjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17Ci0gIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCi0gICAgc2ltX2lvX3ByaW50ZiAoc2QsICJFcnJvcjogXCIlc1wiIGlzIG5vdCBhIHZhbGlkIE1JUFMgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLAotCQkgICBjbWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tIFByaXZhdGUgc2ltdWxhdG9yIHN1cHBvcnQgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJlYWQgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gbWVtb3J5LCByZXR1cm4gaW4gYSBidWZmZXIgKi8KLXN0YXRpYyBjaGFyICoKLWZldGNoX3N0ciAoU0lNX0RFU0Mgc2QsCi0JICAgYWRkcmVzc193b3JkIGFkZHIpCi17Ci0gIGNoYXIgKmJ1ZjsKLSAgaW50IG5yID0gMDsKLSAgY2hhciBudWxsOwotICB3aGlsZSAoc2ltX3JlYWQgKHNkLCBhZGRyICsgbnIsICZudWxsLCAxKSA9PSAxICYmIG51bGwgIT0gMCkKLSAgICBucisrOwotICBidWYgPSBOWkFMTE9DIChjaGFyLCBuciArIDEpOwotICBzaW1fcmVhZCAoc2QsIGFkZHIsIGJ1ZiwgbnIpOwotICByZXR1cm4gYnVmOwotfQotCi0KLS8qIEltcGxlbWVudHMgdGhlICJzaW0gZmlybXdhcmUiIGNvbW1hbmQ6Ci0Jc2ltIGZpcm13YXJlIE5BTUVbQEFERFJFU1NdIC0tLSBlbXVsYXRlIFJPTSBtb25pdG9yIG5hbWVkIE5BTUUuCi0JCU5BTUUgY2FuIGJlIGlkdCwgcG1vbiwgb3IgbHNpcG1vbi4gIElmIG9taXR0ZWQsIEFERFJFU1MKLQkJZGVmYXVsdHMgdG8gdGhlIG5vcm1hbCBhZGRyZXNzIGZvciB0aGF0IG1vbml0b3IuCi0Jc2ltIGZpcm13YXJlIG5vbmUgLS0tIGRvbid0IGVtdWxhdGUgYW55IFJPTSBtb25pdG9yLiAgVXNlZnVsCi0JCWlmIHlvdSBuZWVkIGEgY2xlYW4gYWRkcmVzcyBzcGFjZS4gICovCi1zdGF0aWMgU0lNX1JDCi1zaW1fZmlybXdhcmVfY29tbWFuZCAoU0lNX0RFU0Mgc2QsIGNoYXIgKmFyZykKLXsKLSAgaW50IGFkZHJlc3NfcHJlc2VudCA9IDA7Ci0gIFNJTV9BRERSIGFkZHJlc3M7Ci0KLSAgLyogU2lnbmFsIG9jY3VycmVuY2Ugb2YgdGhpcyBvcHRpb24uICovCi0gIGZpcm13YXJlX29wdGlvbl9wID0gMTsKLQotICAvKiBQYXJzZSBvdXQgdGhlIGFkZHJlc3MsIGlmIHByZXNlbnQuICAqLwotICB7Ci0gICAgY2hhciAqcCA9IHN0cmNociAoYXJnLCAnQCcpOwotICAgIGlmIChwKQotICAgICAgewotCWNoYXIgKnE7Ci0JYWRkcmVzc19wcmVzZW50ID0gMTsKLQlwICsrOyAvKiBza2lwIG92ZXIgQCAqLwotCi0JYWRkcmVzcyA9IHN0cnRvdWwgKHAsICZxLCAwKTsKLQlpZiAoKnEgIT0gJ1wwJykgCi0JICB7Ci0JICAgIHNpbV9pb19wcmludGYgKHNkLCAiSW52YWxpZCBhZGRyZXNzIGdpdmVuIHRvIHRoZSIKLQkJCSAgICJgc2ltIGZpcm13YXJlIE5BTUVAQUREUkVTUycgY29tbWFuZDogJXNcbiIsCi0JCQkgICBwKTsKLQkgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotCSAgfQotICAgICAgfQotICAgIGVsc2UKLSAgICAgIGFkZHJlc3NfcHJlc2VudCA9IDA7Ci0gIH0KLQotICBpZiAoISBzdHJuY21wIChhcmcsICJpZHQiLCAzKSkKLSAgICB7Ci0gICAgICBpZHRfbW9uaXRvcl9iYXNlID0gYWRkcmVzc19wcmVzZW50ID8gYWRkcmVzcyA6IDB4QkZDMDAwMDA7Ci0gICAgICBwbW9uX21vbml0b3JfYmFzZSA9IDA7Ci0gICAgICBsc2lwbW9uX21vbml0b3JfYmFzZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmICghIHN0cm5jbXAgKGFyZywgInBtb24iLCA0KSkKLSAgICB7Ci0gICAgICAvKiBwbW9uIHVzZXMgaW5kaXJlY3QgY2FsbHMuICBIb29rIGludG8gaW1wbGllZCBpZHQuICovCi0gICAgICBwbW9uX21vbml0b3JfYmFzZSA9IGFkZHJlc3NfcHJlc2VudCA/IGFkZHJlc3MgOiAweEJGQzAwNTAwOwotICAgICAgaWR0X21vbml0b3JfYmFzZSA9IHBtb25fbW9uaXRvcl9iYXNlIC0gMHg1MDA7Ci0gICAgICBsc2lwbW9uX21vbml0b3JfYmFzZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmICghIHN0cm5jbXAgKGFyZywgImxzaXBtb24iLCA3KSkKLSAgICB7Ci0gICAgICAvKiBsc2lwbW9uIHVzZXMgaW5kaXJlY3QgY2FsbHMuICBIb29rIGludG8gaW1wbGllZCBpZHQuICovCi0gICAgICBwbW9uX21vbml0b3JfYmFzZSA9IDA7Ci0gICAgICBsc2lwbW9uX21vbml0b3JfYmFzZSA9IGFkZHJlc3NfcHJlc2VudCA/IGFkZHJlc3MgOiAweEJGQzAwMjAwOwotICAgICAgaWR0X21vbml0b3JfYmFzZSA9IGxzaXBtb25fbW9uaXRvcl9iYXNlIC0gMHgyMDA7Ci0gICAgfQotICBlbHNlIGlmICghIHN0cm5jbXAgKGFyZywgIm5vbmUiLCA0KSkKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzc19wcmVzZW50KQotCXsKLQkgIHNpbV9pb19wcmludGYgKHNkLAotCQkJICJUaGUgYHNpbSBmaXJtd2FyZSBub25lJyBjb21tYW5kIGRvZXMgIgotCQkJICJub3QgdGFrZSBhbiBgQUREUkVTUycgYXJndW1lbnQuXG4iKTsKLQkgIHJldHVybiBTSU1fUkNfRkFJTDsKLQl9Ci0gICAgICBpZHRfbW9uaXRvcl9iYXNlID0gMDsKLSAgICAgIHBtb25fbW9uaXRvcl9iYXNlID0gMDsKLSAgICAgIGxzaXBtb25fbW9uaXRvcl9iYXNlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlwKLVVucmVjb2duaXplZCBuYW1lIGdpdmVuIHRvIHRoZSBgc2ltIGZpcm13YXJlIE5BTUUnIGNvbW1hbmQ6ICVzXG5cCi1SZWNvZ25pemVkIGZpcm13YXJlIG5hbWVzIGFyZTogYGlkdCcsIGBwbW9uJywgYGxzaXBtb24nLCBhbmQgYG5vbmUnLlxuIiwKLQkJICAgICBhcmcpOwotICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOwotICAgIH0KLSAgCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLQotCi0vKiBTaW1wbGUgbW9uaXRvciBpbnRlcmZhY2UgKGN1cnJlbnRseSBzZXR1cCBmb3IgdGhlIElEVCBhbmQgUE1PTiBtb25pdG9ycykgKi8KLXZvaWQKLXNpbV9tb25pdG9yIChTSU1fREVTQyBzZCwKLQkgICAgIHNpbV9jcHUgKmNwdSwKLQkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICAgICB1bnNpZ25lZCBpbnQgcmVhc29uKQotewotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBzaW1fbW9uaXRvcjogZW50ZXJlZCAocmVhc29uID0gJWQpXG4iLHJlYXNvbik7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgSURUIG1vbml0b3IgYWN0dWFsbHkgYWxsb3dzIHR3byBpbnN0cnVjdGlvbnMgcGVyIHZlY3RvcgotICAgICBzbG90LiBIb3dldmVyLCB0aGUgc2ltdWxhdG9yIGN1cnJlbnRseSBjYXVzZXMgYSB0cmFwIG9uIGVhY2gKLSAgICAgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gV2UgY2hlYXQsIGFuZCBsb3NlIHRoZSBib3R0b20gYml0LiAqLwotICByZWFzb24gPj49IDE7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSwgaG93ZXZlciB0aGUKLSAgICAgbW9uaXRvciB3ZSBhcmUgc2ltdWxhdGluZyBkb2VzIG5vdCBtYWtlIHVzZSBvZiB0aGVtOiBnZXRfZXJybm8sCi0gICAgIGlzYXR0eSwgbHNlZWssIHJlbmFtZSwgc3lzdGVtLCB0aW1lIGFuZCB1bmxpbmsgKi8KLSAgc3dpdGNoIChyZWFzb24pCi0gICAgewotCi0gICAgY2FzZSA2OiAvKiBpbnQgb3BlbihjaGFyICpwYXRoLGludCBmbGFncykgKi8KLSAgICAgIHsKLQljaGFyICpwYXRoID0gZmV0Y2hfc3RyIChzZCwgQTApOwotCVYwID0gc2ltX2lvX29wZW4gKHNkLCBwYXRoLCAoaW50KUExKTsKLQl6ZnJlZSAocGF0aCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDc6IC8qIGludCByZWFkKGludCBmaWxlLGNoYXIgKnB0cixpbnQgbGVuKSAqLwotICAgICAgewotCWludCBmZCA9IEEwOwotCWludCBuciA9IEEyOwotCWNoYXIgKmJ1ZiA9IHphbGxvYyAobnIpOwotCVYwID0gc2ltX2lvX3JlYWQgKHNkLCBmZCwgYnVmLCBucik7Ci0Jc2ltX3dyaXRlIChzZCwgQTEsIGJ1ZiwgbnIpOwotCXpmcmVlIChidWYpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDg6IC8qIGludCB3cml0ZShpbnQgZmlsZSxjaGFyICpwdHIsaW50IGxlbikgKi8KLSAgICAgIHsKLQlpbnQgZmQgPSBBMDsKLQlpbnQgbnIgPSBBMjsKLQljaGFyICpidWYgPSB6YWxsb2MgKG5yKTsKLQlzaW1fcmVhZCAoc2QsIEExLCBidWYsIG5yKTsKLQlWMCA9IHNpbV9pb193cml0ZSAoc2QsIGZkLCBidWYsIG5yKTsKLQl6ZnJlZSAoYnVmKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgMTA6IC8qIGludCBjbG9zZShpbnQgZmlsZSkgKi8KLSAgICAgIHsKLQlWMCA9IHNpbV9pb19jbG9zZSAoc2QsIChpbnQpQTApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAyOiAgLyogRGVuc2FuIG1vbml0b3I6IGNoYXIgaW5ieXRlKGludCB3YWl0ZmxhZykgKi8KLSAgICAgIHsKLQlpZiAoQTAgPT0gMCkJLyogd2FpdGZsYWcgPT0gTk9XQUlUICovCi0JICBWMCA9ICh1bnNpZ25lZF93b3JkKS0xOwotICAgICAgfQotICAgICAvKiBEcm9wIHRocm91Z2ggdG8gY2FzZSAxMSAqLwotCi0gICAgY2FzZSAxMTogLyogY2hhciBpbmJ5dGUodm9pZCkgKi8KLSAgICAgIHsKLSAgICAgICAgY2hhciB0bXA7Ci0JLyogZW5zdXJlIHRoYXQgYWxsIG91dHB1dCBoYXMgZ29uZS4uLiAqLwotCXNpbV9pb19mbHVzaF9zdGRvdXQgKHNkKTsKLSAgICAgICAgaWYgKHNpbV9pb19yZWFkX3N0ZGluIChzZCwgJnRtcCwgc2l6ZW9mKGNoYXIpKSAhPSBzaXplb2YoY2hhcikpCi0JICB7Ci0JICAgIHNpbV9pb19lcnJvcihzZCwiSW52YWxpZCByZXR1cm4gZnJvbSBjaGFyYWN0ZXIgcmVhZCIpOwotCSAgICBWMCA9ICh1bnNpZ25lZF93b3JkKS0xOwotCSAgfQotICAgICAgICBlbHNlCi0JICBWMCA9ICh1bnNpZ25lZF93b3JkKXRtcDsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgMzogIC8qIERlbnNhbiBtb25pdG9yOiB2b2lkIGNvKGNoYXIgY2hyKSAqLwotICAgIGNhc2UgMTI6IC8qIHZvaWQgb3V0Ynl0ZShjaGFyIGNocikgOiB3cml0ZSBhIGJ5dGUgdG8gInN0ZG91dCIgKi8KLSAgICAgIHsKLSAgICAgICAgY2hhciB0bXAgPSAoY2hhcikoQTAgJiAweEZGKTsKLSAgICAgICAgc2ltX2lvX3dyaXRlX3N0ZG91dCAoc2QsICZ0bXAsIHNpemVvZihjaGFyKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDE3OiAvKiB2b2lkIF9leGl0KCkgKi8KLSAgICAgIHsKLQlzaW1faW9fZXByaW50ZiAoc2QsICJzaW1fbW9uaXRvcigxNyk6IF9leGl0KGludCByZWFzb24pIHRvIGJlIGNvZGVkXG4iKTsKLQlzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIE5VTExfQ0lBLCBzaW1fZXhpdGVkLAotCQkJICh1bnNpZ25lZCBpbnQpKEEwICYgMHhGRkZGRkZGRikpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAyOCA6IC8qIFBNT04gZmx1c2hfY2FjaGUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1NTogLyogdm9pZCBnZXRfbWVtX2luZm8odW5zaWduZWQgaW50ICpwdHIpICovCi0gICAgICAvKiBpbjogIEEwID0gcG9pbnRlciB0byB0aHJlZSB3b3JkIG1lbW9yeSBsb2NhdGlvbiAqLwotICAgICAgLyogb3V0OiBbQTAgKyAwXSA9IHNpemUgKi8KLSAgICAgIC8qICAgICAgW0EwICsgNF0gPSBpbnN0cnVjdGlvbiBjYWNoZSBzaXplICovCi0gICAgICAvKiAgICAgIFtBMCArIDhdID0gZGF0YSBjYWNoZSBzaXplICovCi0gICAgICB7Ci0JdW5zaWduZWRfNCB2YWx1ZSA9IE1FTV9TSVpFIC8qIEZJWE1FIFNUQVRFX01FTV9TSVpFIChzZCkgKi87Ci0JdW5zaWduZWRfNCB6ZXJvID0gMDsKLQlIMlQgKHZhbHVlKTsKLQlzaW1fd3JpdGUgKHNkLCBBMCArIDAsIChjaGFyICopJnZhbHVlLCA0KTsKLQlzaW1fd3JpdGUgKHNkLCBBMCArIDQsIChjaGFyICopJnplcm8sIDQpOwotCXNpbV93cml0ZSAoc2QsIEEwICsgOCwgKGNoYXIgKikmemVybywgNCk7Ci0JLyogc2ltX2lvX2VwcmludGYgKHNkLCAic2ltOiBnZXRfbWVtX2luZm8oKSBkZXByZWNpYXRlZFxuIik7ICovCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgCi0gICAgY2FzZSAxNTggOiAvKiBQTU9OIHByaW50ZiAqLwotICAgICAgLyogaW46ICBBMCA9IHBvaW50ZXIgdG8gZm9ybWF0IHN0cmluZyAqLwotICAgICAgLyogICAgICBBMSA9IG9wdGlvbmFsIGFyZ3VtZW50IDEgKi8KLSAgICAgIC8qICAgICAgQTIgPSBvcHRpb25hbCBhcmd1bWVudCAyICovCi0gICAgICAvKiAgICAgIEEzID0gb3B0aW9uYWwgYXJndW1lbnQgMyAqLwotICAgICAgLyogb3V0OiB2b2lkICovCi0gICAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGJhc2VkIG9uIHRoZSBQTU9OIHByaW50ZiBzb3VyY2UgKi8KLSAgICAgIHsKLQlhZGRyZXNzX3dvcmQgcyA9IEEwOwotCWNoYXIgYzsKLQlzaWduZWRfd29yZCAqYXAgPSAmQTE7IC8qIDFzdCBhcmd1bWVudCAqLwotICAgICAgICAvKiBUaGlzIGlzbid0IHRoZSBxdWlja2VzdCB3YXksIHNpbmNlIHdlIGNhbGwgdGhlIGhvc3QgcHJpbnQKLSAgICAgICAgICAgcm91dGluZSBmb3IgZXZlcnkgY2hhcmFjdGVyIGFsbW9zdC4gQnV0IGl0IGRvZXMgYXZvaWQKLSAgICAgICAgICAgaGF2aW5nIHRvIGFsbG9jYXRlIGFuZCBtYW5hZ2UgYSB0ZW1wb3Jhcnkgc3RyaW5nIGJ1ZmZlci4gKi8KLQkvKiBUT0RPOiBJbmNsdWRlIGNoZWNrIHRoYXQgd2Ugb25seSB1c2UgdGhyZWUgYXJndW1lbnRzIChBMSwKLSAgICAgICAgICAgQTIgYW5kIEEzKSAqLwotCXdoaWxlIChzaW1fcmVhZCAoc2QsIHMrKywgJmMsIDEpICYmIGMgIT0gJ1wwJykKLQkgIHsKLSAgICAgICAgICAgIGlmIChjID09ICclJykKLQkgICAgICB7Ci0JCWNoYXIgdG1wWzQwXTsKLQkJZW51bSB7Rk1UX1JKVVNULCBGTVRfTEpVU1QsIEZNVF9SSlVTVDAsIEZNVF9DRU5URVJ9IGZtdCA9IEZNVF9SSlVTVDsKLQkJaW50IHdpZHRoID0gMCwgdHJ1bmMgPSAwLCBoYWRkb3QgPSAwLCBsb25nbG9uZyA9IDA7Ci0JCXdoaWxlIChzaW1fcmVhZCAoc2QsIHMrKywgJmMsIDEpICYmIGMgIT0gJ1wwJykKLQkJICB7Ci0JCSAgICBpZiAoc3RyY2hyICgiZG9ieFh1bHNjZWZnJSIsIGMpKQotCQkgICAgICBicmVhazsKLQkJICAgIGVsc2UgaWYgKGMgPT0gJy0nKQotCQkgICAgICBmbXQgPSBGTVRfTEpVU1Q7Ci0JCSAgICBlbHNlIGlmIChjID09ICcwJykKLQkJICAgICAgZm10ID0gRk1UX1JKVVNUMDsKLQkJICAgIGVsc2UgaWYgKGMgPT0gJ34nKQotCQkgICAgICBmbXQgPSBGTVRfQ0VOVEVSOwotCQkgICAgZWxzZSBpZiAoYyA9PSAnKicpCi0JCSAgICAgIHsKLQkJCWlmIChoYWRkb3QpCi0JCQkgIHRydW5jID0gKGludCkqYXArKzsKLQkJCWVsc2UKLQkJCSAgd2lkdGggPSAoaW50KSphcCsrOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChjID49ICcxJyAmJiBjIDw9ICc5JykKLQkJICAgICAgewotCQkJYWRkcmVzc193b3JkIHQgPSBzOwotCQkJdW5zaWduZWQgaW50IG47Ci0JCQl3aGlsZSAoc2ltX3JlYWQgKHNkLCBzKyssICZjLCAxKSA9PSAxICYmIGlzZGlnaXQgKGMpKQotCQkJICB0bXBbcyAtIHRdID0gYzsKLQkJCXRtcFtzIC0gdF0gPSAnXDAnOwotCQkJbiA9ICh1bnNpZ25lZCBpbnQpc3RydG9sKHRtcCxOVUxMLDEwKTsKLQkJCWlmIChoYWRkb3QpCi0JCQkgIHRydW5jID0gbjsKLQkJCWVsc2UKLQkJCSAgd2lkdGggPSBuOwotCQkJcy0tOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChjID09ICcuJykKLQkJICAgICAgaGFkZG90ID0gMTsKLQkJICB9Ci0JCXN3aXRjaCAoYykKLQkJICB7Ci0JCSAgY2FzZSAnJSc6Ci0JCSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiUlIik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdzJzoKLQkJICAgIGlmICgoaW50KSphcCAhPSAwKQotCQkgICAgICB7Ci0JCQlhZGRyZXNzX3dvcmQgcCA9ICphcCsrOwotCQkJY2hhciBjaDsKLQkJCXdoaWxlIChzaW1fcmVhZCAoc2QsIHArKywgJmNoLCAxKSA9PSAxICYmIGNoICE9ICdcMCcpCi0JCQkgIHNpbV9pb19wcmludGYoc2QsICIlYyIsIGNoKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICBzaW1faW9fcHJpbnRmKHNkLCIobnVsbCkiKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ2MnOgotCQkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIlYyIsIChpbnQpKmFwKyspOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGlmIChjID09ICdsJykKLQkJICAgICAgewotCQkJc2ltX3JlYWQgKHNkLCBzKyssICZjLCAxKTsKLQkJCWlmIChjID09ICdsJykKLQkJCSAgewotCQkJICAgIGxvbmdsb25nID0gMTsKLQkJCSAgICBzaW1fcmVhZCAoc2QsIHMrKywgJmMsIDEpOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmIChzdHJjaHIgKCJkb2J4WHUiLCBjKSkKLQkJICAgICAgewotCQkJd29yZDY0IGx2ID0gKHdvcmQ2NCkgKmFwKys7Ci0JCQlpZiAoYyA9PSAnYicpCi0JCQkgIHNpbV9pb19wcmludGYoc2QsIjxiaW5hcnkgbm90IHN1cHBvcnRlZD4iKTsKLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIHNwcmludGYgKHRtcCwgIiUlJXMlYyIsIGxvbmdsb25nID8gImxsIiA6ICIiLCBjKTsKLQkJCSAgICBpZiAobG9uZ2xvbmcpCi0JCQkgICAgICBzaW1faW9fcHJpbnRmKHNkLCB0bXAsIGx2KTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBzaW1faW9fcHJpbnRmKHNkLCB0bXAsIChpbnQpbHYpOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cmNociAoImVFZmdHIiwgYykpCi0JCSAgICAgIHsKLQkJCWRvdWJsZSBkYmwgPSAqKGRvdWJsZSopKGFwKyspOwotCQkJc3ByaW50ZiAodG1wLCAiJSUlZC4lZCVjIiwgd2lkdGgsIHRydW5jLCBjKTsKLQkJCXNpbV9pb19wcmludGYgKHNkLCB0bXAsIGRibCk7Ci0JCQl0cnVuYyA9IDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgc2ltX2lvX3ByaW50ZihzZCwgIiVjIiwgYyk7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc2ltX2lvX2Vycm9yIChzZCwgIlRPRE86IHNpbV9tb25pdG9yKCVkKSA6IFBDID0gMHglc1xuIiwKLQkJICAgIHJlYXNvbiwgcHJfYWRkcihjaWEpKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybjsKLX0KLQotLyogU3RvcmUgYSB3b3JkIGludG8gbWVtb3J5LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0b3JlX3dvcmQgKFNJTV9ERVNDIHNkLAotCSAgICBzaW1fY3B1ICpjcHUsCi0JICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICAgIHV3b3JkNjQgdmFkZHIsCi0JICAgIHNpZ25lZF93b3JkIHZhbCkKLXsKLSAgYWRkcmVzc193b3JkIHBhZGRyOwotICBpbnQgdW5jYWNoZWQ7Ci0KLSAgaWYgKCh2YWRkciAmIDMpICE9IDApCi0gICAgU2lnbmFsRXhjZXB0aW9uQWRkcmVzc1N0b3JlICgpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNTVE9SRSwgJnBhZGRyLCAmdW5jYWNoZWQsCi0JCQkgICAgICBpc1RBUkdFVCwgaXNSRUFMKSkKLQl7Ci0JICBjb25zdCB1d29yZDY0IG1hc2sgPSA3OwotCSAgdXdvcmQ2NCBtZW12YWw7Ci0JICB1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCSAgcGFkZHIgPSAocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiAoUmV2ZXJzZUVuZGlhbiA8PCAyKSk7Ci0JICBieXRlID0gKHZhZGRyICYgbWFzaykgXiAoQmlnRW5kaWFuQ1BVIDw8IDIpOwotCSAgbWVtdmFsID0gKCh1d29yZDY0KSB2YWwpIDw8ICg4ICogYnl0ZSk7Ci0JICBTdG9yZU1lbW9yeSAodW5jYWNoZWQsIEFjY2Vzc0xlbmd0aF9XT1JELCBtZW12YWwsIDAsIHBhZGRyLCB2YWRkciwKLQkJICAgICAgIGlzUkVBTCk7Ci0JfQotICAgIH0KLX0KLQotLyogTG9hZCBhIHdvcmQgZnJvbSBtZW1vcnkuICAqLwotCi1zdGF0aWMgc2lnbmVkX3dvcmQKLWxvYWRfd29yZCAoU0lNX0RFU0Mgc2QsCi0JICAgc2ltX2NwdSAqY3B1LAotCSAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICAgdXdvcmQ2NCB2YWRkcikKLXsKLSAgaWYgKCh2YWRkciAmIDMpICE9IDApCi0gICAgewotICAgICAgU0lNX0NPUkVfU0lHTkFMIChTRCwgY3B1LCBjaWEsIHJlYWRfbWFwLCBBY2Nlc3NMZW5ndGhfV09SRCsxLCB2YWRkciwgcmVhZF90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIHBhZGRyOwotICAgICAgaW50IHVuY2FjaGVkOwotCi0gICAgICBpZiAoQWRkcmVzc1RyYW5zbGF0aW9uICh2YWRkciwgaXNEQVRBLCBpc0xPQUQsICZwYWRkciwgJnVuY2FjaGVkLAotCQkJICAgICAgaXNUQVJHRVQsIGlzUkVBTCkpCi0JewotCSAgY29uc3QgdXdvcmQ2NCBtYXNrID0gMHg3OwotCSAgY29uc3QgdW5zaWduZWQgaW50IHJldmVyc2UgPSBSZXZlcnNlRW5kaWFuID8gMSA6IDA7Ci0JICBjb25zdCB1bnNpZ25lZCBpbnQgYmlnZW5kID0gQmlnRW5kaWFuQ1BVID8gMSA6IDA7Ci0JICB1d29yZDY0IG1lbXZhbDsKLQkgIHVuc2lnbmVkIGludCBieXRlOwotCi0JICBwYWRkciA9IChwYWRkciAmIH5tYXNrKSB8ICgocGFkZHIgJiBtYXNrKSBeIChyZXZlcnNlIDw8IDIpKTsKLQkgIExvYWRNZW1vcnkgKCZtZW12YWwsTlVMTCx1bmNhY2hlZCwgQWNjZXNzTGVuZ3RoX1dPUkQsIHBhZGRyLCB2YWRkciwKLQkJCSAgICAgICBpc0RBVEEsIGlzUkVBTCk7Ci0JICBieXRlID0gKHZhZGRyICYgbWFzaykgXiAoYmlnZW5kIDw8IDIpOwotCSAgcmV0dXJuIFNJR05FWFRFTkQgKCgobWVtdmFsID4+ICg4ICogYnl0ZSkpICYgMHhmZmZmZmZmZiksIDMyKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBTaW11bGF0ZSB0aGUgbWlwczE2IGVudHJ5IGFuZCBleGl0IHBzZXVkby1pbnN0cnVjdGlvbnMuICBUaGVzZQotICAgd291bGQgbm9ybWFsbHkgYmUgaGFuZGxlZCBieSB0aGUgcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uCi0gICBjb2RlLCBidXQgZm9yIGVhc2Ugb2Ygc2ltdWxhdGlvbiB3ZSBqdXN0IGhhbmRsZSB0aGVtIGRpcmVjdGx5LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9lbnRyeSAoU0lNX0RFU0Mgc2QsCi0JICAgICAgc2ltX2NwdSAqY3B1LAotCSAgICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICAgICAgdW5zaWduZWQgaW50IGluc24pCi17Ci0gIGludCBhcmVncywgc3JlZ3MsIHJyZWc7Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogbWlwczE2X2VudHJ5OiBlbnRlcmVkIChpbnNuID0gMHglMDhYKVxuIixpbnNuKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIGFyZWdzID0gKGluc24gJiAweDcwMCkgPj4gODsKLSAgc3JlZ3MgPSAoaW5zbiAmIDB4MGMwKSA+PiA2OwotICBycmVnID0gIChpbnNuICYgMHgwMjApID4+IDU7Ci0KLSAgLyogVGhpcyBzaG91bGQgYmUgY2hlY2tlZCBieSB0aGUgY2FsbGVyLiAgKi8KLSAgaWYgKHNyZWdzID09IDMpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGFyZWdzIDwgNSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHNpZ25lZF93b3JkIHRzcDsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgZW50cnkgcHNldWRvLWluc3RydWN0aW9uLiAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFyZWdzOyBpKyspCi0Jc3RvcmVfd29yZCAoU0QsIENQVSwgY2lhLCAodXdvcmQ2NCkgKFNQICsgNCAqIGkpLCBHUFJbaSArIDRdKTsKLQotICAgICAgdHNwID0gU1A7Ci0gICAgICBTUCAtPSAzMjsKLQotICAgICAgaWYgKHJyZWcpCi0JewotCSAgdHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChTRCwgQ1BVLCBjaWEsICh1d29yZDY0KSB0c3AsIFJBKTsKLQl9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmVnczsgaSsrKQotCXsKLQkgIHRzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoU0QsIENQVSwgY2lhLCAodXdvcmQ2NCkgdHNwLCBHUFJbMTYgKyBpXSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc2lnbmVkX3dvcmQgdHNwOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBleGl0IHBzZXVkby1pbnN0cnVjdGlvbi4gICovCi0KLSAgICAgIHRzcCA9IFNQICsgMzI7Ci0KLSAgICAgIGlmIChycmVnKQotCXsKLQkgIHRzcCAtPSA0OwotCSAgUkEgPSBsb2FkX3dvcmQgKFNELCBDUFUsIGNpYSwgKHV3b3JkNjQpIHRzcCk7Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc3JlZ3M7IGkrKykKLQl7Ci0JICB0c3AgLT0gNDsKLQkgIEdQUltpICsgMTZdID0gbG9hZF93b3JkIChTRCwgQ1BVLCBjaWEsICh1d29yZDY0KSB0c3ApOwotCX0KLQotICAgICAgU1AgKz0gMzI7Ci0KLSAgICAgIGlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UID09IEhBUkRfRkxPQVRJTkdfUE9JTlQpCi0JewotCSAgaWYgKGFyZWdzID09IDUpCi0JICAgIHsKLQkgICAgICBGR1JbMF0gPSBXT1JENjRMTyAoR1BSWzRdKTsKLQkgICAgICBGUFJfU1RBVEVbMF0gPSBmbXRfdW5pbnRlcnByZXRlZDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYXJlZ3MgPT0gNikKLQkgICAgewotCSAgICAgIEZHUlswXSA9IFdPUkQ2NExPIChHUFJbNV0pOwotCSAgICAgIEZHUlsxXSA9IFdPUkQ2NExPIChHUFJbNF0pOwotCSAgICAgIEZQUl9TVEFURVswXSA9IGZtdF91bmludGVycHJldGVkOwotCSAgICAgIEZQUl9TVEFURVsxXSA9IGZtdF91bmludGVycHJldGVkOwotCSAgICB9Ci0JfQkgIAotCi0gICAgICBQQyA9IFJBOwotICAgIH0KLSAgCi19Ci0KLS8qLS0gdHJhY2Ugc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlIFRSQUNFIHN1cHBvcnQgaXMgcHJvdmlkZWQgKGlmIHJlcXVpcmVkKSBpbiB0aGUgbWVtb3J5IGFjY2Vzc2luZwotICAgcm91dGluZXMuIFNpbmNlIHdlIGFyZSBhbHNvIHByb3ZpZGluZyB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljCi0gICBmZWF0dXJlcywgdGhlIGFyY2hpdGVjdHVyZSBzaW11bGF0aW9uIGNvZGUgY2FuIGFsc28gZGVhbCB3aXRoCi0gICBub3RpZnlpbmcgdGhlIFRSQUNFIHdvcmxkIG9mIGNhY2hlIGZsdXNoZXMsIGV0Yy4gU2ltaWxhcmx5IHdlIGRvCi0gICBub3QgbmVlZCB0byBwcm92aWRlIHByb2ZpbGluZyBzdXBwb3J0IGluIHRoZSBzaW11bGF0b3IgZW5naW5lLAotICAgc2luY2Ugd2UgY2FuIHNhbXBsZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZmV0Y2ggY29udHJvbCBsb29wLiBCeQotICAgZGVmaW5pbmcgdGhlIFRSQUNFIG1hbmlmZXN0LCB3ZSBhZGQgdHJhY2luZyBhcyBhIHJ1bi10aW1lCi0gICBvcHRpb24uICovCi0KLSNpZiBkZWZpbmVkKFRSQUNFKQotLyogVHJhY2luZyBieSBkZWZhdWx0IHByb2R1Y2VzICJkaW4iIGZvcm1hdCAoYXMgcmVxdWlyZWQgYnkKLSAgIGRpbmVyb0lJSSkuIEVhY2ggbGluZSBvZiBzdWNoIGEgdHJhY2UgZmlsZSAqTVVTVCogaGF2ZSBhIGRpbiBsYWJlbAotICAgYW5kIGFkZHJlc3MgZmllbGQuIFRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIGlnbm9yZWQsIHNvIGNvbW1lbnRzIGNhbgotICAgYmUgaW5jbHVkZWQgaWYgZGVzaXJlZC4gVGhlIGZpcnN0IGZpZWxkIGlzIHRoZSBsYWJlbCB3aGljaCBtdXN0IGJlCi0gICBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLQkwICAgICAgIHJlYWQgZGF0YQotICAgICAgICAxICAgICAgIHdyaXRlIGRhdGEKLSAgICAgICAgMiAgICAgICBpbnN0cnVjdGlvbiBmZXRjaAotICAgICAgICAzICAgICAgIGVzY2FwZSByZWNvcmQgKHRyZWF0ZWQgYXMgdW5rbm93biBhY2Nlc3MgdHlwZSkKLSAgICAgICAgNCAgICAgICBlc2NhcGUgcmVjb3JkIChjYXVzZXMgY2FjaGUgZmx1c2gpCi0KLSAgIFRoZSBhZGRyZXNzIGZpZWxkIGlzIGEgMzJiaXQgKGxvd2VyLWNhc2UpIGhleGFkZWNpbWFsIGFkZHJlc3MKLSAgIHZhbHVlLiBUaGUgYWRkcmVzcyBzaG91bGQgKk5PVCogYmUgcHJlY2VkZWQgYnkgIjB4Ii4KLQotICAgVGhlIHNpemUgb2YgdGhlIG1lbW9yeSB0cmFuc2ZlciBpcyBub3QgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoCi0gICBjYWNoZSBsaW5lcyAoYXMgbG9uZyBhcyBubyBtb3JlIHRoYW4gYSBjYWNoZSBsaW5lIGNhbiBiZQotICAgdHJhbnNmZXJyZWQgaW4gYSBzaW5nbGUgb3BlcmF0aW9uIDotKSwgaG93ZXZlciBtb3JlIGluZm9ybWF0aW9uCi0gICBjb3VsZCBiZSBnaXZlbiBmb2xsb3dpbmcgdGhlIGRpbmVyb0lJSSByZXF1aXJlbWVudCB0byBhbGxvdyBtb3JlCi0gICBjb21wbGV0ZSBtZW1vcnkgYW5kIGNhY2hlIHNpbXVsYXRvcnMgdG8gcHJvdmlkZSBiZXR0ZXIKLSAgIHJlc3VsdHMuIGkuZS4gdGhlIFVuaXZlcnNpdHkgb2YgUGlzYSBoYXMgYSBjYWNoZSBzaW11bGF0b3IgdGhhdCBjYW4KLSAgIGFsc28gdGFrZSBidXMgc2l6ZSBhbmQgc3BlZWQgYXMgKHZhcmlhYmxlKSBpbnB1dHMgdG8gY2FsY3VsYXRlCi0gICBjb21wbGV0ZSBzeXN0ZW0gcGVyZm9ybWFuY2UgKGEgbXVjaCBtb3JlIHVzZWZ1bCBhYmlsaXR5IHdoZW4gdHJ5aW5nCi0gICB0byBjb25zdHJ1Y3QgYW4gZW5kIHByb2R1Y3QsIHJhdGhlciB0aGFuIGEgcHJvY2Vzc29yKS4gVGhleQotICAgY3VycmVudGx5IGhhdmUgYW4gQVJNIHZlcnNpb24gb2YgdGhlaXIgdG9vbCBjYWxsZWQgQ2hBUk0uICovCi0KLQotdm9pZAotZG90cmFjZSAoU0lNX0RFU0Mgc2QsCi0JIHNpbV9jcHUgKmNwdSwKLQkgRklMRSAqdHJhY2VmaCwKLQkgaW50IHR5cGUsCi0JIFNJTV9BRERSIGFkZHJlc3MsCi0JIGludCB3aWR0aCwKLQkgY2hhciAqY29tbWVudCwuLi4pCi17Ci0gIGlmIChTVEFURSAmIHNpbVRSQUNFKSB7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBmcHJpbnRmKHRyYWNlZmgsIiVkICVzIDsgd2lkdGggJWQgOyAiLCAKLQkJdHlwZSwKLQkJcHJfYWRkcihhZGRyZXNzKSwKLQkJd2lkdGgpOwotICAgIHZhX3N0YXJ0KGFwLGNvbW1lbnQpOwotICAgIHZmcHJpbnRmKHRyYWNlZmgsY29tbWVudCxhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLSAgICBmcHJpbnRmKHRyYWNlZmgsIlxuIik7Ci0gIH0KLSAgLyogTk9URTogU2luY2UgdGhlICJkaW4iIGZvcm1hdCB3aWxsIG9ubHkgYWNjZXB0IDMyYml0IGFkZHJlc3NlcywgYW5kCi0gICAgIHdlIG1heSBiZSBnZW5lcmF0aW5nIDY0Yml0IG9uZXMsIHdlIHNob3VsZCBwdXQgdGhlIGhpLTMyYml0cyBvZiB0aGUKLSAgICAgYWRkcmVzcyBpbnRvIHRoZSBjb21tZW50IGZpZWxkLiAqLwotCi0gIC8qIFRPRE86IFByb3ZpZGUgYSBidWZmZXIgZm9yIHRoZSB0cmFjZSBsaW5lcy4gV2UgY2FuIHRoZW4gYXZvaWQKLSAgICAgcGVyZm9ybWluZyB3cml0ZXMgdW50aWwgdGhlIGJ1ZmZlciBpcyBmaWxsZWQsIG9yIHRoZSBmaWxlIGlzCi0gICAgIGJlaW5nIGNsb3NlZC4gKi8KLQotICAvKiBOT1RFOiBXZSBjb3VsZCBjb25zaWRlciBhZGRpbmcgYSBjb21tZW50IGZpZWxkIHRvIHRoZSAiZGluIiBmaWxlCi0gICAgIHByb2R1Y2VkIHVzaW5nIHR5cGUgMyBtYXJrZXJzICh1bmtub3duIGFjY2VzcykuIFRoaXMgd291bGQgdGhlbgotICAgICBhbGxvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbSB0aGF0IHRoZSAiZGluIiBpcyBmb3IsIGFuZAotICAgICB0aGUgTUlQcyB3b3JsZCB0aGF0IHdhcyBiZWluZyBzaW11bGF0ZWQsIHRvIGJlIHBsYWNlZCBpbnRvIHRoZQotICAgICB0cmFjZSBmaWxlLiAqLwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBUUkFDRSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tIHNpbXVsYXRvciBlbmdpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkCi1Db2xkUmVzZXQgKFNJTV9ERVNDIHNkKQotewotICBpbnQgY3B1X25yOwotICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IHNpbV9lbmdpbmVfbnJfY3B1cyAoc2QpOyBjcHVfbnIrKykKLSAgICB7Ci0gICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjcHVfbnIpOwotICAgICAgLyogUkVTRVQ6IEZpeGVkIFBDIGFkZHJlc3M6ICovCi0gICAgICBQQyA9ICh1bnNpZ25lZF93b3JkKSBVTlNJR05FRDY0ICgweEZGRkZGRkZGQkZDMDAwMDApOwotICAgICAgLyogVGhlIHJlc2V0IHZlY3RvciBhZGRyZXNzIGlzIGluIHRoZSB1bm1hcHBlZCwgdW5jYWNoZWQgbWVtb3J5IHNwYWNlLiAqLwotICAgICAgCi0gICAgICBTUiAmPSB+KHN0YXR1c19TUiB8IHN0YXR1c19UUyB8IHN0YXR1c19SUCk7Ci0gICAgICBTUiB8PSAoc3RhdHVzX0VSTCB8IHN0YXR1c19CRVYpOwotICAgICAgCi0gICAgICAvKiBDaGVhdCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoZSBjb21wbGV0ZSByZWdpc3RlciBzZXQgaW1tZWRpYXRlbHkgKi8KLSAgICAgIGlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UID09IEhBUkRfRkxPQVRJTkdfUE9JTlQKLQkgICYmIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLQlTUiB8PSBzdGF0dXNfRlI7IC8qIDY0Yml0IHJlZ2lzdGVycyAqLwotICAgICAgCi0gICAgICAvKiBFbnN1cmUgdGhhdCBhbnkgaW5zdHJ1Y3Rpb25zIHdpdGggcGVuZGluZyByZWdpc3RlciB1cGRhdGVzIGFyZQotCSBjbGVhcmVkOiAqLwotICAgICAgUEVORElOR19JTlZBTElEQVRFKCk7Ci0gICAgICAKLSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIEZQVSByZWdpc3RlcnMgdG8gdGhlIHVua25vd24gc3RhdGUgKi8KLSAgICAgIGlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UID09IEhBUkRfRkxPQVRJTkdfUE9JTlQpCi0JewotCSAgaW50IHJuOwotCSAgZm9yIChybiA9IDA7IChybiA8IDMyKTsgcm4rKykKLQkgICAgRlBSX1NUQVRFW3JuXSA9IGZtdF91bmludGVycHJldGVkOwotCX0KLSAgICAgIAotICAgIH0KLX0KLQotCi0KLQotLyogRGVzY3JpcHRpb24gZnJvbSBwYWdlIEEtMjYgb2YgdGhlICJNSVBTIElWIEluc3RydWN0aW9uIFNldCIgbWFudWFsIChyZXZpc2lvbiAzLjEpICovCi0vKiBTaWduYWwgYW4gZXhjZXB0aW9uIGNvbmRpdGlvbi4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBleGNlcHRpb24KLSAgIHRoYXQgYWJvcnRzIHRoZSBpbnN0cnVjdGlvbi4gVGhlIGluc3RydWN0aW9uIG9wZXJhdGlvbiBwc2V1ZG9jb2RlCi0gICB3aWxsIG5ldmVyIHNlZSBhIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gY2FsbC4gKi8KLQotdm9pZAotc2lnbmFsX2V4Y2VwdGlvbiAoU0lNX0RFU0Mgc2QsCi0JCSAgc2ltX2NwdSAqY3B1LAotCQkgIGFkZHJlc3Nfd29yZCBjaWEsCi0JCSAgaW50IGV4Y2VwdGlvbiwuLi4pCi17Ci0gIC8qIGludCB2ZWN0b3I7ICovCi0KLSNpZmRlZiBERUJVRwotICBzaW1faW9fcHJpbnRmKHNkLCJEQkc6IFNpZ25hbEV4Y2VwdGlvbiglZCkgUEMgPSAweCVzXG4iLGV4Y2VwdGlvbixwcl9hZGRyKGNpYSkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgLyogRW5zdXJlIHRoYXQgYW55IGFjdGl2ZSBhdG9taWMgcmVhZC9tb2RpZnkvd3JpdGUgb3BlcmF0aW9uIHdpbGwgZmFpbDogKi8KLSAgTExCSVQgPSAwOwotCi0gIC8qIFNhdmUgcmVnaXN0ZXJzIGJlZm9yZSBpbnRlcnJ1cHQgZGlzcGF0Y2hpbmcgKi8KLSNpZmRlZiBTSU1fQ1BVX0VYQ0VQVElPTl9UUklHR0VSCi0gIFNJTV9DUFVfRVhDRVBUSU9OX1RSSUdHRVIoc2QsIGNwdSwgY2lhKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZXhjZXB0aW9uKSB7Ci0KLSAgICBjYXNlIERlYnVnQnJlYWtQb2ludCA6Ci0gICAgICBpZiAoISAoRGVidWcgJiBEZWJ1Z19ETSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoSU5ERUxBWVNMT1QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ0FOQ0VMREVMQVlTTE9UKCk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBEZWJ1ZyB8PSBEZWJ1Z19EQkQ7ICAvKiBzaWduYWxlZCBmcm9tIHdpdGhpbiBpbiBkZWxheSBzbG90ICovCi0gICAgICAgICAgICAgIERFUEMgPSBjaWEgLSA0OyAgICAgIC8qIHJlZmVyZW5jZSB0aGUgYnJhbmNoIGluc3RydWN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEZWJ1ZyAmPSB+RGVidWdfREJEOyAvKiBub3Qgc2lnbmFsZWQgZnJvbSB3aXRoaW4gYSBkZWxheSBzbG90ICovCi0gICAgICAgICAgICAgIERFUEMgPSBjaWE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgIERlYnVnIHw9IERlYnVnX0RNOyAgICAgICAgICAgIC8qIGluIGRlYnVnZ2luZyBtb2RlICovCi0gICAgICAgICAgRGVidWcgfD0gRGVidWdfREJwOyAgICAgICAgICAgLyogcmFpc2luZyBhIERCcCBleGNlcHRpb24gKi8KLSAgICAgICAgICBQQyA9IDB4QkZDMDAyMDA7Ci0gICAgICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChTRCwgQ1BVLCBOVUxMLCBOVUxMX0NJQSk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSZXNlcnZlZEluc3RydWN0aW9uIDoKLSAgICAgewotICAgICAgIHZhX2xpc3QgYXA7Ci0gICAgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uOwotICAgICAgIHZhX3N0YXJ0KGFwLGV4Y2VwdGlvbik7Ci0gICAgICAgaW5zdHJ1Y3Rpb24gPSB2YV9hcmcoYXAsdW5zaWduZWQgaW50KTsKLSAgICAgICB2YV9lbmQoYXApOwotICAgICAgIC8qIFByb3ZpZGUgc2ltcGxlIG1vbml0b3Igc3VwcG9ydCB1c2luZyBSZXNlcnZlZEluc3RydWN0aW9uCi0gICAgICAgICAgZXhjZXB0aW9ucy4gVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgZml4ZWQgdmVjdG9yCi0gICAgICAgICAgZW50cnkgcG9pbnRzIGludG8gdGhlIElEVCBtb25pdG9yIGJ5IGNhdXNpbmcgYSBzaW11bGF0b3IKLSAgICAgICAgICB0cmFwLCBwZXJmb3JtaW5nIHRoZSBtb25pdG9yIG9wZXJhdGlvbiwgYW5kIHJldHVybmluZyB0bwotICAgICAgICAgIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlICRyYSByZWdpc3RlciAoc3RhbmRhcmQgUENTIHJldHVybgotICAgICAgICAgIGFkZHJlc3MpLiBUaGlzIG1lYW5zIHdlIG9ubHkgbmVlZCB0byBwcmUtbG9hZCB0aGUgdmVjdG9yCi0gICAgICAgICAgc3BhY2Ugd2l0aCBzdWl0YWJsZSBpbnN0cnVjdGlvbiB2YWx1ZXMuIEZvciBzeXN0ZW1zIHdlcmUKLSAgICAgICAgICBhY3R1YWwgdHJhcCBpbnN0cnVjdGlvbnMgYXJlIHVzZWQsIHdlIHdvdWxkIG5vdCBuZWVkIHRvCi0gICAgICAgICAgcGVyZm9ybSB0aGlzIG1hZ2ljLiAqLwotICAgICAgIGlmICgoaW5zdHJ1Y3Rpb24gJiBSU1ZEX0lOU1RSVUNUSU9OX01BU0spID09IFJTVkRfSU5TVFJVQ1RJT04pCi0JIHsKLQkgICBzaW1fbW9uaXRvciAoU0QsIENQVSwgY2lhLCAoKGluc3RydWN0aW9uID4+IFJTVkRfSU5TVFJVQ1RJT05fQVJHX1NISUZUKSAmIFJTVkRfSU5TVFJVQ1RJT05fQVJHX01BU0spICk7Ci0JICAgLyogTk9URTogVGhpcyBhc3N1bWVzIHRoYXQgYSBicmFuY2gtYW5kLWxpbmsgc3R5bGUKLQkgICAgICBpbnN0cnVjdGlvbiB3YXMgdXNlZCB0byBlbnRlciB0aGUgdmVjdG9yICh3aGljaCBpcyB0aGUKLQkgICAgICBjYXNlIHdpdGggdGhlIGN1cnJlbnQgSURUIG1vbml0b3IpLiAqLwotCSAgIHNpbV9lbmdpbmVfcmVzdGFydCAoU0QsIENQVSwgTlVMTCwgUkEpOwotCSB9Ci0gICAgICAgLyogTG9vayBmb3IgdGhlIG1pcHMxNiBlbnRyeSBhbmQgZXhpdCBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgICAgIHNpbXVsYXRlIGEgaGFuZGxlciBmb3IgdGhlbS4gICovCi0gICAgICAgZWxzZSBpZiAoKGNpYSAmIDEpICE9IDAKLQkJJiYgKGluc3RydWN0aW9uICYgMHhmODFmKSA9PSAweGU4MDkKLQkJJiYgKGluc3RydWN0aW9uICYgMHgwYzApICE9IDB4MGMwKQotCSB7Ci0JICAgbWlwczE2X2VudHJ5IChTRCwgQ1BVLCBjaWEsIGluc3RydWN0aW9uKTsKLQkgICBzaW1fZW5naW5lX3Jlc3RhcnQgKHNkLCBOVUxMLCBOVUxMLCBOVUxMX0NJQSk7Ci0JIH0KLSAgICAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCB0byBub3JtYWwgZXhjZXB0aW9uIHByb2Nlc3NpbmcgKi8KLSAgICAgICBzaW1faW9fZXByaW50ZihzZCwiUmVzZXJ2ZWRJbnN0cnVjdGlvbiBhdCBQQyA9IDB4JXNcbiIsIHByX2FkZHIgKGNpYSkpOwotICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAvKiBTdG9yZSBleGNlcHRpb24gY29kZSBpbnRvIGN1cnJlbnQgZXhjZXB0aW9uIGlkIHZhcmlhYmxlICh1c2VkCi0gICAgICAgIGJ5IGV4aXQgY29kZSk6ICovCi0KLSAgICAgLyogVE9ETzogSWYgbm90IHNpbXVsYXRpbmcgZXhjZXB0aW9ucyB0aGVuIHN0b3AgdGhlIHNpbXVsYXRvcgotICAgICAgICBleGVjdXRpb24uIEF0IHRoZSBtb21lbnQgd2UgYWx3YXlzIHN0b3AgdGhlIHNpbXVsYXRpb24uICovCi0KLSNpZmRlZiBTVUJUQVJHRVRfUjM5MDAKLSAgICAgIC8qIHVwZGF0ZSBpbnRlcnJ1cHQtcmVsYXRlZCByZWdpc3RlcnMgKi8KLQotICAgICAgLyogaW5zZXJ0IGV4Y2VwdGlvbiBjb2RlIGluIGJpdHMgNjoyICovCi0gICAgICBDQVVTRSA9IExTTUFTS0VEMzIoQ0FVU0UsIDMxLCA3KSB8IExTSU5TRVJURUQzMihleGNlcHRpb24sIDYsIDIpOwotICAgICAgLyogc2hpZnQgSUUvS1UgaGlzdG9yeSBiaXRzIGxlZnQgKi8KLSAgICAgIFNSID0gTFNNQVNLRUQzMihTUiwgMzEsIDQpIHwgTFNJTlNFUlRFRDMyKExTRVhUUkFDVEVEMzIoU1IsIDMsIDApLCA1LCAyKTsKLQotICAgICAgaWYgKFNUQVRFICYgc2ltREVMQVlTTE9UKQotCXsKLQkgIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7Ci0JICBDQVVTRSB8PSBjYXVzZV9CRDsKLQkgIEVQQyA9IChjaWEgLSA0KTsgLyogcmVmZXJlbmNlIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KLQl9Ci0gICAgICBlbHNlCi0JRVBDID0gY2lhOwotCi0gICAgIGlmIChTUiAmIHN0YXR1c19CRVYpCi0gICAgICAgUEMgPSAoc2lnbmVkKTB4QkZDMDAwMDAgKyAweDE4MDsKLSAgICAgZWxzZQotICAgICAgIFBDID0gKHNpZ25lZCkweDgwMDAwMDAwICsgMHgwODA7Ci0jZWxzZQotICAgICAvKiBTZWUgZmlndXJlIDUtMTcgZm9yIGFuIG91dGxpbmUgb2YgdGhlIGNvZGUgYmVsb3cgKi8KLSAgICAgaWYgKCEgKFNSICYgc3RhdHVzX0VYTCkpCi0gICAgICAgewotCSBDQVVTRSA9IChleGNlcHRpb24gPDwgMik7Ci0JIGlmIChTVEFURSAmIHNpbURFTEFZU0xPVCkKLQkgICB7Ci0JICAgICBTVEFURSAmPSB+c2ltREVMQVlTTE9UOwotCSAgICAgQ0FVU0UgfD0gY2F1c2VfQkQ7Ci0JICAgICBFUEMgPSAoY2lhIC0gNCk7IC8qIHJlZmVyZW5jZSB0aGUgYnJhbmNoIGluc3RydWN0aW9uICovCi0JICAgfQotCSBlbHNlCi0JICAgRVBDID0gY2lhOwotCSAvKiBGSVhNRTogVExCIGV0LmFsLiAqLwotCSAvKiB2ZWN0b3IgPSAweDE4MDsgKi8KLSAgICAgICB9Ci0gICAgIGVsc2UKLSAgICAgICB7Ci0JIENBVVNFID0gKGV4Y2VwdGlvbiA8PCAyKTsKLQkgLyogdmVjdG9yID0gMHgxODA7ICovCi0gICAgICAgfQotICAgICBTUiB8PSBzdGF0dXNfRVhMOwotICAgICAvKiBTdG9yZSBleGNlcHRpb24gY29kZSBpbnRvIGN1cnJlbnQgZXhjZXB0aW9uIGlkIHZhcmlhYmxlICh1c2VkCi0gICAgICAgIGJ5IGV4aXQgY29kZSk6ICovCi0KLSAgICAgaWYgKFNSICYgc3RhdHVzX0JFVikKLSAgICAgICBQQyA9IChzaWduZWQpMHhCRkMwMDIwMCArIDB4MTgwOwotICAgICBlbHNlCi0gICAgICAgUEMgPSAoc2lnbmVkKTB4ODAwMDAwMDAgKyAweDE4MDsKLSNlbmRpZgotCi0gICAgIHN3aXRjaCAoKENBVVNFID4+IDIpICYgMHgxRikKLSAgICAgICB7Ci0gICAgICAgY2FzZSBJbnRlcnJ1cHQ6Ci0JIC8qIEludGVycnVwdHMgYXJyaXZlIGR1cmluZyBldmVudCBwcm9jZXNzaW5nLCBubyBuZWVkIHRvCi0gICAgICAgICAgICByZXN0YXJ0ICovCi0JIHJldHVybjsKLQotICAgICAgIGNhc2UgTk1JUmVzZXQ6Ci0JIC8qIERpdHRvICovCi0jaWZkZWYgU1VCVEFSR0VUXzM5MDAKLQkgLyogRXhjZXB0aW9uIHZlY3RvcjogQkVWPTAgQkZDMDAwMDAgLyBCRUY9MSBCRkMwMDAwMCAgKi8KLQkgUEMgPSAoc2lnbmVkKTB4QkZDMDAwMDA7Ci0jZW5kaWYgU1VCVEFSR0VUXzM5MDAKLQkgcmV0dXJuOwotCi0gICAgICAgY2FzZSBUTEJNb2RpZmljYXRpb246Ci0gICAgICAgY2FzZSBUTEJMb2FkOgotICAgICAgIGNhc2UgVExCU3RvcmU6Ci0gICAgICAgY2FzZSBBZGRyZXNzTG9hZDoKLSAgICAgICBjYXNlIEFkZHJlc3NTdG9yZToKLSAgICAgICBjYXNlIEluc3RydWN0aW9uRmV0Y2g6Ci0gICAgICAgY2FzZSBEYXRhUmVmZXJlbmNlOgotCSAvKiBUaGUgZm9sbG93aW5nIGlzIHNvIHRoYXQgdGhlIHNpbXVsYXRvciB3aWxsIGNvbnRpbnVlIGZyb20gdGhlCi0JICAgIGV4Y2VwdGlvbiBoYW5kbGVyIGFkZHJlc3MuICovCi0JIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgUEMsCi0JCQkgIHNpbV9zdG9wcGVkLCBTSU1fU0lHQlVTKTsKLQotICAgICAgIGNhc2UgUmVzZXJ2ZWRJbnN0cnVjdGlvbjoKLSAgICAgICBjYXNlIENvUHJvY2Vzc29yVW51c2FibGU6Ci0JIFBDID0gRVBDOwotCSBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIFBDLAotCQkJICBzaW1fc3RvcHBlZCwgU0lNX1NJR0lMTCk7Ci0KLSAgICAgICBjYXNlIEludGVnZXJPdmVyZmxvdzoKLSAgICAgICBjYXNlIEZQRToKLQkgc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBQQywKLQkJCSAgc2ltX3N0b3BwZWQsIFNJTV9TSUdGUEUpOwotCSAKLSAgICAgICBjYXNlIEJyZWFrUG9pbnQ6Ci0JIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgUEMsIHNpbV9zdG9wcGVkLCBTSU1fU0lHVFJBUCk7Ci0JIGJyZWFrOwotCi0gICAgICAgY2FzZSBTeXN0ZW1DYWxsOgotICAgICAgIGNhc2UgVHJhcDoKLQkgc2ltX2VuZ2luZV9yZXN0YXJ0IChTRCwgQ1BVLCBOVUxMLCBQQyk7Ci0JIGJyZWFrOwotCi0gICAgICAgY2FzZSBXYXRjaDoKLQkgUEMgPSBFUEM7Ci0JIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgUEMsCi0JCQkgIHNpbV9zdG9wcGVkLCBTSU1fU0lHVFJBUCk7Ci0KLSAgICAgICBkZWZhdWx0IDogLyogVW5rbm93biBpbnRlcm5hbCBleGNlcHRpb24gKi8KLQkgUEMgPSBFUEM7Ci0JIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgUEMsCi0JCQkgIHNpbV9zdG9wcGVkLCBTSU1fU0lHQUJSVCk7Ci0KLSAgICAgICB9Ci0KLSAgICBjYXNlIFNpbXVsYXRvckZhdWx0OgotICAgICB7Ci0gICAgICAgdmFfbGlzdCBhcDsKLSAgICAgICBjaGFyICptc2c7Ci0gICAgICAgdmFfc3RhcnQoYXAsZXhjZXB0aW9uKTsKLSAgICAgICBtc2cgPSB2YV9hcmcoYXAsY2hhciAqKTsKLSAgICAgICB2YV9lbmQoYXApOwotICAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIE5VTExfQ0lBLAotCQkJICJGQVRBTDogU2ltdWxhdG9yIGVycm9yIFwiJXNcIlxuIixtc2cpOwotICAgICB9Ci0gICB9Ci0KLSAgcmV0dXJuOwotfQotCi0KLQotI2lmIGRlZmluZWQoV0FSTl9SRVNVTFQpCi0vKiBEZXNjcmlwdGlvbiBmcm9tIHBhZ2UgQS0yNiBvZiB0aGUgIk1JUFMgSVYgSW5zdHJ1Y3Rpb24gU2V0IiBtYW51YWwgKHJldmlzaW9uIDMuMSkgKi8KLS8qIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGlzCi0gICB1bmRlZmluZWQuIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGluc3RydWN0aW9uCi0gICBzdHJlYW0uIEFsbCB0aGF0IGlzIG1lYW50IHRvIGhhcHBlbiBpcyB0aGF0IHRoZSBkZXN0aW5hdGlvbgotICAgcmVnaXN0ZXIgaXMgc2V0IHRvIGFuIHVuZGVmaW5lZCByZXN1bHQuIFRvIGtlZXAgdGhlIHNpbXVsYXRvcgotICAgc2ltcGxlLCB3ZSBqdXN0IGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIsIHNvCi0gICB0aGUgb3ZlcmFsbCByZXN1bHQgd2lsbCBiZSB1bmRlZmluZWQuIElmIGRlc2lyZWQgd2UgY2FuIHN0b3AgdGhlCi0gICBzaW11bGF0b3IgYnkgcmFpc2luZyBhIHBzZXVkby1leGNlcHRpb24uICovCi0jZGVmaW5lIFVuZGVmaW5lZFJlc3VsdCgpIHVuZGVmaW5lZF9yZXN1bHQgKHNkLGNpYSkKLXN0YXRpYyB2b2lkCi11bmRlZmluZWRfcmVzdWx0KHNkLGNpYSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGFkZHJlc3Nfd29yZCBjaWE7Ci17Ci0gIHNpbV9pb19lcHJpbnRmKHNkLCJVbmRlZmluZWRSZXN1bHQ6IFBDID0gMHglc1xuIixwcl9hZGRyKGNpYSkpOwotI2lmIDAgLyogRGlzYWJsZWQgZm9yIHRoZSBtb21lbnQsIHNpbmNlIGl0IGFjdHVhbGx5IGhhcHBlbnMgYSBsb3QgYXQgdGhlIG1vbWVudC4gKi8KLSAgc3RhdGUgfD0gc2ltU1RPUDsKLSNlbmRpZgotICByZXR1cm47Ci19Ci0jZW5kaWYgLyogV0FSTl9SRVNVTFQgKi8KLQotLyotLSBGUFUgc3VwcG9ydCByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBOdW1iZXJzIGFyZSBoZWxkIGluIG5vcm1hbGl6ZWQgZm9ybS4gVGhlIFNJTkdMRSBhbmQgRE9VQkxFIGJpbmFyeQotICAgZm9ybWF0cyBjb25mb3JtIHRvIEFOU0kvSUVFRSBTdGQgNzU0LTE5ODUuICovCi0vKiBTSU5HTEUgcHJlY2lzaW9uIGZsb2F0aW5nOgotICogICAgc2VlZWVlZWVlZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKLSAqICAgICAgcyA9ICAxYml0ICA9IHNpZ24KLSAqICAgICAgZSA9ICA4Yml0cyA9IGV4cG9uZW50Ci0gKiAgICAgIGYgPSAyM2JpdHMgPSBmcmFjdGlvbgotICovCi0vKiBTSU5HTEUgcHJlY2lzaW9uIGZpeGVkOgotICogICAgc2lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkKLSAqICAgICAgcyA9ICAxYml0ICA9IHNpZ24KLSAqICAgICAgaSA9IDMxYml0cyA9IGludGVnZXIKLSAqLwotLyogRE9VQkxFIHByZWNpc2lvbiBmbG9hdGluZzoKLSAqICAgIHNlZWVlZWVlZWVlZWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKLSAqICAgICAgcyA9ICAxYml0ICA9IHNpZ24KLSAqICAgICAgZSA9IDExYml0cyA9IGV4cG9uZW50Ci0gKiAgICAgIGYgPSA1MmJpdHMgPSBmcmFjdGlvbgotICovCi0vKiBET1VCTEUgcHJlY2lzaW9uIGZpeGVkOgotICogICAgc2lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaQotICogICAgICBzID0gIDFiaXQgID0gc2lnbgotICogICAgICBpID0gNjNiaXRzID0gaW50ZWdlcgotICovCi0KLS8qIEV4dHJhY3Qgc2lnbi1iaXQ6ICovCi0jZGVmaW5lIEZQX1Nfcyh2KSAgICAoKCh2KSAmICgodW5zaWduZWQpMSA8PCAzMSkpID8gMSA6IDApCi0jZGVmaW5lIEZQX0Rfcyh2KSAgICAoKCh2KSAmICgodXdvcmQ2NCkxIDw8IDYzKSkgPyAxIDogMCkKLS8qIEV4dHJhY3QgYmlhc2VkIGV4cG9uZW50OiAqLwotI2RlZmluZSBGUF9TX2JlKHYpICAgKCgodikgPj4gMjMpICYgMHhGRikKLSNkZWZpbmUgRlBfRF9iZSh2KSAgICgoKHYpID4+IDUyKSAmIDB4N0ZGKQotLyogRXh0cmFjdCB1bmJpYXNlZCBFeHBvbmVudDogKi8KLSNkZWZpbmUgRlBfU19lKHYpICAgIChGUF9TX2JlKHYpIC0gMHg3RikKLSNkZWZpbmUgRlBfRF9lKHYpICAgIChGUF9EX2JlKHYpIC0gMHgzRkYpCi0vKiBFeHRyYWN0IGNvbXBsZXRlIGZyYWN0aW9uIGZpZWxkOiAqLwotI2RlZmluZSBGUF9TX2YodikgICAgKCh2KSAmIH4oKHVuc2lnbmVkKTB4MUZGIDw8IDIzKSkKLSNkZWZpbmUgRlBfRF9mKHYpICAgICgodikgJiB+KCh1d29yZDY0KTB4RkZGIDw8IDUyKSkKLS8qIEV4dHJhY3QgbnVtYmVyZWQgZnJhY3Rpb24gYml0OiAqLwotI2RlZmluZSBGUF9TX2ZiKGIsdikgKCgodikgJiAoMSA8PCAoMjMgLSAoYikpKSkgPyAxIDogMCkKLSNkZWZpbmUgRlBfRF9mYihiLHYpICgoKHYpICYgKDEgPDwgKDUyIC0gKGIpKSkpID8gMSA6IDApCi0KLS8qIEV4cGxpY2l0IFFOYU4gdmFsdWVzIHVzZWQgd2hlbiB2YWx1ZSByZXF1aXJlZDogKi8KLSNkZWZpbmUgRlBRTmFOX1NJTkdMRSAgICgweDdGQkZGRkZGKQotI2RlZmluZSBGUFFOYU5fV09SRCAgICAgKDB4N0ZGRkZGRkYpCi0jZGVmaW5lIEZQUU5hTl9ET1VCTEUgICAoKCh1d29yZDY0KTB4N0ZGN0ZGRkYgPDwgMzIpIHwgMHhGRkZGRkZGRikKLSNkZWZpbmUgRlBRTmFOX0xPTkcgICAgICgoKHV3b3JkNjQpMHg3RkZGRkZGRiA8PCAzMikgfCAweEZGRkZGRkZGKQotCi0vKiBFeHBsaWNpdCBJbmZpbml0eSB2YWx1ZXMgdXNlZCB3aGVuIHJlcXVpcmVkOiAqLwotI2RlZmluZSBGUElORl9TSU5HTEUgICAgKDB4N0Y4MDAwMDApCi0jZGVmaW5lIEZQSU5GX0RPVUJMRSAgICAoKCh1d29yZDY0KTB4N0ZGMDAwMDAgPDwgMzIpIHwgMHgwMDAwMDAwMCkKLQotI2RlZmluZSBSTU1PREUodikgKCgodikgPT0gRlBfUk1fTkVBUkVTVCkgPyAiUm91bmQiIDogKCgodikgPT0gRlBfUk1fVE9aRVJPKSA/ICJUcnVuYyIgOiAoKCh2KSA9PSBGUF9STV9UT1BJTkYpID8gIkNlaWwiIDogIkZsb29yIikpKQotI2RlZmluZSBET0ZNVCh2KSAgKCgodikgPT0gZm10X3NpbmdsZSkgPyAic2luZ2xlIiA6ICgoKHYpID09IGZtdF9kb3VibGUpID8gImRvdWJsZSIgOiAoKCh2KSA9PSBmbXRfd29yZCkgPyAid29yZCIgOiAoKCh2KSA9PSBmbXRfbG9uZykgPyAibG9uZyIgOiAoKCh2KSA9PSBmbXRfdW5rbm93bikgPyAiPHVua25vd24+IiA6ICgoKHYpID09IGZtdF91bmludGVycHJldGVkKSA/ICI8dW5pbnRlcnByZXRlZD4iIDogKCgodikgPT0gZm10X3VuaW50ZXJwcmV0ZWRfMzIpID8gIjx1bmludGVycHJldGVkXzMyPiIgOiAoKCh2KSA9PSBmbXRfdW5pbnRlcnByZXRlZF82NCkgPyAiPHVuaW50ZXJwcmV0ZWRfNjQ+IiA6ICI8Zm9ybWF0IGVycm9yPiIpKSkpKSkpKQotCi11d29yZDY0Ci12YWx1ZV9mcHIgKFNJTV9ERVNDIHNkLAotCSAgIHNpbV9jcHUgKmNwdSwKLQkgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgIGludCBmcHIsCi0JICAgRlBfZm9ybWF0cyBmbXQpCi17Ci0gIHV3b3JkNjQgdmFsdWUgPSAwOwotICBpbnQgZXJyID0gMDsKLQotICAvKiBUcmVhdCB1bnVzZWQgcmVnaXN0ZXIgdmFsdWVzLCBhcyBmaXhlZC1wb2ludCA2NGJpdCB2YWx1ZXM6ICovCi0gIGlmICgoZm10ID09IGZtdF91bmludGVycHJldGVkKSB8fCAoZm10ID09IGZtdF91bmtub3duKSkKLSNpZiAxCi0gICAvKiBJZiByZXF1ZXN0IHRvIHJlYWQgZGF0YSBhcyAidW5pbnRlcnByZXRlZCIsIHRoZW4gdXNlIHRoZSBjdXJyZW50Ci0gICAgICBlbmNvZGluZzogKi8KLSAgIGZtdCA9IEZQUl9TVEFURVtmcHJdOwotI2Vsc2UKLSAgIGZtdCA9IGZtdF9sb25nOwotI2VuZGlmCi0KLSAgLyogRm9yIHZhbHVlcyBub3QgeWV0IGFjY2Vzc2VkLCBzZXQgdG8gdGhlIGRlc2lyZWQgZm9ybWF0OiAqLwotICBpZiAoRlBSX1NUQVRFW2Zwcl0gPT0gZm10X3VuaW50ZXJwcmV0ZWQpIHsKLSAgICBGUFJfU1RBVEVbZnByXSA9IGZtdDsKLSNpZmRlZiBERUJVRwotICAgIHByaW50ZigiREJHOiBSZWdpc3RlciAlZCB3YXMgZm10X3VuaW50ZXJwcmV0ZWQuIE5vdyAlc1xuIixmcHIsRE9GTVQoZm10KSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgfQotICBpZiAoZm10ICE9IEZQUl9TVEFURVtmcHJdKSB7Ci0gICAgc2ltX2lvX2VwcmludGYoc2QsIkZQUiAlZCAoZm9ybWF0ICVzKSBiZWluZyBhY2Nlc3NlZCB3aXRoIGZvcm1hdCAlcyAtIHNldHRpbmcgdG8gdW5rbm93biAoUEMgPSAweCVzKVxuIixmcHIsRE9GTVQoRlBSX1NUQVRFW2Zwcl0pLERPRk1UKGZtdCkscHJfYWRkcihjaWEpKTsKLSAgICBGUFJfU1RBVEVbZnByXSA9IGZtdF91bmtub3duOwotICB9Ci0KLSAgaWYgKEZQUl9TVEFURVtmcHJdID09IGZtdF91bmtub3duKSB7Ci0gICAvKiBTZXQgUU5hTiB2YWx1ZTogKi8KLSAgIHN3aXRjaCAoZm10KSB7Ci0gICAgY2FzZSBmbXRfc2luZ2xlOgotICAgICB2YWx1ZSA9IEZQUU5hTl9TSU5HTEU7Ci0gICAgIGJyZWFrOwotCi0gICAgY2FzZSBmbXRfZG91YmxlOgotICAgICB2YWx1ZSA9IEZQUU5hTl9ET1VCTEU7Ci0gICAgIGJyZWFrOwotCi0gICAgY2FzZSBmbXRfd29yZDoKLSAgICAgdmFsdWUgPSBGUFFOYU5fV09SRDsKLSAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGZtdF9sb25nOgotICAgICB2YWx1ZSA9IEZQUU5hTl9MT05HOwotICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgIGVyciA9IC0xOwotICAgICBicmVhazsKLSAgIH0KLSAgfSBlbHNlIGlmIChTaXplRkdSKCkgPT0gNjQpIHsKLSAgICBzd2l0Y2ggKGZtdCkgewotICAgICBjYXNlIGZtdF9zaW5nbGU6Ci0gICAgIGNhc2UgZm10X3dvcmQ6Ci0gICAgICB2YWx1ZSA9IChGR1JbZnByXSAmIDB4RkZGRkZGRkYpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZDoKLSAgICAgY2FzZSBmbXRfZG91YmxlOgotICAgICBjYXNlIGZtdF9sb25nOgotICAgICAgdmFsdWUgPSBGR1JbZnByXTsKLSAgICAgIGJyZWFrOwotCi0gICAgIGRlZmF1bHQgOgotICAgICAgZXJyID0gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmbXQpIHsKLSAgICAgY2FzZSBmbXRfc2luZ2xlOgotICAgICBjYXNlIGZtdF93b3JkOgotICAgICAgdmFsdWUgPSAoRkdSW2Zwcl0gJiAweEZGRkZGRkZGKTsKLSAgICAgIGJyZWFrOwotCi0gICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWQ6Ci0gICAgIGNhc2UgZm10X2RvdWJsZToKLSAgICAgY2FzZSBmbXRfbG9uZzoKLSAgICAgIGlmICgoZnByICYgMSkgPT0gMCkgeyAvKiBldmVuIHJlZ2lzdGVycyBvbmx5ICovCi0jaWZkZWYgREVCVUcKLQlwcmludGYoIkRCRzogVmFsdWVGUFI6IEZHUlslZF0gPSAlcywgRkdSWyVkXSA9ICVzXG4iLCAKLQkgICAgICAgZnByKzEsIHByX3V3b3JkNjQoICh1d29yZDY0KSBGR1JbZnByKzFdICksCi0JICAgICAgIGZwciwgcHJfdXdvcmQ2NCggKHV3b3JkNjQpIEZHUltmcHJdICkpOwotI2VuZGlmCi0JdmFsdWUgPSAoKCgodXdvcmQ2NClGR1JbZnByKzFdKSA8PCAzMikgfCAoRkdSW2Zwcl0gJiAweEZGRkZGRkZGKSk7Ci0gICAgICB9IGVsc2UgewotCVNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgZGVmYXVsdCA6Ci0gICAgICBlcnIgPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChlcnIpCi0gICBTaWduYWxFeGNlcHRpb25TaW11bGF0b3JGYXVsdCAoIlVucmVjb2duaXNlZCBGUCBmb3JtYXQgaW4gVmFsdWVGUFIoKSIpOwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFZhbHVlRlBSOiBmcHIgPSAlZCwgZm10ID0gJXMsIHZhbHVlID0gMHglcyA6IFBDID0gMHglcyA6IFNpemVGR1IoKSA9ICVkXG4iLGZwcixET0ZNVChmbXQpLHByX3V3b3JkNjQodmFsdWUpLHByX2FkZHIoY2lhKSxTaXplRkdSKCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKHZhbHVlKTsKLX0KLQotdm9pZAotc3RvcmVfZnByIChTSU1fREVTQyBzZCwKLQkgICBzaW1fY3B1ICpjcHUsCi0JICAgYWRkcmVzc193b3JkIGNpYSwKLQkgICBpbnQgZnByLAotCSAgIEZQX2Zvcm1hdHMgZm10LAotCSAgIHV3b3JkNjQgdmFsdWUpCi17Ci0gIGludCBlcnIgPSAwOwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFN0b3JlRlBSOiBmcHIgPSAlZCwgZm10ID0gJXMsIHZhbHVlID0gMHglcyA6IFBDID0gMHglcyA6IFNpemVGR1IoKSA9ICVkLFxuIixmcHIsRE9GTVQoZm10KSxwcl91d29yZDY0KHZhbHVlKSxwcl9hZGRyKGNpYSksU2l6ZUZHUigpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIGlmIChTaXplRkdSKCkgPT0gNjQpIHsKLSAgICBzd2l0Y2ggKGZtdCkgewotICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZF8zMjoKLQlmbXQgPSBmbXRfdW5pbnRlcnByZXRlZDsKLSAgICAgIGNhc2UgZm10X3NpbmdsZSA6Ci0gICAgICBjYXNlIGZtdF93b3JkIDoKLSAgICAgICBpZiAoU1RBVEVfVkVSQk9TRV9QKFNEKSkKLSAgICAgICAgIHNpbV9pb19lcHJpbnRmIChTRCwgIldhcm5pbmc6IFBDIDB4JXM6IGludGVycC5jIHN0b3JlX2ZwciBERUFEQ09ERVxuIiwKLQkgICBwcl9hZGRyKGNpYSkpOwotICAgICAgIEZHUltmcHJdID0gKCgodXdvcmQ2NCkweERFQURDMERFIDw8IDMyKSB8ICh2YWx1ZSAmIDB4RkZGRkZGRkYpKTsKLSAgICAgICBGUFJfU1RBVEVbZnByXSA9IGZtdDsKLSAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZF82NDoKLQlmbXQgPSBmbXRfdW5pbnRlcnByZXRlZDsKLSAgICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICBjYXNlIGZtdF9kb3VibGUgOgotICAgICAgY2FzZSBmbXRfbG9uZyA6Ci0gICAgICAgRkdSW2Zwcl0gPSB2YWx1ZTsKLSAgICAgICBGUFJfU1RBVEVbZnByXSA9IGZtdDsKLSAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgRlBSX1NUQVRFW2Zwcl0gPSBmbXRfdW5rbm93bjsKLSAgICAgICBlcnIgPSAtMTsKLSAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmbXQpIHsKLSAgICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWRfMzI6Ci0JZm10ID0gZm10X3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICBjYXNlIGZtdF9zaW5nbGUgOgotICAgICAgY2FzZSBmbXRfd29yZCA6Ci0gICAgICAgRkdSW2Zwcl0gPSAodmFsdWUgJiAweEZGRkZGRkZGKTsKLSAgICAgICBGUFJfU1RBVEVbZnByXSA9IGZtdDsKLSAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZF82NDoKLQlmbXQgPSBmbXRfdW5pbnRlcnByZXRlZDsKLSAgICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICBjYXNlIGZtdF9kb3VibGUgOgotICAgICAgY2FzZSBmbXRfbG9uZyA6Ci0JaWYgKChmcHIgJiAxKSA9PSAwKSB7IC8qIGV2ZW4gcmVnaXN0ZXIgbnVtYmVyIG9ubHkgKi8KLQkgIEZHUltmcHIrMV0gPSAodmFsdWUgPj4gMzIpOwotCSAgRkdSW2Zwcl0gPSAodmFsdWUgJiAweEZGRkZGRkZGKTsKLQkgIEZQUl9TVEFURVtmcHIgKyAxXSA9IGZtdDsKLQkgIEZQUl9TVEFURVtmcHJdID0gZm10OwotCX0gZWxzZSB7Ci0JICBGUFJfU1RBVEVbZnByXSA9IGZtdF91bmtub3duOwotCSAgRlBSX1NUQVRFW2ZwciArIDFdID0gZm10X3Vua25vd247Ci0JICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbiwwKTsKLQl9Ci0gICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgIEZQUl9TVEFURVtmcHJdID0gZm10X3Vua25vd247Ci0gICAgICAgZXJyID0gLTE7Ci0gICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0jaWYgZGVmaW5lZChXQVJOX1JFU1VMVCkKLSAgZWxzZQotICAgIFVuZGVmaW5lZFJlc3VsdCgpOwotI2VuZGlmIC8qIFdBUk5fUkVTVUxUICovCi0KLSAgaWYgKGVycikKLSAgIFNpZ25hbEV4Y2VwdGlvblNpbXVsYXRvckZhdWx0ICgiVW5yZWNvZ25pc2VkIEZQIGZvcm1hdCBpbiBTdG9yZUZQUigpIik7Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogU3RvcmVGUFI6IGZwclslZF0gPSAweCVzIChmb3JtYXQgJXMpXG4iLGZwcixwcl91d29yZDY0KEZHUltmcHJdKSxET0ZNVChmbXQpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybjsKLX0KLQotaW50Ci1OYU4ob3AsZm10KQotICAgICB1d29yZDY0IG9wOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIGludCBib29sZWFuID0gMDsKLSAgc3dpdGNoIChmbXQpIHsKLSAgIGNhc2UgZm10X3NpbmdsZToKLSAgIGNhc2UgZm10X3dvcmQ6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3A7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKLSAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX25hbiAoJndvcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICBjYXNlIGZtdF9sb25nOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wOwotICAgICAgc2ltX2ZwdV82NHRvICgmd29wLCBvcCk7Ci0gICAgICBib29sZWFuID0gc2ltX2ZwdV9pc19uYW4gKCZ3b3ApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgZGVmYXVsdDoKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICBhYm9ydCAoKTsKLSAgfQotCi0jaWZkZWYgREVCVUcKLXByaW50ZigiREJHOiBOYU46IHJldHVybmluZyAlZCBmb3IgMHglcyAoZm9ybWF0ID0gJXMpXG4iLGJvb2xlYW4scHJfYWRkcihvcCksRE9GTVQoZm10KSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICByZXR1cm4oYm9vbGVhbik7Ci19Ci0KLWludAotSW5maW5pdHkob3AsZm10KQotICAgICB1d29yZDY0IG9wOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIGludCBib29sZWFuID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBJbmZpbml0eTogZm9ybWF0ICVzIDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wLCBvcCk7Ci0gICAgICBib29sZWFuID0gc2ltX2ZwdV9pc19pbmZpbml0eSAoJndvcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3A7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AsIG9wKTsKLSAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX2luZmluaXR5ICgmd29wKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgcHJpbnRmKCJEQkc6IFRPRE86IHVucmVjb2duaXNlZCBmb3JtYXQgKCVzKSBmb3IgSW5maW5pdHkgY2hlY2tcbiIsRE9GTVQoZm10KSk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBJbmZpbml0eTogcmV0dXJuaW5nICVkIGZvciAweCVzIChmb3JtYXQgPSAlcylcbiIsYm9vbGVhbixwcl9hZGRyKG9wKSxET0ZNVChmbXQpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybihib29sZWFuKTsKLX0KLQotaW50Ci1MZXNzKG9wMSxvcDIsZm10KQotICAgICB1d29yZDY0IG9wMTsKLSAgICAgdXdvcmQ2NCBvcDI7Ci0gICAgIEZQX2Zvcm1hdHMgZm10OyAKLXsKLSAgaW50IGJvb2xlYW4gPSAwOwotCi0gIC8qIEFyZ3VtZW50IGNoZWNraW5nIGFscmVhZHkgcGVyZm9ybWVkIGJ5IHRoZSBGUENPTVBBUkUgY29kZSAqLwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IExlc3M6ICVzOiBvcDEgPSAweCVzIDogb3AyID0gMHglc1xuIixET0ZNVChmbXQpLHByX2FkZHIob3AxKSxwcl9hZGRyKG9wMikpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLwotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wMTsKLSAgICAgIHNpbV9mcHUgd29wMjsKLSAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDEsIG9wMSk7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AyLCBvcDIpOwotICAgICAgYm9vbGVhbiA9IHNpbV9mcHVfaXNfbHQgKCZ3b3AxLCAmd29wMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3AxOwotICAgICAgc2ltX2ZwdSB3b3AyOwotICAgICAgc2ltX2ZwdV82NHRvICgmd29wMSwgb3AxKTsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7Ci0gICAgICBib29sZWFuID0gc2ltX2ZwdV9pc19sdCAoJndvcDEsICZ3b3AyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBMZXNzOiByZXR1cm5pbmcgJWQgKGZvcm1hdCA9ICVzKVxuIixib29sZWFuLERPRk1UKGZtdCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKGJvb2xlYW4pOwotfQotCi1pbnQKLUVxdWFsKG9wMSxvcDIsZm10KQotICAgICB1d29yZDY0IG9wMTsKLSAgICAgdXdvcmQ2NCBvcDI7Ci0gICAgIEZQX2Zvcm1hdHMgZm10OyAKLXsKLSAgaW50IGJvb2xlYW4gPSAwOwotCi0gIC8qIEFyZ3VtZW50IGNoZWNraW5nIGFscmVhZHkgcGVyZm9ybWVkIGJ5IHRoZSBGUENPTVBBUkUgY29kZSAqLwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IEVxdWFsOiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpIHsKLSAgIGNhc2UgZm10X3NpbmdsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDE7Ci0gICAgICBzaW1fZnB1IHdvcDI7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AxLCBvcDEpOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKLSAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX2VxICgmd29wMSwgJndvcDIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgY2FzZSBmbXRfZG91YmxlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wMTsKLSAgICAgIHNpbV9mcHUgd29wMjsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AyLCBvcDIpOwotICAgICAgYm9vbGVhbiA9IHNpbV9mcHVfaXNfZXEgKCZ3b3AxLCAmd29wMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBkZWZhdWx0OgotICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgIGFib3J0ICgpOwotICB9Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogRXF1YWw6IHJldHVybmluZyAlZCAoZm9ybWF0ID0gJXMpXG4iLGJvb2xlYW4sRE9GTVQoZm10KSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICByZXR1cm4oYm9vbGVhbik7Ci19Ci0KLXV3b3JkNjQKLUFic29sdXRlVmFsdWUob3AsZm10KQotICAgICB1d29yZDY0IG9wOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIHV3b3JkNjQgcmVzdWx0ID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBBYnNvbHV0ZVZhbHVlOiAlczogb3AgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLwotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wOwotICAgICAgdW5zaWduZWQzMiBhbnM7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKLSAgICAgIHNpbV9mcHVfYWJzICgmd29wLCAmd29wKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJmFucywgJndvcCk7Ci0gICAgICByZXN1bHQgPSBhbnM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3A7Ci0gICAgICB1bnNpZ25lZDY0IGFuczsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOwotICAgICAgc2ltX2ZwdV9hYnMgKCZ3b3AsICZ3b3ApOwotICAgICAgc2ltX2ZwdV90bzY0ICgmYW5zLCAmd29wKTsKLSAgICAgIHJlc3VsdCA9IGFuczsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4ocmVzdWx0KTsKLX0KLQotdXdvcmQ2NAotTmVnYXRlKG9wLGZtdCkKLSAgICAgdXdvcmQ2NCBvcDsKLSAgICAgRlBfZm9ybWF0cyBmbXQ7IAotewotICB1d29yZDY0IHJlc3VsdCA9IDA7Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogTmVnYXRlOiAlczogb3AgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLwotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wOwotICAgICAgdW5zaWduZWQzMiBhbnM7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKLSAgICAgIHNpbV9mcHVfbmVnICgmd29wLCAmd29wKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJmFucywgJndvcCk7Ci0gICAgICByZXN1bHQgPSBhbnM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3A7Ci0gICAgICB1bnNpZ25lZDY0IGFuczsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOwotICAgICAgc2ltX2ZwdV9uZWcgKCZ3b3AsICZ3b3ApOwotICAgICAgc2ltX2ZwdV90bzY0ICgmYW5zLCAmd29wKTsKLSAgICAgIHJlc3VsdCA9IGFuczsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4ocmVzdWx0KTsKLX0KLQotdXdvcmQ2NAotQWRkKG9wMSxvcDIsZm10KQotICAgICB1d29yZDY0IG9wMTsKLSAgICAgdXdvcmQ2NCBvcDI7Ci0gICAgIEZQX2Zvcm1hdHMgZm10OyAKLXsKLSAgdXdvcmQ2NCByZXN1bHQgPSAwOwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IEFkZDogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCi0gICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpIHsKLSAgIGNhc2UgZm10X3NpbmdsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDE7Ci0gICAgICBzaW1fZnB1IHdvcDI7Ci0gICAgICBzaW1fZnB1IGFuczsKLSAgICAgIHVuc2lnbmVkMzIgcmVzOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKLSAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDIsIG9wMik7Ci0gICAgICBzaW1fZnB1X2FkZCAoJmFucywgJndvcDEsICZ3b3AyKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0gICAgICByZXN1bHQgPSByZXM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3AxOwotICAgICAgc2ltX2ZwdSB3b3AyOwotICAgICAgc2ltX2ZwdSBhbnM7Ci0gICAgICB1bnNpZ25lZDY0IHJlczsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AyLCBvcDIpOwotICAgICAgc2ltX2ZwdV9hZGQgKCZhbnMsICZ3b3AxLCAmd29wMik7Ci0gICAgICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotICAgICAgcmVzdWx0ID0gcmVzOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgZGVmYXVsdDoKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICBhYm9ydCAoKTsKLSAgfQotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IEFkZDogcmV0dXJuaW5nIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixwcl9hZGRyKHJlc3VsdCksRE9GTVQoZm10KSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICByZXR1cm4ocmVzdWx0KTsKLX0KLQotdXdvcmQ2NAotU3ViKG9wMSxvcDIsZm10KQotICAgICB1d29yZDY0IG9wMTsKLSAgICAgdXdvcmQ2NCBvcDI7Ci0gICAgIEZQX2Zvcm1hdHMgZm10OyAKLXsKLSAgdXdvcmQ2NCByZXN1bHQgPSAwOwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFN1YjogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCi0gICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpIHsKLSAgIGNhc2UgZm10X3NpbmdsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDE7Ci0gICAgICBzaW1fZnB1IHdvcDI7Ci0gICAgICBzaW1fZnB1IGFuczsKLSAgICAgIHVuc2lnbmVkMzIgcmVzOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKLSAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDIsIG9wMik7Ci0gICAgICBzaW1fZnB1X3N1YiAoJmFucywgJndvcDEsICZ3b3AyKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0gICAgICByZXN1bHQgPSByZXM7Ci0gICAgfQotICAgIGJyZWFrOwotICAgY2FzZSBmbXRfZG91YmxlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wMTsKLSAgICAgIHNpbV9mcHUgd29wMjsKLSAgICAgIHNpbV9mcHUgYW5zOwotICAgICAgdW5zaWduZWQ2NCByZXM7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AxLCBvcDEpOwotICAgICAgc2ltX2ZwdV82NHRvICgmd29wMiwgb3AyKTsKLSAgICAgIHNpbV9mcHVfc3ViICgmYW5zLCAmd29wMSwgJndvcDIpOwotICAgICAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKLSAgICAgIHJlc3VsdCA9IHJlczsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgIGFib3J0ICgpOwotICB9Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogU3ViOiByZXR1cm5pbmcgMHglcyAoZm9ybWF0ID0gJXMpXG4iLHByX2FkZHIocmVzdWx0KSxET0ZNVChmbXQpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybihyZXN1bHQpOwotfQotCi11d29yZDY0Ci1NdWx0aXBseShvcDEsb3AyLGZtdCkKLSAgICAgdXdvcmQ2NCBvcDE7Ci0gICAgIHV3b3JkNjQgb3AyOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIHV3b3JkNjQgcmVzdWx0ID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBNdWx0aXBseTogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCi0gICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpIHsKLSAgIGNhc2UgZm10X3NpbmdsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDE7Ci0gICAgICBzaW1fZnB1IHdvcDI7Ci0gICAgICBzaW1fZnB1IGFuczsKLSAgICAgIHVuc2lnbmVkMzIgcmVzOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKLSAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDIsIG9wMik7Ci0gICAgICBzaW1fZnB1X211bCAoJmFucywgJndvcDEsICZ3b3AyKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJnJlcywgJmFucyk7Ci0gICAgICByZXN1bHQgPSByZXM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3AxOwotICAgICAgc2ltX2ZwdSB3b3AyOwotICAgICAgc2ltX2ZwdSBhbnM7Ci0gICAgICB1bnNpZ25lZDY0IHJlczsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AyLCBvcDIpOwotICAgICAgc2ltX2ZwdV9tdWwgKCZhbnMsICZ3b3AxLCAmd29wMik7Ci0gICAgICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotICAgICAgcmVzdWx0ID0gcmVzOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgZGVmYXVsdDoKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICBhYm9ydCAoKTsKLSAgfQotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IE11bHRpcGx5OiByZXR1cm5pbmcgMHglcyAoZm9ybWF0ID0gJXMpXG4iLHByX2FkZHIocmVzdWx0KSxET0ZNVChmbXQpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybihyZXN1bHQpOwotfQotCi11d29yZDY0Ci1EaXZpZGUob3AxLG9wMixmbXQpCi0gICAgIHV3b3JkNjQgb3AxOwotICAgICB1d29yZDY0IG9wMjsKLSAgICAgRlBfZm9ybWF0cyBmbXQ7IAotewotICB1d29yZDY0IHJlc3VsdCA9IDA7Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogRGl2aWRlOiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKLSAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCi0KLSAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLwotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wMTsKLSAgICAgIHNpbV9mcHUgd29wMjsKLSAgICAgIHNpbV9mcHUgYW5zOwotICAgICAgdW5zaWduZWQzMiByZXM7Ci0gICAgICBzaW1fZnB1XzMydG8gKCZ3b3AxLCBvcDEpOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKLSAgICAgIHNpbV9mcHVfZGl2ICgmYW5zLCAmd29wMSwgJndvcDIpOwotICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLSAgICAgIHJlc3VsdCA9IHJlczsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGNhc2UgZm10X2RvdWJsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDE7Ci0gICAgICBzaW1fZnB1IHdvcDI7Ci0gICAgICBzaW1fZnB1IGFuczsKLSAgICAgIHVuc2lnbmVkNjQgcmVzOwotICAgICAgc2ltX2ZwdV82NHRvICgmd29wMSwgb3AxKTsKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7Ci0gICAgICBzaW1fZnB1X2RpdiAoJmFucywgJndvcDEsICZ3b3AyKTsKLSAgICAgIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7Ci0gICAgICByZXN1bHQgPSByZXM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBkZWZhdWx0OgotICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgIGFib3J0ICgpOwotICB9Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogRGl2aWRlOiByZXR1cm5pbmcgMHglcyAoZm9ybWF0ID0gJXMpXG4iLHByX2FkZHIocmVzdWx0KSxET0ZNVChmbXQpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIHJldHVybihyZXN1bHQpOwotfQotCi11d29yZDY0IFVOVVNFRAotUmVjaXAob3AsZm10KQotICAgICB1d29yZDY0IG9wOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIHV3b3JkNjQgcmVzdWx0ID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBSZWNpcDogJXM6IG9wID0gMHglc1xuIixET0ZNVChmbXQpLHByX2FkZHIob3ApKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKLSAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCi0KLSAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLwotICBzd2l0Y2ggKGZtdCkgewotICAgY2FzZSBmbXRfc2luZ2xlOgotICAgIHsKLSAgICAgIHNpbV9mcHUgd29wOwotICAgICAgc2ltX2ZwdSBhbnM7Ci0gICAgICB1bnNpZ25lZDMyIHJlczsKLSAgICAgIHNpbV9mcHVfMzJ0byAoJndvcCwgb3ApOwotICAgICAgc2ltX2ZwdV9pbnYgKCZhbnMsICZ3b3ApOwotICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLSAgICAgIHJlc3VsdCA9IHJlczsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGNhc2UgZm10X2RvdWJsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDsKLSAgICAgIHNpbV9mcHUgYW5zOwotICAgICAgdW5zaWduZWQ2NCByZXM7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AsIG9wKTsKLSAgICAgIHNpbV9mcHVfaW52ICgmYW5zLCAmd29wKTsKLSAgICAgIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7Ci0gICAgICByZXN1bHQgPSByZXM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICBkZWZhdWx0OgotICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgIGFib3J0ICgpOwotICB9Ci0KLSNpZmRlZiBERUJVRwotICBwcmludGYoIkRCRzogUmVjaXA6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLXV3b3JkNjQKLVNxdWFyZVJvb3Qob3AsZm10KQotICAgICB1d29yZDY0IG9wOwotICAgICBGUF9mb3JtYXRzIGZtdDsgCi17Ci0gIHV3b3JkNjQgcmVzdWx0ID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBTcXVhcmVSb290OiAlczogb3AgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgLyogVGhlIHJlZ2lzdGVycyBtdXN0IHNwZWNpZnkgRlBScyB2YWxpZCBmb3Igb3BlcmFuZHMgb2YgdHlwZQotICAgICAiZm10Ii4gSWYgdGhleSBhcmUgbm90IHZhbGlkLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KLQotICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCi0gIHN3aXRjaCAoZm10KSB7Ci0gICBjYXNlIGZtdF9zaW5nbGU6Ci0gICAgewotICAgICAgc2ltX2ZwdSB3b3A7Ci0gICAgICBzaW1fZnB1IGFuczsKLSAgICAgIHVuc2lnbmVkMzIgcmVzOwotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wLCBvcCk7Ci0gICAgICBzaW1fZnB1X3NxcnQgKCZhbnMsICZ3b3ApOwotICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKLSAgICAgIHJlc3VsdCA9IHJlczsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgIGNhc2UgZm10X2RvdWJsZToKLSAgICB7Ci0gICAgICBzaW1fZnB1IHdvcDsKLSAgICAgIHNpbV9mcHUgYW5zOwotICAgICAgdW5zaWduZWQ2NCByZXM7Ci0gICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AsIG9wKTsKLSAgICAgIHNpbV9mcHVfc3FydCAoJmFucywgJndvcCk7Ci0gICAgICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOwotICAgICAgcmVzdWx0ID0gcmVzOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgZGVmYXVsdDoKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICBhYm9ydCAoKTsKLSAgfQotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFNxdWFyZVJvb3Q6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLSNpZiAwCi11d29yZDY0Ci1NYXggKHV3b3JkNjQgb3AxLAotICAgICB1d29yZDY0IG9wMiwKLSAgICAgRlBfZm9ybWF0cyBmbXQpCi17Ci0gIGludCBjbXA7Ci0gIHVuc2lnbmVkNjQgcmVzdWx0OwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IE1heDogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCi0gICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpCi0gICAgewotICAgIGNhc2UgZm10X3NpbmdsZToKLSAgICAgIHsKLQlzaW1fZnB1IHdvcDE7Ci0Jc2ltX2ZwdSB3b3AyOwotCXNpbV9mcHVfMzJ0byAoJndvcDEsIG9wMSk7Ci0Jc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKLQljbXAgPSBzaW1fZnB1X2NtcCAoJndvcDEsICZ3b3AyKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgICB7Ci0Jc2ltX2ZwdSB3b3AxOwotCXNpbV9mcHUgd29wMjsKLQlzaW1fZnB1XzY0dG8gKCZ3b3AxLCBvcDEpOwotCXNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7Ci0JY21wID0gc2ltX2ZwdV9jbXAgKCZ3b3AxLCAmd29wMik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgc3dpdGNoIChjbXApCi0gICAgewotICAgIGNhc2UgU0lNX0ZQVV9JU19TTkFOOgotICAgIGNhc2UgU0lNX0ZQVV9JU19RTkFOOgotICAgICAgcmVzdWx0ID0gb3AxOwotICAgIGNhc2UgU0lNX0ZQVV9JU19OSU5GOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OTlVNQkVSOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OREVOT1JNOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OWkVSTzoKLSAgICAgIHJlc3VsdCA9IG9wMjsgLyogb3AxIC0gb3AyIDwgMCAqLwotICAgIGNhc2UgU0lNX0ZQVV9JU19QSU5GOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QTlVNQkVSOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QREVOT1JNOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QWkVSTzoKLSAgICAgIHJlc3VsdCA9IG9wMTsgLyogb3AxIC0gb3AyID4gMCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBNYXg6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKHJlc3VsdCk7Ci19Ci0jZW5kaWYgCi0KLSNpZiAwCi11d29yZDY0Ci1NaW4gKHV3b3JkNjQgb3AxLAotICAgICB1d29yZDY0IG9wMiwKLSAgICAgRlBfZm9ybWF0cyBmbXQpCi17Ci0gIGludCBjbXA7Ci0gIHVuc2lnbmVkNjQgcmVzdWx0OwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IE1pbjogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCi0gICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLwotCi0gIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KLSAgc3dpdGNoIChmbXQpCi0gICAgewotICAgIGNhc2UgZm10X3NpbmdsZToKLSAgICAgIHsKLQlzaW1fZnB1IHdvcDE7Ci0Jc2ltX2ZwdSB3b3AyOwotCXNpbV9mcHVfMzJ0byAoJndvcDEsIG9wMSk7Ci0Jc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKLQljbXAgPSBzaW1fZnB1X2NtcCAoJndvcDEsICZ3b3AyKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgICB7Ci0Jc2ltX2ZwdSB3b3AxOwotCXNpbV9mcHUgd29wMjsKLQlzaW1fZnB1XzY0dG8gKCZ3b3AxLCBvcDEpOwotCXNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7Ci0JY21wID0gc2ltX2ZwdV9jbXAgKCZ3b3AxLCAmd29wMik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgc3dpdGNoIChjbXApCi0gICAgewotICAgIGNhc2UgU0lNX0ZQVV9JU19TTkFOOgotICAgIGNhc2UgU0lNX0ZQVV9JU19RTkFOOgotICAgICAgcmVzdWx0ID0gb3AxOwotICAgIGNhc2UgU0lNX0ZQVV9JU19OSU5GOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OTlVNQkVSOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OREVOT1JNOgotICAgIGNhc2UgU0lNX0ZQVV9JU19OWkVSTzoKLSAgICAgIHJlc3VsdCA9IG9wMTsgLyogb3AxIC0gb3AyIDwgMCAqLwotICAgIGNhc2UgU0lNX0ZQVV9JU19QSU5GOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QTlVNQkVSOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QREVOT1JNOgotICAgIGNhc2UgU0lNX0ZQVV9JU19QWkVSTzoKLSAgICAgIHJlc3VsdCA9IG9wMjsgLyogb3AxIC0gb3AyID4gMCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBNaW46IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgcmV0dXJuKHJlc3VsdCk7Ci19Ci0jZW5kaWYKLQotdXdvcmQ2NAotY29udmVydCAoU0lNX0RFU0Mgc2QsCi0JIHNpbV9jcHUgKmNwdSwKLQkgYWRkcmVzc193b3JkIGNpYSwKLQkgaW50IHJtLAotCSB1d29yZDY0IG9wLAotCSBGUF9mb3JtYXRzIGZyb20sCi0JIEZQX2Zvcm1hdHMgdG8pCi17Ci0gIHNpbV9mcHUgd29wOwotICBzaW1fZnB1X3JvdW5kIHJvdW5kOwotICB1bnNpZ25lZDMyIHJlc3VsdDMyOwotICB1bnNpZ25lZDY0IHJlc3VsdDY0OwotCi0jaWZkZWYgREVCVUcKLSNpZiAwIC8qIEZJWE1FOiBkb2Vzbid0IGNvbXBpbGUgKi8KLSAgcHJpbnRmKCJEQkc6IENvbnZlcnQ6IG1vZGUgJXMgOiBvcCAweCVzIDogZnJvbSAlcyA6IHRvICVzIDogKFBDID0gMHglcylcbiIsUk1NT0RFKHJtKSxwcl9hZGRyKG9wKSxET0ZNVChmcm9tKSxET0ZNVCh0bykscHJfYWRkcihJUEMpKTsKLSNlbmRpZgotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgc3dpdGNoIChybSkKLSAgICB7Ci0gICAgY2FzZSBGUF9STV9ORUFSRVNUOgotICAgICAgLyogUm91bmQgcmVzdWx0IHRvIG5lYXJlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZS4gV2hlbiB0d28KLQkgcmVwcmVzZW50YWJsZSB2YWx1ZXMgYXJlIGVxdWFsbHkgbmVhciwgcm91bmQgdG8gdGhlIHZhbHVlCi0JIHRoYXQgaGFzIGEgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHplcm8gKGkuZS4gaXMgZXZlbikuICovCi0gICAgICByb3VuZCA9IHNpbV9mcHVfcm91bmRfbmVhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfUk1fVE9aRVJPOgotICAgICAgLyogUm91bmQgcmVzdWx0IHRvIHRoZSB2YWx1ZSBjbG9zZXN0IHRvLCBhbmQgbm90IGdyZWF0ZXIgaW4KLQkgbWFnbml0dWRlIHRoYW4sIHRoZSByZXN1bHQuICovCi0gICAgICByb3VuZCA9IHNpbV9mcHVfcm91bmRfemVybzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfUk1fVE9QSU5GOgotICAgICAgLyogUm91bmQgcmVzdWx0IHRvIHRoZSB2YWx1ZSBjbG9zZXN0IHRvLCBhbmQgbm90IGxlc3MgdGhhbiwKLQkgdGhlIHJlc3VsdC4gKi8KLSAgICAgIHJvdW5kID0gc2ltX2ZwdV9yb3VuZF91cDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBGUF9STV9UT01JTkY6Ci0gICAgICAvKiBSb3VuZCByZXN1bHQgdG8gdGhlIHZhbHVlIGNsb3Nlc3QgdG8sIGFuZCBub3QgZ3JlYXRlciB0aGFuLAotCSB0aGUgcmVzdWx0LiAqLwotICAgICAgcm91bmQgPSBzaW1fZnB1X3JvdW5kX2Rvd247Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcm91bmQgPSAwOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIAotICAvKiBDb252ZXJ0IHRoZSBpbnB1dCB0byBzaW1fZnB1IGludGVybmFsIGZvcm1hdCAqLwotICBzd2l0Y2ggKGZyb20pCi0gICAgewotICAgIGNhc2UgZm10X2RvdWJsZToKLSAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmbXRfc2luZ2xlOgotICAgICAgc2ltX2ZwdV8zMnRvICgmd29wLCBvcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZtdF93b3JkOgotICAgICAgc2ltX2ZwdV9pMzJ0byAoJndvcCwgb3AsIHJvdW5kKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZm10X2xvbmc6Ci0gICAgICBzaW1fZnB1X2k2NHRvICgmd29wLCBvcCwgcm91bmQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgc2ltX2ZwdSBmb3JtYXQgaW50byB0aGUgb3V0cHV0ICovCi0gIC8qIFRoZSB2YWx1ZSBXT1AgaXMgY29udmVydGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQsIHJvdW5kaW5nCi0gICAgIHVzaW5nIG1vZGUgUk0uIFdoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIGEgZml4ZWQtcG9pbnQgZm9ybWF0LCB0aGVuCi0gICAgIGEgc291cmNlIHZhbHVlIG9mIEluZmluaXR5LCBOYU4gb3Igb25lIHdoaWNoIHdvdWxkIHJvdW5kIHRvIGFuCi0gICAgIGludGVnZXIgb3V0c2lkZSB0aGUgZml4ZWQgcG9pbnQgcmFuZ2UgdGhlbiBhbiBJRUVFIEludmFsaWQKLSAgICAgT3BlcmF0aW9uIGNvbmRpdGlvbiBpcyByYWlzZWQuICovCi0gIHN3aXRjaCAodG8pCi0gICAgewotICAgIGNhc2UgZm10X3NpbmdsZToKLSAgICAgIHNpbV9mcHVfcm91bmRfMzIgKCZ3b3AsIHJvdW5kLCAwKTsKLSAgICAgIHNpbV9mcHVfdG8zMiAoJnJlc3VsdDMyLCAmd29wKTsKLSAgICAgIHJlc3VsdDY0ID0gcmVzdWx0MzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZtdF9kb3VibGU6Ci0gICAgICBzaW1fZnB1X3JvdW5kXzY0ICgmd29wLCByb3VuZCwgMCk7Ci0gICAgICBzaW1fZnB1X3RvNjQgKCZyZXN1bHQ2NCwgJndvcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZtdF93b3JkOgotICAgICAgc2ltX2ZwdV90bzMyaSAoJnJlc3VsdDMyLCAmd29wLCByb3VuZCk7Ci0gICAgICByZXN1bHQ2NCA9IHJlc3VsdDMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmbXRfbG9uZzoKLSAgICAgIHNpbV9mcHVfdG82NGkgKCZyZXN1bHQ2NCwgJndvcCwgcm91bmQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJlc3VsdDY0ID0gMDsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotIAotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBDb252ZXJ0OiByZXR1cm5pbmcgMHglcyAodG8gZm9ybWF0ID0gJXMpXG4iLHByX2FkZHIocmVzdWx0NjQpLERPRk1UKHRvKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICByZXR1cm4ocmVzdWx0NjQpOwotfQotCi0KLS8qLS0gY28tcHJvY2Vzc29yIHN1cHBvcnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBVTlVTRUQKLUNvUHJvY1ByZXNlbnQodW5zaWduZWQgaW50IGNvcHJvY19udW1iZXIpCi17Ci0gIC8qIFJldHVybiBUUlVFIGlmIHNpbXVsYXRvciBwcm92aWRlcyBhIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY28tcHJvY2Vzc29yIG51bWJlciAqLwotICByZXR1cm4oMCk7Ci19Ci0KLXZvaWQKLWNvcF9sdyAoU0lNX0RFU0Mgc2QsCi0Jc2ltX2NwdSAqY3B1LAotCWFkZHJlc3Nfd29yZCBjaWEsCi0JaW50IGNvcHJvY19udW0sCi0JaW50IGNvcHJvY19yZWcsCi0JdW5zaWduZWQgaW50IG1lbXdvcmQpCi17Ci0gIHN3aXRjaCAoY29wcm9jX251bSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgPT0gSEFSRF9GTE9BVElOR19QT0lOVCkKLQl7Ci0jaWZkZWYgREVCVUcKLQkgIHByaW50ZigiREJHOiBDT1BfTFc6IG1lbXdvcmQgPSAweCUwOFggKHV3b3JkNjQpbWVtd29yZCA9IDB4JXNcbiIsbWVtd29yZCxwcl9hZGRyKG1lbXdvcmQpKTsKLSNlbmRpZgotCSAgU3RvcmVGUFIoY29wcm9jX3JlZyxmbXRfd29yZCwodXdvcmQ2NCltZW13b3JkKTsKLQkgIEZQUl9TVEFURVtjb3Byb2NfcmVnXSA9IGZtdF91bmludGVycHJldGVkOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgZGVmYXVsdDoKLSNpZiAwIC8qIHRoaXMgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBjb25maWd1cmF0aW9uIG9wdGlvbiAqLwotICAgICAgc2ltX2lvX3ByaW50ZihzZCwiQ09QX0xXKCVkLCVkLDB4JTA4WCkgYXQgUEMgPSAweCVzIDogVE9ETyAoYXJjaGl0ZWN0dXJlIHNwZWNpZmljKVxuIixjb3Byb2NfbnVtLGNvcHJvY19yZWcsbWVtd29yZCxwcl9hZGRyKGNpYSkpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkCi1jb3BfbGQgKFNJTV9ERVNDIHNkLAotCXNpbV9jcHUgKmNwdSwKLQlhZGRyZXNzX3dvcmQgY2lhLAotCWludCBjb3Byb2NfbnVtLAotCWludCBjb3Byb2NfcmVnLAotCXV3b3JkNjQgbWVtd29yZCkKLXsKLQotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBDT1BfTEQ6IGNvcHJvY19udW0gPSAlZCwgY29wcm9jX3JlZyA9ICVkLCB2YWx1ZSA9IDB4JXMgOiBQQyA9IDB4JXNcbiIsIGNvcHJvY19udW0sIGNvcHJvY19yZWcsIHByX3V3b3JkNjQobWVtd29yZCksIHByX2FkZHIoY2lhKSApOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjb3Byb2NfbnVtKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgPT0gSEFSRF9GTE9BVElOR19QT0lOVCkKLQl7Ci0JICBTdG9yZUZQUihjb3Byb2NfcmVnLGZtdF91bmludGVycHJldGVkLG1lbXdvcmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgZGVmYXVsdDoKLSNpZiAwIC8qIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uICovCi0gICAgIHNpbV9pb19wcmludGYoc2QsIkNPUF9MRCglZCwlZCwweCVzKSBhdCBQQyA9IDB4JXMgOiBUT0RPIChhcmNoaXRlY3R1cmUgc3BlY2lmaWMpXG4iLGNvcHJvY19udW0sY29wcm9jX3JlZyxwcl9hZGRyKG1lbXdvcmQpLHByX2FkZHIoY2lhKSk7Ci0jZW5kaWYKLSAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm47Ci19Ci0KLQotCi0KLXVuc2lnbmVkIGludAotY29wX3N3IChTSU1fREVTQyBzZCwKLQlzaW1fY3B1ICpjcHUsCi0JYWRkcmVzc193b3JkIGNpYSwKLQlpbnQgY29wcm9jX251bSwKLQlpbnQgY29wcm9jX3JlZykKLXsKLSAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKLQotICBzd2l0Y2ggKGNvcHJvY19udW0pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UID09IEhBUkRfRkxPQVRJTkdfUE9JTlQpCi0JewotCSAgRlBfZm9ybWF0cyBob2xkOwotCSAgaG9sZCA9IEZQUl9TVEFURVtjb3Byb2NfcmVnXTsKLQkgIEZQUl9TVEFURVtjb3Byb2NfcmVnXSA9IGZtdF93b3JkOwotCSAgdmFsdWUgPSAodW5zaWduZWQgaW50KVZhbHVlRlBSKGNvcHJvY19yZWcsZm10X3VuaW50ZXJwcmV0ZWQpOwotCSAgRlBSX1NUQVRFW2NvcHJvY19yZWddID0gaG9sZDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGRlZmF1bHQ6Ci0jaWYgMCAvKiBzaG91bGQgYmUgY29udHJvbGxlZCBieSBjb25maWd1cmF0aW9uIG9wdGlvbiAqLwotICAgICAgc2ltX2lvX3ByaW50ZihzZCwiQ09QX1NXKCVkLCVkKSBhdCBQQyA9IDB4JXMgOiBUT0RPIChhcmNoaXRlY3R1cmUgc3BlY2lmaWMpXG4iLGNvcHJvY19udW0sY29wcm9jX3JlZyxwcl9hZGRyKGNpYSkpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuKHZhbHVlKTsKLX0KLQotdXdvcmQ2NAotY29wX3NkIChTSU1fREVTQyBzZCwKLQlzaW1fY3B1ICpjcHUsCi0JYWRkcmVzc193b3JkIGNpYSwKLQlpbnQgY29wcm9jX251bSwKLQlpbnQgY29wcm9jX3JlZykKLXsKLSAgdXdvcmQ2NCB2YWx1ZSA9IDA7Ci0gIHN3aXRjaCAoY29wcm9jX251bSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgPT0gSEFSRF9GTE9BVElOR19QT0lOVCkKLQl7Ci0JICB2YWx1ZSA9IFZhbHVlRlBSKGNvcHJvY19yZWcsZm10X3VuaW50ZXJwcmV0ZWQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgZGVmYXVsdDoKLSNpZiAwIC8qIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uICovCi0gICAgICBzaW1faW9fcHJpbnRmKHNkLCJDT1BfU0QoJWQsJWQpIGF0IFBDID0gMHglcyA6IFRPRE8gKGFyY2hpdGVjdHVyZSBzcGVjaWZpYylcbiIsY29wcm9jX251bSxjb3Byb2NfcmVnLHByX2FkZHIoY2lhKSk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4odmFsdWUpOwotfQotCi0KLQotCi12b2lkCi1kZWNvZGVfY29wcm9jIChTSU1fREVTQyBzZCwKLQkgICAgICAgc2ltX2NwdSAqY3B1LAotCSAgICAgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb24pCi17Ci0gIGludCBjb3Byb2NudW0gPSAoKGluc3RydWN0aW9uID4+IDI2KSAmIDMpOwotCi0gIHN3aXRjaCAoY29wcm9jbnVtKQotICAgIHsKLSAgICBjYXNlIDA6IC8qIHN0YW5kYXJkIENQVSBjb250cm9sIGFuZCBjYWNoZSByZWdpc3RlcnMgKi8KLSAgICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MUYpOwotCWludCBydCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgxRik7Ci0JaW50IHJkID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDFGKTsKLQlpbnQgdGFpbCA9IGluc3RydWN0aW9uICYgMHgzZmY7Ci0gICAgICAgIC8qIFI0MDAwIFVzZXJzIE1hbnVhbCAoc2Vjb25kIGVkaXRpb24pIGxpc3RzIHRoZSBmb2xsb3dpbmcgQ1AwCi0gICAgICAgICAgIGluc3RydWN0aW9uczoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREU+PC1SVD48UkQtPjwtLVRBSUwtLS0+Ci0JICAgRE1GQzAgICBEb3VibGV3b3JkIE1vdmUgRnJvbSBDUDAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAwMDAwMXR0dHR0ZGRkZGQwMDAwMDAwMDAwMCkKLQkgICBETVRDMCAgIERvdWJsZXdvcmQgTW92ZSBUbyBDUDAgICAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDAwMTAxdHR0dHRkZGRkZDAwMDAwMDAwMDAwKQotCSAgIE1GQzAgICAgd29yZCBNb3ZlIEZyb20gQ1AwICAgICAgICAgICAgICAoVlI0MTAwID0gMDEwMDAwMDAwMDB0dHR0dGRkZGRkMDAwMDAwMDAwMDApCi0JICAgTVRDMCAgICB3b3JkIE1vdmUgVG8gQ1AwICAgICAgICAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAwMDEwMHR0dHR0ZGRkZGQwMDAwMDAwMDAwMCkKLQkgICBUTEJSICAgIFJlYWQgSW5kZXhlZCBUTEIgRW50cnkgICAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxKQotCSAgIFRMQldJICAgV3JpdGUgSW5kZXhlZCBUTEIgRW50cnkgICAgICAgICAoVlI0MTAwID0gMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTApCi0JICAgVExCV1IgICBXcml0ZSBSYW5kb20gVExCIEVudHJ5ICAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMCkKLQkgICBUTEJQICAgIFByb2JlIFRMQiBmb3IgTWF0Y2hpbmcgRW50cnkgICAgKFZSNDEwMCA9IDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwKQotCSAgIENBQ0hFICAgQ2FjaGUgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAoVlI0MTAwID0gMTAxMTExYmJiYmJwcHBwcGlpaWlpaWlpaWlpaWlpaWkpCi0JICAgRVJFVCAgICBFeGNlcHRpb24gcmV0dXJuICAgICAgICAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMCkKLQkgICAqLwotICAgICAgICBpZiAoKChjb2RlID09IDB4MDApIHx8IChjb2RlID09IDB4MDQpICAgICAgLyogTUZDMCAgLyAgTVRDMCAgKi8gICAgICAgIAotCSAgICAgfHwgKGNvZGUgPT0gMHgwMSkgfHwgKGNvZGUgPT0gMHgwNSkpICAvKiBETUZDMCAvIERNVEMwICAqLyAgICAgICAgCi0JICAgICYmIHRhaWwgPT0gMCkKLQkgIHsKLQkgICAgLyogQ2xlYXIgZG91YmxlL3NpbmdsZSBjb3Byb2Nlc3NvciBtb3ZlIGJpdC4gKi8KLQkgICAgY29kZSAmPSB+MTsKLQotCSAgICAvKiBNW1RGXUMwICgzMiBiaXRzKSB8IERNW1RGXUMwICg2NCBiaXRzKSAqLwotCSAgICAKLQkgICAgc3dpdGNoIChyZCkgIC8qIE5PVEVzOiBTdGFuZGFyZCBDUDAgcmVnaXN0ZXJzICovCi0JICAgICAgewotCQkvKiAwID0gSW5kZXggICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDEgPSBSYW5kb20gICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogMiA9IEVudHJ5TG8wICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCQkvKiAzID0gRW50cnlMbzEgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDQgPSBDb250ZXh0ICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogNSA9IFBhZ2VNYXNrICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCQkvKiA2ID0gV2lyZWQgICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDggPSBCYWRWQWRkciAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogOSA9IENvdW50ICAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCQkvKiAxMCA9IEVudHJ5SGkgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDExID0gQ29tcGFyZSAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogMTIgPSBTUiAgICAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotI2lmZGVmIFNVQlRBUkdFVF9SMzkwMAotCSAgICAgIGNhc2UgMzoKLQkJLyogMyA9IENvbmZpZyAgICAgICAgICAgICAgUjM5MDAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIGNhc2UgNzoKLQkJLyogNyA9IENhY2hlICAgICAgICAgICAgICAgUjM5MDAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIGNhc2UgMTU6Ci0JCS8qIDE1ID0gUFJJRCAgICAgICAgICAgICAgIFIzOTAwICAgICAgICAgICAgICAgICAgKi8KLQotCQkvKiBpZ25vcmUgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIDg6Ci0JCS8qIDggPSBCYWRWQWRkciAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJaWYgKGNvZGUgPT0gMHgwMCkKLQkJICBHUFJbcnRdID0gQ09QMF9CQURWQUREUjsKLQkJZWxzZQotCQkgIENPUDBfQkFEVkFERFIgPSBHUFJbcnRdOwotCQlicmVhazsKLQotI2VuZGlmIC8qIFNVQlRBUkdFVF9SMzkwMCAqLwotCSAgICAgIGNhc2UgMTI6Ci0JCWlmIChjb2RlID09IDB4MDApCi0JCSAgR1BSW3J0XSA9IFNSOwotCQllbHNlCi0JCSAgU1IgPSBHUFJbcnRdOwotCQlicmVhazsKLQkJLyogMTMgPSBDYXVzZSAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCSAgICAgIGNhc2UgMTM6Ci0JCWlmIChjb2RlID09IDB4MDApCi0JCSAgR1BSW3J0XSA9IENBVVNFOwotCQllbHNlCi0JCSAgQ0FVU0UgPSBHUFJbcnRdOwotCQlicmVhazsKLQkJLyogMTQgPSBFUEMgICAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCSAgICAgIGNhc2UgMTQ6Ci0JCWlmIChjb2RlID09IDB4MDApCi0JCSAgR1BSW3J0XSA9IChzaWduZWRfd29yZCkgKHNpZ25lZF9hZGRyZXNzKSBFUEM7Ci0JCWVsc2UKLQkJICBFUEMgPSBHUFJbcnRdOwotCQlicmVhazsKLQkJLyogMTUgPSBQUklkICAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotI2lmZGVmIFNVQlRBUkdFVF9SMzkwMAotICAgICAgICAgICAgICAgIC8qIDE2ID0gRGVidWcgKi8KLSAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAweDAwKQotICAgICAgICAgICAgICAgICAgR1BSW3J0XSA9IERlYnVnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIERlYnVnID0gR1BSW3J0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbHNlCi0JCS8qIDE2ID0gQ29uZmlnICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLSAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAweDAwKQotICAgICAgICAgICAgICAgICAgR1BSW3J0XSA9IEMwX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBDMF9DT05GSUcgPSBHUFJbcnRdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU1VCVEFSR0VUX1IzOTAwCi0gICAgICAgICAgICAgICAgLyogMTcgPSBEZWJ1ZyAqLwotICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDB4MDApCi0gICAgICAgICAgICAgICAgICBHUFJbcnRdID0gREVQQzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBERVBDID0gR1BSW3J0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbHNlCi0JCS8qIDE3ID0gTExBZGRyICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLSNlbmRpZgotCQkvKiAxOCA9IFdhdGNoTG8gICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDE5ID0gV2F0Y2hIaSAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogMjAgPSBYQ29udGV4dCAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCQkvKiAyNiA9IFBFcnIgb3IgRUNDICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCS8qIDI3ID0gQ2FjaGVFcnIgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICovCi0JCS8qIDI4ID0gVGFnTG8gICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KLQkJLyogMjkgPSBUYWdIaSAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLwotCQkvKiAzMCA9IEVycm9yRVBDICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCi0JCWlmIChTVEFURV9WRVJCT1NFX1AoU0QpKQotCQkgIHNpbV9pb19lcHJpbnRmIChTRCwgCi0JCQkJICAiV2FybmluZzogUEMgMHglbHg6aW50ZXJwLmMgZGVjb2RlX2NvcHJvYyBERUFEQzBERVxuIiwKLQkJCQkgICh1bnNpZ25lZCBsb25nKWNpYSk7Ci0JCUdQUltydF0gPSAweERFQURDMERFOyAvKiBDUFJbMCxyZF0gKi8KLQkJLyogQ1BSWzAscmRdID0gR1BSW3J0XTsgKi8KLQkgICAgICBkZWZhdWx0OgotCQlpZiAoY29kZSA9PSAweDAwKQotCQkgIEdQUltydF0gPSAoc2lnbmVkX3dvcmQpIChzaWduZWQzMikgQ09QMF9HUFJbcmRdOwotCQllbHNlCi0JCSAgQ09QMF9HUFJbcmRdID0gR1BSW3J0XTsKLSNpZiAwCi0JCWlmIChjb2RlID09IDB4MDApCi0JCSAgc2ltX2lvX3ByaW50ZihzZCwiV2FybmluZzogTUZDMCAlZCwlZCBpZ25vcmVkLCBQQz0lMDh4IChhcmNoaXRlY3R1cmUgc3BlY2lmaWMpXG4iLHJ0LHJkLCAodW5zaWduZWQpY2lhKTsKLQkJZWxzZQotCQkgIHNpbV9pb19wcmludGYoc2QsIldhcm5pbmc6IE1UQzAgJWQsJWQgaWdub3JlZCwgUEM9JTA4eCAoYXJjaGl0ZWN0dXJlIHNwZWNpZmljKVxuIixydCxyZCwgKHVuc2lnbmVkKWNpYSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoY29kZSA9PSAweDEwICYmICh0YWlsICYgMHgzZikgPT0gMHgxOCkKLQkgIHsKLQkgICAgLyogRVJFVCAqLwotCSAgICBpZiAoU1IgJiBzdGF0dXNfRVJMKQotCSAgICAgIHsKLQkJLyogT29wcywgbm90IHlldCBhdmFpbGFibGUgKi8KLQkJc2ltX2lvX3ByaW50ZihzZCwiV2FybmluZzogRVJFVCB3aGVuIFNSW0VSTF0gc2V0IG5vdCBoYW5kbGVkIHlldCIpOwotCQlQQyA9IEVQQzsKLQkJU1IgJj0gfnN0YXR1c19FUkw7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlQQyA9IEVQQzsKLQkJU1IgJj0gfnN0YXR1c19FWEw7Ci0JICAgICAgfQotCSAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID09IDB4MTAgJiYgKHRhaWwgJiAweDNmKSA9PSAweDEwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJGRSAqLwotI2lmZGVmIFNVQlRBUkdFVF9SMzkwMAotCSAgICAvKiBUWDM5OiBDb3B5IElFcC9LVXAgLT4gSUVjL0tVYywgYW5kIElFby9LVW8gLT4gSUVwL0tVcCAqLwotCi0JICAgIC8qIHNoaWZ0IElFL0tVIGhpc3RvcnkgYml0cyByaWdodCAqLwotCSAgICBTUiA9IExTTUFTS0VEMzIoU1IsIDMxLCA0KSB8IExTSU5TRVJURUQzMihMU0VYVFJBQ1RFRDMyKFNSLCA1LCAyKSwgMywgMCk7Ci0KLQkgICAgLyogVE9ETzogQ0FDSEUgcmVnaXN0ZXIgKi8KLSNlbmRpZiAvKiBTVUJUQVJHRVRfUjM5MDAgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHgxMCAmJiAodGFpbCAmIDB4M2YpID09IDB4MUYpCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogREVSRVQgKi8KLSAgICAgICAgICAgIERlYnVnICY9IH5EZWJ1Z19ETTsKLSAgICAgICAgICAgIERFTEFZU0xPVCgpOwotICAgICAgICAgICAgRFNQQyA9IERFUEM7Ci0gICAgICAgICAgfQotCWVsc2UKLQkgIHNpbV9pb19lcHJpbnRmKHNkLCJVbnJlY29nbmlzZWQgQ09QMCBpbnN0cnVjdGlvbiAweCUwOFggYXQgUEMgPSAweCVzIDogTm8gaGFuZGxlciBwcmVzZW50XG4iLGluc3RydWN0aW9uLHByX2FkZHIoY2lhKSk7Ci0gICAgICAgIC8qIFRPRE86IFdoZW4gZXhlY3V0aW5nIGFuIEVSRVQgb3IgUkZFIGluc3RydWN0aW9uIHdlIHNob3VsZAotICAgICAgICAgICBjbGVhciBMTEJJVCwgdG8gZW5zdXJlIHRoYXQgYW55IG91dC1zdGFuZGluZyBhdG9taWMKLSAgICAgICAgICAgcmVhZC9tb2RpZnkvd3JpdGUgc2VxdWVuY2UgZmFpbHMuICovCi0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSAyOiAvKiBjby1wcm9jZXNzb3IgMiAqLwotICAgICAgewotCWludCBoYW5kbGUgPSAwOwotCi0KLQlpZighIGhhbmRsZSkKLQkgIHsKLQkgICAgc2ltX2lvX2VwcmludGYoc2QsICJDT1AyIGluc3RydWN0aW9uIDB4JTA4WCBhdCBQQyA9IDB4JXMgOiBObyBoYW5kbGVyIHByZXNlbnRcbiIsCi0JCQkgICBpbnN0cnVjdGlvbixwcl9hZGRyKGNpYSkpOwotCSAgfQotICAgICAgfQotICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgMTogLyogc2hvdWxkIG5vdCBvY2N1ciAoRlBVIGNvLXByb2Nlc3NvcikgKi8KLSAgICBjYXNlIDM6IC8qIHNob3VsZCBub3Qgb2NjdXIgKEZQVSBjby1wcm9jZXNzb3IpICovCi0gICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyBjb2RlIGNvcGllZCBmcm9tIGdkYidzIHV0aWxzLmMuICBXb3VsZCBsaWtlIHRvIHNoYXJlIHRoaXMgY29kZSwKLSAgIGJ1dCBkb24ndCBrbm93IG9mIGEgY29tbW9uIHBsYWNlIHdoZXJlIGJvdGggY291bGQgZ2V0IHRvIGl0LiAqLwotCi0vKiBUZW1wb3Jhcnkgc3RvcmFnZSB1c2luZyBjaXJjdWxhciBidWZmZXIgKi8KLSNkZWZpbmUgTlVNQ0VMTFMgMTYKLSNkZWZpbmUgQ0VMTFNJWkUgMzIKLXN0YXRpYyBjaGFyKgotZ2V0X2NlbGwgKHZvaWQpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1ZltOVU1DRUxMU11bQ0VMTFNJWkVdOwotICBzdGF0aWMgaW50IGNlbGw9MDsKLSAgaWYgKCsrY2VsbD49TlVNQ0VMTFMpIGNlbGw9MDsKLSAgcmV0dXJuIGJ1ZltjZWxsXTsKLX0gICAgIAotCi0vKiBQcmludCByb3V0aW5lcyB0byBoYW5kbGUgdmFyaWFibGUgc2l6ZSByZWdzLCBldGMgKi8KLQotLyogRWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb21waWxlciBvbiAzMi1iaXQgc3lzdGVtcyAqLwotc3RhdGljIGludCB0aGlydHlfdHdvID0gMzI7CQotCi1jaGFyKiAKLXByX2FkZHIoYWRkcikKLSAgU0lNX0FERFIgYWRkcjsKLXsKLSAgY2hhciAqcGFkZHJfc3RyPWdldF9jZWxsKCk7Ci0gIHN3aXRjaCAoc2l6ZW9mKGFkZHIpKQotICAgIHsKLSAgICAgIGNhc2UgODoKLSAgICAgICAgc3ByaW50ZihwYWRkcl9zdHIsIiUwOGx4JTA4bHgiLAotCQkodW5zaWduZWQgbG9uZykoYWRkcj4+dGhpcnR5X3R3byksKHVuc2lnbmVkIGxvbmcpKGFkZHImMHhmZmZmZmZmZikpOwotCWJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgICBzcHJpbnRmKHBhZGRyX3N0ciwiJTA4bHgiLCh1bnNpZ25lZCBsb25nKWFkZHIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBzcHJpbnRmKHBhZGRyX3N0ciwiJTA0eCIsKHVuc2lnbmVkIHNob3J0KShhZGRyJjB4ZmZmZikpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3ByaW50ZihwYWRkcl9zdHIsIiV4IixhZGRyKTsKLSAgICB9Ci0gIHJldHVybiBwYWRkcl9zdHI7Ci19Ci0KLWNoYXIqIAotcHJfdXdvcmQ2NChhZGRyKQotICB1d29yZDY0IGFkZHI7Ci17Ci0gIGNoYXIgKnBhZGRyX3N0cj1nZXRfY2VsbCgpOwotICBzcHJpbnRmKHBhZGRyX3N0ciwiJTA4bHglMDhseCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGFkZHI+PnRoaXJ0eV90d28pLCh1bnNpZ25lZCBsb25nKShhZGRyJjB4ZmZmZmZmZmYpKTsKLSAgcmV0dXJuIHBhZGRyX3N0cjsKLX0KLQotCi12b2lkCi1taXBzX2NvcmVfc2lnbmFsIChTSU1fREVTQyBzZCwKLSAgICAgICAgICAgICAgICAgc2ltX2NwdSAqY3B1LAotICAgICAgICAgICAgICAgICBzaW1fY2lhIGNpYSwKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWFwLAotICAgICAgICAgICAgICAgICBpbnQgbnJfYnl0ZXMsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAotICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLAotICAgICAgICAgICAgICAgICBzaW1fY29yZV9zaWduYWxzIHNpZykKLXsKLSAgY29uc3QgY2hhciAqY29weSA9ICh0cmFuc2ZlciA9PSByZWFkX3RyYW5zZmVyID8gInJlYWQiIDogIndyaXRlIik7Ci0gIGFkZHJlc3Nfd29yZCBpcCA9IENJQV9BRERSIChjaWEpOwotCi0gIHN3aXRjaCAoc2lnKQotICAgIHsKLSAgICBjYXNlIHNpbV9jb3JlX3VubWFwcGVkX3NpZ25hbDoKLSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIm1pcHMtY29yZTogJWQgYnl0ZSAlcyB0byB1bm1hcHBlZCBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG5yX2J5dGVzLCBjb3B5LCAKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBpcCk7Ci0gICAgICBDT1AwX0JBRFZBRERSID0gYWRkcjsKLSAgICAgIFNpZ25hbEV4Y2VwdGlvbkRhdGFSZWZlcmVuY2UoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsOgotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAibWlwcy1jb3JlOiAlZCBieXRlICVzIHRvIHVuYWxpZ25lZCBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG5yX2J5dGVzLCBjb3B5LCAKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBpcCk7Ci0gICAgICBDT1AwX0JBRFZBRERSID0gYWRkcjsKLSAgICAgIGlmKHRyYW5zZmVyID09IHJlYWRfdHJhbnNmZXIpIAotCVNpZ25hbEV4Y2VwdGlvbkFkZHJlc3NMb2FkKCk7Ci0gICAgICBlbHNlCi0JU2lnbmFsRXhjZXB0aW9uQWRkcmVzc1N0b3JlKCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgY3B1LCBjaWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAibWlwc19jb3JlX3NpZ25hbCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOwotICAgIH0KLX0KLQotCi12b2lkCi1taXBzX2NwdV9leGNlcHRpb25fdHJpZ2dlcihTSU1fREVTQyBzZCwgc2ltX2NwdSogY3B1LCBhZGRyZXNzX3dvcmQgY2lhKQotewotICBBU1NFUlQoY3B1ICE9IE5VTEwpOwotCi0gIGlmKGNwdS0+ZXhjX3N1c3BlbmRlZCA+IDApCi0gICAgc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCBuZXN0ZWQgZXhjZXB0aW9uIHRyaWdnZXJlZCAoJWQpXG4iLCBjcHUtPmV4Y19zdXNwZW5kZWQpOyAKLQotICBQQyA9IGNpYTsKLSAgbWVtY3B5KGNwdS0+ZXhjX3RyaWdnZXJfcmVnaXN0ZXJzLCBjcHUtPnJlZ2lzdGVycywgc2l6ZW9mKGNwdS0+ZXhjX3RyaWdnZXJfcmVnaXN0ZXJzKSk7Ci0gIGNwdS0+ZXhjX3N1c3BlbmRlZCA9IDA7Ci19Ci0KLXZvaWQKLW1pcHNfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pCi17Ci0gIEFTU0VSVChjcHUgIT0gTlVMTCk7Ci0KLSAgaWYoY3B1LT5leGNfc3VzcGVuZGVkID4gMCkKLSAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIG5lc3RlZCBleGNlcHRpb24gc2lnbmFsICglZCB0aGVuICVkKVxuIiwgCi0JCSAgIGNwdS0+ZXhjX3N1c3BlbmRlZCwgZXhjZXB0aW9uKTsgCi0KLSAgbWVtY3B5KGNwdS0+ZXhjX3N1c3BlbmRfcmVnaXN0ZXJzLCBjcHUtPnJlZ2lzdGVycywgc2l6ZW9mKGNwdS0+ZXhjX3N1c3BlbmRfcmVnaXN0ZXJzKSk7Ci0gIG1lbWNweShjcHUtPnJlZ2lzdGVycywgY3B1LT5leGNfdHJpZ2dlcl9yZWdpc3RlcnMsIHNpemVvZihjcHUtPnJlZ2lzdGVycykpOwotICBjcHUtPmV4Y19zdXNwZW5kZWQgPSBleGNlcHRpb247Ci19Ci0KLXZvaWQKLW1pcHNfY3B1X2V4Y2VwdGlvbl9yZXN1bWUoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbikKLXsKLSAgQVNTRVJUKGNwdSAhPSBOVUxMKTsKLQotICBpZihleGNlcHRpb24gPT0gMCAmJiBjcHUtPmV4Y19zdXNwZW5kZWQgPiAwKQotICAgIHsKLSAgICAgIC8qIHdhcm4gbm90IGZvciBicmVha3BvaW50cyAqLwotICAgICAgaWYoY3B1LT5leGNfc3VzcGVuZGVkICE9IHNpbV9zaWduYWxfdG9faG9zdChzZCwgU0lNX1NJR1RSQVApKQotCXNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgcmVzdW1pbmcgYnV0IGlnbm9yaW5nIHBlbmRpbmcgZXhjZXB0aW9uIHNpZ25hbCAoJWQpXG4iLAotCQkgICAgICAgY3B1LT5leGNfc3VzcGVuZGVkKTsgCi0gICAgfQotICBlbHNlIGlmKGV4Y2VwdGlvbiAhPSAwICYmIGNwdS0+ZXhjX3N1c3BlbmRlZCA+IDApCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uICE9IGNwdS0+ZXhjX3N1c3BlbmRlZCkgCi0Jc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCByZXN1bWluZyB3aXRoIG1pc21hdGNoZWQgZXhjZXB0aW9uIHNpZ25hbCAoJWQgdnMgJWQpXG4iLAotCQkgICAgICAgY3B1LT5leGNfc3VzcGVuZGVkLCBleGNlcHRpb24pOyAKLSAgICAgIAotICAgICAgbWVtY3B5KGNwdS0+cmVnaXN0ZXJzLCBjcHUtPmV4Y19zdXNwZW5kX3JlZ2lzdGVycywgc2l6ZW9mKGNwdS0+cmVnaXN0ZXJzKSk7IAotICAgIH0KLSAgZWxzZSBpZihleGNlcHRpb24gIT0gMCAmJiBjcHUtPmV4Y19zdXNwZW5kZWQgPT0gMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIGlnbm9yaW5nIHNwb250YW5vdXMgZXhjZXB0aW9uIHNpZ25hbCAoJWQpXG4iLCBleGNlcHRpb24pOyAKLSAgICB9Ci0gIGNwdS0+ZXhjX3N1c3BlbmRlZCA9IDA7IAotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPiBFT0YgaW50ZXJwLmMgPCovCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9tMTYuZGMgYi9zaW0vbWlwcy9tMTYuZGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjU4N2MuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvbTE2LmRjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBtb3N0IGluc3RydWN0aW9ucwotIyAtLS0tLS0gb3B0aW9ucyAtLS0tLS0gOiBGc3QgOiBMc3QgOiBmZiA6IGZsIDogZmUgOiB3b3JkIDogLS0tIGZtdCAtLS0gOiBtb2RlbCAuLi4KLSMgeyA6IG1hc2sgOiB2YWx1ZSA6IHdvcmQgfQotCi0jIFRvcCBsZXZlbCAtIGNyZWF0ZSBhIHZlcnkgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuCi0KLSAgcGFkZGVkLXN3aXRjaCxjb21iaW5lIDogIDE1IDogIDExIDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKLQotICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgMTAgOiAgIDggOiAgICA6ICAgIDogICAgOiAgICAgIDogICAgICAgICAgICAgOgotCi0gIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAgNCA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6Ci0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA3IDogICA1IDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKLQotCi0jIEV4dGVuZGVkIGluc3RydWN0aW9ucywgZGVjb2RlIHRoZSBzYW1lIHdheQotCi0gIHBhZGRlZC1zd2l0Y2gsY29tYmluZSA6ICAxNSA6ICAxMSA6ICAgIDogICAgOiAgICA6ICAgIDEgOiAgICAgICAgICAgICA6Ci0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogIDEwIDogICA4IDogICAgOiAgICA6ICAgIDogICAgMSA6ICAgICAgICAgICAgIDoKLQotICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgotCi0gIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAgNyA6ICAgNSA6ICAgIDogICAgOiAgICA6ICAgIDEgOiAgICAgICAgICAgICA6Ci0KZGlmZiAtLWdpdCBhL3NpbS9taXBzL20xNi5pZ2VuIGIvc2ltL21pcHMvbTE2LmlnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzZmZjkuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvbTE2LmlnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjM2ICswLDAgQEAKLS8vIC0qLSBDIC0qLQotLy8KLS8vCi0vLyBNSVBTIEFyY2hpdGVjdHVyZToKLS8vCi0vLyAgICAgICAgQ1BVIEluc3RydWN0aW9uIFNldCAobWlwczE2KQotLy8KLQotLy8gVGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gYXJlIG9yZGVyZWQgYWNjb3JkaW5nCi0vLyB0byBodHRwOi8vd3d3LnNnaS5jb20vTUlQUy9hcmNoL01JUFMxNi9taXBzMTYucGRmLgotCi0KLS8vIFRoZSBNSVBTMTYgY29kZXMgcmVnaXN0ZXJzIGluIGEgc3BlY2lhbCB3YXksIG1hcCBmcm9tIG9uZSB0byB0aGUgb3RoZXIuCi0vLyA6PHR5cGU+OjxmbGFncz46PG1vZGVscz46PHR5cGVkZWY+OjxuYW1lPjo8ZmllbGQ+OjxleHByZXNzaW9uPgotOmNvbXB1dGU6OjppbnQ6VFJYOlJYOigoUlggPCAyKSA/ICgxNiArIFJYKSBcOiBSWCkKLTpjb21wdXRlOjo6aW50OlRSWTpSWTooKFJZIDwgMikgPyAoMTYgKyBSWSkgXDogUlkpCi06Y29tcHV0ZTo6OmludDpUUlo6Ulo6KChSWiA8IDIpID8gKDE2ICsgUlopIFw6IFJaKQotOmNvbXB1dGU6OjppbnQ6U0hJRlQ6U0hBTVQ6KChTSEFNVCA9PSAwKSA/IDggXDogU0hBTVQpCi0KLTpjb21wdXRlOjo6aW50OlNIQU1UOlNIQU1UXzRfMCxTNTooTFNJTlNFUlRFRCAoUzUsIDUsIDUpIHwgU0hBTVRfNF8wKQotCi06Y29tcHV0ZTo6OmFkZHJlc3Nfd29yZDpJTU1FRElBVEU6SU1NXzI1XzIxLElNTV8yMF8xNixJTU1FRF8xNV8wOihMU0lOU0VSVEVEIChJTU1fMjVfMjEsIDI1LCAyMSkgfCBMU0lOU0VSVEVEIChJTU1fMjBfMTYsIDIwLCAxNikgfCBMU0lOU0VSVEVEIChJTU1FRF8xNV8wLCAxNSwgMCkpCi06Y29tcHV0ZTo6OmludDpSMzI6UjMyTCxSMzJIOigoUjMySCA8PCAzKSB8IFIzMkwpCi0KLTpjb21wdXRlOjo6YWRkcmVzc193b3JkOklNTUVESUFURTpJTU1fMTBfNSxJTU1fMTVfMTEsSU1NXzRfMDooTFNJTlNFUlRFRCAoSU1NXzEwXzUsIDEwLCA1KSB8IExTSU5TRVJURUQgKElNTV8xNV8xMSwgMTUsIDExKSB8IExTSU5TRVJURUQgKElNTV80XzAsIDQsIDApKQotCi06Y29tcHV0ZTo6OmFkZHJlc3Nfd29yZDpJTU1FRElBVEU6SU1NXzEwXzQsSU1NXzE0XzExLElNTV8zXzA6KExTSU5TRVJURUQgKElNTV8xMF80LCAxMCwgNCkgfCBMU0lOU0VSVEVEIChJTU1fMTRfMTEsIDE0LCAxMSkgfCBMU0lOU0VSVEVEIChJTU1fM18wLCAzLCAwKSkKLQotCi0vLyBMb2FkIGFuZCBTdG9yZSBJbnN0cnVjdGlvbnMKLQotCi0xMDAwMCwzLlJYLDMuUlksNS5JTU1FRDpSUkk6MTY6OkxCCi0ibGIgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gRVhURU5EOCAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW1RSWF0sIElNTUVEKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDAwMCwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxCCi0ibGIgcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IEVYVEVORDggKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSkpOwotfQotCi0KLQotMTAxMDAsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMQlUKLSJsYnUgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW1RSWF0sIElNTUVEKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTAwLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEJVCi0ibGJ1IHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgR1BSW1RSWV0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9CWVRFLCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpOwotfQotCi0KLQotMTAwMDEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMSAotImxoIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IEVYVEVORDE2IChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDEpKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMDAxLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEgKLSJsaCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gRVhURU5EMTYgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKLX0KLQotCi0KLTEwMTAxLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6TEhVCi0ibGh1IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbVFJYXSwgSU1NRUQgPDwgMSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDEwMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxIVQotImxodSByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Ci19Ci0KLQotCi0xMDAxMSwzLlJYLDMuUlksNS5JTU1FRDpSUkk6MTY6OkxXCi0ibHcgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gRVhURU5EMzIgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAyKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDAxMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxXCi0ibHcgcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKLX0KLQotCi0KLTEwMTEwLDMuUlgsOC5JTU1FRDpSSToxNjo6TFdQQwotImx3IHI8VFJYPiwgPElNTUVEPiAoUEMpIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlhdID0gRVhURU5EMzIgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsCi0JCQkJYmFzZXBjIChTRF8pICYgfjMsIElNTUVEIDw8IDIpKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTEwLDMuUlgsMDAwLDUuSU1NXzRfMDpFWFQtUkk6MTY6OkxXUEMKLSJsdyByPFRSWD4sIDxJTU1FRElBVEU+IChQQykiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgR1BSW1RSWF0gPSBFWFRFTkQzMiAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgYmFzZXBjIChTRF8pICYgfjMsIEVYVEVORDE2IChJTU1FRElBVEUpKSk7Ci19Ci0KLQotCi0xMDAxMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkxXU1AKLSJsdyByPFRSWD4sIDxJTU1FRD4gKFNQKSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJYXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgSU1NRUQgPDwgMikpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTAwMTAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6TFdTUAotImx3IHI8VFJYPiwgPElNTUVESUFURT4gKFNQKSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJYXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKLX0KLQotCi0KLTEwMTExLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6TFdVCi0ibHd1IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAyKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TFdVCi0ibHd1IHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgR1BSW1RSWV0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpOwotfQotCi0KLQotMDAxMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMRAotImxkIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAzKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAwMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEQKLSJsZCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW1RSWF0sIEVYVEVORDE2IChJTU1FRElBVEUpKTsKLX0KLQotCi0KLTExMTExLDEwMCwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6TERQQwotImxkIHI8VFJZPiwgPElNTUVEPiAoUEMpIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwKLQkJICAgICAgYmFzZXBjIChTRF8pICYgfjcsIElNTUVEIDw8IDMpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMTAwLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpMRFBDCi0ibGQgcjxUUlk+LCA8SU1NRURJQVRFPiAoUEMpIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgYmFzZXBjIChTRF8pICYgfjcsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKLX0KLQotCi0KLTExMTExLDAwMCwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6TERTUAotImxkIHI8VFJZPiwgPElNTUVEPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIElNTUVEIDw8IDMpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMDAwLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpMRFNQCi0ibGQgcjxUUlk+LCA8SU1NRURJQVRFPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKLX0KLQotCi0KLTExMDAwLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6U0IKLSJzYiByPFRSWT4sIDxJTU1FRD4gKHI8VFJYPikiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBJTU1FRCwgR1BSW1RSWV0pOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTEwMDAsMy5SWCwzLlJZLDUuSU1NXzRfMDpFWFQtUlJJOjE2OjpTQgotInNiIHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgR1BSW1RSWV0pOwotfQotCi0KLQotMTEwMDEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTSAotInNoIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAxLCBHUFJbVFJZXSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMTAwMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OlNICi0ic2ggcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgR1BSW1RSWV0pOwotfQotCi0KLQotMTEwMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTVwotInN3IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDIsIEdQUltUUlldKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMDExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6U1cKLSJzdyByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKLX0KLQotCi0KLTExMDEwLDMuUlgsOC5JTU1FRDpSSToxNjo6U1dTUAotInN3IHI8VFJYPiwgPElNTUVEPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgSU1NRUQgPDwgMiwgR1BSW1RSWF0pOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTEwMTAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6U1dTUAotInN3IHI8VFJYPiwgPElNTUVESUFURT4gKFNQKSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgU1AsIEVYVEVORDE2IChJTU1FRElBVEUpLCBHUFJbVFJYXSk7Ci19Ci0KLQotCi0wMTEwMCwwMTAsOC5JTU1FRDpJODoxNjo6U1dSQVNQCi0ic3cgcjxSQUlEWD4sIDxJTU1FRD4gKFNQKSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgU1AsIElNTUVEIDw8IDIsIFJBKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTAwLDAxMCwwMDAsNS5JTU1fNF8wOkVYVC1JODoxNjo6U1dSQVNQCi0ic3cgcjxSQUlEWD4sIDxJTU1FRElBVEU+IChTUCkiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIFNQLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgUkEpOwotfQotCi0KLQotMDExMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTRAotInNkIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDMsIEdQUltUUlldKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6U0QKLSJzZCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKLX0KLQotCi0KLTExMTExLDAwMSwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6U0RTUAotInNkIHI8VFJZPiwgPElNTUVEPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgSU1NRUQgPDwgMywgR1BSW1RSWV0pOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMDAxLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpTRFNQCi0ic2QgcjxUUlk+LCA8SU1NRURJQVRFPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKLX0KLQotCi0KLTExMTExLDAxMCw4LklNTUVEOkk2NDoxNjo6U0RSQVNQCi0ic2QgcjxSQUlEWD4sIDxJTU1FRD4gKFNQKSIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIElNTUVEIDw8IDMsIFJBKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDAxMCwwMDAsNS5JTU1fNF8wOkVYVC1JNjQ6MTY6OlNEUkFTUAotInNkIHI8UkFJRFg+LCA8SU1NRURJQVRFPiAoU1ApIgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSksIFJBKTsKLX0KLQotCi0KLS8vIEFMVSBJbW1lZGlhdGUgSW5zdHJ1Y3Rpb25zCi0KLQotMDExMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpMSQotImxpIHI8VFJYPiwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19vcmkgKFNEXywgMCwgVFJYLCBJTU1FRCk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTEwMSwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpMSQotImxpIHI8VFJYPiwgPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fb3JpIChTRF8sIDAsIFRSWCwgSU1NRURJQVRFKTsKLX0KLQotCi0KLTAxMDAwLDMuUlgsMy5SWSwwLDQuSU1NRUQ6UlJJLUE6MTY6OkFERElVCi0iYWRkaXUgcjxUUlk+LCByPFRSWD4sIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fYWRkaXUgKFNEXywgVFJYLCBUUlksIEVYVEVORDQgKElNTUVEKSk7Ci19Ci0KLTExMTEwLDcuSU1NXzEwXzQsNC5JTU1fMTRfMTEgKyAwMTAwMCwzLlJYLDMuUlksMCw0LklNTV8zXzA6RVhULVJSSS1BOjE2OjpBRERJVQotImFkZGl1IHI8VFJZPiwgcjxUUlg+LCA8SU1NRURJQVRFPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19hZGRpdSAoU0RfLCBUUlgsIFRSWSwgRVhURU5EMTUgKElNTUVESUFURSkpOwotfQotCi0KLQotMDEwMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpBRERJVTgKLSJhZGRpdSByPFRSWD4sIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fYWRkaXUgKFNEXywgVFJYLCBUUlgsIEVYVEVORDggKElNTUVEKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTAwMSwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpBRERJVTgKLSJhZGRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2FkZGl1IChTRF8sIFRSWCwgVFJYLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Ci19Ci0KLQotCi0wMTEwMCwwMTEsOC5JTU1FRDpJODoxNjo6QURKU1AKLSJhZGRpdSBTUCwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19hZGRpdSAoU0RfLCBTUElEWCwgU1BJRFgsIEVYVEVORDggKElNTUVEKSA8PCAzKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTAwLDAxMSwwMDAsNS5JTU1fNF8wOkVYVC1JODoxNjo6QURKU1AKLSJhZGRpdSBTUCwgPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fYWRkaXUgKFNEXywgU1BJRFgsIFNQSURYLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Ci19Ci0KLQotCi0wMDAwMSwzLlJYLDguSU1NRUQ6Ukk6MTY6OkFERElVUEMKLSJhZGRpdSByPFRSWD4sIFBDLCA8SU1NRUQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIHVuc2lnbmVkMzIgdGVtcCA9IChiYXNlcGMgKFNEXykgJiB+MykgKyAoSU1NRUQgPDwgMik7Ci0gIEdQUltUUlhdID0gRVhURU5EMzIgKHRlbXApOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAwMDEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6QURESVVQQwotImFkZGl1IHI8VFJYPiwgUEMsIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIHVuc2lnbmVkMzIgdGVtcCA9IChiYXNlcGMgKFNEXykgJiB+MykgKyBFWFRFTkQxNiAoSU1NRURJQVRFKTsKLSAgR1BSW1RSWF0gPSBFWFRFTkQzMiAodGVtcCk7Ci19Ci0KLQotCi0wMDAwMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkFERElVU1AKLSJhZGRpdSByPFRSWD4sIFNQLCA8SU1NRUQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2FkZGl1IChTRF8sIFNQSURYLCBUUlgsIElNTUVEIDw8IDIpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAwMDAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6QURESVVTUAotImFkZGl1IHI8VFJYPiwgU1AsIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2FkZGl1IChTRF8sIFNQSURYLCBUUlgsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKLX0KLQotCi0KLTAxMDAwLDMuUlgsMy5SWSwxLDQuSU1NRUQ6UlJJLUE6MTY6OkRBRERJVQotImRhZGRpdSByPFRSWT4sIHI8VFJYPiwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kYWRkaXUgKFNEXywgVFJYLCBUUlksIEVYVEVORDQgKElNTUVEKSk7Ci19Ci0KLTExMTEwLDcuSU1NXzEwXzQsNC5JTU1fMTRfMTEgKyAwMTAwMCwzLlJYLDMuUlksMSw0LklNTV8zXzA6RVhULVJSSS1BOjE2OjpEQURESVUKLSJkYWRkaXUgcjxUUlk+LCByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RhZGRpdSAoU0RfLCBUUlgsIFRSWSwgRVhURU5EMTUgKElNTUVESUFURSkpOwotfQotCi0KLQotMTExMTEsMTAxLDMuUlksNS5JTU1FRDpSSTY0OjE2OjpEQURESVU1Ci0iZGFkZGl1IHI8VFJZPiwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kYWRkaXUgKFNEXywgVFJZLCBUUlksIEVYVEVORDUgKElNTUVEKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMTExMSwxMDEsMy5SWSw1LklNTV80XzA6RVhULVJJNjQ6MTY6OkRBRERJVTUKLSJkYWRkaXUgcjxUUlk+LCA8SU1NRURJQVRFPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kYWRkaXUgKFNEXywgVFJZLCBUUlksIEVYVEVORDE2IChJTU1FRElBVEUpKTsKLX0KLQotCi0KLTExMTExLDAxMSw4LklNTUVEOkk2NDoxNjo6REFESlNQCi0iZGFkZGl1IFNQLCA8SU1NRUQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RhZGRpdSAoU0RfLCBTUElEWCwgU1BJRFgsIEVYVEVORDggKElNTUVEKSA8PCAzKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDAxMSwwMDAsNS5JTU1fNF8wOkVYVC1JNjQ6MTY6OkRBREpTUAotImRhZGRpdSBTUCwgPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZGFkZGl1IChTRF8sIFNQSURYLCBTUElEWCwgRVhURU5EMTYgKElNTUVESUFURSkpOwotfQotCi0KLQotMTExMTEsMTEwLDMuUlksNS5JTU1FRDpSSTY0OjE2OjpEQURESVVQQwotImRhZGRpdSByPFRSWT4sIFBDLCA8SU1NRUQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIEdQUltUUlldID0gKGJhc2VwYyAoU0RfKSAmIH4zKSArIChJTU1FRCA8PCAyKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDExMCwzLlJZLDUuSU1NXzRfMDpFWFQtUkk2NDoxNjo6REFERElVUEMKLSJkYWRkaXUgcjxUUlk+LCBQQywgPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgR1BSW1RSWV0gPSAoYmFzZXBjIChTRF8pICYgfjMpICsgRVhURU5EMTYgKElNTUVESUFURSk7Ci19Ci0KLQotCi0xMTExMSwxMTEsMy5SWSw1LklNTUVEOlJJNjQ6MTY6OkRBRERJVVNQCi0iZGFkZGl1IHI8VFJZPiwgU1AsIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZGFkZGl1IChTRF8sIFNQSURYLCBUUlksIElNTUVEIDw8IDIpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMTExLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpEQURESVVTUAotImRhZGRpdSByPFRSWT4sIFNQLCA8SU1NRURJQVRFPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kYWRkaXUgKFNEXywgU1BJRFgsIFRSWSwgRVhURU5EMTYgKElNTUVESUFURSkpOwotfQotCi0KLQotMDEwMTAsMy5SWCw4LklNTUVEOlJJOjE2OjpTTFRJCi0ic2x0aSByPFRSWD4sIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc2x0aSAoU0RfLCBUUlgsIFQ4SURYLCBJTU1FRCk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTAxMCwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpTTFRJCi0ic2x0aSByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsdGkgKFNEXywgVFJYLCBUOElEWCwgSU1NRURJQVRFKTsKLX0KLQotCi0KLTAxMDExLDMuUlgsOC5JTU1FRDpSSToxNjo6U0xUSVUKLSJzbHRpdSByPFRSWD4sIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc2x0aXUgKFNEXywgVFJYLCBUOElEWCwgSU1NRUQpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDEwMTEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6U0xUSVUKLSJzbHRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsdGl1IChTRF8sIFRSWCwgVDhJRFgsIElNTUVESUFURSk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDMuUlksMDEwMTA6UlI6MTY6OkNNUAotInNsdGl1IHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3hvciAoU0RfLCBUUlgsIFRSWSwgVDhJRFgpOwotfQotCi0KLTAxMTEwLDMuUlgsOC5JTU1FRDpSSToxNjo6Q01QSQotInNsdGl1IHI8VFJYPiwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb194b3JpIChTRF8sIFRSWCwgVDhJRFgsIElNTUVEKTsKLX0KLQotMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTEwLDMuUlgsMDAwLDUuSU1NXzRfMDpFWFQtUkk6MTY6OkNNUEkKLSJzbHRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3hvcmkgKFNEXywgVFJYLCBUOElEWCwgSU1NRURJQVRFKTsKLX0KLQotCi0KLS8vIFR3by9UaHJlZSBPcGVyYW5kLCBSZWdpc3Rlci1UeXBlCi0KLQotCi0xMTEwMCwzLlJYLDMuUlksMy5SWiwwMTpSUlI6MTY6OkFERFUKLSJhZGR1IHI8VFJaPiwgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fYWRkdSAoU0RfLCBUUlgsIFRSWSwgVFJaKTsKLX0KLQotCi0KLTExMTAwLDMuUlgsMy5SWSwzLlJaLDExOlJSUjoxNjo6U1VCVQotInN1YnUgcjxUUlo+LCByPFRSWD4sIHI8VFJZPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zdWJ1IChTRF8sIFRSWCwgVFJZLCBUUlopOwotfQotCi0xMTEwMCwzLlJYLDMuUlksMy5SWiwwMDpSUlI6MTY6OkRBRERVCi0iZGFkZHUgcjxUUlo+LCByPFRSWD4sIHI8VFJZPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kYWRkdSAoU0RfLCBUUlgsIFRSWSwgVFJaKTsKLX0KLQotCi0KLTExMTAwLDMuUlgsMy5SWSwzLlJaLDEwOlJSUjoxNjo6RFNVQlUKLSJkc3VidSByPFRSWj4sIHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RzdWJ1IChTRF8sIFRSWCwgVFJZLCBUUlopOwotfQotCi0KLQotMTExMDEsMy5SWCwzLlJZLDAwMDEwOlJSOjE2OjpTTFQKLSJzbHQgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc2x0IChTRF8sIFRSWCwgVFJZLCBUOElEWCk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDMuUlksMDAwMTE6UlI6MTY6OlNMVFUKLSJzbHR1IHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsdHUgKFNEXywgVFJYLCBUUlksIFQ4SURYKTsKLX0KLQotCi0KLTExMTAxLDMuUlgsMy5SWSwwMTAxMTpSUjoxNjo6TkVHCi0ibmVnIHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3N1YnUgKFNEXywgMCwgVFJZLCBUUlgpOwotfQotCi0KLQotMTExMDEsMy5SWCwzLlJZLDAxMTAwOlJSOjE2OjpBTkQKLSJhbmQgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fYW5kIChTRF8sIFRSWCwgVFJZLCBUUlgpOwotfQotCi0KLQotMTExMDEsMy5SWCwzLlJZLDAxMTAxOlJSOjE2OjpPUgotIm9yIHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX29yIChTRF8sIFRSWCwgVFJZLCBUUlgpOwotfQotCi0KLQotMTExMDEsMy5SWCwzLlJZLDAxMTEwOlJSOjE2OjpYT1IKLSJ4b3IgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9feG9yIChTRF8sIFRSWCwgVFJZLCBUUlgpOwotfQotCi0KLQotMTExMDEsMy5SWCwzLlJZLDAxMTExOlJSOjE2OjpOT1QKLSJub3QgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fbm9yIChTRF8sIDAsIFRSWSwgVFJYKTsKLX0KLQotCi0KLTAxMTAwLDExMSwzLlJZLDUuUjMyOkk4X01PVlIzMjoxNjo6TU9WUjMyCi0ibW92ZSByPFRSWT4sIHI8UjMyPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19vciAoU0RfLCBSMzIsIDAsIFRSWSk7Ci19Ci0KLQotCi0wMTEwMCwxMDEsMy5SMzJMLDIuUjMySCwzLlJaOkk4X01PVjMyUjoxNjo6TU9WMzJSCi0ibW92ZSByPFIzMj4sIHI8VFJaPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19vciAoU0RfLCBUUlosIDAsIFIzMik7Ci19Ci0KLQotCi0wMDExMCwzLlJYLDMuUlksMy5TSEFNVCwwMDpTSElGVDoxNjo6U0xMCi0ic2xsIHI8VFJYPiwgcjxUUlk+LCA8U0hJRlQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsbCAoU0RfLCBUUlksIFRSWCwgU0hJRlQpOwotfQotCi0xMTExMCw1LlNIQU1ULDAsMDAwMDAgKyAwMDExMCwzLlJYLDMuUlksMDAwLDAwOkVYVC1TSElGVDoxNjo6U0xMCi0ic2xsIHI8VFJYPiwgcjxUUlk+LCA8U0hJRlQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsbCAoU0RfLCBUUlksIFRSWCwgU0hBTVQpOwotfQotCi0KLQotMDAxMTAsMy5SWCwzLlJZLDMuU0hBTVQsMTA6U0hJRlQ6MTY6OlNSTAotInNybCByPFRSWD4sIHI8VFJZPiwgPFNISUZUPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zcmwgKFNEXywgVFJZLCBUUlgsIFNISUZUKTsKLX0KLQotMTExMTAsNS5TSEFNVCwwLDAwMDAwICsgMDAxMTAsMy5SWCwzLlJZLDAwMCwxMDpFWFQtU0hJRlQ6MTY6OlNSTAotInNybCByPFRSWD4sIHI8VFJZPiwgPFNISUZUPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zcmwgKFNEXywgVFJZLCBUUlgsIFNIQU1UKTsKLX0KLQotCi0KLTAwMTEwLDMuUlgsMy5SWSwzLlNIQU1ULDExOlNISUZUOjE2OjpTUkEKLSJzcmEgcjxUUlg+LCByPFRSWT4sIDxTSElGVD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3JhIChTRF8sIFRSWSwgVFJYLCBTSElGVCk7Ci19Ci0KLTExMTEwLDUuU0hBTVQsMCwwMDAwMCArIDAwMTEwLDMuUlgsMy5SWSwwMDAsMTE6RVhULVNISUZUOjE2OjpTUkEKLSJzcmEgcjxUUlg+LCByPFRSWT4sIDxTSElGVD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3JhIChTRF8sIFRSWSwgVFJYLCBTSEFNVCk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDMuUlksMDAxMDA6UlI6MTY6OlNMTFYKLSJzbGx2IHI8VFJZPiwgcjxUUlg+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX3NsbHYgKFNEXywgVFJYLCBUUlksIFRSWSk7Ci19Ci0KLQotMTExMDEsMy5SWCwzLlJZLDAwMTEwOlJSOjE2OjpTUkxWCi0ic3JsdiByPFRSWT4sIHI8VFJYPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19zcmx2IChTRF8sIFRSWCwgVFJZLCBUUlkpOwotfQotCi0KLTExMTAxLDMuUlgsMy5SWSwwMDExMTpSUjoxNjo6U1JBVgotInNyYXYgcjxUUlk+LCByPFRSWD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fc3JhdiAoU0RfLCBUUlgsIFRSWSwgVFJZKTsKLX0KLQotCi0wMDExMCwzLlJYLDMuUlksMy5TSEFNVCwwMTpTSElGVDoxNjo6RFNMTAotImRzbGwgcjxUUlk+LCByPFRSWD4sIDxTSElGVD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZHNsbCAoU0RfLCBUUlksIFRSWCwgU0hJRlQpOwotfQotICAKLTExMTEwLDUuU0hBTVRfNF8wLDEuUzUsMDAwMDAgKyAwMDExMCwzLlJYLDMuUlksMDAwLDAxOkVYVC1TSElGVDoxNjo6RFNMTAotImRzbGwgcjxUUlk+LCByPFRSWD4sIDxTSEFNVD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZHNsbCAoU0RfLCBUUlksIFRSWCwgU0hBTVQpOwotfQotICAKLSAgCi0gIAotMTExMDEsMy5TSEFNVCwzLlJZLDAxMDAwOlNISUZUNjQ6MTY6OkRTUkwKLSJkc3JsIHI8VFJZPiwgPFNISUZUPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kc3JsIChTRF8sIFRSWSwgVFJZLCBTSElGVCk7Ci19Ci0KLTExMTEwLDUuU0hBTVRfNF8wLDEuUzUsMDAwMDAgKyAxMTEwMSwwMDAsMy5SWSwwMTAwMDpFWFQtU0hJRlQ2NDoxNjo6RFNSTAotImRzcmwgcjxUUlk+LCA8U0hBTVQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RzcmwgKFNEXywgVFJZLCBUUlksIFNIQU1UKTsKLX0KLQotCi0KLTExMTAxLDMuU0hBTVQsMy5SWSwxMDAxMTpTSElGVDY0OjE2OjpEU1JBCi0iZHNyYSByPFRSWT4sIDxTSElGVD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZHNyYSAoU0RfLCBUUlksIFRSWSwgU0hJRlQpOwotfQotCi0xMTExMCw1LlNIQU1UXzRfMCwxLlM1LDAwMDAwICsgMTExMDEsMDAwLDMuUlksMTAwMTE6RVhULVNISUZUNjQ6MTY6OkRTUkEKLSJkc3JhIHI8VFJZPiwgPFNIQU1UPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kc3JhIChTRF8sIFRSWSwgVFJZLCBTSEFNVCk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDMuUlksMTAxMDA6UlI6MTY6OkRTTExWCi0iZHNsbHYgcjxUUlk+LCByPFRSWD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZHNsbHYgKFNEXywgVFJYLCBUUlksIFRSWSk7Ci19Ci0KLQotMTExMDEsMy5SWCwzLlJZLDEwMTEwOlJSOjE2OjpEU1JMVgotImRzcmx2IHI8VFJZPiwgcjxUUlg+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2Rzcmx2IChTRF8sIFRSWCwgVFJZLCBUUlkpOwotfQotCi0KLTExMTAxLDMuUlgsMy5SWSwxMDExMTpSUjoxNjo6RFNSQVYKLSJkc3JhdiByPFRSWT4sIHI8VFJYPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kc3JhdiAoU0RfLCBUUlgsIFRSWSwgVFJZKTsKLX0KLQotCi0vLyBNdWx0aXBseSAvRGl2aWRlIEluc3RydWN0aW9ucwotCi0KLTExMTAxLDMuUlgsMy5SWSwxMTAwMDpSUjoxNjo6TVVMVAotIm11bHQgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fbXVsdCAoU0RfLCBUUlgsIFRSWSwgMCk7Ci19Ci0KLQotMTExMDEsMy5SWCwzLlJZLDExMDAxOlJSOjE2OjpNVUxUVQotIm11bHR1IHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX211bHR1IChTRF8sIFRSWCwgVFJZLCAwKTsKLX0KLQotCi0xMTEwMSwzLlJYLDMuUlksMTEwMTA6UlI6MTY6OkRJVgotImRpdiByPFRSWD4sIHI8VFJZPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kaXYgKFNEXywgVFJYLCBUUlkpOwotfQotCi0KLTExMTAxLDMuUlgsMy5SWSwxMTAxMTpSUjoxNjo6RElWVQotImRpdnUgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZGl2dSAoU0RfLCBUUlgsIFRSWSk7Ci19Ci0KLQotMTExMDEsMy5SWCwwMDAsMTAwMDA6UlI6MTY6Ok1GSEkKLSJtZmhpIHI8VFJYPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19tZmhpIChTRF8sIFRSWCk7Ci19Ci0KLQotMTExMDEsMy5SWCwwMDAsMTAwMTA6UlI6MTY6Ok1GTE8KLSJtZmxvIHI8VFJYPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19tZmxvIChTRF8sIFRSWCk7Ci19Ci0KLQotMTExMDEsMy5SWCwzLlJZLDExMTAwOlJSOjE2OjpETVVMVAotImRtdWx0IHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RtdWx0IChTRF8sIFRSWCwgVFJZLCAwKTsKLX0KLQotCi0xMTEwMSwzLlJYLDMuUlksMTExMDE6UlI6MTY6OkRNVUxUVQotImRtdWx0dSByPFRSWD4sIHI8VFJZPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBkb19kbXVsdHUgKFNEXywgVFJYLCBUUlksIDApOwotfQotCi0KLTExMTAxLDMuUlgsMy5SWSwxMTExMDpSUjoxNjo6RERJVgotImRkaXYgcjxUUlg+LCByPFRSWT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgZG9fZGRpdiAoU0RfLCBUUlgsIFRSWSk7Ci19Ci0KLQotMTExMDEsMy5SWCwzLlJZLDExMTExOlJSOjE2OjpERElWVQotImRkaXZ1IHI8VFJYPiwgcjxUUlk+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGRvX2RkaXZ1IChTRF8sIFRSWCwgVFJZKTsKLX0KLQotCi0vLyBKdW1wIGFuZCBCcmFuY2ggSW5zdHJ1Y3Rpb25zCi0KLQotCi0vLyBJc3N1ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IG9mIGJyYW5jaAotOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmRlbGF5c2xvdDE2OmFkZHJlc3Nfd29yZCBuaWEsIGFkZHJlc3Nfd29yZCB0YXJnZXQKLXsKLSAgaW5zdHJ1Y3Rpb25fd29yZCBkZWxheV9pbnNuOwotICBzaW1fZXZlbnRzX3NsaXAgKFNELCAxKTsKLSAgRFNQQyA9IENJQTsgLyogc2F2ZSBjdXJyZW50IFBDIHNvbWV3aGVyZSAqLwotICBTVEFURSB8PSBzaW1ERUxBWVNMT1Q7Ci0gIGRlbGF5X2luc24gPSBJTUVNMTYgKG5pYSk7IC8qIE5PVEU6IG1pcHMxNiAqLwotICBpZGVjb2RlX2lzc3VlIChDUFVfLCBkZWxheV9pbnNuLCAobmlhKSk7Ci0gIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0gIAotLy8gY29tcHV0ZSBiYXNlcGMgZGVwZW5kYW50IG9uIHVzIGJlaW5nIGluIGEgZGVsYXkgc2xvdAotOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmJhc2VwYzoKLXsKLSAgaWYgKFNUQVRFICYgc2ltREVMQVlTTE9UKQotICAgIHsKLSAgICAgIHJldHVybiBEU1BDOyAvKiByZXR1cm4gc2F2ZWQgYWRkcmVzcyBvZiBwcmVjZWVkaW5nIGptcCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBDSUE7Ci0gICAgfQotfQotCi0KLS8vIEpBTAotMDAwMTEsMCw1LklNTV8yMF8xNiw1LklNTV8yNV8yMSArIDE2LklNTUVEXzE1XzA6SkFMOjE2OjpKQUwKLSJqYWwgPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgYWRkcmVzc193b3JkIHJlZ2lvbiA9IChOSUEgJiBNQVNLICg2MywgMjgpKTsKLSAgUkEgPSBOSUEgKyAyOyAvKiBza2lwIDE2IGJpdCBkZWxheXNsb3QgaW5zbiAqLwotICBOSUEgPSBkZWxheXNsb3QxNiAoU0RfLCBOSUEsIChyZWdpb24gfCAoSU1NRURJQVRFIDw8IDIpKSkgfCAxOwotfQotCi0KLQotLy8gSkFMWCAtIDMyIGFuZCAxNiBiaXQgdmVyc2lvbnMuCi0KLTAxMTEwMSwyNi5JTU1FRDpKQUxYOjMyOjpKQUxYMzIKLSJqYWx4IDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgYWRkcmVzc193b3JkIHJlZ2lvbiA9IChOSUEgJiBNQVNLICg2MywgMjgpKTsKLSAgUkEgPSBOSUEgKyA0OyAvKiBza2lwIDMyIGJpdCBkZWxheXNsb3QgaW5zbiAqLwotICBOSUEgPSBkZWxheXNsb3QzMiAoU0RfLCAocmVnaW9uIHwgKElNTUVEIDw8IDIpKSB8IDEpOwotfQotCi0wMDAxMSwxLDUuSU1NXzIwXzE2LDUuSU1NXzI1XzIxICsgMTYuSU1NRURfMTVfMDpKQUxYOjE2OjpKQUxYMTYKLSJqYWx4IDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGFkZHJlc3Nfd29yZCByZWdpb24gPSAoTklBICYgTUFTSyAoNjMsIDI4KSk7Ci0gIFJBID0gTklBICsgMjsgLyogMTYgYml0IElOU04gKi8KLSAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCAocmVnaW9uIHwgKElNTUVESUFURSA8PCAyKSkgJiB+MSk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDAwMCwwMDAwMDpSUjoxNjo6SlIKLSJqciByPFRSWD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBHUFJbVFJYXSk7Ci19Ci0KLQotMTExMDEsMDAwLDAwMSwwMDAwMDpSUjoxNjo6SlJSQQotImpycmEiCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBSQSk7Ci19Ci0KLQotCi0xMTEwMSwzLlJYLDAxMCwwMDAwMDpSUjoxNjo6SkFMUgotImphbHIgcjxUUlg+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIFJBID0gTklBICsgMjsKLSAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBHUFJbVFJYXSk7Ci19Ci0KLQotCi0wMDEwMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkJFUVoKLSJiZXF6IHI8VFJYPiwgPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBpZiAoR1BSW1RSWF0gPT0gMCkKLSAgICBOSUEgPSAoTklBICsgKEVYVEVORDggKElNTUVEKSA8PCAxKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMDEwMCwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpCRVFaCi0iYmVxeiByPFRSWD4sIDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGlmIChHUFJbVFJYXSA9PSAwKQotICAgIE5JQSA9IChOSUEgKyAoRVhURU5EMTYgKElNTUVESUFURSkgPDwgMSkpOwotfQotCi0KLQotMDAxMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpCTkVaCi0iYm5leiByPFRSWD4sIDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgaWYgKEdQUltUUlhdICE9IDApCi0gICAgTklBID0gKE5JQSArIChFWFRFTkQ4IChJTU1FRCkgPDwgMSkpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAxMDEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6Qk5FWgotImJuZXogcjxUUlg+LCA8SU1NRURJQVRFPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBpZiAoR1BSW1RSWF0gIT0gMCkKLSAgICBOSUEgPSAoTklBICsgKEVYVEVORDE2IChJTU1FRElBVEUpIDw8IDEpKTsKLX0KLQotCi0KLTAxMTAwLDAwMCw4LklNTUVEOkk4OjE2OjpCVEVRWgotImJ0ZXF6IDxJTU1FRD4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgaWYgKFQ4ID09IDApCi0gICAgTklBID0gKE5JQSArIChFWFRFTkQ4IChJTU1FRCkgPDwgMSkpOwotfQotCi0xMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDExMDAsMDAwLDAwMCw1LklNTV80XzA6RVhULUk4OjE2OjpCVEVRWgotImJ0ZXF6IDxJTU1FRElBVEU+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIGlmIChUOCA9PSAwKQotICAgIE5JQSA9IChOSUEgKyAoRVhURU5EMTYgKElNTUVESUFURSkgPDwgMSkpOwotfQotCi0KLQotMDExMDAsMDAxLDguSU1NRUQ6STg6MTY6OkJUTkVaCi0iYnRuZXogPElNTUVEPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBpZiAoVDggIT0gMCkKLSAgICBOSUEgPSAoTklBICsgKEVYVEVORDggKElNTUVEKSA8PCAxKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTEwMCwwMDEsMDAwLDUuSU1NXzRfMDpFWFQtSTg6MTY6OkJUTkVaCi0iYnRuZXogPElNTUVESUFURT4iCi0qbWlwczE2OgotKnZyNDEwMDoKLXsKLSAgaWYgKFQ4ICE9IDApCi0gICAgTklBID0gKE5JQSArIChFWFRFTkQxNiAoSU1NRURJQVRFKSA8PCAxKSk7Ci19Ci0KLQotCi0wMDAxMCwxMS5JTU1FRDpJOjE2OjpCCi0iYiA8SU1NRUQ+IgotKm1pcHMxNjoKLSp2cjQxMDA6Ci17Ci0gIE5JQSA9IChOSUEgKyAoRVhURU5EMTEgKElNTUVEKSA8PCAxKSk7Ci19Ci0KLTExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMDAxMCw2LjAsNS5JTU1fNF8wOkVYVC1JOjE2OjpCCi0iYiA8SU1NRURJQVRFPiIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBOSUEgPSAoTklBICsgKEVYVEVORDE2IChJTU1FRElBVEUpIDw8IDEpKTsKLX0KLQotCi0KLTExMTAxLDMuUlgsMy5SWSwwMDEwMTpSUjoxNjo6QlJFQUsKLSJicmVhayIKLSptaXBzMTY6Ci0qdnI0MTAwOgotewotICBpZiAoU1RBVEUgJiBzaW1ERUxBWVNMT1QpCi0gICAgUEMgPSBjaWEgLSAyOyAvKiByZWZlcmVuY2UgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiAqLwotICBlbHNlCi0gICAgUEMgPSBjaWE7Ci0gIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotfQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvbTE2cnVuLmMgYi9zaW0vbWlwcy9tMTZydW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1ZDYwNy4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy9tMTZydW4uYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAibTE2X2lkZWNvZGUuaCIKLSNpbmNsdWRlICJtMzJfaWRlY29kZS5oIgotI2luY2x1ZGUgImJmZC5oIgotCi0KLSNkZWZpbmUgU0Qgc2QKLSNkZWZpbmUgQ1BVIGNwdQotCi12b2lkCi1zaW1fZW5naW5lX3J1biAoU0lNX0RFU0Mgc2QsCi0JCWludCBuZXh0X2NwdV9uciwKLQkJaW50IG5yX2NwdXMsIC8qIGlnbm9yZSAqLwotCQlpbnQgc2lnZ25hbCkgLyogaWdub3JlICovCi17Ci0gIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIG5leHRfY3B1X25yKTsKLSAgYWRkcmVzc193b3JkIGNpYSA9IENJQV9HRVQgKGNwdSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIG5pYTsKLQotI2lmIGRlZmluZWQgKEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSykKLSAgICAgIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSyAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAoKGNpYSAmIDEpKQotCXsKLQkgIG0xNl9pbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uXzAgPSBJTUVNMTYgKGNpYSk7Ci0JICBuaWEgPSBtMTZfaWRlY29kZV9pc3N1ZSAoc2QsIGluc3RydWN0aW9uXzAsIGNpYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG0zMl9pbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uXzAgPSBJTUVNMzIgKGNpYSk7Ci0JICBuaWEgPSBtMzJfaWRlY29kZV9pc3N1ZSAoc2QsIGluc3RydWN0aW9uXzAsIGNpYSk7Ci0JfQotCi0jaWYgZGVmaW5lZCAoRU5HSU5FX0lTU1VFX1BPU1RGSVhfSE9PSykKLSAgICAgIEVOR0lORV9JU1NVRV9QT1NURklYX0hPT0sgKCk7Ci0jZW5kaWYKLQotICAgICAgLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0gICAgICBjaWEgPSBuaWE7Ci0KLSAgICAgIC8qIHByb2Nlc3MgYW55IGV2ZW50cyAqLwotICAgICAgaWYgKHNpbV9ldmVudHNfdGljayAoc2QpKQotICAgICAgICB7Ci0gICAgICAgICAgQ0lBX1NFVCAoQ1BVLCBjaWEpOwotICAgICAgICAgIHNpbV9ldmVudHNfcHJvY2VzcyAoc2QpOwotCSAgY2lhID0gQ0lBX0dFVCAoQ1BVKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvbWlwcy5kYyBiL3NpbS9taXBzL21pcHMuZGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGEwMjQuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvbWlwcy5kYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgbW9zdCBpbnN0cnVjdGlvbnMKLSMgLS0tLS0tIG9wdGlvbnMgLS0tLS0tIDogRnN0IDogTHN0IDogZmYgOiBmbCA6IGZlIDogd29yZCA6IC0tLSBmbXQgLS0tIDogbW9kZWwgLi4uCi0jIHsgOiBtYXNrIDogdmFsdWUgOiB3b3JkIH0KLQotIyBUb3AgbGV2ZWwgLSBjcmVhdGUgYSB2ZXJ5IGJpZyBzd2l0Y2ggc3RhdGVtZW50LgotCi0gIHBhZGRlZC1zd2l0Y2gsY29tYmluZSA6ICAzMSA6ICAyNiA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6Ci0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA1IDogICAwIDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKLQotICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgMjAgOiAgMTYgOiAgICA6ICAgIDogICAgOiAgICAgIDogICAgICAgICAgICAgOgotCi0gIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAyNSA6ICAyMSA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6Ci0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogIDEwIDogICA2IDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKLQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvbWlwcy5pZ2VuIGIvc2ltL21pcHMvbWlwcy5pZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVlODNhLi4wMDAwMDAwCi0tLSBhL3NpbS9taXBzL21pcHMuaWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDM5NDAgKzAsMCBAQAotLy8gLSotIEMgLSotCi0vLwotLy8gSW4gbWlwcy5pZ2VuLCB0aGUgc2VtYW50aWNzIGZvciBtYW55IG9mIHRoZSBpbnN0cnVjdGlvbnMgd2VyZSBjcmVhdGVkCi0vLyB1c2luZyBjb2RlIGdlbmVyYXRlZCBieSBnZW5jb2RlLiAgVGhvc2Ugc2VtYW50aWMgc2VnbWVudHMgY291bGQgYmUKLS8vIGdyZWF0bHkgc2ltcGxpZmllZC4KLS8vCi0vLyAgICA8aW5zbj4gOjo9Ci0vLyAgICAgICAgPGluc24td29yZD4geyAiKyIgPGluc24td29yZD4gfQotLy8gICAgICAgICI6IiA8Zm9ybWF0LW5hbWU+Ci0vLyAgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+Ci0vLyAgICAgICAgIjoiIDxvcHRpb25zPgotLy8gICAgICAgICI6IiA8bmFtZT4KLS8vICAgICAgICA8bmw+Ci0vLyAgICAgICAgeyA8aW5zbi1tb2RlbD4gfQotLy8gICAgICAgIHsgPGluc24tbW5lbW9uaWM+IH0KLS8vICAgICAgICA8Y29kZS1ibG9jaz4KLS8vCi0KLQotLy8gSUdFTiBjb25maWcgLSBtaXBzMTYKLS8vIDpvcHRpb246MTY6Omluc24tYml0LXNpemU6MTYKLS8vIDpvcHRpb246MTY6OmhpLWJpdC1ucjoxNQotOm9wdGlvbjoxNjo6aW5zbi1zcGVjaWZ5aW5nLXdpZHRoczp0cnVlCi06b3B0aW9uOjE2OjpnZW4tZGVsYXllZC1icmFuY2g6ZmFsc2UKLQotLy8gSUdFTiBjb25maWcgLSBtaXBzMzIvNjQuLgotLy8gOm9wdGlvbjozMjo6aW5zbi1iaXQtc2l6ZTozMgotLy8gOm9wdGlvbjozMjo6aGktYml0LW5yOjMxCi06b3B0aW9uOjMyOjppbnNuLXNwZWNpZnlpbmctd2lkdGhzOnRydWUKLTpvcHRpb246MzI6Omdlbi1kZWxheWVkLWJyYW5jaDpmYWxzZQotCi0KLS8vIEdlbmVyYXRlIHNlcGFyYXRlIHNpbXVsYXRvcnMgZm9yIGVhY2ggdGFyZ2V0Ci0vLyA6b3B0aW9uOjo6bXVsdGktc2ltOnRydWUKLQotCi0vLyBNb2RlbHMga25vd24gYnkgdGhpcyBzaW11bGF0b3IKLTptb2RlbDo6Om1pcHNJOm1pcHMzMDAwOgotOm1vZGVsOjo6bWlwc0lJOm1pcHM2MDAwOgotOm1vZGVsOjo6bWlwc0lJSTptaXBzNDAwMDoKLTptb2RlbDo6Om1pcHNJVjptaXBzODAwMDoKLTptb2RlbDo6Om1pcHMxNjptaXBzMTY6Ci06bW9kZWw6OjpyMzkwMDptaXBzMzkwMDoKLTptb2RlbDo6OnZyNDEwMDptaXBzNDEwMDoKLTptb2RlbDo6OnZyNTAwMDptaXBzNTAwMDoKLQotCi0KLS8vIFBzZXVkbyBpbnN0cnVjdGlvbnMga25vd24gYnkgSUdFTgotOmludGVybmFsOjo6OmlsbGVnYWw6Ci17Ci0gIFNpZ25hbEV4Y2VwdGlvbiAoUmVzZXJ2ZWRJbnN0cnVjdGlvbiwgMCk7Ci19Ci0KLQotLy8gUHNldWRvIGluc3RydWN0aW9ucyBrbm93biBieSBpbnRlcnAuYwotLy8gRm9yIGdyZXAgLSBSU1ZEX0lOU1RSVUNUSU9OLCBSU1ZEX0lOU1RSVUNUSU9OX01BU0sKLTAwMDAwMCw1LiosNS4qLDUuKiw1Lk9QLDAwMDEwMTpTUEVDSUFMOjMyOjpSU1ZECi0icnN2ZCA8T1A+IgotewotICBTaWduYWxFeGNlcHRpb24gKFJlc2VydmVkSW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uXzApOwotfQotCi0KLQotLy8gSGVscGVyOgotLy8KLS8vIFNpbXVsYXRlIGEgMzIgYml0IGRlbGF5c2xvdCBpbnN0cnVjdGlvbgotLy8KLQotOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmRlbGF5c2xvdDMyOmFkZHJlc3Nfd29yZCB0YXJnZXQKLXsKLSAgaW5zdHJ1Y3Rpb25fd29yZCBkZWxheV9pbnNuOwotICBzaW1fZXZlbnRzX3NsaXAgKFNELCAxKTsKLSAgRFNQQyA9IENJQTsKLSAgQ0lBID0gQ0lBICsgNDsgLyogTk9URSBub3QgbWlwczE2ICovCi0gIFNUQVRFIHw9IHNpbURFTEFZU0xPVDsKLSAgZGVsYXlfaW5zbiA9IElNRU0zMiAoQ0lBKTsgLyogTk9URSBub3QgbWlwczE2ICovCi0gIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSygpOwotICBpZGVjb2RlX2lzc3VlIChDUFVfLCBkZWxheV9pbnNuLCAoQ0lBKSk7Ci0gIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLTpmdW5jdGlvbjo6OmFkZHJlc3Nfd29yZDpudWxsaWZ5X25leHRfaW5zbjMyOgotewotICBzaW1fZXZlbnRzX3NsaXAgKFNELCAxKTsKLSAgZG90cmFjZSAoU0QsIENQVSwgdHJhY2VmaCwgMiwgQ0lBICsgNCwgNCwgImxvYWQgaW5zdHJ1Y3Rpb24iKTsKLSAgcmV0dXJuIENJQSArIDg7Ci19Ci0KLS8vIEhlbHBlcjoKLS8vIAotLy8gQ2hlY2sgdGhhdCBhbiBhY2Nlc3MgdG8gYSBISS9MTyByZWdpc3RlciBtZWV0cyB0aW1pbmcgcmVxdWlyZW1lbnRzCi0vLwotLy8gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZXhpc3Q6Ci0vLwotLy8gICAtICBBIE1UIHtISSxMT30gdXBkYXRlIHdhcyBub3QgaW1tZWRpYXRseSBwcmVjZWVkZWQgYnkgYSBNRiB7SEksTE99IHJlYWQKLS8vICAgLSAgQSBPUCB7SEksTE99IHVwZGF0ZSB3YXMgbm90IGltbWVkaWF0bHkgcHJlY2VlZGVkIGJ5IGEgTUYge0hJLExPfSByZWFkCi0vLyAgIC0gIEEgTUYge0hJLExPfSByZWFkIHdhcyBub3QgY29ycnVwdGVkIGJ5IGEgcHJlY2VlZGluZyBNVHtMTyxISX0gdXBkYXRlCi0vLyAgICAgIGNvcnJ1cHRpb24gb2NjdXJlcyB3aGVuIE1Ue0xPLEhJfSBpcyBwcmVjZWVkZWQgYnkgYSBPUCB7SEksTE99LgotLy8KLQotOmZ1bmN0aW9uOjo6aW50OmNoZWNrX21mX2N5Y2xlczpoaWxvX2hpc3RvcnkgKmhpc3RvcnksIHNpZ25lZDY0IHRpbWUsIGNvbnN0IGNoYXIgKm5ldwotewotICBpZiAoaGlzdG9yeS0+bWYudGltZXN0YW1wICsgMyA+IHRpbWUpCi0gICAgewotICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgQ0lBLCAiSElMTzogJXM6ICVzIGF0IDB4JTA4bHggdG9vIGNsb3NlIHRvIE1GIGF0IDB4JTA4bHhcbiIsCi0JCQlpdGFibGVbTVlfSU5ERVhdLm5hbWUsCi0JCQluZXcsIChsb25nKSBDSUEsCi0JCQkobG9uZykgaGlzdG9yeS0+bWYuY2lhKTsgICAgICAKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLTpmdW5jdGlvbjo6OmludDpjaGVja19tdF9oaWxvOmhpbG9faGlzdG9yeSAqaGlzdG9yeQotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBzaWduZWQ2NCB0aW1lID0gc2ltX2V2ZW50c190aW1lIChTRCk7Ci0gIGludCBvayA9IGNoZWNrX21mX2N5Y2xlcyAoU0RfLCBoaXN0b3J5LCB0aW1lLCAiTVQiKTsKLSAgaGlzdG9yeS0+bXQudGltZXN0YW1wID0gdGltZTsKLSAgaGlzdG9yeS0+bXQuY2lhID0gQ0lBOwotICByZXR1cm4gb2s7Ci19Ci0KLTpmdW5jdGlvbjo6OmludDpjaGVja19tdF9oaWxvOmhpbG9faGlzdG9yeSAqaGlzdG9yeQotKnIzOTAwOgotewotICBzaWduZWQ2NCB0aW1lID0gc2ltX2V2ZW50c190aW1lIChTRCk7Ci0gIGhpc3RvcnktPm10LnRpbWVzdGFtcCA9IHRpbWU7Ci0gIGhpc3RvcnktPm10LmNpYSA9IENJQTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6aW50OmNoZWNrX21mX2hpbG86aGlsb19oaXN0b3J5ICpoaXN0b3J5LCBoaWxvX2hpc3RvcnkgKnBlZXIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgc2lnbmVkNjQgdGltZSA9IHNpbV9ldmVudHNfdGltZSAoU0QpOwotICBpbnQgb2sgPSAxOwotICBpZiAocGVlciAhPSBOVUxMCi0gICAgICAmJiBwZWVyLT5tdC50aW1lc3RhbXAgPiBoaXN0b3J5LT5vcC50aW1lc3RhbXAKLSAgICAgICYmIGhpc3RvcnktPm10LnRpbWVzdGFtcCA8IGhpc3RvcnktPm9wLnRpbWVzdGFtcAotICAgICAgJiYgISAoaGlzdG9yeS0+bWYudGltZXN0YW1wID4gaGlzdG9yeS0+b3AudGltZXN0YW1wCi0JICAgICYmIGhpc3RvcnktPm1mLnRpbWVzdGFtcCA8IHBlZXItPm10LnRpbWVzdGFtcCkKLSAgICAgICYmICEgKHBlZXItPm1mLnRpbWVzdGFtcCA+IGhpc3RvcnktPm9wLnRpbWVzdGFtcAotCSAgICAmJiBwZWVyLT5tZi50aW1lc3RhbXAgPCBwZWVyLT5tdC50aW1lc3RhbXApKQotICAgIHsKLSAgICAgIC8qIFRoZSBwZWVyIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgdGhlIGxhc3QgT1AgeWV0IHdlIGhhdmUKLSAgICAgICAgIG5vdCAqLwotICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgQ0lBLCAiSElMTzogJXM6IE1GIGF0IDB4JTA4bHggZm9sbG93aW5nIE9QIGF0IDB4JTA4bHggY29ycnVwdGVkIGJ5IE1UIGF0IDB4JTA4bHhcbiIsCi0JCQlpdGFibGVbTVlfSU5ERVhdLm5hbWUsCi0JCQkobG9uZykgQ0lBLAotCQkJKGxvbmcpIGhpc3RvcnktPm9wLmNpYSwKLQkJCShsb25nKSBwZWVyLT5tdC5jaWEpOyAgICAgIAotICAgICAgb2sgPSAwOwotICAgIH0KLSAgaGlzdG9yeS0+bWYudGltZXN0YW1wID0gdGltZTsKLSAgaGlzdG9yeS0+bWYuY2lhID0gQ0lBOwotICByZXR1cm4gb2s7Ci19Ci0KLQotCi06ZnVuY3Rpb246OjppbnQ6Y2hlY2tfbXVsdF9oaWxvOmhpbG9faGlzdG9yeSAqaGksIGhpbG9faGlzdG9yeSAqbG8KLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgc2lnbmVkNjQgdGltZSA9IHNpbV9ldmVudHNfdGltZSAoU0QpOwotICBpbnQgb2sgPSAoY2hlY2tfbWZfY3ljbGVzIChTRF8sIGhpLCB0aW1lLCAiT1AiKQotCSAgICAmJiBjaGVja19tZl9jeWNsZXMgKFNEXywgbG8sIHRpbWUsICJPUCIpKTsKLSAgaGktPm9wLnRpbWVzdGFtcCA9IHRpbWU7Ci0gIGxvLT5vcC50aW1lc3RhbXAgPSB0aW1lOwotICBoaS0+b3AuY2lhID0gQ0lBOwotICBsby0+b3AuY2lhID0gQ0lBOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIFRoZSByMzkwMCBtdWx0IGFuZCBtdWx0dSBpbnNucyBfY2FuXyBiZSBleGVjdHV0ZWQgaW1tZWRpYXRseSBhZnRlcgotLy8gYSBtZntoaSxsb30KLTpmdW5jdGlvbjo6OmludDpjaGVja19tdWx0X2hpbG86aGlsb19oaXN0b3J5ICpoaSwgaGlsb19oaXN0b3J5ICpsbwotKnIzOTAwOgotewotICAvKiBGSVhNRTogY291bGQgcmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzdGFsbCBvY2N1cmVkIGlmIHdlIHdhbnQgKi8KLSAgc2lnbmVkNjQgdGltZSA9IHNpbV9ldmVudHNfdGltZSAoU0QpOwotICBoaS0+b3AudGltZXN0YW1wID0gdGltZTsKLSAgbG8tPm9wLnRpbWVzdGFtcCA9IHRpbWU7Ci0gIGhpLT5vcC5jaWEgPSBDSUE7Ci0gIGxvLT5vcC5jaWEgPSBDSUE7Ci0gIHJldHVybiAxOwotfQotCi0KLTpmdW5jdGlvbjo6OmludDpjaGVja19kaXZfaGlsbzpoaWxvX2hpc3RvcnkgKmhpLCBoaWxvX2hpc3RvcnkgKmxvCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHNpZ25lZDY0IHRpbWUgPSBzaW1fZXZlbnRzX3RpbWUgKFNEKTsKLSAgaW50IG9rID0gKGNoZWNrX21mX2N5Y2xlcyAoU0RfLCBoaSwgdGltZSwgIk9QIikKLQkgICAgJiYgY2hlY2tfbWZfY3ljbGVzIChTRF8sIGxvLCB0aW1lLCAiT1AiKSk7Ci0gIGhpLT5vcC50aW1lc3RhbXAgPSB0aW1lOwotICBsby0+b3AudGltZXN0YW1wID0gdGltZTsKLSAgaGktPm9wLmNpYSA9IENJQTsKLSAgbG8tPm9wLmNpYSA9IENJQTsKLSAgcmV0dXJuIG9rOwotfQotCi0KLQotCi0KLS8vCi0vLyBNaXBzIEFyY2hpdGVjdHVyZToKLS8vCi0vLyAgICAgICAgQ1BVIEluc3RydWN0aW9uIFNldCAobWlwc0kgLSBtaXBzSVYpCi0vLwotCi0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwLDEwMDAwMDpTUEVDSUFMOjMyOjpBREQKLSJhZGQgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgR1BSW1JUXSk7Ci0gIHsKLSAgICBBTFUzMl9CRUdJTiAoR1BSW1JTXSk7Ci0gICAgQUxVMzJfQUREIChHUFJbUlRdKTsKLSAgICBBTFUzMl9FTkQgKEdQUltSRF0pOwotICB9Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSRF0pOwotfQotCi0KLQotMDAxMDAwLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjMyOjpBRERJCi0iYWRkaSByPFJUPiwgcjxSUz4sIElNTUVESUFURSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgRVhURU5EMTYgKElNTUVESUFURSkpOwotICB7Ci0gICAgQUxVMzJfQkVHSU4gKEdQUltSU10pOwotICAgIEFMVTMyX0FERCAoRVhURU5EMTYgKElNTUVESUFURSkpOwotICAgIEFMVTMyX0VORCAoR1BSW1JUXSk7Ci0gIH0KLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JUXSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2FkZGl1OmludCBycywgaW50IHJ0LCB1bnNpZ25lZDE2IGltbWVkaWF0ZQotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBFWFRFTkQxNiAoaW1tZWRpYXRlKSk7Ci0gIEdQUltydF0gPSBFWFRFTkQzMiAoR1BSW3JzXSArIEVYVEVORDE2IChpbW1lZGlhdGUpKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3J0XSk7Ci19Ci0KLTAwMTAwMSw1LlJTLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6QURESVUKLSJhZGRpdSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19hZGRpdSAoU0RfLCBSUywgUlQsIElNTUVESUFURSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2FkZHU6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgR1BSW3JkXSA9IEVYVEVORDMyIChHUFJbcnNdICsgR1BSW3J0XSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAwMDAxOlNQRUNJQUw6MzI6OkFERFUKLSJhZGR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX2FkZHUgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2FuZDppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOwotICBHUFJbcmRdID0gR1BSW3JzXSAmIEdQUltydF07Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAwMTAwOlNQRUNJQUw6MzI6OkFORAotImFuZCByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19hbmQgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLQotCi0wMDExMDAsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6MzI6OkFOREkKLSJhbmQgcjxSVD4sIHI8UlM+LCA8SU1NRURJQVRFPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgSU1NRURJQVRFKTsKLSAgR1BSW1JUXSA9IEdQUltSU10gJiBJTU1FRElBVEU7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSVF0pOwotfQotCi0KLQotMDAwMTAwLDUuUlMsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpCRVEKLSJiZXEgcjxSUz4sIHI8UlQ+LCA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPT0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLX0KLQotCi0KLTAxMDEwMCw1LlJTLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6QkVRTAotImJlcWwgcjxSUz4sIHI8UlQ+LCA8T0ZGU0VUPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPT0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDAwMSw1LlJTLDAwMDAxLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJHRVoKLSJiZ2V6IHI8UlM+LCA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPj0gMCkKLSAgICB7Ci0gICAgICBtYXJrX2JyYW5jaF9idWcgKE5JQStvZmZzZXQpOwotICAgICAgREVMQVlfU0xPVCAoTklBICsgb2Zmc2V0KTsKLSAgICB9Ci19Ci0KLQotCi0wMDAwMDEsNS5SUyEzMSwxMDAwMSwxNi5PRkZTRVQ6UkVHSU1NOjMyOjpCR0VaQUwKLSJiZ2V6YWwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgUkEgPSAoQ0lBICsgOCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPj0gMCkKLSAgICB7Ci0gICAgICBtYXJrX2JyYW5jaF9idWcgKE5JQStvZmZzZXQpOwotICAgICAgREVMQVlfU0xPVCAoTklBICsgb2Zmc2V0KTsKLSAgICB9Ci19Ci0KLQotCi0wMDAwMDEsNS5SUyEzMSwxMDAxMSwxNi5PRkZTRVQ6UkVHSU1NOjMyOjpCR0VaQUxMCi0iYmdlemFsbCByPFJTPiwgPE9GRlNFVD4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOwotICBjaGVja19icmFuY2hfYnVnICgpOwotICBSQSA9IChDSUEgKyA4KTsKLSAgLyogTk9URTogVGhlIGJyYW5jaCBvY2N1cnMgQUZURVIgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4KLSAgICAgZXhlY3V0ZWQgKi8KLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDAwMSw1LlJTLDAwMDExLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJHRVpMCi0iYmdlemwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDExMSw1LlJTLDAwMDAwLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkJHVFoKLSJiZ3R6IHI8UlM+LCA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPiAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLX0KLQotCi0KLTAxMDExMSw1LlJTLDAwMDAwLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkJHVFpMCi0iYmd0emwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgLyogTk9URTogVGhlIGJyYW5jaCBvY2N1cnMgQUZURVIgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4KLSAgICAgZXhlY3V0ZWQgKi8KLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+IDApCi0gICAgewotICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKLSAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7Ci0gICAgfQotICBlbHNlCi0gICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOwotfQotCi0KLQotMDAwMTEwLDUuUlMsMDAwMDAsMTYuT0ZGU0VUOk5PUk1BTDozMjo6QkxFWgotImJsZXogcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgLyogTk9URTogVGhlIGJyYW5jaCBvY2N1cnMgQUZURVIgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4KLSAgICAgZXhlY3V0ZWQgKi8KLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8PSAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLX0KLQotCi0KLTAxMDExMCw1LlJTLDAwMDAwLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkJMRVpMCi0iYmdlemwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8PSAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDAwMSw1LlJTLDAwMDAwLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJMVFoKLSJibHR6IHI8UlM+LCA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPCAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLX0KLQotCi0KLTAwMDAwMSw1LlJTITMxLDEwMDAwLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJMVFpBTAotImJsdHphbCByPFJTPiwgPE9GRlNFVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOwotICBjaGVja19icmFuY2hfYnVnICgpOwotICBSQSA9IChDSUEgKyA4KTsKLSAgLyogTk9URTogVGhlIGJyYW5jaCBvY2N1cnMgQUZURVIgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4KLSAgICAgZXhlY3V0ZWQgKi8KLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8IDApCi0gICAgewotICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKLSAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7Ci0gICAgfQotfQotCi0KLQotMDAwMDAxLDUuUlMhMzEsMTAwMTAsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkxUWkFMTAotImJsdHphbGwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgUkEgPSAoQ0lBICsgOCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPCAwKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDAwMSw1LlJTLDAwMDEwLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJMVFpMCi0iYmx0emwgcjxSUz4sIDxPRkZTRVQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgLyogTk9URTogVGhlIGJyYW5jaCBvY2N1cnMgQUZURVIgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4KLSAgICAgZXhlY3V0ZWQgKi8KLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8IDApCi0gICAgewotICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKLSAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7Ci0gICAgfQotICBlbHNlCi0gICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOwotfQotCi0KLQotMDAwMTAxLDUuUlMsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpCTkUKLSJibmUgcjxSUz4sIHI8UlQ+LCA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gIT0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLX0KLQotCi0KLTAxMDEwMSw1LlJTLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6Qk5FTAotImJuZWwgcjxSUz4sIHI8UlQ+LCA8T0ZGU0VUPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7Ci0gIGNoZWNrX2JyYW5jaF9idWcgKCk7Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gIT0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIHsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7Ci0gICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLX0KLQotCi0KLTAwMDAwMCwyMC5DT0RFLDAwMTEwMTpTUEVDSUFMOjMyOjpCUkVBSwotImJyZWFrIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICAvKiBDaGVjayBmb3Igc29tZSBicmVhayBpbnN0cnVjdGlvbiB3aGljaCBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgc2ltdWxhdG9yLiAgKi8KLSAgdW5zaWduZWQgaW50IGJyZWFrX2NvZGUgPSBpbnN0cnVjdGlvbl8wICYgSEFMVF9JTlNUUlVDVElPTl9NQVNLOwotICBpZiAoYnJlYWtfY29kZSA9PSAoSEFMVF9JTlNUUlVDVElPTiAgJiBIQUxUX0lOU1RSVUNUSU9OX01BU0spIHx8Ci0gICAgICBicmVha19jb2RlID09IChIQUxUX0lOU1RSVUNUSU9OMiAmIEhBTFRfSU5TVFJVQ1RJT05fTUFTSykpCi0gICAgewotICAgICAgc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBjaWEsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpbV9leGl0ZWQsICh1bnNpZ25lZCBpbnQpKEEwICYgMHhGRkZGRkZGRikpOwotICAgIH0KLSAgZWxzZSBpZiAoYnJlYWtfY29kZSA9PSAoQlJFQUtQT0lOVF9JTlNUUlVDVElPTiAgJiBIQUxUX0lOU1RSVUNUSU9OX01BU0spIHx8Ci0gICAgICAgICAgIGJyZWFrX2NvZGUgPT0gKEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04yICYgSEFMVF9JTlNUUlVDVElPTl9NQVNLKSkKLSAgICB7Ci0gICAgICBpZiAoU1RBVEUgJiBzaW1ERUxBWVNMT1QpCi0gICAgICAgIFBDID0gY2lhIC0gNDsgLyogcmVmZXJlbmNlIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGVsc2UKLSAgICAgICAgUEMgPSBjaWE7Ci0gICAgICBTaWduYWxFeGNlcHRpb24oQnJlYWtQb2ludCwgaW5zdHJ1Y3Rpb25fMCk7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBnZXQgdGhpcyBmYXIsIHdlJ3JlIG5vdCBhbiBpbnN0cnVjdGlvbiByZXNlcnZlZCBieSB0aGUgc2ltLiAgUmFpc2UgCi0JIHRoZSBleGNlcHRpb24uICovCi0gICAgICBTaWduYWxFeGNlcHRpb24oQnJlYWtQb2ludCwgaW5zdHJ1Y3Rpb25fMCk7Ci0gICAgfQotfQotCi0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwLDEwMTEwMDpTUEVDSUFMOjY0OjpEQURECi0iZGFkZCByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIC8qIHRoaXMgY2hlY2sncyBmb3Igb3ZlcmZsb3cgKi8KLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgR1BSW1JUXSk7Ci0gIHsKLSAgICBBTFU2NF9CRUdJTiAoR1BSW1JTXSk7Ci0gICAgQUxVNjRfQUREIChHUFJbUlRdKTsKLSAgICBBTFU2NF9FTkQgKEdQUltSRF0pOwotICB9Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSRF0pOwotfQotCi0KLQotMDExMDAwLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjY0OjpEQURESQotImRhZGRpIHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgRVhURU5EMTYgKElNTUVESUFURSkpOwotICB7Ci0gICAgQUxVNjRfQkVHSU4gKEdQUltSU10pOwotICAgIEFMVTY0X0FERCAoRVhURU5EMTYgKElNTUVESUFURSkpOwotICAgIEFMVTY0X0VORCAoR1BSW1JUXSk7Ci0gIH0KLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JUXSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2RhZGRpdTppbnQgcnMsIGludCBydCwgdW5zaWduZWQxNiBpbW1lZGlhdGUKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgRVhURU5EMTYgKGltbWVkaWF0ZSkpOwotICBHUFJbcnRdID0gR1BSW3JzXSArIEVYVEVORDE2IChpbW1lZGlhdGUpOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcnRdKTsKLX0KLQotMDExMDAxLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjY0OjpEQURESVUKLSJkYWRkdSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX2RhZGRpdSAoU0RfLCBSUywgUlQsIElNTUVESUFURSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2RhZGR1OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7Ci0gIEdQUltyZF0gPSBHUFJbcnNdICsgR1BSW3J0XTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMCwxMDExMDE6U1BFQ0lBTDo2NDo6REFERFUKLSJkYWRkdSByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX2RhZGR1IChTRF8sIFJTLCBSVCwgUkQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kZGl2OmludCBycywgaW50IHJ0Ci17Ci0gIGNoZWNrX2Rpdl9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7Ci0gIHsKLSAgICBzaWduZWQ2NCBuID0gR1BSW3JzXTsKLSAgICBzaWduZWQ2NCBkID0gR1BSW3J0XTsKLSAgICBzaWduZWQ2NCBoaTsKLSAgICBzaWduZWQ2NCBsbzsKLSAgICBpZiAoZCA9PSAwKQotICAgICAgewotCWxvID0gU0lHTkVENjQgKDB4ODAwMDAwMDAwMDAwMDAwMCk7Ci0JaGkgPSAwOwotICAgICAgfQotICAgIGVsc2UgaWYgKGQgPT0gLTEgJiYgbiA9PSBTSUdORUQ2NCAoMHg4MDAwMDAwMDAwMDAwMDAwKSkKLSAgICAgIHsKLQlsbyA9IFNJR05FRDY0ICgweDgwMDAwMDAwMDAwMDAwMDApOwotCWhpID0gMDsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JbG8gPSAobiAvIGQpOwotCWhpID0gKG4gJSBkKTsKLSAgICAgIH0KLSAgICBISSA9IGhpOwotICAgIExPID0gbG87Ci0gIH0KLSAgVFJBQ0VfQUxVX1JFU1VMVDIgKEhJLCBMTyk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsMDAwMDAwMDAwMDAxMTExMDpTUEVDSUFMOjY0OjpERElWCi0iZGRpdiByPFJTPiwgcjxSVD4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgZG9fZGRpdiAoU0RfLCBSUywgUlQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kZGl2dTppbnQgcnMsIGludCBydAotewotICBjaGVja19kaXZfaGlsbyAoU0RfLCBISUhJU1RPUlksIExPSElTVE9SWSk7Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOwotICB7Ci0gICAgdW5zaWduZWQ2NCBuID0gR1BSW3JzXTsKLSAgICB1bnNpZ25lZDY0IGQgPSBHUFJbcnRdOwotICAgIHVuc2lnbmVkNjQgaGk7Ci0gICAgdW5zaWduZWQ2NCBsbzsKLSAgICBpZiAoZCA9PSAwKQotICAgICAgewotCWxvID0gU0lHTkVENjQgKDB4ODAwMDAwMDAwMDAwMDAwMCk7Ci0JaGkgPSAwOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlsbyA9IChuIC8gZCk7Ci0JaGkgPSAobiAlIGQpOwotICAgICAgfQotICAgIEhJID0gaGk7Ci0gICAgTE8gPSBsbzsKLSAgfQotICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwLDAxMTExMTpTUEVDSUFMOjY0OjpERElWVQotImRkaXZ1IHI8UlM+LCByPFJUPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBkb19kZGl2dSAoU0RfLCBSUywgUlQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kaXY6aW50IHJzLCBpbnQgcnQKLXsKLSAgY2hlY2tfZGl2X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOwotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgewotICAgIHNpZ25lZDMyIG4gPSBHUFJbcnNdOwotICAgIHNpZ25lZDMyIGQgPSBHUFJbcnRdOwotICAgIGlmIChkID09IDApCi0gICAgICB7Ci0JTE8gPSBFWFRFTkQzMiAoMHg4MDAwMDAwMCk7Ci0JSEkgPSBFWFRFTkQzMiAoMCk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAobiA9PSBTSUdORUQzMiAoMHg4MDAwMDAwMCkgJiYgZCA9PSAtMSkKLSAgICAgIHsKLQlMTyA9IEVYVEVORDMyICgweDgwMDAwMDAwKTsKLQlISSA9IEVYVEVORDMyICgwKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JTE8gPSBFWFRFTkQzMiAobiAvIGQpOwotCUhJID0gRVhURU5EMzIgKG4gJSBkKTsKLSAgICAgIH0KLSAgfQotICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwMDExMDEwOlNQRUNJQUw6MzI6OkRJVgotImRpdiByPFJTPiwgcjxSVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX2RpdiAoU0RfLCBSUywgUlQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kaXZ1OmludCBycywgaW50IHJ0Ci17Ci0gIGNoZWNrX2Rpdl9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7Ci0gIHsKLSAgICB1bnNpZ25lZDMyIG4gPSBHUFJbcnNdOwotICAgIHVuc2lnbmVkMzIgZCA9IEdQUltydF07Ci0gICAgaWYgKGQgPT0gMCkKLSAgICAgIHsKLQlMTyA9IEVYVEVORDMyICgweDgwMDAwMDAwKTsKLQlISSA9IEVYVEVORDMyICgwKTsKLSAgICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIExPID0gRVhURU5EMzIgKG4gLyBkKTsKLSAgICAgICBISSA9IEVYVEVORDMyIChuICUgZCk7Ci0gICAgIH0KLSAgfQotICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwMDExMDExOlNQRUNJQUw6MzI6OkRJVlUKLSJkaXZ1IHI8UlM+LCByPFJUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fZGl2dSAoU0RfLCBSUywgUlQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kbXVsdHg6aW50IHJzLCBpbnQgcnQsIGludCByZCwgaW50IHNpZ25lZF9wCi17Ci0gIHVuc2lnbmVkNjQgbG87Ci0gIHVuc2lnbmVkNjQgaGk7Ci0gIHVuc2lnbmVkNjQgbTAwOwotICB1bnNpZ25lZDY0IG0wMTsKLSAgdW5zaWduZWQ2NCBtMTA7Ci0gIHVuc2lnbmVkNjQgbTExOwotICB1bnNpZ25lZDY0IG1pZDsKLSAgaW50IHNpZ247Ci0gIHVuc2lnbmVkNjQgb3AxID0gR1BSW3JzXTsKLSAgdW5zaWduZWQ2NCBvcDIgPSBHUFJbcnRdOwotICBjaGVja19tdWx0X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOwotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgLyogbWFrZSBzaWduZWQgbXVsdGlwbHkgdW5zaWduZWQgKi8gCi0gIHNpZ24gPSAwOwotICBpZiAoc2lnbmVkX3ApCi0gICAgewotICAgICAgaWYgKG9wMSA8IDApCi0JewotCSAgb3AxID0gLSBvcDE7Ci0JICArK3NpZ247Ci0JfQotICAgICAgaWYgKG9wMiA8IDApCi0JewotCSAgb3AyID0gLSBvcDI7Ci0JICArK3NpZ247Ci0JfQotICAgIH0KLSAgLyogbXVsdGlwbHkgb3V0IHRoZSA0IHN1YiBwcm9kdWN0cyAqLwotICBtMDAgPSAoKHVuc2lnbmVkNjQpIFZMNF84IChvcDEpICogKHVuc2lnbmVkNjQpIFZMNF84IChvcDIpKTsKLSAgbTEwID0gKCh1bnNpZ25lZDY0KSBWSDRfOCAob3AxKSAqICh1bnNpZ25lZDY0KSBWTDRfOCAob3AyKSk7Ci0gIG0wMSA9ICgodW5zaWduZWQ2NCkgVkw0XzggKG9wMSkgKiAodW5zaWduZWQ2NCkgVkg0XzggKG9wMikpOwotICBtMTEgPSAoKHVuc2lnbmVkNjQpIFZINF84IChvcDEpICogKHVuc2lnbmVkNjQpIFZINF84IChvcDIpKTsKLSAgLyogYWRkIHRoZSBwcm9kdWN0cyAqLwotICBtaWQgPSAoKHVuc2lnbmVkNjQpIFZINF84IChtMDApCi0JICsgKHVuc2lnbmVkNjQpIFZMNF84IChtMTApCi0JICsgKHVuc2lnbmVkNjQpIFZMNF84IChtMDEpKTsKLSAgbG8gPSBVOF80IChtaWQsIG0wMCk7Ci0gIGhpID0gKG0xMQotCSsgKHVuc2lnbmVkNjQpIFZINF84IChtaWQpCi0JKyAodW5zaWduZWQ2NCkgVkg0XzggKG0wMSkKLQkrICh1bnNpZ25lZDY0KSBWSDRfOCAobTEwKSk7Ci0gIC8qIGZpeCB0aGUgc2lnbiAqLwotICBpZiAoc2lnbiAmIDEpCi0gICAgewotICAgICAgbG8gPSAtbG87Ci0gICAgICBpZiAobG8gPT0gMCkKLQloaSA9IC1oaTsKLSAgICAgIGVsc2UKLQloaSA9IC1oaSAtIDE7Ci0gICAgfQotICAvKiBzYXZlIHRoZSByZXN1bHQgSEkvTE8gKGFuZCBhIGdwcikgKi8KLSAgTE8gPSBsbzsKLSAgSEkgPSBoaTsKLSAgaWYgKHJkICE9IDApCi0gICAgR1BSW3JkXSA9IGxvOwotICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKLX0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kbXVsdDppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIGRvX2RtdWx0eCAoU0RfLCBycywgcnQsIHJkLCAxKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwMDExMTAwOlNQRUNJQUw6NjQ6OkRNVUxUCi0iZG11bHQgcjxSUz4sIHI8UlQ+IgotKm1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLXsKLSAgZG9fZG11bHQgKFNEXywgUlMsIFJULCAwKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDExMTAwOlNQRUNJQUw6NjQ6OkRNVUxUCi0iZG11bHQgcjxSUz4sIHI8UlQ+IjpSRCA9PSAwCi0iZG11bHQgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSp2cjUwMDA6Ci17Ci0gIGRvX2RtdWx0IChTRF8sIFJTLCBSVCwgUkQpOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kbXVsdHU6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBkb19kbXVsdHggKFNEXywgcnMsIHJ0LCByZCwgMCk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsMDAwMDAwMDAwMDAxMTEwMTpTUEVDSUFMOjY0OjpETVVMVFUKLSJkbXVsdHUgcjxSUz4sIHI8UlQ+IgotKm1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLXsKLSAgZG9fZG11bHR1IChTRF8sIFJTLCBSVCwgMCk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAxMTEwMTpTUEVDSUFMOjY0OjpETVVMVFUKLSJkbXVsdHUgcjxSRD4sIHI8UlM+LCByPFJUPiI6UkQgPT0gMAotImRtdWx0dSByPFJTPiwgcjxSVD4iCi0qdnI1MDAwOgotewotICBkb19kbXVsdHUgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHNsbDppbnQgcnQsIGludCByZCwgaW50IHNoaWZ0Ci17Ci0gIEdQUltyZF0gPSBHUFJbcnRdIDw8IHNoaWZ0OwotfQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2RzbGx2OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgaW50IHMgPSBNQVNLRUQ2NCAoR1BSW3JzXSwgNSwgMCk7Ci0gIEdQUltyZF0gPSBHUFJbcnRdIDw8IHM7Ci19Ci0KLQotMDAwMDAwMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMTExMDAwOlNQRUNJQUw6NjQ6OkRTTEwKLSJkc2xsIHI8UkQ+LCByPFJUPiwgPFNISUZUPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBkb19kc2xsIChTRF8sIFJULCBSRCwgU0hJRlQpOwotfQotCi0KLTAwMDAwMDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDExMTEwMDpTUEVDSUFMOjY0OjpEU0xMMzIKLSJkc2xsMzIgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGludCBzID0gMzIgKyBTSElGVDsKLSAgR1BSW1JEXSA9IEdQUltSVF0gPDwgczsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDEwMTAwOlNQRUNJQUw6NjQ6OkRTTExWCi0iZHNsbHYgcjxSRD4sIHI8UlQ+LCByPFJTPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBkb19kc2xsdiAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19kc3JhOmludCBydCwgaW50IHJkLCBpbnQgc2hpZnQKLXsKLSAgR1BSW3JkXSA9ICgoc2lnbmVkNjQpIEdQUltydF0pID4+IHNoaWZ0OwotfQotCi0KLTAwMDAwMDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDExMTAxMTpTUEVDSUFMOjY0OjpEU1JBCi0iZHNyYSByPFJEPiwgcjxSVD4sIDxTSElGVD4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgZG9fZHNyYSAoU0RfLCBSVCwgUkQsIFNISUZUKTsKLX0KLQotCi0wMDAwMDAwMDAwMCw1LlJULDUuUkQsNS5TSElGVCwxMTExMTE6U1BFQ0lBTDo2NDo6RFNSQTMyCi0iZHNyYTMyIHI8UlQ+LCByPFJEPiwgPFNISUZUPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBpbnQgcyA9IDMyICsgU0hJRlQ7Ci0gIEdQUltSRF0gPSAoKHNpZ25lZDY0KSBHUFJbUlRdKSA+PiBzOwotfQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHNyYXY6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBpbnQgcyA9IE1BU0tFRDY0IChHUFJbcnNdLCA1LCAwKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgcyk7Ci0gIEdQUltyZF0gPSAoKHNpZ25lZDY0KSBHUFJbcnRdKSA+PiBzOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDEwMTExOlNQRUNJQUw6NjQ6OkRTUkFWCi0iZHNyYTMyIHI8UlQ+LCByPFJEPiwgcjxSUz4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgZG9fZHNyYXYgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHNybDppbnQgcnQsIGludCByZCwgaW50IHNoaWZ0Ci17Ci0gIEdQUltyZF0gPSAodW5zaWduZWQ2NCkgR1BSW3J0XSA+PiBzaGlmdDsKLX0KLQotCi0wMDAwMDAwMDAwMCw1LlJULDUuUkQsNS5TSElGVCwxMTEwMTA6U1BFQ0lBTDo2NDo6RFNSTAotImRzcmwgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX2RzcmwgKFNEXywgUlQsIFJELCBTSElGVCk7Ci19Ci0KLQotMDAwMDAwMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMTExMTEwOlNQRUNJQUw6NjQ6OkRTUkwzMgotImRzcmwzMiByPFJEPiwgcjxSVD4sIDxTSElGVD4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgaW50IHMgPSAzMiArIFNISUZUOwotICBHUFJbUkRdID0gKHVuc2lnbmVkNjQpIEdQUltSVF0gPj4gczsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX2Rzcmx2OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgaW50IHMgPSBNQVNLRUQ2NCAoR1BSW3JzXSwgNSwgMCk7Ci0gIEdQUltyZF0gPSAodW5zaWduZWQ2NCkgR1BSW3J0XSA+PiBzOwotfQotCi0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDEwMTEwOlNQRUNJQUw6NjQ6OkRTUkxWCi0iZHNybDMyIHI8UkQ+LCByPFJUPiwgcjxSUz4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgZG9fZHNybHYgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMTAxMTEwOlNQRUNJQUw6NjQ6OkRTVUIKLSJkc3ViIHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgR1BSW1JUXSk7Ci0gIHsKLSAgICBBTFU2NF9CRUdJTiAoR1BSW1JTXSk7Ci0gICAgQUxVNjRfU1VCIChHUFJbUlRdKTsKLSAgICBBTFU2NF9FTkQgKEdQUltSRF0pOwotICB9Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSRF0pOwotfQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHN1YnU6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgR1BSW3JkXSA9IEdQUltyc10gLSBHUFJbcnRdOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMTAxMTExOlNQRUNJQUw6NjQ6OkRTVUJVCi0iZHN1YnUgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBkb19kc3VidSAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi0wMDAwMTAsMjYuSU5TVFJfSU5ERVg6Tk9STUFMOjMyOjpKCi0iaiA8SU5TVFJfSU5ERVg+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICAvKiBOT1RFOiBUaGUgcmVnaW9uIHVzZWQgaXMgdGhhdCBvZiB0aGUgZGVsYXkgc2xvdCBOSUEgYW5kIE5PVCB0aGUKLSAgICAgY3VycmVudCBpbnN0cnVjdGlvbiAqLwotICBhZGRyZXNzX3dvcmQgcmVnaW9uID0gKE5JQSAmIE1BU0sgKDYzLCAyOCkpOwotICBERUxBWV9TTE9UIChyZWdpb24gfCAoSU5TVFJfSU5ERVggPDwgMikpOwotfQotCi0KLTAwMDAxMSwyNi5JTlNUUl9JTkRFWDpOT1JNQUw6MzI6OkpBTAotImphbCA8SU5TVFJfSU5ERVg+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICAvKiBOT1RFOiBUaGUgcmVnaW9uIHVzZWQgaXMgdGhhdCBvZiB0aGUgZGVsYXkgc2xvdCBhbmQgTk9UIHRoZQotICAgICBjdXJyZW50IGluc3RydWN0aW9uICovCi0gIGFkZHJlc3Nfd29yZCByZWdpb24gPSAoTklBICYgTUFTSyAoNjMsIDI4KSk7Ci0gIEdQUlszMV0gPSBDSUEgKyA4OwotICBERUxBWV9TTE9UIChyZWdpb24gfCAoSU5TVFJfSU5ERVggPDwgMikpOwotfQotCi0wMDAwMDAsNS5SUywwMDAwMCw1LlJELDAwMDAwMDAxMDAxOlNQRUNJQUw6MzI6OkpBTFIKLSJqYWxyIHI8UlM+IjpSRCA9PSAzMQotImphbHIgcjxSRD4sIHI8UlM+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBhZGRyZXNzX3dvcmQgdGVtcCA9IEdQUltSU107Ci0gIEdQUltSRF0gPSBDSUEgKyA4OwotICBERUxBWV9TTE9UICh0ZW1wKTsKLX0KLQotCi0wMDAwMDAsNS5SUywwMDAwMDAwMDAwMDAwMDAwMDEwMDA6U1BFQ0lBTDozMjo6SlIKLSJqciByPFJTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgREVMQVlfU0xPVCAoR1BSW1JTXSk7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6dW5zaWduZWRfd29yZDpkb19sb2FkOnVuc2lnbmVkIGFjY2VzcywgYWRkcmVzc193b3JkIGJhc2UsIGFkZHJlc3Nfd29yZCBvZmZzZXQKLXsKLSAgYWRkcmVzc193b3JkIG1hc2sgPSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0ID8gMHg3IDogMHgzKTsKLSAgYWRkcmVzc193b3JkIHJldmVyc2VlbmRpYW4gPSAoUmV2ZXJzZUVuZGlhbiA/IChtYXNrIF4gYWNjZXNzKSA6IDApOwotICBhZGRyZXNzX3dvcmQgYmlnZW5kaWFuY3B1ID0gKEJpZ0VuZGlhbkNQVSA/IChtYXNrIF4gYWNjZXNzKSA6IDApOwotICB1bnNpZ25lZCBpbnQgYnl0ZTsKLSAgYWRkcmVzc193b3JkIHBhZGRyOwotICBpbnQgdW5jYWNoZWQ7Ci0gIHVuc2lnbmVkNjQgbWVtdmFsOwotICBhZGRyZXNzX3dvcmQgdmFkZHI7Ci0KLSAgdmFkZHIgPSBiYXNlICsgb2Zmc2V0OwotICBpZiAoKHZhZGRyICYgYWNjZXNzKSAhPSAwKQotICAgIHsKLSAgICAgIFNJTV9DT1JFX1NJR05BTCAoU0QsIFNUQVRFX0NQVSAoU0QsIDApLCBjaWEsIHJlYWRfbWFwLCBhY2Nlc3MrMSwgdmFkZHIsIHJlYWRfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOwotICAgIH0KLSAgQWRkcmVzc1RyYW5zbGF0aW9uICh2YWRkciwgaXNEQVRBLCBpc0xPQUQsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKLSAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gcmV2ZXJzZWVuZGlhbikpOwotICBMb2FkTWVtb3J5ICgmbWVtdmFsLCBOVUxMLCB1bmNhY2hlZCwgYWNjZXNzLCBwYWRkciwgdmFkZHIsIGlzREFUQSwgaXNSRUFMKTsKLSAgYnl0ZSA9ICgodmFkZHIgJiBtYXNrKSBeIGJpZ2VuZGlhbmNwdSk7Ci0gIHJldHVybiAobWVtdmFsID4+ICg4ICogYnl0ZSkpOwotfQotCi0KLTEwMDAwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMQgotImxiIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgR1BSW1JUXSA9IEVYVEVORDggKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi0xMDAxMDAsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6TEJVCi0ibGJ1IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgR1BSW1JUXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpOwotfQotCi0KLTExMDExMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpMRAotImxkIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBHUFJbUlRdID0gRVhURU5ENjQgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi0xMTAxLFpaITAhMSEzLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OkxEQ3oKLSJsZGM8Wlo+IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgQ09QX0xEIChaWiwgUlQsIGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi0KLQotMDExMDEwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OkxETAotImxkbCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgR1BSW1JUXSA9IGRvX2xvYWRfbGVmdCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Ci19Ci0KLQotMDExMDExLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OkxEUgotImxkciByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgR1BSW1JUXSA9IGRvX2xvYWRfcmlnaHQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOwotfQotCi0KLTEwMDAwMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMSAotImxoIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgR1BSW1JUXSA9IEVYVEVORDE2IChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOwotfQotCi0KLTEwMDEwMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMSFUKLSJsaHUgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBHUFJbUlRdID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpOwotfQotCi0KLTExMDAwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMTAotImxsIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOwotICB7Ci0gICAgYWRkcmVzc193b3JkIHZhZGRyID0gKCh1bnNpZ25lZDY0KW9wMSArIG9mZnNldCk7Ci0gICAgYWRkcmVzc193b3JkIHBhZGRyOwotICAgIGludCB1bmNhY2hlZDsKLSAgICBpZiAoKHZhZGRyICYgMykgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgU0lNX0NPUkVfU0lHTkFMIChTRCwgQ1BVLCBjaWEsIHJlYWRfbWFwLCA0LCB2YWRkciwgcmVhZF90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzTE9BRCwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCi0JICB7Ci0JICAgIHVuc2lnbmVkNjQgbWVtdmFsID0gMDsKLQkgICAgdW5zaWduZWQ2NCBtZW12YWwxID0gMDsKLQkgICAgdW5zaWduZWQ2NCBtYXNrID0gMHg3OwotCSAgICB1bnNpZ25lZCBpbnQgc2hpZnQgPSAyOwotCSAgICB1bnNpZ25lZCBpbnQgcmV2ZXJzZSA9IChSZXZlcnNlRW5kaWFuID8gKG1hc2sgPj4gc2hpZnQpIDogMCk7Ci0JICAgIHVuc2lnbmVkIGludCBiaWdlbmQgPSAoQmlnRW5kaWFuQ1BVID8gKG1hc2sgPj4gc2hpZnQpIDogMCk7Ci0JICAgIHVuc2lnbmVkIGludCBieXRlOwotCSAgICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiAocmV2ZXJzZSA8PCBzaGlmdCkpKTsKLQkgICAgTG9hZE1lbW9yeSgmbWVtdmFsLCZtZW12YWwxLHVuY2FjaGVkLEFjY2Vzc0xlbmd0aF9XT1JELHBhZGRyLHZhZGRyLGlzREFUQSxpc1JFQUwpOwotCSAgICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gKGJpZ2VuZCA8PCBzaGlmdCkpOwotCSAgICBHUFJbZGVzdHJlZ10gPSAoU0lHTkVYVEVORCgoKG1lbXZhbCA+PiAoOCAqIGJ5dGUpKSAmIDB4RkZGRkZGRkYpLDMyKSk7Ci0JICAgIExMQklUID0gMTsKLQkgIH0KLSAgICAgIH0KLSAgfQotfQotCi0KLTExMDEwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpMTEQKLSJsbGQgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBzaWduZWRfd29yZCBvZmZzZXQgPSBTSUdORVhURU5EKChzaWduZWRfd29yZCkoKGluc3RydWN0aW9uID4+IDApICYgMHgwMDAwRkZGRiksMTYpOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7Ci0gIHNpZ25lZF93b3JkIG9wMSA9IEdQUlsoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpXTsKLSAgewotICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodW5zaWduZWQ2NClvcDEgKyBvZmZzZXQpOwotICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgICBpbnQgdW5jYWNoZWQ7Ci0gICAgaWYgKCh2YWRkciAmIDcpICE9IDApCi0gICAgICB7Ci0JU0lNX0NPUkVfU0lHTkFMIChTRCwgQ1BVLCBjaWEsIHJlYWRfbWFwLCA4LCB2YWRkciwgcmVhZF90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzTE9BRCwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCi0JICB7Ci0JICAgIHVuc2lnbmVkNjQgbWVtdmFsID0gMDsKLQkgICAgdW5zaWduZWQ2NCBtZW12YWwxID0gMDsKLQkgICAgTG9hZE1lbW9yeSgmbWVtdmFsLCZtZW12YWwxLHVuY2FjaGVkLEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELHBhZGRyLHZhZGRyLGlzREFUQSxpc1JFQUwpOwotCSAgICBHUFJbZGVzdHJlZ10gPSBtZW12YWw7Ci0JICAgIExMQklUID0gMTsKLQkgIH0KLSAgICAgIH0KLSAgfQotfQotCi0KLTAwMTExMSwwMDAwMCw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6MzI6OkxVSQotImx1aSByPFJUPiwgPElNTUVESUFURT4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIFRSQUNFX0FMVV9JTlBVVDEgKElNTUVESUFURSk7Ci0gIEdQUltSVF0gPSBFWFRFTkQzMiAoSU1NRURJQVRFIDw8IDE2KTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JUXSk7Ci19Ci0KLQotMTAwMDExLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxXCi0ibHcgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBHUFJbUlRdID0gRVhURU5EMzIgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi0xMTAwLFpaITAhMSEzLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxXQ3oKLSJsd2M8Wlo+IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgQ09QX0xXIChaWiwgUlQsIGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp1bnNpZ25lZF93b3JkOmRvX2xvYWRfbGVmdDp1bnNpZ25lZCBhY2Nlc3MsIGFkZHJlc3Nfd29yZCBiYXNlLCBhZGRyZXNzX3dvcmQgb2Zmc2V0LCB1bnNpZ25lZF93b3JkIHJ0Ci17Ci0gIGFkZHJlc3Nfd29yZCBtYXNrID0gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCA/IDB4NyA6IDB4Myk7Ci0gIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAtMSA6IDApOwotICBhZGRyZXNzX3dvcmQgYmlnZW5kaWFuY3B1ID0gKEJpZ0VuZGlhbkNQVSA/IC0xIDogMCk7Ci0gIHVuc2lnbmVkIGludCBieXRlOwotICB1bnNpZ25lZCBpbnQgd29yZDsKLSAgYWRkcmVzc193b3JkIHBhZGRyOwotICBpbnQgdW5jYWNoZWQ7Ci0gIHVuc2lnbmVkNjQgbWVtdmFsOwotICBhZGRyZXNzX3dvcmQgdmFkZHI7Ci0gIGludCBucl9saHNfYml0czsKLSAgaW50IG5yX3Joc19iaXRzOwotICB1bnNpZ25lZF93b3JkIGxoc19tYXNrOwotICB1bnNpZ25lZF93b3JkIHRlbXA7Ci0KLSAgdmFkZHIgPSBiYXNlICsgb2Zmc2V0OwotICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0RBVEEsIGlzTE9BRCwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOwotICBwYWRkciA9IChwYWRkciBeIChyZXZlcnNlZW5kaWFuICYgbWFzaykpOwotICBpZiAoQmlnRW5kaWFuTWVtID09IDApCi0gICAgcGFkZHIgPSBwYWRkciAmIH5hY2Nlc3M7Ci0KLSAgLyogY29tcHV0ZSB3aGVyZSB3aXRoaW4gdGhlIHdvcmQvbWVtIHdlIGFyZSAqLwotICBieXRlID0gKCh2YWRkciBeIGJpZ2VuZGlhbmNwdSkgJiBhY2Nlc3MpOyAvKiAwLi5hY2Nlc3MgKi8KLSAgd29yZCA9ICgodmFkZHIgXiBiaWdlbmRpYW5jcHUpICYgKG1hc2sgJiB+YWNjZXNzKSkgLyAoYWNjZXNzICsgMSk7IC8qIDAuLjEgKi8KLSAgbnJfbGhzX2JpdHMgPSA4ICogYnl0ZSArIDg7Ci0gIG5yX3Joc19iaXRzID0gOCAqIGFjY2VzcyAtIDggKiBieXRlOwotICAvKiBucl9saHNfYml0cyArIG5yX3Joc19iaXRzID09IDggKiAoYWNjZXNzcyArIDEpICovCi0KLSAgLyogZnByaW50ZiAoc3RkZXJyLCAibFt3ZF1sOiAweCUwOGx4JTA4bHggMHglMDhseCUwOGx4ICVkOiVkICVkKyVkXG4iLAotCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHZhZGRyID4+IDMyKSwgKGxvbmcpIHZhZGRyLAotCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHBhZGRyID4+IDMyKSwgKGxvbmcpIHBhZGRyLAotCSAgIHdvcmQsIGJ5dGUsIG5yX2xoc19iaXRzLCBucl9yaHNfYml0cyk7ICovCi0KLSAgTG9hZE1lbW9yeSAoJm1lbXZhbCwgTlVMTCwgdW5jYWNoZWQsIGJ5dGUsIHBhZGRyLCB2YWRkciwgaXNEQVRBLCBpc1JFQUwpOwotICBpZiAod29yZCA9PSAwKQotICAgIHsKLSAgICAgIC8qIEdQUnszMS4uMzItTlJfTEhTX0JJVFN9ID0gbWVtdmFse05SX0xIU19CSVRTLTEuLjB9ICovCi0gICAgICB0ZW1wID0gKG1lbXZhbCA8PCBucl9yaHNfYml0cyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogR1BSezMxLi4zMi1OUl9MSFNfQklUUyA9IG1lbXZhbHszMitOUl9MSFNfQklUUy4uMzJ9ICovCi0gICAgICB0ZW1wID0gKG1lbXZhbCA+PiBucl9saHNfYml0cyk7Ci0gICAgfQotICBsaHNfbWFzayA9IExTTUFTSyAobnJfbGhzX2JpdHMgKyBucl9yaHNfYml0cyAtIDEsIG5yX3Joc19iaXRzKTsKLSAgcnQgPSAocnQgJiB+bGhzX21hc2spIHwgKHRlbXAgJiBsaHNfbWFzayk7Ci0KLSAgLyogZnByaW50ZiAoc3RkZXJyLCAibFt3ZF1sOiAweCUwOGx4JTA4bHggLT4gMHglMDhseCUwOGx4ICYgMHglMDhseCUwOGx4IC0+IDB4JTA4bHglMDhseFxuIiwKLQkgICAobG9uZykgKCh1bnNpZ25lZDY0KSBtZW12YWwgPj4gMzIpLCAobG9uZykgbWVtdmFsLAotCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHRlbXAgPj4gMzIpLCAobG9uZykgdGVtcCwKLQkgICAobG9uZykgKCh1bnNpZ25lZDY0KSBsaHNfbWFzayA+PiAzMiksIChsb25nKSBsaHNfbWFzaywKLQkgICAobG9uZykgKHJ0ID4+IDMyKSwgKGxvbmcpIHJ0KTsgKi8KLSAgcmV0dXJuIHJ0OwotfQotCi0KLTEwMDAxMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMV0wKLSJsd2wgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBHUFJbUlRdID0gRVhURU5EMzIgKGRvX2xvYWRfbGVmdCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSkpOwotfQotCi0KLTpmdW5jdGlvbjo6OnVuc2lnbmVkX3dvcmQ6ZG9fbG9hZF9yaWdodDp1bnNpZ25lZCBhY2Nlc3MsIGFkZHJlc3Nfd29yZCBiYXNlLCBhZGRyZXNzX3dvcmQgb2Zmc2V0LCB1bnNpZ25lZF93b3JkIHJ0Ci17Ci0gIGFkZHJlc3Nfd29yZCBtYXNrID0gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCA/IDB4NyA6IDB4Myk7Ci0gIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAtMSA6IDApOwotICBhZGRyZXNzX3dvcmQgYmlnZW5kaWFuY3B1ID0gKEJpZ0VuZGlhbkNQVSA/IC0xIDogMCk7Ci0gIHVuc2lnbmVkIGludCBieXRlOwotICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gIGludCB1bmNhY2hlZDsKLSAgdW5zaWduZWQ2NCBtZW12YWw7Ci0gIGFkZHJlc3Nfd29yZCB2YWRkcjsKLQotICB2YWRkciA9IGJhc2UgKyBvZmZzZXQ7Ci0gIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNMT0FELCAmcGFkZHIsICZ1bmNhY2hlZCwgaXNUQVJHRVQsIGlzUkVBTCk7Ci0gIC8qIE5PVEU6IFNQRUMgaXMgd3JvbmcsIGhhcyBgQmlnRW5kaWFuTWVtID09IDAnIG5vdCBgQmlnRW5kaWFuTWVtICE9IDAnICovCi0gIHBhZGRyID0gKHBhZGRyIF4gKHJldmVyc2VlbmRpYW4gJiBtYXNrKSk7Ci0gIGlmIChCaWdFbmRpYW5NZW0gIT0gMCkKLSAgICBwYWRkciA9IHBhZGRyICYgfmFjY2VzczsKLSAgYnl0ZSA9ICgodmFkZHIgJiBtYXNrKSBeIChiaWdlbmRpYW5jcHUgJiBtYXNrKSk7Ci0gIC8qIE5PVEU6IFNQRUMgaXMgd3JvbmcsIGhhZCBgYnl0ZScgbm90IGBhY2Nlc3MgLSBieXRlJy4gIFNlZSBTVy4gKi8KLSAgTG9hZE1lbW9yeSAoJm1lbXZhbCwgTlVMTCwgdW5jYWNoZWQsIGFjY2VzcyAtIChhY2Nlc3MgJiBieXRlKSwgcGFkZHIsIHZhZGRyLCBpc0RBVEEsIGlzUkVBTCk7Ci0gIC8qIHByaW50ZiAoImxyOiAweCUwOGx4ICVkQDB4JTA4bHggMHglMDhseFxuIiwKLSAgICAgKGxvbmcpIHBhZGRyLCBieXRlLCAobG9uZykgcGFkZHIsIChsb25nKSBtZW12YWwpOyAqLwotICB7Ci0gICAgdW5zaWduZWRfd29yZCBzY3JlZW4gPSBMU01BU0sgKDggKiAoYWNjZXNzIC0gKGJ5dGUgJiBhY2Nlc3MpICsgMSkgLSAxLCAwKTsKLSAgICBydCAmPSB+c2NyZWVuOwotICAgIHJ0IHw9IChtZW12YWwgPj4gKDggKiBieXRlKSkgJiBzY3JlZW47Ci0gIH0KLSAgcmV0dXJuIHJ0OwotfQotCi0KLTEwMDExMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMV1IKLSJsd3IgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBHUFJbUlRdID0gRVhURU5EMzIgKGRvX2xvYWRfcmlnaHQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pKTsKLX0KLQotCi0xMDAxMTEsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6TFdVCi0ibHd1IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBHUFJbUlRdID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSk7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19tZmhpOmludCByZAotewotICBjaGVja19tZl9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMSAoSEkpOwotICBHUFJbcmRdID0gSEk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsMDAwMDAwMDAwMCw1LlJELDAwMDAwLDAxMDAwMDpTUEVDSUFMOjMyOjpNRkhJCi0ibWZoaSByPFJEPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fbWZoaSAoU0RfLCBSRCk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX21mbG86aW50IHJkCi17Ci0gIGNoZWNrX21mX2hpbG8gKFNEXywgTE9ISVNUT1JZLCBISUhJU1RPUlkpOwotICBUUkFDRV9BTFVfSU5QVVQxIChMTyk7Ci0gIEdQUltyZF0gPSBMTzsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Ci19Ci0KLTAwMDAwMCwwMDAwMDAwMDAwLDUuUkQsMDAwMDAsMDEwMDEwOlNQRUNJQUw6MzI6Ok1GTE8KLSJtZmxvIHI8UkQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19tZmxvIChTRF8sIFJEKTsKLX0KLQotCi0KLTAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMTAxMTpTUEVDSUFMOjMyOjpNT1ZOCi0ibW92biByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIGlmIChHUFJbUlRdICE9IDApCi0gICAgR1BSW1JEXSA9IEdQUltSU107Ci19Ci0KLQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMDEwMTA6U1BFQ0lBTDozMjo6TU9WWgotIm1vdnogcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICBpZiAoR1BSW1JUXSA9PSAwKQotICAgIEdQUltSRF0gPSBHUFJbUlNdOwotfQotCi0KLQotMDAwMDAwLDUuUlMsMDAwMDAwMDAwMDAwMDAwLDAxMDAwMTpTUEVDSUFMOjMyOjpNVEhJCi0ibXRoaSByPFJTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgY2hlY2tfbXRfaGlsbyAoU0RfLCBISUhJU1RPUlkpOwotICBISSA9IEdQUltSU107Ci19Ci0KLQotCi0wMDAwMDAsNS5SUywwMDAwMDAwMDAwMDAwMDAwMTAwMTE6U1BFQ0lBTDozMjo6TVRMTwotIm10bG8gcjxSUz4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGNoZWNrX210X2hpbG8gKFNEXywgTE9ISVNUT1JZKTsKLSAgTE8gPSBHUFJbUlNdOwotfQotCi0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19tdWx0OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgc2lnbmVkNjQgcHJvZDsKLSAgY2hlY2tfbXVsdF9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7Ci0gIHByb2QgPSAoKChzaWduZWQ2NCkoc2lnbmVkMzIpIEdQUltyc10pCi0JICAqICgoc2lnbmVkNjQpKHNpZ25lZDMyKSBHUFJbcnRdKSk7Ci0gIExPID0gRVhURU5EMzIgKFZMNF84IChwcm9kKSk7Ci0gIEhJID0gRVhURU5EMzIgKFZINF84IChwcm9kKSk7Ci0gIGlmIChyZCAhPSAwKQotICAgIEdQUltyZF0gPSBMTzsKLSAgVFJBQ0VfQUxVX1JFU1VMVDIgKEhJLCBMTyk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsMDAwMDAsMDAwMDAwMTEwMDA6U1BFQ0lBTDozMjo6TVVMVAotIm11bHQgcjxSUz4sIHI8UlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci17Ci0gIGRvX211bHQgKFNEXywgUlMsIFJULCAwKTsKLX0KLQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMTEwMDA6U1BFQ0lBTDozMjo6TVVMVAotIm11bHQgcjxSUz4sIHI8UlQ+IjpSRCA9PSAwCi0ibXVsdCByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fbXVsdCAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX211bHR1OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgdW5zaWduZWQ2NCBwcm9kOwotICBjaGVja19tdWx0X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOwotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgcHJvZCA9ICgoKHVuc2lnbmVkNjQpKHVuc2lnbmVkMzIpIEdQUltyc10pCi0JICAqICgodW5zaWduZWQ2NCkodW5zaWduZWQzMikgR1BSW3J0XSkpOwotICBMTyA9IEVYVEVORDMyIChWTDRfOCAocHJvZCkpOwotICBISSA9IEVYVEVORDMyIChWSDRfOCAocHJvZCkpOwotICBpZiAocmQgIT0gMCkKLSAgICBHUFJbcmRdID0gTE87Ci0gIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDAwMDAwLDAwMDAwMDExMDAxOlNQRUNJQUw6MzI6Ok1VTFRVCi0ibXVsdHUgcjxSUz4sIHI8UlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci17Ci0gIGRvX211bHR1IChTRF8sIFJTLCBSVCwgMCk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAxMTAwMTpTUEVDSUFMOjMyOjpNVUxUVQotIm11bHR1IHI8UlM+LCByPFJUPiI6UkQgPT0gMAotIm11bHR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19tdWx0dSAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX25vcjppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOwotICBHUFJbcmRdID0gfiAoR1BSW3JzXSB8IEdQUltydF0pOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKLX0KLQotMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwLDEwMDExMTpTUEVDSUFMOjMyOjpOT1IKLSJub3IgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fbm9yIChTRF8sIFJTLCBSVCwgUkQpOwotfQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fb3I6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgR1BSW3JkXSA9IChHUFJbcnNdIHwgR1BSW3J0XSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAwMTAxOlNQRUNJQUw6MzI6Ok9SCi0ib3IgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fb3IgKFNEXywgUlMsIFJULCBSRCk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX29yaTppbnQgcnMsIGludCBydCwgdW5zaWduZWQgaW1tZWRpYXRlCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIGltbWVkaWF0ZSk7Ci0gIEdQUltydF0gPSAoR1BSW3JzXSB8IGltbWVkaWF0ZSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltydF0pOwotfQotCi0wMDExMDEsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6MzI6Ok9SSQotIm9yaSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19vcmkgKFNEXywgUlMsIFJULCBJTU1FRElBVEUpOwotfQotCi0KLTExMDAxMSw1LlJTLG5ubm5uLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OlBSRUYKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgc2lnbmVkX3dvcmQgb2Zmc2V0ID0gU0lHTkVYVEVORCgoc2lnbmVkX3dvcmQpKChpbnN0cnVjdGlvbiA+PiAwKSAmIDB4MDAwMEZGRkYpLDE2KTsKLSAgaW50IGhpbnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOwotICBzaWduZWRfd29yZCBvcDEgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKV07Ci0gIHsKLSAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoKHVuc2lnbmVkNjQpb3AxICsgb2Zmc2V0KTsKLSAgICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gICAgaW50IHVuY2FjaGVkOwotICAgIHsKLSAgICAgIGlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzTE9BRCwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCi0JUHJlZmV0Y2godW5jYWNoZWQscGFkZHIsdmFkZHIsaXNEQVRBLGhpbnQpOwotICAgIH0KLSAgfQotfQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3N0b3JlOnVuc2lnbmVkIGFjY2VzcywgYWRkcmVzc193b3JkIGJhc2UsIGFkZHJlc3Nfd29yZCBvZmZzZXQsIHVuc2lnbmVkX3dvcmQgd29yZAotewotICBhZGRyZXNzX3dvcmQgbWFzayA9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgPyAweDcgOiAweDMpOwotICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7Ci0gIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7Ci0gIHVuc2lnbmVkIGludCBieXRlOwotICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gIGludCB1bmNhY2hlZDsKLSAgdW5zaWduZWQ2NCBtZW12YWw7Ci0gIGFkZHJlc3Nfd29yZCB2YWRkcjsKLQotICB2YWRkciA9IGJhc2UgKyBvZmZzZXQ7Ci0gIGlmICgodmFkZHIgJiBhY2Nlc3MpICE9IDApCi0gICAgewotICAgICAgU0lNX0NPUkVfU0lHTkFMIChTRCwgU1RBVEVfQ1BVKFNELCAwKSwgY2lhLCByZWFkX21hcCwgYWNjZXNzKzEsIHZhZGRyLCB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0gICAgfQotICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0RBVEEsIGlzU1RPUkUsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKLSAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gcmV2ZXJzZWVuZGlhbikpOwotICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gYmlnZW5kaWFuY3B1KTsKLSAgbWVtdmFsID0gKHdvcmQgPDwgKDggKiBieXRlKSk7Ci0gIFN0b3JlTWVtb3J5ICh1bmNhY2hlZCwgYWNjZXNzLCBtZW12YWwsIDAsIHBhZGRyLCB2YWRkciwgaXNSRUFMKTsKLX0KLQotCi0xMDEwMDAsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6U0IKLSJzYiByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9CWVRFLCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKLX0KLQotCi0xMTEwMDAsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6U0MKLSJzYyByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBzaWduZWRfd29yZCBvZmZzZXQgPSBTSUdORVhURU5EKChzaWduZWRfd29yZCkoKGluc3RydWN0aW9uID4+IDApICYgMHgwMDAwRkZGRiksMTYpOwotICBzaWduZWRfd29yZCBvcDIgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKV07Ci0gIHNpZ25lZF93b3JkIG9wMSA9IEdQUlsoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpXTsKLSAgewotICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodW5zaWduZWQ2NClvcDEgKyBvZmZzZXQpOwotICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgICBpbnQgdW5jYWNoZWQ7Ci0gICAgaWYgKCh2YWRkciAmIDMpICE9IDApCi0gICAgICB7Ci0JU0lNX0NPUkVfU0lHTkFMIChTRCwgQ1BVLCBjaWEsIHJlYWRfbWFwLCA0LCB2YWRkciwgd3JpdGVfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpZiAoQWRkcmVzc1RyYW5zbGF0aW9uKHZhZGRyLGlzREFUQSxpc1NUT1JFLCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKLQkgIHsKLQkgICAgdW5zaWduZWQ2NCBtZW12YWwgPSAwOwotCSAgICB1bnNpZ25lZDY0IG1lbXZhbDEgPSAwOwotCSAgICB1bnNpZ25lZDY0IG1hc2sgPSAweDc7Ci0JICAgIHVuc2lnbmVkIGludCBieXRlOwotCSAgICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiAoUmV2ZXJzZUVuZGlhbiA8PCAyKSkpOwotCSAgICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gKEJpZ0VuZGlhbkNQVSA8PCAyKSk7Ci0JICAgIG1lbXZhbCA9ICgodW5zaWduZWQ2NCkgb3AyIDw8ICg4ICogYnl0ZSkpOwotCSAgICBpZiAoTExCSVQpCi0JICAgICAgewotCQlTdG9yZU1lbW9yeSh1bmNhY2hlZCxBY2Nlc3NMZW5ndGhfV09SRCxtZW12YWwsbWVtdmFsMSxwYWRkcix2YWRkcixpc1JFQUwpOwotCSAgICAgIH0KLQkgICAgR1BSWyhpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGXSA9IExMQklUOwotCSAgfQotICAgICAgfQotICB9Ci19Ci0KLQotMTExMTAwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OlNDRAotInNjZCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7Ci0gIHNpZ25lZF93b3JkIG9wMiA9IEdQUlsoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpXTsKLSAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOwotICB7Ci0gICAgYWRkcmVzc193b3JkIHZhZGRyID0gKCh1bnNpZ25lZDY0KW9wMSArIG9mZnNldCk7Ci0gICAgYWRkcmVzc193b3JkIHBhZGRyOwotICAgIGludCB1bmNhY2hlZDsKLSAgICBpZiAoKHZhZGRyICYgNykgIT0gMCkKLSAgICAgIHsKLQlTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIDgsIHZhZGRyLCB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzU1RPUkUsJnBhZGRyLCZ1bmNhY2hlZCxpc1RBUkdFVCxpc1JFQUwpKQotCSAgewotCSAgICB1bnNpZ25lZDY0IG1lbXZhbCA9IDA7Ci0JICAgIHVuc2lnbmVkNjQgbWVtdmFsMSA9IDA7Ci0JICAgIG1lbXZhbCA9IG9wMjsKLQkgICAgaWYgKExMQklUKQotCSAgICAgIHsKLQkJU3RvcmVNZW1vcnkodW5jYWNoZWQsQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsbWVtdmFsLG1lbXZhbDEscGFkZHIsdmFkZHIsaXNSRUFMKTsKLQkgICAgICB9Ci0JICAgIEdQUlsoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRl0gPSBMTEJJVDsKLQkgIH0KLSAgICAgIH0KLSAgfQotfQotCi0KLTExMTExMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpTRAotInNkIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Ci19Ci0KLQotMTExMSxaWiEwITEhMyw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpTREN6Ci0ic2RjPFpaPiByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBDT1BfU0QgKFpaLCBSVCkpOwotfQotCi0KLTEwMTEwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpTREwKLSJzZGwgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX3N0b3JlX2xlZnQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOwotfQotCi0KLTEwMTEwMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjY0OjpTRFIKLSJzZHIgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX3N0b3JlX3JpZ2h0IChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKLX0KLQotCi0xMDEwMDEsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6U0gKLSJzaCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19zbGw6aW50IHJ0LCBpbnQgcmQsIGludCBzaGlmdAotewotICB1bnNpZ25lZDMyIHRlbXAgPSAoR1BSW3J0XSA8PCBzaGlmdCk7Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltydF0sIHNoaWZ0KTsKLSAgR1BSW3JkXSA9IEVYVEVORDMyICh0ZW1wKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Ci19Ci0KLTAwMDAwMDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDAwMDAwMDpTUEVDSUFMOjMyOjpTTEwKLSJzbGwgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zbGwgKFNEXywgUlQsIFJELCBTSElGVCk7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19zbGx2OmludCBycywgaW50IHJ0LCBpbnQgcmQKLXsKLSAgaW50IHMgPSBNQVNLRUQgKEdQUltyc10sIDQsIDApOwotICB1bnNpZ25lZDMyIHRlbXAgPSAoR1BSW3J0XSA8PCBzKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgcyk7Ci0gIEdQUltyZF0gPSBFWFRFTkQzMiAodGVtcCk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMDAxMDA6U1BFQ0lBTDozMjo6U0xMVgotInNsbHYgcjxSRD4sIHI8UlQ+LCByPFJTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc2xsdiAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3NsdDppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOwotICBHUFJbcmRdID0gKChzaWduZWRfd29yZCkgR1BSW3JzXSA8IChzaWduZWRfd29yZCkgR1BSW3J0XSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDEwMTA6U1BFQ0lBTDozMjo6U0xUCi0ic2x0IHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX3NsdCAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3NsdGk6aW50IHJzLCBpbnQgcnQsIHVuc2lnbmVkMTYgaW1tZWRpYXRlCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEVYVEVORDE2IChpbW1lZGlhdGUpKTsKLSAgR1BSW3J0XSA9ICgoc2lnbmVkX3dvcmQpIEdQUltyc10gPCAoc2lnbmVkX3dvcmQpIEVYVEVORDE2IChpbW1lZGlhdGUpKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3J0XSk7Ci19Ci0KLTAwMTAxMCw1LlJTLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6U0xUSQotInNsdGkgcjxSVD4sIHI8UlM+LCA8SU1NRURJQVRFPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc2x0aSAoU0RfLCBSUywgUlQsIElNTUVESUFURSk7Ci19Ci0KLQotOmZ1bmN0aW9uOjo6dm9pZDpkb19zbHRpdTppbnQgcnMsIGludCBydCwgdW5zaWduZWQxNiBpbW1lZGlhdGUKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgRVhURU5EMTYgKGltbWVkaWF0ZSkpOwotICBHUFJbcnRdID0gKCh1bnNpZ25lZF93b3JkKSBHUFJbcnNdIDwgKHVuc2lnbmVkX3dvcmQpIEVYVEVORDE2IChpbW1lZGlhdGUpKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3J0XSk7Ci19Ci0KLTAwMTAxMSw1LlJTLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6U0xUSVUKLSJzbHRpdSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zbHRpdSAoU0RfLCBSUywgUlQsIElNTUVESUFURSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3NsdHU6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgR1BSW3JkXSA9ICgodW5zaWduZWRfd29yZCkgR1BSW3JzXSA8ICh1bnNpZ25lZF93b3JkKSBHUFJbcnRdKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Ci19Ci0KLTAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDEwMTAxMTpTUEVDSUFMOjMyOjpTTFRVCi0ic2x0dSByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zbHR1IChTRF8sIFJTLCBSVCwgUkQpOwotfQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3JhOmludCBydCwgaW50IHJkLCBpbnQgc2hpZnQKLXsKLSAgc2lnbmVkMzIgdGVtcCA9IChzaWduZWQzMikgR1BSW3J0XSA+PiBzaGlmdDsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgc2hpZnQpOwotICBHUFJbcmRdID0gRVhURU5EMzIgKHRlbXApOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKLX0KLQotMDAwMDAwLDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDAwMDAxMTpTUEVDSUFMOjMyOjpTUkEKLSJzcmEgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zcmEgKFNEXywgUlQsIFJELCBTSElGVCk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3NyYXY6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBpbnQgcyA9IE1BU0tFRCAoR1BSW3JzXSwgNCwgMCk7Ci0gIHNpZ25lZDMyIHRlbXAgPSAoc2lnbmVkMzIpIEdQUltydF0gPj4gczsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgcyk7Ci0gIEdQUltyZF0gPSBFWFRFTkQzMiAodGVtcCk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMDAxMTE6U1BFQ0lBTDozMjo6U1JBVgotInNyYXYgcjxSRD4sIHI8UlQ+LCByPFJTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc3JhdiAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3JsOmludCBydCwgaW50IHJkLCBpbnQgc2hpZnQKLXsKLSAgdW5zaWduZWQzMiB0ZW1wID0gKHVuc2lnbmVkMzIpIEdQUltydF0gPj4gc2hpZnQ7Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltydF0sIHNoaWZ0KTsKLSAgR1BSW3JkXSA9IEVYVEVORDMyICh0ZW1wKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Ci19Ci0KLTAwMDAwMCwwMDAwMCw1LlJULDUuUkQsNS5TSElGVCwwMDAwMTA6U1BFQ0lBTDozMjo6U1JMCi0ic3JsIHI8UkQ+LCByPFJUPiwgPFNISUZUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc3JsIChTRF8sIFJULCBSRCwgU0hJRlQpOwotfQotCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3JsdjppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIGludCBzID0gTUFTS0VEIChHUFJbcnNdLCA0LCAwKTsKLSAgdW5zaWduZWQzMiB0ZW1wID0gKHVuc2lnbmVkMzIpIEdQUltydF0gPj4gczsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgcyk7Ci0gIEdQUltyZF0gPSBFWFRFTkQzMiAodGVtcCk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMDAxMTA6U1BFQ0lBTDozMjo6U1JMVgotInNybHYgcjxSRD4sIHI8UlQ+LCByPFJTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc3JsdiAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDAwMTA6U1BFQ0lBTDozMjo6U1VCCi0ic3ViIHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltSU10sIEdQUltSVF0pOwotICB7Ci0gICAgQUxVMzJfQkVHSU4gKEdQUltSU10pOwotICAgIEFMVTMyX1NVQiAoR1BSW1JUXSk7Ci0gICAgQUxVMzJfRU5EIChHUFJbUkRdKTsKLSAgfQotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUkRdKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3N1YnU6aW50IHJzLCBpbnQgcnQsIGludCByZAotewotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKLSAgR1BSW3JkXSA9IEVYVEVORDMyIChHUFJbcnNdIC0gR1BSW3J0XSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDAwMTE6U1BFQ0lBTDozMjo6U1VCVQotInN1YnUgcjxSRD4sIHI8UlM+LCByPFJUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc3VidSAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi0xMDEwMTEsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6U1cKLSJzdyByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSpyMzkwMDoKLSp2cjUwMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKLX0KLQotCi0xMTEwLFpaITAhMSEzLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OlNXQ3oKLSJzd2M8Wlo+IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIENPUF9TVyAoWlosIFJUKSk7Ci19Ci0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3N0b3JlX2xlZnQ6dW5zaWduZWQgYWNjZXNzLCBhZGRyZXNzX3dvcmQgYmFzZSwgYWRkcmVzc193b3JkIG9mZnNldCwgdW5zaWduZWRfd29yZCBydAotewotICBhZGRyZXNzX3dvcmQgbWFzayA9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgPyAweDcgOiAweDMpOwotICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gLTEgOiAwKTsKLSAgYWRkcmVzc193b3JkIGJpZ2VuZGlhbmNwdSA9IChCaWdFbmRpYW5DUFUgPyAtMSA6IDApOwotICB1bnNpZ25lZCBpbnQgYnl0ZTsKLSAgdW5zaWduZWQgaW50IHdvcmQ7Ci0gIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgaW50IHVuY2FjaGVkOwotICB1bnNpZ25lZDY0IG1lbXZhbDsKLSAgYWRkcmVzc193b3JkIHZhZGRyOwotICBpbnQgbnJfbGhzX2JpdHM7Ci0gIGludCBucl9yaHNfYml0czsKLQotICB2YWRkciA9IGJhc2UgKyBvZmZzZXQ7Ci0gIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNTVE9SRSwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOwotICBwYWRkciA9IChwYWRkciBeIChyZXZlcnNlZW5kaWFuICYgbWFzaykpOwotICBpZiAoQmlnRW5kaWFuTWVtID09IDApCi0gICAgcGFkZHIgPSBwYWRkciAmIH5hY2Nlc3M7Ci0KLSAgLyogY29tcHV0ZSB3aGVyZSB3aXRoaW4gdGhlIHdvcmQvbWVtIHdlIGFyZSAqLwotICBieXRlID0gKCh2YWRkciBeIGJpZ2VuZGlhbmNwdSkgJiBhY2Nlc3MpOyAvKiAwLi5hY2Nlc3MgKi8KLSAgd29yZCA9ICgodmFkZHIgXiBiaWdlbmRpYW5jcHUpICYgKG1hc2sgJiB+YWNjZXNzKSkgLyAoYWNjZXNzICsgMSk7IC8qIDAuLjEgKi8KLSAgbnJfbGhzX2JpdHMgPSA4ICogYnl0ZSArIDg7Ci0gIG5yX3Joc19iaXRzID0gOCAqIGFjY2VzcyAtIDggKiBieXRlOwotICAvKiBucl9saHNfYml0cyArIG5yX3Joc19iaXRzID09IDggKiAoYWNjZXNzcyArIDEpICovCi0gIC8qIGZwcmludGYgKHN0ZGVyciwgInNbd2RdbDogMHglMDhseCUwOGx4IDB4JTA4bHglMDhseCAlZDolZCAlZCslZFxuIiwKLQkgICAobG9uZykgKCh1bnNpZ25lZDY0KSB2YWRkciA+PiAzMiksIChsb25nKSB2YWRkciwKLQkgICAobG9uZykgKCh1bnNpZ25lZDY0KSBwYWRkciA+PiAzMiksIChsb25nKSBwYWRkciwKLQkgICB3b3JkLCBieXRlLCBucl9saHNfYml0cywgbnJfcmhzX2JpdHMpOyAqLwotCi0gIGlmICh3b3JkID09IDApCi0gICAgewotICAgICAgbWVtdmFsID0gKHJ0ID4+IG5yX3Joc19iaXRzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW12YWwgPSAocnQgPDwgbnJfbGhzX2JpdHMpOwotICAgIH0KLSAgLyogZnByaW50ZiAoc3RkZXJyLCAic1t3ZF1sOiAweCUwOGx4JTA4bHggLT4gMHglMDhseCUwOGx4XG4iLAotCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHJ0ID4+IDMyKSwgKGxvbmcpIHJ0LAotCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIG1lbXZhbCA+PiAzMiksIChsb25nKSBtZW12YWwpOyAqLwotICBTdG9yZU1lbW9yeSAodW5jYWNoZWQsIGJ5dGUsIG1lbXZhbCwgMCwgcGFkZHIsIHZhZGRyLCBpc1JFQUwpOwotfQotCi0KLTEwMTAxMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTV0wKLSJzd2wgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zdG9yZV9sZWZ0IChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3N0b3JlX3JpZ2h0OnVuc2lnbmVkIGFjY2VzcywgYWRkcmVzc193b3JkIGJhc2UsIGFkZHJlc3Nfd29yZCBvZmZzZXQsIHVuc2lnbmVkX3dvcmQgcnQKLXsKLSAgYWRkcmVzc193b3JkIG1hc2sgPSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0ID8gMHg3IDogMHgzKTsKLSAgYWRkcmVzc193b3JkIHJldmVyc2VlbmRpYW4gPSAoUmV2ZXJzZUVuZGlhbiA/IC0xIDogMCk7Ci0gIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gLTEgOiAwKTsKLSAgdW5zaWduZWQgaW50IGJ5dGU7Ci0gIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgaW50IHVuY2FjaGVkOwotICB1bnNpZ25lZDY0IG1lbXZhbDsKLSAgYWRkcmVzc193b3JkIHZhZGRyOwotCi0gIHZhZGRyID0gYmFzZSArIG9mZnNldDsKLSAgQWRkcmVzc1RyYW5zbGF0aW9uICh2YWRkciwgaXNEQVRBLCBpc1NUT1JFLCAmcGFkZHIsICZ1bmNhY2hlZCwgaXNUQVJHRVQsIGlzUkVBTCk7Ci0gIHBhZGRyID0gKHBhZGRyIF4gKHJldmVyc2VlbmRpYW4gJiBtYXNrKSk7Ci0gIGlmIChCaWdFbmRpYW5NZW0gIT0gMCkKLSAgICBwYWRkciAmPSB+YWNjZXNzOwotICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gKGJpZ2VuZGlhbmNwdSAmIG1hc2spKTsKLSAgbWVtdmFsID0gKHJ0IDw8IChieXRlICogOCkpOwotICBTdG9yZU1lbW9yeSAodW5jYWNoZWQsIGFjY2VzcyAtIChhY2Nlc3MgJiBieXRlKSwgbWVtdmFsLCAwLCBwYWRkciwgdmFkZHIsIGlzUkVBTCk7Ci19Ci0KLTEwMTExMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTV1IKLSJzd3IgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb19zdG9yZV9yaWdodCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Ci19Ci0KLQotMDAwMDAwMDAwMDAwMDAwMDAwMDAwLDUuU1RZUEUsMDAxMTExOlNQRUNJQUw6MzI6OlNZTkMKLSJzeW5jIjpTVFlQRSA9PSAwCi0ic3luYyA8U1RZUEU+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBTeW5jT3BlcmF0aW9uIChTVFlQRSk7Ci19Ci0KLQotMDAwMDAwLDIwLkNPREUsMDAxMTAwOlNQRUNJQUw6MzI6OlNZU0NBTEwKLSJzeXNjYWxsIDxDT0RFPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgU2lnbmFsRXhjZXB0aW9uKFN5c3RlbUNhbGwsIGluc3RydWN0aW9uXzApOwotfQotCi0KLTAwMDAwMCw1LlJTLDUuUlQsMTAuQ09ERSwxMTAxMDA6U1BFQ0lBTDozMjo6VEVRCi0idGVxIHI8UlM+LCByPFJUPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA9PSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCi0gICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOwotfQotCi0KLTAwMDAwMSw1LlJTLDAxMTAwLDE2LklNTUVESUFURTpSRUdJTU06MzI6OlRFUUkKLSJ0ZXFpIHI8UlM+LCA8SU1NRURJQVRFPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA9PSAoc2lnbmVkX3dvcmQpIEVYVEVORDE2IChJTU1FRElBVEUpKQotICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMDAwMDAsNS5SUyw1LlJULDEwLkNPREUsMTEwMDAwOlNQRUNJQUw6MzI6OlRHRQotInRnZSByPFJTPiwgcjxSVD4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPj0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMDAwMDEsNS5SUywwMTAwMCwxNi5JTU1FRElBVEU6UkVHSU1NOjMyOjpUR0VJCi0idGdlaSByPFJTPiwgPElNTUVESUFURT4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPj0gKHNpZ25lZF93b3JkKSBFWFRFTkQxNiAoSU1NRURJQVRFKSkKLSAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Ci19Ci0KLQotMDAwMDAxLDUuUlMsMDEwMDEsMTYuSU1NRURJQVRFOlJFR0lNTTozMjo6VEdFSVUKLSJ0Z2VpdSByPFJTPiwgPElNTUVESUFURT4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgodW5zaWduZWRfd29yZCkgR1BSW1JTXSA+PSAodW5zaWduZWRfd29yZCkgRVhURU5EMTYgKElNTUVESUFURSkpCi0gICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOwotfQotCi0KLTAwMDAwMCw1LlJTLDUuUlQsMTAuQ09ERSwxMTAwMDE6U1BFQ0lBTDozMjo6VEdFVQotInRnZXUgcjxSUz4sIHI8UlQ+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBpZiAoKHVuc2lnbmVkX3dvcmQpIEdQUltSU10gPj0gKHVuc2lnbmVkX3dvcmQpIEdQUltSVF0pCi0gICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOwotfQotCi0KLTAwMDAwMCw1LlJTLDUuUlQsMTAuQ09ERSwxMTAwMTA6U1BFQ0lBTDozMjo6VExUCi0idGx0IHI8UlM+LCByPFJUPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8IChzaWduZWRfd29yZCkgR1BSW1JUXSkKLSAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Ci19Ci0KLQotMDAwMDAxLDUuUlMsMDEwMTAsMTYuSU1NRURJQVRFOlJFR0lNTTozMjo6VExUSQotInRsdGkgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDwgKHNpZ25lZF93b3JkKSBFWFRFTkQxNiAoSU1NRURJQVRFKSkKLSAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Ci19Ci0KLQotMDAwMDAxLDUuUlMsMDEwMTEsMTYuSU1NRURJQVRFOlJFR0lNTTozMjo6VExUSVUKLSJ0bHRpdSByPFJTPiwgPElNTUVESUFURT4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgodW5zaWduZWRfd29yZCkgR1BSW1JTXSA8ICh1bnNpZ25lZF93b3JkKSBFWFRFTkQxNiAoSU1NRURJQVRFKSkKLSAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Ci19Ci0KLQotMDAwMDAwLDUuUlMsNS5SVCwxMC5DT0RFLDExMDAxMTpTUEVDSUFMOjMyOjpUTFRVCi0idGx0dSByPFJTPiwgcjxSVD4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgodW5zaWduZWRfd29yZCkgR1BSW1JTXSA8ICh1bnNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMDAwMDAsNS5SUyw1LlJULDEwLkNPREUsMTEwMTEwOlNQRUNJQUw6MzI6OlRORQotInRuZSByPFJTPiwgcjxSVD4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gIT0gKHNpZ25lZF93b3JkKSBHUFJbUlRdKQotICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMDAwMDEsNS5SUywwMTExMCwxNi5JTU1FRElBVEU6UkVHSU1NOjMyOjpUTkVJCi0idG5lIHI8UlM+LCA8SU1NRURJQVRFPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLXsKLSAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSAhPSAoc2lnbmVkX3dvcmQpIEVYVEVORDE2IChJTU1FRElBVEUpKQotICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3hvcjppbnQgcnMsIGludCBydCwgaW50IHJkCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOwotICBHUFJbcmRdID0gR1BSW3JzXSBeIEdQUltydF07Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOwotfQotCi0wMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDAxMTA6U1BFQ0lBTDozMjo6WE9SCi0ieG9yIHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX3hvciAoU0RfLCBSUywgUlQsIFJEKTsKLX0KLQotCi06ZnVuY3Rpb246Ojp2b2lkOmRvX3hvcmk6aW50IHJzLCBpbnQgcnQsIHVuc2lnbmVkMTYgaW1tZWRpYXRlCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIGltbWVkaWF0ZSk7Ci0gIEdQUltydF0gPSBHUFJbcnNdIF4gaW1tZWRpYXRlOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcnRdKTsKLX0KLQotMDAxMTEwLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjMyOjpYT1JJCi0ieG9yaSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBkb194b3JpIChTRF8sIFJTLCBSVCwgSU1NRURJQVRFKTsKLX0KLQotDAotLy8KLS8vIE1JUFMgQXJjaGl0ZWN0dXJlOgotLy8KLS8vICAgICAgICBGUFUgSW5zdHJ1Y3Rpb24gU2V0IChDT1AxICYgQ09QMVgpCi0vLwotCi0KLTolczo6OjpGTVQ6aW50IGZtdAotewotICBzd2l0Y2ggKGZtdCkKLSAgICB7Ci0gICAgY2FzZSBmbXRfc2luZ2xlOiByZXR1cm4gInMiOwotICAgIGNhc2UgZm10X2RvdWJsZTogcmV0dXJuICJkIjsKLSAgICBjYXNlIGZtdF93b3JkOiByZXR1cm4gInciOwotICAgIGNhc2UgZm10X2xvbmc6IHJldHVybiAibCI7Ci0gICAgZGVmYXVsdDogcmV0dXJuICI/IjsKLSAgICB9Ci19Ci0KLTolczo6OjpYOmludCB4Ci17Ci0gIHN3aXRjaCAoeCkKLSAgICB7Ci0gICAgY2FzZSAwOiByZXR1cm4gImYiOwotICAgIGNhc2UgMTogcmV0dXJuICJ0IjsKLSAgICBkZWZhdWx0OiByZXR1cm4gIj8iOwotICAgIH0KLX0KLQotOiVzOjo6OlRGOmludCB0ZgotewotICBpZiAodGYpCi0gICAgcmV0dXJuICJ0IjsKLSAgZWxzZQotICAgIHJldHVybiAiZiI7Ci19Ci0KLTolczo6OjpORDppbnQgbmQKLXsKLSAgaWYgKG5kKQotICAgIHJldHVybiAibCI7Ci0gIGVsc2UKLSAgICByZXR1cm4gIiI7Ci19Ci0KLTolczo6OjpDT05EOmludCBjb25kCi17Ci0gIHN3aXRjaCAoY29uZCkKLSAgICB7Ci0gICAgY2FzZSAwMDogcmV0dXJuICJmIjsKLSAgICBjYXNlIDAxOiByZXR1cm4gInVuIjsKLSAgICBjYXNlIDAyOiByZXR1cm4gImVxIjsKLSAgICBjYXNlIDAzOiByZXR1cm4gInVlcSI7Ci0gICAgY2FzZSAwNDogcmV0dXJuICJvbHQiOwotICAgIGNhc2UgMDU6IHJldHVybiAidWx0IjsKLSAgICBjYXNlIDA2OiByZXR1cm4gIm9sZSI7Ci0gICAgY2FzZSAwNzogcmV0dXJuICJ1bGUiOwotICAgIGNhc2UgMDEwOiByZXR1cm4gInNmIjsKLSAgICBjYXNlIDAxMTogcmV0dXJuICJuZ2xlIjsKLSAgICBjYXNlIDAxMjogcmV0dXJuICJzZXEiOwotICAgIGNhc2UgMDEzOiByZXR1cm4gIm5nbCI7Ci0gICAgY2FzZSAwMTQ6IHJldHVybiAibHQiOwotICAgIGNhc2UgMDE1OiByZXR1cm4gIm5nZSI7Ci0gICAgY2FzZSAwMTY6IHJldHVybiAibGUiOwotICAgIGNhc2UgMDE3OiByZXR1cm4gIm5ndCI7Ci0gICAgZGVmYXVsdDogcmV0dXJuICI/IjsKLSAgICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDAxMDE6Q09QMTozMixmOjpBQlMuZm10Ci0iYWJzLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgICBlbHNlCi0gICAgICBTdG9yZUZQUihkZXN0cmVnLGZvcm1hdCxBYnNvbHV0ZVZhbHVlKFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0KSk7Ci0gIH0KLX0KLQotCi0KLTAxMDAwMSwxMCwzLkZNVCw1LkZULDUuRlMsNS5GRCwwMDAwMDA6Q09QMTozMixmOjpBREQuZm10Ci0iYWRkLiVzPEZNVD4gZjxGRD4sIGY8RlM+LCBmPEZUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKLSAgewotICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LEFkZChWYWx1ZUZQUihmcyxmb3JtYXQpLFZhbHVlRlBSKGZ0LGZvcm1hdCksZm9ybWF0KSk7Ci0gIH0KLX0KLQotCi0KLS8vIEJDMUYKLS8vIEJDMUZMCi0vLyBCQzFUCi0vLyBCQzFUTAotCi0wMTAwMDEsMDEwMDAsMy4wLDEuTkQsMS5URiwxNi5PRkZTRVQ6Q09QMVM6MzIsZjo6QkMxYQotImJjMSVzPFRGPiVzPE5EPiA8T0ZGU0VUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSToKLXsKLSAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKLSAgVFJBQ0VfQlJBTkNIX0lOUFVUIChQUkVWQ09DMSgpKTsKLSAgaWYgKFBSRVZDT0MxKCkgPT0gVEYpCi0gICAgewotICAgICAgYWRkcmVzc193b3JkIGRlc3QgPSBOSUEgKyAoRVhURU5EMTYgKE9GRlNFVCkgPDwgMik7Ci0gICAgICBUUkFDRV9CUkFOQ0hfUkVTVUxUIChkZXN0KTsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoZGVzdCk7Ci0gICAgICBERUxBWV9TTE9UIChkZXN0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKE5EKQotICAgIHsKLSAgICAgIFRSQUNFX0JSQU5DSF9SRVNVTFQgKDApOwotICAgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFRSQUNFX0JSQU5DSF9SRVNVTFQgKE5JQSk7Ci0gICAgfQotfQotCi0wMTAwMDEsMDEwMDAsMy5DQywxLk5ELDEuVEYsMTYuT0ZGU0VUOkNPUDFTOjMyLGY6OkJDMWIKLSJiYzElczxURj4lczxORD4gPE9GRlNFVD4iOkNDID09IDAKLSJiYzElczxURj4lczxORD4gPENDPiwgPE9GRlNFVD4iCi0qbWlwc0lWOgotKnZyNTAwMDoKLSMqdnI0MTAwOgotKnIzOTAwOgotewotICBjaGVja19icmFuY2hfYnVnICgpOwotICBpZiAoR0VURkNDKENDKSA9PSBURikKLSAgICB7Ci0gICAgICBhZGRyZXNzX3dvcmQgZGVzdCA9IE5JQSArIChFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyKTsKLSAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoZGVzdCk7Ci0gICAgICBERUxBWV9TTE9UIChkZXN0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKE5EKQotICAgIHsKLSAgICAgIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTiAoKTsKLSAgICB9Ci19Ci0KLQotCi0KLQotCi0vLyBDLkVRLlMKLS8vIEMuRVEuRAotLy8gLi4uCi0KLTpmdW5jdGlvbjo6OnZvaWQ6ZG9fY19jb25kX2ZtdDppbnQgZm10LCBpbnQgZnQsIGludCBmcywgaW50IGNjLCBpbnQgY29uZCwgaW5zdHJ1Y3Rpb25fd29yZCBpbnNuCi17Ci0gIGlmICgoZm10ICE9IGZtdF9zaW5nbGUpICYmIChmbXQgIT0gZm10X2RvdWJsZSkpCi0gICAgU2lnbmFsRXhjZXB0aW9uIChSZXNlcnZlZEluc3RydWN0aW9uLCBpbnNuKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBsZXNzOwotICAgICAgaW50IGVxdWFsOwotICAgICAgaW50IHVub3JkZXJlZDsKLSAgICAgIGludCBjb25kaXRpb247Ci0gICAgICB1bnNpZ25lZDY0IG9mcyA9IFZhbHVlRlBSIChmcywgZm10KTsKLSAgICAgIHVuc2lnbmVkNjQgb2Z0ID0gVmFsdWVGUFIgKGZ0LCBmbXQpOwotICAgICAgaWYgKE5hTiAob2ZzLCBmbXQpIHx8IE5hTiAob2Z0LCBmbXQpKQotCXsKLQkgIGlmIChGQ1NSICYgRlBfRU5BQkxFIChJTykpCi0JICAgIHsKLQkgICAgICBGQ1NSIHw9IEZQX0NBVVNFIChJTyk7Ci0JICAgICAgU2lnbmFsRXhjZXB0aW9uRlBFICgpOwotCSAgICB9Ci0JICBsZXNzID0gMDsKLQkgIGVxdWFsID0gMDsKLQkgIHVub3JkZXJlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxlc3MgPSBMZXNzIChvZnMsIG9mdCwgZm10KTsKLQkgIGVxdWFsID0gRXF1YWwgKG9mcywgb2Z0LCBmbXQpOwotCSAgdW5vcmRlcmVkID0gMDsKLQl9Ci0gICAgICBjb25kaXRpb24gPSAoKChjb25kICYgKDEgPDwgMikpICYmIGxlc3MpCi0JCSAgIHx8ICgoY29uZCAmICgxIDw8IDEpKSAmJiBlcXVhbCkKLQkJICAgfHwgKChjb25kICYgKDEgPDwgMCkpICYmIHVub3JkZXJlZCkpOwotICAgICAgU0VURkNDIChjYywgY29uZGl0aW9uKTsKLSAgICB9Ci19Ci0KLTAxMDAwMSwxMCwzLkZNVCw1LkZULDUuRlMsMy4wLDAwLDExLDQuQ09ORDpDT1AxOjMyOjpDLmNvbmQuZm10YQotImMuJXM8Q09ORD4uJXM8Rk1UPiBmPEZTPiwgZjxGVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUk6Ci17Ci0gIGRvX2NfY29uZF9mbXQgKFNEXywgRk1ULCBGVCwgRlMsIDAsIENPTkQsIGluc3RydWN0aW9uXzApOwotfQotCi0wMTAwMDEsMTAsMy5GTVQsNS5GVCw1LkZTLDMuQ0MsMDAsMTEsNC5DT05EOkNPUDE6MzI6OkMuY29uZC5mbXRiCi0iYy4lczxDT05EPi4lczxGTVQ+IGY8RlM+LCBmPEZUPiI6Q0MgPT0gMAotImMuJXM8Q09ORD4uJXM8Rk1UPiA8Q0M+LCBmPEZTPiwgZjxGVD4iCi0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX2NfY29uZF9mbXQgKFNEXywgRk1ULCBGVCwgRlMsIENDLCBDT05ELCBpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMTAxMDpDT1AxOjY0OjpDRUlMLkwuZm10Ci0iY2VpbC5sLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X2xvbmcsQ29udmVydChGUF9STV9UT1BJTkYsVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X2xvbmcpKTsKLSAgfQotfQotCi0KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAxMTEwOkNPUDE6MzI6OkNFSUwuVwotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gIGVsc2UKLSAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3dvcmQsQ29udmVydChGUF9STV9UT1BJTkYsVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X3dvcmQpKTsKLSAgfQotfQotCi0KLS8vIENGQzEKLS8vIENUQzEKLTAxMDAwMSwwMCxYLDEwLDUuUlQsNS5GUywwMDAwMDAwMDAwMDpDT1AxU2E6MzI6OkN4QzEKLSJjJXM8WD5jMSByPFJUPiwgZjxGUz4iCi0qbWlwc0k6Ci0qbWlwc0lJOgotKm1pcHNJSUk6Ci17Ci0gIGlmIChYKQotICAgIHsKLSAgICAgIGlmIChGUyA9PSAwKQotCVBFTkRJTkdfRklMTCgoRlMgKyBGQ1IwSURYKSxWTDRfOChHUFJbUlRdKSk7Ci0gICAgICBlbHNlIGlmIChGUyA9PSAzMSkKLQlQRU5ESU5HX0ZJTEwoKEZTICsgRkNSMzFJRFgpLFZMNF84KEdQUltSVF0pKTsKLSAgICAgIC8qIGVsc2UgTk9QICovCi0gICAgICBQRU5ESU5HX0ZJTEwoQ09DSURYLDApOyAvKiBzcGVjaWFsIGNhc2UgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7IC8qIGNvbnRyb2wgZnJvbSAqLwotICAgICAgaWYgKEZTID09IDApCi0gCVBFTkRJTkdfRklMTChSVCxTSUdORVhURU5EKEZDUjAsMzIpKTsKLSAgICAgIGVsc2UgaWYgKEZTID09IDMxKQotIAlQRU5ESU5HX0ZJTEwoUlQsU0lHTkVYVEVORChGQ1IzMSwzMikpOwotICAgICAgLyogZWxzZSBOT1AgKi8KLSAgICB9Ci19Ci0wMTAwMDEsMDAsWCwxMCw1LlJULDUuRlMsMDAwMDAwMDAwMDA6Q09QMVNiOjMyOjpDeEMxCi0iYyVzPFg+YzEgcjxSVD4sIGY8RlM+IgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBpZiAoWCkKLSAgICB7Ci0gICAgICAvKiBjb250cm9sIHRvICovCi0gICAgICBUUkFDRV9BTFVfSU5QVVQxIChHUFJbUlRdKTsKLSAgICAgIGlmIChGUyA9PSAwKQotCXsKLQkgIEZDUjAgPSBWTDRfOChHUFJbUlRdKTsKLQkgIFRSQUNFX0FMVV9SRVNVTFQgKEZDUjApOwotCX0KLSAgICAgIGVsc2UgaWYgKEZTID09IDMxKQotCXsKLQkgIEZDUjMxID0gVkw0XzgoR1BSW1JUXSk7Ci0JICBTRVRGQ0MoMCwoKEZDUjMxICYgKDEgPDwgMjMpKSA/IDEgOiAwKSk7Ci0JICBUUkFDRV9BTFVfUkVTVUxUIChGQ1IzMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFRSQUNFX0FMVV9SRVNVTFQwICgpOwotCX0KLSAgICAgIC8qIGVsc2UgTk9QICovCi0gICAgfQotICBlbHNlCi0gICAgeyAvKiBjb250cm9sIGZyb20gKi8KLSAgICAgIGlmIChGUyA9PSAwKQotCXsKLQkgIFRSQUNFX0FMVV9JTlBVVDEgKEZDUjApOwotCSAgR1BSW1JUXSA9IFNJR05FWFRFTkQgKEZDUjAsIDMyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChGUyA9PSAzMSkKLQl7Ci0JICBUUkFDRV9BTFVfSU5QVVQxIChGQ1IzMSk7Ci0JICBHUFJbUlRdID0gU0lHTkVYVEVORCAoRkNSMzEsIDMyKTsKLQl9Ci0gICAgICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUlRdKTsKLSAgICAgIC8qIGVsc2UgTk9QICovCi0gICAgfQotfQotCi0KLS8vCi0vLyBGSVhNRTogRG9lcyBub3QgY29ycmVjdGx5IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtaXBzKgotLy8KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMTAwMDAxOkNPUDE6MzI6OkNWVC5ELmZtdAotImN2dC5kLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICAgaWYgKChmb3JtYXQgPT0gZm10X2RvdWJsZSkgfCAwKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X2RvdWJsZSxDb252ZXJ0KEdFVFJNKCksVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X2RvdWJsZSkpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwxMDAxMDE6Q09QMTo2NDo6Q1ZULkwuZm10Ci0iY3Z0LmwuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKLSAgewotICAgIGlmICgoZm9ybWF0ID09IGZtdF9sb25nKSB8ICgoZm9ybWF0ID09IGZtdF9sb25nKSB8fCAoZm9ybWF0ID09IGZtdF93b3JkKSkpCi0gICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gICAgZWxzZQotICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfbG9uZyxDb252ZXJ0KEdFVFJNKCksVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X2xvbmcpKTsKLSAgfQotfQotCi0KLS8vCi0vLyBGSVhNRTogRG9lcyBub3QgY29ycmVjdGx5IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtaXBzKgotLy8KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMTAwMDAwOkNPUDE6MzI6OkNWVC5TLmZtdAotImN2dC5zLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICAgaWYgKChmb3JtYXQgPT0gZm10X3NpbmdsZSkgfCAwKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3NpbmdsZSxDb252ZXJ0KEdFVFJNKCksVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X3NpbmdsZSkpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwxMDAxMDA6Q09QMTozMjo6Q1ZULlcuZm10Ci0iY3Z0LncuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCA9PSBmbXRfd29yZCkgfCAoKGZvcm1hdCA9PSBmbXRfbG9uZykgfHwgKGZvcm1hdCA9PSBmbXRfd29yZCkpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3dvcmQsQ29udmVydChHRVRSTSgpLFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF93b3JkKSk7Ci0gIH0KLX0KLQotCi0wMTAwMDEsMTAsMy5GTVQsNS5GVCw1LkZTLDUuRkQsMDAwMDExOkNPUDE6MzI6OkRJVi5mbXQKLSJkaXYuJXM8Rk1UPiBmPEZEPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgICBlbHNlCi0gICAgICBTdG9yZUZQUihkZXN0cmVnLGZvcm1hdCxEaXZpZGUoVmFsdWVGUFIoZnMsZm9ybWF0KSxWYWx1ZUZQUihmdCxmb3JtYXQpLGZvcm1hdCkpOwotICB9Ci19Ci0KLQotLy8gRE1GQzEKLS8vIERNVEMxCi0wMTAwMDEsMDAsWCwwMSw1LlJULDUuRlMsMDAwMDAwMDAwMDA6Q09QMVNhOjY0OjpETXhDMQotImRtJXM8WD5jMSByPFJUPiwgZjxGUz4iCi0qbWlwc0lJSToKLXsKLSAgaWYgKFgpCi0gICAgewotICAgICAgaWYgKFNpemVGR1IoKSA9PSA2NCkKLQlQRU5ESU5HX0ZJTEwoKEZTICsgRkdSSURYKSxHUFJbUlRdKTsKLSAgICAgIGVsc2UgaWYgKChGUyAmIDB4MSkgPT0gMCkKLQl7Ci0JICBQRU5ESU5HX0ZJTEwoKChGUyArIDEpICsgRkdSSURYKSxWSDRfOChHUFJbUlRdKSk7Ci0JICBQRU5ESU5HX0ZJTEwoKEZTICsgRkdSSURYKSxWTDRfOChHUFJbUlRdKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChTaXplRkdSKCkgPT0gNjQpCi0JUEVORElOR19GSUxMKFJULEZHUltGU10pOwotICAgICAgZWxzZSBpZiAoKEZTICYgMHgxKSA9PSAwKQotCVBFTkRJTkdfRklMTChSVCwoU0VUNjRISShGR1JbRlMrMV0pIHwgRkdSW0ZTXSkpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChTVEFURV9WRVJCT1NFX1AoU0QpKQotCSAgICBzaW1faW9fZXByaW50ZiAoU0QsIAotCSAgICAgICJXYXJuaW5nOiBQQyAweCV4OiBzZW1hbnRpY19ETXhDMV9DT1AxU2EgMzItYml0IHVzZSBvZiBvZGQgRlBSIG51bWJlclxuIiwKLQkgICAgICBDSUEpOwotCSAgUEVORElOR19GSUxMKFJULFNFVDY0SEkoMHhERUFEQzBERSkgfCAweEJBRDBCQUQwKTsKLQl9Ci0gICAgfQotfQotMDEwMDAxLDAwLFgsMDEsNS5SVCw1LkZTLDAwMDAwMDAwMDAwOkNPUDFTYjo2NDo6RE14QzEKLSJkbSVzPFg+YzEgcjxSVD4sIGY8RlM+IgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBpZiAoWCkKLSAgICB7Ci0gICAgICBpZiAoU2l6ZUZHUigpID09IDY0KQotCVN0b3JlRlBSIChGUywgZm10X3VuaW50ZXJwcmV0ZWRfNjQsIEdQUltSVF0pOwotICAgICAgZWxzZSBpZiAoKEZTICYgMHgxKSA9PSAwKQotCVN0b3JlRlBSIChGUywgZm10X3VuaW50ZXJwcmV0ZWRfNjQsIFNFVDY0SEkgKEZHUltGUysxXSkgfCBGR1JbRlNdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoU2l6ZUZHUigpID09IDY0KQotCUdQUltSVF0gPSBGR1JbRlNdOwotICAgICAgZWxzZSBpZiAoKEZTICYgMHgxKSA9PSAwKQotCUdQUltSVF0gPSBTRVQ2NEhJIChGR1JbRlMrMV0pIHwgRkdSW0ZTXTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU1RBVEVfVkVSQk9TRV9QKFNEKSkKLQkgICAgc2ltX2lvX2VwcmludGYgKFNELCAKLQkgICAgICAiV2FybmluZzogUEMgMHglbHg6IERNeEMxIDMyLWJpdCB1c2Ugb2Ygb2RkIEZQUiBudW1iZXJcbiIsCi0JCQkgICAgKGxvbmcpIENJQSk7Ci0JICBHUFJbUlRdID0gU0VUNjRISSAoMHhERUFEQzBERSkgfCAweEJBRDBCQUQwOwotCX0KLSAgICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDEwMTE6Q09QMTo2NDo6RkxPT1IuTC5mbXQKLSJmbG9vci5sLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X2xvbmcsQ29udmVydChGUF9STV9UT01JTkYsVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X2xvbmcpKTsKLSAgfQotfQotCi0KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAxMTExOkNPUDE6MzI6OkZMT09SLlcuZm10Ci0iZmxvb3Iudy4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKLSptaXBzSUk6Ci0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKLSAgewotICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gICAgZWxzZQotICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfd29yZCxDb252ZXJ0KEZQX1JNX1RPTUlORixWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfd29yZCkpOwotICB9Ci19Ci0KLQotMTEwMTAxLDUuQkFTRSw1LkZULDE2Lk9GRlNFVDpDT1AxOjY0OjpMREMxCi0ibGRjMSBmPEZUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0k6Ci0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIENPUF9MRCAoMSwgRlQsIGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKLX0KLQotCi0wMTAwMTEsNS5CQVNFLDUuSU5ERVgsNS4wLDUuRkQsMDAwMDAxOkNPUDFYOjY0OjpMRFhDMQotImxkeGMxIGY8RkQ+LCByPElOREVYPihyPEJBU0U+KSIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICBDT1BfTEQgKDEsIEZELCBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEdQUltJTkRFWF0pKTsKLX0KLQotCi0KLTExMDAwMSw1LkJBU0UsNS5GVCwxNi5PRkZTRVQ6Q09QMTozMjo6TFdDMSAKLSJsd2MxIGY8RlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgQ09QX0xXICgxLCBGVCwgZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOwotfQotCi0KLTAxMDAxMSw1LkJBU0UsNS5JTkRFWCw1LjAsNS5GRCwwMDAwMDA6Q09QMVg6MzI6OkxXWEMxCi0ibHd4YzEgZjxGRD4sIHI8SU5ERVg+KHI8QkFTRT4pIgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIENPUF9MVyAoMSwgRkQsIGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgR1BSW0lOREVYXSkpOwotfQotCi0KLQotLy8KLS8vIEZJWE1FOiBOb3QgY29ycmVjdCBmb3IgbWlwcyoKLS8vCi0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMDAsMDAxOkNPUDFYOjMyLGY6Ok1BREQuRAotIm1hZGQuZCBmPEZEPiwgZjxGUj4sIGY8RlM+LCBmPEZUPiIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmciA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRik7Ci0gIHsKLSAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9kb3VibGUsQWRkKE11bHRpcGx5KFZhbHVlRlBSKGZzLGZtdF9kb3VibGUpLFZhbHVlRlBSKGZ0LGZtdF9kb3VibGUpLGZtdF9kb3VibGUpLFZhbHVlRlBSKGZyLGZtdF9kb3VibGUpLGZtdF9kb3VibGUpKTsKLSAgfQotfQotCi0KLTAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDEwMCwwMDA6Q09QMVg6MzIsZjo6TUFERC5TCi0ibWFkZC5zIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKLSAgewotICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3NpbmdsZSxBZGQoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X3NpbmdsZSksVmFsdWVGUFIoZnQsZm10X3NpbmdsZSksZm10X3NpbmdsZSksVmFsdWVGUFIoZnIsZm10X3NpbmdsZSksZm10X3NpbmdsZSkpOwotICB9Ci19Ci0KLQotLy8gTUZDMQotLy8gTVRDMQotMDEwMDAxLDAwLFgsMDAsNS5SVCw1LkZTLDAwMDAwMDAwMDAwOkNPUDFTYTozMjo6TXhDMQotIm0lczxYPmMxIHI8UlQ+LCBmPEZTPiIKLSptaXBzSToKLSptaXBzSUk6Ci0qbWlwc0lJSToKLXsKLSAgaWYgKFgpCi0gICAgeyAvKk1UQzEqLwotICAgICAgaWYgKFNpemVGR1IoKSA9PSA2NCkKLQl7Ci0JICBpZiAoU1RBVEVfVkVSQk9TRV9QKFNEKSkKLQkgICAgc2ltX2lvX2VwcmludGYgKFNELCAKLQkgICAgICAiV2FybmluZzogIFBDIDB4JXg6IE1UQzEgbm90IERNVEMxIHdpdGggNjQgYml0IHJlZ3NcbiIsIENJQSk7Ci0JICBQRU5ESU5HX0ZJTEwgKChGUyArIEZHUklEWCksIChTRVQ2NEhJKDB4REVBREMwREUpIHwgVkw0XzgoR1BSW1JUXSkpKTsKLQl9Ci0gICAgICBlbHNlCi0JUEVORElOR19GSUxMICgoRlMgKyBGR1JJRFgpLCBWTDRfOChHUFJbUlRdKSk7Ci0gICAgfQotICBlbHNlIC8qTUZDMSovCi0gICAgUEVORElOR19GSUxMIChSVCwgU0lHTkVYVEVORChGR1JbRlNdLDMyKSk7Ci19Ci0wMTAwMDEsMDAsWCwwMCw1LlJULDUuRlMsMDAwMDAwMDAwMDA6Q09QMVNiOjMyOjpNeEMxCi0ibSVzPFg+YzEgcjxSVD4sIGY8RlM+IgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICBpbnQgZnMgPSBGUzsKLSAgaWYgKFgpCi0gICAgLypNVEMxKi8KLSAgICBTdG9yZUZQUiAoRlMsIGZtdF91bmludGVycHJldGVkXzMyLCBWTDRfOCAoR1BSW1JUXSkpOwotICBlbHNlIC8qTUZDMSovCi0gICAgR1BSW1JUXSA9IFNJR05FWFRFTkQoRkdSW0ZTXSwzMik7Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDAxMTA6Q09QMTozMjo6TU9WLmZtdAotIm1vdi4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKLSAgewotICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LFZhbHVlRlBSKGZzLGZvcm1hdCkpOwotICB9Ci19Ci0KLQotLy8gTU9WRgotLy8gTU9WVAotMDAwMDAwLDUuUlMsMy5DQywwLDEuVEYsNS5SRCwwMDAwMDAwMDAwMTpTUEVDSUFMOjMyOjpNT1Z0ZgotIm1vdiVzPFRGPiByPFJEPiwgcjxSUz4sIDxDQz4iCi0qbWlwc0lWOgotKnZyNTAwMDoKLXsKLSAgaWYgKEdFVEZDQyhDQykgPT0gVEYpCi0gICAgR1BSW1JEXSA9IEdQUltSU107Ci19Ci0KLQotLy8gTU9WRi5mbXQKLS8vIE1PVlQuZm10Ci0wMTAwMDEsMTAsMy5GTVQsMy5DQywwLDEuVEYsNS5GUyw1LkZELDAxMDAwMTpDT1AxOjMyOjpNT1Z0Zi5mbXQKLSJtb3YlczxURj4uJXM8Rk1UPiBmPEZEPiwgZjxGUz4sIDxDQz4iCi0qbWlwc0lWOgotKnZyNTAwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICBpZiAoR0VURkNDKENDKSA9PSBURikKLSAgICAgU3RvcmVGUFIgKEZELCBmb3JtYXQsIFZhbHVlRlBSIChGUywgZm9ybWF0KSk7Ci0gICBlbHNlCi0gICAgIFN0b3JlRlBSIChGRCwgZm9ybWF0LCBWYWx1ZUZQUiAoRkQsIGZvcm1hdCkpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDUuUlQsNS5GUyw1LkZELDAxMDAxMTpDT1AxOjMyOjpNT1ZOLmZtdAotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBTdG9yZUZQUihkZXN0cmVnLGZvcm1hdCxWYWx1ZUZQUihmcyxmb3JtYXQpKTsKLSAgfQotfQotCi0KLS8vIE1PVlQgc2VlIE1PVnRmCi0KLQotLy8gTU9WVC5mbXQgc2VlIE1PVnRmLmZtdAotCi0KLQotMDEwMDAxLDEwLDMuRk1ULDUuUlQsNS5GUyw1LkZELDAxMDAxMDpDT1AxOjMyOjpNT1ZaLmZtdAotIm1vdnouJXM8Rk1UPiBmPEZEPiwgZjxGUz4sIHI8UlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LFZhbHVlRlBSKGZzLGZvcm1hdCkpOwotICB9Ci19Ci0KLQotLy8gTVNVQi5mbXQKLTAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDEwMSwwMDE6Q09QMVg6MzI6Ok1TVUIuRAotIm1zdWIuZCBmPEZEPiwgZjxGUj4sIGY8RlM+LCBmPEZUPiIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmciA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRik7Ci0gIHsKLSAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9kb3VibGUsU3ViKE11bHRpcGx5KFZhbHVlRlBSKGZzLGZtdF9kb3VibGUpLFZhbHVlRlBSKGZ0LGZtdF9kb3VibGUpLGZtdF9kb3VibGUpLFZhbHVlRlBSKGZyLGZtdF9kb3VibGUpLGZtdF9kb3VibGUpKTsKLSAgfQotfQotCi0KLS8vIE1TVUIuZm10Ci0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMDEwMDA6Q09QMVg6MzI6Ok1TVUIuUwotIm1zdWIucyBmPEZEPiwgZjxGUj4sIGY8RlM+LCBmPEZUPiIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmciA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRik7Ci0gIHsKLSAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3NpbmdsZSxTdWIoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X3NpbmdsZSksVmFsdWVGUFIoZnQsZm10X3NpbmdsZSksZm10X3NpbmdsZSksVmFsdWVGUFIoZnIsZm10X3NpbmdsZSksZm10X3NpbmdsZSkpOwotICB9Ci19Ci0KLQotLy8gTVRDMSBzZWUgTXhDMQotCi0KLTAxMDAwMSwxMCwzLkZNVCw1LkZULDUuRlMsNS5GRCwwMDAwMTA6Q09QMTozMjo6TVVMLmZtdAotIm11bC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiwgZjxGVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LE11bHRpcGx5KFZhbHVlRlBSKGZzLGZvcm1hdCksVmFsdWVGUFIoZnQsZm9ybWF0KSxmb3JtYXQpKTsKLSAgfQotfQotCi0KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAwMTExOkNPUDE6MzI6Ok5FRy5mbXQKLSJuZWcuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LE5lZ2F0ZShWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCkpOwotICB9Ci19Ci0KLQotLy8gTk1BREQuZm10Ci0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMTAwMDE6Q09QMVg6MzI6Ok5NQURELkQKLSJubWFkZC5kIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKLSAgewotICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfZG91YmxlLE5lZ2F0ZShBZGQoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X2RvdWJsZSksVmFsdWVGUFIoZnQsZm10X2RvdWJsZSksZm10X2RvdWJsZSksVmFsdWVGUFIoZnIsZm10X2RvdWJsZSksZm10X2RvdWJsZSksZm10X2RvdWJsZSkpOwotICB9Ci19Ci0KLQotLy8gTk1BREQuZm10Ci0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMTAwMDA6Q09QMVg6MzI6Ok5NQURELlMKLSJubWFkZC5zIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKLSAgewotICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfc2luZ2xlLE5lZ2F0ZShBZGQoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X3NpbmdsZSksVmFsdWVGUFIoZnQsZm10X3NpbmdsZSksZm10X3NpbmdsZSksVmFsdWVGUFIoZnIsZm10X3NpbmdsZSksZm10X3NpbmdsZSksZm10X3NpbmdsZSkpOwotICB9Ci19Ci0KLQotLy8gTk1TVUIuZm10Ci0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMTEwMDE6Q09QMVg6MzI6Ok5NU1VCLkQKLSJubXN1Yi5kIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKLSAgewotICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfZG91YmxlLE5lZ2F0ZShTdWIoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X2RvdWJsZSksVmFsdWVGUFIoZnQsZm10X2RvdWJsZSksZm10X2RvdWJsZSksVmFsdWVGUFIoZnIsZm10X2RvdWJsZSksZm10X2RvdWJsZSksZm10X2RvdWJsZSkpOwotICB9Ci19Ci0KLQotLy8gTk1TVUIuZm10Ci0wMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMTEwMDA6Q09QMVg6MzI6Ok5NU1VCLlMKLSJubXN1Yi5zIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKLSAgewotICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3NpbmdsZSxOZWdhdGUoU3ViKE11bHRpcGx5KFZhbHVlRlBSKGZzLGZtdF9zaW5nbGUpLFZhbHVlRlBSKGZ0LGZtdF9zaW5nbGUpLGZtdF9zaW5nbGUpLFZhbHVlRlBSKGZyLGZtdF9zaW5nbGUpLGZtdF9zaW5nbGUpLGZtdF9zaW5nbGUpKTsKLSAgfQotfQotCi0KLTAxMDAxMSw1LkJBU0UsNS5JTkRFWCw1LkhJTlQsMDAwMDAwMDExMTE6Q09QMVg6MzI6OlBSRUZYCi0icHJlZnggPEhJTlQ+LCByPElOREVYPihyPEJBU0U+KSIKLSptaXBzSVY6Ci0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgc2lnbmVkX3dvcmQgb3AyID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRildOwotICBzaWduZWRfd29yZCBvcDEgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKV07Ci0gIHsKLSAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoKHVuc2lnbmVkNjQpb3AxICsgKHVuc2lnbmVkNjQpb3AyKTsKLSAgICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gICAgaW50IHVuY2FjaGVkOwotICAgIGlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzTE9BRCwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCi0gICAgICBQcmVmZXRjaCh1bmNhY2hlZCxwYWRkcix2YWRkcixpc0RBVEEsZnMpOwotICB9Ci19Ci0KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDEwMTAxOkNPUDE6MzI6OlJFQ0lQLmZtdAotInJlY2lwLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgZWxzZQotICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsUmVjaXAoVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQpKTsKLSAgfQotfQotCi0KLTAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAxMDAwOkNPUDE6NjQ6OlJPVU5ELkwuZm10Ci0icm91bmQubC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgICBlbHNlCi0gICAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9sb25nLENvbnZlcnQoRlBfUk1fTkVBUkVTVCxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfbG9uZykpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDExMDA6Q09QMTozMjo6Uk9VTkQuVy5mbXQKLSJyb3VuZC53LiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJSToKLSptaXBzSUlJOgotKm1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotKnIzOTAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gIGVsc2UKLSAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3dvcmQsQ29udmVydChGUF9STV9ORUFSRVNULFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF93b3JkKSk7Ci0gIH0KLX0KLQotCi0wMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAxMDExMDpDT1AxOjMyOjpSU1FSVC5mbXQKLSptaXBzSVY6Ci0icnNxcnQuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qdnI1MDAwOgotewotICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKLSAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOwotICB7Ci0gIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gIGVsc2UKLSAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LFJlY2lwKFNxdWFyZVJvb3QoVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQpLGZvcm1hdCkpOwotICB9Ci19Ci0KLQotMTExMTAxLDUuQkFTRSw1LkZULDE2Lk9GRlNFVDpDT1AxOjY0OjpTREMxCi0ic2RjMSBmPEZUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0k6Ci0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBDT1BfU0QgKDEsIEZUKSk7Ci19Ci0KLQotMDEwMDExLDUuQkFTRSw1LklOREVYLDUuRlMsMDAwMDAwMDEwMDE6Q09QMVg6NjQ6OlNEWEMxCi0ibGR4YzEgZjxGUz4sIHI8SU5ERVg+KHI8QkFTRT4pIgotKm1pcHNJVjoKLSp2cjUwMDA6Ci17Ci0gIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEdQUltJTkRFWF0sIENPUF9TRCAoMSwgRlMpKTsKLX0KLQotCi0wMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMDEwMDpDT1AxOjMyOjpTUVJULmZtdAotInNxcnQuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgIGVsc2UKLSAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LChTcXVhcmVSb290KFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0KSkpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDUuRlQsNS5GUyw1LkZELDAwMDAwMTpDT1AxOjMyOjpTVUIuZm10Ci0ic3ViLiVzPEZNVD4gZjxGRD4sIGY8RlM+LCBmPEZUPiIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOwotICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKLSAgewotICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCi0gICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gICAgZWxzZQotICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsU3ViKFZhbHVlRlBSKGZzLGZvcm1hdCksVmFsdWVGUFIoZnQsZm9ybWF0KSxmb3JtYXQpKTsKLSAgfQotfQotCi0KLQotMTExMDAxLDUuQkFTRSw1LkZULDE2Lk9GRlNFVDpDT1AxOjMyOjpTV0MxCi0ic3djMSBmPEZUPiwgPE9GRlNFVD4ocjxCQVNFPikiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBzaWduZWRfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKTsKLSAgaW50IGRlc3RyZWcgVU5VU0VEID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgc2lnbmVkX3dvcmQgb3AxIFVOVVNFRCA9IEdQUlsoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpXTsKLSAgewotICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodXdvcmQ2NClvcDEgKyBvZmZzZXQpOwotICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgICBpbnQgdW5jYWNoZWQ7Ci0gICAgaWYgKCh2YWRkciAmIDMpICE9IDApCi0gICAgICB7Ci0JU0lNX0NPUkVfU0lHTkFMIChTRCwgQ1BVLCBjaWEsIHJlYWRfbWFwLCBBY2Nlc3NMZW5ndGhfV09SRCsxLCB2YWRkciwgd3JpdGVfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpZiAoQWRkcmVzc1RyYW5zbGF0aW9uKHZhZGRyLGlzREFUQSxpc1NUT1JFLCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKLQkgIHsKLQkgICAgdXdvcmQ2NCBtZW12YWwgPSAwOwotCSAgICB1d29yZDY0IG1lbXZhbDEgPSAwOwotCSAgICB1d29yZDY0IG1hc2sgPSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0ID8gMHg3IDogMHgzKTsKLQkgICAgYWRkcmVzc193b3JkIHJldmVyc2VlbmRpYW4gPSAoUmV2ZXJzZUVuZGlhbiA/KG1hc2sgXiBBY2Nlc3NMZW5ndGhfV09SRCk6IDApOwotCSAgICBhZGRyZXNzX3dvcmQgYmlnZW5kaWFuY3B1ID0gKEJpZ0VuZGlhbkNQVSA/KG1hc2sgXiBBY2Nlc3NMZW5ndGhfV09SRCk6IDApOwotCSAgICB1bnNpZ25lZCBpbnQgYnl0ZTsKLQkgICAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gcmV2ZXJzZWVuZGlhbikpOwotCSAgICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gYmlnZW5kaWFuY3B1KTsKLQkgICAgbWVtdmFsID0gKCgodXdvcmQ2NClDT1BfU1coKChpbnN0cnVjdGlvbiA+PiAyNikgJiAweDMpLGRlc3RyZWcpKSA8PCAoOCAqIGJ5dGUpKTsKLQkgICAgU3RvcmVNZW1vcnkodW5jYWNoZWQsQWNjZXNzTGVuZ3RoX1dPUkQsbWVtdmFsLG1lbXZhbDEscGFkZHIsdmFkZHIsaXNSRUFMKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotfQotCi0KLTAxMDAxMSw1LkJBU0UsNS5JTkRFWCw1LkZTLDAwMDAwLDAwMTAwMDpDT1AxWDozMjo6U1dYQzEKLSJzd3hjMSBmPEZTPiwgcjxJTkRFWD4ocjxCQVNFPikiCi0qbWlwc0lWOgotKnZyNTAwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7Ci0gIHNpZ25lZF93b3JkIG9wMiA9IEdQUlsoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpXTsKLSAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOwotICB7Ci0gICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoKHVuc2lnbmVkNjQpb3AxICsgb3AyKTsKLSAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgIGludCB1bmNhY2hlZDsKLSAgIGlmICgodmFkZHIgJiAzKSAhPSAwKQotICAgICB7Ci0gICAgICAgU0lNX0NPUkVfU0lHTkFMIChTRCwgQ1BVLCBjaWEsIHJlYWRfbWFwLCA0LCB2YWRkciwgd3JpdGVfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOwotICAgICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNTVE9SRSwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCi0gICAgewotICAgICB1bnNpZ25lZDY0IG1lbXZhbCA9IDA7Ci0gICAgIHVuc2lnbmVkNjQgbWVtdmFsMSA9IDA7Ci0gICAgIHVuc2lnbmVkNjQgbWFzayA9IDB4NzsKLSAgICAgdW5zaWduZWQgaW50IGJ5dGU7Ci0gICAgIHBhZGRyID0gKChwYWRkciAmIH5tYXNrKSB8ICgocGFkZHIgJiBtYXNrKSBeIChSZXZlcnNlRW5kaWFuIDw8IDIpKSk7Ci0gICAgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiAoQmlnRW5kaWFuQ1BVIDw8IDIpKTsKLSAgICAgbWVtdmFsID0gKCgodW5zaWduZWQ2NClDT1BfU1coMSxmcykpIDw8ICg4ICogYnl0ZSkpOwotICAgICAgewotICAgICAgIFN0b3JlTWVtb3J5KHVuY2FjaGVkLEFjY2Vzc0xlbmd0aF9XT1JELG1lbXZhbCxtZW12YWwxLHBhZGRyLHZhZGRyLGlzUkVBTCk7Ci0gICAgICB9Ci0gICAgfQotICAgfQotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDEwMDE6Q09QMTo2NDo6VFJVTkMuTC5mbXQKLSJ0cnVuYy5sLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgZWxzZQotICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfbG9uZyxDb252ZXJ0KEZQX1JNX1RPWkVSTyxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfbG9uZykpOwotICB9Ci19Ci0KLQotMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDExMDE6Q09QMTozMjo6VFJVTkMuVwotInRydW5jLncuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCi0qbWlwc0lJOgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0qcjM5MDA6Ci17Ci0gIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOwotICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKLSAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7Ci0gIHsKLSAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKLSAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKLSAgZWxzZQotICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfd29yZCxDb252ZXJ0KEZQX1JNX1RPWkVSTyxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfd29yZCkpOwotICB9Ci19Ci0KLQwKLS8vCi0vLyBNSVBTIEFyY2hpdGVjdHVyZToKLS8vCi0vLyAgICAgICAgU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb24gU2V0IChDT1AwKQotLy8KLQotCi0wMTAwMDAsMDEwMDAsMDAwMDAsMTYuT0ZGU0VUOkNPUDA6MzI6OkJDMEYKLSJiYzBmIDxPRkZTRVQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotCi0wMTAwMDAsMDEwMDAsMDAwMDAsMTYuT0ZGU0VUOkNPUDA6MzI6OkJDMEYKLSJiYzBmIDxPRkZTRVQ+IgotLy8gc3R1YiBuZWVkZWQgZm9yIGVDb3MgYXMgdHgzOSBoYXJkd2FyZSBidWcgd29ya2Fyb3VuZAotKnIzOTAwOgotewotICAvKiBkbyBub3RoaW5nICovCi19Ci0KLQotMDEwMDAwLDAxMDAwLDAwMDEwLDE2Lk9GRlNFVDpDT1AwOjMyOjpCQzBGTAotImJjMGZsIDxPRkZTRVQ+IgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotCi0KLTAxMDAwMCwwMTAwMCwwMDAwMSwxNi5PRkZTRVQ6Q09QMDozMjo6QkMwVAotImJjMHQgPE9GRlNFVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLQotCi0wMTAwMDAsMDEwMDAsMDAwMTEsMTYuT0ZGU0VUOkNPUDA6MzI6OkJDMFRMCi0iYmMwdGwgPE9GRlNFVD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0KLQotMTAxMTExLDUuQkFTRSw1Lk9QLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkNBQ0hFCi0qbWlwc0lJSToKLSptaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLSpyMzkwMDoKLXsKLSAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7Ci0gIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7Ci0gIGludCBoaW50ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKLSAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOwotICB7Ci0gICAgYWRkcmVzc193b3JkIHZhZGRyID0gKG9wMSArIG9mZnNldCk7Ci0gICAgYWRkcmVzc193b3JkIHBhZGRyOwotICAgIGludCB1bmNhY2hlZDsKLSAgICBpZiAoQWRkcmVzc1RyYW5zbGF0aW9uKHZhZGRyLGlzREFUQSxpc0xPQUQsJnBhZGRyLCZ1bmNhY2hlZCxpc1RBUkdFVCxpc1JFQUwpKQotICAgICAgQ2FjaGVPcChoaW50LHZhZGRyLHBhZGRyLGluc3RydWN0aW9uKTsKLSAgfQotfQotCi0KLTAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMTExMDAxOkNPUDA6MzI6OkRJCi0iZGkiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0KLQotMDEwMDAwLDAwMDAxLDUuUlQsNS5SRCwwMDAsMDAwMCwwMDAwOkNPUDA6NjQ6OkRNRkMwCi0iZG1mYzAgcjxSVD4sIHI8UkQ+IgotKm1pcHNJSUksbWlwc0lWOgotewotICBEZWNvZGVDb3Byb2MgKGluc3RydWN0aW9uXzApOwotfQotCi0KLTAxMDAwMCwwMDEwMSw1LlJULDUuUkQsMDAwLDAwMDAsMDAwMDpDT1AwOjY0OjpETVRDMAotImRtdGMwIHI8UlQ+LCByPFJEPiIKLSptaXBzSUlJLG1pcHNJVjoKLXsKLSAgRGVjb2RlQ29wcm9jIChpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0wMTAwMDAsMTAwMDAsMDAwMDAwMDAwMDAwMDAwLDExMTAwMDpDT1AwOjMyOjpFSQotImVpIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotCi0KLTAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDExMDAwOkNPUDA6MzI6OkVSRVQKLSJlcmV0IgotKm1pcHNJSUk6Ci0qbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIGlmIChTUiAmIHN0YXR1c19FUkwpCi0gICAgewotICAgICAgLyogT29wcywgbm90IHlldCBhdmFpbGFibGUgKi8KLSAgICAgIHNpbV9pb19wcmludGYgKFNELCAiV2FybmluZzogRVJFVCB3aGVuIFNSW0VSTF0gc2V0IG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIE5JQSA9IEVQQzsKLSAgICAgIFNSICY9IH5zdGF0dXNfRVJMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIE5JQSA9IEVQQzsKLSAgICAgIFNSICY9IH5zdGF0dXNfRVhMOwotICAgIH0KLX0KLQotCi0wMTAwMDAsMDAwMDAsNS5SVCw1LlJELDAwMDAwLDYuUkVHWDpDT1AwOjMyOjpNRkMwCi0ibWZjMCByPFJUPiwgcjxSRD4gIyA8UkVHWD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnIzOTAwOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIFRSQUNFX0FMVV9JTlBVVDAgKCk7Ci0gIERlY29kZUNvcHJvYyAoaW5zdHJ1Y3Rpb25fMCk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSVF0pOwotfQotCi0wMTAwMDAsMDAxMDAsNS5SVCw1LlJELDAwMDAwLDYuUkVHWDpDT1AwOjMyOjpNVEMwCi0ibXRjMCByPFJUPiwgcjxSRD4gIyA8UkVHWD4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnIzOTAwOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci17Ci0gIERlY29kZUNvcHJvYyAoaW5zdHJ1Y3Rpb25fMCk7Ci19Ci0KLQotMDEwMDAwLDEwMDAwLDAwMDAwMDAwMDAwMDAwMCwwMTAwMDA6Q09QMDozMjo6UkZFCi0icmZlIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSpyMzkwMDoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotewotICBEZWNvZGVDb3Byb2MgKGluc3RydWN0aW9uXzApOwotfQotCi0KLTAxMDAsWlohMCExITMsNS5DT1BfRlVOMCE4LDUuQ09QX0ZVTjEsMTYuQ09QX0ZVTjI6Tk9STUFMOjMyOjpDT1B6Ci0iY29wPFpaPiA8Q09QX0ZVTjA+PENPUF9GVU4xPjxDT1BfRlVOMj4iCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSpyMzkwMDoKLXsKLSAgRGVjb2RlQ29wcm9jIChpbnN0cnVjdGlvbl8wKTsKLX0KLQotCi0KLTAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDAxMDAwOkNPUDA6MzI6OlRMQlAKLSJ0bGJwIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotCi0KLTAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDAwMDAxOkNPUDA6MzI6OlRMQlIKLSJ0bGJyIgotKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKLSp2cjQxMDA6Ci0qdnI1MDAwOgotCi0KLTAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDAwMDEwOkNPUDA6MzI6OlRMQldJCi0idGxid2kiCi0qbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgotKnZyNDEwMDoKLSp2cjUwMDA6Ci0KLQotMDEwMDAwLDEwMDAwLDAwMDAwMDAwMDAwMDAwMCwwMDAxMTA6Q09QMDozMjo6VExCV1IKLSJ0bGJ3ciIKLSptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6Ci0qdnI0MTAwOgotKnZyNTAwMDoKLQotDAotOmluY2x1ZGU6OjptMTYuaWdlbgotOmluY2x1ZGU6Ojp0eC5pZ2VuCi06aW5jbHVkZTo6OnZyLmlnZW4KLQwKZGlmZiAtLWdpdCBhL3NpbS9taXBzL3NpbS1tYWluLmMgYi9zaW0vbWlwcy9zaW0tbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEzN2FlLi4wMDAwMDAwCi0tLSBhL3NpbS9taXBzL3NpbS1tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyogIENvcHlyaWdodCAoQykgMTk5OCwgQ3lnbnVzIFNvbHV0aW9ucwotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgICovCi0KLQotI2lmbmRlZiBTSU1fTUFJTl9DCi0jZGVmaW5lIFNJTV9NQUlOX0MKLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAic2ltLWFzc2VydC5oIgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0gc2ltdWxhdG9yIGVuZ2luZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKiBEZXNjcmlwdGlvbiBmcm9tIHBhZ2UgQS0yMiBvZiB0aGUgIk1JUFMgSVYgSW5zdHJ1Y3Rpb24gU2V0IiBtYW51YWwKLSAgIChyZXZpc2lvbiAzLjEpICovCi0vKiBUcmFuc2xhdGUgYSB2aXJ0dWFsIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBjYWNoZQotICAgY29oZXJlbmNlIGFsZ29yaXRobSBkZXNjcmliaW5nIHRoZSBtZWNoYW5pc20gdXNlZCB0byByZXNvbHZlIHRoZQotICAgbWVtb3J5IHJlZmVyZW5jZS4gR2l2ZW4gdGhlIHZpcnR1YWwgYWRkcmVzcyB2QWRkciwgYW5kIHdoZXRoZXIgdGhlCi0gICByZWZlcmVuY2UgaXMgdG8gSW5zdHJ1Y3Rpb25zIG90IERhdGEgKElvckQpLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCi0gICBwaHlzaWNhbCBhZGRyZXNzIChwQWRkcikgYW5kIHRoZSBjYWNoZSBjb2hlcmVuY2UgYWxnb3JpdGhtIChDQ0EpCi0gICB1c2VkIHRvIHJlc29sdmUgdGhlIHJlZmVyZW5jZS4gSWYgdGhlIHZpcnR1YWwgYWRkcmVzcyBpcyBpbiBvbmUgb2YKLSAgIHRoZSB1bm1hcHBlZCBhZGRyZXNzIHNwYWNlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIENDQSBhcmUKLSAgIGRldGVybWluZWQgZGlyZWN0bHkgYnkgdGhlIHZpcnR1YWwgYWRkcmVzcy4gSWYgdGhlIHZpcnR1YWwgYWRkcmVzcwotICAgaXMgaW4gb25lIG9mIHRoZSBtYXBwZWQgYWRkcmVzcyBzcGFjZXMgdGhlbiB0aGUgVExCIGlzIHVzZWQgdG8KLSAgIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgYWNjZXNzIHR5cGU7IGlmIHRoZSByZXF1aXJlZAotICAgdHJhbnNsYXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIFRMQiBvciB0aGUgZGVzaXJlZCBhY2Nlc3MgaXMgbm90Ci0gICBwZXJtaXR0ZWQgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGFrZW4uCi0KLSAgIE5PVEU6IE5vcm1hbGx5IChSQVcgPT0gMCksIHdoZW4gYWRkcmVzcyB0cmFuc2xhdGlvbiBmYWlscywgdGhpcwotICAgZnVuY3Rpb24gcmFpc2VzIGFuIGV4Y2VwdGlvbiBhbmQgZG9lcyBub3QgcmV0dXJuLiAqLwotCi1JTkxJTkVfU0lNX01BSU4KLShpbnQpCi1hZGRyZXNzX3RyYW5zbGF0aW9uIChTSU1fREVTQyBzZCwKLQkJICAgICBzaW1fY3B1ICogY3B1LAotCQkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCi0JCSAgICAgYWRkcmVzc193b3JkIHZBZGRyLAotCQkgICAgIGludCBJb3JELAotCQkgICAgIGludCBMb3JTLAotCQkgICAgIGFkZHJlc3Nfd29yZCAqIHBBZGRyLAotCQkgICAgIGludCAqQ0NBLAotCQkgICAgIGludCByYXcpCi17Ci0gIGludCByZXMgPSAtMTsJCQkvKiBUUlVFIDogQXNzdW1lIGdvb2QgcmV0dXJuICovCi0KLSNpZmRlZiBERUJVRwotICBzaW1faW9fcHJpbnRmIChzZCwgIkFkZHJlc3NUcmFuc2xhdGlvbigweCVzLCVzLCVzLC4uLik7XG4iLCBwcl9hZGRyICh2QWRkciksIChJb3JEID8gImlzREFUQSIgOiAiaXNJTlNUUlVDVElPTiIpLCAoTG9yUyA/ICJpU1RPUkUiIDogImlzTE9BRCIpKTsKLSNlbmRpZgotCi0gIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3MgaXMgdmFsaWQgZm9yIHRoaXMgbWVtb3J5IG1vZGVsICovCi0KLSAgLyogRm9yIGEgc2ltcGxlIChmbGF0KSBtZW1vcnkgbW9kZWwsIHdlIHNpbXBseSBwYXNzIHZpcnR1YWwKLSAgICAgYWRkcmVzc2VzcyB0aHJvdWdoIChtb3N0bHkpIHVuY2hhbmdlZC4gKi8KLSAgdkFkZHIgJj0gMHhGRkZGRkZGRjsKLQotICAqcEFkZHIgPSB2QWRkcjsJCS8qIGRlZmF1bHQgZm9yIGlzVEFSR0VUICovCi0gICpDQ0EgPSBVbmNhY2hlZDsJCS8qIG5vdCB1c2VkIGZvciBpc0hPU1QgKi8KLQotICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotCi0vKiBEZXNjcmlwdGlvbiBmcm9tIHBhZ2UgQS0yMyBvZiB0aGUgIk1JUFMgSVYgSW5zdHJ1Y3Rpb24gU2V0IiBtYW51YWwKLSAgIChyZXZpc2lvbiAzLjEpICovCi0vKiBQcmVmZXRjaCBkYXRhIGZyb20gbWVtb3J5LiBQcmVmZXRjaCBpcyBhbiBhZHZpc29yeSBpbnN0cnVjdGlvbiBmb3IKLSAgIHdoaWNoIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFjdGlvbiBpcyB0YWtlbi4gVGhlIGFjdGlvbiB0YWtlbgotICAgbWF5IGluY3JlYXNlIHBlcmZvcm1hbmNlLCBidXQgbXVzdCBub3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZQotICAgcHJvZ3JhbSwgb3IgYWx0ZXIgYXJjaGl0ZWN0dXJhbGx5LXZpc2libGUgc3RhdGUuICovCi0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLXByZWZldGNoIChTSU1fREVTQyBzZCwKLQkgIHNpbV9jcHUgKmNwdSwKLQkgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICBpbnQgQ0NBLAotCSAgYWRkcmVzc193b3JkIHBBZGRyLAotCSAgYWRkcmVzc193b3JkIHZBZGRyLAotCSAgaW50IERBVEEsCi0JICBpbnQgaGludCkKLXsKLSNpZmRlZiBERUJVRwotICBzaW1faW9fcHJpbnRmKHNkLCJQcmVmZXRjaCglZCwweCVzLDB4JXMsJWQsJWQpO1xuIixDQ0EscHJfYWRkcihwQWRkcikscHJfYWRkcih2QWRkciksREFUQSxoaW50KTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0gIC8qIEZvciBvdXIgc2ltcGxlIG1lbW9yeSBtb2RlbCB3ZSBkbyBub3RoaW5nICovCi0gIHJldHVybjsKLX0KLQotLyogRGVzY3JpcHRpb24gZnJvbSBwYWdlIEEtMjIgb2YgdGhlICJNSVBTIElWIEluc3RydWN0aW9uIFNldCIgbWFudWFsCi0gICAocmV2aXNpb24gMy4xKSAqLwotLyogTG9hZCBhIHZhbHVlIGZyb20gbWVtb3J5LiBVc2UgdGhlIGNhY2hlIGFuZCBtYWluIG1lbW9yeSBhcwotICAgc3BlY2lmaWVkIGluIHRoZSBDYWNoZSBDb2hlcmVuY2UgQWxnb3JpdGhtIChDQ0EpIGFuZCB0aGUgc29ydCBvZgotICAgYWNjZXNzIChJb3JEKSB0byBmaW5kIHRoZSBjb250ZW50cyBvZiBBY2Nlc3NMZW5ndGggbWVtb3J5IGJ5dGVzCi0gICBzdGFydGluZyBhdCBwaHlzaWNhbCBsb2NhdGlvbiBwQWRkci4gVGhlIGRhdGEgaXMgcmV0dXJuZWQgaW4gdGhlCi0gICBmaXhlZCB3aWR0aCBuYXR1cmFsbHktYWxpZ25lZCBtZW1vcnkgZWxlbWVudCAoTWVtRWxlbSkuIFRoZQotICAgbG93LW9yZGVyIHR3byAob3IgdGhyZWUpIGJpdHMgb2YgdGhlIGFkZHJlc3MgYW5kIHRoZSBBY2Nlc3NMZW5ndGgKLSAgIGluZGljYXRlIHdoaWNoIG9mIHRoZSBieXRlcyB3aXRoaW4gTWVtRWxlbSBuZWVkcyB0byBiZSBnaXZlbiB0byB0aGUKLSAgIHByb2Nlc3Nvci4gSWYgdGhlIG1lbW9yeSBhY2Nlc3MgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIGlzIHVuY2FjaGVkCi0gICB0aGVuIG9ubHkgdGhlIHJlZmVyZW5jZWQgYnl0ZXMgYXJlIHJlYWQgZnJvbSBtZW1vcnkgYW5kIHZhbGlkCi0gICB3aXRoaW4gdGhlIG1lbW9yeSBlbGVtZW50LiBJZiB0aGUgYWNjZXNzIHR5cGUgaXMgY2FjaGVkLCBhbmQgdGhlCi0gICBkYXRhIGlzIG5vdCBwcmVzZW50IGluIGNhY2hlLCBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBzaXplIGFuZAotICAgYWxpZ25tZW50IGJsb2NrIG9mIG1lbW9yeSBpcyByZWFkIGFuZCBsb2FkZWQgaW50byB0aGUgY2FjaGUgdG8KLSAgIHNhdGlzZnkgYSBsb2FkIHJlZmVyZW5jZS4gQXQgYSBtaW5pbXVtLCB0aGUgYmxvY2sgaXMgdGhlIGVudGlyZQotICAgbWVtb3J5IGVsZW1lbnQuICovCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1sb2FkX21lbW9yeSAoU0lNX0RFU0MgU0QsCi0JICAgICBzaW1fY3B1ICpDUFUsCi0JICAgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgICAgdXdvcmQ2NCogbWVtdmFscCwKLQkgICAgIHV3b3JkNjQqIG1lbXZhbDFwLAotCSAgICAgaW50IENDQSwKLQkgICAgIHVuc2lnbmVkIGludCBBY2Nlc3NMZW5ndGgsCi0JICAgICBhZGRyZXNzX3dvcmQgcEFkZHIsCi0JICAgICBhZGRyZXNzX3dvcmQgdkFkZHIsCi0JICAgICBpbnQgSW9yRCkKLXsKLSAgdXdvcmQ2NCB2YWx1ZSA9IDA7Ci0gIHV3b3JkNjQgdmFsdWUxID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIHNpbV9pb19wcmludGYoc2QsIkRCRzogTG9hZE1lbW9yeSglcCwlcCwlZCwlZCwweCVzLDB4JXMsJXMpXG4iLG1lbXZhbHAsbWVtdmFsMXAsQ0NBLEFjY2Vzc0xlbmd0aCxwcl9hZGRyKHBBZGRyKSxwcl9hZGRyKHZBZGRyKSwoSW9yRCA/ICJpc0RBVEEiIDogImlzSU5TVFJVQ1RJT04iKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotI2lmIGRlZmluZWQoV0FSTl9NRU0pCi0gIGlmIChDQ0EgIT0gdW5jYWNoZWQpCi0gICAgc2ltX2lvX2VwcmludGYoc2QsIkxvYWRNZW1vcnkgQ0NBICglZCkgaXMgbm90IHVuY2FjaGVkIChjdXJyZW50bHkgYWxsIGFjY2Vzc2VzIHRyZWF0ZWQgYXMgY2FjaGVkKVxuIixDQ0EpOwotI2VuZGlmIC8qIFdBUk5fTUVNICovCi0KLSAgaWYgKCgocEFkZHIgJiBMT0FERFJNQVNLKSArIEFjY2Vzc0xlbmd0aCkgPiBMT0FERFJNQVNLKQotICAgIHsKLSAgICAgIC8qIEluIHJlYWxpdHkgdGhpcyBzaG91bGQgYmUgYSBCdXMgRXJyb3IgKi8KLSAgICAgIHNpbV9pb19lcnJvciAoU0QsICJMT0FEIEFjY2Vzc0xlbmd0aCBvZiAlZCB3b3VsZCBleHRlbmQgb3ZlciAlZCBiaXQgYWxpZ25lZCBib3VuZGFyeSBmb3IgcGh5c2ljYWwgYWRkcmVzcyAweCVzXG4iLAotCQkgICAgQWNjZXNzTGVuZ3RoLAotCQkgICAgKExPQUREUk1BU0sgKyAxKSA8PCAzLAotCQkgICAgcHJfYWRkciAocEFkZHIpKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKFRSQUNFKQotICBkb3RyYWNlIChTRCwgQ1BVLCB0cmFjZWZoLCgoSW9yRCA9PSBpc0RBVEEpID8gMCA6IDIpLCh1bnNpZ25lZCBpbnQpKHBBZGRyJjB4RkZGRkZGRkYpLChBY2Nlc3NMZW5ndGggKyAxKSwibG9hZCVzIiwoKElvckQgPT0gaXNEQVRBKSA/ICIiIDogIiBpbnN0cnVjdGlvbiIpKTsKLSNlbmRpZiAvKiBUUkFDRSAqLwotICAKLSAgLyogUmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIG1lbW9yeS4gIEFkanVzdCBmb3IKLSAgICAgaG9zdC90YXJnZXQgYnl0ZSBvcmRlcmluZy8gQWxpZ24gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgcmVhZC4gKi8KLQotICBzd2l0Y2ggKEFjY2Vzc0xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfUVVBRFdPUkQgOgotICAgICAgewotCXVuc2lnbmVkXzE2IHZhbCA9IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8xNiAoQ1BVLCBOVUxMX0NJQSwgcmVhZF9tYXAsIHBBZGRyKTsKLQl2YWx1ZTEgPSBWSDhfMTYgKHZhbCk7Ci0JdmFsdWUgPSBWTDhfMTYgKHZhbCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCA6Ci0gICAgICB2YWx1ZSA9IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF84IChDUFUsIE5VTExfQ0lBLAotCQkJCSAgICAgICByZWFkX21hcCwgcEFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfU0VQVElCWVRFIDoKLSAgICAgIHZhbHVlID0gc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzcgKENQVSwgTlVMTF9DSUEsCi0JCQkJCSAgcmVhZF9tYXAsIHBBZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1NFWFRJQllURSA6Ci0gICAgICB2YWx1ZSA9IHNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF82IChDUFUsIE5VTExfQ0lBLAotCQkJCQkgIHJlYWRfbWFwLCBwQWRkcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUlOVElCWVRFIDoKLSAgICAgIHZhbHVlID0gc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzUgKENQVSwgTlVMTF9DSUEsCi0JCQkJCSAgcmVhZF9tYXAsIHBBZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1dPUkQgOgotICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfNCAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1RSSVBMRUJZVEUgOgotICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMyAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkJICByZWFkX21hcCwgcEFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfSEFMRldPUkQgOgotICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMiAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX0JZVEUgOgotICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMSAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIAotI2lmZGVmIERFQlVHCi0gIHByaW50ZigiREJHOiBMb2FkTWVtb3J5KCkgOiAob2Zmc2V0ICVkKSA6IHZhbHVlID0gMHglcyVzXG4iLAotCSAoaW50KShwQWRkciAmIExPQUREUk1BU0spLHByX3V3b3JkNjQodmFsdWUxKSxwcl91d29yZDY0KHZhbHVlKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgCi0gIC8qIFNlZSBhbHNvIHN0b3JlX21lbW9yeS4gUG9zaXRpb24gZGF0YSBpbiBjb3JyZWN0IGJ5dGUgbGFuZXMuICovCi0gIGlmIChBY2Nlc3NMZW5ndGggPD0gTE9BRERSTUFTSykKLSAgICB7Ci0gICAgICBpZiAoQmlnRW5kaWFuTWVtKQotCS8qIGZvciBiaWcgZW5kaWFuIHRhcmdldCwgYnl0ZSAocEFkZHImTE9BRERSTUFTSyA9PSAwKSBpcwotCSAgIHNoaWZ0ZWQgdG8gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBwb3NpdGlvbi4gICovCi0JdmFsdWUgPDw9ICgoKExPQUREUk1BU0sgLSAocEFkZHIgJiBMT0FERFJNQVNLKSkgLSBBY2Nlc3NMZW5ndGgpICogOCk7Ci0gICAgICBlbHNlCi0JLyogRm9yIGxpdHRsZSBlbmRpYW4gdGFyZ2V0LCBieXRlIChwQWRkciZMT0FERFJNQVNLID09IDApCi0JICAgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBwb3N0aXRpb24uICovCi0JdmFsdWUgPDw9ICgocEFkZHIgJiBMT0FERFJNQVNLKSAqIDgpOwotICAgIH0KLSAgCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IExvYWRNZW1vcnkoKSA6IHNoaWZ0ZWQgdmFsdWUgPSAweCVzJXNcbiIsCi0JIHByX3V3b3JkNjQodmFsdWUxKSxwcl91d29yZDY0KHZhbHVlKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgCi0gICptZW12YWxwID0gdmFsdWU7Ci0gIGlmIChtZW12YWwxcCkgKm1lbXZhbDFwID0gdmFsdWUxOwotfQotCi0KLS8qIERlc2NyaXB0aW9uIGZyb20gcGFnZSBBLTIzIG9mIHRoZSAiTUlQUyBJViBJbnN0cnVjdGlvbiBTZXQiIG1hbnVhbAotICAgKHJldmlzaW9uIDMuMSkgKi8KLS8qIFN0b3JlIGEgdmFsdWUgdG8gbWVtb3J5LiBUaGUgc3BlY2lmaWVkIGRhdGEgaXMgc3RvcmVkIGludG8gdGhlCi0gICBwaHlzaWNhbCBsb2NhdGlvbiBwQWRkciB1c2luZyB0aGUgbWVtb3J5IGhpZXJhcmNoeSAoZGF0YSBjYWNoZXMgYW5kCi0gICBtYWluIG1lbW9yeSkgYXMgc3BlY2lmaWVkIGJ5IHRoZSBDYWNoZSBDb2hlcmVuY2UgQWxnb3JpdGhtCi0gICAoQ0NBKS4gVGhlIE1lbUVsZW0gY29udGFpbnMgdGhlIGRhdGEgZm9yIGFuIGFsaWduZWQsIGZpeGVkLXdpZHRoCi0gICBtZW1vcnkgZWxlbWVudCAod29yZCBmb3IgMzItYml0IHByb2Nlc3NvcnMsIGRvdWJsZXdvcmQgZm9yIDY0LWJpdAotICAgcHJvY2Vzc29ycyksIHRob3VnaCBvbmx5IHRoZSBieXRlcyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgc3RvcmVkIHRvCi0gICBtZW1vcnkgbmVlZCB0byBiZSB2YWxpZC4gVGhlIGxvdy1vcmRlciB0d28gKG9yIHRocmVlKSBiaXRzIG9mIHBBZGRyCi0gICBhbmQgdGhlIEFjY2Vzc0xlbmd0aCBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGJ5dGVzIHdpdGhpbiB0aGUKLSAgIE1lbUVsZW0gZGF0YSBzaG91bGQgYWN0dWFsbHkgYmUgc3RvcmVkOyBvbmx5IHRoZXNlIGJ5dGVzIGluIG1lbW9yeQotICAgd2lsbCBiZSBjaGFuZ2VkLiAqLwotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1zdG9yZV9tZW1vcnkgKFNJTV9ERVNDIFNELAotCSAgICAgIHNpbV9jcHUgKkNQVSwKLQkgICAgICBhZGRyZXNzX3dvcmQgY2lhLAotCSAgICAgIGludCBDQ0EsCi0JICAgICAgdW5zaWduZWQgaW50IEFjY2Vzc0xlbmd0aCwKLQkgICAgICB1d29yZDY0IE1lbUVsZW0sCi0JICAgICAgdXdvcmQ2NCBNZW1FbGVtMSwgICAvKiBIaWdoIG9yZGVyIDY0IGJpdHMgKi8KLQkgICAgICBhZGRyZXNzX3dvcmQgcEFkZHIsCi0JICAgICAgYWRkcmVzc193b3JkIHZBZGRyKQotewotI2lmZGVmIERFQlVHCi0gIHNpbV9pb19wcmludGYoc2QsIkRCRzogU3RvcmVNZW1vcnkoJWQsJWQsMHglcywweCVzLDB4JXMsMHglcylcbiIsQ0NBLEFjY2Vzc0xlbmd0aCxwcl91d29yZDY0KE1lbUVsZW0pLHByX3V3b3JkNjQoTWVtRWxlbTEpLHByX2FkZHIocEFkZHIpLHByX2FkZHIodkFkZHIpKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotICAKLSNpZiBkZWZpbmVkKFdBUk5fTUVNKQotICBpZiAoQ0NBICE9IHVuY2FjaGVkKQotICAgIHNpbV9pb19lcHJpbnRmKHNkLCJTdG9yZU1lbW9yeSBDQ0EgKCVkKSBpcyBub3QgdW5jYWNoZWQgKGN1cnJlbnRseSBhbGwgYWNjZXNzZXMgdHJlYXRlZCBhcyBjYWNoZWQpXG4iLENDQSk7Ci0jZW5kaWYgLyogV0FSTl9NRU0gKi8KLSAgCi0gIGlmICgoKHBBZGRyICYgTE9BRERSTUFTSykgKyBBY2Nlc3NMZW5ndGgpID4gTE9BRERSTUFTSykKLSAgICBzaW1faW9fZXJyb3IgKFNELCAiU1RPUkUgQWNjZXNzTGVuZ3RoIG9mICVkIHdvdWxkIGV4dGVuZCBvdmVyICVkIGJpdCBhbGlnbmVkIGJvdW5kYXJ5IGZvciBwaHlzaWNhbCBhZGRyZXNzIDB4JXNcbiIsCi0JCSAgQWNjZXNzTGVuZ3RoLAotCQkgIChMT0FERFJNQVNLICsgMSkgPDwgMywKLQkJICBwcl9hZGRyKHBBZGRyKSk7Ci0gIAotI2lmIGRlZmluZWQoVFJBQ0UpCi0gIGRvdHJhY2UgKFNELCBDUFUsIHRyYWNlZmgsMSwodW5zaWduZWQgaW50KShwQWRkciYweEZGRkZGRkZGKSwoQWNjZXNzTGVuZ3RoICsgMSksInN0b3JlIik7Ci0jZW5kaWYgLyogVFJBQ0UgKi8KLSAgCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFN0b3JlTWVtb3J5OiBvZmZzZXQgPSAlZCBNZW1FbGVtID0gMHglcyVzXG4iLCh1bnNpZ25lZCBpbnQpKHBBZGRyICYgTE9BRERSTUFTSykscHJfdXdvcmQ2NChNZW1FbGVtMSkscHJfdXdvcmQ2NChNZW1FbGVtKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgCi0gIC8qIFNlZSBhbHNvIGxvYWRfbWVtb3J5LiBQb3NpdGlvbiBkYXRhIGluIGNvcnJlY3QgYnl0ZSBsYW5lcy4gKi8KLSAgaWYgKEFjY2Vzc0xlbmd0aCA8PSBMT0FERFJNQVNLKQotICAgIHsKLSAgICAgIGlmIChCaWdFbmRpYW5NZW0pCi0JLyogZm9yIGJpZyBlbmRpYW4gdGFyZ2V0LCBieXRlIChwQWRkciZMT0FERFJNQVNLID09IDApIGlzCi0JICAgc2hpZnRlZCB0byB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIHBvc2l0aW9uLiAgKi8KLQlNZW1FbGVtID4+PSAoKChMT0FERFJNQVNLIC0gKHBBZGRyICYgTE9BRERSTUFTSykpIC0gQWNjZXNzTGVuZ3RoKSAqIDgpOwotICAgICAgZWxzZQotCS8qIEZvciBsaXR0bGUgZW5kaWFuIHRhcmdldCwgYnl0ZSAocEFkZHImTE9BRERSTUFTSyA9PSAwKQotCSAgIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgcG9zdGl0aW9uLiAqLwotCU1lbUVsZW0gPj49ICgocEFkZHIgJiBMT0FERFJNQVNLKSAqIDgpOwotICAgIH0KLSAgCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmKCJEQkc6IFN0b3JlTWVtb3J5OiBzaGlmdCA9ICVkIE1lbUVsZW0gPSAweCVzJXNcbiIsc2hpZnQscHJfdXdvcmQ2NChNZW1FbGVtMSkscHJfdXdvcmQ2NChNZW1FbGVtKSk7Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgCi0gIHN3aXRjaCAoQWNjZXNzTGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUFEV09SRCA6Ci0gICAgICB7Ci0JdW5zaWduZWRfMTYgdmFsID0gVTE2XzggKE1lbUVsZW0xLCBNZW1FbGVtKTsKLQlzaW1fY29yZV93cml0ZV9hbGlnbmVkXzE2IChDUFUsIE5VTExfQ0lBLCB3cml0ZV9tYXAsIHBBZGRyLCB2YWwpOwotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQgOgotICAgICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF84IChDUFUsIE5VTExfQ0lBLAotCQkJCXdyaXRlX21hcCwgcEFkZHIsIE1lbUVsZW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfU0VQVElCWVRFIDoKLSAgICAgIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNyAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkgICB3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1NFWFRJQllURSA6Ci0gICAgICBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzYgKENQVSwgTlVMTF9DSUEsCi0JCQkJICAgd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUlOVElCWVRFIDoKLSAgICAgIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNSAoQ1BVLCBOVUxMX0NJQSwKLQkJCQkgICB3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1dPUkQgOgotICAgICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF80IChDUFUsIE5VTExfQ0lBLAotCQkJCXdyaXRlX21hcCwgcEFkZHIsIE1lbUVsZW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBY2Nlc3NMZW5ndGhfVFJJUExFQllURSA6Ci0gICAgICBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzMgKENQVSwgTlVMTF9DSUEsCi0JCQkJICAgd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCA6Ci0gICAgICBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzIgKENQVSwgTlVMTF9DSUEsCi0JCQkJd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFjY2Vzc0xlbmd0aF9CWVRFIDoKLSAgICAgIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfMSAoQ1BVLCBOVUxMX0NJQSwKLQkJCQl3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9CQotICAKLSAgcmV0dXJuOwotfQotCi0KLUlOTElORV9TSU1fTUFJTiAodW5zaWduZWQzMikKLWlmZXRjaDMyIChTSU1fREVTQyBTRCwKLQkgIHNpbV9jcHUgKkNQVSwKLQkgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICBhZGRyZXNzX3dvcmQgdmFkZHIpCi17Ci0gIC8qIENvcHkgdGhlIGFjdGlvbiBvZiB0aGUgTFcgaW5zdHJ1Y3Rpb24gKi8KLSAgYWRkcmVzc193b3JkIG1hc2sgPSBMT0FERFJNQVNLOwotICBhZGRyZXNzX3dvcmQgYWNjZXNzID0gQWNjZXNzTGVuZ3RoX1dPUkQ7Ci0gIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAobWFzayBeIGFjY2VzcykgOiAwKTsKLSAgYWRkcmVzc193b3JkIGJpZ2VuZGlhbmNwdSA9IChCaWdFbmRpYW5DUFUgPyAobWFzayBeIGFjY2VzcykgOiAwKTsKLSAgdW5zaWduZWQgaW50IGJ5dGU7Ci0gIGFkZHJlc3Nfd29yZCBwYWRkcjsKLSAgaW50IHVuY2FjaGVkOwotICB1bnNpZ25lZDY0IG1lbXZhbDsKLQotICBpZiAoKHZhZGRyICYgYWNjZXNzKSAhPSAwKQotICAgIFNpZ25hbEV4Y2VwdGlvbkluc3RydWN0aW9uRmV0Y2ggKCk7Ci0gIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzSU5TVFJVQ1RJT04sIGlzTE9BRCwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOwotICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiByZXZlcnNlZW5kaWFuKSk7Ci0gIExvYWRNZW1vcnkgKCZtZW12YWwsIE5VTEwsIHVuY2FjaGVkLCBhY2Nlc3MsIHBhZGRyLCB2YWRkciwgaXNJTlNUUlVDVElPTiwgaXNSRUFMKTsKLSAgYnl0ZSA9ICgodmFkZHIgJiBtYXNrKSBeIGJpZ2VuZGlhbmNwdSk7Ci0gIHJldHVybiAobWVtdmFsID4+ICg4ICogYnl0ZSkpOwotfQotCi0KLUlOTElORV9TSU1fTUFJTiAodW5zaWduZWQxNikKLWlmZXRjaDE2IChTSU1fREVTQyBTRCwKLQkgIHNpbV9jcHUgKkNQVSwKLQkgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICBhZGRyZXNzX3dvcmQgdmFkZHIpCi17Ci0gIC8qIENvcHkgdGhlIGFjdGlvbiBvZiB0aGUgTEggaW5zdHJ1Y3Rpb24gKi8KLSAgYWRkcmVzc193b3JkIG1hc2sgPSBMT0FERFJNQVNLOwotICBhZGRyZXNzX3dvcmQgYWNjZXNzID0gQWNjZXNzTGVuZ3RoX0hBTEZXT1JEOwotICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7Ci0gIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7Ci0gIHVuc2lnbmVkIGludCBieXRlOwotICBhZGRyZXNzX3dvcmQgcGFkZHI7Ci0gIGludCB1bmNhY2hlZDsKLSAgdW5zaWduZWQ2NCBtZW12YWw7Ci0KLSAgaWYgKCh2YWRkciAmIGFjY2VzcykgIT0gMCkKLSAgICBTaWduYWxFeGNlcHRpb25JbnN0cnVjdGlvbkZldGNoICgpOwotICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0lOU1RSVUNUSU9OLCBpc0xPQUQsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKLSAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gcmV2ZXJzZWVuZGlhbikpOwotICBMb2FkTWVtb3J5ICgmbWVtdmFsLCBOVUxMLCB1bmNhY2hlZCwgYWNjZXNzLCBwYWRkciwgdmFkZHIsIGlzSU5TVFJVQ1RJT04sIGlzUkVBTCk7Ci0gIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiBiaWdlbmRpYW5jcHUpOwotICByZXR1cm4gKG1lbXZhbCA+PiAoOCAqIGJ5dGUpKTsKLX0KLQotCi0KLS8qIERlc2NyaXB0aW9uIGZyb20gcGFnZSBBLTI2IG9mIHRoZSAiTUlQUyBJViBJbnN0cnVjdGlvbiBTZXQiIG1hbnVhbCAocmV2aXNpb24gMy4xKSAqLwotLyogT3JkZXIgbG9hZHMgYW5kIHN0b3JlcyB0byBzeW5jaHJvbmlzZSBzaGFyZWQgbWVtb3J5LiBQZXJmb3JtIHRoZQotICAgYWN0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlZmZlY3RzIG9mIGdyb3VwcyBvZiBzeW5jaHJvbml6YWJsZQotICAgbG9hZHMgYW5kIHN0b3JlcyBpbmRpY2F0ZWQgYnkgc3R5cGUgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgZm9yIGFsbAotICAgcHJvY2Vzc29ycy4gKi8KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLXN5bmNfb3BlcmF0aW9uIChTSU1fREVTQyBzZCwKLQkJc2ltX2NwdSAqY3B1LAotCQlhZGRyZXNzX3dvcmQgY2lhLAotCQlpbnQgc3R5cGUpCi17Ci0jaWZkZWYgREVCVUcKLSAgc2ltX2lvX3ByaW50ZihzZCwiU3luY09wZXJhdGlvbiglZCkgOiBUT0RPXG4iLHN0eXBlKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotICByZXR1cm47Ci19Ci0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLWNhY2hlX29wIChTSU1fREVTQyBTRCwKLQkgIHNpbV9jcHUgKkNQVSwKLQkgIGFkZHJlc3Nfd29yZCBjaWEsCi0JICBpbnQgb3AsCi0JICBhZGRyZXNzX3dvcmQgcEFkZHIsCi0JICBhZGRyZXNzX3dvcmQgdkFkZHIsCi0JICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb24pCi17Ci0jaWYgMSAvKiBzdG9wIHdhcm5pbmcgbWVzc2FnZSBiZWluZyBkaXNwbGF5ZWQgKHdlIHNob3VsZCByZWFsbHkganVzdCByZW1vdmUgdGhlIGNvZGUpICovCi0gIHN0YXRpYyBpbnQgaWNhY2hlX3dhcm5pbmcgPSAxOwotICBzdGF0aWMgaW50IGRjYWNoZV93YXJuaW5nID0gMTsKLSNlbHNlCi0gIHN0YXRpYyBpbnQgaWNhY2hlX3dhcm5pbmcgPSAwOwotICBzdGF0aWMgaW50IGRjYWNoZV93YXJuaW5nID0gMDsKLSNlbmRpZgotCi0gIC8qIElmIENQMCBpcyBub3QgdXNlYWJsZSAoVXNlciBvciBTdXBlcnZpc29yIG1vZGUpIGFuZCB0aGUgQ1AwCi0gICAgIGVuYWJsZSBiaXQgaW4gdGhlIFN0YXR1cyBSZWdpc3RlciBpcyBjbGVhciAtIGEgY29wcm9jZXNzb3IKLSAgICAgdW51c2FibGUgZXhjZXB0aW9uIGlzIHRha2VuLiAqLwotI2lmIDAKLSAgc2ltX2lvX3ByaW50ZihTRCwiVE9ETzogQ2FjaGUgYXZhaWxhYmlsaXR5IGNoZWNraW5nIChQQyA9IDB4JXMpXG4iLHByX2FkZHIoY2lhKSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9wICYgMHgzKSB7Ci0gICAgY2FzZSAwOiAvKiBpbnN0cnVjdGlvbiBjYWNoZSAqLwotICAgICAgc3dpdGNoIChvcCA+PiAyKSB7Ci0gICAgICAgIGNhc2UgMDogLyogSW5kZXggSW52YWxpZGF0ZSAqLwotICAgICAgICBjYXNlIDE6IC8qIEluZGV4IExvYWQgVGFnICovCi0gICAgICAgIGNhc2UgMjogLyogSW5kZXggU3RvcmUgVGFnICovCi0gICAgICAgIGNhc2UgNDogLyogSGl0IEludmFsaWRhdGUgKi8KLSAgICAgICAgY2FzZSA1OiAvKiBGaWxsICovCi0gICAgICAgIGNhc2UgNjogLyogSGl0IFdyaXRlYmFjayAqLwotICAgICAgICAgIGlmICghaWNhY2hlX3dhcm5pbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNpbV9pb19lcHJpbnRmKFNELCJJbnN0cnVjdGlvbiBDQUNIRSBvcGVyYXRpb24gJWQgdG8gYmUgY29kZWRcbiIsKG9wID4+IDIpKTsKLSAgICAgICAgICAgICAgaWNhY2hlX3dhcm5pbmcgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6IC8qIGRhdGEgY2FjaGUgKi8KLSAgICBjYXNlIDM6IC8qIHNlY29uZGFyeSBkYXRhIGNhY2hlICovCi0gICAgICBzd2l0Y2ggKG9wID4+IDIpIHsKLSAgICAgICAgY2FzZSAwOiAvKiBJbmRleCBXcml0ZWJhY2sgSW52YWxpZGF0ZSAqLwotICAgICAgICBjYXNlIDE6IC8qIEluZGV4IExvYWQgVGFnICovCi0gICAgICAgIGNhc2UgMjogLyogSW5kZXggU3RvcmUgVGFnICovCi0gICAgICAgIGNhc2UgMzogLyogQ3JlYXRlIERpcnR5ICovCi0gICAgICAgIGNhc2UgNDogLyogSGl0IEludmFsaWRhdGUgKi8KLSAgICAgICAgY2FzZSA1OiAvKiBIaXQgV3JpdGViYWNrIEludmFsaWRhdGUgKi8KLSAgICAgICAgY2FzZSA2OiAvKiBIaXQgV3JpdGViYWNrICovIAotICAgICAgICAgIGlmICghZGNhY2hlX3dhcm5pbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNpbV9pb19lcHJpbnRmKFNELCJEYXRhIENBQ0hFIG9wZXJhdGlvbiAlZCB0byBiZSBjb2RlZFxuIiwob3AgPj4gMikpOwotICAgICAgICAgICAgICBkY2FjaGVfd2FybmluZyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IC8qIHVucmVjb2duaXNlZCBjYWNoZSBJRCAqLwotICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm47Ci19Ci0KLQotSU5MSU5FX1NJTV9NQUlOICh2b2lkKQotcGVuZGluZ190aWNrIChTSU1fREVTQyBTRCwKLQkgICAgICBzaW1fY3B1ICpDUFUsCi0JICAgICAgYWRkcmVzc193b3JkIGNpYSkKLXsKLSAgaWYgKFBFTkRJTkdfVFJBQ0UpCQkJCQkJCQotICAgIHNpbV9pb19lcHJpbnRmIChTRCwgIlBFTkRJTkdfRFJBSU4gLSAweCVseCAtIHBlbmRpbmdfaW4gPSAlZCwgcGVuZGluZ19vdXQgPSAlZCwgcGVuZGluZ190b3RhbCA9ICVkXG4iLCAodW5zaWduZWQgbG9uZykgY2lhLCBQRU5ESU5HX0lOLCBQRU5ESU5HX09VVCwgUEVORElOR19UT1RBTCk7IAotICBpZiAoUEVORElOR19PVVQgIT0gUEVORElOR19JTikJCQkJCQotICAgIHsJCQkJCQkJCQkKLSAgICAgIGludCBsb29wOwkJCQkJCQkKLSAgICAgIGludCBpbmRleCA9IFBFTkRJTkdfT1VUOwkJCQkJCi0gICAgICBpbnQgdG90YWwgPSBQRU5ESU5HX1RPVEFMOwkJCQkJCi0gICAgICBpZiAoUEVORElOR19UT1RBTCA9PSAwKQkJCQkJCQotCXNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgIlBFTkRJTkdfRFJBSU4gLSBNaXMtbWF0Y2ggb24gcGVuZGluZyB1cGRhdGUgcG9pbnRlcnNcbiIpOyAKLSAgICAgIGZvciAobG9vcCA9IDAsIGluZGV4ID0gUEVORElOR19PVVQ7Ci0JICAgKGxvb3AgPCB0b3RhbCk7Ci0JICAgbG9vcCsrLCBpbmRleCA9IChpbmRleCArIDEpICUgUFNMT1RTKQotCXsJCQkJCQkJCQotCSAgaWYgKFBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSAhPSBOVUxMKQkJCQotCSAgICB7CQkJCQkJCQkKLQkgICAgICBQRU5ESU5HX1NMT1RfREVMQVlbaW5kZXhdIC09IDE7CQkJCQotCSAgICAgIGlmIChQRU5ESU5HX1NMT1RfREVMQVlbaW5kZXhdID09IDApCQkJCi0JCXsJCQkJCQkJCi0JCSAgaWYgKFBFTkRJTkdfVFJBQ0UpCi0JCSAgICBzaW1faW9fZXByaW50ZiAoU0QsICJQRU5ESU5HX0RSQUlOIC0gZHJhaW5lZCAtIGluZGV4ICVkLCBkZXN0IDB4JWx4LCBiaXQgJWQsIHZhbCAweCVseCwgc2l6ZSAlZFxuIiwKLQkJCQkgICAgaW5kZXgsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nKSBQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0sCi0JCQkJICAgIFBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdLAotCQkJCSAgICAodW5zaWduZWQgbG9uZykgUEVORElOR19TTE9UX1ZBTFVFW2luZGV4XSwKLQkJCQkgICAgUEVORElOR19TTE9UX1NJWkVbaW5kZXhdKTsKLQkJICBpZiAoUEVORElOR19TTE9UX0JJVFtpbmRleF0gPj0gMCkJCQkKLQkJICAgIHN3aXRjaCAoUEVORElOR19TTE9UX1NJWkVbaW5kZXhdKSAgICAgICAgICAgICAgICAgCi0JCSAgICAgIHsJCQkJCQkKLQkJICAgICAgY2FzZSA0OgotCQkJaWYgKFBFTkRJTkdfU0xPVF9WQUxVRVtpbmRleF0pCQkKLQkJCSAgKih1bnNpZ25lZDMyKilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gfD0gCQotCQkJICAgIEJJVDMyIChQRU5ESU5HX1NMT1RfQklUW2luZGV4XSk7CQkKLQkJCWVsc2UJCQkJCQkKLQkJCSAgKih1bnNpZ25lZDMyKilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gJj0gCQotCQkJICAgIEJJVDMyIChQRU5ESU5HX1NMT1RfQklUW2luZGV4XSk7CQkKLQkJCWJyZWFrOwkJCQkJCi0JCSAgICAgIGNhc2UgODoJCQkJCQotCQkJaWYgKFBFTkRJTkdfU0xPVF9WQUxVRVtpbmRleF0pCQkKLQkJCSAgKih1bnNpZ25lZDY0KilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gfD0gCQotCQkJICAgIEJJVDY0IChQRU5ESU5HX1NMT1RfQklUW2luZGV4XSk7CQkKLQkJCWVsc2UJCQkJCQkKLQkJCSAgKih1bnNpZ25lZDY0KilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gJj0gCQotCQkJICAgIEJJVDY0IChQRU5ESU5HX1NMT1RfQklUW2luZGV4XSk7CQkKLQkJCWJyZWFrOwkJCQkJCi0JCSAgICAgIH0KLQkJICBlbHNlCi0JCSAgICBzd2l0Y2ggKFBFTkRJTkdfU0xPVF9TSVpFW2luZGV4XSkgICAgICAgICAgICAgICAgIAotCQkgICAgICB7CQkJCQkJCi0JCSAgICAgIGNhc2UgNDoJCQkJCQotCQkJKih1bnNpZ25lZDMyKilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gPSAJCi0JCQkgIFBFTkRJTkdfU0xPVF9WQUxVRVtpbmRleF07CQkJCi0JCQlicmVhazsJCQkJCQotCQkgICAgICBjYXNlIDg6CQkJCQkKLQkJCSoodW5zaWduZWQ2NCopUEVORElOR19TTE9UX0RFU1RbaW5kZXhdID0gCQotCQkJICBQRU5ESU5HX1NMT1RfVkFMVUVbaW5kZXhdOwkJCQotCQkJYnJlYWs7CQkJCQkKLQkJICAgICAgfQkJCQkJCQkKLQkJICBpZiAoUEVORElOR19PVVQgPT0gaW5kZXgpCi0JCSAgICB7Ci0JCSAgICAgIFBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSA9IE5VTEw7Ci0JCSAgICAgIFBFTkRJTkdfT1VUID0gKFBFTkRJTkdfT1VUICsgMSkgJSBQU0xPVFM7Ci0JCSAgICAgIFBFTkRJTkdfVE9UQUwtLTsKLQkJICAgIH0KLQkJfQkJCQkJCQkKLQkgICAgICBlbHNlIGlmIChQRU5ESU5HX1RSQUNFICYmIFBFTkRJTkdfU0xPVF9ERUxBWVtpbmRleF0gPiAwKQotCQlzaW1faW9fZXByaW50ZiAoU0QsICJQRU5ESU5HX0RSQUlOIC0gcXVldWVkIC0gaW5kZXggJWQsIGRlbGF5ICVkLCBkZXN0IDB4JWx4LCBiaXQgJWQsIHZhbCAweCVseCwgc2l6ZSAlZFxuIiwKLQkJCQlpbmRleCwgUEVORElOR19TTE9UX0RFTEFZW2luZGV4XSwKLQkJCQkodW5zaWduZWQgbG9uZykgUEVORElOR19TTE9UX0RFU1RbaW5kZXhdLAotCQkJCVBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdLAotCQkJCSh1bnNpZ25lZCBsb25nKSBQRU5ESU5HX1NMT1RfVkFMVUVbaW5kZXhdLAotCQkJCVBFTkRJTkdfU0xPVF9TSVpFW2luZGV4XSk7Ci0KLQkgICAgfQkJCQkJCQkJCi0JfQkJCQkJCQkJCi0gICAgfQkJCQkJCQkJCQotfQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvc2ltLW1haW4uaCBiL3NpbS9taXBzL3NpbS1tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzQ2ZTkuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvc2ltLW1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5MiArMCwwIEBACi0vKiBNSVBTIFNpbXVsYXRvciBkZWZpbml0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTSU1fTUFJTl9ICi0jZGVmaW5lIFNJTV9NQUlOX0gKLQotLyogVGhpcyBzaW11bGF0b3IgZG9lc24ndCBjYWNoZSB0aGUgQ3VycmVudCBJbnN0cnVjdGlvbiBBZGRyZXNzICovCi0vKiAjZGVmaW5lIFNJTV9FTkdJTkVfSEFMVF9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKSAqLwotLyogI2RlZmluZSBTSU1fRU5HSU5FX1JFU1VNRV9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKSAqLwotCi0jZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOCi0KLQotLyogaG9iYmxlIHNvbWUgY29tbW9uIGZlYXR1cmVzIGZvciBtb21lbnQgKi8KLSNkZWZpbmUgV0lUSF9XQVRDSFBPSU5UUyAxCi0jZGVmaW5lIFdJVEhfTU9EVUxPX01FTU9SWSAxCi0KLQotI2RlZmluZSBTSU1fQ09SRV9TSUdOQUwoU0QsQ1BVLENJQSxNQVAsTlJfQllURVMsQUREUixUUkFOU0ZFUixFUlJPUikgXAotbWlwc19jb3JlX3NpZ25hbCAoKFNEKSwgKENQVSksIChDSUEpLCAoTUFQKSwgKE5SX0JZVEVTKSwgKEFERFIpLCAoVFJBTlNGRVIpLCAoRVJST1IpKQotCi0jaW5jbHVkZSAic2ltLWJhc2ljcy5oIgotCi10eXBlZGVmIGFkZHJlc3Nfd29yZCBzaW1fY2lhOwotCi0jaW5jbHVkZSAic2ltLWJhc2UuaCIKLQotCi0vKiBEZXByZWNpYXRlZCBtYWNyb3MgYW5kIHR5cGVzIGZvciBtYW5pcHVsYXRpbmcgNjRiaXQgdmFsdWVzLiAgVXNlCi0gICAuLi9jb21tb24vc2ltLWJpdHMuaCBhbmQgLi4vY29tbW9uL3NpbS1lbmRpYW4uaCBtYWNyb3MgaW5zdGVhZC4gKi8KLQotdHlwZWRlZiBzaWduZWQ2NCB3b3JkNjQ7Ci10eXBlZGVmIHVuc2lnbmVkNjQgdXdvcmQ2NDsKLQotI2RlZmluZSBXT1JENjRMTyh0KSAgICAgKHVuc2lnbmVkIGludCkoKHQpJjB4RkZGRkZGRkYpCi0jZGVmaW5lIFdPUkQ2NEhJKHQpICAgICAodW5zaWduZWQgaW50KSgoKHV3b3JkNjQpKHQpKT4+MzIpCi0jZGVmaW5lIFNFVDY0TE8odCkgICAgICAoKCh1d29yZDY0KSh0KSkmMHhGRkZGRkZGRikKLSNkZWZpbmUgU0VUNjRISSh0KQkoKCh1d29yZDY0KSh0KSk8PDMyKQotI2RlZmluZSBXT1JENjQoaCxsKSAgICAgKCh3b3JkNjQpKChTRVQ2NEhJKGgpfFNFVDY0TE8obCkpKSkKLSNkZWZpbmUgVVdPUkQ2NChoLGwpICAgICAoU0VUNjRISShoKXxTRVQ2NExPKGwpKQotCi0vKiBTaWduLWV4dGVuZCB0aGUgZ2l2ZW4gdmFsdWUgKGUpIGFzIGEgdmFsdWUgKGIpIGJpdHMgbG9uZy4gV2UgY2Fubm90Ci0gICBhc3N1bWUgdGhlIEhJMzJiaXRzIG9mIHRoZSBvcGVyYW5kIGFyZSB6ZXJvLCBzbyB3ZSBtdXN0IHBlcmZvcm0gYQotICAgbWFzayB0byBlbnN1cmUgd2UgY2FuIHVzZSB0aGUgc2ltcGxlIHN1YnRyYWN0aW9uIHRvIHNpZ24tZXh0ZW5kLiAqLwotI2RlZmluZSBTSUdORVhURU5EKGUsYikgXAotICgodW5zaWduZWRfd29yZCkgXAotICAoKChlKSAmICgodXdvcmQ2NCkgMSA8PCAoKGIpIC0gMSkpKSBcCi0gICA/ICgoKGUpICYgKCgodXdvcmQ2NCkgMSA8PCAoYikpIC0gMSkpIC0gKCh1d29yZDY0KTEgPDwgKGIpKSkgXAotICAgOiAoKGUpICYgKCgoKCh1d29yZDY0KSAxIDw8ICgoYikgLSAxKSkgLSAxKSA8PCAxKSB8IDEpKSkpCi0KLS8qIENoZWNrIGlmIGEgdmFsdWUgd2lsbCBmaXQgd2l0aGluIGEgaGFsZndvcmQ6ICovCi0jZGVmaW5lIE5PVEhBTEZXT1JEVkFMVUUodikgKCgoKCgodXdvcmQ2NCkodik+PjE2KSA9PSAwKSAmJiAhKCh2KSAmICgodW5zaWduZWQpMSA8PCAxNSkpKSB8fCAoKCgoKHV3b3JkNjQpKHYpPj4zMikgPT0gMHhGRkZGRkZGRikgJiYgKCgoKHV3b3JkNjQpKHYpPj4xNikgJiAweEZGRkYpID09IDB4RkZGRikpICYmICgodikgJiAoKHVuc2lnbmVkKTEgPDwgMTUpKSkpID8gKDEgPT0gMCkgOiAoMSA9PSAxKSkKLQotCi0KLS8qIEZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnM6ICovCi0KLSNpbmNsdWRlICJzaW0tZnB1LmgiCi0KLS8qIEZQVSByZWdpc3RlcnMgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcy4gQWxsIG90aGVyIHZhbHVlcwotICAgYXJlIHJlc2VydmVkIChhbmQgdW5kZWZpbmVkKS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gZm10X3NpbmdsZSAgPSAwLAotIGZtdF9kb3VibGUgID0gMSwKLSBmbXRfd29yZCAgICA9IDQsCi0gZm10X2xvbmcgICAgPSA1LAotIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHdlbGwgb3V0c2lkZSB0aGUgbm9ybWFsIGFjY2VwdGFibGUgZm9ybWF0Ci0gICAgcmFuZ2UsIGFuZCBhcmUgdXNlZCBpbiB0aGUgcmVnaXN0ZXIgc3RhdHVzIHZlY3Rvci4gKi8KLSBmbXRfdW5rbm93biAgICAgICA9IDB4MTAwMDAwMDAsCi0gZm10X3VuaW50ZXJwcmV0ZWQgPSAweDIwMDAwMDAwLAotIGZtdF91bmludGVycHJldGVkXzMyID0gMHg0MDAwMDAwMCwKLSBmbXRfdW5pbnRlcnByZXRlZF82NCA9IDB4ODAwMDAwMDBVLAotfSBGUF9mb3JtYXRzOwotCi11bnNpZ25lZDY0IHZhbHVlX2ZwciBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgZnByLCBGUF9mb3JtYXRzKSk7Ci0jZGVmaW5lIFZhbHVlRlBSKEZQUixGTVQpIHZhbHVlX2ZwciAoU0QsIENQVSwgY2lhLCAoRlBSKSwgKEZNVCkpCi0KLXZvaWQgc3RvcmVfZnByIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBmcHIsIEZQX2Zvcm1hdHMgZm10LCB1bnNpZ25lZDY0IHZhbHVlKSk7Ci0jZGVmaW5lIFN0b3JlRlBSKEZQUixGTVQsVkFMVUUpIHN0b3JlX2ZwciAoU0QsIENQVSwgY2lhLCAoRlBSKSwgKEZNVCksIChWQUxVRSkpCi0KLWludCBOYU4gUEFSQU1TICgodW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmbXQpKTsKLWludCBJbmZpbml0eSBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wLCBGUF9mb3JtYXRzIGZtdCkpOwotaW50IExlc3MgUEFSQU1TICgodW5zaWduZWQ2NCBvcDEsIHVuc2lnbmVkNjQgb3AyLCBGUF9mb3JtYXRzIGZtdCkpOwotaW50IEVxdWFsIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKLXVuc2lnbmVkNjQgQWJzb2x1dGVWYWx1ZSBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wLCBGUF9mb3JtYXRzIGZtdCkpOwotdW5zaWduZWQ2NCBOZWdhdGUgUEFSQU1TICgodW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmbXQpKTsKLXVuc2lnbmVkNjQgQWRkIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKLXVuc2lnbmVkNjQgU3ViIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKLXVuc2lnbmVkNjQgTXVsdGlwbHkgUEFSQU1TICgodW5zaWduZWQ2NCBvcDEsIHVuc2lnbmVkNjQgb3AyLCBGUF9mb3JtYXRzIGZtdCkpOwotdW5zaWduZWQ2NCBEaXZpZGUgUEFSQU1TICgodW5zaWduZWQ2NCBvcDEsIHVuc2lnbmVkNjQgb3AyLCBGUF9mb3JtYXRzIGZtdCkpOwotdW5zaWduZWQ2NCBSZWNpcCBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wLCBGUF9mb3JtYXRzIGZtdCkpOwotdW5zaWduZWQ2NCBTcXVhcmVSb290IFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AsIEZQX2Zvcm1hdHMgZm10KSk7Ci11bnNpZ25lZDY0IE1heCBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wMSwgdW5zaWduZWQ2NCBvcDIsIEZQX2Zvcm1hdHMgZm10KSk7Ci11bnNpZ25lZDY0IE1pbiBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wMSwgdW5zaWduZWQ2NCBvcDIsIEZQX2Zvcm1hdHMgZm10KSk7Ci11bnNpZ25lZDY0IGNvbnZlcnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IHJtLCB1bnNpZ25lZDY0IG9wLCBGUF9mb3JtYXRzIGZyb20sIEZQX2Zvcm1hdHMgdG8pKTsKLSNkZWZpbmUgQ29udmVydChybSxvcCxmcm9tLHRvKSBcCi1jb252ZXJ0IChTRCwgQ1BVLCBjaWEsIHJtLCBvcCwgZnJvbSwgdG8pCi0KLS8qIE1hY3JvIHRvIHVwZGF0ZSBGUFNSIGNvbmRpdGlvbi1jb2RlIGZpZWxkLiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5Ci0gICB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIGEgaG9sZSBpbiB0aGUgaW5kZXggcmFuZ2Ugb2YgdGhlIGJpdHMgd2l0aGluCi0gICB0aGUgRkNTUiByZWdpc3Rlci4gQWxzbywgdGhlIG51bWJlciBvZiBiaXRzIHZpc2libGUgZGVwZW5kcyBvbiB0aGUKLSAgIE1JUFMgSVNBIHZlcnNpb24gYmVpbmcgc3VwcG9ydGVkLiAqLwotCi0jZGVmaW5lIFNFVEZDQyhjYyx2KSB7XAotICBpbnQgYml0ID0gKChjYyA9PSAwKSA/IDIzIDogKDI0ICsgKGNjKSkpO1wKLSAgRkNTUiA9ICgoRkNTUiAmIH4oMSA8PCBiaXQpKSB8ICgodikgPDwgYml0KSk7XAotfQotI2RlZmluZSBHRVRGQ0MoY2MpICgoKCgoY2MpID09IDApID8gKEZDU1IgJiAoMSA8PCAyMykpIDogKEZDU1IgJiAoMSA8PCAoMjQgKyAoY2MpKSkpKSAhPSAwKSA/IDFVIDogMCkKLQotLyogVGhpcyBzaG91bGQgYmUgdGhlIENPQzEgdmFsdWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcmVjZWRpbmcKLSAgIGluc3RydWN0aW9uOiAqLwotI2RlZmluZSBQUkVWQ09DMSgpICgoU1RBVEUgJiBzaW1QQ09DMSkgPyAxIDogMCkKLQotI2lmZGVmIFRBUkdFVF9FTkFCTEVfRlIKLS8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBlbmFibGVkIGZvciBhbGwgdGFyZ2V0cywgYnV0IG5lZWRzIHRlc3RpbmcgZmlyc3QuICovCi0jZGVmaW5lIFNpemVGR1IoKSAoKChXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFKSA9PSA2NCkgXAotICAgPyAoKFNSICYgc3RhdHVzX0ZSKSA/IDY0IDogMzIpIFwKLSAgIDogKFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUpKQotI2Vsc2UKLSNkZWZpbmUgU2l6ZUZHUigpIChXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFKQotI2VuZGlmCi0KLS8qIFN0YW5kYXJkIEZDUlMgYml0czogKi8KLSNkZWZpbmUgSVIgKDApIC8qIEluZXhhY3QgUmVzdWx0ICovCi0jZGVmaW5lIFVGICgxKSAvKiBVbmRlckZsb3cgKi8KLSNkZWZpbmUgT0YgKDIpIC8qIE92ZXJGbG93ICovCi0jZGVmaW5lIERaICgzKSAvKiBEaXZpc2lvbiBieSBaZXJvICovCi0jZGVmaW5lIElPICg0KSAvKiBJbnZhbGlkIE9wZXJhdGlvbiAqLwotI2RlZmluZSBVTyAoNSkgLyogVW5pbXBsZW1lbnRlZCBPcGVyYXRpb24gKi8KLQotLyogR2V0IG1hc2tzIGZvciBpbmRpdmlkdWFsIGZsYWdzOiAqLwotI2lmIDEgLyogU0FGRSB2ZXJzaW9uICovCi0jZGVmaW5lIEZQX0ZMQUdTKGIpICAoKCh1bnNpZ25lZCkoYikgPCA1KSA/ICgxIDw8ICgoYikgKyAyKSkgOiAwKQotI2RlZmluZSBGUF9FTkFCTEUoYikgKCgodW5zaWduZWQpKGIpIDwgNSkgPyAoMSA8PCAoKGIpICsgNykpIDogMCkKLSNkZWZpbmUgRlBfQ0FVU0UoYikgICgoKHVuc2lnbmVkKShiKSA8IDYpID8gKDEgPDwgKChiKSArIDEyKSkgOiAwKQotI2Vsc2UKLSNkZWZpbmUgRlBfRkxBR1MoYikgICgxIDw8ICgoYikgKyAyKSkKLSNkZWZpbmUgRlBfRU5BQkxFKGIpICgxIDw8ICgoYikgKyA3KSkKLSNkZWZpbmUgRlBfQ0FVU0UoYikgICgxIDw8ICgoYikgKyAxMikpCi0jZW5kaWYKLQotI2RlZmluZSBGUF9GUyAgICAgICAgICgxIDw8IDI0KSAvKiBNSVBTIElJSSBvbndhcmRzIDogRmx1c2ggdG8gWmVybyAqLwotCi0jZGVmaW5lIEZQX01BU0tfUk0gICAgKDB4MykKLSNkZWZpbmUgRlBfU0hfUk0gICAgICAoMCkKLSNkZWZpbmUgRlBfUk1fTkVBUkVTVCAoMCkgLyogUm91bmQgdG8gbmVhcmVzdCAgICAgICAgKFJvdW5kKSAqLwotI2RlZmluZSBGUF9STV9UT1pFUk8gICgxKSAvKiBSb3VuZCB0byB6ZXJvICAgICAgICAgICAoVHJ1bmMpICovCi0jZGVmaW5lIEZQX1JNX1RPUElORiAgKDIpIC8qIFJvdW5kIHRvIFBsdXMgaW5maW5pdHkgIChDZWlsKSAqLwotI2RlZmluZSBGUF9STV9UT01JTkYgICgzKSAvKiBSb3VuZCB0byBNaW51cyBpbmZpbml0eSAoRmxvb3IpICovCi0jZGVmaW5lIEdFVFJNKCkgICAgICAgKGludCkoKEZDU1IgPj4gRlBfU0hfUk0pICYgRlBfTUFTS19STSkKLQotCi0KLQotCi0KLS8qIEhJL0xPIHJlZ2lzdGVyIGFjY2Vzc2VzICovCi0KLS8qIEZvciBzb21lIE1JUFMgdGFyZ2V0cywgdGhlIEhJL0xPIHJlZ2lzdGVycyBoYXZlIGNlcnRhaW4gdGltaW5nCi0gICByZXN0cmljdGlvbnMgaW4gdGhhdCwgZm9yIGluc3RhbmNlLCBhIHJlYWQgb2YgYSBISSByZWdpc3RlciBtdXN0IGJlCi0gICBzZXBhcmF0ZWQgYnkgYXQgbGVhc3QgdGhyZWUgaW5zdHJ1Y3Rpb25zIGZyb20gYSBwcmVjZWVkaW5nIHJlYWQuCi0KLSAgIFRoZSBzdHJ1Y3QgYmVsb3cgaXMgdXNlZCB0byByZWNvcmQgdGhlIGxhc3QgYWNjZXNzIGJ5IGVhY2ggb2YgQSBNVCwKLSAgIE1GIG9yIG90aGVyIE9QIGluc3RydWN0aW9uIHRvIGEgSEkvTE8gcmVnaXN0ZXIuICBTZWUgbWlwcy5pZ2VuIGZvcgotICAgbW9yZSBkZXRhaWxzLiAqLwotCi10eXBlZGVmIHN0cnVjdCBfaGlsb19hY2Nlc3MgewotICBzaWduZWQ2NCB0aW1lc3RhbXA7Ci0gIGFkZHJlc3Nfd29yZCBjaWE7Ci19IGhpbG9fYWNjZXNzOwotCi10eXBlZGVmIHN0cnVjdCBfaGlsb19oaXN0b3J5IHsKLSAgaGlsb19hY2Nlc3MgbXQ7Ci0gIGhpbG9fYWNjZXNzIG1mOwotICBoaWxvX2FjY2VzcyBvcDsKLX0gaGlsb19oaXN0b3J5OwotCi0KLQotCi0vKiBJbnRlZ2VyIEFMVSBvcGVyYXRpb25zOiAqLwotCi0jaW5jbHVkZSAic2ltLWFsdS5oIgotCi0jZGVmaW5lIEFMVTMyX0VORChBTlMpIFwKLSAgaWYgKEFMVTMyX0hBRF9PVkVSRkxPVykgXAotICAgIFNpZ25hbEV4Y2VwdGlvbkludGVnZXJPdmVyZmxvdyAoKTsgXAotICAoQU5TKSA9IChzaWduZWQzMikgQUxVMzJfT1ZFUkZMT1dfUkVTVUxUCi0KLQotI2RlZmluZSBBTFU2NF9FTkQoQU5TKSBcCi0gIGlmIChBTFU2NF9IQURfT1ZFUkZMT1cpIFwKLSAgICBTaWduYWxFeGNlcHRpb25JbnRlZ2VyT3ZlcmZsb3cgKCk7IFwKLSAgKEFOUykgPSBBTFU2NF9PVkVSRkxPV19SRVNVTFQ7Ci0KLQotCi0KLQotLyogVGhlIGZvbGxvd2luZyBpcyBwcm9iYWJseSBub3QgdXNlZCBmb3IgTUlQUyBJViBvbndhcmRzOiAqLwotLyogU2xvdHMgZm9yIGRlbGF5ZWQgcmVnaXN0ZXIgdXBkYXRlcy4gRm9yIHRoZSBtb21lbnQgd2UganVzdCBoYXZlIGEKLSAgIGZpeGVkIG51bWJlciBvZiBzbG90cyAocmF0aGVyIHRoYW4gYSBtb3JlIGdlbmVyaWMsIGR5bmFtaWMKLSAgIHN5c3RlbSkuIFRoaXMga2VlcHMgdGhlIHNpbXVsYXRvciBmYXN0LiBIb3dldmVyLCB3ZSBvbmx5IGFsbG93Ci0gICBmb3IgdGhlIHJlZ2lzdGVyIHVwZGF0ZSB0byBiZSBkZWxheWVkIGZvciBhIHNpbmdsZSBpbnN0cnVjdGlvbgotICAgY3ljbGUuICovCi0jZGVmaW5lIFBTTE9UUyAoOCkgLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gY3ljbGVzICovCi0KLXR5cGVkZWYgc3RydWN0IF9wZW5kaW5nX3dyaXRlX3F1ZXVlIHsKLSAgaW50IGluOwotICBpbnQgb3V0OwotICBpbnQgdG90YWw7Ci0gIGludCBzbG90X2RlbGF5W1BTTE9UU107Ci0gIGludCBzbG90X3NpemVbUFNMT1RTXTsKLSAgaW50IHNsb3RfYml0W1BTTE9UU107Ci0gIHZvaWQgKnNsb3RfZGVzdFtQU0xPVFNdOwotICB1bnNpZ25lZDY0IHNsb3RfdmFsdWVbUFNMT1RTXTsKLX0gcGVuZGluZ193cml0ZV9xdWV1ZTsKLQotI2lmbmRlZiBQRU5ESU5HX1RSQUNFCi0jZGVmaW5lIFBFTkRJTkdfVFJBQ0UgMAotI2VuZGlmCi0jZGVmaW5lIFBFTkRJTkdfSU4gKChDUFUpLT5wZW5kaW5nLmluKQotI2RlZmluZSBQRU5ESU5HX09VVCAoKENQVSktPnBlbmRpbmcub3V0KQotI2RlZmluZSBQRU5ESU5HX1RPVEFMICgoQ1BVKS0+cGVuZGluZy50b3RhbCkKLSNkZWZpbmUgUEVORElOR19TTE9UX1NJWkUgKChDUFUpLT5wZW5kaW5nLnNsb3Rfc2l6ZSkKLSNkZWZpbmUgUEVORElOR19TTE9UX0JJVCAoKENQVSktPnBlbmRpbmcuc2xvdF9iaXQpCi0jZGVmaW5lIFBFTkRJTkdfU0xPVF9ERUxBWSAoKENQVSktPnBlbmRpbmcuc2xvdF9kZWxheSkKLSNkZWZpbmUgUEVORElOR19TTE9UX0RFU1QgKChDUFUpLT5wZW5kaW5nLnNsb3RfZGVzdCkKLSNkZWZpbmUgUEVORElOR19TTE9UX1ZBTFVFICgoQ1BVKS0+cGVuZGluZy5zbG90X3ZhbHVlKQotCi0vKiBJbnZhbGlkYXRlIHRoZSBwZW5kaW5nIHdyaXRlIHF1ZXVlLCBhbGwgcGVuZGluZyB3cml0ZXMgYXJlCi0gICBkaXNjYXJkZWQuICovCi0KLSNkZWZpbmUgUEVORElOR19JTlZBTElEQVRFKCkgXAotbWVtc2V0ICgmKENQVSktPnBlbmRpbmcsIDAsIHNpemVvZiAoKENQVSktPnBlbmRpbmcpKQotCi0vKiBTY2hlZHVsZSBhIHdyaXRlIHRvIERFU1QgZm9yIE4gY3ljbGVzIHRpbWUuICBGb3IgNjQgYml0Ci0gICBkZXN0aW5hdGlvbnMsIHNjaGVkdWxlIHR3byB3cml0ZXMuICBGb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLAotICAgdGhlIGNhbGxlciBzaG91bGQgc2NoZWR1bGUgYSB3cml0ZSB0byBib3RoIHRoZSBkZXN0IHJlZ2lzdGVyIGFuZAotICAgdGhlIEZQUl9TVEFURSByZWdpc3Rlci4gIFdoZW4gQklUIGlzIG5vbi1uZWdhdGl2ZSwgb25seSBCSVQgb2YgREVTVAotICAgaXMgdXBkYXRlZC4gKi8KLQotI2RlZmluZSBQRU5ESU5HX1NDSEVEKERFU1QsVkFMLERFTEFZLEJJVCkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIGlmIChQRU5ESU5HX1NMT1RfREVTVFtQRU5ESU5HX0lOXSAhPSBOVUxMKQkJCQlcCi0gICAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsCQkJCQlcCi0JCSAgICAgICAgIlBFTkRJTkdfU0NIRUQgLSBidWZmZXIgb3ZlcmZsb3dcbiIpOwkJXAotICAgIGlmIChQRU5ESU5HX1RSQUNFKQkJCQkJCQlcCi0gICAgICBzaW1faW9fZXByaW50ZiAoU0QsICJQRU5ESU5HX1NDSEVEIC0gMHglbHggLSBkZXN0IDB4JWx4LCB2YWwgMHglbHgsIGJpdCAlZCwgc2l6ZSAlZCwgcGVuZGluZ19pbiAlZCwgcGVuZGluZ19vdXQgJWQsIHBlbmRpbmdfdG90YWwgJWRcbiIsCQkJXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgY2lhLCAodW5zaWduZWQgbG9uZykgJihERVNUKSwJXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgKFZBTCksIChCSVQpLCAoaW50KSBzaXplb2YgKERFU1QpLFwKLQkJICAgICAgUEVORElOR19JTiwgUEVORElOR19PVVQsIFBFTkRJTkdfVE9UQUwpOwkJXAotICAgIFBFTkRJTkdfU0xPVF9ERUxBWVtQRU5ESU5HX0lOXSA9IChERUxBWSkgKyAxOwkJCVwKLSAgICBQRU5ESU5HX1NMT1RfREVTVFtQRU5ESU5HX0lOXSA9ICYoREVTVCk7CQkJCVwKLSAgICBQRU5ESU5HX1NMT1RfVkFMVUVbUEVORElOR19JTl0gPSAoVkFMKTsJCQkJXAotICAgIFBFTkRJTkdfU0xPVF9TSVpFW1BFTkRJTkdfSU5dID0gc2l6ZW9mIChERVNUKTsJCQlcCi0gICAgUEVORElOR19TTE9UX0JJVFtQRU5ESU5HX0lOXSA9IChCSVQpOwkJCQlcCi0gICAgUEVORElOR19JTiA9IChQRU5ESU5HX0lOICsgMSkgJSBQU0xPVFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUEVORElOR19UT1RBTCArPSAxOwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBFTkRJTkdfV1JJVEUoREVTVCxWQUwsREVMQVkpIFBFTkRJTkdfU0NIRUQoREVTVCxWQUwsREVMQVksLTEpCi0jZGVmaW5lIFBFTkRJTkdfQklUKERFU1QsVkFMLERFTEFZLEJJVCkgUEVORElOR19TQ0hFRChERVNULFZBTCxERUxBWSxCSVQpCi0KLSNkZWZpbmUgUEVORElOR19USUNLKCkgcGVuZGluZ190aWNrIChTRCwgQ1BVLCBjaWEpCi0KLSNkZWZpbmUgUEVORElOR19GTFVTSCgpIGFib3J0ICgpIC8qIHRoaW5rIGFib3V0IHRoaXMgb25lICovCi0jZGVmaW5lIFBFTkRJTkdfRlAoKSBhYm9ydCAoKSAvKiB0aGluayBhYm91dCB0aGlzIG9uZSAqLwotCi0vKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBQRU5ESU5HX0ZJTEwoUixWQUwpIAkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGlmICgoUikgPj0gRkdSSURYICYmIChSKSA8IEZHUklEWCArIE5SX0ZHUikJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBQRU5ESU5HX1NDSEVEKEZHUlsoUikgLSBGR1JJRFhdLCBWQUwsIDEsIC0xKTsJCQlcCi0gICAgICBQRU5ESU5HX1NDSEVEKEZQUl9TVEFURVsoUikgLSBGR1JJRFhdLCBmbXRfdW5pbnRlcnByZXRlZCwgMSwgLTEpOwlcCi0gICAgfQkJCQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICBQRU5ESU5HX1NDSEVEKEdQUlsoUildLCBWQUwsIDEsIC0xKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotCi0KLXN0cnVjdCBfc2ltX2NwdSB7Ci0KLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSBpbnRlcm5hbCBzaW11bGF0b3Igc3RhdGUgdmFyaWFibGVzOiAqLwotI2RlZmluZSBDSUFfR0VUKENQVSkgKChDUFUpLT5yZWdpc3RlcnNbUENJRFhdICsgMCkKLSNkZWZpbmUgQ0lBX1NFVChDUFUsQ0lBKSAoKENQVSktPnJlZ2lzdGVyc1tQQ0lEWF0gPSAoQ0lBKSkKLSAgYWRkcmVzc193b3JkIGRzcGM7ICAvKiBkZWxheS1zbG90IFBDICovCi0jZGVmaW5lIERTUEMgKChDUFUpLT5kc3BjKQotCi0jZGVmaW5lIERFTEFZX1NMT1QoVEFSR0VUKSBOSUEgPSBkZWxheXNsb3QzMiAoU0RfLCAoVEFSR0VUKSkKLSNkZWZpbmUgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OKCkgTklBID0gbnVsbGlmeV9uZXh0X2luc24zMiAoU0RfKQotCi0KLSAgLyogU3RhdGUgb2YgdGhlIHNpbXVsYXRvciAqLwotICB1bnNpZ25lZCBpbnQgc3RhdGU7Ci0gIHVuc2lnbmVkIGludCBkc3N0YXRlOwotI2RlZmluZSBTVEFURSAoKENQVSktPnN0YXRlKQotI2RlZmluZSBEU1NUQVRFICgoQ1BVKS0+ZHNzdGF0ZSkKLQotLyogRmxhZ3MgaW4gdGhlICJzdGF0ZSIgdmFyaWFibGU6ICovCi0jZGVmaW5lIHNpbUhBTFRFWCAgICAgICAoMSA8PCAyKSAgLyogMCA9IHJ1bjsgMSA9IGhhbHQgb24gZXhjZXB0aW9uICovCi0jZGVmaW5lIHNpbUhBTFRJTiAgICAgICAoMSA8PCAzKSAgLyogMCA9IHJ1bjsgMSA9IGhhbHQgb24gaW50ZXJydXB0ICovCi0jZGVmaW5lIHNpbVRSQUNFICAgICAgICAoMSA8PCA4KSAgLyogMCA9IGRvIG5vdGhpbmc7IDEgPSB0cmFjZSBhZGRyZXNzIGFjdGl2aXR5ICovCi0jZGVmaW5lIHNpbVBDT0MwICAgICAgICAoMSA8PCAxNykgLyogQ09DWzFdIGZyb20gY3VycmVudCAqLwotI2RlZmluZSBzaW1QQ09DMSAgICAgICAgKDEgPDwgMTgpIC8qIENPQ1sxXSBmcm9tIHByZXZpb3VzICovCi0jZGVmaW5lIHNpbURFTEFZU0xPVCAgICAoMSA8PCAyNCkgLyogMCA9IGRvIG5vdGhpbmc7IDEgPSBkZWxheSBzbG90IGVudHJ5IGV4aXN0cyAqLwotI2RlZmluZSBzaW1TS0lQTkVYVCAgICAgKDEgPDwgMjUpIC8qIDAgPSBkbyBub3RoaW5nOyAxID0gc2tpcCBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBzaW1TSUdJTlQJKDEgPDwgMjgpICAvKiAwID0gZG8gbm90aGluZzsgMSA9IFNJR0lOVCBoYXMgb2NjdXJlZCAqLwotI2RlZmluZSBzaW1KQUxERUxBWVNMT1QJKDEgPDwgMjkpIC8qIDEgPSBpbiBqYWwgZGVsYXkgc2xvdCAqLwotCi0jZGVmaW5lIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSygpIFwKLSAgeyBcCi0gICAgLyogUGVyZm9ybSBhbnkgcGVuZGluZyB3cml0ZXMgKi8gXAotICAgIFBFTkRJTkdfVElDSygpOyBcCi0gICAgLyogU2V0IHByZXZpb3VzIGZsYWcsIGRlcGVuZGluZyBvbiBjdXJyZW50OiAqLyBcCi0gICAgaWYgKFNUQVRFICYgc2ltUENPQzApIFwKLSAgICAgU1RBVEUgfD0gc2ltUENPQzE7IFwKLSAgICBlbHNlIFwKLSAgICAgU1RBVEUgJj0gfnNpbVBDT0MxOyBcCi0gICAgLyogYW5kIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZTogKi8gXAotICAgIGlmIChHRVRGQ0MoMCkpIFwKLSAgICAgU1RBVEUgfD0gc2ltUENPQzA7IFwKLSAgICBlbHNlIFwKLSAgICAgU1RBVEUgJj0gfnNpbVBDT0MwOyBcCi0gIH0KLQotCi0vKiBUaGlzIGlzIG5hc3R5LCBzaW5jZSB3ZSBoYXZlIHRvIHJlbHkgb24gbWF0Y2hpbmcgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXJzIHVzZWQgYnkgR0RCLiBVbmZvcnR1bmF0ZWx5LCBkZXBlbmRpbmcgb24gdGhlIE1JUFMgdGFyZ2V0Ci0gICBHREIgdXNlcyBkaWZmZXJlbnQgcmVnaXN0ZXIgbnVtYmVycy4gV2UgY2Fubm90IGp1c3QgaW5jbHVkZSB0aGUKLSAgIHJlbGV2YW50ICJnZGIvdG0uaCIgbGluaywgc2luY2UgR0RCIG1heSBub3QgYmUgY29uZmlndXJlZCBiZWZvcmUKLSAgIHRoZSBzaW0gd29ybGQsIGFuZCBhbHNvIHRoZSBHREIgaGVhZGVyIGZpbGUgcmVxdWlyZXMgdG9vIG11Y2ggb3RoZXIKLSAgIHN0YXRlLiAqLwotCi0jaWZuZGVmIFRNX01JUFNfSAotI2RlZmluZSBMQVNUX0VNQkVEX1JFR05VTSAoODkpCi0jZGVmaW5lIE5VTV9SRUdTIChMQVNUX0VNQkVEX1JFR05VTSArIDEpCi0KLQotI2VuZGlmCi0KLQotZW51bSBmbG9hdF9vcGVyYXRpb24KLSAgewotICAgIEZMT1BfQURELCAgICBGTE9QX1NVQiwgICAgRkxPUF9NVUwsICAgIEZMT1BfTUFERCwKLSAgICBGTE9QX01TVUIsICAgRkxPUF9NQVg9MTAsIEZMT1BfTUlOLCAgICBGTE9QX0FCUywKLSAgICBGTE9QX0lUT0YwPTE0LCBGTE9QX0ZUT0kwPTE4LCBGTE9QX05FRz0yMwotICB9OwotCi0vKiBUbyBrZWVwIHRoaXMgZGVmYXVsdCBzaW11bGF0b3Igc2ltcGxlLCBhbmQgZmFzdCwgd2UgdXNlIGEgZGlyZWN0Ci0gICB2ZWN0b3Igb2YgcmVnaXN0ZXJzLiBUaGUgaW50ZXJuYWwgc2ltdWxhdG9yIGVuZ2luZSB0aGVuIHVzZXMKLSAgIG1hbmlmZXN0cyB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc2xvdC4gKi8KLQotICB1bnNpZ25lZF93b3JkIHJlZ2lzdGVyc1tMQVNUX0VNQkVEX1JFR05VTSArIDFdOwotCi0gIGludCByZWdpc3Rlcl93aWR0aHNbTlVNX1JFR1NdOwotI2RlZmluZSBSRUdJU1RFUlMgICAgICAgKChDUFUpLT5yZWdpc3RlcnMpCi0KLSNkZWZpbmUgR1BSICAgICAoJlJFR0lTVEVSU1swXSkKLSNkZWZpbmUgR1BSX1NFVChOLFZBTCkgKFJFR0lTVEVSU1soTildID0gKFZBTCkpCi0KLSAgLyogV2hpbGUgc3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluIHRoZQotICAgICBtYWluIHJlZ2lzdGVycyBhcnJheSwgdGhleSBhcmUgc3RvcmVkIHNlcGFyYXRseS4gIFRoaXMgaXMgYmVjYXVzZQotICAgICB0aGVpciBzaXplIG1heSBub3QgbmVjZXNzYXJpbHkgbWF0Y2ggdGhlIHNpemUgb2YgZWl0aGVyIHRoZQotICAgICBnZW5lcmFsLXB1cnBvc2Ugb3Igc3lzdGVtIHNwZWNpZmljIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOUl9GR1IgICgzMikKLSNkZWZpbmUgRkdSSURYICAoMzgpCi0gIGZwX3dvcmQgZmdyW05SX0ZHUl07Ci0jZGVmaW5lIEZHUiAgICAgKChDUFUpLT5mZ3IpCi0KLSNkZWZpbmUgTE8gICAgICAoUkVHSVNURVJTWzMzXSkKLSNkZWZpbmUgSEkgICAgICAoUkVHSVNURVJTWzM0XSkKLSNkZWZpbmUgUENJRFgJMzcKLSNkZWZpbmUgUEMgICAgICAoUkVHSVNURVJTW1BDSURYXSkKLSNkZWZpbmUgQ0FVU0UgICAoUkVHSVNURVJTWzM2XSkKLSNkZWZpbmUgU1JJRFggICAoMzIpCi0jZGVmaW5lIFNSICAgICAgKFJFR0lTVEVSU1tTUklEWF0pICAgICAgLyogQ1BVIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBGQ1IwSURYICAoNzEpCi0jZGVmaW5lIEZDUjAgICAgKFJFR0lTVEVSU1tGQ1IwSURYXSkgICAgLyogcmVhbGx5IGEgMzJiaXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRkNSMzFJRFggKDcwKQotI2RlZmluZSBGQ1IzMSAgIChSRUdJU1RFUlNbRkNSMzFJRFhdKSAgIC8qIHJlYWxseSBhIDMyYml0IHJlZ2lzdGVyICovCi0jZGVmaW5lIEZDU1IgICAgKEZDUjMxKQotI2RlZmluZSBEZWJ1ZwkoUkVHSVNURVJTWzg2XSkKLSNkZWZpbmUgREVQQwkoUkVHSVNURVJTWzg3XSkKLSNkZWZpbmUgRVBDCShSRUdJU1RFUlNbODhdKQotI2RlZmluZSBDT0NJRFggIChMQVNUX0VNQkVEX1JFR05VTSArIDIpIC8qIHNwZWNpYWwgY2FzZSA6IG91dHNpZGUgdGhlIG5vcm1hbCByYW5nZSAqLwotCi0gIC8qIEFsbCBpbnRlcm5hbCBzdGF0ZSBtb2RpZmllZCBieSBzaWduYWxfZXhjZXB0aW9uKCkgdGhhdCBtYXkgbmVlZCB0byBiZQotICAgICByb2xsZWQgYmFjayBmb3IgcGFzc2luZyBtb21lbnQtb2YtZXhjZXB0aW9uIGltYWdlIGJhY2sgdG8gZ2RiLiAqLwotICB1bnNpZ25lZF93b3JkIGV4Y190cmlnZ2VyX3JlZ2lzdGVyc1tMQVNUX0VNQkVEX1JFR05VTSArIDFdOwotICB1bnNpZ25lZF93b3JkIGV4Y19zdXNwZW5kX3JlZ2lzdGVyc1tMQVNUX0VNQkVEX1JFR05VTSArIDFdOwotICBpbnQgZXhjX3N1c3BlbmRlZDsKLQotI2RlZmluZSBTSU1fQ1BVX0VYQ0VQVElPTl9UUklHR0VSKFNELENQVSxDSUEpIG1pcHNfY3B1X2V4Y2VwdGlvbl90cmlnZ2VyKFNELENQVSxDSUEpCi0jZGVmaW5lIFNJTV9DUFVfRVhDRVBUSU9OX1NVU1BFTkQoU0QsQ1BVLEVYQykgbWlwc19jcHVfZXhjZXB0aW9uX3N1c3BlbmQoU0QsQ1BVLEVYQykKLSNkZWZpbmUgU0lNX0NQVV9FWENFUFRJT05fUkVTVU1FKFNELENQVSxFWEMpIG1pcHNfY3B1X2V4Y2VwdGlvbl9yZXN1bWUoU0QsQ1BVLEVYQykKLQotICB1bnNpZ25lZF93b3JkIGMwX2NvbmZpZ19yZWc7Ci0jZGVmaW5lIEMwX0NPTkZJRyAoKENQVSktPmMwX2NvbmZpZ19yZWcpCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHBzZXVkb255bXMgZm9yIHN0YW5kYXJkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBaRVJPICAgIChSRUdJU1RFUlNbMF0pCi0jZGVmaW5lIFYwICAgICAgKFJFR0lTVEVSU1syXSkKLSNkZWZpbmUgQTAgICAgICAoUkVHSVNURVJTWzRdKQotI2RlZmluZSBBMSAgICAgIChSRUdJU1RFUlNbNV0pCi0jZGVmaW5lIEEyICAgICAgKFJFR0lTVEVSU1s2XSkKLSNkZWZpbmUgQTMgICAgICAoUkVHSVNURVJTWzddKQotI2RlZmluZSBUOElEWCAgIDI0Ci0jZGVmaW5lIFQ4CShSRUdJU1RFUlNbVDhJRFhdKQotI2RlZmluZSBTUElEWCAgIDI5Ci0jZGVmaW5lIFNQICAgICAgKFJFR0lTVEVSU1tTUElEWF0pCi0jZGVmaW5lIFJBSURYICAgMzEKLSNkZWZpbmUgUkEgICAgICAoUkVHSVNURVJTW1JBSURYXSkKLQotICAvKiBXaGlsZSBzcGFjZSBpcyBhbGxvY2F0ZWQgaW4gdGhlIG1haW4gcmVnaXN0ZXJzIGFycnJheSBmb3Igc29tZSBvZgotICAgICB0aGUgQ09QMCByZWdpc3RlcnMsIHRoYXQgc3BhY2UgaXNuJ3Qgc3VmZmljaWVudC4gIFVua25vd24gQ09QMAotICAgICByZWdpc3RlcnMgb3ZlcmZsb3cgaW50byB0aGUgYXJyYXkgYmVsb3cgKi8KLQotI2RlZmluZSBOUl9DT1AwX0dQUgkzMgotICB1bnNpZ25lZF93b3JkIGNvcDBfZ3ByW05SX0NPUDBfR1BSXTsKLSNkZWZpbmUgQ09QMF9HUFIJKChDUFUpLT5jb3AwX2dwcikKLSNkZWZpbmUgQ09QMF9CQURWQUREUiAoKHVuc2lnbmVkMzIpKENPUDBfR1BSWzhdKSkKLQotICAvKiBLZWVwIHRoZSBjdXJyZW50IGZvcm1hdCBzdGF0ZSBmb3IgZWFjaCByZWdpc3RlcjogKi8KLSAgRlBfZm9ybWF0cyBmcHJfc3RhdGVbMzJdOwotI2RlZmluZSBGUFJfU1RBVEUgKChDUFUpLT5mcHJfc3RhdGUpCi0KLSAgcGVuZGluZ193cml0ZV9xdWV1ZSBwZW5kaW5nOwotCi0gIC8qIExMQklUID0gTG9hZC1MaW5rZWQgYml0LiBBIGJpdCBvZiAidmlydHVhbCIgc3RhdGUgdXNlZCBieSBhdG9taWMKLSAgICAgcmVhZC13cml0ZSBpbnN0cnVjdGlvbnMuIEl0IGlzIHNldCB3aGVuIGEgbGlua2VkIGxvYWQgb2NjdXJzLiBJdAotICAgICBpcyB0ZXN0ZWQgYW5kIGNsZWFyZWQgYnkgdGhlIGNvbmRpdGlvbmFsIHN0b3JlLiBJdCBpcyBjbGVhcmVkCi0gICAgIChkdXJpbmcgb3RoZXIgQ1BVIG9wZXJhdGlvbnMpIHdoZW4gYSBzdG9yZSB0byB0aGUgbG9jYXRpb24gd291bGQKLSAgICAgbm8gbG9uZ2VyIGJlIGF0b21pYy4gSW4gcGFydGljdWxhciwgaXQgaXMgY2xlYXJlZCBieSBleGNlcHRpb24KLSAgICAgcmV0dXJuIGluc3RydWN0aW9ucy4gKi8KLSAgaW50IGxsYml0OwotI2RlZmluZSBMTEJJVCAoKENQVSktPmxsYml0KQotCi0KLS8qIFRoZSBISUhJU1RPUlkgYW5kIExPSElTVE9SWSB0aW1lc3RhbXBzIGFyZSB1c2VkIHRvIGVuc3VyZSB0aGF0Ci0gICBjb3JydXB0aW9ucyBjYXVzZWQgYnkgdXNpbmcgdGhlIEhJIG9yIExPIHJlZ2lzdGVyIHRvbyBjbG9zZSB0byBhCi0gICBmb2xsb3dpbmcgb3BlcmF0aW9uIGlzIHNwb3R0ZWQuIFNlZSBtaXBzLmlnZW4gZm9yIG1vcmUgZGV0YWlscy4gKi8KLQotICBoaWxvX2hpc3RvcnkgaGlfaGlzdG9yeTsKLSNkZWZpbmUgSElISVNUT1JZICgmKENQVSktPmhpX2hpc3RvcnkpCi0gIGhpbG9faGlzdG9yeSBsb19oaXN0b3J5OwotI2RlZmluZSBMT0hJU1RPUlkgKCYoQ1BVKS0+bG9faGlzdG9yeSkKLQotI2RlZmluZSBjaGVja19icmFuY2hfYnVnKCkgCi0jZGVmaW5lIG1hcmtfYnJhbmNoX2J1ZyhUQVJHRVQpIAotCi0KLQotICBzaW1fY3B1X2Jhc2UgYmFzZTsKLX07Ci0KLQotLyogTUlQUyBzcGVjaWZpYyBzaW11bGF0b3Igd2F0Y2ggY29uZmlnICovCi0KLXZvaWQgd2F0Y2hfb3B0aW9uc19pbnN0YWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLXN0cnVjdCBzd2F0Y2ggewotICBzaW1fZXZlbnQgKnBjOwotICBzaW1fZXZlbnQgKmNsb2NrOwotICBzaW1fZXZlbnQgKmN5Y2xlczsKLX07Ci0KLQotLyogRklYTUU6IEF0IHByZXNlbnQgbXVjaCBvZiB0aGUgc2ltdWxhdG9yIGlzIHN0aWxsIHN0YXRpYyAqLwotc3RydWN0IHNpbV9zdGF0ZSB7Ci0KLSAgc3RydWN0IHN3YXRjaCB3YXRjaDsKLQotICBzaW1fY3B1IGNwdVtNQVhfTlJfUFJPQ0VTU09SU107Ci0jaWYgKFdJVEhfU01QKQotI2RlZmluZSBTVEFURV9DUFUoc2QsbikgKCYoc2QpLT5jcHVbbl0pCi0jZWxzZQotI2RlZmluZSBTVEFURV9DUFUoc2QsbikgKCYoc2QpLT5jcHVbMF0pCi0jZW5kaWYKLQotCi0gIHNpbV9zdGF0ZV9iYXNlIGJhc2U7Ci19OwotCi0KLQotLyogU3RhdHVzIGluZm9ybWF0aW9uOiAqLwotCi0vKiBUT0RPIDogdGhlc2Ugc2hvdWxkIGJlIHRoZSBiaXRtYXNrcyBmb3IgdGhlc2UgYml0cyB3aXRoaW4gdGhlCi0gICBzdGF0dXMgcmVnaXN0ZXIuIEF0IHRoZSBtb21lbnQgdGhlIGZvbGxvd2luZyBhcmUgVlI0MzAwCi0gICBiaXQtcG9zaXRpb25zOiAqLwotI2RlZmluZSBzdGF0dXNfS1NVX21hc2sgICgweDE4KSAgICAgICAgIC8qIG1hc2sgZm9yIEtTVSBiaXRzICovCi0jZGVmaW5lIHN0YXR1c19LU1Vfc2hpZnQgKDMpICAgICAgICAgICAgLyogc2hpZnQgZm9yIGZpZWxkICovCi0jZGVmaW5lIGtzdV9rZXJuZWwgICAgICAgKDB4MCkKLSNkZWZpbmUga3N1X3N1cGVydmlzb3IgICAoMHgxKQotI2RlZmluZSBrc3VfdXNlciAgICAgICAgICgweDIpCi0jZGVmaW5lIGtzdV91bmtub3duICAgICAgKDB4MykKLQotI2RlZmluZSBTUl9LU1UJCSAoKFNSICYgc3RhdHVzX0tTVV9tYXNrKSA+PiBzdGF0dXNfS1NVX3NoaWZ0KQotCi0jZGVmaW5lIHN0YXR1c19JRQkgKDEgPDwgIDApICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBzdGF0dXNfRUlFCSAoMSA8PCAxNikgICAgICAvKiBFbmFibGUgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBzdGF0dXNfRVhMCSAoMSA8PCAgMSkJLyogRXhjZXB0aW9uIGxldmVsICovCi0jZGVmaW5lIHN0YXR1c19SRSAgICAgICAgKDEgPDwgMjUpICAgICAgLyogUmV2ZXJzZSBFbmRpYW4gaW4gdXNlciBtb2RlICovCi0jZGVmaW5lIHN0YXR1c19GUiAgICAgICAgKDEgPDwgMjYpICAgICAgLyogZW5hYmxlcyBNSVBTIElJSSBhZGRpdGlvbmFsIEZQIHJlZ2lzdGVycyAqLwotI2RlZmluZSBzdGF0dXNfU1IgICAgICAgICgxIDw8IDIwKSAgICAgIC8qIHNvZnQgcmVzZXQgb3IgTk1JICovCi0jZGVmaW5lIHN0YXR1c19CRVYgICAgICAgKDEgPDwgMjIpICAgICAgLyogTG9jYXRpb24gb2YgZ2VuZXJhbCBleGNlcHRpb24gdmVjdG9ycyAqLwotI2RlZmluZSBzdGF0dXNfVFMgICAgICAgICgxIDw8IDIxKSAgICAgIC8qIFRMQiBzaHV0ZG93biBoYXMgb2NjdXJyZWQgKi8KLSNkZWZpbmUgc3RhdHVzX0VSTCAgICAgICAoMSA8PCAgMikgICAgICAvKiBFcnJvciBsZXZlbCAqLwotI2RlZmluZSBzdGF0dXNfSU03ICAgICAgICgxIDw8IDE1KSAgICAgIC8qIFRpbWVyIEludGVycnVwdCBNYXNrICovCi0jZGVmaW5lIHN0YXR1c19SUCAgICAgICAgKDEgPDwgMjcpICAgICAgLyogUmVkdWNlZCBQb3dlciBtb2RlICovCi0KLS8qIFNwZWNpYWxpemF0aW9ucyBmb3IgVFgzOSBmYW1pbHkgKi8KLSNkZWZpbmUgc3RhdHVzX0lFYyAgICAgICAoMSA8PCAwKSAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIChjdXJyZW50KSAqLwotI2RlZmluZSBzdGF0dXNfS1VjICAgICAgICgxIDw8IDEpICAgICAgIC8qIEtlcm5lbC9Vc2VyIG1vZGUgKi8KLSNkZWZpbmUgc3RhdHVzX0lFcCAgICAgICAoMSA8PCAyKSAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIChwcmV2aW91cykgKi8KLSNkZWZpbmUgc3RhdHVzX0tVcCAgICAgICAoMSA8PCAzKSAgICAgICAvKiBLZXJuZWwvVXNlciBtb2RlICovCi0jZGVmaW5lIHN0YXR1c19JRW8gICAgICAgKDEgPDwgNCkgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSAob2xkKSAqLwotI2RlZmluZSBzdGF0dXNfS1VvICAgICAgICgxIDw8IDUpICAgICAgIC8qIEtlcm5lbC9Vc2VyIG1vZGUgKi8KLSNkZWZpbmUgc3RhdHVzX0lNX21hc2sgICAoMHhmZikgICAgICAgICAvKiBJbnRlcnJ1cHQgbWFzayAqLwotI2RlZmluZSBzdGF0dXNfSU1fc2hpZnQgICg4KQotI2RlZmluZSBzdGF0dXNfTk1JICAgICAgICgxIDw8IDIwKSAgICAgIC8qIE5NSSAqLwotI2RlZmluZSBzdGF0dXNfTk1JICAgICAgICgxIDw8IDIwKSAgICAgIC8qIE5NSSAqLwotCi0jZGVmaW5lIGNhdXNlX0JEICgodW5zaWduZWQpMSA8PCAzMSkgICAgLyogTDEgRXhjZXB0aW9uIGluIGJyYW5jaCBkZWxheSBzbG90ICovCi0jZGVmaW5lIGNhdXNlX0JEMiAgICAgICAgICgxIDw8IDMwKSAgICAgLyogTDIgRXhjZXB0aW9uIGluIGJyYW5jaCBkZWxheSBzbG90ICovCi0jZGVmaW5lIGNhdXNlX0NFX21hc2sgICAgIDB4MzAwMDAwMDAJLyogQ29wcm9jZXNzb3IgZXhjZXB0aW9uICovCi0jZGVmaW5lIGNhdXNlX0NFX3NoaWZ0ICAgIDI4Ci0jZGVmaW5lIGNhdXNlX0VYQzJfbWFzayAgIDB4MDAwNzAwMDAKLSNkZWZpbmUgY2F1c2VfRVhDMl9zaGlmdCAgMTYKLSNkZWZpbmUgY2F1c2VfSVA3IAkgICgxIDw8IDE1KQkvKiBJbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBjYXVzZV9TSU9QICAgICAgICAoMSA8PCAxMikgICAgIC8qIFNJTyBwZW5kaW5nICovCi0jZGVmaW5lIGNhdXNlX0lQMyAJICAoMSA8PCAxMSkJLyogSW50IDAgcGVuZGluZyAqLwotI2RlZmluZSBjYXVzZV9JUDIgCSAgKDEgPDwgMTApCS8qIEludCAxIHBlbmRpbmcgKi8KLQotI2RlZmluZSBjYXVzZV9FWENfbWFzayAgKDB4MWMpICAgICAgICAgIC8qIEV4Y2VwdGlvbiBjb2RlICovCi0jZGVmaW5lIGNhdXNlX0VYQ19zaGlmdCAoMikKLQotI2RlZmluZSBjYXVzZV9TVzAgICAgICAgKDEgPDwgOCkgICAgICAgIC8qIFNvZnR3YXJlIGludGVycnVwdCAwICovCi0jZGVmaW5lIGNhdXNlX1NXMSAgICAgICAoMSA8PCA5KSAgICAgICAgLyogU29mdHdhcmUgaW50ZXJydXB0IDEgKi8KLSNkZWZpbmUgY2F1c2VfSVBfbWFzayAgICgweDNmKSAgICAgICAgICAvKiBJbnRlcnJ1cHQgcGVuZGluZyBmaWVsZCAqLwotI2RlZmluZSBjYXVzZV9JUF9zaGlmdCAgKDEwKQotCi0jZGVmaW5lIGNhdXNlX3NldF9FWEMoeCkgIENBVVNFID0gKENBVVNFICYgfmNhdXNlX0VYQ19tYXNrKSAgfCAoKHggPDwgY2F1c2VfRVhDX3NoaWZ0KSAgJiBjYXVzZV9FWENfbWFzaykKLSNkZWZpbmUgY2F1c2Vfc2V0X0VYQzIoeCkgQ0FVU0UgPSAoQ0FVU0UgJiB+Y2F1c2VfRVhDMl9tYXNrKSB8ICgoeCA8PCBjYXVzZV9FWEMyX3NoaWZ0KSAmIGNhdXNlX0VYQzJfbWFzaykKLQotCi0vKiBOT1RFOiBXZSBrZWVwIHRoZSBmb2xsb3dpbmcgc3RhdHVzIGZsYWdzIGFzIGJpdCB2YWx1ZXMgKDEgZm9yIHRydWUsCi0gICAwIGZvciBmYWxzZSkuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgdXNlZCBpbiBiaW5hcnkgYm9vbGVhbgotICAgb3BlcmF0aW9ucyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHdoYXQgZXhhY3RseSB0aGUgbm9uLXplcm8gdHJ1ZQotICAgdmFsdWUgaXMuICovCi0KLS8qIFVzZXJNb2RlICovCi0jaWZkZWYgU1VCVEFSR0VUX1IzOTAwCi0jZGVmaW5lIFVzZXJNb2RlICAgICAgICAoKFNSICYgc3RhdHVzX0tVYykgPyAxIDogMCkKLSNlbHNlCi0jZGVmaW5lIFVzZXJNb2RlCSgoKChTUiAmIHN0YXR1c19LU1VfbWFzaykgPj4gc3RhdHVzX0tTVV9zaGlmdCkgPT0ga3N1X3VzZXIpID8gMSA6IDApCi0jZW5kaWYgLyogU1VCVEFSR0VUX1IzOTAwICovCi0KLS8qIEJpZ0VuZGlhbk1lbSAqLwotLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbi4gQWZmZWN0cyBlbmRpYW5uZXNzIG9mIExvYWRNZW1vcnkgYW5kCi0gICBTdG9yZU1lbW9yeSBhbmQgdGhlIGVuZGlhbm5lc3Mgb2YgS2VybmVsIGFuZCBTdXBlcnZpc29yIG1vZGUKLSAgIGV4ZWN1dGlvbi4gVGhlIHZhbHVlIGlzIDAgZm9yIGxpdHRsZS1lbmRpYW47IDEgZm9yIGJpZy1lbmRpYW4uICovCi0jZGVmaW5lIEJpZ0VuZGlhbk1lbSAgICAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQotLyooc3RhdGUgJiBzaW1CRSkgPyAxIDogMCkqLwotCi0vKiBSZXZlcnNlRW5kaWFuICovCi0vKiBUaGlzIG1vZGUgaXMgc2VsZWN0ZWQgaWYgaW4gVXNlciBtb2RlIHdpdGggdGhlIFJFIGJpdCBiZWluZyBzZXQgaW4KLSAgIFNSIChTdGF0dXMgUmVnaXN0ZXIpLiBJdCByZXZlcnNlcyB0aGUgZW5kaWFubmVzcyBvZiBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zLiAqLwotI2RlZmluZSBSZXZlcnNlRW5kaWFuICAgKCgoU1IgJiBzdGF0dXNfUkUpICYmIFVzZXJNb2RlKSA/IDEgOiAwKQotCi0vKiBCaWdFbmRpYW5DUFUgKi8KLS8qIFRoZSBlbmRpYW5uZXNzIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgKDA9bGl0dGxlOzE9YmlnKS4gSW4KLSAgIFVzZXIgbW9kZSB0aGlzIGVuZGlhbm5lc3MgbWF5IGJlIHN3aXRjaGVkIGJ5IHNldHRpbmcgdGhlIHN0YXRlX1JFCi0gICBiaXQgaW4gdGhlIFNSIHJlZ2lzdGVyLiBUaHVzLCBCaWdFbmRpYW5DUFUgbWF5IGJlIGNvbXB1dGVkIGFzCi0gICAoQmlnRW5kaWFuTWVtIEVPUiBSZXZlcnNlRW5kaWFuKS4gKi8KLSNkZWZpbmUgQmlnRW5kaWFuQ1BVICAgIChCaWdFbmRpYW5NZW0gXiBSZXZlcnNlRW5kaWFuKSAvKiBBbHJlYWR5IGJpdHMgKi8KLQotCi0KLS8qIEV4Y2VwdGlvbnM6ICovCi0KLS8qIE5PVEU6IFRoZXNlIG51bWJlcnMgZGVwZW5kIG9uIHRoZSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIGJlaW5nCi0gICBzaW11bGF0ZWQ6ICovCi1lbnVtIEV4Y2VwdGlvbkNhdXNlIHsKLSAgSW50ZXJydXB0ICAgICAgICAgICAgICAgPSAwLAotICBUTEJNb2RpZmljYXRpb24gICAgICAgICA9IDEsCi0gIFRMQkxvYWQgICAgICAgICAgICAgICAgID0gMiwKLSAgVExCU3RvcmUgICAgICAgICAgICAgICAgPSAzLAotICBBZGRyZXNzTG9hZCAgICAgICAgICAgICA9IDQsCi0gIEFkZHJlc3NTdG9yZSAgICAgICAgICAgID0gNSwKLSAgSW5zdHJ1Y3Rpb25GZXRjaCAgICAgICAgPSA2LAotICBEYXRhUmVmZXJlbmNlICAgICAgICAgICA9IDcsCi0gIFN5c3RlbUNhbGwgICAgICAgICAgICAgID0gOCwKLSAgQnJlYWtQb2ludCAgICAgICAgICAgICAgPSA5LAotICBSZXNlcnZlZEluc3RydWN0aW9uICAgICA9IDEwLAotICBDb1Byb2Nlc3NvclVudXNhYmxlICAgICA9IDExLAotICBJbnRlZ2VyT3ZlcmZsb3cgICAgICAgICA9IDEyLCAgICAvKiBBcml0aG1ldGljIG92ZXJmbG93IChJRFQgbW9uaXRvciByYWlzZXMgU0lHRlBFKSAqLwotICBUcmFwICAgICAgICAgICAgICAgICAgICA9IDEzLAotICBGUEUgICAgICAgICAgICAgICAgICAgICA9IDE1LAotICBEZWJ1Z0JyZWFrUG9pbnQgICAgICAgICA9IDE2LAotICBXYXRjaCAgICAgICAgICAgICAgICAgICA9IDIzLAotICBOTUlSZXNldCAgICAgICAgICAgICAgICA9IDMxLAotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGNvZGUgaXMgYWN0dWFsbHkgcHJpdmF0ZSB0byB0aGUgc2ltdWxhdG9yCi0gICB3b3JsZC4gSXQgaXMgKk5PVCogYSBwcm9jZXNzb3IgZmVhdHVyZSwgYW5kIGlzIHVzZWQgdG8gc2lnbmFsCi0gICBydW4tdGltZSBlcnJvcnMgaW4gdGhlIHNpbXVsYXRvci4gKi8KLSAgU2ltdWxhdG9yRmF1bHQgICAgICAJICA9IDB4RkZGRkZGRkYKLX07Ci0KLSNkZWZpbmUgVExCX1JFRklMTCAgKDApCi0jZGVmaW5lIFRMQl9JTlZBTElEICgxKQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgYnJlYWsgaW5zdHJ1Y3Rpb25zIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZQotICAgc2ltdWxhdG9yLiAgVGhlIGZpcnN0IGlzIHVzZWQgdG8gaGFsdCB0aGUgc2ltdWxhdGlvbi4gIFRoZSBzZWNvbmQKLSAgIGlzIHVzZWQgYnkgZ2RiIGZvciBicmVhay1wb2ludHMuICBOT1RFOiBDYXJlIG11c3QgYmUgdGFrZW4sIHNpbmNlIAotICAgdGhpcyB2YWx1ZSBtYXkgYmUgdXNlZCBpbiBsYXRlciByZXZpc2lvbnMgb2YgdGhlIE1JUFMgSVNBLiAqLwotI2RlZmluZSBIQUxUX0lOU1RSVUNUSU9OX01BU0sgICAoMHgwM0ZGRkZDMCkKLQotI2RlZmluZSBIQUxUX0lOU1RSVUNUSU9OICAgICAgICAoMHgwM2ZmMDAwZCkKLSNkZWZpbmUgSEFMVF9JTlNUUlVDVElPTjIgICAgICAgKDB4MDAwMGZmY2QpCi0KLQotI2RlZmluZSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OICAoMHgwMDA1MDAwZCkKLSNkZWZpbmUgQlJFQUtQT0lOVF9JTlNUUlVDVElPTjIgKDB4MDAwMDAxNGQpCi0KLQotCi12b2lkIGludGVycnVwdF9ldmVudCAoU0lNX0RFU0Mgc2QsIHZvaWQgKmRhdGEpOwotCi12b2lkIHNpZ25hbF9leGNlcHRpb24gKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBleGNlcHRpb24sIC4uLik7Ci0jZGVmaW5lIFNpZ25hbEV4Y2VwdGlvbihleGMsaW5zdHJ1Y3Rpb24pICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIChleGMpLCAoaW5zdHJ1Y3Rpb24pKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25JbnRlcnJ1cHQobGV2ZWwpICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBJbnRlcnJ1cHQsIGxldmVsKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25JbnN0cnVjdGlvbkZldGNoKCkgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBJbnN0cnVjdGlvbkZldGNoKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25BZGRyZXNzU3RvcmUoKSAgICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBBZGRyZXNzU3RvcmUpCi0jZGVmaW5lIFNpZ25hbEV4Y2VwdGlvbkFkZHJlc3NMb2FkKCkgICAgICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIEFkZHJlc3NMb2FkKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25EYXRhUmVmZXJlbmNlKCkgICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBEYXRhUmVmZXJlbmNlKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25TaW11bGF0b3JGYXVsdChidWYpICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBTaW11bGF0b3JGYXVsdCwgYnVmKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25GUEUoKSAgICAgICAgICAgICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBGUEUpCi0jZGVmaW5lIFNpZ25hbEV4Y2VwdGlvbkludGVnZXJPdmVyZmxvdygpICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIEludGVnZXJPdmVyZmxvdykKLSNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uQ29Qcm9jZXNzb3JVbnVzYWJsZSgpIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgQ29Qcm9jZXNzb3JVbnVzYWJsZSkKLSNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uTk1JUmVzZXQoKSAgICAgICAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgTk1JUmVzZXQpCi0jZGVmaW5lIFNpZ25hbEV4Y2VwdGlvblRMQlJlZmlsbFN0b3JlKCkgICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIFRMQlN0b3JlLCBUTEJfUkVGSUxMKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25UTEJSZWZpbGxMb2FkKCkgICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBUTEJMb2FkLCBUTEJfUkVGSUxMKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25UTEJJbnZhbGlkU3RvcmUoKSAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBUTEJTdG9yZSwgVExCX0lOVkFMSUQpCi0jZGVmaW5lIFNpZ25hbEV4Y2VwdGlvblRMQkludmFsaWRMb2FkKCkgICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIFRMQkxvYWQsIFRMQl9JTlZBTElEKQotI2RlZmluZSBTaWduYWxFeGNlcHRpb25UTEJNb2RpZmljYXRpb24oKSAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBUTEJNb2RpZmljYXRpb24pCi0KLS8qIENvLXByb2Nlc3NvciBhY2Nlc3NlcyAqLwotCi12b2lkIGNvcF9sdyAgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IGNvcHJvY19udW0sIGludCBjb3Byb2NfcmVnLCB1bnNpZ25lZCBpbnQgbWVtd29yZCkpOwotdm9pZCBjb3BfbGQgIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBjb3Byb2NfbnVtLCBpbnQgY29wcm9jX3JlZywgdXdvcmQ2NCBtZW13b3JkKSk7Ci11bnNpZ25lZCBpbnQgY29wX3N3IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBjb3Byb2NfbnVtLCBpbnQgY29wcm9jX3JlZykpOwotdXdvcmQ2NCBjb3Bfc2QgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IGNvcHJvY19udW0sIGludCBjb3Byb2NfcmVnKSk7Ci0KLSNkZWZpbmUgQ09QX0xXKGNvcHJvY19udW0sY29wcm9jX3JlZyxtZW13b3JkKSBcCi1jb3BfbHcgKFNELCBDUFUsIGNpYSwgY29wcm9jX251bSwgY29wcm9jX3JlZywgbWVtd29yZCkKLSNkZWZpbmUgQ09QX0xEKGNvcHJvY19udW0sY29wcm9jX3JlZyxtZW13b3JkKSBcCi1jb3BfbGQgKFNELCBDUFUsIGNpYSwgY29wcm9jX251bSwgY29wcm9jX3JlZywgbWVtd29yZCkKLSNkZWZpbmUgQ09QX1NXKGNvcHJvY19udW0sY29wcm9jX3JlZykgXAotY29wX3N3IChTRCwgQ1BVLCBjaWEsIGNvcHJvY19udW0sIGNvcHJvY19yZWcpCi0jZGVmaW5lIENPUF9TRChjb3Byb2NfbnVtLGNvcHJvY19yZWcpIFwKLWNvcF9zZCAoU0QsIENQVSwgY2lhLCBjb3Byb2NfbnVtLCBjb3Byb2NfcmVnKQotCi0KLXZvaWQgZGVjb2RlX2NvcHJvYyBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb24pKTsKLSNkZWZpbmUgRGVjb2RlQ29wcm9jKGluc3RydWN0aW9uKSBcCi1kZWNvZGVfY29wcm9jIChTRCwgQ1BVLCBjaWEsIChpbnN0cnVjdGlvbikpCi0KLXZvaWQgc2ltX21vbml0b3IgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIHVuc2lnbmVkIGludCBhcmcpOwotICAKLQotCi0vKiBNZW1vcnkgYWNjZXNzZXMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgZ2VuZXJpYyB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlCi0gICB0byBkYXRlOiAqLwotCi0vKiBNZW1vcnkgQWNjZXNzIFR5cGVzIChmb3IgQ0NBKTogKi8KLSNkZWZpbmUgVW5jYWNoZWQgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIENhY2hlZE5vbmNvaGVyZW50ICAgICAgICgxKQotI2RlZmluZSBDYWNoZWRDb2hlcmVudCAgICAgICAgICAoMikKLSNkZWZpbmUgQ2FjaGVkICAgICAgICAgICAgICAgICAgKDMpCi0KLSNkZWZpbmUgaXNJTlNUUlVDVElPTiAgICgxID09IDApIC8qIEZBTFNFICovCi0jZGVmaW5lIGlzREFUQSAgICAgICAgICAoMSA9PSAxKSAvKiBUUlVFICovCi0jZGVmaW5lIGlzTE9BRCAgICAgICAgICAoMSA9PSAwKSAvKiBGQUxTRSAqLwotI2RlZmluZSBpc1NUT1JFICAgICAgICAgKDEgPT0gMSkgLyogVFJVRSAqLwotI2RlZmluZSBpc1JFQUwgICAgICAgICAgKDEgPT0gMCkgLyogRkFMU0UgKi8KLSNkZWZpbmUgaXNSQVcgICAgICAgICAgICgxID09IDEpIC8qIFRSVUUgKi8KLS8qIFRoZSBwYXJhbWV0ZXIgSE9TVCAoaXNUQVJHRVQgLyBpc0hPU1QpIGlzIGlnbm9yZWQgKi8KLSNkZWZpbmUgaXNUQVJHRVQgICAgICAgICgxID09IDApIC8qIEZBTFNFICovCi0vKiAjZGVmaW5lIGlzSE9TVCAgICAgICAgICAoMSA9PSAxKSBUUlVFICovCi0KLS8qIFRoZSAiQWNjZXNzTGVuZ3RoIiBzcGVjaWZpY2F0aW9ucyBmb3IgTG9hZHMgYW5kIFN0b3Jlcy4gTk9URTogVGhpcwotICAgaXMgdGhlIG51bWJlciBvZiBieXRlcyBtaW51cyAxLiAqLwotI2RlZmluZSBBY2Nlc3NMZW5ndGhfQllURSAgICAgICAoMCkKLSNkZWZpbmUgQWNjZXNzTGVuZ3RoX0hBTEZXT1JEICAgKDEpCi0jZGVmaW5lIEFjY2Vzc0xlbmd0aF9UUklQTEVCWVRFICgyKQotI2RlZmluZSBBY2Nlc3NMZW5ndGhfV09SRCAgICAgICAoMykKLSNkZWZpbmUgQWNjZXNzTGVuZ3RoX1FVSU5USUJZVEUgKDQpCi0jZGVmaW5lIEFjY2Vzc0xlbmd0aF9TRVhUSUJZVEUgICg1KQotI2RlZmluZSBBY2Nlc3NMZW5ndGhfU0VQVElCWVRFICAoNikKLSNkZWZpbmUgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQgKDcpCi0jZGVmaW5lIEFjY2Vzc0xlbmd0aF9RVUFEV09SRCAgICgxNSkKLQotI2RlZmluZSBMT0FERFJNQVNLIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgXAotCQkgICAgPyBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCAvKjcqLyBcCi0JCSAgICA6IEFjY2Vzc0xlbmd0aF9XT1JEIC8qMyovKQotI2RlZmluZSBQU0laRSAoV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFKQotCi0KLUlOTElORV9TSU1fTUFJTiAoaW50KSBhZGRyZXNzX3RyYW5zbGF0aW9uIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICosIGFkZHJlc3Nfd29yZCBjaWEsIGFkZHJlc3Nfd29yZCB2QWRkciwgaW50IElvckQsIGludCBMb3JTLCBhZGRyZXNzX3dvcmQgKnBBZGRyLCBpbnQgKkNDQSwgaW50IHJhdykpOwotI2RlZmluZSBBZGRyZXNzVHJhbnNsYXRpb24odkFkZHIsSW9yRCxMb3JTLHBBZGRyLENDQSxob3N0LHJhdykgXAotYWRkcmVzc190cmFuc2xhdGlvbiAoU0QsIENQVSwgY2lhLCB2QWRkciwgSW9yRCwgTG9yUywgcEFkZHIsIENDQSwgcmF3KQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpIGxvYWRfbWVtb3J5IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIHV3b3JkNjQqIG1lbXZhbHAsIHV3b3JkNjQqIG1lbXZhbDFwLCBpbnQgQ0NBLCB1bnNpZ25lZCBpbnQgQWNjZXNzTGVuZ3RoLCBhZGRyZXNzX3dvcmQgcEFkZHIsIGFkZHJlc3Nfd29yZCB2QWRkciwgaW50IElvckQpKTsKLSNkZWZpbmUgTG9hZE1lbW9yeShtZW12YWxwLG1lbXZhbDFwLENDQSxBY2Nlc3NMZW5ndGgscEFkZHIsdkFkZHIsSW9yRCxyYXcpIFwKLWxvYWRfbWVtb3J5IChTRCwgQ1BVLCBjaWEsIG1lbXZhbHAsIG1lbXZhbDFwLCBDQ0EsIEFjY2Vzc0xlbmd0aCwgcEFkZHIsIHZBZGRyLCBJb3JEKQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpIHN0b3JlX21lbW9yeSBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgQ0NBLCB1bnNpZ25lZCBpbnQgQWNjZXNzTGVuZ3RoLCB1d29yZDY0IE1lbUVsZW0sIHV3b3JkNjQgTWVtRWxlbTEsIGFkZHJlc3Nfd29yZCBwQWRkciwgYWRkcmVzc193b3JkIHZBZGRyKSk7Ci0jZGVmaW5lIFN0b3JlTWVtb3J5KENDQSxBY2Nlc3NMZW5ndGgsTWVtRWxlbSxNZW1FbGVtMSxwQWRkcix2QWRkcixyYXcpIFwKLXN0b3JlX21lbW9yeSAoU0QsIENQVSwgY2lhLCBDQ0EsIEFjY2Vzc0xlbmd0aCwgTWVtRWxlbSwgTWVtRWxlbTEsIHBBZGRyLCB2QWRkcikKLQotSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBjYWNoZV9vcCBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgb3AsIGFkZHJlc3Nfd29yZCBwQWRkciwgYWRkcmVzc193b3JkIHZBZGRyLCB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb24pKTsKLSNkZWZpbmUgQ2FjaGVPcChvcCxwQWRkcix2QWRkcixpbnN0cnVjdGlvbikgXAotY2FjaGVfb3AgKFNELCBDUFUsIGNpYSwgb3AsIHBBZGRyLCB2QWRkciwgaW5zdHJ1Y3Rpb24pCi0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkgc3luY19vcGVyYXRpb24gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IHN0eXBlKSk7Ci0jZGVmaW5lIFN5bmNPcGVyYXRpb24oc3R5cGUpIFwKLXN5bmNfb3BlcmF0aW9uIChTRCwgQ1BVLCBjaWEsIChzdHlwZSkpCi0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkgcHJlZmV0Y2ggUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IENDQSwgYWRkcmVzc193b3JkIHBBZGRyLCBhZGRyZXNzX3dvcmQgdkFkZHIsIGludCBEQVRBLCBpbnQgaGludCkpOwotI2RlZmluZSBQcmVmZXRjaChDQ0EscEFkZHIsdkFkZHIsREFUQSxoaW50KSBcCi1wcmVmZXRjaCAoU0QsIENQVSwgY2lhLCBDQ0EsIHBBZGRyLCB2QWRkciwgREFUQSwgaGludCkKLQotSU5MSU5FX1NJTV9NQUlOICh1bnNpZ25lZDMyKSBpZmV0Y2gzMiBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBhZGRyZXNzX3dvcmQgdmFkZHIpKTsKLSNkZWZpbmUgSU1FTTMyKENJQSkgaWZldGNoMzIgKFNELCBDUFUsIChDSUEpLCAoQ0lBKSkKLUlOTElORV9TSU1fTUFJTiAodW5zaWduZWQxNikgaWZldGNoMTYgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgYWRkcmVzc193b3JkIHZhZGRyKSk7Ci0jZGVmaW5lIElNRU0xNihDSUEpIGlmZXRjaDE2IChTRCwgQ1BVLCAoQ0lBKSwgKChDSUEpICYgfjEpKQotI2RlZmluZSBJTUVNMTZfSU1NRUQoQ0lBLE5SKSBpZmV0Y2gxNiAoU0QsIENQVSwgKENJQSksICgoQ0lBKSAmIH4xKSArIDIgKiAoTlIpKQotCi12b2lkIGRvdHJhY2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgRklMRSAqdHJhY2VmaCwgaW50IHR5cGUsIFNJTV9BRERSIGFkZHJlc3MsIGludCB3aWR0aCwgY2hhciAqY29tbWVudCwgLi4uKSk7Ci1leHRlcm4gRklMRSAqdHJhY2VmaDsKLQotSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBwZW5kaW5nX3RpY2sgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSkpOwotZXh0ZXJuIFNJTV9DT1JFX1NJR05BTF9GTiBtaXBzX2NvcmVfc2lnbmFsOwotCi1jaGFyKiBwcl9hZGRyIFBBUkFNUyAoKFNJTV9BRERSIGFkZHIpKTsKLWNoYXIqIHByX3V3b3JkNjQgUEFSQU1TICgodXdvcmQ2NCBhZGRyKSk7Ci0KLQotLyogU29tZSBtaXBzIGZsYXZvdXJzIHNwbGl0IHRoZWlyIEdQUiBiYW5rcyBpbnRvIHR3byBoYWx2ZXMuICovCi0jaWZkZWYgU1BMSVRfR1BSCi0jZGVmaW5lIEdQUl9DTEVBUihOKSBkbyB7IEdQUl9TRVQoKE4pLDApOyBHUFIxX1NFVCgoTiksMCk7IH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBHUFJfQ0xFQVIoTikgZG8geyBHUFJfU0VUKChOKSwwKTsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi12b2lkIG1pcHNfY3B1X2V4Y2VwdGlvbl90cmlnZ2VyKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGFkZHJlc3Nfd29yZCBwYyk7Ci12b2lkIG1pcHNfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pOwotdm9pZCBtaXBzX2NwdV9leGNlcHRpb25fcmVzdW1lKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pOwotCi0KLSNpZiBIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9NQUlOX0lOTElORSkKLSNpbmNsdWRlICJzaW0tbWFpbi5jIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvdGNvbmZpZy5pbiBiL3NpbS9taXBzL3Rjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTE0NzQuLjAwMDAwMDAKLS0tIGEvc2ltL21pcHMvdGNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIG1pcHMgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4gICovCi0KLS8qIFNlZSBzaW0taGxvYWQuYy4gIFdlIHByb3Blcmx5IGhhbmRsZSBMTUEuICAqLwotI2lmZGVmIFRBUkdFVF9UWDM5MDQKLSNkZWZpbmUgU0lNX0hBTkRMRVNfTE1BIDEKLQotLyogRklYTUU6IFRoaXMgaXMgdW5uZWNlc3NhcmlseSBuZWNlc3Nhcnk6ICovCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLSNpbmNsdWRlICJzaW0tbW9kdWxlLmgiCi0KLU1PRFVMRV9JTlNUQUxMX0ZOIGR2X3NvY2tzZXJfaW5zdGFsbDsKLSNkZWZpbmUgTU9EVUxFX0xJU1QgZHZfc29ja3Nlcl9pbnN0YWxsLAotI2Vsc2UKLSNkZWZpbmUgU0lNX0hBTkRMRVNfTE1BIDAKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KLSAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgotICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KLSNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRQotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLwotLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgdGFyZ2V0IGNwdSBpcyBiaS1lbmRpYW4KLSAgIGFuZCB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIGl0LiAgKi8KLSNkZWZpbmUgU0lNX0hBVkVfQklFTkRJQU4KZGlmZiAtLWdpdCBhL3NpbS9taXBzL3R4LmlnZW4gYi9zaW0vbWlwcy90eC5pZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDhkNzZhLi4wMDAwMDAwCi0tLSBhL3NpbS9taXBzL3R4LmlnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyAtKi0gQyAtKi0KLS8vCi0vLyB0b3NoaWJhIHNwZWNpZmljIGluc3RydWN0aW9ucy4KLS8vCi0KLTAxMTEwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMDAwMDpNTUlOT1JNOjo6TUFERAotIm1hZGQgcjxSUz4sIHI8UlQ+IjpSRCA9PSAwCi0ibWFkZCByPFJEPiwgcjxSUz4sIHI8UlQ+IgotKnIzOTAwCi17Ci0gIHNpZ25lZDY0IHByb2QgPSAoVThfNCAoVkw0XzggKEhJKSwgVkw0XzggKExPKSkKLQkJICAgKyAoKHNpZ25lZDY0KSBFWFRFTkQzMiAoR1BSW1JUXSkKLQkJICAgICAgKiAoc2lnbmVkNjQpIEVYVEVORDMyIChHUFJbUlNdKSkpOwotICBjaGVja19tdWx0X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOwotICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBHUFJbUlRdKTsKLSAgTE8gPSBFWFRFTkQzMiAocHJvZCk7Ci0gIEhJID0gRVhURU5EMzIgKFZINF84IChwcm9kKSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOwotICBpZihSRCAhPSAwICkKLSAgICBHUFJbUkRdID0gTE87Ci19Ci0KLQotMDExMTAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDAwMDAxOk1NSU5PUk06OjpNQUREVQotIm1hZGR1IHI8UlM+LCByPFJUPiI6UkQgPT0gMAotIm1hZGR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCi0qcjM5MDAKLXsKLSAgdW5zaWduZWQ2NCBwcm9kID0gKFU4XzQgKFZMNF84IChISSksIFZMNF84IChMTykpCi0JCSAgICAgKyAoKHVuc2lnbmVkNjQpIFZMNF84IChHUFJbUlNdKQotCQkJKiAodW5zaWduZWQ2NCkgVkw0XzggKEdQUltSVF0pKSk7Ci0gIGNoZWNrX211bHRfaGlsbyAoU0RfLCBISUhJU1RPUlksIExPSElTVE9SWSk7Ci0gIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltSU10sIEdQUltSVF0pOwotICBMTyA9IEVYVEVORDMyIChwcm9kKTsKLSAgSEkgPSBFWFRFTkQzMiAoVkg0XzggKHByb2QpKTsKLSAgVFJBQ0VfQUxVX1JFU1VMVDIgKEhJLCBMTyk7Ci0gIGlmKFJEICE9IDApCi0gICAgR1BSW1JEXSA9IExPOwotfQotCi0wMDAwMDAsQ09ERS4yMCwwMDExMTA6OkNPMTo6OlNEQkJQCi0ic2RiYnAiCi0qcjM5MDA6Ci17Ci0gIFNpZ25hbEV4Y2VwdGlvbiAoRGVidWdCcmVha1BvaW50LCBpbnN0cnVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9zaW0vbWlwcy92ci5pZ2VuIGIvc2ltL21pcHMvdnIuaWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzYmI1NS4uMDAwMDAwMAotLS0gYS9zaW0vbWlwcy92ci5pZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gLSotIEMgLSotCi0vLwotLy8gTkVDIHNwZWNpZmljIGluc3RydWN0aW9ucwotLy8KLQotLy8gSW50ZWdlciBJbnN0cnVjdGlvbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTXVsQWNjIGlzIHRoZSBNdWx0aXBseSBBY2N1bXVsYXRvci4KLS8vICAgICBUaGlzIHJlZ2lzdGVyIGlzIG1hcHBlZCBvbiB0aGUgdGhlIEhJIGFuZCBMTyByZWdpc3RlcnMuCi0vLyAgICAgVXBwZXIgMzIgYml0cyBvZiBNdWxBY2MgaXMgbWFwcGVkIG9uIHRvIGxvd2VyIDMyIGJpdHMgb2YgSEkgcmVnaXN0ZXIuCi0vLyAgICAgTG93ZXIgMzIgYml0cyBvZiBNdWxBY2MgaXMgbWFwcGVkIG9uIHRvIGxvd2VyIDMyIGJpdHMgb2YgTE8gcmVnaXN0ZXIuCi0KLQotOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpNdWxBY2M6Ci0qdnI0MTAwOgotewotICB1bnNpZ25lZDY0IHJlc3VsdCA9IFU4XzQgKEhJLCBMTyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLTpmdW5jdGlvbjo6OnZvaWQ6U0VUX011bEFjYzp1bnNpZ25lZDY0IHZhbHVlCi0qdnI0MTAwOgotewotICAvKiA2NCBiaXQgc3BlY2lmaWMgKi8KLSAgKkFMNF84ICgmSEkpID0gVkg0XzggKHZhbHVlKTsKLSAgKkFMNF84ICgmTE8pID0gVkw0XzggKHZhbHVlKTsKLX0KLQotOmZ1bmN0aW9uOjo6c2lnbmVkNjQ6U2lnbmVkTXVsdGlwbHk6c2lnbmVkMzIgbCwgc2lnbmVkMzIgcgotKnZyNDEwMDoKLXsKLSAgc2lnbmVkNjQgcmVzdWx0ID0gKHNpZ25lZDY0KSBsICogKHNpZ25lZDY0KSByOwotICByZXR1cm4gcmVzdWx0OwotfQotCi06ZnVuY3Rpb246Ojp1bnNpZ25lZDY0OlVuc2lnbmVkTXVsdGlwbHk6dW5zaWduZWQzMiBsLCB1bnNpZ25lZDMyIHIKLSp2cjQxMDA6Ci17Ci0gIHVuc2lnbmVkNjQgcmVzdWx0ID0gKHVuc2lnbmVkNjQpIGwgKiAodW5zaWduZWQ2NCkgcjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpMb3czMkJpdHM6dW5zaWduZWQ2NCB2YWx1ZQotKnZyNDEwMDoKLXsKLSAgdW5zaWduZWQ2NCByZXN1bHQgPSAoc2lnbmVkNjQpIChzaWduZWQzMikgVkw0XzggKHZhbHVlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpIaWdoMzJCaXRzOnVuc2lnbmVkNjQgdmFsdWUKLSp2cjQxMDA6Ci17Ci0gIHVuc2lnbmVkNjQgcmVzdWx0ID0gKHNpZ25lZDY0KSAoc2lnbmVkMzIpIFZINF84ICh2YWx1ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotCi0vLyBNdWx0aXBseSwgQWNjdW11bGF0ZQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMCwwMDAwMCwxMDEwMDA6OjY0OjpNQUMKLSJtYWMgcjxSUz4sIHI8UlQ+IgotKnZyNDEwMDoKLXsKLSAgU0VUX011bEFjYyAoU0RfLCBNdWxBY2MgKFNEXykgKyBTaWduZWRNdWx0aXBseSAoU0RfLCBHUFJbUlNdLCBHUFJbUlRdKSk7Ci19Ci0KLQotLy8gRC1NdWx0aXBseSwgQWNjdW11bGF0ZQotMDAwMDAwLDUuUlMsNS5SVCwwMDAwMCwwMDAwMCwxMDEwMDE6OjY0OjpETUFDCi0iZG1hYyByPFJTPiwgcjxSVD4iCi0qdnI0MTAwOgotewotICBMTyA9IExPICsgU2lnbmVkTXVsdGlwbHkgKFNEXywgR1BSW1JTXSwgR1BSW1JUXSk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9DaGFuZ2VMb2cgYi9zaW0vbW4xMDIwMC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMWVhYjQuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDIgMTg6MTU6NTMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTE5OTktMDUtMDggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCQotMTk5OS0wNC0wNiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9wKTogU2V0IHRoZSBzaW0ncyBleGNlcHRpb24KLQl0byBTSUdJTlQuCi0KLTE5OTktMDQtMDIgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChVSV9MT09QX1BPTExfSU5URVJWQUwpOiBEZWZpbmUuIFVzZWQgdG8gdHdlYWsgdGhlCi0JZnJlcXVlbmN5IGF0IHdoaWNoIHVpX2xvb3BfaG9vayBpcyBjYWxsZWQuCi0JKHVpX2xvb3BfaG9va19jb3VudGVyKTogTmV3IGdsb2JhbCBkZWZpbmVkIHdoZW4gTkVFRF9VSV9MT09QX0hPT0sKLQlpcyBkZWZpbmVkLgotCShzaW1fcmVzdW1lKTogQ2FsbCB1aV9sb29wX2hvb2sgKGlmIGRlZmluZWQpIHdoZW4gdGhlIGludGVydmFsCi0JcGFzc2VzLgotCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9DRkxBR1MpOiBJbmNsdWRlIE5FRURfVUlfTE9PUF9IT09LLgotCi1XZWQgSnVuIDE3IDExOjM3OjU5IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlZmluZSBOTF9UQVJHRVQgc28gdGhhdCB0YXJnLXZhbHMuaCB3aWxsIGJlIHVzZWQKLQlpbnN0ZWFkIG9mIHN5c2NhbGwuaC4KLQkqIHNpbW9wcy5jOiBVc2UgdGFyZy12YWxzLmggaW5zdGVhZCBvZiBzeXNjYWxsLmguCi0KLVR1ZSBBcHIgMjggMTg6MzM6MzEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU3VuIEFwciAyNiAxNTozMTo1NSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotU3VuIEFwciAyNiAxNToxOTo1OCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSZXZlcnRlZCBjaGFuZ2Ugb2YgQXByIDI0OyB1c2Ugc2luY2x1ZGUgYWdhaW4uCi0KLUZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLUZyaSBBcHIgMjQgMTE6MTk6MTMgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNhbGwgc2luY2x1ZGUuCi0KLVRodSBBcHIgMjMgMDk6NDg6MTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEZlYiAxNyAxMjo0NjoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEphbiAxMyAwMDowMTo0MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBTdG9yZXMgdG8gYWJzMTYgbWVtb3J5IGFkZHJlc3NlcyB6ZXJvIGV4dGVuZCB0aGUKLQlhYnMxNiBhZGRyZXNzLgotCi1Nb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2xvYWQpOiBQYXNzIGxtYV9wIGFuZCBzaW1fd3JpdGUgYXJncyB0bwotIAlzaW1fbG9hZF9maWxlLgotCi1GcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgU2VwICA0IDE3OjIxOjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgU2VwICAyIDE4OjQxOjIzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHNpbW9wcy5jOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBuZXh0Ci0JaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVR1ZSBBdWcgMjYgMTA6NDA6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTY6MTQ6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotVHVlIEp1biAyNCAxMzo0NDowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogQ2xlYXIgU3RhdGUuZXhpdGVkLgotCShzaW1fc3RvcF9yZWFzb24pOiBJZiBTdGF0ZS5leGl0ZWQgaXMgbm9uemVybywgdGhlbiBpbmRpY2F0ZSB0aGF0Ci0JdGhlIHNpbXVsYXRvciBleGl0ZWQgaW5zdGVhZCBvZiBzdG9wcGVkLgotCSogbW4xMDIwMF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IEFkZCBleGl0ZWQgZmllbGQuCi0JKiBzaW1vcHMuYyAoc3lzY2FsbCk6IFNldCBTdGF0ZS5leGl0ZWQgZm9yIFNZU19leGl0LgotCi1UdWUgTWF5IDIwIDE3OjQ1OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmM6IFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gbG9hZF9tZW0gYW5kIHN0b3JlX21lbQotCXdpdGggcmVmZXJlbmNlcyB0byBsb2FkX2J5dGUsIGxvYWRfaGFsZiwgbG9hZF8zX2J5dGUsIGxvYWRfd29yZAotCWFuZCBzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQuCi0JKElOTElORSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShsb2FkX21lbV9iaWcpOiBMaWtld2lzZS4KLQkobWF4X21lbSk6IE1ha2UgaXQgZ2xvYmFsLgotCShkaXNwYXRjaCk6IE1ha2UgdGhpcyBmdW5jdGlvbiBpbmxpbmUuCi0JKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZnVuY3Rpb25zLgotCSogbW4xMDIwMF9zaW0uaCAoSU5MSU5FKTogRGVmaW5lLgotCShSTFcpOiBEZWxldGUgdW51c2VkIGRlZmluaXRpb24uCi0JKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZGVjbGFyYXRpb25zLgotCShsb2FkX21lbV9iaWcpOiBOZXcgZGVmaW5pdGlvbi4KLQkobG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgotCShzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgotCSogc2ltb3BzLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGxvYWRfbWVtIGFuZCBzdG9yZV9tZW0KLQl3aXRoIHJlZmVyZW5jZXMgdG8gbG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQKLQlhbmQgc3RvcmVfYnl0ZSwgc3RvcmVfaGFsZiwgc3RvcmVfM19ieXRlLCBzdG9yZV93b3JkLgotCi1UdWUgTWF5IDIwIDEwOjIxOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KLQotU3VuIE1heSAxOCAxNjo1OTowOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChjb21wYXJlX3NpbW9wcyk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX29wZW4pOiBTb3J0IHRoZSBTaW1vcHMgdGFibGUgYmVmb3JlIGluc2VydGluZyBlbnRyaWVzCi0JaW50byB0aGUgaGFzaCB0YWJsZS4KLQotRnJpIE1heSAxNiAxNjoyOToxOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChsb2FkX21lbSk6IEZpeCBmb3JtYXR0aW5nL2luZGVudGlvbiBwcm9ibGVtcyB3aXRoCi0JbGFzdCBjaGFuZ2UuICBJZiB3ZSBnZXQgYSBsb2FkIGZyb20gYW4gb3V0IG9mIHJhbmdlIGFkZHJlc3MsCi0JYWJvcnQgaW5zdGVhZCBvZiByZXR1cm5pbmcgemVyby4KLQkoc3RvcmVfbWVtKTogQWJvcnQgaWYgd2UgdHJ5IHRvIHN0b3JlIHRvIGFuIG91dCBvZiByYW5nZSBhZGRyZXNzLgotCi1XZWQgTWF5IDE0IDIxOjIxOjMwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfRjAxMCk6IEZpeCBzb21lIGFyZ3VtZW50cyB0byBjb3JyZXNwb25kCi0Jd2l0aCByZWFsaXR5ICh0eXBlcyBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGxzZWVrLCByZWFkLAotCXdyaXRlLCBvcGVuKS4KLQotCSogaW50ZXJwLmMgKG1heF9tZW0pOiBOZXcgdmFyaWFibGUuCi0JKGxvYWRfbWVtKTogQ2hlY2sgbWVtb3J5IGFkZHJlc3MgYWdhaW5zdCBtYXhfbWVtIHRvCi0JYXZvaWQgc29tZSBzZWxmLWRlc3RydWN0aXZlIGJlaGF2aW9ycy4KLQotVHVlIE1heSAxMyAyMTo0NToyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggdHlwbyBpbiBjYzAgc2V0dGluZyBmb3IgbHNyLgotCi1UdWUgTWF5ICA2IDEzOjIyOjEyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmM6IFJhbmRvbSB0eXBvL3RoaW5rbyBjbGVhbnVwcy4KLQotVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBBcHIgMjEgMTA6Mjk6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRml4IHR5cG8gaW4gIm9wZW4iIHN5c2NhbGwgZW11bGF0aW9uLgotCi1GcmkgQXByIDE4IDE0OjA0OjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9wKTogQWRkIHN0dWIgZnVuY3Rpb24uCi0KLVRodSBBcHIgMTcgMDM6MjM6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1sb2FkLm8uCi0JKiBpbnRlcnAuYyAoc2ltX2tpbmQsIG15bmFtZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLiAgSWdub3JlIC1FIGFyZy4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgQ2FsbCBzaW1fbG9hZF9maWxlIHRvCi0JbG9hZCBmaWxlIGludG8gc2ltdWxhdG9yLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgotCi1XZWQgQXByIDE2IDE4OjA2OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QX0YwMTApOiBTWVNfZXhlY3YsIFNZU190aW1lLCBTWVNfdGltZXMsIFNZU191dGltZQotIAlvbmx5IGluY2x1ZGUgaWYgaW1wbGVtZW50ZWQgYnkgaG9zdC4KLQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAgNCAyMDowMTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgbW4xMDIwMC1vcGMubyB0byBtMTAyMDAtb3BjLm8sIHRvIG1hdGNoCi0JY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gb3Bjb2RlcyBkaXJlY3RvcnkuCi0KLVdlZCBBcHIgIDIgMTU6MDY6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IE1hciAyMCAyMDoyODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDBfc2ltLmg6IFByb3RlY3QgdXNlcyBvZiAic2lnbmVkIiB0byBjYXRlciB0byBicm9rZW4KLQlub24tYW5zaSBjb21waWxlcnMgKEhQcykuICBEb24ndCB1c2UgI2Vycm9yIGZvciB0aGUgc2FtZSByZWFzb24uCi0KLVR1ZSBNYXIgMTggMTI6MjM6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRG9uJ3Qgc2lnbi1leHRlbmQgaW1tZWRpYXRlIGZvciAibW92IGltbTE2LGFuIi4KLQlTaW1wbGlmeSAic3ViIiBoYW5kbGluZy4gIEZpeCAibXVsIiB0byBwcm9wZXJseSBzaWduIGV4dGVuZAotCW9wZXJhbmRzLiAgU2V0IENGIGFwcHJvcHJpYXRlbHkgZm9yIGJ0c3QgaW1tMTYsZG4uICBJbXBsZW1lbnQgInJ0aSIuCi0KLQkqIGdlbmNvZGUuYzogRGVsZXRlIHVudXNlZCAiT3Bjb2RlcyIgYW5kICJjdXJvcCIgdmFyaWFibGVzLgotCi1XZWQgTWFyIDE5IDAxOjE0OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0KLUZyaSBNYXIgMTQgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgTWFyIDEzIDEyOjUzOjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cKLQlpbiBhcmd2IGZvcm0uCi0JKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgotCi1XZWQgTWFyIDEyIDE1OjAyOjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCB0eXBvIGZvciAiYmNsciIuCi0KLVdlZCBGZWIgMjYgMTY6NDY6MTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogSGFuZGxlIG5ldyBjYWxsaW5nIGNvbnZlbnRpb24gaW4gZW11bGF0ZWQgc3lzY2FsbAotCWNvZGUuCi0KLU1vbiBGZWIgMjQgMTQ6MjU6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAobG9hZF9tZW1fYmlnKTogQWRkIHNvbWUgbWlzc2luZyBwYXJlbnMuCi0KLVdlZCBGZWIgMTkgMjM6MTk6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRG9uJ3QgdXNlICJsb25nIGxvbmciIGRhdGEgdHlwZXMgZm9yIGludGVybWVkaWF0ZQotCXZhbHVlcyBpbiAiZGl2dSIsICJtdWwiIGFuZCAibXVsdSIgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRmViIDE0IDAyOjQ2OjQ2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKGhhc2gpOiBSZXdvcmsgdG8gYmUgbW9yZSBlZmZpY2llbnQuCi0JKGRpc3BhdGNoKTogUmVuYW1lZCBmcm9tIGxvb2t1cF9oYXNoLiAgRGlzcGF0Y2ggdG8gdGhlIHRhcmdldAotCWZ1bmN0aW9uIGFuZCB1cGRhdGUgdGhlIFBDIGhlcmUuCi0JKGxvYWRfbWVtX2JpZyk6IE5vdyBhIG1hY3JvLgotCShzaW1fcmVzdW1lKTogUmVzdHJ1Y3R1cmUgY29kZSB0byByZWFkIGFuIGluc24sIGRldGVybWluZSBpdHMKLQlsZW5ndGgsIGNhbGwgZGlzcGF0Y2ggcm91dGluZXMsIGV0YyB0byBiZSBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1GcmkgRmViICA3IDEyOjU5OjM2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKE1BWF9IQVNIKTogUmVkZWZpbmUgdG8gMTI3LgotCShzdHJ1Y3QgaGFzaF9lbnRyeSk6IEFkZCAiY291bnQiIGZpZWxkIHdoZW4gSEFTSF9TVEFUIGlzIGRlZmluZWQuCi0JKGhhc2gpOiBJbXByb3ZlIGhhc2hpbmcgZm9yIG1hbnkgaGVhdmlseSB1c2VkIG9wY29kZXMuCi0JKGxvb2t1cF9oYXNoKTogQnVtcCBjb3VudGVycyBpZiBIQVNIX1NUQVQgaXMgZGVmaW5lZC4KLQkoc2ltX29wZW4pOiBEb24ndCBwdXQgdGhlIHNhbWUgb3Bjb2RlIGluIHRoZSBoYXNoIHRhYmxlIG1vcmUKLQl0aGFuIG9uY2UuICBDbGVhciBjb3VudGVycyBpZiBIQVNIX1NUQVQgaXMgZGVmaW5lZC4KLQkoc2ltX3Jlc3VtZSk6IEFmdGVyIHByb2dyYW0gZXhpdHMsIGR1bXAgaGFzaCB0YWJsZSBzdGF0cyBpZgotCUhBU0hfU1RBVCBpcyBkZWZpbmVkLgotCi1XZWQgRmViICA1IDEwOjI4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCByZWdpc3RlciBleHRyYWN0aW9uIGZvciAiZXh0IGRuIi4KLQotVHVlIEZlYiAgNCAxNzoyNzo0MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggcmVnaXN0ZXIgZXh0cmFjdGlvbnMgZm9yICJtb3ZidSAoYW4pLCBkbSIuCi0KLVR1ZSBGZWIgIDQgMTM6MzM6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEBDT01NT05fTUFLRUZJTEVfRlJBRyk6IFVzZQotCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAzMSAwMToxOTowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBHZXQgY2FycnktaW4gYml0IHJpZ2h0IGZvciByb2wuICBKdXN0IGNsZWFyIHRoZQotCU5GIGZsYWcgZm9yIGJ0c3QgaW1tOCxkbi4KLQotV2VkIEphbiAyOSAxNTo0Nzo0MiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBQcm9wZXJseSBjb21wdXRlIFpGIGZsYWcgZm9yIG1hbnkgaW5zbnMuCi0KLVNhdCBKYW4gMjUgMTc6MDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogUHJvcGVybHkgdHJ1bmNhdGUgZGl2aXNvciBhbmQgZGl2aWRlbmQgYmVmb3JlCi0JcGVyZm9ybWluZyAiZGl2dSIgb3BlcmF0aW9uLgotCi1GcmkgSmFuIDI0IDEwOjQ3OjQ4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKGluaXRfc3lzdGVtKTogQWxsb2NhdGUgMl4xOSBieXRlcyBvZiBzcGFjZSBmb3IKLQl0aGUgc2ltdWxhdG9yLgotCi1UaHUgSmFuIDIzIDIxOjE3OjMzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IFJld29yayBjb2RlIHRvIGV4dHJhY3QgYXJndW1lbnRzIGZvciBlbXVsYXRlZAotCXN5c2NhbGxzIHRvIGhhbmRsZSAyNGJpdCBwb2ludGVycy4KLQotVGh1IEphbiAyMyAxNDowNjowNCAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKLQlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgotCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KLQltYWtlZmlsZSBmcmFnbWVudC4KLQotVGh1IEphbiAyMyAxMjowNDozOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggZGVzdGluYXRpb24gcmVnaXN0ZXIgZm9yICJtb3YgKGFiczI0KSxhbiIuCi0KLVR1ZSBKYW4gMjEgMTU6NTk6MjEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogInJ0cyIgYWRkcyA0IHRvIHRoZSBzdGFjayBwb2ludGVyLgotCi0JKiBzaW1vcHMuYzogRml4IENGIGFuZCBDWCBjb21wdXRhdGlvbiBmb3IgYWRkIGluc3RydWN0aW9ucy4KLQotCSogc2ltb3BzLmM6IExlYXZlIHRoZSB1cHBlciA4IGJpdHMgYWxvbmUgZm9yIGxvZ2ljYWwgb3BzLgotCU1hc2sgb2ZmIGhpZ2ggOCBiaXRzIGJlZm9yZSBkb2luZyBhbnkgc2hpZnRzL3JvdGF0ZXMuCi0JRml4IGNhcnJ5IGJpdCBoYW5kbGluZyBpbiByb3RhdGVzIGFnYWluLgotCi1Nb24gSmFuIDIwIDEwOjQ1OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IERvbid0IGxvc2UgdGhlIHNpZ24gYml0IGZvciAiYXNyIi4KLQotRnJpIEphbiAxNyAwMTo0NToxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggb3ZlcmZsb3cgY29tcHV0YXRpb24gZm9yICJjbXAiIGFuZCAic3ViIgotCWluc3RydWN0aW9ucy4KLQotCSogc2ltb3BzLmM6IFVzZSB0aGUgcmlnaHQgcmVnaXN0ZXIgZm9yICJqbXAgKGFuKSIgYW5kICJqc3IgKGFuKSIuCi0KLQkqIGludGVycC5jIChoYXNoKTogSW1wcm92ZSBoYXNoaW5nIGZvciAzIGJ5dGUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogRml4IGV4dHJhY3Rpb24gb2YgMTYvMjRiaXQgaW1tZWRpYXRlcyBmb3Igc29tZQotCWluc3RydWN0aW9ucy4gICJjbXAiIGluc3RydWN0aW9ucyBvbmx5IG1vZGlmeSB0aGUgUFNXLgotCUZpeCB2YXJpb3VzIHRoaW5rb3Mgd2hlbiBleHRyYWN0aW5nIHJlZ2lzdGVyIG9wZXJhbmRzIHRvby4KLQotVGh1IEphbiAxNiAwNzo0Nzo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggInJvbCIgYW5kICJyb3IiLgotCi0JKiBzaW1vcHMuYzogVHJ1bmNhdGUgUEMgdG8gMjRiaXRzIGFmdGVyIG1vZGlmeWluZyBpdC4KLQlDbG9zZXIgc3RhYiBhdCBlbXVsYXRlZCBzeXN0ZW0gY2FsbHMuCi0KLVR1ZSBKYW4gMTQgMTI6MzM6MTIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoaGFzaCk6IEltcHJvdmUgaGFzaGluZyBvZiB0d28gYnl0ZSBpbnNucy4KLQkoc3RvcmVfbWVtKTogSGFuZGxlIHN0b3JpbmcgMyBieXRlIHF1YW50aXRpZXMuCi0KLQkqIHNpbW9wcy5jOiBGaXggdmFyaW91cyB0eXBvcy90aGlua29zLgotCi0JKiBpbnRlcnAuYyAobG9hZF9tZW1fYmlnLCBsb2FkX21lbSwgc3RvcmVfbWVtKTogRml4IHRoaW5rbyBpbgotCWNvZGUgdG8gaGFuZGxlIDI0Yml0IGFkZHJlc3Nlcy4KLQkqIHNpbW9wcy5jIChSRUcwXzgsIFJFRzBfMTYpOiBGaXggdHlwby4KLQotTW9uIEphbiAgNiAxNjoxNzowOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDBfc2ltLmg6IFZhcmlvdXMgZml4ZXMgZm9yIG1peGVkIDE2LzI0Yml0IGFyY2hpdGVjdHVyZS4KLQkqIGludGVycC5jOiBTaW1pbGFybHkuCi0JKiBzaW1vcHMuYzogU2ltaWxhcmx5LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTmV3IGZpbGVzLgotCSogZ2VuY29kZS5jLCBpbnRlcnAuYywgbW4xMDIwMF9zaW0uaCwgc2ltb3BzLmM6IE5ldyBmaWxlcy4KLQkKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMjAwL01ha2VmaWxlLmluIGIvc2ltL21uMTAyMDAvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWQ5ZTcuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBtbjEwMjAwIHNpbSBsaWJyYXJ5LgotIyAgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotU0lNX09CSlMgPSBpbnRlcnAubyB0YWJsZS5vIHNpbW9wcy5vIHNpbS1sb2FkLm8KLVNJTV9FWFRSQV9DRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi8uLi9uZXdsaWIvbGliYy9zeXMvc3lzbWVjIC1ETkVFRF9VSV9MT09QX0hPT0sKLVNJTV9FWFRSQV9DTEVBTiA9IGNsZWFuLWV4dHJhCi0KLSMgU2VsZWN0IG1uMTAyMDAgc3VwcG9ydCBpbiBubHR2YWxzLmRlZi4KLU5MX1RBUkdFVCA9IC1ETkxfVEFSR0VUX21uMTAyMDAKLQotSU5DTFVERSA9IG1uMTAyMDBfc2ltLmggJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUvY2FsbGJhY2suaAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1zaW1vcHMuaDogZ2VuY29kZQotCS4vZ2VuY29kZSAtaCA+JEAKLQotdGFibGUuYzogZ2VuY29kZSBzaW1vcHMuaAotCS4vZ2VuY29kZSA+JEAKLQotZ2VuY29kZS5vOiBnZW5jb2RlLmMgJChJTkNMVURFKQotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbmNvZGUuYwotCi1tMTAyMDAtb3BjLm86ICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL20xMDIwMC1vcGMuYwotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpLy4uLy4uL29wY29kZXMvbTEwMjAwLW9wYy5jCi0KLWdlbmNvZGU6IGdlbmNvZGUubyBtMTAyMDAtb3BjLm8KLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1vIGdlbmNvZGUgZ2VuY29kZS5vIG0xMDIwMC1vcGMubyAkKEJVSUxEX0xJQikKLQotY2xlYW4tZXh0cmE6Ci0Jcm0gLWYgdGFibGUuYyBzaW1vcHMuaCBnZW5jb2RlCi0KLWludGVycC5vOiBpbnRlcnAuYyB0YWJsZS5jICQoSU5DTFVERSkKLXNpbW9wcy5vOiBzaW1vcHMuYyAkKElOQ0xVREUpCi10YWJsZS5vOiB0YWJsZS5jCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9hY2NvbmZpZy5oIGIvc2ltL21uMTAyMDAvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDIwMC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9jb25maWcuaW4gYi9zaW0vbW4xMDIwMC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODdhMmIuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9jb25maWd1cmUgYi9zaW0vbW4xMDIwMC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3MjBkNmIuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDAyNCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvY29uZmlndXJlLmluIGIvc2ltL21uMTAyMDAvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzNiMGJjLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMjAwL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1BQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQotCi1TSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9nZW5jb2RlLmMgYi9zaW0vbW4xMDIwMC9nZW5jb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTg3M2UuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvZ2VuY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSNpbmNsdWRlICJtbjEwMjAwX3NpbS5oIgotCi1zdGF0aWMgdm9pZCB3cml0ZV9oZWFkZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgd3JpdGVfb3Bjb2RlcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV90ZW1wbGF0ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCkpCi0gICAgd3JpdGVfaGVhZGVyKCk7Ci0gIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkpCi0gICAgd3JpdGVfdGVtcGxhdGUgKCk7Ci0gIGVsc2UKLSAgICB3cml0ZV9vcGNvZGVzKCk7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9oZWFkZXIgKCkKLXsKLSAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcGNvZGU7Ci0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHByaW50Zigidm9pZCBPUF8lWCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7XHRcdC8qICVzICovXG4iLAotCSAgIG9wY29kZS0+b3Bjb2RlLCBvcGNvZGUtPm5hbWUpOwotfQotCi0KLS8qIHdyaXRlX3RlbXBsYXRlIGNyZWF0ZXMgYSBmaWxlIGFsbCByZXF1aXJlZCBmdW5jdGlvbnMsIHJlYWR5ICovCi0vKiB0byBiZSBmaWxsZWQgb3V0ICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV90ZW1wbGF0ZSAoKQotewotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wY29kZTsKLSAgaW50IGksajsKLQotICBwcmludGYgKCIjaW5jbHVkZSBcIm1uMTAyMDBfc2ltLmhcIlxuIik7Ci0gIHByaW50ZiAoIiNpbmNsdWRlIFwic2ltb3BzLmhcIlxuIik7Ci0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIHByaW50ZigiLyogJXMgKi9cbnZvaWRcbk9QXyVYIChpbnNuLCBleHRlbnNpb24pXG4gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uO1xue1xuIiwgb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm9wY29kZSk7Ci0JICAKLSAgICAgIC8qIGNvdW50IG9wZXJhbmRzICovCi0gICAgICBqID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgaW50IGZsYWdzID0gbW4xMDIwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotCSAgaWYgKGZsYWdzKQotCSAgICBqKys7Ci0JfQotICAgICAgc3dpdGNoIChqKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcblwiKTtcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleFxcblwiLCBPUFswXSk7XG4iLCBvcGNvZGUtPm5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0pO1xuIiwKLQkJICBvcGNvZGUtPm5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4LCUleFxcblwiLE9QWzBdLE9QWzFdLE9QWzJdKTtcbiIsCi0JCSAgb3Bjb2RlLT5uYW1lKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBmcHJpbnRmIChzdGRlcnIsIlRvbyBtYW55IG9wZXJhbmRzOiAlZFxuIiwgaik7Ci0JfQotICAgICAgcHJpbnRmICgifVxuXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9vcGNvZGVzICgpCi17Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3Bjb2RlOwotICBpbnQgaSwgajsKLSAgaW50IG51bW9wczsKLSAgCi0gIC8qIHdyaXRlIG91dCBvcGNvZGUgdGFibGUgKi8KLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJtbjEwMjAwX3NpbS5oXCJcbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcblxuIik7Ci0gIHByaW50ZiAoInN0cnVjdCBzaW1vcHMgU2ltb3BzW10gPSB7XG4iKTsKLSAgCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKW1uMTAyMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZTsKLQotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8xKQotCXNpemUgPSAxOwotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzQpCi0Jc2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMyB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNSkKLQlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQotCXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0Jc2l6ZSA9IDU7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHByaW50ZiAoIiAgeyAweCV4LDB4JXgsT1BfJVgsJWQsJWQsIiwKLQkgICAgICBvcGNvZGUtPm9wY29kZSwgb3Bjb2RlLT5tYXNrLCBvcGNvZGUtPm9wY29kZSwKLQkgICAgICBzaXplLCBvcGNvZGUtPmZvcm1hdCk7Ci0gICAgICAKLSAgICAgIC8qIGNvdW50IG9wZXJhbmRzICovCi0gICAgICBqID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgaW50IGZsYWdzID0gbW4xMDIwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotCSAgaWYgKGZsYWdzKQotCSAgICBqKys7Ci0JfQotICAgICAgcHJpbnRmICgiJWQseyIsaik7Ci0JICAKLSAgICAgIGogPSAwOwotICAgICAgbnVtb3BzID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgaW50IGZsYWdzID0gbW4xMDIwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIGludCBzaGlmdCA9IG1uMTAyMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0KLQkgIGlmIChmbGFncykKLQkgICAgewotCSAgICAgIGlmIChqKQotCQlwcmludGYgKCIsICIpOwotCSAgICAgIHByaW50ZiAoIiVkLCVkLCVkIiwgc2hpZnQsCi0JCSAgICAgIG1uMTAyMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uYml0cyxmbGFncyk7Ci0JICAgICAgaiA9IDE7Ci0JICAgICAgbnVtb3BzKys7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAobnVtb3BzKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCIwLDAsMCIpOwotCWNhc2UgMToKLQkgIHByaW50ZiAoIiwwLDAsMCIpOwotCX0KLQotICAgICAgcHJpbnRmICgifX0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoInsgMCwwLE5VTEwsMCwwLDAsezAsMCwwLDAsMCwwfX0sXG59O1xuIik7Ci19CmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9pbnRlcnAuYyBiL3NpbS9tbjEwMjAwL2ludGVycC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E4NzUwLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMjAwL2ludGVycC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIwICswLDAgQEAKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmQuaCIKLQotI2luY2x1ZGUgIm1uMTAyMDBfc2ltLmgiCi0KLSNpZmRlZiBORUVEX1VJX0xPT1BfSE9PSwotLyogSG93IG9mdGVuIHRvIHJ1biB0aGUgdWlfbG9vcCB1cGRhdGUsIHdoZW4gaW4gdXNlICovCi0jZGVmaW5lIFVJX0xPT1BfUE9MTF9JTlRFUlZBTCAweDYwMDAwCi0KLS8qIENvdW50ZXIgZm9yIHRoZSB1aV9sb29wX2hvb2sgdXBkYXRlICovCi1zdGF0aWMgbG9uZyB1aV9sb29wX2hvb2tfY291bnRlciA9IFVJX0xPT1BfUE9MTF9JTlRFUlZBTDsKLQotLyogQWN0dWFsIGhvb2sgdG8gY2FsbCB0byBydW4gdGhyb3VnaCBnZGIncyBndWkgZXZlbnQgbG9vcCAqLwotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgKGludCk7Ci0jZW5kaWYgLyogTkVFRF9VSV9MT09QX0hPT0sgKi8KLQotaG9zdF9jYWxsYmFjayAqbW4xMDIwMF9jYWxsYmFjazsKLWludCBtbjEwMjAwX2RlYnVnOwotc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7Ci1zdGF0aWMgY2hhciAqbXluYW1lOwotCi1zdGF0aWMgdm9pZCBkaXNwYXRjaCBQQVJBTVMgKCh1aW50MzIsIHVpbnQzMiwgaW50KSk7Ci1zdGF0aWMgbG9uZyBoYXNoIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyB2b2lkIGluaXRfc3lzdGVtIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgTUFYX0hBU0ggIDEyNwotCi1zdHJ1Y3QgaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKLSAgbG9uZyBvcGNvZGU7Ci0gIGxvbmcgbWFzazsKLSAgc3RydWN0IHNpbW9wcyAqb3BzOwotI2lmZGVmIEhBU0hfU1RBVAotICB1bnNpZ25lZCBsb25nIGNvdW50OwotI2VuZGlmCi19OwotCi1pbnQgbWF4X21lbSA9IDA7Ci1zdHJ1Y3QgaGFzaF9lbnRyeSBoYXNoX3RhYmxlW01BWF9IQVNIKzFdOwotCi0KLS8qIFRoaXMgcHJvYmFibHkgZG9lc24ndCBkbyBhIHZlcnkgZ29vZCBqb2IgYXQgYnVja2V0IGZpbGxpbmcsIGJ1dAotICAgaXQncyBzaW1wbGUuLi4gKi8KLXN0YXRpYyBJTkxJTkUgbG9uZyAKLWhhc2goaW5zbikKLSAgICAgbG9uZyBpbnNuOwotewotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGZmZmZmZjAwKSA9PSAweDAwKQotICAgIHsKLSAgICAgIGlmICgoaW5zbiAmIDB4ZjApICE9IDB4ODApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZjApID4+IDQpICYgMHg3ZjsKLQotICAgICAgaWYgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotCXJldHVybiAoaW5zbiAmIDB4ZjApICYgMHg3ZjsKLQotICAgICAgcmV0dXJuIChpbnNuICYgMHhmZikgJiAweDdmOwotICAgIH0KLQotICBpZiAoKGluc24gJiAweGZmZmYwMDAwKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgPT0gMHhkMDAwKQotCXJldHVybiAoKGluc24gJiAweGZjMDApID4+IDEwKSAmIDB4N2Y7Ci0KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgPT0gMHhlMDAwKQotCXJldHVybiAoKGluc24gJiAweGZmMDApID4+IDgpICYgMHg3ZjsKLQotICAgICAgaWYgKChpbnNuICYgMHhmMjAwKSA9PSAweGYyMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmZmMCkgPj4gNCkgJiAweDdmOwotCi0gICAgICBpZiAoKGluc24gJiAweGMwMDApID09IDB4NDAwMAotCSAgfHwgKGluc24gJiAweGYwMDApID09IDB4ODAwMCkKLQlyZXR1cm4gKChpbnNuICYgMHhmMDAwKSA+PiA4KSAmIDB4N2Y7Ci0KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjIwMCkgPT0gMHhmMDAwKQotCXJldHVybiAoKGluc24gJiAweGZmYzApID4+IDgpICYgMHg3ZjsKLQotICAgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkgJiAweDdmOwotICAgIH0KLQotICBpZiAoKGluc24gJiAweGZmMDAwMDAwKSA9PSAwKQotICAgIHsKLQotICAgICAgaWYgKChpbnNuICYgMHhmMDAwMDApICE9IDB4ZjAwMDAwCi0JICAgfHwgKGluc24gJiAweGZjMDAwMCkgPT0gMHhmODAwMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmMwMDAwKSA+PiAxNikgJiAweDdmOwotCi0gICAgICBpZiAoKGluc24gJiAweGZmMDAwMCkgPT0gMHhmNTAwMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmZmMDAwKSA+PiAxMikgJiAweDdmOwotICAgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMDAwKSA+PiAxNikgJiAweDdmOwotICAgIH0KLQotICByZXR1cm4gKChpbnNuICYgMHhmZmYwMDAwKSA+PiAyMCkgJiAweDdmOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIGxlbmd0aCkKLSAgICAgdWludDMyIGluc247Ci0gICAgIHVpbnQzMiBleHRlbnNpb247Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpoOwotCi0gIGggPSAmaGFzaF90YWJsZVtoYXNoKGluc24pXTsKLQotICB3aGlsZSAoKGluc24gJiBoLT5tYXNrKSAhPSBoLT5vcGNvZGUKLQkgIHx8IChsZW5ndGggIT0gaC0+b3BzLT5sZW5ndGgpKQotICAgIHsKLSAgICAgIGlmICghaC0+bmV4dCkKLQl7Ci0JICAoKm1uMTAyMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAyMDBfY2FsbGJhY2ssCi0JICAgICJFUlJPUiBsb29raW5nIHVwIGhhc2ggZm9yIDB4JXgsIFBDPTB4JXhcbiIsIGluc24sIFBDKTsKLQkgIGV4aXQoMSk7Ci0JfQotICAgICAgaCA9IGgtPm5leHQ7Ci0gICAgfQotCi0KLSNpZmRlZiBIQVNIX1NUQVQKLSAgaC0+Y291bnQrKzsKLSNlbmRpZgotCi0gIC8qIE5vdyBjYWxsIHRoZSByaWdodCBmdW5jdGlvbi4gICovCi0gIChoLT5vcHMtPmZ1bmMpKGluc24sIGV4dGVuc2lvbik7Ci0gIFBDICs9IGxlbmd0aDsKLX0KLQotLyogRklYTUUgVGhlc2Ugd291bGQgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoYW4gbG9hZF9tZW0vc3RvcmVfbWVtLAotICAgYnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byB1c2UgdGhlIG1lbW9yeSBtYXAuICAqLwotCi11aW50MzIKLWdldF93b3JkICh4KQotICAgICAgdWludDggKng7Ci17Ci0gIHVpbnQ4ICphID0geDsKLSAgcmV0dXJuIChhWzNdPDwyNCkgKyAoYVsyXTw8MTYpICsgKGFbMV08PDgpICsgKGFbMF0pOwotfQotCi12b2lkCi1wdXRfd29yZCAoYWRkciwgZGF0YSkKLSAgICAgdWludDggKmFkZHI7Ci0gICAgIHVpbnQzMiBkYXRhOwotewotICB1aW50OCAqYSA9IGFkZHI7Ci0gIGFbMF0gPSBkYXRhICYgMHhmZjsKLSAgYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKLSAgYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7Ci0gIGFbM10gPSAoZGF0YSA+PiAyNCkgJiAweGZmOwotfQotCi12b2lkCi1zaW1fc2l6ZSAocG93ZXIpCi0gICAgIGludCBwb3dlcjsKLQotewotICBpZiAoU3RhdGUubWVtKQotICAgIGZyZWUgKFN0YXRlLm1lbSk7Ci0KLSAgbWF4X21lbSA9IDEgPDwgcG93ZXI7Ci0gIFN0YXRlLm1lbSA9ICh1aW50OCAqKSBjYWxsb2MgKDEsICAxIDw8IHBvd2VyKTsKLSAgaWYgKCFTdGF0ZS5tZW0pCi0gICAgewotICAgICAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAiQWxsb2NhdGlvbiBvZiBtYWluIG1lbW9yeSBmYWlsZWQuXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWluaXRfc3lzdGVtICgpCi17Ci0gIGlmICghU3RhdGUubWVtKQotICAgIHNpbV9zaXplKDE5KTsKLX0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLGFkZHIsIGJ1ZmZlciwgc2l6ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpOwotCi0gIGluaXRfc3lzdGVtICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgc3RvcmVfYnl0ZSAoYWRkciArIGksIGJ1ZmZlcltpXSk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIG9wY29kZSB0YWJsZSBlbnRyaWVzIGZvciBxc29ydC4gICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX3NpbW9wcyAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICB1bnNpZ25lZCBsb25nIGNvZGUxID0gKChzdHJ1Y3Qgc2ltb3BzICopYXJnMSktPm9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBjb2RlMiA9ICgoc3RydWN0IHNpbW9wcyAqKWFyZzIpLT5vcGNvZGU7Ci0KLSAgaWYgKGNvZGUxIDwgY29kZTIpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoY29kZTIgPCBjb2RlMSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLVNJTV9ERVNDCi1zaW1fb3BlbiAoa2luZCwgY2IsIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2I7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgc3RydWN0IHNpbW9wcyAqczsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmg7Ci0gIGNoYXIgKipwOwotICBpbnQgaTsKLQotICBtbjEwMjAwX2NhbGxiYWNrID0gY2I7Ci0KLSAgLyogU29ydCB0aGUgb3Bjb2RlIGFycmF5IGZyb20gc21hbGxlc3Qgb3Bjb2RlIHRvIGxhcmdlc3QuCi0gICAgIFRoaXMgd2lsbCBnZW5lcmFsbHkgaW1wcm92ZSBzaW11bGF0b3IgcGVyZm9ybWFuY2UgYXMgdGhlIHNtYWxsZXIKLSAgICAgb3Bjb2RlcyBhcmUgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byB0aGUgbGFyZ2VyIG9wY29kZXMuICAqLwotICBmb3IgKGkgPSAwLCBzID0gU2ltb3BzOyBzLT5mdW5jOyBzKyssIGkrKykKLSAgICA7Ci0gIHFzb3J0IChTaW1vcHMsIGksIHNpemVvZiAoU2ltb3BzWzBdKSwgY29tcGFyZV9zaW1vcHMpOwotCi0gIHNpbV9raW5kID0ga2luZDsKLSAgbXluYW1lID0gYXJndlswXTsKLQotICBmb3IgKHAgPSBhcmd2ICsgMTsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgqcCwgIi1FIikgPT0gMCkKLQkrK3A7IC8qIGlnbm9yZSBlbmRpYW4gc3BlYyAqLwotICAgICAgZWxzZQotI2lmZGVmIERFQlVHCi0gICAgICBpZiAoc3RyY21wICgqcCwgIi10IikgPT0gMCkKLQltbjEwMjAwX2RlYnVnID0gREVCVUc7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQkoKm1uMTAyMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAyMDBfY2FsbGJhY2ssICJFUlJPUjogdW5zdXBwb3J0ZWQgb3B0aW9uKHMpOiAlc1xuIiwqcCk7Ci0gICAgfQotCi0gIC8qIHB1dCBhbGwgdGhlIG9wY29kZXMgaW4gdGhlIGhhc2ggdGFibGUgKi8KLSAgZm9yIChzID0gU2ltb3BzOyBzLT5mdW5jOyBzKyspCi0gICAgewotICAgICAgaCA9ICZoYXNoX3RhYmxlW2hhc2gocy0+b3Bjb2RlKV07Ci0gICAgICAKLSAgICAgIC8qIGdvIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjaGFpbiAqLwotICAgICAgd2hpbGUgKGgtPm5leHQpCi0JewotCSAgLyogRG9uJ3QgaW5zZXJ0IHRoZSBzYW1lIG9wY29kZSBtb3JlIHRoYW4gb25jZS4gICovCi0JICBpZiAoaC0+b3Bjb2RlID09IHMtPm9wY29kZQotCSAgICAgICYmIGgtPm1hc2sgPT0gcy0+bWFzawotCSAgICAgICYmIGgtPm9wcyA9PSBzKQotCSAgICBicmVhazsKLQkgIGVsc2UKLQkgICAgaCA9IGgtPm5leHQ7Ci0JfQotCi0gICAgICAvKiBEb24ndCBpbnNlcnQgdGhlIHNhbWUgb3Bjb2RlIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgICAgIGlmIChoLT5vcGNvZGUgPT0gcy0+b3Bjb2RlCi0JICAmJiBoLT5tYXNrID09IHMtPm1hc2sKLQkgICYmIGgtPm9wcyA9PSBzKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaC0+b3BzKQotCXsKLQkgIGgtPm5leHQgPSBjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpKTsKLQkgIGggPSBoLT5uZXh0OwotCX0KLSAgICAgIGgtPm9wcyA9IHM7Ci0gICAgICBoLT5tYXNrID0gcy0+bWFzazsKLSAgICAgIGgtPm9wY29kZSA9IHMtPm9wY29kZTsKLSNpZmRlZiBIQVNIX1NUQVQKLSAgICAgIGgtPmNvdW50ID0gMDsKLSNlbmRpZgotICAgIH0KLQotICAvKiBmdWRnZSBvdXIgZGVzY3JpcHRvciBmb3Igbm93ICovCi0gIHJldHVybiAoU0lNX0RFU0MpIDE7Ci19Ci0KLQotdm9pZAotc2ltX3NldF9wcm9maWxlIChuKQotICAgICBpbnQgbjsKLXsKLSAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAic2ltX3NldF9wcm9maWxlICVkXG4iLCBuKTsKLX0KLQotdm9pZAotc2ltX3NldF9wcm9maWxlX3NpemUgKG4pCi0gICAgIGludCBuOwotewotICAoKm1uMTAyMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAyMDBfY2FsbGJhY2ssICJzaW1fc2V0X3Byb2ZpbGVfc2l6ZSAlZFxuIiwgbik7Ci19Ci0KLWludAotc2ltX3N0b3AgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSU5UOwotICByZXR1cm4gMTsKLX0KLQotdm9pZAotc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgc3RlcCwgc2lnZ25hbDsKLXsKLSAgdWludDMyIGluc3Q7Ci0KLSAgaWYgKHN0ZXApCi0gICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLSAgZWxzZQotICAgIFN0YXRlLmV4Y2VwdGlvbiA9IDA7Ci0KLSAgU3RhdGUuZXhpdGVkID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotCi0jaWZkZWYgTkVFRF9VSV9MT09QX0hPT0sKLSAgICBpZiAodWlfbG9vcF9ob29rICE9IE5VTEwgJiYgdWlfbG9vcF9ob29rX2NvdW50ZXItLSA8IDApCi0gICAgICB7Ci0JdWlfbG9vcF9ob29rX2NvdW50ZXIgPSBVSV9MT09QX1BPTExfSU5URVJWQUw7Ci0JdWlfbG9vcF9ob29rICgwKTsKLSAgICAgIH0KLSNlbmRpZiAvKiBORUVEX1VJX0xPT1BfSE9PSyAqLwotCi0gICAgICAvKiBGZXRjaCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiwgZmV0Y2ggYSBkb3VibGUgd29yZCB0bwotCSBhdm9pZCByZWR1bmRhbnQgZmV0Y2hpbmcgZm9yIHRoZSBjb21tb24gY2FzZXMgYmVsb3cuICAqLwotICAgICAgaW5zdCA9IGxvYWRfbWVtX2JpZyAoUEMsIDIpOwotCi0gICAgICAvKiBVc2luZyBhIGdpYW50IGNhc2Ugc3RhdGVtZW50IG1heSBzZWVtIGxpa2UgYSB3YXN0ZSBiZWNhdXNlIG9mIHRoZQotCSBjb2RlL3JvZGF0YSBzaXplIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBjb25zdW1lLiAgSG93ZXZlciwgdXNpbmcKLQkgYSBnaWFudCBjYXNlIHN0YXRlbWVudCBzcGVlZHMgdXAgdGhlIHNpbXVsYXRvciBieSAxMC0xNSUgYnkgYXZvaWRpbmcKLQkgY2FzY2FkaW5nIGlmL2Vsc2Ugc3RhdGVtZW50cyBvciBjYXNjYWRpbmcgY2FzZSBzdGF0ZW1lbnRzLiAgKi8KLSAgICAgIHN3aXRjaCAoKGluc3QgPj4gOCkgJiAweGZmKQotCXsKLQkvKiBBbGwgdGhlIHNpbmdsZSBieXRlIGluc25zIGV4Y2VwdCAweDgwLCB3aGljaCBtdXN0Ci0JICAgYmUgaGFuZGxlZCBzcGVjaWFsbHkuICAqLwotCWNhc2UgMHgwMDoKLQljYXNlIDB4MDE6Ci0JY2FzZSAweDAyOgotCWNhc2UgMHgwMzoKLQljYXNlIDB4MDQ6Ci0JY2FzZSAweDA1OgotCWNhc2UgMHgwNjoKLQljYXNlIDB4MDc6Ci0JY2FzZSAweDA4OgotCWNhc2UgMHgwOToKLQljYXNlIDB4MGE6Ci0JY2FzZSAweDBiOgotCWNhc2UgMHgwYzoKLQljYXNlIDB4MGQ6Ci0JY2FzZSAweDBlOgotCWNhc2UgMHgwZjoKLQljYXNlIDB4MTA6Ci0JY2FzZSAweDExOgotCWNhc2UgMHgxMjoKLQljYXNlIDB4MTM6Ci0JY2FzZSAweDE0OgotCWNhc2UgMHgxNToKLQljYXNlIDB4MTY6Ci0JY2FzZSAweDE3OgotCWNhc2UgMHgxODoKLQljYXNlIDB4MTk6Ci0JY2FzZSAweDFhOgotCWNhc2UgMHgxYjoKLQljYXNlIDB4MWM6Ci0JY2FzZSAweDFkOgotCWNhc2UgMHgxZToKLQljYXNlIDB4MWY6Ci0JY2FzZSAweDIwOgotCWNhc2UgMHgyMToKLQljYXNlIDB4MjI6Ci0JY2FzZSAweDIzOgotCWNhc2UgMHgyNDoKLQljYXNlIDB4MjU6Ci0JY2FzZSAweDI2OgotCWNhc2UgMHgyNzoKLQljYXNlIDB4Mjg6Ci0JY2FzZSAweDI5OgotCWNhc2UgMHgyYToKLQljYXNlIDB4MmI6Ci0JY2FzZSAweDJjOgotCWNhc2UgMHgyZDoKLQljYXNlIDB4MmU6Ci0JY2FzZSAweDJmOgotCWNhc2UgMHgzMDoKLQljYXNlIDB4MzE6Ci0JY2FzZSAweDMyOgotCWNhc2UgMHgzMzoKLQljYXNlIDB4MzQ6Ci0JY2FzZSAweDM1OgotCWNhc2UgMHgzNjoKLQljYXNlIDB4Mzc6Ci0JY2FzZSAweDM4OgotCWNhc2UgMHgzOToKLQljYXNlIDB4M2E6Ci0JY2FzZSAweDNiOgotCWNhc2UgMHgzYzoKLQljYXNlIDB4M2Q6Ci0JY2FzZSAweDNlOgotCWNhc2UgMHgzZjoKLQljYXNlIDB4OTA6Ci0JY2FzZSAweDkxOgotCWNhc2UgMHg5MjoKLQljYXNlIDB4OTM6Ci0JY2FzZSAweDk0OgotCWNhc2UgMHg5NToKLQljYXNlIDB4OTY6Ci0JY2FzZSAweDk3OgotCWNhc2UgMHg5ODoKLQljYXNlIDB4OTk6Ci0JY2FzZSAweDlhOgotCWNhc2UgMHg5YjoKLQljYXNlIDB4OWM6Ci0JY2FzZSAweDlkOgotCWNhc2UgMHg5ZToKLQljYXNlIDB4OWY6Ci0JY2FzZSAweGEwOgotCWNhc2UgMHhhMToKLQljYXNlIDB4YTI6Ci0JY2FzZSAweGEzOgotCWNhc2UgMHhhNDoKLQljYXNlIDB4YTU6Ci0JY2FzZSAweGE2OgotCWNhc2UgMHhhNzoKLQljYXNlIDB4YTg6Ci0JY2FzZSAweGE5OgotCWNhc2UgMHhhYToKLQljYXNlIDB4YWI6Ci0JY2FzZSAweGFjOgotCWNhc2UgMHhhZDoKLQljYXNlIDB4YWU6Ci0JY2FzZSAweGFmOgotCWNhc2UgMHhiMDoKLQljYXNlIDB4YjE6Ci0JY2FzZSAweGIyOgotCWNhc2UgMHhiMzoKLQljYXNlIDB4YjQ6Ci0JY2FzZSAweGI1OgotCWNhc2UgMHhiNjoKLQljYXNlIDB4Yjc6Ci0JY2FzZSAweGI4OgotCWNhc2UgMHhiOToKLQljYXNlIDB4YmE6Ci0JY2FzZSAweGJiOgotCWNhc2UgMHhiYzoKLQljYXNlIDB4YmQ6Ci0JY2FzZSAweGJlOgotCWNhc2UgMHhiZjoKLSAgICAgICAgY2FzZSAweGViOgotCWNhc2UgMHhmNjoKLQljYXNlIDB4ZmU6Ci0JY2FzZSAweGZmOgotCSAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKLQkgIGV4dGVuc2lvbiA9IDA7Ci0JICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAxKTsKLQkgIGJyZWFrOwotCi0JLyogU3BlY2lhbCBjYXNlIGFzIG1vdiBkWCxkWCByZWFsbHkgbWVhbnMgbW92IGltbTgsZFguICAqLwotCWNhc2UgMHg4MDoKLQljYXNlIDB4ODU6Ci0JY2FzZSAweDhhOgotCWNhc2UgMHg4ZjoKLQkgIC8qIEZldGNoIHRoZSBmdWxsIGluc3RydWN0aW9uLiAgKi8KLQkgIGluc24gPSBpbnN0OwotCSAgZXh0ZW5zaW9uID0gMDsKLQkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4ODE6Ci0JY2FzZSAweDgyOgotCWNhc2UgMHg4MzoKLQljYXNlIDB4ODQ6Ci0JY2FzZSAweDg2OgotCWNhc2UgMHg4NzoKLQljYXNlIDB4ODg6Ci0JY2FzZSAweDg5OgotCWNhc2UgMHg4YjoKLQljYXNlIDB4OGM6Ci0JY2FzZSAweDhkOgotCWNhc2UgMHg4ZToKLQkgIGluc24gPSAoaW5zdCA+PiA4KSAmIDB4ZmY7Ci0JICBleHRlbnNpb24gPSAwOwotCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMSk7Ci0JICBicmVhazsKLQotICAgICAgICAvKiBBbmQgdGhlIHR3byBieXRlIGluc25zLiAgKi8KLQljYXNlIDB4NDA6Ci0JY2FzZSAweDQxOgotCWNhc2UgMHg0MjoKLQljYXNlIDB4NDM6Ci0JY2FzZSAweDQ0OgotCWNhc2UgMHg0NToKLQljYXNlIDB4NDY6Ci0JY2FzZSAweDQ3OgotCWNhc2UgMHg0ODoKLQljYXNlIDB4NDk6Ci0JY2FzZSAweDRhOgotCWNhc2UgMHg0YjoKLQljYXNlIDB4NGM6Ci0JY2FzZSAweDRkOgotCWNhc2UgMHg0ZToKLQljYXNlIDB4NGY6Ci0JY2FzZSAweDUwOgotCWNhc2UgMHg1MToKLQljYXNlIDB4NTI6Ci0JY2FzZSAweDUzOgotCWNhc2UgMHg1NDoKLQljYXNlIDB4NTU6Ci0JY2FzZSAweDU2OgotCWNhc2UgMHg1NzoKLQljYXNlIDB4NTg6Ci0JY2FzZSAweDU5OgotCWNhc2UgMHg1YToKLQljYXNlIDB4NWI6Ci0JY2FzZSAweDVjOgotCWNhc2UgMHg1ZDoKLQljYXNlIDB4NWU6Ci0JY2FzZSAweDVmOgotCWNhc2UgMHg2MDoKLQljYXNlIDB4NjE6Ci0JY2FzZSAweDYyOgotCWNhc2UgMHg2MzoKLQljYXNlIDB4NjQ6Ci0JY2FzZSAweDY1OgotCWNhc2UgMHg2NjoKLQljYXNlIDB4Njc6Ci0JY2FzZSAweDY4OgotCWNhc2UgMHg2OToKLQljYXNlIDB4NmE6Ci0JY2FzZSAweDZiOgotCWNhc2UgMHg2YzoKLQljYXNlIDB4NmQ6Ci0JY2FzZSAweDZlOgotCWNhc2UgMHg2ZjoKLQljYXNlIDB4NzA6Ci0JY2FzZSAweDcxOgotCWNhc2UgMHg3MjoKLQljYXNlIDB4NzM6Ci0JY2FzZSAweDc0OgotCWNhc2UgMHg3NToKLQljYXNlIDB4NzY6Ci0JY2FzZSAweDc3OgotCWNhc2UgMHg3ODoKLQljYXNlIDB4Nzk6Ci0JY2FzZSAweDdhOgotCWNhc2UgMHg3YjoKLQljYXNlIDB4N2M6Ci0JY2FzZSAweDdkOgotCWNhc2UgMHg3ZToKLQljYXNlIDB4N2Y6Ci0JY2FzZSAweGQwOgotCWNhc2UgMHhkMToKLQljYXNlIDB4ZDI6Ci0JY2FzZSAweGQzOgotCWNhc2UgMHhkNDoKLQljYXNlIDB4ZDU6Ci0JY2FzZSAweGQ2OgotCWNhc2UgMHhkNzoKLQljYXNlIDB4ZDg6Ci0JY2FzZSAweGQ5OgotCWNhc2UgMHhkYToKLQljYXNlIDB4ZGI6Ci0JY2FzZSAweGUwOgotCWNhc2UgMHhlMToKLQljYXNlIDB4ZTI6Ci0JY2FzZSAweGUzOgotCWNhc2UgMHhlNDoKLQljYXNlIDB4ZTU6Ci0JY2FzZSAweGU2OgotCWNhc2UgMHhlNzoKLQljYXNlIDB4ZTg6Ci0JY2FzZSAweGU5OgotCWNhc2UgMHhlYToKLQljYXNlIDB4ZjA6Ci0JY2FzZSAweGYxOgotCWNhc2UgMHhmMjoKLQljYXNlIDB4ZjM6Ci0JICAvKiBGZXRjaCB0aGUgZnVsbCBpbnN0cnVjdGlvbi4gICovCi0JICBpbnNuID0gaW5zdDsKLQkgIGV4dGVuc2lvbiA9IDA7Ci0JICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAyKTsKLQkgIGJyZWFrOwotCi0JLyogQW5kIHRoZSAzIGJ5dGUgaW5zbnMgd2l0aCBhIDE2Yml0IG9wZXJhbmQgaW4gbGl0dGxlCi0JICAgZW5kaWFuIGZvcm1hdC4gICovCi0JY2FzZSAweGMwOgotCWNhc2UgMHhjMToKLQljYXNlIDB4YzI6Ci0JY2FzZSAweGMzOgotCWNhc2UgMHhjNDoKLQljYXNlIDB4YzU6Ci0JY2FzZSAweGM2OgotCWNhc2UgMHhjNzoKLQljYXNlIDB4Yzg6Ci0JY2FzZSAweGM5OgotCWNhc2UgMHhjYToKLQljYXNlIDB4Y2I6Ci0JY2FzZSAweGNjOgotCWNhc2UgMHhjZDoKLQljYXNlIDB4Y2U6Ci0JY2FzZSAweGNmOgotCWNhc2UgMHhkYzoKLQljYXNlIDB4ZGQ6Ci0JY2FzZSAweGRlOgotCWNhc2UgMHhkZjoKLQljYXNlIDB4ZWM6Ci0JY2FzZSAweGVkOgotCWNhc2UgMHhlZToKLQljYXNlIDB4ZWY6Ci0JY2FzZSAweGY4OgotCWNhc2UgMHhmOToKLQljYXNlIDB4ZmE6Ci0JY2FzZSAweGZiOgotCWNhc2UgMHhmYzoKLQljYXNlIDB4ZmQ6Ci0JICBpbnNuID0gbG9hZF9ieXRlIChQQyk7Ci0JICBpbnNuIDw8PSAxNjsKLQkgIGluc24gfD0gbG9hZF9oYWxmIChQQyArIDEpOwotCSAgZXh0ZW5zaW9uID0gMDsKLQkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDMpOwotCSAgYnJlYWs7Ci0KLQkvKiAzIGJ5dGUgaW5zbnMgd2l0aG91dCAxNmJpdCBvcGVyYW5kLiAgKi8KLQljYXNlIDB4ZjU6Ci0JICBpbnNuID0gbG9hZF9tZW1fYmlnIChQQywgMyk7Ci0JICBleHRlbnNpb24gPSAwOwotCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMyk7Ci0JICBicmVhazsKLQotCS8qIDQgYnl0ZSBpbnNucy4gICovCi0JY2FzZSAweGY3OgotCSAgaW5zbiA9IGluc3Q7Ci0JICBpbnNuIDw8PSAxNjsKLQkgIGluc24gfD0gbG9hZF9oYWxmIChQQyArIDIpOwotCSAgZXh0ZW5zaW9uID0gMDsKLQkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDB4ZjQ6Ci0JICBpbnNuID0gaW5zdDsKLQkgIGluc24gPDw9IDE2OwotCSAgaW5zbiB8PSBsb2FkX21lbV9iaWcgKFBDICsgNCwgMSkgPDwgODsKLQkgIGluc24gfD0gbG9hZF9tZW1fYmlnIChQQyArIDMsIDEpOwotCSAgZXh0ZW5zaW9uID0gbG9hZF9tZW1fYmlnIChQQyArIDIsIDEpOwotCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLSAgICAgICAgfQotICAgIH0KLSAgd2hpbGUgKCFTdGF0ZS5leGNlcHRpb24pOwotCi0jaWZkZWYgSEFTSF9TVEFUCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hBU0g7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3RydWN0IGhhc2hfZW50cnkgKmg7Ci0JaCA9ICZoYXNoX3RhYmxlW2ldOwotCi0JcHJpbnRmKCJoYXNoIDB4JXg6XG4iLCBpKTsKLQotCXdoaWxlIChoKQotCSAgewotCSAgICBwcmludGYoImgtPm9wY29kZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwgaC0+b3Bjb2RlLCBoLT5jb3VudCk7Ci0JICAgIGggPSBoLT5uZXh0OwotCSAgfQotCi0JcHJpbnRmKCJcblxuIik7Ci0gICAgICB9Ci0gICAgZmZsdXNoIChzdGRvdXQpOwotICB9Ci0jZW5kaWYKLSAgCi19Ci0KLQotdm9pZAotc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcXVpdHRpbmc7Ci17Ci0gIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotaW50Ci1zaW1fdHJhY2UgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSNpZmRlZiBERUJVRwotICBtbjEwMjAwX2RlYnVnID0gREVCVUc7Ci0jZW5kaWYKLSAgc2ltX3Jlc3VtZSAoc2QsIDAsIDApOwotICByZXR1cm4gMTsKLX0KLQotdm9pZAotc2ltX2luZm8gKHNkLCB2ZXJib3NlKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHZlcmJvc2U7Ci17Ci0gICgqbW4xMDIwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDIwMF9jYWxsYmFjaywgInNpbV9pbmZvXG4iKTsKLX0KLQotU0lNX1JDCi1zaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgYWJmZCwgYXJndiwgZW52KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52OwotewotICBpZiAoYWJmZCAhPSBOVUxMKQotICAgIFBDID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZWxzZQotICAgIFBDID0gMDsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotdm9pZAotc2ltX3NldF9jYWxsYmFja3MgKHApCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci17Ci0gIG1uMTAyMDBfY2FsbGJhY2sgPSBwOwotfQotCi0vKiBBbGwgdGhlIGNvZGUgZm9yIGV4aXRpbmcsIHNpZ25hbHMsIGV0YyBuZWVkcyB0byBiZSByZXZhbXBlZC4KLQotICAgVGhpcyBpcyBlbm91Z2ggdG8gZ2V0IGMtdG9ydHVyZSBsaW1waW5nIHRob3VnaC4gICovCi0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247Ci0gICAgIGludCAqc2lncmM7Ci17Ci0gIGlmIChTdGF0ZS5leGl0ZWQpCi0gICAgKnJlYXNvbiA9IHNpbV9leGl0ZWQ7Ci0gIGVsc2UKLSAgICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci0gIGlmIChTdGF0ZS5leGNlcHRpb24gPT0gU0lHUVVJVCkKLSAgICAqc2lncmMgPSAwOwotICBlbHNlCi0gICAgKnNpZ3JjID0gU3RhdGUuZXhjZXB0aW9uOwotfQotCi1pbnQKLXNpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgbGVuZ3RoOwotewotICBwdXRfd29yZCAobWVtb3J5LCBTdGF0ZS5yZWdzW3JuXSk7Ci0gIHJldHVybiAtMTsKLX0KLSAKLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIFN0YXRlLnJlZ3Nbcm5dID0gZ2V0X3dvcmQgKG1lbW9yeSk7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fcmVhZCAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIGJ1ZmZlcltpXSA9IGxvYWRfYnl0ZSAoYWRkciArIGkpOwotCi0gIHJldHVybiBzaXplOwotfSAKLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17Ci0gICgqbW4xMDIwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDIwMF9jYWxsYmFjaywgIlwiJXNcIiBpcyBub3QgYSB2YWxpZCBtbjEwMjAwIHNpbXVsYXRvciBjb21tYW5kLlxuIiwgY21kKTsKLX0KLQotU0lNX1JDCi1zaW1fbG9hZCAoc2QsIHByb2csIGFiZmQsIGZyb21fdHR5KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqcHJvZzsKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIGV4dGVybiBiZmQgKnNpbV9sb2FkX2ZpbGUgKCk7IC8qID8/PyBEb24ndCBrbm93IHdoZXJlIHRoaXMgc2hvdWxkIGxpdmUuICAqLwotICBiZmQgKnByb2dfYmZkOwotCi0gIHByb2dfYmZkID0gc2ltX2xvYWRfZmlsZSAoc2QsIG15bmFtZSwgbW4xMDIwMF9jYWxsYmFjaywgcHJvZywgYWJmZCwKLQkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLQkJCSAgICAwLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19IApkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvbW4xMDIwMF9zaW0uaCBiL3NpbS9tbjEwMjAwL21uMTAyMDBfc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjdjNGQuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAyMDAvbW4xMDIwMF9zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgaW5saW5lCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLWV4dGVybiBob3N0X2NhbGxiYWNrICptbjEwMjAwX2NhbGxiYWNrOwotCi0jZGVmaW5lIERFQlVHX1RSQUNFCQkweDAwMDAwMDAxCi0jZGVmaW5lIERFQlVHX1ZBTFVFUwkJMHgwMDAwMDAwMgotCi1leHRlcm4gaW50IG1uMTAyMDBfZGVidWc7Ci0KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBTSUdORUQgc2lnbmVkCi0jZWxzZQotI2RlZmluZSBTSUdORUQKLSNlbmRpZgotCi0jaWYgVUNIQVJfTUFYID09IDI1NQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4OwotdHlwZWRlZiBTSUdORUQgY2hhciBpbnQ4OwotI2Vsc2UKLWVycm9yICJDaGFyIGlzIG5vdCBhbiA4LWJpdCB0eXBlIgotI2VuZGlmCi0KLSNpZiBTSFJUX01BWCA9PSAzMjc2NwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTY7Ci10eXBlZGVmIFNJR05FRCBzaG9ydCBpbnQxNjsKLSNlbHNlCi1lcnJvciAiU2hvcnQgaXMgbm90IGEgMTYtYml0IHR5cGUiCi0jZW5kaWYKLQotI2lmIElOVF9NQVggPT0gMjE0NzQ4MzY0NwotCi10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Ci10eXBlZGVmIFNJR05FRCBpbnQgaW50MzI7Ci0KLSNlbHNlCi0jICBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50MzI7Ci10eXBlZGVmIFNJR05FRCBsb25nIGludDMyOwotCi0jICBlbHNlCi0gIGVycm9yICJOZWl0aGVyIGludCBub3IgbG9uZyBpcyBhIDMyLWJpdCB0eXBlIgotIyAgZW5kaWYKLSNlbmRpZgotCi10eXBlZGVmIHVpbnQzMiByZWdfdDsKLQotc3RydWN0IHNpbW9wcyAKLXsKLSAgbG9uZyBvcGNvZGU7Ci0gIGxvbmcgbWFzazsKLSAgdm9pZCAoKmZ1bmMpKCk7Ci0gIGludCBsZW5ndGg7Ci0gIGludCBmb3JtYXQ7Ci0gIGludCBudW1vcHM7Ci0gIGludCBvcGVyYW5kc1sxNl07Ci19OwotCi0vKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yOyByZWdpc3RlcnMsIG1lbW9yeSwgZXRjLiAgKi8KLQotc3RydWN0IF9zdGF0ZQotewotICByZWdfdCByZWdzWzExXTsJCS8qIHJlZ2lzdGVycywgZDAtZDMsIGEwLWEzLCBwYywgbWRyLCBwc3cgKi8KLSAgdWludDggKm1lbTsJCQkvKiBtYWluIG1lbW9yeSAqLwotICBpbnQgZXhjZXB0aW9uOwkJLyogQWN0dWFsbHkgYSBzaWduYWwgbnVtYmVyLiAgKi8KLSAgaW50IGV4aXRlZDsJCQkvKiBEaWQgdGhlIHByb2dyYW0gZXhpdD8gKi8KLX0gU3RhdGU7Ci0KLWV4dGVybiB1aW50MzIgT1BbNF07Ci1leHRlcm4gc3RydWN0IHNpbW9wcyBTaW1vcHNbXTsKLQotI2RlZmluZSBQQwkoU3RhdGUucmVnc1s4XSkKLQotI2RlZmluZSBQU1cgKFN0YXRlLnJlZ3NbMTBdKQotI2RlZmluZSBQU1dfWkYgMHgxCi0jZGVmaW5lIFBTV19ORiAweDIKLSNkZWZpbmUgUFNXX0NGIDB4NAotI2RlZmluZSBQU1dfVkYgMHg4Ci0jZGVmaW5lIFBTV19aWCAweDEwCi0jZGVmaW5lIFBTV19OWCAweDIwCi0jZGVmaW5lIFBTV19DWCAweDQwCi0jZGVmaW5lIFBTV19WWCAweDgwCi0KLSNkZWZpbmUgUkVHX0QwIDAKLSNkZWZpbmUgUkVHX0EwIDQKLSNkZWZpbmUgUkVHX1NQIDcKLSNkZWZpbmUgUkVHX1BDIDgKLSNkZWZpbmUgUkVHX01EUiA5Ci0jZGVmaW5lIFJFR19QU1cgMTAKLQotI2RlZmluZSBTRVhUMyh4KQkoKCgoeCkmMHg3KV4ofjB4MykpKzB4NCkJCi0KLS8qIHNpZ24tZXh0ZW5kIGEgNC1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ0KHgpCSgoKCh4KSYweGYpXih+MHg3KSkrMHg4KQkKLQotLyogc2lnbi1leHRlbmQgYSA1LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDUoeCkJKCgoKHgpJjB4MWYpXih+MHhmKSkrMHgxMCkJCi0KLS8qIHNpZ24tZXh0ZW5kIGFuIDgtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUOCh4KQkoKCgoeCkmMHhmZileKH4weDdmKSkrMHg4MCkKLQotLyogc2lnbi1leHRlbmQgYSA5LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDkoeCkJKCgoKHgpJjB4MWZmKV4ofjB4ZmYpKSsweDEwMCkKLQotLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkmMHhmZmZmKV4ofjB4N2ZmZikpKzB4ODAwMCkKLQotLyogc2lnbi1leHRlbmQgYSAyMi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQyMih4KQkoKCgoeCkmMHgzZmZmZmYpXih+MHgxZmZmZmYpKSsweDIwMDAwMCkKLQotLyogc2lnbi1leHRlbmQgYSAyNC1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQyNCh4KQkoKCgoeCkmMHhmZmZmZmYpXih+MHg3ZmZmZmYpKSsweDgwMDAwMCkKLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBTSUdUUkFQIDUKLSNkZWZpbmUgU0lHUVVJVCAzCi0jZW5kaWYKLQotZXh0ZXJuIGludCBtYXhfbWVtOwotCi0jZGVmaW5lIGxvYWRfbWVtX2JpZyhhZGRyLGxlbikgXAotICAobGVuID09IDEgPyAqKCgoYWRkcikgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW0pIDogXAotICAgbGVuID09IDIgPyAoKCooKChhZGRyKSAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbSkgPDwgOCkgXAotCSAgICAgICB8ICooKCgoYWRkcikgKyAxKSAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbSkpIDogXAotICAgCSAgICAgICgoKigoKGFkZHIpICYgMHhmZmZmZmYpICsgU3RhdGUubWVtKSA8PCAxNikgXAotCSAgICAgICB8ICgqKCgoKGFkZHIpICsgMSkgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW0pIDw8IDgpIFwKLQkgICAgICAgfCAqKCgoKGFkZHIpICsgMikgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW0pKSkKLQotc3RhdGljIElOTElORSB1aW50MzIKLWxvYWRfYnl0ZSAoYWRkcikKLSAgICAgU0lNX0FERFIgYWRkcjsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHJldHVybiBwWzBdOwotfQotCi1zdGF0aWMgSU5MSU5FIHVpbnQzMgotbG9hZF9oYWxmIChhZGRyKQotICAgICBTSU1fQUREUiBhZGRyOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHBbMV0gPDwgOCB8IHBbMF07Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdWludDMyCi1sb2FkXzNfYnl0ZSAoYWRkcikKLSAgICAgU0lNX0FERFIgYWRkcjsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHJldHVybiBwWzJdIDw8IDE2IHwgcFsxXSA8PCA4IHwgcFswXTsKLX0KLQotc3RhdGljIElOTElORSB1aW50MzIKLWxvYWRfd29yZCAoYWRkcikKLSAgICAgU0lNX0FERFIgYWRkcjsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHJldHVybiBwWzNdIDw8IDI0IHwgcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdWludDMyCi1sb2FkX21lbSAoYWRkciwgbGVuKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICBpbnQgbGVuOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBwWzBdOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBwWzFdIDw8IDggfCBwWzBdOwotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBwWzJdIDw8IDE2IHwgcFsxXSA8PCA4IHwgcFswXTsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gcFszXSA8PCAyNCB8IHBbMl0gPDwgMTYgfCBwWzFdIDw8IDggfCBwWzBdOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc3RvcmVfYnl0ZSAoYWRkciwgZGF0YSkKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdWludDMyIGRhdGE7Ci17Ci0gIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07Ci0KLSNpZmRlZiBDSEVDS19BRERSCi0gIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBwWzBdID0gZGF0YTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1zdG9yZV9oYWxmIChhZGRyLCBkYXRhKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHBbMF0gPSBkYXRhOwotICBwWzFdID0gZGF0YSA+PiA4OwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXN0b3JlXzNfYnl0ZSAoYWRkciwgZGF0YSkKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdWludDMyIGRhdGE7Ci17Ci0gIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07Ci0KLSNpZmRlZiBDSEVDS19BRERSCi0gIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBwWzBdID0gZGF0YTsKLSAgcFsxXSA9IGRhdGEgPj4gODsKLSAgcFsyXSA9IGRhdGEgPj4gMTY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc3RvcmVfd29yZCAoYWRkciwgZGF0YSkKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdWludDMyIGRhdGE7Ci17Ci0gIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07Ci0KLSNpZmRlZiBDSEVDS19BRERSCi0gIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBwWzBdID0gZGF0YTsKLSAgcFsxXSA9IGRhdGEgPj4gODsKLSAgcFsyXSA9IGRhdGEgPj4gMTY7Ci0gIHBbM10gPSBkYXRhID4+IDI0OwotfQotCi0vKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAqLwotCi11aW50MzIgZ2V0X3dvcmQgUEFSQU1TICgodWludDggKikpOwotdm9pZCBwdXRfd29yZCBQQVJBTVMgKCh1aW50OCAqLCB1aW50MzIpKTsKLQotZXh0ZXJuIHVpbnQ4ICptYXAgUEFSQU1TICgoU0lNX0FERFIgYWRkcikpOwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvc2ltb3BzLmMgYi9zaW0vbW4xMDIwMC9zaW1vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjZWNjYS4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDIwMC9zaW1vcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NDkgKzAsMCBAQAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSAibW4xMDIwMF9zaW0uaCIKLSNpbmNsdWRlICJzaW1vcHMuaCIKLSNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2RlZmluZSBSRUcwKFgpICgoWCkgJiAweDMpCi0jZGVmaW5lIFJFRzEoWCkgKCgoWCkgJiAweGMpID4+IDIpCi0jZGVmaW5lIFJFRzBfNChYKSAoKChYKSAmIDB4MzApID4+IDQpCi0jZGVmaW5lIFJFRzBfOChYKSAoKChYKSAmIDB4MzAwKSA+PiA4KQotI2RlZmluZSBSRUcxXzgoWCkgKCgoWCkgJiAweGMwMCkgPj4gMTApCi0jZGVmaW5lIFJFRzBfMTYoWCkgKCgoWCkgJiAweDMwMDAwKSA+PiAxNikKLSNkZWZpbmUgUkVHMV8xNihYKSAoKChYKSAmIDB4YzAwMDApID4+IDE4KQotI2RlZmluZSBUUlVOQyhYKSAoKFgpICYgMHhmZmZmZmYpCi0MCi0vKiBtb3YgaW1tOCwgZG4gKi8KLXZvaWQgT1BfODAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IFNFWFQ4IChpbnNuICYgMHhmZik7Ci19Ci0KLS8qIG1vdiBkbiwgZG0gKi8KLXZvaWQgT1BfODAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci19Ci0KLS8qIG1vdiBkbSwgYW4gKi8KLXZvaWQgT1BfRjIzMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLX0KLQotLyogbW92IGFuLCBkbSAqLwotdm9pZCBPUF9GMkYwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOwotfQotCi0vKiBtb3YgYW4sIGFtICovCi12b2lkIE9QX0YyNzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Ci19Ci0KLS8qIG1vdiBwc3csIGRuICovCi12b2lkIE9QX0YzRjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gUFNXICYgMHhmZmZmOwotfQotCi0vKiBtb3YgZG4sIHBzdyAqLwotdm9pZCBPUF9GM0QwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBQU1cgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSAmIDB4ZmZmZiA7Ci19Ci0KLS8qIG1vdiBtZHIsIGRuICovCi12b2lkIE9QX0YzRTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfTURSXSAmIDB4ZmZmZjsKLX0KLQotLyogbW92IGRuLCBtZHIgKi8KLXZvaWQgT1BfRjNDMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHhmZmZmOwotfQotCi0vKiBtb3YgKGFuKSwgZG0gKi8KLXZvaWQgT1BfMjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCi0gICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0pKTsKLX0KLQotLyogbW92IChkOCxhbiksIGRtICovCi12b2lkIE9QXzYwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KLSAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQotCQkJICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKLX0KLQotLyogbW92IChkMTYsYW4pLCBkbSAqLwotdm9pZCBPUF9GN0MwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KLQkgICAgICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKSk7Ci19Ci0KLS8qIG1vdiAoZDI0LGFtKSwgZG4gKi8KLXZvaWQgT1BfRjQ4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildCi0JCQkgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOwotfQotCi0vKiBtb3YgKGRpLGFuKSwgZG0gKi8KLXZvaWQgT1BfRjE0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KLSAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KLQkJCSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pKSk7Ci19Ci0KLS8qIG1vdiAoYWJzMTYpLCBkbiAqLwotdm9pZCBPUF9DODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDE2IChsb2FkX2hhbGYgKChpbnNuICYgMHhmZmZmKSkpOwotfQotCi0vKiBtb3YgKGFiczI0KSwgZG4gKi8KLXZvaWQgT1BfRjRDMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSk7Ci19Ci0KLS8qIG1vdiAoZDgsYW4pLCBhbSAqLwotdm9pZCBPUF83MDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildCi0gICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQotCQkJICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKLX0KLQotLyogbW92IChkMTYsYW4pLCBhbSAqLwotdm9pZCBPUF9GN0IwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCQkJICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpKTsKLX0KLQotLyogbW92IChkMjQsYW0pLCBhbiAqLwotdm9pZCBPUF9GNEYwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCQkJICAgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOwotfQotCi0vKiBtb3YgKGRpLGFuKSwgYW0gKi8KLXZvaWQgT1BfRjEwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KLSAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQotCQkJICAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKSkpOwotfQotCi0vKiBtb3YgKGFiczE2KSwgYW4gKi8KLXZvaWQgT1BfRjczMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDI0IChsb2FkXzNfYnl0ZSAoKGluc24gJiAweGZmZmYpKSk7Ci19Ci0KLS8qIG1vdiAoYWJzMjQpLCBhbiAqLwotdm9pZCBPUF9GNEQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKCgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSkpOwotfQotCi0vKiBtb3YgZG0sIChhbikgKi8KLXZvaWQgT1BfMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0sCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotfQotCi0vKiBtb3YgZG0sIChkOCxhbikgKi8KLXZvaWQgT1BfNDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbSwgKGQxNixhbikgKi8KLXZvaWQgT1BfRjc4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbSwgKGQyNCxhbSkgKi8KLXZvaWQgT1BfRjQwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCSAgICAgICArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGRtLCAoZGksYW4pICovCi12b2lkIE9QX0YxQzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQotCSAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKLX0KLQotLyogbW92IGRuLCAoYWJzMTYpICovCi12b2lkIE9QX0MwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbiwgKGFiczI0KSAqLwotdm9pZCBPUF9GNDQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSwKLQkgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoZDgsYW4pICovCi12b2lkIE9QXzUwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlXzNfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCi0JCVN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0pOwotfQotCi0vKiBtb3YgYW0sIChkMTYsYW4pICovCi12b2lkIE9QX0Y3QTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV8zX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSwKLQkJU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgYW0sIChkMjQsYW4pICovCi12b2lkIE9QX0Y0MTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCQkgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSwKLQkJU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgYW0sIChkaSxhbikgKi8KLXZvaWQgT1BfRjE4MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KLQkgICAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pLAotCQlTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBhbiwgKGFiczE2KSAqLwotdm9pZCBPUF9GNzIwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfM19ieXRlICgoaW5zbiAmIDB4ZmZmZiksIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGFuLCAoYWJzMjQpICovCi12b2lkIE9QX0Y0NTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV8zX2J5dGUgKFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbiksCi0JCVN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGltbTE2LCBkbiAqLwotdm9pZCBPUF9GODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDE2IChpbnNuICYgMHhmZmZmKTsKLX0KLQotLyogbW92IGltbTI0LCBkbiAqLwotdm9pZCBPUF9GNDcwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7Ci19Ci0KLS8qIG1vdiBpbW0xNiwgYW4gKi8KLXZvaWQgT1BfREMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IGluc24gJiAweGZmZmY7Ci19Ci0KLS8qIG1vdiBpbW0yNCwgYW4gKi8KLXZvaWQgT1BfRjQ3NDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOwotfQotCi0vKiBtb3Z4IChkOCxhbiksIGRtICovCi12b2lkIE9QX0Y1NzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQotICAgID0gU0VYVDI0IChsb2FkXzNfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV84IChpbnNuKV0KLQkJCSAgICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKLX0KLQotLyogbW92eCAoZDE2LGFuKSwgZG0gKi8KLXZvaWQgT1BfRjc3MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KLQkJCSAgICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpKTsKLX0KLQotLyogbW92eCAoZDI0LGFtKSwgZG4gKi8KLXZvaWQgT1BfRjRCMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KLQkJCSAgICsgU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSkpKTsKLX0KLQotLyogbW92eCBkbSwgKGQ4LGFuKSAqLwotdm9pZCBPUF9GNTUwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlXzNfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCi0JCVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOwotfQotCi0vKiBtb3Z4IGRtLCAoZDE2LGFuKSAqLwotdm9pZCBPUF9GNzYwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfM19ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXSArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZiksCi0JCVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92eCBkbSwgKGQyNCxhbSkgKi8KLXZvaWQgT1BfRjQzMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlXzNfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildCi0JCSArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpLAotCQlTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmIgKGQ4LGFuKSwgZG0gKi8KLXZvaWQgT1BfRjUyMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildCi0gICAgPSBTRVhUOCAobG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQotCQkJKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSkpOwotfQotCi0vKiBtb3ZiIChkMTYsYW4pLCBkbSAqLwotdm9pZCBPUF9GN0QwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQ4IChsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCQkJKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSkpOwotfQotCi0vKiBtb3ZiIChkMjQsYW0pLCBkbiAqLwotdm9pZCBPUF9GNEEwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IFNFWFQ4IChsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCQkJKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOwotfQotCi0vKiBtb3ZiIChkaSxhbiksIGRtICovCi12b2lkIE9QX0YwNDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCi0gICAgPSBTRVhUOCAobG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KLQkJCSsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXSkpKTsKLX0KLQotLyogbW92IChhYnMyNCksIGRuICovCi12b2lkIE9QX0Y0QzQwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gU0VYVDggKGxvYWRfYnl0ZSAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSk7Ci19Ci0KLS8qIG1vdmIgZG0sIChhbikgKi8KLXZvaWQgT1BfMTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKLX0KLQotLyogbW92YiBkbSwgKGQ4LGFuKSAqLwotdm9pZCBPUF9GNTEwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOwotfQotCi0vKiBtb3ZiIGRtLCAoZDE2LGFuKSAqLwotdm9pZCBPUF9GNzkwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLX0KLQotLyogbW92YiBkbSwgKGQyNCxhbSkgKi8KLXZvaWQgT1BfRjQyMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotCSAgICAgICsgU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZiIGRtLCAoZGksYW4pICovCi12b2lkIE9QX0YwQzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQotCSAgICAgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotfQotCi0vKiBtb3ZiIGRuLCAoYWJzMTYpICovCi12b2lkIE9QX0M0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmIgZG4sIChhYnMyNCkgKi8KLXZvaWQgT1BfRjQ0NDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbiksCi0JICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmJ1IChhbiksIGRtICovCi12b2lkIE9QXzMwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotICAgID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmJ1IChkOCxhbiksIGRtICovCi12b2lkIE9QX0Y1MzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKLX0KLQotLyogbW92YnUgKGQxNixhbiksIGRtICovCi12b2lkIE9QX0Y3NTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KLQkJICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKTsKLX0KLQotLyogbW92YnUgKGQyNCxhbSksIGRuICovCi12b2lkIE9QX0Y0OTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KLQkJICArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpKTsKLX0KLQotLyogbW92YnUgKGRpLGFuKSwgZG0gKi8KLXZvaWQgT1BfRjA4MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KLSAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildCi0JCSAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKSk7Ci19Ci0KLS8qIG1vdmJ1IChhYnMxNiksIGRuICovCi12b2lkIE9QX0NDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSBsb2FkX2J5dGUgKChpbnNuICYgMHhmZmZmKSk7Ci19Ci0KLS8qIG1vdmJ1IChhYnMyNCksIGRuICovCi12b2lkIE9QX0Y0QzgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpOwotfQotCi0vKiBleHQgZG4gKi8KLXZvaWQgT1BfRjNDMSAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaWYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHg4MDAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAweGZmZmY7Ci0gIGVsc2UKLSAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gMDsKLX0KLQotLyogZXh0eCBkbiAqLwotdm9pZCBPUF9CMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTRVhUMTYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKLX0KLQotLyogZXh0eHUgZG4gKi8KLXZvaWQgT1BfQjQgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmY7Ci19Ci0KLS8qIGV4dHhiIGRuICovCi12b2lkIE9QX0I4IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFNFWFQ4IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Ci19Ci0KLS8qIGV4dHhidSBkbiAqLwotdm9pZCBPUF9CQyAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmY7Ci19Ci0KLS8qIGFkZCBkbixkbSAqLwotdm9pZCBPUF85MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotICByZWcyID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKLSAgdmFsdWUgPSBUUlVOQyAocmVnMSArIHJlZzIpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQotICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzIgJiAweGZmZmYpKTsKLSAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgPT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBhZGQgZG0sIGFuICovCi12b2lkIE9QX0YyMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKLSAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgKyByZWcyKTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKLSAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDApID09IChyZWcxICYgMHg4MDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogYWRkIGFuLCBkbSAqLwotdm9pZCBPUF9GMkMwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgcmVnMik7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCi0gICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMiAmIDB4ZmZmZikpOwotICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwKSA9PSAocmVnMSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApID09IChyZWcxICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIGFkZCBhbixhbSAqLwotdm9pZCBPUF9GMjQwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgcmVnMik7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCi0gICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMiAmIDB4ZmZmZikpOwotICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwKSA9PSAocmVnMSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApID09IChyZWcxICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW04LCBkbiAqLwotdm9pZCBPUF9ENDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoU0VYVDggKGluc24gJiAweGZmKSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCi0gICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgPT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApID09IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogYWRkIGltbTE2LCBkbiAqLwotdm9pZCBPUF9GNzE4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci0gIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLSAgdmFsdWUgPSBUUlVOQyAocmVnMSArIGltbSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCi0gICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgPT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApID09IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogYWRkIGltbTI0LGRuICovCi12b2lkIE9QX0Y0NjAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgaW1tKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKLSAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKLSAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwKSA9PSAoaW1tICYgMHg4MDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBhZGQgaW1tOCwgYW4gKi8KLXZvaWQgT1BfRDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKFNFWFQ4IChpbnNuICYgMHhmZikpOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgaW1tKTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQotICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDApID09IChpbW0gJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW0xNiwgYW4gKi8KLXZvaWQgT1BfRjcwODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQotICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDApID09IChpbW0gJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW0yNCwgYW4gKi8KLXZvaWQgT1BfRjQ2NDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKSB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKLSAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwKSA9PSAoaW1tICYgMHg4MDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBhZGRjIGRtLGRuICovCi12b2lkIE9QX0YyODAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKLSAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgKyByZWcyICsgKChQU1cgJiBQU1dfQ0YpICE9IDApKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKLSAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDApID09IChyZWcxICYgMHg4MDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogYWRkbmYgaW1tOCwgYW4gKi8KLXZvaWQgT1BfRjUwQzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV07Ci0gIGltbSA9IFNFWFQ4IChpbnNuICYgMHhmZik7Ci0gIHZhbHVlID0gcmVnMSArIGltbTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSA9IFRSVU5DICh2YWx1ZSk7Ci19Ci0KLS8qIHN1YiBkbiwgZG0gKi8KLXZvaWQgT1BfQTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKLSAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzIgLSByZWcxKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpID4gKHJlZzIgJiAweGZmZmYpKTsKLSAgY3ggPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwKSAhPSAocmVnMSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApICE9IChyZWcxICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIHN1YiBkbSwgYW4gKi8KLXZvaWQgT1BfRjIxMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotICByZWcyID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKLSAgdmFsdWUgPSBUUlVOQyAocmVnMiAtIHJlZzEpOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPiAocmVnMiAmIDB4ZmZmZikpOwotICBjeCA9IChyZWcxID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDApICE9IChyZWcxICYgMHg4MDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogc3ViIGFuLCBkbSAqLwotdm9pZCBPUF9GMkQwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBzdWIgYW4sIGFtICovCi12b2lkIE9QX0YyNTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildKTsKLSAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzIgLSByZWcxKTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpID4gKHJlZzIgJiAweGZmZmYpKTsKLSAgY3ggPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwKSAhPSAocmVnMSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApICE9IChyZWcxICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIHN1YiBpbW0xNiwgZG4gKi8KLXZvaWQgT1BfRjcxQzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBzdWIgaW1tMjQsIGRuICovCi12b2lkIE9QX0Y0NjgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9IChyZWcxIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogc3ViIGltbTE2LCBhbiAqLwotdm9pZCBPUF9GNzBDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSk7Ci0gIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLSAgdmFsdWUgPSBUUlVOQyAocmVnMSAtIGltbSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKLSAgY3ggPSAocmVnMSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDApICE9IChpbW0gJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci19Ci0KLS8qIHN1YiBpbW0yNCwgYW4gKi8KLXZvaWQgT1BfRjQ2QzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBzdWJjIGRtLCBkbiAqLwotdm9pZCBPUF9GMjkwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSAtICgoUFNXICYgUFNXX0NGKSAhPSAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotfQotCi0vKiBtdWwgZG4sIGRtICovCi12b2lkIE9QX0YzNDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgdGVtcCA9IChTRVhUMTYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmKQotICAgICAgICAgICogIFNFWFQxNiAoKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHhmZmZmKSkpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgPj4gMTY7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0vKiBtdWx1IGRuLCBkbSAqLwotdm9pZCBPUF9GMzUwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIHRlbXAgPSAoKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmKQotICAgICAgICAgICogIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgPj4gMTY7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0KLS8qIGRpdnUgZG0sIGRuICovCi12b2lkIE9QX0YzNjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX01EUl07Ci0gIHRlbXAgJj0gMHhmZmZmOwotICB0ZW1wIDw8PSAxNjsKLSAgdGVtcCB8PSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAKLQkJCSAgJSAodW5zaWduZWQgbG9uZykoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0gJiAweGZmZmYpKTsKLSAgdGVtcCAvPSAodW5zaWduZWQgbG9uZykoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0gJiAweGZmZmYpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmY7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0vKiBjbXAgaW1tOCwgZG4gKi8KLXZvaWQgT1BfRDgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKFNFWFQ4IChpbnNuICYgMHhmZikpOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9IChyZWcxIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLX0KLQotLyogY21wIGRuLCBkbSAqLwotdm9pZCBPUF9GMzkwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKLX0KLQotLyogY21wIGRtLCBhbiAqLwotdm9pZCBPUF9GMjIwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKLX0KLQotLyogY21wIGFuLCBkbSAqLwotdm9pZCBPUF9GMkUwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKLX0KLQotLyogY21wIGFuLCBhbSAqLwotdm9pZCBPUF9GMjYwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKLX0KLQotLyogY21wIGltbTE2LCBkbiAqLwotdm9pZCBPUF9GNzQ4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Ci0gIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLSAgdmFsdWUgPSBUUlVOQyAocmVnMSAtIGltbSk7Ci0KLSAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOwotICB6eCA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7Ci0gIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOwotICBjID0gKChyZWcxICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKLSAgY3ggPSAocmVnMSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDApICE9IChpbW0gJiAweDgwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOwotICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDApCi0gICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCi0JICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCi0JICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKLQkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKCBuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkpOwotfQotCi0vKiBjbXAgaW1tMjQsIGRuICovCi12b2lkIE9QX0Y0NzgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9IChyZWcxIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAoIG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKSk7Ci19Ci0KLS8qIGNtcCBpbW0xNiwgYW4gKi8KLXZvaWQgT1BfRUMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKLSAgaW1tID0gVFJVTkMgKGluc24gJiAweGZmZmYpOwotICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKLQotICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7Ci0gIHp4ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKTsKLSAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7Ci0gIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOwotICBjeCA9IChyZWcxIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7Ci0gIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKLSAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKLQkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKLQkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKLQkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQotCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKLQotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAoIG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKSk7Ci19Ci0KLS8qIGNtcCBpbW0yNCwgYW4gKi8KLXZvaWQgT1BfRjQ3QzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOwotICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7Ci0gIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOwotCi0gIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKLSAgenggPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDApOwotICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKLSAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7Ci0gIGN4ID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKLSAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQotICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgotCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQotCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQotCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCi0JICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCi0JICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKLX0KLQotLyogYW5kIGRuLCBkbSAqLwotdm9pZCBPUF9GMzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Ci19Ci0KLS8qIGFuZCBpbW04LCBkbiAqLwotdm9pZCBPUF9GNTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAoaW5zbiAmIDB4ZmYpOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmPSB+MHhmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildIHw9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApKTsKLX0KLQotLyogYW5kIGltbTE2LCBkbiAqLwotdm9pZCBPUF9GNzAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAoaW5zbiAmIDB4ZmZmZik7Ci0gIHRlbXAgJj0gMHhmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmPSB+MHhmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSB8PSB0ZW1wOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHhmZmZmKSA9PSAwOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApKTsKLX0KLQotLyogYW5kIGltbTE2LCBwc3cgKi8KLXZvaWQgT1BfRjcxMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFBTVyAmPSAoaW5zbiAmIDB4ZmZmZik7Ci19Ci0KLS8qIG9yIGRuLCBkbSAqLwotdm9pZCBPUF9GMzEwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSB8IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Ci19Ci0KLS8qIG9yIGltbTgsIGRuICovCi12b2lkIE9QX0Y1MDgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSB8IChpbnNuICYgMHhmZik7Ci0gIHRlbXAgJj0gMHhmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHhmZmZmKSA9PSAwOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0vKiBvciBpbW0xNiwgZG4gKi8KLXZvaWQgT1BfRjc0MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildIHwgKGluc24gJiAweGZmZmYpOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJj0gfjB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Ci19Ci0KLS8qIG9yIGltbTE2LCBwc3cgKi8KLXZvaWQgT1BfRjcxNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFBTVyB8PSAoaW5zbiAmIDB4ZmZmZik7Ci19Ci0KLS8qIHhvciBkbiwgZG0gKi8KLXZvaWQgT1BfRjMyMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gXiBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgdGVtcCAmPSAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0vKiB4b3IgaW1tMTYsIGRuICovCi12b2lkIE9QX0Y3NEMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSBeIChpbnNuICYgMHhmZmZmKTsKLSAgdGVtcCAmPSAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildIHw9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOwotfQotCi0vKiBub3QgZG4gKi8KLXZvaWQgT1BfRjNFNCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gflN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Ci19Ci0KLS8qIGFzciBkbiAqLwotdm9pZCBPUF9GMzM4IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBsb25nIHRlbXA7Ci0gIGludCB6LCBuLCBjLCBoaWdoOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZjsKLSAgYyA9IHRlbXAgJiAxOwotICBoaWdoID0gdGVtcCAmIDB4ODAwMDsKLSAgdGVtcCA+Pj0gMTsKLSAgdGVtcCB8PSBoaWdoOwotICB0ZW1wICY9IDB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSB8IChjID8gUFNXX0NGIDogMCkpOwotfQotCi0vKiBsc3IgZG4gKi8KLXZvaWQgT1BfRjMzQyAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIG4sIGM7Ci0gIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmY7Ci0gIGMgPSB0ZW1wICYgMTsKLSAgdGVtcCA+Pj0gMTsKLSAgdGVtcCAmPSAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkgfCAoYyA/IFBTV19DRiA6IDApKTsKLX0KLQotLyogcm9yIGRuICovCi12b2lkIE9QX0YzMzQgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBjLG4sejsKLQotICB2YWx1ZSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmOwotICBjID0gKHZhbHVlICYgMHgxKTsKLQotICB2YWx1ZSA+Pj0gMTsKLSAgdmFsdWUgfD0gKFBTVyAmIFBTV19DRiA/IDB4ODAwMCA6IDApOwotICB2YWx1ZSAmPSAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKSk7Ci19Ci0KLS8qIHJvbCBkbiAqLwotdm9pZCBPUF9GMzMwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBpbnQgYyxuLHo7Ci0KLSAgdmFsdWUgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZjsKLSAgYyA9ICh2YWx1ZSAmIDB4ODAwMCkgPyAxIDogMDsKLQotICB2YWx1ZSA8PD0gMTsKLSAgdmFsdWUgfD0gKFBTVyAmIFBTV19DRiA/IDB4MSA6IDApOwotICB2YWx1ZSAmPSAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKSk7Ci19Ci0KLS8qIGJ0c3QgaW1tOCwgZG4gKi8KLXZvaWQgT1BfRjUwNDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6OwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildOwotICB0ZW1wICY9IChpbnNuICYgMHhmZik7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCk7Ci19Ci0KLS8qIGJ0c3QgaW1tMTYsIGRuICovCi12b2lkIE9QX0Y3MDQwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6LCBuLCBjOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXTsKLSAgYyA9IHRlbXAgJiAweDE7Ci0gIHRlbXAgJj0gKGluc24gJiAweGZmZmYpOwotICBuID0gKHRlbXAgJiAweDgwMDApICE9IDA7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKTsKLX0KLQotLyogYnNldCBkbSwgKGFuKSAqLwotdm9pZCBPUF9GMDIwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6OwotCi0gIHRlbXAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildKTsKLSAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pID09IDA7Ci0gIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildLCB0ZW1wKTsKLSAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCk7Ci19Ci0KLS8qIGJjbHIgZG0sIChhbikgKi8KLXZvaWQgT1BfRjAzMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICBpbnQgejsKLQotICB0ZW1wID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Ci0gIHogPSAodGVtcCAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKSA9PSAwOwotICB0ZW1wID0gdGVtcCAmIH5TdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0sIHRlbXApOwotICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOwotICBQU1cgfD0gKHogPyBQU1dfWkYgOiAwKTsKLX0KLQotLyogYmVxeCBsYWJlbDo4ICovCi12b2lkIE9QX0Y1RTgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKFBTVyAmIFBTV19aWCkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJuZXggbGFiZWw6OCAqLwotdm9pZCBPUF9GNUU5MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19aWCkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBiZ3R4IGxhYmVsOjggKi8KLXZvaWQgT1BfRjVFMTAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoISgoUFNXICYgUFNXX1pYKQotICAgICAgICB8fCAoKChQU1cgJiBQU1dfTlgpICE9IDApIF4gKChQU1cgJiBQU1dfVlgpICE9IDApKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBiZ2V4IGxhYmVsOjggKi8KLXZvaWQgT1BfRjVFMjAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoISgoKFBTVyAmIFBTV19OWCkgIT0gMCkgXiAoKFBTVyAmIFBTV19WWCkgIT0gMCkpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmxleCBsYWJlbDo4ICovCi12b2lkIE9QX0Y1RTMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKChQU1cgJiBQU1dfWlgpCi0gICAgICAgfHwgKCgoUFNXICYgUFNXX05YKSAhPSAwKSBeICgoUFNXICYgUFNXX1ZYKSAhPSAwKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBibHR4IGxhYmVsOjggKi8KLXZvaWQgT1BfRjVFMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfTlgpICE9IDApIF4gKChQU1cgJiBQU1dfVlgpICE9IDApKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmhpeCBsYWJlbDo4ICovCi12b2lkIE9QX0Y1RTUwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoKChQU1cgJiBQU1dfQ1gpICE9IDApIHx8IChQU1cgJiBQU1dfWlgpICE9IDApKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmNjeCBsYWJlbDo4ICovCi12b2lkIE9QX0Y1RTYwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoUFNXICYgUFNXX0NYKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJsc3ggbGFiZWw6OCAqLwotdm9pZCBPUF9GNUU3MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICgoKFBTVyAmIFBTV19DWCkgIT0gMCkgfHwgKFBTVyAmIFBTV19aWCkgIT0gMCkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJjc3ggbGFiZWw6OCAqLwotdm9pZCBPUF9GNUU0MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfQ1gpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBidmN4IGxhYmVsOjggKi8KLXZvaWQgT1BfRjVFQzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoIShQU1cgJiBQU1dfVlgpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYnZzeCBsYWJlbDo4ICovCi12b2lkIE9QX0Y1RUQwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKFBTVyAmIFBTV19WWCkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJuY3ggbGFiZWw6OCAqLwotdm9pZCBPUF9GNUVFMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19OWCkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBibnN4IGxhYmVsOjggKi8KLXZvaWQgT1BfRjVFRjAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoUFNXICYgUFNXX05YKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmVxIGxhYmVsOjggKi8KLXZvaWQgT1BfRTgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKFBTVyAmIFBTV19aRikKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJuZSBsYWJlbDo4ICovCi12b2lkIE9QX0U5MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19aRikpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBiZ3QgbGFiZWw6OCAqLwotdm9pZCBPUF9FMTAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoISgoUFNXICYgUFNXX1pGKQotICAgICAgICB8fCAoKChQU1cgJiBQU1dfTkYpICE9IDApIF4gKChQU1cgJiBQU1dfVkYpICE9IDApKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBiZ2UgbGFiZWw6OCAqLwotdm9pZCBPUF9FMjAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoISgoKFBTVyAmIFBTV19ORikgIT0gMCkgXiAoKFBTVyAmIFBTV19WRikgIT0gMCkpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmxlIGxhYmVsOjggKi8KLXZvaWQgT1BfRTMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKChQU1cgJiBQU1dfWkYpCi0gICAgICAgfHwgKCgoUFNXICYgUFNXX05GKSAhPSAwKSBeICgoUFNXICYgUFNXX1ZGKSAhPSAwKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBibHQgbGFiZWw6OCAqLwotdm9pZCBPUF9FMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfTkYpICE9IDApIF4gKChQU1cgJiBQU1dfVkYpICE9IDApKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmhpIGxhYmVsOjggKi8KLXZvaWQgT1BfRTUwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoKChQU1cgJiBQU1dfQ0YpICE9IDApIHx8IChQU1cgJiBQU1dfWkYpICE9IDApKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogYmNjIGxhYmVsOjggKi8KLXZvaWQgT1BfRTYwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoUFNXICYgUFNXX0NGKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJscyBsYWJlbDo4ICovCi12b2lkIE9QX0U3MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICgoKFBTVyAmIFBTV19DRikgIT0gMCkgfHwgKFBTVyAmIFBTV19aRikgIT0gMCkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIGJjcyBsYWJlbDo4ICovCi12b2lkIE9QX0U0MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfQ0YpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBidmMgbGFiZWw6OCAqLwotdm9pZCBPUF9GNUZDMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19WRikpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBidnMgbGFiZWw6OCAqLwotdm9pZCBPUF9GNUZEMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfVkYpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBibmMgbGFiZWw6OCAqLwotdm9pZCBPUF9GNUZFMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19ORikpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBibnMgbGFiZWw6OCAqLwotdm9pZCBPUF9GNUZGMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfTkYpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOwotfQotCi0vKiBicmEgbGFiZWw6OCAqLwotdm9pZCBPUF9FQTAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLX0KLQotLyogam1wIChhbikgKi8KLXZvaWQgT1BfRjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildIC0gMik7Ci19Ci0KLS8qIGptcCBsYWJlbDoxNiAqLwotdm9pZCBPUF9GQzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLX0KLQotLyogam1wIGxhYmVsOjI0ICovCi12b2lkIE9QX0Y0RTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19QQ10KLSAgICA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpOwotfQotCi0vKiBqc3IgKGFuKSAqLwotdm9pZCBPUF9GMDAxIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIHNwIC09IDQ7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKLSAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOwotICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKLSAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSAtIDIpOwotfQotCi0vKiBqc3IgbGFiZWw6MTYgKi8KLXZvaWQgT1BfRkQwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIHNwIC09IDQ7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMzsKLSAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOwotICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKLSAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLX0KLQotLyoganNyIGxhYmVsOjI0ICovCi12b2lkIE9QX0Y0RTEwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIHNwIC09IDQ7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgNTsKLSAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOwotICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKLSAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXQotICAgID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIHJ0cyAqLwotdm9pZCBPUF9GRSAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgaW50IHNwOwotCi0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBTdGF0ZS5yZWdzW1JFR19QQ10gPSAoU3RhdGUubWVtW3NwXSB8IChTdGF0ZS5tZW1bc3ArMV0gPDwgOCkKLQkgICAgICB8IChTdGF0ZS5tZW1bc3ArMl0gPDwgMTYpKTsKLSAgU3RhdGUucmVnc1tSRUdfUENdIC09IDE7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSA0OwotfQotCi0vKiBydGkgKi8KLXZvaWQgT1BfRUIgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFBTVyA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IGxvYWRfM19ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIDNdICsgMikgLSAxOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIDNdICs9IDY7Ci19Ci0KLS8qIHN5c2NhbGwgKi8KLXZvaWQgT1BfRjAxMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogV2UgdXNlIHRoaXMgZm9yIHNpbXVsYXRlZCBzeXN0ZW0gY2FsbHM7IHdlIG1heSBuZWVkIHRvIGNoYW5nZQotICAgICBpdCB0byBhIHJlc2VydmVkIGluc3RydWN0aW9uIGlmIHdlIGNvbmZsaWN0IHdpdGggdXNlcyBhdAotICAgICBNYXRzdXNoaXRhLiAgKi8KLSAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsJCi0gIGludCBvZmZzZXQgPSA2OwotICBlcnJubyA9IDA7Ci0KLS8qIFJlZ2lzdGVycyBwYXNzZWQgdG8gc3lzY2FsbCAwICovCi0KLS8qIEZ1bmN0aW9uIG51bWJlci4gICovCi0jZGVmaW5lIEZVTkMgICAoU3RhdGUucmVnc1swXSkKLQotI2RlZmluZSBQQVJNMSAgKFN0YXRlLnJlZ3NbMV0pCi0KLS8qIFBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBQQVJNKHgsIHkpIChsb2FkX21lbSAoU3RhdGUucmVnc1tSRUdfU1BdICsgeCwgeSkpCi0KLS8qIFJlZ2lzdGVycyBzZXQgYnkgc3lzY2FsbCAwICovCi0KLSNkZWZpbmUgUkVUVkFMIFN0YXRlLnJlZ3NbMF0JLyogcmV0dXJuIHZhbHVlICovCi0jZGVmaW5lIFJFVEVSUiBTdGF0ZS5yZWdzWzFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCi0KLS8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KLQotI2RlZmluZSBNRU1QVFIoeCkgKFN0YXRlLm1lbSArICh4ICYgMHhmZmZmZmYpKQotCi0gIHN3aXRjaCAoRlVOQykKLSAgICB7Ci0jaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKLSNpZmRlZiBUQVJHRVRfU1lTX2ZvcmsKLSAgICAgIGNhc2UgVEFSR0VUX1NZU19mb3JrOgotICAgICAgUkVUVkFMID0gZm9yayAoKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX1NZU19leGVjdmUKLSAgICBjYXNlIFRBUkdFVF9TWVNfZXhlY3ZlOgotICAgICAgUkVUVkFMID0gZXhlY3ZlIChNRU1QVFIgKFBBUk0xKSwgKGNoYXIgKiopIE1FTVBUUiAoUEFSTSAoNCwgNCkpLAotCQkgICAgICAgKGNoYXIgKiopTUVNUFRSIChQQVJNICg4LCA0KSkpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHRVRfU1lTX2V4ZWN2Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2V4ZWN2OgotICAgICAgUkVUVkFMID0gZXhlY3ZlIChNRU1QVFIgKFBBUk0xKSwgKGNoYXIgKiopIE1FTVBUUiAoUEFSTSAoNCwgNCkpLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotICAgIGNhc2UgVEFSR0VUX1NZU19yZWFkOgotICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+cmVhZCAobW4xMDIwMF9jYWxsYmFjaywgUEFSTTEsIAotCQkJCSAgICAgICBNRU1QVFIgKFBBUk0gKDQsIDQpKSwgUEFSTSAoOCwgNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQVJHRVRfU1lTX3dyaXRlOgotICAgICAgUkVUVkFMID0gKGludCltbjEwMjAwX2NhbGxiYWNrLT53cml0ZSAobW4xMDIwMF9jYWxsYmFjaywgUEFSTTEsCi0JCQkJCSAgICAgTUVNUFRSIChQQVJNICg0LCA0KSksCi0JCQkJCSAgICAgUEFSTSAoOCwgNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2xzZWVrOgotICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+bHNlZWsgKG1uMTAyMDBfY2FsbGJhY2ssIFBBUk0xLAotCQkJCQlQQVJNICg0LCA0KSwgUEFSTSAoOCwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgotICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+Y2xvc2UgKG1uMTAyMDBfY2FsbGJhY2ssIFBBUk0xKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFSR0VUX1NZU19vcGVuOgotICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+b3BlbiAobW4xMDIwMF9jYWxsYmFjaywgTUVNUFRSIChQQVJNMSksCi0JCQkJICAgICAgIFBBUk0gKDQsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFSR0VUX1NZU19leGl0OgotICAgICAgLyogRVhJVCAtIGNhbGxlciBjYW4gbG9vayBpbiBQQVJNMSB0byB3b3JrIG91dCB0aGUgCi0JIHJlYXNvbiAqLwotICAgICAgaWYgKFBBUk0xID09IDB4ZGVhZCkKLQlTdGF0ZS5leGNlcHRpb24gPSBTSUdBQlJUOwotICAgICAgZWxzZQotCVN0YXRlLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7Ci0gICAgICBTdGF0ZS5leGl0ZWQgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRBUkdFVF9TWVNfc3RhdDoJLyogYWRkZWQgYXQgaG1zaSAqLwotICAgICAgLyogc3RhdCBzeXN0ZW0gY2FsbCAqLwotICAgICAgewotCXN0cnVjdCBzdGF0IGhvc3Rfc3RhdDsKLQlyZWdfdCBidWY7Ci0KLQlSRVRWQUwgPSBzdGF0IChNRU1QVFIgKFBBUk0xKSwgJmhvc3Rfc3RhdCk7Ci0JCi0JYnVmID0gUEFSTSAoNCwgNCk7Ci0KLQkvKiBKdXN0IHdpbGQtYXNzZWQgZ3Vlc3Nlcy4gICovCi0Jc3RvcmVfaGFsZiAoYnVmLCBob3N0X3N0YXQuc3RfZGV2KTsKLQlzdG9yZV9oYWxmIChidWYgKyAyLCBob3N0X3N0YXQuc3RfaW5vKTsKLQlzdG9yZV93b3JkIChidWYgKyA0LCBob3N0X3N0YXQuc3RfbW9kZSk7Ci0Jc3RvcmVfaGFsZiAoYnVmICsgOCwgaG9zdF9zdGF0LnN0X25saW5rKTsKLQlzdG9yZV9oYWxmIChidWYgKyAxMCwgaG9zdF9zdGF0LnN0X3VpZCk7Ci0Jc3RvcmVfaGFsZiAoYnVmICsgMTIsIGhvc3Rfc3RhdC5zdF9naWQpOwotCXN0b3JlX2hhbGYgKGJ1ZiArIDE0LCBob3N0X3N0YXQuc3RfcmRldik7Ci0Jc3RvcmVfd29yZCAoYnVmICsgMTYsIGhvc3Rfc3RhdC5zdF9zaXplKTsKLQlzdG9yZV93b3JkIChidWYgKyAyMCwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKLQlzdG9yZV93b3JkIChidWYgKyAyOCwgaG9zdF9zdGF0LnN0X210aW1lKTsKLQlzdG9yZV93b3JkIChidWYgKyAzNiwgaG9zdF9zdGF0LnN0X2N0aW1lKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVEFSR0VUX1NZU19jaG93bgotICAgIGNhc2UgVEFSR0VUX1NZU19jaG93bjoKLSAgICAgIFJFVFZBTCA9IGNob3duIChNRU1QVFIgKFBBUk0xKSwgUEFSTSAoNCwgMiksIFBBUk0gKDYsIDIpKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgY2FzZSBUQVJHRVRfU1lTX2NobW9kOgotICAgICAgUkVUVkFMID0gY2htb2QgKE1FTVBUUiAoUEFSTTEpLCBQQVJNICg0LCAyKSk7Ci0gICAgICBicmVhazsKLSNpZmRlZiBUQVJHRVRfU1lTX3RpbWUKLSAgICBjYXNlIFRBUkdFVF9TWVNfdGltZToKLSAgICAgIFJFVFZBTCA9IHRpbWUgKCh0aW1lX3QgKilNRU1QVFIgKFBBUk0xKSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfdGltZXMKLSAgICBjYXNlIFRBUkdFVF9TWVNfdGltZXM6Ci0gICAgICB7Ci0Jc3RydWN0IHRtcyB0bXM7Ci0JUkVUVkFMID0gdGltZXMgKCZ0bXMpOwotCXN0b3JlX3dvcmQgKFBBUk0xLCB0bXMudG1zX3V0aW1lKTsKLQlzdG9yZV93b3JkIChQQVJNMSArIDQsIHRtcy50bXNfc3RpbWUpOwotCXN0b3JlX3dvcmQgKFBBUk0xICsgOCwgdG1zLnRtc19jdXRpbWUpOwotCXN0b3JlX3dvcmQgKFBBUk0xICsgMTIsIHRtcy50bXNfY3N0aW1lKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2dldHRpbWVvZmRheToKLSAgICAgIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCXN0cnVjdCB0aW1lem9uZSB0ejsKLQlSRVRWQUwgPSBnZXR0aW1lb2ZkYXkgKCZ0LCAmdHopOwotCXN0b3JlX3dvcmQgKFBBUk0xLCB0LnR2X3NlYyk7Ci0Jc3RvcmVfd29yZCAoUEFSTTEgKyA0LCB0LnR2X3VzZWMpOwotCXN0b3JlX3dvcmQgKFBBUk0gKDQsIDQpLCB0ei50el9taW51dGVzd2VzdCk7Ci0Jc3RvcmVfd29yZCAoUEFSTSAoNCwgNCkgKyA0LCB0ei50el9kc3R0aW1lKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfdXRpbWUKLSAgICBjYXNlIFRBUkdFVF9TWVNfdXRpbWU6Ci0gICAgICAvKiBDYXN0IHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdm9pZCAqLCB0byBhdm9pZCB0eXBlIG1pc21hdGNoCi0JIGlmIGEgcHJvdG90eXBlIGlzIHByZXNlbnQuICAqLwotICAgICAgUkVUVkFMID0gdXRpbWUgKE1FTVBUUiAoUEFSTTEpLCAodm9pZCAqKSBNRU1QVFIgKFBBUk0gKDQsIDQpKSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIFJFVEVSUiA9IGVycm5vOwotICBlcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KLS8qIG5vcCAqLwotdm9pZCBPUF9GNiAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLX0KLQotLyogYnJlYWtwb2ludCAqLwotdm9pZAotT1BfRkYgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7Ci0gIFBDIC09IDE7Ci19CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9DaGFuZ2VMb2cgYi9zaW0vbW4xMDMwMC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGE2YmUuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTU2ICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTIwMDAtMDUtMjIgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUBjeWdudXMuY29tPgotCi0JKiBhbTMzLmlnZW46IEZpeCBsZWFkaW5nIGNvbW1lbnRzIG9mIFNQLXJlbGF0aXZlIG9mZnNldCBpbnNucyB0aGF0Ci0JcmVmZXJyZWQgdG8gb3RoZXIgcmVnaXN0ZXJzLiAgTWFrZSB0aGVpciBvZmZzZXRzIHVuc2lnbmVkLgotCi0yMDAwLTA1LTE4ICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMF9zaW0uaCAoZ2VuZXJpY0FkZCwgZ2VuZXJpY1N1YiwgZ2VuZXJpY0NtcCwgZ2VuZXJpY09yLAotCWdlbmVyaWNYb3IsIGdlbmVyaWNCdHN0KTogVXNlIGB1bnNpZ25lZDMyJy4KLQkqIG9wX3V0aWxzLmM6IExpa2V3aXNlLgotCSogbW4xMDMwMC5pZ2VuLCBhbTMzLmlnZW46IFVzZSBgdW5zaWduZWQzMicsIGBzaWduZWQzMicsCi0JYHVuc2lnbmVkNjQnIG9yIGBzaWduZWQ2NCcgd2hlcmUgdHlwZSB3aWR0aCBpcyByZWxldmFudC4KLQotMjAwMC0wNC0yNSAgQWxleGFuZHJlIE9saXZhICA8YW9saXZhQGN5Z251cy5jb20+Ci0KLQkqIGFtMzMuaWdlbiAoaW5jNCBSbik6IFVzZSBnZW5lcmljQWRkIHNvIGFzIHRvIG1vZGlmeSBmbGFncy4KLQotMjAwMC0wNC0wOSAgQWxleGFuZHJlIE9saXZhICA8YW9saXZhQGN5Z251cy5jb20+Ci0KLQkqIGFtMzMuaWdlbjogTWFrZSBTUC1yZWxhdGl2ZSBvZmZzZXRzIHVuc2lnbmVkLiAgQWRkIGAqYW0zMycgZm9yCi0Jc29tZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIG1pc3NpbmcgaXQuCi0KLTIwMDAtMDMtMDMgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGxzZC5pYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAoSUdFTl9JTlNOKTogQWRkZWQgYW0zMy5pZ2VuLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgSnVsIDEzIDEzOjI2OjIwIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IENsYXJpZnkgZXJyb3IgbWVzc2FnZSByZXBvcnRpbmcgYW4gdW5rbm93biBib2FyZC4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi0xOTk5LTA0LTE2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBEZXRlY3QgdW5kZXNpcmVkIHJlY3Vyc2lvbiB1c2luZwotIAlzdGF0aWMgZmxhZy4gIFNldCBOTUlSQyByZWdpc3RlcidzIFNZU0VGIGZsYWcgZHVyaW5nCi0gCS0tYm9hcmQ9c3RkZXZhbDEgbW9kZS4KLQkqIGR2LW1uMTAzLWludC5jICh3cml0ZV9pY3IpOiBBZGQgYmFja2Rvb3IgYWRkcmVzcyB0byBhbGxvdyBDUFUgdG8KLQlzZXQgU1lTRUYgZmxhZy4KLQotMTk5OS0wNC0wMiAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9DRkxBR1MpOiBEZWZpbmUgYSBQT0xMX1FVSVRfSU5URVJWQUwKLQlmb3IgdXNlIGluIHRoZSBzaW11bGF0b3Igc28gdGhhdCB0aGUgcG9sbF9xdWl0IGNhbGxiYWNrIGlzCi0Jbm90IGNhbGxlZCB0b28gb2Z0ZW4uCi0KLVR1ZSBNYXIgIDkgMjE6MjY6NDEgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBkdi1tbjEwM2ludC5jIChtbjEwM2ludF9pb2N0bCk6IFJldHVybiBzb21ldGhpbmcuCi0JKiBkdi1tbjEwM3RpbS5jICh3cml0ZV90bTZtZCk6IEdDQyBzdWdnZXN0ZWQgcGFyZW50aGVzZXMgYXJvdW5kICYmCi0gCXdpdGhpbiB8fC4KLQotVHVlIEZlYiAxNiAyMzo1NzoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaWdlbiAocmV0Zik6IEZpeCByZXR1cm4gYWRkcmVzcyBjb21wdXRhdGlvbiBhbmQgc3RvcmUKLQl0aGUgbmV3IHBjIHZhbHVlIGludG8gbmlhLgotCi0xOTk4LTEyLTI5ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoV0lUSF9DT01NT05fT0JKUyk6IEJ1aWxkIGFsc28gZHYtc29ja3Nlci5vLgotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIHN0dWIgbW4xMDMwMDIgY2FjaGUgY29udHJvbCBtZW1vcnkgcmVnaW9ucy4KLQlTZXQgT1BFUkFUSU5HX0VOVklST05NRU5UIG9uICJzdGRldmFsMSIgYm9hcmQuCi0JKG1uMTAzMDBfY29yZV9zaWduYWwpOiBOZXcgZnVuY3Rpb24gdG8gaW50ZXJjZXB0IG1lbW9yeSBlcnJvcnMuCi0JKHByb2dyYW1faW50ZXJydXB0KTogTmV3IGZ1bmN0aW9uIHRvIGRpc3BhdGNoIHRvIGV4Y2VwdGlvbiB2ZWN0b3IKLQkobW4xMDMwMF9leGNlcHRpb25fKik6IE5ldyBmdW5jdGlvbnMgdG8gc25hcHNob3QgcHJlL3Bvc3QgZXhjZXB0aW9uCi0Jc3RhdGUuCi0JKiBzaW0tbWFpbi5oIChTSU1fQ09SRV9TSUdOQUwpOiBEZWZpbmUgaG9vayAtIGNhbGwgbW4xMDMwMF9jb3JlX3NpZ25hbC4KLQkoU0lNX0VOR0lORV9IQUxUX0hPT0spOiBEbyBub3RoaW5nLiAKLQkoU0lNX0NQVV9FWENFUFRJT04qKTogRGVmaW5lIGhvb2tzIHRvIGNhbGwgbW4xMDMwMF9jcHVfZXhjZXB0aW9uKigpLgotCShfc2ltX2NwdSk6IEFkZCBleGNfKiBmaWVsZHMgdG8gc3RvcmUgcmVnaXN0ZXIgdmFsdWUgc25hcHNob3RzLgkKLQkqIGR2LW1uMTAzc2VyLmMgKCopOiBTdXBwb3J0IGR2LXNvY2tzZXIgYmFja2VuZCBmb3IgVUFSVCBJL08uCi0JVmFyaW91cyBlbmRpYW5uZXNzIGFuZCB3YXJuaW5nIGZpeGVzLgotCSogbW4xMDMwMC5pZ2VuIChpbGxlZ2FsKTogQ2FsbCBwcm9ncmFtX2ludGVycnVwdCBvbiBlcnJvci4KLQkoYnJlYWspOiBDYWxsIHByb2dyYW1faW50ZXJydXB0IG9uIGJyZWFrcG9pbnQKLQkKLQlTZXZlcmFsIGNoYW5nZXMgZnJvbSA8amFuY3p5bkBjeWdudXMuY29tPiBhbmQgPGNhZ25leUBjeWdudXMuY29tPgotCW1lcmdlZCBpbjoKLQkqIGR2LW1uMTAzaW50LmMgKG1uMTAzaW50X2lvY3RsKTogTmV3IGZ1bmN0aW9uIGZvciBOTUkKLQlnZW5lcmF0aW9uLiAobW4xMDNpbnRfZmluaXNoKTogSW5zdGFsbCBpdCBhcyBpb2N0bCBoYW5kbGVyLgotCSogZHYtbW4xMDN0aW0uYzogU3VwcG9ydCB0aW1lciA2IHNwZWNpYWxseS4gIEVuZGlhbm5lc3MgZml4ZXMuCi0JCi1XZWQgT2N0IDE0IDEyOjExOjA1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYW0zMy5pZ2VuOiBBbGxvdyBhdXRvaW5jcmVtZW50IHN0b3JlcyB1c2luZyB0aGUgc2FtZSByZWdpc3RlcgotCWZvciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9wZXJhbmRzLgotCi1Nb24gQXVnIDMxIDEwOjE5OjU1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGFtMzMuaWdlbjogUmV2ZXJzZSBISS9MTyBvdXRwdXRzIG9mIDQgb3BlcmFuZCAibXVsIiBhbmQgIm11bHUiLgotCi1GcmkgQXVnIDI4IDE0OjQwOjQ5IDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IENoZWNrIGZvciBpbnZhbGlkIC0tYm9hcmQgb3B0aW9uLCBmaXgKLQlpbmRlbnRhdGlvbiwgYWxsb2NhdGUgbWVtb3J5IGZvciBtZW0gY29udHJvbCBhbmQgRE1BIHJlZ3MuCi0KLVdlZCBBdWcgMjYgMDk6Mjk6MzggMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC5pZ2VuIChkaXYsZGl2dSk6IEZpeCBkaXZpZGUgaW5zdHJ1Y3Rpb25zIHNvIGRpdmlkZSBieSAwCi0JYmVoYXZlcyBsaWtlIHRoZSBoYXJkd2FyZS4KLQotTW9uIEF1ZyAyNCAxMTo1MDowOSAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oIChTSU1fSEFORExFU19MTUEpOiBEZWZpbmUgU0lNX0hBTkRMRVNfTE1BLgotCi1XZWQgQXVnIDEyIDEyOjM2OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYW0zMy5pZ2VuOiBIYW5kbGUgY2FzZSB3aGVyZSBmaXJzdCBEU1Agb3BlcmF0aW9uIG1vZGlmaWVzIGEgCi0JcmVnaXN0ZXIgdXNlZCBpbiB0aGUgc2Vjb25kIERTUCBvcGVyYXRpb24gY29ycmVjdGx5LgotCi1UdWUgSnVsIDI4IDEwOjEwOjI1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYW0zMy5pZ2VuOiBEZXRlY3QgY2FzZXMgd2hlcmUgdHdvIG9wZXJhbmRzIG11c3Qgbm90IG1hdGNoIGZvcgotCURTUCBpbnN0cnVjdGlvbnMgdG9vLgotCi1Nb24gSnVsIDI3IDEyOjA0OjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYW0zMy5pZ2VuOiBEZXRlY3QgY2FzZXMgd2hlcmUgdHdvIG9wZXJhbmRzIG11c3Qgbm90IG1hdGNoIGluCi0Jbm9uLURTUCBpbnN0cnVjdGlvbnMuCi0KLUZyaSBKdWwgMjQgMTg6MTU6MjEgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQotCSogb3BfdXRpbHMuYyAoZG9fc3lzY2FsbCk6IFJld3JpdGUgdG8gdXNlIGNvbW1vbi9zeXNjYWxsLmMuCi0JKHN5c2NhbGxfcmVhZF9tZW0sIHN5c2NhbGxfd3JpdGVfbWVtKTogTmV3IGZ1bmN0aW9ucyBmb3Igc3lzY2FsbAotCWNhbGxiYWNrcy4KLQkqIG1uMTAzMDBfc2ltLmg6IEFkZCBwcm90b3R5cGVzIGZvciBzeXNjYWxsX3JlYWRfbWVtIGFuZAotCXN5c2NhbGxfd3JpdGVfbWVtLiAKLQkqIG1uMTAzMDAuaWdlbjogQ2hhbmdlIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlIGNvbW1lbnRzLgotCUNoZWNrIGZvciBkaXZpZGUgYnkgemVybyBpbiBkaXYgYW5kIGRpdnUgb3BzLgotCi1GcmkgSnVsIDI0IDEyOjQ5OjI4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYW0zMy5pZ2VuICh0cmFuc2xhdGVfeHJlZyk6IE5ldyBmdW5jdGlvbi4gIFVzZSBpdCBhcyBuZWVkZWQuCi0KLVRodSBKdWwgMjMgMTA6MDU6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhbTMzLmlnZW46IEFkZCBzb21lIG1pc3NpbmcgaW5zdHJ1Y3Rpb25zLgotCi0JKiBhbTMzLmlnZW46IEF1dG9pbmNyZW1lbnQgbG9hZHMvc3RvcmUgZml4ZXMuCi0KLVR1ZSBKdWwgMjEgMDk6NDg6MTQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhbTMzLmlnZW46IEFkZCBtb3ZfbENDIERTUCBpbnN0cnVjdGlvbnMuCi0KLQkqIGFtMzMuaWdlbjogQWRkIG1vc3QgYW0zMyBEU1AgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSnVsICA5IDEwOjA2OjU1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5pZ2VuOiBGaXggWiBiaXQgZm9yIGFkZGMgYW5kIHN1YmMgaW5zdHJ1Y3Rpb25zLgotCU1pbm9yIGZpeGVzIGluIG11bHRpcGx5L2RpdmlkZSBwYXR0ZXJucy4KLQotCSogYW0zMy5pZ2VuOiBBZGQgbWlzc2luZyBtdWxbdV0gaW1tMzIsUm4uICBGaXggY29uZGl0aW9uIGNvZGUKLQloYW5kbGluZyBmb3IgbWFueSBpbnN0cnVjdGlvbnMuICBGaXggc2lnbiBleHRlbnNpb24gZm9yIHNvbWUKLQkyNGJpdCBpbW1lZGlhdGVzLgotCi0JKiBhbTMzLmlnZW46IEZpeCBaIGJpdCBmb3IgcmVtYWluaW5nIGFkZGMvc3ViYyBpbnN0cnVjdGlvbnMuCi0JRG8gbm90IHNpZ24gZXh0ZW5kIGltbWVkaWF0ZSBmb3IgbW92IGltbSxYUm4uCi0JTW9yZSByYW5kb20gbXVsLCBtYWMgJiBkaXYgZml4ZXMuCi0JUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQlTaWduIGV4dGVuZCAyNGJpdCBkaXNwbGFjZW1lbnQgaW4gbWVtb3J5IGFkZHJlc3Nlcy4KLQotCSogYW0zMy5pZ2VuOiBGaXggWiBiaXQgZm9yIGFkZGMgUm0sUm4gYW5kIHN1YmMgUm0sUm4uICBWYXJpb3VzCi0JZml4ZXMgdG8gMiByZWdpc3RlciBtdWx0aXBseSwgZGl2aWRlIGFuZCBtYWMgaW5zdHJ1Y3Rpb25zLiAgU2V0Ci0JWixOIGNvcnJlY3RseSBmb3Igc2F0MTYuICBTaWduIGV4dGVuZCAyNCBiaXQgaW1tZWRpYXRlIGZvciBhZGQsCi0JYW5kIHN1YiBpbnN0cnVjdGlvbnMuCi0KLQkqIGFtMzMuaWdlbjogQWRkIHJlbWFpbmluZyBub24tRFNQIGluc3RydWN0aW9ucy4KLQotV2VkIEp1bCAgOCAxNjoyOToxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGFtMzMuaWdlbiAodHJhbnNsYXRlX3JyZWcpOiBOZXcgZnVuY3Rpb24uICBVc2UgaXQgYXMgYXBwcm9wcmlhdGUuCi0KLQkqIGFtMzMuaWdlbjogTW9yZSBhbTMzIGluc3RydWN0aW9ucy4gIEZpeCAiZGl2Ii4KLQotTW9uIEp1bCAgNiAxNTozOToyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaWdlbjogQWRkIGFtMzMgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW46IFVzZSBtdWx0aS1zaW0gdG8gc3VwcG9ydCBib3RoIGEgbW4xMDMwMCBhbmQgYW0zMwotCXNpbXVsYXRvci4KLQotCSogYW0zMy5pZ2VuOiBBZGQgbWFueSBtb3JlIGFtMzMgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgSnVsICAxIDE3OjA3OjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMF9zaW0uaCAoRkVUQ0gyNCk6IERlZmluZS4KLQotCSogbW4xMDMwMF9zaW0uaDogQWRkIGRlZmluZXMgZm9yIHNvbWUgcmVnaXN0ZXJzIGZvdW5kIG9uIHRoZSBBTTMzLgotCSogYW0zMy5pZ2VuOiBOZXcgZmlsZSB3aXRoIHNvbWUgYW0zMyBzdXBwb3J0LgotCi1UdWUgSnVuIDMwIDExOjIzOjIwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMF9zaW0uaDogSW5jbHVkZSBiZmQuaAotCShzdHJ1Y3Qgc3RhdGUpOiBBZGQgbW9yZSByb29tIGZvciBwcm9jZXNzb3Igc3BlY2lmaWMgcmVnaXN0ZXJzLgotCShSRUdfRTApOiBEZWZpbmUuCi0KLVRodSBKdW4gMjUgMTA6MTI6MDMgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQotCSogZHYtbW4xMDN0aW0uYzogSW5jbHVkZSBzaW0tYXNzZXJ0LmgKLQkqIGR2LW1uMTAzc2VyLmMgKGRvX3BvbGxpbmdfZXZlbnQpOiBDaGVjayBmb3IgaW5jb21pbmcgZGF0YSBvbgotCXNlcmlhbCBsaW5lIGFuZCBzY2hlZHVsZSBuZXh0IHBvbGxpbmcgZXZlbnQuCi0JKHJlYWRfc3RhdHVzX3JlZyk6IHNjaGVkdWxlIGV2ZW50cyB0byBjaGVjayBmb3IgaW5jb21pbmcgZGF0YSBvbgotCXNlcmlhbCBsaW5lIGFuZCBpc3N1ZSBpbnRlcnJ1cHQgaWYgbmVjZXNzYXJ5LgotCQotRnJpIEp1biAxOSAxNjo0NzoyNyAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBob29rIHVwIHNlcmlhbCAxIGFuZCAyIHBvcnRzIHByb3Blcmx5ICh0eXBvKS4KLQotRnJpIEp1biAxOSAxMTo1OToyNiAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoYm9hcmQpOiBSZW5hbWUgYW0zMiB0byBzdGRldmFsMSBhcyB0aGlzIGlzIHRoZSBuYW1lCi0JY29uc2lzdGVudGx5IHVzZWQgdG8gcmVmZXIgdG8gdGhlIG1uMTAzMDAwMiBib2FyZC4KLQotVGh1IEp1bmUgMTggMTQ6Mzc6MTQgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEZpeCB0eXBvIGluIGFkZHJlc3Mgb2YgRVhUTUQgcmVnaXN0ZXIKLQkoMHgzNDAwMDI4MCwgbm90IDB4MzQwMDI4MCkuCi0KLVdlZCBKdW4gMTcgMTg6MDA6MTggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoc3lzY2FsbCk6IEhhbmRsZSBjaGFuZ2UgaW4gb3Bjb2RlICMgZm9yIHN5c2NhbGwuCi0JKiBtbjEwMzAwLmlnZW4gKHN5c2NhbGwpOiBMaWtld2lzZS4KLQotVHVlIEp1bmUgMTYgMDk6MzY6MjEgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KLQkqIGR2LW1uMTAzaW50LmMgKG1uMTAzaW50X2ZpbmlzaCk6IFJlZ3VsYXIgaW50ZXJydXB0cyAobm90IE5NSSBvcgotCXJlc2V0KSBhcmUgbm90IGVuYWJsZWQgb24gcmVzZXQuCi0JCi1TdW4gSnVuZSAxNCAxNzowNDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCSogZHYtbW4xMDNpb3AuYyAod3JpdGVfKl9yZWcpOiBDaGVjayBmb3IgYXR0ZW1wdCB0byB3cml0ZSByL28KLQlyZWdpc3RlciBiaXRzLgotCSogZHYtbW4xMDNzZXIuYzogRmlsbCBpbiBtZXRob2RzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHNlcmlhbAotCWRldmljZSByZWdpc3RlcnMuCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBNYWtlIHRoZSBzZXJpYWwgZGV2aWNlIGEgcG9sbGluZyBkZXZpY2UuCi0JCi1GcmkgSnVuZSAxMiAxNjoyNDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCSogZHYtbW4xMDNpb3AuYzogTmV3IGZpbGUgZm9yIGhhbmRsaW5nIGFtMzIgaW8gcG9ydHMuCi0JKiBjb25maWd1cmUuaW46IEFkZCBtbjEwM2lvcCB0byBod19kZXZpY2UgbGlzdC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDcmVhdGUgaW8gcG9ydCBkZXZpY2UuCi0KLVdlZCBKdW5lIDEwIDE0OjM0OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0JKiBkdi1tbjEwM2ludC5jIChleHRlcm5hbF9ncm91cCk6IFVzZSBlbnVtZXJhdGVkIHR5cGVzIHRvIGFjY2VzcwotCWNvcnJlY3QgZ3JvdXAgYWRkcmVzc2VzLgotCSogZHYtbW4xMDN0aW0uYyAoZG9fY291bnRlcl9ldmVudCk6IFVuZGVyZmxvdyBvZiBjYXNjYWRlZCB0aW1lcgotCXRyaWdnZXJzIGFuIGludGVycnVwdCBvbiB0aGUgaGlnaGVyLW51bWJlcmVkIHRpbWVyJ3MgcG9ydC4KLQotTW9uIEp1bmUgOCAxMzozMDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCSogaW50ZXJwLmM6IChtbjEwMzAwX29wdGlvbl9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uIHBhcnNlcyBhcmd1bWVudHMKLQl1c2luZyBzaW0tb3B0aW9ucy4KLQkqIChib2FyZCk6IEFkZCAtLWJvYXJkIG9wdGlvbiBmb3Igc3BlY2lmeWluZyBhbTMyLgotCSogKHNpbV9vcGVuKTogQ3JlYXRlIG5ldyB0aW1lciBhbmQgc2VyaWFsIGRldmljZXMgYW5kIGNvbnRyb2wKLQljb25maWd1cmF0aW9uIG9mIG90aGVyIGFtMzIgZGV2aWNlcyB2aWEgYm9hcmQgb3B0aW9uLgotCSogZHYtbW4xMDN0aW0uYywgZHYtbW4xMDNzZXIuYzogTmV3IGZpbGVzIGZvciB0aW1lcnMgYW5kIHNlcmlhbCBkZXZpY2VzLgotCSogZHYtbW4xMDNjcHUuYzogRml4IHR5cG9zIGluIG9wZW5pbmcgY29tbWVudHMuCi0JKiBkdi1tbjEwM2ludC5jOiBBZGp1c3QgaW50ZXJydXB0IGNvbnRyb2xsZXIgc2V0dGluZ3MgZm9yIGFtMzIgaW5zdGVhZCBvZiBhbTMwLgotCSogY29uZmlndXJlLmluOiBBZGQgbW4xMDN0aW0gYW5kIG1uMTAzc2VyIHRvIGh3X2RldmljZSBsaXN0LgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotTW9uIE1heSAyNSAyMDo1MDozNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LW1uMTAzaW50LmMsIGR2LW1uMTAzY3B1LmM6IFJlbmFtZSAqX2NhbGxiYWNrIHRvICpfbWV0aG9kLgotCi0JKiBkdi1tbjEwM2NwdS5jLCBkdi1tbjEwM2ludC5jOiBJbmNsdWRlIGh3LW1haW4uaCBhbmQKLSAJc2ltLW1haW4uaC4gRGVjbGFyZSBhIHN0cnVjdCBod19kZXNjcmlwdG9yIGluc3RlYWQgb2Ygc3RydWN0Ci0gCWh3X2RldmljZV9kZXNjcmlwdG9yLgotCi1Nb24gTWF5IDI1IDE3OjMzOjMzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZHYtbW4xMDNjcHUuYyAoc3RydWN0IG1uMTAzY3B1KTogQ2hhbmdlIHR5cGUgb2YgcGVuZGluZ19oYW5kbGVyCi0gCXRvIHN0cnVjdCBod19ldmVudC4KLQotRnJpIE1heSAyMiAxMjoxNzo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9IQVJEV0FSRSk6IEFkZCBhcmd1bWVudCAieWVzIi4KLQotV2VkIE1heSAgNiAxMzoyOTowNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IENyZWF0ZSBhIHBvbGxpbmcgUEFMIGRldmljZS4KLQotRnJpIE1heSAgMSAxNjozOToxNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LW1uMTAzaW50LmMgKG1uMTAzaW50X3BvcnRfZXZlbnQpOiAKLQkobW4xMDNpbnRfcG9ydF9ldmVudCk6IAotCShtbjEwM2ludF9pb19yZWFkX2J1ZmZlcik6IAotCShtbjEwM2ludF9pb193cml0ZV9idWZmZXIpOiAKLQotCSogZHYtbW4xMDNjcHUuYyAoZGVsaXZlcl9tbjEwM2NwdV9pbnRlcnJ1cHQpOiBEcm9wIENQVS9DSUEgYXJncy4KLQkobW4xMDNjcHVfcG9ydF9ldmVudCk6IERpdHRvLgotCShtbjEwM2NwdV9pb19yZWFkX2J1ZmZlcik6IERpdHRvLgotCShtbjEwM2NwdV9pb193cml0ZV9idWZmZXIpOiBEaXR0by4KLQotVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjE5OjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxOTowNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotVHVlIEFwciAxNCAxMDowMzowMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIG1uMTAzMDBfc2ltLmg6IERlY2xhcmUgYWxsIGZ1bmN0aW9ucyBpbiBvcF91dGlscy5jIHVzaW5nCi0gCUlOTElORV9TSU1fTUFJTi4KLQkqIG9wX3V0aWxzLmM6IERpdHRvLgotCSogc2ltLW1haW4uYzogTmV3IGZpbGUuICBJbmNsdWRlIG9wX3V0aWxzLmMuCi0JCi0JKiBtbjEwMzAwLmlnZW4gKG1vdiwgY21wKTogVXNlIG5ldyBpZ2VuIG9wZXJhdG9ycyBgIScgYW5kIGA9JyB0bwotIAlkaWZmZXJlbnRpYXRlIGJldHdlZW4gTU9WL0NNUCBpbW1lZGlhdGUvcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fSU5MSU5FKTogQWRkIGFuZCBlbmFibGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBNYXIgMjcgMTY6MTU6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoaHcpOiBEZWxldGUgdmFyaWFibGUsIG1vdmVkIHRvIFNJTV9ERVNDLgotCShzaW1fb3Blbik6IERlbGV0ZSBjYWxscyB0byBod190cmVlX2NyZWF0ZSwgaHdfdHJlZV9maW5pc2guCi0gIAlIYW5kbGVkIGJ5IHNpbS1tb2R1bGUuCi0JKHNpbV9vcGVuKTogRG8gbm90IGFub3RhdGUgdHJlZSB3aXRoIHRyYWNlIHByb3BlcnRpZXMsIGhhbmRsZWQgYnkKLSAJc2ltLWh3LmMKLQkoc2ltX29wZW4pOiBDYWxsIHNpbV9od19wYXJzZSBpbnN0ZWFkIG9mIGh3X3RyZWVfcGFyc2UuCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IE1hciAyNiAyMDo0NjoxOCAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIGR2LW1uMTAzY3B1LmMgKGRlbGl2ZXJfbW4xMDNjcHVfaW50ZXJydXB0KTogIFNhdmUgdGhlIGVudGlyZSBQQwotCW9uIHRoZSBzdGFjayB3aGVuIGRlbGl2ZXJpbmcgaW50ZXJydXB0cyAobm90IGp1c3QgdGhlIGxvd2VyCi0JaGFsZikuLi4KLQkqIG1uMTAzMDAuaWdlbiAobW92IChEaSxBbSksRG4pOiAgRml4IGRlY29kZS4gIFJlZ2lzdGVycyB3ZXJlCi0Jc3BlY2lmaWVkIGluIHRoZSB3cm9uZyBvcmRlci4KLQotRnJpIE1hciAyNyAwMDo1Njo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LW1uMTAzY3B1LmMgKGRlbGl2ZXJfbW4xMDNjcHVfaW50ZXJydXB0KTogU3RvcCBsb3NzIG9mCi0gCXN1Y2NlZWRpbmcgaW50ZXJydXB0cywgY2xlYXIgcGVuZGluZ19oYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIKLSAJaXNuJ3QgcmUtc2NoZWR1bGVkLgotCi1UaHUgTWFyIDI2IDEwOjExOjAxIDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogIFByZWZpeCBhbGwgdXNhZ2Ugb2YgbW92ZS1pZi1jaGFuZ2UKLQlzY3JpcHQgd2l0aCAkKFNIRUxMKSB0byBtYWtlIE5UIG5hdGl2ZSBidWlsZHMgaGFwcHkuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIGJlY2F1c2Ugb2YgY2hhbmdlIHRvIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCQotVGh1IE1hciAyNiAxMToyMjozMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSAtLWVuYWJsZS1zaW0tY29tbW9uIHRoZSBkZWZhdWx0LgotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQkKLQkqIHNpbS1tYWluLmggKENJQV9HRVQsIENJQV9TRVQpOiBTYXZlL3Jlc3RvcmUgY3VycmVudCBpbnN0cnVjdGlvbgotIAlhZGRyZXNzIGludG8gU2F0ZS5yZWdzW1JFR19QQ10gaW5zdGVhZCBvZiBjb21tb24gc3RydWN0LgotCi1XZWQgTWFyIDI1IDE3OjQyOjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0KLQkqIG1uMTAzMDAuaWdlbiAoY21wIGltbTgsQW4pOiBEbyBub3Qgc2lnbiBleHRlbmQgaW1tOCB2YWx1ZS4KLQotV2VkIE1hciAyNSAxMjowODowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfRjBGRCk6IEluaXRpYWxpc2UgdmFyaWFibGUgJ3NwJy4KLQotVGh1IE1hciAyNiAwMDoyMTozMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGR2LW1uMTAzaW50LmMgKGRlY29kZV9ncm91cCk6IEEgZ3JvdXAgcmVnaXN0ZXIgZXZlcnkgNCBieXRlcyBub3QKLSAJOC4KLQkod3JpdGVfaWNyKTogUmV3cml0ZSBlcXVhdGlvbiB1cGRhdGluZyByZXF1ZXN0IGZpZWxkLgotCShyZWFkX2lhZ3IpOiBGaXggY2hlY2sgdGhhdCBpbnRlcnJ1cHQgaXMgc3RpbGwgcGVuZGluZy4KLQotV2VkIE1hciAyNSAxNjoxNDo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IFRpZHkgdXAgZGV2aWNlIGNyZWF0aW9uLgotCi0JKiBkdi1tbjEwM2ludC5jIChtbjEwM2ludF9wb3J0X2V2ZW50KTogRHJpdmUgTk1JIHdpdGggbm9uLXplcm8KLSAJdmFsdWUuCi0JKG1uMTAzaW50X2lvX3JlYWRfYnVmZmVyKTogQ29udmVydCBhYnNvbHV0ZSBhZGRyZXNzIHRvIHJlZ2lzdGVyCi0gCWJsb2NrIG9mZnNldHMuCi0JKHJlYWRfaWNyLCB3cml0ZV9pY3IpOiBDb252ZXJ0IGJsb2NrIG9mZnNldCBpbnRvIGdyb3VwIG9mZnNldC4KLQkKLVdlZCBNYXIgMjUgMTU6MDg6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDcmVhdGUgc2Vjb25kIDFtYiBtZW1vcnkgcmVnaW9uIGF0Ci0gCTB4NDAwMDAwMDAuCi0JKHNpbV9vcGVuKTogQ3JlYXRlIGEgZGV2aWNlIHRyZWUuCi0JKHNpbS1ody5oKTogSW5jbHVkZS4KLQkoZG9faW50ZXJydXB0KTogRGVsZXRlLCBuZWVkcyB0byB1c2UgZHYtbW4xMDNjcHUuYwotCi0JKiBkdi1tbjEwM2ludC5jLCBkdi1tbjEwM2NwdS5jOiBOZXcgZmlsZXMuCi0KLVdlZCBNYXIgMjUgMDg6NDc6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtbjEwMzAwX3NpbS5oIChFWFRSQUNUX1BTV19MTSwgSU5TRVJUX1BTV19MTSwgUFNXX0lFLCBQU1dfTE0pOgotIAlEZWZpbmUuCi0JKFNQKTogRGVmaW5lLgotCQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMDoyNDo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW0tb3B0aW9ucy5oKTogSW5jbHVkZS4KLQkoc2ltX2tpbmQsIG15bmFtZSk6IERlY2xhcmUgd2hlbiBub3QgdXNpbmcgY29tbW9uIGZyYW1ld29yay4KLQotCSogbW4xMDMwMF9zaW0uaCAoZG9fc3lzY2FsbCwgZ2VuZXJpYyopOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yCi0gCWZ1bmN0aW9ucyBmb3VuZCBpbiBvcF91dGlscy5jCi0KLQkqIG1uMTAzMDAuaWdlbiAoYWRkKTogRGlzY2FyZCB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmUtZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0JCi1UdWUgTWFyIDI0IDE1OjI3OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgLS1lbmFibGUtc2ltLWNvbW1vbiBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbiAoV0lUSE9VVF9DT01NT05fT0JKUyk6IEZpbGVzIGluY2x1ZGVkIGlmCi0JISAtLWVuYWJsZS1zaW0tY29tbW9uCi0JKFdJVEhfQ09NTU9OX09CSlMpOiBGaWxlcyBpbmNsdWRlZCBpZiAtLWVuYWJsZS1zaW0tY29tbW9uLgotCShNTjEwMzAwX09CSlMsTU4xMDMwMF9JTlRFUlBfREVQKTogTmV3IHZhcmlhYmxlcy4KLQkoU0lNX09CSlMpOiBSZXdyaXRlLgotCSh7V0lUSE9VVCxXSVRIfV9DT01NT05fUlVOX09CSlMsU0lNX1JVTl9PQkpTKTogTmV3IHZhcmlhYmxlcy4KLQkoU0lNX0VYVFJBX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoY2xlYW4tZXh0cmEpOiBDbGVhbiB1cCBpZ2VuIGZpbGVzLgotCSguLi9pZ2VuL2lnZW4sY2xlYW4taWdlbix0bXAtaWdlbik6IE5ldyBydWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGNvbW1vbiBmcmFtZXdvcmsgdmlhIAotCS0tZW5hYmxlLXNpbS1jb21tb24uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBpbnRlcnAuYzogI2luY2x1ZGUgc2ltLW1haW4gaWYgV0lUSF9DT01NT04sIG5vdCBtbjEwMzAwX3NpbS5oLgotCShoYXNoLGRpc3BhdGNoLHNpbV9zaXplKTogRG9uJ3QgY29tcGlsZSBpZiAhIFdJVEhfQ09NTU9OLgotCShpbml0X3N5c3RlbSxzaW1fd3JpdGUsY29tcGFyZV9zaW1vcHMpOiBMaWtld2lzZS4KLQkoc2ltX3NldF9wcm9maWxlLHNpbV9zZXRfcHJvZmlsZV9zaXplKTogTGlrZXdpc2UuCi0JKHNpbV9zdG9wLHNpbV9yZXN1bWUsc2ltX3RyYWNlLHNpbV9pbmZvKTogTGlrZXdpc2UuCi0JKHNpbV9zZXRfY2FsbGJhY2tzLHNpbV9zdG9wX3JlYXNvbixzaW1fcmVhZCxzaW1fbG9hZCk6IExpa2V3aXNlLgotCShlbnVtIGludGVycnVwdF90eXBlKTogTmV3IGVudW0uCi0JKGludGVycnVwdF9uYW1lcyk6IE5ldyBnbG9iYWwuCi0JKGRvX2ludGVycnVwdCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX29wZW4pOiBEZWZpbmUgZGlmZmVyZW50bHkgaWYgV0lUSF9DT01NT04uCi0JKHNpbV9jbG9zZSxzaW1fY3JlYXRlX2luZmVyaW9yLHNpbV9kb19jb21tYW5kKTogTGlrZXdpc2UuCi0JKiBtbjEwMzAwX3NpbS5oICh7bG9hZCxzdG9yZX1fe2J5dGUsaGFsZix3b3JkfSk6IERlZmluZSB2ZXJzaW9ucwotCWZvciBXSVRIX0NPTU1PTi4KLQkqIG1uMTAzMDAuaWdlbjogTmV3IGZpbGUuCi0JKiBtbjEwMzAwLmRjOiBOZXcgZmlsZS4KLQkqIG9wX3V0aWxzLmM6IE5ldyBmaWxlLgotCSogc2ltLW1haW4uaDogTmV3IGZpbGUuCi0KLVdlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBGZWIgMjcgMTg6MzY6MDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoaW5jKTogRml4IHR5cG8uCi0KLVdlZCBGZWIgMjUgMDE6NTk6MjkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogc2ltb3BzLmMgKHNpZ25lZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMpOiBDYXN0IGlucHV0IG9wZXJhbmRzIHRvCi0gICAgICAgIHNpZ25lZDMyIGJlZm9yZSBjYXN0aW5nIHRoZW0gdG8gc2lnbmVkNjQgc28gdGhhdCB0aGUgc2lnbiBiaXQKLSAgICAgICAgaXMgcHJvcGFnYXRlZCBwcm9wZXJseS4KLQotTW9uIEZlYiAyMyAyMDoyMzoxOSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBMYXN0IGNoYW5nZSB3YXMgYmFkLiAgRGVmaW5lIE5MX1RBUkdFVAotCXNvIHRoYXQgdGFyZy12YWxzLmggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2Ygc3lzY2FsbC5oLgotCSogc2ltb3BzLmM6IFVzZSB0YXJnLXZhbHMuaCBpbnN0ZWFkIG9mIHN5c2NhbGwuaC4KLQkoT1BfRjAyMCk6IERpc2FibGUgdW5zdXBwb3J0ZWQgc3lzdGVtIGNhbGxzLgotCi1Nb24gRmViIDIzIDA5OjQ0OjM4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEdldCBoZWFkZXIgZmlsZXMgZnJvbSBsaWJnbG9zcy9tbjEwMzAwL3N5cy4KLQotU3VuIEZlYiAyMiAxNjowMjoyNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBJbmNsdWRlIHNpbS10eXBlcy5oLgotCi1XZWQgRmViIDE4IDEzOjA3OjA4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKG11bHRpcGx5IGluc3RydWN0aW9ucyk6IENhc3QgaW5wdXQgb3BlcmFuZHMgdG8gYQotCXNpZ25lZDY0L3Vuc2lnbmVkNjQgdHlwZSBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIEZlYiAxNyAxMjo0NzoxNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgTm92IDExIDEwOjM4OjUyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKGNhbGw6MTYgY2FsbDozMik6IFN0YWNrIGFkanVzdG1lbnQgaXMgZGV0ZXJtaW5lZCBzb2xlbHkKLQlieSB0aGUgaW1tOCBmaWVsZC4KLQotV2VkIE9jdCAyMiAxNDo0MzowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCi0gCXNpbV9sb2FkX2ZpbGUuCi0KLVR1ZSBPY3QgMjEgMTA6MTI6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogQ29ycmVjdGx5IGhhbmRsZSByZWdpc3RlciByZXN0b3JlcyBmb3IgInJldCIgYW5kICJyZXRmIgotCWluc3RydWN0aW9ucy4KLQotRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVR1ZSBBdWcgMjYgMTA6NDE6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4gCi0KLU1vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1Nb24gQXVnIDI1IDE2OjE0OjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCi0KLVR1ZSBKdW4gMjQgMTM6NDY6MjAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IENsZWFyIFN0YXRlLmV4aXRlZC4KLQkoc2ltX3N0b3BfcmVhc29uKTogSWYgU3RhdGUuZXhpdGVkIGlzIG5vbnplcm8sIHRoZW4gaW5kaWNhdGUgdGhhdAotCXRoZSBzaW11bGF0b3IgZXhpdGVkIGluc3RlYWQgb2Ygc3RvcHBlZC4KLQkqIG1uMTAzMDBfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgZXhpdGVkIGZpZWxkLgotCSogc2ltb3BzLmMgKHN5c2NhbGwpOiBTZXQgU3RhdGUuZXhpdGVkIGZvciBTWVNfZXhpdC4KLQotV2VkIEp1biAxMSAyMjowNzo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggdGhpbmtvIGluIGxhc3QgY2hhbmdlLgotCi1UdWUgSnVuIDEwIDEyOjMxOjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6ICJjYWxsIiBzdG9yZXMgdGhlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgaW50byB0aGUKLQlzdGFjayEgIFVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlciBwcm9wZXJseSB3aGVuIGRvbmUgd2l0aAotCXJlZ2lzdGVyIHNhdmVzLgotCi0JKiBzaW1vcHMuYzogRml4IHJldHVybiBhZGRyZXNzIGNvbXB1dGF0aW9uIGZvciAiY2FsbCIgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTWF5IDIyIDAxOjQzOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogRml4IHR5cG8uCi0KLVdlZCBNYXkgMjEgMjM6Mjc6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IEFkZCBtaXNzaW5nIGNhc2UgaW4gYmlnIHN3aXRjaAotCXN0YXRlbWVudCAoZm9yIGV4dGIgaW5zdHJ1Y3Rpb24pLgotCi1UdWUgTWF5IDIwIDE3OjUxOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmM6IFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gbG9hZF9tZW0gYW5kIHN0b3JlX21lbQotCXdpdGggcmVmZXJlbmNlcyB0byBsb2FkX2J5dGUsIGxvYWRfaGFsZiwgbG9hZF8zX2J5dGUsIGxvYWRfd29yZAotCWFuZCBzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQuCi0JKElOTElORSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShsb2FkX21lbV9iaWcpOiBMaWtld2lzZS4KLQkobWF4X21lbSk6IE1ha2UgaXQgZ2xvYmFsLgotCShkaXNwYXRjaCk6IE1ha2UgdGhpcyBmdW5jdGlvbiBpbmxpbmUuCi0JKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZnVuY3Rpb25zLgotCSogbW4xMDMwMF9zaW0uaCAoSU5MSU5FKTogRGVmaW5lLgotCShSTFcpOiBEZWxldGUgdW51c2VkIGRlZmluaXRpb24uCi0JKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZGVjbGFyYXRpb25zLgotCShsb2FkX21lbV9iaWcpOiBOZXcgZGVmaW5pdGlvbi4KLQkobG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgotCShzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgotCSogc2ltb3BzLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGxvYWRfbWVtIGFuZCBzdG9yZV9tZW0KLQl3aXRoIHJlZmVyZW5jZXMgdG8gbG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQKLQlhbmQgc3RvcmVfYnl0ZSwgc3RvcmVfaGFsZiwgc3RvcmVfM19ieXRlLCBzdG9yZV93b3JkLgotCi1UdWUgTWF5IDIwIDEwOjIxOjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIHRvIGFyZ3VtZW50cy4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCi0KLU1vbiBNYXkgMTkgMTM6NTQ6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoZGlzcGF0Y2gpOiBNYWtlIHRoaXMgYW4gaW5saW5lIGZ1bmN0aW9uLgotCi0JKiBzaW1vcHMuYyAoc3lzY2FsbCk6IFVzZSBjYWxsYmFjay0+d3JpdGUgcmVnYXJkbGVzcyBvZgotCXdoYXQgZmlsZSBkZXNjcmlwdG9yIHdlJ3JlIHdyaXRpbmcgdG9vLgotCi1TdW4gTWF5IDE4IDE2OjQ2OjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKGxvYWRfbWVtX2JpZyk6IFJlbW92ZSBmdW5jdGlvbi4gIEl0J3Mgbm93IGEgbWFjcm8KLQlkZWZpbmVkIGVsc2V3aGVyZS4KLQkoY29tcGFyZV9zaW1vcHMpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9vcGVuKTogU29ydCB0aGUgU2ltb3BzIHRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgZW50cmllcwotCWludG8gdGhlIGhhc2ggdGFibGUuCi0JKiBtbjEwMzAwX3NpbS5oOiBSZW1vdmUgdW51c2VkICNkZWZpbmVzLgotCShsb2FkX21lbV9iaWcpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMTYgMTY6MzY6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAobG9hZF9tZW0pOiBJZiB3ZSBnZXQgYSBsb2FkIGZyb20gYW4gb3V0IG9mIHJhbmdlCi0JYWRkcmVzcywgYWJvcnQuCi0JKHN0b3JlX21lbSk6IExpa2V3aXNlIGZvciBzdG9yZXMuCi0JKG1heF9tZW0pOiBOZXcgdmFyaWFibGUuCi0KLVR1ZSBNYXkgIDYgMTM6MjQ6MzYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwX3NpbS5oOiBGaXggb3JkZXJpbmcgb2YgYml0cyBpbiB0aGUgUFNXLgotCi0JKiBpbnRlcnAuYzogSW1wcm92ZSBoYXNoaW5nIHJvdXRpbmUgdG8gYXZvaWQgbG9uZyBsaXN0Ci0JdHJhdmVyc2FscyBmb3IgY29tbW9uIGluc3RydWN0aW9ucy4gIEFkZCBIQVNIX1NUQVQgc3VwcG9ydC4KLQlSZXdyaXRlIG9wY29kZSBkaXNwYXRjaCBjb2RlIHVzaW5nIGEgYmlnIHN3aXRjaCBpbnN0ZWFkIG9mCi0JY2FzY2FkZWQgaWYvZWxzZSBzdGF0ZW1lbnRzLiAgQXZvaWQgdXNlbGVzcyBjYWxscyB0byBsb2FkX21lbS4KLQotTW9uIE1heSAgNSAxODowNzo0OCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDBfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgc3BhY2UgZm9yIG1kcnEgcmVnaXN0ZXIuCi0JKFJFR19NRFJRKTogRGVmaW5lLgotCSogc2ltb3BzLmM6IERvbid0IGFib3J0IGZvciB0cmFwLiAgQWRkIHN1cHBvcnQgZm9yIHRoZSBleHRlbmRlZAotCWluc3RydWN0aW9ucywgImdldHgiLCAicHV0eCIsICJtdWxxIiwgIm11bHF1IiwgInNhdDE2IiwgInNhdDI0IiwKLQlhbmQgImJzY2giLgotCi1UaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIEFwciAxOCAxNDowNDowNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcCk6IEFkZCBzdHViIGZ1bmN0aW9uLgotCi1UaHUgQXByIDE3IDAzOjI2OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgotCSogaW50ZXJwLmMgKHNpbV9raW5kLCBteW5hbWUpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4gIElnbm9yZSAtRSBhcmcuCi0JKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bwotCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KLQotV2VkIEFwciAxNiAxOTozMDo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF9GMDIwKTogU1lTX2V4ZWN2LCBTWVNfdGltZSwgU1lTX3RpbWVzLCBTWVNfdXRpbWUKLSAJb25seSBpbmNsdWRlIGlmIGltcGxlbWVudGVkIGJ5IGhvc3QuCi0JKE9QX0YwMjApOiBUeXBlY2FzdCBhcmcgcGFzc2VkIHRvIHRpbWUgZnVuY3Rpb247Ci0KLU1vbiBBcHIgIDcgMjM6NTc6NDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoc3lzY2FsbCk6IEhhbmRsZSBuZXcgbW4xMDMwMCBjYWxsaW5nIGNvbnZlbnRpb25zLgotCi1Nb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1GcmkgQXByICA0IDIwOjAyOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBtbjEwMzAwLW9wYy5vIHRvIG0xMDMwMC1vcGMubywgdG8gbWF0Y2gKLQljb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBvcGNvZGVzIGRpcmVjdG9yeS4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgTWFyIDIwIDExOjU4OjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCByZWdpc3RlciBleHRyYWN0aW9uIGZvciBhIHR3byAibW92YnUiIHZhcmlhbnRzLgotCVNvbWV3aGF0IHNpbXBsaWZ5ICJzdWIiIGluc3RydWN0aW9ucy4KLQlDb3JyZWN0bHkgc2lnbiBleHRlbmQgb3BlcmFuZHMgZm9yICJtdWwiLiAgUHV0IHRoZSBjb3JyZWN0Ci0JaGFsZiBvZiB0aGUgcmVzdWx0IGluIE1EUiBmb3IgIm11bCIgYW5kICJtdWx1Ii4KLQlJbXBsZW1lbnQgcmVtYWluaW5nIGluc3RydWN0aW9ucy4KLQlUd2VhayBvcGNvZGUgZm9yICJzeXNjYWxsIi4KLQotVHVlIE1hciAxOCAxNDoyMToyMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBEbyBzeXNjYWxsIGVtdWxhdGlvbiBpbiAic3lzY2FsbCIgaW5zdHJ1Y3Rpb24uICBBZGQKLQlkdW1teSAidHJhcCIgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBNYXIgMTMgMTI6NTQ6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdwotCWluIGFyZ3YgZm9ybS4KLQkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVdlZCBNYXIgMTIgMTU6MDQ6MDAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRml4IGNhcnJ5IGJpdCBjb21wdXRhdGlvbiBmb3IgImFkZCIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogRml4IHR5cG9zIGluIGJzZXQgaW5zbnMuICBGaXggYXJndW1lbnRzIHRvIHN0b3JlX21lbQotCWZvciBic2V0IGltbTgsKGQ4LGFuKSBhbmQgYmNsciBpbW04LChkOCxhbikuCi0KLVdlZCBNYXIgIDUgMTU6MDA6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRml4IHJlZ2lzdGVyIHJlZmVyZW5jZXMgd2hlbiBjb21wdXRpbmcgWiBhbmQgTiBiaXRzCi0JZm9yIGxzciBpbW04LGRuLgotCi1UdWUgRmViICA0IDEzOjMzOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKLQlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgotCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjQgMTA6NDc6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoaW5pdF9zeXN0ZW0pOiBBbGxvY2F0ZSAyXjE5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUKLQlzaW11bGF0b3IuCi0KLVRodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCi0Jc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCi0JKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCi0JbWFrZWZpbGUgZnJhZ21lbnQuCi0KLVR1ZSBKYW4gMjEgMTU6MDM6MDQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogVW5kbyBsYXN0IGNoYW5nZSB0byAicm9sIiBhbmQgInJvciIsIG9yaWdpbmFsIGNvZGUKLQl3YXMgY29ycmVjdCEKLQotVGh1IEphbiAxNiAxMToyODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggInJvbCIgYW5kICJyb3IiLgotCi1XZWQgSmFuIDE1IDA2OjQ1OjU4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi1Nb24gSmFuIDEzIDEzOjIyOjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IFVzZSBSRUcgbWFjcm9zIGluIGZldyBwbGFjZXMgbm90IHVzaW5nIHRoZW0geWV0LgotCi1Nb24gSmFuICA2IDE2OjIxOjE5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IEZpeCBudW1iZXIgb2YgcmVnaXN0ZXJzIQotCi1UdWUgRGVjIDMxIDE2OjIwOjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IFB1dCBhbGwgcmVnaXN0ZXJzIGludG8gYSBzaW5nbGUKLQlhcnJheSB0byBtYWtlIGdkYiBpbXBsZW1lbnRhdGlvbiBlYXNpZXIuCi0JKFJFR18qKTogQWRkIGRlZmluaXRpb25zIGZvciBhbGwgcmVnaXN0ZXJzIGluIHRoZSBzdGF0ZSBhcnJheS4KLQkoU0VYVDMyLCBTRVhUNDAsIFNFWFQ0NCwgU0VYVDYwKTogUmVtb3ZlIHVudXNlZCBtYWNyb3MuCi0JKiBzaW1vcHMuYzogUmVsYXRlZCBjaGFuZ2VzLgotCi1XZWQgRGVjIDE4IDEwOjEwOjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBIYW5kbGUgMHhmZiBhcyBhIHNpbmdsZSBieXRlIGluc24uCi0KLQkqIHNpbW9wcy5jOiBGaXggb3ZlcmZsb3cgY29tcHV0YXRpb24gZm9yICJhZGQiIGFuZCAiaW5jIgotCWluc3RydWN0aW9ucy4KLQotTW9uIERlYyAxNiAxMDowMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBIYW5kbGUgImJyZWFrIiBpbnN0cnVjdGlvbi4KLQotCSogc2ltb3BzLmM6IEZpeCByZXN0b3JpbmcgdGhlIFBDIGZvciAicmV0IiBhbmQgInJldGYiIGluc3RydWN0aW9ucy4KLQotV2VkIERlYyAxMSAwOTo1MzoxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEFsc28gd3JpdGUgb3V0IHRoZSBmb3JtYXQgb2YgdGhlCi0Jb3Bjb2RlLgotCSogbW4xMDMwMF9zaW0uaCAoc2ltb3BzKTogQWRkICJmb3JtYXQiIGZpZWxkLgotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBEZWFsIHdpdGggZW5kaWFubmVzcyBpc3N1ZXMgaGVyZS4KLQotVHVlIERlYyAxMCAxNTowNTozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jIChSRUcwXzQpOiBEZWZpbmUuCi0JVXNlIFJFRzBfNCBmb3IgaW5kZXhlZCBsb2Fkcy9zdG9yZXMuCi0KLVNhdCBEZWMgIDcgMDk6NTA6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoUkVHMF8xNik6IEZpeCB0eXBvLgotCi1GcmkgRGVjICA2IDE0OjEzOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IENhbGwgYWJvcnQgZm9yIGFueSBpbnN0cnVjdGlvbiB0aGF0J3Mgbm90IGN1cnJlbnRseQotCXNpbXVsYXRlZC4KLQotCSogc2ltb3BzLmM6IERlZmluZSBhY2Nlc3NvciBtYWNyb3MgdG8gZXh0cmFjdCByZWdpc3RlcgotCXZhbHVlcyBmcm9tIGluc3RydWN0aW9ucy4gIFVzZSB0aGVtIGNvbnNpc3RlbnRseS4KLQotCSogaW50ZXJwLmM6IERlbGV0ZSB1bnVzZWQgZ2xvYmFsIHZhcmlhYmxlICJPUCIuCi0JKHNpbV9yZXN1bWUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJvcGNvZGUiLgotCSogc2ltb3BzLmM6IEZpeCBzb21lIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgcHJvYmxlbXMsIGFkZAotCXBhcmVucyB0byBmaXggdmFyaW91cyAtV2FsbCB3YXJuaW5ncy4KLQotCSogZ2VuY29kZS5jICh3cml0ZV9oZWFkZXIpOiBBZGQgImluc24iIGFuZCAiZXh0ZW5zaW9uIiBhcmd1bWVudHMKLQl0byB0aGUgT1BfKiBkZWNsYXJhdGlvbnMuCi0JKHdyaXRlX3RlbXBsYXRlKTogU2ltaWxhcmx5IGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMuCi0JKiBpbnRlcnAuYyAoaW5zbiwgZXh0ZW5zaW9uKTogUmVtb3ZlIGdsb2JhbCB2YXJpYWJsZXMuICBJbnN0ZWFkCi0JcGFzcyB0aGVtIGFzIGFyZ3VtZW50cyB0byB0aGUgT1BfKiBmdW5jdGlvbnMuCi0JKiBtbjEwMzAwX3NpbS5oOiBSZW1vdmUgZGVjbHMgZm9yICJpbnNuIiBhbmQgImV4dGVuc2lvbiIuCi0JKiBzaW1vcHMuYyAoT1BfKik6IEFjY2VwdCAiaW5zbiIgYW5kICJleHRlbnNpb24iIGFzIGFyZ3VtZW50cwotCWluc3RlYWQgb2YgdXNpbmcgZ2xvYmFscy4KLQotVGh1IERlYyAgNSAyMjoyNjozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggdHlwb3MgaW4gIm1vdiBhbSwoZDE2LGFuKSIgYW5kICJtb3YgYW0sKGQzMixhbikiCi0KLQkqIHNpbW9wcy5jOiBGaXggdGhpbmtvcyBpbiBsYXN0IGNoYW5nZSB0byAiaW5jIGRuIi4KLQotV2VkIERlYyAgNCAxMDo1Nzo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiAiYWRkIGltbSxzcCIgZG9lcyBub3QgZWZmZWN0IHRoZSBjb25kaXRpb24gY29kZXMuCi0JImluYyBkbiIgZG9lcyBlZmZlY3QgdGhlIGNvbmRpdGlvbiBjb2Rlcy4KLQotVHVlIERlYyAgMyAxNzozNzo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBUcmVhdCBib3RoIG9wZXJhbmRzIGFzIHNpZ25lZCB2YWx1ZXMgZm9yCi0JImRpdiIgaW5zdHJ1Y3Rpb24uCi0KLQkqIHNpbW9wcy5jOiBGaXggc2ltdWxhdGlvbiBvZiBkaXZpc2lvbiBpbnN0cnVjdGlvbnMuCi0JRml4IHR5cG9zL3RoaW5rb3MgaW4gc2V2ZXJhbCAiY21wIiBhbmQgInN1YiIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gRGVjICAyIDEyOjMxOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCBjYXJyeSBiaXQgaGFuZGxpbmcgaW4gInN1YiIgYW5kICJjbXAiCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogRml4ICJtb3YgaW1tOCxhbiIgYW5kICJtb3YgaW1tMTYsZG4iLgotCi1TdW4gRGVjICAxIDE2OjA1OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEZpeCBvdmVyZmxvdyBjb21wdXRhdGlvbiBmb3IgbWFueSBpbnN0cnVjdGlvbnMuCi0KLQkqIHNpbW9wcy5jOiBGaXggIm1vdiBkbSwgYW4iLCAibW92YnUgZG0sIChhbikiLCBhbmQgIm1vdmh1IGRtLCAoYW4pIi4KLQotCSogc2ltb3BzLmM6IEZpeCAibW92IGFtLCBkbiIuCi0KLQkqIHNpbW9wcy5jOiBGaXggbW9yZSBidWdzIGluICJhZGQgaW1tLGFuIiBhbmQKLQkiYWRkIGltbSxkbiIuCi0KLVdlZCBOb3YgMjcgMDk6MjA6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogRml4IGJ1Z3MgaW4gIm1vdm0iIGFuZCAiYWRkIGltbSxhbiIuCi0KLQkqIHNpbW9wcy5jOiBEb24ndCBsb3NlIHRoZSB1cHBlciAyNCBiaXRzIG9mIHRoZSByZXR1cm4KLQlwb2ludGVyIGluICJjYWxsIiBhbmQgImNhbGxzIiBpbnN0cnVjdGlvbnMuICBSb3VnaCBjdXQKLQlhdCBlbXVsYXRlZCBzeXN0ZW0gY2FsbHMuCi0KLQkqIHNpbW9wcy5jOiBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyA1LCA2IGFuZCA3IGJ5dGUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyA0IGJ5dGUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyAzIGJ5dGUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyAyIGJ5dGUgaW5zdHJ1Y3Rpb25zLiAgQ2FsbAotCWFib3J0IGZvciBpbnN0cnVjdGlvbnMgd2UncmUgbm90IGltcGxlbWVudGluZyBub3cuCi0KLVR1ZSBOb3YgMjYgMTU6NDM6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogSW1wbGVtZW50IGxvdHMgb2YgcmFuZG9tIGluc3RydWN0aW9ucy4KLQotCSogc2ltb3BzLmM6IEltcGxlbWVudCAibW92bSIgYW5kICJiQ0MiIGluc25zLgotCi0JKiBtbjEwMzAwX3NpbS5oIChfc3RhdGUpOiBBZGQgYW5vdGhlciByZWdpc3RlciAoTURSKS4KLQkoUkVHX01EUik6IERlZmluZS4KLQkqIHNpbW9wcy5jOiBJbXBsZW1lbnQgImNtcCIsICJjYWxscyIsICJyZXRzIiwgImptcCIgYW5kCi0JYSBmZXcgYWRkaXRpb25hbCByYW5kb20gaW5zbnMuCi0KLQkqIG1uMTAzMDBfc2ltLmggKFBTV18qKTogRGVmaW5lIGZvciBDQyBzdGF0dXMgdHJhY2tpbmcuCi0JKFJFR19EMCwgUkVHX0EwLCBSRUdfU1ApOiBEZWZpbmUuCi0JKiBzaW1vcHMuYzogSW1wbGVtZW50ICJhZGQiLCAiYWRkYyIgYW5kIGEgZmV3IG90aGVyIHJhbmRvbQotCWluc3RydWN0aW9ucy4KLQotCSogZ2VuY29kZS5jLCBpbnRlcnAuYzogU25hcHNob3QgY3VycmVudCBzaW11bGF0b3IgY29kZS4KLQotTW9uIE5vdiAyNSAxMjo0NjozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBOZXcgZmlsZXMuCi0JKiBnZW5jb2RlLmMsIGludGVycC5jLCBtbjEwMzAwX3NpbS5oLCBzaW1vcHMuYzogTmV3IGZpbGVzLgotCQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvTWFrZWZpbGUuaW4gYi9zaW0vbW4xMDMwMC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1YTcxOS4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDMwMC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBtbjEwMzAwIHNpbSBsaWJyYXJ5LgotIyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKLQotV0lUSE9VVF9DT01NT05fT0JKUyA9IHRhYmxlLm8gc2ltb3BzLm8gc2ltLWxvYWQubwotV0lUSE9VVF9DT01NT05fSU5URVJQX0RFUCA9IHRhYmxlLmMKLVdJVEhfQ09NTU9OX09CSlMgPSBcCi0JaXRhYmxlLm8gc2VtYW50aWNzLm8gaWRlY29kZS5vIGljYWNoZS5vIGVuZ2luZS5vIGlydW4ubyBzdXBwb3J0Lm8gXAotCSQoU0lNX05FV19DT01NT05fT0JKUykgXAotCW9wX3V0aWxzLm8gXAotCXNpbS1lbmdpbmUubyBcCi0Jc2ltLWhsb2FkLm8gXAotCXNpbS1ocncubyBcCi0Jc2ltLXJlc3VtZS5vIFwKLQlzaW0tcmVhc29uLm8gXAotCXNpbS1zdG9wLm8gXAotCWR2LXNvY2tzZXIubwotV0lUSF9DT01NT05fSU5URVJQX0RFUCA9IAotCi1NTjEwMzAwX09CSlMgPSAkKEBtbjEwMzAwX2NvbW1vbkBfQ09NTU9OX09CSlMpCi1NTjEwMzAwX0lOVEVSUF9ERVAgPSAkKEBtbjEwMzAwX2NvbW1vbkBfQ09NTU9OX0lOVEVSUF9ERVApCi0KLVNJTV9PQkpTID0gJChNTjEwMzAwX09CSlMpIGludGVycC5vCi0KLSMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCi1XSVRIT1VUX0NPTU1PTl9SVU5fT0JKUyA9IHJ1bi5vCi1XSVRIX0NPTU1PTl9SVU5fT0JKUyA9IG5ydW4ubwotU0lNX1JVTl9PQkpTID0gJChAbW4xMDMwMF9jb21tb25AX0NPTU1PTl9SVU5fT0JKUykKLQotU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4tZXh0cmEKLQotIyBTZWxlY3QgbW4xMDMwMCBzdXBwb3J0IGluIG5sdHZhbHMuZGVmLgotTkxfVEFSR0VUID0gLUROTF9UQVJHRVRfbW4xMDMwMAotCi1JTkNMVURFID0gbW4xMDMwMF9zaW0uaCAkKHNyY2RpcikvLi4vLi4vaW5jbHVkZS9jYWxsYmFjay5oCi0KLSMgTGlzdCBvZiBleHRyYSBmbGFncyB0byBhbHdheXMgcGFzcyB0byAkKENDKS4KLVNJTV9FWFRSQV9DRkxBR1MgPSBAc2ltX2dlbkAgLURQT0xMX1FVSVRfSU5URVJWQUw9MHgyMAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi0KLSMKLSMgT2xkIGdlbmVyYXRvciAoZGVmYXVsdCkKLSMKLQotc2ltb3BzLmg6IGdlbmNvZGUKLQkuL2dlbmNvZGUgLWggPiRACi0KLXRhYmxlLmM6IGdlbmNvZGUgc2ltb3BzLmgKLQkuL2dlbmNvZGUgPiRACi0KLWdlbmNvZGUubzogZ2VuY29kZS5jICQoSU5DTFVERSkKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW5jb2RlLmMKLQotbTEwMzAwLW9wYy5vOiAkKHNyY2RpcikvLi4vLi4vb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL20xMDMwMC1vcGMuYwotCi1nZW5jb2RlOiBnZW5jb2RlLm8gbTEwMzAwLW9wYy5vCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtbyBnZW5jb2RlIGdlbmNvZGUubyBtMTAzMDAtb3BjLm8gJChCVUlMRF9MSUIpCi0KLQotCi0KLUJVSUxUX1NSQ19GUk9NX0lHRU4gPSBcCi0JaWNhY2hlLmggXAotCWljYWNoZS5jIFwKLQlpZGVjb2RlLmggXAotCWlkZWNvZGUuYyBcCi0Jc2VtYW50aWNzLmggXAotCXNlbWFudGljcy5jIFwKLQltb2RlbC5oIFwKLQltb2RlbC5jIFwKLQlzdXBwb3J0LmggXAotCXN1cHBvcnQuYyBcCi0JaXRhYmxlLmggXAotCWl0YWJsZS5jIFwKLQllbmdpbmUuaCBcCi0JZW5naW5lLmMgXAotCWlydW4uYwotJChCVUlMVF9TUkNfRlJPTV9JR0VOKTogdG1wLWlnZW4KLQotCi0uUEhPTlk6IGNsZWFuLWlnZW4KLWNsZWFuLWlnZW46Ci0Jcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9JR0VOKQotCXJtIC1mIHRtcC1pZ2VuIHRtcC1pbnNucwotCi0uLi9pZ2VuL2lnZW46Ci0JY2QgLi4vaWdlbiAmJiAkKE1BS0UpCi0KLUlHRU5fVFJBQ0U9ICMgLUcgb21pdC1saW5lLW51bWJlcnMgIyAtRyB0cmFjZS1ydWxlLXNlbGVjdGlvbiAtRyB0cmFjZS1ydWxlLXJlamVjdGlvbiAtRyB0cmFjZS1lbnRyaWVzCi1JR0VOX0lOU049JChzcmNkaXIpL21uMTAzMDAuaWdlbiAkKHNyY2RpcikvYW0zMy5pZ2VuCi1JR0VOX0RDPSQoc3JjZGlyKS9tbjEwMzAwLmRjCi10bXAtaWdlbjogJChJR0VOX0lOU04pICQoSUdFTl9EQykgLi4vaWdlbi9pZ2VuCi0JY2QgLi4vaWdlbiAmJiAkKE1BS0UpCi0JLi4vaWdlbi9pZ2VuIFwKLQkJJChJR0VOX1RSQUNFKSBcCi0JCS1HIGdlbi1kaXJlY3QtYWNjZXNzIFwKLSAgICAgICAgICAgICAgICAtTSBtbjEwMzAwLGFtMzMgLUcgZ2VuLW11bHRpLXNpbT1hbTMzIFwKLQkJLUkgJChzcmNkaXIpIFwKLQkJLWkgJChJR0VOX0lOU04pIFwKLQkJLW8gJChJR0VOX0RDKSBcCi0JCS14IFwKLQkJLW4gaWNhY2hlLmggICAgLWhjIHRtcC1pY2FjaGUuaCBcCi0JCS1uIGljYWNoZS5jICAgIC1jICB0bXAtaWNhY2hlLmMgXAotCQktbiBzZW1hbnRpY3MuaCAtaHMgdG1wLXNlbWFudGljcy5oIFwKLQkJLW4gc2VtYW50aWNzLmMgLXMgIHRtcC1zZW1hbnRpY3MuYyBcCi0JCS1uIGlkZWNvZGUuaCAgIC1oZCB0bXAtaWRlY29kZS5oIFwKLQkJLW4gaWRlY29kZS5jICAgLWQgIHRtcC1pZGVjb2RlLmMgXAotCQktbiBtb2RlbC5oICAgICAtaG0gdG1wLW1vZGVsLmggXAotCQktbiBtb2RlbC5jICAgICAtbSAgdG1wLW1vZGVsLmMgXAotCQktbiBzdXBwb3J0LmggICAtaGYgdG1wLXN1cHBvcnQuaCBcCi0JCS1uIHN1cHBvcnQuYyAgIC1mICB0bXAtc3VwcG9ydC5jIFwKLQkJLW4gaXRhYmxlLmggICAgLWh0IHRtcC1pdGFibGUuaCBcCi0JCS1uIGl0YWJsZS5jICAgIC10ICB0bXAtaXRhYmxlLmMgXAotCQktbiBlbmdpbmUuaCAgICAtaGUgdG1wLWVuZ2luZS5oIFwKLQkJLW4gZW5naW5lLmMgICAgLWUgIHRtcC1lbmdpbmUuYyBcCi0JCS1uIGlydW4uYyAgICAgIC1yICB0bXAtaXJ1bi5jCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuaCBpY2FjaGUuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgaWNhY2hlLmMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuaCBpZGVjb2RlLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuYyBpZGVjb2RlLmMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIHNlbWFudGljcy5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuYyBzZW1hbnRpY3MuYwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBtb2RlbC5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG1vZGVsLmMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBzdXBwb3J0LmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBzdXBwb3J0LmMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5oIGl0YWJsZS5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuYyBpdGFibGUuYwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZW5naW5lLmggZW5naW5lLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWVuZ2luZS5jIGVuZ2luZS5jCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pcnVuLmMgaXJ1bi5jCi0JdG91Y2ggdG1wLWlnZW4KLQotCi1pbnRlcnAubzogaW50ZXJwLmMgJChNTjEwMzAwX0lOVEVSUF9ERVApICQoSU5DTFVERSkKLXNpbW9wcy5vOiBzaW1vcHMuYyAkKElOQ0xVREUpCi10YWJsZS5vOiB0YWJsZS5jCi0KLWNsZWFuLWV4dHJhOiBjbGVhbi1pZ2VuCi0Jcm0gLWYgdGFibGUuYyBzaW1vcHMuaCBnZW5jb2RlCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9hY2NvbmZpZy5oIGIvc2ltL21uMTAzMDAvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDMwMC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9hbTMzLmlnZW4gYi9zaW0vbW4xMDMwMC9hbTMzLmlnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDBhODUuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvYW0zMy5pZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsODcwMyArMCwwIEBACi0vLyBIZWxwZXI6ICAgICAgICAgICAgCi0vLwotLy8gR2l2ZW4gYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgbnVtYmVyLCB0cmFuc2xhdGUgaXQgaW50byBhbiBpbmRleCBpbnRvIHRoZQotLy8gcmVnaXN0ZXIgYXJyYXkuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgdXBwZXIgOCBleHRlbmRlZCByZWdpc3RlcnMgYXJlCi0vLyBhY3R1YWxseSBzeW5vbnltcyBmb3IgdGhlIGQwLWQzL2EwLWEzIHJlZ2lzdGVycy4KLS8vCi0vLwotCi06ZnVuY3Rpb246OjppbnQ6dHJhbnNsYXRlX3JyZWc6aW50IHJyZWcKLXsKLSAgCi0gIC8qIFRoZSBoaWdoZXIgcmVnaXN0ZXIgbnVtYmVycyBhY3R1YWxseSBjb3JyZXNwb25kIHRvIHRoZQotICAgICBiYXNpYyBtYWNoaW5lJ3MgYWRkcmVzcyBhbmQgZGF0YSByZWdpc3RlcnMuICAqLwotICBpZiAocnJlZyA+IDcgJiYgcnJlZyA8IDEyKQotICAgIHJldHVybiBSRUdfQTAgKyBycmVnIC0gODsKLSAgZWxzZSBpZiAocnJlZyA+IDExICYmIHJyZWcgPCAxNikKLSAgICByZXR1cm4gUkVHX0QwICsgcnJlZyAtIDEyOwotICBlbHNlCi0gICAgcmV0dXJuIFJFR19FMCArIHJyZWc7Ci19Ci0KLTpmdW5jdGlvbjo6OmludDp0cmFuc2xhdGVfeHJlZzppbnQgeHJlZwotewotICBzd2l0Y2ggKHhyZWcpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiBSRUdfU1A7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIFJFR19NRFJROwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBSRUdfTUNSSDsKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gUkVHX01DUkw7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIFJFR19NQ1ZGOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMDAwMCAwMDEwIDAwQW47IG1vdiBVU1AsQW4KLTguMHhmMCs0LjB4MiwwMCwyLkFOMDpEMG06Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdID0gU3RhdGUucmVnc1tSRUdfVVNQXTsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDAxMCAwMUFuOyBtb3YgU1NQLEFuCi04LjB4ZjArNC4weDIsMDEsMi5BTjA6RDBuOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSA9IFN0YXRlLnJlZ3NbUkVHX1NTUF07Ci19Ci0KLQotLy8gMTExMSAwMDAwIDAwMTAgMTBBbjsgbW92IE1TUCxBbgotOC4weGYwKzQuMHgyLDEwLDIuQU4wOkQwbzo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBTdGF0ZS5yZWdzW1JFR19NU1BdOwotfQotCi0KLS8vIDExMTEgMDAwMCAwMDEwIDExQW47IG1vdiBQQyxBbgotOC4weGYwKzQuMHgyLDExLDIuQU4wOkQwcDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBQQzsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDAxMSBBbTAwOyBtb3YgQW0sVVNQCi04LjB4ZjArNC4weDMsMi5BTTEsMDA6RDBxOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX1VTUF0gPSBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV07Ci19Ci0KLS8vIDExMTEgMDAwMCAwMDExIEFtMDE7IG1vdiBBbSxTU1AKLTguMHhmMCs0LjB4MywyLkFNMSwwMTpEMHI6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfU1NQXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXTsKLX0KLQotLy8gMTExMSAwMDAwIDAwMTEgQW0xMDsgbW92IEFtLE1TUAotOC4weGYwKzQuMHgzLDIuQU0xLDEwOkQwczo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19NU1BdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMTEwIGltbTQ7IHN5c2NhbGwKLTguMHhmMCs0LjB4ZSxJTU00OkQwdDo6OnN5c2NhbGwKLSJzeXNjYWxsIgotKmFtMzMKLXsKLSAgdW5zaWduZWQzMiBzcCwgbmV4dF9wYzsKLQotICBQQyA9IGNpYTsKLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyAyOwotICBzdG9yZV93b3JkIChzcCAtIDQsIG5leHRfcGMpOwotICBzdG9yZV93b3JkIChzcCAtIDgsIFBTVyk7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IDB4NDAwMDAwMDAgKyBJTU00ICogODsKLSAgbmlhID0gUEM7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDExMTAgMTFEbjsgbW92IEVQU1csRG4KLTguMHhmMis0LjB4ZSwxMSwyLkROMDpEMHU6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gUFNXOwotfQotCi0KLS8vIDExMTEgMDAxMCAxMTExIERtMDE7IG1vdiBEbSxFUFNXCi04LjB4ZjIrNC4weGYsMi5ETTEsMDE6RDB2Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgUEMgPSBjaWE7Ci0gIFBTVyA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLX0KLQotLy8gMTExMSAwMTAxIDAwQW0gUm47IG1vdiBBbSxSbgotOC4weGY1KzAwLDIuQU0xLDQuUk4wOkQwdzo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkZXN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tkZXN0cmVnXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXTsKLX0KLQotLy8gMTExMSAwMTAxIDAxRG0gUm47IG1vdiBEbSxSbgotOC4weGY1KzAxLDIuRE0xLDQuUk4wOkQweDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkZXN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tkZXN0cmVnXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLX0KLQotLy8gMTExMSAwMTAxIDEwUm0gQW47IG1vdiBSbSxBbgotOC4weGY1KzEwLDQuUk0xLDIuQU4wOkQweTo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkZXN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdID0gU3RhdGUucmVnc1tkZXN0cmVnXTsKLX0KLQotLy8gMTExMSAwMTAxIDExUm0gRG47IG1vdiBSbSxEbgotOC4weGY1KzExLDQuUk0xLDIuRE4wOkQwejo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkZXN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gU3RhdGUucmVnc1tkZXN0cmVnXTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMTEwMCAxMTEwIHJlZ3MuLi4uOyBtb3ZtIChVU1ApLHJlZ3MKLTguMHhmOCs4LjB4Y2UrOC5SRUdTOkQxYTo6Om1vdm0KLSJtb3ZtIgotKmFtMzMKLXsKLSAgdW5zaWduZWQzMiB1c3AgPSBTdGF0ZS5yZWdzW1JFR19VU1BdOwotICB1bnNpZ25lZDMyIG1hc2s7Ci0KLSAgUEMgPSBjaWE7Ci0gIG1hc2sgPSBSRUdTOwotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIHVzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAodXNwKTsKLSAgICAgIHVzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTElSXSA9IGxvYWRfd29yZCAodXNwKTsKLSAgICAgIHVzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IGxvYWRfd29yZCAodXNwKTsKLSAgICAgIHVzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAodXNwKTsKLSAgICAgIHVzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTBdID0gbG9hZF93b3JkICh1c3ApOwotICAgICAgdXNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDFdID0gbG9hZF93b3JkICh1c3ApOwotICAgICAgdXNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHVzcCk7Ci0gICAgICB1c3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHVzcCk7Ci0gICAgICB1c3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDIwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0gPSBsb2FkX3dvcmQgKHVzcCk7Ci0gICAgICB1c3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10gPSBsb2FkX3dvcmQgKHVzcCk7Ci0gICAgICB1c3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHVzcCk7Ci0gICAgICB1c3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoID09IGJmZF9tYWNoX2FtMzMKLSAgICAgICkKLSAgICB7Ci0gICAgICBpZiAobWFzayAmIDB4MSkKLQl7Ci0JICAvKiBOZWVkIHRvIHJlc3RvcmUgTURRUiwgTUNSSCwgTUNSTCwgYW5kIE1DVkYgKi8KLQkgIHVzcCArPSAxNjsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgMV0gPSBsb2FkX3dvcmQgKHVzcCk7Ci0JICB1c3AgKz0gNDsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgMF0gPSBsb2FkX3dvcmQgKHVzcCk7Ci0JICB1c3AgKz0gNDsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgyKQotICAgICAgICB7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDddID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDZdID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDVdID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDRdID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4NCkKLQl7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDNdID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDJdID0gbG9hZF93b3JkICh1c3ApOwotCSAgdXNwICs9IDQ7Ci0JfQotICAgIH0KLQotICAvKiBBbmQgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlci4gICovCi0gIFN0YXRlLnJlZ3NbUkVHX1VTUF0gPSB1c3A7Ci19Ci0KLS8vIDExMTEgMTAwMCAxMTAwIDExMTEgcmVncy4uLi47IG1vdm0gKFVTUCkscmVncwotOC4weGY4KzguMHhjZis4LlJFR1M6RDFiOjo6bW92bQotIm1vdm0iCi0qYW0zMwotewotICB1bnNpZ25lZDMyIHVzcCA9IFN0YXRlLnJlZ3NbUkVHX1VTUF07Ci0gIHVuc2lnbmVkMzIgbWFzazsKLQotICBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2ggPT0gYmZkX21hY2hfYW0zMwotICAgICAgKQotICAgIHsKLSAgICAgIGlmIChtYXNrICYgMHg0KQotCXsKLQkgIHVzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAodXNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDJdKTsKLQkgIHVzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAodXNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDNdKTsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgyKQotICAgICAgICB7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA0XSk7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA1XSk7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA2XSk7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA3XSk7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4MSkKLQl7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAwXSk7Ci0JICB1c3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAxXSk7Ci0JICB1c3AgLT0gMTY7Ci0JICAvKiBOZWVkIHRvIHNhdmUgTURRUiwgTUNSSCwgTUNSTCwgYW5kIE1DVkYgKi8KLQl9Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4MCkKLSAgICB7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg0MCkKLSAgICB7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgxMCkKLSAgICB7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIHVzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAodXNwLCBTdGF0ZS5yZWdzW1JFR19EMF0pOwotICAgICAgdXNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkICh1c3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0pOwotICAgICAgdXNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkICh1c3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSk7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfTURSXSk7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7Ci0gICAgICB1c3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHVzcCwgU3RhdGUucmVnc1tSRUdfTEFSXSk7Ci0gICAgICB1c3AgLT0gNDsKLSAgICB9Ci0KLSAgLyogQW5kIG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIuICAqLwotICBTdGF0ZS5yZWdzW1JFR19VU1BdID0gdXNwOwotfQotCi0vLyAxMTExIDExMDAgMTExMSAxMTAwIGltbTMyLi4uOyBhbmQgaW1tMzIsRVBTVyAKLTguMHhmYys4LjB4ZmMrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6NGE6OjphbmQKLSJhbmQiCi0qYW0zMwotewotICBQQyA9IGNpYTsKLSAgUFNXICY9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLX0KLQotLy8gMTExMSAxMTAwIDExMTEgMTEwMSBpbW0zMi4uLjsgb3IgaW1tMzIsRVBTVyAKLTguMHhmYys4LjB4ZmQrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRhOjo6b3IKLSJvciIKLSphbTMzCi17Ci0gIFBDID0gY2lhOwotICBQU1cgfD0gRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOwotfQotCi0vLyAxMTExIDEwMDEgMDAwMCAxMDAwIFJtIFJuOyBtb3YgUm0sUm4gKFJtICE9IFJuKQotOC4weGY5KzguMHgwOCs0LlJNMiw0LlJOMCFSTTI6RDFnOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotCi0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLX0KLQotLy8gMTExMSAxMDAxIDAwMDEgMTAwMCBSbiBSbjsgZXh0IFJuCi04LjB4ZjkrOC4weDE4KzQuUk4wLDQuUk4yPVJOMDpEMTo6OmV4dAotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGlmIChTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweDgwMDAwMDAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAtMTsKLSAgZWxzZQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAwOwotfQotCi0vLyAxMTExIDEwMDEgMDAxMCAxMDAwIFJtIFJuOyBleHRiIFJtLFJuCi04LjB4ZjkrOC4weDI4KzQuUk0yLDQuUk4wIVJNMjpEMTo6OmV4dGIKLSJleHRiIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBFWFRFTkQ4IChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMDEgMDAxMSAxMDAwIFJtIFJuOyBleHRidSBSbSxSbgotOC4weGY5KzguMHgzOCs0LlJNMiw0LlJOMCFSTTI6RDE6OjpleHRidQotImV4dGJ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmOwotfQotCi0vLyAxMTExIDEwMDEgMDEwMCAxMDAwIFJtIFJuOyBleHRoIFJtLFJuCi04LjB4ZjkrOC4weDQ4KzQuUk0yLDQuUk4wIVJNMjpEMTo6OmV4dGgKLSJleHRoIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBFWFRFTkQxNiAoU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMDAxIDAxMDEgMTAwMCBSbSBSbjsgZXh0aHUgUm0sUm4KLTguMHhmOSs4LjB4NTgrNC5STTIsNC5STjAhUk0yOkQxOjo6ZXh0aHUKLSJleHRodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZmZmOwotfQotCi0vLyAxMTExIDEwMDEgMDExMCAxMDAwIFJuIFJuOyBjbHIgUm4KLTguMHhmOSs4LjB4NjgrNC5STTIsNC5STjA9Uk0yOkQxOjo6Y2xyCi0iY2xyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gMDsKLSAgUFNXIHw9IFBTV19aOwotICBQU1cgJj0gfihQU1dfViB8IFBTV19DIHwgUFNXX04pOwotfQotCi0vLyAxMTExIDEwMDEgMDExMSAxMDAwIFJtIFJuOyBhZGQgUm0sUm4KLTguMHhmOSs4LjB4NzgrNC5STTIsNC5STjA6RDFiOjo6YWRkCi0iYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQWRkIChTdGF0ZS5yZWdzW3NyY3JlZ10sIGRzdHJlZyk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDAwIDEwMDAgUm0gUm47IGFkZGMgUm0sUm4KLTguMHhmOSs4LjB4ODgrNC5STTIsNC5STjA6RDFiOjo6YWRkYwotImFkZGMiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIHJlZzEsIHJlZzIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICByZWcxID0gU3RhdGUucmVnc1tzcmNyZWddOwotICByZWcyID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBzdW0gPSByZWcxICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgcmVnMSkgfHwgKHN1bSA8IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotICAgICAgICAgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLy8gMTExMSAxMDAxIDEwMDEgMTAwMCBSbSBSbjsgc3ViIFJtLFJuCi04LjB4ZjkrOC4weDk4KzQuUk0yLDQuUk4wOkQxYjo6OnN1YgotInN1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZ2VuZXJpY1N1YiAoU3RhdGUucmVnc1tzcmNyZWddLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDEwMDEgMTAxMCAxMDAwIFJtIFJuOyBzdWJjIFJtLFJuCi04LjB4ZjkrOC4weGE4KzQuUk0yLDQuUk4wOkQxYjo6OnN1YmMKLSJzdWJjIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQzMiByZWcxLCByZWcyLCBkaWZmZXJlbmNlOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW3NyY3JlZ107Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW2RzdHJlZ107Ci0gIGRpZmZlcmVuY2UgPSByZWcyIC0gcmVnMSAtICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBkaWZmZXJlbmNlOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoZGlmZmVyZW5jZSA9PSAwKTsKLSAgbiA9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDExIDEwMDAgUm4gUm47IGluYyBSbgotOC4weGY5KzguMHhiOCs0LlJOMCw0LlJOMj1STjA6RDE6OjppbmMKLSJpbmMiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQWRkICgxLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDEwMDEgMTEwMSAxMDAwIFJuIFJuOyBpbmMgUm4KLTguMHhmOSs4LjB4YzgrNC5STjAsNC5STjI9Uk4wOkQxOjo6aW5jNAotImluYzQiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQWRkICg0LCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDEwMDEgMTEwMSAxMDAwIFJtIFJuOyBjbXAgUm0sUm4KLTguMHhmOSs4LjB4ZDgrNC5STTIsNC5STjA6RDE6OjpjbXAKLSJjbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzJdLCBTdGF0ZS5yZWdzW3NyY3JlZzFdKTsKLX0KLQotLy8gMTExMSAxMDAxIDExMTAgMTAwMCBYUm0gUm47IG1vdiBYUm0sUm4KLTguMHhmOSs4LjB4ZTgrNC5YUk0yLDQuUk4wOkQxbDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcsIHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3hyZWcgKFNEXywgWFJNMik7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gU3RhdGUucmVnc1tzcmNyZWddOwotfQotCi0vLyAxMTExIDEwMDEgMTExMSAxMDAwIFJtIFhSbjsgbW92IFJtLFhSbgotOC4weGY5KzguMHhmOCs0LlJNMiw0LlhSTjA6RDFtOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfeHJlZyAoU0RfLCBYUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBTdGF0ZS5yZWdzW3NyY3JlZ107Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDAwIDEwMDEgUm0gUm47IGFuZCBSbSxSbgotOC4weGY5KzguMHgwOSs0LlJNMiw0LlJOMDpEMWE6OjphbmQKLSJhbmQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotCi0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddICY9IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDAxIDEwMDEgUm0gUm47IG9yIFJtLFJuCi04LjB4ZjkrOC4weDE5KzQuUk0yLDQuUk4wOkQxYTo6Om9yCi0ib3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSB8PSBTdGF0ZS5yZWdzW3NyY3JlZ107Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMDAxMCAxMDAxIFJtIFJuOyB4b3IgUm0sUm4KLTguMHhmOSs4LjB4MjkrNC5STTIsNC5STjA6RDFhOjo6eG9yCi0ieG9yIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gXj0gU3RhdGUucmVnc1tzcmNyZWddOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDAxIDAwMTEgMTAwMSBSbiBSbjsgbm90IFJuCi04LjB4ZjkrOC4weDM5KzQuUk0yLDQuUk4wPVJNMjpEMTo6Om5vdAotIm5vdCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IH5TdGF0ZS5yZWdzW2RzdHJlZ107Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMDEwMCAxMDAxIFJtIFJuOyBhc3IgUm0sUm4KLTguMHhmOSs4LjB4NDkrNC5STTIsNC5STjA6RDFhOjo6YXNyCi0iYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBzaWduZWQzMiB0ZW1wOwotICBpbnQgYywgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMDEwMSAxMDAxIFJtIFJuOyBsc3IgUm0sUm4KLTguMHhmOSs4LjB4NTkrNC5STTIsNC5STjA6RDFhOjo6bHNyCi0ibHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgeiwgbiwgYzsKLQotICBQQyA9IGNpYTsKLQotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGMgPSBTdGF0ZS5yZWdzW2RzdHJlZ10gJiAxOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMDExMCAxMDAxIFJtIFJuOyBhc2wgUm0sUm4KLTguMHhmOSs4LjB4NjkrNC5STTIsNC5STjA6RDFhOjo6YXNsCi0iYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPDw9IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDAxIDAxMTEgMTAwMSBSbiBSbjsgYXNsMiBSbgotOC4weGY5KzguMHg3OSs0LlJNMiw0LlJOMD1STTI6RDE6Ojphc2wyCi0iYXNsMiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA8PD0gMjsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDAxIDEwMDAgMTAwMSBSbiBSbjsgcm9yIFJuCi04LjB4ZjkrOC4weDg5KzQuUk0yLDQuUk4wPVJNMjpEMTo6OnJvcgotInJvciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCBjLCBuLCB6OwotICB1bnNpZ25lZDMyIHZhbHVlOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHZhbHVlID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBjID0gKHZhbHVlICYgMHgxKTsKLQotICB2YWx1ZSA+Pj0gMTsKLSAgdmFsdWUgfD0gKChQU1cgJiBQU1dfQykgIT0gMCkgPyAweDgwMDAwMDAwIDogMDsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdmFsdWU7Ci0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotLy8gMTExMSAxMDAxIDEwMDEgMTAwMSBSbiBSbjsgcm9sIFJuCi04LjB4ZjkrOC4weDk5KzQuUk0yLDQuUk4wPVJNMjpEMTo6OnJvbAotInJvbCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCBjLCBuLCB6OwotICB1bnNpZ25lZDMyIHZhbHVlOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHZhbHVlID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBjID0gKHZhbHVlICYgMHg4MDAwMDAwMCkgPyAxIDogMDsKLQotICB2YWx1ZSA8PD0gMTsKLSAgdmFsdWUgfD0gKChQU1cgJiBQU1dfQykgIT0gMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDEwIDEwMDEgUm0gUm47IG11bCBSbSxSbgotOC4weGY5KzguMHhhOSs0LlJNMiw0LlJOMDpEMWI6OjptdWwKLSJtdWwiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbZHN0cmVnXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDExIDEwMDEgUm0gUm47IG11bHUgUm0sUm4KLTguMHhmOSs4LjB4YjkrNC5STTIsNC5STjA6RDFiOjo6bXVsdQotIm11bHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW2RzdHJlZ10KLSAgICAgICAgICAqICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMTEwMCAxMDAxIFJtIFJuOyBkaXYgUm0sUm4KLTguMHhmOSs4LjB4YzkrNC5STTIsNC5STjA6RDFiOjo6ZGl2Ci0iZGl2IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBzaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfTURSXTsKLSAgdGVtcCA8PD0gMzI7Ci0gIHRlbXAgfD0gU3RhdGUucmVnc1tkc3RyZWddOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcCAlIChzaWduZWQzMilTdGF0ZS5yZWdzW3NyY3JlZ107Ci0gIHRlbXAgLz0gKHNpZ25lZDMyKVN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMTEwMSAxMDAxIFJtIFJuOyBkaXZ1IFJtLFJuCi04LjB4ZjkrOC4weGQ5KzQuUk0yLDQuUk4wOkQxYjo6OmRpdnUKLSJkaXZ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19NRFJdOwotICB0ZW1wIDw8PSAzMjsKLSAgdGVtcCB8PSBTdGF0ZS5yZWdzW2RzdHJlZ107Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSB0ZW1wICUgU3RhdGUucmVnc1tzcmNyZWddOwotICB0ZW1wIC89IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAwMSAwMDAwIDEwMTAgUm0gUm47IG1vdiAoUm0pLFJuCi04LjB4ZjkrOC4weDBhKzQuUk4yLDQuUk0wOkQxaDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMDEgMDAwMSAxMDEwIFJtIFJuOyBtb3YgUm0sKFJuKQotOC4weGY5KzguMHgxYSs0LlJNMiw0LlJOMDpEMWk6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbZHN0cmVnXSwgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMDAxIDAwMTAgMTAxMCBSbSBSbjsgbW92YnUgKFJtKSxSbgotOC4weGY5KzguMHgyYSs0LlJOMiw0LlJNMDpEMWc6Ojptb3ZidQotIm1vdmJ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDExIDEwMTAgUm0gUm47IG1vdmJ1IFJtLChSbikKLTguMHhmOSs4LjB4M2ErNC5STTIsNC5STjA6RDFpOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMDEgMDEwMCAxMDEwIFJtIFJuOyBtb3ZodSAoUm0pLFJuCi04LjB4ZjkrOC4weDRhKzQuUk4yLDQuUk0wOkQxZzo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMDAxIDAxMDEgMTAxMCBSbSBSbjsgbW92aHUgUm0sKFJuKQotOC4weGY5KzguMHg1YSs0LlJNMiw0LlJOMDpEMWk6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW2RzdHJlZ10sIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMTEwIDEwMTAgUm0gUm47IG1vdiAoUm0rKSxSbgotOC4weGY5KzguMHg2YSs0LlJOMiw0LlJNMCFSTjI6RDF5Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSA0OwotfQotCi0vLyAxMTExIDEwMDEgMDExMSAxMDEwIFJtIFJuOyBtb3YgUm0sKFJuKykKLTguMHhmOSs4LjB4N2ErNC5STTIsNC5STjA6RDF6Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW2RzdHJlZ10sIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSArPSA0OwotfQotCi0vLyAxMTExIDEwMDEgMTAwMCAxMDEwIFJuIDAwMDA7IG1vdiAoc3ApLFJuCi04LjB4ZjkrOC4weDhhKzQuUk4yLDQuMDAwMDpEMWo6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDAxIDEwMTAgUm0gMDAwMDsgbW92IFJtLCAoc3ApCi04LjB4ZjkrOC4weDlhKzQuUk0yLDQuMDAwMDpEMWs6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0sIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDEwIDEwMTAgUm4gMDAwMDsgbW9idnUgKHNwKSxSbgotOC4weGY5KzguMHhhYSs0LlJOMiw0LjAwMDA6RDFqOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdKTsKLX0KLQotLy8gMTExMSAxMDAxIDEwMTEgMTAxMCBSbSAwMDAwOyBtb3ZidSBSbSwgKHNwKQotOC4weGY5KzguMHhiYSs0LlJNMiw0LjAwMDA6RDFrOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXSwgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMDAxIDEwMDAgMTEwMCBSbiAwMDAwOyBtb3ZodSAoc3ApLFJuCi04LjB4ZjkrOC4weGNhKzQuUk4yLDQuMDAwMDpEMWo6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0pOwotfQotCi0vLyAxMTExIDEwMDEgMTAwMSAxMTAxIFJtIDAwMDA7IG1vdmh1IFJtLCAoc3ApCi04LjB4ZjkrOC4weGRhKzQuUk0yLDQuMDAwMDpEMWs6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMDEgMTExMCAxMDEwIFJtIFJuOyBtb3ZodSAoUm0rKSxSbgotOC4weGY5KzguMHhlYSs0LlJOMiw0LlJNMCFSTjI6RDF5Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW3NyY3JlZ10gKz0gMjsKLX0KLQotLy8gMTExMSAxMDAxIDExMTEgMTAxMCBSbSBSbjsgbW92aHUgUm0sKFJuKykKLTguMHhmOSs4LjB4ZmErNC5STTIsNC5STjA6RDF6Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gKz0gMjsKLX0KLQotCi0vLyAxMTExIDEwMDEgMDAwMCAxMDExIFJtIFJuOyBtYWMgUm0sUm4KLTguMHhmOSs4LjB4MGIrNC5STTIsNC5STjA6RDE6OjptYWMKLSJtYWMiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMjsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW3NyY3JlZzJdCi0gICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3Nbc3JjcmVnMV0pOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDAxIDEwMTEgUm0gUm47IG1hY3UgUm0sUm4KLTguMHhmOSs4LjB4MWIrNC5STTIsNC5STjA6RDE6OjptYWN1Ci0ibWFjdSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyOwotICB1bnNpZ25lZDY0IHRlbXAsIHN1bTsKLSAgaW50IGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnMl0KLSAgICAgICAgICAqICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnMV0pOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDEwIDEwMTEgUm0gUm47IG1hY2IgUm0sUm4KLTguMHhmOSs4LjB4MmIrNC5STTIsNC5STjA6RDE6OjptYWNiCi0ibWFjYiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyOwotICBzaWduZWQzMiB0ZW1wLCBzdW07Ci0gIGludCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDgpKFN0YXRlLnJlZ3Nbc3JjcmVnMl0gJiAweGZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQ4KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZikpOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArIHRlbXA7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkxdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTAwMSAwMDExIDEwMTEgUm0gUm47IG1hY2J1IFJtLFJuCi04LjB4ZjkrOC4weDNiKzQuUk0yLDQuUk4wOkQxOjo6bWFjYnUKLSJtYWNidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcyXSAmIDB4ZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmYpKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyB0ZW1wOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JMXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDEwMDEgMDEwMCAxMDExIFJtIFJuOyBtYWNoIFJtLFJuCi04LjB4ZjkrOC4weDRiKzQuUk0yLDQuUk4wOkQxOjo6bWFjaAotIm1hY2giCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMjsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkNjQpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMDAxIDAxMDEgMTAxMSBSbSBSbjsgbWFjaHUgUm0sUm4KLTguMHhmOSs4LjB4NWIrNC5STTIsNC5STjA6RDE6OjptYWNodQotIm1hY2h1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzI7Ci0gIHNpZ25lZDY0IHRlbXAsIHN1bTsKLSAgaW50IGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KShTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkNjQpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyAodGVtcCAmIDB4ZmZmZmZmZmYpOwotICBjID0gKHN1bSA8IFN0YXRlLnJlZ3NbUkVHX01DUkxdKSB8fCAoc3VtIDwgKHRlbXAgJiAweGZmZmZmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXSArIHRlbXAgKyBjOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JIXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JIXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDEwMDEgMDExMCAxMDExIFJtIFJuOyBkbWFjaCBSbSxSbgotOC4weGY5KzguMHg2Yis0LlJNMiw0LlJOMDpEMTo6OmRtYWNoCi0iZG1hY2giCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMjsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnMl0gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHRlbXAyID0gKChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLQkgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW3NyY3JlZzJdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSTF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMDAxIDAxMTEgMTAxMSBSbSBSbjsgZG1hY2h1IFJtLFJuCi04LjB4ZjkrOC4weDdiKzQuUk0yLDQuUk4wOkQxOjo6ZG1hY2h1Ci0iZG1hY2h1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzI7Ci0gIHVuc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHVuc2lnbmVkMzIpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLQkgICAqICh1bnNpZ25lZDMyKSgoU3RhdGUucmVnc1tzcmNyZWcyXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkxdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDAwIDEwMTEgUm0gUm47IGRtdWxoIFJtLFJuCi04LjB4ZjkrOC4weDhiKzQuUk0yLDQuUk4wOkQxOjo6ZG11bGgKLSJkbXVsaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLSAgc2lnbmVkMzIgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnXSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9IHRlbXA7Ci0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWddID4+MTYpICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXA7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMDAxIDEwMTEgUm0gUm47IGRtdWxodSBSbSxSbgotOC4weGY5KzguMHg5Yis0LlJNMiw0LlJOMDpEMTo6OmR1bWFjaHUKLSJkbWFjaHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIHVuc2lnbmVkMzIgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweGZmZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gdGVtcDsKLSAgdGVtcCA9ICgodW5zaWduZWQzMikoKFN0YXRlLnJlZ3NbZHN0cmVnXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQzMikoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PjE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0ZW1wOwotfQotCi0vLyAxMTExIDEwMDEgMTAxMCAxMDExIFJtIFJuOyBzYXQxNiBSbSxSbgotOC4weGY5KzguMHhhYis0LlJNMiw0LlJOMDpEMTo6OnNhdDE2Ci0ic2F0MTYiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB2YWx1ZSwgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB2YWx1ZSA9IFN0YXRlLnJlZ3Nbc3JjcmVnXTsKLQotICBpZiAodmFsdWUgPj0gMHg3ZmZmKQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAodmFsdWUgPD0gMHhmZmZmODAwMCkKLSAgICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgU3RhdGUucmVnc1tkc3RyZWddID0gdmFsdWU7Ci0KLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDApICE9IDA7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMDEgMTAxMSAxMDExIFJtIFJuOyBtY3N0ZSBSbSxSbiAKLTguMHhmOSs4LjB4YmIrNC5STTIsNC5STjA6RDE6OjptY3N0ZQotIm1jc3RlIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFBTVyAmPSB+KFBTV19WIHwgUFNXX0MpOwotICBQU1cgfD0gKFN0YXRlLnJlZ3NbUkVHX01DVkZdID8gUFNXX1YgOiAwKTsKLSAgCi0gIC8qIDMyYml0IHNhdHVyYXRpb24uICAqLwotICBpZiAoU3RhdGUucmVnc1tzcmNyZWddID09IDB4MjApCi0gICAgewotICAgICAgc2lnbmVkNjQgdG1wOwotCi0gICAgICB0bXAgPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXTsKLSAgICAgIHRtcCA8PD0gMzI7Ci0gICAgICB0bXAgKz0gU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0KLSAgICAgIGlmICh0bXAgPiAweDdmZmZmZmZmKSAgICAKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDdmZmZmZmZmOwotICAgICAgZWxzZSBpZiAodG1wIDwgMHhmZmZmZmZmZjgwMDAwMDAwTEwpCi0JU3RhdGUucmVnc1tkc3RyZWddID0gMHg4MDAwMDAwMDsKLSAgICAgIGVsc2UKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0bXA7Ci0gICAgfQotICAvKiAxNmJpdCBzYXR1cmF0aW9uICovCi0gIGVsc2UgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnXSA9PSAweDEwKQotICAgIHsKLSAgICAgIHNpZ25lZDY0IHRtcDsKLQotICAgICAgdG1wID0gU3RhdGUucmVnc1tSRUdfTUNSSF07Ci0gICAgICB0bXAgPDw9IDMyOwotICAgICAgdG1wICs9IFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gICAgICBpZiAodG1wID4gMHg3ZmZmKSAgICAKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDdmZmY7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmZmZmZmZmZmZjgwMDBMTCkKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDgwMDA7Ci0gICAgICBlbHNlCi0JU3RhdGUucmVnc1tkc3RyZWddID0gdG1wOwotICAgIH0KLSAgLyogOCBiaXQgc2F0dXJhdGlvbiAqLwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZ10gPT0gMHg4KQotICAgIHsKLSAgICAgIHNpZ25lZDY0IHRtcDsKLQotICAgICAgdG1wID0gU3RhdGUucmVnc1tSRUdfTUNSSF07Ci0gICAgICB0bXAgPDw9IDMyOwotICAgICAgdG1wICs9IFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gICAgICBpZiAodG1wID4gMHg3ZikgICAgCi0JU3RhdGUucmVnc1tkc3RyZWddID0gMHg3ZjsKLSAgICAgIGVsc2UgaWYgKHRtcCA8IDB4ZmZmZmZmZmZmZmZmZmY4MExMKQotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4ODA7Ci0gICAgICBlbHNlCi0JU3RhdGUucmVnc1tkc3RyZWddID0gdG1wOwotICAgIH0KLSAgLyogOSBiaXQgc2F0dXJhdGlvbiAqLwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZ10gPT0gMHg5KQotICAgIHsKLSAgICAgIHNpZ25lZDY0IHRtcDsKLQotICAgICAgdG1wID0gU3RhdGUucmVnc1tSRUdfTUNSSF07Ci0gICAgICB0bXAgPDw9IDMyOwotICAgICAgdG1wICs9IFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gICAgICBpZiAodG1wID4gMHg4MCkgICAgCi0JU3RhdGUucmVnc1tkc3RyZWddID0gMHg4MDsKLSAgICAgIGVsc2UgaWYgKHRtcCA8IDB4ZmZmZmZmZmZmZmZmZmY4MUxMKQotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4ODE7Ci0gICAgICBlbHNlCi0JU3RhdGUucmVnc1tkc3RyZWddID0gdG1wOwotICAgIH0KLSAgLyogOSBiaXQgc2F0dXJhdGlvbiAqLwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZ10gPT0gMHgzMCkKLSAgICB7Ci0gICAgICBzaWduZWQ2NCB0bXA7Ci0KLSAgICAgIHRtcCA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdOwotICAgICAgdG1wIDw8PSAzMjsKLSAgICAgIHRtcCArPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICAgICAgaWYgKHRtcCA+IDB4N2ZmZmZmZmZmZmZmTEwpICAgIAotCXRtcCA9IDB4N2ZmZmZmZmZmZmZmTEw7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmY4MDAwMDAwMDAwMDBMTCkKLQl0bXAgPSAweGZmZmY4MDAwMDAwMDAwMDBMTDsKLQotICAgICAgdG1wID4+PSAxNjsKLSAgICAgIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRtcDsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAwMSAxMTAwIDEwMTEgUm0gUm47IHN3YXAgUm0sUm4KLTguMHhmOSs4LjB4Y2IrNC5STTIsNC5STjA6RDE6Ojpzd2FwCi0ic3dhcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSAoKChTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmKSA8PCAyNCkKLQkJCXwgKCgoU3RhdGUucmVnc1tzcmNyZWddID4+IDgpICYgMHhmZikgPDwgMTYpCi0JCQl8ICgoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAxNikgJiAweGZmKSA8PCA4KQotCQkJfCAoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAyNCkgJiAweGZmKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAxMTAxIDEwMTEgUm0gUm47IHN3YXBoIFJtLFJuCi04LjB4ZjkrOC4weGRiKzQuUk0yLDQuUk4wOkQxOjo6c3dhcGgKLSJzd2FwaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSAoKChTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmKSA8PCA4KQotCQkJfCAoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiA4KSAmIDB4ZmYpCi0JCQl8ICgoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAxNikgJiAweGZmKSA8PCAyNCkKLQkJCXwgKCgoU3RhdGUucmVnc1tzcmNyZWddID4+IDI0KSAmIDB4ZmYpIDw8IDE2KSk7Ci19Ci0KLS8vIDExMTEgMTAwMSAxMTEwIDEwMTEgUm0gUm47IHN3aHcgUm0sUm4KLTguMHhmOSs4LjB4ZWIrNC5STTIsNC5STjA6RDE6Ojpzd2h3Ci0ic3dodyIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSAoKChTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmZmYpIDw8IDE2KQotCQkJfCAoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAxNikgJiAweGZmZmYpKTsKLX0KLQotLy8gMTExMSAxMDAxIDExMTEgMTAxMSBSbSBSbjsgYnNjaCBSbSxSbgotOC4weGY5KzguMHhmYis0LlJNMiw0LlJOMDpEMTo6OmJzY2gKLSJic2NoIgotKmFtMzMKLXsKLSAgaW50IHRlbXAsIGMsIGk7Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLSAgaW50IHN0YXJ0OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW3NyY3JlZ107Ci0gIHN0YXJ0ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4MWYpIC0gMTsKLSAgaWYgKHN0YXJ0ID09IC0xKQotICAgIHN0YXJ0ID0gMzE7Ci0gICAgCi0gIGZvciAoaSA9IHN0YXJ0OyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAodGVtcCAmICgxIDw8IGkpKQotCXsKLQkgIGMgPSAxOwotCSAgU3RhdGUucmVnc1tkc3RyZWddID0gaTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPCAwKQotICAgIHsKLSAgICAgIGMgPSAwOwotICAgICAgU3RhdGUucmVnc1tkc3RyZWddID0gMDsKLSAgICB9Ci0gIFBTVyAmPSB+KFBTV19DKTsKLSAgUFNXIHw9IChjID8gUFNXX0MgOiAwKTsKLX0KLQotCi0vLyAxMTExIDEwMTEgMDAwMCAxMDAwIFJuIFJuIElNTTg7IG1vdiBJTU04LFJuCi04LjB4ZmIrOC4weDA4KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJqOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gRVhURU5EOCAoSU1NOCk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAxIDEwMDAgUm4gUm4gSU1NODsgbW92dSBJTU04LFJuCi04LjB4ZmIrOC4weDE4KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDI6Ojptb3Z1Ci0ibW92dSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IElNTTggJiAweGZmOwotfQotCi0vLyAxMTExIDEwMTEgMDExMSAxMDAwIFJuIFJuIElNTTg7IGFkZCBJTU04LFJuCi04LjB4ZmIrOC4weDc4KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJkOjo6YWRkCi0iYWRkIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZ2VuZXJpY0FkZCAoRVhURU5EOCAoSU1NOCksIGRzdHJlZyk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDAwIDEwMDAgUm4gUm4gSU1NODsgYWRkYyBJTU04LFJuCi04LjB4ZmIrOC4weDg4KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJkOjo6YWRkYwotImFkZGMiCi0qYW0zMwotewotICBpbnQgZHN0cmVnLCBpbW07Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIHJlZzEsIHJlZzIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBpbW0gPSBFWFRFTkQ4IChJTU04KTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbZHN0cmVnXTsKLSAgc3VtID0gaW1tICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgaW1tKSB8fCAoc3VtIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDAxIDEwMDAgUm4gUm4gSU1NODsgc3ViIElNTTgsUm4KLTguMHhmYis4LjB4OTgrNC5STTIsNC5STjA9Uk0yKzguSU1NODpEMmQ6OjpzdWIKLSJzdWIiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGdlbmVyaWNTdWIgKEVYVEVORDggKElNTTgpLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDEwMTEgMTAxMCAxMDAwIFJuIFJuIElNTTg7IHN1YmMgSU1NOCxSbgotOC4weGZiKzguMHhhOCs0LlJNMiw0LlJOMD1STTIrOC5JTU04OkQyZDo6OnN1YmMKLSJzdWJjIgotKmFtMzMKLXsKLSAgaW50IGltbSwgZHN0cmVnOwotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQzMiByZWcxLCByZWcyLCBkaWZmZXJlbmNlOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGltbSA9IEVYVEVORDggKElNTTgpOwotICByZWcyID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBkaWZmZXJlbmNlID0gcmVnMiAtIGltbSAtICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBkaWZmZXJlbmNlOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoZGlmZmVyZW5jZSA9PSAwKTsKLSAgbiA9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoaW1tID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0gICAgICAgICAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMTEwMSAxMDAwIFJuIFJuIElNTTg7IGNtcCBJTU04LFJuCi04LjB4ZmIrOC4weGQ4KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJiOjo6Y21wCi0iY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZ2VuZXJpY0NtcCAoRVhURU5EOCAoSU1NOCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMTExIDEwMDAgWFJuIFhSbiBJTU04OyBtb3YgSU1NOCxYUm4KLTguMHhmYis4LjB4ZjgrNC5YUk0yLDQuWFJOMD1YUk0yKzguSU1NODpEMms6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfeHJlZyAoU0RfLCBYUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBJTU04OwotfQotCi0vLyAxMTExIDEwMTEgMDAwMCAxMDAxIFJuIFJuIElNTTg7IGFuZCBJTU04LFJuCi04LjB4ZmIrOC4weDA5KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJkOjo6YW5kCi0iYW5kIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddICY9IChJTU04ICYgMHhmZik7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMDAwMSAxMDAxIFJuIFJuIElNTTg7IG9yIElNTTgsUm4KLTguMHhmYis4LjB4MTkrNC5STTIsNC5STjA9Uk0yKzguSU1NODpEMmQ6OjpvcgotIm9yIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddIHw9IChJTU04ICYgMHhmZik7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMDAxMCAxMDAxIFJuIFJuIElNTTg7IHhvciBJTU04LFJuCi04LjB4ZmIrOC4weDI5KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJkOjo6eG9yCi0ieG9yIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddIF49IChJTU04ICYgMHhmZik7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMDEwMCAxMDAxIFJuIFJuIElNTTg7IGFzciBJTU04LFJuCi04LjB4ZmIrOC4weDQ5KzQuUk0yLDQuUk4wPVJNMis4LklNTTg6RDJhOjo6YXNyCi0iYXNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgc2lnbmVkMzIgdGVtcDsKLSAgaW50IGMsIHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnXTsKLSAgYyA9IHRlbXAgJiAxOwotICB0ZW1wID4+PSAoSU1NOCAmIDB4ZmYpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0ZW1wOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAxIDEwMDEgUm4gUm4gSU1NODsgbHNyIElNTTgsUm4KLTguMHhmYis4LjB4NTkrNC5STTIsNC5STjA9Uk0yKzguSU1NODpEMmE6Ojpsc3IKLSJsc3IiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICBpbnQgeiwgbiwgYzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBjID0gU3RhdGUucmVnc1tkc3RyZWddICYgMTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID4+PSAoSU1NOCAmIDB4ZmYpOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTEwIDEwMDEgUm4gUm4gSU1NODsgYXNsIElNTTgsUm4KLTguMHhmYis4LjB4NjkrNC5STTIsNC5STjA9Uk0yKzguSU1NODpEMmE6Ojphc2wKLSJhc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA8PD0gKElNTTggJiAweGZmKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDEwMTAgMTAwMSBSbiBSbiBJTU04OyBtdWwgSU1NOCxSbgotOC4weGZiKzguMHhhOSs0LlJNMiw0LlJOMD1STTIrOC5JTU04OkQyYTo6Om11bAotIm11bCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbZHN0cmVnXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpRVhURU5EOCAoSU1NOCkpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDEwMTEgMTAwMSBSbiBSbiBJTU04OyBtdWx1IElNTTgsUm4KLTguMHhmYis4LjB4YjkrNC5STTIsNC5STjA9Uk0yKzguSU1NODpEMmE6OjptdWx1Ci0ibXVsdSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW2RzdHJlZ10KLSAgICAgICAgICAqICh1bnNpZ25lZDY0KShJTU04ICYgMHhmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDExMTAgMTAwMSBSbiBSbiBJTU04OyBidHN0IGltbTgsUm4KLTguMHhmYis4LjB4ZTkrNC5STjIsNC5STTA9Uk4yKzguSU1NODpEMmw6OjpidHN0Ci0iYnRzdCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMCk7Ci0gIGdlbmVyaWNCdHN0KElNTTgsIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAwIDEwMTAgUm4gUm0gSU1NODsgbW92IChkOCxSbSksUm4KLTguMHhmYis4LjB4MGErNC5STjIsNC5STTArOC5JTU04OkQybDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW3NyY3JlZ10gKyBFWFRFTkQ4IChJTU04KSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAxIDEwMTAgUm4gUm0gSU1NODsgbW92IFJtLChkOCxSbikKLTguMHhmYis4LjB4MWErNC5STTIsNC5STjArOC5JTU04OkQybTo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tkc3RyZWddICsgRVhURU5EOCAoSU1NOCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDEwIDEwMTAgUm4gUm0gSU1NODsgbW92YnUgKGQ4LFJtKSxSbgotOC4weGZiKzguMHgyYSs0LlJOMiw0LlJNMCs4LklNTTg6RDJsOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW3NyY3JlZ10gKyBFWFRFTkQ4IChJTU04KSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDExIDEwMTAgUm4gUm0gSU1NODsgbW92YnUgUm0sKGQ4LFJuKQotOC4weGZiKzguMHgzYSs0LlJNMiw0LlJOMCs4LklNTTg6RDJtOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tkc3RyZWddICsgRVhURU5EOCAoSU1NOCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAwIDEwMTAgUm4gUm0gSU1NODsgbW92aHUgKGQ4LFJtKSxSbgotOC4weGZiKzguMHg0YSs0LlJOMiw0LlJNMCs4LklNTTg6RDJsOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW3NyY3JlZ10gKyBFWFRFTkQ4IChJTU04KSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAxIDEwMTAgUm4gUm0gSU1NODsgbW92aHUgUm0sKGQ4LFJuKQotOC4weGZiKzguMHg1YSs0LlJNMiw0LlJOMCs4LklNTTg6RDJtOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tkc3RyZWddICsgRVhURU5EOCAoSU1NOCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTEwIDEwMTAgUm4gUm0gSU1NODsgbW92IChkOCxSbSspLFJuCi04LjB4ZmIrOC4weDZhKzQuUk4yLDQuUk0wIVJOMis4LklNTTg6RDJ5Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ4IChJTU04KTsKLX0KLQotLy8gMTExMSAxMDExIDAxMTEgMTAxMCBSbiBSbSBJTU04OyBtb3YgUm0sKGQ4LFJuKykKLTguMHhmYis4LjB4N2ErNC5STTIsNC5STjArOC5JTU04OkQyejo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gKz0gRVhURU5EOCAoSU1NOCk7Ci19Ci0KLQotLy8gMTExMSAxMDExIDEwMDAgMTAxMCBSbiAwMDAwIElNTTg7IG1vdiAoZDgsc3ApLFJuCi04LjB4ZmIrOC4weDhhKzQuUk4yLDQuMHgwKzguSU1NODpEMm46Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIElNTTgpOwotfQotCi0vLyAxMTExIDEwMTEgMTAwMSAxMDEwIFJtIDAwMDAgSU1NODsgbW92IFJtLChkOCxzcCkKLTguMHhmYis4LjB4OWErNC5STTIsNC4weDArOC5JTU04OkQybzo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIElNTTgsIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDEwIDEwMTAgUm4gUm0gSU1NODsgbW92YnUgKGQ4LHNwKSxSbgotOC4weGZiKzguMHhhYSs0LlJOMiw0LjB4MCs4LklNTTg6RDJuOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgSU1NOCk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDExIDEwMTAgUm4gUm0gSU1NODsgbW92YnUgUm0sKGQ4LHNwKQotOC4weGZiKzguMHhiYSs0LlJNMiw0LjB4MCs4LklNTTg6RDJvOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIElNTTgsIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMTAwIDEwMTAgUm4gUm0gSU1NODsgbW92aHUgKGQ4LHNwKSxSbgotOC4weGZiKzguMHhjYSs0LlJOMiw0LjB4MCs4LklNTTg6RDJuOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgSU1NOCk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMTAxIDEwMTAgUm4gUm0gSU1NODsgbW92aHUgUm0sKGQ4LHNwKQotOC4weGZiKzguMHhkYSs0LlJNMiw0LjB4MCs4LklNTTg6RDJvOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIElNTTgsIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMTEwIDEwMTAgUm4gUm0gSU1NODsgbW92aHUgKGQ4LFJtKyksUm4KLTguMHhmYis4LjB4ZWErNC5STjIsNC5STTAhUk4yKzguSU1NODpEMnk6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ4IChJTU04KTsKLX0KLQotLy8gMTExMSAxMDExIDExMTEgMTAxMCBSbiBSbSBJTU04OyBtb3ZodSBSbSwoZDgsUm4rKQotOC4weGZiKzguMHhmYSs0LlJNMiw0LlJOMCs4LklNTTg6RDJ6Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gKz0gRVhURU5EOCAoSU1NOCk7Ci19Ci0KLQotLy8gMTExMSAxMDExIDAwMDAgMTAxMSBSbiBSbiBJTU04OyBtYWMgaW1tOCxSbgotOC4weGZiKzguMHgwYis0LlJOMiw0LlJOMD1STjIrOC5JTU04OkQyOjo6bWFjCi0ibWFjIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpRVhURU5EOCAoSU1NOCkKLSAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyAodGVtcCAmIDB4ZmZmZmZmZmYpOwotICBjID0gKHN1bSA8IFN0YXRlLnJlZ3NbUkVHX01DUkxdKSB8fCAoc3VtIDwgKHRlbXAgJiAweGZmZmZmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXSArIHRlbXAgKyBjOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JIXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JIXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDEwMTEgMDAwMSAxMDExIFJuIFJuIElNTTg7IG1hY3UgaW1tOCxSbgotOC4weGZiKzguMHgxYis0LlJOMiw0LlJOMD1STjIrOC5JTU04OkQyOjo6bWFjdQotIm1hY3UiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpIChJTU04KQotICAgICAgICAgICogKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyAodGVtcCAmIDB4ZmZmZmZmZmYpOwotICBjID0gKHN1bSA8IFN0YXRlLnJlZ3NbUkVHX01DUkxdKSB8fCAoc3VtIDwgKHRlbXAgJiAweGZmZmZmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXSArIHRlbXAgKyBjOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JIXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JIXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDEwMTEgMDAxMCAxMDExIFJuIFJuIElNTTg7IG1hY2IgaW1tOCxSbgotOC4weGZiKzguMHgyYis0LlJOMiw0LlJOMD1STjIrOC5JTU04OkQyOjo6bWFjYgotIm1hY2IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQ4KUVYVEVORDggKElNTTgpCi0gICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDgpU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZik7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMDExIDAwMTEgMTAxMSBSbiBSbiBJTU04OyBtYWNidSBpbW04LFJuCi04LjB4ZmIrOC4weDNiKzQuUk4yLDQuUk4wPVJOMis4LklNTTg6RDI6OjptYWNidQotIm1hY2J1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KSAoSU1NOCkKLSAgICAgICAgICAqICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnXSAmIDB4ZmYpOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAwIDEwMTEgUm4gUm4gSU1NODsgbWFjaCBpbW04LFJuCi04LjB4ZmIrOC4weDRiKzQuUk4yLDQuUk4wPVJOMis4LklNTTg6RDI6OjptYWNoCi0ibWFjaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0gIHNpZ25lZDY0IHRlbXAsIHN1bTsKLSAgaW50IGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDE2KUVYVEVORDggKElNTTgpCi0gICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDE2KVN0YXRlLnJlZ3Nbc3JjcmVnXSAmIDB4ZmZmZik7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMDExIDAxMDEgMTAxMSBSbiBSbiBJTU04OyBtYWNodSBpbW04LFJuCi04LjB4ZmIrOC4weDViKzQuUk4yLDQuUk4wPVJOMis4LklNTTg6RDI6OjptYWNodQotIm1hY2h1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KSAoSU1NOCkKLSAgICAgICAgICAqICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnXSAmIDB4ZmZmZik7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMDExIDEwMTEgMTAxMSBSbiBSbiBJTU04OyBtY3N0ZSBpbW04LFJuCi04LjB4ZmIrOC4weGJiKzQuUk4yLDQuUk4wPVJOMis4LklNTTg6RDI6OjptY3N0ZQotIm1jc3RlIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBQU1cgJj0gfihQU1dfViB8IFBTV19DKTsKLSAgUFNXIHw9IChTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA/IFBTV19WIDogMCk7Ci0gIAotICAvKiAzMmJpdCBzYXR1cmF0aW9uLiAgKi8KLSAgaWYgKElNTTggPT0gMHgyMCkKLSAgICB7Ci0gICAgICBzaWduZWQ2NCB0bXA7Ci0KLSAgICAgIHRtcCA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdOwotICAgICAgdG1wIDw8PSAzMjsKLSAgICAgIHRtcCArPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICAgICAgaWYgKHRtcCA+IDB4N2ZmZmZmZmYpICAgIAotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmZmZmZmODAwMDAwMDBMTCkKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDgwMDAwMDAwOwotICAgICAgZWxzZQotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRtcDsKLSAgICB9Ci0gIC8qIDE2Yml0IHNhdHVyYXRpb24gKi8KLSAgZWxzZSBpZiAoSU1NOCA9PSAweDEwKQotICAgIHsKLSAgICAgIHNpZ25lZDY0IHRtcDsKLQotICAgICAgdG1wID0gU3RhdGUucmVnc1tSRUdfTUNSSF07Ci0gICAgICB0bXAgPDw9IDMyOwotICAgICAgdG1wICs9IFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gICAgICBpZiAodG1wID4gMHg3ZmZmKSAgICAKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDdmZmY7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmZmZmZmZmZmZjgwMDBMTCkKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDgwMDA7Ci0gICAgICBlbHNlCi0JU3RhdGUucmVnc1tkc3RyZWddID0gdG1wOwotICAgIH0KLSAgLyogOCBiaXQgc2F0dXJhdGlvbiAqLwotICBlbHNlIGlmIChJTU04ID09IDB4OCkKLSAgICB7Ci0gICAgICBzaWduZWQ2NCB0bXA7Ci0KLSAgICAgIHRtcCA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdOwotICAgICAgdG1wIDw8PSAzMjsKLSAgICAgIHRtcCArPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICAgICAgaWYgKHRtcCA+IDB4N2YpICAgIAotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4N2Y7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmZmZmZmZmZmZmZmODBMTCkKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDgwOwotICAgICAgZWxzZQotCVN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRtcDsKLSAgICB9Ci0gIC8qIDkgYml0IHNhdHVyYXRpb24gKi8KLSAgZWxzZSBpZiAoSU1NOCA9PSAweDkpCi0gICAgewotICAgICAgc2lnbmVkNjQgdG1wOwotCi0gICAgICB0bXAgPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXTsKLSAgICAgIHRtcCA8PD0gMzI7Ci0gICAgICB0bXAgKz0gU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0KLSAgICAgIGlmICh0bXAgPiAweDgwKSAgICAKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSAweDgwOwotICAgICAgZWxzZSBpZiAodG1wIDwgMHhmZmZmZmZmZmZmZmZmZjgxTEwpCi0JU3RhdGUucmVnc1tkc3RyZWddID0gMHg4MTsKLSAgICAgIGVsc2UKLQlTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0bXA7Ci0gICAgfQotICAvKiA5IGJpdCBzYXR1cmF0aW9uICovCi0gIGVsc2UgaWYgKElNTTggPT0gMHgzMCkKLSAgICB7Ci0gICAgICBzaWduZWQ2NCB0bXA7Ci0KLSAgICAgIHRtcCA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdOwotICAgICAgdG1wIDw8PSAzMjsKLSAgICAgIHRtcCArPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICAgICAgaWYgKHRtcCA+IDB4N2ZmZmZmZmZmZmZmTEwpICAgIAotCXRtcCA9IDB4N2ZmZmZmZmZmZmZmTEw7Ci0gICAgICBlbHNlIGlmICh0bXAgPCAweGZmZmY4MDAwMDAwMDAwMDBMTCkKLQl0bXAgPSAweGZmZmY4MDAwMDAwMDAwMDBMTDsKLQotICAgICAgdG1wID4+PSAxNjsKLSAgICAgIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRtcDsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTExIDExMDAgUm0gUm4gUmQ7IGFkZCBSbSxSbixSZAotOC4weGZiKzguMHg3Yys0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjphZGQKLSJhZGQiCi0qYW0zMwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQzMiBzdW0sIHNvdXJjZTEsIHNvdXJjZTI7Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICBzb3VyY2UxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgc291cmNlMiA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIHN1bSA9IHNvdXJjZTEgKyBzb3VyY2UyOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0KLSAgeiA9IChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgc291cmNlMSkgfHwgKHN1bSA8IHNvdXJjZTIpOwotICB2ID0gKChzb3VyY2UxICYgMHg4MDAwMDAwMCkgPT0gKHNvdXJjZTIgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChzb3VyY2UxICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotICAgICAgICAgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDEwMDAgMTEwMCBSbSBSbiBSZDsgYWRkYyBSbSxSbixSZAotOC4weGZiKzguMHg4Yys0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjphZGRjCi0iYWRkYyIKLSphbTMzCi17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIHN1bSwgc291cmNlMSwgc291cmNlMjsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIHNvdXJjZTEgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBzb3VyY2UyID0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgc3VtID0gc291cmNlMSArIHNvdXJjZTIgKyAoKFBTVyAmIFBTV19DKSAhPSAwKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gc3VtOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoc3VtID09IDApOwotICBuID0gKHN1bSAmIDB4ODAwMDAwMDApOwotICBjID0gKHN1bSA8IHNvdXJjZTEpIHx8IChzdW0gPCBzb3VyY2UyKTsKLSAgdiA9ICgoc291cmNlMSAmIDB4ODAwMDAwMDApID09IChzb3VyY2UyICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAoc291cmNlMSAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDAxIDExMDAgUm0gUm4gUmQ7IHN1YiBSbSxSbixSZAotOC4weGZiKzguMHg5Yys0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjpzdWIKLSJzdWIiCi0qYW0zMwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQzMiBkaWZmZXJlbmNlLCBzb3VyY2UxLCBzb3VyY2UyOwotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0KLSAgc291cmNlMSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIHNvdXJjZTIgPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBkaWZmZXJlbmNlID0gc291cmNlMiAtIHNvdXJjZTE7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGRpZmZlcmVuY2U7Ci0KLSAgeiA9IChkaWZmZXJlbmNlID09IDApOwotICBuID0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChzb3VyY2UxID4gc291cmNlMSk7Ci0gIHYgPSAoKHNvdXJjZTEgJiAweDgwMDAwMDAwKSA9PSAoc291cmNlMiAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHNvdXJjZTEgJiAweDgwMDAwMDAwKSAhPSAoZGlmZmVyZW5jZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotICAgICAgICAgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDEwMTAgMTEwMCBSbSBSbiBSZDsgc3ViYyBSbSxSbixSZAotOC4weGZiKzguMHhhYys0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjpzdWJjCi0ic3ViYyIKLSphbTMzCi17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIGRpZmZlcmVuY2UsIHNvdXJjZTEsIHNvdXJjZTI7Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICBzb3VyY2UxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgc291cmNlMiA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIGRpZmZlcmVuY2UgPSBzb3VyY2UyIC0gc291cmNlMSAtICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBkaWZmZXJlbmNlOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoZGlmZmVyZW5jZSA9PSAwKTsKLSAgbiA9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc291cmNlMSA+IHNvdXJjZTIpOwotICB2ID0gKChzb3VyY2UxICYgMHg4MDAwMDAwMCkgPT0gKHNvdXJjZTIgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChzb3VyY2UxICYgMHg4MDAwMDAwMCkgIT0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAwIDExMDEgUm0gUm4gUmQ7IGFuZCBSbSxSbixSZAotOC4weGZiKzguMHgwZCs0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjphbmQKLSJhbmQiCi0qYW0zMwotewotICBpbnQgeiwgbjsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotCi0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDAwMDEgMTEwMSBSbSBSbiBSZDsgb3IgUm0sUm4sUmQKLTguMHhmYis4LjB4MWQrNC5STTIsNC5STjArNC5SRDAsNC4weDA6RDJjOjo6b3IKLSJvciIKLSphbTMzCi17Ci0gIGludCB6LCBuOwotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gU3RhdGUucmVnc1tzcmNyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0KLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMDAxMCAxMTAxIFJtIFJuIFJkOyB4b3IgUm0sUm4sUmQKLTguMHhmYis4LjB4MmQrNC5STTIsNC5STjArNC5SRDAsNC4weDA6RDJjOjo6eG9yCi0ieG9yIgotKmFtMzMKLXsKLSAgaW50IHosIG47Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBTdGF0ZS5yZWdzW3NyY3JlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcyXTsKLQotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAwIDExMDEgUm0gUm4gUmQ7IGFzciBSbSxSbixSZAotOC4weGZiKzguMHg0ZCs0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6Ojphc3IKLSJhc3IiCi0qYW0zMwotewotICBpbnQgeiwgYywgbjsKLSAgc2lnbmVkMzIgdGVtcDsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXA7Ci0KLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDAxMDEgMTEwMSBSbSBSbiBSZDsgbHNyIFJtLFJuLFJkCi04LjB4ZmIrOC4weDVkKzQuUk0yLDQuUk4wKzQuUkQwLDQuMHgwOkQyYzo6OmxzcgotImxzciIKLSphbTMzCi17Ci0gIGludCB6LCBjLCBuOwotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0KLSAgYyA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl0gJiAxOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdID4+IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDAxMTAgMTEwMSBSbSBSbiBSZDsgYXNsIFJtLFJuLFJkCi04LjB4ZmIrOC4weDZkKzQuUk0yLDQuUk4wKzQuUkQwLDQuMHgwOkQyYzo6OmFzbAotImFzbCIKLSphbTMzCi17Ci0gIGludCB6LCBuOwotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gU3RhdGUucmVnc1tzcmNyZWcyXSA8PCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotCi0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDEwIDExMDEgUm0gUm4gUmQxIFJkMjsgbXVsIFJtLFJuLFJkMSxSZDIKLTguMHhmYis4LjB4YWQrNC5STTIsNC5STjArNC5SRDAsNC5SRDIhUkQwOkQyYzo6Om11bAotIm11bCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3Nbc3JjcmVnMV0KLSAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3Nbc3JjcmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLQotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPT0gMCkgJiYgKFN0YXRlLnJlZ3NbZHN0cmVnMl0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ODAwMDAwMDApOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04pOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMTAxMSAxMTAxIFJtIFJuIFJkMSBSZDI7IG11bHUgUm0sUm4sUmQxLFJkMgotOC4weGZiKzguMHhiZCs0LlJNMiw0LlJOMCs0LlJEMCw0LlJEMiFSRDA6RDJjOjo6bXVsdQotIm11bHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDIpOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tzcmNyZWcxXQotICAgICAgICAgICogICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLQotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPT0gMCkgJiYgKFN0YXRlLnJlZ3NbZHN0cmVnMl0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ODAwMDAwMDApOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04pOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDEwMTEgMDAwMCAxMTEwIFJuIDAwMDAgYWJzOCA7IG1vdiAoYWJzOCksUm4KLTguMHhmYis4LjB4MGUrNC5STjIsNC4weDArOC5JTU04OkQycDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoSU1NOCk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAxIDExMTAgUm0gMDAwMCBhYnM4IDsgbW92IFJuLChhYnM4KQotOC4weGZiKzguMHgxZSs0LlJNMiw0LjB4MCs4LklNTTg6RDJxOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfd29yZCAoSU1NOCwgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMDExIDAwMTAgMTExMCBSbiAwMDAwIGFiczggOyBtb3ZidSAoYWJzOCksUm4KLTguMHhmYis4LjB4MmUrNC5STjIsNC4weDArOC5JTU04OkQycDo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2J5dGUgKElNTTgpOwotfQotCi0vLyAxMTExIDEwMTEgMDAxMSAxMTEwIFJtIDAwMDAgYWJzOCA7IG1vdmJ1IFJuLChhYnM4KQotOC4weGZiKzguMHgzZSs0LlJNMiw0LjB4MCs4LklNTTg6RDJxOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX2J5dGUgKElNTTgsIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTAxMSAwMTAwIDExMTAgUm4gMDAwMCBhYnM4IDsgbW92aHUgKGFiczgpLFJuCi04LjB4ZmIrOC4weDRlKzQuUk4yLDQuMHgwKzguSU1NODpEMnA6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChJTU04KTsKLX0KLQotLy8gMTExMSAxMDExIDAxMDEgMTExMCBSbSAwMDAwIGFiczggOyBtb3ZodSBSbiwoYWJzOCkKLTguMHhmYis4LjB4NWUrNC5STTIsNC4weDArOC5JTU04OkQycTo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzdG9yZV9oYWxmIChJTU04LCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMTEgMTAwMCAxMTEwIFJpIFJtIFJuOyBtb3YgKFJpLFJtKSxSbgotOC4weGZiKzguMHg4ZSs0LlJJMCw0LlJNMCs0LlJOMCw0LjB4MDpEMnI6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJJMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMl0pOwotfQotCi0vLyAxMTExIDEwMTEgMTAwMSAxMTEwIFJpIFJtIFJuOyBtb3YgUm4sKFJpLFJtKQotOC4weGZiKzguMHg5ZSs0LlJJMCw0LlJOMCs0LlJNMCw0LjB4MDpEMnM6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkkwKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBTdGF0ZS5yZWdzW2RzdHJlZzJdLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMTEgMTAxMCAxMTEwIFJpIFJtIFJuOyBtb3ZidSAoUmksUm0pLFJuCi04LjB4ZmIrOC4weGFlKzQuUkkwLDQuUk0wKzQuUk4wLDQuMHgwOkQycjo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJJMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tzcmNyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMl0pOwotfQotCi0vLyAxMTExIDEwMTEgMTAxMSAxMTEwIFJpIFJtIFJuOyBtb3ZidSBSbiwoUmksUm0pCi04LjB4ZmIrOC4weGJlKzQuUkkwLDQuUk4wKzQuUk0wLDQuMHgwOkQyczo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkkwKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBTdGF0ZS5yZWdzW2RzdHJlZzJdLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMTEgMTEwMCAxMTEwIFJpIFJtIFJuOyBtb3ZodSAoUmksUm0pLFJuCi04LjB4ZmIrOC4weGNlKzQuUkkwLDQuUk0wKzQuUk4wLDQuMHgwOkQycjo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJJMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tzcmNyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMl0pOwotfQotCi0vLyAxMTExIDEwMTEgMTEwMSAxMTEwIFJpIFJtIFJuOyBtb3ZodSBSbiwoUmksUm0pCi04LjB4ZmIrOC4weGRlKzQuUkkwLDQuUk4wKzQuUk0wLDQuMHgwOkQyczo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkkwKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBTdGF0ZS5yZWdzW2RzdHJlZzJdLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDEwMTEgMDAwMCAxMTExIFJtIFJuIFJkMSBSZDI7IG1hYyBSbSxSbixSZDEsUmQyCi04LjB4ZmIrOC4weDBmKzQuUk0yLDQuUk4wKzQuUkQwLDQuUkQyIVJEMDpEMmM6OjptYWMKLSJtYWMiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkNjQgdGVtcDsKLSAgdW5zaWduZWQzMiBzdW07Ci0gIGludCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQyKTsKLQotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tzcmNyZWcxXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tzcmNyZWcyXSk7Ci0KLSAgc3VtID0gU3RhdGUucmVnc1tkc3RyZWcyXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tkc3RyZWcyXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotICAgICAgUFNXICY9IH4oUFNXX1YpOwotICAgICAgUFNXIHw9ICgoIHYgPyBQU1dfViA6IDApKTsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDAxIDExMTEgUm0gUm4gUmQxIFJkMjsgbWFjdSBSbSxSbixSZDEsUmQyCi04LjB4ZmIrOC4weDFmKzQuUk0yLDQuUk4wKzQuUkQwLDQuUkQyIVJEMDpEMmM6OjptYWN1Ci0ibWFjdSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQ2NCB0ZW1wOwotICB1bnNpZ25lZDMyIHN1bTsKLSAgaW50IGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDIpOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tzcmNyZWcxXQotICAgICAgICAgICogKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tzcmNyZWcyXSk7Ci0KLSAgc3VtID0gU3RhdGUucmVnc1tkc3RyZWcyXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tkc3RyZWcyXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotICAgICAgUFNXICY9IH4oUFNXX1YpOwotICAgICAgUFNXIHw9ICgoIHYgPyBQU1dfViA6IDApKTsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDEwIDExMTEgUm0gUm4gUmQxOyBtYWNiIFJtLFJuLFJkMQotOC4weGZiKzguMHgyZis0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjptYWNiCi0ibWFjYiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0gIHNpZ25lZDMyIHRlbXAsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcyXSAmIDB4ZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmKSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbZHN0cmVnXSArIHRlbXA7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0gIGlmICh2KQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLSAgICAgIFBTVyAmPSB+KFBTV19WKTsKLSAgICAgIFBTVyB8PSAoKHYgPyBQU1dfViA6IDApKTsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAxMSAwMDExIDExMTEgUm0gUm4gUmQxOyBtYWNidSBSbSxSbixSZDEKLTguMHhmYis4LjB4M2YrNC5STTIsNC5STjArNC5SRDAsNC4weDA6RDJjOjo6bWFjYnUKLSJtYWNidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0gIHNpZ25lZDMyIHRlbXAsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHhmZikKLSAgICAgICAgICAqICh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZikpOwotICBzdW0gPSBTdGF0ZS5yZWdzW2RzdHJlZ10gKyB0ZW1wOwotICB2ID0gKChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gc3VtOwotICBpZiAodikKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci0gICAgICBQU1cgJj0gfihQU1dfVik7Ci0gICAgICBQU1cgfD0gKCh2ID8gUFNXX1YgOiAwKSk7Ci0gICAgfQotfQotCi0vLyAxMTExIDEwMTEgMDEwMCAxMTExIFJtIFJuIFJkMTsgbWFjaCBSbSxSbixSZDEsUmQyCi04LjB4ZmIrOC4weDRmKzQuUk0yLDQuUk4wKzQuUkQwLDQuUkQyIVJEMDpEMmM6OjptYWNoCi0ibWFjaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcyXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9ICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyAoKHRlbXAgPj4gMzIpICYgMHhmZmZmZmZmZik7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotICAgICAgUFNXICY9IH4oUFNXX1YpOwotICAgICAgUFNXIHw9ICgodiA/IFBTV19WIDogMCkpOwotICAgIH0KLX0KLQotLy8gMTExMSAxMDExIDAxMDEgMTExMSBSbSBSbiBSZDE7IG1hY2h1IFJtLFJuLFJkMSxSZDIKLTguMHhmYis4LjB4NWYrNC5STTIsNC5STjArNC5SRDAsNC5SRDIhUkQwOkQyYzo6Om1hY2h1Ci0ibWFjaHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQwKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJEMCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcyXSAmIDB4ZmZmZikKLSAgICAgICAgICAqICh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgc3VtID0gU3RhdGUucmVnc1tkc3RyZWcxXSArICgodGVtcCA+PiAzMikgJiAweGZmZmZmZmZmKTsKLSAgdiA9ICgoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotICBpZiAodikKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci0gICAgICBQU1cgJj0gfihQU1dfVik7Ci0gICAgICBQU1cgfD0gKCh2ID8gUFNXX1YgOiAwKSk7Ci0gICAgfQotfQotCi0vLyAxMTExIDEwMTEgMDExMCAxMTExIFJtIFJuIFJkMTsgZG1hY2ggUm0sUm4sUmQxCi04LjB4ZmIrOC4weDZmKzQuUk0yLDQuUk4wKzQuUkQwLDQuMHgwOkQyYzo6OmRtYWNoCi0iZG1hY2giCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotICBpbnQgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHRlbXAyID0gKChzaWduZWQzMikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotCSAgICogKHNpZ25lZDMyKSgoU3RhdGUucmVnc1tzcmNyZWcyXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tkc3RyZWddOwotICB2ID0gKChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gc3VtOwotICBpZiAodikKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci0gICAgICBQU1cgJj0gfihQU1dfVik7Ci0gICAgICBQU1cgfD0gKCh2ID8gUFNXX1YgOiAwKSk7Ci0gICAgfQotfQotCi0vLyAxMTExIDEwMTEgMDExMSAxMTExIFJtIFJuIFJkMTsgZG1hY2h1IFJtLFJuLFJkMQotOC4weGZiKzguMHg3Zis0LlJNMiw0LlJOMCs0LlJEMCw0LjB4MDpEMmM6OjpkbWFjaHUKLSJkbWFjaHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotICBpbnQgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkMzIpKFN0YXRlLnJlZ3Nbc3JjcmVnMl0gJiAweGZmZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgodW5zaWduZWQzMikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotCSAgICogKHVuc2lnbmVkMzIpKChTdGF0ZS5yZWdzW3NyY3JlZzJdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW2RzdHJlZ107Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0gIGlmICh2KQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLSAgICAgIFBTVyAmPSB+KFBTV19WKTsKLSAgICAgIFBTVyB8PSAoKHYgPyBQU1dfViA6IDApKTsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDAwIDExMTEgUm0gUm4gUmQxIFJkMjsgZG11bGggUm0sUm4sUmQxLFJkMgotOC4weGZiKzguMHg4Zis0LlJNMiw0LlJOMCs0LlJEMCw0LlJEMiFSRDA6RDJjOjo6ZG11bGgKLSJkbXVsaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQ2NCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQyKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgdGVtcCA9ICgoc2lnbmVkMzIpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4xNikgJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHRlbXA7Ci19Ci0KLS8vIDExMTEgMTAxMSAxMDAxIDExMTEgUm0gUm4gUmQxIFJkMjsgZG11bGh1IFJtLFJuLFJkMSxSZDIKLTguMHhmYis4LjB4OWYrNC5STTIsNC5STjArNC5SRDAsNC5SRDIhUkQwOkQyYzo6OmRtdWxodQotImRtdWxodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQ2NCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUkQyKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIHRlbXAgPSAoKHVuc2lnbmVkMzIpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgICAqICh1bnNpZ25lZDMyKSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PjE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gdGVtcDsKLX0KLQotLy8gMTExMSAxMDExIDEwMTAgMTExMSBSbSBSbjsgc2F0MjQgUm0sUm4KLTguMHhmYis4LjB4YWYrNC5STTIsNC5STjArOC4weDA6RDI6OjpzYXQyNAotInNhdDI0IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgdmFsdWUsIG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdmFsdWUgPSBTdGF0ZS5yZWdzW3NyY3JlZ107Ci0KLSAgaWYgKHZhbHVlID49IDB4N2ZmZmZmKQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4N2ZmZmZmOwotICBlbHNlIGlmICh2YWx1ZSA8PSAweGZmODAwMDAwKQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IDB4ZmY4MDAwMDA7Ci0gIGVsc2UKLSAgICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB2YWx1ZTsKLQotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwKSAhPSAwOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMDExIDExMTEgMTExMSBSbSBSbiBSZDE7IGJzY2ggUm0sUm4sUmQxCi04LjB4ZmIrOC4weGZmKzQuUk0yLDQuUk4wKzQuUkQwLDQuMHgwOkQyYzo6OmJzY2gKLSJic2NoIgotKmFtMzMKLXsKLSAgaW50IHRlbXAsIGMsIGk7Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWc7Ci0gIGludCBzdGFydDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSRDApOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBzdGFydCA9IChTdGF0ZS5yZWdzW3NyY3JlZzJdICYgMHgxZikgLSAxOwotICBpZiAoc3RhcnQgPT0gLTEpCi0gICAgc3RhcnQgPSAzMTsKLSAgICAKLSAgZm9yIChpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmICh0ZW1wICYgKDEgPDwgaSkpCi0JewotCSAgYyA9IDE7Ci0JICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaSA8IDApCi0gICAgewotICAgICAgYyA9IDA7Ci0gICAgICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSAwOwotICAgIH0KLSAgUFNXICY9IH4oUFNXX0MpOwotICBQU1cgfD0gKGMgPyBQU1dfQyA6IDApOwotfQotCi0vLyAxMTExIDExMDEgMDAwMCAxMDAwIFJuIFJuIElNTTMyOyBtb3YgaW1tMjQsUm4KLTguMHhmZCs4LjB4MDgrNC5STTIsNC5STjA9Uk0yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0dDo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IEVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAxIDEwMDAgUm4gUm4gSU1NMzI7IG1vdnUgaW1tMjQsUm4KLTguMHhmZCs4LjB4MTgrNC5STTIsNC5STjA9Uk0yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0azo6Om1vdnUKLSJtb3Z1IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykgJiAweGZmZmZmZjsKLX0KLQotLy8gMTExMSAxMTAxIDAxMTEgMTAwMCBSbiBSbiBJTU0zMjsgYWRkIGltbTI0LFJuCi04LjB4ZmQrOC4weDc4KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGM6OjphZGQKLSJhZGQiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQWRkIChFWFRFTkQyNCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDExMDEgMTAwMCAxMDAwIFJuIFJuIElNTTMyOyBhZGRjIGltbTI0LFJuCi04LjB4ZmQrOC4weDg4KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGI6OjphZGRjCi0iYWRkYyIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcsIHosIG4sIGMsIHY7Ci0gIHVuc2lnbmVkMzIgc3VtLCBpbW0sIHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgaW1tID0gRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbZHN0cmVnXTsKLSAgc3VtID0gaW1tICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgaW1tKSB8fCAoc3VtIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAxMDAxIDEwMDAgUm4gUm4gSU1NMzI7IHN1YiBpbW0yNCxSbgotOC4weGZkKzguMHg5OCs0LlJNMiw0LlJOMD1STTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRiOjo6c3ViCi0ic3ViIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgZ2VuZXJpY1N1YiAoRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKSwgZHN0cmVnKTsKLX0KLQotLy8gMTExMSAxMTAxIDEwMTAgMTAwMCBSbiBSbiBJTU0zMjsgc3ViYyBpbW0yNCxSbgotOC4weGZkKzguMHhhOCs0LlJNMiw0LlJOMD1STTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRiOjo6c3ViYwotInN1YmMiCi0qYW0zMwotewotICBpbnQgZHN0cmVnLCB6LCBuLCBjLCB2OwotICB1bnNpZ25lZDMyIGRpZmZlcmVuY2UsIGltbSwgcmVnMjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBpbW0gPSBFWFRFTkQyNCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpOwotICByZWcyID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBkaWZmZXJlbmNlID0gcmVnMiAtIGltbSAtICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBkaWZmZXJlbmNlOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoZGlmZmVyZW5jZSA9PSAwKTsKLSAgbiA9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoaW1tID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0gICAgICAgICAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vLyAxMTExIDExMDEgMTEwMSAxMDAwIFJuIFJuIElNTTMyOyBjbXAgaW1tMjQsUm4KLTguMHhmZCs4LjB4ZDgrNC5STTIsNC5STjA9Uk0yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0Yjo6OmNtcAotImNtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGdlbmVyaWNDbXAgKEVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAxMTExIDEwMDAgWFJuIFhSbiBJTU0zMjsgbW92IGltbTI0LFhSbgotOC4weGZkKzguMHhmOCs0LlhSTTIsNC5YUk4wPVhSTTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRvOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3hyZWcgKFNEXywgWFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykgJiAweGZmZmZmZjsKLX0KLQotLy8gMTExMSAxMTAxIDAwMDAgMTAwMSBSbiBSbiBJTU0yNDsgYW5kIGltbTI0LFJuCi04LjB4ZmQrOC4weDA5KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGI6OjphbmQKLSJhbmQiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICBpbnQgeixuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSAmPSAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykgJiAweGZmZmZmZik7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDExMDEgMDAwMSAxMDAxIFJuIFJuIElNTTI0OyBvciBpbW0yNCxSbgotOC4weGZkKzguMHgxOSs0LlJNMiw0LlJOMD1STTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRiOjo6b3IKLSJvciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCB6LG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddIHw9IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSAmIDB4ZmZmZmZmKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDEwIDEwMDEgUm4gUm4gSU1NMjQ7IHhvciBpbW0yNCxSbgotOC4weGZkKzguMHgyOSs0LlJNMiw0LlJOMD1STTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRiOjo6eG9yCi0ieG9yIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgaW50IHosbjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gXj0gKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpICYgMHhmZmZmZmYpOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMTAxIDAxMDAgMTAwMSBSbiBSbiBJTU0yNDsgYXNyIGltbTI0LFJuCi04LjB4ZmQrOC4weDQ5KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGI6Ojphc3IKLSJhc3IiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICBzaWduZWQzMiB0ZW1wOwotICBpbnQgYywgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWddOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotCi0vLyAxMTExIDExMDEgMDEwMSAxMDAxIFJuIFJuIElNTTI0OyBsc3IgaW1tMjQsUm4KLTguMHhmZCs4LjB4NTkrNC5STTIsNC5STjA9Uk0yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0Yjo6OmxzcgotImxzciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCB6LCBuLCBjOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGMgPSBTdGF0ZS5yZWdzW2RzdHJlZ10gJiAxOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPj49IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotLy8gMTExMSAxMTAxIDAxMTAgMTAwMSBSbiBSbiBJTU0yNDsgYXNsIGltbTI0LFJuCi04LjB4ZmQrOC4weDY5KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGI6Ojphc2wKLSJhc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA8PD0gKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMTAxIDEwMTAgMTAwMSBSbiBSbiBJTU0yNDsgbXVsIGltbTI0LFJuCi04LjB4ZmQrOC4weGE5KzQuUk0yLDQuUk4wPVJNMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENGI6OjptdWwKLSJtdWwiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW2RzdHJlZ10KLSAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKUVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSkpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMTAxIDEwMTEgMTAwMSBSbiBSbiBJTU0yNDsgbXVsdSBpbW0yNCxSbgotOC4weGZkKzguMHhiOSs0LlJNMiw0LlJOMD1STTIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRiOjo6bXVsdQotIm11bHUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tkc3RyZWddCi0gICAgICAgICAgKiAgKHVuc2lnbmVkNjQpRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDExMDEgMTExMCAxMDAxIFJuIFJuIElNTTI0OyBidHN0IGltbTI0LCxSbgotOC4weGZkKzguMHhlOSs0LlJOMiw0LlJOMD1STjIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRwOjo6YnRzdAotImJ0c3QiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQnRzdCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QyksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAwIDEwMTAgUm4gUm0gSU1NMjQ7IG1vdiAoZDI0LFJtKSxSbgotOC4weGZkKzguMHgwYSs0LlJOMiw0LlJNMCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHA6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddCi0JCQkJICArIEVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsCi0JCQkJCQkgICAgICAgSU1NMjRCLCBJTU0yNEMpKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAxIDEwMTAgUm0gUm4gSU1NMjQ7IG1vdiBSbSwoZDI0LFJuKQotOC4weGZkKzguMHgxYSs0LlJNMiw0LlJOMCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHE6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbZHN0cmVnXSArIEVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSksCi0JICAgICAgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMTAxIDAwMTAgMTAxMCBSbiBSbSBJTU0yNDsgbW92YnUgKGQyNCxSbSksUm4KLTguMHhmZCs4LjB4MmErNC5STjIsNC5STTArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRwOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW3NyY3JlZ10KLQkJCQkgICsgRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwKLQkJCQkJCSAgICAgICBJTU0yNEIsIElNTTI0QykpKTsKLX0KLQotLy8gMTExMSAxMTAxIDAwMTEgMTAxMCBSbSBSbiBJTU0yNDsgbW92YnUgUm0sKGQyNCxSbikKLTguMHhmZCs4LjB4M2ErNC5STTIsNC5STjArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRxOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tkc3RyZWddICsgRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMDEgMDEwMCAxMDEwIFJuIFJtIElNTTI0OyBtb3ZodSAoZDI0LFJtKSxSbgotOC4weGZkKzguMHg0YSs0LlJOMiw0LlJNMCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHA6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3Nbc3JjcmVnXQotCQkJCSAgKyBFWFRFTkQyNCAoRkVUQ0gyNCAoSU1NMjRBLAotCQkJCQkgICAgICBJTU0yNEIsIElNTTI0QykpKTsKLX0KLQotLy8gMTExMSAxMTAxIDAxMDEgMTAxMCBSbSBSbiBJTU0yNDsgbW92aHUgUm0sKGQyNCxSbikKLTguMHhmZCs4LjB4NWErNC5STTIsNC5STjArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRxOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tkc3RyZWddICsgRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMDEgMDExMCAxMDEwIFJuIFJtIElNTTI0OyBtb3YgKGQyNCxSbSspLFJuCi04LjB4ZmQrOC4weDZhKzQuUk4yLDQuUk0wIVJOMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHk6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMTExIDEwMTAgUm0gUm4gSU1NMjQ7IG1vdiBSbSwoZDI0LFJuKykKLTguMHhmZCs4LjB4N2ErNC5STTIsNC5STjArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR6Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW2RzdHJlZ10sIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSArPSBFWFRFTkQyNCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpOwotfQotCi0KLS8vIDExMTEgMTEwMSAxMDAwIDEwMTAgUm4gMDAwMCBJTU0yNDsgbW92IChkMjQsc3ApLFJuCi04LjB4ZmQrOC4weDhhKzQuUk4yLDQuMHgwK0lNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHI6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXQotCQkJCSAgKyBGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAxMDAxIDEwMTAgUm0gMDAwMCBJTU0yNDsgbW92IFJtLChkMjQsc3ApCi04LjB4ZmQrOC4weDlhKzQuUk0yLDQuMHgwKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0czo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpLAotCSAgICAgIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAxMDEwIDEwMTAgUm4gMDAwMCBJTU0yNDsgbW92YnUgKGQyNCxzcCksUm4KLTguMHhmZCs4LjB4YWErNC5STjIsNC4weDArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDRyOjo6bW92YnUKLSJtb3ZidSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdCi0JCQkJICArIEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKTsKLX0KLQotLy8gMTExMSAxMTAxIDEwMTEgMTAxMCBSbSAwMDAwIElNTTI0OyBtb3ZidSBSbSwoZDI0LHNwKQotOC4weGZkKzguMHhiYSs0LlJNMiw0LjB4MCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHM6Ojptb3ZidQotIm1vdmJ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QyksCi0JICAgICAgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMTAxIDExMDAgMTAxMCBSbiAwMDAwIElNTTI0OyBtb3ZodSAoZDI0LHNwKSxSbgotOC4weGZkKzguMHhjYSs0LlJOMiw0LjB4MCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHI6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0KLQkJCQkgICsgRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpOwotfQotCi0vLyAxMTExIDExMDEgMTEwMSAxMDEwIFJtIFJuIElNTTI0OyBtb3ZodSBSbSwoZDI0LHNwKQotOC4weGZkKzguMHhkYSs0LlJNMiw0LlJOMCs4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHM6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QyksCi0JICAgICAgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMTAxIDExMTAgMTAxMCBSbiBSbSBJTU0yNDsgbW92aHUgKGQyNCxSbSspLFJuCi04LjB4ZmQrOC4weGVhKzQuUk4yLDQuUk0wIVJOMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHk6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSArPSBFWFRFTkQyNCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpOwotfQotCi0vLyAxMTExIDExMDEgMTExMSAxMDEwIFJtIFJuIElNTTI0OyBtb3ZodSBSbSwoZDI0LFJuKykKLTguMHhmZCs4LjB4ZmErNC5STTIsNC5STjArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR6Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW3NyY3JlZ10gKz0gRVhURU5EMjQgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKTsKLX0KLQotLy8gMTExMSAxMTAxIDAwMDAgMTAxMSBSbiBJTU0yNDsgbWFjIGltbTI0LFJuCi04LjB4ZmQrOC4weDBiKzQuUk4yLDQuUk4wPVJOMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHo6OjptYWMKLSJtYWMiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KUVYVEVORDI0IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSkKLSAgICAgICAgICAqIChzaWduZWQ2NClTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAxIDEwMTEgUm4gSU1NMjQ7IG1hY3UgaW1tMjQsUm4KLTguMHhmZCs4LjB4MWIrNC5STjIsNC5STjA9Uk4yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0ejo6Om1hY3UKLSJtYWN1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KSAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpCi0gICAgICAgICAgKiAodW5zaWduZWQ2NClTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDEwIDEwMTEgUm4gSU1NMjQ7IG1hY2IgaW1tMjQsUm4KLTguMHhmZCs4LjB4MmIrNC5STjIsNC5STjA9Uk4yKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0ejo6Om1hY2IKLSJtYWNiIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKChzaWduZWQ2NClFWFRFTkQ4IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSkKLSAgICAgICAgICAqIChzaWduZWQ2NClTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyAodGVtcCAmIDB4ZmZmZmZmZmYpOwotICBjID0gKHN1bSA8IFN0YXRlLnJlZ3NbUkVHX01DUkxdKSB8fCAoc3VtIDwgKHRlbXAgJiAweGZmZmZmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXSArIHRlbXAgKyBjOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JIXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JIXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDExMDEgMDAxMSAxMDExIFJuIElNTTI0OyBtYWNidSBpbW0yNCxSbgotOC4weGZkKzguMHgzYis0LlJOMiw0LlJOMD1STjIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR6Ojo6bWFjYnUKLSJtYWNidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0gIHNpZ25lZDY0IHRlbXAsIHN1bTsKLSAgaW50IGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQ2NCkgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKQotICAgICAgICAgICogKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZik7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTAxIDAxMDAgMTAxMSBSbiBJTU0yNDsgbWFjaCBpbW0yNCxSbgotOC4weGZkKzguMHg0Yis0LlJOMiw0LlJOMD1STjIrOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR6Ojo6bWFjaAotIm1hY2giCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotICBzaWduZWQ2NCB0ZW1wLCBzdW07Ci0gIGludCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KUVYVEVORDE2IChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSkKLSAgICAgICAgICAqIChzaWduZWQ2NClTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmZmYpOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMTAxIDEwMTEgUm4gSU1NMjQ7IG1hY2h1IGltbTI0LFJuCi04LjB4ZmQrOC4weDViKzQuUk4yLDQuUk4wPVJOMis4LklNTTI0QSs4LklNTTI0Qis4LklNTTI0QzpENHo6OjptYWNodQotIm1hY2h1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KSAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykgJiAweGZmZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQ2NClTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmZmYpOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JMXSArICh0ZW1wICYgMHhmZmZmZmZmZik7Ci0gIGMgPSAoc3VtIDwgU3RhdGUucmVnc1tSRUdfTUNSTF0pIHx8IChzdW0gPCAodGVtcCAmIDB4ZmZmZmZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIHRlbXAgPj49IDMyOwotICB0ZW1wICY9IDB4ZmZmZmZmZmY7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkhdICsgdGVtcCArIGM7Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkhdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkhdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAwIDExMTAgUm4gMDAwMCBBQlMyNDsgbW92IChhYnMyNCksUm4KLTguMHhmZCs4LjB4MGUrNC5STjIsNC4weDArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR1Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF93b3JkIChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSk7Ci19Ci0KLS8vIDExMTEgMTEwMSAwMDAxIDExMTAgUm0gMDAwMCBBQlMyNDsgbW92IFJtLChhYnMyNCkKLTguMHhmZCs4LjB4MWUrNC5STTIsNC4weDArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR2Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfd29yZCAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QyksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLQotLy8gMTExMSAxMTAxIDAwMTAgMTExMCBSbiAwMDAwIEFCUzI0OyBtb3ZidSAoYWJzMjQpLFJuCi04LjB4ZmQrOC4weDJlKzQuUk4yLDQuMHgwKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0dDo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2J5dGUgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpKTsKLX0KLQotLy8gMTExMSAxMTAxIDAwMTEgMTExMCBSbSAwMDAwIEFCUzI0OyBtb3ZidSBSbSwoYWJzMjQpCi04LjB4ZmQrOC4weDNlKzQuUk0yLDQuMHgwKzguSU1NMjRBKzguSU1NMjRCKzguSU1NMjRDOkQ0dTo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzdG9yZV9ieXRlIChGRVRDSDI0IChJTU0yNEEsIElNTTI0QiwgSU1NMjRDKSwgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotCi0vLyAxMTExIDExMDEgMDEwMCAxMTEwIFJuIDAwMDAgQUJTMjQ7IG1vdmh1IChhYnMyNCksUm4KLTguMHhmZCs4LjB4NGUrNC5STjIsNC4weDArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR0Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfaGFsZiAoRkVUQ0gyNCAoSU1NMjRBLCBJTU0yNEIsIElNTTI0QykpOwotfQotCi0vLyAxMTExIDExMDEgMDEwMSAxMTEwIFJtIDAwMDAgQUJTMjQ7IG1vdmh1IFJtLChhYnMyNCkKLTguMHhmZCs4LjB4NWUrNC5STTIsNC4weDArOC5JTU0yNEErOC5JTU0yNEIrOC5JTU0yNEM6RDR1Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX2hhbGYgKEZFVENIMjQgKElNTTI0QSwgSU1NMjRCLCBJTU0yNEMpLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0KLS8vIDExMTEgMTExMCAwMDAwIDEwMDAgUm4gUm4gSU1NMzI7IG1vdiBpbW0zMixSbgotOC4weGZlKzguMHgwOCs0LlJNMiw0LlJOMD1STTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMDAxIDEwMDAgUm4gUm4gSU1NMzI7IG1vdnUgaW1tMzIsUm4KLTguMHhmZSs4LjB4MTgrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6bW92dQotIm1vdnUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMTExIDEwMDAgUm4gUm4gSU1NMzI7IGFkZCBpbW0zMixSbgotOC4weGZlKzguMHg3OCs0LlJNMiw0LlJOMD1STTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6OjphZGQKLSJhZGQiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQWRkIChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDExMTAgMTAwMCAxMDAwIFJuIFJuIElNTTMyOyBhZGRjIGltbTMyLFJuCi04LjB4ZmUrOC4weDg4KzQuUk0yLDQuUk4wPVJNMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6OmFkZGMKLSJhZGRjIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgdW5zaWduZWQzMiBpbW0sIHJlZzIsIHN1bTsKLSAgaW50IHosIG4sIGMsIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgaW1tID0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbZHN0cmVnXTsKLSAgc3VtID0gaW1tICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBzdW07Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgaW1tKSB8fCAoc3VtIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAxMDAxIDEwMDAgUm4gUm4gSU1NMzI7IHN1YiBpbW0zMixSbgotOC4weGZlKzguMHg5OCs0LlJNMiw0LlJOMD1STTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6OjpzdWIKLSJzdWIiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljU3ViIChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBkc3RyZWcpOwotfQotCi0vLyAxMTExIDExMTAgMTAxMCAxMDAwIFJuIFJuIElNTTMyOyBzdWJjIGltbTMyLFJuCi04LjB4ZmUrOC4weGE4KzQuUk0yLDQuUk4wPVJNMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6OnN1YmMKLSJzdWJjIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgdW5zaWduZWQzMiBpbW0sIHJlZzIsIGRpZmZlcmVuY2U7Ci0gIGludCB6LCBuLCBjLCB2OwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGltbSA9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW2RzdHJlZ107Ci0gIGRpZmZlcmVuY2UgPSByZWcyIC0gaW1tIC0gKChQU1cgJiBQU1dfQykgIT0gMCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGRpZmZlcmVuY2U7Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChkaWZmZXJlbmNlID09IDApOwotICBuID0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChpbW0gPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLSAgICAgICAgICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMTExIDEwMDAgUm4gUm4gSU1NMzI7IGNtcCBpbW0zMixSbgotOC4weGZlKzguMHhkOCs0LlJNMiw0LlJOMD1STTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6OjpjbXAKLSJjbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBnZW5lcmljQ21wIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTExMCAxMTExIDEwMDAgWFJuIFhSbiBJTU0zMjsgbW92IGltbTMyLFhSbgotOC4weGZlKzguMHhmOCs0LlhSTTIsNC5YUk4wPVhSTTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDViOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3hyZWcgKFNEXywgWFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOwotfQotCi0vLyAxMTExIDExMTAgMDAwMCAxMDAxIFJuIFJuIElNTTMyOyBhbmQgaW1tMzIsUm4KLTguMHhmZSs4LjB4MDkrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6YW5kCi0iYW5kIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgaW50IHosbjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gJj0gKEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotICB6ID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMTEwIDAwMDEgMTAwMSBSbiBSbiBJTU0zMjsgb3IgaW1tMzIsUm4KLTguMHhmZSs4LjB4MTkrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6b3IKLSJvciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCB6LG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddIHw9IChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMDEwIDEwMDEgUm4gUm4gSU1NMzI7IHhvciBpbW0zMixSbgotOC4weGZlKzguMHgyOSs0LlJNMiw0LlJOMD1STTIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6Ojp4b3IKLSJ4b3IiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICBpbnQgeixuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSBePSAoRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDExMTAgMDEwMCAxMDAxIFJuIFJuIElNTTMyOyBhc3IgaW1tMzIsUm4KLTguMHhmZSs4LjB4NDkrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6YXNyCi0iYXNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLSAgc2lnbmVkMzIgdGVtcDsKLSAgaW50IGMsIHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnXTsKLSAgYyA9IHRlbXAgJiAxOwotICB0ZW1wID4+PSAoRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotLy8gMTExMSAxMTEwIDAxMDEgMTAwMSBSbiBSbiBJTU0zMjsgbHNyIGltbTMyLFJuCi04LjB4ZmUrOC4weDU5KzQuUk0yLDQuUk4wPVJNMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6OmxzcgotImxzciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIGludCB6LCBuLCBjOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIGMgPSBTdGF0ZS5yZWdzW2RzdHJlZ10gJiAxOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPj49IChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0vLyAxMTExIDExMTAgMDExMCAxMDAxIFJuIFJuIElNTTMyOyBhc2wgaW1tMzIsUm4KLTguMHhmZSs4LjB4NjkrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6YXNsCi0iYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotICBpbnQgeiwgbjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPDw9IChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLy8gMTExMSAxMTEwIDEwMTAgMTAwMSBSbiBSbiBJTU0zMjsgbXVsIGltbTMyLFJuCi04LjB4ZmUrOC4weGE5KzQuUk0yLDQuUk4wPVJNMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6Om11bAotIm11bCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbZHN0cmVnXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpKEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLSAgeiA9IChTdGF0ZS5yZWdzW2RzdHJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkc3RyZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAxMDExIDEwMDEgUm4gUm4gSU1NMzI7IG11bHUgaW1tMzIsUm4KLTguMHhmZSs4LjB4YjkrNC5STTIsNC5STjA9Uk0yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6bXVsdQotIm11bHUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCB6LCBuOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tkc3RyZWddCi0gICAgICAgICAgKiAgKHVuc2lnbmVkNjQpIChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7Ci0gIHogPSAoU3RhdGUucmVnc1tkc3RyZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZHN0cmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vLyAxMTExIDExMTAgMTExMCAxMDAxIFJuIFJuIElNTTMyOyBidHN0IGltbTMyLFJuCi04LjB4ZmUrOC4weGU5KzQuUk0yLDQuUk4wPVJNMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWE6OjpidHN0Ci0iYnRzdCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGdlbmVyaWNCdHN0IChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMTAgMDAwMCAxMDEwIFJuIFJtIElNTTMyOyBtb3YgKGQzMixSbSksUm4KLTguMHhmZSs4LjB4MGErNC5STjIsNC5STTArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDVmOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXQotCQkJCSAgKyBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotLy8gMTExMSAxMTEwIDAwMDEgMTAxMCBSbSBSbiBJTU0zMjsgbW92IFJtLChkMzIsUm4pCi04LjB4ZmUrOC4weDFhKzQuUk0yLDQuUk4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Zzo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tkc3RyZWddICsgRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMTAgMDAxMCAxMDEwIFJuIFJtIElNTTMyOyBtb3ZidSAoZDMyLFJtKSxSbgotOC4weGZlKzguMHgyYSs0LlJOMiw0LlJNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMCk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tzcmNyZWddCi0JCQkJICArIEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotfQotCi0vLyAxMTExIDExMTAgMDAxMSAxMDEwIFJtIFJuIElNTTMyOyBtb3ZidSBSbSwoZDMyLFJuKQotOC4weGZlKzguMHgzYSs0LlJNMiw0LlJOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWI6Ojptb3ZidQotIm1vdmJ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW2RzdHJlZ10gKyBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAotCSAgICAgIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMTAwIDEwMTAgUm4gUm0gSU1NMzI7IG1vdmh1IChkMzIsUm0pLFJuCi04LjB4ZmUrOC4weDRhKzQuUk4yLDQuUk0wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW3NyY3JlZ10KLQkJCQkgICsgRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMTAxIDEwMTAgUm0gUm4gSU1NMzI7IG1vdmh1IFJtLChkMzIsUm4pCi04LjB4ZmUrOC4weDVhKzQuUk0yLDQuUk4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Yjo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbZHN0cmVnXSArIEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAxMTEwIDAxMTAgMTAxMCBSbiBSbSBJTU0zMjsgbW92IChkMzIsUm0rKSxSbgotOC4weGZlKzguMHg2YSs0LlJOMiw0LlJNMCFSTjIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDV5Ojo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTApOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOwotfQotCi0vLyAxMTExIDExMTAgMDExMSAxMDEwIFJtIFJuIElNTTMyOyBtb3YgUm0sKGQzMixSbispCi04LjB4ZmUrOC4weDdhKzQuUk0yLDQuUk4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1ejo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tkc3RyZWddLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gKz0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLX0KLQotCi0vLyAxMTExIDExMTAgMTAwMCAxMDEwIFJuIDAwMDAgSU1NMzI7IG1vdiAoZDMyLHNwKSxSbgotOC4weGZlKzguMHg4YSs0LlJOMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWM6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXQotCQkJCSAgKyBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotLy8gMTExMSAxMTEwIDEwMDEgMTAxMCBSbSAwMDAwIElNTTMyOyBtb3YgUm0sKGQzMixzcCkKLTguMHhmZSs4LjB4OWErNC5STTIsNC4weDArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDVkOjo6bW92Ci0ibW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMTAgMTAxMCAxMDEwIFJuIDAwMDAgSU1NMzI7IG1vdmJ1IChkMzIsc3ApLFJuCi04LjB4ZmUrOC4weGFhKzQuUk4yLDQuMHgwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Yzo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXQotCQkJCSAgKyBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotLy8gMTExMSAxMTEwIDEwMTEgMTAxMCBSbSAwMDAwIElNTTMyOyBtb3ZidSBSbSwoZDMyLHNwKQotOC4weGZlKzguMHhiYSs0LlJNMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWQ6Ojptb3ZidQotIm1vdmJ1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMTAgMTEwMCAxMDEwIFJuIDAwMDAgSU1NMzI7IG1vdmh1IChkMzIsc3ApLFJuCi04LjB4ZmUrOC4weGNhKzQuUk4yLDQuMHgwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Yzo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXQotCQkJCSAgKyBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotLy8gMTExMSAxMTEwIDExMDEgMTAxMCBSbSAwMDAwIElNTTMyOyBtb3ZodSBSbSwoZDMyLHNwKQotOC4weGZlKzguMHhkYSs0LlJNMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWQ6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0KLS8vIDExMTEgMTExMCAxMTEwIDEwMTAgUm4gUm0gSU1NMzI7IG1vdmh1IChkMzIsUm0rKSxSbgotOC4weGZlKzguMHhlYSs0LlJOMiw0LlJNMCFSTjIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDV5Ojo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0wKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW3NyY3JlZ10gKz0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLX0KLQotLy8gMTExMSAxMTEwIDExMTEgMTAxMCBSbSBSbiBJTU0zMjsgbW92aHUgUm0sKGQzMixSbispCi04LjB4ZmUrOC4weGZhKzQuUk0yLDQuUk4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Zjo6Om1vdmh1Ci0ibW92aHUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbZHN0cmVnXSwgU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddICs9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci19Ci0KLQotLy8gMTExMSAxMTEwIDAwMDAgMTAxMSBSbiBSbiBJTU0zMjsgbWFjIGltbTMyLFJuCi04LjB4ZmUrOC4weDBiKzQuUk4yLDQuUk4wPVJOMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6Om1hYwotIm1hYyIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgaW1tID0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLQotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tzcmNyZWddCi0gICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKWltbSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgKHRlbXAgJiAweGZmZmZmZmZmKTsKLSAgYyA9IChzdW0gPCBTdGF0ZS5yZWdzW1JFR19NQ1JMXSkgfHwgKHN1bSA8ICh0ZW1wICYgMHhmZmZmZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgdGVtcCA+Pj0gMzI7Ci0gIHRlbXAgJj0gMHhmZmZmZmZmZjsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSSF0gKyB0ZW1wICsgYzsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSSF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSSF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTEwIDAwMDEgMTAxMSBSbiBSbiBJTU0zMjsgbWFjdSBpbW0zMixSbgotOC4weGZlKzguMHgxYis0LlJOMiw0LlJOMD1STjIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6OjptYWN1Ci0ibWFjdSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkNjQgdGVtcCwgc3VtOwotICBpbnQgYywgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgaW1tID0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3Nbc3JjcmVnXQotICAgICAgICAgICogKHVuc2lnbmVkNjQpaW1tKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyAodGVtcCAmIDB4ZmZmZmZmZmYpOwotICBjID0gKHN1bSA8IFN0YXRlLnJlZ3NbUkVHX01DUkxdKSB8fCAoc3VtIDwgKHRlbXAgJiAweGZmZmZmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICB0ZW1wID4+PSAzMjsKLSAgdGVtcCAmPSAweGZmZmZmZmZmOwotICBzdW0gPSBTdGF0ZS5yZWdzW1JFR19NQ1JIXSArIHRlbXAgKyBjOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JIXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JIXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDExMTAgMDAxMCAxMDExIFJuIFJuIElNTTMyOyBtYWNiIGltbTMyLFJuCi04LjB4ZmUrOC4weDJiKzQuUk4yLDQuUk4wPVJOMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6Om1hY2IKLSJtYWNiIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgaW1tOwotICBzaWduZWQzMiB0ZW1wLCBzdW07Ci0gIGludCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBpbW0gPSBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQ4KShTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQ4KShpbW0gJiAweGZmKSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgdGVtcDsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSTF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTEwIDAwMTEgMTAxMSBSbiBSbiBJTU0zMjsgbWFjYnUgaW1tMzIsUm4KLTguMHhmZSs4LjB4M2IrNC5STjIsNC5STjA9Uk4yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6bWFjYnUKLSJtYWNidSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkMzIgdGVtcCwgc3VtOwotICBpbnQgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgaW1tID0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKGltbSAmIDB4ZmYpKTsKLSAgc3VtID0gU3RhdGUucmVnc1tSRUdfTUNSTF0gKyB0ZW1wOwotICB2ID0gKChTdGF0ZS5yZWdzW1JFR19NQ1JMXSAmIDB4ODAwMDAwMDApID09ICh0ZW1wICYgMHg4MDAwMDAwMCkKLSAgICAgICAgJiYgKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAoc3VtICYgMHg4MDAwMDAwMCkpOwotICBTdGF0ZS5yZWdzW1JFR19NQ1JMXSA9IHN1bTsKLSAgaWYgKHYpCi0gICAgU3RhdGUucmVnc1tSRUdfTUNWRl0gPSAxOwotfQotCi0vLyAxMTExIDExMTAgMDEwMCAxMDExIFJuIFJuIElNTTMyOyBtYWNoIGltbTMyLFJuCi04LjB4ZmUrOC4weDRiKzQuUk4yLDQuUk4wPVJOMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6Om1hY2gKLSJtYWNoIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgaW1tOwotICBzaWduZWQzMiB0ZW1wLCBzdW07Ci0gIGludCB2OwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjApOwotICBpbW0gPSBGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoaW1tICYgMHhmZmZmKSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgdGVtcDsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSTF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTEwIDAxMDEgMTAxMSBSbiBSbiBJTU0zMjsgbWFjaHUgaW1tMzIsUm4KLTguMHhmZSs4LjB4NWIrNC5STjIsNC5STjA9Uk4yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6bWFjaHUKLSJtYWNodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkMzIgdGVtcCwgc3VtOwotICBpbnQgdjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4wKTsKLSAgaW1tID0gRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDMyKShTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmZmYpCi0gICAgICAgICAgKiAodW5zaWduZWQzMikoaW1tICYgMHhmZmZmKSk7Ci0gIHN1bSA9IFN0YXRlLnJlZ3NbUkVHX01DUkxdICsgdGVtcDsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSTF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTEwIDAxMTAgMTAxMSBSbiBSbiBJTU0zMjsgZG1hY2ggaW1tMzIsUm4KLTguMHhmZSs4LjB4NmIrNC5STjIsNC5STjA9Uk4yKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1Ojo6ZG1hY2gKLSJkbWFjaCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGltbSA9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZ10gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShpbW0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAxNikgJiAweGZmZmYpCi0JICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KSgoaW1tID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLSAgdiA9ICgoU3RhdGUucmVnc1tSRUdfTUNSTF0gJiAweDgwMDAwMDAwKSA9PSAodGVtcCAmIDB4ODAwMDAwMDApCi0gICAgICAgICYmICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLSAgU3RhdGUucmVnc1tSRUdfTUNSTF0gPSBzdW07Ci0gIGlmICh2KQotICAgIFN0YXRlLnJlZ3NbUkVHX01DVkZdID0gMTsKLX0KLQotLy8gMTExMSAxMTEwIDAxMTEgMTAxMSBSbiBSbiBJTU0zMjsgZG1hY2h1IGltbTMyLFJuCi04LjB4ZmUrOC4weDdiKzQuUk4yLDQuUk4wPVJOMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6OmRtYWNodQotImRtYWNodSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGltbTsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLSAgaW50IHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGltbSA9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQzMikoU3RhdGUucmVnc1tzcmNyZWddICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKGltbSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgodW5zaWduZWQzMikoKFN0YXRlLnJlZ3Nbc3JjcmVnXSA+PiAxNikgJiAweGZmZmYpCi0JICAgKiAodW5zaWduZWQzMikoKGltbSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0gIHYgPSAoKFN0YXRlLnJlZ3NbUkVHX01DUkxdICYgMHg4MDAwMDAwMCkgPT0gKHRlbXAgJiAweDgwMDAwMDAwKQotICAgICAgICAmJiAodGVtcCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01DUkxdID0gc3VtOwotICBpZiAodikKLSAgICBTdGF0ZS5yZWdzW1JFR19NQ1ZGXSA9IDE7Ci19Ci0KLS8vIDExMTEgMTExMCAxMDAwIDEwMTEgUm4gUm4gSU1NMzI7IGRtdWxoIGltbTMyLFJuCi04LjB4ZmUrOC4weDhiKzQuUk4yLDQuUk4wPVJOMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENTo6OmRtdWxoCi0iZG11bGgiCi0qYW0zMwotewotICBpbnQgaW1tLCBkc3RyZWc7Ci0gIHNpZ25lZDMyIHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGltbSA9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZ10gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShpbW0gJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSB0ZW1wOwotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW2RzdHJlZ10gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKGltbT4+MTYpICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IHRlbXA7Ci19Ci0KLS8vIDExMTEgMTExMCAxMDAxIDEwMTEgUm4gUm4gSU1NMzI7IGRtdWxodSBpbW0zMixSbgotOC4weGZlKzguMHg5Yis0LlJOMiw0LlJOMD1STjIrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDU6OjpkbXVsaHUKLSJkbXVsaHUiCi0qYW0zMwotewotICBpbnQgaW1tLCBkc3RyZWc7Ci0gIHNpZ25lZDMyIHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMCk7Ci0gIGltbSA9IEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7Ci0KLSAgdGVtcCA9ICgodW5zaWduZWQzMikoU3RhdGUucmVnc1tkc3RyZWddICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKGltbSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9IHRlbXA7Ci0gIHRlbXAgPSAoKHVuc2lnbmVkMzIpKChTdGF0ZS5yZWdzW2RzdHJlZ10gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICogKHVuc2lnbmVkMzIpKChpbW0gPj4xNikgJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gdGVtcDsKLX0KLQotLy8gMTExMSAxMTEwIDAwMDAgMTExMCBSbiAwMDAwIElNTTMyOyBtb3YgKGFiczMyKSxSbgotOC4weGZlKzguMHgwZSs0LlJOMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWg6Ojptb3YKLSJtb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotfQotCi0vLyAxMTExIDExMTAgMDAwMSAxMTEwIFJtIDAwMDAgSU1NMzI7IG1vdiBSbiwoYWJzMzIpCi04LjB4ZmUrOC4weDFlKzQuUk0yLDQuMHgwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1ZTo6Om1vdgotIm1vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIHN0b3JlX3dvcmQgKEZFVENIMzIgKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksIFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMDIwIDExMTAgUm4gMDAwMCBJTU0zMjsgbW92YnUgKGFiczMyKSxSbgotOC4weGZlKzguMHgyZSs0LlJOMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWk6Ojptb3ZidQotIm1vdmJ1IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF9ieXRlIChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotLy8gMTExMSAxMTEwIDAwMTEgMTExMCBSbSAwMDAwIElNTTMyOyBtb3ZidSBSbiwoYWJzMzIpCi04LjB4ZmUrOC4weDNlKzQuUk0yLDQuMHgwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ1ZTo6Om1vdmJ1Ci0ibW92YnUiCi0qYW0zMwotewotICBpbnQgc3JjcmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBzdG9yZV9ieXRlIChGRVRDSDMyIChJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBTdGF0ZS5yZWdzW3NyY3JlZ10pOwotfQotCi0vLyAxMTExIDExMTAgMDEwMCAxMTEwIFJuIDAwMDAgSU1NMzI7IG1vdmh1IChhYnMzMiksUm4KLTguMHhmZSs4LjB4NGUrNC5STjIsNC4weDArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDVqOjo6bW92aHUKLSJtb3ZodSIKLSphbTMzCi17Ci0gIGludCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfaGFsZiAoRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci19Ci0KLS8vIDExMTEgMTExMCAwMTAxIDExMTAgUm0gMDAwMCBJTU0zMjsgbW92aHUgUm4sKGFiczMyKQotOC4weGZlKzguMHg1ZSs0LlJNMiw0LjB4MCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENWU6Ojptb3ZodQotIm1vdmh1IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgc3RvcmVfaGFsZiAoRkVUQ0gzMiAoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgU3RhdGUucmVnc1tzcmNyZWddKTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDAgMDAwMCBSbTEgUm4xIFJtMiBSbjI7IGFkZF9hZGQgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDAwKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmFkZF9hZGQKLSJhZGRfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAxIDAwMDAgUm0xIFJuMSBpbW00IFJuMjsgYWRkX2FkZCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDEwKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6YWRkX2FkZAotImFkZF9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDAxMCAwMDAwIFJtMSBSbjEgUm0yIFJuMjsgYWRkX3N1YiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MjArNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YWRkX3N1YgotImFkZF9zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMTEgMDAwMCBSbTEgUm4xIGltbTQgUm4yOyBhZGRfc3ViIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MzArNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphZGRfc3ViCi0iYWRkX3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gLT0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMTAwIDAwMDAgUm0xIFJuMSBSbTIgUm4yOyBhZGRfY21wIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0MCs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjphZGRfY21wCi0iYWRkX2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzJdLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotfQotCi0vLyAxMTExIDAxMTEgMDEwMSAwMDAwIFJtMSBSbjEgaW1tNCBSbjI7IGFkZF9jbXAgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg1MCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmFkZF9jbXAKLSJhZGRfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNCksIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdICs9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMTAgMDAwMCBSbTEgUm4xIFJtMiBSbjI7IGFkZF9tb3YgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDYwKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmFkZF9tb3YKLSJhZGRfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAxMTEgMDAwMCBSbTEgUm4xIGltbTQgUm4yOyBhZGRfbW92IFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4NzArNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphZGRfbW92Ci0iYWRkX21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDEwMDAgMDAwMCBSbTEgUm4xIFJtMiBSbjI7IGFkZF9hc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDgwKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmFkZF9hc3IKLSJhZGRfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMDEgMDAwMCBSbTEgUm4xIGltbTQgUm4yOyBhZGRfYXNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OTArNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphZGRfYXNyCi0iYWRkX2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAwMDAwIFJtMSBSbjEgUm0yIFJuMjsgYWRkX2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTArNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YWRkX2xzcgotImFkZF9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDExIDAwMDAgUm0xIFJuMSBpbW00IFJuMjsgYWRkX2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGIwKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6YWRkX2xzcgotImFkZF9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLSAgCi0vLyAxMTExIDAxMTEgMTEwMCAwMDAwIFJtMSBSbjEgUm0yIFJuMjsgYWRkX2FzbCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YzArNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YWRkX2FzbAotImFkZF9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDAwMDAgUm0xIFJuMSBpbW00IFJuMjsgYWRkX2FzbCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGQwKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6YWRkX2FzbAotImFkZF9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPDw9IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDAwIDAwMDEgUm0xIFJuMSBSbTIgUm4yOyBjbXBfYWRkIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgwMSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpjbXBfYWRkCi0iY21wX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzFdLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMSAwMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGNtcF9hZGQgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgxMSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmNtcF9hZGQKLSJjbXBfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcxXSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMTAgMDAwMSBSbTEgUm4xIFJtMiBSbjI7IGNtcF9zdWIgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDIxKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmNtcF9zdWIKLSJjbXBfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0sIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci19Ci0KLS8vIDExMTEgMDExMSAwMDExIDAwMDEgUm0xIFJuMSBpbW00IFJuMjsgY21wX3N1YiBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDMxKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6Y21wX3N1YgotImNtcF9zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzFdLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAwMDAxIFJtMSBSbjEgUm0yIFJuMjsgY21wX21vdiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NjErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6Y21wX21vdgotImNtcF9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcxXSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAwMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGNtcF9tb3YgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg3MSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmNtcF9tb3YKLSJjbXBfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcxXSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBFWFRFTkQ0IChJTU00KTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAwMDAxIFJtMSBSbjEgUm0yIFJuMjsgY21wX2FzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4ODErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6Y21wX2FzcgotImNtcF9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzFdLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotfQotCi0vLyAxMTExIDAxMTEgMTAwMSAwMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGNtcF9hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5MSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmNtcF9hc3IKLSJjbXBfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzFdLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMCAwMDAxIFJtMSBSbjEgUm0yIFJuMjsgY21wX2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6Y21wX2xzcgotImNtcF9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcxXSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci19Ci0KLS8vIDExMTEgMDExMSAxMDExIDAwMDEgUm0xIFJuMSBpbW00IFJuMjsgY21wX2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGIxKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6Y21wX2xzcgotImNtcF9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0sIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBJTU00OwotfQotICAKLSAgCi0vLyAxMTExIDAxMTEgMTEwMCAwMDAxIFJtMSBSbjEgUm0yIFJuMjsgY21wX2FzbCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YzErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6Y21wX2FzbAotImNtcF9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcxXSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPDw9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDAwMDEgUm0xIFJuMSBpbW00IFJuMjsgY21wX2FzbCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGQxKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6Y21wX2FzbAotImNtcF9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0sIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBJTU00OwotfQotCi0vLyAxMTExIDAxMTEgMDAwMCAwMDEwIFJtMSBSbjEgUm0yIFJuMjsgc3ViX2FkZCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MDIrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c3ViX2FkZAotInN1Yl9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDEgMDAxMCBSbTEgUm4xIGltbTQgUm4yOyBzdWJfYWRkIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MTIrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjpzdWJfYWRkCi0ic3ViX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAwMTAgUm0xIFJuMSBSbTIgUm4yOyBzdWJfc3ViIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgyMis0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpzdWJfc3ViCi0ic3ViX3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gLSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAwMDEwIFJtMSBSbjEgaW1tNCBSbjI7IHN1Yl9zdWIgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgzMis0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnN1Yl9zdWIKLSJzdWJfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMDAgMDAxMCBSbTEgUm4xIFJtMiBSbjI7IHN1Yl9jbXAgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDQyKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN1Yl9jbXAKLSJzdWJfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMl0sIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0KLS8vIDExMTEgMDExMSAwMTAxIDAwMTAgUm0xIFJuMSBpbW00IFJuMjsgc3ViX2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDUyKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3ViX2NtcAotInN1Yl9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNCksIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMTAgMDAxMCBSbTEgUm4xIFJtMiBSbjI7IHN1Yl9tb3YgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDYyKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN1Yl9tb3YKLSJzdWJfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAxMTEgMDAxMCBSbTEgUm4xIGltbTQgUm4yOyBzdWJfbW92IFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4NzIrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjpzdWJfbW92Ci0ic3ViX21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDEwMDAgMDAxMCBSbTEgUm4xIFJtMiBSbjI7IHN1Yl9hc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDgyKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN1Yl9hc3IKLSJzdWJfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMDEgMDAxMCBSbTEgUm4xIGltbTQgUm4yOyBzdWJfYXNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OTIrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjpzdWJfYXNyCi0ic3ViX2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAwMDEwIFJtMSBSbjEgUm0yIFJuMjsgc3ViX2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTIrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c3ViX2xzcgotInN1Yl9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDExIDAwMTAgUm0xIFJuMSBpbW00IFJuMjsgc3ViX2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGIyKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3ViX2xzcgotInN1Yl9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLSAgCi0vLyAxMTExIDAxMTEgMTEwMCAwMDEwIFJtMSBSbjEgUm0yIFJuMjsgc3ViX2FzbCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YzIrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c3ViX2FzbAotInN1Yl9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDAwMTAgUm0xIFJuMSBpbW00IFJuMjsgc3ViX2FzbCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGQyKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3ViX2FzbAotInN1Yl9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPDw9IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDAwIDAwMTEgUm0xIFJuMSBSbTIgUm4yOyBtb3ZfYWRkIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgwMys0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojptb3ZfYWRkCi0ibW92X2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAxIDAwMTEgUm0xIFJuMSBpbW00IFJuMjsgbW92X2FkZCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDEzKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6bW92X2FkZAotIm1vdl9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAwMTEgUm0xIFJuMSBSbTIgUm4yOyBtb3Zfc3ViIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgyMys0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojptb3Zfc3ViCi0ibW92X3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gLT0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDExIDAwMTEgUm0xIFJuMSBpbW00IFJuMjsgbW92X3N1YiBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDMzKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6bW92X3N1YgotIm1vdl9zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gLT0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMTAwIDAwMTEgUm0xIFJuMSBSbTIgUm4yOyBtb3ZfY21wIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0Mys0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojptb3ZfY21wCi0ibW92X2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzJdLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0KLS8vIDExMTEgMDExMSAwMTAxIDAwMTEgUm0xIFJuMSBpbW00IFJuMjsgbW92X2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDUzKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6bW92X2NtcAotIm1vdl9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00KSwgU3RhdGUucmVnc1tkc3RyZWcyXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotfQotICAKLS8vIDExMTEgMDExMSAwMTEwIDAwMTEgUm0xIFJuMSBSbTIgUm4yOyBtb3ZfbW92IFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg2Mys0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojptb3ZfbW92Ci0ibW92X21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAxMTEgMDAxMSBSbTEgUm4xIGltbTQgUm4yOyBtb3ZfbW92IFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4NzMrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojptb3ZfbW92Ci0ibW92X21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAwMDExIFJtMSBSbjEgUm0yIFJuMjsgbW92X2FzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4ODMrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6bW92X2FzcgotIm1vdl9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDAwMTEgUm0xIFJuMSBpbW00IFJuMjsgbW92X2FzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDkzKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6bW92X2FzcgotIm1vdl9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAwMDExIFJtMSBSbjEgUm0yIFJuMjsgbW92X2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTMrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6bW92X2xzcgotIm1vdl9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMTEgMDAxMSBSbTEgUm4xIGltbTQgUm4yOyBtb3ZfbHNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4YjMrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojptb3ZfbHNyCi0ibW92X2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0gIAotLy8gMTExMSAwMTExIDExMDAgMDAxMSBSbTEgUm4xIFJtMiBSbjI7IG1vdl9hc2wgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGMzKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6Om1vdl9hc2wKLSJtb3ZfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDAwMTEgUm0xIFJuMSBpbW00IFJuMjsgbW92X2FzbCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGQzKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6bW92X2FzbAotIm1vdl9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMDAgMDEwMCBpbW00IFJuMSBSbTIgUm4yOyBhZGRfYWRkIGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MDQrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6YWRkX2FkZAotImFkZF9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAxIDAxMDAgaW1tNCBSbjEgaW1tNCBSbjI7IGFkZF9hZGQgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MTQrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OmFkZF9hZGQKLSJhZGRfYWRkIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAxMDAgaW1tNCBSbjEgUm0yIFJuMjsgYWRkX3N1YiBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDI0KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OmFkZF9zdWIKLSJhZGRfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAwMTAwIGltbTQgUm4xIGltbTQgUm4yOyBhZGRfc3ViIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDM0KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjphZGRfc3ViCi0iYWRkX3N1YiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDEwMCAwMTAwIGltbTQgUm4xIFJtMiBSbjI7IGFkZF9jbXAgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0NCs0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjphZGRfY21wCi0iYWRkX2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMl0sIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdICs9IEVYVEVORDQgKElNTTRBKTsKLX0KLQotLy8gMTExMSAwMTExIDAxMDEgMDEwMCBpbW00IFJuMSBpbW00IFJuMjsgYWRkX2NtcCBpbW00LCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg1NCs0LklNTTRBLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJkOjo6YWRkX2NtcAotImFkZF9jbXAiCi0qYW0zMwotewotICBpbnQgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTQpLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSArPSBFWFRFTkQ0IChJTU00QSk7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMTAgMDEwMCBpbW00IFJuMSBSbTIgUm4yOyBhZGRfbW92IGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NjQrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6YWRkX21vdgotImFkZF9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAxMTEgMDEwMCBpbW00IFJuMSBpbW00IFJuMjsgYWRkX21vdiBpbW00LCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg3NCs0LklNTTRBLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJkOjo6YWRkX21vdgotImFkZF9tb3YiCi0qYW0zMwotewotICBpbnQgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAwMTAwIGltbTQgUm4xIFJtMiBSbjI7IGFkZF9hc3IgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg4NCs0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjphZGRfYXNyCi0iYWRkX2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICsgRVhURU5ENCAoSU1NNEEpOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAwMSAwMTAwIGltbTQgUm4xIGltbTQgUm4yOyBhZGRfYXNyIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDk0KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjphZGRfYXNyCi0iYWRkX2FzciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDEwMTAgMDEwMCBpbW00IFJuMSBSbTIgUm4yOyBhZGRfbHNyIGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTQrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6YWRkX2xzcgotImFkZF9sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMSAwMTAwIGltbTQgUm4xIGltbTQgUm4yOyBhZGRfbHNyIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGI0KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjphZGRfbHNyCi0iYWRkX2xzciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gKyBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLSAgCi0vLyAxMTExIDAxMTEgMTEwMCAwMTAwIGltbTQgUm4xIFJtMiBSbjI7IGFkZF9hc2wgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhjNCs0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjphZGRfYXNsCi0iYWRkX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDAxMDAgaW1tNCBSbjEgaW1tNCBSbjI7IGFkZF9hc2wgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4ZDQrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OmFkZF9hc2wKLSJhZGRfYXNsIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSArIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMDAgMDEwMSBpbW00IFJuMSBSbTIgUm4yOyBjbXBfYWRkIGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MDUrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6Y21wX2FkZAotImNtcF9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00QSksIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAxIDAxMDEgaW1tNCBSbjEgaW1tNCBSbjI7IGNtcF9hZGQgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MTUrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OmNtcF9hZGQKLSJjbXBfYWRkIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00QSksIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IEVYVEVORDQgKElNTTQpOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAxMDEgaW1tNCBSbjEgUm0yIFJuMjsgY21wX3N1YiBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDI1KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OmNtcF9zdWIKLSJjbXBfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNEEpLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAwMTAxIGltbTQgUm4xIGltbTQgUm4yOyBjbXBfc3ViIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDM1KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjpjbXBfc3ViCi0iY21wX3N1YiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNEEpLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAwMTAxIGltbTQgUm4xIFJtMiBSbjI7IGNtcF9tb3YgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg2NSs0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjpjbXBfbW92Ci0iY21wX21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTRBKSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAwMTAxIGltbTQgUm4xIGltbTQgUm4yOyBjbXBfbW92IGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDc1KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjpjbXBfbW92Ci0iY21wX21vdiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNEEpLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotfQotICAKLS8vIDExMTEgMDExMSAxMDAwIDAxMDEgaW1tNCBSbjEgUm0yIFJuMjsgY21wX2FzciBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDg1KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OmNtcF9hc3IKLSJjbXBfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00QSksIFN0YXRlLnJlZ3NbZHN0cmVnMV0pOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDAxMDEgaW1tNCBSbjEgaW1tNCBSbjI7IGNtcF9hc3IgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OTUrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OmNtcF9hc3IKLSJjbXBfYXNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTRBKSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAwMTAxIGltbTQgUm4xIFJtMiBSbjI7IGNtcF9sc3IgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhhNSs0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjpjbXBfbHNyCi0iY21wX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTRBKSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci19Ci0KLS8vIDExMTEgMDExMSAxMDExIDAxMDEgaW1tNCBSbjEgaW1tNCBSbjI7IGNtcF9sc3IgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4YjUrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OmNtcF9sc3IKLSJjbXBfbHNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTRBKSwgU3RhdGUucmVnc1tkc3RyZWcxXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDAxMDEgaW1tNCBSbjEgUm0yIFJuMjsgY21wX2FzbCBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGM1KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OmNtcF9hc2wKLSJjbXBfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNEEpLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMDEwMSBpbW00IFJuMSBpbW00IFJuMjsgY21wX2FzbCBpbW00LCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHhkNSs0LklNTTRBLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJkOjo6Y21wX2FzbAotImNtcF9hc2wiCi0qYW0zMwotewotICBpbnQgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNEEpLCBTdGF0ZS5yZWdzW2RzdHJlZzFdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLX0KLQotLy8gMTExMSAwMTExIDAwMDAgMDExMCBpbW00IFJuMSBSbTIgUm4yOyBzdWJfYWRkIGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MDYrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6c3ViX2FkZAotInN1Yl9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gLSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAxIDAxMTAgaW1tNCBSbjEgaW1tNCBSbjI7IHN1Yl9hZGQgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MTYrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OnN1Yl9hZGQKLSJzdWJfYWRkIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gLSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAxMTAgaW1tNCBSbjEgUm0yIFJuMjsgc3ViX3N1YiBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDI2KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OnN1Yl9zdWIKLSJzdWJfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAwMTEwIGltbTQgUm4xIGltbTQgUm4yOyBzdWJfc3ViIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDM2KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjpzdWJfc3ViCi0ic3ViX3N1YiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDEwMCAwMTEwIGltbTQgUm4xIFJtMiBSbjI7IHN1Yl9jbXAgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0Nis0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjpzdWJfY21wCi0ic3ViX2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzJdLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSAtPSBFWFRFTkQ0IChJTU00QSk7Ci19Ci0KLS8vIDExMTEgMDExMSAwMTAxIDAxMTAgaW1tNCBSbjEgaW1tNCBSbjI7IHN1Yl9jbXAgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4NTYrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OnN1Yl9jbXAKLSJzdWJfY21wIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNCksIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdIC09IEVYVEVORDQgKElNTTRBKTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAwMTEwIGltbTQgUm4xIFJtMiBSbjI7IHN1Yl9tb3YgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg2Nis0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjpzdWJfbW92Ci0ic3ViX21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAwMTEwIGltbTQgUm4xIGltbTQgUm4yOyBzdWJfbW92IGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDc2KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6OjpzdWJfbW92Ci0ic3ViX21vdiIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDAwIDAxMTAgaW1tNCBSbjEgUm0yIFJuMjsgc3ViX2FzciBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDg2KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OnN1Yl9hc3IKLSJzdWJfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gLSBFWFRFTkQ0IChJTU00QSk7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDAxMTAgaW1tNCBSbjEgaW1tNCBSbjI7IHN1Yl9hc3IgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OTYrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OnN1Yl9hc3IKLSJzdWJfYXNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIEVYVEVORDQgKElNTTRBKTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAwMTEwIGltbTQgUm4xIFJtMiBSbjI7IHN1Yl9sc3IgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhhNis0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6OjpzdWJfbHNyCi0ic3ViX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDExIDAxMTAgaW1tNCBSbjEgaW1tNCBSbjI7IHN1Yl9sc3IgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4YjYrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6OnN1Yl9sc3IKLSJzdWJfbHNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAtIEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDAxMTAgaW1tNCBSbjEgUm0yIFJuMjsgc3ViX2FzbCBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGM2KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6OnN1Yl9hc2wKLSJzdWJfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMDExMCBpbW00IFJuMSBpbW00IFJuMjsgc3ViX2FzbCBpbW00LCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHhkNis0LklNTTRBLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJkOjo6c3ViX2FzbAotInN1Yl9hc2wiCi0qYW0zMwotewotICBpbnQgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIC0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDAwMCAwMTExIGltbTQgUm4xIFJtMiBSbjI7IG1vdl9hZGQgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgwNys0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6Ojptb3ZfYWRkCi0ibW92X2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMSAwMTExIGltbTQgUm4xIGltbTQgUm4yOyBtb3ZfYWRkIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDE3KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6Ojptb3ZfYWRkCi0ibW92X2FkZCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDAxMTEgaW1tNCBSbjEgUm0yIFJuMjsgbW92X3N1YiBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDI3KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6Om1vdl9zdWIKLSJtb3Zfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gLT0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDExIDAxMTEgaW1tNCBSbjEgaW1tNCBSbjI7IG1vdl9zdWIgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MzcrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6Om1vdl9zdWIKLSJtb3Zfc3ViIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMDAgMDExMSBpbW00IFJuMSBSbTIgUm4yOyBtb3ZfY21wIGltbTQsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NDcrNC5JTU00QSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDJjOjo6bW92X2NtcAotIm1vdl9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChTdGF0ZS5yZWdzW3NyY3JlZzJdLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IEVYVEVORDQgKElNTTRBKTsKLX0KLQotLy8gMTExMSAwMTExIDAxMDEgMDExMSBpbW00IFJuMSBpbW00IFJuMjsgbW92X2NtcCBpbW00LCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg1Nys0LklNTTRBLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJkOjo6bW92X2NtcAotIm1vdl9jbXAiCi0qYW0zMwotewotICBpbnQgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTQpLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IEVYVEVORDQgKElNTTRBKTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAwMTExIGltbTQgUm4xIFJtMiBSbjI7IG1vdl9tb3YgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg2Nys0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6Ojptb3ZfbW92Ci0ibW92X21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gRVhURU5ENCAoSU1NNEEpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMTExIDAxMTEgaW1tNCBSbjEgaW1tNCBSbjI7IG1vdl9tb3YgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4NzcrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6Om1vdl9tb3YKLSJtb3ZfbW92IgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAwMTExIGltbTQgUm4xIFJtMiBSbjI7IG1vdl9hc3IgaW1tNCwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg4Nys0LklNTTRBLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMmM6Ojptb3ZfYXNyCi0ibW92X2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBFWFRFTkQ0IChJTU00QSk7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDAxMTEgaW1tNCBSbjEgaW1tNCBSbjI7IG1vdl9hc3IgaW1tNCwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OTcrNC5JTU00QSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyZDo6Om1vdl9hc3IKLSJtb3ZfYXNyIgotKmFtMzMKLXsKLSAgaW50IGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gRVhURU5ENCAoSU1NNEEpOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDEwIDAxMTEgaW1tNCBSbjEgUm0yIFJuMjsgbW92X2xzciBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGE3KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6Om1vdl9sc3IKLSJtb3ZfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMSAwMTExIGltbTQgUm4xIGltbTQgUm4yOyBtb3ZfbHNyIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGI3KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6Ojptb3ZfbHNyCi0ibW92X2xzciIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDAxMTEgaW1tNCBSbjEgUm0yIFJuMjsgbW92X2FzbCBpbW00LCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGM3KzQuSU1NNEEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyYzo6Om1vdl9hc2wKLSJtb3ZfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBFWFRFTkQ0IChJTU00QSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPDw9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTEwMSAwMTExIGltbTQgUm4xIGltbTQgUm4yOyBtb3ZfYXNsIGltbTQsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGQ3KzQuSU1NNEEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmQ6Ojptb3ZfYXNsCi0ibW92X2FzbCIKLSphbTMzCi17Ci0gIGludCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IEVYVEVORDQgKElNTTRBKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gCi0vLyAxMTExIDAxMTEgMDAwMCAxMDAwIFJtMSBSbjEgUm0yIFJuMjsgYW5kX2FkZCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MDgrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YW5kX2FkZAotImFuZF9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDEgMTAwMCBSbTEgUm4xIGltbTQgUm4yOyBhbmRfYWRkIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MTgrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphbmRfYWRkCi0iYW5kX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSAmIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDEwMDAgUm0xIFJuMSBSbTIgUm4yOyBhbmRfc3ViIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgyOCs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjphbmRfc3ViCi0iYW5kX3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAxMDAwIFJtMSBSbjEgaW1tNCBSbjI7IGFuZF9zdWIgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgzOCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmFuZF9zdWIKLSJhbmRfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMDAgMTAwMCBSbTEgUm4xIFJtMiBSbjI7IGFuZF9jbXAgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDQ4KzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmFuZF9jbXAKLSJhbmRfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMl0sIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdICY9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0KLS8vIDExMTEgMDExMSAwMTAxIDEwMDAgUm0xIFJuMSBpbW00IFJuMjsgYW5kX2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDU4KzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6YW5kX2NtcAotImFuZF9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00KSwgU3RhdGUucmVnc1tkc3RyZWcyXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gJj0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAxMDAwIFJtMSBSbjEgUm0yIFJuMjsgYW5kX21vdiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NjgrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YW5kX21vdgotImFuZF9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAxMDAwIFJtMSBSbjEgaW1tNCBSbjI7IGFuZF9tb3YgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg3OCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmFuZF9tb3YKLSJhbmRfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAxMDAwIFJtMSBSbjEgUm0yIFJuMjsgYW5kX2FzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4ODgrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6YW5kX2FzcgotImFuZF9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAwMSAxMDAwIFJtMSBSbjEgaW1tNCBSbjI7IGFuZF9hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5OCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmFuZF9hc3IKLSJhbmRfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDEwIDEwMDAgUm0xIFJuMSBSbTIgUm4yOyBhbmRfbHNyIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhhOCs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjphbmRfbHNyCi0iYW5kX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMTEgMTAwMCBSbTEgUm4xIGltbTQgUm4yOyBhbmRfbHNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4YjgrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphbmRfbHNyCi0iYW5kX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDEwMDAgUm0xIFJuMSBSbTIgUm4yOyBhbmRfYXNsIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhjOCs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjphbmRfYXNsCi0iYW5kX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMTAwMCBSbTEgUm4xIGltbTQgUm4yOyBhbmRfYXNsIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4ZDgrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjphbmRfYXNsCi0iYW5kX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdICYgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAwIDEwMDEgUm0xIFJuMSBSbTIgUm4yOyBkbWFjaF9hZGQgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDA5KzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmRtYWNoX2FkZAotImRtYWNoX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHRlbXAyID0gKChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tkc3RyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMSAxMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGRtYWNoX2FkZCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDE5KzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6ZG1hY2hfYWRkCi0iZG1hY2hfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBzdW07Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMTAgMTAwMSBSbTEgUm4xIFJtMiBSbjI7IGRtYWNoX3N1YiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MjkrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6ZG1hY2hfc3ViCi0iZG1hY2hfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW2RzdHJlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBzdW07Ci19Ci0KLS8vIDExMTEgMDExMSAwMDExIDEwMDEgUm0xIFJuMSBpbW00IFJuMjsgZG1hY2hfc3ViIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MzkrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6OjpkbWFjaF9zdWIKLSJkbWFjaF9zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHRlbXAyID0gKChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tkc3RyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDEwMCAxMDAxIFJtMSBSbjEgUm0yIFJuMjsgZG1hY2hfY21wIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0OSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpkbWFjaF9jbXAKLSJkbWFjaF9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMl0sIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotfQotCi0vLyAxMTExIDAxMTEgMDEwMSAxMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGRtYWNoX2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDU5KzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6ZG1hY2hfY21wCi0iZG1hY2hfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTQpLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAxMDAxIFJtMSBSbjEgUm0yIFJuMjsgZG1hY2hfbW92IFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg2OSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpkbWFjaF9tb3YKLSJkbWFjaF9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAxMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGRtYWNoX21vdiBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDc5KzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6ZG1hY2hfbW92Ci0iZG1hY2hfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAxMDAxIFJtMSBSbjEgUm0yIFJuMjsgZG1hY2hfYXNyIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg4OSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpkbWFjaF9hc3IKLSJkbWFjaF9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgc2lnbmVkMzIgdGVtcCwgdGVtcDIsIHN1bTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLX0KLQotLy8gMTExMSAwMTExIDEwMDEgMTAwMSBSbTEgUm4xIGltbTQgUm4yOyBkbWFjaF9hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5OSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmRtYWNoX2FzcgotImRtYWNoX2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW2RzdHJlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBzdW07Ci19Ci0gIAotLy8gMTExMSAwMTExIDEwMTAgMTAwMSBSbTEgUm4xIFJtMiBSbjI7IGRtYWNoX2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YTkrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6ZG1hY2hfbHNyCi0iZG1hY2hfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW2RzdHJlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMSAxMDAxIFJtMSBSbjEgaW1tNCBSbjI7IGRtYWNoX2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGI5KzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6ZG1hY2hfbHNyCi0iZG1hY2hfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIHNpZ25lZDMyIHRlbXAsIHRlbXAyLCBzdW07Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW2RzdHJlZzFdICYgMHhmZmZmKQotICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikpOwotICB0ZW1wMiA9ICgoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpCi0gICAgICAgICAgICogKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3NbZHN0cmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHN1bSA9IHRlbXAgKyB0ZW1wMiArIFN0YXRlLnJlZ3NbUkVHX01DUkxdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBzdW07Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDEwMDEgUm0xIFJuMSBSbTIgUm4yOyBkbWFjaF9hc2wgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGM5KzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OmRtYWNoX2FzbAotImRtYWNoX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICB0ZW1wID0gKChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3NbZHN0cmVnMV0gJiAweGZmZmYpCi0gICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KShTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSk7Ci0gIHRlbXAyID0gKChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgICAgKiAoc2lnbmVkMzIpKHNpZ25lZDE2KSgoU3RhdGUucmVnc1tkc3RyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgc3VtID0gdGVtcCArIHRlbXAyICsgU3RhdGUucmVnc1tSRUdfTUNSTF07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHN1bTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMTAwMSBSbTEgUm4xIGltbTQgUm4yOyBkbWFjaF9hc2wgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHhkOSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OmRtYWNoX2FzbAotImRtYWNoX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBzaWduZWQzMiB0ZW1wLCB0ZW1wMiwgc3VtOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHRlbXAgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoU3RhdGUucmVnc1tkc3RyZWcxXSAmIDB4ZmZmZikKLSAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpKTsKLSAgdGVtcDIgPSAoKHNpZ25lZDMyKShzaWduZWQxNikoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKQotICAgICAgICAgICAqIChzaWduZWQzMikoc2lnbmVkMTYpKChTdGF0ZS5yZWdzW2RzdHJlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBzdW0gPSB0ZW1wICsgdGVtcDIgKyBTdGF0ZS5yZWdzW1JFR19NQ1JMXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gc3VtOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMCAxMDEwIFJtMSBSbjEgUm0yIFJuMjsgeG9yX2FkZCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MGErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6eG9yX2FkZAotInhvcl9hZGQiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDEgMTAxMCBSbTEgUm4xIGltbTQgUm4yOyB4b3JfYWRkIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MWErNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojp4b3JfYWRkCi0ieG9yX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSBeIFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gKz0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAwMDEwIDEwMTAgUm0xIFJuMSBSbTIgUm4yOyB4b3Jfc3ViIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHgyYSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojp4b3Jfc3ViCi0ieG9yX3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAxMDEwIFJtMSBSbjEgaW1tNCBSbjI7IHhvcl9zdWIgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgzYSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6Onhvcl9zdWIKLSJ4b3Jfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMDAgMTAxMCBSbTEgUm4xIFJtMiBSbjI7IHhvcl9jbXAgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDRhKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6Onhvcl9jbXAKLSJ4b3JfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKFN0YXRlLnJlZ3Nbc3JjcmVnMl0sIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdIF49IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0KLS8vIDExMTEgMDExMSAwMTAxIDEwMTAgUm0xIFJuMSBpbW00IFJuMjsgeG9yX2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDVhKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6eG9yX2NtcAotInhvcl9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBnZW5lcmljQ21wIChFWFRFTkQ0IChJTU00KSwgU3RhdGUucmVnc1tkc3RyZWcyXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gXj0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDExMCAxMDEwIFJtMSBSbjEgUm0yIFJuMjsgeG9yX21vdiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NmErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6eG9yX21vdgotInhvcl9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAxMDEwIFJtMSBSbjEgaW1tNCBSbjI7IHhvcl9tb3YgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg3YSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6Onhvcl9tb3YKLSJ4b3JfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAxMDEwIFJtMSBSbjEgUm0yIFJuMjsgeG9yX2FzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4OGErNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6eG9yX2FzcgotInhvcl9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAwMSAxMDEwIFJtMSBSbjEgaW1tNCBSbjI7IHhvcl9hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5YSs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6Onhvcl9hc3IKLSJ4b3JfYXNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDEwIDEwMTAgUm0xIFJuMSBSbTIgUm4yOyB4b3JfbHNyIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhhYSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojp4b3JfbHNyCi0ieG9yX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMTEgMTAxMCBSbTEgUm4xIGltbTQgUm4yOyB4b3JfbHNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4YmErNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojp4b3JfbHNyCi0ieG9yX2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotICAKLS8vIDExMTEgMDExMSAxMTAwIDEwMTAgUm0xIFJuMSBSbTIgUm4yOyB4b3JfYXNsIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhjYSs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojp4b3JfYXNsCi0ieG9yX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMTAxMCBSbTEgUm4xIGltbTQgUm4yOyB4b3JfYXNsIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4ZGErNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojp4b3JfYXNsCi0ieG9yX2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIF4gU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAwIDEwMTEgUm0xIFJuMSBSbTIgUm4yOyBzd2h3X2FkZCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MGIrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c3dod19hZGQKLSJzd2h3X2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gXiBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMSAxMDExIFJtMSBSbjEgaW1tNCBSbjI7IHN3aHdfYWRkIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4MWIrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojpzd2h3X2FkZAotInN3aHdfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDAxMCAxMDExIFJtMSBSbjEgUm0yIFJuMjsgc3dod19zdWIgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDJiKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN3aHdfc3ViCi0ic3dod19zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAxMSAxMDExIFJtMSBSbjEgaW1tNCBSbjI7IHN3aHdfc3ViIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4M2IrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojpzd2h3X3N1YgotInN3aHdfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDEwMCAxMDExIFJtMSBSbjEgUm0yIFJuMjsgc3dod19jbXAgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDRiKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN3aHdfY21wCi0ic3dod19jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcyXSwgU3RhdGUucmVnc1tkc3RyZWcyXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLX0KLQotLy8gMTExMSAwMTExIDAxMDEgMTAxMSBSbTEgUm4xIGltbTQgUm4yOyBzd2h3X2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDViKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3dod19jbXAKLSJzd2h3X2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTQpLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9ICgoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpIDw8IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotfQotICAKLS8vIDExMTEgMDExMSAwMTEwIDEwMTEgUm0xIFJuMSBSbTIgUm4yOyBzd2h3X21vdiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NmIrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c3dod19tb3YKLSJzd2h3X21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9ICgoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpIDw8IDE2KQotICAgICAgICAgICAgICAgfCAoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAxMTEgMTAxMSBSbTEgUm4xIGltbTQgUm4yOyBzd2h3X21vdiBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDdiKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3dod19tb3YKLSJzd2h3X21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gKCgoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikgPDwgMTYpCi0gICAgICAgICAgICAgICB8ICgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAwMCAxMDExIFJtMSBSbjEgUm0yIFJuMjsgc3dod19hc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDhiKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN3aHdfYXNyCi0ic3dod19hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9ICgoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gJiAweGZmZmYpIDw8IDE2KQotICAgICAgICAgICAgICAgfCAoKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj4gMTYpICYgMHhmZmZmKSk7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDEwMTEgUm0xIFJuMSBpbW00IFJuMjsgc3dod19hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5Yis0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnN3aHdfYXNyCi0ic3dod19hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gKCgoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikgPDwgMTYpCi0gICAgICAgICAgICAgICB8ICgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMTAxMCAxMDExIFJtMSBSbjEgUm0yIFJuMjsgc3dod19sc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGFiKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnN3aHdfbHNyCi0ic3dod19sc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMTEgMTAxMSBSbTEgUm4xIGltbTQgUm4yOyBzd2h3X2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGJiKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c3dod19sc3IKLSJzd2h3X2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSAoKChTdGF0ZS5yZWdzW3NyY3JlZzFdICYgMHhmZmZmKSA8PCAxNikKLSAgICAgICAgICAgICAgIHwgKChTdGF0ZS5yZWdzW3NyY3JlZzFdID4+IDE2KSAmIDB4ZmZmZikpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0gIAotLy8gMTExMSAwMTExIDExMDAgMTAxMSBSbTEgUm4xIFJtMiBSbjI7IHN3aHdfYXNsIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhjYis0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojpzd2h3X2FzbAotInN3aHdfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gKCgoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikgPDwgMTYpCi0gICAgICAgICAgICAgICB8ICgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMTAxIDEwMTEgUm0xIFJuMSBpbW00IFJuMjsgc3dod19hc2wgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHhkYis0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnN3aHdfYXNsCi0ic3dod19hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gKCgoU3RhdGUucmVnc1tzcmNyZWcxXSAmIDB4ZmZmZikgPDwgMTYpCi0gICAgICAgICAgICAgICB8ICgoU3RhdGUucmVnc1tzcmNyZWcxXSA+PiAxNikgJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA8PD0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDAwIDExMDAgUm0xIFJuMSBSbTIgUm4yOyBvcl9hZGQgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDBjKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6Om9yX2FkZAotIm9yX2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdICs9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDAwMSAxMTAwIFJtMSBSbjEgaW1tNCBSbjI7IG9yX2FkZCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDFjKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6b3JfYWRkCi0ib3JfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW2RzdHJlZzFdIHwgU3RhdGUucmVnc1tzcmNyZWcxXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMTAgMTEwMCBSbTEgUm4xIFJtMiBSbjI7IG9yX3N1YiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MmMrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6b3Jfc3ViCi0ib3Jfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gLT0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMDExIDExMDAgUm0xIFJuMSBpbW00IFJuMjsgb3Jfc3ViIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4M2MrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojpvcl9zdWIKLSJvcl9zdWIiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIC09IEVYVEVORDQgKElNTTQpOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0vLyAxMTExIDAxMTEgMDEwMCAxMTAwIFJtMSBSbjEgUm0yIFJuMjsgb3JfY21wIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHg0Yys0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6Ojpvcl9jbXAKLSJvcl9jbXAiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoU3RhdGUucmVnc1tzcmNyZWcyXSwgU3RhdGUucmVnc1tkc3RyZWcyXSk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gfD0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLX0KLQotLy8gMTExMSAwMTExIDAxMDEgMTEwMCBSbTEgUm4xIGltbTQgUm4yOyBvcl9jbXAgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg1Yys0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6Om9yX2NtcAotIm9yX2NtcCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGdlbmVyaWNDbXAgKEVYVEVORDQgKElNTTQpLCBTdGF0ZS5yZWdzW2RzdHJlZzJdKTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSB8PSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotfQotICAKLS8vIDExMTEgMDExMSAwMTEwIDExMDAgUm0xIFJuMSBSbTIgUm4yOyBvcl9tb3YgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDZjKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6Om9yX21vdgotIm9yX21vdiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gU3RhdGUucmVnc1tzcmNyZWcyXTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAwMTExIDExMDAgUm0xIFJuMSBpbW00IFJuMjsgb3JfbW92IFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4N2MrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojpvcl9tb3YKLSJvcl9tb3YiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDAwIDExMDAgUm0xIFJuMSBSbTIgUm4yOyBvcl9hc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDhjKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6Om9yX2FzcgotIm9yX2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0KLS8vIDExMTEgMDExMSAxMDAxIDExMDAgUm0xIFJuMSBpbW00IFJuMjsgb3JfYXNyIFJtMSwgUm4xLCBpbW00LCBSbjIKLTguMHhmNys4LjB4OWMrNC5STTEsNC5STjErNC5JTU00LDQuUk4yIVJOMTpEMmI6Ojpvcl9hc3IKLSJvcl9hc3IiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0gIHNpZ25lZCBpbnQgdGVtcDsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW2RzdHJlZzJdOwotICB0ZW1wID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gdGVtcDsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDEwMTAgMTEwMCBSbTEgUm4xIFJtMiBSbjI7IG9yX2xzciBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4YWMrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6b3JfbHNyCi0ib3JfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMSAxMTAwIFJtMSBSbjEgaW1tNCBSbjI7IG9yX2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGJjKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6b3JfbHNyCi0ib3JfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID4+PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLSAgCi0gIAotLy8gMTExMSAwMTExIDExMDAgMTEwMCBSbTEgUm4xIFJtMiBSbjI7IG9yX2FzbCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4Y2MrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6b3JfYXNsCi0ib3JfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICByZXN1bHQxID0gU3RhdGUucmVnc1tkc3RyZWcxXSB8IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPDw9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTEwMSAxMTAwIFJtMSBSbjEgaW1tNCBSbjI7IG9yX2FzbCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGRjKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6b3JfYXNsCi0ib3JfYXNsIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgcmVzdWx0MSA9IFN0YXRlLnJlZ3NbZHN0cmVnMV0gfCBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDAgMTEwMSBSbTEgUm4xIFJtMiBSbjI7IHNhdDE2X2FkZCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MGQrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c2F0MTZfYWRkCi0ic2F0MTZfYWRkIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMDEgMTEwMSBSbTEgUm4xIGltbTQgUm4yOyBzYXQxNl9hZGQgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgxZCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnNhdDE2X2FkZAotInNhdDE2X2FkZCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSArPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAwMTAgMTEwMSBSbTEgUm4xIFJtMiBSbjI7IHNhdDE2X3N1YiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4MmQrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c2F0MTZfc3ViCi0ic2F0MTZfc3ViIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDAwMTEgMTEwMSBSbTEgUm4xIGltbTQgUm4yOyBzYXQxNl9zdWIgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHgzZCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnNhdDE2X3N1YgotInNhdDE2X3N1YiIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSAtPSBFWFRFTkQ0IChJTU00KTsKLSAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IHJlc3VsdDE7Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMDAgMTEwMSBSbTEgUm4xIFJtMiBSbjI7IHNhdDE2X2NtcCBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NGQrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c2F0MTZfY21wCi0ic2F0MTZfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLSAgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj0gMHg3ZmZmKQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSAweDdmZmY7Ci0gIGVsc2UgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPD0gMHhmZmZmODAwMCkKLSAgICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gMHhmZmZmODAwMDsKLSAgZWxzZQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotfQotCi0vLyAxMTExIDAxMTEgMDEwMSAxMTAxIFJtMSBSbjEgaW1tNCBSbjI7IHNhdDE2X2NtcCBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDVkKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c2F0MTZfY21wCi0ic2F0MTZfY21wIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgZ2VuZXJpY0NtcCAoRVhURU5ENCAoSU1NNCksIFN0YXRlLnJlZ3NbZHN0cmVnMl0pOwotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgU3RhdGUucmVnc1tkc3RyZWcxXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci19Ci0gIAotLy8gMTExMSAwMTExIDAxMTAgMTEwMSBSbTEgUm4xIFJtMiBSbjI7IHNhdDE2X21vdiBSbTEsIFJuMSwgUm0yLCBSbjIKLTguMHhmNys4LjB4NmQrNC5STTEsNC5STjErNC5STTIsNC5STjIhUk4xOkQyOjo6c2F0MTZfbW92Ci0ic2F0MTZfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIHNyY3JlZzIsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMDExMSAxMTAxIFJtMSBSbjEgaW1tNCBSbjI7IHNhdDE2X21vdiBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weDdkKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c2F0MTZfbW92Ci0ic2F0MTZfbW92IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdID49IDB4N2ZmZikKLSAgICByZXN1bHQxID0gMHg3ZmZmOwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdIDw9IDB4ZmZmZjgwMDApCi0gICAgcmVzdWx0MSA9IDB4ZmZmZjgwMDA7Ci0gIGVsc2UKLSAgICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdID0gRVhURU5ENCAoSU1NNCk7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDAwIDExMDEgUm0xIFJuMSBSbTIgUm4yOyBzYXQxNl9hc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weDhkKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnNhdDE2X2FzcgotInNhdDE2X2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgc3JjcmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMik7Ci0gIGRzdHJlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjEpOwotICBkc3RyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4yKTsKLQotICBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA+PSAweDdmZmYpCi0gICAgcmVzdWx0MSA9IDB4N2ZmZjsKLSAgZWxzZSBpZiAoU3RhdGUucmVnc1tzcmNyZWcxXSA8PSAweGZmZmY4MDAwKQotICAgIHJlc3VsdDEgPSAweGZmZmY4MDAwOwotICBlbHNlCi0gICAgcmVzdWx0MSA9IFN0YXRlLnJlZ3Nbc3JjcmVnMV07Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbZHN0cmVnMl07Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPSB0ZW1wOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDEwMDEgMTEwMSBSbTEgUm4xIGltbTQgUm4yOyBzYXQxNl9hc3IgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHg5ZCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnNhdDE2X2FzcgotInNhdDE2X2FzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdID49IDB4N2ZmZikKLSAgICByZXN1bHQxID0gMHg3ZmZmOwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdIDw9IDB4ZmZmZjgwMDApCi0gICAgcmVzdWx0MSA9IDB4ZmZmZjgwMDA7Ci0gIGVsc2UKLSAgICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tkc3RyZWcyXTsKLSAgdGVtcCA+Pj0gSU1NNDsKLSAgU3RhdGUucmVnc1tkc3RyZWcyXSA9IHRlbXA7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLS8vIDExMTEgMDExMSAxMDEwIDExMDEgUm0xIFJuMSBSbTIgUm4yOyBzYXQxNl9sc3IgUm0xLCBSbjEsIFJtMiwgUm4yCi04LjB4ZjcrOC4weGFkKzQuUk0xLDQuUk4xKzQuUk0yLDQuUk4yIVJOMTpEMjo6OnNhdDE2X2xzcgotInNhdDE2X2xzciIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBzcmNyZWcyLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNMSk7Ci0gIHNyY3JlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTIpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj0gMHg3ZmZmKQotICAgIHJlc3VsdDEgPSAweDdmZmY7Ci0gIGVsc2UgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPD0gMHhmZmZmODAwMCkKLSAgICByZXN1bHQxID0gMHhmZmZmODAwMDsKLSAgZWxzZQotICAgIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IFN0YXRlLnJlZ3Nbc3JjcmVnMl07Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTAxMSAxMTAxIFJtMSBSbjEgaW1tNCBSbjI7IHNhdDE2X2xzciBSbTEsIFJuMSwgaW1tNCwgUm4yCi04LjB4ZjcrOC4weGJkKzQuUk0xLDQuUk4xKzQuSU1NNCw0LlJOMiFSTjE6RDJiOjo6c2F0MTZfbHNyCi0ic2F0MTZfbHNyIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZzEsIGRzdHJlZzEsIGRzdHJlZzI7Ci0gIGludCByZXN1bHQxOwotICBzaWduZWQgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBkc3RyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4xKTsKLSAgZHN0cmVnMiA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMik7Ci0KLSAgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPj0gMHg3ZmZmKQotICAgIHJlc3VsdDEgPSAweDdmZmY7Ci0gIGVsc2UgaWYgKFN0YXRlLnJlZ3Nbc3JjcmVnMV0gPD0gMHhmZmZmODAwMCkKLSAgICByZXN1bHQxID0gMHhmZmZmODAwMDsKLSAgZWxzZQotICAgIHJlc3VsdDEgPSBTdGF0ZS5yZWdzW3NyY3JlZzFdOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnMl0gPj49IElNTTQ7Ci0gIFN0YXRlLnJlZ3NbZHN0cmVnMV0gPSByZXN1bHQxOwotfQotICAKLSAgCi0vLyAxMTExIDAxMTEgMTEwMCAxMTAxIFJtMSBSbjEgUm0yIFJuMjsgc2F0MTZfYXNsIFJtMSwgUm4xLCBSbTIsIFJuMgotOC4weGY3KzguMHhjZCs0LlJNMSw0LlJOMSs0LlJNMiw0LlJOMiFSTjE6RDI6OjpzYXQxNl9hc2wKLSJzYXQxNl9hc2wiCi0qYW0zMwotewotICBpbnQgc3JjcmVnMSwgc3JjcmVnMiwgZHN0cmVnMSwgZHN0cmVnMjsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZzEgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTTEpOwotICBzcmNyZWcyID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0yKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdID49IDB4N2ZmZikKLSAgICByZXN1bHQxID0gMHg3ZmZmOwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdIDw9IDB4ZmZmZjgwMDApCi0gICAgcmVzdWx0MSA9IDB4ZmZmZjgwMDA7Ci0gIGVsc2UKLSAgICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBTdGF0ZS5yZWdzW3NyY3JlZzJdOwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDExMDEgMTEwMSBSbTEgUm4xIGltbTQgUm4yOyBzYXQxNl9hc2wgUm0xLCBSbjEsIGltbTQsIFJuMgotOC4weGY3KzguMHhkZCs0LlJNMSw0LlJOMSs0LklNTTQsNC5STjIhUk4xOkQyYjo6OnNhdDE2X2FzbAotInNhdDE2X2FzbCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcxLCBkc3RyZWcxLCBkc3RyZWcyOwotICBpbnQgcmVzdWx0MTsKLSAgc2lnbmVkIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcxID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0xKTsKLSAgZHN0cmVnMSA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOMSk7Ci0gIGRzdHJlZzIgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTjIpOwotCi0gIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdID49IDB4N2ZmZikKLSAgICByZXN1bHQxID0gMHg3ZmZmOwotICBlbHNlIGlmIChTdGF0ZS5yZWdzW3NyY3JlZzFdIDw9IDB4ZmZmZjgwMDApCi0gICAgcmVzdWx0MSA9IDB4ZmZmZjgwMDA7Ci0gIGVsc2UKLSAgICByZXN1bHQxID0gU3RhdGUucmVnc1tzcmNyZWcxXTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZzJdIDw8PSBJTU00OwotICBTdGF0ZS5yZWdzW2RzdHJlZzFdID0gcmVzdWx0MTsKLX0KLQotLy8gMTExMSAwMTExIDExMTAgMDAwMCBSbTEgUm4xIGltbTQgMDAwMDsgbW92X2xsdCAoUm0rLGltbTQpLFJuCi04LjB4ZjcrOC4weGUwKzQuUk4sNC5STSFSTis0LklNTTQsNC4weDA6RDI6Ojptb3ZfbGx0Ci0ibW92X2xsdCIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLSAgaW50IHJlc3VsdDE7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4pOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDQgKElNTTQpOwotCi0gIGlmICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSByZXN1bHQxOwotfQotCi0vLyAxMTExIDAxMTEgMTExMCAwMDAwIFJtMSBSbjEgaW1tNCAwMDAxOyBtb3ZfbGd0IChSbSssaW1tNCksUm4KLTguMHhmNys4LjB4ZTArNC5STiw0LlJNIVJOKzQuSU1NNCw0LjB4MTpEMjo6Om1vdl9sZ3QKLSJtb3ZfbGd0IgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTSk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ0IChJTU00KTsKLQotICBpZiAoISgoUFNXICYgUFNXX1opCi0gICAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMDExMSAxMTEwIDAwMDAgUm0xIFJuMSBpbW00IDAwMTA7IG1vdl9sZ2UgKFJtKyxpbW00KSxSbgotOC4weGY3KzguMHhlMCs0LlJOLDQuUk0hUk4rNC5JTU00LDQuMHgyOkQyOjo6bW92X2xnZQotIm1vdl9sZ2UiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4pOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDQgKElNTTQpOwotCi0gIGlmICghKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0vLyAxMTExIDAxMTEgMTExMCAwMDAwIFJtMSBSbjEgaW1tNCAwMDExOyBtb3ZfbGxlIChSbSssaW1tNCksUm4KLTguMHhmNys4LjB4ZTArNC5STiw0LlJNIVJOKzQuSU1NNCw0LjB4MzpEMjo6Om1vdl9sbGUKLSJtb3ZfbGxlIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTSk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ0IChJTU00KTsKLQotICBpZiAoKFBTVyAmIFBTV19aKQotICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0vLyAxMTExIDAxMTEgMTExMCAwMDAwIFJtMSBSbjEgaW1tNCAwMTAwOyBtb3ZfbGNzIChSbSssaW1tNCksUm4KLTguMHhmNys4LjB4ZTArNC5STiw0LlJNIVJOKzQuSU1NNCw0LjB4NDpEMjo6Om1vdl9sY3MKLSJtb3ZfbGNzIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTSk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ0IChJTU00KTsKLQotICBpZiAoUFNXICYgUFNXX0MpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMDExMSAxMTEwIDAwMDAgUm0xIFJuMSBpbW00IDAxMDE7IG1vdl9saGkgKFJtKyxpbW00KSxSbgotOC4weGY3KzguMHhlMCs0LlJOLDQuUk0hUk4rNC5JTU00LDQuMHg1OkQyOjo6bW92X2xoaQotIm1vdl9saGkiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4pOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDQgKElNTTQpOwotCi0gIGlmICghKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMDExMSAxMTEwIDAwMDAgUm0xIFJuMSBpbW00IDAxMTA7IG1vdl9sY2MgKFJtKyxpbW00KSxSbgotOC4weGY3KzguMHhlMCs0LlJOLDQuUk0hUk4rNC5JTU00LDQuMHg2OkQyOjo6bW92X2xjYwotIm1vdl9sY2MiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4pOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDQgKElNTTQpOwotCi0gIGlmICghKFBTVyAmIFBTV19DKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotLy8gMTExMSAwMTExIDExMTAgMDAwMCBSbTEgUm4xIGltbTQgMDExMTsgbW92X2xscyAoUm0rLGltbTQpLFJuCi04LjB4ZjcrOC4weGUwKzQuUk4sNC5STSFSTis0LklNTTQsNC4weDc6RDI6Ojptb3ZfbGxzCi0ibW92X2xscyIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0pOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTik7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW3NyY3JlZ10gKz0gRVhURU5ENCAoSU1NNCk7Ci0KLSAgaWYgKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotLy8gMTExMSAwMTExIDExMTAgMDAwMCBSbTEgUm4xIGltbTQgMTAwMDsgbW92X2xlcSAoUm0rLGltbTQpLFJuCi04LjB4ZjcrOC4weGUwKzQuUk4sNC5STSFSTis0LklNTTQsNC4weDg6RDI6Ojptb3ZfbGVxCi0ibW92X2xlcSIKLSphbTMzCi17Ci0gIGludCBzcmNyZWcsIGRzdHJlZzsKLQotICBQQyA9IGNpYTsKLSAgc3JjcmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk0pOwotICBkc3RyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTik7Ci0KLSAgU3RhdGUucmVnc1tkc3RyZWddID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW3NyY3JlZ10pOwotICBTdGF0ZS5yZWdzW3NyY3JlZ10gKz0gRVhURU5ENCAoSU1NNCk7Ci0KLSAgaWYgKFBTVyAmIFBTV19aKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0vLyAxMTExIDAxMTEgMTExMCAwMDAwIFJtMSBSbjEgaW1tNCAxMDAxOyBtb3ZfbG5lIChSbSssaW1tNCksUm4KLTguMHhmNys4LjB4ZTArNC5STiw0LlJNIVJOKzQuSU1NNCw0LjB4OTpEMjo6Om1vdl9sbmUKLSJtb3ZfbG5lIgotKmFtMzMKLXsKLSAgaW50IHNyY3JlZywgZHN0cmVnOwotCi0gIFBDID0gY2lhOwotICBzcmNyZWcgPSB0cmFuc2xhdGVfcnJlZyAoU0RfLCBSTSk7Ci0gIGRzdHJlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJOKTsKLQotICBTdGF0ZS5yZWdzW2RzdHJlZ10gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3Nbc3JjcmVnXSk7Ci0gIFN0YXRlLnJlZ3Nbc3JjcmVnXSArPSBFWFRFTkQ0IChJTU00KTsKLQotICBpZiAoIShQU1cgJiBQU1dfWikpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLS8vIDExMTEgMDExMSAxMTEwIDAwMDAgUm0xIFJuMSBpbW00IDEwMTA7IG1vdl9scmEgKFJtKyxpbW00KSxSbgotOC4weGY3KzguMHhlMCs0LlJOLDQuUk0hUk4rNC5JTU00LDQuMHhhOkQyOjo6bW92X2xyYQotIm1vdl9scmEiCi0qYW0zMwotewotICBpbnQgc3JjcmVnLCBkc3RyZWc7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNyY3JlZyA9IHRyYW5zbGF0ZV9ycmVnIChTRF8sIFJNKTsKLSAgZHN0cmVnID0gdHJhbnNsYXRlX3JyZWcgKFNEXywgUk4pOwotCi0gIFN0YXRlLnJlZ3NbZHN0cmVnXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tzcmNyZWddKTsKLSAgU3RhdGUucmVnc1tzcmNyZWddICs9IEVYVEVORDQgKElNTTQpOwotCi0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICBuaWEgPSBQQzsKLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvY29uZmlnLmluIGIvc2ltL21uMTAzMDAvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDljYTljLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMzAwL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gICBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAgKi8KLSN1bmRlZiBXT1JEU19CSUdFTkRJQU4KLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fU0VURlBVQ1cKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjaG1vZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DSE1PRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNob3duIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NIT1dOCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGV4ZWN2IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0VYRUNWCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZXhlY3ZlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0VYRUNWRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZvcmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRk9SSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdXRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVVRJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmcHVfY29udHJvbC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GUFVfQ09OVFJPTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHV0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VUSU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9jb25maWd1cmUgYi9zaW0vbW4xMDMwMC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYzZkZTQuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDU0MiArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYml0c2l6ZT1OCQlTcGVjaWZ5IHRhcmdldCBiaXRzaXplICgzMiBvciA2NCkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9TElTVAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1jb21tb24JCQlFbmFibGUgY29tbW9uIHNpbXVsYXRvciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Nzc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODI1OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkzNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5ODM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwNDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNDQ6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3NzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTEyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0NTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTUwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjEwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzU3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzOTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MTA6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDM6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjI6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc2MTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTYwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2NTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTkzOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM1MTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzcwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzODA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzk3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyNTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDYwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUzNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTg5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYyNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODU3OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODg1OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk2NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDA0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA0NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEyMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTc4OiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjU6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MjA6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjQ6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi0KLXdpcmVfZW5kaWFuPSJMSVRUTEVfRU5ESUFOIgotZGVmYXVsdF9lbmRpYW49IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0tZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSBlbHNlCi0gICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JIGVsc2UKLQkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLSAgZWxzZQotICAgIHNpbV9lbmRpYW49Ci0gIGZpCi1maQotZmkKLQotd2lyZV9hbGlnbm1lbnQ9Ik5PTlNUUklDVF9BTElHTk1FTlQiCi1kZWZhdWx0X2FsaWdubWVudD0iIgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7Ci0gIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLQkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyNTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY0MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgotICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7Ci0gICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7Ci0gICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCi1maQotV0FSTl9DRkxBR1M9IiIKLVdFUlJPUl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotdGhlbgotICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKLSAgIyBjb21waWxlZCB3aXRoIGl0IGVuYWJsZWQuCi0gIGZvciB3IGluICR7YnVpbGRfd2FybmluZ3N9OyBkbwotICAgIGNhc2UgJHcgaW4KLSAgICAtV2VyciopIFdFUlJPUl9DRkxBR1M9LVdlcnJvciA7OwotICAgICopIFdBUk5fQ0ZMQUdTPSIke1dBUk5fQ0ZMQUdTfSAkdyIKLSAgICBlc2FjCi0gIGRvbmUKLWZpCi1lbHNlCi0gIGJ1aWxkX3dhcm5pbmdzPSIiCi1maQotCi0KLWRlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHM9IjEiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMgb3IgLS1kaXNhYmxlLXNpbS1yZXNlcnZlZC1iaXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9yZXNlcnZlZF9iaXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0xIjs7Ci0gIG5vKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZXNlcnZlZF9iaXRzPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVzZXJ2ZWRfYml0cyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcmVzZXJ2ZWQgZmxhZ3MgPSAkc2ltX3Jlc2VydmVkX2JpdHMiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0ke2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHN9IgotZmkKLQotd2lyZV93b3JkX2JpdHNpemU9IjMyIgotd2lyZV93b3JkX21zYj0iMzEiCi13aXJlX2FkZHJlc3NfYml0c2l6ZT0iIgotd2lyZV9jZWxsX2JpdHNpemU9IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYml0c2l6ZSBvciAtLWRpc2FibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2JpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9iaXRzaXplIgotICBzaW1fYml0c2l6ZT0KLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgNjQsNjMgfCA2NCw2MywqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiOzsKLSAgMzIsMzEgfCAzMiwzMSwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MzEiOzsKLSAgNjQsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKLSAgMzIsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKLSAgMzIpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgotICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSIKLSAgICAgIGVsc2UKLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKLSAgICAgIGZpIDs7Ci0gIDY0KSBpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHggLWEgeCIkd2lyZV93b3JkX21zYiIgIT0geDA7IHRoZW4KLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiCi0gICAgICBlbHNlCi0gICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiCi0gICAgICBmaSA7OwotICAqKSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotIyBhZGRyZXNzIGJpdHNpemUKLXRtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05XSosKi8vImAKLWNhc2UgeCIke3RtcH0iIGluCi0gIHggKSA7OwotICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0zMiIgOzsKLSAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9NjQiIDs7Ci0gICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gYWRkcmVzcyBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotIyBjZWxsIGJpdHNpemUKLXRtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05Kl0qLCpbMC05XSosKi8vImAKLWNhc2UgeCIke3RtcH0iIGluCi0gIHggKSA7OwotICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT0zMiIgOzsKLSAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9NjQiIDs7Ci0gICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gY2VsbCBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCi1maQotZWxzZQotICBzaW1fYml0c2l6ZT0iIgotaWYgdGVzdCB4IiR3aXJlX3dvcmRfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSR3aXJlX3dvcmRfYml0c2l6ZSIKLWZpCi1pZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPSR3aXJlX3dvcmRfbXNiIgotZmkKLWlmIHRlc3QgeCIkd2lyZV9hZGRyZXNzX2JpdHNpemUiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0kd2lyZV9hZGRyZXNzX2JpdHNpemUiCi1maQotaWYgdGVzdCB4IiR3aXJlX2NlbGxfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPSR3aXJlX2NlbGxfYml0c2l6ZSIKLWZpCi1maQotCi0KLWRlZmF1bHRfc2ltX2lubGluZT0iIgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pbmxpbmUgb3IgLS1kaXNhYmxlLXNpbS1pbmxpbmUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2lubGluZSIKLSAgc2ltX2lubGluZT0iIgotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLSAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKLSAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9DX0lOTElORSI7OwotICAxKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1JTkxJTkVfTE9DQUxTIjs7Ci0gICopIGZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotICAgICAgIG5ld19mbGFnPSIiCi0gICAgICAgY2FzZSAiJHgiIGluCi0JICpfSU5MSU5FPSopCW5ld19mbGFnPSItRCR4Ijs7Ci0JICo9KikJCW5ld19mbGFnPWBlY2hvICIkeCIgfCBzZWQgLWUgInMvPS9fSU5MSU5FPS8iIC1lICJzL14vLUQvImA7OwotCSAqX0lOTElORSkJbmV3X2ZsYWc9Ii1EJHg9QUxMX0NfSU5MSU5FIjs7Ci0JICopCQluZXdfZmxhZz0iLUQkeCIiX0lOTElORT1BTExfQ19JTkxJTkUiOzsKLSAgICAgICBlc2FjCi0gICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgotCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCi0gICAgICAgZWxzZQotCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCi0gICAgICAgZmkKLSAgICAgZG9uZTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgaWYgdGVzdCB4IiRHQ0MiICE9ICJ4IiAtYSB4IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIgIT0gIngiIDsgdGhlbgotICAgIHNpbV9pbmxpbmU9IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIKLSAgICBpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCi0gICAgZmkKLSAgZWxzZQotICAgIHNpbV9pbmxpbmU9IiIKLSAgZmkKLWVsc2UKLSAgc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotZmkKLWZpCi0KLQotaWYgdGVzdCB4InllcyIgPSB4InllcyI7IHRoZW4KLSAgc2ltX2h3X3A9eWVzCi1lbHNlCi0gIHNpbV9od19wPW5vCi1maQotaWYgdGVzdCAiIjsgdGhlbgotICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSIKLWVsc2UKLSAgaGFyZHdhcmU9ImNvcmUgcGFsIGdsdWUgbW4xMDNjcHUgbW4xMDNpbnQgbW4xMDN0aW0gbW4xMDNzZXIgbW4xMDNpb3AiCi1maQotc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTEiCi1zaW1faHc9IiRoYXJkd2FyZSIKLXNpbV9od19vYmpzPSJcJChTSU1fQ09NTU9OX0hXX09CSlMpIGBlY2hvICRzaW1faHcgfCBzZWQgLWUgJ3MvXChbXiBdW14gXSpcKS9kdi1cMS5vL2cnYCIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taGFyZHdhcmUgb3IgLS1kaXNhYmxlLXNpbS1oYXJkd2FyZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faGFyZHdhcmUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9oYXJkd2FyZSIKLSAgCi1jYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2h3X3A9eWVzOzsKLSAgbm8pCXNpbV9od19wPW5vOzsKLSAgLCopICAgc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iJHtoYXJkd2FyZX0gYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCI7OwotICAqLCkgICBzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSJgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgICR7aGFyZHdhcmV9Ijs7Ci0gICopCXNpbV9od19wPXllczsgaGFyZHdhcmU9ImBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AiJyc7OwotZXNhYwotaWYgdGVzdCAiJHNpbV9od19wIiAhPSB5ZXM7IHRoZW4KLSAgc2ltX2h3X29ianM9Ci0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0wIgotICBzaW1faHc9Ci1lbHNlCi0gIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgotICAjIHJlbW92ZSBkdXBsaWNhdGVzCi0gIHNpbV9odz0iIgotICBzaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSIKLSAgZm9yIGkgaW4geCAkaGFyZHdhcmUgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgICB4KSA7OwotICAgICAgKiIgJGkgIiopIDs7Ci0gICAgICAqKSBzaW1faHc9IiRzaW1faHcgJGkiIDsgc2ltX2h3X29ianM9IiRzaW1faHdfb2JqcyBkdi0kaS5vIjs7Ci0gICAgZXNhYwotICBkb25lCi1maQotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0ICIkc2ltX2h3X3AiID0gInllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgotZmkKLWVsc2UKLSAgCi1pZiB0ZXN0ICIkc2ltX2h3X3AiICE9IHllczsgdGhlbgotICBzaW1faHdfb2Jqcz0KLSAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTAiCi0gIHNpbV9odz0KLWZpCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKLWZpCi1maQotCi0KLWZvciBhY19mdW5jIGluIHRpbWUgY2htb2QgdXRpbWUgZm9yayBleGVjdmUgZXhlY3YgY2hvd24KLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NDE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdXRpbWUuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTk3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAwNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIwotIyBFbmFibGUgY29tbW9uCi0jCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNvbW1vbiBvciAtLWRpc2FibGUtc2ltLWNvbW1vbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY29tbW9uK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY29tbW9uIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgc2ltX2dlbj0iLURXSVRIX0NPTU1PTj0xIjsgbW4xMDMwMF9jb21tb249IldJVEgiOzsKLSAgbm8pICBzaW1fZ2VuPSItRFdJVEhfQ09NTU9OPTAiOyBtbjEwMzAwX2NvbW1vbj0iV0lUSE9VVCI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWNvbW1vbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2dlbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2dlbiIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltX2NvbW1vbiA9ICRzaW1fY29tbW9uIiA2PiYxCi1maQotZWxzZQotICBzaW1fZ2VuPSItRFdJVEhfQ09NTU9OPTEiOyBtbjEwMzAwX2NvbW1vbj0iV0lUSCIKLWZpCi0KLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKLXMlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKLXMlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCi1zJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZwotcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKLXMlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQHNpbV9nZW5AJSRzaW1fZ2VuJWcKLXMlQG1uMTAzMDBfY29tbW9uQCUkbW4xMDMwMF9jb21tb24lZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLWFjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKLWFjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKLXdoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KLSAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCi0gIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgotCi0gIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgotCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiAkYWNfZGVzdAotCi0gICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gIGVzYWMKLQotICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgotICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAotICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZG9uZQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSB4TWFrZWZpbGUqKQotICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgotICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAotICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAotCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKLQk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQotICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCi0gICA7OwotIGVzYWMKLSBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCi0KZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL2NvbmZpZ3VyZS5pbiBiL3NpbS9tbjEwMzAwL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2MDYwOS4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDMwMC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLXNpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQotZG5sIDIuMTIgYm90Y2hlcyBTSEVMTCBzdWJzdGl0dXRpb24KLUFDX1BSRVJFUSgyLjEyLjEpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLVNJTV9BQ19PUFRJT05fRU5ESUFOKExJVFRMRV9FTkRJQU4pCi1TSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQotU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCi1TSU1fQUNfT1BUSU9OX1dBUk5JTkdTCi1TSU1fQUNfT1BUSU9OX1JFU0VSVkVEX0JJVFMKLVNJTV9BQ19PUFRJT05fQklUU0laRSgzMiwzMSkKLVNJTV9BQ19PUFRJT05fSU5MSU5FKCkKLVNJTV9BQ19PUFRJT05fSEFSRFdBUkUoeWVzLCxtbjEwM2NwdSBtbjEwM2ludCBtbjEwM3RpbSBtbjEwM3NlciBtbjEwM2lvcCkKLQotQUNfQ0hFQ0tfRlVOQ1ModGltZSBjaG1vZCB1dGltZSBmb3JrIGV4ZWN2ZSBleGVjdiBjaG93bikKLUFDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHV0aW1lLmggdGltZS5oKQotCi0jCi0jIEVuYWJsZSBjb21tb24KLSMKLUFDX0FSR19FTkFCTEUoc2ltLWNvbW1vbiwKLVsgIC0tZW5hYmxlLXNpbS1jb21tb24JCQlFbmFibGUgY29tbW9uIHNpbXVsYXRvcl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9nZW49Ii1EV0lUSF9DT01NT049MSI7IG1uMTAzMDBfY29tbW9uPSJXSVRIIjs7Ci0gIG5vKSAgc2ltX2dlbj0iLURXSVRIX0NPTU1PTj0wIjsgbW4xMDMwMF9jb21tb249IldJVEhPVVQiOzsKLSAgKikgICBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWNvbW1vbiIpOyBzaW1fZ2VuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZ2VuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW1fY29tbW9uID0gJHNpbV9jb21tb24iIDY+JjEKLWZpXSxbc2ltX2dlbj0iLURXSVRIX0NPTU1PTj0xIjsgbW4xMDMwMF9jb21tb249IldJVEgiXSlkbmwKLUFDX1NVQlNUKHNpbV9nZW4pCi1BQ19TVUJTVChtbjEwMzAwX2NvbW1vbikKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZHYtbW4xMDNjcHUuYyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjQ1YTIuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvZHYtbW4xMDNjcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImh3LW1haW4uaCIKLQotLyogREVWSUNFCi0KLSAgIAotICAgbW4xMDNjcHUgLSBtbjEwMzAwIGNwdSB2aXJ0dWFsIGRldmljZQotCi0gICAKLSAgIERFU0NSSVBUSU9OCi0KLSAgIAotICAgSW1wbGVtZW50cyB0aGUgZXh0ZXJuYWwgbW4xMDMwMCBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpbmNsdWRlcyB0aGUKLSAgIGRlbGl2ZXJ5IG9mIGludGVycnVwdHMgZ2VuZXJhdGVkIGZyb20gb3RoZXIgZGV2aWNlcyBhbmQgdGhlCi0gICBoYW5kbGluZyBvZiBkZXZpY2Ugc3BlY2lmaWMgcmVnaXN0ZXJzLgotCi0KLSAgIFBST1BFUlRJRVMKLSAgIAotCi0gICByZWcgPSA8YWRkcmVzcz4gPHNpemU+Ci0KLSAgIFNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgdGhlIG1uMTAzMDAncyBjb250cm9sIHJlZ2lzdGVyIGJsb2NrLiAgVGhpcwotICAgYmxvY2sgY29udGFpbnMgdGhlIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXJzLgotCi0gICBUaGUgcmVnIHByb3BlcnR5IHZhbHVlIGAweDIwMDAwMDAwIDB4NDInIGxvY2F0ZXMgdGhlIHJlZ2lzdGVyIGJsb2NrCi0gICBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIG1uMTAzMDAgdXNlciBndWlkZS4KLQotCi0gICBQT1JUUwotCi0KLSAgIHJlc2V0IChpbnB1dCkKLQotICAgQ3VycmVudGx5IGlnbm9yZWQuCi0KLQotICAgbm1pIChpbnB1dCkKLQotICAgRGVsaXZlciBhIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQgdG8gdGhlIHByb2Nlc3Nvci4KLQotCi0gICBsZXZlbCAoaW5wdXQpCi0KLSAgIE1hc2thYmxlIGludGVycnVwdCBsZXZlbCBwb3J0IHBvcnQuICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAgIG5vdGlmaWVzIHRoZSBwcm9jZXNzb3Igb2YgYW55IGNoYW5nZSBpbiB0aGUgbGV2ZWwgb2YgcGVuZGluZwotICAgcmVxdWVzdGVkIGludGVycnVwdHMgdmlhIHRoaXMgcG9ydC4KLQotCi0gICBhY2sgKG91dHB1dCkKLQotICAgT3V0cHV0IHNpZ25hbCBpbmRpY2F0aW5nIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBkZWxpdmVyaW5nIGEgbGV2ZWwKLSAgIGludGVycnVwdC4gIFRoZSB2YWx1ZSBwYXNzZWQgd2l0aCB0aGUgZXZlbnQgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotICAgdGhlIGludGVycnVwdCBiZWluZyBkZWxpdmVyZWQuCi0KLQotICAgQlVHUwotCi0KLSAgIFdoZW4gZGVsaXZlcmluZyBhbiBpbnRlcnJ1cHQsIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seQotICAgb25lIHByb2Nlc3NvciAobnVtYmVyIDApLgotCi0gICBUaGlzIGNvZGUgZG9lcyBub3QgYXR0ZW1wdCB0byBiZSBlZmZpY2llbnQgYXQgaGFuZGxpbmcgcGVuZGluZwotICAgaW50ZXJydXB0cy4gIEl0IHNpbXBseSBzY2hlZHVsZXMgdGhlIGludGVycnVwdCBkZWxpdmVyeSBoYW5kbGVyCi0gICBldmVyeSBpbnN0cnVjdGlvbiBjeWNsZSB1bnRpbCBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzIGdvIGF3YXkuICBBbgotICAgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbWlnaHQgbW9kaWZ5IGluc3RydWN0aW9ucyB0aGF0IGNoYW5nZQotICAgdGhlIFBTVyBhbmQgaGF2ZSB0aGVtIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbmdlIG1ha2VzIGFuIGludGVycnVwdAotICAgZGVsaXZlcnkgcG9zc2libGUuCi0KLSAgICovCi0KLQotLyogVGhlIGludGVycnVwdCB2ZWN0b3JzICovCi0KLWVudW0geyBOUl9WRUNUT1JTID0gNywgfTsKLQotCi0vKiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgYWRkcmVzcyBibG9ja3MgKi8KLQotc3RydWN0IG1uMTAzY3B1X2Jsb2NrIHsKLSAgdW5zaWduZWRfd29yZCBiYXNlOwotICB1bnNpZ25lZF93b3JkIGJvdW5kOwotfTsKLQotCi1zdHJ1Y3QgbW4xMDNjcHUgewotICBzdHJ1Y3QgbW4xMDNjcHVfYmxvY2sgYmxvY2s7Ci0gIHN0cnVjdCBod19ldmVudCAqcGVuZGluZ19oYW5kbGVyOwotICBpbnQgcGVuZGluZ19sZXZlbDsKLSAgaW50IHBlbmRpbmdfbm1pOwotICBpbnQgcGVuZGluZ19yZXNldDsKLSAgLyogdGhlIHZpc2libGUgcmVnaXN0ZXJzICovCi0gIHVuc2lnbmVkMTYgaW50ZXJydXB0X3ZlY3RvcltOUl9WRUNUT1JTXTsKLSAgdW5zaWduZWQxNiBpbnRlcm5hbF9tZW1vcnlfY29udHJvbDsKLSAgdW5zaWduZWQxNiBjcHVfbW9kZTsKLX07Ci0KLQotCi0vKiBpbnB1dCBwb3J0IElEJ3MgKi8gCi0KLWVudW0gewotICBSRVNFVF9QT1JULAotICBOTUlfUE9SVCwKLSAgTEVWRUxfUE9SVCwKLX07Ci0KLQotLyogb3V0cHV0IHBvcnQgSUQncyAqLwotCi1lbnVtIHsKLSAgQUNLX1BPUlQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBtbjEwM2NwdV9wb3J0c1tdID0gewotCi0gIC8qIGludGVycnVwdCBpbnB1dHMgKi8KLSAgeyAicmVzZXQiLCBSRVNFVF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJubWkiLCBOTUlfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAibGV2ZWwiLCBMRVZFTF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotCi0gIC8qIGludGVycnVwdCBhY2sgKGxhdGNoKSBvdXRwdXQgZnJvbSBjcHUgKi8KLSAgeyAiYWNrIiwgQUNLX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAotCi0gIHsgTlVMTCwgfSwKLX07Ci0KLQotLyogRmluaXNoIG9mZiB0aGUgcGFydGlhbGx5IGNyZWF0ZWQgaHcgZGV2aWNlLiAgQXR0YWNoIG91ciBsb2NhbAotICAgY2FsbGJhY2tzLiAgV2lyZSB1cCBvdXIgcG9ydCBuYW1lcyBldGMgKi8KLQotc3RhdGljIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCBtbjEwM2NwdV9pb19yZWFkX2J1ZmZlcjsKLXN0YXRpYyBod19pb193cml0ZV9idWZmZXJfbWV0aG9kIG1uMTAzY3B1X2lvX3dyaXRlX2J1ZmZlcjsKLXN0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCBtbjEwM2NwdV9wb3J0X2V2ZW50OwotCi1zdGF0aWMgdm9pZAotYXR0YWNoX21uMTAzY3B1X3JlZ3MgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgIHN0cnVjdCBtbjEwM2NwdSAqY29udHJvbGxlcikKLXsKLSAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKLSAgaW50IGF0dGFjaF9zcGFjZTsKLSAgdW5zaWduZWQgYXR0YWNoX3NpemU7Ci0gIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLSAgaWYgKCFod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCAwLCAmcmVnKSkKLSAgICBod19hYm9ydCAobWUsICJcInJlZ1wiIHByb3BlcnR5IG11c3QgY29udGFpbiB0aHJlZSBhZGRyL3NpemUgZW50cmllcyIpOwotICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCSAgICAgJnJlZy5hZGRyZXNzLAotCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwKLQkJCQkgICAgICZhdHRhY2hfYWRkcmVzcywKLQkJCQkgICAgIG1lKTsKLSAgY29udHJvbGxlci0+YmxvY2suYmFzZSA9IGF0dGFjaF9hZGRyZXNzOwotICBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAotCQkJICAgICAgICZyZWcuc2l6ZSwKLQkJCSAgICAgICAmYXR0YWNoX3NpemUsIG1lKTsKLSAgY29udHJvbGxlci0+YmxvY2suYm91bmQgPSBhdHRhY2hfYWRkcmVzcyArIChhdHRhY2hfc2l6ZSAtIDEpOwotICBpZiAoKGNvbnRyb2xsZXItPmJsb2NrLmJhc2UgJiAzKSAhPSAwKQotICAgIGh3X2Fib3J0IChtZSwgImNwdSByZWdpc3RlciBibG9jayBtdXN0IGJlIDQgYnl0ZSBhbGlnbmVkIik7Ci0gIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKLQkJICAgICAwLAotCQkgICAgIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAotCQkgICAgIG1lKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbW4xMDNjcHVfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQotewotICBzdHJ1Y3QgbW4xMDNjcHUgKmNvbnRyb2xsZXI7Ci0KLSAgY29udHJvbGxlciA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBtbjEwM2NwdSk7Ci0gIHNldF9od19kYXRhIChtZSwgY29udHJvbGxlcik7Ci0gIHNldF9od19pb19yZWFkX2J1ZmZlciAobWUsIG1uMTAzY3B1X2lvX3JlYWRfYnVmZmVyKTsKLSAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIG1uMTAzY3B1X2lvX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od19wb3J0cyAobWUsIG1uMTAzY3B1X3BvcnRzKTsKLSAgc2V0X2h3X3BvcnRfZXZlbnQgKG1lLCBtbjEwM2NwdV9wb3J0X2V2ZW50KTsKLQotICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBhdHRhY2hfbW4xMDNjcHVfcmVncyAobWUsIGNvbnRyb2xsZXIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlYWQtb25seSByZWdpc3RlcnMgKi8KLSAgY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCA9IDc7IC8qIEZJWE1FICovCi0gIC8qIC4uLiAqLwotfQotCi0KLQotLyogQW4gZXZlbnQgYXJyaXZlcyBvbiBhbiBpbnRlcnJ1cHQgcG9ydCAqLwotCi1zdGF0aWMgdm9pZAotZGVsaXZlcl9tbjEwM2NwdV9pbnRlcnJ1cHQgKHN0cnVjdCBodyAqbWUsCi0JCQkgICAgdm9pZCAqZGF0YSkKLXsKLSAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOwotICBTSU1fREVTQyBzaW11bGF0b3IgPSBod19zeXN0ZW0gKG1lKTsKLSAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApOwotCi0gIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0KQotICAgIHsKLSAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfcmVzZXQgPSAwOwotICAgICAgLyogbmVlZCB0byBjbGVhciBhbGwgcmVnaXN0ZXJzIGV0LmFsISAqLwotICAgICAgSFdfVFJBQ0UgKChtZSwgIlJlc2V0ISIpKTsKLSAgICAgIGh3X2Fib3J0IChtZSwgIlJlc2V0ISIpOwotICAgIH0KLSAgZWxzZSBpZiAoY29udHJvbGxlci0+cGVuZGluZ19ubWkpCi0gICAgewotICAgICAgY29udHJvbGxlci0+cGVuZGluZ19ubWkgPSAwOwotICAgICAgc3RvcmVfd29yZCAoU1AgLSA0LCBDSUFfR0VUIChjcHUpKTsKLSAgICAgIHN0b3JlX2hhbGYgKFNQIC0gOCwgUFNXKTsKLSAgICAgIFBTVyAmPSB+UFNXX0lFOwotICAgICAgU1AgPSBTUCAtIDg7Ci0gICAgICBDSUFfU0VUIChjcHUsIDB4NDAwMDAwMDgpOwotICAgICAgSFdfVFJBQ0UgKChtZSwgIm5taSBwYz0weCUwOGx4IHBzdz0weCUwNHggc3A9MHglMDhseCIsCi0JCSAobG9uZykgQ0lBX0dFVCAoY3B1KSwgKHVuc2lnbmVkKSBQU1csIChsb25nKSBTUCkpOwotICAgIH0KLSAgZWxzZSBpZiAoKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPCBFWFRSQUNUX1BTV19MTSkKLQkgICAmJiAoUFNXICYgUFNXX0lFKSkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBjbGVhciBwZW5kaW5nIGxldmVsLiAgUmVxdWVzdCBjb250aW51ZXMgdG8gYmUgcGVuZGluZwotICAgICAgICAgdW50aWwgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGNsZWFycy9jaGFuZ2VzIGl0ICovCi0gICAgICBzdG9yZV93b3JkIChTUCAtIDQsIENJQV9HRVQgKGNwdSkpOwotICAgICAgc3RvcmVfaGFsZiAoU1AgLSA4LCBQU1cpOwotICAgICAgUFNXICY9IH5QU1dfSUU7Ci0gICAgICBQU1cgJj0gflBTV19MTTsKLSAgICAgIFBTVyB8PSBJTlNFUlRfUFNXX0xNIChjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsKTsKLSAgICAgIFNQID0gU1AgLSA4OwotICAgICAgQ0lBX1NFVCAoY3B1LCAweDQwMDAwMDAwICsgY29udHJvbGxlci0+aW50ZXJydXB0X3ZlY3Rvcltjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsXSk7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1vdXQgYWNrICVkIiwgY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCkpOwotICAgICAgaHdfcG9ydF9ldmVudCAobWUsIEFDS19QT1JULCBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsKTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJpbnQgbGV2ZWw9JWQgcGM9MHglMDhseCBwc3c9MHglMDR4IHNwPTB4JTA4bHgiLAotCQkgY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCwKLQkJIChsb25nKSBDSUFfR0VUIChjcHUpLCAodW5zaWduZWQpIFBTVywgKGxvbmcpIFNQKSk7Ci0gICAgfQotCi0gIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsIDwgNykgLyogRklYTUUgKi8KLSAgICB7Ci0gICAgICAvKiBBcyBsb25nIGFzIHRoZXJlIGlzIHRoZSBwb3RlbnRpYWwgbmVlZCB0byBkZWxpdmVyIGFuCi0JIGludGVycnVwdCB3ZSBrZWVwIHJlc2NoZWR1bGluZyB0aGlzIHJvdXRpbmUuICovCi0gICAgICBpZiAoY29udHJvbGxlci0+cGVuZGluZ19oYW5kbGVyICE9IE5VTEwpCi0JY29udHJvbGxlci0+cGVuZGluZ19oYW5kbGVyID0KLQkgIGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgMSwgZGVsaXZlcl9tbjEwM2NwdV9pbnRlcnJ1cHQsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIERvbid0IGJvdGhlciByZS1zY2hlZHVsaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhcyB0aGVyZSBpcwotICAgICAgICAgbm90aGluZyB0byBkZWxpdmVyICovCi0gICAgICBjb250cm9sbGVyLT5wZW5kaW5nX2hhbmRsZXIgPSBOVUxMOwotICAgIH0KLQotfQotCi0KLXN0YXRpYyB2b2lkCi1tbjEwM2NwdV9wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgIGludCBteV9wb3J0LAotCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAotCQkgICAgIGludCBzb3VyY2VfcG9ydCwKLQkJICAgICBpbnQgbGV2ZWwpCi17Ci0gIHN0cnVjdCBtbjEwM2NwdSAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLQotICAvKiBTY2hlZHVsZSBvdXIgZXZlbnQgaGFuZGxlciAqbm93KiAqLwotICBpZiAoY29udHJvbGxlci0+cGVuZGluZ19oYW5kbGVyID09IE5VTEwpCi0gICAgY29udHJvbGxlci0+cGVuZGluZ19oYW5kbGVyID0KLSAgICAgIGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgMCwgZGVsaXZlcl9tbjEwM2NwdV9pbnRlcnJ1cHQsIE5VTEwpOwotCi0gIHN3aXRjaCAobXlfcG9ydCkKLSAgICB7Ci0gICAgICAKLSAgICBjYXNlIFJFU0VUX1BPUlQ6Ci0gICAgICBjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0ID0gMTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJwb3J0LWluIHJlc2V0IikpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE5NSV9QT1JUOgotICAgICAgY29udHJvbGxlci0+cGVuZGluZ19ubWkgPSAxOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gbm1pIikpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExFVkVMX1BPUlQ6Ci0gICAgICBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsID0gbGV2ZWw7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBsZXZlbD0lZCIsIGxldmVsKSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgc3dpdGNoIik7Ci0gICAgICBicmVhazsKLQotICAgIH0KLX0KLQotCi0vKiBSZWFkL3dyaXRlIHRvIGEgQ1BVIHJlZ2lzdGVyICovCi0KLWVudW0gbW4xMDNjcHVfcmVncyB7Ci0gIElOVkFMSURfUkVHLAotICBJVlIwX1JFRywKLSAgSVZSMV9SRUcsCi0gIElWUjJfUkVHLAotICBJVlIzX1JFRywKLSAgSVZSNF9SRUcsCi0gIElWUjVfUkVHLAotICBJVlI2X1JFRywKLSAgSU1DUl9SRUcsCi0gIENQVU1fUkVHLAotfTsKLQotc3RhdGljIGVudW0gbW4xMDNjcHVfcmVncwotZGVjb2RlX21uMTAzY3B1X2FkZHIgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgIHN0cnVjdCBtbjEwM2NwdSAqY29udHJvbGxlciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBiYXNlKQotewotICBzd2l0Y2ggKGJhc2UgLSBjb250cm9sbGVyLT5ibG9jay5iYXNlKQotICAgIHsKLSAgICBjYXNlIDB4MDAwOiByZXR1cm4gSVZSMF9SRUc7Ci0gICAgY2FzZSAweDAwNDogcmV0dXJuIElWUjFfUkVHOwotICAgIGNhc2UgMHgwMDg6IHJldHVybiBJVlIyX1JFRzsKLSAgICBjYXNlIDB4MDBjOiByZXR1cm4gSVZSM19SRUc7Ci0gICAgY2FzZSAweDAxMDogcmV0dXJuIElWUjRfUkVHOwotICAgIGNhc2UgMHgwMTQ6IHJldHVybiBJVlI1X1JFRzsKLSAgICBjYXNlIDB4MDE4OiByZXR1cm4gSVZSNl9SRUc7Ci0gICAgY2FzZSAweDAyMDogcmV0dXJuIElNQ1JfUkVHOwotICAgIGNhc2UgMHgwNDA6IHJldHVybiBDUFVNX1JFRzsKLSAgICBkZWZhdWx0OiByZXR1cm4gSU5WQUxJRF9SRUc7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQKLW1uMTAzY3B1X2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHZvaWQgKmRlc3QsCi0JCQkgaW50IHNwYWNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOwotICB1bnNpZ25lZDE2IHZhbCA9IDA7Ci0gIGVudW0gbW4xMDNjcHVfcmVncyByZWcgPSBkZWNvZGVfbW4xMDNjcHVfYWRkciAobWUsIGNvbnRyb2xsZXIsIGJhc2UpOwotCi0gIHN3aXRjaCAocmVnKQotICAgIHsKLSAgICBjYXNlIElWUjBfUkVHOgotICAgIGNhc2UgSVZSMV9SRUc6Ci0gICAgY2FzZSBJVlIyX1JFRzoKLSAgICBjYXNlIElWUjNfUkVHOgotICAgIGNhc2UgSVZSNF9SRUc6Ci0gICAgY2FzZSBJVlI1X1JFRzoKLSAgICBjYXNlIElWUjZfUkVHOgotICAgICAgdmFsID0gY29udHJvbGxlci0+aW50ZXJydXB0X3ZlY3RvcltyZWcgLSBJVlIwX1JFR107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElNQ1JfUkVHOgotICAgICAgdmFsID0gY29udHJvbGxlci0+aW50ZXJuYWxfbWVtb3J5X2NvbnRyb2w7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQVU1fUkVHOgotICAgICAgdmFsID0gY29udHJvbGxlci0+Y3B1X21vZGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyoganVzdCBpZ25vcmUgdGhlIHJlYWQgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobnJfYnl0ZXMgPT0gMikKLSAgICAqKHVuc2lnbmVkMTYqKSBkZXN0ID0gSDJMRV8yICh2YWwpOwotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi1zdGF0aWMgdW5zaWduZWQKLW1uMTAzY3B1X2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCBtbjEwM2NwdSAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgdW5zaWduZWQxNiB2YWw7Ci0gIGVudW0gbW4xMDNjcHVfcmVncyByZWc7Ci0KLSAgaWYgKG5yX2J5dGVzICE9IDIpCi0gICAgaHdfYWJvcnQgKG1lLCAibXVzdCBiZSB0d28gYnl0ZSB3cml0ZSIpOwotCi0gIHJlZyA9IGRlY29kZV9tbjEwM2NwdV9hZGRyIChtZSwgY29udHJvbGxlciwgYmFzZSk7Ci0gIHZhbCA9IExFMkhfMiAoKiAodW5zaWduZWQxNiAqKSBzb3VyY2UpOwotCi0gIHN3aXRjaCAocmVnKQotICAgIHsKLSAgICBjYXNlIElWUjBfUkVHOgotICAgIGNhc2UgSVZSMV9SRUc6Ci0gICAgY2FzZSBJVlIyX1JFRzoKLSAgICBjYXNlIElWUjNfUkVHOgotICAgIGNhc2UgSVZSNF9SRUc6Ci0gICAgY2FzZSBJVlI1X1JFRzoKLSAgICBjYXNlIElWUjZfUkVHOgotICAgICAgY29udHJvbGxlci0+aW50ZXJydXB0X3ZlY3RvcltyZWcgLSBJVlIwX1JFR10gPSB2YWw7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAiaXZyJWQgPSAweCUwNGx4IiwgcmVnIC0gSVZSMF9SRUcsIChsb25nKSB2YWwpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBqdXN0IGlnbm9yZSB0aGUgd3JpdGUgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19ICAgICAKLQotCi1jb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl9tbjEwM2NwdV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgIm1uMTAzY3B1IiwgbW4xMDNjcHVfZmluaXNoLCB9LAotICB7IE5VTEwgfSwKLX07CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9kdi1tbjEwM2ludC5jIGIvc2ltL21uMTAzMDAvZHYtbW4xMDNpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZTAwNy4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDMwMC9kdi1tbjEwM2ludC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAiaHctbWFpbi5oIgotI2luY2x1ZGUgInNpbS1ody5oIgotCi0vKiBERVZJQ0UKLQotICAgCi0gICBtbjEwM2ludCAtIG1uMTAzMDAyIGludGVycnVwdCBjb250cm9sbGVyCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLQotICAgCi0gICBJbXBsZW1lbnRzIHRoZSBtbjEwMzAwMiBpbnRlcnJ1cHQgY29udHJvbGxlciBkZXNjcmliZWQgaW4gdGhlCi0gICBtbjEwMzAwMiB1c2VyIGd1aWRlLgotCi0KLSAgIFBST1BFUlRJRVMKLSAgIAotCi0gICByZWcgPSA8aWNyLWFkcj4gPGljci1zaXo+IDxpYWdyLWFkcj4gPGlhZHItc2l6PiA8ZXh0bWQtYWRyPiA8ZXh0bWQtc2l6PgotCi0gICBTcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIHRoZSBJQ1IgKHRvdGFsIG9mIDMwIHJlZ2lzdGVycyksIElBR1IgYW5kCi0gICBFWFRNRCByZWdpc3RlcnMgKHdpdGhpbiB0aGUgcGFyZW50IGJ1cykuCi0KLSAgIFRoZSByZWcgcHJvcGVydHkgdmFsdWUgYDB4MzQwMDAxMDAgMHg3QyAweDM0MDAwMjAwIDB4OCAweDM0MDAyODAKLSAgIDB4OCcgbG9jYXRlcyB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgYXQgdGhlIGFkZHJlc3NlcyBzcGVjaWZpZWQgaW4KLSAgIHRoZSBtbjEwMzAwMiBpbnRlcnJ1cHQgY29udHJvbGxlciB1c2VyIGd1aWRlLgotCi0KLSAgIFBPUlRTCi0KLQotICAgbm1pIChvdXRwdXQpCi0KLSAgIE5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQgb3V0cHV0IHBvcnQuICBBbiBldmVudCBvbiB0aGlzIG91dHB1dCBwb3J0cwotICAgaW5kaWNhdGVzIGEgTk1JIHJlcXVlc3QgZnJvbSB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuICBUaGUgdmFsdWUKLSAgIGF0dGFjaGVkIHRvIHRoZSBldmVudCBzaG91bGQgYmUgaWdub3JlZC4KLQotCi0gICBsZXZlbCAob3V0cHV0KQotCi0gICBNYXNrYWJsZSBpbnRlcnJ1cHQgbGV2ZWwgb3V0cHV0IHBvcnQuICBBbiBldmVudCBvbiB0aGlzIG91dHB1dCBwb3J0Ci0gICBpbmRpY2F0ZXMgYSBtYXNrYWJsZSBpbnRlcnJ1cHQgcmVxdWVzdCBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLiAgVGhlCi0gICBldmVudCB2YWx1ZSBkZWZpbmVzIHRoZSBsZXZlbCBiZWluZyByZXF1ZXN0ZWQuCi0KLSAgIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB3aWxsIGdlbmVyYXRlIGFuIGV2ZW50IG9uIHRoaXMgcG9ydAotICAgd2hlbmV2ZXIgdGhlcmUgaXMgYSBjaGFuZ2UgdG8gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBpbnRlcnJ1cHQKLSAgIGNvbnRyb2xsZXIuCi0KLQotICAgYWNrIChpbnB1dCkKLQotICAgU2lnbmFsIGZyb20gcHJvY2Vzc29yIGluZGljYXRpbmcgdGhhdCBhIG1hc2thYmxlIGludGVycnVwdCBoYXMgYmVlbgotICAgYWNjZXB0ZWQgYW5kIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBzaG91bGQgbGF0Y2ggdGhlIElBR1Igd2l0aAotICAgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaGlnaGVzdCBwcmlvcml0eSBpbnRlcnJ1cHRpbmcgZ3JvdXAuCi0KLSAgIFRoZSBldmVudCB2YWx1ZSBpcyB0aGUgaW50ZXJydXB0IGxldmVsIGJlaW5nIGFjY2VwdGVkIGJ5IHRoZQotICAgcHJvY2Vzc29yLiAgSXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgbW9zdCByZWNlbnQgTEVWRUwgc2VudAotICAgdG8gdGhlIHByb2Nlc3NvciBmcm9tIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlci4KLQotCi0gICBpbnRbMC4uMTAwXSAoaW5wdXQpCi0KLSAgIExldmVsIG9yIGVkZ2UgdHJpZ2dlcmVkIGludGVycnVwdCBpbnB1dCBwb3J0LiAgRWFjaCBvZiB0aGUgMzAKLSAgIGdyb3VwcyAoMC4uMzApIGNhbiBoYXZlIHVwIHRvIDQgKDAuLjMpIGludGVycnVwdCBpbnB1dHMuICBUaGUKLSAgIGludGVycHJldGF0aW9uIG9mIGEgcG9ydCBldmVudC92YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotICAgY29uZmlndXJhdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgZ3JvdXAuCi0KLSAgIEZvciBjb252ZW5pZW5jZSwgbnVtZXJvdXMgYWxpYXNlcyB0byB0aGVzZSBpbnRlcnJ1cHQgaW5wdXRzIGFyZQotICAgcHJvdmlkZWQuCi0KLQotICAgQlVHUwotCi0KLSAgIEZvciBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHRzLCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgZG9lcyBub3QKLSAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBQT1NJVElWRSAocmlzaW5nKSBhbmQgTkVHQVRJVkUgKGZhbGxpbmcpCi0gICBlZGdlcy4gIEluc3RlYWQgYW55IGlucHV0IHBvcnQgZXZlbnQgaXMgY29uc2lkZXJlZCB0byBiZSBhbgotICAgaW50ZXJydXB0IHRyaWdnZXIuCi0KLSAgIEZvciBsZXZlbCBzZW5zaXRpdmUgaW50ZXJydXB0cywgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGlnbm9yZXMKLSAgIGFjdGl2ZSBISUdIL0xPVyBzZXR0aW5ncyBhbmQgaW5zdGVhZCBhbHdheXMgaW50ZXJwcmV0cyBhIG5vbnplcm8KLSAgIHBvcnQgdmFsdWUgYXMgYW4gaW50ZXJydXB0IGFzc2VydGlvbiBhbmQgYSB6ZXJvIHBvcnQgdmFsdWUgYXMgYQotICAgbmVnYXRpb24uCi0KLSAgICovCi0KLQotLyogVGhlIGludGVycnVwdCBncm91cHMgLSBudW1iZXJlZCBhY2NvcmRpbmcgdG8gbW4xMDMwMDIgY29udmVudGlvbiAqLwotCi1lbnVtIG1uMTAzaW50X3RyaWdnZXIgewotICBBQ1RJVkVfTE9XLAotICBBQ1RJVkVfSElHSCwKLSAgUE9TSVRJVkVfRURHRSwKLSAgTkVHQVRJVkVfRURHRSwKLX07Ci0KLWVudW0gbW4xMDNpbnRfdHlwZSB7Ci0gIE5NSV9HUk9VUCwKLSAgTEVWRUxfR1JPVVAsCi19OwotCi1zdHJ1Y3QgbW4xMDNpbnRfZ3JvdXAgewotICBpbnQgZ2lkOwotICBpbnQgbGV2ZWw7Ci0gIHVuc2lnbmVkIGVuYWJsZTsKLSAgdW5zaWduZWQgcmVxdWVzdDsKLSAgdW5zaWduZWQgaW5wdXQ7Ci0gIGVudW0gbW4xMDNpbnRfdHJpZ2dlciB0cmlnZ2VyOwotICBlbnVtIG1uMTAzaW50X3R5cGUgdHlwZTsKLX07Ci0KLWVudW0gewotICBGSVJTVF9OTUlfR1JPVVAgPSAwLAotICBMQVNUX05NSV9HUk9VUCA9IDEsCi0gIEZJUlNUX0xFVkVMX0dST1VQID0gMiwKLSAgTEFTVF9MRVZFTF9HUk9VUCA9IDMwLAotICBOUl9HUk9VUFMsCi19OwotCi1lbnVtIHsKLSAgTE9XRVNUX0xFVkVMID0gNywKLX07Ci0KLS8qIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciByZWdpc3RlciBhZGRyZXNzIGJsb2NrcyAqLwotCi1zdHJ1Y3QgbW4xMDNpbnRfYmxvY2sgewotICB1bnNpZ25lZF93b3JkIGJhc2U7Ci0gIHVuc2lnbmVkX3dvcmQgYm91bmQ7Ci19OwotCi1lbnVtIHsgSUNSX0JMT0NLLCBJQUdSX0JMT0NLLCBFWFRNRF9CTE9DSywgTlJfQkxPQ0tTIH07Ci0KLQotc3RydWN0IG1uMTAzaW50IHsKLSAgc3RydWN0IG1uMTAzaW50X2Jsb2NrIGJsb2NrW05SX0JMT0NLU107Ci0gIHN0cnVjdCBtbjEwM2ludF9ncm91cCBncm91cFtOUl9HUk9VUFNdOwotICB1bnNpZ25lZCBpbnRlcnJ1cHRfYWNjZXB0ZWRfZ3JvdXA7Ci19OwotCi0KLQotLyogb3V0cHV0IHBvcnQgSUQncyAqLyAKLQotZW51bSB7Ci0gIE5NSV9QT1JULAotICBMRVZFTF9QT1JULAotfTsKLQotCi0vKiBpbnB1dCBwb3J0IElEJ3MgKi8KLQotZW51bSB7Ci0gIEcwX1BPUlQgPSAwLAotICBHMV9QT1JUID0gNCwKLSAgRzJfUE9SVCA9IDgsCi0gIEczX1BPUlQgPSAxMiwKLSAgRzRfUE9SVCA9IDE2LAotICBHNV9QT1JUID0gMjAsCi0gIEc2X1BPUlQgPSAyNCwKLSAgRzdfUE9SVCA9IDI4LAotICBHOF9QT1JUID0gMzIsCi0gIEc5X1BPUlQgPSAzNiwKLSAgRzEwX1BPUlQgPSA0MCwKLSAgRzExX1BPUlQgPSA0NCwKLSAgRzEyX1BPUlQgPSA0OCwKLSAgRzEzX1BPUlQgPSA1MiwKLSAgRzE0X1BPUlQgPSA1NiwKLSAgRzE1X1BPUlQgPSA2MCwKLSAgRzE2X1BPUlQgPSA2NCwKLSAgRzE3X1BPUlQgPSA2OCwKLSAgRzE4X1BPUlQgPSA3MiwKLSAgRzE5X1BPUlQgPSA3NiwKLSAgRzIwX1BPUlQgPSA4MCwKLSAgRzIxX1BPUlQgPSA4NCwKLSAgRzIyX1BPUlQgPSA4OCwKLSAgRzIzX1BPUlQgPSA5MiwKLSAgSVJRMF9QT1JUID0gRzIzX1BPUlQsCi0gIEcyNF9QT1JUID0gOTYsCi0gIEcyNV9QT1JUID0gMTAwLAotICBHMjZfUE9SVCA9IDEwNCwKLSAgRzI3X1BPUlQgPSAxMDgsCi0gIElSUTRfUE9SVCA9IEcyN19QT1JULAotICBHMjhfUE9SVCA9IDExMiwKLSAgRzI5X1BPUlQgPSAxMTYsCi0gIEczMF9QT1JUID0gMTIwLAotICBOUl9HX1BPUlRTID0gMTI0LAotICBBQ0tfUE9SVCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIG1uMTAzaW50X3BvcnRzW10gPSB7Ci0KLSAgLyogaW50ZXJydXB0IG91dHB1dHMgKi8KLQotICB7ICJubWkiLCBOTUlfUE9SVCwgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgImxldmVsIiwgTEVWRUxfUE9SVCwgMCwgb3V0cHV0X3BvcnQsIH0sCi0KLSAgLyogaW50ZXJydXB0IGFjayAobGF0Y2gpIGlucHV0IGZyb20gY3B1ICovCi0KLSAgeyAiYWNrIiwgQUNLX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgLyogaW50ZXJydXB0IGlucHV0cyAoYXMgbmFtZXMpICovCi0KLSAgeyAibm1pcnEiLCBHMF9QT1JUICsgMCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAid2F0Y2hkb2ciLCBHMF9QT1JUICsgMSwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAic3lzZXJyIiwgRzBfUE9SVCArIDIsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyAidGltZXItMC11bmRlcmZsb3ciLCBHMl9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJ0aW1lci0xLXVuZGVyZmxvdyIsIEczX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgInRpbWVyLTItdW5kZXJmbG93IiwgRzRfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAidGltZXItMy11bmRlcmZsb3ciLCBHNV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJ0aW1lci00LXVuZGVyZmxvdyIsIEc2X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgInRpbWVyLTUtdW5kZXJmbG93IiwgRzdfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAidGltZXItNi11bmRlcmZsb3ciLCBHOF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotCi0gIHsgInRpbWVyLTYtY29tcGFyZS1hIiwgRzlfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAidGltZXItNi1jb21wYXJlLWIiLCBHMTBfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLQotICB7ICJkbWEtMC1lbmQiLCBHMTJfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAiZG1hLTEtZW5kIiwgRzEzX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgImRtYS0yLWVuZCIsIEcxNF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJkbWEtMy1lbmQiLCBHMTVfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLQotICB7ICJzZXJpYWwtMC1yZWNlaXZlIiwgIEcxNl9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJzZXJpYWwtMC10cmFuc21pdCIsIEcxN19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotCi0gIHsgInNlcmlhbC0xLXJlY2VpdmUiLCAgRzE4X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0gIHsgInNlcmlhbC0xLXRyYW5zbWl0IiwgRzE5X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCi0KLSAgeyAic2VyaWFsLTItcmVjZWl2ZSIsICBHMjBfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLSAgeyAic2VyaWFsLTItdHJhbnNtaXQiLCBHMjFfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKLQotICB7ICJpcnEtMCIsIEcyM19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtMSIsIEcyNF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtMiIsIEcyNV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtMyIsIEcyNl9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtNCIsIEcyN19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtNSIsIEcyOF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtNiIsIEcyOV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotICB7ICJpcnEtNyIsIEczMF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAotCi0gIC8qIGludGVycnVwdCBpbnB1dHMgKGFzIGdlbmVyaWMgbnVtYmVycykgKi8KLQotICB7ICJpbnQiLCAwLCBOUl9HX1BPUlRTLCBpbnB1dF9wb3J0LCB9LAotCi0gIHsgTlVMTCwgfSwKLX07Ci0KLQotLyogTWFjcm9zIGZvciBleHRyYWN0aW5nL3Jlc3RvcmluZyB0aGUgdmFyaW91cyByZWdpc3RlciBiaXRzICovCi0KLSNkZWZpbmUgRVhUUkFDVF9JRChYKSAoTFNFWFRSQUNURUQ4ICgoWCksIDMsIDApKQotI2RlZmluZSBJTlNFUlRfSUQoWCkgKExTSU5TRVJURUQ4ICgoWCksIDMsIDApKQotCi0jZGVmaW5lIEVYVFJBQ1RfSVIoWCkgKExTRVhUUkFDVEVEOCAoKFgpLCA3LCA0KSkKLSNkZWZpbmUgSU5TRVJUX0lSKFgpIChMU0lOU0VSVEVEOCAoKFgpLCA3LCA0KSkKLQotI2RlZmluZSBFWFRSQUNUX0lFKFgpIChMU0VYVFJBQ1RFRDggKChYKSwgMywgMCkpCi0jZGVmaW5lIElOU0VSVF9JRShYKSAoTFNJTlNFUlRFRDggKChYKSwgMywgMCkpCi0KLSNkZWZpbmUgRVhUUkFDVF9MVihYKSAoTFNFWFRSQUNURUQ4ICgoWCksIDYsIDQpKQotI2RlZmluZSBJTlNFUlRfTFYoWCkgKExTSU5TRVJURUQ4ICgoWCksIDYsIDQpKQotCi0KLQotLyogRmluaXNoIG9mZiB0aGUgcGFydGlhbGx5IGNyZWF0ZWQgaHcgZGV2aWNlLiAgQXR0YWNoIG91ciBsb2NhbAotICAgY2FsbGJhY2tzLiAgV2lyZSB1cCBvdXIgcG9ydCBuYW1lcyBldGMgKi8KLQotc3RhdGljIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCBtbjEwM2ludF9pb19yZWFkX2J1ZmZlcjsKLXN0YXRpYyBod19pb193cml0ZV9idWZmZXJfbWV0aG9kIG1uMTAzaW50X2lvX3dyaXRlX2J1ZmZlcjsKLXN0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCBtbjEwM2ludF9wb3J0X2V2ZW50Owotc3RhdGljIGh3X2lvY3RsX21ldGhvZCBtbjEwM2ludF9pb2N0bDsKLQotCi0KLXN0YXRpYyB2b2lkCi1hdHRhY2hfbW4xMDNpbnRfcmVncyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyKQotewotICBpbnQgaTsKLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLSAgZm9yIChpID0gMDsgaSA8IE5SX0JMT0NLUzsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7Ci0gICAgICBpbnQgYXR0YWNoX3NwYWNlOwotICAgICAgdW5zaWduZWQgYXR0YWNoX3NpemU7Ci0gICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0gICAgICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIGksICZyZWcpKQotCWh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIHRocmVlIGFkZHIvc2l6ZSBlbnRyaWVzIik7Ci0gICAgICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCQkgJnJlZy5hZGRyZXNzLAotCQkJCQkgJmF0dGFjaF9zcGFjZSwKLQkJCQkJICZhdHRhY2hfYWRkcmVzcywKLQkJCQkJIG1lKTsKLSAgICAgIGNvbnRyb2xsZXItPmJsb2NrW2ldLmJhc2UgPSBhdHRhY2hfYWRkcmVzczsKLSAgICAgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCi0JCQkJICAgJnJlZy5zaXplLAotCQkJCSAgICZhdHRhY2hfc2l6ZSwgbWUpOwotICAgICAgY29udHJvbGxlci0+YmxvY2tbaV0uYm91bmQgPSBhdHRhY2hfYWRkcmVzcyArIChhdHRhY2hfc2l6ZSAtIDEpOwotICAgICAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJIDAsCi0JCQkgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCi0JCQkgbWUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1uMTAzaW50X2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKLXsKLSAgaW50IGdpZDsKLSAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyOwotCi0gIGNvbnRyb2xsZXIgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgbW4xMDNpbnQpOwotICBzZXRfaHdfZGF0YSAobWUsIGNvbnRyb2xsZXIpOwotICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCBtbjEwM2ludF9pb19yZWFkX2J1ZmZlcik7Ci0gIHNldF9od19pb193cml0ZV9idWZmZXIgKG1lLCBtbjEwM2ludF9pb193cml0ZV9idWZmZXIpOwotICBzZXRfaHdfcG9ydHMgKG1lLCBtbjEwM2ludF9wb3J0cyk7Ci0gIHNldF9od19wb3J0X2V2ZW50IChtZSwgbW4xMDNpbnRfcG9ydF9ldmVudCk7Ci0gIG1lLT50b19pb2N0bCA9IG1uMTAzaW50X2lvY3RsOwotCi0gIC8qIEF0dGFjaCBvdXJzZWxmIHRvIG91ciBwYXJlbnQgYnVzICovCi0gIGF0dGFjaF9tbjEwM2ludF9yZWdzIChtZSwgY29udHJvbGxlcik7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhbGwgdGhlIGdyb3VwcyBhY2NvcmRpbmcgdG8gdGhlaXIgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCi0gIGZvciAoZ2lkID0gMDsgZ2lkIDwgTlJfR1JPVVBTOyBnaWQrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbW4xMDNpbnRfZ3JvdXAgKmdyb3VwID0gJmNvbnRyb2xsZXItPmdyb3VwW2dpZF07Ci0gICAgICBncm91cC0+dHJpZ2dlciA9IE5FR0FUSVZFX0VER0U7Ci0gICAgICBncm91cC0+Z2lkID0gZ2lkOwotICAgICAgaWYgKEZJUlNUX05NSV9HUk9VUCA8PSBnaWQgJiYgZ2lkIDw9IExBU1RfTk1JX0dST1VQKQotCXsKLQkgIGdyb3VwLT5lbmFibGUgPSAweGY7Ci0JICBncm91cC0+dHlwZSA9IE5NSV9HUk9VUDsKLQl9Ci0gICAgICBlbHNlIGlmIChGSVJTVF9MRVZFTF9HUk9VUCA8PSBnaWQgJiYgZ2lkIDw9IExBU1RfTEVWRUxfR1JPVVApCi0JewotCSAgZ3JvdXAtPmVuYWJsZSA9IDB4MDsKLQkgIGdyb3VwLT50eXBlID0gTEVWRUxfR1JPVVA7Ci0JfQotICAgICAgZWxzZQotCWh3X2Fib3J0IChtZSwgImludGVybmFsIGVycm9yIC0gdW5rbm93biBncm91cCBpZCIpOwotICAgIH0KLX0KLQotCi0KLS8qIFBlcmZvcm0gdGhlIG5hc3R5IHdvcmsgb2YgZmlndXJpbmcgb3V0IHdoaWNoIG9mIHRoZSBpbnRlcnJ1cHQKLSAgIGdyb3VwcyBzaG91bGQgaGF2ZSBpdHMgaW50ZXJydXB0IGRlbGl2ZXJlZC4gKi8KLQotc3RhdGljIGludAotZmluZF9oaWdoZXN0X2ludGVycnVwdF9ncm91cCAoc3RydWN0IGh3ICptZSwKLQkJCSAgICAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlcikKLXsKLSAgaW50IGdpZDsKLSAgaW50IHNlbGVjdGVkOwotCi0gIC8qIEZJUlNUX05NSV9HUk9VUCAoZ3JvdXAgemVybykgaXMgdXNlZCBhcyBhIHNwZWNpYWwgZGVmYXVsdCB2YWx1ZQotICAgICB3aGVuIHNlYXJjaGluZyBmb3IgYW4gaW50ZXJydXB0IGdyb3VwLiovCi0gIHNlbGVjdGVkID0gRklSU1RfTk1JX0dST1VQOyAKLSAgY29udHJvbGxlci0+Z3JvdXBbRklSU1RfTk1JX0dST1VQXS5sZXZlbCA9IDc7Ci0gIAotICBmb3IgKGdpZCA9IEZJUlNUX0xFVkVMX0dST1VQOyBnaWQgPD0gTEFTVF9MRVZFTF9HUk9VUDsgZ2lkKyspCi0gICAgewotICAgICAgc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cCA9ICZjb250cm9sbGVyLT5ncm91cFtnaWRdOwotICAgICAgaWYgKChncm91cC0+cmVxdWVzdCAmIGdyb3VwLT5lbmFibGUpICE9IDApCi0JewotCSAgLyogUmVtZW1iZXIsIGxvd2VyIGxldmVsLCBoaWdoZXIgcHJpb3JpdHkuICAqLwotCSAgaWYgKGdyb3VwLT5sZXZlbCA8IGNvbnRyb2xsZXItPmdyb3VwW3NlbGVjdGVkXS5sZXZlbCkKLQkgICAgewotCSAgICAgIHNlbGVjdGVkID0gZ2lkOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHNlbGVjdGVkOwotfQotCi0KLS8qIE5vdGlmeSB0aGUgcHJvY2Vzc29yIG9mIGFuIGludGVycnVwdCBsZXZlbCB1cGRhdGUgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfaW50ZXJydXB0X2xldmVsIChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIpCi17Ci0gIGludCBzZWxlY3RlZCA9IGZpbmRfaGlnaGVzdF9pbnRlcnJ1cHRfZ3JvdXAgKG1lLCBjb250cm9sbGVyKTsKLSAgaW50IGxldmVsID0gY29udHJvbGxlci0+Z3JvdXBbc2VsZWN0ZWRdLmxldmVsOwotICBIV19UUkFDRSAoKG1lLCAicG9ydC1vdXQgLSBzZWxlY3RlZD0lZCBsZXZlbD0lZCIsIHNlbGVjdGVkLCBsZXZlbCkpOwotICBod19wb3J0X2V2ZW50IChtZSwgTEVWRUxfUE9SVCwgbGV2ZWwpOwotfQotCi0KLS8qIEFuIGV2ZW50IGFycml2ZXMgb24gYW4gaW50ZXJydXB0IHBvcnQgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAzaW50X3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgaW50IG15X3BvcnQsCi0JCSAgICAgc3RydWN0IGh3ICpzb3VyY2UsCi0JCSAgICAgaW50IHNvdXJjZV9wb3J0LAotCQkgICAgIGludCBsZXZlbCkKLXsKLSAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOwotCi0gIHN3aXRjaCAobXlfcG9ydCkKLSAgICB7Ci0KLSAgICBjYXNlIEFDS19QT1JUOgotICAgICAgewotCWludCBzZWxlY3RlZCA9IGZpbmRfaGlnaGVzdF9pbnRlcnJ1cHRfZ3JvdXAgKG1lLCBjb250cm9sbGVyKTsKLQlpZiAoY29udHJvbGxlci0+Z3JvdXBbc2VsZWN0ZWRdLmxldmVsICE9IGxldmVsKQotCSAgaHdfYWJvcnQgKG1lLCAiYm90Y2hlZCBsZXZlbCBzeW5jaHJvbmlzYXRpb24iKTsKLQljb250cm9sbGVyLT5pbnRlcnJ1cHRfYWNjZXB0ZWRfZ3JvdXAgPSBzZWxlY3RlZDsJCi0JSFdfVFJBQ0UgKChtZSwgInBvcnQtZXZlbnQgcG9ydD1hY2sgbGV2ZWw9JWQgLSBzZWxlY3RlZD0lZCIsCi0JCSAgIGxldmVsLCBzZWxlY3RlZCkpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlpbnQgZ2lkOwotCWludCBpaWQ7Ci0Jc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cDsKLQl1bnNpZ25lZCBpbnRlcnJ1cHQ7Ci0JaWYgKG15X3BvcnQgPiBOUl9HX1BPUlRTKQotCSAgaHdfYWJvcnQgKG1lLCAiRXZlbnQgb24gdW5rbm93biBwb3J0ICVkIiwgbXlfcG9ydCk7Ci0KLQkvKiBtYXAgdGhlIHBvcnQgb250byBhbiBpbnRlcnJ1cHQgZ3JvdXAgKi8KLQlnaWQgPSAobXlfcG9ydCAlIE5SX0dfUE9SVFMpIC8gNDsKLQlncm91cCA9ICZjb250cm9sbGVyLT5ncm91cFtnaWRdOwotCWlpZCA9IChteV9wb3J0ICUgNCk7Ci0JaW50ZXJydXB0ID0gMSA8PCBpaWQ7Ci0KLQkvKiB1cGRhdGUgb3VyIGNhY2hlZCBpbnB1dCAqLwotCWlmIChsZXZlbCkKLQkgIGdyb3VwLT5pbnB1dCB8PSBpbnRlcnJ1cHQ7Ci0JZWxzZQotCSAgZ3JvdXAtPmlucHV0ICY9IH5pbnRlcnJ1cHQ7Ci0KLQkvKiB1cGRhdGUgdGhlIHJlcXVlc3QgYml0cyAqLwotCXN3aXRjaCAoZ3JvdXAtPnRyaWdnZXIpCi0JICB7Ci0JICBjYXNlIEFDVElWRV9MT1c6Ci0JICBjYXNlIEFDVElWRV9ISUdIOgotCSAgICBpZiAobGV2ZWwpCi0JICAgICAgZ3JvdXAtPnJlcXVlc3QgfD0gaW50ZXJydXB0OwotCSAgICBicmVhazsKLQkgIGNhc2UgTkVHQVRJVkVfRURHRToKLQkgIGNhc2UgUE9TSVRJVkVfRURHRToKLQkgICAgZ3JvdXAtPnJlcXVlc3QgfD0gaW50ZXJydXB0OwotCSAgfQotCi0JLyogZm9yY2UgYSBjb3JyZXNwb25kaW5nIG91dHB1dCAqLwotCXN3aXRjaCAoZ3JvdXAtPnR5cGUpCi0JICB7Ci0KLQkgIGNhc2UgTk1JX0dST1VQOgotCSAgICB7Ci0JICAgICAgLyogZm9yIE5NSSdzIHRoZSBldmVudCBpcyB0aGUgdHJpZ2dlciAqLwotCSAgICAgIEhXX1RSQUNFICgobWUsICJwb3J0LWluIHBvcnQ9JWQgZ3JvdXA9JWQgaW50ZXJydXB0PSVkIC0gTk1JIiwKLQkJCSBteV9wb3J0LCBnaWQsIGlpZCkpOwotCSAgICAgIGlmICgoZ3JvdXAtPnJlcXVlc3QgJiBncm91cC0+ZW5hYmxlKSAhPSAwKQotCQl7Ci0JCSAgSFdfVFJBQ0UgKChtZSwgInBvcnQtb3V0IE5NSSIpKTsKLQkJICBod19wb3J0X2V2ZW50IChtZSwgTk1JX1BPUlQsIDEpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgICAKLQkgIGNhc2UgTEVWRUxfR1JPVVA6Ci0JICAgIHsKLQkgICAgICAvKiBpZiBhbiBpbnRlcnJ1cHQgaXMgbm93IHBlbmRpbmcgKi8KLQkgICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBwb3J0PSVkIGdyb3VwPSVkIGludGVycnVwdD0lZCAtIElOVCIsCi0JCQkgbXlfcG9ydCwgZ2lkLCBpaWQpKTsKLQkgICAgICBwdXNoX2ludGVycnVwdF9sZXZlbCAobWUsIGNvbnRyb2xsZXIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci19Ci0KLS8qIFJlYWQvd3JpdGUgdG8gdG8gYW4gSUNSIChncm91cCBjb250cm9sIHJlZ2lzdGVyKSAqLwotCi1zdGF0aWMgc3RydWN0IG1uMTAzaW50X2dyb3VwICoKLWRlY29kZV9ncm91cCAoc3RydWN0IGh3ICptZSwKLQkgICAgICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIsCi0JICAgICAgdW5zaWduZWRfd29yZCBiYXNlLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgKm9mZnNldCkKLXsKLSAgaW50IGdpZCA9IChiYXNlIC8gNCkgJSBOUl9HUk9VUFM7Ci0gICpvZmZzZXQgPSAoYmFzZSAlIDQpOwotICByZXR1cm4gJmNvbnRyb2xsZXItPmdyb3VwW2dpZF07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZDgKLXJlYWRfaWNyIChzdHJ1Y3QgaHcgKm1lLAotCSAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAotCSAgdW5zaWduZWRfd29yZCBiYXNlKQotewotICB1bnNpZ25lZF93b3JkIG9mZnNldDsKLSAgc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cCA9IGRlY29kZV9ncm91cCAobWUsIGNvbnRyb2xsZXIsIGJhc2UsICZvZmZzZXQpOwotICB1bnNpZ25lZDggdmFsID0gMDsKLSAgc3dpdGNoIChncm91cC0+dHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIE5NSV9HUk9VUDoKLSAgICAgIHN3aXRjaCAob2Zmc2V0KQotCXsKLQljYXNlIDA6Ci0JICB2YWwgPSBJTlNFUlRfSUQgKGdyb3VwLT5yZXF1ZXN0KTsKLQkgIEhXX1RSQUNFICgobWUsICJyZWFkLWljciBncm91cD0lZDowIG5taSAweCUwMngiLAotCQkgICAgIGdyb3VwLT5naWQsIHZhbCkpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMRVZFTF9HUk9VUDoKLSAgICAgIHN3aXRjaCAob2Zmc2V0KQotCXsKLQljYXNlIDA6Ci0JICB2YWwgPSAoSU5TRVJUX0lSIChncm91cC0+cmVxdWVzdCkKLQkJIHwgSU5TRVJUX0lEIChncm91cC0+cmVxdWVzdCAmIGdyb3VwLT5lbmFibGUpKTsKLQkgIEhXX1RSQUNFICgobWUsICJyZWFkLWljciBncm91cD0lZDowIGxldmVsIDB4JTAyeCIsCi0JCSAgICAgZ3JvdXAtPmdpZCwgdmFsKSk7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICB2YWwgPSAoSU5TRVJUX0xWIChncm91cC0+bGV2ZWwpCi0JCSB8IElOU0VSVF9JRSAoZ3JvdXAtPmVuYWJsZSkpOwotCSAgSFdfVFJBQ0UgKChtZSwgInJlYWQtaWNyIGxldmVsLSVkOjEgbGV2ZWwgMHglMDJ4IiwKLQkJICAgICBncm91cC0+Z2lkLCB2YWwpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9pY3IgKHN0cnVjdCBodyAqbWUsCi0JICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAotCSAgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkgICB1bnNpZ25lZDggdmFsKQotewotICB1bnNpZ25lZF93b3JkIG9mZnNldDsKLSAgc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cCA9IGRlY29kZV9ncm91cCAobWUsIGNvbnRyb2xsZXIsIGJhc2UsICZvZmZzZXQpOwotICBzd2l0Y2ggKGdyb3VwLT50eXBlKQotICAgIHsKLQotICAgIGNhc2UgTk1JX0dST1VQOgotICAgICAgc3dpdGNoIChvZmZzZXQpCi0JewotCWNhc2UgMDoKLQkgIEhXX1RSQUNFICgobWUsICJ3cml0ZS1pY3IgZ3JvdXA9JWQ6MCBubWkgMHglMDJ4IiwKLQkJICAgICBncm91cC0+Z2lkLCB2YWwpKTsKLQkgIGdyb3VwLT5yZXF1ZXN0ICY9IH5FWFRSQUNUX0lEICh2YWwpOwotCSAgYnJlYWs7Ci0JICAvKiBTcGVjaWFsIGJhY2tkb29yIGFjY2VzcyB0byBTWVNFRiBmbGFnIGZyb20gQ1BVLiAgU2VlCi0gICAgICAgICAgICAgaW50ZXJwLmM6cHJvZ3JhbV9pbnRlcnJ1cHQoKS4gKi8KLQljYXNlIDM6Ci0JICBIV19UUkFDRSAoKG1lLCAid3JpdGUtaWNyLXNwZWNpYWwgZ3JvdXA9JWQ6MCBubWkgMHglMDJ4IiwKLQkJICAgICBncm91cC0+Z2lkLCB2YWwpKTsKLQkgIGdyb3VwLT5yZXF1ZXN0IHw9IEVYVFJBQ1RfSUQgKHZhbCk7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMRVZFTF9HUk9VUDoKLSAgICAgIHN3aXRjaCAob2Zmc2V0KQotCXsKLQljYXNlIDA6IC8qIHJlcXVlc3QvZGV0ZWN0ICovCi0JICAvKiBDbGVhciBhbnkgSUQgYml0cyBhbmQgdGhlbiBzZXQgdGhlbSBhY2NvcmRpbmcgdG8gSVIgKi8KLQkgIEhXX1RSQUNFICgobWUsICJ3cml0ZS1pY3IgZ3JvdXA9JWQ6MCBsZXZlbCAweCUwMnggJXg6JXg6JXgiLAotCQkgICAgIGdyb3VwLT5naWQsIHZhbCwKLQkJICAgICBncm91cC0+cmVxdWVzdCwgRVhUUkFDVF9JUiAodmFsKSwgRVhUUkFDVF9JRCAodmFsKSkpOwotCSAgZ3JvdXAtPnJlcXVlc3QgPQotCSAgICAoKEVYVFJBQ1RfSVIgKHZhbCkgJiBFWFRSQUNUX0lEICh2YWwpKQotCSAgICAgfCAoRVhUUkFDVF9JUiAodmFsKSAmIGdyb3VwLT5yZXF1ZXN0KQotCSAgICAgfCAofkVYVFJBQ1RfSVIgKHZhbCkgJiB+RVhUUkFDVF9JRCAodmFsKSAmIGdyb3VwLT5yZXF1ZXN0KSk7Ci0JICBicmVhazsKLQljYXNlIDE6IC8qIGxldmVsL2VuYWJsZSAqLwotCSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlLWljciBncm91cD0lZDoxIGxldmVsIDB4JTAyeCIsCi0JCSAgICAgZ3JvdXAtPmdpZCwgdmFsKSk7Ci0JICBncm91cC0+bGV2ZWwgPSBFWFRSQUNUX0xWICh2YWwpOwotCSAgZ3JvdXAtPmVuYWJsZSA9IEVYVFJBQ1RfSUUgKHZhbCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogaWdub3JlICovCi0JICBicmVhazsKLQl9Ci0gICAgICBwdXNoX2ludGVycnVwdF9sZXZlbCAobWUsIGNvbnRyb2xsZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci19Ci0KLQotLyogUmVhZCB0aGUgSUFHUiAoSW50ZXJydXB0IGFjY2VwdGVkIGdyb3VwIHJlZ2lzdGVyKSAqLwotCi1zdGF0aWMgdW5zaWduZWQ4Ci1yZWFkX2lhZ3IgKHN0cnVjdCBodyAqbWUsCi0JICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAotCSAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0KQotewotICB1bnNpZ25lZDggdmFsOwotICBzd2l0Y2ggKG9mZnNldCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWlmICghKGNvbnRyb2xsZXItPmdyb3VwW2NvbnRyb2xsZXItPmludGVycnVwdF9hY2NlcHRlZF9ncm91cF0ucmVxdWVzdAotCSAgICAgICYgY29udHJvbGxlci0+Z3JvdXBbY29udHJvbGxlci0+aW50ZXJydXB0X2FjY2VwdGVkX2dyb3VwXS5lbmFibGUpKQotCSAgewotCSAgICAvKiBvb3BzLCBsb3N0IHRoZSByZXF1ZXN0ICovCi0JICAgIHZhbCA9IDA7Ci0JICAgIEhXX1RSQUNFICgobWUsICJyZWFkLWlhZ3I6MCBsb3N0LTAiKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB2YWwgPSAoY29udHJvbGxlci0+aW50ZXJydXB0X2FjY2VwdGVkX2dyb3VwIDw8IDIpOwotCSAgICBIV19UUkFDRSAoKG1lLCAicmVhZC1pYWdyOjAgJWQiLCAoaW50KSB2YWwpKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIDE6Ci0gICAgICB2YWwgPSAwOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInJlYWQtaWFncjoxICVkIiwgKGludCkgdmFsKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdmFsID0gMDsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkLWlhZ3IgMHglMDhseCBiYWQgb2Zmc2V0IiwgKGxvbmcpIG9mZnNldCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdmFsOwotfQotCi0KLS8qIFJlYWRzL3dyaXRlcyB0byB0aGUgRVhUTUQgKGV4dGVybmFsIGludGVycnVwdCB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24KLSAgIHJlZ2lzdGVyKSAqLwotCi1zdGF0aWMgc3RydWN0IG1uMTAzaW50X2dyb3VwICoKLWV4dGVybmFsX2dyb3VwIChzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIsCi0JCXVuc2lnbmVkX3dvcmQgb2Zmc2V0KQotewotICBzd2l0Y2ggKG9mZnNldCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICZjb250cm9sbGVyLT5ncm91cFtJUlEwX1BPUlQvNF07Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuICZjb250cm9sbGVyLT5ncm91cFtJUlE0X1BPUlQvNF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkOAotcmVhZF9leHRtZCAoc3RydWN0IGh3ICptZSwKLQkgICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAotCSAgICB1bnNpZ25lZF93b3JkIG9mZnNldCkKLXsKLSAgaW50IGdpZDsKLSAgdW5zaWduZWQ4IHZhbCA9IDA7Ci0gIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXAgPSBleHRlcm5hbF9ncm91cCAoY29udHJvbGxlciwgb2Zmc2V0KTsKLSAgaWYgKGdyb3VwICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChnaWQgPSAwOyBnaWQgPCA0OyBnaWQrKykKLQl7Ci0JICB2YWwgfD0gKGdyb3VwW2dpZF0udHJpZ2dlciA8PCAoZ2lkICogMikpOwotCX0KLSAgICB9Ci0gIEhXX1RSQUNFICgobWUsICJyZWFkLWV4dG1kIDB4JTAybHgiLCAobG9uZykgdmFsKSk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9leHRtZCAoc3RydWN0IGh3ICptZSwKLQkgICAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0LAotCSAgICAgdW5zaWduZWQ4IHZhbCkKLXsKLSAgaW50IGdpZDsKLSAgc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cCA9IGV4dGVybmFsX2dyb3VwIChjb250cm9sbGVyLCBvZmZzZXQpOwotICBpZiAoZ3JvdXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGdpZCA9IDA7IGdpZCA8IDQ7IGdpZCsrKQotCXsKLQkgIGdyb3VwW2dpZF0udHJpZ2dlciA9ICh2YWwgPj4gKGdpZCAqIDIpKSAmIDB4MzsKLQkgIC8qIE1BWUJFOiBpbnRlcnJ1cHRzIGFscmVhZHkgcGVuZGluZz8gKi8KLQl9Ci0gICAgfQotICBIV19UUkFDRSAoKG1lLCAid3JpdGUtZXh0bWQgMHglMDJseCIsIChsb25nKSB2YWwpKTsKLX0KLQotCi0vKiBnZW5lcmljIHJlYWQvd3JpdGUgKi8KLQotc3RhdGljIGludAotZGVjb2RlX2FkZHIgKHN0cnVjdCBodyAqbWUsCi0JICAgICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIsCi0JICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCi0JICAgICB1bnNpZ25lZF93b3JkICpvZmZzZXQpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgTlJfQkxPQ0tTOyBpKyspCi0gICAgewotICAgICAgaWYgKGFkZHJlc3MgPj0gY29udHJvbGxlci0+YmxvY2tbaV0uYmFzZQotCSAgJiYgYWRkcmVzcyA8PSBjb250cm9sbGVyLT5ibG9ja1tpXS5ib3VuZCkKLQl7Ci0JICAqb2Zmc2V0ID0gYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJsb2NrW2ldLmJhc2U7Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgfQotICBod19hYm9ydCAobWUsICJiYWQgYWRkcmVzcyIpOwotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotbW4xMDNpbnRfaW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCi0JCQkgdm9pZCAqZGVzdCwKLQkJCSBpbnQgc3BhY2UsCi0JCQkgdW5zaWduZWRfd29yZCBiYXNlLAotCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7Ci0gIHVuc2lnbmVkOCAqYnVmID0gZGVzdDsKLSAgdW5zaWduZWQgYnl0ZTsKLSAgLyogSFdfVFJBQ0UgKChtZSwgInJlYWQgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOyAqLwotICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbnJfYnl0ZXM7IGJ5dGUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0OwotICAgICAgc3dpdGNoIChkZWNvZGVfYWRkciAobWUsIGNvbnRyb2xsZXIsIGFkZHJlc3MsICZvZmZzZXQpKQotCXsKLQljYXNlIElDUl9CTE9DSzoKLQkgIGJ1ZltieXRlXSA9IHJlYWRfaWNyIChtZSwgY29udHJvbGxlciwgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCWNhc2UgSUFHUl9CTE9DSzoKLQkgIGJ1ZltieXRlXSA9IHJlYWRfaWFnciAobWUsIGNvbnRyb2xsZXIsIG9mZnNldCk7Ci0JICBicmVhazsKLQljYXNlIEVYVE1EX0JMT0NLOgotCSAgYnVmW2J5dGVdID0gcmVhZF9leHRtZCAobWUsIGNvbnRyb2xsZXIsIG9mZnNldCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHN3aXRjaCIpOwotCX0KLSAgICB9Ci0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi1zdGF0aWMgdW5zaWduZWQKLW1uMTAzaW50X2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKLSAgY29uc3QgdW5zaWduZWQ4ICpidWYgPSBzb3VyY2U7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0gIC8qIEhXX1RSQUNFICgobWUsICJ3cml0ZSAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7ICovCi0gIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBucl9ieXRlczsgYnl0ZSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcyA9IGJhc2UgKyBieXRlOwotICAgICAgdW5zaWduZWRfd29yZCBvZmZzZXQ7Ci0gICAgICBzd2l0Y2ggKGRlY29kZV9hZGRyIChtZSwgY29udHJvbGxlciwgYWRkcmVzcywgJm9mZnNldCkpCi0JewotCWNhc2UgSUNSX0JMT0NLOgotCSAgd3JpdGVfaWNyIChtZSwgY29udHJvbGxlciwgb2Zmc2V0LCBidWZbYnl0ZV0pOwotCSAgYnJlYWs7Ci0JY2FzZSBJQUdSX0JMT0NLOgotCSAgLyogbm90IGFsbG93ZWQgKi8KLQkgIGJyZWFrOwotCWNhc2UgRVhUTURfQkxPQ0s6Ci0JICB3cml0ZV9leHRtZCAobWUsIGNvbnRyb2xsZXIsIG9mZnNldCwgYnVmW2J5dGVdKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBod19hYm9ydCAobWUsICJiYWQgc3dpdGNoIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfSAgICAgCi0KLXN0YXRpYyBpbnQKLW1uMTAzaW50X2lvY3RsKHN0cnVjdCBodyAqbWUsCi0JICAgICAgIGh3X2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKLQkgICAgICAgdmFfbGlzdCBhcCkKLXsKLSAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyID0gKHN0cnVjdCBtbjEwM2ludCAqKWh3X2RhdGEobWUpOwotICBjb250cm9sbGVyLT5ncm91cFswXS5yZXF1ZXN0ID0gRVhUUkFDVF9JRCg0KTsKLSAgbW4xMDNpbnRfcG9ydF9ldmVudChtZSwgMiAvKiBubWlfcG9ydChzeXNlcnIpICovLCBOVUxMLCAwLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfbW4xMDNpbnRfZGVzY3JpcHRvcltdID0gewotICB7ICJtbjEwM2ludCIsIG1uMTAzaW50X2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZHYtbW4xMDNpb3AuYyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzaW9wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzc5ZmMuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvZHYtbW4xMDNpb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJody1tYWluLmgiCi0KLS8qIERFVklDRQotCi0gICAKLSAgIG1uMTAzaW9wIC0gbW4xMDMwMDIgSS9PIHBvcnRzIDAtMy4KLQotICAgCi0gICBERVNDUklQVElPTgotICAgCi0gICBJbXBsZW1lbnRzIHRoZSBtbjEwMzAwMiBpL28gcG9ydHMgYXMgZGVzY3JpYmVkIGluIHRoZSBtbjEwMzAwMiB1c2VyIGd1aWRlLgotCi0KLSAgIFBST1BFUlRJRVMgICAKLQotICAgcmVnID0gPGlvcG9ydC1hZGRyPiA8aW9wb3J0LXNpemU+IC4uLgotCi0KLSAgIEJVR1MKLQotICAgKi8KLQotCi0vKiBUaGUgSS9PIHBvcnRzJyByZWdpc3RlcnMnIGFkZHJlc3MgYmxvY2sgKi8KLQotc3RydWN0IG1uMTAzaW9wX2Jsb2NrIHsKLSAgdW5zaWduZWRfd29yZCBiYXNlOwotICB1bnNpZ25lZF93b3JkIGJvdW5kOwotfTsKLQotCi0KLWVudW0gaW9fcG9ydF9yZWdpc3Rlcl90eXBlcyB7Ci0gIFAwT1VULAotICBQMU9VVCwKLSAgUDJPVVQsCi0gIFAzT1VULAotICBQME1ELAotICBQMU1ELAotICBQMk1ELAotICBQM01ELAotICBQMlNTLAotICBQNFNTLAotICBQMERJUiwKLSAgUDFESVIsCi0gIFAyRElSLAotICBQM0RJUiwKLSAgUDBJTiwKLSAgUDFJTiwKLSAgUDJJTiwKLSAgUDNJTiwKLX07Ci0KLSNkZWZpbmUgTlJfUE9SVFMgIDQKLQotZW51bSB7Ci0gIE9VVFBVVF9CTE9DSywKLSAgTU9ERV9CTE9DSywKLSAgREVEX0NUUkxfQkxPQ0ssCi0gIENUUkxfQkxPQ0ssCi0gIFBJTl9CTE9DSywKLSAgTlJfQkxPQ0tTCi19OwotCi10eXBlZGVmIHN0cnVjdCBfbW4xMDMwMF9pb3BvcnQgewotICB1bnNpZ25lZDggb3V0cHV0LCBvdXRwdXRfbW9kZSwgY29udHJvbCwgcGluOwotICBzdHJ1Y3QgaHdfZXZlbnQgKmV2ZW50OwotfSBtbjEwMzAwX2lvcG9ydDsKLQotCi0KLXN0cnVjdCBtbjEwM2lvcCB7Ci0gIHN0cnVjdCBtbjEwM2lvcF9ibG9jayBibG9ja1tOUl9CTE9DS1NdOwotICBtbjEwMzAwX2lvcG9ydCBwb3J0W05SX1BPUlRTXTsKLSAgdW5zaWduZWQ4ICAgICAgcDJzcywgcDRzczsKLX07Ci0KLQotLyogRmluaXNoIG9mZiB0aGUgcGFydGlhbGx5IGNyZWF0ZWQgaHcgZGV2aWNlLiAgQXR0YWNoIG91ciBsb2NhbAotICAgY2FsbGJhY2tzLiAgV2lyZSB1cCBvdXIgcG9ydCBuYW1lcyBldGMgKi8KLQotc3RhdGljIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCBtbjEwM2lvcF9pb19yZWFkX2J1ZmZlcjsKLXN0YXRpYyBod19pb193cml0ZV9idWZmZXJfbWV0aG9kIG1uMTAzaW9wX2lvX3dyaXRlX2J1ZmZlcjsKLQotc3RhdGljIHZvaWQKLWF0dGFjaF9tbjEwM2lvcF9yZWdzIChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQpCi17Ci0gIGludCBpOwotICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOwotICBpbnQgYXR0YWNoX3NwYWNlOwotICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKLSAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOwotCi0gIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInJlZyIpID09IE5VTEwpCi0gICAgaHdfYWJvcnQgKG1lLCAiTWlzc2luZyBcInJlZ1wiIHByb3BlcnR5Iik7Ci0KLSAgZm9yIChpPTA7IGkgPCBOUl9CTE9DS1M7ICsraSApCi0gICAgewotICAgICAgaWYgKCFod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCBpLCAmcmVnKSkKLQlod19hYm9ydCAobWUsICJcInJlZ1wiIHByb3BlcnR5IG11c3QgY29udGFpbiBmaXZlIGFkZHIvc2l6ZSBlbnRyaWVzIik7Ci0gICAgICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCQkgJnJlZy5hZGRyZXNzLAotCQkJCQkgJmF0dGFjaF9zcGFjZSwKLQkJCQkJICZhdHRhY2hfYWRkcmVzcywKLQkJCQkJIG1lKTsKLSAgICAgIGlvX3BvcnQtPmJsb2NrW2ldLmJhc2UgPSBhdHRhY2hfYWRkcmVzczsKLSAgICAgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCi0JCQkJICAgJnJlZy5zaXplLAotCQkJCSAgICZhdHRhY2hfc2l6ZSwgbWUpOwotICAgICAgaW9fcG9ydC0+YmxvY2tbaV0uYm91bmQgPSBhdHRhY2hfYWRkcmVzcyArIChhdHRhY2hfc2l6ZSAtIDEpOwotICAgICAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJIDAsCi0JCQkgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCi0JCQkgbWUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1uMTAzaW9wX2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKLXsKLSAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0OwotICBpbnQgaTsKLQotICBpb19wb3J0ID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IG1uMTAzaW9wKTsKLSAgc2V0X2h3X2RhdGEgKG1lLCBpb19wb3J0KTsKLSAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgbW4xMDNpb3BfaW9fcmVhZF9idWZmZXIpOwotICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgbW4xMDNpb3BfaW9fd3JpdGVfYnVmZmVyKTsKLQotICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBhdHRhY2hfbW4xMDNpb3BfcmVncyAobWUsIGlvX3BvcnQpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGkvbyBwb3J0IHJlZ2lzdGVycy4gKi8KLSAgZm9yICggaT0wOyBpPE5SX1BPUlRTOyArK2kgKQotICAgIHsKLSAgICAgIGlvX3BvcnQtPnBvcnRbaV0ub3V0cHV0ID0gMDsKLSAgICAgIGlvX3BvcnQtPnBvcnRbaV0ub3V0cHV0X21vZGUgPSAwOwotICAgICAgaW9fcG9ydC0+cG9ydFtpXS5jb250cm9sID0gMDsKLSAgICAgIGlvX3BvcnQtPnBvcnRbaV0ucGluID0gMDsKLSAgICB9Ci0gIGlvX3BvcnQtPnBvcnRbMl0ub3V0cHV0X21vZGUgPSAweGZmOwotICBpb19wb3J0LT5wMnNzID0gMDsKLSAgaW9fcG9ydC0+cDRzcyA9IDB4MGY7Ci19Ci0KLQotLyogcmVhZCBhbmQgd3JpdGUgKi8KLQotc3RhdGljIGludAotZGVjb2RlX2FkZHIgKHN0cnVjdCBodyAqbWUsCi0JICAgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCi0JICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MpCi17Ci0gIHVuc2lnbmVkX3dvcmQgb2Zmc2V0OwotICBvZmZzZXQgPSBhZGRyZXNzIC0gaW9fcG9ydC0+YmxvY2tbMF0uYmFzZTsKLSAgc3dpdGNoIChvZmZzZXQpCi0gICAgewotICAgIGNhc2UgMHgwMDogcmV0dXJuIFAwT1VUOwotICAgIGNhc2UgMHgwMTogcmV0dXJuIFAxT1VUOwotICAgIGNhc2UgMHgwNDogcmV0dXJuIFAyT1VUOwotICAgIGNhc2UgMHgwNTogcmV0dXJuIFAzT1VUOwotICAgIGNhc2UgMHgyMDogcmV0dXJuIFAwTUQ7Ci0gICAgY2FzZSAweDIxOiByZXR1cm4gUDFNRDsKLSAgICBjYXNlIDB4MjQ6IHJldHVybiBQMk1EOwotICAgIGNhc2UgMHgyNTogcmV0dXJuIFAzTUQ7Ci0gICAgY2FzZSAweDQ0OiByZXR1cm4gUDJTUzsKLSAgICBjYXNlIDB4NDg6IHJldHVybiBQNFNTOwotICAgIGNhc2UgMHg2MDogcmV0dXJuIFAwRElSOwotICAgIGNhc2UgMHg2MTogcmV0dXJuIFAxRElSOwotICAgIGNhc2UgMHg2NDogcmV0dXJuIFAyRElSOwotICAgIGNhc2UgMHg2NTogcmV0dXJuIFAzRElSOwotICAgIGNhc2UgMHg4MDogcmV0dXJuIFAwSU47Ci0gICAgY2FzZSAweDgxOiByZXR1cm4gUDFJTjsKLSAgICBjYXNlIDB4ODQ6IHJldHVybiBQMklOOwotICAgIGNhc2UgMHg4NTogcmV0dXJuIFAzSU47Ci0gICAgZGVmYXVsdDogCi0gICAgICB7Ci0JaHdfYWJvcnQgKG1lLCAiYmFkIGFkZHJlc3MiKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWFkX291dHB1dF9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCSBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCi0JCSB1bnNpZ25lZF93b3JkIGlvX3BvcnRfcmVnLAotCQkgY29uc3Qgdm9pZCAqZGVzdCwKLQkJIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wb3J0W2lvX3BvcnRfcmVnXS5vdXRwdXQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFAlZE9VVC4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfb3V0cHV0X21vZGVfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCQkgICAgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCi0JCSAgICAgIGNvbnN0IHZvaWQgKmRlc3QsCi0JCSAgICAgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayBpZiB0aGVyZSBhcmUgZmllbGRzIHdoaWNoIGNhbid0IGJlIHdyaXR0ZW4gYW5kCi0JIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGRlcGVuZGluZyB3aGF0IGJpdHMgYXJlIHNldCAqLwotICAgICAgKih1bnNpZ25lZDggKilkZXN0ID0gaW9fcG9ydC0+cG9ydFtpb19wb3J0X3JlZ10ub3V0cHV0X21vZGU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyB0byBQJWRNRC4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfY29udHJvbF9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCSAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAotCQkgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCi0JCSAgY29uc3Qgdm9pZCAqZGVzdCwKLQkJICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIGlmICggbnJfYnl0ZXMgPT0gMSApCi0gICAgewotICAgICAgKih1bnNpZ25lZDggKilkZXN0ID0gaW9fcG9ydC0+cG9ydFtpb19wb3J0X3JlZ10uY29udHJvbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIHRvIFAlZERJUi4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfcGluX3JlZyAoc3RydWN0IGh3ICptZSwKLQkgICAgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCi0JICAgICAgdW5zaWduZWRfd29yZCBpb19wb3J0X3JlZywKLQkgICAgICBjb25zdCB2b2lkICpkZXN0LAotCSAgICAgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wb3J0W2lvX3BvcnRfcmVnXS5waW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyB0byBQJWRJTi4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfZGVkaWNhdGVkX2NvbnRyb2xfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCQkJICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKLQkJCSAgICB1bnNpZ25lZF93b3JkIGlvX3BvcnRfcmVnLAotCQkJICAgIGNvbnN0IHZvaWQgKmRlc3QsCi0JCQkgICAgdW5zaWduZWQgIG5yX2J5dGVzKQotewotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgIC8qIHNlbGVjdCBvbiBpb19wb3J0X3JlZzogKi8KLSAgICAgIGlmICggaW9fcG9ydF9yZWcgPT0gUDJTUyApCi0JewotCSAgKih1bnNpZ25lZDggKilkZXN0ID0gaW9fcG9ydC0+cDJzczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKih1bnNpZ25lZDggKilkZXN0ID0gaW9fcG9ydC0+cDRzczsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyB0byBQU1MuIiwgbnJfYnl0ZXMpOyAKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1tbjEwM2lvcF9pb19yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSB2b2lkICpkZXN0LAotCQkJIGludCBzcGFjZSwKLQkJCSB1bnNpZ25lZF93b3JkIGJhc2UsCi0JCQkgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCA9IGh3X2RhdGEgKG1lKTsKLSAgZW51bSBpb19wb3J0X3JlZ2lzdGVyX3R5cGVzIGlvX3BvcnRfcmVnOwotICBIV19UUkFDRSAoKG1lLCAicmVhZCAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7Ci0KLSAgaW9fcG9ydF9yZWcgPSBkZWNvZGVfYWRkciAobWUsIGlvX3BvcnQsIGJhc2UpOwotICBzd2l0Y2ggKGlvX3BvcnRfcmVnKQotICAgIHsKLSAgICAvKiBQb3J0IG91dHB1dCByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFAwT1VUOgotICAgIGNhc2UgUDFPVVQ6Ci0gICAgY2FzZSBQMk9VVDoKLSAgICBjYXNlIFAzT1VUOgotICAgICAgcmVhZF9vdXRwdXRfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QME9VVCwgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBQb3J0IG91dHB1dCBtb2RlIHJlZ2lzdGVycyAqLwotICAgIGNhc2UgUDBNRDoKLSAgICBjYXNlIFAxTUQ6Ci0gICAgY2FzZSBQMk1EOgotICAgIGNhc2UgUDNNRDoKLSAgICAgIHJlYWRfb3V0cHV0X21vZGVfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QME1ELCBkZXN0LCBucl9ieXRlcyk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFBvcnQgY29udHJvbCByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFAwRElSOgotICAgIGNhc2UgUDFESVI6Ci0gICAgY2FzZSBQMkRJUjoKLSAgICBjYXNlIFAzRElSOgotICAgICAgcmVhZF9jb250cm9sX3JlZyhtZSwgaW9fcG9ydCwgaW9fcG9ydF9yZWctUDBESVIsIGRlc3QsIG5yX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogUG9ydCBwaW4gcmVnaXN0ZXJzICovCi0gICAgY2FzZSBQMElOOgotICAgIGNhc2UgUDFJTjoKLSAgICBjYXNlIFAySU46Ci0gICAgICByZWFkX3Bpbl9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLVAwSU4sIGRlc3QsIG5yX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQMlNTOgotICAgIGNhc2UgUDRTUzoKLSAgICAgIHJlYWRfZGVkaWNhdGVkX2NvbnRyb2xfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZywgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIGFkZHJlc3MiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfSAgICAgCi0KLQotc3RhdGljIHZvaWQKLXdyaXRlX291dHB1dF9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCSAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAotCQkgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCi0JCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgdW5zaWduZWQ4IGJ1ZiA9ICoodW5zaWduZWQ4ICopc291cmNlOwotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgIGlmICggaW9fcG9ydF9yZWcgPT0gMyAmJiAoYnVmICYgMHhmYykgIT0gMCApCi0JewotCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgb2YgUDNPVVQuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlvX3BvcnQtPnBvcnRbaW9fcG9ydF9yZWddLm91dHB1dCA9IGJ1ZjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFAlZE9VVC4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX291dHB1dF9tb2RlX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCi0JCSAgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCSAgICAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkOCBidWYgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayBpZiB0aGVyZSBhcmUgZmllbGRzIHdoaWNoIGNhbid0IGJlIHdyaXR0ZW4gYW5kCi0JIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGRlcGVuZGluZyB3aGF0IGJpdHMgYXJlIHNldCAqLwotICAgICAgaWYgKCAoIGlvX3BvcnRfcmVnID09IDMgJiYgKGJ1ZiAmIDB4ZmMpICE9IDAgKQotCSAgIHx8ICggKGlvX3BvcnRfcmVnID09IDAgfHwgaW9fcG9ydF9yZWcgPT0gMSkgICYmIChidWYgJiAweGZlKSAhPSAwICkgKQotCXsKLQkgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHJlYWQtb25seSBiaXRzIG9mIG91dHB1dCBtb2RlIHJlZ2lzdGVyLiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpb19wb3J0LT5wb3J0W2lvX3BvcnRfcmVnXS5vdXRwdXRfbW9kZSA9IGJ1ZjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgb2YgJWQgYnl0ZXMgdG8gUCVkTUQuIiwgbnJfYnl0ZXMsIAotCQlpb19wb3J0X3JlZyk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9jb250cm9sX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJICAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAotCQkgICB1bnNpZ25lZF93b3JkIGlvX3BvcnRfcmVnLAotCQkgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCSAgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgdW5zaWduZWQ4IGJ1ZiA9ICoodW5zaWduZWQ4ICopc291cmNlOwotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgIGlmICggaW9fcG9ydF9yZWcgPT0gMyAmJiAoYnVmICYgMHhmYykgIT0gMCApCi0JewotCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgb2YgUDNESVIuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlvX3BvcnQtPnBvcnRbaW9fcG9ydF9yZWddLmNvbnRyb2wgPSBidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCB3cml0ZSBzaXplIG9mICVkIGJ5dGVzIHRvIFAlZERJUi4iLCBucl9ieXRlcywgCi0JCWlvX3BvcnRfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2RlZGljYXRlZF9jb250cm9sX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJCSAgICAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAotCQkJICAgICB1bnNpZ25lZF93b3JkIGlvX3BvcnRfcmVnLAotCQkJICAgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgICAgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgdW5zaWduZWQ4IGJ1ZiA9ICoodW5zaWduZWQ4ICopc291cmNlOwotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgIC8qIHNlbGVjdCBvbiBpb19wb3J0X3JlZzogKi8KLSAgICAgIGlmICggaW9fcG9ydF9yZWcgPT0gUDJTUyApCi0JewotCSAgaWYgKCAoYnVmICYmIDB4ZmMpICAhPSAwICkKLQkgICAgewotCSAgICAgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHJlYWQtb25seSBiaXRzIGluIHAyc3MuIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlvX3BvcnQtPnAyc3MgPSBidWY7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCAoYnVmICYmIDB4ZjApICE9IDAgKQotCSAgICB7Ci0JICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgaW4gcDRzcy4iKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW9fcG9ydC0+cDRzcyA9IGJ1ZjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBQU1MuIiwgbnJfYnl0ZXMpOyAKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1tbjEwM2lvcF9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCi0JCQkgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCSAgaW50IHNwYWNlLAotCQkJICB1bnNpZ25lZF93b3JkIGJhc2UsCi0JCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQgPSBod19kYXRhIChtZSk7Ci0gIGVudW0gaW9fcG9ydF9yZWdpc3Rlcl90eXBlcyBpb19wb3J0X3JlZzsKLSAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKLQotICBpb19wb3J0X3JlZyA9IGRlY29kZV9hZGRyIChtZSwgaW9fcG9ydCwgYmFzZSk7Ci0gIHN3aXRjaCAoaW9fcG9ydF9yZWcpCi0gICAgewotICAgIC8qIFBvcnQgb3V0cHV0IHJlZ2lzdGVycyAqLwotICAgIGNhc2UgUDBPVVQ6Ci0gICAgY2FzZSBQMU9VVDoKLSAgICBjYXNlIFAyT1VUOgotICAgIGNhc2UgUDNPVVQ6Ci0gICAgICB3cml0ZV9vdXRwdXRfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QME9VVCwgc291cmNlLCBucl9ieXRlcyk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFBvcnQgb3V0cHV0IG1vZGUgcmVnaXN0ZXJzICovCi0gICAgY2FzZSBQME1EOgotICAgIGNhc2UgUDFNRDoKLSAgICBjYXNlIFAyTUQ6Ci0gICAgY2FzZSBQM01EOgotICAgICAgd3JpdGVfb3V0cHV0X21vZGVfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QME1ELCBzb3VyY2UsIG5yX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogUG9ydCBjb250cm9sIHJlZ2lzdGVycyAqLwotICAgIGNhc2UgUDBESVI6Ci0gICAgY2FzZSBQMURJUjoKLSAgICBjYXNlIFAyRElSOgotICAgIGNhc2UgUDNESVI6Ci0gICAgICB3cml0ZV9jb250cm9sX3JlZyhtZSwgaW9fcG9ydCwgaW9fcG9ydF9yZWctUDBESVIsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBQb3J0IHBpbiByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFAwSU46Ci0gICAgY2FzZSBQMUlOOgotICAgIGNhc2UgUDJJTjoKLSAgICAgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHBpbiByZWdpc3Rlci4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQMlNTOgotICAgIGNhc2UgUDRTUzoKLSAgICAgIHdyaXRlX2RlZGljYXRlZF9jb250cm9sX3JlZyhtZSwgaW9fcG9ydCwgaW9fcG9ydF9yZWcsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIGFkZHJlc3MiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfSAgICAgCi0KLQotY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfbW4xMDNpb3BfZGVzY3JpcHRvcltdID0gewotICB7ICJtbjEwM2lvcCIsIG1uMTAzaW9wX2ZpbmlzaCwgfSwKLSAgeyBOVUxMIH0sCi19OwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZHYtbW4xMDNzZXIuYyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjBlZDEuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvZHYtbW4xMDNzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJody1tYWluLmgiCi0jaW5jbHVkZSAiZHYtc29ja3Nlci5oIgotCi0KLS8qIERFVklDRQotCi0gICAKLSAgIG1uMTAzc2VyIC0gbW4xMDMwMDIgc2VyaWFsIGRldmljZXMgMCwgMSBhbmQgMi4KLQotICAgCi0gICBERVNDUklQVElPTgotICAgCi0gICBJbXBsZW1lbnRzIHRoZSBtbjEwMzAwMiBzZXJpYWwgaW50ZXJmYWNlcyBhcyBkZXNjcmliZWQgaW4gdGhlCi0gICBtbjEwMzAwMiB1c2VyIGd1aWRlLiAKLQotCi0gICBQUk9QRVJUSUVTICAgCi0KLSAgIHJlZyA9IDxzZXJpYWwtYWRkcj4gPHNlcmlhbC1zaXplPgotCi0KLSAgIEJVR1MKLQotICAgKi8KLQotCi0vKiBUaGUgc2VyaWFsIGRldmljZXMnIHJlZ2lzdGVycycgYWRkcmVzcyBibG9jayAqLwotCi1zdHJ1Y3QgbW4xMDNzZXJfYmxvY2sgewotICB1bnNpZ25lZF93b3JkIGJhc2U7Ci0gIHVuc2lnbmVkX3dvcmQgYm91bmQ7Ci19OwotCi0KLQotZW51bSBzZXJpYWxfcmVnaXN0ZXJfdHlwZXMgewotICAgIFNDMENUUiwKLSAgICBTQzFDVFIsCi0gICAgU0MyQ1RSLAotICAgIFNDMElDUiwKLSAgICBTQzFJQ1IsCi0gICAgU0MySUNSLAotICAgIFNDMFRYQiwKLSAgICBTQzFUWEIsCi0gICAgU0MyVFhCLAotICAgIFNDMFJYQiwKLSAgICBTQzFSWEIsCi0gICAgU0MyUlhCLAotICAgIFNDMFNUUiwKLSAgICBTQzFTVFIsCi0gICAgU0MyU1RSLAotICAgIFNDMlRJTSwKLX07Ci0KLQotLyogQWNjZXNzIGR2LXNvY2tzZXIgc3RhdGUgKi8KLWV4dGVybiBjaGFyKiBzb2Nrc2VyX2FkZHI7Ci0jZGVmaW5lIFVTRV9TT0NLU0VSX1AgKHNvY2tzZXJfYWRkciAhPSBOVUxMKQotCi0KLSNkZWZpbmUgTlJfU0VSSUFMX0RFVlMgIDMKLSNkZWZpbmUgU0lPX1NUQVRfUlJEWSAweDAwMTAKLQotdHlwZWRlZiBzdHJ1Y3QgX21uMTAzMDBfc2VyaWFsIHsKLSAgdW5zaWduZWQxNiBzdGF0dXMsIGNvbnRyb2w7Ci0gIHVuc2lnbmVkOCAgdHhiLCByeGIsIGludG1vZGU7Ci0gIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7Ci19IG1uMTAzMDBfc2VyaWFsOwotCi0KLQotc3RydWN0IG1uMTAzc2VyIHsKLSAgc3RydWN0IG1uMTAzc2VyX2Jsb2NrIGJsb2NrOwotICBtbjEwMzAwX3NlcmlhbCBkZXZpY2VbTlJfU0VSSUFMX0RFVlNdOwotICB1bnNpZ25lZDggICAgICBzZXJpYWwyX3RpbWVyX3JlZzsKLSAgZG9faHdfcG9sbF9yZWFkX21ldGhvZCAqcmVhZGVyOwotfTsKLQotLyogb3V0cHV0IHBvcnQgSUQncyAqLwotCi0vKiBmb3IgbW4xMDMwMDIgKi8KLWVudW0gewotICBTRVJJQUwwX1JFQ0VJVkUsCi0gIFNFUklBTDFfUkVDRUlWRSwKLSAgU0VSSUFMMl9SRUNFSVZFLAotICBTRVJJQUwwX1NFTkQsCi0gIFNFUklBTDFfU0VORCwKLSAgU0VSSUFMMl9TRU5ELAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBtbjEwM3Nlcl9wb3J0c1tdID0gewotCi0gIHsgInNlcmlhbC0wLXJlY2VpdmUiLCAgU0VSSUFMMF9SRUNFSVZFLCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAic2VyaWFsLTEtcmVjZWl2ZSIsICBTRVJJQUwxX1JFQ0VJVkUsIDAsIG91dHB1dF9wb3J0LCB9LAotICB7ICJzZXJpYWwtMi1yZWNlaXZlIiwgIFNFUklBTDJfUkVDRUlWRSwgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgInNlcmlhbC0wLXRyYW5zbWl0IiwgU0VSSUFMMF9TRU5ELCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAic2VyaWFsLTEtdHJhbnNtaXQiLCBTRVJJQUwxX1NFTkQsIDAsIG91dHB1dF9wb3J0LCB9LAotICB7ICJzZXJpYWwtMi10cmFuc21pdCIsIFNFUklBTDJfU0VORCwgMCwgb3V0cHV0X3BvcnQsIH0sCi0KLSAgeyBOVUxMLCB9LAotfTsKLQotCi0KLS8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKLSAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCi0KLXN0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgbW4xMDNzZXJfaW9fcmVhZF9idWZmZXI7Ci1zdGF0aWMgaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCBtbjEwM3Nlcl9pb193cml0ZV9idWZmZXI7Ci0KLXN0YXRpYyB2b2lkCi1hdHRhY2hfbW4xMDNzZXJfcmVncyAoc3RydWN0IGh3ICptZSwKLQkJICAgICAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwpCi17Ci0gIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7Ci0gIGludCBhdHRhY2hfc3BhY2U7Ci0gIHVuc2lnbmVkIGF0dGFjaF9zaXplOwotICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0KLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLQotICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIDAsICZyZWcpKQotICAgIGh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIHRocmVlIGFkZHIvc2l6ZSBlbnRyaWVzIik7Ci0gIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCi0JCQkJICAgICAmcmVnLmFkZHJlc3MsCi0JCQkJICAgICAmYXR0YWNoX3NwYWNlLAotCQkJCSAgICAgJmF0dGFjaF9hZGRyZXNzLAotCQkJCSAgICAgbWUpOwotICBzZXJpYWwtPmJsb2NrLmJhc2UgPSBhdHRhY2hfYWRkcmVzczsKLSAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKLQkJCSAgICAgICAmcmVnLnNpemUsCi0JCQkgICAgICAgJmF0dGFjaF9zaXplLCBtZSk7Ci0gIHNlcmlhbC0+YmxvY2suYm91bmQgPSBhdHRhY2hfYWRkcmVzcyArIChhdHRhY2hfc2l6ZSAtIDEpOwotICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCi0JCSAgICAgMCwKLQkJICAgICBhdHRhY2hfc3BhY2UsIGF0dGFjaF9hZGRyZXNzLCBhdHRhY2hfc2l6ZSwKLQkJICAgICBtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbjEwM3Nlcl9maW5pc2ggKHN0cnVjdCBodyAqbWUpCi17Ci0gIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsOwotICBpbnQgaTsKLQotICBzZXJpYWwgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgbW4xMDNzZXIpOwotICBzZXRfaHdfZGF0YSAobWUsIHNlcmlhbCk7Ci0gIHNldF9od19pb19yZWFkX2J1ZmZlciAobWUsIG1uMTAzc2VyX2lvX3JlYWRfYnVmZmVyKTsKLSAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIG1uMTAzc2VyX2lvX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od19wb3J0cyAobWUsIG1uMTAzc2VyX3BvcnRzKTsKLQotICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBhdHRhY2hfbW4xMDNzZXJfcmVncyAobWUsIHNlcmlhbCk7Ci0KLSAgLyogSWYgc28gY29uZmlndXJlZCwgZW5hYmxlIHBvbGxlZCBpbnB1dCAqLwotICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJwb2xsPyIpICE9IE5VTEwKLSAgICAgICYmIGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAobWUsICJwb2xsPyIpKQotICAgIHsKLSAgICAgIHNlcmlhbC0+cmVhZGVyID0gc2ltX2lvX3BvbGxfcmVhZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZXJpYWwtPnJlYWRlciA9IHNpbV9pb19yZWFkOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBzZXJpYWwgZGV2aWNlIHJlZ2lzdGVycy4gKi8KLSAgZm9yICggaT0wOyBpPE5SX1NFUklBTF9ERVZTOyArK2kgKQotICAgIHsKLSAgICAgIHNlcmlhbC0+ZGV2aWNlW2ldLnR4YiA9IDA7Ci0gICAgICBzZXJpYWwtPmRldmljZVtpXS5yeGIgPSAwOwotICAgICAgc2VyaWFsLT5kZXZpY2VbaV0uc3RhdHVzID0gMDsKLSAgICAgIHNlcmlhbC0+ZGV2aWNlW2ldLmNvbnRyb2wgPSAwOwotICAgICAgc2VyaWFsLT5kZXZpY2VbaV0uaW50bW9kZSA9IDA7Ci0gICAgICBzZXJpYWwtPmRldmljZVtpXS5ldmVudCA9IE5VTEw7Ci0gICAgfQotfQotCi0KLS8qIHJlYWQgYW5kIHdyaXRlICovCi0KLXN0YXRpYyBpbnQKLWRlY29kZV9hZGRyIChzdHJ1Y3QgaHcgKm1lLAotCSAgICAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCi0JICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MpCi17Ci0gIHVuc2lnbmVkX3dvcmQgb2Zmc2V0OwotICBvZmZzZXQgPSBhZGRyZXNzIC0gc2VyaWFsLT5ibG9jay5iYXNlOwotICBzd2l0Y2ggKG9mZnNldCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOiByZXR1cm4gU0MwQ1RSOwotICAgIGNhc2UgMHgwNDogcmV0dXJuIFNDMElDUjsKLSAgICBjYXNlIDB4MDg6IHJldHVybiBTQzBUWEI7Ci0gICAgY2FzZSAweDA5OiByZXR1cm4gU0MwUlhCOwotICAgIGNhc2UgMHgwQzogcmV0dXJuIFNDMFNUUjsKLSAgICBjYXNlIDB4MTA6IHJldHVybiBTQzFDVFI7Ci0gICAgY2FzZSAweDE0OiByZXR1cm4gU0MxSUNSOwotICAgIGNhc2UgMHgxODogcmV0dXJuIFNDMVRYQjsKLSAgICBjYXNlIDB4MTk6IHJldHVybiBTQzFSWEI7Ci0gICAgY2FzZSAweDFDOiByZXR1cm4gU0MxU1RSOwotICAgIGNhc2UgMHgyMDogcmV0dXJuIFNDMkNUUjsKLSAgICBjYXNlIDB4MjQ6IHJldHVybiBTQzJJQ1I7Ci0gICAgY2FzZSAweDI4OiByZXR1cm4gU0MyVFhCOwotICAgIGNhc2UgMHgyOTogcmV0dXJuIFNDMlJYQjsKLSAgICBjYXNlIDB4MkM6IHJldHVybiBTQzJTVFI7Ci0gICAgY2FzZSAweDJEOiByZXR1cm4gU0MyVElNOwotICAgIGRlZmF1bHQ6IAotICAgICAgewotCWh3X2Fib3J0IChtZSwgImJhZCBhZGRyZXNzIik7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX3BvbGxpbmdfZXZlbnQgKHN0cnVjdCBodyAqbWUsCi0JCSAgdm9pZCAqZGF0YSkKLXsKLSAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwgPSBod19kYXRhKG1lKTsKLSAgaW50IHNlcmlhbF9yZWcgPSAoaW50KSBkYXRhOwotICBjaGFyIGM7Ci0gIGludCBjb3VudDsKLQotICBpZihVU0VfU09DS1NFUl9QKQotICAgIHsKLSAgICAgIGludCByZDsKLSAgICAgIHJkID0gZHZfc29ja3Nlcl9yZWFkIChod19zeXN0ZW0gKG1lKSk7Ci0gICAgICBpZihyZCAhPSAtMSkKLQl7Ci0JICBjID0gKGNoYXIpIHJkOwotCSAgY291bnQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb3VudCA9IEhXX0lPX05PVF9SRUFEWTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY291bnQgPSBkb19od19wb2xsX3JlYWQgKG1lLCBzZXJpYWwtPnJlYWRlciwKLQkJCSAgICAgICAwLypTVERJTiovLCAmYywgc2l6ZW9mKGMpKTsKLSAgICB9Ci0KLQotICBzd2l0Y2ggKGNvdW50KQotICAgIHsKLSAgICBjYXNlIEhXX0lPX05PVF9SRUFEWToKLSAgICBjYXNlIEhXX0lPX0VPRjoKLSAgICAgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnJ4YiA9IDA7Ci0gICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMgJj0gflNJT19TVEFUX1JSRFk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10ucnhiID0gYzsKLSAgICAgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnN0YXR1cyB8PSBTSU9fU1RBVF9SUkRZOwotICAgICAgaHdfcG9ydF9ldmVudCAobWUsIHNlcmlhbF9yZWcrU0VSSUFMMF9SRUNFSVZFLCAxKTsKLSAgICB9Ci0KLSAgLyogU2NoZWR1bGUgbmV4dCBwb2xsaW5nIGV2ZW50ICovCi0gIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmV2ZW50Ci0gICAgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEwMDAsCi0JCQkgICAgICAgZG9fcG9sbGluZ19ldmVudCwgKHZvaWQgKilzZXJpYWxfcmVnKTsKLQotfQotCi1zdGF0aWMgdm9pZAotcmVhZF9jb250cm9sX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKLQkJICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCi0JCSAgdm9pZCAqZGVzdCwKLQkJICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIC8qIHJlYWxseSBhbGxvdyAxIGJ5dGUgcmVhZCwgdG9vICovCi0gIGlmICggbnJfYnl0ZXMgPT0gMiApCi0gICAgewotICAgICAgKih1bnNpZ25lZDE2ICopZGVzdCA9IEgyTEVfMiAoc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uY29udHJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFNDJWRDVFIuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfaW50bW9kZV9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCSAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCi0JCSAgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAotCQkgIHZvaWQgKmRlc3QsCi0JCSAgdW5zaWduZWQgIG5yX2J5dGVzKQotewotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9IHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmludG1vZGU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFNDJWRJQ1IuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfdHhiIChzdHJ1Y3QgaHcgKm1lLAotCSAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCi0JICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCi0JICB2b2lkICpkZXN0LAotCSAgdW5zaWduZWQgIG5yX2J5dGVzKQotewotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9IHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnR4YjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIGZyb20gU0MlZFRYQi4iLCBucl9ieXRlcywgCi0JCXNlcmlhbF9yZWcpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcmVhZF9yeGIgKHN0cnVjdCBodyAqbWUsCi0JICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKLQkgIHVuc2lnbmVkX3dvcmQgc2VyaWFsX3JlZywKLQkgIHZvaWQgKmRlc3QsCi0JICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIGlmICggbnJfYnl0ZXMgPT0gMSApCi0gICAgewotICAgICAgKih1bnNpZ25lZDggKilkZXN0ID0gc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10ucnhiOwotICAgICAgLyogUmVjZXB0aW9uIGJ1ZmZlciBpcyBub3cgZW1wdHkuICovCi0gICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMgJj0gflNJT19TVEFUX1JSRFk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFNDJWRSWEIuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfc3RhdHVzX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAotCQkgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAotCQkgdm9pZCAqZGVzdCwKLQkJIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgY2hhciBjOwotICBpbnQgY291bnQ7Ci0KLSAgaWYgKCAoc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uc3RhdHVzICYgU0lPX1NUQVRfUlJEWSkgPT0gMCApCi0gICAgewotICAgICAgLyogRklGTyBpcyBlbXB0eSAqLwotICAgICAgLyogS2lsbCBjdXJyZW50IHBvbGwgZXZlbnQgKi8KLSAgICAgIGlmICggTlVMTCAhPSBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5ldmVudCApCi0JewotCSAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmV2ZW50KTsKLQkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmV2ZW50ID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmKFVTRV9TT0NLU0VSX1ApCi0JewotCSAgaW50IHJkOwotCSAgcmQgPSBkdl9zb2Nrc2VyX3JlYWQgKGh3X3N5c3RlbSAobWUpKTsKLQkgIGlmKHJkICE9IC0xKQotCSAgICB7Ci0JICAgICAgYyA9IChjaGFyKSByZDsKLQkgICAgICBjb3VudCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvdW50ID0gSFdfSU9fTk9UX1JFQURZOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvdW50ID0gZG9faHdfcG9sbF9yZWFkIChtZSwgc2VyaWFsLT5yZWFkZXIsCi0JCQkJICAgMC8qU1RESU4qLywgJmMsIHNpemVvZihjKSk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGNvdW50KQotCXsKLQljYXNlIEhXX0lPX05PVF9SRUFEWToKLQljYXNlIEhXX0lPX0VPRjoKLQkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnJ4YiA9IDA7Ci0JICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMgJj0gflNJT19TVEFUX1JSRFk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10ucnhiID0gYzsKLQkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnN0YXR1cyB8PSBTSU9fU1RBVF9SUkRZOwotCSAgaHdfcG9ydF9ldmVudCAobWUsIHNlcmlhbF9yZWcrU0VSSUFMMF9SRUNFSVZFLCAxKTsKLQl9Ci0KLSAgICAgIC8qIHNjaGVkdWxlIHBvbGxpbmcgZXZlbnQgKi8KLSAgICAgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmV2ZW50Ci0JPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEwMDAsCi0JCQkJICAgZG9fcG9sbGluZ19ldmVudCwKLQkJCQkgICAodm9pZCAqKXNlcmlhbF9yZWcpOwotICAgIH0KLQotICBpZiAoIG5yX2J5dGVzID09IDEgKQotICAgIHsKLSAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9ICh1bnNpZ25lZDgpc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uc3RhdHVzOwotICAgIH0KLSAgZWxzZSBpZiAoIG5yX2J5dGVzID09IDIgJiYgc2VyaWFsX3JlZyAhPSBTQzJTVFIgKQotICAgIHsKLSAgICAgICoodW5zaWduZWQxNiAqKWRlc3QgPSBIMkxFXzIgKHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnN0YXR1cyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFNDJWRTVFIuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfc2VyaWFsMl90aW1lcl9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCQlzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKLQkJCXZvaWQgKmRlc3QsCi0JCQl1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIGlmICggbnJfYnl0ZXMgPT0gMSApCi0gICAgewotICAgICAgKiAodW5zaWduZWQ4ICopIGRlc3QgPSAodW5zaWduZWQ4KSBzZXJpYWwtPnNlcmlhbDJfdGltZXJfcmVnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgdG8gU0MyVElNLiIsIG5yX2J5dGVzKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1tbjEwM3Nlcl9pb19yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSB2b2lkICpkZXN0LAotCQkJIGludCBzcGFjZSwKLQkJCSB1bnNpZ25lZF93b3JkIGJhc2UsCi0JCQkgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsID0gaHdfZGF0YSAobWUpOwotICBlbnVtIHNlcmlhbF9yZWdpc3Rlcl90eXBlcyBzZXJpYWxfcmVnOwotICBIV19UUkFDRSAoKG1lLCAicmVhZCAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7Ci0KLSAgc2VyaWFsX3JlZyA9IGRlY29kZV9hZGRyIChtZSwgc2VyaWFsLCBiYXNlKTsKLSAgc3dpdGNoIChzZXJpYWxfcmVnKQotICAgIHsKLSAgICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICAgIGNhc2UgU0MwQ1RSOgotICAgIGNhc2UgU0MxQ1RSOgotICAgIGNhc2UgU0MyQ1RSOgotICAgICAgcmVhZF9jb250cm9sX3JlZyhtZSwgc2VyaWFsLCBzZXJpYWxfcmVnLVNDMENUUiwgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInJlYWQgLSBjdHJsIHJlZyVkIGhhcyAweCV4XG4iLCBzZXJpYWxfcmVnLVNDMENUUiwKLQkJICoodW5zaWduZWQ4ICopZGVzdCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBpbnRlcnJ1cHQgbW9kZSByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFNDMElDUjoKLSAgICBjYXNlIFNDMUlDUjoKLSAgICBjYXNlIFNDMklDUjoKLSAgICAgIHJlYWRfaW50bW9kZV9yZWcobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBJQ1IsIGRlc3QsIG5yX2J5dGVzKTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gaW50bW9kZSByZWclZCBoYXMgMHgleFxuIiwgc2VyaWFsX3JlZy1TQzBJQ1IsCi0JCSAqKHVuc2lnbmVkOCAqKWRlc3QpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogdHJhbnNtaXNzaW9uIGJ1ZmZlcnMgKi8KLSAgICBjYXNlIFNDMFRYQjoKLSAgICBjYXNlIFNDMVRYQjoKLSAgICBjYXNlIFNDMlRYQjoKLSAgICAgIHJlYWRfdHhiKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwVFhCLCBkZXN0LCBucl9ieXRlcyk7Ci0gICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIHR4YiVkIGhhcyAlY1xuIiwgc2VyaWFsX3JlZy1TQzBUWEIsCi0JCSAqKGNoYXIgKilkZXN0KSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIHJlY2VwdGlvbiBidWZmZXJzICovCi0gICAgY2FzZSBTQzBSWEI6IAotICAgIGNhc2UgU0MxUlhCOgotICAgIGNhc2UgU0MyUlhCOgotICAgICAgcmVhZF9yeGIobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBSWEIsIGRlc3QsIG5yX2J5dGVzKTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gcnhiJWQgaGFzICVjXG4iLCBzZXJpYWxfcmVnLVNDMFJYQiwKLQkJICooY2hhciAqKWRlc3QpKTsKLSAgICAgYnJlYWs7Ci0KLSAgICAvKiBzdGF0dXMgcmVnaXN0ZXJzICovCi0gICAgY2FzZSBTQzBTVFI6IAotICAgIGNhc2UgU0MxU1RSOiAKLSAgICBjYXNlIFNDMlNUUjogCi0gICAgICByZWFkX3N0YXR1c19yZWcobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBTVFIsIGRlc3QsIG5yX2J5dGVzKTsKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gc3RhdHVzIHJlZyVkIGhhcyAweCV4XG4iLCBzZXJpYWxfcmVnLVNDMFNUUiwKLQkJICoodW5zaWduZWQ4ICopZGVzdCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNDMlRJTToKLSAgICAgIHJlYWRfc2VyaWFsMl90aW1lcl9yZWcobWUsIHNlcmlhbCwgZGVzdCwgbnJfYnl0ZXMpOwotICAgICAgSFdfVFJBQ0UgKChtZSwgInJlYWQgLSBzZXJpYWwyIHRpbWVyIHJlZyAlZFxuIiwgKih1bnNpZ25lZDggKilkZXN0KSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBod19hYm9ydChtZSwgImludmFsaWQgYWRkcmVzcyIpOwotICAgIH0KLQotICByZXR1cm4gbnJfYnl0ZXM7Ci19ICAgICAKLQotCi1zdGF0aWMgdm9pZAotd3JpdGVfY29udHJvbF9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCSAgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAotCQkgICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCi0JCSAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJICAgdW5zaWduZWQgIG5yX2J5dGVzKQotewotICB1bnNpZ25lZDE2IHZhbCA9IExFMkhfMiAoKih1bnNpZ25lZDE2ICopc291cmNlKTsKLQotICAvKiByZWFsbHkgYWxsb3cgMSBieXRlIHdyaXRlLCB0b28gKi8KLSAgaWYgKCBucl9ieXRlcyA9PSAyICkKLSAgICB7Ci0gICAgICBpZiAoIHNlcmlhbF9yZWcgPT0gMiAmJiAodmFsICYgMHgwQzA0KSAhPSAwICkKLQl7Ci0JICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBvZiBTQzJDVFIuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmNvbnRyb2wgPSB2YWw7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgZnJvbSBTQyVkU1RSLiIsIG5yX2J5dGVzLCAKLQkJc2VyaWFsX3JlZyk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9pbnRtb2RlX3JlZyAoc3RydWN0IGh3ICptZSwKLQkJICAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCi0JCSAgIHVuc2lnbmVkX3dvcmQgc2VyaWFsX3JlZywKLQkJICAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci11bnNpZ25lZDggdmFsID0gKih1bnNpZ25lZDggKilzb3VyY2U7Ci0KLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICAvKiBDaGVjayBmb3IgYXR0ZW1wdCB0byB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBvZiByZWdpc3Rlci4gKi8KLSAgICAgIGlmICggKCBzZXJpYWxfcmVnID09IDIgJiYgKHZhbCAmIDB4Q0EpICE9IDAgKQotCSAgIHx8ICggc2VyaWFsX3JlZyAhPSAyICYmICh2YWwgJiAweDRBKSAhPSAwICkgKQotCXsKLQkgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHJlYWQtb25seSBiaXRzIG9mIFNDJWRJQ1IuIiwKLQkJICAgc2VyaWFsX3JlZyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmludG1vZGUgPSB2YWw7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCB3cml0ZSBzaXplIG9mICVkIGJ5dGVzIHRvIFNDJWRJQ1IuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3R4YiAoc3RydWN0IGh3ICptZSwKLQkgICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKLQkgICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCi0JICAgY29uc3Qgdm9pZCAqc291cmNlLAotCSAgIHVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgaWYgKCBucl9ieXRlcyA9PSAxICkKLSAgICB7Ci0gICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS50eGIgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKLQotICAgICAgaWYoVVNFX1NPQ0tTRVJfUCkKLQl7Ci0JICBkdl9zb2Nrc2VyX3dyaXRlKGh3X3N5c3RlbSAobWUpLCAqIChjaGFyKikgc291cmNlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2ltX2lvX3dyaXRlX3N0ZG91dChod19zeXN0ZW0gKG1lKSwgKGNoYXIgKilzb3VyY2UsIDEpOwotCSAgc2ltX2lvX2ZsdXNoX3N0ZG91dChod19zeXN0ZW0gKG1lKSk7Ci0JfQotCi0gICAgICBod19wb3J0X2V2ZW50IChtZSwgc2VyaWFsX3JlZytTRVJJQUwwX1NFTkQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCB3cml0ZSBzaXplIG9mICVkIGJ5dGVzIHRvIFNDJWRUWEIuIiwgbnJfYnl0ZXMsIAotCQlzZXJpYWxfcmVnKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3NlcmlhbDJfdGltZXJfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCQkJIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAotCQkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCSB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIGlmICggbnJfYnl0ZXMgPT0gMSApCi0gICAgewotICAgICAgc2VyaWFsLT5zZXJpYWwyX3RpbWVyX3JlZyA9ICoodW5zaWduZWQ4ICopc291cmNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCB3cml0ZSBzaXplIG9mICVkIGJ5dGVzIHRvIFNDMlRJTS4iLCBucl9ieXRlcyk7IAotICAgIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLW1uMTAzc2VyX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsID0gaHdfZGF0YSAobWUpOwotICBlbnVtIHNlcmlhbF9yZWdpc3Rlcl90eXBlcyBzZXJpYWxfcmVnOwotICBIV19UUkFDRSAoKG1lLCAid3JpdGUgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOwotCi0gIHNlcmlhbF9yZWcgPSBkZWNvZGVfYWRkciAobWUsIHNlcmlhbCwgYmFzZSk7Ci0gIHN3aXRjaCAoc2VyaWFsX3JlZykKLSAgICB7Ci0gICAgLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFNDMENUUjoKLSAgICBjYXNlIFNDMUNUUjoKLSAgICBjYXNlIFNDMkNUUjoKLSAgICAgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIGN0cmwgcmVnJWQgaGFzIDB4JXgsIG5yYnl0ZXM9JWQuXG4iLAotCQkgc2VyaWFsX3JlZy1TQzBDVFIsICoodW5zaWduZWQ4ICopc291cmNlLCBucl9ieXRlcykpOwotICAgICAgd3JpdGVfY29udHJvbF9yZWcobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBDVFIsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBpbnRlcnJ1cHQgbW9kZSByZWdpc3RlcnMgKi8KLSAgICBjYXNlIFNDMElDUjoKLSAgICBjYXNlIFNDMUlDUjoKLSAgICBjYXNlIFNDMklDUjoKLSAgICAgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIGludG1vZGUgcmVnJWQgaGFzIDB4JXgsIG5yYnl0ZXM9JWQuXG4iLAotCQkgc2VyaWFsX3JlZy1TQzBJQ1IsICoodW5zaWduZWQ4ICopc291cmNlLCBucl9ieXRlcykpOwotICAgICAgd3JpdGVfaW50bW9kZV9yZWcobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBJQ1IsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiB0cmFuc21pc3Npb24gYnVmZmVycyAqLwotICAgIGNhc2UgU0MwVFhCOgotICAgIGNhc2UgU0MxVFhCOgotICAgIGNhc2UgU0MyVFhCOgotICAgICAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gdHhiJWQgaGFzICVjLCBucmJ5dGVzPSVkLlxuIiwKLQkJIHNlcmlhbF9yZWctU0MwVFhCLCAqKGNoYXIgKilzb3VyY2UsIG5yX2J5dGVzKSk7Ci0gICAgICB3cml0ZV90eGIobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBUWEIsIHNvdXJjZSwgbnJfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiByZWNlcHRpb24gYnVmZmVycyAqLwotICAgIGNhc2UgU0MwUlhCOiAKLSAgICBjYXNlIFNDMVJYQjoKLSAgICBjYXNlIFNDMlJYQjoKLSAgICAgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHJlY2VwdGlvbiBidWZmZXIuIik7Ci0gICAgIGJyZWFrOwotCi0gICAgLyogc3RhdHVzIHJlZ2lzdGVycyAqLwotICAgIGNhc2UgU0MwU1RSOiAKLSAgICBjYXNlIFNDMVNUUjogCi0gICAgY2FzZSBTQzJTVFI6IAotICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gc3RhdHVzIHJlZ2lzdGVyLiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNDMlRJTToKLSAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gc2VyaWFsMiB0aW1lciByZWcgJWQgKG5yYnl0ZXM9JWQpXG4iLAotCQkgKih1bnNpZ25lZDggKilzb3VyY2UsIG5yX2J5dGVzKSk7Ci0gICAgICB3cml0ZV9zZXJpYWwyX3RpbWVyX3JlZyhtZSwgc2VyaWFsLCBzb3VyY2UsIG5yX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGh3X2Fib3J0KG1lLCAiaW52YWxpZCBhZGRyZXNzIik7Ci0gICAgfQotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi0KLWNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X21uMTAzc2VyX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAibW4xMDNzZXIiLCBtbjEwM3Nlcl9maW5pc2gsIH0sCi0gIHsgTlVMTCB9LAotfTsKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL2R2LW1uMTAzdGltLmMgYi9zaW0vbW4xMDMwMC9kdi1tbjEwM3RpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc5ZjkxLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMzAwL2R2LW1uMTAzdGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLSNpbmNsdWRlICJzaW0tbWFpbi5oIgotI2luY2x1ZGUgImh3LW1haW4uaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLS8qIERFVklDRQotCi0gICAKLSAgIG1uMTAzdGltIC0gbW4xMDMwMDIgdGltZXJzICg4IGFuZCAxNiBiaXQpCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLSAgIAotICAgSW1wbGVtZW50cyB0aGUgbW4xMDMwMDIgOCBhbmQgMTYgYml0IHRpbWVycyBhcyBkZXNjcmliZWQgaW4gdGhlIG1uMTAzMDAyIHVzZXIgZ3VpZGUuCi0KLQotICAgUFJPUEVSVElFUyAgIAotCi0gICByZWcgPSA8OGJpdC10aW1lcnMtYWRkcj4gPDhiaXQtdGltZXJzLXNpemU+IDwxNmJpdC10aW1lcnMtYWRkcj4gPDE2Yml0LXRpbWVycy1zaXplPgotCi0KLSAgIEJVR1MKLQotICAgKi8KLQotCi0vKiBUaGUgdGltZXJzJyByZWdpc3RlciBhZGRyZXNzIGJsb2NrcyAqLwotCi1zdHJ1Y3QgbW4xMDN0aW1fYmxvY2sgewotICB1bnNpZ25lZF93b3JkIGJhc2U7Ci0gIHVuc2lnbmVkX3dvcmQgYm91bmQ7Ci19OwotCi1lbnVtIHsgVElNRVI4X0JMT0NLLCBUSU1FUjE2X0JMT0NLLCBOUl9USU1FUl9CTE9DS1MgfTsKLQotZW51bSB0aW1lcl9yZWdpc3Rlcl90eXBlcyB7Ci0gIEZJUlNUX01PREVfUkVHID0gMCwKLSAgVE0wTUQgPSBGSVJTVF9NT0RFX1JFRywKLSAgVE0xTUQsCi0gIFRNMk1ELAotICBUTTNNRCwKLSAgVE00TUQsCi0gIFRNNU1ELAotICBUTTZNRCwKLSAgTEFTVF9NT0RFX1JFRyA9IFRNNk1ELAotICBGSVJTVF9CQVNFX1JFRywKLSAgVE0wQlIgPSBGSVJTVF9CQVNFX1JFRywKLSAgVE0xQlIsCi0gIFRNMkJSLAotICBUTTNCUiwKLSAgVE00QlIsCi0gIFRNNUJSLAotICBMQVNUX0JBU0VfUkVHID0gVE01QlIsCi0gIEZJUlNUX0NPVU5URVIsCi0gIFRNMEJDID0gRklSU1RfQ09VTlRFUiwKLSAgVE0xQkMsCi0gIFRNMkJDLAotICBUTTNCQywKLSAgVE00QkMsCi0gIFRNNUJDLAotICBUTTZCQywKLSAgTEFTVF9DT1VOVEVSID0gVE02QkMsCi0gIFRNNk1EQSwKLSAgVE02TURCLAotICBUTTZDQSwKLSAgVE02Q0IsCi0gIExBU1RfVElNRVJfUkVHID0gVE02QkMsCi19OwotCi0KLS8qIERvbid0IGluY2x1ZGUgdGltZXIgNiBiZWNhdXNlIGl0J3MgaGFuZGxlZCBzcGVjaWFsbHkuICovCi0jZGVmaW5lIE5SXzhCSVRfVElNRVJTIDQKLSNkZWZpbmUgTlJfMTZCSVRfVElNRVJTIDIKLSNkZWZpbmUgTlJfUkVHX1RJTUVSUyA2IC8qIEV4Y2x1ZGUgdGltZXIgNiAtIGl0J3MgaGFuZGxlZCBzcGVjaWFsbHkuICovCi0jZGVmaW5lIE5SX1RJTUVSUyA3Ci0KLXR5cGVkZWYgc3RydWN0IF9tbjEwMzAwX3RpbWVyX3JlZ3MgewotICB1bnNpZ25lZDMyIGJhc2U7Ci0gIHVuc2lnbmVkOCAgbW9kZTsKLX0gbW4xMDMwMF90aW1lcl9yZWdzOwotCi10eXBlZGVmIHN0cnVjdCBfbW4xMDMwMF90aW1lciB7Ci0gIHVuc2lnbmVkMzIgZGl2X3JhdGlvLCBzdGFydDsKLSAgc3RydWN0IGh3X2V2ZW50ICpldmVudDsKLX0gbW4xMDMwMF90aW1lcjsKLQotCi1zdHJ1Y3QgbW4xMDN0aW0gewotICBzdHJ1Y3QgbW4xMDN0aW1fYmxvY2sgYmxvY2tbTlJfVElNRVJfQkxPQ0tTXTsKLSAgbW4xMDMwMF90aW1lcl9yZWdzIHJlZ1tOUl9SRUdfVElNRVJTXTsKLSAgbW4xMDMwMF90aW1lciB0aW1lcltOUl9USU1FUlNdOwotCi0gIC8qIHRyZWF0IHRpbWVyIDYgcmVnaXN0ZXJzIHNwZWNpYWxseS4gKi8KLSAgdW5zaWduZWQxNiAgIHRtNm1kMCwgdG02bWQxLCB0bTZiYywgdG02Y2EsIHRtNmNiOyAKLSAgdW5zaWduZWQ4ICB0bTZtZGEsIHRtNm1kYjsgIC8qIGNvbXBhcmUvY2FwdHVyZSBtb2RlIHJlZ3MgZm9yIHRpbWVyIDYgKi8KLX07Ci0KLS8qIG91dHB1dCBwb3J0IElEJ3MgKi8KLQotLyogZm9yIG1uMTAzMDAyICovCi1lbnVtIHsKLSAgVElNRVIwX1VGTE9XLAotICBUSU1FUjFfVUZMT1csCi0gIFRJTUVSMl9VRkxPVywKLSAgVElNRVIzX1VGTE9XLAotICBUSU1FUjRfVUZMT1csCi0gIFRJTUVSNV9VRkxPVywKLSAgVElNRVI2X1VGTE9XLAotICBUSU1FUjZfQ01QQSwKLSAgVElNRVI2X0NNUEIsCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIG1uMTAzdGltX3BvcnRzW10gPSB7Ci0KLSAgeyAidGltZXItMC11bmRlcmZsb3ciLCBUSU1FUjBfVUZMT1csIDAsIG91dHB1dF9wb3J0LCB9LAotICB7ICJ0aW1lci0xLXVuZGVyZmxvdyIsIFRJTUVSMV9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgInRpbWVyLTItdW5kZXJmbG93IiwgVElNRVIyX1VGTE9XLCAwLCBvdXRwdXRfcG9ydCwgfSwKLSAgeyAidGltZXItMy11bmRlcmZsb3ciLCBUSU1FUjNfVUZMT1csIDAsIG91dHB1dF9wb3J0LCB9LAotICB7ICJ0aW1lci00LXVuZGVyZmxvdyIsIFRJTUVSNF9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgInRpbWVyLTUtdW5kZXJmbG93IiwgVElNRVI1X1VGTE9XLCAwLCBvdXRwdXRfcG9ydCwgfSwKLQotICB7ICJ0aW1lci02LXVuZGVyZmxvdyIsIFRJTUVSNl9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCi0gIHsgInRpbWVyLTYtY29tcGFyZS1hIiwgVElNRVI2X0NNUEEsIDAsIG91dHB1dF9wb3J0LCB9LAotICB7ICJ0aW1lci02LWNvbXBhcmUtYiIsIFRJTUVSNl9DTVBCLCAwLCBvdXRwdXRfcG9ydCwgfSwKLQotICB7IE5VTEwsIH0sCi19OwotCi0jZGVmaW5lIGJpdHMydG81X21hc2sgMHgzYwotI2RlZmluZSBiaXRzMHRvMl9tYXNrIDB4MDcKLSNkZWZpbmUgbG9hZF9tYXNrICAgICAweDQwCi0jZGVmaW5lIGNvdW50X21hc2sgICAgMHg4MAotI2RlZmluZSBjb3VudF9hbmRfbG9hZF9tYXNrIChsb2FkX21hc2sgfCBjb3VudF9tYXNrKQotI2RlZmluZSBjbG9ja19tYXNrICAgIDB4MDMKLSNkZWZpbmUgY2xrX2lvY2xrICAgIDB4MDAKLSNkZWZpbmUgY2xrX2Nhc2NhZGVkIDB4MDMKLQotCi0vKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCi0gICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLwotCi1zdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIG1uMTAzdGltX2lvX3JlYWRfYnVmZmVyOwotc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgbW4xMDN0aW1faW9fd3JpdGVfYnVmZmVyOwotCi1zdGF0aWMgdm9pZAotYXR0YWNoX21uMTAzdGltX3JlZ3MgKHN0cnVjdCBodyAqbWUsCi0JCSAgICAgIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzKQotewotICBpbnQgaTsKLSAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKLSAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKLSAgZm9yIChpID0gMDsgaSA8IE5SX1RJTUVSX0JMT0NLUzsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7Ci0gICAgICBpbnQgYXR0YWNoX3NwYWNlOwotICAgICAgdW5zaWduZWQgYXR0YWNoX3NpemU7Ci0gICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0gICAgICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIGksICZyZWcpKQotCWh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIHRocmVlIGFkZHIvc2l6ZSBlbnRyaWVzIik7Ci0gICAgICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAotCQkJCQkgJnJlZy5hZGRyZXNzLAotCQkJCQkgJmF0dGFjaF9zcGFjZSwKLQkJCQkJICZhdHRhY2hfYWRkcmVzcywKLQkJCQkJIG1lKTsKLSAgICAgIHRpbWVycy0+YmxvY2tbaV0uYmFzZSA9IGF0dGFjaF9hZGRyZXNzOwotICAgICAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKLQkJCQkgICAmcmVnLnNpemUsCi0JCQkJICAgJmF0dGFjaF9zaXplLCBtZSk7Ci0gICAgICB0aW1lcnMtPmJsb2NrW2ldLmJvdW5kID0gYXR0YWNoX2FkZHJlc3MgKyAoYXR0YWNoX3NpemUgLSAxKTsKLSAgICAgIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKLQkJCSAwLAotCQkJIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAotCQkJIG1lKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbjEwM3RpbV9maW5pc2ggKHN0cnVjdCBodyAqbWUpCi17Ci0gIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzOwotICBpbnQgaTsKLQotICB0aW1lcnMgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgbW4xMDN0aW0pOwotICBzZXRfaHdfZGF0YSAobWUsIHRpbWVycyk7Ci0gIHNldF9od19pb19yZWFkX2J1ZmZlciAobWUsIG1uMTAzdGltX2lvX3JlYWRfYnVmZmVyKTsKLSAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIG1uMTAzdGltX2lvX3dyaXRlX2J1ZmZlcik7Ci0gIHNldF9od19wb3J0cyAobWUsIG1uMTAzdGltX3BvcnRzKTsKLQotICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLwotICBhdHRhY2hfbW4xMDN0aW1fcmVncyAobWUsIHRpbWVycyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdGltZXJzICovCi0gIGZvciAoIGk9MDsgaSA8IE5SX1JFR19USU1FUlM7ICsraSApCi0gICAgewotICAgICAgdGltZXJzLT5yZWdbaV0ubW9kZSA9IDB4MDA7Ci0gICAgICB0aW1lcnMtPnJlZ1tpXS5iYXNlID0gMDsKLSAgICB9Ci0gIGZvciAoIGk9MDsgaSA8IE5SX1RJTUVSUzsgKytpICkKLSAgICB7Ci0gICAgICB0aW1lcnMtPnRpbWVyW2ldLmV2ZW50ID0gTlVMTDsKLSAgICAgIHRpbWVycy0+dGltZXJbaV0uZGl2X3JhdGlvID0gMDsKLSAgICAgIHRpbWVycy0+dGltZXJbaV0uc3RhcnQgPSAwOwotICAgIH0KLSAgdGltZXJzLT50bTZtZDAgPSAweDAwOwotICB0aW1lcnMtPnRtNm1kMSA9IDB4MDA7Ci0gIHRpbWVycy0+dG02YmMgPSAweDAwMDA7Ci0gIHRpbWVycy0+dG02Y2EgPSAweDAwMDA7Ci0gIHRpbWVycy0+dG02Y2IgPSAweDAwMDA7Ci0gIHRpbWVycy0+dG02bWRhID0gMHgwMDsKLSAgdGltZXJzLT50bTZtZGIgPSAweDAwOwotfQotCi0KLQotLyogcmVhZCBhbmQgd3JpdGUgKi8KLQotc3RhdGljIGludAotZGVjb2RlX2FkZHIgKHN0cnVjdCBodyAqbWUsCi0JICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcykKLXsKLSAgdW5zaWduZWRfd29yZCBvZmZzZXQ7Ci0gIG9mZnNldCA9IGFkZHJlc3MgLSB0aW1lcnMtPmJsb2NrWzBdLmJhc2U7Ci0KLSAgc3dpdGNoIChvZmZzZXQpCi0gICAgewotICAgIGNhc2UgMHgwMDogcmV0dXJuIFRNME1EOwotICAgIGNhc2UgMHgwMTogcmV0dXJuIFRNMU1EOwotICAgIGNhc2UgMHgwMjogcmV0dXJuIFRNMk1EOwotICAgIGNhc2UgMHgwMzogcmV0dXJuIFRNM01EOwotICAgIGNhc2UgMHgxMDogcmV0dXJuIFRNMEJSOwotICAgIGNhc2UgMHgxMTogcmV0dXJuIFRNMUJSOwotICAgIGNhc2UgMHgxMjogcmV0dXJuIFRNMkJSOwotICAgIGNhc2UgMHgxMzogcmV0dXJuIFRNM0JSOwotICAgIGNhc2UgMHgyMDogcmV0dXJuIFRNMEJDOwotICAgIGNhc2UgMHgyMTogcmV0dXJuIFRNMUJDOwotICAgIGNhc2UgMHgyMjogcmV0dXJuIFRNMkJDOwotICAgIGNhc2UgMHgyMzogcmV0dXJuIFRNM0JDOwotICAgIGNhc2UgMHg4MDogcmV0dXJuIFRNNE1EOwotICAgIGNhc2UgMHg4MjogcmV0dXJuIFRNNU1EOwotICAgIGNhc2UgMHg4NDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAweDg1OiByZXR1cm4gVE02TUQ7Ci0gICAgY2FzZSAweDkwOiByZXR1cm4gVE00QlI7Ci0gICAgY2FzZSAweDkyOiByZXR1cm4gVE01QlI7Ci0gICAgY2FzZSAweGEwOiByZXR1cm4gVE00QkM7Ci0gICAgY2FzZSAweGEyOiByZXR1cm4gVE01QkM7Ci0gICAgY2FzZSAweGE0OiByZXR1cm4gVE02QkM7Ci0gICAgY2FzZSAweGI0OiByZXR1cm4gVE02TURBOwotICAgIGNhc2UgMHhiNTogcmV0dXJuIFRNNk1EQjsKLSAgICBjYXNlIDB4YzQ6IHJldHVybiBUTTZDQTsKLSAgICBjYXNlIDB4ZDQ6IHJldHVybiBUTTZDQjsKLSAgICBkZWZhdWx0OiAKLSAgICAgIHsKLQlod19hYm9ydCAobWUsICJiYWQgYWRkcmVzcyIpOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWFkX21vZGVfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCSAgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkgICAgICAgaW50IHRpbWVyX25yLAotCSAgICAgICB2b2lkICpkZXN0LAotCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgdW5zaWduZWQxNiB2YWwxNjsKLSAgdW5zaWduZWQzMiB2YWwzMjsKLQotICBzd2l0Y2ggKCBucl9ieXRlcyApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIEFjY2Vzc2luZyAxIGJ5dGUgaXMgb2sgZm9yIGFsbCBtb2RlIHJlZ2lzdGVycy4gKi8KLSAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCi0JewotCSAgKih1bnNpZ25lZDgqKWRlc3QgPSB0aW1lcnMtPnRtNm1kMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKih1bnNpZ25lZDgqKWRlc3QgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0ubW9kZTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCi0JewotCSAgKih1bnNpZ25lZDE2ICopZGVzdCA9ICh0aW1lcnMtPnRtNm1kMCA8PCA4KSB8IHRpbWVycy0+dG02bWQxOwotCX0KLSAgICAgIGVsc2UgaWYgKCB0aW1lcl9uciA9PSAwIHx8IHRpbWVyX25yID09IDIgKQotCXsKLQkgIHZhbDE2ID0gKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlIDw8IDgpCi0JICAgIHwgdGltZXJzLT5yZWdbdGltZXJfbnIrMV0ubW9kZTsKLQkgICoodW5zaWduZWQxNiopZGVzdCA9IHZhbDE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mIDIgYnl0ZXMgdG8gVE0lZE1ELiIsIHRpbWVyX25yKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIGlmICggdGltZXJfbnIgPT0gMCApCi0JewotCSAgdmFsMzIgPSAodGltZXJzLT5yZWdbMF0ubW9kZSA8PCAyNCApCi0JICAgIHwgKHRpbWVycy0+cmVnWzFdLm1vZGUgPDwgMTYpCi0JICAgIHwgKHRpbWVycy0+cmVnWzJdLm1vZGUgPDwgOCkKLQkgICAgfCB0aW1lcnMtPnJlZ1szXS5tb2RlOwotCSAgKih1bnNpZ25lZDMyKilkZXN0ID0gdmFsMzI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgNCBieXRlcyB0byBUTSVkTUQuIiwgdGltZXJfbnIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgdG8gVE0lZE1ELiIsCi0JCW5yX2J5dGVzLCB0aW1lcl9ucik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWFkX2Jhc2VfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCSAgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkgICAgICAgaW50IHRpbWVyX25yLAotCSAgICAgICB2b2lkICpkZXN0LAotCSAgICAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMTYgdmFsMTY7Ci0gIHVuc2lnbmVkMzIgdmFsMzI7Ci0KLSAgLyogQ2hlY2sgbnJfYnl0ZXM6IGFjY2Vzc2VzIG9mIDEsIDIgYW5kIDQgYnl0ZXMgYWxsb3dlZCBkZXBlbmRpbmcgb24gdGltZXIuICovCi0gIHN3aXRjaCAoIG5yX2J5dGVzICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogUmVhZGluZyAxIGJ5dGUgaXMgb2sgZm9yIGFsbCByZWdpc3RlcnMuICovCi0gICAgICBpZiAoIHRpbWVyX25yIDwgTlJfOEJJVF9USU1FUlMgKQotCXsKLQkgICoodW5zaWduZWQ4KilkZXN0ID0gdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoIHRpbWVyX25yID09IDEgfHwgdGltZXJfbnIgPT0gMyApCi0JewotCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAyIGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICggdGltZXJfbnIgPCBOUl84QklUX1RJTUVSUyApCi0JICAgIHsKLQkgICAgICB2YWwxNiA9ICh0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTw8OCkKLQkJfCB0aW1lcnMtPnJlZ1t0aW1lcl9ucisxXS5iYXNlOwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgdmFsMTYgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTsKLQkgICAgfQotCSAgKih1bnNpZ25lZDE2KilkZXN0ID0gdmFsMTY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoIHRpbWVyX25yID09IDAgKQotCXsKLQkgIHZhbDMyID0gKHRpbWVycy0+cmVnWzBdLmJhc2UgPDwgMjQpIHwgKHRpbWVycy0+cmVnWzFdLmJhc2UgPDwgMTYpCi0JICAgIHwgKHRpbWVycy0+cmVnWzJdLmJhc2UgPDwgOCkgfCB0aW1lcnMtPnJlZ1szXS5iYXNlOwotCSAgKih1bnNpZ25lZDMyKilkZXN0ID0gdmFsMzI7Ci0JfQotICAgICAgZWxzZSBpZiAoIHRpbWVyX25yID09IDQgKSAKLQl7Ci0JICB2YWwzMiA9ICh0aW1lcnMtPnJlZ1s0XS5iYXNlIDw8IDE2KSB8IHRpbWVycy0+cmVnWzVdLmJhc2U7Ci0JICAqKHVuc2lnbmVkMzIqKWRlc3QgPSB2YWwzMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiA0IGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBtdXN0IG9mICVkIGJ5dGVzIHRvIFRNJWRCUi4iLAotCQlucl9ieXRlcywgdGltZXJfbnIpOyAKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlYWRfY291bnRlciAoc3RydWN0IGh3ICptZSwKLQkgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkgICAgICBpbnQgdGltZXJfbnIsCi0JICAgICAgdm9pZCAqZGVzdCwKLQkgICAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMzIgdmFsOwotCi0gIGlmICggTlVMTCA9PSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCi0gICAgewotICAgICAgLyogVGltZXIgaXMgbm90IGNvdW50aW5nLCB1c2UgdmFsdWUgaW4gYmFzZSByZWdpc3Rlci4gKi8KLSAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCi0JewotCSAgdmFsID0gMDsgIC8qIHRpbWVyIDYgaXMgYW4gdXAgY291bnRlciAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWwgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCB0aW1lcl9uciA9PSA2ICkgIC8qIHRpbWVyIDYgaXMgYW4gdXAgY291bnRlci4gKi8KLQl7Ci0JICB2YWwgPSBod19ldmVudF9xdWV1ZV90aW1lKG1lKSAtIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLnN0YXJ0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB0aWNrcyBsZWZ0ID0gc3RhcnQgdGltZSArIGRpdiByYXRpbyAtIGN1cnIgdGltZSAqLwotCSAgLyogQ2Fubm90IHVzZSBiYXNlIHJlZ2lzdGVyIGJlY2F1c2UgaXQgY2FuIGJlIHdyaXR0ZW4gZHVyaW5nIGNvdW50aW5nIGFuZCBpdAotCSAgICAgZG9lc24ndCBhZmZlY3QgY291bnRlciB1bnRpbCB1bmRlcmZsb3cgb2NjdXJzLiAqLwotCSAgCi0JICB2YWwgPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCArIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmRpdl9yYXRpbwotCSAgICAtIGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChucl9ieXRlcykgewotICBjYXNlIDE6Ci0gICAgKih1bnNpZ25lZDggKilkZXN0ID0gdmFsOwotICAgIGJyZWFrOwotICAgIAotICBjYXNlIDI6Ci0gICAgKih1bnNpZ25lZDE2ICopZGVzdCA9IHZhbDsKLSAgICBicmVhazsKLQotICBjYXNlIDQ6Ci0gICAgKih1bnNpZ25lZDMyICopZGVzdCA9IHZhbDsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGh3X2Fib3J0KG1lLCAiYmFkIHJlYWQgc2l6ZSBmb3IgcmVhZGluZyBjb3VudGVyIik7Ci0gIH0KLSAgICAgIAotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWFkX3NwZWNpYWxfdGltZXI2X3JlZyAoc3RydWN0IGh3ICptZSwKLQkJCSBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkJCSBpbnQgdGltZXJfbnIsCi0JCQkgdm9pZCAqZGVzdCwKLQkJCSB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMzIgdmFsOwotCi0gIHN3aXRjaCAobnJfYnl0ZXMpIHsKLSAgY2FzZSAxOgotICAgIHsKLSAgICAgIHN3aXRjaCAoIHRpbWVyX25yICkgewotICAgICAgY2FzZSBUTTZNREE6Ci0JKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZtZGE7Ci0JYnJlYWs7Ci0gICAgCi0gICAgICBjYXNlIFRNNk1EQjoKLQkqKHVuc2lnbmVkOCAqKWRlc3QgPSB0aW1lcnMtPnRtNm1kYjsKLQlicmVhazsKLSAgICAKLSAgICAgIGNhc2UgVE02Q0E6Ci0JKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZjYTsKLQlicmVhazsKLSAgICAKLSAgICAgIGNhc2UgVE02Q0I6Ci0JKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZjYjsKLQlicmVhazsKLSAgICAgIAotICAgICAgZGVmYXVsdDoKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgY2FzZSAyOgotICAgIGlmICggdGltZXJfbnIgPT0gVE02Q0EgKQotICAgICAgewotCSoodW5zaWduZWQxNiAqKWRlc3QgPSB0aW1lcnMtPnRtNmNhOwotICAgICAgfQotICAgIGVsc2UgaWYgKCB0aW1lcl9uciA9PSBUTTZDQiApCi0gICAgICB7Ci0JKih1bnNpZ25lZDE2ICopZGVzdCA9IHRpbWVycy0+dG02Y2I7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWh3X2Fib3J0KG1lLCAiYmFkIHJlYWQgc2l6ZSBmb3IgdGltZXIgNiBtb2RlIEEvQiByZWdpc3RlciIpOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgaHdfYWJvcnQobWUsICJiYWQgcmVhZCBzaXplIGZvciB0aW1lciA2IHJlZ2lzdGVyIik7Ci0gIH0KLSAgICAgIAotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotbW4xMDN0aW1faW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCi0JCQkgdm9pZCAqZGVzdCwKLQkJCSBpbnQgc3BhY2UsCi0JCQkgdW5zaWduZWRfd29yZCBiYXNlLAotCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycyA9IGh3X2RhdGEgKG1lKTsKLSAgZW51bSB0aW1lcl9yZWdpc3Rlcl90eXBlcyB0aW1lcl9yZWc7Ci0KLSAgSFdfVFJBQ0UgKChtZSwgInJlYWQgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOwotCi0gIHRpbWVyX3JlZyA9IGRlY29kZV9hZGRyIChtZSwgdGltZXJzLCBiYXNlKTsKLQotICAvKiBJdCBjYW4gYmUgZWl0aGVyIGEgbW9kZSByZWdpc3RlciwgYSBiYXNlIHJlZ2lzdGVyLCBhIGJpbmFyeSBjb3VudGVyLCAqLwotICAvKiBvciBhIHNwZWNpYWwgdGltZXIgNiByZWdpc3Rlci4gIENoZWNrIGluIHRoYXQgb3JkZXIuICovCi0gIGlmICggdGltZXJfcmVnID49IEZJUlNUX01PREVfUkVHICYmIHRpbWVyX3JlZyA8PSBMQVNUX01PREVfUkVHICkKLSAgICB7Ci0gICAgICByZWFkX21vZGVfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9NT0RFX1JFRywgZGVzdCwgbnJfYnl0ZXMpOwotICAgIH0KLSAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX0JBU0VfUkVHICkKLSAgICB7Ci0gICAgICByZWFkX2Jhc2VfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9CQVNFX1JFRywgZGVzdCwgbnJfYnl0ZXMpOwotICAgIH0KLSAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX0NPVU5URVIgKQotICAgIHsKLSAgICAgIHJlYWRfY291bnRlcihtZSwgdGltZXJzLCB0aW1lcl9yZWctRklSU1RfQ09VTlRFUiwgZGVzdCwgbnJfYnl0ZXMpOwotICAgIH0KLSAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX1RJTUVSX1JFRyApCi0gICAgewotICAgICAgcmVhZF9zcGVjaWFsX3RpbWVyNl9yZWcobWUsIHRpbWVycywgdGltZXJfcmVnLCBkZXN0LCBucl9ieXRlcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIHRpbWVyIHJlZ2lzdGVyIGFkZHJlc3MuIik7Ci0gICAgfQotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi0KLXN0YXRpYyB2b2lkCi1kb19jb3VudGVyX2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAotCQkgIHZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzID0gaHdfZGF0YShtZSk7Ci0gIGludCB0aW1lcl9uciA9IChpbnQpIGRhdGE7Ci0gIGludCBuZXh0X3RpbWVyOwotCi0gIC8qIENoZWNrIGlmIGNvdW50aW5nIGlzIHN0aWxsIGVuYWJsZWQuICovCi0gIGlmICggKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY291bnRfbWFzaykgIT0gMCApCi0gICAgewotICAgICAgLyogR2VuZXJhdGUgYW4gaW50ZXJydXB0IGZvciB0aGUgdGltZXIgdW5kZXJmbG93IChUSU1FUm5fVUZMT1cpLiAqLwotCi0gICAgICAvKiBQb3J0IGV2ZW50IG9jY3VycyBvbiBwb3J0IG9mIGxhc3QgY2FzY2FkZWQgdGltZXIuICovCi0gICAgICAvKiBUaGlzIHdvcmtzIGFjcm9zcyB0aW1lciByYW5nZSBmcm9tIDAgdG8gTlJfUkVHX1RJTUVSUyBiZWNhdXNlICovCi0gICAgICAvKiB0aGUgZmlyc3QgMTYgYml0IHRpbWVyICh0aW1lciA0KSBpcyBub3QgYWxsb3dlZCB0byBiZSBzZXQgYXMgICovCi0gICAgICAvKiBhIGNhc2NhZGluZyB0aW1lci4gKi8KLSAgICAgIGZvciAoIG5leHRfdGltZXIgPSB0aW1lcl9ucisxOyBuZXh0X3RpbWVyIDwgTlJfUkVHX1RJTUVSUzsgKytuZXh0X3RpbWVyICkKLQl7Ci0JICBpZiAoICh0aW1lcnMtPnJlZ1tuZXh0X3RpbWVyXS5tb2RlICYgY2xvY2tfbWFzaykgIT0gY2xrX2Nhc2NhZGVkICkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaHdfcG9ydF9ldmVudCAobWUsIG5leHRfdGltZXItMSwgMSk7Ci0KLSAgICAgIC8qIFNjaGVkdWxlIG5leHQgdGltZW91dC4gICovCi0gICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotICAgICAgLyogRklYOiBDaGVjayBpZiBkaXZfcmF0aW8gaGFzIGNoYW5nZWQgYW5kIGlmIGl0J3Mgbm93IDAuICovCi0gICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAotCT0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8sCi0JCQkJICAgZG9fY291bnRlcl9ldmVudCwgKHZvaWQgKil0aW1lcl9ucik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQgPSBOVUxMOwotICAgIH0KLQotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19jb3VudGVyNl9ldmVudCAoc3RydWN0IGh3ICptZSwKLQkJICB2b2lkICpkYXRhKQotewotICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycyA9IGh3X2RhdGEobWUpOwotICBpbnQgdGltZXJfbnIgPSAoaW50KSBkYXRhOwotICBpbnQgbmV4dF90aW1lcjsKLQotICAvKiBDaGVjayBpZiBjb3VudGluZyBpcyBzdGlsbCBlbmFibGVkLiAqLwotICBpZiAoICh0aW1lcnMtPnJlZ1t0aW1lcl9ucl0ubW9kZSAmIGNvdW50X21hc2spICE9IDAgKQotICAgIHsKLSAgICAgIC8qIEdlbmVyYXRlIGFuIGludGVycnVwdCBmb3IgdGhlIHRpbWVyIHVuZGVyZmxvdyAoVElNRVJuX1VGTE9XKS4gKi8KLSAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCB0aW1lcl9uciwgMSk7Ci0KLSAgICAgIC8qIFNjaGVkdWxlIG5leHQgdGltZW91dC4gICovCi0gICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotICAgICAgLyogRklYOiBDaGVjayBpZiBkaXZfcmF0aW8gaGFzIGNoYW5nZWQgYW5kIGlmIGl0J3Mgbm93IDAuICovCi0gICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAotCT0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8sCi0JCQkJICAgZG9fY291bnRlcjZfZXZlbnQsICh2b2lkICopdGltZXJfbnIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2Jhc2VfcmVnIChzdHJ1Y3QgaHcgKm1lLAotCQlzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkJaW50IHRpbWVyX25yLAotCQljb25zdCB2b2lkICpzb3VyY2UsCi0JCXVuc2lnbmVkICBucl9ieXRlcykKLXsKLSAgdW5zaWduZWQgaTsKLSAgY29uc3QgdW5zaWduZWQ4ICpidWY4ID0gc291cmNlOwotICBjb25zdCB1bnNpZ25lZDE2ICpidWYxNiA9IHNvdXJjZTsKLQotICAvKiBJZiBUTW5DTkUgPT0gMCAoY291bnRpbmcgaXMgb2ZmKSwgIHdyaXRpbmcgdG8gdGhlIGJhc2UgcmVnaXN0ZXIKLSAgICAgKFRNbkJSKSBjYXVzZXMgYSBzaW11bHRhbmVvdXMgd3JpdGUgdG8gdGhlIGNvdW50ZXIgcmVnIChUTW5CQykuCi0gICAgIEVsc2UsIHRoZSBUTW5CQyBpcyByZWxvYWRlZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIFRNbkJSIHdoZW4KLSAgICAgdW5kZXJmbG93IG9jY3Vycy4gIFNpbmNlIHRoZSBjb3VudGVyIHJlZ2lzdGVyIGlzIG5vdCBleHBsaWNpdGx5Ci0gICAgIG1haW50YWluZWQsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGluIHJlYWRfY291bnRlci4gKi8KLQotICAvKiBDaGVjayBucl9ieXRlczogd3JpdGUgb2YgMSwgMiBvciA0IGJ5dGVzIGFsbG93ZWQgZGVwZW5kaW5nIG9uIHRpbWVyLiAqLwotICBzd2l0Y2ggKCBucl9ieXRlcyApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIFN0b3JpbmcgMSBieXRlIGlzIG9rIGZvciBhbGwgcmVnaXN0ZXJzLiAqLwotICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWY4WzBdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoIHRpbWVyX25yID09IDEgfHwgdGltZXJfbnIgPT0gMyApCi0JewotCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgb2YgMiBieXRlcyB0byBUTSVkQlIuIiwgdGltZXJfbnIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIHRpbWVyX25yIDwgTlJfOEJJVF9USU1FUlMgKQotCSAgICB7Ci0JICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWY4WzBdOwotCSAgICAgIHRpbWVycy0+cmVnW3RpbWVyX25yKzFdLmJhc2UgPSBidWY4WzFdOwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWYxNlswXTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgaWYgKCB0aW1lcl9uciA9PSAwICkKLQl7Ci0JICB0aW1lcnMtPnJlZ1swXS5iYXNlID0gYnVmOFswXTsKLQkgIHRpbWVycy0+cmVnWzFdLmJhc2UgPSBidWY4WzFdOwotCSAgdGltZXJzLT5yZWdbMl0uYmFzZSA9IGJ1ZjhbMl07Ci0JICB0aW1lcnMtPnJlZ1szXS5iYXNlID0gYnVmOFszXTsKLQl9Ci0gICAgICBlbHNlIGlmICggdGltZXJfbnIgPT0gNCApCi0JewotCSAgdGltZXJzLT5yZWdbNF0uYmFzZSA9IGJ1ZjE2WzBdOwotCSAgdGltZXJzLT5yZWdbNV0uYmFzZSA9IGJ1ZjE2WzFdOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiA0IGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgbXVzdCBvZiAlZCBieXRlcyB0byBUTSVkQlIuIiwKLQkJbnJfYnl0ZXMsIHRpbWVyX25yKTsKLSAgICB9Ci0gICAgIAotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfbW9kZV9yZWcgKHN0cnVjdCBodyAqbWUsCi0JCXN0cnVjdCBtbjEwM3RpbSAqdGltZXJzLAotCQlpbnQgdGltZXJfbnIsCi0JCWNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJdW5zaWduZWQgbnJfYnl0ZXMpCi0gICAgIC8qIGZvciB0aW1lcnMgMCB0byA1ICovCi17Ci0gIHVuc2lnbmVkIGk7Ci0gIHVuc2lnbmVkOCBtb2RlX3ZhbCwgbmV4dF9tb2RlX3ZhbDsKLSAgdW5zaWduZWQzMiBkaXZfcmF0aW87Ci0KLSAgaWYgKCBucl9ieXRlcyAhPSAxICkKLSAgICB7Ci0gICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBUTSVkTUQuIiwgbnJfYnl0ZXMsIHRpbWVyX25yKTsKLSAgICB9Ci0KLSAgbW9kZV92YWwgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKLSAgdGltZXJzLT5yZWdbdGltZXJfbnJdLm1vZGUgPSBtb2RlX3ZhbDsKLSAgICAgIAotICBpZiAoICggbW9kZV92YWwgJiBjb3VudF9hbmRfbG9hZF9tYXNrICkgPT0gY291bnRfYW5kX2xvYWRfbWFzayApCi0gICAgewotICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3QgbG9hZCBiYXNlIHJlZyBhbmQgc3RhcnQgY291bnRpbmcgc2ltdWx0YW5lb3VzbHkuIik7Ci0gICAgfQotICBpZiAoICggbW9kZV92YWwgJiBiaXRzMnRvNV9tYXNrICkgIT0gMCApCi0gICAgewotICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gYml0cyAyIHRvIDUgb2YgbW9kZSByZWdpc3RlciIpOwotICAgIH0KLQotICBpZiAoIG1vZGVfdmFsICYgY291bnRfbWFzayApCi0gICAgewotICAgICAgLyogLSBkZS1zY2hlZHVsZSBhbnkgcHJldmlvdXMgZXZlbnQuICovCi0gICAgICAvKiAtIGFkZCBuZXcgZXZlbnQgdG8gcXVldWUgdG8gc3RhcnQgY291bnRpbmcuICovCi0gICAgICAvKiAtIGFzc2VydCB0aGF0IGNvdW50ZXIgPT0gYmFzZSByZWc/ICovCi0KLSAgICAgIC8qIEZvciBjYXNjYWRlZCB0aW1lcnMsICovCi0gICAgICBpZiAoIChtb2RlX3ZhbCAmIGNsb2NrX21hc2spID09IGNsa19jYXNjYWRlZCApCi0JewotCSAgaWYgKCB0aW1lcl9uciA9PSAwIHx8IHRpbWVyX25yID09IDQgKQotCSAgICB7Ci0JICAgICAgaHdfYWJvcnQobWUsICJUaW1lciAlZCBjYW5ub3QgYmUgY2FzY2FkZWQuIiwgdGltZXJfbnIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpdl9yYXRpbyA9IHRpbWVycy0+cmVnW3RpbWVyX25yXS5iYXNlOwotCi0JICAvKiBDaGVjayBmb3IgY2FzY2FkaW5nLiAqLwotCSAgaWYgKCB0aW1lcl9uciA8IE5SXzhCSVRfVElNRVJTICkKLQkgICAgewotCSAgICAgIGZvciAoIGkgPSB0aW1lcl9uciArIDE7IGkgPD0gMzsgKytpICkgCi0JCXsKLQkJICBuZXh0X21vZGVfdmFsID0gdGltZXJzLT5yZWdbaV0ubW9kZTsKLQkJICBpZiAoICggbmV4dF9tb2RlX3ZhbCAmIGNsb2NrX21hc2sgKSA9PSBjbGtfY2FzY2FkZWQgKQotCQkgICAgewotCQkgICAgICAvKiBDaGVjayB0aGF0IENORSBpcyBvbi4gKi8KLQkJICAgICAgaWYgKCAoIG5leHRfbW9kZV92YWwgJiBjb3VudF9tYXNrICkgPT0gMCApIAotCQkJewotCQkJICBod19hYm9ydCAobWUsICJjYXNjYWRlZCB0aW1lciBub3QgcmVhZHkgZm9yIGNvdW50aW5nIik7Ci0JCQl9Ci0JCSAgICAgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW2ldLmV2ZW50ID09IE5VTEwpOwotCQkgICAgICBBU1NFUlQodGltZXJzLT50aW1lcltpXS5kaXZfcmF0aW8gPT0gMCk7Ci0JCSAgICAgIGRpdl9yYXRpbyA9IGRpdl9yYXRpbwotCQkJfCAodGltZXJzLT5yZWdbaV0uYmFzZSA8PCAoOCooaS10aW1lcl9ucikpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE1vZGUgcmVnaXN0ZXIgZm9yIGEgMTYgYml0IHRpbWVyICovCi0JICAgICAgbmV4dF9tb2RlX3ZhbCA9IHRpbWVycy0+cmVnW3RpbWVyX25yKzFdLm1vZGU7Ci0JICAgICAgaWYgKCAoIG5leHRfbW9kZV92YWwgJiBjbG9ja19tYXNrICkgPT0gY2xrX2Nhc2NhZGVkICkKLQkJewotCQkgIC8qIENoZWNrIHRoYXQgQ05FIGlzIG9uLiAqLwotCQkgIGlmICggKCBuZXh0X21vZGVfdmFsICYgY291bnRfbWFzayApID09IDAgKSAKLQkJICAgIHsKLQkJICAgICAgaHdfYWJvcnQgKG1lLCAiY2FzY2FkZWQgdGltZXIgbm90IHJlYWR5IGZvciBjb3VudGluZyIpOwotCQkgICAgfQotCQkgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yKzFdLmV2ZW50ID09IE5VTEwpOwotCQkgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yKzFdLmRpdl9yYXRpbyA9PSAwKTsKLQkJICBkaXZfcmF0aW8gPSBkaXZfcmF0aW8gfCAodGltZXJzLT5yZWdbdGltZXJfbnIrMV0uYmFzZSA8PCAxNik7Ci0JCX0KLQkgICAgfQotCi0JICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8gPSBkaXZfcmF0aW87Ci0KLQkgIGlmICggTlVMTCAhPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCi0JICAgIHsKLQkgICAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQpOwotCSAgICAgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAoIGRpdl9yYXRpbyA+IDAgKQotCSAgICB7Ci0JICAgICAgLyogU2V0IHN0YXJ0IHRpbWUuICovCi0JICAgICAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uc3RhcnQgPSBod19ldmVudF9xdWV1ZV90aW1lKG1lKTsKLQkgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAotCQk9IGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCBkaXZfcmF0aW8sCi0JCQkJCSAgZG9fY291bnRlcl9ldmVudCwKLQkJCQkJICAodm9pZCAqKSh0aW1lcl9ucikpOyAKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUdXJuIG9mZiBjb3VudGluZyAqLwotICAgICAgaWYgKCBOVUxMICE9IHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ICkKLQl7Ci0JICBBU1NFUlQoKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY2xvY2tfbWFzaykgIT0gY2xrX2Nhc2NhZGVkKTsKLQkgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCk7Ci0JICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICggKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY2xvY2tfbWFzaykgPT0gY2xrX2Nhc2NhZGVkICkKLQkgICAgewotCSAgICAgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCA9PSBOVUxMKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfdG02bWQgKHN0cnVjdCBodyAqbWUsCi0JICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKLQkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcywKLQkgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICB1bnNpZ25lZDggbW9kZV92YWwwID0gMHgwMCwgbW9kZV92YWwxID0gMHgwMDsKLSAgdW5zaWduZWQzMiBkaXZfcmF0aW87Ci0gIGludCB0aW1lcl9uciA9IDY7Ci0KLSAgdW5zaWduZWRfd29yZCBvZmZzZXQgPSBhZGRyZXNzIC0gdGltZXJzLT5ibG9ja1swXS5iYXNlOwotICAKLSAgaWYgKChvZmZzZXQgIT0gMHg4NCAmJiBucl9ieXRlcyA+IDEpIHx8IG5yX2J5dGVzID4gMiApCi0gICAgewotICAgICAgaHdfYWJvcnQgKG1lLCAiQmFkIHdyaXRlIHNpemUgb2YgJWQgYnl0ZXMgdG8gVE02TUQiLCBucl9ieXRlcyk7Ci0gICAgfQotCi0gIGlmICggb2Zmc2V0ID09IDB4ODQgKSAgLyogYWRkcmVzcyBvZiBUTTZNRCAqLwotICAgIHsKLSAgICAgIC8qICBGaWxsIGluIGZpcnN0IGJ5dGUgb2YgbW9kZSAqLwotICAgICAgbW9kZV92YWwwID0gKih1bnNpZ25lZDggKilzb3VyY2U7Ci0gICAgICB0aW1lcnMtPnRtNm1kMCA9IG1vZGVfdmFsMDsKLSAgICAKLSAgICAgIGlmICggKCBtb2RlX3ZhbDAgJiAweDI2ICkgIT0gMCApCi0JewotCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gYml0cyA1LCAzLCBhbmQgMiBvZiBUTTZNRCIpOwotCX0KLSAgICB9Ci0gIAotICBpZiAoIG9mZnNldCA9PSAweDg1IHx8IG5yX2J5dGVzID09IDIgKQotICAgIHsKLSAgICAgIC8qICBGaWxsIGluIHNlY29uZCBieXRlIG9mIG1vZGUgKi8KLSAgICAgIGlmICggbnJfYnl0ZXMgPT0gMiApCi0JewotCSAgbW9kZV92YWwxID0gKih1bnNpZ25lZDggKilzb3VyY2UrMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbW9kZV92YWwxID0gKih1bnNpZ25lZDggKilzb3VyY2U7Ci0JfQotCi0gICAgICB0aW1lcnMtPnRtNm1kMSA9IG1vZGVfdmFsMTsKLQotICAgICAgaWYgKCAoIG1vZGVfdmFsMSAmIGNvdW50X2FuZF9sb2FkX21hc2sgKSA9PSBjb3VudF9hbmRfbG9hZF9tYXNrICkKLQl7Ci0JICBod19hYm9ydChtZSwgIkNhbm5vdCBsb2FkIGJhc2UgcmVnIGFuZCBzdGFydCBjb3VudGluZyBzaW11bHRhbmVvdXNseS4iKTsKLQl9Ci0gICAgICBpZiAoICggbW9kZV92YWwxICYgYml0czB0bzJfbWFzayApICE9IDAgKQotCXsKLQkgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIGJpdHMgOCB0byAxMCBvZiBUTTZNRCIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCBtb2RlX3ZhbDEgJiBjb3VudF9tYXNrICkKLSAgICB7Ci0gICAgICAvKiAtIGRlLXNjaGVkdWxlIGFueSBwcmV2aW91cyBldmVudC4gKi8KLSAgICAgIC8qIC0gYWRkIG5ldyBldmVudCB0byBxdWV1ZSB0byBzdGFydCBjb3VudGluZy4gKi8KLSAgICAgIC8qIC0gYXNzZXJ0IHRoYXQgY291bnRlciA9PSBiYXNlIHJlZz8gKi8KLQotICAgICAgZGl2X3JhdGlvID0gdGltZXJzLT50bTZjYTsgIC8qIGJpbmFyeSBjb3VudGVyIGZvciB0aW1lciA2ICovCi0gICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8gPSBkaXZfcmF0aW87Ci0gICAgICBpZiAoIE5VTEwgIT0gdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQgKQotCXsKLQkgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCk7Ci0JICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCA9IE5VTEw7Ci0JfQotCi0gICAgICBpZiAoIGRpdl9yYXRpbyA+IDAgKQotCXsKLQkgIC8qIFNldCBzdGFydCB0aW1lLiAqLwotCSAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uc3RhcnQgPSBod19ldmVudF9xdWV1ZV90aW1lKG1lKTsKLQkgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50Ci0JICAgID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIGRpdl9yYXRpbywKLQkJCQkgICAgICBkb19jb3VudGVyNl9ldmVudCwKLQkJCQkgICAgICAodm9pZCAqKSh0aW1lcl9ucikpOyAKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVHVybiBvZmYgY291bnRpbmcgKi8KLSAgICAgIGlmICggTlVMTCAhPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCi0JewotCSAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50KTsKLQkgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKLQl9Ci0gICAgfQotfQotCi0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3NwZWNpYWxfdGltZXI2X3JlZyAoc3RydWN0IGh3ICptZSwKLQkJCSAgc3RydWN0IG1uMTAzdGltICp0aW1lcnMsCi0JCQkgIGludCB0aW1lcl9uciwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICB1bnNpZ25lZCAgbnJfYnl0ZXMpCi17Ci0gIHVuc2lnbmVkMzIgdmFsOwotCi0gIHN3aXRjaCAobnJfYnl0ZXMpIHsKLSAgY2FzZSAxOgotICAgIHsKLSAgICAgIHN3aXRjaCAoIHRpbWVyX25yICkgewotICAgICAgY2FzZSBUTTZNREE6Ci0JdGltZXJzLT50bTZtZGEgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKLQlicmVhazsKLSAgICAKLSAgICAgIGNhc2UgVE02TURCOgotCXRpbWVycy0+dG02bWRiID0gKih1bnNpZ25lZDggKilzb3VyY2U7Ci0JYnJlYWs7Ci0gICAgCi0gICAgICBjYXNlIFRNNkNBOgotCXRpbWVycy0+dG02Y2EgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKLQlicmVhazsKLSAgICAKLSAgICAgIGNhc2UgVE02Q0I6Ci0JdGltZXJzLT50bTZjYiA9ICoodW5zaWduZWQ4ICopc291cmNlOwotCWJyZWFrOwotICAgICAgCi0gICAgICBkZWZhdWx0OgotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICBjYXNlIDI6Ci0gICAgaWYgKCB0aW1lcl9uciA9PSBUTTZDQSApCi0gICAgICB7Ci0JdGltZXJzLT50bTZjYSA9ICoodW5zaWduZWQxNiAqKXNvdXJjZTsKLSAgICAgIH0KLSAgICBlbHNlIGlmICggdGltZXJfbnIgPT0gVE02Q0IgKQotICAgICAgewotCXRpbWVycy0+dG02Y2IgPSAqKHVuc2lnbmVkMTYgKilzb3VyY2U7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWh3X2Fib3J0KG1lLCAiYmFkIHJlYWQgc2l6ZSBmb3IgdGltZXIgNiBtb2RlIEEvQiByZWdpc3RlciIpOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgaHdfYWJvcnQobWUsICJiYWQgcmVhZCBzaXplIGZvciB0aW1lciA2IHJlZ2lzdGVyIik7Ci0gIH0KLSAgICAgIAotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotbW4xMDN0aW1faW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAotCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgIGludCBzcGFjZSwKLQkJCSAgdW5zaWduZWRfd29yZCBiYXNlLAotCQkJICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgc3RydWN0IG1uMTAzdGltICp0aW1lcnMgPSBod19kYXRhIChtZSk7Ci0gIGVudW0gdGltZXJfcmVnaXN0ZXJfdHlwZXMgdGltZXJfcmVnOwotCi0gIEhXX1RSQUNFICgobWUsICJ3cml0ZSB0byAweCUwOGx4IGxlbmd0aCAlZCB3aXRoIDB4JXgiLCAobG9uZykgYmFzZSwKLQkgICAgIChpbnQpIG5yX2J5dGVzLCAqKHVuc2lnbmVkMzIgKilzb3VyY2UpKTsKLQotICB0aW1lcl9yZWcgPSBkZWNvZGVfYWRkciAobWUsIHRpbWVycywgYmFzZSk7Ci0KLSAgLyogSXQgY2FuIGJlIGVpdGhlciBhIG1vZGUgcmVnaXN0ZXIsIGEgYmFzZSByZWdpc3RlciwgYSBiaW5hcnkgY291bnRlciwgKi8KLSAgLyogb3IgYSBzcGVjaWFsIHRpbWVyIDYgcmVnaXN0ZXIuICBDaGVjayBpbiB0aGF0IG9yZGVyLiAqLwotICBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX01PREVfUkVHICkKLSAgICB7Ci0gICAgICBpZiAoIHRpbWVyX3JlZyA9PSA2ICkgCi0JewotCSAgd3JpdGVfdG02bWQobWUsIHRpbWVycywgYmFzZSwgc291cmNlLCBucl9ieXRlcyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdyaXRlX21vZGVfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9NT0RFX1JFRywKLQkJCSBzb3VyY2UsIG5yX2J5dGVzKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICggdGltZXJfcmVnIDw9IExBU1RfQkFTRV9SRUcgKQotICAgIHsKLSAgICAgIHdyaXRlX2Jhc2VfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9CQVNFX1JFRywgc291cmNlLCBucl9ieXRlcyk7Ci0gICAgfQotICBlbHNlIGlmICggdGltZXJfcmVnIDw9IExBU1RfQ09VTlRFUiApCi0gICAgewotICAgICAgaHdfYWJvcnQobWUsICJjYW5ub3Qgd3JpdGUgdG8gY291bnRlciIpOwotICAgIH0KLSAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX1RJTUVSX1JFRyApCi0gICAgewotICAgICAgd3JpdGVfc3BlY2lhbF90aW1lcjZfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZywgc291cmNlLCBucl9ieXRlcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIHJlZyB0eXBlIik7Ci0gICAgfQotCi0gIHJldHVybiBucl9ieXRlczsKLX0gICAgIAotCi0KLWNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X21uMTAzdGltX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAibW4xMDN0aW0iLCBtbjEwM3RpbV9maW5pc2gsIH0sCi0gIHsgTlVMTCB9LAotfTsKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL2dlbmNvZGUuYyBiL3NpbS9tbjEwMzAwL2dlbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmMzEyYy4uMDAwMDAwMAotLS0gYS9zaW0vbW4xMDMwMC9nZW5jb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotI2luY2x1ZGUgIm1uMTAzMDBfc2ltLmgiCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2hlYWRlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9vcGNvZGVzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3RlbXBsYXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotbG9uZyBPcGNvZGVzWzUxMl07Ci1zdGF0aWMgaW50IGN1cm9wPTA7Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCkpCi0gICAgd3JpdGVfaGVhZGVyKCk7Ci0gIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkpCi0gICAgd3JpdGVfdGVtcGxhdGUgKCk7Ci0gIGVsc2UKLSAgICB3cml0ZV9vcGNvZGVzKCk7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9oZWFkZXIgKCkKLXsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcGNvZGU7Ci0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IG1uMTAzMDBfb3Bjb2RlICopbW4xMDMwMF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHByaW50Zigidm9pZCBPUF8lWCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7XHRcdC8qICVzICovXG4iLAotCSAgIG9wY29kZS0+b3Bjb2RlLCBvcGNvZGUtPm5hbWUpOwotfQotCi0KLS8qIHdyaXRlX3RlbXBsYXRlIGNyZWF0ZXMgYSBmaWxlIGFsbCByZXF1aXJlZCBmdW5jdGlvbnMsIHJlYWR5ICovCi0vKiB0byBiZSBmaWxsZWQgb3V0ICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV90ZW1wbGF0ZSAoKQotewotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wY29kZTsKLSAgaW50IGksajsKLQotICBwcmludGYgKCIjaW5jbHVkZSBcIm1uMTAzMDBfc2ltLmhcIlxuIik7Ci0gIHByaW50ZiAoIiNpbmNsdWRlIFwic2ltb3BzLmhcIlxuIik7Ci0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IG1uMTAzMDBfb3Bjb2RlICopbW4xMDMwMF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIHByaW50ZigiLyogJXMgKi9cbnZvaWRcbk9QXyVYIChpbnNuLCBleHRlbnNpb24pXG4gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uO1xue1xuIiwgb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm9wY29kZSk7Ci0JICAKLSAgICAgIC8qIGNvdW50IG9wZXJhbmRzICovCi0gICAgICBqID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgaW50IGZsYWdzID0gbW4xMDMwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotCSAgaWYgKGZsYWdzKQotCSAgICBqKys7Ci0JfQotICAgICAgc3dpdGNoIChqKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcblwiKTtcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleFxcblwiLCBPUFswXSk7XG4iLCBvcGNvZGUtPm5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0pO1xuIiwKLQkJICBvcGNvZGUtPm5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4LCUleFxcblwiLE9QWzBdLE9QWzFdLE9QWzJdKTtcbiIsCi0JCSAgb3Bjb2RlLT5uYW1lKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBmcHJpbnRmIChzdGRlcnIsIlRvbyBtYW55IG9wZXJhbmRzOiAlZFxuIiwgaik7Ci0JfQotICAgICAgcHJpbnRmICgifVxuXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9vcGNvZGVzICgpCi17Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3Bjb2RlOwotICBpbnQgaSwgajsKLSAgaW50IG51bW9wczsKLSAgCi0gIC8qIHdyaXRlIG91dCBvcGNvZGUgdGFibGUgKi8KLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJtbjEwMzAwX3NpbS5oXCJcbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcblxuIik7Ci0gIHByaW50ZiAoInN0cnVjdCBzaW1vcHMgU2ltb3BzW10gPSB7XG4iKTsKLSAgCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKW1uMTAzMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZTsKLQotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMCkKLQlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMQotICAgICAgICAgICAgICAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QwKQotCXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCi0gICAgICAgICAgICAgICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEpCi0Jc2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCi0Jc2l6ZSA9IDU7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCi0Jc2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQpCi0Jc2l6ZSA9IDY7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IDc7Ci0KLSAgICAgIHByaW50ZiAoIiAgeyAweCV4LDB4JXgsT1BfJVgsJWQsJWQsIiwKLQkgICAgICBvcGNvZGUtPm9wY29kZSwgb3Bjb2RlLT5tYXNrLCBvcGNvZGUtPm9wY29kZSwKLQkgICAgICBzaXplLCBvcGNvZGUtPmZvcm1hdCk7Ci0gICAgICAKLSAgICAgIE9wY29kZXNbY3Vyb3ArK10gPSBvcGNvZGUtPm9wY29kZTsKLQotICAgICAgLyogY291bnQgb3BlcmFuZHMgKi8KLSAgICAgIGogPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JICBpbnQgZmxhZ3MgPSBtbjEwMzAwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCi0JICBpZiAoZmxhZ3MpCi0JICAgIGorKzsKLQl9Ci0gICAgICBwcmludGYgKCIlZCx7IixqKTsKLQkgIAotICAgICAgaiA9IDA7Ci0gICAgICBudW1vcHMgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JICBpbnQgZmxhZ3MgPSBtbjEwMzAwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgaW50IHNoaWZ0ID0gbW4xMDMwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5zaGlmdDsKLQotCSAgaWYgKGZsYWdzKQotCSAgICB7Ci0JICAgICAgaWYgKGopCi0JCXByaW50ZiAoIiwgIik7Ci0JICAgICAgcHJpbnRmICgiJWQsJWQsJWQiLCBzaGlmdCwKLQkJICAgICAgbW4xMDMwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5iaXRzLGZsYWdzKTsKLQkgICAgICBqID0gMTsKLQkgICAgICBudW1vcHMrKzsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChudW1vcHMpCi0JewotCWNhc2UgMDoKLQkgIHByaW50ZiAoIjAsMCwwIik7Ci0JY2FzZSAxOgotCSAgcHJpbnRmICgiLDAsMCwwIik7Ci0JfQotCi0gICAgICBwcmludGYgKCJ9fSxcbiIpOwotICAgIH0KLSAgcHJpbnRmICgieyAwLDAsTlVMTCwwLDAsMCx7MCwwLDAsMCwwLDB9fSxcbn07XG4iKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL2ludGVycC5jIGIvc2ltL21uMTAzMDAvaW50ZXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDNjMmQuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvaW50ZXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIyICswLDAgQEAKLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmIFdJVEhfQ09NTU9OCi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgotI2luY2x1ZGUgInNpbS1ody5oIgotI2Vsc2UKLSNpbmNsdWRlICJtbjEwMzAwX3NpbS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCi0KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgaW5saW5lCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLQotaG9zdF9jYWxsYmFjayAqbW4xMDMwMF9jYWxsYmFjazsKLWludCBtbjEwMzAwX2RlYnVnOwotc3RydWN0IF9zdGF0ZSBTdGF0ZTsKLQotCi0vKiBzaW11bGF0aW9uIHRhcmdldCBib2FyZC4gIE5VTEw9ZGVmYXVsdCBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgY2hhciogYm9hcmQgPSBOVUxMOwotCi1zdGF0aWMgREVDTEFSRV9PUFRJT05fSEFORExFUiAobW4xMDMwMF9vcHRpb25faGFuZGxlcik7Ci0KLWVudW0gewotICBPUFRJT05fQk9BUkQgPSBPUFRJT05fU1RBUlQsCi19OwotCi1zdGF0aWMgU0lNX1JDCi1tbjEwMzAwX29wdGlvbl9oYW5kbGVyIChzZCwgY3B1LCBvcHQsIGFyZywgaXNfY29tbWFuZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHNpbV9jcHUgKmNwdTsKLSAgICAgaW50IG9wdDsKLSAgICAgY2hhciAqYXJnOwotICAgICBpbnQgaXNfY29tbWFuZDsKLXsKLSAgaW50IGNwdV9ucjsKLSAgc3dpdGNoIChvcHQpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0JPQVJEOgotICAgICAgewotCWlmIChhcmcpCi0JICB7Ci0JICAgIGJvYXJkID0gemFsbG9jKHN0cmxlbihhcmcpICsgMSk7Ci0JICAgIHN0cmNweShib2FyZCwgYXJnKTsKLQkgIH0KLQlyZXR1cm4gU0lNX1JDX09LOwotICAgICAgfQotICAgIH0KLSAgCi0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXN0YXRpYyBjb25zdCBPUFRJT04gbW4xMDMwMF9vcHRpb25zW10gPSAKLXsKLSNkZWZpbmUgQk9BUkRfQU0zMiAic3RkZXZhbDEiCi0gIHsgeyJib2FyZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQk9BUkR9LAotICAgICAnXDAnLCAibm9uZSIgLyogcmVseSBvbiBjb21waWxlLXRpbWUgc3RyaW5nIGNvbmNhdGVuYXRpb24gZm9yIG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgICAgInwiIEJPQVJEX0FNMzIKLSAgICAsICJDdXN0b21pemUgc2ltdWxhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiIsIG1uMTAzMDBfb3B0aW9uX2hhbmRsZXIgfSwKLQotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQotfTsKLQotI2lmIFdJVEhfQ09NTU9OCi0jZWxzZQotc3RhdGljIHZvaWQgZGlzcGF0Y2ggUEFSQU1TICgodWludDMyLCB1aW50MzIsIGludCkpOwotc3RhdGljIGxvbmcgaGFzaCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgdm9pZCBpbml0X3N5c3RlbSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOwotc3RhdGljIGNoYXIgKm15bmFtZTsKLSNkZWZpbmUgTUFYX0hBU0ggIDEyNwotCi1zdHJ1Y3QgaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKLSAgbG9uZyBvcGNvZGU7Ci0gIGxvbmcgbWFzazsKLSAgc3RydWN0IHNpbW9wcyAqb3BzOwotI2lmZGVmIEhBU0hfU1RBVAotICB1bnNpZ25lZCBsb25nIGNvdW50OwotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IG1heF9tZW0gPSAwOwotc3RydWN0IGhhc2hfZW50cnkgaGFzaF90YWJsZVtNQVhfSEFTSCsxXTsKLQotCi0vKiBUaGlzIHByb2JhYmx5IGRvZXNuJ3QgZG8gYSB2ZXJ5IGdvb2Qgam9iIGF0IGJ1Y2tldCBmaWxsaW5nLCBidXQKLSAgIGl0J3Mgc2ltcGxlLi4uICovCi1zdGF0aWMgSU5MSU5FIGxvbmcgCi1oYXNoKGluc24pCi0gICAgIGxvbmcgaW5zbjsKLXsKLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLCB3ZSBzcGVjaWFsIGNhc2UgdGhlc2Ugc2luY2UsIGluIHRoZW9yeSwKLSAgICAgdGhleSBzaG91bGQgYmUgdGhlIG1vc3QgaGVhdmlseSB1c2VkLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGluc24gJiAweGYwKQotCXsKLQkgIGNhc2UgMHgwMDoKLQkgICAgcmV0dXJuIDB4NzA7Ci0KLQkgIGNhc2UgMHg0MDoKLQkgICAgcmV0dXJuIDB4NzE7Ci0KLQkgIGNhc2UgMHgxMDoKLQkgICAgcmV0dXJuIDB4NzI7Ci0KLQkgIGNhc2UgMHgzMDoKLQkgICAgcmV0dXJuIDB4NzM7Ci0KLQkgIGNhc2UgMHg1MDoKLQkgICAgcmV0dXJuIDB4NzQ7Ci0KLQkgIGNhc2UgMHg2MDoKLQkgICAgcmV0dXJuIDB4NzU7Ci0KLQkgIGNhc2UgMHg3MDoKLQkgICAgcmV0dXJuIDB4NzY7Ci0KLQkgIGNhc2UgMHg4MDoKLQkgICAgcmV0dXJuIDB4Nzc7Ci0KLQkgIGNhc2UgMHg5MDoKLQkgICAgcmV0dXJuIDB4Nzg7Ci0KLQkgIGNhc2UgMHhhMDoKLQkgICAgcmV0dXJuIDB4Nzk7Ci0KLQkgIGNhc2UgMHhiMDoKLQkgICAgcmV0dXJuIDB4N2E7Ci0KLQkgIGNhc2UgMHhlMDoKLQkgICAgcmV0dXJuIDB4N2I7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIHJldHVybiAweDdjOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zICovCi0gIGlmICgoaW5zbiAmIDB4ZmZmZjAwMDApID09IDApCi0gICAgewotICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSA9PSAweDIwMDAKLQkgIHx8IChpbnNuICYgMHhmMDAwKSA9PSAweDUwMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmMwMCkgPj4gOCkgJiAweDdmOwotCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApID09IDB4NDAwMCkKLQlyZXR1cm4gKChpbnNuICYgMHhmMzAwKSA+PiA4KSAmIDB4N2Y7Ci0KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgPT0gMHg4MDAwCi0JICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHg5MDAwCi0JICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHhhMDAwCi0JICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHhiMDAwKQotCXJldHVybiAoKGluc24gJiAweGYwMDApID4+IDgpICYgMHg3ZjsKLQotICAgICAgaWYgKChpbnNuICYgMHhmZjAwKSA9PSAweGYwMDAKLQkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGYxMDAKLQkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGYyMDAKLQkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGY1MDAKLQkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGY2MDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmZmMCkgPj4gNCkgJiAweDdmOwotIAotICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSA9PSAweGMwMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkgJiAweDdmOwotCi0gICAgICByZXR1cm4gKChpbnNuICYgMHhmZmMwKSA+PiA2KSAmIDB4N2Y7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmZjAwMDAwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiAweGYwMDAwMCkgPT0gMHgwMDAwMDApCi0JcmV0dXJuICgoaW5zbiAmIDB4ZjMwMDAwKSA+PiAxNikgJiAweDdmOwotCi0gICAgICBpZiAoKGluc24gJiAweGYwMDAwMCkgPT0gMHgyMDAwMDAKLQkgIHx8IChpbnNuICYgMHhmMDAwMDApID09IDB4MzAwMDAwKQotCXJldHVybiAoKGluc24gJiAweGZjMDAwMCkgPj4gMTYpICYgMHg3ZjsKLQotICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDApID09IDB4ZjgwMDAwKQotCXJldHVybiAoKGluc24gJiAweGZmZjAwMCkgPj4gMTIpICYgMHg3ZjsKLQotICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDApID09IDB4ZjkwMDAwKQotCXJldHVybiAoKGluc24gJiAweGZmZmMwMCkgPj4gMTApICYgMHg3ZjsKLQotICAgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMDAwKSA+PiAxNikgJiAweDdmOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIG9yIGxhcmdlciBpbnNucy4gICovCi0gIGlmICgoaW5zbiAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCi0gICAgcmV0dXJuICgoaW5zbiAmIDB4ZmZmMDAwMDApID4+IDIwKSAmIDB4N2Y7Ci0KLSAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMDAwMDApID4+IDI0KSAmIDB4N2Y7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgbGVuZ3RoKQotICAgICB1aW50MzIgaW5zbjsKLSAgICAgdWludDMyIGV4dGVuc2lvbjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmg7Ci0KLSAgaCA9ICZoYXNoX3RhYmxlW2hhc2goaW5zbildOwotCi0gIHdoaWxlICgoaW5zbiAmIGgtPm1hc2spICE9IGgtPm9wY29kZQotCSAgfHwgKGxlbmd0aCAhPSBoLT5vcHMtPmxlbmd0aCkpCi0gICAgewotICAgICAgaWYgKCFoLT5uZXh0KQotCXsKLQkgICgqbW4xMDMwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDMwMF9jYWxsYmFjaywKLQkgICAgIkVSUk9SIGxvb2tpbmcgdXAgaGFzaCBmb3IgMHgleCwgUEM9MHgleFxuIiwgaW5zbiwgUEMpOwotCSAgZXhpdCgxKTsKLQl9Ci0gICAgICBoID0gaC0+bmV4dDsKLSAgICB9Ci0KLQotI2lmZGVmIEhBU0hfU1RBVAotICBoLT5jb3VudCsrOwotI2VuZGlmCi0KLSAgLyogTm93IGNhbGwgdGhlIHJpZ2h0IGZ1bmN0aW9uLiAgKi8KLSAgKGgtPm9wcy0+ZnVuYykoaW5zbiwgZXh0ZW5zaW9uKTsKLSAgUEMgKz0gbGVuZ3RoOwotfQotCi12b2lkCi1zaW1fc2l6ZSAocG93ZXIpCi0gICAgIGludCBwb3dlcjsKLQotewotICBpZiAoU3RhdGUubWVtKQotICAgIGZyZWUgKFN0YXRlLm1lbSk7Ci0KLSAgbWF4X21lbSA9IDEgPDwgcG93ZXI7Ci0gIFN0YXRlLm1lbSA9ICh1aW50OCAqKSBjYWxsb2MgKDEsICAxIDw8IHBvd2VyKTsKLSAgaWYgKCFTdGF0ZS5tZW0pCi0gICAgewotICAgICAgKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiQWxsb2NhdGlvbiBvZiBtYWluIG1lbW9yeSBmYWlsZWQuXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWluaXRfc3lzdGVtICgpCi17Ci0gIGlmICghU3RhdGUubWVtKQotICAgIHNpbV9zaXplKDE5KTsKLX0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLQotICBpbml0X3N5c3RlbSAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHN0b3JlX2J5dGUgKGFkZHIgKyBpLCBidWZmZXJbaV0pOwotCi0gIHJldHVybiBzaXplOwotfQotCi0vKiBDb21wYXJlIHR3byBvcGNvZGUgdGFibGUgZW50cmllcyBmb3IgcXNvcnQuICAqLwotc3RhdGljIGludAotY29tcGFyZV9zaW1vcHMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgdW5zaWduZWQgbG9uZyBjb2RlMSA9ICgoc3RydWN0IHNpbW9wcyAqKWFyZzEpLT5vcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgY29kZTIgPSAoKHN0cnVjdCBzaW1vcHMgKilhcmcyKS0+b3Bjb2RlOwotCi0gIGlmIChjb2RlMSA8IGNvZGUyKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGNvZGUyIDwgY29kZTEpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi1TSU1fREVTQwotc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQotICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7Ci0gICAgIGhvc3RfY2FsbGJhY2sgKmNiOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIHN0cnVjdCBzaW1vcHMgKnM7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpoOwotICBjaGFyICoqcDsKLSAgaW50IGk7Ci0KLSAgbW4xMDMwMF9jYWxsYmFjayA9IGNiOwotCi0gIC8qIFNvcnQgdGhlIG9wY29kZSBhcnJheSBmcm9tIHNtYWxsZXN0IG9wY29kZSB0byBsYXJnZXN0LgotICAgICBUaGlzIHdpbGwgZ2VuZXJhbGx5IGltcHJvdmUgc2ltdWxhdG9yIHBlcmZvcm1hbmNlIGFzIHRoZSBzbWFsbGVyCi0gICAgIG9wY29kZXMgYXJlIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gdGhlIGxhcmdlciBvcGNvZGVzLiAgKi8KLSAgZm9yIChpID0gMCwgcyA9IFNpbW9wczsgcy0+ZnVuYzsgcysrLCBpKyspCi0gICAgOwotICBxc29ydCAoU2ltb3BzLCBpLCBzaXplb2YgKFNpbW9wc1swXSksIGNvbXBhcmVfc2ltb3BzKTsKLQotICBzaW1fa2luZCA9IGtpbmQ7Ci0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0KLSAgZm9yIChwID0gYXJndiArIDE7ICpwOyArK3ApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoKnAsICItRSIpID09IDApCi0JKytwOyAvKiBpZ25vcmUgZW5kaWFuIHNwZWMgKi8KLSAgICAgIGVsc2UKLSNpZmRlZiBERUJVRwotICAgICAgaWYgKHN0cmNtcCAoKnAsICItdCIpID09IDApCi0JbW4xMDMwMF9kZWJ1ZyA9IERFQlVHOwotICAgICAgZWxzZQotI2VuZGlmCi0JKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiRVJST1I6IHVuc3VwcG9ydGVkIG9wdGlvbihzKTogJXNcbiIsKnApOwotICAgIH0KLQotIC8qIHB1dCBhbGwgdGhlIG9wY29kZXMgaW4gdGhlIGhhc2ggdGFibGUgKi8KLSAgZm9yIChzID0gU2ltb3BzOyBzLT5mdW5jOyBzKyspCi0gICAgewotICAgICAgaCA9ICZoYXNoX3RhYmxlW2hhc2gocy0+b3Bjb2RlKV07Ci0KLSAgICAgIC8qIGdvIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjaGFpbiAqLwotICAgICAgd2hpbGUgKGgtPm5leHQpCi0JewotCSAgLyogRG9uJ3QgaW5zZXJ0IHRoZSBzYW1lIG9wY29kZSBtb3JlIHRoYW4gb25jZS4gICovCi0JICBpZiAoaC0+b3Bjb2RlID09IHMtPm9wY29kZQotCSAgICAgICYmIGgtPm1hc2sgPT0gcy0+bWFzawotCSAgICAgICYmIGgtPm9wcyA9PSBzKQotCSAgICBicmVhazsKLQkgIGVsc2UKLQkgICAgaCA9IGgtPm5leHQ7Ci0JfQotCi0gICAgICAvKiBEb24ndCBpbnNlcnQgdGhlIHNhbWUgb3Bjb2RlIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgICAgIGlmIChoLT5vcGNvZGUgPT0gcy0+b3Bjb2RlCi0JICAmJiBoLT5tYXNrID09IHMtPm1hc2sKLQkgICYmIGgtPm9wcyA9PSBzKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaC0+b3BzKQotCXsKLQkgIGgtPm5leHQgPSBjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpKTsKLQkgIGggPSBoLT5uZXh0OwotCX0KLSAgICAgIGgtPm9wcyA9IHM7Ci0gICAgICBoLT5tYXNrID0gcy0+bWFzazsKLSAgICAgIGgtPm9wY29kZSA9IHMtPm9wY29kZTsKLSNpZiBIQVNIX1NUQVQKLSAgICAgIGgtPmNvdW50ID0gMDsKLSNlbmRpZgotICAgIH0KLQotCi0gIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yIGZvciBub3cgKi8KLSAgcmV0dXJuIChTSU1fREVTQykgMTsKLX0KLQotCi12b2lkCi1zaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBxdWl0dGluZzsKLXsKLSAgLyogbm90aGluZyB0byBkbyAqLwotfQotCi12b2lkCi1zaW1fc2V0X3Byb2ZpbGUgKG4pCi0gICAgIGludCBuOwotewotICAoKm1uMTAzMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAzMDBfY2FsbGJhY2ssICJzaW1fc2V0X3Byb2ZpbGUgJWRcbiIsIG4pOwotfQotCi12b2lkCi1zaW1fc2V0X3Byb2ZpbGVfc2l6ZSAobikKLSAgICAgaW50IG47Ci17Ci0gICgqbW4xMDMwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDMwMF9jYWxsYmFjaywgInNpbV9zZXRfcHJvZmlsZV9zaXplICVkXG4iLCBuKTsKLX0KLQotaW50Ci1zaW1fc3RvcCAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgc3RlcCwgc2lnZ25hbDsKLXsKLSAgdWludDMyIGluc3Q7Ci0gIHJlZ190IG9sZHBjOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoc3RlcCkKLSAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOwotICBlbHNlCi0gICAgU3RhdGUuZXhjZXB0aW9uID0gMDsKLQotICBTdGF0ZS5leGl0ZWQgPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGluc3QgPSBsb2FkX21lbV9iaWcgKFBDLCAyKTsKLSAgICAgIG9sZHBjID0gUEM7Ci0KLSAgICAgIC8qIFVzaW5nIGEgZ2lhbnQgY2FzZSBzdGF0ZW1lbnQgbWF5IHNlZW0gbGlrZSBhIHdhc3RlIGJlY2F1c2Ugb2YgdGhlCi0gCWNvZGUvcm9kYXRhIHNpemUgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIGNvbnN1bWUuICBIb3dldmVyLCB1c2luZwotIAlhIGdpYW50IGNhc2Ugc3RhdGVtZW50IHNwZWVkcyB1cCB0aGUgc2ltdWxhdG9yIGJ5IDEwLTE1JSBieSBhdm9pZGluZwotIAljYXNjYWRpbmcgaWYvZWxzZSBzdGF0ZW1lbnRzIG9yIGNhc2NhZGluZyBjYXNlIHN0YXRlbWVudHMuICAqLwotCi0gICAgICBzd2l0Y2ggKChpbnN0ID4+IDgpICYgMHhmZikKLQl7Ci0JICAvKiBBbGwgdGhlIHNpbmdsZSBieXRlIGluc25zIGV4Y2VwdCAweDgwLCAweDkwLCAweGEwLCAweGIwCi0JICAgICB3aGljaCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KLQkgIGNhc2UgMHgwMDoKLQkgIGNhc2UgMHgwNDoKLQkgIGNhc2UgMHgwODoKLQkgIGNhc2UgMHgwYzoKLQkgIGNhc2UgMHgxMDoKLQkgIGNhc2UgMHgxMToKLQkgIGNhc2UgMHgxMjoKLQkgIGNhc2UgMHgxMzoKLQkgIGNhc2UgMHgxNDoKLQkgIGNhc2UgMHgxNToKLQkgIGNhc2UgMHgxNjoKLQkgIGNhc2UgMHgxNzoKLQkgIGNhc2UgMHgxODoKLQkgIGNhc2UgMHgxOToKLQkgIGNhc2UgMHgxYToKLQkgIGNhc2UgMHgxYjoKLQkgIGNhc2UgMHgxYzoKLQkgIGNhc2UgMHgxZDoKLQkgIGNhc2UgMHgxZToKLQkgIGNhc2UgMHgxZjoKLQkgIGNhc2UgMHgzYzoKLQkgIGNhc2UgMHgzZDoKLQkgIGNhc2UgMHgzZToKLQkgIGNhc2UgMHgzZjoKLQkgIGNhc2UgMHg0MDoKLQkgIGNhc2UgMHg0MToKLQkgIGNhc2UgMHg0NDoKLQkgIGNhc2UgMHg0NToKLQkgIGNhc2UgMHg0ODoKLQkgIGNhc2UgMHg0OToKLQkgIGNhc2UgMHg0YzoKLQkgIGNhc2UgMHg0ZDoKLQkgIGNhc2UgMHg1MDoKLQkgIGNhc2UgMHg1MToKLQkgIGNhc2UgMHg1MjoKLQkgIGNhc2UgMHg1MzoKLQkgIGNhc2UgMHg1NDoKLQkgIGNhc2UgMHg1NToKLQkgIGNhc2UgMHg1NjoKLQkgIGNhc2UgMHg1NzoKLQkgIGNhc2UgMHg2MDoKLQkgIGNhc2UgMHg2MToKLQkgIGNhc2UgMHg2MjoKLQkgIGNhc2UgMHg2MzoKLQkgIGNhc2UgMHg2NDoKLQkgIGNhc2UgMHg2NToKLQkgIGNhc2UgMHg2NjoKLQkgIGNhc2UgMHg2NzoKLQkgIGNhc2UgMHg2ODoKLQkgIGNhc2UgMHg2OToKLQkgIGNhc2UgMHg2YToKLQkgIGNhc2UgMHg2YjoKLQkgIGNhc2UgMHg2YzoKLQkgIGNhc2UgMHg2ZDoKLQkgIGNhc2UgMHg2ZToKLQkgIGNhc2UgMHg2ZjoKLQkgIGNhc2UgMHg3MDoKLQkgIGNhc2UgMHg3MToKLQkgIGNhc2UgMHg3MjoKLQkgIGNhc2UgMHg3MzoKLQkgIGNhc2UgMHg3NDoKLQkgIGNhc2UgMHg3NToKLQkgIGNhc2UgMHg3NjoKLQkgIGNhc2UgMHg3NzoKLQkgIGNhc2UgMHg3ODoKLQkgIGNhc2UgMHg3OToKLQkgIGNhc2UgMHg3YToKLQkgIGNhc2UgMHg3YjoKLQkgIGNhc2UgMHg3YzoKLQkgIGNhc2UgMHg3ZDoKLQkgIGNhc2UgMHg3ZToKLQkgIGNhc2UgMHg3ZjoKLQkgIGNhc2UgMHhjYjoKLQkgIGNhc2UgMHhkMDoKLQkgIGNhc2UgMHhkMToKLQkgIGNhc2UgMHhkMjoKLQkgIGNhc2UgMHhkMzoKLQkgIGNhc2UgMHhkNDoKLQkgIGNhc2UgMHhkNToKLQkgIGNhc2UgMHhkNjoKLQkgIGNhc2UgMHhkNzoKLQkgIGNhc2UgMHhkODoKLQkgIGNhc2UgMHhkOToKLQkgIGNhc2UgMHhkYToKLQkgIGNhc2UgMHhkYjoKLQkgIGNhc2UgMHhlMDoKLQkgIGNhc2UgMHhlMToKLQkgIGNhc2UgMHhlMjoKLQkgIGNhc2UgMHhlMzoKLQkgIGNhc2UgMHhlNDoKLQkgIGNhc2UgMHhlNToKLQkgIGNhc2UgMHhlNjoKLQkgIGNhc2UgMHhlNzoKLQkgIGNhc2UgMHhlODoKLQkgIGNhc2UgMHhlOToKLQkgIGNhc2UgMHhlYToKLQkgIGNhc2UgMHhlYjoKLQkgIGNhc2UgMHhlYzoKLQkgIGNhc2UgMHhlZDoKLQkgIGNhc2UgMHhlZToKLQkgIGNhc2UgMHhlZjoKLQkgIGNhc2UgMHhmZjoKLQkgICAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKLQkgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMSk7Ci0JICAgIGJyZWFrOwotCi0JICAvKiBTcGVjaWFsIGNhc2VzIHdoZXJlIGRtID09IGRuIGlzIHVzZWQgdG8gZW5jb2RlIGEgZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbi4gICovCi0JICBjYXNlIDB4ODA6Ci0JICBjYXNlIDB4ODU6Ci0JICBjYXNlIDB4OGE6Ci0JICBjYXNlIDB4OGY6Ci0JICBjYXNlIDB4OTA6Ci0JICBjYXNlIDB4OTU6Ci0JICBjYXNlIDB4OWE6Ci0JICBjYXNlIDB4OWY6Ci0JICBjYXNlIDB4YTA6Ci0JICBjYXNlIDB4YTU6Ci0JICBjYXNlIDB4YWE6Ci0JICBjYXNlIDB4YWY6Ci0JICBjYXNlIDB4YjA6Ci0JICBjYXNlIDB4YjU6Ci0JICBjYXNlIDB4YmE6Ci0JICBjYXNlIDB4YmY6Ci0JICAgIGluc24gPSBpbnN0OwotCSAgICBleHRlbnNpb24gPSAwOwotCSAgICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAyKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMHg4MToKLQkgIGNhc2UgMHg4MjoKLQkgIGNhc2UgMHg4MzoKLQkgIGNhc2UgMHg4NDoKLQkgIGNhc2UgMHg4NjoKLQkgIGNhc2UgMHg4NzoKLQkgIGNhc2UgMHg4ODoKLQkgIGNhc2UgMHg4OToKLQkgIGNhc2UgMHg4YjoKLQkgIGNhc2UgMHg4YzoKLQkgIGNhc2UgMHg4ZDoKLQkgIGNhc2UgMHg4ZToKLQkgIGNhc2UgMHg5MToKLQkgIGNhc2UgMHg5MjoKLQkgIGNhc2UgMHg5MzoKLQkgIGNhc2UgMHg5NDoKLQkgIGNhc2UgMHg5NjoKLQkgIGNhc2UgMHg5NzoKLQkgIGNhc2UgMHg5ODoKLQkgIGNhc2UgMHg5OToKLQkgIGNhc2UgMHg5YjoKLQkgIGNhc2UgMHg5YzoKLQkgIGNhc2UgMHg5ZDoKLQkgIGNhc2UgMHg5ZToKLQkgIGNhc2UgMHhhMToKLQkgIGNhc2UgMHhhMjoKLQkgIGNhc2UgMHhhMzoKLQkgIGNhc2UgMHhhNDoKLQkgIGNhc2UgMHhhNjoKLQkgIGNhc2UgMHhhNzoKLQkgIGNhc2UgMHhhODoKLQkgIGNhc2UgMHhhOToKLQkgIGNhc2UgMHhhYjoKLQkgIGNhc2UgMHhhYzoKLQkgIGNhc2UgMHhhZDoKLQkgIGNhc2UgMHhhZToKLQkgIGNhc2UgMHhiMToKLQkgIGNhc2UgMHhiMjoKLQkgIGNhc2UgMHhiMzoKLQkgIGNhc2UgMHhiNDoKLQkgIGNhc2UgMHhiNjoKLQkgIGNhc2UgMHhiNzoKLQkgIGNhc2UgMHhiODoKLQkgIGNhc2UgMHhiOToKLQkgIGNhc2UgMHhiYjoKLQkgIGNhc2UgMHhiYzoKLQkgIGNhc2UgMHhiZDoKLQkgIGNhc2UgMHhiZToKLQkgICAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKLQkgICAgZXh0ZW5zaW9uID0gMDsKLQkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDEpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoZSB0d28gYnl0ZSBpbnN0cnVjdGlvbnMuICAqLwotCSAgY2FzZSAweDIwOgotCSAgY2FzZSAweDIxOgotCSAgY2FzZSAweDIyOgotCSAgY2FzZSAweDIzOgotCSAgY2FzZSAweDI4OgotCSAgY2FzZSAweDI5OgotCSAgY2FzZSAweDJhOgotCSAgY2FzZSAweDJiOgotCSAgY2FzZSAweDQyOgotCSAgY2FzZSAweDQzOgotCSAgY2FzZSAweDQ2OgotCSAgY2FzZSAweDQ3OgotCSAgY2FzZSAweDRhOgotCSAgY2FzZSAweDRiOgotCSAgY2FzZSAweDRlOgotCSAgY2FzZSAweDRmOgotCSAgY2FzZSAweDU4OgotCSAgY2FzZSAweDU5OgotCSAgY2FzZSAweDVhOgotCSAgY2FzZSAweDViOgotCSAgY2FzZSAweDVjOgotCSAgY2FzZSAweDVkOgotCSAgY2FzZSAweDVlOgotCSAgY2FzZSAweDVmOgotCSAgY2FzZSAweGMwOgotCSAgY2FzZSAweGMxOgotCSAgY2FzZSAweGMyOgotCSAgY2FzZSAweGMzOgotCSAgY2FzZSAweGM0OgotCSAgY2FzZSAweGM1OgotCSAgY2FzZSAweGM2OgotCSAgY2FzZSAweGM3OgotCSAgY2FzZSAweGM4OgotCSAgY2FzZSAweGM5OgotCSAgY2FzZSAweGNhOgotCSAgY2FzZSAweGNlOgotCSAgY2FzZSAweGNmOgotCSAgY2FzZSAweGYwOgotCSAgY2FzZSAweGYxOgotCSAgY2FzZSAweGYyOgotCSAgY2FzZSAweGYzOgotCSAgY2FzZSAweGY0OgotCSAgY2FzZSAweGY1OgotCSAgY2FzZSAweGY2OgotCSAgICBpbnNuID0gaW5zdDsKLQkgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMik7Ci0JICAgIGJyZWFrOwotCi0JICAvKiBUaGUgdGhyZWUgYnl0ZSBpbnNucyB3aXRoIGEgMTZiaXQgb3BlcmFuZCBpbiBsaXR0bGUgZW5kaWFuCi0JICAgICBmb3JtYXQuICAqLwotCSAgY2FzZSAweDAxOgotCSAgY2FzZSAweDAyOgotCSAgY2FzZSAweDAzOgotCSAgY2FzZSAweDA1OgotCSAgY2FzZSAweDA2OgotCSAgY2FzZSAweDA3OgotCSAgY2FzZSAweDA5OgotCSAgY2FzZSAweDBhOgotCSAgY2FzZSAweDBiOgotCSAgY2FzZSAweDBkOgotCSAgY2FzZSAweDBlOgotCSAgY2FzZSAweDBmOgotCSAgY2FzZSAweDI0OgotCSAgY2FzZSAweDI1OgotCSAgY2FzZSAweDI2OgotCSAgY2FzZSAweDI3OgotCSAgY2FzZSAweDJjOgotCSAgY2FzZSAweDJkOgotCSAgY2FzZSAweDJlOgotCSAgY2FzZSAweDJmOgotCSAgY2FzZSAweDMwOgotCSAgY2FzZSAweDMxOgotCSAgY2FzZSAweDMyOgotCSAgY2FzZSAweDMzOgotCSAgY2FzZSAweDM0OgotCSAgY2FzZSAweDM1OgotCSAgY2FzZSAweDM2OgotCSAgY2FzZSAweDM3OgotCSAgY2FzZSAweDM4OgotCSAgY2FzZSAweDM5OgotCSAgY2FzZSAweDNhOgotCSAgY2FzZSAweDNiOgotCSAgY2FzZSAweGNjOgotCSAgICBpbnNuID0gbG9hZF9ieXRlIChQQyk7Ci0JICAgIGluc24gPDw9IDE2OwotCSAgICBpbnNuIHw9IGxvYWRfaGFsZiAoUEMgKyAxKTsKLQkgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMyk7Ci0JICAgIGJyZWFrOwotCi0JICAvKiBUaGUgdGhyZWUgYnl0ZSBpbnNucyB3aXRob3V0IDE2Yml0IG9wZXJhbmQuICAqLwotCSAgY2FzZSAweGRlOgotCSAgY2FzZSAweGRmOgotCSAgY2FzZSAweGY4OgotCSAgY2FzZSAweGY5OgotCSAgICBpbnNuID0gbG9hZF9tZW1fYmlnIChQQywgMyk7Ci0JICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDMpOwotCSAgICBicmVhazsKLQkgIAotCSAgLyogRm91ciBieXRlIGluc25zLiAgKi8KLQkgIGNhc2UgMHhmYToKLQkgIGNhc2UgMHhmYjoKLQkgICAgaWYgKChpbnN0ICYgMHhmZmZjKSA9PSAweGZhZjAKLQkJfHwgKGluc3QgJiAweGZmZmMpID09IDB4ZmFmNAotCQl8fCAoaW5zdCAmIDB4ZmZmYykgPT0gMHhmYWY4KQotCSAgICAgIGluc24gPSBsb2FkX21lbV9iaWcgKFBDLCA0KTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW5zbiA9IGluc3Q7Ci0JCWluc24gPDw9IDE2OwotCQlpbnNuIHw9IGxvYWRfaGFsZiAoUEMgKyAyKTsKLQkJZXh0ZW5zaW9uID0gMDsKLQkgICAgICB9Ci0JICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDQpOwotCSAgICBicmVhazsKLQotCSAgLyogRml2ZSBieXRlIGluc25zLiAgKi8KLQkgIGNhc2UgMHhjZDoKLQkgICAgaW5zbiA9IGxvYWRfYnl0ZSAoUEMpOwotCSAgICBpbnNuIDw8PSAyNDsKLQkgICAgaW5zbiB8PSAobG9hZF9oYWxmIChQQyArIDEpIDw8IDgpOwotCSAgICBpbnNuIHw9IGxvYWRfYnl0ZSAoUEMgKyAzKTsKLQkgICAgZXh0ZW5zaW9uID0gbG9hZF9ieXRlIChQQyArIDQpOwotCSAgICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCA1KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMHhkYzoKLQkgICAgaW5zbiA9IGxvYWRfYnl0ZSAoUEMpOwotCSAgICBpbnNuIDw8PSAyNDsKLQkgICAgZXh0ZW5zaW9uID0gbG9hZF93b3JkIChQQyArIDEpOwotCSAgICBpbnNuIHw9IChleHRlbnNpb24gJiAweGZmZmZmZjAwKSA+PiA4OwotCSAgICBleHRlbnNpb24gJj0gMHhmZjsKLQkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNSk7Ci0JICAgIGJyZWFrOwotCQotCSAgLyogU2l4IGJ5dGUgaW5zbnMuICAqLwotCSAgY2FzZSAweGZjOgotCSAgY2FzZSAweGZkOgotCSAgICBpbnNuID0gKGluc3QgPDwgMTYpOwotCSAgICBleHRlbnNpb24gPSBsb2FkX3dvcmQgKFBDICsgMik7Ci0JICAgIGluc24gfD0gKChleHRlbnNpb24gJiAweGZmZmYwMDAwKSA+PiAxNik7Ci0JICAgIGV4dGVuc2lvbiAmPSAweGZmZmY7Ci0JICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDYpOwotCSAgICBicmVhazsKLQkgICAgCi0JICBjYXNlIDB4ZGQ6Ci0JICAgIGluc24gPSBsb2FkX2J5dGUgKFBDKSA8PCAyNDsKLQkgICAgZXh0ZW5zaW9uID0gbG9hZF93b3JkIChQQyArIDEpOwotCSAgICBpbnNuIHw9ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmZmYpOwotCSAgICBleHRlbnNpb24gPSAoZXh0ZW5zaW9uICYgMHhmZikgPDwgMTY7Ci0JICAgIGV4dGVuc2lvbiB8PSBsb2FkX2J5dGUgKFBDICsgNSkgPDwgODsKLQkgICAgZXh0ZW5zaW9uIHw9IGxvYWRfYnl0ZSAoUEMgKyA2KTsKLQkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNyk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDB4ZmU6Ci0JICAgIGluc24gPSBpbnN0IDw8IDE2OwotCSAgICBleHRlbnNpb24gPSBsb2FkX3dvcmQgKFBDICsgMik7Ci0JICAgIGluc24gfD0gKChleHRlbnNpb24gPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgZXh0ZW5zaW9uIDw8PSA4OwotCSAgICBleHRlbnNpb24gJj0gMHhmZmZmMDA7Ci0JICAgIGV4dGVuc2lvbiB8PSBsb2FkX2J5dGUgKFBDICsgNik7Ci0JICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDcpOwotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSAgd2hpbGUgKCFTdGF0ZS5leGNlcHRpb24pOwotCi0jaWZkZWYgSEFTSF9TVEFUCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hBU0g7IGkrKykKLSAgICAgIHsKLQkgc3RydWN0IGhhc2hfZW50cnkgKmg7Ci0JIGggPSAmaGFzaF90YWJsZVtpXTsKLQotCSBwcmludGYoImhhc2ggMHgleDpcbiIsIGkpOwotCi0JIHdoaWxlIChoKQotCSAgIHsKLQkgICAgIHByaW50ZigiaC0+b3Bjb2RlID0gMHgleCwgY291bnQgPSAweCV4XG4iLCBoLT5vcGNvZGUsIGgtPmNvdW50KTsKLQkgICAgIGggPSBoLT5uZXh0OwotCSAgIH0KLQotCSBwcmludGYoIlxuXG4iKTsKLSAgICAgIH0KLSAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gIH0KLSNlbmRpZgotCi19Ci0KLWludAotc2ltX3RyYWNlIChzZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0jaWZkZWYgREVCVUcKLSAgbW4xMDMwMF9kZWJ1ZyA9IERFQlVHOwotI2VuZGlmCi0gIHNpbV9yZXN1bWUgKHNkLCAwLCAwKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLXNpbV9pbmZvIChzZCwgdmVyYm9zZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCB2ZXJib3NlOwotewotICAoKm1uMTAzMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAzMDBfY2FsbGJhY2ssICJzaW1faW5mb1xuIik7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBQQyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBQQyA9IDA7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLXZvaWQKLXNpbV9zZXRfY2FsbGJhY2tzIChwKQotICAgICBob3N0X2NhbGxiYWNrICpwOwotewotICBtbjEwMzAwX2NhbGxiYWNrID0gcDsKLX0KLQotLyogQWxsIHRoZSBjb2RlIGZvciBleGl0aW5nLCBzaWduYWxzLCBldGMgbmVlZHMgdG8gYmUgcmV2YW1wZWQuCi0KLSAgIFRoaXMgaXMgZW5vdWdoIHRvIGdldCBjLXRvcnR1cmUgbGltcGluZyB0aG91Z2guICAqLwotCi12b2lkCi1zaW1fc3RvcF9yZWFzb24gKHNkLCByZWFzb24sIHNpZ3JjKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgZW51bSBzaW1fc3RvcCAqcmVhc29uOwotICAgICBpbnQgKnNpZ3JjOwotewotICBpZiAoU3RhdGUuZXhpdGVkKQotICAgICpyZWFzb24gPSBzaW1fZXhpdGVkOwotICBlbHNlCi0gICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOwotCi0gIGlmIChTdGF0ZS5leGNlcHRpb24gPT0gU0lHUVVJVCkKLSAgICAqc2lncmMgPSAwOwotICBlbHNlCi0gICAgKnNpZ3JjID0gU3RhdGUuZXhjZXB0aW9uOwotfQotCi1pbnQKLXNpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgYnVmZmVyW2ldID0gbG9hZF9ieXRlIChhZGRyICsgaSk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19IAotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKmNtZDsKLXsKLSAgKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG1uMTAzMDAgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLCBjbWQpOwotfQotCi1TSU1fUkMKLXNpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpwcm9nOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCi0gIGJmZCAqcHJvZ19iZmQ7Ci0KLSAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBtbjEwMzAwX2NhbGxiYWNrLCBwcm9nLCBhYmZkLAotCQkJICAgIHNpbV9raW5kID09IFNJTV9PUEVOX0RFQlVHLAotCQkJICAgIDAsIHNpbV93cml0ZSk7Ci0gIGlmIChwcm9nX2JmZCA9PSBOVUxMKQotICAgIHJldHVybiBTSU1fUkNfRkFJTDsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBiZmRfY2xvc2UgKHByb2dfYmZkKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0gCi0jZW5kaWYgIC8qIG5vdCBXSVRIX0NPTU1PTiAqLwotCi0KLSNpZiBXSVRIX0NPTU1PTgotCi0vKiBGb3IgY29tcGF0aWJpbGl0eSAqLwotU0lNX0RFU0Mgc2ltdWxhdG9yOwotCi0vKiBUaGVzZSBkZWZhdWx0IHZhbHVlcyBjb3JyZXNwb25kIHRvIGV4cGVjdGVkIHVzYWdlIGZvciB0aGUgY2hpcC4gICovCi0KLVNJTV9ERVNDCi1zaW1fb3BlbiAoa2luZCwgY2IsIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2I7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNiKTsKLSAgbW4xMDMwMF9jYWxsYmFjayA9IGNiOwotCi0gIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7Ci0KLSAgLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLSAgc2ltdWxhdG9yID0gc2Q7Ci0KLSAgLyogRklYTUU6IHNob3VsZCBiZSBiZXR0ZXIgd2F5IG9mIHNldHRpbmcgdXAgaW50ZXJydXB0cy4gIEZvcgotICAgICBtb21lbnQsIG9ubHkgc3VwcG9ydCB3YXRjaHBvaW50cyBjYXVzaW5nIGEgYnJlYWtwb2ludCAoZ2RiCi0gICAgIGhhbHQpLiAqLwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYyA9ICYoUEMpOwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKLSAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X2hhbmRsZXIgPSBOVUxMOwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfbmFtZXMgPSBOVUxMOwotCi0gIGlmIChzaW1fcHJlX2FyZ3ZfaW5pdCAoc2QsIGFyZ3ZbMF0pICE9IFNJTV9SQ19PSykKLSAgICByZXR1cm4gMDsKLSAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBtbjEwMzAwX29wdGlvbnMpOwotCi0gIC8qIEFsbG9jYXRlIGNvcmUgbWFuYWdlZCBtZW1vcnkgKi8KLSAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAwLDB4MTAwMDAwIik7Ci0gIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHg0MDAwMDAwMCwweDIwMDAwMCIpOwotCi0gIC8qIGdldG9wdCB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHNvIHdlIGp1c3QgaGF2ZSB0byBleGl0IGlmIHRoaXMgZmFpbHMuCi0gICAgIEZJWE1FOiBIbW1tLi4uICBpbiB0aGUgY2FzZSBvZiBnZGIgd2UgbmVlZCBnZXRvcHQgdG8gY2FsbAotICAgICBwcmludF9maWx0ZXJlZC4gICovCi0gIGlmIChzaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAotCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCi0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICggTlVMTCAhPSBib2FyZAotICAgICAgICYmIChzdHJjbXAoYm9hcmQsIEJPQVJEX0FNMzIpID09IDAgKSApCi0gICAgewotICAgICAgLyogZW52aXJvbm1lbnQgKi8KLSAgICAgIFNUQVRFX0VOVklST05NRU5UIChzZCkgPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ7Ci0KLSAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHg0NDAwMDAwMCwweDQwMDAwIik7Ci0gICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4NDgwMDAwMDAsMHg0MDAwMDAiKTsKLQotICAgICAgLyogZGV2aWNlIHN1cHBvcnQgZm9yIG1uMTAzMDAwMiAqLwotICAgICAgLyogaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM2ludEAweDM0MDAwMTAwL3JlZyAweDM0MDAwMTAwIDB4N0MgMHgzNDAwMDIwMCAweDggMHgzNDAwMDI4MCAweDgiKTsKLQotICAgICAgLyogREVCVUc6IE5NSSBpbnB1dCdzICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwMDAwMC9yZWcgMHgzMDAwMDAwMCAxMiIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQwIG5taXJxIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQxIHdhdGNoZG9nIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQyIHN5c2VyciAvbW4xMDNpbnQiKTsKLSAgICAgIAotICAgICAgLyogREVCVUc6IEFDSyBpbnB1dCAqLwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDIwMDAvcmVnIDB4MzAwMDIwMDAgNCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDIwMDAgPiBpbnQgYWNrIC9tbjEwM2ludCIpOwotICAgICAgCi0gICAgICAvKiBERUJVRzogTEVWRUwgb3V0cHV0ICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwNDAwMC9yZWcgMHgzMDAwNDAwMCA4Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzaW50ID4gbm1pIGludDAgL2dsdWVAMHgzMDAwNDAwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM2ludCA+IGxldmVsIGludDEgL2dsdWVAMHgzMDAwNDAwMCIpOwotICAgICAgCi0gICAgICAvKiBERUJVRzogQSBidW5jaCBvZiBpbnRlcnJ1cHQgaW5wdXRzICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwNjAwMC9yZWcgMHgzMDAwNjAwMCAzMiIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQwIGlycS0wIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQxIGlycS0xIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQyIGlycS0yIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQzIGlycS0zIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ0IGlycS00IC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ1IGlycS01IC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ2IGlycS02IC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ3IGlycS03IC9tbjEwM2ludCIpOwotICAgICAgCi0gICAgICAvKiBwcm9jZXNzb3IgaW50ZXJydXB0IGRldmljZSAqLwotICAgICAgCi0gICAgICAvKiB0aGUgZGV2aWNlICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzY3B1QDB4MjAwMDAwMDAiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNjcHVAMHgyMDAwMDAwMC9yZWcgMHgyMDAwMDAwMCAweDQyIik7Ci0gICAgICAKLSAgICAgIC8qIERFQlVHOiBBQ0sgb3V0cHV0IHdpcmVkIHVwdG8gYSBnbHVlIGRldmljZSAqLwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDIwMDAiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweDIwMDAyMDAwL3JlZyAweDIwMDAyMDAwIDQiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNjcHUgPiBhY2sgaW50MCAvZ2x1ZUAweDIwMDAyMDAwIik7Ci0gICAgICAKLSAgICAgIC8qIERFQlVHOiBSRVNFVC9OTUkvTEVWRUwgd2lyZWQgdXAgdG8gYSBnbHVlIGRldmljZSAqLwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDQwMDAiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweDIwMDA0MDAwL3JlZyAweDIwMDA0MDAwIDEyIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgyMDAwNDAwMCA+IGludDAgcmVzZXQgL21uMTAzY3B1Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgyMDAwNDAwMCA+IGludDEgbm1pIC9tbjEwM2NwdSIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDQwMDAgPiBpbnQyIGxldmVsIC9tbjEwM2NwdSIpOwotICAgICAgCi0gICAgICAvKiBSRUFMOiBUaGUgcHJvY2Vzc29yIHdpcmVkIHVwIHRvIHRoZSByZWFsIGludGVycnVwdCBjb250cm9sbGVyICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzY3B1ID4gYWNrIGFjayAvbW4xMDNpbnQiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNpbnQgPiBsZXZlbCBsZXZlbCAvbW4xMDNjcHUiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNpbnQgPiBubWkgbm1pIC9tbjEwM2NwdSIpOwotICAgICAgCi0gICAgICAKLSAgICAgIC8qIFBBTCAqLwotICAgICAgCi0gICAgICAvKiB0aGUgZGV2aWNlICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwL3JlZyAweDMxMDAwMDAwIDY0Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwL3BvbGw/IHRydWUiKTsKLSAgICAgIAotICAgICAgLyogREVCVUc6IFBBTCB3aXJlZCB1cCB0byBhIGdsdWUgZGV2aWNlICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMTAwMjAwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAvcmVnIDB4MzEwMDIwMDAgMTYiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvcGFsQDB4MzEwMDAwMDAgPiBjb3VudGRvd24gaW50MCAvZ2x1ZUAweDMxMDAyMDAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gdGltZXIgaW50MSAvZ2x1ZUAweDMxMDAyMDAwIik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gaW50IGludDIgL2dsdWVAMHgzMTAwMjAwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQwIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQxIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQyIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOwotICAgICAgCi0gICAgICAvKiBSRUFMOiBUaGUgUEFMIHdpcmVkIHVwIHRvIHRoZSByZWFsIGludGVycnVwdCBjb250cm9sbGVyICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gY291bnRkb3duIGlycS0wIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IHRpbWVyIGlycS0xIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IGludCBpcnEtMiAvbW4xMDNpbnQiKTsKLSAgICAgIAotICAgICAgLyogOCBhbmQgMTYgYml0IHRpbWVycyAqLwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3RpbUAweDM0MDAxMDAwL3JlZyAweDM0MDAxMDAwIDM2IDB4MzQwMDEwODAgMTAwIDB4MzQwMDQwMDAgMTYiKTsKLQotICAgICAgLyogSG9vayB0aW1lciBpbnRlcnJ1cHRzIHVwIHRvIGludGVycnVwdCBjb250cm9sbGVyICovCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMC11bmRlcmZsb3cgdGltZXItMC11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMS11bmRlcmZsb3cgdGltZXItMS11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMi11bmRlcmZsb3cgdGltZXItMi11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMy11bmRlcmZsb3cgdGltZXItMy11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNC11bmRlcmZsb3cgdGltZXItNC11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNS11bmRlcmZsb3cgdGltZXItNS11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi11bmRlcmZsb3cgdGltZXItNi11bmRlcmZsb3cgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi1jb21wYXJlLWEgdGltZXItNi1jb21wYXJlLWEgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi1jb21wYXJlLWIgdGltZXItNi1jb21wYXJlLWIgL21uMTAzaW50Iik7Ci0gICAgICAKLSAgICAgIAotICAgICAgLyogU2VyaWFsIGRldmljZXMgMCwxLDIgKi8KLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXJAMHgzNDAwMDgwMC9yZWcgMHgzNDAwMDgwMCA0OCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlckAweDM0MDAwODAwL3BvbGw/IHRydWUiKTsKLSAgICAgIAotICAgICAgLyogSG9vayBzZXJpYWwgaW50ZXJydXB0cyB1cCB0byBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlciA+IHNlcmlhbC0wLXJlY2VpdmUgc2VyaWFsLTAtcmVjZWl2ZSAvbW4xMDNpbnQiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXIgPiBzZXJpYWwtMC10cmFuc21pdCBzZXJpYWwtMC10cmFuc21pdCAvbW4xMDNpbnQiKTsKLSAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXIgPiBzZXJpYWwtMS1yZWNlaXZlIHNlcmlhbC0xLXJlY2VpdmUgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzc2VyID4gc2VyaWFsLTEtdHJhbnNtaXQgc2VyaWFsLTEtdHJhbnNtaXQgL21uMTAzaW50Iik7Ci0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzc2VyID4gc2VyaWFsLTItcmVjZWl2ZSBzZXJpYWwtMi1yZWNlaXZlIC9tbjEwM2ludCIpOwotICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlciA+IHNlcmlhbC0yLXRyYW5zbWl0IHNlcmlhbC0yLXRyYW5zbWl0IC9tbjEwM2ludCIpOwotICAgICAgCi0gICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzaW9wQDB4MzYwMDgwMDAvcmVnIDB4MzYwMDgwMDAgOCAweDM2MDA4MDIwIDggMHgzNjAwODA0MCAweGMgMHgzNjAwODA2MCA4IDB4MzYwMDgwODAgOCIpOwotCi0gICAgICAvKiBNZW1vcnkgY29udHJvbCByZWdpc3RlcnMgKi8KLSAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHgzMjAwMDAyMCwweDMwIik7Ci0gICAgICAvKiBDYWNoZSBjb250cm9sIHJlZ2lzdGVyICovCi0gICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4MjAwMDAwNzAsMHg0Iik7Ci0gICAgICAvKiBDYWNoZSBwdXJnZSByZWdpb25zICovCi0gICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4Mjg0MDAwMDAsMHg4MDAiKTsKLSAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHgyODQwMTAwMCwweDgwMCIpOwotICAgICAgLyogRE1BIHJlZ2lzdGVycyAqLwotICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwMTAwLDB4RiIpOwotICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwMjAwLDB4RiIpOwotICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwNDAwLDB4RiIpOwotICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwODAwLDB4RiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChib2FyZCAhPSBOVUxMKQotICAgICAgICB7Ci0JICBzaW1faW9fZXByaW50ZiAoc2QsICJFcnJvcjogQm9hcmQgYCVzJyB1bmtub3duLlxuIiwgYm9hcmQpOwotICAgICAgICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIAotICAKLQotICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSBhIHJlZmVyZW5jZSBwcm9ncmFtIGltYWdlICovCi0gIGlmIChzaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwKLQkJCSAgIChTVEFURV9QUk9HX0FSR1YgKHNkKSAhPSBOVUxMCi0JCQkgICAgPyAqU1RBVEVfUFJPR19BUkdWIChzZCkKLQkJCSAgICA6IE5VTEwpLAotCQkJICAgYWJmZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogZXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0gIGlmIChzaW1fY29uZmlnIChzZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNpbV9wb3N0X2FyZ3ZfaW5pdCAoc2QpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAotCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCi0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0KLSAgLyogc2V0IG1hY2hpbmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwotLyogICBTVEFURV9DUFUgKHNkLCAwKS0+cHN3X21hc2sgPSAoUFNXX05QIHwgUFNXX0VQIHwgUFNXX0lEIHwgUFNXX1NBVCAqLwotLyogCQkJICAgICB8IFBTV19DWSB8IFBTV19PViB8IFBTV19TIHwgUFNXX1opOyAqLwotCi0gIHJldHVybiBzZDsKLX0KLQotCi12b2lkCi1zaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBxdWl0dGluZzsKLXsKLSAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLX0KLQotCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBwcm9nX2JmZCwgYXJndiwgZW52KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IF9iZmQgKnByb2dfYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgbWVtc2V0ICgmU3RhdGUsIDAsIHNpemVvZiAoU3RhdGUpKTsKLSAgaWYgKHByb2dfYmZkICE9IE5VTEwpIHsKLSAgICBQQyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpOwotICB9IGVsc2UgewotICAgIFBDID0gMDsKLSAgfQotICBDSUFfU0VUIChTVEFURV9DUFUgKHNkLCAwKSwgKHVuc2lnbmVkNjQpIFBDKTsKLQotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKmNtZDsKLXsKLSAgY2hhciAqbW1fY21kID0gIm1lbW9yeS1tYXAiOwotICBjaGFyICppbnRfY21kID0gImludGVycnVwdCI7Ci0KLSAgaWYgKHNpbV9hcmdzX2NvbW1hbmQgKHNkLCBjbWQpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoY21kLCBtbV9jbWQsIHN0cmxlbiAobW1fY21kKSA9PSAwKSkKLQlzaW1faW9fZXByaW50ZiAoc2QsICJgbWVtb3J5LW1hcCcgY29tbWFuZCByZXBsYWNlZCBieSBgc2ltIG1lbW9yeSdcbiIpOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoY21kLCBpbnRfY21kLCBzdHJsZW4gKGludF9jbWQpKSA9PSAwKQotCXNpbV9pb19lcHJpbnRmIChzZCwgImBpbnRlcnJ1cHQnIGNvbW1hbmQgcmVwbGFjZWQgYnkgYHNpbSB3YXRjaCdcbiIpOwotICAgICAgZWxzZQotCXNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gY29tbWFuZCBgJXMnXG4iLCBjbWQpOwotICAgIH0KLX0KLSNlbmRpZiAgLyogV0lUSF9DT01NT04gKi8KLQotLyogRklYTUUgVGhlc2Ugd291bGQgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoYW4gbG9hZF9tZW0vc3RvcmVfbWVtLAotICAgYnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byB1c2UgdGhlIG1lbW9yeSBtYXAuICAqLwotCi11aW50OAotZ2V0X2J5dGUgKHgpCi0gICAgIHVpbnQ4ICp4OwotewotICByZXR1cm4gKng7Ci19Ci0KLXVpbnQxNgotZ2V0X2hhbGYgKHgpCi0gICAgIHVpbnQ4ICp4OwotewotICB1aW50OCAqYSA9IHg7Ci0gIHJldHVybiAoYVsxXSA8PCA4KSArIChhWzBdKTsKLX0KLQotdWludDMyCi1nZXRfd29yZCAoeCkKLSAgICAgIHVpbnQ4ICp4OwotewotICB1aW50OCAqYSA9IHg7Ci0gIHJldHVybiAoYVszXTw8MjQpICsgKGFbMl08PDE2KSArIChhWzFdPDw4KSArIChhWzBdKTsKLX0KLQotdm9pZAotcHV0X2J5dGUgKGFkZHIsIGRhdGEpCi0gICAgIHVpbnQ4ICphZGRyOwotICAgICB1aW50OCBkYXRhOwotewotICB1aW50OCAqYSA9IGFkZHI7Ci0gIGFbMF0gPSBkYXRhOwotfQotCi12b2lkCi1wdXRfaGFsZiAoYWRkciwgZGF0YSkKLSAgICAgdWludDggKmFkZHI7Ci0gICAgIHVpbnQxNiBkYXRhOwotewotICB1aW50OCAqYSA9IGFkZHI7Ci0gIGFbMF0gPSBkYXRhICYgMHhmZjsKLSAgYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKLX0KLQotdm9pZAotcHV0X3dvcmQgKGFkZHIsIGRhdGEpCi0gICAgIHVpbnQ4ICphZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSAgdWludDggKmEgPSBhZGRyOwotICBhWzBdID0gZGF0YSAmIDB4ZmY7Ci0gIGFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7Ci0gIGFbMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOwotICBhWzNdID0gKGRhdGEgPj4gMjQpICYgMHhmZjsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHV0X3dvcmQgKG1lbW9yeSwgU3RhdGUucmVnc1tybl0pOwotICByZXR1cm4gLTE7Ci19Ci0gCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBybjsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgbGVuZ3RoOwotewotICBTdGF0ZS5yZWdzW3JuXSA9IGdldF93b3JkIChtZW1vcnkpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotdm9pZAotbW4xMDMwMF9jb3JlX3NpZ25hbCAoU0lNX0RFU0Mgc2QsCi0gICAgICAgICAgICAgICAgIHNpbV9jcHUgKmNwdSwKLSAgICAgICAgICAgICAgICAgc2ltX2NpYSBjaWEsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1hcCwKLSAgICAgICAgICAgICAgICAgaW50IG5yX2J5dGVzLAotICAgICAgICAgICAgICAgICBhZGRyZXNzX3dvcmQgYWRkciwKLSAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlciwKLSAgICAgICAgICAgICAgICAgc2ltX2NvcmVfc2lnbmFscyBzaWcpCi17Ci0gIGNvbnN0IGNoYXIgKmNvcHkgPSAodHJhbnNmZXIgPT0gcmVhZF90cmFuc2ZlciA/ICJyZWFkIiA6ICJ3cml0ZSIpOwotICBhZGRyZXNzX3dvcmQgaXAgPSBDSUFfQUREUiAoY2lhKTsKLQotICBzd2l0Y2ggKHNpZykKLSAgICB7Ci0gICAgY2FzZSBzaW1fY29yZV91bm1hcHBlZF9zaWduYWw6Ci0gICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJtbjEwMzAwLWNvcmU6ICVkIGJ5dGUgJXMgdG8gdW5tYXBwZWQgYWRkcmVzcyAweCVseCBhdCAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBucl9ieXRlcywgY29weSwgCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBpcCk7Ci0gICAgICBwcm9ncmFtX2ludGVycnVwdChzZCwgY3B1LCBjaWEsIFNJTV9TSUdTRUdWKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsOgotICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAibW4xMDMwMC1jb3JlOiAlZCBieXRlICVzIHRvIHVuYWxpZ25lZCBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG5yX2J5dGVzLCBjb3B5LCAKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKLSAgICAgIHByb2dyYW1faW50ZXJydXB0KHNkLCBjcHUsIGNpYSwgU0lNX1NJR0JVUyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgY3B1LCBjaWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAibW4xMDMwMF9jb3JlX3NpZ25hbCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOwotICAgIH0KLX0KLQotCi12b2lkCi1wcm9ncmFtX2ludGVycnVwdCAoU0lNX0RFU0Mgc2QsCi0JCSAgIHNpbV9jcHUgKmNwdSwKLQkJICAgc2ltX2NpYSBjaWEsCi0JCSAgIFNJTV9TSUdOQUwgc2lnKQotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgaHcgKmRldmljZTsKLSAgc3RhdGljIGludCBpbl9pbnRlcnJ1cHQgPSAwOwotCi0jaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUgotICBTSU1fQ1BVX0VYQ0VQVElPTl9UUklHR0VSKHNkLGNwdSxjaWEpOwotI2VuZGlmCi0KLSAgLyogYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uICovCi0gIGlmIChpbl9pbnRlcnJ1cHQpCi0gICAgewotICAgICAgKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAKLQkJCQkJICAgICJFUlJPUjogcmVjdXJzaW9uIGluIHByb2dyYW1faW50ZXJydXB0IGR1cmluZyBzb2Z0d2FyZSBleGNlcHRpb24gZGlzcGF0Y2guIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5faW50ZXJydXB0ID0gMTsKLSAgICAgIC8qIGNvcHkgTk1JIGhhbmRsZXIgY29kZSBmcm9tIGR2LW1uMTAzY3B1LmMgKi8KLSAgICAgIHN0b3JlX3dvcmQgKFNQIC0gNCwgQ0lBX0dFVCAoY3B1KSk7Ci0gICAgICBzdG9yZV9oYWxmIChTUCAtIDgsIFBTVyk7Ci0KLSAgICAgIC8qIFNldCB0aGUgU1lTRUYgZmxhZyBpbiBOTUlDUiBieSBiYWNrZG9vciBtZXRob2QuICBTZWUKLQkgZHYtbW4xMDNpbnQuYzp3cml0ZV9pY3IoKS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLSAgICAgICAgIHNvZnR3YXJlIGV4Y2VwdGlvbnMgYXJlIG5vdCBtb2RlbGxlZCBieSBhY3R1YWxseSB0YWxraW5nIHRvCi0gICAgICAgICB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIsIHNvIGl0IGNhbm5vdCBzZXQgaXRzIG93biBTWVNFRgotICAgICAgICAgZmxhZy4gKi8KLSAgICAgaWYgKChOVUxMICE9IGJvYXJkKSAmJiAoc3RyY21wKGJvYXJkLCBCT0FSRF9BTTMyKSA9PSAwKSkKLSAgICAgICBzdG9yZV9ieXRlICgweDM0MDAwMTAzLCAweDA0KTsKLSAgICB9Ci0KLSAgUFNXICY9IH5QU1dfSUU7Ci0gIFNQID0gU1AgLSA4OwotICBDSUFfU0VUIChjcHUsIDB4NDAwMDAwMDgpOwotCi0gIGluX2ludGVycnVwdCA9IDA7Ci0gIHNpbV9lbmdpbmVfaGFsdChzZCwgY3B1LCBOVUxMLCBjaWEsIHNpbV9zdG9wcGVkLCBzaWcpOwotfQotCi0KLXZvaWQKLW1uMTAzMDBfY3B1X2V4Y2VwdGlvbl90cmlnZ2VyKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGFkZHJlc3Nfd29yZCBjaWEpCi17Ci0gIEFTU0VSVChjcHUgIT0gTlVMTCk7Ci0KLSAgaWYoU3RhdGUuZXhjX3N1c3BlbmRlZCA+IDApCi0gICAgc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCBuZXN0ZWQgZXhjZXB0aW9uIHRyaWdnZXJlZCAoJWQpXG4iLCBTdGF0ZS5leGNfc3VzcGVuZGVkKTsgCi0KLSAgQ0lBX1NFVCAoY3B1LCBjaWEpOwotICBtZW1jcHkoU3RhdGUuZXhjX3RyaWdnZXJfcmVncywgU3RhdGUucmVncywgc2l6ZW9mKFN0YXRlLmV4Y190cmlnZ2VyX3JlZ3MpKTsKLSAgU3RhdGUuZXhjX3N1c3BlbmRlZCA9IDA7Ci19Ci0KLXZvaWQKLW1uMTAzMDBfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pCi17Ci0gIEFTU0VSVChjcHUgIT0gTlVMTCk7Ci0KLSAgaWYoU3RhdGUuZXhjX3N1c3BlbmRlZCA+IDApCi0gICAgc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCBuZXN0ZWQgZXhjZXB0aW9uIHNpZ25hbCAoJWQgdGhlbiAlZClcbiIsIAotCQkgICBTdGF0ZS5leGNfc3VzcGVuZGVkLCBleGNlcHRpb24pOyAKLQotICBtZW1jcHkoU3RhdGUuZXhjX3N1c3BlbmRfcmVncywgU3RhdGUucmVncywgc2l6ZW9mKFN0YXRlLmV4Y19zdXNwZW5kX3JlZ3MpKTsKLSAgbWVtY3B5KFN0YXRlLnJlZ3MsIFN0YXRlLmV4Y190cmlnZ2VyX3JlZ3MsIHNpemVvZihTdGF0ZS5yZWdzKSk7Ci0gIENJQV9TRVQgKGNwdSwgUEMpOyAvKiBjb3B5IFBDIGJhY2sgZnJvbSBuZXcgU3RhdGUucmVncyAqLwotICBTdGF0ZS5leGNfc3VzcGVuZGVkID0gZXhjZXB0aW9uOwotfQotCi12b2lkCi1tbjEwMzAwX2NwdV9leGNlcHRpb25fcmVzdW1lKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pCi17Ci0gIEFTU0VSVChjcHUgIT0gTlVMTCk7Ci0KLSAgaWYoZXhjZXB0aW9uID09IDAgJiYgU3RhdGUuZXhjX3N1c3BlbmRlZCA+IDApCi0gICAgewotICAgICAgaWYoU3RhdGUuZXhjX3N1c3BlbmRlZCAhPSBTSUdUUkFQKSAvKiB3YXJuIG5vdCBmb3IgYnJlYWtwb2ludHMgKi8KLSAgICAgICAgIHNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgcmVzdW1pbmcgYnV0IGlnbm9yaW5nIHBlbmRpbmcgZXhjZXB0aW9uIHNpZ25hbCAoJWQpXG4iLAotICAJCSAgICAgICBTdGF0ZS5leGNfc3VzcGVuZGVkKTsgCi0gICAgfQotICBlbHNlIGlmKGV4Y2VwdGlvbiAhPSAwICYmIFN0YXRlLmV4Y19zdXNwZW5kZWQgPiAwKQotICAgIHsKLSAgICAgIGlmKGV4Y2VwdGlvbiAhPSBTdGF0ZS5leGNfc3VzcGVuZGVkKSAKLQlzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIHJlc3VtaW5nIHdpdGggbWlzbWF0Y2hlZCBleGNlcHRpb24gc2lnbmFsICglZCB2cyAlZClcbiIsCi0JCSAgICAgICBTdGF0ZS5leGNfc3VzcGVuZGVkLCBleGNlcHRpb24pOyAKLSAgICAgIAotICAgICAgbWVtY3B5KFN0YXRlLnJlZ3MsIFN0YXRlLmV4Y19zdXNwZW5kX3JlZ3MsIHNpemVvZihTdGF0ZS5yZWdzKSk7IAotICAgICAgQ0lBX1NFVCAoY3B1LCBQQyk7IC8qIGNvcHkgUEMgYmFjayBmcm9tIG5ldyBTdGF0ZS5yZWdzICovCi0gICAgfQotICBlbHNlIGlmKGV4Y2VwdGlvbiAhPSAwICYmIFN0YXRlLmV4Y19zdXNwZW5kZWQgPT0gMCkKLSAgICB7Ci0gICAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIGlnbm9yaW5nIHNwb250YW5vdXMgZXhjZXB0aW9uIHNpZ25hbCAoJWQpXG4iLCBleGNlcHRpb24pOyAKLSAgICB9Ci0gIFN0YXRlLmV4Y19zdXNwZW5kZWQgPSAwOyAKLX0KZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL21uMTAzMDAuZGMgYi9zaW0vbW4xMDMwMC9tbjEwMzAwLmRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWJmM2ZkLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMzAwL21uMTAzMDAuZGMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXN3aXRjaCA6ICAgNyA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgIDAgOiAgICAgICAgICAgICA6Ci1zd2l0Y2ggOiAgIDcgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgotc3dpdGNoIDogICA3IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMiA6ICAgICAgICAgICAgIDoKLXN3aXRjaCA6ICAgNyA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgIDMgOiAgICAgICAgICAgICA6CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9tbjEwMzAwLmlnZW4gYi9zaW0vbW4xMDMwMC9tbjEwMzAwLmlnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTQxNDIuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvbW4xMDMwMC5pZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNDM1MiArMCwwIEBACi0vLyAtKi0gQyAtKi0KLTpvcHRpb246OjppbnNuLWJpdC1zaXplOjgKLTpvcHRpb246OjppbnNuLXNwZWNpZnlpbmctd2lkdGhzOnRydWUKLTpvcHRpb246OjpoaS1iaXQtbnI6NwotOm1vZGVsOjo6bW4xMDMwMDptbjEwMzAwOgotOm1vZGVsOjo6YW0zMzphbTMzOgotCi0vLyBXaGF0IGRvIHdlIGRvIHdpdGggYW4gaWxsZWdhbCBpbnN0cnVjdGlvbj8KLTppbnRlcm5hbDo6OjppbGxlZ2FsOgotewotICBQQyA9IGNpYTsKLSAgcHJvZ3JhbV9pbnRlcnJ1cHQoU0QsIENQVSwgY2lhLCBTSU1fU0lHSUxMKTsKLX0KLQotLy8gMTAwMCBEbkRuIGltbTguLi4uOyBtb3YgaW1tOCxEbiAoaW1tOCBpcyBzaWduIGV4dGVuZGVkKQotNC4weDgsMi5ETTEsMi5ETjA9RE0xKzguSU1NODpTMGk6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogIE9QXzgwMDAgKCk7ICovCi0gIHNpZ25lZDMyIGltbWVkID0gRVhURU5EOCAoSU1NOCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwK0ROMF0gPSBpbW1lZDsKLSAgUEMgPSBjaWE7Ci19Ci0KLS8vIDEwMDAgRG1EbjsgbW92IERtLERuIChEbSAhPSBEbiwgc2VlIGFib3ZlIHdoZW4gRG0gPT0gRG4pCi00LjB4OCwyLkRNMSwyLkROMCFETTE6UzA6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgUEMgPSBjaWE7Ci0gIC8qIE9QXzgwICgpOyAqLwotICBTdGF0ZS5yZWdzW1JFR19EMCtETjBdID0gU3RhdGUucmVnc1tSRUdfRDArRE0xXTsKLX0KLQotCi0vLyAxMTExIDAwMDEgMTExMCBEbUFuOyBtb3YgRG0sQW4KLTguMHhmMSsxMTEwLDIuRE0xLDIuQU4wOkQwOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0YxRTAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci19Ci0KLQotLy8gMTExMSAwMDAxIDExMDEgQW1EbjsgbW92IEFtLERuCi04LjB4ZjErMTEwMSwyLkFNMSwyLkROMDpEMGE6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjFEMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXTsKLX0KLQotCi0vLyAxMDAxIEFuQW4gaW1tOC4uLi47IG1vdiBpbW04LEFuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQpCi00LjB4OSwyLkFNMSwyLkFOMD1BTTErOC5JTU04OlMwYWk6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgIFBDID0gY2lhOwotICAgLyogT1BfOTAwMCAoKTsgKi8KLSAgIFN0YXRlLnJlZ3NbUkVHX0EwK0FOMF0gPSBJTU04OwotfQotCi0KLS8vIDEwMDEgQW1BbjsgbW92IEFtLEFuIChBbSAhPSBBbiwgc2F2ZSBhYm92ZSB3aGVuIEFtID09IEFuKQotNC4weDksMi5BTTEsMi5BTjAhQU0xOlMwYTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAgUEMgPSBjaWE7Ci0gICAvKiBPUF85MCAoKTsgKi8KLSAgIFN0YXRlLnJlZ3NbUkVHX0EwK0FOMF0gPSBTdGF0ZS5yZWdzW1JFR19BMCtBTTFdOwotfQotCi0KLS8vIDAwMTEgMTFBbjsgbW92IFNQLEFuCi00LjB4MywxMSwyLkFOMDpTMGI6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfM0MgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci19Ci0KLQotLy8gMTExMSAwMDEwIDExMTEgQW0wMDsgbW92IEFtLFNQCi04LjB4ZjIrNC4weGYsMi5BTTEsMDA6RDBiOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0YyRjAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19TUF0gPSBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV07Ci19Ci0KLQotLy8gMTExMSAwMDEwIDExMTAgMDFEbjsgbW92IFBTVyxEbgotOC4weGYyKzQuMHhlLDAxLDIuRE4wOkQwYzo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GMkU0ICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gUFNXOwotfQotCi0KLS8vIDExMTEgMDAxMCAxMTExIERtMTE7IG1vdiBEbSxQU1cKLTguMHhmMis0LjB4ZiwyLkRNMSwxMTpEMGQ6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjJGMyAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFBTVyA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLX0KLQotCi0vLyAxMTExIDAwMTAgMTExMCAwMERuOyBtb3YgTURSLERuCi04LjB4ZjIrNC4weGUsMDAsMi5ETjA6RDBlOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0YyRTAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBTdGF0ZS5yZWdzW1JFR19NRFJdOwotfQotCi0KLS8vIDExMTEgMDAxMCAxMTExIERtMTA7IG1vdiBEbSxNRFIKLTguMHhmMis0LjB4ZiwyLkRNMSwxMDpEMGY6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjJGMiAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci19Ci0KLQotLy8gMDExMSBEbkFtOyBtb3YgKEFtKSxEbgotNC4weDcsMi5ETjEsMi5BTTA6UzBjOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QXzcwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0pOwotfQotCi0KLS8vIDExMTEgMTAwMCAwMDAwIERuQW0gZDguLi4uLi47IG1vdiAoZDgsQW0pLERuIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGY4KzQuMHgwLDIuRE4xLDIuQU0wKzguRDg6RDE6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjgwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBFWFRFTkQ4IChEOCkpKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMDAwMCBEbkFtIGQxNi4uLi4uOyBtb3YgKGQxNixBbSksRG4gKGQxNiBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4MCwyLkROMSwyLkFNMCs4LkQxNkErOC5EMTZCOkQyOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZBMDAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSkpKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMDAwMCBEbkFtIGQzMi4uLi4uOyBtb3YgKGQzMixBbSksRG4KLTguMHhmYys0LjB4MCwyLkROMSwyLkFNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GQzAwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdCi0JCSAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKLX0KLQotCi0vLyAwMTAxIDEwRG4gZDguLi4uLi47IG1vdiAoZDgsU1ApLERuIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQotNC4weDUsMTAsMi5ETjArOC5EODpTMTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF81ODAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBEOCk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDEwMTEgMDFEbiBkMTYuLi4uLjsgbW92IChkMTYsU1ApLERuIChkMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weGIsMDEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDJhOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZBQjQwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAxMSAwMURuIGQzMi4uLi4uOyBtb3YgKGQzMixTUCksRG4KLTguMHhmYys0LjB4YiwwMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkNCNDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci19Ci0KLQotLy8gMTExMSAwMDExIDAwRG4gRGlBbTsgbW92IChEaSxBbSksRG4KLTguMHhmMyswMCwyLkROMiwyLkRJLDIuQU0wOkQwZzo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GMzAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjJdCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBTdGF0ZS5yZWdzW1JFR19EMCArIERJXSkpOwotfQotCi0KLS8vIDAwMTEgMDBEbiBhYnMxNi4uLjsgbW92IChhYnMxNiksRG4gKGFiczE2IGlzIHplcm8tZXh0ZW5kZWQpCi00LjB4MywwMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpTMjo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF8zMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX3dvcmQgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotLy8gMTExMSAxMTAwIDEwMTAgMDFEbiBhYnMzMi4uLjsgbW92IChhYnMzMiksRG4KLTguMHhmYys0LjB4YSwwMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGI6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkNBNDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX3dvcmQgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci19Ci0KLQotLy8gMTExMSAwMDAwIDAwMDAgQW5BbTsgbW92IChBbSksQW4KLTguMHhmMCs0LjB4MCwyLkFOMSwyLkFNMDpEMGg6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4xXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMDAxMCBBbkFtIGQ4Li4uLi4uOyBtb3YgKGQ4LEFtKSxBbiAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs0LjB4MiwyLkFOMSwyLkFNMCs4LkQ4OkQxYTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GODIwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0KLSAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSArIEVYVEVORDggKEQ4KSkpOwotfQotCi0KLS8vIDExMTEgMTAxMCAwMDEwIEFuQW0gZDE2Li4uLi47IG1vdiAoZDE2LEFtKSxBbiAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQotOC4weGZhKzQuMHgyLDIuQU4xLDIuQU0wKzguRDE2QSs4LkQxNkI6RDJiOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZBMjAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjFdCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KLQkJICArIEVYVEVORDE2IChGRVRDSDE2KEQxNkEsIEQxNkIpKSkpOwotfQotCi0KLS8vIDExMTEgMTEwMCAwMDEwIEFuQW0gZDMyLi4uLi47IG1vdiAoZDMyLEFtKSxBbgotOC4weGZjKzQuMHgyLDIuQU4xLDIuQU0wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Yzo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GQzIwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4xXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdCi0JCSAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKLX0KLQotCi0vLyAwMTAxIDExQW4gZDguLi4uLi47IG1vdiAoZDgsU1ApLEFuIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQotNC4weDUsMTEsMi5BTjArOC5EODpTMWE6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfNUMwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXQotICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBEOCk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDEwMTEgMDBBbiBkMTYuLi4uLjsgbW92IChkMTYsU1ApLEFuIChkMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weGIsMDAsMi5BTjArOC5JTU0xNkErOC5JTU0xNkI6RDJjOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZBQjAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAxMSAwMEFuIGQzMi4uLi4uOyBtb3YgKGQzMixTUCksQW4KLTguMHhmYys0LjB4YiwwMCwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGQ6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkNCMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KLSAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdCi0JCSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Ci19Ci0KLQotLy8gMTExMSAwMDExIDEwQW4gRGlBbTsgbW92IChEaSxBbSksQW4KLTguMHhmMysxMCwyLkFOMiwyLkRJLDIuQU0wOkQwaTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GMzgwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjJdCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KLQkJICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAxMCAwMEFuIGFiczE2Li4uOyBtb3YgKGFiczE2KSxBbiAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKLTguMHhmYSs0LjB4YSwwMCwyLkFOMCs4LklNTTE2QSs4LklNTTE2QjpEMmQ6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkFBMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBsb2FkX3dvcmQgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAxMCAwMEFuIGFiczMyLi4uOyBtb3YgKGFiczMyKSxBbgotOC4weGZjKzQuMHhhLDAwLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0ZTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GQ0EwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXQotICAgID0gbG9hZF93b3JkIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMTExIDAwQW0gZDguLi4uLi47IG1vdiAoZDgsQW0pLFNQIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGY4KzQuMHhmLDAwLDIuQU0wKzguRDg6RDFiOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0Y4RjAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgRVhURU5EOCAoRDgpKSk7Ci19Ci0KLQotLy8gMDExMCBEbUFuOyBtb3YgRG0sKEFuKQotNC4weDYsMi5ETTEsMi5BTjA6UzBkOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QXzYwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTAwMCAwMDAxIERtQW4gZDguLi4uLi47IG1vdiBEbSwoZDgsQW4pIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGY4KzQuMHgxLDIuRE0xLDIuQU4wKzguRDg6RDFjOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0Y4MTAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCkpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDAwMDEgRG1BbiBkMTYuLi4uLjsgbW92IERtLChkMTYsQW4pIChkMTYgaXMgc2lnbi1leHRlbmRlZC4pCi04LjB4ZmErNC4weDEsMi5ETTEsMi5BTjArOC5EMTZBKzguRDE2QjpEMmU6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkExMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAwMDAxIERtQW4gZDMyLi4uLi47IG1vdiBEbSwoZDMyLEFuKQotOC4weGZjKzQuMHgxLDIuRE0xLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Zjo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GQzEwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KLQkgICAgICAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMDEwMCBEbTEwIGQ4Li4uLi4uOyBtb3YgRG0sKGQ4LFNQKSAoZDggaXMgemVyby1leHRlbmRlZCkKLTQuMHg0LDIuRE0xLDEwKzguRDg6UzFiOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QXzQyMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBEOCwgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAwMSBEbTAxIGQxNi4uLi4uOyBtb3YgRG0sKGQxNixTUCkgKGQxNiBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4OSwyLkRNMSwwMSs4LklNTTE2QSs4LklNTTE2QjpEMmY6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkE5MTAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMDAxIERtMDEgZDMyLi4uLi47IG1vdiBEbSwoZDMyLFNQKQotOC4weGZjKzQuMHg5LDIuRE0xLDAxKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Zzo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GQzkxMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMDAxMSAwMURtIERpQW47IG1vdiBEbSwoRGksQW4pCi04LjB4ZjMrMDEsMi5ETTIsMi5ESSwyLkFOMDpEMGo6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjM0MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBTdGF0ZS5yZWdzW1JFR19EMCArIERJXSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTJdKTsKLX0KLQotCi0vLyAwMDAwIERtMDEgYWJzMTYuLi4sIG1vdiBEbSwoYWJzMTYpIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKS4KLTQuMHgwLDIuRE0xLDAxKzguSU1NMTZBKzguSU1NMTZCOlMyYTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF8xMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMDAwIERtMDEgYWJzMzIuLi47IG1vdiBEbSwoYWJzMzIpCi04LjB4ZmMrNC4weDgsMi5ETTEsMDErOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRoOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZDODEwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAwMDAwIDAwMDEgQW1BbjsgbW92IEFtLChBbikKLTguMHhmMCs0LjB4MSwyLkFNMSwyLkFOMDpEMGs6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRjAxMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSwgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMDAxMSBBbUFuIGQ4Li4uLi4uOyBtb3YgQW0sKGQ4LEFuKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs0LjB4MywyLkFNMSwyLkFOMCs4LkQ4OkQxZDo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0qYW0zMwotewotICAvKiBPUF9GODMwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0pOwotfQotCi0KLS8vIDExMTEgMTAxMCAwMDExIEFtQW4gZDE2Li4uLi47IG1vdiBBbSwoZDE2LEFuKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQotOC4weGZhKzQuMHgzLDIuQU0xLDIuQU4wKzguRDE2QSs4LkQxNkI6RDJnOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLSphbTMzCi17Ci0gIC8qIE9QX0ZBMzAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDE2IChGRVRDSDE2KEQxNkEsIEQxNkIpKSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMDAxMSBBbUFuIGQzMi4uLi4uOyBtb3YgQW0sKGQzMixBbikKLTguMHhmYys0LjB4MywyLkFNMSwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGk6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotKmFtMzMKLXsKLSAgLyogT1BfRkMzMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdCi0JICAgICAgICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0pOwotfQotCi0KLS8vIDAxMDAgQW0xMSBkOC4uLi4uLjsgbW92IEFtLChkOCxTUCkgKGQ4IGlzIHplcm8tZXh0ZW5kZWQpCi00LjB4NCwyLkFNMSwxMSs4LkQ4OlMxYzo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfNDMwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChEOCksIFN0YXRlLnJlZ3NbUkVHX0EwICsgKEFNMSldKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAwMSBBbTAwIGQxNi4uLi4uOyBtb3YgQW0sKGQxNixTUCkgKGQxNiBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4OSwyLkFNMSwwMCs4LklNTTE2QSs4LklNTTE2QjpEMmg6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBOTAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAwMSBBbTAwIGQzMi4uLi4uOyBtb3YgQW0sKGQzMixTUCkKLTguMHhmYys0LjB4OSwyLkFNMSwwMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGo6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDOTAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSk7Ci19Ci0KLQotLy8gMTExMSAwMDExIDExQW0gRGlBbjsgbW92IEFtLChEaSxBbikKLTguMHhmMysxMSwyLkFNMiwyLkRJLDIuQU4wOkQwbDo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjNDMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBTdGF0ZS5yZWdzW1JFR19EMCArIERJXSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTJdKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAwMCBBbTAwIGFiczE2Li4uOyBtb3YgQW0sKGFiczE2KSAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKLTguMHhmYSs0LjB4OCwyLkFNMSwwMCs4LklNTTE2QSs4LklNTTE2QjpEMmk6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBODAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAwMCBBbTAwIGFiczMyLi4uOyBtb3YgQW0sKGFiczMyKQotOC4weGZjKzQuMHg4LDIuQU0xLDAwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0azo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkM4MDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV93b3JkIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMTExMSAwMUFuIGQ4Li4uLi4uOyBtb3YgU1AsKGQ4LEFuKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs0LjB4ZiwwMSwyLkFOMCs4LkQ4OkQxZTo6Om1vdgotIm1vdiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjhGNDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX1NQXSk7Ci19Ci0KLQotLy8gMDAxMCAxMURuIGltbTE2Li4uOyBtb3YgaW1tMTYsRG4gKGltbTE2IGlzIHNpZ24tZXh0ZW5kZWQpCi00LjB4MiwxMSwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpTMmI6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QXzJDMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiB2YWx1ZTsKLQotICBQQyA9IGNpYTsKLSAgdmFsdWUgPSBFWFRFTkQxNiAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB2YWx1ZTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTEwMCAxMURuIGltbTMyLi4uOyBtb3YgaW1tMzIsRG4KLTguMHhmYys0LjB4YywxMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGw6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDQ0MwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIHZhbHVlOwotCi0gIFBDID0gY2lhOwotICB2YWx1ZSA9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdmFsdWU7Ci19Ci0KLQotLy8gMDAxMCAwMUFuIGltbTE2Li4uOyBtb3YgaW1tMTYsQW4gKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQpCi00LjB4MiwwMSwyLkFOMCs4LklNTTE2QSs4LklNTTE2QjpTMmM6Ojptb3YKLSJtb3YiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QXzI0MDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiB2YWx1ZTsKLQotICBQQyA9IGNpYTsKLSAgdmFsdWUgPSBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdID0gdmFsdWU7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDExMDEgMTFBbiBpbW0zMi4uLjsgbW92IGltbTMyLEFuCi04LjB4ZmMrNC4weGQsMTEsMi5BTjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRtOjo6bW92Ci0ibW92IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAgIC8qIE9QX0ZDREMwMDAwICgpOyAqLwotICAgIFBDID0gY2lhOwotICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSA9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDEwMCBEbkFtOyBtb3ZidSAoQW0pLERuCi04LjB4ZjArNC4weDQsMi5ETjEsMi5BTTA6RDA6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMDQwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDAxMDAgRG5BbSBkOC4uLi4uLjsgbW92YnUgKGQ4LEFtKSxEbiAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs0LjB4NCwyLkROMSwyLkFNMCs4LkQ4OkQxZjo6Om1vdmJ1Ci0ibW92YnUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y4NDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgRVhURU5EOCAoRDgpKSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDAxMDAgRG5BbSBkMTYuLi4uLjsgbW92YnUgKGQxNixBbSksRG4gKGQxNiBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4NCwyLkROMSwyLkFNMCs4LkQxNkErOC5EMTZCOkQyOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkE0MDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMV0KLSAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQotCQkgICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDAxMDAgRG5BbSBkMzIuLi4uLjsgbW92YnUgKGQzMixBbSksRG4KLTguMHhmYys0LjB4NCwyLkROMSwyLkFNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6Om1vdmJ1Ci0ibW92YnUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDNDAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KLQkJICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSkpOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMDExIDEwRG4gZDguLi4uLi47IG1vdmJ1IChkOCxTUCksRG4gKGQ4IGlzIHplcm8tZXh0ZW5kZWQpCi04LjB4ZjgrNC4weGIsMTAsMi5ETjArOC5EODpEMWE6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEI4MDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChEOCkpKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTAxMSAxMERuIGQxNi4uLi4uOyBtb3ZidSAoZDE2LFNQKSxEbiAoZDE2IGlzIHplcm8tZXh0ZW5kZWQuKQotOC4weGZhKzQuMHhiLDEwLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6Om1vdmJ1Ci0ibW92YnUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBQjgwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCi0gICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19TUF0KLQkJICArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDEwMTEgMTBEbiBkMzIuLi4uLjsgbW92YnUgKGQzMixTUCksRG4KLTguMHhmYys0LjB4YiwxMCwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0I4MDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0KLQkJICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotCi0vLyAxMTExIDAxMDAgMDBEbiBEaUFtOyBtb3ZidSAoRGksQW0pLERuCi04LjB4ZjQrMDAsMi5ETjIsMi5ESSwyLkFNMDpEMGE6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GNDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjJdCi0gICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KLQkJICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgREldKSk7Ci19Ci0KLQotLy8gMDAxMSAwMURuIGFiczE2Li4uOyBtb3ZidSAoYWJzMTYpLERuIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKQotNC4weDMsMDEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6UzI6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF8zNDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX2J5dGUgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAxMCAxMERuIGFiczMyLi4uOyBtb3ZidSAoYWJzMzIpLERuCi04LjB4ZmMrNC4weGEsMTAsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRiOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNBODAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA9IGxvYWRfYnl0ZSAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDEwMSBEbUFuOyBtb3ZidSBEbSwoQW4pCi04LjB4ZjArNC4weDUsMi5ETTEsMi5BTjA6RDBiOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjA1MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMDEwMSBEbUFuIGQ4Li4uLi4uOyBtb3ZidSBEbSwoZDgsQW4pIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGY4KzQuMHg1LDIuRE0xLDIuQU4wKzguRDg6RDFiOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjg1MDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDggKEQ4KSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMDEwMSBEbUFuIGQxNi4uLi4uOyBtb3ZidSBEbSwoZDE2LEFuKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQotOC4weGZhKzQuMHg1LDIuRE0xLDIuQU4wKzguRDE2QSs4LkQxNkI6RDJiOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkE1MDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAwMTAxIERtQW4gZDMyLi4uLi47IG1vdmJ1IERtLChkMzIsQW4pCi04LjB4ZmMrNC4weDUsMi5ETTEsMi5BTjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRjOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkM1MDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdCi0JICAgICAgICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMDAxIERtMTAgZDguLi4uLi47IG1vdmJ1IERtLChkOCxTUCkgKGQ4IGlzIHplcm8tZXh0ZW5kZWQpCi04LjB4ZjgrNC4weDksMi5ETTEsMTArOC5EODpEMWM6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GODkyMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoRDgpLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMDAxIERtMTAgZDE2Li4uLi47IG1vdmJ1IERtLChkMTYsU1ApIChkMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weDksMi5ETTEsMTArOC5JTU0xNkErOC5JTU0xNkI6RDJjOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkE5MjAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMDAxIERtMTAgZDMyLi4uLi47IG1vdmJ1IERtLChkMzIsU1ApCi04LjB4ZmMrNC4weDksMi5ETTEsMTArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRkOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkM5MjAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDAxMDAgMDFEbSBEaUFuOyBtb3ZidSBEbSwoRGksQW4pCi04LjB4ZjQrMDEsMi5ETTIsMi5ESSwyLkFOMDpEMGM6Ojptb3ZidQotIm1vdmJ1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GNDQwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgREldKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMl0pOwotfQotCi0KLS8vIDAwMDAgRG0xMCBhYnMxNi4uLjsgbW92YnUgRG0sKGFiczE2KSAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKLTQuMHgwLDIuRE0xLDEwKzguSU1NMTZBKzguSU1NMTZCOlMyYTo6Om1vdmJ1Ci0ibW92YnUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QXzIwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgc3RvcmVfYnl0ZSAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAwMCBEbTEwIGFiczMyLi4uOyBtb3ZidSBEbSwoYWJzMzIpCi04LjB4ZmMrNC4weDgsMi5ETTEsMTArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRlOjo6bW92YnUKLSJtb3ZidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkM4MjAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9ieXRlIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDExMCBEbkFtOyBtb3ZodSAoQW0pLERuCi04LjB4ZjArNC4weDYsMi5ETjEsMi5BTTA6RDA6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMDYwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDAxMTAgRG5BbSBkOC4uLi4uLjsgbW92aHUgKGQ4LEFtKSxEbiAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs0LjB4NiwyLkROMSwyLkFNMCs4LkQ4OkQxZDo6Om1vdmh1Ci0ibW92aHUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y4NjAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQotICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgRVhURU5EOCAoRDgpKSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDAxMTAgRG5BbSBkMTYuLi4uLjsgbW92aHUgKGQxNixBbSksRG4gKGQxNiBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4NiwyLkROMSwyLkFNMCs4LkQxNkErOC5EMTZCOkQyOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkE2MDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMV0KLSAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQotCQkgICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDAxMTAgRG5BbSBkMzIuLi4uLjsgbW92aHUgKGQzMixBbSksRG4KLTguMHhmYys0LjB4NiwyLkROMSwyLkFNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6Om1vdmh1Ci0ibW92aHUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDNjAwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCi0gICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KLQkJICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSkpOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMDExIDExRG4gZDguLi4uLjsgbW92aHUgKGQ4LFNQKSxEbiAoZDggaXMgemVyby1leHRlbmRlZCkKLTguMHhmOCs0LjB4YiwxMSwyLkROMCs4LkQ4OkQxYTo6Om1vdmh1Ci0ibW92aHUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y4QkMwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfU1BdICsgKEQ4KSkpOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMDExIDExRG4gZDE2Li4uLi47IG1vdmh1IChkMTYsU1ApLERuIChkMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weGIsMTEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDJhOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFCQzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDEwMTEgMTFEbiBkMzIuLi4uLjsgbW92aHUgKGQzMixTUCksRG4KLTguMHhmYys0LjB4YiwxMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0JDMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotfQotCi0KLS8vIDExMTEgMDEwMCAxMERuIERpQW07IG1vdmh1IChEaSxBbSksRG4KLTguMHhmNCsxMCwyLkROMiwyLkRJLDIuQU0wOkQwYTo6Om1vdmh1Ci0ibW92aHUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y0ODAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMl0KLSAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgREldKSk7Ci19Ci0KLQotLy8gMDAxMSAxMERuIGFiczE2Li4uOyBtb3ZodSAoYWJzMTYpLERuIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKQotNC4weDMsMTAsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6UzI6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF8zODAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX2hhbGYgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAxMCAxMURuIGFiczMyLi4uOyBtb3ZodSAoYWJzMzIpLERuCi04LjB4ZmMrNC4weGEsMTEsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRiOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNBQzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA9IGxvYWRfaGFsZiAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKLX0KLQotCi0vLyAxMTExIDAwMDAgMDExMSBEbUFuOyBtb3ZodSBEbSwoQW4pCi04LjB4ZjArNC4weDcsMi5ETTEsMi5BTjA6RDBiOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjA3MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTAwMCAwMTExIERtQW4gZDguLi4uLi47IG1vdmh1IERtLChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4ZjgrNC4weDcsMi5ETTEsMi5BTjArOC5EODpEMWI6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GODcwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMTAxMCAwMTExIERuQW0gZDE2Li4uLi47IG1vdmh1IERtLChkMTYsQW4pIChkMTYgaXMgc2lnbi1leHRlbmRlZC4pCi04LjB4ZmErNC4weDcsMi5ETTEsMi5BTjArOC5EMTZBKzguRDE2QjpEMmI6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQTcwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSkpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDAxMTEgRG1BbiBkMzIuLi4uLjsgbW92aHUgRG0sKGQzMixBbikKLTguMHhmYys0LjB4NywyLkRNMSwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGM6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQzcwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KLQkgICAgICAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDEwMDEgRG0xMSBkOC4uLi47IG1vdmh1IERtLChkOCxTUCkgKGQ4IGlzIHplcm8tZXh0ZW5kZWQpCi04LjB4ZjgrNC4weDksMi5ETTEsMTErOC5EODpEMWM6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GODkzMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoRDgpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDEwMDEgRG0xMSBkMTYuLi4uLjsgbW92aHUgRG0sKGQxNixTUCkgKGQxNiBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4OSwyLkRNMSwxMSs4LklNTTE2QSs4LklNTTE2QjpEMmM6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQTkzMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci19Ci0KLQotLy8gMTExMSAxMTAwIDEwMDEgRG0xMSBkMzIuLi4uLjsgbW92aHUgRG0sKGQzMixTUCkKLTguMHhmYys0LjB4OSwyLkRNMSwxMSs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGQ6Ojptb3ZodQotIm1vdmh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQzkzMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotfQotCi0KLS8vIDExMTEgMDEwMCAxMURtIERpQW47IG1vdmh1IERtLChEaSxBbikKLTguMHhmNCsxMSwyLkRNMiwyLkRJLDIuQU4wOkQwYzo6Om1vdmh1Ci0ibW92aHUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y0QzAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0yXSk7Ci19Ci0KLQotLy8gMDAwMCBEbTExIGFiczE2Li4uOyBtb3ZodSBEbSwoYWJzMTYpIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKQotNC4weDAsMi5ETTEsMTErOC5JTU0xNkErOC5JTU0xNkI6UzJhOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfMzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9oYWxmIChGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTAwMCBEbTExIGFiczMyLi4uOyBtb3ZodSBEbSwoYWJzMzIpCi04LjB4ZmMrNC4weDgsMi5ETTEsMTErOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRlOjo6bW92aHUKLSJtb3ZodSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkM4MzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBzdG9yZV9oYWxmIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLX0KLQotCi0vLyAxMTExIDAwMTAgMTEwMSAwMERuOyBleHQgRG4KLTguMHhmMis0LjB4ZCwwMCwyLkROMDpEMDo6OmV4dAotImV4dCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjJEMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmIChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAtMTsKLSAgZWxzZQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAwOwotfQotCi0KLS8vIDAwMDEgMDBEbjsgZXh0YiBEbgotNC4weDEsMDAsMi5ETjA6UzA6OjpleHRiCi0iZXh0YiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfMTAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBFWFRFTkQ4IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOwotfQotCi0KLS8vIDAwMDEgMDFEbjsgZXh0YnUgRG4KLTQuMHgxLDAxLDIuRE4wOlMwOjo6ZXh0YnUKLSJleHRidSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfMTQgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJj0gMHhmZjsKLX0KLQotCi0vLyAwMDAxIDEwRG47IGV4dGggRG4KLTQuMHgxLDEwLDIuRE4wOlMwOjo6ZXh0aAotImV4dGgiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QXzE4ICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSk7Ci19Ci0KLQotLy8gMDAwMSAxMURuOyBleHRodSBEbgotNC4weDEsMTEsMi5ETjA6UzA6OjpleHRodQotImV4dGh1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF8xQyAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmPSAweGZmZmY7Ci19Ci0KLQotLy8gMDAwMCBEbjAwOyBjbHIgRG4KLTQuMHgwLDIuRE4xLDAwOlMwOjo6Y2xyCi0iY2xyIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF8wICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdID0gMDsKLQotICBQU1cgfD0gUFNXX1o7Ci0gIFBTVyAmPSB+KFBTV19WIHwgUFNXX0MgfCBQU1dfTik7Ci19Ci0KLQotLy8gMTExMCBEbURuOyBhZGQgRG0sRG4KLTQuMHhlLDIuRE0xLDIuRE4wOlMwOjo6YWRkCi0iYWRkIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9FMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdLCBSRUdfRDAgKyBETjApOwotfQotCi0vLyAxMTExIDAwMDEgMDExMCBEbUFuOyBhZGQgRG0sQW4KLTguMHhmMSs0LjB4NiwyLkRNMSwyLkFOMDpEMDo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjE2MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdLCBSRUdfQTAgKyBBTjApOwotfQotCi0KLS8vIDExMTEgMDAwMSAwMTAxIEFtRG47IGFkZCBBbSxEbgotOC4weGYxKzQuMHg1LDIuQU0xLDIuRE4wOkQwYTo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjE1MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdLCBSRUdfRDAgKyBETjApOwotfQotCi0KLS8vIDExMTEgMDAwMSAwMTExIEFtQW47IGFkZCBBbSxBbgotOC4weGYxKzQuMHg3LDIuQU0xLDIuQU4wOkQwYjo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjE3MCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdLCBSRUdfQTAgKyBBTjApOwotfQotCi0KLS8vIDAwMTAgMTBEbiBpbW04Li4uLjsgYWRkIGltbTgsRG4gKGltbTggaXMgc2lnbi1leHRlbmRlZCkKLTQuMHgyLDEwLDIuRE4wKzguSU1NODpTMTo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfMjgwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoRVhURU5EOChJTU04KSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTEwMCAwMERuIGltbTE2Li4uOyBhZGQgaW1tMTYsRG4KLTguMHhmYSs0LjB4YywwMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFDMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQWRkKEVYVEVORDE2KEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTEwMCAwMERuIGltbTMyLi4uOyBhZGQgaW1tMzIsRG4KLTguMHhmYys0LjB4YywwMCwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNDMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQWRkKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAwMDEwIDAwQW4gaW1tOC4uLi47IGFkZCBpbW04LEFuIChpbW04IGlzIHNpZ24tZXh0ZW5kZWQpCi00LjB4MiwwMCwyLkFOMCs4LklNTTg6UzFhOjo6YWRkCi0iYWRkIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF8yMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY0FkZChFWFRFTkQ4KElNTTgpLCBSRUdfQTAgKyBBTjApOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMTAxIDAwQW4gaW1tMTYuLi47IGFkZCBpbW0xNixBbiAoaW1tMTYgaXMgc2lnbi1leHRlbmRlZC4pCi04LjB4ZmErNC4weGQsMDAsMi5BTjArOC5JTU0xNkErOC5JTU0xNkI6RDJhOjo6YWRkCi0iYWRkIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQUQwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNBZGQoRVhURU5EMTYoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpLCBSRUdfQTAgKyBBTjApOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMTAxIDAwQW4gaW1tMzIuLi47IGFkZCBpbW0zMixBbgotOC4weGZjKzQuMHhkLDAwLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0YTo6OmFkZAotImFkZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNEMDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQWRkKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgUkVHX0EwICsgQU4wKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMTExMSAxMTEwIGltbTguLi4uOyBhZGQgaW1tOCxTUCAoaW1tOCBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmOCs4LjB4ZmUrOC5JTU04OkQxOjo6YWRkCi0iYWRkIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEZFMDAgKCk7ICovCi0gIHVuc2lnbmVkMzIgaW1tOwotCi0gIC8qIE5vdGU6IG5vIFBTVyBjaGFuZ2VzLiAqLwotICBQQyA9IGNpYTsKLSAgaW1tID0gRVhURU5EOCAoSU1NOCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSBpbW07Ci19Ci0KLQotLy8gMTExMSAxMDEwIDExMTEgMTExMCBpbW0xNi4uLjsgYWRkIGltbTE2LFNQIChpbW0xNiBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmYSs4LjB4ZmUrOC5JTU0xNkErOC5JTU0xNkI6RDJiOjo6YWRkCi0iYWRkIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQUZFMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiBpbW07Ci0KLSAgLyogTm90ZTogbm8gUFNXIGNoYW5nZXMuICovCi0gIFBDID0gY2lhOwotICBpbW0gPSBFWFRFTkQxNiAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOwotICBTdGF0ZS5yZWdzW1JFR19TUF0gKz0gaW1tOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMTExIDExMTAgaW1tMzIuLi47IGFkZCBpbW0zMixTUAotOC4weGZjKzguMHhmZSs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGI6OjphZGQKLSJhZGQiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDRkUwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIGltbTsKLQotICAvKiBOb3RlOiBubyBQU1cgY2hhbmdlcy4gKi8KLSAgUEMgPSBjaWE7Ci0gIGltbSA9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLSAgU3RhdGUucmVnc1tSRUdfU1BdICs9IGltbTsKLX0KLQotCi0vLyAxMTExIDAwMDEgMDEwMCBEbURuOyBhZGRjIERtLERuCi04LjB4ZjErNC4weDQsMi5ETTEsMi5ETjA6RDA6OjphZGRjCi0iYWRkYyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjE0MCAoKTsgKi8KLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkMzIgcmVnMSwgcmVnMiwgc3VtOwotCi0gIFBDID0gY2lhOwotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOwotICBzdW0gPSByZWcxICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBzdW07Ci0KLSAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7Ci0gIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAoc3VtIDwgcmVnMSkgfHwgKHN1bSA8IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0KLS8vIDExMTEgMDAwMSAwMDAwIERtRG47IHN1YiBEbSxEbgotOC4weGYxKzQuMHgwLDIuRE0xLDIuRE4wOkQwOjo6c3ViCi0ic3ViIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMTAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY1N1YihTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0sIFJFR19EMCArIEROMCk7Ci19Ci0KLS8vIDExMTEgMDAwMSAwMDEwIERtQW47IHN1YiBEbUFuCi04LjB4ZjErNC4weDIsMi5ETTEsMi5BTjA6RDBhOjo6c3ViCi0ic3ViIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMTIwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY1N1YihTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0sIFJFR19BMCArIEFOMCk7Ci19Ci0KLQotLy8gMTExMSAwMDAxIDAwMDEgQW1Ebjsgc3ViIEFtRG4KLTguMHhmMSs0LjB4MSwyLkFNMSwyLkROMDpEMGI6OjpzdWIKLSJzdWIiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YxMTAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljU3ViKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDAwMDEgMDAxMSBBbUFuOyBzdWIgQW0sQW4KLTguMHhmMSs0LjB4MywyLkFNMSwyLkFOMDpEMGM6OjpzdWIKLSJzdWIiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YxMzAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljU3ViKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSwgUkVHX0EwICsgQU4wKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTEwMCAwMURuIGltbTMyLi4uOyBzdWIgaW1tMzIsRG4KLTguMHhmYys0LjB4YywwMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6OnN1YgotInN1YiIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNDNDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljU3ViKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTEwMSAwMUFuIGltbTMyLi4uOyBzdWIgaW1tMzIsQW4KLTguMHhmYys0LjB4ZCwwMSwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6OjpzdWIKLSJzdWIiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDRDQwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY1N1YihGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksIFJFR19BMCArIEFOMCk7Ci19Ci0KLQotLy8gMTExMSAwMDAxIDEwMDAgRG1Ebjsgc3ViYyBEbSxEbgotOC4weGYxKzQuMHg4LDIuRE0xLDIuRE4wOkQwOjo6c3ViYwotInN1YmMiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YxODAgKCk7ICovCi0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIHJlZzEsIHJlZzIsIGRpZmZlcmVuY2U7Ci0KLSAgUEMgPSBjaWE7Ci0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF07Ci0gIGRpZmZlcmVuY2UgPSByZWcyIC0gcmVnMSAtICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBkaWZmZXJlbmNlOwotCi0gIHogPSAoKFBTVyAmIFBTV19aKSAhPSAwKSAmJiAoZGlmZmVyZW5jZSA9PSAwKTsKLSAgbiA9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotCi0vLyAxMTExIDAwMTAgMDEwMCBEbURuOyBtdWwgRG0sRG4KLTguMHhmMis0LjB4NCwyLkRNMSwyLkROMDpEMDo6Om11bAotIm11bCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjI0MCAoKTsgKi8KLSAgdW5zaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMDAxMCAwMTAxIERtRG47IG11bHUgRG0sRG4KLTguMHhmMis0LjB4NSwyLkRNMSwyLkROMDpEMDo6Om11bHUKLSJtdWx1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMjUwICgpOyAqLwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgICAgICAgICogKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDAxMTAgRG1EbjsgZGl2IERtLERuCi04LjB4ZjIrNC4weDYsMi5ETTEsMi5ETjA6RDA6OjpkaXYKLSJkaXYiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YyNjAgKCk7ICovCi0gIHNpZ25lZDY0IHRlbXA7Ci0gIHNpZ25lZDMyIGRlbm9tOwotICBpbnQgbiwgeiwgdjsKLQotICBQQyA9IGNpYTsKLSAgZGVub20gPSAoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19NRFJdOwotICB0ZW1wIDw8PSAzMjsKLSAgdGVtcCB8PSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF07Ci0gIGlmICggISh2ID0gKDAgPT0gZGVub20pKSApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgJSAoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICAgICAgdGVtcCAvPSAoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXA7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSAweGZmOwotICAgIH0KLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDAxMTEgRG1EbjsgZGl2dSBEbSxEbgotOC4weGYyKzQuMHg3LDIuRE0xLDIuRE4wOkQwOjo6ZGl2dQotImRpdnUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YyNzAgKCk7ICovCi0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgdW5zaWduZWQzMiBkZW5vbTsKLSAgaW50IG4sIHosIHY7Ci0KLSAgUEMgPSBjaWE7Ci0gIGRlbm9tID0gKHVuc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfTURSXTsKLSAgdGVtcCA8PD0gMzI7Ci0gIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOwotICBpZiAoICEodiA9ICgwID09IGRlbm9tKSkgKSAKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcCAlIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLSAgICAgIHRlbXAgLz0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXA7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSAweGZmOwotICAgIH0KLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLQotLy8gMDEwMCBEbjAwOyBpbmMgRG4KLTQuMHg0LDIuRE4xLDAwOlMwOjo6aW5jCi0iaW5jIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF80MCAoKTsgKi8KLSAgdW5zaWduZWQzMiBpbW07Ci0KLSAgUEMgPSBjaWE7Ci0gIGltbSA9IDE7Ci0gIGdlbmVyaWNBZGQoaW1tLCBSRUdfRDAgKyBETjEpOwotfQotCi0KLS8vIDAxMDAgQW4wMQotNC4weDQsMi5BTjEsMDE6UzBhOjo6aW5jCi0iaW5jIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF80MSAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4xXSArPSAxOwotfQotCi0KLS8vIDAxMDEgMDBBbjsgaW5jNCBBbgotNC4weDUsMDAsMi5BTjA6UzA6OjppbmM0Ci0iaW5jNCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfNTAgKCk7ICovCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKz0gNDsKLX0KLQotCi0vLyAxMDEwIERuRG4gaW1tOC4uLi47IGNtcCBpbW04LERuIChpbW04IGlzIHNpZ24tZXh0ZW5kZWQuKQotNC4weGEsMi5ETTEsMi5ETjA9RE0xK0lNTTg6UzBpOjo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICBQQyA9IGNpYTsKLSAgLyogT1BfQTAwMCAoKTsgKi8KLSAgZ2VuZXJpY0NtcChFWFRFTkQ4IChJTU04KSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKLX0KLQotCi0vLyAxMDEwIERtRG47IGNtcCBEbSxEbiAoRG0gIT0gRG4sIHNlZSBhYm92ZSB3aGVuIERtID09IERuKQotNC4weGEsMi5ETTEsMi5ETjAhRE0xOlMwOjo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICBQQyA9IGNpYTsKLSAgLyogT1BfQTAgKCk7ICovCi0gIGdlbmVyaWNDbXAoU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdLCBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOwotfQotCi0KLS8vIDExMTEgMDAwMSAxMDEwIERtQW47IGNtcCBEbSxBbgotOC4weGYxKzQuMHhhLDIuRE0xLDIuQU4wOkQwOjo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMUEwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY0NtcChTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0sIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSk7Ci19Ci0KLQotLy8gMTExMSAwMDAxIDEwMDEgQW1EbjsgY21wIEFtLERuCi04LjB4ZjErNC4weDksMi5BTTEsMi5ETjA6RDBhOjo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMTkwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY0NtcChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0sIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSk7Ci19Ci0KLQotLy8gMTAxMSBBbkFuIGltbTguLi4uOyBjbXAgaW1tOCxBbiAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKLTQuMHhiLDIuQU0xLDIuQU4wPUFNMStJTU04OlMwYWk6OjpjbXAKLSJjbXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIFBDID0gY2lhOwotICAvKiBPUF9CMDAwICgpOyAqLwotICBnZW5lcmljQ21wKElNTTgsCi0JICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOwotfQotCi0KLS8vIDEwMTEgQW1BbjsgY21wIEFtLEFuIChEbSAhPSBEbiwgc2VlIGFib3ZlIHdoZW4gRG0gPT0gRG4pCi00LjB4YiwyLkFNMSwyLkFOMCFBTTE6UzBhOjo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICBQQyA9IGNpYTsKLSAgLyogT1BfQjAgKCk7ICovCi0gIGdlbmVyaWNDbXAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdLCBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMTAwIDEwRG4gaW1tMTYuLi47IGNtcCBpbW0xNixEbiAoaW1tMTYgaXMgc2lnbi1leHRlbmRlZC4pCi04LjB4ZmErNC4weGMsMTAsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDI6OjpjbXAKLSJjbXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBQzgwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY0NtcChFWFRFTkQxNihGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSksCi0JICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMTAwIDEwRG4gaW1tMzIuLi47IGNtcCBpbW0zMixEbgotOC4weGZjKzQuMHhjLDEwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6Y21wCi0iY21wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0M4MDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNDbXAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAotCSAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTEwMSAxMEFuIGltbTE2Li4uOyBjbXAgaW1tMTYsQW4gKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQuKQotOC4weGZhKzQuMHhkLDEwLDIuQU4wKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6OmNtcAotImNtcCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFEODAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQ21wKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLAotCSAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTEwMSAxMEFuIGltbTMyLi4uOyBjbXAgaW1tMzIsQW4KLTguMHhmYys0LjB4ZCwxMCwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6OjpjbXAKLSJjbXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZDRDgwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY0NtcChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOwotfQotCi0KLS8vIDExMTEgMDAxMCAwMDAwIERtRG47IGFuZCBEbSxEbgotOC4weGYyKzQuMHgwLDIuRE0xLDIuRE4wOkQwOjo6YW5kCi0iYW5kIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMjAwICgpOyAqLwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICY9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDExMTAgMDBEbiBpbW04Li4uLjsgYW5kIGltbTgsRG4gKGltbTggaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZjgrNC4weGUsMDAsMi5ETjArOC5JTU04OkQxOjo6YW5kCi0iYW5kIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEUwMDAgKCk7ICovCi0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJj0gSU1NODsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDExMTAgMDBEbiBpbW0xNi4uLjsgYW5kIGltbTE2LERuIChpbW0xNiBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4ZSwwMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6OmFuZAotImFuZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFFMDAwMDAgKCk7ICovCi0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJj0gRkVUQ0gxNihJTU0xNkEsIElNTTE2Qik7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMTEwIDAwRG4gaW1tMzIuLi47IGFuZCBpbW0zMixEbgotOC4weGZjKzQuMHhlLDAwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6YW5kCi0iYW5kIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0UwMDAwMCAoKTsgKi8KLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgICY9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDExMTEgMTEwMCBpbW0xNi4uLjsgYW5kIGltbTE2LFBTVyAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErOC4weGZjKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6OmFuZAotImFuZCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFGQzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBQU1cgJj0gRkVUQ0gxNihJTU0xNkEsIElNTTE2Qik7Ci19Ci0KLQotCi0vLyAxMTExIDAwMTAgMDAwMSBEbURuOyBvciBEbURuCi04LjB4ZjIrNC4weDEsMi5ETTEsMi5ETjA6RDA6OjpvcgotIm9yIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMjEwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY09yKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDEwMDAgMTExMCAwMURuIGltbTguLi4uOyBvciBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKW4KLTguMHhmOCs0LjB4ZSwwMSwyLkROMCs4LklNTTg6RDE6OjpvcgotIm9yIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEU0MDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljT3IoSU1NOCwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTExMCAwMURuIGltbTE2Li4uOyBvciBpbW0xNixETiAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weGUsMDEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDI6OjpvcgotIm9yIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQUU0MDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNPcihGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwgUkVHX0QwICsgRE4wKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTExMCAwMURuIGltbTMyLi4uOyBvciBpbW0zMixEbgotOC4weGZjKzQuMHhlLDAxLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6b3IKLSJvciIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNFNDAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljT3IoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfRDAgKyBETjApOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMTExIDExMDEgaW1tMTYuLi47IG9yIGltbTE2LFBTVyAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErOC4weGZkKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6Om9yCi0ib3IiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBRkQwMDAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgUFNXIHw9IEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpOwotfQotCi0KLS8vIDExMTEgMDAxMCAwMDEwIERtRG47IHhvciBEbSxEbgotOC4weGYyKzQuMHgyLDIuRE0xLDIuRE4wOkQwOjo6eG9yCi0ieG9yIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMjIwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgZ2VuZXJpY1hvcihTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0sIFJFR19EMCArIEROMCk7Ci19Ci0KLQotLy8gMTExMSAxMDEwIDExMTAgMTBEbiBpbW0xNi4uLjsgeG9yIGltbTE2LERuIChpbW0xNiBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmYSs0LjB4ZSwxMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6OnhvcgotInhvciIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFFODAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljWG9yKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLCBSRUdfRDAgKyBETjApOwotfQotCi0KLS8vIDExMTEgMTEwMCAxMTEwIDEwRG4gaW1tMzIuLi47IHhvciBpbW0zMixEbgotOC4weGZjKzQuMHhlLDEwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6eG9yCi0ieG9yIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0U4MDAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGdlbmVyaWNYb3IoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfRDAgKyBETjApOwotfQotCi0KLS8vIDExMTEgMDAxMCAwMDExIDAwRG47IG5vdCBEbgotOC4weGYyKzQuMHgzLDAwLDIuRE4wOkQwOjo6bm90Ci0ibm90IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMjMwICgpOyAqLwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gflN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDExMTAgMTFEbiBpbW04Li4uLjsgYnRzdCBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQotOC4weGY4KzQuMHhlLDExLDIuRE4wKzguSU1NODpEMTo6OmJ0c3QKLSJidHN0IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEVDMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQnRzdChJTU04LCBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOwotfQotCi0KLS8vIDExMTEgMTAxMCAxMTEwIDExRG4gaW1tMTYuLi4uLjsgYnRzdCBpbW0xNixEbiAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmErNC4weGUsMTEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDI6OjpidHN0Ci0iYnRzdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFFQzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQnRzdChGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKLX0KLQotCi0vLyAxMTExIDExMDAgMTExMCAxMURuIGltbTMyLi4uOyBidHN0IGltbTMyLERuCi04LjB4ZmMrNC4weGUsMTEsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjpidHN0Ci0iYnRzdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkNFQzAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQnRzdChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKLX0KLQotCi0vLyAxMTExIDExMTAgMDAwMCAwMDEwIGFiczMyLi4uIGltbTguLi4uOyBidHN0IGltbTgsKGFiczMyKSAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLiwgcHJvY2Vzc2luZyB1bml0OiBieXRlKQotOC4weGZlKzguMHgwMis4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRCs4LklNTTg6RDU6OjpidHN0Ci0iYnRzdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkUwMjAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQnRzdChJTU04LAotCSAgICAgIGxvYWRfYnl0ZShGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTExMSAxMEFuIGQ4Li4uLi4uIGltbTguLi4uOyAKLS8vIGJ0c3QgaW1tOCwoZDgsQW4pIChkOCBpcyBzaWduLWV4dGVuZGVkLGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKLTguMHhmYSs0LjB4ZiwxMCwyLkFOMCs4LkQ4KzguSU1NODpEMmE6OjpidHN0Ci0iYnRzdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFGODAwMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBnZW5lcmljQnRzdChJTU04LAotCSAgICAgIGxvYWRfYnl0ZShTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4KEQ4KSkpOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMDAwIERtQW47IGJzZXQgRG0sKEFuKSAoUHJvY2Vzc2luZyB1bml0IGJ5dGUpCi04LjB4ZjArNC44LDIuRE0xLDIuQU4wOkQwOjo6YnNldAotImJzZXQiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YwODAgKCk7ICovCi0gIHVuc2lnbmVkMzIgdGVtcDsKLSAgaW50IHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHRlbXAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSk7Ci0gIHogPSAodGVtcCAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSkgPT0gMDsKLSAgdGVtcCB8PSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotCi0vLyAxMTExIDExMTAgMDAwMCAwMDAwIGFiczMyLi4uIGltbTguLi4uOwotLy8gYnNldCBpbW04LChhYnMzMikgKGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKLTguMHhmZSs4LjB4MDArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQrOC5JTU04OkQ1Ojo6YnNldAotImJzZXQiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZFMDAwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIHRlbXA7Ci0gIGludCB6OwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gbG9hZF9ieXRlIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotICB6ID0gKHRlbXAgJiBJTU04KSA9PSAwOwotICB0ZW1wIHw9IElNTTg7Ci0gIHN0b3JlX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTExMSAwMEFuQW4gZDguLi4uLi4gaW1tOC4uLi47Ci0vLyBic2V0IGltbTgsKGQ4LEFuKSAoZDggaXMgc2lnbi1leHRlbmRlZCwgaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLiwgcHJvY2Vzc2luZyB1bml0OiBieXRlKQotOC4weGZhKzQuMHhmLDAwLDIuQU4wKzguRDgrOC5JTU04OkQyOjo6YnNldAotImJzZXQiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZBRjAwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIHRlbXA7Ci0gIGludCB6OwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSk7Ci0gIHogPSAodGVtcCAmIChJTU04KSkgPT0gMDsKLSAgdGVtcCB8PSAoSU1NOCk7Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCkpLCB0ZW1wKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMDAxIERtQW47IGJjbHIgRG0sKEFuKSAoUHJvY2Vzc2luZyB1bml0IGJ5dGUpCi04LjB4ZjArNC4weDksMi5ETTEsMi5BTjA6RDA6OjpiY2xyCi0iYmNsciIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjA5MCAoKTsgKi8KLSAgdW5zaWduZWQzMiB0ZW1wOwotICBpbnQgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdKTsKLSAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKSA9PSAwOwotICB0ZW1wID0gdGVtcCAmIH5TdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci0gIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotCi0vLyAxMTExIDExMTAgMDAwMCAwMDAxIGFiczMyLi4uIGltbTguLi4uOwotLy8gYmNsciBpbW04LChhYnMzMikgKGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKLTguMHhmZSs4LjB4MDErOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQrOC5JTU04OkQ1Ojo6YmNscgotImJjbHIiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZFMDEwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIHRlbXA7Ci0gIGludCB6OwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gbG9hZF9ieXRlIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOwotICB6ID0gKHRlbXAgJiBJTU04KSA9PSAwOwotICB0ZW1wID0gdGVtcCAmIH4oSU1NOCk7Ci0gIHN0b3JlX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTExMSAwMUFuIGQ4Li4uLi4uIGltbTguLi4uOwotLy8gYmNsciBpbW04LChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQsIGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKLTguMHhmYSs0LjB4ZiwwMSwyLkFOMCs4LkQ4KzguSU1NODpEMjo6OmJjbHIKLSJiY2xyIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQUY0MDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiB0ZW1wOwotICBpbnQgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDggKEQ4KSkpOwotICB6ID0gKHRlbXAgJiAoSU1NOCkpID09IDA7Ci0gIHRlbXAgPSB0ZW1wICYgfihJTU04KTsKLSAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDggKEQ4KSksIHRlbXApOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDEwMTEgRG1EbjsgYXNyIERtLERuCi04LjB4ZjIrNC4weGIsMi5ETTEsMi5ETjA6RDA6Ojphc3IKLSJhc3IiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YyQjAgKCk7ICovCi0gIHNpZ25lZDMyIHRlbXA7Ci0gIGludCB6LCBuLCBjOwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcDsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMTAwIDEwRG4gaW1tOC4uLjsgYXNyIGltbTgsRG4gKGltbTggaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZjgrNC4weGMsMTAsMi5ETjArOC5JTU04OkQxOjo6YXNyCi0iYXNyIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEM4MDAgKCk7ICovCi0gIHNpZ25lZDMyIHRlbXA7Ci0gIGludCB6LCBuLCBjOwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IElNTTg7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotCi0vLyAxMTExIDAwMTAgMTAxMCBEbURuOyBsc3IgRG0sRG4KLTguMHhmMis0LjB4YSwyLkRNMSwyLkROMDpEMDo6OmxzcgotImxzciIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjJBMCAoKTsgKi8KLSAgaW50IHosIG4sIGM7Ci0KLSAgUEMgPSBjaWE7Ci0gIGMgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAxOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA+Pj0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDAwIDExMDAgMDFEbiBpbW04Li4uOyBsc3IgaW1tOCxEbiAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhmOCs0LjB4YywwMSwyLkROMCs4LklNTTg6RDE6Ojpsc3IKLSJsc3IiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y4QzQwMCAoKTsgKi8KLSAgaW50IHosIG4sIGM7Ci0KLSAgUEMgPSBjaWE7Ci0gIGMgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAxOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPj49ICBJTU04OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDEwMDEgRG1EbjsgYXNsIERtLERuCi04LjB4ZjIrNC4weDksMi5ETTEsMi5ETjA6RDA6Ojphc2wKLSJhc2wiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YyOTAgKCk7ICovCi0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICA8PD0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAwMCAxMTAwIDAwRG4gaW1tOC4uLjsgYXNsIGltbTgsRG4gKGltbTggaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZjgrNC4weGMsMDAsMi5ETjArOC5JTU04OkQxOjo6YXNsCi0iYXNsIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEMwMDAgKCk7ICovCi0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPDw9IElNTTg7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04pOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMDEwMSAwMURuOyBhbHMyIERuCi00LjB4NSwwMSwyLkROMDpTMDo6OmFzbDIKLSJhc2wyIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF81NCAoKTsgKi8KLSAgaW50IG4sIHo7Ci0gIFBDID0gY2lhOwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA8PD0gMjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotCi0vLyAxMTExIDAwMTAgMTAwMCAwMURuOyByb3IgRG4KLTguMHhmMis0LjB4OCwwMSwyLkROMDpEMDo6OnJvcgotInJvciIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjI4NCAoKTsgKi8KLSAgdW5zaWduZWQzMiB2YWx1ZTsKLSAgaW50IGMsbix6OwotCi0gIFBDID0gY2lhOwotICB2YWx1ZSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKLSAgYyA9ICh2YWx1ZSAmIDB4MSk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0gIHZhbHVlIHw9ICgoUFNXICYgUFNXX0MpICE9IDApID8gMHg4MDAwMDAwMCA6IDA7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAwMDEwIDEwMDAgMDBEbjsgcm9sIERuCi04LjB4ZjIrNC4weDgsMDAsMi5ETjA6RDA6Ojpyb2wKLSJyb2wiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YyODAgKCk7ICovCi0gIHVuc2lnbmVkMzIgdmFsdWU7Ci0gIGludCBjLG4sejsKLQotICBQQyA9IGNpYTsKLSAgdmFsdWUgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF07Ci0gIGMgPSAodmFsdWUgJiAweDgwMDAwMDAwKSA/IDEgOiAwOwotCi0gIHZhbHVlIDw8PSAxOwotICB2YWx1ZSB8PSAoKFBTVyAmIFBTV19DKSAhPSAwKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdmFsdWU7Ci0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotCi0vLyAxMTAwIDEwMDAgZDguLi4uLi47IGJlcSAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGM4KzguRDg6UzE6OjpiZXEKLSJiZXEiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0M4MDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoKFBTVyAmIFBTV19aKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMTAwMSBkOC4uLi4uLjsgYm5lIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzkrOC5EODpTMTo6OmJuZQotImJuZSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzkwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICghKFBTVyAmIFBTV19aKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMDAwMSBkOC4uLi4uLjsgYmd0IChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzErOC5EODpTMTo6OmJndAotImJndCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzEwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICghKChQU1cgJiBQU1dfWikKLSAgICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMDAxMCBkOC4uLi4uLjsgYmdlIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzIrOC5EODpTMTo6OmJnZQotImJnZSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzIwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICghKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMCAwMDExIGQ4Li4uLi4uOyBibGUgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhjMys4LkQ4OlMxOjo6YmxlCi0iYmxlIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9DMzAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgaWYgKChQU1cgJiBQU1dfWikKLSAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMDAwMCBkOC4uLi4uLjsgYmx0IChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzArOC5EODpTMTo6OmJsdAotImJsdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzAwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMCAwMTAxIGQ4Li4uLi4uOyBiaGkgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhjNSs4LkQ4OlMxOjo6YmhpCi0iYmhpIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9DNTAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgaWYgKCEoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMDExMCBkOC4uLi4uLjsgYmNjIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzYrOC5EODpTMTo6OmJjYwotImJjYyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzYwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICghKFBTVyAmIFBTV19DKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDAgMDEwMSBkOC4uLi4uLjsgYmxzIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4YzcrOC5EODpTMTo6OmJscwotImJscyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQzcwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICgoKFBTVyAmIFBTV19DKSAhPSAwKSB8fCAoUFNXICYgUFNXX1opICE9IDApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotCi0vLyAxMTAwIDAxMDAgZDguLi4uLi47IGJjcyAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGM0KzguRDg6UzE6OjpiY3MKLSJiY3MiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0M0MDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoUFNXICYgUFNXX0MpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotCi0vLyAxMTExIDEwMDAgMTExMCAxMDAwIGQ4Li4uLi4uOyBidmMgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs4LjB4ZTgrOC5EODpEMTo6OmJ2YwotImJ2YyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjhFODAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgaWYgKCEoUFNXICYgUFNXX1YpKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTExMSAxMDAwIDExMTAgMTAwMSBkOC4uLi4uLjsgYnZzIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCi04LjB4ZjgrOC4weGU5KzguRDg6RDE6OjpidnMKLSJidnMiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y4RTkwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmIChQU1cgJiBQU1dfVikKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMTEgMTAwMCAxMTEwIDEwMTAgZDguLi4uLi47IGJuYyAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQotOC4weGY4KzguMHhlYSs4LkQ4OkQxOjo6Ym5jCi0iYm5jIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOEVBMDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoIShQU1cgJiBQU1dfTikpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotCi0vLyAxMTExIDEwMDAgMTExMCAxMDEwIGQ4Li4uLi4uOyBibnMgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhmOCs4LjB4ZWIrOC5EODpEMTo6OmJucwotImJucyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjhFQjAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgaWYgKFBTVyAmIFBTV19OKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMCAxMDEwIGQ4Li4uLi4uOyBicmEgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKLTguMHhjYSs4LkQ4OlMxOjo6YnJhCi0iYnJhIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9DQTAwICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKLSAgbmlhID0gUEM7Ci19Ci0KLQotLy8gMTEwMSAxMDAwOyBsZXEKLTguMHhkODpTMDo6OmxlcQotImxlcSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDggKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoUFNXICYgUFNXX1opCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAxMDAxOyBsbmUKLTguMHhkOTpTMDo6OmxuZQotImxuZSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDkgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoIShQU1cgJiBQU1dfWikpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAwMDAxOyBsZ3QKLTguMHhkMTpTMDo6OmxndAotImxndCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDEgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoISgoUFNXICYgUFNXX1opCi0gICAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAwMDEwOyBsZ2UKLTguMHhkMjpTMDo6OmxnZQotImxnZSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDIgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoISgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotCi0vLyAxMTAxIDAwMTE7IGxsZQotOC4weGQzOlMwOjo6bGxlCi0ibGxlIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9EMyAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICgoUFNXICYgUFNXX1opCi0gICAgICB8fCAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAwMDAwOyBsbHQKLTguMHhkMDpTMDo6OmxsdAotImxsdCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDAgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKLSAgICAgIG5pYSA9IFBDOwotICAgIH0KLX0KLQotCi0vLyAxMTAxIDAxMDE7IGxoaQotOC4weGQ1OlMwOjo6bGhpCi0ibGhpIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9ENSAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGlmICghKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAwMTEwOyBsY2MKLTguMHhkNjpTMDo6OmxjYwotImxjYyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDYgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoIShQU1cgJiBQU1dfQykpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gICAgICBuaWEgPSBQQzsKLSAgICB9Ci19Ci0KLQotLy8gMTEwMSAwMTExOyBsbHMKLTguMHhkNzpTMDo6OmxscwotImxscyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRDcgKCk7ICovCi0gIFBDID0gY2lhOwotICBpZiAoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDEgMDEwMDsgbGNzCi04LjB4ZDQ6UzA6OjpsY3MKLSJsY3MiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Q0ICgpOyAqLwotICBQQyA9IGNpYTsKLSAgaWYgKFBTVyAmIFBTV19DKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OwotICAgICAgbmlhID0gUEM7Ci0gICAgfQotfQotCi0KLS8vIDExMDEgMTAxMDsgbHJhCi04LjB4ZGE6UzA6OjpscmEKLSJscmEiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0RBICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7Ci0gIG5pYSA9IFBDOwotfQotCi0KLS8vIDExMDEgMTAxMDsgc2V0bGIKLTguMHhkYjpTMDo6OnNldGxiCi0ic2V0bGIiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0RCICgpOyAqLwotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfTElSXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfUENdICsgMSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0xBUl0gPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA1OwotfQotCi0KLS8vIDExMTEgMDAwMCAxMTExIDAxQW47IGptcCAoQW4pCi04LjB4ZjArNC4weGYsMDEsMi5BTjA6RDA6OjpqbXAKLSJqbXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YwRjQgKCk7ICovCi0gIFBDID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTAwIDExMDAgZDE2Li4uLi47IGptcCAoZDE2LFBDKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQotOC4weGNjKzguRDE2QSs4LkQxNkI6UzI6OjpqbXAKLSJqbXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0NDMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWEgKyBFWFRFTkQxNihGRVRDSDE2KEQxNkEsIEQxNkIpKTsKLSAgbmlhID0gUEM7Ci19Ci0KLQotLy8gMTEwMSAxMTAwIGQzMi4uLi4uLi4uOyBqbXAgKGQzMiwgUEMpCi04LjB4ZGMrOC5EMzJBKzguRDMyQis4LkQzMkMrOC5EMzJEOlM0Ojo6am1wCi0iam1wIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9EQzAwMDAwMCAoKTsgKi8KLSAgUEMgPSBjaWEgKyBGRVRDSDMyKEQzMkEsIEQzMkIsIEQzMkMsIEQzMkQpOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTExIDAwMDAgMTExMSAwMEFuOyBjYWxscyAoQW4pCi04LjB4ZjArNC4weGYsMDAsMi5BTjA6RDA6OjpjYWxscwotImNhbGxzIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GMEYwICgpOyAqLwotICB1bnNpZ25lZDMyIG5leHRfcGMsIHNwOwotCi0gIFBDID0gY2lhOwotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDI7Ci0gIHN0b3JlX3dvcmQoc3AsIG5leHRfcGMpOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTExIDEwMTAgMTExMSAxMTExIGQxNi4uLi4uOyBjYWxscyAoZDE2LFBDKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQotOC4weGZhKzguMHhmZis4LkQxNkErOC5EMTZCOkQyOjo6Y2FsbHMKLSJjYWxscyIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkFGRjAwMDAgKCk7ICovCi0gIHVuc2lnbmVkMzIgbmV4dF9wYywgc3A7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgNDsKLSAgc3RvcmVfd29yZChzcCwgbmV4dF9wYyk7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOwotICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTExIDExMDAgMTExMSAxMTExIGQzMi4uLi4uOyBjYWxscyAoZDMyLFBDKQotOC4weGZjKzguMHhmZis4LkQzMkErOC5EMzJCKzguRDMyQys4LkQzMkQ6RDQ6OjpjYWxscwotImNhbGxzIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQ0ZGMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiBuZXh0X3BjLCBzcDsKLQotICBQQyA9IGNpYTsKLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA2OwotICBzdG9yZV93b3JkKHNwLCBuZXh0X3BjKTsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBGRVRDSDMyKEQzMkEsIEQzMkIsIEQzMkMsIEQzMkQpOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTExIDAwMDAgMTExMSAxMTAwOyByZXRzCi04LjB4ZjArOC4weGZjOkQwOjo6cmV0cwotInJldHMiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YwRkMgKCk7ICovCi0gIHVuc2lnbmVkMzIgc3A7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IGxvYWRfd29yZChzcCk7Ci0gIG5pYSA9IFBDOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMTExIDExMDE7IHJ0aQotOC4weGYwKzguMHhmZDpEMDo6OnJ0aQotInJ0aSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjBGRCAoKTsgKi8KLSAgdW5zaWduZWQzMiBzcDsKLQotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgUFNXID0gbG9hZF9oYWxmKHNwKTsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gbG9hZF93b3JkKHNwKzQpOwotICBTdGF0ZS5yZWdzW1JFR19TUF0gKz04OwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTExIDAwMDAgMTExMSAxMTEwOyB0cmFwCi04LjB4ZjArOC4weGZlOkQwOjo6dHJhcAotInRyYXAiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0YwRkUgKCk7ICovCi0gIHVuc2lnbmVkMzIgc3AsIG5leHRfcGM7Ci0KLSAgUEMgPSBjaWE7Ci0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKLSAgc3RvcmVfd29yZChzcCwgbmV4dF9wYyk7Ci0gIG5pYSA9IFBDOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMTExIDExMTE7IHJ0bQotOC4weGYwKzguMHhmZjpEMDo6OnJ0bQotInJ0bSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjBGRiAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGFib3J0ICgpOwotfQotCi0KLS8vIDExMDAgMTAxMTsgbm9wCi04LjB4Y2I6UzA6Ojpub3AKLSJub3AiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0NCICgpOyAqLwotICBQQyA9IGNpYTsKLX0KLQotCi0vLyAxMTExIDAxMDEgMDAwMCAgRG1EbjsgdWRmMjAgRG0sRG4KLTguMHhmNSs0LjB4MCwyLkRNMSwyLkROMDpEMDo6OnB1dHgKLSJwdXR4IgotKm1uMTAzMDAKLXsKLSAgLyogT1BfRjUwMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOwotfQotCi0KLS8vIDExMTEgMDExMCAxMTExIERtRG47IHVkZjE1IERtLERuCi04LjB4ZjYrNC4weGYsMi5ETTEsMi5ETjA6RDA6OjpnZXR4Ci0iZ2V0eCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjZGMCAoKTsgKi8KLSAgaW50IHosIG47Ci0KLSAgUEMgPSBjaWE7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfTURSUV0gPT0gMCk7Ci0gIG4gPSAoKFN0YXRlLnJlZ3NbUkVHX01EUlFdICYgMHg4MDAwMDAwMCkgIT0gMCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IFN0YXRlLnJlZ3NbUkVHX01EUlFdOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKLX0KLQotCi0vLyAxMTExIDAxMTAgMDAwMCBEbURuOyB1ZGYwMCBEbSxEbgotOC4weGY2KzQuMHgwLDIuRE0xLDIuRE4wOkQwOjo6bXVscQotIm11bHEiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y2MDAgKCk7ICovCi0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAxMDAxIDAwMDAgMDBEbiBpbW04Li4uLjsgdWRmMDAgaW1tOCxEbiAoaW1tOCBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmOSs0LjB4LDAwLDIuRE4wKzguSU1NODpEMTo6Om11bHEKLSJtdWxxIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GOTAwMDAgKCk7ICovCi0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLSAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpRVhURU5EOCAoSU1NOCkpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAxMSAwMDAwIDAwRG4gaW1tMTYuLi47IHVkZjAwIGltbTE2LERuIChpbW0xNiBpcyBzaWduLWV4dGVuZGVkLikKLTguMHhmYis0LjB4MCwwMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6Om11bHEKLSJtdWxxIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQjAwMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQotICAgICAgICAgICogKHNpZ25lZDY0KShzaWduZWQzMilFWFRFTkQxNiAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotCi0vLyAxMTExIDExMDEgMDAwMCAwMERuIGltbTMyLi4uOyB1ZGYwMCBpbW0zMixEbgotOC4weGZkKzQuMHgwLDAwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6bXVscQotIm11bHEiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0ZEMDAwMDAwICgpOyAqLwotICB1bnNpZ25lZDY0IHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCi0gICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKShGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotCi0vLyAxMTExIDAxMTAgMDAwMSBEbURuOyB1ZGYwMSBEbSxEbgotOC4weGY2KzQuMHgxLDIuRE0xLDIuRE4wOkQwOjo6bXVscXUKLSJtdWxxdSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjYxMCAoKTsgKi8KLSAgdW5zaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9ICgodW5zaWduZWQ2NCkgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCi0JICAqICh1bnNpZ25lZDY0KSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAwMSAwMDAxIDAxRG4gaW1tOC4uLi47IHVkZnUwMSBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQotOC4weGY5KzQuMHgxLDAxLDIuRE4wKzguSU1NODpEMTo6Om11bHF1Ci0ibXVscXUiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y5MTQwMCAoKTsgKi8KLSAgdW5zaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLQkgICogKHVuc2lnbmVkNjQpRVhURU5EOCAoSU1NOCkpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTAxMSAwMDAxIDAxRG4gaW1tMTYuLi47IHVkZnUwMSBpbW0xNixEbiAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZmIrNC4weDEsMDEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDI6OjptdWxxdQotIm11bHF1IgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GQjE0MDAwMCAoKTsgKi8KLSAgdW5zaWduZWQ2NCB0ZW1wOwotICBpbnQgbiwgejsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KLQkgICogKHVuc2lnbmVkNjQpIEVYVEVORDE2IChGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSkpOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLS8vIDExMTEgMTEwMSAwMDAxIDAxRG4gaW1tMzIuLi47IHVkZnUwMSBpbW0zMixEbgotOC4weGZkKzQuMHgxLDAxLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6bXVscXUKLSJtdWxxdSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkQxNDAwMDAgKCk7ICovCi0gIHVuc2lnbmVkNjQgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgUEMgPSBjaWE7Ci0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCi0gICAgICAgICAgKiAodW5zaWduZWQ2NCkoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLQotLy8gMTExMSAwMTEwIDAxMDAgRG1EbjsgdWRmMDQgRG0sRG4KLTguMHhmNis0LjB4NCwyLkRNMSwyLkROMDpEMDo6OnNhdDE2Ci0ic2F0MTYiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0Y2NDAgKCk7ICovCi0gIGludCB0ZW1wOwotCi0gIFBDID0gY2lhOwotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOwotICB0ZW1wID0gKHRlbXAgPiAweDdmZmYgPyAweDdmZmYgOiB0ZW1wKTsKLSAgdGVtcCA9ICh0ZW1wIDwgLTB4ODAwMCA/IC0weDgwMDAgOiB0ZW1wKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcDsKLX0KLQotCi0vLyAxMTExIDAxMTAgMDEwMSBEbURuOyB1ZGYwNSBEbSxEbgotOC4weGY2KzQuMHg1LDIuRE0xLDIuRE4wOkQwOjo6c2F0MjQKLSJzYXQyNCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjY1MCAoKTsgKi8KLSAgaW50IHRlbXA7Ci0KLSAgUEMgPSBjaWE7Ci0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Ci0gIHRlbXAgPSAodGVtcCA+IDB4N2ZmZmZmID8gMHg3ZmZmZmYgOiB0ZW1wKTsKLSAgdGVtcCA9ICh0ZW1wIDwgLTB4ODAwMDAwID8gLTB4ODAwMDAwIDogdGVtcCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXA7Ci19Ci0KLQotLy8gMTExMSAwMTEwIDAxMTEgRG1EbjsgdWRmMDcgRG0sRG4KLTguMHhmNis0LjB4NywyLkRNMSwyLkROMDpEMDo6OmJzY2gKLSJic2NoIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9GNjcwICgpOyAqLwotICBpbnQgdGVtcCwgYzsKLQotICBQQyA9IGNpYTsKLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKLSAgdGVtcCA8PD0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4MWYpOwotICBjID0gKHRlbXAgIT0gMCA/IDEgOiAwKTsKLSAgUFNXICY9IH4oUFNXX0MpOwotICBQU1cgfD0gKGMgPyBQU1dfQyA6IDApOwotfQotCi0KLS8vIDExMTEgMDAwMCAxMTAwIDAwMDA7IHN5c2NhbGwKLTguMHhmMCs4LjB4YzA6RDA6OjpzeXNjYWxsCi0ic3lzY2FsbCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRjBDMCAoKTsgKi8KLSAgUEMgPSBjaWE7Ci0gIGRvX3N5c2NhbGwgKCk7Ci19Ci0KLQotLy8gMTExMSAxMTExOyBicmVhawotOC4weGZmOlMwOjo6YnJlYWsKLSJicmVhayIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfRkYgKCk7ICovCi0gIFBDID0gY2lhOwotICBwcm9ncmFtX2ludGVycnVwdChTRCwgQ1BVLCBjaWEsIFNJTV9TSUdUUkFQKTsKLX0KLQotLy8gMTEwMCAxMTEwIHJlZ3MuLi4uOyBtb3ZtIChTUCkscmVncwotOC4weGNlKzguUkVHUzpTMTo6Om1vdm0KLSJtb3ZtIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9DRTAwICgpOyAqLwotICB1bnNpZ25lZDMyIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICB1bnNpZ25lZDMyIG1hc2s7Ci0KLSAgUEMgPSBjaWE7Ci0gIG1hc2sgPSBSRUdTOwotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIHNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19MQVJdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTElSXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDFdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTBdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4NDApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgfQotCi0gIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCA9PSBiZmRfbWFjaF9hbTMzCi0gICAgICApCi0gICAgewotICAgICAgaWYgKG1hc2sgJiAweDEpCi0JewotCSAgLyogTmVlZCB0byByZXN0b3JlIE1EUVIsIE1DUkgsIE1DUkwsIGFuZCBNQ1ZGICovCi0JICBzcCArPSAxNjsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgMV0gPSBsb2FkX3dvcmQgKHNwKTsKLQkgIHNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDBdID0gbG9hZF93b3JkIChzcCk7Ci0JICBzcCArPSA0OwotCX0KLQotICAgICAgaWYgKG1hc2sgJiAweDIpCi0gICAgICAgIHsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgN10gPSBsb2FkX3dvcmQgKHNwKTsKLQkgIHNwICs9IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDZdID0gbG9hZF93b3JkIChzcCk7Ci0JICBzcCArPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyA1XSA9IGxvYWRfd29yZCAoc3ApOwotCSAgc3AgKz0gNDsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgNF0gPSBsb2FkX3dvcmQgKHNwKTsKLQkgIHNwICs9IDQ7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4NCkKLQl7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDNdID0gbG9hZF93b3JkIChzcCk7Ci0JICBzcCArPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyAyXSA9IGxvYWRfd29yZCAoc3ApOwotCSAgc3AgKz0gNDsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLiAgKi8KLSAgU3RhdGUucmVnc1tSRUdfU1BdID0gc3A7Ci19Ci0KLQotLy8gMTEwMCAxMTExIHJlZ3MuLi4uOyBtb3ZtIHJlZ3MsKFNQKQotOC4weGNmKzguUkVHUzpTMWE6Ojptb3ZtCi0ibW92bSIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfQ0YwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgdW5zaWduZWQzMiBtYXNrOwotCi0gIFBDID0gY2lhOwotICBtYXNrID0gUkVHUzsKLQotICBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2ggPT0gYmZkX21hY2hfYW0zMwotICAgICAgKQotICAgIHsKLSAgICAgIGlmIChtYXNrICYgMHg0KQotCXsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAyXSk7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgM10pOwotCX0KLQotICAgICAgaWYgKG1hc2sgJiAweDIpCi0gICAgICAgIHsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA0XSk7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgNV0pOwotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDZdKTsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA3XSk7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4MSkKLQl7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgMF0pOwotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDFdKTsKLQkgIHNwIC09IDE2OwotCSAgLyogTmVlZCB0byBzYXZlIE1EUVIsIE1DUkgsIE1DUkwsIGFuZCBNQ1ZGICovCi0JfQotICAgIH0KLQotICBpZiAobWFzayAmIDB4ODApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDJdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MTApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDNdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgpCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMF0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDFdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTBdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX01EUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19MSVJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTEFSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgIH0KLQotICAvKiBBbmQgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlci4gICovCi0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOwotfQotCi0vLyAxMTAwIDExMDEgZDE2Li4uLi4gcmVncy4uLi4gaW1tOC4uLi47Ci0vLyBjYWxsIChkMTYsUEMpLHJlZ3MsaW1tOCAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuLCBpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQotOC4weGNkKzguRDE2QSs4LkQxNkIrOC5SRUdTKzguSU1NODpTNDo6OmNhbGwKLSJjYWxsIgotKm1uMTAzMDAKLQotKmFtMzMKLQotewotICAvKiBPUF9DRDAwMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiBuZXh0X3BjLCBzcDsKLSAgdW5zaWduZWQzMiBtYXNrOwotCi0gIFBDID0gY2lhOwotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgbmV4dF9wYyA9IFBDICsgNTsKLSAgc3RvcmVfd29yZChzcCwgbmV4dF9wYyk7Ci0KLSAgbWFzayA9IFJFR1M7Ci0KLSAgaWYgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoID09IGJmZF9tYWNoX2FtMzMKLSAgICAgICkKLSAgICB7Ci0gICAgICBpZiAobWFzayAmIDB4NCkKLQl7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgMl0pOwotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDNdKTsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgyKQotICAgICAgICB7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgNF0pOwotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDVdKTsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA2XSk7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgN10pOwotCX0KLQotICAgICAgaWYgKG1hc2sgJiAweDEpCi0JewotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDBdKTsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAxXSk7Ci0JICBzcCAtPSAxNjsKLQkgIC8qIE5lZWQgdG8gc2F2ZSBNRFFSLCBNQ1JILCBNQ1JMLCBhbmQgTUNWRiAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg0MCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MjApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLCBub3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHNhdmVzIHRvIGRvIG5vdAotICAgICBtb2RpZnkgU1AuICBUaGUgU1AgYWRqdXN0bWVudCBpcyBkZXJpdmVkIHRvdGFsbHkgZnJvbSB0aGUgaW1tOAotICAgICBmaWVsZC4gICovCi0gIFN0YXRlLnJlZ3NbUkVHX1NQXSAtPSBJTU04OwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKLSAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDE2IChGRVRDSDE2KEQxNkEsIEQxNkIpKTsKLSAgbmlhID0gUEM7Ci19Ci0KLQotLy8gMTEwMSAxMTAxIGQzMi4uLi4uIHJlZ3MuLi4uIGltbTguLi4uOwotLy8gY2FsbCAoZDMyLFBDKSxyZWdzLGltbTggKGltbTggaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZGQrOC5EMzJBKzguRDMyQis4LkQzMkMrOC5EMzJEKzguUkVHUys4LklNTTg6UzY6OjpjYWxsCi0iY2FsbCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfREQwMDAwMDAgKCk7ICovCi0gIHVuc2lnbmVkMzIgbmV4dF9wYywgc3A7Ci0gIHVuc2lnbmVkMzIgbWFzazsKLQotICBQQyA9IGNpYTsKLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA3OwotICAvKiBjb3VsZCBhc3NlcnQgdGhhdCBuaWEgPT0gbmV4dF9wYyBoZXJlICovCi0gIHN0b3JlX3dvcmQoc3AsIG5leHRfcGMpOwotCi0gIG1hc2sgPSBSRUdTOwotCi0gIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCA9PSBiZmRfbWFjaF9hbTMzCi0gICAgICApCi0gICAgewotICAgICAgaWYgKG1hc2sgJiAweDQpCi0JewotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDJdKTsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAzXSk7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4MikKLSAgICAgICAgewotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDRdKTsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyA1XSk7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgNl0pOwotCSAgc3AgLT0gNDsKLQkgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19FMCArIDddKTsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgxKQotCXsKLQkgIHNwIC09IDQ7Ci0JICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRTAgKyAwXSk7Ci0JICBzcCAtPSA0OwotCSAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0UwICsgMV0pOwotCSAgc3AgLT0gMTY7Ci0JICAvKiBOZWVkIHRvIHNhdmUgTURRUiwgTUNSSCwgTUNSTCwgYW5kIE1DVkYgKi8KLQl9Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4MCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4NDApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDNdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDIwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgxMCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4OCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMF0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDFdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTURSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xJUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19MQVJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlciwgbm90ZSB0aGF0IHRoZSByZWdpc3RlciBzYXZlcyB0byBkbyBub3QKLSAgICAgbW9kaWZ5IFNQLiAgVGhlIFNQIGFkanVzdG1lbnQgaXMgZGVyaXZlZCB0b3RhbGx5IGZyb20gdGhlIGltbTgKLSAgICAgZmllbGQuICAqLwotICBTdGF0ZS5yZWdzW1JFR19TUF0gLT0gSU1NODsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBGRVRDSDMyKEQzMkEsIEQzMkIsIEQzMkMsIEQzMkQpOwotICBuaWEgPSBQQzsKLX0KLQotCi0vLyAxMTAxIDExMTEgcmVncy4uLi4gaW1tOC4uLi47IHJldCByZWdzLGltbTggKGltbTggaXMgemVyby1leHRlbmRlZC4pCi04LjB4ZGYrOC5SRUdTKzguSU1NODpTMjo6OnJldAotInJldCIKLSptbjEwMzAwCi0KLSphbTMzCi0KLXsKLSAgLyogT1BfREYwMDAwICgpOyAqLwotICB1bnNpZ25lZDMyIHNwLCBvZmZzZXQ7Ci0gIHVuc2lnbmVkMzIgbWFzazsKLQotICBQQyA9IGNpYTsKLSAgU3RhdGUucmVnc1tSRUdfU1BdICs9IElNTTg7Ci0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotCi0gIG9mZnNldCA9IC00OwotICBtYXNrID0gUkVHUzsKLQotICBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2ggPT0gYmZkX21hY2hfYW0zMwotICAgICAgKQotICAgIHsKLQotICAgICAgaWYgKG1hc2sgJiAweDQpCi0JewotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyAyXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDNdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0JICBvZmZzZXQgLT0gNDsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgyKQotICAgICAgICB7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDRdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0JICBvZmZzZXQgLT0gNDsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgNV0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLQkgIG9mZnNldCAtPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyA2XSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDddID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0JICBvZmZzZXQgLT0gNDsKLQl9Ci0KLSAgICAgIGlmIChtYXNrICYgMHgxKQotCXsKLQkgIC8qIE5lZWQgdG8gcmVzdG9yZSBNRFFSLCBNQ1JILCBNQ1JMLCBhbmQgTUNWRiAqLwotCSAgb2Zmc2V0IC09IDE2OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyAwXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDFdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0JICBvZmZzZXQgLT0gNDsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4NDApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4OCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIC8qIFJlc3RvcmUgdGhlIFBDIHZhbHVlLiAgKi8KLSAgU3RhdGUucmVnc1tSRUdfUENdID0gbG9hZF93b3JkKHNwKTsKLSAgbmlhID0gUEM7Ci19Ci0KLQotLy8gMTEwMSAxMTEwIHJlZ3MuLi4uIGltbTguLi4uOyByZXRmIHJlZ3MsaW1tOCAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKLTguMHhkZSs4LlJFR1MrOC5JTU04OlMyOjo6cmV0ZgotInJldGYiCi0qbW4xMDMwMAotCi0qYW0zMwotCi17Ci0gIC8qIE9QX0RFMDAwMCAoKTsgKi8KLSAgdW5zaWduZWQzMiBzcCwgb2Zmc2V0OwotICB1bnNpZ25lZDMyIG1hc2s7Ci0KLSAgUEMgPSBjaWE7Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSBJTU04OwotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTURSXTsKLQotICBvZmZzZXQgPSAtNDsKLSAgbWFzayA9IFJFR1M7Ci0KLSAgaWYgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoID09IGJmZF9tYWNoX2FtMzMKLSAgICAgICkKLSAgICB7Ci0KLSAgICAgIGlmIChtYXNrICYgMHg0KQotCXsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLQkgIG9mZnNldCAtPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4MikKLSAgICAgICAgewotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyA0XSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JICBTdGF0ZS5yZWdzW1JFR19FMCArIDVdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0JICBvZmZzZXQgLT0gNDsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgNl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLQkgIG9mZnNldCAtPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyA3XSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JfQotCi0gICAgICBpZiAobWFzayAmIDB4MSkKLQl7Ci0JICAvKiBOZWVkIHRvIHJlc3RvcmUgTURRUiwgTUNSSCwgTUNSTCwgYW5kIE1DVkYgKi8KLQkgIG9mZnNldCAtPSAxNjsKLQkgIFN0YXRlLnJlZ3NbUkVHX0UwICsgMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLQkgIG9mZnNldCAtPSA0OwotCSAgU3RhdGUucmVnc1tSRUdfRTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotCSAgb2Zmc2V0IC09IDQ7Ci0JfQotCi0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4MCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MjApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgxMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDNdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgpCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfRDBdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTBdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0xBUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLSAgbmlhID0gUEM7Ci19Ci0KLQotOmluY2x1ZGU6OmFtMzM6YW0zMy5pZ2VuCi0KZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL21uMTAzMDBfc2ltLmggYi9zaW0vbW4xMDMwMC9tbjEwMzAwX3NpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZjMjU5Li4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMzAwL21uMTAzMDBfc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSU5MSU5FIGlubGluZQotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi1leHRlcm4gaG9zdF9jYWxsYmFjayAqbW4xMDMwMF9jYWxsYmFjazsKLWV4dGVybiBTSU1fREVTQyBzaW11bGF0b3I7Ci0KLSNkZWZpbmUgREVCVUdfVFJBQ0UJCTB4MDAwMDAwMDEKLSNkZWZpbmUgREVCVUdfVkFMVUVTCQkweDAwMDAwMDAyCi0KLWV4dGVybiBpbnQgbW4xMDMwMF9kZWJ1ZzsKLQotI2lmIFVDSEFSX01BWCA9PSAyNTUKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50ODsKLXR5cGVkZWYgc2lnbmVkIGNoYXIgaW50ODsKLSNlbHNlCi0jZXJyb3IgIkNoYXIgaXMgbm90IGFuIDgtYml0IHR5cGUiCi0jZW5kaWYKLQotI2lmIFNIUlRfTUFYID09IDMyNzY3Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNjsKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2OwotI2Vsc2UKLSNlcnJvciAiU2hvcnQgaXMgbm90IGEgMTYtYml0IHR5cGUiCi0jZW5kaWYKLQotI2lmIElOVF9NQVggPT0gMjE0NzQ4MzY0NwotCi10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Ci10eXBlZGVmIHNpZ25lZCBpbnQgaW50MzI7Ci0KLSNlbHNlCi0jICBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50MzI7Ci10eXBlZGVmIHNpZ25lZCBsb25nIGludDMyOwotCi0jICBlbHNlCi0jICBlcnJvciAiTmVpdGhlciBpbnQgbm9yIGxvbmcgaXMgYSAzMi1iaXQgdHlwZSIKLSMgIGVuZGlmCi0jZW5kaWYKLQotdHlwZWRlZiB1aW50MzIgcmVnX3Q7Ci0KLXN0cnVjdCBzaW1vcHMgCi17Ci0gIGxvbmcgb3Bjb2RlOwotICBsb25nIG1hc2s7Ci0gIHZvaWQgKCpmdW5jKSgpOwotICBpbnQgbGVuZ3RoOwotICBpbnQgZm9ybWF0OwotICBpbnQgbnVtb3BzOwotICBpbnQgb3BlcmFuZHNbMTZdOwotfTsKLQotLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2Nlc3NvcjsgcmVnaXN0ZXJzLCBtZW1vcnksIGV0Yy4gICovCi0KLXN0cnVjdCBfc3RhdGUKLXsKLSAgcmVnX3QgcmVnc1szMl07CQkvKiByZWdpc3RlcnMsIGQwLWQzLCBhMC1hMywgc3AsIHBjLCBtZHIsIHBzdywKLQkJCQkgICBsaXIsIGxhciwgbWRycSwgcGx1cyBzb21lIHJvb20gZm9yIHByb2Nlc3NvcgotCQkJCSAgIHNwZWNpZmljIHJlZ3MuICAqLwotICB1aW50OCAqbWVtOwkJCS8qIG1haW4gbWVtb3J5ICovCi0gIGludCBleGNlcHRpb247Ci0gIGludCBleGl0ZWQ7Ci0KLSAgLyogQWxsIGludGVybmFsIHN0YXRlIG1vZGlmaWVkIGJ5IHNpZ25hbF9leGNlcHRpb24oKSB0aGF0IG1heSBuZWVkIHRvIGJlCi0gICAgIHJvbGxlZCBiYWNrIGZvciBwYXNzaW5nIG1vbWVudC1vZi1leGNlcHRpb24gaW1hZ2UgYmFjayB0byBnZGIuICovCi0gIHJlZ190IGV4Y190cmlnZ2VyX3JlZ3NbMzJdOwotICByZWdfdCBleGNfc3VzcGVuZF9yZWdzWzMyXTsKLSAgaW50IGV4Y19zdXNwZW5kZWQ7Ci0KLSNkZWZpbmUgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUihTRCxDUFUsQ0lBKSBtbjEwMzAwX2NwdV9leGNlcHRpb25fdHJpZ2dlcihTRCxDUFUsQ0lBKQotI2RlZmluZSBTSU1fQ1BVX0VYQ0VQVElPTl9TVVNQRU5EKFNELENQVSxFWEMpIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNELENQVSxFWEMpCi0jZGVmaW5lIFNJTV9DUFVfRVhDRVBUSU9OX1JFU1VNRShTRCxDUFUsRVhDKSBtbjEwMzAwX2NwdV9leGNlcHRpb25fcmVzdW1lKFNELENQVSxFWEMpCi19OwotCi1leHRlcm4gc3RydWN0IF9zdGF0ZSBTdGF0ZTsKLWV4dGVybiB1aW50MzIgT1BbNF07Ci1leHRlcm4gc3RydWN0IHNpbW9wcyBTaW1vcHNbXTsKLQotI2RlZmluZSBQQwkoU3RhdGUucmVnc1tSRUdfUENdKQotI2RlZmluZSBTUAkoU3RhdGUucmVnc1tSRUdfU1BdKQotCi0jZGVmaW5lIFBTVyAoU3RhdGUucmVnc1sxMV0pCi0jZGVmaW5lIFBTV19aIDB4MQotI2RlZmluZSBQU1dfTiAweDIKLSNkZWZpbmUgUFNXX0MgMHg0Ci0jZGVmaW5lIFBTV19WIDB4OAotI2RlZmluZSBQU1dfSUUgTFNCSVQgKDExKQotI2RlZmluZSBQU1dfTE0gTFNNQVNLICgxMCwgOCkKLQotI2RlZmluZSBFWFRSQUNUX1BTV19MTSBMU0VYVFJBQ1RFRDE2IChQU1csIDEwLCA4KQotI2RlZmluZSBJTlNFUlRfUFNXX0xNKGwpIExTSU5TRVJURUQxNiAoKGwpLCAxMCwgOCkKLQotI2RlZmluZSBSRUdfRDAgMAotI2RlZmluZSBSRUdfQTAgNAotI2RlZmluZSBSRUdfU1AgOAotI2RlZmluZSBSRUdfUEMgOQotI2RlZmluZSBSRUdfTURSIDEwCi0jZGVmaW5lIFJFR19QU1cgMTEKLSNkZWZpbmUgUkVHX0xJUiAxMgotI2RlZmluZSBSRUdfTEFSIDEzCi0jZGVmaW5lIFJFR19NRFJRIDE0Ci0jZGVmaW5lIFJFR19FMCAxNQotI2RlZmluZSBSRUdfU1NQIDIzCi0jZGVmaW5lIFJFR19NU1AgMjQKLSNkZWZpbmUgUkVHX1VTUCAyNQotI2RlZmluZSBSRUdfTUNSSCAyNgotI2RlZmluZSBSRUdfTUNSTCAyNwotI2RlZmluZSBSRUdfTUNWRiAyOAotCi0jaWYgV0lUSF9DT01NT04KLS8qIFRoZXNlIGRlZmluaXRpb25zIGNvbmZsaWN0IHdpdGggc2ltaWxhciBtYWNyb3MgaW4gY29tbW9uLiAgKi8KLSNlbHNlCi0jZGVmaW5lIFNFWFQzKHgpCSgoKCh4KSYweDcpXih+MHgzKSkrMHg0KQkKLQotLyogc2lnbi1leHRlbmQgYSA0LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDQoeCkJKCgoKHgpJjB4ZileKH4weDcpKSsweDgpCQotCi0vKiBzaWduLWV4dGVuZCBhIDUtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUNSh4KQkoKCgoeCkmMHgxZileKH4weGYpKSsweDEwKQkKLQotLyogc2lnbi1leHRlbmQgYW4gOC1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ4KHgpCSgoKCh4KSYweGZmKV4ofjB4N2YpKSsweDgwKQotCi0vKiBzaWduLWV4dGVuZCBhIDktYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUOSh4KQkoKCgoeCkmMHgxZmYpXih+MHhmZikpKzB4MTAwKQotCi0vKiBzaWduLWV4dGVuZCBhIDE2LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDE2KHgpCSgoKCh4KSYweGZmZmYpXih+MHg3ZmZmKSkrMHg4MDAwKQotCi0vKiBzaWduLWV4dGVuZCBhIDIyLWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDIyKHgpCSgoKCh4KSYweDNmZmZmZileKH4weDFmZmZmZikpKzB4MjAwMDAwKQotCi0jZGVmaW5lIE1BWDMyCTB4N2ZmZmZmZmZMTAotI2RlZmluZSBNSU4zMgkweGZmODAwMDAwMDBMTAotI2RlZmluZSBNQVNLMzIJMHhmZmZmZmZmZkxMCi0jZGVmaW5lIE1BU0s0MAkweGZmZmZmZmZmZmZMTAotI2VuZGlmICAvKiBub3QgV0lUSF9DT01NT04gKi8KLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBTSUdUUkFQIDUKLSNkZWZpbmUgU0lHUVVJVCAzCi0jZW5kaWYKLQotI2lmIFdJVEhfQ09NTU9OCi0KLSNkZWZpbmUgRkVUQ0gzMihhLGIsYyxkKSBcCi0gKChhKSsoKGIpPDw4KSsoKGMpPDwxNikrKChkKTw8MjQpKQotCi0jZGVmaW5lIEZFVENIMjQoYSxiLGMpIFwKLSAoKGEpKygoYik8PDgpKygoYyk8PDE2KSkKLQotI2RlZmluZSBGRVRDSDE2KGEsYikgKChhKSsoKGIpPDw4KSkKLQotI2RlZmluZSBsb2FkX2J5dGUoQUREUikgXAotc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfMSAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBQQywgcmVhZF9tYXAsIChBRERSKSkKLQotI2RlZmluZSBsb2FkX2hhbGYoQUREUikgXAotc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfMiAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBQQywgcmVhZF9tYXAsIChBRERSKSkKLQotI2RlZmluZSBsb2FkX3dvcmQoQUREUikgXAotc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfNCAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBQQywgcmVhZF9tYXAsIChBRERSKSkKLQotI2RlZmluZSBzdG9yZV9ieXRlKEFERFIsIERBVEEpIFwKLXNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF8xIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFwKLQkJCSAgICBQQywgd3JpdGVfbWFwLCAoQUREUiksIChEQVRBKSkKLQotCi0jZGVmaW5lIHN0b3JlX2hhbGYoQUREUiwgREFUQSkgXAotc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzIgKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgXAotCQkJICAgIFBDLCB3cml0ZV9tYXAsIChBRERSKSwgKERBVEEpKQotCi0KLSNkZWZpbmUgc3RvcmVfd29yZChBRERSLCBEQVRBKSBcCi1zaW1fY29yZV93cml0ZV91bmFsaWduZWRfNCAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBcCi0JCQkgICAgUEMsIHdyaXRlX21hcCwgKEFERFIpLCAoREFUQSkpCi0jZW5kaWYgIC8qIFdJVEhfQ09NTU9OICovCi0KLSNpZiBXSVRIX0NPTU1PTgotI2Vsc2UKLSNkZWZpbmUgbG9hZF9tZW1fYmlnKGFkZHIsbGVuKSBcCi0gIChsZW4gPT0gMSA/ICooKGFkZHIpICsgU3RhdGUubWVtKSA6IFwKLSAgIGxlbiA9PSAyID8gKCgqKChhZGRyKSArIFN0YXRlLm1lbSkgPDwgOCkgXAotCSAgICAgICB8ICooKChhZGRyKSArIDEpICsgU3RhdGUubWVtKSkgOiBcCi0gICBsZW4gPT0gMyA/ICgoKigoYWRkcikgKyBTdGF0ZS5tZW0pIDw8IDE2KSBcCi0JICAgICAgIHwgKCooKChhZGRyKSArIDEpICsgU3RhdGUubWVtKSA8PCA4KSBcCi0JICAgICAgIHwgKigoKGFkZHIpICsgMikgKyBTdGF0ZS5tZW0pKSA6IFwKLQkgICAgICAoKCooKGFkZHIpICsgU3RhdGUubWVtKSA8PCAyNCkgXAotCSAgICAgICB8ICgqKCgoYWRkcikgKyAxKSArIFN0YXRlLm1lbSkgPDwgMTYpIFwKLQkgICAgICAgfCAoKigoKGFkZHIpICsgMikgKyBTdGF0ZS5tZW0pIDw8IDgpIFwKLQkgICAgICAgfCAqKCgoYWRkcikgKyAzKSArIFN0YXRlLm1lbSkpKQotCi1zdGF0aWMgSU5MSU5FIHVpbnQzMgotbG9hZF9ieXRlIChhZGRyKQotICAgICBTSU1fQUREUiBhZGRyOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHBbMF07Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdWludDMyCi1sb2FkX2hhbGYgKGFkZHIpCi0gICAgIFNJTV9BRERSIGFkZHI7Ci17Ci0gIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07Ci0KLSNpZmRlZiBDSEVDS19BRERSCi0gIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICByZXR1cm4gcFsxXSA8PCA4IHwgcFswXTsKLX0KLQotc3RhdGljIElOTElORSB1aW50MzIKLWxvYWRfM19ieXRlIChhZGRyKQotICAgICBTSU1fQUREUiBhZGRyOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHBbMl0gPDwgMTYgfCBwWzFdIDw8IDggfCBwWzBdOwotfQotCi1zdGF0aWMgSU5MSU5FIHVpbnQzMgotbG9hZF93b3JkIChhZGRyKQotICAgICBTSU1fQUREUiBhZGRyOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHBbM10gPDwgMjQgfCBwWzJdIDw8IDE2IHwgcFsxXSA8PCA4IHwgcFswXTsKLX0KLQotc3RhdGljIElOTElORSB1aW50MzIKLWxvYWRfbWVtIChhZGRyLCBsZW4pCi0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIGludCBsZW47Ci17Ci0gIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07Ci0KLSNpZmRlZiBDSEVDS19BRERSCi0gIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGxlbikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIHBbMF07Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIHBbMV0gPDwgOCB8IHBbMF07Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHBbMl0gPDwgMTYgfCBwWzFdIDw8IDggfCBwWzBdOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBwWzNdIDw8IDI0IHwgcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1zdG9yZV9ieXRlIChhZGRyLCBkYXRhKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHBbMF0gPSBkYXRhOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXN0b3JlX2hhbGYgKGFkZHIsIGRhdGEpCi0gICAgIFNJTV9BRERSIGFkZHI7Ci0gICAgIHVpbnQzMiBkYXRhOwotewotICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOwotCi0jaWZkZWYgQ0hFQ0tfQUREUgotICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQotICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgcFswXSA9IGRhdGE7Ci0gIHBbMV0gPSBkYXRhID4+IDg7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc3RvcmVfM19ieXRlIChhZGRyLCBkYXRhKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHBbMF0gPSBkYXRhOwotICBwWzFdID0gZGF0YSA+PiA4OwotICBwWzJdID0gZGF0YSA+PiAxNjsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1zdG9yZV93b3JkIChhZGRyLCBkYXRhKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1aW50MzIgZGF0YTsKLXsKLSAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKLQotI2lmZGVmIENIRUNLX0FERFIKLSAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIHBbMF0gPSBkYXRhOwotICBwWzFdID0gZGF0YSA+PiA4OwotICBwWzJdID0gZGF0YSA+PiAxNjsKLSAgcFszXSA9IGRhdGEgPj4gMjQ7Ci19Ci0jZW5kaWYgIC8qIG5vdCBXSVRIX0NPTU1PTiAqLwotCi0vKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAqLwotCi11aW50MzIgZ2V0X3dvcmQgUEFSQU1TICgodWludDggKikpOwotdWludDE2IGdldF9oYWxmIFBBUkFNUyAoKHVpbnQ4ICopKTsKLXVpbnQ4IGdldF9ieXRlIFBBUkFNUyAoKHVpbnQ4ICopKTsKLXZvaWQgcHV0X3dvcmQgUEFSQU1TICgodWludDggKiwgdWludDMyKSk7Ci12b2lkIHB1dF9oYWxmIFBBUkFNUyAoKHVpbnQ4ICosIHVpbnQxNikpOwotdm9pZCBwdXRfYnl0ZSBQQVJBTVMgKCh1aW50OCAqLCB1aW50OCkpOwotCi1leHRlcm4gdWludDggKm1hcCBQQVJBTVMgKChTSU1fQUREUiBhZGRyKSk7Ci0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkgZ2VuZXJpY0FkZCBQQVJBTVMgKCh1bnNpZ25lZDMyIHNvdXJjZSwgdW5zaWduZWQzMiBkZXN0UmVnKSk7Ci1JTkxJTkVfU0lNX01BSU4gKHZvaWQpIGdlbmVyaWNTdWIgUEFSQU1TICgodW5zaWduZWQzMiBzb3VyY2UsIHVuc2lnbmVkMzIgZGVzdFJlZykpOwotSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBnZW5lcmljQ21wIFBBUkFNUyAoKHVuc2lnbmVkMzIgbGVmdE9wbmQsIHVuc2lnbmVkMzIgcmlnaHRPcG5kKSk7Ci1JTkxJTkVfU0lNX01BSU4gKHZvaWQpIGdlbmVyaWNPciBQQVJBTVMgKCh1bnNpZ25lZDMyIHNvdXJjZSwgdW5zaWduZWQzMiBkZXN0UmVnKSk7Ci1JTkxJTkVfU0lNX01BSU4gKHZvaWQpIGdlbmVyaWNYb3IgUEFSQU1TICgodW5zaWduZWQzMiBzb3VyY2UsIHVuc2lnbmVkMzIgZGVzdFJlZykpOwotSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBnZW5lcmljQnRzdCBQQVJBTVMgKCh1bnNpZ25lZDMyIGxlZnRPcG5kLCB1bnNpZ25lZDMyIHJpZ2h0T3BuZCkpOwotSU5MSU5FX1NJTV9NQUlOIChpbnQpIHN5c2NhbGxfcmVhZF9tZW0gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqY2IsCi0JCQkJCQlzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCi0JCQkJCQl1bnNpZ25lZCBsb25nIHRhZGRyLAotCQkJCQkJY2hhciAqYnVmLAotCQkJCQkJaW50IGJ5dGVzKSk7IAotSU5MSU5FX1NJTV9NQUlOIChpbnQpIHN5c2NhbGxfd3JpdGVfbWVtIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKmNiLAotCQkJCQkJc3RydWN0IGNiX3N5c2NhbGwgKnNjLAotCQkJCQkJdW5zaWduZWQgbG9uZyB0YWRkciwKLQkJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJCWludCBieXRlcykpOyAKLUlOTElORV9TSU1fTUFJTiAodm9pZCkgZG9fc3lzY2FsbCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHByb2dyYW1faW50ZXJydXB0IChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBzaW1fY2lhIGNpYSwgU0lNX1NJR05BTCBzaWcpOwotCi12b2lkIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbl90cmlnZ2VyKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGFkZHJlc3Nfd29yZCBwYyk7Ci12b2lkIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pOwotdm9pZCBtbjEwMzAwX2NwdV9leGNlcHRpb25fcmVzdW1lKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGludCBleGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvb3BfdXRpbHMuYyBiL3NpbS9tbjEwMzAwL29wX3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjIxMGYuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvb3BfdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0jaW5jbHVkZSAic2ltLW1haW4uaCIKLSNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKLQotI2lmZGVmIEhBVkVfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotCi0KLSNkZWZpbmUgUkVHMChYKSAoKFgpICYgMHgzKQotI2RlZmluZSBSRUcxKFgpICgoKFgpICYgMHhjKSA+PiAyKQotI2RlZmluZSBSRUcwXzQoWCkgKCgoWCkgJiAweDMwKSA+PiA0KQotI2RlZmluZSBSRUcwXzgoWCkgKCgoWCkgJiAweDMwMCkgPj4gOCkKLSNkZWZpbmUgUkVHMV84KFgpICgoKFgpICYgMHhjMDApID4+IDEwKQotI2RlZmluZSBSRUcwXzE2KFgpICgoKFgpICYgMHgzMDAwMCkgPj4gMTYpCi0jZGVmaW5lIFJFRzFfMTYoWCkgKCgoWCkgJiAweGMwMDAwKSA+PiAxOCkKLQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1nZW5lcmljQWRkKHVuc2lnbmVkMzIgc291cmNlLCB1bnNpZ25lZDMyIGRlc3RSZWcpCi17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIGRlc3QsIHN1bTsKLQotICBkZXN0ID0gU3RhdGUucmVnc1tkZXN0UmVnXTsKLSAgc3VtID0gc291cmNlICsgZGVzdDsKLSAgU3RhdGUucmVnc1tkZXN0UmVnXSA9IHN1bTsKLQotICB6ID0gKHN1bSA9PSAwKTsKLSAgbiA9IChzdW0gJiAweDgwMDAwMDAwKTsKLSAgYyA9IChzdW0gPCBzb3VyY2UpIHx8IChzdW0gPCBkZXN0KTsKLSAgdiA9ICgoZGVzdCAmIDB4ODAwMDAwMDApID09IChzb3VyY2UgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChkZXN0ICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0KLQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1nZW5lcmljU3ViKHVuc2lnbmVkMzIgc291cmNlLCB1bnNpZ25lZDMyIGRlc3RSZWcpCi17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZDMyIGRlc3QsIGRpZmZlcmVuY2U7Ci0KLSAgZGVzdCA9IFN0YXRlLnJlZ3NbZGVzdFJlZ107Ci0gIGRpZmZlcmVuY2UgPSBkZXN0IC0gc291cmNlOwotICBTdGF0ZS5yZWdzW2Rlc3RSZWddID0gZGlmZmVyZW5jZTsKLQotICB6ID0gKGRpZmZlcmVuY2UgPT0gMCk7Ci0gIG4gPSAoZGlmZmVyZW5jZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHNvdXJjZSA+IGRlc3QpOwotICB2ID0gKChkZXN0ICYgMHg4MDAwMDAwMCkgIT0gKHNvdXJjZSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKGRlc3QgJiAweDgwMDAwMDAwKSAhPSAoZGlmZmVyZW5jZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1nZW5lcmljQ21wKHVuc2lnbmVkMzIgbGVmdE9wbmQsIHVuc2lnbmVkMzIgcmlnaHRPcG5kKQotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQzMiB2YWx1ZTsKLQotICB2YWx1ZSA9IHJpZ2h0T3BuZCAtIGxlZnRPcG5kOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChsZWZ0T3BuZCA+IHJpZ2h0T3BuZCk7Ci0gIHYgPSAoKHJpZ2h0T3BuZCAmIDB4ODAwMDAwMDApICE9IChsZWZ0T3BuZCAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJpZ2h0T3BuZCAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLWdlbmVyaWNPcih1bnNpZ25lZDMyIHNvdXJjZSwgdW5zaWduZWQzMiBkZXN0UmVnKQotewotICBpbnQgbiwgejsKLQotICBTdGF0ZS5yZWdzW2Rlc3RSZWddIHw9IHNvdXJjZTsKLSAgeiA9IChTdGF0ZS5yZWdzW2Rlc3RSZWddID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbZGVzdFJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotCi1JTkxJTkVfU0lNX01BSU4gKHZvaWQpCi1nZW5lcmljWG9yKHVuc2lnbmVkMzIgc291cmNlLCB1bnNpZ25lZDMyIGRlc3RSZWcpCi17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbZGVzdFJlZ10gXj0gc291cmNlOwotICB6ID0gKFN0YXRlLnJlZ3NbZGVzdFJlZ10gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tkZXN0UmVnXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLWdlbmVyaWNCdHN0KHVuc2lnbmVkMzIgbGVmdE9wbmQsIHVuc2lnbmVkMzIgcmlnaHRPcG5kKQotewotICB1bnNpZ25lZDMyIHRlbXA7Ci0gIGludCB6LCBuOwotCi0gIHRlbXAgPSByaWdodE9wbmQ7Ci0gIHRlbXAgJj0gbGVmdE9wbmQ7Ci0gIG4gPSAodGVtcCAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOwotfQotCi0vKiBSZWFkL3dyaXRlIGZ1bmN0aW9ucyBmb3Igc3lzdGVtIGNhbGwgaW50ZXJmYWNlLiAgKi8KLUlOTElORV9TSU1fTUFJTiAoaW50KQotc3lzY2FsbF9yZWFkX21lbSAoaG9zdF9jYWxsYmFjayAqY2IsIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKLQkJICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjaGFyICpidWYsIGludCBieXRlcykKLXsKLSAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKLSAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVKHNkLCAwKTsKLQotICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Ci19Ci0KLUlOTElORV9TSU1fTUFJTiAoaW50KQotc3lzY2FsbF93cml0ZV9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgdGFkZHIsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGJ5dGVzKQotewotICBTSU1fREVTQyBzZCA9IChTSU1fREVTQykgc2MtPnAxOwotICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUoc2QsIDApOwotCi0gIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOwotfQotCi0KLS8qIHN5c2NhbGwgKi8KLUlOTElORV9TSU1fTUFJTiAodm9pZCkKLWRvX3N5c2NhbGwgKCkKLXsKLQotICAvKiBXZSB1c2UgdGhpcyBmb3Igc2ltdWxhdGVkIHN5c3RlbSBjYWxsczsgd2UgbWF5IG5lZWQgdG8gY2hhbmdlCi0gICAgIGl0IHRvIGEgcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24gaWYgd2UgY29uZmxpY3Qgd2l0aCB1c2VzIGF0Ci0gICAgIE1hdHN1c2hpdGEuICAqLwotICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkKLSAgZXJybm8gPSAwOwotCi0vKiBSZWdpc3RlcnMgcGFzc2VkIHRvIHRyYXAgMCAqLwotCi0vKiBGdW5jdGlvbiBudW1iZXIuICAqLwotI2RlZmluZSBGVU5DICAgKFN0YXRlLnJlZ3NbMF0pCi0KLS8qIFBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBQQVJNMSAgIChTdGF0ZS5yZWdzWzFdKQotI2RlZmluZSBQQVJNMiAgIChsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIDEyKSkKLSNkZWZpbmUgUEFSTTMgICAobG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAxNikpCi0KLS8qIFJlZ2lzdGVycyBzZXQgYnkgdHJhcCAwICovCi0KLSNkZWZpbmUgUkVUVkFMIFN0YXRlLnJlZ3NbMF0JLyogcmV0dXJuIHZhbHVlICovCi0jZGVmaW5lIFJFVEVSUiBTdGF0ZS5yZWdzWzFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCi0KLS8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KLSNkZWZpbmUgTUVNUFRSKHgpIChTdGF0ZS5tZW0gKyB4KQotCi0gIGlmICggRlVOQyA9PSBUQVJHRVRfU1lTX2V4aXQgKQotICAgIHsKLSAgICAgIC8qIEVYSVQgLSBjYWxsZXIgY2FuIGxvb2sgaW4gUEFSTTEgdG8gd29yayBvdXQgdGhlIHJlYXNvbiAqLwotICAgICAgaWYgKFBBUk0xID09IDB4ZGVhZCkKLQlTdGF0ZS5leGNlcHRpb24gPSBTSUdBQlJUOwotICAgICAgZWxzZQotCXsKLQkgIHNpbV9lbmdpbmVfaGFsdCAoc2ltdWxhdG9yLCBTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIE5VTEwsIFBDLAotCQkJICAgc2ltX2V4aXRlZCwgUEFSTTEpOwotCSAgU3RhdGUuZXhjZXB0aW9uID0gU0lHUVVJVDsKLQl9Ci0gICAgICBTdGF0ZS5leGl0ZWQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIENCX1NZU0NBTEwgc3lzY2FsbDsKLQotICAgICAgQ0JfU1lTQ0FMTF9JTklUICgmc3lzY2FsbCk7Ci0gICAgICBzeXNjYWxsLmFyZzEgPSBQQVJNMTsKLSAgICAgIHN5c2NhbGwuYXJnMiA9IFBBUk0yOwotICAgICAgc3lzY2FsbC5hcmczID0gUEFSTTM7Ci0gICAgICBzeXNjYWxsLmZ1bmMgPSBGVU5DOwotICAgICAgc3lzY2FsbC5wMSA9IChQVFIpIHNpbXVsYXRvcjsKLSAgICAgIHN5c2NhbGwucmVhZF9tZW0gPSBzeXNjYWxsX3JlYWRfbWVtOwotICAgICAgc3lzY2FsbC53cml0ZV9tZW0gPSBzeXNjYWxsX3dyaXRlX21lbTsKLSAgICAgIGNiX3N5c2NhbGwgKFNUQVRFX0NBTExCQUNLIChzaW11bGF0b3IpLCAmc3lzY2FsbCk7Ci0gICAgICBSRVRFUlIgPSBzeXNjYWxsLmVycmNvZGU7Ci0gICAgICBSRVRWQUwgPSBzeXNjYWxsLnJlc3VsdDsKLSAgICB9Ci0KLQotICBlcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL3NpbS1tYWluLmMgYi9zaW0vbW4xMDMwMC9zaW0tbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQwOTlkLi4wMDAwMDAwCi0tLSBhL3NpbS9tbjEwMzAwL3NpbS1tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNpZm5kZWYgU0lNX01BSU5fQwotI2RlZmluZSBTSU1fTUFJTl9DCi0jaW5jbHVkZSAib3BfdXRpbHMuYyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvc2ltLW1haW4uaCBiL3NpbS9tbjEwMzAwL3NpbS1tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmY0ZTQuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvc2ltLW1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgU0lNX01BSU5fSAotI2RlZmluZSBTSU1fTUFJTl9ICi0KLSNkZWZpbmUgV0lUSF9DT1JFCi0jZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQotI2RlZmluZSBTSU1fSEFORExFU19MTUEgMQotCi0jZGVmaW5lIFNJTV9FTkdJTkVfSEFMVF9IT09LKFNELExBU1RfQ1BVLENJQSkgMCAvKiBkaXNhYmxlIHRoaXMgaG9vayAqLwotCi0jaW5jbHVkZSAic2ltLWJhc2ljcy5oIgotI2luY2x1ZGUgInNpbS1zaWduYWwuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPiAvKiBGb3Iga2lsbCgpIGluIGluc25zOmRvX3RyYXAgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSBnZW5lcmF0ZWQgZmlsZXMuICAqLwotI2luY2x1ZGUgIml0YWJsZS5oIgotI2luY2x1ZGUgImlkZWNvZGUuaCIKLSNpbmNsdWRlICJpZGVjb2RlLmgiCi0KLXR5cGVkZWYgaW5zdHJ1Y3Rpb25fYWRkcmVzcyBzaW1fY2lhOwotc3RhdGljIGNvbnN0IHNpbV9jaWEgbnVsbF9jaWEgPSB7MH07IC8qIER1bW15ICovCi0jZGVmaW5lIE5VTExfQ0lBIG51bGxfY2lhCi0vKiBGSVhNRTogUGVyaGFwcyBpZ2VuIHNob3VsZCBnZW5lcmF0ZSBhY2Nlc3MgbWFjcm9zIGZvcgotICAgYGluc3RydWN0aW9uX2FkZHJlc3MnIHRoYXQgd2UgY291bGQgdXNlLiAgKi8KLS8qI2RlZmluZSBDSUFfQUREUihjaWEpICgoY2lhKS5pcCkgZG9lc24ndCB3b3JrIGZvciBtbjEwMzAwKi8KLQotI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKLQotI2RlZmluZSBTSU1fQ09SRV9TSUdOQUwoU0QsQ1BVLENJQSxNQVAsTlJfQllURVMsQUREUixUUkFOU0ZFUixFUlJPUikgIFwKLW1uMTAzMDBfY29yZV9zaWduYWwgKChTRCksIChDUFUpLCAoQ0lBKSwgKE1BUCksIChOUl9CWVRFUyksIChBRERSKSwgKFRSQU5TRkVSKSwgKEVSUk9SKSkKLQotCi0jaW5jbHVkZSAic2ltLWJhc2UuaCIKLQotI2luY2x1ZGUgIm1uMTAzMDBfc2ltLmgiCi0KLS8qIEJyaW5nIGRhdGEgaW4gZnJvbSB0aGUgY29sZCAqLwotCi0jZGVmaW5lIElNRU04KEVBKSBcCi0oc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzEoU1RBVEVfQ1BVKHNkLCAwKSwgRUEsIGV4ZWNfbWFwLCAoRUEpKSkKLQotI2RlZmluZSBJTUVNOF9JTU1FRChFQSwgTikgXAotKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8xKFNUQVRFX0NQVShzZCwgMCksIEVBLCBleGVjX21hcCwgKEVBKSArIChOKSkpCi0KLQotLyogRklYTUU6IEZvciBtb21lbnQsIHNhdmUvcmVzdG9yZSBQQyB2YWx1ZSBmb3VuZCBpbiBzdHJ1Y3QgU3RhdGUuCi0gICBTdHJ1Y3QgU3RhdGUgd2lsbCBvbmUgZGF5IGdvIGF3YXksIGJlaW5nIHBsYWNlZCBpbiB0aGUgc2ltX2NwdQotICAgc3RhdGUuICovCi0jZGVmaW5lIENJQV9HRVQoQ1BVKSAoKFBDKSArIDApCi0jZGVmaW5lIENJQV9TRVQoQ1BVLFZBTCkgKChDUFUpLT5jaWEgPSAoVkFMKSwgUEMgPSAoVkFMKSkKLQotCi1zdHJ1Y3QgX3NpbV9jcHUgewotICBzaW1fZXZlbnQgKnBlbmRpbmdfbm1pOwotICBzaW1fY2lhIGNpYTsKLSAgc2ltX2NwdV9iYXNlIGJhc2U7Ci19OwotCi0KLXN0cnVjdCBzaW1fc3RhdGUgewotCi0gIC8qIHRoZSBwcm9jZXNzb3JzIHByb3BlciAqLwotICBzaW1fY3B1IGNwdTsKLSNkZWZpbmUgU1RBVEVfQ1BVKHNkLCBuKSAoJihzZCktPmNwdSkKLQotICAvKiBUaGUgYmFzZSBjbGFzcy4gICovCi0gIHNpbV9zdGF0ZV9iYXNlIGJhc2U7Ci0KLX07Ci0KLS8qIEZvciBjb21wYXRpYmlsaXR5LCB1bnRpbCBhbGwgZnVuY3Rpb25zIGNvbnZlcnRlZCB0byBwYXNzaW5nCi0gICBTSU1fREVTQyBhcyBhbiBhcmd1bWVudCAqLwotZXh0ZXJuIFNJTV9ERVNDIHNpbXVsYXRvcjsKLQotLyogKHJlKSBpbml0aWFsaXplIHRoZSBzaW11bGF0b3IgKi8KLQotZXh0ZXJuIHZvaWQgZW5naW5lX2luaXQoU0lNX0RFU0Mgc2QpOwotZXh0ZXJuIFNJTV9DT1JFX1NJR05BTF9GTiBtbjEwMzAwX2NvcmVfc2lnbmFsOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL3NpbW9wcy5jIGIvc2ltL21uMTAzMDAvc2ltb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTkwNTYuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvc2ltb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjM5ICswLDAgQEAKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgIm1uMTAzMDBfc2ltLmgiCi0jaW5jbHVkZSAic2ltb3BzLmgiCi0jaW5jbHVkZSAic2ltLXR5cGVzLmgiCi0jaW5jbHVkZSAidGFyZy12YWxzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgUkVHMChYKSAoKFgpICYgMHgzKQotI2RlZmluZSBSRUcxKFgpICgoKFgpICYgMHhjKSA+PiAyKQotI2RlZmluZSBSRUcwXzQoWCkgKCgoWCkgJiAweDMwKSA+PiA0KQotI2RlZmluZSBSRUcwXzgoWCkgKCgoWCkgJiAweDMwMCkgPj4gOCkKLSNkZWZpbmUgUkVHMV84KFgpICgoKFgpICYgMHhjMDApID4+IDEwKQotI2RlZmluZSBSRUcwXzE2KFgpICgoKFgpICYgMHgzMDAwMCkgPj4gMTYpCi0jZGVmaW5lIFJFRzFfMTYoWCkgKCgoWCkgJiAweGMwMDAwKSA+PiAxOCkKLQwKLS8qIG1vdiBpbW04LCBkbiAqLwotdm9pZCBPUF84MDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID0gU0VYVDggKGluc24gJiAweGZmKTsKLX0KLQotLyogbW92IGRtLCBkbiAqLwotdm9pZCBPUF84MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLX0KLQotLyogbW92IGRtLCBhbiAqLwotdm9pZCBPUF9GMUUwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotfQotCi0vKiBtb3YgYW0sIGRuICovCi12b2lkIE9QX0YxRDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Ci19Ci0KLS8qIG1vdiBpbW04LCBhbiAqLwotdm9pZCBPUF85MDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildID0gaW5zbiAmIDB4ZmY7Ci19Ci0KLS8qIG1vdiBhbSwgYW4gKi8KLXZvaWQgT1BfOTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Ci19Ci0KLS8qIG1vdiBzcCwgYW4gKi8KLXZvaWQgT1BfM0MgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfU1BdOwotfQotCi0vKiBtb3YgYW0sIHNwICovCi12b2lkIE9QX0YyRjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOwotfQotCi0vKiBtb3YgcHN3LCBkbiAqLwotdm9pZCBPUF9GMkU0IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFBTVzsKLX0KLQotLyogbW92IGRtLCBwc3cgKi8KLXZvaWQgT1BfRjJGMyAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgUFNXID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci19Ci0KLS8qIG1vdiBtZHIsIGRuICovCi12b2lkIE9QX0YyRTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfTURSXTsKLX0KLQotLyogbW92IGRtLCBtZHIgKi8KLXZvaWQgT1BfRjJGMiAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotfQotCi0vKiBtb3YgKGFtKSwgZG4gKi8KLXZvaWQgT1BfNzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKLX0KLQotLyogbW92IChkOCxhbSksIGRuICovCi12b2lkIE9QX0Y4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKLX0KLQotLyogbW92IChkMTYsYW0pLCBkbiAqLwotdm9pZCBPUF9GQTAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0KLSAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCi0JCSAgKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSk7Ci19Ci0KLS8qIG1vdiAoZDMyLGFtKSwgZG4gKi8KLXZvaWQgT1BfRkMwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCQkgICsgKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLX0KLQotLyogbW92IChkOCxzcCksIGRuICovCi12b2lkIE9QXzU4MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KLSAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmKSk7Ci19Ci0KLS8qIG1vdiAoZDE2LHNwKSwgZG4gKi8KLXZvaWQgT1BfRkFCNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZmZmKSk7Ci19Ci0KLS8qIG1vdiAoZDMyLHNwKSwgZG4gKi8KLXZvaWQgT1BfRkNCNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOwotfQotCi0vKiBtb3YgKGRpLGFtKSwgZG4gKi8KLXZvaWQgT1BfRjMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KLQkJICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSk7Ci19Ci0KLS8qIG1vdiAoYWJzMTYpLCBkbiAqLwotdm9pZCBPUF8zMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gbG9hZF93b3JkICgoaW5zbiAmIDB4ZmZmZikpOwotfQotCi0vKiBtb3YgKGFiczMyKSwgZG4gKi8KLXZvaWQgT1BfRkNBNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOwotfQotCi0vKiBtb3YgKGFtKSwgYW4gKi8KLXZvaWQgT1BfRjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KLSAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotfQotCi0vKiBtb3YgKGQ4LGFtKSwgYW4gKi8KLXZvaWQgT1BfRjgyMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfOCAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildCi0JCSAgKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSk7Ci19Ci0KLS8qIG1vdiAoZDE2LGFtKSwgYW4gKi8KLXZvaWQgT1BfRkEyMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCQkgICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpOwotfQotCi0vKiBtb3YgKGQzMixhbSksIGFuICovCi12b2lkIE9QX0ZDMjAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkJICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIG1vdiAoZDgsc3ApLCBhbiAqLwotdm9pZCBPUF81QzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildCi0gICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZikpOwotfQotCi0vKiBtb3YgKGQxNixzcCksIGFuICovCi12b2lkIE9QX0ZBQjAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZikpOwotfQotCi0vKiBtb3YgKGQzMixzcCksIGFuICovCi12b2lkIE9QX0ZDQjAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLX0KLQotLyogbW92IChkaSxhbSksIGFuICovCi12b2lkIE9QX0YzODAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF80IChpbnNuKV0KLSAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCi0JCSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSk7Ci19Ci0KLS8qIG1vdiAoYWJzMTYpLCBhbiAqLwotdm9pZCBPUF9GQUEwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0gPSBsb2FkX3dvcmQgKChpbnNuICYgMHhmZmZmKSk7Ci19Ci0KLS8qIG1vdiAoYWJzMzIpLCBhbiAqLwotdm9pZCBPUF9GQ0EwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IGxvYWRfd29yZCAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIG1vdiAoZDgsYW0pLCBzcCAqLwotdm9pZCBPUF9GOEYwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXQotICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXQotCQkgICsgU0VYVDggKGluc24gJiAweGZmKSkpOwotfQotCi0vKiBtb3YgZG0sIChhbikgKi8KLXZvaWQgT1BfNjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKLX0KLQotLyogbW92IGRtLCAoZDgsYW4pICovCi12b2lkIE9QX0Y4MTAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfOCAoaW5zbildKTsKLX0KLQotLyogbW92IGRtIChkMTYsYW4pICovCi12b2lkIE9QX0ZBMTAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbSAoZDMyLGFuKSAqLwotdm9pZCBPUF9GQzEwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCi0JICAgICAgICsgKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGRtLCAoZDgsc3ApICovCi12b2lkIE9QXzQyMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbSwgKGQxNixzcCkgKi8KLXZvaWQgT1BfRkE5MTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZmZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBkbSwgKGQzMixzcCkgKi8KLXZvaWQgT1BfRkM5MTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgZG0sIChkaSxhbikgKi8KLXZvaWQgT1BfRjM0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCi0JICAgICAgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pOwotfQotCi0vKiBtb3YgZG0sIChhYnMxNikgKi8KLXZvaWQgT1BfMTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKChpbnNuICYgMHhmZmZmKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgZG0sIChhYnMzMikgKi8KLXZvaWQgT1BfRkM4MTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksIAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoYW4pICovCi12b2lkIE9QX0YwMTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoZDgsYW4pICovCi12b2lkIE9QX0Y4MzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfOCAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoZDE2LGFuKSAqLwotdm9pZCBPUF9GQTMwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgYW0sIChkMzIsYW4pICovCi12b2lkIE9QX0ZDMzAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkgICAgICAgKyAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3YgYW0sIChkOCxzcCkgKi8KLXZvaWQgT1BfNDMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfOCAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoZDE2LHNwKSAqLwotdm9pZCBPUF9GQTkwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmZmYpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildKTsKLX0KLQotLyogbW92IGFtLCAoZDMyLHNwKSAqLwotdm9pZCBPUF9GQzkwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBhbSwgKGRpLGFuKSAqLwotdm9pZCBPUF9GM0MwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KLQkgICAgICAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzQgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBhbSwgKGFiczE2KSAqLwotdm9pZCBPUF9GQTgwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdiBhbSwgKGFiczMyKSAqLwotdm9pZCBPUF9GQzgwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfd29yZCAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3Ygc3AsIChkOCxhbikgKi8KLXZvaWQgT1BfRjhGNDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildICsgU0VYVDggKGluc24gJiAweGZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19TUF0pOwotfQotCi0vKiBtb3YgaW1tMTYsIGRuICovCi12b2lkIE9QXzJDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IFNFWFQxNiAoaW5zbiAmIDB4ZmZmZik7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci19Ci0KLS8qIG1vdiBpbW0zMixkbiAqLwotdm9pZCBPUF9GQ0NDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOwotfQotCi0vKiBtb3YgaW1tMTYsIGFuICovCi12b2lkIE9QXzI0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IGluc24gJiAweGZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci19Ci0KLS8qIG1vdiBpbW0zMiwgYW4gKi8KLXZvaWQgT1BfRkNEQzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKLX0KLQotLyogbW92YnUgKGFtKSwgZG4gKi8KLXZvaWQgT1BfRjA0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0KLSAgICA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotfQotCi0vKiBtb3ZidSAoZDgsYW0pLCBkbiAqLwotdm9pZCBPUF9GODQwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0KLSAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0KLQkJICArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKLX0KLQotLyogbW92YnUgKGQxNixhbSksIGRuICovCi12b2lkIE9QX0ZBNDAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkJICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKTsKLX0KLQotLyogbW92YnUgKGQzMixhbSksIGRuICovCi12b2lkIE9QX0ZDNDAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkJICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIG1vdmJ1IChkOCxzcCksIGRuICovCi12b2lkIE9QX0Y4QjgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmKSkpOwotfQotCi0vKiBtb3ZidSAoZDE2LHNwKSwgZG4gKi8KLXZvaWQgT1BfRkFCODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZikpKTsKLX0KLQotLyogbW92YnUgKGQzMixzcCksIGRuICovCi12b2lkIE9QX0ZDQjgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLX0KLQotLyogbW92YnUgKGRpLGFtKSwgZG4gKi8KLXZvaWQgT1BfRjQwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KLQkJICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSk7Ci19Ci0KLS8qIG1vdmJ1IChhYnMxNiksIGRuICovCi12b2lkIE9QXzM0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSBsb2FkX2J5dGUgKChpbnNuICYgMHhmZmZmKSk7Ci19Ci0KLS8qIG1vdmJ1IChhYnMzMiksIGRuICovCi12b2lkIE9QX0ZDQTgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9ieXRlICgoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLX0KLQotLyogbW92YnUgZG0sIChhbikgKi8KLXZvaWQgT1BfRjA1MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0sCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotfQotCi0vKiBtb3ZidSBkbSwgKGQ4LGFuKSAqLwotdm9pZCBPUF9GODUwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildICsgU0VYVDggKGluc24gJiAweGZmKSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXSk7Ci19Ci0KLS8qIG1vdmJ1IGRtLCAoZDE2LGFuKSAqLwotdm9pZCBPUF9GQTUwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZidSBkbSwgKGQzMixhbikgKi8KLXZvaWQgT1BfRkM1MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCSAgICAgICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmJ1IGRtLCAoZDgsc3ApICovCi12b2lkIE9QX0Y4OTIwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfOCAoaW5zbildKTsKLX0KLQotLyogbW92YnUgZG0sIChkMTYsc3ApICovCi12b2lkIE9QX0ZBOTIwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZidSBkbSAoZDMyLHNwKSAqLwotdm9pZCBPUF9GQzkyMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmJ1IGRtLCAoZGksYW4pICovCi12b2lkIE9QX0Y0NDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXQotCSAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKTsKLX0KLQotLyogbW92YnUgZG0sIChhYnMxNikgKi8KLXZvaWQgT1BfMjAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2J5dGUgKChpbnNuICYgMHhmZmZmKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZidSBkbSwgKGFiczMyKSAqLwotdm9pZCBPUF9GQzgyMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfYnl0ZSAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZodSAoYW0pLCBkbiAqLwotdm9pZCBPUF9GMDYwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXQotICAgID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmh1IChkOCxhbSksIGRuICovCi12b2lkIE9QX0Y4NjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXQotICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXQotCQkgICsgU0VYVDggKGluc24gJiAweGZmKSkpOwotfQotCi0vKiBtb3ZodSAoZDE2LGFtKSwgZG4gKi8KLXZvaWQgT1BfRkE2MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildCi0gICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCQkgICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpOwotfQotCi0vKiBtb3ZodSAoZDMyLGFtKSwgZG4gKi8KLXZvaWQgT1BfRkM2MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildCi0gICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCQkgICsgKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLX0KLQotLyogbW92aHUgKGQ4LHNwKSBkbiAqLwotdm9pZCBPUF9GOEJDMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KLSAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZikpKTsKLX0KLQotLyogbW92aHUgKGQxNixzcCksIGRuICovCi12b2lkIE9QX0ZBQkMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmZmYpKSk7Ci19Ci0KLS8qIG1vdmh1IChkMzIsc3ApLCBkbiAqLwotdm9pZCBPUF9GQ0JDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIG1vdmh1IChkaSxhbSksIGRuICovCi12b2lkIE9QX0Y0ODAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0KLSAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCi0JCSAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSkpOwotfQotCi0vKiBtb3ZodSAoYWJzMTYpLCBkbiAqLwotdm9pZCBPUF8zODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gbG9hZF9oYWxmICgoaW5zbiAmIDB4ZmZmZikpOwotfQotCi0vKiBtb3ZodSAoYWJzMzIpLCBkbiAqLwotdm9pZCBPUF9GQ0FDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICA9IGxvYWRfaGFsZiAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci19Ci0KLS8qIG1vdmh1IGRtLCAoYW4pICovCi12b2lkIE9QX0YwNzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKLX0KLQotLyogbW92aHUgZG0sIChkOCxhbikgKi8KLXZvaWQgT1BfRjg3MDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZikpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0pOwotfQotCi0vKiBtb3ZodSBkbSwgKGQxNixhbikgKi8KLXZvaWQgT1BfRkE3MDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKLX0KLQotLyogbW92aHUgZG0sIChkMzIsYW4pICovCi12b2lkIE9QX0ZDNzAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkgICAgICAgKyAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCi0JICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOwotfQotCi0vKiBtb3ZodSBkbSwoZDgsc3ApICovCi12b2lkIE9QX0Y4OTMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfOCAoaW5zbildKTsKLX0KLQotLyogbW92aHUgZG0sKGQxNixzcCkgKi8KLXZvaWQgT1BfRkE5MzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZmZmKSwKLQkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmh1IGRtLChkMzIsc3ApICovCi12b2lkIE9QX0ZDOTMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKLX0KLQotLyogbW92aHUgZG0sIChkaSxhbikgKi8KLXZvaWQgT1BfRjRDMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCi0JICAgICAgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pLAotCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pOwotfQotCi0vKiBtb3ZodSBkbSwgKGFiczE2KSAqLwotdm9pZCBPUF8zMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgc3RvcmVfaGFsZiAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIG1vdmh1IGRtLCAoYWJzMzIpICovCi12b2lkIE9QX0ZDODMwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBzdG9yZV9oYWxmICgoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Ci19Ci0KLS8qIGV4dCBkbiAqLwotdm9pZCBPUF9GMkQwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpZiAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAtMTsKLSAgZWxzZQotICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAwOwotfQotCi0vKiBleHRiIGRuICovCi12b2lkIE9QXzEwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFNFWFQ4IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Ci19Ci0KLS8qIGV4dGJ1IGRuICovCi12b2lkIE9QXzE0IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmPSAweGZmOwotfQotCi0vKiBleHRoIGRuICovCi12b2lkIE9QXzE4IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotICAgID0gU0VYVDE2IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Ci19Ci0KLS8qIGV4dGh1IGRuICovCi12b2lkIE9QXzFDIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmPSAweGZmZmY7Ci19Ci0KLS8qIG1vdm0gKHNwKSwgcmVnX2xpc3QgKi8KLXZvaWQgT1BfQ0UwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIG1hc2sgPSBpbnNuICYgMHhmZjsKLQotICBpZiAobWFzayAmIDB4OCkKLSAgICB7Ci0gICAgICBzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgxMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDNdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MjApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSA9IGxvYWRfd29yZCAoc3ApOwotICAgICAgc3AgKz0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10gPSBsb2FkX3dvcmQgKHNwKTsKLSAgICAgIHNwICs9IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4MCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDJdID0gbG9hZF93b3JkIChzcCk7Ci0gICAgICBzcCArPSA0OwotICAgIH0KLQotICAvKiBBbmQgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlci4gICovCi0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOwotfQotCi0vKiBtb3ZtIHJlZ19saXN0LCAoc3ApICovCi12b2lkIE9QX0NGMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICBtYXNrID0gaW5zbiAmIDB4ZmY7Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg0MCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MjApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICB9Ci0KLSAgLyogQW5kIG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIuICAqLwotICBTdGF0ZS5yZWdzW1JFR19TUF0gPSBzcDsKLX0KLQotLyogY2xyIGRuICovCi12b2lkIE9QXzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildID0gMDsKLQotICBQU1cgfD0gUFNXX1o7Ci0gIFBTVyAmPSB+KFBTV19WIHwgUFNXX0MgfCBQU1dfTik7Ci19Ci0KLS8qIGFkZCBkbSxkbiAqLwotdm9pZCBPUF9FMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHZhbHVlID0gcmVnMSArIHJlZzI7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogYWRkIGRtLCBhbiAqLwotdm9pZCBPUF9GMTYwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKLSAgdmFsdWUgPSByZWcxICsgcmVnMjsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApID09IChyZWcxICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBhZGQgYW0sIGRuICovCi12b2lkIE9QX0YxNTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICB2YWx1ZSA9IHJlZzEgKyByZWcyOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGFkZCBhbSxhbiAqLwotdm9pZCBPUF9GMTcwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKLSAgdmFsdWUgPSByZWcxICsgcmVnMjsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApID09IChyZWcxICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBhZGQgaW1tOCwgZG4gKi8KLXZvaWQgT1BfMjgwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXTsKLSAgaW1tID0gU0VYVDggKGluc24gJiAweGZmKTsKLSAgdmFsdWUgPSByZWcxICsgaW1tOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW0xNiwgZG4gKi8KLXZvaWQgT1BfRkFDMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOwotICBpbW0gPSBTRVhUMTYgKGluc24gJiAweGZmZmYpOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW0zMixkbiAqLwotdm9pZCBPUF9GQ0MwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW04LCBhbiAqLwotdm9pZCBPUF8yMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildOwotICBpbW0gPSBTRVhUOCAoaW5zbiAmIDB4ZmYpOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogYWRkIGltbTE2LCBhbiAqLwotdm9pZCBPUF9GQUQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9IFNFWFQxNiAoaW5zbiAmIDB4ZmZmZik7Ci0gIHZhbHVlID0gcmVnMSArIGltbTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogYWRkIGltbTMyLCBhbiAqLwotdm9pZCBPUF9GQ0QwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGFkZCBpbW04LCBzcCAqLwotdm9pZCBPUF9GOEZFMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBpbW0gPSBTRVhUOCAoaW5zbiAmIDB4ZmYpOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHZhbHVlOwotfQotCi0vKiBhZGQgaW1tMTYsc3AgKi8KLXZvaWQgT1BfRkFGRTAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBpbW0gPSBTRVhUMTYgKGluc24gJiAweGZmZmYpOwotICB2YWx1ZSA9IHJlZzEgKyBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHZhbHVlOwotfQotCi0vKiBhZGQgaW1tMzIsIHNwICovCi12b2lkIE9QX0ZDRkUwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgaW1tID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb247Ci0gIHZhbHVlID0gcmVnMSArIGltbTsKLSAgU3RhdGUucmVnc1tSRUdfU1BdID0gdmFsdWU7Ci19Ci0KLS8qIGFkZGMgZG0sZG4gKi8KLXZvaWQgT1BfRjE0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHZhbHVlID0gcmVnMSArIHJlZzIgKyAoKFBTVyAmIFBTV19DKSAhPSAwKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApID09IChyZWcxICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBzdWIgZG0sIGRuICovCi12b2lkIE9QX0YxMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICB2YWx1ZSA9IHJlZzIgLSByZWcxOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChyZWcxID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogc3ViIGRtLCBhbiAqLwotdm9pZCBPUF9GMTIwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKLSAgdmFsdWUgPSByZWcyIC0gcmVnMTsKLSAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIHN1YiBhbSwgZG4gKi8KLXZvaWQgT1BfRjExMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHZhbHVlID0gcmVnMiAtIHJlZzE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBzdWIgYW0sIGFuICovCi12b2lkIE9QX0YxMzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildOwotICB2YWx1ZSA9IHJlZzIgLSByZWcxOwotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChyZWcxID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogc3ViIGltbTMyLCBkbiAqLwotdm9pZCBPUF9GQ0M0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB2YWx1ZSA9IHJlZzEgLSBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogc3ViIGltbTMyLCBhbiAqLwotdm9pZCBPUF9GQ0Q0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB2YWx1ZSA9IHJlZzEgLSBpbW07Ci0gIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogc3ViYyBkbSwgZG4gKi8KLXZvaWQgT1BfRjE4MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHZhbHVlID0gcmVnMiAtIHJlZzEgLSAoKFBTVyAmIFBTV19DKSAhPSAwKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIG11bCBkbSwgZG4gKi8KLXZvaWQgT1BfRjI0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG11bHUgZG0sIGRuICovCi12b2lkIE9QX0YyNTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCi0gICAgICAgICAgKiAodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiBkaXYgZG0sIGRuICovCi12b2lkIE9QX0YyNjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfTURSXTsKLSAgdGVtcCA8PD0gMzI7Ci0gIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSB0ZW1wICUgKGxvbmcpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHRlbXAgLz0gKGxvbmcpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogZGl2dSBkbSwgZG4gKi8KLXZvaWQgT1BfRjI3MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19NRFJdOwotICB0ZW1wIDw8PSAzMjsKLSAgdGVtcCB8PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgJSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgdGVtcCAvPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiBpbmMgZG4gKi8KLXZvaWQgT1BfNDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LG4sYyx2OwotICB1bnNpZ25lZCBpbnQgdmFsdWUsIGltbSwgcmVnMTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIGltbSA9IDE7Ci0gIHZhbHVlID0gcmVnMSArIGltbTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0gPSB2YWx1ZTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAodmFsdWUgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogaW5jIGFuICovCi12b2lkIE9QXzQxIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSArPSAxOwotfQotCi0vKiBpbmM0IGFuICovCi12b2lkIE9QXzUwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSArPSA0OwotfQotCi0vKiBjbXAgaW1tOCwgZG4gKi8KLXZvaWQgT1BfQTAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXTsKLSAgaW1tID0gU0VYVDggKGluc24gJiAweGZmKTsKLSAgdmFsdWUgPSByZWcxIC0gaW1tOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChyZWcxIDwgaW1tKTsKLSAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApICE9IChpbW0gJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGNtcCBkbSwgZG4gKi8KLXZvaWQgT1BfQTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICB2YWx1ZSA9IHJlZzIgLSByZWcxOwotCi0gIHogPSAodmFsdWUgPT0gMCk7Ci0gIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKLSAgYyA9IChyZWcxID4gcmVnMik7Ci0gIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogY21wIGRtLCBhbiAqLwotdm9pZCBPUF9GMUEwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKLSAgdmFsdWUgPSByZWcyIC0gcmVnMTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGNtcCBhbSwgZG4gKi8KLXZvaWQgT1BfRjE5MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOwotICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIHZhbHVlID0gcmVnMiAtIHJlZzE7Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPiByZWcyKTsKLSAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBjbXAgaW1tOCwgYW4gKi8KLXZvaWQgT1BfQjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXTsKLSAgaW1tID0gaW5zbiAmIDB4ZmY7Ci0gIHZhbHVlID0gcmVnMSAtIGltbTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBjbXAgYW0sIGFuICovCi12b2lkIE9QX0IwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Ci0gIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKLSAgdmFsdWUgPSByZWcyIC0gcmVnMTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA+IHJlZzIpOwotICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQotICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCi0JICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Ci19Ci0KLS8qIGNtcCBpbW0xNiwgZG4gKi8KLXZvaWQgT1BfRkFDODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBjLCBuLCB2OwotICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7Ci0KLSAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOwotICBpbW0gPSBTRVhUMTYgKGluc24gJiAweGZmZmYpOwotICB2YWx1ZSA9IHJlZzEgLSBpbW07Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogY21wIGltbTMyLCBkbiAqLwotdm9pZCBPUF9GQ0M4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB2YWx1ZSA9IHJlZzEgLSBpbW07Ci0KLSAgeiA9ICh2YWx1ZSA9PSAwKTsKLSAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOwotICBjID0gKHJlZzEgPCBpbW0pOwotICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCi0gICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7Ci0KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKLQkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKLX0KLQotLyogY21wIGltbTE2LCBhbiAqLwotdm9pZCBPUF9GQUQ4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHosIGMsIG4sIHY7Ci0gIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKLQotICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIGltbSA9IGluc24gJiAweGZmZmY7Ci0gIHZhbHVlID0gcmVnMSAtIGltbTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBjbXAgaW1tMzIsIGFuICovCi12b2lkIE9QX0ZDRDgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgYywgbiwgdjsKLSAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOwotCi0gIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXTsKLSAgaW1tID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb247Ci0gIHZhbHVlID0gcmVnMSAtIGltbTsKLQotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7Ci0gIGMgPSAocmVnMSA8IGltbSk7Ci0gIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDAwMCkKLSAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQotCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOwotfQotCi0vKiBhbmQgZG0sIGRuICovCi12b2lkIE9QX0YyMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIGFuZCBpbW04LCBkbiAqLwotdm9pZCBPUF9GOEUwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJj0gKGluc24gJiAweGZmKTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogYW5kIGltbTE2LCBkbiAqLwotdm9pZCBPUF9GQUUwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0KLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJj0gKGluc24gJiAweGZmZmYpOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIGFuZCBpbW0zMiwgZG4gKi8KLXZvaWQgT1BfRkNFMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgJj0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb247Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogYW5kIGltbTE2LCBwc3cgKi8KLXZvaWQgT1BfRkFGQzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFBTVyAmPSAoaW5zbiAmIDB4ZmZmZik7Ci19Ci0KLS8qIG9yIGRtLCBkbiovCi12b2lkIE9QX0YyMTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG9yIGltbTgsIGRuICovCi12b2lkIE9QX0Y4RTQwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0KLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSB8PSBpbnNuICYgMHhmZjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogb3IgaW1tMTYsIGRuKi8KLXZvaWQgT1BfRkFFNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildIHw9IGluc24gJiAweGZmZmY7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogb3IgaW1tMzIsIGRuICovCi12b2lkIE9QX0ZDRTQwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLQotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQotICAgIHw9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG9yIGltbTE2LHBzdyAqLwotdm9pZCBPUF9GQUZEMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgUFNXIHw9IChpbnNuICYgMHhmZmZmKTsKLX0KLQotLyogeG9yIGRtLCBkbiAqLwotdm9pZCBPUF9GMjIwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLQotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSBePSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiB4b3IgaW1tMTYsIGRuICovCi12b2lkIE9QX0ZBRTgwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLQotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSBePSBpbnNuICYgMHhmZmZmOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIHhvciBpbW0zMiwgZG4gKi8KLXZvaWQgT1BfRkNFODAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgXj0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb247Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogbm90IGRuICovCi12b2lkIE9QX0YyMzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gflN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIGJ0c3QgaW1tOCwgZG4gKi8KLXZvaWQgT1BfRjhFQzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6LCBuOwotCi0gIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildOwotICB0ZW1wICY9IChpbnNuICYgMHhmZik7Ci0gIG4gPSAodGVtcCAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOwotfQotCi0vKiBidHN0IGltbTE2LCBkbiAqLwotdm9pZCBPUF9GQUVDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICBpbnQgeiwgbjsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV07Ci0gIHRlbXAgJj0gKGluc24gJiAweGZmZmYpOwotICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOwotICB6ID0gKHRlbXAgPT0gMCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKLX0KLQotLyogYnRzdCBpbW0zMiwgZG4gKi8KLXZvaWQgT1BfRkNFQzAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IHosIG47Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOwotICB0ZW1wICY9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOwotICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOwotICB6ID0gKHRlbXAgPT0gMCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKLX0KLQotLyogYnRzdCBpbW04LChhYnMzMikgKi8KLXZvaWQgT1BfRkUwMjAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgdGVtcCA9IGxvYWRfYnl0ZSAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uID4+IDgpKTsKLSAgdGVtcCAmPSAoZXh0ZW5zaW9uICYgMHhmZik7Ci0gIG4gPSAodGVtcCAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOwotfQotCi0vKiBidHN0IGltbTgsKGQ4LGFuKSAqLwotdm9pZCBPUF9GQUY4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICAgICAgICAgICAgICAgICAgICsgU0VYVDggKChpbnNuICYgMHhmZjAwKSA+PiA4KSkpOwotICB0ZW1wICY9IChpbnNuICYgMHhmZik7Ci0gIG4gPSAodGVtcCAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIHogPSAodGVtcCA9PSAwKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOwotfQotCi0vKiBic2V0IGRtLCAoYW4pICovCi12b2lkIE9QX0YwODAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IHo7Ci0KLSAgdGVtcCA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOwotICB6ID0gKHRlbXAgJiBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSkgPT0gMDsKLSAgdGVtcCB8PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0sIHRlbXApOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Ci19Ci0KLS8qIGJzZXQgaW1tOCwgKGFiczMyKSAqLwotdm9pZCBPUF9GRTAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICBpbnQgejsKLQotICB0ZW1wID0gbG9hZF9ieXRlICgoKGluc24gJiAweGZmZmYpIDw8IDE2IHwgKGV4dGVuc2lvbiA+PiA4KSkpOwotICB6ID0gKHRlbXAgJiAoZXh0ZW5zaW9uICYgMHhmZikpID09IDA7Ci0gIHRlbXAgfD0gKGV4dGVuc2lvbiAmIDB4ZmYpOwotICBzdG9yZV9ieXRlICgoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uID4+IDgpKSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotLyogYnNldCBpbW04LChkOCxhbikgKi8KLXZvaWQgT1BfRkFGMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLSAgaW50IHo7Ci0KLSAgdGVtcCA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCi0gICAgICAgICAgICAgICAgICAgICArIFNFWFQ4ICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkpKTsKLSAgeiA9ICh0ZW1wICYgKGluc24gJiAweGZmKSkgPT0gMDsKLSAgdGVtcCB8PSAoaW5zbiAmIDB4ZmYpOwotICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KLQkgICAgICAgKyBTRVhUOCAoKGluc24gJiAweGZmMDApID4+IDgpKSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotLyogYmNsciBkbSwgKGFuKSAqLwotdm9pZCBPUF9GMDkwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6OwotCi0gIHRlbXAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKLSAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pID09IDA7Ci0gIHRlbXAgPSB0ZW1wICYgflN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSwgdGVtcCk7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKLX0KLQotLyogYmNsciBpbW04LCAoYWJzMzIpICovCi12b2lkIE9QX0ZFMDEwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6OwotCi0gIHRlbXAgPSBsb2FkX2J5dGUgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiA+PiA4KSk7Ci0gIHogPSAodGVtcCAmIChleHRlbnNpb24gJiAweGZmKSkgPT0gMDsKLSAgdGVtcCA9IHRlbXAgJiB+KGV4dGVuc2lvbiAmIDB4ZmYpOwotICBzdG9yZV9ieXRlICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSB8IChleHRlbnNpb24gPj4gOCksIHRlbXApOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Ci19Ci0KLS8qIGJjbHIgaW1tOCwoZDgsYW4pICovCi12b2lkIE9QX0ZBRjQwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCB6OwotCi0gIHRlbXAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotICAgICAgICAgICAgICAgICAgICAgKyBTRVhUOCAoKGluc24gJiAweGZmMDApID4+IDgpKSk7Ci0gIHogPSAodGVtcCAmIChpbnNuICYgMHhmZikpID09IDA7Ci0gIHRlbXAgPSB0ZW1wICYgfihpbnNuICYgMHhmZik7Ci0gIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQotCSAgICAgICArIFNFWFQ4ICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkpLCB0ZW1wKTsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOwotfQotCi0vKiBhc3IgZG0sIGRuICovCi12b2lkIE9QX0YyQjAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGxvbmcgdGVtcDsKLSAgaW50IHosIG4sIGM7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOwotICBjID0gdGVtcCAmIDE7Ci0gIHRlbXAgPj49IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8qIGFzciBpbW04LCBkbiAqLwotdm9pZCBPUF9GOEM4MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGxvbmcgdGVtcDsKLSAgaW50IHosIG4sIGM7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV07Ci0gIGMgPSB0ZW1wICYgMTsKLSAgdGVtcCA+Pj0gKGluc24gJiAweGZmKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IHRlbXA7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0vKiBsc3IgZG0sIGRuICovCi12b2lkIE9QX0YyQTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCB6LCBuLCBjOwotCi0gIGMgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCi0gICAgPj49IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOwotfQotCi0vKiBsc3IgaW1tOCwgZG4gKi8KLXZvaWQgT1BfRjhDNDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgbiwgYzsKLQotICBjID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDE7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPj49ICAoaW5zbiAmIDB4ZmYpOwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKLX0KLQotLyogYXNsIGRtLCBkbiAqLwotdm9pZCBPUF9GMjkwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgbiwgejsKLQotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotICAgIDw8PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04pOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIGFzbCBpbW04LCBkbiAqLwotdm9pZCBPUF9GOEMwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIGludCBuLCB6OwotCi0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPDw9IChpbnNuICYgMHhmZik7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogYXNsMiBkbiAqLwotdm9pZCBPUF81NCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IG4sIHo7Ci0KLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPDw9IDI7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiByb3IgZG4gKi8KLXZvaWQgT1BfRjI4NCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgaW50IGMsbix6OwotCi0gIHZhbHVlID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Ci0gIGMgPSAodmFsdWUgJiAweDEpOwotCi0gIHZhbHVlID4+PSAxOwotICB2YWx1ZSB8PSAoKFBTVyAmIFBTV19DKSAhPSAwKSA/IDB4ODAwMDAwMDAgOiAwOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8qIHJvbCBkbiAqLwotdm9pZCBPUF9GMjgwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBpbnQgYyxuLHo7Ci0KLSAgdmFsdWUgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKLSAgYyA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApID8gMSA6IDA7Ci0KLSAgdmFsdWUgPDw9IDE7Ci0gIHZhbHVlIHw9ICgoUFNXICYgUFNXX0MpICE9IDApOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOwotICB6ID0gKHZhbHVlID09IDApOwotICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Ci19Ci0KLS8qIGJlcSBsYWJlbDo4ICovCi12b2lkIE9QX0M4MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfWikKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Ci19Ci0KLS8qIGJuZSBsYWJlbDo4ICovCi12b2lkIE9QX0M5MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKFBTVyAmIFBTV19aKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Ci19Ci0KLS8qIGJndCBsYWJlbDo4ICovCi12b2lkIE9QX0MxMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKChQU1cgJiBQU1dfWikKLSAgICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Ci19Ci0KLS8qIGJnZSBsYWJlbDo4ICovCi12b2lkIE9QX0MyMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKLX0KLQotLyogYmxlIGxhYmVsOjggKi8KLXZvaWQgT1BfQzMwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKChQU1cgJiBQU1dfWikKLSAgICAgICB8fCAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOwotfQotCi0vKiBibHQgbGFiZWw6OCAqLwotdm9pZCBPUF9DMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Ci19Ci0KLS8qIGJoaSBsYWJlbDo4ICovCi12b2lkIE9QX0M1MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOwotfQotCi0vKiBiY2MgbGFiZWw6OCAqLwotdm9pZCBPUF9DNjAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoIShQU1cgJiBQU1dfQykpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOwotfQotCi0vKiBibHMgbGFiZWw6OCAqLwotdm9pZCBPUF9DNzAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKLX0KLQotLyogYmNzIGxhYmVsOjggKi8KLXZvaWQgT1BfQzQwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKFBTVyAmIFBTV19DKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKLX0KLQotLyogYnZjIGxhYmVsOjggKi8KLXZvaWQgT1BfRjhFODAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoIShQU1cgJiBQU1dfVikpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAzOwotfQotCi0vKiBidnMgbGFiZWw6OCAqLwotdm9pZCBPUF9GOEU5MDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmIChQU1cgJiBQU1dfVikKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDM7Ci19Ci0KLS8qIGJuYyBsYWJlbDo4ICovCi12b2lkIE9QX0Y4RUEwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoUFNXICYgUFNXX04pKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMzsKLX0KLQotLyogYm5zIGxhYmVsOjggKi8KLXZvaWQgT1BfRjhFQjAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoUFNXICYgUFNXX04pCi0gICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAzOwotfQotCi0vKiBicmEgbGFiZWw6OCAqLwotdm9pZCBPUF9DQTAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Ci19Ci0KLS8qIGxlcSAqLwotdm9pZCBPUF9EOCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKFBTVyAmIFBTV19aKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKLX0KLQotLyogbG5lICovCi12b2lkIE9QX0Q5IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoIShQU1cgJiBQU1dfWikpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOwotfQotCi0vKiBsZ3QgKi8KLXZvaWQgT1BfRDEgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICghKChQU1cgJiBQU1dfWikKLSAgICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Ci19Ci0KLS8qIGxnZSAqLwotdm9pZCBPUF9EMiAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOwotfQotCi0vKiBsbGUgKi8KLXZvaWQgT1BfRDMgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbwotICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCi0gIGlmICgoUFNXICYgUFNXX1opCi0gICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKLX0KLQotLyogbGx0ICovCi12b2lkIE9QX0QwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Ci19Ci0KLS8qIGxoaSAqLwotdm9pZCBPUF9ENSAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKSkKLSAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Ci19Ci0KLS8qIGxjYyAqLwotdm9pZCBPUF9ENiAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCi0gICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KLSAgaWYgKCEoUFNXICYgUFNXX0MpKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKLX0KLQotLyogbGxzICovCi12b2lkIE9QX0Q3IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKQotICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKLX0KLQotLyogbGNzICovCi12b2lkIE9QX0Q0IChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KLSAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLwotICBpZiAoUFNXICYgUFNXX0MpCi0gICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOwotfQotCi0vKiBscmEgKi8KLXZvaWQgT1BfREEgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKLX0KLQotLyogc2V0bGIgKi8KLXZvaWQgT1BfREIgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX21lbV9iaWcgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIDEsIDQpOwotICBTdGF0ZS5yZWdzW1JFR19MQVJdID0gU3RhdGUucmVnc1tSRUdfUENdICsgNTsKLX0KLQotLyogam1wIChhbikgKi8KLXZvaWQgT1BfRjBGNCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gLSAyOwotfQotCi0vKiBqbXAgbGFiZWw6MTYgKi8KLXZvaWQgT1BfQ0MwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDE2IChpbnNuICYgMHhmZmZmKSAtIDM7Ci19Ci0KLS8qIGptcCBsYWJlbDozMiAqLwotdm9pZCBPUF9EQzAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfUENdICs9ICgoKGluc24gJiAweGZmZmZmZikgPDwgOCkgKyBleHRlbnNpb24pIC0gNTsKLX0KLQotLyogY2FsbCBsYWJlbDoxNixyZWdfbGlzdCxpbW04ICovCi12b2lkIE9QX0NEMDAwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDU7Ci0gIFN0YXRlLm1lbVtzcF0gPSBuZXh0X3BjICYgMHhmZjsKLSAgU3RhdGUubWVtW3NwKzFdID0gKG5leHRfcGMgJiAweGZmMDApID4+IDg7Ci0gIFN0YXRlLm1lbVtzcCsyXSA9IChuZXh0X3BjICYgMHhmZjAwMDApID4+IDE2OwotICBTdGF0ZS5tZW1bc3ArM10gPSAobmV4dF9wYyAmIDB4ZmYwMDAwMDApID4+IDI0OwotCi0gIG1hc2sgPSBpbnNuICYgMHhmZjsKLQotICBpZiAobWFzayAmIDB4ODApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDJdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MTApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDNdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgpCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMF0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDFdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTBdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX01EUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19MSVJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTEFSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIsIG5vdGUgdGhhdCB0aGUgcmVnaXN0ZXIgc2F2ZXMgdG8gZG8gbm90Ci0gICAgIG1vZGlmeSBTUC4gIFRoZSBTUCBhZGp1c3RtZW50IGlzIGRlcml2ZWQgdG90YWxseSBmcm9tIHRoZSBpbW04Ci0gICAgIGZpZWxkLiAgKi8KLSAgU3RhdGUucmVnc1tSRUdfU1BdIC09IGV4dGVuc2lvbjsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUMTYgKChpbnNuICYgMHhmZmZmMDApID4+IDgpIC0gNTsKLX0KLQotLyogY2FsbCBsYWJlbDozMixyZWdfbGlzdCxpbW04Ki8KLXZvaWQgT1BfREQwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGludCBuZXh0X3BjLCBzcCwgYWRqdXN0OwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA3OwotICBTdGF0ZS5tZW1bc3BdID0gbmV4dF9wYyAmIDB4ZmY7Ci0gIFN0YXRlLm1lbVtzcCsxXSA9IChuZXh0X3BjICYgMHhmZjAwKSA+PiA4OwotICBTdGF0ZS5tZW1bc3ArMl0gPSAobmV4dF9wYyAmIDB4ZmYwMDAwKSA+PiAxNjsKLSAgU3RhdGUubWVtW3NwKzNdID0gKG5leHRfcGMgJiAweGZmMDAwMDAwKSA+PiAyNDsKLQotICBtYXNrID0gKGV4dGVuc2lvbiAmIDB4ZmYwMCkgPj4gODsKLQotICBpZiAobWFzayAmIDB4ODApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDJdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDQwKQotICAgIHsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSk7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0pOwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MTApCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDNdKTsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDgpCi0gICAgewotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMF0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDFdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTBdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSk7Ci0gICAgICBzcCAtPSA0OwotICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX01EUl0pOwotICAgICAgc3AgLT0gNDsKLSAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19MSVJdKTsKLSAgICAgIHNwIC09IDQ7Ci0gICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTEFSXSk7Ci0gICAgICBzcCAtPSA0OwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIsIG5vdGUgdGhhdCB0aGUgcmVnaXN0ZXIgc2F2ZXMgdG8gZG8gbm90Ci0gICAgIG1vZGlmeSBTUC4gIFRoZSBTUCBhZGp1c3RtZW50IGlzIGRlcml2ZWQgdG90YWxseSBmcm9tIHRoZSBpbW04Ci0gICAgIGZpZWxkLiAgKi8KLSAgU3RhdGUucmVnc1tSRUdfU1BdIC09IChleHRlbnNpb24gJiAweGZmKTsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSAoKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpIHwgKChleHRlbnNpb24gJiAweGZmMDAwMCkgPj4gMTYpKSAtIDc7Ci19Ci0KLS8qIGNhbGxzIChhbikgKi8KLXZvaWQgT1BfRjBGMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgaW50IG5leHRfcGMsIHNwOwotCi0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKLSAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOwotICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKLSAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7Ci0gIFN0YXRlLm1lbVtzcCszXSA9IChuZXh0X3BjICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOwotICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSAtIDI7Ci19Ci0KLS8qIGNhbGxzIGxhYmVsOjE2ICovCi12b2lkIE9QX0ZBRkYwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA0OwotICBTdGF0ZS5tZW1bc3BdID0gbmV4dF9wYyAmIDB4ZmY7Ci0gIFN0YXRlLm1lbVtzcCsxXSA9IChuZXh0X3BjICYgMHhmZjAwKSA+PiA4OwotICBTdGF0ZS5tZW1bc3ArMl0gPSAobmV4dF9wYyAmIDB4ZmYwMDAwKSA+PiAxNjsKLSAgU3RhdGUubWVtW3NwKzNdID0gKG5leHRfcGMgJiAweGZmMDAwMDAwKSA+PiAyNDsKLSAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUMTYgKGluc24gJiAweGZmZmYpIC0gNDsKLX0KLQotLyogY2FsbHMgbGFiZWw6MzIgKi8KLXZvaWQgT1BfRkNGRjAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGludCBuZXh0X3BjLCBzcDsKLQotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDY7Ci0gIFN0YXRlLm1lbVtzcF0gPSBuZXh0X3BjICYgMHhmZjsKLSAgU3RhdGUubWVtW3NwKzFdID0gKG5leHRfcGMgJiAweGZmMDApID4+IDg7Ci0gIFN0YXRlLm1lbVtzcCsyXSA9IChuZXh0X3BjICYgMHhmZjAwMDApID4+IDE2OwotICBTdGF0ZS5tZW1bc3ArM10gPSAobmV4dF9wYyAmIDB4ZmYwMDAwMDApID4+IDI0OwotICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKLSAgU3RhdGUucmVnc1tSRUdfUENdICs9ICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikgLSA2OwotfQotCi0vKiByZXQgcmVnX2xpc3QsIGltbTggKi8KLXZvaWQgT1BfREYwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgc3AsIG9mZnNldDsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSBpbnNuICYgMHhmZjsKLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0KLSAgb2Zmc2V0ID0gLTQ7Ci0gIG1hc2sgPSAoaW5zbiAmIDB4ZmYwMCkgPj4gODsKLQotICBpZiAobWFzayAmIDB4ODApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg0MCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDNdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDIwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4MTApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHg4KQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDFdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDFdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTElSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19MQVJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSB0aGUgUEMgdmFsdWUuICAqLwotICBTdGF0ZS5yZWdzW1JFR19QQ10gPSAoU3RhdGUubWVtW3NwXSB8IChTdGF0ZS5tZW1bc3ArMV0gPDwgOCkKLQkgICAgICB8IChTdGF0ZS5tZW1bc3ArMl0gPDwgMTYpIHwgKFN0YXRlLm1lbVtzcCszXSA8PCAyNCkpOwotICBTdGF0ZS5yZWdzW1JFR19QQ10gLT0gMzsKLX0KLQotLyogcmV0ZiByZWdfbGlzdCxpbW04ICovCi12b2lkIE9QX0RFMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgaW50IHNwLCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICBTdGF0ZS5yZWdzW1JFR19TUF0gKz0gKGluc24gJiAweGZmKTsKLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX01EUl0gLSAzOwotCi0gIG9mZnNldCA9IC00OwotICBtYXNrID0gKGluc24gJiAweGZmMDApID4+IDg7Ci0KLSAgaWYgKG1hc2sgJiAweDgwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4NDApCi0gICAgewotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotCi0gIGlmIChtYXNrICYgMHgyMCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICB9Ci0KLSAgaWYgKG1hc2sgJiAweDEwKQotICAgIHsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgIH0KLQotICBpZiAobWFzayAmIDB4OCkKLSAgICB7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7Ci0gICAgICBvZmZzZXQgLT0gNDsKLSAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKLSAgICAgIG9mZnNldCAtPSA0OwotICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOwotICAgICAgb2Zmc2V0IC09IDQ7Ci0gICAgfQotfQotCi0vKiByZXRzICovCi12b2lkIE9QX0YwRkMgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGludCBzcDsKLQotICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKLSAgU3RhdGUucmVnc1tSRUdfUENdID0gKFN0YXRlLm1lbVtzcF0gfCAoU3RhdGUubWVtW3NwKzFdIDw8IDgpCi0JICAgICAgfCAoU3RhdGUubWVtW3NwKzJdIDw8IDE2KSB8IChTdGF0ZS5tZW1bc3ArM10gPDwgMjQpKTsKLSAgU3RhdGUucmVnc1tSRUdfUENdIC09IDI7Ci19Ci0KLS8qIHJ0aSAqLwotdm9pZCBPUF9GMEZEIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBpbnQgc3AsIG5leHRfcGM7Ci0KLSAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07Ci0gIFBTVyA9IFN0YXRlLm1lbVtzcF0gfCAoU3RhdGUubWVtW3NwICsgMV0gPDwgOCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IChTdGF0ZS5tZW1bc3ArNF0gfCAoU3RhdGUubWVtW3NwKzVdIDw8IDgpCi0JICAgICAgfCAoU3RhdGUubWVtW3NwKzZdIDw8IDE2KSB8IChTdGF0ZS5tZW1bc3ArN10gPDwgMjQpKTsKLSAgU3RhdGUucmVnc1tSRUdfU1BdICs9IDg7Ci19Ci0KLS8qIHRyYXAgKi8KLXZvaWQgT1BfRjBGRSAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgaW50IHNwLCBuZXh0X3BjOwotCi0gIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOwotICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKLSAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOwotICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKLSAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7Ci0gIFN0YXRlLm1lbVtzcCszXSA9IChuZXh0X3BjICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0gIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IDB4NDAwMDAwMTAgLSAyOwotfQotCi0vKiBzeXNjYWxsICovCi12b2lkIE9QX0YwQzAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIC8qIFdlIHVzZSB0aGlzIGZvciBzaW11bGF0ZWQgc3lzdGVtIGNhbGxzOyB3ZSBtYXkgbmVlZCB0byBjaGFuZ2UKLSAgICAgaXQgdG8gYSByZXNlcnZlZCBpbnN0cnVjdGlvbiBpZiB3ZSBjb25mbGljdCB3aXRoIHVzZXMgYXQKLSAgICAgTWF0c3VzaGl0YS4gICovCi0gIGludCBzYXZlX2Vycm5vID0gZXJybm87CQotICBlcnJubyA9IDA7Ci0KLS8qIFJlZ2lzdGVycyBwYXNzZWQgdG8gdHJhcCAwICovCi0KLS8qIEZ1bmN0aW9uIG51bWJlci4gICovCi0jZGVmaW5lIEZVTkMgICAoU3RhdGUucmVnc1swXSkKLQotLyogUGFyYW1ldGVycy4gICovCi0jZGVmaW5lIFBBUk0xICAgKFN0YXRlLnJlZ3NbMV0pCi0jZGVmaW5lIFBBUk0yICAgKGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgMTIpKQotI2RlZmluZSBQQVJNMyAgIChsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIDE2KSkKLQotLyogUmVnaXN0ZXJzIHNldCBieSB0cmFwIDAgKi8KLQotI2RlZmluZSBSRVRWQUwgU3RhdGUucmVnc1swXQkvKiByZXR1cm4gdmFsdWUgKi8KLSNkZWZpbmUgUkVURVJSIFN0YXRlLnJlZ3NbMV0JLyogcmV0dXJuIGVycm9yIGNvZGUgKi8KLQotLyogVHVybiBhIHBvaW50ZXIgaW4gYSByZWdpc3RlciBpbnRvIGEgcG9pbnRlciBpbnRvIHJlYWwgbWVtb3J5LiAqLwotCi0jZGVmaW5lIE1FTVBUUih4KSAoU3RhdGUubWVtICsgeCkKLQotICBzd2l0Y2ggKEZVTkMpCi0gICAgewotI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0jaWZkZWYgVEFSR0VUX1NZU19mb3JrCi0gICAgICBjYXNlIFRBUkdFVF9TWVNfZm9yazoKLSAgICAgIFJFVFZBTCA9IGZvcmsgKCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3ZlCi0gICAgY2FzZSBUQVJHRVRfU1lTX2V4ZWN2ZToKLSAgICAgIFJFVFZBTCA9IGV4ZWN2ZSAoTUVNUFRSIChQQVJNMSksIChjaGFyICoqKSBNRU1QVFIgKFBBUk0yKSwKLQkJICAgICAgIChjaGFyICoqKU1FTVBUUiAoUEFSTTMpKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX1NZU19leGVjdgotICAgIGNhc2UgVEFSR0VUX1NZU19leGVjdjoKLSAgICAgIFJFVFZBTCA9IGV4ZWN2ZSAoTUVNUFRSIChQQVJNMSksIChjaGFyICoqKSBNRU1QVFIgKFBBUk0yKSwgTlVMTCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2VuZGlmCS8qICEgR08zMiBhbmQgISBXSU4zMiAqLwotCi0gICAgY2FzZSBUQVJHRVRfU1lTX3JlYWQ6Ci0gICAgICBSRVRWQUwgPSBtbjEwMzAwX2NhbGxiYWNrLT5yZWFkIChtbjEwMzAwX2NhbGxiYWNrLCBQQVJNMSwKLQkJCQkgICAgTUVNUFRSIChQQVJNMiksIFBBUk0zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFSR0VUX1NZU193cml0ZToKLSAgICAgIFJFVFZBTCA9IChpbnQpbW4xMDMwMF9jYWxsYmFjay0+d3JpdGUgKG1uMTAzMDBfY2FsbGJhY2ssIFBBUk0xLAotCQkJCQkgICAgIE1FTVBUUiAoUEFSTTIpLCBQQVJNMyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBUkdFVF9TWVNfbHNlZWs6Ci0gICAgICBSRVRWQUwgPSBtbjEwMzAwX2NhbGxiYWNrLT5sc2VlayAobW4xMDMwMF9jYWxsYmFjaywgUEFSTTEsIFBBUk0yLCBQQVJNMyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBUkdFVF9TWVNfY2xvc2U6Ci0gICAgICBSRVRWQUwgPSBtbjEwMzAwX2NhbGxiYWNrLT5jbG9zZSAobW4xMDMwMF9jYWxsYmFjaywgUEFSTTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQVJHRVRfU1lTX29wZW46Ci0gICAgICBSRVRWQUwgPSBtbjEwMzAwX2NhbGxiYWNrLT5vcGVuIChtbjEwMzAwX2NhbGxiYWNrLCBNRU1QVFIgKFBBUk0xKSwgUEFSTTIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2V4aXQ6Ci0gICAgICAvKiBFWElUIC0gY2FsbGVyIGNhbiBsb29rIGluIFBBUk0xIHRvIHdvcmsgb3V0IHRoZSAKLQkgcmVhc29uICovCi0gICAgICBpZiAoUEFSTTEgPT0gMHhkZWFkKQotCVN0YXRlLmV4Y2VwdGlvbiA9IFNJR0FCUlQ7Ci0gICAgICBlbHNlCi0JU3RhdGUuZXhjZXB0aW9uID0gU0lHUVVJVDsKLSAgICAgIFN0YXRlLmV4aXRlZCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVEFSR0VUX1NZU19zdGF0OgkvKiBhZGRlZCBhdCBobXNpICovCi0gICAgICAvKiBzdGF0IHN5c3RlbSBjYWxsICovCi0gICAgICB7Ci0Jc3RydWN0IHN0YXQgaG9zdF9zdGF0OwotCXJlZ190IGJ1ZjsKLQotCVJFVFZBTCA9IHN0YXQgKE1FTVBUUiAoUEFSTTEpLCAmaG9zdF9zdGF0KTsKLQkKLQlidWYgPSBQQVJNMjsKLQotCS8qIEp1c3Qgd2lsZC1hc3NlZCBndWVzc2VzLiAgKi8KLQlzdG9yZV9oYWxmIChidWYsIGhvc3Rfc3RhdC5zdF9kZXYpOwotCXN0b3JlX2hhbGYgKGJ1ZiArIDIsIGhvc3Rfc3RhdC5zdF9pbm8pOwotCXN0b3JlX3dvcmQgKGJ1ZiArIDQsIGhvc3Rfc3RhdC5zdF9tb2RlKTsKLQlzdG9yZV9oYWxmIChidWYgKyA4LCBob3N0X3N0YXQuc3RfbmxpbmspOwotCXN0b3JlX2hhbGYgKGJ1ZiArIDEwLCBob3N0X3N0YXQuc3RfdWlkKTsKLQlzdG9yZV9oYWxmIChidWYgKyAxMiwgaG9zdF9zdGF0LnN0X2dpZCk7Ci0Jc3RvcmVfaGFsZiAoYnVmICsgMTQsIGhvc3Rfc3RhdC5zdF9yZGV2KTsKLQlzdG9yZV93b3JkIChidWYgKyAxNiwgaG9zdF9zdGF0LnN0X3NpemUpOwotCXN0b3JlX3dvcmQgKGJ1ZiArIDIwLCBob3N0X3N0YXQuc3RfYXRpbWUpOwotCXN0b3JlX3dvcmQgKGJ1ZiArIDI4LCBob3N0X3N0YXQuc3RfbXRpbWUpOwotCXN0b3JlX3dvcmQgKGJ1ZiArIDM2LCBob3N0X3N0YXQuc3RfY3RpbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBUQVJHRVRfU1lTX2Nob3duCi0gICAgY2FzZSBUQVJHRVRfU1lTX2Nob3duOgotICAgICAgUkVUVkFMID0gY2hvd24gKE1FTVBUUiAoUEFSTTEpLCBQQVJNMiwgUEFSTTMpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIFRBUkdFVF9TWVNfY2htb2Q6Ci0gICAgICBSRVRWQUwgPSBjaG1vZCAoTUVNUFRSIChQQVJNMSksIFBBUk0yKTsKLSAgICAgIGJyZWFrOwotI2lmZGVmIFRBUkdFVF9TWVNfdGltZQotICAgIGNhc2UgVEFSR0VUX1NZU190aW1lOgotICAgICAgUkVUVkFMID0gdGltZSAoKHZvaWQqKSBNRU1QVFIgKFBBUk0xKSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfdGltZXMKLSAgICBjYXNlIFRBUkdFVF9TWVNfdGltZXM6Ci0gICAgICB7Ci0Jc3RydWN0IHRtcyB0bXM7Ci0JUkVUVkFMID0gdGltZXMgKCZ0bXMpOwotCXN0b3JlX3dvcmQgKFBBUk0xLCB0bXMudG1zX3V0aW1lKTsKLQlzdG9yZV93b3JkIChQQVJNMSArIDQsIHRtcy50bXNfc3RpbWUpOwotCXN0b3JlX3dvcmQgKFBBUk0xICsgOCwgdG1zLnRtc19jdXRpbWUpOwotCXN0b3JlX3dvcmQgKFBBUk0xICsgMTIsIHRtcy50bXNfY3N0aW1lKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5Ci0gICAgY2FzZSBUQVJHRVRfU1lTX2dldHRpbWVvZmRheToKLSAgICAgIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCXN0cnVjdCB0aW1lem9uZSB0ejsKLQlSRVRWQUwgPSBnZXR0aW1lb2ZkYXkgKCZ0LCAmdHopOwotCXN0b3JlX3dvcmQgKFBBUk0xLCB0LnR2X3NlYyk7Ci0Jc3RvcmVfd29yZCAoUEFSTTEgKyA0LCB0LnR2X3VzZWMpOwotCXN0b3JlX3dvcmQgKFBBUk0yLCB0ei50el9taW51dGVzd2VzdCk7Ci0Jc3RvcmVfd29yZCAoUEFSTTIgKyA0LCB0ei50el9kc3R0aW1lKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9TWVNfdXRpbWUKLSAgICBjYXNlIFRBUkdFVF9TWVNfdXRpbWU6Ci0gICAgICAvKiBDYXN0IHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdm9pZCAqLCB0byBhdm9pZCB0eXBlIG1pc21hdGNoCi0JIGlmIGEgcHJvdG90eXBlIGlzIHByZXNlbnQuICAqLwotICAgICAgUkVUVkFMID0gdXRpbWUgKE1FTVBUUiAoUEFSTTEpLCAodm9pZCAqKSBNRU1QVFIgKFBBUk0yKSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIFJFVEVSUiA9IGVycm5vOwotICBlcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KLS8qIHJ0bSAqLwotdm9pZCBPUF9GMEZGIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotIGFib3J0ICgpOwotfQotCi0vKiBub3AgKi8KLXZvaWQgT1BfQ0IgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci19Ci0KLS8qIHB1dHggZG0sZG0gKi8KLXZvaWQgT1BfRjUwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKLX0KLQotLyogZ2V0eCBkbSxkbSAqLwotdm9pZCBPUF9GNkYwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgeiwgbjsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19NRFJRXSA9PSAwKTsKLSAgbiA9ICgoU3RhdGUucmVnc1tSRUdfTURSUV0gJiAweDgwMDAwMDAwKSAhPSAwKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19NRFJRXTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCk7Ci19Ci0KLS8qIG11bHEgZG0sZG4gKi8KLXZvaWQgT1BfRjYwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiBtdWxxIGltbTgsZG4gKi8KLXZvaWQgT1BfRjkwMDAwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKLSAgaW50IG4sIHo7Ci0KLSAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KLSAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpU0VYVDggKGluc24gJiAweGZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG11bHEgaW1tMTYsZG4gKi8KLXZvaWQgT1BfRkIwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG11bHEgaW1tMzIsZG4gKi8KLXZvaWQgT1BfRkQwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KLSAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7Ci0gIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OwotICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Ci19Ci0KLS8qIG11bHF1IGRtLGRuICovCi12b2lkIE9QX0Y2MTAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQotCSAgKiAodW5zaWduZWQ2NCkgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOwotICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKLSAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOwotfQotCi0vKiBtdWxxdSBpbW04LGRuICovCi12b2lkIE9QX0Y5MTQwMCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7Ci0gIGludCBuLCB6OwotCi0gIHRlbXAgPSAoKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQotCSAgKiAodW5zaWduZWQ2NClTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOwotICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKLSAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID09IDApOwotICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogbXVscXUgaW1tMTYsZG4gKi8KLXZvaWQgT1BfRkIxNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0JICAqICh1bnNpZ25lZDY0KSBTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogbXVscXUgaW1tMzIsZG4gKi8KLXZvaWQgT1BfRkQxNDAwMDAgKGluc24sIGV4dGVuc2lvbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOwotICBpbnQgbiwgejsKLQotICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCi0gICAgICAgICAgKiAodW5zaWduZWQ2NCkoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKLSAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7Ci0gIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPT0gMCk7Ci0gIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKLX0KLQotLyogc2F0MTYgZG0sZG4gKi8KLXZvaWQgT1BfRjY0MCAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOwotICB0ZW1wID0gKHRlbXAgPiAweDdmZmYgPyAweDdmZmYgOiB0ZW1wKTsKLSAgdGVtcCA9ICh0ZW1wIDwgLTB4ODAwMCA/IC0weDgwMDAgOiB0ZW1wKTsKLSAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wOwotfQotCi0vKiBzYXQyNCBkbSxkbiAqLwotdm9pZCBPUF9GNjUwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgdGVtcDsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHRlbXAgPSAodGVtcCA+IDB4N2ZmZmZmID8gMHg3ZmZmZmYgOiB0ZW1wKTsKLSAgdGVtcCA9ICh0ZW1wIDwgLTB4ODAwMDAwID8gLTB4ODAwMDAwIDogdGVtcCk7Ci0gIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdGVtcDsKLX0KLQotLyogYnNjaCBkbSxkbiAqLwotdm9pZCBPUF9GNjcwIChpbnNuLCBleHRlbnNpb24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOwotewotICBpbnQgdGVtcCwgYzsKLQotICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Ci0gIHRlbXAgPDw9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4MWYpOwotICBjID0gKHRlbXAgIT0gMCA/IDEgOiAwKTsKLSAgUFNXICY9IH4oUFNXX0MpOwotICBQU1cgfD0gKGMgPyBQU1dfQyA6IDApOwotfQotCi0vKiBicmVha3BvaW50ICovCi12b2lkCi1PUF9GRiAoaW5zbiwgZXh0ZW5zaW9uKQotICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKLXsKLSAgU3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLSAgUEMgLT0gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvdGNvbmZpZy5pbiBiL3NpbS9tbjEwMzAwL3Rjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWI2ZTcuLjAwMDAwMDAKLS0tIGEvc2ltL21uMTAzMDAvdGNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIG1uMTAzMDAgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGlzIHVubmVjZXNzYXJpbHkgbmVjZXNzYXJ5OiAqLwotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0jaW5jbHVkZSAic2ltLW1vZHVsZS5oIgotCi1NT0RVTEVfSU5TVEFMTF9GTiBkdl9zb2Nrc2VyX2luc3RhbGw7Ci0jZGVmaW5lIE1PRFVMRV9MSVNUIGR2X3NvY2tzZXJfaW5zdGFsbCwKLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBwcm9maWxpbmcuCi0gICBTZWUgdGhlIG1pcHMgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLXAgZm9vJyBhbmQgYC1zIGJhcicgb3B0aW9ucy4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3Byb2ZpbGV7LF9zaXplfS4gICovCi0vKiAjZGVmaW5lIFNJTV9IQVZFX1BST0ZJTEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciB1c2VzIGFuIGluc3RydWN0aW9uIGNhY2hlLgotICAgU2VlIHRoZSBoOC8zMDAgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLWMgc2l6ZScgb3B0aW9uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuCi0gICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9zaW1jYWNoZV9zaXplLiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfU0lNQ0FDSEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHRhcmdldCBjcHUgaXMgYmktZW5kaWFuCi0gICBhbmQgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBpdC4gICovCi0vKiAjZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOICovCmRpZmYgLS1naXQgYS9zaW0vcHBjLy5nZGJpbml0IGIvc2ltL3BwYy8uZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlNjJkNi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjLy5nZGJpbml0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1zZXQgb3V0cHV0LXJhZGl4IDE2Ci1icmVhayBlcnJvcgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9CVUdTIGIvc2ltL3BwYy9CVUdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJiMDc5Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvQlVHUworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi1DaGFuZ2VMb2cKLQotU2VlIHRoZSBDaGFuZ2VMb2cgZmlsZSBsb29raW5nIGZvciBsaW5lcyB0YWdlZCB3aXRoIHRoZSB3b3JkIEZJWE1FLgotCi0KLUNPUkVGSUxFLkM6Ci0KLVRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjb3JlZmlsZS5jIChkZWZpbmVkIGJ5IGNvcmVmaWxlLmgpIGlzbid0IHRoZQotYmVzdC4gIEl0IGlzIGludGVuZGVkIHRvIGJlIGZ1bmN0aW9uYWx5IGNvcnJlY3QgcmF0aGVyIHRoYW4gZmFzdC4gIE9uZQotb3B0aW9uIGJlaW5nIGNvbnNpZGVyZWQgaXMgdG8gYWRkIGEgZGF0YSBjYWNoZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkCi1vZiB0aGUgbW9zdCBjb21tb24gY2FzZSBvZiBkYXRhIHJlYWQvd3JpdGVzLgotCi0KLVZFQToKLQotTWlzc2luZyBWRUEgc3lzdGVtIGNhbGxzLgotCi1wcGMtaW5zdHJ1Y3Rpb25zOgotCi1NaXNzaW5nIG9yIGNvbW1lbnRlZCBvdXQgaW5zdHJ1Y3Rpb25zLgotCi0KLTY0Yml0OgotCi02NGJpdCB0YXJnZXQgdW50ZXN0ZWQuIDY0Yml0IGhvc3QgYnJva2VuLiAgRm9yIGluc3RhbmNlIHVzZSBvZiBzY2FuZgotIiV4IiwgJmxvbmcgbG9uZy4KLQotCi0KLWh3XyouYzoKLQotQmV0dGVyIGFuZCBtb3JlIGRldmljZXMuCi0KLVBPUlRBQklMSVRZOgotCi0oTm90ZXMgdGFrZW4gZnJvbSBNaWNoYWVsIE1laXNzbmVyKTogSGVhdnkgdXNlIG9mIHRoZSAjIyBvcGVyYXRvciAtCi1maXggdXNpbmcgdGhlIGNsYXNpYyBYLyoqL1kgaGFjazsgVXNlIG9mIHRoZSBzaWduZWQga2V5d29yZC4gIEluCi1wYXJ0aWN1bGFyLCBzaWduZWQgY2hhciBoYXMgbm8gYW5hbG9ndWUgaW4gY2xhc3NpYyBDICh0aG91Z2ggbW9zdAotaW1wbGVtZW50YXRpb25zIG9mIGNsYXNzaWMgQyB1c2Ugc2lnbmVkIGNoYXJzKTsgVXNlIG9mIGxvbmcgbG9uZyB3aGljaAotcmVzdHJpY3RzIHRoZSB0YXJnZXQgY29tcGlsZXIgdG8gYmUgR0NDLgotCi0KLVRSQUNJTkc6Ci0KLWRlYnVnLmM6IE1hY3JvJ3Mgc2hvdWxkIGJlIGV4dGVuZGVkIHRvIGluY2x1ZGU6Ci0KLQlJU18qVFJBQ0U6CVRydWUgaWYgdHJhY2luZyBlbmFibGVkCi0JKlRSQUNFX1BSRUZJWDoJT3V0cHV0cyBqdXN0IHRoZSBwcmVmaXggbGluZQotCi1od190cmFjZS5jOiBGbHVzaCwgcmVwbGFjZSB3aXRoIGEgcHNpbV9zZXRfdHJhY2luZyBvciBzb21lCi0Jc3VjaCBwcm9ncmFtLgotCi0KLUNJQS9OSUE6Ci0KLVJlcGxhY2Ugd2l0aCBmdW5jdGlvbnMgdG8gcmV0dXJuL2luY3JlbWVudCB0aGUgQ0lBPwotCi0KLQotU01QICYgR0RCOgotCi1HREIgZG9lc24ndCB1bmRlcnN0YW5kIFNNUCEKLQotCi0KLQotT1ZFUkFMTCBTVFJVQ1RVUkU6Ci0KLUEgbmV3IGZpbGUgcHN0cnVjdC5oIGlzIHRvIGJlIGNyZWF0ZWQgdGhhdCBjb250YWlucyBhIHNpbmdsZSBmbGF0IGRhdGEKLXN0cnVjdHVyZSBjb250YWluaW5nOgotCi0JCXBzdHJ1Y3QgewotCQkJZXZlbnRzOwotCQkJY29yZTsKLQkJCXByb2Nlc3Nvcltucl9jcHVzXTsKLQkJCW1vbml0b3I7Ci0JCQlkZXZpY2VzOwotCQkJdHJhY2U7Ci0JCX0KLQotVGhlIENQVSdzIHN0cnVjdHVyZSwgaW4gdHVybiB3b3VsZCBjb250YWluIHRoZSBWTSBzdWIgc3RydWN0dXJlcy4KLQotV2hlbiBTTVA9PTAsIGV2ZXJ5dGhpbmcgd291bGQgaGF2ZSBQU1RSVUNUIHBhc3NlZC4gIEluIFNNUCBtb2RlLAotaG93ZXZlciwgdGhlcmUgYXJlIHR3byBjaG9pY2VzOiBQU1RSVUNUICsgQ1BVX05SIG9yIFBST0NFU1NPUi4gIEkKLXN1c3BlY3QgdGhlIGxhdHRlciBpcyBiZXR0ZXIuCi0KLUl0IGlzIGJlbGlldmVkIHRoYXQgdGhpcyB3b3VsZCBzaWduaWZpY2FudGx5IGltcHJvdmUgcGVyZm9ybWFuY2UgKGF0Ci10aGUgcHJpY2Ugb2YgcmVkdWNlZCBjb250cm9sIG92ZXIgb2JqZWN0IHNjb3BlKS4KLQotCi0KLQotSUdFTjoKLQotSWdlbiBhdCBwcmVzZW50IGNhbid0IGRvIHRoZSBmb2xsb3dpbmc6Ci0KLQlvCWR1cGxpY2F0aW9uIGlzIGFuIGFsbCBvciBub3RoaW5nIGFmYWlyLgotCi0JCUl0IHNob3VsZCBiZSBjb25maWd1cmFibGUgYWNjb3JkaW5nIHRvCi0JCXRoZSBpbnN0cnVjdGlvbiBvciB0aGUgc3ViLXRhYmxlLgotCi0KLQlvCUR1ZSB0byB0aGUgbmFtaW5nLCBvbmx5IGEgc2luZ2xlIGdlbmVyYXRlZAotCQlzaW11bGF0b3IgY2FuIGJlIGluY2x1ZGVkIGluIGEgcHJvZ3JhbS4KLQotCQlJR0VOIHNob3VsZCBiZSBhYmxlIHRvIGdlbmVyYXRlIG11bHRpcGxlCi0JCWVuZ2luZXMgdGhhdCBjYW4gYWxsIGJlIGluY2x1ZGVkIGluIGEgcHJvZ3JhbQotCi0JbwloYW5kbGUgYWx0ZXJuYXRlIGFyY2hpdGVjdHVyZXMuCi0KLQotCW8JSWdlbiBzaG91bGQgc3VwcG9ydCB0aGUgZ2VuZXJhdGlvbiBvZiBhCi0JCWRpc2FzZW1ibGVyIGFuZCBwb3NpYmx5IGFuIGFzc2VtYmxlci4KLQotCQlJIHN1Z2dlc3QgdGhhdCB0aGUgdGFibGUgYmUgZXh0ZW5kZWQgdG8KLQkJaW5jbHVkZSwgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24sIGFkZGl0aW9uYWwKLQkJbGluZXMgZGVzY3JpYmluZyB0aGUgZXh0dWFsIGZvcm1hdCBvZiB0aGUKLQkJaW5zdHJ1Y3Rpb24uCi0KLQkJT25lIHBvc3NpYmxlIGZvcm1hdCBpczoKLQotCQkJIm10bHIgJVJTIjpTUFIuc29tZXRoaW5nCi0JCQkibXRzcHIgJVNQUiwgJVJTIgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9DT1BZSU5HIGIvc2ltL3BwYy9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NpbS9wcGMvQ09QWUlORy5MSUIgYi9zaW0vcHBjL0NPUFlJTkcuTElCCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY4NWE1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IEdQTC4gIEl0IGlzCi0gbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCi1mcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCi0KLSAgVGhpcyBsaWNlbnNlLCB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSwgYW5kIHRvIGFueQotb3RoZXIgbGlicmFyaWVzIHdob3NlIGF1dGhvcnMgZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IGZvcgoteW91ciBsaWJyYXJpZXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZgoteW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgYSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5LCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIE91ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0Ci10aGUgbGlicmFyeSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgQWxzbywgZm9yIGVhY2ggZGlzdHJpYnV0b3IncyBwcm90ZWN0aW9uLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLWxpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwKLXZlcnNpb24sIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24KLXRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KLQwKLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotDAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAotY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKLXBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcwotYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLSAgCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0MCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQwKLSAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgotdGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKLXN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCi0KLSAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCi10aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCi0KLSAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKLWRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCi11bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKLWl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKLW11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQotc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCi1kaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCi1MaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCi1saW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQotd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAotdGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5Ci1jcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKLWNvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCi1saWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLVNlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgotCi0gIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCi10aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKLWRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgotV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKLWxpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCi10aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgotCi0gIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCi1zdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKLWZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKLWZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKLXdvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCi1MaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQotCi0gIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5Ci1kaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KLUFueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAotd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgotDAotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotDAotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotDAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0MCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLSAgICAgQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi1vcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCi1zYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCi0iY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9DaGFuZ2VMb2cgYi9zaW0vcHBjL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwYWY2Mi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDMyMzMgKzAsMCBAQAotVHVlIE1heSAyMyAyMTozOToyMyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIEFwciAyOCAxNTo1OToyNyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9wcm9jZXNzKTogQ2FsbCB1cGRhdGVfdGltZV9mcm9tX2V2ZW50Ci0gCWV2ZXJ5IHRpbWUgYW4gZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KLQkodXBkYXRlX3RpbWVfZnJvbV9ldmVudCk6IERlbGV0ZSBhc3NlcnRpb24gdGhhdCBhIG5lZ2F0aXZlCi0gCXRpbWVfZnJvbV9ldmVudCBpbXBsaWVzIGFuIGVtcHR5IGV2ZW50IHF1ZXVlLgotCi1GcmkgQXByIDI4IDE1OjUzOjU0IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJydXB0cy5jIChkZWxpdmVyX2hhcmR3YXJlX2ludGVycnVwdCk6IFByaW50IHRpbWUgdHJhY2UgaW4KLSAJZGVjaW1hbC4KLQkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9wcm9jZXNzKTogQ2xlYW51cCB0cmFjZSBtZXNzYWdlLgotCSh1cGRhdGVfdGltZV9mcm9tX2V2ZW50KTogVHJhY2UgZnVsbCBldmVudCBxdWV1ZS4KLQotMjAwMC0wMy0yNSAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChEaXNhYmxlZF9FeHBvbmVudF9VbmRlcmZsb3cpOiBJbmNyZW1lbnQKLQl0aGUgZXhwb25lbnQgd2hlbiBkZW5vcm1hbGl6aW5nLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi0xOTk5LTA0LTAyICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoUE9MTF9RVUlUX0lOVEVSVkFMKTogRGVmaW5lLiBVc2VkIHRvIHR3ZWFrCi0JdGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgcG9sbF9xdWl0IGNhbGxiYWNrIGlzIGNhbGxlZC4KLQkocG9sbF9xdWl0X2NvdW50KTogTmV3IGdsb2JhbC4KLQkoc2ltX2lvX3BvbGxfcXVpdCk6IE9ubHkgY2FsbCB0aGUgcG9sbF9xdWl0IGNhbGxiYWNrCi0JYWZ0ZXIgdGhlIHNwZWNpZmllZCBQT0xMX1FVSVRfSU5URVJWQUwuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBkYy1jb21wbGV4OiBGb3JjZSBleHBhbnNpb24gb24gYWxsIGJpdHMgb2YgZmllbGQgQk8uCi0JUHJldmlvdXNseSwgdGhlIGxlYXN0LXNpZ25pZmljYW50IChwcmVkaWN0aW9uKSBiaXQgd2FzIGlnbm9yZWQuCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChjb25kaXRpb25hbCBicmFuY2hlcyk6IEltcGxlbWVudCBtcGM4NjBjMCBvcHRpb24uCi0JKiBpZ2VuLmMgKGdlbl9zZW1hbnRpY3NfW2NoXSk6IFNldHVwIGZvciBtcGM4NjBjMCBvcHRpb24uCi0JKiBwc2ltLmMgKGlzX251bSwgcHNpbV9vcHRpb25zKTogQWRkZWQgcGFyc2luZyBmb3IgbXBjODYwYzAgb3B0aW9uLgotCSogaW50ZXJydXB0cy5oOiBBZGRlZCAibXBjODYwYzBfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQiLgotCSogaW50ZXJydXB0cy5jIChwcm9ncmFtX2ludGVycnVwdCk6IEFkZGVkIGhhbmRsaW5nIGZvciBhYm92ZSBpbnRlcnJ1cHQuCi0KLTE5OTktMDItMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCU1ha2UgdGhlIHNpbXVsYXRvciBjb21wYXRpYmxlIHdpdGggdGhlIE1QQzc1MC4gIEl0IHdvdWxkIGJlIG5pY2VyCi0JdG8gbWFrZSB0aGlzIGEgcmVhbCBtdWx0aS1zaW0sIGJ1dCB0aGF0J3MgbW9yZSB3b3JrIHRoYW4gd2UgaGF2ZQotCXRpbWUgZm9yLgotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IE9ubHkgcmVxdWlyZSBzdHJpY3QKLQlhbGlnbm1lbnQgaWYgaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGF0IGNvbmZpZ3VyYXRpb24gdGltZS4KLQlEb24ndCBtYWtlIGl0IHRoZSBkZWZhdWx0IGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLgotCSogcHBjLXNwci10YWJsZSAoVU1NQ1IwLCBVTU1DUjEsIFVQTUMxLCBVUE1DMiwgVVNJQSwgVVBNQzMsIFVQTUM0LAotIAlNTUNSMCwgUE1DMSwgUE1DMiwgU0lBLCBNTUNSMSwgUE1DMywgUE1DNCwgTDJDUiwgSUNUQywgVEhSTTEsCi0gCVRIUk0yLCBUSFJNMyk6IFBsb3AgaW4gdGhlIE1QQzc1MCBTUFIgcmVnaXN0ZXJzLgotCShEQUJSKTogVGhpcyBpcyB3ZWlyZC4gIFRoaXMgd2FzIEhJRDUsIGJ1dCB0aGUgUFBDIHNwZWMgc2F5cyB0aGlzCi0gCXNob3VsZCBiZSBEQUJSOyB3aHkgZGlkIHNvbWUgcmFuZG9tIHByb2Nlc3NvciB1c2UgaXQgZm9yIHNvbWV0aGluZwotIAllbHNlPyAgVGhlIEhJRDUgZW50cnkgZGF0ZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY2hlY2tpbiBvZiB0aGUKLQlzaW11bGF0b3IgY29kZSBpbiAxOTk1LCBzbyByZW1vdmUgaXQuCi0JKiBzaW1fY2FsbHMuYyAocmVnaXN0ZXJfbmFtZXMpOiBEZWxldGUgdGhpczsgc2luY2UgdGhlIHVzZXIgY2FuCi0Jbm93IGNoYW5nZSBHREIncyBsaXN0IG9mIHJlZ2lzdGVyIG5hbWVzIGR5bmFtaWNhbGx5LCB3ZSBjYW4ndAotCXByZXRlbmQgdGhlcmUncyBhIHN0YXRpYyBtYXBwaW5nIGhlcmUuCi0JKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQ2FsbCBHREIncyBSRUdJU1RFUl9OQU1FCi0gCWZ1bmN0aW9uIHRvIGdldCB0aGUgcmVnaXN0ZXIgbmFtZS4gIFRoYXQgb3VnaHQgdG8gYmUgYWNjdXJhdGUuCi0gIAlIb3dldmVyLCB3ZSdyZSBjaGFuZ2luZyBhIGNvbXBpbGUtdGltZSBkZXBlbmRlbmN5ICh1c2luZyB0aGUKLSAJUkVHSVNURVJfTkFNRVMgbWFjcm8pIGludG8gYSBsaW5rLSBhbmQgcnVuLXRpbWUgZGVwZW5kZW5jeQotCShjYWxsaW5nIFJFR0lTVEVSX05BTUUsIHdoaWNoIGhhcHBlbnMgdG8gYmUgYSBmdW5jdGlvbiBjYWxsIG9uIHRoZQotCVBQQykuCi0KLTE5OTktMDEtMjIgIEppbSBMZW1rZSA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyhnZW5fc2VtYW50aWNzX1tjaF0pOiBzZXR1cC91c2Ugb2YgbmV3IG9wdGlvbgotCSgtbyBtcGM4NjBjMFs9bl0pLgotCWludGVycnVwdHMuW2NoXShtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk6IGFkZGVkLgotCXBwYy1pbnN0cnVjdGlvbnModGhlIGZvdXIgYnJhbmNoIGluc24gZ3JvdXBzKTogZGV0ZWN0IHByb2JsZW1hdGljIGJyJ3MuCi0JcHNpbS5jKGlzX251bSAtIGFkZGVkLCBwc2ltX29wdGlvbnMpOiBQYXJzZSBhbmQgaW5pdCBuZXcgb3B0aW9uLgotCVRoZXNlIGNoYW5nZXMgYXJlIGN1cnJlbnRseSB1bmRlciAjaWZkZWYgV0lUSF9PUFRJT05fTVBDODYwQzAuCi0KLTE5OTgtMTItMDEgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBod19udnJhbS5jIChod19udnJhbV9iY2QpOiBGb3JjZSB2YWx1ZSB0byBmaXQgaW4gMC4uOTkuCi0KLUZyaSBOb3YgMjAgMTI6MTc6MjggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBtYWluLmMgKHNpbV9pb19wb2xsX3F1aXQpOiBTdHViIGZ1bmN0aW9uLgotCi0JKiBldmVudHMuYyAoU0lNX0VWRU5UU19QT0xMX1JBVEUpOiBEZWZpbmUuCi0JKHNpbV9ldmVudHNfcG9sbCk6IENvcHkgZnVuY3Rpb24gZnJvbSBjb21tb24vc2ltLWV2ZW50cy5jLgotCShldmVudF9xdWV1ZV9pbml0KTogQ29weSBzY2hlZHVsaW5nIG9mIHNpbV9ldmVudHNfcG9sbCBmcm9tIHNhbWUuCi0KLQkqIHNpbV9jYWxsYmFja3MuaCwgc2ltX2NhbGxzLmMgKHNpbV9pb19wb2xsX3F1aXQpOiBOZXcgZnVuY3Rpb24sCi0gCXBvbGwgdGhlIGV4dGVybmFsIGVudmlyb25tZW50LgotCi0xOTk4LTExLTE5ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoaXNfe05hTixpbmZ9KTogVXNlIHVuc2lnbmVkNjQgdG8gZ2V0IHRoZQotCWZyYWN0aW9uYWwgdHlwZSwgc28gdGhhdCBxdWlldCBOYU4ncyBhcmVuJ3QgdHJlYXRlZCBsaWtlCi0JSW5maW5pdGllcy4KLQotTW9uIFNlcCAyOCAwOTo0Mjo0NSAxOTk4ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiB0YWJsZS5jICh0YWJsZV9vcGVuKTogRm9yIGN5Z3dpbiBob3N0cywgd2UgbmVlZCB0byB1c2UgdGhlCi0gCXJldHVybiB2YWx1ZSBmcm9tIHRoZSByZWFkIHJvdXRpbmUgYXMgdGhlIG51bWJlciBvZiBieXRlcyB0bwotIAlwcm9jZXNzLiAgVGhpcyBhcHBhcmVudGx5IGlzIGR1ZSB0byB0ZXh0LW1vZGUgdnMgYmluYXJ5LW1vZGUuICBJZgotIAl0aGUgbW91bnRzIGFyZSBkb25lIHRleHQtbW9kZSwgdGhlbiB0aGUgc2l6ZSByZXR1cm5lZGJ5IGZzdGF0KCkKLSAJbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgInJlYWQiIGluIHRleHQgbW9kZS4KLQotU3VuIE9jdCAgNCAwMDo1MDo0NyAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxfbmV0YnNkLmMgKGRvX29wZW4pOiBmaXggb3JkZXItb2YtZXZhbHVhdGlvbiBwcm9ibGVtLgotCShkb19jbG9zZSk6IGRpdHRvLgotCShkb19mc3RhdCk6IGRpdHRvLgotCShkb19sc3RhdCk6IGRpdHRvLgotCi0xOTk4LTA5LTAzICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bF97bmV0YnNkLHVuaXh9LmM6IFVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KLQotTW9uIEp1biAyOSAxMDo1NzozNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOgotCXJldHVybiB6ZXJvIHdoZW4gbm90aGluZyB0byBkby4KLQotMTk5OC0wNi0yNiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IERvbid0IGNoZWNrIGZvciBzeXMvbW91bnQuaC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGVtdWxfe25ldGJzZCx1bml4fS5jICh0b3BsZXZlbCk6IE5vIGxvbmdlciB0cnkgdG8gaW5jbHVkZQotCXN5cy9tb3VudC5oLiBJdCBjb25mbGljdHMgb24gTGludXggd2hlbiBnbnUgbGliYzIgaXMgdXNlZC4KLQotVHVlIE1heSAxMiAxMjoxMDozMyBQRFQgMTk5OCAgSmFtZXMgSW5naGFtICA8amluZ2hhbUBsZWRhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBUaGUgcnVuIHRhcmdldCBkZXBlbmRlZCBvbiBhIHRhcmdldCBwc2ltJChFWEVFWFQpLAotCWJ1dCB0aGVyZSB3YXMgbm8gc3VjaCB0YXJnZXQsIG9ubHkgcGxhaW4gcHNpbS4gIFNvIEkgY2hhbmdlZCB0aGUKLQlydW4gdGFyZ2V0IHRvIGRlcGVuZCBvbiBwc2ltLgotCi1TYXQgTWF5ICAyIDAxOjEwOjEyIDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiAgUmVtb3ZlIGRlZnMgb2YgQU1fRVhFRVhUIGFuZCBBTV9DWUdXSU4zMi4gIFRoZXNlIGFyZQotCW5vdyBkZWZpbmVkIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LCBhbmQgdGhlIGRvdWJsZSBkZWZpbml0aW9uIGNhdXNlcwotCXByb2JsZW1zIHdpdGggQUNfU1VCU1Qgb2YgRVhFRVhULgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQkKLVdlZCBBcHIgMjkgMTU6NDQ6NTIgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogbmV3IGZpbGUgZm9yIEFNX0VYRUVYVCBtYWNybwotCSogY29uZmlndXJlLmluOiBjYWxsIEFNX0VYRUVYVAotCSogY29uZmlndXJlOiByZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCSogTWFrZWZpbGUuaW46IGFkZCBFWEVFWFQgc3VwcG9ydAotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjE5OjUxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQlEb24ndCBjYWxsIEFDX0NfQ1JPU1MuCi0KLUZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLUZyaSBBcHIgMjQgMTE6MTg6NDYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodG9wX2J1aWxkZGlyKTogTmV3IG1hY3JvLgotCShJTlRMTElCUyk6IE5ldyBtYWNyby4KLQkoSU5UTERFUFMpOiBMaWtld2lzZS4KLQkocHNpbSk6IERlcGVuZCBvbiBJTlRMREVQUzsgbGluayBhZ2FpbnN0IElOVExMSUJTLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULgotCi1XZWQgQXByIDIyIDE0OjI4OjQ4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0KLUZyaSBNYXIgMTMgMDk6MjU6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBwc2ltLmMgKHBzaW1fcmVhZF9yZWdpc3RlciwgcHNpbV93cml0ZV9yZWdpc3Rlcik6IEhhbmRsZSB1cGRhdGVzCi0gCWZvciBGUFNDUi4KLQotCSogcmVnaXN0ZXJzLmMgKHJlZ2lzdGVyX2Rlc2NyaXB0aW9uKTogUmVjb25pemUgIkZQU0NSIi4KLQotCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogV2hlbiBGUCBhdmFpbGFibGUsIGVuYWJsZQotIAlNU1IgRlAgZXhjZXB0aW9uIG1vZGUuIERvIG5vdCBlbmFibGUgRlBTQ1IgYml0cy4KLQkqIGVtdWxfdW5peC5jIChlbXVsX3VuaXhfY3JlYXRlKTogRGl0dG8uCi0KLVR1ZSBGZWIgMTcgMTI6NDg6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluCi0gCWxlbmd0aCBwYXJhbWV0ZXIuICBSZXR1cm4gLTEuCi0KLU1vbiBGZWIgIDkgMTQ6MTM6MTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChmZGl2LCBmZGl2cyk6IENoZWNrIGZvciBkaXZpZGUgYnkgemVyby4KLQkoaXNfaW52YWxpZF96ZXJvX2RpdmlkZSwgaW52YWxpZF96ZXJvX2RpdmlkZV9vcGVyYXRpb24pOiBOZXcKLSAJZnVuY3Rpb25zLgotCQotV2VkIERlYyAxMCAxNzozODoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fbG9hZCk6IERvIG5vdCBwYXJzZSBQUk9HIHVzaW5nIGJ1aWxkYXJndiwgdXNlCi0gCXJhdyB2YWx1ZSBpbnN0ZWFkLgotCi0xOTk3LTExLTA1ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxfY2hpcnAuYzogI2lmZGVmIEhBVkVfVU5JU1REX0gKLQotV2VkIE9jdCAxNSAwODo1MDo1NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvcmVmaWxlLmMgKGNvcmVfYXR0YWNoKTogUGFkIG91dCBhbGxvY2F0ZWQgbWVtb3J5IHJlZ2lvbnMgc28KLSAJdGhhdCB0aGV5IGFyZSBhbHdheXMgY29ycmVjdGx5IGFsaWduZWQuCi0JKHN0cnVjdCBfY29yZV9tYXBwaW5nLCBjb3JlX21hcF9hdHRhY2gsIGNvcmVfaW5pdCwKLSAJbmV3X2NvcmVfbWFwcGluZyk6IENoYW5nZSBmcmVlX2J1ZmZlciB0byB0eXBlIHZvaWQqLgotCi1Nb24gT2N0ICA2IDE4OjA5OjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoemZyZWUpOiBDYWxsIGZyZWUgY29ycmVjdGx5LgotCi1Nb24gU2VwIDI5IDEwOjA1OjAxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltX2NhbGxzLmMgKHpmcmVlKTogVXNlIGZyZWUsIG5vdCBtZnJlZS4KLQkoc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dCk6IFJlcGxhY2UgZ2RiX2ZsdXNoIHdpdGggY2FsbGJhY2sgLT4KLSAJZmx1c2hfc3Rkb3V0LgotCi1GcmkgU2VwIDI2IDA5OjUwOjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoc3Jhdywgc2x3LCBzcncpOiBGcm9tIENoYXJsZXMgTGVmdXJneSwgRml4Ci0gCW1hc2sgZXh0cmFjdGluZyBzaGlmdCBhbW91bnQuIENvcnJlY3RseSBjb25kaXRpb24gZm9yIHNldHRpbmcgWEVSCi0gCWluIHNyYXcuCi0gCShsZGhhdSk6IEZyb20gSm9oYW5uZXMgUmVpc2luZ2VyLCB1cGRhdGUgckEgYWZ0ZXIgbG9hZC4KLQotVHVlIFNlcCAgOSAyMjoxMzoyMyAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGJhc2ljcy5oIChDT05DQVQqKTogdG9rZW4tcGFzdGluZyBtYWNyb3MsIGlmIEFMTU9TVF9TVERDLAotIAlmb3IgTVNWQy4KLQkqIHdvcmRzLmg6IF9faW50NjQgaW5zdGVhZCBvZiBsb25nIGxvbmcgZm9yIE1TVkMuCi0KLVdlZCBBdWcgMjcgMTA6MjQ6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IENoZWNrIHRoZSBzaW11bGF0b3Igd2FzCi0gCWluaXRpYWxpemVkIGJlZm9yZSBjcmVhdGluZyBpbmZlcmlvci4KLQotCSogaWRlY29kZV9leHByZXNzaW9uLmggKEFMVV9FTkQpOiBGcm9tIENoYXJsZXMgTGVmdXJneSAtIEV4dHJhY3QKLSAJc2lnbiBiaXQgdXNpbmcgNjQgYml0IGFuZCBub3QgYSAzMiBiaXQgbWFzay4KLQotV2VkIEF1ZyAyNyAxMDoxNTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fbG9hZCk6IEZyb20gSWFuIExhbmNlIFRheWxvciAtIGZyZWUgYXJndiBhZnRlcgotIAlpdCBoYXMgYmVlbiB1c2VkLCBub3QgYmVmb3JlLgotCQotVHVlIEF1ZyAyNiAxMDo0MTozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fa2lsbCk6IERlbGV0ZS4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCShlbnRyeV9wb2ludCk6IERlbGV0ZSB2YXJpYWJsZS4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQotTW9uIEF1ZyAyNSAxNjoxNzowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgotCi1UaHUgSnVsICAzIDEwOjE4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoUFBDX0lOU05fSU5UKTogRnJvbSBNaWNoYWVsIFRoaWVzIC0gTW9uaXRvcmluZwotIAlDUiByZWdpc3RlciB1cGRhdGVzIGRlcGVuZGFudCBvbiBSQyB2YWx1ZSBoYWQgbG9naWMgYmFja3dhcmRzLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChMb2FkIFN0cmluZyBXb3JkIEltbWVkaWF0ZSk6IEZyb20gQnJhZCBQYXJrZXIKLSAJLSBzZW5zZSBvZiB3cmFwIHRlc3QgaW4gY2hlY2sgZm9yIG92ZXJ3cml0aW5nIFJBIHdyb25nLgotCShMb2FkIFN0cmluZyBXb3JkIEluZGV4ZWQpOiBEaXR0by4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogRnJvbSBFcmlrIExhbmRyeSAtIHNldCBzaW1fZGVmYXVsdF9tb2RlbCBub3QKLSAJc2ltX21vZGVsIGZvciBzaW0tZGVmYXVsdC1tb2RlbCBvcHRpb24uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JCi0JKiBpbnRlcnJ1cHRzLmMgKGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKTogU2NoZWR1bGUgYSBoYXJkd2FyZQotIAlpbnRlcnJ1cHQgZGVsaXZlcnkgd2hlbiBGUCBpbnRlcnJ1cHRzIGdldCBlbmFibGVkLgotCShwcm9ncmFtX2ludGVycnVwdCk6IEdlbmVyYXRlIEZQIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBhYm9ydGluZy4KLQkoZGVsaXZlcl9oYXJkd2FyZV9pbnRlcnJ1cHQpOiBEZWxpdmVyIGEgRlAgZXhjZXB0aW9uIGlmIHNvCi0gCWVuYWJsZWQuCi0KLQkqIHJlZ2lzdGVycy5oOiBBZGQgZGVmaW5pdGlvbiBvZiBmcHNjcl92eF9iaXRzLgotCi0JKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoRlBTQ1JfRU5EKTogQWx3YXlzIHVwZGF0ZSBGRVggYW5kIFZYIGJpdHMKLSAJaW4gRlBTQ1IuCi0JKEZQU0NSX0VORCk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIHBvc3NpYmxlIGZsb2F0aW5nIHBvaW50Ci0gCWV4Y2VwdGlvbiBjb25kaXRpb25zLgotCShGUFNDUl9CRUdJTik6IFNpbXBsaWZ5LgotCQotCSogcHBjLWluc3RydWN0aW9ucyAoTW92ZSBGcm9tIEZQU0NSKTogRW5hYmxlLgotCShNb3ZlIFRvIEZQU0NSIEJpdCAxKTogRGl0dG8uCi0JKE1vdmUgVG8gRlBTQ1IgQml0IDApOiBEaXR0by4KLQkoTW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUpOiBEaXR0by4KLQkoTW92ZSB0byBDb25kaXRpb24gUmVnaXN0ZXIgZnJvbSBGUFNDUik6IFNpbXBsaWZ5LgotCShpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbik6IEdlbmVyYXRlIGEgUU5hTiB3aGVuIGludmFsaWQKLSAJb3BlcmF0aW9uIGV4Y2VwdGlvbiBkaXNhYmxlZC4KLQkKLVR1ZSBNYXkgMjAgMTA6MjI6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlLgotCi1UdWUgQXByIDIyIDIyOjM2OjU3IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbGJhY2tzLmggKGVycm9yKTogTWFrZSBkZWNsYXJhdGlvbiBtYXRjaCBnZGIncy4KLQkqIG1haW4uYyAoZXJyb3IpOiBEaXR0by4KLQotRnJpIEFwciAxOCAxNzowMzowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fc3RvcF9yZWFzb24pOiBTaW1wbGlmeS4gIFdhcyBydW5uaW5nIGltcGxpZXMKLSAJc3RvcHBlZC9TSUdJTlQuIEV4aXQgaW1wbGllcyBhIHN0YXR1cyBjb2RlLgotCi0JKiBwc2ltLmMgKGNudHJsX2Nfc2ltdWxhdGlvbik6IEZyb20gbWFpbi5jLiAgRXZlbnQgZnVuY3Rpb24gdGhhdAotIAloYWx0cyB0aGUgc2ltdWxhdG9yLgotCShwc2ltX3N0b3ApOiBOZXcuIEFzeW5jaHJvbm91c2x5IHNjaGVkdWxlIGEgc3RvcCBzaW11bGF0b3IgZXZlbnQuCi0JKHBzaW1fcnVuX3VudGlsX3N0b3ApOiBEZWxldGUuIE1hZGUgcmVkdW5kYW50IGJ5IHBzaW1fc3RvcC4KLQotCSogbWFpbi5jIChjbnRybF9jKTogVXBkYXRlLgotCShjbnRybF9jX3NpbXVsYXRpb24pOiBNb3ZlZCB0byBwc2ltLmMuCi0KLQkqIHNpbV9jYWxscy5jIChzaW1fc3RvcCk6IE5ldyBmdW5jdGlvbi4gVXNlIHBzaW1fc3RvcCB3aGljaAotIAlzY2hlZHVsZXMgYSBzdG9wIGV2ZW50LgotCShzaW1fcmVzdW1lKTogRHJvcCBTSUdJTlQgaGFuZGxlciwgbm93IGluIGdkYi9tYWluLmMuCi0JKHNpbV9yZXN1bWUpOiBVc2UgcHNpbV9ydW4gYXMgc3RvcCB2YXJpYWJsZSBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgQXByIDE4IDE3OjAzOjA4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBIYW5kbGUgLUUgb3B0aW9uIGNvcnJlY3RseS4KLQkocHNpbV91c2FnZSk6IERvY3VtZW50LgotCi1UaHUgQXByIDE3IDAzOjI4OjAzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogSWdub3JlIC1FIG9wdGlvbiAoc2V0cyBlbmRpYW5uZXNzKS4KLQkqIHNpbV9jYWxscy5jOiAjaW5jbHVkZSBiZmQuaC4KLQkoZW50cnlfcG9pbnQpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCi0KLVR1ZSBBcHIgMTUgMTQ6NTc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBBcHIgIDQgMTc6NTQ6MzYgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodG1wLWh3LCB0bXAtcGspOiBVc2UgZm9yIGxvb3AgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZXMKLQlyYXRoZXIgdGhhbiB0aGUgbm9uLXBvcnRhYmxlIGNhdCAtbi4KLQotTW9uIEFwciAxNCAxNjoyOTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotVHVlIEFwciAgMSAxODoxNToxNCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnM6IENoYW5nZSBtaWxod3UgdG8gbXVsaHd1LgotCi1XZWQgQXByICAyIDE1OjM4OjA4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgotCi1XZWQgQXByICAyIDE0OjUxOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1UdWUgTWFyIDI1IDE2OjE3OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBtYWluLmMgKHNpbV9pb19yZWFkX3N0ZGluKTogT25seSBjb21waWxlIHVuYnVmZmVyZWQgSU8gY29kZSBpZgotIAlhbGwgdGhlIHJlcXVpcmVkIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgT1MuCi0KLVR1ZSBNYXIgMjUgMTI6MTM6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IEd1YXJkIGFnYWluc3QgTlVMTCBpbWFnZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1lbmRhaW4pOiBDb3JyZWN0IHR5cG8gaW4gdXNhZ2UgKGZyb20KLSAJRXJpayBMYW5kcnkgPGxhbmRyeUBFTkdSLk9SU1QuRURVPikuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi1GcmkgTWFyIDE0IDE4OjIzOjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGFyZy12YWxzLmRlZik6IFJlLWRvIHJ1bGUgc28gdGhhdCBpdCB3b3JrcyB3aXRoCi0gCUZyZWVCU0QncyBtYWtlLiAgRGlkbid0IGxpa2UgJDwuCi0KLVRodSBNYXIgMTMgMTI6NTU6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltX2NhbGxzLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdwotCWluIGFyZ3YgZm9ybS4KLQkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVRodSBGZWIgMTMgMTA6MzU6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBwcGMtb3Bjb2RlLXNpbXBsZS1hcnJheSwgcHBjLW9wY29kZS1zaW1wbGUtZ290bywKLSAJcHBjLW9wY29kZS1zaW1wbGUtc3dpdGNoLCBwcGMtb3Bjb2RlLWNvbXBsZXgtYXJyYXksCi0gCXBwYy1vcGNvZGUtY29tcGxleC1nb3RvLCBwcGMtb3Bjb2RlLWNvbXBsZXgtc3dpdGNoLAotIAlwcGMtb3Bjb2RlLWp1bXAsIHBwYy1vcGNvZGUtZ290bywgcHBjLW9wY29kZS1mbGF0OiBEZWxldGUsCi0gCXN1cGVyc2VlZGVkIGJ5IC0tc2ltLWRlY29kZS1tZWNoYW5pc20gb3B0aW9uLgotCi0JKiBwcGMtb3Bjb2RlLXNpbXBsZSwgZGMtc2ltcGxlOiBSZW5hbWUgdG8gYmUgOC4zCi0JKiBwcGMtb3Bjb2RlLWNvbXBsZXgsIGRjLWNvbXBsZXg6IERpdHRvLgotCSogcHBjLW9wY29kZS1zdHVwaWQsIGRjLXN0dXBpZDogRGl0dG8uCi0JKiBwcGMtb3Bjb2RlLXRlc3QtMSwgZGMtdGVzdC4wMTogRGl0dG8uCi0JKiBwcGMtb3Bjb2RlLXRlc3QtMiwgZGMtdGVzdC4wMjogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLW9wY29kZSk6IENoYW5nZSBwcmVmaXggdG8gZGMtIGluc3RlYWQKLSAJb2YgcHBjLW9wY29kZS0uCi0KLVdlZCBGZWIgMTIgMTk6MzM6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYW55IG9mIHRoZSBwcGMtb3Bjb2RlLSogZmlsZXMgYXJlIGlkZW50aWNhbCBiYXJpbmcgdGhlIHR5cGUgb2YKLSAJbG9va3VwIHRhYmxlLiAgSW5zdGVhZCBvZiBoYXZpbmcgbXVsdGlwbGUgdGFibGVzLCBpZ2VuIGNhbiBkbyB0aGlzCi0JdmlhIGFuIGFkZGl0aW9uYWwgb3B0aW9uLgotCQotCSogbGQtZGVjb2RlLmgsIGxkLWRlY29kZS5jIChmb3JjZV9kZWNvZGVfZ2VuX3R5cGUpOiBOZXcgZnVuY3Rpb24sCi0gCWFsbG93IHRoZSB0eXBlIG9mIGdlbmVyYXRlZCB0YWJsZSBzcGVjaWZpZWQgaW4gdGhlIGRlY29kZSBmaWxlIHRvCi0gCWJlIG92ZXJyaWRkZW4uCi0KLQkqIGxkLWRlY29kZS5jIChsb2FkX2RlY29kZV90YWJsZSk6IEFsbG93IHRoZSB0YWJsZSB0eXBlIHRvIGJlCi0gCW92ZXJyaWRkZW4uCi0KLQkqIGlnZW4uYyAobWFpbik6IEFkZCAtVCA8bWVjaGFuaXNtPiBvcHRpb24gc28gdGhhdCBhbiBvdmVycmlkaW5nCi0gCWluc3RydWN0aW9uIGRlY29kZSBtZWNoYW5pc20gY2FuIGJlIHNwZWNpZmllZC4KLQotCSogY29uZmlndXJlLmluOiBOZXcgb3B0aW9uIC0tc2ltLWRlY29kZS1tZWNoYW5pc20gdG8gY29udHJvbAotIAlpZ2VuJ3MgbmV3IC1UIDxtZWNoYW5pc20+IGZsYWcuCi0JKiBNYWtlZmlsZS5pbiAoSUdFTl9GTEFHUyk6IEFkZCBJR0VOX0lERUNPREVfTUVDSEFOSVNNIHNldCBieSB0aGUKLSAJY29uZmlndXJlIHNjcmlwdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkKLVR1ZSBGZWIgMTEgMTM6NDk6MTAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBldmVudHMuYyAoZXZlbnRfcXVldWVfY3JlYXRlKTogRG9uJ3QgdXNlIE5VTEwgdG8gaW5pdGlhbGl6ZSBhbgotCWludGVnZXIgZmllbGQuCi0JKGV2ZW5fcXVldWVfe2luaXQsc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsLHRpY2t9KTogQ29uZGl0aW9uYWxpemUgdXNlCi0Jb2Ygc2lncHJvY21hc2sgdG8gYXBwcm9wcmlhdGUgYXV0b2NvbmYgdGVzdC4KLQotCSogbWFpbi5jICh7Y250cmxfYyxtYWlufSk6IFVzZSBSRVRTSUdUWVBFIGZvciBzaWduYWwgcmV0dXJuIHR5cGUsCi0JZG9uJ3QgYXNzdW1lIHZvaWQuCi0JKiBzaW1fY2FsbHMuYyAoc2ltX3tjdHJsX2MscmVzdW1lfSk6IERpdHRvLgotCi0JKiBNYWtlZmlsZS5pbiAoY2FsbGJhY2subyk6IERlZmluZSBIQVZFX0NPTkZJR19ILCBzbyBjYWxsYmFjay5jCi0JaW5jbHVkZXMgb3VyIGNvbmZpZy5oLgotCi1UdWUgRmViICA0IDEzOjQyOjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gdGVzdCBmb3IgY2FsbGJhY2suYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBGZWIgIDcgMTA6MDQ6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogSGFuZGxlIGEgdmlydGJhc2Ugb2YgLTEgYmVpbmcKLSAJZm91bmQgaW4gdGhlIGRldmljZSB0cmVlLgotCi1XZWQgRmViICA1IDEwOjU2OjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogUHJvcGVydHkgY3JlYXRlL2luaXRpYWxpemF0aW9uIHN0aWxsIHdhc24ndCBjb3JyZWN0bHkgb3JkZXJlZC4KLSAgCVNob3VsZCBiZSBkZWxheWluZyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaWhhbmRsZSBjcmVhdGlvbiB1bnRpbAotIAlhZnRlciB0aGUgcmVzdCBvZiB0aGUgdHJlZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KLQkKLQkqIGRldmljZS5jIChkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkpOiBVcGRhdGUuCi0JKGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KTogVXBkYXRlLgotCi0JKiB0cmVlLmMgKHBhcnNlX2loYW5kbGVfcHJvcGVydHkpOiBEZWxheSBsb29rdXAgb2YgdGhlIGRldmljZSB0bwotIAliZSBvcGVuZWQgdW50aWwgdGhlIGloYW5kbGUgaW5pdGlhbGl6YXRpb24gcGhhc2UuCi0JKiB0cmVlLmMgKHByaW50X3Byb3BlcnRpZXMpOiBVcGRhdGUuCi0KLVdlZCBGZWIgIDUgMTA6NTY6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IEFkZCBhIHJlYXNvbiBwYXJhbWV0ZXIuCi0gIAlBdWdtZW50IGVhY2ggZXh0cmFjdGVkIGZpZWxkIHdpdGggYSBjb21tZW50IGNpdGluZyB0aGUgY29kZXMKLSAJb3JpZ2luLiAgU2hvdWxkIHNpbXBsaWZ5IHRyYWNraW5nIGRvd24gaW5jb3JyZWN0IGNhY2hlCi0gCWV4dHJhY3Rpb25zLgotCi1UdWUgRmViICA0IDE3OjQ0OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogZ2VuLWljYWNoZS5jOiBHZW5lcmFsaXplIGNvZGUgaGFuZGxpbmcgWFhYX2lzX05OTiBzbyB0aGF0IGl0Ci0gCXdvcmtzIGZvciBub3JtYWwgYW5kIGJvb2xlYW4gdGFibGUgZW50cmllcy4KLQotCSogcHNpbS5jIChwc2ltX3dyaXRlX21lbW9yeSk6IGxhc3RfY3B1ID09IC0xIG9yIG5yX2NwdXMgaXMgbm93Ci0gCXZhbGlkLiAgSGFuZGxlIHRoaXMganVzdCBsaWtlICpfe3JlYWQsd3JpdGV9X3JlZ2lzdGVyIG5vdyBoYW5kbGVzCi0gCWl0LgotCi1Nb24gRmViICAzIDE3OjE4OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogZXZlbnRzLmMgKGluc2VydF9ldmVudF9lbnRyeSk6IENvcnJlY3QgbG9vcCB0ZXJtaW5hdGlvbgotIAlhc3NlcnRpb25zLgotCi1GcmkgSmFuIDMxIDE2OjIwOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBBZGQgbmV3IG9wdGlvbiAtYyBmb3IgbWF4LWl0ZXJhdGlvbnMgb3IKLSAJY291bnQuCi0JKHBzaW1fdXNhZ2UpOiBEb2N1bWVudC4KLQkocHNpbV9tYXhfaXRlcmF0aW9uc19leGNlZWRlZCk6IE5ldyBmdW5jdGlvbiwgYWJvcnQgc2ltdWxhdGlvbiBpZgotIAltYXggaXRlcmF0aW9ucyBleGNlZWRlZC4KLQotCSogZ2VuLWlkZWNvZGUuYzogUmUtd29yayB0aGUgdGFibGUgbG9va3VwIGNvZGUgc28gdGhhdCBpdCBhc3N1bWVzCi0gCXRoYXQgdGhlIGVudHJ5IGlzIGEgbGVhZiBieSBkZWZhdWx0LiAgU2ltcGxpZnkgdGhlIGJvb2xlYW4gdGFibGUKLSAJZW50cnkgY29kZSBzbyB0aGF0IGl0IGludm9sdmVzIGEgbWFzayArIHRlc3QgaW5zdGVhZCBvZiBzaGlmdCArCi0gCXNoaWZ0ICsgbWFzayArIHRlc3QuCi0KLQkqIGdlbi1pZGVjb2RlLmM6IENvcnJlY3QgZ2VuZXJhdGVkIGlnZW4gYm9keSBzbyB0aGF0IGl0IG5vIGRyb3BzCi0gCW9yIGRvdWJsZXMgY2xvY2sgaW50ZXJydXB0cy4KLQotCQotVGh1IEphbiAzMCAxMToyMzoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChCVUlMVF9TUkNfV09fQ09ORklHKTogQ2hhbmdlIHRhcmctdmFscy4qIHRvCi0gCUBzaW1fdGFyZ192YWxzQAotCi0JKiBjb25maWd1cmUuaW4gKHNpbV9jYWxsYmFjaywgc2ltX3RhcmdfdmFscyk6IFNldCBzaW1fdGFyZ192YWxscwotIAlpZiBjb21tb24gY2FsbGJhY2sgaXMgcHJlc2VudC4KLQotV2VkIEphbiAyOSAxMjozMjo0MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX2NhbGxiYWNrKTogSWYgdGhlIGdkYiBpcyBwb3N0IDQuMTYsIGNvbmZpZ3VyZQotCWNhbGxiYWNrIHN1cHBvcnQgZnJvbSB0aGUgY29tbW9uIGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogTWFrZWZpbGUuaW4gKEJVSUxUX1NSQ19XT19DT05GSUcpOiBBZGQgdGFyZy12YWxzLntoLGRlZn0gYW5kCi0JdGFyZy1tYXAuYy4KLQkoR0RCX09CSik6IEFkZCBjYWxsYmFjayBzdXBwb3J0IGNvbmZpZ3VyZWQgaW4uCi0JKGdlbnRtYXAsdGFyZy12YWxzLmRlZik6IEJ1aWxkIGZyb20gY29tbW9uIGRpcmVjdG9yeS4KLQkodGFyZy12YWxzLmgsdGFyZy1tYXAuYyk6IEJ1aWxkIGJ5IHJ1bm5pbmcgZ2VudG1hcC4KLQkoY2FsbGJhY2subyk6IEJ1aWxkIGZyb20gc291cmNlIGluIGNvbW1vbiBkaXJlY3RvcnkuCi0JKHRhcmctbWFwLm8pOiBBZGQgZGVwZW5kZW5jeS4KLQkoY2xlYW4pOiBSZW1vdmUgZ2VudG1hcC4KLQotV2VkIEphbiAyOSAxMjoxNDoxOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIGlnZW4gd2Fzbid0IGFib3J0aW5nIGlmIHRoZSBvcGNvZGUgdGFibGUgY29udGFpbmVkIG5vIHZhbGlkCi0gCWZpZWxkcy4KLQkKLQkqIG1pc2MuYyAobmFtZTJpKTogUG9zc2libHkgYWJvcnQgaWYgYW4gaW52YWxpZCBuYW1lIGlzCi0gCWVuY291bnRlcmVkLgotCSogbGQtZGVjb2RlLmM6IEFib3J0IGlmIHRoZSB0YWJsZSB0eXBlIGlzbid0IGZvdW5kLgotCi1XZWQgSmFuIDI5IDEyOjE0OjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogV2hlbiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGlzIGRpc2FibGVkLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0bwotIAlkZXRlcm1pbmUgdGhlIHNpbXVsYXRpb24gc3BlZWQgYnkgbG9va2luZyBhdCB0aGUgbnVtYmVyIG9mIGVsYXBzZWQKLSAJdGlja3MgcmVjb3JkZWQgYnkgdGhlIGV2ZW50IHF1ZXVlLgotCQotCSogcHNpbS5jIChwc2ltX3dyaXRlX3JlZ2lzdGVyLCBwc2ltX3JlYWRfcmVnaXN0ZXIpOiBGb3JjZSB0aGUgY3B1Ci0gCXRvIHplcm8gd2hlbiBpdCBpcyBlaXRoZXIgb2YgYC0xJyBvciBgbnJfY3B1cycuICBJbiBib3RoIGNhc2VzIHRoZQotIAluZXh0IGNwdSB3b3VsZCBiZSB6ZXJvIGFueSB3YXkuCi0KLQkqIG1vbi5jIChtb25fcHJpbnRfaW5mbyk6IElmIHBvc3NpYmxlLCBwcmludCB0aGUgc3lzdGVtIGN5Y2xlCi0gCXBlcmZvcm1hbmNlLiAgVGhpcyBpcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCi0gCXBlciBzZWNvbmQuCi0KLVdlZCBKYW4gMjkgMTI6MTQ6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBUaGUgY29kZSB0byBhbGxvdyBhbiBldmVudCBxdWV1ZSB0byBiZSB1cGRhdGVkIGR1cmluZyBhIHNpZ25hbAotIAl3YXMgbWlzc2luZy4gIEZvciBtYWluLmMsIGEgY250cmwtYyBzaW11bGF0aW9uIHRlcm1pbmF0aW9uIHdhc24ndAotIAloYW5kbGVkIGNsZWFubHkuCi0JCi0JKiBUaGUgc2ltdWxhdGlvbiB3b3VsZCBub3QgY29ycmVjdGx5IHJlc3RhcnQgaWYgYW4gZXZlbnQgcmVxdWVzdGVkCi0gCXRoYXQgdGhlIHNpbXVsYXRpb24gYmUgaGFsdGVkLgotCQotCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBBZGQgaGFjayB0byAtaSBvcHRpb24gdG8gb3B0aW9uYWxseQotIAlpbmNsdWRlIGEgbGV2ZWwgdmlzIC1pMi4KLQkocHNpbV91c2FnZSk6IERvY3VtZW50LgotCi0JKiBtYWluLmMgKGNudHJsX2MsIGNudHJsX2Nfc2ltdWxhdGlvbik6IE5ldyBmdW5jdGlvbnMuICBXaGVuIGEKLSAJY250cmwtYyBvY2N1cmVzIHNjaGVkdWxlIGFuIGV2ZW50IHRvIGhhbHQgdGhlIHNpbXVsYXRpb24uCi0JKG1haW4pOiBDYXRjaCBDTlRSTC1DIHNpZ25hbHMgd2l0aCB0aGUgZnVuY3Rpb24gY250cmxfYy4KLQotCSogZXZlbnRzLmMgKGV2ZW50X3F1ZXVlX3Byb2Nlc3MpOiBNYXNrIGludGVycnVwdHMgd2hpbGUKLSAJbWFuaXB1bGF0aW5nIHRoZSBhc3luYyBldmVudCBxdWV1ZS4KLQkoZXZlbnRfcXVldWVfaW5pdCk6IERpdHRvLgotCShldmVudF9xdWV1ZV9zY2hlZHVsZV9hZnRlcl9zaWduYWwpOiBEaXR0by4KLQotCSogZXZlbnRzLmMgKGV2ZW50X3F1ZXVlX3Byb2Nlc3MpOiBNYXJrIHRoZSBldmVudCBxdWV1ZSBhcyBiZWluZyBpbgotIAl0aGUgcHJvY2Vzc2luZyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaGFzIHN0YXJ0ZWQuICBBZGp1c3QgY29kZQotCXNvIHRoYXQgaXQgaXMgdG9sZXJhbnQgb2YgaGFsdHMuCi0JKGV2ZW50X3F1ZXVlX2luaXQpOiBTdGFydCB0aGUgZXZlbnQgcXVldWUgb3V0IHdpdGggcHJvY2Vzc2luZwotIAlmYWxzZS4KLQkoZXZlbnRfcXVldWVfdGljayk6IENoZWNrIHRoYXQgcHJvY2Vzc2luZyBpc24ndCBzdGlsbCBiZWluZwotIAlwZXJmb3JtZWQuCi0JCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KTogQ2FsbAotIAlldmVudF9xdWV1ZV9wcm9jZXNzX2V2ZW50cyB0byBjbGVhciBwb3NzaWJseSBwZW5kaW5nIGV2ZW50cyBiZWZvcmUKLSAJc3RhcnRpbmcgYSBzaW11bGF0aW9uIHJ1bi4gIFJlLWFyYW5nZSBtYWluIGxvb3Agc28gdGhhdCBzaW11bGF0b3IKLSAJaXMgY29ycmVjdGx5IHJlc3RhcnRlZCB3aGVuIGFuIGV2ZW50IGhhbHRzIHRoZSBzaW11bGF0aW9uLgotCi0JKiBwc2ltLmMgKHBzaW1faGFsdCk6IEhhbmRsZSBhbiBldmVudCBoYWx0aW5nIHRoZSBzaW11bGF0aW9uLgotCSogcHNpbS5jIChwc2ltX2luaXQpOiBBZGp1c3QgaW5pdGlhbCBjcHUgLSA9PSAtMSAtIHRvIG1hdGNoCi0gCXJld29ya2VkIGlkZWNvZGUuCi0KLVdlZCBKYW4gMjkgMTI6MTQ6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBwcGMtb3Bjb2RlLWNvbXBsZXg6IENvcnJlY3QgdHlwbyAtIHdhcyBleHBhbmRpbmcgT1JBIGluc3RlYWQgb2YKLSAJUkEuICBCYXNlZCBvbiBpbnN0cnVjdGlvbiBmcmVxdWVuY3kgc3RhdHMsIGV4cGFuZCBhZGRpdGlvbmFsCi0gCWluc3RydWN0aW9ucy4KLQkqIHBwYy1pbnN0cnVjdGlvbnM6IENoYW5nZSBhbGwgYFJBID09IDAnIHRvIFJBX2lzXzAuCi0JCi0JKiBwcGMtb3Bjb2RlLXN0dXBpZDogTW92ZSBhbGwgYnV0IHRoZSBiYXNpYyB0YWJsZSBpbiAtY29tcGxleCBpbnRvCi0gCWhlcmUuICBVcGRhdGUgdG8gbmV3IGZvcm1hdC4KLQkKLQkqIE1ha2VmaWxlLmluICh0bXAtZGVmaW5lcyk6IE5ldyB0YXJnZXQuIEZvcmNlIGRlZmluZXMuaCB0byBhbHdheXMKLSAJYmUgYnVpbHQuICBIZW5jZSBnZXQgcHBjLW9wY29kZS1nb3RvIHRvIGJ1aWxkLgotCi1UdWUgSmFuIDI4IDEzOjAwOjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogaHdfY29tLmMgKGh3X2NvbV9pbnN0YW5jZV9yZWFkLCBod19jb21faW5zdGFuY2Vfd3JpdGUpOgotIAlJbXBsZW1lbnQuCi0JCi1UaHUgSmFuIDIzIDA5OjA3OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogaHdfdHJhY2UuYyAoaHdfdHJhY2VfaW5pdF9kYXRhKTogRGVsZXRlLiAgVGhlIHRyYWNlIG9wdGlvbnMgbmVlZAotIAl0byBiZSBpbml0aWFsaXplZCBpbmRlcGVuZGFudCBvZiB0aGUgcmVzdCBvZiB0aGUgc2ltdWxhdGlvbgotIAlpbml0YWxpemF0aW9uLiAgT3RoZXJ3aXplIGEgdHJhY2Ugb3B0aW9uIGV4cGxpY3RseSBzZXQgZnJvbSBnZGIKLSAJY291bGQgYmUgb3ZlcnJpZGRlbiBieSBod190cmFjZS4KLQotCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBDbGFyaWZ5IHJlYXNvbiB3aHkgdGhlIHRyYWNlIGlvY3RsIG9jY3VyZXMuCi0KLQkqIEZJWE1FOiBUaGUgdHJhY2UgY29kZSBpcyB0b28gc2NhdHRlcmVkIC0gaHdfdHJhY2UuYywgcHNpbS5jLAotIAlkZWJ1Zy5jLiAgSXQgY291bGQgYmUgbXVjaCBzaW1wbGVyLgotCi1UaHUgSmFuIDIzIDA5OjA3OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQkKLQkqIFNvbWUgZGV2aWNlcyBzdXBwb3J0IHJlbW92YWJsZSBtZWRpYS4gIEFkZCBob29rcyB0byB0aGUgZGlzawotIAlkZXZpY2Ugc28gdGhhdCBpdCBzdXBwb3J0cyB0aGlzLgotCQotCSogZGV2aWNlLmMgKGRldmljZV9hZGRfc3RyaW5nX2FycmF5X3Byb3BlcnR5LAotIAlkZXZpY2VfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb25zLCBtYW5pcHVsYXRlCi0gCXByb3BlcnRpZXMgY29udGFpbmluZyBhbiBhcnJheSBvZiBzdHJpbmdzLgotCShkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkpOiBBbGxvdyBhIHN0cmluZyBhcnJheS4KLQkoZGV2aWNlX2luaXRfc3RhdGljX3Byb3BlcnRpZXMpOiBVcGRhdGUuCi0JKGRldmljZV9pbml0X3J1bnRpbWVfcHJvcGVydGllcyk6IFVwZGF0ZS4KLQotCSogaHdfZGlzay5jIChod19kaXNrX2lvY3RsKTogQWRkIGlvY3RsIGZvciBjaGFuZ2luZyB0aGUgZGlzawotIAltZWRpYS4gIElmIG5vIGZpbGUgaW1hZ2UgaXMgc3BlY2lmaWVkLCB1c2UgdGhlIG5leHQgb25lIGluIHRoZQotIAlpbWFnZSBwcm9wZXJ0eSBsaXN0LgotCShod19kaXNrX2luaXRfYWRkcmVzcyk6IENoYW5nZSB0aGUgZmlsZSBwcm9wZXJ0eSBzbyB0aGF0IGl0IGlzIGEKLSAJc3RyaW5nIGFycmF5IC0gdXNlIHRoZSBmaXJzdCBlbnRyeSBmb3IgdGhlIGluaXRpYWwgZmlsZSBpbWFnZS4KLQotCSogdHJlZS5jIChwcmludF9zdHJpbmdfYXJheV9wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbiAtIHByaW50IGEKLSAJc3RyaW5nIGFycmF5LgotCShwcmludF9wcm9wZXJ0aWVzKTogQWRqdXN0LgotCShwcmludF9zdHJpbmcpOiBXcml0ZSBhIHN0cmluZywgaGFuZGxpbmcgZG91YmxlIHF1b3Rlcy4KLQotCSogZGV2aWNlLmg6IERlZmluZSBhbiBpb2N0bCB0byBgY2hhbmdlLW1lZGlhJyB3aXRoIGFuIG9wdGlvbmFsIG5ldwotIAltZWRpYSBpbWFnZS4KLQkKLQkqIGh3X2Rpc2suYzogQWxsb3cgZmxvcHB5IGRpc2sgZGV2aWNlcyB0byBiZSBzcGVjaWZpZWQuCi0KLQkqIHBzaW0uYyAocHNpbV9jb21tYW5kKTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBtb3JlIGNvbXBsZXggcHNpbQotIAljb21tYW5kcyBzdWNoIGFzICJjaGFuZ2UtbWVkaWEiIGFuZCAidHJhY2UiLgotCSogc2ltX2NhbGxzLmMgKHNpbV9kb19jb21tYW5kKTogVXNlLgotCi1XZWQgSmFuIDIyIDA5OjM4OjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogRm9yIGV4cHJlc3Npb25zIGxpa2UgKFJBID09IDApIHRoYXQgYXJlIGVudGVyZWQgaW4gdG8gdGhlIGNhY2hlCi0gCWFzIFJBX2lzXzAuIElmIHBvc3NpYmxlIGdlbmVyYXRlIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gc28KLSAJdGhhdCB0aGUgY29tcGlsZXIgZ2V0cyBhIGJldHRlciBjaGFuY2Ugb2YgZWxpbWluYXRpbmcgZGVhZAotIAlicmFuY2hlcy4KLQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IEZvciBhIGNhY2hlIGVudHJ5IG9mCi0gCXRoZSBmb3JtIDxuYW1lPl9pc188Y29uc3Q+IHdoZXJlIGl0IGlzIGEgYm9vbGVhbiBmaWVsZCwgZ2VuZXJhdGUKLSAJdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIHRoZSBleHByZXNzaW9uIGl0cyBzZWxmLgotCShwcmludF9pY2FjaGVfYm9keSk6IFJlbW92ZSBjb2RlIHRoYXQgd2FzIGxvb2tpbmcgZm9yICpfaXNfMCBhbmQKLSAJdGhlbiBnZW5lcmF0aW5nIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbnMuCi0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX3N0cnVjdCk6IElmIHRoZXJlIGlzIG5vIGNhY2hlLCBkbyBub3QKLSAJb3V0cHV0IGV4cHJlc3Npb25zIGluIGlkZWNvZGUuaCBmaWxlLgotCQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IE91dHB1dCB0aGVtIGhlcmUuCi0JCi0JKiBwcGMtb3Bjb2RlLWNvbXBsZXg6IENsYXJpZnkgY29uc3RhbnQgdmFsdWVzIGZvciBTUFI9PUxSIHJlZ2lzdGVyCi0gCWV4cGFuc2lvbi4KLQotCSogcHBjLWNhY2hlLXJ1bGVzIChSQV9pc18wLCBTUFJfaXNfMjU2KTogVHdvIG5ldyBjYWNoZSBlbnRyaWVzLgotCi1XZWQgSmFuIDIyIDEyOjI0OjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogVGhlIGNvZGUgdGhhdCBwdXQgdmFsdWVzIGluIGFuZCBleHRyYWN0ZWQgdmFsdWVzIGZyb20gdGhlIGNhY2hlCi0gCXdhcyB0b28gY29tcGlsaWNhdGVkLiAgVGhlIGNhY2hlIHRhYmxlIGRpZCBub3QgYWxsb3cgdmFsdWVzIHRvIGJlCi0gCWNvbXB1dGVkIGZyb20gY2FjaGUgZW50cmllcy4gICNkZWZpbmVzIGNvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGEKLSAJY2FjaGUgd2FzIHByZXNlbnQsIHJlbW92ZSB0aGUgcmVzdHJpY3Rpb24uCi0KLQkqIGxkLWNhY2hlLmgsIGxkLWNhY2hlLmM6IEFkZCBhIG5ldyBjYWNoZSBlbnRyeSB0eXBlIC0gU0NSQVRDSC4gIEEKLSAJc2NyYXRjaCB2YXJpYWJsZSBpcyBkZWZpbmVkIHdoZW4gYSBjYWNoZSBlbnRyeSBpcyBiZWluZgotIAlmaWxsZWQuIENoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIENPTVBVVEUgdmFyaWFibGUgdG8gYmUgZGVmaW5lZAotIAl3aGVuIHRoZSBjYWNoZSBlbnRyeSBpcyBiZWluZyB1c2VkLgotCSogZ2VuLWljYWNoZS5jOiBVcGRhdGUuCi0JCi0JKiBsZC1jYWNoZS5oLCBsZC1jYWNoZS5jOiBDaGFuZ2UgZmllbGQgbmFtZXMgc28gdGhhdCB0aGVpciBtZWFuaW5nCi0gCWlzIG1vcmUgb2J2aW91cy4gIG9sZF9uYW1lLT5maWVsZF9uYW1lLCBuZXdfbmFtZS0+ZGVyaXZlZF9uYW1lLgotCSogZ2VuLWljYWNoZS5jOiBVcGRhdGUKLQkKLQkqIGdlbi1pY2FjaGUuaCwgZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IE1ha2UgdGhlIHRocmVlCi0gCWRpZmZlcmVudCB0eXBlcyBvZiBjYWNoZSBjb2RlIC0gcHV0IGludG8gY2FjaGUsIGV4dHJhY3QgZnJvbQotIAljYWNoZSwgbm8gY2FjaGUgLSBhbiBleHBsaWNpdCBhcmd1bWVudCB0byBwcmludF9pY2FjaGVfYm9keS4KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEaXR0by4KLQkKLQkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfY19zZW1hbnRpYyk6IFVwZGF0ZSB1c2UuCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX2luc24pOiBVcGRhdGUgdXNlLgotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb24pOiBVcGRhdGUgdXNlLgotCi0JKiBpZ2VuLmMgKG1haW4pOiBDaGFuZ2UgJ1InIG9wdGlvbiBzbyB0aGF0IGl0IGRvZXMgbm90IGZvcmNlIHRoZQotIAljYWNoZS4KLQotCSogY29uZmlndXJlLmluIChlbmFibGUtc2ltLWljYWNoZSk6IENsYXJpZnkgZGVzY3JpcHRpb24uICBNYWtlCi0gCSNkZWZpbmUgb25lIG9mIHRoZSBkZWZhdWx0cyByZWdhcmRsZXNzIG9mIHRoZSBjYWNoZS4gIFByb2JhYmx5Ci0gCXNob3VsZCByZXZhbXAgYW5kIGFkZCBhIHNlcGFyYXRlIG9wdGlvbi4KLQotVHVlIEphbiAyMSAxMzoyNjoxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIHBrX2Rpc2tsYWJlbC5jIChibG9ja19pc19mZGlzayk6IFRpZHkgdXAgdHJhY2VzIC0gdXNlIGRvcwotIAlwYXJ0aXRpb24gbnVtYmVyaW5nLgotCShwa19kaXNrbGFiZWxfY3JlYXRlX2luc3RhbmNlKTogUGFydGl0aW9uIDEuLjQgYXJlIHZhbGlkIC0gbm90Ci0gCTEuLjMuCi0JKGlzX2lzbzk2NjApOiBOZXcgZnVuY3Rpb24sIHZlcmlmeSBhIENEOTY2MCBGaWxlIHN5c3RlbS4KLQkocGtfZGlza2xhYmVsX2NyZWF0ZV9pbnN0YW5jZSk6IFN0YXJ0IGV4cGFuZGluZyBzbyB0aGF0IGFjdGl2ZQotIAlwYXJ0aXRpb24gc2VsZWN0aW9uIGlzIHN1cHBvcnRlZC4KLQotTW9uIEphbiAyMCAxMToyMDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIFRoZSBjYXAgb2JqZWN0IHdhcyByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIG9mIGEKLSAJZGV2aWNlIGFmdGVyIGl0IHdhcyBkZWxldGVkLiBJbnN0ZWFkIGFkZCBhbmQgcmVtb3ZlIGNhcCdzIGZyb20gdGhlCi0gCWNhcCBkYiBhcyB0aGV5IGFyZSBjcmVhdGVkIGFuZCBkZWxldGVkLiAgVGhpcyBlbnN1cmluZyB0aGF0IGEKLSAJY2FwaWJpbGl0eSBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgY29ycmVzcG9uZGluZwotIAlvYmplY3QuCi0JCi0JKiBjYXAuaCwgY2FwLmM6IENvcnJlY3QgY2FwIHR5cGUgLSB3YXMgc2lnbmVkMzIgc2hvdWxkIGJlCi0gCXNpZ25lZF9jZWxsLgotCQotCSogY2FwLmMgKGNhcF9hZGQsIGNhcF9yZW1vdmUpOiBOZXcgbWV0aG9kcyBmb3IgY2FwIG9iamVjdCB0aGF0Ci0gCWFsbG93IHRoZSBleHBsaWNpdCBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiBpbnRlcm5hbCBvYmplY3RzIHRoYXQKLSAJdGhlIGNhcCBrbm93cyBhYm91dC4KLQkKLQkqIGNhcC5jIChjYXBfaW5pdCk6IFJld3JpdGUuICBWZXJpZnkgdGhhdCB0aGUgb25seSBvYmplY3RzCi0gCXJlbWFpbmluZyBpbiB0aGUgY2FwIGRhdGEgYmFzZSBhcmUgdGhvc2UgdGhhdCB3ZXJlIGVudGVyZWQgZmlyc3QuCi0gIAlUaHNlIG9iamVjdHMgd2lsbCBiZSB0aGUgcGVybWVuYW50IG9uZXMuCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfYWRkcmVzcyk6IFJlbWVtYmVyIHRvIGluaXRpYWxpemUgdGhlIGNhcAotIAlkYXRhYmFzZS4KLQkKLQkqIGRldmljZS5jIChkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBFeHBsaWNpdGx5IGFkZCBkZXZpY2UKLSAJaW5zdGFuY2VzIHRvIHRoZSBjYXAgZGF0YWJhc2UuICBTaW1wbGlmeSBjcmVhdGUgY29kZS4KLQkoZGV2aWNlX2luc3RhbmNlX2RlbGV0ZSk6IEV4cGxpY2l0bHkgcmVtb3ZlIGRldmljZSBpbnN0YW5jZXMgZnJvbQotIAl0aGUgY2FwIGRhdGFiYXNlLgotCQotCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IEV4cGxpY2l0bHkgYWRkIGEgZGV2aWNlIHRvIHRoZQotIAljYXAgZGF0YSBiYXNlLgotCQotCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IEFsd2F5cyBzZXQgdGhlIGNhcCBtZW1iZXJzLgotCi0JKiBod19kaXNrLmM6IE91dHB1dCB0aGUgaW5zdGFuY2Ugd2hlbiB0cmFjaW5nLgotCQotU3VuIEphbiAxOSAxNjo0NDoyOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIHRyZWUuYyAoc3BsaXRfZGV2aWNlX3NwZWNpZmllcik6IEFkZCBzdXBwb3J0IGZvciBhbGlhc2VzIHdoZW4KLSAJbG9va2luZyB1cCBhIGRldmljZS4gTm93IG5lZWRzIGEgZGV2aWNlIGFzIGFuIGFyZ3VtZW50LgotCShzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIpOiBEaXR0by4KLQotU3VuIEphbiAxOSAxNToyODoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIFRoZSBtZW1vcnkgImNsYWltIiBhbmQgInJlbGVhc2UiIG1ldGhvZHMgdGFrZSBhbiBhZGRyZXNzIGFuZAotIAlzaXplIGFzIGFyZ3VtZW50cy4gIFRoZXNlIG1heSBiZSBtdWx0aSBjZWxsIHZhbHVlcy4gSW5pdGlhbGx5IGZpeAotIAl0aGUgbWVtb3J5IGNvZGUgc28gdGhhdCB0aGV5IGNoZWNrL2RldGVjdCB0aGlzLiAgTGVhdmUgdGhlCi0gCWFkanVzdG1lbnQgb2YgYW55IGNsaWVudHMgdG8gbGF0ZXIuCi0JCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltLAotIAlod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IEhhbmRsZSBtdWx0aS1jZWxsIG1lbW9yeSBkZXZpY2VzLgotCQotCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9pbnN0YW5jZV9jbGFpbSk6IEJlIHRvbGVyYW50IHRvd2FyZHMgdGhlCi0gCXJlbGVhc2Ugb2YgbWVtb3J5IHJlZ2lvbnMgdGhhdCB3ZXJlIG5vdCBjbGFpbWVkLgotCi1GcmkgSmFuIDE3IDEyOjAxOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QpOiBDb3JyZWN0IHJldHVybgotIAl0eXBlIC0gY2FuIHJldHVybiBlaXRoZXIgMCBvciAtMSwgaGVuY2Ugc2hvdWxkIGJlIGEgc2lnbmVkIHR5cGUuCi0JKiBkZXZpY2VfdGFibGUuaDogRGl0dG8uCi0JCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltLAotIAlod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IFVwZGF0ZS4KLQkqIGh3X2Rpc2suYyAoaHdfZGlza19tYXhfdHJhbnNmZXIsIGh3X2Rpc2tfYmxvY2tfc2l6ZSwKLSAJaHdfZGlza19ucl9ibG9ja3MpOiBEaXR0by4KLQkKLUZyaSBKYW4gMTcgMTE6NTA6MTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfY2xhaW0pOiBJbXBsZW1lbnQgdXNpbmcgdGhlICJjbGFpbSIKLSAJbWV0aG9kIGJlbG9uZ2luZyB0byAiL2Nob3Nlbi9tZW1vcnkiLgotCShjaGlybV9lbXVsX3JlbGVhc2UpOiBEaXR0by4KLQkKLQkqIE1ha2VmaWxlLmluIChMSUJfSU5MSU5FX1NSQyk6IFJlbW92ZSBlbXVsXyogZnJvbSBsaXN0IG9mIGZpbGVzCi0gCXRoYXQgYXJlIGlubGluZWQuICBUaGVzZSBtb2R1bGVzIGFyZSBjYWxsZWQgdmlhIGEgdGFibGUgYW5kIGFyZQotIAlub3QgbWFkZSBpbmxpbmUuCi0KLQkqIGh3X2luaXQuYyAodXBkYXRlX2Zvcl9iaW5hcnlfc2VjdGlvbik6IEZpeCBmYWlsdXJlIHRvIGFsbG9jYXRlCi0gCW1lbW9yeSB1c2VkIGJ5IHRoZSBiaW5hcnkgaW4gcmVhbC1tb2RlIGV4ZWN1dGlvbnMuIElmICJjbGFpbSIKLSAJcHJvcGVydHkgaXMgcHJlc2VudCwgYWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlICIvY2hvc2VuL21lbW9yeSIKLSAJZGV2aWNlLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogU3BlY2lmeSB0aGF0IG1lbW9yeSBzaG91bGQgYmUKLSAJY2xhaW1lZCB3aGVuIGxvYWRpbmcgYSByZWFsIGltYWdlLgotCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltKTogRG9uJ3QgcGFnZSBhbGlnbiBtZW1vcnkKLSAJYWxsb2NhdGlvbnMuCi0KLQkqIGh3X21lbW9yeS5jIChod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IEF2b2lkIGluZmluaXRlIGxvb3AKLSAJd2hlbiBtZXJnaW5nIGFkamFjZW50IG1lbW9yeSBjaHVua3MuCi0KLVRodSBKYW4gMTYgMDg6NTE6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiB2bS5oICh2bV9kYXRhX21hcF9yZWFkX2J1ZmZlciwgdm1fZGF0YV9tYXBfd3JpdGVfYnVmZmVyKTogQWRkCi0gCW9wdGlvbmFsIFBST0NFU1NPUiAmIENJQSBhcmdzIHNvIHRoYXQgdGhpcyByb3V0aW5lIGFsc28gYWJvcnQgYW4KLSAJYWNjZXNzLgotCi0JKiB2bV9uLmggKHZtX2RhdGFfbWFwX3JlYWRfTiwgdm1fZGF0YV9tYXBfd3JpdGVfTik6IEZvciBhCi0gCW1pc3MtYWxpZ25lZCBhY2Nlc3Mgd2hlbiBhIHRyYW5zZmVyIGZhaWxzIGFib3J0LgotCQotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfZG9fd3JpdGUpOiBVc2UgZW11bF9yZWFkX2J1ZmZlcgotIAlpbnN0ZWFkIG9mIHRoZSB2bV9yZWFkX2J1ZmZlci4KLQkqIGVtdWxfbmV0YnNkLmMgKGRvX3dyaXRlKTogRGl0dG8uCi0JKiBlbXVsX3VuaXguYyAoZG9fdW5peF93cml0ZSk6IERpdHRvLgotCi1XZWQgSmFuIDE1IDE0OjM4OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tanVtcCk6IERlZmF1bHQgaXMgTlVMTCBhbmQgbm90IC1FLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCQotCSogYmFzaWNzLmggKF9fYXR0cmlidXRlX18pOiBFbmFibGUgYXR0cmlidXRlcyBpZiBHQ0MgPj0gMi42LgotCShVTlVTRUQpOiBPbmx5IGVuYWJsZSBVTlVTRUQgaWYgR0NDID49IDIuNy4KLQkKLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBQcmludCBVTlVTRUQgbWFjcm8KLSAJaW5zdGVhZCBvZiBleHBsaWNpdCBfX3VudXNlZF9fIGF0dHJpYnV0ZS4KLQkocHJpbnRfaWNhY2hlX2JvZHkpOiBEaXR0by4KLQkqIGlkZWNvZGVfZXhwcmVzc2lvbi5oIChGUFNDUl9CRUdJTik6IFVzZSBVTlVTRUQuCi0KLVdlZCBKYW4gMTUgMTM6NTQ6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBjcHUuaCwgY3B1LmMgKGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KTogQWRkIENJQSBhcmd1bWVudCBhcwotIAlyZWZlcmVuY2UgcG9pbnQuCi0KLQkqIHZtLmMgKHZtX3N5bmNocm9uaXplX2NvbnRleHQpOiBBZGQgUFJPQ0VTU09SIGFuZCBDSUEgYXMKLSAJYXJndW1lbnRzIHNvIHRoYXQgdGhlcmUgaXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIHJlY292ZXJ5LgotCSh2bV9zeW5jaHJvbml6ZV9jb250ZXh0KTogUGFzcyBwcm9jZXNzb3IrY2lhIGZvciBlcnJvcnMuCi0JKG9tX3VucGFja19zcik6IERpdHRvLgotCShvbV91bnBhY2tfc3JzKTogRGl0dG8uCi0JKiB2bS5jICh2bV9jcmVhdGUpOiBSZXZpZXcgZXJyb3IgbWVzc2FnZXMuCi0KLQkqIHZtLmM6IEluY2x1ZGUgImNwdS5oIiBzbyB0aGF0IGNwdV9lcnJvciBpcyB2aXNpYmxlLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChSZXR1cm4gRnJvbSBJbnRlcnJ1cHQpOiBQYXNzIENJQS4KLQkoSW5zdHJ1Y3Rpb24gU3luY2hyb25pemUpOiBEaXR0by4KLQkqIHBzaW0uYyAocHNpbV9pbml0KTogRGl0dG8uCi0KLVdlZCBKYW4gMTUgMTI6MjU6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBjcHUuaCwgY3B1LmMgKGNwdV9lcnJvcik6IEFib3J0cyBzaW11bGF0aW9uIHdpdGggZXJyb3IgbWVzc2FnZSwKLSAJYnV0IGFsc28gc2F2ZXMgY3VycmVudCBwcm9jZXNzb3Igc3RhdGUuCi0JCi0JKiBiYXNpY3MuaDogTW92ZSAjaW5jbHVkZSA8c3RkYXJnLmg+IHRvIGhlcmUgZnJvbSBkZXZpY2VfdGFibGUuaC4KLQotCSogaW50ZXJydXB0cy5jIChwZXJmb3JtX29lYV9pbnRlcnJ1cHQpOiBVc2UuICBObyBsb25nZXIgbG9vc2UgQ0lBCi0gCXdoZW4gc2ltdWxhdGlvbiBhYm9ydGVkLgotCShwcm9ncmFtX2ludGVycnVwdCk6IERpdHRvLgotCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoYWxpZ25tZW50X2ludGVycnVwdCk6IERpdHRvLgotCShmbG9hdGluZ19wb2ludF9hc3Npc3RfaW50ZXJydXB0KTogRGl0dG8uCi0JKHBlcmZvcm1fb2VhX2ludGVycnVwdCk6IERpdHRvLgotCShtYWNoaW5lX2NoZWNrX2ludGVycnVwdCk6IERpdHRvLgotCi1UdWUgSmFuIDE0IDEyOjE5OjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoTW92ZSBmcm9tIFNwZWNpYWwgUHVycG9zZSBSZWdpc3Rlcik6IFN1cHBvcnQKLSAJbW92ZSBmcm9tIERFQy4KLQotTW9uIEphbiAxMyAxNjo1ODoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIGRlYnVnLmgsIGRlYnVnLmM6IEFkZCAiaW50ZXJydXB0cyIgdHJhY2Ugb3B0aW9uLgotCi0JKiBpbnRlcnJ1cHRzLmMgKGRhdGFfc3RvcmFnZV9pbnRlcnJ1cHQpOiBBZGQgdHJhY2luZy4KLQkobWFjaGluZV9jaGVja19pbnRlcnJ1cHQpOiBEaXR0by4KLQkoaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoYWxpZ25tZW50X2ludGVycnVwdCk6IERpdHRvLgotCShwcm9ncmFtX2ludGVycnVwdCk6IERpdHRvLgotCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoc3lzdGVtX2NhbGxfaW50ZXJydXB0KTogRGl0dG8uCi0JKGZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoZGVsaXZlcl9oYXJkd2FyZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkKLQkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgVUVBIG1vZGUsIGhhbHQgdGhlCi0gCXByb2Nlc3NvciAtIHNvIHRoYXQgdGhlIGN1cnJlbnQgc3RhdGUgaXMgc2F2ZWQgLSBpbnN0ZWFkIG9mCi0gCWFib3J0aW5nLgotCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdCk6IERpdHRvLgotCi1UaHUgSmFuICAyIDA5OjEwOjQxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogaW50ZXJydXB0cy5jIChwZXJmb3JtX29lYV9pbnRlcnJ1cHQpOiBIYWx0IHJhdGhlciB0aGFuIGFib3J0IG9uCi0gCWEgZG91YmxlIGludGVycnVwdC4KLQotV2VkIEphbiAgMSAyMjo1NDo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKFN0b3JlIE11bHRpcGxlIFdvcmQsIExvYWQgTXVsdGlwbGUgV29yZCk6Ci0gCUVuYWJsZS4KLQotCSogdHJlZS5jIChwcmludF9wcm9wZXJ0aWVzKTogRm9yIGFuIGFycmF5IGNvbnNpZGVyIHByaW50aW5nIGl0IG91dAotIAlhcyBhbiBpbnRlZ2VyIGFycmF5LgotCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IElmIGFuICJhdmFpbGFibGUiIHByb3BlcnR5Ci0gCWlzIHByZXNlbnQsIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIGF2YWlsYWJsZSBtZW1vcnkgaW5zdGVhZCBvZgotIAl1c2luZyB0aGUgcmVnIHByb3BlcnR5LgotCi0JKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IEFkZCAiYXZhaWxhYmxlIgotIAlwcm9wZXJ0eSB0byBtZW1vcnkgZGV2aWNlLgotCi1GcmkgRGVjIDIwIDEzOjE5OjA3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoUm90YXRlIExlZnQgV29yZCB0aGVuIEFORCB3aXRoIE1hc2spOiBFbmFibGUuCi0KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QpOiBXYXMgb25seSBsb29raW5nIGF0IHRoZQotIAlmaXJzdCBtZXRob2QuCi0KLQkqIGh3X2Rpc2suYyAoaHdfZGlza19ucl9ibG9ja3MpOiBJbXBsZW1lbnQgI2Jsb2NrcyBtZXRob2QuCi0JKGh3X2Rpc2tfYmxvY2tfc2l6ZSk6IEltcGxlbWVudCBibG9jay1zaXplIG1ldGhvZC4KLQkoaHdfZGlza19tYXhfdHJhbnNmZXIpOiBJbXBsZW1lbnQgbWF4LXRyYW5zZmVyIG1ldGhvZC4KLQotCSogaHdfcGhiLmMgKGh3X3BoYl9pbml0X2FkZHJlc3MpOiBSZWluaXQgdGhlIHJlc3Qgb2YgdGhlIFBIQi4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhdGgpOiBSZWNvdmVyIGZyb20gYW4KLSAJaW52YWxpZCBpaGFuZGxlLgotCShjaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhY2thZ2UpOiBEaXR0by4KLQkoY2hpcnBfZW11bF9tZXRob2QpOiBEaXR0by4KLQkoY2hpcnBfZW11bF9yZWFkKTogRGl0dG8uCi0JKGNoaXJwX2VtdWxfd3JpdGUpOiBEaXR0by4KLQkoY2hpcnBfZW11bF9jbG9zZSk6IERpdHRvLgotCShjaGlycF9lbXVsX3NlZWspOiBEaXR0by4KLQkoY2hpcnBfZW11bF9wYWNrYWdlX3RvX3BhdGgpOiBEaXR0byAoZm9yIHBoYW5kbGUpLgotCShjaGlycF9lbXVsX3BhY2thZ2VfdG9fcGF0aCk6IFJldHVybiB0aGUgbGVuZ3RoLgotCi0JKiBwc2ltLmMgKHBzaW1fbWVyZ2VfZGV2aWNlX2ZpbGUpOiBBbGxvdyBjb250aW51YXRpb24gbGluZXMuCi0KLVRodSBEZWMgMTkgMTE6MDk6NDMgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfYm9vdCk6IEltcGxlbWVudC4gV2VsbCByZXBvcnQgdGhlIG5ldwotIAlzdHJpbmcgYW5kIGV4aXQuCi0JCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZXhpdCk6IENvcnJlY3QgdHlwZSBvZiBhcmdzIHN0cnVjdAotIAltZW1iZXJzIC0gKl9jZWxsIG5vdCBob3N0IGRlcGVuZGFudCBpbnQuCi0KLVdlZCBEZWMgMTggMTc6NDk6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBpbnRlcnJ1cHRzLmMgKHBlcmZvcm1fb2VhX2ludGVycnVwdCk6IFByaW50IGFkZGl0aW9uYWwKLSAJaW5mb3JtYXRpb24gaWYgYSBkb3VibGUgaW50ZXJydXB0IGlzIGVuY291bnRlcmVkLgotCi1XZWQgRGVjIDE4IDE3OjQ5OjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQkKLQkqIHBzaW0uYyAocHNpbV9tZXJnZV9kZXZpY2VfZmlsZSk6IFRvbGVyYXRlIGFuIGluY29ycmVjdCBmaWxlLW5hbWUKLSAJYmVpbmcgc3BlY2lmaWVkIHdpdGggdGhlIC1mIG9wdGlvbi4KLQkocHNpbV9tZXJnZV9kZXZpY2VfZmlsZSk6IENvcnJlY3QgY2hlY2sgZm9yIGVuZCBvZiBzdHJpbmcuCi0KLVdlZCBEZWMgMTggMTc6NDk6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3BlZXIpOiBXYXMgZmFsbGluZyBvZmYgdGhlIGVuZCBvZiB0aGUKLSAJbGlzdCBvZiBkZXZpY2VzLiBSZXR1cm4gemVybyB0byB0aGUgY2xpZW50IGluc3RlYWQuCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfY2hpbGQpOiBEaXR0bwotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3BhcmVudCk6IERpdHRvCi0KLQkqIGRldmljZS5jIChkZXZpY2Vfcm9vdCk6IEFzc2VydCBhc3N1bXB0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcKLSAJdmFsaWQuCi0KLVR1ZSBEZWMgMTcgMTU6MTI6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogQWRkIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvCi0gCWVhY2ggc2lnbmlmaWNhbnQgbm9kZSBpbiB0aGUgZGV2aWNlIHRyZWUuCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBEaXR0by4KLQotRnJpIERlYyAxMyAxNDozMDozMSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIG1haW4uYyAoc2ltX2lvX3JlYWRfc3RkaW4pOiBGb3IgYSBzaW5nbGUgYnl0ZSBTVERJTyByZWFkLCB1c2UgYQotIAl0ZW1wb2FyeSB0d28gYnl0ZSBidWZmZXIuICBTaW5nbGUgYnl0ZSByZWFkIHdpdGggZmdldHMgd2lsbCBub3QKLSAJd29yay4KLQkqIG1haW4uYzogSW5jbHVkZSBlcnJuby5oLgotCShzaW1faW9fcmVhZF9zdGRpbik6IEZvciBub24tU1RESU8sIG1ha2UgaXQgd29yay4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3JlYWQpOiBSZXR1cm4gdGhlIGNvcnJlY3QgZXJyb3Igc3RhdHVzLgotCi1GcmkgRGVjIDEzIDE0OjMwOjMxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogc3RkLWNvbmZpZy5oIChXSVRIX1NURElPKTogRG9uJ3QgaGFyZC13aXJlIHRoZSBTVERJTyBtZWNoYW5pc20uCi0gIAlJbnN0ZWFkIGhhdmUgZWFjaCBlbXVsYXRpb24gZGVmYXVsdCBpdCB0byBET19VU0VfU1RESU8uCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBTZWxlY3QgdGhlIFNURElPIEkvTwotIAltZWNoYW5pc20gYXMgdGhlIGRlZmF1bHQgaWYgZW5hYmxlZCBvciBpZiBub3RoaW5nIHNlbGVjdGVkLgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX2lvX3JlYWRfc3RkaW4pOiBQYXNzaWZ5IEdDQydzIGRlc2lyZSBmb3IgYQotIAlyZXR1cm4gdmFsdWUuCi0JKHNpbV9pb193cml0ZV9zdGRvdXQpOiBEaXR0by4KLQkoc2ltX2lvX3dyaXRlX3N0ZGVycik6IERpdHRvLgotCSogbWFpbi5jIChzaW1faW9fd3JpdGVfc3Rkb3V0KTogRGl0dG8uCi0JKHNpbV9pb193cml0ZV9zdGRlcnIpOiBEaXR0by4KLQkoc2ltX2lvX3JlYWRfc3RkaW4pOiBEaXR0by4KLQotVHVlIERlYyAxMCAxMDozMTo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKTogTWFrZSAqcHJpbnRmIGNhbGxzCi0JdHlwZSBjb3JyZWN0LgotCSogdm0uYyAob21fZWZmZWN0aXZlX3RvX3ZpcnR1YWwpOiBEaXR0by4KLQkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9zY2hlZHVsZXssX2FmdGVyX3NpZ25hbH0pOiBEaXR0by4KLQkoZXZlbnRfcXVldWVfe2Rlc2NoZWR1bGUscHJvY2Vzc30pOiBEaXR0by4KLQkqIGh3X2h0YWIuYyAoaHRhYl9kZWNvZGVfaGFzaF90YWJsZSk6IERpdHRvLgotCShodGFiX21hcF97cGFnZSxiaW5hcnl9KTogRGl0dG8uCi0JKiBod19vcGljLmMgKGh3X29waWNfaW5pdF9kYXRhKTogRGl0dG8uCi0JKGhhbmRsZV9pbnRlcnJ1cHQpOiBEaXR0by4KLQkoZG9fcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXJfe3JlYWQsd3JpdGV9KTogRGl0dG8uCi0JKHdyaXRlX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcik6IERpdHRvLgotCSh7cmVhZCx3cml0ZX1fZGVzdGluYXRpb25fcmVnaXN0ZXIpOiBEaXR0by4KLQkoZG9fc3VwcmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3tyZWFkLHdyaXRlfSk6IERpdHRvLgotCShkb19jdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTl97cmVhZCx3cml0ZX0pOiBEaXR0by4KLQkoZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl97cmVhZCx3cml0ZX0pOiBEaXR0by4KLQkoZG9fdGltZXJfTl97Y3VycmVudCxiYXNlfV9jb3VudF9yZWdpc3Rlcl97cmVhZCx3cml0ZX0pOiBEaXR0by4KLQkoZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUpOiBEaXR0by4KLQkoZG9fdmVuZG9yX2lkZW50aWZpY2F0aW9uX3JlZ2lzdGVyX3JlYWQpOiBEaXR0by4KLQkoZG9fZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTl9yZWFkKTogRGl0dG8uCi0JKGRvX2dsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX05fe3JlYWQsd3JpdGV9KTogRGl0dG8uCi0JKiBod19waGIuYyAoaHdfcGhiX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCi0JKGh3X3BoYl91bml0X2RlY29kZSk6IERpdHRvLgotCShod19waGJfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyk6IERpdHRvLgotCShod19waGJfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcik6IERpdHRvLgotCSogaHdfaWRlLmMgKHNldHVwX2ZpZm8pOiBEaXR0by4KLQotCSogc2ltX2NhbGxzLmMgKHtkZWZzLGNhbGxiYWNrLHJlbW90ZS1zaW19LmgpOiBGaW5kIGdkYiBpbmNsdWRlCi0JZmlsZXMgdmlhIC1JPGRpcj4gaW5zdGVhZCBvZiB1c2luZyAiLi4vLi4vZ2RiLyIgcHJlZml4ZXMuCi0KLVR1ZSBEZWMgMTAgMTA6MTI6NDQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBkZWJ1Zy5oOiBBZGQgdHJhY2luZyBmb3IgdGhlIHBhbCBkZXZpY2UuCi0JKiBod19wYWwuYzogVXBkYXRlLgotCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZ2V0cHJvcCk6IE1vcmUgdHJhY2luZy4KLQotVHVlIERlYyAxMCAxMDoxMjo0NCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KTogTmV3Ci0gCWZ1bmN0aW9uLiBSZXZlcnNlIG9mIGFkZF9paGFuZGxlX3J1bnRpbWUgcHJvcGVydHkuCi0JKGRldmljZV9pbml0X3J1bnRpbWVfcHJvcGVydGllcyk6IFVzZSBpdC4KLQkKLQkqIGRldmljZS5jIChmaW5kX3Byb3BlcnR5X2VudHJ5KTogTmV3IGZ1bmN0aW9uIHJldHVybnMgdGhlCi0gCWludGVybmFsIHByb3BlcnR5IHNwZWMuCi0JKGRldmljZV9zZXRfcHJvcGVydHkpOiBVc2UuCi0JKGRldmljZV9maW5kX3Byb3BlcnR5KTogVXNlLgotCi1UdWUgRGVjIDEwIDEwOjEyOjQ0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogcHNpbS5jIChwc2ltX21lcmdlX2RldmljZV9maWxlKTogU3RyaXAgbmV3bGluZSBmcm9tIGRldmljZQotIAlzcGVjcy4KLQkKLVR1ZSBEZWMgMTAgMTA6MTI6NDQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBod19odGFiLmMgKGh0YWJfbWFwX2JpbmFyeSk6IEZvciBvdmVybGFwcGluZyB0ZXh0IC8gZGF0YSBtYXBzCi0gCW1lcmdlIHRoZSB0d28uICBBbHNvIGNoZWNrIHRoYXQgdGhlIG1lcmdlIGlzIHNhZmUuCi0KLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBZGQgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSB0bwotIAl0aGUgcHRlJ3Mgc28gdGhhdCB0aGV5IGFyZSBlYXNpZXIgdG8gaWRlbnRpZnkuCi0JCi0JKGVtdWxfY2hpcnBfY3JlYXRlKTogRG9uJ3Qgc3BlY2lmeSBhIGxvYWQgYWRkcmVzcyBmb3IgdGhlIENIUlAKLSAJaW1hZ2UuICBBbHdheXMgdXNlIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBleGVjdXRhYmxlLgotCi0JKiBod19odGFiLmMgKGh0YWJfbWFwX3BhZ2UpOiBBYm9ydCBpZiBhIGR1cGxpY2F0ZSBtYXAgaXMKLSAJZW5jb3VudGVyZWQuCi0KLU1vbiBEZWMgIDkgMTI6MDg6NDYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBod19odGFiLmMgKGh0YWJfbWFwX3BhZ2UpOiBGb3JtYXR0aW5nLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCk6IENoZWNrIGZvciBhIE5VTEwKLSAJbWV0aG9kIG5hbWUgd2hlbiBoYW5kbGluZyB0aGUgY2xpZW50IGNhbGwuIEFsc28gY2hlY2sgZm9yIG90aGVyCi0gCWJhZCBjYWxsIGFyZ3VtZW50cy4KLQkKLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBbGxvdyByZWFsLW1vZGU/LCByZWFsLWJhc2UsCi0gCWV0YyB0byBiZSBvdmVycmlkZW4uCi0KLU1vbiBEZWMgIDkgMTI6MDg6NDYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBvc19lbXVsLmMgKG9zX2VtdWxfY3JlYXRlKTogVXNlIHRyZWUgZmluZCBwcm9wZXJ0eSBpbnN0ZWFkIG9mCi0gCWRldmljZSBmaW5kIHByb3BlcnR5IC0gc2lnaC4KLQotVGh1IERlYyAgNSAxMDo0Njo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIDk2MTIwNTogUmVsZWFzZSBzbmFwc2hvdCA5NjEyMDUuCi0JCi1UaHUgRGVjICA1IDEwOjQ2OjQyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChob3N0Yml0c2l6ZSwgYml0c2l6ZSk6IEZpeCB0eXBvIGluIGVycm9yIG1lc3NhZ2UgLQotIAljYW5ub3QgY29udGFpbiBhIGNvbW1hLgotCShzaW0td2FybmluZ3MpOiBDaGVjayBmb3IgbW9yZSBwb3RlbnRpYWwgZXJyb3JzLgotCi0JKiBwc2ltLmMgKHBzaW1fdXNhZ2UpOiBBZGQgLWYgPGZpbGU+IG9wdGlvbi4gIFNwZWNpZmllcyBhIGZpbGUKLSAJY29udGFpbmluZyBkZXZpY2UgdHJlZSBzcGVjaWZpY2F0aW9ucyB0aGF0IHNob3VsZCBiZSBtZXJnZWQgaW50bwotIAl0aGUgZGV2aWNlIHRyZWUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU29ydCBvcHRpb25zLgotCSogY29uZmlndXJlOiBSZWJ1aWxkCi0JCi1XZWQgRGVjICA0IDEzOjU3OjMxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogcHNpbS5jIChwc2ltX3VzYWdlKTogQWRkIC1uIG9wdGlvbiAtIHNwZWNpZnkgbnVtYmVyIG9mCi0gCXByb2Nlc3NvcnMuCi0KLQkqIGVtdWxfY2hpcnAuYzogQWRkIGRlc2NyaXB0aW9uLgotCSogZW11bF9idWdhcGkuYzogRGl0dG8uCi0JKiBlbXVsX3VuaXguYzogRGl0dG8uCi0JKiBlbXVsX25ldGJzZC5jOiBEaXR0by4KLQotRnJpIE5vdiAyOSAxMToxMjoyMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIGh3X3BhbC5jIChod19wYWxfYXR0YWNoX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24sIGlmIGFuIGF0dGFjaCBpcwotIAllbmNvdW50ZXJlZCwgYXNzdW1lIHRoYXQgaXQgaXMgdGhlIHNpbmdsZSBkaXNrLgotCSogaHdfcGFsLmM6IEFkZCBnZW5lcmljIGRldmljZS9zaXplIGRlY29kZSBtZXRob2RzLgotCQotCSogaHdfbnZyYW0uYyAoaHdfbnZyYW1faW5pdF9hZGRyZXNzKTogVXNlIHRoZSBmaXJzdCBub256ZXJvIHJlZwotIAlwcm9wZXJ0eSBlbnRyeSB3aGVuIGRldGVybWluaW5nIHRoZSBudnJhbSBzaXplLgotCi0JKiBod19jb3JlLmM6IEFkZCBnZW5lcmljIGFkZHJlc3Mvc2l6ZSBkZWNvZGUgbWV0aG9kcy4KLQotCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwpOiBSZXR1cm4gYW5kIHRyYWNlCi0gCW5vbnplcm8gc3RhdHVzIGZyb20gY2xpZW50IGZ1bmN0aW9ucy4KLQotCSogbWFpbi5jIChlcnJvcik6IEFsd2F5cyBpbmNsdWRlIGEgY2FyaWFnZSByZXR1cm4gd2hlbiB3cml0aW5nIG91dAotCWVycm9ycy4KLQotV2VkIE5vdiAyMCAwMDozNjo1NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX3Jlc3VtZSk6IFJlc2V0IHNpbV9zaG91bGRfcnVuIGlmIHNpbmdsZQotIAlzdGVwcGluZy4KLQotVGh1IE5vdiAyOCAxMzoxOTo0NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2RvX2Rpc2tpbyk6IEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZQotIAlvcHRpb25hbCBkaXNrcy4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBEcm9wIHRoZSBkdW1teSBlZXByb20uCi0gIAlBdHRhY2ggdGhlIHBhbCAtIGZvciBJL08gLSBhcyBhIHBzZXVkbyBkZXZpY2UgaGFuaW5nIGZyb20gdGhlCi0gCWZpcm13YXJlIHN1YiB0cmVlLgotCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBBZGQgYSBzbWFsbCBtZW1vcnkgZGV2aWNlIHRvCi0gCXRoZSBkZXZpY2UgdHJlZSBhdCB0aGUgYWRkcmVzcyBvZiB0aGUgaGktbWVtIGludGVycnVwdCB2ZWN0b3IKLSAJYWRkcmVzZXMuICBVc2VkIGJ5IGJ1Z2FwaSB0byBlc3RhYmxpc2ggaXRzIHRyYXAgaW5zdHJ1Y3Rpb25zLgotCQotCSogZGVidWcuaDogQWRkIGEgbmV3IG1hY3JvIERJVFJBQ0UgZm9yIHRyYWNpbmcgZGV2aWNlIGluc3RhbmNlcy4KLQkKLQkqIGRlYnVnLmg6IEV4dGVuZCB0aGUgRFRSQUNFIG1hY3JvIHNvIHRoYXQgaXQgY2FuIGFsc28gdGVzdHMgZm9yCi0gCWRldmljZSBzcGVjaWZpYyB0cmFjaW50LgotCQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfdHJhY2UpOiBBZGQgbWV0aG9kIHRvIGRldGVybWluZQotIAlkZXZpY2Ugc3BlY2lmaWMgdHJhY2luZy4KLQkoZGV2aWNlX2luaXRfYWRkcmVzcyk6IFNldCB0aGUgZGV2aWNlcyB0cmFjaW5nIGxldmVsLgotCQotVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiB0cmVlLmgsIHRyZWUuYyAodHJlZV9kZXZpY2UpOiBOZXcgZmlsZXMgLSBzZXBhcmF0ZSBvdXQgdGhlCi0gCWRldmljZSBwYXJzZXIgYW5kIG90aGVyIHRyZWUgb3BlcmF0aW9ucyBmcm9tIHRoZSBkZXZpY2UuCi0JCi0JKiBpbmxpbmUuaCwgaW5saW5lLmMgKElOTElORV9UUkVFKTogQWRkLgotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogRGVsZXRlLgotCSogTWFrZWZpbGUuaW4gKHRyZWUuYyk6IEFkZCBydWxlcyBmb3IgbmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogQmV0dGVyIG9yZGVyIHRoZSBlbXVsXyogZmlsZXMuCi0JCi0JKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IFVwZGF0ZS4KLQkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IFVwZGF0ZS4KLQkqIGVtdWxfdW5peC5jIChlbXVsX3VuaXhfY3JlYXRlKTogRGl0dG8uCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogRGl0dG8uCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBEaXR0by4KLQkqIHBzaW0uYyAocHNpbV90cmVlKTogRGl0dG8uCi0JKiBod19pbml0LmM6IERpdHRvLgotCQotCSogZW11bF9nZW5lcmljLmg6IEluY2x1ZGUgdHJlZS5oCi0JKiBNYWtlZmlsZS5pbjogQWRkIHRvIEVNVUxfR0VORVJJQ19IIGRlcGVuZGVuY2llcy4KLQkKLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX3Jvb3QpOiBOZXcgZnVuY3Rpb24gLSByZXR1cm5zIHRoZQotIAlyb290IG9mIHRoZSB0cmVlLgotCSogY29yZWZpbGUuYzogVXNlLgotCQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfY2xlYW4pOiBOZXcgZnVuY3Rpb24sIGNsZWFuIHVwIGRldmljZQotIAlyZWFkeSBmb3IgbmV4dCBzaW11bGF0aW9uIHJ1bi4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSBkZWxldGluZwotIAlpbnRlcnJ1cHQgZWRnZXMgYW5kIHByb3BlcnRpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIHNpbXVsYXRpb24gYW5kCi0gCWFsc28gc2NydWJiaW5nIGFueSBwcmUtZGVmaW5lZCBwcm9wZXJ0aWVzLgotCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCi0JCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbml0X3N0YXRpY19wcm9wZXJ0aWVzKTogTmV3Ci0gCWZ1bmN0aW9uLiAgSW5pdGlhbGl6ZSBhbnkgc3RhdGljIHByZWRlZmluZWQgcHJvcGVydGllcy4gIEJ5IHN0YXRpYwotIAl3ZSBtZWFuIHRob3NlIHRoYXQgaGF2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBiZWZvcmUgdGhlCi0gCWRldmljZSB0cmVlIGluaXRpYWxpemF0aW9uIGhhcyBzdGFydGVkLgotCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCi0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2luaXRfYWRkcmVzcyk6IEFkZCBjb2RlIHRvCi0gCWNoZWNrL3ZlcmlmeSB0aGUgZGV2aWNlcyAjYWRkcmVzcy1jZWxscyBhbmQgI3NpemUtY2VsbHMuCi0JKGRldmljZV9hZGRfaW50ZWdlcl9wcm9wZXJ0eSk6IERlbGV0ZSBjb3JyZXNwb25kaW5nIGNvZGUuCi0JKGRldmljZV9ucl9hZGRyZXNzX2NlbGxzLCBkZXZpY2VfbnJfZGF0YV9jZWxscyk6IENoZWNrIGZvcgotCXByb3BlcnR5IHdoZW4gcmV0dXJuaW5nIHZhbHVlLgotCQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW5pdF9ydW50aW1lX3Byb3BlcnRpZXMpOiBOZXcKLSAJZnVuY3Rpb24uICBJbml0aWFsaXplIHRob3NlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGBzdGF0aWMnLiAgQXQKLSAJcHJlc2VudCB0aGUgb25seSBzdWNoIHByb3BlcnR5IGlzIHRoZSBpaGFuZGxlLgotCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCi0JCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKHJlZywgcmFuZ2VzKTogUmV3b3JrIHRoZXNlIHNvIHRoYXQgdGhleSB1c2UKLSAJYW4gYXJyYXkgb2YgdGhlIGZ1bmRhbWVudGFsIHR5cGUgLSBzaW5nbGUgcmVnIG9yIHNpbmdsZSByYW5nZQotIAllbnRyeS4KLQkKLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkpOgotIAlSZS1pbXBsZW1lbnQgdGhlIGFkZGluZyBvZiBhbiBpaGFuZGxlIGR1cmluZyB0cmVlIGNvbnN0cnVjdGlvbiBzbwotIAl0aGF0IGl0IGJldHRlciBmaXRzIGluIHdpdGggZGV2aWNlIGluaXRpYWxpemF0aW9uLgotCQotVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pb2N0bCk6IEFkZCBhZGRpdGlvbmFsIGFyZ3VtZW50IC0KLSAJcmVxdWVzdCAtIHNvIHRoYXQgdGhlIGNhbGxlciBtdXN0IGFsd2F5cyBzcGVjaWZ5IHRoZSB0eXBlIG9mCi0gCXRoZSBpb2N0bCByZXF1ZXN0LgotCi0JKiBkZXZpY2VfdGFibGUuaDogVXBkYXRlLgotCSogaHdfdHJhY2UuYyAoaHdfdHJhY2VfaW9jdGwpOiBEaXR0by4KLQkqIGh3X3ZtLmMgKGh3X3ZtX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8uCi0JKiBod19pbml0LmMgKGh3X3N0YWNrX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8uCi0JKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IERpdHRvLgotCQotVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCQotCSogQlVHUzogVXBkYXRlZCBhIGJpdC4KLQotV2VkIE5vdiAyMCAxNDowNjozNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBod19vcGljLmM6IEZpbmlzaCAtIHRoaXJkIHJvdW5kLgotCi1XZWQgTm92IDIwIDEyOjAyOjA4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2dsdWUuYyAoaHdfZ2x1ZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayk6IEZpeCBtaXNjYWxjIG9mIGdsdWUKLSAJcmVnIGluZGV4LgotCShod19nbHVlX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayk6IERpdHRvLgotCi1UdWUgTm92IDE5IDIxOjE3OjA4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9wcm9jZXNzKTogV2FzIGluY29ycmVjdGx5IGNvbnN1bWluZyBmdXR1cmUKLSAJZXZlbnRzIG9uIHRoZSBxdWV1ZSB3aGVuIHRoZXkgc2hvdWxkIGJlIGxlZnQgYWxvbmUuCi0KLQkqIGRlYnVnLmgsIGRlYnVnLmMgKGV2ZW50cyk6IEFkZCBzdXBwb3J0IGZvciBldmVudCBxdWV1ZSB0cmFjaW5nLgotCSogZXZlbnRzLmM6IEFkZCBldmVudCB0cmFjaW5nLgotCQotCSogZGVidWcuaCwgZGVidWcuYzogT3JkZXIgZGV2aWNlIHRyYWNlIG9wdGlvbnMuCi0JCi1GcmkgTm92IDE1IDE1OjIzOjM5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBGaXggdXAgc29tZQotCXdhcm5pbmdzIGdlbmVyYXRlZCBieSBHQ0MuCi0KLVN1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogc2ltLWVuZGlhbi5oOiBBZGQgTEUgdmVyc2lvbnMgb2YgYnl0ZSBzd2FwIG1hY3Jvcy4gIE5lZWRlZCBmb3IKLSAJUENJIGRldmljZXMgd2hpY2ggYXJlIGxpdHRsZS1lbmRpYW4uCi0JCi0JKiBzaW0tZW5kaWFuLW4uaCAoZW5kaWFuX2xlMmhfTiwgZW5kaWFuX2gybGVfTik6IERpdHRvCi0KLVN1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBDaGFuZ2UgdGhlIGlvYnVzCi0gCXNvIHRoYXQgaXQgaXMgaW1wbGVtZW50aW5nIGEgMS0xIGFkZHJlc3MgbWFwLgotCQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBZGp1c3QuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRG9uJ3QgYWRkIHRoZSBudnJhbSBhcwotIAlhIGRlZmF1bHQuCi0KLVN1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQkKLQkqIGRldmljZS5jIChzcGxpdF9maW5kX2RldmljZSk6IEJlIHRvbGVyYW50IG9mIG1pc3NpbmcgdW5pdAotIAlhZGRyZXNzZXMuCi0KLUZyaSBOb3YgMTUgMTY6NDk6NDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogYmFzaWNzLmggKHBvcnRfZGlyZWN0aW9uKTogTmV3IHR5cGUsIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZgotIAlhbnkgYHBvcnQnLgotCQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW50ZXJydXB0X2RlY29kZSk6IEluY2x1ZGUKLSAJc3BlY2lmaWNhdGlvbiBvZiBwb3J0IGRpcmVjdGlvbiBpbiBvcGVyYXRpb25zLgotIAkoZGV2aWNlX2ludGVycnVwdF9lbmNvZGUpOiBEaXR0by4KLQkKLQkqIGRldmljZV90YWJsZS5oOiBBZGQgYSBkaXJlY3Rpb24gZmllbGQgdG8gdGhlIGludGVycnVwdCBwb3J0Ci0gCXRhYmxlLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IFNwZWNpZnkgcG9ydCBkaXJlY3Rpb24uCi0JCi1UaHUgTm92IDE0IDIxOjM4OjEzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X29waWMuYzogRmluaXNoIC0gc2Vjb25kIHJvdW5kLgotCi1UaHUgTm92ICA3IDAwOjE4OjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2h0YWIuYyAoaHRhYl9pbml0X2RhdGFfY2FsbGJhY2spOiBBbGxvdyB0aGUgdmlydHVhbC1hZGRyZXNzCi0gCXRvIGJlIHNwZWNpZmllZCBhcyBhbiBhcnJheSB3aGljaCBhbGxvd3MgNjRiaXQgYWRkcmVzc2VzLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbi4KLSAgCVNpbXBsaWZ5IHRoZSBxdWVyeWluZyBvZiBlbGVtZW50cyBvZiBhbiBpbnRlZ2VyIGFycmF5LgotCShkZXZpY2VfYWRkX2ludGVnZXJfcHJvcGVydHksIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkpOgotIAlVcGRhdGUgdG8gY29ycmVjdGx5IHVzZSB0aGUgY2VsbCB0eXBlLgotCi0JKiB2bS5jIChvbV91bnBhY2tfc3IpOiBDbGFyaWZ5IHNoaWZ0aW5nIGNvbW1lbnQuCi0JKG9tX3B0ZV8wX21hc2tlZF92c2lkKTogRGl0dG8uIEFkZCA2NGJpdCB2ZXJzaW9uLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogSW5pdGlhbGl6ZSB0aGUgc2VnbWVudAotIAlyZWdpc3RlcnMuCi0KLQkqIHZtLmMgKG9tX2VmZmVjdGl2ZV90b192aXJ0dWFsKTogVHJhY2Ugc2VnbWVudCByZWdpc3RlciB1c2UuCi0KLQkqIGh3X2h0YWIuYyAoaHRhYl9tYXBfcGFnZSk6IFByaW50IG91dCB0aGUgcHRlZyBiYXNlIGFkZHJlc3MgdG8KLSAJc2ltcGxpZnkgY3Jvc3MgY2hlY2tpbmcgYmV0d2VlbiB2bSBhbmQgdGhlIGh0YWIuCi0JKGh0YWJfZGVjb2RlX2hhc2hfdGFibGUpOiBVc2UgZGV2aWNlX2Vycm9yIGluc3RlYWQgb2YgZXJyb3IuCi0JKGh0YWJfbWFwX3BhZ2UpOiBEaXR0by4KLQkoaHRhYl9kbWFfYmluYXJ5KTogRGl0dG8uCi0JKGh0YWJfbWFwX2JpbmFyeSk6IERpdHRvLgotCShodGFiX2luaXRfZGF0YV9jYWxsYmFjayk6IERpdHRvLgotCi1XZWQgTm92ICA2IDIwOjIwOjU4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGludGVycnVwdHMuaDogQ2xhcmlmeSB3aGF0IHRoZSBvcHRpb25hbCBpbnN0cnVjdGlvbiBwcm9ncmFtCi0gCWludGVycnVwdCBpcyAtIGEgc3Vic2V0IG9mIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpbnRlcnJ1cHQuCi0KLQkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgVUVBIG1vZGUsIGNsYXJpZnkgd2hhdCBhbgotIAlvcHRpb25hbCBpbnN0cnVjdGlvbiBwcm9ncmFtIGludGVycnVwdCBpcy4KLQkocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgT0VBIG1vZGUsIGFzIHBlciBzcGVjLCBnZW5lcmF0ZSBhbgotIAlpbGxlZ2FsIGluc3RydWN0aW9uIHByb2dyYW0gaW50ZXJydXB0IHdoZW4gYW4gb3B0aW9uYWwgaW5zdHJ1Y3Rpb24KLSAJaXMgZW5jb3VudGVyZWQuCi0JCi0JKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBEZWxldGUgY29kZQotIAlkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBhbiB1bmltcGxlbWVudGVkIGZsb2F0aW5nIHBvaW50IGFuZCBub3JtYWwKLSAJaW5zdHJ1Y3Rpb24uICBJbnN0ZWFkLCBzdWNoIGEgY2FzZSBjYW4gYmUgaGFuZGxlZCBleHBsaWNpdGx5LgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChzdG9yZSBmbG9hdGluZy1wb2ludCBhcyBpbnRlZ2VyIHdvcmQgaW5kZXhlZCk6Ci0gCU1hcmsgYXMgb3B0aW9uYWwuCi0JKEZsb2F0aW5nIENvbnZlcnQgdG8gSW50ZWdlciBEb3VibGV3b3JkKTogTWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQKLSAJYXNzaXN0IGludGVycnVwdCBleHBsaWNpdC4KLQkoRmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIERvdWJsZXdvcmQgd2l0aCByb3VuZCB0b3dhcmRzIFplcm8pOgotIAlEaXR0by4KLQkoRmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIFdvcmQpOiBEaXR0bwotCShNb3ZlIEZyb20gRlBTQ1IpOiBEaXR0by4KLQkoTW92ZSB0byBDb25kaXRpb24gUmVnaXN0ZXIgZnJvbSBGUFNDUik6IERpdHRvLgotCShNb3ZlIFRvIEZQU0NSIEZpZWxkcyk6IERpdHRvLgotCShNb3ZlIFRvIEZQU0NSIEZpZWxkIEltbWVkaWF0ZSk6IERpdHRvLgotCShNb3ZlIFRvIEZQU0NSIEJpdCAwKTogRGl0dG8uCi0JKE1vdmUgVG8gRlBTQ1IgQml0IDEpOiBEaXR0by4KLQkKLU1vbiBOb3YgIDQgMTI6NDk6MTMgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29yZWZpbGUuYyAoY29yZV9tYXBfcmVhZF9idWZmZXIsIGNvcmVfbWFwX3dyaXRlX2J1ZmZlcik6IEF2b2lkCi0gCWJyZWFraW5nIHVwIHRyYW5zZmVycy4KLQotCSogY29yZWZpbGUuYzogQWRqdXN0IGFyZ3VtZW50cyBzbyB0aGF0IHRoZSBjbGllbnQgc2VydmVyCi0JcmVsYXRpb25zaGlwIGlzIGNsYXJpZmllZC4KLQkKLQkqIGh3X2dsdWUuYyAoaHdfZ2x1ZV9pbml0X2FkZHJlc3MpOiBVcGRhdGUgc28gaXQgY2FuIGJlIGF0dGFjaGVkCi0gCXRvIGEgUENJIGJ1cy4KLQotCSogaHdfZGlzay5jIChod19kaXNrX2luc3RhbmNlX3dyaXRlKTogQWRkIG1vcmUgY2hlY2tzIHRvIGRpc2sgSU8gLQotIAlsb29raW5nIGZvciB0aGluZ3MgbGlrZSBvdmVyZmxvdy91bmRlcmZsb3cuCi0KLVN1biBOb3YgIDMgMTg6NDU6MjAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBIYW5nIHRoZSBkaXNrIG9mZiB0aGUKLSAJUEFMIGRldmljZSBpbnN0ZWFkIG9mIHRoZSBJT0JVUy4gIFRoZSBkaXNrIG11c3QgYmUgYXR0YWNoZWQgdG8gYQotIAlsb2dpY2FsIGJ1cy4KLQotCSogaHdfZGlzay5jIChod19kaXNrX2luaXRfYWRkcmVzcyk6IEp1c3QgdXNlIHRoZSB1bml0IGFkZHJlc3MKLSAJZGlyZWN0bHkgaW4gdGhlIGF0dGFjaCAtIHRoZSByZXN0IGlzbid0IHJlbGV2YW50LgotCi1TYXQgTm92ICAyIDIxOjQ4OjU3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltLWhhcmR3YXJlLCBzaW0tcGFja2FnZXMpOiBBbGxvdyBhZGRpdGlvbmFsCi0gCWhhcmR3YXJlIGFuZCBwYWNrYWdlcyB0byBiZSBwcmVmaXhlZCBhcyB3ZWxsIGFzIGFwcGVuZGVkLgotCi0JKiBNYWtlZmlsZS5pbiAodG1wLWh3LCB0bXAtcGspOiBSZXRhaW4gdGhlIHVzZXIgc3BlY2lmaWVkIG9yZGVyIG9mCi0gCXBhY2thZ2VzIHdoZW4gYnVpbGRpbmcgdGhlbS4gIENvbnNlcXVlbnRseSwgYSB1c2VyIGNhbiBvdmVycmlkZSBhCi0gCXN0YW5kYXJkIGRldmljZSBieSBwcmVmaXhpbmcgdGhlaXIgb3duIHZlcnNpb24uCi0JCi0JKiBNYWtlZmlsZS5pbiAoaHdfb3BpYy5vLCBod19wY2kubywgaHdfaWRlLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCi1GcmkgTm92ICAxIDE0OjQyOjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbW9uLmMgKF9jcHVfbW9uKTogQWRkIGZpZWxkcyBmb3IgY291bnRpbmcgMSwgMiwgNCwgYW5kIDggYnl0ZQotCXJlYWRzIGFuZCB3cml0ZXMuCi0JKG1vbl97cmVhZCx3cml0ZX0pOiBDb3VudCAxLCAyLCA0LCBhbmQgOCBieXRlIHJlYWRzL3dyaXRlcy4KLQkobW9uX3ByaW50X2luZm8pOiBDb3JyZWN0IHR5cG8gcmVnYXJkaW5nICMgb2YgdW5hbGlnbmVkIHJlYWRzIGFuZAotCXdyaXRlcy4gIFByaW50IG91dCBob3cgbWFueSAxLCAyLCA0LCBhbmQgOCBieXRlIHJlYWRzL3dyaXRlcyB0aGVyZQotCWFyZS4KLQotVHVlIE9jdCAyOSAxNzo1NTo0MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfRlVOQ1MpOiBBZGQgYWNjZXNzLgotCSogY29uZmlney5pbix1cmV9OiBSZWdlbmVyYXRlLgotCi0JKiBlbXVsX3VuaXguYyAoZG9fdW5peF9ub3ApOiBTeXN0ZW0gY2FsbCB0aGF0IGFsd2F5cyBzdWNjZWVkcy4KLQkoZG9fdW5peF9hY2Nlc3MpOiBTdXBwb3J0IGFjY2VzcyBzeXN0ZW0gY2FsbC4KLQkoc29sYXJpc19kZXNjcmlwdG9ycyk6IE1ha2Ugc2lnYWx0c3RhY2sgYW5kIHNpZ2FjdGlvbiBub3BzLgotCSh7c29sYXJpcyxsaW51eH1fZGVzY3JpcHRvcnMpOiBBZGQgc3VwcG9ydCBmb3IgYWNjZXNzLgotCi1UdWUsIDggT2N0IDE4OjQyOjI2IDE5OTYgIEphc29uIE1vbGVuZGEgPGNyYXNoQGN5Z251cy5jby5qcD4KLSAgICAgICAgCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZGlzdGNsZWFuLgotCi1GcmkgTm92ICAxIDE2OjQ0OjI4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvcmVmaWxlLW4uaCAoY29yZV9tYXBfd3JpdGVfTik6IEltcHJvdmUgYWJvcnQgbWVzc2FnZXMuCi0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2F0dGFjaF9hZGRyZXNzKTogUmVtb3ZlIHVudXNlZCBuYW1lCi0gCXBhcmFtZXRlci4KLSAJKGRldmljZV9kZXRhY2hfYWRkcmVzcyk6IERpdHRvLgotCSogZGV2aWNlX3RhYmxlLmgsIGRldmljZV90YWJsZS5jOiBVcGRhdGUuCi0JKiBod19pb2J1cy5jIChod19pb2J1c19hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk6IERpdHRvLgotCSogaHdfbnZyYW0uYyAoaHdfbnZyYW1faW5pdF9hZGRyZXNzKTogRGl0dG8uCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IERpdHRvLgotCSogaHdfdm0uYyAoaHdfdm1faW5pdF9hZGRyZXNzX2NhbGxiYWNrKTogRGl0dG8uCi0JKGh3X3ZtX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCi0JKGh3X3ZtX2FkZF9zcGFjZSk6IERpdHRvLgotCSogaHdfaW5pdC5jICh1cGRhdGVfZm9yX2JpbmFyeV9zZWN0aW9uKTogRGl0dG8uCi0JKiBod19jb3JlLmMgKGh3X2NvcmVfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBEaXR0by4KLQotCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBSZXdyaXRlIHRvIGhhbmRsZQotIAljb25maWd1cmFibGUgcGFyZW50IGJ1c3Nlcy4KLQotV2VkIE9jdCAzMCAxODo0NjozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZSk6IFByb3ZpZGUKLSAJbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aS1jZWxsIHNpemVzLgotCShnZW5lcmljX2RldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8gZm9yIGFkZHJlc3Nlcy4KLQotVHVlIE9jdCAyOSAwMjowMToyOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9pbnRlZ2VyX3Byb3BlcnR5KTogQ2hlY2sgZm9yIHNldHRpbmcgb2YKLSAJI2FkZHJlc3MtY2VsbHMgYW5kICNzaXplLWNlbGxzIHByb3BlcnRpZXMuICBGb3IgdGhlc2UsIHVwZGF0ZSB0aGUKLSAJY29ycmVzcG9uZGluZyBkZXZpY2UgdmFsdWVzLgotCShkZXZpY2VfbnJfYWRkcmVzc19jZWxscywgZGV2aWNlX25yX3NpemVfY2VsbHMpOiBVc2UgdGhlIHZhbHVlCi0gCWZyb20gdGhlIGRldmljZSBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eS4KLQotCSogaHdfY29yZS5jOiBVc2UgZ2VuZXJpYyBhZGRyZXNzIGFuZCBzaXplIGNvbnZlcnNpb25zIGZvciB0aGUgdG9wCi0gCWJ1cy4KLQotCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9pbml0X2FkZHJlc3MpOiBUb2xlcmF0ZSBjYXNlIHdoZXJlCi0gCSNhZGRyZXNzIGFuZCAjc2l6ZSBjZWxscyBpcyBncmVhdGVyIHRoYW4gMS4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSk6IENsZWFuIG91dCBwcmludGluZyBvZgotIAlwcm9wZXJ0aWVzLgotCQotCSogZGV2aWNlLmMgKHNwbGl0X2RldmljZV9zcGVjaWZpZXIpOiBEb24ndCBkZXRlY3QgY29tbWVudHMgaGVyZSAtCi0gCSIjIiBjYW4gYmUgYSB2YWxpZCBwcmVmaXggLSBlZyAjc2l6ZS1jZWxscy4KLQotCSogcHNpbS5jIChwc2ltX21lcmdlX2RldmljZV9maWxlKTogU3VwcHJlc3MgY29tbWVudHMgYW5kIGJsYW5rCi0gCWxpbmVzIGhlcmUuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRml4IHR5cG8gb2YgaW5jb3JyZWN0Ci0gCXBhbCB1bml0IGFkZHJlc3MuICBBZGQgdGhlIHByb3BlcnR5IC8jYWRkcmVzcy1jZWxscyB0byB0aGUgcm9vdCBvZgotIAl0aGUgdHJlZS4KLQotCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogQ2hlY2sgdGhhdCB0aGUgdW5pdAotIAlhZGRyZXNzIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgotCi0JKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUpOiBSZXdyaXRlIHRvIGJldHRlcgotIAloYW5kbGUgbXVsdGktY2VsbCBhZGRyZXNzZXMuCi0JKGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlKTogRGl0dG8uCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogInJlZyIgcHJvcGVydGllcyBubwotIAlsb25nZXIgbmVlZCB0aGUgZXhwbGljaXQgYXJyYXkgdHlwZSAtIHRoZSBwYXJzZXIgdGFrZXMgY2FyZSBvZiBpdC4KLQotCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBBZGQgTlVMTCByZXR1cm4KLSAJdG8ga2VlcCBHQ0MgaGFwcHkuCi0KLU1vbiBPY3QgMjggMjI6NTU6NDggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfaWRlLmM6IE5ldyBmaWxlLiAgTW9kZWwgb2YgYSBiYXNpYyBJREUgaW50ZXJmYWNlIGF0dGFjaGVkIHRvCi0gCWEgUENJIGJ1cy4KLQkKLQkqIGNvbmZpZ3VyZS5pbiAoaGFyZHdhcmUpOiBBZGQgdGhlIGlkZSBkZXZpY2UgdG8gdGhlIGRlZmF1bHQKLSAJY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkKLQkqIGRlYnVnLmgsIGRlYnVnLmM6IEFkZCB0cmFjaW5nIG9wdGlvbiBmb3IgdGhlIElERSBkZXZpY2UuCi0JCi1GcmkgT2N0IDI1IDIxOjI4OjI1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X3BoYi5jLCBod19waGIuaDogTmV3IGZpbGVzIC0gaW1wbGVtZW50IGEgUEhCLgotCi0JKiBjb25maWd1cmUuaW4gKGhhcmR3YXJlKTogQWRkIHRoZSBwaGIgdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0bwotIAlidWlsZCBieSBkZWZhdWx0LgotCi1GcmkgT2N0IDI1IDIxOjI4OjI1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2NvbS5jOiBSZXZpZXcgZGVzY3JpcHRpb24uCi0JKiBod19kaXNrLmM6IERpdHRvLgotCSogaHdfaHRhYi5jOiBEaXR0by4KLQkqIGh3X2VlcHJvbS5jOiBEaXR0by4KLQkqIGh3X2luaXQuYzogRGl0dG8uCi0JKiBod19jcHUuYzogRGl0dG8uCi0JCi0JKiBod19jb20uYzogVXBkYXRlIGV2ZW50IGhhbmRsaW5nLgotCi0JKiBod19kaXNrLmM6IEltcGxlbWVudCB0cmFjaW5nLgotCQotRnJpIE9jdCAyNSAyMToyODoyNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKTogVXNlCi0gCWFzc2lnbmVkLWFkZHJlc3NlcyBwcm9wZXJ0eSBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlciByZWcKLSAJcHJvcGVydHkuCi0KLUZyaSBPY3QgMjUgMjE6Mjg6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfZmluZF9yYW5nZXNfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24uCi0gIAlTaW1wbGlmeSB0aGUgbWFuaXB1bGF0aW9uIG9mICJyYW5nZXMiIHByb3BlcnRpZXMuCi0JCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9wYXJzZWQpOiBFeHRlbmQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUKLSAJcmFuZ2VzIHByb3BlcnR5LgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9wYXJzZWQpOiBBZGQgYXNzaWduZWQtYWRkcmVzc2VzIHRvIHRoZSBsaXN0Ci0gCW9mIHJlZyB0eXBlIHByb3BlcnRpZXMuCi0JCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogQWRkIGNvZGUgdG8gZm9ybWF0IGFuZAotIAlwcmludCBhIHJhbmdlcyBwcm9wZXJ0eS4KLQkKLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMsCi0gCWRldmljZV9ucl9zaXplX2NlbGxzKTogTmV3IGZ1bmN0aW9ucy4gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgb2YgdGhlCi0gCXN0YW5kYXJkIHByb3BlcnRpZXMgI2FkZHJlc3MtY2VsbHMgYW5kICNzaXplLWNlbGxzLiAgQm90aCBvZiB3aGljaAotIAlhcmUgb3B0aW9uYWwgYW5kIGhhdmUgZGVmYXVsdCB2YWx1ZXMgb2YgdHdvIGFuZCBvbmUgcmVzcGVjdGZ1bHkuCi0gIAlQcmV2aW91c2x5LCBjb2RlIHRoYXQgZGV0ZXJtaW5lZCAjYWRkcmVzcy1jZWxscyB3YXMgaW5jb3JyZWN0bHkKLSAJdXNpbmcgYSB2YWx1ZSBvZiBvbmUuCi0KLUZyaSBPY3QgMjUgMjE6Mjg6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGVidWcuaCwgZGVidWcuYzogU29ydCBkZWJ1ZyBvcHRpb25zLCBBZGQgZW50cmllcyBmb3IgdGhlCi0gCWNvbW1pbmcgUEhCIGRldmljZS4KLQkKLUZyaSBPY3QgMTggMTI6MTI6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChGbG9hdGluZyBTZWxlY3QpOiBBZGQgc3VwcG9ydCBmb3IgZnNlbCB1bmxlc3MKLQltb2RlbCBpcyA2MDEuICBBbGxvdyB1c2VyIHRvIGZpbHRlciBvdXQgaW5zdHJ1Y3Rpb24gdW5sZXNzIC1GcyBpcwotCXBhc3NlZCB0byBpZ2VuLgotCShTdG9yZSBGbG9hdGluZy1Qb2ludCBhcyBJbnRlZ2VyIFdvcmQgSW5kZXhlZCk6IFJhaXNlIG9wdGlvbmFsCi0JaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBhYm9ydC4gIEFsbG93IHVzZXIgdG8gZmlsdGVyIG91dCBpbnN0cnVjdGlvbgotCXVubGVzcyAtRnMgaXMgcGFzc2VkIHRvIGlnZW4uCi0JKEZsb2F0aW5nIFNxdWFyZSBSb290eywgU2luZ2xlfSk6IERpdHRvLgotCShGbG9hdGluZyBSZWNpcHJvY2FsIEVzdGltYXRlIFNpbmdsZSk6IERpdHRvLgotCShGbG9hdGluZyBSZWNpcHJvY2FsIFNxdWFyZSBSb290IEVzdGltYXRlKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWZpbHRlcik6IElmIG5vdCBwYXNzZWQsIHBhc3MgMzIsZixzCi0JdG8gaWdlbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogaW50ZXJydXB0cy5oIChwcm9ncmFtX2ludGVycnVwdF9yZWFzb25zKTogQWRkCi0Jb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQuCi0KLQkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBDYWxsIGVycm9yIHdpdGggbW9yZSBkZXRhaWxlZAotCWluZm9ybWF0aW9uIG9uIHByb2dyYW0gaW50ZXJydXB0cywgcGFydGljdWxhcmx5IGluIHVzZXIgbW9kZS4gIEFkZAotCXN1cHBvcnQgZm9yIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0LgotCi1XZWQgU2VwIDI1IDEwOjIwOjI5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2dsdWUuYzogTmV3IGRldmljZS4gIEhvb2tzIGZvciBtYW5pcHVsYXRpbmcgaW50ZXJydXB0IHBvcnRzLgotCi0JKiBkZWJ1Zy5oLCBkZWJ1Zy5jICh0cmFjZV9nbHVlX2RldmljZSk6IEFkZCB0cmFjaW5nIHN1cHBvcnQgZm9yCi0gICAgICAgIHRoZSBpbnRlcnJ1cHQgZ2x1ZSBsb2dpYyBkZXZpY2UuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaGFyZHdhcmUpOiBBZGQgZ2x1ZSBkZXZpY2UuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBTZXAgMjQgMjA6NTU6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3BhcnNlX2ludGVnZXJfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24sCi0gICAgICAgIHBhcnNlIGEgbGlzdCBvZiBpbnRlZ2VycyBhcyBhbiBhcnJheSBwcm9wZXJ0eS4KLQkoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IENhbGwgaXQuCi0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9wYXJzZV9zdHJpbmdfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24sCi0gICAgICAgIHBhcnNlIGEgbGlzdCBvZiBzdHJpbmdzIGFzIGEgc3RyaW5nIHByb3BlcnR5ICh3aXRoIGVtYmVkZWQKLSAgICAgICAgbnVsbCdzKS4gIEZvciBtb21lbnQsIGRvbid0IHRyeSB0byBpbXBsZW1lbnQgYSBjb21wbGV4dCBzdHJpbmcKLSAgICAgICAgcGFyc2VyLgotCShkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogQ2FsbCBpdC4KLQotVHVlIFNlcCAyNCAxNjozMDo0OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBod19vcGljLmM6IE5ldyBmaWxlLiAgT3BlblBJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4KLQotCSogY29uZmlndXJlLmluIChoYXJkd2FyZSk6IEFkZCBvcGljIGRldmljZS4KLQkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCi0KLQkqIGh3X3BpYy5jOiBEZWxldGUsIHJlcGxhY2VkIHdpdGggaHdfb3BpYy5jLgotCi0JKiBkZWJ1Zy5oLCBkZWJ1Zy5jOiBBZGQgZGVidWcgb3B0aW9uIGZvciBPcGVuUElDIGRldmljZS4gLQotICAgICAgICBvcGljLWRldmljZS4KLQotVHVlIFNlcCAyNCAxNjozMDo0OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5pbiAocHNpbS5vLCBpZGVjb2RlLm8pOiBTaW5jZSBpZGVjb2RlIGFuZCBub3QgcHNpbSBpcwotICAgICAgICBub3cgdGhlIGZpbGUgdGhhdCBkb2VzIGFsbCB0aGUgaW5saW5pbmcuCi0KLQkqIE1ha2VmaWxlLmluIChMSUJfU1JDLCBMSUJfSU5MSU5FX1NSQywgaWRlY29kZS5vKTogQnJlYWsgb3V0IHRoZQotICAgICAgICBsaWJyYXJ5IHNvdXJjZSBjb2RlIHRoYXQgY291bGQgYmUgaW52b2x2ZWQgaW4gYW4gaW5saW5pbmcuICBNYWtlCi0gICAgICAgIGlkZWNvZGUubyBvbmx5IGRlcGVuZGFudCBvbiB0aGUgaW5saW5lZCBsaWJyYXJ5IHNvdXJjZSBjb2RlLgotCi0JKiBNYWtlZmlsZS5pbiAoTElCX09CSik6IFB1dCBvcHRpb25zIGxhc3Qgb24gdGhlIGxpc3Qgc28gdGhhdCBpdAotICAgICAgICBpcyBjb21waWxlZCBsYXN0LgotCi0JKiBzdGQtY29uZmlnLmggKERFVklDRV9JTkxJTkUpOiBPbmx5IGlubGluZSBsb2NhbHMgd2hlbiB0aGUKLSAgICAgICAgZGVmYXVsdCBpcyB0byBpbmxpbmUuCi0KLU1vbiBTZXAgMjMgMDA6Mzc6NDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfaHRhYi5jIChodGFiX3N1bV9iaW5hcnkpOiBEZXRlcm1pbmUgdGhlIHJlYWwtYmFzZSBmb3IgdGhlCi0gICAgICAgIGJpbmFyeS4KLQotCSogaHdfaHRhYi5jIChodGFiX21hcF9iaW5hcnkpOiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICBsb2FkLWJhc2UsIGVpdGhlciBtYXAgdGhlIHByb2dyYW0gaW4gYXMgYSBjb250aWd1b3VzIHNlY3Rpb24gb3IgYXMKLSAgICAgICAgc2VwYXJhdGUgc2VjdGlvbnMgY29udHJvbGVkIGJ5IHRoIGJpbmFyaWVzIGxtYSB2YWx1ZXMuCi0JKGh0YWJfaW5pdF9kYXRhX2NhbGxiYWNrKTogRGl0dG8uCi0KLVN1biBTZXAgMjIgMTU6NTY6MjIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IFJlbW92ZSBsb2FkLWJhc2Ugb3B0aW9uLgotCi0JKiBlbXVsX2NoaXJwLmMgKG1hcF9vdmVyX2NoaXJwX25vdGUpOiBBZGQgbG9hZF9iYXNlIGZpZWxkIHRvIG5vdGUKLSAgICAgICAgc3RydWN0LiAgRG9uJ3QgcmVxdWlyZSB0aGUgbG9hZF9iYXNlIGZpZWxkIHRvIGJlIHByZXNlbnQgLSBqdXN0Ci0gICAgICAgIGlzc3VlIHdhcm5pbmcgLSBpdCBpcyBhIHJlY2VudCBhZGRpdGlvbi4KLQkoZW11bF9jaGlycF9jcmVhdGUpOiBTdXBwb3J0IGJvdGggdmlydHVhbCBhbmQgcGh5c2ljYWwgbW9kZXMuCi0KLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBZGQgYSBzdGFjayBpbml0aWFsaXphdGlvbgotICAgICAgICBwcm9wZXJ0eSBzbyB0aGF0IGFueSBhcmd1bWVudHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuCi0gICAgICAgIGJlIHBhc3NlZCBvbiB0byB1c2VyIHByb2dyYW1zLgotCi0JKiBod19pbml0LmMgKGNyZWF0ZV9wcGNfY2hpcnBfYm9vdGFyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgY2hpcnAKLSAgICAgICAgYXJndW1lbnQgcGFzc2luZyB0byB0aGUgcHNldWRvIGRldmljZSBzdGFjay4KLQotU2F0IFNlcCAyMSAxOTozOTo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2Vycm9yKTogTWFrZSBpdCBtb3JlIHRvbGVyYW50IHRvIGluY29tcGxldGUKLSAgICAgICAgZGV2aWNlcy4KLQotCSogaHdfaW5pdC5jIChod19kYXRhX2luaXRfZGF0YV9jYWxsYmFjayk6IEV4dGVuZCB0aGUgZGF0YSBkZXZpY2UKLSAgICAgICAgc28gdGhhdCBpdCBjYW4gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBvcGVyYXRpb25zIGVpdGhlciBkbWEgb3IgYQotICAgICAgICBtb3JlIGNvbXBsZXggaW5zdGFuY2Ugb3Blbiwgc2Vlaywgd3JpdGUgb3BlcmF0aW9uLgotCSogaHdfaW5pdC5jOiBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIGRldmljZSB0byByZWZsZWN0Ci0gICAgICAgIHRoaXMuCi0KLVNhdCBTZXAgMjEgMDA6MTM6MDIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV9ldmVudF9xdWV1ZV9zY2hlZHVsZSwKLSAgICAgICAgZGV2aWNlX2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUsIGRldmljZV9ldmVudF9xdWV1ZV90aW1lKTogSGF2ZSB0aGUKLSAgICAgICAgZGV2aWNlIG9iamVjdCBleHBvcnQgdGhlIGV2ZW50IG9wZXJhdGlvbnMuICBNYWtpbmcgdGhlc2UgYXZhaWxhYmxlCi0gICAgICAgIGZyb20gdGhlIGRldmljZSBvYmplY3Qgc2hvdWxkIGhvcGVmdWxseSBzaW1wbGlmeSB3cml0aW5nIGRldmljZQotICAgICAgICBtb2RlbHMuCi0KLUZyaSBTZXAgMjAgMTQ6MDQ6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChzaW0taGFyZHdhcmUpOiBBZGQgZWVwcm9tIGRldmljZSB0byBkZWZhdWx0IGJ1aWxkLgotCi0JKiBod19lZXByb20uYzogUmV3cml0ZSBzbyBpdCB3b3Jrcy4KLQotCSogZGVidWcuaCwgZGVidWcuYzogQWRkIHRyYWNpbmcgc3VwcG9ydCBmb3IgdGhlIGVlcHJvbSBhbmQgY29tCi0gICAgICAgIGRldmljZXMuCi0KLVRodSBTZXAgMTkgMTQ6NDA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGVidWcuaDogQWRkIGRpc2tsYWJlbC1wYWNrYWdlIGFuZCBkaXNrLWRldmljZSB0cmFjZSBvcHRpb25zLgotCWRlYnVnLmggKFBUUkFDRSk6IEFkZCBtYWNybyB0byBzaW1wbGlmeSB0cmFjaW5nIGluIHBhY2thZ2VzLgotCi1UaHUgU2VwIDE5IDE0OjQwOjQwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5jIChkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBUaWdodGVuIHVwIGxvb3AKLSAgICAgICAgc2VhcmNoaW5nIGZvciBkZXZpY2UgaW5zdGFuY2VzLgotCShkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKTogRGl0dG8uCi0JKGRldmljZV9pbnN0YW5jZV9kZWxldGUpOiBPbmx5IGxlYWYgaW5zdGFuY2VzIG5lZWQgdG8gYmUgcmVtb3ZlZAotICAgICAgICBmcm9tIGEgZGV2aWNlcyBsaXN0IG9mIGFjdGl2ZSBpbnN0YW5jZXMuCi0KLVRodSBTZXAgMTkgMTQ6NDA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfZGlzay5jOiBBZGQgdGhlIGNkcm9tIGFzIGFuIGFsaWFzLgotCi0JKiBwa19kaXNrbGFiZWwuYyAoZGlza2xhYmVsX2RlbGV0ZSk6IEltcGxlbWVudCwgcmVtZW1iZXJpbmcgdG8KLSAgICAgICAgZGVsZXRlIHRoZSByYXcgZGlzayBpbnN0YW5jZSB3aGlsZSB3ZSdyZSBhdCBpdC4KLQotCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBJbXBsZW1lbnQgYQotICAgICAgICBsaXR0bGUgYml0IG1vcmUgLSBzdGlsbCBhIGxvbmcgd2F5IHRvIGdvLgotCi0JKiBwa19kaXNrbGFiZWwuYyAoZGlza2xhYmVsX3dyaXRlLCBkaXNrbGFiZWxfcmVhZCk6IFJlbWVtYmVyIHRoZQotICAgICAgICBuZXcgaGVhZCBwb3NpdGlvbiBhZnRlciBhIHJlYWQgb3Igd3JpdGUuCi0KLVRodSBTZXAgMTkgMTM6MDU6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3JlYWQpOiBBbGxvdyByZWFkcyB0byBiZSBsb25nZXIgdGhlbgotICAgICAgICB0aGUgaW50ZXJuYWwgYnVmZmVyLgotCi1UaHUgU2VwIDE5IDEzOjA1OjQwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfcmVhZF90MmhfYXJncyk6IENhbGwgbWVtc2V0LTAgd2l0aCB0aGUgYXJncwotICAgICAgICBpbiB0aGUgY29ycmVjdCBvcmRlci4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2NhbGxfbWV0aG9kKTogQ29ycmVjdCBjb21wdXRhdGlvbiBmb3IKLSAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHN0YWNrIGFyZ3VtZW50IHBhc3NlZCBpbiBmcm9tIHRoZSBjbGllbnQKLSAgICAgICAgcHJvZ3JhbS4KLQotV2VkIFNlcCAxOCAxOTozMzo1NCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiB3b3Jkcy5oOiBBZGQgbmV3IHR5cGVzIHNpZ25lZF9jZWxsIGFuZCB1bnNpZ25lZF9jZWxsIHdoaWNoCi0gICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQgSUVFRSAxMjc1IG1lbW9yeSBsb2NhdGlvbnMuCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMsIGVtdWxfY2hpcnAuYzogV2hlcmUgcmVmZXJpbmcgdG8gYW4gSUVFRSAxMjc1Ci0gICAgICAgIG1lbW9yeSBjZWxsLCByZXBsYWNlIHVzZXMgb2YgdW5zaWduZWQzMiB3aXRoIHVuc2lnbmVkX2NlbGwuCi0JKiBkZXZpY2VfdGFibGUuaDogRGl0dG8uCi0KLQkqIHNpbS1lbmRpYW4uaDogQWRkIG5ldyBtYWNyb3MgSDJCRV9jZWxsIGFuZCBCRTJIX2NlbGwgd2hpY2gKLSAgICAgICAgY29udmVydCBjZWxsIHNpemVkIHZhbHVlcyB0byBmcm9tIGJpZyBlbmRpYW4uCi0JKiBkZXZpY2UuYywgZW11bF9jaGlycC5jOiBXaGVyZSByZWZlcmluZyB0byBJRUVFIDEyNzUgbWVtb3J5IGNlbGxzCi0gICAgICAgIHVzZSB0aGVzZSBuZXcgbWFjcm9zLgotCi1UdWUgU2VwIDE3IDE1OjU3OjQ0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogRGV0ZWN0IGFuZCByZXBvcnQgYW4KLSAgICAgICAgaW50ZXJydXB0IGJlaW5nIGF0dGFjaGVkIHRvIGFuIGludmFsaWQgZGV2aWNlLiBXYXMgZHVtcGluZyBjb3JlLgotCi1Nb24gU2VwIDE2IDIzOjA5OjEyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCi0gICAgICAgIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKTogTmV3IGZ1bmN0aW9ucy4gIENvbnZlcnQgYSBkZXZpY2VzCi0gICAgICAgIHVuaXQgYWRkcmVzcyBvciB1bml0IHNpemUgc3RydWN0dXJlIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvcgotICAgICAgICBwYXNzaW5nIG9uIHRvIHRoZSBhdHRhY2ggYW5kIGRldGFjaCBmdW5jdGlvbnMuCi0JKiBkZXZpY2VfdGFibGUuaDogQWRkIGV4dHJhIG1ldGhvZHMgdG8gZGV2aWNlIHRhYmxlLgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9maW5kX3JlZ19wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgRm9yIGEgcmVnIHR5cGUgcHJvcGVydHksIHJldHVybiB0aGUgc2VsZWN0ZWQgYWRkcmVzcyArIHNpemUKLSAgICAgICAgdHVwcGxlLCBhbG9uZyB3aXRoIGEgcG9zaXRpdmUgc3VjY2VzcyBzdGF0dXMuICBBZGQgYSByZWdfcHJvcGVydHkKLSAgICAgICAgdG8gdGhlIGxpc3Qgb2YgcHJvcGVydHkgdHlwZXMuCi0JKiAoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IE1ha2UgYXJyYXkgcHJvcGVydGllcyB3aXRoIHRoZSBuYW1lCi0gICAgICAgIHJlZyBvciBhbHRlcm5hdGUtcmVnIG9mIHR5cGUgcmVnX3Byb3BlcnR5LgotCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IFJld3JpdGUgdG8gdXNlIG5ldwotICAgICAgICBmaW5kX3JlZ19wcm9wZXJ0eSBtZXRob2QuCi0JKiBod19udnJhbS5jIChod19udnJhbV9pbml0X2FkZHJlc3MpOiBEaXR0by4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSk6IEFkZCBjb2RlIHRvIHByaW50IG91dCBhIHJlZwotICAgICAgICBwcm9wZXJ0eS4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCi0gICAgICAgIGdlbmVyaWNfZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUgKTogTmV3IGZ1bmN0aW9ucy4gIEdlbmVyaWMKLSAgICAgICAgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdW5pdCBhbmQgYXR0YWNoIGFkZHJlc3Mgb3Igc2l6ZS4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcyk6IFJld3JpdGUgdG8gdXNlIHRoZQotICAgICAgICBuZXcgZmluZF9yZWcgYW5kIGFkZHJlc3MgY29udmVydCBmdW5jdGlvbnMuICBMb29rIGZvciBib3RoIHJlZyBhbmQKLSAgICAgICAgYWx0ZXJuYXRlLXJlZyBwcm9wZXJ0aWVzLgotCi1Nb24gU2VwIDE2IDIzOjA5OjEyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2NvbS5jOiBOZXcgZmlsZS4gIEEgJzU1MCBzZXJpYWwgZGV2aWNlIHRoYXQgY2FuIHF1aWNrbHkgYmUKLSAgICAgICAgYXR0YWNoZWQgdG8gYW55IGJ1cy4KLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1oYXJkd2FyZSk6IEFkZCB0aGUgY29tIGRldmljZS4KLQkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCi0KLVRodSBTZXAgMTIgMTc6MzA6NTYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ZlcmlmeV9yZWdfdW5pdF9hZGRyZXNzKTogTmV3Ci0gICAgICAgIGZ1bmN0aW9uLiBDaGVjayB0aGF0IHRoZSB1bml0IGFkZHJlc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZWcKLSAgICAgICAgcHJvcGVydHkgY29ycmVjdGx5IGNvcnJlc3BvbmRzIHRvIGFueSB1bml0IGFkZHJlc3MgcHJldmlvdXNseQotICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIGRldmljZXMgbmFtZS4KLQkoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IFdoZW4gYWRkaW5nIGEgcmVnIHByb3BlcnR5LCB2ZXJpZnkKLQl0aGF0IHRoZSB1bml0LWFkZHJlc3MgLSBmaXJzdCB2YWx1ZSBvZiBwcm9wZXJ0eSAtIGNvcnJlY3RseQotCW1hdGNoZXMgYW55IHByZXZpb3VzIHZhbHVlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBkZXZpY2UKLQlub2RlLgotCi1UaHUgU2VwIDEyIDE3OjMwOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIG1vbi5jIChtb25fZXZlbnQpOiBSZW1vdmUgYXNzZXJ0aW9uIHRoYXQgYW4gdW5zaWduZWQgaXMgPj0gMC4KLQotRnJpIEF1ZyAxNiAxMjowNToyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGRldmljZS5jIChkZXZpY2VfZnVsbF9uYW1lKTogQ2FzdCBzdHJkdXAgdG8gY2hhciAqLCBzaW5jZSBBSVgKLQkzLjIuNSBtaXN0YWtlbmx5IGRlY2xhcmVzIHRoZSBmdW5jdGlvbiB0byBiZSBjb25zdCBjaGFyICouCi0JKGRldmljZV9jcmVhdGVfZnJvbSk6IERpdHRvLgotCShkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBEaXR0by4KLQkoZGV2aWNlX2FkZF9wcm9wZXJ0eSk6IERpdHRvLgotCi1UdWUgQXVnIDEzIDExOjQwOjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZGVidWcuYyAodHJhY2Vfb3B0aW9uKTogRm9yIC10IGFsbCwgZG8gbm90IHNldCB0aGUKLQl0cmFjZV9kdW1wX2RldmljZV90cmVlIGZsYWcsIHNvIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBydW4uCi0KLVR1ZSBBdWcgMTMgMTE6NDA6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAob3B0aW9ucy5vKTogRGVwZW5kIG9uIGRlZmluZXMuaC4KLQkoZGVmaW5lcy5oKTogTmV3IHJ1bGUsIGdvIHRocm91Z2ggY29uZmlnLmggYW5kIG1ha2Ugc3RyaW5ncyBvZiBhbGwKLQlvZiB0aGUgI2RlZmluZSBIQVZFX3h4eCBtYWNyb3MuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBkZWZpbmVzLmguCi0KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IHdoZXRoZXIgbWFueSBvZiB0aGUKLQljb25maWd1cmF0aW9uIG1hY3JvcyBhcmUgZGVmaW5lZC4KLQotCSogbWFpbi5jIChtYWluKTogSWYgLXQgb3B0aW9ucyBhbmQgbm8gZmlsZW5hbWUsIGp1c3QgcHJpbnQgdGhlCi0Jb3B0aW9ucywgYW5kIGRvbid0IHByaW50IHRoZSB1c2FnZSBtZXNzYWdlLgotCi1Nb24gQXVnIDEyIDE4OjQyOjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUZXN0IHdoZXRoZXIgL2Rldi96ZXJvIHdvcmtzIG9uIHRoZSBzeXN0ZW0sIGFuZCBpZgotCWl0IGRvZXMsIGRlZmluZSBIQVZFX0RFVlpFUk8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRG8gbm90IGFkZCAvaW9idXMvZGlzawotCWlmIHdlIGRvbid0IGhhdmUgYSB3b3JraW5nIC9kZXYvemVybyBvbiB0aGUgc3lzdGVtLgotCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9pbml0KTogSWYgSEFWRV9ERVZaRVJPIGlzIG5vdAotCWRlZmluZWQsIGRvbid0IGFkZCBkaXNrIHN1cHBvcnQuCi0JKGVtdWxfYnVnYXBpX2RvX2Rpc2tpbyk6IERpdHRvLgotCShlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogRGl0dG8uCi0KLVdlZCBBdWcgIDcgMTQ6MzQ6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbXVsX3VuaXguYyAoSEFWRV9UQ0dFVEFUVFIpOiBJZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFIGlzIG5vdAotCWRlZmluZWQsIG1ha2Ugc3VyZSBIQVZFX1RDR0VUQVRUUiBpcyAjdW5kZWYnZWQKLQotV2VkIEF1ZyAgNyAxNDozNDoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHN0ZC1jb25maWcuaCAoUkVHUEFSTSk6IE9ubHkgZGVmaW5lIFJFR1BBUk0gYXR0cmlidXRlcyBpZiB1c2luZwotCUdOVSBDLiAgVGVzdCBmb3IgX19pNjg2X18gaW4gY2FzZSBHQ0MgZXZlciBkZWZpbmVzIGl0LiAgSWYgbm90IG9uCi0JYSB4ODYgcGxhdGZvcm0sIGRlZmluZSBSRUdQQVJNIGFzIG5vdGhpbmcuCi0KLQkqIHNpbS1lbmRpYW4uaCAoV0lUSF9IT1NUX0JZVEVfT1JERVIpOiBUZXN0IGZvciBpNjg2IGFuZCBfX2k2ODZfXwotCWFsc28uCi0KLVdlZCBBdWcgIDcgMjA6MTk6NTUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogbGQtZGVjb2RlLmgsIGxkLWRlY29kZS5jOiBSZW5hbWUgZ290b19nZW4gdG8gdGhlIG1vcmUgY29ycmVjdAotIAlnb3RvX3N3aXRjaF9nZW4uCi0JKiBnZW4taWRlY29kZS5jOiBEaXR0by4KLQotCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV90YWJsZSk6IENvbW1lbnQgb3V0IGNoZWNrIGZvcgotIAlzd2l0Y2gvdGFibGUgY29tYmluYXRpb24gdW50aWwgYSBidWcgd2l0aCBpdCBpcyBmaXhlZC4KLQotCSogcHBjLW9wY29kZS1nb3RvOiBOZXcgZmlsZS4gIExpa2UgY29tcGxleCBhbmQgZmxhdCBidXQgdXNlcwotIAlnb3RvLXN3aXRjaCBpbnN0ZWFkIG9mIHBhZGRlZC1zd2l0Y2ggZm9yIHRoZSB0YWJsZXMuCi0KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2dvdG9fc3dpdGNoX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2dvdG9fc3dpdGNoX3RhYmxlX2xlYWYpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2dvdG9fc3dpdGNoX2JyZWFrKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9nb3RvX3N3aXRjaF90YWJsZSk6IE5ldyBmdW5jdGlvbi4gUHJpbnRzIGEganVtcCB0YWJsZQotCXRoYXQgY2FuIGJlIGp1bXBlZCBpbnRvIGluc3RlYWQgb2YgYSBzd2l0Y2ggc3RhdGVtZW50LgotCi0JKiBnZW4taWRlY29kZS5jICgqc3dpdGNoXyopOiBBcyBhbiBvcHRpb24gb3V0cHV0IGEgc3dpdGNoIHRoYXQgaXMKLSAJaW1wbGVtZW50ZWQgdXNpbmcgYSBqdW1wIHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBzd2l0Y2ggaXMgbm90Ci0gCWJvb2xlYW4uCi0JCi1UdWUgQXVnICA2IDA5OjI4OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0te2hhcmR3YXJlLHBhY2thZ2VzfSk6IEZpeCB0eXBvcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZCk6IEZpeHVwIGZvcm1hdCBtZXNzYWdlIGluCi0JZXJyb3IgY2FzZS4gIFJldHVybiAwIGluIGNhc2Ugb2YgZXJyb3IgdG8gc2h1dCB1cCBjb21waWxlcgotCXdhcm5pbmdzLgotCi1XZWQgQXVnICA3IDAwOjE3OjM3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZV90YWJsZS5jIChnZW5lcmljX2RldmljZV91bml0X2RlY29kZSk6IFJlcXVpcmUgYSBjb21tYQotICAgICAgICBiZXR3ZWVuIGVsZW1lbnRzIG9mIGEgdW5pdCBhZGRyZXNzLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogRm9yIHJlZywgYWx0ZXJuYXRlLXJlZyBhbmQKLSAgICAgICAgcmFuZ2VzIHByb3BlcnRpZXMgdXNlIHNwZWNpYWwgcHJpbnQgZnVuY3Rpb25zLgotCShkZXZpY2VfcHJpbnRfcmFuZ2VzX3Byb3BlcnR5KTogUHJpbnQgZm9ybWF0dGVkIHJhbmdlcyBwcm9wZXJ0eS4KLQkoZGV2aWNlX3ByaW50X3JlZ19wcm9wZXJ0eSk6IFByaW50IGZvcm1hdHRlZCByZWcgcHJvcGVydHkuCi0KLVR1ZSBBdWcgIDYgMjE6MzU6MTggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX2FkZF9wYXJzZWQpOiBGb3IgcmVnLCByYW5nZXMgYW5kCi0gICAgICAgIGFsdGVybmF0ZS1yZWcgcHJvcGVydGllcyB1c2UgYSBzcGVjaWFsIHBhcnNlci4KLQkoZGV2aWNlX3RyZWVfcGFyc2VfcmVnX3Byb3BlcnR5KTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIGEgcmVnCi0JcHJvcGVydHkuCi0JKGRldmljZV90cmVlX3BhcnNlX3Jhbmdlc19wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBhCi0JcmFuZ2VzIHByb3BlcnR5LgotCShkZXZpY2VfZW5jb2RlX3VuaXQpOiBXcmFwcGVyIGZvciBlbmNvZGVfdW5pdCBjYWxsYmFjay4KLQkoZGV2aWNlX2RlY29jZV91bml0KTogV3JhcHBlciBmb3IgZGVjb2RlX3VuaXQgY2FsbGJhY2suCi0KLVdlZCBKdWwgMzEgMDA6MDI6MzAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmggKGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MpOiBSZWxhY2UgdGhlIGNsYWltIGFuZAotICAgICAgICByZWxlYXNlIG1ldGhvZHMgd2l0aCBhIG1vcmUgZ2VuZXJhbCB0YWJsZSBtYXBwaW5nIGZyb20gbWV0aG9kLW5hbWUKLSAgICAgICAgdG8gbWV0aG9kLWZ1bmN0aW9uLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX2NhbGxfbWV0aG9kKTogTmV3IGZ1bmN0aW9uLiAgSW1wbGVtZW50Ci0gICAgICAgIHRoZSBPcGVuQm9vdCBjYWxsLW1ldGhvZCBjbGllbnQgaW50ZXJmYWNlLiAgQXR0ZW1wdHMgdG8gbG9jYXRlIHRoZQotICAgICAgICBpbnN0YW5jZXMgbWV0aG9kIGluIHRoZSBjYWxsYmFjayB0YWJsZS4KLQkoZGV2aWNlX2luc3RhbmNlX2NsYWltLCBkZXZpY2VfaW5zdGFuY2VfcmVsZWFzZSk6IERlbGV0ZS4KLSAgICAgICAgUmVwbGFjZWQgd2l0aCBjYWxsLW1ldGhvZCBhbmQgYSBsb29rdXAgdGFibGUuCi0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9jYWxsX21ldGhvZCk6IFVzZSB0aGUgbmV3IGRldmljZQotICAgICAgICBpbnN0YW5jZSBjYWxsIG1ldGhvZCBhbmQgbGV0IHRoYXQgaGFuZGxlIGEgY2xpZW50IGNsYWltIGNhbGwuCi0KLQkqIGh3X2h0YWIuYyAoY2xhaW1fbWVtb3J5KTogV3JhcHBlciBmdW5jdGlvbiB0byBjYWxsIHRoZSBtZW1vcnkKLSAgICAgICAgZGV2aWNlcyAiY2xhaW0iIG1ldGhvZCB1c2luZyB0aGUgbmV3IGRldmljZS1pbnN0YW5jZSBjYWxsLW1ldGhvZAotICAgICAgICBpbnRlcmZhY2UuICBSZXBsYWNlcyB0aGUgcHJldmlvdXMgZGlyZWN0IGNhbGxzIHRvIGNsYWltLgotCShodGFiX21hcF9yZWdpb24pOiBVc2UgY2xhaW1fbWVtb3J5LgotCShodGFiX2luaXRfZGF0YV9jYWxsYmFjayk6IERpdHRvLgotCi0JKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltKTogVXBkYXRlIGZ1bmN0aW9uCi0gICAgICAgIGludGVyZmFjZSBzbyB0aGF0IGl0IGlzIGNvbXBhdGlibGUgd2l0aCBjYWxsLW1ldGhvZC4KLQkoaHdfbWVtb3J5X2luc3RhbmNlX3JlbGVhc2UpOiBEaXR0by4KLQkoaHdfbWVtb3J5X2luc3RhbmNlX21ldGhvZHMpOiBOZXcgdGFibGUgb2YgbWVtb3J5IHNwZWNpZmljCi0gICAgICAgIG1ldGhvZHMgY2xhaW0gYW5kIHJlbGVhc2UuICBBZGQgdG8gdGhlIGh3X21lbW9yeV9jYWxsYmFjawotCXRhYmxlLgotCi1UdWUgSnVsIDMwIDIxOjI2OjE0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBzaW0uYyAocHNpbV9pbml0KTogQmFjayBvdXQgb2YgY2hhbmdlIHRvIGluaXRpYWwgdmFsdWUgb2YKLSAgICAgICAgc3lzdGVtLT5sYXN0X2NwdS4KLQotVHVlIEp1bCAzMCAyMToxMjoyNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzaW1fY2FsbGJhY2tzLmggKHNpbV9pb19wcmludGZfZmlsdGVyZWQpOiBSZXBsYWNlCi0JcHJpbnRmX2ZpbHRlcmVkIHdpdGggYSBsb2NhbCBzaW11bGF0b3Igc3BlY2lmaWMgdmVyc2lvbi4gIEFkZAotCSNkZWZpbmUgcHJpbnRmX2ZpbHRlcmVkIHRvIHNpbXBsaWZ5IHVwZGF0aW5nIG9mIGV4aXN0aW5nIGNvZGUuCi0KLQkqIHNpbV9jYWxsYmFja3MuaCAoc2ltX2lvX3dyaXRlX3N0ZG91dCwgc2ltX2lvX3JlYWRfc3RkaW4sCi0gICAgICAgIHNpbV9pb193cml0ZV9zdGRlcnIpOiBOZXcgZnVuY3Rpb25zLiAgUmVhZCAvIHdyaXRlIHRvIHRoZQotICAgICAgICBzaW11bGF0aW9ucyBzdGRpbiBhbmQgc3Rkb3V0IGFuZCBzdGRlcnIgaW50ZXJmYWNlcy4gIE1lcmdlIGluIGNvZGUKLSAgICAgICAgZnJvbSBod19wYWwgdGhhdCBwcmV2aW91c2x5IGhhbmRsZWQgYXN5bmMgSS9PLgotCShzaW1faW9fZmx1c2hfc3Rkb3V0cHV0KTogUmVuYW1lIGZsdXNoX3N0ZG91dHB1dC4gIEFkZCAjZGVmaW5lCi0JZmx1c2hfc3Rkb3V0cHV0IHRvIHNpbXBsaWZ5IHVwZGF0aW5nIG9mIGV4aXN0aW5nIGNvZGUuCi0KLQkqIGh3X3BhbC5jIChzY2FuX2h3X3BhbCwgd3JpdGVfaHdfcGFsLAotICAgICAgICBod19wYWxfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2spOiBVc2UgdGhlIG5ldyBzaW1faW8gZnVuY3Rpb25zLgotCi0JKiBtYWluLmM6IEltcGxlbWVudCBzdGFuZGFsb25lIHZlcnNpb25zIG9mIHRoZSBuZXcgc2ltX2lvCi0gICAgICAgIGZ1bmN0aW9ucy4gIEluY2x1ZGUgc3VwcG9ydCBmb3IgYXN5bmMgSS9PLgotCSogc2ltX2NhbGxzLmM6IERpdHRvLiAgVGhpcyB0aW1lIHVzaW5nIHRoZSBnZGIgY2FsbGJhY2sgdGFibGUuCi0KLQkqIHN0ZC1jb25maWcuaCAoQ1VSUkVOVF9TVERJTywgY3VycmVudF9zdGRpbyk6IE5ldyBtYWNyby4gU2V0IHVwCi0gICAgICAgIHN0ZGlvIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBpdCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHJlc3QKLSAgICAgICAgb2YgdGhlIHNpbXVsYXRpb24uCi0JKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogSW5pdGlhbGl6ZSBjdXJyZW50X3N0ZGlvIGZyb20gdGhlIGRldmljZQotICAgICAgICB0cmVlLgotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IEVudGVyIGEgZGVmYXVsdCB2YWx1ZQotICAgICAgICBmb3IgdXNlLXN0ZGlvIGluIHRoZSBkZXZpY2UgdHJlZS4KLQotRnJpIEp1bCAyNiAxOTo0MzowMyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wKTogV2FzIGFsd2F5cyBnZW5lcmF0aW5nIGEganVtcCBiYWNrIHRvCi0gCWlkZWNvZGUuICBPbmx5IG5lY2Vzc2FyeSBhdCB0YWlsIG9mIHNlbWFudGljIGNvZGUuCi0JKHByaW50X2p1bXApOiBXYXMgYWx3YXlzIHNldHRpbmcgdGhlIHByb2Nlc3NvcidzIGNpYSwgZXZlbiBkdXJpbmcKLSAJc3RhcnR1cCB3aGVuIHRoZSBwcm9jZXNzb3Igd2FzIHN0aWxsIHVuZGVmaW5lZC4KLQkocHJpbnRfanVtcCk6IEZvciBzYWZldHksIHJlc3RhcnQgc21wIGxvb3Agd2hlbiBjcHVfbnIgPj0gbnJfY3B1cywKLSAJbm90IGp1c3QgZXF1YWwuCi0JCi0JKiBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpOiBBZGQgcHJpbnRpbmcgb2YgV0lUSF9SRUdQQVJNIGFuZAotIAlXSVRIX1NURENBTEwuCi0KLQkqIHN0ZC1jb25maWcuaCAoV0lUSF9SRUdQQVJNLCBXSVRIX1NURENBTEwpOiBQcm92aWRlIGRlZmF1bHQKLSAJKGRpc2FibGVkKSB2YWx1ZXMgaWYgbm90IGRlZmluZWQuCi0KLUZyaSBKdWwgMjYgMDA6MzY6MzUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHBjLWNhY2hlLXJ1bGVzIChjYWNoZSk6IENoYW5nZSBSUyBhbmQgUkIgdG8gY2FjaGUgaW5zdGVhZCBvZgotICAgICAgICBjb21wdXRlLiAgVGhlIGJsb2NrIG1vdmUgaW5zdHJ1Y3Rpb25zIHVzZSB0aGVtLgotCi0JKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoRlBTQ1JfU0VUKTogTmV3IG1hY3JvLCBzZXQgc3BlY2lmaWMgRlBTQ1IKLSAgICAgICAgcmVnaXN0ZXIuCi0JKENSX0ZJRUxEKTogTmV3IG1hY3JvLCBleHRyYWN0IHNwZWNpZmljIENSIHJlZ2lzdGVyLgotCShGUFNDUl9GSUVMRCk6IE5ldyBtYWNybywgZXh0cmFjdCBzcGVjaWZpYyBGUFNDUiByZWdpc3Rlci4KLQotCSogcmVnaXN0ZXJzLmggKEdQUik6IE5ldyBtYWNybywgc2ltcGxpZnkgYWNjZXNzZXMgdG8gR1BSW2ldLgotCi0JKiBiaXRzLmMgKElOU0VSVEVEKTogQ292ZXJ0IElOU0VSVEVEIG1hY3JvIGludG8gYSBmdW5jdGlvbi4KLQkoRVhUUkFDVEVEKTogQ29uZGl0aW9uYWxseSBjb21waWxlIG9uIGNvcnJlY3QgYml0IHNpemUgbWFjcm8uCi0KLQkqIGJpdHMuaCAoQklUOCk6IE5ldyBtYWNybywgc2V0IGEgc2luZ2xlIGJpdCBpbiBhbiA4IGJpdCBieXRlLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zOiBXaXRoIGhpbnRzIGZyb20gUGF1bCBNYXJ0aW4sIHR5cGUgaW4gbWlzc2luZwotCXNvbWUgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzLiAgTGVhdmUgZGlzYWJsZWQgZm9yIHRoZSBtb21lbnQuCi0JKExvYWQgTXVsdGlwbGUgV29yZCk6IERpdHRvLgotCShTdG9yZSBNdWx0aXBsZSBXb3JkKTogRGl0dG8uCi0JKExvYWQgU3RyaW5nIFdvcmQgSW1tZWRpYXRlKTogRGl0dG8uCi0JKExvYWQgU3RyaW5nIFdvcmQgSW5kZXhlZCk6IERpdHRvLgotCShTdG9yZSBTdHJpbmcgV29yZCBJbW1lZGF0ZSk6IERpdHRvLgotCShTdG9yZSBTdHJpbmcgV29yZCBJbmRleGVkKTogRGl0dG8uCi0JKE1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gWEVSKTogRGl0dG8uCi0JKE1vdmUgRnJvbSBDb25kaXRpb24gUmVnaXN0ZXIpOiBEaXR0by4KLQkoTW92ZSBGcm9tIEZQU0NSKTogRGl0dG8uCi0JKE1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gRlBTQ1IpOiBEaXR0by4KLQkoTW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUpOiBEaXR0by4KLQkoTW92ZSBUbyBGUFNDUiBGaWVsZHMpOiBEaXR0by4KLQkoTW92ZSBUbyBGUFNDUiBCaXQgMCk6IERpdHRvLgotCShNb3ZlIFRvIEZQU0NSIEJpdCAxKTogRGl0dG8uCi0KLVRodSBKdWwgMjUgMjI6MTA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogc3RkLWNvbmZpZy5oIChTRU1BTlRJQ1NfSU5MSU5FKTogQnkgZGVmYXVsdCwgbWFzayBvdXQgdGhlCi0gICAgICAgIGlubGluaW5nIG9mIHNlbWFudGljIGZ1bmN0aW9ucyBmcm9tIERFRkFVTFRfSU5MSU5FLiAgQWxtb3N0IGFsbAotICAgICAgICBjb25maWd1cmF0aW9ucyBjYWxsIHRoZSBzZW1hbnRpYyBjb2RlIHZpYSBhIHBvaW50ZXIgc28gdGhlcmUgaXMKLSAgICAgICAgbGl0dGxlIGJlbmVmaXQuCi0KLQkqIHN0ZC1jb25maWcuaCAoSUNBQ0hFX0lOTElORSk6IERpdHRvLgotCi1UaHUgSnVsIDI1IDIwOjA3OjMwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc2ltX3JlZ3Bhcm0pOiBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yCi0gICAgICAgIGVuYWJsaW5nIEdDQydzIHJlZ3Bhcm0gYXR0cmlidXRlLgotCSogKHNpbV9zdGRjYWxsKTogQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGZvciBlbmFibGluZyBHQ0MncwotICAgICAgICBzdGRjYWxsIGF0dHJpYnV0ZS4KLQotCSogTWFrZWZpbGUuaW4gKFJFR1BBUk1fQ0ZMQUdTKTogUGFzcyByZWdwYXJhbSBjb25maWd1cmF0aW9uIG9udG8KLSAgICAgICAgY29tcGlsYXRpb25zLgotCSogKFNURENBTExfQ0ZMQUdTKTogUGFzcyBzdGRjYWxsIGNvbmZpZ3VyYXRpb24gb250byBjb21waWxhdGlvbnMuCi0KLQkqIHN0ZC1jb25maWcuaCAoUkVHUEFSTSk6IEV4dGVuZCBjb25zdHJ1Y3Rpb24gb2YgUkVHUEFSTSBtYWNybyBzbwotICAgICAgICB0aGF0IGl0IGNhbiBpbmNsdWRlIF9fc3RkY2FsbF9fIGZ1bmN0aW9uIGF0dHJpYnV0ZS4KLQotV2VkIEp1bCAyNCAxOTowNDoyMCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHNhd25vZmY+Ci0KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IEluY2x1ZGUgU1VQUE9SVF9JTkxJTkUgaW4gaW5mb3JtYXRpb24KLSAJZHVtcC4KLQotCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfcnVuX3VudGlsX3N0b3BfYm9keSk6IE9ubHkgZ2VuZXJhdGUgbG9vcAotIAl0ZXJtaW5hdGlvbiB0ZXN0IGlmIGNyZWF0aW5nIGlkZWNvZGVfcnVuX3VudGlsX3N0b3AuICBQdXNoIHRoZQotIAlsb29wIHRlcm1pbmF0aW9uIHRlc3QgYmFjayBpbnRvIGVhY2ggYWx0ZXJuYXRpdmUgYnJhbmNoLgotCi1XZWQgSnVsIDI0IDE1OjQ3OjA5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2Z1bmN0aW9uKTogSGF2ZSB0aGUgY2FjaGUgZnVuY3Rpb24KLSAJYWx3YXlzIHVwZGF0ZSB0aGUgY2FjaGVfZW50cmllcyBzZW1hbnRpYyBhbmQgYWRkcmVzcyBmaWVsZHMuCi0KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfc3dpdGNoX2lsbGVnYWwpOiBJbmNsdWRlIGEgYnJlYWsKLSAJd2hlbiBnZW5lcmF0aW5nIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3YXMgY29tbWVudGVkIG91dAotIAl3aGljaCBpcyBhIGhhbmdvdmVyIGZyb20gbG9va2luZyBhIGF0IHN3aXRjaCBzdGF0ZW1lbnRzIGdlbmVyYXRlZAotIAl1c2luZyBpbmRpcmVjdCBqdW1wcy4KLQotVHVlIEp1bCAyMyAyMDo1NzowMSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBpZ2VuLmMgKHByaW50X215X2RlZmluZXMpOiBSZXBsYWNlcyBwcmludF9kZWZpbmVfbXlfaW5kZXguCi0gICAgICAgIFByaW50IGJvdGggYSBkZWZpbml0aW9uIGZvciBNWV9JTkRFWCBhbmQgTVlfUFJFRklYLgotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb24pOiBBZGp1c3QuCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX2luc24pOiBBZGp1c3QuCi0JKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X2Nfc2VtYW50aWMpOiBBZGp1c3QuCi0KLQkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBBZGQgb3B0aW9uYWwgaW5jbHVkZSB0byBjcmVhdGVkCi0gICAgICAgIHN1cHBvcnQuaCBzbyB0aGF0LCBsaWtlIGNwdSwgaXQgaXMgb3B0aW9uYWxseSBpbmxpbmVkIGZvciBhbGwKLSAgICAgICAgbW9kdWxlcyB0aGF0IGluY2x1ZGUgaXQuCi0JKiBpbmxpbmUuaCwgaW5saW5lLmM6IEFkanVzdCBzbyB0aGF0IHN1cHBvcnQuW2hjXSBpcyBoYW5kbGVkIHRoZQotICAgICAgICBzYW1lIGFzIGNwdS5baGNdLgotCi0JKiBpZGVjb2RlX2ZpZWxkcy5oIChMQUJFTCwgR09UTyk6IE1hY3JvJ3MgdGhhdCBjcmVhdGUgYSB1bmlxdWUKLSAgICAgICAgbmFtZSBmb3IgYSBsYWJsZSBhbmQgdGhlbiBicmFuY2ggdG8gaXQuCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKGNvbnZlcnRfdG9faW50ZWdlciwgRmxvYXRpbmcgUm91bmQgdG8KLSAgICAgICAgU2luZ2xlLVByZWNpc2lvbiwgRmxvYXRpbmcgQ29udmVydCBmcm9tIEludGVnZXIgRG91Ymxld29yZCk6IFVzZQotICAgICAgICBMQUJFTCBhbmQgR09UTyBpbnN0ZWFkIG9mIHRoZSByZWNlbnRseSBhZGRlZCBzd2l0Y2ggc3RhdGVtZW50cy4KLQotV2VkIEp1bCAyNCAxNDowMjo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHNhd25vZmYuaGlnaGxhbmQuY29tLmF1PgotCi0JKiBnZW4taWRlY29kZS5jIChwcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KTogVG9vIG1hbnkgcnBhcmVuIGluCi0gCWdlbmVyYXRlZCBjb2RlLgotCi1UdWUgSnVsIDIzIDIwOjU3OjAxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWxpbmUtbnIpOiBUeXBvIC0gc2ltX2xpbmUtbnIuCi0JKiAoLS1lbmFibGUtc2ltLWlubGluZSk6IFJlb3JkZXIgcGF0ZXJuIG1hdGNoaW5nIG9mIGFyZ3VtZW50cyBzbwotICAgICAgICB0aGF0IFNVUFBPUlQ9QUxMX0lOTElORSBpcyByZWNvbml6ZWQgYXMgKj0qIGFuZCBub3QgKl9JTkxJTkUuCi0KLQkqIGNvbmZpZ3VyZTogcmVidWlsZC4KLQotTW9uIEp1bCAyMiAyMzoyNTowOCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0taGFyZHdhcmUsIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyk6IE5ldwotICAgICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMuICBMZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgcGFja2FnZXMgb3IKLSAgICAgICAgaGFyZHdhcmUgZGV2aWNlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuICBNYWtlcyBpdAotICAgICAgICBwb3NzaWJsZSBmb3IgdXNlciBwYWNrYWdlcyB0byBiZSBzcGVjaWZpZWQuCi0KLQkqIE1ha2VmaWxlLmluICh0bXAtcGssIHRtcC1odyk6IEp1c3QgdXNlIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGFuZAotCWhhcmR3YXJlIGluc3RlYWQgb2YgY2hlY2tpbmcgaXQgdXNpbmcgbHMuICBjb25maWd1cmUuaW4gc2hvdWxkCi0JaGF2ZSB0YWtlbiBjYXJlIG9mIGFueSBwcm9ibGVtcy4KLQkoSFdfU1JDLCBIV19PQkosIFBBQ0tBR0VfU1JDLCBQQUNLQUdFX09CSik6IFNldCBieSBjb25maWd1cmUuCi0KLU1vbiBKdWwgMjIgMjI6Mzg6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogRW50ZXIgdGhlIGFyZ3VtZW50IHRvIHRoZSBtZW1vcnkgc2l6ZQotICAgICAgICBvcHRpb24gZGlyZWN0bHkgaW50byB0aGUgZGV2aWNlIHRyZWUuICBXYXMgdXNpbmcgYXRvbCgpIHdoaWNoIGlzCi0gICAgICAgIGRhbmdlcm91c2x5IG5vbiBwb3J0YWJsZS4KLQotTW9uIEp1bCAyMiAyMjoxNzowOCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChpY2FjaGUpOiBFeHRlbmQgaWNhY2hlIGZsYWcgdG8gaW5jbHVkZSBhbiBpbnNuCi0gICAgICAgIG9wdGlvbi4gIElmIHNwZWNpZnllZCB0aGUgaW5zbiAtIGFrYSBpbnN0cnVjdGlvbiAtIGlzIGluY2x1ZGVkIGluCi0gICAgICAgIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gIE1ha2UgdGhpcyB0aGUgZGVmYXVsdC4KLQkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCi0KLQkqIGlnZW4uYyAobWFpbiksIGlnZW4uaDogQWRkIG9wdGlvbiAtUyAtIGluU24gLSBmb3Igc3BlY2lmeWluZwotICAgICAgICB0aGF0IHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGljYWNoZS4KLQotCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IElmIGVuYWJsZWQsIG91dHB1dCBjb2RlIHRvIHB1dAotICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgaWNhY2hlLgotCShwcmludF9pY2FjaGVfc3RydWN0KTogSWYgZW5hYmxlZCwgYWRkIGluc24gdG8gdGhlIGljYWNoZSBzdHJ1Y3QuCi0KLU1vbiBKdWwgMjIgMjA6NDY6MTIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChCVUlMRF9DRkxBR1MpOiBJbmNsdWRlIC1nIHdoZW4gYnVpbGRpbmcgdGhlCi0gICAgICAgIGdlbmVyYXRvcnMuCi0KLU1vbiBKdWwgMjIgMjA6MDA6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBXYXMgaW5jb3JyZWN0bHkgc2V0dGluZwotICAgICAgICB0aGUgc3RyaWN0LWFsaWdubWVudCBvcHRpb24gd2hlbiBoYXJkd2lyZWQgZm9yIG5vbi1zdHJpY3QKLSAgICAgICAgYWxpZ25tZW50LgotCi1TdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGdlbi1zZW1hbnRpY3MuYzogTWFrZSB0aGUgbXlfaW5kZXggdmFyaWFibGUgYSBtYWNybyBNWV9JTkRFWC4KLQotCSogcHBjLWluc3RydWN0aW9uczogQWRqdXN0IHNvIHRoYXQgcmVmZXJlbmNlcyBhcmUgdG8gTVlfSU5ERVggYW5kCi0gICAgICAgIG5vdCBteV9pbmRleC4KLQotU3VuIEp1bCAyMSAyMToxODowNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBnZW4taWRlY29kZS5jOiBPdXRwdXQgdGhlIGNvbXBsZXRlIHJ1bl91bnRpbF9zdG9wIGZ1bmN0aW9uCi0gICAgICAgIGluc3RlYWQgb2YganVzdCB0aGUgY29kZSB0byBoYW5kbGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaXNzdWUuCi0JKiA6IEhhdmUgdGhlIGdlbmVyYXRlZCBpZGVjb2RlLmMgaW5jbHVkZSBpbmxpbmUuYyAoaW5zdGVhZCBvZiBwc2ltLmMpLgotCi0JKiBzdGQtY29uZmlnLmg6IENoYW5nZSBwc2ltLmMgc28gdGhhdCBpdCBpc24ndCBpbmxpbmVkIChhcyB0aGlzIGlzCi0gICAgICAgIG5vIGxvbmdlciBuZWVkZWQpLgotCi0JKiBwc2ltLmMgKHJ1bl91bnRpbF9zdG9wKTogRGVsZXRlIHRoZSBvbGQgcnVuX3VudGlsX3N0b3AgZnVuY3Rpb24KLSAgICAgICAgaW5zdGVhZCBjYWxsaW5nIHRoZSBpZGVjb2RlX3J1biBhbmQgaWRlY29kZV9ydW5fdW50aWxfc3RvcAotICAgICAgICBmdW5jdGlvbnMgdGhhdCBnZW4taWRlY29kZS5jIGlzIG5vdyBjcmVhdGluZy4KLQotU3VuIEp1bCAyMSAyMToxODowNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZ2VuLmM6IE1haW50ZW5hbmNlIC0gdXBkYXRlIHRvIHVzZSBuZXcgZmVhdHVyZXMgZm91bmQgaW4gbGYuYy4KLQotCSogZmlsdGVyX2ZpbGVuYW1lLmMgKGZpbHRlcl9maWxlbmFtZSk6IE1haW50ZW5hbmNlIC0gbWFrZSB0aGUKLSAgICAgICAgc3RyaW5nIGNvbnN0YW50LgotCi1TdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRlYnVnLmMgKFRSQUNFLCBJVFJBQ0UsIERUUkFDRSk6IEhhdmUgR0NDIGluc3RlYWQgb2YgQ1BQCi0gICAgICAgIGVsaW1pbmF0ZSB0cmFjZSBzdGF0ZW1lbnRzLgotCi0JKiBkZWJ1Zy5jOiBDaGFuZ2UgdHJhY2UgZm9ybWF0IHNvIHRoYXQgaXQgaXMgY29uc2lzdGVudAotICAgICAgICAoZmlsZTpsaW5lLW5yKSB3aXRoIENDJ3MgZXJyb3Igb3V0cHV0LgotCi0JKiBnZW4taXRhYmxlLmMgKGl0YWJsZV9jX2luc24pOiBBZGQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgYW5kCi0gICAgICAgIHNvdXJjZSBsaW5lIG51bWJlciB0byB0aGUgaW5zdHJ1Y3Rpb24ncyBpbmZvcm1hdGlvbmFsIGVudHJ5LgotCi0JKiBkZWJ1Zy5jIChJVFJBQ0UpOiBVc2UgdGhlIGl0YWJsZSAoYW5kIG15X2luZGV4KSB0byBnZXQgdGhlCi0gICAgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb25zIG5hbWUgYW5kIHNvdXJjZSBsaW5lIG51bWJlci4KLQotCSogZ2VuLXNlbWFudGljcy5jLCBnZW4taWNhY2hlLmM6IEFkanVzdCBnZW5lcmF0ZWQgSVRSQUNFIGNhbGxzIHRvCi0gICAgICAgIG1hdGNoIG5ldyBpbnRlcmZhY2UuCi0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpOiBBZGp1c3QKLSAgICAgICAgY29ycmVzcG9uZGluZyBjYWxsIHRvIElUUkFDRSBzbyB0aGF0IGl0IHN0aWxsIG1hdGNoZXMuCi0KLQkqIGlkZWNvZGVfZXhwcmVzc2lvbi5oIChBTFVfRU5ELCBDUjBfQ09NUEFSRSk6IFVzZSBUUkFDRSBpbnN0ZWFkCi0gICAgICAgIG9mIElUUkFDRS4gIFRoZSBDUFAgbGluZSBkaXJlY3RpdmVzIHdvdWxkIGhhdmUgcHJldmlvdXNseSBzZXQgdGhlCi0gICAgICAgIGxpbmUtbnIgYW5kIGZpbGUgbmFtZSBzbyBJVFJBQ0UgaXNuJ3QgbmVlZGVkLgotCi1TdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogTmV3IGZ1bmN0aW9uIGFuZAotICAgICAgICBpZGVjb2RlIGdlbmVyYXRpb24gb3B0aW9uLiAgSW5zdGVhZCBvZiBnZW5lcmF0aW5nIGFuZCBjYWxsaW5nCi0gICAgICAgIHNlcGFyYXRlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBzZW1hbnRpYyBhbmQgaWNhY2hlIGNvZGUKLSAgICAgICAgZ2VuZXJhdGUgYSBzaW5nbGUgbW9ub2x5dGhpYyBmdW5jdGlvbiBhbmQgdXNlIGdvdG8ncyAoYW5kIEdDQydzCi0gICAgICAgIGluZGlyZWN0IGp1bXApIHRvIG1vdmUgYmV0d2VlbiBjb2RlIGJsb2Nrcy4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBzaW1fanVtcCBmbGFnIHRvIHRob3NlIHBhc3NlZCB0byBpZ2VuLgotCi0JKiBjb25maWd1cmUuaW46IE5ldyBvcHRpb24gLS1lbmFibGUtc2ltLWp1bXAgKGRlZmF1bHQgZGlzYWJsZWQpCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnM6IEVsaW1pbmF0ZSBhbnkgdXNlcyBvZiBsYWJlbHMgYW5kIGdvdG8ncy4KLSAgICAgICAgVGhlc2UgcmVzdWx0IGluIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgd2hlbiBhIHNpbmdsZSBmbGF0IGZ1bmN0aW9uCi0gICAgICAgIGlzIGJlaW5nIGNyZWF0ZS4KLQotCSogcHBjLW9wY29kZS1qdW1wOiBOZXcgZmlsZS4gIFNldCBvZiBvcGNvZGUgcnVsZXMgdXNlZnVsIHdoZW4KLSAgICAgICAgdGVzdGluZyBqdW1waW5nIGlkZWNvZGVzLgotCi1TdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGdlbi1pZGVjb2RlLmM6IE9wdGlvbmFsbHkgaW5jbHVkZSB0aGUgc2VtYW50aWMgY29kZSBmb3IgYW4KLSAgICAgICAgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXMgZG9pbmcgdGhlIGRlY29kaW5nLgotCi0JKiBpZ2VuLmM6IEFkZCBvcHRpb24gKC1DKSB0byBnZW5lcmF0ZSBzZW1hbnRpY3MgaW4gdGhlIGluc3RydWN0aW9uCi0gICAgICAgIGRlY29kZSBmdW5jdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWljYWNoZSk6IEFjY2VwdCBhbiBvcHRpb24gbGlzdCBzdWNoCi0gICAgICAgIGFzIDEwMjQsZGVmaW5lLiAgQWRkIGEgbmV3IGNob2ljZSB0byB0aGUgbGlzdCAtIHNlbWFudGljIC0gd2hpY2gKLSAgICAgICAgd2lsbCBjYXVzZSBpZ2VuIHRvIGdlbmVyYXRlIGluc3RydWN0aW9uIGRlY29kZSBmdW5jdGlvbnMgdGhhdAotICAgICAgICBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIHNlbWFudGljIGNvZGUuCi0KLVN1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluOiBOZXcgb3B0aW9uIC0tZW5hYmxlLXNpbS1saW5lLW5yIChkZWZhdWx0IGVuYWJsZWQpLgotICAgICAgICBFbmFibGUvZGlzYWJsZSB0aGUgaW5jbHVzaW9uIG9mIENQUCBsaW5lIGRpcmVjdGl2ZXMgaW4gdGhlCi0gICAgICAgIGdlbmVyYXRlZCBmaWxlcy4gIFN1Y2ggZGlyZWN0aXZlcyByZWZlciBiYWNrIHRvIHRoZSBzb3VyY2UgZmlsZXMKLSAgICAgICAgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHNpbXVsYXRvciBjb2RlLgotCi0JKiBNYWtlZmlsZS5pbiAoc2ltX2xpbmVfbnIpOiBQYXNzIHRvIGlnZW4uCi0KLVN1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaWdlbi5jIChtYWluKTogUmV2YW1wIHRoZSBvcHRpb25zIHNvIHRoYXQgbW9yZSBsZXR0ZXJzIGFyZQotICAgICAgICBhdmFpbGFibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0IHRvIG1hdGNoIGlnZW4ncyByZXZhbXBlZCBvcHRpb25zCi0KLVN1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKHBrLmgsIGh3LmgpOiBSZXdyaXRlIGRlcGVuZW5jaWVzIGZvciBody5oIChldGMpIHNvCi0gICAgICAgIHRoYXQgdGhleSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIGlnZW4gKGllIGEgZHVtbXkgdGFyZ2V0cwotICAgICAgICB0bXAtcGsgYW5kIHRtcC1odyBhcmUgY3JlYXRlZCkuCi0KLU1vbiBKdW4gMjQgMjI6Mjg6MDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKEJVSUxEX0NGTEFHUyk6IEluY2x1ZGUgV0FSTklOR19DRkxBR1MuCi0KLVdlZCBKdW4gMTkgMjE6NDU6MjggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogbGQtY2FjaGUuW2hjXSwgbGQtZGVjb2RlLltoY10sIGxkLWluc24uW2hjXTogTmV3IGZpbGVzLiBTZXBhcmF0ZQotICAgICAgICBvdXQgdGhlIGxvYWRpbmcgb2YgZWFjaCBvZiB0aGUgdGFibGVzIGZyb20gdGhlIHJlc3Qgb2YgaWdlbi4KLQkqIE1ha2VmaWxlLmluOiBBZGp1c3QuCi0JKiBpZ2VuLmM6IEFkanVzdC4KLQotCSogZ2VuLWljYWNoZS5baGNdLCBnZW4taWRlY29kZS5baGNdLCBnZW4taXRhYmxlLltoY10sCi0gICAgICAgIGdlbi1tb2RlbC5baGNdLCBnZW4tc2VtYW50aWNzLltoY106IE5ldyBmaWxlcy4gU2VwYXJhdGUgb3V0IHRoZQotICAgICAgICBjb2RlIGNyZWF0aW5nIGVhY2ggc2VwYXJhdGUgc2V0IG9mIGdlbmVyYXRlZCBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBBZGp1c3QuCi0JKiBpZ2VuLmM6IEFkanVzdC4KLQotCSogZ2VuLXN1cHBvcnQuW2NoXTogTmV3IGZpbGVzLiBPdXRwdXQgdGhlIHN1cHBvcnQgZnVuY3Rpb25zIChmb3VuZAotICAgICAgICBpbiB0aGUgcHBjLWluc3RydWN0aW9ucyBmaWxlKSBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBBZGQuCi0JKiBpbmxpbmUuaCwgaW5saW5lLmM6IEFkZC4KLQkqIHN0ZC1jb25maWcuaDogQWRkLgotCi0JKiBsZC1jYWNoZS5jOiBSZS1kZXNpZ24gdGhlIGNhY2hlIHRhYmxlIGZvcm1hdC4KLQkqIHBwYy1jYWNoZS1ydWxlczogVXBkYXRlIHRvIG5ldyBmb3JtYXQuCi0KLQkqIGxkLWRlY29kZS5jOiBSZS1kZXNpZ24gdGhlIGRlY29kZSB0YWJsZSBmb3JtYXQuCi0JKiBwcGMtb3Bjb2RlLXNpbXBsZTogVXBkYXRlIHRvIG5ldyBmb3JtYXQKLQkqIHBwYy1vcGNvZGUtY29tcGxleDogRGl0dG8KLQkqIHBwYy1vcGNvZGUtZmxhdDogRGl0dG8KLQotCSogZmlsdGVyLmgsIGZpbHRlci5jOiBOZXcgZmlsZXMuIFNlcGFyYXRlIHRoZSBvcGNvZGUgZmlsdGVyIHRhYmxlCi0gICAgICAgIHJlYWRpbmcgY29kZSBmcm9tIHRoZSByZXN0IG9mIGlnZW4uYy4gIFJlLWRlc2lnbiB0aGUgZmlsdGVyIHNvIHRoYXQKLQlpdCB3b3JrcyBpbmNsdXNpdmx5IG5vdCBleGNsdXNpdmx5LgotCSogaWdlbi5jOiBSZW1vdmUgdGhlIG9wY29kZSBmaWx0ZXIgdGFibGUgbG9hZGluZyBjb2RlLgotCSogTWFrZWZpbGUuaW4gKGZpbHRlci5vKTogQWRqdXN0Ci0JKiBjb25maWd1cmUuaW46IEFkanVzdCBmaWx0ZXIgZmxhZyBzbyB0aGF0IGRlZmF1bHQgaW5jbHVkZXMgMzJiaXQKLQlhbmQgZmxvYXRpbmcgcG9pbnQuCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zOiBDbGVhbiB1cCBmaWx0ZXIgZmllbGRzIHNvIHRoYXQgb25seSBpbiB1c2UKLSAgICAgICAgZW50cmllcyBhcmUgc3BlY2lmZWQgKGllIGRlbGV0ZSBgYmUnKS4KLQotCSogbWlzYy5jIChuYW1lMmksIGkybmFtZSk6IE5ldyBmdW5jdGlvbi4gIE1hcCBiZXR3ZWVuIGEgc3RyaW5nIGFuZAotICAgICAgICBhbiBpbnRlZ2VyIHZhbHVlLgotCi1Nb24gSnVuIDE3IDIwOjA4OjAzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIHNpbV9jYWxscy5jIChzaW1fY2xvc2UpOiBJZiBzaW11bGF0b3Igbm90IGNyZWF0ZWQsIHNraXAgcHJpbnRpbmcKLSAgICAgICAgb2YgcnVuIGluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDE3IDIwOjA4OjAzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIHJlZ2lzdGVycy5jIChyZWdpc3Rlcl9kZXNjcmlwdGlvbik6IFR5cG8sIGluc25zIG5vdCBpbnNuLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF9nZXRfbnVtYmVyX29mX3N0YWxscyk6IE5ldyBtb2RlbCBmdW5jdGlvbiwKLQlyZXR1cm5zIG51bWJlciBvZiBzdGFsbHMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgotCSogcHNpbS5jIChwc2ltX3JlYWRfcmVnaXN0ZXIpOiBBZGQgY2FsbCB0byBuZXcgZnVuY3Rpb24KLQltb2RlbF9nZXRfbnVtYmVyX29mX3N0YWxscygpLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlcyk6IE5ldyBtb2RlbCBmdW5jdGlvbiwKLQlyZXR1cm5zIG51bWJlciBvZiBzdGFsbHMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgotCSogcHNpbS5jIChwc2ltX3JlYWRfcmVnaXN0ZXIpOiBBZGQgY2FsbCB0byBuZXcgZnVuY3Rpb24KLQltb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlcygpLgotCi1GcmkgSnVuIDE0IDAwOjExOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZV90YWJsZS5oOiBEb24ndCBwYXNzIHRoZSBwYXJlbnQgZGV2aWNlIGludG8gYSBkZXZpY2VzCi0gICAgICAgIGNyZWF0ZSBmdW5jdGlvbi4gIFRoaXMgbWFrZXMgdGhlIGNyZWF0ZSBmdW5jdGlvbiBjb25zaXN0ZW50IHdpdGgKLSAgICAgICAgdGhlIGRvY3VtZW50YXRpb24uCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RlbXBsYXRlX2NyZWF0ZV9kZXZpY2UpOiBEaXR0bwotCSogaHdfcGFsLmMgKGh3X3BhbF9jcmVhdGUpOiBEaXR0bwotCSogaHdfY29yZS5jIChod19jb3JlX2NyZWF0ZSk6IERpdHRvCi0JKiBod192bS5jIChod192bV9jcmVhdGUpOiBEaXR0bwotCSogaHdfZGlzay5jIChod19kaXNrX2NyZWF0ZSk6IERpdHRvCi0JKiBod19udnJhbS5jIChod19udnJhbV9jcmVhdGUpOiBEaXR0bwotCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9jcmVhdGUpOiBEaXR0bwotCSogaHdfY3B1LmMgKGh3X2NwdV9jcmVhdGUpOiBEaXR0by4KLQotCSogZGV2aWNlLmMgKHNwbGl0X2ZpbmRfZGV2aWNlKTogQWxsb3cgYSBudWxsIGluaXRpYWwgcGFyZW50IGRldmljZS4KLQkoZGV2aWNlX3RlbXBsYXRlX2NyZWF0ZV9kZXZpY2UpOiBEaXR0by4KLQotCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IE1ha2UgbG9jYWwgKHN0YXRpYykgb25seSB1c2VkCi0gICAgICAgIHdpdGhpbiBkZXZpY2UuYy4KLQkqIGRldmljZV90YWJsZS5oOiB0eXBlZGVmIGRldmljZV9jYWxsYmFja3MgbW92ZWQgaGVyZSAoZnJvbQotICAgICAgICBkZXZpY2UuaCkgd2hlcmUgaXQgYmVsb25ncy4KLQotCSogaHdfY29yZS5jOiBOZXcgZmlsZS4gSW1wbGVtZW50cyBqdXN0IHRoZSBjb3JlIGRldmljZSB1c2luZyB0aGUKLSAgICAgICAgY29yZSBvYmplY3QuCi0KLQkqIGNvcmVmaWxlLmM6IE1vdmVkIGFsbCBjb3JlIGRldmljZSBmdW5jdGlvbnMgaW50byB0aGUgbmV3Ci0gICAgICAgIGh3X2NvcmUuYyBmaWxlLiBjb3JlX2RldmljZV9jcmVhdGUoKSBkaXNhcGVhcnMuCi0KLQkqIHBzaW0uYyAocHNpbV90cmVlKTogVXNlIGRldmljZV90cmVlX2FkZF9wYXJzZWQoKSB0byBjcmVhdGUgdGhlCi0gICAgICAgIGNvcmUgZGV2aWNlLgotCi1UaHUgSnVuIDEzIDAwOjA5OjI5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2luaXQuYzogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0KLQkqIGNvcmVmaWxlLmMgKGNvcmVfaW5pdCk6IFJlbW92ZSBhbnkgcmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gYQotICAgICAgICBkZWZhdWx0IG1hcC4KLQkoY29yZV9tYXBfZmluZF9tYXBwaW5nKTogRGl0dG8uCi0KLVdlZCBKdW4gMTIgMjI6MzA6MzIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29yZWZpbGUuYyAoY29yZV9pbml0KTogTWFrZSBmdW5jdGlvbiBnbG9iYWwgc28gdGhhdCBvdGhlcgotICAgICAgICBkZXZpY2VzIGFyZSBhYmxlIHRvIHVzZSB0aGUgZnVsbCBjb3JlIG9iamVjdC4KLQotCSogY29yZWZpbGUuYyAoY29yZV9jcmVhdGUsIGNvcmVfZnJvbV9kZXZpY2UpOiBCcmVhayBjb3JlX2NyZWF0ZQotICAgICAgICBpbnRvIHR3byBmdW5jdGlvbnMuICBUaGUgZmlyc3QgY3JlYXRlcyBhIGNvcmUgb2JqZWN0LCB0aGUgc2Vjb25kCi0gICAgICAgIHJldHVybnMgdGhlIGNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIGNvcmUgZGV2aWNlLgotCi0JKiBjb3JlZmlsZS5jIChjb3JlX2RldmljZV9jcmVhdGUpOiBVc2UgY29yZV9jcmVhdGUgdG8gbWFrZSB0aGUKLSAgICAgICAgY29yZSBvYmplY3QuCi0KLQkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBVc2UgY29yZV9mcm9tX2RldmljZSgpIGluc3RlYWQgb2YKLSAgICAgICAgY29yZV9jcmVhdGUoKS4KLQotCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogTWFrZSBzdGF0aWMgYXMgb25seQotICAgICAgICBuZWVkZWQgYnkgZnVuY3Rpb25zIGludGVybmFsIHRvIGRldmljZS5jLgotCi1GcmkgSnVuICA3IDIzOjQ3OjE4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBwYy1vcGNvZGUtdGVzdC0yOiBSZW1vdmUgZGVzY3JpcHRpb24gb2YgZmllbGRzLgotCSogcHBjLW9wY29kZS1jb21wbGV4OiBEaXR0bwotCSogcHBjLW9wY29kZS1mbGF0OiBEaXR0bwotCSogcHBjLW9wY29kZS1zaW1wbGU6IERpdHRvCi0JKiBwcGMtb3Bjb2RlLXN0dXBpZDogRGl0dG8KLQkqIHBwYy1vcGNvZGUtdGVzdC0xOiBEaXR0bwotCSogcHBjLWNhY2hlLXJ1bGVzOiBEaXR0bwotCi0JKiBpZ2VuLmM6IEFkZCBkZXNjcmlwdGlvbiBvZiBmaWxlcyBhcyBhIGNvbW1lbnQgYXQgdGhlIGZyb250LgotCi1XZWQgSnVuIDI2IDEyOjUwOjMzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igd2hldGhlciB0aGUgdGVybWlvcyBhbmQgdGVybWlvCi0Jc3RydWN0dXJlcyBhcmUgcmVhbGx5IGRlZmluZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCwgdGhleSBkZWZpbmUgdGhlCi0JY19saW5lIGZpZWxkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoeyxURVJNSU9ffUNGTEFHUyk6IEFkZCBURVJNSU9fQ0ZMQUdTIG9wdGlvbnMgc2V0IGJ5Ci0JY29uZmlndXJlLgotCi0JKiBlbXVsX3VuaXguYzogVmFyaW91cyBjaGFuZ2VzIHRvIGFsbG93IGZvciBidWlsZGluZyBvbiBzeXN0ZW1zCi0Jd2l0aCBkaWZmZXJlbnQgdGVybWlvIGFuZCB0ZXJtaW9zIHN0cnVjdHVyZXMuICBJZiBob3N0IGhhcyBib3RoCi0JdGVybWlvIGFuZCB0ZXJtaW9zLCBqdXN0IHVzZSB0ZXJtaW9zLiAgTm8gbG9uZ2VyIGluY2x1ZGUKLQlzeXMvaW9jdGwuaC4KLQotV2VkIEp1biAyNiAxMjoyNjo1NSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIEp1biAgNSAyMzo1Mzo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb3JlZmlsZS5oOiBSZXdyaXRlIGRvY3VtZW50YXRpb24gc28gdGhhdCBpdCBjYW4gYmUgZXh0cmFjdGVkIGFuZAotICAgICAgICBjb252ZXJ0ZWQgaW50byB0ZXhpbmZvIChhbmQgaGVuY2UgcmVhZHkgZm9yIHRyYW5zbGF0aW9uIGludG8gaHRtbCwKLSAgICAgICAgdGV4IG9yIG5yb2ZmKS4KLQkqIGRldmljZS5oOiBEaXR0bwotCi1UaHUgSnVuICA2IDA5OjUyOjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaHdfZGlzay5jIChTRUVLX1NFVCk6IElmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQotV2VkIEp1biAgNSAxMTo0Njo1MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHB1ZGRpbj4KLQotCSogaHdfZGlzay5jOiBJbmNsdWRlIDx1bmlzdGQuaD4gaWYgYXZhaWxhYmxlLiAgVW5kZXIgU3VuT1MsIHRoYXQKLSAJaXMgdGhlIHNvdXJjZSBvZiBTRUVLX1NFVC4KLQotV2VkIEp1biAgNSAwMTozOTowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IENvcnJlY3QgdHlwZSBvZiBkdW1teSBhcmd1bWVudHMgYmVpbmcKLSAgICAgICAgcGFzc2VkIHRvIGEgZGV2aWNlX2lvY3RsIGNhbGwuCi0KLQkqIGh3X2luaXQuYyAoaHdfZGF0YV9pbml0X2RhdGFfY2FsbGJhY2spOiBBZGp1c3QgcHJpbnRmIGFyZ3VtZW50cy4KLQkod3JpdGVfc3RhY2tfYXJndW1lbnRzKTogRGl0dG8uCi0JKiBod190cmFjZS5jOiBJbnN0YW5jZSBjYWxsYmFjayBlbnRyeSBubyBsb25nZXIgYSB0YWJsZS4KLQotV2VkIEp1biAgNSAwMTozOTowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBlbXVsX3VuaXguYyAoZG9fdW5peF91bWFzayk6IENhc3QgcHJpbnRmIGFyZ3VtZW50LgotCShjb252ZXJ0X3RvX2xpbnV4X3Rlcm1pb3MpOiBVc2UgTElOVVhfVlNXVEMgbm90IExJTlVYX1ZTV0NICi0KLU1vbiBKdW4gIDMgMTU6MDI6MDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBod19pbml0LmMgKHVwZGF0ZV9mb3JfYmluYXJ5X3NlY3Rpb24pOiBBYm9ydCBpZiB3ZSBmaW5kIGFuCi0JLmludGVycCBzZWN0aW9uLCB3aGljaCBpbmRpY2F0ZXMgdGhlIG5lZWQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgdG8KLQliZSBsb2FkZWQuCi0KLU1vbiBKdW4gIDMgMTU6MDI6MDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbXVsX3VuaXguYyAoZG9fdW5peF97dGltZSxnZXR0aW1lb2ZkYXksZ2V0cnVzYWdlfSk6IEFkZCBzdXBwb3J0Ci0JZm9yIHRpbWUsIGdldHRpbWVvZmRheSwgYW5kIGdldHJ1c2FnZSBzeXN0ZW0gY2FsbHMuCi0JKHtzb2xhcmlzLGxpbnV4fV9kZXNjcmlwdG9ycyk6IEFkZCBuZXcgc3lzdGVtIGNhbGxzLgotCShkb19nZXR7LGV9e3VpZCxnaWR9KTogVXNlIGdpZF90L3VpZF90IHR5cGVzLgotCShkb19nZXR7LHB9cGlkKTogVXNlIHBpY190IHR5cGVzLgotCi0JKiBjb25maWd1cmUuaW4gKEFDX1RZUEVfe0dFVEdST1VQUyxTSUdOQUx9KTogRGVmaW5lLgotCShBQ19UWVBFX3tNT0RFLE9GRixQSUQsU0laRSxVSUR9X1QpOiBEZWZpbmUuCi0JKiBjb25maWd7LmluLHVyZX06IFJlZ2VuZXJhdGUuCi0KLU1vbiBKdW4gIDMgMjM6MTk6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogVXNlIHRoZSBtb3JlIHNwZWNpZmljIG5hbWVzCi0gICAgICAgIGBwcGMtZWxmJyBhbmQgYHBwYy14Y29mZicgZm9yIHRoZSBzdGFjay10eXBlLgotCSogZW11bF91bml4LmMgKGVtdWxfdW5peF9jcmVhdGUpOiBEaXR0by4KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IERpdHRvLgotCSogaHdfaW5pdC5jOiBSZWNvbml6ZSB0aGUgbmV3IG5hbWVzLgotCi0JKiBlbXVsX3VuaXguYyAoZG9fdW5peF9icmVhayk6IEFkanVzdCBzbyB0aGF0IHRoZSB1cGRhdGVkIGlvY3RsCi0JY2FsbCBpcyB1c2VkIChubyBzeXN0ZW0gcGFyYW1ldGVyKS4KLQotU3VuIEp1biAgMiAxMToyMToxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxfdW5peC57aCxjfTogTmV3IGZpbGVzIHRvIHByb3ZpZGUgU29sYXJpcyBhbmQgTGludXggc3lzdGVtCi0JY2FsbCBlbXVsYXRpb25zLgotCi0JKiBNYWtlZmlsZS5pbiAoTElCX3tTUkMsT0JKfSk6IEFkZCBlbXVsX3VuaXgue2Msb30uCi0JKG9zX2VtdWwubyk6IERlcGVuZCBvbiBlbXVsX3VuaXguaC4KLQkoZW11bF91bml4Lm8pOiBOZXcgZGVwZW5kZW5jeS4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tYWxpZ25tZW50KTogQWRkIDB8ZGVmYXVsdCB0byBtZWFuIHNldAotCWFsaWdubWVudCB0byAwLCB3aGljaCBtZWFucyB1c2UgYXBwcm9wcmlhdGUgYWxpZ25tZW50IGZvciBtb2RlLgotCShBQ19DSEVDS19GVU5DUyk6IEFkZCBuZXcgZnVuY3Rpb25zIG5lZWRlZCBieSBlbXVsX3VuaXguYy4KLQkoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBuZXcgaW5jbHVkZSBmaWxlcyBuZWVkZWQgYnkgZW11bF91bml4LmMuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX3dyaXRlMl9zdGF0dXMpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuCi0JcmVzdWx0cyBpbiByMyBhbmQgcjQgZm9yIFNvbGFyaXMgc3lzdGVtIGNhbGxzLgotCShlbXVsX2RvX3N5c3RlbV9jYWxsKTogSWYgdGhlIHN5c3RlbSBjYWxsIGlzIG5vdCBzdXBwb3J0LCBidXQKLQl0aGVyZSBpcyBhIHN0cmluZyBmb3IgdGhlIHN5c3RlbSBjYWxsIG5hbWUsIHByaW50IG91dCB0aGUgc3RyaW5nCi0JaW5zdGVhZCBvZiB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyLgotCi0JKiBlbXVsX2dlbmVyaWMuaCAoZW11bF93cml0ZTJfc3RhdHVzKTogRGVjbGFyZSBpdC4KLQotCSogZW11bF9uZXRic2QuYzogVXNlIC8qICovIGFyb3VuZCBjb21tZW50IG9uICNlbmRpZi4KLQotCSogb3NfZW11bC5jOiBJbmNsdWRlIGVtdWxfdW5peC5oLgotCShvc19lbXVsYXRpb25zKTogQWRkIGVtdWxhdGlvbnMgZm9yIFNvbGFyaXMsIGFuZCBMaW51eC4KLQotCSogcHNpbS5jIChwc2ltX3VzYWdlKTogQWRkIG1lc3NhZ2UgYWJvdXQgc29sYXJpcywgbGludXgKLQllbXVsYXRpb25zLgotCi1UaHUgTWF5IDMwIDAwOjAwOjEwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2lvYnVzLmM6IFRpZHkgdXAgbm90ZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBhdXRvLWV4dHJhY3RlZC4KLQotCSogUkVBRE1FOiBDb3JyZWN0IFBTSU0ncyB0aXRsZQotCi1XZWQgTWF5IDI5IDIzOjUwOjI2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGJhc2ljcy5oOiBOZXcgZ2xvYmFsIHR5cGUgb2JqZWN0X2Rpc3Bvc2l0aW9uLCB1c2VkIHRvIGluZGljYXRlCi0gICAgICAgIHRoZSBzdGF0dXMgb2Ygb2JqZWN0cyB3aGVuIHRoaW5ncyBhcmUgcmVzdGFydGVkLgotCi1GcmkgTWF5IDE3IDE3OjI4OjUyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYmVuamltZW4uaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2VfdGFibGUuaDogQ2hhbmdlIHRoZSBpbnRlcnJ1cHQgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgc28KLSAgICAgICAgdGhhdCBpdCBpbmNsdWRlcyBhbiBhZGRpdGlvbmFsIG1lbWJlciAtIGFuIHVwcGVyIGJvdW5kIG9uIHRoZQotICAgICAgICBpbnRlcnJ1cHRzIGJ5IHRoYXQgbmFtZS4KLQotCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZGVjb2RlKTogQWxsb3cgYSByYW5nZSBvZiBpbnRlcnJ1cHQKLSAgICAgICAgcG9ydHMgKGVnIHJzdDAgLi4gcnN0NikgaWYgdGhlIHBvcnQgZGVzY3JpcHRvcnMgYm91bmQgaXMgbm9uIHplcm8uCi0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9wcmludF9kZXZpY2UpOiBJbmNsdWRlIGEgbGlzdCBvZiB2YWxpZAotICAgICAgICBpbnRlcnJ1cHQgcG9ydHMgd2hlbiBsaXN0aW5nIHN1cHBvcnRlZCBkZXZpY2VzLgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfKik6IERlbGV0ZS4gTm90IHVzZWQuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogTW9kaWZ5IHRoZSBjcmVhdGlvbiBvZgotICAgICAgICB0aGUgaW50ZXJydXB0IG5ldCBzbyB0aGF0IGl0IHVzZXMgaW50MCAuLiBpbnROLgotCi1UdWUgTWF5IDE0IDIzOjAzOjUzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2lvY3RsKTogRHJvcCB0aGUgc3lzdGVtIGFyZ3VtZW50LgotICAgICAgICBEZXZpY2VzIGNhbiBub3Qgb2J0YWluIHRoaXMgdXNpbmcgdGhlIGRldmljZV9zeXN0ZW0oKSBjYWxsLgotCSogZGV2aWNlX3RhYmxlLmg6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIGh3XyouYzogQWRqdXN0IGFjY29yZGluZ2x5LgotCSogZW11bF9uZXRic2QuYyAoZG9fYnJlYWspOiBBZGp1c3QgY2FsbCB0byB2bSBkZXZpY2UgYWNjb3JkaW5nbHkuCi0JKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IFVzZSBhIGRldmljZV9pb2N0bCBjYWxsIHRvIGZvcmNlIHRoZQotICAgICAgICBod190cmFjZSBkZXZpY2UgdG8gdXBkYXRlIHRoZSB0cmFjZSBvcHRpb25zLgotCSogaHdfdHJhY2UuYzogUmVwbGFjZSB0aGUgaW5pdCBmdW5jdGlvbiB3aXRoIGFuIGlvY3RsIGNhbGwuICBBZGp1c3QKLQlkb2MgYWNjb3JkaW5nbHkuCi0KLQkqIHBzaW0uYyAocHNpbV9pbml0KTogUmUtb3JkZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB0aGUKLSAgICAgICAgb3MtZW11bGF0aW9uIGlzIGluaXRpYWxpemVkIGFmdGVyIHRoZSBkZXZpY2UgdHJlZS4gIFdpdGhvdXQgdGhpcywKLSAgICAgICAgb3MtZW11bCdzIGFyZSBub3QgYWJsZSB0byBjcmVhdGUgaW5zdGFuY2VzIG9yIGFjY2VzcyBwcm9wZXJ0aWVzCi0gICAgICAgIHRoYXQgY29udGFpbiBhbiBpbnN0YW5jZSBoYW5kbGUuCi0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZF8qX3Byb3BlcnR5KTogTWFrZSB0aGVzZSBmdW5jdGlvbnMKLSAgICAgICAgaW50ZXJuYWwgdG8gZGV2aWNlLmMuICBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSBtb3JlIGdlbmVyaWMKLSAgICAgICAgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCBmdW5jdGlvbi4gIERpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgaW5pdGlhbAotCWFuZCBjdXJyZW50IHZhbHVlIGZvciBlYWNoIHByb3BlcnR5LgotCSogKGNsZWFuX2RldmljZV9wcm9wZXJ0aWVzKTogTmV3IGZ1bmN0aW9uIHRoYXQgZGVsZXRlcyBhbnkKLQlwcm9wZXJ0aWVzIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGEgc2ltdWxhdGlvbiBhbmQgcmVzdG9yZXMKLQl0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhbnkgb3RoZXJzIChpZ25vcmluZyBpaGFuZGxlcykuCi0JKiAoaW5pdF9kZXZpY2VfcHJvcGVydGllcyk6IChSZSlJbml0aWFsaXplIGFueSBwcm9wZXJ0aWVzIHRoYXQKLQljb250YWluIGloYW5kbGVzLiBjcmVhdGUKLQotCSogKGRldmljZV90cmVlX2luaXQpOiBJbmNsdWRlIGNhbGxzIHRvIGNsZWFuIHRoZSBkZXZpY2UgdHJlZSdzCi0gICAgICAgIHByb3BlcnRpZXMgYW5kIHRoZW4gaW5pdGlhbGl6ZSB0aGVtLiAgRG9jdW1lbnQgdGhpcyBpbiB0aGUgZGV2aWNlLmgKLQlmaWxlLgotCi1Nb24gTWF5ICA2IDE3OjM2OjE1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGludGVycnVwdHMuYyAoZGVjcmVtZW50ZXJfaW50ZXJydXB0KTogQWx3YXlzIHBlbmQgYSBkZWNyZW1lbnRlcgotICAgICAgICBpbnRlcnJ1cHQgZXZlbiBpZiBpdCBpcyBub3QgeWV0IHBvc3NpYmxlIHRvIGRlbGl2ZXIgaXQuCi0KLVdlZCBNYXkgIDEgMTI6MjY6NTEgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiZW5qaW1lbj4KLQotCSogbW9uLmgsIG1vbi5jIChtb25fZ2V0X251bWJlcl9vZl9pbnNucyk6IE1ha2UgdGhpcyBleHRlcm5hbGx5Ci0gCXZpc2FibGUgYWRqdXN0aW5nIHRoZSBhcmd1bWVudHMgc28gdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGNvcnJlY3QuCi0JKG1vbl9wcmludF9pbmZvKTogQWRqdXN0IGNhbGxzLgotCQotCSogcmVnaXN0ZXJzLmgsIHJlZ2lzdGVycy5jIChyZWdpc3Rlcl9kZXNjcmlwdGlvbik6IEFkZCBwaG9ueQotIAljeWNsZSwgaW5zbiBhbmQgc3RhbGwgcmVnaXN0ZXJzLgotCi0JKiBwc2ltLmMgKHBzaW1fcmVhZF9yZWdpc3Rlcik6IFJldHVybiBuciBvZiBpbnN0cnVjdGlvbnMgZm9yIGdpdmVuCi0gCXByb2Nlc3Nvci4KLQotVHVlIEFwciAzMCAyMjowOTowOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBod19odGFiLmM6IE5ldyBmaWxlLiBFeHRyYWN0IGNvbnRlbnRzIGZyb20gZGlza190YWJsZS5jLgotICAgICAgICBDb250YWlucyBhIGRldmljZSB0aGF0LCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2lsbCBjcmVhdGUgYQotICAgICAgICBQb3dlclBDIGh0YWIgaW4gbWVtb3J5LgotCSogaHdfcmVnaXN0ZXIuYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuCi0gICAgICAgIENvbnRhaW5zIGEgZGV2aWNlIHRoYXQsIGR1cmluZyBpbml0aWFsaXphdGlvbiwgd2lsbCBwYXJzZSBpdHMKLSAgICAgICAgcHJvcGVydHkgbGlzdCBhbmQgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB2YXJpb3VzIHByb2Nlc3NvcgotICAgICAgICByZWdpc3RlcnMgKG5vdCB0YXJnZXQgc3BlY2lmaWMpLgotCSogaHdfdm0uYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuICBDb250YWlucwotICAgICAgICBhIGRldmljZSB0aGF0IGhhbmRsZXMgYWNjZXNzZXMgdG8gaW52YWxpZCB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMKLSAgICAgICAgKGluIHVzZXIgbW9kZSkuCi0JKiBod19pbml0LmM6IE5ldyBmaWxlLiBFeHRyYWN0IGNvbnRlbnRzIGZyb20gZGlza190YWJsZS5jLiAgTWlzYwotICAgICAgICBkZXZpY2VzIHRoYXQgY2FuIGluaXRpYWxpemUgbWVtb3J5IGZyb20gYSBmaWxlLgotCSogaHdfdHJhY2UuYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuCi0gICAgICAgIENvbmZpZ3VyZSB0cmFjZSBvcHRpb25zIGZyb20gcHJvcGVydHkgdmFsdWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoaHdfaHRhYi5vLCBod19yZWdpc3Rlci5vLCBod192bS5vLCBod19pbml0Lm8sCi0gICAgICAgIGh3X3RyYWNlLmMpOiBBZGQgbmV3IGRldmljZSBmaWxlcy4KLQotCSogZGV2aWNlX3RhYmxlLmM6IFJlbW92ZSBhYm92ZSBjb2RlLCBub3cgaW4gc2VwYXJhdGUgaW5kZXBlbmRhbnQKLSAgICAgICAgZmlsZXMuCi0KLUZyaSBBcHIgMjYgMDA6MDA6MDcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfZGlzay5jOiBOZXcgZmlsZS4gIERpc2sgYW5kIENEUk9NIGRldmljZS4KLQotCSogTWFrZWZpbGUuaW4gKGh3X2Rpc2subyk6IEFkZCBkZXZpY2UgaHdfZGlzay5jLgotCi0JKiBwa19kaXNrbGFiZWwuYzogTmV3IGZpbGUuICBJbXBsZW1lbnQgdGhlIG1pc3MtbmFtZWQgZGlzay1sYWJlbAotICAgICAgICBwYWNrYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAocGsuaCk6IENyZWF0ZSB0aGUgZmlsZSBway5oIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbAotCXRoZSBwYWNrYWdlcy4KLQotCSogTWFrZWZpbGUuaW4gKGh3LmgsIGh3LmMpOiBBZGQgZGVwZW5kYW5jeSBvbiBNYWtlZmlsZSBzbyB0aGF0Ci0gICAgICAgIHRoZXkgYXJlIHJlLWNyZWF0ZWQgd2hlbiB0aGUgbWFrZWZpbGUgaXMgdXBkYXRlZC4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBZGQgYSBkaXNrIGRldmljZQotICAgICAgICAoYmVsb3cgdGhlIGlvYnVzKSB0byB0aGUgZGV2aWNlIHRyZWUuICBJbmNsdWRlIGFuIGloYW5kbGUgb2YKLQl0aGUgZGlzayBhcyAvY2hvc2VuL2Rpc2suCi0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IERvbid0IGluaXRpYWxpemUgdGhlIGlucHV0LAotICAgICAgICBvdXRwdXQgYW5kIChuZXcpIGRpc2sgaGFuZGxlcyB5ZXQuCi0JKiAoZW11bF9idWdhcGlfaW5pdCk6IEluaXRpYWxpemUgdGhlIGlucHV0LCBvdXRwdXQgKGFuZCBqdXN0IGFkZGVkKQotCWRpc2sgaWhhbmRsZXMgaGVyZS4KLQkqIChlbXVsX2J1Z2FwaV9kb19kaXNraW8pOiBOZXcuICBQZXJmb3JtcyBkaXNrIGkvbyAod2VsbCBhdCBsZWFzdAotCXdoYXQgSSB0aGluayB0aGUgYmVoYXZvdXIgaXMpLgotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbCk6IEFkZCBob29rIHRvIGRpc2sKLQlpL28gYnVnIGNhbGwuICBGb3IgUkVUVVJOIGNhbGwsIGV4aXQgdXNpbmcgZ3ByWzNdJ3Mgc3RhdHVzIGV2ZW4KLQl0aG91Z2ggdGhpcyBpc24ndCBwYXJ0IG9mIHRoZSBzcGVjIC0gbWFrZXMgaXQgcG9zc2libGUgZm9yIG1hY2hpbmUKLQljb2RlIHRvIHNpZ25hbCB0aGUgYXBvcnRpbmcgb2YgYSBzaW11bGF0aW9uIHJ1bi4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2NhbGxfbWV0aG9kKTogQWRkIHN1cHBvcnQgZm9yIHRoZQotCWNsYWltL3JlbGVhc2UgbWV0aG9kcy4KLQkqIChjaGlycF9lbXVsX2V4aXQpOiBBZGQgYW4gb3B0aW9uYWwgZXhpdCBzdGF0dXMgYXJndW1lbnQgdG8KLQl0aGUgZXhpdCBtZXRob2QuICBNYWtlcyBpdCBwb3NzaWJsZSBmb3IgY2hpcnAgZW11bCBzaW11bGF0aW9ucwotCXRvIGFib3J0IHVwb24gYW4gZXJyb3IuCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9jbGFpbSwKLSAgICAgICAgZGV2aWNlX2luc3RhbmNlX3JlbGVhc2UpOiBOZXcgbWV0aG9kcyBmb3IgY2xhaW1pbmcgYW5kIHJlbGVhc2luZwotCW1lbW9yeS4KLQkqIGh3X21lbW9yeS5jOiBhZGQgY2xhaW0gYW5kIHJlbGVhc2UgbWVtb3J5IG1ldGhvZHMuCi0JKiBod18qOiBVc2UgdGhlIGNsYWltIG1lbW9yeSBtZXRob2Qgd2hlbiBhbGxvY2F0aW5nIHBoeXNpY2FsCi0JbWVtb3J5LgotCi1UaHUgQXByIDE4IDIzOjM4OjEwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X252cmFtLmMgKGh3X252cmFtX3VwZGF0ZV9jbG9jayk6IFVzZSB0aGUgY3VycmVudCBub3QgcHJldmlvdXMKLSAgICAgICAgdGltZSB3aGVuIHVwZGF0aW5nIHRoZSBjbG9jay4KLQotCSogaHdfbnZyYW0uYzogVGlkeSB1cCBkb2N1bWVudGF0aW9uCi0KLUZyaSBNYXkgMjQgMTA6MDg6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKEFDX1NUUlVDVF9TVF97QkxLU0laRSxCTE9DS1MsUkRFVn0pOiBVc2UgdGhlc2UKLQltYWNyb3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBhcHByb3ByaWF0ZSBzdF88eHh4PiBmaWVsZHMKLQlleGlzdCBpbiB0aGUgc3RhdCBzdHJ1Y3R1cmUuCi0JKEFDX0NIRUNLX0ZVTkNTKTogQ2hlY2sgZm9yIGFsbCB1bml4IHN5c3RlbSBjYWxscyB1c2VkLCBleGNlcHQgZm9yCi0JdGhlIHJlYWwgYmFzaWMgb25lcyBsaWtlIG9wZW4sIHJlYWQsIHdyaXRlLCBldGMuCi0JKiBjb25maWd7LmluLHVyZX06IFJlZ2VuZXJhdGUuCi0KLQkqIGVtdWxfbmV0YnNkLmM6IEFkZCBzdXBwb3J0IGZvciBtaXNzaW5nIHN5c3RlbSBjYWxscywgYW5kL29yCi0JbWlzc2luZyBzdGF0IGZpZWxkcy4KLQkoTUFYUEFUSExFTik6IFVuZGVmaW5lIGlmIGluY2x1ZGluZyB1bmlzdGQuaCwgc2luY2Ugc3lzL3BhcmFtLmgKLQltaWdodCBkZWZpbmUgaXQuCi0KLQkqIGh3X3BhbC5jIChXSVRIX1NURElPKTogUmVkZWZpbmUgaWYgT19OREVMQVksIEZfR0VURkwsIG9yIEZfU0VURkwKLQlhcmUgbm90IGRlZmluZWQuCi0JKHNjYW5faHdfcGFsKTogRG8gbm90IGNhdXNlIHN5bnRheCBlcnJvciBpZiBPX05ERUxBWSwgRl9HRVRGTCwgb3IKLQlGX1NFVEZMIG5vdCBkZWZpbmVkLgotCi1UdWUgTWF5IDIxIDE3OjI0OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZW11bF9uZXRic2QuYyAod3JpdGVfc3RhdCk6IERvbid0IGNvbnZlcnQgc3RfYmxvY2tzIHVubGVzcyB0aGUKLQlob3N0IGlzIG5ldGJzZC4KLQotVGh1IE1heSAxNiAxMDo1Njo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBzeXMvaW9jdGwuaC4KLQkqIGNvbmZpZ3suaW4sdXJlfTogUmVnZW5lcmF0ZS4KLQkqIGVtdWxfbmV0YnNkLmM6IElmIEhBVkVfU1lTX0lPQ1RMX0ggaXMgbm90IGRlZmluZWQsIGRvbid0IGluY2x1ZGUKLQlzeXMvaW9jdGwuaC4KLQotVHVlIE1heSAgNyAxNzoyODoxMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGh3X3BhbC5jIChod19wYWxfaW5zdGFuY2VfcmVhZF9jYWxsYmFjayk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZS4KLQotCSogbWlzYy5jICh7LHRhcmdldF99YTJpKTogUmV3cml0ZSB0byBub3QgdXNlIHN0cnRvdWwuCi0KLQkqIE1ha2VmaWxlLmluICh7c3ByZWcsbWlzY30ubyk6IEFkZCBkZXBlbmRlbmN5IG9uIC5jIGZpbGUuCi0JKHtpLGR9Z2VuKTogRG9uJ3QgbGluayBpbiBsaWJlcml0eS4gIFVzZSBCVUlMRF9MSUJTIGluc3RlYWQgb2YKLQlMSUJTLgotCi1Nb24gTWF5ICA2IDExOjMxOjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaHdfcGFsLmMgKGh3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrKTogSWYgdXNpbmcgc3RkaW8sIHVzZQotCWZnZXRzIHRvIHJlYWQgbGluZS4gIElmIG5vdCB1c2luZyBzdGRpbywgZG8gYSBzaW1wbGUgYmxvY2tpbmcgcmVhZAotCW9mIGxlbiBieXRlcy4KLQotRnJpIE1heSAgMyAxNTowNzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDb3JyZWN0bHkgYnVpbGQgc2ltdWxhdG9yIGZvciBidWlsZCBtYWNoaW5lICE9IGhvc3QKLQltYWNoaW5lLgotCi1UdWUgQXByIDMwIDE4OjQ2OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1ob3N0ZW5kaWFuKTogUmV3b3JrIHNvIHRoZSBkZWZhdWx0IHVzZXMKLQl0aGUgQUNfQ19CSUdFTkRJQU4gcmVzdWx0cy4gIE9ubHkgcnVuIEFDX0NfQklHRU5ESUFOIGlmIG5vdCBjcm9zcwotCWNvbXBpbGluZy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkKLQkqIHNpbS1lbmRpYW4uaDogQWRkIG1vcmUgdGVzdHMgZm9yIGhvc3QgZW5kaWFuIHRvIHN1cHBvcnQgbW9yZQotCXBsYXRmb3JtcyBpbiBhIGNyb3NzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1XZWQgQXByIDE3IDE0OjM4OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaHdfcGFsLmMgKHtzY2FuLHdyaXRlfV9od19wYWwpOiBJZiBXSVRIX1NURElPID09IERPX1VTRV9TVERJTywKLQl1c2Ugc3RkaW8sIGluc3RlYWQgb2YgdW5wZW5kZWQgcmVhZC9wcmludGZfZmlsdGVyZWQuCi0JKGh3X3BhbF9pbnN0YW5jZV93cml0ZV9jYWxsYmFjayk6IElmIFdJVEhfU1RESU8gPT0gRE9fVVNFX1NURElPLAotCWZsdXNoIHN0ZG91dCBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0ZXJzLgotCi0JKiBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpOiBQcmludCBvdXQgV0lUSF9TVERJTy4KLQotCSogTWFrZWZpbGUuaW4gKFNURElPX0NGTEFHUyk6IFBhc3Mgb24gcmVzdWx0IG9mIEBzaW1fc3RkaW9ACi0JY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KLQkoQ09ORklHX0NGTEFHUyk6IEluY2x1ZGUgU1RESU9fQ0ZMQUdTLgotCShody57YyxofSk6IEFsbG93IGZvciBzb3VyY2UgZGlyICE9IGJ1aWxkIGRpciwgYW5kIGZvciBIV19TUkMKLQlmaWxlcyB0byBjb250YWluIGRpcmVjdG9yeSBwaWVjZXMuCi0KLQkqIHN0ZC1jb25maWcuaCAoRE97LE5UfV9VU0VfU1RESU8pOiBOZXcgZmxhZ3MgZm9yIHdoZXRoZXIgd2UKLQlzaG91bGQgdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0LgotCShXSVRIX1NURElPKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBET05UX1VTRV9TVERJTy4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tc3RkaW8pOiBBZGQgbmV3IHN3aXRjaCB0byBjb250cm9sCi0Jd2hldGhlciBzdGRpbyBpcyB1c2VkIGZvciBjb25zb2xlIEkvTy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogaW50ZXJydXB0cy5jIChleHRlcm5hbF9pbnRlcnJ1cHQpOiBEZWNsYXJlIGl0IHRvIGJlCi0JSU5MSU5FX0lOVEVSUlVQVFMsIG5vdCBJTkxJTkVfQ1BVLgotCi1Nb24gQXByIDE1IDIzOjMwOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGV2ZW50cy5jIChpbnNlcnRfZXZlbnRfZW50cnkpOiBBbGxvdyBldmVudHMgdG8gYmUgc2NoZWR1bGVkCi0gICAgICAgICpOT1cqIChhdCBkZWx0YSB0aW1lIDApLiAgQWRkIGFzc2VydGlvbnMgdG8gY2xhcmlmeSBiZWhhdm91ciBvZgotICAgICAgICBldmVudCBxdWV1ZS4KLQotCSogZXZlbnRzLmMgKHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQpOiBOZXcgZnVuY3Rpb24uIENhbGN1bGF0ZXMgdGhlCi0gICAgICAgIG51bWJlciBvZiB0aWNrcyBmcm9tIHRoZSBuZXh0IGV2ZW50LiAgVXNlIHRoaXMuCi0KLVN1biBBcHIgMTQgMjE6Mzk6NDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfbmV0YnNkLmMgKGRvX2JyZWFrKTogUmV0dXJuIDAgaWYgc3VjY2VzcyAoaW5zdGVhZCBvZgotICAgICAgICBhZGp1c3RlZCBicmVhaykuCi0KLQkqIGRldmljZV90YWJsZS5jICh2bV9pb2N0bF9jYWxsYmFjayk6IERvbid0IHJldHVybiBhZGp1c3RlZCBicmVhawotICAgICAgICAoaXNuJ3QgbmVlZGVkKS4KLQotU3VuIEFwciAxNCAyMTozMjo0MSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmg6IENoYW5nZSB0eXBlIG9mIHRoZSBkZXZpY2UgaW9jdGwgc28gdGhhdCBpdAotCXJldHVybnMgYW4gaW50IChzdGF0dXMpLgotCSogZGV2aWNlLmggKGRldmljZV9pb2N0bCk6IERpdHRvLgotCSogZGV2aWNlLmMgKGRldmljZV9pb2N0bCk6IERpdHRvLgotCi0JKiBkZXZpY2VfdGFibGUuYyAoc3RhY2tfaW9jdGxfY2FsbGJhY2spOiBSZXR1cm4gMCBzdGF0dXMuCi0JKHZtX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8KLQotU2F0IEFwciAxMyAwMDowMDoyNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBlbXVsX25ldGJzZC5jIChkb19yZWFkKTogQ29ycmVjdGx5IHNldCB0aGUgcmV0dXJuIHZhbHVlLgotCShkb19nZXRwaWQpOiBEaXR0by4KLQkoZG9fZ2V0dWlkKTogRGl0dG8uCi0JKGRvX2dldGV1aWQpOiBEaXR0by4KLQkoZG9fZHVwKTogRGl0dG8uCi0JKGRvX2dldGVnaWQpOiBEaXR0by4KLQkoZG9fZ2V0Z2lkKTogRGl0dG8uCi0JKGRvX3NpZ3Byb2NtYXNrKTogRGl0dG8uCi0JKGRvX3VtYXNrKTogRGl0dG8uCi0JKGRvX2R1cDIpOiBEaXR0by4KLQkoZG9fZ2V0dGltZW9mZGF5KTogRGl0dG8uCi0JKGRvX2dldHJ1c2FnZSk6IERpdHRvLgotCShkb19mc3RhdCk6IERpdHRvLgotCShkb19zdGF0KTogRGl0dG8uCi0JKGRvX2xzZWVrKTogRGl0dG8uCi0JKGRvX19fc3lzY3RsKTogRGl0dG8uCi0KLUZyaSBBcHIgMTIgMjA6NTY6NDcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmMgKHZtX2lvY3RsX2NhbGxiYWNrKTogRG9uJ3QgYWNjZXNzIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgcmVnaXN0ZXJzIGRpcmVjdGx5LCBpbnN0ZWFkIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gaGFuZGxlIHRoaXMuCi0KLQkqIGVtdWxfbmV0YnNkLmMgKGRvX2JyZWFrKTogV2hpY2ggY2FsbHMgdm1faW9jdGxfY2FsbGJhY2sgdG8KLSAgICAgICAgcGVyZm9ybSBhIGJyZWFrLiAgUGFzcyBpbiB0aGUgbmV3IGJyZWFrIHZhbHVlIGFuZCBzZXQgdGhlCi0gICAgICAgIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdC4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfd3JpdGVfc3RhdHVzKTogQ2hhbmdlIHNvIHRoYXQgcjMgY29udGFpbnMKLSAgICAgICAgZWl0aGVyIHN0YXR1cyBvciBlcnJubyBhbmQgZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnkgU08uCi0KLVRodSBBcHIgIDQgMjM6MDM6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogTW9yZSBzdHJpY3QgY2hlY2sgb2YgT0VBCi0gICAgICAgIGFkZHJlc3MuCi0KLVRodSBBcHIgIDQgMjA6NTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGludGVycnVwdHMuaCAoaW50ZXJydXB0cyk6IE5ldyBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhdGUgb2YKLSAgICAgICAgcGVuZGluZyBpbnRlcnJ1cHRzLgotCi0JKiBjcHUuYyAoY3B1X2ludGVycnVwdHMpOiBOZXcgZnVuY3Rpb24uICBQZW5kaW5nIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgaW4gdGhlIGNwdSBhbmQgZ3JhbnQgYWNjZXNzIHRvIGl0LiAgQWRkIGludGVycnVwdHMgdG8gY3B1Ci0gICAgICAgIHN0cnVjdHVyZS4KLQotRnJpIE1hciAyOSAyMjowOToyNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX2FkZF9wYXJzZWQpOiBDaGVjayB0aGF0IHRoZSBjcmVhdGlvbiBvZiBhCi0gICAgICAgIGRldmljZSBpbnN0YW5jZSB3b3JrZWQgYmVmb3JlIHVzaW5nIGl0LgotCi0JKiBwc2ltLmMgKHBzaW1faGFsdCk6IFJlbW92ZSBjaWEgYXJndW1lbnQgZnJvbSBwc2ltX2hhbHQuICBUaGlzCi0gICAgICAgIGZ1bmN0aW9uIGRvZXMgbm90IHNhdmUgdGhlIENJQSBzbyBkbyBub3QgcGFzcyBpdCBpbi4KLQotRnJpIE1hciAyOSAyMTozMDo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfcGFsLmMgKGh3X3BhbCk6IE1lcmdlIHRoZSBoYWx0IGFuZCBpY3UgYW5kIGNvbnNvbGUgZGV2aWNlcwotICAgICAgICBmb3VuZCBpbiBkZXZpY2VfdGFibGUuYyBpbnRvIGEgc2luZ2xlIGhhY2sgcGFsLgotCi0JKiBkZXZpY2VfdGFibGUuYyAoaGFsdCwgaWN1LCBjb25zb2xlKTogRGVsZXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoaHdfcGFsLm8pOiBOZXcgZGVwZW5kZW5jeS4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBSZS1hcmFuZ2UgZGV2aWNlIHRyZWUKLSAgICAgICAgc28gdGhhdCBpdCB1c2VzIHRoZSBwYWwgaW5zdGVhZCBvZiB0aGUgaWN1L2hhbHQvY29uc29sZSBkZXZpY2VzLgotICAgICAgICBXaXJlIHRoZSBwYWwncyBpbnRlcnJ1cHQgcG9ydHMgdXAgdG8gdGhlIGNwdSBub2Rlcy4KLQotRnJpIE1hciAyOSAyMDoxNzoxNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBNb3ZlIGZyb20KLSAgICAgICAgZGV2aWNlX3RhYmxlLmMgdG8gaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKGh3X2lvYnVzLm8pOiBOZXcgZGVwZW5kZW5jeS4KLQotRnJpIE1hciAyOSAxMjoxNzo1OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBlbXVsX2J1Z2FwaS5jIChfb3NfZW11bF9kYXRhKTogQWRkIGZpZWxkcyBmb3Igb3V0cHV0LCBpbnB1dC4KLSAgICAgICAgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IENyZWF0ZSBpbnB1dCwgb3V0cHV0IGZyb20gL2Nob3Nlbi9zdGRpbiBhbmQKLSAgICAgICAgL2Nob3Nlbi9zdGRvdXQuCi0gICAgICAgIChlbXVsX2J1Z2FwaV9kb197cmVhZCx3cml0ZX0pOiBTd2l0Y2ggdG8gdXNlIGRldmljZV9pbnN0YW5jZQotICAgICAgICBpbnRlcmZhY2UuCi0gICAgICAgIChlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogQ2hhbmdlIGNhbGxzIHRvCi0gICAgICAgIGVtdWxfYnVnYXBpX2RvX3tyZWFkLHdyaXRlfSB0byBwYXNzIGRldmljZSBpbnN0YW5jZSBhcmd1bWVudC4KLQotVHVlIE1hciAyNiAxNDo1Nzo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAoaWRlY29kZV9zd2l0Y2hfZW5kKTogRml4IDIvMjYgY2hhbmdlIHNvIHRoYXQgYW4gZXh0cmEKLSAgICAgICAgZGVmYXVsdCBpcyBub3Qgd3JpdHRlbiBvdXQgaWYgYSBkZWZhdWx0IHdhcyBhbHJlYWR5IHdyaXR0ZW4uCi0KLQkqIHBzaW0uYyAocHNpbV97cmVhZCx3cml0ZX1fcmVnaXN0ZXIpOiBVc2Ugc2l6ZW9mIHVuc2lnbmVkXzggdG8KLSAgICAgICAgc2l6ZSBjb29rZWRfYnVmLCBub3Qgc2l6ZW9mIG5hdHVyYWxfd29yZCwgc2luY2UgZmxvYXRpbmcgcG9pbnQKLSAgICAgICAgcmVnaXN0ZXJzIGFyZSA4IGJ5dGVzLgotCi1Nb24gTWFyIDI1IDIyOjA3OjEzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuOS4KLQotVGh1IE1hciAyMSAwMDoxNDoyNiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmg6IEFsd2F5cyBpbmNsdWRlIHN0cmluZyBoZWFkZXJzLgotCi1UaHUgTWFyIDIxIDAwOjA2OjA5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIG1haW4uYyAoZXJyb3IpOiBCZSBjYXJlZnVsIHRvIG5vdCB0cnkgdG8gcHJpbnQgb3V0IHN0YXRpc3RpY3MKLSAgICAgICAgd2hlbiB0aGUgc2ltdWxhdGlvbiB3YXMgbmV2ZXIgY3JlYXRlZC4KLQotU3VuIE1hciAxNyAyMjo0MDo1NyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogYmFzaWNzLmg6IE1vdmUgdGhlIGV2ZW50IHF1ZXVlJ3MgZGVmaW5pdGlvbiB0byBoZXJlIHNvIHRoYXQgaXQKLSAgICAgICAgY2FuIGJlIHJlZmVyZWQgdG8gZ2xvYmFsbHkgd2l0aCBvdXQgaW1wb3J0aW5nIGFsbCBvZiBldmVudHMuaC4KLQotCSogcHNpbS5oLCBwc2ltLmMgKHBzaW1fZXZlbnRfcXVldWUpOiBOZXcgZnVuY3Rpb24uICBHcmFudCBhY2Nlc3MKLSAgICAgICAgdG8gdGhlIHNpbXVsYXRpb24gZXZlbnQgcXVldWUuICBXaWxsIG1ha2UgdGhpcyB0aGUgc2luZ2xlIHBvaW50IG9mCi0gICAgICAgIGFjY2VzcyAodGhlcmUgaXMgYWZ0ZXIgYWxsIG9ubHkgb25lIGV2ZW50IHF1ZXVlIGluIHRoZQotICAgICAgICBzaW11bGF0aW9uKS4KLQotCSogY3B1LmMgKGNwdV9jcmVhdGUpOiBVc2UgcHNpbV9ldmVudF9xdWV1ZSB0byBvYnRhaW4gdGhlIGV2ZW50Ci0gICAgICAgIHF1ZXVlIGluc3RlYWQgb2YgaXQgYmVpbmcgcGFzc2VkIGluLiAgTm8gbG9uZ2VyIGFsbG93IGFjY2VzcyB0bwotICAgICAgICB0aGUgY3B1J3MgY29weSBvZiB0aGUgZXZlbnQgcXVldWUuCi0KLVN1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGV2ZW50cy5oLCBldmVudHMuYyAoZXZlbnRfaGFuZGxlcik6IFJlbW92ZSBldmVudF9xdWV1ZSBmcm9tCi0gICAgICAgIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW4gZXZlbnQgaGFuZGxlci4gIFRoYXQgYXJndW1lbnQgaXMgcmVkdW5kYW50Ci0gICAgICAgIC0gdGhlIGBkYXRhJyBzaG91bGQgcmVmZXIgdG8gYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZQotICAgICAgICBldmVudCBxdWV1ZSBpZiBxdWVpbmcgaXMgbmVlZGVkLgotCi0JKiBjcHUuYyAoY3B1X2RlY3JlbWVudF9ldmVudCk6IGFkanVzdAotCi0JKiBldmVudHMuYyAoZXZlbnRfcXVldWVfcHJvY2Vzcyk6IGFkanVzdAotCi1TdW4gTWFyIDE3IDIyOjQwOjU3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9zeXN0ZW0pOiBOZXcsIHJldHVybnMgYSBoYW5kbGUgZm9yCi0gICAgICAgIHRoZSBzeXN0ZW0gZ2l2ZW4gdGhlIGRldmljZS4KLQotCSogZGV2aWNlLmMgKGRldmljZV9hZGRyZXNzX2luaXQpOiBTdG9yZSBhIHBvaW50ZXIgYmFjayB0byB0aGUKLSAgICAgICAgc3lzdGVtIGluIGVhY2ggZGV2aWNlcyBub2RlLgotCi0JKiBkZXZpY2VfdGFibGUuaDogRG9uJ3QgcGFzcyBgc3lzdGVtJyBpbnRvIGVhY2ggZGV2aWNlIHdoZW4gaXQgaXMKLSAgICAgICAgYmVpbmcgaW5pdGlhbGl6ZWQsIHRoaXMgaXMgbm93IGF2YWlsYWJsZSB1c2luZyBkZXZpY2Vfc3lzdGVtKG1lKS4KLQotCSogZGV2aWNlLmMgKGRldmljZV9hZGRyZXNzX2luaXQsIGRldmljZV9kYXRhX2luaXQpOiBBZGp1c3QuCi0KLQkqIGh3X2NwdS5jLCBod19udnJhbS5jLCBod19tZW1vcnkuYywgaHdfZWVwcm9tLmMsIGRldmljZV90YWJsZS5jOgotICAgICAgICBBZGp1c3QuCi0KLVN1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGludGVycnVwdHMuYyAoZGVjcmVtZW50ZXJfaW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpOgotICAgICAgICBSZW1lbWJlciB0aGF0IGFuIGludGVycnVwdCB3YXNuJ3QgZGVsaXZlcmVkIHNvIHRoYXQgaXQgY2FuIGJlCi0gICAgICAgIHRyaWVkIGFnYWluIGxhdGVyLgotCi0JKiBpbnRlcnJ1cHRzLmMgKGNoZWNrX21hc2tlZF9pbnRlcnJ1cHQpOiBOZXcgZnVuY3Rpb24uICAocmUpCi0gICAgICAgIGNoZWNrcyBmb3IgdGhlIHBvc2liaWxpdHkgdGhhdCBhIHJlY2VudCBjaGFuZ2UgdG8gdGhlIE1TUiBtYXkgaGF2ZQotICAgICAgICBtYWRlIGl0IHBvc3NpYmxlIHRvIGRlbGl2ZXIgYW4gaW50ZXJydXB0IHRoYXQgd2FzIHByZXZpb3VzbHkKLSAgICAgICAgbWFza2VkIGJlIHRoZSBFRSBiaXQuCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKG10bXNyLCBtZm1zciwgcmZpKTogQ2hlY2sgZm9yIHBvc2liaWxpdHkgb2YKLQlhIHBlbmRpbmcgaW50ZXJydXB0IGJlaW5nIGRlbGl2ZXJlZCB1c2luZyBjaGVja19tYXNrZWRfaW50ZXJydXB0KCkuCi0KLQkqIGNwdS5jIChjcHVfZGVjcmVtZW50X2V2ZW50KTogSnVzdCBjYWxsIGRlY3JlbWVudGVyX2ludGVycnVwdCgpCi0gICAgICAgIGxlYXZpbmcgaXQgdG8gdGhhdCBtb2R1bGUgdG8gaGFuZGxlIGJvdGggaW50ZXJydXB0IHN5bmNocm9uaXphdGlvbgotICAgICAgICBhbmQgbWFza2luZy4KLQotCSogY3B1LmMgKHN0cnVjdCBfY3B1KTogcmVtb3ZlIHZhcmlhYmxlcyB0aGF0IHdlcmUgZ29pbmcgdG8gcmVjb3JkCi0gICAgICAgIHBlbmRpbmcgZGVjcmVtZW50ZXIgYW5kIGV4dGVybmFsIGludGVycnVwdHMuCi0KLVN1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGh3X2NwdS5jLCBod19jcHUuaDogTmV3IGZpbGVzLiAgSW1wbGVtZW50IGEgZGV2aWNlIHRoYXQgc2l0cwotICAgICAgICBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgdGhlIHNpbXVsYXRvcnMgaW50ZXJuYWwKLSAgICAgICAgcHJvY2Vzc29yIG1vZGVsLiAgTWFwcyBkZXZpY2UgaW50ZXJydXB0cyBvbnRvIHRoZSBwcm9jZXNzb3IKLQlpbnRlcnJ1cHQgZnVuY3Rpb24gY2FsbHMuCi0KLU1vbiBNYXIgIDQgMDY6MDY6NTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogaHdfbnZyYW0uYzogTlZSQU0gZGV2aWNlIHRoYXQgaW5jbHVkZXMgYSByZWFsLXRpbWUgY2xvY2sgdGhhdCBpcwotICAgICAgICB1cGRhdGVkIGVhY2ggc2Vjb25kLgotCi1Nb24gTWFyICA0IDA0OjE4OjUwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5oIChhdHRhY2hfdHlwZSk6IFJlbW92ZSBhdHRhY2hfZGVmYXVsdCB0eXBlIGFkZHJlc3MKLSAgICAgICAgc3BhY2VzLiAgV2lsbCByZXBsYWNlIHdpdGggbGV2ZWxzIG9mIGNhbGxiYWNrIG1lbW9yeS4KLQotCSogY29yZWZpbGUuaCwgY29yZWZpbGUuYyAobmV3X2NvcmVfbWFwcGluZyksIGNvcmVmaWxlLmMKLSAgICAgICAgKGNvcmVfbWFwX2F0dGFjaCk6IFJlcGxhY2UgZGVmYXVsdCBhdHRhY2ggd2l0aCBhIGxheWVyZCBjYWxsYmFjawotICAgICAgICBhcHByb2FjaC4KLQotU3VuIE1hciAgMyAwMzo1ODo0NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuYyAoc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKTogZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZQotICAgICAgICBwcm9wZXJ0eSBpcyBmb3VuZC4KLQkoc3BsaXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24sIHBhcnNlcyB0aGUgdmFsdWUgcGFydCBvZiBhIGRldmljZQotCXNwZWMuCi0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogVXNlIHRoZSBpbnRlcnJ1cHQgY29udmVyc2lvbgotICAgICAgICBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlcnJ1cHQgcG9ydCBudW1iZXJzLgotCi0JKiBkZXZpY2VfdGFibGUuaDogQWRkIHRhYmxlIHRoYXQgbWFwcyBiZXR3ZWVuIGFuIGludGVycnVwdHMKLSAgICAgICAgc3ltYm9saWMgbmFtZSBhbmQgaXRzIHBvcnQgbnVtYmVyLgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZGVjb2RlLAotICAgICAgICBkZXZpY2VfaW50ZXJydXB0X2VuY29kZSk6IG5ldyBmdW5jdGlvbnMgdXNlIHRoZSByZWNlbnRseSBhZGRlZAotICAgICAgICBpbnRlcnJ1cHQgcG9ydCBuYW1lL251bWJlciB0YWJsZXMgdG8gcGVyZm9ybSBjb252ZXJzaW9uLgotCi1TdW4gTWFyICAzIDAzOjIzOjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX3NldF9hcnJheV9wcm9wZXJ0eSwKLSAgICAgICAgZGV2aWNlX3NldF9ib29sZWFuX3Byb3BlcnR5LCBkZXZpY2Vfc2V0X2loYW5kbGVfcHJvcGVydHksCi0gICAgICAgIGRldmljZV9zZXRfaW50ZWdlcl9wcm9wZXJ0eSwgZGV2aWNlX3NldF9zdHJpbmdfcHJvcGVydHkpOiBOZXcKLSAgICAgICAgZnVuY3Rpb25zIC0gYWxsb3cgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcHJvcGVydHkgdG8gYmUgY2hhbmdlZC4KLQotCSogZGV2aWNlLmgsIGRldmljZS5jOiBSZS1vcmRlciBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZgotICAgICAgICBwcm9wZXJ0eSBmdW5jdGlvbnMuCi0KLVN1biBNYXIgIDMgMDM6MTA6MjIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSwgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6Ci0gICAgICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHBoYW5kbGUgcHJvcGVydGllcy4KLQotV2VkIEZlYiAyOCAwMDo0MzowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoY29yZWZpbGUubyk6IG1pc3NpbmcgZGVwZW5kZW5jeSBvbiBkZXZpY2VfdGFibGUuaAotICAgICAgICBldGMuCi0KLVR1ZSBGZWIgMjcgMjM6NTk6MzUgMTk5NiAgQW5kcmV3IENhZ25leSAtIGFrYSBOb2lkICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmg6IFJldmFtcCBkZXZpY2UgaW5pdCBjYWxsYmFja3Mgc28gdGhhdCB0aGV5IGFyZSBhCi0gICAgICAgIHN1YiBzdHJ1Y3R1cmUuCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfZGF0YSwgZGV2aWNlX2luaXRfYWRkcmVzcyk6IElmIGFuIGluaXQKLSAgICAgICAgY2FsbGJhY2sgaXMgTlVMTCBhc3N1bWUgaXQgc2hvdWxkIGRvIG5vdGhpbmcuCi0JKiBkZXZpY2VfdGFibGUuYyAoaWdub3JlX2RldmljZV9pbml0LCB1bmltcF9kZXZpY2VfaW5pdCk6IGRlbGV0ZQotICAgICAgICBhcyByZWR1bmRhbnQuCi0JKiBkZXZpY2VfdGFibGUuYywgaHdfbWVtb3J5LmM6IGFkanVzdC4KLQotCSogKGlvKTogZGl0dG8uCi0JKiAoZG1hKTogZGl0dG8uCi0JKiAoZGV2aWNlX2luc3RhbmNlKTogZGl0dG8uCi0JKiAoaW9jdGwpOiBkaXR0by4KLQkqIChhZGRyZXNzIG5lZSBjb25maWdfYWRkcmVzcyk6IGRpdHRvLgotCSogKGludGVycnVwdCk6IGRpdHRvLgotCi1Nb24gRmViIDI2IDIxOjExOjIwIDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGlnZW4uYyAoaWRlY29kZV9zd2l0Y2hfZW5kKTogT3V0cHV0IGEgZGVmYXVsdCBlbnRyeSB3aGVuIHRoZQotICAgICAgICBzd2l0Y2ggc3RhdGVtZW50IGlzIHBlcmZlY3QuICBGaXJzdGx5IHN0b3BzIEdDQyBjb21wbGFpbmluZyBhYm91dAotICAgICAgICBhbiBpbmNvbXBsZXRlIHN3aXRjaCBhbmQgc2Vjb25kbHkgaXQgd2lsbCBiZSBlbGltaW5hdGVkIGJ5IGEgZ29vZAotICAgICAgICBjb21waWxlciBhbnkgd2F5LgotCi1Nb24gRmViIDI2IDIyOjQ3OjE1IDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChody5oLCBody5jKTogTmV3IHRhcmdldHMuIENyZWF0ZSBmcm9tIHRoZSBsaXN0IG9mCi0gICAgICAgIGh3XyouYyBmaWxlcy4gaHcuaCBkZWNsYXJlcyBhIGRldmljZSBkZXNjcmlwdG9yIHRhYmxlIGZvciBlYWNoIGh3Ci0gICAgICAgIGRldmljZSB3aGlsZSBody5jIGxpc3RzIHRob3NlIHRhYmxlcyBpbiBhIGZvcm0gc3VpdGFibGUgZm9yIHRoZQotICAgICAgICBjb25zdHJ1Y3Rpb24gb2YgYSB0b3AgbGV2ZWx0YWJsZSBpbiBkZXZpY2VfdGFibGUuYy4KLQotCSogTWFrZWZpbGUuaW4gKGRldmljZV90YWJsZS5vKTogbm93IGRlcGVuZHMgb24gaHcuYyBhIGdlbmVyYXRlZAotICAgICAgICB0YWJsZSBvZiBody4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGRldmljZV90YWJsZSk6IFJlLWFyYW5nZSB0aGUgdGFibGUgb2YgZGV2aWNlcyBzbwotICAgICAgICB0aGF0IHR3byBsZXZlbHMgYXJlIHBvc3NpYmxlLiAgTWFrZSB1c2Ugb2YgaHcuYy4KLQkqIGRldmljZV90YWJsZS5oOiBkaXR0by4KLQotCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogSGFuZGxlIG5ldyB0d28gbGV2ZWwKLSAgICAgICAgZGV2aWNlIGxvb2t1cCB0YWJsZS4KLQkqIGRldmljZS5jIChkZXZpY2VfdXNhZ2UpOiBkaXR0by4KLQotTW9uIEZlYiAyNiAyMjoyNDowMCAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2VfdGFibGUuYzogRGVsZXRlIHRoZSBtZW1vcnkgZGV2aWNlIChtb3ZlZCB0byBod19tZW1vcnkuYykuCi0KLQkqIGh3X21lbW9yeS5jOiBOZXcgZmlsZS4gIEp1c3QgYW4gT3BlbkJvb3QgbWVtb3J5IGRldmljZS4KLQotV2VkIEphbiAxNyAyMTo0NzozNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGRldmljZV9pbml0X2FkZHJlc3MpOiBOZXcuICBTcGxpdCBpbml0aWFsaXphdGlvbiBpbnRvCi0gICAgICAgIHR3byBzdGFnZXMsIGFkZHJlc3MgYW5kIGFkZHJlc3Mgc3BhY2VzCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfZGF0YSk6IE5ldy4gLi4uIGFuZCBkYXRhIG9yIG90aGVyIHdvcmsuCi0gICAgICAgIFdpdGggb3V0IHRoaXMsIGRldmljZXMgdHJ5IHRvIG1vZGlmeSBtZW1vcnkgYmVmb3JlIGl0IGFzIGJlZW4KLSAgICAgICAgYXR0YWNoZWQuCi0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9pbml0KTogVXBkYXRlIHRvIHBlcmZvcm0gc3RhZ2VkCi0gICAgICAgIGluaXRpYWxpemF0aW9uLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luaXQpOiBEZWxldGUuCi0KLVdlZCBKYW4gMTcgMjE6NDM6MDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZV90YWJsZS5jIChkYXRhXyopOiBSZXdyaXRlIHRvIG1ha2UgaGVhdmVyIHVzZSBvZiBwcm9wZXJ0eQotICAgICAgICBub2Rlcy4gQWxsb3cgaW5pdGlhbGl6YXRpb24gYnkgZGlmZmVyZW50IGRhdGEgdHlwZXMuCi0JKiBkZXZpY2VfdGFibGUuYyAoaHRhYl8qIHB0ZV8qKTogUmV3cml0ZSB0byB1c2UgcHJvcGVydGllcy4KLQotCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSk6IFVzZQotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogRGl0dG8KLQkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IERpdHRvCi0KLVdlZCBKYW4gMTcgMjE6MjQ6NTAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBBbm5vdGF0ZSBleGlzdGluZyB0cmVlCi0gICAgICAgIHdpdGggb3B0aW9ucyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gc3BlY2lmaWVkLgotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBbm5vdGF0ZSBleGlzdGluZyB0cmVlCi0gICAgICAgIHdpdGggZGVtbyBkZXZpY2VzIGFuZCBwcm9wZXJ0aWVzLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogVXBkYXRlIHRvIHVzZSBuZXcKLSAgICAgICAgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCBjYWxsIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vdwotICAgICAgICBpbmNsdWRlZCBpbiB0aGUgZGV2aWNlIHRyZWUuICBVc2UgZW11bF9hZGRfdHJlZSogZnVuY3Rpb25zIHRvIGFkZAotICAgICAgICBhbnkgbWlzc2luZyBkZXRhaWxzLgotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogRGl0dG8KLQkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IERpdHRvCi0KLVdlZCBKYW4gMTcgMjE6MTg6MjcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY3JlYXRlKTogTmV3LiBDcmVhdGUvZGVsZXRlIGFuZAotICAgICAgICBvcGVyYXRlIG9uIGluc3RhbmNlcyBvZiBhIGRldmljZS4KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKTogRGl0dG8KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfcmVhZCk6IERpdHRvCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX3dyaXRlKTogRGl0dG8KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2Vfc2Vlayk6IERpdHRvCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX2RhdGEpOiBEaXR0bwotCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9uYW1lKTogRGl0dG8KLQkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfcGF0aCk6IERpdHRvCi0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9vcGVuKTogSW1wbGVtZW50IHVzaW5nIGRldmljZV9pbnN0YW5jZS4KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9jbG9zZSk6IERpdHRvCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfcmVhZCk6IERpdHRvCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfd3JpdGUpOiBEaXR0bwotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3NlZWspOiBEaXR0bwotCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX3JlYWRfdDJoX2FyZ3MpOiBSZWFkIGFyZ3VtZW50cyBmcm9tIGRldmljZS4KLSAgICAgICAgQmVpbmcgY2FyZWZ1bCB0byBjb252ZXJ0IGFsbCBmcm9tIHRhcmdldCB0byBob3N0IGJ5dGUgb3JkZXIuCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX3dyaXRlX2gydF9hcmdzKTogQ29udmVyc2UuCi0KLVdlZCBKYW4gMTcgMjA6MDc6MTUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogTmV3LiAgUmV3cml0ZSBjb2RlIHRvIGFkZAotICAgICAgICBkZXZpY2VzIHRvIHRoZSBkZXZpY2UgdHJlZSBzbyB0aGF0IGEgc2luZ2xlIHByaW50ZiBzdHlsZSBmdW5jdGlvbgotICAgICAgICBpcyB1c2VkLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfYWRkXyopOiBEZWxldGUuIFJlcGxhY2VkIGJ5IGFib3ZlLgotCi0JKiBkZXZpY2UuYyAoc3BsaXRfZGV2aWNlX3NwZWNpZmllcik6IEZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGEKLSAgICAgICAgZGV2aWNlIHNwZWNpZmllciAocGF0aCkgYnJlYWtpbmcgaXQgaW50byBpdHMgY29tcG9uZW50cwotCSogZGV2aWNlLmMgKHNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcik6IERpdHRvCi0JKiBkZXZpY2UuYyAoc3BsaXRfZGV2aWNlX25hbWUpOiBEaXR0bwotCSogZGV2aWNlLmMgKHNwbGl0X2ZpbmRfZGV2aWNlKTogRGl0dG8KLQotCSogZGV2aWNlLmMgKHNjYW5fKik6IERlbGV0ZQotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfZmluZF9kZXZpY2UpOiBSZXdyaXRlIHRvIHVzZSBhYm92ZS4KLQkqIGRldmljZS5jIChkZXZpY2VfYWRkX3Byb3BlcnR5KTogRGl0dG8KLQotV2VkIEphbiAxNyAxOTo1MTo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHNpbS5jKHBzaW1fb3B0aW9ucyk6IFBhcnNlIHRoZSBwc2ltIG9wdGlvbnMsIGluc3RhbGxpbmcgdGhlaXIKLSAgICAgICAgdmFsdWUgaW4gdGhlIGRldmljZSB0cmVlLiAgT3B0aW9ucyBhcmUgbm93IGZpcnN0IGVudGVyZWQgaW50byBhCi0gICAgICAgIGRldmljZSB0cmVlIGFuZCB0aGVuIGV4dHJhY3RlZCBvdXQgYWdhaW4gd2hlbiBuZWVkZWQuICBUaGlzIGFsbG93cwotICAgICAgICBncmVhdGVyIGZsZXhhYmlsaXR5IGluIGNvbmZpZ3VyYXRpb24uCi0KLQkqIHBzaW0uYyAocHNpbV90cmVlKTogUmV0dXJucyBhIGJhc2ljIGRldmljZSB0cmVlIHJlYWR5IGZvcgotICAgICAgICBwYXJzaW5nIGJ5IHBzaW1fb3B0aW9ucy4KLQkqIHBzaW0uYyAocHNpbV91c2FnZSk6IE5ldy4gIEdpdmUgdXNhZ2UgdG8gdmFyaW5nIGxldmVscyBvZiBkZXRhaWwKLSAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB2ZXJib3NpdHkuICBJbiB0dXJuIG91dHB1dCBkZXZpY2UgYW5kIHRyYWNlCi0gICAgICAgIHVzYWdlLgotCi0JKiBtYWluLmMgKG1haW4pOiBVcGRhdGUgdG8gdXNlIG5ldyBzeXN0ZW0KLQkqIHNpbV9jYWxscy5jIChzaW1fb3Blbiwgc2ltX2RvX2NvbW1hbmQpOiBEaXR0bwotCi0JKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IEFkZCBgcicgb3B0aW9uIC0gcmFtIHNpemUuCi0JKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IEFkZCBgbycgb3B0aW9uIC0gb3BlbmJvb3QgdHJlZSBlbnRyeS4KLQkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogQWRkIGBoJy9gSCcgb3B0aW9ucyAtIG1vcmUgaGVscC4KLQotCSogZGVidWcuYyAodHJhY2VfdXNhZ2UpOiBBZGQgbW9yZSBkZXRhaWxlZCBoZWxwLgotCSogZGV2aWNlLmMgKGRldmljZV91c2FnZSk6IE5ldy4gT3V0cHV0IGhlbHAgaW5jbHVkaW5nIGEgbGlzdCBvZgotICAgICAgICB0aGUgZGV2aWNlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBkZXZpY2UgdGFibGUuCi0JKiBkZXZpY2VfdGFibGUuYzogQWRkIHVzYWdlIG9wZXJhdG9yIHRvIGVhY2ggZGV2aWNlLgotCi0JKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZSwgY29yZV9kZXZpY2VfY3JlYXRlKTogQWRqdXN0IHNvIHRoYXQgdGhlCi0gICAgICAgIGNvcmUgZGV2aWNlIGlzIGNyZWF0ZWQgZWFybGllciBmb3IgcHNpbV90cmVlKCkuICBDb3JlIGNhbiBsYXRlciBiZQotICAgICAgICBjcmVhdGVkIGZyb20gaXQuCi0KLQkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBVcGRhdGUgdG8gaGFuZGxlIGFib3ZlIHdheSBvZiBjcmVhdGluZwotICAgICAgICB0aGluZ3MuICBFeHRyYWN0IGFsbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZXZpY2UgdHJlZS4KLQotCSogZGV2aWNlX3RyZWUuYyAodHJhY2VfKik6IE5ldyBkZXZpY2Ugbm9kZSwgaXRzIHByb3BlcnRpZXMgYXJlCi0gICAgICAgIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgdHJhY2Ugb3B0aW9ucy4gIEluaXQgdGhpcyBkZXZpY2UgKGluCi0gICAgICAgIHBzaW1fb3B0aW9ucykgd2hlbiBldmVyIHRoZSBvcHRpb25zIGFyZSB1cGRhdGVkLgotCi1XZWQgSmFuIDE3IDE5OjQ2OjA3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZWJ1Zy5oOiBBZGQgdHJhY2VfcHJpbnRfaW5mbywgdHJhY2VfcHJpbnRfZGV2aWNlX3RyZWUgYW5kCi0gICAgICAgIHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUuICBUaGUgZmlyc3QgaXMgYSByZXBsYWNlbWVudCBmb3IgdGhlCi0gICAgICAgIHZhcmlhYmxlIGBwcmludF9pbmZvJyBmb3VuZCBpbiBtYWluLmMgYW5kIHNpbV9jYWxscy5jLiAgVGhlIGxhdHRlcgotICAgICAgICB0d28gZW5hYmxlIHRoZSBkdW1waW5nIG9mIHRoZSBlbnRpcmUgZGV2aWNlIHRyZWUuCi0KLQkqIGRlYnVnLmM6IEFkZCB0byB0cmFjZV9kZXNjcmlwdGlvbiB0YWJsZS4KLQotCSogbWFpbi5jIChtYWluKTogVXNlIGFib3ZlIHRyYWNlIGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUKLQkqIHNpbV9jYWxscy5jIChzaW1fY2xvc2UpOiBEaXR0bwotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogTmV3LiAgUHJpbnRzIHRoZSBkZXZpY2UKLSAgICAgICAgdHJlZSBpbiBhIGZvcm1hdCB0aGF0IGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNhbiBiZSBwYXJzZWQgYnkgdGhlCi0gICAgICAgIGRldmljZSB0cmVlIGxvYWQgZnJvbSBmaWxlIGNvZGUuCi0KLQkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBEdW1wIGRldmljZSB0cmVlIGlmIGVuYWJsZWQuIElmIG51bXAKLSAgICAgICAgc2VsZWN0ZWQsIGV4aXQgcHNpbSBpbW1lZGlhdGx5LgotCi1XZWQgSmFuIDE3IDE5OjM2OjUyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb3JlZmlsZS1uLmggKGNvcmVfbWFwX3JlYWRfTik6IFdoZW4gbWFwcGluZyBmcm9tIGFuIGFkZHJlc3MgdG8KLSAgICAgICAgYSBkZXZpY2UsIGRvIG5vdCBzdWJ0cmFjdCB0aGUgZGV2aWNlcyBiYXNlLiAgVGhlIGRldmljZSBpdHMgc2VsZgotICAgICAgICBjYW4gZG8gdGhpcy4gIEJyaW5ncyB0aGUgYmVoYXZvdXIgaW50byBsaW5lIHdpdGggT3BlbkJvb3QuCi0JKiBjb3JlZmlsZS1uLmggKGNvcmVfbWFwX3dyaXRlX04pOiBEaXR0bwotCSogY29yZWZpbGUuYyAoY29yZV9tYXBfcmVhZF9idWZmZXIpOiBEaXR0bwotCSogY29yZWZpbGUuYyAoY29yZV9tYXBfd3JpdGVfYnVmZmVyKTogRGl0dG8KLQotCSogZGV2aWNlX3RhYmxlLmMgKGNvbnNvbGVfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2spOiBBZGp1c3QgdG8KLSAgICAgICAgaGFuZGxlIGJpYXNlZCBhZGRyZXNzLgotCSogZGV2aWNlX3RhYmxlLmMgKGNvbnNvbGVfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKTogRGl0dG8KLQotV2VkIEphbiAxNyAxODozNjowOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlLmMgKGF0dGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpOiBOZXcuIEludGVycnVwdCBtb2RlbAotICAgICAgICBkaWQgbm90IGFsbG93IGludGVycnVwdHMgdG8gYmUgd2lyZWQgdXAgYXMgYSBnZW5lcmFsIG5ldCAoZWRnZXMpLgotICAgICAgICBSZS1pbXBsZW1lbnQgc28gdGhhdCBpbnRlcnJ1cHQgZXZlbnRzIGNhbiBiZSBwYXNzZWQgdG8gbXVsdGlwbGUKLSAgICAgICAgY29udHJvbGxlcnMgYW5kIGludGVycnVwdCBjb250cm9sbGVycyBjYW4gZnVydGhlciBwcm9wb2dhdGUKLSAgICAgICAgaW50ZXJydXB0IGV2ZW50cy4KLQotCSogZGV2aWNlLmMgKGF0dGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpIDogTmV3LCBEaXR0bwotCSogZGV2aWNlLmMgKGRldGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpIDogTmV3LCBEaXR0bwotCSogZGV2aWNlLmMgKGNsZWFuX2RldmljZV9pbnRlcnJ1cHRfZWRnZXMpIDogTmV3LCBEaXR0bwotCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZXZlbnQpIDogTmV3LCBEaXR0bwotCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfYXR0YWNoKSA6IE5ldywgRGl0dG8KLQkqIGRldmljZS5jIChkZXZpY2VfaW50ZXJydXB0X2RldGFjaCkgOiBOZXcsIERpdHRvCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2NoaWxkX2ludGVycnVwdF9hdHRhY2gpIDogTmV3LCBEaXR0bwotCSogZGV2aWNlLmMgKGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfZGV0YWNoKSA6IE5ldywgRGl0dG8KLQotCSogZGV2aWNlLmMgKGRldmljZV9hdHRhY2hfaW50ZXJydXB0KSA6IERlbGV0ZSBvbGQKLQkqIGRldmljZS5jIChkZXZpY2VfZGV0YWNoX2ludGVycnVwdCkgOiBEZWxldGUgb2xkCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2ludGVycnVwdCkgOiBEZWxldGUgb2xkCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2ludGVycnVwdF9hY2spIDogRGVsZXRlIG9sZAotCi0JKiBkZXZpY2VfdGFibGUuYyAodW5pbXBfKikgOiBVcGRhdGUgdG8gbWF0Y2gKLQkKLSAgICAgICAgKiBkZXZpY2VfdGFibGUuYyAoaWN1X2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjaykgOiBVcGRhdGUgdG8gdXNlCi0gICAgICAgIGludGVyZmFjZS4KLQkqIGRldmljZV90YWJsZS5jIChpY3VfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrKSA6IERpdHRvCi0KLVdlZCBKYW4gMTcgMTg6MTg6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZS5jIChleHRlcm5hbF90b19kZXZpY2UpIDogTmV3IGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYQotICAgICAgICBzdGFuZGFyZCBtYXBwaW5nIGJldHdlZW4gYSBkZXZpY2VzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIChhCi0gICAgICAgIHBvaW50ZXIpIGFuZCBpdHMgZXh0ZXJuYWwgKG9yIHdoYXQgaXMgcGFzc2VkIHRvIGEgY2xpZW50KQotICAgICAgICByZXByZXNlbnRhdGlvbiAoYSBwaGFuZGxlKS4gIEltcGxlbWVudCB1c2luZyB0aGUgY2FwIG9iamVjdAotICAgICAgICBhdHRhY2hlZCB0byB0aGUgcm9vdCBub2RlLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RvX2V4dGVybmFsKSA6IERpdHRvCi0JKiBkZXZpY2UuYyAoZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKSA6IERpdHRvIGJ1dCBmb3IgaWhhbmRsZQotICAgICAgICBhbmQgZGV2aWNlIGluc3RhbmNlLgotCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbCkgOiBEaXR0bwotCi0JKiBNYWtlZmlsZSAoZGV2aWNlLm8pOiBBZGQgZGVwZW5kZW5jeSBvbiBjYXAuCi0KLQkqIGVtdWxfY2hpcnAuYyAoc3RydWN0IF9lbXVsX2NoaXJwX2RhdGEpIDogRWxpbWF0ZSB1c2Ugb2YgY2FwLiBDb2RlCi0gICAgICAgIG5lZWRpbmcgdG8gdHJhbnNsYXRlIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucwotICAgICAgICBjaGFuZ2VkIHRvIHVzZSB0aGUgZXh0ZXJuYWxfdG9fZGV2aWNlIGV0LmFsLiBkZXZpY2Ugb3BlcmF0aW9ucy4KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF8qKSA6IERpdHRvCi0KLQkqIE1ha2VmaWxlIChlbXVsX2NoaXJwLm8pOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBjYXAKLQotU2F0IEphbiAgNiAxMDoxMzoyNiAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBlbXVsX2NoaXJwLmMgKG1hcF9vdmVyX2NoaXJwX25vdGUpOiBUaWdodGVuIHVwIChhbmQgZml4KSBjaGVja3MKLSAgICAgICAgb24gT3BlbkJvb3Qgbm90ZSBzZWN0aW9uLgotCi1GcmkgSmFuICA1IDIwOjI4OjUzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnbmxhbmQuY29tLmF1PgotCi0JKiBlbXVsX2dlbmVyaWMuYyAoZW11bF93cml0ZV9idWZmZXIpOiBVc2Ugdm0gZmF1bHRpbmcgYnl0ZQotIAlyZWFkL3dyaXRlIGNhbGxzIGZvciBidWZmZXIgdHJhbnNmZXJzLiAgVGhpcyB3aWxsIGNhdXNlIGEgZmF1bHQgdG8KLSAJb2NjdXJlIGlmIHRoZSB0cmFuc2ZlciBmYWlscy4gIENIUlAgY2F0Y2hlcyB0aGUgZmF1bHQgd2hpbGUgdGhlCi0gCW90aGVycyBzdWZmZXIgdGhlIGNvbnNlcXVlbmNlcy4KLSAgICAgICAgKGVtdWxfcmVhZF9idWZmZXIpOiBEaXR0by4KLSAgICAgICAgKGVtdWxfd3JpdGVfd29yZCk6IERpdHRvLgotICAgICAgICAoZW11bF9yZWFkX3dvcmQpOiBEaXR0by4KLSAgICAgICAgKGVtdWxfcmVhZF9zdHJpbmcpOiBEaXR0by4KLQotRnJpIEphbiAgNSAxODo1NTozNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSwgZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKSwKLSAJZW11bF9nZW5lcmljIChlbXVsX2Jscl9pbnN0cnVjdGlvbik6IFVzZSBhIHJlYWwgYmxyIGluc3RydWN0aW9uIHRvCi0gCXJldHVybiBmcm9tIGEgY2xpZW50IHNlcnZpY2UgY2FsbC4KLQotCSogZW11bF9jaGlycC5jIChzZXJ2aWNlcyk6IEFkZCBhbGwgT3BlbkJvb3Qgc2VydmljZXMgdG8gdGFibGUuCi0KLQkqIGVtdWxfZ2VuZXJpYy5oLCBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpLCBlbXVsX2NoaXJwLmMKLSAJKGVtdWxfY2hpcnBfY3JlYXRlKSA6IFVzZSBuYW1lcyBpbnN0ZWFkIG9mIG51bWJlcnMgZm9yCi0gCWluc3RydWN0aW9ucyBiZWluZyBzdG9yZWQgaW4gbWVtb3J5LgotCi1GcmkgSmFuICA1IDE4OjUyOjI4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IFJlbW92ZSAubG9nLCBjb3JlIGFuZCAqLmNvcmUKLSAJKEZyb20gTmV0QlNEKSBmaWxlcy4KLQotV2VkIE1heSAyOSAyMjo1Nzo0MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBDaGFuZ2VMb2cuMDAsIENoYW5nZUxvZzogQ2hhbmdlTG9nIGZyb20gZ2RiLTQuMTYgYmVjb21lcwotICAgICAgICBDaGFuZ2VMb2cuMDAKLQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9DaGFuZ2VMb2cuMDAgYi9zaW0vcHBjL0NoYW5nZUxvZy4wMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YmU4Mi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL0NoYW5nZUxvZy4wMAorKysgL2Rldi9udWxsCkBAIC0xLDIxNjggKzAsMCBAQAotV2VkIE1heSAyOSAyMjo1Nzo0MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0JKiBDaGFuZ2VMb2cuMDAsIENoYW5nZUxvZzogQ2hhbmdlTG9nIGZyb20gZ2RiLTQuMTYgYmVjb21lcwotICAgICAgICBDaGFuZ2VMb2cuMDAKLQotVGh1IEFwciAgNCAxNToxNzoyMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIElOU1RBTEw6IEZpeCBzb21lIGxvbmcgbGluZXMgYW5kIHJlbW92ZSB4ODYgc3BlY2lmaWMgb3B0aW9ucyBpbgotCXRoZSBleGFtcGxlcy4KLQotU3VuIE1hciAzMSAxNTo0NzozMyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogSU5TVEFMTDogVXBkYXRlIHRvIHJlZmxlY3QgZ2RiLTQuMTYuCi0KLSAgICAgICAgKiBSVU46IFVwZGF0ZSB0byByZWZsZWN0IGdkYi00LjE2LiAgUmV2aWV3IG5vdGVzIG9uIGJ1aWxkaW5nIGEgQlNECi0gICAgICAgIHJ1bnRpbWUgZW52aXJvbm1lbnQuCi0KLQkqIFJFQURNRTogUG9pbnQgb3V0IGNvcHlyaWdodCBzdGF0dXMgb2Ygc2ltdWxhdG9yIGluIGludHJvZHVjdGlvbi4KLQotVGh1IE1hciAgNyAxOTo1Mzo0OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bF9uZXRic2QuYzogT25seSBpbmNsdWRlIHN5cy9tb3VudC5oIGlmIEhBVkVfU1lTX01PVU5UX0ggaXMKLQlkZWZpbmVkLgotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciBzeXMvbW91bnQuaC4KLQkqIGNvbmZpZ3VyZSxjb25maWcuaW46IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMjIgMjI6NDg6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIFJFQURNRSwgUlVOLCBJTlNUQUxMOiBVcGRhdGUgdG8gcmVmbGVjdCBhbm5vdW5jZW1lbnQKLQkqIHBzaW06IFBTSU0gMS4wLjEgcmVsZWFzZWQKLQotVGh1IEZlYiAyMiAxNDowMTo1NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2RvX3JlYWQpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlCi0JcmVhZHMuCi0JKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpOiBBZGQgc3VwcG9ydCBmb3IgLklOQ0hSLy5JTkxOCi0Jc3lzdGVtIGNhbGxzLgotCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9kb193cml0ZSk6IENhbGwgZmx1c2hfc3Rkb3V0cHV0LgotCSogZW11bF9uZXRic2QuYyAoZG9fd3JpdGUpOiBDYWxsIGZsdXNoX3N0ZG91dHB1dC4KLQotCSogbWFpbi5jIChmbHVzaF9zdGRvdXRwdXQpOiBEbyBmZmx1c2ggKHN0ZG91dCkuCi0JKiBzaW1fY2FsbHMuYyAoZmx1c2hfc3Rkb3V0cHV0KTogRG8gZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKLQkqIHNpbV9jYWxsYmFja3MuaCAoZmx1c2hfc3Rkb3V0cHV0KTogRGVjbGFyZS4KLQotV2VkIEZlYiAyMSAxMDozOTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKGJ1Z19tYXBwaW5nKTogTmV3IHN0cnVjdHVyZSB0byBtYXAgYnVnIHN5c3RlbQotCWNhbGwgbnVtYmVycyB0byBhIHN0cmluZy4KLQkodG9wbGV2ZWwpOiBBZGQgcmVtYWluaW5nIGJ1Z2FwaSBzeXN0ZW0gY2FsbHMuCi0JKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX25hbWUpOiBNYXAgYnVnYXBpIHN5c3RlbSBjYWxsIG51bWJlciB0byBhCi0Jc3RyaW5nLgotCShlbXVsX2J1Z2FwaV9kb193cml0ZSk6IENvbW1vbiBjb2RlIHRvIHByb2Nlc3Mgd3JpdGUgc3lzdGVtIGNhbGxzLgotCShlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogSWYgb3MtZW11bCB0cmFjaW5nIGlzIG9uLCB0cmFjZQotCXRoZSBzeXN0ZW0gY2FsbC4gIFVzZSB0aGUgbmFtZSB0byBwcmludCB1bmtub3duIHN5c3RlbSBjYWxsLgotCUNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgX09VVExOLiAgQWRkIHN1cHBvcnQgZm9yIF9PVVRTVFIgYW5kCi0JX1BDUkxSIHN5c3RlbSBjYWxscy4KLQotV2VkIEZlYiAyMSAxNzowNzoyNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogTk9URVM6IE5ldyBmaWxlLiAgUmFtYmxpbmdzIG9uIHdoeSB0aGluZ3Mgd2VyZSBkb25lIHRoZXkgd2F5Ci0gCXRoZXkgd2VyZS4KLQkKLQkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogRGlkbid0IGVudGVyIHRoZSBtb2RlbCB2YWx1ZSBpbnRvIHRoZQotIAlkZXZpY2UgdHJlZSBhcyBhIHN0cmluZy4KLQkKLSAgCSogY3B1LmMgKGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KTogV3JvbmcgdGVzdCBmb3IgY29uZGl0aW9uYWwKLSAJZmx1c2ggb2YgY2FjaGUuCi0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogcmVnIHZhbHVlIGRpZG4ndCBtYXRjaAotIAlidXMgYWRkcmVzcy4KLQkKLQkqIHBwYy1vcGNvZGUtZmxhdDogbmV3IGZpbGUuIEdlbmVyYXRlIGFuIGluc3RydWN0aW9uIGRlY29kZQotIAlmdW5jdGlvbiBsaWtlIHBwYy1vcGNvZGUtY29tcGxleCBidXQgdXNlIHN3aXRjaCBzdGF0ZW1lbnRzLgotCi0JKiBJTlNUQUxMOiBkb2N1bWVudCBuZXcgb3Bjb2RlIGZpbGUsIGFkZCBleGFtcGxlIGNvbmZpZ3VyYXRpb25zLgotCi1UdWUgRmViIDIwIDE4OjQyOjMxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBtYWluLmMgKG1haW4pOiByZW5hbWUgcHNpbSBpbnN0YW5jZSAoc3lzdGVtKSB0byBzaW11bGF0aW9uIGFuZAotIAltYWtlIGdsb2JhbC4KLQkqIG1haW4uYyAoZXJyb3IpOiBwcmludCBvdXQgcGVyZm9ybWFuY2UgZXZlbiB3aGVuIGFuIGVycm9yIG9jY3VyZXMuCi0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IEZpeCBhcmd1bWVudCBwYXNzaW5nLgotCi0JKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IE1vdmUgaGFyZHdhcmUgZGV2aWNlcwotIAl0byAweDgwMDAwMDAwIGZyb20gMHg0MDAwMDAuCi0KLU1vbiBGZWIgMTkgMjI6NTQ6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKFRMQiBJbnZhbGlkYXRlIEVudHJ5LCBUTEIgSW52YWxpZGF0ZSBBTEwpOgotICAgICAgICBJbXBsZW1lbnQgYnkgcGFzc2luZyBvbiByZXF1ZXN0IHRvIGFsbCBwcm9jZXNzb3JzLgotCSogcHBjLWluc3RydWN0aW9ucyAoVExCIFN5bmNocm9uaXplKTogSW1wbGVtZW50IGFzIGVtcHR5LCBwcm9jZXNzb3IKLQl0bGIncyBhcmUgYWx3YXlzIGluIHN5bmMuCi0KLQkqIGNwdS5jIChjcHVfcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwpOiBOZXcgZnVuY3Rpb24uICBQYXNzIG9uIFRMQgotICAgICAgICBpbnZhbGlkYXRlIHJlcXVlc3QgdG8gcHJvY2Vzc29ycyBWTSBzdWItc3lzdGVtLgotCSogY3B1LmMgKGNwdV9wYWdlX3RsYl9pbnZhbGlkYXRlX2VudHJ5KTogRGl0dG8uCi0KLQkqIHZtLmMgKHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKTogTmV3IGZ1bmN0aW9uLiBNYXJrIGFsbCBwYWdlCi0gICAgICAgIFRMQiBlbnRyaWVzIGFzIGludmFsaWQuCi0JKiB2bS5jICh2bV9wYWdlX3RsYl9pbnZhbGlkYXRlX2VudHJ5KTogTmV3IGZ1bmN0aW9uLiBEaXR0IGJ1dCBvbmx5Ci0JaW52YWxpZGF0ZSBvbmUgVExCIGVudHJ5LgotCi0JKiBwc2ltLmMgKHBzaW1faW5pdCk6IEludmFsaWRhdGUgVExCJ3MgYmVmb3JlIChyZSlzdGFydGluZy4KLQotTW9uIEZlYiAxOSAyMToyNTo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IEFkZCBhcmd1bWVudAotICAgICAgICBvZWFfaW50ZXJydXB0X3ByZWZpeCAoMCBvciAxKSB0aGF0IHNwZWNpZmllcyB0aGUgcHJlZml4IE1TUltJUF0KLSAgICAgICAgYW5kIGhlbmNlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHZlY3RvcnMuICBBZGQgdGhpcyB0byB0aGUKLSAgICAgICAgZGV2aWNlIHRyZWUuCi0KLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBbGxvdyBjb25maWd1cmF0aW9uIG9mCi0gICAgICAgIGZsb2F0aW5nLXBvaW50IGFuZCBpbnRlcnJ1cHQgcHJlZml4IChkZWZhdWx0IDApIHVzaW5nIHRoZSBhYm92ZS4KLQotCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogUGFzcyBkdW1teSBhcmcgZm9yCi0gICAgICAgIGludGVycnVwdC1wcmVmaXguCi0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IEFsbG93IGNvbmZpZ3VyYXRpb24gb2YKLSAgICAgICAgaW50ZXJydXB0IHByZWZpeCAoZGVmYXVsdCAxKSBhbmQgY29uZmlndXJlIGludGVycnVwdCB0YWJsZSB0cmFwcwotICAgICAgICBhY2NvcmRpbmdseS4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBJbmNsdWRlIGEgc21hbGwgZWVwcm9tCi0gICAgICAgIGluIHRoZSBsaXN0IG9mIGRldmljZXMuCi0KLQkqIGRldmljZV90YWJsZS5jOiBGb3IgbW9tZW50IGZha2UgZWVwcm9tIGRldmljZSBieSBhIG1lbW9yeQotICAgICAgICBkZXZpY2UuICBJbiBmdXR1cmUgd2lsbCBuZWVkIGEgcHJvcGVyIGVlcHJvbSBkZXZpY2UuCi0KLVR1ZSBGZWIgMjAgMTc6MDE6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCi1GcmkgRmViIDE2IDEwOjQyOjI3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHNpbS5jOiBJbmNsdWRlIG9wdGlvbnMuaCBzbyBwcmludF9vcHRpb25zIGlzIGRlY2xhcmVkLgotCi1UaHUgRmViIDE1IDE4OjEwOjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZW11bF9uZXRic2QuYyAodG9wbGV2ZWwpOiBEbyBub3QgaW5jbHVkZSBzeXMvcmVzb3VyY2UuaCBpZiB0aGUKLQlzeXN0ZW0gZG9lc24ndCBoYXZlIGl0LCBhbmQgdHVybiBvZmYgZ2V0cnVzYWdlIHByb2Nlc3NpbmcuCi0JKHdyaXRlX3J1c2FnZSk6ICNpZmRlZiBvdXQgaWYgd2UgZG9uJ3QgaGF2ZSBnZXRydXNhZ2UuCi0JKGRvX2dldHJ1c2FnZSk6IERlZmluZSBhcyAwIGlmIHdlIGRvbid0IGhhdmUgZ2V0cnVzYWdlLgotCi1XZWQgRmViIDE0IDE3OjM4OjEyIDE5OTYgIEouIFQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChBQ19IRUFERVJfRElSRU5UKTogQWRkLCBzbyB0aGF0IHdlIGNhbiBmaWd1cmUgb3V0Ci0Jd2hlcmUgdGhlIGRpcmVjdG9yeSBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlCi0KLQkqIGVtdWxfbmV0YnNkLmM6IFVzZSB0aGUgbWFjcm9zIGRlZmluZWQgYnkgY29uZmlndXJlIHRvIGZpbmQgdGhlCi0JYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZ1bmN0aW9ucy4KLQotVGh1IEZlYiAgOCAwMDo1MzoxMyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluICh4b3JfZW5kaWFuKTogVHJhY2Ugc2V0dGluZyBvZiB4b3ItZW5kaWFuIGZsYWcuCi0KLVdlZCBGZWIgIDcgMTg6MjA6NTYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBzaW0uYyAocHNpbV91c2FnZSk6IEV4dGVuZCBkb2N1bWVudGF0aW9uLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbC1wcmludCk6IGZpeCB0eXBvLgotCi1TdW4gRmViICA0IDIzOjU4OjAyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaW4gKHdpdGgtc21wKTogRGVmYXVsdCBjb25maWd1cmF0aW9uIGFsbG93IHVwIHRvCi0JZml2ZSBwcm9jZXNzb3JzIChidXQgZW5hYmxlIG9ubHkgb25lKS4KLQotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogSWYgZmxvYXRpbmctcG9pbnQgaXMKLQlhbGxvd2VkLCBlbmFibGUgdGhlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIHNldCBpbiB0aGUKLQltc3IuCi0KLVR1ZSBKYW4gMzAgMjI6NTI6MzIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9zZWVrLCBjaGlycF9lbXVsX3JlYWQsCi0gICAgICAgIGNoaXJwX2VtdWxfd3JpdGUpOiBUb2xlcmF0ZSBpbnZhbGlkIGloYW5kbGVzLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX2NyZWF0ZSwgZGV2aWNlX2luc3RhbmNlX2RlbGV0ZSk6Ci0JaW5pdC9kZWxldGUgaW5zdGFuY2UgbmFtZQotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCk6IFJlYWQgdGhlIG5yIGFyZ3MgYW5kCi0gICAgICAgIHJldHVybnMgd2hlbiBkZXRlcm1pbmluZyB0aGUgc2VydmljZS4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9yZWFkX3QyaF9hcmdzKTogQWxsb3cgdmFyaWFibGUgbnVtYmVyIG9mCi0gICAgICAgIGFyZ3MgZm9yIHRoZSBtZXRob2QgImNhbGwtbWV0aG9kIi4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2dldHByb3ApOiBUb2xlcmF0ZSBhIG5fcmV0dXJucyBvZiB6ZXJvCi0gICAgICAgIC0gc2hvdWxkIGJlIG9uZS4gU29tZSBPcGVuQm9vdCBjb2RlIGRvZXNuJ3QgcGFzcyBjb3JyZWN0IGFyZy4KLQotCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2dldHByb3ApOiBUcmFjZSBtb3JlIHByb3BlcnR5IHR5cGVzLgotCi1UdWUgSmFuIDMwIDE5OjEyOjI5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBSVU46IE5ldyBmaWxlLiBEZXNjcmliZSBob3cgdG8gcnVuIFBTSU0KLQkqIElOU1RBTEw6IE5ldyBmaWxlLiBEZXNjcmliZSBob3cgdG8gaW5zdGFsbCBQU0lNCi0JKiBSRUFETUU6IE5ldyBmaWxlLiBPdmVydmlldyBQU0lNLgotCSogQlVHUzogTmV3IGZpbGUuIEJyaWVmbHkgZGlzY3VzcyBidWdzIGFuZCBsaW1pdGF0aW9ucwotCQotV2VkIEphbiAyNCAyMDoyODowOCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9idWdhcGkuYyAoT0VBX1NUQVJUX0FERFJFU1MpOiBQdXQgaXQgYmFjayB0byAweDEwMDAwMCwKLSAgICAgICAgd2Fzbid0IGNvcnJlY3RseSB1c2luZyBHTEQuCi0KLU1vbiBKYW4gMjIgMjI6NDQ6MTMgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBNYWtlIGRlZmF1bHQgbnVtYmVyIG9mCi0JYWN0aXZlIHByb2Nlc3NvcnMgMSAoZXZlbiB3aGVuIFNNUCBlbmFibGVkKS4KLQotTW9uIEphbiAyMiAyMjozNzozNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGljdV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayk6IEFkZCBleHRyYSByZWdpc3RlcgotICAgICAgICAoYXQgYWRkciArIDQpIHRoYXQgcmV0dXJucyBudW1iZXIgb2YgcHJvY2Vzc29ycy4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBVcGRhdGUgZGV2aWNlIG5vZGUgdG8KLSAgICAgICAgbWF0Y2guCi0KLU1vbiBKYW4gMjIgMjI6MDA6NDIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKE9FQV9TVEFSVF9BRERSRVNTKTogQ2hhbmdlIHRvIDB4NDAwMCBzbyB0aGF0IGl0Ci0gICAgICAgIG1hdGNoZXMgZ2FzLTk2MDExNi9sZC4KLQotRnJpIEphbiAxOSAwMDozMjoyNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHNpbS05NjAxMTkgcmVsZWFzZWQgLSBwc2ltLTEuMGIwMS4KLQotRnJpIEphbiAxOSAwMDozMjoyNyAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuYXUuY29tPgotCi0JKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogUmUtb3JkZXIgc28gdGhhdCBhbGwgb3B0aW9ucyBhcmUgc2V0Ci0gICAgICAgIGJlZm9yZSB0aGUgQ1BVJ3MgYXJlIGNyZWF0ZWQuICBXYXMgYnJlYWtpbmcgbW9uX2NyZWF0ZSgpOwotCi0JKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogVGlkeSB1cCBjb25mbGljdGluZyBjb25maWd1cmF0aW9uIGVycm9ycy4KLQotCSogZGVidWcuYzogQWRkIG1pc3NpbmcgcHJpbnQtaW5mbyBlbnRyeSB0byB0cmFjZSB0YWJsZS4KLQotCSogb3NfZW11bC5jIChvc19lbXVsX2NyZWF0ZSk6IEZpeCBgLWUnIG9wdGlvbi4gV2FzIGxvb2tpbmcgdW5kZXIKLSAgICAgICAgd3JvbmcgbmFtZS4KLQotCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBGaXggYC1yJyBvcHRpb24uIFdhcyBlbnRlcmluZyB1bmRlciB3cm9uZwotICAgICAgICBuYW1lLgotCi1UaHUgSmFuIDE4IDIwOjMzOjQ4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiB2bS5jIChvbV91bnBhY2tfYmF0cyk6IEZpeCBjaGVja2luZyBvZiBiYXQgYml0cy4KLQotCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSk6IFN0b3JlIGFkZHJlc3Mgb2YgT0IgaW4gbWVtb3J5Ci0gCWluIHRoZSBvc19lbXVsX2RhdGEgc3RydWN0dXJlLgotCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUKLSAJYnVnYXBpIGNvZGUgKGluIG1haW4gbWVtb3J5KSBpbiB0aGUgb3NfZW11bF9kYXRhIHN0cnVjdHVyZS4KLQotVGh1IEphbiAxOCAwMToxNDo1NSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogdm0uYyAob21fdHJhbnNsYXRlX2VmZmVjdGl2ZV90b19yZWFsKTogRml4IHRyYWNlIG91dHB1dC4KLQotV2VkIEphbiAxNyAyMjoyMTo1NSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcyk6IENyZWF0ZSBtZW1vcnkgZnJvbQotICAgICAgICBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGByZWcnIHByb3BlcnR5LgotCSogZGV2aWNlX3RhYmxlLmMgKHZtX2luaXRfYWRkcmVzc19jYWxsYmFjayk6IFVzZSBpbmZvcm1hdGlvbgotICAgICAgICBvYnRhaW5lZCBmcm9tIHByb3BlcnRpZXMuCi0JKiBlbXVsX25ldGJzZC5jIChlbXVsX25ldGJzZF9jcmVhdGUpOiBVcGRhdGUgdG8gY3JlYXRlIGRldmljZSBhbmQKLSAgICAgICAgcHJvcGVydHkgZW50cmllcyB0byBtYXRjaAotCi1UdWUgSmFuIDE2IDA5OjUwOjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaWRlY29kZV9leHByZXNzaW9uLmggKEFMVV9FTkQpOiBBZGQgSVRSQUNFIG9mIHRoZSByZXN1bHQuCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKEVxdWl2YWxlbnQpOiBFbmFibGUgdGhpcyBpbnN0cnVjdGlvbi4KLQkoQWRkIHRvIE1pbnVzIE9uZSBFeHRlbmRlZCk6IERpdHRvLgotCShTdWJ0cmFjdCBmcm9tIE1pbnVzIE9uZSBFeHRlbmRlZCk6IERpdHRvLgotCShBZGQvQW5kL09yL1hvciBJbW1lZGlhdGUpOiBBZGQgYWx1IHRyYWNlIG9mIHJlc3VsdC4KLQkoQWRkL0FuZC9Pci9Yb3IgU2hpZnRlZCBJbW1lZGlhdGUpOiBEaXR0by4KLQkoQW5kL09yL0VxdWl2YWxlbnQvTmFuZC9Ob3IpOiBEaXR0by4KLQkoQW5kL09yIHdpdGggQ29tcGxlbWVudCk6IERpdHRvLgotCShFeHRlbmQgU2lnbiBCeXRlL0hhbGYgV29yZCk6IERpdHRvLgotCShDb3VudCBMZWFkaW5nIFplcm9zKTogRGl0dG8uCi0JKFNoaWZ0IFJpZ2h0IEFsZ2VyYnJhaWMgV29yZCk6IERpdHRvLgotCShTaGlmdCBSaWdodCBBbGdlcmJyYWljIFdvcmQgSW1tZWRpYXRlKTogRGl0dG8uCi0KLVR1ZSBKYW4gIDkgMTU6MTA6MjcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpIDogTWFrZSBmb3JtYXQgdHlwZQotIAljb3JyZWN0LgotCSogZW11bF9jaGlycC5jIChtYXBfb3Zlcl9jaGlycF9ub3RlKSA6IERpdHRvCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfdGVzdCkgOiBEaXR0bwotCSogZGV2aWNlX3RhYmxlLmMgKHJlZ2lzdGVyX2luaXQpOiBEaXR0bwotCi1UdWUgSmFuICA5IDE0OjE2OjI2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgZGlzYWJsZS1zaW0tc3dpdGNoIGRlZmF1bHQuICBTd2l0Y2ggb25seQotIAl1c2VmdWwgaWYgdXNpbmcgLS1lbmFibGUtc2ltLW9wY29kZT1wcGMtb3Bjb2RlLXN0dXBpZCBhbmQgdGhlbgotIAlvbmx5IG1hcmdpbmFsbHkgc28uCi0KLU1vbiBKYW4gIDggMTI6MTc6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBkZXZpY2VfdGFibGUuYyAocmVnaXN0ZXJfaW5pdCk6IE1ha2UgZm9ybWF0IHR5cGUgY29ycmVjdC4KLQotV2VkIEphbiAgMyAxOToyMTo0NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogQWRkIG5vZGVzIHRvIGluaXQgdGhlCi0gCXN5c3RlbS1jYWxsIHRyYXAgdG8gdGhlIGVtdWwgaW5zdHJ1Y3Rpb24gY2FsbCBpbnN0cnVjdGlvbiAoQWxvbmcKLSAJd2l0aCBhbiByZmkgYW5kIGluZmluYXRlIGxvb3ApLgotCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogRXhwYW5kIHRvIGluY2x1ZGUKLSAJYSBmZXcgcmVhbCBQUEMgYnVnIGNhbGxzLiAgVGVzdCB3aXRoIHNpbXBsZSBoZWxsbyB3b3JsZC4KLQotVHVlIEphbiAgMiAyMDo1MToxOSAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9jaGlsZCwgZGV2aWNlX3NpYmxpbmcpOiBOZXcKLSAgICAgICAgZnVuY3Rpb25zLiAgUmV0dXJuIGNvcnJlc3BvbmRpbmcgZGV2aWNlIHZhbHVlLgotCi0JKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfY2hpbGQsIGNoaXJwX2VtdWxfcGVlciwKLSAgICAgICAgY2hpcnBfZW11bF9wYXJlbnQpOiBOZXcgZnVuY3Rpb25zIC0gZW11bGF0ZSBjb3JyZXNwb25kaW5nIE9wZW5Cb290Ci0gICAgICAgIGludGVyZmFjZXMuCi0KLQkqIGRldmljZV90YWJsZS5jIChyZWdpc3Rlcl9pbml0KTogRXh0ZW5kIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8KLSAgICAgICAgcmVnaXN0ZXIgaW5pdCBub2RlIHRvIGFsbG93IGEgc3BlY2lmaWMgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgdG8gYmUKLSAgICAgICAgc3BlY2lmaWVkLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogSW5pdCBTTVAgY29ycmVjdGx5IC0gdGhlCi0gICAgICAgIGluaXRpYWwgUEMgZm9yIGFsbCBwcm9jZXNzb3JzIGlzIGFuIGluZmluYXRlIGxvb3AgYnV0IHRoZW4sIGZvcgotICAgICAgICBwcm9jZXNzb3IgemVybywgaXMgcXVpY2tseSBjaGFuZ2VkIHRvIGJlIHRoZSBjb3JyZWN0IGNvZGUgc3RhcnRpbmcKLSAgICAgICAgYWRkcmVzcy4KLQotCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSk6IEFkZCBmYWtlIGJvb3RwYXRoCi0gICAgICAgIGV0LmFsLiBwcm9wZXJ0aWVzIHRvIHRyZWUuCi0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9nZXRwcm9wbGVuKTogTmV3IGZ1bmN0aW9uLiAgRW11bGF0ZSB0aGUKLSAgICAgICAgZ2V0cHJvcGxlbiBPcGVuQm9vdCBjYWxsLgotCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCk6IERvY3VtZW50IG90aGVyCi0gICAgICAgIHBvc3NpYmxlIGNoaXJwIGVtdWxhdGlvbiBpbnRlcm5hbCBzdGF0ZXMuCi0KLQkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKTogVHJhY2UgZmFpbGVkIGxvb2t1cHMKLSAJYXMgd2VsbCBhcyBzdWNjZXNzZnVsIG9uZXMuCi0JCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfb3Blbik6IE5ldyBmdW5jdGlvbiAtIGhhbmRsZSBvcGVuCi0gICAgICAgIGNsaWVudCBjYWxsLgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IFByb3BlciBydWxlIHRoYXQgZWxpbWluYXRlcyBtb3JlCi0gICAgICAgIGp1bmsuCi0KLVR1ZSBEZWMgMTkgMTM6MDA6MTEgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9leGl0KTogRnVsbCBvdXQgY2FsbC4KLQotCSogZGV2aWNlX3RhYmxlLmMgKGh0YWJfbWFwX3BhZ2UpOiBXYXNuJ3QgaGFuZGxpbmcgYnl0ZSBzd2FwIHdoZW4KLQljcmVhdGluZyBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLgotCi0JKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfZmluZF9ub2RlKTogQWxsb3cgcHJpbWF0aXZlIHdpbGQtY2FyZCBtYXRjaAotIAlvZiBkZXZpY2UgbmFtZXMgd2l0aCB0aGUgcGF0aC4KLQotCUZJWE1FOiBBcyBtZW50aW9uZWQgZWFybGllciwgdGhlIGRldmljZSBzdHVmZiBuZWVkcyB3b3JrIHRvIGJyaW5nCi0gCWl0IGludG8gbGluZSB3aXRoIE9wZW5Cb290LiAgUGFydCBvZiB0aGlzIHdvcmsgaXMgcmV3cml0aW5nIHRoZQotCWZpbmRfbm9kZSBmdW5jdGlvbiBzbyB0aGF0IGl0IGJlaGF2ZXMgYXMgc3BlY2lmaWVkIGluIHAxMjc1LgotCi1Nb24gRGVjIDE4IDE5OjU4OjU2IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBlbXVsX2NocnAuYyAoY2hpcnBfZW11bF93cml0ZSwgY2hpcnBfZW11bF9maW5kZGV2aWNlKTogYWRkCi0gCWJldHRlciB0cmFjaW5nLgotCi0JKiBlbXVsX2NocnAuYzogQ2hhbmdlIHJldHVybiB0eXBlIG9mIGVtdWwgZnVuY3Rpb25zIHRvIGludC4gIEVtdWwKLSAJZnVuY3Rpb25zIGVpdGhlciByZXR1cm4gLTEgb3IgemVybyBzbyB1bnNpZ25lZCB3YXMgYSBiaXQKLSAJZGFuZ2Vyb3VzLgotCQotCSogaW5saW5lLmggKCopLCBpZ2VuLmMsIGRnZW4uYywgKjogVXBkYXRlIElOTElORSBtYWNyb3Mgc28gdGhhdAotICAgICAgICB0aGV5IGFyZSBwYXJhbWF0ZXJpc2VkIHdpdGggdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgR2V0cyBhcm91bmQKLSAgICAgICAgdGhlIHByb2JsZW0gb2YgYHN0YXRpYycgbmVlZGluZyB0byBjb21lIGZpcnN0IHdpdGggYGF0dHJpYnV0ZScKLSAgICAgICAgY29tbWluZyBsYXN0LiAgRm9ybWF0IGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgc28gdGhhdCBlbWFjcwotCWRvZXNuJ3QgZ2V0IGNvbmZ1c2VkLgotCi1GcmkgRGVjIDE1IDE3OjA2OjQ0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzdGQtY29uZmlnLmggKFBTSU1fSU5MSU5FKTogQWRkIG1pc3NpbmcgaW5saW5lIGNvbmZpZ3VyYXRpb24KLSAJY29udHJvbCBmb3IgdGhlIG1haW4gbG9vcC4KLQotCSogbW9uLmMgKG1vbl9wcmludF9pbmZvKTogSWYgbW9uaXRvcmluZyBkaXNhYmxlZCBzdGlsbCBwcmludCBvdXQKLSAJdGhlIG51bWJlciBzZWNvbmRzIHVzZWQuCi0KLQkqIHBzaW0uYyAocnVuX3VudGlsX3N0b3ApOiBEb24ndCBtb25pdG9yIHRoZSBjYWNoZSBtaXNzZXMgd2hlbgotIAltb25pdG9yaW5nIGlzIGRpc2FibGVkLgotCi0JKiBjb25maWd1cmUuaW4gKHNpbV9tb24sIHNpbV9tb25pdG9yKTogQ29ycmVjdCB0eXBvIC0gc2ltX21vbiAtPgotIAlzaW1fbW9uaXRvciBmb3Igc2hlbGwgdmFyaWFibGUgKG9yIHNob3VsZCB0aGF0IGhhdmUgYmVlbiB0aGUgb3RoZXIKLSAJd2F5IGFyb3VuZD8pLgotCi0JKiB2bS5jICh2bV9zeW5jaHJvbml6ZV9jb250ZXh0KTogRml4IHdyb25nIHRlc3QgZm9yIHVuc3Vwb3J0ZWQKLSAJY2hhbmdlIGluIGVuZGlhbi1tb2RlLgotCQotCSogc3RkLWNvbmZpZy5oIChXSVRIX1JFR1BBUk0pLCBpbmxpbmUuaCAoSURFQ09ERV9JTkxJTkUsCi0JU0VNQU5USUNTX0lOTElORSk6IEFkZCAtRFdJVEhfUkVHUEFSTT08bj4gb3B0aW9uLiAgRW5hYmxlcyB0aGUKLQlfX2F0dHJpYnV0ZV9fKChfX3JlZ3Bhcm0oV0lUSF9SRUdQQVJNKSkpIGZvciBzb21lIGZ1bmN0aW9ucy4KLQljb25maWd1cmUgd2l0aCAtLWVuYWJsZS1zaW0tY2ZsYWdzPSItRFdJVEhfUkVHUEFSQU09MyIgKHNheSkuCi0JVW5mb3J0dW5hdGx5IGl0IHRpY2tsZXMgYSBidWcgKGdjYz8pIGFuZCBjYW4ndCBiZSB1c2VkLgotCi1Nb24gRGVjIDE4IDEzOjM2OjA2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZGV2aWNlLmMgKGRldmljZV90cmVlX2FkZF9kZXZpY2UpOiBNYWtlIHRyYWNlIGZwcmludGYgYXJndW1lbnRzCi0JdHlwZSBjb3JyZWN0LgotCSogZGV2aWNlX3RhYmxlLmMgKGh0YWJfZGVjb2RlX2hhc2hfdGFibGUpOiBEaXR0by4KLQkoaHRhYl9tYXBfYmluYXJ5KTogRGl0dG8uCi0JKGh0YWJfaW5pdF9jYWxsYmFjayk6IERpdHRvLgotCSogdm0uYyAob21fdmlydHVhbF90b19yZWFsKTogRGl0dG8uCi0KLVNhdCBEZWMgMTYgMDk6NTQ6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogRGVhbCB3aXRoIG5ldyBCRkQgdGhhdAotCWNoYW5nZWQgaG93IGJpZy9saXR0bGUgZW5kaWFuIHN1cHBvcnQgaXMgcmVjb3JkZWQsIHdoaWxlIHJlbWFpbmluZwotCWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIEJGRCB3aXRoICNpZmRlZnMuCi0JKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogRGl0dG8uCi0JKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBEaXR0by4KLQotRnJpIERlYyAxNSAxNTo1NTo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHN0ZC1jb25maWcuaCAoTU9ERUxfSU5MSU5FKTogVHVybiBvZmYgSU5MSU5FX01PRFVMRSBieSBkZWZhdWx0LgotCi0JKiBjb3JlZmlsZS5oOiBEZWxldGUgZGVjbGFyYXRpb25zIGZvciB1bmtub3duIGZ1bmN0aW9ucy4KLQkqIGRldmljZS5oOiBEaXR0by4KLQkqIGludGVycnVwdHMuaDogRGl0dG8uCi0JKiBpbnRlcnJ1cHRzLmM6IERpdHRvLgotCi1UaHUgRGVjIDE0IDE4OjQ5OjM0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBsZi5jIChsZl9wcmludF9mdW5jdGlvbl90eXBlKTogTmV3IGZ1bmN0aW9uLiAgTXVuZ2VzIGEgZnVuY3Rpb24KLSAJdHlwZSBzbyB0aGF0IHRoZSBwcmVmaXggKGVnIElOTElORS4uLikgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHR5cGUKLSAJYnV0IGJlZm9yZSBhbnkgYConLgotCi0JKiBpZ2VuLmM6IENoYW5nZSB0byBvdXRwdXQgZnVuY3Rpb25zIHVzaW5nIHRoaXMuCi0KLVdlZCBEZWMgMTMgMjM6NDc6MDAgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JRklYTUU6IEVtdWwgQ0hJUlAgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgZmluZCBkZXZpY2UKLSAJZnVuY3Rpb24uCi0KLQlGSVhNRTogRW11bCBDSElSUCBhbmQgZGV2aWNlIGRvIG5vdCBpbXBsZW1lbnQgZGV2aWNlIGluc3RhbmNlCi0gCW9wZXJhdGlvbnMuCi0KLVdlZCBEZWMgMTMgMjM6NDc6MDAgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBvcHRpb25zLmMgKG9wdGlvbnNfaW5saW5lKTogRnVuY3Rpb24gdG8gb3V0cHV0IG1lYW5pbmdmdWwKLSAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIElOTElORSBvcHRpb25zLgotCi0JKiBjb25maWd1cmUuaW4gKGlubGluZSk6IFJlcGxhY2UgaW5saW5lIG1hZ2ljIG51bWJlcnMgd2l0aCBtYWNybwotICAgICAgICBuYW1lcy4gTWFwIDEtPkxPQ0FMU19JTkxJTkUgYW5kIDItPkFMTF9JTkxJTkUuCi0KLQkqIGlubGluZS5oLCBpbmxpbmUuYzogdXBkYXRlIHRvIHVzZSBpbmxpbmUgbWV0aG9kLgotCi0JKiBzdGQtY29uZmlnLmggKENQVV9JTkxJTkUpLCBjcHUuaCwgaW5saW5lLmgsIGlubGluZS5jOiBtYWtlIGNwdS5oCi0gICAgICAgIGlubGluZSBhbHdheXMuCi0KLQkqIHN0ZC1jb25maWcuaCAoRVZFTlRTX0lOTElORSk6IElubGluZSBldmVudHMgaW4gcHNpbS4KLQotV2VkIERlYyAxMyAyMjowMToyMSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZV90YWJsZS5jIChodGFiX3N1bV9iaW5hcnkpOiBETUEgYmluYXJpZXMgdG8gY29ycmVjdCBieXRlCi0gICAgICAgIHdpdGhpbiBhIHBhZ2UuCi0KLVR1ZSBEZWMgMTIgMjI6NTE6MTggMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBwc2ltLmMgKHBzaW1fbWVyZ2VfZGV2aWNlX2ZpbGUpOiBDaGFuZ2UgYD0nIHRvIGA9PScsIHdhcyB0aGlzIGFuCi0gICAgICAgIGVycm9yPwotCi1UdWUgRGVjICA1IDExOjU2OjE0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChwcGNfbnJfbXRjcmZfY3JzLCBwcGNfYnJhbmNoX2NvbmRpdGlvbmFsX25hbWUsCi0gCXBwY19mdW5jdGlvbl91bml0X25hbWUpOiBTaW1wbGlmeSBieSBkZWNsYXJpbmcgdGhlc2UgYXJyYXlzIGFzCi0gCXB1cmUgYW5kIHNpbXBsZSBzdGF0aWMgKGluc3RlYWQgb2YgU1RBVElDX01PREVMKS4KLQotVHVlIERlYyAgNSAwMDo0NTozNCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogc2ltX2NhbGxzLmMgKHNpbV9jcmVhdGUsIHNpbV9sb2FkKSwgbWFpbi5jIChtYWluKSwgcHNpbS5jOiBQYXNzCi0gICAgICAgIGFuIG9wdGlvbnMgZGV2aWNlIGludG8gcHNpbV9jcmVhdGUoKSBzbyB0aGF0IG9wdGlvbnMgY2FuIGJlIG1lcmdlZAotICAgICAgICBpbnRvIHRoZSB0cmVlLgotCi0JKiBkZXZpY2UuYyAoKmFkZCopOiBDaGFuZ2Ugc2VtYW50aWNzIHNvIHRoZSBhZGQgZnVuY3Rpb25zIG9ubHkgYWRkCi0gICAgICAgIHdoZW4gdGhlIG5ldyBkZXZpY2UgKG9yIHByb3BlcnR5KSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuICBUaGlzCi0gICAgICAgIGFsbG93cyBtZXJnaW5nIG9mIG9wdGlvbnMgYW5kIGRhdGEuCi0KLU1vbiBEZWMgIDQgMTc6MTI6MTMgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNJQ1NfSCk6IERpZG4ndCBpbmNsdWRlIGJhc2ljcy5oIGluIHRoZSBsaXN0IG9mCi0gICAgICAgIGhlYWRlciBmaWxlcyB0byBkZXBlbmQgb24uCi0KLU1vbiBEZWMgIDQgMTc6MTI6MTMgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHN0ZC1jb25maWcuaDogKCpfTU9EVUxFKTogRXh0ZW5kIHRoZSA8bW9kdWxlPl9pbmxpbmUgbWFjcm8ncyBzbwotICAgICAgICB0aGF0IHRoZXkgYWxzbyBhbGxvdyBjb250cm9sIG92ZXIgc3RhdGljIGZ1bmN0aW9ucy4gIFJld3JpdGUKLSAgICAgICAgZG9jdW1lbnQgdG8gcmVmbGVjdCB0aGlzLgotCi0JKiBzdGQtY29uZmlnLmg6IChJTkxJTkUpOiBTaW1wbGlmeSBkZWZpbml0aW9uLCB0aGUgYWJvdmUgYW5kCi0gICAgICAgIGVhcmxpZXIgY2hhbmdlcyB0byBpZ2VuLmggZWxpbWluYXRlIHRoZSBuZWVkIHRvIGJlIGRlZmVuc2l2ZSBhYm91dAotICAgICAgICBlbmFibGluZyB0aGUgaW5saW5lIG9mIHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHN0ZC1jb25maWcuaDogKFNJTV9FTkRJQU5fSU5MSU5FLCBCSVRTX0lOTElORSk6IERvY3VtZW50IGxpbWl0ZWQKLSAgICAgICAgc3Vwb3J0IGZvciBpbmxpbmVpbmcgb2YgbW9kdWxlcyBmb3IgYWxsIGNhbGxlcnMuICBBZGp1c3QgcmVsZXZhbnQKLSAgICAgICAgbWFjcm8ncyBzbyB0aGF0IERFRkFVTFRfSU5MSU5FIHdpbGwgZW5hYmxlIHRoaXMuCi0KLQkqIGJhc2ljcy5oOiBSZS1vcmRlciAjaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIHNvIHRoYXQgYy1jb2RlIGZvcgotICAgICAgICBiYXNpYyBpbmNsdWRlIGZpbGVzIGRvZXMgbm90IGNhbGwgZnVuY3Rpb25zIGRlbGNhcmVkIGluIGxhdGVyCi0gICAgICAgICNpbmNsdWRlcy4KLQotCSogYmFzaWNzLmggKF9fYXR0cmlidXRlX18pLCBzaW1fY2FsbGJhY2tzLmg6IE1vdmUgYXR0cmlidXRlIG1hY3JvCi0gICAgICAgIHRvIGJhc2ljcy5oIGFuZCBhZGQgaGFjayAoaW5jbHVkZSA8c3RkaW8uaD4pIHRvIHRyeSBhbmQgYnJpbmcgdGhhdAotICAgICAgICBhbmQgb3RoZXIgcG9zc2libGUgY29uZmxpY3RpbmcgbWFjcm9zIGludG8gc2NvcGUgbXVjaCBlYXJsZXIuCi0KLQkqIHNpbS1lbmRpYW4uaCxjIChTSU1fRU5ESUFOX0lOTElORSkgYml0cy5oLGMgKEJJVFNfSU5MSU5FKToKLSAgICAgICAgQ2hhbmdlIHRvIHVzZSB0aGUgdXBkYXRlZCBpbmxpbmUgZGVmaW5pdGlvbnMuICBJZiBlbmFibGVkCi0gICAgICAgIGltbWVkaWF0bHkgaW5jbHVkZSB0aGUgY29ycmVzcG9uZGluZyBjLWNvZGUgc28gdGhhdCBpdCB3aWxsIGlubGluZQotICAgICAgICBmb3IgYWxsIG1vZHVsZXMuCi0KLQkqIGlubGluZS5oLCBpbmxpbmUuYyAoU0lNX0VORElBTl9JTkxJTkUsIEJJVFNfSU5MSU5FKTogUmVtb3ZlCi0gICAgICAgIHRoZXNlIGNhc2VzLCBtb3ZlZCB0byBtb2R1bGUgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi1TYXQgRGVjICAyIDE4OjM3OjUxIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiB2bS5jLCB2bV9uLmM6IEZpeCBodGFiIGNvZGUuCi0KLQkqIHZtLmMgKHZtX2RhdGFfbWFwX3JlYWRfYnVmZmVyKTogV2FzIHVzaW5nIEVBIG5vdCBSQSB3aGVuIHJlYWRpbmcKLSAgICAgICAgdGhlIGRhdGEgZnJvbSBjb3JlLgotCi0JKiBkZXZpY2UuYzogRml4IGh0YWIgY3JlYXRlIGNvZGUuCi0KLUZyaSBOb3YgMjQgMjM6MTA6MDkgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGJpdHMuaCwgYml0cy5jIChFWFRSQUNURUQpOiBDb252ZXJ0IHRvIGZ1bmN0aW9uLCBmaXggLSBoYWQgJiYKLSAgICAgICAgaW5zdGVhZCBvZiAmLgotCi0JKiBzaW0tZW5kaWFuLmggKFNXQVBfTiksIHNpbS1lbmRpYW4tbi5oLCBzaW0tZW5kaWFuLmM6IEhvdwotICAgICAgICBlbWJhcmFzaW5nIC0gZml4IHlldCBhbm90aGVyIGJ1ZyBpbiB0aGUgc3dhcCBjb2RlISAgU2ltcGxpZnkKLSAgICAgICAgZXZlcnl0aGluZyBieSB1c2luZyBtb3JlIGZ1bmN0aW9ucy4gQWRkIGhvc3QgdG8gYmlnLWVuZGlhbiBieXRlCi0gICAgICAgIHN3YXBwaW5nIHN1cHBvcnQuCi0KLUZyaSBOb3YgMjQgMjM6MTA6MDkgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZXMuaCwgZGV2aWNlcy5jOiBkZWxldGUsIHJlcGxhY2VkIGJ5IHRoZSBmaWxlcwotICAgICAgICBkZXZpY2VfdGFibGUuW2NoXSBhbmQgZGV2aWNlLltjaF0uCi0JKiBkZXZpY2VfdHJlZS5oLCBkZXZpY2VfdHJlZS5jOiBkaXR0bwotCi0JKiBkZXZpY2VfdGFibGUuaCwgZGV2aWNlX3RhYmxlLmM6IE5ldyBmaWxlcy4gIENvbnRhaW4gYSB0YWJsZSBvZgotICAgICAgICBkZXZpY2VzLgotCi0JKiBkZXZpY2UuaCwgZGV2aWNlLmMsIE1ha2VmaWxlLmluLCBzdGQtY29uZmlnLmggKERFVklDRV9JTkxJTkUpLAotICAgICAgICBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpOiBOZXcgZmlsZXMuICBEZWZpbmUgdGhlIGRldmljZSBvYmplY3QKLSAgICAgICAgYWxvbmcgd2l0aCBhbnkgYXR0YWNoZWQgcHJvcGVydGllcy4KLQotCSogZGV2aWNlX3RyZWUuaCwgZGV2aWNlX3RyZWUuYzogVXBkYXRlIHRvIHVzZSBuZXcgZGV2aWNlIG9iamVjdC4KLSAgICAgICAgRm9yIGNvbnZlbmllbmNlLCBjaGFuZ2UgdGhlIHByaW50ZCBmdW5jdGlvbnMgaW50byBkZXZpY2VfdHJlZV9hZGQKLSAgICAgICAgZnVuY3Rpb25zLgotCi0JKiBwc2ltLmMgKGNyZWF0ZV8qX3RyZWUpOiBVc2UgbmV3IGRldmljZV90cmVlIGNyZWF0ZSBmdW5jdGlvbnMuCi0KLQkqIGNvcmVmaWxlLmgsIGNvcmVmaWxlLmMgY29yZWZpbGUtbi5oIChjb3JlX24uaCk6IFVwZGF0ZSB0byB1c2UKLSAgICAgICAgdGhlIG5ldyBkZXZpY2UuaCAvIGRldmljZV90YWJsZS5oIGludGVyZmFjZS4gIFJlbmFtZSBjb3JlX24uaCB0bwotICAgICAgICBjb3JlZmlsZS1uLmggdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIG4gZmlsZXMuCi0KLQkqIE1ha2VmaWxlLmluIChydW4pOiBhZGQgY29yZWZpbGUtbi5oIHRvIGRlcGVuZGVuY2llcyBmb3IKLSAgICAgICAgY29yZWZpbGUuCi0KLQkqIGJhc2ljcy5oIChkZXZpY2VfaW5zdGFuY2UpLCBkZXZpY2UuaCwgZGV2aWNlLmMsIGRldmljZV90YWJsZS5oLAotICAgICAgICBkZXZpY2VfdGFibGUuYzogQWRkIHRoZSBjb25jZXB0IG9mIGEgZGV2aWNlIGluc3RhbmNlIGFuZCBvcGVyYXRvcnMKLSAgICAgICAgb24gdGhlc2UgaW5zdGFuY2VzIC0gY29ycmVzcG9uZHMgdG8gaWhhbmRsZSBpbiBPcGVuQm9vdCBzcGVhay4KLSAgICAgICAgRG9uJ3QgeWV0IGltcGxlbWVudCBpdC4KLQotVHVlIE5vdiAxNCAxMjoyNzowOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZW11bF9nZW5lcmljLmgsIGVtdWxfZ2VuZXJpYy5jIChlbXVsX3N5c2NhbGxfZW50ZXIsCi0gCWVtdWxfc3lzY2FsbF9leGl0KTogcmVuYW1lIGZyb20gZW11bF9lbnRlcl9jYWxsIC8KLSAJZW11bF9leGl0X2NhbGwuIEFzIG9ubHkgdXNlZCBieSBlbXVsX2RvX3N5c3RlbV9jYWxsIHNpbXBsaWZ5Ci0gCWFzc29jaWF0ZWQgY29kZS4KLQotCSogb3NfZW11bC5oLCBvc19lbXVsLmMsIGVtdWxfZ2VuZXJpYy5oOiBDb3JyZWN0IGFuZCBmaWxsIGFuCi0gCW9zX2VtdWwgaW50ZXJmYWNlLgotCi0JKiBvc19lbXVsLmMsIGVtdWxfYnVnYXBpLmgsIGVtdWxfYnVnYXBpLmMsIE1ha2VmaWxlLmluOiBBZGQKLSAJcHJlbGltaW5hcnkgaG9va3MgZm9yIGEga2VybmVsIG1vZGUgcm9tIGVtdWxhdGlvbi4KLQkKLQkqIGNhcC5oIChuZXcpLCBjYXAuYyAobmV3KTogQ2FwYWJpbGl0eSBkYXRhIGJhc2UuICBTb21lIGVtdWxhdGlvbnMKLSAJcGFzcyBvYmplY3QgaWRlbnRpZmllcnMgKGNhcGFiaWxpdGllcz8pIHRvL2Zyb20gdGhlIHNpbXVsYXRlZCBjb2RlCi0gCShmb3IgaW5zdGFuY2UgdGhlIHBoYW5kbGUgaW4gT3BlbkJvb3QpLiAgVGhlIGNhcCBvYmplY3QgaXMgYWJsZSB0bwotIAljaGVjay9tYXAgYmV0d2VlbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgKHRhcmdldCBwcm9ncmFtKQotIAlyZXByZXNlbnRhdGlvbnMgb2YgZWFjaCBpZGVudGlmaWVyLgotCQotCSogb3NfZW11bC5jLCBlbXVsX2NoaXJwLmgsIGVtdWxfY2hpcnAuYywgTWFrZWZpbGUuaW46IEFkZAotIAlwcmVsaW1pbmFyeSBob29rcyBmb3IgYSBrZXJuZWwgbW9kZSBJRUVFLTEyNzUgZW11bGF0aW9uLgotCi0JKiBjcHUuaCwgY3B1LmMgKGNwdV9jcmVhdGUsIGNwdV9vc19lbXVsYXRpb24sIGNwdSk6IEFkZCBvc19lbXVsIHRvCi0gCWxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCBpbiB3aGVuIGNyZWF0aW5nIGEgY3B1LiAgR3JhbnQgYWNjZXNzIHRvCi0gCXRoZSBlbGVtZW50LgotCi0JKiBzdGQtY29uZmlnLmggKE9TX0VNVUxfSU5MSU5FKSwgb3B0aW9ucy5jIChwcmludF9vcHRpb25zKSwKLQlpbmxpbmUuaCwgaW5saW5lLmM6IE5ldyB0byBhbGxvdyBjb250cm9sIG92ZXIgaW5saW5lIG9mCi0JY29ycmVzcG9uZGluZyBjb2RlIGZpbGVzLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChpbnN0cnVjdGlvbl9jYWxsKTogQWRkIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gdG8KLSAJY2FsbCB0aGUgaW5zdHJ1Y3Rpb24tY2FsbCBlbXVsYXRpb24gaGFuZGxlci4KLQkKLQkqIGludGVycnVwdHMuYyAoc3lzdGVtX2NhbGxfaW50ZXJydXB0KTogQ2FsbCByZW5hbWVkCi0gICAgICAgIG9zX2VtdWxfc3lzdGVtX2NhbGwgZnVuY3Rpb24oKS4KLQotCSogZW11bF9uZXRic2QuYzogVXBkYXRlIHRvIGludGVyZmFjZSB0byBnZW5lcmljIGVtdWxhdGlvbi4gIFNpbmNlCi0gICAgICAgIGFsbCBpdHMgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIGEgdGFibGUgZG9uJ3Qgd29ycnkgYWJvdXQgYW55Ci0gICAgICAgIGlubGluZS4KLQotCSogZW11bF9nZW5lcmljLmgsIGVtdWxfZ2VuZXJpYy5jLCBzcGEtKihkZWxldGUpOiBSZW1vdmUgcmVmZXJlbmNlcwotICAgICAgICBhbmQgY29kZSBmb3Igc3BhLCBubyBsb25nZXIgdG8gYmUgdXNlZC4KLQotCSogcHNpbS5jIChjcmVhdGVfY2hpcnBfZGV2aWNlX3RyZWUpOiBGaWxsIG91dCB3aGF0IHdhcyBwcmV2aW91c2x5Ci0gICAgICAgIHRoZSBvcGVuYm9vdCBjcmVhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBzdGFydHMgdG8gY3JlYXRlIGEgZnVsbAotICAgICAgICBPcGVuQm9vdCBkZXZpY2UgdHJlZS4KLQotVHVlIE5vdiAyOCAyMTo0ODowNiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGVidWcuaCwgZGVidWcuYzogcHRlIHRyYWNlIGlzIG1hZGUgcmVkdW5kYW50IGJ5IGh0YWIgdHJhY2UsCi0gICAgICAgIGRlbGV0ZSBpdC4gIEFkZCB2bSB0byBsaXN0IG9mIG9wdGlvbnMuICBTaW1wbGlmeSB0cmFjaW5nIG91dHB1dCBzbwotICAgICAgICBsaW5lcyBhcmUgbm90IGFzIGxvbmcuCi0KLVR1ZSBOb3YgMTQgMTI6Mjc6MDggMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGV2ZW50cy5oLCBldmVudHMuYyAoZXZlbnRfcXVldWVfaW5pdCksIHBzaW0uYyAocHNpbV9pbml0KTogKHJlKQotIAlpbml0aWFsaXplIHRoZSBldmVudCBxdWV1ZS4KLQotCi0KLQotCi0KLVR1ZSBOb3YgMjggMTM6Mzg6MjYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzaW0tZW5kaWFuLmg6IExvb2sgYXQgV09SRFNfQklHRU5ESUFOIHRvIGRldGVybWluZSBpZiB0aGUgaG9zdAotCWlzIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4gIEZvciBTV0FQX24sIHVzZSBodG9ubC9odG9ucyBpZgotCWhvc3QgaXMgbGl0dGxlIGVuZGlhbiwgbm90IGJpZyBlbmRpYW4gYW5kIGlmIFdJVEhfTlRPSCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWd1cmV7LC5pbn0gKC0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZSk6IEluc3RlYWQgb2YgZGVmaW5pbmcKLQkwLzEsIGRlZmluZSBpdCB0byBiZSBNT0RFTF9JU1NVRV97UFJPQ0VTUyxJR05PUkV9LiAgQWRkCi0JQUNfQ19CSUdFTkRJQU4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBob3N0IGlzIGJpZyBlbmRpYW4gb3Igbm90LgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlLgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfTU9ERUxfSVNTVUUpOiBEZWZhdWx0IHRvIDAuCi0JKENVUlJFTlRfTU9ERUxfSVNTVUUpOiBSZWZlcmVuY2UgV0lUSF9NT0RFTF9JU1NVRSwgYW5kIGlmIHRoYXQgaXMKLQkwLCB1c2UgY3VycmVudF9tb2RlbF9pc3N1ZS4KLQkoTU9ERUxfSVNTVUVfe1BST0NFU1MsSUdOT1JFfSk6IERlZmluZSBhcyAtMS8xLgotCi0JKiBwc2ltLmMgKGN1cnJlbnRfbW9kZWxfaXNzdWUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCi0JKiBjcHUuYyAoY3B1X2NyZWF0ZSk6IFVzZSBDVVJSRU5UX01PREVMX0lTU1VFID4gMCBpbnN0ZWFkIG9mCi0JV0lUSF9NT0RFTF9JU1NVRS4KLQkoY3B1X3tpbml0LGhhbHR9KTogRGl0dG8uCi0JKiBtb24uYyAobW9uX3ByaW50X2luZm8pOiBEaXR0by4KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKFBQQ19JTlNOXyogbWFjcm9zLCBicmFuY2ggaGFuZGxpbmcpOiBEaXR0by4KLQotCSogbW9uLmMgKG1vbl9wcmludF9pbmZvKTogUHJpbnQgaW5zdHJ1Y3Rpb25zL3NlY29uZCBpZiB2ZXJib3NlID4gMCwKLQlyYXRoZXIgdGhhbiA+IDEuCi0KLQkqIG1haW4uYyAobWFpbik6IFNldCBjdXJyZW50X21vZGVsX2lzc3VlIHRvIE1PREVMX0lTU1VFX1BST0NFU1MgaWYKLQl0aGUgLUkgc3dpdGNoIGlzIHVzZWQuCi0JKiBzaW1fY2FsbHMgKHNpbV9vcGVuKTogRGl0dG8uCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKG1vZGVsIHN1cHBvcnQpOiBBZGQgc3VwcG9ydCBmb3IgZGV0ZXJtaW5pbmcKLQl3aGVuIHdlIGRvbid0IGhhdmUgZW5vdWdoIHdyaXRlYmFjayBzbG90cy4gIEFkZCB0cmFjaW5nIGZvciB0aGUKLQliZWdpbm5pbmcgb2YgZWFjaCBjeWNsZS4KLQotTW9uIE5vdiAyNyAxNzo0NjozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG1vbi5jOiBDaGVjayBmb3Igd2hldGhlciB0byBpbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvdGltZS5oLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBpbmNsdWRlIGZpbGVzIHN5cy90eXBlcy5oIGFuZAotCXN5cy90aW1lLmguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCi0KLQkqIGNwdS5oIChDT05TVF9BVFRSSUJVVEUpOiBEZWZpbmUgYXMgX19hdHRyaWJ1dGVfXygoX19jb25zdF9fKSkgaWYKLQlub3QgYWxyZWFkeSBkZWZpbmVkLgotCShjcHVfc3lzdGVtKTogVXNlIENPTlNUX0FUVFJJQlVURSwgc28gdGhhdCB3aGVuIHdlJ3JlIG5vdCBpbmxpbmluZwotCXRoZSB3b3JsZCwgdGhlIG9wdGltaXplciBoYXMgYSBmYWlyIGNoYW5jZSBvZiBDU0UnaW5nIGZ1bmN0aW9uCi0JY2FsbHMuCi0JKGNwdV97bW9uaXRvcixucixyZWdpc3RlcnMsbW9kZWx9KTogRGl0dG8uCi0KLQkqIHN0ZC1jb25maWcuaCAoTU9ERUxfSU5MSU5FKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxIGlmCi0JREVGQVVMVF9JTkxJTkUgaXMgbm9uLXplcm8sIDAgb3RoZXJ3aXNlLCByYXRoZXIgdGhhbiBqdXN0IHRoZQotCXZhbHVlIG9mIERFRkFVTFRfSU5MSU5FLgotCi1GcmkgTm92IDI0IDExOjI0OjM0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbGYuaCAoX19hdHRyaWJ1dGVfXyk6IElmIG5vdCBHQ0MgYW5kIGF0IGxlYXN0IDIuNy4wLCBkZWZpbmUgYXMKLQlub3RoaW5nLgotIAkobGZfcHJpbnRmKTogQWRkIHByaW50ZiBfX2F0dHJpYnV0ZV9fLCBzbyB0aGUgY29tcGlsZXIgd2lsbAotCWF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIGZvcm1hdCBzdHJpbmcuCi0KLQkqIGNvbmZpZ3VyZXssLmlufSAoLS1lbmFibGUtc2ltLWljYWNoZSk6IElmIGFyZ3VtZW50IGlzIGRlZmluZSwKLQlhZGQgLVIgdG8gZmxhZ3MgcGFzc2VkIHRvIGlnZW4uCi0KLQkqIGlnZW4uYyAoc3RkbGliLmgpOiBJbmNsdWRlIGlmIHRoZSBzeXN0ZW0gc3VwcGxpZXMgb25lLgotCShzZW1hbnRpY3NfdXNlX2NhY2hlX3N0cnVjdCk6IE5ldyBnbG9iYWwgZm9yIC1SIGZsYWcgdG8gc2F5Ci0Jc2VtYW50aWNzIGlzIHRvIHVzZSB0aGUgY2FjaGUgc3RydWN0dXJlIGRpcmVjdGx5IHJhdGhlciB0aGFuCi0JcHV0dGluZyB0aGUgdmFsdWVzIGludG8gbG9jYWwgdmFyaWFibGVzLgotCShmaXJzdF91bmRlZiwgbGFzdF91bmRlZik6IE5ldyBzdHJ1Y3R1cmVzIHRvIHJlbWVtYmVyIG5hbWVzIHRvCi0JI3VuZGVmIGlmIC1SLgotCShsZl9wcmludF9jX2V4dHJhY3Rpb24pOiBJZiAtUiBhbmQgdGhpcyBpcyBzZW1hbnRpY3MsIGVtaXQgbmFtZXMKLQlhcyAjZGVmaW5lcyBwb2ludGluZyB0byB0aGUgY2FjaGUgc3RydWN0dXJlLCByYXRoZXIgdGhhbiBsb2FkaW5nCi0JdGhlIHZhbHVlcyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4KLQkobGZfcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbik6IElmIC1SLCAjdW5kZWYgYWxsIG9mIHRoZSBuYW1lcwotCWRlZmluZWQgaW4gbGZfcHJpbnRfY19leHRyYWN0aW9uLgotCShtYWluKTogUmVjb2duaXplIC1SLgotCi0JKiBpZGVjb2RlX2ZpZWxkcy5oIChTUFJfKik6IFJlZGVmaW5lIHNwcl8qIG1hY3JvcyBhcyBTUFJfKiB0bwotCWF2b2lkIGEgbmFtZSBjb25maWN0IGlmIC1SIHBhc3NlZCB0byBpZ2VuLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtZnNwciwgbXRzcHIpOiBSZW5hbWUgc3ByIGZpZWxkIHRvIFNQUi4KLQkobW9kZWxfZGF0YSk6IEFkZCBmaWVsZCB0byBjb3VudCB0aGUgdmFyaW91cyAjIG9mIENScyB0aGF0IHRoZQotCW10Y3JmIGluc3RydWN0aW9uIHVzZWQuCi0JKG1vZGVsX21vbl9pbmZvKTogUmV0dXJuIHN0cnVjdHVyZXMgY291bnRpbmcgdGhlICMgb2YgQ1JzIHRoYXQgdGhlCi0JbXRjcmYgaW5zdHJ1Y3Rpb24gdXNlZC4KLQkoYnJhbmNoZXMsIHN5bmMgaW5zdHJ1Y3Rpb25zKTogRG8gbm90IGNhbGwgbW9kZWwgZnVuY3Rpb25zIGlmCi0JV0lUSF9NT0RFTF9JU1NVRSBpcyAwLgotCi0JKiBtb24uYyAoc3RkbGliLmgpOiBJbmNsdWRlIGlmIHRoZSBzeXN0ZW0gc3VwcGxpZXMgb25lLgotIAkobW9uX3NvcnRfaW5zdHJ1Y3Rpb25fbmFtZXMpOiBOZXcgZnVuY3Rpb24gdG8gc29ydCBpbnN0cnVjdGlvbgotCW5hbWVzIGFscGhhYmV0aWNhbGx5LgotCShtb25fcHJpbnRfaW5mbyk6IENhbGwgcXNvcnQgd2l0aCBtb25fc29ydF9pbnN0cnVjdGlvbl9uYW1lcyB0bwotCXNvcnQgaW5zdHJ1Y3Rpb24gbmFtZXMuICBEb24ndCBhYm9ydCBpZiBXSVRIX01PREVMX0lTU1VFIGlzIDAuCi0JCi0JKiBkZWJ1Zy5oIChJVFJBQ0UpOiBNYWtlIHByaW50Zl9maWx0ZXJlZCBhcmd1bWVudHMgdHlwZSBjb3JyZWN0LgotCSogaWRlY29kZV9leHByZXNzaW9uLmggKENSMF9DT01QQVJFKTogRGl0dG8uCi0JKiBwc2ltLmMgKHBzaW1fcmVhZF9yZWdpc3Rlcik6IERpdHRvLgotCi0JKiBpZ2VuLmMgKGxmX3ByaW50X215X3ByZWZpeCk6IFVzZSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkgdG8KLQlzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHVudXNlZCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCXZhcmlhYmxlcy4KLQkobGZfcHJpbnRfY19leHRyYWN0aW9uKTogRGl0dG8uCi0JKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoRlBTQ1JfQkVHSU4pOiBEaXR0by4KLQotCSogcHBjLWNhY2hlLXJ1bGVzOiBEZWZpbmUgcnVsZXMgZm9yIG1ha2luZyBhIGJpdG1hc2sgZm9yIGFsbAotCXJlZ2lzdGVycy4KLQotCSogcHBjLWluc3RydWN0aW9uczogUmV3cml0ZSBtb2RlbCBzcGVjaWZpYyBmdW5jdGlvbnMgdG8gdXNlIHRoZQotCWJpdG1hc2sgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgaW5zdGVhZCBvZiB1c2luZyB0aGUgcmVnaXN0ZXIKLQlwb2ludGVyIHRvIGdldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdGhlbiBtYWtpbmcgdGhlIGJpdG1hc2suCi0KLVdlZCBOb3YgMjIgMTU6MjQ6MjcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF9icmFuY2hlcyk6IEFkZCBjb25kaXRpb25hbCBhcmd1bWVudCB0bwotCWNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0eXBlIG9mIGNvbmRpdGlvbmFsIGJyYW5jaCBpcyB1c2VkLgotCShjb25kaXRpb25hbCBicmFuY2hlcyk6IFBhc3MgQjAgb3IgLTEgdG8gbW9kZWxfYnJhbmNoZXMuCi0JKG1vZGVsX21vbl9pbmZvKTogUHJpbnQgb3V0IGNvbmRpdGlvbmFsIGJyYW5jaCBjb3VudHMuCi0JKG1vZGVsLWRhdGEpOiBBZGQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgb3V0IGNvbmRpdGlvbmFsIGJyYW5jaAotCXR5cGVzLgotCi1UdWUgTm92IDIxIDE2OjMxOjI1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogaWdlbi5jIChpbnNuX3RhYmxlX2xvYWRfaW5zbnMpOiBBZGQgc3VwcG9ydCBmb3IgbW9kZWwtc3RhdGljIGZvcgotCWludGVybmFsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgaW5saW5lZC4KLQkobGZfcHJpbnRfY19zZW1hbnRpYyk6IFJlbW92ZSBtb2RlbF9jbGVhbnVwLgotCShnZW5fbW9kZWxfe2MsaH0pOiBEaXR0by4KLQotCSogcHBjLWluc3RydWN0aW9uczogUmVkbyBtb2RlbCBzcGVjaWZpYyBzdXBwb3J0IG9uY2UgYWdhaW4uICBBZGQKLQlmbG9hdGluZyBwb2ludCBzdXBwb3J0IHRvIHRoZSBtb2RlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gIEZsZXNoCi0Jb3V0IGFsbCBvZiB0aGUgZmxvYXRpbmcgbXV0aXBseSBhZGQvc3VidHJhY3QgaW5zdHJ1Y3Rpb25zLiAgQWRkCi0JYmV0dGVyIHRyYWNpbmcgc3VwcG9ydCB0byB0aGUgbW9kZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLVN1biBOb3YgMTkgMjM6MDA6NTIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbCBkYXRhLCBtb2RlbF9idXN5KTogUmF0aGVyIHRoYW4gdXNpbmcgYQotCWJpdCBtYXNrIGZvciB0aGUgYnVzeSB1bml0cywganVzdCB1c2UgYSBjaGFyIGFycmF5LiAgQWxzbywgb25seQotCXN1cHBvcnQgMiBmdW5jdGlvbiB1bml0cyBhbiBpbnNuIGNhbiB1c2UsIHJhdGhlciB0aGFuIGEgbG9vcC4KLQotRnJpIE5vdiAxNyAxNDowODowOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHRhYmxlLmMgKHRhYmxlX2VudHJ5X3JlYWQpOiBNb3ZlIHNldHRpbmcgZW50cnktPmxpbmVfbnIgdG8gYWZ0ZXIKLQl0aGUgbW9kZWwgc3BlY2lmaWMgZmllbGRzIHNvIHRoZSBsaW5lIG51bWJlcnMgZm9yIHRoZSBhbm5leCBhcmUKLQljb3JyZWN0LgotCi0JKiBjcHUuYyAoY3B1X3tjcmVhdGUsaW5pdCxoYWx0fSk6IENoZWNrIGZvciBXSVRIX01PREVMX0lTU1VFCi0JYmVmb3JlIGNhbGxpbmcgdGhlIG1vZGVsIGZ1bmN0aW9ucy4KLQotCSogZGVidWcuYyAodHJhY2VfZGVzY3JpcHRvcik6IEFkZCB0cmFjZV9tb2RlbCBzdXBwb3J0LgotCSogZGVidWcuaCAodHJhY2Vfb3B0aW9ucyk6IERpdHRvLgotCi0JKiBpZ2VuLmMgKGdlbl9pY2FjaGVfaCk6IENyZWF0ZSB0eXBlIGlkZWNvZGVfY2FjaGUgYXMgdm9pZCBpZiBub3QKLQljYWNoaW5nIGluc3RydWN0aW9ucy4KLQkoZ2VuX21vZGVsX3tjLGh9KTogRHJvcCBtb2RlbF9pc3N1ZSBzdXBwb3J0LiAgQWRkIHN1cHBvcnQgZm9yCi0JbW9kZWxfY2xlYW51cC4KLQkobGZfcHJpbnRfbXlfcHJlZml4KTogSW5pdGlhbGl6ZSBhIGNvbnN0IGl0YWJsZV9pbmRleCB3aXRoIHRoZQotCWN1cnJlbnQgaW5kZXguCi0JKGxmX3ByaW50X2Nfc2VtYW50aWMpOiBDYWxsIG1vZGVsX2NsZWFudXAgYXQgdGhlIGVuZCBvZiB0aGUKLQlmdW5jdGlvbiB0byBjaGVjayBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlbid0IHN1cHBvcnRlZCB5ZXQgYnkKLQl0aGUgc2NoZWR1bGluZyBjb2RlLgotCQotCSogbW9uLmggKGNvdW50X3R5cGUpOiBOZXcgdHlwZSBmb3IgY291bnRlcnMuCi0JKiBtb24uYzogVXNlIGNvdW50X3R5cGUgaW5zdGVhZCBvZiB1bnNpZ25lZC4KLQotCSogcHBjLWluc3RydWN0aW9uczogUmVkbyBzY2hlZHVsaW5nIGNvZGUgb25jZSBhZ2Fpbi4gIE1ha2UgaXQgYWxsCi0JaW5saW5lIGZyaWVuZGx5LiAgSW5zdGVhZCBvZiBoYXZpbmcgZ2VuZXJhbCBjb2RlIGVtaXR0ZWQgYnkgaWdlbiwKLQlnbyB0aGUgcm91dGUgb2YgaGF2aW5nIGVhY2ggc2VtYW50aWMgcm91dGluZSBjYWxsIHRoZSBhcHByb3ByaWF0ZQotCW1vZHVsZS4KLQotVGh1IE5vdiAxNiAwOTo1MjoyNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHRhYmxlLmMgKHRhYmxlX2VudHJ5X3JlYWQpOiBBbGxvdyB0aGUgYW5uZXggdG8gaGF2ZSBibGFuayBsaW5lcy4KLQotCSogcHBjLWluc3RydWN0aW9uczogQ2hhbmdlIGxpbmVzIGluIG1vZGVsIHN0dWZmIHRoYXQganVzdCBoYXZlIGEKLQl0YWIgdG8ganVzdCBuZXdsaW5lLiAgQWRkIDYwMSBzdXBwb3J0LiAgRG9jdW1lbnQgbW9zdCBpbnN0cnVjdGlvbnMKLQlpbiB0ZXJtcyBvZiBtb2RlbCBzcGVjaWZpYyB0aW1pbmcgaW5mb3JtYXRpb24uICBEcm9wICdGVU5DVElPTicKLQlmcm9tIFBQQ19GVU5DVElPTl9VTklUX3h4eCBlbnVtcy4gIENoYW5nZSBQUENfVU5JVF9VTktOT1dOIC0+Ci0JUFBDX1VOSVRfQkFELiAgQWRkIFRSQUNFKHRyYWNlX3RiZCkgZm9yIGFsbCBkYXRhIGNhY2hlCi0JaW5zdHJ1Y3Rpb24ucy4gIFNpZ25hbCBpbGxlZ2FsIGluc3RydWNpdG9uIGlmIGRhdGEgY2FjaGUgYmxvY2sKLQlpbnZhbGlkYXRlIGlzIGlzc3VlZCBmcm9tIHByb2JsZW0gc3RhdGUuCi0KLQkqIGlnZW4uYyAobWF4X21vZGVsX2ZpZWxkc19sZW4pOiBOZXcgc3RhdGljIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0JbWF4IHNpemUgZm9yIHRoZSBtb2RlbCBzcGVjaWZpYyBmaWVsZHMuCi0JKG1vZGVsX2NfaW5zbik6IFVzZSBtYXhfbW9kZWxfZmllbGRzX2xlbiB0byBzaXplIGZpZWxkcy4KLQkoaW5zbl90YWJsZV9pbnNlcnRfaW5zbik6IFNldCBtYXhfbW9kZWxfZmllbGRzX2xlbi4KLQkobW9kZWxfdGFibGVfaW5zZXJ0KTogRGl0dG8uCi0JKGdlbl9tb2RlbF97YyxofSk6IE1vZGVsX2lzc3VlIGlzIG5vdyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvcgotCWFyZ3VtZW50LgotCi0JKiBkZWJ1Zy5jICh0cmFjZV9kZXNjcmlwdGlvbik6IEFkZCBzdXBwb3J0IGZvciB0cmFjZV90YmQuCi0KLQkqIG1vbi5jIChtb25faXNzdWUpOiBQYXNzIHByb2Nlc3NvciBhcmd1bWVudCB0byBtb2RlbF9pc3N1ZS4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBhbGwgZnVuY3Rpb24gdW5pdCBzdXBwb3J0LCBzaW5jZSB0aGUgbmV3ZXIKLQl0YWJsZSBkcml2ZW4gbW9kZWwgc3VwcG9ydCByZXBsYWNlcyBpdC4KLQkqIGNwdS57YyxofTogRGl0dG8uCi0JKiBtb24uYzogRGl0dG8uCi0JKiBpbmxpbmUue2MsaH06IERpdHRvLgotCSogc3RkLWNvbmZpZy5oOiBEaXR0by4KLQkqIG9wdGlvbnMuYzogRGl0dG8uCi0JKiBjb25maWd1cmV7LC5pbn06IERpdHRvLgotCSogTWFrZWZpbGUuaW46IERpdHRvLgotCSogcHNpbS5jOiBEaXR0by4KLQkqIGZ1bmN0aW9uX3VuaXQue2MsaH06IERlbGV0ZSB0aGVzZSBub3cgdXN1c2VkIGZpbGVzLgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfTU9ERUxfSVNTVUUpOiBBZGQgbmV3IG1hY3JvIG9uIHdoZXRoZXIgdG8KLQl0cmFjZSBpbnN0cnVjdGlvbnMgaW4gYSBtb2RlbCBzcGVjaWZpYyBtYW5vci4KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IGl0IG91dC4KLQkqIGNvbmZpZ3VyZXssLmlufTogQWRkIC0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZSBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbjogQWRkIC0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZSBmbGFncy4KLQkqIGlnZW4uYyAobGZfcHJpbnRfY19zZW1hbnRpYyk6IEFkZCBjYWxsIHRvIG1vbl9pc3N1ZSBoZXJlLiAgQ2hlY2sKLQlmb3IgV0lUSF9NT0RFTF9JU1NVRS4KLQkqIG1vbi5jIChtb25faXNzdWUpOiBSZW1vdmUgY2FsbCB0byBtb25faXNzdWVfaGVyZS4KLQotCSogcHBjLWluc3RydWN0aW9uczogTW92ZSBicmFuY2ggdHJhY2luZyB0byB0aGUgYWN0dWFsIGJyYW5jaAotCWluc3RydWN0aW9ucywgcmF0aGVyIHRoYW4gdGVzdGluZyBpdCBpbiBtb2RlbF9pc3N1ZS4gIEFkZCBjb2RlIHRvCi0JY29kZSBzdWNjZXNzZnVsL3Vuc3VjY2Vzc2Z1bCBicmFuY2ggcHJlZGljdGlvbnMsIGFuZCB0aGUgbnVtYmVyIG9mCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMgdGhhdCBmZWxsIHRocm91Z2guCi0KLVdlZCBOb3YgMTUgMTc6MzI6MTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjcHUuaCAoY3B1X21vZGVsKTogQWRkIGRlY2xhcmF0aW9uLgotCi0JKiBjcHUuYyAoc3RydWN0IF9jcHUpOiBBZGQgbW9kZWxfcHRyIHRvIGhvbGQgbW9kZWwgc3BlY2lmaWMKLQlpbmZvcm1hdGlvbi4KLQkoY3B1X21vZGVsKTogUmV0dXJuIHRoZSBtb2RlbCBpbnRlcm5hbCBwb2ludGVyLgotCShjcHVfe2NyZWF0ZSxpbml0LGhhbHR9KTogQ2FsbCB0aGUgYXBwcm9wcmlhdGUgbW9kZWwgZnVuY3Rpb24uCi0KLQkqIGlubGluZS5jIChtb24uYyk6IE1vdmUgaW5jbHVkZSBvZiBtb24uYyBhZnRlciBtb2RlbC5jLgotCi0JKiBtb24uYyAoX2NwdV9tb24pOiBBZGQgZmllbGRzIHRvIGNvdW50IHVuYWxpZ25lZCBtZW1vcnkKLQlyZWZlcmVuY2VzLgotCShtb25faXNzdWUpOiBDYWxsIG1vZGVsX2lzc3VlLCBub3QgZnVuY3Rpb25fdW5pdF9pc3N1ZS4KLQkobW9uX3tyZWFkLHdyaXRlfSk6IENvdW50ICMgb2YgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4KLQkobW9uX3ByaW50X2luZm8pOiBTd2l0Y2ggdG8gY2FsbGluZyBtb2RlbF9tb25faW5mbyBhbmQKLQltb2RlbF9tb25faW5mb19mcmVlIGluc3RlYWQgb2YgZnVuY3Rpb25fdW5pdCB2ZXJzaW9uLiAgUHJpbnQgb3V0Ci0JbnVtYmVyIG9mIHVuYWxpZ25lZCByZWFkcy93cml0ZXMuCi0KLQkqIHtwcGMtaW5zdHJ1Y3Rpb25zLGlnZW4uY306IE1vcmUgZ2xvYmFsIGNoYW5nZXMgdG8gYWRkIG1vZGVsCi0Jc3BlY2lmaWMgZmVhdHVyZXMuCi0KLQkqIGlubGluZS57YyxofTogUHJvdmlkZSBmb3IgaW5saW5pbmcgb3B0aW9ucy5jLgotCSogb3B0aW9ucy57YyxofTogRGl0dG8uCi0JKiBzdGQtY29uZmlnLmg6IEFkZCBPUFRJT05TX0lOTElORS4KLQotVHVlIE5vdiAxNCAwNDo0NzoyNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkZXZpY2VzLm8sIG1haW4ubyk6IFVwZGF0ZSBkZXBlbmRlbmN5LgotCi0JKiBpZ2VuLmMgKGdlbl9tb2RlbF9oKTogVXNlIGNvcnJlY3QgdmFyaWFibGUgaW4gbG9vcC4KLQkoZ2VuX21vZGVsX2MpOiBVc2Ugc3RyY21wLCBzdHJjYXNlY21wLgotCShnZW5fbW9kZWxfYyk6IFVzZSBFWFRFUk5fTU9ERUwgZm9yIGFycmF5cy4KLQkoZ2VuX21vZGVsX2gpOiBVc2UgU1RBVElDX01PREVMIGZvciBhcnJheXMuCi0JKGxmX3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQotCSogbWFpbi5jIChjcHUuaCk6IEluY2x1ZGUgY3B1LmggdG8gZ2V0IG1vZGVsLmguCi0KLQkqIGlubGluZS5oICh7RVhURVJOLFNUQVRJQ31fTU9ERUwpOiBEZWZpbmUuCi0KLU1vbiBOb3YgMTMgMDk6MTQ6MTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBpZ2VuLmMgKHtpbnNuLG1vZGVsfV90YWJsZV9maWVsZHMpOiBTcGVsbCBtbmVtb25pYyBjb3JyZWN0bHkuCi0JKGdlbl9pdGFibGVfaCxpdGFibGVfY19pbnNuKTogRGl0dG8uCi0JKG1vZGVsIHN1cHBvcnQpOiBNb3ZlIG1vZGVsIHN1cHBvcnQgYXJvdW5kLCBhZGQgc3VwcG9ydCBmb3IKLQltb2RlbC1kYXRhLCBtb2RlbC1pbnRlcm5hbC4gIFVzZSBhbm5leCBmaWVsZCBmb3IgbW9kZWwtbWFjcm9zCi0Jbm93LgotCi0JKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBJZiAtLWVuYWJsZS1zaW0taW5saW5lPW5vLAotCWFsc28gZGVmaW5lIElOTElORSBhcyBub3RoaW5nLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBzdGQtY29uZmlnLmggKElOTElORSk6IFJhdGhlciB0aGFuIG51a2luZyBJTkxJTkUsIG9ubHkgZGVmaW5lIGl0Ci0JYXMgX19pbmxpbmVfXyBpZiBhbnkgb2YgdGhlIElOTElORSBmbGFncyBhcmUgbm9uLXplcm8uCi0KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IG91dCBXSVRIX1hPUl9FTkRBSU4uCi0KLU1vbiBOb3YgMTMgMjM6MDM6NDUgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKHJmaSk6IEFkZCBtaXNzaW5nIGNvZGUuCi0KLQkqIGNwdS5jIChjcHVfZ2V0X3RpbWVfYmFzZSk6IEZpeCBjYWxjdWxhdGlvbiBvZiBjdXJyZW50IHZhbHVlIG9mCi0gICAgICAgIHRpbWUgYmFzZSByZWdpc3Rlci4KLQotCSogcHBjLXNwci10YWJsZSAoVEJMLCBUQlUpOiBGaXggVEJML1RCVSBlbnRyaWVzIC0gd2FzIGNvbmZ1c2luZwotICAgICAgICBtW3RmXXRiIHdpdGggbVt0Zl1zcHIuCi0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKG10c3ByLCBtZnNwcik6IEZpeCBtdHRibCAtIHdhc24ndCBzdG9yaW5nCi0gICAgICAgIGxvd2VyIHdvcmQuCi0KLU1vbiBOb3YgMTMgMjE6MzU6MzcgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+Ci0KLQkqIHN0ZC1jb25maWcuaCAoSU5MSU5FLCBTVEFUSUNfSU5MSU5FKTogV2FzIGJlaW5nIHNldCB0byBzdGF0aWMKLSAgICAgICAgaW5saW5lLi4gIE9ubHkgcHJvYmxlbSBiZWluZyB0aGF0IHdpdGggcHBjLW9wY29kZS1zaW1wbGUgdGhpcyBnYXZlCi0gICAgICAgIGl0IHRoZSBjaGFuY2UgdG8gaW5saW5lIGFsbCB0aGUgaWRlY29kZSBmdW5jdGlvbnMgd2l0aCBwb3RlbnRpYWxseQotICAgICAgICBkaXNhc3Rlcm91cyByZXN1bHRzIG9uIGEgMTZtYiBQQy4gIEZvciBtb21lbnQgaG9iYmxlIElOTElORS4KLQotCSogY29uZmlndXJlLmluLCBzdGQtY29uZmlnLmggKFdJVEhfU01QKTogTWFrZSB0aGF0IDUgcHJvY2Vzc29ycyBieQotICAgICAgICBkZWZhdWx0IC4uLgotCi0JKiBjb25maWd1cmUuaW46IFR3ZWVrIGZsYWdzIHBhc3NlZCB0byBnY2MgZm9yIC0td2l0aC1zaW0td2FybmluZ3MuCi0gICAgICAgIEZpcnN0bHkgbWFrZSB0aGVtIGVycm9ycyBhbmQgc2Vjb25kbHkgcmVtb3ZlIHRoZSBvcHRpb25zIGdjYy0yNDUKLSAgICAgICAgZG9lc24ndCByZWNvbml6ZS4KLQotTW9uIE5vdiAxMyAxNzo1NzoyNCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogbWlzYy5jICh6YWxsb2MpLCBjcHUuYyAoY3B1X2luaXQpLCBkZXZpY2VzCi0gCShjb25zb2xlX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrLCBpY3VfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssCi0gCXZtX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrKSwgbWFpbi5jICh6YWxsb2MpLCBtb24uYyAobWVtc2V0KSwKLSAJc2ltX2NhbGxzLmMgKHphbGxvYykgOiByZXBsYWNlIGJ6ZXJvKCkgd2l0aCBtZW1zZXQoKS4KLQotCSogZW11bF9uZXRic2QuYyAod3JpdGVfZGlyZW50cmllcyksIHBzaW0uYyAocHNpbV9yZWFkX3JlZ2lzdGVyLAotIAlwc2ltX3dyaXRlX3JlZ2lzdGVyKTogcmVwbGFjZSBiY29weSgpIHdpdGggbWVtY3B5KCkuCi0JCi1TdW4gTm92IDEyIDIwOjU1OjQxIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaW46IGZvciAtLWRpc2FibGUtc2ltLWlubGluZSAoLS1lbmFibGUtc2ltLWlubGluZT1ubyksCi0gICAgICAgIGZvcmNlIERFRkFVTFRfSU5MSU5FIHRvIDAgcmF0aGVyIHRoZW4gdHJ1c3RpbmcgdGhlIHN0ZAotICAgICAgICBjb25maWd1cmF0aW9uLgotCi1TdW4gTm92IDEyIDIwOjU1OjQxIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgotCi0JKiBpZ2VuLmMgKGxmX3ByaW50X2lkZWNvZGVfdGFibGUsIGlkZWNvZGVfdGFibGVfbGVhZik6IEZpeAotICAgICAgICBnZW5lcmF0aW9uIG9mIHN3aXRjaCBlbnRyaWVzIGluIHRhYmxlcyAtIHRyZWF0IHRoZSBzYW1lIGFzCi0gICAgICAgIGNyYWNraW5nL3NlbWFudGljIGZ1bmN0aW9ucy4KLQotCSogaWdlbi5jIChpZGVjb2RlX3N3aXRjaF9lbmQsIGlkZWNvZGVfc3dpdGNoX2xlYWYpOiBGaXggZ2VuZXJhdGlvbgotICAgICAgICBvZiBhIGJvb2xlYW4gc3dpdGNoIHN0YXRlbWVudCAoZmllbGQgemVybyBvciBub24temVybykuCi0KLQkqIHBwYy1vcGNvZGUtdGVzdC0xLCBwcGMtb3Bjb2RlLXRlc3QtMjogTmV3IGZpbGVzLiAgVGhlc2UgdGVzdCB0aGUKLSAgICAgICAgc3dpdGNoL3RhYmxlIGdlbmVyYXRpb24gYWJpbGl0eSBvZiBpZ2VuLgotCi0JKiBpZ2VuLmMgKGlkZWNvZGVfc3dpdGNoX2xlYWYpOiBGaXggY29kZSBvdXRwdXQgd2hlbiBhIHN3aXRjaAotICAgICAgICBzdGF0ZW1lbnQgbmVlZHMgdG8gbG9vayB1cCBhIHRhYmxlLgotCi0JKiBpZ2VuLmMgKGlkZWNvZGVfZGVjbGFyZV9pZl9zd2l0Y2gpOiBOZXcgZnVuY3Rpb24gY2FsbGVkIGZyb20KLSAgICAgICAgZ2VuX2lkZWNvZGVfYyAtIG5lZWQgdG8gZGVjbGFyZSBhbnkgaWRlY29kZSBzd2l0Y2ggZnVuY3Rpb25zCi0gICAgICAgIGJlZm9yZSB0aGV5IGFyZSB1c2VkIGluIGlkZWNvZGUgdGFibGVzLgotCi0JKiBpZ2VuLmMgKGxmX3ByaW50X2NfY3JhY2tlcl9mdW5jdGlvbiwgaWRlY29kZV9jcmFja19sZWFmLAotICAgICAgICBpZGVjb2RlX2NyYWNrX2luc24pOiBBZGQgaXNfaW5saW5lX2Z1bmN0aW9uIGFyZ3VtZW50IHRvIGNvZGUKLSAgICAgICAgcHJpbnRpbmcgY3JhY2tlciBmdW5jdGlvbnMgd2hpY2ggaW5kaWNhdGVzIGlmIFNUQVRJQ19JREVDT0RFIG9yCi0gICAgICAgIFNUQVRJQ19JTkxJTkVfSURFQ09ERSBzaG91bGQgYmUgdXNlZCBmb3IgZGVmaW5pdGlvbi4gIEZvcgotICAgICAgICBpZGVjb2RlX2NyYWNrX2luc24gKHdoaWNoIGltcGxpZXMgbm90IGR1cGxpY2F0aW5nL2V4cGFuZGluZykgZG9uJ3QKLSAgICAgICAgZGVjbGFyZSBmdW5jdGlvbiBhcyBpbmxpbmUgLSB3ZSBhc3N1bWUgdGhhdCB0aGUgb25seSB0aW1lIHRoaXMgaXMKLSAgICAgICAgY29kZSBpcyBnZW5lcmF0ZWQgaXMgd2hlbiB0aGluZ3MgYXJlIGJlaW5nIHRlc3RlZC4gIEZvcgotICAgICAgICBpZGVjb2RlX2NyYWNrX2xlYWYsIG1ha2Ugc3RhdGljIChpbnN0ZWFkIG9mIElOTElORSkgaWYgdGhlCi0gICAgICAgIGluc3RydWN0aW9ucyBwYXJlbnQgaXMgYSB0YWJsZSBhcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyBiZSBjYWxsZWQKLSAgICAgICAgdmlhIGEgdGFibGUuCi0KLQkqIGlnZW4uYyAoaWRlY29kZV9leHBhbmRfaWZfc3dpdGNoKTogRGVjbGFyZSBhcyBTVEFUSUNfSURFQ09ERSBub3QKLSAgICAgICAgU1RBVElDX0lOTElORV9JREVDT0RFLiBPbmx5IHRoZSBvdXRlcm1vc3QgaWRlY29kZSBzd2l0Y2ggd2lsbCBiZQotICAgICAgICBjYWxsZWQgZGlyZWN0bHksIGFsbCBvdGhlcnMgYXJlIGNhbGxlZCB2aWEgYSB0YWJsZS4KLQotCSogaWdlbi5jIChsZl9wcmludF9zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIsIHNlbWFudGljc19oX2xlYWYsCi0gICAgICAgIHNlbWFudGljc19oX2luc24sIHNlbWFudGljc19oX2Z1bmN0aW9uLAotICAgICAgICBsZl9wcmludF9jX3NlbWFudGljX2Z1bmN0aW9uLCBzZW1hbnRpY3NfY19mdW5jdGlvbik6IEFkZAotICAgICAgICBpc19pbmxpbmVfZnVuY3Rpb24gYXJndW1lbnQgdG8gbGZfcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyCi0gICAgICAgIHRvIGluZGljYXRlIGlmIGFuIGlubGluZSBvciBzdGF0aWMgZnVuY3Rpb24gZGVjbGFyYXRpb24vZGVmaW5pdGlvbgotICAgICAgICBzaG91bGQgYmUgb3V0cHV0LiAgRGVwZW5kaW5nIG9uIHNpdHV0YXRpb24gY2FsbCBhY2NvcmRpbmdseToKLSAgICAgICAgZnVuY3Rpb25zIChub3QgaW5zdHJ1Y3Rpb24gc2VtYW50aWMgcm91dGluZXMpIGFyZSBhbHdheXMgaW5saW5lOwotICAgICAgICBTZW1hbnRpYyByb3V0aW5lcyBhcmUgbWFkZSBpbmxpbmUgd2hlbiB0aGVyZSBpcyBubyBpY2FjaGUgKGNhY2hlCi0gICAgICAgIHdpbGwgY29udGFpbiB0aGUgZnVuY3Rpb24gYWRkcmVzcykgYW5kIGFyZSBkdXBsaWNhdGluZyAoc2VlIGFib3ZlKQotICAgICAgICBhbmQgdGhlIHBhcmVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBzd2l0Y2ggc3RhdGVtZW50LgotCi0JKiBpZ2VuLmMgKG9wY29kZV9maWVsZF9uZXcpOiBEZWxldGUuICBDb2RlIGNoYW5nZWQgdG8gdXNlIFpBTExPQwotICAgICAgICBhbmQgbW92ZWQgdG8gaW5zbl90YWJsZV9maW5kX29wY29kZV9maWVsZC4KLQotCSogdGFibGUuYyAodGFibGVfb3Blbik6IEZpeCB0eXBvIChucl9tb2RlbF9maWVsZHMgdnMgbnJfZmllbGRzKS4KLQotCSogaWdlbi5jIChtb2RlbF9jX2luc24pOiBTdWdnZXN0aW9uIC0gZG9jdW1lbnQgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgIGluc3RydWN0aW9uIG9uIGVhY2ggbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gbW9kZWwgdGFibGUuCi0KLUZyaSBOb3YgMTAgMDA6NDQ6MzggMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+Ci0KLQkqIGVtdWxfbmV0YnNkLmMgKGRvX2lvY3RsKTogQ2xlYW51cCBjb21waWxhdGlvbi4KLQotCSogc2ltX2NhbGxiYWNrcy5oIChfX2F0dHJpYnV0ZV9fKTogT25seSBkZWZpbmUgaWYgbm90IGRlZmluZWQgKHdhcwotICAgICAgICBhbHJlYWR5IGRlZmluZWQgb24gTmV0QlNEIGhvc3QpLgotCi1XZWQgTm92ICA4IDIxOjQ5OjUyIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfWE9SX0VORElBTiksIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IE5ldwotICAgICAgICBtYWNybywgaW5kaWNhdGVzIGlmIHRoZSBQb3dlclBDJ3MgaG9ycmlibGUgWE9SIGVuZGlhbiBtb2RlIHNob3VsZAotICAgICAgICBiZSBzdXBvcnRlZC4gIEFkZCB0byBjb25maWd1cmUgYW5kIG1ha2UuCi0KLQkqIHZtX24uaCAodm1fZGF0YV9tYXBfcmVhZF9OLCB2bV9kYXRhX21hcF93cml0ZV9OKSwgdm0uYwotICAgICAgICAodm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQpOiBJZiBYT1IgZW5kaWFuLCB4b3IgdGhlIGFkZHJlc3MKLQl3aXRoIGEgdmFsdWUgZnJvbSBhbiB4b3IgdGFibGUgKGluZGV4ZWQgYnkgc2l6ZSBvZiBhY2Nlc3MpLgotCi0JKiB2bS5jICh2bV9zeW5jaHJvbml6ZV9jb250ZXh0KSwgY3B1LmMgKGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KToKLSAgICAgICAgc2V0IHVwIHhvciB0YWJsZSB0byB4b3IgaWYgdGhlcmUgaXMgYSBjb25mbGljdCBiZXR3ZWVuIHRoZQotICAgICAgICBDVVJSRU5UX1RBUkdFVF9FTkRJQU4gYW5kIHRoZSBlbmRpYW4gaW5kaWNhdGVkIGluIHRoZSBNU1IuICBNb3ZlCi0gICAgICAgIGNoZWNrIG9mIHN1cG9ydGVkIGNoYW5nZSBvZiBlbmRpYW4gbW9kZSBmcm9tIGNwdS5jIHRvIHZtLmMuCi0KLQkqIHZtLmMgKHZtX2RhdGFfbWFwX3dyaXRlX2J1ZmZlciwgdm1fZGF0YV9tYXBfcmVhZF9idWZmZXIpOgotICAgICAgICBIb3BlZnVsbHkgYWRkZWQgY29ycmVjdCBoYWNrIHRvIGhhbmRsZSBYT1IgZW5kaWFuIG1vZGUuCi0KLQlGSVhNRTogSWYgTk9OU1RSSUNUIGFsaWdubWVudCBhbmQgWE9SIEVORElBTiBhbmQgTVNSIGluZGljYXRlcwotICAgICAgICBsaXR0bGUgZW5kaWFuIG1vZGUsIHRoZSBtb2RlbCBhY2NlcHRzIG1pc3MgYWxpZ25lZCB0cmFuc2ZlcnMuCi0KLQlGSVhNRTogTmVlZCB0byBjcmVhdGUgYW4gYGluaXQnIGRldmljZSB0aGF0LCBkdXJpbmcKLSAgICAgICAgaW5pdGlhbGl6YXRpb2luIGZvciBYT1IgbW9kZSwgaXQgbXVzaGVzIChYT1IgYWRkcmVzcykgYWxsIHRoZSBkbWEKLSAgICAgICAgZGF0YSBiZWZvcmUgcGFzc2luZyBpdCBvbiB0byB0aGUgY29yZSBmb3Igc3RvcmFnZS4gSnVzdCBsaWtlIHRoZQotICAgICAgICByZWFsIHRoaW5nIHJlYWxseS4KLQotV2VkIE5vdiAgOCAyMTo0OTo1MiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlcy5jIChoYWx0X2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayk6IFVzZSB2YWx1ZSB3cml0dGVuIHRvCi0gICAgICAgIGhhbHQgZGV2aWNlIHRvIGRldGVybWluZSBleGl0IHN0YXR1cy4gIFRodXMgYWxsb3dpbmcKLSAgICAgICAgc3VjY2Vzcy9mYWlsdXJlIG9mIE9FQSB0ZXN0cy4KLQotV2VkIE5vdiAgOCAwMDoxMDozOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoaWNiaSk6IElmIGljYWNoZSBwcmVzZW50IGZsdXNoIGl0LgotCi1UdWUgTm92ICA3IDIzOjM2OjMxIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgotCi0JKiBkZXZpY2VzLmMgKGh0YWJfaW5pdF9jYWxsYmFjayk6IEFkZCBjb2RlIHRvIGNyZWF0ZSBodGFiL3B0ZS4KLQotCSogZGV2aWNlcy5jIChkbWFfZmlsZSwgZmlsZV9pbml0X2NhbGxiYWNrLCBodGFiX2luaXRfY2FsbGJhY2spOgotICAgICAgICBOZXcgZnVuY3Rpb24gLSBEbWEgdGhlIG5hbWVkIGZpbGUgaW50byBtZW1vcnkgYXQgdGhlIHNwZWNpZmllZAotICAgICAgICBhZGRyZXNzLiAgVXNlLgotCi0JKiBkZXZpY2VfdHJlZS5oLCBkZXZpY2VfdHJlZS5jIChzY2FuZF8qKTogTmV3IGZ1bmN0aW9ucy4KLQotVHVlIE5vdiAgNyAyMzozNjozMSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZmlsdGVyX2ZpbGVuYW1lLmMsIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc28gdGhhdCBvbmx5IGRlcGVuZGFudCBvbgotICAgICAgICBhIHZlcnkgbGltaXRlZCBuciBvZiBmaWxlcy4gIFN0b3BzIGFuIHVubmVjZXNzYXJ5IGRlcGVuZGVuY3kuCi0KLVR1ZSBOb3YgIDcgMTU6NDQ6MzMgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvcmUuYyAoY29yZV9tYXBfZmluZF9tYXBwaW5nKTogVXNlIGNwdV9oYWx0IHJhdGhlciB0aGFuIGVycm9yCi0gCXRvIGFib3J0IGFuIGFjY2VzcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KLQotU3VuIE5vdiAxMiAwNzo1ODowOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGlnZW4uYyAobW9kZWxfdGFibGVfaW5zZXJ0X3ttYWNybyxmdW5jdGlvbn0pOiBOZXcgZnVuY3Rpb25zLgotCShpbnNuX3RhYmxlX2xvYWRfaW5zbnMpOiBDYWxsIHRoZW0uCi0JKGdlbl9tb2RlbF9oKTogTW92ZSBzZWN0aW9uIGVtaXRpbmcgbW9kZWwtbWFjcm9zIHRvIGJlIGZpcnN0LgotCShtb2RlbF97YyxofV9mdW5jdGlvbik6IE5ldyBmdW5jdGlvbnMgY2xvbmVkIGZyb20gc2VtYW50aWMKLQlmdW5jdGlvbnMgdG8gcHJpbnQgb3V0IHRoZSBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uIGZvcgotCW1vZGVsLWZ1bmN0aW9ucy4KLQkoZ2VuX21vZGVsX3tjLGh9KTogUHJpbnQgb3V0IG1vZGVsLWZ1bmN0aW9ucy4KLQotCSogcHBjLWluc3RydWN0aW9ucyAobW9kZWxfe3N0YXJ0LGhhbHQscHJpbnRfaW5mb30pOiBBZGQgZHVtbXkKLQltb2RlbC1mdW5jdGlvbnMuCi0KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IG91dCBXSVRIX3ssREVGQVVMVF99TU9ERUwsIG5vdAotCVdJVEhfUFBDX3ssREVGQVVMVF99X01PREVMLgotCShvcHRpb25zX3BwYyk6IERlbGV0ZSBub3cgdW51c2VkIGZ1bmN0aW9uLgotCShjcHUuaCk6IEluY2x1ZGUgY3B1LmgsIG5vdCBqdXN0IGJhc2ljcy5oLgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfeyxERUZBVUxUX31NT0RFTCk6IERlZmluZS4KLQotCSogaWdlbi5jIChtb2RlbF9tYWNyb3MsIGxhc3RfbW9kZWxfbWFjcm8pOiBOZXcgc3RhdGljcyB0byBrZWVwCi0JdHJhY2sgb2YgbWFjcm9zIHRvIGdvIGluIG1vZGVsLmguCi0JKGluc25fdGFibGVfbG9hZF9pbnNucyk6IEFkZCBtb2RlbC1tYWNyb3MgdG8gbW9kZWxfbWFjcm9zIGxpbmtlZAotCWxpc3QuCi0JKG1vZGVsX3RhYmxlX2ZpZWxkcyk6IEFkZCBmaWVsZCBmb3IgcHJpbnRhYmxlIG5hbWUuCi0JKGdlbl9tb2RlbF9oKTogSWYgdGhlcmUgYXJlIG1vZGVsIG1hY3JvcyBkZWZpbmVkLCBwcmludCB0aGVtIG91dC4KLQlQcmludCBvdXQgREVGQVVMVF9NT0RFTCBhcyB0aGUgZmlyc3QgbW9kZWwgaWYgdGhlcmUgYW55IG1vZGVscwotCXNwZWNpZmllZCwgb3RoZXJ3aXNlIE1PREVMX05PTkUuICBQcmludCBvdXQgZXh0ZXJuYWwgZGVjbCBmb3IKLQljdXJyZW50X21vZGVsLiAgUHJpbnQgb3V0IGRlY2wgZm9yIG1vZGVsX3NldC4KLQkoZ2VuX21vZGVsX2MpOiBBZGQgZnVuY3Rpb24gbW9kZWxfc2V0LiAgU3dpdGNoIHRvIHVzZSBwcmludGFibGUKLQluYW1lIGZvciB0aGUgbW9kZWwsIG5vdCB0aGUgaW50ZXJuYWwgaWRlbnRpZmllciB1c2VkLgotCi0JKiBwc2ltLmMgKGN1cnJlbnRfbW9kZWwpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zOiBBZGQgbWFjcm9zIGZvciBmbGFnIGRlZmluZXMuICBTd2l0Y2ggZmlyc3QKLQltb2RlbCBzbyA2MDQgaXMgZmlyc3QuCi0KLQkqIG1haW4uYyAobWFpbik6IENhbGwgbW9kZWxfc2V0LCBub3QgZnVuY3Rpb25fdW5pdF9tb2RlbC4KLQkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IERpdHRvLgotCSogc2ltX2NhbGxzLmMsIE1ha2VmaWxlLmluOiBzaW1fY2FsbHMuYyBub3cgaW5jbHVkZXMgY3B1LmguCi0KLVNhdCBOb3YgMTEgMDc6Mjc6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtb24uaCAobW9uX2V2ZW50cyk6IE5ldyBlbnVtZXJhdGlvbiBmb3Igb3RoZXIgZXZlbnRzIHdlIHdhbnQgdG8KLQloYW5kbGUuCi0JKG1vbl9ldmVudCk6IEFkZCBkZWNsYXJhdGlvbiBmb3IgZnVuY3Rpb24uCi0KLQkqIG1vbi5jIChtb25fZXZlbnQpOiBOZXcgZnVuY3Rpb24uCi0JKG1vbl9wcmludF9pbmZvKTogUHJpbnQgaWNhY2hlIG1pc3Nlcy4KLQotCSogcHNpbS5jIChydW5fdW50aWxfc3RvcCk6IE1vbml0b3IgaWNhY2hlIG1pc3Nlcy4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0taW5saW5lKTogRml4IHR5cG9zIGluIGhhbmRsaW5nIGNvbW1hCi0Jc2VwYXJhdGVkIGlubGluZSBvcHRpb25zLgotCSgtLWVuYWJsZS1zaW0taWNhY2hlKTogRWNobyBpY2FjaGUgc2l6ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogaWdlbi5jIChzZW1hbnRpY3NfaF9wcmludF9mdW5jdGlvbik6IEVtaXQgU1RBVElDX1NFTUFOVElDUwotCWluc3RlYWQgb2YgSU5MSU5FX1NFTUFOVElDUyBzbyB0aGF0IHRoZSBjb21waWxlciB3b24ndCBrZWVwIGFsbCBvZgotCXRoZSBzZW1hbnRpYyBmdW5jdGlvbnMgYXMgaW5saW5lIFJUTCwgZ2l2ZW4gdGhhdCB0aGUgYWRkcmVzcyBvZgotCXRoZSBmdW5jdGlvbiBpcyB0YWtlbiB3aGljaCBmb3JjZXMgb3V0bGluZSBjYWxscyBhbnl3YXkuCi0JKGxmX3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKTogRGl0dG8uCi0JKGdlbl9zZW1hbnRpY3NfaCk6IERlZmluZSBTVEFUSUNfU0VNQU5USUNTIGFzIG5vdGhpbmcgaWYgbm90Ci0JZGVmaW5lZC4KLQkobGZfcHJpbnRfY19jcmFja2VyX2Z1bmN0aW9uKTogRW1pdCBTVEFUSUNfSURFQ09ERSBpbnN0ZWFkIG9mCi0JU1RBVElDX0lOTElORV9JREVDT0RFLgotCShnZW5faWRlY29kZV9jKTogRGVmaW5lIFNUQVRJQ19JREVDT0RFIGlmIG5vdCBkZWZpbmVkLgotCShnZW5fbW9kZWxfaCk6IFVzZSAjaWZkZWZzIHRvIGRlZmluZSB0eXBlcyB0byBob2xkIG1vZGVsIHVuaXRzLAotCWN5Y2xlcywgYW5kIGZsYWdzLgotCShtb2RlbF90YWJsZV9pbnNlcnQpOiBBZGQgYSBzZW50aW5lbCBmdW5jdGlvbmFsIHVuaXQgYXQgdGhlIGVuZCB0bwotCXNpbXBsaWZ5IGxvb3AgcHJvY2Vzc2luZy4KLQkobW9kZWxfY19pbnNuKTogVXNlIDxmdW5jdGlvbi11bml0Pl9TRU5USU5BTCBpbnN0ZWFkIG9mIDAgZm9yIGFueQotCWluc3RydWN0aW9uIG5vdCBzcGVjaWZpbmcgYSBmdW5jdGlvbiB1bml0IGZvciB0aGUgY3VycmVudCBtb2RlbC4KLQkoZ2VuX21vZGVsX3tjLGh9KTogUHJvdmlkZSBib3VuZHMgZm9yIG1vZGVsX3RpbWVfbWFwcGluZy4KLQkKLQkqIGlubGluZS5oIChTVEFUSUNfU0VNQU5USUNTKTogRGVmaW5lIHRvIGJlIHN0YXRpYyBpZgotCVNFTUFOVElDU19JTkxJTkUgaXMgZGVmaW5lZC4KLQkoU1RBVElDX0lERUNPREUpOiBEZWZpbmUgdG8gYmUgc3RhdGljIGlmIElERUNPREVfSU5MSU5FIGlzCi0JZGVmaW5lZC4KLQkKLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IEZpeCB0eXBvLgotCi1GcmkgTm92IDEwIDA2OjM5OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0te29wY29kZSxjb25maWd9KTogVXNlICRzcmNkaXIgd2hlbgotCWNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGZpbGVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiB0YWJsZS5jICh0YWJsZSk6IE5ldyBmaWVsZCBucl9tb2RlbF9maWVsZHMuCi0JKHRhYmxlX29wZW4pOiBOZXcgcGFyYW1ldGVyIG5yX21vZGVsX2ZpZWxkcy4KLQkodGFibGVfZW50cnlfcmVhZCk6IFBhcnNlIG1vZGVsIGZpZWxkcyB0aGF0IGJlZ2luIHdpdGggYSAnKicgYWZ0ZXIKLQllYWNoIGluc3RydWN0aW9uLgotCSogaWdlbi5jLCBkZ2VuLmM6IENoYW5nZSBjYWxsZXJzIG9mIHRhYmxlX29wZW4uCi0KLQkqIGlnZW4uYzogQWRkIHN1cHBvcnQgZm9yIGR1bXBpbmcgbW9kZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4KLQltb2RlbC5oIGFuZCBtb2RlbC5jLgotCShpbnNuX2ZpZWxkX25hbWUpOiBEZWxldGUgdW51c2VkIGFycmF5LgotCShnbG9iYWwgdmFyaWFibGVzKTogTWFrZSBnbG9iYWwgdmFyaWFibGVzIHN0YXRpYywgc28gd2UgY2FuIHRlbGwKLQl3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciB1c2VkLgotCShjYWNoZV9zZW1hbnRpY19hY3R1YWwpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCShpbnNuX3RhYmxlX2xvYWRfaW5zbnMpOiBJZiB0aGUgaW5zbiBpcyByZWFsbHkgYSBtYWNoaW5lIG1vZGVsLAotCWNhbGwgbW9kZWxfdGFibGVfaW5zZXJ0IGluc3RlYWQgb2Ygb3RoZXIgcHJvY2Vzc2luZy4KLQkobW9kZWxfdGFibGVfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBkZWZpbmluZyB0aGUKLQlmdW5jdGlvbmFsIHVuaXRzIG9mIGEgcGFydGljdWxhciBtYWNoaW5lIG1vZGVsLgotCShpbnNuX3RhYmxlKTogQWRkIGxhc3RfZnVuY3Rpb24gZmllbGQgc28gd2UgY2FuIGFkZCBmdW5jdGlvbnMgYXQKLQl0aGUgZW5kLgotCShpbnNuX3RhYmxlX2luc2VydF9mdW5jdGlvbik6IFVzZSBsYXN0X2Z1bmN0aW9uIGZpZWxkIHdoZW4KLQlhcHBlbmRpbmcgbmV3IGZ1bmN0aW9uLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zOiBBZGQgYSBmZXcgbW9kZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIDYwMywKLQk2MDNlLCBhbmQgNjA0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotCQotCSogdGFibGUuaCAodGFibGVfbW9kZWxfZW50cnkpOiBOZXcgbGlua2VkIGxpc3QgdG8gaG9sZCBtb2RlbAotCXNwZWNpZmljIGluZm9ybWF0aW9uLCBvbmUgcGVyIGxpbmUuCi0JKHRhYmxlX2VudHJ5KTogQWRkIG1vZGVsX2ZpcnN0LCBtb2RlbF9sYXN0IGZpZWxkcy4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0taW5saW5lKTogSWYgZ2NjIGlzIGZvdW5kIGFuZAotCS0tZW5hYmxlLXNpbS1pbmxpbmUgaXMgbm90IHNwZWNpZmllZCwgZGVmYWluZSBERUZBVUxUX0lOTElORSB0byAxLAotCW5vdCAyLgotCSgtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyk6IE5ldyBzd2l0Y2ggdG8gY2hlY2sgd2hldGhlciByZXNlcnZlZAotCWJpdHMgYXJlIHNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0JKC0tZW5hYmxlLXNpbS1vcGNvZGUpOiBNYWtlIGNvbXBsZXggdGhlIGRlZmF1bHQuCi0JKGFsbCBzd2l0Y2hlcyk6IEFkZCBhcHByb3ByaWF0ZSBjaGVja3MgYW5kIGVycm9yIG1lc3NhZ2VzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoUkVTRVJWRURfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlIHNldCBieQotCS0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzLgotCShDT05GSUdfQ0ZMQUdTKTogSW5jbHVkZSBSRVNFUlZFRF9DRkxBR1MuCi0JKEJVSUxUX1NSQyk6IGlnZW4gbm93IGdlbmVyYXRlcyBtb2RlbC5jIGFuZCBtb2RlbC5oLgotCShMSUJfT0JKKTogSW5jbHVkZSB0YWJsZS5vLgotCSh0bXAtaWdlbik6IEFkZCAtbS8tTSBvcHRpb25zIHRvIHdyaXRlIG1vZGVsLmMvbW9kZWwuaC4KLQkobW9kZWwubyk6IE5ldyBvYmplY3QuCi0JKENQVV9IKTogSW5jbHVkZSBtb2RlbC5oLgotCi0JKiBjcHUuaDogSW5jbHVkZSBtb2RlbC5oLgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfUkVTRVJWRURfQklUUyk6IERlZmluZS4KLQkoTU9ERUxfSU5MSU5FKTogRGl0dG8uCi0KLQkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IG91dCBXSVRIX1JFU0VSVkVEX0JJVFMuCi0KLVRodSBOb3YgIDkgMTI6MjI6MTUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIC0tc2lsZW50LCBkb24ndCBvdXRwdXQgaW5mb3JtYXRpb24gbWVzc2FnZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWFsaWdubWVudCk6IEZpeCB0eXBvIGluIHNwZWNpZmluZyBub24KLQlzdHJpY3QgYWxpZ25tZW50LgotCSgtLWVuYWJsZS1zaW0tc3dpdGNoKTogTWFrZSBkZWZhdWx0IG9uLgotCSgtLWVuYWJsZS1zaW0tZHVwbGljYXRlKTogTWFrZSBkZWZhdWx0IG9uLgotCSgtLWVuYWJsZS1zaW0tc21wKTogTWFrZSBkZWZhdWx0IDAuCi0JKC0tZW5hYmxlLXNpbS1tb24pOiBEb24ndCBzZXQgc2ltX2Zsb2F0IGlmIG5vdCBzZXQuCi0JKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBJZiBnY2MgaXMgZm91bmQgYW5kIC0tZW5hYmxlLXNpbS1pbmxpbmUgaXMKLQlub3Qgc3BlY2lmaWVkLCBkZWZpbmUgREVGQVVMVF9JTkxJTkUgdG8gYmUgMi4KLQkoYWxsIC0tZW5hYmxlLXNpbS0qIHJ1bGVzKTogRWNobyBydWxlcyBzZXQgdG8gbm9uIGVtcHR5IHRvIGZpbGUKLQlkZXNjcmlwdG9yIDYuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIG9wdGlvbnMuYyAob3B0aW9uc19lbnYpOiBGaXggdHlwbyBpZiBXSVRIX0VOViBpcyAwLgotCShwcmludF9vcHRpb25zKTogUHJpbnQgR0NDIGNvbXBpbGVyIHZlcnNpb24gaWYgYXZhaWxhYmxlIGFuZAotCWRhdGUvdGltZSBvcHRpb25zIHdhcyBjb21waWxlZC4gIElmIE9QQ09ERV9SVUxFUywgSUdFTl9GTEFHUywKLQlhbmQvb3IgREdFTl9GTEFHUyBhcmUgZGVmaW5lZCwgcHJpbnQgdGhlbS4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCBsaW5rIGFjdGlvbnMpOiBQYXNzIFNJTV9DRkxBR1MgYXMgd2VsbCBhcwotCUNGTEFHUy4KLQkob3B0aW9ucy5vKTogQ29tcGlsZSBvcHRpb25zLm8gd2l0aCBPUENPREVfUlVMRVMsIElHRU5fRkxBR1MsIGFuZAotCURHRU5fRkxBR1MgZGVmaW5lZCwgc28gdGhleSBjYW4gYmUgcHJpbnRlZCBvdXQuCi0KLQkqIGlnZW4uYyAobGZfcHJpbnRfY192YWxpZGF0ZSk6IENoZWNrIGZvciBXSVRIX0FTU0VSVCwgc28gdGhhdAotCXRoaXMgdGVzdCBjYW4gYmUgY29tcGlsZWQgYXdheSBpZiB0aGUgdXNlciByZWFsbHkgd2FudHMgYSBmYXN0Ci0Jc2ltdWxhdG9yIGJ5IG5vdCBkb2luZyBhc3NlcnRpb24gZmFpbHVyZXMuCi0KLVdlZCBOb3YgIDggMTM6MTk6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvcHRpb25zLmM6IE5ldyBmaWxlIHRvIHByaW50IG91dCBhbGwgb2YgdGhlIFdJVEhfIG9wdGlvbnMuCi0JKiBvcHRpb25zLmg6IE5ldyBpbmNsdWRlIGZpbGUgdG8gZGVjbGFyZSBwcmludF9vcHRpb25zLgotCSogZGVidWcuaCAodHJhY2Vfb3B0aW9ucyk6IEFkZCB0cmFjZV9vcHRzIHRvIGNhbGwgcHJpbnRfb3B0aW9ucy4KLQkqIGRlYnVnLmMgKHRyYWNlX2Rlc2NyaXB0aW9uKTogQWRkIHRyYWNlX29wdHMgc3VwcG9ydC4KLQkqIG1haW4uYyAobWFpbik6IElmIHVzZXIgcmVxdWVzdGVkIG9wdGlvbnMsIHByaW50IHRoZW0uCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBEaXR0by4KLQkKLQkqIGlnZW4uYyAob3Bjb2RlX2ZpZWxkX25ldyk6IEFkZCB2b2lkIHRvIG1ha2UgaXQgYSBwcm9wZXIgcHJvdG90eXBlLgotCi0JKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9lbnRlcl9jYWxsKTogTWFrZSBwcmludGZfZmlsdGVyZWQgYXJndW1lbnRzCi0JdHlwZSBjb3JyZWN0LgotCSogZW11bF9uZXRic2QuYyAoZG9fa2lsbCk6IERpdHRvLgotCSogcmVnaXN0ZXJzLmMgKHJlZ2lzdGVyc19kdW1wKTogRGl0dG8uCi0JKiB2bS5jIChvbV90cmFuc2xhdGVfZWZmZWN0aXZlX3RvX3JlYWwpOiBEaXR0by4KLQkqIHZtX24uaCAodm1fZGF0YV9tYXBfcmVhZF9OKTogRGl0dG8uCi0JKHZtX2RhdGFfbWFwX3dyaXRlX04pOiBEaXR0by4KLQkqIGRldmljZXMuaCAoRFRSQUNFX0lOSVQpOiBEaXR0by4KLQkoRFRSQUNFX3tBVFRBQ0gsREVUQUNIfV9BRERSRVNTKTogRGl0dG8uCi0JKERUUkFDRV9JT197UkVBRCxXUklURX1fQlVGRkVSKTogRGl0dG8uCi0JKERUUkFDRV9ETUFfe1JFQUQsV1JJVEV9X0JVRkZFUik6IERpdHRvLgotCSogZGV2aWNlcy5jICh1cGRhdGVfZm9yX2JpbmFyeV9zZWN0aW9uKTogRGl0dG8uCi0JKHdyaXRlX3N0YWNrX2FyZ3VtZW50cyk6IERpdHRvLgotCShzdGFja19pb2N0bF9jYWxsYmFjayk6IERpdHRvLgotCSogZGV2aWNlX3RyZWUuYyAoZGV2aWNlX3RyZWVfYWRkX3Bhc3N0aHJvdWdoKTogRGl0dG8uCi0JKGRldmljZV90cmVlX3thZGQsZmluZH1fZGV2aWNlKTogRGl0dG8uCi0JKGRldmljZV90cmVlX3thZGQsZmluZH1faW50ZWdlcik6IERpdHRvLgotCShkZXZpY2VfdHJlZV9maW5kX3tzdHJpbmcsYm9vbGVhbn0pOiBEaXR0by4KLQkoZGV2aWNlX3RyZWVfaW5pdHssX2RldmljZX0pOiBEaXR0by4KLQkoZGV2aWNlX3RyZWVfZHVtcCk6IERpdHRvLgotCSogc2ltX2NhbGxzLmMgKHNpbV97cmVhZCx3cml0ZX0pOiBEaXR0by4KLQkoc2ltX3tmZXRjaCxzdG9yZX1fcmVnaXN0ZXIpOiBEaXR0by4KLQkoc2ltX3N0b3BfcmVhc29uKTogRGl0dG8uCi0KLQkqIHNpbV9jYWxsYmFja3MuaCAocHJpbnRmX2ZpbHRlcmVkKTogRGVjbGFyZSB3aXRoIGF0dHJpYnV0ZQotCXByaW50Ziwgc28gd2UgY2FuIGVuYWJsZSBmb3JtYXQgY2hlY2tzLgotCi0JKiBkZXZpY2VzLmMgKGNvbnNvbGVfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcl9jYWxsYmFjayk6IENhc3Qgc3d0aWNoCi0JYXJndW1lbnQgdG8gaW50LCBzaW5jZSBBTlNJIGRvZXNuJ3QgYWxsb3cgbG9uZyBzd2l0Y2ggdmFsdWVzLgotCSogZW11bF9uZXRic2QuYyAoZG9fX19zeXNjdGwpOiBEaXR0by4KLQotCSogZW11bF9uZXRic2QuYyAoZG9fX19zeXNjdGwpOiBGaXggdXAgcHJpbnRmIGNhbGwuCi0JCi0JKiBjb3JlZmlsZS5jIChjb3JlX3RyYW5zbGF0ZSk6IERvbid0IGRvIGFyaXRobWV0aWMgd2l0aCB2b2lkICoKLQlwb2ludGVycy4gIENhc3QgdG8gY2hhciAqIGZpcnN0LgotCQotCSogZnVuY3Rpb25fdW5pdC5jIChGVU5DX3tMT0FELFNUT1JFfSk6IFJlbmFtZSBmcm9tIHtMT0FELFNUT1JFfQotCWFuZCBjaGFuZ2UgYWxsIHVzZXMuCi0KLQkqIE1ha2VmaWxlLmluICh7RlVOQyxNT0RFTCxXQVJOSU5HfV9DRkxBR1MpOiBOZXcgZmxhZ3Mgc2V0IGJ5Ci0JY29uZmlndXJlIC0tZW5hYmxlIHN3aXRjaGVzLgotCShDT05GSUdfQ0ZMQUdTKTogSW5jbHVkZSBGVU5DX0NGTEFHUyBhbmQgTU9ERV9DRkxBR1MuCi0JKC5jLm8pOiBJbmNsdWRlIFdBUk5JTkdfQ0ZMQUdTLgotCShDUFVfSCk6IEluY2x1ZGUgZnVuY3Rpb25fdW5pdC5oLgotCShMSUJfT0JKKTogSW5jbHVkZSBmdW5jdGlvbl91bml0Lm8uCi0JKEJVSUxUX1NSQ19XT19DT05GSUcpOiBTcGxpdCBmcm9tIEJVSUxUX1NSQyBhbmQgZG8gbm90IGluY2x1ZGUKLQljb25maWcuaCBvciBwcGMtY29uZmlnLmguCi0JKEJVSUxUX1NSQyk6IEluY2x1ZGUgQlVJTFRfU1JDX1dPX0NPTkZJRywgY29uZmlnLmggYW5kCi0JcHBjLWNvbmZpZy5oLgotCShmaWx0ZXJfZmlsZW5hbWUubyk6IEluY2x1ZGUgY29uZmlnLmgvcHBjLWNvbmZpZy5oIGRlcGVuZGVuY2llcy4KLQkoaWRlY29kZS5vLCBzZW1hbnRpY3MubywgcHNpbS5vKTogU3BlY2lmeSBDQyBsaW5lIHdpdGhvdXQKLQlXQVJOSU5HX0NGTEFHUyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbGwgb2YgdGhlIHVudXNlZCB2YXJpYWJsZQotCXdhcm5pbmdzIHRoYXQgYXJlIGdlbmVyYXRlZC4KLQkoZnVuY3Rpb25fdW5pdC5vKTogQWRkIHJ1bGUgdG8gYnVpbGQuCi0JKG1haW4ubywgc2ltX2NhbGxzLm8pOiBBZGQgZnVuY3Rpb25fdW5pdC5oLCBpdGFibGUuaCBkZXBlbmRlbmNpZXMuCi0JKG1vbi5vKTogSW5jbHVkZSBtb24uYyBkZXBlbmRlbmN5LgotCShUQUdTKTogRGVwZW5kIG9uIEJVSUxUX1NSQy4KLQkoY2xlYW4pOiBEb24ndCBkZWxldGUgY29uZmlnLmggb3IgcHBjLWNvbmZpZy5oCi0KLQkqIGJhc2ljcy5oIChzaW1fY2FsbGJhY2tzLmgpOiBNb3ZlIGluY2x1ZGUgYWZ0ZXIgdGhlIGluY2x1ZGUgb2YKLQljb25maWcuaCBhbmQgcHBjLWNvbmZpZy5oLgotCi0JKiBiaXRzLntoLGN9IChST1RMMzIsUk9UTDY0KTogTW92ZSB0aGVzZSBmdW5jdGlvbnMgdG8gYml0cy5jLiAgQWRkCi0Jc3VwcG9ydCBmb3IgQklUU19JTkxJTkUgdG8gaW5saW5lIHRoZXNlLiAgQWRkIGRlY2xhcmF0aW9ucyB0bwotCWJpdHMuaC4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0td2FybmluZ3MpOiBBZGQgbmV3IG9wdGlvbiB0byBzcGVjaWZ5Ci0JY29tcGlsZXIgd2FybmluZ3MgZm9yIGFsbCBtb2R1bGVzIGV4Y2VwdCBpZGVjb2RlLm8gYW5kIHNlbWFudGljcy5vCi0Jd2hpY2ggaGF2ZSBsb3RzIG9mIHVudXNlZCB2YXJpYWJsZXMgYmVjYXVzZSB0aGV5IGFyZSBtYWNoaW5lCi0JZ2VuZXJhdGVkLgotCSgtLWVuYWJsZS1zaW0tZnVuY3Rpb24tdW5pdCk6IE5ldyBzd2l0Y2ggdG8gY29uZmlndXJlIHdoZXRoZXIKLQlmdW5jdGlvbiB1bml0IHN1cHBvcnQgaXMgY29tcGlsZWQgaW4gb3Igbm90LgotCSgtLWVuYWJsZS1zaW0teyxkZWZhdWx0LX1tb2RlKTogTmV3IHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2ggY3B1Ci0JbW9kZWwgaXMgdXNlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogY29yZWZpbGUuYyAoY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZSBkZXZpY2VfYWRkcmVzcy4KLQotCSogY3B1LmMgKHN0cnVjdCBfY3B1KTogQWRkIGZ1bmN0aW9uIHVuaXQgcG9pbnRlciBmaWVsZCBmdW5jX3VuaXQuCi0JKGNwdV9jcmVhdGUpOiBJZiBXSVRIX0ZVTkNUSU9OX1VOSVQsIGNhbGwgZnVuY3Rpb25fdW5pdF9jcmVhdGUuCi0JKGNwdV9pbml0KTogSWYgV0lUSF9GVU5DVElPTl9VTklULCBjYWxsIGZ1bmN0aW9uX3VuaXRfaW5pdC4KLQkoY3B1X2hhbHQpOiBJZiBXSVRIX0ZVTkNUSU9OX1VOSVQsIGNhbGwgZnVuY3Rpb25fdW5pdF9oYWx0LgotCShjcHVfZnVuY3Rpb25fdW5pdCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gZnVuY191bml0IGZpZWxkLgotCi0JKiBjcHUuaCAoZnVuY3Rpb25fdW5pdC5oKTogSW5jbHVkZSBuZXcgaW5jbHVkZSBmaWxlLgotCShjcHVfZnVuY3Rpb25fdW5pdCk6IERlY2xhcmUuCi0KLQkqIGRlYnVnLmMgKHN0ZGxpYi5oKTogVGVzdCBIQVZFX1NURExJQl9ILCBub3QgSEFWRV9TVERMSUIuCi0JKGNvbmZpZy5oKTogSW5jbHVkZSBjb25maWcuaC4KLQotCSogZGV2aWNlcy5jIChpY3VfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZQotCXN5c3RlbS4KLQotCSogZW11bF9nZW5lcmljLmMgKGVtdWxfZXhpdF9jYWxsKTogUHJpbnQgb3V0IHN0YXR1cyB2YWx1ZS4KLQotCSogZW11bF9uZXRic2QuYyAoZG9fcmVhZCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUgbnJfbW92ZWQuCi0KLQkqIGZpbHRlcl9maWxlbmFtZS5oIChpbmNsdWRlcyk6IEluY2x1ZGUgY29uZmlnLmgsIHBwYy1jb25maWcuaCwKLQlub3QgYmFzaWNzLmguCi0KLQkqIGlubGluZS5jOiBJbmNsdWRlIGJpdHMuYyBpZiBCSVRTX0lOTElORS4gIEluY2x1ZGUKLQlmdW5jdGlvbl91bml0LmMgaWYgRlVOQ1RJT05fVU5JVF9JTkxJTkUuCi0KLQkqIGlubGluZS5oIChJTkxJTkVfQklUUyk6IERlZmluZSBpZiBCSVRTX0lOTElORS4KLQkoSU5MSU5FX0ZVTkNUSU9OX1VOSVQpOiBEZWZpbmUgaWYgRlVOQ1RJT05fVU5JVF9JTkxJTkUuCi0KLQkqIGludGVycnVwdHMuYyAoaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGUgbmlhLgotCi0JKiBsZi5oIChjb25maWcuaCk6IEluY2x1ZGUgY29uZmlnLmguCi0KLQkqIG1haW4uYyAoaW5jbHVkZXMpOiBJbmNsdWRlIGZ1bmN0aW9uX3VuaXQuYy4gIElmIEhBVkVfVU5JU1REX0gsCi0JaW5jbHVkZSB1bmlzdGQuaC4KLQkodXNhZ2UpOiBVcGRhdGUgZm9yIC1tIG1vZGVsLCAtaSwgYW5kIC1JIG9wdGlvbnMuCi0JKG1haW4pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBzdGFja19wb2ludGVyIGFuZCBpLiAgQWRkIHN1cHBvcnQKLQlmb3IgLWksIC1tIG1vZGVsIGFyZ3VtZW50cy4gIENhbGwgcHNpbV9wcmludF9pbmZvIHdpdGggdmVyYm9zZSA9PQotCTEgaWYgLWksIGFuZCB2ZXJib3NlID09IDIgaWYgLUkuCi0KLQkqIG1vbi5jIChzdGRpby5oKTogSW5jbHVkZSBzdGRpby5oIHRvIHBpY2sgdXAgc3ByaW50ZiBwcm90b3R5cGUuCi0JKG1vbl9pc3N1ZSk6IENhbGwgZnVuY3Rpb25fdW5pdF9pc3N1ZSBpZiBmdW5jdGlvbiB1bml0cyBhcmUKLQlzdXBwb3J0ZWQuCi0JKG1vbl9wcmludF9pbmZvKTogVGFrZSBwc2ltICogYXJndW1lbnQuICBQcmludCBvdXQgaW5mb3JtYXRpb24KLQlmcm9tIGZ1bmN0aW9uX3VuaXQgaWYgYXZhaWxhYmxlLiAgTW92ZSByZWFkL3dyaXRlIHN0YXRzIHRvIGFsd2F5cwotCXByaW50LCBpbnN0ZWFkIG9mIHByaW50aW5nIGlmIHZlcmJvc2UgPiAxLiAgRml4IHVwIHBsdXJhbAotCXZzLiBzaW5ndWxhciB1c2FnZS4KLQotCSogbW9uLmggKG1vbl9wcmludF9pbmZvKTogVXBkYXRlIHByb3RvdHlwZS4KLQotCSogcHNpbS5jIChjdXJyZW50X3BwY19tb2RlbCk6IEFkZCBnbG9iYWwgdmFyaWFibGUuCi0JKHBzaW1fcHJpbnRfaW5mbyk6IFBhc3Mgc3lzdGVtIGFyZ3VtZW50IHRvIG1vbl9wcmludF9pbmZvLgotCi0JKiBzaW1fY2FsbHMuYyAoZnVuY3Rpb25fdW5pdC5oKTogSW5jbHVkZS4KLQkoc2ltX29wZW4pOiBBZGQgc3VwcG9ydCBmb3IgLWkgYW5kIC1tIG1vZGVsIG9wdGlvbnMuICBJZiAtaSBjYWxsCi0JcHNpbV9wcmludF9pbmZvIHdpdGggdmVyYm9zZSA9PSAxLCBpZiAtSSwgd2l0aCB2ZXJib3NlID09IDIuCi0JKHNpbV9yZXN1bWUpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlIHByb2dyYW1fY291bnRlci4KLQotCSogc3RkLWNvbmZpZy5oIChXSVRIX0ZVTkNUSU9OX1VOSVQpOiBEZWZpbmUuCi0JKHBwY19tb2RlbCk6IEFkZCBlbnVtZXJhdGlvbiBnaXZpbmcgYWxsIFBvd2VyUEMgbW9kZWxzIGN1cnJlbnRseQotCWtub3duIGFib3V0LgotCSh7V0lUSCxDVVJSRU5UfV9QUENfTU9ERUwpOiBEZWZpbmUuCi0JKEZVTkNUSU9OX1VOSVRfSU5MSU5FKTogRGVmaW5lLgotCi0JKiB0YWJsZS5jIChjb25maWcuaCk6IEluY2x1ZGUgY29uZmlnLmguCi0KLQkqIHZtLmMgKG9tX3ZpcnR1YWxfdG9fcmVhbCk6IFByaW50IHB0ZV93b3JkX3swLDF9IHNvIHRoZSBjb21waWxlcgotCWRvZXNuJ3QgY29tcGxhaW4gdGhhdCB0aGV5J3JlIHVudXNlZC4KLQotCSogdm1fbi5oICh2bV9kYXRhX21hcF9yZWFkX04pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlIHJ2YWwuCi0JCi1Nb24gTm92ICA2IDIzOjE1OjU0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzaW0tZW5kaWFuLmMgKHBwYy1lbmRpYW4uYyksIHNpbS1lbmRpYW4uaCAocHBjLWVuZGlhbi5oKToKLSAgICAgICAgcmVuYW1lZWQuICBUaGVzZSBmaWxlcyBhcmUgdGFyZ2V0IGluZGVwZW5kYW50LgotCSogTWFrZWZpbGUuaW4sIGJhc2ljcy5oOiB1cGRhdGUgZm9yIG5ldyBuYW1lLgotCi0JKiBzaW0tZW5kaWFuLmggKFNXQVBfTiksIHNpbS1lbmRpYW4uYyAoX1NXQVBfMSk6IFJlbmFtZSBleGlzdGluZwotICAgICAgICBTV0FQXzxOPiB0byBfU1dBUF88Tj4gc28gdGhhdCBzaW0tZW5kaWFuLmggY2FuIGNvbnRhaW4gU1dBUF9OCi0gICAgICAgIG1hY3JvJ3MgYXMgcmVxdWlyZWQuCi0KLQkqIHNpbS1lbmRpYW4uYywgc2ltLWVuZGlhbi1uLmggKG5ldyBmaWxlKTogTW92ZSBlbmRpYW4gY29kZSBpbnRvIGEKLSAgICAgICAgZGVidWdhYmxlIGhlYWRlciBmaWxlLgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChCeXRlLVJldmVyc2UpOiBFbmFibGUgYnl0ZSByZXZlcnNlCi0gICAgICAgIGluc3RydWN0aW9ucyB1c2luZyBTV0FQX04gbWFjcm9zLgotCi1Nb24gTm92ICA2IDEwOjM5OjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25maWcubWFrZQotCWFuZCBjb25maWcuaGRyLgotCi0JKiBjb25maWcue21ha2UsaGRyfTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KLQkqIGJ1aWxkLXBzaW06IERpdHRvLgotCi1Nb24gTm92ICA2IDIwOjQ5OjU2IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBGaXggcGFyc2luZyBvZiBgdGFyZ2V0IHNpbScgb3B0aW9ucy4KLQotCSogZGV2aWNlX3RyZWUuYyAoZGV2aWNlX3RyZWVfYWRkX3N0cmluZyk6IFdhc24ndCBzYXZpbmcgdGhlIHZhbHVlCi0gCW9mIHRoZSBzdHJpbmcgYmVpbmcgZW50ZXJlZCBpbnRvIHRoZSB0cmVlLgotCi0JKiBwc2ltLmMgKGNyZWF0ZV9maWxlZF9kZXZpY2VfdHJlZSk6IE5vdCB0ZXJtaW5hdGluZyBzdHJpbmcgZGV2aWNlCi0gCW5hbWVzIHdpdGggYSBudWxsLgotCQotCSogcHNpbS5jIChwc2ltX2NyZWF0ZSk6IFVzZSBgZW52JyBpbnN0ZWFkIG9mCi0gCWBlbnZpcm9ubWVudC1hcmNoaXRlY3R1cmUnIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBjb25maWd1cmUuCi0gIAlSZWNvbml6ZSB1c2VyL3VlYSwgdmlydHVhbC92ZWEgYW5kIG9wZXJhdGluZy9vZWEuCi0KLVNhdCBOb3YgIDQgMTI6Mjk6NDUgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYzogIFJlbmFtZSB0byBjb3JlZmlsZS5jCi0JKiBjb3JlLmg6ICBSZW5hbWUgdG8gY29yZWZpbGUuaAotCSogaW5saW5lLmM6IEluY2x1ZGUgY29yZWZpbGUuaCwgcmVuYW1lZCBmcm9tIGNvcmUuaC4KLQkqIGNwdS5oOiBJbmNsdWRlIGNvcmVmaWxlLmgsIHJlbmFtZWQgZnJvbSBjb3JlLmgKLQkqIHZtLmM6IEluY2x1ZGUgY29yZWZpbGUuaCwgcmVuYW1lZCBmcm9tIGNvcmUuaAotCSogY29yZWZpbGUuYzogSW5jbHVkZSBjb3JlZmlsZS5oIHJhdGhlciB0aGFuIGNvcmUuaAotCSogUkVBRE1FLnBzaW0gKEtOT1dOIFBST0JMRU1TKTogQ2hhbmdlIGNvcmUuKiByZWZlcmVuY2VzIHRvIGNvcmVmaWxlLioKLQlyZWZlcmVuY2VzLgotCSogTWFrZWZpbGUuaW4gKENQVV9IKTogQ2hhbmdlIGNvcmUuaCB0byBjb3JlZmlsZS5oCi0JKHZtLm8pOiAgQ2hhbmdlIGRlcGVuZGVuY3kgdG8gY29yZWZpbGUuaAotCShMSUJfU1JDKTogQ2hhbmdlIGNvcmUuYyB0byBjb3JlZmlsZS5jLgotCShMSUJfT0JKKTogQ2hhbmdlIGNvcmUubyB0byBjb3JlZmlsZS5vLgotCShjb3JlZmlsZS5vKTogIENoYW5nZSBkZXBlbmRlbmNpZXMgdG8gY29yZWZpbGUuYywgY29yZWZpbGUuaC4KLQotRnJpIE5vdiAgMyAxMTozNzoyNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKGRhdGEgY2FjaGUgaW5zdHJ1Y3Rpb25zKTogTWFrZSBhbGwgZGF0YSBjYWNoZQotCWluc3RydWN0aW9ucyBub3BzIGluc3RlYWQgb2YgaW52YWxpZCBpbnN0cnVjdGlvbnMuCi0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdfQ0ZMQUdTKTogQWRkIEFMSUdOTUVOVF9DRkxBR1MgYW5kCi0JVElNRUJBU0VfQ0ZMQUdTIHdoaWNoIHdlcmVuJ3QgaW5jbHVkZWQuCi0KLVRodSBOb3YgIDIgMDg6NTQ6MDQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVW5jb21tZW50IGJ1aWx0IGZpbGUgZGVwZW5kZW5jaWVzLgotCQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIC0tZW5hYmxlLXNpbSBzd2l0Y2ggaGFuZGxpbmcgdG8gdXNlIHRoZQotCWF1dG9jb25mIGJ1aWx0aW5zIHNvIGl0IHdvcmtzIGNvcnJlY3RseSBpZiB0aGUgY29uZmlndXJlIG9yCi0JTWFrZWZpbGUuaW4gZmlsZXMgYXJlIG1vZGlmaWVkIGFuZCBtYWtlIGRlY2lkZXMgdG8gcmVidWlsZAotCU1ha2VmaWxlLiAgQWxzbyBkb2N1bWVudCBhbGwgb2YgdGhlIC0tZW5hYmxlLXNpbSBzd2l0Y2hlcwotCXN1cHBvcnRlZC4gIENoZWNrIHdoZXRoZXIgZ2V0cnVzYWdlIGFuZCBzeXMvcmVzb3VyY2UuaCBhcmUKLQlzdXBwb3J0ZWQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1cHBvcnQgZm9yIGFsbCBvZiB0aGUgdmFyaWFibGVzIHNldCB3aXRoCi0JLS1lbmFibGUtc2ltIHN3aXRjaGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBtYWtlIGNsZWFuIG5vdyByZW1vdmVzIGFsbCBidWlsdCBzb3VyY2VzIGFzCi0Jd2VsbC4KLQkKLQkqIGNwdS5jOiBVc2UgSEFWRV9TVFJJTkdfSCwgSEFWRV9TVFJJTkdTX0gsIEhBVkVfVU5JU1REX0gsCi0JSEFWRV9USU1FX0gsIEhBVkVfU1lTX1RJTUVTX0gsIEhBVkVfU1lTX1JFU09VUkNFX0ggZGVmaW5lZCBpbgotCXRoZSBnZW5lcmF0ZWQgY29uZmlnLmguCi0JKiBkZWJ1Zy5jOiBEaXR0by4KLQkqIGRldmljZV90cmVlLmM6IERpdHRvLgotCSogZGV2aWNlcy5jOiBEaXR0by4KLQkqIGRnZW4uYzogRGl0dG8uCi0JKiBlbXVsX25ldGJzZC5jOiBEaXR0by4KLQkqIGlnZW4uYzogRGl0dG8uCi0JKiBsZi5jOiBEaXR0by4KLQkqIG1pc2MuYzogRGl0dG8uCi0JKiBwc2ltLmM6IERpdHRvLgotCSogcmVnaXN0ZXJzLmM6IERpdHRvLgotCSogc2ltX2NhbGxzLmM6IERpdHQuCi0JKiB0YWJsZS5jOiBEaXR0by4KLQotCi0JKiBtYWluLmMgKG1haW4pOiBDYWxsIHBzaW1fcHJpbnRfaW5mbyB3aXRoIHZlcmJvc2UgPT0gMi4KLQotCSogbW9uLmMgKG1vbl9wcmludF9pbmZvKTogQWxpZ24gdGhlIGNwdSBudW1iZXIgYW5kIG51bWJlciBvZgotCWluc3RydWN0aW9ucyBmaWVsZHMuICBEbyBub3QgcHJpbnQgYW4gaW5zdHJ1Y3Rpb24gY2F0ZWdvcnkgaWYgdGhlCi0JQ1BVIGRpZCBub3QgZXhlY3V0ZSBhbnkgb2YgdGhvc2UgaW5zdHJ1Y3Rpb25zLiAgUHJpbnQgb3V0IG51bWJlcgotCW9mIHJlYWRzIGFuZCB3cml0ZXMuICBJZiBnZXRydXNhZ2UgaXMgc3VwcG9ydGVkLCBwcmludCBvdXQgbnVtYmVyCi0Jb2Ygc2ltdWxhdGVkIGluc3RydWN0aW5zIHBlciBzZWNvbmQuCi0JCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciAtLWVuYWJsZS1zaW0tb3Bjb2RlPXN0dXBpZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgMSAyMzo0Njo1OSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHN0ZC1jb25maWcgKElOTElORV9ERVZJQ0VfVFJFRSk6IERvbid0IGlubGluZSBlaXRoZXIgb2YKLSAgICAgICAgZGV2aWNlX3RyZWUuYyBvciBkZXZpY2VzLmMuICBUaGVyZSBpcyBubyBzaWduaWZpY2FudCBnYWluLgotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBhZGQgLS1lbmFibGUtc2ltLWljYWNoZT1bMC05XSogYW5kCi0gCUlHRU5fSUNBQ0hFIG1hY3JvLgotCQotV2VkIE5vdiAgMSAyMzo0Njo1OSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGlnZW4uYyAobWFpbiksIG1pc2MuaCAodGFyZ2V0X2EyaSwgaTJ0YXJnZXQpLCBtaXNjLmM6IEFkZAotICAgICAgICBmdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIHRhcmdldCBhbmQgaWdlbiBpbnRlcm5hbCBiaXQgbnVtYmVycy4KLSAgICAgICAgTWFrZSBJTyBnbyB0aHJvdWdoIHRoZXNlIGZ1bmN0aW9ucy4gQWRkIC1iIChiaXQgc2l6ZSkgYW5kIC1oIChoaWdoCi0gICAgICAgIGJpdCBucikgb3B0aW9ucyB0byBpZ2VuLiAgVHlwaWNhbCB1c2FnZSB3b3VsZCBiZTogLi9pZ2VuIC1iIDE2IC1oCi0gICAgICAgIDE1IGZvciBhIDE2IGJpdCBpbnN0cnVjdGlvbiBmb3JtYXQgd2l0aCB0aGUgbXNiIGdpdmVuIGEgbnVtYmVyIDE1LgotCi1XZWQgTm92ICAxIDIyOjE3OjMyIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGdlbi5jIChtYWluKTogV2FzIG91dHB1dHRpbmcgb3B0YXJnIGV2ZW4gd2hlbiBpdCB3YXMgTlVMTC4KLQotVHVlIE9jdCAzMSAyMzo0ODozMyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHZtX24uaCAodm1fZGF0YV9tYXBfbG9hZF9OLCB2bV9kYXRhX21hcF9zdG9yZV9uKSwgZGVidWcuaCwKLSAgICAgICAgZGVidWcuYzogQWRkIHRyYWNpbmcgb2YgbG9hZC9zdG9yZSB1bml0ICh2aXJ0dWFsKSB3aXRoIC10Ci0gICAgICAgIGxvYWQtc3RvcmUuCi0KLVR1ZSBPY3QgMzEgMjE6NDQ6MDEgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogc3RkLWNvbmZpZy5oIChXSVRIX0VOVklST05NRU5UKTogQWRkIFVTRVJfRU5WSVJPTk1FTlQgd2hpY2ggZG9lcwotICAgICAgICBub3QgaW5jbHVkZSB0aGluZ3Mgc3VjaCBhcyB0aGUgdGltZSBiYXNlIGFuZCBldmVudHMuCi0KLQkqIGludGVycnVwdC5jLCBzaW1fY2FsbHMuYywgY3B1LmgsIHZtLmMsIGNvbmZpZ3VyZS5pbjogQWRkIFVFQSB0bwotIAlhbGwgZW52aXJvbm1lbnQgc3dpdGNoZXMgZm9yIGFib3ZlLgotCi0JKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogZGl0dG8gLSBuZXcgZGV2aWNlIHRyZWUgbm9kZSBuYW1lIGlzCi0gICAgICAgIC9vcHRpb25zL2Vudmlyb25tZW50LWFyY2hpdGVjdHVyZSB3aXRoIHZhbHVlcyB1c2VyLCB2aXJ0dWFsIGFuZAotICAgICAgICBvcGVyYXRpbmcuCi0KLVR1ZSBPY3QgMzEgMjE6MzE6MzIgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBwcGMtb3Bjb2RlLXN0dXBpZDogVGhpcmQgZXhhbXBsZSBvZiB1c2Ugb2Ygb3Bjb2RlIHRhYmxlIC0gdGhpcwotICAgICAgICBvbmUgZXhwYW5kcyBhbGwgbXRzcHIvbWZzcHIgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuICBBcHBlYXJzIHRvCi0gICAgICAgIGdpdmUgYWJvdXQgYSAxMCUgZ2FpbiBpbiBwZXJmb3JtYW5jZSBpZiBldmVyeXRoaW5nIGVuYWJsZWQuICBBbHNvCi0gICAgICAgIHRha2VzIGFib3V0IDE1MG1iIG9mIHN3YXAgdG8gYnVpbGQuCi0KLVdlZCBOb3YgIDEgMTA6NDk6NDggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbXVsX25ldGJzZC5jIChkb19leGl0KTogUHJpbnQgYXJndW1lbnRzIGFuZCBjbG9zZSBwYXJlbnRoZXNpcwotCWlmIHRyYWNpbmcsIHNpbmNlIGV4aXQgZG9lc24ndCBnbyB0aHJvdWdoIGVtdWxfZXhpdF9jYWxsLgotCShkb19yZWFkKTogUHJpbnQgYXJndW1lbnRzIGlmIHRyYWNpbmcuCi0JKGRvX3dyaXRlKTogRGl0dG8uCi0JKGRvX29wZW4pOiBEaXR0by4KLQkoZG9fYnJlYWspOiBEaXR0by4KLQkoZG9fa2lsbCk6IERpdHRvLgotCShkb19kdXApOiBEaXR0by4KLQkoZG9fc2lncHJvY21hc2spOiBSZXBsYWNlIHRyYWNlIHdpdGggcHJpbnRpbmcgYXJndW1lbnRzIGlmCi0JdHJhY2luZy4KLQkoZG9faW9jdGwpOiBQcmludCBhcmd1bWVudHMgaWYgdHJhY2luZy4KLQkoZG9fdW1hc2spOiBEaXR0by4KLQkoZG9fZHVwMik6IERpdHRvLgotCShkb19mY250bCk6IERpdHRvLgotCShkb19nZXR0aW1lb2ZkYXkpOiBEaXR0by4KLQkoZG9fZ2V0cnVzYWdlKTogRGl0dG8uCi0JKGRvX2ZzdGF0ZnMpOiBEaXR0by4KLQotCSogZmlsdGVyX2ZpbGVuYW1lLmM6IE5ldyBmaWxlIHRvIHByb3ZpZGUgZmlsdGVyX2ZpbGVuYW1lIHRvIHN0cmlwCi0JdGhlIGRpcmVjdG9yeSBwcmVmaXggZnJvbSBhIGZpbGUuCi0JKiBmaWx0ZXJfZmlsZW5hbWUuaDogTmV3IGluY2x1ZGUgZmlsZSB0byBkZWNsYXJlIGZpbHRlcl9maWxlbmFtZS4KLQotCSogZGVidWcuaDogSW5jbHVkZSBmaWx0ZXJfZmlsZW5hbWUuaC4KLQkoVFJBQ0UsRFRSQUNFLEVSUk9SKTogVXNlIGZpbHRlcl9maWxlbmFtZSBvbiBfX0ZJTEVfXy4KLQotCSogbWlzYy5oOiBJbmNsdWRlIGZpbHRlcl9maWxlbmFtZS5oLgotIAkoQVNTRVJUKTogVXNlIGZpbHRlcl9maWxlbmFtZSBvbiBfX0ZJTEVfXy4KLQotCSogaWdlbi5jIChsZl9wcmludF9teV9wcmVmaXgpOiBVc2UgZmlsdGVyX2ZpbGVuYW1lIG9uIHRoZSBmaWxlbmFtZQotCWFyZ3VtZW50LgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGZpbHRlcl9maWxlbmFtZSBzdXBwb3J0LgotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zIChkY2JpLCBpY2JpKTogTWFrZSB0aGVzZSBOT1BzIHJhdGhlciB0aGFuCi0JaW52YWxpZCBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIG1vcmUgLS1lbmFibGUtc2ltLSogc3dpdGNoZXMuCi0JVXNlIGNvbmZpZy5tYWtlIGFuZCBjb25maWcuaGRyIHRvIHdyaXRlIHRvIE1ha2VmaWxlIGFuZCBjb25maWcuaAotCXJlc3BlY3RpdmVseS4gIERvbid0IHJld3JpdGUgTWFrZWZpbGUsIGp1c3QgYXBwZW5kIHRvIGl0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnLnttYWtlLGhkcn06IE5ldyBzaGVsbCBzY3JpcHRzLgotCQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBhbGwgdmFyaWFibGVzIHNldCBieSBjb25maWd1cmUuaW4uCi0JKHBzaW0ubyk6IERlcGVuZCBvbiAkKEJVSUxUX1NSQykgYWxzby4KLQotCSogZW11bF9uZXRic2QuYyAoZG9fZ2V0dGltZW9mZGF5LGRvX2dldHJ1c2FnZSk6IFdoZW4gY29tcGFyaW5nIGFuCi0JaW50ZWdlciwgdXNlIDAsIG5vdCBOVUxMLgotCi1UdWUgT2N0IDMxIDE1OjIwOjA0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgLS1lbmFibGUtc2ltLWlubGluZSwKLQktLWVuYWJsZS1zaW0tYnN3YXAsIC0tZW5hYmxlLXNpbS1jZmxhZ3MsIC0tZW5hYmxlLXNpbS1jb21wbGV4LAotCS0tZW5hYmxlLXNpbS1zd2l0Y2gsIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUsIC0tZW5hYmxlLXNpbS1maWx0ZXIsCi0JYW5kIC0tZW5hYmxlLXNpbS1lbmRpYW4gc3dpdGNoIHRvIGNvbnRyb2wgdmFyaW91cyBNYWtlZmlsZQotCXZhcmlhYmxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSBmcm9tIGNvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgdmFyaW91cyBNYWtlIHZhcmlhYmxlcyB0aGF0IHRoZSB2YXJpb3VzCi0Jc3dpdGNoZXMgYWx0ZXIuCi0KLQkqIHN0ZC1jb25maWcuaCAoREVGQVVMVF9JTkxJTkUpOiBEb24ndCBzZXQgdGhpcyB0byAyIGlmIHVzaW5nIEdDQwotCWFuZCBvcHRpbWl6aW5nIGJ5IGRlZmF1bHQuCi0KLUZyaSBPY3QgMjcgMTk6MjY6MjcgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGJpdHMuaCAoUk9UTDMyLCBST1RMNjQpOiBXZXJlIGZ1bmN0aW9ucywgbWFkZSB0aGVtIG1hY3Jvcywgbm93Ci0gCW1ha2UgdGhlbSBmdW5jdGlvbnMgYWdhaW4uICBBcHBlYXJzIDIuNi4zIGlzIGNvbmZ1c2VkIGJ5IGp1c3QgYQotIAltYWNyby4KLQotVGh1IE9jdCAyNiAxODozMTo1OCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHBjLWVuZGlhbi5jIChTV0FQXzgpOiBGaXggOCBieXRlIHN3YXAhCi0KLQkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBOb3QgY29ycmVjdGx5IGNoZWNraW5nIHRoYXQgcnVudGltZQotIAljb25maWd1cmF0aW9uIG9mIHRoaW5ncyBsaWtlIEVORElBTiwgRU5WSVJPTk1FTlQgYW5kIEFMSUdOTUVOVAotIAltYXRjaGVkIHRoZSBjb21waWxlZCBpbiBvbmVzLgotCi0JKiBkZWJ1Zy5oIChJVFJBQ0UpLCBpZ2VuLmM6IFRpZHkgdXAgbW9yZSB0cmFjaW5nIGZsYWdzIC0KLSAJdHJhY2Vfc2VtYW50aWNzIGlzIG5vdyBkaWZmZXJlbnQgdG8gdHJhY2VfaWRlY29kZSwgdGhlIGZvcm1lcgotIAljaGVja3MgdGhlIGNhY2hlLgotCQotVHVlIE9jdCAyNCAyMTo1NDoxMyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHBjLWluc3RydWN0aW9ucyAobXRzcmluKTogTWlzc2luZyBpbnN0cnVjdGlvbgotCSogcHBjLWluc3RydWN0aW9ucyAobWZzcmluKTogTWlzc2luZyBpbnN0cnVjdGlvbgotCSogcHBjLWluc3RydWN0aW9ucyAoZWllaW8pOiBNaXNzaW5nIGluc3RydWN0aW9uCi0KLVR1ZSBPY3QgMjQgMjA6NTU6MjkgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGJ1aWxkLXBzaW06IE5ldyBzaGVsbCBzY3JpcHQgLSBzZWUgaW50ZXJuYWxzIGZvciB1c2FnZSwKLSAJc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBjdXN0b20gc2ltdWxhdG9ycy4KLQotTW9uIE9jdCAyMyAyMzo0ODo1OSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogc3RkLWNvbmZpZy5oIChTRU1BTlRJQ1NfSU5MSU5FKTogVGlkeSB1cCBub3RlcyBvbiBlYWNoIG9mIHRoZQotICAgICAgICBJTkxJTkUgbWFjcm9zLiAgTWFrZSBTRU1BTlRJQ1NfSU5MSU5FID09IDEgaWYgREVGQVVMVF9JTkxJTkUgPT0gMi4KLSAgICAgICAgRG9uJ3QgdXNlIERFRkFVTFRfSU5MSU5FIHRvIGRlZmluZSBSRUdJU1RFUlNfSU5MSU5FIERFVklDRVNfSU5MSU5FCi0gICAgICAgIERFVklDRV9UUkVFX0lOTElORSBvciBJTlRFUlJVUFRTX0lOTElORSBhcyBub25lIG9mIHRoZXNlIGFyZSBvbgotICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gb3IgZGF0YSBjcml0aWNhbCBwYXRocy4KLSAgCQotCSogRklYTUU6IGRldmljZXMuYy9lbXVsX25ldGJzZC5jIHdvdWxkIGJlbmVmaXQgKHNsaWdodGx5KSBmcm9tCi0gCXRoZSBpbmNsdXNpb24gb2YgZGV2aWNlX3RyZWUuYy9lbXVsX2dlbmVyaWMuYy4KLQotTW9uIE9jdCAyMyAwMDozMTo1MCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogb3NfZW11bC5baGNdLCBlbXVsX2dlbmVyaWMuW2hjXSwgZW11bF9uZXRic2QuW2hjXTogcmVwbGFjZQotICAgICAgICBzeXN0ZW0uW2hjXS4gIFN0YXJ0IG9mIHN1cG9ydCBmb3IgbXVsdGlwbGUgZW11bGF0aW9ucyBhbmQKLSAgICAgICAgZW11bGF0aW9uIHN0YXRlIChvc19lbXVsIG9iamVjdCkuCi0KLQkqIGVtdWxfZ2VuZXJpYy5baGNdOiBTdGFydCBvZiBjb2RlIHRvIGltcGxlbWVudCBwcm9wZXIgc3lzdGVtIGNhbGwKLQl0cmFjaW5nIChmcm9tIHNweSkuCi0KLVN1biBPY3QgMjIgMjE6MzM6NTEgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNwdS5oLCBjcHUuYyAoY3B1X2luaXQpOiBOZXcgZnVuY3Rpb24sIHplcm8gdGhlIHJlZ2lzdGVycyBiZWZvcmUKLSAgICAgICAgdGhlIHByb2Nlc3NvciBpcyBzdGFydGVkLiBGaXhlcyBwcm9ibGVtIG9mIHJlZ2lzdGVycyBiZWluZwotICAgICAgICB1bmRlZmluZWQgd2hlbiByZXN0YXJ0aW5nIGZyb20gd2l0aGluIGdkYi4KLQotCSogY3B1LmgsIGNwdS5jIChjcHVfZmx1c2hfaWNhY2hlKTogTmV3IGZ1bmN0aW9uLCBmbHVzaGVzIHRoZQotICAgICAgICBpbnN0cnVjdGlvbiBjYWNoZSAoaWYgcHJlc2VudCkuICBGaXhlcyBwcm9ibGVtIG9mIGNwdSBjYWNoaW5nIGdkYgotICAgICAgICBicmVha3BvaW50IGluc3RydWN0aW9ucy4KLQotCUZJWE1FOiBQU0lNIHNvbWV0aW1lcyBhYm9ydHMgY2FsbGluZyBlcnJvcigpLCBpdCBzaG91bGQgaW5zdGVhZAotIAljYWxsIHNpbV9lcnJvcigpIHNheSB3aGljaCB0YWtlcyBjYXJlIG9mIGhvdXNla2VlcGluZyBzdWNoIGFzCi0gCXNhdmluZyB0aGUgQ0lBIGJlZm9yZSBjYWxsaW5nIGVycm9yLgotCQotCSogTk9URTogY3B1X2ZsdXNoX2NhY2hlKCkgaW5zdGVhZCBvZiBjcHVfc3luY2hyb25pemVfY29udGV4dCgpIGlzCi0gCXVzZWQgd2hlbiByZXN0YXJ0aW5nIGEgc2ltdWxhdGlvbiBiZWNhdXNlIHRoZSBsYXR0ZXIgaGFzIHRoZQotIAl1bndhbnRlZCBzaWRlIGVmZmVjdCAod2VsbCBJIGFzIGEga2VybmVsIGhhY2tlciB0aGluayBpdCBpcykgb2YKLSAJcGVyZm9ybWluZyBhbiBpc3luYyB3aGVuIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gZG9lc24ndCBjb250YWluCi0gCW9uZS4KLQotU3VuIE9jdCAyMiAxOToyNzo0OCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogbW9uLmggKG5ldyksIG1vbi5jIChuZXcpLCBzdGQtY29uZmlnLmggKFdJVEhfTU9OKTogUGVyZm9ybWFuY2UKLSAgICAgICAgbW9uaXRvcmluZyBtb2R1bGUuIENvdW50cyBib3RoIGluc3RydWN0aW9ucyBpc3N1ZWQgYW5kCi0gICAgICAgIGxvYWQvc3RvcmVzLgotCi0JKiBOT1RFOiBtb24gZG9lcyBub3QgY29udGFpbiB0byBjb3VudCBpbnN0cnVjdGlvbiBsb2FkcyBhcyB0aGlzCi0gCWluZm9ybWF0aW9uIGlzIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gdGhlIG1vbl9pc3N1ZSgpIGhvb2suCi0KLQkqIGlnZW4uYyAobGZfcHJpbnRfY19zZW1hbnRpYyksIHZtX24uaDogQWRkIGNvdW50aW5nIGNvZGUuCi0KLQkqIHBzaW0uaCwgcHNpbS5jIChwc2ltX2NyZWF0ZSksIGNwdS5oLCBjcHUuYyAoY3B1X2NyZWF0ZSk6IEF0dGFjaAotICAgICAgICBhIGNvbW1vbiBtb25pdG9yIHRvIGVhY2ggb2YgdGhlIGNwdXMuIERlbGV0ZQotICAgICAgICBjcHVfaW5jcmVtZW50X251bWJlcl9vZl9pbnNucygpIGFuZCBjcHVfZ2V0X251bWJlcl9vZl9pbnNucygpCi0gICAgICAgIHJlcGxhY2VkIGJ5IGNvcGllZCBjb2RlIGluIG1vbi5baGNdLgotCi1TdW4gT2N0IDIyIDE4OjQyOjQ1IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzaW1fY2FsbHMuYywgbWFpbi5jLCBwc2ltLmMgKHBzaW1fY3JlYXRlKTogYWx3YXlzIGNyZWF0ZQotICAgICAgICBgV0lUSF9TTVAnIGNwdXMuICBUaGUgYWN0dWFsIG51bWJlciBvZiBDUFUncyBhY3RpdmUgaW4gYQotICAgICAgICBzaW11bGF0aW9uIHJ1biBpcyB0YWtlbiBmcm9tIHRoZSBkZXZpY2Ugbm9kZTogL2luaXQvc21wIChhbgotICAgICAgICBpbnRlZ2VyKS4gV0lUSF9TTVAgY2hhbmdlZCB0byAyIChyZW1lbWJlciB0byBwdXQgaXQgYmFjayB0byAwKS4KLQotRnJpIE9jdCAyMCAxNzoyNjo1NCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogc3lzdGVtLmM6IE1vcmUgc3lzdGVtIGNhbGwgZW11bGF0aW9uLiAgSWYgY29kZSBhcHBlYXJzIE5ldEJTRAotIAlzcGVjaWZpYywgbWFrZSBjb25kaXRpb25hbCB0byBiZWluZyBjb21waWxlZCBvbiBhIE5ldEJTRCBzeXN0ZW0KLSAJKHNpZ2gpLgotCi1XZWQgT2N0IDE4IDIzOjAyOjIwIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCQotCSogTWFrZWZpbGUuaW4sIGdlbi5jKGRlbGV0ZSksIGlnZW4uYyhuZXcpLCBkZ2VuLmMobmV3KSwKLSAJbGYuW2NoXShuZXcpLCB0YWJsZS5bY2hdKG5ldyk6IFNwbGl0IGludG8gdHdvIGdlbmVyYXRvcnMgLSBpZ2VuCi0gCXRoYXQgb3V0cHV0cyB0aGUgaW5zdHJ1Y3Rpb24gdGFibGVzIGFuZCBkZ2VuIHRoYXQgb3V0cHV0cyB0aGUgc3ByCi0gCXRhYmxlcy4gIEFkZCAtZiAoZmlsdGVyIG91dCkgZmxhZyB0byBpZ2VuIHRvIGZpbHRlciBvdXQgY2VydGFpbgotIAlpbnN0cnVjdGlvbnMgKGV4IDY0IGJpdCBvbmVzKSBmcm9tIHRoZSBjcmVhdGVkIHRhYmxlcy4gIEluY2x1ZGUKLSAJJChMSUJJQkVSVFlfTElCKSBpbiBsaW5rIG9wdGlvbnMgaW4gY2FzZSBob3N0IGxhY2tzIHNvbWUgbGliYwotIAlmdW5jdGlvbnMuCi0KLQkqIE5PVEU6IGlnZW4sIHNpbmNlIGl0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZQotIAlQb3dlclBDL1JTNjAwMCwgdGhpbmdzIHRoZSBNU0IgaXMgMCBhbmQgdGhlIExTQiBpcyA2M3szMX0uCi0JCi0JKiBNYWtlZmlsZS5pbiwgc3RkLWNvbmZpZy5oLCBwcGMtY2FjaGUtcnVsZXMobmV3KSwKLSAJcHBjLW9wY29kZS1jb21wbGV4KG5ldyksIHBwYy1vcGNvZGUtc2ltcGxlKG5ldyk6IChmb3IgaWdlbikgQ3JlYXRlCi0gCWNhY2hlLXJ1bGUgYW5kIG9wY29kZS1ydWxlIHRhYmxlcyBmcm9tIG1hY3JvcyBmb3VuZCBzdGQtY29uZmlnLmguCi0gCURlbGV0ZSBjb3JyZXNwb25kaW5nIG1hY3JvJ3MgZnJvbSBzdGQtY29uZmlnLmguCi0gIAkKLQkqIGlnZW4uYyAoZ2VuX2l0YWJsZV9jLCBnZW5faXRhYmxlX2gpLCBNYWtlZmlsZS5pbjogY29kZSB0byBvdXRwdXQKLSAJYW4gdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMuICBDb2RlIHRvIG91dHB1dCBhIHR5cGUKLSAJZW51bWVyYXRpbmcgYWxsIHRoZSBpbnN0cnVjdGluIG5hbWVzLgotCi0JKiBpZ2VuLmMobGZfcHJpbnRfY19zZW1hbnRpYyk6IE1vdmUgY2FsbCB0byBpbmNyZW1lbnQgaW5zdHJ1Y3Rpb24KLSAJY291bnRlciBzbyB0aGF0IGl0IG9jY3VyZXMgX2FmdGVyXyB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZnVsbHkKLSAJdmFsaWRhdGVkLCB3YXMgZG91YmxlIGNvdW50aW5nIGlsbGVnYWwvaW52YWxpZCBpbnN0cnVjdGlvbnMuICBBZGQKLSAJY29uZGl0aW9uYWwgc28gb25seSBjb21waWxlZCBpbiB3aGVuIFdJVEhfUFJPRklMRSBlbmFibGVkIChlbmFibGVkCi0gCWJ5IGRlZmF1bHQpLgotCQotCSogaWdlbi5jLCBjcHUuaCwgY3B1LmMoY3B1X2luY3JlbWVudF9udW1iZXJfb2ZfaW5zbnMpOiBJbmNsdWRlCi0gCWl0YWJsZS5oLCBjb3VudCBpbmRpdmlkdWFsIGluc3RydWN0aW9uIHR5cGVzIG5vdCBqdXN0IHRvdGFsLAotIAlhZGp1c3QgcmVwb3J0aW5nIGZ1bmN0aW9ucyB0byBvdXRwdXQgdGhpcy4KLQkKLQkqIHBwYy1pbnN0cnVjdGlvbnMgKDY0IGJpdCBMb2FkIERvdWJsZXdvcmQgd2l0aCBVcGRhdGUgSW5kZXhlZCk6Ci0gCUhhZCAzMi4vIGluc3RlYWQgb2YgMzEuLwotCi0JKiBwcGMtaW5zdHJ1Y3Rpb25zICg2NCBiaXQgU3RvcmUgRG91YmxlIFdvcmQgQ29uZGl0aW9uYWwgSW5kZXhlZCk6Ci0gCWJpdHJvdCAtIHVwZGF0ZWQgdG8gdXNlIG5ld2VyIENSIHJlZ2lzdGVyIG9wZXJhdG9ycy4KLQotCSogcHBjLWluc3RydWN0aW9ucyAoNjRiaXQgRmxvYXRpbmcgQ29udmVydCBmcm9tIEludGVnZXIKLSAJRG91Ymxld29yZCk6IENvcnJlY3QgY2FsbCB0byBSb3VuZF9GbG9hdCgpLgotCi1Nb24gT2N0IDE2IDAwOjMxOjIwIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBiYXNpY3MuaDogI2luY2x1ZGUgInNpbV9jYWxsYmFja3MuaCIgZWFybGllciBzbyB0aGF0IGl0cwotIAlwcm90b3R5cGVzIGFyZSBkZWNsYXJlZCBpbiBhbGwgb3RoZXIgaGVhZGVyIGZpbGVzLgotCi0JKiBiaXRzLmgsIGJpdHMuYywgaWRlY29kZV9leHByZXNzaW9uLmggKFJPVEwzMiwgUk9UTDY0KTogVXBkYXRlCi0gCWRvYyBpbiBiaXRzLmgsIHJlbW92ZSBkZWFkIGNvZGUgaW4gYml0cy5jLCBtb3ZlIFJPVEwzMi9ST1RMNjQgaW50bwotIAliaXRzLmguCi0KLQkqIGNwdS5jKGNwdV9hZGRfY29tbWFzKSwgZGV2aWNlX3RyZWUuaCwgZGV2aWNlX3RyZWUuYyhzY2FuZF8qKToKLSAJQWRkIHNpemUgb2YgYnVmZmVyIGFyZ3VtZW50IHRvIGZ1bmN0aW9ucyB3cml0aW5nIGEgc3RyaW5nIGludG8gYQotIAlidWZmZXIuICBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93LgotCQotU3VuIE9jdCAxNSAyMjoxNjoxMSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlcy5oLCBkZXZpY2VzLmMsIGRlYnVnLmgsIGRlYnVnLmM6IGFkZCBtYWNybydzIGZvciB0cmFjaW5nCi0gICAgICAgIG9mIGVhY2ggZGV2aWNlLiAgTWFrZSBwYXJhbWV0ZXIgbmFtZXMgY29uc2lzdGVudCBzbyBtYWNyb3Mgd29yay4KLSAgICAgICAgVXNlIG1hY3JvJ3MgaW4gZGV2aWNlIGZ1bmN0aW9ucy4KLQotCSogZGV2aWNlX3RyZWUuYywgZGV2aWNlcy5oLCBkZXZpY2VzLmM6IGluY2x1ZGUgcGF0aCB0byBkZXZpY2UgaW4gYQotICAgICAgICBkZXZpY2VzIG5vZGUgd2hlbiBjcmVhdGluZyBpdC4KLQotCSogZGV2aWNlX3RyZWUuYywgZGVidWcuaCwgZGVidWcuYzogQWRkIHRyYWNpbmcgb2YgYGRldmljZS10cmVlJy4KLQotCSogY29yZS5jOiBhZGQgdHJhY2luZyBvZiBjb3JlLWRldmljZSwgYWRqdXN0IHBhcmFtZXRlciBuYW1lcyBpbgotIAljb3JlIGZ1bmN0aW9ucyB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhvc2UgaW4gZGV2aWNlcyouCi0KLVN1biBPY3QgMTUgMjA6MzM6MjAgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICAgICAgKiBkZWJ1Zy5oLCBkZWJ1Zy5jICh0cmFjZV9vcHRpb24pOiBOZXcgZnVuY3Rpb24uIFBhcnNlcyB0aGUgdHJhY2UKLSAgICAgICAgb3B0aW9uLCB1cGRhdGluZyB0aGUgdHJhY2UgYXJyYXkuCi0KLQkqIGRlYnVnLmgsIGRlYnVnLmMgKHRyYWNlX3VzYWdlKTogTmV3IGZ1bmN0aW9uLiBPdXRwdXRzIHRoZSBsaXN0Ci0gICAgICAgIG9mIGFsbCBwb3NzaWJsZSB0cmFjZSBvcHRpb25zLgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pLCBtYWluLmMgKG1haW4pOiBVc2UgbmV3IHRyYWNlX29wdGlvbigpIHRvCi0gCXBhcnNlIHRyYWNlIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggdGhlIHNpbXBsZXIgLXQgZmxhZy4gIEFkanVzdAotIAl1c2FnZS4KLQotCSogRklYTUU6IGJhc2ljIHBhcnNpbmcgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgaXMgc3RpbGwgZHVwbGljYXRlZAotIAlieSBtYWluLmMgYW5kIHNpbV9jYWxscy5jCi0KLVRodSBPY3QgMjYgMTA6NDI6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBEZWxldGUgKi5pIGFuZCAqLm91dCBmaWxlcy4KLQotCSogcHBjLWVuZGlhbi5jIChTV0FQX24pOiBBZGQgU0VUIGFyZ3VtZW50IHRvIGFsbG93IHVzZSBvZiBTV0FQCi0JbWFjcm9zIGZvciBlaXRoZXIgYXNzaWdubWVudCBvciByZXR1cm4uICBGaXggU1dBUF84IHRvIHVzZSBhCi0JdW5pb24sIGFuZCB0d28gU1dBUF80J3MuICBEZWxldGUgU1dBUF9OLCBzaW5jZSBub2JvZHkgdXNlcyBpdCBub3cuCi0JKEVORElBTl9OKTogQWRkIFNFVCBhcmd1bWVudCB0byBTV0FQX24gY2FsbHMuICBEZWxldGUgbWFjcm8gZGVmcwotCXRoYXQgaGFyZHdpcmVkIHN3YXBwaW5nIG9uL29mZiwgbGV0IG9wdGltaXplciBkZWxldGUgZGVhZCBjb2RlLgotCi0JKiBtYWluLmMgKG1haW4pOiBBZGQgcHJpbnRmIHRoYXQgd2UgY2F1Z2h0IGEgc2lnbmFsIGFuZCBwcmludCBvdXQKLQl0aGUgZmFpbGluZyBhZGRyZXNzLgotCi1UaHUgT2N0IDE5IDIxOjQzOjM5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBmaXNoZm9vZC5hbWlnYWxpYi5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHRhYnMgZnJvbSBvdGhlcndpc2UgZW1wdHkgbGluZS4KLQlDb25mdXNlcyBtYW55IG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgotCi1XZWQgT2N0IDE4IDA4OjUxOjI1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogRGVsZXRlIGZpbGVzIHByb2R1Y2VkIGJ5IGdlbi4KLQotTW9uIE9jdCAxNiAxNzozNDoyNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGdlbi5jIChsZl9wcmludF9jX3NlbWFudGljX2Z1bmN0aW9uKTogTW92ZSBjb3VudGluZyAjIG9mCi0JaW5zdHJ1Y3Rpb25zIGhlcmUgc28gaXQgd29ya3Mgd2l0aCBjYWNoaW5nLgotCShnZW5faWRlY29kZV9jKTogTW92ZSBmcm9tIGhlcmUuCi0KLVdlZCBPY3QgMTEgMTc6MTM6MTUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGdlbi5jLCBwcGMtaW5zdHJ1Y3Rpb25zLCBwc2ltLmM6IEZpeCBjb2RlIGZvciBnZW5lcmF0aW5nCi0JY3JhY2tpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUuICBEZWxldGUgdGhlIGNvZGUgdGhhdCBjYWNoZWQganVzdCB0aGUKLQlyZXN1bHQgZnJvbSBkb2luZyBhbiBpbnN0cnVjdGlvbiBsb29rdXAgLSB0aGlzIHJhbiBzbG93ZXIgdGhhbiBubwotCWNhY2hlIGF0IGFsbC4KLQotRnJpIE9jdCAxMyAwOTo1ODo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChnZW4ubyk6IEluY2x1ZGUgJChJTkxJTkVfQ0ZMQUdTKS4KLQotCSogZGVidWcuaCAocHBjX3RyYWNlKTogUmVuYW1lIGZyb20gdHJhY2UsIHRvIGF2b2lkIGEgY29uZmxpY3Qgd2l0aAotCVRDTCB3aGVuIGdkYiBpcyBsaW5rZWQgd2l0aCB0aGUgc2ltdWxhdG9yLgotCSogZGVidWcuYyAocHBjX3RyYWNlKTogRGl0dG8uCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBDaGFuZ2UgdHJhY2UgLT4gcHBjX3RyYWNlLgotCSogbWFpbi5jIChtYWluKTogRGl0dG8uCi0KLQkqIGNwdS5jIChjcHVfYWRkX2NvbW1hcyk6IFJlbW92ZSBleHRyYSBzdGF0aWMuCi0KLVRodSBPY3QgMTIgMTE6MzU6NTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAocHNpbS5vKTogTm93IHRoYXQgaW5saW5lcyBhcmUgdHVybmVkIG9uLCBtYWtlCi0JcHNpbS5vIGRlcGVuZCBvbiBhbGwgc291cmNlcy4KLQotCSogY3B1LmMgKGNwdV9hZGRfY29tbWFzKTogTmV3IGZ1bmN0aW9uIHRvIGZvcm1hdCBhIGxvbmcgd2l0aAotCWNvbW1hcy4KLQkoY3B1X3ByaW50X2luZm8pOiBVc2UgaXQgdG8gcHJpbnQgbnVtYmVyX29mX2luc25zLgotCQotCSogcHBjLWVuZGlhbi5jIChTV0FQX24pOiBOZXcgbWFjcm9zIHRvIHNwZWVkIHVwIGJ5dGUgc3dhcHBpbmcgZm9yCi0JMiwgNCwgYW5kIDggYnl0ZXMuCi0JKEVORElBTl9OKTogSWYgYm90aCB0YXJnZXQgYW5kIGhvc3QgYnl0ZSBvcmRlcnMgYXJlIGtub3duLCBkb24ndAotCWJvdGhlciB0ZXN0aW5nIENVUlJFTlRfe1RBUkdFVCxIT1NUfV9CWVRFX09SREVSLgotCi0JKiBwcGMtZW5kaWFuLmggKHRhcmdldCBzcGVjaWZpYyBIMlRfbi9UMkhfbiBtYWNyb3MpOiBSZW1vdmUgI2lmIDAKLQl0byBhbGxvdyB0YXJnZXQgc3BlY2lmaWMgSDJUX24vVDJIX24gbWFjcm9zIHRvIGJlIHVzZWQuCi0JKGh0b25sLCBudG9obCk6IElmIGNvbXBpbGVkIG9uIGEgNDg2IGJ5IEdDQyBhbmQgV0lUSF9CU1dBUCBpcwotCW5vbi16ZXJvLCByZWRlZmluZSB0aGUgaHRvbmwvbnRvaGwgbWFjcm9zIHRvIHVzZSB0aGUgQlNXQVAgaW5zdGVhZAotCW9mIHRoZSAzIGluc3RydWN0aW9uIHNlcXVlbmNlIHRoYXQgcnVucyBvbiAzODZzLgotCi0JKiBzdGQtY29uZmlnLmggKFdJVEhfe0hPU1QsVEFSR0VUfV9CWVRFX09SREVSKTogRG9uJ3Qgb3ZlcnJpZGUgaWYKLQlzcGVjaWZpZWQgb24gdGhlIGNvbXBpbGUgbGluZS4KLQkoV0lUSF9CU1dBUCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQotCSogTWFrZWZpbGUuaW4gKElOTElORV9DRkxBR1MpOiBBZGQgLURERUZBVUxUX0lOTElORT0yIHRvIGFkZAotCWRlZmF1bHQgaW5saW5lIHN1cHBvcnQuICBQYXNzIElOTElORV9DRkxBR1Mgd2hlbiBjb21waWxpbmcuCi0KLQkqIGRldmljZXMue2gsY30gKHVuaW1wX2RldmljZV9pb2N0bCk6IFVzZSBTVEFUSUNfREVWSUNFUywgbm90Ci0JSU5MSU5FX0RFVklDRVMgc2luY2UgR0NDIGRvZXNuJ3QgbGlrZSBpbmxpbmUgZnVuY3Rpb25zIHRoYXQKLQlhY2NlcHQgdmFyaWFibGUgYXJndW1lbnRzLgotCShzdGFja19pb2N0bF9jYWxsYmFjayk6IE1ha2UgZnVuY3Rpb24ganVzdCBzdGF0aWMgYmVjYXVzZSBHQ0MKLQlkb2Vzbid0IGxpa2UgaW5saW5lIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMuCi0KLQkqIGRldmljZXMuaCAoU1RBVElDX0RFVklDRVMpOiBEZWZpbmUgYXMgZW1wdHkgaWYgbm90IGRlZmluZWQuCi0KLQkqIGlubGluZS5jOiBDb3JyZWN0IHBhdGhuYW1lcyBvZiBpbmNsdWRlZCBDIGZpbGVzIHRvIG1hdGNoIGN1cnJlbnQKLQlpbXBsZW1lbnRhdGlvbi4KLQotCSogaW5saW5lLmggKFNUQVRJQ19ERVZJQ0VTKTogSWYgREVWSUNFU19JTkxJTkUgaXMgZGVmaW5lZCB0byBiZQotCW5vbi16ZXJvLCBkZWZpbmUgU1RBVElDX0RFVklDRVMgdG8gYmUgc3RhdGljLgotCi0JKiBzdGQtY29uZmlnLmggKElOTElORSk6IElmIEdOVSBDIGFuZCBvcHRpbWl6aW5nLCBkZWZpbmUgdGhpcyBhcwotCV9faW5saW5lX18uCi0JKERFRkFVTFRfSU5MSU5FKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCShFTkRJQU5fSU5MSU5FKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBERUZBVUxUX0lOTElORS4KLQkoe0NPUkUsVk0sQ1BVLEVWRU5UUyxSRUdJU1RFUlMsSU5URVJSVVBUU31fSU5MSU5FKTogRGl0dG8uCi0JKHtTUFJFRyxJREVDT0RFfV9JTkxJTkUpOiBEaXR0by4JCi0JCi1XZWQgT2N0IDExIDE3OjEzOjE1IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogcHBjLWluc3RydWN0aW9uczogSW5pdGlhbCBjdXQgb2YgZmxvYXRpbmcgcG9pbnQgc3Vwb3J0IGFkZGVkLgotICAJT2Ygbm90ZSBpbmNsdWRlIC0gdXNlIG9mIGhvc3QgSUVFRSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMsCi0gCXVzZSBvZiBQb3dlclBDIG1hbnVhbCBwc2V1ZG8gY29kZSB0byBoYW5kbGUgdGhlIEZQU0NSLiAgSXQgaXMgbm90Ci0gCWN1cnJlbnRseSBhIHByZXR0eSBzaWdodC4KLQkKLQkqIG1lbW9yeV9tYXAuaCwgbWVtb3J5X21hcC5jLCBtZW1vcnlfbWFwX24uaCwgY29yZS5oLCBjb3JlLmM6Ci0gCW1lcmdlIGludG8gY29yZS5oLCBjb3JlLmMsIGNvcmVfbi5oLiBUaGUgdHlwZSBtZW1vcnlfbWFwIHJlcGxhY2VkCi0gCXdpdGggY29yZV9tYXAuICBUaGlzIHJlbW92ZXMgYSBsZXZlbCBvZiBwb2ludGVyIGluZGlyZWN0aW9uIHdoZW4KLSAJdHJhbnNsYXRpbmcgYW4gYWRkcmVzcy4KLQotCSogbWVtb3J5X21hcC5oLCBtZW1vcnlfbWFwLmMsIG1lbW9yeV9tYXBfbi5oOiBkZWxldGUuCi0KLQkqIE1ha2VmaWxlLmluIGV0LmFsIChzb3JyeSk6IHR3ZWVrIHRvIHVzZSBuZXcgY29yZSwgY29yZV9tYXAgYW5kCi0gCWNvcmUuaC4KLQkKLVdlZCBPY3QgMTEgMTI6MTA6MjYgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHNpbV9jYWxscy5jLCBtYWluLmM6IEFkZCAtZyAodHJhY2VfZ2RiKSBvcHRpb24sIGFkZCB0cmFjaW5nIHRvCi0gCW1vc3Qgb2YgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbiBzaW1fY2FsbHMuYy4KLQotCSogYmFzaWNzLmggKENPTkNBVDMpLCBtZW1vcnlfbWFwLmMsIG1lbW9yeV9tYXBfbi5oLCBNYWtlZmlsZS5pbjoKLSAJQWRkIG1hY3JvcyB0byBiZXR0ZXIgY292ZXIgdXAgYGdlbmVyaWMnIGNvZGUuICBNYWtlcyBpdCBwb3NzaWJsZQotIAl0byBzdGVwIHRocm91Z2ggdGhlIGdlbmVyaWMgY29kZSEKLQotCSogdm0uYywgdm1fbi5oLCBNYWtlZmlsZS5pbjogZGl0dG8KLQkKLVR1ZSBPY3QgMTAgMTU6NDI6NTkgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGRldmljZXMuaCwgZGV2aWNlcy5jLCBtZW1vcnlfbWFwLmgsIG1lbW9yeV9tYXAuYzogQ2hhbmdlZAotIAljYWxsYmFjayBpbnRlcmZhY2Ugc28gdGhhdCB0aGVyZSBpcyBhIHJlYWQvd3JpdGUgYnVmZmVyIGJ1dCBubwotIAlyZWFkL3dyaXRlX3dvcmQuICBWRUEgZGVmYXVsdCBtZW1vcnkgcmVhZC93cml0ZSBoYW5kbGVyIHNvbWV0aW1lcwotIAljb3VsZG4ndCByZXNvbHZlIGFuIGFjY2VzcyBhbmQgb2YgdGhvc2Ugc29tZSB3ZXJlIGZvciBhIG1lbW9yeQotIAlmYXVsdCBhbmQgc29tZSB3ZXJlIGJlY2F1c2UgZ2RiIHdhcyBtYWtpbmcgYSBib2d1cyByZXF1ZXN0LgotCi0JKiBkZXZpY2VzLmgsIGRldmljZXMuYywgbWVtb3J5X21hcC5oLCBtZW1vcnlfbWFwLmMsIHZtLmgsIHZtLmM6Ci0gCWVsaW1pbmF0ZSB0cmFuc2Zlcl9tb2RlIChyYXcgb3IgY29va2VkKSBwYXJhbWV0ZXIgZnJvbSByZWFkL3dyaXRlCi0gCWJ1ZmZlci4KLQkKLUZyaSBPY3QgIDYgMjA6MjM6NTYgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHBwYy1pbnN0cnVjdGlvbnMgKGZtdWwsIGZtdWxzKTogY29ycmVjdCBpbnN0cnVjdGlvbiBmb3JtYXQgLSBoYWQKLSAJRlJCIGluc3RlYWQgb2YgRlJDLgotCi1XZWQgT2N0ICA0IDE3OjMxOjEyIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBwc2ltLmMsIGRldmljZV90cmVlLmgsIGRldmljZV90cmVlLmMsIGRldmljZXMuYyAocHJpbnRkXyosCi0gCXNjYW5kXyopOiBuZXcgZnVuY3Rpb25zIHRvIHBhcnNlL3ByaW50IGZpZWxkcyBpbiBkZXZpY2UgbmFtZXMKLSAJd2hpbGUgaGlkaW5nIGFueSBtYWNoaW5lIGRlcGVuZGVuY3kuCi0KLQkqIGRldmljZXMuYywgcHNpbS5jOiBDaGFuZ2UgdGhlIHN0YWNrIGluaXQgY29kZSBzbyB0aGF0IGl0IGlzCi0gCWhhbmRsZWQgYnkgYSBkZXZpY2UuICBBcmd1bWVudHMgcGFzc2VkIGFjcm9zcyB1c2luZyBhIGRldmljZSBpb2N0bAotIAkoaGFjaykuCi0KLQkqIGRldmljZXMuaCwgZGV2aWNlcy5jOiBkZXZpY2UgaW9jdGwgY2FsbGJhY2sgY2hhbmdlZCB0byBhbGxvdyBhCi0gCXZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBUaGlzIGdpdmVzIGdyZWF0ZXIgZmxleGFiaWxpdHkgYW5kCi0gCWdyZWF0ZXIgY2hhbmNlIG9mIGJ1Z3MuCi0KLVR1ZSBPY3QgIDMgMjI6MDE6NTYgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIG1haW4uYyAocHJpbnRmX2ZpbHRlcmVkLCBlcnJvcik6IE1pc3NpbmcgdmFfZW5kKCkgdG8gY2xvc2Ugb2ZmCi0gICAgICAgIHZhcmlhYmxlIGFyZ3VtZW50IHVzZS4KLQotCSogTWFrZWZpbGUuaW4gKHRtcC1nZW5jb2RlKTogY29tbWVudCBvdXQgaGFjayB0byBnZXQgYXJvdW5kIHNvbWUKLSAgICAgICAgdmVyc2lvbnMgb2YgbWFrZSBub3QgaGFuZGxpbmcgZmlsZXMgYmVpbmcgY3JlYXRlZCBhcyBzaWRlLWVmZmVjdHMuCi0KLQkqIGdlbi5jIChsZl9vcGVuKTogQWRkIC1uIChyZWFsX2ZpbGVfbmFtZSkgb3B0aW9uLiAgU3BlY2lmaWVzIGFuCi0gICAgICAgIGFsdGVybmF0aXZlIGZpbGUgbmFtZSB0byB1c2UgaW4gb3V0cHV0IGZpbGVzIGZvciB0aGluZ3MgbGlrZSAjbGluZQotICAgICAgICBtYWNyb3MuCi0KLSAgICAgICAgTWFrZWZpbGUuaW4gKHRtcC1nZW5jb2RlKTogVXNlIGdlbiAtbiBzbyB0aGF0IGRlYnVnIGluZm8gaXMKLSAgICAgICAgY29ycmVjdC4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVExJQik6IFVzZSB0aGlzIGluc3RlYWQgb2YgbGlic2ltLmEgaW4gdGhlCi0JTWFrZWZpbGUuCi0KLVNhdCBPY3QgIDcgMjI6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBEZWZpbmUgbmV3IGZ1bmN0aW9uLgotCi1GcmkgT2N0ICA2IDE3OjIzOjEwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHNpbS5jIChwc2ltX3ByaW50X2luZm8pOiBQcmludCBleGl0IHN0YXR1cyBvciBzaWduYWwgbnVtYmVyLgotCi1Nb24gT2N0ICAyIDExOjQ2OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY3B1LmMgKHN0cnVjdCBfY3B1KTogQWRkIG51bWJlcl9vZl9pbnNucyBmaWVsZCB0byB0cmFjZSBob3cgbWFueQotCWluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQuCi0JKGNwdV9pbmNyZW1lbnRfbnVtYmVyX29mX2luc25zKTogTmV3IGZ1bmN0aW9uIHRvIGluY3JlbWVudCB0aGUKLQludW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGlzc3VlZC4KLQkoY3B1X2dldF9udW1iZXJfb2ZfaW5zbnMpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YKLQlpbnN0cnVjdGlvbnMgaXNzdWVkLgotCShjcHVfcHJpbnRfaW5mbyk6IE5ldyBmdW5jdGlvbiB0byBwcmludCBjcHUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQlBdCBwcmVzZW50LCBwcmludCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZC4KLQotCSogZ2VuX2lkZWNvZGVfYzogRW1pdCBjYWxsIHRvIGNwdV9pbmNyZW1lbnRfbnVtYmVyX29mX2luc25zIHdpdGhpbgotCWlkZWNvZGVfaXNzdWUuCi0KLQkqIHBzaW0uYyAocHNpbV9wcmludF9pbmZvKTogTmV3IGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBlYWNoIG9mCi0JdGhlIENQVSdzIGNhbGxpbmcgY3B1X3ByaW50X2luZm8uCi0JCi0JKiBwc2ltLmgsY3B1Lmg6IEFkZCBuZXcgZGVjbGFyYXRpb25zLgotCi0JKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBBZGQgYXJndW1lbnQgcHJvY2Vzc2luZyB0byBhZGQgdGhlIHNhbWUKLQlzd2l0Y2hlcyBtYWluLmMgYWNjZXB0cyBmb3IgdGhlIHN0YW5kYWxvbmUgcHJvY2Vzc29yLgotCShzaW1fY2xvc2UpOiBDYWxsIHBzaW1fcHJpbnRfaW5mbyBpZiAtSS4KLQotCSogbWFpbi5jIChtYWluKTogQWRkIGNvbW1lbnQgc2F5aW5nIHRvIHVwZGF0ZSBzaW1fY2FsbHMuYyB3aGVuCi0JYWRkaW5nIHN3aXRjaGVzLiAgQWRkIC1JIHRvIGNhbGwgcHNpbV9wcmludF9pbmZvIHdoZW4gZG9uZS4KLQkodXNhZ2UpOiBVcGRhdGUgdXNhZ2UgbWVzc2FnZS4KLQotU3VuIE9jdCAgMSAxMzo1Mjo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG1haW4uYyAocHJpbnRmX2ZpbHRlcmVkKTogQ29ycmVjdCB0byBtYXRjaCBuZXcgcHJvdG90eXBlLgotCi1TYXQgU2VwIDMwIDIwOjQ3OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltX2NhbGxiYWNrcy5oIChwcmludGZfZmlsdGVyZWQpOiBDb3JyZWN0IHByb3RvdHlwZS4KLQotVGh1IFNlcCAyMSAxNjoyNjo0OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGRldmljZV90cmVlLmMgKE9FQV9NRU1PUllfU0laRSk6IERlZmluZSBpZiBub3QgZGVmaW5lZCB0bwotCTB4MTAwMDAwLgotCShjbGF5dG9uX21lbW9yeV9zaXplKTogRGVmaW5lIGFzIE9FQV9NRU1PUllfU0laRS4KLQotCSogc3RkLWNvbmZpZy5oIChXSVRIX1RSQUNFKTogRGVmYXVsdCB0byAxIG5vdy4KLQotCSogcHNpbS5jICh3cml0ZV9zdGFja19hcmd1bWVudHMpOiBEb24ndCB3cml0ZSBhbnkgc3RhY2sgYXJndW1lbnRzCi0JaWYgT0VBLgotCi0JKiBtYWluLmMgKG1haW4pOiBTd2l0Y2ggdG8gdXNpbmcgZ2V0b3B0LiAgTWFrZSAtcCBhbHNvIHNldAotCXRyYWNlX3NlbWFudGljcy4gIE1ha2UgLWEgdHVybiBvbiBhbGwgdHJhY2UgZmxhZ3MuICBNYWtlIC1DIHR1cm4KLQlvbiBjb25zb2xlIHRyYWNpbmcuCi0KLQkqIGRldmljZV90cmVlLmMgKGNyZWF0ZV9vcHRpb25fZGV2aWNlX25vZGUpOiBBc3N1bWUgYSBwcm9ncmFtIGlzCi0JT0VBIGlmIHRoZSBzdGFydCBhZGRyZXNzIGlzIDwgNDA5Niwgbm90IGp1c3QgPT0gMC4KLQotV2VkIFNlcCAyMCAxMzozNjowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotU3VuIFNlcCAxMCAxMDoyMzo1NiAxOTk1ICBNaWNoYWVsIFRpZW1hbm4gIDx0aWVtYW5uQGF4b24uY3lnbnVzLmNvbT4KLQotCSogcmVnaXN0ZXJzLmMgKHJlZ2lzdGVyX2Rlc2NyaXB0aW9uKTogQWRkIGdkYiBzeW5vbnltcyBmb3IgY3IKLQkoY25kKSBhbmQgbXNyIChwcykuCi0KLUZyaSBTZXAgIDggMTM6MTY6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBEb24ndCB0cnkgdG8gdXNlCi0JYmZkL2hvc3RzLyouaCBmaWxlIG9yIGJmZC9jb25maWcvKi5taCBmaWxlLiAgQ2FsbCBBQ19QUk9HX0NDIGFuZAotCUFDX1BST0dfUkFOTElCLiAgU3Vic3RpdHV0ZSBpbiB2YWx1ZXMgZm9yIENGTEFHUywgSERFRklORVMsIEFSLAotCWFuZCBDQ19GT1JfQlVJTEQuICBDYWxsIEFDX0NIRUNLX0hFQURFUlMgZm9yIHZhcmlvdXMgaGVhZGVyIGZpbGVzLgotCVRvdWNoIHN0YW1wLmggaWYgY3JlYXRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBNYWtlZmlsZS5pbiAoQVIpOiBEZWZpbmUgYXMgQEFSQC4KLQkoQ0MpOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgYXMgQENDQC4KLQkoQ0ZMQUdTKTogRGVmaW5lIGFzIEBDRkxBR1NALgotCShDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgYXMgQENDX0ZPUl9CVUlMREAuCi0JKFJBTkxJQik6IERlZmluZSBhcyBAUkFOTElCQC4KLQkoSERFRklORVMsIFRERUZJTkVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKG1vc3RseWNsZWFuKTogTWFrZSB0aGUgc2FtZSBhcyBjbGVhbiwgbm90IGRpc3RjbGVhbi4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCShNYWtlZmlsZSk6IERvbid0IGRlcGVuZCB1cG9uIEBmcmFnc0AuICBKdXN0IHJlYnVpbGQgTWFrZWZpbGUgd2hlbgotCWludm9raW5nIGNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKGdlbiwgZ2VuLm8pOiBCdWlsZCB3aXRoIENDX0ZPUl9CVUlMRCwgbm90IENDLgotCShwcGMtY29uZmlnLmgpOiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnLmggYnVpbGQuCi0JKiAoYmFzaWNzLmgsZ2VuLmMscHBjLWVuZGlhbi5jLHBzaW0uYyk6IEluY2x1ZGUgcHBjLWNvbmZpZy5oLgotCQotRnJpIFNlcCAgOCAwOTo1MTowMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZXssLmlufTogRG9uJ3QgaW5jbHVkZSBzeXNkZXAuaCBmcm9tIGJmZCwgc2luY2UgYmZkIG5vCi0JbG9uZ2VyIHByb3ZpZGVzIGl0LgotCSogYmFzaWNzLmggKHN5c2RlcC5oKTogRG9uJ3QgaW5jbHVkZSBpdC4KLQkqIE1ha2VmaWxlLmluIChCQVNJQ1NfSCk6IFJlbW92ZSBzeXNkZXAuaC4KLQotV2VkIFNlcCAgNiAxMzoyNTo0MiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAKLSAJKiBjb3JlLmMgKGNvcmVfYWRkX2RhdGEpOiBGaXJzdCBncm93dGggb2YgYnNzIHdhcyBiZWluZyBwdXQgYXQKLSAgICAgICAgd3JvbmcgYWRkcmVzcyAoMCkgaW5zdGVhZCBvZiAmZW5kLgotIAotIAkqIGNvcmUuYyAoY29yZV9hZGRfc3RhY2ssIGNvcmVfYWRkX2RhdGEpOiBXYXMgbm90IGhhbmRsaW5nIGNhc2UKLSAgICAgICAgd2hlcmUgYnNzL3N0YWNrIGlzIGdyb3duIGFjcm9zcyB0aGUgY3VycmVudCBlbmQtb2Yte2JzcyxzdGFja30uCi0KLVdlZCBTZXAgIDYgMDA6NDY6MTAgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHN5c3RlbS5jIChzeXN0ZW1fY2FsbCk6IEZpeCBTWVNfYnJlYWsgLSB3YXMgYWxpZ25pbmcgYnNzIHRvIGEKLSAgICAgICAgcGFnZSBib3VuZGFyeSBpbnN0ZWFkIG9mIGp1c3QgYW4gOCBieXRlIG9uZTsgT24gZmlyc3QgY2FsbCBzYnJrKDApCi0gICAgICAgICE9IHNicmsoMCkuCi0KLVRodSBBdWcgMjQgMTQ6NDg6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCBpbnN0YWxsIHJ1bGUuCi0KLVR1ZSBBdWcgMjIgMDk6MzE6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzeXN0ZW0uYyAoc3lzdGVtX2NhbGwpOiBBZGQgcmVhZCBzdXBwb3J0LgotCi0JKiBtYWluLmMgKG1haW4pOiAtdCBzZXRzIHRyYWNlX2RldmljZV90cmVlLiAgQ29ycmVjdCB1c2FnZSBtZXNzYWdlCi0JdG8gY3VycmVudCByZWFsaXR5LgotCi0JKiBkZXZpY2VfdHJlZS5jICh1cGRhdGVfbWVtb3J5X25vZGVfZm9yX3NlY3Rpb24pOiBNYWtlIHRyYWNpbmcKLQlvdXRwdXQgbGluZSB1cC4gIElmIG5vdCBjb2RlIG9yIHJlYWRvbmx5LCBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbgotCWlzIGEgZGF0YSBzZWN0aW9uIGFuZCBoYXMgcmVhZC93cml0ZSBwZXJtaXNzaW9ucy4gIEFkZCByZWFkb25seQotCXN1cHBvcnQuCi0KLQkqIGNvcmUuYyAoY3JlYXRlX2NvcmVfZnJvbV9hZGRyZXNzZXMpOiBQcmludCBlbmQgYWRkcmVzcyBpbiB0cmFjZXMKLQlhbmQgbWFrZSB0cmFjaW5nIG91dHB1dCBsaW5lIHVwLgotCi0JKiBNYWtlZmlsZS5pbjogUmV3cml0ZSBmcm9tIE1ha2VmaWxlIHRvIHdvcmsgd2l0aCB0aGUgQ3lnbnVzCi0JZW52aXJvbm1lbnQsIGFuZCBzdXBwb3J0IGNvbXBpbGluZyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdGhhbgotCXRoZSBzb3VyY2VzIHJlc2lkZSBpbi4KLQotCSogcHBjLWVuZGlhbi5oOiBSZW5hbWUgZnJvbSBlbmRpYW4uaCBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0Ci0JY29uZnVzZWQgd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2VuZGlhbi5oIG9uIExpbnV4LiAgQWRkIExpbnV4Ci0JZW5kaWFuIHN1cHBvcnQuCi0KLQkqIHBwYy1lbmRpYW4uYzogUmVuYW1lIHRvIGJlIGNvbnNpc3RhbnQgd2l0aCBwcGMtZW5kaWFuLmguCi0JSW5jbHVkZSBwcGMtZW5kaWFuLmgsIG5vdCBlbmRpYW4uaC4KLQotCSogYmFzaWNzLmggKHN5c2RlcC5oKTogSW5jbHVkZSBzeXNkZXAuaCB0aGF0IGNvbmZpZ3VyZSBtYWtlcy4KLQlJbmNsdWRlIHBwYy1lbmRpYW4uaCwgbm90IGVuZGlhbi5oLgotCi0JKiBzdGQtY29uZmlnLmg6IFJlbmFtZSBmcm9tIHBwYy1jb25maWcuICBQdXQgI2lmbmRlZnMgYXJvdW5kIG1vc3QKLQljb25maWd1cmF0aW9uIG1hY3Jvcywgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiB2aWEgQ0ZMQUdTLiAgQnkKLQlkZWZhdWx0LCB0dXJuIG9mZiB0cmFjaW5nLgotCi0JKiBjb25maWd1cmUuaW46IENsb25lIGZyb20gb3RoZXIgc2ltdWxhdG9yIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IEdlbmVyYXRlIHZpYSBhdXRvY29uZiBmcm9tIGNvbmZpZ3VyZS5pbi4KLQotU2F0IEF1ZyAxOSAwOTowNTozMiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogcHBjLWluc3RydWN0aW9uczogZml4IHNyYXdpICh3YXMgZ2V0aW5nIFhFUltDQV0gcmVhbCB3cm9uZykuCi0KLQkqIGludGVycnVwdHMuYyAoZGF0YV9zdG9yYWdlX2ludGVycnVwdCk6IGFsbG93IHN0YWNrIHRvIGdyb3cgYnkKLSAgICAgICAgdXB0byBvbmUgTUIgcGVyIGluY3JlbWVudC4KLQotCSogcHBjLWluc3RydWN0aW9uczogZGl2dyB3YXMgY29tcHV0aW5nIHJBIC8gckEgbm90IHJBIC8gckIKLQotCSogbWFpbi5jIChtYWluKTogcmVhbGx5IHN0dXBpZC4gV2Fzbid0IGV4aXRpbmcgd2l0aCBjb3JyZWN0IHN0YXR1cwotCi1GcmkgQXVnIDE4IDAwOjM4OjAxIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBzeXN0ZW0uYyAoc3lzdGVtX2NhbGwpOiBhZGQgc3lzdGVtIGNhbGxzIGtpbGwoMikgYW5kIGdldHBpZCgyKS4KLQotCSogbWFpbi5jIChtYWluKTogQ2hlY2svcmV0dXJuIGV4aXQgc3RhdHVzIHdoZW4gc2ltdWxhdGlvbgotICAgICAgICBmaW5pc2hlcy4KLQotVGh1IEF1ZyAxNyAxNDoyOToxOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogZGV2aWNlX3RyZWUuYyAoY3JlYXRlX29wdGlvbl9kZXZpY2Vfbm9kZSk6IEFsaWdubWVudCBydWxlcyAoYXQKLSAJbGVhc3QgZm9yIHRoZSBtb21lbnQpIG5vdyBhcmUgZm9yIHN0cmljdCBhbGlnbm1lbnQgb25seSBmb3IgTEUgT0VBCi0gCW1vZGUuICAoQmVjYXVzZSBvZiBjb21waWxlciBwcm9ibGVtcykuCi0KLQkqIHN5c3RlbS5jIChzeXN0ZW1fY2FsbCkgU1lTX2V4aXQ6IFdhc24ndCBleGl0aW5nIHdpdGggY29ycmVjdCBzdGF0dXMuCi0KLVRodSBBdWcgMTcgMDE6MTY6MzggMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIHZtLmMgKERFRklORV9WTV9EQVRBX01BUF9XUklURV9OKTogRm9yIG1pc3MgYWxpZ25lZCB0cmFuc2ZlcgotICAgICAgICBmb3Jnb3QgdG8gcmV0dXJuLgotCi0JKiBzeXN0ZW0uYyAoc3lzdGVtX2NhbGwpOiBkaWRuJ3QgcGFnZSBhbGlnbiBicmVhayBhcmd1bWVudCBiZWZvcmUKLSAgICAgICAgZGV0ZXJtaW5pbmcgaW5jcmVtZW50IGJyZWFrIGluY3JlbWVudC4KLQotCSogcHNpbS9wcGM6IFJlLWFyYW5nZSBlbnRpcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBzbyB0aGF0Ci0gICAgICAgIGV2ZXJ5dGhpbmcgbGl2ZXMgaW4gdGhlIG9uZSBkaXJlY3RvcnkuICBXaGlsZSBhIHBhaW4gZm9yIGNsZWFuaW5nLAotICAgICAgICBtYWtlcyBidWlsZGluZyBhY3Jvc3MgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyBtdWNoIHNpbXBsZXIuCi0KLQkqIGRldmljZXMuYywgZGV2aWNlX3RyZWUuYzogQWRkZWQgY29kZSB0aGF0IHByb3ZpZGVzIGEgc2ltcGxlCi0gICAgICAgIGlsbHVzdHJhdGlvbiBvZiBob3cgYW4gaW50ZXJydXB0IGNvbnRyb2wgZGV2aWNlIGNvdWxkIGJlCi0gICAgICAgIGltcGxlbWVudGVkLgotCi0JKiBkZXZpY2VzLmM6IEFkZGVkIGNvZGUgc28gdGhhdCB0aGUgZHVtYiBjb25zb2xlIGRldmljZSBjYW4gcmVhZAotICAgICAgICAoZnJvbSBzdGRpbikgYXMgd2VsbCBhcyB3cml0ZSB0byBzdGRvdXQuCi0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvSU5TVEFMTCBiL3NpbS9wcGMvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyODhmMS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotCi0JCVBTSU0gLSBtb2RlbCB0aGUgUG93ZXJQQyBlbnZpcm9ubWVudAotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+LgotCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLQkJCUJ1aWxkaW5nIFBTSU0KLQotCVRoaXMgZmlsZSBkZXNjcmliZXMgaG93IHRvIGJ1aWxkIHRoZSBwcm9ncmFtIFBTSU0KLQotCW8JV2FsayB0aHJvdWdoIGEgYmFzaWMgYnVpbGQKLQotCW8JRGlzY3Vzc2lvbiBvZiBQU0lNJ3MgY29tcG9uZW50cyBhbmQKLQkJaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBidWlsZCBwcm9jZXNzCi0KLQlvCURldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgUFNJTSdzCi0JCWNvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKLQotCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUJVSUxESU5HIFBTSU06Ci0KLVBTSU0gMS4wLjIgaXMgaW5jbHVkZWQgaW4gR0RCLTQuMTYuICBUbyBidWlsZCBQU0lNIHlvdSB3aWxsIG5lZWQgdGhlCi1mb2xsb3dpbmc6Ci0KLQlnZGItNC4xNi50YXIuZ3oJCUF2YWlsYWJsZSBmcm9tIHlvdXIgZmF2b3JpdGUgR05VCi0JCQkJZnRwIHNpdGUKLQotCWdjYwkJCUdDQyB2ZXJzaW9uIHR3byBpbmNsdWRlcyBzdXBvcnQKLQkJCQlmb3IgbG9uZyBsb25nICg2NGJpdCBpbnRlZ2VyKQotCQkJCWFycml0aGVtZXRpYyB3aGljaCBQU0lNIHVzZXMuICBIZW5jZQotCQkJCWl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGJ1aWxkIFBTSU0KLQkJCQl1c2luZyBHQ0MuCi0JCQkJCi1NZXRob2Q6Ci0KLQkxLglVbnBhY2sgZ2RiCi0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGd1bnppcCA8IGdkYi00LjE2LnRhci5neiB8IHRhciB4ZiAtCi0KLQotCTIuCUNvbmZpZ3VyZSBnZGIKLQotCQlGaXJzdCBjb25zdWx0IHRoZSBnZGIgZG9jdW1lbnRhdGlvbgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBnZGItNC4xNgotCQkkIG1vcmUgUkVBRE1FCi0JCSQgbW9yZSBnZGIvUkVBRE1FCi0KLQkJdGhlbiBzb21ldGhpbmcgbGlrZSAoSSBhc3N1bWUgU0gpOgotCi0JCSQgQ0M9Z2NjIC4vY29uZmlndXJlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1wb3dlcnBjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tcHJlZml4PS9hcHBsaWNhdGlvbnMvcHNpbQotCi0KLQk0LglCdWlsZCAoYWdhaW4gc3BlY2lmeWluZyBHQ0MpCi0KLQkJJCBtYWtlIENDPWdjYwotCi0JCWFsdGVybmF0aXZlbHksIGlmIHlvdSBhcmUgc2hvcnQgb24gZGlzayBzcGFjZSBvciBvbmx5Ci0JCXdhbnQgdG8gYnVpbGQgdGhlIHNpbXVsYXRvcjoKLQotCQkkICggY2QgbGliaWJlcnR5ICYmIG1ha2UgQ0M9Z2NjICkKLQkJJCAoIGNkIGJmZCAmJiBtYWtlIENDPWdjYyApCi0JCSQgKCBjZCBzaW0vcHBjICYmIG1ha2UgQ0M9Z2NjICkKLQotCi0JNS4JSW5zdGFsbAotCi0JCSQgbWFrZSBDQz1nY2MgaW5zdGFsbAotCi0JCW9yIGp1c3QKLQotCQkkIGNwIGdkYi9nZGIgfi9iaW4vcG93ZXJwYy11bmtub3duLWVhYmlzaW0tZ2RiCi0JCSQgY3Agc2ltL3BwYy9ydW4gfi9iaW4vcG93ZXJwYy11bmtub3duLWVhYmlzaW0tcnVuCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1VUERBVElORyBQU0lNOgotCi0KLUEgUFNJTSBpcyBhbiBvbmdvaW5nIGRldmVsb3BtZW50LiAgT2NjYXNpb25hbCBzbmFwc2hvdHMgd2hpY2ggYm90aCBjb250YWluIG5ldwotZmVhdHVyZXMgYW5kIGZpeCBvbGQgYnVncyBhcmUgbWFkZSBhdmFpbGFibGUuICBTZWUgdGhlIGZ0cCBkaXJlY3Rvcnk6Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL2JldGEKLW9yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL2JldGEKLQotZm9yIHRoZSBsYXRlc3QgdmVyc2lvbi4gIFRvIGJ1aWxkL2luc3RhbGwgb25lIG9mIHRoZXNlIHNuYXBzaG90cywgeW91Ci1yZXBsYWNlIHRoZSBzaW0vcHBjIGZvdW5kIGluIHRoZSBnZGIgYXJjaGl2ZSB3aXRoIHdpdGggb25lIGZyb20gdGhlCi1zbmFwc2hvdC4gIFRoZW4ganVzdCByZS1jb25maWd1cmUgYW5kIHJlYnVpbGQvaW5zdGFsbC4KLQotCVByb2NlZHVyZToKLQotCTAuCUEgc3RhcnRpbmcgcG9pbnQKLQotCQkkIGNkIGdkYi00LjE2Ci0KLQotCTEuCVJlbW92ZSB0aGUgb2xkIHBzaW0gZGlyZWN0b3J5Ci0KLQkJJCBtdiBzaW0vcHBjIHNpbS9vbGQucHBjCi0KLQotCTIuCVVucGFjayB0aGUgbmV3IG9uZQotCi0JCSQgZ3VuemlwIDwgLi4vcHNpbS1OTk5OTk4udGFyLmd6IHwgdGFyIHRmIC0KLQkJJCBndW56aXAgPCAuLi9wc2ltLU5OTk5OTi50YXIuZ3ogfCB0YXIgdGYgLQotCi0KLQkzLglSZWNvbmZpZ3VyZS9yZWJ1aWxkIChhcyBzZWVuIGFib3ZlKToKLQotCQkkIENDPWdjYyAuL2NvbmZpZ3VyZSBcCi0JCQktLWVuYWJsZS1zaW0tcG93ZXJwYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KLQkJJCBtYWtlIENDPWdjYwotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotVVBEQVRFUyBUTyBHREI6Ci0KLUZyb20gdGltZSB0byB0aW1lLCBwcm9ibGVtcyBpbnZvbHZpbmcgdGhlIGludGVncmF0aW9uIG9mIFBTSU0gaW50byBnZGIKLWFyZSBmb3VuZC4gIFdoaWxlIGV2ZW50dWFsbHkgZWFjaCBvZiB0aGVzZSBwcm9ibGVtcyBpcyByZXNvbHZlZCB0aGVyZQotY2FuIGJlIHBlcmlvdWRzIGR1cmluZyB3aGljaCBhIGxvY2FsIGhhY2sgbWF5IGJlIG5lZWRlZC4KLQotQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGUgZm9sbG93aW5nIHdlcmUgb3V0c3RhbmRpbmc6Ci0KLQlBVFRBQ0ggY29tbWFuZDoKLQotCQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL2dkYi00LjE1K2F0dGFjaC5kaWZmLmd6Ci0Jb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vZ2RiLTQuMTUrYXR0YWNoLmRpZmYuZ3oKLQkKLQlQU0lNLCB1bmxpa2UgdGhlIG90aGVyIHNpbXVsYXRvcnMgZm91bmQgaW4gR0RCLCBpcyBhYmxlIHRvIGxvYWQKLQl0aGUgZGVzY3JpcHRpb24gb2YgYSB0YXJnZXQgbWFjaGluZSAoaW5jbHVkaW5nIHRoZSBpbml0aWFsCi0Jc3RhdGUgb2YgYWxsIHByb2Nlc3NvciByZWdpc3RlcnMpIGZyb20gYSBmaWxlLgotCi0JVW5mb3J0dW5hdGx5IEdEQiBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHN0YW5kYXJkIGNvbW1hbmQgdGhhdAotCWZhY2lsaXRhdGVzIHRoZSB1c2Ugb2YgdGhpcyBmZWF0dXJlLiAgVW50aWwgc3VjaCBhIGNvbW1hbmQgaXMKLQlhZGRlZCwgdGhlIHBhdGNoIChoYWNrPykgZ2RiLTQuMTUrYXR0YWNoLmRpZmYuZ3ogY2FuIGJlIHVzZWQgdG8KLQlleHRlbmQgR0RCJ3MgYXR0YWNoIGNvbW1hbmQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplCi0JdGhlIHNpbXVsYXRvcnMgY29uZmlndXJhdGlvbiBmcm9tIGEgZmlsZS4KLQotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotUlVOTklORyBQUk9HUkFNUzoKLQotCi1TZWUgdGhlIGZpbGU6Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL1JVTgotb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vUlVOCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1DT01QSUxFIFRJTUUgQ09ORklHVVJBVElPTiBPUFRJT05TOgotCi0KLVBTSU0ncyBjb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGF1dG9jb25mLiAgUFNJTSdzCi1jb25maWd1cmUgc2NyaXB0IHJlY29nbmlzZXMgb3B0aW9ucyBvZiB0aGUgZm9ybToKLQotCQktLWVuYWJsZS1zaW0tPG9wdGlvbj5bPTx2YWw+XQotCi1BbmQgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZSAoYXQgdGhlIHRvcCBsZXZlbAotb2YgdGhlIGdkYiBkaXJlY3RvcnkgdHJlZSkgdmlzOgotCi0JCSQgY2QgZ2RiLTQuMTUKLQkJJCBDQz1nY2MgLi9jb25maWd1cmUgXAotICAgICAgICAgICAgICAgICAgICAgICAgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmlzaW0gXAotICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltIFwKLQkJCS0tZW5hYmxlLXNpbS1pbmxpbmUKLQkJJCBtYWtlIENDPWdjYwotCi1Gb3IgYSBicmllZiBsaXN0IG9mIFBTSU0ncyBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGNvbmZpZ3VyZSAtLWhlbHAKLXdpbGwgbGlzdCB0aGVtIHZpczoKLQotCSQgY2Qgc2ltL3BwYwotCSQgLi9jb25maWd1cmUgLS1oZWxwCi0KLUVhY2ggUFNJTSBzcGVjaWZpYyBvcHRpb24gaXMgZGlzY3Vzc2VkIGluIGRldGFpbCBiZWxvdy4KLQotCi0KLS0tZW5hYmxlLXNpbS1jZmxhZ3M9PG9wdHM+Ci0KLQotU3BlY2lmeSBhZGRpdGlvbmFsIEMgY29tcGlsZXIgZmxhZ3MgdGhhdCBhcmUgdG8gYmUgdXNlZCB3aGVuIGNvbXBpbGluZwotanVzdCBQU0lNLgotCi1QU0lNIHBsYWNlcyBoZWF2eSBkZW1hbmRzIG9uIGJvdGggdGhlIGhvc3QgbWFjaGluZSBhbmQgaXRzIEMgY29tcGlsZXIuICBTbyB0aGF0Ci10aGUgYnVpbGRlciBoYXMgYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgY29tcGlsZXIgdGhlIGFib3ZlIG9wdGlvbiBjYW4gYmUgdXNlZAotdG8gcGFzcyBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyIHdoaWxlIFBTSU0gaXMgYmVpbmcgYnVpbHQuCi0KLUV4OiBObyBkZWJ1ZyBpbmZvcm1hdGlvbgotCi1QU0lNIGNhbiBiZSBidWlsdCB3aXRoIGV2ZXJ5dGhpbmcgaW5saW5lLiAgVW5mb3J0dW5hdGVseSwgYmVjYXVzZSBvZgotYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIHRoZSBDIGNvbXBpbGVyIGNhbiBncm93IHZlcnkKLXZlcnkgbGFyZ2UgYXMgYSByZXN1bHQuICBGb3IgR0NDLCB0aGUgZGVidWcgaW5mb3JtYXRpb24gY2FuIGJlCi1yZXN0cmljdGVkIHdpdGggdGhlIGAtZzAnIG9wdGlvbi4gIFRvIHNwZWNpZnkgdGhhdCB0aGlzIG9wdGlvbiBzaG91bGQKLWJlIGluY2x1ZGUgaW4gdGhlIENGTEFHUyB3aGVuIGNvbXBpbGluZyB0aGUgcHNpbSBzb3VyY2UgY29kZSB1c2U6Ci0KLQktLWVuYWJsZS1zaW0tY2ZsYWdzPS1nMAotCi1FeDogQWRkaXRpb25hbCBvcHRpbWl6YXRpb24gZmxhZ3MKLQotQSBzaWduaWZpY2FudCBnYWluIGluIHBlcmZvcm1hbmNlIGNhbiBiZSBhY2hpZXZlZCBieSB0dW5pbmcgdGhlCi1vcHRpbWl6YXRpb24gZmxhZ3MgcGFzc2VkIHRvIHRoZSBDIGNvbXBpbGVyLiAgRm9yIGluc3RhbmNlIG9uIGFuIHg4NgoteW91IG1heSBjb25zaWRlcjoKLQotCS0tZW5hYmxlLXNpbS1jZmxhZ3M9Jy1nMCAtTzIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLWYuLi4nCi0KLQotCi0tLWVuYWJsZS1zaW0td2FybmluZ3M9PGZsYWdzPgotCi0KLVR1cm4gb24gYWRkaXRpb25hbCBHQ0Mgc3BlY2lmaWMgY2hlY2tzLgotCi1Tb21lIGhvc3RzIChOZXRCU0QsIExpbnV4LCBTb2xhcmlzLTIuNSkgaGF2ZSBjb21wbGV0ZSBoZWFkZXIgZmlsZXMKLXRoYXQgaW5jbHVkZSBjb3JyZWN0IHByb3RvdHlwZXMgZm9yIGFsbCBsaWJyYXJ5IGZ1bmN0aW9ucy4gIE9uIHN1Y2gKLWhvc3RzLCBQU0lNIGNhbiBiZSBidWlsdCB3aXRoIG1hbnkgbW9yZSB0aGFuIHRoZSBzdGFuZGFyZCBDIGNoZWNrcwotZW5hYmxlZC4gIFRoZSBvcHRpb24gLS1lbmFibGUtc2ltLXdhcm5pbmdzIGNvbnRyb2xzIHRoaXMuCi0KLUV4OiBEZWZhdWx0IHdhcm5pbmdzCi0KLVdpdGgganVzdCAtLWVuYWJsZS1zaW0td2FybmluZ3MsIHRoZSBmb2xsb3dpbmcgLVcgb3B0aW9ucyBhcmUgZW5hYmxlZDoKLS1XZXJyb3IgLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1XbWlzc2luZy1wcm90b3R5cGVzLgotCi0KLQotLS1lbmFibGUtc2ltLW9wY29kZT13aGljaAotCi0KLVNwZWNpZnkgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcnVsZXMgZm9yIGdlbmVyYXRpbmcgdGhlIGluc3RydWN0aW9uCi1kZWNvZGUgYW5kIGV4ZWN1dGUgZnVuY3Rpb25zIGZyb20gdGhlIGZpbGUgcHBjLWluc3RydWN0aW9ucy4KLQotVGhlIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uIGRlY29kZSBhbmQgZXhlY3V0ZSBmdW5jdGlvbnMgaXMgY29udHJvbGxlZAotYnkgYW4gb3Bjb2RlIHRhYmxlLiAgSXQgc3BlY2lmaWVzOiB0aGUgY29tYmluYXRpb24gb2Ygc3dpdGNoCi1zdGF0ZW1lbnRzIGFuZCBqdW1wIHRhYmxlcyB0byB1c2Ugd2hlbiBkZWNvZGluZyBhbiBpbnN0cnVjdGlvbiBhbmQgaG93Ci1tdWNoIG9mIGVhY2ggaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGRlY29kZWQgYmVmb3JlIGNhbGxpbmcgdGhlCi1pbnN0cnVjdGlvbiBleGVjdXRlIGZ1bmN0aW9uLgotCi1QU0lNIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG9wY29kZSB0YWJsZXM6Ci0KLQlwc2ltLW9wY29kZS1zaW1wbGUKLQkJR2VuZXJhdGVzIGEgc21hbGwgY29tcGFjdCB0d28gbGV2ZWwgc3dpdGNoIHN0YXRlbWVudAotCQl0aGF0IHdpbGwgY29tcGlsZSBxdWlja2x5IGFuZCBydW4gcmVhc29uYWJseSBmYXN0LgotCi0JCVRoaXMgbWF5IGJlIHVzZWZ1bCBvbiBhIHNtYWxsIG1hY2hpbmUuCi0KLQlwc2ltLW9wY29kZS1jb21wbGV4Ci0JCSh0aGUgZGVmYXVsdCkgQSBmYWlybHkgYWdncmVzc2l2ZSBpbnN0cnVjdGlvbiBkZWNvZGUKLQkJdGFibGUgdGhhdCBpbmNsdWRlcyB0aGUgYnJlYWtpbmcgb3V0IG9mIGEgbnVtYmVyCi0JCW9mIHNwZWNpYWwgaW5zdHJ1Y3Rpb24gY2FzZXMgKGVnIFJBPT0wIHZzIFJBIT0wKS4KLQotCXBzaW0tb3Bjb2RlLWZsYXQKLQkJSWRlbnRpY2FsIHRvIGNvbXBsZXggZXhjZXB0IGEgc3dpdGNoIHN0YXRlbWVudAotCQlpcyB1c2VkLiAgSWRlYWwgZm9yIHdoZW4gdGhlIGljYWNoZSBpcyBiZWluZwotCQlkaXNhYmxlZC4KLQotCXBzaW0tb3Bjb2RlLXN0dXBpZAotCQlJbiBhZGRpdGlvbiB0byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcyBwZXJmb3JtZWQKLQkJYnkgcHNpbS1vcGNvZGUtY29tcGxleCwgdGhpcyBhbHNvIGZ1bGwgZGVjb2RlcyBtdHNwciwKLQkJbWZzcHIsIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgVGhlIHRhYmxlIGdlbmVyYXRlZAotCQlpcyB2ZXJ5IGxhcmdlIGFuZCwgYXMgYSBjb25zZXF1ZW5jZSwgb25seSBwZXJmb3JtcwotCQl3ZWxsIG9uIG1hY2hpbmVzIHdpdGggbGFyZ2UgY2FjaGVzLgotCi0JcHBjLW9wY29kZS10ZXN0LTEKLQlwcGMtb3Bjb2RlLXRlc3QtMgotCQlHZW5lcmF0ZSB0ZXN0IChidXQgd29ya2FibGUpIHRhYmxlcy4gIFRoZXNlIGV4ZXJjaXNlCi0JCVBTSU0ncyBhYmlsaXR5IHRvIGdlbmVyYXRlIGluc3RydWN0aW9uIGRlY29kZSBmdW5jdGlvbnMKLQkJdGhhdCBhcmUgYSBjb21iaW5hdGlvbiBvZiBqdW1wLXRhYmxlcyBhbmQgc3dpdGNoIHN0YXRlbWVudHMuCi0KLVRoZSBwcm9ncmFtIGlnZW4gZ2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0YWJsZXMgZnJvbSB0aGUgb3Bjb2RlCi10YWJsZSBhbmQgdGhlIHBwYy1pbnN0cnVjdGlvbiB0YWJsZS4KLQotCi0KLS0tZW5hYmxlLXNpbS1zd2l0Y2gKLQotCi1FbmFibGUvZGlzYWJsZSB0aGUgdXNlIG9mIGEgc3dpdGNoIHN0YXRlbWVudCB3aGVuIGxvb2tpbmcgdXAgdGhlCi1hdHRyaWJ1dGVzIG9mIGEgU1BSIHJlZ2lzdGVyLgotCi1UaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIG51bWJlciBvZiBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXJzCi0oU1BSJ3MpLiAgQXNzb2NpYXRlZCB3aXRoIGVhY2ggb2YgdGhlc2UgcmVnaXN0ZXJzIGFyZSBhIG51bWJlciBvZgotYXR0cmlidXRlcyAoc3VjaCBhcyB2YWxpZGl0eSBvciBzaXplKSB3aGljaCB0aGUgaW5zdHJ1Y3Rpb25zCi1tdHNwci9tZnNwciBxdWVyeSBhcyBwYXJ0IG9mIHRoZWlyIGV4ZWN1dGlvbi4KLQotRm9yIFBTSU0sIHRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCBpbiBhIHRhYmxlIChwcGMtc3ByLXRhYmxlKS4gIFRoZQotcHJvZ3JhbSBkZ2VuIGNvbnZlcnRzIHRoaXMgdGFibGUgaW50byBsb29rdXAgcm91dGluZXMgKGNvbnRhaW5lZCBpbgotdGhlIGdlbmVyYXRlZCBmaWxlcyBzcHJlZy5oIHNwcmVnLmMpIHRoYXQgY2FuIGJlIHVzZWQgdG8gcXVlcnkgYW4KLVNQUidzIGF0dHJpYnV0ZXMuICBUaG9zZSBsb29rdXAgcm91dGluZXMgYXJlIGVpdGhlciBpbXBsZW1lbnRlZCBhcwotYSB0YWJsZSBvciBhbHRlcm5hdGl2ZWx5IGFzIGEgbnVtYmVyIG9mIHN3aXRjaCBzdGF0ZW1lbnRzOgotCi0Jc3ByX3RhYmxlIHNwcl9pbmZvW10gPSB7IC4uLi4gfTsKLQlpbnQgc3ByX2xlbmd0aChzcHJzIHNwcikgeyByZXR1cm4gc3ByX2luZm9bc3ByXS5sZW5ndGg7IH0KLQotdnMKLQotCWludCBzcHJfbGVuZ3RoKHNwcnMgc3ByKSB7IHN3aXRjaCAoc3ByKSB7IGNhc2UgLi46IHJldHVybiAuLjsgfSB9Ci0KLUluIGdlbmVyYWwgdGhlIGZpcnN0IGltcGxlbWVudGF0aW9uIChhIHRhYmxlKSBpcyB0aGUgbW9zdCBlZmZpY2llbnQuCi1JdCBtYXksIGhvd2V2ZXIsIHByb3ZlIHRoYXQgd2hlbiBwZXJmb3JtaW5nIGFuIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uCi13aGVyZSBib3RoIHRoZSBTUFIgaXMga25vd24gYW5kIHRoZSBhYm92ZSBmdW5jdGlvbiBpcyBiZWluZyBpbmxpbmVkCi0od2l0aCB0aGUgY29uc2VxdWVuY2UgdGhhdCBHQ0MgY2FuIGVsaW1pbmF0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCkKLXRoYXQgdGhlIHNlY29uZCBjaG9pY2UgaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCi0KLUluIHByYWN0aWNlLCBvbmx5IGEgbWFyZ2luYWwgKGlmIGFueSBiZW5lZml0KSBoYXMgZXZlciBiZWVuIHNlZW4uCi0KLQotCi0tLWVuYWJsZS1zaW0tZHVwbGljYXRlCi0KLQotQ3JlYXRlIGEgZHVwbGljYXRlIGNvcHkgb2YgZWFjaCBpbnN0cnVjdGlvbiBmdW5jdGlvbiBoYXJkd2lyaW5nCi1pbnN0cnVjdGlvbiBmaWVsZHMgdGhhdCB3b3VsZCBoYXZlIG90aGVyd2lzZSBoYXZlIGJlZW4gdmFyaWFibGUuCi0KLUFzIGRpc2N1c3NlZCBhYm92ZSwgaWdlbiBvdXRwdXRzIGEgQyBmdW5jdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgZmlsZQotcHBjLWluc3RydWN0aW9ucyAodXNpbmcgdGhlIG9wY29kZSBydWxlcykgZm9yIGVhY2ggb2YgdGhlCi1pbnN0cnVjdGlvbnMuICBUaHVzIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlIGluc3RydWN0aW9uIGRlY29kZSB0YWJsZXMKLW1heSBiZSBwb2ludGluZyBiYWNrIGF0IHRoZSBzYW1lIGZ1bmN0aW9uLiAgRW5hYmxpbmcgZHVwbGljYXRlLCB3aWxsCi1yZXN1bHQgaW4gcHNpbSBjcmVhdGluZyBhIGR1cGxpY2F0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24ncyBmdW5jdGlvbiBmb3IKLWVhY2ggZGlmZmVyZW50IGVudHJ5IGluIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgdGFibGVzLgotCi1Gb3IgaW5zdGFuY2UsIGdpdmVuIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb246Ci0KLQkwLjE5LDYuQk8sMTEuQkksMTYuLywyMS41MjgsMzEuTEsKLQkuLi4KLQlpZiAoTEspIExSID0gKHNwcmVnKUlFQShDSUEgKyA0KTsKLQkuLi4KLQotaWdlbiBhcyBwYXJ0IG9mIGl0cyBpbnN0cnVjdGlvbiBsb29rdXAgdGFibGUgbWF5IGhhdmUgZ2VuZXJhdGVkIHR3bwotZGlmZmVyZW50IGVudHJpZXMgLSBvbmUgZm9yIExLPTAgYW5kIG9uZSBmb3IgTEs9MS4gIFdpdGggZHVwbGljYXRlCi1lbmFibGVkLCBpZ2VuIG91dHB1dHMgKGFsbW9zdCkgZHVwbGljYXRlIGNvcGllcyBvZiBicmFuY2ggZnVuY3Rpb24sCi1vbmUgd2l0aCBMSyBoYXJkd2lyZWQgdG8gMCBhbmQgb25lIHdpdGggTEsgaGFyZHdpcmVkIHRvIDEuCi0KLUJ5IGRvaW5nIHRoaXMgdGhlIGNvbXBpbGVyIGlzIHByb3ZpZGVkIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0Ci13aWxsIGFsbG93IGl0IHBvc3NpYmx5IGVsaW1pbmF0ZSBkZWFkIGNvZGUuICAoc3VjaCBhcyB0aGUgYXNzaWdubWVudAotdG8gTEsgaWYgTFI9PTApLgotCi1FeDogZGVmYXVsdAotCi1CZWNhdXNlIHRoaXMgZmVhdHVyZSBpcyBzdWNoIGEgYmlnIHdpbiwgLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBpcwotdHVybmVkIG9uIGJ5IGRlZmF1bHQuCi0KLUV4OiBBIHNtYWxsIG1hY2hpbmUKLQotT25seSByYXJlbHkgKGVnIG9uIGEgdmVyeSBzbWFsbCBob3N0KSB3b3VsZCB0aGlzIGZlYXR1cmUgbmVlZCB0byBiZQotZGlzYWJsZWQgKHVzaW5nOiAtLWRpc2FibGUtc2ltLWR1cGxpY2F0ZSkuCi0KLQotCi0tLWVuYWJsZS1zaW0tZmlsdGVyPXJ1bGUKLQotCi1JbmNsdWRlL2V4Y2x1ZGUgUG93ZXJQQyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyCi1pbXBsZW1lbnRhdGlvbi4KLQotU29tZSBvZiB0aGUgUG93ZXJQQyBpbnN0cnVjdGlvbnMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgcHBjLWluc3RydWN0aW9ucwotYXJlIGxpbWl0ZWQgdG8gY2VydGFpbiBzcGVjaWZpYyBQUEMgaW1wbGVtZW50YXRpb25zLiAgRm9yIGluc3RhbmNlLAotdGhlIGluc3RydWN0aW9uOgotCi0JMC41OCw2LlJULDExLlJBLDE2LkRTLDMwLjI6RFM6NjQ6OkxvYWQgV29yZCBBbGdlYnJhaWMKLQotSXMgb25seSB2YWxpZCBmb3IgdGhlIDY0Yml0IGFyY2hpdGVjdHVyZS4gIFRoZSBlbmFibGUtc2ltLWZpbHRlciBmbGFnCi1pcyBwYXNzZWQgdG8gaWdlbiBzbyB0aGF0IGl0IGNhbiBgZmlsdGVyIG91dCcgYW55IGludmFsaWQKLWluc3RydWN0aW9ucy4gIFRoZSBmaWx0ZXIgcnVsZSBoYXMgdGhlIGZvcm06Ci0KLQktZiA8bmFtZT4KLQotdGh1czoKLQotCS0tZW5hYmxlLXNpbS1maWx0ZXI9Jy1mIDY0JwotCi0odGhlIGRlZmF1bHQpIHdvdWxkIGZpbHRlciBvdXQgYWxsIDY0Yml0IGluc3RydWN0aW9ucy4KLQotRXg6IFJlbW92ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLQotQSBnaXZlbiAzMmJpdCBQb3dlclBDIGltcGxlbWVudGF0aW9uIG1heSBub3QgaW5jbHVkZSBmbG9hdGluZyBwb2ludAotaGFyZHdhcmUuICBDb25zZXF1ZW50bHkgdGhlcmUgaXMgbGl0dGxlIHBvaW50IGluIGluY2x1ZGluZyBmbG9hdGluZwotcG9pbnQgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gIFRoZSBvcHRpb246Ci0KLQktLWVuYWJsZS1zaW0tZmlsdGVyPSctZiA2NCAtZiBmJwotCi13aWxsIGVsaW1pbmF0ZSBhbGwgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGluc3RydWN0aW9uCi10YWJsZS4KLQotCi0KLS0tZW5hYmxlLXNpbS1pY2FjaGU9c2l6ZQotCi0KLVNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgdXNlZCB0byBob2xkIGRlY29kZWQgaW5zdHJ1Y3Rpb25zLgotCi1Qc2ltIGV4ZWN1dGVzIGluc3RydWN0aW9ucyBpbiB0d28gc2VwYXJhdGUgc3RlcHM6Ci0KLQlvCWluc3RydWN0aW9uIGZldGNoL2RlY29kZQotCi0JbwlpbnN0cnVjdGlvbiBleGVjdXRpb24KLQotRm9yIGEgZ2l2ZW4gaW5zdHJ1Y3Rpb24sIHRoZSBmaXJzdCBzdGFnZSBuZWVkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZQotKHRoZSBmaXJzdCB0aW1lIHRoZSBpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZCkgd2hpbGUgdGhlIHNlY29uZCBzdGFnZQotbXVzdCBiZSBleGVjdXRlZCBldmVyeSB0aW1lIHRoZSBwcm9ncmFtIGBleGVjdXRlcycgdGhhdCBpbnN0cnVjdGlvbi4KLQotRXhwbG9pdGluZyB0aGlzLCBQU0lNIGNhbiBtYWludGFpbiBhIGNhY2hlIG9mIGRlY29kZWQgaW5zdHJ1Y3Rpb25zLgotSXQgd2lsbCB0aGVuIHVzZSB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBmcm9tIHRoZSBjYWNoZSBpbiBwcmVmZXJlbmNlCi10byBmZXRjaGluZy9kZWNvZGluZyB0aGUgcmVhbCBpbnN0cnVjdGlvbiBmcm9tIG1lbW9yeS4KLQotRXg6IGRlZmF1bHQKLQotQmVjYXVzZSB0aGlzIGZlYXR1cmUgaXMgbm9ybWFsbHkgc3VjaCBhIGJpZyB3aW4sIGl0IGlzIGVuYWJsZWQgYnkKLWRlZmF1bHQgKHdpdGggdGhlIGNhY2hlIHNpemUgc2V0IHRvIDEwMjQgZW50cmllcykuCi0KLVRoZSAxMDI0IGVudHJpZXMgZXF1YWxzIDQwOTYgYnl0ZXMgKG9yIG9uZSBwYWdlKSBvZiBpbnN0cnVjdGlvbnMuCi1MYXJnZXIgY2FjaGVzIGNhbiBiZSB1c2VkIGJ1dCB3aXRoIGNhdXRpb24gLSBQU0lNIGRvZXMgbm90IGNoZWNrIGZvcgotYWRkcmVzcyBhbGlhc2luZyB3aXRoaW4gaXRzIGluc3RydWN0aW9uIGNhY2hlLgotCi1FeDogZGlzYWJsZSB0aGUgY2FjaGUKLQotVGhlcmUgbWF5IGJlIGNhc2VzIChmb3IgaW5zdGFuY2Ugd2hlcmUgdGhlIGNhY2hlIGhhcyBhIGxvdyBoaXQgcmF0ZSkKLXdoZXJlIHRoZSBwc2ltIHBlcmZvcm1zIGJldHRlciB3aXRoIG5vIGluc3RydWN0aW9uIGNhY2hlLiAgRm9yIHN1Y2gKLXNpdHVhdGlvbnMsIHRoZSBjYWNoZSBjYW4gYmUgZGlzYWJsZWQgdmlzOiAtLWRpc2FibGUtc2ltLWljYWNoZS4KLQotCi0KLS0tZW5hYmxlLXNpbS1pbmxpbmVbPW1vZHVsZV0KLQotCi1TcGVjaWZ5IHRoZSBpbmxpbmluZyBvZiBvbmUgb3IgbW9yZSBtb2R1bGVzLgotCi1NYW55IGFyY2hpdGVjdHVyZXMgKGluIHBhcnRpY3VsYXIgdGhlIHg4Nikgc3VmZmVyIGZyb20gYSBsYXJnZQotZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4gIEJ5IGVsaW1pbmF0aW5nIGZ1bmN0aW9uIGNhbGxzICh0aHJvdWdoCi1pbmxpbmluZyBvZiBmdW5jdGlvbnMpIGEgbGFyZ2UgcGVyZm9ybWFuY2UgZ2FpbiBjYW4gYmUgYWNoaWV2ZWQuCi0KLUluIFBTSU0sIG1vZHVsZXMgYXJlIGlubGluZWQgaW4gb25lIG9mIHR3byBwb3NzaWJsZSB3YXlzLiAgU29tZQotbW9kdWxlcyAoc3VjaCBhcyB0aGUgYnl0ZSBzd2FwcGluZyBjb2RlKSBjYW4gYmUgaW5saW5lZCBpbnRvIGFueQotbW9kdWxlIHRoYXQgY2FsbHMgdGhlbS4gIE90aGVyIG1vZHVsZXMsIGR1ZSB0byBjb21wbGV4Ci1pbnRlcmRlcGVuZGVuY2llcywgYXJlIG9ubHkgaW5saW5lZCBhcyBhIGdyb3VwIHdoZW4gY29tcGlsaW5nIHRoZQotZXh0ZXJuYWwgaW50ZXJmYWNlIG1vZHVsZSBwc2ltLmMuCi0KLUV4OiBkZWZhdWx0Ci0KLUJ5IGRlZmF1bHQgdGhlIG1vZHVsZXMgZW5kaWFuIChoYW5kbGUgYmUvbGUpLCBiaXRzIChtYW5pcHVsYXRlCi1iaXQtZmllbGRzIHdpdGhpbiB3b3JkcyksIGNwdSAodGhlIHByb2Nlc3NvciBvYmplY3QpIGFuZCBldmVudHMKLSh0aW1lcnMpIGFyZSBpbmxpbmVkIGluIGFueSBtb2R1bGUgdGhhdCBjYWxscyB0aGVtLiAgVGhpcyBnaXZlcyBhCi1yZWFzb25hYmxlIHBlcmZvcm1hbmNlIGdhaW4gd2l0aCBsaXR0bGUgYWRkaXRpb25hbCBjb21waWxhdGlvbgotb3ZlcmhlYWQuCi0KLUV4OiByZWNvbW1lbmRlZCAgLS1lbmFibGUtc2ltLWlubGluZQotCi1Bc3N1bWluZyB5b3UgbWFjaGluZSBpcyByZWFzb25hYmx5IHdlbGwgY29uZmlndXJlZCwgdGhpcyBvcHRpb24gaXMKLWhpZ2hseSByZWNvbW1lbmRlZC4gIE9uIHRoZSB4ODYgc2V2ZXJhbCBvcmRlcnMgb2YgbWFnbml0dWRlCi1pbXByb3ZlbWVudCBpbiBwZXJmb3JtYW5jZSBpcyBwb3NzaWJsZS4KLQotRXg6IGZpbmUgdHVuaW5nCi0KLVRoZSBmaWxlIHN0ZC1jb25maWcuaCBjb250YWlucyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUKLWlubGluaW5nIHdvcmtzLiAgSW5kaXZpZHVhbCBtb2R1bGVzIGNhbiBiZSBpbmxpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlbS4KLUZvciBpZiB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2UgY2FjaGUgdGhlIG1vZGVsIG1vZHVsZSBjb3VsZCBiZSBpbmxpbmVkCi13aXRoOgotCi0JLS1lbmFibGUtc2ltLWlubGluZT1NT0RFTAotCi0KLQotLS1lbmFibGUtc2ltLWJzd2FwCi0KLQotKHg4NiBzcGVjaWZpYykgVXNlIHRoZSBpNDg2L1A1L1A2IGJ5dGUgc3dhcCBpbnN0cnVjdGlvbi4KLQotUFNJTSBjb250YWlucyBnZW5lcmljIGJ5dGUgc3dhcHBpbmcgY29kZS4gIEZvciB0aGUgeDg2IChQWzQtNl0pIFBTSU0KLWNhbiBiZSBidWlsdCBzbyB0aGF0IGl0IHVzZXMgdGhlIGJzd2FwIGluc3RydWN0aW9uIGluc3RlYWQgb2YgcmVseWluZwotb24gdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGJ5dGUgc3dhcCBjb2RlLgotCi1FeDogZGVmYXVsdAotCi1CeSBkZWZhdWx0LCB3aGVuIGNvbXBpbGluZyB3aXRoIEdDQy0yIG9uIGFuIGk0ODYvUDUvUDYgdGhlIGJzd2FwCi1pbnN0cnVjdGlvbiBpcyB1c2VkLgotCi0KLQotLS1lbmFibGUtc2ltLWVuZGlhbj1lbmRpYW4KLQotCi1TcGVjaWZ5IHRoZSBieXRlIG9yZGVyIG9mIHRoZSB0YXJnZXQuCi0KLUJ5IGRlZmF1bHQsIFBTSU0gaXMgYWJsZSB0byBleGVjdXRlIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuCi1leGVjdXRhYmxlcy4gIEFzIGEgY29uc2VxdWVuY2UsIGV2ZXJ5IGJ5dGUgc3dhcCByb3V0aW5lIGluY2x1ZGVzIGEKLXRlc3QgdG8gc2VlIGlmIHRoZSBieXRlIHN3YXAgaXMgcmVhbGx5IG5lZWRlZC4gIEJ5IHNwZWNpZnlpbmcgdGhlIGJ5dGUKLW9yZGVyIG9mIHRoZSB0YXJnZXQgKGFuZCB0aGUgaG9zdCBiZWxvdykgdGhlIG5lZWQgZm9yIHRoaXMgdGVzdCBjYW4gYmUKLWVsaW1pbmF0ZWQuCi0KLUNsZWFybHkgc2V0dGluZyB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgdGFyZ2V0IGlzIG9ubHkgdXNlZnVsIHdoZW4ga25vd24KLWJlZm9yZSBoYW5kLgotCi0KLQotLS1lbmFibGUtc2ltLWhvc3RlbmRhaW49ZW5kCi0KLQotQXMgYWJvdmUgYnV0IGZvciB0aGUgaG9zdC4KLQotTm9ybWFsbHkgdGhpcyBvcHRpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQuIGNvbmZpZ3VyZSAoYXV0b2NvbmYpIHNob3VsZAotZGV0ZXJtaW5lIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0IGF1dG9tYXRpY2FsbHkuICBIb3dldmVyIGlmIGZvcgotc29tZSByZWFzb24gdGhlcmUgaXMgYSBwcm9ibGVtLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZQotYXV0b2NvbmYuCi0KLQotCi0tLWVuYWJsZS1zaW0tc21wPW4KLQotCi1TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvcnMgdGhhdCBQU0lNIGNhbiBtb2RlbC4KLQotUHNpbSBjYW4gbW9kZWwgKHdpdGggc21hbGwgbGltaXRhdGlvbiBkaXNjdXNzZWQgZWxzZSB3aGVyZSkgYQotbXVsdGktcHJvY2Vzc29yIFBvd2VyUEMgZW52aXJvbm1lbnQuICBXaGlsZSB0aGUgb3ZlcmhlYWQgb2YKLWNvLW9yZGluYXRpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIG51bWJlciBvZiBwcm9jZXNzb3JzIGlzIHJlbGF0aXZlbHkKLXNtYWxsIGl0IGlzIHN0aWxsIHNpZ25pZmljYW50IHdoZW4gY29tcGFyZWQgdG8gaGFuZGxpbmcgb25seSBvbmUKLXByb2Nlc3Nvci4KLQotVGhpcyBvcHRpb24gb25seSBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQgY2FuIGJlCi1zaW11bGF0ZWQuICBUaGUgbnVtYmVyIGFjdGl2ZSBkdXJpbmcgYSBnaXZlbiBzaW11bGF0aW9uIHJ1biB1cwotZGV0ZXJtaW5lZCBhdCBydW4gdGltZS4KLQotRXg6IGRlZmF1bHQKLQotQnkgZGVmYXVsdCA1IHByb2Nlc3NvcnMgYXJlIGNvbmZpZ3VyZWQgYnV0IG9ubHkgb25lIGlzIGVuYWJsZWQuCi1BZGRpdGlvbmFsIHByb2Nlc3NvcnMgY2FuIGJlIGVuYWJsZWQgd2l0aCB0aGUgcnVudGltZSBvcHRpb246Ci0KLQktbyAnL29wZW5wcm9tL29wdGlvbnMvc21wIDUnCi0KLUV4OiByZWNvbW1lbmRlZAotCi1Vbmxlc3MgeW91IGludGVuZCBzdHVkeWluZyBtdWx0aS1wcm9jZXNzb3Igc3lzdGVtcyB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIGZvcgotaGF2aW5nIFBTSU0gY29uZmlndXJlZCB3aXRoIFNNUCBzdXBwb3J0LiAgU3BlY2lmeWluZzoKLQotCS0tZGlzYWJsZS1zaW0tc21wCi1vcgktLWVuYWJsZS1zaW0tc21wPTAKLQotd2lsbCBlbGltaW5hdGUgYW55IFNNUCBzdWNoIGFzOgotCi0JZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVzOyBjcHUrKykKLQkJLi4uCi0KLQotCi0tLWVuYWJsZS1zaW0teG9yLWVuZGlhbj1uCi0KLQotU2V0IHRoZSBieXRlLXNpemUgb2YgdGhlIGJ1cyBpbnZvbHZlZCBpbiB0aGUgUG93ZXJQQydzIHhvciBlbmRpYW4gYnl0ZQotc3dhcHBpbmcuCi0KLVRoZSBQb3dlclBDJ3MgaW1wbGVtZW50YXRpb24gb2YgQkUvTEUgbW9kZSBpcyBkaWZmZXJlbnQgdG8gd2hhdCBhCi1wcm9ncmFtbWVyIG1heSBmaXJzdCBleHBlY3QuICBUaGUgZGV0YWlscyBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGFyZQotZGlzY3Vzc2VkIGF0IGxlbmd0aCBpbiBQb3dlclBDIGRvY3VtZW50YXRpb24uCi0KLUV4OiBkZWZhdWx0Ci0KLUJ5IGRlZmF1bHQgdGhpcyBpcyBjb25maWd1cmVkIHdpdGggYSB2YWx1ZSBvZiA4ICh0aGUgYnVzIHNpemUgb2YgbW9zdAotNjB4IHByb2Nlc3NvcnMpLgotCi1FeDogcmVjb21tZW5kZWQKLQotVW5sZXNzIHlvdSBhcmUgZXhwZWN0aW5nIHRvIHRlc3QvZGVidWcgUG93ZXJQQyBiZS9sZSBzd2l0Y2hpbmcgY29kZQotdGhpcyBvcHRpb24gaXMgb2YgbGl0dGxlIHVzZSBhbmQgc2hvdWxkIGJlIGRpc2FibGVkOgotCi0JLS1kaXNhYmxlLXNpbS14b3ItZW5kaWFuCi0KLQotCi0tLWVuYWJsZS1zaW0tYml0c2l6ZT1uCi0KLQotU3BlY2lmeSB0aGUgYml0IHNpemUgKDMyLzY0KSBvZiB0aGUgUG93ZXJQQyB0byBiZSBtb2RlbGxlZC4KLQotTm90ZTogQnkgZGVmYXVsdCAzMiBpcyBzcGVjaWZpZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDY0Yml0Ci1hcmNoaXRlY3R1cmUgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQuCi0KLQotLS1lbmFibGUtc2ltLWhvc3RiaXRzaXplPTMyfDY0Ci0KLUFzIGFib3ZlIGJ1dCBmb3IgdGhlIGhvc3QuCi0KLU5PVEU6IFBzaW0gaGFzIHlldCB0byBiZSBidWlsdCBvbiBhIDY0Yml0IGhvc3QuCi0KLQotCi0tLWVuYWJsZS1zaW0tZW52PWVudgotCi0KLUhhcmR3aXJlIHRoZSBQb3dlclBDIGVudmlyb25tZW50IGJlaW5nIG1vZGVsbGVkICh1c2VyLCB2aXJ0dWFsIG9yCi1vcGVyYXRpbmcpLgotCi1UaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUgZGVmaW5lcyB0aHJlZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIGNvbXBsaWFuY2UgdG8gaXRzCi1hcmNoaXRlY3R1cmFsIHNwZWNpZmljYXRpb24uICBUaGVzZSBlbnZpcm9ubWVudHMgYXJlIGRpc2N1c3NlZCBpbiBkZXRhaWwgaW4KLVBvd2VyUEMgcHVibGljYXRpb25zLgotCi0JdXNlciAtIG5vcm1hbCB1c2VyIHByb2dyYW1zIAotCXZpcnR1YWwgLSBhbiBleHRlbnNpb24gb2YgdGhlIHVzZXIgZW52aXJvbm1lbnQgKGluY2x1ZGVzIHRpbWVycykKLQlvcGVyYXRpbmcgLSBrZXJuZWwgY29kZQotCi1FeDogZGVmYXVsdAotCi1CeSBkZWZhdWx0IGFsbCB0aHJlZSBlbnZpcm9ubWVudHMgYXJlIHN1cHBvcnRlZC4KLQotRXg6IHJlY29tbWVuZGVkCi0KLUlmIHlvdSBvbmx5IGludGVuZCBydW5uaW5nIHBzaW0gd2l0aCB1c2VyIChvciBvcGVyYXRpbmcpIGNvZGUgdGhlbgotUFNJTSBzaG91bGQgYmUgY29uZmlndXJlZCBhY2NvcmRpbmdseS4gIEZvciB1c2VyIGNvZGUsIGl0IGVsaW1pbmF0ZXM6Ci1zdXBwb3J0IGZvciB0aW1lcnMgYW5kIGV2ZW50cyBhbmQgcmVkdW5kYW50IFZNIGNhbGxzLgotCi0KLQotLS1lbmFibGUtc2ltLXRpbWViYXNlCi0KLQotRW5hYmxlL2Rpc2FibGUgdGhlIHRpbWUgYmFzZSByZWdpc3Rlci4KLQotVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlICh2aXJ0dWFsIGVudmlyb25tZW50KSBpbmNsdWRlcyBhIHRpbWUgYmFzZQotcmVnaXN0ZXIuICBNYWludGFpbmluZyB0aGF0IHJlZ2lzdGVyIGluY3VycyBhbiBvdmVyaGVhZCBpbgotcGVyZm9ybWFuY2UgdGhhdCBjYW4gYmUgZWxpbWluYXRlZCBieSBlbGltaW5hdGluZyB0aW1lLWJhc2UgcmVnaXN0ZXIKLXN1cHBvcnQuCi0KLUV4OiBkZWZhdWx0Ci0KLU5vcm1hbGx5IHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLiAgSW5zdGVhZCAtLWVuYWJsZS1zaW0tZW52IChhYm92ZSkgdXMKLXVzZWQgdG8gZGlzYWJsZS9lbmFibGUgZmVhdHVyZXMgc3VjaCBhcyB0aGUgdGltZWJhc2UgcmVnaXN0ZXIuCi0KLQotCi0tLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCi0KLQotQ29udHJvbCB0aGUgUG93ZXJQQydzIG1lbW9yeSBhY2Nlc3MgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4KLQotVGhlIFBvd2VyUEMgaW4gTEUgbW9kZSBvbmx5IGFsbG93cyBtZW1vcnkgdHJhbnNmZXJzIG9mIGEgY29ycmVjdGx5Ci1hbGlnbmVkIHNpemUvYWRkcmVzcy4gIFRoZSBhYm92ZSBvcHRpb24gY29udHJvbHMgaG93IG1pc2FsaWduZWQKLWFjY2Vzc2VzIGFyZSBoYW5kbGVkLgotCi0Jc3RyaWN0CQlBbGwgYWNjZXNzZXMgbXVzdCBiZSBjb3JyZWN0bHkgYWxpZ25lZAotCi0Jbm9uc3RyaWN0CVVuYWxpZ25lZCBhY2Nlc3MgYWxsb3dlZCAodGhlIGFyZSBzcGxpdAotCQkJaW50byBhIG51bWJlciBvZiBhbGlnbmVkIGFjY2Vzc2VzKS4KLQotRXg6IGRlZmF1bHQKLQotVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgUFNJTSB3aWxsIGF1dG8gY29uZmlndXJlIGEgQkUgcHJvZ3JhbSB0bwotYWxsb3cgbWlzcy1hbGlnbmVkIGFjY2Vzc2VzIHdoaWxlIGEgTEUgcHJvZ3JhbSB3aWxsIG5vdC4KLQotRXg6IDYwNGUKLQotVGhlIHJlY2VudGx5IGFubm91bmNlZCA2MDRlIHByb2Nlc3NvciBhbGxvd3MgbWlzcy1hbGlnbmVkIGFjY2Vzc2VzIGluIGJvdGgKLUJFIGFuZCBMRSBtb2Rlcy4gIElmIG1vZGVsaW5nIHRoZSA2MDRlIHRoZW4geW91IHNob3VsZCBzcGVjaWZ5OgotCi0JLS1lbmFibGUtc2ltLWFsaWdubWVudD1ub25zdHJpY3QKLQotCi0KLS0tZW5hYmxlLXNpbS10cmFjZQotCi0KLUluY2x1ZGUgY29kZSB0byB0cmFjZSBQU0lNJ3MgaW50ZXJuYWwgcHJvZ3Jlc3MgKGFsc28gY29udHJvbGxlZCBieSB0aGUKLS10IG9wdGlvbikuCi0KLUNoZWNraW5nIHRvIHNlZSBpZiBhIHRyYWNlIG1lc3NhZ2Ugc2hvdWxkIGJlIG91dHB1dCBzbG93cyBkb3duIGEKLXNpbXVsYXRpb24uICBEaXNhYmxpbmcgdGhpcyBvcHRpb24gKC0tZGlzYWJsZS1zaW0tdHJhY2UpIGVsaW1pbmF0ZXMKLWNvbXBsZXRlbHkgdGhhdCBjb2RlLgotCi0KLQotLS1lbmFibGUtc2ltLWFzc2VydAotCi0KLUluY2x1ZGUgdGhlIGNvZGUgdGhhdCBjaGVja3MgdGhlIGNvcnJlY3RuZXNzIG9mIHBhcnRzIG9mIFBTSU0uCi0KLUVsaW1pbmF0aW5nIHN1Y2ggY29kZSAoLS1kaXNhYmxlLXNpbS1hc3NlcnQpIGVsaW1pbmF0ZXMgaW50ZXJuYWwKLWNvbnNpc3RlbmN5IHRlc3RzIGFuZCB0aGVpciBvdmVyaGVhZC4KLQotCi0KLS0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCi0KLQotSW5jbHVkZSBjb2RlIHRvIGNoZWNrIHRoYXQgdGhlIHJlc2VydmVkIGZpZWxkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlCi16ZXJvLgotCi1UaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUgZGVmaW5lcyBjZXJ0YWluIGZpZWxkcyBvZiBzb21lIGluc3RydWN0aW9ucwotYXMgcmVzZXJ2ZWQgKGAvJykuICBCeSBkZWZhdWx0LCBmb3IgZWFjaCBpbnN0cnVjdGlvbiwgUFNJTSB3aWxsIGNoZWNrCi10aGUgcmVzZXJ2ZWQgZmllbGRzIGNhdXNpbmcgYW4gaW52YWxpZCBpbnN0cnVjdGlvbiBleGNlcHRpb24gaWYgYQotZmllbGQgaXMgaW52YWxpZC4gIERpc2FibGluZyB0aGlzIG9wdGlvbiBlbGltaW5hdGVzIHRoaXMgdGVzdC4gIFRoaXMKLWlzIGF0IHRoZSBzbGlnaHQgcmlzayBvZiBQU0lNIHRyZWF0aW5nIGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24gYXMKLXZhbGlkLgotCi0KLQotLS1lbmFibGUtc2ltLWZsb2F0Ci0KLQotSW5jbHVkZSBzdXBwb3J0IGZvciBoYXJkd2FyZSBmbG9hdGluZyBwb2ludC4KLQotCi0KLS0tZW5hYmxlLXNpbS1tb25pdG9yPW1vbgotCi0KLUluY2x1ZGUgc3VwcG9ydCBmb3IgYmFzaWMgaW5zdHJ1Y3Rpb24gY291bnRpbmcuCi0KLUlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIHBlcmZvcm1hbmNlIG9mIGVpdGhlciB5b3UgcHJvZ3JhbSBvcgotdGhlIHNpbXVsYXRvciB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbi4KLQotCi0KLS0tZW5hYmxlLXNpbS1tb2RlbD13aGljaAotCi1IYXJkd2lyZSB0aGUgcHJvY2Vzc29yIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHdoZW4gbW9kZWxpbmcKLWV4ZWN1dGlvbiB1bml0cy4KLQotCi0KLS0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPXdoaWNoCi0KLQotU3BlY2lmeSB0aGUgcHJvY2Vzc29yIG9mIGNob2ljZSBmb3IgdGhlIGV4ZWN1dGlvbiB1bml0IG1vZGVsLgotCi0KLQotLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlCi0KLQotSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgbW9kZWxpbmcgb2YgcHJvY2Vzc29yIGV4ZWN1dGlvbiB1bml0cy4KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVFlQSUNBTCBDT05GSUdVUkFUSU9OIE9QVElPTlM6Ci0KLQotCVZFQSBDT0RFIE9OTFk6Ci0KLQlIZXJlIG9mIG5vdGUgYXJlOgotCi0JCW8JcmFtcCB1cCB0aGUgY29tcGlsZXIgb3B0aW9ucyAoc29tZQotCQkJb2YgdGhlIGJlbG93IGFyZSBQNSBzcGVjaWZpYykuCi0KLQkJbwlkaXNhYmxlIGFueXRoaW5nIG5vdCB1c2VkCi0KLSAgICAgICAgQ0M9Z2NjIC4vY29uZmlndXJlIFwKLSAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0gXAotICAgICAgICAgICAgICAgIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpIFwKLSAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0tcG93ZXJwYyBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLXdhcm5pbmdzIFwKLSAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0taW5saW5lIFwKLSAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXNtcCBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWVuZGlhbj1iaWcgXAotICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0teG9yLWVuZGlhbiBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWVudj11c2VyIFwKLSAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXJlc2VydmVkLWJpdHMgXAotICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0tYXNzZXJ0IFwKLSAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXRyYWNlIFwKLSAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0tY2ZsYWdzPSctZzAsLU8yLC1mbm8tc3RyZW5ndGgtcmVkdWNlLC1mb21pdC1mcmFtZS1wb2ludGVyJwotCi0KLQlPRUEgQ09ERSBPTkxZOgotCi0JVGhlIGtleSBjb25maWd1cmF0aW9uIGNoYW5nZXMgYXJlOgotCi0JCW8JdHVybiBvZmYgdGhlIGluc3RydWN0aW9uIGNhY2hlLiAgVGhlIG92ZXJoZWFkCi0JCQlvZiBmbHVzaGluZyBhbmQgcmVsb2FkaW5nIGl0IGlzIGdyZWF0ZXIgdGhhbgotCQkJbm90IGhhdmluZyBhIGNhY2hlLgotCi0JCW8JdXNlIGEgc3dpdGNoIHN0YXRlbWVudCAocHBjLW9wY29kZS1mbGF0KSBmb3IKLQkJCXRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgYW5kIHRoZW4gKC1PMykgZnVsbHkKLQkJCWlubGluZSBhbGwgZnVuY3Rpb25zLgotCi0JCW8JLS1lbmFibGUtc2ltLXdhcm5pbmdzIGlzIG5vdCBwcmVzZW50LiAgR0NDICgyLjcuMikKLQkJCWdldHMgY29uZnVzZWQgYnkgdGhlIGluc3RydWN0aW9uIGRlY29kZSB0YWJsZQotCQkJZ2VuZXJhdGVkIGJ5IGlnZW4gKGNvbnRhaW5zIGEgcGVyZmVjdCBzd2l0Y2gpCi0JCQlhbmQsIGFzIGEgY29uc2VxdWVuY2UsIGdlbmVyYXRlcyBhIGJvZ3VzIHdhcm5pbmcuCi0KLQlDQz1nY2MgLi9jb25maWd1cmUgXAotICAgICAgICAgICAgICAgIC0tcHJlZml4PS9hcHBsaWNhdGlvbnMvcHNpbSBcCi0gICAgICAgICAgICAgICAgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAotICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1wb3dlcnBjIFwKLSAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0taW5saW5lIFwKLSAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXNtcCBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWVuZGlhbj1iaWcgXAotICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0teG9yLWVuZGlhbiBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWVudj1vcGVyYXRpbmcgXAotICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBcCi0gICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS1hc3NlcnQgXAotICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0tdHJhY2UgXAotICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1vcGNvZGU9cHBjLW9wY29kZS1mbGF0IFwKLSAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLWljYWNoZSBcCi0gICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWNmbGFncz0nLWcwLC1PMywtZm5vLXN0cmVuZ3RoLXJlZHVjZSwtZm9taXQtZnJhbWUtcG9pbnRlcicKZGlmZiAtLWdpdCBhL3NpbS9wcGMvTWFrZWZpbGUuaW4gYi9zaW0vcHBjL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJiMzEwLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi1kZWZhdWx0OiBhbGwKLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXNyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4KLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotYmluZGlyID0gQGJpbmRpckAKLWxpYmRpciA9IEBsaWJkaXJACi10b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQotCi1kYXRhZGlyID0gQGRhdGFkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotCi0jIFRoaXMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGdldHRleHQgY29uZmlndXJhdGlvbiBjb2RlLgotdG9wX2J1aWxkZGlyID0gLi4KLQotRVhFRVhUID0gQEVYRUVYVEAKLVNIRUxMID0gL2Jpbi9zaAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQVIgPSBAQVJACi1BUl9GTEFHUyA9IHJjCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQklTT04gPSBiaXNvbgotTUFLRUlORk8gPSBtYWtlaW5mbwotUkFOTElCID0gQFJBTkxJQkAKLQotU0lNX0NGTEFHUyA9IEBzaW1fY2ZsYWdzQAotSU5MSU5FX0NGTEFHUyA9IEBzaW1faW5saW5lQAotQlNXQVBfQ0ZMQUdTID0gQHNpbV9ic3dhcEAKLUVORElBTl9DRkxBR1MgPSBAc2ltX2VuZGlhbkAKLVJFR1BBUk1fQ0ZMQUdTID0gQHNpbV9yZWdwYXJtQAotU1REQ0FMTF9DRkxBR1MgPSBAc2ltX3N0ZGNhbGxACi1IT1NURU5ESUFOX0NGTEFHUyA9IEBzaW1faG9zdGVuZGlhbkAKLVNNUF9DRkxBR1MgPSBAc2ltX3NtcEAKLVhPUl9FTkRJQU5fQ0ZMQUdTID0gQHNpbV94b3JfZW5kaWFuQAotQklUU0laRV9DRkxBR1MgPSBAc2ltX2JpdHNpemVACi1IT1NUQklUU0laRV9DRkxBR1MgPSBAc2ltX2hvc3RiaXRzaXplQAotRU5WX0NGTEFHUyA9IEBzaW1fZW52QAotVElNRUJBU0VfQ0ZMQUdTID0gQHNpbV90aW1lYmFzZUAKLUFMSUdOTUVOVF9DRkxBR1MgPSBAc2ltX2FsaWdubWVudEAKLUZMT0FUX0NGTEFHUyA9IEBzaW1fZmxvYXRACi1UUkFDRV9DRkxBR1MgPSBAc2ltX3RyYWNlQAotQVNTRVJUX0NGTEFHUyA9IEBzaW1fYXNzZXJ0QAotUkVTRVJWRURfQ0ZMQUdTID0gQHNpbV9yZXNlcnZlZEAKLU1PTklUT1JfQ0ZMQUdTID0gQHNpbV9tb25pdG9yQAotTU9ERUxfQ0ZMQUdTID0gQHNpbV9tb2RlbEAgQHNpbV9kZWZhdWx0X21vZGVsQCBAc2ltX21vZGVsX2lzc3VlQAotU1RESU9fQ0ZMQUdTID0gQHNpbV9zdGRpb0AKLVRFUk1JT19DRkxBR1MgPSBAc2ltX3Rlcm1pb0AKLVdBUk5JTkdfQ0ZMQUdTID0gQHNpbV93YXJuaW5nc0AKLURFVlpFUk9fQ0ZMQUdTID0gQHNpbV9kZXZ6ZXJvQAotQ09ORklHX0NGTEFHUyA9ICQoQlNXQVBfQ0ZMQUdTKSBcCi0gICQoRU5ESUFOX0NGTEFHUykgXAotICAkKFJFR1BBUk1fQ0ZMQUdTKSBcCi0gICQoU1REQ0FMTF9DRkxBR1MpIFwKLSAgJChIT1NURU5ESUFOX0NGTEFHUykgXAotICAkKFNNUF9DRkxBR1MpIFwKLSAgJChYT1JfRU5ESUFOX0NGTEFHUykgXAotICAkKEJJVFNJWkVfQ0ZMQUdTKSBcCi0gICQoSE9TVEJJVFNJWkVfQ0ZMQUdTKSBcCi0gICQoRU5WX0NGTEFHUykgXAotICAkKFRJTUVCQVNFX0NGTEFHUykgXAotICAkKEFMSUdOTUVOVF9DRkxBR1MpIFwKLSAgJChGTE9BVF9DRkxBR1MpIFwKLSAgJChUUkFDRV9DRkxBR1MpIFwKLSAgJChBU1NFUlRfQ0ZMQUdTKSBcCi0gICQoUkVTRVJWRURfQ0ZMQUdTKSBcCi0gICQoTU9OSVRPUl9DRkxBR1MpIFwKLSAgJChNT0RFTF9DRkxBR1MpIFwKLSAgJChTVERJT19DRkxBR1MpIFwKLSAgJChURVJNSU9fQ0ZMQUdTKSBcCi0gICQoREVWWkVST19DRkxBR1MpCi0KLVNURF9DRkxBR1MJPSAkKENGTEFHUykgJChJTkxJTkVfQ0ZMQUdTKSAkKENPTkZJR19DRkxBR1MpICQoV0FSTklOR19DRkxBR1MpICQoU0lNX0NGTEFHUykgJChIREVGSU5FUykgJChUREVGSU5FUykgJChJTkNMVURFUykKLU5PV0FSTl9DRkxBR1MJPSAkKENGTEFHUykgJChJTkxJTkVfQ0ZMQUdTKSAkKENPTkZJR19DRkxBR1MpICQoU0lNX0NGTEFHUykgJChIREVGSU5FUykgJChUREVGSU5FUykgJChJTkNMVURFUykKLUJVSUxEX0NGTEFHUwk9IC1nIC1PICQoSU5DTFVERVMpICQoV0FSTklOR19DRkxBR1MpCi0KLUJVSUxEX0xERkxBR1MJPQotCi1DT05GSUdfRklMRSA9IEBzaW1fY29uZmlnQAotSUdFTl9PUENPREVfUlVMRVMgPSBAc2ltX29wY29kZUAKLUlHRU5fREVDT0RFX01FQ0hBTklTTSA9IEBzaW1fZGVjb2RlX21lY2hhbmlzbUAKLUlHRU5fRFVQTElDQVRFID0gQHNpbV9kdXBACi1JR0VOX0pVTVAgPSBAc2ltX2p1bXBACi1JR0VOX0ZJTFRFUiA9IEBzaW1fZmlsdGVyQAotSUdFTl9JQ0FDSEUgPSBAc2ltX2ljYWNoZUAKLUlHRU5fU01QID0gQHNpbV9pZ2VuX3NtcEAKLUlHRU5fTElORV9OUiA9IEBzaW1fbGluZV9uckAKLURHRU5fRkxBR1MgPSBAc2ltX3N3aXRjaEAKLQotSERFRklORVMgPSBASERFRklORVNACi1UREVGSU5FUyA9Ci1JR0VOX0ZMQUdTID0gXAotCSQoSUdFTl9ERUNPREVfTUVDSEFOSVNNKSBcCi0JJChJR0VOX0RVUExJQ0FURSkgXAotCSQoSUdFTl9KVU1QKSBcCi0JJChJR0VOX0ZJTFRFUikgXAotCSQoSUdFTl9JQ0FDSEUpIFwKLQkkKElHRU5fU01QKSBcCi0JJChJR0VOX0xJTkVfTlIpCi0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLUxJQl9JTkNMVURFUwk9IC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUKLUJGRF9JTkNMVURFUwk9IC1JLi4vLi4vYmZkIC1JJChzcmNkaXIpLy4uLy4uL2JmZAotR0RCX0lOQ0xVREVTCT0gLUkuLi8uLi9nZGIgLUkkKHNyY2RpcikvLi4vLi4vZ2RiICAtSSQoc3JjZGlyKS8uLi8uLi9nZGIvY29uZmlnIC1JJChzcmNkaXIpLy4uLy4uL21tYWxsb2MKLUlOQ0xVREVTCT0gLUkuIC1JJChzcmNkaXIpICQoTElCX0lOQ0xVREVTKSAkKEJGRF9JTkNMVURFUykgJChHREJfSU5DTFVERVMpCi0KLUxJQklCRVJUWV9MSUIJPSAuLi8uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLUJGRF9MSUIJCT0gLi4vLi4vYmZkL2xpYmJmZC5hCi0KLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTERFUFMgPSBASU5UTERFUFNACi0KLVRBUkdFVExJQgk9IGxpYnNpbS5hCi0KLWFsbDoJcnVuICQoVEFSR0VUTElCKSAkKEdEQl9PQkopCi0KLS5jLm86Ci0JJChDQykgLWMgJChTVERfQ0ZMQUdTKSAkPAotCi0KLQotQkFTSUNTX0ggPSBcCi0JYmFzaWNzLmggXAotCWNvbmZpZy5oIFwKLQlwcGMtY29uZmlnLmggXAotCWlubGluZS5oIFwKLQlzaW1fY2FsbGJhY2tzLmggXAotCWRlYnVnLmggZmlsdGVyX2ZpbGVuYW1lLmggXAotCXdvcmRzLmggXAotCWJpdHMuaCBcCi0Jc2ltLWVuZGlhbi5oCi0KLVBTSU1fSCA9IFwKLQlwc2ltLmggXAotCSQoQkFTSUNTX0gpCi0KLUlERUNPREVfSCA9IFwKLQlpZGVjb2RlLmggXAotCWlkZWNvZGVfZXhwcmVzc2lvbi5oIFwKLQlpZGVjb2RlX2JyYW5jaC5oIFwKLQlpZGVjb2RlX2ZpZWxkcy5oIFwKLQlpY2FjaGUuaAotCi1SRUdJU1RFUlNfSCA9IFwKLQlyZWdpc3RlcnMuaCBcCi0Jc3ByZWcuaAotCi1DUFVfSCA9IFwKLQljcHUuaCBcCi0JJChCQVNJQ1NfSCkgXAotCSQoUkVHSVNURVJTX0gpIFwKLQkkKElERUNPREVfSCkgXAotCWRldmljZS5oIFwKLQljb3JlZmlsZS5oIFwKLQl2bS5oIFwKLQlldmVudHMuaCBcCi0JaW50ZXJydXB0cy5oIFwKLQlwc2ltLmggXAotCWl0YWJsZS5oIFwKLQltb24uaCBcCi0JbW9kZWwuaAotCi1ERVZJQ0VfVEFCTEVfSCA9IFwKLQkkKEJBU0lDU19IKSBcCi0JZGV2aWNlX3RhYmxlLmggXAotCWRldmljZS5oIFwKLQl0cmVlLmggXAotCWh3LmgKLQotRU1VTF9HRU5FUklDX0ggPSBcCi0JJChDUFVfSCkgXAotCSQoSURFQ09ERV9IKSBcCi0JZW11bF9nZW5lcmljLmggXAotCXRyZWUuaCBcCi0Jb3NfZW11bC5oCi0KLQotSU5MSU5FID0gXAotCWlubGluZS5oIFwKLQlpbmxpbmUuYwotCi1CVUlMVF9TUkNfV09fQ09ORklHID0gXAotCWljYWNoZS5oIGljYWNoZS5jIFwKLQlzdXBwb3J0Lmggc3VwcG9ydC5jIFwKLQlpZGVjb2RlLmggaWRlY29kZS5jIFwKLQlzZW1hbnRpY3MuaCBzZW1hbnRpY3MuYyBcCi0JaXRhYmxlLmggaXRhYmxlLmMgXAotCXNwcmVnLmggc3ByZWcuYyBcCi0JbW9kZWwuaCBtb2RlbC5jIFwKLQlzdXBwb3J0Lmggc3VwcG9ydC5jIFwKLQlway5oIFwKLQlody5oIGh3LmMgXAotCWZpbHRlcl9ob3N0LmMgXAotCUBzaW1fdGFyZ192YWxzQAotCi1CVUlMVF9TUkMgPSBcCi0JJChCVUlMVF9TUkNfV09fQ09ORklHKSBcCi0JY29uZmlnLmggXAotCXBwYy1jb25maWcuaCAKLQotTElCX0lOTElORV9TUkMgPSBcCi0JcHNpbS5jIFwKLQliaXRzLmMgXAotCWRlYnVnLmMgXAotCXNpbS1lbmRpYW4uYyBcCi0Jc2ltLWVuZGlhbi5oIFwKLQlzaW0tZW5kaWFuLW4uaCBcCi0Jdm0uYyBcCi0Jdm1fbi5oIFwKLQljb3JlZmlsZS5jIFwKLQlldmVudHMuYyBcCi0Jb3NfZW11bC5jIFwKLQlyZWdpc3RlcnMuYyBcCi0JY3B1LmMgXAotCWludGVycnVwdHMuYyBcCi0JZGV2aWNlLmMgXAotCXRyZWUuYyBcCi0JZGV2aWNlX3RhYmxlLmMgXAotCWNhcC5jIFwKLQltb24uYyBcCi0Jb3B0aW9ucy5jCi0KLUxJQl9TUkMgPSBcCi0JJChQQUNLQUdFX1NSQykgXAotCSQoSFdfU1JDKSBcCi0JJChMSUJfSU5MSU5FX1NSQykKLQotTUFJTl9TUkMgPSBcCi0JbWFpbi5jIFwKLQlzaW1fY2FsbHMuYwotCi0KLSMgTk9URTogc2VtYW50aWNzLCBpZGVjb2RlIGFuZCBwc2ltIHB1dCBsYXN0IHNvIHNtYWxsZXIgZmlsZXMgYXJlIGNvbXBpbGVkCi0jICAgICAgIGZpcnN0Ci1MSUJfT0JKID0gXAotCWRlYnVnLm8gXAotCWZpbHRlcl9maWxlbmFtZS5vIFwKLQliaXRzLm8gXAotCXNpbS1lbmRpYW4ubyBcCi0Jb3NfZW11bC5vIFwKLQllbXVsX2dlbmVyaWMubyBcCi0JZW11bF9idWdhcGkubyBcCi0JZW11bF9jaGlycC5vIFwKLQllbXVsX25ldGJzZC5vIFwKLQllbXVsX3VuaXgubyBcCi0JcmVnaXN0ZXJzLm8gXAotCXZtLm8gXAotCWNvcmVmaWxlLm8gXAotCW1vZGVsLm8gXAotCXNwcmVnLm8gXAotCWNwdS5vIFwKLQlpbnRlcnJ1cHRzLm8gXAotCWV2ZW50cy5vIFwKLQljYXAubyBcCi0JZGV2aWNlLm8gXAotCXRyZWUubyBcCi0JZGV2aWNlX3RhYmxlLm8gXAotCWl0YWJsZS5vIFwKLQltb24ubyBcCi0JaWNhY2hlLm8gXAotCXNlbWFudGljcy5vIFwKLQlpZGVjb2RlLm8gXAotCXN1cHBvcnQubyBcCi0JcHNpbS5vIFwKLQkkKFBBQ0tBR0VfT0JKKSBcCi0JJChIV19PQkopIFwKLQlvcHRpb25zLm8KLQotCi1HREJfT0JKID0gc2ltX2NhbGxzLm8gQHNpbV9jYWxsYmFja0AKLQotSFdfU1JDID0gQHNpbV9od19zcmNACi1IV19PQkogPSBAc2ltX2h3X29iakAKLQotUEFDS0FHRV9TUkMgPSBAc2ltX3BrX3NyY0AKLVBBQ0tBR0VfT0JKID0gQHNpbV9wa19vYmpACi0KLQotcHNpbTogJChUQVJHRVRMSUIpIG1haW4ubyAkKExJQklCRVJUWV9MSUIpICQoQkZEX0xJQikgJChMSUJTKSAkKElOVExERVBTKQotCSQoQ0MpICQoQ0ZMQUdTKSAkKFNJTV9DRkxBR1MpICQoTERGTEFHUykgLW8gcHNpbSQoRVhFRVhUKSBtYWluLm8gJChUQVJHRVRMSUIpICQoQkZEX0xJQikgJChJTlRMTElCUykgJChMSUJJQkVSVFlfTElCKSAkKExJQlMpCi0KLXJ1bjogcHNpbQotCXJtIC1mIHJ1biQoRVhFRVhUKQotCWxuIHBzaW0kKEVYRUVYVCkgcnVuJChFWEVFWFQpCi0KLSQoVEFSR0VUTElCKTogdG1wLWlnZW4gdG1wLWRnZW4gdG1wLWh3IHRtcC1wayB0bXAtZGVmaW5lcyAkKExJQl9PQkopICQoR0RCX09CSikKLQlybSAtZiAkKFRBUkdFVExJQikKLQkkKEFSKSAkKEFSX0ZMQUdTKSAkKFRBUkdFVExJQikgJChMSUJfT0JKKSAkKEdEQl9PQkopCi0JJChSQU5MSUIpICQoVEFSR0VUTElCKQotCi1wc2ltLm86IHBzaW0uYyBwc2ltLmggdHJlZS5oICQoQ1BVX0gpICQoSURFQ09ERV9IKQotCi1iaXRzLm86IGJpdHMuYyAkKEJBU0lDU19IKQotCi1kZWJ1Zy5vOiBkZWJ1Zy5jICQoQkFTSUNTX0gpCi1maWx0ZXJfZmlsZW5hbWUubzogZmlsdGVyX2ZpbGVuYW1lLmMgZmlsdGVyX2ZpbGVuYW1lLmggY29uZmlnLmggcHBjLWNvbmZpZy5oCi0KLXNpbS1lbmRpYW4ubzogc2ltLWVuZGlhbi5jIHNpbS1lbmRpYW4tbi5oICQoQkFTSUNTX0gpCi0KLW9zX2VtdWwubzogb3NfZW11bC5jIGVtdWxfbmV0YnNkLmggZW11bF91bml4LmggZW11bF9jaGlycC5oIGVtdWxfYnVnYXBpLmggJChFTVVMX0dFTkVSSUNfSCkKLWVtdWxfZ2VuZXJpYy5vOiBlbXVsX2dlbmVyaWMuYyAkKEVNVUxfR0VORVJJQ19IKQotCi1lbXVsX2J1Z2FwaS5vOiBlbXVsX2J1Z2FwaS5jIGVtdWxfYnVnYXBpLmggJChFTVVMX0dFTkVSSUNfSCkKLWVtdWxfY2hpcnAubzogZW11bF9jaGlycC5jIGVtdWxfY2hpcnAuaCAkKEVNVUxfR0VORVJJQ19IKQotZW11bF9uZXRic2QubzogZW11bF9uZXRic2QuYyBlbXVsX25ldGJzZC5oICQoRU1VTF9HRU5FUklDX0gpCi1lbXVsX3VuaXgubzogZW11bF91bml4LmMgZW11bF91bml4LmggJChFTVVMX0dFTkVSSUNfSCkKLQotcmVnaXN0ZXJzLm86IHJlZ2lzdGVycy5jICQoUkVHSVNURVJTX0gpICQoQkFTSUNTX0gpIAotCi1jcHUubzogY3B1LmMgJChDUFVfSCkgJChJREVDT0RFX0gpCi0KLWludGVycnVwdHMubzogaW50ZXJydXB0cy5jICQoQ1BVX0gpICQoSURFQ09ERV9IKSBvc19lbXVsLmgKLQotIyBHaXZlbiB0aGF0IGlubGluZXMgYXJlIHR1cm5lZCBvbiBub3csIHJlYnVpbGQgaWRlY29kZSB3aGVuZXZlcgotIyBhbnl0aGluZyBjaGFuZ2VzLgotaWRlY29kZS5vOiBpZGVjb2RlLmMgJChDUFVfSCkgJChJREVDT0RFX0gpIHNlbWFudGljcy5oICQoTElCX0lOTElORV9TUkMpICQoQlVJTFRfU1JDKQotCSQoQ0MpIC1jICQoTk9XQVJOX0NGTEFHUykgJDwKLQotIyBkb3VibGUubzogZG91YmxlLmMgZHAtYml0LmMKLQotdm0ubzogdm0uYyB2bS5oIHZtX24uaCAkKENQVV9IKQotCi1jb3JlZmlsZS5vOiBjb3JlZmlsZS5jIGNvcmVmaWxlLmggY29yZWZpbGUtbi5oICQoQkFTSUNTX0gpICQoREVWSUNFX1RBQkxFX0gpCi0KLW1vZGVsLm86IG1vZGVsLmMgJChDUFVfSCkKLQotZXZlbnRzLm86IGV2ZW50cy5jIGV2ZW50cy5oICQoQkFTSUNTX0gpIAotCi1zaW1fY2FsbHMubzogc2ltX2NhbGxzLmMgJChQU0lNX0gpIGl0YWJsZS5oIC4uLy4uL2dkYi90bS5oIG9wdGlvbnMuaAotCi1zcHJlZy5vOiBzcHJlZy5jIHNwcmVnLmggc3ByZWcuYyAkKEJBU0lDU19IKQotCi1tYWluLm86IG1haW4uYyAkKFBTSU1fSCkgaXRhYmxlLmggb3B0aW9ucy5oCi0KLWRldmljZS5vOiBkZXZpY2UuYyAkKERFVklDRV9UQUJMRV9IKSBjYXAuaAotCi10cmVlLm86IHRyZWUuYyB0cmVlLmggZGV2aWNlLmggJChERVZJQ0VfVEFCTEVfSCkKLQotZGV2aWNlX3RhYmxlLm86IGRldmljZV90YWJsZS5jICQoREVWSUNFX1RBQkxFX0gpIGV2ZW50cy5oIGh3LmMKLQotY2FwLm86IGNhcC5jIGNhcC5oICQoQkFTSUNTX0gpCi0KLXNlbWFudGljcy5vOiBzZW1hbnRpY3MuYyBzZW1hbnRpY3MuaCAkKENQVV9IKSAkKElERUNPREVfSCkKLQkkKENDKSAtYyAkKE5PV0FSTl9DRkxBR1MpICQ8Ci0KLWljYWNoZS5vOiBpY2FjaGUuYyBpY2FjaGUuaCAkKElERUNPREVfSCkgJChDUFVfSCkKLQkkKENDKSAtYyAkKE5PV0FSTl9DRkxBR1MpICQ8Ci0KLXN1cHBvcnQubzogc3VwcG9ydC5jIHN1cHBvcnQuaCAkKElERUNPREVfSCkgJChDUFVfSCkKLQotaXRhYmxlLm86IGl0YWJsZS5jIGl0YWJsZS5oCi0KLW1vbi5vOiBtb24uYyAkKENQVV9IKQotCi0jIEdEQiBhZnRlciA0LjE2IGV4cGVjdHMgdGhlIGRlZmF1bHRfY2FsbGJhY2sgc3RydWN0dXJlIHRvIGJlIHNldHVwLgotIyBBcyBhIGtsdWRnZSwgYnVpbGQgdGhlIGNvbW1vbiBzdHVmZiBoZXJlIGZvciBub3cuCi1nZW50bWFwOiAuLi9jb21tb24vZ2VudG1hcC5jIE1ha2VmaWxlIHRhcmctdmFscy5kZWYKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9GTEFHUykgLUkuIC1JLi4vY29tbW9uIC1JJChzcmNkaXIpLy4uL2NvbW1vbiAtbyBnZW50bWFwICQ8ICQoQlVJTERfTElCUykKLQotdGFyZy12YWxzLmRlZjogJChzcmNkaXIpLy4uL2NvbW1vbi9ubHR2YWxzLmRlZgotCXJtIC1mIHRhcmctdmFscy5kZWYgdG1wLWRlZgotCWNhdCAkKHNyY2RpcikvLi4vY29tbW9uL25sdHZhbHMuZGVmID4gdG1wLXZhbHMuZGVmCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC12YWxzLmRlZiB0YXJnLXZhbHMuZGVmCi0KLXRhcmctdmFscy5oOiBNYWtlZmlsZSBnZW50bWFwICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZQotCXJtIC1mIHRtcC12YWxzLmgKLQkuL2dlbnRtYXAgLWggPiB0bXAtdmFscy5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC12YWxzLmggdGFyZy12YWxzLmgKLQotdGFyZy1tYXAuYzogTWFrZWZpbGUgZ2VudG1hcCAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKLQlybSAtZiB0bXAtbWFwLmMKLQkuL2dlbnRtYXAgLWMgPiB0bXAtbWFwLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1hcC5jIHRhcmctbWFwLmMKLQotY2FsbGJhY2subzogLi4vY29tbW9uL2NhbGxiYWNrLmMgdGFyZy12YWxzLmggY29uZmlnLmgKLQkkKENDKSAtYyAkKFNURF9DRkxBR1MpIC1ESEFWRV9DT05GSUdfSCAkPAotCi10YXJnLW1hcC5vOiB0YXJnLW1hcC5jIHRhcmctdmFscy5oCi0KLSMgUmVidWlsZCBvcHRpb25zIHdoZW5ldmVyIHNvbWV0aGluZyBjaGFuZ2VzIHNvIHRoZSBkYXRlL3RpbWUgaXMgdXAgdG8gZGF0ZS4KLW9wdGlvbnMubzogb3B0aW9ucy5jICQoQkFTSUNTX0gpICQoQ1BVX0gpICQoSURFQ09ERV9IKSAkKElOTElORSkgJChMSUJfU1JDKSAkKEJVSUxUX1NSQykgY29uZmlnLnN0YXR1cyBNYWtlZmlsZSBkZWZpbmVzLmgKLQkkKENDKSAtYyAkKFNURF9DRkxBR1MpICctRE9QQ09ERV9SVUxFUz0iQHNpbV9vcGNvZGVAIicgJy1ESUdFTl9GTEFHUz0iJChJR0VOX0ZMQUdTKSInICctRERHRU5fRkxBR1M9IiQoREdFTl9GTEFHUykiJyAkPAotCi10bXAtZGVmaW5lczogY29uZmlnLmggTWFrZWZpbGUKLQlzZWQgLW4gLWUgJy9eI2RlZmluZSBIQVZFXy9zLyAxJCQvIiwvJyAtZSAnL14jZGVmaW5lIEhBVkVfL3MvLyJIQVZFXy9wJyA8IGNvbmZpZy5oID4gdG1wLWRlZmluZXMuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZGVmaW5lcy5oIGRlZmluZXMuaAotCXRvdWNoIHRtcC1kZWZpbmVzCi0KLSMKLSMgUnVsZXMgdG8gY3JlYXRlIHRoZSBidWlsdCBjIHNvdXJjZSBjb2RlIGZpbGVzCi0jCi0KLXBwYy1jb25maWcuaDogJChDT05GSUdfRklMRSkKLQljcCAkKHNyY2RpcikvJChDT05GSUdfRklMRSkgcHBjLWNvbmZpZy5oCi0KLQotdG1wLWRnZW46IGRnZW4gcHBjLXNwci10YWJsZSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKLQkuL2RnZW4gJChER0VOX0ZMQUdTKSBcCi0JCS1yICQoc3JjZGlyKS9wcGMtc3ByLXRhYmxlIFwKLQkJLW4gc3ByZWcuaCAtaHAgdG1wLXNwcmVnLmggXAotCQktbiBzcHJlZy5jIC1wICB0bXAtc3ByZWcuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3ByZWcuaCBzcHJlZy5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zcHJlZy5jIHNwcmVnLmMKLQl0b3VjaCB0bXAtZGdlbgotCi0KLXRtcC1pZ2VuOiBpZ2VuIHBwYy1pbnN0cnVjdGlvbnMgJChJR0VOX09QQ09ERV9SVUxFUykgcHBjLWNhY2hlLXJ1bGVzICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbGQtZGVjb2RlIHRtcC1sZC1jYWNoZSB0bXAtbGQtaW5zbiB0bXAtZmlsdGVyCi0JLi9pZ2VuCSQoSUdFTl9GTEFHUykgXAotCQktbyAkKHNyY2RpcikvJChJR0VOX09QQ09ERV9SVUxFUykgXAotCQktayAkKHNyY2RpcikvcHBjLWNhY2hlLXJ1bGVzIFwKLQkJLWkgJChzcmNkaXIpL3BwYy1pbnN0cnVjdGlvbnMgXAotCQktbiBpY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKLQkJLW4gaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCi0JCS1uIHNlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAotCQktbiBzZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKLQkJLW4gaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAotCQktbiBpZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCi0JCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAotCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jIFwKLQkJLW4gbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKLQkJLW4gbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKLQkJLW4gc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAotCQktbiBzdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggaWNhY2hlLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIGljYWNoZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggaWRlY29kZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgaWRlY29kZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBzZW1hbnRpY3MuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgc2VtYW50aWNzLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5oIGl0YWJsZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuYyBpdGFibGUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBtb2RlbC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG1vZGVsLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBzdXBwb3J0LmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBzdXBwb3J0LmMKLQl0b3VjaCB0bXAtaWdlbgotCi0jIE5PVEU6IFNvbWUgdmVyc2lvbnMgb2YgbWFrZSBkb24ndCBoYW5kbGUgZmlsZXMgY3JlYXRlZCBhcyBzaWRlLWVmZmVjdHMKLSMgdW5jb21tZW50IHRoZSBiZWxvdyBpZiB0aGF0IGlzIHRoZSBjYXNlLgotCi0kKFRBUkdFVExJQik6IHRtcC1pZ2VuIHRtcC1kZ2VuCi1pdGFibGUuaCBpdGFibGUuYyBpY2FjaGUuaCBpY2FjaGUuYyBpZGVjb2RlLmggaWRlY29kZS5jIHNlbWFudGljcy5oIHNlbWFudGljcy5jIG1vZGVsLmggbW9kZWwuYyBzdXBwb3J0Lmggc3VwcG9ydC5jOiB0bXAtaWdlbgotc3ByZWcuaCBzcHJlZy5jOiB0bXAtZGdlbgotCi1kZ2VuOiBkZ2VuLm8gdGFibGUubyBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtbyBkZ2VuIGRnZW4ubyB0YWJsZS5vIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQotCi1pZ2VuOiBpZ2VuLm8gdGFibGUubyBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vIGxkLWRlY29kZS5vIGxkLWNhY2hlLm8gZmlsdGVyLm8gbGQtaW5zbi5vIGdlbi1tb2RlbC5vIGdlbi1pdGFibGUubyBnZW4taWNhY2hlLm8gZ2VuLXNlbWFudGljcy5vIGdlbi1pZGVjb2RlLm8gZ2VuLXN1cHBvcnQubwotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyBpZ2VuIGlnZW4ubyB0YWJsZS5vIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8gbGQtZGVjb2RlLm8gbGQtY2FjaGUubyBmaWx0ZXIubyBsZC1pbnNuLm8gZ2VuLW1vZGVsLm8gZ2VuLWl0YWJsZS5vIGdlbi1pY2FjaGUubyBnZW4tc2VtYW50aWNzLm8gZ2VuLWlkZWNvZGUubyBnZW4tc3VwcG9ydC5vICQoQlVJTERfTElCUykKLQotZmlsdGVyX2hvc3QuYzogZmlsdGVyX2ZpbGVuYW1lLmMKLQljYXQgJChzcmNkaXIpL2ZpbHRlcl9maWxlbmFtZS5jID4gZmlsdGVyX2hvc3QuYwotCi1maWx0ZXJfaG9zdC5vOiBmaWx0ZXJfaG9zdC5jIGZpbHRlcl9maWxlbmFtZS5oIGNvbmZpZy5oIHBwYy1jb25maWcuaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgZmlsdGVyX2hvc3QuYwotCi10YWJsZS5vOiB0YWJsZS5jIG1pc2MuaCBmaWx0ZXJfZmlsZW5hbWUuaCBsZi5oIHRhYmxlLmgKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS90YWJsZS5jCi0KLWxmLm86IGxmLmMgbWlzYy5oIGZpbHRlcl9maWxlbmFtZS5oIGxmLmgKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9sZi5jCi0KLWZpbHRlci5vOiBmaWx0ZXIuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGZpbHRlci5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZmlsdGVyLmMKLXRtcC1maWx0ZXI6IGZpbHRlci5jIG1pc2MuaCBtaXNjLm8KLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWZpbHRlciAtRE1BSU4gJChzcmNkaXIpL2ZpbHRlci5jIG1pc2MubyAkKEJVSUxEX0xJQlMpCi0KLWxkLWRlY29kZS5vOiBsZC1kZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWRlY29kZS5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvbGQtZGVjb2RlLmMKLXRtcC1sZC1kZWNvZGU6IGxkLWRlY29kZS5vIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWxkLWRlY29kZSAtRE1BSU4gJChzcmNkaXIpL2xkLWRlY29kZS5jIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAkKEJVSUxEX0xJQlMpCi0KLWxkLWNhY2hlLm86IGxkLWNhY2hlLmMgbWlzYy5oIGxmLmggdGFibGUuaCBsZC1jYWNoZS5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvbGQtY2FjaGUuYwotdG1wLWxkLWNhY2hlOiBsZC1jYWNoZS5vIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWxkLWNhY2hlIC1ETUFJTiAkKHNyY2RpcikvbGQtY2FjaGUuYyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQotCi1sZC1pbnNuLm86IGxkLWluc24uYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWluc24uaCBsZC1kZWNvZGUuaCBpZ2VuLmgKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9sZC1pbnNuLmMKLXRtcC1sZC1pbnNuOiBsZC1pbnNuLm8gbWlzYy5vIGxmLm8gdGFibGUubyBsZC1kZWNvZGUubyBmaWx0ZXJfaG9zdC5vIGZpbHRlci5vCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1sZC1pbnNuIC1ETUFJTiAkKHNyY2RpcikvbGQtaW5zbi5jIG1pc2MubyBsZi5vIHRhYmxlLm8gbGQtZGVjb2RlLm8gZmlsdGVyX2hvc3QubyBmaWx0ZXIubyAkKEJVSUxEX0xJQlMpCi0KLWdlbi1tb2RlbC5vOiBnZW4tbW9kZWwuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1tb2RlbC5oIGxkLWRlY29kZS5oIGlnZW4uaCBsZC1pbnNuLmgKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW4tbW9kZWwuYwotCi1nZW4taXRhYmxlLm86IGdlbi1pdGFibGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pdGFibGUuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIGlnZW4uaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1pdGFibGUuYwotCi1nZW4taWNhY2hlLm86IGdlbi1pY2FjaGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pY2FjaGUuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIGdlbi1zZW1hbnRpY3MuaCBnZW4taWRlY29kZS5oCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZ2VuLWljYWNoZS5jCi0KLWdlbi1zZW1hbnRpY3MubzogZ2VuLXNlbWFudGljcy5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLXNlbWFudGljcy5oIGxkLWRlY29kZS5oIGlnZW4uaCBsZC1pbnNuLmgKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW4tc2VtYW50aWNzLmMKLQotZ2VuLWlkZWNvZGUubzogZ2VuLWlkZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pZGVjb2RlLmggZ2VuLWljYWNoZS5oIGdlbi1zZW1hbnRpY3MuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1pZGVjb2RlLmMKLQotZ2VuLXN1cHBvcnQubzogZ2VuLXN1cHBvcnQuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1zdXBwb3J0LmggbGQtZGVjb2RlLmggaWdlbi5oIGxkLWluc24uaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1zdXBwb3J0LmMKLQotZGdlbi5vOiBkZ2VuLmMgbWlzYy5oIGZpbHRlcl9maWxlbmFtZS5oIGxmLmggdGFibGUuaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2RnZW4uYwotCi1pZ2VuLm86IGlnZW4uYyBtaXNjLmggZmlsdGVyX2ZpbGVuYW1lLmggbGYuaCB0YWJsZS5oIGxkLWRlY29kZS5oIGxkLWNhY2hlLmggbGQtaW5zbi5oIGZpbHRlci5oIGdlbi1tb2RlbC5oIGdlbi1pdGFibGUuaCBnZW4taWNhY2hlLmggZ2VuLWlkZWNvZGUuaCBnZW4tc2VtYW50aWNzLmggZ2VuLXN1cHBvcnQuaCBpZ2VuLmggCi0JJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvaWdlbi5jCi0KLW1pc2MubzogbWlzYy5jIG1pc2MuaCBmaWx0ZXJfZmlsZW5hbWUuaAotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL21pc2MuYwotCi0KLQotIyByZWFsIGhhcmR3YXJlCi10bXAtaHc6IE1ha2VmaWxlICQoSFdfU1JDKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKLQkjIFRoZSBmaXJzdCBmb3IgbG9vcCBpcyB0byByZW1vdmUgZHVwbGljYXRlcy4KLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChIV19TUkMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQlmb3IgaHcgaW4gJCRmIDsgZG8gZWNobyAkJGh3IDsgZG9uZSBcCi0JfCBzZWQgLWUgJ3MvXi4qXChod18uKlwpXC5jL1wxLycgXAotCQktZSAncy9eL2V4dGVybiBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAvJyBcCi0JCS1lICdzLyQkL19kZXZpY2VfZGVzY3JpcHRvclxbXF07LycgXAotCQk+IHRtcC1ody5oCi0JZj0iIjsgXAotCWZvciBpIGluICQoSFdfU1JDKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZm9yIGh3IGluICQkZiA7IGRvIGVjaG8gJCRodyA7IGRvbmUgXAotCXwgc2VkIC1lICdzL14uKlwoaHdfLipcKVwuYy9cMS8nIFwKLQkJLWUgJ3MvXi8gICAgLycgXAotCQktZSAncy8kJC9fZGV2aWNlX2Rlc2NyaXB0b3IsLycgXAotCQk+IHRtcC1ody5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1ody5oIGh3LmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWh3LmMgaHcuYwotCXRvdWNoIHRtcC1odwotCi1od19jcHUubzogaHdfY3B1LmMgJChERVZJQ0VfVEFCTEVfSCkKLWh3X2NvcmUubzogaHdfY29yZS5jICQoREVWSUNFX1RBQkxFX0gpCi1od19kaXNrLm86IGh3X2Rpc2suYyAkKERFVklDRV9UQUJMRV9IKSBway5oCi1od19nbHVlLm86IGh3X2dsdWUuYyAkKERFVklDRV9UQUJMRV9IKQotaHdfaHRhYi5vOiBod19odGFiLmMgJChERVZJQ0VfVEFCTEVfSCkKLWh3X2lkZS5vOiBod19pZGUuYyAkKERFVklDRV9UQUJMRV9IKQotaHdfaW5pdC5vOiBod19pbml0LmMgJChERVZJQ0VfVEFCTEVfSCkKLWh3X2lvYnVzLm86IGh3X2lvYnVzLmMgJChERVZJQ0VfVEFCTEVfSCkKLWh3X21lbW9yeS5vOiBod19tZW1vcnkuYyAkKERFVklDRV9UQUJMRV9IKQotaHdfbnZyYW0ubzogaHdfbnZyYW0uYyAkKERFVklDRV9UQUJMRV9IKQotaHdfb3BpYy5vOiBod19vcGljLmMgJChERVZJQ0VfVEFCTEVfSCkKLWh3X3BhbC5vOiBod19wYWwuYyAkKERFVklDRV9UQUJMRV9IKQotaHdfcGhiLm86IGh3X3BoYi5jICQoREVWSUNFX1RBQkxFX0gpIGh3X3BoYi5oCi1od19yZWdpc3Rlci5vOiBod19yZWdpc3Rlci5jICQoREVWSUNFX1RBQkxFX0gpCi1od190cmFjZS5vOiBod190cmFjZS5jICQoREVWSUNFX1RBQkxFX0gpCi1od192bS5vOiBod192bS5jICQoREVWSUNFX1RBQkxFX0gpCi0jIGlnbm9yZSB0aGlzIGxpbmUsIGl0IHN0b3BzIG1ha2UgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkCi0KLQotCi0jIHJlYWwgcGFja2FnZXMKLXRtcC1wazogTWFrZWZpbGUgJChQQUNLQUdFX1NSQykgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlCi0JIyBUaGUgZmlyc3QgZm9yIGxvb3AgaXMgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuCi0JZj0iIjsgXAotCWZvciBpIGluICQoUEFDS0FHRV9TUkMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQlmb3IgcGsgaW4gJCRmIDsgZG8gZWNobyAkJHBrIDsgZG9uZSBcCi0JfCBzZWQgLWUgJ3MvXi4qcGtfXCguKlwpXC5jL1wxLycgXAotCQktZSAncy9eL2V4dGVybiBwYWNrYWdlX2NyZWF0ZV9pbnN0YW5jZV9jYWxsYmFjayBwa18vJyBcCi0JCS1lICdzLyQkL19jcmVhdGVfaW5zdGFuY2U7LycgXAotCQk+IHRtcC1way5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1way5oIHBrLmgKLQl0b3VjaCB0bXAtcGsKLQotcGtfZGlza2xhYmVsLm86IHBrLmggJChERVZJQ0VfVEFCTEVfSCkKLSMgaWdub3JlIHRoaXMgbGluZSwgaXQgc3RvcHMgbWFrZSBmcm9tIGdldHRpbmcgY29uZnVzZWQKLQotCi0KLXRhZ3MgZXRhZ3M6IFRBR1MKLQotVEFHUzogJChCVUlMVF9TUkMpCi0JZXRhZ3MgJChzcmNkaXIpLyouaCAkKHNyY2RpcikvKi5jICQoQlVJTFRfU1JDKQotCi1jbGVhbiBtb3N0bHljbGVhbjoKLQlybSAtZiB0bXAtKiAqLltvYXNpXSBjb3JlIHBzaW0kKEVYRUVYVCkgcnVuJChFWEVFWFQpIGlnZW4gZGdlbiAkKEJVSUxUX1NSQ19XT19DT05GSUcpIGdlbnRtYXAKLQotZGlzdGNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQlybSAtZiBUQUdTIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcuc3RhdHVzIGNvbmZpZy5oIGRlZmluZXMuaCBzdGFtcC1oIGNvbmZpZy5sb2cKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0Jcm0gLWYgKn4gKi5sb2cgcHBjLWNvbmZpZy5oIGNvcmUgKi5jb3JlCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPU1ha2VmaWxlIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQotc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1pbnN0YWxsOiBpbnN0YWxsZGlycwotCW49YGVjaG8gcnVuIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKLQkkKElOU1RBTExfUFJPR1JBTSkgcnVuJChFWEVFWFQpICQoYmluZGlyKS8kJG4kKEVYRUVYVCkKLQotaW5zdGFsbGRpcnM6Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMgJChiaW5kaXIpCmRpZmYgLS1naXQgYS9zaW0vcHBjL1JFQURNRSBiL3NpbS9wcGMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNmYmQyLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLQotCi0JCVBTSU0gMS4wLjEgLSBNb2RlbCBvZiB0aGUgUG93ZXJQQyBFbnZpcm9ubWVudHMKLQotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+LgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotUFNJTSBpcyBhIHByb2dyYW0gd3JpdHRlbiBpbiBleHRlbmRlZCBBTlNJLUMgdGhhdCBpbXBsZW1lbnRzIGFuCi1pbnN0cnVjdGlvbiBsZXZlbCBzaW11bGF0aW9uIG9mIHRoZSBQb3dlclBDIGVudmlyb25tZW50LiAgSXQgaXMgZnJlZWx5Ci1hdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyIG9yIGxhdGVyKS4KLQotVGhlIFBvd2VyUEMgQXJjaGl0ZWN0dXJlIGlzIGRlc2NyaWJlZCBhcyBoYXZpbmcgdGhyZWUgbGV2ZWxzIG9mCi1jb21wbGlhbmNlOgotCi0JVUVBIC0gVXNlciBFbnZpcm9ubWVudCBBcmNoaXRlY3R1cmUKLQlWRUEgLSBWaXJ0dWFsIEVudmlyb25tZW50IEFyY2hpdGVjdHVyZQotCU9FQSAtIE9wZXJhdGluZyBFbnZpcm9ubWVudCBBcmNoaXRlY3R1cmUKLQotUFNJTSBib3RoIGltcGxlbWVudHMgYWxsIHRocmVlIGxldmVscyBvZiB0aGUgUG93ZXJQQyBhbmQgaW5jbHVkZXMgKGZvcgotZWFjaCBsZXZlbCkgYSBjb3JyZXNwb25kaW5nIHNpbXVsYXRlZCBydW4tdGltZSBlbnZpcm9ubWVudC4KLQotSW4gYWRkaXRpb24sIFBTSU0sIHRvIHRoZSBleGVjdXRpb24gdW5pdCBsZXZlbCwgbW9kZWxzIHRoZSBwZXJmb3JtYW5jZQotb2YgbW9zdCBvZiB0aGUgY3VycmVudCBQb3dlclBDIGltcGxlbWVudGF0aW9ucyAoY29udHJpYnV0ZWQgYnkgTWljaGFlbAotTWVpc3NuZXIpLiAgVGhpcyBkZXRhaWxlZCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICh1bmxpa2UgbWFueSBvdGhlcgotc2ltdWxhdG9ycykgcmVzdWx0aW5nIGluIG9ubHkgYSByZWxhdGl2ZWx5IG1hcmdpbmFsIHJlZHVjdGlvbiBpbiB0aGUKLXNpbXVsYXRvcnMgcGVyZm9ybWFuY2UuCi0KLQotQSBkZXNjcmlwdGlvbiBvZiBob3cgdG8gYnVpbGQgUFNJTSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGU6Ci0KLQkJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9JTlNUQUxMCi0Jb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vSU5TVEFMTAotCi13aGlsZSBhbiBvdmVydmlldyBvZiBob3cgdG8gdXNlIFBTSU0gaXMgaW46Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL1JVTgotb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vUlVOCi0KLVRoaXMgZmlsZSBpcyBmb3VuZCBpbjoKLQotCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vUkVBRE1FCi1vcglmdHA6Ly9jYW1icmlkZ2UuY3lnbnVzLmNvbS9wdWIvcHNpbS9SRUFETUUKLQotCi1UaGFua3MgZ29lcyBmaXJzdGx5IHRvOgotCi0JQ29yaW50aGlhbiBFbmdpbmVlcmluZyBQdHkgTHRkCi0JQ3lnbnVzIFN1cHBvcnQKLQlIaWdobGFuZCBMb2dpYyBQdHkgTHRkCi0KLXdobyBwcm92aWRlZCB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgbWFraW5nIHRoaXMgc29mdHdhcmUgYXZhaWxhYmxlCi1vbiB0aGUgSW50ZXJuZXQuCi0KLU1vcmUgaW1wb3J0YW50bHkgSSdkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyB3aG8gZWFjaAotY29udHJpYnV0ZWQgaW4gdGhlaXIgb3duIHVuaXF1ZSB3YXk6Ci0KLQlBbGxlbiBCcmlnZ3MsIEJldHQgS29jaCwgRGF2aWQgRWRlbHNvaG4sIEdvcmRvbiBJcmxhbSwKLQlNaWNoYWVsIE1laXNzbmVyLCBCb2IgTWVyY2llciwgUmljaGFyZCBQZXJpbmksIERhbGUgUmFobiwKLQlSaWNoYXJkIFN0YWxsbWFuLCBNaXRjaGVsZSBXYWxrZXIKLQotCi0JCQkJQW5kcmV3IENhZ25leQotCQkJCUZlYiwgMTk5NQotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIFdoYXQgZmVhdHVyZXMgZG9lcyBQU0lNIGluY2x1ZGU/Ci0KLQlNb25pdG9yaW5nIGFuZCBtb2RlbGluZwotCi0JCVBTSU0gaW5jbHVkZXMgKHRoYW5rcyB0byBNaWNoYWVsIE1laXNzbmVyKQotCQlhIGRldGFpbGVkIG1vZGVsIG9mIG1vc3Qgb2YgdGhlIFBvd2VyUEMKLQkJaW1wbGVtZW50YXRpb25zIHRvIHRoZSBmdW5jdGlvbmFsIHVuaXQgbGV2ZWwuCi0KLQotCVNNUAotCQkKLQkJVGhlIFBvd2VyUEMgSVNBIGRlZmluZXMgU01QIHN5bmNocm9uaXppbmcgaW5zdHJ1Y3Rpb25zLgotCQlUaGlzIHNpbXVsYXRvciBpbXBsZW1lbnRzIGEgbGltaXRlZCwgYnV0IGZ1bmN0aW9uYWwsCi0JCXN1YnNldCBvZiB0aGUgUG93ZXJQQyBzeW5jaHJvbml6YXRpb24gaW5zdHJ1Y3Rpb25zCi0JCWJlaGF2aW91ci4gIFByb2dyYW1zIHRoYXQgcmVzdHJpY3QgdGhlaXIgc3luY2hyb25pemF0aW9uCi0JCXByaW1pdGl2ZXMgdG8gdGhvc2UgdGhhdCB3b3JrIHdpdGggdGhpcyBmdW5jdGlvbmFsCi0JCXN1Yi1zZXQgKGVnIFAoKSBhbmQgVigpKSBhcmUgYWJsZSB0byBydW4gb24gdGhlIFNNUAotCQl2ZXJzaW9uIG9mIFBTSU0uCi0KLQkJUGVvcGxlIGludGVuZGluZyB0byB1c2UgdGhpcyBzeXN0ZW0gc2hvdWxkIHN0dWR5Ci0JCXRoZSBjb2RlIGltcGxlbWVudGluZyB0aGUgbHdhcnggaW5zdHJ1Y3Rpb24uCi0JCQotCUVORElBTiBTVVBQT1JUCi0KLQkJUFNJTSBpbXBsZW1lbnRzIHRoZSBQb3dlclBDJ3MgYmlnIGFuZCBsaXR0bGUgKHhvcgotCQllbmRpYW4pIG1vZGVzIGFuZCBjb3JyZWN0bHkgc2ltdWxhdGVzIGNvZGUgdGhhdAotCQlzd2l0Y2hlcyBiZXR3ZWVuIHRoZXNlIHR3byBtb2Rlcy4KLQotCQlJbiBhZGRpdGlvbiwgcHNpbSBjYW4gbW9kZWwgYSB0cnVlIGxpdHRsZS1lbmRpYW4KLQkJbWFjaGluZS4KLQotCUlTQSAoSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSkgbW9kZWxzCi0KLQkJUFNJTSBpbmNsdWRlcyBhIG1vZGVsIG9mIHRoZSBVRUEsIFZFQSBhbmQgT0VBLiAgVGhpcwotCQlpbmNsdWRlcyB0aGUgdGltZSBiYXNlIHJlZ2lzdGVycyAoVkVBKSBhbmQgSFRBQgotCQlhbmQgQkFUUyAoT0VBKS4KLQotCQlJbiBhZGRpdGlvbiwgYSBwcmVsaW1pbmFyeSBtb2RlbCBvZiB0aGUgNjQgYml0Ci0JCVBvd2VyUEMgYXJjaGl0ZWN0dXJlIGlzIGltcGxlbWVudGVkLgotCi0JSU8gSGFyZHdhcmUKLQotCQlQU0lNJ3MgaW50ZXJuYWxzIGFyZSBiYXNlZCBhcm91bmQgdGhlIGNvbmNlcHQKLQkJb2YgYSBEZXZpY2UgVHJlZS4gIFRoaXMgdHJlZSBpbnRlbnRpb25hbGx5Ci0JCXJlc2VtYmxlcyB0aGF0IG9mIHRoZSBEZXZpY2UgVHJlZSBmb3VuZCBpbgotCQlPcGVuQm9vdCBmaXJtd2FyZS4gIFBTSU0gaXMgZmxleGlibGUgZW5vdWdoCi0JCXRvIGFsbG93IHRoZSB1c2VyIHRvIGZ1bGx5IGNvbmZpZ3VyZSB0aGlzIGRldmljZQotCQl0cmVlIChhbmQgY29uc2VxdWVudGx5IHRoZSBoYXJkd2FyZSBtb2RlbCkgYXQKLQkJcnVuIHRpbWUuCi0KLQlSdW4tdGltZSBlbnZpcm9ubWVudHM6Ci0KLQkJUFNJTSdzIFVFQSBtb2RlbCBpbmNsdWRlcyBlbXVsYXRpb24gZm9yIEJTRAotCQliYXNlZCBVTklYIHN5c3RlbSBjYWxscy4KLQotCQlQU0lNJ3MgT0VBIG1vZGVsIGluY2x1ZGVzIGVtdWxhdGlvbiBvZiBlaXRoZXI6Ci0KLQkJCW8JT3BlbkJvb3QgY2xpZW50IGludGVyZmFjZQotCi0JCQlvCU1PVE8ncyBCVUcgaW50ZXJmYWNlLgotCi0KLQlGbG9hdGluZyBwb2ludAotCi0JCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGZsb2F0aW5nIHBvaW50IGlzIGluY2x1ZGVkLgotCi0KLSAgICBXaG8gd291bGQgYmUgaW50ZXJlc3RlZCBpbiBQU0lNPwotCi0Jbwl0aGUgY3VyaW91cwotCi0JCVVzaW5nIHBzaW0sIGdkYiwgZ2NjIGFuZCBiaW51dGlscyB0aGUgY3VyaW91cwotCQl1c2VyIGNhbiBjb25zdHJ1Y3QgYW4gZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MKLQkJdGhlbSB0byBwbGF5IHdpdGggUG93ZXJQQyBFbnZpcm9ubWVudCB3aXRob3V0Ci0JCXRoZSBuZWVkIGZvciByZWFsIGhhcmR3YXJlLgotCi0KLQlvCXRoZSBhbmFseXN0Ci0KLQkJUFNJTSBpbmNsdWRlcyBtYW55IChjb250cmlidXRlZCkgbW9uaXRvcmluZwotCQlmZWF0dXJlcyB3aGljaCAodW5saWtlIG1hbnkgb3RoZXIgc2ltdWxhdG9ycykKLQkJZG8gbm90IGNvbWUgd2l0aCBhIGdyZWF0IHBlbmFsdHkgaW4gcGVyZm9ybWFuY2UuCi0KLQkJVGh1cyB0aGUgcGVyZm9ybWFuY2UgYW5hbHlzdCBpcyBhYmxlIHRvIHVzZQotCQl0aGlzIHNpbXVsYXRvciB0byBhbmFseXNlIHRoZSBwZXJmb3JtYW5jZSBvZgotCQl0aGUgc3lzdGVtIHVuZGVyIHRlc3QuCi0KLQkJSWYgUFNJTSBkb2Vzbid0IG1vbml0b3IgYSBjb21wb25lbnRzIG9mIGludGVyZXN0LAotCQl0aGUgc291cmNlIGNvZGUgaXMgZnJlZWx5IGF2YWlsYWJsZSwgYW5kIGhlbmNlCi0JCXRoZXJlIGlzIG5vIGhpbmRlcmFuY2UgdG8gY2hhbmdpbmcgdGhpbmdzCi0JCXRvIG1lZXQgYSBzcGVjaWZpYyBhbmFseXN0cyBuZWVkcy4KLQotCi0Jbwl0aGUgc2VyaW91cyBTVyBkZXZlbG9wZXIKLQotCQlQU0lNIG1vZGVscyBhbGwgdGhyZWUgbGV2ZWxzIG9mIHRoZSBQb3dlclBDCi0JCUFyY2hpdGVjdHVyZTogVUVBLCBWRUEgYW5kIE9FQS4gIEZ1cnRoZXIsCi0JCXRoZSBpbnRlcm5hbCBkZXNpZ24gaXMgc3VjaCB0aGF0IFBTSU0gY2FuCi0JCWJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCi0KLQotICAgIFdoYXQgcGVyZm9ybWFuY2UgYW5hbHlzaXMgbWVhc3VyZW1lbnRzIGNhbiBQU0lNIHBlcmZvcm0/Ci0KLQlCZWxvdyBpcyB0aGUgb3V0cHV0IGZyb20gYSByZWNlbnQgYW5hbHlzaXMgcnVuCi0JKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgTWVpc3NuZXIpOgotCi0JRm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKLQotCWxvbmcKLQlzaW1wbGVfcmFuZCAoKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNlZWQgPSA0NzExNDcxMTsKLQkgIHVuc2lnbmVkIGxvbmcgdGhpcyA9IHNlZWQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7Ci0JICBzZWVkID0gdGhpczsKLQkvKiBjdXQtY3V0LWN1dCAtIHNlZSB0aGUgZmlsZSBSVU4ucHNpbSAqLwotCX0KLQotCUhlcmUgaXMgdGhlIGN1cnJlbnQgb3V0cHV0IGdlbmVyYXRlZCB3aXRoIHRoZSAtSSBzd2l0Y2ggb24gYSBQOTAKLQkodGhlIGNvbXBpbGVyIHVzZWQgaXMgdGhlIGRldmVsb3BtZW50IHZlcnNpb24gb2YgR0NDIHdpdGggYSBuZXcKLQlzY2hlZHVsZXIgcmVwbGFjaW5nIHRoZSBvbGQgb25lKToKLQkKLQlDUFUgIzEgZXhlY3V0ZWQgICAgIDQxLDk5NCBBTkQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA1MTksNzg1IEFORCBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLgotCS4KLQkuCi0JLgotCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIFN5c3RlbSBDYWxsIGluc3RydWN0aW9uLgotCUNQVSAjMSBleGVjdXRlZCAgICAyMDcsNzQ2IFhPUiBpbnN0cnVjdGlvbnMuCi0JCi0JQ1BVICMxIGV4ZWN1dGVkIDIzLDc0MCw4NTYgY3ljbGVzLgotCUNQVSAjMSBleGVjdXRlZCAxMCwyNDIsNzgwIHN0YWxscyB3YWl0aW5nIGZvciBkYXRhLgotCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIHN0YWxsIHdhaXRpbmcgZm9yIGEgZnVuY3Rpb24gdW5pdC4KLQkuCi0JLgotCS4KLQlDUFUgIzEgZXhlY3V0ZWQgIDMsMTM2LDIyOSBicmFuY2ggZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgMTYsOTQ5LDM5NiBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIGFjY291bnRlZCBmb3IgaW4gdGltaW5nIGluZm8uCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDg3MSw5MjAgZGF0YSByZWFkcy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgOTcxLDkyNiBkYXRhIHdyaXRlcy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgICAgIDIyMSBpY2FjaGUgbWlzc2VzLgotCUNQVSAjMSBleGVjdXRlZCAxNiw5NDksMzk2IGluc3RydWN0aW9ucyBpbiB0b3RhbC4KLQkKLQlTaW11bGF0b3Igc3BlZWQgd2FzIDI1MCw3MzEgaW5zdHJ1Y3Rpb25zL3NlY29uZAotCi0KLSAgICBXaGF0IG1vdGl2YXRlZCBQU0lNPwotCi0JQXMgYW4gaWRlYSwgcHNpbSB3YXMgZmlyc3QgZGlzY3Vzc2VkIHNlcmlvdXNseSBkdXJpbmcgbWlkCi0JMTk5NC4gIEF0IHRoYXQgdGltZSBpdHMgbWFpbiBvYmplY3RpdmVzIHdlcmU6Ci0KLQotCQlvCWdvb2QgcGVyZm9ybWFuY2UKLQotCQkJTWFueSBzaW11bGF0b3JzIGxvb3NlIG91dCBieSBvbmx5IHByb3ZpZGluZwotCQkJYSBiaW5hcnkgaW50ZXJmYWNlIHRvIHRoZSBpbnRlcm5hbHMuICBUaGlzCi0JCQlpbnRlcmZhY2UgZXZlbnR1YWxseSBiZWNvbWVzIGEgYm90dGxlIG5lY2sKLQkJCWluIHRoZSBzaW11bGF0b3JzIHBlcmZvcm1hbmNlLgotCi0JCQlJdCB3YXMgaW50ZW5kZWQgdGhhdCBQU0lNIHdvdWxkIGF2b2lkIHRoaXMKLQkJCXByb2JsZW0gYnkgZ2l2aW5nIHRoZSB1c2VyIGFjY2VzcyB0byB0aGUKLQkJCWZ1bGwgc291cmNlIGNvZGUuCi0KLQkJCUZ1cnRoZXIsIGJ5IGV4cGxvaXRpbmcgdGhlIHBvd2VyIG9mIG1vZGVybgotCQkJY29tcGlsZXJzIGl0IHdhcyBob3BlZCB0aGF0IFBTSU0gd291bGQgYWNoaWV2ZQotCQkJZ29vZCBwZXJmb3JtYW5jZSB3aXRoIG91dCBoYXZpbmcgdG8gY29tcHJvbWlzZQotCQkJaXRzIGludGVybmFsIGRlc2lnbi4KLQotCi0JCW8JcHJhY3RpY2FsIHBvcnRhYmlsaXR5Ci0KLQkJCVJhdGhlciB0aGFuIHRyeSB0byBiZSBwb3J0YWJsZSB0byBldmVyeQotCQkJQyBjb21waWxlciBvbiBldmVyeSBwbGF0Zm9ybSwgaXQgd2FzIGRlY2lkZWQKLQkJCXRoYXQgUFNJTSB3b3VsZCByZXN0cmljdCBpdHMgc2VsZiB0byBzdXBwb3J0aW5nCi0JCQlBTlNJIGNvbXBpbGVycyB0aGF0IGluY2x1ZGVkIHRoZSBleHRlbnNpb24KLQkJCW9mIGEgbG9uZyBsb25nIHR5cGUuCi0KLQkJCUdDQyBpcyBvbmUgc3VjaCBjb21waWxlciwgY29uc2VxdWVudGx5IFBTSU0KLQkJCXNob3VsZCBiZSBwb3J0YWJsZSB0byBhbnkgbWFjaGluZSBydW5uaW5nIEdDQy4KLQotCi0JCW8JZmxleGliaWxpdHkgaW4gaXRzIGRlc2lnbgotCi0JCQlQU0lNIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgdGhlCi0JCQlmZWF0dXJlcyByZXF1aXJlZCBhbmQgY3VzdG9taXNlIHRoZSBidWlsZAotCQkJYWNjb3JkaW5nbHkuICBCeSBoYXZpbmcgdGhlIHNvdXJjZSBjb2RlLAotCQkJdGhlIGNvbXBpbGVyIGlzIGFibGUgdG8gZWxpbWluYXRlIGFueSB1bgotCQkJdXNlZCBmZWF0dXJlcyBvZiB0aGUgc2ltdWxhdG9yLgotCi0JCQlBZnRlciBhbGwsIGxldCB0aGUgY29tcGlsZXIgZG8gdGhlIHdvcmsuCi0KLQotCQlvCVNNUAotCi0JCQlBIG1vZGVsIHRoYXQgYWxsb3dlZCB0aGUgc2ltdWxhdGlvbiBvZgotCQkJU01QIHBsYXRmb3JtcyB3aXRoIG91dCB0aGUgbGFyZ2Ugb3ZlcmhlYWQKLQkJCW9mdGVuIGVuY291bnRlcmVkIHdpdGggc3VjaCBtb2RlbHMuCi0KLQotCVBTSU0gYWNoaWV2ZXMgZWFjaCBvZiB0aGVzZSBvYmplY3RpdmVzLgotCi0KLSAgICBJcyBQU0lNIFBvd2VyUEMgUGxhdGZvcm0gKFBQQ1ApIChuZWUgQ0hSUCkgQ29tcGxpYW50PwotCi0JTm8uCi0KLQlBbW9uZyBvdGhlciB0aGluZ3MgaXQgZG9lcyBub3QgaGF2ZSBhbiBBcHBsZSBST00gc29ja2V0LgotCi0KLSAgICBDb3VsZCBQU0lNIGJlIGV4dGVuZGVkIHNvIHRoYXQgaXQgbW9kZWxzIGEgQ0hSUCBtYWNoaW5lPwotCi0JWWVzLgotCi0JUFNJTSBoYXMgYmVlbiBkZXNpZ25lZCB3aXRoIHRoZSBDSFJQIHNwZWMgaW4gbWluZC4gVG8gbW9kZWwKLQlhIENIUlAgZGVza3RvcCB0aGUgZm9sbG93aW5nIHdvdWxkIG5lZWQgdG8gYmUgYWRkZWQ6Ci0KLQkJbwlBbiBhcHBsZSBST00gc29ja2V0IDotKQotCi0JCW8JTW9kZWwgb2YgZWFjaCBvZiB0aGUgZGVza3RvcCBJTyBkZXZpY2VzCi0KLQkJbwlBbiBPcGVuUElDIGRldmljZS4KLQotCQlvCVJUQVMgKFJ1biBUaW1lIEFic3RyYWN0aW9uIFNlcnZpY2VzKS4KLQotCQlvCUEgZnVsbHkgcG9wdWxhdGVkIGRldmljZSB0cmVlLgotCi0KLSAgICBJcyB0aGUgc291cmNlIGNvZGUgYXZhaWxhYmxlPwotCi0JWWVzLgotCi0JVGhlIHNvdXJjZSBjb2RlIHRvIFBTSU0gaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotCXRoZSBHTlUgUHVibGljIExpY2VuY2UuICBUaGlzIGFsbG93cyB5b3UgdG8gZGlzdHJpYnV0ZQotCXRoZSBzb3VyY2UgY29kZSBmb3IgZnJlZSBidXQgd2l0aCBjZXJ0YWluIGNvbmRpdGlvbnMuCi0KLQlTZWUgdGhlIGZpbGU6Ci0KLQkJZnRwOi8vYXJjaGllLmF1L2dudS9DT1BZSU5HCi0KLQlGb3IgZGV0YWlscyBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0KLQotICAgIFdoZXJlIGRvIEkgc2VuZCBidWdzIG9yIHJlcG9ydCBwcm9ibGVtcz8KLQotCVRoZXJlIGlzIGEgbWFpbGluZyBsaXN0IChzdWJzY3JpYmUgdGhyb3VnaCBtYWpvcmRvbW9AY2kuY29tLmF1KSBhdDoKLQotCXBvd2VycGMtcHNpbUBjaS5jb20uYXUKLQotCUlmIEkgZ2V0IHRoZSBmdHAgYXJjaGl2ZSB1cGRhdGVkIEkgcG9zdCBhIG5vdGUgdG8gdGhhdCBtYWlsaW5nIGxpc3QuCi0JSW4gYWRkaXRpb24geW91ciB3ZWxjb21lIHRvIHNlbmQgYnVncyBvciBwcm9ibGVtcyBlaXRoZXIgdG8gbWUgb3IgdG8KLQl0aGF0IGUtbWFpbCBsaXN0LgotCi0JVGhpcyBsaXN0IGN1cnJlbnRseSBhdmVyYWdlcyB6ZXJvIGFydGljbGVzIGEgZGF5LgotCi0KLSAgICAgRG9lcyBQU0lNIGhhdmUgYW55IGxpbWl0YXRpb25zIG9yIHByb2JsZW1zPwotCi0JUFNJTSBjYW4ndCBydW4gcnM2MDAwL0FJWCBiaW5hcmllcyAtIEF0IHByZXNlbnQgUFNJTSBjYW4gb25seQotCXNpbXVsYXRlIHN0YXRpYyBleGVjdXRhYmxlcy4gIFNpbmNlIGFuIEFJWCBleGVjdXRhYmxlIGlzCi0JbmV2ZXIgc3RhdGljLCBQU0lNIGlzIHVuYWJsZSB0byBzaW11bGF0ZSBpdHMgZXhlY3V0aW9uLgotCi0JUFNJTSBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCAtIGNvbnNlcXVlbnRseSB0aGVyZSBhcmUgZ29pbmcKLQl0byBiZSBidWdzLgotCi0JU2VlIHRoZSBmaWxlIEJVR1MgKGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24pIGZvciBhbnkKLQlvdGhlciBvdXRzdGFuZGluZyBpc3N1ZXMuCi0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvUlVOIGIvc2ltL3BwYy9SVU4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2NmZWYuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9SVU4KKysrIC9kZXYvbnVsbApAQCAtMSw5NDkgKzAsMCBAQAotCi0JCVBTSU0gLSBtb2RlbCB0aGUgUG93ZXJQQyBlbnZpcm9ubWVudAotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+LgotCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCQlSdW5uaW5nIFBTSU0KLQotCVRoaXMgZmlsZSBkZXNjcmliZXMgaG93IHRvIHJ1biB0aGUgcHJvZ3JhbSBQU0lNLgotCi0JbwlXYWxrIHRocm91Z2ggYSBudW1iZXIgb2YgZXhhbXBsZXMgZnJvbSB0aGUKLQkJcHJlLWJ1aWx0IHRhciBhcmNoaXZlIHBzaW0tdGVzdC4KLQotCW8JTG9va3MgYXQgdGhlIGRldmljZSB0cmVlIHVzZWQgYnkgUFNJTS4KLQotCW8JTm90ZXMgb24gYnVpbGRpbmcgYSBwcm9ncmFtbWVyIGVudmlyb25tZW50IHRvCi0JCXVzZSB3aXRoIFBTSU0gKEJTRC9VRUEgYW5kIEJVRy9PRUEpCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1SVU5OSU5HIFBTSU06Ci0KLQotVGhlIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgcHNpbS10ZXN0IGF2YWlsYWJsZSBmcm9tOgotCi0JZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9wc2ltLXRlc3QtMS4wLjEudGFyLmd6Ci1vcglmdHA6Ly9jYW1icmlkZ2UuY3lnbnVzLmNvbS9wdWIvcHNpbS9wc2ltLXRlc3QtMS4wLjEudGFyLmd6Ci0KLWNvbnRhaW5zIGEgbnVtYmVyIG9mIHByZS1idWlsdCBwcm9ncmFtcyBmb3IgcnVubmluZyB1bmRlciBQU0lNLiAgRWFjaAotcHJlLWJ1aWx0IGJpbmFyeSBpcyBidWlsdCBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gIFRoZSBzdWZmaXhlcwotLmJlLy5sZSAoZXhlY3V0YWJsZXMpIC5iby8ubG8gKG9iamVjdCBmaWxlcykgYW5kIC5iYS8ubGEgKGxpYnJhcmllcykKLWFyZSB1c2VkLgotCi0KLVRvIHJ1biBvbmUgb2YgdGhlc2UgcHJvZ3JhbXMsIHVzZToKLQotCXBvd2VycGMtdW5rbm93bi1lYWJpLXJ1biA8aW1hZ2U+Ci0KLWZvciBpbnN0YW5jZToKLQotCXBvd2VycGMtdW5rbm93bi1lYWJpLXJ1biBwc2ltLXRlc3QvdWVhL2VudnAKLQotVGhlIHByb2dyYW0gZW52cCBwcmludHMgb3V0IHlvdXIgc2hlbGxzIGVudmlyb25tZW50IC0gdmVyeSB1c2VmdWwhCi1Nb3JlIGdlbmVyYWxseSBwc2ltIGlzIHJ1biBhcyAodGhpcyBpcyBwYXJ0IG9mIHRoZSBvdXRwdXQgZnJvbSB0aGUgLWgKLW9wdGlvbik6Ci0KLSAgICAgICAgcHNpbSBbIDxwc2ltLW9wdGlvbj4gLi4uIF0gPGltYWdlPiBbIDxpbWFnZS1hcmc+IC4uLiBdCi0KLVdoZXJlCi0KLSAgICAgICAgPGltYWdlPiAgICAgICBOYW1lIG9mIHRoZSBQb3dlclBDIHByb2dyYW0gdG8gcnVuLgotICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGVpdGhlciBiZSBhIFBvd2VyUEMgYmluYXJ5IG9yCi0gICAgICAgICAgICAgICAgICAgICAgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhIGRldmljZSB0cmVlCi0gICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICBQU0lNIHdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgPGltYWdlPiB0aGUgaW50ZW5kZWQgZW11bGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgSWYgUFNJTSBnZXRzIGl0IHdyb25nLCB0aGUgZW11bGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBgLWUnIG9wdGlvbiAoZGVzY3JpYmVkIGJlbG93KS4KLQotICAgICAgICA8aW1hZ2UtYXJnPiAgIEFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byA8aW1hZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgPGltYWdlPiAoYXMgc3RhbmRhcmQgQyBhcmd2LCBhcmdjKQotICAgICAgICAgICAgICAgICAgICAgIHdoZW4gPGltYWdlPiBpcyBzdGFydGVkLgotCi0gICAgICAgIDxwc2ltLW9wdGlvbj4gU2VlIGJlbG93Ci0KLVRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIDxwc2ltLW9wdGlvbj5zOgotCi0gICAgICAgIC1tIDxtb2RlbD4gICAgU3BlY2lmeSB0aGUgcHJvY2Vzc29yIHRvIG1vZGVsICg2MDQpCi0gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0cyB0aGUgcHJvY2Vzc29yIHRvIHVzZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmcgZXhlY3V0aW9uIHVuaXRzLiAgSW5jbHVkZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgNjA0LCA2MDMgYW5kIDYwM2UKLQotICAgICAgICAtZSA8b3MtZW11bD4gIHNwZWNpZnkgYW4gT1Mgb3IgcGxhdGZvcm0gdG8gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAgICAgICAgICAgICAgYnVnIC0gT0VBICsgTU9UTyBCVUcgUk9NIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgICAgbmV0YnNkIC0gVUVBICsgTmV0QlNEIHN5c3RlbSBjYWxscwotICAgICAgICAgICAgICAgICAgICAgIGNoaXJwIC0gT0VBICsgYSBmZXcgT3BlbkJvb3QgY2FsbHMKLQotICAgICAgICAtaSAgICAgICAgICAgIFByaW50IGluc3RydWN0aW9uIGNvdW50aW5nIHN0YXRpc3RpY3MKLQotICAgICAgICAtSSAgICAgICAgICAgIFByaW50IGV4ZWN1dGlvbiB1bml0IHN0YXRpc3RpY3MKLQotICAgICAgICAtciA8c2l6ZT4gICAgIFNldCBSQU0gc2l6ZSBpbiBieXRlcyAoT0VBIGVudmlyb25tZW50cykKLQotICAgICAgICAtdCBbIV08dHJhY2U+IEVuYWJsZSAoZGlzYWJsZSkgPHRyYWNlPiBvcHRpb24KLQotICAgICAgICAtbyA8c3BlYz4gICAgIGFkZCBkZXZpY2UgPHNwZWM+IHRvIHRoZSBkZXZpY2UgdHJlZQotCi0gICAgICAgIC1oIC0/IC1IICAgICAgZ2l2ZSBtb3JlIGRldGFpbGVkIHVzYWdlCi0KLQotVGhlIGAtSCcgb3B0aW9uIGdpdmVzIGEgbG9uZyB1c2FnZSBvdXRwdXQuICBUaGlzIGluY2x1ZGVzIGEgY29tcGxldGUKLWxpc3Qgb2YgYWxsIHRoZSBwcmUtY29uZmlndXJlZCBkZXZpY2VzLgotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotUlVOTklORyBHREI6Ci0KLQotSWYgeW91IGJ1aWx0IFBTSU0gd2l0aCBnZGIgdGhlbiB0aGUgZm9sbG93aW5nIGlzIGEgcXVpY2sgc3RhcnQKLXR1dG9yaWFsLgotCi1BdCBwcmVzZW50IEdEQiwgaWYgY29uZmlndXJlZCBiaWctZW5kaWFuIChzYXkpIHVubGlrZSBQU0lNLCBkb2VzIG5vdAotc3VwcG9ydCB0aGUgZGVidWdnaW5nIG9mIGxpdHRsZSBlbmRpYW4gYmluYXJpZXMuICBJZiB5b3UgZmluZCB0aGF0Ci15b3VyIHByb2dyYW0gd29uJ3QgcnVuIGF0IGFsbCwgbWFrZSBjZXJ0YWluIHRoYXQgR0RCIGFuZCB5b3VyCi1wcm9ncmFtJ3MgZW5kaWFubmVzcyBtYXRjaC4KLQotCi1UaGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCBiZWZvcmUgeW91IGNhbiBydW4gdGhlIHNpbXVsYXRvciB5b3UKLW11c3QgZW5hYmxlIGl0LiAgRm9yIHRoZSBzaW11bGF0b3IsIGdkYiBpcyBzdGFydGVkIGxpa2UgYW55IHByb2dyYW06Ci0KLQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLWdkYiBwc2ltLXRlc3QvdWVhL2VudnAuYmUKLQotTmV4dCB0aGUgc2ltdWxhdG9yIGlzIGVuYWJsZWQuICBUaGUgY29tbWFuZCBgdGFyZ2V0IHNpbScgYWNjZXB0cyB0aGUKLXNhbWUgb3B0aW9ucyBhcyBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBQU0lNIGNvbW1hbmQgbGluZS4KLQotCShnZGIpIHRhcmdldCBzaW0KLQotVG8gdHJhY2UgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwc2ltIGFuZCBnZGIgc3BlY2lmeSBgdGFyZ2V0IHNpbSAtdAotZ2RiJy4gIE9uY2UgZW5hYmxlZCwgdGhlIGJpbmFyeSBuZWVkcyB0byBiZSBsb2FkZWQsIGFueSBicmVha3BvaW50cyBvZgotaW50ZXJlc3Qgc2V0LCBhbmQgdGhlIHByb2dyYW0gcnVuOgotCi0JKGdkYikgbG9hZAotCShnZGIpIGJyZWFrIG1haW4KLQkoZ2RiKSBydW4KLQkuCi0JLgotCS4KLQotSW4gYWRkaXRpb24sIGlmIHlvdSBhcmUgd2FudGluZyB0byBydW4gYSBwcm9ncmFtIGRlc2NyaWJlZCBieSBhIGRldmljZQotdHJlZSB5b3UgY2FuIGBhdHRhY2gnIHRvIHRoZSBzaW11bGF0aW9uIHVzaW5nIChJIGFzc3VtZSB0aGF0IHlvdSBoYXZlCi1hcHBsaWVkIHRoZSBhdHRhY2ggcGF0Y2gpOgotCi0JJCBjZCBwc2ltLXRlc3QvdHJlZQotCSQgcG93ZXJwYy11bmtub3duLWVhYmktZ2RiCi0JKGdkYikgdGFyZ2V0IHNpbQotCShnZGIpIGF0dGFjaCBkZXZpY2UtdHJlZQotCShnZGIpIHJ1bgotCi1IZXJlIEdEQiB0YWtlcyB0aGUgcHJvZ3JhbXMgaW5pdGlhbCBzdGF0ZSBmcm9tIHRoZSBhdHRhY2hlZAotZGV2aWNlLXRyZWUgaW5zdGVhZCBvZiBmb3JjaW5nIGluaXRpYWxpc2F0aW9uLgotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotUFJPRklMSU5HOgotCi0KLVBTSU0gaW5jbHVkZXMgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAocHJvZmlsaW5nKQotZmFjaWxpdGllczoKLQotCW8JaW5zdHJ1Y3Rpb24gZnJlcXVlbmN5IGNvdW50aW5nCi0KLQlvCWV4ZWN1dGlvbiB1bml0IG1vZGVsaW5nIChyZWNvcmRzCi0JCWVmZmVjdGl2ZSB1c2FnZSBvZiB1bml0cykuCi0KLQlvCWluc3RydWN0aW9uIGNhY2hlIHBlcmZvcm1hbmNlCi0KLUFzIGRpc2N1c3NlZCBpbiB0aGUgZmlsZSBJTlNUQUxMLCBlYWNoIGNhbiBiZSBjb25maWd1cmVkIHRvIGluZGl2aWR1YWwKLXJlcXVpcmVtZW50cy4KLQotCi0JLWkJRW5hYmxlIGluc3RydWN0aW9uIGNvdW50aW5nLgotCi0JCVRoZSBmcmVxdWVuY3kgb2YgYWxsIGluc3RydWN0aW9ucyBpcyB0YWJ1bGF0ZWQuICBJbgotCQlhZGRpdGlvbiAoZiBjb25maWd1cmVkKSB0aGUgaGl0L21pc3MgcmF0ZSBvZiB0aGUKLQkJaW5zdHJ1Y3Rpb24gY2FjaGUgaXMgb3V0cHV0LgotCi0KLQktSQlFbmFibGUgZXhlY3V0aW9uIHVuaXQgYW5hbHlzaXMuCi0KLQkJSW4gYWRkaXRpb24gdG8gY291bnRpbmcgYmFzaWMgaW5zdHJ1Y3Rpb25zIGFsc28gbW9kZWwKLQkJdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBwcm9jZXNzb3JzIGV4ZWN1dGlvbiB1bml0cwotCi0KLQktbSA8cHJvY2Vzc29yPgotCi0JCVNlbGVjdCB0aGUgcHJvY2Vzc29yIHRvIGJlIG1vZGVsbGVkLgotCi0JCUZvciBleGVjdXRpb24gdW5pdCBhbmFseXNpcyBzcGVjaWZ5IHRoZSBwcm9jZXNzb3IgdGhhdAotCQlpcyB0byBiZSBhbmFseXNlZC4gIEJ5IGRlZmF1bHQgdGhlIDYwNCBpcyBtb2RlbGxlZAotCQlob3dldmVyLCBzdXBwb3J0IGZvciBvdGhlciBwcm9jZXNzb3JzIHN1Y2ggYXMgdGhlCi0JCTYwMyBhbmQgNjAzZSBpcyBpbmNsdWRlZC4KLQotVGhlIG91dHB1dCBmcm9tIGEgcGVyZm9ybWFuY2UgcnVuIChvbiBhIFA5MCkgZm9yIHRoZSBwcm9ncmFtCi1wc2ltLXRlc3QvcHJvZmlsZS9iZW5jaCBpcyBiZWxvdy4gIEluIHRoaXMgcnVuIHBzaW0gd2FzIGZhaXJseQotYWdyZXNzaXZlbHkgY29uZmlndXJlZCAoc2VlIHRoZSBmaWxlIElOU1RBTEwgZm9yIGNvbXBpbGUgdGltZQotY29uZmlndXJhdGlvbikuCi0KLQlDUFUgIzEgZXhlY3V0ZWQgICAgIDQxLDk5NCBBTkQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA1MTksNzg1IEFORCBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA2ODAsMDU4IEFkZCBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgICA0MSw5OTQgQWRkIEV4dGVuZGVkIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgOTIxLDkxNiBBZGQgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMjIxLDE5OSBBZGQgSW1tZWRpYXRlIENhcnJ5aW5nIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgOTQzLDgyMyBBZGQgSW1tZWRpYXRlIFNoaWZ0ZWQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA0NzEsOTA5IEFkZCB0byBaZXJvIEV4dGVuZGVkIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgNTcxLDkxNSBCcmFuY2ggaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgMSw5OTIsNDAzIEJyYW5jaCBDb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDU3MSw5MTAgQnJhbmNoIENvbmRpdGlvbmFsIHRvIExpbmsgUmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICAzMjAsNDMxIENvbXBhcmUgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA0NzEsOTExIENvbXBhcmUgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMTQ1LDg2NyBDb21wYXJlIExvZ2ljYWwgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA0NDIsNDE0IENvbXBhcmUgTG9naWNhbCBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIENvbmRpdGlvbiBSZWdpc3RlciBYT1IgaW5zdHJ1Y3Rpb24uCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDEwMyw4NzMgRGl2aWRlIFdvcmQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICAxMDQsMjc1IERpdmlkZSBXb3JkIFVuc2lnbmVkIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMTMyLDUxMCBFeHRlbmQgU2lnbiBCeXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMTc4LDg5NSBFeHRlbmQgU2lnbiBIYWxmIFdvcmQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA4NzEsOTIwIExvYWQgV29yZCBhbmQgWmVybyBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgICA0MSw5OTQgTW92ZSBGcm9tIENvbmRpdGlvbiBSZWdpc3RlciBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDEwMCwwMDUgTW92ZSBmcm9tIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDEwMCwwMDIgTW92ZSB0byBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA4MDQsNjE5IE11bHRpcGx5IExvdyBXb3JkIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgNDIxLDIwMSBPUiBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDQ3MSw5MTAgT1IgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgIDEsMjkyLDAyMCBSb3RhdGUgTGVmdCBXb3JkIEltbWVkaWF0ZSB0aGVuIEFORCB3aXRoIE1hc2sgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA2NjMsNjEzIFNoaWZ0IExlZnQgV29yZCBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAxLDE1MSw1NjQgU2hpZnQgUmlnaHQgQWxnZWJyYWljIFdvcmQgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgODcxLDkyMiBTdG9yZSBXb3JkIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMTAwLDAwNCBTdG9yZSBXb3JkIHdpdGggVXBkYXRlIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgODg3LDgwNCBTdWJ0cmFjdCBGcm9tIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgIDgzLDk4OCBTdWJ0cmFjdCBGcm9tIEltbWVkaWF0ZSBDYXJyeWluZyBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgICAgICAgIDEgU3lzdGVtIENhbGwgaW5zdHJ1Y3Rpb24uCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDIwNyw3NDYgWE9SIGluc3RydWN0aW9ucy4KLQkKLQlDUFUgIzEgZXhlY3V0ZWQgMjMsNzQwLDg1NiBjeWNsZXMuCi0JQ1BVICMxIGV4ZWN1dGVkIDEwLDI0Miw3ODAgc3RhbGxzIHdhaXRpbmcgZm9yIGRhdGEuCi0JQ1BVICMxIGV4ZWN1dGVkICAgICAgICAgIDEgc3RhbGwgd2FpdGluZyBmb3IgYSBmdW5jdGlvbiB1bml0LgotCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIHN0YWxsIHdhaXRpbmcgZm9yIHNlcmlhbGl6YXRpb24uCi0JQ1BVICMxIGV4ZWN1dGVkICAxLDc1Nyw5MDAgdGltZXMgYSB3cml0ZS1iYWNrIHNsb3Qgd2FzIHVuYXZhaWxhYmxlLgotCUNQVSAjMSBleGVjdXRlZCAgMSwwODgsMTM1IGJyYW5jaGVzLgotCUNQVSAjMSBleGVjdXRlZCAgMiwwNDgsMDkzIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGZlbGwgdGhyb3VnaC4KLQlDUFUgIzEgZXhlY3V0ZWQgIDEsMDg4LDEzNSBzdWNjZXNzZnVsIGJyYW5jaCBwcmVkaWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgOTA0LDI2OCB1bnN1Y2Nlc3NmdWwgYnJhbmNoIHByZWRpY3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgICA3NDIsNTU3IGJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIEZBTFNFIGNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCUNQVSAjMSBleGVjdXRlZCAgMSwyNDksODQ2IGJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIFRSVUUgY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDU3MSw5MTAgYnJhbmNoIGFsd2F5cyBjb25kaXRpb25hbCBicmFuY2hlcy4KLQlDUFUgIzEgZXhlY3V0ZWQgIDksNDkzLDY1MyAxc3Qgc2luZ2xlIGN5Y2xlIGludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgIDEsMjIwLDkwMCAybmQgc2luZ2xlIGN5Y2xlIGludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgIDEsMjU0LDc2OCBtdWx0aXBsZSBjeWNsZSBpbnRlZ2VyIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkICAxLDg0Myw4NDYgbG9hZC9zdG9yZSBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAgMywxMzYsMjI5IGJyYW5jaCBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb25zLgotCUNQVSAjMSBleGVjdXRlZCAxNiw5NDksMzk2IGluc3RydWN0aW9ucyB0aGF0IHdlcmUgYWNjb3VudGVkIGZvciBpbiB0aW1pbmcgaW5mby4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgODcxLDkyMCBkYXRhIHJlYWRzLgotCUNQVSAjMSBleGVjdXRlZCAgICA5NzEsOTI2IGRhdGEgd3JpdGVzLgotCUNQVSAjMSBleGVjdXRlZCAgICAgICAgMjIxIGljYWNoZSBtaXNzZXMuCi0JQ1BVICMxIGV4ZWN1dGVkIDE2LDk0OSwzOTYgaW5zdHJ1Y3Rpb25zIGluIHRvdGFsLgotCQotCVNpbXVsYXRvciBzcGVlZCB3YXMgMjUwLDczMSBpbnN0cnVjdGlvbnMvc2Vjb25kCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1QU0lNIENPTkZJR1VSQVRJT04gLSBUSEUgREVWSUNFIFRSRUUKLQotCi1JbnRlcm5hbGx5IFBTSU0ncyBjb25maWd1cmF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgYSB0cmVlIGRhdGEKLXN0cnVjdHVyZS4gIFRoaXMgc3RydWN0dXJlLCBjcmVhdGVkIGF0IHJ1bi10aW1lLCBpbnRlbnRpb25hbGx5Ci1yZXNlbWJsZXMgdGhlIGRldmljZSB0cmVlIHVzZWQgYnkgT3BlbkJvb3QgZmlybXdhcmUgdG8gZGVzY3JpYmUgYQotbWFjaGluZXMgaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KLQotUFNJTSBjYW4gZWl0aGVyIGNyZWF0ZSBpdHMgZGV2aWNlIHRyZWUgdXNpbmcgYSBidWlsdGluIGVtdWxhdGlvbiBvcgotZnJvbSBvbmUgcmVhZCBpbiBmcm9tIGEgZmlsZS4KLQotRHVyaW5nIHN0YXJ0dXAsIHRoZSBkZXZpY2UgdHJlZSBpcyBjcmVhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLQlvCUluaXRpYWwgZW1wdHkgdHJlZSBpcyBjcmVhdGVkCi0KLQlvCUFueSB0cmVlIGVudHJ5IG9wdGlvbnMgc3BlY2lmaWVkIG9uIHRoZQotCQljb21tYW5kIGxpbmUgYXJlIG1lcmdlZCBpbiAodGhlIC1vIDxlbnRyeT4KLQkJb3B0aW9uIGlzIHVzZWQpLgotCi0JCUl0IHNob3VsZCBiZSBwb2ludGVkIG91dCB0aGF0IG1vc3Qgb2YgdGhlCi0JCWNvbW1hbmQgbGluZSBvcHRpb25zIChlZyAtciwgLWUsIC1tLCAtdAotCQlhcmUgYWxsIGp1c3Qgc2hvcnQgaGFuZCBmb3IgY29ycmVzcG9uZGluZwotCQktbyBvcHRpb25zKS4KLQotCW8JSWYgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGlzIGEgZGV2aWNlIHRyZWUgc3BlYywgdGhhdAotCQlpcyBsb2FkZWQuCi0KLQkJSWYgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGlzIGEgdGV4dCBmaWxlIGl0IGlzIGFzc3VtZWQKLQkJdGhhdCB0aGF0IGZpbGUgY29udGFpbnMgYSBmdXJ0aGVyIHNwZWNpZmljYXRpb24gb2YgdGhlCi0JCXNpbXVsYXRvcnMgZGV2aWNlIHRyZWUuICBUaGF0IHRyZWUgaXMgbG9hZGVkIGFuZAotCQltZXJnZWQgd2l0aCB0aGUgY3VycmVudCB0cmVlIG9wdGlvbnMuCi0KLQlvCVRoZSBzZWxlY3RlZCBlbXVsYXRpb24gZmlsbHMgb3V0IGFueSByZW1haW5pbmcgZGV0YWlscy4KLQotCQlCeSB0aGlzIHN0YWdlIHRoZSBlbXVsYXRpb24gZW52aXJvbm1lbnQgdGhhdCB0aGUgcHJvZ3JhbQotCQluZWVkcyB3aWxsIGVpdGhlciBiZSBzcGVjaWZpZWQgaW4gdGhlIGRldmljZSB0cmVlCi0JCSh0aHJvdWdoIHRoZSAtZSBvcHRpb24pIG9yIGRldGVybWluZWQgZnJvbSB0aGUKLQkJY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiaW5hcnkuCi0KLQkJVGhlIHNlbGVjdGVkIGVtdWxhdGlvbiB3aWxsIHRoZW4gZmlsbCBvdXQgYW55IG1pc3NpbmcKLQkJbm9kZXMgaW4gdGhlIGRldmljZSB0cmVlLgotCi1Nb3N0IGltcG9ydGFudGx5IGVhcmxpZXIgYWRkaXRpb25zIHRvIHRoZSB0cmVlIGFyZSBub3Qgb3ZlcnJpZGRlbiBieQotbGF0ZXIgYWRkaXRpb25zLiAgVGh1cywgY29tbWFuZCBsaW5lIG9wdGlvbnMgb3ZlcnJpZGUgaW5mb3JtYXRpb24KLWZvdW5kIGluIHRoZSBwcm9ncmFtIGZpbGUgYW5kIGJvdGggb3ZlcnJpZGUgYW55IGJ1aWx0aW4gZW11bGF0aW9uCi1lbnRyaWVzLgotCi1UaGUgZm9sbG93aW5nIGlzIGEgc3VtbWFyeSBvZiB0aGUgbW9zdCB1c2VmdWwgcnVudGltZSBjb25maWd1cmF0aW9uCi1vcHRpb25zOgotCi0JLWUgPG9zLWVtdWw+Ci0JLW8gJy9vcGVucHJvbS9vcHRpb25zL29zLWVtdWwgPG9zLWVtdWw+JwotCi0JCVJ1biBwcm9ncmFtIHVzaW5nIHRoZSA8ZW11bGF0aW9uPiBydW4tdGltZQotCQllbnZpcm9ubWVudC4KLQotCS1yIDxyYW0tc2l6ZT4KLQktbyAnL29wZW5wcm9tL29wdGlvbnMvb2VhLW1lbW9yeS1zaXplIDxyYW0tc2l6ZT4nCi0KLQkJU2V0IHRoZSBzaXplIG9mIHRoZSBmaXJzdCBiYW5rIG9mIG1lbW9yeQotCQkoUkFNIGZyb20gYWRkcmVzcyAwIHVwKS4KLQotCS10IHByaW50LWRldmljZS10cmVlCi0JLW8gJy9vcGVucHJvbS90cmFjZS9wcmludC1kZXZpY2UtdHJlZSAxJwotCi0JLXQgZHVtcC1kZXZpY2UtdHJlZQotCS1vICcvb3BlbnByb20vdHJhY2UvZHVtcC1kZXZpY2UtdHJlZSAxJwotCi0JCVByaW50IG91dCB0aGUgZGV2aWNlIHRyZWUgb25jZSBpdCBoYXMgYmVlbiBmdWxseQotCQlwb3B1bGF0ZWQuIEZvciBkdW1wLWRldmljZS10cmVlLCBleGl0IHNpbXVsYXRvciBhZnRlcgotCQlkdW1waW5nIHRoZSB0cmVlLgotCi0JCVBTSU0gaXMgYWJsZSB0byByZWxvYWQgdGhlIGR1bXBlZCBkZXZpY2UgdHJlZS4KLQotCQlUaGUgZm9ybWF0IG9mIHRoZSBkdW1wZWQgdHJlZSBpcyB1bmRlciBkZXZlbG9wbWVudC4KLQotCS1vICcvb3BlbnByb20vb3B0aW9ucy9zbXAgPE4+JwotCi0JCUVuYWJsZSA8Tj4gcHJvY2Vzc29ycyBmb3IgdGhlIHNpbXVsYXRpb24gcnVuLgotCQlTZWUgdGhlIGRpcmVjdG9yeSBwc2ltLXRlc3Qvb2VhIGZvciBhbiBleGFtcGxlLgotCi0JLW8gJy9vcGVucHJvbS9vcHRpb25zL2FsaWdubWVudCA8Tj4nCi0KLQkJV2hlcmUgPE4+IGlzIDEgLSBub25zdHJpY3Qgb3IgMiAtIHN0cmljdC4KLQkJU3BlY2lmeSBpZiB0aGUgbWlzc2FsaWduZWQgYWNjZXNzIGFyZSBhbGxvd2VkCi0JCShub24tc3RyaWN0KSBvciByZXN1bHQgaW4gYW4gYWxpZ25tZW50IGV4Y2VwdGlvbgotCQkoc3RyaWN0KS4KLQotRGV2aWNlcyAoaWYgaW5jbHVkZWQgaW4gdGhlIGZpbGUgZGV2aWNlX3RhYmxlLmMpIGNhbiBhbHNvIGJlIHNwZWNpZmllZAotaW4gYSBzaW1pbGFyIHdheS4gIEZvciBpbnN0YW5jZSwgdG8gYWRkIGEgc2Vjb25kIHNlcmlhbCBwb3J0LCBhCi1jb21tYW5kIGxpa2U6Ci0KLQktbyAnL2lvYnVzQDB4NDAwMDAwL2NvbnNvbGVAMHgwMDAwMTAnCi0KLXdvdWxkIGNyZWF0ZSBhIGBjb25zb2xlJyBkZXZpY2UgYXQgb2Zmc2V0IDB4MTAgd2l0aGluIHRoZSBgaW9idXMnIGF0Ci1tZW1vcnkgYWRkcmVzcyAweDQwMDAwMC4KLQotRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gZGV2aWNlIHNwZWNpZmllcnMgc2VlIHRoZSBub3RlcyBvbgotdGhlIGZ1bmN0aW9uIGR1bXBfZGV2aWNlX3RyZWUgaW4gdGhlIGZpbGUgZGV2aWNlLmMgKGZvdW5kIGluIHRoZQotc291cmNlIGNvZGUpLgotCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotQlVJTERJTkcgQSBCVUcvT0VBIERFVkVMT1BNRU5UIEVOVklST05NRU5UCi0KLQotQmFja2dyb3VuZDoKLQotCi1JbmNsdWRlZCBpbiBtYW55IFBvd2VyUEMgc3lzdGVtcyBpcyBNb3Rvcm9sYSdzIEJVRyBtb25pdG9yLiAgVGhpcwotbW9uaXRvciBpbmNsdWRlcywgZm9yIGNsaWVudCBwcm9ncmFtcywgYSBzZXQgb2Ygc2VydmljZXMgdGhhdCBhbGxvdwotdGhhdCBwcm9ncmFtIHRvIGludGVyYWN0IHdpdGggaGFyZHdhcmUgZGV2aWNlcyBzdWNoIGFzIHRoZSBjb25zb2xlIHVzaW5nCi1hIHNpbXBsZSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UuCi0KLVBTSU0gaXMgYWJsZSB0byBlbXVsYXRlIGEgbnVtYmVyIG9mIHRoZSBzZXJ2aWNlcyAoaW5jbHVkaW5nIHRoZQotY29uc29sZSBJTyBjYWxscykuICBJZiBhZGRpdGlvbmFsIHNlcnZpY2VzIGFyZSBuZWVkZWQgdGhleSBjYW4gZWFzaWx5Ci1iZSBhZGRlZC4KLQotQ3lnbnVzIHN1cHBvcnQncyBuZXdsaWIgbGlicmFyeSBpbmNsdWRlcyBpbmNsdWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlCi1NT1RPIEJVRyBzZXJ2aWNlcy4gIFRoZSBub3RlcyBiZWxvdyBkaXNjdXNzIGhvdyBJIGJvdGggYnVpbHQgYW5kIHJ1bgotcHJvZ3JhbXMgY29tcGlsZWQgdXNpbmcgdGhpcyBsaWJyYXJ5IG9uIFBTSU0uCi0KLVRoZSBvbmx5IGNvbmZ1c2luZyBwYXJ0IGFib3V0IGJ1aWxkaW5nIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgYmFzZWQKLWFyb3VuZCBuZXdsaWIvYmludXRpbHMvZ2NjIGlzIGEgY2hpY2tlbi9lZ2cgcHJvYmxlbSB3aXRoIGluY2x1ZGUKLWZpbGVzOgotCQkKLQlGb3IgR0NDIHRvIGJ1aWxkLCBhIGZhaXJseSBjb21wbGV0ZSBzZXQgb2YgaW5jbHVkZQotCWZpbGVzIG11c3QgYmUgaW5zdGFsbGVkIGJ1dCBuZXdsaWIgd29uJ3QgaW5zdGFsbCBpdHMKLQlpbmNsdWRlIGZpbGVzIHVudGlsIGl0IGhhcyBiZWVuIGJ1aWx0IHdpdGggZ2NjIC4uLgotCi1JIGdldCBhcm91bmQgdGhpcyBieSBpbnN0YWxsaW5nIHRoZSBwcm9ibGVtYXRpYyBpbmNsdWRlIGZpbGVzIGJ5IGhhbmQuCi0KLQotUHJlcGFyYXRpb246Ci0KLQotVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbmVlZGVkOgotCi1Gcm9tIHlvdXIgZmF2b3JpdGUgRlRQIHNpdGUsIHRoZSBzb3VyY2VzIHRvIGdhcy9sZCBhbmQgZ2NjIC0gbWluZQotaGFwcGVucyB0byBiZSBhcmNoaWUuYXUgOgotCi0JZnRwOi8vYXJjaGllLmF1L2dudS9iaW51dGlscy0yLjYudGFyLmd6Ci0JZnRwOi8vYXJjaGllLmF1L2dudS9nY2MtMi43LjIudGFyLmd6Ci0KLUZyb20gZnRwOi8vZnRwLmN5Z251cy5jb20vcHViL25ld2xpYiB0aGUgc291cmNlIGNvZGUgdG8gYSBsaWJyYXJ5OgotCi0JZnRwOi8vZnRwLmN5Z251cy5jb20vcHViL25ld2xpYi9uZXdsaWItMS43LjAudGFyLmd6Ci0KLUZyb20gZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbSBzb21lIG1pbm9yIHBhdGNoZXMgYW5kIHVwZGF0ZXMgdG8KLXRoZSBhYm92ZSBsaWJyYXJ5OgotCi0JZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9uZXdsaWItMS43LjArZmxvYXQrcHBjLWFzbS50YXIuZ3oKLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL25ld2xpYi0xLjcuMCtwcGMtZml4LmRpZmYuZ3oKLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL2JpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3oKLQotSW4gYWRkaXRpb24geW91J2xsIG5lZWQgdG8gZGVjaWRlIHdoZXJlIHlvdSB3aWxsIGJlIGluc3RhbGxpbmcgdGhlCi1kZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gIFlvdSB3aWxsIG5vdGljZSB0aGF0IGluIHRoZSBiZWxvdyBJIGluc3RhbGwKLXRoaW5ncyB3ZWxsIGF3YXkgL3Vzci9sb2NhbCBpbnN0ZWFkIGluc3RhbGxpbmcgZXZlcnl0aGluZyB1bmRlciBpdHMKLW93biBkaXJlY3RvcnkgaW4gL2FwcGxpY2F0aW9ucy4KLQotCi1NZXRob2Q6Ci0KLQotVGhlc2Ugbm90ZXMgYXJlIGJhc2VkIG9uIGFuIGluc3RhbGxhdGlvbiBwZXJmb3JtZWQgb24gYSBTdW4tT1MtNC9TUEFSQwotaG9zdC4gIEZvciBvdGhlciBob3N0cyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbnMsIHRoZSBiZWxvdyBzaG91bGQgYmUKLWNvbnNpZGVyZWQgYXMgYSBndWlkZWxpbmUgb25seS4KLQotCi0gCW8JU2FuaXR5IGNoZWNrCi0KLQkJJCBjZCAuLi4vc2NyYXRjaAkjIHlvdXIgc2NyYXRjaCBkaXJlY3RvcnkKLQkJJCBscyAtMQotCQliaW51dGlscy0yLjYudGFyLmd6Ci0JCWJpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3oKLQkJZ2NjLTIuNy4yLHRhci5negotCQluZXdsaWItMS43LjArZmxvYXQrcHBjLWFzbS50YXIuZ3oKLQkJbmV3bGliLTEuNy4wK3BwYy1maXguZGlmZi5negotCQluZXdsaWItMS43LjAudGFyLmd6Ci0KLQotCW8JVW5wYWNrL2J1aWxkL2luc3RhbGwgYmludXRpbHMKLQotCQlUaGlzIGlzIGRvbmUgZmlyc3Qgc28gdGhhdCB0aGVyZSBpcyBhIGdhcy9sZCByZWFkeQotCQlmb3IgdGhlIGJ1aWxkaW5nIG9mIEdDQyBhbmQgTkVXTElCLgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBndW56aXAgPCBiaW51dGlscy0yLjYudGFyLmd6IHwgdGFyIHhmIC0KLQkJJCBjZCBiaW51dGlscy0yLjYKLQotCQlPcHRpb25hbGx5IGFwcGx5IHRoZSBub3RlIHBhdGNoCi0KLQkJJCBndW56aXAgLi4vYmludXRpbHMtMi42K25vdGUuZGlmZi5neiB8IHBhdGNoCi0KLQkJVGhlbiBjb250aW51ZSB3aXRoIHRoZSBidWlsZAotCi0JCSQgLi9jb25maWd1cmUgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltCi0JCSQgbWFrZQotCQkkIG1ha2UgaW5zdGFsbAotCQkkIGNkIC4uCi0JCSQgcm0gLXJmIGJpbnV0aWxzLTIuNgotCi0JCVRoaXMgYWxzbyBjcmVhdGVzIG11Y2ggb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKLQkJdHJlZS4KLQotCi0JbwlVbnBhY2sgbmV3bGliLCBpbnN0YWxsIHRoZSBpbmNsdWRlIGZpbGVzIHNvIHRoYXQgdGhleQotCQlhcmUgcmVhZHkgZm9yIEdDQydzIGJ1aWxkLgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBndW56aXAgPCBuZXdsaWItMS43LjAudGFyLmd6IHwgdGFyIHhmIC0KLQotCQlOZXcgbGliLTEuNy4wIGhhZCBhIGZldyBtaW5vciBidWdzIChmaXhlZCBpbiBjdXJyZW50KToKLQkJdGhlIGhlYWRlciBmaWxlcyBmbG9hdC5oIGFuZCBwcGMtYXNtLmggd2VyZSBtaXNzaW5nOwotCQl0aGUgY29uZmlndXJlIGFuZCBNYWtlZmlsZSdzIGZvciB0aGUgcnM2MDAwIChwcGMpIGRpcmVjdG9yeQotCQljb250YWluZWQgdHlwb3M6Ci0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGNkIG5ld2xpYi0xLjcuMAotCQkkIGd1bnppcCA8IC4uL25ld2xpYi0xLjcuMCtmbG9hdCtwcGMtYXNtLnRhci5neiB8IHRhciB4dmYgLQotCQkkIGd1bnppcCA8IC4uL25ld2xpYi0xLjcuMCtwcGMtZml4LmRpZmYuZ3ogfCBwYXRjaCAtcDEKLQkJCi0JCUZpbmFsbHkgY29weSB0aGUgaW5jbHVkZSBmaWxlcyB0byB3aGVyZSBHQ0Mgd2lsbCBzZWUgdGhlbToKLQotCQkkIGNkIC4uLi9zY3JhdGNoCi0JCSQgY2QgbmV3bGliLTEuNy4wL25ld2xpYi9saWJjCi0JCSQgdGFyIGNmIC0gaW5jbHVkZSB8IFwKLSAgICAgICAgICAgICAgICAgICAoIGNkIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaSAmJiB0YXIgeGYgLSApCi0KLQotCW8JVW5wYWNrL2J1aWxkIGdjYwotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBndW56aXAgPCBnY2MtMi43LjIsdGFyLmd6IHwgdGFyIHhmIC0KLQkJJCBjZCBnY2MtMi43LjIKLQkJJCAuL2NvbmZpZ3VyZSAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KLQkJJCBtYWtlCi0JCSQgbWFrZSBpbnN0YWxsCi0JCSQgY2QgLi4KLQkJJCBybSAtcmYgZ2NjLTIuNy4yCi0KLQkJR2NjIGxpa2VzIHRvIGluc3RhbGwgaXRzIG93biBkdW1teSB2ZXJzaW9uIG9mIGZsb2F0IHRoYXQKLQkJanVzdCByZXR1cm5zIGFuIGVycm9yLgotCi0JCSQgbW9yZSAvYXBwbGljYXRpb25zL3BzaW0vbGliL2djYy1saWIvcG93ZXJwYy11bmtub3duLWVhYmkvMi43LjIvaW5jbHVkZS9mbG9hdC5oCi0JCSQgcm0gL2FwcGxpY2F0aW9ucy9wc2ltL2xpYi9nY2MtbGliL3Bvd2VycGMtdW5rbm93bi1lYWJpLzIuNy4yL2luY2x1ZGUvZmxvYXQuaAotCi0KLQlvCUZpbmlzaCBidWlsZGluZy9pbnN0YWxsaW5nIG5ld2xpYgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBuZXdsaWItMS43LjAKLQkJJCAuL2NvbmZpZ3VyZSAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KLQotCQlZb3VyIHBhdGggd2lsbCBuZWVkIHRvIGluY2x1ZGUgdGhlIHJlY2VudGx5IGluc3RhbGxlZAotCQlnYXMvZ2NjIHdoZW4gYnVpbGRpbmcuICBFaXRoZXIgYWRkIGl0IHRvIHlvdXIgcGF0aCBvcgotCQl1c2U6Ci0KLQkJJCBQQVRIPS9hcHBsaWNhdGlvbnMvcHNpbS9iaW46JFBBVEggbWFrZQotCQkkIFBBVEg9L2FwcGxpY2F0aW9ucy9wc2ltL2JpbjokUEFUSCBtYWtlIGluc3RhbGwKLQotCi0JbwlGaW5hbGx5LCB0ZXN0IG91dCB0aGUgYnVpbGQKLQotCQkkIGNhdCBoZWxsby5jCi0JCW1haW4oKQotCQl7Ci0JCSAgcHJpbnRmKCJoZWxsbyB3b3JsZFxuIik7Ci0JCX0KLQotCQlUaGUgYmluYXJ5IGlzIGxpbmtlZCB3aXRoIGFuIGVudHJ5IHBvaW50IGxlc3MgdGhhbiAweDEwMDAwMAotCQkoMW1iKSBzbyB0aGF0IHBzaW0gd2lsbCByZWNvZ25pemUgdGhlIGJpbmFyeSBhcyBuZWVkaW5nCi0JCXRoZSBCVUcvT0VBIGluc3RlYWQgb2YgdGhlIEJTRC9VRUEgcnVudGltZSBlbnZpcm9ubWVudC4KLQotCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLWdjYyAtdiAtbyBoZWxsbyBcCi0gICAgICAgICAgICAgICAgICAgIC1XbCwtVHRleHQsMHg0MDAwLC1UZGF0YSwweDEwMDAwIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2xpYi9tdm1lLWNydDAubyBcCi0gICAgICAgICAgICAgICAgICAgIGhlbGxvLmMgXAotICAgICAgICAgICAgICAgICAgICAtbGMgLWxtdm1lCi0JCSQgcG93ZXJwYy11bmtub3duLWVhYmktb2JqZHVtcCAtaCBoZWxsbwotCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLXJ1biBoZWxsbwotCi0JCUl0IGlzIGFsc28gcG9zc2libGUgdG8gZm9yY2UgcHNpbSB0byB1c2UgYSBzcGVjaWZpYwotCQlydW4tdGltZSBlbnZpcm9ubWVudCB1c2luZyB0aGUgLWUgb3B0aW9uIHZpczoKLQotCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLXJ1biAtZSBidWcgaGVsbG8KLQotCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1CVUlMRElORyBBIEJTRC9VRUEgREVWRUxPUE1FTlQgRU5WSVJPTk1FTlQKLQotCi1CYWNrZ3JvdW5kOgotCi0KLUZvciBhIFVFQSB0byBiZSB1c2VmdWwgaXQgbmVlZHMgYSBzdXBwb3J0aW5nIHJ1bi10aW1lIGVudmlyb25tZW50LgotUFNJTSBpbXBsZW1lbnRzIGEgcnVudGltZSBlbnZpcm9ubWVudCBiYXNlZCBvbiB0aGUgTmV0QlNEIHN5c3RlbSBjYWxsCi1pbnRlcmZhY2UuCi0KLU1vcmUgdGhhbiBhbnkgdGhpbmcsIHRoaXMgdXNlciBsZXZlbCBlbXVsYXRpb24gd2FzIHRoZSBmaXJzdAotaW1wbGVtZW50ZWQgYmVjYXVzZSBJIGhhcHBlbmVkIHRvIGhhdmUgdGhlIE5ldEJTRCBzb3VyY2UgY29kZSBseWluZwotYXJvdW5kLgotCi0KLVByZXBhcmF0aW9uOgotCi0KLVRoaXMgcmVxdWlyZXMgdGhlIE5ldEJTRC0xLjEgc291cmNlIHRyZWUgb25saW5lLiAgSXQgY2FuIGVpdGhlciBiZQotb2J0YWluZWQgdmkgZnRwOgotCi0JdHJ5IGh0dHA6Ly93d3cubmV0YnNkLm9yZyAgb3IgIGZ0cDovL2Z0cC5uZXRic2Qub3JnCi0KLUFsdGVybmF0aXZlbHkgb2J0YWluIG9uZSBvZiB0aGUgTmV0QlNEIGNkcm9tJ3MuICBQYXRjaGVzIHRvIHRoaXMgc291cmNlCi10cmVlIHRoYXQgZmlsbCBvdXQgbXVjaCBvZiB0aGUgUG93ZXJQQyBjb2RlIGFyZSBhdmFpbGFibGUgaW46Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9jbGF5dG9uCi0KLUZldGNoIGV2ZXJ5dGhpbmcgaW4gdGhhdCBkaXJlY3RvcnkgLSBkaWZmcywgdGFyIGFyY2hpdmVzIGFuZCBzY3JpcHRzLgotSW4gYWRkaXRpb24gcGF0Y2hlcyB0byB0aGUgYmludHVpbHMgYW5kIGdjYyBhcmUgaW46Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL2JpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3oKLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL2djYy0yLjcuMitzeXMtdHlwZXMuZGlmZi5negotCi13aGlsZSB0aGUgY29tcGlsZXIgKGdjYykgYW5kIGFzc2VtYmVyIChiaW51dGlscykgY2FuIGJlIGZvdW5kIGF0IHlvdXIKLWZhdm9yaXRlIGdudSBmdHAgc2l0ZS4gIEkgdXNlZCB2ZXJzaW9uczoKLQotCWdjYy0yLjcuMi50YXIuZ3oKLQliaW51dGlscy0yLjYudGFyLmd6Ci0KLQotCi0KLU1ldGhvZDoKLQotCi1UaGVzZSBub3RlcyBhcmUgYmFzZWQgb24gYW4gaW5zdGFsbGF0aW9uIHBlcmZvcm1lZCBvbiBhIFNvbGFyaXMyL3g4NgotaG9zdC4gIEZvciBvdGhlciBob3N0cyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbnMsIHRoZSBiZWxvdyBzaG91bGQgYmUKLWNvbnNpZGVyZWQgYXMgYSBndWlkZWxpbmUgb25seS4KLQotCi0JbwlTYW5pdHkgY2hlY2sKLQotCQlJIGFzc3VtZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgb2J0YWluZWQgdGhlIE5ldEJTRC0xLjEgc291cmNlCi0JCWNvZGUgYW5kIHVucGFja2VkIGl0IGludG8gdGhlIGRpcmVjdG9yeSBic2Qtc3JjLiAgV2hpbGUgdGhlCi0JCWZ1bGwgTmV0QlNEIHNvdXJjZSB0cmVlIG1heSBub3QgYmUgbmVlZGVkLCB0aGluZ3MgYXJlIGVhc2llcgotCQlpZiBpdCBpcyBhbGwgb25saW5lLgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBscyAtMQotCQliaW51dGlscy0yLjYudGFyLmd6Ci0JCWJpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3oKLQkJY2xheXRvbi1pbmNsdWRlLTk2MDIwMy5kaWZmLmd6Ci0JCWNsYXl0b24tbGliLTk2MDIwMy5kaWZmLmd6Ci0JCWNsYXl0b24tbGliLTk2MDIwMy50YXIuZ3oKLQkJY2xheXRvbi1zeXMtOTYwMjAzLmRpZmYuZ3oKLQkJY2xheXRvbi1zeXMtOTYwMjAzLnRhci5negotCQljbGF5dG9uLmNob3duLnNoCi0JCWNsYXl0b24uaW5zdGFsbC5zaAotCQljbGF5dG9uLmxvcmRlci5zaAotCQljbGF5dG9uLm1ha2Uuc2gKLQkJZ2NjLTIuNy4yLnRhci5negotCQlnY2MtMi43LjIrc3lzLXR5cGVzLmRpZmYuZ3oKLQkJbWFrZS50YXIuZ3oKLQkJbWFrZS5kaWZmLmd6Ci0KLQotCW8JUHJlcGFyZSB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHJlYWR5IGZvciBpbnN0YWxsYXRpb24uCi0KLQkJRmlyc3RseSBjcmVhdGUgbWFueSBvZiB0aGUgbmVlZGVkIGRpcmVjdG9yaWVzIChzb21lIGFyZQotCQljcmVhdGVkIGF1dG9tYXRpY2FsbHkgbGF0ZXIpOgotCi0JCSQgZm9yIGQgaW4gXAotICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0gXAotICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QgXAotICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QvdXNyIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9zaGFyZSBcCi0gICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3Ivc2hhcmUvZG9jIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9zaGFyZS9kb2MvcHNkIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9zaGFyZS9kb2MvcHNkLzE5LmN1cnNlcyBcCi0gICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3IvaW5jbHVkZSBcCi0gICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3IvbGliIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2JpbiBcCi0gICAgICAgICAgICAgICAgICAgIDsgXAotICAgICAgICAgICAgICAgICAgZG8gdGVzdCAtZCAkZCB8fCBta2RpciAkZCA7IGRvbmUKLQotCQlOZXh0LCBsaW5rIHRoZSBCU0QgYW5kIEdOVSBpbmNsdWRlIGRpcmVjdG9yaWVzIHRvZ2V0aGVyLgotCQlHQ0MgZXhwZWN0cyBpbmNsdWRlIGZpbGVzIHRvIGJlIGluIG9uZSBsb2NhdGlvbiB3aGlsZSB0aGUKLQkJYnNkIGluc3RhbGwgZXhwZWN0cyB0aGVtIGluIGEgc2Vjb25kLiAgVGhlIGxpbmsgaXMgaW4KLQkJdGhlIGRpcmVjdGlvbiBiZWxvdyBiZWNhdXNlIGJzZCdzIGluc3RhbGwgYWxzbyBpbnNpc3RzIG9uCi0JCWEgZGlyZWN0b3J5IChub3QgYSBsaW5rKSBmb3IgaXRzIGluc3RhbGwgZGVzdGluYXRpb24uCi0KLQkJJCBybSAtcmYgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKLQkJJCBsbiAtcyAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QvdXNyL2luY2x1ZGUgXAotICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvaW5jbHVkZQotCi0JCSQgbHMgLWwgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKLQkJbHJ3eHIteHIteCAgMSBjYWduZXkgIHdoZWVsICAzOSBNYXIgMjEgMTg6MDkKLQkJL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKLQkJLT4gL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9pbmNsdWRlCi0KLQotCW8JQnVpbGQvaW5zdGFsbCBCZXJrZWxleSBtYWtlCi0KLQkJVGhlIHRhciBhcmNoaXZlIG1ha2UudGFyLmd6IGNvbnRhaW5zIGEgcmVjZW50IHNuYXBzaG90Ci0JCW9mIGJtYWtlIGZyb20gdGhlIE5ldEJTRCBzb3VyY2UgdHJlZS4gIFRoZSBub3RlcyBiZWxvdwotCQlkZXNjcmliZSBob3cgdG8gYnVpbGQvaW5zdGFsbCBpdC4gIElmIHlvdSBoYXZlIGFjY2VzcwotCQl0byBhbiBldmVuIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgYm1ha2UsIHVzZSB0aGF0LgotCi0JCVVucGFjayB0aGUgc291cmNlIGNvZGU6Ci0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGd1bnppcCA8IG1ha2UudGFyLmd6IHwgdGFyIHhmIC0KLQkJJCBjZCBtYWtlCi0KLQkJQXBwbHkgdGhlIHBhdGNoIGluIG1ha2UuZGlmZi5neiB0aGF0IGZpeGVzIGEgbWlub3IKLQkJcHJvYmxlbSB3aXRoIGEgYnVpbGQgdW5kZXIgU29sYXJpcyAoYnkgbm93IGl0IHNob3VsZAotCQliZSBmaXhlZCBpbiB0aGUgTmV0QlNELWN1cnJlbnQgc291cmNlIHRyZWUpLgotCi0JCSQgZ3VuemlwIDwgLi4vbWFrZS5kaWZmLmd6IHwgbW9yZQotCQkkIGd1bnppcCA8IC4uL21ha2UuZGlmZi5neiB8IHBhdGNoCi0KLQkJQnVpbGQgaXQKLQotCQkkIG1ha2UgLWYgTWFrZWZpbGUuYm9vdCAnQ0M9Z2NjIC1nIC1EUE9TSVgnCi0KLQkJV2l0aCBibWFrZSBidWlsdCwgaW5zdGFsbCBpdCBpbnRvIHRoZSB0YXJnZXQgc3BlY2lmaWMgYmluCi0JCWRpcmVjdG9yeToKLQotCQkkIGNwIGJtYWtlIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9iaW4vbWFrZQotCQkkIGNkIC4uCi0JCSQgcm0gLXJmIG1ha2UKLQotCi0JbwlTZXQgdXAgYSBudW1iZXIgb2Ygd3JhcHBlciBzY3JpcHRzIGZvciBibWFrZSBzbyB0aGF0IGl0IHdvcmtzLgotCi0JCUluIGFkZGl0aW9uIHRvIG5lZWRpbmcgQlNEIG1ha2UgdGhlIGJ1aWxkIHByb2Nlc3MgYXNzdW1lcwotCQlhIG51bWJlciBvZiBCU0Qgc3BlY2lmaWMgY29tbWFuZHMuICBUbyBnZXQgYXJvdW5kIHRoaXMKLQkJc2V2ZXJhbCB3cmFwcGVyIHNjcmlwdHMgYXJlIGF2YWlsYWJsZS4KLQotCQlwb3dlcnBjLXVua25vd24tZWFiaS1tYWtlIChjbGF5dG9uLm1ha2Uuc2gpCi0KLQkJCUZyb250IGVuZCB0byBCZXJrZWxleSBtYWtlIHNldHRpbmcgaXQgdXAgZm9yIGEKLQkJCWNyb3NzIGNvbXBpbGF0aW9uCi0KLQkJCSQgY3AgY2xheXRvbi5tYWtlLnNoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2Jpbi9wb3dlcnBjLXVua25vd24tZWFiaS1tYWtlCi0JCQkkIGNobW9kIGEreCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9iaW4vcG93ZXJwYy11bmtub3duLWVhYmktbWFrZQotCi0JCWNob3duIChjbGF5dG9uLmNob3duLnNoKQotCi0JCQlXcmFwcGVyIHRoYXQgZG9lcyBub3QgZG8gYW55IHRoaW5nLgotCQkJQXZvaWRzIHRoZSBuZWVkIHRvIGJlIHJvb3Qgd2hlbiBpbnN0YWxsaW5nLgotCi0JCQkkIGNwIGNsYXl0b24uY2hvd24uc2ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2Nob3duCi0JCQkkIGNobW9kIGEreCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9iaW4vY2hvd24KLQotCQlpbnN0YWxsIChjbGF5dG9uLmluc3RhbGwuc2gpCi0KLQkJCVdyYXBwZXIgdG8gc3RyaXAgYXdheSBhIG51bWJlciBvZiBic2Qgc3BlY2lmaWMgaW5zdGFsbAotCQkJYXJndW1lbnRzLgotCi0JCQkkIGNwIGNsYXl0b24uaW5zdGFsbC5zaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9iaW4vaW5zdGFsbAotCQkJJCBjaG1vZCBhK3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2luc3RhbGwKLQotCQlsb3JkZXIgKGNsYXl0b24ubG9yZGVyLnNoKQotCi0JCQlUd2Vha2VkIGxvcmRlciBzY3JpcHQgdGhhdCB3aWxsIHVzZSBubSBldGMgZnJvbQotCQkJYmludXRpbHMuCi0KLQkJCSQgY3AgY2xheXRvbi5sb3JkZXIuc2ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2xvcmRlcgotCQkJJCBjaG1vZCBhK3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2xvcmRlcgotCi0KLQkJcHJpbnRmICg/KQotCi0JCQlTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGRvbid0IGluY2x1ZGUgdGhlIHByb2dyYW0KLQkJCXByaW50Zi4gIElmIHlvdSBob3N0IGRvZXNuJ3QgaGF2ZSBvbmUsIHRoZW4gYQotCQkJZ29vZCBzb3VyY2UgaXMgdGhlIGdudSBzaC11dGlscyB2ZXJzaW9uLgotCi0JCQlBZ2FpbiwgaWYgdGhhdCBwcm9ncmFtIGlzIG1pc3NpbmcsIHRoZW4gSSBzdWdnZXN0Ci0JCQlpbnN0YWxsaW5nIGl0IG9udG8gdGhlIHBvd2VycGMgc3BlY2lmaWMgcHJvZ3JhbQotCQkJZGlyZWN0b3J5OgotCi0JCQkvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluCi0KLQotCW8JVW5wYWNrIHRoZSBic2Qgc291cmNlIGNvZGUgKGlmIHlvdSBoYXZlbid0IGFscmVhZHkpCi0KLQkJSWYgeW91J3JlIHNob3J0IG9uIGRpc2sgc3BhY2UgKGxpa2UgbWUpIGp1c3QgdW5wYWNrOgotCi0JCQlzeXMsIGxpYiwgc2hhcmUvbWssIGluY2x1ZGUsIHVzci5zYmluL2NvbmZpZywKLQkJCXVzci5zYmluL2Ric3ltLCBnbnUvbGliL2xpYmcrKy9nKystaW5jbHVkZSwKLQkJCXVzci5iaW4vbGV4Ci0KLQkJT3RoZXJ3aXplLCBhc3N1bWluZyB5b3UgaGF2ZSBhIENELURSSVZFOgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBta2RpciBic2Qtc3JjCi0JCSQgY2QgYnNkLXNyYwotCQkkIGZvciBkIGluIC9jZHJvbS9ic2Rpc2NfMTJfOTVfZGlzYzIvTmV0QlNELTEuMS9zb3VyY2UvKjExCi0gICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICBlY2hvICRkCi0gICAgICAgICAgICAgICAgICAgIGNhdCAkZC8qLj8/IHwgZ3VuemlwIHwgdGFyIHhmIC0KLSAgICAgICAgICAgICAgICAgIGRvbmUKLQotCQlGbGF0dGVuIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGEgbGl0dGxlLgotCi0JCSQgbXYgdXNyL3NyYy8qIC4KLQkJJCBybWRpciB1c3Ivc3JjIHVzcgotCQkkIGNkIC4uCi0KLQotCW8JQXBwbHkgdGhlIGNsYXl0b24gKFBvd2VyUEMpIHBhdGNoZXMgdG8geW91ciBjb25zdHJ1Y3RlZAotCQl0cmVlLgotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBic2Qtc3JjCi0JCQotCQlEaWZmcyBhcmUgYXBwbGllZCB1c2luZyBzb21ldGhpbmcgbGlrZToKLQotCQkkIGd1bnppcCA8IC4uL2NsYXl0b24taW5jbHVkZS05NjAzMTIuZGlmZi5neiB8IHBhdGNoIC1wMQotCQkkIGd1bnppcCA8IC4uL2NsYXl0b24tbGliLTk2MDIwMy5kaWZmLmd6IHwgcGF0Y2ggLXAxCi0JCSQgZ3VuemlwIDwgLi4vY2xheXRvbi1zeXMtOTYwMjAzLmRpZmYuZ3ogfCBwYXRjaCAtcDEKLQotCQlUaGUgcGF0Y2ggdG8gc3lzL2Rldi9wY2kvbmNyLmMucmVqIG1pZ2h0IGZhaWwuCi0KLQkJVGhlIHRhciBhcmNoaXZlcyBoYXZlIGEgZGlmZmVyZW50IHByb2JsZW0sIHlvdSBuZWVkCi0JCXRvIHJlbW92ZSB0aGUgYHNyYycgcHJlZml4LiAgSSB1c2VkCi0KLQkJJCBsbiAtcyAuIHNyYwotCQkkIGd1bnppcCA8IC4uL2NsYXl0b24tbGliLTk2MDIwMy50YXIuZ3ogfCB0YXIgeHZmIC0KLQkJJCBndW56aXAgPCAuLi9jbGF5dG9uLXN5cy05NjAyMDMudGFyLmd6IHwgdGFyIHh2ZiAtCi0KLQkJU28gdGhhdCBzcmMveHh4IHVucGFja2VkIGludG8gLi94eHgKLQotCQkkIGNkIC4uCi0KLQotCW8JaW5zdGFsbCBCZXJrZWxleSBtYWtlJ3MgaW5jbHVkZSAobWspIGZpbGVzLgotCi0JCSQgY2QgLi4uL3NjcmF0aAotCQkkIGNkIGJzZC1zcmMvc2hhcmUKLQkJJCB0YXIgY2YgLSBtayB8ICggY2QgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9zaGFyZSBcCi0gICAgICAgICAgICAgICAgICAgICAmJiB0YXIgeHZmIC0gKQotCQkkIGNkIC4uLy4uCi0KLQotCW8JSW5zdGFsbCB0aGUgaW5jbHVkZSBmaWxlcwotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBic2Qtc3JjL2luY2x1ZGUKLQkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1tYWtlIGluc3RhbGwKLQkJJCBjZCAuLi8uLgotCQkKLQotCW8JSW5zdGFsbCBhIGZldyBvdGhlciBpbmNsdWRlIGZpbGVzLgotCi0JCUFzIGRpc2N1c3NlZCBhYm92ZSBpbiB0aGUgc2VjdGlvbiBvbiBidWlsZGluZyBsaWJuZXcsCi0JCXRoZSBidWlsZCBwcm9jZXNzIGNhbiBoYXZlIGNoaWNrZW4vZWdnIHByb2JsZW1zLiAgSW4gdGhlCi0JCWNhc2Ugb2YgQlNEJ3MgbGliYywgaXQgd2FudHMgdG8gdXNlIHNldmVyYWwgaW5jbHVkZSBmaWxlcwotCQkoZnJvbSB0aGUgaW5zdGFsbGVkIGluY2x1ZGUgZGlyZWN0b3J5KSBiZWZvcmUgdGhleSBhcmUKLQkJaW5zdGFsbGVkLiAgSnVzdCBjb3B5IHRoZW0gaW4gYXMgc2VlbiBiZWxvdzoKLQotCQkkIGNkIC4uLi9zY3JhdGNoCi0JCSQgY2QgYnNkLXNyYwotCQkkIGNwIGdudS9saWIvbGliZysrL2crKy1pbmNsdWRlL3ZhbHVlcy5oIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKLQkJJCBjcCBsaWIvbGliY3Vyc2VzL2N1cnNlcy5oIFwKLSAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKLQkJJCBjZCAuLgotCi0KLQlvCVVucGFjay9wYXRjaC9idWlsZC9pbnN0YWxsIEJJTlVUSUxTCi0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGd1bnppcCA8IGJpbnV0aWxzLTIuNi50YXIuZ3ogfCB0YXIgeGYgLQotCi0JCWdhcyAoYmZkKSAyLjYgZGlkbid0IHN1cHBvcnQgdGhlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLQkJbm90ZSBzZWN0aW9ucy4gIFRoZSBwYXRjaCBiaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6Ci0JCWFkZHMgc3VwcG9ydCBmb3IgdGhpcy4gIFBvd2VyUEMvRUxGIGJvb3QgZmlsZXMgYmVpbmcgbG9hZGVkCi0JCWJ5IE9wZW5Cb290IFJPTSdzIHNob3VsZCBjb250YWluIGEgUG93ZXJQQyBub3RlIHNlY3Rpb24uCi0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGNkIGJpbnV0aWxzLTIuNi9iZmQKLQkJJCBndW56aXAgPCAuLi8uLi9iaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6IHwgbW9yZQotCQkkIGd1bnppcCA8IC4uLy4uL2JpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3ogfCBwYXRjaAotCQkkIGNkIC4uLy4uCi0KLQkJVGhlbiBjb250aW51ZSB3aXRoIHRoZSBidWlsZAotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBiaW51dGlscy0yLjYKLQkJJCAuL2NvbmZpZ3VyZSAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KLQkJJCBtYWtlCi0JCSQgbWFrZSBpbnN0YWxsCi0JCSQgY2QgLi4KLQkJJCBybSAtcmYgYmludXRpbHMtMi42Ci0KLQkJVGhpcyBoYXMgdGhlIGludGVuZGVkIHNpZGUgZWZmZWN0IG9mIHBhcnRpYWxseSBwb3B1bGF0aW5nCi0JCXRoZSBwc2ltIGRpcmVjdG9yeSB0cmVlIHdoaWNoIG1ha2VzIGZvbGxvdyBvbiBzdGVwcyBlYXNpZXIuCi0KLQotCW8JVW5wYWNrL3BhdGNoL2J1aWxkL2luc3RhbGwgR0NDCi0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGd1bnppcCA8IGdjYy0yLjcuMi50YXIuZ3ogfCB0YXIgeGYgLQotCQkkIGNkIGdjYy0yLjcuMgotCi0JCUdDQy0yLjcuMiBhbmQgdGhlIEJTRCBpbmNsdWRlIGZpbGVzIGhhdmUgYSBjb25mbGljdGluZyB0eXBlCi0JCWRlY2xhcmF0aW9uLiAgVGhlIHBhdGNoIGJlbG93IGdldHMgYXJvdW5kIHRoaXMgcHJvYmxlbQotCQkoaXQgbWF5IHN0aWxsIGJlIGFwcGxpY2FibGUgdG8gbW9yZSByZWNlbnQgdmVyc2lvbnMgb2YKLQkJR0NDKToKLQotCQkkIGd1bnppcCA8IC4uL2djYy0yLjcuMitzeXMtdHlwZXMuZGlmZi5neiB8IG1vcmUKLQkJJCBndW56aXAgPCAuLi9nY2MtMi43LjIrc3lzLXR5cGVzLmRpZmYuZ3ogfCBwYXRjaAotCi0JCUlmIHlvdXIgdmVyc2lvbiBvZiBHQ0MgaW5jbHVkZXMgdGhlIGZpbGUgZ2luY2x1ZGUvcHBjLWFzbS5oCi0JCXRoZW4geW91IHNob3VsZCBpbnN0YWxsIHRoYXQgaGVhZGVyIGZpbGUgaW50byB0aGUgZGlyZWN0b3J5OgotCQkvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvaW5jbHVkZS4gIE1vcmUKLQkJcmVjZW50IHZlcnNpb25zIG9mIEdDQyBleHBlY3QgdGhpcyBmaWxlIHRvIGJlIGluc3RhbGxlZDoKLQotCQkkIHRlc3QgLXIgZ2luY2x1ZGUvcHBjLWFzbS5oIFwKLSAgICAgICAgICAgICAgICAgICYmIGNwIGdpbmNsdWRlL3BwYy1hc20uaCBcCi0gICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvaW5jbHVkZQotCi0JCU90aGVyIHRoYW4gdGhhdCwgYXNzdW1pbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW5zdGFsbGVkCi0JCW9rYXksIHRoZSByZXN0IHNob3VsZCBiZSBmaW5lIC4uLi4KLQotCQkkIC4vY29uZmlndXJlIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tcHJlZml4PS9hcHBsaWNhdGlvbnMvcHNpbQotCQkkIG1ha2UgQ0M9Z2NjCi0JCSQgbWFrZSBDQz1nY2MgaW5zdGFsbAotCQkkIGNkIC4uCi0JCSQgcm0gLXJmIGdjYy0yLjcuMgotCi0KLQlvCUJ1aWxkL2luc3RhbGwgdGhlIEJlcmtlbGV5IGxpYnJhcnk6Ci0KLQkJJCBjZCAuLi4vc2NyYXRjaAotCQkkIGNkIGJzZC1zcmMvbGliCi0JCSQgcG93ZXJwYy11bmtub3duLWVhYmktbWFrZQotCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLW1ha2UgaW5zdGFsbAotCQkkIGNkIC4uLy4uCi0KLQkJSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBjaGVjayB0aGUgZm9sbG93aW5nIChlYWNoCi0JCWRpc2N1c3NlZCBhYm92ZSk6Ci0KLQkJCW8JR0NDIGFuZCBCU0QgaGF2ZSBhIGNvbW1vbiBpbmNsdWRlCi0JCQkJZGlyZWN0b3J5Ci0KLQkJCW8JYWxsIHRoZSBtaXNzaW5nIGluY2x1ZGUgZmlsZXMgaW5zdGFsbGVkCi0KLQkJCW8JYWxsIHRoZSB3cmFwcGVyIHByb2dyYW1zIGluc3RhbGxlZAotCi0KLQlvCUJ1aWxkL3J1biBhIHNpbXBsZSBCU0QgcHJvZ3JhbQotCi0JCSQgY2QgLi4uL3NjcmF0Y2gKLQkJJCBjZCBic2Qtc3JjL3Vzci5iaW4vcHJpbnRlbnYKLQkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1tYWtlCi0JCSQgcG93ZXJwYy11bmtub3duLWVhYmktcnVuIHByaW50ZW52Ci0JCS4KLQkJLgotCQkuCi0KLQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvYWNjb25maWcuaCBiL3NpbS9wcGMvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9wcGMvYWNsb2NhbC5tNCBiL3NpbS9wcGMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvc2ltL3BwYy9iYXNpY3MuaCBiL3NpbS9wcGMvYmFzaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MjAwMjMuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9iYXNpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9CQVNJQ1NfSF8KLSNkZWZpbmUgX0JBU0lDU19IXwotCi0KLS8qIGZyb20gTWljaGFlbCBNZWlzc25lciwgbWFjcm8ncyB0byBoYW5kbGUgY29uY2F0aW5nIHN5bWJvbHMgYmV0dGVyICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEjI2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEjI2IjI2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhIyNiIyNjIyNkCi0jZWxzZQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEvKiovYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhLyoqL2IvKiovYy8qKi9kCi0jZW5kaWYKLQotI2RlZmluZSBYQ09OQ0FUMihhLGIpICAgICBDT05DQVQyKGEsYikKLSNkZWZpbmUgWENPTkNBVDMoYSxiLGMpICAgQ09OQ0FUMyhhLGIsYykKLSNkZWZpbmUgWENPTkNBVDQoYSxiLGMsZCkgQ09OQ0FUNChhLGIsYyxkKQotCi0KLS8qIG1hbnkgdGhpbmdzIHBhc3MgYXJvdW5kIHRoZSBjcHUgYW5kIHBzaW0gb2JqZWN0IHdpdGggb3V0IGtub3dpbmcKLSAgIHdoYXQgaXQgaXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2NwdSBjcHU7Ci10eXBlZGVmIHN0cnVjdCBfcHNpbSBwc2ltOwotdHlwZWRlZiBzdHJ1Y3QgX2RldmljZSBkZXZpY2U7Ci10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2luc3RhbmNlIGRldmljZV9pbnN0YW5jZTsKLXR5cGVkZWYgc3RydWN0IF9ldmVudF9xdWV1ZSBldmVudF9xdWV1ZTsKLXR5cGVkZWYgc3RydWN0IF9ldmVudF9lbnRyeV90YWcgKmV2ZW50X2VudHJ5X3RhZzsKLQotCi0vKiBtYW55IHRoaW5ncyBhcmUgbW92aW5nIGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0ICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGNvb2tlZF90cmFuc2ZlciwKLSAgcmF3X3RyYW5zZmVyLAotfSB0cmFuc2Zlcl9tb2RlOwotCi0KLS8qIHBvc3NpYmxlIGV4aXQgc3RhdHVzZXMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgd2FzX2NvbnRpbnVpbmcsIHdhc190cmFwLCB3YXNfZXhpdGVkLCB3YXNfc2lnbmFsbGVkCi19IHN0b3BfcmVhc29uOwotCi0KLS8qIGRpc3Bvc2l0aW9uIG9mIGFuIG9iamVjdCB3aGVuIHRoaW5ncyBhcmUgbmV4dCByZXN0YXJ0ZWQgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgcGVybWVuYW50X29iamVjdCwKLSAgdGVtcG9hcnlfb2JqZWN0LAotfSBvYmplY3RfZGlzcG9zaXRpb247Ci0KLQotLyogZGlyZWN0aW9ucyAqLwotCi10eXBlZGVmIGVudW0gewotICBiaWRpcmVjdF9wb3J0LAotICBpbnB1dF9wb3J0LAotICBvdXRwdXRfcG9ydCwKLX0gcG9ydF9kaXJlY3Rpb247Ci0KLQotCi0vKiBCYXNpYyBjb25maWd1cmF0aW9uICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJwcGMtY29uZmlnLmgiCi0jaW5jbHVkZSAiaW5saW5lLmgiCi0KLQotLyogQmFzaWMgaG9zdCBkZXBlbmRhbnQgbWVzcyAtIGhvcGVmdWxseSA8c3RkaW8uaD4gKyA8c3RkYXJnLmg+IHdpbGwKLSAgIGJyaW5nIHBvdGVudGlhbCBjb25mbGljdHMgb3V0IGluIHRoZSBvcGVuICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLSNpZm5kZWYgTk9SRVRVUk4KLSNkZWZpbmUgTk9SRVRVUk4KLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfX2F0dHJpYnV0ZV9fKQotI2lmICghZGVmaW5lZChfX0dOVUNfXykgXAotICAgICB8fCAoX19HTlVDX18gPCAyKSBcCi0gICAgIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNikpCi0jZGVmaW5lIF9fYXR0cmlidXRlX18oYXJnKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChVTlVTRUQpCi0jaWYgKCFkZWZpbmVkKF9fR05VQ19fKSBcCi0gICAgIHx8IChfX0dOVUNfXyA8IDIpIFwKLSAgICAgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSkKLSNkZWZpbmUgVU5VU0VECi0jZWxzZQotI2RlZmluZSBVTlVTRUQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIEJhc2ljIGRlZmluaXRpb25zIC0gb3JkZXJlZCBzbyB0aGF0IG5vdGhpbmcgY2FsbHMgd2hhdCBjb21lcyBhZnRlcgotICAgaXQgKi8KLQotI2luY2x1ZGUgInNpbV9jYWxsYmFja3MuaCIKLQotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNpbmNsdWRlICJ3b3Jkcy5oIgotI2luY2x1ZGUgImJpdHMuaCIKLSNpbmNsdWRlICJzaW0tZW5kaWFuLmgiCi0KLSNlbmRpZiAvKiBfQkFTSUNTX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2JpdHMuYyBiL3NpbS9wcGMvYml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiYTUxLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvYml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0JJVFNfQ18KLSNkZWZpbmUgX0JJVFNfQ18KLQotI2luY2x1ZGUgImJhc2ljcy5oIgotCi0KLUlOTElORV9CSVRTXAotKHVuc2lnbmVkMzIpCi1NQVNLRUQzMih1bnNpZ25lZDMyIHdvcmQsCi0JIHVuc2lnbmVkIHN0YXJ0LAotCSB1bnNpZ25lZCBzdG9wKQotewotICByZXR1cm4gKHdvcmQgJiBNQVNLMzIoc3RhcnQsIHN0b3ApKTsKLX0KLQotSU5MSU5FX0JJVFNcCi0odW5zaWduZWQ2NCkKLU1BU0tFRDY0KHVuc2lnbmVkNjQgd29yZCwKLQkgdW5zaWduZWQgc3RhcnQsCi0JIHVuc2lnbmVkIHN0b3ApCi17Ci0gIHJldHVybiAod29yZCAmIE1BU0s2NChzdGFydCwgc3RvcCkpOwotfQotCi1JTkxJTkVfQklUU1wKLSh1bnNpZ25lZF93b3JkKQotTUFTS0VEKHVuc2lnbmVkX3dvcmQgd29yZCwKLSAgICAgICB1bnNpZ25lZCBzdGFydCwKLSAgICAgICB1bnNpZ25lZCBzdG9wKQotewotICByZXR1cm4gKCh3b3JkKSAmIE1BU0soc3RhcnQsIHN0b3ApKTsKLX0KLQotCi0KLUlOTElORV9CSVRTXAotKHVuc2lnbmVkX3dvcmQpCi1FWFRSQUNURUQodW5zaWduZWRfd29yZCB3b3JkLAotCSAgdW5zaWduZWQgc3RhcnQsCi0JICB1bnNpZ25lZCBzdG9wKQotewotICBBU1NFUlQoc3RhcnQgPD0gc3RvcCk7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIF9FWFRSQUNURURuKDY0LCB3b3JkLCBzdGFydCwgc3RvcCk7Ci0jZWxzZQotICBpZiAoc3RvcCA8IDMyKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuICgod29yZCA+PiAoNjMgLSBzdG9wKSkKLQkgICAgJiBNQVNLKHN0YXJ0Kyg2My1zdG9wKSwgNjMpKTsKLSNlbmRpZgotfQotCi0KLUlOTElORV9CSVRTXAotKHVuc2lnbmVkX3dvcmQpCi1JTlNFUlRFRCh1bnNpZ25lZF93b3JkIHdvcmQsCi0JIHVuc2lnbmVkIHN0YXJ0LAotCSB1bnNpZ25lZCBzdG9wKQotewotICBBU1NFUlQoc3RhcnQgPD0gc3RvcCk7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIF9JTlNFUlRFRG4oNjQsIHdvcmQsIHN0YXJ0LCBzdG9wKTsKLSNlbHNlCi0gIGlmIChzdG9wIDwgMzIpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gKCh3b3JkICYgTUFTSyhzdGFydCsoNjMtc3RvcCksIDYzKSkKLQkgICAgPDwgKDYzIC0gc3RvcCkpOwotI2VuZGlmCi19Ci0KLQotSU5MSU5FX0JJVFNcCi0odW5zaWduZWQzMikKLVJPVEwzMih1bnNpZ25lZDMyIHZhbCwKLSAgICAgICBsb25nIHNoaWZ0KQotewotICBBU1NFUlQoc2hpZnQgPj0gMCAmJiBzaGlmdCA8PSAzMik7Ci0gIHJldHVybiBfUk9UTG4oMzIsIHZhbCwgc2hpZnQpOwotfQotCi0KLUlOTElORV9CSVRTXAotKHVuc2lnbmVkNjQpCi1ST1RMNjQodW5zaWduZWQ2NCB2YWwsCi0gICAgICAgbG9uZyBzaGlmdCkKLXsKLSAgQVNTRVJUKHNoaWZ0ID49IDAgJiYgc2hpZnQgPD0gNjQpOwotICByZXR1cm4gX1JPVExuKDY0LCB2YWwsIHNoaWZ0KTsKLX0KLQotI2VuZGlmIC8qIF9CSVRTX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2JpdHMuaCBiL3NpbS9wcGMvYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg5OGUwLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvYml0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0JJVFNfSF8KLSNkZWZpbmUgX0JJVFNfSF8KLQotCi0vKiBiaXQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzOgotCi0gICBCaXQgbnVtYmVyaW5nOiBUaGUgYml0cyBhcmUgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZSBQb3dlclBDCi0gICBjb252ZW50aW9uIC0gdGhlIGxlZnQgbW9zdCAob3IgbW9zdCBzaWduaWZpY2FudCkgaXMgYml0IDAgd2hpbGUgdGhlCi0gICByaWdodCBtb3N0IChsZWFzdCBzaWduaWZpY2FudCkgaXMgYml0IDEuCi0KLSAgIFNpemUgY29udmVudGlvbjogRWFjaCBtYWNybyBpcyBpbiB0aHJlZSBmb3JtcyAtIDxNQUNSTz4zMiB3aGljaAotICAgb3BlcmF0ZXMgaW4gMzJiaXQgcXVhbnRpdHkgKGJpdHMgYXJlIG51bWJlcmVkIDAuLjMxKTsgPE1BQ1JPPjY0Ci0gICB3aGljaCBvcGVyYXRlcyB1c2luZyA2NGJpdCBxdWFudGl0ZXMgKGFuZCBiaXRzIGFyZSBudW1iZXJlZCAwLi42NCk7Ci0gICBhbmQgPE1BQ1JPPiB3aGljaCBvcGVyYXRlcyB1c2luZyB0aGUgYml0IHNpemUgb2YgdGhlIHRhcmdldAotICAgYXJjaGl0ZWN0dXJlIChiaXRzIGFyZSBzdGlsbCBudW1iZXJlZCAwLi42MyksIHdpdGggMzJiaXQKLSAgIGFyY2hpdGVjdHVyZXMgaWdub3JpbmcgdGhlIGZpcnN0IDMyYml0cyBoYXZpbmcgYml0IDMyIGFzIHRoZSBtb3N0Ci0gICBzaWduaWZpY2FudC4KLQotICAgQklUKihQT1MpOiBRdWFudGl0eSB3aXRoIGp1c3QgMSBiaXQgc2V0LgotCi0gICBNQVNLKihGSVJTVCwgTEFTVCk6IENyZWF0ZSBhIGNvbnN0YW50IGJpdCBtYXNrIG9mIHRoZSBzcGVjaWZpZWQKLSAgIHNpemUgd2l0aCBiaXRzIFtGSVJTVCAuLiBMQVNUXSBzZXQuCi0KLSAgIE1BU0tFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTWFza3Mgb3V0IGFsbCBidXQgYml0cyBbRklSU1QKLSAgIC4uIExBU1RdLgotCi0gICBFWFRSQUNURUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IE1hc2tzIG91dCBiaXRzIFtGSVJTVCAuLiBMQVNUXSBidXQKLSAgIGFsc28gcmlnaHQgc2hpZnRzIHRoZSBtYXNrZWQgdmFsdWUgc28gdGhhdCBiaXQgTEFTVCBiZWNvbWVzIHRoZQotICAgbGVhc3Qgc2lnbmlmaWNhbnQgKHJpZ2h0IG1vc3QpLgotCi0gICBTSFVGRkxFRCoqKFZBTFVFLCBPTEQsIE5FVyk6IE1hc2sgdGhlbiBtb3ZlIGEgc2luZ2xlIGJpdCBmcm9tIE9MRAotICAgbmV3IE5FVy4KLQotICAgTU9WRUQqKihWQUxVRSwgT0xEX0ZJUlNULCBPTERfTEFTVCwgTkVXX0ZJUlNULCBORVdfTEFTVCk6IE1vdmVzCi0gICB0aGluZ3MgYXJvdW5kIHNvIHRoYXQgYml0cyBPTERfRklSU1QuLk9MRF9MQVNUIGFyZSBtYXNrZWQgdGhlbgotICAgbW92ZWQgdG8gTkVXX0ZJUlNULi5ORVdfTEFTVC4KLQotICAgSU5TRVJURUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IFRha2VzIFZBTFVFIGFuZCBgaW5zZXJ0cycgdGhlIChMQVNUCi0gICAtIEZJUlNUICsgMSkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbnRvIGJpdCBwb3NpdGlvbnMgWyBGSVJTVAotICAgLi4gTEFTVCBdLiAgVGhpcyBpcyBhbG1vc3QgdGhlIGNvbXBsZW1lbnQgdG8gRVhUUkFDVEVELgotCi0gICBJRUFfTUFTS0VEKFNIT1VMRF9NQVNLLCBBRERSKTogQ29udmVydCB0aGUgYWRkcmVzcyB0byB0aGUgdGFyZ2V0cwotICAgbmF0dXJhbCBzaXplLiAgSWYgaW4gMzJiaXQgbW9kZSwgZGlzY2FyZCB0aGUgaGlnaCAzMmJpdHMuCi0KLSAgIEVYVEVOREVEKFZBTFVFKTogQ29udmVydCBWQUxVRSAoMzJiaXRzIG9mIGl0KSB0byB0aGUgdGFyZ2V0cwotICAgbmF0dXJhbCBzaXplLiAgSWYgaW4gNjRiaXQgbW9kZSwgc2lnbiBleHRlbmQgdGhlIHZhbHVlLgotCi0gICBBTElHTl8qKFZBTFVFKTogUm91bmQgdXB3YXJkcyB0aGUgdmFsdWUgc28gdGhhdCBpdCBpcyBhbGlnbmVkLgotCi0gICBGTE9PUl8qKFZBTFVFKTogVHJ1bmNhdGUgdGhlIHZhbHVlIHNvIHRoYXQgaXQgaXMgYWxpZ25lZC4KLQotICAgUk9UTCooVkFMVUUsIE5SX0JJVFMpOiBSZXR1cm4gdGhlIHZhbHVlIHJvdGF0ZWQgYnkgTlJfQklUUwotCi0gICAqLwotCi0jZGVmaW5lIF9NQUtFX1NISUZUKFdJRFRILCBwb3MpICgoV0lEVEgpIC0gMSAtIChwb3MpKQotCi0KLS8qIE1ha2VCaXQgKi8KLSNkZWZpbmUgX0JJVG4oV0lEVEgsIHBvcykgKCgobmF0dXJhbCMjV0lEVEgpKDEpKSBcCi0JCQkgICA8PCBfTUFLRV9TSElGVChXSURUSCwgcG9zKSkKLQotI2RlZmluZSBCSVQ0KFBPUykgICgxIDw8IF9NQUtFX1NISUZUKDQsIFBPUykpCi0jZGVmaW5lIEJJVDUoUE9TKSAgKDEgPDwgX01BS0VfU0hJRlQoNSwgUE9TKSkKLSNkZWZpbmUgQklUOChQT1MpICAoMSA8PCBfTUFLRV9TSElGVCg4LCBQT1MpKQotI2RlZmluZSBCSVQxMChQT1MpICAoMSA8PCBfTUFLRV9TSElGVCgxMCwgUE9TKSkKLSNkZWZpbmUgQklUMzIoUE9TKSBfQklUbigzMiwgUE9TKQotI2RlZmluZSBCSVQ2NChQT1MpIF9CSVRuKDY0LCBQT1MpCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBCSVQoUE9TKSAgIEJJVDY0KFBPUykKLSNlbHNlCi0jZGVmaW5lIEJJVChQT1MpICAgKCgoUE9TKSA8IDMyKSA/IDAgOiBfQklUbigzMiwgKFBPUyktMzIpKQotI2VuZGlmCi0KLQotLyogbXVsdGkgYml0IG1hc2sgKi8KLSNkZWZpbmUgX01BU0tuKFdJRFRILCBTVEFSVCwgU1RPUCkgXAotKCgoKCh1bnNpZ25lZCMjV0lEVEgpMCkgLSAxKSBcCi0gID4+IChXSURUSCAtICgoU1RPUCkgLSAoU1RBUlQpICsgMSkpKSBcCi0gPDwgKFdJRFRIIC0gMSAtIChTVE9QKSkpCi0KLSNkZWZpbmUgTUFTSzMyKFNUQVJULCBTVE9QKSAgIF9NQVNLbigzMiwgU1RBUlQsIFNUT1ApCi0jZGVmaW5lIE1BU0s2NChTVEFSVCwgU1RPUCkgICBfTUFTS24oNjQsIFNUQVJULCBTVE9QKQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgTUFTSyhTVEFSVCwgU1RPUCkgXAotKCgoU1RBUlQpIDw9IChTVE9QKSkgXAotID8gX01BU0tuKDY0LCBTVEFSVCwgU1RPUCkgXAotIDogKF9NQVNLbig2NCwgMCwgU1RPUCkgXAotICAgIHwgX01BU0tuKDY0LCBTVEFSVCwgNjMpKSkKLSNlbHNlCi0jZGVmaW5lIE1BU0soU1RBUlQsIFNUT1ApIFwKLSgoKFNUQVJUKSA8PSAoU1RPUCkpIFwKLSA/ICgoKFNUT1ApIDwgMzIpIFwKLSAgICA/IDAgXAotICAgIDogX01BU0tuKDMyLCBcCi0JICAgICAoU1RBUlQpIDwgMzIgPyAwIDogKFNUQVJUKSAtIDMyLCBcCi0JICAgICAoU1RPUCktMzIpKSBcCi0gOiAoX01BU0tuKDMyLCBcCi0JICAgKFNUQVJUKSA8IDMyID8gMCA6IChTVEFSVCkgLSAzMiwgXAotCSAgIDMxKSBcCi0gICAgfCAoKChTVE9QKSA8IDMyKSBcCi0gICAgICAgPyAwIFwKLSAgICAgICA6IF9NQVNLbigzMiwgXAotCQkwLCBcCi0JCShTVE9QKSAtIDMyKSkpKQotI2VuZGlmCi0KLQotLyogbWFzayB0aGUgcmVxdWlyZWQgYml0cywgbGVhdmluZyB0aGVtIGluIHBsYWNlICovCi0KLUlOTElORV9CSVRTXAotKHVuc2lnbmVkMzIpIE1BU0tFRDMyCi0odW5zaWduZWQzMiB3b3JkLAotIHVuc2lnbmVkIHN0YXJ0LAotIHVuc2lnbmVkIHN0b3ApOwotCi1JTkxJTkVfQklUU1wKLSh1bnNpZ25lZDY0KSBNQVNLRUQ2NAotKHVuc2lnbmVkNjQgd29yZCwKLSB1bnNpZ25lZCBzdGFydCwKLSB1bnNpZ25lZCBzdG9wKTsKLQotSU5MSU5FX0JJVFNcCi0odW5zaWduZWRfd29yZCkgTUFTS0VECi0odW5zaWduZWRfd29yZCB3b3JkLAotIHVuc2lnbmVkIHN0YXJ0LAotIHVuc2lnbmVkIHN0b3ApOwotCi0KLS8qIGV4dHJhY3QgdGhlIHJlcXVpcmVkIGJpdHMgYWxpZ25pbmcgdGhlbSB3aXRoIHRoZSBsc2IgKi8KLSNkZWZpbmUgX0VYVFJBQ1RFRG4oV0lEVEgsIFdPUkQsIFNUQVJULCBTVE9QKSBcCi0oKCgobmF0dXJhbCMjV0lEVEgpKFdPUkQpKSA+PiAoV0lEVEggLSAoU1RPUCkgLSAxKSkgXAotICYgX01BU0tuKFdJRFRILCBXSURUSC0xKyhTVEFSVCktKFNUT1ApLCBXSURUSC0xKSkKLQotLyogI2RlZmluZSBFWFRSQUNURUQxMChXT1JELCBTVEFSVCwgU1RPUCkgX0VYVFJBQ1RFRG4oMTAsIFdPUkQsIFNUQVJULCBTVE9QKSAqLwotI2RlZmluZSBFWFRSQUNURUQzMihXT1JELCBTVEFSVCwgU1RPUCkgX0VYVFJBQ1RFRG4oMzIsIFdPUkQsIFNUQVJULCBTVE9QKQotI2RlZmluZSBFWFRSQUNURUQ2NChXT1JELCBTVEFSVCwgU1RPUCkgX0VYVFJBQ1RFRG4oNjQsIFdPUkQsIFNUQVJULCBTVE9QKQotCi1JTkxJTkVfQklUU1wKLSh1bnNpZ25lZF93b3JkKSBFWFRSQUNURUQKLSh1bnNpZ25lZF93b3JkIHZhbCwKLSB1bnNpZ25lZCBzdGFydCwKLSB1bnNpZ25lZCBzdG9wKTsKLQotCi0vKiBtb3ZlIGEgc2luZ2xlIGJpdCBhcm91bmQgKi8KLS8qIE5COiB0aGUgd2llcmRuZXNzIChOPk8/Ti1POjApIGlzIHRvIHN0b3AgYSB3YXJuaW5nIGZyb20gR0NDICovCi0jZGVmaW5lIF9TSFVGRkxFRG4oTiwgV09SRCwgT0xELCBORVcpIFwKLSgoT0xEKSA8IChORVcpIFwKLSA/ICgoKHVuc2lnbmVkIyNOKShXT1JEKSBcCi0gICAgID4+ICgoKE5FVykgPiAoT0xEKSkgPyAoKE5FVykgLSAoT0xEKSkgOiAwKSkgXAotICAgICYgTUFTSzMyKChORVcpLCAoTkVXKSkpIFwKLSA6ICgoKHVuc2lnbmVkIyNOKShXT1JEKSBcCi0gICAgIDw8ICgoKE9MRCkgPiAoTkVXKSkgPyAoKE9MRCkgLSAoTkVXKSkgOiAwKSkgXAotICAgICYgTUFTSzMyKChORVcpLCAoTkVXKSkpKQotCi0jZGVmaW5lIFNIVUZGTEVEMzIoV09SRCwgT0xELCBORVcpIF9TSFVGRkxFRG4oMzIsIFdPUkQsIE9MRCwgTkVXKQotI2RlZmluZSBTSFVGRkxFRDY0KFdPUkQsIE9MRCwgTkVXKSBfU0hVRkZMRURuKDY0LCBXT1JELCBPTEQsIE5FVykKLQotI2RlZmluZSBTSFVGRkxFRChXT1JELCBPTEQsIE5FVykgX1NIVUZGTEVEbihfd29yZCwgV09SRCwgT0xELCBORVcpCi0KLQotLyogbW92ZSBhIGdyb3VwIG9mIGJpdHMgYXJvdW5kICovCi0jZGVmaW5lIF9JTlNFUlRFRG4oTiwgV09SRCwgU1RBUlQsIFNUT1ApIFwKLSgoKG5hdHVyYWwjI04pKFdPUkQpIDw8IF9NQUtFX1NISUZUKE4sIFNUT1ApKSAmIF9NQVNLbihOLCBTVEFSVCwgU1RPUCkpCi0KLSNkZWZpbmUgSU5TRVJURUQzMihXT1JELCBTVEFSVCwgU1RPUCkgX0lOU0VSVEVEbigzMiwgV09SRCwgU1RBUlQsIFNUT1ApCi0jZGVmaW5lIElOU0VSVEVENjQoV09SRCwgU1RBUlQsIFNUT1ApIF9JTlNFUlRFRG4oNjQsIFdPUkQsIFNUQVJULCBTVE9QKQotCi1JTkxJTkVfQklUU1wKLSh1bnNpZ25lZF93b3JkKSBJTlNFUlRFRAotKHVuc2lnbmVkX3dvcmQgdmFsLAotIHVuc2lnbmVkIHN0YXJ0LAotIHVuc2lnbmVkIHN0b3ApOwotCi0KLS8qIGRlcGVuZGluZyBvbiBNT0RFIHJldHVybiBhIDY0Yml0IG9yIDMyYml0IChzaWduIGV4dGVuZGVkKSB2YWx1ZSAqLwotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZGVmaW5lIEVYVEVOREVEKFgpICAgICAoKHNpZ25lZDY0KShzaWduZWQzMikoWCkpCi0jZWxzZQotI2RlZmluZSBFWFRFTkRFRChYKSAgICAgKFgpCi0jZW5kaWYKLQotCi0vKiBtZW1vcnkgYWxpZ25tZW50IG1hY3JvJ3MgKi8KLSNkZWZpbmUgX0FMSUdOYShBLFgpICAoKChYKSArICgoQSkgLSAxKSkgJiB+KChBKSAtIDEpKQotI2RlZmluZSBfRkxPT1JhKEEsWCkgICgoWCkgJiB+KChBKSAtIDEpKQotCi0jZGVmaW5lIEFMSUdOXzgoWCkJX0FMSUdOYSg4LCBYKQotI2RlZmluZSBBTElHTl8xNihYKQlfQUxJR05hKDE2LCBYKQotCi0jZGVmaW5lIEFMSUdOX1BBR0UoWCkJX0FMSUdOYSgweDEwMDAsIFgpCi0jZGVmaW5lIEZMT09SX1BBR0UoWCkgICAoKFgpICYgfigweDEwMDAgLSAxKSkKLQotCi0vKiBiaXQgYmxpdGluZyBtYWNybydzICovCi0jZGVmaW5lIEJMSVQzMihWLCBQT1MsIEJJVCkgXAotZG8geyBcCi0gIGlmIChCSVQpIFwKLSAgICBWIHw9IEJJVDMyKFBPUyk7IFwKLSAgZWxzZSBcCi0gICAgViAmPSB+QklUMzIoUE9TKTsgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgTUJMSVQzMihWLCBMTywgSEksIFZBTCkgXAotZG8geyBcCi0gIChWKSA9ICgoKFYpICYgfk1BU0szMigoTE8pLCAoSEkpKSkgXAotCSB8IElOU0VSVEVEMzIoVkFMLCBMTywgSEkpKTsgXAotfSB3aGlsZSAoMCkKLQotCi0vKiBzb21lIHJvdGF0ZSBmdW5jdGlvbnMgdG8gbWFrZSB0aGluZ3MgZWFzaWVyCi0KLSAgIE5PVEU6IFRoZXNlIGFyZSBmdW5jdGlvbnMgbm90IG1hY3JvJ3MgYXMgdGhlIGxhdHRlciB0aWNrbGVzIGJ1Z3MgaW4KLSAgIGdjYy0yLjYuMyAqLwotCi0jZGVmaW5lIF9ST1RMbihOLCBWQUwsIFNISUZUKSBcCi0oKChWQUwpIDw8IChTSElGVCkpIHwgKChWQUwpID4+ICgoTiktKFNISUZUKSkpKQotCi1JTkxJTkVfQklUU1wKLSh1bnNpZ25lZDMyKSBST1RMMzIKLSh1bnNpZ25lZDMyIHZhbCwKLSBsb25nIHNoaWZ0KTsKLQotSU5MSU5FX0JJVFNcCi0odW5zaWduZWQ2NCkgUk9UTDY0Ci0odW5zaWduZWQ2NCB2YWwsCi0gbG9uZyBzaGlmdCk7Ci0KLQotI2lmIChCSVRTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgImJpdHMuYyIKLSNlbmRpZgotCi0jZW5kaWYgLyogX0JJVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvY2FwLmMgYi9zaW0vcHBjL2NhcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JlMzA0Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvY2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwxOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9DQVBfQ18KLSNkZWZpbmUgX0NBUF9DXwotCi0jaW5jbHVkZSAiY2FwLmgiCi0KLXR5cGVkZWYgc3RydWN0IF9jYXBfbWFwcGluZyBjYXBfbWFwcGluZzsKLXN0cnVjdCBfY2FwX21hcHBpbmcgewotICB1bnNpZ25lZF9jZWxsIGV4dGVybmFsOwotICB2b2lkICppbnRlcm5hbDsKLSAgY2FwX21hcHBpbmcgKm5leHQ7Ci19OwotCi1zdHJ1Y3QgX2NhcCB7Ci0gIGludCBucl9tYXBwaW5nczsKLSAgY2FwX21hcHBpbmcgKm1hcHBpbmdzOwotfTsKLQotSU5MSU5FX0NBUFwKLShjYXAgKikKLWNhcF9jcmVhdGUoY29uc3QgY2hhciAqa2V5KQotewotICByZXR1cm4gWkFMTE9DKGNhcCk7Ci19Ci0KLUlOTElORV9DQVBcCi0odm9pZCkKLWNhcF9pbml0KGNhcCAqZGIpCi17Ci0gIGNhcF9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKLSAgaWYgKGN1cnJlbnRfbWFwICE9IE5VTEwpIHsKLSAgICBkYi0+bnJfbWFwcGluZ3MgPSBkYi0+bWFwcGluZ3MtPmV4dGVybmFsOwotICAgIC8qIHZlcmlmeSB0aGF0IHRoZSBtYXBwaW5ncyB0aGF0IHdlcmUgbm90IHJlbW92ZWQgYXJlIGluIHNlcXVlbmNlCi0gICAgICAgZG93biB0byBuciAxICovCi0gICAgd2hpbGUgKGN1cnJlbnRfbWFwLT5uZXh0ICE9IE5VTEwpIHsKLSAgICAgIGlmIChjdXJyZW50X21hcC0+ZXh0ZXJuYWwgIT0gY3VycmVudF9tYXAtPm5leHQtPmV4dGVybmFsICsgMSkKLQllcnJvcigiY2FwOiBjYXAgZGF0YWJhc2UgcG9zc2libHkgY29ycnVwdCIpOwotICAgICAgY3VycmVudF9tYXAgPSBjdXJyZW50X21hcC0+bmV4dDsKLSAgICB9Ci0gICAgQVNTRVJUKGN1cnJlbnRfbWFwLT5uZXh0ID09IE5VTEwpOwotICAgIGlmIChjdXJyZW50X21hcC0+ZXh0ZXJuYWwgIT0gMSkKLSAgICAgIGVycm9yKCJjYXA6IGNhcCBkYXRhYmFzZSBwb3NzaWJseSBjdXJydXB0Iik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZGItPm5yX21hcHBpbmdzID0gMDsKLSAgfQotfQotCi1JTkxJTkVfQ0FQXAotKHZvaWQgKikKLWNhcF9pbnRlcm5hbChjYXAgKmRiLAotCSAgICAgc2lnbmVkX2NlbGwgZXh0ZXJuYWwpCi17Ci0gIGNhcF9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKLSAgd2hpbGUgKGN1cnJlbnRfbWFwICE9IE5VTEwpIHsKLSAgICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsID09IGV4dGVybmFsKQotICAgICAgcmV0dXJuIGN1cnJlbnRfbWFwLT5pbnRlcm5hbDsKLSAgICBjdXJyZW50X21hcCA9IGN1cnJlbnRfbWFwLT5uZXh0OwotICB9Ci0gIHJldHVybiAodm9pZCopMDsKLX0KLQotSU5MSU5FX0NBUFwKLShzaWduZWRfY2VsbCkKLWNhcF9leHRlcm5hbChjYXAgKmRiLAotCSAgICAgdm9pZCAqaW50ZXJuYWwpCi17Ci0gIGNhcF9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKLSAgd2hpbGUgKGN1cnJlbnRfbWFwICE9IE5VTEwpIHsKLSAgICBpZiAoY3VycmVudF9tYXAtPmludGVybmFsID09IGludGVybmFsKQotICAgICAgcmV0dXJuIGN1cnJlbnRfbWFwLT5leHRlcm5hbDsKLSAgICBjdXJyZW50X21hcCA9IGN1cnJlbnRfbWFwLT5uZXh0OwotICB9Ci0gIHJldHVybiAwOwotfQotCi1JTkxJTkVfQ0FQXAotKHZvaWQpCi1jYXBfYWRkKGNhcCAqZGIsCi0Jdm9pZCAqaW50ZXJuYWwpCi17Ci0gIGlmIChjYXBfZXh0ZXJuYWwoZGIsIGludGVybmFsKSAhPSAwKSB7Ci0gICAgZXJyb3IoImNhcDogYXR0ZW1wdGluZyB0byBhZGQgYW4gb2JqZWN0IGFscmVhZHkgaW4gdGhlIGRhdGEgYmFzZSIpOwotICB9Ci0gIGVsc2UgewotICAgIC8qIGluc2VydCBhdCB0aGUgZnJvbnQgbWFraW5nIHRoaW5ncyBpbiBkZWNlbmRpbmcgb3JkZXIgKi8KLSAgICBjYXBfbWFwcGluZyAqbmV3X21hcCA9IFpBTExPQyhjYXBfbWFwcGluZyk7Ci0gICAgbmV3X21hcC0+bmV4dCA9IGRiLT5tYXBwaW5nczsKLSAgICBuZXdfbWFwLT5pbnRlcm5hbCA9IGludGVybmFsOwotICAgIGRiLT5ucl9tYXBwaW5ncyArPSAxOwotICAgIG5ld19tYXAtPmV4dGVybmFsID0gZGItPm5yX21hcHBpbmdzOwotICAgIGRiLT5tYXBwaW5ncyA9IG5ld19tYXA7Ci0gIH0KLX0KLQotSU5MSU5FX0NBUFwKLSh2b2lkKQotY2FwX3JlbW92ZShjYXAgKmRiLAotCSAgIHZvaWQgKmludGVybmFsKQotewotICBjYXBfbWFwcGluZyAqKmN1cnJlbnRfbWFwID0gJmRiLT5tYXBwaW5nczsKLSAgd2hpbGUgKCpjdXJyZW50X21hcCAhPSBOVUxMKSB7Ci0gICAgaWYgKCgqY3VycmVudF9tYXApLT5pbnRlcm5hbCA9PSBpbnRlcm5hbCkgewotICAgICAgY2FwX21hcHBpbmcgKmRlbGV0ZSA9ICpjdXJyZW50X21hcDsKLSAgICAgICpjdXJyZW50X21hcCA9IGRlbGV0ZS0+bmV4dDsKLSAgICAgIHpmcmVlKGRlbGV0ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGN1cnJlbnRfbWFwID0gJigqY3VycmVudF9tYXApLT5uZXh0OwotICB9Ci0gIGVycm9yKCJjYXA6IGF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0YW50IGludGVybmFsIG9iamVjdCIpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvY2FwLmggYi9zaW0vcHBjL2NhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzkxNzUyLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvY2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LDE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLS8qIEV4cG9ydCBhIGNhcGFiaWxpdHkgZGF0YSBiYXNlIHRoYXQgbWFwcyBiZXR3ZWVuIGludGVybmFsIGRhdGEKLSAgIHZhbHVlcyBhbmQgdGhvc2UgZ2l2ZW4gdG8gYSBzaW11bGF0aW9uICovCi0KLSNpZm5kZWYgX0NBUF9IXwotI2RlZmluZSBfQ0FQX0hfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgX2NhcCBjYXA7Ci0KLUlOTElORV9DQVBcCi0oY2FwICopIGNhcF9jcmVhdGUKLShjb25zdCBjaGFyICpuYW1lKTsKLQotSU5MSU5FX0NBUFwKLSh2b2lkKSBjYXBfaW5pdAotKGNhcCAqZGIpOwotCi1JTkxJTkVfQ0FQXAotKHNpZ25lZF9jZWxsKSBjYXBfZXh0ZXJuYWwKLShjYXAgKmRiLAotIHZvaWQgKmludGVybmFsKTsKLQotSU5MSU5FX0NBUFwKLSh2b2lkICopIGNhcF9pbnRlcm5hbAotKGNhcCAqZGIsCi0gc2lnbmVkX2NlbGwgZXh0ZXJuYWwpOwotCi1JTkxJTkVfQ0FQXAotKHZvaWQpIGNhcF9hZGQKLShjYXAgKmRiLAotIHZvaWQgKmludGVybmFsKTsKLQotSU5MSU5FX0NBUFwKLSh2b2lkKSBjYXBfcmVtb3ZlCi0oY2FwICpkYiwKLSB2b2lkICppbnRlcm5hbCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jb25maWcuaW4gYi9zaW0vcHBjL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzYTgzMy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IHNldCBieSBgZ2V0Z3JvdXBzJy4KLSAgIFVzdWFsbHkgdGhpcyBpcyBlaXRoZXIgYGludCcgb3IgYGdpZF90Jy4gICovCi0jdW5kZWYgR0VUR1JPVVBTX1QKLQotLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIGdpZF90Ci0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgaWYgeW91ciBzdHJ1Y3Qgc3RhdCBoYXMgc3RfYmxrc2l6ZS4gICovCi0jdW5kZWYgSEFWRV9TVF9CTEtTSVpFCi0KLS8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCBzdGF0IGhhcyBzdF9ibG9ja3MuICAqLwotI3VuZGVmIEhBVkVfU1RfQkxPQ0tTCi0KLS8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCBzdGF0IGhhcyBzdF9yZGV2LiAgKi8KLSN1bmRlZiBIQVZFX1NUX1JERVYKLQotLyogRGVmaW5lIGlmIHlvdXIgc3RydWN0IHRtIGhhcyB0bV96b25lLiAgKi8KLSN1bmRlZiBIQVZFX1RNX1pPTkUKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCBoYXZlIHRtX3pvbmUgYnV0IGRvIGhhdmUgdGhlIGV4dGVybmFsIGFycmF5Ci0gICB0em5hbWUuICAqLwotI3VuZGVmIEhBVkVfVFpOQU1FCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBtb2RlX3QKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgcGlkX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBzdHJ1Y3QgdG0uICAqLwotI3VuZGVmIFRNX0lOX1NZU19USU1FCi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiB1aWRfdAotCi0vKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLwotI3VuZGVmIFdPUkRTX0JJR0VORElBTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFjY2VzcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9BQ0NFU1MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjZmdldGlzcGVlZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DRkdFVElTUEVFRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNmZ2V0b3NwZWVkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NGR0VUT1NQRUVECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2ZzZXRpc3BlZWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0ZTRVRJU1BFRUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjZnNldG9zcGVlZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DRlNFVE9TUEVFRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNoZGlyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NIRElSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2htb2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0hNT0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjaG93biBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DSE9XTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkdXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRFVQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZHVwMiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EVVAyCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNobW9kIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZDSE1PRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjaG93biBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GQ0hPV04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GQ05UTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZzdGF0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZTVEFUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZnN0YXRmcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GU1RBVEZTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGRpcmVudHJpZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VURElSRU5UUklFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGVnaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VURUdJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGV1aWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VURVVJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGdpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRHSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwcGlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBQSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dGltZW9mZGF5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHVpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRVSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpb2N0bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JT0NUTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGtpbGwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfS0lMTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxzZWVrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0xTRUVLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbHN0YXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTFNUQVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBta2RpciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NS0RJUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwaXBlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BJUEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVhZGxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkVBRExJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBybWRpciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9STURJUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0cmVnaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUUkVHSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRyZXVpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRSRVVJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ3Byb2NtYXNrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR1BST0NNQVNLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RhdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVEFUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeW1saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NZTUxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2RyYWluIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RDRFJBSU4KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2Zsb3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVENGTE9XCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGNmbHVzaCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UQ0ZMVVNICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGNnZXRhdHRyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RDR0VUQVRUUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjZ2V0cGdycCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UQ0dFVFBHUlAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y3NlbmRicmVhayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UQ1NFTkRCUkVBSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjc2V0YXR0ciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UQ1NFVEFUVFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y3NldHBncnAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVENTRVRQR1JQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW1hc2sgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU1BU0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU5MSU5LCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0lPQ1RMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21vdW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19NT1VOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90ZXJtaW8uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RFUk1JT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90ZXJtaW9zLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19URVJNSU9TX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9wcGMvY29uZmlndXJlIGIvc2ltL3BwYy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjZWRmNWQuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCBvciBub25zdHJpY3QgYWxpZ25tZW50LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1hc3NlcnQJCQlTcGVjaWZ5IHdoZXRoZXIgdG8gcGVyZm9ybSByYW5kb20gYXNzZXJ0aW9ucy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYml0c2l6ZT1uCQlTcGVjaWZ5IHRhcmdldCBiaXRzaXplICgzMiBvciA2NCkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIHRoZSBCU1dBUCBpbnN0cnVjdGlvbiBvbiBJbnRlbCA0ODZzIGFuZCBQZW50aXVtcy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1jb25maWc9ZmlsZQkJT3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgZmlsZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWNvZGUtbWVjaGFuaXNtPXdoaWNoCQlTcGVjaWZ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgbWVjaGFuaXNtLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPXdoaWNoCVNwZWNpZnkgZGVmYXVsdCBQb3dlclBDIHRvIG1vZGVsLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUJCUV4cGFuZCAoZHVwbGljYXRlKSBzZW1hbnRpYyBmdW5jdGlvbnMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWVuZGlhbj1lbmRpYW4JCVNwZWNpZnkgdGFyZ2V0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1lbnY9ZW52CQkJU3BlY2lmeSB0YXJnZXQgZW52aXJvbm1lbnQgKG9wZXJhdGluZywgdmlydHVhbCwgdXNlcikuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWZpbHRlcj1ydWxlCQlTcGVjaWZ5IGZpbHRlciBydWxlcy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZmxvYXQJCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIGhvc3QgZmxvYXRpbmcgcG9pbnQgb3Igc2ltdWxhdGUuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWhhcmR3YXJlPWxpc3QJCVNwZWNpZnkgdGhlIGhhcmR3YXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taG9zdGJpdHNpemU9MzJ8NjQJU3BlY2lmeSBob3N0IGJpdHNpemUgKDMyIG9yIDY0KS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taWNhY2hlPXNpemUJCVNwZWNpZnkgaW5zdHJ1Y3Rpb24tZGVjb2RlIGNhY2hlIHNpemUgYW5kIHR5cGUuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tanVtcAkJSnVtcCBiZXR3ZWVuIHNlbWFudGljIGNvZGUgKGluc3RlYWQgb2YgY2FsbC9yZXR1cm4pLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1saW5lLW5yPW9wdHMJCUdlbmVyYXRlIGV4dHJhIENQUCBjb2RlIHRoYXQgcmVmZXJlbmNlcyBzb3VyY2UgcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGNvZGUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tbW9kZWw9d2hpY2gJCVNwZWNpZnkgUG93ZXJQQyB0byBtb2RlbC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUJCVNwZWNpZnkgd2hldGhlciB0byBzaW11bGF0ZSBtb2RlbCBzcGVjaWZpYyBhY3Rpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLW1vbml0b3I9bW9uCQlTcGVjaWZ5IHdoZXRoZXIgdG8gZW5hYmxlIG1vbml0b3JpbmcgZXZlbnRzLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1vcGNvZGU9d2hpY2gJCU92ZXJyaWRlIGRlZmF1bHQgb3Bjb2RlIGxvb2t1cC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tcGFja2FnZXM9bGlzdAkJU3BlY2lmeSB0aGUgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1yZWdwYXJtPW5yLXBhcm0JCVBhc3MgcGFyYW1ldGVycyBpbiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbiB0aGUgc3RhY2sgLSB4ODYvR0NDIHNwZWNpZmljLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tc21wPW4JCQlTcGVjaWZ5IG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIGNvbmZpZ3VyZSBmb3IuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGNhbGw9dHlwZQkJVXNlIGFuIGFsdGVybmF0aXZlIGZ1bmN0aW9uIGNhbGwvcmV0dXJuIG1lY2hhbmlzbSAtIHg4Ni9HQ0Mgc3BlY2lmaWMuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN3aXRjaAkJCVVzZSBhIHN3aXRjaCBpbnN0ZWFkIG9mIGEgdGFibGUgZm9yIGluc3RydWN0aW9uIGNhbGwuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRpbWViYXNlCQkJU3BlY2lmeSB3aGV0aGVyIHRoZSBQUEMgdGltZWJhc2UgaXMgc3VwcG9ydGVkLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZQkJCVNwZWNpZnkgd2hldGhlciB0cmFjaW5nIGlzIHN1cHBvcnRlZC4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0td2FybmluZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB0dXJuaW5nIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGV4Y2VwdCBmb3IgaWRlY29kZS5vLCBzZW1hbnRpY3MubyBhbmQgcHNpbS5vIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXhvci1lbmRpYW49bgkJU3BlY2lmeSBudW1iZXIgYnl0ZXMgaW52b2x2ZWQgaW4gUG93ZXJQQyBYT1IgYmktZW5kaWFuIG1vZGUgKGRlZmF1bHQgOCkuIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NjU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgOTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4MDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMDg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA0OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDcwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMjk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzExOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzg2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzOTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0OTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Nzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3MDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3MzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE3Mzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIwMDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwOTQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTU2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE4OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjA5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMjg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNTU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgzOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMTg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzkyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTU1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MTU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCBzdHJpY3QgfCBTVFJJQ1QpCXNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OwotICBubyB8IG5vbnN0cmljdCB8IE5PTlNUUklDVCkJc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIDAgfCBkZWZhdWx0IHwgREVGQVVMVCkJc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIjs7Ci0gICopCQkJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2FsaWdubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9hbGlnbm1lbnQ9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hc3NlcnQgb3IgLS1kaXNhYmxlLXNpbS1hc3NlcnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Fzc2VydCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Fzc2VydCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9hc3NlcnQ9Ii1EV0lUSF9BU1NFUlQ9MSI7OwotICBubykJc2ltX2Fzc2VydD0iLURXSVRIX0FTU0VSVD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1hc3NlcnQgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYXNzZXJ0PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYXNzZXJ0IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBhc3NlcnQgZmxhZ3MgPSAkc2ltX2Fzc2VydCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2Fzc2VydD0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJpdHNpemUgb3IgLS1kaXNhYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9iaXRzaXplK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYml0c2l6ZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAzMnw2NCkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSRlbmFibGV2YWwiOzsKLSAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9iaXRzaXplPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYml0c2l6ZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYml0c2l6ZSBmbGFncyA9ICRzaW1fYml0c2l6ZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2JpdHNpemU9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICBubykJc2ltX2NmbGFncz0iIjs7Ci0gICopCXNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCi1maQotZWxzZQotICBzaW1fY2ZsYWdzPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY29uZmlnIG9yIC0tZGlzYWJsZS1zaW0tY29uZmlnIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jb25maWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWNvbmZpZz1maWxlIiIgMT4mMjsgZXhpdCAxOyB9OzsKLSAgKikJCWlmIHRlc3QgLWYgIiR7c3JjZGlyfS8ke2VuYWJsZXZhbH0iOyB0aGVuCi0JCSAgc2ltX2NvbmZpZz0iJHtlbmFibGV2YWx9IjsKLQkJZWxpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9LWNvbmZpZy5oIjsgdGhlbgotCQkgIHNpbV9jb25maWc9IiR7ZW5hYmxldmFsfS1jb25maWcuaCIKLQkJZWxzZQotCQkgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkNvbmZpZyBmaWxlICRlbmFibGV2YWwgd2FzIG5vdCBmb3VuZCIiIDE+JjI7IGV4aXQgMTsgfTsKLQkJICBzaW1fY29uZmlnPXN0ZC1jb25maWcuaAotCQlmaTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NvbmZpZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgY29uZmlnIGZsYWdzID0gJHNpbV9jb25maWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jb25maWc9InN0ZC1jb25maWcuaCIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBjb25maWcgZmxhZ3MgPSAkc2ltX2NvbmZpZyIgNj4mMQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWNvZGUtbWVjaGFuaXNtIG9yIC0tZGlzYWJsZS1zaW0tZGVjb2RlLW1lY2hhbmlzbSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVjb2RlX21lY2hhbmlzbStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlY29kZV9tZWNoYW5pc20iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzfG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWRlY29kZS1tZWNoYW5pc209ZmlsZSIiIDE+JjI7IGV4aXQgMTsgfTs7Ci0gIGFycmF5fHN3aXRjaHxwYWRkZWQtc3dpdGNofGdvdG8tc3dpdGNoKQlzaW1fZGVjb2RlX21lY2hhbmlzbT0iLVQgJHtlbmFibGV2YWx9Ijs7Ci0gICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJGaWxlICRlbmFibGV2YWwgaXMgbm90IGFuIG9wY29kZSBydWxlcyBmaWxlIiIgMT4mMjsgZXhpdCAxOyB9OwotCQlzaW1fZGVjb2RlX21lY2hhbmlzbT0ic3dpdGNoIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlY29kZV9tZWNoYW5pc20iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGRlY29kZSBtZWNoYW5pc20gZmxhZ3MgPSAkc2ltX2RlY29kZV9tZWNoYW5pc20iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWNvZGVfbWVjaGFuaXNtPSIiCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZGVjb2RlIG1lY2hhbmlzbSBmbGFncyA9ICRzaW1fZGVjb2RlX21lY2hhbmlzbSIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCBvciAtLWRpc2FibGUtc2ltLWRlZmF1bHQtbW9kZWwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWZhdWx0X21vZGVsIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPW1vZGVsIiIgMT4mMjsgZXhpdCAxOyB9OzsKLSAgKikJCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZGVmYXVsdC1tb2RlbCBmbGFncyA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlZmF1bHRfbW9kZWw9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgb3IgLS1kaXNhYmxlLXNpbS1kdXBsaWNhdGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2R1cGxpY2F0ZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2R1cGxpY2F0ZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9kdXA9Ii1FIjs7Ci0gIG5vKQlzaW1fZHVwPSIiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9kdXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kdXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGR1cGxpY2F0ZSBmbGFncyA9ICRzaW1fZHVwIiA2PiYxCi1maQotZWxzZQotICBzaW1fZHVwPSItRSIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBkdXBsaWNhdGUgZmxhZ3MgPSAkc2ltX2R1cCIgNj4mMQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCWNhc2UgIiR0YXJnZXQiIGluCi0JICAqcG93ZXJwYy0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotCSAgKnBvd2VycGNsZS0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotCSAgKikgZWNobyAiVW5rbm93biB0YXJnZXQgJHRhcmdldCIgMT4mNjsgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiOzsKLQllc2FjOzsKLSAgbm8pCSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCI7OwotICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKLSAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCi1maQotZWxzZQotICBzaW1fZW5kaWFuPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW52IG9yIC0tZGlzYWJsZS1zaW0tZW52IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbnYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbnYiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgb3BlcmF0aW5nIHwgb3MgfCBvZWEpCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD1PUEVSQVRJTkdfRU5WSVJPTk1FTlQiOzsKLSAgdmlydHVhbCB8IHZlYSkJc2ltX2Vudj0iLURXSVRIX0VOVklST05NRU5UPVZJUlRVQUxfRU5WSVJPTk1FTlQiOzsKLSAgdXNlciB8IHVlYSkJCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD1VU0VSX0VOVklST05NRU5UIjs7Ci0gIG5vKQkJCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD0wIjs7Ci0gICopCQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tZW52IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW52PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW52IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbnYgZmxhZ3MgPSAkc2ltX2VudiIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2Vudj0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWZpbHRlciBvciAtLWRpc2FibGUtc2ltLWZpbHRlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZmlsdGVyK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZmlsdGVyIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWZpbHRlciBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgcnVsZSB0byBmaWx0ZXIgb3Igbm8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9maWx0ZXI9IiI7OwotICBubykJc2ltX2ZpbHRlcj0iIjs7Ci0gICopCXNpbV9maWx0ZXI9Ii1GICRlbmFibGV2YWwiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZmlsdGVyIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBmaWx0ZXIgZmxhZ3MgPSAkc2ltX2ZpbHRlciIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2ZpbHRlcj0iLUYgMzIsZixvIgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGZpbHRlciBmbGFncyA9ICRzaW1fZmlsdGVyIiA2PiYxCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWZsb2F0IG9yIC0tZGlzYWJsZS1zaW0tZmxvYXQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2Zsb2F0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZmxvYXQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgaGFyZCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCI7OwotICBubyB8IHNvZnQpCXNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPVNPRlRfRkxPQVRJTkdfUE9JTlQiOzsKLSAgKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWZsb2F0IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZmxvYXQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9mbG9hdCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZmxvYXQgZmxhZ3MgPSAkc2ltX2Zsb2F0IiA2PiYxCi1maQotZWxzZQotICBzaW1fZmxvYXQ9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1oYXJkd2FyZSBvciAtLWRpc2FibGUtc2ltLWhhcmR3YXJlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9oYXJkd2FyZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hhcmR3YXJlIgotICBoYXJkd2FyZT0iY3B1LG1lbW9yeSxudnJhbSxpb2J1cyxodGFiLGRpc2ssdHJhY2UscmVnaXN0ZXIsdm0saW5pdCxjb3JlLHBhbCxjb20sZWVwcm9tLG9waWMsZ2x1ZSxwaGIsaWRlIgotY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCTs7Ci0gIG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJMaXN0IG9mIGhhcmR3YXJlIG11c3QgYmUgc3BlY2lmaWVkIGZvciAtLWVuYWJsZS1zaW0taGFyZHdhcmUiIiAxPiYyOyBleGl0IDE7IH07IGhhcmR3YXJlPSIiOzsKLSAgLCopICAgaGFyZHdhcmU9IiR7aGFyZHdhcmV9JHtlbmFibGV2YWx9Ijs7Ci0gICosKSAgIGhhcmR3YXJlPSIke2VuYWJsZXZhbH0ke2hhcmR3YXJlfSI7OwotICAqKQloYXJkd2FyZT0iJHtlbmFibGV2YWx9IicnOzsKLWVzYWMKLXNpbV9od19zcmM9YGVjaG8gJGhhcmR3YXJlIHwgc2VkIC1lICdzLywvLmMgaHdfL2cnIC1lICdzL14vaHdfLycgLWUgcycvJC8uYy8nYAotc2ltX2h3X29iaj1gZWNobyAkc2ltX2h3X3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkaGFyZHdhcmUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfc3JjLCAkc2ltX2h3X29iaiIKLWZpCi1lbHNlCi0gIGhhcmR3YXJlPSJjcHUsbWVtb3J5LG52cmFtLGlvYnVzLGh0YWIsZGlzayx0cmFjZSxyZWdpc3Rlcix2bSxpbml0LGNvcmUscGFsLGNvbSxlZXByb20sb3BpYyxnbHVlLHBoYixpZGUiCi1zaW1faHdfc3JjPWBlY2hvICRoYXJkd2FyZSB8IHNlZCAtZSAncy8sLy5jIGh3Xy9nJyAtZSAncy9eL2h3Xy8nIC1lIHMnLyQvLmMvJ2AKLXNpbV9od19vYmo9YGVjaG8gJHNpbV9od19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfc3JjLCAkc2ltX2h3X29iaiIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGJpdHNpemUgb3IgLS1kaXNhYmxlLXNpbS1ob3N0Yml0c2l6ZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGJpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0Yml0c2l6ZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAzMnw2NCkgc2ltX2hvc3RiaXRzaXplPSItRFdJVEhfSE9TVF9XT1JEX0JJVFNJWkU9JGVuYWJsZXZhbCI7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWhvc3RiaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0Yml0c2l6ZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RiaXRzaXplIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBob3N0Yml0c2l6ZSBmbGFncyA9ICRzaW1faG9zdGJpdHNpemUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ob3N0Yml0c2l6ZT0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1ob3N0ZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ob3N0ZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faG9zdGVuZGlhbiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKLSAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKLSAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKLSAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0ZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQotZmkKLWVsc2UKLSAgCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA3OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KLSMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KLSBib2d1cyBlbmRpYW4gbWFjcm9zCi0jZW5kaWYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTI1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotaW50IG1haW4oKSB7Ci0KLSNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KLSBub3QgYmlnIGVuZGlhbgotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLW1haW4gKCkgewotICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBsb25nIGw7Ci0gICAgY2hhciBjW3NpemVvZiAobG9uZyldOwotICB9IHU7Ci0gIHUubCA9IDE7Ci0gIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2JpZ2VuZGlhbiIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCi1FT0YKLQotZmkKLQotICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgotICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCi0gIGVsc2UKLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgotICBmaQotZWxzZQotICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pY2FjaGUgb3IgLS1kaXNhYmxlLXNpbS1pY2FjaGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2ljYWNoZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2ljYWNoZSIKLSAgaWNhY2hlPSItUiIKLSBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJCWljYWNoZT0iMTAyNCI7IHNpbV9pY2FjaGU9Ii1JICRpY2FjaGUiOzsKLSAgbm8pCQlzaW1faWNhY2hlPSItUiI7OwotICAqKSBpY2FjaGU9MTAyNAotICAgICBzaW1faWNhY2hlPSItIgotICAgICBmb3IgeCBpbiBgZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotICAgICAgIGNhc2UgIiR4IiBpbgotICAgICAgICAgZGVmaW5lKQlzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9UiI7OwotICAgICAgICAgc2VtYW50aWMpCXNpbV9pY2FjaGU9IiR7c2ltX2ljYWNoZX1DIjs7Ci0JIGluc24pCQlzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9UyI7OwotCSAwKnwxKnwyKnwzKnw0Knw1Knw2Knw3Knw4Knw5KikJaWNhY2hlPSR4OzsKLSAgICAgICAgICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICR4IGZvciAtLWVuYWJsZS1zaW0taWNhY2hlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faWNhY2hlPSIiOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfUkgJGljYWNoZSI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGljYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgc2l6ZSB0byAkaWNhY2hlICgkc2ltX2ljYWNoZSkiCi1maQotZWxzZQotICBzaW1faWNhY2hlPSItQ1NSSSAxMDI0IgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGluc3RydWN0aW9uIGNhY2hlIHNpemUgdG8gMTAyNCAoJHNpbV9pY2FjaGUpIgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pbmxpbmUgb3IgLS1kaXNhYmxlLXNpbS1pbmxpbmUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2lubGluZSIKLSAgc2ltX2lubGluZT0iIgotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLSAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKLSAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OwotICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9JTkxJTkUiOzsKLSAgMSkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyI7OwotICAqKSBmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLSAgICAgICBuZXdfZmxhZz0iIgotICAgICAgIGNhc2UgIiR4IiBpbgotCSAqX0lOTElORT0qKQluZXdfZmxhZz0iLUQkeCI7OwotCSAqPSopCQluZXdfZmxhZz1gZWNobyAiJHgiIHwgc2VkIC1lICJzLz0vX0lOTElORT0vIiAtZSAicy9eLy1ELyJgOzsKLQkgKl9JTkxJTkUpCW5ld19mbGFnPSItRCR4PUFMTF9JTkxJTkUiOzsKLQkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9JTkxJTkUiOzsKLSAgICAgICBlc2FjCi0gICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgotCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCi0gICAgICAgZWxzZQotCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCi0gICAgICAgZmkKLSAgICAgZG9uZTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKLWZpCi1lbHNlCi0gIGlmIHRlc3QgeCIkR0NDIiAhPSAiIjsgdGhlbgotICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiCi0gIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCi0gIGZpCi1lbHNlCi0gIHNpbV9pbmxpbmU9IiIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tanVtcCBvciAtLWRpc2FibGUtc2ltLWp1bXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2p1bXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9qdW1wIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2p1bXA9Ii1KIjs7Ci0gIG5vKQlzaW1fanVtcD0iIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1qdW1wIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2p1bXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9qdW1wIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBqdW1wIGZsYWcgPSAkc2ltX2p1bXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9qdW1wPSIiCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcganVtcCBmbGFnID0gJHNpbV9qdW1wIiA2PiYxCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWxpbmUtbnIgb3IgLS1kaXNhYmxlLXNpbS1saW5lLW5yIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9saW5lX25yK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fbGluZV9uciIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9saW5lX25yPSIiOzsKLSAgbm8pCXNpbV9saW5lX25yPSItTCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tbGluZS1uciBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9saW5lX25yPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbGluZV9uciIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fbGluZV9uciIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2xpbmVfbnI9IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1tb2RlbCBvciAtLWRpc2FibGUtc2ltLW1vZGVsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9tb2RlbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX21vZGVsIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1tb2RlbD1tb2RlbCIiIDE+JjI7IGV4aXQgMTsgfTs7Ci0gICopCQlzaW1fbW9kZWw9Ii1EV0lUSF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbW9kZWwiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1vZGVsIGZsYWdzID0gJHNpbV9tb2RlbCIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX21vZGVsPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUgb3IgLS1kaXNhYmxlLXNpbS1tb2RlbC1pc3N1ZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fbW9kZWxfaXNzdWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9tb2RlbF9pc3N1ZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX1BST0NFU1MiOzsKLSAgbm8pCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX0lHTk9SRSI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fbW9kZWxfaXNzdWU9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1vZGVsLWlzc3VlIGZsYWdzID0gJHNpbV9tb2RlbF9pc3N1ZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX21vZGVsX2lzc3VlPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tbW9uaXRvciBvciAtLWRpc2FibGUtc2ltLW1vbml0b3Igd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX21vbml0b3Irc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9tb25pdG9yIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPSdNT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFIHwgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQnIjs7Ci0gIG5vKQkJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049MCI7OwotICBpbnN0cnVjdGlvbikJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049TU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRSI7OwotICBtZW1vcnkpCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPU1PTklUT1JfTE9BRF9TVE9SRV9VTklUIjs7Ci0gICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1tb24iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbnY9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9tb25pdG9yIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtb25pdG9yIGZsYWdzID0gJHNpbV9tb25pdG9yIiA2PiYxCi1maQotZWxzZQotICBzaW1fbW9uaXRvcj0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLW9wY29kZSBvciAtLWRpc2FibGUtc2ltLW9wY29kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fb3Bjb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fb3Bjb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1vcGNvZGU9ZmlsZSIiIDE+JjI7IGV4aXQgMTsgfTs7Ci0gICopCQlpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9IjsgdGhlbgotCQkgIHNpbV9vcGNvZGU9IiR7ZW5hYmxldmFsfSIKLQkJZWxpZiB0ZXN0IC1mICIke3NyY2Rpcn0vZGMtJHtlbmFibGV2YWx9IjsgdGhlbgotCQkgIHNpbV9vcGNvZGU9ImRjLSR7ZW5hYmxldmFsfSIKLQkJZWxzZQotCQkgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkZpbGUgJGVuYWJsZXZhbCBpcyBub3QgYW4gb3Bjb2RlIHJ1bGVzIGZpbGUiIiAxPiYyOyBleGl0IDE7IH07Ci0JCSAgc2ltX29wY29kZT0iZGMtY29tcGxleCIKLQkJZmk7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9vcGNvZGUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG9wY29kZSBmbGFncyA9ICRzaW1fb3Bjb2RlIiA2PiYxCi1maQotZWxzZQotICBzaW1fb3Bjb2RlPSJkYy1jb21wbGV4IgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG9wY29kZSBmbGFncyA9ICRzaW1fb3Bjb2RlIgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyBvciAtLWRpc2FibGUtc2ltLXBhY2thZ2VzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wYWNrYWdlcytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3BhY2thZ2VzIgotICBwYWNrYWdlcz1kaXNrbGFiZWwKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTGlzdCBvZiBwYWNrYWdlcyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgLS1lbmFibGUtc2ltLXBhY2thZ2VzIiIgMT4mMjsgZXhpdCAxOyB9OyBwYWNrYWdlcz0iIjs7Ci0gICwqKSAgIHBhY2thZ2VzPSIke3BhY2thZ2VzfSR7ZW5hYmxldmFsfSI7OwotICAqLCkgICBwYWNrYWdlcz0iJHtlbmFibGV2YWx9JHtwYWNrYWdlc30iOzsKLSAgKikJcGFja2FnZXM9IiR7ZW5hYmxldmFsfSInJzs7Ci1lc2FjCi1zaW1fcGtfc3JjPWBlY2hvICRwYWNrYWdlcyB8IHNlZCAtZSAncy8sLy5jIHBrXy9nJyAtZSAncy9eL3BrXy8nIC1lICdzLyQvLmMvJ2AKLXNpbV9wa19vYmo9YGVjaG8gJHNpbV9wa19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHBhY2thZ2VzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCi1maQotZWxzZQotICBwYWNrYWdlcz1kaXNrbGFiZWwKLXNpbV9wa19zcmM9YGVjaG8gJHBhY2thZ2VzIHwgc2VkIC1lICdzLywvLmMgcGtfL2cnIC1lICdzL14vcGtfLycgLWUgJ3MvJC8uYy8nYAotc2ltX3BrX29iaj1gZWNobyAkc2ltX3BrX3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcGFja2FnZXMgdG8gJHNpbV9wa19zcmMsICRzaW1fcGtfb2JqIgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1yZWdwYXJtIG9yIC0tZGlzYWJsZS1zaW0tcmVncGFybSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fcmVncGFybStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3JlZ3Bhcm0iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgMCp8MSp8Mip8Myp8NCp8NSp8Nip8Nyp8OCp8OSopIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0ke2VuYWJsZXZhbH0iOzsKLSAgbm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSIiIDs7Ci0gIHllcykgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fcmVncGFybT0iLURXSVRIX1JFR1BBUk09MyI7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLXJlZ3Bhcm0iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZWdwYXJtPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVncGFybSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcmVncGFybSBmbGFncyA9ICRzaW1fcmVncGFybSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3JlZ3Bhcm09IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIG9yIC0tZGlzYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Jlc2VydmVkX2JpdHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fcmVzZXJ2ZWQ9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTEiOzsKLSAgbm8pCXNpbV9yZXNlcnZlZD0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZXNlcnZlZD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Jlc2VydmVkIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyByZXNlcnZlZCBmbGFncyA9ICRzaW1fcmVzZXJ2ZWQiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9yZXNlcnZlZD0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXNtcCBvciAtLWRpc2FibGUtc2ltLXNtcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc21wK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc21wIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3NtcD0iLURXSVRIX1NNUD01IiA7IHNpbV9pZ2VuX3NtcD0iLU4gNSI7OwotICBubykJc2ltX3NtcD0iLURXSVRIX1NNUD0wIiA7IHNpbV9pZ2VuX3NtcD0iLU4gMCI7OwotICAqKQlzaW1fc21wPSItRFdJVEhfU01QPSRlbmFibGV2YWwiIDsgc2ltX2lnZW5fc21wPSItTiAkZW5hYmxldmFsIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NtcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkY2FsbCBvciAtLWRpc2FibGUtc2ltLXN0ZGNhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGNhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRjYWxsIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIG5vKQkJc2ltX3N0ZGNhbGw9IiIgOzsKLSAgc3RkKikJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7Ci0gIHllcykJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tc3RkY2FsbCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGNhbGw9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRjYWxsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBmdW5jdGlvbiBjYWxsIGZsYWdzID0gJHNpbV9zdGRjYWxsIiA2PiYxCi1maQotZWxzZQotICBzaW1fc3RkY2FsbD0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKLSAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCi1maQotZWxzZQotICBzaW1fc3RkaW89IiIKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zd2l0Y2ggb3IgLS1kaXNhYmxlLXNpbS1zd2l0Y2ggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3N3aXRjaCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N3aXRjaCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zd2l0Y2g9Ii1zIjs7Ci0gIG5vKQlzaW1fc3dpdGNoPSIiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXN3aXRjaCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zd2l0Y2g9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zd2l0Y2giICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN3aXRjaCBmbGFncyA9ICRzaW1fc3dpdGNoIiA2PiYxCi1maQotZWxzZQotICBzaW1fc3dpdGNoPSIiOwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN3aXRjaCBmbGFncyA9ICRzaW1fc3dpdGNoIiA2PiYxCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRpbWViYXNlIG9yIC0tZGlzYWJsZS1zaW0tdGltZWJhc2Ugd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3RpbWViYXNlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdGltZWJhc2UiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fdGltZWJhc2U9Ii1EV0lUSF9USU1FX0JBU0U9MSI7OwotICBubykJc2ltX3RpbWViYXNlPSItRFdJVEhfVElNRV9CQVNFPTAiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXRpbWViYXNlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3RpbWViYXNlPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdGltZWJhc2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHRpbWViYXNlIGZsYWdzID0gJHNpbV90aW1lYmFzZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3RpbWViYXNlPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTEiOzsKLSAgbm8pCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTAiOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXRyYWNlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3RyYWNlPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHRyYWNlIGZsYWdzID0gJHNpbV90cmFjZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3RyYWNlPSIiCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0td2FybmluZ3Mgb3IgLS1kaXNhYmxlLXNpbS13YXJuaW5ncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV93YXJuaW5ncyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV93YXJuaW5ncz0iLVdlcnJvciAtV2FsbCAtV3BvaW50ZXItYXJpdGggLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAiOzsKLSAgbm8pCXNpbV93YXJuaW5ncz0iLXciOzsKLSAgKikJc2ltX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV93YXJuaW5ncyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fd2FybmluZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV93YXJuaW5ncz0iIgotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXhvci1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS14b3ItZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV94b3JfZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1feG9yX2VuZGlhbiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj04Ijs7Ci0gIG5vKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49MCI7OwotICAqKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49JGVuYWJsZXZhbCI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV94b3JfZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB4b3ItZW5kaWFuIGZsYWcgPSAkc2ltX3hvcl9lbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV94b3JfZW5kaWFuPSIiCi1maQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyNzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ4OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjY2OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RfYmxrc2l6ZSBpbiBzdHJ1Y3Qgc3RhdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcxMzogY2hlY2tpbmcgZm9yIHN0X2Jsa3NpemUgaW4gc3RydWN0IHN0YXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF9zdF9ibGtzaXplJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzcxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLWludCBtYWluKCkgewotc3RydWN0IHN0YXQgczsgcy5zdF9ibGtzaXplOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zdHJ1Y3Rfc3RfYmxrc2l6ZT15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc3RydWN0X3N0X2Jsa3NpemU9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3N0X2Jsa3NpemUiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3N0cnVjdF9zdF9ibGtzaXplID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUX0JMS1NJWkUgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdF9ibG9ja3MgaW4gc3RydWN0IHN0YXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NDc6IGNoZWNraW5nIGZvciBzdF9ibG9ja3MgaW4gc3RydWN0IHN0YXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF9zdF9ibG9ja3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotaW50IG1haW4oKSB7Ci1zdHJ1Y3Qgc3RhdCBzOyBzLnN0X2Jsb2NrczsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzYwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc3RydWN0X3N0X2Jsb2Nrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc3RydWN0X3N0X2Jsb2Nrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zdHJ1Y3Rfc3RfYmxvY2tzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9zdHJ1Y3Rfc3RfYmxvY2tzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUX0JMT0NLUyAxCi1FT0YKLQotZWxzZQotICBMSUJPQkpTPSIkTElCT0JKUyBmaWxlYmxvY2tzLiR7YWNfb2JqZXh0fSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdF9yZGV2IGluIHN0cnVjdCBzdGF0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzgzOiBjaGVja2luZyBmb3Igc3RfcmRldiBpbiBzdHJ1Y3Qgc3RhdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3RydWN0X3N0X3JkZXYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotaW50IG1haW4oKSB7Ci1zdHJ1Y3Qgc3RhdCBzOyBzLnN0X3JkZXY7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3N0cnVjdF9zdF9yZGV2PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zdHJ1Y3Rfc3RfcmRldj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zdHJ1Y3Rfc3RfcmRldiIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfc3RydWN0X3N0X3JkZXYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RfUkRFViAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MTc6IGNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zdHJ1Y3RfdG0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7IHRwLT50bV9zZWM7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgzMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3N0cnVjdF90bT10aW1lLmgKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc3RydWN0X3RtPXN5cy90aW1lLmgKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3RtIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBUTV9JTl9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRtX3pvbmUgaW4gc3RydWN0IHRtIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODUxOiBjaGVja2luZyBmb3IgdG1fem9uZSBpbiBzdHJ1Y3QgdG0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF90bV96b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8JGFjX2N2X3N0cnVjdF90bT4KLWludCBtYWluKCkgewotc3RydWN0IHRtIHRtOyB0bS50bV96b25lOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zdHJ1Y3RfdG1fem9uZT15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc3RydWN0X3RtX3pvbmU9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3RtX3pvbmUiIDE+JjYKLWlmIHRlc3QgIiRhY19jdl9zdHJ1Y3RfdG1fem9uZSIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVE1fWk9ORSAxCi1FT0YKLQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpuYW1lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODg0OiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl92YXJfdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotI2lmbmRlZiB0em5hbWUgLyogRm9yIFNHSS4gICovCi1leHRlcm4gY2hhciAqdHpuYW1lW107IC8qIFJTNjAwMCBhbmQgb3RoZXJzIHJlamVjdCBjaGFyICoqdHpuYW1lLiAgKi8KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1hdG9pKCp0em5hbWUpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Zhcl90em5hbWU9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Zhcl90em5hbWU9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX3R6bmFtZSIgMT4mNgotICBpZiB0ZXN0ICRhY19jdl92YXJfdHpuYW1lID0geWVzOyB0aGVuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVFpOQU1FIDEKLUVPRgotCi0gIGZpCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkyMjogY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3VpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgInVpZF90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3VpZF90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfdWlkX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpZF90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3VpZF90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHVpZF90IGludAotRU9GCi0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGdpZF90IGludAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHR5cGUgb2YgYXJyYXkgYXJndW1lbnQgdG8gZ2V0Z3JvdXBzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTU2OiBjaGVja2luZyB0eXBlIG9mIGFycmF5IGFyZ3VtZW50IHRvIGdldGdyb3VwcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9nZXRncm91cHMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl90eXBlX2dldGdyb3Vwcz1jcm9zcwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgUmVuZGVsbCBmb3IgdGhpcyB0ZXN0LiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNkZWZpbmUgTkdJRCAyNTYKLSN1bmRlZiBNQVgKLSNkZWZpbmUgTUFYKHgsIHkpICgoeCkgPiAoeSkgPyAoeCkgOiAoeSkpCi1tYWluKCkKLXsKLSAgZ2lkX3QgZ2lkc2V0W05HSURdOwotICBpbnQgaSwgbjsKLSAgdW5pb24geyBnaWRfdCBndmFsOyBsb25nIGx2YWw7IH0gIHZhbDsKLQotICB2YWwubHZhbCA9IC0xOwotICBmb3IgKGkgPSAwOyBpIDwgTkdJRDsgaSsrKQotICAgIGdpZHNldFtpXSA9IHZhbC5ndmFsOwotICBuID0gZ2V0Z3JvdXBzIChzaXplb2YgKGdpZHNldCkgLyBNQVggKHNpemVvZiAoaW50KSwgc2l6ZW9mIChnaWRfdCkpIC0gMSwKLSAgICAgICAgICAgICAgICAgZ2lkc2V0KTsKLSAgLyogRXhpdCBub24temVybyBpZiBnZXRncm91cHMgc2VlbXMgdG8gcmVxdWlyZSBhbiBhcnJheSBvZiBpbnRzLiAgVGhpcwotICAgICBoYXBwZW5zIHdoZW4gZ2lkX3QgaXMgc2hvcnQgYnV0IGdldGdyb3VwcyBtb2RpZmllcyBhbiBhcnJheSBvZiBpbnRzLiAgKi8KLSAgZXhpdCAoKG4gPiAwICYmIGdpZHNldFtuXSAhPSB2YWwuZ3ZhbCkgPyAxIDogMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gICAgYWNfY3ZfdHlwZV9nZXRncm91cHM9Z2lkX3QKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9nZXRncm91cHM9aW50Ci1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotaWYgdGVzdCAkYWNfY3ZfdHlwZV9nZXRncm91cHMgPSBjcm9zczsgdGhlbgotICAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZ2V0Z3JvdXBzLippbnQuKmdpZF90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX2dldGdyb3Vwcz1naWRfdAotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfZ2V0Z3JvdXBzPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2dldGdyb3VwcyIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgR0VUR1JPVVBTX1QgJGFjX2N2X3R5cGVfZ2V0Z3JvdXBzCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbW9kZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDI3OiBjaGVja2luZyBmb3IgbW9kZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX21vZGVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pbW9kZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9tb2RlX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9tb2RlX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9tb2RlX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfbW9kZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG1vZGVfdCBpbnQKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNjA6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBpZF90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDkzOiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3BpZF90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgcGlkX3QgaW50Ci1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTI2OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgc2lnbmFsCi0jdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOwotI2Vsc2UKLXZvaWQgKCpzaWduYWwgKCkpICgpOwotI2VuZGlmCi0KLWludCBtYWluKCkgewotaW50IGk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9aW50Ci1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE2NzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMDA6IGNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ1aWRfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV91aWRfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3VpZF90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aWRfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV91aWRfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSB1aWRfdCBpbnQKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBnaWRfdCBpbnQKLUVPRgotCi1maQotCi0KLWZvciBhY19mdW5jIGluIGFjY2VzcyBjZmdldGlzcGVlZCBjZmdldG9zcGVlZCBjZnNldGlzcGVlZCBjZnNldG9zcGVlZCBjaGRpciBjaG1vZCBjaG93biBkdXAgZHVwMiBmY2htb2QgZmNob3duIGZjbnRsIGZzdGF0IGZzdGF0ZnMgZ2V0ZGlyZW50cmllcyBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHBpZCBnZXRwcGlkIGdldHJ1c2FnZSBnZXR0aW1lb2ZkYXkgZ2V0dWlkIGlvY3RsIGtpbGwgbGluayBsc2VlayBsc3RhdCBta2RpciBwaXBlIHJlYWRsaW5rIHJtZGlyIHNldHJldWlkIHNldHJlZ2lkIHN0YXQgc2lncHJvY21hc2sgc3RhdCBzeW1saW5rIHRjZ2V0YXR0ciB0Y3NldGF0dHIgdGNzZW5kYnJlYWsgdGNkcmFpbiB0Y2ZsdXNoIHRjZmxvdyB0Y2dldHBncnAgdGNzZXRwZ3JwIHRpbWUgdW1hc2sgdW5saW5rCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotZm9yIGFjX2hkciBpbiBmY250bC5oIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzeXMvaW9jdGwuaCBzeXMvcGFyYW0uaCBzeXMvcmVzb3VyY2UuaCBzeXMvc3RhdC5oIHN5cy90ZXJtaW8uaCBzeXMvdGVybWlvcy5oIHN5cy90aW1lLmggc3lzL3RpbWVzLmggc3lzL3R5cGVzLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI5NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQzMDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1hY19oZWFkZXJfZGlyZW50PW5vCi1mb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMzNTogY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgbWFpbigpIHsKLURJUiAqZGlycCA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl9kaXJlbnRfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIGFjX2hlYWRlcl9kaXJlbnQ9JGFjX2hkcjsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgotaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM3MzogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkaXInXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRpciAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1sZGlyIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQxNDogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8geCdfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1seCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi0KLXNpbV90ZXJtaW89IiIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgdGVybWlvcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ1ODogY2hlY2tpbmcgZm9yIHN0cnVjdCB0ZXJtaW9zIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90ZXJtaW9zX3N0cnVjdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90ZXJtaW9zLmg+Ci1pbnQgbWFpbigpIHsKLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyB4OwotIHguY19pZmxhZyA9IDA7Ci0geC5jX29mbGFnID0gMDsKLSB4LmNfY2ZsYWcgPSAwOwotIHguY19sZmxhZyA9IDA7Ci0geC5jX2NjW05DQ1NdID0gMDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdGVybWlvc19zdHJ1Y3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Rlcm1pb3Nfc3RydWN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Rlcm1pb3Nfc3RydWN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90ZXJtaW9zX3N0cnVjdCA9IHllczsgdGhlbgotICBzaW1fdGVybWlvPSIkc2ltX3Rlcm1pbyAtREhBVkVfVEVSTUlPU19TVFJVQ1RVUkUiCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfdGVybWlvc19zdHJ1Y3QiID0gInllcyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNfbGluZSBmaWVsZCBpbiBzdHJ1Y3QgdGVybWlvcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ5NTogY2hlY2tpbmcgZm9yIGNfbGluZSBmaWVsZCBpbiBzdHJ1Y3QgdGVybWlvcyIgPiY1Ci0gIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90ZXJtaW9zX2NsaW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDUwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Rlcm1pb3MuaD4KLWludCBtYWluKCkgewotc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHg7IHguY19saW5lID0gMDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdGVybWlvc19jbGluZT15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdGVybWlvc19jbGluZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotCi0gIGVjaG8gIiRhY190IiIkYWNfY3ZfdGVybWlvc19jbGluZSIgMT4mNgotICBpZiB0ZXN0ICRhY19jdl90ZXJtaW9zX2NsaW5lID0geWVzOyB0aGVuCi0gICAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT1NfQ0xJTkUiCi0gIGZpCi1lbHNlCi0gIGFjX2N2X3Rlcm1pb3NfY2xpbmU9bm8KLWZpCi0KLWlmIHRlc3QgIiRhY19jdl90ZXJtaW9zX3N0cnVjdCIgIT0gInllcyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCB0ZXJtaW8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MzE6IGNoZWNraW5nIGZvciBzdHJ1Y3QgdGVybWlvIiA+JjUKLSAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Rlcm1pb19zdHJ1Y3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGVybWlvLmg+Ci1pbnQgbWFpbigpIHsKLXN0YXRpYyBzdHJ1Y3QgdGVybWlvIHg7Ci0geC5jX2lmbGFnID0gMDsKLSB4LmNfb2ZsYWcgPSAwOwotIHguY19jZmxhZyA9IDA7Ci0geC5jX2xmbGFnID0gMDsKLSB4LmNfY2NbTkNDXSA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Rlcm1pb19zdHJ1Y3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Rlcm1pb19zdHJ1Y3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRhY19jdl90ZXJtaW9fc3RydWN0IiAxPiY2Ci0gIGlmIHRlc3QgJGFjX2N2X3Rlcm1pb19zdHJ1Y3QgPSB5ZXM7IHRoZW4KLSAgICBzaW1fdGVybWlvPSIkc2ltX3Rlcm1pbyAtREhBVkVfVEVSTUlPX1NUUlVDVFVSRSIKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfdGVybWlvX3N0cnVjdD1ubwotZmkKLQotaWYgdGVzdCAiJGFjX2N2X3Rlcm1pb19zdHJ1Y3QiID0gInllcyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNfbGluZSBmaWVsZCBpbiBzdHJ1Y3QgdGVybWlvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTcxOiBjaGVja2luZyBmb3IgY19saW5lIGZpZWxkIGluIHN0cnVjdCB0ZXJtaW8iID4mNQotICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdGVybWlvX2NsaW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Rlcm1pby5oPgotaW50IG1haW4oKSB7Ci1zdGF0aWMgc3RydWN0IHRlcm1pbyB4OyB4LmNfbGluZSA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU4NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Rlcm1pb19jbGluZT15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdGVybWlvX2NsaW5lPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0KLSAgZWNobyAiJGFjX3QiIiRhY19jdl90ZXJtaW9fY2xpbmUiIDE+JjYKLSAgaWYgdGVzdCAkYWNfY3ZfdGVybWlvX2NsaW5lID0geWVzOyB0aGVuCi0gICAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT19DTElORSIKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfdGVybWlvX2NsaW5lPW5vCi1maQotCi1zaW1fZGV2emVybz0iIgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC9kZXYvemVybyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYwNzogY2hlY2tpbmcgZm9yIC9kZXYvemVybyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZGV2emVybycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Rldnplcm89bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDYxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8ZmNudGwuaD4KLW1haW4gKCkgewotICBjaGFyIGJ1ZlsyMDQ4XTsKLSAgaW50IGk7Ci0gIGludCBmZCA9IG9wZW4gKCIvZGV2L3plcm8iLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApCi0gICAgcmV0dXJuIDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGJ1Zik7IGkrKykKLSAgICBidWZbaV0gPSAxOwotICBpZiAocmVhZCAoZmQsIGJ1Ziwgc2l6ZW9mIChidWYpKSAhPSBzaXplb2YgKGJ1ZikpCi0gICAgcmV0dXJuIDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGJ1Zik7IGkrKykKLSAgICBpZiAoYnVmW2ldKQotICAgICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZGV2emVybz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZGV2emVybz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZGV2emVybyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZGV2emVybyA9IHllczsgdGhlbgotICBzaW1fZGV2emVybz0iLURIQVZFX0RFVlpFUk8iCi1lbHNlCi0gIHNpbV9kZXZ6ZXJvPSIiCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgY29tbW9uIHNpbXVsYXRvciBkaXJlY3RvcnkiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NTY6IGNoZWNraW5nIGZvciBjb21tb24gc2ltdWxhdG9yIGRpcmVjdG9yeSIgPiY1Ci1pZiB0ZXN0IC1mICIke3NyY2Rpcn0vLi4vY29tbW9uL2NhbGxiYWNrLmMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgc2ltX2NhbGxiYWNrPSJjYWxsYmFjay5vIHRhcmctbWFwLm8iCi0gIHNpbV90YXJnX3ZhbHM9InRhcmctdmFscy5oIHRhcmctbWFwLmMgdGFyZy12YWxzLmRlZiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIHNpbV9jYWxsYmFjaz0iIgotICBzaW1fdGFyZ192YWxzPSIiCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjY4OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzAxOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzEzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MzI6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLQotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc3MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ0AlJENDJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBMSUJPQkpTQCUkTElCT0JKUyVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fd2FybmluZ3NAJSRzaW1fd2FybmluZ3MlZwotcyVAc2ltX2xpbmVfbnJAJSRzaW1fbGluZV9uciVnCi1zJUBzaW1fY29uZmlnQCUkc2ltX2NvbmZpZyVnCi1zJUBzaW1fb3Bjb2RlQCUkc2ltX29wY29kZSVnCi1zJUBzaW1fc3dpdGNoQCUkc2ltX3N3aXRjaCVnCi1zJUBzaW1fZHVwQCUkc2ltX2R1cCVnCi1zJUBzaW1fZGVjb2RlX21lY2hhbmlzbUAlJHNpbV9kZWNvZGVfbWVjaGFuaXNtJWcKLXMlQHNpbV9qdW1wQCUkc2ltX2p1bXAlZwotcyVAc2ltX2ZpbHRlckAlJHNpbV9maWx0ZXIlZwotcyVAc2ltX2ljYWNoZUAlJHNpbV9pY2FjaGUlZwotcyVAc2ltX2h3X3NyY0AlJHNpbV9od19zcmMlZwotcyVAc2ltX2h3X29iakAlJHNpbV9od19vYmolZwotcyVAc2ltX3BrX3NyY0AlJHNpbV9wa19zcmMlZwotcyVAc2ltX3BrX29iakAlJHNpbV9wa19vYmolZwotcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKLXMlQHNpbV9pZ2VuX3NtcEAlJHNpbV9pZ2VuX3NtcCVnCi1zJUBzaW1faG9zdGJpdHNpemVAJSRzaW1faG9zdGJpdHNpemUlZwotcyVAc2ltX2VudkAlJHNpbV9lbnYlZwotcyVAc2ltX3RpbWViYXNlQCUkc2ltX3RpbWViYXNlJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcmVzZXJ2ZWRAJSRzaW1fcmVzZXJ2ZWQlZwotcyVAc2ltX21vbml0b3JAJSRzaW1fbW9uaXRvciVnCi1zJUBzaW1fbW9kZWxAJSRzaW1fbW9kZWwlZwotcyVAc2ltX21vZGVsX2lzc3VlQCUkc2ltX21vZGVsX2lzc3VlJWcKLXMlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCi1zJUBzaW1fdGVybWlvQCUkc2ltX3Rlcm1pbyVnCi1zJUBzaW1fZGV2emVyb0AlJHNpbV9kZXZ6ZXJvJWcKLXMlQHNpbV9jYWxsYmFja0AlJHNpbV9jYWxsYmFjayVnCi1zJUBzaW1fdGFyZ192YWxzQCUkc2ltX3RhcmdfdmFscyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1jYXNlIHgkQ09ORklHX0hFQURFUlMgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvY29uZmlndXJlLmluIGIvc2ltL3BwYy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOGYxMzYuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfQ0MKLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotZG5sIFdlIGRvbid0IHVzZSBnZXR0ZXh0LCBidXQgYmZkIGRvZXMuICBTbyB3ZSBkbyB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzCi1kbmwgdG8gc2VlIGlmIHRoZXJlIGFyZSBpbnRsIGxpYnJhcmllcyB3ZSBzaG91bGQgbGluayBhZ2FpbnN0LgotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLWFsaWdubWVudCwKLVsgIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQ9YWxpZ24JCVNwZWNpZnkgc3RyaWN0IG9yIG5vbnN0cmljdCBhbGlnbm1lbnQuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8IHN0cmljdCB8IFNUUklDVCkJc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vIHwgbm9uc3RyaWN0IHwgTk9OU1RSSUNUKQlzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPU5PTlNUUklDVF9BTElHTk1FTlQiOzsKLSAgMCB8IGRlZmF1bHQgfCBERUZBVUxUKQlzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiOzsKLSAgKikJCQkJQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiKTsgc2ltX2FsaWdubWVudD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKLWZpXSxbc2ltX2FsaWdubWVudD0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tYXNzZXJ0LAotWyAgLS1lbmFibGUtc2ltLWFzc2VydAkJCVNwZWNpZnkgd2hldGhlciB0byBwZXJmb3JtIHJhbmRvbSBhc3NlcnRpb25zLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9hc3NlcnQ9Ii1EV0lUSF9BU1NFUlQ9MSI7OwotICBubykJc2ltX2Fzc2VydD0iLURXSVRIX0FTU0VSVD0wIjs7Ci0gICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWFzc2VydCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX2Fzc2VydD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Fzc2VydCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYXNzZXJ0IGZsYWdzID0gJHNpbV9hc3NlcnQiIDY+JjEKLWZpXSxbc2ltX2Fzc2VydD0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tYml0c2l6ZSwKLVsgIC0tZW5hYmxlLXNpbS1iaXRzaXplPW4JCVNwZWNpZnkgdGFyZ2V0IGJpdHNpemUgKDMyIG9yIDY0KS5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgMzJ8NjQpIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0kZW5hYmxldmFsIjs7Ci0gICopCSBBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiKTsgc2ltX2JpdHNpemU9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCi1maV0sW3NpbV9iaXRzaXplPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1ic3dhcCwKLVsgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSB0aGUgQlNXQVAgaW5zdHJ1Y3Rpb24gb24gSW50ZWwgNDg2cyBhbmQgUGVudGl1bXMuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX2Jzd2FwPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQotZmldLFtzaW1fYnN3YXA9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLWNmbGFncywKLVsgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIG5vKQlzaW1fY2ZsYWdzPSIiOzsKLSAgKikJc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpXSxbc2ltX2NmbGFncz0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tY29uZmlnLAotWyAgLS1lbmFibGUtc2ltLWNvbmZpZz1maWxlCQlPdmVycmlkZSBkZWZhdWx0IGNvbmZpZyBmaWxlXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJQUNfTVNHX0VSUk9SKCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWNvbmZpZz1maWxlIik7OwotICAqKQkJaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyR7ZW5hYmxldmFsfSI7IHRoZW4KLQkJICBzaW1fY29uZmlnPSIke2VuYWJsZXZhbH0iOwotCQllbGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8ke2VuYWJsZXZhbH0tY29uZmlnLmgiOyB0aGVuCi0JCSAgc2ltX2NvbmZpZz0iJHtlbmFibGV2YWx9LWNvbmZpZy5oIgotCQllbHNlCi0JCSAgQUNfTVNHX0VSUk9SKCJDb25maWcgZmlsZSAkZW5hYmxldmFsIHdhcyBub3QgZm91bmQiKTsKLQkJICBzaW1fY29uZmlnPXN0ZC1jb25maWcuaAotCQlmaTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NvbmZpZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgY29uZmlnIGZsYWdzID0gJHNpbV9jb25maWciIDY+JjEKLWZpXSxbc2ltX2NvbmZpZz0ic3RkLWNvbmZpZy5oIgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGNvbmZpZyBmbGFncyA9ICRzaW1fY29uZmlnIiA2PiYxCi1maV0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tZGVjb2RlLW1lY2hhbmlzbSwKLVsgIC0tZW5hYmxlLXNpbS1kZWNvZGUtbWVjaGFuaXNtPXdoaWNoCQlTcGVjaWZ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgbWVjaGFuaXNtLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXN8bm8pCUFDX01TR19FUlJPUigiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1kZWNvZGUtbWVjaGFuaXNtPWZpbGUiKTs7Ci0gIGFycmF5fHN3aXRjaHxwYWRkZWQtc3dpdGNofGdvdG8tc3dpdGNoKQlzaW1fZGVjb2RlX21lY2hhbmlzbT0iLVQgJHtlbmFibGV2YWx9Ijs7Ci0gICopCQlBQ19NU0dfRVJST1IoIkZpbGUgJGVuYWJsZXZhbCBpcyBub3QgYW4gb3Bjb2RlIHJ1bGVzIGZpbGUiKTsKLQkJc2ltX2RlY29kZV9tZWNoYW5pc209InN3aXRjaCI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWNvZGVfbWVjaGFuaXNtIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBkZWNvZGUgbWVjaGFuaXNtIGZsYWdzID0gJHNpbV9kZWNvZGVfbWVjaGFuaXNtIiA2PiYxCi1maV0sW3NpbV9kZWNvZGVfbWVjaGFuaXNtPSIiCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZGVjb2RlIG1lY2hhbmlzbSBmbGFncyA9ICRzaW1fZGVjb2RlX21lY2hhbmlzbSIKLWZpXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1kZWZhdWx0LW1vZGVsLAotWyAgLS1lbmFibGUtc2ltLWRlZmF1bHQtbW9kZWw9d2hpY2gJU3BlY2lmeSBkZWZhdWx0IFBvd2VyUEMgdG8gbW9kZWwuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJQUNfTVNHX0VSUk9SKCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWRlZmF1bHQtbW9kZWw9bW9kZWwiKTs7Ci0gICopCQlzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9JHtlbmFibGV2YWx9Ijs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlZmF1bHRfbW9kZWwiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGRlZmF1bHQtbW9kZWwgZmxhZ3MgPSAkc2ltX2RlZmF1bHRfbW9kZWwiIDY+JjEKLWZpXSxbc2ltX2RlZmF1bHRfbW9kZWw9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLWR1cGxpY2F0ZSwKLVsgIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUJCUV4cGFuZCAoZHVwbGljYXRlKSBzZW1hbnRpYyBmdW5jdGlvbnMuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2R1cD0iLUUiOzsKLSAgbm8pCXNpbV9kdXA9IiI7OwotICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9kdXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kdXAiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGR1cGxpY2F0ZSBmbGFncyA9ICRzaW1fZHVwIiA2PiYxCi1maV0sW3NpbV9kdXA9Ii1FIgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGR1cGxpY2F0ZSBmbGFncyA9ICRzaW1fZHVwIiA2PiYxCi1maV0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tZW5kaWFuLAotWyAgLS1lbmFibGUtc2ltLWVuZGlhbj1lbmRpYW4JCVNwZWNpZnkgdGFyZ2V0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCWNhc2UgIiR0YXJnZXQiIGluCi0JICAqcG93ZXJwYy0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OwotCSAgKnBvd2VycGNsZS0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotCSAgKikgZWNobyAiVW5rbm93biB0YXJnZXQgJHRhcmdldCIgMT4mNjsgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiOzsKLQllc2FjOzsKLSAgbm8pCSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCI7OwotICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKLSAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIpOyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmldLFtzaW1fZW5kaWFuPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1lbnYsCi1bICAtLWVuYWJsZS1zaW0tZW52PWVudgkJCVNwZWNpZnkgdGFyZ2V0IGVudmlyb25tZW50IChvcGVyYXRpbmcsIHZpcnR1YWwsIHVzZXIpLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBvcGVyYXRpbmcgfCBvcyB8IG9lYSkJc2ltX2Vudj0iLURXSVRIX0VOVklST05NRU5UPU9QRVJBVElOR19FTlZJUk9OTUVOVCI7OwotICB2aXJ0dWFsIHwgdmVhKQlzaW1fZW52PSItRFdJVEhfRU5WSVJPTk1FTlQ9VklSVFVBTF9FTlZJUk9OTUVOVCI7OwotICB1c2VyIHwgdWVhKQkJc2ltX2Vudj0iLURXSVRIX0VOVklST05NRU5UPVVTRVJfRU5WSVJPTk1FTlQiOzsKLSAgbm8pCQkJc2ltX2Vudj0iLURXSVRIX0VOVklST05NRU5UPTAiOzsKLSAgKikJCQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWVudiIpOyBzaW1fZW52PSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW52IiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbnYgZmxhZ3MgPSAkc2ltX2VudiIgNj4mMQotZmldLFtzaW1fZW52PSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1maWx0ZXIsCi1bICAtLWVuYWJsZS1zaW0tZmlsdGVyPXJ1bGUJCVNwZWNpZnkgZmlsdGVyIHJ1bGVzLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWZpbHRlciBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgcnVsZSB0byBmaWx0ZXIgb3Igbm8iKTsgc2ltX2ZpbHRlcj0iIjs7Ci0gIG5vKQlzaW1fZmlsdGVyPSIiOzsKLSAgKikJc2ltX2ZpbHRlcj0iLUYgJGVuYWJsZXZhbCI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9maWx0ZXIiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGZpbHRlciBmbGFncyA9ICRzaW1fZmlsdGVyIiA2PiYxCi1maV0sW3NpbV9maWx0ZXI9Ii1GIDMyLGYsbyIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBmaWx0ZXIgZmxhZ3MgPSAkc2ltX2ZpbHRlciIgNj4mMQotZmldKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLWZsb2F0LAotWyAgLS1lbmFibGUtc2ltLWZsb2F0CQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBob3N0IGZsb2F0aW5nIHBvaW50IG9yIHNpbXVsYXRlLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCBoYXJkKQlzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1IQVJEX0ZMT0FUSU5HX1BPSU5UIjs7Ci0gIG5vIHwgc29mdCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9U09GVF9GTE9BVElOR19QT0lOVCI7OwotICAqKQkJQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1mbG9hdCIpOyBzaW1fZmxvYXQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9mbG9hdCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgZmxvYXQgZmxhZ3MgPSAkc2ltX2Zsb2F0IiA2PiYxCi1maV0sW3NpbV9mbG9hdD0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0taGFyZHdhcmUsCi1bICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9bGlzdAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLl0sCi1baGFyZHdhcmU9ImNwdSxtZW1vcnksbnZyYW0saW9idXMsaHRhYixkaXNrLHRyYWNlLHJlZ2lzdGVyLHZtLGluaXQsY29yZSxwYWwsY29tLGVlcHJvbSxvcGljLGdsdWUscGhiLGlkZSIKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJQUNfTVNHX0VSUk9SKCJMaXN0IG9mIGhhcmR3YXJlIG11c3QgYmUgc3BlY2lmaWVkIGZvciAtLWVuYWJsZS1zaW0taGFyZHdhcmUiKTsgaGFyZHdhcmU9IiI7OwotICAsKikgICBoYXJkd2FyZT0iJHtoYXJkd2FyZX0ke2VuYWJsZXZhbH0iOzsKLSAgKiwpICAgaGFyZHdhcmU9IiR7ZW5hYmxldmFsfSR7aGFyZHdhcmV9Ijs7Ci0gICopCWhhcmR3YXJlPSIke2VuYWJsZXZhbH0iJyc7OwotZXNhYwotc2ltX2h3X3NyYz1gZWNobyAkaGFyZHdhcmUgfCBzZWQgLWUgJ3MvLC8uYyBod18vZycgLWUgJ3MvXi9od18vJyAtZSBzJy8kLy5jLydgCi1zaW1faHdfb2JqPWBlY2hvICRzaW1faHdfc3JjIHwgc2VkIC1lICdzL1wuYy8uby9nJ2AKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRoYXJkd2FyZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19zcmMsICRzaW1faHdfb2JqIgotZmldLFtoYXJkd2FyZT0iY3B1LG1lbW9yeSxudnJhbSxpb2J1cyxodGFiLGRpc2ssdHJhY2UscmVnaXN0ZXIsdm0saW5pdCxjb3JlLHBhbCxjb20sZWVwcm9tLG9waWMsZ2x1ZSxwaGIsaWRlIgotc2ltX2h3X3NyYz1gZWNobyAkaGFyZHdhcmUgfCBzZWQgLWUgJ3MvLC8uYyBod18vZycgLWUgJ3MvXi9od18vJyAtZSBzJy8kLy5jLydgCi1zaW1faHdfb2JqPWBlY2hvICRzaW1faHdfc3JjIHwgc2VkIC1lICdzL1wuYy8uby9nJ2AKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X3NyYywgJHNpbV9od19vYmoiCi1maV0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0taG9zdGJpdHNpemUsCi1bICAtLWVuYWJsZS1zaW0taG9zdGJpdHNpemU9MzJ8NjQJU3BlY2lmeSBob3N0IGJpdHNpemUgKDMyIG9yIDY0KS5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgMzJ8NjQpIHNpbV9ob3N0Yml0c2l6ZT0iLURXSVRIX0hPU1RfV09SRF9CSVRTSVpFPSRlbmFibGV2YWwiOzsKLSAgKikJIEFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWhvc3RiaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiKTsgc2ltX2hvc3RiaXRzaXplPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGJpdHNpemUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RiaXRzaXplIGZsYWdzID0gJHNpbV9ob3N0Yml0c2l6ZSIgNj4mMQotZmldLFtzaW1faG9zdGJpdHNpemU9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLWhvc3RlbmRpYW4sCi1bICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iKTsgc2ltX2hvc3RlbmRpYW49IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCi1maV0sWwotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQUNfQ19CSUdFTkRJQU4KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1pY2FjaGUsCi1bICAtLWVuYWJsZS1zaW0taWNhY2hlPXNpemUJCVNwZWNpZnkgaW5zdHJ1Y3Rpb24tZGVjb2RlIGNhY2hlIHNpemUgYW5kIHR5cGUuXSwKLVtpY2FjaGU9Ii1SIgotIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkJaWNhY2hlPSIxMDI0Ijsgc2ltX2ljYWNoZT0iLUkgJGljYWNoZSI7OwotICBubykJCXNpbV9pY2FjaGU9Ii1SIjs7Ci0gICopIGljYWNoZT0xMDI0Ci0gICAgIHNpbV9pY2FjaGU9Ii0iCi0gICAgIGZvciB4IGluIGBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0gICAgICAgY2FzZSAiJHgiIGluCi0gICAgICAgICBkZWZpbmUpCXNpbV9pY2FjaGU9IiR7c2ltX2ljYWNoZX1SIjs7Ci0gICAgICAgICBzZW1hbnRpYykJc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfUMiOzsKLQkgaW5zbikJCXNpbV9pY2FjaGU9IiR7c2ltX2ljYWNoZX1TIjs7Ci0JIDAqfDEqfDIqfDMqfDQqfDUqfDYqfDcqfDgqfDkqKQlpY2FjaGU9JHg7OwotICAgICAgICAgKikJCUFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkeCBmb3IgLS1lbmFibGUtc2ltLWljYWNoZSIpOyBzaW1faWNhY2hlPSIiOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfUkgJGljYWNoZSI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGljYWNoZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgc2l6ZSB0byAkaWNhY2hlICgkc2ltX2ljYWNoZSkiCi1maV0sW3NpbV9pY2FjaGU9Ii1DU1JJIDEwMjQiCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgc2l6ZSB0byAxMDI0ICgkc2ltX2ljYWNoZSkiCi1maV0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0taW5saW5lLAotWyAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC5dLAotW3NpbV9pbmxpbmU9IiIKLWNhc2UgIiRlbmFibGV2YWwiIGluCi0gIG5vKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7Ci0gIDApCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKLSAgeWVzIHwgMikJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1BTExfSU5MSU5FIjs7Ci0gIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKLSAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0gICAgICAgbmV3X2ZsYWc9IiIKLSAgICAgICBjYXNlICIkeCIgaW4KLQkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKLQkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7Ci0JICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfSU5MSU5FIjs7Ci0JICopCQluZXdfZmxhZz0iLUQkeCIiX0lOTElORT1BTExfSU5MSU5FIjs7Ci0gICAgICAgZXNhYwotICAgICAgIGlmIHRlc3QgeCIkc2ltX2lubGluZSIgPSB4IiI7IHRoZW4KLQkgc2ltX2lubGluZT0iJG5ld19mbGFnIgotICAgICAgIGVsc2UKLQkgc2ltX2lubGluZT0iJHNpbV9pbmxpbmUgJG5ld19mbGFnIgotICAgICAgIGZpCi0gICAgIGRvbmU7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9pbmxpbmUiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCi1maV0sW2lmIHRlc3QgeCIkR0NDIiAhPSAiIjsgdGhlbgotICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiCi0gIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCi0gIGZpCi1lbHNlCi0gIHNpbV9pbmxpbmU9IiIKLWZpXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1qdW1wLAotWyAgLS1lbmFibGUtc2ltLWp1bXAJCUp1bXAgYmV0d2VlbiBzZW1hbnRpYyBjb2RlIChpbnN0ZWFkIG9mIGNhbGwvcmV0dXJuKS5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fanVtcD0iLUoiOzsKLSAgbm8pCXNpbV9qdW1wPSIiOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tanVtcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX2p1bXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9qdW1wIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBqdW1wIGZsYWcgPSAkc2ltX2p1bXAiIDY+JjEKLWZpXSxbc2ltX2p1bXA9IiIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBqdW1wIGZsYWcgPSAkc2ltX2p1bXAiIDY+JjEKLWZpXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1saW5lLW5yLAotWyAgLS1lbmFibGUtc2ltLWxpbmUtbnI9b3B0cwkJR2VuZXJhdGUgZXh0cmEgQ1BQIGNvZGUgdGhhdCByZWZlcmVuY2VzIHNvdXJjZSByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgY29kZV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9saW5lX25yPSIiOzsKLSAgbm8pCXNpbV9saW5lX25yPSItTCI7OwotICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1saW5lLW5yIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fbGluZV9ucj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2xpbmVfbnIiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkc2ltX2xpbmVfbnIiIDY+JjEKLWZpXSxbc2ltX2xpbmVfbnI9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLW1vZGVsLAotWyAgLS1lbmFibGUtc2ltLW1vZGVsPXdoaWNoCQlTcGVjaWZ5IFBvd2VyUEMgdG8gbW9kZWwuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJQUNfTVNHX0VSUk9SKCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLW1vZGVsPW1vZGVsIik7OwotICAqKQkJc2ltX21vZGVsPSItRFdJVEhfTU9ERUw9JHtlbmFibGV2YWx9Ijs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX21vZGVsIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtb2RlbCBmbGFncyA9ICRzaW1fbW9kZWwiIDY+JjEKLWZpXSxbc2ltX21vZGVsPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1tb2RlbC1pc3N1ZSwKLVsgIC0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZQkJU3BlY2lmeSB3aGV0aGVyIHRvIHNpbXVsYXRlIG1vZGVsIHNwZWNpZmljIGFjdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fbW9kZWxfaXNzdWU9Ii1EV0lUSF9NT0RFTF9JU1NVRT1NT0RFTF9JU1NVRV9QUk9DRVNTIjs7Ci0gIG5vKQlzaW1fbW9kZWxfaXNzdWU9Ii1EV0lUSF9NT0RFTF9JU1NVRT1NT0RFTF9JU1NVRV9JR05PUkUiOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9tb2RlbF9pc3N1ZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgbW9kZWwtaXNzdWUgZmxhZ3MgPSAkc2ltX21vZGVsX2lzc3VlIiA2PiYxCi1maV0sW3NpbV9tb2RlbF9pc3N1ZT0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tbW9uaXRvciwKLVsgIC0tZW5hYmxlLXNpbS1tb25pdG9yPW1vbgkJU3BlY2lmeSB3aGV0aGVyIHRvIGVuYWJsZSBtb25pdG9yaW5nIGV2ZW50cy5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049J01PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUgfCBNT05JVE9SX0xPQURfU1RPUkVfVU5JVCciOzsKLSAgbm8pCQlzaW1fbW9uaXRvcj0iLURXSVRIX01PTj0wIjs7Ci0gIGluc3RydWN0aW9uKQlzaW1fbW9uaXRvcj0iLURXSVRIX01PTj1NT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFIjs7Ci0gIG1lbW9yeSkJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049TU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQiOzsKLSAgKikJCUFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tbW9uIik7IHNpbV9lbnY9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9tb25pdG9yIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtb25pdG9yIGZsYWdzID0gJHNpbV9tb25pdG9yIiA2PiYxCi1maV0sW3NpbV9tb25pdG9yPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1vcGNvZGUsCi1bICAtLWVuYWJsZS1zaW0tb3Bjb2RlPXdoaWNoCQlPdmVycmlkZSBkZWZhdWx0IG9wY29kZSBsb29rdXAuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllc3xubykJQUNfTVNHX0VSUk9SKCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLW9wY29kZT1maWxlIik7OwotICAqKQkJaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyR7ZW5hYmxldmFsfSI7IHRoZW4KLQkJICBzaW1fb3Bjb2RlPSIke2VuYWJsZXZhbH0iCi0JCWVsaWYgdGVzdCAtZiAiJHtzcmNkaXJ9L2RjLSR7ZW5hYmxldmFsfSI7IHRoZW4KLQkJICBzaW1fb3Bjb2RlPSJkYy0ke2VuYWJsZXZhbH0iCi0JCWVsc2UKLQkJICBBQ19NU0dfRVJST1IoIkZpbGUgJGVuYWJsZXZhbCBpcyBub3QgYW4gb3Bjb2RlIHJ1bGVzIGZpbGUiKTsKLQkJICBzaW1fb3Bjb2RlPSJkYy1jb21wbGV4IgotCQlmaTs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX29wY29kZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgb3Bjb2RlIGZsYWdzID0gJHNpbV9vcGNvZGUiIDY+JjEKLWZpXSxbc2ltX29wY29kZT0iZGMtY29tcGxleCIKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBvcGNvZGUgZmxhZ3MgPSAkc2ltX29wY29kZSIKLWZpXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1wYWNrYWdlcywKLVsgIC0tZW5hYmxlLXNpbS1wYWNrYWdlcz1saXN0CQlTcGVjaWZ5IHRoZSBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXSwKLVtwYWNrYWdlcz1kaXNrbGFiZWwKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJQUNfTVNHX0VSUk9SKCJMaXN0IG9mIHBhY2thZ2VzIG11c3QgYmUgc3BlY2lmaWVkIGZvciAtLWVuYWJsZS1zaW0tcGFja2FnZXMiKTsgcGFja2FnZXM9IiI7OwotICAsKikgICBwYWNrYWdlcz0iJHtwYWNrYWdlc30ke2VuYWJsZXZhbH0iOzsKLSAgKiwpICAgcGFja2FnZXM9IiR7ZW5hYmxldmFsfSR7cGFja2FnZXN9Ijs7Ci0gICopCXBhY2thZ2VzPSIke2VuYWJsZXZhbH0iJyc7OwotZXNhYwotc2ltX3BrX3NyYz1gZWNobyAkcGFja2FnZXMgfCBzZWQgLWUgJ3MvLC8uYyBwa18vZycgLWUgJ3MvXi9wa18vJyAtZSAncy8kLy5jLydgCi1zaW1fcGtfb2JqPWBlY2hvICRzaW1fcGtfc3JjIHwgc2VkIC1lICdzL1wuYy8uby9nJ2AKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRwYWNrYWdlcyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcGFja2FnZXMgdG8gJHNpbV9wa19zcmMsICRzaW1fcGtfb2JqIgotZmldLFtwYWNrYWdlcz1kaXNrbGFiZWwKLXNpbV9wa19zcmM9YGVjaG8gJHBhY2thZ2VzIHwgc2VkIC1lICdzLywvLmMgcGtfL2cnIC1lICdzL14vcGtfLycgLWUgJ3MvJC8uYy8nYAotc2ltX3BrX29iaj1gZWNobyAkc2ltX3BrX3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcGFja2FnZXMgdG8gJHNpbV9wa19zcmMsICRzaW1fcGtfb2JqIgotZmldKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXJlZ3Bhcm0sCi1bICAtLWVuYWJsZS1zaW0tcmVncGFybT1uci1wYXJtCQlQYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb24gdGhlIHN0YWNrIC0geDg2L0dDQyBzcGVjaWZpYy5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgMCp8MSp8Mip8Myp8NCp8NSp8Nip8Nyp8OCp8OSopIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0ke2VuYWJsZXZhbH0iOzsKLSAgbm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSIiIDs7Ci0gIHllcykgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fcmVncGFybT0iLURXSVRIX1JFR1BBUk09MyI7OwotICAqKSAgIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tcmVncGFybSIpOyBzaW1fcmVncGFybT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3JlZ3Bhcm0iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHJlZ3Bhcm0gZmxhZ3MgPSAkc2ltX3JlZ3Bhcm0iIDY+JjEKLWZpXSxbc2ltX3JlZ3Bhcm09IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXJlc2VydmVkLWJpdHMsCi1bICAtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cwkJU3BlY2lmeSB3aGV0aGVyIHRvIGNoZWNrIHJlc2VydmVkIGJpdHMgaW4gaW5zdHJ1Y3Rpb24uXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Jlc2VydmVkPSItRFdJVEhfUkVTRVJWRURfQklUUz0xIjs7Ci0gIG5vKQlzaW1fcmVzZXJ2ZWQ9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTAiOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX3Jlc2VydmVkPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVzZXJ2ZWQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHJlc2VydmVkIGZsYWdzID0gJHNpbV9yZXNlcnZlZCIgNj4mMQotZmldLFtzaW1fcmVzZXJ2ZWQ9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXNtcCwKLVsgIC0tZW5hYmxlLXNpbS1zbXA9bgkJCVNwZWNpZnkgbnVtYmVyIG9mIHByb2Nlc3NvcnMgdG8gY29uZmlndXJlIGZvci5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fc21wPSItRFdJVEhfU01QPTUiIDsgc2ltX2lnZW5fc21wPSItTiA1Ijs7Ci0gIG5vKQlzaW1fc21wPSItRFdJVEhfU01QPTAiIDsgc2ltX2lnZW5fc21wPSItTiAwIjs7Ci0gICopCXNpbV9zbXA9Ii1EV0lUSF9TTVA9JGVuYWJsZXZhbCIgOyBzaW1faWdlbl9zbXA9Ii1OICRlbmFibGV2YWwiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc21wIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzbXAgZmxhZ3MgPSAkc2ltX3NtcCIgNj4mMQotZmldLFtzaW1fc21wPSItRFdJVEhfU01QPTUiIDsgc2ltX2lnZW5fc21wPSItTiA1IgotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNtcCBmbGFncyA9ICRzaW1fc21wIiA2PiYxCi1maV0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0tc3RkY2FsbCwKLVsgIC0tZW5hYmxlLXNpbS1zdGRjYWxsPXR5cGUJCVVzZSBhbiBhbHRlcm5hdGl2ZSBmdW5jdGlvbiBjYWxsL3JldHVybiBtZWNoYW5pc20gLSB4ODYvR0NDIHNwZWNpZmljLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICBubykJCXNpbV9zdGRjYWxsPSIiIDs7Ci0gIHN0ZCopCQlzaW1fc3RkY2FsbD0iLURXSVRIX1NURENBTEw9MSI7OwotICB5ZXMpCQlzaW1fc3RkY2FsbD0iLURXSVRIX1NURENBTEw9MSI7OwotICAqKSAgIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tc3RkY2FsbCIpOyBzaW1fc3RkY2FsbD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGNhbGwiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGZ1bmN0aW9uIGNhbGwgZmxhZ3MgPSAkc2ltX3N0ZGNhbGwiIDY+JjEKLWZpXSxbc2ltX3N0ZGNhbGw9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXN0ZGlvLAotWyAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIik7IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpXSxbc2ltX3N0ZGlvPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS1zd2l0Y2gsCi1bICAtLWVuYWJsZS1zaW0tc3dpdGNoCQkJVXNlIGEgc3dpdGNoIGluc3RlYWQgb2YgYSB0YWJsZSBmb3IgaW5zdHJ1Y3Rpb24gY2FsbC5dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fc3dpdGNoPSItcyI7OwotICBubykJc2ltX3N3aXRjaD0iIjs7Ci0gICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLXN3aXRjaCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX3N3aXRjaD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N3aXRjaCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc3dpdGNoIGZsYWdzID0gJHNpbV9zd2l0Y2giIDY+JjEKLWZpXSxbc2ltX3N3aXRjaD0iIjsKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzd2l0Y2ggZmxhZ3MgPSAkc2ltX3N3aXRjaCIgNj4mMQotZmldKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXRpbWViYXNlLAotWyAgLS1lbmFibGUtc2ltLXRpbWViYXNlCQkJU3BlY2lmeSB3aGV0aGVyIHRoZSBQUEMgdGltZWJhc2UgaXMgc3VwcG9ydGVkLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90aW1lYmFzZT0iLURXSVRIX1RJTUVfQkFTRT0xIjs7Ci0gIG5vKQlzaW1fdGltZWJhc2U9Ii1EV0lUSF9USU1FX0JBU0U9MCI7OwotICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS10aW1lYmFzZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX3RpbWViYXNlPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdGltZWJhc2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHRpbWViYXNlIGZsYWdzID0gJHNpbV90aW1lYmFzZSIgNj4mMQotZmldLFtzaW1fdGltZWJhc2U9IiJdKWRubAotCi0KLUFDX0FSR19FTkFCTEUoc2ltLXRyYWNlLAotWyAgLS1lbmFibGUtc2ltLXRyYWNlCQkJU3BlY2lmeSB3aGV0aGVyIHRyYWNpbmcgaXMgc3VwcG9ydGVkLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTEiOzsKLSAgbm8pCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTAiOzsKLSAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tdHJhY2UgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV90cmFjZT0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB0cmFjZSBmbGFncyA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpXSxbc2ltX3RyYWNlPSIiXSlkbmwKLQotCi1BQ19BUkdfRU5BQkxFKHNpbS13YXJuaW5ncywKLVsgIC0tZW5hYmxlLXNpbS13YXJuaW5ncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHR1cm5pbmcgb24gY29tcGlsZXIgd2FybmluZ3MgZXhjZXB0IGZvciBpZGVjb2RlLm8sIHNlbWFudGljcy5vIGFuZCBwc2ltLm9dLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlzaW1fd2FybmluZ3M9Ii1XZXJyb3IgLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgIjs7Ci0gIG5vKQlzaW1fd2FybmluZ3M9Ii13Ijs7Ci0gICopCXNpbV93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fd2FybmluZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkc2ltX3dhcm5pbmdzIiA2PiYxCi1maV0sW3NpbV93YXJuaW5ncz0iIl0pZG5sCi0KLQotQUNfQVJHX0VOQUJMRShzaW0teG9yLWVuZGlhbiwKLVsgIC0tZW5hYmxlLXNpbS14b3ItZW5kaWFuPW4JCVNwZWNpZnkgbnVtYmVyIGJ5dGVzIGludm9sdmVkIGluIFBvd2VyUEMgWE9SIGJpLWVuZGlhbiBtb2RlIChkZWZhdWx0IDgpLl0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj04Ijs7Ci0gIG5vKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49MCI7OwotICAqKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49JGVuYWJsZXZhbCI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV94b3JfZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB4b3ItZW5kaWFuIGZsYWcgPSAkc2ltX3hvcl9lbmRpYW4iIDY+JjEKLWZpXSxbc2ltX3hvcl9lbmRpYW49IiJdKWRubAotCi0KLUFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4pCi1BQ19DQU5PTklDQUxfU1lTVEVNCi1BQ19BUkdfUFJPR1JBTQotCi0uICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLUFDX1NUUlVDVF9TVF9CTEtTSVpFCi1BQ19TVFJVQ1RfU1RfQkxPQ0tTCi1BQ19TVFJVQ1RfU1RfUkRFVgotQUNfU1RSVUNUX1RJTUVaT05FCi0KLUFDX1RZUEVfR0VUR1JPVVBTCi1BQ19UWVBFX01PREVfVAotQUNfVFlQRV9PRkZfVAotQUNfVFlQRV9QSURfVAotQUNfVFlQRV9TSUdOQUwKLUFDX1RZUEVfU0laRV9UCi1BQ19UWVBFX1VJRF9UCi0KLUFDX0NIRUNLX0ZVTkNTKGFjY2VzcyBjZmdldGlzcGVlZCBjZmdldG9zcGVlZCBjZnNldGlzcGVlZCBjZnNldG9zcGVlZCBjaGRpciBjaG1vZCBjaG93biBkdXAgZHVwMiBmY2htb2QgZmNob3duIGZjbnRsIGZzdGF0IGZzdGF0ZnMgZ2V0ZGlyZW50cmllcyBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHBpZCBnZXRwcGlkIGdldHJ1c2FnZSBnZXR0aW1lb2ZkYXkgZ2V0dWlkIGlvY3RsIGtpbGwgbGluayBsc2VlayBsc3RhdCBta2RpciBwaXBlIHJlYWRsaW5rIHJtZGlyIHNldHJldWlkIHNldHJlZ2lkIHN0YXQgc2lncHJvY21hc2sgc3RhdCBzeW1saW5rIHRjZ2V0YXR0ciB0Y3NldGF0dHIgdGNzZW5kYnJlYWsgdGNkcmFpbiB0Y2ZsdXNoIHRjZmxvdyB0Y2dldHBncnAgdGNzZXRwZ3JwIHRpbWUgdW1hc2sgdW5saW5rKQotCi1BQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHN5cy9pb2N0bC5oIHN5cy9wYXJhbS5oIHN5cy9yZXNvdXJjZS5oIHN5cy9zdGF0Lmggc3lzL3Rlcm1pby5oIHN5cy90ZXJtaW9zLmggc3lzL3RpbWUuaCBzeXMvdGltZXMuaCBzeXMvdHlwZXMuaCB0aW1lLmggdW5pc3RkLmgpCi1BQ19IRUFERVJfRElSRU5UCi0KLWRubCBGaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiB0ZXJtaW8vdGVybWlvcyBzdXBwb3J0IHRoZXJlIGlzCi1zaW1fdGVybWlvPSIiCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHN0cnVjdCB0ZXJtaW9zKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3Rlcm1pb3Nfc3RydWN0LAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Rlcm1pb3MuaD5dLAotW3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyB4OwotIHguY19pZmxhZyA9IDA7Ci0geC5jX29mbGFnID0gMDsKLSB4LmNfY2ZsYWcgPSAwOwotIHguY19sZmxhZyA9IDA7Ci0geC5jX2NjW05DQ1NdID0gMDtdLAotYWNfY3ZfdGVybWlvc19zdHJ1Y3Q9eWVzLCBhY19jdl90ZXJtaW9zX3N0cnVjdD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdGVybWlvc19zdHJ1Y3QpCi1pZiB0ZXN0ICRhY19jdl90ZXJtaW9zX3N0cnVjdCA9IHllczsgdGhlbgotICBzaW1fdGVybWlvPSIkc2ltX3Rlcm1pbyAtREhBVkVfVEVSTUlPU19TVFJVQ1RVUkUiCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfdGVybWlvc19zdHJ1Y3QiID0gInllcyI7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKGZvciBjX2xpbmUgZmllbGQgaW4gc3RydWN0IHRlcm1pb3MpCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl90ZXJtaW9zX2NsaW5lLAotICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGVybWlvcy5oPl0sCi1bc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHg7IHguY19saW5lID0gMDtdLAotICBhY19jdl90ZXJtaW9zX2NsaW5lPXllcywgYWNfY3ZfdGVybWlvc19jbGluZT1ubyldKQotCi0gIEFDX01TR19SRVNVTFQoJGFjX2N2X3Rlcm1pb3NfY2xpbmUpCi0gIGlmIHRlc3QgJGFjX2N2X3Rlcm1pb3NfY2xpbmUgPSB5ZXM7IHRoZW4KLSAgICBzaW1fdGVybWlvPSIkc2ltX3Rlcm1pbyAtREhBVkVfVEVSTUlPU19DTElORSIKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfdGVybWlvc19jbGluZT1ubwotZmkKLQotaWYgdGVzdCAiJGFjX2N2X3Rlcm1pb3Nfc3RydWN0IiAhPSAieWVzIjsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN0cnVjdCB0ZXJtaW8pCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl90ZXJtaW9fc3RydWN0LAotICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGVybWlvLmg+XSwKLVtzdGF0aWMgc3RydWN0IHRlcm1pbyB4OwotIHguY19pZmxhZyA9IDA7Ci0geC5jX29mbGFnID0gMDsKLSB4LmNfY2ZsYWcgPSAwOwotIHguY19sZmxhZyA9IDA7Ci0geC5jX2NjW05DQ10gPSAwO10sCi1hY19jdl90ZXJtaW9fc3RydWN0PXllcywgYWNfY3ZfdGVybWlvX3N0cnVjdD1ubyldKQotICBBQ19NU0dfUkVTVUxUKCRhY19jdl90ZXJtaW9fc3RydWN0KQotICBpZiB0ZXN0ICRhY19jdl90ZXJtaW9fc3RydWN0ID0geWVzOyB0aGVuCi0gICAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT19TVFJVQ1RVUkUiCi0gIGZpCi1lbHNlCi0gIGFjX2N2X3Rlcm1pb19zdHJ1Y3Q9bm8KLWZpCi0KLWlmIHRlc3QgIiRhY19jdl90ZXJtaW9fc3RydWN0IiA9ICJ5ZXMiOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhmb3IgY19saW5lIGZpZWxkIGluIHN0cnVjdCB0ZXJtaW8pCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl90ZXJtaW9fY2xpbmUsCi0gIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD5dLAotW3N0YXRpYyBzdHJ1Y3QgdGVybWlvIHg7IHguY19saW5lID0gMDtdLAotICBhY19jdl90ZXJtaW9fY2xpbmU9eWVzLCBhY19jdl90ZXJtaW9fY2xpbmU9bm8pXSkKLQotICBBQ19NU0dfUkVTVUxUKCRhY19jdl90ZXJtaW9fY2xpbmUpCi0gIGlmIHRlc3QgJGFjX2N2X3Rlcm1pb19jbGluZSA9IHllczsgdGhlbgotICAgIHNpbV90ZXJtaW89IiRzaW1fdGVybWlvIC1ESEFWRV9URVJNSU9fQ0xJTkUiCi0gIGZpCi1lbHNlCi0gIGFjX2N2X3Rlcm1pb19jbGluZT1ubwotZmkKLQotZG5sIEZpZ3VyZSBvdXQgaWYgL2Rldi96ZXJvIGV4aXN0cyBvciBub3QKLXNpbV9kZXZ6ZXJvPSIiCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvemVybykKLUFDX0NBQ0hFX1ZBTChhY19jdl9kZXZ6ZXJvLAotW0FDX1RSWV9SVU4oWyNpbmNsdWRlIDxmY250bC5oPgotbWFpbiAoKSB7Ci0gIGNoYXIgYnVmWzIwNDhdOwotICBpbnQgaTsKLSAgaW50IGZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRPTkxZKTsKLSAgaWYgKGZkIDwgMCkKLSAgICByZXR1cm4gMTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYnVmKTsgaSsrKQotICAgIGJ1ZltpXSA9IDE7Ci0gIGlmIChyZWFkIChmZCwgYnVmLCBzaXplb2YgKGJ1ZikpICE9IHNpemVvZiAoYnVmKSkKLSAgICByZXR1cm4gMTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYnVmKTsgaSsrKQotICAgIGlmIChidWZbaV0pCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19XSxbYWNfY3ZfZGV2emVybz15ZXNdLFthY19jdl9kZXZ6ZXJvPW5vXSxbYWNfY3ZfZGV2emVybz1ub10pXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X2Rldnplcm8pCi1pZiB0ZXN0ICRhY19jdl9kZXZ6ZXJvID0geWVzOyB0aGVuCi0gIHNpbV9kZXZ6ZXJvPSItREhBVkVfREVWWkVSTyIKLWVsc2UKLSAgc2ltX2Rldnplcm89IiIKLWZpCi0KLWRubCBGaWd1cmUgb3V0IGlmIHdlIGFyZSBpbiB0aGUgbmV3IEN5Z251cyB0cmVlIHdpdGggYSBjb21tb24gZGlyZWN0b3J5IG9yIG5vdAotQUNfTVNHX0NIRUNLSU5HKGZvciBjb21tb24gc2ltdWxhdG9yIGRpcmVjdG9yeSkKLWlmIHRlc3QgLWYgIiR7c3JjZGlyfS8uLi9jb21tb24vY2FsbGJhY2suYyI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIHNpbV9jYWxsYmFjaz0iY2FsbGJhY2subyB0YXJnLW1hcC5vIgotICBzaW1fdGFyZ192YWxzPSJ0YXJnLXZhbHMuaCB0YXJnLW1hcC5jIHRhcmctdmFscy5kZWYiCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi0gIHNpbV9jYWxsYmFjaz0iIgotICBzaW1fdGFyZ192YWxzPSIiCi1maQotCi1kbmwgQ2hlY2sgZm9yIGV4ZSBleHRlbnNpb24KLUFDX0VYRUVYVAotCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi1BQ19TVUJTVChDRkxBR1MpCi1BQ19TVUJTVChIREVGSU5FUykKLUFSPSR7QVItYXJ9Ci1BQ19TVUJTVChBUikKLUFDX1BST0dfUkFOTElCCi1BQ19TVUJTVChzaW1fY2ZsYWdzKQotQUNfU1VCU1Qoc2ltX3dhcm5pbmdzKQotQUNfU1VCU1Qoc2ltX2xpbmVfbnIpCi1BQ19TVUJTVChzaW1fY29uZmlnKQotQUNfU1VCU1Qoc2ltX29wY29kZSkKLUFDX1NVQlNUKHNpbV9zd2l0Y2gpCi1BQ19TVUJTVChzaW1fZHVwKQotQUNfU1VCU1Qoc2ltX2RlY29kZV9tZWNoYW5pc20pCi1BQ19TVUJTVChzaW1fanVtcCkKLUFDX1NVQlNUKHNpbV9maWx0ZXIpCi1BQ19TVUJTVChzaW1faWNhY2hlKQotQUNfU1VCU1Qoc2ltX2h3X3NyYykKLUFDX1NVQlNUKHNpbV9od19vYmopCi1BQ19TVUJTVChzaW1fcGtfc3JjKQotQUNfU1VCU1Qoc2ltX3BrX29iaikKLUFDX1NVQlNUKHNpbV9pbmxpbmUpCi1BQ19TVUJTVChzaW1fYnN3YXApCi1BQ19TVUJTVChzaW1fZW5kaWFuKQotQUNfU1VCU1Qoc2ltX3JlZ3Bhcm0pCi1BQ19TVUJTVChzaW1fc3RkY2FsbCkKLUFDX1NVQlNUKHNpbV94b3JfZW5kaWFuKQotQUNfU1VCU1Qoc2ltX2hvc3RlbmRpYW4pCi1BQ19TVUJTVChzaW1fc21wKQotQUNfU1VCU1Qoc2ltX2lnZW5fc21wKQotQUNfU1VCU1Qoc2ltX2JpdHNpemUpCi1BQ19TVUJTVChzaW1faG9zdGJpdHNpemUpCi1BQ19TVUJTVChzaW1fZW52KQotQUNfU1VCU1Qoc2ltX3RpbWViYXNlKQotQUNfU1VCU1Qoc2ltX2FsaWdubWVudCkKLUFDX1NVQlNUKHNpbV9mbG9hdCkKLUFDX1NVQlNUKHNpbV90cmFjZSkKLUFDX1NVQlNUKHNpbV9hc3NlcnQpCi1BQ19TVUJTVChzaW1fcmVzZXJ2ZWQpCi1BQ19TVUJTVChzaW1fbW9uaXRvcikKLUFDX1NVQlNUKHNpbV9tb2RlbCkKLUFDX1NVQlNUKHNpbV9kZWZhdWx0X21vZGVsKQotQUNfU1VCU1Qoc2ltX21vZGVsX2lzc3VlKQotQUNfU1VCU1Qoc2ltX3N0ZGlvKQotQUNfU1VCU1Qoc2ltX3Rlcm1pbykKLUFDX1NVQlNUKHNpbV9kZXZ6ZXJvKQotQUNfU1VCU1Qoc2ltX2NhbGxiYWNrKQotQUNfU1VCU1Qoc2ltX3RhcmdfdmFscykKLQotQUNfT1VUUFVUKE1ha2VmaWxlLAotW2Nhc2UgeCRDT05GSUdfSEVBREVSUyBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjXSkKZGlmZiAtLWdpdCBhL3NpbS9wcGMvY29yZWZpbGUtbi5oIGIvc2ltL3BwYy9jb3JlZmlsZS1uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGNhZTguLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9jb3JlZmlsZS1uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIE4KLSNlcnJvciAiTiBtdXN0IGJlICNkZWZpbmVkIgotI2VuZGlmCi0KLS8qIE5PVEU6IHNlZSBlbmQgb2YgZmlsZSBmb3IgI3VuZGVmIG9mIHRoZXNlIG1hY3JvcyAqLwotI2RlZmluZSB1bnNpZ25lZF9OIFhDT05DQVQyKHVuc2lnbmVkXyxOKQotI2RlZmluZSBUMkhfTiBYQ09OQ0FUMihUMkhfLE4pCi0jZGVmaW5lIEgyVF9OIFhDT05DQVQyKEgyVF8sTikKLQotI2RlZmluZSBjb3JlX21hcF9yZWFkX04gWENPTkNBVDIoY29yZV9tYXBfcmVhZF8sTikKLSNkZWZpbmUgY29yZV9tYXBfd3JpdGVfTiBYQ09OQ0FUMihjb3JlX21hcF93cml0ZV8sTikKLQotSU5MSU5FX0NPUkUodW5zaWduZWRfTikKLWNvcmVfbWFwX3JlYWRfTihjb3JlX21hcCAqbWFwLAotCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgY29yZV9tYXBwaW5nICptYXBwaW5nID0gY29yZV9tYXBfZmluZF9tYXBwaW5nKG1hcCwKLQkJCQkJCWFkZHIsCi0JCQkJCQlzaXplb2YodW5zaWduZWRfTiksCi0JCQkJCQlwcm9jZXNzb3IsCi0JCQkJCQljaWEsCi0JCQkJCQkxKTsgLyphYm9ydCovCi0gIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkgewotICAgIHVuc2lnbmVkX04gZGF0YTsKLSAgICBpZiAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKG1hcHBpbmctPmRldmljZSwKLQkJCSAgICAgICZkYXRhLAotCQkJICAgICAgbWFwcGluZy0+c3BhY2UsCi0JCQkgICAgICBhZGRyLAotCQkJICAgICAgc2l6ZW9mKHVuc2lnbmVkX04pLCAvKiBucl9ieXRlcyAqLwotCQkJICAgICAgcHJvY2Vzc29yLAotCQkJICAgICAgY2lhKSAhPSBzaXplb2YodW5zaWduZWRfTikpCi0gICAgICBkZXZpY2VfZXJyb3IobWFwcGluZy0+ZGV2aWNlLCAiaW50ZXJuYWwgZXJyb3IgLSBjb3JlX3JlYWRfTigpIC0gaW9fcmVhZF9idWZmZXIgc2hvdWxkIG5vdCBmYWlsIik7Ci0gICAgcmV0dXJuIFQySF9OKGRhdGEpOwotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gVDJIX04oKih1bnNpZ25lZF9OKiljb3JlX3RyYW5zbGF0ZShtYXBwaW5nLCBhZGRyKSk7Ci19Ci0KLQotCi1JTkxJTkVfQ09SRSh2b2lkKQotY29yZV9tYXBfd3JpdGVfTihjb3JlX21hcCAqbWFwLAotCQkgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgdW5zaWduZWRfTiB2YWwsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBjb3JlX21hcHBpbmcgKm1hcHBpbmcgPSBjb3JlX21hcF9maW5kX21hcHBpbmcobWFwLAotCQkJCQkJYWRkciwKLQkJCQkJCXNpemVvZih1bnNpZ25lZF9OKSwKLQkJCQkJCXByb2Nlc3NvciwKLQkJCQkJCWNpYSwKLQkJCQkJCTEpOyAvKmFib3J0Ki8KLSAgaWYgKFdJVEhfQ0FMTEJBQ0tfTUVNT1JZICYmIG1hcHBpbmctPmRldmljZSAhPSBOVUxMKSB7Ci0gICAgdW5zaWduZWRfTiBkYXRhID0gSDJUX04odmFsKTsKLSAgICBpZiAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcihtYXBwaW5nLT5kZXZpY2UsCi0JCQkgICAgICAgJmRhdGEsCi0JCQkgICAgICAgbWFwcGluZy0+c3BhY2UsCi0JCQkgICAgICAgYWRkciwKLQkJCSAgICAgICBzaXplb2YodW5zaWduZWRfTiksIC8qIG5yX2J5dGVzICovCi0JCQkgICAgICAgcHJvY2Vzc29yLAotCQkJICAgICAgIGNpYSkgIT0gc2l6ZW9mKHVuc2lnbmVkX04pKQotICAgICAgZGV2aWNlX2Vycm9yKG1hcHBpbmctPmRldmljZSwgImludGVybmFsIGVycm9yIC0gY29yZV93cml0ZV9OKCkgLSBpb193cml0ZV9idWZmZXIgc2hvdWxkIG5vdCBmYWlsIik7Ci0gIH0KLSAgZWxzZQotICAgICoodW5zaWduZWRfTiopY29yZV90cmFuc2xhdGUobWFwcGluZywgYWRkcikgPSBIMlRfTih2YWwpOwotfQotCi0vKiBOT1RFOiBzZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSBvZiB0aGVzZSBtYWNyb3MgKi8KLSN1bmRlZiB1bnNpZ25lZF9OCi0jdW5kZWYgVDJIX04KLSN1bmRlZiBIMlRfTgotI3VuZGVmIGNvcmVfbWFwX3JlYWRfTgotI3VuZGVmIGNvcmVfbWFwX3dyaXRlX04KZGlmZiAtLWdpdCBhL3NpbS9wcGMvY29yZWZpbGUuYyBiL3NpbS9wcGMvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyOTViYi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2NvcmVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfQ09SRV9DXwotI2RlZmluZSBfQ09SRV9DXwotCi0jaW5jbHVkZSAiYmFzaWNzLmgiCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgX2NvcmVfbWFwcGluZyBjb3JlX21hcHBpbmc7Ci1zdHJ1Y3QgX2NvcmVfbWFwcGluZyB7Ci0gIC8qIGNvbW1vbiAqLwotICBpbnQgbGV2ZWw7Ci0gIGludCBzcGFjZTsKLSAgdW5zaWduZWRfd29yZCBiYXNlOwotICB1bnNpZ25lZF93b3JkIGJvdW5kOwotICB1bnNpZ25lZCBucl9ieXRlczsKLSAgLyogbWVtb3J5IG1hcCAqLwotICB2b2lkICpmcmVlX2J1ZmZlcjsKLSAgdm9pZCAqYnVmZmVyOwotICAvKiBjYWxsYmFjayBtYXAgKi8KLSAgZGV2aWNlICpkZXZpY2U7Ci0gIC8qIGdyb3d0aCAqLwotICBjb3JlX21hcHBpbmcgKm5leHQ7Ci19OwotCi1zdHJ1Y3QgX2NvcmVfbWFwIHsKLSAgY29yZV9tYXBwaW5nICpmaXJzdDsKLX07Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGNvcmVfcmVhZF9tYXAsCi0gIGNvcmVfd3JpdGVfbWFwLAotICBjb3JlX2V4ZWN1dGVfbWFwLAotICBucl9jb3JlX21hcF90eXBlcywKLX0gY29yZV9tYXBfdHlwZXM7Ci0KLXN0cnVjdCBfY29yZSB7Ci0gIGNvcmVfbWFwIG1hcFtucl9jb3JlX21hcF90eXBlc107Ci19OwotCi0KLUlOTElORV9DT1JFXAotKGNvcmUgKikKLWNvcmVfY3JlYXRlKHZvaWQpCi17Ci0gIHJldHVybiBaQUxMT0MoY29yZSk7Ci19Ci0KLQotSU5MSU5FX0NPUkVcCi0oY29yZSAqKQotY29yZV9mcm9tX2RldmljZShkZXZpY2UgKnJvb3QpCi17Ci0gIHJvb3QgPSBkZXZpY2Vfcm9vdChyb290KTsKLSAgQVNTRVJUKHN0cmNtcChkZXZpY2VfbmFtZShyb290KSwgImNvcmUiKSA9PSAwKTsKLSAgcmV0dXJuIGRldmljZV9kYXRhKHJvb3QpOwotfQotCi0KLUlOTElORV9DT1JFXAotKHZvaWQpCi1jb3JlX2luaXQoY29yZSAqbWVtb3J5KQotewotICBjb3JlX21hcF90eXBlcyBhY2Nlc3NfdHlwZTsKLSAgZm9yIChhY2Nlc3NfdHlwZSA9IDA7Ci0gICAgICAgYWNjZXNzX3R5cGUgPCBucl9jb3JlX21hcF90eXBlczsKLSAgICAgICBhY2Nlc3NfdHlwZSsrKSB7Ci0gICAgY29yZV9tYXAgKm1hcCA9IG1lbW9yeS0+bWFwICsgYWNjZXNzX3R5cGU7Ci0gICAgLyogYmxvdyBhd2F5IG9sZCBtYXBwaW5ncyAqLwotICAgIGNvcmVfbWFwcGluZyAqY3VyciA9IG1hcC0+Zmlyc3Q7Ci0gICAgd2hpbGUgKGN1cnIgIT0gTlVMTCkgewotICAgICAgY29yZV9tYXBwaW5nICp0YmQgPSBjdXJyOwotICAgICAgY3VyciA9IGN1cnItPm5leHQ7Ci0gICAgICBpZiAodGJkLT5mcmVlX2J1ZmZlciAhPSBOVUxMKSB7Ci0JQVNTRVJUKHRiZC0+YnVmZmVyICE9IE5VTEwpOwotCXpmcmVlKHRiZC0+ZnJlZV9idWZmZXIpOwotICAgICAgfQotICAgICAgemZyZWUodGJkKTsKLSAgICB9Ci0gICAgbWFwLT5maXJzdCA9IE5VTEw7Ci0gIH0KLX0KLQotCi0KLS8qIHRoZSBjb3JlIGhhcyB0aHJlZSBzdWIgbWFwcGluZ3MgdGhhdCB0aGUgbW9yZSBlZmZpY2llbnQKLSAgIHJlYWQvd3JpdGUgZml4ZWQgcXVhbnRpdHkgZnVuY3Rpb25zIHVzZSAqLwotCi1JTkxJTkVfQ09SRVwKLShjb3JlX21hcCAqKQotY29yZV9yZWFkYWJsZShjb3JlICptZW1vcnkpCi17Ci0gIHJldHVybiBtZW1vcnktPm1hcCArIGNvcmVfcmVhZF9tYXA7Ci19Ci0KLUlOTElORV9DT1JFXAotKGNvcmVfbWFwICopCi1jb3JlX3dyaXRlYWJsZShjb3JlICptZW1vcnkpCi17Ci0gIHJldHVybiBtZW1vcnktPm1hcCArIGNvcmVfd3JpdGVfbWFwOwotfQotCi1JTkxJTkVfQ09SRVwKLShjb3JlX21hcCAqKQotY29yZV9leGVjdXRhYmxlKGNvcmUgKm1lbW9yeSkKLXsKLSAgcmV0dXJuIG1lbW9yeS0+bWFwICsgY29yZV9leGVjdXRlX21hcDsKLX0KLQotCi0KLVNUQVRJQ19JTkxJTkVfQ09SRVwKLShjb3JlX21hcHBpbmcgKikKLW5ld19jb3JlX21hcHBpbmcoYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkgaW50IHNwYWNlLAotCQkgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSBkZXZpY2UgKmRldmljZSwKLQkJIHZvaWQgKmJ1ZmZlciwKLQkJIHZvaWQgKmZyZWVfYnVmZmVyKQotewotICBjb3JlX21hcHBpbmcgKm5ld19tYXBwaW5nID0gWkFMTE9DKGNvcmVfbWFwcGluZyk7Ci0gIC8qIGNvbW1vbiAqLwotICBuZXdfbWFwcGluZy0+bGV2ZWwgPSBhdHRhY2g7Ci0gIG5ld19tYXBwaW5nLT5zcGFjZSA9IHNwYWNlOwotICBuZXdfbWFwcGluZy0+YmFzZSA9IGFkZHI7Ci0gIG5ld19tYXBwaW5nLT5ucl9ieXRlcyA9IG5yX2J5dGVzOwotICBuZXdfbWFwcGluZy0+Ym91bmQgPSBhZGRyICsgKG5yX2J5dGVzIC0gMSk7Ci0gIGlmIChhdHRhY2ggPT0gYXR0YWNoX3Jhd19tZW1vcnkpIHsKLSAgICBuZXdfbWFwcGluZy0+YnVmZmVyID0gYnVmZmVyOwotICAgIG5ld19tYXBwaW5nLT5mcmVlX2J1ZmZlciA9IGZyZWVfYnVmZmVyOwotICB9Ci0gIGVsc2UgaWYgKGF0dGFjaCA+PSBhdHRhY2hfY2FsbGJhY2spIHsKLSAgICBuZXdfbWFwcGluZy0+ZGV2aWNlID0gZGV2aWNlOwotICB9Ci0gIGVsc2UgewotICAgIGVycm9yKCJuZXdfY29yZV9tYXBwaW5nKCkgLSBpbnRlcm5hbCBlcnJvciAtIHVua25vd24gYXR0YWNoIHR5cGUgJWRcbiIsCi0JICBhdHRhY2gpOwotICB9Ci0gIHJldHVybiBuZXdfbWFwcGluZzsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX0NPUkVcCi0odm9pZCkKLWNvcmVfbWFwX2F0dGFjaChjb3JlX21hcCAqYWNjZXNzX21hcCwKLQkJYXR0YWNoX3R5cGUgYXR0YWNoLAotCQlpbnQgc3BhY2UsCi0JCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJdW5zaWduZWQgbnJfYnl0ZXMsIC8qIGhvc3QgbGltaXRlZCAqLwotCQlkZXZpY2UgKmNsaWVudCwgLypjYWxsYmFjay9kZWZhdWx0Ki8KLQkJdm9pZCAqYnVmZmVyLCAvKnJhd19tZW1vcnkqLwotCQl2b2lkICpmcmVlX2J1ZmZlcikgLypyYXdfbWVtb3J5Ki8KLXsKLSAgLyogZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGlzIGFkZGl0aW9uYWwgbWFwcGluZyBhbmQgaW5zZXJ0ICovCi0gIGNvcmVfbWFwcGluZyAqbmV4dF9tYXBwaW5nOwotICBjb3JlX21hcHBpbmcgKipsYXN0X21hcHBpbmc7Ci0KLSAgLyogYWN0dWFsbHkgZG8gb2NjYXNpb25hbGx5IGdldCBhIHplcm8gc2l6ZSBtYXAgKi8KLSAgaWYgKG5yX2J5dGVzID09IDApIHsKLSAgICBkZXZpY2VfZXJyb3IoY2xpZW50LCAiY2FsbGVkIG9uIGNvcmVfbWFwX2F0dGFjaCgpIHdpdGggc2l6ZSB6ZXJvIik7Ci0gIH0KLQotICAvKiBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQgKGJldHdlZW4gbGFzdC9uZXh0KSAqLwotICBuZXh0X21hcHBpbmcgPSBhY2Nlc3NfbWFwLT5maXJzdDsKLSAgbGFzdF9tYXBwaW5nID0gJmFjY2Vzc19tYXAtPmZpcnN0OwotICB3aGlsZShuZXh0X21hcHBpbmcgIT0gTlVMTAotCSYmIChuZXh0X21hcHBpbmctPmxldmVsIDwgYXR0YWNoCi0JICAgIHx8IChuZXh0X21hcHBpbmctPmxldmVsID09IGF0dGFjaAotCQkmJiBuZXh0X21hcHBpbmctPmJvdW5kIDwgYWRkcikpKSB7Ci0gICAgLyogcHJvdmlkZWQgbGV2ZWxzIGFyZSB0aGUgc2FtZSAqLwotICAgIC8qIGFzc2VydDogbmV4dF9tYXBwaW5nLT5iYXNlID4gYWxsIGJhc2VzIGJlZm9yZSBuZXh0X21hcHBpbmcgKi8KLSAgICAvKiBhc3NlcnQ6IG5leHRfbWFwcGluZy0+Ym91bmQgPj0gYWxsIGJvdW5kcyBiZWZvcmUgbmV4dF9tYXBwaW5nICovCi0gICAgbGFzdF9tYXBwaW5nID0gJm5leHRfbWFwcGluZy0+bmV4dDsKLSAgICBuZXh0X21hcHBpbmcgPSBuZXh0X21hcHBpbmctPm5leHQ7Ci0gIH0KLQotICAvKiBjaGVjayBpbnNlcnRpb24gcG9pbnQgY29ycmVjdCAqLwotICBBU1NFUlQobmV4dF9tYXBwaW5nID09IE5VTEwgfHwgbmV4dF9tYXBwaW5nLT5sZXZlbCA+PSBhdHRhY2gpOwotICBpZiAobmV4dF9tYXBwaW5nICE9IE5VTEwgJiYgbmV4dF9tYXBwaW5nLT5sZXZlbCA9PSBhdHRhY2gKLSAgICAgICYmIG5leHRfbWFwcGluZy0+YmFzZSA8IChhZGRyICsgKG5yX2J5dGVzIC0gMSkpKSB7Ci0gICAgZGV2aWNlX2Vycm9yKGNsaWVudCwgIm1hcCBvdmVybGFwIHdoZW4gYXR0YWNoaW5nICVkOjB4JWx4ICglbGQpIiwKLQkJIHNwYWNlLCAobG9uZylhZGRyLCAobG9uZylucl9ieXRlcyk7Ci0gIH0KLQotICAvKiBjcmVhdGUvaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyAqLwotICAqbGFzdF9tYXBwaW5nID0gbmV3X2NvcmVfbWFwcGluZyhhdHRhY2gsCi0JCQkJICAgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAotCQkJCSAgIGNsaWVudCwgYnVmZmVyLCBmcmVlX2J1ZmZlcik7Ci0gICgqbGFzdF9tYXBwaW5nKS0+bmV4dCA9IG5leHRfbWFwcGluZzsKLX0KLQotCi1JTkxJTkVfQ09SRVwKLSh2b2lkKQotY29yZV9hdHRhY2goY29yZSAqbWVtb3J5LAotCSAgICBhdHRhY2hfdHlwZSBhdHRhY2gsCi0JICAgIGludCBzcGFjZSwKLQkgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAotCSAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JICAgIHVuc2lnbmVkIG5yX2J5dGVzLCAvKiBob3N0IGxpbWl0ZWQgKi8KLQkgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCi17Ci0gIGNvcmVfbWFwX3R5cGVzIGFjY2Vzc19tYXA7Ci0gIHZvaWQgKmJ1ZmZlcjsKLSAgdm9pZCAqZnJlZV9idWZmZXI7Ci0gIGlmIChhdHRhY2ggPT0gYXR0YWNoX3Jhd19tZW1vcnkpIHsKLSAgICAvKiBQYWRkIG91dCB0aGUgcmF3IGJ1ZmZlciB0byBlbnN1cmUgdGhhdCBBRERSIHN0YXJ0cyBvbiBhCi0gICAgICAgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkgKi8KLSAgICBpbnQgcGFkZGluZyA9IChhZGRyICUgc2l6ZW9mICh1bnNpZ25lZDY0KSk7Ci0gICAgZnJlZV9idWZmZXIgPSB6YWxsb2MobnJfYnl0ZXMgKyBwYWRkaW5nKTsKLSAgICBidWZmZXIgPSAoY2hhciopZnJlZV9idWZmZXIgKyBwYWRkaW5nOwotICB9Ci0gIGVsc2UgewotICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgZnJlZV9idWZmZXIgPSAmYnVmZmVyOyAvKiBtYXJrZXIgZm9yIGFzc2VydGlvbiAqLwotICB9Ci0gIGZvciAoYWNjZXNzX21hcCA9IDA7IAotICAgICAgIGFjY2Vzc19tYXAgPCBucl9jb3JlX21hcF90eXBlczsKLSAgICAgICBhY2Nlc3NfbWFwKyspIHsKLSAgICBzd2l0Y2ggKGFjY2Vzc19tYXApIHsKLSAgICBjYXNlIGNvcmVfcmVhZF9tYXA6Ci0gICAgICBpZiAoYWNjZXNzICYgYWNjZXNzX3JlYWQpCi0JY29yZV9tYXBfYXR0YWNoKG1lbW9yeS0+bWFwICsgYWNjZXNzX21hcCwKLQkJCWF0dGFjaCwKLQkJCXNwYWNlLCBhZGRyLCBucl9ieXRlcywKLQkJCWNsaWVudCwgYnVmZmVyLCBmcmVlX2J1ZmZlcik7Ci0gICAgICBmcmVlX2J1ZmZlciA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvcmVfd3JpdGVfbWFwOgotICAgICAgaWYgKGFjY2VzcyAmIGFjY2Vzc193cml0ZSkKLQljb3JlX21hcF9hdHRhY2gobWVtb3J5LT5tYXAgKyBhY2Nlc3NfbWFwLAotCQkJYXR0YWNoLAotCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAotCQkJY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKLSAgICAgIGZyZWVfYnVmZmVyID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29yZV9leGVjdXRlX21hcDoKLSAgICAgIGlmIChhY2Nlc3MgJiBhY2Nlc3NfZXhlYykKLQljb3JlX21hcF9hdHRhY2gobWVtb3J5LT5tYXAgKyBhY2Nlc3NfbWFwLAotCQkJYXR0YWNoLAotCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAotCQkJY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKLSAgICAgIGZyZWVfYnVmZmVyID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcigiY29yZV9hdHRhY2goKSBpbnRlcm5hbCBlcnJvclxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLyogYWxsb2NhdGVkIGJ1ZmZlciBtdXN0IGF0dGFjaCB0byBhdCBsZWFzdCBvbmUgdGhpbmcgKi8KLSAgQVNTRVJUKGZyZWVfYnVmZmVyID09IE5VTEwpOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfQ09SRVwKLShjb3JlX21hcHBpbmcgKikKLWNvcmVfbWFwX2ZpbmRfbWFwcGluZyhjb3JlX21hcCAqbWFwLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JCSAgICAgIGludCBhYm9ydCkgLyplaXRoZXIgMCBvciAxIC0gaGVscHMgaW5saW5lICovCi17Ci0gIGNvcmVfbWFwcGluZyAqbWFwcGluZyA9IG1hcC0+Zmlyc3Q7Ci0gIEFTU0VSVCgoYWRkciAmIChucl9ieXRlcyAtIDEpKSA9PSAwKTsgLyogbXVzdCBiZSBhbGlnbmVkICovCi0gIEFTU0VSVCgoYWRkciArIChucl9ieXRlcyAtIDEpKSA+PSBhZGRyKTsgLyogbXVzdCBub3Qgd3JhcCAqLwotICB3aGlsZSAobWFwcGluZyAhPSBOVUxMKSB7Ci0gICAgaWYgKGFkZHIgPj0gbWFwcGluZy0+YmFzZQotCSYmIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpIDw9IG1hcHBpbmctPmJvdW5kKQotICAgICAgcmV0dXJuIG1hcHBpbmc7Ci0gICAgbWFwcGluZyA9IG1hcHBpbmctPm5leHQ7Ci0gIH0KLSAgaWYgKGFib3J0KQotICAgIGVycm9yKCJjb3JlX2ZpbmRfbWFwcGluZygpIC0gYWNjZXNzIHRvIHVubWFwZWQgYWRkcmVzcywgYXR0YWNoIGEgZGVmYXVsdCBtYXAgdG8gaGFuZGxlIHRoaXMgLSBhZGRyPTB4JXggbnJfYnl0ZXM9MHgleCBwcm9jZXNzb3I9MHgleCBjaWE9MHgleFxuIiwKLQkgIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfQ09SRVwKLSh2b2lkICopCi1jb3JlX3RyYW5zbGF0ZShjb3JlX21hcHBpbmcgKm1hcHBpbmcsCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkcikKLXsKLSAgcmV0dXJuICh2b2lkICopKCgoY2hhciAqKW1hcHBpbmctPmJ1ZmZlcikgKyBhZGRyIC0gbWFwcGluZy0+YmFzZSk7Ci19Ci0KLQotSU5MSU5FX0NPUkVcCi0odW5zaWduZWQpCi1jb3JlX21hcF9yZWFkX2J1ZmZlcihjb3JlX21hcCAqbWFwLAotCQkgICAgIHZvaWQgKmJ1ZmZlciwKLQkJICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSAgICAgdW5zaWduZWQgbGVuKQotewotICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gIHdoaWxlIChjb3VudCA8IGxlbikgewotICAgIHVuc2lnbmVkX3dvcmQgcmFkZHIgPSBhZGRyICsgY291bnQ7Ci0gICAgY29yZV9tYXBwaW5nICptYXBwaW5nID0KLSAgICAgIGNvcmVfbWFwX2ZpbmRfbWFwcGluZyhtYXAsCi0JCQkgICAgcmFkZHIsIDEsCi0JCQkgICAgTlVMTCwgLypwcm9jZXNzb3IqLwotCQkJICAgIDAsIC8qY2lhKi8KLQkJCSAgICAwKTsgLypkb250LWFib3J0Ki8KLSAgICBpZiAobWFwcGluZyA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKG1hcHBpbmctPmRldmljZSAhPSBOVUxMKSB7Ci0gICAgICBpbnQgbnJfYnl0ZXMgPSBsZW4gLSBjb3VudDsKLSAgICAgIGlmIChyYWRkciArIG5yX2J5dGVzIC0gMT4gbWFwcGluZy0+Ym91bmQpCi0JbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKLSAgICAgIGlmIChkZXZpY2VfaW9fcmVhZF9idWZmZXIobWFwcGluZy0+ZGV2aWNlLAotCQkJCSh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKLQkJCQltYXBwaW5nLT5zcGFjZSwKLQkJCQlyYWRkciwKLQkJCQlucl9ieXRlcywKLQkJCQkwLCAvKnByb2Nlc3NvciovCi0JCQkJMCAvKmNwdSovKSAhPSBucl9ieXRlcykKLQlicmVhazsKLSAgICAgIGNvdW50ICs9IG5yX2J5dGVzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICgodW5zaWduZWRfMSopYnVmZmVyKVtjb3VudF0gPQotCSoodW5zaWduZWRfMSopY29yZV90cmFuc2xhdGUobWFwcGluZywgcmFkZHIpOwotICAgICAgY291bnQgKz0gMTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0KLUlOTElORV9DT1JFXAotKHVuc2lnbmVkKQotY29yZV9tYXBfd3JpdGVfYnVmZmVyKGNvcmVfbWFwICptYXAsCi0JCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICB1bnNpZ25lZCBsZW4pCi17Ci0gIHVuc2lnbmVkIGNvdW50ID0gMDsKLSAgd2hpbGUgKGNvdW50IDwgbGVuKSB7Ci0gICAgdW5zaWduZWRfd29yZCByYWRkciA9IGFkZHIgKyBjb3VudDsKLSAgICBjb3JlX21hcHBpbmcgKm1hcHBpbmcgPSBjb3JlX21hcF9maW5kX21hcHBpbmcobWFwLAotCQkJCQkJICByYWRkciwgMSwKLQkJCQkJCSAgTlVMTCwgLypwcm9jZXNzb3IqLwotCQkJCQkJICAwLCAvKmNpYSovCi0JCQkJCQkgIDApOyAvKmRvbnQtYWJvcnQqLwotICAgIGlmIChtYXBwaW5nID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgICBpZiAobWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpIHsKLSAgICAgIGludCBucl9ieXRlcyA9IGxlbiAtIGNvdW50OwotICAgICAgaWYgKHJhZGRyICsgbnJfYnl0ZXMgLSAxID4gbWFwcGluZy0+Ym91bmQpCi0JbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKLSAgICAgIGlmIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKG1hcHBpbmctPmRldmljZSwKLQkJCQkgKHVuc2lnbmVkXzEqKWJ1ZmZlciArIGNvdW50LAotCQkJCSBtYXBwaW5nLT5zcGFjZSwKLQkJCQkgcmFkZHIsCi0JCQkJIG5yX2J5dGVzLAotCQkJCSAwLCAvKnByb2Nlc3NvciovCi0JCQkJIDAgLypjcHUqLykgIT0gbnJfYnl0ZXMpCi0JYnJlYWs7Ci0gICAgICBjb3VudCArPSBucl9ieXRlczsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAqKHVuc2lnbmVkXzEqKWNvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIHJhZGRyKSA9Ci0JKCh1bnNpZ25lZF8xKilidWZmZXIpW2NvdW50XTsKLSAgICAgIGNvdW50ICs9IDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotCi0vKiBkZWZpbmUgdGhlIHJlYWQvd3JpdGUgMS8yLzQvOC93b3JkIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIE4gMQotI2luY2x1ZGUgImNvcmVmaWxlLW4uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiAyCi0jaW5jbHVkZSAiY29yZWZpbGUtbi5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDQKLSNpbmNsdWRlICJjb3JlZmlsZS1uLmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gOAotI2luY2x1ZGUgImNvcmVmaWxlLW4uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiB3b3JkCi0jaW5jbHVkZSAiY29yZWZpbGUtbi5oIgotI3VuZGVmIE4KLQotI2VuZGlmIC8qIF9DT1JFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NvcmVmaWxlLmggYi9zaW0vcHBjL2NvcmVmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjQ3MGNhLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvY29yZWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9DT1JFX0hfCi0jZGVmaW5lIF9DT1JFX0hfCi0KLS8qIEludHJvZHVjdGlvbjoKLQotICAgVGhlIGNvcmUgZGV2aWNlLCBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhlIGRldmljZSB0cmVlIHRoYXQKLSAgIG1vZGVscyB0aGUgYXJjaGl0ZWN1cmUgYmVpbmcgc2ltdWxhdGVkLCBhY3RzIGFzIGFuIGludGVyZmFjZQotICAgYmV0d2VlbiB0aGUgcHJvY2Vzc29yIGVuZ2luZXMgYW5kIHRoZSBtb2RlbGVkIGRldmljZXMuCi0KLSAgIE9uIHRoZSBvbmUgc2lkZSB0aGUgcHJvY2Vzc29yIGVuZ2luZXMgaXNzdWUgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMKLSAgIHRvIHRoZSBjb3JlIChlYWNoIHJlcXVlc3QgZnVydGhlciBjYXRhZ29yaXNlZCBhcyBiZWluZyBmb3IgYW4KLSAgIGluc3RydWN0aW9uIG9yIGRhdGEgc3VidW5pdCkgd2hpbGUgb24gdGhlIG90aGVyIHNpZGUsIHRoZSBjb3JlIGlzCi0gICByZWNlaXZpbmcgYWRkcmVzcyBjb25maWd1cmF0aW9uIGFuZCBETUEgcmVxdWVzdHMgZnJvbSBjaGlsZAotICAgZGV2aWNlcy4KLQotICAgSW4gdGhlIGJlbG93IGEgc3lub3BzaXMgb2YgdGhlIGNvcmUgb2JqZWN0IGFuZCBkZXZpY2UgaW4gUFNJTSBpcwotICAgZ2l2ZW4sIGRldGFpbHMgb2YgdGhlIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGVzCi0gICA8PGNvcmVmaWxlLmg+PiBhbmQgPDxjb3JlZmlsZS5jPj4uCi0KLSAgICovCi0KLS8qIENvcmU6OgotCi0gICBBdCB0aGUgaGVhcnQgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGRldmljZXMgYW5kIHByb2Nlc3NvciBlbmdpbmVzCi0gICBpcyBhIHNpbmdsZSBjb3JlIG9iamVjdC4gIFRoaXMgb2JqZWN0LCBpbiB0dXJuLCBoYXMgdHdvIGNoaWxkcmVuOgotCi0gICBvCWEgY29yZSBkZXZpY2Ugd2hpY2ggZXhpc3RzIGluIHRoZSBkZXZpY2UgdHJlZSBhbmQgcHJvdmlkZXMKLSAgIAlhbiBpbnRlcmZhY2UgdG8gdGhlIGNvcmUgb2JqZWN0IHRvIGNoaWxkIGRldmljZXMuCi0KLSAgIG8JYSBzZXQgb2YgYWNjZXNzIG1hcHMgd2hpY2ggcHJvdmlkZSBhbiBlZmZpY2llbnQKLSAgIAlpbnRlcmZhY2UgdG8gdGhlIGNvcmUgb2JqZWN0IGZvciB0aGUgcHJvY2Vzc29yIGVuZ2luZXMuCi0KLSAgICovCi0KLS8qIGJhc2ljIHR5cGVzICovCi0KLXR5cGVkZWYgc3RydWN0IF9jb3JlIGNvcmU7Ci10eXBlZGVmIHN0cnVjdCBfY29yZV9tYXAgY29yZV9tYXA7Ci0KLS8qIGNvbnN0cnVjdG9yICovCi0KLUlOTElORV9DT1JFXAotKGNvcmUgKikgY29yZV9jcmVhdGUKLSh2b2lkKTsKLQotSU5MSU5FX0NPUkVcCi0oY29yZSAqKSBjb3JlX2Zyb21fZGV2aWNlCi0oZGV2aWNlICpyb290KTsKLQotSU5MSU5FX0NPUkVcCi0odm9pZCkgY29yZV9pbml0Ci0oY29yZSAqbWVtb3J5KTsKLQotLyogQ29yZSBtYXAgbWFuYWdlbWVudDo6OgotCi0gICBUaGUgY29yZSBvamJlY3QgbWFuYWdlcyB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGFkZHJlc3MgbWFwczoKLQotICAgbyAgICByYXctbWVtb3J5IC0gdGhlIGFkZHJlc3MgcmFuZ2UgY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nCi0JYSBzaW1wbGUgYnl0ZSBhcnJheS4gIE5vIGRldmljZSBuZWVkcyB0byBiZSBub3RpZmVkIG9mCi0JYW55IGFjY2Vzc2VzIHRvIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlLgotICAgICAgICAKLSAgIG8JY2FsbGJhY2sgLSBBbnkgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyByYW5nZQotCXNob3VsZCBiZSBwYXNzZWQgb24gdG8gdGhlIGFzc29jaWF0ZWQgZGV2aWNlLiAgVGhhdCBkZXZpY2UKLSAgICAgICAgY2FuIGluIHR1cm4gcmVzb2x2ZSB0aGUgYWNjZXNzIC0gaGFuZGxpbmcgb3IgYWJvcnRpbmcgb3IKLQlyZXN0YXJ0aW5nIGl0LgotCi0gICBGb3IgY2FsbGJhY2sgbWFwcyBpdCBpcyBwb3NzaWJsZSB0byBmdXJ0aGVyIG9yZGVyIHRoZW0gYnkKLSAgIHNwZWNpZml5aW5nIHNwZWNpZnlpbmcgYSBjYWxsYmFjayBsZXZlbCAoZWcgY2FsbGJhY2sgKyAxKS4KLQotICAgV2hlbiB0aGUgY29yZSBpcyByZXNvbHZpbmcgYW4gYWNjZXNzIGl0IHNlYXJjaGVzIGVhY2ggb2YgdGhlIG1hcHMKLSAgIGluIG9yZGVyLiAgRmlyc3QgcmF3LW1lbW9yeSBhbmQgdGhlbiBjYWxsYmFjayBtYXBzIChpbiBhc3NlbmRpbmcKLSAgIG9yZGVyIG9mIGxldmVsKS4gIFRoaXMgc2VhcmNoIG9yZGVyIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBsYXR0ZXIKLSAgIG1hcHMgdG8gb3ZlcmxhcCBlYXJsaWVyIG9uZXMuICBGb3IgaW5zdGFuY2UsIGEgZGV2aWNlIHRoYXQgd2FudHMgdG8KLSAgIGJlIG5vdGlmaWVkIG9mIGFsbCBhY2Nlc3NlcyB0aGF0IGFyZSBub3QgY292ZXJlZCBieSByYXctbWVtb3J5IG1hcHMKLSAgIGNvdWxkIGF0dGFjaCBpdHMgc2VsZiB3aXRoIGFuIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIGVudGlyZSBhZGRyZXNzCi0gICBzcGFjZS4KLQotICAgSW4gYWRkaXRpb24sIGVhY2ggYXR0YWNoZWQgYWRkcmVzcyBtYXAgYXMgYW4gYXNzb2NpYXRlZCBzZXQgb2YKLSAgIGFjY2VzcyBhdHRyaWJ1dGVzIChyZWFkYWJsZSwgd3JpdGVhYmxlLCBleGVjdXRhYmxlKSB3aGljaCBhcmUKLSAgIHZlcmlmaWVkIGFzIHBhcnQgb2YgcmVzb2x2aW5nIGVhY2ggYWNjZXNzLgotCi0gICAqLwotCi1JTkxJTkVfQ09SRVwKLSh2b2lkKSBjb3JlX2F0dGFjaAotKGNvcmUgKm1hcCwKLSBhdHRhY2hfdHlwZSBhdHRhY2gsCi0gaW50IGFkZHJlc3Nfc3BhY2UsCi0gYWNjZXNzX3R5cGUgYWNjZXNzLAotIHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZCBucl9ieXRlcywgLyogaG9zdCBsaW1pdGVkICovCi0gZGV2aWNlICpkZXZpY2UpOyAvKmNhbGxiYWNrL2RlZmF1bHQqLwotCi0vKiBCdWdzOjo6Ci0KLSAgIEF0IHByZXNlbnQgdGhlcmUgaXMgbm8gbWV0aG9kIGZvciByZW1vdmluZyBhZGRyZXNzIG1hcHMuICBUaGF0IHdpbGwKLSAgIGJlIGltcGxlbWVudGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCi0KLSAgIFRoZSBvcGVyYXRpb24gb2YgbWFwcGluZyBiZXR3ZWVuIGFuIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbgotICAgZGV2aWNlIG9yIG1lbW9yeSBhcnJheSBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgdXNpbmcgYSBzaW1wbGUKLSAgIGxpbmtlZCBsaXN0LiAgVGhlIHBvc2liaWxpdHkgb2YgcmVwbGFjaW5nIHRoaXMgbGlzdCB3aXRoIGEgbW9yZQotICAgcG93ZXJmdWxsIGRhdGEgc3RydWN0dXJlIGV4aXN0cy4KLQotICAgKi8KLQotCi0vKiBEZXZpY2U6OgotCi0gICBUaGUgZGV2aWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvcmUgb2JqZWN0IGlzIGRlc2NyaWJlZAotICAgc2VwYXJhdGx5IGluIHRoZSBkZXZpY2VzIHNlY3Rpb24uCi0KLSAgICovCi0KLS8qIEFjY2VzcyBtYXBzOjoKLQotICAgUHJvdmlkaW5nIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBwcm9jZXNzb3IgZW5naW5lcyBhbmQgdGhlIGNvcmUKLSAgIG9iamVjdCBhcmUgdGhlIGFjY2VzcyBtYXBzIChjb3JlX21hcCkuICBUaHJlZSBhY2Nlc3MgbWFwcyBhcmUKLSAgIHByb3ZpZGVkLCBvbmUgZm9yIGVhY2ggb2YgdGhlIHBvc3NpYmxlIGFjY2VzcyByZXF1ZXN0cyB0aGF0IGNhbiBiZQotICAgZ2VuZXJhdGVkIGJ5IGEgcHJvY2Vzc29yLgotCi0gICBvCXJlYWQKLQotICAgbyAgICB3cml0ZQotCi0gICBvICAgIGV4ZWN1dGUKLQotICAgQSBwcm9jZXNzb3IgYmVpbmcgYWJsZSB0byByZXF1ZXN0IGEgcmVhZCAob3Igd3JpdGUpIG9yIHdyaXRlCi0gICBvcGVyYXRpb24gdG8gYW55IG9mIHRoZSBtYXBzLiAgVGhvc2Ugb3BlcmF0aW9ucyBjYW4gZWl0aGVyIGJlCi0gICBoaWdobHkgZWZmaWNpZW50IChieSBzcGVjaWZ5aW5nIGEgc3BlY2lmaWMgdHJhbnNmZXIgc2l6ZSkgb3IKLSAgIGdlbmVyaWMgKHNwZWNpZnlpbmcgYSBwYXJhbWV0ZXJpemVkIG51bWJlciBvZiBieXRlcykuCi0KLSAgIEludGVybmFsbHkgdGhlIGNvcmUgb2JqZWN0IHRha2VzIHRoZSByZXF1ZXN0LCBkZXRlcm1pbmVzIHRoZQotICAgYXBwcm9wZXJpYXRlIGF0dGFjaGVkIGFkZHJlc3Mgc3BhY2UgdGhhdCBpdCBzaG91bGQgaGFuZGxlIGl0IHBhc3NlcwotICAgaXQgb24uCi0KLSAgICovCi0KLUlOTElORV9DT1JFXAotKGNvcmVfbWFwICopIGNvcmVfcmVhZGFibGUKLShjb3JlICptZW1vcnkpOwotCi1JTkxJTkVfQ09SRVwKLShjb3JlX21hcCAqKSBjb3JlX3dyaXRlYWJsZQotKGNvcmUgKm1lbW9yeSk7Ci0KLUlOTElORV9DT1JFXAotKGNvcmVfbWFwICopIGNvcmVfZXhlY3V0YWJsZQotKGNvcmUgKm1lbW9yeSk7Ci0KLS8qIFZhcmlhYmxlIHNpemVkIHJlYWQvd3JpdGUKLQotICAgVHJhbnNmZXIgKHplcm8pIGEgdmFyaWFibGUgc2l6ZSBibG9jayBvZiBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kCi0gICB0YXJnZXQgKHBvc3NpYmx5IGJ5dGUgc3dhcHBpbmcgaXQpLiAgU2hvdWxkIGFueSBwcm9ibGVtcyBvY2N1cmUsCi0gICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHRyYW5zZmVyZWQgaXMgcmV0dXJuZWQuICovCi0KLUlOTElORV9DT1JFXAotKHVuc2lnbmVkKSBjb3JlX21hcF9yZWFkX2J1ZmZlcgotKGNvcmVfbWFwICptYXAsCi0gdm9pZCAqYnVmZmVyLAotIHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZCBucl9ieXRlcyk7Ci0KLUlOTElORV9DT1JFXAotKHVuc2lnbmVkKSBjb3JlX21hcF93cml0ZV9idWZmZXIKLShjb3JlX21hcCAqbWFwLAotIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi0KLS8qIEZpeGVkIHNpemVkIHJlYWQvd3JpdGUKLQotICAgVHJhbnNmZXIgYSBmaXhlZCBhbW91dCBvZiBtZW1vcnkgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0LiAgVGhlCi0gICBtZW1vcnkgYWx3YXlzIGJlaW5nIHRyYW5zbGF0ZWQgYW5kIHRoZSBvcGVyYXRpb24gYWx3YXlzIGFib3J0aW5nCi0gICBzaG91bGQgYSBwcm9ibGVtIG9jY3VyZSAqLwotCi0jZGVmaW5lIERFQ0xBUkVfQ09SRV9XUklURV9OKE4pIFwKLUlOTElORV9DT1JFXAotKHZvaWQpIGNvcmVfbWFwX3dyaXRlXyMjTiBcCi0oY29yZV9tYXAgKm1hcCwgXAotIHVuc2lnbmVkX3dvcmQgYWRkciwgXAotIHVuc2lnbmVkXyMjTiB2YWwsIFwKLSBjcHUgKnByb2Nlc3NvciwgXAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotREVDTEFSRV9DT1JFX1dSSVRFX04oMSkKLURFQ0xBUkVfQ09SRV9XUklURV9OKDIpCi1ERUNMQVJFX0NPUkVfV1JJVEVfTig0KQotREVDTEFSRV9DT1JFX1dSSVRFX04oOCkKLURFQ0xBUkVfQ09SRV9XUklURV9OKHdvcmQpCi0KLSNkZWZpbmUgREVDTEFSRV9DT1JFX1JFQURfTihOKSBcCi1JTkxJTkVfQ09SRVwKLSh1bnNpZ25lZF8jI04pIGNvcmVfbWFwX3JlYWRfIyNOIFwKLShjb3JlX21hcCAqbWFwLCBcCi0gdW5zaWduZWRfd29yZCBhZGRyLCBcCi0gY3B1ICpwcm9jZXNzb3IsIFwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLURFQ0xBUkVfQ09SRV9SRUFEX04oMSkKLURFQ0xBUkVfQ09SRV9SRUFEX04oMikKLURFQ0xBUkVfQ09SRV9SRUFEX04oNCkKLURFQ0xBUkVfQ09SRV9SRUFEX04oOCkKLURFQ0xBUkVfQ09SRV9SRUFEX04od29yZCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NwdS5jIGIvc2ltL3BwYy9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlODJmMS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0NQVV9DXwotI2RlZmluZSBfQ1BVX0NfCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImlkZWNvZGUuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi1zdHJ1Y3QgX2NwdSB7Ci0KLSAgLyogdGhlIHJlZ2lzdGVycyAqLwotICByZWdpc3RlcnMgcmVnczsKLQotICAvKiBjdXJyZW50IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLSAgdW5zaWduZWRfd29yZCBwcm9ncmFtX2NvdW50ZXI7Ci0KLSAgLyogdGhlIG1lbW9yeSBtYXBzICovCi0gIGNvcmUgKnBoeXNpY2FsOyAvKiBhbGwgb2YgbWVtb3J5ICovCi0gIHZtICp2aXJ0dWFsOwotICB2bV9pbnN0cnVjdGlvbl9tYXAgKmluc3RydWN0aW9uX21hcDsgLyogaW5zdHJ1Y3Rpb25zICovCi0gIHZtX2RhdGFfbWFwICpkYXRhX21hcDsgLyogZGF0YSAqLwotCi0gIC8qIHRoZSBzeXN0ZW0gdGhpcyBwcm9jZXNzb3IgaXMgY29udGFpbmVkIHdpdGhpbiAqLwotICBjcHVfbW9uICptb25pdG9yOwotICBvc19lbXVsICpvc19lbXVsYXRpb247Ci0gIHBzaW0gKnN5c3RlbTsKLSAgZXZlbnRfcXVldWUgKmV2ZW50czsKLSAgaW50IGNwdV9ucjsKLQotICAvKiBDdXJyZW50IENQVSBtb2RlbCBpbmZvcm1hdGlvbiAqLwotICBtb2RlbF9kYXRhICptb2RlbF9wdHI7Ci0KLSNpZiBXSVRIX0lERUNPREVfQ0FDSEVfU0laRQotICAvKiBhIGNhY2hlIHRvIHN0b3JlIGNyYWNrZWQgaW5zdHJ1Y3Rpb25zICovCi0gIGlkZWNvZGVfY2FjaGUgaWNhY2hlW1dJVEhfSURFQ09ERV9DQUNIRV9TSVpFXTsKLSNlbmRpZgotCi0gIC8qIGFueSBpbnRlcnJ1cHQgc3RhdGUgKi8KLSAgaW50ZXJydXB0cyBpbnRzOwotCi0gIC8qIGFkZHJlc3MgcmVzZXJ2YXRpb246IGtlZXAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHRoZSBjb250ZW50cwotICAgICBvZiBtZW1vcnkgYXQgdGhhdCBhZGRyZXNzICovCi0gIG1lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbjsKLQotICAvKiBvZmZzZXQgZnJvbSBldmVudCB0aW1lIHRvIHRoaXMgY3B1J3MgaWRlYSBvZiB0aGUgbG9jYWwgdGltZSAqLwotICBzaWduZWQ2NCB0aW1lX2Jhc2VfbG9jYWxfdGltZTsKLSAgc2lnbmVkNjQgZGVjcmVtZW50ZXJfbG9jYWxfdGltZTsKLSAgZXZlbnRfZW50cnlfdGFnIGRlY3JlbWVudGVyX2V2ZW50OwotCi19OwotCi1JTkxJTkVfQ1BVXAotKGNwdSAqKQotY3B1X2NyZWF0ZShwc2ltICpzeXN0ZW0sCi0JICAgY29yZSAqbWVtb3J5LAotCSAgIGNwdV9tb24gKm1vbml0b3IsCi0JICAgb3NfZW11bCAqb3NfZW11bGF0aW9uLAotCSAgIGludCBjcHVfbnIpCi17Ci0gIGNwdSAqcHJvY2Vzc29yID0gWkFMTE9DKGNwdSk7Ci0KLSAgLyogY3JlYXRlIHRoZSB2aXJ0dWFsIG1lbW9yeSBtYXAgZnJvbSB0aGUgY29yZSAqLwotICBwcm9jZXNzb3ItPnBoeXNpY2FsID0gbWVtb3J5OwotICBwcm9jZXNzb3ItPnZpcnR1YWwgPSB2bV9jcmVhdGUobWVtb3J5KTsKLSAgcHJvY2Vzc29yLT5pbnN0cnVjdGlvbl9tYXAgPSB2bV9jcmVhdGVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3Nvci0+dmlydHVhbCk7Ci0gIHByb2Nlc3Nvci0+ZGF0YV9tYXAgPSB2bV9jcmVhdGVfZGF0YV9tYXAocHJvY2Vzc29yLT52aXJ0dWFsKTsKLQotICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCi0gICAgcHJvY2Vzc29yLT5tb2RlbF9wdHIgPSBtb2RlbF9jcmVhdGUgKHByb2Nlc3Nvcik7Ci0KLSAgLyogbGluayBiYWNrIHRvIGNvcmUgc3lzdGVtICovCi0gIHByb2Nlc3Nvci0+c3lzdGVtID0gc3lzdGVtOwotICBwcm9jZXNzb3ItPmV2ZW50cyA9IHBzaW1fZXZlbnRfcXVldWUoc3lzdGVtKTsKLSAgcHJvY2Vzc29yLT5jcHVfbnIgPSBjcHVfbnI7Ci0gIHByb2Nlc3Nvci0+bW9uaXRvciA9IG1vbml0b3I7Ci0gIHByb2Nlc3Nvci0+b3NfZW11bGF0aW9uID0gb3NfZW11bGF0aW9uOwotCi0gIHJldHVybiBwcm9jZXNzb3I7Ci19Ci0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X2luaXQoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIG1lbXNldCgmcHJvY2Vzc29yLT5yZWdzLCAwLCBzaXplb2YocHJvY2Vzc29yLT5yZWdzKSk7Ci0gIC8qIHZtIGluaXQgaXMgZGVsYXllZCB1bnRpbCBhZnRlciB0aGUgZGV2aWNlIHRyZWUgaGFzIGJlZW4gaW5pdCBhcwotICAgICB0aGUgZGV2aWNlcyBtYXkgZnVydGhlciBpbml0IHRoZSBjcHUgKi8KLSAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQotICAgIG1vZGVsX2luaXQgKHByb2Nlc3Nvci0+bW9kZWxfcHRyKTsKLX0KLQotCi0vKiBmaW5kIG9uZXMgd2F5IGhvbWUgKi8KLQotSU5MSU5FX0NQVVwKLShwc2ltICopCi1jcHVfc3lzdGVtKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gcHJvY2Vzc29yLT5zeXN0ZW07Ci19Ci0KLUlOTElORV9DUFVcCi0oaW50KQotY3B1X25yKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gcHJvY2Vzc29yLT5jcHVfbnI7Ci19Ci0KLUlOTElORV9DUFVcCi0oY3B1X21vbiAqKQotY3B1X21vbml0b3IoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIHJldHVybiBwcm9jZXNzb3ItPm1vbml0b3I7Ci19Ci0KLUlOTElORV9DUFVcCi0ob3NfZW11bCAqKQotY3B1X29zX2VtdWxhdGlvbihjcHUgKnByb2Nlc3NvcikKLXsKLSAgcmV0dXJuIHByb2Nlc3Nvci0+b3NfZW11bGF0aW9uOwotfQotCi1JTkxJTkVfQ1BVXAotKG1vZGVsX2RhdGEgKikKLWNwdV9tb2RlbChjcHUgKnByb2Nlc3NvcikKLXsKLSAgcmV0dXJuIHByb2Nlc3Nvci0+bW9kZWxfcHRyOwotfQotCi0KLS8qIHByb2dyYW0gY291bnRlciBtYW5pcHVsYXRpb24gKi8KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIoY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIG5ld19wcm9ncmFtX2NvdW50ZXIpCi17Ci0gIHByb2Nlc3Nvci0+cHJvZ3JhbV9jb3VudGVyID0gbmV3X3Byb2dyYW1fY291bnRlcjsKLX0KLQotSU5MSU5FX0NQVVwKLSh1bnNpZ25lZF93b3JkKQotY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIHJldHVybiBwcm9jZXNzb3ItPnByb2dyYW1fY291bnRlcjsKLX0KLQotCi1JTkxJTkVfQ1BVXAotKHZvaWQpCi1jcHVfcmVzdGFydChjcHUgKnByb2Nlc3NvciwKLQkgICAgdW5zaWduZWRfd29yZCBuaWEpCi17Ci0gIEFTU0VSVChwcm9jZXNzb3IgIT0gTlVMTCk7Ci0gIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKLSAgcHNpbV9yZXN0YXJ0KHByb2Nlc3Nvci0+c3lzdGVtLCBwcm9jZXNzb3ItPmNwdV9ucik7Ci19Ci0KLUlOTElORV9DUFVcCi0odm9pZCkKLWNwdV9oYWx0KGNwdSAqcHJvY2Vzc29yLAotCSB1bnNpZ25lZF93b3JkIG5pYSwKLQkgc3RvcF9yZWFzb24gcmVhc29uLAotCSBpbnQgc2lnbmFsKQotewotICBBU1NFUlQocHJvY2Vzc29yICE9IE5VTEwpOwotICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCi0gICAgbW9kZWxfaGFsdChwcm9jZXNzb3ItPm1vZGVsX3B0cik7Ci0gIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKLSAgcHNpbV9oYWx0KHByb2Nlc3Nvci0+c3lzdGVtLCBwcm9jZXNzb3ItPmNwdV9uciwgcmVhc29uLCBzaWduYWwpOwotfQotCi1FWFRFUk5fQ1BVXAotKHZvaWQpCi1jcHVfZXJyb3IoY3B1ICpwcm9jZXNzb3IsCi0JICB1bnNpZ25lZF93b3JkIGNpYSwKLQkgIGNvbnN0IGNoYXIgKmZtdCwKLQkgIC4uLikKLXsKLSAgY2hhciBtZXNzYWdlWzEwMjRdOwotICB2YV9saXN0IGFwOwotCi0gIC8qIGZvcm1hdCB0aGUgbWVzc2FnZSAqLwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgdnNwcmludGYobWVzc2FnZSwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmIChzdHJsZW4obWVzc2FnZSkgPj0gc2l6ZW9mKG1lc3NhZ2UpKQotICAgIGVycm9yKCJjcHVfZXJyb3I6IGJ1ZmZlciBvdmVyZmxvdyIpOwotCi0gIGlmIChwcm9jZXNzb3IgIT0gTlVMTCkgewotICAgIHByaW50Zl9maWx0ZXJlZCgiY3B1ICVkLCBjaWEgMHglbHg6ICVzXG4iLAotCQkgICAgcHJvY2Vzc29yLT5jcHVfbnIgKyAxLCAodW5zaWduZWQgbG9uZyljaWEsIG1lc3NhZ2UpOwotICAgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfc2lnbmFsbGVkLCAtMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZXJyb3IoImNwdTogJXMiLCBtZXNzYWdlKTsKLSAgfQotfQotCi0KLS8qIFRoZSBwcm9jZXNzb3JzIGxvY2FsIGNvbmNlcHQgb2YgdGltZSAqLwotCi1JTkxJTkVfQ1BVXAotKHNpZ25lZDY0KQotY3B1X2dldF90aW1lX2Jhc2UoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIHJldHVybiAoZXZlbnRfcXVldWVfdGltZShwcm9jZXNzb3ItPmV2ZW50cykKLQkgIC0gcHJvY2Vzc29yLT50aW1lX2Jhc2VfbG9jYWxfdGltZSk7Ci19Ci0KLUlOTElORV9DUFVcCi0odm9pZCkKLWNwdV9zZXRfdGltZV9iYXNlKGNwdSAqcHJvY2Vzc29yLAotCQkgIHNpZ25lZDY0IHRpbWVfYmFzZSkKLXsKLSAgcHJvY2Vzc29yLT50aW1lX2Jhc2VfbG9jYWxfdGltZSA9IChldmVudF9xdWV1ZV90aW1lKHByb2Nlc3Nvci0+ZXZlbnRzKQotCQkJCSAgICAgLSB0aW1lX2Jhc2UpOwotfQotCi1JTkxJTkVfQ1BVXAotKHNpZ25lZDMyKQotY3B1X2dldF9kZWNyZW1lbnRlcihjcHUgKnByb2Nlc3NvcikKLXsKLSAgcmV0dXJuIChwcm9jZXNzb3ItPmRlY3JlbWVudGVyX2xvY2FsX3RpbWUKLQkgIC0gZXZlbnRfcXVldWVfdGltZShwcm9jZXNzb3ItPmV2ZW50cykpOwotfQotCi1TVEFUSUNfSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X2RlY3JlbWVudF9ldmVudCh2b2lkICpkYXRhKQotewotICBjcHUgKnByb2Nlc3NvciA9IChjcHUqKWRhdGE7Ci0gIHByb2Nlc3Nvci0+ZGVjcmVtZW50ZXJfZXZlbnQgPSBOVUxMOwotICBkZWNyZW1lbnRlcl9pbnRlcnJ1cHQocHJvY2Vzc29yKTsKLX0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X3NldF9kZWNyZW1lbnRlcihjcHUgKnByb2Nlc3NvciwKLQkJICAgIHNpZ25lZDMyIGRlY3JlbWVudGVyKQotewotICBzaWduZWQ2NCBvbGRfZGVjcmVtZW50ZXIgPSBjcHVfZ2V0X2RlY3JlbWVudGVyKHByb2Nlc3Nvcik7Ci0gIGV2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUocHJvY2Vzc29yLT5ldmVudHMsIHByb2Nlc3Nvci0+ZGVjcmVtZW50ZXJfZXZlbnQpOwotICBwcm9jZXNzb3ItPmRlY3JlbWVudGVyX2V2ZW50ID0gTlVMTDsKLSAgcHJvY2Vzc29yLT5kZWNyZW1lbnRlcl9sb2NhbF90aW1lID0gKGV2ZW50X3F1ZXVlX3RpbWUocHJvY2Vzc29yLT5ldmVudHMpCi0JCQkJICAgICAgICsgZGVjcmVtZW50ZXIpOwotICBpZiAoZGVjcmVtZW50ZXIgPCAwICYmIG9sZF9kZWNyZW1lbnRlciA+PSAwKQotICAgIC8qIEEgZGVjcmVtZW50ZXIgaW50ZXJydXB0IG9jY3VyZXMgaWYgdGhlIHNpZ24gb2YgdGhlIGRlY3JlbWVudAotICAgICAgIHJlZ2lzdGVyIGlzIGNoYW5nZWQgZnJvbSBwb3NpdGl2ZSB0byBuZWdhdGl2ZSBieSB0aGUgbG9hZAotICAgICAgIGluc3RydWN0aW9uICovCi0gICAgZGVjcmVtZW50ZXJfaW50ZXJydXB0KHByb2Nlc3Nvcik7Ci0gIGVsc2UgaWYgKGRlY3JlbWVudGVyID49IDApCi0gICAgcHJvY2Vzc29yLT5kZWNyZW1lbnRlcl9ldmVudCA9IGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHByb2Nlc3Nvci0+ZXZlbnRzLAotCQkJCQkJCWRlY3JlbWVudGVyLAotCQkJCQkJCWNwdV9kZWNyZW1lbnRfZXZlbnQsCi0JCQkJCQkJcHJvY2Vzc29yKTsKLX0KLQotCi0jaWYgV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUKLS8qIGFsbG93IGFjY2VzcyB0byB0aGUgY3B1J3MgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KLUlOTElORV9DUFVcCi0oaWRlY29kZV9jYWNoZSAqKQotY3B1X2ljYWNoZV9lbnRyeShjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICByZXR1cm4gJnByb2Nlc3Nvci0+aWNhY2hlW2NpYSAvIDQgJSBXSVRIX0lERUNPREVfQ0FDSEVfU0laRV07Ci19Ci0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X2ZsdXNoX2ljYWNoZShjcHUgKnByb2Nlc3NvcikKLXsKLSAgaW50IGk7Ci0gIC8qIGZvcmNlIGFsbCBhZGRyZXNzZXMgdG8gMHhmZi4uLiBzbyB0aGF0IHRoZXkgbmV2ZXIgaGl0ICovCi0gIGZvciAoaSA9IDA7IGkgPCBXSVRIX0lERUNPREVfQ0FDSEVfU0laRTsgaSsrKQotICAgIHByb2Nlc3Nvci0+aWNhY2hlW2ldLmFkZHJlc3MgPSBNQVNLKDAsIDYzKTsKLX0KLSNlbmRpZgotCi0KLS8qIGFkZHJlc3MgbWFwIHJldmVsYXRpb24gKi8KLQotSU5MSU5FX0NQVVwKLSh2bV9pbnN0cnVjdGlvbl9tYXAgKikKLWNwdV9pbnN0cnVjdGlvbl9tYXAoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIHJldHVybiBwcm9jZXNzb3ItPmluc3RydWN0aW9uX21hcDsKLX0KLQotSU5MSU5FX0NQVVwKLSh2bV9kYXRhX21hcCAqKQotY3B1X2RhdGFfbWFwKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gcHJvY2Vzc29yLT5kYXRhX21hcDsKLX0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkoY3B1ICpwcm9jZXNzb3IsCi0JCQkgICAgICB1bnNpZ25lZF93b3JkIGVhKQotewotICB2bV9wYWdlX3RsYl9pbnZhbGlkYXRlX2VudHJ5KHByb2Nlc3Nvci0+dmlydHVhbCwgZWEpOwotfQotCi1JTkxJTkVfQ1BVXAotKHZvaWQpCi1jcHVfcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwoY3B1ICpwcm9jZXNzb3IpCi17Ci0gIHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKHByb2Nlc3Nvci0+dmlydHVhbCk7Ci19Ci0KLQotLyogaW50ZXJydXB0IGFjY2VzcyAqLwotCi1JTkxJTkVfQ1BVXAotKGludGVycnVwdHMgKikKLWNwdV9pbnRlcnJ1cHRzKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gJnByb2Nlc3Nvci0+aW50czsKLX0KLQotCi0KLS8qIHJlc2VydmF0aW9uIGFjY2VzcyAqLwotCi1JTkxJTkVfQ1BVXAotKG1lbW9yeV9yZXNlcnZhdGlvbiAqKQotY3B1X3Jlc2VydmF0aW9uKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gJnByb2Nlc3Nvci0+cmVzZXJ2YXRpb247Ci19Ci0KLQotLyogcmVnaXN0ZXIgYWNjZXNzICovCi0KLUlOTElORV9DUFVcCi0ocmVnaXN0ZXJzICopCi1jcHVfcmVnaXN0ZXJzKGNwdSAqcHJvY2Vzc29yKQotewotICByZXR1cm4gJnByb2Nlc3Nvci0+cmVnczsKLX0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKQotY3B1X3N5bmNocm9uaXplX2NvbnRleHQoY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSNpZiAoV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUpCi0gIC8qIGtpbGwgb2YgdGhlIGNhY2hlICovCi0gIGNwdV9mbHVzaF9pY2FjaGUocHJvY2Vzc29yKTsKLSNlbmRpZgotCi0gIC8qIHVwZGF0ZSB2aXJ0dWFsIG1lbW9yeSAqLwotICB2bV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3Nvci0+dmlydHVhbCwKLQkJCSBwcm9jZXNzb3ItPnJlZ3Muc3ByLAotCQkJIHByb2Nlc3Nvci0+cmVncy5zciwKLQkJCSBwcm9jZXNzb3ItPnJlZ3MubXNyLAotCQkJIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi0vKiBtaWdodCBhZ2FpbiBiZSB1c2VmdWwgb25lIGRheSAqLwotCi1JTkxJTkVfQ1BVXAotKHZvaWQpCi1jcHVfcHJpbnRfaW5mbyhjcHUgKnByb2Nlc3NvciwgaW50IHZlcmJvc2UpCi17Ci19Ci0KLSNlbmRpZiAvKiBfQ1BVX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NwdS5oIGIvc2ltL3BwYy9jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwZjU4MS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2NwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0NQVV9IXwotI2RlZmluZSBfQ1BVX0hfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLSNpbmNsdWRlICJyZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInZtLmgiCi0jaW5jbHVkZSAiZXZlbnRzLmgiCi0jaW5jbHVkZSAiaW50ZXJydXB0cy5oIgotI2luY2x1ZGUgInBzaW0uaCIKLSNpbmNsdWRlICJpZGVjb2RlLmgiCi0jaW5jbHVkZSAiaXRhYmxlLmgiCi0jaW5jbHVkZSAib3NfZW11bC5oIgotI2luY2x1ZGUgIm1vbi5oIgotI2luY2x1ZGUgIm1vZGVsLmgiCi0KLSNpZm5kZWYgQ09OU1RfQVRUUklCVVRFCi0jZGVmaW5lIENPTlNUX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKQotI2VuZGlmCi0KLS8qIHR5cGVkZWYgc3RydWN0IF9jcHUgY3B1OwotCi0gICBEZWNsYXJlZCBpbiBiYXNpY3MuaCBiZWNhdXNlIGl0IGlzIHVzZWQgb3BhcXVlbHkgdGhyb3VnaG91dCB0aGUKLSAgIGNvZGUgKi8KLQotCi0vKiBDcmVhdGUgYSBjcHUgb2JqZWN0ICovCi0KLUlOTElORV9DUFVcCi0oY3B1ICopIGNwdV9jcmVhdGUKLShwc2ltICpzeXN0ZW0sCi0gY29yZSAqbWVtb3J5LAotIGNwdV9tb24gKm1vbml0b3IsCi0gb3NfZW11bCAqY3B1X2VtdWxhdGlvbiwKLSBpbnQgY3B1X25yKTsKLQotSU5MSU5FX0NQVVwKLSh2b2lkKSBjcHVfaW5pdAotKGNwdSAqcHJvY2Vzc29yKTsKLQotLyogRmluZCBvdXIgd2F5IGhvbWUgKi8KLQotSU5MSU5FX0NQVVwKLShwc2ltICopIGNwdV9zeXN0ZW0KLShjcHUgKnByb2Nlc3NvcikgQ09OU1RfQVRUUklCVVRFOwotCi1JTkxJTkVfQ1BVXAotKGNwdV9tb24gKikgY3B1X21vbml0b3IKLShjcHUgKnByb2Nlc3NvcikgQ09OU1RfQVRUUklCVVRFOwotCi1JTkxJTkVfQ1BVXAotKG9zX2VtdWwgKikgY3B1X29zX2VtdWxhdGlvbgotKGNwdSAqcHJvY2Vzc29yKTsKLQotSU5MSU5FX0NQVVwKLShpbnQpIGNwdV9ucgotKGNwdSAqcHJvY2Vzc29yKSBDT05TVF9BVFRSSUJVVEU7Ci0KLQotLyogbWFuaXB1bGF0ZSB0aGUgcHJvY2Vzc29ycyBwcm9ncmFtIGNvdW50ZXIgYW5kIGV4ZWN1dGlvbiBzdGF0ZS4KLQotICAgVGhlIHByb2dyYW0gY291bnRlciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlZ2lzdGVyIGZpbGUuICBJbnN0ZWFkCi0gICBpdCBpcyBleHRyYWN0ZWQgYW5kIHRoZW4gbGF0ZXIgcmVzdG9yZWQgKHNldCwgcmVzZXQsIGhhbHQpLiAgVGhpcwotICAgaXMgdG8gZ2l2ZSB0aGUgdXNlciBvZiB0aGUgY3B1IChhbmQgdGhlIGNvbXBpbGVyKSB0aGUgY2hhbmNlIHRvCi0gICBtaW5pbWl6ZSB0aGUgbmVlZCB0byBsb2FkL3N0b3JlIHRoZSBjcHUncyBQQyB2YWx1ZS4gIChFc3BlY2lhbGx5IGluCi0gICB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwcm9jZXNzb3IpICovCi0KLUlOTElORV9DUFVcCi0odm9pZCkgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIG5ld19wcm9ncmFtX2NvdW50ZXIpOwotCi1JTkxJTkVfQ1BVXAotKHVuc2lnbmVkX3dvcmQpIGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyCi0oY3B1ICpwcm9jZXNzb3IpOwotCi1JTkxJTkVfQ1BVXAotKHZvaWQpIGNwdV9yZXN0YXJ0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBuaWEpOwotCi1JTkxJTkVfQ1BVXAotKHZvaWQpIGNwdV9oYWx0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBuaWEsCi0gc3RvcF9yZWFzb24gcmVhc29uLAotIGludCBzaWduYWwpOwotCi1FWFRFUk5fQ1BVXAotKHZvaWQpIGNwdV9lcnJvcgotKGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKLQotCi0vKiBUaGUgcHJvY2Vzc29ycyBsb2NhbCBjb25jZXB0IG9mIHRpbWUgKi8KLQotSU5MSU5FX0NQVVwKLShzaWduZWQ2NCkgY3B1X2dldF90aW1lX2Jhc2UKLShjcHUgKnByb2Nlc3Nvcik7Ci0KLUlOTElORV9DUFVcCi0odm9pZCkgY3B1X3NldF90aW1lX2Jhc2UKLShjcHUgKnByb2Nlc3NvciwKLSBzaWduZWQ2NCB0aW1lX2Jhc2UpOwotCi1JTkxJTkVfQ1BVXAotKHNpZ25lZDMyKSBjcHVfZ2V0X2RlY3JlbWVudGVyCi0oY3B1ICpwcm9jZXNzb3IpOwotCi1JTkxJTkVfQ1BVXAotKHZvaWQpIGNwdV9zZXRfZGVjcmVtZW50ZXIKLShjcHUgKnByb2Nlc3NvciwKLSBzaWduZWQzMiBkZWNyZW1lbnRlcik7Ci0KLQotI2lmIFdJVEhfSURFQ09ERV9DQUNIRV9TSVpFCi0vKiBSZXR1cm4gdGhlIGNhY2hlIGVudHJ5IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gQ0lBLiAgTm8gZ3VhcmVudGVlCi0gICB0aGF0IHRoZSBjYWNoZSBlbnRyeSBhY3R1YWxseSBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoYXQKLSAgIGFkZHJlc3MgKi8KLQotSU5MSU5FX0NQVVwKLShpZGVjb2RlX2NhY2hlKSAqY3B1X2ljYWNoZV9lbnRyeQotKGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotSU5MSU5FX0NQVVwKLSh2b2lkKSBjcHVfZmx1c2hfaWNhY2hlCi0oY3B1ICpwcm9jZXNzb3IpOwotI2VuZGlmCi0KLQotLyogcmV2ZWFsIHRoZSBwcm9jZXNzb3JzIFZNOgotCi0gICBBdCBmaXJzdCBzaWdodCBpdCBtYXkgc2VlbSBiZXR0ZXIgdG8sIGluc3RlYWQgb2YgZXhwb3NpbmcgdGhlIGNwdSdzCi0gICBpbm5lciB2bSBtYXBzLCB0byBoYXZlIHRoZSBjcHUgaXRzIHNlbGYgcHJvdmlkZSBtZW1vcnkgbWFuaXB1bGF0aW9uCi0gICBmdW5jdGlvbnMuIChlZyBjcHVfaW5zdHJ1Y3Rpb25fZmV0Y2goKSBjcHVfZGF0YV9yZWFkXzQoKSkKLQotICAgVW5mb3J0dW5hdGx5IGluIGFkZGl0aW9uIHRvIHRoZXNlIGZ1bmN0aW9ucyBpcyB0aGUgbmVlZCAoZm9yIHRoZQotICAgZGVidWdnZXIpIHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0byBtZW1vcnkgaW4gd2F5cyB0aGF0IHZpb2xhdGUKLSAgIHRoZSB2bSBwcm90ZWN0aW9uIChlZyBzdG9yZSBicmVha3BvaW50IGluc3RydWN0aW9uIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24gbWFwKS4gKi8KLQotSU5MSU5FX0NQVVwKLSh2bV9kYXRhX21hcCAqKSBjcHVfZGF0YV9tYXAKLShjcHUgKnByb2Nlc3Nvcik7Ci0KLUlOTElORV9DUFVcCi0odm1faW5zdHJ1Y3Rpb25fbWFwICopIGNwdV9pbnN0cnVjdGlvbl9tYXAKLShjcHUgKnByb2Nlc3Nvcik7Ci0KLUlOTElORV9DUFVcCi0odm9pZCkgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGVhKTsKLQotSU5MSU5FX0NQVVwKLSh2b2lkKSBjcHVfcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwKLShjcHUgKnByb2Nlc3Nvcik7Ci0KLQotLyogcmV2ZWFsIHRoZSBwcm9jZXNzb3JzIGludGVycnVwdCBzdGF0ZSAqLwotCi1JTkxJTkVfQ1BVXAotKGludGVycnVwdHMgKikgY3B1X2ludGVycnVwdHMKLShjcHUgKnByb2Nlc3Nvcik7Ci0KLQotLyogZ3JhbnQgYWNjZXNzIHRvIHRoZSByZXNlcnZhdGlvbiBpbmZvcm1hdGlvbiAqLwotCi10eXBlZGVmIHN0cnVjdCBfbWVtb3J5X3Jlc2VydmF0aW9uIHsKLSAgaW50IHZhbGlkOwotICB1bnNpZ25lZF93b3JkIGFkZHI7Ci0gIHVuc2lnbmVkX3dvcmQgZGF0YTsKLX0gbWVtb3J5X3Jlc2VydmF0aW9uOwotCi1JTkxJTkVfQ1BVXAotKG1lbW9yeV9yZXNlcnZhdGlvbiAqKSBjcHVfcmVzZXJ2YXRpb24KLShjcHUgKnByb2Nlc3Nvcik7Ci0KLQotLyogUmVnaXN0ZXJzOgotCi0gICBUaGlzIG1vZGVsIGV4cGxvaXRzIHRoZSBQb3dlclBDJ3MgcmVxdWlyZW1lbnQgZm9yIGEgc3luY2hyb25pemF0aW9uCi0gICB0byBvY2N1cmUgYWZ0ZXIgKG9yIGJlZm9yZSkgdGhlIHVwZGF0ZSBvZiBhbnkgY29udGV4dCBjb250cm9sbGluZwotICAgcmVnaXN0ZXIuICBBbGwgY29udGV4dCBzeW5jIHBvaW50cyBtdXN0IGNhbGwgdGhlIHN5bmMgZnVuY3Rpb24KLSAgIGJlbG93IHRvIHdoZW4gZXZlciBhIHN5bmNocm9uaXphdGlvbiBwb2ludCBpcyByZWFjaGVkICovCi0KLUlOTElORV9DUFVcCi0ocmVnaXN0ZXJzICopIGNwdV9yZWdpc3RlcnMKLShjcHUgKnByb2Nlc3NvcikgQ09OU1RfQVRUUklCVVRFOwotCi1JTkxJTkVfQ1BVXAotKHZvaWQpIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi0jZGVmaW5lIElTX1BST0JMRU1fU1RBVEUoUFJPQ0VTU09SKSBcCi0oQ1VSUkVOVF9FTlZJUk9OTUVOVCA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQgXAotID8gKGNwdV9yZWdpc3RlcnMoUFJPQ0VTU09SKS0+bXNyICYgbXNyX3Byb2JsZW1fc3RhdGUpIFwKLSA6IDEpCi0KLSNkZWZpbmUgSVNfNjRCSVRfTU9ERShQUk9DRVNTT1IpIFwKLShXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgXAotID8gKENVUlJFTlRfRU5WSVJPTk1FTlQgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UIFwKLSAgICA/IChjcHVfcmVnaXN0ZXJzKFBST0NFU1NPUiktPm1zciAmIG1zcl82NGJpdF9tb2RlKSBcCi0gICAgOiAxKSBcCi0gOiAwKQotCi0jZGVmaW5lIElTX0ZQX0FWQUlMQUJMRShQUk9DRVNTT1IpIFwKLShDVVJSRU5UX0VOVklST05NRU5UID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCBcCi0gPyAoY3B1X3JlZ2lzdGVycyhQUk9DRVNTT1IpLT5tc3IgJiBtc3JfZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlKSBcCi0gOiAxKQotCi0KLQotSU5MSU5FX0NQVVwKLSh2b2lkKSBjcHVfcHJpbnRfaW5mbwotKGNwdSAqcHJvY2Vzc29yLAotIGludCB2ZXJib3NlKTsKLQotSU5MSU5FX0NQVVwKLShtb2RlbF9kYXRhICopIGNwdV9tb2RlbAotKGNwdSAqcHJvY2Vzc29yKSBDT05TVF9BVFRSSUJVVEU7Ci0KLQotI2lmIChDUFVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGluY2x1ZGUgImNwdS5jIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kYy1jb21wbGV4IGIvc2ltL3BwYy9kYy1jb21wbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE1ODYxLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZGMtY29tcGxleAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMKLSMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotIwotIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLWFycmF5LG5vcm1hbDogICAgICAgIDA6IDU6IDA6IDU6Ci1hcnJheSxub3JtYWw6ICAgICAgIDIxOjMxOjMyOi0xOk9FLExSLEFBLFJjLExLOgotIyMKLSMjIEJyYW5jaCBDb25kaXRpb25hbCBpbnN0cnVjdGlvbiAtIEV4cGFuZCBCT3swOjR9Ci0jIwotYXJyYXksZXhwYW5kLWZvcmNlZDogNjoxMDogNjoxMDpCTzogICAgICAgICAgICAweGZjMDAwMDAwOjB4NDAwMDAwMDAKLSMjCi0jIyBFeHBhbmQgUkEgb24gZXF1YWxpdHkgd2l0aCAwIGluIEFkZCBpbnN0cnVjdGlvbnMgd2VyZSBpZihSQT09MCkgYXBwZWFycy4KLSMjCi0jIEFkZCBJbW1lZGlhdGUKLWFycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDM4MDAwMDAwOjAKLSMgQWRkIEltbWVkaWF0ZSBTaGlmdGVkCi1hcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHgzYzAwMDAwMDowCi0jIwotIyMgRGl0dG8gZm9yIGhpZ2ggZnJlcXVlbmN5IGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLgotIyMKLSMgU3RvcmUgQnl0ZQotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDk4MDAwMDAwOjAKLSMgU3RvcmUgV29yZAotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDkwMDAwMDAwOjAKLSMgTG9hZCBXb3JkIGFuZCBaZXJvCi0jYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4ODAwMDAwMDA6MAotIyMKLSMjIE1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIC0gTFI9OCBpcyBtdW5nZWQgaW50byAweDEwMCA9PSAyNTYKLSMjCi0jYXJyYXksYm9vbGVhbjogICAgICAxMToyMDoxMToyMDpTUFI6ICAgICAgICAgICAweGZjMDAwN2ZmOjB4N2MwMDAzYTY6MjU2Ci0jYXJyYXksYm9vbGVhbjogICAgICAxMToyMDoxMToyMDpTUFI6ICAgICAgICAgICAweGZjMDAwN2ZmOjB4N2MwMDAyYTY6MjU2Ci0jIwotIyMgQ29tcGFyZSBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gLSBzZXBhcmF0ZSBvdXQgTCA9PSAwIGFuZCBMID09IDEKLSMjCi0jIENvbXBhcmUgSW1tZWRpYXRlCi0jYXJyYXksbm9ybWFsOiAgICAgIDEwOjExOjEwOjExOkw6ICAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHgyYzAwMDAwMDowCi0jIwotIyMgTW92ZSB0by9mcm9tIFNQUiBpbnN0cnVjdGlvbnMgLSBzZXBhcmF0ZSBvdXQgTFIgY2FzZQotIyMKLSMgTW92ZSB0byBTUFIKLWFycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwM2E2OjI1NgotIyBNb3ZlIGZyb20gU1BSCi1hcnJheSxib29sZWFuOiAgICAgIDExOjIwOjExOjIwOlNQUjogICAgICAgICAgIDB4ZmMwMDA3ZmY6MHg3YzAwMDJhNjoyNTYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGMtc2ltcGxlIGIvc2ltL3BwYy9kYy1zaW1wbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTgyM2UuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9kYy1zaW1wbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jCi0jICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIENyZWF0ZSBhIHR3byBsZXZlbCBzd2l0Y2ggc3RhdGVtZW50LiAgVGhlIGZpcnN0IGxldmVsIGJyYW5jaGVzIG9uIGJpdHMKLSMgMC4uNSB3aGlsZSB0aGUgc2Vjb25kIGxldmVsIGJyYW5jaGVzIG9uIGJpdHMgMjEuLjMxCi0jCi1zd2l0Y2g6IDA6IDU6IDA6IDUKLXN3aXRjaDoyMTozMQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kYy1zdHVwaWQgYi9zaW0vcHBjL2RjLXN0dXBpZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzOGJkYi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2RjLXN0dXBpZAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMKLSMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotIwotIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLWFycmF5LG5vcm1hbDogMDogNTogMDogNToKLWFycmF5LG5vcm1hbDoyMTozMTozMjotMTpPRSxMUixBQSxSYyxMSzoKLSMjCi0jIyBCcmFuY2ggQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gLSBFeHBhbmQgQk97MDo0fSBvbmx5LCBpZ25vcmUgQk97NX0KLSMjCi1hcnJheSxleHBhbmQtZm9yY2VkOiA2OiA5OiA2OiA5OkJPOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg0MDAwMDAwMAotIyMKLSMjIEV4cGFuZCBSQSBvbiBlcXVhbGl0eSB3aXRoIDAgaW4gQWRkIGluc3RydWN0aW9ucyB3ZXJlIGlmKFJBPT0wKSBhcHBlYXJzLgotIyMKLSMgQWRkIEltbWVkaWF0ZQotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDM4MDAwMDAwOjAKLSMgQWRkIEltbWVkaWF0ZSBTaGlmdGVkCi0jYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4M2MwMDAwMDA6MAotIyMKLSMjIERpdHRvIGZvciBoaWdoIGZyZXF1ZW5jeSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4KLSMjCi0jIFN0b3JlIEJ5dGUKLSNhcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg5ODAwMDAwMDowCi0jIFN0b3JlIFdvcmQKLSNhcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg5MDAwMDAwMDowCi0jIExvYWQgV29yZCBhbmQgWmVybwotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDgwMDAwMDAwOjAKLSMjCi0jIyBNb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyAtIExSPTggaXMgbXVuZ2VkIGludG8gMHgxMDAgPT0gMjU2Ci0jIwotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwM2E2OjI1NgotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwMmE2OjI1NgotIyMKLSMjIENvbXBhcmUgSW1tZWRpYXRlIGluc3RydWN0aW9uIC0gc2VwYXJhdGUgb3V0IEwgPT0gMCBhbmQgTCA9PSAxCi0jIwotIyBDb21wYXJlIEltbWVkaWF0ZQotI2FycmF5LGJvb2xlYW46ICAgICAgMTA6MTE6MTA6MTE6TDogICAgICAgICAgICAgMHhmYzAwMDAwMDoweDJjMDAwMDAwOjAKLSMjCi0jIyBNb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyAtIHNlcGFyYXRlIG91dCBMUiBjYXNlCi0jIwotIyBNb3ZlIHRvIFNQUgotI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwM2E2OjI1NgotIyBNb3ZlIGZyb20gU1BSCi0jYXJyYXksYm9vbGVhbjogICAgICAxMToyMDoxMToyMDpTUFI6ICAgICAgICAgICAweGZjMDAwN2ZmOjB4N2MwMDAyYTY6MjU2CmRpZmYgLS1naXQgYS9zaW0vcHBjL2RjLXRlc3QuMDEgYi9zaW0vcHBjL2RjLXRlc3QuMDEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGMxNzUuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9kYy10ZXN0LjAxCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIDA6IDU6IDA6IDU6MDo6ICAgICAgICAgICAgICAyOjB4MDAwMDAwMDA6MHgwMDAwMDAwMDowCi0yMTozMTozMjotMTowOk9FLExSLEFBLFJjLExLOjA6MHgwMDAwMDAwMDoweDAwMDAwMDAwOjAKLSA2OiA5OiA2OiA5OjA6Qk86ICAgICAgICAgICAgMDoweGZjMDAwMDAwOjB4NDAwMDAwMDA6MQotMTE6MTU6MTE6MTU6MDpSQTogICAgICAgICAgICAxOjB4ZmMwMDAwMDA6MHgzODAwMDAwMDoyCi0xMToxNToxMToxNTowOlJBOiAgICAgICAgICAgIDE6MHhmYzAwMDAwMDoweDNjMDAwMDAwOjIKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGMtdGVzdC4wMiBiL3NpbS9wcGMvZGMtdGVzdC4wMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ZDBhNy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2RjLXRlc3QuMDIKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0gMDogNTogMDogNTowOjogICAgICAgICAgICAgIDA6MHgwMDAwMDAwMDoweDAwMDAwMDAwOjAKLTIxOjMxOjMyOi0xOjA6T0UsTFIsQUEsUmMsTEs6MDoweDAwMDAwMDAwOjB4MDAwMDAwMDA6MAotIDY6IDk6IDY6IDk6MDpCTzogICAgICAgICAgICAwOjB4ZmMwMDAwMDA6MHg0MDAwMDAwMDoxCi0xMToxNToxMToxNTowOlJBOiAgICAgICAgICAgIDE6MHhmYzAwMDAwMDoweDM4MDAwMDAwOjIKLTExOjE1OjExOjE1OjA6UkE6ICAgICAgICAgICAgMToweGZjMDAwMDAwOjB4M2MwMDAwMDA6MgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kZWJ1Zy5jIGIvc2ltL3BwYy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTMxZDFlLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9ERUJVR19DXwotI2RlZmluZSBfREVCVUdfQ18KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImJhc2ljcy5oIgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLWludCBwcGNfdHJhY2VbbnJfdHJhY2Vfb3B0aW9uc107Ci0KLXR5cGVkZWYgc3RydWN0IF90cmFjZV9vcHRpb25fZGVzY3JpcHRvciB7Ci0gIHRyYWNlX29wdGlvbnMgb3B0aW9uOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKLX0gdHJhY2Vfb3B0aW9uX2Rlc2NyaXB0b3I7Ci0KLXN0YXRpYyB0cmFjZV9vcHRpb25fZGVzY3JpcHRvciB0cmFjZV9kZXNjcmlwdGlvbltdID0gewotICB7IHRyYWNlX2dkYiwgImdkYiIsICJjYWxscyBtYWRlIGJ5IGdkYiB0byB0aGUgc2ltX2NhbGxzLmMgZmlsZSIgfSwKLSAgeyB0cmFjZV9vc19lbXVsLCAib3MtZW11bCIsICJWRUEgbW9kZSBzeXRlbSBjYWxscyAtIGxpa2Ugc3RyYWNlIiB9LAotICB7IHRyYWNlX2V2ZW50cywgImV2ZW50cyIsICJldmVudCBxdWV1ZSBoYW5kbGluZyIgfSwKLSAgLyogZGVjb2RlL2lzc3VlICovCi0gIHsgdHJhY2Vfc2VtYW50aWNzLCAic2VtYW50aWNzIiwgIkluc3RydWN0aW9uIGV4ZWN1dGlvbiAoaXNzdWUpIiB9LAotICB7IHRyYWNlX2lkZWNvZGUsICJpZGVjb2RlIiwgImluc3RydWN0aW9uIGRlY29kZSAod2hlbiBtaXNzIGluIGljYWNoZSkiIH0sCi0gIHsgdHJhY2VfYWx1LCAiYWx1IiwgInJlc3VsdHMgb2YgaW50ZWdlciBBTFUiIH0sCi0gIHsgdHJhY2Vfdm0sICJ2bSIsICJPRUEgYWRkcmVzcyB0cmFuc2xhdGlvbiIgfSwKLSAgeyB0cmFjZV9sb2FkX3N0b3JlLCAibG9hZC1zdG9yZSIsICJ0cmFuc2ZlcnMgYmV0d2VlbiByZWdpc3RlcnMgYW5kIG1lbW9yeSIgfSwKLSAgeyB0cmFjZV9tb2RlbCwgIm1vZGVsIiwgIm1vZGVsIHNwZWNpZmljIGluZm9ybWF0aW9uIiB9LAotICB7IHRyYWNlX2ludGVycnVwdHMsICJpbnRlcnJ1cHRzIiwgImludGVycnVwdCBoYW5kbGluZyIgfSwKLSAgLyogZGV2aWNlcyAqLwotICB7IHRyYWNlX2RldmljZV90cmVlLCAiZGV2aWNlLXRyZWUiLCAgfSwKLSAgeyB0cmFjZV9kZXZpY2VzLCAiZGV2aWNlcyIgfSwKLSAgeyB0cmFjZV9iaW5hcnlfZGV2aWNlLCAiYmluYXJ5LWRldmljZSIgfSwKLSAgeyB0cmFjZV9jb21fZGV2aWNlLCAiY29tLWRldmljZSIgfSwKLSAgeyB0cmFjZV9jb25zb2xlX2RldmljZSwgImNvbnNvbGUtZGV2aWNlIiB9LAotICB7IHRyYWNlX2NvcmVfZGV2aWNlLCAiY29yZS1kZXZpY2UiIH0sCi0gIHsgdHJhY2VfZGlza19kZXZpY2UsICJkaXNrLWRldmljZSIgfSwKLSAgeyB0cmFjZV9lZXByb21fZGV2aWNlLCAiZWVwcm9tLWRldmljZSIgfSwKLSAgeyB0cmFjZV9maWxlX2RldmljZSwgImZpbGUtZGV2aWNlIiB9LAotICB7IHRyYWNlX2dsdWVfZGV2aWNlLCAiZ2x1ZS1kZXZpY2UiIH0sCi0gIHsgdHJhY2VfaGFsdF9kZXZpY2UsICJoYWx0LWRldmljZSIgfSwKLSAgeyB0cmFjZV9odGFiX2RldmljZSwgImh0YWItZGV2aWNlIiB9LAotICB7IHRyYWNlX2ljdV9kZXZpY2UsICJpY3UtZGV2aWNlIiB9LAotICB7IHRyYWNlX2lkZV9kZXZpY2UsICJpZGUtZGV2aWNlIiB9LAotICB7IHRyYWNlX21lbW9yeV9kZXZpY2UsICJtZW1vcnktZGV2aWNlIiB9LAotICB7IHRyYWNlX29waWNfZGV2aWNlLCAib3BpYy1kZXZpY2UiIH0sCi0gIHsgdHJhY2VfcGFsX2RldmljZSwgInBhbC1kZXZpY2UiIH0sCi0gIHsgdHJhY2VfcGFzc19kZXZpY2UsICJwYXNzLWRldmljZSIgfSwKLSAgeyB0cmFjZV9waGJfZGV2aWNlLCAicGhiLWRldmljZSIgfSwKLSAgeyB0cmFjZV9yZWdpc3Rlcl9kZXZpY2UsICJyZWdpc3Rlci1kZXZpY2UiLCAiRGV2aWNlIGluaXRpYWxpemluZyByZWdpc3RlcnMiIH0sCi0gIHsgdHJhY2Vfc3RhY2tfZGV2aWNlLCAic3RhY2stZGV2aWNlIiB9LAotICB7IHRyYWNlX3ZtX2RldmljZSwgInZtLWRldmljZSIgfSwKLSAgLyogcGFja2FnZXMgKi8KLSAgeyB0cmFjZV9kaXNrbGFiZWxfcGFja2FnZSwgImRpc2tsYWJlbC1wYWNrYWdlIiB9LAotICAvKiBtaXNjICovCi0gIHsgdHJhY2VfcHJpbnRfaW5mbywgInByaW50LWluZm8iLCAiUHJpbnQgcGVyZm9ybWFuY2UgYW5hbHlzaXMgaW5mb3JtYXRpb24iIH0sCi0gIHsgdHJhY2Vfb3B0cywgIm9wdGlvbnMiLCAiUHJpbnQgb3B0aW9ucyBzaW11bGF0b3Igd2FzIGNvbXBpbGVkIHdpdGgiIH0sCi0gIC8qeyB0cmFjZV90YmQsICJ0YmQiLCAiVHJhY2UgYW55IG1pc3NpbmcgZmVhdHVyZXMiIH0sKi8KLSAgeyB0cmFjZV9wcmludF9kZXZpY2VfdHJlZSwgInByaW50LWRldmljZS10cmVlIiwgIk91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGRldmljZSB0cmVlIiB9LAotICB7IHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUsICJkdW1wLWRldmljZS10cmVlIiwgIk91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGRldmljZSB0cmVlIHRoZW4gZXhpdCIgfSwKLSAgLyogc2VudGluYWwgKi8KLSAgeyBucl90cmFjZV9vcHRpb25zLCBOVUxMIH0sCi19OwotCi1leHRlcm4gdm9pZAotdHJhY2Vfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdGlvbiwKLQkgICAgIGludCBzZXR0aW5nKQotewotICBpZiAoc3RyY21wKG9wdGlvbiwgImFsbCIpID09IDApIHsKLSAgICB0cmFjZV9vcHRpb25zIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5yX3RyYWNlX29wdGlvbnM7IGkrKykKLSAgICAgIGlmIChpICE9IHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUpIHsKLQlwcGNfdHJhY2VbaV0gPSBzZXR0aW5nOwotICAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAodHJhY2VfZGVzY3JpcHRpb25baV0ub3B0aW9uIDwgbnJfdHJhY2Vfb3B0aW9ucwotCSAgICYmIHN0cmNtcChvcHRpb24sIHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm5hbWUpICE9IDApCi0gICAgICBpKys7Ci0gICAgaWYgKHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm9wdGlvbiA8IG5yX3RyYWNlX29wdGlvbnMpCi0gICAgICBwcGNfdHJhY2VbdHJhY2VfZGVzY3JpcHRpb25baV0ub3B0aW9uXSA9IHNldHRpbmc7Ci0gICAgZWxzZSB7Ci0gICAgICBpID0gc3RydG91bChvcHRpb24sIDAsIDApOwotICAgICAgaWYgKGkgPiAwICYmIGkgPCBucl90cmFjZV9vcHRpb25zKQotCXBwY190cmFjZVtpXSA9IHNldHRpbmc7Ci0gICAgICBlbHNlCi0JZXJyb3IoIlVua25vd24gdHJhY2Ugb3B0aW9uOiAlc1xuIiwgb3B0aW9uKTsKLSAgICB9Ci0gICAgICAKLSAgfQotfQotCi0KLWV4dGVybiB2b2lkCi10cmFjZV91c2FnZShpbnQgdmVyYm9zZSkKLXsKLSAgaWYgKHZlcmJvc2UpIHsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJUaGUgZm9sbG93aW5nIGFyZSBwb3NzaWJsZSA8dHJhY2U+IG9wdGlvbnM6XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLSAgaWYgKHZlcmJvc2UgPT0gMSkgewotICAgIGludCBwb3M7Ci0gICAgaW50IGk7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIGFsbCIpOwotICAgIHBvcyA9IHN0cmxlbigiYWxsIikgKyAyOwotICAgIGZvciAoaSA9IDA7IHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm9wdGlvbiA8IG5yX3RyYWNlX29wdGlvbnM7IGkrKykgewotICAgICAgcG9zICs9IHN0cmxlbih0cmFjZV9kZXNjcmlwdGlvbltpXS5uYW1lKSArIDI7Ci0gICAgICBpZiAocG9zID4gNzUpIHsKLQlwb3MgPSBzdHJsZW4odHJhY2VfZGVzY3JpcHRpb25baV0ubmFtZSkgKyAyOwotCXByaW50Zl9maWx0ZXJlZCgiXG4iKTsKLSAgICAgIH0KLSAgICAgIHByaW50Zl9maWx0ZXJlZCgiICAlcyIsIHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm5hbWUpOwotICAgIH0KLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLSAgaWYgKHZlcmJvc2UgPiAxKSB7Ci0gICAgY29uc3QgY2hhciAqZm9ybWF0ID0gIlx0JS0xOHMlc1xuIjsKLSAgICBpbnQgaTsKLSAgICBwcmludGZfZmlsdGVyZWQoZm9ybWF0LCAiYWxsIiwgImVuYWJsZSBhbGwgdGhlIHRyYWNlIG9wdGlvbnMiKTsKLSAgICBmb3IgKGkgPSAwOyB0cmFjZV9kZXNjcmlwdGlvbltpXS5vcHRpb24gPCBucl90cmFjZV9vcHRpb25zOyBpKyspCi0gICAgICBwcmludGZfZmlsdGVyZWQoZm9ybWF0LAotCQkgICAgICB0cmFjZV9kZXNjcmlwdGlvbltpXS5uYW1lLAotCQkgICAgICAodHJhY2VfZGVzY3JpcHRpb25baV0uZGVzY3JpcHRpb24KLQkJICAgICAgID8gdHJhY2VfZGVzY3JpcHRpb25baV0uZGVzY3JpcHRpb24KLQkJICAgICAgIDogIiIpKTsKLSAgfQotfQotCi0jZW5kaWYgLyogX0RFQlVHX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RlYnVnLmggYi9zaW0vcHBjL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZGIzNmUuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0RFQlVHX0hfCi0jZGVmaW5lIF9ERUJVR19IXwotCi0jaW5jbHVkZSAiZmlsdGVyX2ZpbGVuYW1lLmgiCi0KLXR5cGVkZWYgZW51bSB7Ci0gIHRyYWNlX2ludmFsaWQsCi0gIHRyYWNlX3RiZCwKLSAgLyoqLwotICB0cmFjZV9nZGIsCi0gIHRyYWNlX29zX2VtdWwsCi0gIC8qKi8KLSAgdHJhY2VfZXZlbnRzLAotICB0cmFjZV9kZXZpY2VfdHJlZSwKLSAgdHJhY2VfZGV2aWNlcywKLSAgdHJhY2VfYmluYXJ5X2RldmljZSwKLSAgdHJhY2VfY29tX2RldmljZSwKLSAgdHJhY2VfY29uc29sZV9kZXZpY2UsCi0gIHRyYWNlX2NvcmVfZGV2aWNlLAotICB0cmFjZV9kaXNrX2RldmljZSwKLSAgdHJhY2VfZWVwcm9tX2RldmljZSwKLSAgdHJhY2VfZmlsZV9kZXZpY2UsCi0gIHRyYWNlX2dsdWVfZGV2aWNlLAotICB0cmFjZV9oYWx0X2RldmljZSwKLSAgdHJhY2VfaHRhYl9kZXZpY2UsCi0gIHRyYWNlX2ljdV9kZXZpY2UsCi0gIHRyYWNlX2lkZV9kZXZpY2UsCi0gIHRyYWNlX21lbW9yeV9kZXZpY2UsCi0gIHRyYWNlX29waWNfZGV2aWNlLAotICB0cmFjZV9wYWxfZGV2aWNlLAotICB0cmFjZV9wYXNzX2RldmljZSwKLSAgdHJhY2VfcGhiX2RldmljZSwKLSAgdHJhY2Vfc3RhY2tfZGV2aWNlLAotICB0cmFjZV9yZWdpc3Rlcl9kZXZpY2UsCi0gIHRyYWNlX3ZtX2RldmljZSwKLSAgLyoqLwotICB0cmFjZV9kaXNrbGFiZWxfcGFja2FnZSwKLSAgLyoqLwotICB0cmFjZV9zZW1hbnRpY3MsCi0gIHRyYWNlX2lkZWNvZGUsCi0gIHRyYWNlX2FsdSwKLSAgdHJhY2VfbG9hZF9zdG9yZSwKLSAgdHJhY2VfbW9kZWwsCi0gIC8qKi8KLSAgdHJhY2Vfdm0sCi0gIHRyYWNlX2NvcmUsCi0gIHRyYWNlX2ludGVycnVwdHMsCi0gIHRyYWNlX3BzaW0sCi0gIHRyYWNlX2RldmljZV9pbml0LAotICB0cmFjZV9jcHUsCi0gIHRyYWNlX2JyZWFrcG9pbnQsCi0gIHRyYWNlX29wdHMsCi0gIHRyYWNlX3ByaW50X2luZm8sCi0gIHRyYWNlX3ByaW50X2RldmljZV90cmVlLAotICB0cmFjZV9kdW1wX2RldmljZV90cmVlLAotICBucl90cmFjZV9vcHRpb25zCi19IHRyYWNlX29wdGlvbnM7Ci0KLQotCi1leHRlcm4gaW50IHBwY190cmFjZVtucl90cmFjZV9vcHRpb25zXTsKLQotLyogc2ltcGxlICovCi0jZGVmaW5lIFRSQUNFKE9CSkVDVCwgQVJHUykgXAotZG8geyBcCi0gIGlmIChXSVRIX1RSQUNFKSB7IFwKLSAgICBpZiAocHBjX3RyYWNlW09CSkVDVF0pIHsgXAotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlczolZDogIiwgZmlsdGVyX2ZpbGVuYW1lKF9fRklMRV9fKSwgX19MSU5FX18pOyBcCi0gICAgICBwcmludGZfZmlsdGVyZWQgQVJHUzsgXAotICAgIH0gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLS8qIGlzc3VlICovCi0jZGVmaW5lIElUUkFDRShPQkpFQ1QsIEFSR1MpIFwKLWRvIHsgXAotICBpZiAoV0lUSF9UUkFDRSkgeyBcCi0gICAgaWYgKHBwY190cmFjZVtPQkpFQ1RdKSB7IFwKLSAgICAgIHByaW50Zl9maWx0ZXJlZCgiJXM6JWQ6MHglMDhseDolcyAiLCBpdGFibGVbTVlfSU5ERVhdLmZpbGUsIGl0YWJsZVtNWV9JTkRFWF0ubGluZV9uciwgKGxvbmcpY2lhLCBpdGFibGVbTVlfSU5ERVhdLm5hbWUpOyBcCi0gICAgICBwcmludGZfZmlsdGVyZWQgQVJHUzsgXAotICAgIH0gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLS8qIGRldmljZSAqLwotI2RlZmluZSBEVFJBQ0UoT0JKRUNULCBBUkdTKSBcCi1kbyB7IFwKLSAgaWYgKFdJVEhfVFJBQ0UpIHsgXAotICAgIGludCB0cmFjZV9kZXZpY2UgPSBkZXZpY2VfdHJhY2UobWUpOyBcCi0gICAgaWYgKHBwY190cmFjZVt0cmFjZV9kZXZpY2VzXSBcCi0JfHwgcHBjX3RyYWNlW3RyYWNlXyMjT0JKRUNUIyNfZGV2aWNlXSBcCi0JfHwgdHJhY2VfZGV2aWNlKSB7IFwKLSAgICAgIHByaW50Zl9maWx0ZXJlZCgiJXM6JWQ6JXM6JXMlcyAiLCBcCi0JCSAgICAgIGZpbHRlcl9maWxlbmFtZShfX0ZJTEVfXyksIF9fTElORV9fLCAjT0JKRUNULCBcCi0JCSAgICAgIHRyYWNlX2RldmljZSA/IGRldmljZV9wYXRoKG1lKSA6ICIiLCBcCi0JCSAgICAgIHRyYWNlX2RldmljZSA/ICI6IiA6ICIiKTsgXAotICAgICAgcHJpbnRmX2ZpbHRlcmVkIEFSR1M7IFwKLSAgICB9IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0vKiBkZXZpY2UgaW5zdGFuY2UgKi8KLSNkZWZpbmUgRElUUkFDRShPQkpFQ1QsIEFSR1MpIFwKLWRvIHsgXAotICBpZiAoV0lUSF9UUkFDRSkgeyBcCi0gICAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOyBcCi0gICAgaW50IHRyYWNlX2RldmljZSA9IGRldmljZV90cmFjZShtZSk7IFwKLSAgICBpZiAocHBjX3RyYWNlW3RyYWNlX2RldmljZXNdIFwKLQl8fCBwcGNfdHJhY2VbdHJhY2VfIyNPQkpFQ1QjI19kZXZpY2VdIFwKLQl8fCB0cmFjZV9kZXZpY2UpIHsgXAotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlczolZDolczolcyVzICIsIFwKLQkJICAgICAgZmlsdGVyX2ZpbGVuYW1lKF9fRklMRV9fKSwgX19MSU5FX18sICNPQkpFQ1QsIFwKLQkJICAgICAgdHJhY2VfZGV2aWNlID8gZGV2aWNlX3BhdGgobWUpIDogIiIsIFwKLQkJICAgICAgdHJhY2VfZGV2aWNlID8gIjoiIDogIiIpOyBcCi0gICAgICBwcmludGZfZmlsdGVyZWQgQVJHUzsgXAotICAgIH0gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLS8qIHBhY2thZ2UgKi8KLSNkZWZpbmUgUFRSQUNFKE9CSkVDVCwgQVJHUykgXAotZG8geyBcCi0gIGlmIChXSVRIX1RSQUNFKSB7IFwKLSAgICBpZiAocHBjX3RyYWNlW3RyYWNlXyMjT0JKRUNUIyNfcGFja2FnZV0pIHsgXAotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlczolZDolczogIiwgZmlsdGVyX2ZpbGVuYW1lKF9fRklMRV9fKSwgX19MSU5FX18sICNPQkpFQ1QpOyBcCi0gICAgICBwcmludGZfZmlsdGVyZWQgQVJHUzsgXAotICAgIH0gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLQotI2RlZmluZSBBU1NFUlQoRVhQUkVTU0lPTikgXAotZG8geyBcCi0gIGlmIChXSVRIX0FTU0VSVCkgeyBcCi0gICAgaWYgKCEoRVhQUkVTU0lPTikpIHsgXAotICAgICAgZXJyb3IoIiVzOiVkOiBhc3NlcnRpb24gZmFpbGVkIC0gJXNcbiIsIFwKLQkgICAgZmlsdGVyX2ZpbGVuYW1lKF9fRklMRV9fKSwgX19MSU5FX18sICNFWFBSRVNTSU9OKTsgXAotICAgIH0gXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLS8qIFBhcnNlIE9QVElPTiB1cGRhdGluZyB0aGUgdHJhY2UgYXJyYXkgKi8KLWV4dGVybiB2b2lkCi10cmFjZV9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBpbnQgc2V0dGluZyk7Ci0KLS8qIE91dHB1dCB0aGUgbGlzdCBvZiB0cmFjZSBvcHRpb25zICovCi1leHRlcm4gdm9pZCB0cmFjZV91c2FnZQotKGludCB2ZXJib3NlKTsKLQotCi0jZW5kaWYgLyogX0RFQlVHX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RldmljZS5jIGIvc2ltL3BwYy9kZXZpY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiMDk0My4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2RldmljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5OCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9ERVZJQ0VfQ18KLSNkZWZpbmUgX0RFVklDRV9DXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgotI2luY2x1ZGUgImNhcC5oIgotCi0jaW5jbHVkZSAiZXZlbnRzLmgiCi0jaW5jbHVkZSAicHNpbS5oIgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLVNUQVRJQ19JTkxJTkVfREVWSUNFICh2b2lkKSBjbGVhbl9kZXZpY2VfcHJvcGVydGllcyhkZXZpY2UgKik7Ci0KLS8qIHByb3BlcnR5IGVudHJpZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9wcm9wZXJ0eV9lbnRyeSBkZXZpY2VfcHJvcGVydHlfZW50cnk7Ci1zdHJ1Y3QgX2RldmljZV9wcm9wZXJ0eV9lbnRyeSB7Ci0gIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqbmV4dDsKLSAgZGV2aWNlX3Byb3BlcnR5ICp2YWx1ZTsKLSAgY29uc3Qgdm9pZCAqaW5pdF9hcnJheTsKLSAgdW5zaWduZWQgc2l6ZW9mX2luaXRfYXJyYXk7Ci19OwotCi0KLS8qIEludGVycnVwdCBlZGdlcyAqLwotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2ludGVycnVwdF9lZGdlIGRldmljZV9pbnRlcnJ1cHRfZWRnZTsKLXN0cnVjdCBfZGV2aWNlX2ludGVycnVwdF9lZGdlIHsKLSAgaW50IG15X3BvcnQ7Ci0gIGRldmljZSAqZGVzdDsKLSAgaW50IGRlc3RfcG9ydDsKLSAgZGV2aWNlX2ludGVycnVwdF9lZGdlICpuZXh0OwotICBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb247Ci19OwotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotYXR0YWNoX2RldmljZV9pbnRlcnJ1cHRfZWRnZShkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKipsaXN0LAotCQkJICAgICBpbnQgbXlfcG9ydCwKLQkJCSAgICAgZGV2aWNlICpkZXN0LAotCQkJICAgICBpbnQgZGVzdF9wb3J0LAotCQkJICAgICBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pCi17Ci0gIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqbmV3X2VkZ2UgPSBaQUxMT0MoZGV2aWNlX2ludGVycnVwdF9lZGdlKTsKLSAgbmV3X2VkZ2UtPm15X3BvcnQgPSBteV9wb3J0OwotICBuZXdfZWRnZS0+ZGVzdCA9IGRlc3Q7Ci0gIG5ld19lZGdlLT5kZXN0X3BvcnQgPSBkZXN0X3BvcnQ7Ci0gIG5ld19lZGdlLT5uZXh0ID0gKmxpc3Q7Ci0gIG5ld19lZGdlLT5kaXNwb3NpdGlvbiA9IGRpc3Bvc2l0aW9uOwotICAqbGlzdCA9IG5ld19lZGdlOwotfQotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV0YWNoX2RldmljZV9pbnRlcnJ1cHRfZWRnZShkZXZpY2UgKm1lLAotCQkJICAgICBkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKipsaXN0LAotCQkJICAgICBpbnQgbXlfcG9ydCwKLQkJCSAgICAgZGV2aWNlICpkZXN0LAotCQkJICAgICBpbnQgZGVzdF9wb3J0KQotewotICB3aGlsZSAoKmxpc3QgIT0gTlVMTCkgewotICAgIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqb2xkX2VkZ2UgPSAqbGlzdDsKLSAgICBpZiAob2xkX2VkZ2UtPmRlc3QgPT0gZGVzdAotCSYmIG9sZF9lZGdlLT5kZXN0X3BvcnQgPT0gZGVzdF9wb3J0Ci0JJiYgb2xkX2VkZ2UtPm15X3BvcnQgPT0gbXlfcG9ydCkgewotICAgICAgaWYgKG9sZF9lZGdlLT5kaXNwb3NpdGlvbiA9PSBwZXJtZW5hbnRfb2JqZWN0KQotCWRldmljZV9lcnJvcihtZSwgImF0dGVtcHQgdG8gZGVsZXRlIHBlcm1lbmFudCBpbnRlcnJ1cHQiKTsKLSAgICAgICpsaXN0ID0gb2xkX2VkZ2UtPm5leHQ7Ci0gICAgICB6ZnJlZShvbGRfZWRnZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGRldmljZV9lcnJvcihtZSwgImF0dGVtcHQgdG8gZGVsZXRlIHVuYXR0YWNoZWQgaW50ZXJydXB0Iik7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1jbGVhbl9kZXZpY2VfaW50ZXJydXB0X2VkZ2VzKGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqKmxpc3QpCi17Ci0gIHdoaWxlICgqbGlzdCAhPSBOVUxMKSB7Ci0gICAgZGV2aWNlX2ludGVycnVwdF9lZGdlICpvbGRfZWRnZSA9ICpsaXN0OwotICAgIHN3aXRjaCAob2xkX2VkZ2UtPmRpc3Bvc2l0aW9uKSB7Ci0gICAgY2FzZSBwZXJtZW5hbnRfb2JqZWN0OgotICAgICAgbGlzdCA9ICZvbGRfZWRnZS0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGVtcG9hcnlfb2JqZWN0OgotICAgICAgKmxpc3QgPSBvbGRfZWRnZS0+bmV4dDsKLSAgICAgIHpmcmVlKG9sZF9lZGdlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0KLS8qIEEgZGV2aWNlICovCi0KLXN0cnVjdCBfZGV2aWNlIHsKLQotICAvKiBteSBuYW1lIGlzIC4uLiAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICBkZXZpY2VfdW5pdCB1bml0X2FkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnBhdGg7Ci0gIGludCBucl9hZGRyZXNzX2NlbGxzOwotICBpbnQgbnJfc2l6ZV9jZWxsczsKLQotICAvKiBkZXZpY2UgdHJlZSAqLwotICBkZXZpY2UgKnBhcmVudDsKLSAgZGV2aWNlICpjaGlsZHJlbjsKLSAgZGV2aWNlICpzaWJsaW5nOwotCi0gIC8qIGl0cyB0ZW1wbGF0ZSBtZXRob2RzICovCi0gIHZvaWQgKmRhdGE7IC8qIGRldmljZSBzcGVjaWZpYyBkYXRhICovCi0gIGNvbnN0IGRldmljZV9jYWxsYmFja3MgKmNhbGxiYWNrOwotCi0gIC8qIGRldmljZSBwcm9wZXJ0aWVzICovCi0gIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKLQotICAvKiBpbnRlcnJ1cHRzICovCi0gIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsKLQotICAvKiBhbnkgb3BlbiBpbnN0YW5jZXMgb2YgdGhpcyBkZXZpY2UgKi8KLSAgZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZXM7Ci0KLSAgLyogdGhlIGludGVybmFsL2V4dGVybmFsIG1hcHBpbmdzIGFuZCBvdGhlciBnbG9iYWwgcmVxdWlyZW1lbnRzICovCi0gIGNhcCAqaWhhbmRsZXM7Ci0gIGNhcCAqcGhhbmRsZXM7Ci0gIHBzaW0gKnN5c3RlbTsKLQotICAvKiBkZWJ1Z2dpbmcgKi8KLSAgaW50IHRyYWNlOwotfTsKLQotCi0vKiBhbiBpbnN0YW5jZSBvZiBhIGRldmljZSAqLwotc3RydWN0IF9kZXZpY2VfaW5zdGFuY2UgewotICB2b2lkICpkYXRhOwotICBjaGFyICphcmdzOwotICBjaGFyICpwYXRoOwotICBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzICpjYWxsYmFjazsKLSAgLyogdGhlIHJvb3QgaW5zdGFuY2UgKi8KLSAgZGV2aWNlICpvd25lcjsKLSAgZGV2aWNlX2luc3RhbmNlICpuZXh0OwotICAvKiBpbnRlcnBvc2VkIGluc3RhbmNlICovCi0gIGRldmljZV9pbnN0YW5jZSAqcGFyZW50OwotICBkZXZpY2VfaW5zdGFuY2UgKmNoaWxkOwotfTsKLQotCi0MCi0vKiBjcmVhdGlvbiAqLwotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopCi1kZXZpY2VfZnVsbF9uYW1lKGRldmljZSAqbGVhZiwKLSAgICAgICAgICAgICAgICAgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaXplb2ZfYnVmKQotewotICAvKiBnZXQgYSBidWZmZXIgKi8KLSAgY2hhciBmdWxsX25hbWVbMTAyNF07Ci0gIGlmIChidWYgPT0gKGNoYXIqKTApIHsKLSAgICBidWYgPSBmdWxsX25hbWU7Ci0gICAgc2l6ZW9mX2J1ZiA9IHNpemVvZihmdWxsX25hbWUpOwotICB9Ci0KLSAgLyogY29uc3RydWN0IGEgbmFtZSAqLwotICBpZiAobGVhZi0+cGFyZW50ID09IE5VTEwpIHsKLSAgICBpZiAoc2l6ZW9mX2J1ZiA8IDEpCi0gICAgICBlcnJvcigiZGV2aWNlX2Z1bGxfbmFtZTogYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgKmJ1ZiA9ICdcMCc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciB1bml0WzEwMjRdOwotICAgIGRldmljZV9mdWxsX25hbWUobGVhZi0+cGFyZW50LCBidWYsIHNpemVvZl9idWYpOwotICAgIGlmIChsZWFmLT5wYXJlbnQgIT0gTlVMTAotICAgICAgICAmJiBkZXZpY2VfZW5jb2RlX3VuaXQobGVhZi0+cGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlYWYtPnVuaXRfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bml0KS0xKSA+IDApCi0gICAgICB1bml0WzBdID0gJ0AnOwotICAgIGVsc2UKLSAgICAgIHVuaXRbMF0gPSAnXDAnOwotICAgIGlmIChzdHJsZW4oYnVmKSArIHN0cmxlbigiLyIpICsgc3RybGVuKGxlYWYtPm5hbWUpICsgc3RybGVuKHVuaXQpCi0gICAgICAgID49IHNpemVvZl9idWYpCi0gICAgICBlcnJvcigiZGV2aWNlX2Z1bGxfbmFtZTogYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgc3RyY2F0KGJ1ZiwgIi8iKTsKLSAgICBzdHJjYXQoYnVmLCBsZWFmLT5uYW1lKTsKLSAgICBzdHJjYXQgKGJ1ZiwgdW5pdCk7Ci0gIH0KLSAgCi0gIC8qIHJldHVybiBpdCB1c2VmdWxseSAqLwotICBpZiAoYnVmID09IGZ1bGxfbmFtZSkKLSAgICBidWYgPSAoY2hhciAqKSBzdHJkdXAoZnVsbF9uYW1lKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotU1RBVElDX0lOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1kZXZpY2VfY3JlYXRlX2Zyb20oY29uc3QgY2hhciAqbmFtZSwKLQkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkJICAgdm9pZCAqZGF0YSwKLQkJICAgY29uc3QgZGV2aWNlX2NhbGxiYWNrcyAqY2FsbGJhY2tzLAotCQkgICBkZXZpY2UgKnBhcmVudCkKLXsKLSAgZGV2aWNlICpuZXdfZGV2aWNlID0gWkFMTE9DKGRldmljZSk7Ci0KLSAgLyogaW5zZXJ0IGl0IGludG8gdGhlIGRldmljZSB0cmVlICovCi0gIG5ld19kZXZpY2UtPnBhcmVudCA9IHBhcmVudDsKLSAgbmV3X2RldmljZS0+Y2hpbGRyZW4gPSBOVUxMOwotICBpZiAocGFyZW50ICE9IE5VTEwpIHsKLSAgICBkZXZpY2UgKipzaWJsaW5nID0gJnBhcmVudC0+Y2hpbGRyZW47Ci0gICAgd2hpbGUgKCgqc2libGluZykgIT0gTlVMTCkKLSAgICAgIHNpYmxpbmcgPSAmKCpzaWJsaW5nKS0+c2libGluZzsKLSAgICAqc2libGluZyA9IG5ld19kZXZpY2U7Ci0gIH0KLQotICAvKiBnaXZlIGl0IGEgbmFtZSAqLwotICBuZXdfZGV2aWNlLT5uYW1lID0gKGNoYXIgKikgc3RyZHVwKG5hbWUpOwotICBuZXdfZGV2aWNlLT51bml0X2FkZHJlc3MgPSAqdW5pdF9hZGRyZXNzOwotICBuZXdfZGV2aWNlLT5wYXRoID0gZGV2aWNlX2Z1bGxfbmFtZShuZXdfZGV2aWNlLCBOVUxMLCAwKTsKLQotICAvKiBpdHMgdGVtcGxhdGUgKi8KLSAgbmV3X2RldmljZS0+ZGF0YSA9IGRhdGE7Ci0gIG5ld19kZXZpY2UtPmNhbGxiYWNrID0gY2FsbGJhY2tzOwotCi0gIC8qIGl0cyBwcm9wZXJ0aWVzIC0gYWxyZWFkeSBudWxsICovCi0gIC8qIGludGVycnVwdHMgLSBhbHJlYWR5IG51bGwgKi8KLQotICAvKiBtYXBwaW5ncyAtIGlmIG5lZWRlZCAqLwotICBpZiAocGFyZW50ID09IE5VTEwpIHsKLSAgICBuZXdfZGV2aWNlLT5paGFuZGxlcyA9IGNhcF9jcmVhdGUobmFtZSk7Ci0gICAgbmV3X2RldmljZS0+cGhhbmRsZXMgPSBjYXBfY3JlYXRlKG5hbWUpOwotICB9Ci0gIGVsc2UgewotICAgIG5ld19kZXZpY2UtPmloYW5kbGVzID0gZGV2aWNlX3Jvb3QocGFyZW50KS0+aWhhbmRsZXM7Ci0gICAgbmV3X2RldmljZS0+cGhhbmRsZXMgPSBkZXZpY2Vfcm9vdChwYXJlbnQpLT5waGFuZGxlczsKLSAgfQotCi0gIGNhcF9hZGQobmV3X2RldmljZS0+cGhhbmRsZXMsIG5ld19kZXZpY2UpOwotICByZXR1cm4gbmV3X2RldmljZTsKLX0KLQotCi0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1kZXZpY2VfY3JlYXRlKGRldmljZSAqcGFyZW50LAotCSAgICAgIGNvbnN0IGNoYXIgKmJhc2UsCi0JICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICBjb25zdCBjaGFyICp1bml0X2FkZHJlc3MsCi0JICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgKmNvbnN0ICp0YWJsZTsKLSAgZm9yICh0YWJsZSA9IGRldmljZV90YWJsZTsgKnRhYmxlICE9IE5VTEw7IHRhYmxlKyspIHsKLSAgICBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAqZGVzY3I7Ci0gICAgZm9yIChkZXNjciA9ICp0YWJsZTsgZGVzY3ItPm5hbWUgIT0gTlVMTDsgZGVzY3IrKykgewotICAgICAgaWYgKHN0cmNtcChiYXNlLCBkZXNjci0+bmFtZSkgPT0gMCkgewotCWRldmljZV91bml0IGFkZHJlc3MgPSB7IDAgfTsKLQl2b2lkICpkYXRhID0gTlVMTDsKLQlpZiAocGFyZW50ICE9IE5VTEwpCi0JICBpZiAoZGV2aWNlX2RlY29kZV91bml0KHBhcmVudCwgdW5pdF9hZGRyZXNzLCAmYWRkcmVzcykgPCAwKQotCSAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAiaW52YWxpZCBhZGRyZXNzICVzIGZvciBkZXZpY2UgJXMiLAotCQkJIHVuaXRfYWRkcmVzcywgbmFtZSk7Ci0JaWYgKGRlc2NyLT5jcmVhdG9yICE9IE5VTEwpCi0JICBkYXRhID0gZGVzY3ItPmNyZWF0b3IobmFtZSwgJmFkZHJlc3MsIGFyZ3MpOwotCXJldHVybiBkZXZpY2VfY3JlYXRlX2Zyb20obmFtZSwgJmFkZHJlc3MsIGRhdGEsCi0JCQkJICBkZXNjci0+Y2FsbGJhY2tzLCBwYXJlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICBkZXZpY2VfZXJyb3IocGFyZW50LCAiYXR0ZW1wdCB0byBhdHRhY2ggdW5rbm93biBkZXZpY2UgJXMiLCBuYW1lKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfdXNhZ2UoaW50IHZlcmJvc2UpCi17Ci0gIGNvbnN0IGRldmljZV9kZXNjcmlwdG9yICpjb25zdCAqdGFibGU7Ci0gIGlmICh2ZXJib3NlID09IDEpIHsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBmb3IgKHRhYmxlID0gZGV2aWNlX3RhYmxlOyAqdGFibGUgIT0gTlVMTDsgdGFibGUrKykgewotICAgICAgY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2NyOwotICAgICAgZm9yIChkZXNjciA9ICp0YWJsZTsgZGVzY3ItPm5hbWUgIT0gTlVMTDsgZGVzY3IrKykgewotCXBvcyArPSBzdHJsZW4oZGVzY3ItPm5hbWUpICsgMjsKLQlpZiAocG9zID4gNzUpIHsKLQkgIHBvcyA9IHN0cmxlbihkZXNjci0+bmFtZSkgKyAyOwotCSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotCX0KLQlwcmludGZfZmlsdGVyZWQoIiAgJXMiLCBkZXNjci0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gICAgfQotICB9Ci0gIGlmICh2ZXJib3NlID4gMSkgewotICAgIGZvciAodGFibGUgPSBkZXZpY2VfdGFibGU7ICp0YWJsZSAhPSBOVUxMOyB0YWJsZSsrKSB7Ci0gICAgICBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAqZGVzY3I7Ci0gICAgICBmb3IgKGRlc2NyID0gKnRhYmxlOyBkZXNjci0+bmFtZSAhPSBOVUxMOyBkZXNjcisrKSB7Ci0JcHJpbnRmX2ZpbHRlcmVkKCIgICVzOlxuIiwgZGVzY3ItPm5hbWUpOwotCS8qIGludGVycnVwdCBwb3J0cyAqLwotCWlmIChkZXNjci0+Y2FsbGJhY2tzLT5pbnRlcnJ1cHQucG9ydHMgIT0gTlVMTCkgewotCSAgY29uc3QgZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgKnBvcnRzID0KLQkgICAgZGVzY3ItPmNhbGxiYWNrcy0+aW50ZXJydXB0LnBvcnRzOwotCSAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgaW50ZXJydXB0IHBvcnRzOiIpOwotCSAgd2hpbGUgKHBvcnRzLT5uYW1lICE9IE5VTEwpIHsKLQkgICAgcHJpbnRmX2ZpbHRlcmVkKCIgJXMiLCBwb3J0cy0+bmFtZSk7Ci0JICAgIHBvcnRzKys7Ci0JICB9Ci0JICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0JfQotCS8qIGdlbmVyYWwgaW5mbyAqLwotCWlmIChkZXNjci0+Y2FsbGJhY2tzLT51c2FnZSAhPSBOVUxMKQotCSAgZGVzY3ItPmNhbGxiYWNrcy0+dXNhZ2UodmVyYm9zZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0gCi0KLQotCi0MCi0vKiBEZXZpY2Ugbm9kZTogKi8KLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2UgKikKLWRldmljZV9wYXJlbnQoZGV2aWNlICptZSkKLXsKLSAgcmV0dXJuIG1lLT5wYXJlbnQ7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1kZXZpY2Vfcm9vdChkZXZpY2UgKm1lKQotewotICBBU1NFUlQobWUgIT0gTlVMTCk7Ci0gIHdoaWxlIChtZS0+cGFyZW50ICE9IE5VTEwpCi0gICAgbWUgPSBtZS0+cGFyZW50OwotICByZXR1cm4gbWU7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1kZXZpY2Vfc2libGluZyhkZXZpY2UgKm1lKQotewotICByZXR1cm4gbWUtPnNpYmxpbmc7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1kZXZpY2VfY2hpbGQoZGV2aWNlICptZSkKLXsKLSAgcmV0dXJuIG1lLT5jaGlsZHJlbjsKLX0KLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopCi1kZXZpY2VfbmFtZShkZXZpY2UgKm1lKQotewotICByZXR1cm4gbWUtPm5hbWU7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oY29uc3QgY2hhciAqKQotZGV2aWNlX3BhdGgoZGV2aWNlICptZSkKLXsKLSAgcmV0dXJuIG1lLT5wYXRoOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQgKikKLWRldmljZV9kYXRhKGRldmljZSAqbWUpCi17Ci0gIHJldHVybiBtZS0+ZGF0YTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLShwc2ltICopCi1kZXZpY2Vfc3lzdGVtKGRldmljZSAqbWUpCi17Ci0gIHJldHVybiBtZS0+c3lzdGVtOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGNvbnN0IGRldmljZV91bml0ICopCi1kZXZpY2VfdW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCi17Ci0gIHJldHVybiAmbWUtPnVuaXRfYWRkcmVzczsKLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCi0JCQkJIGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzLAotCQkJCSBpbnQgKmF0dGFjaF9zcGFjZSwKLQkJCQkgdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHJlc3MsCi0JCQkJIGRldmljZSAqY2xpZW50KQotewotICBpZiAobWUtPmNhbGxiYWNrLT5jb252ZXJ0LmFkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBjb252ZXJ0LmFkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgbWV0aG9kIik7Ci0gIHJldHVybiBtZS0+Y2FsbGJhY2stPmNvbnZlcnQuYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhtZSwgYWRkcmVzcywgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgY2xpZW50KTsKLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKGRldmljZSAqbWUsCi0JCQkgICBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSwKLQkJCSAgIHVuc2lnbmVkICpucl9ieXRlcywKLQkJCSAgIGRldmljZSAqY2xpZW50KQotewotICBpZiAobWUtPmNhbGxiYWNrLT5jb252ZXJ0LnNpemVfdG9fYXR0YWNoX3NpemUgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBjb252ZXJ0LnNpemVfdG9fYXR0YWNoX3NpemUgbWV0aG9kIik7Ci0gIHJldHVybiBtZS0+Y2FsbGJhY2stPmNvbnZlcnQuc2l6ZV90b19hdHRhY2hfc2l6ZShtZSwgc2l6ZSwgbnJfYnl0ZXMsIGNsaWVudCk7Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLShpbnQpCi1kZXZpY2VfZGVjb2RlX3VuaXQoZGV2aWNlICpidXMsCi0JCSAgIGNvbnN0IGNoYXIgKnVuaXQsCi0JCSAgIGRldmljZV91bml0ICphZGRyZXNzKQotewotICBpZiAoYnVzLT5jYWxsYmFjay0+Y29udmVydC5kZWNvZGVfdW5pdCA9PSBOVUxMKQotICAgIGRldmljZV9lcnJvcihidXMsICJubyBjb252ZXJ0LmRlY29kZV91bml0IG1ldGhvZCIpOwotICByZXR1cm4gYnVzLT5jYWxsYmFjay0+Y29udmVydC5kZWNvZGVfdW5pdChidXMsIHVuaXQsIGFkZHJlc3MpOwotfQotCi0KLUlOTElORV9ERVZJQ0VcCi0oaW50KQotZGV2aWNlX2VuY29kZV91bml0KGRldmljZSAqYnVzLAotCQkgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCQkgICBjaGFyICpidWYsCi0JCSAgIGludCBzaXplb2ZfYnVmKQotewotICBpZiAoYnVzLT5jYWxsYmFjay0+Y29udmVydC5lbmNvZGVfdW5pdCA9PSBOVUxMKQotICAgIGRldmljZV9lcnJvcihidXMsICJubyBjb252ZXJ0LmVuY29kZV91bml0IG1ldGhvZCIpOwotICByZXR1cm4gYnVzLT5jYWxsYmFjay0+Y29udmVydC5lbmNvZGVfdW5pdChidXMsIHVuaXRfYWRkcmVzcywgYnVmLCBzaXplb2ZfYnVmKTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZCkKLWRldmljZV9ucl9hZGRyZXNzX2NlbGxzKGRldmljZSAqbWUpCi17Ci0gIGlmIChtZS0+bnJfYWRkcmVzc19jZWxscyA9PSAwKSB7Ci0gICAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiI2FkZHJlc3MtY2VsbHMiKSAhPSBOVUxMKQotICAgICAgbWUtPm5yX2FkZHJlc3NfY2VsbHMgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiI2FkZHJlc3MtY2VsbHMiKTsKLSAgICBlbHNlCi0gICAgICBtZS0+bnJfYWRkcmVzc19jZWxscyA9IDI7Ci0gIH0KLSAgcmV0dXJuIG1lLT5ucl9hZGRyZXNzX2NlbGxzOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkKQotZGV2aWNlX25yX3NpemVfY2VsbHMoZGV2aWNlICptZSkKLXsKLSAgaWYgKG1lLT5ucl9zaXplX2NlbGxzID09IDApIHsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICIjc2l6ZS1jZWxscyIpICE9IE5VTEwpCi0gICAgICBtZS0+bnJfc2l6ZV9jZWxscyA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICIjc2l6ZS1jZWxscyIpOwotICAgIGVsc2UKLSAgICAgIG1lLT5ucl9zaXplX2NlbGxzID0gMTsKLSAgfQotICByZXR1cm4gbWUtPm5yX3NpemVfY2VsbHM7Ci19Ci0KLQotDAotLyogZGV2aWNlLWluc3RhbmNlOiAqLwotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZV9pbnN0YW5jZSAqKQotZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKGRldmljZSAqbWUsCi0JCQkgICAgZGV2aWNlX2luc3RhbmNlICpwYXJlbnQsCi0JCQkgICAgdm9pZCAqZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpwYXRoLAotCQkJICAgIGNvbnN0IGNoYXIgKmFyZ3MsCi0JCQkgICAgY29uc3QgZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyAqY2FsbGJhY2tzKQotewotICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlID0gWkFMTE9DKGRldmljZV9pbnN0YW5jZSk7Ci0gIGlmICgobWUgPT0gTlVMTCkgPT0gKHBhcmVudCA9PSBOVUxMKSkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJjYW4ndCBoYXZlIGJvdGggcGFyZW50IGluc3RhbmNlIGFuZCBwYXJlbnQgZGV2aWNlIik7Ci0gIC8qaW5zdGFuY2UtPnVuaXQqLwotICAvKiBsaW5rIHRoaXMgaW5zdGFuY2UgaW50byB0aGUgZGV2aWNlcyBsaXN0ICovCi0gIGlmIChtZSAhPSBOVUxMKSB7Ci0gICAgQVNTRVJUKHBhcmVudCA9PSBOVUxMKTsKLSAgICBpbnN0YW5jZS0+b3duZXIgPSBtZTsKLSAgICBpbnN0YW5jZS0+cGFyZW50ID0gTlVMTDsKLSAgICAvKiBsaW5rIHRoaXMgaW5zdGFuY2UgaW50byB0aGUgZnJvbnQgb2YgdGhlIGRldmljZXMgaW5zdGFuY2UgbGlzdCAqLwotICAgIGluc3RhbmNlLT5uZXh0ID0gbWUtPmluc3RhbmNlczsKLSAgICBtZS0+aW5zdGFuY2VzID0gaW5zdGFuY2U7Ci0gIH0KLSAgaWYgKHBhcmVudCAhPSBOVUxMKSB7Ci0gICAgZGV2aWNlX2luc3RhbmNlICoqcHJldmlvdXM7Ci0gICAgQVNTRVJUKHBhcmVudC0+Y2hpbGQgPT0gTlVMTCk7Ci0gICAgcGFyZW50LT5jaGlsZCA9IGluc3RhbmNlOwotICAgIEFTU0VSVChtZSA9PSBOVUxMKTsKLSAgICBpbnN0YW5jZS0+b3duZXIgPSBwYXJlbnQtPm93bmVyOwotICAgIGluc3RhbmNlLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgLyogaW4gdGhlIGRldmljZXMgaW5zdGFuY2UgbGlzdCByZXBsYWNlIHRoZSBwYXJlbnQgaW5zdGFuY2Ugd2l0aAotICAgICAgIHRoaXMgb25lICovCi0gICAgaW5zdGFuY2UtPm5leHQgPSBwYXJlbnQtPm5leHQ7Ci0gICAgLyogcmVwbGFjZSBwYXJlbnQgd2l0aCB0aGlzIG5ldyBub2RlICovCi0gICAgcHJldmlvdXMgPSAmaW5zdGFuY2UtPm93bmVyLT5pbnN0YW5jZXM7Ci0gICAgd2hpbGUgKCpwcmV2aW91cyAhPSBwYXJlbnQpIHsKLSAgICAgIEFTU0VSVCgqcHJldmlvdXMgIT0gTlVMTCk7Ci0gICAgICBwcmV2aW91cyA9ICYoKnByZXZpb3VzKS0+bmV4dDsKLSAgICB9Ci0gICAgKnByZXZpb3VzID0gaW5zdGFuY2U7Ci0gIH0KLSAgaW5zdGFuY2UtPmRhdGEgPSBkYXRhOwotICBpbnN0YW5jZS0+YXJncyA9IChhcmdzID09IE5VTEwgPyBOVUxMIDogKGNoYXIgKikgc3RyZHVwKGFyZ3MpKTsKLSAgaW5zdGFuY2UtPnBhdGggPSAocGF0aCA9PSBOVUxMID8gTlVMTCA6IChjaGFyICopIHN0cmR1cChwYXRoKSk7Ci0gIGluc3RhbmNlLT5jYWxsYmFjayA9IGNhbGxiYWNrczsKLSAgY2FwX2FkZChpbnN0YW5jZS0+b3duZXItPmloYW5kbGVzLCBpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZV9pbnN0YW5jZSAqKQotZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZShkZXZpY2UgKm1lLAotCQkgICAgICAgY29uc3QgY2hhciAqcGF0aCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIC8qIGNyZWF0ZSB0aGUgaW5zdGFuY2UgKi8KLSAgaWYgKG1lLT5jYWxsYmFjay0+aW5zdGFuY2VfY3JlYXRlID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gaW5zdGFuY2VfY3JlYXRlIG1ldGhvZCIpOwotICByZXR1cm4gbWUtPmNhbGxiYWNrLT5pbnN0YW5jZV9jcmVhdGUobWUsIHBhdGgsIGFyZ3MpOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1jbGVhbl9kZXZpY2VfaW5zdGFuY2VzKGRldmljZSAqbWUpCi17Ci0gIGRldmljZV9pbnN0YW5jZSAqKmluc3RhbmNlID0gJm1lLT5pbnN0YW5jZXM7Ci0gIHdoaWxlICgqaW5zdGFuY2UgIT0gTlVMTCkgewotICAgIGRldmljZV9pbnN0YW5jZSAqb2xkX2luc3RhbmNlID0gKmluc3RhbmNlOwotICAgIGRldmljZV9pbnN0YW5jZV9kZWxldGUob2xkX2luc3RhbmNlKTsKLSAgICBpbnN0YW5jZSA9ICZtZS0+aW5zdGFuY2VzOwotICB9Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2luc3RhbmNlX2RlbGV0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQotewotICBkZXZpY2UgKm1lID0gaW5zdGFuY2UtPm93bmVyOwotICBpZiAoaW5zdGFuY2UtPmNhbGxiYWNrLT5kZWxldGUgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBkZWxldGUgbWV0aG9kIik7Ci0gIGluc3RhbmNlLT5jYWxsYmFjay0+ZGVsZXRlKGluc3RhbmNlKTsKLSAgaWYgKGluc3RhbmNlLT5hcmdzICE9IE5VTEwpCi0gICAgemZyZWUoaW5zdGFuY2UtPmFyZ3MpOwotICBpZiAoaW5zdGFuY2UtPnBhdGggIT0gTlVMTCkKLSAgICB6ZnJlZShpbnN0YW5jZS0+cGF0aCk7Ci0gIGlmIChpbnN0YW5jZS0+Y2hpbGQgPT0gTlVMTCkgewotICAgIC8qIG9ubHkgcmVtb3ZlIGxlYWYgbm9kZXMgKi8KLSAgICBkZXZpY2VfaW5zdGFuY2UgKipjdXJyID0gJm1lLT5pbnN0YW5jZXM7Ci0gICAgd2hpbGUgKCpjdXJyICE9IGluc3RhbmNlKSB7Ci0gICAgICBBU1NFUlQoKmN1cnIgIT0gTlVMTCk7Ci0gICAgICBjdXJyID0gJigqY3VyciktPm5leHQ7Ci0gICAgfQotICAgICpjdXJyID0gaW5zdGFuY2UtPm5leHQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogY2hlY2sgaXQgaXNuJ3QgaW4gdGhlIGluc3RhbmNlIGxpc3QgKi8KLSAgICBkZXZpY2VfaW5zdGFuY2UgKmN1cnIgPSBtZS0+aW5zdGFuY2VzOwotICAgIHdoaWxlIChjdXJyICE9IE5VTEwpIHsKLSAgICAgIEFTU0VSVChjdXJyICE9IGluc3RhbmNlKTsKLSAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwotICAgIH0KLSAgICAvKiB1bmxpbmsgdGhlIGNoaWxkICovCi0gICAgQVNTRVJUKGluc3RhbmNlLT5jaGlsZC0+cGFyZW50ID09IGluc3RhbmNlKTsKLSAgICBpbnN0YW5jZS0+Y2hpbGQtPnBhcmVudCA9IE5VTEw7Ci0gIH0KLSAgY2FwX3JlbW92ZShtZS0+aWhhbmRsZXMsIGluc3RhbmNlKTsKLSAgemZyZWUoaW5zdGFuY2UpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9pbnN0YW5jZV9yZWFkKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgdm9pZCAqYWRkciwKLQkJICAgICB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgZGV2aWNlICptZSA9IGluc3RhbmNlLT5vd25lcjsKLSAgaWYgKGluc3RhbmNlLT5jYWxsYmFjay0+cmVhZCA9PSBOVUxMKQotICAgIGRldmljZV9lcnJvcihtZSwgIm5vIHJlYWQgbWV0aG9kIik7Ci0gIHJldHVybiBpbnN0YW5jZS0+Y2FsbGJhY2stPnJlYWQoaW5zdGFuY2UsIGFkZHIsIGxlbik7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KQotZGV2aWNlX2luc3RhbmNlX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgbGVuKQotewotICBkZXZpY2UgKm1lID0gaW5zdGFuY2UtPm93bmVyOwotICBpZiAoaW5zdGFuY2UtPmNhbGxiYWNrLT53cml0ZSA9PSBOVUxMKQotICAgIGRldmljZV9lcnJvcihtZSwgIm5vIHdyaXRlIG1ldGhvZCIpOwotICByZXR1cm4gaW5zdGFuY2UtPmNhbGxiYWNrLT53cml0ZShpbnN0YW5jZSwgYWRkciwgbGVuKTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLShpbnQpCi1kZXZpY2VfaW5zdGFuY2Vfc2VlayhkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2hpLAotCQkgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQotewotICBkZXZpY2UgKm1lID0gaW5zdGFuY2UtPm93bmVyOwotICBpZiAoaW5zdGFuY2UtPmNhbGxiYWNrLT5zZWVrID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gc2VlayBtZXRob2QiKTsKLSAgcmV0dXJuIGluc3RhbmNlLT5jYWxsYmFjay0+c2VlayhpbnN0YW5jZSwgcG9zX2hpLCBwb3NfbG8pOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJICAgIGNvbnN0IGNoYXIgKm1ldGhvZF9uYW1lLAotCQkJICAgIGludCBuX3N0YWNrX2FyZ3MsCi0JCQkgICAgdW5zaWduZWRfY2VsbCBzdGFja19hcmdzWy8qbl9zdGFja19hcmdzKi9dLAkKLQkJCSAgICBpbnQgbl9zdGFja19yZXR1cm5zLAotCQkJICAgIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfYXJncyovXSkKLXsKLSAgZGV2aWNlICptZSA9IGluc3RhbmNlLT5vd25lcjsKLSAgY29uc3QgZGV2aWNlX2luc3RhbmNlX21ldGhvZHMgKm1ldGhvZCA9IGluc3RhbmNlLT5jYWxsYmFjay0+bWV0aG9kczsKLSAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gbWV0aG9kcyAod2FudCAlcykiLCBtZXRob2RfbmFtZSk7Ci0gIH0KLSAgd2hpbGUgKG1ldGhvZC0+bmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKHN0cmNtcChtZXRob2QtPm5hbWUsIG1ldGhvZF9uYW1lKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gbWV0aG9kLT5tZXRob2QoaW5zdGFuY2UsCi0JCQkgICAgbl9zdGFja19hcmdzLCBzdGFja19hcmdzLAotCQkJICAgIG5fc3RhY2tfcmV0dXJucywgc3RhY2tfcmV0dXJucyk7Ci0gICAgfQotICAgIG1ldGhvZCsrOwotICB9Ci0gIGRldmljZV9lcnJvcihtZSwgIm5vICVzIG1ldGhvZCIsIG1ldGhvZF9uYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2UgKikKLWRldmljZV9pbnN0YW5jZV9kZXZpY2UoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgcmV0dXJuIGluc3RhbmNlLT5vd25lcjsKLX0KLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopCi1kZXZpY2VfaW5zdGFuY2VfcGF0aChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQotewotICByZXR1cm4gaW5zdGFuY2UtPnBhdGg7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCAqKQotZGV2aWNlX2luc3RhbmNlX2RhdGEoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgcmV0dXJuIGluc3RhbmNlLT5kYXRhOwotfQotCi0KLQwKLS8qIERldmljZSBQcm9wZXJ0aWVzOiAqLwotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLShkZXZpY2VfcHJvcGVydHlfZW50cnkgKikKLWZpbmRfcHJvcGVydHlfZW50cnkoZGV2aWNlICptZSwKLQkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICplbnRyeTsKLSAgQVNTRVJUKHByb3BlcnR5ICE9IE5VTEwpOwotICBlbnRyeSA9IG1lLT5wcm9wZXJ0aWVzOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewotICAgIGlmIChzdHJjbXAoZW50cnktPnZhbHVlLT5uYW1lLCBwcm9wZXJ0eSkgPT0gMCkKLSAgICAgIHJldHVybiBlbnRyeTsKLSAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2FkZF9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCSAgICBkZXZpY2VfcHJvcGVydHlfdHlwZSB0eXBlLAotCQkgICAgY29uc3Qgdm9pZCAqaW5pdF9hcnJheSwKLQkJICAgIHVuc2lnbmVkIHNpemVvZl9pbml0X2FycmF5LAotCQkgICAgY29uc3Qgdm9pZCAqYXJyYXksCi0JCSAgICB1bnNpZ25lZCBzaXplb2ZfYXJyYXksCi0JCSAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm9yaWdpbmFsLAotCQkgICAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKQotewotICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKm5ld19lbnRyeSA9IE5VTEw7Ci0gIGRldmljZV9wcm9wZXJ0eSAqbmV3X3ZhbHVlID0gTlVMTDsKLQotICAvKiBmaW5kIHRoZSBsaXN0IGVuZCAqLwotICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKippbnNlcnRpb25fcG9pbnQgPSAmbWUtPnByb3BlcnRpZXM7Ci0gIHdoaWxlICgqaW5zZXJ0aW9uX3BvaW50ICE9IE5VTEwpIHsKLSAgICBpZiAoc3RyY21wKCgqaW5zZXJ0aW9uX3BvaW50KS0+dmFsdWUtPm5hbWUsIHByb3BlcnR5KSA9PSAwKQotICAgICAgcmV0dXJuOwotICAgIGluc2VydGlvbl9wb2ludCA9ICYoKmluc2VydGlvbl9wb2ludCktPm5leHQ7Ci0gIH0KLQotICAvKiBjcmVhdGUgYSBuZXcgdmFsdWUgKi8KLSAgbmV3X3ZhbHVlID0gWkFMTE9DKGRldmljZV9wcm9wZXJ0eSk7Ci0gIG5ld192YWx1ZS0+bmFtZSA9IChjaGFyICopIHN0cmR1cChwcm9wZXJ0eSk7Ci0gIG5ld192YWx1ZS0+dHlwZSA9IHR5cGU7Ci0gIGlmIChzaXplb2ZfYXJyYXkgPiAwKSB7Ci0gICAgdm9pZCAqbmV3X2FycmF5ID0gemFsbG9jKHNpemVvZl9hcnJheSk7Ci0gICAgbWVtY3B5KG5ld19hcnJheSwgYXJyYXksIHNpemVvZl9hcnJheSk7Ci0gICAgbmV3X3ZhbHVlLT5hcnJheSA9IG5ld19hcnJheTsKLSAgICBuZXdfdmFsdWUtPnNpemVvZl9hcnJheSA9IHNpemVvZl9hcnJheTsKLSAgfQotICBuZXdfdmFsdWUtPm93bmVyID0gbWU7Ci0gIG5ld192YWx1ZS0+b3JpZ2luYWwgPSBvcmlnaW5hbDsKLSAgbmV3X3ZhbHVlLT5kaXNwb3NpdGlvbiA9IGRpc3Bvc2l0aW9uOwotCi0gIC8qIGluc2VydCB0aGUgdmFsdWUgaW50byB0aGUgbGlzdCAqLwotICBuZXdfZW50cnkgPSBaQUxMT0MoZGV2aWNlX3Byb3BlcnR5X2VudHJ5KTsKLSAgKmluc2VydGlvbl9wb2ludCA9IG5ld19lbnRyeTsKLSAgaWYgKHNpemVvZl9pbml0X2FycmF5ID4gMCkgewotICAgIHZvaWQgKm5ld19pbml0X2FycmF5ID0gemFsbG9jKHNpemVvZl9pbml0X2FycmF5KTsKLSAgICBtZW1jcHkobmV3X2luaXRfYXJyYXksIGluaXRfYXJyYXksIHNpemVvZl9pbml0X2FycmF5KTsKLSAgICBuZXdfZW50cnktPmluaXRfYXJyYXkgPSBuZXdfaW5pdF9hcnJheTsKLSAgICBuZXdfZW50cnktPnNpemVvZl9pbml0X2FycmF5ID0gc2l6ZW9mX2luaXRfYXJyYXk7Ci0gIH0KLSAgbmV3X2VudHJ5LT52YWx1ZSA9IG5ld192YWx1ZTsKLX0KLQotCi0vKiBsb2NhbCAtIG5vdCBhdmFpbGFibGUgZXh0ZXJuYWxseSAqLwotU1RBVElDX0lOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9zZXRfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkgICAgZGV2aWNlX3Byb3BlcnR5X3R5cGUgdHlwZSwKLQkJICAgIGNvbnN0IHZvaWQgKmFycmF5LAotCQkgICAgaW50IHNpemVvZl9hcnJheSkKLXsKLSAgLyogZmluZCB0aGUgcHJvcGVydHkgKi8KLSAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICplbnRyeSA9IGZpbmRfcHJvcGVydHlfZW50cnkobWUsIHByb3BlcnR5KTsKLSAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKLSAgICAvKiBleGlzdGluZyBwcm9wZXJ0eSAtIHVwZGF0ZSBpdCAqLwotICAgIHZvaWQgKm5ld19hcnJheSA9IDA7Ci0gICAgZGV2aWNlX3Byb3BlcnR5ICp2YWx1ZSA9IGVudHJ5LT52YWx1ZTsKLSAgICAvKiBjaGVjayB0aGUgdHlwZSBtYXRjaGVzICovCi0gICAgaWYgKHZhbHVlLT50eXBlICE9IHR5cGUpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJjb25mbGljdCBiZXR3ZWVuIHR5cGUgb2YgbmV3IGFuZCBvbGQgdmFsdWUgZm9yIHByb3BlcnR5ICVzIiwgcHJvcGVydHkpOwotICAgIC8qIHJlcGxhY2UgaXRzIHZhbHVlICovCi0gICAgaWYgKHZhbHVlLT5hcnJheSAhPSBOVUxMKQotICAgICAgemZyZWUoKHZvaWQqKXZhbHVlLT5hcnJheSk7Ci0gICAgbmV3X2FycmF5ID0gKHNpemVvZl9hcnJheSA+IDAKLQkJID8gemFsbG9jKHNpemVvZl9hcnJheSkKLQkJIDogKHZvaWQqKTApOwotICAgIHZhbHVlLT5hcnJheSA9IG5ld19hcnJheTsKLSAgICB2YWx1ZS0+c2l6ZW9mX2FycmF5ID0gc2l6ZW9mX2FycmF5OwotICAgIGlmIChzaXplb2ZfYXJyYXkgPiAwKQotICAgICAgbWVtY3B5KG5ld19hcnJheSwgYXJyYXksIHNpemVvZl9hcnJheSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVsc2UgewotICAgIC8qIG5ldyBwcm9wZXJ0eSAtIGNyZWF0ZSBpdCAqLwotICAgIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCB0eXBlLAotCQkJTlVMTCwgMCwgYXJyYXksIHNpemVvZl9hcnJheSwKLQkJCU5VTEwsIHRlbXBvYXJ5X29iamVjdCk7Ci0gIH0KLX0KLQotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotY2xlYW5fZGV2aWNlX3Byb3BlcnRpZXMoZGV2aWNlICptZSkKLXsKLSAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICoqZGVsZXRlX3BvaW50ID0gJm1lLT5wcm9wZXJ0aWVzOwotICB3aGlsZSAoKmRlbGV0ZV9wb2ludCAhPSBOVUxMKSB7Ci0gICAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICpjdXJyZW50ID0gKmRlbGV0ZV9wb2ludDsKLSAgICBzd2l0Y2ggKGN1cnJlbnQtPnZhbHVlLT5kaXNwb3NpdGlvbikgewotICAgIGNhc2UgcGVybWVuYW50X29iamVjdDoKLSAgICAgIC8qIHphcCB0aGUgY3VycmVudCB2YWx1ZSwgd2lsbCBiZSBpbml0aWFsaXplZCBsYXRlciAqLwotICAgICAgQVNTRVJUKGN1cnJlbnQtPmluaXRfYXJyYXkgIT0gTlVMTCk7Ci0gICAgICBpZiAoY3VycmVudC0+dmFsdWUtPmFycmF5ICE9IE5VTEwpIHsKLQl6ZnJlZSgodm9pZCopY3VycmVudC0+dmFsdWUtPmFycmF5KTsKLQljdXJyZW50LT52YWx1ZS0+YXJyYXkgPSBOVUxMOwotICAgICAgfQotICAgICAgZGVsZXRlX3BvaW50ID0gJigqZGVsZXRlX3BvaW50KS0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGVtcG9hcnlfb2JqZWN0OgotICAgICAgLyogemFwIHRoZSBhY3R1YWwgcHJvcGVydHksIHdhcyBjcmVhdGVkIGR1cmluZyBzaW11bGF0aW9uIHJ1biAqLwotICAgICAgQVNTRVJUKGN1cnJlbnQtPmluaXRfYXJyYXkgPT0gTlVMTCk7Ci0gICAgICAqZGVsZXRlX3BvaW50ID0gY3VycmVudC0+bmV4dDsKLSAgICAgIGlmIChjdXJyZW50LT52YWx1ZS0+YXJyYXkgIT0gTlVMTCkKLQl6ZnJlZSgodm9pZCopY3VycmVudC0+dmFsdWUtPmFycmF5KTsKLSAgICAgIHpmcmVlKGN1cnJlbnQtPnZhbHVlKTsKLSAgICAgIHpmcmVlKGN1cnJlbnQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2luaXRfc3RhdGljX3Byb3BlcnRpZXMoZGV2aWNlICptZSwKLQkJCSAgICAgIHZvaWQgKmRhdGEpCi17Ci0gIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqcHJvcGVydHk7Ci0gIGZvciAocHJvcGVydHkgPSBtZS0+cHJvcGVydGllczsKLSAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOwotICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHktPm5leHQpIHsKLSAgICBBU1NFUlQocHJvcGVydHktPmluaXRfYXJyYXkgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHByb3BlcnR5LT52YWx1ZS0+YXJyYXkgPT0gTlVMTCk7Ci0gICAgQVNTRVJUKHByb3BlcnR5LT52YWx1ZS0+ZGlzcG9zaXRpb24gPT0gcGVybWVuYW50X29iamVjdCk7Ci0gICAgc3dpdGNoIChwcm9wZXJ0eS0+dmFsdWUtPnR5cGUpIHsKLSAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgotICAgIGNhc2UgYm9vbGVhbl9wcm9wZXJ0eToKLSAgICBjYXNlIHJhbmdlX2FycmF5X3Byb3BlcnR5OgotICAgIGNhc2UgcmVnX2FycmF5X3Byb3BlcnR5OgotICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgotICAgIGNhc2Ugc3RyaW5nX2FycmF5X3Byb3BlcnR5OgotICAgIGNhc2UgaW50ZWdlcl9wcm9wZXJ0eToKLSAgICAgIC8qIGRlbGV0ZSB0aGUgcHJvcGVydHksIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIG9yaWdpbmFsICovCi0gICAgICBkZXZpY2Vfc2V0X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+dmFsdWUtPm5hbWUsCi0JCQkgIHByb3BlcnR5LT52YWx1ZS0+dHlwZSwKLQkJCSAgcHJvcGVydHktPmluaXRfYXJyYXksCi0JCQkgIHByb3BlcnR5LT5zaXplb2ZfaW5pdF9hcnJheSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGloYW5kbGVfcHJvcGVydHk6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfaW5pdF9ydW50aW1lX3Byb3BlcnRpZXMoZGV2aWNlICptZSwKLQkJCSAgICAgICB2b2lkICpkYXRhKQotewotICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKnByb3BlcnR5OwotICBmb3IgKHByb3BlcnR5ID0gbWUtPnByb3BlcnRpZXM7Ci0gICAgICAgcHJvcGVydHkgIT0gTlVMTDsKLSAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LT5uZXh0KSB7Ci0gICAgc3dpdGNoIChwcm9wZXJ0eS0+dmFsdWUtPmRpc3Bvc2l0aW9uKSB7Ci0gICAgY2FzZSBwZXJtZW5hbnRfb2JqZWN0OgotICAgICAgc3dpdGNoIChwcm9wZXJ0eS0+dmFsdWUtPnR5cGUpIHsKLSAgICAgIGNhc2UgaWhhbmRsZV9wcm9wZXJ0eToKLQl7Ci0JICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7Ci0JICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBzcGVjOwotCSAgQVNTRVJUKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOwotCSAgQVNTRVJUKHByb3BlcnR5LT52YWx1ZS0+YXJyYXkgPT0gTlVMTCk7Ci0JICBkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkobWUsIHByb3BlcnR5LT52YWx1ZS0+bmFtZSwgJnNwZWMpOwotCSAgaWhhbmRsZSA9IHRyZWVfaW5zdGFuY2UobWUsIHNwZWMuZnVsbF9wYXRoKTsKLQkgIGRldmljZV9zZXRfaWhhbmRsZV9wcm9wZXJ0eShtZSwgcHJvcGVydHktPnZhbHVlLT5uYW1lLCBpaGFuZGxlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNhc2UgYXJyYXlfcHJvcGVydHk6Ci0gICAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6Ci0gICAgICBjYXNlIHJhbmdlX2FycmF5X3Byb3BlcnR5OgotICAgICAgY2FzZSBpbnRlZ2VyX3Byb3BlcnR5OgotICAgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6Ci0gICAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKLSAgICAgIGNhc2Ugc3RyaW5nX2FycmF5X3Byb3BlcnR5OgotCUFTU0VSVChwcm9wZXJ0eS0+aW5pdF9hcnJheSAhPSBOVUxMKTsKLQlBU1NFUlQocHJvcGVydHktPnZhbHVlLT5hcnJheSAhPSBOVUxMKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGVtcG9hcnlfb2JqZWN0OgotICAgICAgQVNTRVJUKHByb3BlcnR5LT5pbml0X2FycmF5ID09IE5VTEwpOwotICAgICAgQVNTRVJUKHByb3BlcnR5LT52YWx1ZS0+YXJyYXkgIT0gTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqKQotZGV2aWNlX25leHRfcHJvcGVydHkoY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eSkKLXsKLSAgLyogZmluZCB0aGUgcHJvcGVydHkgaW4gdGhlIGxpc3QgKi8KLSAgZGV2aWNlICpvd25lciA9IHByb3BlcnR5LT5vd25lcjsKLSAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICplbnRyeSA9IG93bmVyLT5wcm9wZXJ0aWVzOwotICB3aGlsZSAoZW50cnkgIT0gTlVMTCAmJiBlbnRyeS0+dmFsdWUgIT0gcHJvcGVydHkpCi0gICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLSAgLyogbm93IHJldHVybiB0aGUgZm9sbG93aW5nIHByb3BlcnR5ICovCi0gIEFTU0VSVChlbnRyeSAhPSBOVUxMKTsgLyogbXVzdCBiZSBhIG1lbWJlciEgKi8KLSAgaWYgKGVudHJ5LT5uZXh0ICE9IE5VTEwpCi0gICAgcmV0dXJuIGVudHJ5LT5uZXh0LT52YWx1ZTsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLUlOTElORV9ERVZJQ0VcCi0oY29uc3QgZGV2aWNlX3Byb3BlcnR5ICopCi1kZXZpY2VfZmluZF9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5KQotewotICBpZiAobWUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGVsc2UgaWYgKHByb3BlcnR5ID09IE5VTEwgfHwgc3RyY21wKHByb3BlcnR5LCAiIikgPT0gMCkgewotICAgIGlmIChtZS0+cHJvcGVydGllcyA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG1lLT5wcm9wZXJ0aWVzLT52YWx1ZTsKLSAgfQotICBlbHNlIHsKLSAgICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKmVudHJ5ID0gZmluZF9wcm9wZXJ0eV9lbnRyeShtZSwgcHJvcGVydHkpOwotICAgIGlmIChlbnRyeSAhPSBOVUxMKQotICAgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfYWRkX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICphcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVvZl9hcnJheSkKLXsKLSAgZGV2aWNlX2FkZF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIGFycmF5X3Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgIGFycmF5LCBzaXplb2ZfYXJyYXksIGFycmF5LCBzaXplb2ZfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9zZXRfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCSAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkgIGNvbnN0IHZvaWQgKmFycmF5LAotCQkJICBpbnQgc2l6ZW9mX2FycmF5KQotewotICBkZXZpY2Vfc2V0X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgYXJyYXlfcHJvcGVydHksIGFycmF5LCBzaXplb2ZfYXJyYXkpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqKQotZGV2aWNlX2ZpbmRfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCSAgIGNvbnN0IGNoYXIgKnByb3BlcnR5KQotewotICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5vZGU7Ci0gIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCi0gICAgICB8fCBub2RlLT50eXBlICE9IGFycmF5X3Byb3BlcnR5KQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotICByZXR1cm4gbm9kZTsKLX0KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfYWRkX2Jvb2xlYW5fcHJvcGVydHkoZGV2aWNlICptZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm9vbGVhbikKLXsKLSAgc2lnbmVkMzIgbmV3X2Jvb2xlYW4gPSAoYm9vbGVhbiA/IC0xIDogMCk7Ci0gIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBib29sZWFuX3Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICZuZXdfYm9vbGVhbiwgc2l6ZW9mKG5ld19ib29sZWFuKSwKLSAgICAgICAgICAgICAgICAgICAgICAmbmV3X2Jvb2xlYW4sIHNpemVvZihuZXdfYm9vbGVhbiksCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KQotZGV2aWNlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOwotICB1bnNpZ25lZF9jZWxsIGJvb2xlYW47Ci0gIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCi0gICAgICB8fCBub2RlLT50eXBlICE9IGJvb2xlYW5fcHJvcGVydHkpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbm90IGZvdW5kIG9yIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7Ci0gIEFTU0VSVChzaXplb2YoYm9vbGVhbikgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKLSAgbWVtY3B5KCZib29sZWFuLCBub2RlLT5hcnJheSwgc2l6ZW9mKGJvb2xlYW4pKTsKLSAgcmV0dXJuIGJvb2xlYW47Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2FkZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCQkgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkJICAgIGNvbnN0IGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjICppaGFuZGxlKQotewotICAvKiBlbnRlciB0aGUgZnVsbCBwYXRoIGFzIHRoZSBpbml0IGFycmF5ICovCi0gIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBpaGFuZGxlX3Byb3BlcnR5LAotCQkgICAgICBpaGFuZGxlLT5mdWxsX3BhdGgsIHN0cmxlbihpaGFuZGxlLT5mdWxsX3BhdGgpICsgMSwKLQkJICAgICAgTlVMTCwgMCwKLQkJICAgICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9maW5kX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJCSAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkJICAgICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSkKLXsKLSAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICplbnRyeSA9IGZpbmRfcHJvcGVydHlfZW50cnkobWUsIHByb3BlcnR5KTsKLSAgVFJBQ0UodHJhY2VfZGV2aWNlcywKLQkoImRldmljZV9maW5kX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eShtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAotCSAobG9uZyltZSwgcHJvcGVydHkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwKLSAgICAgIHx8IGVudHJ5LT52YWx1ZS0+dHlwZSAhPSBpaGFuZGxlX3Byb3BlcnR5Ci0gICAgICB8fCBlbnRyeS0+dmFsdWUtPmRpc3Bvc2l0aW9uICE9IHBlcm1lbmFudF9vYmplY3QpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbm90IGZvdW5kIG9yIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7Ci0gIEFTU0VSVChlbnRyeS0+aW5pdF9hcnJheSAhPSBOVUxMKTsKLSAgLyogdGhlIGZ1bGwgcGF0aCAqLwotICBpaGFuZGxlLT5mdWxsX3BhdGggPSBlbnRyeS0+aW5pdF9hcnJheTsKLX0KLQotCi0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9zZXRfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZSkKLXsKLSAgdW5zaWduZWRfY2VsbCBjZWxsczsKLSAgY2VsbHMgPSBIMkJFX2NlbGwoZGV2aWNlX2luc3RhbmNlX3RvX2V4dGVybmFsKGloYW5kbGUpKTsKLSAgZGV2aWNlX3NldF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIGloYW5kbGVfcHJvcGVydHksCi0JCSAgICAgICZjZWxscywgc2l6ZW9mKGNlbGxzKSk7Ci0JCSAgICAgIAotfQotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZV9pbnN0YW5jZSAqKQotZGV2aWNlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOwotICB1bnNpZ25lZF9jZWxsIGloYW5kbGU7Ci0gIGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2U7Ci0KLSAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IE5VTEwgfHwgbm9kZS0+dHlwZSAhPSBpaGFuZGxlX3Byb3BlcnR5KQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotICBpZiAobm9kZS0+YXJyYXkgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJydW50aW1lIHByb3BlcnR5ICVzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQiLCBwcm9wZXJ0eSk7Ci0KLSAgQVNTRVJUKHNpemVvZihpaGFuZGxlKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOwotICBtZW1jcHkoJmloYW5kbGUsIG5vZGUtPmFycmF5LCBzaXplb2YoaWhhbmRsZSkpOwotICBpbnN0YW5jZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShtZSwgQkUySF9jZWxsKGloYW5kbGUpKTsKLSAgQVNTRVJUKGluc3RhbmNlICE9IE5VTEwpOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2FkZF9pbnRlZ2VyX3Byb3BlcnR5KGRldmljZSAqbWUsCi0JCQkgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkgICAgc2lnbmVkX2NlbGwgaW50ZWdlcikKLXsKLSAgSDJCRShpbnRlZ2VyKTsKLSAgZGV2aWNlX2FkZF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIGludGVnZXJfcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKLSAgICAgICAgICAgICAgICAgICAgICAmaW50ZWdlciwgc2l6ZW9mKGludGVnZXIpLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHNpZ25lZF9jZWxsKQotZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOwotICBzaWduZWRfY2VsbCBpbnRlZ2VyOwotICBUUkFDRSh0cmFjZV9kZXZpY2VzLAotCSgiZGV2aWNlX2ZpbmRfaW50ZWdlcihtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAotCSAobG9uZyltZSwgcHJvcGVydHkpKTsKLSAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IChkZXZpY2VfcHJvcGVydHkqKTAKLSAgICAgIHx8IG5vZGUtPnR5cGUgIT0gaW50ZWdlcl9wcm9wZXJ0eSkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKLSAgQVNTRVJUKHNpemVvZihpbnRlZ2VyKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOwotICBtZW1jcHkoJmludGVnZXIsIG5vZGUtPmFycmF5LCBzaXplb2YoaW50ZWdlcikpOwotICByZXR1cm4gQkUySF9jZWxsKGludGVnZXIpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQkgICB1bnNpZ25lZCBpbmRleCwKLQkJCQkgICBzaWduZWRfY2VsbCAqaW50ZWdlcikKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOwotICBpbnQgc2l6ZW9mX2ludGVnZXIgPSBzaXplb2YoKmludGVnZXIpOwotICBzaWduZWRfY2VsbCAqY2VsbDsKLSAgVFJBQ0UodHJhY2VfZGV2aWNlcywKLQkoImRldmljZV9maW5kX2ludGVnZXIobWU9MHglbHgsIHByb3BlcnR5PSVzKVxuIiwKLQkgKGxvbmcpbWUsIHByb3BlcnR5KSk7Ci0KLSAgLyogY2hlY2sgdGhpbmdzIHNhbmUgKi8KLSAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IChkZXZpY2VfcHJvcGVydHkqKTAKLSAgICAgIHx8IChub2RlLT50eXBlICE9IGludGVnZXJfcHJvcGVydHkKLQkgICYmIG5vZGUtPnR5cGUgIT0gYXJyYXlfcHJvcGVydHkpKQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotICBpZiAoKG5vZGUtPnNpemVvZl9hcnJheSAlIHNpemVvZl9pbnRlZ2VyKSAhPSAwKQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIGNvbnRhaW5zIGFuIGluY29tcGxldGUgbnVtYmVyIG9mIGNlbGxzIiwgcHJvcGVydHkpOwotICBpZiAobm9kZS0+c2l6ZW9mX2FycmF5IDw9IHNpemVvZl9pbnRlZ2VyICogaW5kZXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KLSAgY2VsbCA9ICgoc2lnbmVkX2NlbGwqKW5vZGUtPmFycmF5KSArIGluZGV4OwotICAqaW50ZWdlciA9IEJFMkhfY2VsbCgqY2VsbCk7Ci0KLSAgcmV0dXJuIG5vZGUtPnNpemVvZl9hcnJheSAvIHNpemVvZl9pbnRlZ2VyOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkX2NlbGwgKikKLXVuaXRfYWRkcmVzc190b19jZWxscyhjb25zdCBkZXZpY2VfdW5pdCAqdW5pdCwKLQkJICAgICAgdW5zaWduZWRfY2VsbCAqY2VsbCwKLQkJICAgICAgaW50IG5yX2NlbGxzKQotewotICBpbnQgaTsKLSAgQVNTRVJUKG5yX2NlbGxzID09IHVuaXQtPm5yX2NlbGxzKTsKLSAgZm9yIChpID0gMDsgaSA8IHVuaXQtPm5yX2NlbGxzOyBpKyspIHsKLSAgICAqY2VsbCA9IEgyQkVfY2VsbCh1bml0LT5jZWxsc1tpXSk7Ci0gICAgY2VsbCArPSAxOwotICB9Ci0gIHJldHVybiBjZWxsOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfREVWSUNFXAotKGNvbnN0IHVuc2lnbmVkX2NlbGwgKikKLWNlbGxzX3RvX3VuaXRfYWRkcmVzcyhjb25zdCB1bnNpZ25lZF9jZWxsICpjZWxsLAotCQkgICAgICBkZXZpY2VfdW5pdCAqdW5pdCwKLQkJICAgICAgaW50IG5yX2NlbGxzKQotewotICBpbnQgaTsKLSAgbWVtc2V0KHVuaXQsIDAsIHNpemVvZigqdW5pdCkpOwotICB1bml0LT5ucl9jZWxscyA9IG5yX2NlbGxzOwotICBmb3IgKGkgPSAwOyBpIDwgdW5pdC0+bnJfY2VsbHM7IGkrKykgewotICAgIHVuaXQtPmNlbGxzW2ldID0gQkUySF9jZWxsKCpjZWxsKTsKLSAgICBjZWxsICs9IDE7Ci0gIH0KLSAgcmV0dXJuIGNlbGw7Ci19Ci0KLQotU1RBVElDX0lOTElORV9ERVZJQ0VcCi0odW5zaWduZWQpCi1ucl9yYW5nZV9wcm9wZXJ0eV9jZWxscyhkZXZpY2UgKm1lLAotCQkJaW50IG5yX3JhbmdlcykKLXsKLSAgcmV0dXJuICgoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMobWUpCi0JICAgKyBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkKLQkgICArIGRldmljZV9ucl9zaXplX2NlbGxzKG1lKSkKLQkgICkgKiBucl9yYW5nZXM7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9hZGRfcmFuZ2VfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCQljb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQljb25zdCByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZXMsCi0JCQkJdW5zaWduZWQgbnJfcmFuZ2VzKQotewotICB1bnNpZ25lZCBzaXplb2ZfY2VsbHMgPSAobnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMobWUsIG5yX3JhbmdlcykKLQkJCSAgICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpKTsKLSAgdW5zaWduZWRfY2VsbCAqY2VsbHMgPSB6YWxsb2Moc2l6ZW9mX2NlbGxzKTsKLSAgdW5zaWduZWRfY2VsbCAqY2VsbDsKLSAgaW50IGk7Ci0KLSAgLyogY29weSB0aGUgcHJvcGVydHkgZWxlbWVudHMgb3ZlciAqLwotICBjZWxsID0gY2VsbHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9yYW5nZXM7IGkrKykgewotICAgIGNvbnN0IHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlID0gJnJhbmdlc1tpXTsKLSAgICAvKiBjb3B5IHRoZSBjaGlsZCBhZGRyZXNzICovCi0gICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscygmcmFuZ2UtPmNoaWxkX2FkZHJlc3MsIGNlbGwsCi0JCQkJIGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKG1lKSk7Ci0gICAgLyogY29weSB0aGUgcGFyZW50IGFkZHJlc3MgKi8KLSAgICBjZWxsID0gdW5pdF9hZGRyZXNzX3RvX2NlbGxzKCZyYW5nZS0+cGFyZW50X2FkZHJlc3MsIGNlbGwsIAotCQkJCSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpOwotICAgIC8qIGNvcHkgdGhlIHNpemUgKi8KLSAgICBjZWxsID0gdW5pdF9hZGRyZXNzX3RvX2NlbGxzKCZyYW5nZS0+c2l6ZSwgY2VsbCwgCi0JCQkJIGRldmljZV9ucl9zaXplX2NlbGxzKG1lKSk7Ci0gIH0KLSAgQVNTRVJUKGNlbGwgPT0gJmNlbGxzW25yX3JhbmdlX3Byb3BlcnR5X2NlbGxzKG1lLCBucl9yYW5nZXMpXSk7Ci0KLSAgLyogYWRkIGl0ICovCi0gIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCByYW5nZV9hcnJheV9wcm9wZXJ0eSwKLQkJICAgICAgY2VsbHMsIHNpemVvZl9jZWxscywKLQkJICAgICAgY2VsbHMsIHNpemVvZl9jZWxscywKLQkJICAgICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci0KLSAgemZyZWUoY2VsbHMpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9maW5kX3JhbmdlX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCi0JCQkJIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJCSB1bnNpZ25lZCBpbmRleCwKLQkJCQkgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2UpCi17Ci0gIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKLSAgdW5zaWduZWQgc2l6ZW9mX2VudHJ5ID0gKG5yX3JhbmdlX3Byb3BlcnR5X2NlbGxzKG1lLCAxKQotCQkJICAgKiBzaXplb2YodW5zaWduZWRfY2VsbCkpOwotICBjb25zdCB1bnNpZ25lZF9jZWxsICpjZWxsczsKLQotICAvKiBsb2NhdGUgdGhlIHByb3BlcnR5ICovCi0gIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOwotICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCi0gICAgICB8fCBub2RlLT50eXBlICE9IHJhbmdlX2FycmF5X3Byb3BlcnR5KQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotCi0gIC8qIGFsaWduZWQgPyAqLwotICBpZiAoKG5vZGUtPnNpemVvZl9hcnJheSAlIHNpemVvZl9lbnRyeSkgIT0gMCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBjb250YWlucyBhbiBpbmNvbXBsZXRlIG51bWJlciBvZiBlbnRyaWVzIiwKLQkJIHByb3BlcnR5KTsKLQotICAvKiB3aXRoaW4gYm91bmRzPyAqLwotICBpZiAobm9kZS0+c2l6ZW9mX2FycmF5IDwgc2l6ZW9mX2VudHJ5ICogKGluZGV4ICsgMSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogZmluZCB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QgKi8KLSAgY2VsbHMgPSAodW5zaWduZWRfY2VsbCopKChjaGFyKilub2RlLT5hcnJheSArIHNpemVvZl9lbnRyeSAqIGluZGV4KTsKLQotICAvKiBjb3B5IHRoZSBjaGlsZCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KLSAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MoY2VsbHMsICZyYW5nZS0+Y2hpbGRfYWRkcmVzcywKLQkJCQlkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhtZSkpOwotCi0gIC8qIGNvcHkgdGhlIHBhcmVudCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KLSAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MoY2VsbHMsICZyYW5nZS0+cGFyZW50X2FkZHJlc3MsCi0JCQkJZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKTsKLQotICAvKiBjb3B5IHRoZSBzaXplIC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyhjZWxscywgJnJhbmdlLT5zaXplLAotCQkJCWRldmljZV9ucl9zaXplX2NlbGxzKG1lKSk7Ci0KLSAgcmV0dXJuIG5vZGUtPnNpemVvZl9hcnJheSAvIHNpemVvZl9lbnRyeTsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZCkKLW5yX3JlZ19wcm9wZXJ0eV9jZWxscyhkZXZpY2UgKm1lLAotCQkgICAgICBpbnQgbnJfcmVncykKLXsKLSAgcmV0dXJuIChkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkKLQkgICsgZGV2aWNlX25yX3NpemVfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpCi0JICApICogbnJfcmVnczsKLX0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2FkZF9yZWdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgICAgY29uc3QgcmVnX3Byb3BlcnR5X3NwZWMgKnJlZ3MsCi0JCQkgICAgICB1bnNpZ25lZCBucl9yZWdzKQotewotICB1bnNpZ25lZCBzaXplb2ZfY2VsbHMgPSAobnJfcmVnX3Byb3BlcnR5X2NlbGxzKG1lLCBucl9yZWdzKQotCQkJICAgKiBzaXplb2YodW5zaWduZWRfY2VsbCkpOwotICB1bnNpZ25lZF9jZWxsICpjZWxscyA9IHphbGxvYyhzaXplb2ZfY2VsbHMpOwotICB1bnNpZ25lZF9jZWxsICpjZWxsOwotICBpbnQgaTsKLQotICAvKiBjb3B5IHRoZSBwcm9wZXJ0eSBlbGVtZW50cyBvdmVyICovCi0gIGNlbGwgPSBjZWxsczsKLSAgZm9yIChpID0gMDsgaSA8IG5yX3JlZ3M7IGkrKykgewotICAgIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcgPSAmcmVnc1tpXTsKLSAgICAvKiBjb3B5IHRoZSBhZGRyZXNzICovCi0gICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscygmcmVnLT5hZGRyZXNzLCBjZWxsLAotCQkJCSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpOwotICAgIC8qIGNvcHkgdGhlIHNpemUgKi8KLSAgICBjZWxsID0gdW5pdF9hZGRyZXNzX3RvX2NlbGxzKCZyZWctPnNpemUsIGNlbGwsCi0JCQkJIGRldmljZV9ucl9zaXplX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKSk7Ci0gIH0KLSAgQVNTRVJUKGNlbGwgPT0gJmNlbGxzW25yX3JlZ19wcm9wZXJ0eV9jZWxscyhtZSwgbnJfcmVncyldKTsKLQotICAvKiBhZGQgaXQgKi8KLSAgZGV2aWNlX2FkZF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIHJlZ19hcnJheV9wcm9wZXJ0eSwKLQkJICAgICAgY2VsbHMsIHNpemVvZl9jZWxscywKLQkJICAgICAgY2VsbHMsIHNpemVvZl9jZWxscywKLQkJICAgICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Ci0KLSAgemZyZWUoY2VsbHMpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotCQkJICAgICAgIHVuc2lnbmVkIGluZGV4LAotCQkJICAgICAgIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcpCi17Ci0gIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKLSAgdW5zaWduZWQgc2l6ZW9mX2VudHJ5ID0gKG5yX3JlZ19wcm9wZXJ0eV9jZWxscyhtZSwgMSkKLQkJCSAgICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpKTsKLSAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7Ci0KLSAgLyogbG9jYXRlIHRoZSBwcm9wZXJ0eSAqLwotICBub2RlID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIHByb3BlcnR5KTsKLSAgaWYgKG5vZGUgPT0gKGRldmljZV9wcm9wZXJ0eSopMAotICAgICAgfHwgbm9kZS0+dHlwZSAhPSByZWdfYXJyYXlfcHJvcGVydHkpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbm90IGZvdW5kIG9yIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7Ci0KLSAgLyogYWxpZ25lZCA/ICovCi0gIGlmICgobm9kZS0+c2l6ZW9mX2FycmF5ICUgc2l6ZW9mX2VudHJ5KSAhPSAwKQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIGNvbnRhaW5zIGFuIGluY29tcGxldGUgbnVtYmVyIG9mIGVudHJpZXMiLAotCQkgcHJvcGVydHkpOwotCi0gIC8qIHdpdGhpbiBib3VuZHM/ICovCi0gIGlmIChub2RlLT5zaXplb2ZfYXJyYXkgPCBzaXplb2ZfZW50cnkgKiAoaW5kZXggKyAxKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBmaW5kIHRoZSByYW5nZSBvZiBpbnRlcmVzdCAqLwotICBjZWxscyA9ICh1bnNpZ25lZF9jZWxsKikoKGNoYXIqKW5vZGUtPmFycmF5ICsgc2l6ZW9mX2VudHJ5ICogaW5kZXgpOwotCi0gIC8qIGNvcHkgdGhlIGFkZHJlc3Mgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyhjZWxscywgJnJlZy0+YWRkcmVzcywKLQkJCQlkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpOwotCi0gIC8qIGNvcHkgdGhlIHNpemUgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLwotICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyhjZWxscywgJnJlZy0+c2l6ZSwKLQkJCQlkZXZpY2VfbnJfc2l6ZV9jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpOwotCi0gIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfZW50cnk7Ci19Ci0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2FkZF9zdHJpbmdfcHJvcGVydHkoZGV2aWNlICptZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nKQotewotICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgc3RyaW5nX3Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgc3RybGVuKHN0cmluZykgKyAxLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgc3RybGVuKHN0cmluZykgKyAxLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGNvbnN0IGNoYXIgKikKLWRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5KQotewotICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5vZGU7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IChkZXZpY2VfcHJvcGVydHkqKTAKLSAgICAgIHx8IG5vZGUtPnR5cGUgIT0gc3RyaW5nX3Byb3BlcnR5KQotICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotICBzdHJpbmcgPSBub2RlLT5hcnJheTsKLSAgQVNTRVJUKHN0cmxlbihzdHJpbmcpICsgMSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOwotICByZXR1cm4gc3RyaW5nOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJCQkgY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCi0JCQkJIHVuc2lnbmVkIG5yX3N0cmluZ3MpCi17Ci0gIGludCBzaXplb2ZfYXJyYXk7Ci0gIGludCBzdHJpbmdfbnI7Ci0gIGNoYXIgKmFycmF5OwotICBjaGFyICpjaHA7Ci0gIGlmIChucl9zdHJpbmdzID09IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbXVzdCBiZSBub24tbnVsbCIsIHByb3BlcnR5KTsKLSAgLyogdG90YWwgdXAgdGhlIHNpemUgb2YgdGhlIG5lZWRlZCBhcnJheSAqLwotICBmb3IgKHNpemVvZl9hcnJheSA9IDAsIHN0cmluZ19uciA9IDA7Ci0gICAgICAgc3RyaW5nX25yIDwgbnJfc3RyaW5nczsKLSAgICAgICBzdHJpbmdfbnIgKyspIHsKLSAgICBzaXplb2ZfYXJyYXkgKz0gc3RybGVuKHN0cmluZ3Nbc3RyaW5nX25yXSkgKyAxOwotICB9Ci0gIC8qIGNyZWF0ZSB0aGUgYXJyYXkgKi8KLSAgYXJyYXkgPSAoY2hhciopemFsbG9jKHNpemVvZl9hcnJheSk7Ci0gIGNocCA9IGFycmF5OwotICBmb3IgKHN0cmluZ19uciA9IDA7Ci0gICAgICAgc3RyaW5nX25yIDwgbnJfc3RyaW5nczsKLSAgICAgICBzdHJpbmdfbnIrKykgewotICAgIHN0cmNweShjaHAsIHN0cmluZ3Nbc3RyaW5nX25yXSk7Ci0gICAgY2hwICs9IHN0cmxlbihjaHApICsgMTsKLSAgfQotICBBU1NFUlQoY2hwID09IGFycmF5ICsgc2l6ZW9mX2FycmF5KTsKLSAgLyogbm93IGVudGVyIGl0ICovCi0gIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBzdHJpbmdfYXJyYXlfcHJvcGVydHksCi0JCSAgICAgIGFycmF5LCBzaXplb2ZfYXJyYXksCi0JCSAgICAgIGFycmF5LCBzaXplb2ZfYXJyYXksCi0JCSAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKGludCkKLWRldmljZV9maW5kX3N0cmluZ19hcnJheV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJCSAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkJICB1bnNpZ25lZCBpbmRleCwKLQkJCQkgIHN0cmluZ19wcm9wZXJ0eV9zcGVjICpzdHJpbmcpCi17Ci0gIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKLSAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0gIGlmIChub2RlID09IChkZXZpY2VfcHJvcGVydHkqKTApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbm90IGZvdW5kIiwgcHJvcGVydHkpOwotICBzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOwotICAgIGJyZWFrOwotICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKLSAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgKnN0cmluZyA9IG5vZGUtPmFycmF5OwotICAgICAgQVNTRVJUKHN0cmxlbigqc3RyaW5nKSArIDEgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBhcnJheV9wcm9wZXJ0eToKLSAgICBpZiAobm9kZS0+c2l6ZW9mX2FycmF5ID09IDAKLQl8fCAoKGNoYXIqKW5vZGUtPmFycmF5KVtub2RlLT5zaXplb2ZfYXJyYXkgLSAxXSAhPSAnXDAnKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgaW52YWxpZCBmb3Igc3RyaW5nIGFycmF5IiwgcHJvcGVydHkpOwotICAgIC8qIEZBTEwgVEhST1VHSCAqLwotICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKLSAgICBBU1NFUlQobm9kZS0+c2l6ZW9mX2FycmF5ID4gMCk7Ci0gICAgQVNTRVJUKCgoY2hhciopbm9kZS0+YXJyYXkpW25vZGUtPnNpemVvZl9hcnJheSAtIDFdID09ICdcMCcpOwotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmNocCA9IG5vZGUtPmFycmF5OwotICAgICAgaW50IG5yX2VudHJpZXMgPSAwOwotICAgICAgLyogY291bnQgdGhlIG51bWJlciBvZiBzdHJpbmdzLCBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIHRoZSBvbmUKLSAgICAgICAgIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0gICAgICAqc3RyaW5nID0gY2hwOwotICAgICAgZG8gewotCWlmICgqY2hwID09ICdcMCcpIHsKLQkgIC8qIG5leHQgc3RyaW5nICovCi0JICBucl9lbnRyaWVzKys7Ci0JICBjaHArKzsKLQkgIGlmIChucl9lbnRyaWVzID09IGluZGV4KQotCSAgICAqc3RyaW5nID0gY2hwOwotCX0KLQllbHNlIHsKLQkgIGNocCsrOwotCX0KLSAgICAgIH0gd2hpbGUgKGNocCA8IChjaGFyKilub2RlLT5hcnJheSArIG5vZGUtPnNpemVvZl9hcnJheSk7Ci0gICAgICBpZiAoaW5kZXggPCBucl9lbnRyaWVzKQotCXJldHVybiBucl9lbnRyaWVzOwotICAgICAgZWxzZSB7Ci0JKnN0cmluZyA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkJICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0JCQkgICAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm9yaWdpbmFsKQotewotICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKm1hc3RlcjsKLSAgVFJBQ0UodHJhY2VfZGV2aWNlcywKLQkoImRldmljZV9hZGRfZHVwbGljYXRlX3Byb3BlcnR5KG1lPTB4JWx4LCBwcm9wZXJ0eT0lcywgLi4uKVxuIiwKLQkgKGxvbmcpbWUsIHByb3BlcnR5KSk7Ci0gIGlmIChvcmlnaW5hbC0+ZGlzcG9zaXRpb24gIT0gcGVybWVuYW50X29iamVjdCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJDYW4gb25seSBkdXBsaWNhdGUgcGVybWVuYW50IG9iamVjdHMiKTsKLSAgLyogZmluZCB0aGUgb3JpZ2luYWwncyBtYXN0ZXIgKi8KLSAgbWFzdGVyID0gb3JpZ2luYWwtPm93bmVyLT5wcm9wZXJ0aWVzOwotICB3aGlsZSAobWFzdGVyLT52YWx1ZSAhPSBvcmlnaW5hbCkgewotICAgIG1hc3RlciA9IG1hc3Rlci0+bmV4dDsKLSAgICBBU1NFUlQobWFzdGVyICE9IE5VTEwpOwotICB9Ci0gIC8qIG5vdyBkdXBsaWNhdGUgaXQgKi8KLSAgZGV2aWNlX2FkZF9wcm9wZXJ0eShtZSwgcHJvcGVydHksCi0JCSAgICAgIG9yaWdpbmFsLT50eXBlLAotCQkgICAgICBtYXN0ZXItPmluaXRfYXJyYXksIG1hc3Rlci0+c2l6ZW9mX2luaXRfYXJyYXksCi0JCSAgICAgIG9yaWdpbmFsLT5hcnJheSwgb3JpZ2luYWwtPnNpemVvZl9hcnJheSwKLQkJICAgICAgb3JpZ2luYWwsIHBlcm1lbmFudF9vYmplY3QpOwotfQotCi0KLQwKLS8qIERldmljZSBIYXJkd2FyZTogKi8KLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZCkKLWRldmljZV9pb19yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkgICAgICB2b2lkICpkZXN0LAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaWYgKG1lLT5jYWxsYmFjay0+aW8ucmVhZF9idWZmZXIgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBpby5yZWFkX2J1ZmZlciBtZXRob2QiKTsKLSAgcmV0dXJuIG1lLT5jYWxsYmFjay0+aW8ucmVhZF9idWZmZXIobWUsIGRlc3QsIHNwYWNlLAotCQkJCSAgICAgIGFkZHIsIG5yX2J5dGVzLAotCQkJCSAgICAgIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZCkKLWRldmljZV9pb193cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaWYgKG1lLT5jYWxsYmFjay0+aW8ud3JpdGVfYnVmZmVyID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gaW8ud3JpdGVfYnVmZmVyIG1ldGhvZCIpOwotICByZXR1cm4gbWUtPmNhbGxiYWNrLT5pby53cml0ZV9idWZmZXIobWUsIHNvdXJjZSwgc3BhY2UsCi0JCQkJICAgICAgIGFkZHIsIG5yX2J5dGVzLAotCQkJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odW5zaWduZWQpCi1kZXZpY2VfZG1hX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCi0JCSAgICAgICB2b2lkICpkZXN0LAotCQkgICAgICAgaW50IHNwYWNlLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIGlmIChtZS0+Y2FsbGJhY2stPmRtYS5yZWFkX2J1ZmZlciA9PSBOVUxMKQotICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGRtYS5yZWFkX2J1ZmZlciBtZXRob2QiKTsKLSAgcmV0dXJuIG1lLT5jYWxsYmFjay0+ZG1hLnJlYWRfYnVmZmVyKG1lLCBkZXN0LCBzcGFjZSwKLQkJCQkgICAgICAgYWRkciwgbnJfYnl0ZXMpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkKQotZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJCWNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCWludCBzcGFjZSwKLQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXVuc2lnbmVkIG5yX2J5dGVzLAotCQkJaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pCi17Ci0gIGlmIChtZS0+Y2FsbGJhY2stPmRtYS53cml0ZV9idWZmZXIgPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBkbWEud3JpdGVfYnVmZmVyIG1ldGhvZCIpOwotICByZXR1cm4gbWUtPmNhbGxiYWNrLT5kbWEud3JpdGVfYnVmZmVyKG1lLCBzb3VyY2UsIHNwYWNlLAotCQkJCQlhZGRyLCBucl9ieXRlcywKLQkJCQkJdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAotCQkgICAgICBhdHRhY2hfdHlwZSBhdHRhY2gsCi0JCSAgICAgIGludCBzcGFjZSwKLQkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKLQkJICAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAotCQkgICAgICBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KLXsKLSAgaWYgKG1lLT5jYWxsYmFjay0+YWRkcmVzcy5hdHRhY2ggPT0gTlVMTCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJubyBhZGRyZXNzLmF0dGFjaCBtZXRob2QiKTsKLSAgbWUtPmNhbGxiYWNrLT5hZGRyZXNzLmF0dGFjaChtZSwgYXR0YWNoLCBzcGFjZSwKLQkJCSAgICAgICBhZGRyLCBucl9ieXRlcywgYWNjZXNzLCBjbGllbnQpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfZGV0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKLQkJICAgICAgYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKLQkJICAgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCi17Ci0gIGlmIChtZS0+Y2FsbGJhY2stPmFkZHJlc3MuZGV0YWNoID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gYWRkcmVzcy5kZXRhY2ggbWV0aG9kIik7Ci0gIG1lLT5jYWxsYmFjay0+YWRkcmVzcy5kZXRhY2gobWUsIGF0dGFjaCwgc3BhY2UsCi0JCQkgICAgICAgYWRkciwgbnJfYnl0ZXMsIGFjY2VzcywgY2xpZW50KTsKLX0KLQotCi0MCi0vKiBJbnRlcnJ1cHRzOiAqLwotCi1JTkxJTkVfREVWSUNFKHZvaWQpCi1kZXZpY2VfaW50ZXJydXB0X2V2ZW50KGRldmljZSAqbWUsCi0JCSAgICAgICBpbnQgbXlfcG9ydCwKLQkJICAgICAgIGludCBsZXZlbCwKLQkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmb3VuZF9hbl9lZGdlID0gMDsKLSAgZGV2aWNlX2ludGVycnVwdF9lZGdlICplZGdlOwotICAvKiBkZXZpY2UncyBpbnRlcnJ1cHQgbGluZXMgZGlyZWN0bHkgY29ubmVjdGVkICovCi0gIGZvciAoZWRnZSA9IG1lLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25zOwotICAgICAgIGVkZ2UgIT0gTlVMTDsKLSAgICAgICBlZGdlID0gZWRnZS0+bmV4dCkgewotICAgIGlmIChlZGdlLT5teV9wb3J0ID09IG15X3BvcnQpIHsKLSAgICAgIGlmIChlZGdlLT5kZXN0LT5jYWxsYmFjay0+aW50ZXJydXB0LmV2ZW50ID09IE5VTEwpCi0JZGV2aWNlX2Vycm9yKG1lLCAibm8gaW50ZXJydXB0IG1ldGhvZCIpOwotICAgICAgZWRnZS0+ZGVzdC0+Y2FsbGJhY2stPmludGVycnVwdC5ldmVudChlZGdlLT5kZXN0LAotCQkJCQkgICAgZWRnZS0+ZGVzdF9wb3J0LAotCQkJCQkgICAgbWUsCi0JCQkJCSAgICBteV9wb3J0LAotCQkJCQkgICAgbGV2ZWwsCi0JCQkJCSAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgICBmb3VuZF9hbl9lZGdlID0gMTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFmb3VuZF9hbl9lZGdlKSB7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiTm8gaW50ZXJydXB0IGVkZ2UgZm9yIHBvcnQgJWQiLCBteV9wb3J0KTsKLSAgfQotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfaW50ZXJydXB0X2F0dGFjaChkZXZpY2UgKm1lLAotCQkJaW50IG15X3BvcnQsCi0JCQlkZXZpY2UgKmRlc3QsCi0JCQlpbnQgZGVzdF9wb3J0LAotCQkJb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKQotewotICBhdHRhY2hfZGV2aWNlX2ludGVycnVwdF9lZGdlKCZtZS0+aW50ZXJydXB0X2Rlc3RpbmF0aW9ucywKLQkJCSAgICAgICBteV9wb3J0LAotCQkJICAgICAgIGRlc3QsCi0JCQkgICAgICAgZGVzdF9wb3J0LAotCQkJICAgICAgIGRpc3Bvc2l0aW9uKTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKQotZGV2aWNlX2ludGVycnVwdF9kZXRhY2goZGV2aWNlICptZSwKLQkJCWludCBteV9wb3J0LAotCQkJZGV2aWNlICpkZXN0LAotCQkJaW50IGRlc3RfcG9ydCkKLXsKLSAgZGV0YWNoX2RldmljZV9pbnRlcnJ1cHRfZWRnZShtZSwKLQkJCSAgICAgICAmbWUtPmludGVycnVwdF9kZXN0aW5hdGlvbnMsCi0JCQkgICAgICAgbXlfcG9ydCwKLQkJCSAgICAgICBkZXN0LAotCQkJICAgICAgIGRlc3RfcG9ydCk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9pbnRlcnJ1cHRfdHJhdmVyc2UoZGV2aWNlICptZSwKLQkJCSAgZGV2aWNlX2ludGVycnVwdF90cmF2ZXJzZV9mdW5jdGlvbiAqaGFuZGxlciwKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLSAgZGV2aWNlX2ludGVycnVwdF9lZGdlICppbnRlcnJ1cHRfZWRnZTsKLSAgZm9yIChpbnRlcnJ1cHRfZWRnZSA9IG1lLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25zOwotICAgICAgIGludGVycnVwdF9lZGdlICE9IE5VTEw7Ci0gICAgICAgaW50ZXJydXB0X2VkZ2UgPSBpbnRlcnJ1cHRfZWRnZS0+bmV4dCkgewotICAgIGhhbmRsZXIobWUsIGludGVycnVwdF9lZGdlLT5teV9wb3J0LAotCSAgICBpbnRlcnJ1cHRfZWRnZS0+ZGVzdCwgaW50ZXJydXB0X2VkZ2UtPmRlc3RfcG9ydCwKLQkgICAgZGF0YSk7Ci0gIH0KLX0KLQotSU5MSU5FX0RFVklDRVwKLShpbnQpCi1kZXZpY2VfaW50ZXJydXB0X2RlY29kZShkZXZpY2UgKm1lLAotCQkJY29uc3QgY2hhciAqcG9ydF9uYW1lLAotCQkJcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICBpZiAocG9ydF9uYW1lID09IE5VTEwgfHwgcG9ydF9uYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChpc2RpZ2l0KHBvcnRfbmFtZVswXSkpIHsKLSAgICByZXR1cm4gc3RydG91bChwb3J0X25hbWUsIE5VTEwsIDApOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yICpwb3J0cyA9Ci0gICAgICBtZS0+Y2FsbGJhY2stPmludGVycnVwdC5wb3J0czsKLSAgICBpZiAocG9ydHMgIT0gTlVMTCkgewotICAgICAgd2hpbGUgKHBvcnRzLT5uYW1lICE9IE5VTEwpIHsKLQlpZiAocG9ydHMtPmRpcmVjdGlvbiA9PSBiaWRpcmVjdF9wb3J0Ci0JICAgIHx8IHBvcnRzLT5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7Ci0JICBpZiAocG9ydHMtPm5yX3BvcnRzID4gMCkgewotCSAgICBpbnQgbGVuID0gc3RybGVuKHBvcnRzLT5uYW1lKTsKLQkgICAgaWYgKHN0cm5jbXAocG9ydF9uYW1lLCBwb3J0cy0+bmFtZSwgbGVuKSA9PSAwKSB7Ci0JICAgICAgaWYgKHBvcnRfbmFtZVtsZW5dID09ICdcMCcpCi0JCXJldHVybiBwb3J0cy0+bnVtYmVyOwotCSAgICAgIGVsc2UgaWYoaXNkaWdpdChwb3J0X25hbWVbbGVuXSkpIHsKLQkJaW50IHBvcnQgPSBwb3J0cy0+bnVtYmVyICsgc3RydG91bCgmcG9ydF9uYW1lW2xlbl0sIE5VTEwsIDApOwotCQlpZiAocG9ydCA+PSBwb3J0cy0+bnVtYmVyICsgcG9ydHMtPm5yX3BvcnRzKQotCQkgIGRldmljZV9lcnJvcihtZSwgIkludGVycnVwdCBwb3J0ICVzIG91dCBvZiByYW5nZSIsCi0JCQkgICAgICAgcG9ydF9uYW1lKTsKLQkJcmV0dXJuIHBvcnQ7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICBlbHNlIGlmIChzdHJjbXAocG9ydF9uYW1lLCBwb3J0cy0+bmFtZSkgPT0gMCkKLQkgICAgcmV0dXJuIHBvcnRzLT5udW1iZXI7Ci0JfQotCXBvcnRzKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGRldmljZV9lcnJvcihtZSwgIlVucmVjb25pemVkIGludGVycnVwdCBwb3J0ICVzIiwgcG9ydF9uYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KQotZGV2aWNlX2ludGVycnVwdF9lbmNvZGUoZGV2aWNlICptZSwKLQkJCWludCBwb3J0X251bWJlciwKLQkJCWNoYXIgKmJ1ZiwKLQkJCWludCBzaXplb2ZfYnVmLAotCQkJcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciAqcG9ydHMgPSBOVUxMOwotICBwb3J0cyA9IG1lLT5jYWxsYmFjay0+aW50ZXJydXB0LnBvcnRzOwotICBpZiAocG9ydHMgIT0gTlVMTCkgewotICAgIHdoaWxlIChwb3J0cy0+bmFtZSAhPSBOVUxMKSB7Ci0gICAgICBpZiAocG9ydHMtPmRpcmVjdGlvbiA9PSBiaWRpcmVjdF9wb3J0Ci0JICB8fCBwb3J0cy0+ZGlyZWN0aW9uID09IGRpcmVjdGlvbikgewotCWlmIChwb3J0cy0+bnJfcG9ydHMgPiAwKSB7Ci0JICBpZiAocG9ydF9udW1iZXIgPj0gcG9ydHMtPm51bWJlcgotCSAgICAgICYmIHBvcnRfbnVtYmVyIDwgcG9ydHMtPm51bWJlciArIHBvcnRzLT5ucl9wb3J0cykgewotCSAgICBzdHJjcHkoYnVmLCBwb3J0cy0+bmFtZSk7Ci0JICAgIHNwcmludGYoYnVmICsgc3RybGVuKGJ1ZiksICIlZCIsIHBvcnRfbnVtYmVyIC0gcG9ydHMtPm51bWJlcik7Ci0JICAgIGlmIChzdHJsZW4oYnVmKSA+PSBzaXplb2ZfYnVmKQotCSAgICAgIGVycm9yKCJkZXZpY2VfaW50ZXJydXB0X2VuY29kZTogYnVmZmVyIG92ZXJmbG93Iik7Ci0JICAgIHJldHVybiBzdHJsZW4oYnVmKTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICBpZiAocG9ydHMtPm51bWJlciA9PSBwb3J0X251bWJlcikgewotCSAgICBpZiAoc3RybGVuKHBvcnRzLT5uYW1lKSA+PSBzaXplb2ZfYnVmKQotCSAgICAgIGVycm9yKCJkZXZpY2VfaW50ZXJydXB0X2VuY29kZTogYnVmZmVyIG92ZXJmbG93Iik7Ci0JICAgIHN0cmNweShidWYsIHBvcnRzLT5uYW1lKTsKLQkgICAgcmV0dXJuIHN0cmxlbihidWYpOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIHBvcnRzKys7Ci0gICAgfQotICB9Ci0gIHNwcmludGYoYnVmLCAiJWQiLCBwb3J0X251bWJlcik7Ci0gIGlmIChzdHJsZW4oYnVmKSA+PSBzaXplb2ZfYnVmKQotICAgIGVycm9yKCJkZXZpY2VfaW50ZXJydXB0X2VuY29kZTogYnVmZmVyIG92ZXJmbG93Iik7Ci0gIHJldHVybiBzdHJsZW4oYnVmKTsKLX0KLQotCi0MCi0vKiBJT0NUTDogKi8KLQotRVhURVJOX0RFVklDRVwKLShpbnQpCi1kZXZpY2VfaW9jdGwoZGV2aWNlICptZSwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JICAgICBkZXZpY2VfaW9jdGxfcmVxdWVzdCByZXF1ZXN0LAotCSAgICAgLi4uKQotewotICBpbnQgc3RhdHVzOwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgcmVxdWVzdCk7Ci0gIGlmIChtZS0+Y2FsbGJhY2stPmlvY3RsID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gaW9jdGwgbWV0aG9kIik7Ci0gIHN0YXR1cyA9IG1lLT5jYWxsYmFjay0+aW9jdGwobWUsIHByb2Nlc3NvciwgY2lhLCByZXF1ZXN0LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0gICAgICAKLQotDAotLyogSS9PICovCi0KLUVYVEVSTl9ERVZJQ0VcCi0odm9pZCB2b2xhdGlsZSkKLWRldmljZV9lcnJvcihkZXZpY2UgKm1lLAotCSAgICAgY29uc3QgY2hhciAqZm10LAotCSAgICAgLi4uKQotewotICBjaGFyIG1lc3NhZ2VbMTAyNF07Ci0gIHZhX2xpc3QgYXA7Ci0gIC8qIGZvcm1hdCB0aGUgbWVzc2FnZSAqLwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgdnNwcmludGYobWVzc2FnZSwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoc3RybGVuKG1lc3NhZ2UpID49IHNpemVvZihtZXNzYWdlKSkKLSAgICBlcnJvcigiZGV2aWNlX2Vycm9yOiBidWZmZXIgb3ZlcmZsb3ciKTsKLSAgaWYgKG1lID09IE5VTEwpCi0gICAgZXJyb3IoImRldmljZTogJXMiLCBtZXNzYWdlKTsKLSAgZWxzZSBpZiAobWUtPnBhdGggIT0gTlVMTCAmJiBtZS0+cGF0aFswXSAhPSAnXDAnKQotICAgIGVycm9yKCIlczogJXMiLCBtZS0+cGF0aCwgbWVzc2FnZSk7Ci0gIGVsc2UgaWYgKG1lLT5uYW1lICE9IE5VTEwgJiYgbWUtPm5hbWVbMF0gIT0gJ1wwJykKLSAgICBlcnJvcigiJXM6ICVzIiwgbWUtPm5hbWUsIG1lc3NhZ2UpOwotICBlbHNlCi0gICAgZXJyb3IoImRldmljZTogJXMiLCBtZXNzYWdlKTsKLSAgd2hpbGUoMSk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KQotZGV2aWNlX3RyYWNlKGRldmljZSAqbWUpCi17Ci0gIHJldHVybiBtZS0+dHJhY2U7Ci19Ci0KLQwKLS8qIEV4dGVybmFsIHJlcHJlc2VudGF0aW9uICovCi0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopCi1leHRlcm5hbF90b19kZXZpY2UoZGV2aWNlICp0cmVlX21lbWJlciwKLQkJICAgdW5zaWduZWRfY2VsbCBwaGFuZGxlKQotewotICBkZXZpY2UgKm1lID0gY2FwX2ludGVybmFsKHRyZWVfbWVtYmVyLT5waGFuZGxlcywgcGhhbmRsZSk7Ci0gIHJldHVybiBtZTsKLX0KLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZF9jZWxsKQotZGV2aWNlX3RvX2V4dGVybmFsKGRldmljZSAqbWUpCi17Ci0gIHVuc2lnbmVkX2NlbGwgcGhhbmRsZSA9IGNhcF9leHRlcm5hbChtZS0+cGhhbmRsZXMsIG1lKTsKLSAgcmV0dXJuIHBoYW5kbGU7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlX2luc3RhbmNlICopCi1leHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGV2aWNlICp0cmVlX21lbWJlciwKLQkJCSAgICB1bnNpZ25lZF9jZWxsIGloYW5kbGUpCi17Ci0gIGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UgPSBjYXBfaW50ZXJuYWwodHJlZV9tZW1iZXItPmloYW5kbGVzLCBpaGFuZGxlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkX2NlbGwpCi1kZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgdW5zaWduZWRfY2VsbCBpaGFuZGxlID0gY2FwX2V4dGVybmFsKGluc3RhbmNlLT5vd25lci0+aWhhbmRsZXMsIGluc3RhbmNlKTsKLSAgcmV0dXJuIGloYW5kbGU7Ci19Ci0KLQotLyogTWFwIG9udG8gdGhlIGV2ZW50IGZ1bmN0aW9ucyAqLwotCi1JTkxJTkVfREVWSUNFXAotKGV2ZW50X2VudHJ5X3RhZykKLWRldmljZV9ldmVudF9xdWV1ZV9zY2hlZHVsZShkZXZpY2UgKm1lLAotCQkJICAgIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0JCQkgICAgZGV2aWNlX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0JCQkgICAgdm9pZCAqZGF0YSkKLXsKLSAgcmV0dXJuIGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHBzaW1fZXZlbnRfcXVldWUobWUtPnN5c3RlbSksCi0JCQkgICAgICBkZWx0YV90aW1lLAotCQkJICAgICAgaGFuZGxlciwKLQkJCSAgICAgIGRhdGEpOwotfQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfZXZlbnRfcXVldWVfZGVzY2hlZHVsZShkZXZpY2UgKm1lLAotCQkJICAgICAgZXZlbnRfZW50cnlfdGFnIGV2ZW50X3RvX3JlbW92ZSkKLXsKLSAgZXZlbnRfcXVldWVfZGVzY2hlZHVsZShwc2ltX2V2ZW50X3F1ZXVlKG1lLT5zeXN0ZW0pLAotCQkJIGV2ZW50X3RvX3JlbW92ZSk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0oc2lnbmVkNjQpCi1kZXZpY2VfZXZlbnRfcXVldWVfdGltZShkZXZpY2UgKm1lKQotewotICByZXR1cm4gZXZlbnRfcXVldWVfdGltZShwc2ltX2V2ZW50X3F1ZXVlKG1lLT5zeXN0ZW0pKTsKLX0KLQotCi0vKiBJbml0aWFsaXphdGlvbjogKi8KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfY2xlYW4oZGV2aWNlICptZSwKLQkgICAgIHZvaWQgKmRhdGEpCi17Ci0gIHBzaW0gKnN5c3RlbTsKLSAgc3lzdGVtID0gKHBzaW0qKWRhdGE7Ci0gIFRSQUNFKHRyYWNlX2RldmljZV9pbml0LCAoImRldmljZV9jbGVhbiAtIGluaXRpYWxpemluZyAlcyIsIG1lLT5wYXRoKSk7Ci0gIGNsZWFuX2RldmljZV9pbnRlcnJ1cHRfZWRnZXMoJm1lLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25zKTsKLSAgY2xlYW5fZGV2aWNlX2luc3RhbmNlcyhtZSk7Ci0gIGNsZWFuX2RldmljZV9wcm9wZXJ0aWVzKG1lKTsKLX0KLQotLyogRGV2aWNlIGluaXRpYWxpemF0aW9uOiAqLwotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpCi1kZXZpY2VfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUsCi0JCSAgICB2b2lkICpkYXRhKQotewotICBwc2ltICpzeXN0ZW0gPSAocHNpbSopZGF0YTsKLSAgaW50IG5yX2FkZHJlc3NfY2VsbHM7Ci0gIGludCBucl9zaXplX2NlbGxzOwotICBUUkFDRSh0cmFjZV9kZXZpY2VfaW5pdCwgKCJkZXZpY2VfaW5pdF9hZGRyZXNzIC0gaW5pdGlhbGl6aW5nICVzIiwgbWUtPnBhdGgpKTsKLQotICAvKiBlbnN1cmUgdGhlIGNhcCBkYXRhYmFzZSBpcyB2YWxpZCAqLwotICBpZiAobWUtPnBhcmVudCA9PSBOVUxMKSB7Ci0gICAgY2FwX2luaXQobWUtPmloYW5kbGVzKTsKLSAgICBjYXBfaW5pdChtZS0+cGhhbmRsZXMpOwotICB9Ci0KLSAgLyogc29tZSBiYXNpY3MgKi8KLSAgbWUtPnN5c3RlbSA9IHN5c3RlbTsgLyogbWlzYyB0aGluZ3Mgbm90IGtub3duIHVudGlsIG5vdyAqLwotICBtZS0+dHJhY2UgPSAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJ0cmFjZSIpCi0JICAgICAgID8gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInRyYWNlIikKLQkgICAgICAgOiAwKTsKLQotICAvKiBFbnN1cmUgdGhhdCB0aGUgZmlyc3QgYWRkcmVzcyBmb3VuZCBpbiB0aGUgcmVnIHByb3BlcnR5IG1hdGNoZXMKLSAgICAgYW55dGhpbmcgdGhhdCB3YXMgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGRldmljZXMgbmFtZSAqLwotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJyZWciKSAhPSBOVUxMKSB7Ci0gICAgcmVnX3Byb3BlcnR5X3NwZWMgdW5pdDsKLSAgICBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkobWUsICJyZWciLCAwLCAmdW5pdCk7Ci0gICAgaWYgKG1lbWNtcChkZXZpY2VfdW5pdF9hZGRyZXNzKG1lKSwgJnVuaXQuYWRkcmVzcywgc2l6ZW9mKHVuaXQuYWRkcmVzcykpCi0JIT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIlVuaXQgYWRkcmVzcyBhcyBzcGVjaWZpZWQgYnkgdGhlIHJlZyBwcm9wZXJ0eSBpbiBjb25mbGljdCB3aXRoIHRoZSB2YWx1ZSBwcmV2aW91c2x5IHNwZWNpZmllZCBpbiB0aGUgZGV2aWNlcyBwYXRoIik7Ci0gIH0KLQotICAvKiBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlcyAjYWRkcmVzcy9zaXplLWNlbGxzIGlzIGNvbnNpc3RlbnQgKi8KLSAgbnJfYWRkcmVzc19jZWxscyA9IGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKG1lKTsKLSAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiI2FkZHJlc3MtY2VsbHMiKSAhPSBOVUxMCi0gICAgICAmJiAobnJfYWRkcmVzc19jZWxscwotCSAgIT0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIiNhZGRyZXNzLWNlbGxzIikpKQotICAgIGRldmljZV9lcnJvcihtZSwgIiNhZGRyZXNzLWNlbGxzIHByb3BlcnR5IHVzZWQgYmVmb3JlIGRlZmluZWQiKTsKLSAgbnJfc2l6ZV9jZWxscyA9IGRldmljZV9ucl9zaXplX2NlbGxzKG1lKTsKLSAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiI3NpemUtY2VsbHMiKSAhPSBOVUxMCi0gICAgICAmJiAobnJfc2l6ZV9jZWxscwotCSAgIT0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIiNzaXplLWNlbGxzIikpKQotICAgIGRldmljZV9lcnJvcihtZSwgIiNzaXplLWNlbGxzIHByb3BlcnR5IHVzZWQgYmVmb3JlIGRlZmluZWQiKTsKLQotICAvKiBub3cgaW5pdCBpdCAqLwotICBpZiAobWUtPmNhbGxiYWNrLT5pbml0LmFkZHJlc3MgIT0gTlVMTCkKLSAgICBtZS0+Y2FsbGJhY2stPmluaXQuYWRkcmVzcyhtZSk7Ci19Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkKLWRldmljZV9pbml0X2RhdGEoZGV2aWNlICptZSwKLQkJICAgIHZvaWQgKmRhdGEpCi17Ci0gIFRSQUNFKHRyYWNlX2RldmljZV9pbml0LCAoImRldmljZV9pbml0X2RhdGEgLSBpbml0aWFsaXppbmcgJXMiLCBtZS0+cGF0aCkpOwotICBpZiAobWUtPmNhbGxiYWNrLT5pbml0LmRhdGEgIT0gTlVMTCkKLSAgICBtZS0+Y2FsbGJhY2stPmluaXQuZGF0YShtZSk7Ci19Ci0KLSNlbmRpZiAvKiBfREVWSUNFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RldmljZS5oIGIvc2ltL3BwYy9kZXZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjOGNlNS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzk3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0RFVklDRV9IXwotI2RlZmluZSBfREVWSUNFX0hfCi0KLSNpZm5kZWYgSU5MSU5FX0RFVklDRQotI2RlZmluZSBJTkxJTkVfREVWSUNFCi0jZW5kaWYKLQotLyogZGVjbGFyZWQgaW4gYmFzaWNzLmgsIHRoaXMgb2JqZWN0IGlzIHVzZWQgZXZlcnl3aGVyZSAqLwotLyogdHlwZWRlZiBzdHJ1Y3QgX2RldmljZSBkZXZpY2U7ICovCi0KLQotLyogSW50cm9kdWN0aW9uOgotCi0gICBBcyBleHBsYWluZWQgaW4gZWFybGllciBzZWN0aW9ucywgdGhlIGRldmljZSwgZGV2aWNlIGluc3RhbmNlLAotICAgcHJvcGVydHkgYW5kIGludGVycnVwdHMgbGllIGF0IHRoZSBoZWFydCBvZiBQU0lNJ3MgZGV2aWNlIG1vZGVsLgotCi0gICBJbiB0aGUgYmVsb3cgYSBzeW5vcHNpcyBvZiB0aGUgZGV2aWNlIG9iamVjdCBhbmQgdGhlIG9wZXJhdGlvbnMgaXQKLSAgIHN1cHBvcnRzIGFyZSBnaXZlbi4gIERldGFpbHMgb2YgdGhpcyBvYmplY3QgY2FuIGJlIGZvdW5kIGluIHRoZQotICAgZmlsZXMgPDxkZXZpY2UuaD4+IGFuZCA8PGRldmljZS5jPj4uCi0KLSAgICovCi0KLQotLyogRGV2aWNlIGNyZWF0aW9uOiAqLwotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZSAqKSBkZXZpY2VfY3JlYXRlCi0oZGV2aWNlICpwYXJlbnQsCi0gY29uc3QgY2hhciAqYmFzZSwKLSBjb25zdCBjaGFyICpuYW1lLAotIGNvbnN0IGNoYXIgKnVuaXRfYWRkcmVzcywKLSBjb25zdCBjaGFyICphcmdzKTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfdXNhZ2UKLShpbnQgdmVyYm9zZSk7Ci0KLQotLyogRGV2aWNlIGluaXRpYWxpemF0aW9uOiAqLwotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpIGRldmljZV9jbGVhbgotKGRldmljZSAqcm9vdCwKLSB2b2lkICpkYXRhKTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfaW5pdF9zdGF0aWNfcHJvcGVydGllcwotKGRldmljZSAqbWUsCi0gdm9pZCAqZGF0YSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2luaXRfYWRkcmVzcwotKGRldmljZSAqbWUsCi0gdm9pZCAqZGF0YSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2luaXRfcnVudGltZV9wcm9wZXJ0aWVzCi0oZGV2aWNlICptZSwKLSB2b2lkICpkYXRhKTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfaW5pdF9kYXRhCi0oZGV2aWNlICptZSwKLSB2b2lkICpkYXRhKTsKLQotCi0vKiBSZWxhdGlvbnNoaXBzOgotCi0gICBBIGRldmljZSBpcyBhYmxlIHRvIGRldGVybWluZSBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGRldmljZXMKLSAgIHdpdGhpbiB0aGUgdHJlZS4gIE9wZXJhdGlvbnMgaW5jbHVkZSBxdWVyeWluZyBmb3IgYSBkZXZpY2VzIHBhcmVudCwKLSAgIHNpYmxpbmcsIGNoaWxkLCBuYW1lLCBhbmQgcGF0aCAoZnJvbSB0aGUgcm9vdCkuCi0KLSAgICovCi0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopIGRldmljZV9wYXJlbnQKLShkZXZpY2UgKm1lKTsKLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2UgKikgZGV2aWNlX3Jvb3QKLShkZXZpY2UgKm1lKTsKLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2UgKikgZGV2aWNlX3NpYmxpbmcKLShkZXZpY2UgKm1lKTsKLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2UgKikgZGV2aWNlX2NoaWxkCi0oZGV2aWNlICptZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oY29uc3QgY2hhciAqKSBkZXZpY2VfbmFtZQotKGRldmljZSAqbWUpOwotCi1JTkxJTkVfREVWSUNFXAotKGNvbnN0IGNoYXIgKikgZGV2aWNlX2Jhc2UKLShkZXZpY2UgKm1lKTsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopIGRldmljZV9wYXRoCi0oZGV2aWNlICptZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCAqKSBkZXZpY2VfZGF0YQotKGRldmljZSAqbWUpOwotCi1JTkxJTkVfREVWSUNFXAotKHBzaW0gKikgZGV2aWNlX3N5c3RlbQotKGRldmljZSAqbWUpOwotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX3VuaXQgewotICBpbnQgbnJfY2VsbHM7Ci0gIHVuc2lnbmVkX2NlbGwgY2VsbHNbNF07IC8qIHVudXNlZCBjZWxscyBhcmUgemVybyAqLwotfSBkZXZpY2VfdW5pdDsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBkZXZpY2VfdW5pdCAqKSBkZXZpY2VfdW5pdF9hZGRyZXNzCi0oZGV2aWNlICptZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfZGVjb2RlX3VuaXQKLShkZXZpY2UgKmJ1cywKLSBjb25zdCBjaGFyICp1bml0LAotIGRldmljZV91bml0ICphZGRyZXNzKTsKLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV9lbmNvZGVfdW5pdAotKGRldmljZSAqYnVzLAotIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCi0gY2hhciAqYnVmLAotIGludCBzaXplb2ZfYnVmKTsKLQotCi0vKiBDb252ZXJ0IGFuIE9wZW4gRmlybXdhcmUgc2l6ZSBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IgYXR0YWNoCi0gICBhZGRyZXNzIGNhbGxzLgotCi0gICBSZXR1cm4gYSB6ZXJvIHJlc3VsdCBpZiB0aGUgYWRkcmVzcyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGxvb2tpbmcKLSAgIGZvciBhdHRhY2ggYWRkcmVzc2VzICovCi0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcwotKGRldmljZSAqbWUsCi0gY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MsCi0gaW50ICphdHRhY2hfc3BhY2UsCi0gdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHJlc3MsCi0gZGV2aWNlICpjbGllbnQpOwotCi0KLS8qIENvbnZlcnQgYW4gT3BlbiBGaXJtd2FyZSBzaXplIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciBhdHRhY2gKLSAgIGFkZHJlc3MgY2FsbHMKLQotICAgUmV0dXJuIGEgemVybyByZXN1bHQgaWYgdGhlIGFkZHJlc3Mgc2hvdWxkIGJlIGlnbm9yZWQgKi8KLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplCi0oZGV2aWNlICptZSwKLSBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSwKLSB1bnNpZ25lZCAqbnJfYnl0ZXMsCi0gZGV2aWNlICpjbGllbnQpOwotCi0KLUlOTElORV9ERVZJQ0VcCi0odW5zaWduZWQpIGRldmljZV9ucl9hZGRyZXNzX2NlbGxzCi0oZGV2aWNlICptZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odW5zaWduZWQpIGRldmljZV9ucl9zaXplX2NlbGxzCi0oZGV2aWNlICptZSk7Ci0KLQotLyogUHJvcGVydGllczoKLQotICAgQXR0YWNoZWQgdG8gYSBkZXZpY2UgYXJlIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMuICBFYWNoIHByb3BlcnR5IGhhcwotICAgYSBzaXplIGFuZCB0eXBlIChib3RoIG9mIHdoaWNoIGNhbiBiZSBxdWVyaWVkKS4gIEEgZGV2aWNlIGlzIGFibGUKLSAgIHRvIGl0ZXJhdGUgb3ZlciBvciBxdWVyeSBhbmQgc2V0IGEgcHJvcGVydGllcyB2YWx1ZS4KLQotICAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgcHJvcGVydHkgdHlwZXMuICBUaGUgcHJvcGVydHkgYGFycmF5JyBpcwotICAgZm9yIGdlbmVyaWMgdW50eXBlZCBkYXRhLiAqLwotCi10eXBlZGVmIGVudW0gewotICBhcnJheV9wcm9wZXJ0eSwKLSAgYm9vbGVhbl9wcm9wZXJ0eSwKLSAgaWhhbmRsZV9wcm9wZXJ0eSwgLypydW50aW1lKi8KLSAgaW50ZWdlcl9wcm9wZXJ0eSwKLSAgcmFuZ2VfYXJyYXlfcHJvcGVydHksCi0gIHJlZ19hcnJheV9wcm9wZXJ0eSwKLSAgc3RyaW5nX3Byb3BlcnR5LAotICBzdHJpbmdfYXJyYXlfcHJvcGVydHksCi19IGRldmljZV9wcm9wZXJ0eV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX3Byb3BlcnR5IGRldmljZV9wcm9wZXJ0eTsKLXN0cnVjdCBfZGV2aWNlX3Byb3BlcnR5IHsKLSAgZGV2aWNlICpvd25lcjsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZGV2aWNlX3Byb3BlcnR5X3R5cGUgdHlwZTsKLSAgdW5zaWduZWQgc2l6ZW9mX2FycmF5OwotICBjb25zdCB2b2lkICphcnJheTsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbDsKLSAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOwotfTsKLQotCi0vKiBpdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8gYSBkZXZpY2UgKi8KLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX25leHRfcHJvcGVydHkKLShjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByZXZpb3VzKTsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX2ZpbmRfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsgLyogTlVMTCBmb3IgZmlyc3QgcHJvcGVydHkgKi8KLQotCi0vKiBNYW5pcHVsYXRlIHRoZSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byBhIGdpdmVuIGRldmljZS4KLQotICAgU0VUIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgZm9yY2UgdGhlIHByb3BlcnRpZXMgdmFsdWUuICBUaGUKLSAgIHNpbXVsYXRpb24gaXMgYWJvcnRlZCBpZiB0aGUgcHJvcGVydHkgd2FzIHByZXNlbnQgYnV0IG9mIGEKLSAgIGNvbmZsaWN0aW5nIHR5cGUuCi0KLSAgIEZJTkQgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgdmFsdWUsIGFib3J0aW5nIHRoZQotICAgc2ltdWxhdGlvbiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZy4gIENvZGUgbG9jYXRpbmcgYSBwcm9wZXJ0eQotICAgc2hvdWxkIGZpcnN0IGNoZWNrIGl0cyB0eXBlICh1c2luZyBkZXZpY2VfZmluZF9wcm9wZXJ0eSBhYm92ZSkgYW5kCi0gICB0aGVuIG9idGFpbiBpdHMgdmFsdWUgdXNpbmcgdGhlIGJlbG93LgotCi0gICB2b2lkIGRldmljZV9hZGRfPHR5cGU+X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIDx0eXBlPikKLSAgIHZvaWQgZGV2aWNlX2FkZF8qX2FycmF5X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IDx0eXBlPiosIGludCkKLSAgIHZvaWQgZGV2aWNlX3NldF8qX3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIDx0eXBlPikKLSAgIHZvaWQgZGV2aWNlX3NldF8qX2FycmF5X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IDx0eXBlPiosIGludCkKLSAgIDx0eXBlPiBkZXZpY2VfZmluZF8qX3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICopCi0gICBpbnQgZGV2aWNlX2ZpbmRfKl9hcnJheV9wcm9wZXJ0eShkZXZpY2UgKiwgY29uc3QgY2hhciAqLCBpbnQsIDx0eXBlPiopCi0KLSAgICovCi0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfYWRkX2FycmF5X3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBjb25zdCB2b2lkICphcnJheSwKLSBpbnQgc2l6ZW9mX2FycmF5KTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2Vfc2V0X2FycmF5X3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBjb25zdCB2b2lkICphcnJheSwKLSBpbnQgc2l6ZW9mX2FycmF5KTsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX2ZpbmRfYXJyYXlfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKLQotCi0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBpbnQgYm9vbCk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSk7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCBfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgewotICBjb25zdCBjaGFyICpmdWxsX3BhdGg7Ci19IGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjOwotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpIGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBjb25zdCBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX3NldF9paGFuZGxlX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGUpOwotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZV9pbnN0YW5jZSAqKSBkZXZpY2VfZmluZF9paGFuZGxlX3Byb3BlcnR5Ci0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpwcm9wZXJ0eSk7Ci0KLQotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpIGRldmljZV9hZGRfaW50ZWdlcl9wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gc2lnbmVkX2NlbGwgaW50ZWdlcik7Ci0KLUlOTElORV9ERVZJQ0VcCi0oc2lnbmVkX2NlbGwpIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIHVuc2lnbmVkIGluZGV4LAotIHNpZ25lZF93b3JkICppbnRlZ2VyKTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IF9yYW5nZV9wcm9wZXJ0eV9zcGVjIHsKLSAgZGV2aWNlX3VuaXQgY2hpbGRfYWRkcmVzczsKLSAgZGV2aWNlX3VuaXQgcGFyZW50X2FkZHJlc3M7Ci0gIGRldmljZV91bml0IHNpemU7Ci19IHJhbmdlX3Byb3BlcnR5X3NwZWM7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2FkZF9yYW5nZV9hcnJheV9wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2VzLAotIHVuc2lnbmVkIG5yX3Jhbmdlcyk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gdW5zaWduZWQgaW5kZXgsCi0gcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2UpOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX3JlZ19wcm9wZXJ0eV9zcGVjIHsKLSAgZGV2aWNlX3VuaXQgYWRkcmVzczsKLSAgZGV2aWNlX3VuaXQgc2l6ZTsKLX0gcmVnX3Byb3BlcnR5X3NwZWM7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2FkZF9yZWdfYXJyYXlfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcsCi0gdW5zaWduZWQgbnJfcmVncyk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIHVuc2lnbmVkIGluZGV4LAotIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcpOwotCi0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfYWRkX3N0cmluZ19wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgY2hhciAqc3RyaW5nKTsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopIGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHkpOwotCi0KLQotdHlwZWRlZiBjb25zdCBjaGFyICpzdHJpbmdfcHJvcGVydHlfc3BlYzsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCi0gdW5zaWduZWQgbnJfc3RyaW5ncyk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnByb3BlcnR5LAotIHVuc2lnbmVkIGluZGV4LAotIHN0cmluZ19wcm9wZXJ0eV9zcGVjICpzdHJpbmcpOwotCi0KLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eQotKGRldmljZSAqbWUsCi0gY29uc3QgY2hhciAqcHJvcGVydHksCi0gY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbCk7Ci0KLQotCi0vKiBJbnN0YW5jZXM6Ci0KLSAgIEFzIHdpdGggSUVFRTEyNzUsIGEgZGV2aWNlIGNhbiBiZSBvcGVuZWQsIGNyZWF0aW5nIGFuIGluc3RhbmNlLgotICAgSW5zdGFuY2VzIHByb3ZpZGUgbW9yZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHRvIHRoZSB1bmRlcmx5aW5nCi0gICBoYXJkd2FyZS4gIEZvciBleGFtcGxlLCB0aGUgaW5zdGFuY2UgbWV0aG9kcyBmb3IgYSBkaXNrIG1heSBpbmNsdWRlCi0gICBjb2RlIHRoYXQgaXMgYWJsZSB0byBpbnRlcnByZXQgZmlsZSBzeXN0ZW1zIGZvdW5kIG9uIGRpc2tzLiAgU3VjaAotICAgbWV0aG9kcyB3b3VsZCB0aGVyZSBmb3IgYWxsb3cgdGhlIG1hbmlwdWxhdGlvbiBvZiBmaWxlcyBvbiB0aGUKLSAgIGRpc2tzIGZpbGUgc3lzdGVtLiAgVGhlIG9wZXJhdGlvbnMgd291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCi0gICBiYXNpYyBibG9jayBJL08gbW9kZWwgcHJvdmlkZWQgYnkgdGhlIGRpc2suCi0KLSAgIFRoaXMgbW9kZWwgaW5jbHVkZXMgbWV0aG9kcyB0aGF0IGZhY2lsaWF0ZSB0aGUgY3JlYXRpb24gb2YgZGV2aWNlCi0gICBpbnN0YW5jZSBhbmQgKHNob3VsZCBhIGdpdmVuIGRldmljZSBzdXBwb3J0IGl0KSBzdGFuZGFyZCBvcGVyYXRpb25zCi0gICBvbiB0aG9zZSBpbnN0YW5jZXMuCi0KLSAgICovCi0KLXR5cGVkZWYgc3RydWN0IF9kZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3M7Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlX2luc3RhbmNlICopIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbQotKGRldmljZSAqbWUsIC8qT1IqLyBkZXZpY2VfaW5zdGFuY2UgKnBhcmVudCwKLSB2b2lkICpkYXRhLAotIGNvbnN0IGNoYXIgKnBhdGgsCi0gY29uc3QgY2hhciAqYXJncywKLSBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzICpjYWxsYmFja3MpOwotCi1JTkxJTkVfREVWSUNFXAotKGRldmljZV9pbnN0YW5jZSAqKSBkZXZpY2VfY3JlYXRlX2luc3RhbmNlCi0oZGV2aWNlICptZSwKLSBjb25zdCBjaGFyICpmdWxsX3BhdGgsCi0gY29uc3QgY2hhciAqYXJncyk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2luc3RhbmNlX2RlbGV0ZQotKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpOwotCi1JTkxJTkVfREVWSUNFXAotKGludCkgZGV2aWNlX2luc3RhbmNlX3JlYWQKLShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotIHZvaWQgKmFkZHIsCi0gdW5zaWduZWRfd29yZCBsZW4pOwotCi1JTkxJTkVfREVWSUNFXAotKGludCkgZGV2aWNlX2luc3RhbmNlX3dyaXRlCi0oZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLSBjb25zdCB2b2lkICphZGRyLAotIHVuc2lnbmVkX3dvcmQgbGVuKTsKLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV9pbnN0YW5jZV9zZWVrCi0oZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLSB1bnNpZ25lZF93b3JkIHBvc19oaSwKLSB1bnNpZ25lZF93b3JkIHBvc19sbyk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QKLShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotIGNvbnN0IGNoYXIgKm1ldGhvZCwKLSBpbnQgbl9zdGFja19hcmdzLAotIHVuc2lnbmVkX2NlbGwgc3RhY2tfYXJnc1svKm5fc3RhY2tfYXJncyovXSwKLSBpbnQgbl9zdGFja19yZXR1cm5zLAotIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopIGRldmljZV9pbnN0YW5jZV9kZXZpY2UKLShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKTsKLQotSU5MSU5FX0RFVklDRVwKLShjb25zdCBjaGFyICopIGRldmljZV9pbnN0YW5jZV9wYXRoCi0oZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCAqKSBkZXZpY2VfaW5zdGFuY2VfZGF0YQotKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpOwotCi0KLS8qIEludGVycnVwdHM6Ci0KLSAgICovCi0KLS8qIEludGVycnVwdCBTb3VyY2UKLQotICAgQSBkZXZpY2UgZHJpdmVzIGl0cyBpbnRlcnJ1cHQgbGluZSB1c2luZyB0aGUgY2FsbAotCi0gICAqLwotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQKLShkZXZpY2UgKm1lLAotIGludCBteV9wb3J0LAotIGludCB2YWx1ZSwKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLS8qIFRoaXMgaW50ZXJydXB0IGV2ZW50IHdpbGwgdGhlbiBiZSBwcm9wb2dhdGVkIHRvIGFueSBhdHRhY2hlZAotICAgaW50ZXJydXB0IGRlc3RpbmF0aW9ucy4KLQotICAgQW55IGludGVycHJldGF0aW9uIG9mIFBPUlQgYW5kIFZBTFVFIGlzIG1vZGVsIGRlcGVuZGFudC4gIEhvd2V2ZXIKLSAgIGFzIGd1aWRlbGluZXMgdGhlIGZvbGxvd2luZyBhcmUgcmVjb21tZW5kZWQ6IFBDSSBpbnRlcnJ1cHRzIGEtZAotICAgY29ycmVzcG9uZCB0byBsaW5lcyAwLTM7IGxldmVsIHNlbnNhdGl2ZSBpbnRlcnJ1cHRzIGJlIHJlcXVlc3RlZAotICAgd2l0aCBhIHZhbHVlIG9mIG9uZSBhbmQgd2l0aGRyYXduIHdpdGggYSB2YWx1ZSBvZiAwOyBlZGdlIHNlbnNhdGl2ZQotICAgaW50ZXJydXB0cyBhbHdheXMgaGF2ZSBhIHZhbHVlIG9mIDEsIHRoZSBldmVudCBpdHMgc2VsZiBpcyB0cmVhdGVkCi0gICBhcyB0aGUgaW50ZXJydXB0LgotCi0KLSAgIEludGVycnVwdCBEZXN0aW5hdGlvbnMKLQotICAgQXR0YWNoZWQgdG8gZWFjaCBpbnRlcnJ1cHQgbGluZSBvZiBhIGRldmljZSBjYW4gYmUgemVybyBvciBtb3JlCi0gICBkZXNpdGluYXRpb25zLiAgVGhlc2UgZGVzdGluYXRpb25zIGNvbnNpc3Qgb2YgYSBkZXZpY2UvcG9ydCBwYWlyLgotICAgQSBkZXN0aW5hdGlvbiBpcyBhdHRhY2hlZC9kZXRhY2hlZCB0byBhIGRldmljZSBsaW5lIHVzaW5nIHRoZQotICAgYXR0YWNoIGFuZCBkZXRhY2ggY2FsbHMuICovCi0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2ludGVycnVwdF9hdHRhY2gKLShkZXZpY2UgKm1lLAotIGludCBteV9wb3J0LAotIGRldmljZSAqZGVzdCwKLSBpbnQgZGVzdF9wb3J0LAotIG9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbik7Ci0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2ludGVycnVwdF9kZXRhY2gKLShkZXZpY2UgKm1lLAotIGludCBteV9wb3J0LAotIGRldmljZSAqZGVzdCwKLSBpbnQgZGVzdF9wb3J0KTsKLQotdHlwZWRlZiB2b2lkIChkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlX2Z1bmN0aW9uKQotICAgICAoZGV2aWNlICptZSwKLSAgICAgIGludCBteV9wb3J0LAotICAgICAgZGV2aWNlICpkZXN0LAotICAgICAgaW50IG15X2Rlc3QsCi0gICAgICB2b2lkICpkYXRhKTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlCi0oZGV2aWNlICptZSwKLSBkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlX2Z1bmN0aW9uICpoYW5kbGVyLAotIHZvaWQgKmRhdGEpOwotIAotCi0vKiBERVNUSU5BVElPTiBpcyBhdHRhY2hlZCAoZGV0YWNoZWQpIHRvIExJTkUgb2YgdGhlIGRldmljZSBNRQotCi0KLSAgIEludGVycnVwdCBjb252ZXJzaW9uCi0KLSAgIFVzZXJzIHJlZmVyIHRvIGludGVycnVwdCBwb3J0IG51bWJlcnMgc3ltYm9saWNhbGx5LiAgRm9yIGluc3RhbmNlIGEKLSAgIGRldmljZSBtYXkgcmVmZXIgdG8gaXRzIGBJTlQnIHNpZ25hbCB3aGljaCBpcyBpbnRlcm5hbGx5Ci0gICByZXByZXNlbnRlZCBieSBwb3J0IDMuCi0KLSAgIFRvIGNvbnZlcnQgdG8vZnJvbSB0aGUgc3ltYm9saWMgYW5kIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgIHBvcnQgbmFtZS9udW1iZXIuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqLwotCi1JTkxJTkVfREVWSUNFXAotKGludCkgZGV2aWNlX2ludGVycnVwdF9kZWNvZGUKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKnN5bWJvbGljX25hbWUsCi0gcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV9pbnRlcnJ1cHRfZW5jb2RlCi0oZGV2aWNlICptZSwKLSBpbnQgcG9ydF9udW1iZXIsCi0gY2hhciAqYnVmLAotIGludCBzaXplb2ZfYnVmLAotIHBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0gCi0KLS8qIEhhcmR3YXJlIG9wZXJhdGlvbnM6Ci0KLSAgICovCi0KLUlOTElORV9ERVZJQ0VcCi0odW5zaWduZWQpIGRldmljZV9pb19yZWFkX2J1ZmZlcgotKGRldmljZSAqbWUsCi0gdm9pZCAqZGVzdCwKLSBpbnQgc3BhY2UsCi0gdW5zaWduZWRfd29yZCBhZGRyLAotIHVuc2lnbmVkIG5yX2J5dGVzLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZCkgZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcgotKGRldmljZSAqbWUsCi0gY29uc3Qgdm9pZCAqc291cmNlLAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMsCi0gY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi0KLS8qIENvbnZlcnNseSwgdGhlIGRldmljZSBwY2kxMDAwLDFAMSBteSBuZWVkIHRvIHBlcmZvcm0gYSBkbWEgdHJhbnNmZXIKLSAgIGludG8gdGhlIGNwdS9tZW1vcnkgY29yZS4gIEp1c3QgYXMgSS9PIG1vdmVzIHRvd2FyZHMgdGhlIGxlYXZlcywKLSAgIGRtYSB0cmFuc2ZlcnMgbW92ZSB0b3dhcmRzIHRoZSBjb3JlIHZpYSB0aGUgaW5pdGlhdGluZyBkZXZpY2VzCi0gICBwYXJlbnQgbm9kZXMuICBUaGUgcm9vdCBkZXZpY2UgKHNwZWNpYWwpIGNvbnZlcnRzIHRoZSBETUEgdHJhbnNmZXIKLSAgIGludG8gcmVhZHMvd3JpdGVzIHRvIG1lbW9yeSAqLwotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkKSBkZXZpY2VfZG1hX3JlYWRfYnVmZmVyCi0oZGV2aWNlICptZSwKLSB2b2lkICpkZXN0LAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMpOwotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkKSBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcgotKGRldmljZSAqbWUsCi0gY29uc3Qgdm9pZCAqc291cmNlLAotIGludCBzcGFjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMsCi0gaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOwotCi0vKiBUbyBhdm9pZCB0aGUgbmVlZCBmb3IgYW4gaW50ZXJtZWRpYXRlIChicmlkZ2luZykgbm9kZSB0byBhc2sgZWFjaAotICAgb2YgaXRzIGNoaWxkIGRldmljZXMgaW4gdHVybiBpZiBhbiBJTyBhY2Nlc3MgaXMgaW50ZW5kZWQgZm9yIHRoZW0sCi0gICBwYXJlbnQgbm9kZXMgbWFpbnRhaW4gYSB0YWJsZSBtYXBwaW5nIGFkZHJlc3NlcyBkaXJlY3RseSB0bwotICAgc3BlY2lmaWMgZGV2aWNlcy4gIFdoZW4gYSBkZXZpY2UgaXMgYGNvbm5lY3RlZCcgdG8gaXRzIGJ1cyBpdAotICAgYXR0YWNoZXMgaXRzIHNlbGYgdG8gaXRzIHBhcmVudC4gKi8KLQotLyogQWRkcmVzcyBhY2Nlc3MgYXR0cmlidXRlcyAqLwotdHlwZWRlZiBlbnVtIF9hY2Nlc3NfdHlwZSB7Ci0gIGFjY2Vzc19pbnZhbGlkID0gMCwKLSAgYWNjZXNzX3JlYWQgPSAxLAotICBhY2Nlc3Nfd3JpdGUgPSAyLAotICBhY2Nlc3NfcmVhZF93cml0ZSA9IDMsCi0gIGFjY2Vzc19leGVjID0gNCwKLSAgYWNjZXNzX3JlYWRfZXhlYyA9IDUsCi0gIGFjY2Vzc193cml0ZV9leGVjID0gNiwKLSAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYyA9IDcsCi19IGFjY2Vzc190eXBlOwotCi0vKiBBZGRyZXNzIGF0dGFjaGVtZW50IHR5cGVzICovCi10eXBlZGVmIGVudW0gX2F0dGFjaF90eXBlIHsKLSAgYXR0YWNoX2ludmFsaWQsCi0gIGF0dGFjaF9yYXdfbWVtb3J5LAotICBhdHRhY2hfY2FsbGJhY2ssCi0gIC8qIC4uLiAqLwotfSBhdHRhY2hfdHlwZTsKLQotSU5MSU5FX0RFVklDRVwKLSh2b2lkKSBkZXZpY2VfYXR0YWNoX2FkZHJlc3MKLShkZXZpY2UgKm1lLAotIGF0dGFjaF90eXBlIGF0dGFjaCwKLSBpbnQgc3BhY2UsCi0gdW5zaWduZWRfd29yZCBhZGRyLAotIHVuc2lnbmVkIG5yX2J5dGVzLAotIGFjY2Vzc190eXBlIGFjY2VzcywKLSBkZXZpY2UgKmNsaWVudCk7IC8qY2FsbGJhY2svZGVmYXVsdCovCi0KLUlOTElORV9ERVZJQ0VcCi0odm9pZCkgZGV2aWNlX2RldGFjaF9hZGRyZXNzCi0oZGV2aWNlICptZSwKLSBhdHRhY2hfdHlwZSBhdHRhY2gsCi0gaW50IHNwYWNlLAotIHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZCBucl9ieXRlcywKLSBhY2Nlc3NfdHlwZSBhY2Nlc3MsCi0gZGV2aWNlICpjbGllbnQpOyAvKmNhbGxiYWNrL2RlZmF1bHQqLwotCi0vKiBVdGlsaXRpZXM6Ci0KLSAgICovCi0KLS8qIElPQ1RMOjoKLQotICAgT2Z0ZW4gZGV2aWNlcyByZXF1aXJlIGBvdXQgb2YgYmFuZCcgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuCi0gICBGb3IgaW5zdGFuY2UgYSBwYWwgZGV2aWNlIG1heSBuZWVkIHRvIG5vdGlmeSBhIFBDSSBicmlkZ2UgZGV2aWNlCi0gICB0aGF0IGFuIGludGVycnVwdCBhY2sgY3ljbGUgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBQQ0kgYnVzLgotICAgV2l0aGluIFBTSU0gc3VjaCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgdXNpbmcgdGhlIGdlbmVyaWMKLSAgIGlvY3RsIGNhbGwgPDxkZXZpY2VfaW9jdGwoKT4+LgotCi0gICAqLwotCi10eXBlZGVmIGVudW0gewotICBkZXZpY2VfaW9jdGxfYnJlYWssIC8qIHVuc2lnbmVkX3dvcmQgcmVxdWVzdGVkX2JyZWFrICovCi0gIGRldmljZV9pb2N0bF9zZXRfdHJhY2UsIC8qIHZvaWQgKi8KLSAgZGV2aWNlX2lvY3RsX2NyZWF0ZV9zdGFjaywgLyogdW5zaWduZWRfd29yZCAqc3AsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCAqLwotICBkZXZpY2VfaW9jdGxfY2hhbmdlX21lZGlhLCAvKiBjb25zdCBjaGFyICpuZXdfaW1hZ2UgKHBvc3NpYmx5IE5VTEwpICovCi0gIG5yX2RldmljZV9pb2N0bF9yZXF1ZXN0cywKLX0gZGV2aWNlX2lvY3RsX3JlcXVlc3Q7Ci0KLUVYVEVSTl9ERVZJQ0VcCi0oaW50KSBkZXZpY2VfaW9jdGwKLShkZXZpY2UgKm1lLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhLAotIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCi0gLi4uKTsKLQotCi0vKiBFcnJvciByZXBvcnRpbmc6OgotCi0gICBTbyB0aGF0IGVycm9ycyBvcmlnaW5hdGluZyBmcm9tIGRldmljZXMgYXBwZWFyIGluIGEgY29uc2lzdGVudAotICAgZm9ybWF0LCB0aGUgPDxkZXZpY2VfZXJyb3IoKT4+IGZ1bmN0aW9uIGNhbiBiZSB1c2VkLiAgRm9ybWF0cyBhbmQKLSAgIG91dHB1dHMgdGhlIGVycm9yIG1lc3NhZ2UgYmVmb3JlIGFib3J0aW5nIHRoZSBzaW11bGF0aW9uCi0KLSAgIERldmljZXMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBzaW11bGF0aW9uIGV4Y2VwdAotICAgd2hlbiB0aGUgYWJvcnQgcmVhc29uIGxlYXZlcyB0aGUgc2ltdWxhdGlvbiBpbiBhIGhhemFyZG91cwotICAgY29uZGl0aW9uIChmb3IgaW5zdGFuY2UgYSBmYWlsZWQgbWFsbG9jKS4KLQotICAgKi8KLQotRVhURVJOX0RFVklDRVwKLSh2b2lkIHZvbGF0aWxlKSBkZXZpY2VfZXJyb3IKLShkZXZpY2UgKm1lLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLQotSU5MSU5FX0RFVklDRVwKLShpbnQpIGRldmljZV90cmFjZQotKGRldmljZSAqbWUpOwotCi0KLQotLyogRXh0ZXJuYWwgcmVwcmVzZW50YXRpb246Ci0KLSAgIEJvdGggZGV2aWNlIG5vZGVzIGFuZCBkZXZpY2UgaW5zdGFuY2VzLCBpbiBPcGVuQm9vdCBmaXJtd2FyZSBoYXZlCi0gICBhbiBleHRlcm5hbCByZXByZXNlbnRhdGlvbiAocGhhbmRsZXMgYW5kIGloYW5kbGVzKSBhbmQgdGhlc2UgdmFsdWVzCi0gICBhcmUgYm90aCBzdG9yZWQgaW4gdGhlIGRldmljZSB0cmVlIGluIHByb3BlcnR5IG5vZGVzIGFuZCBwYXNzZWQKLSAgIGJldHdlZW4gdGhlIGNsaWVudCBwcm9ncmFtIGFuZCB0aGUgc2ltdWxhdG9yIGR1cmluZyBlbXVsYXRpb24KLSAgIGNhbGxzLgotCi0gICBUbyBsaW1pdCB0aGUgcG90ZW50aWFsIHJpc2sgYXNzb2NpYXRlZCB3aXRoIHRydXNpbmcgYGRhdGEnIGZyb20gdGhlCi0gICBjbGllbnQgcHJvZ3JhbSwgdGhlIGZvbGxvd2luZyBtYXBwaW5nIG9wZXJhdG9ycyBgc2FmZWx5JyBjb252ZXJ0Ci0gICBiZXR3ZWVuIHRoZSB0d28gcmVwcmVzZW50YXRpb25zCi0KLSAgICovCi0KLUlOTElORV9ERVZJQ0VcCi0oZGV2aWNlICopIGV4dGVybmFsX3RvX2RldmljZQotKGRldmljZSAqdHJlZV9tZW1iZXIsCi0gdW5zaWduZWRfY2VsbCBwaGFuZGxlKTsKLQotSU5MSU5FX0RFVklDRVwKLSh1bnNpZ25lZF9jZWxsKSBkZXZpY2VfdG9fZXh0ZXJuYWwKLShkZXZpY2UgKm1lKTsKLQotSU5MSU5FX0RFVklDRVwKLShkZXZpY2VfaW5zdGFuY2UgKikgZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlCi0oZGV2aWNlICp0cmVlX21lbWJlciwKLSB1bnNpZ25lZF9jZWxsIGloYW5kbGUpOwotCi1JTkxJTkVfREVWSUNFXAotKHVuc2lnbmVkX2NlbGwpIGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbAotKGRldmljZV9pbnN0YW5jZSAqbWUpOwotCi0KLS8qIEV2ZW50IHF1ZXVlOgotCi0gICBUaGUgZGV2aWNlIGluaGVyZXRzIGNlcnRhaW4gZXZlbnQgcXVldWUgb3BlcmF0aW9ucyBmcm9tIHRoZSBtYWluCi0gICBzaW11bGF0aW9uLiAqLwotCi10eXBlZGVmIHZvaWQgZGV2aWNlX2V2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSk7Ci0KLUlOTElORV9ERVZJQ0VcCi0oZXZlbnRfZW50cnlfdGFnKSBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUKLShkZXZpY2UgKm1lLAotIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0gZGV2aWNlX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0gdm9pZCAqZGF0YSk7Ci0KLUlOTElORV9FVkVOVFNcCi0odm9pZCkgZGV2aWNlX2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUKLShkZXZpY2UgKm1lLAotIGV2ZW50X2VudHJ5X3RhZyBldmVudF90b19yZW1vdmUpOwotCi1JTkxJTkVfRVZFTlRTXAotKHNpZ25lZDY0KSBkZXZpY2VfZXZlbnRfcXVldWVfdGltZQotKGRldmljZSAqbWUpOwotCi0jZW5kaWYgLyogX0RFVklDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kZXZpY2VfdGFibGUuYyBiL3NpbS9wcGMvZGV2aWNlX3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzcyYWIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9kZXZpY2VfdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9ERVZJQ0VfVEFCTEVfQ18KLSNkZWZpbmUgX0RFVklDRV9UQUJMRV9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQotLyogSGVscGVyIGZ1bmN0aW9ucyAqLwotCi0KLS8qIEdvIHRocm91Z2ggdGhlIGRldmljZXMgdmFyaW91cyByZWcgcHJvcGVydGllcyBmb3IgdGhvc2UgdGhhdAotICAgc3BlY2lmeSBhdHRhY2ggYWRkcmVzc2VzICovCi0KLQotdm9pZAotZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICoocmVnX3Byb3BlcnR5X25hbWVzW10pID0gewotICAgICJhdHRhY2gtYWRkcmVzc2VzIiwKLSAgICAiYXNzaWduZWQtYWRkcmVzc2VzIiwKLSAgICAicmVnIiwKLSAgICAiYWx0ZXJuYXRlLXJlZyIgLAotICAgIE5VTEwKLSAgfTsKLSAgY29uc3QgY2hhciAqKnJlZ19wcm9wZXJ0eV9uYW1lOwotICBpbnQgbnJfdmFsaWRfcmVnX3Byb3BlcnRpZXMgPSAwOwotICBmb3IgKHJlZ19wcm9wZXJ0eV9uYW1lID0gcmVnX3Byb3BlcnR5X25hbWVzOwotICAgICAgICpyZWdfcHJvcGVydHlfbmFtZSAhPSBOVUxMOwotICAgICAgIHJlZ19wcm9wZXJ0eV9uYW1lKyspIHsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICpyZWdfcHJvcGVydHlfbmFtZSkgIT0gTlVMTCkgewotICAgICAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOwotICAgICAgaW50IHJlZ19lbnRyeTsKLSAgICAgIGZvciAocmVnX2VudHJ5ID0gMDsKLQkgICBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkobWUsICpyZWdfcHJvcGVydHlfbmFtZSwgcmVnX2VudHJ5LAotCQkJCQkgICZyZWcpOwotCSAgIHJlZ19lbnRyeSsrKSB7Ci0JdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKLQlpbnQgYXR0YWNoX3NwYWNlOwotCXVuc2lnbmVkIGF0dGFjaF9zaXplOwotCWlmICghZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCi0JCQkJCSAgICAgICZyZWcuYWRkcmVzcywKLQkJCQkJICAgICAgJmF0dGFjaF9zcGFjZSwgJmF0dGFjaF9hZGRyZXNzLAotCQkJCQkgICAgICBtZSkpCi0JICBjb250aW51ZTsKLQlpZiAoIWRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKGRldmljZV9wYXJlbnQobWUpLAotCQkJCQkmcmVnLnNpemUsCi0JCQkJCSZhdHRhY2hfc2l6ZSwgbWUpKQotCSAgY29udGludWU7Ci0JZGV2aWNlX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLAotCQkJICAgICAgYXR0YWNoX2NhbGxiYWNrLAotCQkJICAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCi0JCQkgICAgICBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLAotCQkJICAgICAgbWUpOwotCW5yX3ZhbGlkX3JlZ19wcm9wZXJ0aWVzKys7Ci0gICAgICB9Ci0gICAgICAvKiBpZiBmaXJzdCBvcHRpb24gbWF0Y2hlcyBkb24ndCB0cnkgZm9yIGFueSBvdGhlcnMgKi8KLSAgICAgIGlmIChyZWdfcHJvcGVydHlfbmFtZSA9PSByZWdfcHJvcGVydHlfbmFtZXMpCi0JYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLWludAotZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUoZGV2aWNlICpidXMsCi0JCQkgICBjb25zdCBjaGFyICp1bml0LAotCQkJICAgZGV2aWNlX3VuaXQgKnBoeXMpCi17Ci0gIG1lbXNldChwaHlzLCAwLCBzaXplb2YoZGV2aWNlX3VuaXQpKTsKLSAgaWYgKHVuaXQgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgZWxzZSB7Ci0gICAgaW50IG5yX2NlbGxzID0gMDsKLSAgICBjb25zdCBpbnQgbWF4X25yX2NlbGxzID0gZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoYnVzKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgY2hhciAqZW5kID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotICAgICAgdmFsID0gc3RydG91bCh1bml0LCAmZW5kLCAwKTsKLSAgICAgIC8qIHBhcnNlIGVycm9yPyAqLwotICAgICAgaWYgKHVuaXQgPT0gZW5kKQotCXJldHVybiAtMTsKLSAgICAgIC8qIHR3byBtYW55IGNlbGxzPyAqLwotICAgICAgaWYgKG5yX2NlbGxzID49IG1heF9ucl9jZWxscykKLQlyZXR1cm4gLTE7Ci0gICAgICAvKiBzYXZlIGl0ICovCi0gICAgICBwaHlzLT5jZWxsc1tucl9jZWxsc10gPSB2YWw7Ci0gICAgICBucl9jZWxscysrOwotICAgICAgdW5pdCA9IGVuZDsKLSAgICAgIC8qIG1vcmUgdG8gZm9sbG93PyAqLwotICAgICAgaWYgKGlzc3BhY2UoKnVuaXQpIHx8ICp1bml0ID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBpZiAoKnVuaXQgIT0gJywnKQotCXJldHVybiAtMTsKLSAgICAgIHVuaXQrKzsKLSAgICB9Ci0gICAgaWYgKG5yX2NlbGxzIDwgbWF4X25yX2NlbGxzKSB7Ci0gICAgICAvKiBzaGlmdCBldmVyeXRoaW5nIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMTsgaSA8PSBucl9jZWxsczsgaSsrKQotCXBoeXMtPmNlbGxzW21heF9ucl9jZWxscyAtIGldID0gcGh5cy0+Y2VsbHNbbnJfY2VsbHMgLSBpXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAobWF4X25yX2NlbGxzIC0gbnJfY2VsbHMpOyBpKyspCi0JcGh5cy0+Y2VsbHNbaV0gPSAwOwotICAgIH0KLSAgICBwaHlzLT5ucl9jZWxscyA9IG1heF9ucl9jZWxsczsKLSAgICByZXR1cm4gbWF4X25yX2NlbGxzOwotICB9Ci19Ci0KLWludAotZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUoZGV2aWNlICpidXMsCi0JCQkgICBjb25zdCBkZXZpY2VfdW5pdCAqcGh5cywKLQkJCSAgIGNoYXIgKmJ1ZiwKLQkJCSAgIGludCBzaXplb2ZfYnVmKQotewotICBpbnQgaTsKLSAgaW50IGxlbjsKLSAgY2hhciAqcG9zID0gYnVmOwotICAvKiBza2lwIGxlYWRpbmcgemVybydzICovCi0gIGZvciAoaSA9IDA7IGkgPCBwaHlzLT5ucl9jZWxsczsgaSsrKSB7Ci0gICAgaWYgKHBoeXMtPmNlbGxzW2ldICE9IDApCi0gICAgICBicmVhazsKLSAgfQotICAvKiBkb24ndCBvdXRwdXQgYW55dGhpbmcgaWYgZW1wdHkgKi8KLSAgaWYgKHBoeXMtPm5yX2NlbGxzID09IDApIHsKLSAgICBzdHJjcHkocG9zLCAiIik7Ci0gICAgbGVuID0gMDsKLSAgfQotICBlbHNlIGlmIChpID09IHBoeXMtPm5yX2NlbGxzKSB7Ci0gICAgLyogYWxsIHplcm8gKi8KLSAgICBzdHJjcHkocG9zLCAiMCIpOwotICAgIGxlbiA9IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZm9yICg7IGkgPCBwaHlzLT5ucl9jZWxsczsgaSsrKSB7Ci0gICAgICBpZiAocG9zICE9IGJ1ZikgewotCXN0cmNhdChwb3MsICIsIik7Ci0JcG9zID0gc3RyY2hyKHBvcywgJ1wwJyk7Ci0gICAgICB9Ci0gICAgICBpZiAocGh5cy0+Y2VsbHNbaV0gPCAxMCkKLQlzcHJpbnRmKHBvcywgIiVsZCIsICh1bnNpZ25lZCBsb25nKXBoeXMtPmNlbGxzW2ldKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmKHBvcywgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpcGh5cy0+Y2VsbHNbaV0pOwotICAgICAgcG9zID0gc3RyY2hyKHBvcywgJ1wwJyk7Ci0gICAgfQotICAgIGxlbiA9IHBvcyAtIGJ1ZjsKLSAgfQotICBpZiAobGVuID49IHNpemVvZl9idWYpCi0gICAgZXJyb3IoImdlbmVyaWNfdW5pdF9lbmNvZGUgLSBidWZmZXIgb3ZlcmZsb3dcbiIpOwotICByZXR1cm4gbGVuOwotfQotCi1pbnQKLWdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKLQkJCQkJIGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzLAotCQkJCQkgaW50ICphdHRhY2hfc3BhY2UsCi0JCQkJCSB1bnNpZ25lZF93b3JkICphdHRhY2hfYWRkcmVzcywKLQkJCQkJIGRldmljZSAqY2xpZW50KQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGFkZHJlc3MtPm5yX2NlbGxzIC0gMjsgaSsrKSB7Ci0gICAgaWYgKGFkZHJlc3MtPmNlbGxzW2ldICE9IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJPbmx5IDMyYml0IGFkZHJlc3NlcyBzdXBwb3J0ZWQiKTsKLSAgfQotICBpZiAoYWRkcmVzcy0+bnJfY2VsbHMgPj0gMikKLSAgICAqYXR0YWNoX3NwYWNlID0gYWRkcmVzcy0+Y2VsbHNbYWRkcmVzcy0+bnJfY2VsbHMgLSAyXTsKLSAgZWxzZQotICAgICphdHRhY2hfc3BhY2UgPSAwOwotICAqYXR0YWNoX2FkZHJlc3MgPSBhZGRyZXNzLT5jZWxsc1thZGRyZXNzLT5ucl9jZWxscyAtIDFdOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZW5lcmljX2RldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKGRldmljZSAqbWUsCi0JCQkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnNpemUsCi0JCQkJICAgdW5zaWduZWQgKm5yX2J5dGVzLAotCQkJCSAgIGRldmljZSAqY2xpZW50KQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemUtPm5yX2NlbGxzIC0gMTsgaSsrKSB7Ci0gICAgaWYgKHNpemUtPmNlbGxzW2ldICE9IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJPbmx5IDMyYml0IHNpemVzIHN1cHBvcnRlZCIpOwotICB9Ci0gICpucl9ieXRlcyA9IHNpemUtPmNlbGxzWzBdOwotICByZXR1cm4gKm5yX2J5dGVzOwotfQotCi0KLS8qIGlnbm9yZS9wYXNzdGhyb3VnaCB2ZXJzaW9ucyBvZiBlYWNoIGZ1bmN0aW9uICovCi0KLXZvaWQKLXBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2F0dGFjaChkZXZpY2UgKm1lLAotCQkJCSAgYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkJCSAgaW50IHNwYWNlLAotCQkJCSAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkJICBhY2Nlc3NfdHlwZSBhY2Nlc3MsCi0JCQkJICBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KLXsKLSAgZGV2aWNlX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLCBhdHRhY2gsCi0JCQlzcGFjZSwgYWRkciwgbnJfYnl0ZXMsCi0JCQlhY2Nlc3MsCi0JCQljbGllbnQpOwotfQotCi12b2lkCi1wYXNzdGhyb3VnaF9kZXZpY2VfYWRkcmVzc19kZXRhY2goZGV2aWNlICptZSwKLQkJCQkgIGF0dGFjaF90eXBlIGF0dGFjaCwKLQkJCQkgIGludCBzcGFjZSwKLQkJCQkgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQkgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkJCSAgYWNjZXNzX3R5cGUgYWNjZXNzLAotCQkJCSAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCi17Ci0gIGRldmljZV9kZXRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwgYXR0YWNoLAotCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCBhY2Nlc3MsCi0JCQljbGllbnQpOwotfQotCi11bnNpZ25lZAotcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkJCSAgIHZvaWQgKmRlc3QsCi0JCQkJICAgaW50IHNwYWNlLAotCQkJCSAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQkgICB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgcmV0dXJuIGRldmljZV9kbWFfcmVhZF9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksIGRlc3QsCi0JCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzKTsKLX0KLQotdW5zaWduZWQKLXBhc3N0aHJvdWdoX2RldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCi0JCQkgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCSAgICAgaW50IHNwYWNlLAotCQkJICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkJICAgICBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbikKLXsKLSAgcmV0dXJuIGRldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZV9wYXJlbnQobWUpLCBzb3VyY2UsCi0JCQkJIHNwYWNlLCBhZGRyLAotCQkJCSBucl9ieXRlcywKLQkJCQkgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Ci19Ci0KLWludAotaWdub3JlX2RldmljZV91bml0X2RlY29kZShkZXZpY2UgKm1lLAotCQkJICBjb25zdCBjaGFyICp1bml0LAotCQkJICBkZXZpY2VfdW5pdCAqcGh5cykKLXsKLSAgbWVtc2V0KHBoeXMsIDAsIHNpemVvZihkZXZpY2VfdW5pdCkpOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgY29uc3QgZGV2aWNlX2NhbGxiYWNrcyBwYXNzdGhyb3VnaF9jYWxsYmFja3MgPSB7Ci0gIHsgTlVMTCwgfSwgLyogaW5pdCAqLwotICB7IHBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2F0dGFjaCwKLSAgICBwYXNzdGhyb3VnaF9kZXZpY2VfYWRkcmVzc19kZXRhY2gsIH0sCi0gIHsgTlVMTCwgfSwgLyogSU8gKi8KLSAgeyBwYXNzdGhyb3VnaF9kZXZpY2VfZG1hX3JlYWRfYnVmZmVyLCBwYXNzdGhyb3VnaF9kZXZpY2VfZG1hX3dyaXRlX2J1ZmZlciwgfSwKLSAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBnZW5lcmljX2RldmljZV91bml0X2RlY29kZSwKLSAgICBnZW5lcmljX2RldmljZV91bml0X2VuY29kZSwgfSwKLX07Ci0KLQotc3RhdGljIGNvbnN0IGRldmljZV9kZXNjcmlwdG9yIG9iX2RldmljZV90YWJsZVtdID0gewotICAvKiBzdGFuZGFyZCBPcGVuQm9vdCBkZXZpY2VzICovCi0gIHsgImFsaWFzZXMiLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCi0gIHsgIm9wdGlvbnMiLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCi0gIHsgImNob3NlbiIsIE5VTEwsICZwYXNzdGhyb3VnaF9jYWxsYmFja3MgfSwKLSAgeyAicGFja2FnZXMiLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCi0gIHsgImNwdXMiLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCi0gIHsgIm9wZW5wcm9tIiwgTlVMTCwgJnBhc3N0aHJvdWdoX2NhbGxiYWNrcyB9LAotICB7ICJpbml0IiwgTlVMTCwgJnBhc3N0aHJvdWdoX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yICpjb25zdCBkZXZpY2VfdGFibGVbXSA9IHsKLSAgb2JfZGV2aWNlX3RhYmxlLAotI2luY2x1ZGUgImh3LmMiCi0gIE5VTEwsCi19OwotCi0KLSNlbmRpZiAvKiBfREVWSUNFX1RBQkxFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RldmljZV90YWJsZS5oIGIvc2ltL3BwYy9kZXZpY2VfdGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YzI4ZC4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2RldmljZV90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0RFVklDRV9UQUJMRV9IXwotI2RlZmluZSBfREVWSUNFX1RBQkxFX0hfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJ0cmVlLmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2NhbGxiYWNrcyBkZXZpY2VfY2FsbGJhY2tzOwotCi0KLS8qIFRoZSBjcmVhdG9yLCByZXR1cm5zIGEgcG9pbnRlciB0byBhbnkgZGF0YSB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQKLSAgIG9uY2UgZHVyaW5nIChtdWx0aXBsZSkgc2ltdWxhdGlvbiBydW5zICovCi0KLXR5cGVkZWYgdm9pZCAqKGRldmljZV9jcmVhdG9yKQotICAgICAoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCi0gICAgICBjb25zdCBjaGFyICphcmdzKTsKLQotCi0vKiB0d28gc3RhZ2VzIG9mIGluaXRpYWxpemF0aW9uICovCi0KLXR5cGVkZWYgdm9pZCAoZGV2aWNlX2luaXRfY2FsbGJhY2spCi0gICAgIChkZXZpY2UgKm1lKTsKLSAgICAgCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2luaXRfY2FsbGJhY2tzIHsKLSAgZGV2aWNlX2luaXRfY2FsbGJhY2sgKmFkZHJlc3M7IC8qIE5VTEwgLSBpZ25vcmUgKi8KLSAgZGV2aWNlX2luaXRfY2FsbGJhY2sgKmRhdGE7IC8qIE5VTEwgLSBpZ25vcmUgKi8KLX0gZGV2aWNlX2luaXRfY2FsbGJhY2tzOwotCi0KLS8qIGF0dGFjaGluZy9kZXRhY2hpbmcgYSBkZXZpY2VzIGFkZHJlc3Mgc3BhY2UgdG8gaXRzIHBhcmVudCAqLwotCi10eXBlZGVmIHZvaWQgKGRldmljZV9hZGRyZXNzX2NhbGxiYWNrKQotICAgICAoZGV2aWNlICptZSwKLSAgICAgIGF0dGFjaF90eXBlIGF0dGFjaCwKLSAgICAgIGludCBzcGFjZSwKLSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotICAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAotICAgICAgZGV2aWNlICpjbGllbnQpOyAvKmNhbGxiYWNrL2RlZmF1bHQqLwotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2tzIHsKLSAgZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2sgKmF0dGFjaDsKLSAgZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2sgKmRldGFjaDsKLX0gZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2tzOwotCi0KLS8qIEkvTyBvcGVyYXRpb25zIC0gZnJvbSBwYXJlbnQgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrKQotICAgICAoZGV2aWNlICptZSwKLSAgICAgIHZvaWQgKmRlc3QsCi0gICAgICBpbnQgc3BhY2UsCi0gICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0gICAgICB1bnNpZ25lZCBucl9ieXRlcywKLSAgICAgIGNwdSAqcHJvY2Vzc29yLAotICAgICAgdW5zaWduZWRfd29yZCBjaWEpOwotCi10eXBlZGVmIHVuc2lnbmVkIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKQotICAgICAoZGV2aWNlICptZSwKLSAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLSAgICAgIGludCBzcGFjZSwKLSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotICAgICAgY3B1ICpwcm9jZXNzb3IsCi0gICAgICB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLXR5cGVkZWYgc3RydWN0IF9kZXZpY2VfaW9fY2FsbGJhY2tzIHsgLyogTlVMTCAtIGVycm9yICovCi0gIGRldmljZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayAqcmVhZF9idWZmZXI7Ci0gIGRldmljZV9pb193cml0ZV9idWZmZXJfY2FsbGJhY2sgKndyaXRlX2J1ZmZlcjsKLX0gZGV2aWNlX2lvX2NhbGxiYWNrczsKLQotCi0vKiBETUEgdHJhbnNmZXJzIGJ5IGEgZGV2aWNlIHZpYSBpdHMgcGFyZW50ICovCi0KLXR5cGVkZWYgdW5zaWduZWQgKGRldmljZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2spCi0gICAgIChkZXZpY2UgKm1lLAotICAgICAgdm9pZCAqZGVzdCwKLSAgICAgIGludCBzcGFjZSwKLSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKTsKLQotdHlwZWRlZiB1bnNpZ25lZCAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXJfY2FsbGJhY2spCi0gICAgIChkZXZpY2UgKm1lLAotICAgICAgY29uc3Qgdm9pZCAqc291cmNlLAotICAgICAgaW50IHNwYWNlLAotICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0gICAgICBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Ci0KLXR5cGVkZWYgc3RydWN0IF9kZXZpY2VfZG1hX2NhbGxiYWNrcyB7IC8qIE5VTEwgLSBlcnJvciAqLwotICBkZXZpY2VfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrICpyZWFkX2J1ZmZlcjsKLSAgZGV2aWNlX2RtYV93cml0ZV9idWZmZXJfY2FsbGJhY2sgKndyaXRlX2J1ZmZlcjsKLX0gZGV2aWNlX2RtYV9jYWxsYmFja3M7Ci0KLQotLyogSW50ZXJydXB0cyAqLwotCi10eXBlZGVmIHZvaWQgKGRldmljZV9pbnRlcnJ1cHRfZXZlbnRfY2FsbGJhY2spCi0gICAgIChkZXZpY2UgKm1lLAotICAgICAgaW50IG15X3BvcnQsCi0gICAgICBkZXZpY2UgKnNvdXJjZSwKLSAgICAgIGludCBzb3VyY2VfcG9ydCwKLSAgICAgIGludCBsZXZlbCwKLSAgICAgIGNwdSAqcHJvY2Vzc29yLAotICAgICAgdW5zaWduZWRfd29yZCBjaWEpOwotCi10eXBlZGVmIHZvaWQgKGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfZXZlbnRfY2FsbGJhY2spCi0gICAgIChkZXZpY2UgKm1lLAotICAgICAgZGV2aWNlICpwYXJlbnQsCi0gICAgICBkZXZpY2UgKnNvdXJjZSwKLSAgICAgIGludCBzb3VyY2VfcG9ydCwKLSAgICAgIGludCBsZXZlbCwKLSAgICAgIGNwdSAqcHJvY2Vzc29yLAotICAgICAgdW5zaWduZWRfd29yZCBjaWEpOwotICAgICAgCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgbnVtYmVyOyAKLSAgaW50IG5yX3BvcnRzOwotICBwb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb247Ci19IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yOwotCi10eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2ludGVycnVwdF9jYWxsYmFja3MgewotICBkZXZpY2VfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrICpldmVudDsKLSAgZGV2aWNlX2NoaWxkX2ludGVycnVwdF9ldmVudF9jYWxsYmFjayAqY2hpbGRfZXZlbnQ7Ci0gIGNvbnN0IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yICpwb3J0czsKLX0gZGV2aWNlX2ludGVycnVwdF9jYWxsYmFja3M7Ci0KLQotLyogc3ltYm9saWMgdmFsdWUgZGVjb2RpbmcgKi8KLQotdHlwZWRlZiBpbnQgKGRldmljZV91bml0X2RlY29kZV9jYWxsYmFjaykKLSAgICAgKGRldmljZSAqYnVzLAotICAgICAgY29uc3QgY2hhciAqdW5pdCwKLSAgICAgIGRldmljZV91bml0ICphZGRyZXNzKTsKLQotdHlwZWRlZiBpbnQgKGRldmljZV91bml0X2VuY29kZV9jYWxsYmFjaykKLSAgICAgKGRldmljZSAqYnVzLAotICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLSAgICAgIGNoYXIgKmJ1ZiwKLSAgICAgIGludCBzaXplb2ZfYnVmKTsKLQotdHlwZWRlZiBpbnQgKGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKQotICAgICAoZGV2aWNlICpidXMsCi0gICAgICBjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcywKLSAgICAgIGludCAqYXR0YWNoX3NwYWNlLAotICAgICAgdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHJlc3MsCi0gICAgICBkZXZpY2UgKmNsaWVudCk7Ci0KLXR5cGVkZWYgaW50IChkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZV9jYWxsYmFjaykKLSAgICAgKGRldmljZSAqYnVzLAotICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnNpemUsCi0gICAgICB1bnNpZ25lZCAqbnJfYnl0ZXMsCi0gICAgICBkZXZpY2UgKmNsaWVudCk7Ci0KLXR5cGVkZWYgc3RydWN0IF9kZXZpY2VfY29udmVydF9jYWxsYmFja3MgewotICBkZXZpY2VfdW5pdF9kZWNvZGVfY2FsbGJhY2sgKmRlY29kZV91bml0OwotICBkZXZpY2VfdW5pdF9lbmNvZGVfY2FsbGJhY2sgKmVuY29kZV91bml0OwotICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzc19jYWxsYmFjayAqYWRkcmVzc190b19hdHRhY2hfYWRkcmVzczsKLSAgZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemVfY2FsbGJhY2sgKnNpemVfdG9fYXR0YWNoX3NpemU7Ci19IGRldmljZV9jb252ZXJ0X2NhbGxiYWNrczsKLQotCi0vKiBpbnN0YW5jZXMgKi8KLQotdHlwZWRlZiB2b2lkIChkZXZpY2VfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrKQotICAgICAoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSk7Ci0KLXR5cGVkZWYgaW50IChkZXZpY2VfaW5zdGFuY2VfcmVhZF9jYWxsYmFjaykKLSAgICAgKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0gICAgICB2b2lkICpidWYsCi0gICAgICB1bnNpZ25lZF93b3JkIGxlbik7Ci0KLXR5cGVkZWYgaW50IChkZXZpY2VfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2spCi0gICAgIChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotICAgICAgY29uc3Qgdm9pZCAqYnVmLAotICAgICAgdW5zaWduZWRfd29yZCBsZW4pOwotCi10eXBlZGVmIGludCAoZGV2aWNlX2luc3RhbmNlX3NlZWtfY2FsbGJhY2spCi0gICAgIChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCi0gICAgICB1bnNpZ25lZF93b3JkIHBvc19sbyk7Ci0KLXR5cGVkZWYgaW50IChkZXZpY2VfaW5zdGFuY2VfbWV0aG9kKQotICAgICAoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLSAgICAgIGludCBuX3N0YWNrX2FyZ3MsCi0gICAgICB1bnNpZ25lZF9jZWxsIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCi0gICAgICBpbnQgbl9zdGFja19yZXR1cm5zLAotICAgICAgdW5zaWduZWRfY2VsbCBzdGFja19yZXR1cm5zWy8qbl9zdGFja19yZXR1cm5zKi9dKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbnN0YW5jZV9tZXRob2RzIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZGV2aWNlX2luc3RhbmNlX21ldGhvZCAqbWV0aG9kOwotfSBkZXZpY2VfaW5zdGFuY2VfbWV0aG9kczsKLQotc3RydWN0IF9kZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIHsgLyogTlVMTCAtIGVycm9yICovCi0gIGRldmljZV9pbnN0YW5jZV9kZWxldGVfY2FsbGJhY2sgKmRlbGV0ZTsKLSAgZGV2aWNlX2luc3RhbmNlX3JlYWRfY2FsbGJhY2sgKnJlYWQ7Ci0gIGRldmljZV9pbnN0YW5jZV93cml0ZV9jYWxsYmFjayAqd3JpdGU7Ci0gIGRldmljZV9pbnN0YW5jZV9zZWVrX2NhbGxiYWNrICpzZWVrOwotICBjb25zdCBkZXZpY2VfaW5zdGFuY2VfbWV0aG9kcyAqbWV0aG9kczsKLX07Ci0KLXR5cGVkZWYgZGV2aWNlX2luc3RhbmNlICooZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9jYWxsYmFjaykKLSAgICAgKGRldmljZSAqbWUsCi0gICAgICBjb25zdCBjaGFyICpmdWxsX3BhdGgsCi0gICAgICBjb25zdCBjaGFyICphcmdzKTsKLQotdHlwZWRlZiBkZXZpY2VfaW5zdGFuY2UgKihwYWNrYWdlX2NyZWF0ZV9pbnN0YW5jZV9jYWxsYmFjaykKLSAgICAgKGRldmljZV9pbnN0YW5jZSAqcGFyZW50LAotICAgICAgY29uc3QgY2hhciAqYXJncyk7Ci0KLQotLyogYWxsIGVsc2UgZmFpbHMgKi8KLQotdHlwZWRlZiBpbnQgKGRldmljZV9pb2N0bF9jYWxsYmFjaykKLSAgICAgKGRldmljZSAqbWUsCi0gICAgICBjcHUgKnByb2Nlc3NvciwKLSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotICAgICAgZGV2aWNlX2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKLSAgICAgIHZhX2xpc3QgYXApOwotCi10eXBlZGVmIHZvaWQgKGRldmljZV91c2FnZV9jYWxsYmFjaykKLSAgICAgKGludCB2ZXJib3NlKTsKLQotCi0vKiB0aGUgY2FsbGJhY2tzICovCi0KLXN0cnVjdCBfZGV2aWNlX2NhbGxiYWNrcyB7Ci0KLSAgLyogaW5pdGlhbGl6YXRpb24gKi8KLSAgZGV2aWNlX2luaXRfY2FsbGJhY2tzIGluaXQ7Ci0KLSAgLyogYWRkcmVzcy9kYXRhIGNvbmZpZyAtIGZyb20gY2hpbGQgKi8KLSAgZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2tzIGFkZHJlc3M7Ci0KLSAgLyogYWRkcmVzcy9kYXRhIHRyYW5zZmVyIC0gZnJvbSBwYXJlbnQgKi8KLSAgZGV2aWNlX2lvX2NhbGxiYWNrcyBpbzsKLQotICAvKiBhZGRyZXNzL2RhdGEgdHJhbnNmZXIgLSBmcm9tIGNoaWxkICovCi0gIGRldmljZV9kbWFfY2FsbGJhY2tzIGRtYTsKLQotICAvKiBpbnRlcnJ1cHQgc2lnbmFsbGluZyAqLwotICBkZXZpY2VfaW50ZXJydXB0X2NhbGxiYWNrcyBpbnRlcnJ1cHQ7Ci0KLSAgLyogYnVzIGFkZHJlc3MgZGVjb2RpbmcgKi8KLSAgZGV2aWNlX2NvbnZlcnRfY2FsbGJhY2tzIGNvbnZlcnQ7Ci0KLSAgLyogaW5zdGFuY2VzICovCi0gIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfY2FsbGJhY2sgKmluc3RhbmNlX2NyZWF0ZTsKLQotICAvKiBiYWNrIGRvb3IgdG8gYW55dGhpbmcgd2UndmUgZm9yZ290ICovCi0gIGRldmljZV9pb2N0bF9jYWxsYmFjayAqaW9jdGw7Ci0gIGRldmljZV91c2FnZV9jYWxsYmFjayAqdXNhZ2U7Ci19OwotCi0KLS8qIFRhYmxlIG9mIGFsbCB0aGUgZGV2aWNlcyBhbmQgYSBmdW5jdGlvbiB0byBsb29rdXAvY3JlYXRlIGEgZGV2aWNlCi0gICBmcm9tIGl0cyBuYW1lICovCi0KLXR5cGVkZWYgc3RydWN0IF9kZXZpY2VfZGVzY3JpcHRvciBkZXZpY2VfZGVzY3JpcHRvcjsKLXN0cnVjdCBfZGV2aWNlX2Rlc2NyaXB0b3IgewotICBjb25zdCBjaGFyICpuYW1lOwotICBkZXZpY2VfY3JlYXRvciAqY3JlYXRvcjsKLSAgY29uc3QgZGV2aWNlX2NhbGxiYWNrcyAqY2FsbGJhY2tzOwotfTsKLQotZXh0ZXJuIGNvbnN0IGRldmljZV9kZXNjcmlwdG9yICpjb25zdCBkZXZpY2VfdGFibGVbXTsKLSNpbmNsdWRlICJody5oIgotCi0KLS8qIFBhc3MgdGhyb3VnaCwgaWdub3JlIGFuZCBnZW5lcmljIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIEEgY2FsbCBnb2luZwotICAgdG93YXJkcyB0aGUgcm9vdCBkZXZpY2UgYXJlIHBhc3NlZCBvbiB1cCwgbG9jYWwgY2FsbHMgYXJlIGlnbm9yZWQKLSAgIGFuZCBjYWxsIGRvd25zIGFib3J0ICovCi0KLWV4dGVybiBkZXZpY2VfYWRkcmVzc19jYWxsYmFjayBwYXNzdGhyb3VnaF9kZXZpY2VfYWRkcmVzc19hdHRhY2g7Ci1leHRlcm4gZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2sgcGFzc3Rocm91Z2hfZGV2aWNlX2FkZHJlc3NfZGV0YWNoOwotZXh0ZXJuIGRldmljZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2sgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcjsKLWV4dGVybiBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayBwYXNzdGhyb3VnaF9kZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcjsKLQotZXh0ZXJuIGRldmljZV91bml0X2RlY29kZV9jYWxsYmFjayBpZ25vcmVfZGV2aWNlX3VuaXRfZGVjb2RlOwotCi1leHRlcm4gZGV2aWNlX2luaXRfY2FsbGJhY2sgZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzOwotZXh0ZXJuIGRldmljZV91bml0X2RlY29kZV9jYWxsYmFjayBnZW5lcmljX2RldmljZV91bml0X2RlY29kZTsKLWV4dGVybiBkZXZpY2VfdW5pdF9lbmNvZGVfY2FsbGJhY2sgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGU7Ci1leHRlcm4gZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2sgZ2VuZXJpY19kZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzczsKLWV4dGVybiBkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZV9jYWxsYmFjayBnZW5lcmljX2RldmljZV9zaXplX3RvX2F0dGFjaF9zaXplOwotCi0KLWV4dGVybiBjb25zdCBkZXZpY2VfY2FsbGJhY2tzIHBhc3N0aHJvdWdoX2RldmljZV9jYWxsYmFja3M7Ci0KLSNlbmRpZiAvKiBfREVWSUNFX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RnZW4uYyBiL3NpbS9wcGMvZGdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGUwZTI2Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZGdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBzcHJlZ19sb29rdXBfdGFibGUgPSAxOwotZW51bSB7Ci0gIG5yX29mX3NwcnMgPSAxMDI0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgc3ByZWdfbmFtZSwKLSAgc3ByZWdfcmVnX25yLAotICBzcHJlZ19yZWFkb25seSwKLSAgc3ByZWdfbGVuZ3RoLAotICBucl9zcHJlZ19maWVsZHMsCi19IHNwcmVnX2ZpZWxkczsKLQotdHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX3RhYmxlX2VudHJ5IHNwcmVnX3RhYmxlX2VudHJ5Owotc3RydWN0IF9zcHJlZ190YWJsZV9lbnRyeSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBzcHJlZ19ucjsKLSAgaW50IGlzX3JlYWRvbmx5OwotICBpbnQgbGVuZ3RoOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIHNwcmVnX3RhYmxlX2VudHJ5ICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX3RhYmxlIHNwcmVnX3RhYmxlOwotc3RydWN0IF9zcHJlZ190YWJsZSB7Ci0gIHNwcmVnX3RhYmxlX2VudHJ5ICpzcHJzOwotfTsKLQotc3RhdGljIHZvaWQKLXNwcmVnX3RhYmxlX2luc2VydChzcHJlZ190YWJsZSAqdGFibGUsIHRhYmxlX2VudHJ5ICplbnRyeSkKLXsKLSAgLyogY3JlYXRlIGEgbmV3IHNwciBlbnRyeSAqLwotICBzcHJlZ190YWJsZV9lbnRyeSAqbmV3X3NwciA9IFpBTExPQyhzcHJlZ190YWJsZV9lbnRyeSk7Ci0gIG5ld19zcHItPm5leHQgPSBOVUxMOwotICBuZXdfc3ByLT5lbnRyeSA9IGVudHJ5OwotICBuZXdfc3ByLT5zcHJlZ19uciA9IGF0b2koZW50cnktPmZpZWxkc1tzcHJlZ19yZWdfbnJdKTsKLSAgbmV3X3Nwci0+aXNfcmVhZG9ubHkgPSAoZW50cnktPmZpZWxkc1tzcHJlZ19yZWFkb25seV0KLQkJCSAgPyBhdG9pKGVudHJ5LT5maWVsZHNbc3ByZWdfcmVhZG9ubHldKQotCQkJICA6IDApOwotICBuZXdfc3ByLT5sZW5ndGggPSBhdG9pKGVudHJ5LT5maWVsZHNbc3ByZWdfbGVuZ3RoXSk7Ci0gIG5ld19zcHItPm5hbWUgPSAoY2hhciopemFsbG9jKHN0cmxlbihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdKSArIDEpOwotICBBU1NFUlQobmV3X3Nwci0+bmFtZSAhPSBOVUxMKTsKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGVudHJ5LT5maWVsZHNbc3ByZWdfbmFtZV1baV0gIT0gJ1wwJzsgaSsrKSB7Ci0gICAgICBpZiAoaXN1cHBlcihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdW2ldKSkKLQluZXdfc3ByLT5uYW1lW2ldID0gdG9sb3dlcihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdW2ldKTsKLSAgICAgIGVsc2UKLQluZXdfc3ByLT5uYW1lW2ldID0gZW50cnktPmZpZWxkc1tzcHJlZ19uYW1lXVtpXTsKLSAgICB9Ci0gIH0KLQotICAvKiBpbnNlcnQsIGJ5IHNwcmVnX25yIG9yZGVyICovCi0gIHsKLSAgICBzcHJlZ190YWJsZV9lbnRyeSAqKnB0cl90b19zcHJlZ19lbnRyeSA9ICZ0YWJsZS0+c3ByczsKLSAgICBzcHJlZ190YWJsZV9lbnRyeSAqc3ByZWdfZW50cnkgPSAqcHRyX3RvX3NwcmVnX2VudHJ5OwotICAgIHdoaWxlIChzcHJlZ19lbnRyeSAhPSBOVUxMICYmIHNwcmVnX2VudHJ5LT5zcHJlZ19uciA8IG5ld19zcHItPnNwcmVnX25yKSB7Ci0gICAgICBwdHJfdG9fc3ByZWdfZW50cnkgPSAmc3ByZWdfZW50cnktPm5leHQ7Ci0gICAgICBzcHJlZ19lbnRyeSA9ICpwdHJfdG9fc3ByZWdfZW50cnk7Ci0gICAgfQotICAgIEFTU0VSVChzcHJlZ19lbnRyeSA9PSBOVUxMIHx8IHNwcmVnX2VudHJ5LT5zcHJlZ19uciAhPSBuZXdfc3ByLT5zcHJlZ19ucik7Ci0gICAgKnB0cl90b19zcHJlZ19lbnRyeSA9IG5ld19zcHI7Ci0gICAgbmV3X3Nwci0+bmV4dCA9IHNwcmVnX2VudHJ5OwotICB9Ci0KLX0KLQotCi1zdGF0aWMgc3ByZWdfdGFibGUgKgotc3ByZWdfdGFibGVfbG9hZChjaGFyICpmaWxlX25hbWUpCi17Ci0gIHRhYmxlICpmaWxlID0gdGFibGVfb3BlbihmaWxlX25hbWUsIG5yX3NwcmVnX2ZpZWxkcywgMCk7Ci0gIHNwcmVnX3RhYmxlICp0YWJsZSA9IFpBTExPQyhzcHJlZ190YWJsZSk7Ci0KLSAgewotICAgIHRhYmxlX2VudHJ5ICplbnRyeTsKLSAgICB3aGlsZSAoKGVudHJ5ID0gdGFibGVfZW50cnlfcmVhZChmaWxlKSkgIT0gTlVMTCkgewotICAgICAgc3ByZWdfdGFibGVfaW5zZXJ0KHRhYmxlLCBlbnRyeSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICpzcHJlZ19hdHRyaWJ1dGVzW10gPSB7Ci0gICJpc192YWxpZCIsCi0gICJpc19yZWFkb25seSIsCi0gICJuYW1lIiwKLSAgImluZGV4IiwKLSAgImxlbmd0aCIsCi0gIDAKLX07Ci0KLXN0YXRpYyB2b2lkCi1nZW5fc3ByZWdfaChzcHJlZ190YWJsZSAqdGFibGUsIGxmICpmaWxlKQotewotICBzcHJlZ190YWJsZV9lbnRyeSAqZW50cnk7Ci0gIGNoYXIgKiphdHRyaWJ1dGU7Ci0KLSAgbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX1NQUkVHX0hfXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIF9TUFJFR19IX1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHVuc2lnbmVkX3dvcmQgc3ByZWc7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKLQotICBmb3IgKGVudHJ5ID0gdGFibGUtPnNwcnM7Ci0gICAgICAgZW50cnkgIT0gTlVMTCA7Ci0gICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dCkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiICBzcHJfJXMgPSAlZCxcbiIsIGVudHJ5LT5uYW1lLCBlbnRyeS0+c3ByZWdfbnIpOwotICB9Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICIgIG5yX29mX3NwcnMgPSAlZFxuIiwgbnJfb2Zfc3Bycyk7Ci0gIGxmX3ByaW50ZihmaWxlLCAifSBzcHJzO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgZm9yIChhdHRyaWJ1dGUgPSBzcHJlZ19hdHRyaWJ1dGVzOwotICAgICAgICphdHRyaWJ1dGUgIT0gTlVMTDsKLSAgICAgICBhdHRyaWJ1dGUrKykgewotICAgIGlmIChzdHJjbXAoKmF0dHJpYnV0ZSwgIm5hbWUiKSA9PSAwKSB7Ci0gICAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJjb25zdCBjaGFyICoiLCAiSU5MSU5FX1NQUkVHIiwgIiAiKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAic3ByXyVzKHNwcnMgc3ByKTtcbiIsICphdHRyaWJ1dGUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgImludCIsICJJTkxJTkVfU1BSRUciLCAiICIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJzcHJfJXMoc3BycyBzcHIpO1xuIiwgKmF0dHJpYnV0ZSk7Ci0gICAgfQotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWYgLyogX1NQUkVHX0hfICovXG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZ2VuX3NwcmVnX2Moc3ByZWdfdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKLXsKLSAgc3ByZWdfdGFibGVfZW50cnkgKmVudHJ5OwotICBjaGFyICoqYXR0cmlidXRlOwotICBpbnQgc3ByZWdfbnI7Ci0KLSAgbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX1NQUkVHX0NfXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIF9TUFJFR19DX1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImJhc2ljcy5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic3ByZWcuaFwiXG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX2luZm8ge1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpuYW1lO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBpbnQgaXNfdmFsaWQ7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBsZW5ndGg7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBpc19yZWFkb25seTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgaW50IGluZGV4O1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAifSBzcHJlZ19pbmZvO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJzdGF0aWMgc3ByZWdfaW5mbyBzcHJfaW5mb1tucl9vZl9zcHJzKzFdID0ge1xuIik7Ci0gIGVudHJ5ID0gdGFibGUtPnNwcnM7Ci0gIGZvciAoc3ByZWdfbnIgPSAwOyBzcHJlZ19uciA8IG5yX29mX3NwcnMrMTsgc3ByZWdfbnIrKykgewotICAgIGlmIChlbnRyeSA9PSBOVUxMIHx8IHNwcmVnX25yIDwgZW50cnktPnNwcmVnX25yKQotICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgMCwgMCwgMCwgMCwgJWR9LFxuIiwgc3ByZWdfbnIpOwotICAgIGVsc2UgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgXCIlc1wiLCAlZCwgJWQsICVkLCBzcHJfJXMgLyolZCovIH0sXG4iLAotCQllbnRyeS0+bmFtZSwgMSwgZW50cnktPmxlbmd0aCwgZW50cnktPmlzX3JlYWRvbmx5LAotCQllbnRyeS0+bmFtZSwgZW50cnktPnNwcmVnX25yKTsKLSAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOwotCi0gIGZvciAoYXR0cmlidXRlID0gc3ByZWdfYXR0cmlidXRlczsKLSAgICAgICAqYXR0cmlidXRlICE9IE5VTEw7Ci0gICAgICAgYXR0cmlidXRlKyspIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgaWYgKHN0cmNtcCgqYXR0cmlidXRlLCAibmFtZSIpID09IDApIHsKLSAgICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgImNvbnN0IGNoYXIgKiIsICJJTkxJTkVfU1BSRUciLCAiXG4iKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJpbnQiLCAiSU5MSU5FX1NQUkVHIiwgIlxuIik7Ci0gICAgfQotICAgIGxmX3ByaW50ZihmaWxlLCAic3ByXyVzKHNwcnMgc3ByKVxuIiwgKmF0dHJpYnV0ZSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICBpZiAoc3ByZWdfbG9va3VwX3RhYmxlCi0JfHwgc3RyY21wKCphdHRyaWJ1dGUsICJuYW1lIikgPT0gMAotCXx8IHN0cmNtcCgqYXR0cmlidXRlLCAiaW5kZXgiKSA9PSAwKQotICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHJldHVybiBzcHJfaW5mb1tzcHJdLiVzO1xuIiwKLQkJKmF0dHJpYnV0ZSk7Ci0gICAgZWxzZSB7Ci0gICAgICBzcHJlZ190YWJsZV9lbnRyeSAqZW50cnk7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiAgc3dpdGNoIChzcHIpIHtcbiIpOwotICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5zcHJzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7Ci0JbGZfcHJpbnRmKGZpbGUsICIgIGNhc2UgJWQ6XG4iLCBlbnRyeS0+c3ByZWdfbnIpOwotCWlmIChzdHJjbXAoKmF0dHJpYnV0ZSwgImlzX3ZhbGlkIikgPT0gMCkKLQkgIGxmX3ByaW50ZihmaWxlLCAiICAgIHJldHVybiAxO1xuIik7Ci0JZWxzZSBpZiAoc3RyY21wKCphdHRyaWJ1dGUsICJpc19yZWFkb25seSIpID09IDApCi0JICBsZl9wcmludGYoZmlsZSwgIiAgICByZXR1cm4gJWQ7XG4iLCBlbnRyeS0+aXNfcmVhZG9ubHkpOwotCWVsc2UgaWYgKHN0cmNtcCgqYXR0cmlidXRlLCAibGVuZ3RoIikgPT0gMCkKLQkgIGxmX3ByaW50ZihmaWxlLCAiICAgIHJldHVybiAlZDtcbiIsIGVudHJ5LT5sZW5ndGgpOwotCWVsc2UKLQkgIEFTU0VSVCgwKTsKLSAgICAgIH0KLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICBkZWZhdWx0OlxuIik7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiAgICByZXR1cm4gMDtcbiIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOwotICAgIH0KLSAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOwotICB9Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZiAvKiBfU1BSRUdfQ18gKi9cbiIpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotaW50Ci1tYWluKGludCBhcmdjLAotICAgICBjaGFyICoqYXJndiwKLSAgICAgY2hhciAqKmVudnApCi17Ci0gIGxmX2ZpbGVfcmVmZXJlbmNlcyBmaWxlX3JlZmVyZW5jZXMgPSBsZl9pbmNsdWRlX3JlZmVyZW5jZXM7Ci0gIHNwcmVnX3RhYmxlICpzcHJzID0gTlVMTDsKLSAgY2hhciAqcmVhbF9maWxlX25hbWUgPSBOVUxMOwotICBpbnQgaXNfaGVhZGVyID0gMDsKLSAgaW50IGNoOwotCi0gIGlmIChhcmdjIDw9IDEpIHsKLSAgICBwcmludGYoIlVzYWdlOiBkZ2VuIC4uLlxuIik7Ci0gICAgcHJpbnRmKCItcyAgVXNlIHN3aXRjaCBpbnN0ZWFkIG9mIHRhYmxlXG4iKTsKLSAgICBwcmludGYoIi1uIDxmaWxlLW5hbWU+ICBVc2UgdGhpcyBhcyBjcHAgbGluZSBudW1iZXJpbmcgbmFtZVxuIik7Ci0gICAgcHJpbnRmKCItaCAgT3V0cHV0IGhlYWRlciBmaWxlXG4iKTsKLSAgICBwcmludGYoIi1wIDxzcHJlZy1maWxlPiAgT3V0cHV0IHNwcmVnLmgoUCkgb3Igc3ByZWcuYyhwKVxuIik7Ci0gICAgcHJpbnRmKCItTCAgU3VwcHJlc3MgY3BwIGxpbmUgbnVtYmVyaW5nIGluIG91dHB1dCBmaWxlc1xuIik7Ci0gIH0KLQotCi0gIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImhMc246cjpwOiIpKSAhPSAtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiXHQtJWMgJXNcbiIsIGNoLCAoIG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7Ci0gICAgc3dpdGNoKGNoKSB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICBzcHJlZ19sb29rdXBfdGFibGUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICBzcHJzID0gc3ByZWdfdGFibGVfbG9hZChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbic6Ci0gICAgICByZWFsX2ZpbGVfbmFtZSA9IHN0cmR1cChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTCc6Ci0gICAgICBmaWxlX3JlZmVyZW5jZXMgPSBsZl9vbWl0X3JlZmVyZW5jZXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdoJzoKLSAgICAgIGlzX2hlYWRlciA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdwJzoKLSAgICAgIHsKLQlsZiAqZmlsZSA9IGxmX29wZW4ob3B0YXJnLCByZWFsX2ZpbGVfbmFtZSwgZmlsZV9yZWZlcmVuY2VzLAotCQkJICAgKGlzX2hlYWRlciA/IGxmX2lzX2ggOiBsZl9pc19jKSwKLQkJCSAgIGFyZ3ZbMF0pOwotCWlmIChpc19oZWFkZXIpCi0JICBnZW5fc3ByZWdfaChzcHJzLCBmaWxlKTsKLQllbHNlCi0JICBnZW5fc3ByZWdfYyhzcHJzLCBmaWxlKTsKLQlsZl9jbG9zZShmaWxlKTsKLQlpc19oZWFkZXIgPSAwOwotICAgICAgfQotICAgICAgcmVhbF9maWxlX25hbWUgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yKCJ1bmtub3duIG9wdGlvblxuIik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kb3VibGUuYyBiL3NpbS9wcGMvZG91YmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTQzMDEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9kb3VibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0RPVUJMRV9DXwotI2RlZmluZSBfRE9VQkxFX0NfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLQotI2RlZmluZSBTRnR5cGUgdW5zaWduZWQzMgotI2RlZmluZSBERnR5cGUgdW5zaWduZWQ2NAotCi0jZGVmaW5lIEhJdHlwZSBzaWduZWQxNgotI2RlZmluZSBTSXR5cGUgc2lnbmVkMzIKLSNkZWZpbmUgREl0eXBlIHNpZ25lZDY0Ci0KLSNkZWZpbmUgVUhJdHlwZSB1bnNpZ25lZDE2Ci0jZGVmaW5lIFVTSXR5cGUgdW5zaWduZWQzMgotI2RlZmluZSBVREl0eXBlIHVuc2lnbmVkNjQKLQotCi0jZGVmaW5lIFVTX1NPRlRXQVJFX0dPRkFTVAotI2luY2x1ZGUgImRwLWJpdC5jIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZHAtYml0LmMgYi9zaW0vcHBjL2RwLWJpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEzMTMyLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZHAtYml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA3ICswLDAgQEAKLS8qIFRoaXMgaXMgYSBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBsaWJyYXJ5IHdoaWNoIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKLSAgIHRoZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcyBpbiBsaWJnY2MxLmMgZm9yIHRhcmdldHMgd2l0aG91dCBoYXJkd2FyZQotICAgZmxvYXRpbmcgcG9pbnQuICAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQotY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2l0aCBvdGhlciBwcm9ncmFtcywgYW5kIHRvIGRpc3RyaWJ1dGUKLXRob3NlIHByb2dyYW1zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcwotZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMgZG8gYXBwbHkgaW4gb3RoZXIKLXJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YgdGhlIGZpbGUsIGFuZAotZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGFub3RoZXIgcHJvZ3JhbS4pCi0KLVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIG90aGVyIGZpbGVzLAotICAgc29tZSBvZiB3aGljaCBhcmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKLSAgIHRoaXMgbGlicmFyeSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlCi0gICB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAgIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLSAgIHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAqLwotCi0vKiBUaGlzIGltcGxlbWVudHMgSUVFRSA3NTQgZm9ybWF0IGFyaXRobWV0aWMsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEKLSAgIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGUgcm91bmRpbmcgbW9kZSwgb3IgZm9yIGdlbmVyYXRpbmcgb3IgaGFuZGxpbmcKLSAgIGV4Y2VwdGlvbnMuCi0KLSAgIFRoZSBvcmlnaW5hbCBjb2RlIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBoYWNrZWQgYnkgTWFyayBFaWNoaW4gYW5kIEppbQotICAgV2lsc29uLCBhbGwgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBUaGUgaW50ZW5kZWQgd2F5IHRvIHVzZSB0aGlzIGZpbGUgaXMgdG8gbWFrZSB0d28gY29waWVzLCBhZGQgYCNkZWZpbmUgRkxPQVQnCi0gICB0byBvbmUgY29weSwgdGhlbiBjb21waWxlIGJvdGggY29waWVzIGFuZCBhZGQgdGhlbSB0byBsaWJnY2MuYS4gICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNhbiBiZSBkZWZpbmVkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIHRoaXMgZmlsZToKLSAgIEZMT0FUOiBJbXBsZW1lbnQgYSBgZmxvYXQnLCBha2EgU0Ztb2RlLCBmcCBsaWJyYXJ5LiAgSWYgdGhpcyBpcyBub3QKLSAgICAgZGVmaW5lZCwgdGhlbiB0aGlzIGZpbGUgaW1wbGVtZW50cyBhIGBkb3VibGUnLCBha2EgREZtb2RlLCBmcCBsaWJyYXJ5LgotICAgRkxPQVRfT05MWTogVXNlZCB3aXRoIEZMT0FULCB0byBpbXBsZW1lbnQgYSBgZmxvYXQnIG9ubHkgbGlicmFyeSwgaS5lLgotICAgICBkb24ndCBpbmNsdWRlIGZsb2F0LT5kb3VibGUgY29udmVyc2lvbiB3aGljaCByZXF1aXJlcyB0aGUgZG91YmxlIGxpYnJhcnkuCi0gICAgIFRoaXMgaXMgdXNlZnVsIG9ubHkgZm9yIG1hY2hpbmVzIHdoaWNoIGNhbid0IHN1cHBvcnQgZG91YmxlcywgZS5nLiBzb21lCi0gICAgIDgtYml0IHByb2Nlc3NvcnMuCi0gICBDTVB0eXBlOiBTcGVjaWZ5IHRoZSB0eXBlIHRoYXQgZmxvYXRpbmcgcG9pbnQgY29tcGFyZXMgc2hvdWxkIHJldHVybi4KLSAgICAgVGhpcyBkZWZhdWx0cyB0byBTSXR5cGUsIGFrYSBpbnQuCi0gICBVU19TT0ZUV0FSRV9HT0ZBU1Q6IFRoaXMgbWFrZXMgYWxsIGVudHJ5IHBvaW50cyB1c2UgdGhlIHNhbWUgbmFtZXMgYXMgdGhlCi0gICAgIFVTIFNvZnR3YXJlIGdvRmFzdCBsaWJyYXJ5LiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgdGhlIGVudHJ5IHBvaW50cyB1c2UKLSAgICAgdGhlIHNhbWUgbmFtZXMgYXMgbGliZ2NjMS5jLgotICAgX0RFQlVHX0JJVEZMT0FUOiBUaGlzIG1ha2VzIGRlYnVnZ2luZyB0aGUgY29kZSBhIGxpdHRsZSBlYXNpZXIsIGJ5IGFkZGluZwotICAgICB0d28gaW50ZWdlcnMgdG8gdGhlIEZMT191bmlvbl90eXBlLiAgCi0gICBOT19OQU5TOiBEaXNhYmxlIG5hbiBhbmQgaW5maW5pdHkgaGFuZGxpbmcKLSAgIFNNQUxMX01BQ0hJTkU6IFVzZWZ1bCB3aGVuIG9wZXJhdGlvbnMgb24gUUlzIGFuZCBISXMgYXJlIGZhc3RlcgotICAgICB0aGFuIG9uIGFuIFNJICovCi0KLSNpZm5kZWYgU0Z0eXBlCi10eXBlZGVmIFNGdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0YpKSk7Ci0jZW5kaWYKLSNpZm5kZWYgREZ0eXBlCi10eXBlZGVmIERGdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREYpKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBISXR5cGUKLXR5cGVkZWYgaW50IEhJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7Ci0jZW5kaWYKLSNpZm5kZWYgU0l0eXBlCi10eXBlZGVmIGludCBTSXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOwotI2VuZGlmCi0jaWZuZGVmIERJdHlwZQotdHlwZWRlZiBpbnQgREl0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChESSkpKTsKLSNlbmRpZgotCi0vKiBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIGEgZnAgY29tcGFyZSAqLwotI2lmbmRlZiBDTVB0eXBlCi0jZGVmaW5lIENNUHR5cGUgU0l0eXBlCi0jZW5kaWYKLQotI2lmbmRlZiBVSEl0eXBlCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSEl0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChISSkpKTsKLSNlbmRpZgotI2lmbmRlZiBVU0l0eXBlCi10eXBlZGVmIHVuc2lnbmVkIGludCBVU0l0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKLSNlbmRpZgotI2lmbmRlZiBVREl0eXBlCi10eXBlZGVmIHVuc2lnbmVkIGludCBVREl0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChESSkpKTsKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9TSV9JTlQgICAoKFNJdHlwZSkgKCh1bnNpZ25lZCkgKH4wKT4+MSkpCi0jZGVmaW5lIE1BWF9VU0lfSU5UICAoKFVTSXR5cGUpIH4wKQotCi0KLSNpZmRlZiBGTE9BVF9PTkxZCi0jZGVmaW5lIE5PX0RJX01PREUKLSNlbmRpZgotCi0jaWZkZWYgRkxPQVQKLSMJZGVmaW5lIE5HQVJEUyAgICA3TAotIwlkZWZpbmUgR0FSRFJPVU5EIDB4M2YKLSMJZGVmaW5lIEdBUkRNQVNLICAweDdmCi0jCWRlZmluZSBHQVJETVNCICAgMHg0MAotIwlkZWZpbmUgRVhQQklUUyA4Ci0jCWRlZmluZSBFWFBCSUFTIDEyNwotIwlkZWZpbmUgRlJBQ0JJVFMgMjMKLSMJZGVmaW5lIEVYUE1BWCAoMHhmZikKLSMJZGVmaW5lIFFVSUVUX05BTiAweDEwMDAwMEwKLSMJZGVmaW5lIEZSQUNfTkJJVFMgMzIKLSMJZGVmaW5lIEZSQUNISUdIICAweDgwMDAwMDAwTAotIwlkZWZpbmUgRlJBQ0hJR0gyIDB4YzAwMDAwMDBMCi0JdHlwZWRlZiBVU0l0eXBlIGZyYWN0eXBlOwotCXR5cGVkZWYgVUhJdHlwZSBoYWxmZnJhY3R5cGU7Ci0JdHlwZWRlZiBTRnR5cGUgRkxPX3R5cGU7Ci0JdHlwZWRlZiBTSXR5cGUgaW50ZnJhYzsKLQotI2Vsc2UKLSMJZGVmaW5lIFBSRUZJWEZQRFAgZHAKLSMJZGVmaW5lIFBSRUZJWFNGREYgZGYKLSMJZGVmaW5lIE5HQVJEUyA4TAotIwlkZWZpbmUgR0FSRFJPVU5EIDB4N2YKLSMJZGVmaW5lIEdBUkRNQVNLICAweGZmCi0jCWRlZmluZSBHQVJETVNCICAgMHg4MAotIwlkZWZpbmUgRVhQQklUUyAxMQotIwlkZWZpbmUgRVhQQklBUyAxMDIzCi0jCWRlZmluZSBGUkFDQklUUyA1MgotIwlkZWZpbmUgRVhQTUFYICgweDdmZikKLSMJZGVmaW5lIFFVSUVUX05BTiAweDgwMDAwMDAwMDAwMDBMTAotIwlkZWZpbmUgRlJBQ19OQklUUyA2NAotIwlkZWZpbmUgRlJBQ0hJR0ggIDB4ODAwMDAwMDAwMDAwMDAwMExMCi0jCWRlZmluZSBGUkFDSElHSDIgMHhjMDAwMDAwMDAwMDAwMDAwTEwKLQl0eXBlZGVmIFVESXR5cGUgZnJhY3R5cGU7Ci0JdHlwZWRlZiBVU0l0eXBlIGhhbGZmcmFjdHlwZTsKLQl0eXBlZGVmIERGdHlwZSBGTE9fdHlwZTsKLQl0eXBlZGVmIERJdHlwZSBpbnRmcmFjOwotI2VuZGlmCi0KLSNpZmRlZiBVU19TT0ZUV0FSRV9HT0ZBU1QKLSMJaWZkZWYgRkxPQVQKLSMJCWRlZmluZSBhZGQgCQlmcGFkZAotIwkJZGVmaW5lIHN1YiAJCWZwc3ViCi0jCQlkZWZpbmUgbXVsdGlwbHkgCWZwbXVsCi0jCQlkZWZpbmUgZGl2aWRlIAkJZnBkaXYKLSMJCWRlZmluZSBjb21wYXJlIAkJZnBjbXAKLSMJCWRlZmluZSBzaV90b19mbG9hdCAJc2l0b2ZwCi0jCQlkZWZpbmUgZmxvYXRfdG9fc2kgCWZwdG9zaQotIwkJZGVmaW5lIGZsb2F0X3RvX3VzaSAJZnB0b3VpCi0jCQlkZWZpbmUgbmVnYXRlIAkJX19uZWdzZjIKLSMJCWRlZmluZSBzZl90b19kZgkJZnB0b2RwCi0jCQlkZWZpbmUgZHB0b2ZwIAkJZHB0b2ZwCi0jZWxzZQotIwkJZGVmaW5lIGFkZCAJCWRwYWRkCi0jCQlkZWZpbmUgc3ViIAkJZHBzdWIKLSMJCWRlZmluZSBtdWx0aXBseSAJZHBtdWwKLSMJCWRlZmluZSBkaXZpZGUgCQlkcGRpdgotIwkJZGVmaW5lIGNvbXBhcmUgCQlkcGNtcAotIwkJZGVmaW5lIHNpX3RvX2Zsb2F0IAlsaXRvZHAKLSMJCWRlZmluZSBmbG9hdF90b19zaSAJZHB0b2xpCi0jCQlkZWZpbmUgZmxvYXRfdG9fdXNpIAlkcHRvdWwKLSMJCWRlZmluZSBuZWdhdGUgCQlfX25lZ2RmMgotIwkJZGVmaW5lIGRmX3RvX3NmIAlkcHRvZnAKLSNlbmRpZgotI2Vsc2UKLSMJaWZkZWYgRkxPQVQKLSMJCWRlZmluZSBhZGQgCQlfX2FkZHNmMwotIwkJZGVmaW5lIHN1YiAJCV9fc3Vic2YzCi0jCQlkZWZpbmUgbXVsdGlwbHkgCV9fbXVsc2YzCi0jCQlkZWZpbmUgZGl2aWRlIAkJX19kaXZzZjMKLSMJCWRlZmluZSBjb21wYXJlIAkJX19jbXBzZjIKLSMJCWRlZmluZSBfZXFfZjIgCQlfX2Vxc2YyCi0jCQlkZWZpbmUgX25lX2YyIAkJX19uZXNmMgotIwkJZGVmaW5lIF9ndF9mMiAJCV9fZ3RzZjIKLSMJCWRlZmluZSBfZ2VfZjIgCQlfX2dlc2YyCi0jCQlkZWZpbmUgX2x0X2YyIAkJX19sdHNmMgotIwkJZGVmaW5lIF9sZV9mMiAJCV9fbGVzZjIKLSMJCWRlZmluZSBzaV90b19mbG9hdCAJX19mbG9hdHNpc2YKLSMJCWRlZmluZSBmbG9hdF90b19zaSAJX19maXhzZnNpCi0jCQlkZWZpbmUgZmxvYXRfdG9fdXNpIAlfX2ZpeHVuc3Nmc2kKLSMJCWRlZmluZSBuZWdhdGUgCQlfX25lZ3NmMgotIwkJZGVmaW5lIHNmX3RvX2RmCQlfX2V4dGVuZHNmZGYyCi0jZWxzZQotIwkJZGVmaW5lIGFkZCAJCV9fYWRkZGYzCi0jCQlkZWZpbmUgc3ViIAkJX19zdWJkZjMKLSMJCWRlZmluZSBtdWx0aXBseSAJX19tdWxkZjMKLSMJCWRlZmluZSBkaXZpZGUgCQlfX2RpdmRmMwotIwkJZGVmaW5lIGNvbXBhcmUgCQlfX2NtcGRmMgotIwkJZGVmaW5lIF9lcV9mMiAJCV9fZXFkZjIKLSMJCWRlZmluZSBfbmVfZjIgCQlfX25lZGYyCi0jCQlkZWZpbmUgX2d0X2YyIAkJX19ndGRmMgotIwkJZGVmaW5lIF9nZV9mMiAJCV9fZ2VkZjIKLSMJCWRlZmluZSBfbHRfZjIgCQlfX2x0ZGYyCi0jCQlkZWZpbmUgX2xlX2YyIAkJX19sZWRmMgotIwkJZGVmaW5lIHNpX3RvX2Zsb2F0IAlfX2Zsb2F0c2lkZgotIwkJZGVmaW5lIGZsb2F0X3RvX3NpIAlfX2ZpeGRmc2kKLSMJCWRlZmluZSBmbG9hdF90b191c2kgCV9fZml4dW5zZGZzaQotIwkJZGVmaW5lIG5lZ2F0ZSAJCV9fbmVnZGYyCi0jCQlkZWZpbmUgZGZfdG9fc2YJCV9fdHJ1bmNkZnNmMgotIwllbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBJTkxJTkUKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbmRpZgotCi0vKiBQcmVzZXJ2ZSB0aGUgc3RpY2t5LWJpdCB3aGVuIHNoaWZ0aW5nIGZyYWN0aW9ucyB0byB0aGUgcmlnaHQuICAqLwotI2RlZmluZSBMU0hJRlQoYSkgeyBhID0gKGEgJiAxKSB8IChhID4+IDEpOyB9Ci0KLS8qIG51bWVyaWMgcGFyYW1ldGVycyAqLwotLyogRl9EX0JJVE9GRiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgb2Zmc2V0IGJldHdlZW4gdGhlIE1TQiBvZiB0aGUgbWFudGlzc2EKLSAgIG9mIGEgZmxvYXQgYW5kIG9mIGEgZG91YmxlLiBBc3N1bWVzIHRoZXJlIGFyZSBvbmx5IHR3byBmbG9hdCB0eXBlcy4KLSAgIChkb3VibGU6OkZSQUNfQklUUytkb3VibGU6Ok5HQVJHUy0oZmxvYXQ6OkZSQUNfQklUUy1mbG9hdDo6TkdBUkRTKSkKLSAqLwotI2RlZmluZSBGX0RfQklUT0ZGICg1Mis4LSgyMys3KSkKLQotCi0jZGVmaW5lIE5PUk1BTF9FWFBNSU4gKC0oRVhQQklBUykrMSkKLSNkZWZpbmUgSU1QTElDSVRfMSAoMUxMPDwoRlJBQ0JJVFMrTkdBUkRTKSkKLSNkZWZpbmUgSU1QTElDSVRfMiAoMUxMPDwoRlJBQ0JJVFMrMStOR0FSRFMpKQotCi0vKiBjb21tb24gdHlwZXMgKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIENMQVNTX1NOQU4sCi0gIENMQVNTX1FOQU4sCi0gIENMQVNTX1pFUk8sCi0gIENMQVNTX05VTUJFUiwKLSAgQ0xBU1NfSU5GSU5JVFkKLX0gZnBfY2xhc3NfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSNpZmRlZiBTTUFMTF9NQUNISU5FCi0gIGNoYXIgY2xhc3M7Ci0gIHVuc2lnbmVkIGNoYXIgc2lnbjsKLSAgc2hvcnQgbm9ybWFsX2V4cDsKLSNlbHNlCi0gIGZwX2NsYXNzX3R5cGUgY2xhc3M7Ci0gIHVuc2lnbmVkIGludCBzaWduOwotICBpbnQgbm9ybWFsX2V4cDsKLSNlbmRpZgotCi0gIHVuaW9uCi0gICAgewotICAgICAgZnJhY3R5cGUgbGw7Ci0gICAgICBoYWxmZnJhY3R5cGUgbFsyXTsKLSAgICB9IGZyYWN0aW9uOwotfSBmcF9udW1iZXJfdHlwZTsKLQotdHlwZWRlZiB1bmlvbgotewotICBGTE9fdHlwZSB2YWx1ZTsKLSNpZmRlZiBfREVCVUdfQklURkxPQVQKLSAgaW50IGxbMl07Ci0jZW5kaWYKLSAgc3RydWN0Ci0gICAgewotI2lmbmRlZiBGTE9BVF9CSVRfT1JERVJfTUlTTUFUQ0gKLSAgICAgIHVuc2lnbmVkIGludCBzaWduOjEgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgICAgdW5zaWduZWQgaW50IGV4cDpFWFBCSVRTIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICAgIGZyYWN0eXBlIGZyYWN0aW9uOkZSQUNCSVRTIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSNlbHNlCi0gICAgICBmcmFjdHlwZSBmcmFjdGlvbjpGUkFDQklUUyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgICB1bnNpZ25lZCBpbnQgZXhwOkVYUEJJVFMgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgICAgdW5zaWduZWQgaW50IHNpZ246MSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGJpdHM7Ci19Ci1GTE9fdW5pb25fdHlwZTsKLQotCi0vKiBlbmQgb2YgaGVhZGVyICovCi0KLS8qIElFRUUgInNwZWNpYWwiIG51bWJlciBwcmVkaWNhdGVzICovCi0KLSNpZmRlZiBOT19OQU5TCi0KLSNkZWZpbmUgbmFuKCkgMAotI2RlZmluZSBpc25hbih4KSAwCi0jZGVmaW5lIGlzaW5mKHgpIDAKLSNlbHNlCi0KLUlOTElORQotc3RhdGljIGZwX251bWJlcl90eXBlICoKLW5hbiAoKQotewotICBzdGF0aWMgZnBfbnVtYmVyX3R5cGUgdGhlbmFuOwotCi0gIHJldHVybiAmdGhlbmFuOwotfQotCi1JTkxJTkUKLXN0YXRpYyBpbnQKLWlzbmFuICggZnBfbnVtYmVyX3R5cGUgKiAgeCkKLXsKLSAgcmV0dXJuIHgtPmNsYXNzID09IENMQVNTX1NOQU4gfHwgeC0+Y2xhc3MgPT0gQ0xBU1NfUU5BTjsKLX0KLQotSU5MSU5FCi1zdGF0aWMgaW50Ci1pc2luZiAoIGZwX251bWJlcl90eXBlICogIHgpCi17Ci0gIHJldHVybiB4LT5jbGFzcyA9PSBDTEFTU19JTkZJTklUWTsKLX0KLQotI2VuZGlmCi0KLUlOTElORQotc3RhdGljIGludAotaXN6ZXJvICggZnBfbnVtYmVyX3R5cGUgKiAgeCkKLXsKLSAgcmV0dXJuIHgtPmNsYXNzID09IENMQVNTX1pFUk87Ci19Ci0KLUlOTElORSAKLXN0YXRpYyB2b2lkCi1mbGlwX3NpZ24gKCBmcF9udW1iZXJfdHlwZSAqICB4KQotewotICB4LT5zaWduID0gIXgtPnNpZ247Ci19Ci0KLXN0YXRpYyBGTE9fdHlwZQotcGFja19kICggZnBfbnVtYmVyX3R5cGUgKiAgc3JjKQotewotICBGTE9fdW5pb25fdHlwZSBkc3Q7Ci0gIGZyYWN0eXBlIGZyYWN0aW9uID0gc3JjLT5mcmFjdGlvbi5sbDsJLyogd2Fzbid0IHVuc2lnbmVkIGJlZm9yZT8gKi8KLQotICBkc3QuYml0cy5zaWduID0gc3JjLT5zaWduOwotCi0gIGlmIChpc25hbiAoc3JjKSkKLSAgICB7Ci0gICAgICBkc3QuYml0cy5leHAgPSBFWFBNQVg7Ci0gICAgICBkc3QuYml0cy5mcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb24ubGw7Ci0gICAgICBpZiAoc3JjLT5jbGFzcyA9PSBDTEFTU19RTkFOIHx8IDEpCi0JewotCSAgZHN0LmJpdHMuZnJhY3Rpb24gfD0gUVVJRVRfTkFOOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGlzaW5mIChzcmMpKQotICAgIHsKLSAgICAgIGRzdC5iaXRzLmV4cCA9IEVYUE1BWDsKLSAgICAgIGRzdC5iaXRzLmZyYWN0aW9uID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzemVybyAoc3JjKSkKLSAgICB7Ci0gICAgICBkc3QuYml0cy5leHAgPSAwOwotICAgICAgZHN0LmJpdHMuZnJhY3Rpb24gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICBkc3QudmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzcmMtPm5vcm1hbF9leHAgPCBOT1JNQUxfRVhQTUlOKQotCXsKLQkgIC8qIFRoaXMgbnVtYmVyJ3MgZXhwb25lbnQgaXMgdG9vIGxvdyB0byBmaXQgaW50byB0aGUgYml0cwotCSAgICAgYXZhaWxhYmxlIGluIHRoZSBudW1iZXIsIHNvIHdlJ2xsIHN0b3JlIDAgaW4gdGhlIGV4cG9uZW50IGFuZAotCSAgICAgc2hpZnQgdGhlIGZyYWN0aW9uIHRvIHRoZSByaWdodCB0byBtYWtlIHVwIGZvciBpdC4gICovCi0KLQkgIGludCBzaGlmdCA9IE5PUk1BTF9FWFBNSU4gLSBzcmMtPm5vcm1hbF9leHA7Ci0KLQkgIGRzdC5iaXRzLmV4cCA9IDA7Ci0KLQkgIGlmIChzaGlmdCA+IEZSQUNfTkJJVFMgLSBOR0FSRFMpCi0JICAgIHsKLQkgICAgICAvKiBObyBwb2ludCBzaGlmdGluZywgc2luY2UgaXQncyBtb3JlIHRoYXQgNjQgb3V0LiAgKi8KLQkgICAgICBmcmFjdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNoaWZ0IGJ5IHRoZSB2YWx1ZSAqLwotCSAgICAgIGZyYWN0aW9uID4+PSBzaGlmdDsKLQkgICAgfQotCSAgZnJhY3Rpb24gPj49IE5HQVJEUzsKLQkgIGRzdC5iaXRzLmZyYWN0aW9uID0gZnJhY3Rpb247Ci0JfQotICAgICAgZWxzZSBpZiAoc3JjLT5ub3JtYWxfZXhwID4gRVhQQklBUykKLQl7Ci0JICBkc3QuYml0cy5leHAgPSBFWFBNQVg7Ci0JICBkc3QuYml0cy5mcmFjdGlvbiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRzdC5iaXRzLmV4cCA9IHNyYy0+bm9ybWFsX2V4cCArIEVYUEJJQVM7Ci0JICAvKiBJRiB0aGUgZ2FyZCBiaXRzIGFyZSB0aGUgYWxsIHplcm8sIGJ1dCB0aGUgZmlyc3QsIHRoZW4gd2UncmUKLQkgICAgIGhhbGYgd2F5IGJldHdlZW4gdHdvIG51bWJlcnMsIGNob29zZSB0aGUgb25lIHdoaWNoIG1ha2VzIHRoZQotCSAgICAgbHNiIG9mIHRoZSBhbnN3ZXIgMC4gICovCi0JICBpZiAoKGZyYWN0aW9uICYgR0FSRE1BU0spID09IEdBUkRNU0IpCi0JICAgIHsKLQkgICAgICBpZiAoZnJhY3Rpb24gJiAoMSA8PCBOR0FSRFMpKQotCQlmcmFjdGlvbiArPSBHQVJEUk9VTkQgKyAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBBZGQgYSBvbmUgdG8gdGhlIGd1YXJkcyB0byByb3VuZCB1cCAqLwotCSAgICAgIGZyYWN0aW9uICs9IEdBUkRST1VORDsKLQkgICAgfQotCSAgaWYgKGZyYWN0aW9uID49IElNUExJQ0lUXzIpCi0JICAgIHsKLQkgICAgICBmcmFjdGlvbiA+Pj0gMTsKLQkgICAgICBkc3QuYml0cy5leHAgKz0gMTsKLQkgICAgfQotCSAgZnJhY3Rpb24gPj49IE5HQVJEUzsKLQkgIGRzdC5iaXRzLmZyYWN0aW9uID0gZnJhY3Rpb247Ci0JfQotICAgIH0KLSAgcmV0dXJuIGRzdC52YWx1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXVucGFja19kIChGTE9fdW5pb25fdHlwZSAqIHNyYywgZnBfbnVtYmVyX3R5cGUgKiBkc3QpCi17Ci0gIGZyYWN0eXBlIGZyYWN0aW9uID0gc3JjLT5iaXRzLmZyYWN0aW9uOwotCi0gIGRzdC0+c2lnbiA9IHNyYy0+Yml0cy5zaWduOwotICBpZiAoc3JjLT5iaXRzLmV4cCA9PSAwKQotICAgIHsKLSAgICAgIC8qIEhtbS4gIExvb2tzIGxpa2UgMCAqLwotICAgICAgaWYgKGZyYWN0aW9uID09IDApCi0JewotCSAgLyogdGFzdGVzIGxpa2UgemVybyAqLwotCSAgZHN0LT5jbGFzcyA9IENMQVNTX1pFUk87Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFplcm8gZXhwb25lbnQgd2l0aCBub24gemVybyBmcmFjdGlvbiAtIGl0J3MgZGVub3JtYWxpemVkLAotCSAgICAgc28gdGhlcmUgaXNuJ3QgYSBsZWFkaW5nIGltcGxpY2l0IG9uZSAtIHdlJ2xsIHNoaWZ0IGl0IHNvCi0JICAgICBpdCBnZXRzIG9uZS4gICovCi0JICBkc3QtPm5vcm1hbF9leHAgPSBzcmMtPmJpdHMuZXhwIC0gRVhQQklBUyArIDE7Ci0JICBmcmFjdGlvbiA8PD0gTkdBUkRTOwotCi0JICBkc3QtPmNsYXNzID0gQ0xBU1NfTlVNQkVSOwotI2lmIDEKLQkgIHdoaWxlIChmcmFjdGlvbiA8IElNUExJQ0lUXzEpCi0JICAgIHsKLQkgICAgICBmcmFjdGlvbiA8PD0gMTsKLQkgICAgICBkc3QtPm5vcm1hbF9leHAtLTsKLQkgICAgfQotI2VuZGlmCi0JICBkc3QtPmZyYWN0aW9uLmxsID0gZnJhY3Rpb247Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3JjLT5iaXRzLmV4cCA9PSBFWFBNQVgpCi0gICAgewotICAgICAgLyogSHVnZSBleHBvbmVudCovCi0gICAgICBpZiAoZnJhY3Rpb24gPT0gMCkKLQl7Ci0JICAvKiBBdHRhY2hlZCB0byBhIHplcm8gZnJhY3Rpb24gLSBtZWFucyBpbmZpbml0eSAqLwotCSAgZHN0LT5jbGFzcyA9IENMQVNTX0lORklOSVRZOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBOb24gemVybyBmcmFjdGlvbiwgbWVhbnMgbmFuICovCi0JICBpZiAoZHN0LT5zaWduKQotCSAgICB7Ci0JICAgICAgZHN0LT5jbGFzcyA9IENMQVNTX1NOQU47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRzdC0+Y2xhc3MgPSBDTEFTU19RTkFOOwotCSAgICB9Ci0JICAvKiBLZWVwIHRoZSBmcmFjdGlvbiBwYXJ0IGFzIHRoZSBuYW4gbnVtYmVyICovCi0JICBkc3QtPmZyYWN0aW9uLmxsID0gZnJhY3Rpb247Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGhpbmcgc3RyYW5nZSBhYm91dCB0aGlzIG51bWJlciAqLwotICAgICAgZHN0LT5ub3JtYWxfZXhwID0gc3JjLT5iaXRzLmV4cCAtIEVYUEJJQVM7Ci0gICAgICBkc3QtPmNsYXNzID0gQ0xBU1NfTlVNQkVSOwotICAgICAgZHN0LT5mcmFjdGlvbi5sbCA9IChmcmFjdGlvbiA8PCBOR0FSRFMpIHwgSU1QTElDSVRfMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBmcF9udW1iZXJfdHlwZSAqCi1fZnBhZGRfcGFydHMgKGZwX251bWJlcl90eXBlICogYSwKLQkgICAgICBmcF9udW1iZXJfdHlwZSAqIGIsCi0JICAgICAgZnBfbnVtYmVyX3R5cGUgKiB0bXApCi17Ci0gIGludGZyYWMgdGZyYWN0aW9uOwotCi0gIC8qIFB1dCBjb21tb25seSB1c2VkIGZpZWxkcyBpbiBsb2NhbCB2YXJpYWJsZXMuICAqLwotICBpbnQgYV9ub3JtYWxfZXhwOwotICBpbnQgYl9ub3JtYWxfZXhwOwotICBmcmFjdHlwZSBhX2ZyYWN0aW9uOwotICBmcmFjdHlwZSBiX2ZyYWN0aW9uOwotCi0gIGlmIChpc25hbiAoYSkpCi0gICAgewotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXNuYW4gKGIpKQotICAgIHsKLSAgICAgIHJldHVybiBiOwotICAgIH0KLSAgaWYgKGlzaW5mIChhKSkKLSAgICB7Ci0gICAgICAvKiBBZGRpbmcgaW5maW5pdGllcyB3aXRoIG9wcG9zaXRlIHNpZ25zIHlpZWxkcyBhIE5hTi4gICovCi0gICAgICBpZiAoaXNpbmYgKGIpICYmIGEtPnNpZ24gIT0gYi0+c2lnbikKLQlyZXR1cm4gbmFuICgpOwotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXNpbmYgKGIpKQotICAgIHsKLSAgICAgIHJldHVybiBiOwotICAgIH0KLSAgaWYgKGlzemVybyAoYikpCi0gICAgewotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChhKSkKLSAgICB7Ci0gICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgLyogR290IHR3byBudW1iZXJzLiBzaGlmdCB0aGUgc21hbGxlciBhbmQgaW5jcmVtZW50IHRoZSBleHBvbmVudCB0aWxsCi0gICAgIHRoZXkncmUgdGhlIHNhbWUgKi8KLSAgewotICAgIGludCBkaWZmOwotCi0gICAgYV9ub3JtYWxfZXhwID0gYS0+bm9ybWFsX2V4cDsKLSAgICBiX25vcm1hbF9leHAgPSBiLT5ub3JtYWxfZXhwOwotICAgIGFfZnJhY3Rpb24gPSBhLT5mcmFjdGlvbi5sbDsKLSAgICBiX2ZyYWN0aW9uID0gYi0+ZnJhY3Rpb24ubGw7Ci0KLSAgICBkaWZmID0gYV9ub3JtYWxfZXhwIC0gYl9ub3JtYWxfZXhwOwotCi0gICAgaWYgKGRpZmYgPCAwKQotICAgICAgZGlmZiA9IC1kaWZmOwotICAgIGlmIChkaWZmIDwgRlJBQ19OQklUUykKLSAgICAgIHsKLQkvKiA/Pz8gVGhpcyBkb2VzIHNoaWZ0cyBvbmUgYml0IGF0IGEgdGltZS4gIE9wdGltaXplLiAgKi8KLQl3aGlsZSAoYV9ub3JtYWxfZXhwID4gYl9ub3JtYWxfZXhwKQotCSAgewotCSAgICBiX25vcm1hbF9leHArKzsKLQkgICAgTFNISUZUIChiX2ZyYWN0aW9uKTsKLQkgIH0KLQl3aGlsZSAoYl9ub3JtYWxfZXhwID4gYV9ub3JtYWxfZXhwKQotCSAgewotCSAgICBhX25vcm1hbF9leHArKzsKLQkgICAgTFNISUZUIChhX2ZyYWN0aW9uKTsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogU29tZXRoaW5ncydzIHVwLi4gY2hvb3NlIHRoZSBiaWdnZXN0ICovCi0JaWYgKGFfbm9ybWFsX2V4cCA+IGJfbm9ybWFsX2V4cCkKLQkgIHsKLQkgICAgYl9ub3JtYWxfZXhwID0gYV9ub3JtYWxfZXhwOwotCSAgICBiX2ZyYWN0aW9uID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFfbm9ybWFsX2V4cCA9IGJfbm9ybWFsX2V4cDsKLQkgICAgYV9mcmFjdGlvbiA9IDA7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICBpZiAoYS0+c2lnbiAhPSBiLT5zaWduKQotICAgIHsKLSAgICAgIGlmIChhLT5zaWduKQotCXsKLQkgIHRmcmFjdGlvbiA9IC1hX2ZyYWN0aW9uICsgYl9mcmFjdGlvbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGZyYWN0aW9uID0gYV9mcmFjdGlvbiAtIGJfZnJhY3Rpb247Ci0JfQotICAgICAgaWYgKHRmcmFjdGlvbiA+IDApCi0JewotCSAgdG1wLT5zaWduID0gMDsKLQkgIHRtcC0+bm9ybWFsX2V4cCA9IGFfbm9ybWFsX2V4cDsKLQkgIHRtcC0+ZnJhY3Rpb24ubGwgPSB0ZnJhY3Rpb247Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRtcC0+c2lnbiA9IDE7Ci0JICB0bXAtPm5vcm1hbF9leHAgPSBhX25vcm1hbF9leHA7Ci0JICB0bXAtPmZyYWN0aW9uLmxsID0gLXRmcmFjdGlvbjsKLQl9Ci0gICAgICAvKiBhbmQgcmVub3JtYWxpemUgaXQgKi8KLQotICAgICAgd2hpbGUgKHRtcC0+ZnJhY3Rpb24ubGwgPCBJTVBMSUNJVF8xICYmIHRtcC0+ZnJhY3Rpb24ubGwpCi0JewotCSAgdG1wLT5mcmFjdGlvbi5sbCA8PD0gMTsKLQkgIHRtcC0+bm9ybWFsX2V4cC0tOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0bXAtPnNpZ24gPSBhLT5zaWduOwotICAgICAgdG1wLT5ub3JtYWxfZXhwID0gYV9ub3JtYWxfZXhwOwotICAgICAgdG1wLT5mcmFjdGlvbi5sbCA9IGFfZnJhY3Rpb24gKyBiX2ZyYWN0aW9uOwotICAgIH0KLSAgdG1wLT5jbGFzcyA9IENMQVNTX05VTUJFUjsKLSAgLyogTm93IHRoZSBmcmFjdGlvbiBpcyBhZGRlZCwgd2UgaGF2ZSB0byBzaGlmdCBkb3duIHRvIHJlbm9ybWFsaXplIHRoZQotICAgICBudW1iZXIgKi8KLQotICBpZiAodG1wLT5mcmFjdGlvbi5sbCA+PSBJTVBMSUNJVF8yKQotICAgIHsKLSAgICAgIExTSElGVCAodG1wLT5mcmFjdGlvbi5sbCk7Ci0gICAgICB0bXAtPm5vcm1hbF9leHArKzsKLSAgICB9Ci0gIHJldHVybiB0bXA7Ci0KLX0KLQotRkxPX3R5cGUKLWFkZCAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBmcF9udW1iZXJfdHlwZSBiOwotICBmcF9udW1iZXJfdHlwZSB0bXA7Ci0gIGZwX251bWJlcl90eXBlICpyZXM7Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7Ci0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOwotCi0gIHJlcyA9IF9mcGFkZF9wYXJ0cyAoJmEsICZiLCAmdG1wKTsKLQotICByZXR1cm4gcGFja19kIChyZXMpOwotfQotCi1GTE9fdHlwZQotc3ViIChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCi17Ci0gIGZwX251bWJlcl90eXBlIGE7Ci0gIGZwX251bWJlcl90eXBlIGI7Ci0gIGZwX251bWJlcl90eXBlIHRtcDsKLSAgZnBfbnVtYmVyX3R5cGUgKnJlczsKLQotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7Ci0KLSAgYi5zaWduIF49IDE7Ci0KLSAgcmVzID0gX2ZwYWRkX3BhcnRzICgmYSwgJmIsICZ0bXApOwotCi0gIHJldHVybiBwYWNrX2QgKHJlcyk7Ci19Ci0KLXN0YXRpYyBmcF9udW1iZXJfdHlwZSAqCi1fZnBtdWxfcGFydHMgKCBmcF9udW1iZXJfdHlwZSAqICBhLAotCSAgICAgICBmcF9udW1iZXJfdHlwZSAqICBiLAotCSAgICAgICBmcF9udW1iZXJfdHlwZSAqIHRtcCkKLXsKLSAgZnJhY3R5cGUgbG93ID0gMDsKLSAgZnJhY3R5cGUgaGlnaCA9IDA7Ci0KLSAgaWYgKGlzbmFuIChhKSkKLSAgICB7Ci0gICAgICBhLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOwotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXNuYW4gKGIpKQotICAgIHsKLSAgICAgIGItPnNpZ24gPSBhLT5zaWduICE9IGItPnNpZ247Ci0gICAgICByZXR1cm4gYjsKLSAgICB9Ci0gIGlmIChpc2luZiAoYSkpCi0gICAgewotICAgICAgaWYgKGlzemVybyAoYikpCi0JcmV0dXJuIG5hbiAoKTsKLSAgICAgIGEtPnNpZ24gPSBhLT5zaWduICE9IGItPnNpZ247Ci0gICAgICByZXR1cm4gYTsKLSAgICB9Ci0gIGlmIChpc2luZiAoYikpCi0gICAgewotICAgICAgaWYgKGlzemVybyAoYSkpCi0JewotCSAgcmV0dXJuIG5hbiAoKTsKLQl9Ci0gICAgICBiLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOwotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChhKSkKLSAgICB7Ci0gICAgICBhLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOwotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChiKSkKLSAgICB7Ci0gICAgICBiLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOwotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gIC8qIENhbGN1bGF0ZSB0aGUgbWFudGlzc2EgYnkgbXVsdGlwbHlpbmcgYm90aCA2NGJpdCBudW1iZXJzIHRvIGdldCBhCi0gICAgIDEyOCBiaXQgbnVtYmVyICovCi0gIHsKLSAgICBmcmFjdHlwZSB4ID0gYS0+ZnJhY3Rpb24ubGw7Ci0gICAgZnJhY3R5cGUgeWxvdyA9IGItPmZyYWN0aW9uLmxsOwotICAgIGZyYWN0eXBlIHloaWdoID0gMDsKLSAgICBpbnQgYml0OwotCi0jaWYgZGVmaW5lZChOT19ESV9NT0RFKQotICAgIHsKLSAgICAgIC8qID8/PyBUaGlzIGRvZXMgbXVsdGlwbGllcyBvbmUgYml0IGF0IGEgdGltZS4gIE9wdGltaXplLiAgKi8KLSAgICAgIGZvciAoYml0ID0gMDsgYml0IDwgRlJBQ19OQklUUzsgYml0KyspCi0JewotCSAgaW50IGNhcnJ5OwotCi0JICBpZiAoeCAmIDEpCi0JICAgIHsKLQkgICAgICBjYXJyeSA9IChsb3cgKz0geWxvdykgPCB5bG93OwotCSAgICAgIGhpZ2ggKz0geWhpZ2ggKyBjYXJyeTsKLQkgICAgfQotCSAgeWhpZ2ggPDw9IDE7Ci0JICBpZiAoeWxvdyAmIEZSQUNISUdIKQotCSAgICB7Ci0JICAgICAgeWhpZ2ggfD0gMTsKLQkgICAgfQotCSAgeWxvdyA8PD0gMTsKLQkgIHggPj49IDE7Ci0JfQotICAgIH0KLSNlbGlmIGRlZmluZWQoRkxPQVQpIAotICAgIHsKLSAgICAgIC8qIE11bHRpcGx5aW5nIHR3byAzMiBiaXQgbnVtYmVycyB0byBnZXQgYSA2NCBiaXQgbnVtYmVyICBvbiAKLSAgICAgICAgYSBtYWNoaW5lIHdpdGggREksIHNvIHdlJ3JlIHNhZmUgKi8KLQotICAgICAgREl0eXBlIGFuc3dlciA9IChESXR5cGUpKGEtPmZyYWN0aW9uLmxsKSAqIChESXR5cGUpKGItPmZyYWN0aW9uLmxsKTsKLSAgICAgIAotICAgICAgaGlnaCA9IGFuc3dlciA+PiAzMjsKLSAgICAgIGxvdyA9IGFuc3dlcjsKLSAgICB9Ci0jZWxzZQotICAgIC8qIERvaW5nIGEgNjQqNjQgdG8gMTI4ICovCi0gICAgewotICAgICAgVURJdHlwZSBubCA9IGEtPmZyYWN0aW9uLmxsICYgMHhmZmZmZmZmZjsKLSAgICAgIFVESXR5cGUgbmggPSBhLT5mcmFjdGlvbi5sbCA+PiAzMjsKLSAgICAgIFVESXR5cGUgbWwgPSBiLT5mcmFjdGlvbi5sbCAmIDB4ZmZmZmZmZmY7Ci0gICAgICBVREl0eXBlIG1oID0gYi0+ZnJhY3Rpb24ubGwgPj4zMjsKLSAgICAgIFVESXR5cGUgcHBfbGwgPSBtbCAqIG5sOwotICAgICAgVURJdHlwZSBwcF9obCA9IG1oICogbmw7Ci0gICAgICBVREl0eXBlIHBwX2xoID0gbWwgKiBuaDsKLSAgICAgIFVESXR5cGUgcHBfaGggPSBtaCAqIG5oOwotICAgICAgVURJdHlwZSByZXMyID0gMDsKLSAgICAgIFVESXR5cGUgcmVzMCA9IDA7Ci0gICAgICBVREl0eXBlIHBzX2hoX18gPSBwcF9obCArIHBwX2xoOwotICAgICAgaWYgKHBzX2hoX18gPCBwcF9obCkKLQlyZXMyICs9IDB4MTAwMDAwMDAwTEw7Ci0gICAgICBwcF9obCA9IChwc19oaF9fIDw8IDMyKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMOwotICAgICAgcmVzMCA9IHBwX2xsICsgcHBfaGw7Ci0gICAgICBpZiAocmVzMCA8IHBwX2xsKQotCXJlczIrKzsKLSAgICAgIHJlczIgKz0gKChwc19oaF9fID4+IDMyKSAmIDB4ZmZmZmZmZmZMKSArIHBwX2hoOwotICAgICAgaGlnaCA9IHJlczI7Ci0gICAgICBsb3cgPSByZXMwOwotICAgIH0KLSNlbmRpZgotICB9Ci0KLSAgdG1wLT5ub3JtYWxfZXhwID0gYS0+bm9ybWFsX2V4cCArIGItPm5vcm1hbF9leHA7Ci0gIHRtcC0+c2lnbiA9IGEtPnNpZ24gIT0gYi0+c2lnbjsKLSNpZmRlZiBGTE9BVAotICB0bXAtPm5vcm1hbF9leHAgKz0gMjsJCS8qID8/Pz8/Pz8/Pz8/Pz8/PyAqLwotI2Vsc2UKLSAgdG1wLT5ub3JtYWxfZXhwICs9IDQ7CQkvKiA/Pz8/Pz8/Pz8/Pz8/Pz8gKi8KLSNlbmRpZgotICB3aGlsZSAoaGlnaCA+PSBJTVBMSUNJVF8yKQotICAgIHsKLSAgICAgIHRtcC0+bm9ybWFsX2V4cCsrOwotICAgICAgaWYgKGhpZ2ggJiAxKQotCXsKLQkgIGxvdyA+Pj0gMTsKLQkgIGxvdyB8PSBGUkFDSElHSDsKLQl9Ci0gICAgICBoaWdoID4+PSAxOwotICAgIH0KLSAgd2hpbGUgKGhpZ2ggPCBJTVBMSUNJVF8xKQotICAgIHsKLSAgICAgIHRtcC0+bm9ybWFsX2V4cC0tOwotCi0gICAgICBoaWdoIDw8PSAxOwotICAgICAgaWYgKGxvdyAmIEZSQUNISUdIKQotCWhpZ2ggfD0gMTsKLSAgICAgIGxvdyA8PD0gMTsKLSAgICB9Ci0gIC8qIHJvdW5kaW5nIGlzIHRyaWNreS4gaWYgd2Ugb25seSByb3VuZCBpZiBpdCB3b24ndCBtYWtlIHVzIHJvdW5kIGxhdGVyLiAqLwotI2lmIDAKLSAgaWYgKGxvdyAmIEZSQUNISUdIMikKLSAgICB7Ci0gICAgICBpZiAoKChoaWdoICYgR0FSRE1BU0spICE9IEdBUkRNU0IpCi0JICAmJiAoKChoaWdoICsgMSkgJiBHQVJETUFTSykgPT0gR0FSRE1TQikpCi0JewotCSAgLyogZG9uJ3Qgcm91bmQsIGl0IGdldHMgZG9uZSBhZ2FpbiBsYXRlci4gKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaGlnaCsrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgaWYgKChoaWdoICYgR0FSRE1BU0spID09IEdBUkRNU0IpCi0gICAgewotICAgICAgaWYgKGhpZ2ggJiAoMSA8PCBOR0FSRFMpKQotCXsKLQkgIC8qIGhhbGYgd2F5LCBzbyByb3VuZCB0byBldmVuICovCi0JICBoaWdoICs9IEdBUkRST1VORCArIDE7Ci0JfQotICAgICAgZWxzZSBpZiAobG93KQotCXsKLQkgIC8qIGJ1dCB3ZSByZWFsbHkgd2VyZW4ndCBoYWxmIHdheSAqLwotCSAgaGlnaCArPSBHQVJEUk9VTkQgKyAxOwotCX0KLSAgICB9Ci0gIHRtcC0+ZnJhY3Rpb24ubGwgPSBoaWdoOwotICB0bXAtPmNsYXNzID0gQ0xBU1NfTlVNQkVSOwotICByZXR1cm4gdG1wOwotfQotCi1GTE9fdHlwZQotbXVsdGlwbHkgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKLXsKLSAgZnBfbnVtYmVyX3R5cGUgYTsKLSAgZnBfbnVtYmVyX3R5cGUgYjsKLSAgZnBfbnVtYmVyX3R5cGUgdG1wOwotICBmcF9udW1iZXJfdHlwZSAqcmVzOwotCi0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOwotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKLQotICByZXMgPSBfZnBtdWxfcGFydHMgKCZhLCAmYiwgJnRtcCk7Ci0KLSAgcmV0dXJuIHBhY2tfZCAocmVzKTsKLX0KLQotc3RhdGljIGZwX251bWJlcl90eXBlICoKLV9mcGRpdl9wYXJ0cyAoZnBfbnVtYmVyX3R5cGUgKiBhLAotCSAgICAgIGZwX251bWJlcl90eXBlICogYiwKLQkgICAgICBmcF9udW1iZXJfdHlwZSAqIHRtcCkKLXsKLSAgZnJhY3R5cGUgbG93ID0gMDsKLSAgZnJhY3R5cGUgaGlnaCA9IDA7Ci0gIGZyYWN0eXBlIHIwLCByMSwgeTAsIHkxLCBiaXQ7Ci0gIGZyYWN0eXBlIHE7Ci0gIGZyYWN0eXBlIG51bWVyYXRvcjsKLSAgZnJhY3R5cGUgZGVub21pbmF0b3I7Ci0gIGZyYWN0eXBlIHF1b3RpZW50OwotICBmcmFjdHlwZSByZW1haW5kZXI7Ci0KLSAgaWYgKGlzbmFuIChhKSkKLSAgICB7Ci0gICAgICByZXR1cm4gYTsKLSAgICB9Ci0gIGlmIChpc25hbiAoYikpCi0gICAgewotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICBpZiAoaXNpbmYgKGEpIHx8IGlzemVybyAoYSkpCi0gICAgewotICAgICAgaWYgKGEtPmNsYXNzID09IGItPmNsYXNzKQotCXJldHVybiBuYW4gKCk7Ci0gICAgICByZXR1cm4gYTsKLSAgICB9Ci0gIGEtPnNpZ24gPSBhLT5zaWduIF4gYi0+c2lnbjsKLQotICBpZiAoaXNpbmYgKGIpKQotICAgIHsKLSAgICAgIGEtPmZyYWN0aW9uLmxsID0gMDsKLSAgICAgIGEtPm5vcm1hbF9leHAgPSAwOwotICAgICAgcmV0dXJuIGE7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChiKSkKLSAgICB7Ci0gICAgICBhLT5jbGFzcyA9IENMQVNTX0lORklOSVRZOwotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gIC8qIENhbGN1bGF0ZSB0aGUgbWFudGlzc2EgYnkgbXVsdGlwbHlpbmcgYm90aCA2NGJpdCBudW1iZXJzIHRvIGdldCBhCi0gICAgIDEyOCBiaXQgbnVtYmVyICovCi0gIHsKLSAgICBpbnQgY2Fycnk7Ci0gICAgaW50ZnJhYyBkMCwgZDE7CQkvKiB3ZXJlbid0IHVuc2lnbmVkIGJlZm9yZSA/Pz8gKi8KLQotICAgIC8qIHF1b3RpZW50ID0KLSAgICAgICAoIG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSAqIDJeKG51bWVyYXRvciBleHBvbmVudCAtICBkZW5vbWluYXRvciBleHBvbmVudCkKLSAgICAgKi8KLQotICAgIGEtPm5vcm1hbF9leHAgPSBhLT5ub3JtYWxfZXhwIC0gYi0+bm9ybWFsX2V4cDsKLSAgICBudW1lcmF0b3IgPSBhLT5mcmFjdGlvbi5sbDsKLSAgICBkZW5vbWluYXRvciA9IGItPmZyYWN0aW9uLmxsOwotCi0gICAgaWYgKG51bWVyYXRvciA8IGRlbm9taW5hdG9yKQotICAgICAgewotCS8qIEZyYWN0aW9uIHdpbGwgYmUgbGVzcyB0aGFuIDEuMCAqLwotCW51bWVyYXRvciAqPSAyOwotCWEtPm5vcm1hbF9leHAtLTsKLSAgICAgIH0KLSAgICBiaXQgPSBJTVBMSUNJVF8xOwotICAgIHF1b3RpZW50ID0gMDsKLSAgICAvKiA/Pz8gRG9lcyBkaXZpZGUgb25lIGJpdCBhdCBhIHRpbWUuICBPcHRpbWl6ZS4gICovCi0gICAgd2hpbGUgKGJpdCkKLSAgICAgIHsKLQlpZiAobnVtZXJhdG9yID49IGRlbm9taW5hdG9yKQotCSAgewotCSAgICBxdW90aWVudCB8PSBiaXQ7Ci0JICAgIG51bWVyYXRvciAtPSBkZW5vbWluYXRvcjsKLQkgIH0KLQliaXQgPj49IDE7Ci0JbnVtZXJhdG9yICo9IDI7Ci0gICAgICB9Ci0KLSAgICBpZiAoKHF1b3RpZW50ICYgR0FSRE1BU0spID09IEdBUkRNU0IpCi0gICAgICB7Ci0JaWYgKHF1b3RpZW50ICYgKDEgPDwgTkdBUkRTKSkKLQkgIHsKLQkgICAgLyogaGFsZiB3YXksIHNvIHJvdW5kIHRvIGV2ZW4gKi8KLQkgICAgcXVvdGllbnQgKz0gR0FSRFJPVU5EICsgMTsKLQkgIH0KLQllbHNlIGlmIChudW1lcmF0b3IpCi0JICB7Ci0JICAgIC8qIGJ1dCB3ZSByZWFsbHkgd2VyZW4ndCBoYWxmIHdheSwgbW9yZSBiaXRzIGV4aXN0ICovCi0JICAgIHF1b3RpZW50ICs9IEdBUkRST1VORCArIDE7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBhLT5mcmFjdGlvbi5sbCA9IHF1b3RpZW50OwotICAgIHJldHVybiAoYSk7Ci0gIH0KLX0KLQotRkxPX3R5cGUKLWRpdmlkZSAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBmcF9udW1iZXJfdHlwZSBiOwotICBmcF9udW1iZXJfdHlwZSB0bXA7Ci0gIGZwX251bWJlcl90eXBlICpyZXM7Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7Ci0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOwotCi0gIHJlcyA9IF9mcGRpdl9wYXJ0cyAoJmEsICZiLCAmdG1wKTsKLQotICByZXR1cm4gcGFja19kIChyZXMpOwotfQotCi0vKiBhY2NvcmRpbmcgdG8gdGhlIGRlbW8sIGZwY21wIHJldHVybnMgYSBjb21wYXJpc29uIHdpdGggMC4uLiB0aHVzCi0gICBhPGIgLT4gLTEKLSAgIGE9PWIgLT4gMAotICAgYT5iIC0+ICsxCi0gKi8KLQotc3RhdGljIGludAotX2ZwY21wX3BhcnRzIChmcF9udW1iZXJfdHlwZSAqIGEsIGZwX251bWJlcl90eXBlICogYikKLXsKLSNpZiAwCi0gIC8qIGVpdGhlciBuYW4gLT4gdW5vcmRlcmVkLiBNdXN0IGJlIGNoZWNrZWQgb3V0c2lkZSBvZiB0aGlzIHJvdXRpbmUuICovCi0gIGlmIChpc25hbiAoYSkgJiYgaXNuYW4gKGIpKQotICAgIHsKLSAgICAgIHJldHVybiAxOwkJCS8qIHN0aWxsIHVub3JkZXJlZCEgKi8KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoaXNuYW4gKGEpIHx8IGlzbmFuIChiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsJCQkvKiBob3cgdG8gaW5kaWNhdGUgdW5vcmRlcmVkIGNvbXBhcmU/ICovCi0gICAgfQotICBpZiAoaXNpbmYgKGEpICYmIGlzaW5mIChiKSkKLSAgICB7Ci0gICAgICAvKiAraW5mID4gLWluZiwgYnV0ICtpbmYgIT0gK2luZiAqLwotICAgICAgLyogYiAgICBcYXwgK2luZigwKXwgLWluZigxKQotICAgICAgIF9fX19fX1wrLS0tLS0tLS0rLS0tLS0tLS0KLSAgICAgICAraW5mKDApfCBhPT1iKDApfCBhPGIoLTEpCi0gICAgICAgLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLQotICAgICAgIC1pbmYoMSl8IGE+YigxKSB8IGE9PWIoMCkKLSAgICAgICAtLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tCi0gICAgICAgU28gc2luY2UgdW5vcmRlcmVkIG11c3QgYmUgbm9uIHplcm8sIGp1c3QgbGluZSB1cCB0aGUgY29sdW1ucy4uLgotICAgICAgICovCi0gICAgICByZXR1cm4gYi0+c2lnbiAtIGEtPnNpZ247Ci0gICAgfQotICAvKiBidXQgbm90IGJvdGguLi4gKi8KLSAgaWYgKGlzaW5mIChhKSkKLSAgICB7Ci0gICAgICByZXR1cm4gYS0+c2lnbiA/IC0xIDogMTsKLSAgICB9Ci0gIGlmIChpc2luZiAoYikpCi0gICAgewotICAgICAgcmV0dXJuIGItPnNpZ24gPyAxIDogLTE7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChhKSAmJiBpc3plcm8gKGIpKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGlzemVybyAoYSkpCi0gICAgewotICAgICAgcmV0dXJuIGItPnNpZ24gPyAxIDogLTE7Ci0gICAgfQotICBpZiAoaXN6ZXJvIChiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gYS0+c2lnbiA/IC0xIDogMTsKLSAgICB9Ci0gIC8qIG5vdyBib3RoIGFyZSAibm9ybWFsIi4gKi8KLSAgaWYgKGEtPnNpZ24gIT0gYi0+c2lnbikKLSAgICB7Ci0gICAgICAvKiBvcHBvc2l0ZSBzaWducyAqLwotICAgICAgcmV0dXJuIGEtPnNpZ24gPyAtMSA6IDE7Ci0gICAgfQotICAvKiBzYW1lIHNpZ247IGV4cG9uZW50cz8gKi8KLSAgaWYgKGEtPm5vcm1hbF9leHAgPiBiLT5ub3JtYWxfZXhwKQotICAgIHsKLSAgICAgIHJldHVybiBhLT5zaWduID8gLTEgOiAxOwotICAgIH0KLSAgaWYgKGEtPm5vcm1hbF9leHAgPCBiLT5ub3JtYWxfZXhwKQotICAgIHsKLSAgICAgIHJldHVybiBhLT5zaWduID8gMSA6IC0xOwotICAgIH0KLSAgLyogc2FtZSBleHBvbmVudHM7IGNoZWNrIHNpemUuICovCi0gIGlmIChhLT5mcmFjdGlvbi5sbCA+IGItPmZyYWN0aW9uLmxsKQotICAgIHsKLSAgICAgIHJldHVybiBhLT5zaWduID8gLTEgOiAxOwotICAgIH0KLSAgaWYgKGEtPmZyYWN0aW9uLmxsIDwgYi0+ZnJhY3Rpb24ubGwpCi0gICAgewotICAgICAgcmV0dXJuIGEtPnNpZ24gPyAxIDogLTE7Ci0gICAgfQotICAvKiBhZnRlciBhbGwgdGhhdCwgdGhleSdyZSBlcXVhbC4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLUNNUHR5cGUKLWNvbXBhcmUgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKLXsKLSAgZnBfbnVtYmVyX3R5cGUgYTsKLSAgZnBfbnVtYmVyX3R5cGUgYjsKLQotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7Ci0KLSAgcmV0dXJuIF9mcGNtcF9wYXJ0cyAoJmEsICZiKTsKLX0KLQotI2lmbmRlZiBVU19TT0ZUV0FSRV9HT0ZBU1QKLQotLyogVGhlc2Ugc2hvdWxkIGJlIG9wdGltaXplZCBmb3IgdGhlaXIgc3BlY2lmaWMgdGFza3Mgc29tZWRheS4gICovCi0KLUNNUHR5cGUKLV9lcV9mMiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBmcF9udW1iZXJfdHlwZSBiOwotCi0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOwotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKLQotICBpZiAoaXNuYW4gKCZhKSB8fCBpc25hbiAoJmIpKQotICAgIHJldHVybiAxOwkJCS8qIGZhbHNlLCB0cnV0aCA9PSAwICovCi0KLSAgcmV0dXJuIF9mcGNtcF9wYXJ0cyAoJmEsICZiKSA7Ci19Ci0KLUNNUHR5cGUKLV9uZV9mMiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBmcF9udW1iZXJfdHlwZSBiOwotCi0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOwotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKLQotICBpZiAoaXNuYW4gKCZhKSB8fCBpc25hbiAoJmIpKQotICAgIHJldHVybiAxOwkJCS8qIHRydWUsIHRydXRoICE9IDAgKi8KLQotICByZXR1cm4gIF9mcGNtcF9wYXJ0cyAoJmEsICZiKSA7Ci19Ci0KLUNNUHR5cGUKLV9ndF9mMiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBmcF9udW1iZXJfdHlwZSBiOwotCi0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOwotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKLQotICBpZiAoaXNuYW4gKCZhKSB8fCBpc25hbiAoJmIpKQotICAgIHJldHVybiAtMTsJCQkvKiBmYWxzZSwgdHJ1dGggPiAwICovCi0KLSAgcmV0dXJuIF9mcGNtcF9wYXJ0cyAoJmEsICZiKTsKLX0KLQotQ01QdHlwZQotX2dlX2YyIChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCi17Ci0gIGZwX251bWJlcl90eXBlIGE7Ci0gIGZwX251bWJlcl90eXBlIGI7Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7Ci0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOwotCi0gIGlmIChpc25hbiAoJmEpIHx8IGlzbmFuICgmYikpCi0gICAgcmV0dXJuIC0xOwkJCS8qIGZhbHNlLCB0cnV0aCA+PSAwICovCi0gIHJldHVybiBfZnBjbXBfcGFydHMgKCZhLCAmYikgOwotfQotCi1DTVB0eXBlCi1fbHRfZjIgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKLXsKLSAgZnBfbnVtYmVyX3R5cGUgYTsKLSAgZnBfbnVtYmVyX3R5cGUgYjsKLQotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7Ci0KLSAgaWYgKGlzbmFuICgmYSkgfHwgaXNuYW4gKCZiKSkKLSAgICByZXR1cm4gMTsJCQkvKiBmYWxzZSwgdHJ1dGggPCAwICovCi0KLSAgcmV0dXJuIF9mcGNtcF9wYXJ0cyAoJmEsICZiKTsKLX0KLQotQ01QdHlwZQotX2xlX2YyIChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCi17Ci0gIGZwX251bWJlcl90eXBlIGE7Ci0gIGZwX251bWJlcl90eXBlIGI7Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7Ci0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOwotCi0gIGlmIChpc25hbiAoJmEpIHx8IGlzbmFuICgmYikpCi0gICAgcmV0dXJuIDE7CQkJLyogZmFsc2UsIHRydXRoIDw9IDAgKi8KLQotICByZXR1cm4gX2ZwY21wX3BhcnRzICgmYSwgJmIpIDsKLX0KLQotI2VuZGlmIC8qICEgVVNfU09GVFdBUkVfR09GQVNUICovCi0KLUZMT190eXBlCi1zaV90b19mbG9hdCAoU0l0eXBlIGFyZ19hKQotewotICBmcF9udW1iZXJfdHlwZSBpbjsKLQotICBpbi5jbGFzcyA9IENMQVNTX05VTUJFUjsKLSAgaW4uc2lnbiA9IGFyZ19hIDwgMDsKLSAgaWYgKCFhcmdfYSkKLSAgICB7Ci0gICAgICBpbi5jbGFzcyA9IENMQVNTX1pFUk87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW4ubm9ybWFsX2V4cCA9IEZSQUNCSVRTICsgTkdBUkRTOwotICAgICAgaWYgKGluLnNpZ24pIAotCXsKLQkgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbWluaW50LCBzaW5jZSB0aGVyZSBpcyBubyArdmUgaW50ZWdlcgotCSAgICAgcmVwcmVzZW50YXRpb24gZm9yIGl0ICovCi0JICBpZiAoYXJnX2EgPT0gMHg4MDAwMDAwMCkKLQkgICAgewotCSAgICAgIHJldHVybiAtMjE0NzQ4MzY0OC4wOwotCSAgICB9Ci0JICBpbi5mcmFjdGlvbi5sbCA9ICgtYXJnX2EpOwotCX0KLSAgICAgIGVsc2UKLQlpbi5mcmFjdGlvbi5sbCA9IGFyZ19hOwotCi0gICAgICB3aGlsZSAoaW4uZnJhY3Rpb24ubGwgPCAoMUxMIDw8IChGUkFDQklUUyArIE5HQVJEUykpKQotCXsKLQkgIGluLmZyYWN0aW9uLmxsIDw8PSAxOwotCSAgaW4ubm9ybWFsX2V4cCAtPSAxOwotCX0KLSAgICB9Ci0gIHJldHVybiBwYWNrX2QgKCZpbik7Ci19Ci0KLVNJdHlwZQotZmxvYXRfdG9fc2kgKEZMT190eXBlIGFyZ19hKQotewotICBmcF9udW1iZXJfdHlwZSBhOwotICBTSXR5cGUgdG1wOwotCi0gIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOwotICBpZiAoaXN6ZXJvICgmYSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChpc25hbiAoJmEpKQotICAgIHJldHVybiAwOwotICAvKiBnZXQgcmVhc29uYWJsZSBNQVhfU0lfSU5ULi4uICovCi0gIGlmIChpc2luZiAoJmEpKQotICAgIHJldHVybiBhLnNpZ24gPyBNQVhfU0lfSU5UIDogKC1NQVhfU0lfSU5UKS0xOwotICAvKiBpdCBpcyBhIG51bWJlciwgYnV0IGEgc21hbGwgb25lICovCi0gIGlmIChhLm5vcm1hbF9leHAgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoYS5ub3JtYWxfZXhwID4gMzApCi0gICAgcmV0dXJuIGEuc2lnbiA/ICgtTUFYX1NJX0lOVCktMSA6IE1BWF9TSV9JTlQ7Ci0gIHRtcCA9IGEuZnJhY3Rpb24ubGwgPj4gKChGUkFDQklUUyArIE5HQVJEUykgLSBhLm5vcm1hbF9leHApOwotICByZXR1cm4gYS5zaWduID8gKC10bXApIDogKHRtcCk7Ci19Ci0KLSNpZmRlZiBVU19TT0ZUV0FSRV9HT0ZBU1QKLS8qIFdoaWxlIGxpYmdjYzIuYyBkZWZpbmVzIGl0cyBvd24gX19maXh1bnNzZnNpIGFuZCBfX2ZpeHVuc2Rmc2kgcm91dGluZXMsCi0gICB3ZSBhbHNvIGRlZmluZSB0aGVtIGZvciBHT0ZBU1QgYmVjYXVzZSB0aGUgb25lcyBpbiBsaWJnY2MyLmMgaGF2ZSB0aGUKLSAgIHdyb25nIG5hbWVzIGFuZCBJJ2QgcmF0aGVyIGRlZmluZSB0aGVzZSBoZXJlIGFuZCBrZWVwIEdPRkFTVCBDWUctTE9DJ3MKLSAgIG91dCBvZiBsaWJnY2MyLmMuICBXZSBjYW4ndCBkZWZpbmUgdGhlc2UgaGVyZSBpZiBub3QgR09GQVNUIGJlY2F1c2UgdGhlbgotICAgdGhlcmUnZCBiZSBkdXBsaWNhdGUgY29waWVzLiAgKi8KLQotVVNJdHlwZQotZmxvYXRfdG9fdXNpIChGTE9fdHlwZSBhcmdfYSkKLXsKLSAgZnBfbnVtYmVyX3R5cGUgYTsKLQotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKLSAgaWYgKGlzemVybyAoJmEpKQotICAgIHJldHVybiAwOwotICBpZiAoaXNuYW4gKCZhKSkKLSAgICByZXR1cm4gMDsKLSAgLyogZ2V0IHJlYXNvbmFibGUgTUFYX1VTSV9JTlQuLi4gKi8KLSAgaWYgKGlzaW5mICgmYSkpCi0gICAgcmV0dXJuIGEuc2lnbiA/IE1BWF9VU0lfSU5UIDogMDsKLSAgLyogaXQgaXMgYSBuZWdhdGl2ZSBudW1iZXIgKi8KLSAgaWYgKGEuc2lnbikKLSAgICByZXR1cm4gMDsKLSAgLyogaXQgaXMgYSBudW1iZXIsIGJ1dCBhIHNtYWxsIG9uZSAqLwotICBpZiAoYS5ub3JtYWxfZXhwIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGEubm9ybWFsX2V4cCA+IDMxKQotICAgIHJldHVybiBNQVhfVVNJX0lOVDsKLSAgZWxzZSBpZiAoYS5ub3JtYWxfZXhwID4gKEZSQUNCSVRTICsgTkdBUkRTKSkKLSAgICByZXR1cm4gYS5mcmFjdGlvbi5sbCA8PCAoKEZSQUNCSVRTICsgTkdBUkRTKSAtIGEubm9ybWFsX2V4cCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gYS5mcmFjdGlvbi5sbCA+PiAoKEZSQUNCSVRTICsgTkdBUkRTKSAtIGEubm9ybWFsX2V4cCk7Ci19Ci0jZW5kaWYKLQotRkxPX3R5cGUKLW5lZ2F0ZSAoRkxPX3R5cGUgYXJnX2EpCi17Ci0gIGZwX251bWJlcl90eXBlIGE7Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7Ci0gIGZsaXBfc2lnbiAoJmEpOwotICByZXR1cm4gcGFja19kICgmYSk7Ci19Ci0KLSNpZmRlZiBGTE9BVAotCi1TRnR5cGUKLV9fbWFrZV9mcChmcF9jbGFzc190eXBlIGNsYXNzLAotCSAgICAgdW5zaWduZWQgaW50IHNpZ24sCi0JICAgICBpbnQgZXhwLCAKLQkgICAgIFVTSXR5cGUgZnJhYykKLXsKLSAgZnBfbnVtYmVyX3R5cGUgaW47Ci0KLSAgaW4uY2xhc3MgPSBjbGFzczsKLSAgaW4uc2lnbiA9IHNpZ247Ci0gIGluLm5vcm1hbF9leHAgPSBleHA7Ci0gIGluLmZyYWN0aW9uLmxsID0gZnJhYzsKLSAgcmV0dXJuIHBhY2tfZCAoJmluKTsKLX0KLQotI2lmbmRlZiBGTE9BVF9PTkxZCi0KLS8qIFRoaXMgZW5hYmxlcyBvbmUgdG8gYnVpbGQgYW4gZnAgbGlicmFyeSB0aGF0IHN1cHBvcnRzIGZsb2F0IGJ1dCBub3QgZG91YmxlLgotICAgT3RoZXJ3aXNlLCB3ZSB3b3VsZCBnZXQgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBfX21ha2VfZHAuCi0gICBUaGlzIGlzIG5lZWRlZCBmb3Igc29tZSA4LWJpdCBwb3J0cyB0aGF0IGNhbid0IGhhbmRsZSB3ZWxsIHZhbHVlcyB0aGF0Ci0gICBhcmUgOC1ieXRlcyBpbiBzaXplLCBzbyB3ZSBqdXN0IGRvbid0IHN1cHBvcnQgZG91YmxlIGZvciB0aGVtIGF0IGFsbC4gICovCi0KLWV4dGVybiBERnR5cGUgX19tYWtlX2RwIChmcF9jbGFzc190eXBlLCB1bnNpZ25lZCBpbnQsIGludCwgVURJdHlwZSBmcmFjKTsKLQotREZ0eXBlCi1zZl90b19kZiAoU0Z0eXBlIGFyZ19hKQotewotICBmcF9udW1iZXJfdHlwZSBpbjsKLQotICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZpbik7Ci0gIHJldHVybiBfX21ha2VfZHAgKGluLmNsYXNzLCBpbi5zaWduLCBpbi5ub3JtYWxfZXhwLAotCQkgICAgKChVREl0eXBlKSBpbi5mcmFjdGlvbi5sbCkgPDwgRl9EX0JJVE9GRik7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRkxPQVQKLQotZXh0ZXJuIFNGdHlwZSBfX21ha2VfZnAgKGZwX2NsYXNzX3R5cGUsIHVuc2lnbmVkIGludCwgaW50LCBVU0l0eXBlKTsKLQotREZ0eXBlCi1fX21ha2VfZHAgKGZwX2NsYXNzX3R5cGUgY2xhc3MsIHVuc2lnbmVkIGludCBzaWduLCBpbnQgZXhwLCBVREl0eXBlIGZyYWMpCi17Ci0gIGZwX251bWJlcl90eXBlIGluOwotCi0gIGluLmNsYXNzID0gY2xhc3M7Ci0gIGluLnNpZ24gPSBzaWduOwotICBpbi5ub3JtYWxfZXhwID0gZXhwOwotICBpbi5mcmFjdGlvbi5sbCA9IGZyYWM7Ci0gIHJldHVybiBwYWNrX2QgKCZpbik7Ci19Ci0KLVNGdHlwZQotZGZfdG9fc2YgKERGdHlwZSBhcmdfYSkKLXsKLSAgZnBfbnVtYmVyX3R5cGUgaW47Ci0KLSAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmaW4pOwotICByZXR1cm4gX19tYWtlX2ZwIChpbi5jbGFzcywgaW4uc2lnbiwgaW4ubm9ybWFsX2V4cCwKLQkJICAgIGluLmZyYWN0aW9uLmxsID4+IEZfRF9CSVRPRkYpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZW11bF9idWdhcGkuYyBiL3NpbS9wcGMvZW11bF9idWdhcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwMjhiZi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2VtdWxfYnVnYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSAgICAqLwotCi0KLSNpZm5kZWYgX0VNVUxfQlVHQVBJX0NfCi0jZGVmaW5lIF9FTVVMX0JVR0FQSV9DXwotCi0vKiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgdmlhIGEgdGFibGUuICBUaGVyZSBpcyBubyBiZW5lZml0IGluCi0gICBtYWtpbmcgaXQgaW5saW5lICovCi0KLSNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJlbXVsX2J1Z2FwaS5oIgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0KLS8qIEVNVUxBVElPTgotCi0gICBCVUcgLSBNb3Rvcm9sYSdzIGVtYmVkZWQgZmlybXdhcmUgQlVHIGludGVyZmFjZQotCi0gICBERVNDUklQVElPTgotCi0gICAKLQotICAgKi8KLQotCi0vKiBmcm9tIFBvd2VyUENCdWcgRGVidWdnaW5nIFBhY2thZ2UgVXNlcidzIE1hbnVhbCwgcGFydCAyIG9mIDIgYW5kIGFsc28gYnVnLlMgLSBEYWxlIFJhaG4gKi8KLSNkZWZpbmUgX0lOQ0hSCQkweDAwMAkJLyogSW5wdXQgY2hhcmFjdGVyICovCi0jZGVmaW5lIF9JTlNUQVQJCTB4MDAxCQkvKiBJbnB1dCBzZXJpYWwgcG9ydCBzdGF0dXMgKi8KLSNkZWZpbmUgX0lOTE4JCTB4MDAyCQkvKiBJbnB1dCBsaW5lIChwb2ludGVyIC8gcG9pbnRlciBmb3JtYXQpICovCi0jZGVmaW5lIF9SRUFEU1RSCTB4MDAzCQkvKiBJbnB1dCBzdHJpbmcgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpICovCi0jZGVmaW5lIF9SRUFETE4JCTB4MDA0CQkvKiBJbnB1dCBsaW5lIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLwotI2RlZmluZSBfQ0hLQlJLCQkweDAwNQkJLyogQ2hlY2sgZm9yIGJyZWFrICovCi0jZGVmaW5lIF9EU0tSRAkJMHgwMTAJCS8qIERpc2sgcmVhZCAqLwotI2RlZmluZSBfRFNLV1IJCTB4MDExCQkvKiBEaXNrIHdyaXRlICovCi0jZGVmaW5lIF9EU0tDRklHCTB4MDEyCQkvKiBEaXNrIGNvbmZpZ3VyZSAqLwotI2RlZmluZSBfRFNLRk1UCQkweDAxNAkJLyogRGlzayBmb3JtYXQgKi8KLSNkZWZpbmUgX0RTS0NUUkwJMHgwMTUJCS8qIERpc2sgY29udHJvbCAqLwotI2RlZmluZSBfTkVUUkQJCTB4MDE4CQkvKiBSZWFkIGZyb20gaG9zdCAqLwotI2RlZmluZSBfTkVUV1IJCTB4MDE5CQkvKiBXcml0ZSB0byBob3N0ICovCi0jZGVmaW5lIF9ORVRDRklHCTB4MDFhCQkvKiBDb25maWd1cmUgbmV0d29yayBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIF9ORVRPUE4JCTB4MDFiCQkvKiBPcGVuIGZpbGUgZm9yIHJlYWRpbmcgKi8KLSNkZWZpbmUgX05FVEZSRAkJMHgwMWMJCS8qIFJldHJlaXZlIHNwZWNpZmllZCBmaWxlIGJsb2NrcyAqLwotI2RlZmluZSBfTkVUQ1RSTAkweDAxZAkJLyogSW1wbGVtZW50IHNwZWNpYWwgY29udHJvbCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgX09VVENIUgkJMHgwMjAJCS8qIE91dHB1dCBjaGFyYWN0ZXIgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KLSNkZWZpbmUgX09VVFNUUgkJMHgwMjEJCS8qIE91dHB1dCBzdHJpbmcgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KLSNkZWZpbmUgX09VVExOCQkweDAyMgkJLyogT3V0cHV0IGxpbmUgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KLSNkZWZpbmUgX1dSSVRFCQkweDAyMwkJLyogT3V0cHV0IHN0cmluZyAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkgKi8KLSNkZWZpbmUgX1dSSVRFTE4JMHgwMjQJCS8qIE91dHB1dCBsaW5lIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLwotI2RlZmluZSBfV1JJVERMTgkweDAyNQkJLyogT3V0cHV0IGxpbmUgd2l0aCBkYXRhIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLwotI2RlZmluZSBfUENSTEYJCTB4MDI2CQkvKiBPdXRwdXQgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKi8KLSNkZWZpbmUgX0VSQVNMTgkJMHgwMjcJCS8qIEVyYXNlIGxpbmUgKi8KLSNkZWZpbmUgX1dSSVRECQkweDAyOAkJLyogT3V0cHV0IHN0cmluZyB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpICovCi0jZGVmaW5lIF9TTkRCUksJCTB4MDI5CQkvKiBTZW5kIGJyZWFrICovCi0jZGVmaW5lIF9ERUxBWQkJMHgwNDMJCS8qIFRpbWVyIGRlbGF5ICovCi0jZGVmaW5lIF9SVENfVE0JCTB4MDUwCQkvKiBUaW1lIGluaXRpYWxpemF0aW9uIGZvciBSVEMgKi8KLSNkZWZpbmUgX1JUQ19EVAkJMHgwNTEJCS8qIERhdGUgaW5pdGlhbGl6YXRpb24gZm9yIFJUQyAqLwotI2RlZmluZSBfUlRDX0RTUAkweDA1MgkJLyogRGlzcGxheSBSVEMgdGltZSBhbmQgZGF0ZSAqLwotI2RlZmluZSBfUlRDX1JECQkweDA1MwkJLyogUmVhZCB0aGUgUlRDIHJlZ2lzdGVycyAqLwotI2RlZmluZSBfUkVESVIJCTB4MDYwCQkvKiBSZWRpcmVjdCBJL08gb2YgYSBzeXN0ZW0gY2FsbCBmdW5jdGlvbiAqLwotI2RlZmluZSBfUkVESVJfSQkweDA2MQkJLyogUmVkaXJlY3QgaW5wdXQgKi8KLSNkZWZpbmUgX1JFRElSX08JMHgwNjIJCS8qIFJlZGlyZWN0IG91dHB1dCAqLwotI2RlZmluZSBfUkVUVVJOCQkweDA2MwkJLyogUmV0dXJuIHRvIFBQQ2J1ZyAqLwotI2RlZmluZSBfQklOREVDCQkweDA2NAkJLyogQ29udmVydCBiaW5hcnkgdG8gYmluYXJ5IGNvZGVkIGRlY2ltYWwgKEJDRCkgKi8KLSNkZWZpbmUgX0NIQU5HRVYJMHgwNjcJCS8qIFBhcnNlIHZhbHVlICovCi0jZGVmaW5lIF9TVFJDTVAJCTB4MDY4CQkvKiBDb21wYXJlIHR3byBzdHJpbmdzIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLwotI2RlZmluZSBfTVVMVTMyCQkweDA2OQkJLyogTXVsdGlwbHkgdHdvIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyAqLwotI2RlZmluZSBfRElWVTMyCQkweDA2YQkJLyogRGl2aWRlIHR3byAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgKi8KLSNkZWZpbmUgX0NIS19TVU0JMHgwNmIJCS8qIEdlbmVyYXRlIGNoZWNrc3VtICovCi0jZGVmaW5lIF9CUkRfSUQJCTB4MDcwCQkvKiBSZXR1cm4gcG9pbnRlciB0byBib2FyZCBJRCBwYWNrZXQgKi8KLSNkZWZpbmUgX0VOVklST04JMHgwNzEJCS8qIEFjY2VzcyBib290IGVudmlyb25tZW50IHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgX0RJQUdGQ04JMHgwNzQJCS8qIERpYWdub3N0aWMgZnVuY3Rpb24ocykgKi8KLSNkZWZpbmUgX1NJT1BFUFMJMHgwOTAJCS8qIFJldHJpZXZlIFNDU0kgcG9pbnRlcnMgKi8KLSNkZWZpbmUgX0lPSU5RCQkweDEyMAkJLyogUG9ydCBpbnF1aXJlICovCi0jZGVmaW5lIF9JT0lORk9STQkweDEyNAkJLyogUG9ydCBpbmZvcm0gKi8KLSNkZWZpbmUgX0lPQ09ORklHCTB4MTI4CQkvKiBQb3J0IGNvbmZpZ3VyZSAqLwotI2RlZmluZSBfSU9ERUxFVEUJMHgxMmMJCS8qIFBvcnQgZGVsZXRlICovCi0jZGVmaW5lIF9TWU1CT0xUQQkweDEzMAkJLyogQXR0YWNoIHN5bWJvbCB0YWJsZSAqLwotI2RlZmluZSBfU1lNQk9MREEJMHgxMzEJCS8qIERldGFjaCBzeW1ib2wgdGFibGUgKi8KLQotc3RydWN0IGJ1Z19tYXAgewotICBpbnQgdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKmluZm87Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJ1Z19tYXAgYnVnX21hcHBpbmdbXSA9IHsKLSAgeyBfSU5DSFIsCSIuSU5DSFIgLS0gSW5wdXQgY2hhcmFjdGVyIiB9LAotICB7IF9JTlNUQVQsCSIuSU5TVEFUIC0tIElucHV0IHNlcmlhbCBwb3J0IHN0YXR1cyIgfSwKLSAgeyBfSU5MTiwJIi5JTkxOIC0tIElucHV0IGxpbmUgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkiIH0sCi0gIHsgX1JFQURTVFIsCSIuUkVBRFNUUiAtLSBJbnB1dCBzdHJpbmcgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAotICB7IF9SRUFETE4sCSIuUkVBRExOIC0tIElucHV0IGxpbmUgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAotICB7IF9DSEtCUkssCSIuQ0hLQlJLIC0tIENoZWNrIGZvciBicmVhayIgfSwKLSAgeyBfRFNLUkQsCSIuRFNLUkQgLS0gRGlzayByZWFkIiB9LAotICB7IF9EU0tXUiwJIi5EU0tXUiAtLSBEaXNrIHdyaXRlIiB9LAotICB7IF9EU0tDRklHLAkiLkRTS0NGSUcgLS0gRGlzayBjb25maWd1cmUiIH0sCi0gIHsgX0RTS0ZNVCwJIi5EU0tGTVQgLS0gRGlzayBmb3JtYXQiIH0sCi0gIHsgX0RTS0NUUkwsCSIuRFNLQ1RSTCAtLSBEaXNrIGNvbnRyb2wiIH0sCi0gIHsgX05FVFJELAkiLk5FVFJEIC0tIFJlYWQgZnJvbSBob3N0IiB9LAotICB7IF9ORVRXUiwJIi5ORVRXUiAtLSBXcml0ZSB0byBob3N0IiB9LAotICB7IF9ORVRDRklHLAkiLk5FVENGSUcgLS0gQ29uZmlndXJlIG5ldHdvcmsgcGFyYW1ldGVycyIgfSwKLSAgeyBfTkVUT1BOLAkiLk5FVE9QTiAtLSBPcGVuIGZpbGUgZm9yIHJlYWRpbmciIH0sCi0gIHsgX05FVEZSRCwJIi5ORVRGUkQgLS0gUmV0cmVpdmUgc3BlY2lmaWVkIGZpbGUgYmxvY2tzIiB9LAotICB7IF9ORVRDVFJMLAkiLk5FVENUUkwgLS0gSW1wbGVtZW50IHNwZWNpYWwgY29udHJvbCBmdW5jdGlvbnMiIH0sCi0gIHsgX09VVENIUiwJIi5PVVRDSFIgLS0gT3V0cHV0IGNoYXJhY3RlciIgfSwKLSAgeyBfT1VUU1RSLAkiLk9VVFNUUiAtLSBPdXRwdXQgc3RyaW5nIChwb2ludGVyIC8gcG9pbnRlciBmb3JtYXQpIiB9LAotICB7IF9PVVRMTiwJIi5PVVRMTiAtLSBPdXRwdXQgbGluZSAocG9pbnRlciAvIHBvaW50ZXIgZm9ybWF0KSIgfSwKLSAgeyBfV1JJVEUsCSIuV1JJVEUgLS0gT3V0cHV0IHN0cmluZyAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkiIH0sCi0gIHsgX1dSSVRFTE4sCSIuV1JJVEVMTiAtLSBPdXRwdXQgbGluZSAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkiIH0sCi0gIHsgX1dSSVRETE4sCSIuV1JJVERMTiAtLSBPdXRwdXQgbGluZSB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAotICB7IF9QQ1JMRiwJIi5QQ1JMRiAtLSBPdXRwdXQgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQiIH0sCi0gIHsgX0VSQVNMTiwJIi5FUkFTTE4gLS0gRXJhc2UgbGluZSIgfSwKLSAgeyBfV1JJVEQsCSIuV1JJVEQgLS0gT3V0cHV0IHN0cmluZyB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAotICB7IF9TTkRCUkssCSIuU05EQlJLIC0tIFNlbmQgYnJlYWsiIH0sCi0gIHsgX0RFTEFZLAkiLkRFTEFZIC0tIFRpbWVyIGRlbGF5IiB9LAotICB7IF9SVENfVE0sCSIuUlRDX1RNIC0tIFRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIFJUQyIgfSwKLSAgeyBfUlRDX0RULAkiLlJUQ19EVCAtLSBEYXRlIGluaXRpYWxpemF0aW9uIGZvciBSVEMiIH0sCi0gIHsgX1JUQ19EU1AsCSIuUlRDX0RTUCAtLSBEaXNwbGF5IFJUQyB0aW1lIGFuZCBkYXRlIiB9LAotICB7IF9SVENfUkQsCSIuUlRDX1JEIC0tIFJlYWQgdGhlIFJUQyByZWdpc3RlcnMiIH0sCi0gIHsgX1JFRElSLAkiLlJFRElSIC0tIFJlZGlyZWN0IEkvTyBvZiBhIHN5c3RlbSBjYWxsIGZ1bmN0aW9uIiB9LAotICB7IF9SRURJUiwJIi5SRURJUiAtLSBSZWRpcmVjdCBpbnB1dCIgfSwKLSAgeyBfUkVESVIsCSIuUkVESVIgLS0gUmVkaXJlY3Qgb3V0cHV0IiB9LAotICB7IF9SRVRVUk4sCSIuUkVUVVJOIC0tIFJldHVybiB0byBQUENidWciIH0sCi0gIHsgX0JJTkRFQywJIi5CSU5ERUMgLS0gQ29udmVydCBiaW5hcnkgdG8gYmluYXJ5IGNvZGVkIGRlY2ltYWwgKEJDRCkiIH0sCi0gIHsgX0NIQU5HRVYsCSIuQ0hBTkdFViAtLSBQYXJzZSB2YWx1ZSIgfSwKLSAgeyBfU1RSQ01QLAkiLlNUUkNNUCAtLSBDb21wYXJlIHR3byBzdHJpbmdzIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSIgfSwKLSAgeyBfTVVMVTMyLAkiLk1VTFUzMiAtLSBNdWx0aXBseSB0d28gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIiB9LAotICB7IF9ESVZVMzIsCSIuRElWVTMyIC0tIERpdmlkZSB0d28gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIiB9LAotICB7IF9DSEtfU1VNLAkiLkNIS19TVU0gLS0gR2VuZXJhdGUgY2hlY2tzdW0iIH0sCi0gIHsgX0JSRF9JRCwJIi5CUkRfSUQgLS0gUmV0dXJuIHBvaW50ZXIgdG8gYm9hcmQgSUQgcGFja2V0IiB9LAotICB7IF9FTlZJUk9OLAkiLkVOVklST04gLS0gQWNjZXNzIGJvb3QgZW52aXJvbm1lbnQgcGFyYW1ldGVycyIgfSwKLSAgeyBfRElBR0ZDTiwJIi5ESUFHRkNOIC0tIERpYWdub3N0aWMgZnVuY3Rpb24ocykiIH0sCi0gIHsgX1NJT1BFUFMsCSIuU0lPUEVQUyAtLSBSZXRyaWV2ZSBTQ1NJIHBvaW50ZXJzIiB9LAotICB7IF9JT0lOUSwJIi5JT0lOUSAtLSBQb3J0IGlucXVpcmUiIH0sCi0gIHsgX0lPSU5GT1JNLAkiLklPSU5GT1JNIC0tIFBvcnQgaW5mb3JtIiB9LAotICB7IF9JT0NPTkZJRywJIi5JT0NPTkZJRyAtLSBQb3J0IGNvbmZpZ3VyZSIgfSwKLSAgeyBfSU9ERUxFVEUsCSIuSU9ERUxFVEUgLS0gUG9ydCBkZWxldGUiIH0sCi0gIHsgX1NZTUJPTFRBLAkiLlNZTUJPTFRBIC0tIEF0dGFjaCBzeW1ib2wgdGFibGUiIH0sCi0gIHsgX1NZTUJPTERBLAkiLlNZTUJPTERBIC0tIERldGFjaCBzeW1ib2wgdGFibGUiIH0sCi19OwotCi0jaWZuZGVmIEJVR0FQSV9FTkRfQUREUkVTUwotI2RlZmluZSBCVUdBUElfRU5EX0FERFJFU1MgMHgxMDAwMDAKLSNlbmRpZgotCi1lbnVtIHsKLSAgbnJfYnVnYXBpX2Rpc2tzID0gMiwKLX07Ci0KLQotc3RydWN0IF9vc19lbXVsX2RhdGEgewotICBkZXZpY2UgKnJvb3Q7Ci0gIHVuc2lnbmVkX3dvcmQgbWVtb3J5X3NpemU7Ci0gIHVuc2lnbmVkX3dvcmQgdG9wX29mX3N0YWNrOwotICBpbnQgaW50ZXJydXB0X3ByZWZpeDsKLSAgdW5zaWduZWRfd29yZCBpbnRlcnJ1cHRfdmVjdG9yX2FkZHJlc3M7Ci0gIHVuc2lnbmVkX3dvcmQgc3lzdGVtX2NhbGxfYWRkcmVzczsKLSAgdW5zaWduZWRfd29yZCBzdGFsbF9jcHVfbG9vcF9hZGRyZXNzOwotICBpbnQgbGl0dGxlX2VuZGlhbjsKLSAgaW50IGZsb2F0aW5nX3BvaW50X2F2YWlsYWJsZTsKLSAgLyogSS9PIGRldmljZXMgKi8KLSAgZGV2aWNlX2luc3RhbmNlICpvdXRwdXQ7Ci0gIGRldmljZV9pbnN0YW5jZSAqaW5wdXQ7Ci0gIGRldmljZV9pbnN0YW5jZSAqKGRpc2tbbnJfYnVnYXBpX2Rpc2tzXSk7Ci19OwotCi0KLXN0YXRpYyBvc19lbXVsX2RhdGEgKgotZW11bF9idWdhcGlfY3JlYXRlKGRldmljZSAqcm9vdCwKLQkJICAgYmZkICppbWFnZSwKLQkJICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgZGV2aWNlICpub2RlOwotICBvc19lbXVsX2RhdGEgKmJ1Z2FwaTsKLQotICAvKiBjaGVjayBpdCByZWFsbHkgaXMgZm9yIHVzICovCi0gIGlmIChuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcChuYW1lLCAiYnVnYXBpIikgIT0gMAotICAgICAgJiYgc3RyY21wKG5hbWUsICJidWciKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoaW1hZ2UgIT0gTlVMTAotICAgICAgJiYgbmFtZSA9PSBOVUxMCi0gICAgICAmJiBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoaW1hZ2UpID49IEJVR0FQSV9FTkRfQUREUkVTUykKLSAgICByZXR1cm4gTlVMTDsKLQotICBidWdhcGkgPSBaQUxMT0Mob3NfZW11bF9kYXRhKTsKLQotICAvKiBvcHRpb25zICovCi0gIGVtdWxfYWRkX3RyZWVfb3B0aW9ucyhyb290LCBpbWFnZSwgImJ1ZyIsICJvZWEiLAotCQkJMSAvKm9lYS1pbnRlcnJ1cHQtcHJlZml4Ki8pOwotCi0gIC8qIGFkZCBzb21lIHJlYWwgaGFyZHdhcmUsIGluY2x1ZGUgZWVwcm9tIG1lbW9yeSBmb3IgdGhlIGVlcHJvbSB0cmFwCi0gICAgIGFkZHJlc3NlcyAqLwotICBlbXVsX2FkZF90cmVlX2hhcmR3YXJlKHJvb3QpOwotICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL21lbW9yeUAweGZmZjAwMDAwIik7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImVlcHJvbSB0cmFwIGFkZHJlc3NlcyIpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlZyAweGZmZjAwMDAwIDB4MzAwMCIpOwotCi0gIGJ1Z2FwaS0+cm9vdCA9IHJvb3Q7Ci0KLSAgYnVnYXBpLT5tZW1vcnlfc2l6ZQotICAgID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSIpOwotICBidWdhcGktPmludGVycnVwdF9wcmVmaXggPQotICAgIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vZWEtaW50ZXJydXB0LXByZWZpeCIpOwotICBidWdhcGktPmludGVycnVwdF92ZWN0b3JfYWRkcmVzcyA9IChidWdhcGktPmludGVycnVwdF9wcmVmaXgKLQkJCQkgICAgICA/IE1BU0soMCwgNDMpCi0JCQkJICAgICAgOiAwKTsKLSAgYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzID0gKGJ1Z2FwaS0+aW50ZXJydXB0X3ZlY3Rvcl9hZGRyZXNzICsgMHgwMGMwMCk7Ci0gIGJ1Z2FwaS0+c3RhbGxfY3B1X2xvb3BfYWRkcmVzcyA9IChidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MgKyAweDAwMGYwKTsKLSAgYnVnYXBpLT50b3Bfb2Zfc3RhY2sgPSBidWdhcGktPm1lbW9yeV9zaXplIC0gMHgxMDAwOwotICBidWdhcGktPmxpdHRsZV9lbmRpYW4KLSAgICA9IHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyIpOwotICBidWdhcGktPmZsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQotICAgID0gdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL2Zsb2F0aW5nLXBvaW50PyIpOwotICBidWdhcGktPmlucHV0ID0gTlVMTDsKLSAgYnVnYXBpLT5vdXRwdXQgPSBOVUxMOwotCi0gIC8qIGluaXRpYWxpemF0aW9uICovCi0gIGlmIChpbWFnZSAhPSBOVUxMKQotICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyLzAucGMgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyliZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoaW1hZ2UpKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpYnVnYXBpLT5zdGFsbF9jcHVfbG9vcF9hZGRyZXNzKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvc3AgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpKGJ1Z2FwaS0+dG9wX29mX3N0YWNrIC0gMTYpKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvbXNyIDB4JXgiLAotCSAgICAgKG1zcl9yZWNvdmVyYWJsZV9pbnRlcnJ1cHQKLQkgICAgICB8IChidWdhcGktPmxpdHRsZV9lbmRpYW4KLQkJID8gKG1zcl9saXR0bGVfZW5kaWFuX21vZGUKLQkJICAgIHwgbXNyX2ludGVycnVwdF9saXR0bGVfZW5kaWFuX21vZGUpCi0JCSA6IDApCi0JICAgICAgfCAoYnVnYXBpLT5mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKLQkJID8gbXNyX2Zsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQotCQkgOiAwKQotCSAgICAgIHwgKGJ1Z2FwaS0+aW50ZXJydXB0X3ByZWZpeAotCQkgPyBtc3JfaW50ZXJydXB0X3ByZWZpeAotCQkgOiAwKQotCSAgICAgICkpOwotCi0gIC8qIHBhdGNoIHRoZSBzeXN0ZW0gY2FsbCBpbnN0cnVjdGlvbiB0byBjYWxsIHRoaXMgZW11bGF0aW9uIGFuZCB0aGVuCi0gICAgIGRvIGFuIHJmaSAqLwotICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCi0JCSAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJzeXN0ZW0tY2FsbCB0cmFwIGluc3RydWN0aW9uIik7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWJ1Z2FwaS0+c3lzdGVtX2NhbGxfYWRkcmVzcyk7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCV4IiwgZW11bF9jYWxsX2luc3RydWN0aW9uKTsKLSAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2RhdGFAMHglbHgiLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzICsgNCk7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcInJldHVybiBmcm9tIGludGVycnVwdCBpbnN0cnVjdGlvbiIpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MgKyA0KTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JXgiLAotCSAgICAgZW11bF9yZmlfaW5zdHJ1Y3Rpb24pOwotCi0gIC8qIHBhdGNoIHRoZSBlbmQgb2YgdGhlIHN5c3RlbSBjYWxsIGluc3RydWN0aW9uIHNvIHRoYXQgaXQgY29udGFpbnMKLSAgICAgYSBsb29wIHRvIHNlbGYgaW5zdHJ1Y3Rpb24gYW5kIHBvaW50IGFsbCB0aGUgY3B1J3MgYXQgdGhpcyAqLwotICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCi0JCSAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN0YWxsX2NwdV9sb29wX2FkZHJlc3MpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJjcHUtbG9vcCBpbnN0cnVjdGlvbiIpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN0YWxsX2NwdV9sb29wX2FkZHJlc3MpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL2RhdGEgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9sb29wX2luc3RydWN0aW9uKTsKLQotICBpZiAoaW1hZ2UgIT0gTlVMTCkKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9zdGFjay9zdGFjay10eXBlICVzIiwKLQkgICAgICAgKGltYWdlLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJPyAicHBjLWVsZiIKLQkJOiAicHBjLXhjb2ZmIikpOwotCi0gIGlmIChpbWFnZSAhPSBOVUxMKQotICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2xvYWQtYmluYXJ5L2ZpbGUtbmFtZSBcIiVzIiwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZShpbWFnZSkpOwotCi0gIHJldHVybiBidWdhcGk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbXVsX2J1Z2FwaV9pbml0KG9zX2VtdWxfZGF0YSAqYnVnYXBpLAotCQkgaW50IG5yX2NwdXMpCi17Ci0gIGludCBpOwotICAvKiBnZXQgdGhlIGN1cnJlbnQgaW5wdXQvb3V0cHV0IGRldmljZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nCi0gICAgIGRldmljZSB0cmVlIGluaXRpYWxpemF0aW9uICovCi0gIGJ1Z2FwaS0+aW5wdXQgPSB0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShidWdhcGktPnJvb3QsICIvY2hvc2VuL3N0ZGluIik7Ci0gIGJ1Z2FwaS0+b3V0cHV0ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkoYnVnYXBpLT5yb290LCAiL2Nob3Nlbi9zdGRvdXQiKTsKLSAgLyogaWYgcHJlc2VudCwgZXh0cmFjdCB0aGUgc2VsZWN0ZWQgZGlzayBkZXZpY2VzICovCi0gIGZvciAoaSA9IDA7IGkgPCBucl9idWdhcGlfZGlza3M7IGkrKykgewotICAgIGNoYXIgZGlza1szMl07Ci0gICAgY2hhciAqY2hwOwotICAgIHN0cmNweShkaXNrLCAiL2Nob3Nlbi9kaXNrMCIpOwotICAgIEFTU0VSVChzaXplb2YoZGlzaykgPiBzdHJsZW4oZGlzaykpOwotICAgIGNocCA9IHN0cmNocihkaXNrLCAnMCcpOwotICAgICpjaHAgPSAqY2hwICsgaTsKLSAgICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KGJ1Z2FwaS0+cm9vdCwgZGlzaykgIT0gTlVMTCkKLSAgICAgIGJ1Z2FwaS0+ZGlza1tpXSA9IHRyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5KGJ1Z2FwaS0+cm9vdCwgZGlzayk7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fbmFtZShpbnQgY2FsbF9pZCkKLXsKLSAgc3RhdGljIGNoYXIgYnVmZmVyWzQwXTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYnVnX21hcHBpbmcpIC8gc2l6ZW9mIChidWdfbWFwcGluZ1swXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYnVnX21hcHBpbmdbaV0udmFsdWUgPT0gY2FsbF9pZCkKLQlyZXR1cm4gYnVnX21hcHBpbmdbaV0uaW5mbzsKLSAgICB9Ci0KLSAgKHZvaWQpIHNwcmludGYgKGJ1ZmZlciwgIlVua25vd24gYnVnIGNhbGwgMHgleCIsIGNhbGxfaWQpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgaW50Ci1lbXVsX2J1Z2FwaV9kb19yZWFkKG9zX2VtdWxfZGF0YSAqYnVnYXBpLAotCQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICB1bnNpZ25lZF93b3JkIGNpYSwKLQkJICAgIHVuc2lnbmVkX3dvcmQgYnVmLAotCQkgICAgaW50IG5ieXRlcykKLXsKLSAgdW5zaWduZWQgY2hhciAqc2NyYXRjaF9idWZmZXI7Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KLSAgc2NyYXRjaF9idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSB6YWxsb2MobmJ5dGVzKTsKLQotICAvKiBjaGVjayBpZiBidWZmZXIgZXhpc3RzIGJ5IHJlYWRpbmcgaXQgKi8KLSAgZW11bF9yZWFkX2J1ZmZlcigodm9pZCAqKXNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywgcHJvY2Vzc29yLCBjaWEpOwotCi0gIC8qIHJlYWQgKi8KLSAgc3RhdHVzID0gZGV2aWNlX2luc3RhbmNlX3JlYWQoYnVnYXBpLT5pbnB1dCwKLQkJCQkodm9pZCAqKXNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOwotCi0gIC8qIC0xID0gZXJyb3IsIC0yID0gbm90aGluZyBhdmFpbGFibGUgLSBzZWUgInNlcmlhbCIgW0lFRUUxMjc1XSAqLwotICBpZiAoc3RhdHVzIDwgMCkgewotICAgIHN0YXR1cyA9IDA7Ci0gIH0KLQotICBpZiAoc3RhdHVzID4gMCkgewotICAgIGVtdWxfd3JpdGVfYnVmZmVyKCh2b2lkICopc2NyYXRjaF9idWZmZXIsIGJ1Ziwgc3RhdHVzLCBwcm9jZXNzb3IsIGNpYSk7Ci0KLSAgICAvKiBCdWdhcGkgY2hvcHMgb2ZmIHRoZSB0cmFpbGluZyBuLCBidXQgbGVhdmVzIGl0IGluIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoc2NyYXRjaF9idWZmZXJbc3RhdHVzLTFdID09ICdcbicgfHwgc2NyYXRjaF9idWZmZXJbc3RhdHVzLTFdID09ICdccicpCi0gICAgICBzdGF0dXMtLTsKLSAgfQotCi0gIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQKLWVtdWxfYnVnYXBpX2RvX2Rpc2tpbyhvc19lbXVsX2RhdGEgKmJ1Z2FwaSwKLQkJICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGRlc2NyaXB0b3JfYWRkciwKLQkJICAgICAgaW50IGNhbGxfaWQpCi17Ci0gIHN0cnVjdCBkc2tpb19kZXNjcmlwdG9yIHsKLSAgICB1bnNpZ25lZF8xIGN0cmxfbHVuOwotICAgIHVuc2lnbmVkXzEgZGV2X2x1bjsKLSAgICB1bnNpZ25lZF8yIHN0YXR1czsKLSAgICB1bnNpZ25lZF93b3JkIHBidWZmZXI7Ci0gICAgdW5zaWduZWRfNCBibGtfbnVtOwotICAgIHVuc2lnbmVkXzIgYmxrX2NudDsKLSAgICB1bnNpZ25lZF8xIGZsYWc7Ci0jZGVmaW5lIEJVR19GSUxFX01BUksJIDB4ODAKLSNkZWZpbmUgSUdOT1JFX0ZJTEVOVU0JIDB4MDIKLSNkZWZpbmUgRU5EX09GX0ZJTEUJIDB4MDEKLSAgICB1bnNpZ25lZF8xIGFkZHJfbW9kOwotICB9IGRlc2NyaXB0b3I7Ci0gIGludCBibG9jazsKLSAgZW11bF9yZWFkX2J1ZmZlcigmZGVzY3JpcHRvciwgZGVzY3JpcHRvcl9hZGRyLCBzaXplb2YoZGVzY3JpcHRvciksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgVDJIKGRlc2NyaXB0b3IuY3RybF9sdW4pOwotICBUMkgoZGVzY3JpcHRvci5kZXZfbHVuKTsKLSAgVDJIKGRlc2NyaXB0b3Iuc3RhdHVzKTsKLSAgVDJIKGRlc2NyaXB0b3IucGJ1ZmZlcik7Ci0gIFQySChkZXNjcmlwdG9yLmJsa19udW0pOwotICBUMkgoZGVzY3JpcHRvci5ibGtfY250KTsKLSAgVDJIKGRlc2NyaXB0b3IuZmxhZyk7Ci0gIFQySChkZXNjcmlwdG9yLmFkZHJfbW9kKTsKLSAgaWYgKGRlc2NyaXB0b3IuZGV2X2x1biA+PSBucl9idWdhcGlfZGlza3MKLSAgICAgIHx8IGJ1Z2FwaS0+ZGlza1tkZXNjcmlwdG9yLmRldl9sdW5dID09IE5VTEwpIHsKLSAgICBlcnJvcigiZW11bF9idWdhcGlfZG9fZGlza2lvOiBhdHRlbXB0IHRvIGFjY2VzcyB1bmNvbmZpZ3VyZWQgZGlzayAvY2hvc2VuL2Rpc2slZCIsCi0JICBkZXNjcmlwdG9yLmRldl9sdW4pOwotICB9Ci0gIGVsc2UgewotICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IGRlc2NyaXB0b3IuYmxrX2NudDsgYmxvY2srKykgewotICAgICAgZGV2aWNlX2luc3RhbmNlICpkaXNrID0gYnVnYXBpLT5kaXNrW2Rlc2NyaXB0b3IuZGV2X2x1bl07Ci0gICAgICB1bnNpZ25lZF8xIGJ1Zls1MTJdOyAvKj8/Pz8qLwotICAgICAgdW5zaWduZWRfd29yZCBibG9ja19uciA9IGRlc2NyaXB0b3IuYmxrX251bSArIGJsb2NrOwotICAgICAgdW5zaWduZWRfd29yZCBieXRlX25yID0gYmxvY2tfbnIgKiBzaXplb2YoYnVmKTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgYmxvY2tfYWRkciA9IGRlc2NyaXB0b3IucGJ1ZmZlciArIGJsb2NrKnNpemVvZihidWYpOwotICAgICAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKGRpc2ssIDAsIGJ5dGVfbnIpIDwgMCkKLQllcnJvcigiZW11bF9idWdhcGlfZG9fZGlza2lvOiBiYWQgc2Vla1xuIik7Ci0gICAgICBzd2l0Y2ggKGNhbGxfaWQpIHsKLSAgICAgIGNhc2UgX0RTS1JEOgotCWlmIChkZXZpY2VfaW5zdGFuY2VfcmVhZChkaXNrLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkKLQkgIGVycm9yKCJlbXVsX2BidWdhcGlfZG9fZGlza2lvOiBiYWQgcmVhZFxuIik7Ci0JZW11bF93cml0ZV9idWZmZXIoYnVmLCBibG9ja19hZGRyLCBzaXplb2YoYnVmKSwgcHJvY2Vzc29yLCBjaWEpOwotCWJyZWFrOwotICAgICAgY2FzZSBfRFNLV1I6Ci0JZW11bF9yZWFkX2J1ZmZlcihidWYsIGJsb2NrX2FkZHIsIHNpemVvZihidWYpLCBwcm9jZXNzb3IsIGNpYSk7Ci0JaWYgKGRldmljZV9pbnN0YW5jZV93cml0ZShkaXNrLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkKLQkgIGVycm9yKCJlbXVsX2J1Z2FwaV9kb19kaXNraW86IGJhZCB3cml0ZVxuIik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWVycm9yKCJlbXVsX2J1Z2FwaV9kb19kaXNraW86IGJhZCBzd2l0Y2hcbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZAotZW11bF9idWdhcGlfZG9fd3JpdGUob3NfZW11bF9kYXRhICpidWdhcGksCi0JCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JCSAgICAgdW5zaWduZWRfd29yZCBidWYsCi0JCSAgICAgaW50IG5ieXRlcywKLQkJICAgICBjb25zdCBjaGFyICpzdWZmaXgpCi17Ci0gIHZvaWQgKnNjcmF0Y2hfYnVmZmVyID0gTlVMTDsKLQotICAvKiBnZXQgYSB0ZW1wb2FyeSBidWZlciAqLwotICBpZiAobmJ5dGVzID4gMCkKLSAgICB7Ci0gICAgICBzY3JhdGNoX2J1ZmZlciA9IHphbGxvYyhuYnl0ZXMpOwotCi0gICAgICAvKiBjb3B5IGluICovCi0gICAgICBlbXVsX3JlYWRfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLQotICAgICAgLyogd3JpdGUgKi8KLSAgICAgIGRldmljZV9pbnN0YW5jZV93cml0ZShidWdhcGktPm91dHB1dCwgc2NyYXRjaF9idWZmZXIsIG5ieXRlcyk7Ci0KLSAgICAgIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKLSAgICB9Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBkZXZpY2VfaW5zdGFuY2Vfd3JpdGUoYnVnYXBpLT5vdXRwdXQsIHN1ZmZpeCwgc3RybGVuKHN1ZmZpeCkpOwotCi0gIGZsdXNoX3N0ZG91dHB1dCAoKTsKLX0KLQotc3RhdGljIGludAotZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbChjcHUgKnByb2Nlc3NvciwKLQkJCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JCQkgICAgIHVuc2lnbmVkX3dvcmQgcmEsCi0JCQkgICAgIG9zX2VtdWxfZGF0YSAqYnVnYXBpKQotewotICBjb25zdCBpbnQgY2FsbF9pZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzEwXTsKLSAgdW5zaWduZWQgY2hhciB1YzsKLQotI2RlZmluZSBNWV9JTkRFWCBpdGFibGVfaW5zdHJ1Y3Rpb25fY2FsbAotICBJVFJBQ0UgKHRyYWNlX29zX2VtdWwsCi0JICAoIiAweCV4ICVzLCByMyA9IDB4JWx4LCByNCA9IDB4JWx4XG4iLAotCSAgIGNhbGxfaWQsIGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX25hbWUgKGNhbGxfaWQpLAotCSAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdLAotCSAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzRdKSk7OwotCi0gIC8qIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBpbnZhbGlkIGluc3RydWN0aW9uICovCi0gIGlmIChjaWEgIT0gYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzKQotICAgIHJldHVybiAwOwotCi0gIHN3aXRjaCAoY2FsbF9pZCkgewotICBkZWZhdWx0OgotICAgIGVycm9yKCJlbXVsLWJ1Z2FwaTogdW5pbXBsZW1lbnRlZCBidWdhcGkgJXMgZnJvbSBhZGRyZXNzIDB4JWx4XG4iLAotCSAgZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fbmFtZSAoY2FsbF9pZCksIFNSUjApOwotICAgIGJyZWFrOwotCi0gIC8qIHJlYWQgYSBzaW5nbGUgY2hhcmFjdGVyLCBvdXRwdXQgcjMgPSBieXRlICovCi0gIC8qIEZJWE1FOiBBZGQgc3VwcG9ydCB0byB1bmJ1ZmZlciBpbnB1dCAqLwotICBjYXNlIF9JTkNIUjoKLSAgICBpZiAoZGV2aWNlX2luc3RhbmNlX3JlYWQoYnVnYXBpLT5pbnB1dCwgKHZvaWQgKikmdWMsIDEpIDw9IDApCi0gICAgICB1YyA9IDA7Ci0gICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSB1YzsKLSAgICBicmVhazsKLQotICAvKiByZWFkIGEgbGluZSBvZiBhdCBtb3N0IDI1NiBieXRlcywgcjMgPSBwdHIgdG8gMXN0IGJ5dGUsIG91dHB1dCByMyA9IHB0ciB0byBsYXN0IGJ5dGUrMSAgKi8KLSAgY2FzZSBfSU5MTjoKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSArPSBlbXVsX2J1Z2FwaV9kb19yZWFkKGJ1Z2FwaSwKLQkJCQkJCQkgICAgcHJvY2Vzc29yLCBjaWEsCi0JCQkJCQkJICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdLAotCQkJCQkJCSAgICAyNTYpOwotICAgIGJyZWFrOwotCi0gIC8qIG91dHB1dCBhIGNoYXJhY3RlciwgcjMgPSBjaGFyYWN0ZXIgKi8KLSAgY2FzZSBfT1VUQ0hSOgotICAgIHsKLSAgICAgIGNoYXIgb3V0ID0gKGNoYXIpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM107Ci0gICAgICBkZXZpY2VfaW5zdGFuY2Vfd3JpdGUoYnVnYXBpLT5vdXRwdXQsICZvdXQsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIG91dHB1dCBhIHN0cmluZywgcjMgPSBwdHIgdG8gMXN0IGJ5dGUsIHI0ID0gcHRyIHRvIGxhc3QgYnl0ZSsxICovCi0gIGNhc2UgX09VVFNUUjoKLSAgICBlbXVsX2J1Z2FwaV9kb193cml0ZShidWdhcGksCi0JCQkgcHJvY2Vzc29yLCBjaWEsCi0JCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCi0JCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbNF0gLSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSwKLQkJCSAoY29uc3QgY2hhciAqKTApOwotICAgIGJyZWFrOwotCi0gIC8qIG91dHB1dCBhIHN0cmluZyBmb2xsb3dlZCBieSBcclxuLCByMyA9IHB0ciB0byAxc3QgYnl0ZSwgcjQgPSBwdHIgdG8gbGFzdCBieXRlKzEgKi8KLSAgY2FzZSBfT1VUTE46Ci0KLSAgICBlbXVsX2J1Z2FwaV9kb193cml0ZShidWdhcGksCi0JCQkgcHJvY2Vzc29yLCBjaWEsCi0JCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCi0JCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbNF0gLSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSwKLQkJCSAiXG4iKTsKLSAgICBicmVhazsKLQotICAvKiBvdXRwdXQgYSBcclxuICovCi0gIGNhc2UgX1BDUkxGOgotICAgIGRldmljZV9pbnN0YW5jZV93cml0ZShidWdhcGktPm91dHB1dCwgIlxuIiwgMSk7Ci0gICAgYnJlYWs7Ci0KLSAgLyogcmVhZC93cml0ZSBibG9ja3Mgb2YgZGF0YSB0by9mcm9tIHRoZSBkaXNrICovCi0gIGNhc2UgX0RTS1dSOgotICBjYXNlIF9EU0tSRDoKLSAgICBlbXVsX2J1Z2FwaV9kb19kaXNraW8oYnVnYXBpLCBwcm9jZXNzb3IsIGNpYSwKLQkJCSAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCi0JCQkgIGNhbGxfaWQpOwotICAgIGJyZWFrOwotCi0gIC8qIHJldHVybiB0byBwcGNidWcgbW9uaXRvciAoZXhpdGluZyB3aXRoIGdwclszXSBhcyBzdGF0dXMgaXMgbm90Ci0gICAgIHBhcnQgb2YgdGhlIGJ1ZyBtb25pdG9yKSAqLwotICBjYXNlIF9SRVRVUk46Ci0gICAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gMTsKLSAgLyogdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGlzIG9uZSBpcyBhIFJGSS4gIFRodXMgYnkganVzdAotICAgICBjb250aW51aW5nIHRoZSByZXR1cm4gZnJvbSBzeXN0ZW0gY2FsbCBpcyBwZXJmb3JtZWQgKi8KLX0KLQotY29uc3Qgb3NfZW11bCBlbXVsX2J1Z2FwaSA9IHsKLSAgImJ1Z2FwaSIsCi0gIGVtdWxfYnVnYXBpX2NyZWF0ZSwKLSAgZW11bF9idWdhcGlfaW5pdCwKLSAgMCwgLypzeXN0ZW1fY2FsbCovCi0gIGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwsCi0gIDAgLypkYXRhKi8KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX2J1Z2FwaS5oIGIvc2ltL3BwYy9lbXVsX2J1Z2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNlMzgzLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZW11bF9idWdhcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0VNVUxfQlVHQVBJX0hfCi0jZGVmaW5lIF9FTVVMX0JVR0FQSV9IXwotCi1leHRlcm4gY29uc3Qgb3NfZW11bCBlbXVsX2J1Z2FwaTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfY2hpcnAuYyBiL3NpbS9wcGMvZW11bF9jaGlycC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWJiODljLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZW11bF9jaGlycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxMCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgICovCi0KLQotI2lmbmRlZiBfRU1VTF9DSElSUF9DXwotI2RlZmluZSBfRU1VTF9DSElSUF9DXwotCi0vKiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgdmlhIGEgdGFibGUuICBUaGVyZSBpcyBubyBiZW5lZml0IGluCi0gICBtYWtpbmcgaXQgaW5saW5lICovCi0KLSNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJlbXVsX2NoaXJwLmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkVfRU1VTF9DSElSUAotI2RlZmluZSBTVEFUSUNfSU5MSU5FX0VNVUxfQ0hJUlAgU1RBVElDX0lOTElORQotI2VuZGlmCi0KLQotLyogRU1VTEFUSU9OCi0KLQotICAgT3BlbkZpcm13YXJlIC0gSUVFRSBTdGFuZGFyZCBmb3IgQm9vdCAoSW5pdGlhbGl6YXRpb24KLSAgIENvbmZpZ3VyYXRpb24pIEZpcm13YXJlLgotCi0KLSAgIERFU0NSSVBUSU9OCi0KLQotICAgQlVHUwotCi0gICAKLSAgIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG1lbW9yeSBub2RlIGhhcyAjYWRkcmVzcy1jZWxscyBhbmQKLSAgICNzaXplLWNlbGxzIHNldCB0byBvbmUuICBGb3IgZnV0dXJlIGltcGxlbWVudGF0aW9ucywgdGhpcyBtYXkgbm90Ci0gICBiZSB0aGUgY2FzZS4KLQotICAgKi8KLQotCi0KLQotLyogRGVzY3JpcHRvciBvZiB0aGUgb3BlbiBib290IHNlcnZpY2VzIGJlaW5nIGVtdWxhdGVkICovCi0KLXR5cGVkZWYgaW50IChjaGlycF9oYW5kbGVyKQotICAgICAob3NfZW11bF9kYXRhICpkYXRhLAotICAgICAgY3B1ICpwcm9jZXNzb3IsCi0gICAgICB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLXR5cGVkZWYgc3RydWN0IF9jaGlycF9zZXJ2aWNlcyB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoaXJwX2hhbmRsZXIgKmhhbmRsZXI7Ci19IGNoaXJwX3NlcnZpY2VzOwotCi0KLS8qIFRoZSBPcGVuQm9vdCBlbXVsYXRpb24gaXMsIGF0IGFueSB0aW1lIGVpdGhlciB3YWl0aW5nIGZvciBhIGNsaWVudAotICAgcmVxdWVzdCBvciB3YWl0aW5nIG9uIGEgY2xpZW50IGNhbGxiYWNrICovCi10eXBlZGVmIGVudW0gewotICBzZXJ2aW5nLAotICBlbXVsYXRpbmcsCi0gIGZhdWx0aW5nLAotfSBjaGlycF9lbXVsX3N0YXRlOwotCi1zdHJ1Y3QgX29zX2VtdWxfZGF0YSB7Ci0gIGNoaXJwX2VtdWxfc3RhdGUgc3RhdGU7Ci0gIHVuc2lnbmVkX3dvcmQgcmV0dXJuX2FkZHJlc3M7Ci0gIHVuc2lnbmVkX3dvcmQgYXJndW1lbnRzOwotICB1bnNpZ25lZF93b3JkIG5fYXJnczsKLSAgdW5zaWduZWRfd29yZCBuX3JldHVybnM7Ci0gIGNoaXJwX3NlcnZpY2VzICpzZXJ2aWNlOwotICBkZXZpY2UgKnJvb3Q7Ci0gIGNoaXJwX3NlcnZpY2VzICpzZXJ2aWNlczsKLSAgLyogY29uZmlndXJhdGlvbiAqLwotICB1bnNpZ25lZF93b3JkIG1lbW9yeV9zaXplOwotICB1bnNpZ25lZF93b3JkIHJlYWxfYmFzZTsKLSAgdW5zaWduZWRfd29yZCByZWFsX3NpemU7Ci0gIHVuc2lnbmVkX3dvcmQgdmlydF9iYXNlOwotICB1bnNpZ25lZF93b3JkIHZpcnRfc2l6ZTsKLSAgaW50IHJlYWxfbW9kZTsKLSAgaW50IGxpdHRsZV9lbmRpYW47Ci0gIGludCBmbG9hdGluZ19wb2ludF9hdmFpbGFibGU7Ci0gIGludCBpbnRlcnJ1cHRfcHJlZml4OwotICB1bnNpZ25lZF93b3JkIGxvYWRfYmFzZTsKLSAgLyogaGFzaCB0YWJsZSAqLwotICB1bnNpZ25lZF93b3JkIG5yX3BhZ2VfdGFibGVfZW50cnlfZ3JvdXBzOwotICB1bnNpZ25lZF93b3JkIGh0YWJfb2Zmc2V0OwotICB1bnNpZ25lZF93b3JkIGh0YWJfcmE7Ci0gIHVuc2lnbmVkX3dvcmQgaHRhYl92YTsKLSAgdW5zaWduZWRfd29yZCBzaXplb2ZfaHRhYjsKLSAgLyogdmlydHVhbCBhZGRyZXNzIG9mIGh0YWIgKi8KLSAgdW5zaWduZWRfd29yZCBzdGFja19vZmZzZXQ7Ci0gIHVuc2lnbmVkX3dvcmQgc3RhY2tfcmE7Ci0gIHVuc2lnbmVkX3dvcmQgc3RhY2tfdmE7Ci0gIHVuc2lnbmVkX3dvcmQgc2l6ZW9mX3N0YWNrOwotICAvKiBhZGRyZXNzZXMgb2YgZW11bGF0aW9uIGluc3RydWN0aW9ucyB2aXJ0dWFsL3JlYWwgKi8KLSAgdW5zaWduZWRfd29yZCBjb2RlX29mZnNldDsKLSAgdW5zaWduZWRfd29yZCBjb2RlX3ZhOwotICB1bnNpZ25lZF93b3JkIGNvZGVfcmE7Ci0gIHVuc2lnbmVkX3dvcmQgc2l6ZW9mX2NvZGU7Ci0gIHVuc2lnbmVkX3dvcmQgY29kZV9jbGllbnRfdmE7Ci0gIHVuc2lnbmVkX3dvcmQgY29kZV9jbGllbnRfcmE7Ci0gIHVuc2lnbmVkX3dvcmQgY29kZV9jYWxsYmFja192YTsKLSAgdW5zaWduZWRfd29yZCBjb2RlX2NhbGxiYWNrX3JhOwotICB1bnNpZ25lZF93b3JkIGNvZGVfbG9vcF92YTsKLSAgdW5zaWduZWRfd29yZCBjb2RlX2xvb3BfcmE7Ci19OwotCi0KLS8qIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgSWhhbmRsZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaWhhbmRsZV9uYW1lKGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZSkKLXsKLSAgaWYgKGloYW5kbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gIiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gZGV2aWNlX25hbWUoZGV2aWNlX2luc3RhbmNlX2RldmljZShpaGFuZGxlKSk7Ci19Ci0KLQotCi0vKiBSZWFkL3dyaXRlIHRoZSBhcmd1bWVudCBsaXN0IG1ha2luZyBjZXJ0YWluIHRoYXQgYWxsIHZhbHVlcyBhcmUKLSAgIGNvbnZlcnRlZCB0by9mcm9tIGhvc3QgYnl0ZSBvcmRlci4KLQotICAgSW4gdGhlIGJlbG93IG9ubHkgbl9hcmdzK25fcmV0dXJucyBpcyByZWFkL3dyaXR0ZW4gKi8KLQotc3RhdGljIGludAotY2hpcnBfcmVhZF90MmhfYXJncyh2b2lkICphcmdzLAotCQkgICAgaW50IHNpemVvZl9hcmdzLAotCQkgICAgaW50IG5fYXJncywKLQkJICAgIGludCBuX3JldHVybnMsCi0JCSAgICBvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF9jZWxsICp3b3JkczsKLSAgaW50IGk7Ci0gIC8qIGNoZWNrIGFnYWluc3QgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQKLSAgICAgcHJvZ3JhbSAqLwotICBpZiAoKG5fYXJncyA+PSAwICYmIGRhdGEtPm5fYXJncyAhPSBuX2FyZ3MpCi0gICAgICB8fCAobl9yZXR1cm5zID49IDAgJiYgZGF0YS0+bl9yZXR1cm5zICE9IG5fcmV0dXJucykpIHsKLSAgICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIiVzIC0gaW52YWxpZCBuciBvZiBhcmdzIC0gbl9hcmdzPSVsZCwgbl9yZXR1cm5zPSVsZFxuIiwKLQkJCSAgZGF0YS0+c2VydmljZS0+bmFtZSwKLQkJCSAgKGxvbmcpZGF0YS0+bl9hcmdzLAotCQkJICAobG9uZylkYXRhLT5uX3JldHVybnMpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgKi8KLSAgaWYgKHNpemVvZih1bnNpZ25lZF9jZWxsKSAqIChkYXRhLT5uX2FyZ3MgKyBkYXRhLT5uX3JldHVybnMpID4gc2l6ZW9mX2FyZ3MpCi0gICAgcmV0dXJuIC0xOwotICAvKiBicmluZyBpbiB0aGUgZGF0YSAqLwotICBtZW1zZXQoYXJncywgMCwgc2l6ZW9mX2FyZ3MpOwotICBlbXVsX3JlYWRfYnVmZmVyKGFyZ3MsIGRhdGEtPmFyZ3VtZW50cyArIDMgKiBzaXplb2YodW5zaWduZWRfY2VsbCksCi0JCSAgIHNpemVvZih1bnNpZ25lZF9jZWxsKSAqIChkYXRhLT5uX2FyZ3MgKyBkYXRhLT5uX3JldHVybnMpLAotCQkgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIC8qIGNvbnZlcnQgYWxsIHdvcmRzIHRvIGhvc3QgZm9ybWF0ICovCi0gIHdvcmRzID0gYXJnczsKLSAgZm9yIChpID0gMDsgaSA8IChzaXplb2ZfYXJncyAvIHNpemVvZih1bnNpZ25lZF9jZWxsKSk7IGkrKykKLSAgICB3b3Jkc1tpXSA9IFQySF9jZWxsKHdvcmRzW2ldKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlycF93cml0ZV9oMnRfYXJncyh2b2lkICphcmdzLAotCQkgICAgIGludCBzaXplb2ZfYXJncywKLQkJICAgICBvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBpOwotICB1bnNpZ25lZF9jZWxsICp3b3JkczsKLSAgLyogY29udmVydCB0byB0YXJnZXQgZXZlcnl0aGluZyAqLwotICB3b3JkcyA9IGFyZ3M7Ci0gIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mX2FyZ3MgLyBzaXplb2YodW5zaWduZWRfY2VsbCkpOyBpKyspCi0gICAgd29yZHNbaV0gPSBIMlRfY2VsbCh3b3Jkc1tpXSk7Ci0gIC8qIGJyaW5nIGluIHRoZSBkYXRhICovCi0gIGVtdWxfd3JpdGVfYnVmZmVyKGFyZ3MsIGRhdGEtPmFyZ3VtZW50cyArIDMgKiBzaXplb2YodW5zaWduZWRfY2VsbCksCi0JCSAgICBzaXplb2YodW5zaWduZWRfY2VsbCkgKiAoZGF0YS0+bl9hcmdzICsgZGF0YS0+bl9yZXR1cm5zKSwKLQkJICAgIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi0vKiBPcGVuQm9vdCBlbXVsYXRpb24gZnVuY3Rpb25zICovCi0KLS8qIGNsaWVudCBpbnRlcmZhY2UgKi8KLQotc3RhdGljIGludAotY2hpcnBfZW11bF90ZXN0KG9zX2VtdWxfZGF0YSAqZGF0YSwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgdGVzdF9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIG5hbWU7IC8qc3RyaW5nKi8KLSAgICAvKm91dCovCi0gICAgdW5zaWduZWRfY2VsbCBtaXNzaW5nOwotICB9IGFyZ3M7Ci0gIGNoYXIgbmFtZVszMl07Ci0gIGNoaXJwX3NlcnZpY2VzICpzZXJ2aWNlID0gTlVMTDsKLSAgLyogcmVhZCBpbiB0aGUgYXJndW1lbnRzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGVtdWxfcmVhZF9zdHJpbmcobmFtZSwgYXJncy5uYW1lLCBzaXplb2YobmFtZSksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJ0ZXN0IC0gaW4gLSBuYW1lPWAlcydcbiIsIG5hbWUpKTsKLSAgLyogc2VlIGlmIHdlIGtub3cgYWJvdXQgdGhlIHNlcnZpY2UgKi8KLSAgc2VydmljZSA9IGRhdGEtPnNlcnZpY2VzOwotICB3aGlsZSAoc2VydmljZS0+bmFtZSAhPSBOVUxMICYmIHN0cmNtcChzZXJ2aWNlLT5uYW1lLCBuYW1lKSAhPSAwKSB7Ci0gICAgc2VydmljZSsrOwotICB9Ci0gIGlmIChzZXJ2aWNlLT5uYW1lID09IE5VTEwpCi0gICAgYXJncy5taXNzaW5nID0gLTE7Ci0gIGVsc2UKLSAgICBhcmdzLm1pc3NpbmcgPSAwOwotICAvKiB3cml0ZSB0aGUgYXJndW1lbnRzIGJhY2sgb3V0ICovCi0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgidGVzdCAtIG91dCAtIG1pc3Npbmc9JWxkXG4iLAotCQkJKGxvbmcpYXJncy5taXNzaW5nKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogRGV2aWNlIHRyZWUgKi8KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9wZWVyKG9zX2VtdWxfZGF0YSAqZGF0YSwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgcGVlcl9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgc2libGluZ19waGFuZGxlOwotICB9IGFyZ3M7Ci0gIGRldmljZSAqcGhhbmRsZTsKLSAgZGV2aWNlICpzaWJsaW5nX3BoYW5kbGUgPSBOVUxMOwotICAvKiByZWFkIGluIHRoZSBhcmd1bWVudHMgKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMSwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgcGhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZShkYXRhLT5yb290LCBhcmdzLnBoYW5kbGUpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInBlZXIgLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCi0JCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSkpKTsKLSAgLyogZmluZCB0aGUgcGVlciAqLwotICBpZiAoYXJncy5waGFuZGxlID09IDApIHsKLSAgICBzaWJsaW5nX3BoYW5kbGUgPSBkYXRhLT5yb290OwotICAgIGFyZ3Muc2libGluZ19waGFuZGxlID0gZGV2aWNlX3RvX2V4dGVybmFsKHNpYmxpbmdfcGhhbmRsZSk7Ci0gIH0KLSAgZWxzZSBpZiAocGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgc2libGluZ19waGFuZGxlID0gTlVMTDsKLSAgICBhcmdzLnNpYmxpbmdfcGhhbmRsZSA9IC0xOwotICB9Ci0gIGVsc2UgewotICAgIHNpYmxpbmdfcGhhbmRsZSA9IGRldmljZV9zaWJsaW5nKHBoYW5kbGUpOwotICAgIGlmIChzaWJsaW5nX3BoYW5kbGUgPT0gTlVMTCkKLSAgICAgIGFyZ3Muc2libGluZ19waGFuZGxlID0gMDsKLSAgICBlbHNlCi0gICAgICBhcmdzLnNpYmxpbmdfcGhhbmRsZSA9IGRldmljZV90b19leHRlcm5hbChzaWJsaW5nX3BoYW5kbGUpOwotICB9Ci0gIC8qIHdyaXRlIHRoZSBhcmd1bWVudHMgYmFjayBvdXQgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJwZWVyIC0gb3V0IC0gc2libGluZ19waGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLnNpYmxpbmdfcGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKXNpYmxpbmdfcGhhbmRsZSwKLQkJCShzaWJsaW5nX3BoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUoc2libGluZ19waGFuZGxlKSkpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9jaGlsZChvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgY2hpbGRfYXJncyB7Ci0gICAgLyppbiovCi0gICAgdW5zaWduZWRfY2VsbCBwaGFuZGxlOwotICAgIC8qb3V0Ki8KLSAgICB1bnNpZ25lZF9jZWxsIGNoaWxkX3BoYW5kbGU7Ci0gIH0gYXJnczsKLSAgZGV2aWNlICpwaGFuZGxlOwotICBkZXZpY2UgKmNoaWxkX3BoYW5kbGU7Ci0gIC8qIHJlYWQgdGhlIGFyZ3VtZW50cyBpbiAqLwotICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAxLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCi0gICAgcmV0dXJuIC0xOwotICBwaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlKGRhdGEtPnJvb3QsIGFyZ3MucGhhbmRsZSk7Ci0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2hpbGQgLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCi0JCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSkpKTsKLSAgLyogZmluZCBhIGNoaWxkICovCi0gIGlmIChhcmdzLnBoYW5kbGUgPT0gMAotICAgICAgfHwgcGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgY2hpbGRfcGhhbmRsZSA9IE5VTEw7Ci0gICAgYXJncy5jaGlsZF9waGFuZGxlID0gLTE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hpbGRfcGhhbmRsZSA9IGRldmljZV9jaGlsZChwaGFuZGxlKTsKLSAgICBpZiAoY2hpbGRfcGhhbmRsZSA9PSBOVUxMKQotICAgICAgYXJncy5jaGlsZF9waGFuZGxlID0gMDsKLSAgICBlbHNlCi0gICAgICBhcmdzLmNoaWxkX3BoYW5kbGUgPSBkZXZpY2VfdG9fZXh0ZXJuYWwoY2hpbGRfcGhhbmRsZSk7Ci0gIH0KLSAgLyogd3JpdGUgdGhlIHJlc3VsdCBvdXQgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjaGlsZCAtIG91dCAtIGNoaWxkX3BoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuY2hpbGRfcGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKWNoaWxkX3BoYW5kbGUsCi0JCQkoY2hpbGRfcGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShjaGlsZF9waGFuZGxlKSkpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9wYXJlbnQob3NfZW11bF9kYXRhICpkYXRhLAotCQkgIGNwdSAqcHJvY2Vzc29yLAotCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgcGFyZW50X2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKLSAgICAvKm91dCovCi0gICAgdW5zaWduZWRfY2VsbCBwYXJlbnRfcGhhbmRsZTsKLSAgfSBhcmdzOwotICBkZXZpY2UgKnBoYW5kbGU7Ci0gIGRldmljZSAqcGFyZW50X3BoYW5kbGU7Ci0gIC8qIHJlYWQgdGhlIGFyZ3MgaW4gKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMSwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgcGhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZShkYXRhLT5yb290LCBhcmdzLnBoYW5kbGUpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInBhcmVudCAtIGluIC0gcGhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5waGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpcGhhbmRsZSwKLQkJCShwaGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBoYW5kbGUpKSkpOwotICAvKiBmaW5kIGEgcGFyZW50ICovCi0gIGlmIChhcmdzLnBoYW5kbGUgPT0gMAotICAgICAgfHwgcGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgcGFyZW50X3BoYW5kbGUgPSBOVUxMOwotICAgIGFyZ3MucGFyZW50X3BoYW5kbGUgPSAtMTsKLSAgfQotICBlbHNlIHsKLSAgICBwYXJlbnRfcGhhbmRsZSA9IGRldmljZV9wYXJlbnQocGhhbmRsZSk7Ci0gICAgaWYgKHBhcmVudF9waGFuZGxlID09IE5VTEwpCi0gICAgICBhcmdzLnBhcmVudF9waGFuZGxlID0gMDsKLSAgICBlbHNlCi0gICAgICBhcmdzLnBhcmVudF9waGFuZGxlID0gZGV2aWNlX3RvX2V4dGVybmFsKHBhcmVudF9waGFuZGxlKTsKLSAgfQotICAvKiByZXR1cm4gdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInBhcmVudCAtIG91dCAtIHBhcmVudF9waGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLnBhcmVudF9waGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpcGFyZW50X3BoYW5kbGUsCi0JCQkocGFyZW50X3BoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGFyZW50X3BoYW5kbGUpKSkpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhY2thZ2Uob3NfZW11bF9kYXRhICpkYXRhLAotCQkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgaW5zdGFuY2VfdG9fcGFja2FnZV9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIGloYW5kbGU7Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKLSAgfSBhcmdzOwotICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7Ci0gIGRldmljZSAqcGhhbmRsZSA9IE5VTEw7Ci0gIC8qIHJlYWQgdGhlIGFyZ3MgaW4gKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMSwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgaWhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShkYXRhLT5yb290LCBhcmdzLmloYW5kbGUpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImluc3RhbmNlLXRvLXBhY2thZ2UgLSBpbiAtIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuaWhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKWloYW5kbGUsCi0JCQlpaGFuZGxlX25hbWUoaWhhbmRsZSkpKTsKLSAgLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyBwaGFuZGxlICovCi0gIGlmIChpaGFuZGxlID09IE5VTEwpIHsKLSAgICBwaGFuZGxlID0gTlVMTDsKLSAgICBhcmdzLnBoYW5kbGUgPSAtMTsKLSAgfQotICBlbHNlIHsKLSAgICBwaGFuZGxlID0gZGV2aWNlX2luc3RhbmNlX2RldmljZShpaGFuZGxlKTsKLSAgICBhcmdzLnBoYW5kbGUgPSBkZXZpY2VfdG9fZXh0ZXJuYWwocGhhbmRsZSk7Ci0gIH0KLSAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJpbnN0YW5jZS10by1wYWNrYWdlIC0gb3V0IC0gcGhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5waGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpcGhhbmRsZSwKLQkJCShwaGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBoYW5kbGUpKSkpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2dldHByb3BsZW4ob3NfZW11bF9kYXRhICpkYXRhLAotCQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBnZXRwcm9wbGVuX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKLSAgICB1bnNpZ25lZF9jZWxsIG5hbWU7Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgcHJvcGxlbjsKLSAgfSBhcmdzOwotICBjaGFyIG5hbWVbMzJdOwotICBkZXZpY2UgKnBoYW5kbGU7Ci0gIC8qIHJlYWQgdGhlIGFyZ3MgaW4gKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMiwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgcGhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZShkYXRhLT5yb290LCBhcmdzLnBoYW5kbGUpOwotICBlbXVsX3JlYWRfc3RyaW5nKG5hbWUsCi0JCSAgIGFyZ3MubmFtZSwKLQkJICAgc2l6ZW9mKG5hbWUpLAotCQkgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiZ2V0cHJvcGxlbiAtIGluIC0gcGhhbmRsZT0weCVseCgweCVseGAlcycpIG5hbWU9YCVzJ1xuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCi0JCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSksCi0JCQluYW1lKSk7Ci0gIC8qIGZpbmQgb3VyIHByb3AgYW5kIGdldCBpdHMgbGVuZ3RoICovCi0gIGlmIChhcmdzLnBoYW5kbGUgPT0gMAotICAgICAgfHwgcGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgYXJncy5wcm9wbGVuID0gLTE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkocGhhbmRsZSwgbmFtZSk7Ci0gICAgaWYgKHByb3AgPT0gKGRldmljZV9wcm9wZXJ0eSopMCkgewotICAgICAgYXJncy5wcm9wbGVuID0gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYXJncy5wcm9wbGVuID0gcHJvcC0+c2l6ZW9mX2FycmF5OwotICAgIH0KLSAgfQotICAvKiByZXR1cm4gdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3BsZW4gLSBvdXQgLSBwcm9wbGVuPSVsZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucHJvcGxlbikpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2dldHByb3Aob3NfZW11bF9kYXRhICpkYXRhLAotCQkgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBnZXRwcm9wX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKLSAgICB1bnNpZ25lZF9jZWxsIG5hbWU7Ci0gICAgdW5zaWduZWRfY2VsbCBidWY7Ci0gICAgdW5zaWduZWRfY2VsbCBidWZsZW47Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgc2l6ZTsKLSAgfSBhcmdzOwotICBjaGFyIG5hbWVbMzJdOwotICBkZXZpY2UgKnBoYW5kbGU7Ci0gIC8qIHJlYWQgaW4gdGhlIGFyZ3MsIHRoZSByZXR1cm4gaXMgb3B0aW9uYWwgKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgNCwgLTEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIHBoYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2UoZGF0YS0+cm9vdCwgYXJncy5waGFuZGxlKTsKLSAgZW11bF9yZWFkX3N0cmluZyhuYW1lLAotCQkgICBhcmdzLm5hbWUsCi0JCSAgIHNpemVvZihuYW1lKSwKLQkJICAgcHJvY2Vzc29yLCBjaWEpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3AgLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKSBuYW1lPWAlcycgYnVmPTB4JWx4IGJ1Zmxlbj0lbGRcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLnBoYW5kbGUsCi0JCQkodW5zaWduZWQgbG9uZylwaGFuZGxlLAotCQkJKHBoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGhhbmRsZSkpLAotCQkJbmFtZSwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWZsZW4pKTsKLSAgLyogZ2V0IHRoZSBwcm9wZXJ0eSAqLwotICBpZiAoYXJncy5waGFuZGxlID09IDAKLSAgICAgIHx8IHBoYW5kbGUgPT0gTlVMTCkgewotICAgIGFyZ3Muc2l6ZSA9IC0xOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJvcCA9IGRldmljZV9maW5kX3Byb3BlcnR5KHBoYW5kbGUsIG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwpIHsKLSAgICAgIGFyZ3Muc2l6ZSA9IC0xOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGludCBzaXplID0gYXJncy5idWZsZW47Ci0gICAgICBpZiAoc2l6ZSA+IHByb3AtPnNpemVvZl9hcnJheSkKLQlzaXplID0gcHJvcC0+c2l6ZW9mX2FycmF5OwotICAgICAgZW11bF93cml0ZV9idWZmZXIocHJvcC0+YXJyYXksIGFyZ3MuYnVmLAotCQkJc2l6ZSwKLQkJCXByb2Nlc3NvciwgY2lhKTsKLSAgICAgIGFyZ3Muc2l6ZSA9IHNpemU7Ci0gICAgICBzd2l0Y2ggKHByb3AtPnR5cGUpIHsKLSAgICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgotCVRSQUNFKHRyYWNlX29zX2VtdWwsICgiZ2V0cHJvcCAtIHN0cmluZyBgJXMnXG4iLAotCQkJICAgICAgZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KHBoYW5kbGUsIG5hbWUpKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGloYW5kbGVfcHJvcGVydHk6Ci0JVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJnZXRwcm9wIC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJICAgICAgQkUySF9jZWxsKCoodW5zaWduZWRfY2VsbCopcHJvcC0+YXJyYXkpLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpZGV2aWNlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShwaGFuZGxlLCBuYW1lKSwKLQkJCSAgICAgIGloYW5kbGVfbmFtZShkZXZpY2VfZmluZF9paGFuZGxlX3Byb3BlcnR5KHBoYW5kbGUsIG5hbWUpKSkpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyogd3JpdGUgYmFjayB0aGUgcmVzdWx0ICovCi0gIGlmIChkYXRhLT5uX3JldHVybnMgPT0gMCkKLSAgICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3AgLSBvdXQgLSBzaXplPSVsZCAobm90IHJldHVybmVkKVxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpYXJncy5zaXplKSk7Ci0gIGVsc2UgewotICAgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiZ2V0cHJvcCAtIG91dCAtIHNpemU9JWxkXG4iLAotCQkJICAodW5zaWduZWQgbG9uZylhcmdzLnNpemUpKTsKLSAgICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJCSBzaXplb2YoYXJncyksCi0JCQkgZGF0YSwKLQkJCSBwcm9jZXNzb3IsIGNpYSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfbmV4dHByb3Aob3NfZW11bF9kYXRhICpkYXRhLAotCQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IG5leHRwcm9wX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKLSAgICB1bnNpZ25lZF9jZWxsIHByZXZpb3VzOwotICAgIHVuc2lnbmVkX2NlbGwgYnVmOwotICAgIC8qb3V0Ki8KLSAgICB1bnNpZ25lZF9jZWxsIGZsYWc7Ci0gIH0gYXJnczsKLSAgY2hhciBwcmV2aW91c1szMl07Ci0gIGRldmljZSAqcGhhbmRsZTsKLSAgLyogcmVhZCBpbiB0aGUgYXJncyAqLwotICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCi0gICAgcmV0dXJuIC0xOwotICBwaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlKGRhdGEtPnJvb3QsIGFyZ3MucGhhbmRsZSk7Ci0gIGVtdWxfcmVhZF9zdHJpbmcocHJldmlvdXMsCi0JCSAgIGFyZ3MucHJldmlvdXMsCi0JCSAgIHNpemVvZihwcmV2aW91cyksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJuZXh0cHJvcCAtIGluIC0gcGhhbmRsZT0weCVseCgweCVseGAlcycpIHByZXZpb3VzPWAlcycgYnVmPTB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5waGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpcGhhbmRsZSwKLQkJCShwaGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBoYW5kbGUpKSwKLQkJCXByZXZpb3VzLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWYpKTsKLSAgLyogZmluZCB0aGUgbmV4dCBwcm9wZXJ0eSAqLwotICBpZiAoYXJncy5waGFuZGxlID09IDAKLSAgICAgIHx8IHBoYW5kbGUgPT0gTlVMTCkgewotICAgIGFyZ3MuZmxhZyA9IC0xOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJldl9wcm9wID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkocGhhbmRsZSwgcHJldmlvdXMpOwotICAgIGlmIChwcmV2X3Byb3AgPT0gTlVMTCkgewotICAgICAgYXJncy5mbGFnID0gLTE7IC8qIG5hbWUgaW52YWxpZCAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbmV4dF9wcm9wOwotICAgICAgbmV4dF9wcm9wID0gZGV2aWNlX25leHRfcHJvcGVydHkocHJldl9wcm9wKTsKLSAgICAgIGlmIChuZXh0X3Byb3AgPT0gTlVMTCkgewotCWFyZ3MuZmxhZyA9IDA7IC8qIGxhc3QgcHJvcGVydHkgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWVtdWxfd3JpdGVfYnVmZmVyKG5leHRfcHJvcC0+bmFtZSwgYXJncy5idWYsIHN0cmxlbihuZXh0X3Byb3AtPm5hbWUpLAotCQkJICBwcm9jZXNzb3IsIGNpYSk7Ci0JVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJuZXh0cHJvcCAtIG5hbWU9YCVzJ1xuIiwgbmV4dF9wcm9wLT5uYW1lKSk7Ci0JYXJncy5mbGFnID0gMTsgLyogd29ya2VkIG9rICovCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qIHdyaXRlIGJhY2sgdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIm5leHRwcm9wIC0gb3V0IC0gZmxhZz0lbGRcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmZsYWcpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotI2lmIDAKLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfc2V0cHJvcChvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZXJyb3IoImNoaXJwOiBzZXRwcm9wIG1ldGhvZCBub3QgaW1wbGVtZW50ZWRcbiIpOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2Nhbm9uKG9zX2VtdWxfZGF0YSAqZGF0YSwKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBjYW5vbl9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIGRldmljZV9zcGVjaWZpZXI7Ci0gICAgdW5zaWduZWRfY2VsbCBidWY7Ci0gICAgdW5zaWduZWRfY2VsbCBidWZsZW47Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgbGVuZ3RoOwotICB9IGFyZ3M7Ci0gIGNoYXIgZGV2aWNlX3NwZWNpZmllclsxMDI0XTsKLSAgZGV2aWNlICpwaGFuZGxlOwotICBjb25zdCBjaGFyICpwYXRoOwotICBpbnQgbGVuZ3RoOwotICAvKiByZWFkIGluIHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDMsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGVtdWxfcmVhZF9zdHJpbmcoZGV2aWNlX3NwZWNpZmllciwKLQkJICAgYXJncy5kZXZpY2Vfc3BlY2lmaWVyLAotCQkgICBzaXplb2YoZGV2aWNlX3NwZWNpZmllciksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjYW5vbiAtIGluIC0gZGV2aWNlX3NwZWNpZmllcj1gJXMnIGJ1Zj0weCVseCBidWZsZW49JWx4XG4iLAotCQkJZGV2aWNlX3NwZWNpZmllciwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWZsZW4pKTsKLSAgLyogY2Fub24gdGhlIG5hbWUgKi8KLSAgcGhhbmRsZSA9IHRyZWVfZmluZF9kZXZpY2UoZGF0YS0+cm9vdCwgZGV2aWNlX3NwZWNpZmllcik7Ci0gIGlmIChwaGFuZGxlID09IE5VTEwpIHsKLSAgICBsZW5ndGggPSAtMTsKLSAgICBwYXRoID0gIiI7Ci0gICAgYXJncy5sZW5ndGggPSAtMTsKLSAgfQotICBlbHNlIHsKLSAgICBwYXRoID0gZGV2aWNlX3BhdGgocGhhbmRsZSk7Ci0gICAgbGVuZ3RoID0gc3RybGVuKHBhdGgpOwotICAgIGlmIChsZW5ndGggPj0gYXJncy5idWZsZW4pCi0gICAgICBsZW5ndGggPSBhcmdzLmJ1ZmxlbiAtIDE7Ci0gICAgZW11bF93cml0ZV9idWZmZXIocGF0aCwgYXJncy5idWYsIGxlbmd0aCwKLQkJICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICAgIGFyZ3MubGVuZ3RoID0gbGVuZ3RoOwotICB9Ci0gIC8qIHdyaXRlIGJhY2sgdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNhbm9uIC0gb3V0IC0gbGVuZ3RoPSVsZCBidWY9YCVzJ1xuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MubGVuZ3RoLAotCQkJcGF0aCkpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2ZpbmRkZXZpY2Uob3NfZW11bF9kYXRhICpkYXRhLAotCQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBmaW5kZGV2aWNlX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgZGV2aWNlX3NwZWNpZmllcjsKLSAgICAvKm91dCovCi0gICAgdW5zaWduZWRfY2VsbCBwaGFuZGxlOwotICB9IGFyZ3M7Ci0gIGNoYXIgZGV2aWNlX3NwZWNpZmllclsxMDI0XTsKLSAgZGV2aWNlICpwaGFuZGxlOwotICAvKiBnZXQgdGhlIGFyZ3MgKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMSwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgZW11bF9yZWFkX3N0cmluZyhkZXZpY2Vfc3BlY2lmaWVyLAotCQkgICBhcmdzLmRldmljZV9zcGVjaWZpZXIsCi0JCSAgIHNpemVvZihkZXZpY2Vfc3BlY2lmaWVyKSwKLQkJICAgcHJvY2Vzc29yLCBjaWEpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImZpbmRkZXZpY2UgLSBpbiAtIGRldmljZV9zcGVjaWZpZXI9YCVzJ1xuIiwKLQkJCWRldmljZV9zcGVjaWZpZXIpKTsKLSAgLyogZmluZCB0aGUgZGV2aWNlICovCi0gIHBoYW5kbGUgPSB0cmVlX2ZpbmRfZGV2aWNlKGRhdGEtPnJvb3QsIGRldmljZV9zcGVjaWZpZXIpOwotICBpZiAocGhhbmRsZSA9PSBOVUxMKQotICAgIGFyZ3MucGhhbmRsZSA9IC0xOwotICBlbHNlCi0gICAgYXJncy5waGFuZGxlID0gZGV2aWNlX3RvX2V4dGVybmFsKHBoYW5kbGUpOwotICAvKiByZXR1cm4gaXRzIHBoYW5kbGUgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJmaW5kZGV2aWNlIC0gb3V0IC0gcGhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5waGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpcGhhbmRsZSwKLQkJCShwaGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBoYW5kbGUpKSkpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhdGgob3NfZW11bF9kYXRhICpkYXRhLAotCQkJICAgIGNwdSAqcHJvY2Vzc29yLAotCQkJICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgaW5zdGFuY2VfdG9fcGF0aF9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIGloYW5kbGU7Ci0gICAgdW5zaWduZWRfY2VsbCBidWY7Ci0gICAgdW5zaWduZWRfY2VsbCBidWZsZW47Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgbGVuZ3RoOwotICB9IGFyZ3M7Ci0gIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZTsKLSAgY29uc3QgY2hhciAqcGF0aDsKLSAgaW50IGxlbmd0aDsKLSAgLyogZ2V0IHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDMsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJpbnN0YW5jZS10by1wYXRoIC0gaW4gLSBpaGFuZGxlPTB4JWx4KDB4JWx4YCVzJykgYnVmPTB4JWx4IGJ1Zmxlbj0lbGRcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCi0JCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAotCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWYsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmJ1ZmxlbikpOwotICAvKiBnZXQgdGhlIGRldmljZXMgbmFtZSAqLwotICBpZiAoaWhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgYXJncy5sZW5ndGggPSAtMTsKLSAgICBwYXRoID0gIihudWxsKSI7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcGF0aCA9IGRldmljZV9pbnN0YW5jZV9wYXRoKGloYW5kbGUpOwotICAgIGxlbmd0aCA9IHN0cmxlbihwYXRoKTsKLSAgICBpZiAobGVuZ3RoID49IGFyZ3MuYnVmbGVuKQotICAgICAgbGVuZ3RoID0gYXJncy5idWZsZW4gLSAxOwotICAgIGVtdWxfd3JpdGVfYnVmZmVyKHBhdGgsIGFyZ3MuYnVmLCBsZW5ndGgsCi0JCSAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgICBhcmdzLmxlbmd0aCA9IGxlbmd0aDsKLSAgfQotICAvKiByZXR1cm4gaXRzIHBoYW5kbGUgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJpbnN0YW5jZS10by1wYXRoIC0gb3V0IC0gbGVuZ3RoPSVsZCBidWY9YCVzJylcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmxlbmd0aCwKLQkJCXBhdGgpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9wYWNrYWdlX3RvX3BhdGgob3NfZW11bF9kYXRhICpkYXRhLAotCQkJICAgY3B1ICpwcm9jZXNzb3IsCi0JCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IHBhY2thZ2VfdG9fcGF0aF9hcmdzIHsKLSAgICAvKmluKi8KLSAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7Ci0gICAgdW5zaWduZWRfY2VsbCBidWY7Ci0gICAgdW5zaWduZWRfY2VsbCBidWZsZW47Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgbGVuZ3RoOwotICB9IGFyZ3M7Ci0gIGRldmljZSAqcGhhbmRsZTsKLSAgY29uc3QgY2hhciAqcGF0aDsKLSAgLyogZ2V0IHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDMsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIHBoYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2UoZGF0YS0+cm9vdCwgYXJncy5waGFuZGxlKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJwYWNrYWdlLXRvLXBhdGggLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKSBidWY9MHglbHggYnVmbGVuPSVsZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCi0JCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSksCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmJ1ZiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmbGVuKSk7Ci0gIC8qIGdldCB0aGUgZGV2aWNlcyBuYW1lICovCi0gIGlmIChwaGFuZGxlID09IE5VTEwpIHsKLSAgICBhcmdzLmxlbmd0aCA9IC0xOwotICAgIHBhdGggPSAiKG51bGwpIjsKLSAgfQotICBlbHNlIHsKLSAgICBpbnQgbGVuZ3RoOwotICAgIHBhdGggPSBkZXZpY2VfcGF0aChwaGFuZGxlKTsKLSAgICBsZW5ndGggPSBzdHJsZW4ocGF0aCk7Ci0gICAgaWYgKGxlbmd0aCA+PSBhcmdzLmJ1ZmxlbikKLSAgICAgIGxlbmd0aCA9IGFyZ3MuYnVmbGVuIC0gMTsKLSAgICBlbXVsX3dyaXRlX2J1ZmZlcihwYXRoLCBhcmdzLmJ1ZiwgbGVuZ3RoLAotCQkgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgYXJncy5sZW5ndGggPSBsZW5ndGg7Ci0gIH0KLSAgLyogcmV0dXJuIGl0cyBwaGFuZGxlICovCi0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgicGFja2FnZS10by1wYXRoIC0gb3V0IC0gbGVuZ3RoPSVsZCBidWY9YCVzJylcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmxlbmd0aCwKLQkJCXBhdGgpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9jYWxsX21ldGhvZChvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgY2FsbF9tZXRob2RfYXJncyB7Ci0gICAgLyppbiovCi0gICAgdW5zaWduZWRfY2VsbCBtZXRob2Q7Ci0gICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOwotICAgIC8qaW4vb3V0Ki8KLSAgICB1bnNpZ25lZF9jZWxsIHN0YWNrWzEzXTsgLyo2aW4gKyA2b3V0ICsgY2F0Y2ggKi8KLSAgfSBhcmdzOwotICBjaGFyIG1ldGhvZFszMl07Ci0gIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZTsKLSAgLyogc29tZSB1c2VmdWwgaW5mbyBhYm91dCBvdXIgbWluaSBzdGFjayAqLwotICBpbnQgbl9zdGFja19hcmdzOwotICBpbnQgbl9zdGFja19yZXR1cm5zOwotICBpbnQgc3RhY2tfY2F0Y2hfcmVzdWx0OwotICBpbnQgc3RhY2tfcmV0dXJuczsKLSAgLyogcmVhZCB0aGUgYXJncyAqLwotICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAtMSwgLTEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGVtdWxfcmVhZF9zdHJpbmcobWV0aG9kLAotCQkgICBhcmdzLm1ldGhvZCwKLQkJICAgc2l6ZW9mKG1ldGhvZCksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgaWhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShkYXRhLT5yb290LCBhcmdzLmloYW5kbGUpOwotICBuX3N0YWNrX2FyZ3MgPSBkYXRhLT5uX2FyZ3MgLSAyOwotICBuX3N0YWNrX3JldHVybnMgPSBkYXRhLT5uX3JldHVybnMgLSAxOwotICBzdGFja19jYXRjaF9yZXN1bHQgPSBuX3N0YWNrX2FyZ3M7Ci0gIHN0YWNrX3JldHVybnMgPSBzdGFja19jYXRjaF9yZXN1bHQgKyAxOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNhbGwtbWV0aG9kIC0gaW4gLSBuX2FyZ3M9JWxkIG5fcmV0dXJucz0lbGQgbWV0aG9kPWAlcycgaWhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpZGF0YS0+bl9hcmdzLAotCQkJKHVuc2lnbmVkIGxvbmcpZGF0YS0+bl9yZXR1cm5zLAotCQkJbWV0aG9kLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKLQkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSkpOwotICAvKiBzZWUgaWYgd2UgY2FuIGVtdWxhdGUgdGhpcyBtZXRob2QgKi8KLSAgaWYgKGloYW5kbGUgPT0gTlVMTCkgewotICAgIC8qIE9wZW5GaXJtd2FyZSBkb2Vzbid0IGRlZmluZSB0aGlzIGVycm9yICovCi0gICAgZXJyb3IoImNoaXJwOiBpbnZhbGlkIGloYW5kbGUgcGFzc2VkIHRvIGNhbGwtbWV0aG9kIG1ldGhvZCIpOwotICB9Ci0gIGVsc2UgewotICAgIGFyZ3Muc3RhY2tbc3RhY2tfY2F0Y2hfcmVzdWx0XSA9Ci0gICAgICBkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QoaWhhbmRsZSwKLQkJCQkgIG1ldGhvZCwKLQkJCQkgIG5fc3RhY2tfYXJncywKLQkJCQkgICZhcmdzLnN0YWNrWzBdLAotCQkJCSAgbl9zdGFja19yZXR1cm5zLAotCQkJCSAgJmFyZ3Muc3RhY2tbc3RhY2tfcmV0dXJuc10pOwotICB9Ci0gIC8qIGZpbmlzaGVkICovCi0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2FsbC1tZXRob2QgLSBvdXQgLSBjYXRjaC1yZXN1bHQ9JWxkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5zdGFja1tzdGFja19jYXRjaF9yZXN1bHRdKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogRGV2aWNlIEkvTyAqLwotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX29wZW4ob3NfZW11bF9kYXRhICpkYXRhLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBvcGVuX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgZGV2aWNlX3NwZWNpZmllcjsKLSAgICAvKm91dCovCi0gICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOwotICB9IGFyZ3M7Ci0gIGNoYXIgZGV2aWNlX3NwZWNpZmllclsxMDI0XTsKLSAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOwotICAvKiByZWFkIHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGVtdWxfcmVhZF9zdHJpbmcoZGV2aWNlX3NwZWNpZmllciwKLQkJICAgYXJncy5kZXZpY2Vfc3BlY2lmaWVyLAotCQkgICBzaXplb2YoZGV2aWNlX3NwZWNpZmllciksCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJvcGVuIC0gaW4gLSBkZXZpY2Vfc3BlY2lmaWVyPWAlcydcbiIsCi0JCQlkZXZpY2Vfc3BlY2lmaWVyKSk7Ci0gIC8qIG9wZW4gdGhlIGRldmljZSAqLwotICBpaGFuZGxlID0gdHJlZV9pbnN0YW5jZShkYXRhLT5yb290LCBkZXZpY2Vfc3BlY2lmaWVyKTsKLSAgaWYgKGloYW5kbGUgPT0gTlVMTCkKLSAgICBhcmdzLmloYW5kbGUgPSAtMTsKLSAgZWxzZQotICAgIGFyZ3MuaWhhbmRsZSA9IGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpaGFuZGxlKTsKLSAgLyogcmV0dXJuIHRoZSBpaGFuZGxlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIm9wZW4gLSBvdXQgLSBpaGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCi0JCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAotCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfY2xvc2Uob3NfZW11bF9kYXRhICpkYXRhLAotCQkgY3B1ICpwcm9jZXNzb3IsCi0JCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IGNsb3NlX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKLSAgICAvKm91dCovCi0gIH0gYXJnczsKLSAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOwotICAvKiByZWFkIHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDAsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjbG9zZSAtIGluIC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAotCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKLQkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSkpOwotICAvKiBjbG9zZSB0aGUgZGV2aWNlICovCi0gIGlmIChpaGFuZGxlID09IE5VTEwpIHsKLSAgICAvKiBPcGVuRmlybXdhcmUgZG9lc24ndCBkZWZpbmUgdGhpcyBlcnJvciAqLwotICAgIGVycm9yKCJjaGlycDogaW52YWxpZCBpaGFuZGxlIHBhc3NlZCB0byBjbG9zZSBtZXRob2QiKTsKLSAgfQotICBlbHNlIHsKLSAgICBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKGloYW5kbGUpOwotICB9Ci0gIC8qIHJldHVybiB0aGUgaWhhbmRsZSByZXN1bHQgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjbG9zZSAtIG91dFxuIikpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX3JlYWQob3NfZW11bF9kYXRhICpkYXRhLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCByZWFkX2FyZ3MgewotICAgIC8qaW4qLwotICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKLSAgICB1bnNpZ25lZF9jZWxsIGFkZHI7Ci0gICAgdW5zaWduZWRfY2VsbCBsZW47Ci0gICAgLypvdXQqLwotICAgIHVuc2lnbmVkX2NlbGwgYWN0dWFsOwotICB9IGFyZ3M7Ci0gIGNoYXIgYnVmWzEwMjRdOwotICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7Ci0gIC8qIHJlYWQgdGhlIGFyZ3MgKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMywgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgaWhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShkYXRhLT5yb290LCBhcmdzLmloYW5kbGUpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInJlYWQgLSBpbiAtIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKSBhZGRyPTB4JWx4IGxlbj0lbGRcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCi0JCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAotCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5hZGRyLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5sZW4pKTsKLSAgaWYgKGloYW5kbGUgPT0gTlVMTCkgewotICAgIC8qIE9wZW5GaXJtd2FyZSBkb2Vzbid0IGRlZmluZSB0aGlzIGVycm9yICovCi0gICAgZXJyb3IoImNoaXJwOiBpbnZhbGlkIGloYW5kbGUgcGFzc2VkIHRvIHJlYWQgbWV0aG9kIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogZG8gdGhlIHJlYWRzICovCi0gICAgaW50IGFjdHVhbCA9IDA7Ci0gICAgd2hpbGUgKGFjdHVhbCA8IGFyZ3MubGVuKSB7Ci0gICAgICBpbnQgcmVtYWluaW5nID0gYXJncy5sZW4gLSBhY3R1YWw7Ci0gICAgICBpbnQgdG9fcmVhZCA9IChyZW1haW5pbmcgPD0gc2l6ZW9mKGJ1ZikgPyByZW1haW5pbmcgOiBzaXplb2YoYnVmKSk7Ci0gICAgICBpbnQgbnJfcmVhZCA9IGRldmljZV9pbnN0YW5jZV9yZWFkKGloYW5kbGUsIGJ1ZiwgdG9fcmVhZCk7Ci0gICAgICBpZiAobnJfcmVhZCA8IDApIHsKLQlhY3R1YWwgPSBucl9yZWFkOyAvKiB0aGUgZXJyb3IgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5yX3JlYWQgPT0gMCkgewotCWJyZWFrOwotICAgICAgfQotICAgICAgZW11bF93cml0ZV9idWZmZXIoYnVmLAotCQkJYXJncy5hZGRyICsgYWN0dWFsLAotCQkJbnJfcmVhZCwKLQkJCXByb2Nlc3NvciwgY2lhKTsKLSAgICAgIGFjdHVhbCArPSBucl9yZWFkOwotICAgIH0KLSAgICBpZiAoYWN0dWFsID49IDApIHsKLSAgICAgIGFyZ3MuYWN0dWFsID0gYWN0dWFsOwotICAgICAgaWYgKGFjdHVhbCA8IHNpemVvZihidWYpKQotCWJ1ZlthY3R1YWxdID0gJ1wwJzsKLSAgICAgIGVsc2UKLQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc3dpdGNoIChhY3R1YWwpIHsKLSAgICAgIGNhc2Ugc2ltX2lvX2VvZjoKLQlhcmdzLmFjdHVhbCA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIHNpbV9pb19ub3RfcmVhZHk6Ci0JQVNTRVJUKHNpbV9pb19ub3RfcmVhZHkgPT0gLTIpOwotCWFyZ3MuYWN0dWFsID0gc2ltX2lvX25vdF9yZWFkeTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JZXJyb3IoIkJhZCBlcnJvciB2YWx1ZSAlbGQiLCAobG9uZylhY3R1YWwpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiByZXR1cm4gdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInJlYWQgLSBvdXQgLSBhY3R1YWw9JWxkIGAlcydcbiIsCi0JCQkobG9uZylhcmdzLmFjdHVhbCwKLQkJCSgoYXJncy5hY3R1YWwgPiAwICYmIGFyZ3MuYWN0dWFsIDwgc2l6ZW9mKGJ1ZikpID8gYnVmIDogIiIpCi0JCQkpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF93cml0ZShvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3Qgd3JpdGVfYXJncyB7Ci0gICAgLyppbiovCi0gICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOwotICAgIHVuc2lnbmVkX2NlbGwgYWRkcjsKLSAgICB1bnNpZ25lZF9jZWxsIGxlbjsKLSAgICAvKm91dCovCi0gICAgdW5zaWduZWRfY2VsbCBhY3R1YWw7Ci0gIH0gYXJnczsKLSAgY2hhciBidWZbMTAyNF07Ci0gIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZTsKLSAgaW50IGFjdHVhbDsKLSAgLyogZ2V0IHRoZSBhcmdzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDMsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIGFjdHVhbCA9IGFyZ3MubGVuOwotICBpZiAoYWN0dWFsID49IHNpemVvZihidWYpKQotICAgIGFjdHVhbCA9IHNpemVvZihidWYpIC0gMTsKLSAgZW11bF9yZWFkX2J1ZmZlcihidWYsCi0JCSAgIGFyZ3MuYWRkciwKLQkJICAgYWN0dWFsLAotCQkgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIGJ1ZlthY3R1YWxdID0gJ1wwJzsKLSAgaWhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShkYXRhLT5yb290LCBhcmdzLmloYW5kbGUpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIndyaXRlIC0gaW4gLSBpaGFuZGxlPTB4JWx4KDB4JWx4YCVzJykgYCVzJyAoJWxkKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuaWhhbmRsZSwKLQkJCSh1bnNpZ25lZCBsb25nKWloYW5kbGUsCi0JCQlpaGFuZGxlX25hbWUoaWhhbmRsZSksCi0JCQlidWYsIChsb25nKWFjdHVhbCkpOwotICBpZiAoaWhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgLyogT3BlbkZpcm13YXJlIGRvZXNuJ3QgZGVmaW5lIHRoaXMgZXJyb3IgKi8KLSAgICBlcnJvcigiY2hpcnA6IGludmFsaWQgaWhhbmRsZSBwYXNzZWQgdG8gd3JpdGUgbWV0aG9kIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogd3JpdGUgaXQgb3V0ICovCi0gICAgYWN0dWFsID0gZGV2aWNlX2luc3RhbmNlX3dyaXRlKGloYW5kbGUsIGJ1ZiwgYWN0dWFsKTsKLSAgICBpZiAoYWN0dWFsIDwgMCkKLSAgICAgIGFyZ3MuYWN0dWFsID0gMDsKLSAgICBlbHNlCi0gICAgICBhcmdzLmFjdHVhbCA9IGFjdHVhbDsKLSAgfQotICAvKiByZXR1cm4gdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIndyaXRlIC0gb3V0IC0gYWN0dWFsPSVsZFxuIiwKLQkJCShsb25nKWFyZ3MuYWN0dWFsKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfc2Vlayhvc19lbXVsX2RhdGEgKmRhdGEsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IHNlZWtfYXJncyB7Ci0gICAgLyppbiovCi0gICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOwotICAgIHVuc2lnbmVkX2NlbGwgcG9zX2hpOwotICAgIHVuc2lnbmVkX2NlbGwgcG9zX2xvOwotICAgIC8qb3V0Ki8KLSAgICB1bnNpZ25lZF9jZWxsIHN0YXR1czsKLSAgfSBhcmdzOwotICBpbnQgc3RhdHVzOwotICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7Ci0gIC8qIGdldCB0aGUgYXJncyAqLwotICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCi0gICAgcmV0dXJuIC0xOwotICBpaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKGRhdGEtPnJvb3QsIGFyZ3MuaWhhbmRsZSk7Ci0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgic2VlayAtIGluIC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpIHBvcy5oaT0weCVseCBwb3MubG89MHglbHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCi0JCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAotCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpLAotCQkJYXJncy5wb3NfaGksIGFyZ3MucG9zX2xvKSk7Ci0gIGlmIChpaGFuZGxlID09IE5VTEwpIHsKLSAgICAvKiBPcGVuRmlybXdhcmUgZG9lc24ndCBkZWZpbmUgdGhpcyBlcnJvciAqLwotICAgIGVycm9yKCJjaGlycDogaW52YWxpZCBpaGFuZGxlIHBhc3NlZCB0byBzZWVrIG1ldGhvZCIpOwotICB9Ci0gIGVsc2UgewotICAgIC8qIHNlZWsgaXQgb3V0ICovCi0gICAgc3RhdHVzID0gZGV2aWNlX2luc3RhbmNlX3NlZWsoaWhhbmRsZSwgYXJncy5wb3NfaGksIGFyZ3MucG9zX2xvKTsKLSAgICBhcmdzLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotICAvKiByZXR1cm4gdGhlIHJlc3VsdCAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInNlZWsgLSBvdXQgLSBzdGF0dXM9JWxkXG4iLAotCQkJKGxvbmcpYXJncy5zdGF0dXMpKTsKLSAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCi0JCSAgICAgICBzaXplb2YoYXJncyksCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBtZW1vcnkgKi8KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9jbGFpbShvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICAvKiBOT1RFOiB0aGUgY2xpZW50IGludGVyZmFjZSBjbGFpbSByb3V0aW5lIGlzICp2ZXJ5KiBkaWZmZXJlbnQgdG8KLSAgICAgdGhlICJjbGFpbSIgbWV0aG9kIGRlc2NyaWJlZCBpbiBJRUVFLTEyNzUgYXBwZW5kaXggQS4gIFRoZSBsYXR0ZXIKLSAgICAgdXNlcyByZWFsIGFkZHJlc3NlcyB3aGlsZSB0aGlzIHVzZXMgdmlydHVhbCAoZWZmZWN0aXZlKQotICAgICBhZGRyZXNzZXMuICovCi0gIHN0cnVjdCBjbGFpbV9hcmdzIHsKLSAgICAvKiBpbiAqLwotICAgIHVuc2lnbmVkX2NlbGwgdmlydDsKLSAgICB1bnNpZ25lZF9jZWxsIHNpemU7Ci0gICAgdW5zaWduZWRfY2VsbCBhbGlnbjsKLSAgICAvKiBvdXQgKi8KLSAgICB1bnNpZ25lZF9jZWxsIGJhc2VhZGRyOwotICB9IGFyZ3M7Ci0gIC8qIHJlYWQgdGhlIGFyZ3MgKi8KLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwKLQkJCSAgMyAvKm5fYXJncyovLCAxIC8qbl9yZXR1cm5zKi8sCi0JCQkgIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2xhaW0gLSBpbiAtIHZpcnQ9MHglbHggc2l6ZT0lbGQgYWxpZ249JWRcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLnZpcnQsCi0JCQkobG9uZyBpbnQpYXJncy5zaXplLAotCQkJKGludClhcmdzLmFsaWduKSk7Ci0gIC8qIHVzZSB0aGUgbWVtb3J5IGRldmljZSB0byBhbGxvY2F0ZSAocmVhbCkgbWVtb3J5IGF0IHRoZSByZXF1ZXN0ZWQKLSAgICAgYWRkcmVzcyAqLwotICB7Ci0gICAgZGV2aWNlX2luc3RhbmNlICptZW1vcnkgPSB0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShkYXRhLT5yb290LCAiL2Nob3Nlbi9tZW1vcnkiKTsKLSAgICB1bnNpZ25lZF9jZWxsIG1lbV9pblszXTsKLSAgICB1bnNpZ25lZF9jZWxsIG1lbV9vdXRbMV07Ci0gICAgbWVtX2luWzBdID0gYXJncy5hbGlnbjsgLyp0b3Atb2Ytc3RhY2sqLwotICAgIG1lbV9pblsxXSA9IGFyZ3Muc2l6ZTsKLSAgICBtZW1faW5bMl0gPSBhcmdzLnZpcnQ7Ci0gICAgaWYgKGRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZChtZW1vcnksICJjbGFpbSIsCi0JCQkJICAgIDMsIG1lbV9pbiwgMSwgbWVtX291dCkgPCAwKQotICAgICAgZXJyb3IoImNoaXJwOiBjbGFpbSBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHZpcnQ9MHglbHggc2l6ZT0lbGQgYWxpZ249JWQiLAotCSAgICAodW5zaWduZWQgbG9uZylhcmdzLnZpcnQsCi0JICAgIChsb25nIGludClhcmdzLnNpemUsCi0JICAgIChpbnQpYXJncy5hbGlnbik7Ci0gICAgYXJncy5iYXNlYWRkciA9IG1lbV9vdXRbMF07Ci0gIH0KLSAgLyogaWYgdXNpbmcgdmlydHVhbCBhZGRyZXNzZXMsIGNyZWF0ZSBhIDEtMSBtYXAgb2YgdGhpcyBhZGRyZXNzIHNwYWNlICovCi0gIGlmICghZGF0YS0+cmVhbF9tb2RlKSB7Ci0gICAgZXJyb3IoImNoaXJwOiBjbGFpbSBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCB2aXJ0dWFsIG1vZGUiKTsKLSAgfQotICAvKiByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyAqLwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNsYWltIC0gb3V0IC0gYmFzZWFkZHI9MHglbHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZylhcmdzLmJhc2VhZGRyKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfcmVsZWFzZShvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgLyogTk9URTogdGhlIGNsaWVudCBpbnRlcmZhY2UgcmVsZWFzZSByb3V0aW5lIGlzICp2ZXJ5KiBkaWZmZXJlbnQgdG8KLSAgICAgdGhlICJjbGFpbSIgbWV0aG9kIGRlc2NyaWJlZCBpbiBJRUVFLTEyNzUgYXBwZW5kaXggQS4gIFRoZSBsYXR0ZXIKLSAgICAgdXNlcyByZWFsIGFkZHJlc3NlcyB3aGlsZSB0aGlzIHVzZXMgdmlydHVhbCAoZWZmZWN0aXZlKQotICAgICBhZGRyZXNzZXMuICovCi0gIHN0cnVjdCBjbGFpbV9hcmdzIHsKLSAgICAvKiBpbiAqLwotICAgIHVuc2lnbmVkX2NlbGwgdmlydDsKLSAgICB1bnNpZ25lZF9jZWxsIHNpemU7Ci0gICAgLyogb3V0ICovCi0gIH0gYXJnczsKLSAgLyogcmVhZCB0aGUgYXJncyAqLwotICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLAotCQkJICAyIC8qbl9hcmdzKi8sIDAgLypuX3JldHVybnMqLywKLQkJCSAgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQotICAgIHJldHVybiAtMTsKLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJyZWxlYXNlIC0gaW4gLSB2aXJ0PTB4JWx4IHNpemU9JWxkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy52aXJ0LAotCQkJKGxvbmcgaW50KWFyZ3Muc2l6ZSkpOwotICAvKiB1c2UgdGhlIG1lbW9yeSBkZXZpY2UgdG8gcmVsZWFzZSAocmVhbCkgbWVtb3J5IGF0IHRoZSByZXF1ZXN0ZWQKLSAgICAgYWRkcmVzcyAqLwotICB7Ci0gICAgZGV2aWNlX2luc3RhbmNlICptZW1vcnkgPSB0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShkYXRhLT5yb290LCAiL2Nob3Nlbi9tZW1vcnkiKTsKLSAgICB1bnNpZ25lZF9jZWxsIG1lbV9pblsyXTsKLSAgICBtZW1faW5bMF0gPSBhcmdzLnNpemU7Ci0gICAgbWVtX2luWzFdID0gYXJncy52aXJ0OwotICAgIGlmIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QobWVtb3J5LCAicmVsZWFzZSIsCi0JCQkJICAgIDIsIG1lbV9pbiwgMCwgTlVMTCkgPCAwKQotICAgICAgZXJyb3IoImNoaXJwOiBjbGFpbSBmYWlsZWQgdG8gcmVsZWFzZSBtZW1vcnkgdmlydD0weCVseCBzaXplPSVsZCIsCi0JICAgICh1bnNpZ25lZCBsb25nKWFyZ3MudmlydCwKLQkgICAgKGxvbmcgaW50KWFyZ3Muc2l6ZSk7Ci0gIH0KLSAgLyogaWYgdXNpbmcgdmlydHVhbCBhZGRyZXNzZXMsIHJlbW92ZSB0aGUgMS0xIG1hcCBvZiB0aGlzIGFkZHJlc3Mgc3BhY2UgKi8KLSAgaWYgKCFkYXRhLT5yZWFsX21vZGUpIHsKLSAgICBlcnJvcigiY2hpcnA6IHJlbGVhc2UgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgdmlydHVhbCBtb2RlIik7Ci0gIH0KLSAgLyogcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MgKi8KLSAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJyZWxlYXNlIC0gb3V0XG4iKSk7Ci0gIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAotCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQ29udHJvbCB0cmFuc2ZlciAqLwotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2Jvb3Qob3NfZW11bF9kYXRhICpkYXRhLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIC8qIHVubGlrZSBPcGVuRmlybXdhcmUgdGhpcyBvbmUgY2FuIHRha2UgYW4gYXJndW1lbnQgKi8KLSAgc3RydWN0IGJvb3RfYXJncyB7Ci0gICAgLyppbiovCi0gICAgdW5zaWduZWRfY2VsbCBib290c3BlYzsKLSAgICAvKm91dCovCi0gIH0gYXJnczsKLSAgY2hhciBib290c3BlY1sxMDI0XTsKLSAgLyogcmVhZCBpbiB0aGUgYXJndW1lbnRzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIC0xLCAwLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCi0gICAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIC0xKTsKLSAgaWYgKGFyZ3MuYm9vdHNwZWMgIT0gMCkKLSAgICBlbXVsX3JlYWRfc3RyaW5nKGJvb3RzcGVjLCBhcmdzLmJvb3RzcGVjLCBzaXplb2YoYm9vdHNwZWMpLAotCQkgICAgIHByb2Nlc3NvciwgY2lhKTsKLSAgZWxzZQotICAgIHN0cmNweShib290c3BlYywgIihudWxsKSIpOwotICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImJvb3QgLSBpbiBib290c3BlYz1gJXMnXG4iLCBib290c3BlYykpOwotICAvKiBqdXN0IHJlcG9ydCB0aGlzIGFuZCBleGl0ICovCi0gIHByaW50Zl9maWx0ZXJlZCgiY2hycDogYm9vdCAlcyBjYWxsZWQsIGV4aXRpbmcuXG4iLCBib290c3BlYyk7Ci0gIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfZXhpdGVkLCAwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfZW50ZXIob3NfZW11bF9kYXRhICpkYXRhLAotCQkgY3B1ICpwcm9jZXNzb3IsCi0JCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZXJyb3IoImNoaXJwOiBlbnRlciBtZXRob2Qgbm90IGltcGxlbWVudGVkXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfZXhpdChvc19lbXVsX2RhdGEgKmRhdGEsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgLyogdW5saWtlIE9wZW5Cb290IHRoaXMgb25lIGNhbiB0YWtlIGFuIGFyZ3VtZW50ICovCi0gIHN0cnVjdCBleGl0X2FyZ3MgewotICAgIC8qaW4qLwotICAgIHNpZ25lZF9jZWxsIHN0YXR1czsKLSAgICAvKm91dCovCi0gIH0gYXJnczsKLSAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgLTEsIDAsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2V4aXRlZCwgLTEpOwotICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2V4aXRlZCwgYXJncy5zdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9jaGFpbihvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBlcnJvcigiY2hpcnA6IGNoYWluIG1ldGhvZCBub3QgaW1wbGVtZW50ZWRcbiIpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiB1c2VyIGludGVyZmFjZSAqLwotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX2ludGVycHJldChvc19lbXVsX2RhdGEgKmRhdGEsCi0JCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGVycm9yKCJjaGlycDogaW50ZXJwcmV0IG1ldGhvZCBub3QgaW1wbGVtZW50ZWRcbiIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hpcnBfZW11bF9zZXRfY2FsbGJhY2sob3NfZW11bF9kYXRhICpkYXRhLAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZXJyb3IoImNoaXJwOiBzZXRfY2FsbGJhY2sgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGlycF9lbXVsX3NldF9zeW1ib2xfbG9va3VwKG9zX2VtdWxfZGF0YSAqZGF0YSwKLQkJCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBlcnJvcigiY2hpcnA6IHNldF9zeW1ib2xfbG9va3VwIG1ldGhvZCBub3QgaW1wbGVtZW50ZWRcbiIpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaW1lICovCi0KLXN0YXRpYyBpbnQKLWNoaXJwX2VtdWxfbWlsbGlzZWNvbmRzKG9zX2VtdWxfZGF0YSAqZGF0YSwKLQkJCWNwdSAqcHJvY2Vzc29yLAotCQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCB0ZXN0X2FyZ3MgewotICAgIC8qaW4qLwotICAgIC8qb3V0Ki8KLSAgICB1bnNpZ25lZF9jZWxsIG1zOwotICB9IGFyZ3M7Ci0gIHVuc2lnbmVkNjQgdGltZTsKLSAgLyogcmVhZCBpbiB0aGUgYXJndW1lbnRzICovCi0gIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKLSAgICByZXR1cm4gLTE7Ci0gIC8qIG1ha2UgdXAgYSBudW1iZXIgKi8KLSAgdGltZSA9IGV2ZW50X3F1ZXVlX3RpbWUocHNpbV9ldmVudF9xdWV1ZShjcHVfc3lzdGVtKHByb2Nlc3NvcikpKSAvIDEwMDAwMDA7Ci0gIGFyZ3MubXMgPSB0aW1lOwotICAvKiB3cml0ZSB0aGUgYXJndW1lbnRzIGJhY2sgb3V0ICovCi0gIFRSQUNFKHRyYWNlX29zX2VtdWwsICgibWlsbGlzZWNvbmRzIC0gb3V0IC0gbXM9JWxkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5tcykpOwotICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKLQkJICAgICAgIHNpemVvZihhcmdzKSwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiAwOwotfQotCi0KLQotCi1zdGF0aWMgY2hpcnBfc2VydmljZXMgc2VydmljZXNbXSA9IHsKLQotICAvKiBjbGllbnQgaW50ZXJmYWNlICovCi0gIHsgInRlc3QiLCBjaGlycF9lbXVsX3Rlc3QgfSwKLQotICAvKiBkZXZpY2UgdHJlZSAqLwotICB7ICJwZWVyIiwgY2hpcnBfZW11bF9wZWVyIH0sCi0gIHsgImNoaWxkIiwgY2hpcnBfZW11bF9jaGlsZCB9LAotICB7ICJwYXJlbnQiLCBjaGlycF9lbXVsX3BhcmVudCB9LAotICB7ICJpbnN0YW5jZS10by1wYWNrYWdlIiwgY2hpcnBfZW11bF9pbnN0YW5jZV90b19wYWNrYWdlIH0sCi0gIHsgImdldHByb3BsZW4iLCBjaGlycF9lbXVsX2dldHByb3BsZW4gfSwKLSAgeyAiZ2V0cHJvcCIsIGNoaXJwX2VtdWxfZ2V0cHJvcCB9LAotICB7ICJuZXh0cHJvcCIsIGNoaXJwX2VtdWxfbmV4dHByb3AgfSwKLSAgLyogeyAic2V0cHJvcCIsIGNoaXJwX2VtdWxfc2V0cHJvcCB9LCAqLwotICB7ICJjYW5vbiIsIGNoaXJwX2VtdWxfY2Fub24gfSwKLSAgeyAiZmluZGRldmljZSIsIGNoaXJwX2VtdWxfZmluZGRldmljZSB9LAotICB7ICJpbnN0YW5jZS10by1wYXRoIiwgY2hpcnBfZW11bF9pbnN0YW5jZV90b19wYXRoIH0sCi0gIHsgInBhY2thZ2UtdG8tcGF0aCIsIGNoaXJwX2VtdWxfcGFja2FnZV90b19wYXRoIH0sCi0gIHsgImNhbGwtbWV0aG9kIiwgY2hpcnBfZW11bF9jYWxsX21ldGhvZCB9LAotCi0gIC8qIGRldmljZSBJL08gKi8KLSAgeyAib3BlbiIsIGNoaXJwX2VtdWxfb3BlbiB9LAotICB7ICJjbG9zZSIsIGNoaXJwX2VtdWxfY2xvc2UgfSwKLSAgeyAicmVhZCIsIGNoaXJwX2VtdWxfcmVhZCB9LAotICB7ICJ3cml0ZSIsIGNoaXJwX2VtdWxfd3JpdGUgfSwKLSAgeyAic2VlayIsIGNoaXJwX2VtdWxfc2VlayB9LAotICB7ICJ3cml0ZSIsIGNoaXJwX2VtdWxfd3JpdGUgfSwKLQotICAvKiBtZW1vcnkgKi8KLSAgeyAiY2xhaW0iLCBjaGlycF9lbXVsX2NsYWltIH0sCi0gIHsgInJlbGVhc2UiLCBjaGlycF9lbXVsX3JlbGVhc2UgfSwKLQotICAvKiBjb250cm9sIHRyYW5zZmVyICovCi0gIHsgImJvb3QiLCBjaGlycF9lbXVsX2Jvb3QgfSwKLSAgeyAiZW50ZXIiLCBjaGlycF9lbXVsX2VudGVyIH0sCi0gIHsgImV4aXQiLCBjaGlycF9lbXVsX2V4aXQgfSwKLSAgeyAiY2hhaW4iLCBjaGlycF9lbXVsX2NoYWluIH0sCi0KLSAgLyogdXNlciBpbnRlcmZhY2UgKi8KLSAgeyAiaW50ZXJwcmV0IiwgY2hpcnBfZW11bF9pbnRlcnByZXQgfSwKLSAgeyAic2V0X2NhbGxiYWNrIiwgY2hpcnBfZW11bF9zZXRfY2FsbGJhY2sgfSwKLSAgeyAic2V0X3N5bWJvbF9sb29rdXAiLCBjaGlycF9lbXVsX3NldF9zeW1ib2xfbG9va3VwIH0sCi0KLSAgLyogdGltZSAqLwotICB7ICJtaWxsaXNlY29uZHMiLCBjaGlycF9lbXVsX21pbGxpc2Vjb25kcyB9LAotCi0gIHsgMCwgLyogc2VudGluYWwgKi8gfSwKLX07Ci0KLQotLyogbWFpbiBoYW5kbGVycyAqLwotCi0vKiBBbnkgc3RhcnRpbmcgYWRkcmVzcyBncmVhdGVyIHRoYW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIENoaXJwCi0gICByYXRoZXIgdGhhbiBWRUEgKi8KLQotI2lmbmRlZiBDSElSUF9TVEFSVF9BRERSRVNTCi0jZGVmaW5lIENISVJQX1NUQVJUX0FERFJFU1MgMHg4MDAwMDAwMAotI2VuZGlmCi0jaWZuZGVmIENISVJQX0xPQURfQkFTRQotI2RlZmluZSBDSElSUF9MT0FEX0JBU0UgLTEKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IF9jaGlycF9ub3RlX2Rlc2MgewotICBzaWduZWQzMiByZWFsX21vZGU7Ci0gIHNpZ25lZDMyIHJlYWxfYmFzZTsKLSAgc2lnbmVkMzIgcmVhbF9zaXplOwotICBzaWduZWQzMiB2aXJ0X2Jhc2U7Ci0gIHNpZ25lZDMyIHZpcnRfc2l6ZTsKLSAgc2lnbmVkMzIgbG9hZF9iYXNlOwotfSBjaGlycF9ub3RlX2Rlc2M7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIG5vdGVfbWlzc2luZywKLSAgbm90ZV9mb3VuZCwKLSAgbm90ZV9jb3JyZWN0LAotfSBub3RlX2ZvdW5kX3N0YXR1czsKLXR5cGVkZWYgc3RydWN0IF9jaGlycF9ub3RlIHsKLSAgY2hpcnBfbm90ZV9kZXNjIGRlc2M7Ci0gIG5vdGVfZm91bmRfc3RhdHVzIGZvdW5kOwotfSBjaGlycF9ub3RlOwotCi10eXBlZGVmIHN0cnVjdCBfY2hpcnBfbm90ZV9oZWFkIHsKLSAgdW5zaWduZWQzMiBuYW1lc3o7Ci0gIHVuc2lnbmVkMzIgZGVzY3N6OwotICB1bnNpZ25lZDMyIHR5cGU7Ci19IGNoaXJwX25vdGVfaGVhZDsKLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX2NoaXJwX25vdGUoYmZkICppbWFnZSwKLQkJICAgIGFzZWN0aW9uICpzZWN0LAotCQkgICAgUFRSIG9iaikKLXsKLSAgY2hpcnBfbm90ZSAqbm90ZSA9IChjaGlycF9ub3RlKilvYmo7Ci0gIGlmIChzdHJjbXAoc2VjdC0+bmFtZSwgIi5ub3RlIikgPT0gMCkgewotICAgIGNoaXJwX25vdGVfaGVhZCBoZWFkOwotICAgIGNoYXIgbmFtZVsxNl07Ci0gICAgLyogY2hlY2sgdGhlIGhlYWQgKi8KLSAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhpbWFnZSwgc2VjdCwKLQkJCQkgICZoZWFkLCAwLCBzaXplb2YoaGVhZCkpKQotICAgICAgcmV0dXJuOwotICAgIGhlYWQubmFtZXN6ID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZoZWFkLm5hbWVzeik7Ci0gICAgaGVhZC5kZXNjc3ogPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJmhlYWQuZGVzY3N6KTsKLSAgICBoZWFkLnR5cGUgPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJmhlYWQudHlwZSk7Ci0gICAgaWYgKGhlYWQudHlwZSAhPSAweDEyNzUpCi0gICAgICByZXR1cm47Ci0gICAgLyogY2hlY2sgdGhlIG5hbWUgZmllbGQgKi8KLSAgICBpZiAoaGVhZC5uYW1lc3ogPiBzaXplb2YobmFtZSkpIHsKLSAgICAgIGVycm9yKCJjaGlycDogbm90ZSBuYW1lIHRvbyBsb25nICglZCA+ICVkKVxuIiwgKGludCloZWFkLm5hbWVzeiwgc2l6ZW9mKG5hbWUpKTsKLSAgICB9Ci0gICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoaW1hZ2UsIHNlY3QsCi0JCQkJICBuYW1lLCBzaXplb2YoaGVhZCksIGhlYWQubmFtZXN6KSkgewotICAgICAgZXJyb3IoImNoaXJwOiBub3RlIG5hbWUgdW5yZWFkYWJsZVxuIik7Ci0gICAgfQotICAgIGlmIChzdHJjbXAobmFtZSwgIlBvd2VyUEMiKSAhPSAwKSB7Ci0gICAgICBwcmludGZfZmlsdGVyZWQoImNoaXJwOiBub3RlIG5hbWUgKCVzKSBub3QgYFBvd2VyUEMnXG4iLCBuYW1lKTsKLSAgICB9Ci0gICAgLyogY2hlY2sgdGhlIHNpemUgKi8KLSAgICBpZiAoaGVhZC5kZXNjc3ogPT0gc2l6ZW9mKG5vdGUtPmRlc2MpIC0gc2l6ZW9mKHNpZ25lZDMyKSkgewotICAgICAgc2ltX2lvX3ByaW50Zl9maWx0ZXJlZCgiY2hpcnA6IG5vdGUgZGVzY3JpcHRvciBtaXNzaW5nIGxvYWQtYmFzZVxuIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGhlYWQuZGVzY3N6ICE9IHNpemVvZihub3RlLT5kZXNjKSkgewotICAgICAgc2ltX2lvX3ByaW50Zl9maWx0ZXJlZCgiY2hpcnA6IG5vdGUgZGVzY3JpcHRvciBvZiB3cm9uZyBzaXplXG4iKTsKLSAgICAgIG5vdGUtPmZvdW5kID0gbm90ZV9mb3VuZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm90ZS0+Zm91bmQgPSBub3RlX2NvcnJlY3Q7Ci0gICAgLyogZ2V0IHRoZSBjb250ZW50cyAqLwotICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGltYWdlLCBzZWN0LAotCQkJCSAgJm5vdGUtPmRlc2MsIC8qIHBhZ2UgYWxpZ24gc3RhcnQgKi8KLQkJCQkgICgoc2l6ZW9mKGhlYWQpICsgaGVhZC5uYW1lc3opICsgMykgJiB+MywKLQkJCQkgIGhlYWQuZGVzY3N6KSkgewotICAgICAgZXJyb3IoImNoaXJwOiBub3RlIGRlc2NyaXB0b3IgdW5yZWFkYWJsZVxuIik7Ci0gICAgfQotICAgIG5vdGUtPmRlc2MucmVhbF9tb2RlID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZub3RlLT5kZXNjLnJlYWxfbW9kZSk7Ci0gICAgbm90ZS0+ZGVzYy5yZWFsX2Jhc2UgPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJm5vdGUtPmRlc2MucmVhbF9iYXNlKTsKLSAgICBub3RlLT5kZXNjLnJlYWxfc2l6ZSA9IGJmZF9nZXRfMzIoaW1hZ2UsICh2b2lkKikmbm90ZS0+ZGVzYy5yZWFsX3NpemUpOwotICAgIG5vdGUtPmRlc2MudmlydF9iYXNlID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZub3RlLT5kZXNjLnZpcnRfYmFzZSk7Ci0gICAgbm90ZS0+ZGVzYy52aXJ0X3NpemUgPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJm5vdGUtPmRlc2MudmlydF9zaXplKTsKLSAgICBpZiAoaGVhZC5kZXNjc3ogPT0gc2l6ZW9mKG5vdGUtPmRlc2MpKQotICAgICAgbm90ZS0+ZGVzYy5sb2FkX2Jhc2UgPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJm5vdGUtPmRlc2MubG9hZF9iYXNlKTsKLSAgICBlbHNlCi0gICAgICBub3RlLT5kZXNjLmxvYWRfYmFzZSA9IENISVJQX0xPQURfQkFTRTsKLSAgfQotfQotCi0KLXN0YXRpYyBvc19lbXVsX2RhdGEgKgotZW11bF9jaGlycF9jcmVhdGUoZGV2aWNlICpyb290LAotCQkgIGJmZCAqaW1hZ2UsCi0JCSAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgb3NfZW11bF9kYXRhICpjaGlycDsKLSAgZGV2aWNlICpub2RlOwotICBjaGlycF9ub3RlIG5vdGU7Ci0gIGludCBpOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGF0IHRoaXMgcmVhbGx5IGlzIHRoZSBjaG9zZW4gZW11bGF0aW9uICovCi0gIGlmIChuYW1lID09IE5VTEwgJiYgaW1hZ2UgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKG5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wKG5hbWUsICJvYiIpICE9IDAKLSAgICAgICYmIHN0cmNtcChuYW1lLCAiaWVlZTEyNzQiKSAhPSAwCi0gICAgICAmJiBzdHJjbXAobmFtZSwgImNocnAiKSAhPSAwCi0gICAgICAmJiBzdHJjbXAobmFtZSwgImNoaXJwIikgIT0gMAotICAgICAgJiYgc3RyY21wKG5hbWUsICJvcGVuYm9vdCIpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogbG9vayBmb3IgYW4gZWxmIG5vdGUgc2VjdGlvbiwgZW50ZXIgaXRzIHZhbHVlcyBpbnRvIHRoZSBkZXZpY2UgdHJlZSAqLwotICBtZW1zZXQoJm5vdGUsIDAsIHNpemVvZihub3RlKSk7Ci0gIGlmIChpbWFnZSAhPSBOVUxMKQotICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyhpbWFnZSwgbWFwX292ZXJfY2hpcnBfbm90ZSwgJm5vdGUpOwotICBpZiAobmFtZSA9PSBOVUxMICYmIGltYWdlICE9IE5VTEwgJiYgbm90ZS5mb3VuZCA9PSBub3RlX21pc3NpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQXNzdW1lIHRoYXQgaXQgaXMgYSBjaGlycCBlbXVsYXRpb24gKi8KLQotICBjaGlycCA9IFpBTExPQyhvc19lbXVsX2RhdGEpOwotICBjaGlycC0+cm9vdCA9IHJvb3Q7Ci0gIGNoaXJwLT5zZXJ2aWNlcyA9IHNlcnZpY2VzOwotCi0gIC8qIHRoZSByb290IG5vZGUgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL25hbWUgXCJncGwsY2xheXRvbiIpOwotCi0gIC8qIGRlZmF1bHQgb3B0aW9ucyAqLwotICBlbXVsX2FkZF90cmVlX29wdGlvbnMocm9vdCwgaW1hZ2UsICJjaGlycCIsICJvZWEiLAotCQkJMCAvKm9lYS1pbnRlcnJ1cHQtcHJlZml4Ki8pOwotCi0gIC8qIGhhcmR3YXJlICovCi0gIGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUocm9vdCk7Ci0KLSAgLyogYmFzaWMgaW5mb3JtYXRpb24gKi8KLSAgY2hpcnAtPm1lbW9yeV9zaXplCi0gICAgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvb2VhLW1lbW9yeS1zaXplIik7Ci0gIGNoaXJwLT5saXR0bGVfZW5kaWFuCi0gICAgPSB0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8iKTsKLSAgY2hpcnAtPmZsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQotICAgID0gdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL2Zsb2F0aW5nLXBvaW50PyIpOwotICBjaGlycC0+aW50ZXJydXB0X3ByZWZpeCA9Ci0gICAgdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1pbnRlcnJ1cHQtcHJlZml4Iik7Ci0KLQotICAvKiBQZXJmb3JtIGFuIGludGVydW0gbGF5b3V0IG9mIHRoZSBvcGVuYm9vdCBmaXJtd2FyZSBpbiBtZW1vcnkgKi8KLQotCi0gIC8qIGEgcGFnZSBmb3IgZmlybXdhcmUgY2FsbHMgKi8KLSAgY2hpcnAtPnNpemVvZl9jb2RlID0gNDA5NjsKLSAgY2hpcnAtPmNvZGVfb2Zmc2V0ID0gMHg0MDAwOyAvKiBwb3NzaWJsZSBzcGFjZSBmb3IgaW50ZXJydXB0IHRhYmxlICovCi0KLSAgLyogdGhlIHN0YWNrICovCi0gIGNoaXJwLT5zaXplb2Zfc3RhY2sgPSAzMiAqIDEwMjQ7Ci0gIGNoaXJwLT5zdGFja19vZmZzZXQgPSBjaGlycC0+Y29kZV9vZmZzZXQgKyBjaGlycC0+c2l6ZW9mX2NvZGU7Ci0KLSAgLyogdGhlIGhhc2ggdGFibGUgKi8KLSAgaWYgKCFub3RlLmRlc2MucmVhbF9tb2RlKSB7Ci0gICAgY2hpcnAtPm5yX3BhZ2VfdGFibGVfZW50cnlfZ3JvdXBzID0gKGNoaXJwLT5tZW1vcnlfc2l6ZSA8IDB4ODAwMDAwCi0JCQkJCSA/IDEwMjQgLyogbWluIGFsbG93ZWQgKi8KLQkJCQkJIDogKGNoaXJwLT5tZW1vcnlfc2l6ZSAvIDQwOTYgLyAyKSk7Ci0gICAgY2hpcnAtPnNpemVvZl9odGFiID0gY2hpcnAtPm5yX3BhZ2VfdGFibGVfZW50cnlfZ3JvdXBzICogNjQ7Ci0gIH0KLSAgY2hpcnAtPmh0YWJfb2Zmc2V0ID0gY2hpcnAtPnN0YWNrX29mZnNldCArIGNoaXJwLT5zaXplb2Zfc3RhY2s7Ci0KLSAgLyogdGhlIGFjdHVhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkICovCi0gIGNoaXJwLT5yZWFsX3NpemUgPSBjaGlycC0+aHRhYl9vZmZzZXQgKyBjaGlycC0+c2l6ZW9mX2h0YWI7Ci0KLQotICAvKiBub3cgZ28gdGhyb3VnaCBhbmQgc2VlIGlmIGl0IGZpdHMgaW4gd2hhdCBpcyBhdmFpbGFibGUgKi8KLQotCi0gIC8qIHJlc29sdmUgcmVhbC1tb2RlPyAqLwotICBpZiAobm90ZS5mb3VuZCA9PSBub3RlX2NvcnJlY3QpCi0gICAgY2hpcnAtPnJlYWxfbW9kZSA9IG5vdGUuZGVzYy5yZWFsX21vZGU7Ci0gIGVsc2UgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1tb2RlPyIpICE9IE5VTEwpCi0gICAgY2hpcnAtPnJlYWxfbW9kZSA9IHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9yZWFsLW1vZGU/Iik7Ci0gIGVsc2UKLSAgICBjaGlycC0+cmVhbF9tb2RlID0gMDsKLSAgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1tb2RlPyIpICE9IE5VTEwpIHsKLSAgICBpZiAoIWNoaXJwLT5yZWFsX21vZGUKLQkhPSAhdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtbW9kZT8iKSkKLSAgICAgIGVycm9yKCJjaGlycDogL29wdGlvbnMvcmVhbC1tb2RlPyBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOwotICB9Ci0gIGVsc2UKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy9yZWFsLW1vZGU/ICVzIiwKLQkgICAgICAgY2hpcnAtPnJlYWxfbW9kZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0gIC8qIHJlc29sdmUgcmVhbC1iYXNlICovCi0gIGlmIChub3RlLmZvdW5kID09IG5vdGVfY29ycmVjdAotICAgICAgJiYgbm90ZS5kZXNjLnJlYWxfYmFzZSAhPSAoc2lnbmVkMzIpLTEpCi0gICAgY2hpcnAtPnJlYWxfYmFzZSA9IG5vdGUuZGVzYy5yZWFsX2Jhc2U7Ci0gIGVsc2UgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1iYXNlIikgIT0gTlVMTCkKLSAgICBjaGlycC0+cmVhbF9iYXNlID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtYmFzZSIpOwotICBlbHNlCi0gICAgY2hpcnAtPnJlYWxfYmFzZSA9IGNoaXJwLT5tZW1vcnlfc2l6ZSAtIGNoaXJwLT5yZWFsX3NpemU7Ci0gIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtYmFzZSIpICE9IE5VTEwpIHsKLSAgICBpZiAoY2hpcnAtPnJlYWxfYmFzZSAhPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1iYXNlIikpCi0gICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL3JlYWwtYmFzZSBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOwotICB9Ci0gIGVsc2UKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy9yZWFsLWJhc2UgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+cmVhbF9iYXNlKTsKLQotICAvKiByZXNvbHZlIHJlYWwtc2l6ZSAqLwotICBpZiAobm90ZS5mb3VuZCA9PSBub3RlX2NvcnJlY3QKLSAgICAgICYmIG5vdGUuZGVzYy5yZWFsX3NpemUgIT0gKHNpZ25lZDMyKS0xCi0gICAgICAmJiBub3RlLmRlc2MucmVhbF9zaXplICE9IDAKLSAgICAgICYmIGNoaXJwLT5yZWFsX3NpemUgPiBub3RlLmRlc2MucmVhbF9zaXplKQotICAgIGVycm9yKCJjaGlycDogaW5zdWZmaWNpZW50IHBoeXNpY2FsIG1lbW9yeSBmb3IgZmlybXdhcmVcbiIpOwotICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9yZWFsLXNpemUiKSAhPSBOVUxMKSB7Ci0gICAgaWYgKGNoaXJwLT5yZWFsX3NpemUgPiB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1zaXplIikpCi0gICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL3JlYWwtc2l6ZSBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOwotICB9Ci0gIGVsc2UKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy9yZWFsLXNpemUgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+cmVhbF9zaXplKTsKLQotICAvKiByZXNvbHZlIHZpcnQtYmFzZSAqLwotICBpZiAoY2hpcnAtPnJlYWxfbW9kZSkKLSAgICBjaGlycC0+dmlydF9iYXNlID0gY2hpcnAtPnJlYWxfYmFzZTsKLSAgZWxzZSBpZiAobm90ZS5mb3VuZCA9PSBub3RlX2NvcnJlY3QgJiYgbm90ZS5kZXNjLnZpcnRfYmFzZSAhPSAtMSkKLSAgICBjaGlycC0+dmlydF9iYXNlID0gbm90ZS5kZXNjLnZpcnRfYmFzZTsKLSAgZWxzZSBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy92aXJ0LWJhc2UiKSAhPSBOVUxMKQotICAgIGNoaXJwLT52aXJ0X2Jhc2UgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvdmlydC1iYXNlIik7Ci0gIGVsc2UKLSAgICBjaGlycC0+dmlydF9iYXNlID0gQ0hJUlBfU1RBUlRfQUREUkVTUzsKLSAgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvdmlydC1iYXNlIikgIT0gTlVMTCkgewotICAgIHVuc2lnbmVkX3dvcmQgdmlydF9iYXNlID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3ZpcnQtYmFzZSIpOwotICAgIGlmICh2aXJ0X2Jhc2UgIT0gLTEgJiYgY2hpcnAtPnZpcnRfYmFzZSAhPSB2aXJ0X2Jhc2UpCi0gICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL3ZpcnQtYmFzZSBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOwotICB9Ci0gIGVsc2UKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy92aXJ0LWJhc2UgMHglbHgiLAotCSAgICAgICBjaGlycC0+cmVhbF9tb2RlID8gLTEgOiAodW5zaWduZWQgbG9uZyljaGlycC0+dmlydF9iYXNlKTsKLQotICAvKiByZXNvbHZlIHZpcnQtc2l6ZSAqLwotICBjaGlycC0+dmlydF9zaXplID0gY2hpcnAtPnJlYWxfc2l6ZTsKLSAgaWYgKG5vdGUuZm91bmQgPT0gbm90ZV9jb3JyZWN0Ci0gICAgICYmIG5vdGUuZGVzYy52aXJ0X3NpemUgIT0gKHNpZ25lZDMyKS0xCi0gICAgICAmJiBub3RlLmRlc2MudmlydF9zaXplICE9IDAKLSAgICAgICYmICFjaGlycC0+cmVhbF9tb2RlCi0gICAgICAmJiBjaGlycC0+dmlydF9zaXplID4gbm90ZS5kZXNjLnZpcnRfc2l6ZSkKLSAgICBlcnJvcigiY2hpcnA6IGluc3VmZmljZW50IHZpcnR1YWwgbWVtb3J5IGZvciBmaXJtd2FyZVxuIik7Ci0gIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3ZpcnQtc2l6ZSIpICE9IE5VTEwpIHsKLSAgICBpZiAoY2hpcnAtPnZpcnRfc2l6ZSA+IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy92aXJ0LXNpemUiKSkKLSAgICAgIGVycm9yKCJjaGlycDogL29wdGlvbnMvdmlydC1zaXplIGNvbmZsaWN0cyB3aXRoIG5vdGUgc2VjdGlvblxuIik7Ci0gIH0KLSAgZWxzZQotICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcHRpb25zL3ZpcnQtc2l6ZSAweCVseCIsCi0JICAgICAgIGNoaXJwLT5yZWFsX21vZGUgPyAtMSA6ICh1bnNpZ25lZCBsb25nKWNoaXJwLT52aXJ0X3NpemUpOwotCi0gIC8qIHJlc29sdmUgbG9hZC1iYXNlICovCi0gIGlmIChub3RlLmZvdW5kID09IG5vdGVfY29ycmVjdAotICAgICAgJiYgbm90ZS5kZXNjLmxvYWRfYmFzZSAhPSAoc2lnbmVkMzIpLTEpCi0gICAgY2hpcnAtPmxvYWRfYmFzZSA9IG5vdGUuZGVzYy5sb2FkX2Jhc2U7Ci0gIGVsc2UgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbG9hZC1iYXNlIikgIT0gTlVMTCkKLSAgICBjaGlycC0+bG9hZF9iYXNlID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xvYWQtYmFzZSIpOwotICBlbHNlCi0gICAgY2hpcnAtPmxvYWRfYmFzZSA9IENISVJQX0xPQURfQkFTRTsKLSAgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbG9hZC1iYXNlIikgIT0gTlVMTCkgewotICAgIGlmIChjaGlycC0+bG9hZF9iYXNlICE9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9sb2FkLWJhc2UiKSkKLSAgICAgIGVycm9yKCJjaGlycDogL29wdGlvbnMvbG9hZC1iYXNlIGNvbmZsaWN0cyB3aXRoIG5vdGUgc2VjdGlvblxuIik7Ci0gIH0KLSAgZWxzZQotICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcHRpb25zL2xvYWQtYmFzZSAweCVseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5sb2FkX2Jhc2UpOwotCi0gIC8qIG5vdyBhZGp1c3QgdGhlIHByZWxpbWluYXJ5IGZpcm13YXJlIGFkZHJlc3NlcyB0byBmaW5hbCB2YWx1ZXMgKi8KLSAgY2hpcnAtPmNvZGVfcmEgPSBjaGlycC0+Y29kZV9vZmZzZXQgKyBjaGlycC0+cmVhbF9iYXNlOwotICBjaGlycC0+c3RhY2tfcmEgPSBjaGlycC0+c3RhY2tfb2Zmc2V0ICsgY2hpcnAtPnJlYWxfYmFzZTsKLSAgY2hpcnAtPmh0YWJfcmEgPSBjaGlycC0+aHRhYl9vZmZzZXQgKyBjaGlycC0+cmVhbF9iYXNlOwotCi0gIC8qIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gIEluIHJlYWwgbW9kZSB0aGVzZSBhcmUgcmVhbCBhZGRyZXNzZXMuICovCi0KLSAgY2hpcnAtPmNvZGVfdmEgPSBjaGlycC0+Y29kZV9vZmZzZXQgKyBjaGlycC0+dmlydF9iYXNlOwotICBjaGlycC0+c3RhY2tfdmEgPSBjaGlycC0+c3RhY2tfb2Zmc2V0ICsgY2hpcnAtPnZpcnRfYmFzZTsKLSAgY2hpcnAtPmh0YWJfdmEgPSBjaGlycC0+aHRhYl9vZmZzZXQgKyBjaGlycC0+dmlydF9iYXNlOwotCi0gIGNoaXJwLT5jb2RlX2NsaWVudF92YSA9IGNoaXJwLT5jb2RlX3ZhOwotICBjaGlycC0+Y29kZV9jbGllbnRfcmEgPSBjaGlycC0+Y29kZV9yYTsKLQotICBjaGlycC0+Y29kZV9jYWxsYmFja192YSA9IGNoaXJwLT5jb2RlX2NsaWVudF92YSArIDE2OwotICBjaGlycC0+Y29kZV9jYWxsYmFja19yYSA9IGNoaXJwLT5jb2RlX2NsaWVudF9yYSArIDE2OwotCi0gIGNoaXJwLT5jb2RlX2xvb3BfdmEgPSBjaGlycC0+Y29kZV9jYWxsYmFja192YSArIDE2OwotICBjaGlycC0+Y29kZV9sb29wX3JhID0gY2hpcnAtPmNvZGVfY2FsbGJhY2tfcmEgKyAxNjsKLQotICAvKiBpbml0aWFsaXphdGlvbiAqLwotCi0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0Iik7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyIik7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyLzAucGMgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpYmZkX2dldF9zdGFydF9hZGRyZXNzKGltYWdlKSk7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3BjIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2xvb3BfdmEpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9tc3IgMHgleCIsCi0JICAgICAobXNyX21hY2hpbmVfY2hlY2tfZW5hYmxlCi0JICAgICAgfCAoY2hpcnAtPnJlYWxfbW9kZQotCQkgPyAwCi0JCSA6IChtc3JfaW5zdHJ1Y3Rpb25fcmVsb2NhdGUKLQkJICAgIHwgbXNyX2RhdGFfcmVsb2NhdGUpKQotCSAgICAgIHwgKGNoaXJwLT5saXR0bGVfZW5kaWFuCi0JCSA/IChtc3JfbGl0dGxlX2VuZGlhbl9tb2RlCi0JCSAgICB8IG1zcl9pbnRlcnJ1cHRfbGl0dGxlX2VuZGlhbl9tb2RlKQotCQkgOiAwKQotCSAgICAgIHwgKGNoaXJwLT5mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKLQkJID8gbXNyX2Zsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQotCQkgOiAwKQotCSAgICAgIHwgKGNoaXJwLT5pbnRlcnJ1cHRfcHJlZml4Ci0JCSA/IG1zcl9pbnRlcnJ1cHRfcHJlZml4Ci0JCSA6IDApCi0JICAgICAgKSk7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3NkcjEgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpKGNoaXJwLT5odGFiX3JhCi0JCQkgICAgIHwgTUFTSzMyKDE2LCAyMikKLQkJCSAgICAgfCAoKGNoaXJwLT5zaXplb2ZfaHRhYiAtIDEpID4+IDE2KSkpOwotICAvKiBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgc2VnbWVudCByZWdpc3RlcnMgbWFwIHN0cmFpZ2h0IHRocm91Z2ggKi8KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9zciVkIDB4JWx4IiwKLQkgICAgICAgaSwgKHVuc2lnbmVkIGxvbmcpaSk7Ci0gIH0KLQotICAvKiBlc3RhYmxpc2ggYW4gaW5pdGlhbCBzdGF0ZSBmb3IgYWxsIHByb2Nlc3NvcnMgKi8KLQotCi0gIC8qIHRoZSBjbGllbnQgaW50ZXJmYWNlIGFkZHJlc3MgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcjUgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmNvZGVfY2xpZW50X3ZhKTsKLSAgLyogYSBzdGFjayAqLwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9zcCAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZykoY2hpcnAtPnN0YWNrX3ZhICsgY2hpcnAtPnNpemVvZl9zdGFjayAtIDE2KSk7Ci0gIC8qIGluIGNocnAgbW9kZSBhbnkgYXJndW1lbnRzIGVuZCB1cCBiZWluZyBjb25jYXRpbmF0ZWQgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvc3RhY2svc3RhY2stdHlwZSBjaGlycCIpOwotCi0KLSAgLyogY2xpZW50IGludGVyZmFjZSAtIGVtdWwtY2FsbCBmb2xsb3dlZCBieSByZXR1cm4gaW5zdHJ1Y3Rpb24gKi8KLQotCi0gIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9kYXRhQDB4JWx4IiwKLQkJICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2NsaWVudF9yYSk7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImNsaWVudC1pbnRlcmZhY2UgaW5zdHJ1Y3Rpb24iKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9yZWFsLWFkZHJlc3MgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmNvZGVfY2xpZW50X3JhKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWVtdWxfY2FsbF9pbnN0cnVjdGlvbik7Ci0KLSAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2RhdGFAMHglbHgiLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpKGNoaXJwLT5jb2RlX2NsaWVudF9yYSArIDQpKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwiY2xpZW50LWludGVyZmFjZSByZXR1cm4gaW5zdHJ1Y3Rpb24iKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9yZWFsLWFkZHJlc3MgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpKGNoaXJwLT5jb2RlX2NsaWVudF9yYSArIDQpKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWVtdWxfYmxyX2luc3RydWN0aW9uKTsKLQotCi0gIC8qIHJldHVybiBhZGRyZXNzIGZvciBjbGllbnQgY2FsbGJhY2tzIC0gYW4gZW11bC1jYWxsIGluc3RydWN0aW9uCi0gICAgIHRoYXQgaXMgYWdhaW4gZm9sbG93ZWQgYnkgYSByZXR1cm4gaW5zdHJ1Y3Rpb24gKi8KLQotCi0gIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9kYXRhQDB4JWx4IiwKLQkJICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2NhbGxiYWNrX3JhKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwiY2xpZW50LWNhbGxiYWNrIGluc3RydWN0aW9uIik7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2NhbGxiYWNrX3JhKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWVtdWxfY2FsbF9pbnN0cnVjdGlvbik7Ci0KLSAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2RhdGFAMHglbHgiLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpKGNoaXJwLT5jb2RlX2NhbGxiYWNrX3JhICsgNCkpOwotICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJjbGllbnQtY2FsbGJhY2sgcmV0dXJuIGluc3RydWN0aW9uIik7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKShjaGlycC0+Y29kZV9jYWxsYmFja19yYSArIDQpKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWVtdWxfYmxyX2luc3RydWN0aW9uKTsKLQotICAvKiBsb29wIHRvIGtlZXAgb3RoZXIgcHJvY2Vzc29ycyBidXN5ICovCi0KLSAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2RhdGFAMHglbHgiLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmNvZGVfbG9vcF9yYSk7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcInByb2Nlc3NvciBidXN5IGxvb3AiKTsKLSAgdHJlZV9wYXJzZShub2RlLCAiLi9yZWFsLWFkZHJlc3MgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmNvZGVfbG9vcF9yYSk7Ci0gIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZyllbXVsX2xvb3BfaW5zdHJ1Y3Rpb24pOwotCi0gIC8qIGhhc2ggdGFibGUgKi8KLQotICAvKiBjcmVhdGUgYSBoYXNoIHRhYmxlICovCi0KLSAgaWYgKCFjaGlycC0+cmVhbF9tb2RlKSB7Ci0gICAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2h0YWJAMHglbHgiLAotCQkgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+aHRhYl9yYSk7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9jbGFpbSAwIik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9yZWFsLWFkZHJlc3MgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+aHRhYl9yYSk7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9uci1ieXRlcyAweCVseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5zaXplb2ZfaHRhYik7Ci0gIH0KLQotICAvKiBtYXAgaW4gdGhlIHN0YWNrICovCi0KLSAgaWYgKCFjaGlycC0+cmVhbF9tb2RlKSB7Ci0gICAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4JWx4IiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnN0YWNrX3JhKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJtYXAgaW4gdGhlIHN0YWNrIik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9jbGFpbSAxIik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi92aXJ0dWFsLWFkZHJlc3MgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+c3RhY2tfdmEpOwotICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnN0YWNrX3JhKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL25yLWJ5dGVzIDB4JWx4IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnNpemVvZl9zdGFjayk7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi93aW1nICVkIiwgMHg3KTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3BwICVkIiwgMHgyKTsKLSAgfQotCi0gIC8qIG1hcCBpbiB0aGUgY2hycCBvcGVuYm9vdCBjYWxsYmFjayBjb2RlICovCi0KLSAgaWYgKCFjaGlycC0+cmVhbF9tb2RlKSB7Ci0gICAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4JWx4IiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmNvZGVfcmEpOwotICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcIm1hcCBpbiBjaHJwIG9wZW5ib290IGNhbGxiYWNrIGNvZGUiKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL2NsYWltIDEiKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3ZpcnR1YWwtYWRkcmVzcyAweCVseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX3ZhKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX3JhKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL25yLWJ5dGVzIDB4JWx4IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnNpemVvZl9jb2RlKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3dpbWcgJWQiLCAweDcpOwotICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHAgJWQiLCAweDIpOwotICB9Ci0KLSAgLyogbWFwIGluIHRoZSBwcm9ncmFtIHRvIHJ1biAqLwotCi0gIGlmIChjaGlycC0+cmVhbF9tb2RlKSB7Ci0gICAgbm9kZSA9IHRyZWVfcGFyc2Uobm9kZSwgIi9vcGVucHJvbS9pbml0L2xvYWQtYmluYXJ5Iik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwibG9hZCB0aGUgYmluYXJ5Iik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9maWxlLW5hbWUgJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lKGltYWdlKSk7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9jbGFpbSAxIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4JWx4IiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmxvYWRfYmFzZSk7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwibG9hZCAmIG1hcCB0aGUgYmluYXJ5Iik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9jbGFpbSAxIik7Ci0gICAgdHJlZV9wYXJzZShub2RlLCAiLi9maWxlLW5hbWUgXCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUoaW1hZ2UpKTsKLSAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3dpbWcgJWQiLCAweDcpOwotICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHAgJWQiLCAweDIpOwotICB9Ci0KLSAgcmV0dXJuIGNoaXJwOwotfQotCi1zdGF0aWMgdm9pZAotZW11bF9jaGlycF9pbml0KG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhLAotCQlpbnQgbnJfY3B1cykKLXsKLSAgZW11bF9kYXRhLT5zdGF0ZSA9IHNlcnZpbmc7Ci19Ci0KLXN0YXRpYyBpbnQKLWVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbChjcHUgKnByb2Nlc3NvciwKLQkJCSAgICB1bnNpZ25lZF93b3JkIGNpYSwKLQkJCSAgICB1bnNpZ25lZF93b3JkIHJhLAotCQkJICAgIG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhKQotewotICB1bnNpZ25lZF93b3JkIHNlcnZpY2VfbmFtZV9hZGRyOwotICB1bnNpZ25lZF93b3JkIHJlc3VsdDsKLSAgY2hhciBzZXJ2aWNlX2J1ZlszMl07Ci0gIGNoYXIgKnNlcnZpY2VfbmFtZTsKLSAgY2hpcnBfc2VydmljZXMgKnNlcnZpY2U7Ci0KLSAgc3dpdGNoIChlbXVsX2RhdGEtPnN0YXRlKSB7Ci0KLSAgY2FzZSBzZXJ2aW5nOgotICAgIC8qIHdlIGFyZSB3YWl0aW5nIG9uIGFuIE9wZW5Cb290IHJlcXVlc3QgZnJvbSB0aGUgY2xpZW50IHByb2dyYW0KLSAgICAgICB2aWEgdGhlIGNsaWVudCBpbnRlcmZhY2UgKi8KLSAgICBpZiAoY2lhICE9IGVtdWxfZGF0YS0+Y29kZV9jbGllbnRfdmEpCi0gICAgICByZXR1cm4gMDsKLSAgICBlbXVsX2RhdGEtPnJldHVybl9hZGRyZXNzID0gTFI7Ci0gICAgZW11bF9kYXRhLT5hcmd1bWVudHMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXTsKLSAgICAvKiB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8gKi8KLSAgICBzZXJ2aWNlX25hbWVfYWRkciA9IGVtdWxfcmVhZF93b3JkKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdLAotCQkJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgc2VydmljZV9uYW1lID0gZW11bF9yZWFkX3N0cmluZyhzZXJ2aWNlX2J1Ziwgc2VydmljZV9uYW1lX2FkZHIsCi0JCQkJICAgIHNpemVvZihzZXJ2aWNlX2J1ZiksIHByb2Nlc3NvciwgY2lhKTsKLSAgICBlbXVsX2RhdGEtPm5fYXJncyA9IGVtdWxfcmVhZF93b3JkKGVtdWxfZGF0YS0+YXJndW1lbnRzICsgc2l6ZW9mKHVuc2lnbmVkX2NlbGwpLAotCQkJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgZW11bF9kYXRhLT5uX3JldHVybnMgPSBlbXVsX3JlYWRfd29yZChlbXVsX2RhdGEtPmFyZ3VtZW50cyArIDIgKiBzaXplb2YodW5zaWduZWRfY2VsbCksCi0JCQkJCSAgcHJvY2Vzc29yLCBjaWEpOwotICAgIC8qIHZlcmlmeSB3aGF0IHdhcyBwYXNzZWQgKi8KLSAgICBpZiAoc2VydmljZV9uYW1lX2FkZHIgPT0gMAotCXx8IHNlcnZpY2VfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICBlcnJvcigiT3BlbkZpcm13YXJlIGNhbGxlZCB3aXRoIGludmFsaWQgKE5VTEwpIHNlcnZpY2UgbmFtZSBmcm9tIDB4JWx4IHdpdGggYXJncyAweCVseFxuIiwKLQkgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9kYXRhLT5yZXR1cm5fYWRkcmVzcywKLQkgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9kYXRhLT5hcmd1bWVudHMpOwotICAgIH0KLSAgICBpZiAoZW11bF9kYXRhLT5uX2FyZ3MgPiA2KSB7IC8qIFNlZSBpZWUxMjc1IHJlcXVpcmVtZW50cyBvbiBuciByZXR1cm5zICovCi0gICAgICBlcnJvcigiT3BlbkZpcm13YXJlIHNlcnZpY2UgJXMgY2FsbGVkIGZyb20gMHglbHggd2l0aCBhcmdzIDB4JWx4LCB0b28gbWFueSBhcmdzICglZClcbiIsCi0JICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+cmV0dXJuX2FkZHJlc3MsCi0JICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+YXJndW1lbnRzLAotCSAgICBlbXVsX2RhdGEtPm5fcmV0dXJucyk7Ci0gICAgfQotICAgIGlmIChlbXVsX2RhdGEtPm5fcmV0dXJucyA+IDYpIHsKLSAgICAgIGVycm9yKCJPcGVuRmlybXdhcmUgc2VydmljZSAlcyBjYWxsZWQgZnJvbSAweCVseCB3aXRoIGFyZ3MgMHglbHgsICB3aXRoIHRvbyBtYW55IHJldHVybnMgKCVkKVxuIiwKLQkgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9kYXRhLT5yZXR1cm5fYWRkcmVzcywKLQkgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9kYXRhLT5hcmd1bWVudHMsCi0JICAgIGVtdWxfZGF0YS0+bl9hcmdzKTsKLSAgICB9Ci0gICAgLyogbG9vayBpdCB1cCAqLwotICAgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiJXMgY2FsbGVkIGZyb20gMHglbHggd2l0aCBhcmdzIDB4JWx4XG4iLAotCQkJICBzZXJ2aWNlX25hbWUsCi0JCQkgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+cmV0dXJuX2FkZHJlc3MsCi0JCQkgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+YXJndW1lbnRzKSk7Ci0gICAgc2VydmljZSA9IHNlcnZpY2VzOwotICAgIHdoaWxlIChzZXJ2aWNlLT5uYW1lICE9IE5VTEwgJiYgc3RyY21wKHNlcnZpY2UtPm5hbWUsIHNlcnZpY2VfbmFtZSkgIT0gMCkKLSAgICAgIHNlcnZpY2UrKzsKLSAgICAvKiBmb3VuZCBvciBub3Q/ICovCi0gICAgaWYgKHNlcnZpY2UtPm5hbWUgPT0gTlVMTCkgewotICAgICAgZXJyb3IoIk9wZW5Cb290IHNlcnZpY2UgYCVzJyBub3QgZm91bmRcbiIsIHNlcnZpY2VfbmFtZSk7Ci0gICAgICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIiVzIG5vdCBmb3VuZFxuIiwgc2VydmljZV9uYW1lKSk7Ci0gICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSA9IC0xOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGVtdWxfZGF0YS0+c2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAvKiBjYWxsIHVwb24gaXQgKi8KLSAgICAgIHJlc3VsdCA9IHNlcnZpY2UtPmhhbmRsZXIoZW11bF9kYXRhLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0JVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCIlcyBhYm9ydGVkIHdpdGggJWxkXG4iLCBzZXJ2aWNlX25hbWUsIChsb25nKXJlc3VsdCkpOwotICAgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSByZXN1bHQ7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCgpIHVua25vd24gaW50ZXJuYWwgc3RhdGVcbiIpOwotICAgIHJlc3VsdCA9IC0xOwotICAgIGJyZWFrOwotCi0gIH0KLQotICAvKiByZXR1cm4gdG8gY2FsbGVyIC0gaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoaXMgaXMgYSBmdW5jdGlvbiByZXR1cm4gKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IG9zX2VtdWwgZW11bF9jaGlycCA9IHsKLSAgImNoaXJwIiwKLSAgZW11bF9jaGlycF9jcmVhdGUsCi0gIGVtdWxfY2hpcnBfaW5pdCwKLSAgTlVMTCwgLypzeXN0ZW1fY2FsbCovCi0gIGVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCwKLSAgMCAvKmRhdGEqLwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfY2hpcnAuaCBiL3NpbS9wcGMvZW11bF9jaGlycC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjY1ZjVjLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZW11bF9jaGlycC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfRU1VTF9DSElSUF9IXwotI2RlZmluZSBfRU1VTF9DSElSUF9IXwotCi0vKiBFTVVMX0NISVJQOgotCi0gICBUaGUgZW11bGF0aW9uIG9mIHRoZSBPcGVuQm9vdCBjbGllbnQgaW50ZXJmYWNlIChhcyBkZWZpbmVkIGluIDEyNzUpCi0gICBpbGx1c3RyYXRlcyBob3cgaXQgaXMgcG9zc2libGUgZm9yIFBTSU0gdG8gaW1wbGVtZW50IGFuIGludGVyZmFjZQotICAgdGhhdCBpcyBib3RoIHJ1bm5pbmcgaW4gdmlydHVhbCBtZW1vcnkgYW5kIGlzIGNhbGxlZCB1c2luZyBhCi0gICBzdGFuZGFyZCBmdW5jdGlvbiBjYWxsIGludGVyZmFjZS4KLQotICAgVGhlIE9wZW5Cb290IGNsaWVudCBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgdHdvCi0gICBpbnN0cnVjdGlvbnM6Ci0KLSAgIAljbGllbnRfaW50ZXJmYWNlOgotCQk8ZW11bF9jYWxsPgotCQlibHIKLQotICAgQSBjbGllbnQgcHJvZ3JhbSBtYWtlcyBhIGZ1bmN0aW9uIGNhbGwgdG8gYGNsaWVudF9pbnRlcmZhY2UnIHVzaW5nCi0gICB0aGUgYGJsJyBpbnN0cnVjdGlvbi4gIFRoZSBzaW11bGF0b3Igd2lsbCB0aGVuIGV4ZWN1dGUgdGhlCi0gICA8ZW11bF9jYWxsPiBpbnN0cnVjdGlvbiAod2hpY2ggY2FsbHMgZW11bF9jaGlycCkgYW5kIHRoZW4gdGhlIGBibHInCi0gICB3aGljaCB3aWxsIHJldHVybiB0byB0aGUgY2FsbGVyLgotCi0gICBJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgdGhlIGBjbGllbnRfaW50ZXJmYWNlJyBlbnRyeSBwb2ludCwgd2hpbGUKLSAgIGEgY2xpZW50IHJlcXVlc3QgaXMgYmVpbmcgaGFuZGxlZCwgZW11bF9jaGlycCBwYXRjaGVzICh3ZWxsIGl0IHdpbGwKLSAgIG9uZSBkYXkpIHRoZSBkYXRhIGFjY2VzcyBleGNlcHRpb24gdmVjdG9yIHdpdGggYSA8ZW11bF9jYWxsPgotICAgaW5zdHJ1Y3Rpb24uICBCeSBkb2luZyB0aGlzLCBlbXVsX2NoaXJwIGlzIGFibGUgdG8gY2F0Y2ggYW5kIGhhbmRsZQotICAgYW55IGludmFsaWQgZGF0YSBhY2Nlc3NlcyBpdCBtYWtlcyB3aGlsZSBlbXVsYXRpbmcgYSBjbGllbnQgY2FsbC4KLQotICAgV2hlbiBzdWNoIGFuIGV4Y2VwdGlvbiBvY2N1cmVzLCBlbXVsX2NoaXJwIGlzIGFibGUgdG8gcmVjb3ZlciBieQotICAgcmVzdG9yaW5nIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gY2FsbGluZyB0aGUgY2xpZW50cyBjYWxsYmFjawotICAgaW50ZXJmYWNlIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gcmVjb3ZlciBmcm9tIHRoZSBkYXRhIGV4Y2VwdGlvbi4KLQotICAgSGFuZGxpbmcgdGhpcyBhcmUgdGhlIGVtdWxfY2hpcnAgc3RhdGVzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aW5nLS0tLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgIHwKLSAgIEVtdWxhdGlvbiBjb21wbGVhdGVkICAgICBeICAgICAgICAgICB2IENsaWVudCBtYWtlcyBjYWxsIHRvCi0gICAgIC0gcmVzdG9yZSBpbnQgdmVjdG9ycyAgfCAgICAgICAgICAgfCBlbXVsYXRlZCBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICB2ICAgLSBwYXRjaCBleGNlcHRpb24gdmVjdG9ycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAtZW11bGF0aW5nLS4gZW11bGF0aW5nIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHYgRW11bGF0aW9uIGVuY291bnRlcnMKLSAgIENsaWVudCBjYWxsYmFjayByZWNvdmVycyBeICAgICAgICAgICB8IGRhdGEgYWNjZXNzIGV4Y2VwdGlvbgotICAgZnJvbSBkYXRhIGV4Y2VwdGlvbiBhbmQgIHwgICAgICAgICAgIHYgICAtIHJlLWVuYWJsZSB2bQotICAgcmV0dXJucy4gICAgICAgICAgICAgICAgIF4gICAgICAgICAgIHwgICAtIGNhbGwgY2xpZW50IGNhbGxiYWNrCi0gICAgIC0gcmVzdGFydCByZXF1ZXN0ICAgICAgfCAgICAgICAgICAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYC0tZmF1bHRpbmcKLSAgICovCi0KLQotZXh0ZXJuIGNvbnN0IG9zX2VtdWwgZW11bF9jaGlycDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfZ2VuZXJpYy5jIGIvc2ltL3BwYy9lbXVsX2dlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MzE3NS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2VtdWxfZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICAgKi8KLQotCi0jaWZuZGVmIF9FTVVMX0dFTkVSSUNfQ18KLSNkZWZpbmUgX0VNVUxfR0VORVJJQ19DXwotCi0jaW5jbHVkZSAiZW11bF9nZW5lcmljLmgiCi0KLSNpZm5kZWYgU1RBVElDX0lOTElORV9FTVVMX0dFTkVSSUMKLSNkZWZpbmUgU1RBVElDX0lOTElORV9FTVVMX0dFTkVSSUMgU1RBVElDX0lOTElORQotI2VuZGlmCi0KLQotU1RBVElDX0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZAotZW11bF9zeXNjYWxsX2VudGVyKGVtdWxfc3lzY2FsbCAqZW11bCwKLQkJICAgaW50IGNhbGwsCi0JCSAgIGludCBhcmcwLAotCQkgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHByaW50Zl9maWx0ZXJlZCgiJWQ6MHglbHg6JXMoIiwKLQkJICBjcHVfbnIocHJvY2Vzc29yKSArIDEsCi0JCSAgKGxvbmcpY2lhLAotCQkgIGVtdWwtPnN5c2NhbGxfZGVzY3JpcHRvcltjYWxsXS5uYW1lKTsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCi1lbXVsX3N5c2NhbGxfZXhpdChlbXVsX3N5c2NhbGwgKmVtdWwsCi0JCSAgaW50IGNhbGwsCi0JCSAgaW50IGFyZzAsCi0JCSAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBzdGF0dXMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXTsKLSAgaW50IGVycm9yID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbMF07Ci0gIHByaW50Zl9maWx0ZXJlZCgiKT0lZCIsIHN0YXR1cyk7Ci0gIGlmIChlcnJvciA+IDAgJiYgZXJyb3IgPCBlbXVsLT5ucl9lcnJvcl9uYW1lcykKLSAgICBwcmludGZfZmlsdGVyZWQoIlslc10iLCBlbXVsLT5lcnJvcl9uYW1lc1tlcnJvcl0pOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci19Ci0KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB1bnNpZ25lZDY0Ci1lbXVsX3JlYWRfZ3ByNjQoY3B1ICpwcm9jZXNzb3IsCi0JCWludCBnKQotewotICB1bnNpZ25lZDMyIGhpOwotICB1bnNpZ25lZDMyIGxvOwotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSB7Ci0gICAgaGkgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltnXTsKLSAgICBsbyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2crMV07Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbG8gPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltnXTsKLSAgICBoaSA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2crMV07Ci0gIH0KLSAgcmV0dXJuIChJTlNFUlRFRDY0KGhpLCAwLCAzMSkgfCBJTlNFUlRFRDY0KGxvLCAzMiwgNjMpKTsKLX0KLQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKLWVtdWxfd3JpdGVfZ3ByNjQoY3B1ICpwcm9jZXNzb3IsCi0JCSBpbnQgZywKLQkJIHVuc2lnbmVkNjQgdmFsKQotewotICB1bnNpZ25lZDMyIGhpID0gRVhUUkFDVEVENjQodmFsLCAwLCAzMSk7Ci0gIHVuc2lnbmVkMzIgbG8gPSBFWFRSQUNURUQ2NCh2YWwsIDMyLCA2Myk7Ci0gIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltnXSA9IGhpOwotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2crMV0gPSBsbzsKLSAgfQotICBlbHNlIHsKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltnXSA9IGxvOwotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2crMV0gPSBoaTsKLSAgfQotfQotCi0KLUlOTElORV9FTVVMX0dFTkVSSUMgY2hhciAqCi1lbXVsX3JlYWRfc3RyaW5nKGNoYXIgKmRlc3QsCi0JCSB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSB1bnNpZ25lZCBucl9ieXRlcywKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkIG5yX21vdmVkID0gMDsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgd2hpbGUgKDEpIHsKLSAgICBkZXN0W25yX21vdmVkXSA9IHZtX2RhdGFfbWFwX3JlYWRfMShjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKLQkJCQkJYWRkciArIG5yX21vdmVkLAotCQkJCQlwcm9jZXNzb3IsIGNpYSk7Ci0gICAgaWYgKGRlc3RbbnJfbW92ZWRdID09ICdcMCcgfHwgbnJfbW92ZWQgPj0gbnJfYnl0ZXMpCi0gICAgICBicmVhazsKLSAgICBucl9tb3ZlZCsrOwotICB9Ci0gIGRlc3RbbnJfbW92ZWRdID0gJ1wwJzsKLSAgcmV0dXJuIGRlc3Q7Ci19Ci0KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCi1lbXVsX3dyaXRlX3N0YXR1cyhjcHUgKnByb2Nlc3NvciwKLQkJICBpbnQgc3RhdHVzLAotCQkgIGludCBlcnJubykKLXsKLSAgaWYgKHN0YXR1cyA9PSAtMSAmJiBlcnJubyAhPSAwKSB7Ci0gICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSBlcnJubzsKLSAgICBDUl9TRVQoMCwgY3JfaV9zdW1tYXJ5X292ZXJmbG93KTsKLSAgfQotICBlbHNlIHsKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSA9IHN0YXR1czsKLSAgICBDUl9TRVQoMCwgMCk7Ci0gIH0KLX0KLQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKLWVtdWxfd3JpdGUyX3N0YXR1cyhjcHUgKnByb2Nlc3NvciwKLQkJICAgaW50IHN0YXR1czEsCi0JCSAgIGludCBzdGF0dXMyLAotCQkgICBpbnQgZXJybm8pCi17Ci0gIGlmIChzdGF0dXMxID09IC0xICYmIGVycm5vICE9IDApIHsKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSA9IGVycm5vOwotICAgIENSX1NFVCgwLCBjcl9pX3N1bW1hcnlfb3ZlcmZsb3cpOwotICB9Ci0gIGVsc2UgewotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdID0gc3RhdHVzMTsKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcls0XSA9IHN0YXR1czI7Ci0gICAgQ1JfU0VUKDAsIDApOwotICB9Ci19Ci0KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB1bnNpZ25lZF93b3JkCi1lbXVsX3JlYWRfd29yZCh1bnNpZ25lZF93b3JkIGFkZHIsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgcmV0dXJuIHZtX2RhdGFfbWFwX3JlYWRfd29yZChjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKLQkJCSAgICAgICBhZGRyLAotCQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKLWVtdWxfd3JpdGVfd29yZCh1bnNpZ25lZF93b3JkIGFkZHIsCi0JCXVuc2lnbmVkX3dvcmQgYnVmLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHZtX2RhdGFfbWFwX3dyaXRlX3dvcmQoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCi0JCQkgYWRkciwKLQkJCSBidWYsCi0JCQkgcHJvY2Vzc29yLCBjaWEpOwotfQotCi0KLUlOTElORV9FTVVMX0dFTkVSSUMgdm9pZAotZW11bF93cml0ZV9idWZmZXIoY29uc3Qgdm9pZCAqc291cmNlLAotCQkgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICB1bnNpZ25lZCBucl9ieXRlcywKLQkJICBjcHUgKnByb2Nlc3NvciwKLQkJICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IG5yX21vdmVkOwotICBmb3IgKG5yX21vdmVkID0gMDsgbnJfbW92ZWQgPCBucl9ieXRlczsgbnJfbW92ZWQrKykgewotICAgIHZtX2RhdGFfbWFwX3dyaXRlXzEoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCi0JCQlhZGRyICsgbnJfbW92ZWQsCi0JCQkoKGNvbnN0IGNoYXIqKXNvdXJjZSlbbnJfbW92ZWRdLAotCQkJcHJvY2Vzc29yLCBjaWEpOwotICB9Ci19Ci0KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCi1lbXVsX3JlYWRfYnVmZmVyKHZvaWQgKmRlc3QsCi0JCSB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSB1bnNpZ25lZCBucl9ieXRlcywKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBucl9tb3ZlZDsKLSAgZm9yIChucl9tb3ZlZCA9IDA7IG5yX21vdmVkIDwgbnJfYnl0ZXM7IG5yX21vdmVkKyspIHsKLSAgICAoKGNoYXIqKWRlc3QpW25yX21vdmVkXSA9IHZtX2RhdGFfbWFwX3JlYWRfMShjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKLQkJCQkJCSBhZGRyICsgbnJfbW92ZWQsCi0JCQkJCQkgcHJvY2Vzc29yLCBjaWEpOwotICB9Ci19Ci0KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCi1lbXVsX2RvX3N5c3RlbV9jYWxsKG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhLAotCQkgICAgZW11bF9zeXNjYWxsICplbXVsLAotCQkgICAgdW5zaWduZWQgY2FsbCwKLQkJICAgIGNvbnN0IGludCBhcmcwLAotCQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZW11bF9zeXNjYWxsX2hhbmRsZXIgKmhhbmRsZXIgPSBOVUxMOwotICBpZiAoY2FsbCA+PSBlbXVsLT5ucl9zeXN0ZW1fY2FsbHMpCi0gICAgZXJyb3IoImRvX2NhbGwoKSBvc19lbXVsIGNhbGwgJWQgb3V0LW9mLXJhbmdlXG4iLCBjYWxsKTsKLQotICBoYW5kbGVyID0gZW11bC0+c3lzY2FsbF9kZXNjcmlwdG9yW2NhbGxdLmhhbmRsZXI7Ci0gIGlmIChoYW5kbGVyID09IE5VTEwpIHsKLSAgICBpZiAoZW11bC0+c3lzY2FsbF9kZXNjcmlwdG9yW2NhbGxdLm5hbWUpIHsKLSAgICAgIGVycm9yKCJkb19jYWxsKCkgdW5pbXBsZW1lbnRlZCBjYWxsICVzXG4iLCBlbXVsLT5zeXNjYWxsX2Rlc2NyaXB0b3JbY2FsbF0ubmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVycm9yKCJkb19jYWxsKCkgdW5pbXBsZW1lbnRlZCBjYWxsICVkXG4iLCBjYWxsKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgZW11bF9zeXNjYWxsX2VudGVyKGVtdWwsIGNhbGwsIGFyZzAsIHByb2Nlc3NvciwgY2lhKTsKLQotICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclswXSA9IDA7IC8qIGRlZmF1bHQgc3VjY2VzcyAqLwotICBoYW5kbGVyKGVtdWxfZGF0YSwgY2FsbCwgYXJnMCwgcHJvY2Vzc29yLCBjaWEpOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBlbXVsX3N5c2NhbGxfZXhpdChlbXVsLCBjYWxsLCBhcmcwLCBwcm9jZXNzb3IsIGNpYSk7Ci19Ci0KLQotLyogZGVmYXVsdCBzaXplIGZvciB0aGUgZmlyc3QgYmFuayBvZiBtZW1vcnkgKi8KLQotI2lmbmRlZiBPRUFfTUVNT1JZX1NJWkUKLSNkZWZpbmUgT0VBX01FTU9SWV9TSVpFIDB4MTAwMDAwCi0jZW5kaWYKLQotCi0vKiBBZGQgb3B0aW9ucyB0byB0aGUgZGV2aWNlIHRyZWUgKi8KLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCi1lbXVsX2FkZF90cmVlX29wdGlvbnMoZGV2aWNlICp0cmVlLAotCQkgICAgICBiZmQgKmltYWdlLAotCQkgICAgICBjb25zdCBjaGFyICplbXVsLAotCQkgICAgICBjb25zdCBjaGFyICplbnYsCi0JCSAgICAgIGludCBvZWFfaW50ZXJydXB0X3ByZWZpeCkKLXsKLSAgaW50IGxpdHRsZV9lbmRpYW4gPSAwOwotCi0gIC8qIHNvcnQgb3V0IGxpdHRsZSBlbmRpYW4gKi8KLSAgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eSh0cmVlLCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8iKSkKLSAgICBsaXR0bGVfZW5kaWFuID0gdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkodHJlZSwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/Iik7Ci0gIGVsc2UgewotI2lmZGVmIGJmZF9saXR0bGVfZW5kaWFuCS8qIG5ldyBiZmQgKi8KLSAgICBsaXR0bGVfZW5kaWFuID0gKGltYWdlICE9IE5VTEwgJiYgYmZkX2xpdHRsZV9lbmRpYW4oaW1hZ2UpKTsKLSNlbHNlCi0gICAgbGl0dGxlX2VuZGlhbiA9IChpbWFnZSAhPSBOVUxMICYmCi0JCSAgICAgIWltYWdlLT54dmVjLT5ieXRlb3JkZXJfYmlnX3ApOwotI2VuZGlmCi0gICAgdHJlZV9wYXJzZSh0cmVlLCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8gJXMiLAotCSAgICAgICBsaXR0bGVfZW5kaWFuID8gInRydWUiIDogImZhbHNlIik7Ci0gIH0KLQotICAvKiBtaXNjIG90aGVyIHN0dWZmICovCi0gIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSAweCV4IiwKLQkgICAgIE9FQV9NRU1PUllfU0laRSk7Ci0gIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1pbnRlcnJ1cHQtcHJlZml4ICVkIiwKLQkgICAgIG9lYV9pbnRlcnJ1cHRfcHJlZml4KTsKLSAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvc21wIDEiKTsKLSAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvZW52ICVzIiwgZW52KTsKLSAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvb3MtZW11bCAlcyIsIGVtdWwpOwotICB0cmVlX3BhcnNlKHRyZWUsICIvb3BlbnByb20vb3B0aW9ucy9zdHJpY3QtYWxpZ25tZW50PyAlcyIsCi0JICAgICAoV0lUSF9BTElHTk1FTlQgPT0gU1RSSUNUX0FMSUdOTUVOVCkKLQkgICAgID8gInRydWUiIDogImZhbHNlIik7Ci0gIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL2Zsb2F0aW5nLXBvaW50PyAlcyIsCi0JICAgICBXSVRIX0ZMT0FUSU5HX1BPSU5UID8gInRydWUiIDogImZhbHNlIik7Ci0gIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL3VzZS1zdGRpbz8gJXMiLAotCSAgICAgKChXSVRIX1NURElPID09IERPX1VTRV9TVERJTwotCSAgICAgICB8fCBXSVRIX1NURElPID09IDApCi0JICAgICAgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL21vZGVsIFwiJXMiLAotCSAgICAgbW9kZWxfbmFtZVtXSVRIX0RFRkFVTFRfTU9ERUxdKTsKLSAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwtaXNzdWUgJWQiLAotCSAgICAgTU9ERUxfSVNTVUVfSUdOT1JFKTsKLQotICAvKiB1c2VmdWwgb3B0aW9ucyAqLwotfQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKLWVtdWxfYWRkX3RyZWVfaGFyZHdhcmUoZGV2aWNlICpyb290KQotewotICBpbnQgaTsKLSAgaW50IG5yX2NwdXMgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvc21wIik7Ci0KLSAgLyogc2FuaXR5IGNoZWNrIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyAqLwotICBpZiAobnJfY3B1cyA+IE1BWF9OUl9QUk9DRVNTT1JTKQotICAgIGVycm9yKCJTcGVjaWZpZWQgbnVtYmVyIG9mIHByb2Nlc3NvcnMgKCVkKSBleGNlZWRzIHRoZSBudW1iZXIgY29uZmlndXJlZCAoJWQpLlxuIiwKLQkgIG5yX2NwdXMsIE1BWF9OUl9QUk9DRVNTT1JTKTsKLQotICAvKiBzZXQgdGhlIG51bWJlciBvZiBhZGRyZXNzIGNlbGxzICgxIG9yIDIpICovCi0gIHRyZWVfcGFyc2Uocm9vdCwgIiNhZGRyZXNzLWNlbGxzICVkIiwgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFIC8gMzIpOwotCi0gIC8qIGFkZCBzb21lIG1lbW9yeSAqLwotICBpZiAodHJlZV9maW5kX2RldmljZShyb290LCAiL21lbW9yeSIpID09IE5VTEwpIHsKLSAgICB1bnNpZ25lZF93b3JkIG1lbW9yeV9zaXplID0KLSAgICAgIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vZWEtbWVtb3J5LXNpemUiKTsKLSAgICBjb25zdCB1bnNpZ25lZF93b3JkIGF2YWlsX3N0YXJ0ID0gMHgzMDAwOwotICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9tZW1vcnlAMC9yZWcgMHgwIDB4JWx4IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtb3J5X3NpemUpOwotICAgIC8qIHJlc2VydmUgdGhlIGZpcnN0IDB4MzAwMCBmb3IgdGhlIFBvd2VyUEMgaW50ZXJydXB0IHRhYmxlICovCi0gICAgdHJlZV9wYXJzZShyb290LCAiL21lbW9yeUAwL2F2YWlsYWJsZSAweCVseCAgMHglbHgiLAotCSAgICAgICAodW5zaWduZWQgbG9uZylhdmFpbF9zdGFydCwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtb3J5X3NpemUgLSBhdmFpbF9zdGFydCk7Ci0gIH0KLQotICAvKiBvdXIgcHJvY2Vzc29ycyAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnJfY3B1czsgaSsrKSB7Ci0gICAgdHJlZV9wYXJzZShyb290LCAiL2NwdXMvY3B1QCVkL2NwdS1uciAlZCIsIGksIGkpOwotICB9Ci0KLSAgLyogdGhlIGRlYnVnZ2luZyBwYWwgLSBoaWRlIGl0IGluIHRoZSBvcGVucHJvbSBhbmQgZG9uJ3QgYXR0YWNoIGl0Ci0gICAgIHRvIGFueSBidXMgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3BhbCIpOwotCi0gIC8qIGNob3NlbiBldGMgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL2Nob3Nlbi9zdGRpbiAqL29wZW5wcm9tL3BhbCIpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvY2hvc2VuL3N0ZG91dCAhL2Nob3Nlbi9zdGRpbiIpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvY2hvc2VuL21lbW9yeSAqL21lbW9yeSIpOwotfQotCi0jZW5kaWYgLyogX0VNVUxfR0VORVJJQ19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX2dlbmVyaWMuaCBiL3NpbS9wcGMvZW11bF9nZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjAyNmUuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9lbXVsX2dlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9FTVVMX0dFTkVSSUNfSF8KLSNkZWZpbmUgX0VNVUxfR0VORVJJQ19IXwotCi0jaW5jbHVkZSAiY3B1LmgiCi0jaW5jbHVkZSAiaWRlY29kZS5oIgotI2luY2x1ZGUgIm9zX2VtdWwuaCIKLQotI2luY2x1ZGUgInRyZWUuaCIKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZuZGVmIElOTElORV9FTVVMX0dFTkVSSUMKLSNkZWZpbmUgSU5MSU5FX0VNVUxfR0VORVJJQwotI2VuZGlmCi0KLS8qIHZhcmlvdXMgUG93ZXJQQyBpbnN0cnVjdGlvbnMgZm9yIHdyaXRpbmcgaW50byBtZW1vcnkgKi8KLWVudW0gewotICBlbXVsX2NhbGxfaW5zdHJ1Y3Rpb24gPSAweDEsCi0gIGVtdWxfbG9vcF9pbnN0cnVjdGlvbiA9IDB4NDgwMDAwMDAsIC8qIGJyYW5jaCB0byAuICovCi0gIGVtdWxfcmZpX2luc3RydWN0aW9uID0gMHg0YzAwMDA2NCwKLSAgZW11bF9ibHJfaW5zdHJ1Y3Rpb24gPSAweDRlODAwMDIwLAotfTsKLQotCi0vKiBlbXVsYXRpb24gc3BlY2lmaWMgZGF0YSAqLwotCi10eXBlZGVmIHN0cnVjdCBfb3NfZW11bF9kYXRhIG9zX2VtdWxfZGF0YTsKLQotdHlwZWRlZiBvc19lbXVsX2RhdGEgKihvc19lbXVsX2NyZWF0ZV9oYW5kbGVyKQotICAgICAoZGV2aWNlICp0cmVlLAotICAgICAgYmZkICppbWFnZSwKLSAgICAgIGNvbnN0IGNoYXIgKmVtdWxfbmFtZSk7Ci10eXBlZGVmIHZvaWQgKG9zX2VtdWxfaW5pdF9oYW5kbGVyKQotICAgICAob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCi0gICAgICBpbnQgbnJfY3B1cyk7Ci10eXBlZGVmIHZvaWQgKG9zX2VtdWxfc3lzdGVtX2NhbGxfaGFuZGxlcikKLSAgICAgKGNwdSAqcHJvY2Vzc29yLAotICAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0gICAgICBvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSk7Ci10eXBlZGVmIGludCAob3NfZW11bF9pbnN0cnVjdGlvbl9jYWxsX2hhbmRsZXIpCi0gICAgIChjcHUgKnByb2Nlc3NvciwKLSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotICAgICAgdW5zaWduZWRfd29yZCByYSwKLSAgICAgIG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhKTsKLQotc3RydWN0IF9vc19lbXVsIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgb3NfZW11bF9jcmVhdGVfaGFuZGxlciAqY3JlYXRlOwotICBvc19lbXVsX2luaXRfaGFuZGxlciAqaW5pdDsKLSAgb3NfZW11bF9zeXN0ZW1fY2FsbF9oYW5kbGVyICpzeXN0ZW1fY2FsbDsKLSAgb3NfZW11bF9pbnN0cnVjdGlvbl9jYWxsX2hhbmRsZXIgKmluc3RydWN0aW9uX2NhbGw7Ci0gIG9zX2VtdWxfZGF0YSAqZGF0YTsKLX07Ci0KLQotLyogT25lIGNsYXNzIG9mIGVtdWxhdGlvbiAtIHN5c3RlbSBjYWxsIGlzIHByZXR0eSBnZW5lcmFsLCBwcm92aWRlIGEKLSAgIGNvbW1vbiB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIHRoaXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2VtdWxfc3lzY2FsbCBlbXVsX3N5c2NhbGw7Ci10eXBlZGVmIHN0cnVjdCBfZW11bF9zeXNjYWxsX2Rlc2NyaXB0b3IgZW11bF9zeXNjYWxsX2Rlc2NyaXB0b3I7Ci0KLXR5cGVkZWYgdm9pZCAoZW11bF9zeXNjYWxsX2hhbmRsZXIpCi0gICAgIChvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSwKLSAgICAgIHVuc2lnbmVkIGNhbGwsCi0gICAgICBjb25zdCBpbnQgYXJnMCwKLSAgICAgIGNwdSAqcHJvY2Vzc29yLAotICAgICAgdW5zaWduZWRfd29yZCBjaWEpOwotCi1zdHJ1Y3QgX2VtdWxfc3lzY2FsbF9kZXNjcmlwdG9yIHsKLSAgZW11bF9zeXNjYWxsX2hhbmRsZXIgKmhhbmRsZXI7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3QgX2VtdWxfc3lzY2FsbCB7Ci0gIGVtdWxfc3lzY2FsbF9kZXNjcmlwdG9yICpzeXNjYWxsX2Rlc2NyaXB0b3I7Ci0gIGludCBucl9zeXN0ZW1fY2FsbHM7Ci0gIGNoYXIgKiplcnJvcl9uYW1lczsKLSAgaW50IG5yX2Vycm9yX25hbWVzOwotICBjaGFyICoqc2lnbmFsX25hbWVzOwotICBpbnQgbnJfc2lnbmFsX25hbWVzOwotfTsKLQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF9kb19zeXN0ZW1fY2FsbAotKG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhLAotIGVtdWxfc3lzY2FsbCAqc3lzY2FsbCwKLSB1bnNpZ25lZCBjYWxsLAotIGNvbnN0IGludCBhcmcwLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHVuc2lnbmVkNjQgZW11bF9yZWFkX2dwcjY0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gaW50IGcpOwotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF93cml0ZV9ncHI2NAotKGNwdSAqcHJvY2Vzc29yLAotIGludCBnLAotIHVuc2lnbmVkNjQgdmFsKTsKLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfd3JpdGVfc3RhdHVzCi0oY3B1ICpwcm9jZXNzb3IsCi0gaW50IHN0YXR1cywKLSBpbnQgZXJybm8pOwotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF93cml0ZTJfc3RhdHVzCi0oY3B1ICpwcm9jZXNzb3IsCi0gaW50IHN0YXR1czEsCi0gaW50IHN0YXR1czIsCi0gaW50IGVycm5vKTsKLQotSU5MSU5FX0VNVUxfR0VORVJJQyBjaGFyICplbXVsX3JlYWRfc3RyaW5nCi0oY2hhciAqZGVzdCwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbnJfYnl0ZXMsCi0gY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHVuc2lnbmVkX3dvcmQgZW11bF9yZWFkX3dvcmQKLSh1bnNpZ25lZF93b3JkIGFkZHIsCi0gY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotIAotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfd3JpdGVfd29yZAotKHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZF93b3JkIGJ1ZiwKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0gCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF9yZWFkX2J1ZmZlcgotKHZvaWQgKmRlc3QsCi0gdW5zaWduZWRfd29yZCBhZGRyLAotIHVuc2lnbmVkIG5yX2J5dGVzLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfd3JpdGVfYnVmZmVyCi0oY29uc3Qgdm9pZCAqc291cmNlLAotIHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZCBucl9ieXRlcywKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLS8qIFNpbXBsaWZ5IHRoZSBjb25zdHJ1Y3Rpb24gb2YgZGV2aWNlIHRyZWVzICovCi0KLUlOTElORV9FTVVMX0dFTkVSSUMgdm9pZCBlbXVsX2FkZF90cmVlX29wdGlvbnMKLShkZXZpY2UgKnRyZWUsCi0gYmZkICppbWFnZSwKLSBjb25zdCBjaGFyICplbXVsLAotIGNvbnN0IGNoYXIgKmVudiwKLSBpbnQgb2VhX2ludGVycnVwdF9wcmVmaXgpOwotCi1JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF9hZGRfdHJlZV9oYXJkd2FyZQotKGRldmljZSAqdHJlZSk7Ci0KLSNlbmRpZiAvKiBfRU1VTF9HRU5FUklDX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfbmV0YnNkLmMgYi9zaW0vcHBjL2VtdWxfbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDY0YTQuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9lbXVsX25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgICovCi0KLQotI2lmbmRlZiBfRU1VTF9ORVRCU0RfQ18KLSNkZWZpbmUgX0VNVUxfTkVUQlNEX0NfCi0KLQotLyogTm90ZTogdGhpcyBtb2R1bGUgaXMgY2FsbGVkIHZpYSBhIHRhYmxlLiAgVGhlcmUgaXMgbm8gYmVuZWZpdCBpbgotICAgbWFraW5nIGl0IGlubGluZSAqLwotCi0jaW5jbHVkZSAiZW11bF9nZW5lcmljLmgiCi0jaW5jbHVkZSAiZW11bF9uZXRic2QuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0jaWZuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci1pbnQgZ2V0cnVzYWdlKCk7Ci0jZW5kaWYKLQotI2lmIEhBVkVfU1lTX0lPQ1RMX0gKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotCi0jaWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbgotIyBpZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSN1bmRlZiBNQVhQQVRITEVOCQkvKiBzeXMvcGFyYW0uaCBtaWdodCBkZWZpbmUgdGhpcyBhbHNvICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jZGVmaW5lIFdJVEhfTmV0QlNEX0hPU1QgKE5ldEJTRCA+PSAxOTkzMDYpCi0jaWYgV0lUSF9OZXRCU0RfSE9TVCAvKiBoZXJlIE5ldEJTRCBhcyB0aGF0IGlzIHdoYXQgd2UncmUgZW11bGF0aW5nICovCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4gLyogRklYTUUgLSBzaG91bGQgbm90IGJlIGluY2x1ZGluZyB0aGlzIG9uZSAqLwotI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KLWV4dGVybiBpbnQgZ2V0ZGlyZW50cmllcyhpbnQgZmQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcywgbG9uZyAqYmFzZXApOwotI2Vsc2UKLQotLyogSWYgdGhpcyBpcyBub3QgbmV0YnNkLCBkb24ndCBhbGxvdyBmc3RhdGZzIG9yIGdldGRpcmVudHJpZXMgYXQgdGhpcyB0aW1lICovCi0jdW5kZWYgSEFWRV9GU1RBVEZTCi0jdW5kZWYgSEFWRV9HRVRESVJFTlRSSUVTCi0jZW5kaWYKLQotI2lmIChCU0QgPCAxOTkzMDYpIC8qIGhlcmUgQlNEIGFzIGp1c3QgYSBidWcgKi8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNECi0jZGVmaW5lIFNUQVRJQ19JTkxJTkVfRU1VTF9ORVRCU0QgU1RBVElDX0lOTElORQotI2VuZGlmCi0KLQotI2lmIFdJVEhfTmV0QlNEX0hPU1QKLSNkZWZpbmUgU1lTKFgpIEFTU0VSVChjYWxsID09IChTWVNfIyNYKSkKLSNlbHNlCi0jZGVmaW5lIFNZUyhYKQotI2VuZGlmCi0KLSNpZiBXSVRIX05ldEJTRF9IT1NUICYmIChQQVRIX01BWCAhPSAxMDI0KQotI2Vycm9yICJQQVRIX01BWCBub3QgMTAyNCIKLSNlbGlmICFkZWZpbmVkKFBBVEhfTUFYKQotI2RlZmluZSBQQVRIX01BWCAxMDI0Ci0jZW5kaWYKLQotCi0vKiBFTVVMQVRJT04KLQotICAgTmV0QlNEIC0gRW11bGF0aW9uIG9mIHVzZXIgcHJvZ3JhbXMgZm9yIE5ldEJTRC9QUEMKLQotICAgREVTQ1JJUFRJT04KLQotICAgKi8KLQotCi0vKiBOZXRCU0QncyBpZGVhIG9mIHdoYXQgaXMgbmVlZGVkIHRvIGltcGxlbWVudCBlbXVsYXRpb25zICovCi0KLXN0cnVjdCBfb3NfZW11bF9kYXRhIHsKLSAgZGV2aWNlICp2bTsKLSAgZW11bF9zeXNjYWxsICpzeXNjYWxsczsKLX07Ci0KLQotCi1TVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNEIHZvaWQKLXdyaXRlX3N0YXQodW5zaWduZWRfd29yZCBhZGRyLAotCSAgIHN0cnVjdCBzdGF0IGJ1ZiwKLQkgICBjcHUgKnByb2Nlc3NvciwKLQkgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgSDJUKGJ1Zi5zdF9kZXYpOwotICBIMlQoYnVmLnN0X2lubyk7Ci0gIEgyVChidWYuc3RfbW9kZSk7Ci0gIEgyVChidWYuc3RfbmxpbmspOwotICBIMlQoYnVmLnN0X3VpZCk7Ci0gIEgyVChidWYuc3RfZ2lkKTsKLSAgSDJUKGJ1Zi5zdF9zaXplKTsKLSAgSDJUKGJ1Zi5zdF9hdGltZSk7Ci0gIC8qIEgyVChidWYuc3Rfc3BhcmUxKTsgKi8KLSAgSDJUKGJ1Zi5zdF9tdGltZSk7Ci0gIC8qIEgyVChidWYuc3Rfc3BhcmUyKTsgKi8KLSAgSDJUKGJ1Zi5zdF9jdGltZSk7Ci0gIC8qIEgyVChidWYuc3Rfc3BhcmUzKTsgKi8KLSNpZmRlZiBBQ19TVFJVQ1RfU1RfUkRFVgotICBIMlQoYnVmLnN0X3JkZXYpOwotI2VuZGlmCi0jaWZkZWYgQUNfU1RSVUNUX1NUX0JMS1NJWkUKLSAgSDJUKGJ1Zi5zdF9ibGtzaXplKTsKLSNlbmRpZgotI2lmZGVmIEFDX1NUUlVDVF9TVF9CTE9DS1MKLSAgSDJUKGJ1Zi5zdF9ibG9ja3MpOwotI2VuZGlmCi0jaWYgV0lUSF9OZXRCU0RfSE9TVAotICBIMlQoYnVmLnN0X2ZsYWdzKTsKLSAgSDJUKGJ1Zi5zdF9nZW4pOwotI2VuZGlmCi0gIGVtdWxfd3JpdGVfYnVmZmVyKCZidWYsIGFkZHIsIHNpemVvZihidWYpLCBwcm9jZXNzb3IsIGNpYSk7Ci19Ci0KLQotI2lmZGVmIEhBVkVfRlNUQVRGUwotU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCi13cml0ZV9zdGF0ZnModW5zaWduZWRfd29yZCBhZGRyLAotCSAgICAgc3RydWN0IHN0YXRmcyBidWYsCi0JICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBIMlQoYnVmLmZfdHlwZSk7Ci0gIEgyVChidWYuZl9mbGFncyk7Ci0gIEgyVChidWYuZl9ic2l6ZSk7Ci0gIEgyVChidWYuZl9pb3NpemUpOwotICBIMlQoYnVmLmZfYmxvY2tzKTsKLSAgSDJUKGJ1Zi5mX2JmcmVlKTsKLSAgSDJUKGJ1Zi5mX2JhdmFpbCk7Ci0gIEgyVChidWYuZl9maWxlcyk7Ci0gIEgyVChidWYuZl9mZnJlZSk7Ci0gIEgyVChidWYuZl9mc2lkLnZhbFswXSk7Ci0gIEgyVChidWYuZl9mc2lkLnZhbFsxXSk7Ci0gIEgyVChidWYuZl9vd25lcik7Ci0gIC8qIGZfc3BhcmVbNF07ICovCi0gIC8qIGZfZnN0eXBlbmFtZVtNRlNOQU1FTEVOXTsgKi8KLSAgLyogZl9tbnRvbm5hbWVbTU5BTUVMRU5dOyAqLwotICAvKiBmX21udGZyb21uYW1lW01OQU1FTEVOXTsgKi8KLSAgZW11bF93cml0ZV9idWZmZXIoJmJ1ZiwgYWRkciwgc2l6ZW9mKGJ1ZiksIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZgotCi0KLVNUQVRJQ19JTkxJTkVfRU1VTF9ORVRCU0Qgdm9pZAotd3JpdGVfdGltZXZhbCh1bnNpZ25lZF93b3JkIGFkZHIsCi0JICAgICAgc3RydWN0IHRpbWV2YWwgdCwKLQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgSDJUKHQudHZfc2VjKTsKLSAgSDJUKHQudHZfdXNlYyk7Ci0gIGVtdWxfd3JpdGVfYnVmZmVyKCZ0LCBhZGRyLCBzaXplb2YodCksIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNEIHZvaWQKLXdyaXRlX3RpbWV6b25lKHVuc2lnbmVkX3dvcmQgYWRkciwKLQkgICAgICAgc3RydWN0IHRpbWV6b25lIHR6LAotCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIEgyVCh0ei50el9taW51dGVzd2VzdCk7Ci0gIEgyVCh0ei50el9kc3R0aW1lKTsKLSAgZW11bF93cml0ZV9idWZmZXIoJnR6LCBhZGRyLCBzaXplb2YodHopLCBwcm9jZXNzb3IsIGNpYSk7Ci19Ci0KLQotI2lmZGVmIEhBVkVfR0VURElSRU5UUklFUwotU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCi13cml0ZV9kaXJlbnRyaWVzKHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJIGNoYXIgKmJ1ZiwKLQkJIGludCBuYnl0ZXMsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB3aGlsZSAobmJ5dGVzID4gMCkgewotICAgIHN0cnVjdCBkaXJlbnQgKm91dDsKLSAgICBzdHJ1Y3QgZGlyZW50ICppbiA9IChzdHJ1Y3QgZGlyZW50KilidWY7Ci0gICAgQVNTRVJUKGluLT5kX3JlY2xlbiA8PSBuYnl0ZXMpOwotICAgIG91dCA9IChzdHJ1Y3QgZGlyZW50Kil6YWxsb2MoaW4tPmRfcmVjbGVuKTsKLSAgICBtZW1jcHkob3V0LypkZXN0Ki8sIGluLypzcmMqLywgaW4tPmRfcmVjbGVuKTsKLSAgICBIMlQob3V0LT5kX2ZpbGVubyk7Ci0gICAgSDJUKG91dC0+ZF9yZWNsZW4pOwotICAgIEgyVChvdXQtPmRfdHlwZSk7Ci0gICAgSDJUKG91dC0+ZF9uYW1sZW4pOwotICAgIGVtdWxfd3JpdGVfYnVmZmVyKG91dCwgYWRkciwgaW4tPmRfcmVjbGVuLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgbmJ5dGVzIC09IGluLT5kX3JlY2xlbjsKLSAgICBhZGRyICs9IGluLT5kX3JlY2xlbjsKLSAgICBidWYgKz0gaW4tPmRfcmVjbGVuOwotICAgIHpmcmVlKG91dCk7Ci0gIH0KLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCi13cml0ZV9ydXNhZ2UodW5zaWduZWRfd29yZCBhZGRyLAotCSAgICAgc3RydWN0IHJ1c2FnZSBydXNhZ2UsCi0JICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBIMlQocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyk7IC8qIHVzZXIgdGltZSB1c2VkICovCi0gIEgyVChydXNhZ2UucnVfdXRpbWUudHZfdXNlYyk7Ci0gIEgyVChydXNhZ2UucnVfc3RpbWUudHZfc2VjKTsgLyogc3lzdGVtIHRpbWUgdXNlZCAqLwotICBIMlQocnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOwotICBIMlQocnVzYWdlLnJ1X21heHJzcyk7ICAgICAgICAgIC8qIGludGVncmFsIG1heCByZXNpZGVudCBzZXQgc2l6ZSAqLwotICBIMlQocnVzYWdlLnJ1X2l4cnNzKTsgICAgICAgICAgIC8qIGludGVncmFsIHNoYXJlZCB0ZXh0IG1lbW9yeSBzaXplICovCi0gIEgyVChydXNhZ2UucnVfaWRyc3MpOyAgICAgICAgICAgLyogaW50ZWdyYWwgdW5zaGFyZWQgZGF0YSBzaXplICovCi0gIEgyVChydXNhZ2UucnVfaXNyc3MpOyAgICAgICAgICAgLyogaW50ZWdyYWwgdW5zaGFyZWQgc3RhY2sgc2l6ZSAqLwotICBIMlQocnVzYWdlLnJ1X21pbmZsdCk7ICAgICAgICAgIC8qIHBhZ2UgcmVjbGFpbXMgKi8KLSAgSDJUKHJ1c2FnZS5ydV9tYWpmbHQpOyAgICAgICAgICAvKiBwYWdlIGZhdWx0cyAqLwotICBIMlQocnVzYWdlLnJ1X25zd2FwKTsgICAgICAgICAgIC8qIHN3YXBzICovCi0gIEgyVChydXNhZ2UucnVfaW5ibG9jayk7ICAgICAgICAgLyogYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyAqLwotICBIMlQocnVzYWdlLnJ1X291YmxvY2spOyAgICAgICAgIC8qIGJsb2NrIG91dHB1dCBvcGVyYXRpb25zICovCi0gIEgyVChydXNhZ2UucnVfbXNnc25kKTsgICAgICAgICAgLyogbWVzc2FnZXMgc2VudCAqLwotICBIMlQocnVzYWdlLnJ1X21zZ3Jjdik7ICAgICAgICAgIC8qIG1lc3NhZ2VzIHJlY2VpdmVkICovCi0gIEgyVChydXNhZ2UucnVfbnNpZ25hbHMpOyAgICAgICAgLyogc2lnbmFscyByZWNlaXZlZCAqLwotICBIMlQocnVzYWdlLnJ1X252Y3N3KTsgICAgICAgICAgIC8qIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzICovCi0gIEgyVChydXNhZ2UucnVfbml2Y3N3KTsgICAgICAgICAgLyogaW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAqLwotICBlbXVsX3dyaXRlX2J1ZmZlcigmcnVzYWdlLCBhZGRyLCBzaXplb2YocnVzYWdlKSwgcHJvY2Vzc29yLCBjaWEpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1kb19leGl0KG9zX2VtdWxfZGF0YSAqZW11bCwKLQl1bnNpZ25lZCBjYWxsLAotCWNvbnN0IGludCBhcmcwLAotCWNwdSAqcHJvY2Vzc29yLAotCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgc3RhdHVzID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgU1lTKGV4aXQpOwotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQpXG4iLCBzdGF0dXMpOwotCi0gIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfZXhpdGVkLCBzdGF0dXMpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19yZWFkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQl1bnNpZ25lZCBjYWxsLAotCWNvbnN0IGludCBhcmcwLAotCWNwdSAqcHJvY2Vzc29yLAotCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICB2b2lkICpzY3JhdGNoX2J1ZmZlcjsKLSAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIGJ1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGludCBuYnl0ZXMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOwotICBpbnQgc3RhdHVzOwotICBTWVMocmVhZCk7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAweCVseCwgJWQiLCBkLCAobG9uZylidWYsIG5ieXRlcyk7Ci0KLSAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KLSAgc2NyYXRjaF9idWZmZXIgPSB6YWxsb2MobmJ5dGVzKTsKLQotICAvKiBjaGVjayBpZiBidWZmZXIgZXhpc3RzIGJ5IHJlYWRpbmcgaXQgKi8KLSAgZW11bF9yZWFkX2J1ZmZlcihzY3JhdGNoX2J1ZmZlciwgYnVmLCBuYnl0ZXMsIHByb2Nlc3NvciwgY2lhKTsKLQotICAvKiByZWFkICovCi0jaWYgMAotICBpZiAoZCA9PSAwKSB7Ci0gICAgc3RhdHVzID0gZnJlYWQgKHNjcmF0Y2hfYnVmZmVyLCAxLCBuYnl0ZXMsIHN0ZGluKTsKLSAgICBpZiAoc3RhdHVzID09IDAgJiYgZmVycm9yIChzdGRpbikpCi0gICAgICBzdGF0dXMgPSAtMTsKLSAgfQotI2VuZGlmCi0gIHN0YXR1cyA9IHJlYWQgKGQsIHNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci0gIGlmIChzdGF0dXMgPiAwKQotICAgIGVtdWxfd3JpdGVfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIHN0YXR1cywgcHJvY2Vzc29yLCBjaWEpOwotCi0gIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fd3JpdGUob3NfZW11bF9kYXRhICplbXVsLAotCSB1bnNpZ25lZCBjYWxsLAotCSBjb25zdCBpbnQgYXJnMCwKLQkgY3B1ICpwcm9jZXNzb3IsCi0JIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB2b2lkICpzY3JhdGNoX2J1ZmZlciA9IE5VTEw7Ci0gIGludCBkID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgdW5zaWduZWRfd29yZCBidWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBpbnQgbmJ5dGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKLSAgaW50IHN0YXR1czsKLSAgU1lTKHdyaXRlKTsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4LCAlZCIsIGQsIChsb25nKWJ1ZiwgbmJ5dGVzKTsKLQotICAvKiBnZXQgYSB0ZW1wb2FyeSBidWZlciAqLwotICBzY3JhdGNoX2J1ZmZlciA9IHphbGxvYyhuYnl0ZXMpOyAvKiBGSVhNRSAtIG5ieXRlcyA9PSAwICovCi0KLSAgLyogY29weSBpbiAqLwotICBlbXVsX3JlYWRfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywKLQkJICAgcHJvY2Vzc29yLCBjaWEpOwotCi0gIC8qIHdyaXRlICovCi0gIHN0YXR1cyA9IHdyaXRlKGQsIHNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotICB6ZnJlZShzY3JhdGNoX2J1ZmZlcik7Ci0KLSAgZmx1c2hfc3Rkb3V0cHV0KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX29wZW4ob3NfZW11bF9kYXRhICplbXVsLAotCXVuc2lnbmVkIGNhbGwsCi0JY29uc3QgaW50IGFyZzAsCi0JY3B1ICpwcm9jZXNzb3IsCi0JdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOwotICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOwotICBpbnQgZmxhZ3MgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGludCBtb2RlID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCV4LCAweCV4IiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCBmbGFncywgbW9kZSk7Ci0KLSAgU1lTKG9wZW4pOwotCi0gIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IG9wZW4gc2V0cyBlcnJuby4gKi8KLSAgc3RhdHVzID0gb3BlbihwYXRoLCBmbGFncywgbW9kZSk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX2Nsb3NlKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgdW5zaWduZWQgY2FsbCwKLQkgY29uc3QgaW50IGFyZzAsCi0JIGNwdSAqcHJvY2Vzc29yLAotCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCIsIGQpOwotCi0gIFNZUyhjbG9zZSk7Ci0KLSAgLyogQ2FuJ3QgY29tYmluZSB0aGVzZSBzdGF0ZW1lbnRzLCBjdXogY2xvc2Ugc2V0cyBlcnJuby4gKi8KLSAgc3RhdHVzID0gY2xvc2UoZCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX2JyZWFrKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgdW5zaWduZWQgY2FsbCwKLQkgY29uc3QgaW50IGFyZzAsCi0JIGNwdSAqcHJvY2Vzc29yLAotCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgLyoganVzdCBwYXNzIHRoaXMgb250byB0aGUgYHZtJyBkZXZpY2UgKi8KLSAgdW5zaWduZWRfd29yZCBuZXdfYnJlYWsgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHgiLCAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSk7Ci0KLSAgU1lTKGJyZWFrKTsKLSAgc3RhdHVzID0gZGV2aWNlX2lvY3RsKGVtdWwtPnZtLAotCQkJcHJvY2Vzc29yLAotCQkJY2lhLAotCQkJZGV2aWNlX2lvY3RsX2JyZWFrLAotCQkJbmV3X2JyZWFrKTsgLyppb2N0bC1kYXRhKi8KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCBzdGF0dXMpOwotfQotCi0KLSNpZm5kZWYgSEFWRV9HRVRQSUQKLSNkZWZpbmUgZG9fZ2V0cGlkIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fZ2V0cGlkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgIHVuc2lnbmVkIGNhbGwsCi0JICBjb25zdCBpbnQgYXJnMCwKLQkgIGNwdSAqcHJvY2Vzc29yLAotCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIFNZUyhnZXRwaWQpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0cGlkKCksIDApOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRVSUQKLSNkZWZpbmUgZG9fZ2V0dWlkIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fZ2V0dWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgIHVuc2lnbmVkIGNhbGwsCi0JICBjb25zdCBpbnQgYXJnMCwKLQkgIGNwdSAqcHJvY2Vzc29yLAotCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIFNZUyhnZXR1aWQpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0dWlkKCksIDApOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRFVUlECi0jZGVmaW5lIGRvX2dldGV1aWQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19nZXRldWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICB1bnNpZ25lZCBjYWxsLAotCSAgIGNvbnN0IGludCBhcmcwLAotCSAgIGNwdSAqcHJvY2Vzc29yLAotCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBTWVMoZ2V0ZXVpZCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClnZXRldWlkKCksIDApOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9LSUxMCi0jZGVmaW5lIGRvX2tpbGwgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19raWxsKG9zX2VtdWxfZGF0YSAqZW11bCwKLQl1bnNpZ25lZCBjYWxsLAotCWNvbnN0IGludCBhcmcwLAotCWNwdSAqcHJvY2Vzc29yLAotCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBwaWRfdCBwaWQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgaW50IHNpZyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCIsIChpbnQpcGlkLCBzaWcpOwotCi0gIFNZUyhraWxsKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJTWVNfa2lsbCBhdCAweCVseCAtIG1vcmUgdG8gdGhpcyB0aGFuIGp1c3QgYmVpbmcga2lsbGVkXG4iLAotCQkgIChsb25nKWNpYSk7Ci0gIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfc2lnbmFsbGVkLCBzaWcpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9EVVAKLSNkZWZpbmUgZG9fZHVwIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fZHVwKG9zX2VtdWxfZGF0YSAqZW11bCwKLSAgICAgICB1bnNpZ25lZCBjYWxsLAotICAgICAgIGNvbnN0IGludCBhcmcwLAotICAgICAgIGNwdSAqcHJvY2Vzc29yLAotICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgb2xkZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc3RhdHVzID0gZHVwKG9sZGQpOwotICBpbnQgZXJyID0gZXJybm87Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkIiwgb2xkZCk7Ci0KLSAgU1lTKGR1cCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRFR0lECi0jZGVmaW5lIGRvX2dldGVnaWQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19nZXRlZ2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICB1bnNpZ25lZCBjYWxsLAotCSAgIGNvbnN0IGludCBhcmcwLAotCSAgIGNwdSAqcHJvY2Vzc29yLAotCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBTWVMoZ2V0ZWdpZCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClnZXRlZ2lkKCksIDApOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRHSUQKLSNkZWZpbmUgZG9fZ2V0Z2lkIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fZ2V0Z2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgIHVuc2lnbmVkIGNhbGwsCi0JICBjb25zdCBpbnQgYXJnMCwKLQkgIGNwdSAqcHJvY2Vzc29yLAotCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIFNZUyhnZXRnaWQpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0Z2lkKCksIDApOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TSUdQUk9DTUFTSwotI2RlZmluZSBkb19zaWdwcm9jbWFzayAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3NpZ3Byb2NtYXNrKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgbmF0dXJhbF93b3JkIGhvdyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHNldCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIHVuc2lnbmVkX3dvcmQgb3NldCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIFNZUyhzaWdwcm9jbWFzayk7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVsZCwgMHglbGQsIDB4JWxkIiwgKGxvbmcpaG93LCAobG9uZylzZXQsIChsb25nKW9zZXQpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgMCwgMCk7Ci0gIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzRdID0gc2V0OwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9JT0NUTAotI2RlZmluZSBkb19pb2N0bCAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX2lvY3RsKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgdW5zaWduZWQgY2FsbCwKLQkgY29uc3QgaW50IGFyZzAsCi0JIGNwdSAqcHJvY2Vzc29yLAotCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IGQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgdW5zaWduZWQgcmVxdWVzdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIHVuc2lnbmVkX3dvcmQgYXJncF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKLQotI2lmICFXSVRIX05ldEJTRF9IT1NUCi0gIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdID0gMDsgLyoganVzdCBzdWNjZWVkICovCi0jZWxzZQotICB1bnNpZ25lZCBkaXIgPSByZXF1ZXN0ICYgSU9DX0RJUk1BU0s7Ci0gIGludCBzdGF0dXM7Ci0gIFNZUyhpb2N0bCk7Ci0gIC8qIHdoYXQgd2UgaGF2ZW4ndCBkb25lICovCi0gIGlmIChkaXIgJiBJT0NfSU4gLyogd3JpdGUgaW50byB0aGUgaW8gZGV2aWNlICovCi0gICAgICB8fCBkaXIgJiBJT0NfT1VUCi0gICAgICB8fCAhKGRpciAmIElPQ19WT0lEKSkKLSAgICBlcnJvcigiZG9faW9jdGwoKSByZWFkIG9yIHdyaXRlIG9mIHBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWRcbiIpOwotICBzdGF0dXMgPSBpb2N0bChkLCByZXF1ZXN0LCBOVUxMKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLSNlbmRpZgotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHgleCwgMHglbHgiLCBkLCByZXF1ZXN0LCAobG9uZylhcmdwX2FkZHIpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VTUFTSwotI2RlZmluZSBkb191bWFzayAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VtYXNrKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgdW5zaWduZWQgY2FsbCwKLQkgY29uc3QgaW50IGFyZzAsCi0JIGNwdSAqcHJvY2Vzc29yLAotCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IG1hc2sgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMCVvIiwgbWFzayk7Ci0KLSAgU1lTKHVtYXNrKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCB1bWFzayhtYXNrKSwgMCk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0RVUDIKLSNkZWZpbmUgZG9fZHVwMiAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX2R1cDIob3NfZW11bF9kYXRhICplbXVsLAotCXVuc2lnbmVkIGNhbGwsCi0JY29uc3QgaW50IGFyZzAsCi0JY3B1ICpwcm9jZXNzb3IsCi0JdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBvbGRkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIGludCBuZXdkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IHN0YXR1cyA9IGR1cDIob2xkZCwgbmV3ZCk7Ci0gIGludCBlcnIgPSBlcnJubzsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsICVkIiwgb2xkZCwgbmV3ZCk7Ci0KLSAgU1lTKGR1cDIpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJyKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRkNOVEwKLSNkZWZpbmUgZG9fZmNudGwgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19mY250bChvc19lbXVsX2RhdGEgKmVtdWwsCi0JIHVuc2lnbmVkIGNhbGwsCi0JIGNvbnN0IGludCBhcmcwLAotCSBjcHUgKnByb2Nlc3NvciwKLQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgY21kID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IGFyZyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCwgJWQiLCBmZCwgY21kLCBhcmcpOwotCi0gIFNZUyhmY250bCk7Ci0gIHN0YXR1cyA9IGZjbnRsKGZkLCBjbWQsIGFyZyk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotI2RlZmluZSBkb19nZXR0aW1lb2ZkYXkgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19nZXR0aW1lb2ZkYXkob3NfZW11bF9kYXRhICplbXVsLAotCQl1bnNpZ25lZCBjYWxsLAotCQljb25zdCBpbnQgYXJnMCwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHRfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHR6X2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBzdHJ1Y3QgdGltZXZhbCB0OwotICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gIGludCBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoKHRfYWRkciAhPSAwID8gJnQgOiBOVUxMKSwKLQkJCSAgICAodHpfYWRkciAhPSAwID8gJnR6IDogTlVMTCkpOwotICBpbnQgZXJyID0gZXJybm87Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4LCAweCVseCIsIChsb25nKXRfYWRkciwgKGxvbmcpdHpfYWRkcik7Ci0KLSAgU1lTKGdldHRpbWVvZmRheSk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOwotICBpZiAoc3RhdHVzID09IDApIHsKLSAgICBpZiAodF9hZGRyICE9IDApCi0gICAgICB3cml0ZV90aW1ldmFsKHRfYWRkciwgdCwgcHJvY2Vzc29yLCBjaWEpOwotICAgIGlmICh0el9hZGRyICE9IDApCi0gICAgICB3cml0ZV90aW1lem9uZSh0el9hZGRyLCB0eiwgcHJvY2Vzc29yLCBjaWEpOwotICB9Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVFJVU0FHRQotI2RlZmluZSBkb19nZXRydXNhZ2UgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19nZXRydXNhZ2Uob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IHdobyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHJ1c2FnZV9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0gIGludCBzdGF0dXMgPSBnZXRydXNhZ2Uod2hvLCAocnVzYWdlX2FkZHIgIT0gMCA/ICZydXNhZ2UgOiBOVUxMKSk7Ci0gIGludCBlcnIgPSBlcnJubzsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4Iiwgd2hvLCAobG9uZylydXNhZ2VfYWRkcik7Ci0KLSAgU1lTKGdldHJ1c2FnZSk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOwotICBpZiAoc3RhdHVzID09IDApIHsKLSAgICBpZiAocnVzYWdlX2FkZHIgIT0gMCkKLSAgICAgIHdyaXRlX3J1c2FnZShydXNhZ2VfYWRkciwgcnVzYWdlLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIH0KLX0KLSNlbmRpZgotCi0KLSNpZm5kZWYgSEFWRV9GU1RBVEZTCi0jZGVmaW5lIGRvX2ZzdGF0ZnMgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19mc3RhdGZzKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICB1bnNpZ25lZCBjYWxsLAotCSAgIGNvbnN0IGludCBhcmcwLAotCSAgIGNwdSAqcHJvY2Vzc29yLAotCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgZmQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgdW5zaWduZWRfd29yZCBidWZfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIHN0cnVjdCBzdGF0ZnMgYnVmOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgiLCBmZCwgKGxvbmcpYnVmX2FkZHIpOwotCi0gIFNZUyhmc3RhdGZzKTsKLSAgc3RhdHVzID0gZnN0YXRmcyhmZCwgKGJ1Zl9hZGRyID09IDAgPyBOVUxMIDogJmJ1ZikpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotICBpZiAoc3RhdHVzID09IDApIHsKLSAgICBpZiAoYnVmX2FkZHIgIT0gMCkKLSAgICAgIHdyaXRlX3N0YXRmcyhidWZfYWRkciwgYnVmLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIH0KLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RBVAotI2RlZmluZSBkb19zdGF0IDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCi0JdW5zaWduZWQgY2FsbCwKLQljb25zdCBpbnQgYXJnMCwKLQljcHUgKnByb2Nlc3NvciwKLQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkX3dvcmQgc3RhdF9idWZfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgaW50IHN0YXR1czsKLSAgU1lTKHN0YXQpOwotICBzdGF0dXMgPSBzdGF0KHBhdGgsICZidWYpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgd3JpdGVfc3RhdChzdGF0X2J1Zl9hZGRyLCBidWYsIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRlNUQVQKLSNkZWZpbmUgZG9fZnN0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19mc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCi0JIHVuc2lnbmVkIGNhbGwsCi0JIGNvbnN0IGludCBhcmcwLAotCSBjcHUgKnByb2Nlc3NvciwKLQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHN0YXRfYnVmX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gIGludCBzdGF0dXM7Ci0gIFNZUyhmc3RhdCk7Ci0gIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IGZzdGF0IHNldHMgZXJybm8uICovCi0gIHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLSAgd3JpdGVfc3RhdChzdGF0X2J1Zl9hZGRyLCBidWYsIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfTFNUQVQKLSNkZWZpbmUgZG9fbHN0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19sc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCi0JIHVuc2lnbmVkIGNhbGwsCi0JIGNvbnN0IGludCBhcmcwLAotCSBjcHUgKnByb2Nlc3NvciwKLQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOwotICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOwotICB1bnNpZ25lZF93b3JkIHN0YXRfYnVmX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gIGludCBzdGF0dXM7Ci0gIFNZUyhsc3RhdCk7Ci0gIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IGxzdGF0IHNldHMgZXJybm8uICovCi0gIHN0YXR1cyA9IGxzdGF0KHBhdGgsICZidWYpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotICB3cml0ZV9zdGF0KHN0YXRfYnVmX2FkZHIsIGJ1ZiwgcHJvY2Vzc29yLCBjaWEpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRESVJFTlRSSUVTCi0jZGVmaW5lIGRvX2dldGRpcmVudHJpZXMgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19nZXRkaXJlbnRyaWVzKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJIHVuc2lnbmVkIGNhbGwsCi0JCSBjb25zdCBpbnQgYXJnMCwKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIGJ1Zl9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgY2hhciAqYnVmOwotICBpbnQgbmJ5dGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKLSAgdW5zaWduZWRfd29yZCBiYXNlcF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCszXTsKLSAgbG9uZyBiYXNlcDsKLSAgaW50IHN0YXR1czsKLSAgU1lTKGdldGRpcmVudHJpZXMpOwotICBpZiAoYnVmX2FkZHIgIT0gMCAmJiBuYnl0ZXMgPj0gMCkKLSAgICBidWYgPSB6YWxsb2MobmJ5dGVzKTsKLSAgZWxzZQotICAgIGJ1ZiA9IE5VTEw7Ci0gIHN0YXR1cyA9IGdldGRpcmVudHJpZXMoZmQsCi0JCQkgKGJ1Zl9hZGRyID09IDAgPyBOVUxMIDogYnVmKSwKLQkJCSBuYnl0ZXMsCi0JCQkgKGJhc2VwX2FkZHIgPT0gMCA/IE5VTEwgOiAmYmFzZXApKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLSAgaWYgKGJhc2VwX2FkZHIgIT0gMCkKLSAgICBlbXVsX3dyaXRlX3dvcmQoYmFzZXBfYWRkciwgYmFzZXAsIHByb2Nlc3NvciwgY2lhKTsKLSAgaWYgKHN0YXR1cyA+IDApCi0gICAgd3JpdGVfZGlyZW50cmllcyhidWZfYWRkciwgYnVmLCBzdGF0dXMsIHByb2Nlc3NvciwgY2lhKTsKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIHpmcmVlKGJ1Zik7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotZG9fX19zeXNjYWxsKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIFNZUyhfX3N5c2NhbGwpOwotICBlbXVsX2RvX3N5c3RlbV9jYWxsKGVtdWwsCi0JCSAgICAgIGVtdWwtPnN5c2NhbGxzLAotCQkgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSwKLQkJICAgICAgYXJnMCArIDEsCi0JCSAgICAgIHByb2Nlc3NvciwKLQkJICAgICAgY2lhKTsKLX0KLQotI2lmbmRlZiBIQVZFX0xTRUVLCi0jZGVmaW5lIGRvX2xzZWVrIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fbHNlZWsob3NfZW11bF9kYXRhICplbXVsLAotCSB1bnNpZ25lZCBjYWxsLAotCSBjb25zdCBpbnQgYXJnMCwKLQkgY3B1ICpwcm9jZXNzb3IsCi0JIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgZmlsZGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIG9mZl90IG9mZnNldCA9IGVtdWxfcmVhZF9ncHI2NChwcm9jZXNzb3IsIGFyZzArMik7Ci0gIGludCB3aGVuY2UgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzRdOwotICBvZmZfdCBzdGF0dXM7Ci0gIFNZUyhsc2Vlayk7Ci0gIHN0YXR1cyA9IGxzZWVrKGZpbGRlcywgb2Zmc2V0LCB3aGVuY2UpOwotICBpZiAoc3RhdHVzID09IC0xKQotICAgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgLTEsIGVycm5vKTsKLSAgZWxzZSB7Ci0gICAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCAwKTsgLyogc3VjY2VzcyAqLwotICAgIGVtdWxfd3JpdGVfZ3ByNjQocHJvY2Vzc29yLCAzLCBzdGF0dXMpOwotICB9Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWRvX19fc3lzY3RsKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgY29uc3QgaW50IGFyZzAsCi0JICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgLyogY2FsbCB0aGUgYXJndW1lbnRzIGJ5IHRoZWlyIHJlYWwgbmFtZSAqLwotICB1bnNpZ25lZF93b3JkIG5hbWUgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgbmF0dXJhbF93b3JkIG5hbWVsZW4gPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICB1bnNpZ25lZF93b3JkIG9sZHAgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOwotICB1bnNpZ25lZF93b3JkIG9sZGxlbnAgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzNdOwotICBuYXR1cmFsX3dvcmQgb2xkbGVuOwotICBuYXR1cmFsX3dvcmQgbWliOwotICBuYXR1cmFsX3dvcmQgaW50X3ZhbDsKLSAgU1lTKF9fc3lzY3RsKTsKLQotICAvKiBwbHVjayBvdXQgdGhlIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24gYmFzZSBpZCAqLwotICBpZiAobmFtZWxlbiA8IDEpCi0gICAgZXJyb3IoInN5c3RlbV9jYWxsKClTWVNfX19zeXNjdGwgYmFkIG5hbWVbMF1cbiIpOwotICBtaWIgPSB2bV9kYXRhX21hcF9yZWFkX3dvcmQoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCi0JCQkgICAgICBuYW1lLAotCQkJICAgICAgcHJvY2Vzc29yLAotCQkJICAgICAgY2lhKTsKLSAgbmFtZSArPSBzaXplb2YobWliKTsKLQotICAvKiBzZWUgd2hhdCB0byBkbyB3aXRoIGl0IC4uLiAqLwotICBzd2l0Y2ggKChpbnQpbWliKSB7Ci0gIGNhc2UgNi8qQ1RMX0hXKi86Ci0jaWYgV0lUSF9OZXRCU0RfSE9TVCAmJiAoQ1RMX0hXICE9IDYpCi0jICBlcnJvciAiQ1RMX0hXIgotI2VuZGlmCi0gICAgaWYgKG5hbWVsZW4gPCAyKQotICAgICAgZXJyb3IoInN5c3RlbV9jYWxsKClTWVNfX19zeXNjdGwgLSBDVExfSFcgLSBiYWQgbmFtZVsxXVxuIik7Ci0gICAgbWliID0gdm1fZGF0YV9tYXBfcmVhZF93b3JkKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAotCQkJCW5hbWUsCi0JCQkJcHJvY2Vzc29yLAotCQkJCWNpYSk7Ci0gICAgbmFtZSArPSBzaXplb2YobWliKTsKLSAgICBzd2l0Y2ggKChpbnQpbWliKSB7Ci0gICAgY2FzZSA3LypIV19QQUdFU0laRSovOgotI2lmIFdJVEhfTmV0QlNEX0hPU1QgJiYgKEhXX1BBR0VTSVpFICE9IDcpCi0jICBlcnJvciAiSFdfUEFHRVNJWkUiCi0jZW5kaWYKLSAgICAgIG9sZGxlbiA9IHZtX2RhdGFfbWFwX3JlYWRfd29yZChjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKLQkJCQkgICAgIG9sZGxlbnAsCi0JCQkJICAgICBwcm9jZXNzb3IsCi0JCQkJICAgICBjaWEpOwotICAgICAgaWYgKHNpemVvZihuYXR1cmFsX3dvcmQpID4gb2xkbGVuKQotCWVycm9yKCJzeXN0ZW1fY2FsbCgpc3lzY3RsIC0gQ1RMX0hXLkhXX1BBR0VTSVpFIC0gdG8gc21hbGxcbiIpOwotICAgICAgaW50X3ZhbCA9IDgxOTI7Ci0gICAgICBvbGRsZW4gPSBzaXplb2YoaW50X3ZhbCk7Ci0gICAgICBlbXVsX3dyaXRlX3dvcmQob2xkcCwgaW50X3ZhbCwgcHJvY2Vzc29yLCBjaWEpOwotICAgICAgZW11bF93cml0ZV93b3JkKG9sZGxlbnAsIG9sZGxlbiwgcHJvY2Vzc29yLCBjaWEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yKCJzeXNjdGwoKSBDVExfSFcuJWQgdW5rbm93blxuIiwgbWliKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlcnJvcigic3lzY3RsKCkgbmFtZVswXT0lZCB1bmtub3duXG4iLCAoaW50KW1pYik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCAwKTsgLyogYWx3YXlzIHN1Y2NlZWQgKi8KLX0KLQotCi0KLXN0YXRpYyBlbXVsX3N5c2NhbGxfZGVzY3JpcHRvciBuZXRic2RfZGVzY3JpcHRvcnNbXSA9IHsKLSAgLyogMCAqLyB7IDAsICJzeXNjYWxsIiB9LAotICAvKiAxICovIHsgZG9fZXhpdCwgImV4aXQiIH0sCi0gIC8qIDIgKi8geyAwLCAiZm9yayIgfSwKLSAgLyogMyAqLyB7IGRvX3JlYWQsICJyZWFkIiB9LAotICAvKiA0ICovIHsgZG9fd3JpdGUsICJ3cml0ZSIgfSwKLSAgLyogNSAqLyB7IGRvX29wZW4sICJvcGVuIiB9LAotICAvKiA2ICovIHsgZG9fY2xvc2UsICJjbG9zZSIgfSwKLSAgLyogNyAqLyB7IDAsICJ3YWl0NCIgfSwKLSAgeyAwLCB9LCAvKiA4IGlzIG9sZCBjcmVhdCAqLwotICAvKiA5ICovIHsgMCwgImxpbmsiIH0sCi0gIC8qIDEwICovIHsgMCwgInVubGluayIgfSwKLSAgeyAwLCB9LCAvKiAxMSBpcyBvYnNvbGV0ZSBleGVjdiAqLwotICAvKiAxMiAqLyB7IDAsICJjaGRpciIgfSwKLSAgLyogMTMgKi8geyAwLCAiZmNoZGlyIiB9LAotICAvKiAxNCAqLyB7IDAsICJta25vZCIgfSwKLSAgLyogMTUgKi8geyAwLCAiY2htb2QiIH0sCi0gIC8qIDE2ICovIHsgMCwgImNob3duIiB9LAotICAvKiAxNyAqLyB7IGRvX2JyZWFrLCAiYnJlYWsiIH0sCi0gIC8qIDE4ICovIHsgMCwgImdldGZzc3RhdCIgfSwKLSAgeyAwLCB9LCAvKiAxOSBpcyBvbGQgbHNlZWsgKi8KLSAgLyogMjAgKi8geyBkb19nZXRwaWQsICJnZXRwaWQiIH0sCi0gIC8qIDIxICovIHsgMCwgIm1vdW50IiB9LAotICAvKiAyMiAqLyB7IDAsICJ1bm1vdW50IiB9LAotICAvKiAyMyAqLyB7IDAsICJzZXR1aWQiIH0sCi0gIC8qIDI0ICovIHsgZG9fZ2V0dWlkLCAiZ2V0dWlkIiB9LAotICAvKiAyNSAqLyB7IGRvX2dldGV1aWQsICJnZXRldWlkIiB9LAotICAvKiAyNiAqLyB7IDAsICJwdHJhY2UiIH0sCi0gIC8qIDI3ICovIHsgMCwgInJlY3Ztc2ciIH0sCi0gIC8qIDI4ICovIHsgMCwgInNlbmRtc2ciIH0sCi0gIC8qIDI5ICovIHsgMCwgInJlY3Zmcm9tIiB9LAotICAvKiAzMCAqLyB7IDAsICJhY2NlcHQiIH0sCi0gIC8qIDMxICovIHsgMCwgImdldHBlZXJuYW1lIiB9LAotICAvKiAzMiAqLyB7IDAsICJnZXRzb2NrbmFtZSIgfSwKLSAgLyogMzMgKi8geyAwLCAiYWNjZXNzIiB9LAotICAvKiAzNCAqLyB7IDAsICJjaGZsYWdzIiB9LAotICAvKiAzNSAqLyB7IDAsICJmY2hmbGFncyIgfSwKLSAgLyogMzYgKi8geyAwLCAic3luYyIgfSwKLSAgLyogMzcgKi8geyBkb19raWxsLCAia2lsbCIgfSwKLSAgeyAwLCB9LCAvKiAzOCBpcyBvbGQgc3RhdCAqLwotICAvKiAzOSAqLyB7IDAsICJnZXRwcGlkIiB9LAotICB7IDAsIH0sIC8qIDQwIGlzIG9sZCBsc3RhdCAqLwotICAvKiA0MSAqLyB7IGRvX2R1cCwgImR1cCIgfSwKLSAgLyogNDIgKi8geyAwLCAicGlwZSIgfSwKLSAgLyogNDMgKi8geyBkb19nZXRlZ2lkLCAiZ2V0ZWdpZCIgfSwKLSAgLyogNDQgKi8geyAwLCAicHJvZmlsIiB9LAotICAvKiA0NSAqLyB7IDAsICJrdHJhY2UiIH0sCi0gIC8qIDQ2ICovIHsgMCwgInNpZ2FjdGlvbiIgfSwKLSAgLyogNDcgKi8geyBkb19nZXRnaWQsICJnZXRnaWQiIH0sCi0gIC8qIDQ4ICovIHsgZG9fc2lncHJvY21hc2ssICJzaWdwcm9jbWFzayIgfSwKLSAgLyogNDkgKi8geyAwLCAiZ2V0bG9naW4iIH0sCi0gIC8qIDUwICovIHsgMCwgInNldGxvZ2luIiB9LAotICAvKiA1MSAqLyB7IDAsICJhY2N0IiB9LAotICAvKiA1MiAqLyB7IDAsICJzaWdwZW5kaW5nIiB9LAotICAvKiA1MyAqLyB7IDAsICJzaWdhbHRzdGFjayIgfSwKLSAgLyogNTQgKi8geyBkb19pb2N0bCwgImlvY3RsIiB9LAotICAvKiA1NSAqLyB7IDAsICJyZWJvb3QiIH0sCi0gIC8qIDU2ICovIHsgMCwgInJldm9rZSIgfSwKLSAgLyogNTcgKi8geyAwLCAic3ltbGluayIgfSwKLSAgLyogNTggKi8geyAwLCAicmVhZGxpbmsiIH0sCi0gIC8qIDU5ICovIHsgMCwgImV4ZWN2ZSIgfSwKLSAgLyogNjAgKi8geyBkb191bWFzaywgInVtYXNrIiB9LAotICAvKiA2MSAqLyB7IDAsICJjaHJvb3QiIH0sCi0gIHsgMCwgfSwgLyogNjIgaXMgb2xkIGZzdGF0ICovCi0gIHsgMCwgfSwgLyogNjMgaXMgb2xkIGdldGtlcm5pbmZvICovCi0gIHsgMCwgfSwgLyogNjQgaXMgb2xkIGdldHBhZ2VzaXplICovCi0gIC8qIDY1ICovIHsgMCwgIm1zeW5jIiB9LAotICAvKiA2NiAqLyB7IDAsICJ2Zm9yayIgfSwKLSAgeyAwLCB9LCAvKiA2NyBpcyBvYnNvbGV0ZSB2cmVhZCAqLwotICB7IDAsIH0sIC8qIDY4IGlzIG9ic29sZXRlIHZ3cml0ZSAqLwotICAvKiA2OSAqLyB7IDAsICJzYnJrIiB9LAotICAvKiA3MCAqLyB7IDAsICJzc3RrIiB9LAotICB7IDAsIH0sIC8qIDcxIGlzIG9sZCBtbWFwICovCi0gIC8qIDcyICovIHsgMCwgInZhZHZpc2UiIH0sCi0gIC8qIDczICovIHsgMCwgIm11bm1hcCIgfSwKLSAgLyogNzQgKi8geyAwLCAibXByb3RlY3QiIH0sCi0gIC8qIDc1ICovIHsgMCwgIm1hZHZpc2UiIH0sCi0gIHsgMCwgfSwgLyogNzYgaXMgb2Jzb2xldGUgdmhhbmd1cCAqLwotICB7IDAsIH0sIC8qIDc3IGlzIG9ic29sZXRlIHZsaW1pdCAqLwotICAvKiA3OCAqLyB7IDAsICJtaW5jb3JlIiB9LAotICAvKiA3OSAqLyB7IDAsICJnZXRncm91cHMiIH0sCi0gIC8qIDgwICovIHsgMCwgInNldGdyb3VwcyIgfSwKLSAgLyogODEgKi8geyAwLCAiZ2V0cGdycCIgfSwKLSAgLyogODIgKi8geyAwLCAic2V0cGdpZCIgfSwKLSAgLyogODMgKi8geyAwLCAic2V0aXRpbWVyIiB9LAotICB7IDAsIH0sIC8qIDg0IGlzIG9sZCB3YWl0ICovCi0gIC8qIDg1ICovIHsgMCwgInN3YXBvbiIgfSwKLSAgLyogODYgKi8geyAwLCAiZ2V0aXRpbWVyIiB9LAotICB7IDAsIH0sIC8qIDg3IGlzIG9sZCBnZXRob3N0bmFtZSAqLwotICB7IDAsIH0sIC8qIDg4IGlzIG9sZCBzZXRob3N0bmFtZSAqLwotICB7IDAsIH0sIC8qIDg5IGlzIG9sZCBnZXRkdGFibGVzaXplICovCi0gIHsgZG9fZHVwMiwgImR1cDIiIH0sCi0gIHsgMCwgfSwgLyogOTEgKi8KLSAgLyogOTIgKi8geyBkb19mY250bCwgImZjbnRsIiB9LAotICAvKiA5MyAqLyB7IDAsICJzZWxlY3QiIH0sCi0gIHsgMCwgfSwgLyogOTQgKi8KLSAgLyogOTUgKi8geyAwLCAiZnN5bmMiIH0sCi0gIC8qIDk2ICovIHsgMCwgInNldHByaW9yaXR5IiB9LAotICAvKiA5NyAqLyB7IDAsICJzb2NrZXQiIH0sCi0gIC8qIDk4ICovIHsgMCwgImNvbm5lY3QiIH0sCi0gIHsgMCwgfSwgLyogOTkgaXMgb2xkIGFjY2VwdCAqLwotICAvKiAxMDAgKi8geyAwLCAiZ2V0cHJpb3JpdHkiIH0sCi0gIHsgMCwgfSwgLyogMTAxIGlzIG9sZCBzZW5kICovCi0gIHsgMCwgfSwgLyogMTAyIGlzIG9sZCByZWN2ICovCi0gIC8qIDEwMyAqLyB7IDAsICJzaWdyZXR1cm4iIH0sCi0gIC8qIDEwNCAqLyB7IDAsICJiaW5kIiB9LAotICAvKiAxMDUgKi8geyAwLCAic2V0c29ja29wdCIgfSwKLSAgLyogMTA2ICovIHsgMCwgImxpc3RlbiIgfSwKLSAgeyAwLCB9LCAvKiAxMDcgaXMgb2Jzb2xldGUgdnRpbWVzICovCi0gIHsgMCwgfSwgLyogMTA4IGlzIG9sZCBzaWd2ZWMgKi8KLSAgeyAwLCB9LCAvKiAxMDkgaXMgb2xkIHNpZ2Jsb2NrICovCi0gIHsgMCwgfSwgLyogMTEwIGlzIG9sZCBzaWdzZXRtYXNrICovCi0gIC8qIDExMSAqLyB7IDAsICJzaWdzdXNwZW5kIiB9LAotICB7IDAsIH0sIC8qIDExMiBpcyBvbGQgc2lnc3RhY2sgKi8KLSAgeyAwLCB9LCAvKiAxMTMgaXMgb2xkIHJlY3Ztc2cgKi8KLSAgeyAwLCB9LCAvKiAxMTQgaXMgb2xkIHNlbmRtc2cgKi8KLSAgLyogLSBpcyBvYnNvbGV0ZSB2dHJhY2UgKi8geyAwLCAidnRyYWNlCTExNSIgfSwKLSAgLyogMTE2ICovIHsgZG9fZ2V0dGltZW9mZGF5LCAiZ2V0dGltZW9mZGF5IiB9LAotICAvKiAxMTcgKi8geyBkb19nZXRydXNhZ2UsICJnZXRydXNhZ2UiIH0sCi0gIC8qIDExOCAqLyB7IDAsICJnZXRzb2Nrb3B0IiB9LAotICAvKiAxMTkgKi8geyAwLCAicmVzdWJhIiB9LAotICAvKiAxMjAgKi8geyAwLCAicmVhZHYiIH0sCi0gIC8qIDEyMSAqLyB7IDAsICJ3cml0ZXYiIH0sCi0gIC8qIDEyMiAqLyB7IDAsICJzZXR0aW1lb2ZkYXkiIH0sCi0gIC8qIDEyMyAqLyB7IDAsICJmY2hvd24iIH0sCi0gIC8qIDEyNCAqLyB7IDAsICJmY2htb2QiIH0sCi0gIHsgMCwgfSwgLyogMTI1IGlzIG9sZCByZWN2ZnJvbSAqLwotICB7IDAsIH0sIC8qIDEyNiBpcyBvbGQgc2V0cmV1aWQgKi8KLSAgeyAwLCB9LCAvKiAxMjcgaXMgb2xkIHNldHJlZ2lkICovCi0gIC8qIDEyOCAqLyB7IDAsICJyZW5hbWUiIH0sCi0gIHsgMCwgfSwgLyogMTI5IGlzIG9sZCB0cnVuY2F0ZSAqLwotICB7IDAsIH0sIC8qIDEzMCBpcyBvbGQgZnRydW5jYXRlICovCi0gIC8qIDEzMSAqLyB7IDAsICJmbG9jayIgfSwKLSAgLyogMTMyICovIHsgMCwgIm1rZmlmbyIgfSwKLSAgLyogMTMzICovIHsgMCwgInNlbmR0byIgfSwKLSAgLyogMTM0ICovIHsgMCwgInNodXRkb3duIiB9LAotICAvKiAxMzUgKi8geyAwLCAic29ja2V0cGFpciIgfSwKLSAgLyogMTM2ICovIHsgMCwgIm1rZGlyIiB9LAotICAvKiAxMzcgKi8geyAwLCAicm1kaXIiIH0sCi0gIC8qIDEzOCAqLyB7IDAsICJ1dGltZXMiIH0sCi0gIHsgMCwgfSwgLyogMTM5IGlzIG9ic29sZXRlIDQuMiBzaWdyZXR1cm4gKi8KLSAgLyogMTQwICovIHsgMCwgImFkanRpbWUiIH0sCi0gIHsgMCwgfSwgLyogMTQxIGlzIG9sZCBnZXRwZWVybmFtZSAqLwotICB7IDAsIH0sIC8qIDE0MiBpcyBvbGQgZ2V0aG9zdGlkICovCi0gIHsgMCwgfSwgLyogMTQzIGlzIG9sZCBzZXRob3N0aWQgKi8KLSAgeyAwLCB9LCAvKiAxNDQgaXMgb2xkIGdldHJsaW1pdCAqLwotICB7IDAsIH0sIC8qIDE0NSBpcyBvbGQgc2V0cmxpbWl0ICovCi0gIHsgMCwgfSwgLyogMTQ2IGlzIG9sZCBraWxscGcgKi8KLSAgLyogMTQ3ICovIHsgMCwgInNldHNpZCIgfSwKLSAgLyogMTQ4ICovIHsgMCwgInF1b3RhY3RsIiB9LAotICB7IDAsIH0sIC8qIDE0OSBpcyBvbGQgcXVvdGEgKi8KLSAgeyAwLCB9LCAvKiAxNTAgaXMgb2xkIGdldHNvY2tuYW1lICovCi0gIHsgMCwgfSwgLyogMTUxICovCi0gIHsgMCwgfSwgLyogMTUyICovCi0gIHsgMCwgfSwgLyogMTUzICovCi0gIHsgMCwgfSwgLyogMTU0ICovCi0gIC8qIDE1NSAqLyB7IDAsICJuZnNzdmMiIH0sCi0gIHsgMCwgfSwgLyogMTU2IGlzIG9sZCBnZXRkaXJlbnRyaWVzICovCi0gIC8qIDE1NyAqLyB7IDAsICJzdGF0ZnMiIH0sCi0gIC8qIDE1OCAqLyB7IGRvX2ZzdGF0ZnMsICJmc3RhdGZzIiB9LAotICB7IDAsIH0sIC8qIDE1OSAqLwotICB7IDAsIH0sIC8qIDE2MCAqLwotICAvKiAxNjEgKi8geyAwLCAiZ2V0ZmgiIH0sCi0gIHsgMCwgfSwgLyogMTYyIGlzIG9sZCBnZXRkb21haW5uYW1lICovCi0gIHsgMCwgfSwgLyogMTYzIGlzIG9sZCBzZXRkb21haW5uYW1lICovCi0gIHsgMCwgfSwgLyogMTY0IGlzIG9sZCB1bmFtZSAqLwotICAvKiAxNjUgKi8geyAwLCAic3lzYXJjaCIgfSwKLSAgeyAwLCB9LCAvKiAxNjYgKi8KLSAgeyAwLCB9LCAvKiAxNjcgKi8KLSAgeyAwLCB9LCAvKiAxNjggKi8KLSAgLyogMTY5ICovIHsgMCwgInNlbXN5cyIgfSwKLSAgLyogMTcwICovIHsgMCwgIm1zZ3N5cyIgfSwKLSAgLyogMTcxICovIHsgMCwgInNobXN5cyIgfSwKLSAgeyAwLCB9LCAvKiAxNzIgKi8KLSAgeyAwLCB9LCAvKiAxNzMgKi8KLSAgeyAwLCB9LCAvKiAxNzQgKi8KLSAgeyAwLCB9LCAvKiAxNzUgKi8KLSAgeyAwLCB9LCAvKiAxNzYgKi8KLSAgeyAwLCB9LCAvKiAxNzcgKi8KLSAgeyAwLCB9LCAvKiAxNzggKi8KLSAgeyAwLCB9LCAvKiAxNzkgKi8KLSAgeyAwLCB9LCAvKiAxODAgKi8KLSAgLyogMTgxICovIHsgMCwgInNldGdpZCIgfSwKLSAgLyogMTgyICovIHsgMCwgInNldGVnaWQiIH0sCi0gIC8qIDE4MyAqLyB7IDAsICJzZXRldWlkIiB9LAotICAvKiAxODQgKi8geyAwLCAibGZzX2JtYXB2IiB9LAotICAvKiAxODUgKi8geyAwLCAibGZzX21hcmt2IiB9LAotICAvKiAxODYgKi8geyAwLCAibGZzX3NlZ2NsZWFuIiB9LAotICAvKiAxODcgKi8geyAwLCAibGZzX3NlZ3dhaXQiIH0sCi0gIC8qIDE4OCAqLyB7IGRvX3N0YXQsICJzdGF0IiB9LAotICAvKiAxODkgKi8geyBkb19mc3RhdCwgImZzdGF0IiB9LAotICAvKiAxOTAgKi8geyBkb19sc3RhdCwgImxzdGF0IiB9LAotICAvKiAxOTEgKi8geyAwLCAicGF0aGNvbmYiIH0sCi0gIC8qIDE5MiAqLyB7IDAsICJmcGF0aGNvbmYiIH0sCi0gIHsgMCwgfSwgLyogMTkzICovCi0gIC8qIDE5NCAqLyB7IDAsICJnZXRybGltaXQiIH0sCi0gIC8qIDE5NSAqLyB7IDAsICJzZXRybGltaXQiIH0sCi0gIC8qIDE5NiAqLyB7IGRvX2dldGRpcmVudHJpZXMsICJnZXRkaXJlbnRyaWVzIiB9LAotICAvKiAxOTcgKi8geyAwLCAibW1hcCIgfSwKLSAgLyogMTk4ICovIHsgZG9fX19zeXNjYWxsLCAiX19zeXNjYWxsIiB9LAotICAvKiAxOTkgKi8geyBkb19sc2VlaywgImxzZWVrIiB9LAotICAvKiAyMDAgKi8geyAwLCAidHJ1bmNhdGUiIH0sCi0gIC8qIDIwMSAqLyB7IDAsICJmdHJ1bmNhdGUiIH0sCi0gIC8qIDIwMiAqLyB7IGRvX19fc3lzY3RsLCAiX19zeXNjdGwiIH0sCi0gIC8qIDIwMyAqLyB7IDAsICJtbG9jayIgfSwKLSAgLyogMjA0ICovIHsgMCwgIm11bmxvY2siIH0sCi19OwotCi1zdGF0aWMgY2hhciAqKG5ldGJzZF9lcnJvcl9uYW1lc1tdKSA9IHsKLSAgLyogMCAqLyAiRVNVQ0NFU1MiLAotICAvKiAxICovICJFUEVSTSIsCi0gIC8qIDIgKi8gIkVOT0VOVCIsCi0gIC8qIDMgKi8gIkVTUkNIIiwKLSAgLyogNCAqLyAiRUlOVFIiLAotICAvKiA1ICovICJFSU8iLAotICAvKiA2ICovICJFTlhJTyIsCi0gIC8qIDcgKi8gIkUyQklHIiwKLSAgLyogOCAqLyAiRU5PRVhFQyIsCi0gIC8qIDkgKi8gIkVCQURGIiwKLSAgLyogMTAgKi8gIkVDSElMRCIsCi0gIC8qIDExICovICJFREVBRExLIiwKLSAgLyogMTIgKi8gIkVOT01FTSIsCi0gIC8qIDEzICovICJFQUNDRVMiLAotICAvKiAxNCAqLyAiRUZBVUxUIiwKLSAgLyogMTUgKi8gIkVOT1RCTEsiLAotICAvKiAxNiAqLyAiRUJVU1kiLAotICAvKiAxNyAqLyAiRUVYSVNUIiwKLSAgLyogMTggKi8gIkVYREVWIiwKLSAgLyogMTkgKi8gIkVOT0RFViIsCi0gIC8qIDIwICovICJFTk9URElSIiwKLSAgLyogMjEgKi8gIkVJU0RJUiIsCi0gIC8qIDIyICovICJFSU5WQUwiLAotICAvKiAyMyAqLyAiRU5GSUxFIiwKLSAgLyogMjQgKi8gIkVNRklMRSIsCi0gIC8qIDI1ICovICJFTk9UVFkiLAotICAvKiAyNiAqLyAiRVRYVEJTWSIsCi0gIC8qIDI3ICovICJFRkJJRyIsCi0gIC8qIDI4ICovICJFTk9TUEMiLAotICAvKiAyOSAqLyAiRVNQSVBFIiwKLSAgLyogMzAgKi8gIkVST0ZTIiwKLSAgLyogMzEgKi8gIkVNTElOSyIsCi0gIC8qIDMyICovICJFUElQRSIsCi0gIC8qIDMzICovICJFRE9NIiwKLSAgLyogMzQgKi8gIkVSQU5HRSIsCi0gIC8qIDM1ICovICJFQUdBSU4iLAotICAvKiAzNiAqLyAiRUlOUFJPR1JFU1MiLAotICAvKiAzNyAqLyAiRUFMUkVBRFkiLAotICAvKiAzOCAqLyAiRU5PVFNPQ0siLAotICAvKiAzOSAqLyAiRURFU1RBRERSUkVRIiwKLSAgLyogNDAgKi8gIkVNU0dTSVpFIiwKLSAgLyogNDEgKi8gIkVQUk9UT1RZUEUiLAotICAvKiA0MiAqLyAiRU5PUFJPVE9PUFQiLAotICAvKiA0MyAqLyAiRVBST1RPTk9TVVBQT1JUIiwKLSAgLyogNDQgKi8gIkVTT0NLVE5PU1VQUE9SVCIsCi0gIC8qIDQ1ICovICJFT1BOT1RTVVBQIiwKLSAgLyogNDYgKi8gIkVQRk5PU1VQUE9SVCIsCi0gIC8qIDQ3ICovICJFQUZOT1NVUFBPUlQiLAotICAvKiA0OCAqLyAiRUFERFJJTlVTRSIsCi0gIC8qIDQ5ICovICJFQUREUk5PVEFWQUlMIiwKLSAgLyogNTAgKi8gIkVORVRET1dOIiwKLSAgLyogNTEgKi8gIkVORVRVTlJFQUNIIiwKLSAgLyogNTIgKi8gIkVORVRSRVNFVCIsCi0gIC8qIDUzICovICJFQ09OTkFCT1JURUQiLAotICAvKiA1NCAqLyAiRUNPTk5SRVNFVCIsCi0gIC8qIDU1ICovICJFTk9CVUZTIiwKLSAgLyogNTYgKi8gIkVJU0NPTk4iLAotICAvKiA1NyAqLyAiRU5PVENPTk4iLAotICAvKiA1OCAqLyAiRVNIVVRET1dOIiwKLSAgLyogNTkgKi8gIkVUT09NQU5ZUkVGUyIsCi0gIC8qIDYwICovICJFVElNRURPVVQiLAotICAvKiA2MSAqLyAiRUNPTk5SRUZVU0VEIiwKLSAgLyogNjIgKi8gIkVMT09QIiwKLSAgLyogNjMgKi8gIkVOQU1FVE9PTE9ORyIsCi0gIC8qIDY0ICovICJFSE9TVERPV04iLAotICAvKiA2NSAqLyAiRUhPU1RVTlJFQUNIIiwKLSAgLyogNjYgKi8gIkVOT1RFTVBUWSIsCi0gIC8qIDY3ICovICJFUFJPQ0xJTSIsCi0gIC8qIDY4ICovICJFVVNFUlMiLAotICAvKiA2OSAqLyAiRURRVU9UIiwKLSAgLyogNzAgKi8gIkVTVEFMRSIsCi0gIC8qIDcxICovICJFUkVNT1RFIiwKLSAgLyogNzIgKi8gIkVCQURSUEMiLAotICAvKiA3MyAqLyAiRVJQQ01JU01BVENIIiwKLSAgLyogNzQgKi8gIkVQUk9HVU5BVkFJTCIsCi0gIC8qIDc1ICovICJFUFJPR01JU01BVENIIiwKLSAgLyogNzYgKi8gIkVQUk9DVU5BVkFJTCIsCi0gIC8qIDc3ICovICJFTk9MQ0siLAotICAvKiA3OCAqLyAiRU5PU1lTIiwKLSAgLyogNzkgKi8gIkVGVFlQRSIsCi0gIC8qIDgwICovICJFQVVUSCIsCi0gIC8qIDgxICovICJFTkVFREFVVEgiLAotICAvKiA4MSAqLyAiRUxBU1QiLAotfTsKLQotc3RhdGljIGNoYXIgKihuZXRic2Rfc2lnbmFsX25hbWVzW10pID0gewotICAvKiAwICovIDAsCi0gIC8qIDEgKi8gIlNJR0hVUCIsCi0gIC8qIDIgKi8gIlNJR0lOVCIsCi0gIC8qIDMgKi8gIlNJR1FVSVQiLAotICAvKiA0ICovICJTSUdJTEwiLAotICAvKiA1ICovICJTSUdUUkFQIiwKLSAgLyogNiAqLyAiU0lHQUJSVCIsCi0gIC8qIDcgKi8gIlNJR0VNVCIsCi0gIC8qIDggKi8gIlNJR0ZQRSIsCi0gIC8qIDkgKi8gIlNJR0tJTEwiLAotICAvKiAxMCAqLyAiU0lHQlVTIiwKLSAgLyogMTEgKi8gIlNJR1NFR1YiLAotICAvKiAxMiAqLyAiU0lHU1lTIiwKLSAgLyogMTMgKi8gIlNJR1BJUEUiLAotICAvKiAxNCAqLyAiU0lHQUxSTSIsCi0gIC8qIDE1ICovICJTSUdURVJNIiwKLSAgLyogMTYgKi8gIlNJR1VSRyIsCi0gIC8qIDE3ICovICJTSUdTVE9QIiwKLSAgLyogMTggKi8gIlNJR1RTVFAiLAotICAvKiAxOSAqLyAiU0lHQ09OVCIsCi0gIC8qIDIwICovICJTSUdDSExEIiwKLSAgLyogMjEgKi8gIlNJR1RUSU4iLAotICAvKiAyMiAqLyAiU0lHVFRPVSIsCi0gIC8qIDIzICovICJTSUdJTyIsCi0gIC8qIDI0ICovICJTSUdYQ1BVIiwKLSAgLyogMjUgKi8gIlNJR1hGU1oiLAotICAvKiAyNiAqLyAiU0lHVlRBTFJNIiwKLSAgLyogMjcgKi8gIlNJR1BST0YiLAotICAvKiAyOCAqLyAiU0lHV0lOQ0giLAotICAvKiAyOSAqLyAiU0lHSU5GTyIsCi0gIC8qIDMwICovICJTSUdVU1IxIiwKLSAgLyogMzEgKi8gIlNJR1VTUjIiLAotfTsKLQotc3RhdGljIGVtdWxfc3lzY2FsbCBlbXVsX25ldGJzZF9zeXNjYWxscyA9IHsKLSAgbmV0YnNkX2Rlc2NyaXB0b3JzLAotICBzaXplb2YobmV0YnNkX2Rlc2NyaXB0b3JzKSAvIHNpemVvZihuZXRic2RfZGVzY3JpcHRvcnNbMF0pLAotICBuZXRic2RfZXJyb3JfbmFtZXMsCi0gIHNpemVvZihuZXRic2RfZXJyb3JfbmFtZXMpIC8gc2l6ZW9mKG5ldGJzZF9lcnJvcl9uYW1lc1swXSksCi0gIG5ldGJzZF9zaWduYWxfbmFtZXMsCi0gIHNpemVvZihuZXRic2Rfc2lnbmFsX25hbWVzKSAvIHNpemVvZihuZXRic2Rfc2lnbmFsX25hbWVzWzBdKSwKLX07Ci0KLQotLyogTmV0QlNEJ3Mgb3NfZW11bCBpbnRlcmZhY2UsIG1vc3QgYXJlIGp1c3QgcGFzc2VkIG9uIHRvIHRoZSBnZW5lcmljCi0gICBzeXNjYWxsIHN0dWZmICovCi0KLXN0YXRpYyBvc19lbXVsX2RhdGEgKgotZW11bF9uZXRic2RfY3JlYXRlKGRldmljZSAqcm9vdCwKLQkJICAgYmZkICppbWFnZSwKLQkJICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgdW5zaWduZWRfd29yZCB0b3Bfb2Zfc3RhY2s7Ci0gIHVuc2lnbmVkIHN0YWNrX3NpemU7Ci0gIGludCBlbGZfYmluYXJ5OwotICBvc19lbXVsX2RhdGEgKmJzZF9kYXRhOwotICBkZXZpY2UgKnZtOwotCi0gIC8qIGNoZWNrIHRoYXQgdGhpcyBlbXVsYXRpb24gaXMgcmVhbGx5IGZvciB1cyAqLwotICBpZiAobmFtZSAhPSBOVUxMICYmIHN0cmNtcChuYW1lLCAibmV0YnNkIikgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGltYWdlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLQotICAvKiBtZXJnZSBhbnkgZW11bGF0aW9uIHNwZWNpZmljIGVudHJpZXMgaW50byB0aGUgZGV2aWNlIHRyZWUgKi8KLQotICAvKiBlc3RhYmxpc2ggYSBmZXcgZGVmYXVsdHMgKi8KLSAgaWYgKGltYWdlLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpIHsKLSAgICBlbGZfYmluYXJ5ID0gMTsKLSAgICB0b3Bfb2Zfc3RhY2sgPSAweGUwMDAwMDAwOwotICAgIHN0YWNrX3NpemUgPSAgIDB4MDAxMDAwMDA7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWxmX2JpbmFyeSA9IDA7Ci0gICAgdG9wX29mX3N0YWNrID0gMHgyMDAwMDAwMDsKLSAgICBzdGFja19zaXplID0gICAweDAwMTAwMDAwOwotICB9Ci0KLSAgLyogb3B0aW9ucyAqLwotICBlbXVsX2FkZF90cmVlX29wdGlvbnMocm9vdCwgaW1hZ2UsICJuZXRic2QiLAotCQkJKFdJVEhfRU5WSVJPTk1FTlQgPT0gVVNFUl9FTlZJUk9OTUVOVAotCQkJID8gInVzZXIiIDogInZpcnR1YWwiKSwKLQkJCTAgLypvZWEtaW50ZXJydXB0LXByZWZpeCovKTsKLQotICAvKiB2aXJ0dWFsIG1lbW9yeSAtIGhhbmRsZXMgZ3Jvd3RoIG9mIHN0YWNrL2hlYXAgKi8KLSAgdm0gPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdm0iKTsKLSAgdHJlZV9wYXJzZSh2bSwgIi4vc3RhY2stYmFzZSAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZykodG9wX29mX3N0YWNrIC0gc3RhY2tfc2l6ZSkpOwotICB0cmVlX3BhcnNlKHZtLCAiLi9uci1ieXRlcyAweCV4Iiwgc3RhY2tfc2l6ZSk7Ci0KLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3ZtL21hcC1iaW5hcnkvZmlsZS1uYW1lICVzIiwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUoaW1hZ2UpKTsKLQotICAvKiBmaW5pc2ggdGhlIGluaXQgKi8KLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpYmZkX2dldF9zdGFydF9hZGRyZXNzKGltYWdlKSk7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3NwIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKXRvcF9vZl9zdGFjayk7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL21zciAweCV4IiwKLQkgICAgICgodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IikKLQkgICAgICAgPyBtc3JfbGl0dGxlX2VuZGlhbl9tb2RlCi0JICAgICAgIDogMCkKLQkgICAgICB8ICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvZmxvYXRpbmctcG9pbnQ/IikKLQkJID8gKG1zcl9mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKLQkJICAgIHwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAKLQkJICAgIHwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzEpCi0JCSA6IDApKSk7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3N0YWNrL3N0YWNrLXR5cGUgJXMiLAotCSAgICAgKGVsZl9iaW5hcnkgPyAicHBjLWVsZiIgOiAicHBjLXhjb2ZmIikpOwotCi0gIC8qIGZpbmFsbHkgb3VyIGVtdWxhdGlvbiBkYXRhICovCi0gIGJzZF9kYXRhID0gWkFMTE9DKG9zX2VtdWxfZGF0YSk7Ci0gIGJzZF9kYXRhLT52bSA9IHZtOwotICBic2RfZGF0YS0+c3lzY2FsbHMgPSAmZW11bF9uZXRic2Rfc3lzY2FsbHM7Ci0gIHJldHVybiBic2RfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLWVtdWxfbmV0YnNkX2luaXQob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCi0JCSBpbnQgbnJfY3B1cykKLXsKLSAgLyogbm90aGluZyB5ZXQgKi8KLX0KLQotc3RhdGljIHZvaWQKLWVtdWxfbmV0YnNkX3N5c3RlbV9jYWxsKGNwdSAqcHJvY2Vzc29yLAotCQkJdW5zaWduZWRfd29yZCBjaWEsCi0JCQlvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSkKLXsKLSAgZW11bF9kb19zeXN0ZW1fY2FsbChlbXVsX2RhdGEsCi0JCSAgICAgIGVtdWxfZGF0YS0+c3lzY2FsbHMsCi0JCSAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzBdLAotCQkgICAgICAzLCAvKnIzIGNvbnRhaW5zIGFyZzAqLwotCQkgICAgICBwcm9jZXNzb3IsCi0JCSAgICAgIGNpYSk7Ci19Ci0KLWNvbnN0IG9zX2VtdWwgZW11bF9uZXRic2QgPSB7Ci0gICJuZXRic2QiLAotICBlbXVsX25ldGJzZF9jcmVhdGUsCi0gIGVtdWxfbmV0YnNkX2luaXQsCi0gIGVtdWxfbmV0YnNkX3N5c3RlbV9jYWxsLAotICAwLCAvKmluc3RydWN0aW9uX2NhbGwqLwotICAwIC8qZGF0YSovCi19OwotCi0jZW5kaWYgX0VNVUxfTkVUQlNEX0NfCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfbmV0YnNkLmggYi9zaW0vcHBjL2VtdWxfbmV0YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTNlODUuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9lbXVsX25ldGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfRU1VTF9ORVRCU0RfSF8KLSNkZWZpbmUgX0VNVUxfTkVUQlNEX0hfCi0KLWV4dGVybiBjb25zdCBvc19lbXVsIGVtdWxfbmV0YnNkOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZW11bF91bml4LmMgYi9zaW0vcHBjL2VtdWxfdW5peC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU1NjI5Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZW11bF91bml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODEyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICAgKi8KLQotCi0jaWZuZGVmIF9FTVVMX1VOSVhfQ18KLSNkZWZpbmUgX0VNVUxfVU5JWF9DXwotCi0KLS8qIE5vdGU6IHRoaXMgbW9kdWxlIGlzIGNhbGxlZCB2aWEgYSB0YWJsZS4gIFRoZXJlIGlzIG5vIGJlbmVmaXQgaW4KLSAgIG1ha2luZyBpdCBpbmxpbmUgKi8KLQotI2luY2x1ZGUgImVtdWxfZ2VuZXJpYy5oIgotI2luY2x1ZGUgImVtdWxfdW5peC5oIgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2Vsc2UKLSN1bmRlZiBIQVZFX1NUQVQKLSN1bmRlZiBIQVZFX0xTVEFUCi0jdW5kZWYgSEFWRV9GU1RBVAotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCi0jdW5kZWYgSEFWRV9TWVNfVEVSTUlPU19ICi0jdW5kZWYgSEFWRV9UQ0dFVEFUVFIKLSNlbHNlCi0jaWZuZGVmIEhBVkVfU1lTX1RFUk1JT1NfSAotI3VuZGVmIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCi0jaW5jbHVkZSA8c3lzL3Rlcm1pb3MuaD4KLQotLyogSWYgd2UgaGF2ZSBURVJNSU9TLCB1c2UgdGhhdCBmb3IgdGhlIHRlcm1pbyBzdHJ1Y3R1cmUsIHNpbmNlIHNvbWUgc3lzdGVtcwotICAgZG9uJ3QgbGlrZSBpbmNsdWRpbmcgYm90aCBzeXMvdGVybWlvcy5oIGFuZCBzeXMvdGVybWlvLmggYXQgdGhlIHNhbWUKLSAgIHRpbWUuICAqLwotI3VuZGVmCUhBVkVfVEVSTUlPX1NUUlVDVFVSRQotI3VuZGVmCVRDR0VUQQotI3VuZGVmCXRlcm1pbwotI2RlZmluZSB0ZXJtaW8gdGVybWlvcwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9URVJNSU9fU1RSVUNUVVJFCi0jdW5kZWYgSEFWRV9TWVNfVEVSTUlPX0gKLSNlbHNlCi0jaWZuZGVmIEhBVkVfU1lTX1RFUk1JT19ICi0jdW5kZWYgSEFWRV9URVJNSU9fU1RSVUNUVVJFCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9URVJNSU9fU1RSVUNUVVJFCi0jaW5jbHVkZSA8c3lzL3Rlcm1pby5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotI2lmbmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotaW50IGdldHJ1c2FnZSgpOwotI2VuZGlmCi0KLSNpZiBIQVZFX0RJUkVOVF9ICi0jIGluY2x1ZGUgPGRpcmVudC5oPgotIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCi0jZWxzZQotIyBkZWZpbmUgZGlyZW50IGRpcmVjdAotIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCi0jIGlmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI3VuZGVmIE1BWFBBVEhMRU4JCS8qIHN5cy9wYXJhbS5oIG1pZ2h0IGRlZmluZSB0aGlzIGFsc28gKi8KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJTRCkgJiYgIWRlZmluZWQoZXJybm8pICYmIChCU0QgPCAxOTkzMDYpCS8qIGhlcmUgQlNEIGFzIGp1c3QgYSBidWcgKi8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0VNVUxfVU5JWAotI2RlZmluZSBTVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCBTVEFUSUNfSU5MSU5FCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAotI2RlZmluZSBQQVRIX01BWCAxMDI0Ci0jZW5kaWYKLQotI2lmbmRlZiBFSU5WQUwKLSNkZWZpbmUgRUlOVkFMIC0xCi0jZW5kaWYKLQotLyogVU5JWCdzIGlkZWEgb2Ygd2hhdCBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IGVtdWxhdGlvbnMgKi8KLQotc3RydWN0IF9vc19lbXVsX2RhdGEgewotICBkZXZpY2UgKnZtOwotICBlbXVsX3N5c2NhbGwgKnN5c2NhbGxzOwotfTsKLQotDAotLyogRW11bGF0aW9uIG9mIHNpbXBsZSBVTklYIHN5c3RlbSBjYWxscyB0aGF0IGFyZSBjb21tb24gb24gYWxsIHN5c3RlbXMuICAqLwotCi0vKiBTdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvbW1vbiBhZ21vbnN0IHRoZSBVTklYIHZhcmllbnRzICovCi1zdHJ1Y3QgdW5peF90aW1ldmFsIHsKLSAgc2lnbmVkMzIgdHZfc2VjOwkJLyogc2Vjb25kcyAqLwotICBzaWduZWQzMiB0dl91c2VjOwkJLyogbWljcm9zZWNvbmRzICovCi19OwotCi1zdHJ1Y3QgdW5peF90aW1lem9uZSB7Ci0gIHNpZ25lZDMyIHR6X21pbnV0ZXN3ZXN0OwkvKiBtaW51dGVzIHdlc3Qgb2YgR3JlZW53aWNoICovCi0gIHNpZ25lZDMyIHR6X2RzdHRpbWU7CQkvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCi19OwotCi0jZGVmaW5lCVVOSVhfUlVTQUdFX1NFTEYJMAotI2RlZmluZQlVTklYX1JVU0FHRV9DSElMRFJFTgkoLTEpCi0jZGVmaW5lIFVOSVhfUlVTQUdFX0JPVEgJKC0yKQkvKiBzeXNfd2FpdDQoKSB1c2VzIHRoaXMgKi8KLQotc3RydWN0CXVuaXhfcnVzYWdlIHsKLQlzdHJ1Y3QgdW5peF90aW1ldmFsIHJ1X3V0aW1lOwkvKiB1c2VyIHRpbWUgdXNlZCAqLwotCXN0cnVjdCB1bml4X3RpbWV2YWwgcnVfc3RpbWU7CS8qIHN5c3RlbSB0aW1lIHVzZWQgKi8KLQlzaWduZWQzMiBydV9tYXhyc3M7CQkvKiBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplICovCi0Jc2lnbmVkMzIgcnVfaXhyc3M7CQkvKiBpbnRlZ3JhbCBzaGFyZWQgbWVtb3J5IHNpemUgKi8KLQlzaWduZWQzMiBydV9pZHJzczsJCS8qIGludGVncmFsIHVuc2hhcmVkIGRhdGEgc2l6ZSAqLwotCXNpZ25lZDMyIHJ1X2lzcnNzOwkJLyogaW50ZWdyYWwgdW5zaGFyZWQgc3RhY2sgc2l6ZSAqLwotCXNpZ25lZDMyIHJ1X21pbmZsdDsJCS8qIGFueSBwYWdlIGZhdWx0cyBub3QgcmVxdWlyaW5nIEkvTyAqLwotCXNpZ25lZDMyIHJ1X21hamZsdDsJCS8qIGFueSBwYWdlIGZhdWx0cyByZXF1aXJpbmcgSS9PICovCi0Jc2lnbmVkMzIgcnVfbnN3YXA7CQkvKiBzd2FwcyAqLwotCXNpZ25lZDMyIHJ1X2luYmxvY2s7CQkvKiBibG9jayBpbnB1dCBvcGVyYXRpb25zICovCi0Jc2lnbmVkMzIgcnVfb3VibG9jazsJCS8qIGJsb2NrIG91dHB1dCBvcGVyYXRpb25zICovCi0Jc2lnbmVkMzIgcnVfbXNnc25kOwkJLyogbWVzc2FnZXMgc2VudCAqLwotCXNpZ25lZDMyIHJ1X21zZ3JjdjsJCS8qIG1lc3NhZ2VzIHJlY2VpdmVkICovCi0Jc2lnbmVkMzIgcnVfbnNpZ25hbHM7CQkvKiBzaWduYWxzIHJlY2VpdmVkICovCi0Jc2lnbmVkMzIgcnVfbnZjc3c7CQkvKiB2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAqLwotCXNpZ25lZDMyIHJ1X25pdmNzdzsJCS8qIGludm9sdW50YXJ5ICIgKi8KLX07Ci0KLQotc3RhdGljIHZvaWQKLWRvX3VuaXhfZXhpdChvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgc3RhdHVzID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkKVxuIiwgc3RhdHVzKTsKLQotICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2V4aXRlZCwgc3RhdHVzKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fdW5peF9yZWFkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHZvaWQgKnNjcmF0Y2hfYnVmZmVyOwotICBpbnQgZCA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkX3dvcmQgYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IG5ieXRlcyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAweCVseCwgJWQiLCBkLCAobG9uZylidWYsIG5ieXRlcyk7Ci0KLSAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KLSAgc2NyYXRjaF9idWZmZXIgPSB6YWxsb2MobmJ5dGVzKTsKLQotICAvKiBjaGVjayBpZiBidWZmZXIgZXhpc3RzIGJ5IHJlYWRpbmcgaXQgKi8KLSAgZW11bF9yZWFkX2J1ZmZlcihzY3JhdGNoX2J1ZmZlciwgYnVmLCBuYnl0ZXMsIHByb2Nlc3NvciwgY2lhKTsKLQotICAvKiByZWFkICovCi0gIHN0YXR1cyA9IHJlYWQgKGQsIHNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci0gIGlmIChzdGF0dXMgPiAwKQotICAgIGVtdWxfd3JpdGVfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIHN0YXR1cywgcHJvY2Vzc29yLCBjaWEpOwotCi0gIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fdW5peF93cml0ZShvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdm9pZCAqc2NyYXRjaF9idWZmZXIgPSBOVUxMOwotICBpbnQgZCA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkX3dvcmQgYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IG5ieXRlcyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAweCVseCwgJWQiLCBkLCAobG9uZylidWYsIG5ieXRlcyk7Ci0KLSAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KLSAgc2NyYXRjaF9idWZmZXIgPSB6YWxsb2MobmJ5dGVzKTsgLyogRklYTUUgLSBuYnl0ZXMgPT0gMCAqLwotCi0gIC8qIGNvcHkgaW4gKi8KLSAgZW11bF9yZWFkX2J1ZmZlcihzY3JhdGNoX2J1ZmZlciwgYnVmLCBuYnl0ZXMsCi0JCSAgIHByb2Nlc3NvciwgY2lhKTsKLQotICAvKiB3cml0ZSAqLwotICBzdGF0dXMgPSB3cml0ZShkLCBzY3JhdGNoX2J1ZmZlciwgbmJ5dGVzKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLSAgemZyZWUoc2NyYXRjaF9idWZmZXIpOwotCi0gIGZsdXNoX3N0ZG91dHB1dCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb191bml4X29wZW4ob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIGludCBmbGFncyA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IG1vZGUgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDB4JXgsIDB4JXgiLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIGZsYWdzLCBtb2RlKTsKLQotICBzdGF0dXMgPSBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlKTsKLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fdW5peF9jbG9zZShvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCIsIGQpOwotCi0gIHN0YXR1cyA9IGNsb3NlKGQpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb191bml4X2JyZWFrKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICAvKiBqdXN0IHBhc3MgdGhpcyBvbnRvIHRoZSBgdm0nIGRldmljZSAqLwotICB1bnNpZ25lZF93b3JkIG5ld19icmVhayA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCIsIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdKTsKLQotICBzdGF0dXMgPSBkZXZpY2VfaW9jdGwoZW11bC0+dm0sCi0JCQlwcm9jZXNzb3IsCi0JCQljaWEsCi0JCQlkZXZpY2VfaW9jdGxfYnJlYWssCi0JCQluZXdfYnJlYWspOyAvKmlvY3RsLWRhdGEqLwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgMCwgc3RhdHVzKTsKLX0KLQotI2lmbmRlZiBIQVZFX0FDQ0VTUwotI2RlZmluZSBkb191bml4X2FjY2VzcyAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfYWNjZXNzKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIGludCBtb2RlID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCV4IFswJW9dIiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCBtb2RlLCBtb2RlKTsKLQotICBzdGF0dXMgPSBhY2Nlc3MocGF0aCwgbW9kZSk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVFBJRAotI2RlZmluZSBkb191bml4X2dldHBpZCAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfZ2V0cGlkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgcGlkX3Qgc3RhdHVzID0gZ2V0cGlkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VUUFBJRAotI2RlZmluZSBkb191bml4X2dldHBwaWQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2dldHBwaWQob3NfZW11bF9kYXRhICplbXVsLAotCQl1bnNpZ25lZCBjYWxsLAotCQljb25zdCBpbnQgYXJnMCwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBwaWRfdCBzdGF0dXMgPSBnZXRwcGlkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRQSUQpIHx8ICFkZWZpbmVkKEhBVkVfR0VUUFBJRCkKLSNkZWZpbmUgZG9fdW5peF9nZXRwaWQyIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9nZXRwaWQyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJdW5zaWduZWQgY2FsbCwKLQkJY29uc3QgaW50IGFyZzAsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaW50IHBpZCAgPSAoaW50KWdldHBpZCgpOwotICBpbnQgcHBpZCA9IChpbnQpZ2V0cHBpZCgpOwotICBlbXVsX3dyaXRlMl9zdGF0dXMocHJvY2Vzc29yLCBwaWQsIHBwaWQsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRVSUQpIHx8ICFkZWZpbmVkKEhBVkVfR0VURVVJRCkKLSNkZWZpbmUgZG9fdW5peF9nZXR1aWQyIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9nZXR1aWQyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJdW5zaWduZWQgY2FsbCwKLQkJY29uc3QgaW50IGFyZzAsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdWlkX3QgdWlkICA9IGdldHVpZCgpOwotICB1aWRfdCBldWlkID0gZ2V0ZXVpZCgpOwotICBlbXVsX3dyaXRlMl9zdGF0dXMocHJvY2Vzc29yLCAoaW50KXVpZCwgKGludClldWlkLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVFVJRAotI2RlZmluZSBkb191bml4X2dldHVpZCAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfZ2V0dWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdWlkX3Qgc3RhdHVzID0gZ2V0dWlkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VURVVJRAotI2RlZmluZSBkb191bml4X2dldGV1aWQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2dldGV1aWQob3NfZW11bF9kYXRhICplbXVsLAotCQl1bnNpZ25lZCBjYWxsLAotCQljb25zdCBpbnQgYXJnMCwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1aWRfdCBzdGF0dXMgPSBnZXRldWlkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWYgMAotI2lmbmRlZiBIQVZFX0tJTEwKLSNkZWZpbmUgZG9fdW5peF9raWxsIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9raWxsKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHBpZF90IHBpZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc2lnID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsICVkIiwgKGludClwaWQsIHNpZyk7Ci0KLSAgcHJpbnRmX2ZpbHRlcmVkKCJTWVNfa2lsbCBhdCAweCVseCAtIG1vcmUgdG8gdGhpcyB0aGFuIGp1c3QgYmVpbmcga2lsbGVkXG4iLAotCQkgIChsb25nKWNpYSk7Ci0KLSAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19zaWduYWxsZWQsIHNpZyk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRFVQCi0jZGVmaW5lIGRvX3VuaXhfZHVwIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9kdXAob3NfZW11bF9kYXRhICplbXVsLAotCSAgICB1bnNpZ25lZCBjYWxsLAotCSAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgb2xkZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBpbnQgc3RhdHVzID0gZHVwKG9sZGQpOwotICBpbnQgZXJyID0gZXJybm87Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkIiwgb2xkZCk7Ci0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycik7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0RVUDIKLSNkZWZpbmUgZG9fdW5peF9kdXAyIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9kdXAyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBvbGRkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIGludCBuZXdkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IHN0YXR1cyA9IGR1cDIob2xkZCwgbmV3ZCk7Ci0gIGludCBlcnIgPSBlcnJubzsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsICVkIiwgb2xkZCwgbmV3ZCk7Ci0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycik7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0xTRUVLCi0jZGVmaW5lIGRvX3VuaXhfbHNlZWsgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2xzZWVrKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgZmlsZGVzICAgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBvZmZfdCBvZmZzZXQgPSAob2ZmX3QpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgaW50IHdoZW5jZSAgID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOwotICBvZmZfdCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkICVsZCAlZCIsIGZpbGRlcywgKGxvbmcpb2Zmc2V0LCB3aGVuY2UpOwotCi0gIHN0YXR1cyA9IGxzZWVrKGZpbGRlcywgb2Zmc2V0LCB3aGVuY2UpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRHSUQpIHx8ICFkZWZpbmVkKEhBVkVfR0VURUdJRCkKLSNkZWZpbmUgZG9fdW5peF9nZXRnaWQyIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9nZXRnaWQyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJdW5zaWduZWQgY2FsbCwKLQkJY29uc3QgaW50IGFyZzAsCi0JCWNwdSAqcHJvY2Vzc29yLAotCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZ2lkX3QgZ2lkICA9IGdldGdpZCgpOwotICBnaWRfdCBlZ2lkID0gZ2V0ZWdpZCgpOwotICBlbXVsX3dyaXRlMl9zdGF0dXMocHJvY2Vzc29yLCAoaW50KWdpZCwgKGludCllZ2lkLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVEdJRAotI2RlZmluZSBkb191bml4X2dldGdpZCAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfZ2V0Z2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgZ2lkX3Qgc3RhdHVzID0gZ2V0Z2lkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VURUdJRAotI2RlZmluZSBkb191bml4X2dldGVnaWQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2dldGVnaWQob3NfZW11bF9kYXRhICplbXVsLAotCQl1bnNpZ25lZCBjYWxsLAotCQljb25zdCBpbnQgYXJnMCwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBnaWRfdCBzdGF0dXMgPSBnZXRlZ2lkKCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVU1BU0sKLSNkZWZpbmUgZG9fdW5peF91bWFzayAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfdW1hc2sob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIG1vZGVfdCBtYXNrID0gKG1vZGVfdCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgaW50IHN0YXR1cyA9IHVtYXNrKG1hc2spOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIwJW8iLCAodW5zaWduZWQgaW50KW1hc2spOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0NIRElSCi0jZGVmaW5lIGRvX3VuaXhfY2hkaXIgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2NoZGlyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBjaGFyIHBhdGhfYnVmW1BBVEhfTUFYXTsKLSAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSIsIChsb25nKXBhdGhfYWRkciwgcGF0aCk7Ci0KLSAgc3RhdHVzID0gY2hkaXIocGF0aCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0xJTksKLSNkZWZpbmUgZG9fdW5peF9saW5rIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9saW5rKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aDFfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBjaGFyIHBhdGgxX2J1ZltQQVRIX01BWF07Ci0gIGNoYXIgKnBhdGgxID0gZW11bF9yZWFkX3N0cmluZyhwYXRoMV9idWYsIHBhdGgxX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aDJfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGNoYXIgcGF0aDJfYnVmW1BBVEhfTUFYXTsKLSAgY2hhciAqcGF0aDIgPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGgyX2J1ZiwgcGF0aDJfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHggWyVzXSIsIChsb25nKXBhdGgxX2FkZHIsIHBhdGgxLCAobG9uZylwYXRoMl9hZGRyLCBwYXRoMik7Ci0KLSAgc3RhdHVzID0gbGluayhwYXRoMSwgcGF0aDIpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TWU1MSU5LCi0jZGVmaW5lIGRvX3VuaXhfc3ltbGluayAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfc3ltbGluayhvc19lbXVsX2RhdGEgKmVtdWwsCi0JCXVuc2lnbmVkIGNhbGwsCi0JCWNvbnN0IGludCBhcmcwLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aDFfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBjaGFyIHBhdGgxX2J1ZltQQVRIX01BWF07Ci0gIGNoYXIgKnBhdGgxID0gZW11bF9yZWFkX3N0cmluZyhwYXRoMV9idWYsIHBhdGgxX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aDJfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGNoYXIgcGF0aDJfYnVmW1BBVEhfTUFYXTsKLSAgY2hhciAqcGF0aDIgPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGgyX2J1ZiwgcGF0aDJfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHggWyVzXSIsIChsb25nKXBhdGgxX2FkZHIsIHBhdGgxLCAobG9uZylwYXRoMl9hZGRyLCBwYXRoMik7Ci0KLSAgc3RhdHVzID0gc3ltbGluayhwYXRoMSwgcGF0aDIpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VTkxJTksKLSNkZWZpbmUgZG9fdW5peF91bmxpbmsgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X3VubGluayhvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOwotICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdIiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoKTsKLQotICBzdGF0dXMgPSB1bmxpbmsocGF0aCk7Ci0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX01LRElSCi0jZGVmaW5lIGRvX3VuaXhfbWtkaXIgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X21rZGlyKG9zX2VtdWxfZGF0YSAqZW11bCwKLQkgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICBjaGFyIHBhdGhfYnVmW1BBVEhfTUFYXTsKLSAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IG1vZGUgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDAlM28iLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIG1vZGUpOwotCi0gIHN0YXR1cyA9IG1rZGlyKHBhdGgsIG1vZGUpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9STURJUgotI2RlZmluZSBkb191bml4X3JtZGlyIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9ybWRpcihvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICAgdW5zaWduZWQgY2FsbCwKLQkgICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10iLCAobG9uZylwYXRoX2FkZHIsIHBhdGgpOwotCi0gIHN0YXR1cyA9IHJtZGlyKHBhdGgpOwotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9USU1FCi0jZGVmaW5lIGRvX3VuaXhfdGltZSAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX3VuaXhfdGltZShvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHRwID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHRpbWVfdCBub3cgPSB0aW1lICgodGltZV90ICopMCk7Ci0gIHVuc2lnbmVkX3dvcmQgc3RhdHVzID0gSDJUXzQobm93KTsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHgiLCAobG9uZyl0cCk7Ci0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAoaW50KXN0YXR1cywgZXJybm8pOwotCi0gIGlmICh0cCkKLSAgICBlbXVsX3dyaXRlX2J1ZmZlcigmc3RhdHVzLCB0cCwgc2l6ZW9mKHN0YXR1cyksIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpIHx8ICFkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkKLSNkZWZpbmUgZG9fdW5peF9nZXR0aW1lb2ZkYXkgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb191bml4X2dldHRpbWVvZmRheShvc19lbXVsX2RhdGEgKmVtdWwsCi0JCSAgICAgdW5zaWduZWQgY2FsbCwKLQkJICAgICBjb25zdCBpbnQgYXJnMCwKLQkJICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWRfd29yZCB0diA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHR6ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgc3RydWN0IHVuaXhfdGltZXZhbCB0YXJnZXRfdGltZXZhbDsKLSAgc3RydWN0IHRpbWV2YWwgaG9zdF90aW1ldmFsOwotICBzdHJ1Y3QgdW5peF90aW1lem9uZSB0YXJnZXRfdGltZXpvbmU7Ci0gIHN0cnVjdCB0aW1lem9uZSBob3N0X3RpbWV6b25lOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCwgMHglbHgiLCAobG9uZyl0diwgKGxvbmcpdHopOwotCi0gIC8qIEp1c3QgaW4gY2FzZSB0aGUgc3lzdGVtIGRvZXNuJ3Qgc2V0IHRoZSB0aW1lem9uZSBzdHJ1Y3R1cmUgKi8KLSAgaG9zdF90aW1lem9uZS50el9taW51dGVzd2VzdCA9IDA7Ci0gIGhvc3RfdGltZXpvbmUudHpfZHN0dGltZSA9IDA7Ci0KLSAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCZob3N0X3RpbWV2YWwsICZob3N0X3RpbWV6b25lKTsKLSAgaWYgKHN0YXR1cyA+PSAwKSB7Ci0gICAgaWYgKHR2KSB7Ci0gICAgICB0YXJnZXRfdGltZXZhbC50dl9zZWMgPSBIMlRfNChob3N0X3RpbWV2YWwudHZfc2VjKTsKLSAgICAgIHRhcmdldF90aW1ldmFsLnR2X3VzZWMgPSBIMlRfNChob3N0X3RpbWV2YWwudHZfdXNlYyk7Ci0gICAgICBlbXVsX3dyaXRlX2J1ZmZlcigodm9pZCAqKSAmdGFyZ2V0X3RpbWV2YWwsIHR2LCBzaXplb2YodGFyZ2V0X3RpbWV2YWwpLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgfQotCi0gICAgaWYgKHR6KSB7Ci0gICAgICB0YXJnZXRfdGltZXpvbmUudHpfbWludXRlc3dlc3QgPSBIMlRfNChob3N0X3RpbWV6b25lLnR6X21pbnV0ZXN3ZXN0KTsKLSAgICAgIHRhcmdldF90aW1lem9uZS50el9kc3R0aW1lID0gSDJUXzQoaG9zdF90aW1lem9uZS50el9kc3R0aW1lKTsKLSAgICAgIGVtdWxfd3JpdGVfYnVmZmVyKCh2b2lkICopICZ0YXJnZXRfdGltZXpvbmUsIHR2LCBzaXplb2YodGFyZ2V0X3RpbWV6b25lKSwgcHJvY2Vzc29yLCBjaWEpOwotICAgIH0KLSAgfQotICAgIAotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotCi0jaWZuZGVmIEhBVkVfR0VUUlVTQUdFCi0jZGVmaW5lIGRvX3VuaXhfZ2V0cnVzYWdlIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fdW5peF9nZXRydXNhZ2Uob3NfZW11bF9kYXRhICplbXVsLAotCQkgIHVuc2lnbmVkIGNhbGwsCi0JCSAgY29uc3QgaW50IGFyZzAsCi0JCSAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHNpZ25lZF93b3JkIHdobyA9IChzaWduZWRfd29yZCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKLSAgdW5zaWduZWRfd29yZCB1c2FnZSA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07Ci0gIHN0cnVjdCBydXNhZ2UgaG9zdF9ydXNhZ2UsIGhvc3RfcnVzYWdlMjsKLSAgc3RydWN0IHVuaXhfcnVzYWdlIHRhcmdldF9ydXNhZ2U7Ci0gIGludCBzdGF0dXM7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVsZCwgMHglbHgiLCAobG9uZyl3aG8sIChsb25nKXVzYWdlKTsKLQotICBzd2l0Y2ggKHdobykgewotICBkZWZhdWx0OgotICAgIHN0YXR1cyA9IC0xOwotICAgIGVycm5vID0gRUlOVkFMOwotICAgIGJyZWFrOwotCi0gIGNhc2UgVU5JWF9SVVNBR0VfU0VMRjoKLSAgICBzdGF0dXMgPSBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZob3N0X3J1c2FnZSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBVTklYX1JVU0FHRV9DSElMRFJFTjoKLSAgICBzdGF0dXMgPSBnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmaG9zdF9ydXNhZ2UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgVU5JWF9SVVNBR0VfQk9USDoKLSAgICBzdGF0dXMgPSBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZob3N0X3J1c2FnZSk7Ci0gICAgaWYgKHN0YXR1cyA+PSAwKSB7Ci0gICAgICBzdGF0dXMgPSBnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmaG9zdF9ydXNhZ2UyKTsKLSAgICAgIGlmIChzdGF0dXMgPj0gMCkgewotCWhvc3RfcnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyArPSBob3N0X3J1c2FnZTIucnVfdXRpbWUudHZfc2VjOwotCWhvc3RfcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMgKz0gaG9zdF9ydXNhZ2UyLnJ1X3V0aW1lLnR2X3VzZWM7Ci0JaG9zdF9ydXNhZ2UucnVfc3RpbWUudHZfc2VjICs9IGhvc3RfcnVzYWdlMi5ydV9zdGltZS50dl9zZWM7Ci0JaG9zdF9ydXNhZ2UucnVfc3RpbWUudHZfdXNlYyArPSBob3N0X3J1c2FnZTIucnVfc3RpbWUudHZfdXNlYzsKLQlob3N0X3J1c2FnZS5ydV9tYXhyc3MgKz0gaG9zdF9ydXNhZ2UyLnJ1X21heHJzczsKLQlob3N0X3J1c2FnZS5ydV9peHJzcyArPSBob3N0X3J1c2FnZTIucnVfaXhyc3M7Ci0JaG9zdF9ydXNhZ2UucnVfaWRyc3MgKz0gaG9zdF9ydXNhZ2UyLnJ1X2lkcnNzOwotCWhvc3RfcnVzYWdlLnJ1X2lzcnNzICs9IGhvc3RfcnVzYWdlMi5ydV9pc3JzczsKLQlob3N0X3J1c2FnZS5ydV9taW5mbHQgKz0gaG9zdF9ydXNhZ2UyLnJ1X21pbmZsdDsKLQlob3N0X3J1c2FnZS5ydV9tYWpmbHQgKz0gaG9zdF9ydXNhZ2UyLnJ1X21hamZsdDsKLQlob3N0X3J1c2FnZS5ydV9uc3dhcCArPSBob3N0X3J1c2FnZTIucnVfbnN3YXA7Ci0JaG9zdF9ydXNhZ2UucnVfaW5ibG9jayArPSBob3N0X3J1c2FnZTIucnVfaW5ibG9jazsKLQlob3N0X3J1c2FnZS5ydV9vdWJsb2NrICs9IGhvc3RfcnVzYWdlMi5ydV9vdWJsb2NrOwotCWhvc3RfcnVzYWdlLnJ1X21zZ3NuZCArPSBob3N0X3J1c2FnZTIucnVfbXNnc25kOwotCWhvc3RfcnVzYWdlLnJ1X21zZ3JjdiArPSBob3N0X3J1c2FnZTIucnVfbXNncmN2OwotCWhvc3RfcnVzYWdlLnJ1X25zaWduYWxzICs9IGhvc3RfcnVzYWdlMi5ydV9uc2lnbmFsczsKLQlob3N0X3J1c2FnZS5ydV9udmNzdyArPSBob3N0X3J1c2FnZTIucnVfbnZjc3c7Ci0JaG9zdF9ydXNhZ2UucnVfbml2Y3N3ICs9IGhvc3RfcnVzYWdlMi5ydV9uaXZjc3c7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXR1cyA+PSAwKSB7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV91dGltZS50dl9zZWMgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfdXRpbWUudHZfc2VjKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfdXRpbWUudHZfdXNlYyk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9zdGltZS50dl9zZWMgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfc3RpbWUudHZfc2VjKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfc3RpbWUudHZfdXNlYyk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9tYXhyc3MgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbWF4cnNzKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X2l4cnNzID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X2l4cnNzKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X2lkcnNzID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X2lkcnNzKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X2lzcnNzID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X2lzcnNzKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X21pbmZsdCA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9taW5mbHQpOwotICAgIHRhcmdldF9ydXNhZ2UucnVfbWFqZmx0ID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X21hamZsdCk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9uc3dhcCA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9uc3dhcCk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9pbmJsb2NrID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X2luYmxvY2spOwotICAgIHRhcmdldF9ydXNhZ2UucnVfb3VibG9jayA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9vdWJsb2NrKTsKLSAgICB0YXJnZXRfcnVzYWdlLnJ1X21zZ3NuZCA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9tc2dzbmQpOwotICAgIHRhcmdldF9ydXNhZ2UucnVfbXNncmN2ID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X21zZ3Jjdik7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9uc2lnbmFscyA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9uc2lnbmFscyk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9udmNzdyA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9udmNzdyk7Ci0gICAgdGFyZ2V0X3J1c2FnZS5ydV9uaXZjc3cgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbml2Y3N3KTsKLSAgICBlbXVsX3dyaXRlX2J1ZmZlcigodm9pZCAqKSAmdGFyZ2V0X3J1c2FnZSwgdXNhZ2UsIHNpemVvZih0YXJnZXRfcnVzYWdlKSwgcHJvY2Vzc29yLCBjaWEpOwotICB9Ci0gICAgCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotZG9fdW5peF9ub3Aob3NfZW11bF9kYXRhICplbXVsLAotCSAgICB1bnNpZ25lZCBjYWxsLAotCSAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggMHglbHggMHglbHggMHglbHggMHglbHggMHglbHgiLAotCQkgICAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdLAotCQkgICAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV0sCi0JCSAgICAgKGxvbmcpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXSwKLQkJICAgICAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzNdLAotCQkgICAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArNF0sCi0JCSAgICAgKGxvbmcpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCs1XSk7Ci0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCBlcnJubyk7Ci19Ci0KLQwKLS8qIENvbW1vbiBjb2RlIGZvciBpbml0aWFsaXppbmcgdGhlIHN5c3RlbSBjYWxsIHN0dWZmICovCi0KLXN0YXRpYyBvc19lbXVsX2RhdGEgKgotZW11bF91bml4X2NyZWF0ZShkZXZpY2UgKnJvb3QsCi0JCSBiZmQgKmltYWdlLAotCQkgY29uc3QgY2hhciAqbmFtZSwKLQkJIGVtdWxfc3lzY2FsbCAqc3lzY2FsbCkKLXsKLSAgdW5zaWduZWRfd29yZCB0b3Bfb2Zfc3RhY2s7Ci0gIHVuc2lnbmVkIHN0YWNrX3NpemU7Ci0gIGludCBlbGZfYmluYXJ5OwotICBvc19lbXVsX2RhdGEgKmRhdGE7Ci0gIGRldmljZSAqdm07Ci0KLSAgLyogbWVyZ2UgYW55IGVtdWxhdGlvbiBzcGVjaWZpYyBlbnRyaWVzIGludG8gdGhlIGRldmljZSB0cmVlICovCi0KLSAgLyogZXN0YWJsaXNoIGEgZmV3IGRlZmF1bHRzICovCi0gIGlmIChpbWFnZS0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSB7Ci0gICAgZWxmX2JpbmFyeSA9IDE7Ci0gICAgdG9wX29mX3N0YWNrID0gMHhlMDAwMDAwMDsKLSAgICBzdGFja19zaXplID0gICAweDAwMTAwMDAwOwotICB9Ci0gIGVsc2UgewotICAgIGVsZl9iaW5hcnkgPSAwOwotICAgIHRvcF9vZl9zdGFjayA9IDB4MjAwMDAwMDA7Ci0gICAgc3RhY2tfc2l6ZSA9ICAgMHgwMDEwMDAwMDsKLSAgfQotCi0gIC8qIG9wdGlvbnMgKi8KLSAgZW11bF9hZGRfdHJlZV9vcHRpb25zKHJvb3QsIGltYWdlLCBuYW1lLAotCQkJKFdJVEhfRU5WSVJPTk1FTlQgPT0gVVNFUl9FTlZJUk9OTUVOVAotCQkJID8gInVzZXIiIDogInZpcnR1YWwiKSwKLQkJCTAgLypvZWEtaW50ZXJydXB0LXByZWZpeCovKTsKLQotICAvKiB2aXJ0dWFsIG1lbW9yeSAtIGhhbmRsZXMgZ3Jvd3RoIG9mIHN0YWNrL2hlYXAgKi8KLSAgdm0gPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdm1AMHglbHgiLAotCQkgICh1bnNpZ25lZCBsb25nKSh0b3Bfb2Zfc3RhY2sgLSBzdGFja19zaXplKSk7Ci0gIHRyZWVfcGFyc2Uodm0sICIuL3N0YWNrLWJhc2UgMHglbHgiLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpKHRvcF9vZl9zdGFjayAtIHN0YWNrX3NpemUpKTsKLSAgdHJlZV9wYXJzZSh2bSwgIi4vbnItYnl0ZXMgMHgleCIsIHN0YWNrX3NpemUpOwotCi0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS92bS9tYXAtYmluYXJ5L2ZpbGUtbmFtZSAlcyIsCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lKGltYWdlKSk7Ci0KLSAgLyogZmluaXNoIHRoZSBpbml0ICovCi0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3BjIDB4JWx4IiwKLQkgICAgICh1bnNpZ25lZCBsb25nKWJmZF9nZXRfc3RhcnRfYWRkcmVzcyhpbWFnZSkpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9zcCAweCVseCIsCi0JICAgICAodW5zaWduZWQgbG9uZyl0b3Bfb2Zfc3RhY2spOwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9tc3IgMHgleCIsCi0JICAgICAoKHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyIpCi0JICAgICAgID8gbXNyX2xpdHRsZV9lbmRpYW5fbW9kZQotCSAgICAgICA6IDApCi0JICAgICAgfCAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL2Zsb2F0aW5nLXBvaW50PyIpCi0JCSA/IChtc3JfZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlCi0JCSAgICB8IG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8wCi0JCSAgICB8IG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8xKQotCQkgOiAwKSkpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9zdGFjay9zdGFjay10eXBlICVzIiwKLQkgICAgIChlbGZfYmluYXJ5ID8gInBwYy1lbGYiIDogInBwYy14Y29mZiIpKTsKLQotICAvKiBmaW5hbGx5IG91ciBlbXVsYXRpb24gZGF0YSAqLwotICBkYXRhID0gWkFMTE9DKG9zX2VtdWxfZGF0YSk7Ci0gIGRhdGEtPnZtID0gdm07Ci0gIGRhdGEtPnN5c2NhbGxzID0gc3lzY2FsbDsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLQwKLS8qIEVNVUxBVElPTgotCi0gICBTb2xhcmlzIC0gRW11bGF0aW9uIG9mIHVzZXIgcHJvZ3JhbXMgZm9yIFNvbGFyaXMvUFBDCi0KLSAgIERFU0NSSVBUSU9OCi0KLSAgICovCi0KLQotLyogU29sYXJpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiAqLwotCi10eXBlZGVmCXNpZ25lZDMyCXNvbGFyaXNfdWlkX3Q7Ci10eXBlZGVmCXNpZ25lZDMyCXNvbGFyaXNfZ2lkX3Q7Ci10eXBlZGVmIHNpZ25lZDMyCXNvbGFyaXNfb2ZmX3Q7Ci10eXBlZGVmIHNpZ25lZDMyCXNvbGFyaXNfcGlkX3Q7Ci10eXBlZGVmIHNpZ25lZDMyCXNvbGFyaXNfdGltZV90OwotdHlwZWRlZiB1bnNpZ25lZDMyCXNvbGFyaXNfZGV2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkMzIJc29sYXJpc19pbm9fdDsKLXR5cGVkZWYgdW5zaWduZWQzMglzb2xhcmlzX21vZGVfdDsKLXR5cGVkZWYJdW5zaWduZWQzMglzb2xhcmlzX25saW5rX3Q7Ci0KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSNkZWZpbmUJU09MQVJJU19TVF9GU1RZUFNaIDE2CQkvKiBhcnJheSBzaXplIGZvciBmaWxlIHN5c3RlbSB0eXBlIG5hbWUgKi8KLQotc3RydWN0IHNvbGFyaXNfc3RhdCB7Ci0gIHNvbGFyaXNfZGV2X3QJCXN0X2RldjsKLSAgc2lnbmVkMzIJCXN0X3BhZDFbM107CS8qIHJlc2VydmVkIGZvciBuZXR3b3JrIGlkICovCi0gIHNvbGFyaXNfaW5vX3QJCXN0X2lubzsKLSAgc29sYXJpc19tb2RlX3QJc3RfbW9kZTsKLSAgc29sYXJpc19ubGlua190IAlzdF9ubGluazsKLSAgc29sYXJpc191aWRfdCAJc3RfdWlkOwotICBzb2xhcmlzX2dpZF90IAlzdF9naWQ7Ci0gIHNvbGFyaXNfZGV2X3QJCXN0X3JkZXY7Ci0gIHNpZ25lZDMyCQlzdF9wYWQyWzJdOwotICBzb2xhcmlzX29mZl90CQlzdF9zaXplOwotICBzaWduZWQzMgkJc3RfcGFkMzsJLyogZnV0dXJlIG9mZl90IGV4cGFuc2lvbiAqLwotICBzdHJ1Y3QgdW5peF90aW1ldmFsCXN0X2F0aW07Ci0gIHN0cnVjdCB1bml4X3RpbWV2YWwJc3RfbXRpbTsKLSAgc3RydWN0IHVuaXhfdGltZXZhbAlzdF9jdGltOwotICBzaWduZWQzMgkJc3RfYmxrc2l6ZTsKLSAgc2lnbmVkMzIJCXN0X2Jsb2NrczsKLSAgY2hhcgkJCXN0X2ZzdHlwZVtTT0xBUklTX1NUX0ZTVFlQU1pdOwotICBzaWduZWQzMgkJc3RfcGFkNFs4XTsJLyogZXhwYW5zaW9uIGFyZWEgKi8KLX07Ci0KLS8qIENvbnZlcnQgZnJvbSBob3N0IHN0YXQgc3RydWN0dXJlIHRvIHNvbGFyaXMgc3RhdCBzdHJ1Y3R1cmUgKi8KLVNUQVRJQ19JTkxJTkVfRU1VTF9VTklYIHZvaWQKLWNvbnZlcnRfdG9fc29sYXJpc19zdGF0KHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXN0cnVjdCBzdGF0ICpob3N0LAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IHNvbGFyaXNfc3RhdCB0YXJnZXQ7Ci0gIGludCBpOwotCi0gIHRhcmdldC5zdF9kZXYgICA9IEgyVF80KGhvc3QtPnN0X2Rldik7Ci0gIHRhcmdldC5zdF9pbm8gICA9IEgyVF80KGhvc3QtPnN0X2lubyk7Ci0gIHRhcmdldC5zdF9tb2RlICA9IEgyVF80KGhvc3QtPnN0X21vZGUpOwotICB0YXJnZXQuc3RfbmxpbmsgPSBIMlRfNChob3N0LT5zdF9ubGluayk7Ci0gIHRhcmdldC5zdF91aWQgICA9IEgyVF80KGhvc3QtPnN0X3VpZCk7Ci0gIHRhcmdldC5zdF9naWQgICA9IEgyVF80KGhvc3QtPnN0X2dpZCk7Ci0gIHRhcmdldC5zdF9zaXplICA9IEgyVF80KGhvc3QtPnN0X3NpemUpOwotCi0jaWZkZWYgSEFWRV9TVF9SREVWCi0gIHRhcmdldC5zdF9yZGV2ICA9IEgyVF80KGhvc3QtPnN0X3JkZXYpOwotI2Vsc2UKLSAgdGFyZ2V0LnN0X3JkZXYgID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVF9CTEtTSVpFCi0gIHRhcmdldC5zdF9ibGtzaXplID0gSDJUXzQoaG9zdC0+c3RfYmxrc2l6ZSk7Ci0jZWxzZQotICB0YXJnZXQuc3RfYmxrc2l6ZSA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RfQkxPQ0tTCi0gIHRhcmdldC5zdF9ibG9ja3MgID0gSDJUXzQoaG9zdC0+c3RfYmxvY2tzKTsKLSNlbHNlCi0gIHRhcmdldC5zdF9ibG9ja3MgID0gMDsKLSNlbmRpZgotCi0gIHRhcmdldC5zdF9hdGltLnR2X3NlYyAgPSBIMlRfNChob3N0LT5zdF9hdGltZSk7Ci0gIHRhcmdldC5zdF9hdGltLnR2X3VzZWMgPSAwOwotCi0gIHRhcmdldC5zdF9jdGltLnR2X3NlYyAgPSBIMlRfNChob3N0LT5zdF9jdGltZSk7Ci0gIHRhcmdldC5zdF9jdGltLnR2X3VzZWMgPSAwOwotCi0gIHRhcmdldC5zdF9tdGltLnR2X3NlYyAgPSBIMlRfNChob3N0LT5zdF9tdGltZSk7Ci0gIHRhcmdldC5zdF9tdGltLnR2X3VzZWMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRhcmdldC5zdF9wYWQxKSAvIHNpemVvZiAodGFyZ2V0LnN0X3BhZDFbMF0pOyBpKyspCi0gICAgdGFyZ2V0LnN0X3BhZDFbaV0gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRhcmdldC5zdF9wYWQyKSAvIHNpemVvZiAodGFyZ2V0LnN0X3BhZDJbMF0pOyBpKyspCi0gICAgdGFyZ2V0LnN0X3BhZDJbaV0gPSAwOwotCi0gIHRhcmdldC5zdF9wYWQzID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0YXJnZXQuc3RfcGFkNCkgLyBzaXplb2YgKHRhcmdldC5zdF9wYWQ0WzBdKTsgaSsrKQotICAgIHRhcmdldC5zdF9wYWQ0W2ldID0gMDsKLQotICAvKiBGb3Igbm93LCBqdXN0IHB1bnQgYW5kIGFsd2F5cyBzYXkgaXQgaXMgYSB1ZnMgZmlsZSAqLwotICBzdHJjcHkgKHRhcmdldC5zdF9mc3R5cGUsICJ1ZnMiKTsKLQotICBlbXVsX3dyaXRlX2J1ZmZlcigmdGFyZ2V0LCBhZGRyLCBzaXplb2YodGFyZ2V0KSwgcHJvY2Vzc29yLCBjaWEpOwotfQotI2VuZGlmIC8qIEhBVkVfU1lTX1NUQVRfSCAqLwotCi0jaWZuZGVmIEhBVkVfU1RBVAotI2RlZmluZSBkb19zb2xhcmlzX3N0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19zb2xhcmlzX3N0YXQob3NfZW11bF9kYXRhICplbXVsLAotCQl1bnNpZ25lZCBjYWxsLAotCQljb25zdCBpbnQgYXJnMCwKLQkJY3B1ICpwcm9jZXNzb3IsCi0JCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHgiLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIChsb25nKXN0YXRfcGt0KTsKLQotICBzdGF0dXMgPSBzdGF0IChwYXRoLCAmYnVmKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGNvbnZlcnRfdG9fc29sYXJpc19zdGF0IChzdGF0X3BrdCwgJmJ1ZiwgcHJvY2Vzc29yLCBjaWEpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0xTVEFUCi0jZGVmaW5lIGRvX3NvbGFyaXNfbHN0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19zb2xhcmlzX2xzdGF0KG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJIHVuc2lnbmVkIGNhbGwsCi0JCSBjb25zdCBpbnQgYXJnMCwKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkX3dvcmQgc3RhdF9wa3QgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBjaGFyIHBhdGhfYnVmW1BBVEhfTUFYXTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCVseCIsIChsb25nKXBhdGhfYWRkciwgcGF0aCwgKGxvbmcpc3RhdF9wa3QpOwotCi0gIHN0YXR1cyA9IGxzdGF0IChwYXRoLCAmYnVmKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGNvbnZlcnRfdG9fc29sYXJpc19zdGF0IChzdGF0X3BrdCwgJmJ1ZiwgcHJvY2Vzc29yLCBjaWEpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0ZTVEFUCi0jZGVmaW5lIGRvX3NvbGFyaXNfZnN0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19zb2xhcmlzX2ZzdGF0KG9zX2VtdWxfZGF0YSAqZW11bCwKLQkJIHVuc2lnbmVkIGNhbGwsCi0JCSBjb25zdCBpbnQgYXJnMCwKLQkJIGNwdSAqcHJvY2Vzc29yLAotCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmaWxkZXMgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgiLCBmaWxkZXMsIChsb25nKXN0YXRfcGt0KTsKLQotICBzdGF0dXMgPSBmc3RhdCAoZmlsZGVzLCAmYnVmKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGNvbnZlcnRfdG9fc29sYXJpc19zdGF0IChzdGF0X3BrdCwgJmJ1ZiwgcHJvY2Vzc29yLCBjaWEpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9URVJNSU9fU1RSVUNUVVJFKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUpCi0jZGVmaW5lCVNPTEFSSVNfVElPQwkgICgnVCc8PDgpCi0jZGVmaW5lIFNPTEFSSVNfTkNDCSAgOAotI2RlZmluZSBTT0xBUklTX05DQ1MJICAxOQotCi0jZGVmaW5lCVNPTEFSSVNfVklOVFIJICAwCi0jZGVmaW5lCVNPTEFSSVNfVlFVSVQJICAxCi0jZGVmaW5lCVNPTEFSSVNfVkVSQVNFCSAgMgotI2RlZmluZQlTT0xBUklTX1ZLSUxMCSAgMwotI2RlZmluZQlTT0xBUklTX1ZFT0YJICA0Ci0jZGVmaW5lCVNPTEFSSVNfVkVPTAkgIDUKLSNkZWZpbmUJU09MQVJJU19WRU9MMgkgIDYKLSNkZWZpbmUJU09MQVJJU19WU1dUQ0gJICA3Ci0jZGVmaW5lCVNPTEFSSVNfVlNUQVJUCSAgOAotI2RlZmluZQlTT0xBUklTX1ZTVE9QCSAgOQotI2RlZmluZQlTT0xBUklTX1ZTVVNQCSAxMAotI2RlZmluZQlTT0xBUklTX1ZEU1VTUAkgMTEKLSNkZWZpbmUJU09MQVJJU19WUkVQUklOVCAxMgotI2RlZmluZQlTT0xBUklTX1ZESVNDQVJEIDEzCi0jZGVmaW5lCVNPTEFSSVNfVldFUkFTRQkgMTQKLSNkZWZpbmUJU09MQVJJU19WTE5FWFQJIDE1Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9URVJNSU9fU1RSVUNUVVJFKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUpCi0vKiBDb252ZXJ0IHRvL2Zyb20gaG9zdCB0ZXJtaW8gc3RydWN0dXJlICovCi0KLXN0cnVjdCBzb2xhcmlzX3Rlcm1pbyB7Ci0JdW5zaWduZWQxNgljX2lmbGFnOwkJLyogaW5wdXQgbW9kZXMgKi8KLQl1bnNpZ25lZDE2CWNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZXMgKi8KLQl1bnNpZ25lZDE2CWNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGVzICovCi0JdW5zaWduZWQxNgljX2xmbGFnOwkJLyogbGluZSBkaXNjaXBsaW5lIG1vZGVzICovCi0JdW5zaWduZWQ4CWNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KLQl1bnNpZ25lZDgJY19jY1tTT0xBUklTX05DQ107CS8qIGNvbnRyb2wgY2hhcnMgKi8KLX07Ci0KLVNUQVRJQ19JTkxJTkVfRU1VTF9VTklYIHZvaWQKLWNvbnZlcnRfdG9fc29sYXJpc190ZXJtaW8odW5zaWduZWRfd29yZCBhZGRyLAotCQkJICBzdHJ1Y3QgdGVybWlvICpob3N0LAotCQkJICBjcHUgKnByb2Nlc3NvciwKLQkJCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBzb2xhcmlzX3Rlcm1pbyB0YXJnZXQ7Ci0gIGludCBpOwotCi0gIHRhcmdldC5jX2lmbGFnID0gSDJUXzIgKGhvc3QtPmNfaWZsYWcpOwotICB0YXJnZXQuY19vZmxhZyA9IEgyVF8yIChob3N0LT5jX29mbGFnKTsKLSAgdGFyZ2V0LmNfY2ZsYWcgPSBIMlRfMiAoaG9zdC0+Y19jZmxhZyk7Ci0gIHRhcmdldC5jX2xmbGFnID0gSDJUXzIgKGhvc3QtPmNfbGZsYWcpOwotCi0jaWYgZGVmaW5lZChIQVZFX1RFUk1JT19DTElORSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfQ0xJTkUpCi0gIHRhcmdldC5jX2xpbmUgID0gaG9zdC0+Y19saW5lOwotI2Vsc2UKLSAgdGFyZ2V0LmNfbGluZSAgPSAwOwotI2VuZGlmCi0KLSAgZm9yIChpID0gMDsgaSA8IFNPTEFSSVNfTkNDOyBpKyspCi0gICAgdGFyZ2V0LmNfY2NbaV0gPSAwOwotCi0jaWZkZWYgVklOVFIKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WSU5UUl0gPSBob3N0LT5jX2NjW1ZJTlRSXTsKLSNlbmRpZgotCi0jaWZkZWYgVlFVSVQKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WUVVJVF0gPSBob3N0LT5jX2NjW1ZRVUlUXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVSQVNFCi0gIHRhcmdldC5jX2NjW1NPTEFSSVNfVkVSQVNFXSA9IGhvc3QtPmNfY2NbVkVSQVNFXTsKLSNlbmRpZgotCi0jaWZkZWYgVktJTEwKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WS0lMTF0gPSBob3N0LT5jX2NjW1ZLSUxMXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPRgotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFT0ZdID0gaG9zdC0+Y19jY1tWRU9GXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFT0xdID0gaG9zdC0+Y19jY1tWRU9MXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTDIKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9MMl0gPSBob3N0LT5jX2NjW1ZFT0wyXTsKLSNlbmRpZgotCi0jaWZkZWYgVlNXVENICi0gIHRhcmdldC5jX2NjW1NPTEFSSVNfVlNXVENIXSA9IGhvc3QtPmNfY2NbVlNXVENIXTsKLQotI2Vsc2UKLSNpZmRlZiBWU1dUQwotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTV1RDSF0gPSBob3N0LT5jX2NjW1ZTV1RDXTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUgfHwgSEFWRV9URVJNSU9TX1NUUlVDVFVSRSAqLwotCi0jaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQotLyogQ29udmVydCB0by9mcm9tIGhvc3QgdGVybWlvcyBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiB1bnNpZ25lZDMyIHNvbGFyaXNfdGNmbGFnX3Q7Ci10eXBlZGVmIHVuc2lnbmVkOCAgc29sYXJpc19jY190OwotdHlwZWRlZiB1bnNpZ25lZDMyIHNvbGFyaXNfc3BlZWRfdDsKLQotc3RydWN0IHNvbGFyaXNfdGVybWlvcyB7Ci0gIHNvbGFyaXNfdGNmbGFnX3QJY19pZmxhZzsKLSAgc29sYXJpc190Y2ZsYWdfdAljX29mbGFnOwotICBzb2xhcmlzX3RjZmxhZ190CWNfY2ZsYWc7Ci0gIHNvbGFyaXNfdGNmbGFnX3QJY19sZmxhZzsKLSAgc29sYXJpc19jY190CQljX2NjW1NPTEFSSVNfTkNDU107Ci19OwotCi1TVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCB2b2lkCi1jb252ZXJ0X3RvX3NvbGFyaXNfdGVybWlvcyh1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgICBzdHJ1Y3QgdGVybWlvcyAqaG9zdCwKLQkJCSAgIGNwdSAqcHJvY2Vzc29yLAotCQkJICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN0cnVjdCBzb2xhcmlzX3Rlcm1pb3MgdGFyZ2V0OwotICBpbnQgaTsKLQotICB0YXJnZXQuY19pZmxhZyA9IEgyVF80IChob3N0LT5jX2lmbGFnKTsKLSAgdGFyZ2V0LmNfb2ZsYWcgPSBIMlRfNCAoaG9zdC0+Y19vZmxhZyk7Ci0gIHRhcmdldC5jX2NmbGFnID0gSDJUXzQgKGhvc3QtPmNfY2ZsYWcpOwotICB0YXJnZXQuY19sZmxhZyA9IEgyVF80IChob3N0LT5jX2xmbGFnKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU09MQVJJU19OQ0NTOyBpKyspCi0gICAgdGFyZ2V0LmNfY2NbaV0gPSAwOwotCi0jaWZkZWYgVklOVFIKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WSU5UUl0gPSBob3N0LT5jX2NjW1ZJTlRSXTsKLSNlbmRpZgotCi0jaWZkZWYgVlFVSVQKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WUVVJVF0gPSBob3N0LT5jX2NjW1ZRVUlUXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVSQVNFCi0gIHRhcmdldC5jX2NjW1NPTEFSSVNfVkVSQVNFXSA9IGhvc3QtPmNfY2NbVkVSQVNFXTsKLSNlbmRpZgotCi0jaWZkZWYgVktJTEwKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WS0lMTF0gPSBob3N0LT5jX2NjW1ZLSUxMXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPRgotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFT0ZdID0gaG9zdC0+Y19jY1tWRU9GXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFT0xdID0gaG9zdC0+Y19jY1tWRU9MXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTDIKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9MMl0gPSBob3N0LT5jX2NjW1ZFT0wyXTsKLSNlbmRpZgotCi0jaWZkZWYgVlNXVENICi0gIHRhcmdldC5jX2NjW1NPTEFSSVNfVlNXVENIXSA9IGhvc3QtPmNfY2NbVlNXVENIXTsKLQotI2Vsc2UKLSNpZmRlZiBWU1dUQwotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTV1RDSF0gPSBob3N0LT5jX2NjW1ZTV1RDXTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBWU1RBUlQKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WU1RBUlRdID0gaG9zdC0+Y19jY1tWU1RBUlRdOwotI2VuZGlmCi0KLSNpZmRlZiBWU1RPUAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTVE9QXSA9IGhvc3QtPmNfY2NbVlNUT1BdOwotI2VuZGlmCi0KLSNpZmRlZiBWU1VTUAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTVVNQXSA9IGhvc3QtPmNfY2NbVlNVU1BdOwotI2VuZGlmCi0KLSNpZmRlZiBWRFNVU1AKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRFNVU1BdID0gaG9zdC0+Y19jY1tWRFNVU1BdOwotI2VuZGlmCi0KLSNpZmRlZiBWUkVQUklOVAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZSRVBSSU5UXSA9IGhvc3QtPmNfY2NbVlJFUFJJTlRdOwotI2VuZGlmCi0KLSNpZmRlZiBWRElTQ0FSRAotICB0YXJnZXQuY19jY1tTT0xBUklTX1ZESVNDQVJEXSA9IGhvc3QtPmNfY2NbVkRJU0NBUkRdOwotI2VuZGlmCi0KLSNpZmRlZiBWV0VSQVNFCi0gIHRhcmdldC5jX2NjW1NPTEFSSVNfVldFUkFTRV0gPSBob3N0LT5jX2NjW1ZXRVJBU0VdOwotI2VuZGlmCi0KLSNpZmRlZiBWTE5FWFQKLSAgdGFyZ2V0LmNfY2NbU09MQVJJU19WTE5FWFRdID0gaG9zdC0+Y19jY1tWTE5FWFRdOwotI2VuZGlmCi0KLSAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFICovCi0KLSNpZm5kZWYgSEFWRV9JT0NUTAotI2RlZmluZSBkb19zb2xhcmlzX2lvY3RsIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fc29sYXJpc19pb2N0bChvc19lbXVsX2RhdGEgKmVtdWwsCi0JCSB1bnNpZ25lZCBjYWxsLAotCQkgY29uc3QgaW50IGFyZzAsCi0JCSBjcHUgKnByb2Nlc3NvciwKLQkJIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgZmlsZGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkIHJlcXVlc3QgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICB1bnNpZ25lZF93b3JkIGFyZ3BfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXMgPSAwOwotICBjb25zdCBjaGFyICpuYW1lID0gIjx1bmtub3duPiI7Ci0KLSNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCi0gIHN0cnVjdCB0ZXJtaW9zIGhvc3RfdGVybWlvOwotCi0jZWxzZQotI2lmZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQotICBzdHJ1Y3QgdGVybWlvIGhvc3RfdGVybWlvOwotI2VuZGlmCi0jZW5kaWYKLQotICBzd2l0Y2ggKHJlcXVlc3QpCi0gICAgewotICAgIGNhc2UgMDoJCQkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjYXNlICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YXR1cyA9IC0xOwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQoSEFWRV9URVJNSU9fU1RSVUNUVVJFKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUpCi0jaWYgZGVmaW5lZChUQ0dFVEEpIHx8IGRlZmluZWQoVENHRVRTKSB8fCBkZWZpbmVkKEhBVkVfVENHRVRBVFRSKQotICAgIGNhc2UgU09MQVJJU19USU9DIHwgMToJCQkvKiBUQ0dFVEEgKi8KLSAgICAgIG5hbWUgPSAiVENHRVRBIjsKLSNpZmRlZiBIQVZFX1RDR0VUQVRUUgotICAgICAgc3RhdHVzID0gdGNnZXRhdHRyKGZpbGRlcywgJmhvc3RfdGVybWlvKTsKLSNlbGlmIGRlZmluZWQoVENHRVRTKQotICAgICAgc3RhdHVzID0gaW9jdGwgKGZpbGRlcywgVENHRVRTLCAmaG9zdF90ZXJtaW8pOwotI2Vsc2UKLSAgICAgIHN0YXR1cyA9IGlvY3RsIChmaWxkZXMsIFRDR0VUQSwgJmhvc3RfdGVybWlvKTsKLSNlbmRpZgotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCWNvbnZlcnRfdG9fc29sYXJpc190ZXJtaW8gKGFyZ3BfYWRkciwgJmhvc3RfdGVybWlvLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgICBicmVhazsKLSNlbmRpZiAvKiBUQ0dFVEEgKi8KLSNlbmRpZiAvKiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUgKi8KLQotI2lmZGVmIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUKLSNpZiBkZWZpbmVkKFRDR0VUUykgfHwgZGVmaW5lZChIQVZFX1RDR0VUQVRUUikKLSAgICBjYXNlIFNPTEFSSVNfVElPQyB8IDEzOgkJCS8qIFRDR0VUUyAqLwotICAgICAgbmFtZSA9ICJUQ0dFVFMiOwotI2lmZGVmIEhBVkVfVENHRVRBVFRSCi0gICAgICBzdGF0dXMgPSB0Y2dldGF0dHIoZmlsZGVzLCAmaG9zdF90ZXJtaW8pOwotI2Vsc2UKLSAgICAgIHN0YXR1cyA9IGlvY3RsIChmaWxkZXMsIFRDR0VUUywgJmhvc3RfdGVybWlvKTsKLSNlbmRpZgotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCWNvbnZlcnRfdG9fc29sYXJpc190ZXJtaW9zIChhcmdwX2FkZHIsICZob3N0X3Rlcm1pbywgcHJvY2Vzc29yLCBjaWEpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVENHRVRTICovCi0jZW5kaWYgLyogSEFWRV9URVJNSU9TX1NUUlVDVFVSRSAqLwotICAgIH0KLQotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHgleCBbJXNdLCAweCVseCIsIGZpbGRlcywgcmVxdWVzdCwgbmFtZSwgKGxvbmcpYXJncF9hZGRyKTsKLX0KLSNlbmRpZiAvKiBIQVZFX0lPQ1RMICovCi0KLXN0YXRpYyBlbXVsX3N5c2NhbGxfZGVzY3JpcHRvciBzb2xhcmlzX2Rlc2NyaXB0b3JzW10gPSB7Ci0gIC8qICAgMCAqLyB7IDAsICJzeXNjYWxsIiB9LAotICAvKiAgIDEgKi8geyBkb191bml4X2V4aXQsICJleGl0IiB9LAotICAvKiAgIDIgKi8geyAwLCAiZm9yayIgfSwKLSAgLyogICAzICovIHsgZG9fdW5peF9yZWFkLCAicmVhZCIgfSwKLSAgLyogICA0ICovIHsgZG9fdW5peF93cml0ZSwgIndyaXRlIiB9LAotICAvKiAgIDUgKi8geyBkb191bml4X29wZW4sICJvcGVuIiB9LAotICAvKiAgIDYgKi8geyBkb191bml4X2Nsb3NlLCAiY2xvc2UiIH0sCi0gIC8qICAgNyAqLyB7IDAsICJ3YWl0IiB9LAotICAvKiAgIDggKi8geyAwLCAiY3JlYXQiIH0sCi0gIC8qICAgOSAqLyB7IGRvX3VuaXhfbGluaywgImxpbmsiIH0sCi0gIC8qICAxMCAqLyB7IGRvX3VuaXhfdW5saW5rLCAidW5saW5rIiB9LAotICAvKiAgMTEgKi8geyAwLCAiZXhlYyIgfSwKLSAgLyogIDEyICovIHsgZG9fdW5peF9jaGRpciwgImNoZGlyIiB9LAotICAvKiAgMTMgKi8geyBkb191bml4X3RpbWUsICJ0aW1lIiB9LAotICAvKiAgMTQgKi8geyAwLCAibWtub2QiIH0sCi0gIC8qICAxNSAqLyB7IDAsICJjaG1vZCIgfSwKLSAgLyogIDE2ICovIHsgMCwgImNob3duIiB9LAotICAvKiAgMTcgKi8geyBkb191bml4X2JyZWFrLCAiYnJrIiB9LAotICAvKiAgMTggKi8geyBkb19zb2xhcmlzX3N0YXQsICJzdGF0IiB9LAotICAvKiAgMTkgKi8geyBkb191bml4X2xzZWVrLCAibHNlZWsiIH0sCi0gIC8qICAyMCAqLyB7IGRvX3VuaXhfZ2V0cGlkMiwgImdldHBpZCIgfSwKLSAgLyogIDIxICovIHsgMCwgIm1vdW50IiB9LAotICAvKiAgMjIgKi8geyAwLCAidW1vdW50IiB9LAotICAvKiAgMjMgKi8geyAwLCAic2V0dWlkIiB9LAotICAvKiAgMjQgKi8geyBkb191bml4X2dldHVpZDIsICJnZXR1aWQiIH0sCi0gIC8qICAyNSAqLyB7IDAsICJzdGltZSIgfSwKLSAgLyogIDI2ICovIHsgMCwgInB0cmFjZSIgfSwKLSAgLyogIDI3ICovIHsgMCwgImFsYXJtIiB9LAotICAvKiAgMjggKi8geyBkb19zb2xhcmlzX2ZzdGF0LCAiZnN0YXQiIH0sCi0gIC8qICAyOSAqLyB7IDAsICJwYXVzZSIgfSwKLSAgLyogIDMwICovIHsgMCwgInV0aW1lIiB9LAotICAvKiAgMzEgKi8geyAwLCAic3R0eSIgfSwKLSAgLyogIDMyICovIHsgMCwgImd0dHkiIH0sCi0gIC8qICAzMyAqLyB7IGRvX3VuaXhfYWNjZXNzLCAiYWNjZXNzIiB9LAotICAvKiAgMzQgKi8geyAwLCAibmljZSIgfSwKLSAgLyogIDM1ICovIHsgMCwgInN0YXRmcyIgfSwKLSAgLyogIDM2ICovIHsgMCwgInN5bmMiIH0sCi0gIC8qICAzNyAqLyB7IDAsICJraWxsIiB9LAotICAvKiAgMzggKi8geyAwLCAiZnN0YXRmcyIgfSwKLSAgLyogIDM5ICovIHsgMCwgInBncnBzeXMiIH0sCi0gIC8qICA0MCAqLyB7IDAsICJ4ZW5peCIgfSwKLSAgLyogIDQxICovIHsgZG9fdW5peF9kdXAsICJkdXAiIH0sCi0gIC8qICA0MiAqLyB7IDAsICJwaXBlIiB9LAotICAvKiAgNDMgKi8geyAwLCAidGltZXMiIH0sCi0gIC8qICA0NCAqLyB7IDAsICJwcm9maWwiIH0sCi0gIC8qICA0NSAqLyB7IDAsICJwbG9jayIgfSwKLSAgLyogIDQ2ICovIHsgMCwgInNldGdpZCIgfSwKLSAgLyogIDQ3ICovIHsgZG9fdW5peF9nZXRnaWQyLCAiZ2V0Z2lkIiB9LAotICAvKiAgNDggKi8geyAwLCAic2lnbmFsIiB9LAotICAvKiAgNDkgKi8geyAwLCAibXNnc3lzIiB9LAotICAvKiAgNTAgKi8geyAwLCAic3lzc3VuIiB9LAotICAvKiAgNTEgKi8geyAwLCAiYWNjdCIgfSwKLSAgLyogIDUyICovIHsgMCwgInNobXN5cyIgfSwKLSAgLyogIDUzICovIHsgMCwgInNlbXN5cyIgfSwKLSAgLyogIDU0ICovIHsgZG9fc29sYXJpc19pb2N0bCwgImlvY3RsIiB9LAotICAvKiAgNTUgKi8geyAwLCAidWFkbWluIiB9LAotICAvKiAgNTYgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBleGNoICovIH0sCi0gIC8qICA1NyAqLyB7IDAsICJ1dHNzeXMiIH0sCi0gIC8qICA1OCAqLyB7IDAsICJmZHN5bmMiIH0sCi0gIC8qICA1OSAqLyB7IDAsICJleGVjdmUiIH0sCi0gIC8qICA2MCAqLyB7IGRvX3VuaXhfdW1hc2ssICJ1bWFzayIgfSwKLSAgLyogIDYxICovIHsgMCwgImNocm9vdCIgfSwKLSAgLyogIDYyICovIHsgMCwgImZjbnRsIiB9LAotICAvKiAgNjMgKi8geyAwLCAidWxpbWl0IiB9LAotICAvKiAgNjQgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBVTklYIFBDICovIH0sCi0gIC8qICA2NCAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgZm9yIFVOSVggUEMgKi8gfSwKLSAgLyogIDY1ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgVU5JWCBQQyAqLyB9LAotICAvKiAgNjYgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBVTklYIFBDICovIH0sCi0gIC8qICA2NyAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgZm9yIFVOSVggUEMgKi8gfSwKLSAgLyogIDY4ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgVU5JWCBQQyAqLyB9LAotICAvKiAgNjkgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBVTklYIFBDICovIH0sCi0gIC8qICA3MCAqLyB7IDAsIDAgLyogd2FzIGFkdmZzICovIH0sCi0gIC8qICA3MSAqLyB7IDAsIDAgLyogd2FzIHVuYWR2ZnMgKi8gfSwKLSAgLyogIDcyICovIHsgMCwgMCAvKiB3YXMgcm1vdW50ICovIH0sCi0gIC8qICA3MyAqLyB7IDAsIDAgLyogd2FzIHJ1bW91bnQgKi8gfSwKLSAgLyogIDc0ICovIHsgMCwgMCAvKiB3YXMgcmZzdGFydCAqLyB9LAotICAvKiAgNzUgKi8geyAwLCAwIC8qIHdhcyBzaWdyZXQgKi8gfSwKLSAgLyogIDc2ICovIHsgMCwgMCAvKiB3YXMgcmRlYnVnICovIH0sCi0gIC8qICA3NyAqLyB7IDAsIDAgLyogd2FzIHJmc3RvcCAqLyB9LAotICAvKiAgNzggKi8geyAwLCAwIC8qIHdhcyByZnN5cyAqLyB9LAotICAvKiAgNzkgKi8geyBkb191bml4X3JtZGlyLCAicm1kaXIiIH0sCi0gIC8qICA4MCAqLyB7IGRvX3VuaXhfbWtkaXIsICJta2RpciIgfSwKLSAgLyogIDgxICovIHsgMCwgImdldGRlbnRzIiB9LAotICAvKiAgODIgKi8geyAwLCAwIC8qIHdhcyBsaWJhdHRhY2ggKi8gfSwKLSAgLyogIDgzICovIHsgMCwgMCAvKiB3YXMgbGliZGV0YWNoICovIH0sCi0gIC8qICA4NCAqLyB7IDAsICJzeXNmcyIgfSwKLSAgLyogIDg1ICovIHsgMCwgImdldG1zZyIgfSwKLSAgLyogIDg2ICovIHsgMCwgInB1dG1zZyIgfSwKLSAgLyogIDg3ICovIHsgMCwgInBvbGwiIH0sCi0gIC8qICA4OCAqLyB7IGRvX3NvbGFyaXNfbHN0YXQsICJsc3RhdCIgfSwKLSAgLyogIDg5ICovIHsgZG9fdW5peF9zeW1saW5rLCAic3ltbGluayIgfSwKLSAgLyogIDkwICovIHsgMCwgInJlYWRsaW5rIiB9LAotICAvKiAgOTEgKi8geyAwLCAic2V0Z3JvdXBzIiB9LAotICAvKiAgOTIgKi8geyAwLCAiZ2V0Z3JvdXBzIiB9LAotICAvKiAgOTMgKi8geyAwLCAiZmNobW9kIiB9LAotICAvKiAgOTQgKi8geyAwLCAiZmNob3duIiB9LAotICAvKiAgOTUgKi8geyAwLCAic2lncHJvY21hc2siIH0sCi0gIC8qICA5NiAqLyB7IDAsICJzaWdzdXNwZW5kIiB9LAotICAvKiAgOTcgKi8geyBkb191bml4X25vcCwgInNpZ2FsdHN0YWNrIiB9LAotICAvKiAgOTggKi8geyBkb191bml4X25vcCwgInNpZ2FjdGlvbiIgfSwKLSAgLyogIDk5ICovIHsgMCwgInNpZ3BlbmRpbmciIH0sCi0gIC8qIDEwMCAqLyB7IDAsICJjb250ZXh0IiB9LAotICAvKiAxMDEgKi8geyAwLCAiZXZzeXMiIH0sCi0gIC8qIDEwMiAqLyB7IDAsICJldnRyYXByZXQiIH0sCi0gIC8qIDEwMyAqLyB7IDAsICJzdGF0dmZzIiB9LAotICAvKiAxMDQgKi8geyAwLCAiZnN0YXR2ZnMiIH0sCi0gIC8qIDEwNSAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMTA2ICovIHsgMCwgIm5mc3N5cyIgfSwKLSAgLyogMTA3ICovIHsgMCwgIndhaXRzeXMiIH0sCi0gIC8qIDEwOCAqLyB7IDAsICJzaWdzZW5kc3lzIiB9LAotICAvKiAxMDkgKi8geyAwLCAiaHJ0c3lzIiB9LAotICAvKiAxMTAgKi8geyAwLCAiYWNhbmNlbCIgfSwKLSAgLyogMTExICovIHsgMCwgImFzeW5jIiB9LAotICAvKiAxMTIgKi8geyAwLCAicHJpb2NudGxzeXMiIH0sCi0gIC8qIDExMyAqLyB7IDAsICJwYXRoY29uZiIgfSwKLSAgLyogMTE0ICovIHsgMCwgIm1pbmNvcmUiIH0sCi0gIC8qIDExNSAqLyB7IDAsICJtbWFwIiB9LAotICAvKiAxMTYgKi8geyAwLCAibXByb3RlY3QiIH0sCi0gIC8qIDExNyAqLyB7IDAsICJtdW5tYXAiIH0sCi0gIC8qIDExOCAqLyB7IDAsICJmcGF0aGNvbmYiIH0sCi0gIC8qIDExOSAqLyB7IDAsICJ2Zm9yayIgfSwKLSAgLyogMTIwICovIHsgMCwgImZjaGRpciIgfSwKLSAgLyogMTIxICovIHsgMCwgInJlYWR2IiB9LAotICAvKiAxMjIgKi8geyAwLCAid3JpdGV2IiB9LAotICAvKiAxMjMgKi8geyAwLCAieHN0YXQiIH0sCi0gIC8qIDEyNCAqLyB7IDAsICJseHN0YXQiIH0sCi0gIC8qIDEyNSAqLyB7IDAsICJmeHN0YXQiIH0sCi0gIC8qIDEyNiAqLyB7IDAsICJ4bWtub2QiIH0sCi0gIC8qIDEyNyAqLyB7IDAsICJjbG9jYWwiIH0sCi0gIC8qIDEyOCAqLyB7IDAsICJzZXRybGltaXQiIH0sCi0gIC8qIDEyOSAqLyB7IDAsICJnZXRybGltaXQiIH0sCi0gIC8qIDEzMCAqLyB7IDAsICJsY2hvd24iIH0sCi0gIC8qIDEzMSAqLyB7IDAsICJtZW1jbnRsIiB9LAotICAvKiAxMzIgKi8geyAwLCAiZ2V0cG1zZyIgfSwKLSAgLyogMTMzICovIHsgMCwgInB1dHBtc2ciIH0sCi0gIC8qIDEzNCAqLyB7IDAsICJyZW5hbWUiIH0sCi0gIC8qIDEzNSAqLyB7IDAsICJ1bmFtZSIgfSwKLSAgLyogMTM2ICovIHsgMCwgInNldGVnaWQiIH0sCi0gIC8qIDEzNyAqLyB7IDAsICJzeXNjb25maWciIH0sCi0gIC8qIDEzOCAqLyB7IDAsICJhZGp0aW1lIiB9LAotICAvKiAxMzkgKi8geyAwLCAic3lzdGVtaW5mbyIgfSwKLSAgLyogMTQwICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAotICAvKiAxNDEgKi8geyAwLCAic2V0ZXVpZCIgfSwKLSAgLyogMTQyICovIHsgMCwgInZ0cmFjZSIgfSwKLSAgLyogMTQzICovIHsgMCwgImZvcmsxIiB9LAotICAvKiAxNDQgKi8geyAwLCAic2lndGltZWR3YWl0IiB9LAotICAvKiAxNDUgKi8geyAwLCAibHdwX2luZm8iIH0sCi0gIC8qIDE0NiAqLyB7IDAsICJ5aWVsZCIgfSwKLSAgLyogMTQ3ICovIHsgMCwgImx3cF9zZW1hX3dhaXQiIH0sCi0gIC8qIDE0OCAqLyB7IDAsICJsd3Bfc2VtYV9wb3N0IiB9LAotICAvKiAxNDkgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDE1MCAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMTUxICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAotICAvKiAxNTIgKi8geyAwLCAibW9kY3RsIiB9LAotICAvKiAxNTMgKi8geyAwLCAiZmNocm9vdCIgfSwKLSAgLyogMTU0ICovIHsgMCwgInV0aW1lcyIgfSwKLSAgLyogMTU1ICovIHsgMCwgInZoYW5ndXAiIH0sCi0gIC8qIDE1NiAqLyB7IGRvX3VuaXhfZ2V0dGltZW9mZGF5LCAiZ2V0dGltZW9mZGF5IiB9LAotICAvKiAxNTcgKi8geyAwLCAiZ2V0aXRpbWVyIiB9LAotICAvKiAxNTggKi8geyAwLCAic2V0aXRpbWVyIiB9LAotICAvKiAxNTkgKi8geyAwLCAibHdwX2NyZWF0ZSIgfSwKLSAgLyogMTYwICovIHsgMCwgImx3cF9leGl0IiB9LAotICAvKiAxNjEgKi8geyAwLCAibHdwX3N1c3BlbmQiIH0sCi0gIC8qIDE2MiAqLyB7IDAsICJsd3BfY29udGludWUiIH0sCi0gIC8qIDE2MyAqLyB7IDAsICJsd3Bfa2lsbCIgfSwKLSAgLyogMTY0ICovIHsgMCwgImx3cF9zZWxmIiB9LAotICAvKiAxNjUgKi8geyAwLCAibHdwX3NldHByaXZhdGUiIH0sCi0gIC8qIDE2NiAqLyB7IDAsICJsd3BfZ2V0cHJpdmF0ZSIgfSwKLSAgLyogMTY3ICovIHsgMCwgImx3cF93YWl0IiB9LAotICAvKiAxNjggKi8geyAwLCAibHdwX211dGV4X3VubG9jayIgfSwKLSAgLyogMTY5ICovIHsgMCwgImx3cF9tdXRleF9sb2NrIiB9LAotICAvKiAxNzAgKi8geyAwLCAibHdwX2NvbmRfd2FpdCIgfSwKLSAgLyogMTcxICovIHsgMCwgImx3cF9jb25kX3NpZ25hbCIgfSwKLSAgLyogMTcyICovIHsgMCwgImx3cF9jb25kX2Jyb2FkY2FzdCIgfSwKLSAgLyogMTczICovIHsgMCwgInByZWFkIiB9LAotICAvKiAxNzQgKi8geyAwLCAicHdyaXRlIiB9LAotICAvKiAxNzUgKi8geyAwLCAibGxzZWVrIiB9LAotICAvKiAxNzYgKi8geyAwLCAiaW5zdF9zeW5jIiB9LAotICAvKiAxNzcgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDE3OCAqLyB7IDAsICJrYWlvIiB9LAotICAvKiAxNzkgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDE4MCAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMTgxICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAotICAvKiAxODIgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDE4MyAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMTg0ICovIHsgMCwgInRzb2xzeXMiIH0sCi0gIC8qIDE4NSAqLyB7IDAsICJhY2wiIH0sCi0gIC8qIDE4NiAqLyB7IDAsICJhdWRpdHN5cyIgfSwKLSAgLyogMTg3ICovIHsgMCwgInByb2Nlc3Nvcl9iaW5kIiB9LAotICAvKiAxODggKi8geyAwLCAicHJvY2Vzc29yX2luZm8iIH0sCi0gIC8qIDE4OSAqLyB7IDAsICJwX29ubGluZSIgfSwKLSAgLyogMTkwICovIHsgMCwgInNpZ3F1ZXVlIiB9LAotICAvKiAxOTEgKi8geyAwLCAiY2xvY2tfZ2V0dGltZSIgfSwKLSAgLyogMTkyICovIHsgMCwgImNsb2NrX3NldHRpbWUiIH0sCi0gIC8qIDE5MyAqLyB7IDAsICJjbG9ja19nZXRyZXMiIH0sCi0gIC8qIDE5NCAqLyB7IDAsICJ0aW1lcl9jcmVhdGUiIH0sCi0gIC8qIDE5NSAqLyB7IDAsICJ0aW1lcl9kZWxldGUiIH0sCi0gIC8qIDE5NiAqLyB7IDAsICJ0aW1lcl9zZXR0aW1lIiB9LAotICAvKiAxOTcgKi8geyAwLCAidGltZXJfZ2V0dGltZSIgfSwKLSAgLyogMTk4ICovIHsgMCwgInRpbWVyX2dldG92ZXJydW4iIH0sCi0gIC8qIDE5OSAqLyB7IDAsICJuYW5vc2xlZXAiIH0sCi0gIC8qIDIwMCAqLyB7IDAsICJmYWNsIiB9LAotICAvKiAyMDEgKi8geyAwLCAiZG9vciIgfSwKLSAgLyogMjAyICovIHsgMCwgInNldHJldWlkIiB9LAotICAvKiAyMDMgKi8geyAwLCAic2V0cmVnaWQiIH0sCi0gIC8qIDIwNCAqLyB7IDAsICJpbnN0YWxsX3V0cmFwIiB9LAotICAvKiAyMDUgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDIwNiAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMjA3ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAotICAvKiAyMDggKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCi0gIC8qIDIwOSAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKLSAgLyogMjEwICovIHsgMCwgInNpZ25vdGlmeXdhaXQiIH0sCi0gIC8qIDIxMSAqLyB7IDAsICJsd3Bfc2lncmVkaXJlY3QiIH0sCi0gIC8qIDIxMiAqLyB7IDAsICJsd3BfYWxhcm0iIH0sCi19OwotCi1zdGF0aWMgY2hhciAqKHNvbGFyaXNfZXJyb3JfbmFtZXNbXSkgPSB7Ci0gIC8qICAgMCAqLyAiRVNVQ0NFU1MiLAotICAvKiAgIDEgKi8gIkVQRVJNIiwKLSAgLyogICAyICovICJFTk9FTlQiLAotICAvKiAgIDMgKi8gIkVTUkNIIiwKLSAgLyogICA0ICovICJFSU5UUiIsCi0gIC8qICAgNSAqLyAiRUlPIiwKLSAgLyogICA2ICovICJFTlhJTyIsCi0gIC8qICAgNyAqLyAiRTJCSUciLAotICAvKiAgIDggKi8gIkVOT0VYRUMiLAotICAvKiAgIDkgKi8gIkVCQURGIiwKLSAgLyogIDEwICovICJFQ0hJTEQiLAotICAvKiAgMTEgKi8gIkVBR0FJTiIsCi0gIC8qICAxMiAqLyAiRU5PTUVNIiwKLSAgLyogIDEzICovICJFQUNDRVMiLAotICAvKiAgMTQgKi8gIkVGQVVMVCIsCi0gIC8qICAxNSAqLyAiRU5PVEJMSyIsCi0gIC8qICAxNiAqLyAiRUJVU1kiLAotICAvKiAgMTcgKi8gIkVFWElTVCIsCi0gIC8qICAxOCAqLyAiRVhERVYiLAotICAvKiAgMTkgKi8gIkVOT0RFViIsCi0gIC8qICAyMCAqLyAiRU5PVERJUiIsCi0gIC8qICAyMSAqLyAiRUlTRElSIiwKLSAgLyogIDIyICovICJFSU5WQUwiLAotICAvKiAgMjMgKi8gIkVORklMRSIsCi0gIC8qICAyNCAqLyAiRU1GSUxFIiwKLSAgLyogIDI1ICovICJFTk9UVFkiLAotICAvKiAgMjYgKi8gIkVUWFRCU1kiLAotICAvKiAgMjcgKi8gIkVGQklHIiwKLSAgLyogIDI4ICovICJFTk9TUEMiLAotICAvKiAgMjkgKi8gIkVTUElQRSIsCi0gIC8qICAzMCAqLyAiRVJPRlMiLAotICAvKiAgMzEgKi8gIkVNTElOSyIsCi0gIC8qICAzMiAqLyAiRVBJUEUiLAotICAvKiAgMzMgKi8gIkVET00iLAotICAvKiAgMzQgKi8gIkVSQU5HRSIsCi0gIC8qICAzNSAqLyAiRU5PTVNHIiwKLSAgLyogIDM2ICovICJFSURSTSIsCi0gIC8qICAzNyAqLyAiRUNIUk5HIiwKLSAgLyogIDM4ICovICJFTDJOU1lOQyIsCi0gIC8qICAzOSAqLyAiRUwzSExUIiwKLSAgLyogIDQwICovICJFTDNSU1QiLAotICAvKiAgNDEgKi8gIkVMTlJORyIsCi0gIC8qICA0MiAqLyAiRVVOQVRDSCIsCi0gIC8qICA0MyAqLyAiRU5PQ1NJIiwKLSAgLyogIDQ0ICovICJFTDJITFQiLAotICAvKiAgNDUgKi8gIkVERUFETEsiLAotICAvKiAgNDYgKi8gIkVOT0xDSyIsCi0gIC8qICA0NyAqLyAiRUNBTkNFTEVEIiwKLSAgLyogIDQ4ICovICJFTk9UU1VQIiwKLSAgLyogIDQ5ICovICJFRFFVT1QiLAotICAvKiAgNTAgKi8gIkVCQURFIiwKLSAgLyogIDUxICovICJFQkFEUiIsCi0gIC8qICA1MiAqLyAiRVhGVUxMIiwKLSAgLyogIDUzICovICJFTk9BTk8iLAotICAvKiAgNTQgKi8gIkVCQURSUUMiLAotICAvKiAgNTUgKi8gIkVCQURTTFQiLAotICAvKiAgNTYgKi8gIkVERUFETE9DSyIsCi0gIC8qICA1NyAqLyAiRUJGT05UIiwKLSAgLyogIDU4ICovICJFcnJvciBjb2RlIDU4IiwKLSAgLyogIDU5ICovICJFcnJvciBjb2RlIDU5IiwKLSAgLyogIDYwICovICJFTk9TVFIiLAotICAvKiAgNjEgKi8gIkVOT0RBVEEiLAotICAvKiAgNjIgKi8gIkVUSU1FIiwKLSAgLyogIDYzICovICJFTk9TUiIsCi0gIC8qICA2NCAqLyAiRU5PTkVUIiwKLSAgLyogIDY1ICovICJFTk9QS0ciLAotICAvKiAgNjYgKi8gIkVSRU1PVEUiLAotICAvKiAgNjcgKi8gIkVOT0xJTksiLAotICAvKiAgNjggKi8gIkVBRFYiLAotICAvKiAgNjkgKi8gIkVTUk1OVCIsCi0gIC8qICA3MCAqLyAiRUNPTU0iLAotICAvKiAgNzEgKi8gIkVQUk9UTyIsCi0gIC8qICA3MiAqLyAiRXJyb3IgY29kZSA3MiIsCi0gIC8qICA3MyAqLyAiRXJyb3IgY29kZSA3MyIsCi0gIC8qICA3NCAqLyAiRU1VTFRJSE9QIiwKLSAgLyogIDc1ICovICJFcnJvciBjb2RlIDc1IiwKLSAgLyogIDc2ICovICJFcnJvciBjb2RlIDc2IiwKLSAgLyogIDc3ICovICJFQkFETVNHIiwKLSAgLyogIDc4ICovICJFTkFNRVRPT0xPTkciLAotICAvKiAgNzkgKi8gIkVPVkVSRkxPVyIsCi0gIC8qICA4MCAqLyAiRU5PVFVOSVEiLAotICAvKiAgODEgKi8gIkVCQURGRCIsCi0gIC8qICA4MiAqLyAiRVJFTUNIRyIsCi0gIC8qICA4MyAqLyAiRUxJQkFDQyIsCi0gIC8qICA4NCAqLyAiRUxJQkJBRCIsCi0gIC8qICA4NSAqLyAiRUxJQlNDTiIsCi0gIC8qICA4NiAqLyAiRUxJQk1BWCIsCi0gIC8qICA4NyAqLyAiRUxJQkVYRUMiLAotICAvKiAgODggKi8gIkVJTFNFUSIsCi0gIC8qICA4OSAqLyAiRU5PU1lTIiwKLSAgLyogIDkwICovICJFTE9PUCIsCi0gIC8qICA5MSAqLyAiRVJFU1RBUlQiLAotICAvKiAgOTIgKi8gIkVTVFJQSVBFIiwKLSAgLyogIDkzICovICJFTk9URU1QVFkiLAotICAvKiAgOTQgKi8gIkVVU0VSUyIsCi0gIC8qICA5NSAqLyAiRU5PVFNPQ0siLAotICAvKiAgOTYgKi8gIkVERVNUQUREUlJFUSIsCi0gIC8qICA5NyAqLyAiRU1TR1NJWkUiLAotICAvKiAgOTggKi8gIkVQUk9UT1RZUEUiLAotICAvKiAgOTkgKi8gIkVOT1BST1RPT1BUIiwKLSAgLyogMTAwICovICJFcnJvciBjb2RlIDEwMCIsCi0gIC8qIDEwMSAqLyAiRXJyb3IgY29kZSAxMDEiLAotICAvKiAxMDIgKi8gIkVycm9yIGNvZGUgMTAyIiwKLSAgLyogMTAzICovICJFcnJvciBjb2RlIDEwMyIsCi0gIC8qIDEwNCAqLyAiRXJyb3IgY29kZSAxMDQiLAotICAvKiAxMDUgKi8gIkVycm9yIGNvZGUgMTA1IiwKLSAgLyogMTA2ICovICJFcnJvciBjb2RlIDEwNiIsCi0gIC8qIDEwNyAqLyAiRXJyb3IgY29kZSAxMDciLAotICAvKiAxMDggKi8gIkVycm9yIGNvZGUgMTA4IiwKLSAgLyogMTA5ICovICJFcnJvciBjb2RlIDEwOSIsCi0gIC8qIDExMCAqLyAiRXJyb3IgY29kZSAxMTAiLAotICAvKiAxMTEgKi8gIkVycm9yIGNvZGUgMTExIiwKLSAgLyogMTEyICovICJFcnJvciBjb2RlIDExMiIsCi0gIC8qIDExMyAqLyAiRXJyb3IgY29kZSAxMTMiLAotICAvKiAxMTQgKi8gIkVycm9yIGNvZGUgMTE0IiwKLSAgLyogMTE1ICovICJFcnJvciBjb2RlIDExNSIsCi0gIC8qIDExNiAqLyAiRXJyb3IgY29kZSAxMTYiLAotICAvKiAxMTcgKi8gIkVycm9yIGNvZGUgMTE3IiwKLSAgLyogMTE4ICovICJFcnJvciBjb2RlIDExOCIsCi0gIC8qIDExOSAqLyAiRXJyb3IgY29kZSAxMTkiLAotICAvKiAxMjAgKi8gIkVQUk9UT05PU1VQUE9SVCIsCi0gIC8qIDEyMSAqLyAiRVNPQ0tUTk9TVVBQT1JUIiwKLSAgLyogMTIyICovICJFT1BOT1RTVVBQIiwKLSAgLyogMTIzICovICJFUEZOT1NVUFBPUlQiLAotICAvKiAxMjQgKi8gIkVBRk5PU1VQUE9SVCIsCi0gIC8qIDEyNSAqLyAiRUFERFJJTlVTRSIsCi0gIC8qIDEyNiAqLyAiRUFERFJOT1RBVkFJTCIsCi0gIC8qIDEyNyAqLyAiRU5FVERPV04iLAotICAvKiAxMjggKi8gIkVORVRVTlJFQUNIIiwKLSAgLyogMTI5ICovICJFTkVUUkVTRVQiLAotICAvKiAxMzAgKi8gIkVDT05OQUJPUlRFRCIsCi0gIC8qIDEzMSAqLyAiRUNPTk5SRVNFVCIsCi0gIC8qIDEzMiAqLyAiRU5PQlVGUyIsCi0gIC8qIDEzMyAqLyAiRUlTQ09OTiIsCi0gIC8qIDEzNCAqLyAiRU5PVENPTk4iLAotICAvKiAxMzUgKi8gIkVycm9yIGNvZGUgMTM1IiwJLyogWEVOSVggaGFzIDEzNSAtIDE0MiAqLwotICAvKiAxMzYgKi8gIkVycm9yIGNvZGUgMTM2IiwKLSAgLyogMTM3ICovICJFcnJvciBjb2RlIDEzNyIsCi0gIC8qIDEzOCAqLyAiRXJyb3IgY29kZSAxMzgiLAotICAvKiAxMzkgKi8gIkVycm9yIGNvZGUgMTM5IiwKLSAgLyogMTQwICovICJFcnJvciBjb2RlIDE0MCIsCi0gIC8qIDE0MSAqLyAiRXJyb3IgY29kZSAxNDEiLAotICAvKiAxNDIgKi8gIkVycm9yIGNvZGUgMTQyIiwKLSAgLyogMTQzICovICJFU0hVVERPV04iLAotICAvKiAxNDQgKi8gIkVUT09NQU5ZUkVGUyIsCi0gIC8qIDE0NSAqLyAiRVRJTUVET1VUIiwKLSAgLyogMTQ2ICovICJFQ09OTlJFRlVTRUQiLAotICAvKiAxNDcgKi8gIkVIT1NURE9XTiIsCi0gIC8qIDE0OCAqLyAiRUhPU1RVTlJFQUNIIiwKLSAgLyogMTQ5ICovICJFQUxSRUFEWSIsCi0gIC8qIDE1MCAqLyAiRUlOUFJPR1JFU1MiLAotICAvKiAxNTEgKi8gIkVTVEFMRSIsCi19OwotCi1zdGF0aWMgY2hhciAqKHNvbGFyaXNfc2lnbmFsX25hbWVzW10pID0gewotICAvKiAgMCAqLyAwLAotICAvKiAgMSAqLyAiU0lHSFVQIiwKLSAgLyogIDIgKi8gIlNJR0lOVCIsCi0gIC8qICAzICovICJTSUdRVUlUIiwKLSAgLyogIDQgKi8gIlNJR0lMTCIsCi0gIC8qICA1ICovICJTSUdUUkFQIiwKLSAgLyogIDYgKi8gIlNJR0FCUlQiLAotICAvKiAgNyAqLyAiU0lHRU1UIiwKLSAgLyogIDggKi8gIlNJR0ZQRSIsCi0gIC8qICA5ICovICJTSUdLSUxMIiwKLSAgLyogMTAgKi8gIlNJR0JVUyIsCi0gIC8qIDExICovICJTSUdTRUdWIiwKLSAgLyogMTIgKi8gIlNJR1NZUyIsCi0gIC8qIDEzICovICJTSUdQSVBFIiwKLSAgLyogMTQgKi8gIlNJR0FMUk0iLAotICAvKiAxNSAqLyAiU0lHVEVSTSIsCi0gIC8qIDE2ICovICJTSUdVU1IxIiwKLSAgLyogMTcgKi8gIlNJR1VTUjIiLAotICAvKiAxOCAqLyAiU0lHQ0hMRCIsCi0gIC8qIDE5ICovICJTSUdQV1IiLAotICAvKiAyMCAqLyAiU0lHV0lOQ0giLAotICAvKiAyMSAqLyAiU0lHVVJHIiwKLSAgLyogMjIgKi8gIlNJR1BPTEwiLAotICAvKiAyMyAqLyAiU0lHU1RPUCIsCi0gIC8qIDI0ICovICJTSUdUU1RQIiwKLSAgLyogMjUgKi8gIlNJR0NPTlQiLAotICAvKiAyNiAqLyAiU0lHVFRJTiIsCi0gIC8qIDI3ICovICJTSUdUVE9VIiwKLSAgLyogMjggKi8gIlNJR1ZUQUxSTSIsCi0gIC8qIDI5ICovICJTSUdQUk9GIiwKLSAgLyogMzAgKi8gIlNJR1hDUFUiLAotICAvKiAzMSAqLyAiU0lHWEZTWiIsCi0gIC8qIDMyICovICJTSUdXQUlUSU5HIiwKLSAgLyogMzMgKi8gIlNJR0xXUCIsCi0gIC8qIDM0ICovICJTSUdGUkVFWkUiLAotICAvKiAzNSAqLyAiU0lHVEhBVyIsCi0gIC8qIDM2ICovICJTSUdDQU5DRUwiLAotfTsKLQotc3RhdGljIGVtdWxfc3lzY2FsbCBlbXVsX3NvbGFyaXNfc3lzY2FsbHMgPSB7Ci0gIHNvbGFyaXNfZGVzY3JpcHRvcnMsCi0gIHNpemVvZihzb2xhcmlzX2Rlc2NyaXB0b3JzKSAvIHNpemVvZihzb2xhcmlzX2Rlc2NyaXB0b3JzWzBdKSwKLSAgc29sYXJpc19lcnJvcl9uYW1lcywKLSAgc2l6ZW9mKHNvbGFyaXNfZXJyb3JfbmFtZXMpIC8gc2l6ZW9mKHNvbGFyaXNfZXJyb3JfbmFtZXNbMF0pLAotICBzb2xhcmlzX3NpZ25hbF9uYW1lcywKLSAgc2l6ZW9mKHNvbGFyaXNfc2lnbmFsX25hbWVzKSAvIHNpemVvZihzb2xhcmlzX3NpZ25hbF9uYW1lc1swXSksCi19OwotCi0KLS8qIFNvbGFyaXMncyBvc19lbXVsIGludGVyZmFjZSwgbW9zdCBhcmUganVzdCBwYXNzZWQgb24gdG8gdGhlIGdlbmVyaWMKLSAgIHN5c2NhbGwgc3R1ZmYgKi8KLQotc3RhdGljIG9zX2VtdWxfZGF0YSAqCi1lbXVsX3NvbGFyaXNfY3JlYXRlKGRldmljZSAqcm9vdCwKLQkJICAgIGJmZCAqaW1hZ2UsCi0JCSAgICBjb25zdCBjaGFyICpuYW1lKQotewotICAvKiBjaGVjayB0aGF0IHRoaXMgZW11bGF0aW9uIGlzIHJlYWxseSBmb3IgdXMgKi8KLSAgaWYgKG5hbWUgIT0gTlVMTCAmJiBzdHJjbXAobmFtZSwgInNvbGFyaXMiKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChpbWFnZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBlbXVsX3VuaXhfY3JlYXRlKHJvb3QsIGltYWdlLCAic29sYXJpcyIsICZlbXVsX3NvbGFyaXNfc3lzY2FsbHMpOwotfQotICAKLXN0YXRpYyB2b2lkCi1lbXVsX3NvbGFyaXNfaW5pdChvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSwKLQkJICBpbnQgbnJfY3B1cykKLXsKLSAgLyogbm90aGluZyB5ZXQgKi8KLX0KLQotc3RhdGljIHZvaWQKLWVtdWxfc29sYXJpc19zeXN0ZW1fY2FsbChjcHUgKnByb2Nlc3NvciwKLQkJCSB1bnNpZ25lZF93b3JkIGNpYSwKLQkJCSBvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSkKLXsKLSAgZW11bF9kb19zeXN0ZW1fY2FsbChlbXVsX2RhdGEsCi0JCSAgICAgIGVtdWxfZGF0YS0+c3lzY2FsbHMsCi0JCSAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzBdLAotCQkgICAgICAzLCAvKnIzIGNvbnRhaW5zIGFyZzAqLwotCQkgICAgICBwcm9jZXNzb3IsCi0JCSAgICAgIGNpYSk7Ci19Ci0KLWNvbnN0IG9zX2VtdWwgZW11bF9zb2xhcmlzID0gewotICAic29sYXJpcyIsCi0gIGVtdWxfc29sYXJpc19jcmVhdGUsCi0gIGVtdWxfc29sYXJpc19pbml0LAotICBlbXVsX3NvbGFyaXNfc3lzdGVtX2NhbGwsCi0gIDAsIC8qaW5zdHJ1Y3Rpb25fY2FsbCovCi0gIDAgIC8qZGF0YSovCi19OwotCi0MCi0vKiBFTVVMQVRJT04KLQotICAgTGludXggLSBFbXVsYXRpb24gb2YgdXNlciBwcm9ncmFtcyBmb3IgTGludXgvUFBDCi0KLSAgIERFU0NSSVBUSU9OCi0KLSAgICovCi0KLQotLyogTGludXggc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gKi8KLQotdHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X2Rldl90OwotdHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X2lub190OwotdHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X21vZGVfdDsKLXR5cGVkZWYgdW5zaWduZWQxNglsaW51eF9ubGlua190OwotdHlwZWRlZiBzaWduZWQzMglsaW51eF9vZmZfdDsKLXR5cGVkZWYgc2lnbmVkMzIJbGludXhfcGlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkMzIJbGludXhfdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkMzIJbGludXhfZ2lkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkMzIJbGludXhfc2l6ZV90OwotdHlwZWRlZiBzaWduZWQzMglsaW51eF9zc2l6ZV90OwotdHlwZWRlZiBzaWduZWQzMglsaW51eF9wdHJkaWZmX3Q7Ci10eXBlZGVmIHNpZ25lZDMyCWxpbnV4X3RpbWVfdDsKLXR5cGVkZWYgc2lnbmVkMzIJbGludXhfY2xvY2tfdDsKLXR5cGVkZWYgc2lnbmVkMzIJbGludXhfZGFkZHJfdDsKLQotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotLyogRm9yIHRoZSBQb3dlclBDLCBkb24ndCBib3RoIHdpdGggdGhlICdvbGQnIHN0YXQgc3RydWN0dXJlLCBzaW5jZSB0aGVyZQotICAgc2hvdWxkIGJlIG5vIGV4dGFudCBiaW5hcmllcyB3aXRoIHRoYXQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGxpbnV4X3N0YXQgewotCWxpbnV4X2Rldl90CXN0X2RldjsKLQlsaW51eF9pbm9fdAlzdF9pbm87Ci0JbGludXhfbW9kZV90CXN0X21vZGU7Ci0JbGludXhfbmxpbmtfdAlzdF9ubGluazsKLQlsaW51eF91aWRfdCAJc3RfdWlkOwotCWxpbnV4X2dpZF90IAlzdF9naWQ7Ci0JbGludXhfZGV2X3QJc3RfcmRldjsKLQlsaW51eF9vZmZfdAlzdF9zaXplOwotCXVuc2lnbmVkMzIgIAlzdF9ibGtzaXplOwotCXVuc2lnbmVkMzIgIAlzdF9ibG9ja3M7Ci0JdW5zaWduZWQzMiAgCXN0X2F0aW14OwkvKiBkb24ndCB1c2Ugc3Rfe2EsYyxtfXRpbWUsIHRoYXQgbWlnaHQgYSBtYWNybyAqLwotCXVuc2lnbmVkMzIgIAlfX3VudXNlZDE7CS8qIGRlZmluZWQgYnkgdGhlIGhvc3QncyBzdGF0LmggKi8KLQl1bnNpZ25lZDMyICAJc3RfbXRpbXg7Ci0JdW5zaWduZWQzMiAgCV9fdW51c2VkMjsKLQl1bnNpZ25lZDMyICAJc3RfY3RpbXg7Ci0JdW5zaWduZWQzMiAgCV9fdW51c2VkMzsKLQl1bnNpZ25lZDMyICAJX191bnVzZWQ0OwotCXVuc2lnbmVkMzIgIAlfX3VudXNlZDU7Ci19OwotCi0vKiBDb252ZXJ0IGZyb20gaG9zdCBzdGF0IHN0cnVjdHVyZSB0byBzb2xhcmlzIHN0YXQgc3RydWN0dXJlICovCi1TVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCB2b2lkCi1jb252ZXJ0X3RvX2xpbnV4X3N0YXQodW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICBzdHJ1Y3Qgc3RhdCAqaG9zdCwKLQkJICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgbGludXhfc3RhdCB0YXJnZXQ7Ci0KLSAgdGFyZ2V0LnN0X2RldiAgID0gSDJUXzQoaG9zdC0+c3RfZGV2KTsKLSAgdGFyZ2V0LnN0X2lubyAgID0gSDJUXzQoaG9zdC0+c3RfaW5vKTsKLSAgdGFyZ2V0LnN0X21vZGUgID0gSDJUXzQoaG9zdC0+c3RfbW9kZSk7Ci0gIHRhcmdldC5zdF9ubGluayA9IEgyVF8yKGhvc3QtPnN0X25saW5rKTsKLSAgdGFyZ2V0LnN0X3VpZCAgID0gSDJUXzQoaG9zdC0+c3RfdWlkKTsKLSAgdGFyZ2V0LnN0X2dpZCAgID0gSDJUXzQoaG9zdC0+c3RfZ2lkKTsKLSAgdGFyZ2V0LnN0X3NpemUgID0gSDJUXzQoaG9zdC0+c3Rfc2l6ZSk7Ci0KLSNpZmRlZiBIQVZFX1NUX1JERVYKLSAgdGFyZ2V0LnN0X3JkZXYgID0gSDJUXzQoaG9zdC0+c3RfcmRldik7Ci0jZWxzZQotICB0YXJnZXQuc3RfcmRldiAgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUX0JMS1NJWkUKLSAgdGFyZ2V0LnN0X2Jsa3NpemUgPSBIMlRfNChob3N0LT5zdF9ibGtzaXplKTsKLSNlbHNlCi0gIHRhcmdldC5zdF9ibGtzaXplID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVF9CTE9DS1MKLSAgdGFyZ2V0LnN0X2Jsb2NrcyAgPSBIMlRfNChob3N0LT5zdF9ibG9ja3MpOwotI2Vsc2UKLSAgdGFyZ2V0LnN0X2Jsb2NrcyAgPSAwOwotI2VuZGlmCi0KLSAgdGFyZ2V0LnN0X2F0aW14ICAgPSBIMlRfNChob3N0LT5zdF9hdGltZSk7Ci0gIHRhcmdldC5zdF9jdGlteCAgID0gSDJUXzQoaG9zdC0+c3RfY3RpbWUpOwotICB0YXJnZXQuc3RfbXRpbXggICA9IEgyVF80KGhvc3QtPnN0X210aW1lKTsKLSAgdGFyZ2V0Ll9fdW51c2VkMSAgPSAwOwotICB0YXJnZXQuX191bnVzZWQyICA9IDA7Ci0gIHRhcmdldC5fX3VudXNlZDMgID0gMDsKLSAgdGFyZ2V0Ll9fdW51c2VkNCAgPSAwOwotICB0YXJnZXQuX191bnVzZWQ1ICA9IDA7Ci0KLSAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1NZU19TVEFUX0ggKi8KLQotI2lmbmRlZiBIQVZFX1NUQVQKLSNkZWZpbmUgZG9fbGludXhfc3RhdCAwCi0jZWxzZQotc3RhdGljIHZvaWQKLWRvX2xpbnV4X3N0YXQob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICAgY29uc3QgaW50IGFyZzAsCi0JICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkX3dvcmQgc3RhdF9wa3QgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICBjaGFyIHBhdGhfYnVmW1BBVEhfTUFYXTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCVseCIsIChsb25nKXBhdGhfYWRkciwgcGF0aCwgKGxvbmcpc3RhdF9wa3QpOwotCi0gIHN0YXR1cyA9IHN0YXQgKHBhdGgsICZidWYpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgY29udmVydF90b19saW51eF9zdGF0IChzdGF0X3BrdCwgJmJ1ZiwgcHJvY2Vzc29yLCBjaWEpOwotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0xTVEFUCi0jZGVmaW5lIGRvX2xpbnV4X2xzdGF0IDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fbGludXhfbHN0YXQob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHgiLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIChsb25nKXN0YXRfcGt0KTsKLQotICBzdGF0dXMgPSBsc3RhdCAocGF0aCwgJmJ1Zik7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBjb252ZXJ0X3RvX2xpbnV4X3N0YXQgKHN0YXRfcGt0LCAmYnVmLCBwcm9jZXNzb3IsIGNpYSk7Ci0KLSAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRlNUQVQKLSNkZWZpbmUgZG9fbGludXhfZnN0YXQgMAotI2Vsc2UKLXN0YXRpYyB2b2lkCi1kb19saW51eF9mc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCi0JICAgICAgIHVuc2lnbmVkIGNhbGwsCi0JICAgICAgIGNvbnN0IGludCBhcmcwLAotCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBmaWxkZXMgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOwotICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBpbnQgc3RhdHVzOwotCi0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgiLCBmaWxkZXMsIChsb25nKXN0YXRfcGt0KTsKLQotICBzdGF0dXMgPSBmc3RhdCAoZmlsZGVzLCAmYnVmKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGNvbnZlcnRfdG9fbGludXhfc3RhdCAoc3RhdF9wa3QsICZidWYsIHByb2Nlc3NvciwgY2lhKTsKLQotICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQotI2RlZmluZSBMSU5VWF9OQ0MJCTEwCi0jZGVmaW5lIExJTlVYX05DQ1MJCTE5Ci0JCi0jZGVmaW5lCUxJTlVYX1ZJTlRSCQkgMAotI2RlZmluZQlMSU5VWF9WUVVJVAkJIDEKLSNkZWZpbmUJTElOVVhfVkVSQVNFCQkgMgotI2RlZmluZQlMSU5VWF9WS0lMTAkJIDMKLSNkZWZpbmUJTElOVVhfVkVPRgkJIDQKLSNkZWZpbmUgTElOVVhfVk1JTgkJIDUKLSNkZWZpbmUJTElOVVhfVkVPTAkJIDYKLSNkZWZpbmUJTElOVVhfVlRJTUUJCSA3Ci0jZGVmaW5lIExJTlVYX1ZFT0wyCQkgOAotI2RlZmluZSBMSU5VWF9WU1dUQwkJIDkKLSNkZWZpbmUgTElOVVhfVldFUkFTRSAJCTEwCi0jZGVmaW5lIExJTlVYX1ZSRVBSSU5UCQkxMQotI2RlZmluZSBMSU5VWF9WU1VTUCAJCTEyCi0jZGVmaW5lIExJTlVYX1ZTVEFSVAkJMTMKLSNkZWZpbmUgTElOVVhfVlNUT1AJCTE0Ci0jZGVmaW5lIExJTlVYX1ZMTkVYVAkJMTUKLSNkZWZpbmUgTElOVVhfVkRJU0NBUkQJCTE2Ci0JCi0jZGVmaW5lIExJTlVYX0lPQ19OUkJJVFMJIDgKLSNkZWZpbmUgTElOVVhfSU9DX1RZUEVCSVRTCSA4Ci0jZGVmaW5lIExJTlVYX0lPQ19TSVpFQklUUwkxMwotI2RlZmluZSBMSU5VWF9JT0NfRElSQklUUwkgMwotCi0jZGVmaW5lIExJTlVYX0lPQ19OUk1BU0sJKCgxIDw8IExJTlVYX0lPQ19OUkJJVFMpLTEpCi0jZGVmaW5lIExJTlVYX0lPQ19UWVBFTUFTSwkoKDEgPDwgTElOVVhfSU9DX1RZUEVCSVRTKS0xKQotI2RlZmluZSBMSU5VWF9JT0NfU0laRU1BU0sJKCgxIDw8IExJTlVYX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgTElOVVhfSU9DX0RJUk1BU0sJKCgxIDw8IExJTlVYX0lPQ19ESVJCSVRTKS0xKQotCi0jZGVmaW5lIExJTlVYX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgTElOVVhfSU9DX1RZUEVTSElGVAkoTElOVVhfSU9DX05SU0hJRlQrTElOVVhfSU9DX05SQklUUykKLSNkZWZpbmUgTElOVVhfSU9DX1NJWkVTSElGVAkoTElOVVhfSU9DX1RZUEVTSElGVCtMSU5VWF9JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIExJTlVYX0lPQ19ESVJTSElGVAkoTElOVVhfSU9DX1NJWkVTSElGVCtMSU5VWF9JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cyBfSU9DX05PTkUgY291bGQgYmUgMCwgYnV0IE9TRi8xIGdpdmVzIGl0IGEgYml0LgotICogQW5kIHRoaXMgdHVybnMgb3V0IHVzZWZ1bCB0byBjYXRjaCBvbGQgaW9jdGwgbnVtYmVycyBpbiBoZWFkZXIKLSAqIGZpbGVzIGZvciB1cy4KLSAqLwotI2RlZmluZSBMSU5VWF9JT0NfTk9ORQkJMVUKLSNkZWZpbmUgTElOVVhfSU9DX1JFQUQJCTJVCi0jZGVmaW5lIExJTlVYX0lPQ19XUklURQkJNFUKLQotI2RlZmluZSBMSU5VWF9JT0MoZGlyLHR5cGUsbnIsc2l6ZSkgXAotCSgoKGRpcikgIDw8IExJTlVYX0lPQ19ESVJTSElGVCkgfCBcCi0JICgodHlwZSkgPDwgTElOVVhfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgTElOVVhfSU9DX05SU0hJRlQpIHwgXAotCSAoKHNpemUpIDw8IExJTlVYX0lPQ19TSVpFU0hJRlQpKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIExJTlVYX0lPKHR5cGUsbnIpCSBMSU5VWF9JT0MoTElOVVhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgTElOVVhfSU9SKHR5cGUsbnIsc2l6ZSkJIExJTlVYX0lPQyhMSU5VWF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIExJTlVYX0lPVyh0eXBlLG5yLHNpemUpCSBMSU5VWF9JT0MoTElOVVhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgTElOVVhfSU9XUih0eXBlLG5yLHNpemUpIExJTlVYX0lPQyhMSU5VWF9JT0NfUkVBRHxMSU5VWF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQotLyogQ29udmVydCB0by9mcm9tIGhvc3QgdGVybWlvIHN0cnVjdHVyZSAqLwotCi1zdHJ1Y3QgbGludXhfdGVybWlvIHsKLQl1bnNpZ25lZDE2CWNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlcyAqLwotCXVuc2lnbmVkMTYJY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlcyAqLwotCXVuc2lnbmVkMTYJY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZXMgKi8KLQl1bnNpZ25lZDE2CWNfbGZsYWc7CQkvKiBsaW5lIGRpc2NpcGxpbmUgbW9kZXMgKi8KLQl1bnNpZ25lZDgJY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLwotCXVuc2lnbmVkOAljX2NjW0xJTlVYX05DQ107CS8qIGNvbnRyb2wgY2hhcnMgKi8KLX07Ci0KLVNUQVRJQ19JTkxJTkVfRU1VTF9VTklYIHZvaWQKLWNvbnZlcnRfdG9fbGludXhfdGVybWlvKHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXN0cnVjdCB0ZXJtaW8gKmhvc3QsCi0JCQljcHUgKnByb2Nlc3NvciwKLQkJCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBzdHJ1Y3QgbGludXhfdGVybWlvIHRhcmdldDsKLSAgaW50IGk7Ci0KLSAgdGFyZ2V0LmNfaWZsYWcgPSBIMlRfMiAoaG9zdC0+Y19pZmxhZyk7Ci0gIHRhcmdldC5jX29mbGFnID0gSDJUXzIgKGhvc3QtPmNfb2ZsYWcpOwotICB0YXJnZXQuY19jZmxhZyA9IEgyVF8yIChob3N0LT5jX2NmbGFnKTsKLSAgdGFyZ2V0LmNfbGZsYWcgPSBIMlRfMiAoaG9zdC0+Y19sZmxhZyk7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX0NMSU5FKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19DTElORSkKLSAgdGFyZ2V0LmNfbGluZSAgPSBob3N0LT5jX2xpbmU7Ci0jZWxzZQotICB0YXJnZXQuY19saW5lICA9IDA7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSAwOyBpIDwgTElOVVhfTkNDOyBpKyspCi0gICAgdGFyZ2V0LmNfY2NbaV0gPSAwOwotCi0jaWZkZWYgVklOVFIKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVklOVFJdID0gaG9zdC0+Y19jY1tWSU5UUl07Ci0jZW5kaWYKLQotI2lmZGVmIFZRVUlUCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZRVUlUXSA9IGhvc3QtPmNfY2NbVlFVSVRdOwotI2VuZGlmCi0KLSNpZmRlZiBWRVJBU0UKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVkVSQVNFXSA9IGhvc3QtPmNfY2NbVkVSQVNFXTsKLSNlbmRpZgotCi0jaWZkZWYgVktJTEwKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVktJTExdID0gaG9zdC0+Y19jY1tWS0lMTF07Ci0jZW5kaWYKLQotI2lmZGVmIFZFT0YKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVkVPRl0gPSBob3N0LT5jX2NjW1ZFT0ZdOwotI2VuZGlmCi0KLSNpZmRlZiBWTUlOCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZNSU5dID0gaG9zdC0+Y19jY1tWTUlOXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTAotICB0YXJnZXQuY19jY1tMSU5VWF9WRU9MXSA9IGhvc3QtPmNfY2NbVkVPTF07Ci0jZW5kaWYKLQotI2lmZGVmIFZUSU1FCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZUSU1FXSA9IGhvc3QtPmNfY2NbVlRJTUVdOwotI2VuZGlmCi0KLSNpZmRlZiBWRU9MMgotICB0YXJnZXQuY19jY1tMSU5VWF9WRU9MMl0gPSBob3N0LT5jX2NjW1ZFT0wyXTsKLSNlbmRpZgotCi0jaWZkZWYgVlNXVEMKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVlNXVENdID0gaG9zdC0+Y19jY1tWU1dUQ107Ci0jZW5kaWYKLQotI2lmZGVmIFZTV1RDSAotICB0YXJnZXQuY19jY1tMSU5VWF9WU1dUQ10gPSBob3N0LT5jX2NjW1ZTV1RDSF07Ci0jZW5kaWYKLQotICBlbXVsX3dyaXRlX2J1ZmZlcigmdGFyZ2V0LCBhZGRyLCBzaXplb2YodGFyZ2V0KSwgcHJvY2Vzc29yLCBjaWEpOwotfQotI2VuZGlmIC8qIEhBVkVfVEVSTUlPX1NUUlVDVFVSRSAqLwotCi0jaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQotLyogQ29udmVydCB0by9mcm9tIGhvc3QgdGVybWlvcyBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiB1bnNpZ25lZDMyIGxpbnV4X3RjZmxhZ190OwotdHlwZWRlZiB1bnNpZ25lZDggIGxpbnV4X2NjX3Q7Ci10eXBlZGVmIHVuc2lnbmVkMzIgbGludXhfc3BlZWRfdDsKLQotc3RydWN0IGxpbnV4X3Rlcm1pb3MgewotICBsaW51eF90Y2ZsYWdfdAljX2lmbGFnOwotICBsaW51eF90Y2ZsYWdfdAljX29mbGFnOwotICBsaW51eF90Y2ZsYWdfdAljX2NmbGFnOwotICBsaW51eF90Y2ZsYWdfdAljX2xmbGFnOwotICBsaW51eF9jY190CQljX2NjW0xJTlVYX05DQ1NdOwotICBsaW51eF9jY190CQljX2xpbmU7Ci0gIHNpZ25lZDMyCQljX2lzcGVlZDsKLSAgc2lnbmVkMzIJCWNfb3NwZWVkOwotfTsKLQotU1RBVElDX0lOTElORV9FTVVMX1VOSVggdm9pZAotY29udmVydF90b19saW51eF90ZXJtaW9zKHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSBzdHJ1Y3QgdGVybWlvcyAqaG9zdCwKLQkJCSBjcHUgKnByb2Nlc3NvciwKLQkJCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3RydWN0IGxpbnV4X3Rlcm1pb3MgdGFyZ2V0OwotICBpbnQgaTsKLQotICB0YXJnZXQuY19pZmxhZyA9IEgyVF80IChob3N0LT5jX2lmbGFnKTsKLSAgdGFyZ2V0LmNfb2ZsYWcgPSBIMlRfNCAoaG9zdC0+Y19vZmxhZyk7Ci0gIHRhcmdldC5jX2NmbGFnID0gSDJUXzQgKGhvc3QtPmNfY2ZsYWcpOwotICB0YXJnZXQuY19sZmxhZyA9IEgyVF80IChob3N0LT5jX2xmbGFnKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTElOVVhfTkNDUzsgaSsrKQotICAgIHRhcmdldC5jX2NjW2ldID0gMDsKLQotI2lmZGVmIFZJTlRSCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZJTlRSXSA9IGhvc3QtPmNfY2NbVklOVFJdOwotI2VuZGlmCi0KLSNpZmRlZiBWUVVJVAotICB0YXJnZXQuY19jY1tMSU5VWF9WUVVJVF0gPSBob3N0LT5jX2NjW1ZRVUlUXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVSQVNFCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZFUkFTRV0gPSBob3N0LT5jX2NjW1ZFUkFTRV07Ci0jZW5kaWYKLQotI2lmZGVmIFZLSUxMCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZLSUxMXSA9IGhvc3QtPmNfY2NbVktJTExdOwotI2VuZGlmCi0KLSNpZmRlZiBWRU9GCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZFT0ZdID0gaG9zdC0+Y19jY1tWRU9GXTsKLSNlbmRpZgotCi0jaWZkZWYgVkVPTAotICB0YXJnZXQuY19jY1tMSU5VWF9WRU9MXSA9IGhvc3QtPmNfY2NbVkVPTF07Ci0jZW5kaWYKLQotI2lmZGVmIFZFT0wyCi0gIHRhcmdldC5jX2NjW0xJTlVYX1ZFT0wyXSA9IGhvc3QtPmNfY2NbVkVPTDJdOwotI2VuZGlmCi0KLSNpZmRlZiBWU1dUQ0gKLSAgdGFyZ2V0LmNfY2NbTElOVVhfVlNXVENdID0gaG9zdC0+Y19jY1tWU1dUQ0hdOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RFUk1JT1NfQ0xJTkUKLSAgdGFyZ2V0LmNfbGluZSAgID0gaG9zdC0+Y19saW5lOwotI2Vsc2UKLSAgdGFyZ2V0LmNfbGluZSAgID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DRkdFVElTUEVFRAotICB0YXJnZXQuY19pc3BlZWQgPSBjZmdldGlzcGVlZCAoaG9zdCk7Ci0jZWxzZQotICB0YXJnZXQuY19pc3BlZWQgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NGR0VUT1NQRUVECi0gIHRhcmdldC5jX29zcGVlZCA9IGNmZ2V0b3NwZWVkIChob3N0KTsKLSNlbHNlCi0gIHRhcmdldC5jX29zcGVlZCA9IDA7Ci0jZW5kaWYKLQotICBlbXVsX3dyaXRlX2J1ZmZlcigmdGFyZ2V0LCBhZGRyLCBzaXplb2YodGFyZ2V0KSwgcHJvY2Vzc29yLCBjaWEpOwotfQotI2VuZGlmIC8qIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUgKi8KLQotI2lmbmRlZiBIQVZFX0lPQ1RMCi0jZGVmaW5lIGRvX2xpbnV4X2lvY3RsIDAKLSNlbHNlCi1zdGF0aWMgdm9pZAotZG9fbGludXhfaW9jdGwob3NfZW11bF9kYXRhICplbXVsLAotCSAgICAgICB1bnNpZ25lZCBjYWxsLAotCSAgICAgICBjb25zdCBpbnQgYXJnMCwKLQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgZmlsZGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07Ci0gIHVuc2lnbmVkIHJlcXVlc3QgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOwotICB1bnNpZ25lZF93b3JkIGFyZ3BfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07Ci0gIGludCBzdGF0dXMgPSAwOwotICBjb25zdCBjaGFyICpuYW1lID0gIjx1bmtub3duPiI7Ci0KLSNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCi0gIHN0cnVjdCB0ZXJtaW9zIGhvc3RfdGVybWlvOwotCi0jZWxzZQotI2lmZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQotICBzdHJ1Y3QgdGVybWlvIGhvc3RfdGVybWlvOwotI2VuZGlmCi0jZW5kaWYKLQotICBzd2l0Y2ggKHJlcXVlc3QpCi0gICAgewotICAgIGNhc2UgMDoJCQkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjYXNlICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YXR1cyA9IC0xOwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQoSEFWRV9URVJNSU9fU1RSVUNUVVJFKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUpCi0jaWYgZGVmaW5lZChUQ0dFVEEpIHx8IGRlZmluZWQoVENHRVRTKSB8fCBkZWZpbmVkKEhBVkVfVENHRVRBVFRSKQotICAgIGNhc2UgTElOVVhfSU9SKCd0JywgMjMsIHN0cnVjdCBsaW51eF90ZXJtaW8pOgkvKiBUQ0dFVEEgKi8KLSAgICAgIG5hbWUgPSAiVENHRVRBIjsKLSNpZmRlZiBIQVZFX1RDR0VUQVRUUgotICAgICAgc3RhdHVzID0gdGNnZXRhdHRyKGZpbGRlcywgJmhvc3RfdGVybWlvKTsKLSNlbGlmIGRlZmluZWQoVENHRVRTKQotICAgICAgc3RhdHVzID0gaW9jdGwgKGZpbGRlcywgVENHRVRTLCAmaG9zdF90ZXJtaW8pOwotI2Vsc2UKLSAgICAgIHN0YXR1cyA9IGlvY3RsIChmaWxkZXMsIFRDR0VUQSwgJmhvc3RfdGVybWlvKTsKLSNlbmRpZgotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCWNvbnZlcnRfdG9fbGludXhfdGVybWlvIChhcmdwX2FkZHIsICZob3N0X3Rlcm1pbywgcHJvY2Vzc29yLCBjaWEpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVENHRVRBICovCi0jZW5kaWYgLyogSEFWRV9URVJNSU9fU1RSVUNUVVJFICovCi0KLSNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCi0jaWYgZGVmaW5lZChUQ0dFVFMpIHx8IGRlZmluZWQoSEFWRV9UQ0dFVEFUVFIpCi0gICAgY2FzZSBMSU5VWF9JT1IoJ3QnLCAxOSwgc3RydWN0IGxpbnV4X3Rlcm1pb3MpOgkvKiBUQ0dFVFMgKi8KLSAgICAgIG5hbWUgPSAiVENHRVRTIjsKLSNpZmRlZiBIQVZFX1RDR0VUQVRUUgotICAgICAgc3RhdHVzID0gdGNnZXRhdHRyKGZpbGRlcywgJmhvc3RfdGVybWlvKTsKLSNlbHNlCi0gICAgICBzdGF0dXMgPSBpb2N0bCAoZmlsZGVzLCBUQ0dFVFMsICZob3N0X3Rlcm1pbyk7Ci0jZW5kaWYKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQljb252ZXJ0X3RvX2xpbnV4X3Rlcm1pb3MgKGFyZ3BfYWRkciwgJmhvc3RfdGVybWlvLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgICBicmVhazsKLSNlbmRpZiAvKiBUQ0dFVFMgKi8KLSNlbmRpZiAvKiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFICovCi0gICAgfQotCi0gIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Ci0KLSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAweCV4IFslc10sIDB4JWx4IiwgZmlsZGVzLCByZXF1ZXN0LCBuYW1lLCAobG9uZylhcmdwX2FkZHIpOwotfQotI2VuZGlmIC8qIEhBVkVfSU9DVEwgKi8KLQotc3RhdGljIGVtdWxfc3lzY2FsbF9kZXNjcmlwdG9yIGxpbnV4X2Rlc2NyaXB0b3JzW10gPSB7Ci0gIC8qICAgMCAqLyB7IDAsICJzZXR1cCIgfSwKLSAgLyogICAxICovIHsgZG9fdW5peF9leGl0LCAiZXhpdCIgfSwKLSAgLyogICAyICovIHsgMCwgImZvcmsiIH0sCi0gIC8qICAgMyAqLyB7IGRvX3VuaXhfcmVhZCwgInJlYWQiIH0sCi0gIC8qICAgNCAqLyB7IGRvX3VuaXhfd3JpdGUsICJ3cml0ZSIgfSwKLSAgLyogICA1ICovIHsgZG9fdW5peF9vcGVuLCAib3BlbiIgfSwKLSAgLyogICA2ICovIHsgZG9fdW5peF9jbG9zZSwgImNsb3NlIiB9LAotICAvKiAgIDcgKi8geyAwLCAid2FpdHBpZCIgfSwKLSAgLyogICA4ICovIHsgMCwgImNyZWF0IiB9LAotICAvKiAgIDkgKi8geyBkb191bml4X2xpbmssICJsaW5rIiB9LAotICAvKiAgMTAgKi8geyBkb191bml4X3VubGluaywgInVubGluayIgfSwKLSAgLyogIDExICovIHsgMCwgImV4ZWN2ZSIgfSwKLSAgLyogIDEyICovIHsgZG9fdW5peF9jaGRpciwgImNoZGlyIiB9LAotICAvKiAgMTMgKi8geyBkb191bml4X3RpbWUsICJ0aW1lIiB9LAotICAvKiAgMTQgKi8geyAwLCAibWtub2QiIH0sCi0gIC8qICAxNSAqLyB7IDAsICJjaG1vZCIgfSwKLSAgLyogIDE2ICovIHsgMCwgImNob3duIiB9LAotICAvKiAgMTcgKi8geyAwLCAiYnJlYWsiIH0sCi0gIC8qICAxOCAqLyB7IDAsICJzdGF0IiB9LAotICAvKiAgMTkgKi8geyBkb191bml4X2xzZWVrLCAibHNlZWsiIH0sCi0gIC8qICAyMCAqLyB7IGRvX3VuaXhfZ2V0cGlkLCAiZ2V0cGlkIiB9LAotICAvKiAgMjEgKi8geyAwLCAibW91bnQiIH0sCi0gIC8qICAyMiAqLyB7IDAsICJ1bW91bnQiIH0sCi0gIC8qICAyMyAqLyB7IDAsICJzZXR1aWQiIH0sCi0gIC8qICAyNCAqLyB7IGRvX3VuaXhfZ2V0dWlkLCAiZ2V0dWlkIiB9LAotICAvKiAgMjUgKi8geyAwLCAic3RpbWUiIH0sCi0gIC8qICAyNiAqLyB7IDAsICJwdHJhY2UiIH0sCi0gIC8qICAyNyAqLyB7IDAsICJhbGFybSIgfSwKLSAgLyogIDI4ICovIHsgMCwgImZzdGF0IiB9LAotICAvKiAgMjkgKi8geyAwLCAicGF1c2UiIH0sCi0gIC8qICAzMCAqLyB7IDAsICJ1dGltZSIgfSwKLSAgLyogIDMxICovIHsgMCwgInN0dHkiIH0sCi0gIC8qICAzMiAqLyB7IDAsICJndHR5IiB9LAotICAvKiAgMzMgKi8geyBkb191bml4X2FjY2VzcywgImFjY2VzcyIgfSwKLSAgLyogIDM0ICovIHsgMCwgIm5pY2UiIH0sCi0gIC8qICAzNSAqLyB7IDAsICJmdGltZSIgfSwKLSAgLyogIDM2ICovIHsgMCwgInN5bmMiIH0sCi0gIC8qICAzNyAqLyB7IDAsICJraWxsIiB9LAotICAvKiAgMzggKi8geyAwLCAicmVuYW1lIiB9LAotICAvKiAgMzkgKi8geyBkb191bml4X21rZGlyLCAibWtkaXIiIH0sCi0gIC8qICA0MCAqLyB7IGRvX3VuaXhfcm1kaXIsICJybWRpciIgfSwKLSAgLyogIDQxICovIHsgZG9fdW5peF9kdXAsICJkdXAiIH0sCi0gIC8qICA0MiAqLyB7IDAsICJwaXBlIiB9LAotICAvKiAgNDMgKi8geyAwLCAidGltZXMiIH0sCi0gIC8qICA0NCAqLyB7IDAsICJwcm9mIiB9LAotICAvKiAgNDUgKi8geyBkb191bml4X2JyZWFrLCAiYnJrIiB9LAotICAvKiAgNDYgKi8geyAwLCAic2V0Z2lkIiB9LAotICAvKiAgNDcgKi8geyBkb191bml4X2dldGdpZCwgImdldGdpZCIgfSwKLSAgLyogIDQ4ICovIHsgMCwgInNpZ25hbCIgfSwKLSAgLyogIDQ5ICovIHsgZG9fdW5peF9nZXRldWlkLCAiZ2V0ZXVpZCIgfSwKLSAgLyogIDUwICovIHsgZG9fdW5peF9nZXRlZ2lkLCAiZ2V0ZWdpZCIgfSwKLSAgLyogIDUxICovIHsgMCwgImFjY3QiIH0sCi0gIC8qICA1MiAqLyB7IDAsICJwaHlzIiB9LAotICAvKiAgNTMgKi8geyAwLCAibG9jayIgfSwKLSAgLyogIDU0ICovIHsgZG9fbGludXhfaW9jdGwsICJpb2N0bCIgfSwKLSAgLyogIDU1ICovIHsgMCwgImZjbnRsIiB9LAotICAvKiAgNTYgKi8geyAwLCAibXB4IiB9LAotICAvKiAgNTcgKi8geyAwLCAic2V0cGdpZCIgfSwKLSAgLyogIDU4ICovIHsgMCwgInVsaW1pdCIgfSwKLSAgLyogIDU5ICovIHsgMCwgIm9sZHVuYW1lIiB9LAotICAvKiAgNjAgKi8geyBkb191bml4X3VtYXNrLCAidW1hc2siIH0sCi0gIC8qICA2MSAqLyB7IDAsICJjaHJvb3QiIH0sCi0gIC8qICA2MiAqLyB7IDAsICJ1c3RhdCIgfSwKLSAgLyogIDYzICovIHsgZG9fdW5peF9kdXAyLCAiZHVwMiIgfSwKLSAgLyogIDY0ICovIHsgZG9fdW5peF9nZXRwcGlkLCAiZ2V0cHBpZCIgfSwKLSAgLyogIDY1ICovIHsgMCwgImdldHBncnAiIH0sCi0gIC8qICA2NiAqLyB7IDAsICJzZXRzaWQiIH0sCi0gIC8qICA2NyAqLyB7IDAsICJzaWdhY3Rpb24iIH0sCi0gIC8qICA2OCAqLyB7IDAsICJzZ2V0bWFzayIgfSwKLSAgLyogIDY5ICovIHsgMCwgInNzZXRtYXNrIiB9LAotICAvKiAgNzAgKi8geyAwLCAic2V0cmV1aWQiIH0sCi0gIC8qICA3MSAqLyB7IDAsICJzZXRyZWdpZCIgfSwKLSAgLyogIDcyICovIHsgMCwgInNpZ3N1c3BlbmQiIH0sCi0gIC8qICA3MyAqLyB7IDAsICJzaWdwZW5kaW5nIiB9LAotICAvKiAgNzQgKi8geyAwLCAic2V0aG9zdG5hbWUiIH0sCi0gIC8qICA3NSAqLyB7IDAsICJzZXRybGltaXQiIH0sCi0gIC8qICA3NiAqLyB7IDAsICJnZXRybGltaXQiIH0sCi0gIC8qICA3NyAqLyB7IGRvX3VuaXhfZ2V0cnVzYWdlLCAiZ2V0cnVzYWdlIiB9LAotICAvKiAgNzggKi8geyBkb191bml4X2dldHRpbWVvZmRheSwgImdldHRpbWVvZmRheSIgfSwKLSAgLyogIDc5ICovIHsgMCwgInNldHRpbWVvZmRheSIgfSwKLSAgLyogIDgwICovIHsgMCwgImdldGdyb3VwcyIgfSwKLSAgLyogIDgxICovIHsgMCwgInNldGdyb3VwcyIgfSwKLSAgLyogIDgyICovIHsgMCwgInNlbGVjdCIgfSwKLSAgLyogIDgzICovIHsgZG9fdW5peF9zeW1saW5rLCAic3ltbGluayIgfSwKLSAgLyogIDg0ICovIHsgMCwgImxzdGF0IiB9LAotICAvKiAgODUgKi8geyAwLCAicmVhZGxpbmsiIH0sCi0gIC8qICA4NiAqLyB7IDAsICJ1c2VsaWIiIH0sCi0gIC8qICA4NyAqLyB7IDAsICJzd2Fwb24iIH0sCi0gIC8qICA4OCAqLyB7IDAsICJyZWJvb3QiIH0sCi0gIC8qICA4OSAqLyB7IDAsICJyZWFkZGlyIiB9LAotICAvKiAgOTAgKi8geyAwLCAibW1hcCIgfSwKLSAgLyogIDkxICovIHsgMCwgIm11bm1hcCIgfSwKLSAgLyogIDkyICovIHsgMCwgInRydW5jYXRlIiB9LAotICAvKiAgOTMgKi8geyAwLCAiZnRydW5jYXRlIiB9LAotICAvKiAgOTQgKi8geyAwLCAiZmNobW9kIiB9LAotICAvKiAgOTUgKi8geyAwLCAiZmNob3duIiB9LAotICAvKiAgOTYgKi8geyAwLCAiZ2V0cHJpb3JpdHkiIH0sCi0gIC8qICA5NyAqLyB7IDAsICJzZXRwcmlvcml0eSIgfSwKLSAgLyogIDk4ICovIHsgMCwgInByb2ZpbCIgfSwKLSAgLyogIDk5ICovIHsgMCwgInN0YXRmcyIgfSwKLSAgLyogMTAwICovIHsgMCwgImZzdGF0ZnMiIH0sCi0gIC8qIDEwMSAqLyB7IDAsICJpb3Blcm0iIH0sCi0gIC8qIDEwMiAqLyB7IDAsICJzb2NrZXRjYWxsIiB9LAotICAvKiAxMDMgKi8geyAwLCAic3lzbG9nIiB9LAotICAvKiAxMDQgKi8geyAwLCAic2V0aXRpbWVyIiB9LAotICAvKiAxMDUgKi8geyAwLCAiZ2V0aXRpbWVyIiB9LAotICAvKiAxMDYgKi8geyBkb19saW51eF9zdGF0LCAibmV3c3RhdCIgfSwKLSAgLyogMTA3ICovIHsgZG9fbGludXhfbHN0YXQsICJuZXdsc3RhdCIgfSwKLSAgLyogMTA4ICovIHsgZG9fbGludXhfZnN0YXQsICJuZXdmc3RhdCIgfSwKLSAgLyogMTA5ICovIHsgMCwgInVuYW1lIiB9LAotICAvKiAxMTAgKi8geyAwLCAiaW9wbCIgfSwKLSAgLyogMTExICovIHsgMCwgInZoYW5ndXAiIH0sCi0gIC8qIDExMiAqLyB7IDAsICJpZGxlIiB9LAotICAvKiAxMTMgKi8geyAwLCAidm04NiIgfSwKLSAgLyogMTE0ICovIHsgMCwgIndhaXQ0IiB9LAotICAvKiAxMTUgKi8geyAwLCAic3dhcG9mZiIgfSwKLSAgLyogMTE2ICovIHsgMCwgInN5c2luZm8iIH0sCi0gIC8qIDExNyAqLyB7IDAsICJpcGMiIH0sCi0gIC8qIDExOCAqLyB7IDAsICJmc3luYyIgfSwKLSAgLyogMTE5ICovIHsgMCwgInNpZ3JldHVybiIgfSwKLSAgLyogMTIwICovIHsgMCwgImNsb25lIiB9LAotICAvKiAxMjEgKi8geyAwLCAic2V0ZG9tYWlubmFtZSIgfSwKLSAgLyogMTIyICovIHsgMCwgIm5ld3VuYW1lIiB9LAotICAvKiAxMjMgKi8geyAwLCAibW9kaWZ5X2xkdCIgfSwKLSAgLyogMTI0ICovIHsgMCwgImFkanRpbWV4IiB9LAotICAvKiAxMjUgKi8geyAwLCAibXByb3RlY3QiIH0sCi0gIC8qIDEyNiAqLyB7IDAsICJzaWdwcm9jbWFzayIgfSwKLSAgLyogMTI3ICovIHsgMCwgImNyZWF0ZV9tb2R1bGUiIH0sCi0gIC8qIDEyOCAqLyB7IDAsICJpbml0X21vZHVsZSIgfSwKLSAgLyogMTI5ICovIHsgMCwgImRlbGV0ZV9tb2R1bGUiIH0sCi0gIC8qIDEzMCAqLyB7IDAsICJnZXRfa2VybmVsX3N5bXMiIH0sCi0gIC8qIDEzMSAqLyB7IDAsICJxdW90YWN0bCIgfSwKLSAgLyogMTMyICovIHsgMCwgImdldHBnaWQiIH0sCi0gIC8qIDEzMyAqLyB7IDAsICJmY2hkaXIiIH0sCi0gIC8qIDEzNCAqLyB7IDAsICJiZGZsdXNoIiB9LAotICAvKiAxMzUgKi8geyAwLCAic3lzZnMiIH0sCi0gIC8qIDEzNiAqLyB7IDAsICJwZXJzb25hbGl0eSIgfSwKLSAgLyogMTM3ICovIHsgMCwgImFmc19zeXNjYWxsIiB9LAotICAvKiAxMzggKi8geyAwLCAic2V0ZnN1aWQiIH0sCi0gIC8qIDEzOSAqLyB7IDAsICJzZXRmc2dpZCIgfSwKLSAgLyogMTQwICovIHsgMCwgImxsc2VlayIgfSwKLSAgLyogMTQxICovIHsgMCwgImdldGRlbnRzIiB9LAotICAvKiAxNDIgKi8geyAwLCAibmV3c2VsZWN0IiB9LAotICAvKiAxNDMgKi8geyAwLCAiZmxvY2siIH0sCi0gIC8qIDE0NCAqLyB7IDAsICJtc3luYyIgfSwKLSAgLyogMTQ1ICovIHsgMCwgInJlYWR2IiB9LAotICAvKiAxNDYgKi8geyAwLCAid3JpdGV2IiB9LAotICAvKiAxNDcgKi8geyAwLCAiZ2V0c2lkIiB9LAotICAvKiAxNDggKi8geyAwLCAiZmRhdGFzeW5jIiB9LAotICAvKiAxNDkgKi8geyAwLCAic3lzY3RsIiB9LAotICAvKiAxNTAgKi8geyAwLCAibWxvY2siIH0sCi0gIC8qIDE1MSAqLyB7IDAsICJtdW5sb2NrIiB9LAotICAvKiAxNTIgKi8geyAwLCAibWxvY2thbGwiIH0sCi0gIC8qIDE1MyAqLyB7IDAsICJtdW5sb2NrYWxsIiB9LAotICAvKiAxNTQgKi8geyAwLCAic2NoZWRfc2V0cGFyYW0iIH0sCi0gIC8qIDE1NSAqLyB7IDAsICJzY2hlZF9nZXRwYXJhbSIgfSwKLSAgLyogMTU2ICovIHsgMCwgInNjaGVkX3NldHNjaGVkdWxlciIgfSwKLSAgLyogMTU3ICovIHsgMCwgInNjaGVkX2dldHNjaGVkdWxlciIgfSwKLSAgLyogMTU4ICovIHsgMCwgInNjaGVkX3lpZWxkIiB9LAotICAvKiAxNTkgKi8geyAwLCAic2NoZWRfZ2V0X3ByaW9yaXR5X21heCIgfSwKLSAgLyogMTYwICovIHsgMCwgInNjaGVkX2dldF9wcmlvcml0eV9taW4iIH0sCi0gIC8qIDE2MSAqLyB7IDAsICJzY2hlZF9ycl9nZXRfaW50ZXJ2YWwiIH0sCi19OwotCi1zdGF0aWMgY2hhciAqKGxpbnV4X2Vycm9yX25hbWVzW10pID0gewotICAvKiAgIDAgKi8gIkVTVUNDRVNTIiwKLSAgLyogICAxICovICJFUEVSTSIsCi0gIC8qICAgMiAqLyAiRU5PRU5UIiwKLSAgLyogICAzICovICJFU1JDSCIsCi0gIC8qICAgNCAqLyAiRUlOVFIiLAotICAvKiAgIDUgKi8gIkVJTyIsCi0gIC8qICAgNiAqLyAiRU5YSU8iLAotICAvKiAgIDcgKi8gIkUyQklHIiwKLSAgLyogICA4ICovICJFTk9FWEVDIiwKLSAgLyogICA5ICovICJFQkFERiIsCi0gIC8qICAxMCAqLyAiRUNISUxEIiwKLSAgLyogIDExICovICJFQUdBSU4iLAotICAvKiAgMTIgKi8gIkVOT01FTSIsCi0gIC8qICAxMyAqLyAiRUFDQ0VTIiwKLSAgLyogIDE0ICovICJFRkFVTFQiLAotICAvKiAgMTUgKi8gIkVOT1RCTEsiLAotICAvKiAgMTYgKi8gIkVCVVNZIiwKLSAgLyogIDE3ICovICJFRVhJU1QiLAotICAvKiAgMTggKi8gIkVYREVWIiwKLSAgLyogIDE5ICovICJFTk9ERVYiLAotICAvKiAgMjAgKi8gIkVOT1RESVIiLAotICAvKiAgMjEgKi8gIkVJU0RJUiIsCi0gIC8qICAyMiAqLyAiRUlOVkFMIiwKLSAgLyogIDIzICovICJFTkZJTEUiLAotICAvKiAgMjQgKi8gIkVNRklMRSIsCi0gIC8qICAyNSAqLyAiRU5PVFRZIiwKLSAgLyogIDI2ICovICJFVFhUQlNZIiwKLSAgLyogIDI3ICovICJFRkJJRyIsCi0gIC8qICAyOCAqLyAiRU5PU1BDIiwKLSAgLyogIDI5ICovICJFU1BJUEUiLAotICAvKiAgMzAgKi8gIkVST0ZTIiwKLSAgLyogIDMxICovICJFTUxJTksiLAotICAvKiAgMzIgKi8gIkVQSVBFIiwKLSAgLyogIDMzICovICJFRE9NIiwKLSAgLyogIDM0ICovICJFUkFOR0UiLAotICAvKiAgMzUgKi8gIkVERUFETEsiLAotICAvKiAgMzYgKi8gIkVOQU1FVE9PTE9ORyIsCi0gIC8qICAzNyAqLyAiRU5PTENLIiwKLSAgLyogIDM4ICovICJFTk9TWVMiLAotICAvKiAgMzkgKi8gIkVOT1RFTVBUWSIsCi0gIC8qICA0MCAqLyAiRUxPT1AiLAotICAvKiAgNDEgKi8gMCwKLSAgLyogIDQyICovICJFTk9NU0ciLAotICAvKiAgNDMgKi8gIkVJRFJNIiwKLSAgLyogIDQ0ICovICJFQ0hSTkciLAotICAvKiAgNDUgKi8gIkVMMk5TWU5DIiwKLSAgLyogIDQ2ICovICJFTDNITFQiLAotICAvKiAgNDcgKi8gIkVMM1JTVCIsCi0gIC8qICA0OCAqLyAiRUxOUk5HIiwKLSAgLyogIDQ5ICovICJFVU5BVENIIiwKLSAgLyogIDUwICovICJFTk9DU0kiLAotICAvKiAgNTEgKi8gIkVMMkhMVCIsCi0gIC8qICA1MiAqLyAiRUJBREUiLAotICAvKiAgNTMgKi8gIkVCQURSIiwKLSAgLyogIDU0ICovICJFWEZVTEwiLAotICAvKiAgNTUgKi8gIkVOT0FOTyIsCi0gIC8qICA1NiAqLyAiRUJBRFJRQyIsCi0gIC8qICA1NyAqLyAiRUJBRFNMVCIsCi0gIC8qICA1OCAqLyAiRURFQURMT0NLIiwKLSAgLyogIDU5ICovICJFQkZPTlQiLAotICAvKiAgNjAgKi8gIkVOT1NUUiIsCi0gIC8qICA2MSAqLyAiRU5PREFUQSIsCi0gIC8qICA2MiAqLyAiRVRJTUUiLAotICAvKiAgNjMgKi8gIkVOT1NSIiwKLSAgLyogIDY0ICovICJFTk9ORVQiLAotICAvKiAgNjUgKi8gIkVOT1BLRyIsCi0gIC8qICA2NiAqLyAiRVJFTU9URSIsCi0gIC8qICA2NyAqLyAiRU5PTElOSyIsCi0gIC8qICA2OCAqLyAiRUFEViIsCi0gIC8qICA2OSAqLyAiRVNSTU5UIiwKLSAgLyogIDcwICovICJFQ09NTSIsCi0gIC8qICA3MSAqLyAiRVBST1RPIiwKLSAgLyogIDcyICovICJFTVVMVElIT1AiLAotICAvKiAgNzMgKi8gIkVET1RET1QiLAotICAvKiAgNzQgKi8gIkVCQURNU0ciLAotICAvKiAgNzUgKi8gIkVPVkVSRkxPVyIsCi0gIC8qICA3NiAqLyAiRU5PVFVOSVEiLAotICAvKiAgNzcgKi8gIkVCQURGRCIsCi0gIC8qICA3OCAqLyAiRVJFTUNIRyIsCi0gIC8qICA3OSAqLyAiRUxJQkFDQyIsCi0gIC8qICA4MCAqLyAiRUxJQkJBRCIsCi0gIC8qICA4MSAqLyAiRUxJQlNDTiIsCi0gIC8qICA4MiAqLyAiRUxJQk1BWCIsCi0gIC8qICA4MyAqLyAiRUxJQkVYRUMiLAotICAvKiAgODQgKi8gIkVJTFNFUSIsCi0gIC8qICA4NSAqLyAiRVJFU1RBUlQiLAotICAvKiAgODYgKi8gIkVTVFJQSVBFIiwKLSAgLyogIDg3ICovICJFVVNFUlMiLAotICAvKiAgODggKi8gIkVOT1RTT0NLIiwKLSAgLyogIDg5ICovICJFREVTVEFERFJSRVEiLAotICAvKiAgOTAgKi8gIkVNU0dTSVpFIiwKLSAgLyogIDkxICovICJFUFJPVE9UWVBFIiwKLSAgLyogIDkyICovICJFTk9QUk9UT09QVCIsCi0gIC8qICA5MyAqLyAiRVBST1RPTk9TVVBQT1JUIiwKLSAgLyogIDk0ICovICJFU09DS1ROT1NVUFBPUlQiLAotICAvKiAgOTUgKi8gIkVPUE5PVFNVUFAiLAotICAvKiAgOTYgKi8gIkVQRk5PU1VQUE9SVCIsCi0gIC8qICA5NyAqLyAiRUFGTk9TVVBQT1JUIiwKLSAgLyogIDk4ICovICJFQUREUklOVVNFIiwKLSAgLyogIDk5ICovICJFQUREUk5PVEFWQUlMIiwKLSAgLyogMTAwICovICJFTkVURE9XTiIsCi0gIC8qIDEwMSAqLyAiRU5FVFVOUkVBQ0giLAotICAvKiAxMDIgKi8gIkVORVRSRVNFVCIsCi0gIC8qIDEwMyAqLyAiRUNPTk5BQk9SVEVEIiwKLSAgLyogMTA0ICovICJFQ09OTlJFU0VUIiwKLSAgLyogMTA1ICovICJFTk9CVUZTIiwKLSAgLyogMTA2ICovICJFSVNDT05OIiwKLSAgLyogMTA3ICovICJFTk9UQ09OTiIsCi0gIC8qIDEwOCAqLyAiRVNIVVRET1dOIiwKLSAgLyogMTA5ICovICJFVE9PTUFOWVJFRlMiLAotICAvKiAxMTAgKi8gIkVUSU1FRE9VVCIsCi0gIC8qIDExMSAqLyAiRUNPTk5SRUZVU0VEIiwKLSAgLyogMTEyICovICJFSE9TVERPV04iLAotICAvKiAxMTMgKi8gIkVIT1NUVU5SRUFDSCIsCi0gIC8qIDExNCAqLyAiRUFMUkVBRFkiLAotICAvKiAxMTUgKi8gIkVJTlBST0dSRVNTIiwKLSAgLyogMTE2ICovICJFU1RBTEUiLAotICAvKiAxMTcgKi8gIkVVQ0xFQU4iLAotICAvKiAxMTggKi8gIkVOT1ROQU0iLAotICAvKiAxMTkgKi8gIkVOQVZBSUwiLAotICAvKiAxMjAgKi8gIkVJU05BTSIsCi0gIC8qIDEyMSAqLyAiRVJFTU9URUlPIiwKLSAgLyogMTIyICovICJFRFFVT1QiLAotfTsKLQotc3RhdGljIGNoYXIgKihsaW51eF9zaWduYWxfbmFtZXNbXSkgPSB7Ci0gIC8qICAwICovIDAsCi0gIC8qICAxICovICJTSUdIVVAiLAotICAvKiAgMiAqLyAiU0lHSU5UIiwKLSAgLyogIDMgKi8gIlNJR1FVSVQiLAotICAvKiAgNCAqLyAiU0lHSUxMIiwKLSAgLyogIDUgKi8gIlNJR1RSQVAiLAotICAvKiAgNiAqLyAiU0lHQUJSVCIsCi0gIC8qICA2ICovICJTSUdJT1QiLAotICAvKiAgNyAqLyAiU0lHQlVTIiwKLSAgLyogIDggKi8gIlNJR0ZQRSIsCi0gIC8qICA5ICovICJTSUdLSUxMIiwKLSAgLyogMTAgKi8gIlNJR1VTUjEiLAotICAvKiAxMSAqLyAiU0lHU0VHViIsCi0gIC8qIDEyICovICJTSUdVU1IyIiwKLSAgLyogMTMgKi8gIlNJR1BJUEUiLAotICAvKiAxNCAqLyAiU0lHQUxSTSIsCi0gIC8qIDE1ICovICJTSUdURVJNIiwKLSAgLyogMTYgKi8gIlNJR1NUS0ZMVCIsCi0gIC8qIDE3ICovICJTSUdDSExEIiwKLSAgLyogMTggKi8gIlNJR0NPTlQiLAotICAvKiAxOSAqLyAiU0lHU1RPUCIsCi0gIC8qIDIwICovICJTSUdUU1RQIiwKLSAgLyogMjEgKi8gIlNJR1RUSU4iLAotICAvKiAyMiAqLyAiU0lHVFRPVSIsCi0gIC8qIDIzICovICJTSUdVUkciLAotICAvKiAyNCAqLyAiU0lHWENQVSIsCi0gIC8qIDI1ICovICJTSUdYRlNaIiwKLSAgLyogMjYgKi8gIlNJR1ZUQUxSTSIsCi0gIC8qIDI3ICovICJTSUdQUk9GIiwKLSAgLyogMjggKi8gIlNJR1dJTkNIIiwKLSAgLyogMjkgKi8gIlNJR0lPIiwKLSAgLyogMzAgKi8gIlNJR1BXUiIsCi0gIC8qIDMxICovICJTSUdVTlVTRUQiLAotfTsKLQotc3RhdGljIGVtdWxfc3lzY2FsbCBlbXVsX2xpbnV4X3N5c2NhbGxzID0gewotICBsaW51eF9kZXNjcmlwdG9ycywKLSAgc2l6ZW9mKGxpbnV4X2Rlc2NyaXB0b3JzKSAvIHNpemVvZihsaW51eF9kZXNjcmlwdG9yc1swXSksCi0gIGxpbnV4X2Vycm9yX25hbWVzLAotICBzaXplb2YobGludXhfZXJyb3JfbmFtZXMpIC8gc2l6ZW9mKGxpbnV4X2Vycm9yX25hbWVzWzBdKSwKLSAgbGludXhfc2lnbmFsX25hbWVzLAotICBzaXplb2YobGludXhfc2lnbmFsX25hbWVzKSAvIHNpemVvZihsaW51eF9zaWduYWxfbmFtZXNbMF0pLAotfTsKLQotCi0vKiBMaW51eCdzIG9zX2VtdWwgaW50ZXJmYWNlLCBtb3N0IGFyZSBqdXN0IHBhc3NlZCBvbiB0byB0aGUgZ2VuZXJpYwotICAgc3lzY2FsbCBzdHVmZiAqLwotCi1zdGF0aWMgb3NfZW11bF9kYXRhICoKLWVtdWxfbGludXhfY3JlYXRlKGRldmljZSAqcm9vdCwKLQkJICBiZmQgKmltYWdlLAotCQkgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIC8qIGNoZWNrIHRoYXQgdGhpcyBlbXVsYXRpb24gaXMgcmVhbGx5IGZvciB1cyAqLwotICBpZiAobmFtZSAhPSBOVUxMICYmIHN0cmNtcChuYW1lLCAibGludXgiKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChpbWFnZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBlbXVsX3VuaXhfY3JlYXRlKHJvb3QsIGltYWdlLCAibGludXgiLCAmZW11bF9saW51eF9zeXNjYWxscyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbXVsX2xpbnV4X2luaXQob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCi0JCWludCBucl9jcHVzKQotewotICAvKiBub3RoaW5nIHlldCAqLwotfQotCi1zdGF0aWMgdm9pZAotZW11bF9saW51eF9zeXN0ZW1fY2FsbChjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkgICAgICAgb3NfZW11bF9kYXRhICplbXVsX2RhdGEpCi17Ci0gIGVtdWxfZG9fc3lzdGVtX2NhbGwoZW11bF9kYXRhLAotCQkgICAgICBlbXVsX2RhdGEtPnN5c2NhbGxzLAotCQkgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclswXSwKLQkJICAgICAgMywgLypyMyBjb250YWlucyBhcmcwKi8KLQkJICAgICAgcHJvY2Vzc29yLAotCQkgICAgICBjaWEpOwotfQotCi1jb25zdCBvc19lbXVsIGVtdWxfbGludXggPSB7Ci0gICJsaW51eCIsCi0gIGVtdWxfbGludXhfY3JlYXRlLAotICBlbXVsX2xpbnV4X2luaXQsCi0gIGVtdWxfbGludXhfc3lzdGVtX2NhbGwsCi0gIDAsIC8qaW5zdHJ1Y3Rpb25fY2FsbCovCi0gIDAgIC8qZGF0YSovCi19OwotCi0jZW5kaWYgLyogX0VNVUxfVU5JWF9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX3VuaXguaCBiL3NpbS9wcGMvZW11bF91bml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OTVjYzcuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9lbXVsX3VuaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9FTVVMX1VOSVhfSF8KLSNkZWZpbmUgX0VNVUxfVU5JWF9IXwotCi1leHRlcm4gY29uc3Qgb3NfZW11bCBlbXVsX3NvbGFyaXM7Ci1leHRlcm4gY29uc3Qgb3NfZW11bCBlbXVsX2xpbnV4OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZXZlbnRzLmMgYi9zaW0vcHBjL2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM5MTM4Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfRVZFTlRTX0NfCi0jZGVmaW5lIF9FVkVOVFNfQ18KLQotI2luY2x1ZGUgImJhc2ljcy5oIgotI2luY2x1ZGUgImV2ZW50cy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiAhZGVmaW5lZCAoU0lNX0VWRU5UU19QT0xMX1JBVEUpCi0jZGVmaW5lIFNJTV9FVkVOVFNfUE9MTF9SQVRFIDB4MTAwMAotI2VuZGlmCi0KLQotCi0vKiBUaGUgZXZlbnQgcXVldWUgbWFpbnRhaW5zIGEgc2luZ2xlIGFic29sdXRlIHRpbWUgdXNpbmcgdHdvCi0gICB2YXJpYWJsZXMuCi0gICAKLSAgIFRJTUVfT0ZfRVZFTlQ6IHRoaXMgaG9sZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgZXZlbnQgaXMgbWVudAotICAgdG8gb2NjdXJlLiAgSWYgbm8gbmV4dCBldmVudCBpdCB3aWxsIGhvbGQgdGhlIHRpbWUgb2YgdGhlIGxhc3QKLSAgIGV2ZW50LgotCi0gICBUSU1FX0ZST01fRVZFTlQ6IFRoZSBjdXJyZW50IGRpc3RhbmNlIGZyb20gVElNRV9PRl9FVkVOVC4gIElmIGFuCi0gICBldmVudCBpcyBwZW5kaW5nLCB0aGlzIHdpbGwgYmUgcG9zaXRpdmUuICBJZiBubyBmdXR1cmUgZXZlbnQgaXMKLSAgIHBlbmRpbmcgdGhpcyB3aWxsIGJlIG5lZ2F0aXZlLiAgVGhpcyB2YXJpYWJsZSBpcyBkZWNyZW1lbnRlZCBvbmNlCi0gICBmb3IgZWFjaCBpdGVyYXRpb24gb2YgYSBjbG9jayBjeWNsZS4KLQotICAgSW5pdGlhbGx5LCB0aGUgY2xvY2sgaXMgc3RhcnRlZCBhdCB0aW1lIG9uZSAoMSkgd2l0aCBUSU1FX09GX0VWRU5UCi0gICA9PSAwIGFuZCBUSU1FX0ZST01fRVZFTlQgPT0gLTEuCi0KLSAgIENsZWFybHkgdGhlcmUgaXMgYSBidWcgaW4gdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBhYnNvbHV0ZQotICAgdGltZSBjb3VudGVyIHdpbGwgbmV2ZXIgYmVjb21lIGdyZWF0ZXIgdGhhbiAyXjYyLiAqLwotCi10eXBlZGVmIHN0cnVjdCBfZXZlbnRfZW50cnkgZXZlbnRfZW50cnk7Ci1zdHJ1Y3QgX2V2ZW50X2VudHJ5IHsKLSAgdm9pZCAqZGF0YTsKLSAgZXZlbnRfaGFuZGxlciAqaGFuZGxlcjsKLSAgc2lnbmVkNjQgdGltZV9vZl9ldmVudDsgIAotICBldmVudF9lbnRyeSAqbmV4dDsKLX07Ci0KLXN0cnVjdCBfZXZlbnRfcXVldWUgewotICBpbnQgcHJvY2Vzc2luZzsKLSAgZXZlbnRfZW50cnkgKnF1ZXVlOwotICBldmVudF9lbnRyeSAqdm9sYXRpbGUgaGVsZDsKLSAgZXZlbnRfZW50cnkgKnZvbGF0aWxlICp2b2xhdGlsZSBoZWxkX2VuZDsKLSAgc2lnbmVkNjQgdGltZV9vZl9ldmVudDsKLSAgc2lnbmVkNjQgdGltZV9mcm9tX2V2ZW50OwotfTsKLQotCi1TVEFUSUNfSU5MSU5FX0VWRU5UU1wKLSh2b2lkKQotc2ltX2V2ZW50c19wb2xsICh2b2lkICpkYXRhKQotewotICBldmVudF9xdWV1ZSAqcXVldWUgPSBkYXRhOwotICAvKiBqdXN0IHJlLXNjaGVkdWxlIGluIDEwMDAgbWlsbGlvbiB0aWNrcyB0aW1lICovCi0gIGV2ZW50X3F1ZXVlX3NjaGVkdWxlIChxdWV1ZSwgU0lNX0VWRU5UU19QT0xMX1JBVEUsIHNpbV9ldmVudHNfcG9sbCwgcXVldWUpOwotICBzaW1faW9fcG9sbF9xdWl0ICgpOwotfQotCi0KLUlOTElORV9FVkVOVFNcCi0oZXZlbnRfcXVldWUgKikKLWV2ZW50X3F1ZXVlX2NyZWF0ZSh2b2lkKQotewotICBldmVudF9xdWV1ZSAqbmV3X2V2ZW50X3F1ZXVlID0gWkFMTE9DKGV2ZW50X3F1ZXVlKTsKLQotICBuZXdfZXZlbnRfcXVldWUtPnByb2Nlc3NpbmcgPSAwOwotICBuZXdfZXZlbnRfcXVldWUtPnF1ZXVlID0gTlVMTDsKLSAgbmV3X2V2ZW50X3F1ZXVlLT5oZWxkID0gTlVMTDsKLSAgbmV3X2V2ZW50X3F1ZXVlLT5oZWxkX2VuZCA9ICZuZXdfZXZlbnRfcXVldWUtPmhlbGQ7Ci0KLSAgLyogYm90aCB0aW1lcyBhcmUgYWxyZWFkeSB6ZXJvICovCi0gIHJldHVybiBuZXdfZXZlbnRfcXVldWU7Ci19Ci0KLQotSU5MSU5FX0VWRU5UU1wKLSh2b2lkKQotZXZlbnRfcXVldWVfaW5pdChldmVudF9xdWV1ZSAqcXVldWUpCi17Ci0gIGV2ZW50X2VudHJ5ICpldmVudDsKLQotICAvKiBkcmFpbiB0aGUgaW50ZXJydXB0IHF1ZXVlICovCi0gIHsKLSNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCi0gICAgc2lnc2V0X3Qgb2xkX21hc2s7Ci0gICAgc2lnc2V0X3QgbmV3X21hc2s7Ci0gICAgc2lnZmlsbHNldCgmbmV3X21hc2spOwotICAgIC8qLUxPQ0stKi8gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKLSNlbmRpZgotICAgIGV2ZW50ID0gcXVldWUtPmhlbGQ7Ci0gICAgd2hpbGUgKGV2ZW50ICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50X2VudHJ5ICpkZWFkID0gZXZlbnQ7Ci0gICAgICBldmVudCA9IGV2ZW50LT5uZXh0OwotICAgICAgemZyZWUoZGVhZCk7Ci0gICAgfQotICAgIHF1ZXVlLT5oZWxkID0gTlVMTDsKLSAgICBxdWV1ZS0+aGVsZF9lbmQgPSAmcXVldWUtPmhlbGQ7Ci0jaWYgZGVmaW5lZChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkKFNJR19TRVRNQVNLKQotICAgIC8qLVVOTE9DSy0qLyBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZF9tYXNrLCBOVUxMKTsKLSNlbmRpZgotICB9Ci0KLSAgLyogZHJhaW4gdGhlIG5vcm1hbCBxdWV1ZSAqLwotICBldmVudCA9IHF1ZXVlLT5xdWV1ZTsKLSAgd2hpbGUgKGV2ZW50ICE9IE5VTEwpIHsKLSAgICBldmVudF9lbnRyeSAqZGVhZCA9IGV2ZW50OwotICAgIGV2ZW50ID0gZXZlbnQtPm5leHQ7Ci0gICAgemZyZWUoZGVhZCk7Ci0gIH0KLSAgcXVldWUtPnF1ZXVlID0gTlVMTDsKLSAgICAKLSAgLyogd2luZCB0aW1lIGJhY2sgdG8gb25lICovCi0gIHF1ZXVlLT5wcm9jZXNzaW5nID0gMDsKLSAgcXVldWUtPnRpbWVfb2ZfZXZlbnQgPSAwOwotICBxdWV1ZS0+dGltZV9mcm9tX2V2ZW50ID0gLTE7Ci0KLSAgLyogc2NoZWR1bGUgb3VyIGluaXRpYWwgY291bnRlciBldmVudCAqLwotICBldmVudF9xdWV1ZV9zY2hlZHVsZSAocXVldWUsIDAsIHNpbV9ldmVudHNfcG9sbCwgcXVldWUpOwotfQotCi1JTkxJTkVfRVZFTlRTXAotKHNpZ25lZDY0KQotZXZlbnRfcXVldWVfdGltZShldmVudF9xdWV1ZSAqcXVldWUpCi17Ci0gIHJldHVybiBxdWV1ZS0+dGltZV9vZl9ldmVudCAtIHF1ZXVlLT50aW1lX2Zyb21fZXZlbnQ7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfRVZFTlRTXAotKHZvaWQpCi11cGRhdGVfdGltZV9mcm9tX2V2ZW50KGV2ZW50X3F1ZXVlICpldmVudHMpCi17Ci0gIHNpZ25lZDY0IGN1cnJlbnRfdGltZSA9IGV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKTsKLSAgaWYgKGV2ZW50cy0+cXVldWUgIT0gTlVMTCkgewotICAgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID0gKGV2ZW50cy0+cXVldWUtPnRpbWVfb2ZfZXZlbnQgLSBjdXJyZW50X3RpbWUpOwotICAgIGV2ZW50cy0+dGltZV9vZl9ldmVudCA9IGV2ZW50cy0+cXVldWUtPnRpbWVfb2ZfZXZlbnQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZXZlbnRzLT50aW1lX29mX2V2ZW50ID0gY3VycmVudF90aW1lIC0gMTsKLSAgICBldmVudHMtPnRpbWVfZnJvbV9ldmVudCA9IC0xOwotICB9Ci0gIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9ldmVudHNdKQotICAgIHsKLSAgICAgIGV2ZW50X2VudHJ5ICpldmVudDsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChldmVudCA9IGV2ZW50cy0+cXVldWUsIGkgPSAwOwotCSAgIGV2ZW50ICE9IE5VTEw7Ci0JICAgZXZlbnQgPSBldmVudC0+bmV4dCwgaSsrKQotCXsKLQkgIFRSQUNFKHRyYWNlX2V2ZW50cywgKCJldmVudCB0aW1lLWZyb20tZXZlbnQgLSB0aW1lICVsZCwgZGVsdGEgJWxkIC0gZXZlbnQgJWQsIHRhZyAweCVseCwgdGltZSAlbGQsIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHhcbiIsCi0JCQkgICAgICAgKGxvbmcpY3VycmVudF90aW1lLAotCQkJICAgICAgIChsb25nKWV2ZW50cy0+dGltZV9mcm9tX2V2ZW50LAotCQkJICAgICAgIGksCi0JCQkgICAgICAgKGxvbmcpZXZlbnQsCi0JCQkgICAgICAgKGxvbmcpZXZlbnQtPnRpbWVfb2ZfZXZlbnQsCi0JCQkgICAgICAgKGxvbmcpZXZlbnQtPmhhbmRsZXIsCi0JCQkgICAgICAgKGxvbmcpZXZlbnQtPmRhdGEpKTsKLQl9Ci0gICAgfQotICBBU1NFUlQoY3VycmVudF90aW1lID09IGV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSk7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfRVZFTlRTXAotKHZvaWQpCi1pbnNlcnRfZXZlbnRfZW50cnkoZXZlbnRfcXVldWUgKmV2ZW50cywKLQkJICAgZXZlbnRfZW50cnkgKm5ld19ldmVudCwKLQkJICAgc2lnbmVkNjQgZGVsdGEpCi17Ci0gIGV2ZW50X2VudHJ5ICpjdXJyOwotICBldmVudF9lbnRyeSAqKnByZXY7Ci0gIHNpZ25lZDY0IHRpbWVfb2ZfZXZlbnQ7Ci0KLSAgaWYgKGRlbHRhIDwgMCkKLSAgICBlcnJvcigid2hhdCBpcyBwYXN0IGlzIHBhc3QhXG4iKTsKLQotICAvKiBjb21wdXRlIHdoZW4gdGhlIGV2ZW50IHNob3VsZCBvY2N1cmUgKi8KLSAgdGltZV9vZl9ldmVudCA9IGV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSArIGRlbHRhOwotCi0gIC8qIGZpbmQgdGhlIHF1ZXVlIGluc2VydGlvbiBwb2ludCAtIHRoaW5ncyBhcmUgdGltZSBvcmRlcmVkICovCi0gIHByZXYgPSAmZXZlbnRzLT5xdWV1ZTsKLSAgY3VyciA9IGV2ZW50cy0+cXVldWU7Ci0gIHdoaWxlIChjdXJyICE9IE5VTEwgJiYgdGltZV9vZl9ldmVudCA+PSBjdXJyLT50aW1lX29mX2V2ZW50KSB7Ci0gICAgQVNTRVJUKGN1cnItPm5leHQgPT0gTlVMTAotCSAgIHx8IGN1cnItPnRpbWVfb2ZfZXZlbnQgPD0gY3Vyci0+bmV4dC0+dGltZV9vZl9ldmVudCk7Ci0gICAgcHJldiA9ICZjdXJyLT5uZXh0OwotICAgIGN1cnIgPSBjdXJyLT5uZXh0OwotICB9Ci0gIEFTU0VSVChjdXJyID09IE5VTEwgfHwgdGltZV9vZl9ldmVudCA8IGN1cnItPnRpbWVfb2ZfZXZlbnQpOwotCi0gIC8qIGluc2VydCBpdCAqLwotICBuZXdfZXZlbnQtPm5leHQgPSBjdXJyOwotICAqcHJldiA9IG5ld19ldmVudDsKLSAgbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50ID0gdGltZV9vZl9ldmVudDsKLQotICAvKiBhZGp1c3QgdGhlIHRpbWUgdW50aWwgdGhlIGZpcnN0IGV2ZW50ICovCi0gIHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQoZXZlbnRzKTsKLX0KLQotSU5MSU5FX0VWRU5UU1wKLShldmVudF9lbnRyeV90YWcpCi1ldmVudF9xdWV1ZV9zY2hlZHVsZShldmVudF9xdWV1ZSAqZXZlbnRzLAotCQkgICAgIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0JCSAgICAgZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLQkJICAgICB2b2lkICpkYXRhKQotewotICBldmVudF9lbnRyeSAqbmV3X2V2ZW50ID0gWkFMTE9DKGV2ZW50X2VudHJ5KTsKLSAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKLSAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgaW5zZXJ0X2V2ZW50X2VudHJ5KGV2ZW50cywgbmV3X2V2ZW50LCBkZWx0YV90aW1lKTsKLSAgVFJBQ0UodHJhY2VfZXZlbnRzLCAoImV2ZW50IHNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKLQkJICAgICAgIChsb25nKWV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSwKLQkJICAgICAgIChsb25nKW5ld19ldmVudCwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+aGFuZGxlciwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOwotICByZXR1cm4gKGV2ZW50X2VudHJ5X3RhZyluZXdfZXZlbnQ7Ci19Ci0KLQotSU5MSU5FX0VWRU5UU1wKLShldmVudF9lbnRyeV90YWcpCi1ldmVudF9xdWV1ZV9zY2hlZHVsZV9hZnRlcl9zaWduYWwoZXZlbnRfcXVldWUgKmV2ZW50cywKLQkJCQkgIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0JCQkJICBldmVudF9oYW5kbGVyICpoYW5kbGVyLAotCQkJCSAgdm9pZCAqZGF0YSkKLXsKLSAgZXZlbnRfZW50cnkgKm5ld19ldmVudCA9IFpBTExPQyhldmVudF9lbnRyeSk7Ci0KLSAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKLSAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50ID0gZGVsdGFfdGltZTsgLyogd29yayBpdCBvdXQgbGF0ZXIgKi8KLSAgbmV3X2V2ZW50LT5uZXh0ID0gTlVMTDsKLQotICB7Ci0jaWYgZGVmaW5lZChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkKFNJR19TRVRNQVNLKQotICAgIHNpZ3NldF90IG9sZF9tYXNrOwotICAgIHNpZ3NldF90IG5ld19tYXNrOwotICAgIHNpZ2ZpbGxzZXQoJm5ld19tYXNrKTsKLSAgICAvKi1MT0NLLSovIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbmV3X21hc2ssICZvbGRfbWFzayk7Ci0jZW5kaWYKLSAgICBpZiAoZXZlbnRzLT5oZWxkID09IE5VTEwpIHsKLSAgICAgIGV2ZW50cy0+aGVsZCA9IG5ld19ldmVudDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAqZXZlbnRzLT5oZWxkX2VuZCA9IG5ld19ldmVudDsKLSAgICB9Ci0gICAgZXZlbnRzLT5oZWxkX2VuZCA9ICZuZXdfZXZlbnQtPm5leHQ7Ci0jaWYgZGVmaW5lZChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkKFNJR19TRVRNQVNLKQotICAgIC8qLVVOTE9DSy0qLyBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZF9tYXNrLCBOVUxMKTsKLSNlbmRpZgotICB9Ci0KLSAgVFJBQ0UodHJhY2VfZXZlbnRzLCAoImV2ZW50IHNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKLQkJICAgICAgIChsb25nKWV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSwKLQkJICAgICAgIChsb25nKW5ld19ldmVudCwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+aGFuZGxlciwKLQkJICAgICAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOwotCi0gIHJldHVybiAoZXZlbnRfZW50cnlfdGFnKW5ld19ldmVudDsKLX0KLQotCi1JTkxJTkVfRVZFTlRTXAotKHZvaWQpCi1ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKGV2ZW50X3F1ZXVlICpldmVudHMsCi0JCSAgICAgICBldmVudF9lbnRyeV90YWcgZXZlbnRfdG9fcmVtb3ZlKQotewotICBldmVudF9lbnRyeSAqdG9fcmVtb3ZlID0gKGV2ZW50X2VudHJ5KilldmVudF90b19yZW1vdmU7Ci0gIEFTU0VSVCgoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPj0gMCkgPT0gKGV2ZW50cy0+cXVldWUgIT0gTlVMTCkpOwotICBpZiAoZXZlbnRfdG9fcmVtb3ZlICE9IE5VTEwpIHsKLSAgICBldmVudF9lbnRyeSAqY3VycmVudDsKLSAgICBldmVudF9lbnRyeSAqKnB0cl90b19jdXJyZW50OwotICAgIGZvciAocHRyX3RvX2N1cnJlbnQgPSAmZXZlbnRzLT5xdWV1ZSwgY3VycmVudCA9ICpwdHJfdG9fY3VycmVudDsKLQkgY3VycmVudCAhPSBOVUxMICYmIGN1cnJlbnQgIT0gdG9fcmVtb3ZlOwotCSBwdHJfdG9fY3VycmVudCA9ICZjdXJyZW50LT5uZXh0LCBjdXJyZW50ID0gKnB0cl90b19jdXJyZW50KTsKLSAgICBpZiAoY3VycmVudCA9PSB0b19yZW1vdmUpIHsKLSAgICAgICpwdHJfdG9fY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgICBUUkFDRSh0cmFjZV9ldmVudHMsICgiZXZlbnQgZGVzY2hlZHVsZWQgYXQgJWxkIC0gdGFnIDB4JWx4IC0gdGltZSAlbGQsIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHhcbiIsCi0JCQkgICAobG9uZylldmVudF9xdWV1ZV90aW1lKGV2ZW50cyksCi0JCQkgICAobG9uZylldmVudF90b19yZW1vdmUsCi0JCQkgICAobG9uZyljdXJyZW50LT50aW1lX29mX2V2ZW50LAotCQkJICAgKGxvbmcpY3VycmVudC0+aGFuZGxlciwKLQkJCSAgIChsb25nKWN1cnJlbnQtPmRhdGEpKTsKLSAgICAgIHpmcmVlKGN1cnJlbnQpOwotICAgICAgdXBkYXRlX3RpbWVfZnJvbV9ldmVudChldmVudHMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIFRSQUNFKHRyYWNlX2V2ZW50cywgKCJldmVudCBkZXNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSBub3QgZm91bmRcbiIsCi0JCQkgICAobG9uZylldmVudF9xdWV1ZV90aW1lKGV2ZW50cyksCi0JCQkgICAobG9uZylldmVudF90b19yZW1vdmUpKTsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUKChldmVudHMtPnRpbWVfZnJvbV9ldmVudCA+PSAwKSA9PSAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKSk7Ci19Ci0KLQotCi0KLUlOTElORV9FVkVOVFNcCi0oaW50KQotZXZlbnRfcXVldWVfdGljayhldmVudF9xdWV1ZSAqZXZlbnRzKQotewotICBzaWduZWQ2NCB0aW1lX2Zyb21fZXZlbnQ7Ci0KLSAgLyogd2Ugc2hvdWxkIG9ubHkgYmUgaGVyZSB3aGVuIHRoZSBwcmV2aW91cyB0aWNrIGhhcyBiZWVuIGZ1bGx5IHByb2Nlc3NlZCAqLwotICBBU1NFUlQoIWV2ZW50cy0+cHJvY2Vzc2luZyk7Ci0KLSAgLyogbW92ZSBhbnkgZXZlbnRzIHRoYXQgd2VyZSBxdWV1ZWQgYnkgYW55IHNpZ25hbCBoYW5kbGVycyBvbnRvIHRoZQotICAgICByZWFsIGV2ZW50IHF1ZXVlLiAgQlRXOiBXaGVuIGlubGluaW5nLCBoYXZpbmcgdGhpcyBjb2RlIGhlcmUsCi0gICAgIGluc3RlYWQgb2YgaW4gZXZlbnRfcXVldWVfcHJvY2VzcygpIGNhdXNlcyBHQ0MgdG8gcHV0IGdyZWF0ZXIKLSAgICAgd2VpZ2h0IG9uIGtlZXBpbmcgdGhlIHBvaW50ZXIgRVZFTlRTIGluIGEgcmVnaXN0ZXIuICBUaGlzLCBpbgotICAgICB0dXJuIHJlc3VsdHMgaW4gYmV0dGVyIGNvZGUgYmVpbmcgb3V0cHV0LiAqLwotICBpZiAoZXZlbnRzLT5oZWxkICE9IE5VTEwpIHsKLSAgICBldmVudF9lbnRyeSAqaGVsZF9ldmVudHM7Ci0gICAgZXZlbnRfZW50cnkgKmN1cnJfZXZlbnQ7Ci0KLSAgICB7Ci0jaWYgZGVmaW5lZChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkKFNJR19TRVRNQVNLKQotICAgICAgc2lnc2V0X3Qgb2xkX21hc2s7Ci0gICAgICBzaWdzZXRfdCBuZXdfbWFzazsKLSAgICAgIHNpZ2ZpbGxzZXQoJm5ld19tYXNrKTsKLSAgICAgIC8qLUxPQ0stKi8gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKLSNlbmRpZgotICAgICAgaGVsZF9ldmVudHMgPSBldmVudHMtPmhlbGQ7Ci0gICAgICBldmVudHMtPmhlbGQgPSBOVUxMOwotICAgICAgZXZlbnRzLT5oZWxkX2VuZCA9ICZldmVudHMtPmhlbGQ7Ci0jaWYgZGVmaW5lZChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkKFNJR19TRVRNQVNLKQotICAgICAgLyotVU5MT0NLLSovIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOwotI2VuZGlmCi0gICAgfQotCi0gICAgZG8gewotICAgICAgY3Vycl9ldmVudCA9IGhlbGRfZXZlbnRzOwotICAgICAgaGVsZF9ldmVudHMgPSBjdXJyX2V2ZW50LT5uZXh0OwotICAgICAgaW5zZXJ0X2V2ZW50X2VudHJ5KGV2ZW50cywgY3Vycl9ldmVudCwgY3Vycl9ldmVudC0+dGltZV9vZl9ldmVudCk7Ci0gICAgfSB3aGlsZSAoaGVsZF9ldmVudHMgIT0gTlVMTCk7Ci0gIH0KLQotICAvKiBhZHZhbmNlIHRpbWUsIGNoZWNraW5nIHRvIHNlZSBpZiB3ZSd2ZSByZWFjaGVkIHRpbWUgemVybyB3aGljaAotICAgICB3b3VsZCBpbmRpY2F0ZSB0aGUgdGltZSBmb3IgdGhlIG5leHQgZXZlbnQgaGFzIGFycml2ZWQgKi8KLSAgdGltZV9mcm9tX2V2ZW50ID0gZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQ7Ci0gIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID0gdGltZV9mcm9tX2V2ZW50IC0gMTsKLSAgcmV0dXJuIHRpbWVfZnJvbV9ldmVudCA9PSAwOwotfQotCi0KLQotSU5MSU5FX0VWRU5UU1wKLSh2b2lkKQotZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudF9xdWV1ZSAqZXZlbnRzKQotewotICBzaWduZWQ2NCBldmVudF90aW1lID0gZXZlbnRfcXVldWVfdGltZShldmVudHMpOwotCi0gIEFTU0VSVCgoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPT0gLTEgJiYgZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKQotCSB8fCBldmVudHMtPnByb2Nlc3NpbmcpOyAvKiBzb21ldGhpbmcgdG8gZG8gKi8KLQotICAvKiBjb25zdW1lIGFsbCBldmVudHMgZm9yIHRoaXMgb3IgZWFybGllciB0aW1lcy4gIEJlIGNhcmVmdWwgdG8KLSAgICAgYWxsb3cgYSBuZXcgZXZlbnQgdG8gYXBwZWFyIHVuZGVyIG91ciBmZWV0ICovCi0gIGV2ZW50cy0+cHJvY2Vzc2luZyA9IDE7Ci0gIHdoaWxlIChldmVudHMtPnF1ZXVlICE9IE5VTEwKLQkgJiYgZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudCA8PSBldmVudF90aW1lKSB7Ci0gICAgZXZlbnRfZW50cnkgKnRvX2RvID0gZXZlbnRzLT5xdWV1ZTsKLSAgICBldmVudF9oYW5kbGVyICpoYW5kbGVyID0gdG9fZG8tPmhhbmRsZXI7Ci0gICAgdm9pZCAqZGF0YSA9IHRvX2RvLT5kYXRhOwotICAgIGV2ZW50cy0+cXVldWUgPSB0b19kby0+bmV4dDsKLSAgICBUUkFDRSh0cmFjZV9ldmVudHMsICgiZXZlbnQgaXNzdWVkIGF0ICVsZCAtIHRhZyAweCVseCAtIHRpbWUgJWxkLCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAotCQkJIChsb25nKWV2ZW50X3RpbWUsCi0JCQkgKGxvbmcpdG9fZG8sCi0JCQkgKGxvbmcpdG9fZG8tPnRpbWVfb2ZfZXZlbnQsCi0JCQkgKGxvbmcpaGFuZGxlciwKLQkJCSAobG9uZylkYXRhKSk7Ci0gICAgemZyZWUodG9fZG8pOwotICAgIC8qIEFsd2F5cyByZS1jb21wdXRlIHRoZSB0aW1lIHRvIHRoZSBuZXh0IGV2ZW50IHNvIHRoYXQgSEFORExFUigpCi0gICAgICAgY2FuIHNhZmVseSBpbnNlcnQgbmV3IGV2ZW50cyBpbnRvIHRoZSBxdWV1ZS4gKi8KLSAgICB1cGRhdGVfdGltZV9mcm9tX2V2ZW50KGV2ZW50cyk7Ci0gICAgaGFuZGxlcihkYXRhKTsKLSAgfQotICBldmVudHMtPnByb2Nlc3NpbmcgPSAwOwotCi0gIEFTU0VSVChldmVudHMtPnRpbWVfZnJvbV9ldmVudCA+IDApOwotICBBU1NFUlQoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKTsgLyogYWx3YXlzIHBvbGwgZXZlbnQgKi8KLX0KLQotCi0jZW5kaWYgLyogX0VWRU5UU19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9ldmVudHMuaCBiL3NpbS9wcGMvZXZlbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlN2JlNTAuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9ldmVudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0VWRU5UU19IXwotI2RlZmluZSBfRVZFTlRTX0hfCi0KLS8qIHR5cGVkZWYgc3RydWN0IF9ldmVudF9xdWV1ZSBldmVudF9xdWV1ZTsgKi8KLS8qIHR5cGVkZWYgc3RydWN0IF9ldmVudF9lbnRyeV90YWcgKmV2ZW50X2VudHJ5X3RhZzsgKi8KLQotdHlwZWRlZiB2b2lkIGV2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSk7Ci0KLUlOTElORV9FVkVOVFNcCi0oZXZlbnRfcXVldWUgKikgZXZlbnRfcXVldWVfY3JlYXRlCi0odm9pZCk7Ci0KLUlOTElORV9FVkVOVFNcCi0odm9pZCkgZXZlbnRfcXVldWVfaW5pdAotKGV2ZW50X3F1ZXVlICpxdWV1ZSk7Ci0KLQotLyogKGRlKVNjaGVkdWxlIHRoaW5ncyB0byBoYXBwZW4gaW4gdGhlIGZ1dHVyZS4gKi8KLQotSU5MSU5FX0VWRU5UU1wKLShldmVudF9lbnRyeV90YWcpIGV2ZW50X3F1ZXVlX3NjaGVkdWxlCi0oZXZlbnRfcXVldWUgKnF1ZXVlLAotIHNpZ25lZDY0IGRlbHRhX3RpbWUsCi0gZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKLSB2b2lkICpkYXRhKTsKLQotSU5MSU5FX0VWRU5UU1wKLShldmVudF9lbnRyeV90YWcpIGV2ZW50X3F1ZXVlX3NjaGVkdWxlX2FmdGVyX3NpZ25hbAotKGV2ZW50X3F1ZXVlICpxdWV1ZSwKLSBzaWduZWQ2NCBkZWx0YV90aW1lLAotIGV2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCi0gdm9pZCAqZGF0YSk7Ci0KLUlOTElORV9FVkVOVFNcCi0odm9pZCkgZXZlbnRfcXVldWVfZGVzY2hlZHVsZQotKGV2ZW50X3F1ZXVlICpxdWV1ZSwKLSBldmVudF9lbnRyeV90YWcgZXZlbnRfdG9fcmVtb3ZlKTsKLQotCi0vKiBwcm9ncmVzcyB0aW1lLiAgSW4gdG8gcGFydHMgc28gdGhhdCBpZiBzb21ldGhpbmcgaXMgcGVuZGluZywgdGhlCi0gICBjYWxsZXIgaGFzIGEgY2hhbmNlIHRvIHNhdmUgYW55IGNhY2hlZCBzdGF0ZSAqLwotCi1JTkxJTkVfRVZFTlRTXAotKGludCkgZXZlbnRfcXVldWVfdGljawotKGV2ZW50X3F1ZXVlICpxdWV1ZSk7Ci0KLUlOTElORV9FVkVOVFNcCi0odm9pZCkgZXZlbnRfcXVldWVfcHJvY2VzcwotKGV2ZW50X3F1ZXVlICpldmVudHMpOwotCi0KLS8qIGxvY2FsIGNvbmNlcHQgb2YgdGltZSAqLwotCi1JTkxJTkVfRVZFTlRTXAotKHNpZ25lZDY0KSBldmVudF9xdWV1ZV90aW1lCi0oZXZlbnRfcXVldWUgKnF1ZXVlKTsKLQotI2VuZGlmIC8qIF9FVkVOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZmlsdGVyLmMgYi9zaW0vcHBjL2ZpbHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTAxYTE3Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImZpbHRlci5oIgotCi1zdHJ1Y3QgX2ZpbHRlciB7Ci0gIGNoYXIgKmZsYWc7Ci0gIGZpbHRlciAqbmV4dDsKLX07Ci0KLQotZmlsdGVyICoKLW5ld19maWx0ZXIoY29uc3QgY2hhciAqZmlsdCwKLQkgICBmaWx0ZXIgKmZpbHRlcnMpCi17Ci0gIHdoaWxlIChzdHJsZW4oZmlsdCkgPiAwKSB7Ci0gICAgZmlsdGVyICpuZXdfZmlsdGVyOwotICAgIC8qIGJyZWFrIHVwIHRoZSBmaWx0IGxpc3QgKi8KLSAgICBjaGFyICplbmQgPSBzdHJjaHIoZmlsdCwgJywnKTsKLSAgICBjaGFyICpuZXh0OwotICAgIGludCBsZW47Ci0gICAgaWYgKGVuZCA9PSBOVUxMKSB7Ci0gICAgICBlbmQgPSBzdHJjaHIoZmlsdCwgJ1wwJyk7Ci0gICAgICBuZXh0ID0gZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5leHQgPSBlbmQgKyAxOwotICAgIH0KLSAgICBsZW4gPSBlbmQgLSBmaWx0OwotICAgIC8qIGFkZCB0byBmaWx0ZXIgbGlzdCAqLwotICAgIG5ld19maWx0ZXIgPSBaQUxMT0MoZmlsdGVyKTsKLSAgICBuZXdfZmlsdGVyLT5mbGFnID0gKGNoYXIqKXphbGxvYyhsZW4gKyAxKTsKLSAgICBzdHJuY3B5KG5ld19maWx0ZXItPmZsYWcsIGZpbHQsIGxlbik7Ci0gICAgbmV3X2ZpbHRlci0+bmV4dCA9IGZpbHRlcnM7Ci0gICAgZmlsdGVycyA9IG5ld19maWx0ZXI7Ci0gICAgZmlsdCA9IG5leHQ7Ci0gIH0KLSAgcmV0dXJuIGZpbHRlcnM7Ci19Ci0KLQotaW50Ci1pc19maWx0ZXJlZF9vdXQoY29uc3QgY2hhciAqZmxhZ3MsCi0JCWZpbHRlciAqZmlsdGVycykKLXsKLSAgd2hpbGUgKHN0cmxlbihmbGFncykgPiAwKSB7Ci0gICAgaW50IHByZXNlbnQ7Ci0gICAgZmlsdGVyICpmaWx0ID0gZmlsdGVyczsKLSAgICAvKiBicmVhayB0aGUgc3RyaW5nIHVwICovCi0gICAgY2hhciAqZW5kID0gc3RyY2hyKGZsYWdzLCAnLCcpOwotICAgIGNoYXIgKm5leHQ7Ci0gICAgaW50IGxlbjsKLSAgICBpZiAoZW5kID09IE5VTEwpIHsKLSAgICAgIGVuZCA9IHN0cmNocihmbGFncywgJ1wwJyk7Ci0gICAgICBuZXh0ID0gZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5leHQgPSBlbmQgKyAxOwotICAgIH0KLSAgICBsZW4gPSBlbmQgLSBmbGFnczsKLSAgICAvKiBjaGVjayB0aGF0IGl0IGlzIHByZXNlbnQgKi8KLSAgICBwcmVzZW50ID0gMDsKLSAgICBmaWx0ID0gZmlsdGVyczsKLSAgICB3aGlsZSAoZmlsdCAhPSBOVUxMKSB7Ci0gICAgICBpZiAoc3RybmNtcChmbGFncywgZmlsdC0+ZmxhZywgbGVuKSA9PSAwCi0JICAmJiBzdHJsZW4oZmlsdC0+ZmxhZykgPT0gbGVuKSB7Ci0JcHJlc2VudCA9IDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmaWx0ID0gZmlsdC0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCFwcmVzZW50KQotICAgICAgcmV0dXJuIDE7Ci0gICAgZmxhZ3MgPSBuZXh0OwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLWludAotaXRfaXMoY29uc3QgY2hhciAqZmxhZywKLSAgICAgIGNvbnN0IGNoYXIgKmZsYWdzKQotewotICBpbnQgZmxhZ19sZW4gPSBzdHJsZW4oZmxhZyk7Ci0gIHdoaWxlICgqZmxhZ3MgIT0gJ1wwJykgewotICAgIGlmICghc3RybmNtcChmbGFncywgZmxhZywgZmxhZ19sZW4pCi0JJiYgKGZsYWdzW2ZsYWdfbGVuXSA9PSAnLCcgfHwgZmxhZ3NbZmxhZ19sZW5dID09ICdcMCcpKQotICAgICAgcmV0dXJuIDE7Ci0gICAgd2hpbGUgKCpmbGFncyAhPSAnLCcpIHsKLSAgICAgIGlmICgqZmxhZ3MgPT0gJ1wwJykKLQlyZXR1cm4gMDsKLSAgICAgIGZsYWdzKys7Ci0gICAgfQotICAgIGZsYWdzKys7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIE1BSU4KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGZpbHRlciAqZmlsdGVycyA9IE5VTEw7Ci0gIGludCBpOwotICBpZiAoYXJnYyA8IDIpIHsKLSAgICBwcmludGYoIlVzYWdlOiBmaWx0ZXIgPGZsYWdzPiA8ZmlsdGVyPiAuLi5cbiIpOwotICAgIGV4aXQgKDEpOwotICB9Ci0gIC8qIGxvYWQgdGhlIGZpbHRlciB1cCAqLwotICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKSAKLSAgICBmaWx0ZXJzID0gbmV3X2ZpbHRlcihhcmd2W2ldLCBmaWx0ZXJzKTsKLSAgaWYgKGlzX2ZpbHRlcmVkX291dChhcmd2WzFdLCBmaWx0ZXJzKSkKLSAgICBwcmludGYoImZhaWxcbiIpOwotICBlbHNlCi0gICAgcHJpbnRmKCJwYXNzXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZmlsdGVyLmggYi9zaW0vcHBjL2ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTRmNzA0Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi10eXBlZGVmIHN0cnVjdCBfZmlsdGVyIGZpbHRlcjsKLQotCi0vKiBhcHBlbmQgdGhlIGZpbHRlciBvbnRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQotZXh0ZXJuIGZpbHRlciAqbmV3X2ZpbHRlcgotKGNvbnN0IGNoYXIgKmZpbHQsCi0gZmlsdGVyICpmaWx0ZXJzKTsKLQotCi0vKiByZXR1cm5zIHRydWUgaWYgdGhlIGZsYWdzIGFyZSBub24gZW1wdHkgYW5kIHNvbWUgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZmlsdGVyIGxpc3QgKi8KLQotZXh0ZXJuIGludCBpc19maWx0ZXJlZF9vdXQKLShjb25zdCBjaGFyICpmbGFncywKLSBmaWx0ZXIgKmZpbHRlcnMpOwotCi0vKiB0cnVlIGlmIHRoZSBmbGFnIGlzIGluIHRoZSBsaXN0ICovCi0KLWV4dGVybiBpbnQgaXRfaXMKLShjb25zdCBjaGFyICpmbGFnLAotIGNvbnN0IGNoYXIgKmZsYWdzKTsKLQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9maWx0ZXJfZmlsZW5hbWUuYyBiL3NpbS9wcGMvZmlsdGVyX2ZpbGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjJkN2EuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9maWx0ZXJfZmlsZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicHBjLWNvbmZpZy5oIgotI2luY2x1ZGUgImZpbHRlcl9maWxlbmFtZS5oIgotCi0vKiBTaG9ydGVuIHRyYWNlcyBieSBlbGltaW5hdGluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCB0byBmaWxlbmFtZXMuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKgotZmlsdGVyX2ZpbGVuYW1lIChjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZpbGVuYW1lOwotICBjb25zdCBjaGFyICpsYXN0ID0gZmlsZW5hbWU7Ci0gIGludCBjaDsKLQotICB3aGlsZSAoKGNoID0gKnArKykgIT0gJ1wwJyAmJiBjaCAhPSAnOicpCi0gICAgaWYgKGNoID09ICcvJykKLSAgICAgIGxhc3QgPSBwOwotCi0gIHJldHVybiBsYXN0OwotfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9maWx0ZXJfZmlsZW5hbWUuaCBiL3NpbS9wcGMvZmlsdGVyX2ZpbGVuYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGI0ZjIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9maWx0ZXJfZmlsZW5hbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0jaWZuZGVmIF9GSUxURVJfRklMRU5BTUVfSAotI2RlZmluZSBfRklMVEVSX0ZJTEVOQU1FX0gKLQotLyogUmVtb3ZlIGRpcmVjdG9yeSBwYXJ0IGZyb20gZmlsZW5hbWUgKi8KLWV4dGVybiBjb25zdCBjaGFyICoKLWZpbHRlcl9maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLWljYWNoZS5jIGIvc2ltL3BwYy9nZW4taWNhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNThhYjEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9nZW4taWNhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0KLSNpbmNsdWRlICJmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImxkLWRlY29kZS5oIgotI2luY2x1ZGUgImxkLWNhY2hlLmgiCi0jaW5jbHVkZSAibGQtaW5zbi5oIgotCi0jaW5jbHVkZSAiaWdlbi5oIgotCi0jaW5jbHVkZSAiZ2VuLXNlbWFudGljcy5oIgotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0jaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgotCi0KLQotc3RhdGljIHZvaWQKLXByaW50X2ljYWNoZV9mdW5jdGlvbl9oZWFkZXIobGYgKmZpbGUsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotCQkJICAgICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCQkgICAgIGludCBpc19mdW5jdGlvbl9kZWZpbml0aW9uKQotewotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgSUNBQ0hFX0ZVTkNUSU9OX1RZUEUsICJFWFRFUk5fSUNBQ0hFIiwgIiAiKTsKLSAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkgICAgICBiYXNlbmFtZSwKLQkJICAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiglcykiLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTsgCi0gIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLSAgICBsZl9wcmludGYoZmlsZSwgIjsiKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi0KLXZvaWQKLXByaW50X2ljYWNoZV9kZWNsYXJhdGlvbihpbnNuX3RhYmxlICplbnRyeSwKLQkJCSBsZiAqZmlsZSwKLQkJCSB2b2lkICpkYXRhLAotCQkJIGluc24gKmluc3RydWN0aW9uLAotCQkJIGludCBkZXB0aCkKLXsKLSAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykgewotICAgIEFTU0VSVChlbnRyeS0+bnJfaW5zbiA9PSAxKTsKLSAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyKGZpbGUsCi0JCQkJIGVudHJ5LT5pbnNucy0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCQkJIGVudHJ5LT5leHBhbmRlZF9iaXRzLAotCQkJCSAwLyogaXMgbm90IGZ1bmN0aW9uIGRlZmluaXRpb24gKi8pOwotICB9Ci0gIGVsc2UgewotICAgIHByaW50X2ljYWNoZV9mdW5jdGlvbl9oZWFkZXIoZmlsZSwKLQkJCQkgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkJCSBOVUxMLAotCQkJCSAwLyogaXMgbm90IGZ1bmN0aW9uIGRlZmluaXRpb24gKi8pOwotICB9Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24obGYgKmZpbGUsCi0JCQlpbnNuICppbnN0cnVjdGlvbiwKLQkJCWNvbnN0IGNoYXIgKmVudHJ5X25hbWUsCi0JCQljb25zdCBjaGFyICplbnRyeV90eXBlLAotCQkJY29uc3QgY2hhciAqZW50cnlfZXhwcmVzc2lvbiwKLQkJCWNvbnN0IGNoYXIgKm9yaWdpbmFsX25hbWUsCi0JCQljb25zdCBjaGFyICpmaWxlX25hbWUsCi0JCQlpbnQgbGluZV9uciwKLQkJCWluc25fZmllbGQgKmN1cl9maWVsZCwKLQkJCWluc25fYml0cyAqYml0cywKLQkJCWljYWNoZV9kZWNsX3R5cGUgd2hhdF90b19kZWNsYXJlLAotCQkJaWNhY2hlX2JvZHlfdHlwZSB3aGF0X3RvX2RvLAotCQkJY29uc3QgY2hhciAqcmVhc29uKQotewotICBjb25zdCBjaGFyICpleHByZXNzaW9uOwotICBBU1NFUlQoZW50cnlfbmFtZSAhPSBOVUxMKTsKLQotICAvKiBEZWZpbmUgYSBzdG9yYWdlIGFyZWEgZm9yIHRoZSBjYWNoZSBlbGVtZW50ICovCi0gIGlmICh3aGF0X3RvX2RlY2xhcmUgPT0gdW5kZWZfdmFyaWFibGVzKSB7Ci0gICAgLyogV2UndmUgZmluaXNoZWQgd2l0aCB0aGUgdmFsdWUgLSBkZXN0b3J5IGl0ICovCi0gICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiI3VuZGVmICVzXG4iLCBlbnRyeV9uYW1lKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZWxzZSBpZiAod2hhdF90b19kZWNsYXJlID09IGRlZmluZV92YXJpYWJsZXMpIHsKLSAgICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lICVzICIsIGVudHJ5X25hbWUpOwotICB9Ci0gIGVsc2UgewotICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKLSAgICAgIGxmX3ByaW50X19leHRlcm5hbF9yZWZlcmVuY2UoZmlsZSwgbGluZV9uciwgZmlsZV9uYW1lKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiVzIGNvbnN0ICVzIFVOVVNFRCA9ICIsCi0JICAgICAgZW50cnlfdHlwZSA9PSBOVUxMID8gInVuc2lnbmVkIiA6IGVudHJ5X3R5cGUsCi0JICAgICAgZW50cnlfbmFtZSk7Ci0gIH0KLQotICAvKiBkZWZpbmUgYSB2YWx1ZSBmb3IgdGhhdCBzdG9yYWdlIGFyZWEgYXMgZGV0ZXJtaW5lZCBieSB3aGF0IGlzIGluCi0gICAgIHRoZSBjYWNoZSAqLwotICBpZiAoYml0cyAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAoZW50cnlfbmFtZSwgY3VyX2ZpZWxkLT52YWxfc3RyaW5nKSA9PSAwCi0gICAgICAmJiAoKGJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbiAmJiBiaXRzLT52YWx1ZSA9PSAwKQotCSAgfHwgKCFiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pKSkgewotICAgIC8qIFRoZSBzaW1wbGUgZmllbGQgaGFzIGJlZW4gbWFkZSBjb25zdGFudCAoYXMgYSByZXN1bHQgb2YKLSAgICAgICBleHBhbmRpbmcgaW5zdHJ1Y3Rpb25zIG9yIHNpbWlsYXIpLiAgUmVtZW1iZXIgdGhhdCBmb3IgYQotICAgICAgIGJvb2xlYW4gZmllbGQsIHZhbHVlIGlzIGVpdGhlciAwIChpbXBseWluZyB0aGUgcmVxdWlyZWQKLSAgICAgICBib29sZWFuX2NvbnN0YW50KSBvciBub256ZXJvIChpbXBseWluZyBzb21lIG90aGVyIHZhbHVlIGFuZAotICAgICAgIGhhbmRsZWQgbGF0ZXIgYmVsb3cpIC0gRGVmaW5lIHRoZSB2YXJpYWJsZSBhY2NvcmRpbmdseSAqLwotICAgIGV4cHJlc3Npb24gPSAiY29uc3RhbnQgZmllbGQiOwotICAgIEFTU0VSVChiaXRzLT5maWVsZCA9PSBjdXJfZmllbGQpOwotICAgIEFTU0VSVChlbnRyeV90eXBlID09IE5VTEwpOwotICAgIGlmIChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pCi0gICAgICBsZl9wcmludGYoZmlsZSwgIiVkIiwgYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KTsKLSAgICBlbHNlIGlmIChiaXRzLT5vcGNvZGUtPmxhc3QgPCBiaXRzLT5maWVsZC0+bGFzdCkKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiJWQiLAotCQliaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKTsKLSAgICBlbHNlCi0gICAgICBsZl9wcmludGYoZmlsZSwgIiVkIiwgYml0cy0+dmFsdWUpOwotICB9Ci0gIGVsc2UgaWYgKGJpdHMgIT0gTlVMTAotCSAgICYmIG9yaWdpbmFsX25hbWUgIT0gTlVMTAotCSAgICYmIHN0cm5jbXAoZW50cnlfbmFtZSwKLQkJICAgICAgb3JpZ2luYWxfbmFtZSwgc3RybGVuKG9yaWdpbmFsX25hbWUpKSA9PSAwCi0JICAgJiYgc3RybmNtcChlbnRyeV9uYW1lICsgc3RybGVuKG9yaWdpbmFsX25hbWUpLAotCQkgICAgICAiX2lzXyIsIHN0cmxlbigiX2lzXyIpKSA9PSAwCi0JICAgJiYgKChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQkJJiYgKGF0b2woZW50cnlfbmFtZSArIHN0cmxlbihvcmlnaW5hbF9uYW1lKSArIHN0cmxlbigiX2lzXyIpKQotCQkgICAgPT0gYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KSkKLQkgICAgICAgfHwgKCFiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pKSkgewotICAgIGV4cHJlc3Npb24gPSAiY29uc3RhbnQgY29tcGFyZSI7Ci0gICAgLyogQW4gZW50cnksIGRlcml2ZWQgZnJvbSBPUklHSU5BTF9OQU1FLCBpcyB0ZXN0aW5nIHRvIHNlZSBvZiB0aGUKLSAgICAgICBPUklHSU5BTF9OQU1FIGhhcyBhIHNwZWNpZmljIGNvbnN0YW50IHZhbHVlLiAgVGhhdCB2YWx1ZQotICAgICAgIG1hdGNoaW5nIGEgYm9vbGVhbiBvciBjb25zdGFudCBmaWVsZCAqLwotICAgIGlmIChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pCi0gICAgICBsZl9wcmludGYoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKLQkJYml0cy0+dmFsdWUgPT0gMCwKLQkJb3JpZ2luYWxfbmFtZSwKLQkJYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KTsKLSAgICBlbHNlIGlmIChiaXRzLT5vcGNvZGUtPmxhc3QgPCBiaXRzLT5maWVsZC0+bGFzdCkKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiJWQgLyogJXMgPT0gJWQgKi8iLAotCQkoYXRvbChlbnRyeV9uYW1lICsgc3RybGVuKG9yaWdpbmFsX25hbWUpICsgc3RybGVuKCJfaXNfIikpCi0JCSA9PSAoYml0cy0+dmFsdWUgPDwgKGJpdHMtPmZpZWxkLT5sYXN0IC0gYml0cy0+b3Bjb2RlLT5sYXN0KSkpLAotCQlvcmlnaW5hbF9uYW1lLAotCQkoYml0cy0+dmFsdWUgPDwgKGJpdHMtPmZpZWxkLT5sYXN0IC0gYml0cy0+b3Bjb2RlLT5sYXN0KSkpOwotICAgIGVsc2UKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiJWQgLyogJXMgPT0gJWQgKi8iLAotCQkoYXRvbChlbnRyeV9uYW1lICsgc3RybGVuKG9yaWdpbmFsX25hbWUpICsgc3RybGVuKCJfaXNfIikpCi0JCSA9PSBiaXRzLT52YWx1ZSksCi0JCW9yaWdpbmFsX25hbWUsCi0JCWJpdHMtPnZhbHVlKTsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBwdXQgdGhlIGZpZWxkIGluIHRoZSBsb2NhbCB2YXJpYWJsZSwgcG9zc2libHkgYWxzbyBlbnRlciBpdAotICAgICAgIGludG8gdGhlIGNhY2hlICovCi0gICAgZXhwcmVzc2lvbiA9ICJleHRyYWN0aW9uIjsKLSAgICAvKiBoYW5kbGUgdGhlIGNhY2hlICovCi0gICAgaWYgKCh3aGF0X3RvX2RvICYgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSkKLQl8fCAod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKSkgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICJjYWNoZV9lbnRyeS0+Y3JhY2suJXMuJXMiLAotCQlpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZm9ybV0sCi0JCWVudHJ5X25hbWUpOwotICAgICAgaWYgKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkgLyogYWxzbyBwdXQgaXQgaW4gdGhlIGNhY2hlPyAqLwotCWxmX3ByaW50ZihmaWxlLCAiID0gIik7Ci0gICAgfQotICAgIGlmICgod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKQotCXx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpIHsKLSAgICAgIGlmIChjdXJfZmllbGQgIT0gTlVMTCAmJiBzdHJjbXAoZW50cnlfbmFtZSwgY3VyX2ZpZWxkLT52YWxfc3RyaW5nKSA9PSAwKQotCWxmX3ByaW50ZihmaWxlLCAiRVhUUkFDVEVEMzIoaW5zdHJ1Y3Rpb24sICVkLCAlZCkiLAotCQkgIGkydGFyZ2V0KGhpX2JpdF9uciwgY3VyX2ZpZWxkLT5maXJzdCksCi0JCSAgaTJ0YXJnZXQoaGlfYml0X25yLCBjdXJfZmllbGQtPmxhc3QpKTsKLSAgICAgIGVsc2UgaWYgKGVudHJ5X2V4cHJlc3Npb24gIT0gTlVMTCkKLQlsZl9wcmludGYoZmlsZSwgIiVzIiwgZW50cnlfZXhwcmVzc2lvbik7Ci0gICAgICBlbHNlCi0JbGZfcHJpbnRmKGZpbGUsICJldmFsXyVzIiwgZW50cnlfbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCEoKHdoYXRfdG9fZGVjbGFyZSA9PSBkZWZpbmVfdmFyaWFibGVzKQotCXx8ICh3aGF0X3RvX2RlY2xhcmUgPT0gdW5kZWZfdmFyaWFibGVzKSkpCi0gICAgbGZfcHJpbnRmKGZpbGUsICI7Iik7Ci0gIGlmIChyZWFzb24gIT0gTlVMTCkKLSAgICBsZl9wcmludGYoZmlsZSwgIiAvKiAlcyAtICVzICovIiwgcmVhc29uLCBleHByZXNzaW9uKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi0KLXZvaWQKLXByaW50X2ljYWNoZV9ib2R5KGxmICpmaWxlLAotCQkgIGluc24gKmluc3RydWN0aW9uLAotCQkgIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKLQkJICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMsCi0JCSAgaWNhY2hlX2RlY2xfdHlwZSB3aGF0X3RvX2RlY2xhcmUsCi0JCSAgaWNhY2hlX2JvZHlfdHlwZSB3aGF0X3RvX2RvKQotewotICBpbnNuX2ZpZWxkICpjdXJfZmllbGQ7Ci0gIAotICAvKiBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcyAqLwotICBsZl9wcmludGYoZmlsZSwgIi8qIGV4dHJhY3Rpb246ICVzICIsCi0JICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mb3JtYXRdKTsKLSAgc3dpdGNoICh3aGF0X3RvX2RlY2xhcmUpIHsKLSAgY2FzZSBkZWZpbmVfdmFyaWFibGVzOgotICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSIpOwotICAgIGJyZWFrOwotICBjYXNlIGRlY2xhcmVfdmFyaWFibGVzOgotICAgIGxmX3ByaW50ZihmaWxlLCAiZGVjbGFyZSIpOwotICAgIGJyZWFrOwotICBjYXNlIHVuZGVmX3ZhcmlhYmxlczoKLSAgICBsZl9wcmludGYoZmlsZSwgIiN1bmRlZiIpOwotICAgIGJyZWFrOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiICIpOwotICBzd2l0Y2ggKHdoYXRfdG9fZG8pIHsKLSAgY2FzZSBnZXRfdmFsdWVzX2Zyb21faWNhY2hlOgotICAgIGxmX3ByaW50ZihmaWxlLCAiZ2V0LXZhbHVlcy1mcm9tLWljYWNoZSIpOwotICAgIGJyZWFrOwotICBjYXNlIHB1dF92YWx1ZXNfaW5faWNhY2hlOgotICAgIGxmX3ByaW50ZihmaWxlLCAicHV0LXZhbHVlcy1pbi1pY2FjaGUiKTsKLSAgICBicmVhazsKLSAgY2FzZSBib3RoX3ZhbHVlc19hbmRfaWNhY2hlOgotICAgIGxmX3ByaW50ZihmaWxlLCAiZ2V0LXZhbHVlcy1mcm9tLWljYWNoZXxwdXQtdmFsdWVzLWluLWljYWNoZSIpOwotICAgIGJyZWFrOwotICBjYXNlIGRvX25vdF91c2VfaWNhY2hlOgotICAgIGxmX3ByaW50ZihmaWxlLCAiZG8tbm90LXVzZS1pY2FjaGUiKTsKLSAgICBicmVhazsKLSAgfQotICBsZl9wcmludGYoZmlsZSwgIiAqL1xuIik7Ci0gIAotICBmb3IgKGN1cl9maWVsZCA9IGluc3RydWN0aW9uLT5maWVsZHMtPmZpcnN0OwotICAgICAgIGN1cl9maWVsZC0+Zmlyc3QgPCBpbnNuX2JpdF9zaXplOwotICAgICAgIGN1cl9maWVsZCA9IGN1cl9maWVsZC0+bmV4dCkgewotICAgIGlmIChjdXJfZmllbGQtPmlzX3N0cmluZykgewotICAgICAgaW5zbl9iaXRzICpiaXRzOwotICAgICAgaW50IGZvdW5kX3J1bGUgPSAwOwotICAgICAgLyogZmluZCBhbnkgY29ycmVzcG9uZGluZyB2YWx1ZSAqLwotICAgICAgZm9yIChiaXRzID0gZXhwYW5kZWRfYml0czsKLQkgICBiaXRzICE9IE5VTEw7Ci0JICAgYml0cyA9IGJpdHMtPmxhc3QpIHsKLQlpZiAoYml0cy0+ZmllbGQgPT0gY3VyX2ZpZWxkKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvKiB0cnkgdGhlIGNhY2hlIHJ1bGUgdGFibGUgZm9yIHdoYXQgdG8gZG8gKi8KLSAgICAgIHsKLQljYWNoZV90YWJsZSAqY2FjaGVfcnVsZTsKLQlmb3IgKGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlczsKLQkgICAgIGNhY2hlX3J1bGUgIT0gTlVMTDsKLQkgICAgIGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlLT5uZXh0KSB7Ci0JICBpZiAoc3RyY21wKGN1cl9maWVsZC0+dmFsX3N0cmluZywgY2FjaGVfcnVsZS0+ZmllbGRfbmFtZSkgPT0gMCkgewotCSAgICBmb3VuZF9ydWxlID0gMTsKLQkgICAgaWYgKGNhY2hlX3J1bGUtPnR5cGUgPT0gc2NyYXRjaF92YWx1ZQotCQkmJiAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKLQkJICAgIHx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpKQotCSAgICAgIHByaW50X2ljYWNoZV9leHRyYWN0aW9uKGZpbGUsCi0JCQkJICAgICAgaW5zdHJ1Y3Rpb24sCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+ZGVyaXZlZF9uYW1lLAotCQkJCSAgICAgIGNhY2hlX3J1bGUtPnR5cGVfZGVmLAotCQkJCSAgICAgIGNhY2hlX3J1bGUtPmV4cHJlc3Npb24sCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+ZmllbGRfbmFtZSwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5maWxlX2VudHJ5LT5maWxlX25hbWUsCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+ZmlsZV9lbnRyeS0+bGluZV9uciwKLQkJCQkgICAgICBjdXJfZmllbGQsCi0JCQkJICAgICAgYml0cywKLQkJCQkgICAgICB3aGF0X3RvX2RlY2xhcmUsCi0JCQkJICAgICAgZG9fbm90X3VzZV9pY2FjaGUsCi0JCQkJICAgICAgImljYWNoZSBzY3JhdGNoIik7Ci0JICAgIGVsc2UgaWYgKGNhY2hlX3J1bGUtPnR5cGUgPT0gY29tcHV0ZV92YWx1ZQotCQkgICAgICYmICgod2hhdF90b19kbyAmIGdldF92YWx1ZXNfZnJvbV9pY2FjaGUpCi0JCQkgfHwgd2hhdF90b19kbyA9PSBkb19ub3RfdXNlX2ljYWNoZSkpCi0JICAgICAgcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24oZmlsZSwKLQkJCQkgICAgICBpbnN0cnVjdGlvbiwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5kZXJpdmVkX25hbWUsCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+dHlwZV9kZWYsCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+ZXhwcmVzc2lvbiwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5maWVsZF9uYW1lLAotCQkJCSAgICAgIGNhY2hlX3J1bGUtPmZpbGVfZW50cnktPmZpbGVfbmFtZSwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5maWxlX2VudHJ5LT5saW5lX25yLAotCQkJCSAgICAgIGN1cl9maWVsZCwKLQkJCQkgICAgICBiaXRzLAotCQkJCSAgICAgIHdoYXRfdG9fZGVjbGFyZSwKLQkJCQkgICAgICBkb19ub3RfdXNlX2ljYWNoZSwKLQkJCQkgICAgICAic2VtYW50aWMgY29tcHV0ZSIpOwotCSAgICBlbHNlIGlmIChjYWNoZV9ydWxlLT50eXBlID09IGNhY2hlX3ZhbHVlCi0JCSAgICAgJiYgKCh3aGF0X3RvX2RlY2xhcmUgIT0gdW5kZWZfdmFyaWFibGVzKQotCQkJIHx8ICEod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKSkpCi0JICAgICAgcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24oZmlsZSwKLQkJCQkgICAgICBpbnN0cnVjdGlvbiwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5kZXJpdmVkX25hbWUsCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+dHlwZV9kZWYsCi0JCQkJICAgICAgY2FjaGVfcnVsZS0+ZXhwcmVzc2lvbiwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5maWVsZF9uYW1lLAotCQkJCSAgICAgIGNhY2hlX3J1bGUtPmZpbGVfZW50cnktPmZpbGVfbmFtZSwKLQkJCQkgICAgICBjYWNoZV9ydWxlLT5maWxlX2VudHJ5LT5saW5lX25yLAotCQkJCSAgICAgIGN1cl9maWVsZCwKLQkJCQkgICAgICBiaXRzLAotCQkJCSAgICAgICgod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKQotCQkJCSAgICAgICA/IGRlY2xhcmVfdmFyaWFibGVzCi0JCQkJICAgICAgIDogd2hhdF90b19kZWNsYXJlKSwKLQkJCQkgICAgICB3aGF0X3RvX2RvLAotCQkJCSAgICAgICJpbiBpY2FjaGUiKTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAvKiBObyBydWxlIGF0IGFsbCwgYXNzdW1lIHRoYXQgdGhpcyBpcyBuZWVkZWQgaW4gdGhlIHNlbWFudGljCi0gICAgICAgICBmdW5jdGlvbiAod2hlbiB2YWx1ZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBpY2FjaGUpIGFuZAotICAgICAgICAgaGVuY2UgbXVzdCBiZSBwdXQgaW50byB0aGUgY2FjaGUgKi8KLSAgICAgIGlmIChmb3VuZF9ydWxlID09IDAKLQkgICYmICgod2hhdF90b19kZWNsYXJlICE9IHVuZGVmX3ZhcmlhYmxlcykKLQkgICAgICB8fCAhKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpKQotCXByaW50X2ljYWNoZV9leHRyYWN0aW9uKGZpbGUsCi0JCQkJaW5zdHJ1Y3Rpb24sCi0JCQkJY3VyX2ZpZWxkLT52YWxfc3RyaW5nLAotCQkJCU5VTEwsIE5VTEwsIE5VTEwsIC8qIHR5cGUsIGV4cCwgb3JpZyAqLwotCQkJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWxlX25hbWUsCi0JCQkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmxpbmVfbnIsCi0JCQkJY3VyX2ZpZWxkLAotCQkJCWJpdHMsCi0JCQkJKCh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpCi0JCQkJID8gZGVjbGFyZV92YXJpYWJsZXMKLQkJCQkgOiB3aGF0X3RvX2RlY2xhcmUpLAotCQkJCXdoYXRfdG9fZG8sCi0JCQkJImRlZmF1bHQgaW4gaWNhY2hlIik7Ci0gICAgICAvKiBhbnkgdGhpbmcgZWxzZSAuLi4gKi8KLSAgICB9Ci0gIH0KLQotICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOwotCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaW5zbl9pbl9pY2FjaGUpKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIHByaW50X2ljYWNoZV9leHRyYWN0aW9uKGZpbGUsCi0JCQkgICAgaW5zdHJ1Y3Rpb24sCi0JCQkgICAgImluc24iLAotCQkJICAgICJpbnN0cnVjdGlvbl93b3JkIiwKLQkJCSAgICAiaW5zdHJ1Y3Rpb24iLAotCQkJICAgIE5VTEwsIC8qIG9yaWdpbiAqLwotCQkJICAgIE5VTEwsIDAsIC8qIGZpbGVfbmFtZSAmIGxpbmVfbnIgKi8KLQkJCSAgICBOVUxMLCBOVUxMLAotCQkJICAgIHdoYXRfdG9fZGVjbGFyZSwKLQkJCSAgICB3aGF0X3RvX2RvLAotCQkJICAgIE5VTEwpOwotICB9Ci19Ci0KLQotCi10eXBlZGVmIHN0cnVjdCBfaWNhY2hlX3RyZWUgaWNhY2hlX3RyZWU7Ci1zdHJ1Y3QgX2ljYWNoZV90cmVlIHsKLSAgY2hhciAqbmFtZTsKLSAgaWNhY2hlX3RyZWUgKm5leHQ7Ci0gIGljYWNoZV90cmVlICpjaGlsZHJlbjsKLX07Ci0KLXN0YXRpYyBpY2FjaGVfdHJlZSAqCi1pY2FjaGVfdHJlZV9pbnNlcnQoaWNhY2hlX3RyZWUgKnRyZWUsCi0JCSAgIGNoYXIgKm5hbWUpCi17Ci0gIGljYWNoZV90cmVlICpuZXdfdHJlZTsKLSAgLyogZmluZCBpdCAqLwotICBpY2FjaGVfdHJlZSAqKnB0cl90b19jdXJfdHJlZSA9ICZ0cmVlLT5jaGlsZHJlbjsKLSAgaWNhY2hlX3RyZWUgKmN1cl90cmVlID0gKnB0cl90b19jdXJfdHJlZTsKLSAgd2hpbGUgKGN1cl90cmVlICE9IE5VTEwKLQkgJiYgc3RyY21wKGN1cl90cmVlLT5uYW1lLCBuYW1lKSA8IDApIHsKLSAgICBwdHJfdG9fY3VyX3RyZWUgPSAmY3VyX3RyZWUtPm5leHQ7Ci0gICAgY3VyX3RyZWUgPSAqcHRyX3RvX2N1cl90cmVlOwotICB9Ci0gIEFTU0VSVChjdXJfdHJlZSA9PSBOVUxMCi0JIHx8IHN0cmNtcChjdXJfdHJlZS0+bmFtZSwgbmFtZSkgPj0gMCk7Ci0gIC8qIGFscmVhZHkgaW4gdGhlIHRyZWUgKi8KLSAgaWYgKGN1cl90cmVlICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcChjdXJfdHJlZS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gY3VyX3RyZWU7Ci0gIC8qIG1pc3NpbmcsIGluc2VydCBpdCAqLwotICBBU1NFUlQoY3VyX3RyZWUgPT0gTlVMTAotCSB8fCBzdHJjbXAoY3VyX3RyZWUtPm5hbWUsIG5hbWUpID4gMCk7Ci0gIG5ld190cmVlID0gWkFMTE9DKGljYWNoZV90cmVlKTsKLSAgbmV3X3RyZWUtPm5hbWUgPSBuYW1lOwotICBuZXdfdHJlZS0+bmV4dCA9IGN1cl90cmVlOwotICAqcHRyX3RvX2N1cl90cmVlID0gbmV3X3RyZWU7Ci0gIHJldHVybiBuZXdfdHJlZTsKLX0KLQotCi1zdGF0aWMgaWNhY2hlX3RyZWUgKgotaW5zbl90YWJsZV9jYWNoZV9maWVsZHMoaW5zbl90YWJsZSAqdGFibGUpCi17Ci0gIGljYWNoZV90cmVlICp0cmVlID0gWkFMTE9DKGljYWNoZV90cmVlKTsKLSAgaW5zbiAqaW5zdHJ1Y3Rpb247Ci0gIGZvciAoaW5zdHJ1Y3Rpb24gPSB0YWJsZS0+aW5zbnM7Ci0gICAgICAgaW5zdHJ1Y3Rpb24gIT0gTlVMTDsKLSAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLT5uZXh0KSB7Ci0gICAgaW5zbl9maWVsZCAqZmllbGQ7Ci0gICAgaWNhY2hlX3RyZWUgKmZvcm0gPQotICAgICAgaWNhY2hlX3RyZWVfaW5zZXJ0KHRyZWUsCi0JCQkgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2Zvcm1dKTsKLSAgICBmb3IgKGZpZWxkID0gaW5zdHJ1Y3Rpb24tPmZpZWxkcy0+Zmlyc3Q7Ci0JIGZpZWxkICE9IE5VTEw7Ci0JIGZpZWxkID0gZmllbGQtPm5leHQpIHsKLSAgICAgIGlmIChmaWVsZC0+aXNfc3RyaW5nKQotCWljYWNoZV90cmVlX2luc2VydChmb3JtLCBmaWVsZC0+dmFsX3N0cmluZyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cmVlOwotfQotCi0KLQotZXh0ZXJuIHZvaWQKLXByaW50X2ljYWNoZV9zdHJ1Y3QoaW5zbl90YWJsZSAqaW5zdHJ1Y3Rpb25zLAotCQkgICAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzLAotCQkgICAgbGYgKmZpbGUpCi17Ci0gIGljYWNoZV90cmVlICp0cmVlID0gaW5zbl90YWJsZV9jYWNoZV9maWVsZHMoaW5zdHJ1Y3Rpb25zKTsKLSAgCi0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIFdJVEhfSURFQ09ERV9DQUNIRV9TSVpFICVkXG4iLAotCSAgICAoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSA/IGljYWNoZV9zaXplIDogMCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgCi0gIC8qIGNyZWF0ZSBhbiBpbnN0cnVjdGlvbiBjYWNoZSBpZiBiZWluZyB1c2VkICovCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGljYWNoZV90cmVlICpmb3JtOwotICAgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgX2lkZWNvZGVfY2FjaGUge1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcztcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICB2b2lkICpzZW1hbnRpYztcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICB1bmlvbiB7XG4iKTsKLSAgICBmb3IgKGZvcm0gPSB0cmVlLT5jaGlsZHJlbjsKLQkgZm9ybSAhPSBOVUxMOwotCSBmb3JtID0gZm9ybS0+bmV4dCkgewotICAgICAgaWNhY2hlX3RyZWUgKmZpZWxkOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgc3RydWN0IHtcbiIpOwotICAgICAgaWYgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2luc25faW5faWNhY2hlKQotCWxmX3ByaW50ZihmaWxlLCAiICAgICAgaW5zdHJ1Y3Rpb25fd29yZCBpbnNuO1xuIik7Ci0gICAgICBmb3IgKGZpZWxkID0gZm9ybS0+Y2hpbGRyZW47Ci0JICAgZmllbGQgIT0gTlVMTDsKLQkgICBmaWVsZCA9IGZpZWxkLT5uZXh0KSB7Ci0JY2FjaGVfdGFibGUgKmNhY2hlX3J1bGU7Ci0JaW50IGZvdW5kX3J1bGUgPSAwOwotCWZvciAoY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGVzOwotCSAgICAgY2FjaGVfcnVsZSAhPSBOVUxMOwotCSAgICAgY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGUtPm5leHQpIHsKLQkgIGlmIChzdHJjbXAoZmllbGQtPm5hbWUsIGNhY2hlX3J1bGUtPmZpZWxkX25hbWUpID09IDApIHsKLQkgICAgZm91bmRfcnVsZSA9IDE7Ci0JICAgIGlmIChjYWNoZV9ydWxlLT5kZXJpdmVkX25hbWUgIT0gTlVMTCkKLQkgICAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICVzICVzOyAvKiAlcyAqL1xuIiwKLQkJCShjYWNoZV9ydWxlLT50eXBlX2RlZiA9PSBOVUxMCi0JCQkgPyAidW5zaWduZWQiIAotCQkJIDogY2FjaGVfcnVsZS0+dHlwZV9kZWYpLAotCQkJY2FjaGVfcnVsZS0+ZGVyaXZlZF9uYW1lLAotCQkJY2FjaGVfcnVsZS0+ZmllbGRfbmFtZSk7Ci0JICB9Ci0JfQotCWlmICghZm91bmRfcnVsZSkKLQkgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgdW5zaWduZWQgJXM7XG4iLCBmaWVsZC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiAgICB9ICVzO1xuIiwgZm9ybS0+bmFtZSk7Ci0gICAgfQotICAgIGxmX3ByaW50ZihmaWxlLCAiICB9IGNyYWNrO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9IGlkZWNvZGVfY2FjaGU7XG4iKTsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBhbGVybmF0aXZseSwgc2luY2Ugbm8gY2FjaGUsIGVtaXQgYSBkdW1teSBkZWZpbml0aW9uIGZvcgotICAgICAgIGlkZWNvZGVfY2FjaGUgc28gdGhhdCBjb2RlIHJlZmVyaW5nIHRvIHRoZSB0eXBlIGNhbiBzdGlsbCBjb21waWxlICovCi0gICAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHZvaWQgaWRlY29kZV9jYWNoZTtcbiIpOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pY2FjaGVfZnVuY3Rpb24obGYgKmZpbGUsCi0JCSAgICAgIGluc24gKmluc3RydWN0aW9uLAotCQkgICAgICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSAgICAgIG9wY29kZV9maWVsZCAqb3Bjb2RlcywKLQkJICAgICAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQotewotICBpbnQgaW5kZW50OwotCi0gIC8qIGdlbmVyYXRlIGNvZGUgdG8gZW50ZXIgZGVjb2RlZCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBpY2FjaGUgKi8KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIElDQUNIRV9GVU5DVElPTl9UWVBFLCAiRVhURVJOX0lDQUNIRSIsICJcbiIpOwotICBpbmRlbnQgPSBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCi0JCQkgICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKLSAgbGZfaW5kZW50KGZpbGUsICtpbmRlbnQpOwotICBsZl9wcmludGYoZmlsZSwgIiglcylcbiIsIElDQUNIRV9GVU5DVElPTl9GT1JNQUwpOwotICBsZl9pbmRlbnQoZmlsZSwgLWluZGVudCk7Ci0gIAotICAvKiBmdW5jdGlvbiBoZWFkZXIgKi8KLSAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgCi0gIHByaW50X215X2RlZmluZXMoZmlsZSwgZXhwYW5kZWRfYml0cywgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnkpOwotICBwcmludF9pdHJhY2UoZmlsZSwgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnksIDEvKnB1dHRpbmctdmFsdWUtaW4tY2FjaGUqLyk7Ci0gIAotICBwcmludF9pZGVjb2RlX3ZhbGlkYXRlKGZpbGUsIGluc3RydWN0aW9uLCBvcGNvZGVzKTsKLSAgCi0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKQotICAgIGxmX3ByaW50ZihmaWxlLCAidW5zaWduZWRfd29yZCBuaWE7XG4iKTsKLSAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKLQkJICAgIGluc3RydWN0aW9uLAotCQkgICAgZXhwYW5kZWRfYml0cywKLQkJICAgIGNhY2hlX3J1bGVzLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzKQotCQkgICAgID8gZGVmaW5lX3ZhcmlhYmxlcwotCQkgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpCi0JCSAgICAgPyBib3RoX3ZhbHVlc19hbmRfaWNhY2hlCi0JCSAgICAgOiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpOwotICAKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgImNhY2hlX2VudHJ5LT5hZGRyZXNzID0gY2lhO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiY2FjaGVfZW50cnktPnNlbWFudGljID0gIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIvKiBzZW1hbnRpYyByb3V0aW5lICovXG4iKTsKLSAgICBwcmludF9zZW1hbnRpY19ib2R5KGZpbGUsCi0JCQlpbnN0cnVjdGlvbiwKLQkJCWV4cGFuZGVkX2JpdHMsCi0JCQlvcGNvZGVzKTsKLSAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiBuaWE7XG4iKTsKLSAgfQotICAKLSAgaWYgKCEoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiLyogcmV0dXJuIHRoZSBmdW5jdGlvbiBwcm9wZXIgKi9cbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuICIpOwotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCWV4cGFuZGVkX2JpdHMsCi0JCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiO1xuIik7Ci0gIH0KLSAgCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcykpCi0gICAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKLQkJICAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgIGNhY2hlX3J1bGVzLAotCQkgICAgICB1bmRlZl92YXJpYWJsZXMsCi0JCSAgICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKQotCQkgICAgICAgPyBib3RoX3ZhbHVlc19hbmRfaWNhY2hlCi0JCSAgICAgICA6IHB1dF92YWx1ZXNfaW5faWNhY2hlKSk7Ci0KLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLX0KLQotCi12b2lkCi1wcmludF9pY2FjaGVfZGVmaW5pdGlvbihpbnNuX3RhYmxlICplbnRyeSwKLQkJCWxmICpmaWxlLAotCQkJdm9pZCAqZGF0YSwKLQkJCWluc24gKmluc3RydWN0aW9uLAotCQkJaW50IGRlcHRoKQotewotICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMgPSAoY2FjaGVfdGFibGUqKWRhdGE7Ci0gIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpIHsKLSAgICBBU1NFUlQoZW50cnktPm5yX2luc24gPT0gMQotCSAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAotCSAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAotCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKLSAgICBBU1NFUlQoZW50cnktPm5yX2luc24gPT0gMQotCSAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAotCSAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAotCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMCi0JICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUgIT0gTlVMTCk7Ci0gICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uKGZpbGUsCi0JCQkgIGVudHJ5LT5pbnNucywKLQkJCSAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkgIGVudHJ5LT5vcGNvZGUsCi0JCQkgIGNhY2hlX3J1bGVzKTsKLSAgfQotICBlbHNlIHsKLSAgICBwcmludF9pY2FjaGVfZnVuY3Rpb24oZmlsZSwKLQkJCSAgaW5zdHJ1Y3Rpb24sCi0JCQkgIE5VTEwsCi0JCQkgIE5VTEwsCi0JCQkgIGNhY2hlX3J1bGVzKTsKLSAgfQotfQotCi0KLQotdm9pZAotcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKGluc25fdGFibGUgKnRhYmxlLAotCQkJCQkgICBsZiAqZmlsZSwKLQkJCQkJICAgdm9pZCAqZGF0YSwKLQkJCQkJICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uKQotewotICBBU1NFUlQoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgIT0gMCk7Ci0gIGlmIChpdF9pcygiaW50ZXJuYWwiLCBmdW5jdGlvbi0+ZmllbGRzW2luc25fZmxhZ3NdKSkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIElDQUNIRV9GVU5DVElPTl9UWVBFLCAiSU5MSU5FX0lDQUNIRSIsCi0JCQkgICAiXG4iKTsKLSAgICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCi0JCQlmdW5jdGlvbi0+ZmllbGRzW2luc25fbmFtZV0sCi0JCQlOVUxMLAotCQkJZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuKCVzKTtcbiIsIElDQUNIRV9GVU5DVElPTl9GT1JNQUwpOwotICB9Ci19Ci0KLQotdm9pZAotcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlZmluaXRpb24oaW5zbl90YWJsZSAqdGFibGUsCi0JCQkJCSAgbGYgKmZpbGUsCi0JCQkJCSAgdm9pZCAqZGF0YSwKLQkJCQkJICB0YWJsZV9lbnRyeSAqZnVuY3Rpb24pCi17Ci0gIEFTU0VSVCgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSAhPSAwKTsKLSAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgSUNBQ0hFX0ZVTkNUSU9OX1RZUEUsICJJTkxJTkVfSUNBQ0hFIiwKLQkJCSAgICJcbiIpOwotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWZ1bmN0aW9uLT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCU5VTEwsCi0JCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4oJXMpXG4iLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIvKiBzZW1hbnRpYyByb3V0aW5lICovXG4iKTsKLSAgICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBmdW5jdGlvbik7Ci0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7Ci0gICAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGZ1bmN0aW9uLT5hbm5leCk7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgImVycm9yKFwiSW50ZXJuYWwgZnVuY3Rpb24gbXVzdCBsb25nanVtcFxcblwiKTtcbiIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJyZXR1cm4gMDtcbiIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuICIpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkJICBmdW5jdGlvbi0+ZmllbGRzW2luc25fbmFtZV0sCi0JCQkgIE5VTEwsCi0JCQkgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOwotICAgIH0KLSAgICAKLSAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOwotICAgIGxmX2luZGVudChmaWxlLCAtMik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taWNhY2hlLmggYi9zaW0vcHBjL2dlbi1pY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ZTBlMS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2dlbi1pY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotCi0vKiBPdXRwdXQgY29kZSB0byBtYW5pcHVsYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZTogZWl0aGVyIGNyZWF0ZSBpdAotICAgb3IgcmVmZXJlbmNlIGl0ICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGRlY2xhcmVfdmFyaWFibGVzLAotICBkZWZpbmVfdmFyaWFibGVzLAotICB1bmRlZl92YXJpYWJsZXMsCi19IGljYWNoZV9kZWNsX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGRvX25vdF91c2VfaWNhY2hlID0gMCwKLSAgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSA9IDB4MSwKLSAgcHV0X3ZhbHVlc19pbl9pY2FjaGUgPSAweDIsCi0gIGJvdGhfdmFsdWVzX2FuZF9pY2FjaGUgPSAweDMsCi19IGljYWNoZV9ib2R5X3R5cGU7Ci0KLWV4dGVybiB2b2lkIHByaW50X2ljYWNoZV9ib2R5Ci0obGYgKmZpbGUsCi0gaW5zbiAqaW5zdHJ1Y3Rpb24sCi0gaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAotIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcywKLSBpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKLSBpY2FjaGVfYm9keV90eXBlIHdoYXRfdG9fZG8pOwotCi0KLS8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBkZWNvZGUgZnVuY3Rpb24gKi8KLQotZXh0ZXJuIGluc25faGFuZGxlciBwcmludF9pY2FjaGVfZGVjbGFyYXRpb247Ci1leHRlcm4gaW5zbl9oYW5kbGVyIHByaW50X2ljYWNoZV9kZWZpbml0aW9uOwotCi0KLS8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9uICovCi0KLWV4dGVybiBmdW5jdGlvbl9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbjsKLWV4dGVybiBmdW5jdGlvbl9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uOwotCi0KLS8qIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLQotZXh0ZXJuIHZvaWQgcHJpbnRfaWNhY2hlX3N0cnVjdAotKGluc25fdGFibGUgKmluc3RydWN0aW9ucywKLSBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMsCi0gbGYgKmZpbGUpOwotCi0KLS8qIE91dHB1dCBhIHNpbmdsZSBpbnN0cnVjdGlvbnMgZGVjb2RlciAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taWRlY29kZS5jIGIvc2ltL3BwYy9nZW4taWRlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdkY2RlLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZ2VuLWlkZWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1jYWNoZS5oIgotI2luY2x1ZGUgImxkLWluc24uaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0jaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgotI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKLQotCi0KLXN0YXRpYyB2b2lkCi1sZl9wcmludF9vcGNvZGVzKGxmICpmaWxlLAotCQkgaW5zbl90YWJsZSAqdGFibGUpCi17Ci0gIGlmICh0YWJsZSAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIEFTU0VSVCh0YWJsZS0+b3Bjb2RlICE9IE5VTEwpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJfJWRfJWQiLAotCQl0YWJsZS0+b3Bjb2RlLT5maXJzdCwKLQkJdGFibGUtPm9wY29kZS0+bGFzdCk7Ci0gICAgICBpZiAodGFibGUtPnBhcmVudCA9PSBOVUxMKSBicmVhazsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiX18lZCIsIHRhYmxlLT5vcGNvZGVfbnIpOwotICAgICAgdGFibGUgPSB0YWJsZS0+cGFyZW50OwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotbGZfcHJpbnRfdGFibGVfbmFtZShsZiAqZmlsZSwKLQkJICAgIGluc25fdGFibGUgKnRhYmxlKQotewotICBsZl9wcmludGYoZmlsZSwgImlkZWNvZGVfdGFibGUiKTsKLSAgbGZfcHJpbnRfb3Bjb2RlcyhmaWxlLCB0YWJsZSk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV90YWJsZShsZiAqZmlsZSwKLQkJICAgIGluc25fdGFibGUgKmVudHJ5LAotCQkgICAgY29uc3QgY2hhciAqcmVzdWx0KQotewotICBsZl9wcmludGYoZmlsZSwgIi8qIHByaW1lIHRoZSBzZWFyY2ggKi9cbiIpOwotICBsZl9wcmludGYoZmlsZSwgImlkZWNvZGVfdGFibGVfZW50cnkgKnRhYmxlID0gIik7Ci0gIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOwotICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgImludCBvcGNvZGUgPSBFWFRSQUNURUQzMihpbnN0cnVjdGlvbiwgJWQsICVkKTtcbiIsCi0JICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgZW50cnktPm9wY29kZS0+Zmlyc3QpLAotCSAgICBpMnRhcmdldChoaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmxhc3QpKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJpZGVjb2RlX3RhYmxlX2VudHJ5ICp0YWJsZV9lbnRyeSA9IHRhYmxlICsgb3Bjb2RlO1xuIik7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIi8qIGl0ZXJhdGUgdW50aWwgYSBsZWFmICovXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ3aGlsZSAoMSkge1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBzaWduZWQgc2hpZnQgPSB0YWJsZV9lbnRyeS0+c2hpZnQ7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJpZiAoc2hpZnQgPT0gZnVuY3Rpb25fZW50cnkpIGJyZWFrO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBpZiAoc2hpZnQgPj0gMCkge1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAgIHRhYmxlID0gKChpZGVjb2RlX3RhYmxlX2VudHJ5KilcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICB0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAgIG9wY29kZSA9ICgoaW5zdHJ1Y3Rpb24gJiB0YWJsZV9lbnRyeS0+bWFzaylcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICAgPj4gc2hpZnQpO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAgIHRhYmxlX2VudHJ5ID0gdGFibGUgKyBvcGNvZGU7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgZWxzZSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgICAgLyogbXVzdCBiZSBhIGJvb2xlYW4gKi9cbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICBBU1NFUlQodGFibGVfZW50cnktPnNoaWZ0ID09IGJvb2xlYW5fZW50cnkpO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAgIG9wY29kZSA9ICgoaW5zdHJ1Y3Rpb24gJiB0YWJsZV9lbnRyeS0+bWFzaylcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICAgIT0gdGFibGVfZW50cnktPnZhbHVlKTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICB0YWJsZSA9ICgoaWRlY29kZV90YWJsZV9lbnRyeSopXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAgICAgICAgdGFibGVfZW50cnktPmZ1bmN0aW9uX29yX3RhYmxlKTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICB0YWJsZV9lbnRyeSA9IHRhYmxlICsgb3Bjb2RlO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICB9XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLQotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiLyogY2FsbCB0aGUgbGVhZiBjb2RlICovXG4iKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfanVtcHMpKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJnb3RvICp0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKLSAgfQotICBlbHNlIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIiVzICIsIHJlc3VsdCk7Ci0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIigoKGlkZWNvZGVfaWNhY2hlKil0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICAoJXMpKTtcbiIsIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiKChpZGVjb2RlX3NlbWFudGljKil0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICAoJXMpO1xuIiwgU0VNQU5USUNfRlVOQ1RJT05fQUNUVUFMKTsKLSAgICB9Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV90YWJsZV9zdGFydChpbnNuX3RhYmxlICp0YWJsZSwKLQkJCSAgbGYgKmZpbGUsCi0JCQkgIHZvaWQgKmRhdGEsCi0JCQkgIGludCBkZXB0aCkKLXsKLSAgQVNTRVJUKGRlcHRoID09IDApOwotICAvKiBzdGFydCBvZiB0aGUgdGFibGUgKi8KLSAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikgewotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgInN0YXRpYyBpZGVjb2RlX3RhYmxlX2VudHJ5ICIpOwotICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiW10gPSB7XG4iKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV90YWJsZV9sZWFmKGluc25fdGFibGUgKmVudHJ5LAotCQkJIGxmICpmaWxlLAotCQkJIHZvaWQgKmRhdGEsCi0JCQkgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JCQkgaW50IGRlcHRoKQotewotICBBU1NFUlQoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKLSAgQVNTRVJUKGRlcHRoID09IDApOwotCi0gIC8qIGFkZCBhbiBlbnRyeSB0byB0aGUgdGFibGUgKi8KLSAgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIC8qJWQqLyB7ICIsIGVudHJ5LT5vcGNvZGVfbnIpOwotICAgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpIHsKLSAgICAgIC8qIHRhYmxlIGxlYWYgZW50cnkgKi8KLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiZnVuY3Rpb25fZW50cnksIDAsIDAsICIpOwotICAgICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfanVtcHMpKQotCWxmX3ByaW50ZihmaWxlLCAiJiYiKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCSAgZW50cnktPmluc25zLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCSAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKQotCQkJICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKLQkJCSAgIDogZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotCSAgICAgfHwgZW50cnktPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pIHsKLSAgICAgIC8qIHRhYmxlIGNhbGxpbmcgc3dpdGNoIHN0YXRlbWVudCAqLwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJmdW5jdGlvbl9lbnRyeSwgMCwgMCwgIik7Ci0gICAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpCi0JbGZfcHJpbnRmKGZpbGUsICImJiIpOwotICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCBlbnRyeSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVudHJ5LT5vcGNvZGUtPmlzX2Jvb2xlYW4pIHsKLSAgICAgIC8qIHRhYmxlIGBjYWxsaW5nJyBib29sZWFuIHRhYmxlICovCi0gICAgICBsZl9wcmludGYoZmlsZSwgImJvb2xlYW5fZW50cnksICIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJNQVNLMzIoJWQsICVkKSwgIiwKLQkJaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JCWkydGFyZ2V0KGhpX2JpdF9uciwgZW50cnktPm9wY29kZS0+bGFzdCkpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJJTlNFUlRFRDMyKCVkLCAlZCwgJWQpLCAiLAotCQllbnRyeS0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50LAotCQlpMnRhcmdldChoaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmZpcnN0KSwKLQkJaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7Ci0gICAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIGVudHJ5KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiB0YWJsZSBgY2FsbGluZycgYW5vdGhlciB0YWJsZSAqLwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIlZCwgIiwgaW5zbl9iaXRfc2l6ZSAtIGVudHJ5LT5vcGNvZGUtPmxhc3QgLSAxKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiTUFTSzMyKCVkLCVkKSwgIiwKLQkJaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCi0JCWkydGFyZ2V0KGhpX2JpdF9uciwgZW50cnktPm9wY29kZS0+bGFzdCkpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIwLCAiKTsKLSAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOwotICAgIH0KLSAgICBsZl9wcmludGYoZmlsZSwgIiB9LFxuIik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfdGFibGVfZW5kKGluc25fdGFibGUgKnRhYmxlLAotCQkJbGYgKmZpbGUsCi0JCQl2b2lkICpkYXRhLAotCQkJaW50IGRlcHRoKQotewotICBBU1NFUlQoZGVwdGggPT0gMCk7Ci0gIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV90YWJsZV9wYWRkaW5nKGluc25fdGFibGUgKnRhYmxlLAotCQkJICAgIGxmICpmaWxlLAotCQkJICAgIHZvaWQgKmRhdGEsCi0JCQkgICAgaW50IGRlcHRoLAotCQkJICAgIGludCBvcGNvZGVfbnIpCi17Ci0gIEFTU0VSVChkZXB0aCA9PSAwKTsKLSAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikgewotICAgIGxmX3ByaW50ZihmaWxlLCAiICAvKiVkKi8geyBmdW5jdGlvbl9lbnRyeSwgMCwgMCwgIiwgb3Bjb2RlX25yKTsKLSAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpCi0gICAgICBsZl9wcmludGYoZmlsZSwgIiYmIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIlc19pbGxlZ2FsIH0sXG4iLAotCSAgICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSA/ICJpY2FjaGUiIDogInNlbWFudGljIikpOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIHZvaWQKLXByaW50X2dvdG9fc3dpdGNoX25hbWUobGYgKmZpbGUsCi0JCSAgICAgICBpbnNuX3RhYmxlICplbnRyeSkKLXsKLSAgbGZfcHJpbnRmKGZpbGUsICJjYXNlXyIpOwotICBpZiAoZW50cnktPm9wY29kZSA9PSBOVUxMKQotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWVudHJ5LT5pbnNucy0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCQllbnRyeS0+ZXhwYW5kZWRfYml0cywKLQkJCSgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKQotCQkJID8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCi0JCQkgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKLSAgZWxzZQotICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ290b19zd2l0Y2hfdGFibGVfbGVhZihpbnNuX3RhYmxlICplbnRyeSwKLQkJCSAgICAgbGYgKmZpbGUsCi0JCQkgICAgIHZvaWQgKmRhdGEsCi0JCQkgICAgIGluc24gKmluc3RydWN0aW9uLAotCQkJICAgICBpbnQgZGVwdGgpCi17Ci0gIEFTU0VSVChlbnRyeS0+cGFyZW50ICE9IE5VTEwpOwotICBBU1NFUlQoZGVwdGggPT0gMCk7Ci0gIEFTU0VSVChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbik7Ci0gIEFTU0VSVChlbnRyeS0+cGFyZW50LT5vcGNvZGUpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAiJiYiKTsKLSAgcHJpbnRfZ290b19zd2l0Y2hfbmFtZShmaWxlLCBlbnRyeSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiLFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9nb3RvX3N3aXRjaF90YWJsZV9wYWRkaW5nKGluc25fdGFibGUgKnRhYmxlLAotCQkJCWxmICpmaWxlLAotCQkJCXZvaWQgKmRhdGEsCi0JCQkJaW50IGRlcHRoLAotCQkJCWludCBvcGNvZGVfbnIpCi17Ci0gIEFTU0VSVChkZXB0aCA9PSAwKTsKLSAgQVNTRVJUKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbik7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICImJmlsbGVnYWxfIik7Ci0gIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOwotICBsZl9wcmludGYoZmlsZSwgIixcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsobGYgKmZpbGUsCi0JCQlpbnNuX3RhYmxlICplbnRyeSkKLXsKLSAgbGZfcHJpbnRmKGZpbGUsICJnb3RvIGJyZWFrXyIpOwotICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIGVudHJ5LT5wYXJlbnQpOwotICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9nb3RvX3N3aXRjaF90YWJsZShsZiAqZmlsZSwKLQkJCWluc25fdGFibGUgKnRhYmxlKQotewotICBsZl9wcmludGYoZmlsZSwgImNvbnN0IHN0YXRpYyB2b2lkICoiKTsKLSAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiW10gPSB7XG4iKTsKLSAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAotCQkJICAgZmlsZSwgTlVMTC8qZGF0YSovLAotCQkJICAgMCwKLQkJCSAgIE5VTEwvKnN0YXJ0Ki8sCi0JCQkgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZV9sZWFmLAotCQkJICAgTlVMTC8qZW5kKi8sCi0JCQkgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZV9wYWRkaW5nKTsKLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Ci19Ci0KLQotdm9pZCBwcmludF9pZGVjb2RlX3N3aXRjaAotKGxmICpmaWxlLCAKLSBpbnNuX3RhYmxlICp0YWJsZSwKLSBjb25zdCBjaGFyICpyZXN1bHQpOwotCi1zdGF0aWMgdm9pZAotaWRlY29kZV9zd2l0Y2hfc3RhcnQoaW5zbl90YWJsZSAqdGFibGUsCi0JCSAgICAgbGYgKmZpbGUsCi0JCSAgICAgdm9pZCAqZGF0YSwKLQkJICAgICBpbnQgZGVwdGgpCi17Ci0gIC8qIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7ICovCi0gIEFTU0VSVChkZXB0aCA9PSAwKTsKLSAgQVNTRVJUKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKTsKLQotICBpZiAodGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbgotICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikgewotICAgIGxmX3ByaW50ZihmaWxlLCAic3dpdGNoIChFWFRSQUNURUQzMihpbnN0cnVjdGlvbiwgJWQsICVkKSkge1xuIiwKLQkgICAgICBpMnRhcmdldChoaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmZpcnN0KSwKLQkgICAgICBpMnRhcmdldChoaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKLSAgfQotICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pIHsKLSAgICBpZiAodGFibGUtPnBhcmVudCAhPSBOVUxMCi0JJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgICB8fCB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotCSAgICB8fCB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKSkgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgfQotICAgIHByaW50X2dvdG9fc3dpdGNoX3RhYmxlKGZpbGUsIHRhYmxlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIkFTU0VSVChFWFRSQUNURUQzMihpbnN0cnVjdGlvbiwgJWQsICVkKVxuIiwKLQkgICAgICBpMnRhcmdldChoaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmZpcnN0KSwKLQkgICAgICBpMnRhcmdldChoaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICA8IChzaXplb2YoIik7Ci0gICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIpIC8gc2l6ZW9mKHZvaWQqKSkpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJnb3RvICoiKTsKLSAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIltFWFRSQUNURUQzMihpbnN0cnVjdGlvbiwgJWQsICVkKV07XG4iLAotCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAotCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+bGFzdCkpOwotICB9Ci0gIGVsc2UgewotICAgIEFTU0VSVCgiYmFkIHN3aXRjaCIgPT0gTlVMTCk7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaWRlY29kZV9zd2l0Y2hfbGVhZihpbnNuX3RhYmxlICplbnRyeSwKLQkJICAgIGxmICpmaWxlLAotCQkgICAgdm9pZCAqZGF0YSwKLQkJICAgIGluc24gKmluc3RydWN0aW9uLAotCQkgICAgaW50IGRlcHRoKQotewotICBjb25zdCBjaGFyICpyZXN1bHQgPSBkYXRhOwotICBBU1NFUlQoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKLSAgQVNTRVJUKGRlcHRoID09IDApOwotICBBU1NFUlQoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0JIHx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JIHx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pOwotICBBU1NFUlQoZW50cnktPnBhcmVudC0+b3Bjb2RlKTsKLQotICBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlLT5pc19ib29sZWFuCi0gICAgICAmJiBlbnRyeS0+b3Bjb2RlX25yID09IDApIHsKLSAgICAvKiBib29sZWFuIGZhbHNlIHRhcmdldCAqLwotICAgIGxmX3ByaW50ZihmaWxlLCAiY2FzZSAlZDpcbiIsIGVudHJ5LT5wYXJlbnQtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCk7Ci0gIH0KLSAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlLT5pc19ib29sZWFuCi0JICAgJiYgZW50cnktPm9wY29kZV9uciAhPSAwKSB7Ci0gICAgLyogYm9vbGVhbiB0cnVlIGNhc2UgKi8KLSAgICBsZl9wcmludGYoZmlsZSwgImRlZmF1bHQ6XG4iKTsKLSAgfQotICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgICB8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKSB7Ci0gICAgLyogbm9ybWFsIGdvdG8gKi8KLSAgICBsZl9wcmludGYoZmlsZSwgImNhc2UgJWQ6XG4iLCBlbnRyeS0+b3Bjb2RlX25yKTsKLSAgfQotICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbikgewotICAgIC8qIGxmX2luZGVudChmaWxlLCAtMSk7ICovCi0gICAgcHJpbnRfZ290b19zd2l0Y2hfbmFtZShmaWxlLCBlbnRyeSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKLSAgICAvKiBsZl9pbmRlbnQoZmlsZSwgKzEpOyAqLwotICB9Ci0gIGVsc2UgewotICAgIEFTU0VSVCgiYmFkIHN3aXRjaCIgPT0gTlVMTCk7Ci0gIH0KLSAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgewotICAgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpIHsKLSAgICAgIC8qIHN3aXRjaCBjYWxsaW5nIGxlYWYgKi8KLSAgICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSkKLQlsZl9wcmludGYoZmlsZSwgImdvdG8gIik7Ci0gICAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpCi0JbGZfcHJpbnRmKGZpbGUsICIlcyAiLCByZXN1bHQpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkJICBlbnRyeS0+aW5zbnMtPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkJICBlbnRyeS0+ZXhwYW5kZWRfYml0cywKLQkJCSAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCi0JCQkgICA/IGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZQotCQkJICAgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKLSAgICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2NhbGxzKSkKLQlsZl9wcmludGYoZmlsZSwgIiglcykiLCBTRU1BTlRJQ19GVU5DVElPTl9BQ1RVQUwpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICI7XG4iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZW50cnktPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgICAgfHwgZW50cnktPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikgewotICAgICAgLyogc3dpdGNoIGNhbGxpbmcgc3dpdGNoICovCi0gICAgICBwcmludF9pZGVjb2RlX3N3aXRjaChmaWxlLCBlbnRyeSwgcmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBzd2l0Y2ggbG9va2luZyB1cCBhIHRhYmxlICovCi0gICAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICAgIHByaW50X2lkZWNvZGVfdGFibGUoZmlsZSwgZW50cnksIHJlc3VsdCk7Ci0gICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci0gICAgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZS0+aXNfYm9vbGVhbgotCXx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCXx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiYnJlYWs7XG4iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pIHsKLSAgICAgIHByaW50X2dvdG9fc3dpdGNoX2JyZWFrKGZpbGUsIGVudHJ5KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBBU1NFUlQoImJhZCBzd2l0Y2giID09IE5VTEwpOwotICAgIH0KLSAgfQotICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX3N3aXRjaF9pbGxlZ2FsKGxmICpmaWxlLAotCQkJICAgICBjb25zdCBjaGFyICpyZXN1bHQpCi17Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0gIHByaW50X2lkZWNvZGVfaWxsZWdhbChmaWxlLCByZXN1bHQpOwotICBsZl9wcmludGYoZmlsZSwgImJyZWFrO1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCAtMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pZGVjb2RlX3N3aXRjaF9lbmQoaW5zbl90YWJsZSAqdGFibGUsCi0JCSAgIGxmICpmaWxlLAotCQkgICB2b2lkICpkYXRhLAotCQkgICBpbnQgZGVwdGgpCi17Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7Ci0gIEFTU0VSVChkZXB0aCA9PSAwKTsKLSAgQVNTRVJUKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLQkgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCi0JIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKTsKLSAgQVNTRVJUKHRhYmxlLT5vcGNvZGUpOwotCi0gIGlmICh0YWJsZS0+b3Bjb2RlLT5pc19ib29sZWFuKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgfQotICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0JICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pIHsKLSAgICBsZl9wcmludGYoZmlsZSwgImRlZmF1bHQ6XG4iKTsKLSAgICBzd2l0Y2ggKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuKSB7Ci0gICAgY2FzZSBzd2l0Y2hfZ2VuOgotICAgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfaWxsZWdhbChmaWxlLCByZXN1bHQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwYWRkZWRfc3dpdGNoX2dlbjoKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICBlcnJvcihcIkludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCBnZW5lcmF0ZWRcXG5cIik7XG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiICBicmVhaztcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVCgiYmFkIHN3aXRjaCIgPT0gTlVMTCk7Ci0gICAgfQotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gIH0KLSAgZWxzZSBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJpbGxlZ2FsXyIpOwotICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiOlxuIik7Ci0gICAgcHJpbnRfaWRlY29kZV9pbGxlZ2FsKGZpbGUsIHJlc3VsdCk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJicmVha18iKTsKLSAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIjo7XG4iKTsKLSAgICBpZiAodGFibGUtPnBhcmVudCAhPSBOVUxMCi0JJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotCSAgICB8fCB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotCSAgICB8fCB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKSkgewotICAgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIEFTU0VSVCgiYmFkIHN3aXRjaCIgPT0gTlVMTCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLWlkZWNvZGVfc3dpdGNoX3BhZGRpbmcoaW5zbl90YWJsZSAqdGFibGUsCi0JCSAgICAgICBsZiAqZmlsZSwKLQkJICAgICAgIHZvaWQgKmRhdGEsCi0JCSAgICAgICBpbnQgZGVwdGgsCi0JCSAgICAgICBpbnQgb3Bjb2RlX25yKQotewotICBjb25zdCBjaGFyICpyZXN1bHQgPSBkYXRhOwotICBBU1NFUlQoZGVwdGggPT0gMCk7Ci0gIEFTU0VSVCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCi0JIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotCSB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7Ci0KLSAgc3dpdGNoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbikgewotICBjYXNlIHN3aXRjaF9nZW46Ci0gICAgYnJlYWs7Ci0gIGNhc2UgcGFkZGVkX3N3aXRjaF9nZW46Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJjYXNlICVkOlxuIiwgb3Bjb2RlX25yKTsKLSAgICBwcmludF9pZGVjb2RlX3N3aXRjaF9pbGxlZ2FsKGZpbGUsIHJlc3VsdCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZ290b19zd2l0Y2hfZ2VuOgotICAgIC8qIG5vIHBhZGRpbmcgbmVlZGVkICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgQVNTRVJUKCJiYWQgc3dpdGNoIiAhPSBOVUxMKTsKLSAgfQotfQotCi0KLXZvaWQKLXByaW50X2lkZWNvZGVfc3dpdGNoKGxmICpmaWxlLCAKLQkJICAgICBpbnNuX3RhYmxlICp0YWJsZSwKLQkJICAgICBjb25zdCBjaGFyICpyZXN1bHQpCi17Ci0gIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKLQkJCSAgIGZpbGUsICh2b2lkKilyZXN1bHQsCi0JCQkgICAwLAotCQkJICAgaWRlY29kZV9zd2l0Y2hfc3RhcnQsCi0JCQkgICBpZGVjb2RlX3N3aXRjaF9sZWFmLAotCQkJICAgaWRlY29kZV9zd2l0Y2hfZW5kLAotCQkJICAgaWRlY29kZV9zd2l0Y2hfcGFkZGluZyk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlcihsZiAqZmlsZSwKLQkJCQkgICAgIGluc25fdGFibGUgKnRhYmxlLAotCQkJCSAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJzdGF0aWMgIik7Ci0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKQotICAgICAgbGZfcHJpbnRmKGZpbGUsICJpZGVjb2RlX3NlbWFudGljICoiKTsKLSAgICBlbHNlCi0gICAgICBsZl9wcmludGYoZmlsZSwgInVuc2lnbmVkX3dvcmQiKTsKLSAgICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBlbHNlCi0gICAgICBsZl9wcmludGYoZmlsZSwgIiAiKTsKLSAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuKCVzKSIsIElDQUNIRV9GVU5DVElPTl9GT1JNQUwpOwotICAgIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiOyIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykgJiYgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikgewotICAgIGxmX2luZGVudChmaWxlLCAtMSk7Ci0gICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzEpOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWlkZWNvZGVfZGVjbGFyZV9pZl9zd2l0Y2goaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgIGxmICpmaWxlLAotCQkJICB2b2lkICpkYXRhLAotCQkJICBpbnQgZGVwdGgpCi17Ci0gIGlmICgodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgotICAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotICAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQotICAgICAgJiYgdGFibGUtPnBhcmVudCAhPSBOVUxMIC8qIGRvbid0IGRlY2xhcmUgdGhlIHRvcCBvbmUgeWV0ICovCi0gICAgICAmJiB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikgewotICAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlcihmaWxlLAotCQkJCQkgdGFibGUsCi0JCQkJCSAwLyppc250IGZ1bmN0aW9uIGRlZmluaXRpb24qLyk7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaWRlY29kZV9leHBhbmRfaWZfc3dpdGNoKGluc25fdGFibGUgKnRhYmxlLAotCQkJIGxmICpmaWxlLAotCQkJIHZvaWQgKmRhdGEsCi0JCQkgaW50IGRlcHRoKQotewotICBpZiAoKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLSAgICAgICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KLSAgICAgICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikKLSAgICAgICYmIHRhYmxlLT5wYXJlbnQgIT0gTlVMTCAvKiBkb24ndCBleHBhbmQgdGhlIHRvcCBvbmUgeWV0ICovCi0gICAgICAmJiB0YWJsZS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikgewotICAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlcihmaWxlLAotCQkJCQkgICAgdGFibGUsCi0JCQkJCSAgICAxLyppcyBmdW5jdGlvbiBkZWZpbml0aW9uKi8pOwotICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2NhbGxzKSkgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgfQotICAgIHByaW50X2lkZWNvZGVfc3dpdGNoKGZpbGUsIHRhYmxlLCAicmV0dXJuIik7Ci0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKSB7Ci0gICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV9sb29rdXBzKGxmICpmaWxlLAotCQkgICAgICBpbnNuX3RhYmxlICp0YWJsZSwKLQkJICAgICAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQotewotICBpbnQgZGVwdGg7Ci0KLSAgLyogb3V0cHV0IHN3aXRjaCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2hlcmUgbmVlZGVkIGJ5IHRhYmxlcyAqLwotICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCi0JCQkgICBmaWxlLCBOVUxMLAotCQkJICAgMSwKLQkJCSAgIGlkZWNvZGVfZGVjbGFyZV9pZl9zd2l0Y2gsIC8qIFNUQVJUICovCi0JCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgCi0gIC8qIG91dHB1dCB0YWJsZXMgd2hlcmUgbmVlZGVkICovCi0gIGZvciAoZGVwdGggPSBpbnNuX3RhYmxlX2RlcHRoKHRhYmxlKTsKLSAgICAgICBkZXB0aCA+IDA7Ci0gICAgICAgZGVwdGgtLSkgewotICAgIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKLQkJCSAgICAgZmlsZSwgTlVMTCwKLQkJCSAgICAgMS1kZXB0aCwKLQkJCSAgICAgcHJpbnRfaWRlY29kZV90YWJsZV9zdGFydCwKLQkJCSAgICAgcHJpbnRfaWRlY29kZV90YWJsZV9sZWFmLAotCQkJICAgICBwcmludF9pZGVjb2RlX3RhYmxlX2VuZCwKLQkJCSAgICAgcHJpbnRfaWRlY29kZV90YWJsZV9wYWRkaW5nKTsKLSAgfQotICAKLSAgLyogb3V0cHV0IHN3aXRjaCBmdW5jdGlvbnMgd2hlcmUgbmVlZGVkICovCi0gIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKLQkJCSAgIGZpbGUsIE5VTEwsCi0JCQkgICAxLAotCQkJICAgaWRlY29kZV9leHBhbmRfaWZfc3dpdGNoLCAvKiBTVEFSVCAqLwotCQkJICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2lkZWNvZGVfYm9keShsZiAqZmlsZSwKLQkJICAgaW5zbl90YWJsZSAqdGFibGUsCi0JCSAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKLXsKLSAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KLSAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgotICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCi0gICAgcHJpbnRfaWRlY29kZV9zd2l0Y2goZmlsZSwgdGFibGUsIHJlc3VsdCk7Ci0gIGVsc2UKLSAgICBwcmludF9pZGVjb2RlX3RhYmxlKGZpbGUsIHRhYmxlLCByZXN1bHQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KGxmICpmaWxlLAotCQkJICBpbnNuX3RhYmxlICp0YWJsZSwKLQkJCSAgaW50IGNhbl9zdG9wKQotewotICAvKiBPdXRwdXQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgcmVhbCBjb2RlOgotCi0gICAgIFVuZm9ydHVuYXRseSwgdGhlcmUgYXJlIG11bHRpcGxlIGNhc2VzIHRvIGNvbnNpZGVyIHZpczoKLQotICAgICA8aWNhY2hlPiBYIDxzbXA+IFggPGV2ZW50cz4gWCA8a2VlcC1ydW5uaW5nLWZsYWc+IFggLi4uCi0KLSAgICAgQ29uc2VxdWVudGx5IHRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBpbiBtdWx0aXBsZSBkaWZmZXJlbnQgd2F5cyAqLwotCi0gIGxmX3B1dHN0cihmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiam1wX2J1ZiBoYWx0O1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiam1wX2J1ZiByZXN0YXJ0O1xuIik7Ci0gIGlmICghZ2VuZXJhdGVfc21wKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjcHUgKnByb2Nlc3NvciA9IE5VTEw7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgInVuc2lnbmVkX3dvcmQgY2lhID0gLTE7XG4iKTsKLSAgfQotICBsZl9wdXRzdHIoZmlsZSwgImludCBsYXN0X2NwdTtcbiIpOwotICBpZiAoZ2VuZXJhdGVfc21wKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpbnQgY3VycmVudF9jcHU7XG4iKTsKLSAgfQotCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGxmX3B1dHN0cihmaWxlLCAiaW50IGNwdV9ucjtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIi8qIGZsdXNoIHRoZSBpY2FjaGUgb2YgYSBwb3NzaWJsZSBicmVhayBpbnNuICovXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgImZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2ZsdXNoX2ljYWNoZShwcm9jZXNzb3JzW2NwdV9ucl0pO1xuIik7Ci0gIH0KLQotICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiLyogc2V0IHRoZSBoYWx0IHRhcmdldCBpbml0aWFsbHkgKi9cbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgInBzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQoc3lzdGVtLCAmaGFsdCwgTlVMTCk7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJpZiAoc2V0am1wKGhhbHQpKVxuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICByZXR1cm47XG4iKTsKLQotICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiLyogd2hlcmUgd2VyZSB3ZSBiZWZvcmUgdGhlIGhhbHQ/ICovXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJsYXN0X2NwdSA9IHBzaW1fbGFzdF9jcHUoc3lzdGVtKTtcbiIpOwotCi0gIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIvKiBjaGVjayBmb3IgbmVlZCB0byBmb3JjZSBldmVudCBwcm9jZXNzaW5nIGZpcnN0ICovXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKGxhc3RfY3B1ID09IG5yX2NwdXMpIHtcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgICAvKiBoYWx0ZWQgZHVyaW5nIGV2ZW50IHByb2Nlc3NpbmcgKi9cbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIgICAgbGFzdF9jcHUgPSAtMTtcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgfVxuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICBlbHNlIGlmIChsYXN0X2NwdSA9PSBucl9jcHVzIC0gMSkge1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICAgIC8qIGxhc3QgY3B1IGRpZCBoYWx0ICovXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIgICAgaWYgKGV2ZW50X3F1ZXVlX3RpY2soZXZlbnRzKSkge1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICAgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICAgIH1cbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgICBsYXN0X2NwdSA9IC0xO1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJlbHNlIHtcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiBpZiAobGFzdF9jcHUgPT0gbnJfY3B1cyAtIDEpXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIgICAvKiBjcHUgemVybyBpcyBuZXh0ICovXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIgICBsYXN0X2NwdSA9IC0xO1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0KLSAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIi8qIGhhdmUgZW5zdXJlZCB0aGF0IHRoZSBldmVudCBxdWV1ZSBjYW4gbm90IGJlIGZpcnN0ICovXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJBU1NFUlQobGFzdF9jcHUgPj0gLTEgJiYgbGFzdF9jcHUgPCBucl9jcHVzIC0gMSk7XG4iKTsKLQotICBpZiAoIWdlbmVyYXRlX3NtcCkgewotCi0gICAgbGZfcHV0c3RyKGZpbGUsICIKLS8qIENBU0UgMTogTk8gU01QICh3aXRoIG9yIHdpdGggb3V0IGluc3RydWN0aW9uIGNhY2hlKS4KLQotICAgSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY3VycmVudAotICAgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHJldHVybmVkIHRvIHRoZSBjcHUgb2JqZWN0Ci0gICBhZnRlciBldmVyeSBleGVjdXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24uICBJbnN0ZWFkIGl0IG9ubHkgbmVlZHMgdG8KLSAgIGJlIHNhdmVkIHdoZW4gZWl0aGVyIEEuIHRoZSBtYWluIGxvb3AgZXhpdHMgb3IgQi4gQSBjcHUtaGFsdCBvcgotICAgY3B1LXJlc3RhcnQgY2FsbCBmb3JjZXMgdGhlIGxvb3AgdG8gYmUgcmUtZW5lcmVkLiAgVGhlIGxhdGVyCi0gICBmdW5jdGlvbnMgYWx3YXlzIHNhdmUgdGhlIGN1cnJlbnQgY3B1IGluc3RydWN0aW9uIGFkZHJlc3MuCi0KLSAgIFR3byBzdWJjYXNlcyBhbHNvIGV4aXN0IHRoYXQgd2l0aCBhbmQgdGhhdCB3aXRob3V0IGFuIGluc3RydWN0aW9uCi0gICBjYWNoZS4KLQotICAgQW4gYWRkaXRpb25hbCBjb21wbGV4aXR5IGlzIHRoZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGEgMToxIHJhdGlvCi0gICBpcyBtYWludGFpbmVkIGJldHdlZW4gdGhlIGV4ZWN1dGlvbiBvZiBhbiBpbnN0cnVjdGlvbiBhbmQgdGhlCi0gICBpbmNyZW1lbnRpbmcgb2YgdGhlIHNpbXVsYXRpb24gY2xvY2sgKi8iKTsKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIi8qIG5vdyBhZGQgcmVzdGFydCB0YXJnZXQgYXMgcmVhZHkgdG8gcnVuICovXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgInBzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQoc3lzdGVtLCAmaGFsdCwgJnJlc3RhcnQpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoc2V0am1wKHJlc3RhcnQpKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKFdJVEhfRVZFTlRTKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICAvKiB3aGVuIHJlc3RhcnQsIGNwdSBtdXN0IGhhdmUgYmVlbiBsYXN0LCBjbG9jayBuZXh0ICovXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICAgIGV2ZW50X3F1ZXVlX3Byb2Nlc3MoZXZlbnRzKTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIH1cbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotCi0gICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiLyogcHJpbWUgdGhlIG1haW4gbG9vcCAqL1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJwcm9jZXNzb3IgPSBwcm9jZXNzb3JzWzBdO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7Ci0KLSAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ3aGlsZSAoMSkge1xuIik7Ci0gICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLQotICAgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9XG4iKTsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiICB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3NvciksIHByb2Nlc3NvciwgY2lhKTtcbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICAgICAgcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAiY2lhID0iKTs7Ci0gICAgfQotCi0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgImlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5ID1cbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGNwdV9pY2FjaGVfZW50cnkocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChjYWNoZV9lbnRyeS0+YWRkcmVzcyA9PSBjaWEpIHtcbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIC8qIGNhY2hlIGhpdCAqL1xuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWRlY29kZV9zZW1hbnRpYyAqY29uc3Qgc2VtYW50aWMgPSBjYWNoZV9lbnRyeS0+c2VtYW50aWM7XG4iKTsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiICBjaWEgPSBzZW1hbnRpYyhwcm9jZXNzb3IsIGNhY2hlX2VudHJ5LCBjaWEpO1xuIik7Ci0gICAgICAvKiB0YWlsICovCi0gICAgICBpZiAoY2FuX3N0b3ApIHsKLQlsZl9wdXRzdHIoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOwotCWxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2NvbnRpbnVpbmcsIDAvKmlnbm9yZSovKTtcbiIpOwotICAgICAgfQotICAgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiZWxzZSB7XG4iKTsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiICAvKiBjYWNoZSBtaXNzICovXG4iKTsKLSAgICAgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkpIHsKLQlsZl9pbmRlbnQoZmlsZSwgKzIpOwotCWxmX3B1dHN0cihmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqc2VtYW50aWM7XG4iKTsKLQlsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgICAgfQotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24gPVxuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3NvciksIHByb2Nlc3NvciwgY2lhKTtcbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGlmIChXSVRIX01PTiAhPSAwKVxuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBtb25fZXZlbnQobW9uX2V2ZW50X2ljYWNoZV9taXNzLCBwcm9jZXNzb3IsIGNpYSk7XG4iKTsKLSAgICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkgewotCWxmX3B1dHN0cihmaWxlLCAie1xuIik7Ci0JbGZfaW5kZW50KGZpbGUsICsyKTsKLQlwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICJjaWEgPSIpOwotCWxmX2luZGVudChmaWxlLCAtMik7Ci0JbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCXByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgInNlbWFudGljID0iKTsKLQlsZl9wdXRzdHIoZmlsZSwgIiAgY2lhID0gc2VtYW50aWMocHJvY2Vzc29yLCBjYWNoZV9lbnRyeSwgY2lhKTtcbiIpOwotICAgICAgfQotICAgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICB9Ci0KLSAgICAvKiBldmVudHMgKi8KLSAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIvKiBwcm9jZXNzIGFueSBldmVudHMgKi9cbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKFdJVEhfRVZFTlRTKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKGV2ZW50X3F1ZXVlX3RpY2soZXZlbnRzKSkge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgY2lhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotCi0gICAgLyogdGFpbCAqLwotICAgIGlmIChjYW5fc3RvcCkgewotICAgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIvKiBhYm9ydCBpZiBuZWNlc3NhcnkgKi9cbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoa2VlcF9ydW5uaW5nICE9IE5VTEwgJiYgISprZWVwX3J1bm5pbmcpXG4iKTsKLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2NvbnRpbnVpbmcsIDAvKm5vdCBpbXBvcnRhbnQqLyk7XG4iKTsKLSAgICB9Ci0KLSAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0gIH0KLSAgICAKLSAgaWYgKGdlbmVyYXRlX3NtcCkgewotCi0gICAgbGZfcHV0c3RyKGZpbGUsICIKLS8qIENBU0UgMjogU01QIChXaXRoIG9yIHdpdGhvdXQgSUNBQ0hFKQotCi0gICBUaGUgY29tcGxleGl0eSBoZXJlIGNvbWVzIGZyb20gbmVlZGluZyB0byBjb3JyZWN0bHkgcmVzdGFydCB0aGUKLSAgIHN5c3RlbSB3aGVuIGl0IGlzIGFib3J0ZWQuICBJbiBwYXJ0aWN1bGFyIGlmIGNwdTAgcmVxdWVzdHMgYQotICAgcmVzdGFydCwgdGhlIG5leHQgY3B1IGlzIHN0aWxsIGNwdTEuICBDcHUwIGJlaW5nIHJlc3RhcnRlZCBhZnRlcgotICAgYWxsIHRoZSBvdGhlciBDUFUncyBhbmQgdGhlIGV2ZW50IHF1ZXVlIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8iKTsKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIi8qIG5vdyBlc3RhYmxpc2ggdGhlIHJlc3RhcnQgdGFyZ2V0ICovXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgInBzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQoc3lzdGVtLCAmaGFsdCwgJnJlc3RhcnQpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoc2V0am1wKHJlc3RhcnQpKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3VycmVudF9jcHUgPSBwc2ltX2xhc3RfY3B1KHN5c3RlbSk7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgQVNTRVJUKGN1cnJlbnRfY3B1ID49IDAgJiYgY3VycmVudF9jcHUgPCBucl9jcHVzKTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJlbHNlIHtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICBjdXJyZW50X2NwdSA9IGxhc3RfY3B1O1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgIEFTU0VSVChjdXJyZW50X2NwdSA+PSAtMSAmJiBjdXJyZW50X2NwdSA8IG5yX2NwdXMpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICAKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIndoaWxlICgxKSB7XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOwotCi0gICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKFdJVEhfRVZFTlRTKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3VycmVudF9jcHUgKz0gMTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAoY3VycmVudF9jcHUgPT0gbnJfY3B1cykge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgaWYgKGV2ZW50X3F1ZXVlX3RpY2soZXZlbnRzKSkge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICB9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjdXJyZW50X2NwdSA9IDA7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgfVxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgImVsc2Uge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgIGN1cnJlbnRfY3B1ID0gKGN1cnJlbnRfY3B1ICsgMSkgJSBucl9jcHVzO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLQotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIntcbiIpOwotICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjcHUgKnByb2Nlc3NvciA9IHByb2Nlc3NvcnNbY3VycmVudF9jcHVdO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ1bnNpZ25lZF93b3JkIGNpYSA9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTtcbiIpOwotCi0gICAgaWYgKCEoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgICAgbGZfcHV0c3RyKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uID1cbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIHZtX2luc3RydWN0aW9uX21hcF9yZWFkKGNwdV9pbnN0cnVjdGlvbl9tYXAocHJvY2Vzc29yKSwgcHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0gICAgICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICJjaWEgPSIpOwotICAgICAgaWYgKGNhbl9zdG9wKSB7Ci0JbGZfcHV0c3RyKGZpbGUsICJpZiAoa2VlcF9ydW5uaW5nICE9IE5VTEwgJiYgISprZWVwX3J1bm5pbmcpXG4iKTsKLQlsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19jb250aW51aW5nLCAwLyppZ25vcmUqLyk7XG4iKTsKLSAgICAgIH0KLSAgICAgIGxmX3B1dHN0cihmaWxlLCAiY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0gICAgfQotCi0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgImlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5ID1cbiIpOwotICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGNwdV9pY2FjaGVfZW50cnkocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChjYWNoZV9lbnRyeS0+YWRkcmVzcyA9PSBjaWEpIHtcbiIpOwotICAgICAgewotCWxmX2luZGVudChmaWxlLCArMik7Ci0JbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotCWxmX3B1dHN0cihmaWxlLCAiLyogY2FjaGUgaGl0ICovXG4iKTsKLQlsZl9wdXRzdHIoZmlsZSwgImlkZWNvZGVfc2VtYW50aWMgKnNlbWFudGljID0gY2FjaGVfZW50cnktPnNlbWFudGljO1xuIik7Ci0JbGZfcHV0c3RyKGZpbGUsICJjaWEgPSBzZW1hbnRpYyhwcm9jZXNzb3IsIGNhY2hlX2VudHJ5LCBjaWEpO1xuIik7Ci0JLyogdGFpbCAqLwotCWlmIChjYW5fc3RvcCkgewotCSAgbGZfcHV0c3RyKGZpbGUsICJpZiAoa2VlcF9ydW5uaW5nICE9IE5VTEwgJiYgISprZWVwX3J1bm5pbmcpXG4iKTsKLQkgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2NvbnRpbnVpbmcsIDAvKmlnbm9yZS1zaWduYWwqLyk7XG4iKTsKLQl9Ci0JbGZfcHV0c3RyKGZpbGUsICJjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIGNpYSk7XG4iKTsKLQlsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0JbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICAgIH0KLSAgICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgImVsc2Uge1xuIik7Ci0gICAgICB7Ci0JbGZfaW5kZW50KGZpbGUsICsyKTsKLQlsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0JbGZfcHV0c3RyKGZpbGUsICIvKiBjYWNoZSBtaXNzICovXG4iKTsKLQlpZiAoIShjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7Ci0JICBsZl9wdXRzdHIoZmlsZSwgImlkZWNvZGVfc2VtYW50aWMgKnNlbWFudGljO1xuIik7Ci0JfQotCWxmX3B1dHN0cihmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9XG4iKTsKLQlsZl9wdXRzdHIoZmlsZSwgIiAgdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQoY3B1X2luc3RydWN0aW9uX21hcChwcm9jZXNzb3IpLCBwcm9jZXNzb3IsIGNpYSk7XG4iKTsKLQlsZl9wdXRzdHIoZmlsZSwgImlmIChXSVRIX01PTiAhPSAwKVxuIik7Ci0JbGZfcHV0c3RyKGZpbGUsICIgIG1vbl9ldmVudChtb25fZXZlbnRfaWNhY2hlX21pc3MsIHByb2Nlc3NvcnNbY3VycmVudF9jcHVdLCBjaWEpO1xuIik7Ci0JaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7Ci0JICBsZl9wdXRzdHIoZmlsZSwgIntcbiIpOwotCSAgbGZfaW5kZW50KGZpbGUsICsyKTsKLQkgIHByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgImNpYSA9Iik7Ci0JICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotCSAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLQl9Ci0JZWxzZSB7Ci0JICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICJzZW1hbnRpYyA9ICIpOwotCSAgbGZfcHV0c3RyKGZpbGUsICJjaWEgPSBzZW1hbnRpYyhwcm9jZXNzb3IsIGNhY2hlX2VudHJ5LCBjaWEpO1xuIik7Ci0JfQotCS8qIHRhaWwgKi8KLQlpZiAoY2FuX3N0b3ApIHsKLQkgIGxmX3B1dHN0cihmaWxlLCAiaWYgKGtlZXBfcnVubmluZyAhPSBOVUxMICYmICEqa2VlcF9ydW5uaW5nKVxuIik7Ci0JICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19jb250aW51aW5nLCAwLyppZ25vcmUtc2lnbmFsKi8pO1xuIik7Ci0JfQotCWxmX3B1dHN0cihmaWxlLCAiY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBjaWEpO1xuIik7Ci0JbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotCWxmX2luZGVudChmaWxlLCAtMik7Ci0gICAgICB9Ci0gICAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotICAgIH0KLQotICAgIC8qIGNsb3NlICovCi0gICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotCi0gICAgLyogdGFpbCAqLwotICAgIGxmX2luZGVudChmaWxlLCAtMik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgfQotCi0KLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2p1bXAobGYgKmZpbGUsCi0JICAgaW50IGlzX3RhaWwpCi17Ci0gIGlmIChpc190YWlsKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoa2VlcF9ydW5uaW5nICE9IE5VTEwgJiYgISprZWVwX3J1bm5pbmcpXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2hhbHQocHJvY2Vzc29yLCBuaWEsIHdhc19jb250aW51aW5nLCAwLypuYSovKTtcbiIpOwotICB9Ci0gIAotICBpZiAoIWdlbmVyYXRlX3NtcCkgewotICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKFdJVEhfRVZFTlRTKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKGV2ZW50X3F1ZXVlX3RpY2soZXZlbnRzKSkge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBuaWEpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgbmlhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotICB9Ci0KLSAgaWYgKGdlbmVyYXRlX3NtcCkgewotICAgIGlmIChpc190YWlsKQotICAgICAgbGZfcHV0c3RyKGZpbGUsICJjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIG5pYSk7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChXSVRIX0VWRU5UUykge1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgIGN1cnJlbnRfY3B1ICs9IDE7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKGN1cnJlbnRfY3B1ID49IG5yX2NwdXMpIHtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIGlmIChldmVudF9xdWV1ZV90aWNrKGV2ZW50cykpIHtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICAgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgfVxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgICAgY3VycmVudF9jcHUgPSAwO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgIH1cbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJlbHNlIHtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICBjdXJyZW50X2NwdSA9IChjdXJyZW50X2NwdSArIDEpICUgbnJfY3B1cztcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJwcm9jZXNzb3IgPSBwcm9jZXNzb3JzW2N1cnJlbnRfY3B1XTtcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAibmlhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTtcbiIpOwotICB9Ci0KLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjYWNoZV9lbnRyeSA9IGNwdV9pY2FjaGVfZW50cnkocHJvY2Vzc29yLCBuaWEpO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoY2FjaGVfZW50cnktPmFkZHJlc3MgPT0gbmlhKSB7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgLyogY2FjaGUgaGl0ICovXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgZ290byAqY2FjaGVfZW50cnktPnNlbWFudGljO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICBpZiAoaXNfdGFpbCkgewotICAgICAgbGZfcHV0c3RyKGZpbGUsICJnb3RvIGNhY2hlX21pc3M7XG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIShjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpICYmIGlzX3RhaWwpIHsKLSAgICBsZl9wcmludGYoZmlsZSwgImdvdG8gaWRlY29kZTtcbiIpOwotICB9Ci0KLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfanVtcF9pbnNuKGxmICpmaWxlLAotCQlpbnNuICppbnN0cnVjdGlvbiwKLQkJaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAotCQlvcGNvZGVfZmllbGQgKm9wY29kZXMsCi0JCWNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcykKLXsKLQotICAvKiB3aGF0IHdlIGFyZSBmb3IgdGhlIG1vbWVudCAqLwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIHByaW50X215X2RlZmluZXMoZmlsZSwgZXhwYW5kZWRfYml0cywgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnkpOwotCi0gIC8qIG91dHB1dCB0aGUgaWNhY2hlIGVudHJ5ICovCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTEpOwotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCWV4cGFuZGVkX2JpdHMsCi0JCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiOlxuIik7Ci0gICAgbGZfaW5kZW50KGZpbGUsICsxKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOwotICAgIHByaW50X2l0cmFjZShmaWxlLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSwgMS8qcHV0dGluZy12YWx1ZS1pbi1jYWNoZSovKTsKLSAgICBwcmludF9pZGVjb2RlX3ZhbGlkYXRlKGZpbGUsIGluc3RydWN0aW9uLCBvcGNvZGVzKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOwotICAgIHByaW50X2ljYWNoZV9ib2R5KGZpbGUsCi0JCSAgICAgIGluc3RydWN0aW9uLAotCQkgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICBjYWNoZV9ydWxlcywKLQkJICAgICAgMCwgLyp1c2VfZGVmaW5lcyovCi0JCSAgICAgIHB1dF92YWx1ZXNfaW5faWNhY2hlKTsKLSAgICBsZl9wcmludGYoZmlsZSwgImNhY2hlX2VudHJ5LT5hZGRyZXNzID0gbmlhO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJjYWNoZV9lbnRyeS0+c2VtYW50aWMgPSAmJiIpOwotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCWV4cGFuZGVkX2JpdHMsCi0JCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiO1xuIik7Ci0gICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7Ci0gICAgICBwcmludF9zZW1hbnRpY19ib2R5KGZpbGUsCi0JCQkgIGluc3RydWN0aW9uLAotCQkJICBleHBhbmRlZF9iaXRzLAotCQkJICBvcGNvZGVzKTsKLSAgICAgIHByaW50X2p1bXAoZmlsZSwgMS8qaXMtdGFpbCovKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIi8qIGdvdG8gIik7Ci0gICAgICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCi0JCQkgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCSAgZXhwYW5kZWRfYml0cywKLQkJCSAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiOyAqL1xuIik7Ci0gICAgfQotICAgIGxmX2luZGVudChmaWxlLCAtMik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gIH0KLQotICAvKiBwcmludCB0aGUgc2VtYW50aWNzICovCi0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfaW5kZW50KGZpbGUsIC0xKTsKLSAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkgICAgICBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCSAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiOlxuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKLSAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKLQkJICAgIGluc3RydWN0aW9uLAotCQkgICAgZXhwYW5kZWRfYml0cywKLQkJICAgIGNhY2hlX3J1bGVzLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzKQotCQkgICAgID8gZGVmaW5lX3ZhcmlhYmxlcwotCQkgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCi0JCSAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCi0JCSAgICAgOiBkb19ub3RfdXNlX2ljYWNoZSkpOwotICBwcmludF9zZW1hbnRpY19ib2R5KGZpbGUsCi0JCSAgICAgIGluc3RydWN0aW9uLAotCQkgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICBvcGNvZGVzKTsKLSAgaWYgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MpCi0gICAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKLQkJICAgICAgaW5zdHJ1Y3Rpb24sCi0JCSAgICAgIGV4cGFuZGVkX2JpdHMsCi0JCSAgICAgIGNhY2hlX3J1bGVzLAotCQkgICAgICB1bmRlZl92YXJpYWJsZXMsCi0JCSAgICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKQotCQkgICAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCi0JCSAgICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSk7Ci0gIHByaW50X2p1bXAoZmlsZSwgMS8qaXMgdGFpbCovKTsKLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfZGVmaW5pdGlvbihpbnNuX3RhYmxlICplbnRyeSwKLQkJICAgICAgbGYgKmZpbGUsCi0JCSAgICAgIHZvaWQgKmRhdGEsCi0JCSAgICAgIGluc24gKmluc3RydWN0aW9uLAotCQkgICAgICBpbnQgZGVwdGgpCi17Ci0gIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcyA9IChjYWNoZV90YWJsZSopZGF0YTsKLSAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykgewotICAgIEFTU0VSVChlbnRyeS0+bnJfaW5zbiA9PSAxCi0JICAgJiYgZW50cnktPm9wY29kZSA9PSBOVUxMCi0JICAgJiYgZW50cnktPnBhcmVudCAhPSBOVUxMCi0JICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlICE9IE5VTEwpOwotICAgIEFTU0VSVChlbnRyeS0+bnJfaW5zbiA9PSAxCi0JICAgJiYgZW50cnktPm9wY29kZSA9PSBOVUxMCi0JICAgJiYgZW50cnktPnBhcmVudCAhPSBOVUxMCi0JICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlICE9IE5VTEwKLQkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZSAhPSBOVUxMKTsKLSAgICBwcmludF9qdW1wX2luc24oZmlsZSwKLQkJICAgIGVudHJ5LT5pbnNucywKLQkJICAgIGVudHJ5LT5leHBhbmRlZF9iaXRzLAotCQkgICAgZW50cnktPm9wY29kZSwKLQkJICAgIGNhY2hlX3J1bGVzKTsKLSAgfQotICBlbHNlIHsKLSAgICBwcmludF9qdW1wX2luc24oZmlsZSwKLQkJICAgIGluc3RydWN0aW9uLAotCQkgICAgTlVMTCwKLQkJICAgIE5VTEwsCi0JCSAgICBjYWNoZV9ydWxlcyk7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfanVtcF9pbnRlcm5hbF9mdW5jdGlvbihpbnNuX3RhYmxlICp0YWJsZSwKLQkJCSAgICAgbGYgKmZpbGUsCi0JCQkgICAgIHZvaWQgKmRhdGEsCi0JCQkgICAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbikKLXsKLSAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKGZpbGUsIGZ1bmN0aW9uKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTEpOwotICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCWZ1bmN0aW9uLT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCU5VTEwsCi0JCQkoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkKLQkJCSA/IGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZQotCQkJIDogZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzEpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgICBsZl9wcmludGYoZmlsZSwgImNvbnN0IHVuc2lnbmVkX3dvcmQgY2lhID0gbmlhO1xuIik7Ci0gICAgbGZfcHJpbnRfX2NfY29kZShmaWxlLCBmdW5jdGlvbi0+YW5uZXgpOwotICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UoZmlsZSk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJlcnJvcihcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KGxmICpmaWxlLAotCQkJICAgaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMsCi0JCQkgICBpbnQgY2FuX3N0b3ApCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0gIGlmICghY2FuX3N0b3ApCi0gICAgbGZfcHJpbnRmKGZpbGUsICJpbnQgKmtlZXBfcnVubmluZyA9IE5VTEw7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJqbXBfYnVmIGhhbHQ7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJqbXBfYnVmIHJlc3RhcnQ7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJjcHUgKnByb2Nlc3NvciA9IE5VTEw7XG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJ1bnNpZ25lZF93b3JkIG5pYSA9IC0xO1xuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9IDA7XG4iKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpZGVjb2RlX2NhY2hlICpjYWNoZV9lbnRyeSA9IE5VTEw7XG4iKTsKLSAgfQotICBpZiAoZ2VuZXJhdGVfc21wKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJpbnQgY3VycmVudF9jcHUgPSAtMTtcbiIpOwotICB9Ci0KLSAgLyogYWxsIHRoZSBzd2l0Y2hlcyBhbmQgdGFibGVzIC0gdGhleSBrbm93IGFib3V0IGp1bXBpbmcgKi8KLSAgcHJpbnRfaWRlY29kZV9sb29rdXBzKGZpbGUsIHRhYmxlLCBjYWNoZV9ydWxlcyk7Ci0gCi0gIC8qIHN0YXJ0IHRoZSBzaW11bGF0aW9uIHVwICovCi0gIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIntcbiIpOwotICAgIGxmX3B1dHN0cihmaWxlLCAiICBpbnQgY3B1X25yO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICIgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjcHVfZmx1c2hfaWNhY2hlKHByb2Nlc3NvcnNbY3B1X25yXSk7XG4iKTsKLSAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOwotICB9Ci0KLSAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgInBzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQoc3lzdGVtLCAmaGFsdCwgJnJlc3RhcnQpO1xuIik7Ci0KLSAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgImlmIChzZXRqbXAoaGFsdCkpXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICIgIHJldHVybjtcbiIpOwotCi0gIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLSAgbGZfcHV0c3RyKGZpbGUsICJzZXRqbXAocmVzdGFydCk7XG4iKTsKLQotICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gIGlmICghZ2VuZXJhdGVfc21wKSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJwcm9jZXNzb3IgPSBwcm9jZXNzb3JzWzBdO1xuIik7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJjdXJyZW50X2NwdSA9IHBzaW1fbGFzdF9jcHUoc3lzdGVtKTtcbiIpOwotICB9Ci0KLSAgaWYgKCEoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTEpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiaWRlY29kZTpcbiIpOwotICAgIGxmX2luZGVudChmaWxlLCArMSk7Ci0gIH0KLQotICBwcmludF9qdW1wKGZpbGUsIDAvKmlzX3RhaWwqLyk7Ci0KLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfaW5kZW50KGZpbGUsIC0xKTsKLSAgICBsZl9wcmludGYoZmlsZSwgImNhY2hlX21pc3M6XG4iKTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzEpOwotICB9Ci0KLSAgbGZfcHV0c3RyKGZpbGUsICJpbnN0cnVjdGlvblxuIik7Ci0gIGxmX3B1dHN0cihmaWxlLCAiICA9IHZtX2luc3RydWN0aW9uX21hcF9yZWFkKGNwdV9pbnN0cnVjdGlvbl9tYXAocHJvY2Vzc29yKSxcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsIG5pYSk7XG4iKTsKLSAgcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAiLypJR09SRSovIik7Ci0KLSAgLyogcHJpbnQgb3V0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnRlcm5hbHMgZnVuY3Rpb25zICovCi0gIGluc25fdGFibGVfdHJhdmVyc2VfZnVuY3Rpb24odGFibGUsCi0JCQkgICAgICAgZmlsZSwgTlVMTCwKLQkJCSAgICAgICBwcmludF9qdW1wX2ludGVybmFsX2Z1bmN0aW9uKTsKLQotIC8qIHByaW50IG91dCBhIHRhYmxlIG9mIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zICovCi0gIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpCi0gICAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAotCQkJICAgICBmaWxlLCBjYWNoZV9ydWxlcywKLQkJCSAgICAgMSwKLQkJCSAgICAgTlVMTCwgLyogc3RhcnQgKi8KLQkJCSAgICAgcHJpbnRfanVtcF9kZWZpbml0aW9uLCAvKiBsZWFmICovCi0JCQkgICAgIE5VTEwsIC8qIGVuZCAqLwotCQkJICAgICBOVUxMKTsgLyogcGFkZGluZyAqLwotICBlbHNlCi0gICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAotCQkJICAgICBmaWxlLCBjYWNoZV9ydWxlcywKLQkJCSAgICAgcHJpbnRfanVtcF9kZWZpbml0aW9uKTsKLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pZGVjb2RlX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKGxmICpmaWxlKQotewotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpCi0gICAgbGZfcHJpbnRmKGZpbGUsICJnb3RvICVzX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlO1xuIiwgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgPyAiaWNhY2hlIiA6ICJzZW1hbnRpYyIpOwotICBlbHNlIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkKLSAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiBpY2FjaGVfZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGUoJXMpO1xuIiwKLQkgICAgICBJQ0FDSEVfRlVOQ1RJT05fQUNUVUFMKTsKLSAgZWxzZQotICAgIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuIHNlbWFudGljX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKCVzKTtcbiIsCi0JICAgICAgU0VNQU5USUNfRlVOQ1RJT05fQUNUVUFMKTsKLX0KLQotCi0vKiBPdXRwdXQgY29kZSB0byBkbyBhbnkgZmluYWwgY2hlY2tzIG9uIHRoZSBkZWNvZGVkIGluc3RydWN0aW9uLgotICAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB2ZXJpZnlpbmcgYW55IG9uIGRlY29kZWQgZmllbGRzIGhhdmUgdGhlCi0gICBjb3JyZWN0IHZhbHVlIGFuZCBjaGVja2luZyB0aGF0IChmb3IgZmxvYXRpbmcgcG9pbnQpIGZsb2F0aW5nIHBvaW50Ci0gICBoYXJkd2FyZSBpc24ndCBkaXNhYmxlZCAqLwotCi12b2lkCi1wcmludF9pZGVjb2RlX3ZhbGlkYXRlKGxmICpmaWxlLAotCQkgICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JCSAgICAgICBvcGNvZGVfZmllbGQgKm9wY29kZXMpCi17Ci0gIC8qIFZhbGlkYXRlOiB1bmNoZWNrZWQgaW5zdHJ1Y3Rpb24gZmllbGRzCi0KLSAgICAgSWYgYW55IGNvbnN0YW50IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gd2VyZSBub3QgY2hlY2tlZCBieSB0aGUKLSAgICAgaWRlY29kZSB0YWJsZXMsIG91dHB1dCBjb2RlIHRvIGNoZWNrIHRoYXQgdGhleSBoYXZlIHRoZSBjb3JyZWN0Ci0gICAgIHZhbHVlIGhlcmUgKi8KLSAgeyAKLSAgICB1bnNpZ25lZCBjaGVja19tYXNrID0gMDsKLSAgICB1bnNpZ25lZCBjaGVja192YWwgPSAwOwotICAgIGluc25fZmllbGQgKmZpZWxkOwotICAgIG9wY29kZV9maWVsZCAqb3Bjb2RlOwotCi0gICAgLyogZm9ybSBjaGVja19tYXNrL2NoZWNrX3ZhbCBjb250YWluaW5nIHdoYXQgbmVlZHMgdG8gYmUgY2hlY2tlZAotICAgICAgIGluIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIGZvciAoZmllbGQgPSBpbnN0cnVjdGlvbi0+ZmllbGRzLT5maXJzdDsKLQkgZmllbGQtPmZpcnN0IDwgaW5zbl9iaXRfc2l6ZTsKLQkgZmllbGQgPSBmaWVsZC0+bmV4dCkgewotCi0gICAgICBjaGVja19tYXNrIDw8PSBmaWVsZC0+d2lkdGg7Ci0gICAgICBjaGVja192YWwgPDw9IGZpZWxkLT53aWR0aDsKLQotICAgICAgLyogaXMgaXQgYSBjb25zdGFudCB0aGF0IGNvdWxkIG5lZWQgdmFsaWRhdGluZz8gKi8KLSAgICAgIGlmICghZmllbGQtPmlzX2ludCAmJiAhZmllbGQtPmlzX3NsYXNoKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBoYXMgaXQgYmVlbiBjaGVja2VkIGJ5IGEgdGFibGU/ICovCi0gICAgICBmb3IgKG9wY29kZSA9IG9wY29kZXM7IG9wY29kZSAhPSBOVUxMOyBvcGNvZGUgPSBvcGNvZGUtPnBhcmVudCkgewotCWlmIChmaWVsZC0+Zmlyc3QgPj0gb3Bjb2RlLT5maXJzdAotCSAgICAmJiBmaWVsZC0+bGFzdCA8PSBvcGNvZGUtPmxhc3QpCi0JICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChvcGNvZGUgIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgY2hlY2tfbWFzayB8PSAoMSA8PCBmaWVsZC0+d2lkdGgpLTE7Ci0gICAgICBjaGVja192YWwgfD0gZmllbGQtPnZhbF9pbnQ7Ci0gICAgfQotCi0gICAgLyogaWYgYW55IGJpdHMgbm90IGNoZWNrZWQgYnkgb3Bjb2RlIHRhYmxlcywgb3V0cHV0IGNvZGUgdG8gY2hlY2sgdGhlbSAqLwotICAgIGlmIChjaGVja19tYXNrKSB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIi8qIHZhbGlkYXRlOiAlcyAqL1xuIiwKLQkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2Zvcm1hdF0pOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICJpZiAoV0lUSF9SRVNFUlZFRF9CSVRTICYmIChpbnN0cnVjdGlvbiAmIDB4JXgpICE9IDB4JXgpXG4iLAotCQljaGVja19tYXNrLCBjaGVja192YWwpOwotICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgICAgIHByaW50X2lkZWNvZGVfaWxsZWdhbChmaWxlLCAicmV0dXJuIik7Ci0gICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlIGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlCi0KLSAgICAgSWYgdGhlIHNpbXVsYXRvciBpcyBiZWluZyBidWlsdCB3aXRoIG91dCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZQotICAgICAoZGlmZmVyZW50IHRvIGl0IGJlaW5nIGRpc2FibGVkIGluIHRoZSBNU1IpIHRoZW4gZmxvYXRpbmcgcG9pbnQKLSAgICAgaW5zdHJ1Y3Rpb25zIGFyZSBpbnZhbGlkICovCi0gIHsKLSAgICBpZiAoaXRfaXMoImYiLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgewotICAgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgICAgbGZfcHJpbnRmKGZpbGUsICIvKiBWYWxpZGF0ZTogRlAgaGFyZHdhcmUgZXhpc3RzICovXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgIT0gSEFSRF9GTE9BVElOR19QT0lOVClcbiIpOwotICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgICAgIHByaW50X2lkZWNvZGVfaWxsZWdhbChmaWxlLCAicmV0dXJuIik7Ci0gICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlOiBGbG9hdGluZyBQb2ludCBhdmFpbGFibGUKLQotICAgICBJZiBmbG9hdGluZyBwb2ludCBpcyBub3QgYXZhaWxhYmxlLCB3ZSBlbnRlciBhIGZsb2F0aW5nIHBvaW50Ci0gICAgIHVuYXZhaWxhYmxlIGludGVycnVwdCBpbnRvIHRoZSBjYWNoZSBpbnN0ZWFkIG9mIHRoZSBpbnN0cnVjdGlvbgotICAgICBwcm9wZXIuCi0KLSAgICAgVGhlIFBvd2VyUEMgc3BlYyByZXF1aXJlcyBhIENTSSBhZnRlciBNU1JbRlBdIGlzIGNoYW5nZWQgYW5kIHdoZW4KLSAgICAgZXZlciBhIENTSSBvY2N1cmVzIHdlIGZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gKi8KLQotICB7Ci0gICAgaWYgKGl0X2lzKCJmIiwgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICAgIGxmX3ByaW50ZihmaWxlLCAiLyogVmFsaWRhdGU6IEZQIGF2YWlsYWJsZSBhY2NvcmRpbmcgdG8gTVNSW0ZQXSAqL1xuIik7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgImlmICghSVNfRlBfQVZBSUxBQkxFKHByb2Nlc3NvcikpXG4iKTsKLSAgICAgIGxmX2luZGVudChmaWxlLCArMik7Ci0gICAgICBwcmludF9pZGVjb2RlX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKGZpbGUpOwotICAgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaWRlY29kZV9ydW5fZnVuY3Rpb25faGVhZGVyKGxmICpmaWxlLAotCQkJCSAgaW50IGNhbl9zdG9wLAotCQkJCSAgaW50IGlzX2RlZmluaXRpb24pCi17Ci0gIGludCBpbmRlbnQ7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfSURFQ09ERSIsIChpc19kZWZpbml0aW9uID8gIiAiIDogIlxuIikpOwotICBpbmRlbnQgPSBsZl9wdXRzdHIoZmlsZSwgKGNhbl9zdG9wID8gImlkZWNvZGVfcnVuX3VudGlsX3N0b3AiIDogImlkZWNvZGVfcnVuIikpOwotICBpZiAoaXNfZGVmaW5pdGlvbikKLSAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7Ci0gIGVsc2UKLSAgICBsZl9pbmRlbnQoZmlsZSwgK2luZGVudCk7Ci0gIGxmX3B1dHN0cihmaWxlLCAiKHBzaW0gKnN5c3RlbSxcbiIpOwotICBpZiAoY2FuX3N0b3ApCi0gICAgbGZfcHV0c3RyKGZpbGUsICIgdm9sYXRpbGUgaW50ICprZWVwX3J1bm5pbmcsXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgZXZlbnRfcXVldWUgKmV2ZW50cyxcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiBjcHUgKmNvbnN0IHByb2Nlc3NvcnNbXSxcbiIpOwotICBsZl9wdXRzdHIoZmlsZSwgIiBjb25zdCBpbnQgbnJfY3B1cykiKTsKLSAgaWYgKGlzX2RlZmluaXRpb24pCi0gICAgbGZfcHV0c3RyKGZpbGUsICI7Iik7Ci0gIGVsc2UKLSAgICBsZl9pbmRlbnQoZmlsZSwgLWluZGVudCk7Ci0gIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKLX0KLQotCi12b2lkCi1nZW5faWRlY29kZV9oKGxmICpmaWxlLAotCSAgICAgIGluc25fdGFibGUgKnRhYmxlLAotCSAgICAgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcykKLXsKLSAgbGZfcHJpbnRmKGZpbGUsICIvKiBUaGUgaWRlY29kZV8qLmggZnVuY3Rpb25zIHNoYWxsIG1vdmUgdG8gc3VwcG9ydCAqL1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlX2V4cHJlc3Npb24uaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGVfZmllbGRzLmhcIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlX2JyYW5jaC5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIHByaW50X2ljYWNoZV9zdHJ1Y3QodGFibGUsIGNhY2hlX3J1bGVzLCBmaWxlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgV0lUSF9JREVDT0RFX1NNUCAlZFxuIiwgZ2VuZXJhdGVfc21wKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBwcmludF9pZGVjb2RlX3J1bl9mdW5jdGlvbl9oZWFkZXIoZmlsZSwgMC8qY2FuIHN0b3AqLywgMS8qaXMgZGVmaW5pdGlvbiovKTsKLSAgcHJpbnRfaWRlY29kZV9ydW5fZnVuY3Rpb25faGVhZGVyKGZpbGUsIDEvKmNhbiBzdG9wKi8sIDEvKmlzIGRlZmluaXRpb24qLyk7Ci19Ci0KLQotdm9pZAotZ2VuX2lkZWNvZGVfYyhsZiAqZmlsZSwKLQkgICAgICBpbnNuX3RhYmxlICp0YWJsZSwKLQkgICAgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpCi17Ci0gIC8qIHRoZSBpbnRybyAqLwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaW5saW5lLmNcIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImNwdS5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaWRlY29kZS5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic2VtYW50aWNzLmhcIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpY2FjaGUuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInN1cHBvcnQuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIDxzZXRqbXAuaD5cbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiZW51bSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIC8qIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVybyA9PiB0YWJsZSAqL1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBmdW5jdGlvbl9lbnRyeSA9IC0xLFxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBib29sZWFuX2VudHJ5ID0gLTIsXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHN0cnVjdCBfaWRlY29kZV90YWJsZV9lbnRyeSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBzaGlmdDtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgaW5zdHJ1Y3Rpb25fd29yZCBtYXNrO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBpbnN0cnVjdGlvbl93b3JkIHZhbHVlOyIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgdm9pZCAqZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9IGlkZWNvZGVfdGFibGVfZW50cnk7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKSB7Ci0KLSAgICBwcmludF9pZGVjb2RlX2xvb2t1cHMoZmlsZSwgdGFibGUsIGNhY2hlX3J1bGVzKTsKLQotICAgIC8qIG91dHB1dCB0aGUgbWFpbiBpZGVjb2RlIHJvdXRpbmUgKi8KLSAgICBwcmludF9pZGVjb2RlX3J1bl9mdW5jdGlvbl9oZWFkZXIoZmlsZSwgMC8qY2FuIHN0b3AqLywgMC8qaXMgZGVmaW5pdGlvbiovKTsKLSAgICBwcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KGZpbGUsIHRhYmxlLCAwLyogaGF2ZSBzdG9wIGFyZ3VtZW50ICovKTsKLQotICAgIHByaW50X2lkZWNvZGVfcnVuX2Z1bmN0aW9uX2hlYWRlcihmaWxlLCAxLypjYW4gc3RvcCovLCAwLyppcyBkZWZpbml0aW9uKi8pOwotICAgIHByaW50X3J1bl91bnRpbF9zdG9wX2JvZHkoZmlsZSwgdGFibGUsIDEvKiBubyBzdG9wIGFyZ3VtZW50ICovKTsKLQotICB9Ci0gIGVsc2UgaWYgKChjb2RlICYgZ2VuZXJhdGVfanVtcHMpKSB7Ci0KLSAgICBwcmludF9pZGVjb2RlX3J1bl9mdW5jdGlvbl9oZWFkZXIoZmlsZSwgMC8qY2FuIHN0b3AqLywgMC8qaXMgZGVmaW5pdGlvbiovKTsKLSAgICBwcmludF9qdW1wX3VudGlsX3N0b3BfYm9keShmaWxlLCB0YWJsZSwgY2FjaGVfcnVsZXMsIDAgLyogaGF2ZSBzdG9wIGFyZ3VtZW50ICovKTsKLQotICAgIHByaW50X2lkZWNvZGVfcnVuX2Z1bmN0aW9uX2hlYWRlcihmaWxlLCAxLypjYW4gc3RvcCovLCAwLyppcyBkZWZpbml0aW9uKi8pOwotICAgIHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KGZpbGUsIHRhYmxlLCBjYWNoZV9ydWxlcywgMS8qIGhhdmUgc3RvcCBhcmd1bWVudCAqLyk7Ci0KLSAgfQotICBlbHNlIHsKLSAgICBlcnJvcigiU29tZXRoaW5nIGlzIHdyb25nIVxuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLWlkZWNvZGUuaCBiL3NpbS9wcGMvZ2VuLWlkZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2Mzc2Yi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2dlbi1pZGVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotZXh0ZXJuIHZvaWQgZ2VuX2lkZWNvZGVfaAotKGxmICpmaWxlLAotIGluc25fdGFibGUgKnRhYmxlLAotIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcyk7Ci0KLWV4dGVybiB2b2lkIGdlbl9pZGVjb2RlX2MKLShsZiAqZmlsZSwKLSBpbnNuX3RhYmxlICp0YWJsZSwKLSBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpOwotCi0KLS8qIE91dHB1dCBjb2RlIHRvIGRvIGFueSBmaW5hbCBjaGVja3Mgb24gdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24uCi0gICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHZlcmlmeWluZyBhbnkgb24gZGVjb2RlZCBmaWVsZHMgaGF2ZSB0aGUKLSAgIGNvcnJlY3QgdmFsdWUgYW5kIGNoZWNraW5nIHRoYXQgKGZvciBmbG9hdGluZyBwb2ludCkgZmxvYXRpbmcgcG9pbnQKLSAgIGhhcmR3YXJlIGlzbid0IGRpc2FibGVkICovCi0KLWV4dGVybiB2b2lkIHByaW50X2lkZWNvZGVfdmFsaWRhdGUKLShsZiAqZmlsZSwKLSBpbnNuICppbnN0cnVjdGlvbiwKLSBvcGNvZGVfZmllbGQgKm9wY29kZXMpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taXRhYmxlLmMgYi9zaW0vcHBjL2dlbi1pdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyYWEyOS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2dlbi1pdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJpZ2VuLmgiCi0jaW5jbHVkZSAiZ2VuLWl0YWJsZS5oIgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotCi0KLXN0YXRpYyB2b2lkCi1pdGFibGVfaF9pbnNuKGluc25fdGFibGUgKmVudHJ5LAotCSAgICAgIGxmICpmaWxlLAotCSAgICAgIHZvaWQgKmRhdGEsCi0JICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JICAgICAgaW50IGRlcHRoKQotewotICBsZl9wcmludGYoZmlsZSwgIiAgIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkgICAgICBOVUxMLAotCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUpOwotICBsZl9wcmludGYoZmlsZSwgIixcbiIpOwotfQotCi0KLWV4dGVybiB2b2lkIAotZ2VuX2l0YWJsZV9oKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKLXsKLSAgLyogb3V0cHV0IGFuIGVudW1lcmF0ZWQgdHlwZSBmb3IgZWFjaCBpbnN0cnVjdGlvbiAqLwotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKLSAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAotCQkJICAgZmlsZSwgTlVMTCwKLQkJCSAgIGl0YWJsZV9oX2luc24pOwotICBsZl9wcmludGYoZmlsZSwgIiAgbnJfaXRhYmxlX2VudHJpZXMsXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9IGl0YWJsZV9pbmRleDtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgLyogb3V0cHV0IHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gaW5mbyAqLwotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pdGFibGVfaW5zdHJ1Y3Rpb25faW5mbyB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGl0YWJsZV9pbmRleCBucjtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgY2hhciAqZm9ybWF0O1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpmb3JtO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpmbGFncztcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgY2hhciAqbW5lbW9uaWM7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGNoYXIgKm5hbWU7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGNoYXIgKmZpbGU7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBsaW5lX25yO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAifSBpdGFibGVfaW5mbztcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIGl0YWJsZV9pbmZvIGl0YWJsZVtucl9pdGFibGVfZW50cmllc107XG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1pdGFibGVfY19pbnNuKGluc25fdGFibGUgKmVudHJ5LAotCSAgICAgIGxmICpmaWxlLAotCSAgICAgIHZvaWQgKmRhdGEsCi0JICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JICAgICAgaW50IGRlcHRoKQotewotICBjaGFyICoqZmllbGRzID0gaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkczsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIHsgIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkgICAgICBOVUxMLAotCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUpOwotICBsZl9wcmludGYoZmlsZSwgIixcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9mb3JtYXRdKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgICAgXCIlc1wiLFxuIiwgZmllbGRzW2luc25fZm9ybV0pOwotICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9mbGFnc10pOwotICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9tbmVtb25pY10pOwotICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9uYW1lXSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAgIFwiJXNcIixcbiIsIGZpbHRlcl9maWxlbmFtZSAoaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpbGVfbmFtZSkpOwotICBsZl9wcmludGYoZmlsZSwgIiAgICAlZCxcbiIsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5saW5lX25yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgICAgfSxcbiIpOwotfQotCi0KLWV4dGVybiB2b2lkIAotZ2VuX2l0YWJsZV9jKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKLXsKLSAgLyogb3V0cHV0IHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gaW5mbyAqLwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaXRhYmxlLmhcIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJpdGFibGVfaW5mbyBpdGFibGVbbnJfaXRhYmxlX2VudHJpZXNdID0ge1xuIik7Ci0gIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKLQkJCSAgIGZpbGUsIE5VTEwsCi0JCQkgICBpdGFibGVfY19pbnNuKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1pdGFibGUuaCBiL3NpbS9wcGMvZ2VuLWl0YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFkYzY3Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZ2VuLWl0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotZXh0ZXJuIHZvaWQgZ2VuX2l0YWJsZV9oCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUpOwotCi1leHRlcm4gdm9pZCBnZW5faXRhYmxlX2MKLShpbnNuX3RhYmxlICp0YWJsZSwKLSBsZiAqZmlsZSk7CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1tb2RlbC5jIGIvc2ltL3BwYy9nZW4tbW9kZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjMTY3Ny4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2dlbi1tb2RlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJnZW4tbW9kZWwuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLW1vZGVsX2Nfb3JfaF9kYXRhKGluc25fdGFibGUgKnRhYmxlLAotCQkgIGxmICpmaWxlLAotCQkgIHRhYmxlX2VudHJ5ICpkYXRhKQotewotICBpZiAoZGF0YS0+YW5uZXgpIHsKLSAgICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBkYXRhKTsKLSAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGRhdGEtPmFubmV4KTsKLSAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotbW9kZWxfY19vcl9oX2Z1bmN0aW9uKGluc25fdGFibGUgKmVudHJ5LAotCQkgICAgICBsZiAqZmlsZSwKLQkJICAgICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uLAotCQkgICAgICBjaGFyICpwcmVmaXgpCi17Ci0gIGlmIChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdID09IE5VTEwKLSAgICAgIHx8IGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV1bMF0gPT0gJ1wwJykgewotICAgIGVycm9yKCJNb2RlbCBmdW5jdGlvbiB0eXBlIG5vdCBzcGVjaWZpZWQgZm9yICVzIiwgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSk7Ci0gIH0KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV0sIHByZWZpeCwgIiAiKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIlc1xuKCVzKTtcbiIsCi0JICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0sCi0JICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fcGFyYW1dKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi12b2lkIAotZ2VuX21vZGVsX2goaW5zbl90YWJsZSAqdGFibGUsIGxmICpmaWxlKQotewotICBpbnNuICppbnNuX3B0cjsKLSAgbW9kZWwgKm1vZGVsX3B0cjsKLSAgaW5zbiAqbWFjcm87Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBtb2RlbF9jcmVhdGVfcCA9IDA7Ci0gIGludCBtb2RlbF9pbml0X3AgPSAwOwotICBpbnQgbW9kZWxfaGFsdF9wID0gMDsKLSAgaW50IG1vZGVsX21vbl9pbmZvX3AgPSAwOwotICBpbnQgbW9kZWxfbW9uX2luZm9fZnJlZV9wID0gMDsKLQotICBmb3IobWFjcm8gPSBtb2RlbF9tYWNyb3M7IG1hY3JvOyBtYWNybyA9IG1hY3JvLT5uZXh0KSB7Ci0gICAgbW9kZWxfY19vcl9oX2RhdGEodGFibGUsIGZpbGUsIG1hY3JvLT5maWxlX2VudHJ5KTsKLSAgfQotCi0gIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBlbnVtIF9tb2RlbF9lbnVtIHtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiAgTU9ERUxfTk9ORSxcbiIpOwotICBmb3IgKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgTU9ERUxfJXMsXG4iLCBtb2RlbF9wdHItPm5hbWUpOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBucl9tb2RlbHNcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIn0gbW9kZWxfZW51bTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIERFRkFVTFRfTU9ERUwgTU9ERUxfJXNcbiIsIChtb2RlbHMpID8gbW9kZWxzLT5uYW1lIDogIk5PTkUiKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2RhdGEgbW9kZWxfZGF0YTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9tb2RlbF90aW1lIG1vZGVsX3RpbWU7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIG1vZGVsX2VudW0gY3VycmVudF9tb2RlbDtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyICptb2RlbF9uYW1lWyAoaW50KW5yX21vZGVscyBdO1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0ICpjb25zdCBtb2RlbF9mdW5jX3VuaXRfbmFtZVsgKGludClucl9tb2RlbHMgXTtcbiIpOwotICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBtb2RlbF90aW1lICpjb25zdCBtb2RlbF90aW1lX21hcHBpbmdbIChpbnQpbnJfbW9kZWxzIF07XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIGZvcihpbnNuX3B0ciA9IG1vZGVsX2Z1bmN0aW9uczsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX29yX2hfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiSU5MSU5FX01PREVMIik7Ci0gICAgbmFtZSA9IGluc25fcHRyLT5maWxlX2VudHJ5LT5maWVsZHNbZnVuY3Rpb25fbmFtZV07Ci0gICAgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2NyZWF0ZSIpID09IDApCi0gICAgICBtb2RlbF9jcmVhdGVfcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfaW5pdCIpID09IDApCi0gICAgICBtb2RlbF9pbml0X3AgPSAxOwotICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2hhbHQiKSA9PSAwKQotICAgICAgbW9kZWxfaGFsdF9wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mbyIpID09IDApCi0gICAgICBtb2RlbF9tb25faW5mb19wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mb19mcmVlIikgPT0gMCkKLSAgICAgIG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDE7Ci0gIH0KLQotICBpZiAoIW1vZGVsX2NyZWF0ZV9wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfZGF0YSAqIiwgIklOTElORV9NT0RFTCIsICIgIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9jcmVhdGVcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiKGNwdSAqcHJvY2Vzc29yKTtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotCi0gIGlmICghbW9kZWxfaW5pdF9wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiICIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfaW5pdFxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyKTtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotCi0gIGlmICghbW9kZWxfaGFsdF9wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiICIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfaGFsdFxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyKTtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgfQotCi0gIGlmICghbW9kZWxfbW9uX2luZm9fcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX3ByaW50ICoiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX21vbl9pbmZvXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIihtb2RlbF9kYXRhICptb2RlbF9wdHIpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9tb25faW5mb19mcmVlX3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICIgIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mb19mcmVlXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIihtb2RlbF9kYXRhICptb2RlbF9wdHIsXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiBtb2RlbF9wcmludCAqaW5mb19wdHIpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiICIpOwotICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX3NldFxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiKGNvbnN0IGNoYXIgKm5hbWUpO1xuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCBfbW9kZWxfY19wYXNzZWRfZGF0YSBtb2RlbF9jX3Bhc3NlZF9kYXRhOwotc3RydWN0IF9tb2RlbF9jX3Bhc3NlZF9kYXRhIHsKLSAgbGYgKmZpbGU7Ci0gIG1vZGVsICptb2RlbF9wdHI7Ci19OwotCi1zdGF0aWMgdm9pZAotbW9kZWxfY19pbnNuKGluc25fdGFibGUgKmVudHJ5LAotCSAgICAgbGYgKnBob255X2ZpbGUsCi0JICAgICB2b2lkICpkYXRhLAotCSAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JICAgICBpbnQgZGVwdGgpCi17Ci0gIG1vZGVsX2NfcGFzc2VkX2RhdGEgKmRhdGFfcHRyID0gKG1vZGVsX2NfcGFzc2VkX2RhdGEgKilkYXRhOwotICBsZiAqZmlsZSA9IGRhdGFfcHRyLT5maWxlOwotICBjaGFyICpjdXJyZW50X25hbWUgPSBkYXRhX3B0ci0+bW9kZWxfcHRyLT5wcmludGFibGVfbmFtZTsKLSAgdGFibGVfbW9kZWxfZW50cnkgKm1vZGVsX3B0ciA9IGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5tb2RlbF9maXJzdDsKLQotICB3aGlsZSAobW9kZWxfcHRyKSB7Ci0gICAgaWYgKG1vZGVsX3B0ci0+ZmllbGRzW2luc25fbW9kZWxfbmFtZV0gPT0gY3VycmVudF9uYW1lKSB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIiAgeyAlLSpzIH0sICAvKiAlcyAqL1xuIiwKLQkJbWF4X21vZGVsX2ZpZWxkc19sZW4sCi0JCW1vZGVsX3B0ci0+ZmllbGRzW2luc25fbW9kZWxfZmllbGRzXSwKLQkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQ7Ci0gIH0KLQotICBsZl9wcmludGYoZmlsZSwgIiAgeyAlLSpzIH0sICAvKiAlcyAqL1xuIiwKLQkgICAgbWF4X21vZGVsX2ZpZWxkc19sZW4sCi0JICAgIGRhdGFfcHRyLT5tb2RlbF9wdHItPmluc25fZGVmYXVsdCwKLQkgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdKTsKLX0KLQotc3RhdGljIHZvaWQKLW1vZGVsX2NfZnVuY3Rpb24oaW5zbl90YWJsZSAqdGFibGUsCi0JCSBsZiAqZmlsZSwKLQkJIHRhYmxlX2VudHJ5ICpmdW5jdGlvbiwKLQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKLXsKLSAgaWYgKGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV0gPT0gTlVMTAotICAgICAgfHwgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXVswXSA9PSAnXDAnKSB7Ci0gICAgZXJyb3IoIk1vZGVsIGZ1bmN0aW9uIHJldHVybiB0eXBlIG5vdCBzcGVjaWZpZWQgZm9yICVzIiwgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSwgcHJlZml4LCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiVzKCVzKVxuIiwKLQkgICAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdLAotCSAgICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fcGFyYW1dKTsKLSAgfQotICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBmdW5jdGlvbik7Ci0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGlmIChmdW5jdGlvbi0+YW5uZXgpIHsKLSAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOwotICAgIGxmX3ByaW50X19jX2NvZGUoZmlsZSwgZnVuY3Rpb24tPmFubmV4KTsKLSAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOwotICB9Ci0gIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gIGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UoZmlsZSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotdm9pZCAKLWdlbl9tb2RlbF9jKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKLXsKLSAgaW5zbiAqaW5zbl9wdHI7Ci0gIG1vZGVsICptb2RlbF9wdHI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBtb2RlbF9jcmVhdGVfcCA9IDA7Ci0gIGludCBtb2RlbF9pbml0X3AgPSAwOwotICBpbnQgbW9kZWxfaGFsdF9wID0gMDsKLSAgaW50IG1vZGVsX21vbl9pbmZvX3AgPSAwOwotICBpbnQgbW9kZWxfbW9uX2luZm9fZnJlZV9wID0gMDsKLQotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcIm1vbi5oXCJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2lmZGVmIEhBVkVfU1RETElCX0hcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLQotICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9kYXRhOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2Nfb3JfaF9kYXRhKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSk7Ci0gIH0KLQotICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9zdGF0aWM7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7Ci0gICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIi8qaCovU1RBVElDIik7Ci0gIH0KLQotICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9pbnRlcm5hbDsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX29yX2hfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiU1RBVElDX0lOTElORV9NT0RFTCIpOwotICB9Ci0KLSAgZm9yKGluc25fcHRyID0gbW9kZWxfc3RhdGljOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiLypjKi9TVEFUSUMiKTsKLSAgfQotCi0gIGZvcihpbnNuX3B0ciA9IG1vZGVsX2ludGVybmFsOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiU1RBVElDX0lOTElORV9NT0RFTCIpOwotICB9Ci0KLSAgZm9yKGluc25fcHRyID0gbW9kZWxfZnVuY3Rpb25zOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgewotICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiSU5MSU5FX01PREVMIik7Ci0gICAgbmFtZSA9IGluc25fcHRyLT5maWxlX2VudHJ5LT5maWVsZHNbZnVuY3Rpb25fbmFtZV07Ci0gICAgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2NyZWF0ZSIpID09IDApCi0gICAgICBtb2RlbF9jcmVhdGVfcCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfaW5pdCIpID09IDApCi0gICAgICBtb2RlbF9pbml0X3AgPSAxOwotICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2hhbHQiKSA9PSAwKQotICAgICAgbW9kZWxfaGFsdF9wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mbyIpID09IDApCi0gICAgICBtb2RlbF9tb25faW5mb19wID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mb19mcmVlIikgPT0gMCkKLSAgICAgIG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDE7Ci0gIH0KLQotICBpZiAoIW1vZGVsX2NyZWF0ZV9wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfZGF0YSAqIiwgIklOTElORV9NT0RFTCIsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfY3JlYXRlKGNwdSAqcHJvY2Vzc29yKVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgcmV0dXJuIChtb2RlbF9kYXRhICopMDtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9pbml0X3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfaW5pdChtb2RlbF9kYXRhICptb2RlbF9wdHIpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9oYWx0X3ApIHsKLSAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfaGFsdChtb2RlbF9kYXRhICptb2RlbF9wdHIpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgaWYgKCFtb2RlbF9tb25faW5mb19wKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfcHJpbnQgKiIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX21vbl9pbmZvKG1vZGVsX2RhdGEgKm1vZGVsX3B0cilcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIHJldHVybiAobW9kZWxfcHJpbnQgKikwO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLQotICBpZiAoIW1vZGVsX21vbl9pbmZvX2ZyZWVfcCkgewotICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mb19mcmVlKG1vZGVsX2RhdGEgKm1vZGVsX3B0cixcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICAgICAgICAgICAgICBtb2RlbF9wcmludCAqaW5mb19wdHIpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICB9Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICIvKiBJbnNuIGZ1bmN0aW9uYWwgdW5pdCBpbmZvICovXG4iKTsKLSAgZm9yKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKLSAgICBtb2RlbF9jX3Bhc3NlZF9kYXRhIGRhdGE7Ci0KLSAgICBsZl9wcmludGYoZmlsZSwgInN0YXRpYyBjb25zdCBtb2RlbF90aW1lIG1vZGVsX3RpbWVfJXNbXSA9IHtcbiIsIG1vZGVsX3B0ci0+bmFtZSk7Ci0gICAgZGF0YS5maWxlID0gZmlsZTsKLSAgICBkYXRhLm1vZGVsX3B0ciA9IG1vZGVsX3B0cjsKLSAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCi0JCQkgICAgIE5VTEwsICh2b2lkICopJmRhdGEsCi0JCQkgICAgIG1vZGVsX2NfaW5zbik7Ci0KLSAgICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcZlxuIik7Ci0gIH0KLQotICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX0lOTElORV9DX1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiY29uc3QgbW9kZWxfdGltZSAqY29uc3QgbW9kZWxfdGltZV9tYXBwaW5nWyAoaW50KW5yX21vZGVscyBdID0ge1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICAoY29uc3QgbW9kZWxfdGltZSAqY29uc3QpMCxcbiIpOwotICBmb3IobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgewotICAgIGxmX3ByaW50ZihmaWxlLCAiICBtb2RlbF90aW1lXyVzLFxuIiwgbW9kZWxfcHRyLT5uYW1lKTsKLSAgfQotICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgbGZfcHJpbnRmKGZpbGUsICJcZlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiLyogbWFwIG1vZGVsIGVudW1lcmF0aW9uIGludG8gcHJpbnRhYmxlIHN0cmluZyAqL1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2lmbmRlZiBfSU5MSU5FX0NfXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJjb25zdCBjaGFyICptb2RlbF9uYW1lWyAoaW50KW5yX21vZGVscyBdID0ge1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiICBcIk5PTkVcIixcbiIpOwotICBmb3IgKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgXCIlc1wiLFxuIiwgbW9kZWxfcHRyLT5wcmludGFibGVfbmFtZSk7Ci0gIH0KLSAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7Ci0gIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfc2V0KGNvbnN0IGNoYXIgKm5hbWUpXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgaWYgKG1vZGVscykgewotICAgIGxmX3ByaW50ZihmaWxlLCAiICBtb2RlbF9lbnVtIG1vZGVsO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIGZvcihtb2RlbCA9IE1PREVMXyVzOyBtb2RlbCA8IG5yX21vZGVsczsgbW9kZWwrKykge1xuIiwgbW9kZWxzLT5uYW1lKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICBpZihzdHJjbXAobmFtZSwgbW9kZWxfbmFtZVttb2RlbF0pID09IDApIHtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgY3VycmVudF9tb2RlbCA9IG1vZGVsO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICByZXR1cm47XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICB9XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgfVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICBlcnJvcihcIlVua25vd24gbW9kZWwgJyUlcycsIE1vZGVscyB3aGljaCBhcmUga25vd24gYXJlOiUlc1xuXCIsXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgbmFtZSxcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICBcIiIpOwotICAgIGZvcihtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7Ci0gICAgICBsZl9wcmludGYoZmlsZSwgIlxcblxcdCVzIiwgbW9kZWxfcHRyLT5wcmludGFibGVfbmFtZSk7Ci0gICAgfQotICAgIGxmX3ByaW50ZihmaWxlLCAiXCIpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgIGVycm9yKFwiTm8gbW9kZWxzIGFyZSBjdXJyZW50bHkga25vd24gYWJvdXRcIik7XG4iKTsKLSAgfQotCi0gIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLW1vZGVsLmggYi9zaW0vcHBjL2dlbi1tb2RlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY1YTc1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZ2VuLW1vZGVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0KLWV4dGVybiB2b2lkIGdlbl9tb2RlbF9oCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUpOwotCi0KLWV4dGVybiB2b2lkIGdlbl9tb2RlbF9jCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4tc2VtYW50aWNzLmMgYi9zaW0vcHBjL2dlbi1zZW1hbnRpY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjMDYxMy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2dlbi1zZW1hbnRpY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0KLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibGYuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotI2luY2x1ZGUgImZpbHRlci5oIgotCi0jaW5jbHVkZSAibGQtZGVjb2RlLmgiCi0jaW5jbHVkZSAibGQtY2FjaGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJpZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCi0jaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0KLQotc3RhdGljIHZvaWQKLXByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlcihsZiAqZmlsZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpiYXNlbmFtZSwKLQkJCSAgICAgICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCQkgICAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi17Ci0gIGludCBpbmRlbnQ7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBTRU1BTlRJQ19GVU5DVElPTl9UWVBFLCAiRVhURVJOX1NFTUFOVElDUyIsCi0JCQkgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7Ci0gIGluZGVudCA9IHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLQkJCSAgICAgICBiYXNlbmFtZSwKLQkJCSAgICAgICBleHBhbmRlZF9iaXRzLAotCQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7Ci0gIGlmIChpc19mdW5jdGlvbl9kZWZpbml0aW9uKQotICAgIGxmX2luZGVudChmaWxlLCAraW5kZW50KTsKLSAgZWxzZQotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIoJXMpIiwgU0VNQU5USUNfRlVOQ1RJT05fRk9STUFMKTsKLSAgaWYgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi0gICAgbGZfaW5kZW50KGZpbGUsIC1pbmRlbnQpOwotICBlbHNlCi0gICAgbGZfcHJpbnRmKGZpbGUsICI7Iik7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotdm9pZAotcHJpbnRfc2VtYW50aWNfZGVjbGFyYXRpb24oaW5zbl90YWJsZSAqZW50cnksCi0JCQkgICBsZiAqZmlsZSwKLQkJCSAgIHZvaWQgKmRhdGEsCi0JCQkgICBpbnNuICppbnN0cnVjdGlvbiwKLQkJCSAgIGludCBkZXB0aCkKLXsKLSAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykgewotICAgIEFTU0VSVChlbnRyeS0+bnJfaW5zbiA9PSAxKTsKLSAgICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIoZmlsZSwKLQkJCQkgICBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCQkJICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCi0JCQkJICAgMC8qIGlzIG5vdCBmdW5jdGlvbiBkZWZpbml0aW9uKi8pOwotICB9Ci0gIGVsc2UgewotICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlcihmaWxlLAotCQkJCSAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCQkgICBOVUxMLAotCQkJCSAgIDAvKiBpcyBub3QgZnVuY3Rpb24gZGVmaW5pdGlvbiovKTsKLSAgfQotfQotCi0KLQwKLS8qIGdlbmVyYXRlIHRoZSBzZW1hbnRpY3MuYyBmaWxlICovCi0KLQotdm9pZAotcHJpbnRfaWRlY29kZV9pbGxlZ2FsKGxmICpmaWxlLAotCQkgICAgICBjb25zdCBjaGFyICpyZXN1bHQpCi17Ci0gIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSkKLSAgICBsZl9wcmludGYoZmlsZSwgImdvdG8gJXNfaWxsZWdhbDtcbiIsIChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpID8gImljYWNoZSIgOiAic2VtYW50aWMiKTsKLSAgZWxzZSBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpCi0gICAgbGZfcHJpbnRmKGZpbGUsICIlcyBpY2FjaGVfaWxsZWdhbCglcyk7XG4iLCByZXN1bHQsIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwpOwotICBlbHNlCi0gICAgbGZfcHJpbnRmKGZpbGUsICIlcyBzZW1hbnRpY19pbGxlZ2FsKCVzKTtcbiIsIHJlc3VsdCwgU0VNQU5USUNfRlVOQ1RJT05fQUNUVUFMKTsKLX0KLQotCi12b2lkCi1wcmludF9zZW1hbnRpY19ib2R5KGxmICpmaWxlLAotCQkgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JCSAgICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSAgICBvcGNvZGVfZmllbGQgKm9wY29kZXMpCi17Ci0gIHByaW50X2l0cmFjZShmaWxlLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSwgMC8qcHV0X3ZhbHVlX2luX2NhY2hlKi8pOwotCi0gIC8qIHZhbGlkYXRlIHRoZSBpbnN0cnVjdGlvbiwgaWYgYSBjYWNoZSB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSAqLwotICBpZiAoIShjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKQotICAgIHByaW50X2lkZWNvZGVfdmFsaWRhdGUoZmlsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZXMpOwotCi0gIC8qIGdlbmVyYXRlIHRoZSBwcm9maWxpbmcgY2FsbCAtIHRoaXMgaXMgZGVsYXllZCB1bnRpbCBhZnRlciB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gdmVyaWZpZWQgKi8KLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIi8qIG1vbml0b3Jpbmc6ICovXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJpZiAoV0lUSF9NT04gJiBNT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFKSB7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIgIG1vbl9pc3N1ZSgiKTsKLSAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkgICAgICBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCSAgICAgIE5VTEwsCi0JCSAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiLCBwcm9jZXNzb3IsIGNpYSk7XG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLQotICAvKiBnZW5lcmF0ZSB0aGUgY29kZSAob3IgYXQgbGVhc3Qgc29tZXRoaW5nICovCi0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIvKiBzZW1hbnRpY3M6ICovXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJuaWEgPSBjaWEgKyAlZDtcbiIsIGluc25fYml0X3NpemUgLyA4KTsKLSAgaWYgKGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5hbm5leCAhPSBOVUxMKSB7Ci0gICAgLyogdHJ1ZSBjb2RlICovCi0gICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnkpOwotICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gICAgbGZfaW5kZW50KGZpbGUsICsyKTsKLSAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5hbm5leCk7Ci0gICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOwotICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UoZmlsZSk7Ci0gIH0KLSAgZWxzZSBpZiAoaXRfaXMoIm5vcCIsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBhYm9ydCBzbyBpdCBpcyBpbXBsZW1lbnRlZCBub3cgKi8KLSAgICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSk7Ci0gICAgbGZfcHV0c3RyKGZpbGUsICJlcnJvcihcIiVzOiVkOjB4JTA4bHg6JXMgdW5pbXBsZW1lbnRlZFxcblwiLFxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICBpdGFibGVbTVlfSU5ERVhdLmZpbGUsIGl0YWJsZVtNWV9JTkRFWF0ubGluZV9uciwgKGxvbmcpY2lhLCBpdGFibGVbTVlfSU5ERVhdLm5hbWUpO1xuIik7Ci0gICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY19zZW1hbnRpYyhsZiAqZmlsZSwKLQkJIGluc24gKmluc3RydWN0aW9uLAotCQkgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkgb3Bjb2RlX2ZpZWxkICpvcGNvZGVzLAotCQkgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQotewotCi0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0KLSAgcHJpbnRfbXlfZGVmaW5lcyhmaWxlLCBleHBhbmRlZF9iaXRzLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKLQkJICAgIGluc3RydWN0aW9uLAotCQkgICAgZXhwYW5kZWRfYml0cywKLQkJICAgIGNhY2hlX3J1bGVzLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzKQotCQkgICAgID8gZGVmaW5lX3ZhcmlhYmxlcwotCQkgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAotCQkgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCi0JCSAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCi0JCSAgICAgOiBkb19ub3RfdXNlX2ljYWNoZSkpOwotCi0gIGxmX3ByaW50ZihmaWxlLCAidW5zaWduZWRfd29yZCBuaWE7XG4iKTsKLSAgcHJpbnRfc2VtYW50aWNfYm9keShmaWxlLAotCQkgICAgICBpbnN0cnVjdGlvbiwKLQkJICAgICAgZXhwYW5kZWRfYml0cywKLQkJICAgICAgb3Bjb2Rlcyk7Ci0gIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuIG5pYTtcbiIpOwotCi0gIC8qIGdlbmVyYXRlIHNvbWV0aGluZyB0byBjbGVhbiB1cCBhbnkgI2RlZmluZXMgY3JlYXRlZCBmb3IgdGhlIGNhY2hlICovCi0gIGlmIChjb2RlICYgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzKQotICAgIHByaW50X2ljYWNoZV9ib2R5KGZpbGUsCi0JCSAgICAgIGluc3RydWN0aW9uLAotCQkgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICBjYWNoZV9ydWxlcywKLQkJICAgICAgdW5kZWZfdmFyaWFibGVzLAotCQkgICAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkKLQkJICAgICAgID8gZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZQotCQkgICAgICAgOiBkb19ub3RfdXNlX2ljYWNoZSkpOwotCi0gIGxmX2luZGVudChmaWxlLCAtMik7Ci0gIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jX3NlbWFudGljX2Z1bmN0aW9uKGxmICpmaWxlLAotCQkJICBpbnNuICppbnN0cnVjdGlvbiwKLQkJCSAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkJICBvcGNvZGVfZmllbGQgKm9wY29kZXMsCi0JCQkgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcykKLXsKLSAgLyogYnVpbGQgdGhlIHNlbWFudGljIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKGZpbGUsCi0JCQkJIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLQkJCQkgZXhwYW5kZWRfYml0cywKLQkJCQkgMS8qaXMtZnVuY3Rpb24tZGVmaW5pdGlvbiovKTsKLSAgcHJpbnRfY19zZW1hbnRpYyhmaWxlLAotCQkgICBpbnN0cnVjdGlvbiwKLQkJICAgZXhwYW5kZWRfYml0cywKLQkJICAgb3Bjb2RlcywKLQkJICAgY2FjaGVfcnVsZXMpOwotfQotCi12b2lkCi1wcmludF9zZW1hbnRpY19kZWZpbml0aW9uKGluc25fdGFibGUgKmVudHJ5LAotCQkJICBsZiAqZmlsZSwKLQkJCSAgdm9pZCAqZGF0YSwKLQkJCSAgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JCQkgIGludCBkZXB0aCkKLXsKLSAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzID0gKGNhY2hlX3RhYmxlKilkYXRhOwotICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKSB7Ci0gICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKLQkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKLQkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKLQkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKLQkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKLQkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKLQkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTAotCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlICE9IE5VTEwpOwotICAgIHByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24oZmlsZSwKLQkJCSAgICAgIGVudHJ5LT5pbnNucywKLQkJCSAgICAgIGVudHJ5LT5leHBhbmRlZF9iaXRzLAotCQkJICAgICAgZW50cnktPnBhcmVudC0+b3Bjb2RlLAotCQkJICAgICAgY2FjaGVfcnVsZXMpOwotICB9Ci0gIGVsc2UgewotICAgIHByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24oZmlsZSwgaW5zdHJ1Y3Rpb24sCi0JCQkgICAgICBOVUxMLCBOVUxMLAotCQkJICAgICAgY2FjaGVfcnVsZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1zZW1hbnRpY3MuaCBiL3NpbS9wcGMvZ2VuLXNlbWFudGljcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI1NzE1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZ2VuLXNlbWFudGljcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogQ3JlYXRlcyB0aGUgZmlsZXMgc2VtYW50aWNzLltoY10uCi0KLSAgIFRoZSBnZW5lcmF0ZWQgZmlsZSBzZW1hbnRpY3MgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgaW1wbGVtZW50IHRoZQotICAgb3BlcmF0aW9ucyByZXF1aXJlZCB0byBtb2RlbCBhIHNpbmdsZSB0YXJnZXQgcHJvY2Vzc29yIGluc3RydWN0aW9uLgotCi0gICBTZXZlcmFsIGRpZmZlcmVudCB2YXJpYXRpb25zIG9uIHRoZSBzZW1hbnRpY3MgZmlsZSBjYW4gYmUgY3JlYXRlZDoKLQotCW8JdW5jYWNoZWQKLQotICAgICAgICAJTm8gaW5zdHJ1Y3Rpb24gY2FjaGUgZXhpc3RzLiAgVGhlIHNlbWFudGljIGZ1bmN0aW9uCi0JCW5lZWRzIHRvIGdlbmVyYXRlIGFueSByZXF1aXJlZCB2YWx1ZXMgbG9jYWxseS4KLQotCW8JY2FjaGVkIC0gc2VwYXJhdGUgY3JhY2tlciBhbmQgc2VtYW50aWMKLQotCQlUd28gaW5kZXBlbmRhbnQgZnVuY3Rpb25zIGFyZSBjcmVhdGVkLiAgRmlyc3RseSB0aGUKLQkJZnVuY3Rpb24gdGhhdCBjcmFja3MgYW4gaW5zdHJ1Y3Rpb24gZW50ZXJpbmcgaXQgaW50byBhCi0JCWNhY2hlIGFuZCBzZWNvbmRseSB0aGUgc2VtYW50aWMgZnVuY3Rpb24gcHJvcHBlciB0aGF0Ci0JCXVzZXMgdGhlIGNhY2hlLgotCi0JbwljYWNoZWQgLSBzZW1hbnRpYyArIGNyYWNraW5nIHNlbWFudGljCi0KLQkJVGhlIGZ1bmN0aW9uIHRoYXQgY3JhY2tzIHRoZSBpbnN0cnVjdGlvbiBhbmQgZW50ZXJzCi0JCWFsbCB2YWx1ZXMgaW50byB0aGUgY2FjaGUgYWxzbyBjb250YWlucyBhIGNvcHkgb2YgdGhlCi0JCXNlbWFudGljIGNvZGUgKGF2b2lkaW5nIHRoZSBuZWVkIHRvIGNhbGwgYm90aCB0aGUKLQkJY3JhY2tlciBhbmQgdGhlIHNlbWFudGljIGZ1bmN0aW9uIHdoZW4gdGhlcmUgaXMgYQotCQljYWNoZSBtaXNzKS4KLQotICAgRm9yIGVhY2ggb2YgdGhlc2UgZ2VuZXJhbCBmb3Jtcywgc2V2ZXJhbCByZWZpbmVtZW50cyBjYW4gb2NjdXJlOgotCi0Jbwlkby9kb24ndCBkdXBsaWNhdGUvZXhwYW5kIHNlbWFudGljIGZ1bmN0aW9ucwotCi0JCUFzIGEgY29uc2VxdWVuY2Ugb2YgZGVjb2RpbmcgYW4gaW5zdHJ1Y3Rpb24sIHRoZQotCQlkZWNvZGVyLCBhcyBwYXJ0IG9mIGl0cyB0YWJsZSBtYXkgaGF2ZSBlZmZlY3Rpdmx5IG1hZGUKLQkJY2VydGFpbiBvZiB0aGUgdmFyaWFibGUgZmllbGRzIGluIGFuIGluc3RydWN0aW9uCi0JCWNvbnN0YW50LiBTZXBhcmF0ZSBmdW5jdGlvbnMgZm9yIGVhY2ggb2YgdGhlCi0JCWFsdGVybmF0aXZlIHZhbHVlcyBmb3Igd2hhdCB3b3VsZCBoYXZlIGJlZW4gdHJlYXRlZCBhcwotCQlhIHZhcmlhYmxlIHBhcnQgY2FuIGJlIGNyZWF0ZWQuCi0KLQlvCXVzZSBjYWNoZSBzdHJ1Y3QgZGlyZWN0bHkuCi0KLQkJV2hlbiBhIGNyYWNraW5nIGNhY2hlIGlzIHByZXNlbnQsIHRoZSBzZW1hbnRpYwotCQlmdW5jdGlvbnMgY2FuIGJlIGdlbmVyYXRlZCB0byBlaXRoZXIgaG9sZCBpbnRlcm1lZGlhdGUKLQkJY2FjaGUgdmFsdWVzIGluIGxvY2FsIHZhcmlhYmxlcyBvciBhbHdheXMgcmVmZXIgdG8gdGhlCi0JCWNvbnRlbnRzIG9mIHRoZSBjYWNoZSBkaXJlY3RseS4gKi8KLQotCi0KLWV4dGVybiBpbnNuX2hhbmRsZXIgcHJpbnRfc2VtYW50aWNfZGVjbGFyYXRpb247Ci1leHRlcm4gaW5zbl9oYW5kbGVyIHByaW50X3NlbWFudGljX2RlZmluaXRpb247Ci0KLWV4dGVybiB2b2lkIHByaW50X2lkZWNvZGVfaWxsZWdhbAotKGxmICpmaWxlLAotIGNvbnN0IGNoYXIgKnJlc3VsdCk7Ci0KLWV4dGVybiB2b2lkIHByaW50X3NlbWFudGljX2JvZHkKLShsZiAqZmlsZSwKLSBpbnNuICppbnN0cnVjdGlvbiwKLSBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0gb3Bjb2RlX2ZpZWxkICpvcGNvZGVzKTsKLQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4tc3VwcG9ydC5jIGIvc2ltL3BwYy9nZW4tc3VwcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVkZWMzLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvZ2VuLXN1cHBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLSNpbmNsdWRlICJsZC1jYWNoZS5oIgotI2luY2x1ZGUgImxkLWluc24uaCIKLQotI2luY2x1ZGUgImlnZW4uaCIKLQotI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKLSNpbmNsdWRlICJnZW4tc3VwcG9ydC5oIgotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKGxmICpmaWxlLAotCQkJICAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbiwKLQkJCSAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKLXsKLSAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBTRU1BTlRJQ19GVU5DVElPTl9UWVBFLCAiSU5MSU5FX1NVUFBPUlQiLAotCQkJICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7Ci0gICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkJZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSwKLQkJCU5VTEwsCi0JCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4oJXMpIiwgU0VNQU5USUNfRlVOQ1RJT05fRk9STUFMKTsKLSAgICBpZiAoIWlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCi0gICAgICBsZl9wcmludGYoZmlsZSwgIjsiKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLAotCQkJICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSwKLQkJCSAgICJJTkxJTkVfU1VQUE9SVCIsCi0JCQkgICAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA/ICJcbiIgOiAiICIpKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiVzXG4oJXMpJXMiLAotCSAgICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0sCi0JICAgICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9wYXJhbV0sCi0JICAgICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIjtcbiIpKTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1zdXBwb3J0X2hfZnVuY3Rpb24oaW5zbl90YWJsZSAqZW50cnksCi0JCSAgIGxmICpmaWxlLAotCQkgICB2b2lkICpkYXRhLAotCQkgICB0YWJsZV9lbnRyeSAqZnVuY3Rpb24pCi17Ci0gIEFTU0VSVChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdICE9IE5VTEwpOwotICBBU1NFUlQoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9wYXJhbV0gIT0gTlVMTCk7Ci0gIHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZShmaWxlLAotCQkJICAgICAgZnVuY3Rpb24sCi0JCQkgICAgICAwLyohaXNfZGVmaW5pdGlvbiovKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi0KLWV4dGVybiB2b2lkCi1nZW5fc3VwcG9ydF9oKGluc25fdGFibGUgKnRhYmxlLAotCSAgICAgIGxmICpmaWxlKQotewotICAvKiBvdXRwdXQgYSBkZWNsYXJhdGlvbiBmb3IgYWxsIGZ1bmN0aW9ucyAqLwotICBpbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uKHRhYmxlLAotCQkJICAgICAgIGZpbGUsIE5VTEwsCi0JCQkgICAgICAgc3VwcG9ydF9oX2Z1bmN0aW9uKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiNpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSlcbiIpOwotICBsZl9wcmludGYoZmlsZSwgIiMgaW5jbHVkZSBcInN1cHBvcnQuY1wiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotc3VwcG9ydF9jX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAotCQkgICBsZiAqZmlsZSwKLQkJICAgdm9pZCAqZGF0YSwKLQkJICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uKQotewotICBBU1NFUlQoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSAhPSBOVUxMKTsKLSAgcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKGZpbGUsCi0JCQkgICAgICBmdW5jdGlvbiwKLQkJCSAgICAgIDEvKiFpc19kZWZpbml0aW9uKi8pOwotICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBmdW5jdGlvbik7Ci0gIGxmX3ByaW50ZihmaWxlLCAie1xuIik7Ci0gIGxmX2luZGVudChmaWxlLCArMik7Ci0gIGxmX3ByaW50X19jX2NvZGUoZmlsZSwgZnVuY3Rpb24tPmFubmV4KTsKLSAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJlcnJvcihcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiAwO1xuIik7Ci0gIH0KLSAgbGZfaW5kZW50KGZpbGUsIC0yKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKLSAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi0KLXZvaWQKLWdlbl9zdXBwb3J0X2MoaW5zbl90YWJsZSAqdGFibGUsCi0JICAgICAgbGYgKmZpbGUpCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGUuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInN1cHBvcnQuaFwiXG4iKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gIC8qIG91dHB1dCBhIGRlZmluaXRpb24gKGMtY29kZSkgZm9yIGFsbCBmdW5jdGlvbnMgKi8KLSAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBOVUxMLAotCQkJICAgICAgIHN1cHBvcnRfY19mdW5jdGlvbik7Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1zdXBwb3J0LmggYi9zaW0vcHBjL2dlbi1zdXBwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODYyZDcuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9nZW4tc3VwcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotZXh0ZXJuIHZvaWQgZ2VuX3N1cHBvcnRfaAotKGluc25fdGFibGUgKnRhYmxlLAotIGxmICpmaWxlKTsKLQotZXh0ZXJuIHZvaWQgZ2VuX3N1cHBvcnRfYwotKGluc25fdGFibGUgKnRhYmxlLAotIGxmICpmaWxlKTsKLQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19jb20uYyBiL3NpbS9wcGMvaHdfY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjIzMjIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19jb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19DT01fQ18KLSNkZWZpbmUgX0hXX0NPTV9DXwotCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkVfSFdfQ09NCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkVfSFdfQ09NIFNUQVRJQ19JTkxJTkUKLSNlbmRpZgotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKiBERVZJQ0UKLSAgIAotCi0gICBjb20gLSAnNTUwIGNvbXBhdGlibGUgc2VyaWFsIGRldmljZQotICAgCi0KLSAgIERFU0NSSVBUSU9OCi0gICAKLQotICAgTW9kZWxzIHRoZSBiYXNpY3Mgb2YgdGhlIDggcmVnaXN0ZXIgJzU1MCBzZXJpYWwgZGV2aWNlLiAgVGhlIG1vZGVsIAotICAgaW5jbHVkZXMgYW4gaW50ZXJydXB0IGxpbmUsIGlucHV0IGFuZCBvdXRwdXQgZmlmb3MsIGFuZCBzdGF0dXMgCi0gICBpbmZvcm1hdGlvbi4KLQotICAgSW5kZXBlbmRlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgZGV2aWNlcyBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgaXMgCi0gICBhbGxvd2VkOiB1c2UgZWl0aGVyIHRoZSBjb25zb2xlIG9yIGEgZmlsZSAoYnVmZmVyZWQgb3IgdW5idWZmZXJlZCkgYXMgCi0gICB0aGUgZGF0YSBzb3VyY2Uvc2luazsgc3BlY2lmeSB0aGUgcmVhbC10aW1lIGRlbGF5IGJldHdlZW4gZWFjaCBjaGFyYWN0ZXIgCi0gICB0cmFuc2Zlci4KLQotICAgV2hlbiB0aGUgZGV2aWNlcyBpbnB1dCBzdHJlYW0gaXMgYmVpbmcgdGFrZW4gZnJvbSBhIGZpbGUsIHRoZSBlbmQgb2YgCi0gICBmaWxlIGlzIHNpZ25hbGVkIGJ5IGEgbG9zcyBvZiBjYXJyaWVyICh0aGUgbG9zcyBvZiBjYXJyaWVyIG1heSBiZSAKLSAgIGluY29ycmVjdGx5IHByb2NlZWRlZCBieSBhIHNpbmdsZSBudWxsIGNoYXJhY3RlcikuCi0gICAKLQotICAgUFJPUEVSVElFUwotICAgCi0KLSAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gLi4uIChvcHRpb25hbCAtIG5vdGUgMSkKLQotICAgTGlzdCBvZiA8YWRkcmVzcz4gPHNpemU+IHBhaXJzLiAgRWFjaCBwYWlyIHNwZWNpZmllcyBhbiBhZGRyZXNzIGZvcgotICAgdGhlIGRldmljZXMgOCByZWdpc3RlcnMuICBUaGUgYWRkcmVzcyBzaG91bGQgYmUgOCBieXRlIGFsaWduZWQuCi0KLQotICAgYWx0ZXJuYXRlLXJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gLi4uIChvcHRpb25hbCAtIG5vdGUgMSkKLQotICAgQWx0ZXJuYXRpdmUgYWRkcmVzZXMgZm9yIHRoZSByZWdpc3RlcnMuCi0KLQotICAgYXNzaWduZWQtYWRkcmVzc2VzID0gPGFkZHJlc3M+IDxzaXplPiAuLi4gKG9wdGlvbmFsIC0gbm90ZSAxKQotICAgCi0gICBPbiBhIFBDSSBidXMsIHRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBhZGRyZXNzZXMgYXNzaWduZWQgdG8gdGhlIAotICAgZGV2aWNlLiAgVGhlIHZhbHVlcyByZWZsZWN0IHRoZSBkZXZpY2VzIGNvbmZpZ3VyYXRpb24gYmFzZSByZWdpc3RlcnMuCi0gICAKLSAgIE5vdGUgMTogQXQgbGVhc3Qgb25lIG9mICJhc3NpZ25lZC1hZGRyZXNzZXMiLCAicmVnIiBvciAiYWx0ZXJuYXRpdmUtcmVnIiAKLSAgIG11c3QgYmUgc3BlY2lmaWVkLiAgSWYgImFzc2lnbmVkLWFkZHJlc3NlcyIgaXMgc3BlY2lmaWVkIHRoZSBvdGhlciAKLSAgIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbnMgYXJlIGlnbm9yZWQuCi0gICAKLSAgIAotICAgaW5wdXQtZmlsZSA9IDxmaWxlLW5hbWU+IChvcHRpb25hbCkKLQotICAgRmlsZSB0byB0YWtlIGFsbCBzZXJpYWwgcG9ydCBpbnB1dCBmcm9tIChpbnN0ZWFkIG9mIHRoZSBzaW11bGF0aW9uCi0gICBjb25zb2xlKS4KLQotCi0gICBvdXRwdXQtZmlsZSA9IDxmaWxlLW5hbWU+IChvcHRpb25hbCkKLQotICAgRmlsZSB0byBzZW5kIGFsbCBvdXRwdXQgdG8gKGluc3RlYWQgb2YgdGhlIHNpbXVsYXRpb24gY29uc29sZSkuCi0KLQotICAgaW5wdXQtYnVmZmVyaW5nID0gInVuYnVmZmVyZWQiIChvcHRpb25hbCkKLQotICAgU3BlY2lmeWluZyAidW5idWZmZXJlZCIgYnVmZmVyaW5nIGRpc2FibGVzIGJ1ZmZlcmluZyBvbiB0aGUgc2VyaWFsCi0gICBkZXZpY2VzIGlucHV0IHN0cmVhbSAoYWxsIGRhdGEgaXMgaW1tZWRpYXRseSByZWFkKS4gIEluIHRoZSBmdXR1cmUsCi0gICB0aGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGlucHV0IGJ1ZmZlcmluZyBhbHRlcm5hdGl2ZXMuCi0KLQotICAgb3V0cHV0LWJ1ZmZlcmluZyA9ICJ1bmJ1ZmZlcmVkIiAob3B0aW9uYWwpCi0KLSAgIFNwZWNpZnlpbmcgInVuYnVmZmVyZWQiIGJ1ZmZlcmluZyBkaXNhYmxlcyBidWZmZXJpbmcgb24gdGhlIHNlcmlhbCAKLSAgIGRldmljZXMgb3V0cHV0IHN0cmVhbSAoYWxsIGRhdGEgaXMgaW1tZWRpYXRseSB3cml0dGVuKS4gIEluIHRoZSBmdXR1cmUsIAotICAgdGhpcyBvcHRpb24gbWF5IGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgb3RoZXIgYnVmZmVyaW5nIGFsdGVybmF0aXZlcy4KLQotCi0gICBpbnB1dC1kZWxheSA9IDxpbnRlZ2VyLWRlbGF5PiAob3B0aW9uYWwpCi0KLSAgIFNwZWNpZnkgdGhlIG51bWJlciBvZiB0aWNrcyBhZnRlciB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaGFzIGJlZW4KLSAgIHJlYWQgZnJvbSB0aGUgc2VyaWFsIHBvcnQgdGhhdCB0aGUgbmV4dCBjaGFyYWN0ZXIgYmVjb21lcwotICAgYXZhaWxhYmxlLgotCi0KLSAgIG91dHB1dC1kZWxheSA9IDxpbnRlZ2VyLWRlbGF5PiAob3B0aW9uYWwpCi0KLSAgIFNwZWNpZnkgdGhlIG51bWJlciBvZiB0aWNrcyBhZnRlciBhIGNoYXJhY3RlciBoYXMgYmVlbiB3cml0dGVuIHRvCi0gICB0aGUgZW1wdHkgb3V0cHV0IGZpZm8gdGhhdCB0aGUgZmlmbyBmaW5pc2hlcyBkcmFpbmluZy4gIEFueQotICAgY2hhcmFjdGVycyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlmbyBiZWZvcmUgaXQgaGFzIGRyYWluZWQgd2lsbAotICAgbm90IGJlIGxvc3QgYW5kIHdpbGwgc3RpbGwgYmUgZGlzcGxheWVkLgotCi0KLSAgIEVYQU1QTEVTCi0KLQotICAgfCAgL2lvYnVzQDB4ZjAwMDAwMDAvY29tQDB4MzAwMC9yZWcgMHgzMDAwIDgKLQotICAgQ3JlYXRlIGEgc2ltcGxlIGNvbnNvbGUgZGV2aWNlIGF0IGFkZHJlc3MgPDwweDMwMDA+PiB3aXRoaW4KLSAgIDw8aW9idXM+Pi4gIFNpbmNlIGlvYnVzIHN0YXJ0cyBhdCBhZGRyZXNzIDw8MHhmMDAwMDAwMD4+IHRoZQotICAgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgc2VyaWFsIHBvcnQgd2lsbCBiZSA8PDB4ZjAwMDMwMDA+Pi4KLQotICAgVGhlIGRldmljZSB3aWxsIGFsd2F5cyBiZSByZWFkeSBmb3IgSS9PIChubyBkZWxheSBwcm9wZXJ0aWVzIHNwZWNpZmllZCkgCi0gICBhbmQgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIHdpbGwgdXNlIHRoZSBzaW11bGF0aW9uIGNvbnNvbGUgCi0gICAobm8gZmlsZSBwcm9wZXJ0aWVzKS4KLQotCi0gICB8ICAkIHBzaW0gXAotICAgfCAgICAtbyAnL2NwdXMvY3B1QDAnIFwKLSAgIHwgICAgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2NvbUAweDQwMDAvcmVnIDB4NDAwMCA4JyBcCi0gICB8ICAgIC1vICcvaW9idXNAMHhmMDAwMDAwMC9jb21AMHg0MDAwL2lucHV0LWZpbGUgL2V0Yy9wYXNzd2QnIFwKLSAgIHwgICAgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2NvbUAweDQwMDAvaW5wdXQtZGVsYXkgMTAwMCcgXAotICAgfCAgICAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvY29tQDB4NDAwMCA+IDAgaW50IC9jcHVzL2NwdUAweDAnIFwKLSAgIHwgICAgcHNpbS10ZXN0L2h3LWNvbS9jYXQuYmUgMHhmMDAwNDAwMAotCi0gICBUaGUgc2VyaWFsIHBvcnQgKGF0IGFkZHJlc3MgPDwweGYwMDA0MDAwPj4gaXMgY29uZmlndXJlZCBzbyB0aGF0IGl0Ci0gICB0YWtlcyBpdHMgaW5wdXQgZnJvbSB0aGUgZmlsZSA8PC9ldGMvcGFzc3dkPj4gd2hpbGUgaXRzIG91dHB1dCBpcwotICAgYWxsb3dlZCB0byBhcHBlYXIgb24gdGhlIHNpbXVsYXRpb24gY29uc29sZS4KLSAgIAotICAgVGhlIG5vZGUgPDwvY3B1cy9jcHVAMD4+IHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCB0byBlbnN1cmUgdGhhdCBpdCBoYWQgCi0gICBiZWVuIGNyZWF0ZWQgYmVmb3JlIGFueSBpbnRlcnJ1cHRzIHdlcmUgYXR0YWNoZWQgdG8gaXQuCi0KLSAgIFRoZSBwcm9ncmFtIDw8cHNpbS10ZXN0L2h3LWNvbS9jYXQ+PiBjb3BpZXMgYW55IGNoYXJhY3RlcnMgb24gdGhlIHNlcmlhbCAKLSAgIHBvcnQncyBpbnB1dCAoPDwvZXRjL3Bhc3N3ZD4+KSB0byBpdHMgb3V0cHV0ICh0aGUgY29uc29sZSkuICAKLSAgIENvbnNlcXVlbnRseSwgdGhlIGFvdmUgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIAotICAgPDwvZXRjL3Bhc3N3ZD4+IG9uIHRoZSBzY3JlZW4uCi0KLQotICAgQlVHUwotCi0KLSAgIElFRUUgMTI3NSByZXF1aXJlcyB0aGF0IGEgZGV2aWNlIG9uIGEgUENJIGJ1cyBoYXZlLCBhcyBpdHMgZmlyc3QgcmVnIAotICAgZW50cnksIHRoZSBhZGRyZXNzIG9mIGl0cyBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycy4gIEN1cnJlbnRseSwgCi0gICB0aGlzIGRldmljZSBkb2VzIG5vdCBldmVuIGltcGxlbWVudCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KLSAgIAotICAgVGhpcyBtb2RlbCBkb2VzIG5vdCBhdHRlbXB0IHRvIG1vZGVsIHRoZSAnNTUwJ3MgaW5wdXQgYW5kIG91dHB1dCBmaWZvcy4gIAotICAgSW5zdGVhZCwgdGhlIGlucHV0IGZpZm8gaXMgbGltaXRlZCB0byBhIHNpbmdsZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLCAKLSAgIHdoaWxlIHRoZSBvdXRwdXQgZmlmbyBpcyBlZmZlY3Rpdmx5IGluZmluaXRlLiAgQ29uc2VxdWVudGx5LCB1bmxpa2UgdGhlIAotICAgJzU1MCwgdGhpcyBkZXZpY2Ugd2lsbCBub3QgZGlzY2FyZCBvdXRwdXQgY2hhcmFjdGVycyBvbmNlIGEgc3RyZWFtIG9mIDE2IAotICAgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGRhdGEgb3V0cHV0IHJlZ2lzdGVyLgotCi0gICBUaGUgaW5wdXQgYW5kIG91dHB1dCBjYW4gb25seSBiZSB0YWtlbiBmcm9tIGEgZmlsZSAob3IgdGhlIGN1cnJlbnQgCi0gICB0ZXJtaW5hbCBkZXZpY2UpLiAgSW4gdGhlIGZ1dHVyZSwgdGhlIDw8Y29tPj4gZGV2aWNlIHNob3VsZCBhbGxvdyB0aGUgCi0gICBzcGVjaWZpY2F0aW9uIG9mIG90aGVyIGRhdGEgc3RyZWFtcyAoc3VjaCBhcyBhbiB4dGVybSBvciBUSyB3aW5kb3cpLgotCi0gICBUaGUgaW5wdXQgYmxvY2tzIGlmIG5vIGRhdGEgaXMgYXZhaWxhYmxlLgotCi0gICBJbnRlcnJ1cHRzIGhhdmUgbm90IGJlZW4gdGVzdGVkLgotCi0gICAqLwotCi1lbnVtIHsKLSAgbWF4X2h3X2NvbV9yZWdpc3RlcnMgPSA4LAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2NvbV9wb3J0IHsKLSAgaW50IHJlYWR5OwotICBpbnQgZGVsYXk7Ci0gIGludCBpbnRlcnJ1cHRpbmc7Ci0gIEZJTEUgKmZpbGU7Ci19IGNvbV9wb3J0OwotCi10eXBlZGVmIHN0cnVjdCBfY29tX21vZGVtIHsKLSAgaW50IGNhcnJpZXI7Ci0gIGludCBjYXJyaWVyX2NoYW5nZWQ7Ci0gIGludCBpbnRlcnJ1cHRpbmc7Ci19IGNvbV9tb2RlbTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X2NvbV9kZXZpY2UgewotICBjb21fcG9ydCBpbnB1dDsKLSAgY29tX3BvcnQgb3V0cHV0OwotICBjb21fbW9kZW0gbW9kZW07Ci0gIGNoYXIgZGxhYlsyXTsKLSAgY2hhciByZWdbbWF4X2h3X2NvbV9yZWdpc3RlcnNdOwotICBpbnQgaW50ZXJydXB0aW5nOwotfSBod19jb21fZGV2aWNlOwotCi0KLXN0YXRpYyB2b2lkCi1od19jb21fZGV2aWNlX2luaXRfZGF0YShkZXZpY2UgKm1lKQotewotICBod19jb21fZGV2aWNlICpjb20gPSAoaHdfY29tX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICAvKiBjbGVhbiB1cCAqLwotICBpZiAoY29tLT5vdXRwdXQuZmlsZSAhPSBOVUxMKQotICAgIGZjbG9zZShjb20tPm91dHB1dC5maWxlKTsKLSAgaWYgKGNvbS0+aW5wdXQuZmlsZSAhPSBOVUxMKQotICAgIGZjbG9zZShjb20tPmlucHV0LmZpbGUpOwotICBtZW1zZXQoY29tLCAwLCBzaXplb2YoaHdfY29tX2RldmljZSkpOwotCi0gIC8qIHRoZSBmaWZvIHNwZWVkICovCi0gIGNvbS0+b3V0cHV0LmRlbGF5ID0gKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAib3V0cHV0LWRlbGF5IikgIT0gTlVMTAotCQkgICAgICAgPyBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAib3V0cHV0LWRlbGF5IikKLQkJICAgICAgIDogMCk7Ci0gIGNvbS0+aW5wdXQuZGVsYXkgPSAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJpbnB1dC1kZWxheSIpICE9IE5VTEwKLQkJICAgICAgPyBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiaW5wdXQtZGVsYXkiKQotCQkgICAgICA6IDApOwotCi0gIC8qIHRoZSBkYXRhIHNvdXJjZS9zaW5rICovCi0gIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImlucHV0LWZpbGUiKSAhPSBOVUxMKSB7Ci0gICAgY29uc3QgY2hhciAqaW5wdXRfZmlsZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgImlucHV0LWZpbGUiKTsKLSAgICBjb20tPmlucHV0LmZpbGUgPSBmb3BlbihpbnB1dF9maWxlLCAiciIpOwotICAgIGlmIChjb20tPmlucHV0LmZpbGUgPT0gTlVMTCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gb3BlbmluZyBpbnB1dCBmaWxlICVzXG4iLCBpbnB1dF9maWxlKTsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJpbnB1dC1idWZmZXJpbmciKSAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBjaGFyICpidWZmZXJpbmcgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJpbnB1dC1idWZmZXJpbmciKTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyaW5nLCAidW5idWZmZXJlZCIpID09IDApCi0Jc2V0YnVmKGNvbS0+aW5wdXQuZmlsZSwgTlVMTCk7Ci0gICAgfQotICB9Ci0gIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm91dHB1dC1maWxlIikgIT0gTlVMTCkgewotICAgIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAib3V0cHV0LWZpbGUiKTsKLSAgICBjb20tPm91dHB1dC5maWxlID0gZm9wZW4ob3V0cHV0X2ZpbGUsICJ3Iik7Ci0gICAgaWYgKGNvbS0+aW5wdXQuZmlsZSA9PSBOVUxMKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBvcGVuaW5nIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRfZmlsZSk7Ci0gICAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAib3V0cHV0LWJ1ZmZlcmluZyIpICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcmluZyA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgIm91dHB1dC1idWZmZXJpbmciKTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyaW5nLCAidW5idWZmZXJlZCIpID09IDApCi0Jc2V0YnVmKGNvbS0+b3V0cHV0LmZpbGUsIE5VTEwpOwotICAgIH0KLSAgfQotCi0gIC8qIHJlYWR5IGZyb20gdGhlIHN0YXJ0ICovCi0gIGNvbS0+aW5wdXQucmVhZHkgPSAxOwotICBjb20tPm1vZGVtLmNhcnJpZXIgPSAxOwotICBjb20tPm91dHB1dC5yZWFkeSA9IDE7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXVwZGF0ZV9jb21faW50ZXJydXB0cyhkZXZpY2UgKm1lLAotCQkgICAgICBod19jb21fZGV2aWNlICpjb20pCi17Ci0gIGludCBpbnRlcnJ1cHRpbmc7Ci0gIGNvbS0+bW9kZW0uaW50ZXJydXB0aW5nID0gKGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkICYmIChjb20tPnJlZ1sxXSAmIDB4ODApKTsKLSAgY29tLT5pbnB1dC5pbnRlcnJ1cHRpbmcgPSAoY29tLT5pbnB1dC5yZWFkeSAmJiAoY29tLT5yZWdbMV0gJiAweDEpKTsKLSAgY29tLT5vdXRwdXQuaW50ZXJydXB0aW5nID0gKGNvbS0+b3V0cHV0LnJlYWR5ICYmIChjb20tPnJlZ1sxXSAmIDB4MikpOwotICBpbnRlcnJ1cHRpbmcgPSAoY29tLT5pbnB1dC5pbnRlcnJ1cHRpbmcKLQkJICB8fCBjb20tPm91dHB1dC5pbnRlcnJ1cHRpbmcKLQkJICB8fCBjb20tPm1vZGVtLmludGVycnVwdGluZyk7Ci0KLSAgaWYgKGludGVycnVwdGluZykgewotICAgIGlmICghY29tLT5pbnRlcnJ1cHRpbmcpIHsKLSAgICAgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIDAgLypwb3J0Ki8sIDEgLyp2YWx1ZSovLCBOVUxMLCAwKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSAvKiFpbnRlcnJ1cHRpbmcqLyB7Ci0gICAgaWYgKGNvbS0+aW50ZXJydXB0aW5nKQotICAgICAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgMCAvKnBvcnQqLywgMCAvKnZhbHVlKi8sIE5VTEwsIDApOwotICB9Ci0gIGNvbS0+aW50ZXJydXB0aW5nID0gaW50ZXJydXB0aW5nOwotfQotCi0KLXN0YXRpYyB2b2lkCi1tYWtlX3JlYWRfcmVhZHkodm9pZCAqZGF0YSkKLXsKLSAgZGV2aWNlICptZSA9IChkZXZpY2UqKWRhdGE7Ci0gIGh3X2NvbV9kZXZpY2UgKmNvbSA9IChod19jb21fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGNvbS0+aW5wdXQucmVhZHkgPSAxOwotICB1cGRhdGVfY29tX2ludGVycnVwdHMobWUsIGNvbSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWFkX2NvbShkZXZpY2UgKm1lLAotCSBod19jb21fZGV2aWNlICpjb20sCi0JIHVuc2lnbmVkX3dvcmQgYSwKLQkgY2hhciB2YWxbMV0pCi17Ci0gIHVuc2lnbmVkX3dvcmQgYWRkciA9IGEgJSA4OwotCi0gIC8qIHRoZSBkaXZpc29yIGxhdGNoIGlzIHNwZWNpYWwgKi8KLSAgaWYgKGNvbS0+cmVnWzNdICYgMHg4ICYmIGFkZHIgPCAyKSB7Ci0gICAgKnZhbCA9IGNvbS0+ZGxhYlthZGRyXTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzd2l0Y2ggKGFkZHIpIHsKLSAgCi0gIGNhc2UgMDoKLSAgICAvKiBmaWZvICovCi0gICAgaWYgKCFjb20tPm1vZGVtLmNhcnJpZXIpCi0gICAgICAqdmFsID0gJ1wwJzsKLSAgICBpZiAoY29tLT5pbnB1dC5yZWFkeSkgewotICAgICAgLyogcmVhZCB0aGUgY2hhciBpbiAqLwotICAgICAgaWYgKGNvbS0+aW5wdXQuZmlsZSA9PSBOVUxMKSB7Ci0JaWYgKHNpbV9pb19yZWFkX3N0ZGluKHZhbCwgMSkgPCAwKQotCSAgY29tLT5tb2RlbS5jYXJyaWVyX2NoYW5nZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JaWYgKGZyZWFkKHZhbCwgMSwgMSwgY29tLT5pbnB1dC5maWxlKSA9PSAwKQotCSAgY29tLT5tb2RlbS5jYXJyaWVyX2NoYW5nZWQgPSAxOwotICAgICAgfQotICAgICAgLyogc2V0dXAgZm9yIG5leHQgcmVhZCAqLwotICAgICAgaWYgKGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkKSB7Ci0JLyogb25jZSBsb3N0IGNhcnJpZXIsIG5ldmVyIHJlYWR5ICovCi0JY29tLT5tb2RlbS5jYXJyaWVyID0gMDsKLQljb20tPmlucHV0LnJlYWR5ID0gMDsKLQkqdmFsID0gJ1wwJzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbS0+aW5wdXQuZGVsYXkgPiAwKSB7Ci0JY29tLT5pbnB1dC5yZWFkeSA9IDA7Ci0JZGV2aWNlX2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCBjb20tPmlucHV0LmRlbGF5LCBtYWtlX3JlYWRfcmVhZHksIG1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBkaXNjYXJkIGl0PyAqLwotICAgICAgLyogb3ZlcmZsb3cgaW5wdXQgZmlmbz8gKi8KLSAgICAgICp2YWwgPSAnXDAnOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIDI6Ci0gICAgLyogaW50ZXJydXB0IGlkZW50ICovCi0gICAgaWYgKGNvbS0+aW50ZXJydXB0aW5nKSB7Ci0gICAgICBpZiAoY29tLT5pbnB1dC5pbnRlcnJ1cHRpbmcpCi0JKnZhbCA9IDB4NDsKLSAgICAgIGVsc2UgaWYgKGNvbS0+b3V0cHV0LmludGVycnVwdGluZykKLQkqdmFsID0gMHgyOwotICAgICAgZWxzZSBpZiAoY29tLT5tb2RlbS5pbnRlcnJ1cHRpbmcgPT0gMCkKLQkqdmFsID0gMDsKLSAgICAgIGVsc2UKLQlkZXZpY2VfZXJyb3IobWUsICJiYWQgZWxpZiBmb3IgaW50ZXJydXB0c1xuIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICp2YWwgPSAweDE7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA1OgotICAgIC8qIGxpbmUgc3RhdHVzICovCi0gICAgKnZhbCA9ICgoY29tLT5pbnB1dC5yZWFkeSA/IDB4MSA6IDApCi0JICAgIHwgKGNvbS0+b3V0cHV0LnJlYWR5ID8gMHg2MCA6IDApCi0JICAgICk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA2OgotICAgIC8qIG1vZGVtIHN0YXR1cyAqLwotICAgICp2YWwgPSAoKGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkID8gMHgwOCA6IDApCi0JICAgIHwgKGNvbS0+bW9kZW0uY2FycmllciA/IDB4ODAgOiAwKQotCSAgICApOwotICAgIGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkID0gMDsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgICp2YWwgPSBjb20tPnJlZ1thZGRyXTsKLSAgICBicmVhazsKLQotICB9Ci0gIHVwZGF0ZV9jb21faW50ZXJydXB0cyhtZSwgY29tKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1od19jb21faW9fcmVhZF9idWZmZXJfY2FsbGJhY2soZGV2aWNlICptZSwKLQkJCSAgICAgICB2b2lkICpkZXN0LAotCQkJICAgICAgIGludCBzcGFjZSwKLQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X2NvbV9kZXZpY2UgKmNvbSA9IGRldmljZV9kYXRhKG1lKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9ieXRlczsgaSsrKSB7Ci0gICAgcmVhZF9jb20obWUsIGNvbSwgYWRkciArIGksICYoKGNoYXIqKWRlc3QpW2ldKTsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW1ha2Vfd3JpdGVfcmVhZHkodm9pZCAqZGF0YSkKLXsKLSAgZGV2aWNlICptZSA9IChkZXZpY2UqKWRhdGE7Ci0gIGh3X2NvbV9kZXZpY2UgKmNvbSA9IChod19jb21fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGNvbS0+b3V0cHV0LnJlYWR5ID0gMTsKLSAgdXBkYXRlX2NvbV9pbnRlcnJ1cHRzKG1lLCBjb20pOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfY29tKGRldmljZSAqbWUsCi0JICBod19jb21fZGV2aWNlICpjb20sCi0JICB1bnNpZ25lZF93b3JkIGEsCi0JICBjaGFyIHZhbCkKLXsKLSAgdW5zaWduZWRfd29yZCBhZGRyID0gYSAlIDg7Ci0KLSAgLyogdGhlIGRpdmlzb3IgbGF0Y2ggaXMgc3BlY2lhbCAqLwotICBpZiAoY29tLT5yZWdbM10gJiAweDggJiYgYWRkciA8IDIpIHsKLSAgICBjb20tPmRsYWJbYWRkcl0gPSB2YWw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChhZGRyKSB7Ci0gIAotICBjYXNlIDA6Ci0gICAgLyogZmlmbyAqLwotICAgIGlmIChjb20tPm91dHB1dC5maWxlID09IE5VTEwpIHsKLSAgICAgIHNpbV9pb193cml0ZV9zdGRvdXQoJnZhbCwgMSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZndyaXRlKCZ2YWwsIDEsIDEsIGNvbS0+b3V0cHV0LmZpbGUpOwotICAgIH0KLSAgICAvKiBzZXR1cCBmb3IgbmV4dCB3cml0ZSAqLwotICAgIGlmIChjb20tPm91dHB1dC5yZWFkeSAmJiBjb20tPm91dHB1dC5kZWxheSA+IDApIHsKLSAgICAgIGNvbS0+b3V0cHV0LnJlYWR5ID0gMDsKLSAgICAgIGRldmljZV9ldmVudF9xdWV1ZV9zY2hlZHVsZShtZSwgY29tLT5vdXRwdXQuZGVsYXksIG1ha2Vfd3JpdGVfcmVhZHksIG1lKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBjb20tPnJlZ1thZGRyXSA9IHZhbDsKLSAgICBicmVhazsKLQotICB9Ci0gIHVwZGF0ZV9jb21faW50ZXJydXB0cyhtZSwgY29tKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1od19jb21faW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJY29uc3Qgdm9pZCAqc291cmNlLAotCQkJCWludCBzcGFjZSwKLQkJCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkJdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X2NvbV9kZXZpY2UgKmNvbSA9IGRldmljZV9kYXRhKG1lKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9ieXRlczsgaSsrKSB7Ci0gICAgd3JpdGVfY29tKG1lLCBjb20sIGFkZHIgKyBpLCAoKGNoYXIqKXNvdXJjZSlbaV0pOwotICB9Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi0vKiBpbnN0YW5jZXMgb2YgdGhlIGh3X2NvbSBkZXZpY2UgKi8KLQotc3RhdGljIHZvaWQKLWh3X2NvbV9pbnN0YW5jZV9kZWxldGUoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgLyogbm90aGluZyB0byBkZWxldGUsIHRoZSBod19jb20gaXMgYXR0YWNoZWQgdG8gdGhlIGRldmljZSAqLwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2NvbV9pbnN0YW5jZV9yZWFkKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgdm9pZCAqYnVmLAotCQkgICAgIHVuc2lnbmVkX3dvcmQgbGVuKQotewotICBkZXZpY2UgKm1lID0gZGV2aWNlX2luc3RhbmNlX2RldmljZShpbnN0YW5jZSk7Ci0gIGh3X2NvbV9kZXZpY2UgKmNvbSA9IGRldmljZV9kYXRhKG1lKTsKLSAgaWYgKGNvbS0+aW5wdXQuZmlsZSA9PSBOVUxMKQotICAgIHJldHVybiBzaW1faW9fcmVhZF9zdGRpbihidWYsIGxlbik7Ci0gIGVsc2UgewotICAgIHJldHVybiBmcmVhZChidWYsIDEsIGxlbiwgY29tLT5pbnB1dC5maWxlKTsKLSAgfQotfQotCi1zdGF0aWMgaW50Ci1od19jb21faW5zdGFuY2Vfd3JpdGUoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOwotICBod19jb21fZGV2aWNlICpjb20gPSBkZXZpY2VfZGF0YShtZSk7Ci0gIGlmIChjb20tPm91dHB1dC5maWxlID09IE5VTEwpCi0gICAgcmV0dXJuIHNpbV9pb193cml0ZV9zdGRvdXQoYnVmLCBsZW4pOwotICBlbHNlIHsKLSAgICByZXR1cm4gZndyaXRlKGJ1ZiwgMSwgbGVuLCBjb20tPm91dHB1dC5maWxlKTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyBod19jb21faW5zdGFuY2VfY2FsbGJhY2tzID0gewotICBod19jb21faW5zdGFuY2VfZGVsZXRlLAotICBod19jb21faW5zdGFuY2VfcmVhZCwKLSAgaHdfY29tX2luc3RhbmNlX3dyaXRlLAotfTsKLQotc3RhdGljIGRldmljZV9pbnN0YW5jZSAqCi1od19jb21fY3JlYXRlX2luc3RhbmNlKGRldmljZSAqbWUsCi0JCSAgICAgICBjb25zdCBjaGFyICpwYXRoLAotCQkgICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgLyogcG9pbnQgYW4gaW5zdGFuY2UgZGlyZWN0bHkgYXQgdGhlIGRldmljZSAqLwotICByZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAotCQkJCSAgICAgZGV2aWNlX2RhdGEobWUpLAotCQkJCSAgICAgcGF0aCwgYXJncywKLQkJCQkgICAgICZod19jb21faW5zdGFuY2VfY2FsbGJhY2tzKTsKLX0KLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19jb21fY2FsbGJhY2tzID0gewotICB7IGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcywKLSAgICBod19jb21fZGV2aWNlX2luaXRfZGF0YSB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19jb21faW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssCi0gICAgICBod19jb21faW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KLSAgaHdfY29tX2NyZWF0ZV9pbnN0YW5jZSwKLX07Ci0KLQotc3RhdGljIHZvaWQgKgotaHdfY29tX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAotCSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCi0JICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCi0gIGh3X2NvbV9kZXZpY2UgKmh3X2NvbSA9IFpBTExPQyhod19jb21fZGV2aWNlKTsKLSAgcmV0dXJuIGh3X2NvbTsKLX0KLQotCi1jb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19jb21fZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAiY29tIiwgaHdfY29tX2NyZWF0ZSwgJmh3X2NvbV9jYWxsYmFja3MgfSwKLSAgeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX0NPTV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19jb3JlLmMgYi9zaW0vcHBjL2h3X2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0Mzk1Ny4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19DT1JFX0NfCi0jZGVmaW5lIF9IV19DT1JFX0NfCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLQotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0KLQotLyogREVWSUNFCi0gICAKLSAgIGNvcmUgLSByb290IG9mIHRoZSBkZXZpY2UgdHJlZQotICAgCi0gICBERVNDUklQVElPTgotICAgCi0gICBUaGUgY29yZSBkZXZpY2UgcG9zaXRpb25lZCBhdCB0aGUgcm9vdCBvZiB0aGUgZGV2aWNlIHRyZWUgYXBwZWFycwotICAgdG8gaXRzIGNoaWxkIGRldmljZXMgYXMgYSBub3JtYWwgZGV2aWNlIGp1c3QgbGlrZSBldmVyeSBvdGhlcgotICAgZGV2aWNlIGluIHRoZSB0cmVlLgotCi0gICBJbnRlcm5hbGx5IGl0IGlzIGltcGxlbWVudGVkIHVzaW5nIGEgY29yZSBvYmplY3QuICBSZXF1ZXN0cyB0bwotICAgYXR0YWNoIChvciBkZXRhY2gpIGFkZHJlc3Mgc3BhY2VzIGFyZSBwYXNzZWQgdG8gdGhhdCBjb3JlIG9iamVjdC4KLSAgIFJlcXVlc3RzIHRvIHRyYW5zZmVyIChETUEpIGRhdGEgYXJlIHJlZmxlY3RlZCBiYWNrIGRvd24gdGhlIGRldmljZQotICAgdHJlZSB1c2luZyB0aGUgY29yZV9tYXAgZGF0YSB0cmFuc2ZlciBtZXRob2RzLgotCi0gICBQUk9QRVJUSUVTCi0KLSAgIE5vbmUuCi0KLSAgICovCi0KLQotc3RhdGljIHZvaWQKLWh3X2NvcmVfaW5pdF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUpCi17Ci0gIGNvcmUgKm1lbW9yeSA9IChjb3JlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGNvcmVfaW5pdChtZW1vcnkpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1od19jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkJCWludCBzcGFjZSwKLQkJCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkJdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkJYWNjZXNzX3R5cGUgYWNjZXNzLAotCQkJCWRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLwotewotICBjb3JlICptZW1vcnkgPSAoY29yZSopZGV2aWNlX2RhdGEobWUpOwotICBpZiAoc3BhY2UgIT0gMCkKLSAgICBlcnJvcigiY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjaygpIGludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7Ci0gIGNvcmVfYXR0YWNoKG1lbW9yeSwKLQkgICAgICBhdHRhY2gsCi0JICAgICAgc3BhY2UsCi0JICAgICAgYWNjZXNzLAotCSAgICAgIGFkZHIsCi0JICAgICAgbnJfYnl0ZXMsCi0JICAgICAgY2xpZW50KTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X2NvcmVfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJIHZvaWQgKmRlc3QsCi0JCQkJIGludCBzcGFjZSwKLQkJCQkgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJCSB1bnNpZ25lZCBucl9ieXRlcykKLXsKLSAgY29yZSAqbWVtb3J5ID0gKGNvcmUqKWRldmljZV9kYXRhKG1lKTsKLSAgcmV0dXJuIGNvcmVfbWFwX3JlYWRfYnVmZmVyKGNvcmVfcmVhZGFibGUobWVtb3J5KSwKLQkJCSAgICAgIGRlc3QsCi0JCQkgICAgICBhZGRyLAotCQkJICAgICAgbnJfYnl0ZXMpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkJICBpbnQgc3BhY2UsCi0JCQkJICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkJICB1bnNpZ25lZCBucl9ieXRlcywKLQkJCQkgIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQotewotICBjb3JlICptZW1vcnkgPSAoY29yZSopZGV2aWNlX2RhdGEobWUpOwotICBjb3JlX21hcCAqbWFwID0gKHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24KLQkJICAgPyBjb3JlX3JlYWRhYmxlKG1lbW9yeSkKLQkJICAgOiBjb3JlX3dyaXRlYWJsZShtZW1vcnkpKTsKLSAgcmV0dXJuIGNvcmVfbWFwX3dyaXRlX2J1ZmZlcihtYXAsCi0JCQkgICAgICAgc291cmNlLAotCQkJICAgICAgIGFkZHIsCi0JCQkgICAgICAgbnJfYnl0ZXMpOwotfQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19jb3JlX2NhbGxiYWNrcyA9IHsKLSAgeyBod19jb3JlX2luaXRfYWRkcmVzc19jYWxsYmFjaywgfSwKLSAgeyBod19jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIElPICovCi0gIHsgaHdfY29yZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2ssCi0gICAgaHdfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IGdlbmVyaWNfZGV2aWNlX3VuaXRfZGVjb2RlLAotICAgIGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlLAotICAgIGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCi0gICAgZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZSwgfSwKLX07Ci0KLQotc3RhdGljIHZvaWQgKgotaHdfY29yZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkgICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgY29yZSAqbWVtb3J5ID0gY29yZV9jcmVhdGUoKTsKLSAgcmV0dXJuIG1lbW9yeTsKLX0KLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfY29yZV9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJjb3JlIiwgaHdfY29yZV9jcmVhdGUsICZod19jb3JlX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfQ09SRV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19jcHUuYyBiL3NpbS9wcGMvaHdfY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExN2E0YzIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19DUFVfQ18KLSNkZWZpbmUgX0hXX0NQVV9DXwotCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkVfSFdfQ1BVCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkVfSFdfQ1BVIFNUQVRJQ19JTkxJTkUKLSNlbmRpZgotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0jaW5jbHVkZSAiaHdfY3B1LmgiCi0KLSNpbmNsdWRlICJpbnRlcnJ1cHRzLmgiCi0jaW5jbHVkZSAiY3B1LmgiCi0KLQotLyogREVWSUNFCi0KLQotICAgY3B1IC0gSW50ZXJmYWNlIHRvIGEgUHJvY2Vzc29yCi0KLQotICAgREVTQ1JJUFRJT04KLQotCi0gICBUaGUgQ1BVIGRldmljZSBwcm92aWRlcyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQgbmV0Ci0gICAobGlua2luZyB0aGUgZGV2aWNlcyBhbmQgdGhlIGludGVycnVwdCBjb250cm9sbGVyKSBhbmQgdGhlCi0gICBzaW11bGF0ZWQgbW9kZWwgb2YgZWFjaCBwcm9jZXNzb3IuICBUaGlzIGRldmljZSBjb250YWlucyBpbnRlcnJ1cHQKLSAgIHBvcnRzIHRoYXQgY29ycmVzcG9uZCBkaXJlY3RseSB0byB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IHN0aW11bHVzCi0gICB0aGF0IGNhbiBiZSBzZW50IHRvIGEgZ2l2ZW4gcHJvY2Vzc29yLiAgU2VuZGluZyBhbiBpbnRlcnJ1cHQgdG8gb25lCi0gICBvZiB0aGUgcG9ydHMgcmVzdWx0cyBpbiBhbiBpbnRlcnJ1cHQgYmVpbmcgZGVsaXZlcmVkIHRvIHRoZQotICAgY29ycmVzcG9uZGluZyBwcm9jZXNzb3IuCi0KLSAgIFR5cGljYWxseSwgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIgd291bGQgaGF2ZSBpdHMgaW5wdXRzIGNvbm5lY3RlZAotICAgdG8gZGV2aWNlIGludGVycnVwdCBzb3VyY2VzIGFuZCBpdHMgb3V0cHV0cyAoc3Jlc2V0LCBpbnQsIGV0LmFsLikKLSAgIGNvbm5lY3RlZCB0byB0aGlzIGRldmljZS4KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgY3B1LW5yID0gPGludGVnZXI+IChyZXF1aXJlZCkKLQotCi0gICBTcGVjaWZ5IHRoZSBwcm9jZXNzb3IgKDEuLk4pIHRoYXQgdGhpcyBjcHUgZGV2aWNlIG5vZGUgc2hvdWxkCi0gICBjb250cm9sLgotCi0KLSAgIEVYQU1QTEVTCi0KLSAgIAotICAgQ29ubmVjdCBhbiBPcGVuUElDIGludGVycnVwdCBjb250cm9sbGVyIGludGVycnVwdCBwb3J0cyB0bwotICAgcHJvY2Vzc29yIHplcm8uCi0KLSAgIHwgLW8gJy9waGIvb3BpY0AwID4gaXJxMCBpbnQgL2NwdXMvY3B1QDAnIFwKLSAgIHwgLW8gJy9waGIvb3BpY0AwID4gaW5pdCBocmVzZXQgL2NwdXMvY3B1QDAnIFwKLQotCi0gICAqLwotCi10eXBlZGVmIHN0cnVjdCBfaHdfY3B1X2RldmljZSB7Ci0gIGludCBjcHVfbnI7Ci0gIGNwdSAqcHJvY2Vzc29yOwotfSBod19jcHVfZGV2aWNlOwotCi1zdGF0aWMgY29uc3QgZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgaHdfY3B1X2ludGVycnVwdF9wb3J0c1tdID0gewotICB7ICJocmVzZXQiLCBod19jcHVfaGFyZF9yZXNldCB9LAotICB7ICJzcmVzZXQiLCBod19jcHVfc29mdF9yZXNldCB9LAotICB7ICJpbnQiLCBod19jcHVfZXh0ZXJuYWxfaW50ZXJydXB0IH0sCi0gIHsgIm1jaSIsIGh3X2NwdV9tYWNoaW5lX2NoZWNrX2ludGVycnVwdCB9LAotICB7ICJzbWkiLCBod19jcHVfc3lzdGVtX21hbmFnZW1lbnRfaW50ZXJydXB0IH0sCi0gIHsgTlVMTCB9Ci19OwotCi0KLXN0YXRpYyB2b2lkICoKLWh3X2NwdV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIGh3X2NwdV9kZXZpY2UgKmh3X2NwdSA9IFpBTExPQyhod19jcHVfZGV2aWNlKTsKLSAgcmV0dXJuIGh3X2NwdTsKLX0KLQotCi0vKiBkdXJpbmcgYWRkcmVzcyBpbml0aWFsaXphdGlvbiBlbnN1cmUgdGhhdCBhbnkgbWlzc2luZyBjcHUKLSAgIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoaXMgZGV2aWNlcyBub2RlICovCi0KLXN0YXRpYyB2b2lkCi1od19jcHVfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCi17Ci0gIGh3X2NwdV9kZXZpY2UgKmh3X2NwdSA9IChod19jcHVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIC8qIHBvcHVsYXRlIHRoZSBub2RlIHdpdGggcHJvcGVydGllcyAqLwotICAvKiBjbGVhciBvdXIgZGF0YSAqLwotICBtZW1zZXQoaHdfY3B1LCAweDAsIHNpemVvZihod19jcHVfZGV2aWNlKSk7Ci0gIGh3X2NwdS0+Y3B1X25yID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImNwdS1uciIpOwotICBod19jcHUtPnByb2Nlc3NvciA9IHBzaW1fY3B1KGRldmljZV9zeXN0ZW0obWUpLCBod19jcHUtPmNwdV9ucik7Ci19Ci0KLQotLyogVGFrZSB0aGUgaW50ZXJydXB0IGFuZCBzeW5jaHJvbml6ZSBpdHMgZGVsaXZlcnkgd2l0aCB0aGUgY2xvY2suICBJZgotICAgd2UndmUgbm90IHlldCBzY2hlZHVsZWQgYW4gaW50ZXJydXB0IGZvciB0aGUgbmV4dCBjbG9jayB0aWNrLCB0YWtlCi0gICB0aGUgb3BvcnR1bml0eSB0byBkbyBpdCBub3cgKi8KLQotc3RhdGljIHZvaWQKLWh3X2NwdV9pbnRlcnJ1cHRfZXZlbnQoZGV2aWNlICptZSwKLQkJICAgICAgIGludCBteV9wb3J0LAotCQkgICAgICAgZGV2aWNlICpzb3VyY2UsCi0JCSAgICAgICBpbnQgc291cmNlX3BvcnQsCi0JCSAgICAgICBpbnQgbGV2ZWwsCi0JCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19jcHVfZGV2aWNlICpod19jcHUgPSAoaHdfY3B1X2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBpZiAobXlfcG9ydCA8IDAgfHwgbXlfcG9ydCA+PSBod19jcHVfbnJfaW50ZXJydXB0X3BvcnRzKQotICAgIGVycm9yKCJod19jcHVfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrOiBpbnRlcnJ1cHQgcG9ydCBvdXQgb2YgcmFuZ2UgJWRcbiIsCi0JICBteV9wb3J0KTsKLSAgc3dpdGNoIChteV9wb3J0KSB7Ci0gICAgLypjYXNlIGh3X2NwdV9oYXJkX3Jlc2V0OiovCi0gICAgLypjYXNlIGh3X2NwdV9zb2Z0X3Jlc2V0OiovCi0gIGNhc2UgaHdfY3B1X2V4dGVybmFsX2ludGVycnVwdDoKLSAgICBleHRlcm5hbF9pbnRlcnJ1cHQoaHdfY3B1LT5wcm9jZXNzb3IsIGxldmVsKTsKLSAgICBicmVhazsKLSAgICAvKmNhc2UgaHdfY3B1X21hY2hpbmVfY2hlY2tfaW50ZXJydXB0OiovCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImh3X2NwdV9kZWxpdmVyX2ludGVycnVwdDogdW5pbXBsZW1lbnRlZCBpbnRlcnJ1cHQgcG9ydCAlZFxuIiwKLQkgIG15X3BvcnQpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfY3B1X2NhbGxiYWNrcyA9IHsKLSAgeyBod19jcHVfaW5pdF9hZGRyZXNzLCB9LCAvKiBpbml0ICovCi0gIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLwotICB7IE5VTEwsIH0sIC8qIGlvICovCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgaHdfY3B1X2ludGVycnVwdF9ldmVudCwgTlVMTCwgaHdfY3B1X2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHRzICovCi0gIHsgTlVMTCwgTlVMTCwgfSwKLX07Ci0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X2NwdV9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJody1jcHUiLCBod19jcHVfY3JlYXRlLCAmaHdfY3B1X2NhbGxiYWNrcyB9LAotICB7ICJjcHUiLCBod19jcHVfY3JlYXRlLCAmaHdfY3B1X2NhbGxiYWNrcyB9LAotICB7IE5VTEwsIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX0NQVV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19jcHUuaCBiL3NpbS9wcGMvaHdfY3B1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDAyOTguLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19jcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0hXX0NQVV9IXwotI2RlZmluZSBfSFdfQ1BVX0hfCi0KLWVudW0gewotICBod19jcHVfaGFyZF9yZXNldCwKLSAgaHdfY3B1X3NvZnRfcmVzZXQsCi0gIGh3X2NwdV9leHRlcm5hbF9pbnRlcnJ1cHQsCi0gIGh3X2NwdV9tYWNoaW5lX2NoZWNrX2ludGVycnVwdCwKLSAgaHdfY3B1X3N5c3RlbV9tYW5hZ2VtZW50X2ludGVycnVwdCwKLSAgaHdfY3B1X25yX2ludGVycnVwdF9wb3J0cwotfTsKLQotI2VuZGlmIC8qIF9IV19DUFVfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfZGlzay5jIGIvc2ltL3BwYy9od19kaXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzRmZWEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19kaXNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfRElTS19DXwotI2RlZmluZSBfSFdfRElTS19DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpbmNsdWRlICJway5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZuZGVmCVNFRUtfU0VUCi0jZGVmaW5lCVNFRUtfU0VUIDAKLSNlbmRpZgotCi0vKiBERVZJQ0UKLSAgIAotCi0gICBjZHJvbSAtIHJlYWQtb25seSByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZQotCi0gICBkaXNrIC0gbWFzcyBzdG9yYWdlIGRldmljZQotICAgCi0gICBmbG9wcHkgLSByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZQotCi0gICAKLSAgIERFU0NSSVBUSU9OCi0gICAKLSAgIAotICAgTWFzcyBzdG9yYWdlIGRldmljZXMgc3VjaCBhcyBhIGhhcmQtZGlzayBvciBjZHJvbS1kcml2ZSBhcmUgbm90Ci0gICBub3JtYWxseSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHByb2Nlc3Nvci4gIEluc3RlYWQsIHRoZXNlCi0gICBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byBhIGxvZ2ljYWwgYnVzLCBzdWNoIGFzIFNDU0kgb3IgSURFLCBhbmQKLSAgIHRoZW4gYSBjb250cm9sbGVyIG9mIHRoYXQgYnVzIGlzIG1hZGUgYWNjZXNzaWJsZSB0byB0aGUgcHJvY2Vzc29yLgotICAgCi0gICBSZWZsZWN0aW5nIHRoaXMsIHdpdGhpbiBhIGRldmljZSB0cmVlLCBtYXNzIHN0b3JhZ2UgZGV2aWNlcyBzdWNoIGFzCi0gICBhIDw8Y2Ryb20+PiwgPDxkaXNrPj4gb3IgPDxmbG9wcHk+PiBhcmUgY3JlYXRlZCBhcyBjaGlsZHJlbiBvZiBvZiBhCi0gICBsb2dpY2FsIGJ1cyBjb250cm9sbGVyIG5vZGUgKHN1Y2ggYXMgYSBTQ1NJIG9yIElERSBpbnRlcmZhY2UpLgotICAgVGhhdCBjb250cm9sbGVyLCBpbiB0dXJuLCB3b3VsZCBiZSBtYWRlIHRoZSBjaGlsZCBvZiBhIHBoeXNpY2FsIGJ1cwotICAgbm9kZSB0aGF0IGlzIGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIHByb2Nlc3Nvci4KLSAgIAotICAgVGhlIGFib3ZlIG1hc3Mgc3RvcmFnZSBkZXZpY2VzIHByb3ZpZGUgdHdvIGludGVyZmFjZXMgLSBhIGxvZ2ljYWwKLSAgIGFuZCBhIHBoeXNpY2FsLgotICAgCi0gICBBdCB0aGUgcGh5c2ljYWwgbGV2ZWwgdGhlIDw8ZGV2aWNlX2lvXy4uLj4+IGZ1bmN0aW9ucyBjYW4gYmUgdXNlZAotICAgcGVyZm9ybSByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSByYXcgbWVkaWEuICBUaGUgYWRkcmVzcyBiZWluZwotICAgaW50ZXJwcmV0ZWQgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkaXNrLgotICAgCi0gICBBdCB0aGUgbG9naWNhbCBsZXZlbCwgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQotICAgZGlzayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhbnkgb2YgdGhlIHBoeXNpY2FsIG1lZGlhLCBhIGRpc2sKLSAgIHBhcnRpdGlvbiwgb3IgZXZlbiBhIGZpbGUgd2l0aGluIGEgcGFydGl0aW9uLiAgVGhlIDw8ZGlzay1sYWJlbD4+Ci0gICBwYWNrYWdlLCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25hbGl0eSwgaXMgZGVzY3JpYmVkCi0gICBlbHNld2hlcmUuICBCb3RoIHRoZSBPcGVuIEZpcm13YXJlIGFuZCBNb3RvIEJVRyByb20gZW11bGF0aW9ucwotICAgc3VwcG9ydCB0aGlzIGludGVyZmFjZS4KLSAgIAotICAgQmxvY2sgZGV2aWNlcyBzdWNoIGFzIHRoZSA8PGZsb3BweT4+IGFuZCA8PGNkcm9tPj4gaGF2ZSByZW1vdmFibGUKLSAgIG1lZGlhLiAgQXQgdGhlIHByb2dyYW1tZXIgbGV2ZWwsIHRoZSBtZWRpYSBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUKLSAgIDw8Y2hhbmdlX21lZGlhPj4gaW9jdGwuICBGcm9tIHdpdGhpbiBHREIsIGEgPDxjaGFuZ2UtbWVkaWE+PgotICAgb3BlcmF0aW9uIGNhbiBiZSBpbml0YXRlZCBieSB1c2luZyB0aGUgY29tbWFuZC4KLQotICAgfAkoZ2RiKSAgc2ltIAotCi0KLSAgIFBST1BFUlRJRVMKLSAgIAotICAgCi0gICBmaWxlID0gPGZpbGUtbmFtZT4gIChyZXF1aXJlZCkKLQotICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyBhbiBpbWFnZSBvZiB0aGUgZGlzay4gIEZvcgotICAgPDxkaXNrPj4gYW5kIDw8ZmxvcHB5Pj4gZGV2aWNlcywgdGhlIGltYWdlIHdpbGwgYmUgb3BlbmVkIGZvciBib3RoCi0gICByZWFkaW5nIGFuZCB3cml0aW5nLiAgTXVsdGlwbGUgaW1hZ2UgZmlsZXMgbWF5IGJlIHNwZWNpZmllZCwgdGhlCi0gICBzZWNvbmQgYW5kIGxhdGVyIGZpbGVzIGJlaW5nIG9wZW5lZCB3aGVuIDw8Y2hhbmdlLW1lZGlhPj4gKHdpdGggYQotICAgTlVMTCBmaWxlIG5hbWUpIGJlaW5nIHNwZWNpZmllZC4KLQotICAgCi0gICBibG9jay1zaXplID0gPG5yLWJ5dGVzPiAgKG9wdGlvbmFsKQotCi0gICBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIGJsb2NrLXNpemUgbWV0aG9kLiAgVGhlIGRlZmF1bHQgdmFsdWUKLSAgIGlzIDUxMiBieXRlcy4KLQotCi0gICBtYXgtdHJhbnNmZXIgPSA8bnItYnl0ZXM+ICAob3B0aW9uYWwpCi0KLSAgIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBieSB0aGUgbWF4LXRyYW5zZmVyIG1ldGhvZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgIGlzIDUxMiBieXRlcy4KLQotCi0gICAjYmxvY2tzID0gPG5yLWJsb2Nrcz4gIChvcHRpb25hbCkKLQotICAgVGhlIHZhbHVlIGlzIHJldHVybmVkIGJ5IHRoZSAjYmxvY2tzIG1ldGhvZC4gIElmIG5vIHZhbHVlIGlzCi0gICBwcmVzZW50IHRoZW4gLTEgaXMgcmV0dXJuZWQuCi0KLQotICAgcmVhZC1vbmx5ID0gPGFueXRoaW5nPiAgKG9wdGlvbmFsKQotCi0gICBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSBkaXNrIGZpbGUgaW1hZ2UgaXMgYWx3YXlzIG9wZW5lZAotICAgcmVhZC1vbmx5LgotCi0gICBFWEFNUExFUwotICAgCi0gICAKLSAgIEVuYWJsZSB0cmFjaW5nCi0gICAKLSAgIHwgJCAgcHNpbSAtdCAnZGlzay1kZXZpY2UnIFwKLQotICAgCi0gICBBZGQgYSBDRFJPTSBhbmQgZGlzayB0byBhbiBJREUgYnVzLiAgU3BlY2lmeSB0aGUgaG9zdCBvcGVyYXRpbmcKLSAgIHN5c3RlbSdzIGNkIGRyaXZlIGFzIHRoZSBDRC1ST00gaW1hZ2UuCi0gICAKLSAgIHwgICAgLW8gJy9wY2kvaWRlL2Rpc2tAMC9maWxlICJkaXNrLWltYWdlJyBcCi0gICB8ICAgIC1vICcvcGNpL2lkZS9jZHJvbUAxL2ZpbGUgIi9kZXYvY2QwYScgXAotCi0gICAKLSAgIEFzIHBhcnQgb2YgdGhlIGNvZGUgaW1wbGVtZW50aW5nIGEgbG9naWNhbCBidXMgZGV2aWNlIChmb3IgaW5zdGFuY2UKLSAgIHRoZSBJREUgY29udHJvbGxlciksIGxvY2F0ZSB0aGUgQ0RST00gZGV2aWNlIGFuZCB0aGVuIHJlYWQgYmxvY2sKLSAgIDQ3LgotICAgCi0gICB8ICBkZXZpY2UgKmNkcm9tID0gZGV2aWNlX3RyZWVfZmluZF9kZXZpY2UobWUsICJjZHJvbSIpOwotICAgfCAgY2hhciBibG9ja1s1MTJdOwotICAgfCAgZGV2aWNlX2lvX3JlYWRfYnVmZmVyKGNkcm9tLCBidWYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNDcgKiBzaXplb2YoYmxvY2spLCAvLyBzcGFjZSwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihibG9jayksIE5VTEwsIDApOwotICAgCi0gICAKLSAgIFVzZSB0aGUgZGV2aWNlIGluc3RhbmNlIGludGVyZmFjZSB0byByZWFkIGJsb2NrIDQ3IG9mIHRoZSBmaWxlCi0gICBjYWxsZWQgPDxuZXRic2QuZWxmPj4gb24gdGhlIGRpc2tzIGRlZmF1bHQgcGFydGl0aW9uLiAgU2ltaWxhciBjb2RlCi0gICB3b3VsZCBiZSB1c2VkIGluIGFuIG9wZXJhdGluZyBzeXN0ZW1zIHByZS1ib290IGxvYWRlci4KLSAgIAotICAgfCAgZGV2aWNlX2luc3RhbmNlICpuZXRic2QgPQotICAgfCAgICBkZXZpY2VfY3JlYXRlX2luc3RhbmNlKHJvb3QsICIvcGNpL2lkZS9kaXNrOixcbmV0YnNkLmVsZiIpOwotICAgfCAgY2hhciBibG9ja1s1MTJdOwotICAgfCAgZGV2aWNlX2luc3RhbmNlX3NlZWsobmV0YnNkLCAgMCwgNDcgKiBzaXplb2YoYmxvY2spKTsKLSAgIHwgIGRldmljZV9pbnN0YW5jZV9yZWFkKG5ldGJzZCwgYmxvY2ssIHNpemVvZihibG9jaykpOwotICAgCi0gICAKLSAgIEJVR1MKLSAgIAotICAgCi0gICBUaGUgYmxvY2sgZGV2aWNlIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3IgZGV0ZXJtaW5pbmcKLSAgIHRoZSBwaHlzaWNhbCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIC0gc3VjaCBhcyB0aGUgZGlza3Mgc2l6ZS4KLSAgIEN1cnJlbnRseSB0aGlzIG1lY2hhbmlzbSBpcyBub3QgaW1wbGVtZW50ZWQuCi0gICAKLSAgIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgZGV2aWNlIChpbiBwYXJ0aWN1bGFyIHRoZSBkZXZpY2UgaW5zdGFuY2UKLSAgIGludGVyZmFjZSkgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgPDxkaXNrLWxhYmVsPj4gcGFja2FnZS4KLSAgIFRoYXQgcGFja2FnZSBtYXkgbm90IGJlIGZ1bGx5IGltcGxlbWVudGVkLgotCi0gICBUaGUgZGlzayBkb2VzIG5vdCBrbm93IGl0cyBzaXplLiAgSGVuY2UgaXQgcmVsaWVzIG9uIHRoZSBmYWlsdXJlIG9mCi0gICBmcmVhZCgpLCBmd3JpdGUoKSBhbmQgZnNlZWsoKSBjYWxscyB0byBkZXRlY3QgZXJyb3JzLgotCi0gICBUaGUgZGlzayBzaXplIGlzIGxpbWl0ZWQgYnkgdGhlIGFkZHJlc3NhYmxlIHJhbmdlIGNvdmVyZWQgYnkKLSAgIHVuc2lnbmVkX3dvcmQgKGFkZHIpLiAgQW4gZXh0ZW5zaW9uIHdvdWxkIGJlIHRvIGluc3RlYWQgdXNlIHRoZQotICAgY29uY2F0ZW5hdGVkIHZhbHVlIHNwYWNlOmFkZHIuCi0KLSAgIFRoZSBtZXRob2QgI2Jsb2NrcyBzaG91bGQgYHN0YXQnIHRoZSBkaXNrIHRvIGRldGVybWluZSB0aGUgbnVtYmVyCi0gICBvZiBibG9ja3MgaWYgdGhlcmUgaXMgbm8gI2Jsb2NrcyBwcm9wZXJ0eS4KLQotICAgSXQgd291bGQgYXBwZWFyIHRoYXQgT3BlbkZpcm13YXJlIGRvZXMgbm90IGRlZmluZSBhIGNsaWVudCBjYWxsIGZvcgotICAgY2hhbmdpbmcgKGVqZWN0aW5nKSB0aGUgbWVkaWEgb2YgYSBkZXZpY2UuCi0KLSAgICovCi0KLXR5cGVkZWYgc3RydWN0IF9od19kaXNrX2RldmljZSB7Ci0gIGludCBuYW1lX2luZGV4OwotICBpbnQgbnJfbmFtZXM7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCByZWFkX29ubHk7Ci0gIC8qICB1bnNpZ25lZF93b3JkIHNpemU7ICovCi0gIEZJTEUgKmltYWdlOwotfSBod19kaXNrX2RldmljZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X2Rpc2tfaW5zdGFuY2UgewotICB1bnNpZ25lZF93b3JkIHBvczsKLSAgaHdfZGlza19kZXZpY2UgKmRpc2s7Ci19IGh3X2Rpc2tfaW5zdGFuY2U7Ci0KLQotc3RhdGljIHZvaWQKLW9wZW5fZGlza19pbWFnZShkZXZpY2UgKm1lLAotCQlod19kaXNrX2RldmljZSAqZGlzaywKLQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgaWYgKGRpc2stPmltYWdlICE9IE5VTEwpCi0gICAgZmNsb3NlKGRpc2stPmltYWdlKTsKLSAgaWYgKGRpc2stPm5hbWUgIT0gTlVMTCkKLSAgICB6ZnJlZShkaXNrLT5uYW1lKTsKLSAgZGlzay0+bmFtZSA9IHN0cmR1cChuYW1lKTsKLSAgZGlzay0+aW1hZ2UgPSBmb3BlbihkaXNrLT5uYW1lLCBkaXNrLT5yZWFkX29ubHkgPyAiciIgOiAicisiKTsKLSAgaWYgKGRpc2stPmltYWdlID09IE5VTEwpIHsKLSAgICBwZXJyb3IoZGV2aWNlX25hbWUobWUpKTsKLSAgICBkZXZpY2VfZXJyb3IobWUsICJvcGVuICVzIGZhaWxlZFxuIiwgZGlzay0+bmFtZSk7Ci0gIH0KLQotICBEVFJBQ0UoZGlzaywgKCJpbWFnZSAlcyAoJXMpXG4iLAotICAgICAgICAgICAgICAgIGRpc2stPm5hbWUsCi0gICAgICAgICAgICAgICAgKGRpc2stPnJlYWRfb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiKSkpOwotfQotCi1zdGF0aWMgdm9pZAotaHdfZGlza19pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKLXsKLSAgaHdfZGlza19kZXZpY2UgKmRpc2sgPSBkZXZpY2VfZGF0YShtZSk7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgaW50IHNwYWNlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIGF0dGFjaCB0byB0aGUgcGFyZW50LiBTaW5jZSB0aGUgYnVzIGlzIGxvZ2ljYWwsIGF0dGFjaCB1c2luZyBqdXN0Ci0gICAgIHRoZSB1bml0LWFkZHJlc3MgKHNpemUgbXVzdCBiZSB6ZXJvKSAqLwotICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwgZGV2aWNlX3VuaXRfYWRkcmVzcyhtZSksCi0JCQkJICAgJnNwYWNlLCAmYWRkcmVzcywgbWUpOwotICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksIGF0dGFjaF9jYWxsYmFjaywKLQkJCXNwYWNlLCBhZGRyZXNzLCAwLypzaXplKi8sIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWMsCi0JCQltZSk7Ci0KLSAgLyogZ2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHNwZWNpZnlpbmcgdGhlIGRpc2sgaW1hZ2UgKi8KLSAgZGlzay0+bmFtZV9pbmRleCA9IDA7Ci0gIGRpc2stPm5yX25hbWVzID0gZGV2aWNlX2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCAiZmlsZSIsCi0JCQkJCQkgICAgIGRpc2stPm5hbWVfaW5kZXgsICZuYW1lKTsKLSAgaWYgKCFkaXNrLT5ucl9uYW1lcykKLSAgICBkZXZpY2VfZXJyb3IobWUsICJpbnZhbGlkIGZpbGUgcHJvcGVydHkiKTsKLQotICAvKiBpcyBpdCBhIFJPIGRldmljZT8gKi8KLSAgZGlzay0+cmVhZF9vbmx5ID0KLSAgICAoc3RyY21wKGRldmljZV9uYW1lKG1lKSwgImRpc2siKSAhPSAwCi0gICAgICYmIHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJmbG9wcHkiKSAhPSAwCi0gICAgICYmIGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAicmVhZC1vbmx5IikgPT0gTlVMTCk7Ci0KLSAgLyogbm93IG9wZW4gaXQgKi8KLSAgb3Blbl9kaXNrX2ltYWdlKG1lLCBkaXNrLCBuYW1lKTsKLX0KLQotc3RhdGljIGludAotaHdfZGlza19pb2N0bChkZXZpY2UgKm1lLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCSAgICAgIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCi0JICAgICAgdmFfbGlzdCBhcCkKLXsKLSAgc3dpdGNoIChyZXF1ZXN0KSB7Ci0gIGNhc2UgZGV2aWNlX2lvY3RsX2NoYW5nZV9tZWRpYToKLSAgICB7Ci0gICAgICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0JZGlzay0+bmFtZV9pbmRleCA9IC0xOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JZGlzay0+bmFtZV9pbmRleCA9IChkaXNrLT5uYW1lX2luZGV4ICsgMSkgJSBkaXNrLT5ucl9uYW1lczsKLQlpZiAoIWRldmljZV9maW5kX3N0cmluZ19hcnJheV9wcm9wZXJ0eShtZSwgImZpbGUiLAotCQkJCQkgICAgICAgZGlzay0+bmFtZV9pbmRleCwgJm5hbWUpKQotCSAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBmaWxlIHByb3BlcnR5Iik7Ci0gICAgICB9Ci0gICAgICBvcGVuX2Rpc2tfaW1hZ2UobWUsIGRpc2ssIG5hbWUpOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJpbnN1cHBvcnRlZCBpb2N0bCByZXF1ZXN0Iik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotc3RhdGljIHVuc2lnbmVkCi1od19kaXNrX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCi0JCSAgICAgICB2b2lkICpkZXN0LAotCQkgICAgICAgaW50IHNwYWNlLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKLSAgdW5zaWduZWQgbnJfYnl0ZXNfcmVhZDsKLSAgaWYgKHNwYWNlICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAicmVhZCAtIGV4dGVuZGVkIGRpc2sgYWRkcmVzc2luZyB1bmltcGxlbWVudGVkIik7Ci0gIGlmIChucl9ieXRlcyA9PSAwKQotICAgIG5yX2J5dGVzX3JlYWQgPSAwOwotICBlbHNlIGlmIChmc2VlayhkaXNrLT5pbWFnZSwgYWRkciwgU0VFS19TRVQpIDwgMCkKLSAgICBucl9ieXRlc19yZWFkID0gMDsKLSAgZWxzZSBpZiAoZnJlYWQoZGVzdCwgbnJfYnl0ZXMsIDEsIGRpc2stPmltYWdlKSAhPSAxKQotICAgIG5yX2J5dGVzX3JlYWQgPSAwOwotICBlbHNlCi0gICAgbnJfYnl0ZXNfcmVhZCA9IG5yX2J5dGVzOwotICBEVFJBQ0UoZGlzaywgKCJpby1yZWFkIC0gYWRkcmVzcyAweCVseCwgbnItYnl0ZXMtcmVhZCAlZCwgcmVxdWVzdGVkICVkXG4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCAoaW50KW5yX2J5dGVzX3JlYWQsIChpbnQpbnJfYnl0ZXMpKTsKLSAgcmV0dXJuIG5yX2J5dGVzX3JlYWQ7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1od19kaXNrX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkJY29uc3Qgdm9pZCAqc291cmNlLAotCQkJaW50IHNwYWNlLAotCQkJdW5zaWduZWRfd29yZCBhZGRyLAotCQkJdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQljcHUgKnByb2Nlc3NvciwKLQkJCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKLSAgdW5zaWduZWQgbnJfYnl0ZXNfd3JpdHRlbjsKLSAgaWYgKHNwYWNlICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAid3JpdGUgLSBleHRlbmRlZCBkaXNrIGFkZHJlc3NpbmcgdW5pbXBsZW1lbnRlZCIpOwotICBpZiAoZGlzay0+cmVhZF9vbmx5KQotICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOwotICBlbHNlIGlmIChucl9ieXRlcyA9PSAwKQotICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOwotICBlbHNlIGlmIChmc2VlayhkaXNrLT5pbWFnZSwgYWRkciwgU0VFS19TRVQpIDwgMCkKLSAgICBucl9ieXRlc193cml0dGVuID0gMDsKLSAgZWxzZSBpZiAoZndyaXRlKHNvdXJjZSwgbnJfYnl0ZXMsIDEsIGRpc2stPmltYWdlKSAhPSAxKQotICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOwotICBlbHNlCi0gICAgbnJfYnl0ZXNfd3JpdHRlbiA9IG5yX2J5dGVzOwotICBEVFJBQ0UoZGlzaywgKCJpby13cml0ZSAtIGFkZHJlc3MgMHglbHgsIG5yLWJ5dGVzLXdyaXR0ZW4gJWQsIHJlcXVlc3RlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKGludClucl9ieXRlc193cml0dGVuLCAoaW50KW5yX2J5dGVzKSk7Ci0gIHJldHVybiBucl9ieXRlc193cml0dGVuOwotfQotCi0KLS8qIGluc3RhbmNlcyBvZiB0aGUgaHdfZGlzayBkZXZpY2UgKi8KLQotc3RhdGljIHZvaWQKLWh3X2Rpc2tfaW5zdGFuY2VfZGVsZXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCi17Ci0gIGh3X2Rpc2tfaW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7Ci0gIERJVFJBQ0UoZGlzaywgKCJkZWxldGUgLSBpbnN0YW5jZT0lbGRcbiIsCi0JCSAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpKSk7Ci0gIHpmcmVlKGRhdGEpOwotfQotCi1zdGF0aWMgaW50Ci1od19kaXNrX2luc3RhbmNlX3JlYWQoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLQkJICAgICAgdm9pZCAqYnVmLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKLSAgRElUUkFDRShkaXNrLCAoInJlYWQgLSBpbnN0YW5jZT0lbGQgbGVuPSVsZFxuIiwKLQkJICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSksCi0JCSAobG9uZylsZW4pKTsKLSAgaWYgKChkYXRhLT5wb3MgKyBsZW4pIDwgZGF0YS0+cG9zKQotICAgIHJldHVybiAtMTsgLyogb3ZlcmZsb3cgKi8KLSAgaWYgKGZzZWVrKGRhdGEtPmRpc2stPmltYWdlLCBkYXRhLT5wb3MsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICBpZiAoZnJlYWQoYnVmLCBsZW4sIDEsIGRhdGEtPmRpc2stPmltYWdlKSAhPSAxKQotICAgIHJldHVybiAtMTsKLSAgZGF0YS0+cG9zID0gZnRlbGwoZGF0YS0+ZGlzay0+aW1hZ2UpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50Ci1od19kaXNrX2luc3RhbmNlX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgICBjb25zdCB2b2lkICpidWYsCi0JCSAgICAgICB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKLSAgRElUUkFDRShkaXNrLCAoIndyaXRlIC0gaW5zdGFuY2U9JWxkIGxlbj0lbGRcbiIsCi0JCSAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAotCQkgKGxvbmcpbGVuKSk7Ci0gIGlmICgoZGF0YS0+cG9zICsgbGVuKSA8IGRhdGEtPnBvcykKLSAgICByZXR1cm4gLTE7IC8qIG92ZXJmbG93ICovCi0gIGlmIChkYXRhLT5kaXNrLT5yZWFkX29ubHkpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoZnNlZWsoZGF0YS0+ZGlzay0+aW1hZ2UsIGRhdGEtPnBvcywgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChmd3JpdGUoYnVmLCBsZW4sIDEsIGRhdGEtPmRpc2stPmltYWdlKSAhPSAxKQotICAgIHJldHVybiAtMTsKLSAgZGF0YS0+cG9zID0gZnRlbGwoZGF0YS0+ZGlzay0+aW1hZ2UpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50Ci1od19kaXNrX2luc3RhbmNlX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLQkJICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQotewotICBod19kaXNrX2luc3RhbmNlICpkYXRhID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBpZiAocG9zX2hpICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpLAotCQkgInNlZWsgLSBleHRlbmRlZCBhZGRyZXNzaW5nIHVuaW1wbGVtZW50ZWQiKTsKLSAgRElUUkFDRShkaXNrLCAoInNlZWsgLSBpbnN0YW5jZT0lbGQgcG9zX2hpPSVsZCBwb3NfbG89JWxkXG4iLAotCQkgKHVuc2lnbmVkIGxvbmcpZGV2aWNlX2luc3RhbmNlX3RvX2V4dGVybmFsKGluc3RhbmNlKSwKLQkJIChsb25nKXBvc19oaSwgKGxvbmcpcG9zX2xvKSk7Ci0gIGRhdGEtPnBvcyA9IHBvc19sbzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2Rpc2tfbWF4X3RyYW5zZmVyKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgaW50IG5fc3RhY2tfYXJncywKLQkJICAgICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCi0JCSAgICAgaW50IG5fc3RhY2tfcmV0dXJucywKLQkJICAgICB1bnNpZ25lZDMyIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMqL10pCi17Ci0gIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKLSAgaWYgKChuX3N0YWNrX2FyZ3MgIT0gMCkKLSAgICAgIHx8IChuX3N0YWNrX3JldHVybnMgIT0gMSkpIHsKLSAgICBkZXZpY2VfZXJyb3IobWUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgbWF4LXRyYW5zZmVyIG1ldGhvZFxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGVsc2UgewotICAgIHVuc2lnbmVkX2NlbGwgbWF4X3RyYW5zZmVyOwotICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm1heC10cmFuc2ZlciIpKQotICAgICAgbWF4X3RyYW5zZmVyID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIm1heC10cmFuc2ZlciIpOwotICAgIGVsc2UKLSAgICAgIG1heF90cmFuc2ZlciA9IDUxMjsKLSAgICBESVRSQUNFKGRpc2ssICgibWF4LXRyYW5zZmVyIC0gaW5zdGFuY2U9JWxkIG1heC10cmFuc2Zlcj0lbGRcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSksCi0JCSAgIChsb25nIGludCltYXhfdHJhbnNmZXIpKTsKLSAgICBzdGFja19yZXR1cm5zWzBdID0gbWF4X3RyYW5zZmVyOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2Rpc2tfYmxvY2tfc2l6ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkgICBpbnQgbl9zdGFja19hcmdzLAotCQkgICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCi0JCSAgIGludCBuX3N0YWNrX3JldHVybnMsCi0JCSAgIHVuc2lnbmVkMzIgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSkKLXsKLSAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOwotICBpZiAoKG5fc3RhY2tfYXJncyAhPSAwKQotICAgICAgfHwgKG5fc3RhY2tfcmV0dXJucyAhPSAxKSkgewotICAgIGRldmljZV9lcnJvcihtZSwgIkluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jay1zaXplIG1ldGhvZFxuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGVsc2UgewotICAgIHVuc2lnbmVkX2NlbGwgYmxvY2tfc2l6ZTsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJibG9jay1zaXplIikpCi0gICAgICBibG9ja19zaXplID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImJsb2NrLXNpemUiKTsKLSAgICBlbHNlCi0gICAgICBibG9ja19zaXplID0gNTEyOwotICAgIERJVFJBQ0UoZGlzaywgKCJibG9jay1zaXplIC0gaW5zdGFuY2U9JWxkIGJsb2NrLXNpemU9JWxkXG4iLAotCQkgICAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAotCQkgICAobG9uZyBpbnQpYmxvY2tfc2l6ZSkpOwotICAgIHN0YWNrX3JldHVybnNbMF0gPSBibG9ja19zaXplOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2Rpc2tfbnJfYmxvY2tzKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgaW50IG5fc3RhY2tfYXJncywKLQkJICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCi0JCSAgaW50IG5fc3RhY2tfcmV0dXJucywKLQkJICB1bnNpZ25lZDMyIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMqL10pCi17Ci0gIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKLSAgaWYgKChuX3N0YWNrX2FyZ3MgIT0gMCkKLSAgICAgIHx8IChuX3N0YWNrX3JldHVybnMgIT0gMSkpIHsKLSAgICBkZXZpY2VfZXJyb3IobWUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgYmxvY2stc2l6ZSBtZXRob2RcbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBlbHNlIHsKLSAgICB1bnNpZ25lZF93b3JkIG5yX2Jsb2NrczsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICIjYmxvY2tzIikpCi0gICAgICBucl9ibG9ja3MgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiI2Jsb2NrcyIpOwotICAgIGVsc2UKLSAgICAgIG5yX2Jsb2NrcyA9IC0xOwotICAgIERJVFJBQ0UoZGlzaywgKCIjYmxvY2tzIC0gaW5zdGFuY2U9JWxkICNibG9ja3M9JWxkXG4iLAotCQkgICAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAotCQkgICAobG9uZyBpbnQpbnJfYmxvY2tzKSk7Ci0gICAgc3RhY2tfcmV0dXJuc1swXSA9IG5yX2Jsb2NrczsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgZGV2aWNlX2luc3RhbmNlX21ldGhvZHMgaHdfZGlza19pbnN0YW5jZV9tZXRob2RzW10gPSB7Ci0gIHsgIm1heC10cmFuc2ZlciIsIGh3X2Rpc2tfbWF4X3RyYW5zZmVyIH0sCi0gIHsgImJsb2NrLXNpemUiLCBod19kaXNrX2Jsb2NrX3NpemUgfSwKLSAgeyAiI2Jsb2NrcyIsIGh3X2Rpc2tfbnJfYmxvY2tzIH0sCi0gIHsgTlVMTCwgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGh3X2Rpc2tfaW5zdGFuY2VfY2FsbGJhY2tzID0gewotICBod19kaXNrX2luc3RhbmNlX2RlbGV0ZSwKLSAgaHdfZGlza19pbnN0YW5jZV9yZWFkLAotICBod19kaXNrX2luc3RhbmNlX3dyaXRlLAotICBod19kaXNrX2luc3RhbmNlX3NlZWssCi0gIGh3X2Rpc2tfaW5zdGFuY2VfbWV0aG9kcywKLX07Ci0KLXN0YXRpYyBkZXZpY2VfaW5zdGFuY2UgKgotaHdfZGlza19jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKLQkJCWNvbnN0IGNoYXIgKnBhdGgsCi0JCQljb25zdCBjaGFyICphcmdzKQotewotICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlOwotICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKLSAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IFpBTExPQyhod19kaXNrX2luc3RhbmNlKTsKLSAgZGF0YS0+ZGlzayA9IGRpc2s7Ci0gIGRhdGEtPnBvcyA9IDA7Ci0gIGluc3RhbmNlID0gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAotCQkJCQkgZGF0YSwKLQkJCQkJIHBhdGgsIGFyZ3MsCi0JCQkJCSAmaHdfZGlza19pbnN0YW5jZV9jYWxsYmFja3MpOwotICBESVRSQUNFKGRpc2ssICgiY3JlYXRlIC0gcGF0aD0lcyglcykgaW5zdGFuY2U9JWxkXG4iLAotCQkgcGF0aCwgYXJncywKLQkJICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSkpKTsKLSAgcmV0dXJuIHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MpOwotfQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19kaXNrX2NhbGxiYWNrcyA9IHsKLSAgeyBod19kaXNrX2luaXRfYWRkcmVzcywgTlVMTCB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19kaXNrX2lvX3JlYWRfYnVmZmVyLAotICAgICAgaHdfZGlza19pb193cml0ZV9idWZmZXIsIH0sCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgTlVMTCwgfSwgLyogdW5pdCAqLwotICBod19kaXNrX2NyZWF0ZV9pbnN0YW5jZSwKLSAgaHdfZGlza19pb2N0bCwKLX07Ci0KLQotc3RhdGljIHZvaWQgKgotaHdfZGlza19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkgICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCi0gIGh3X2Rpc2tfZGV2aWNlICpod19kaXNrID0gWkFMTE9DKGh3X2Rpc2tfZGV2aWNlKTsKLSAgcmV0dXJuIGh3X2Rpc2s7Ci19Ci0KLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfZGlza19kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJkaXNrIiwgaHdfZGlza19jcmVhdGUsICZod19kaXNrX2NhbGxiYWNrcyB9LAotICB7ICJjZHJvbSIsIGh3X2Rpc2tfY3JlYXRlLCAmaHdfZGlza19jYWxsYmFja3MgfSwKLSAgeyAiZmxvcHB5IiwgaHdfZGlza19jcmVhdGUsICZod19kaXNrX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfRElTS19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19lZXByb20uYyBiL3NpbS9wcGMvaHdfZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTI5ODQuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19lZXByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDgzOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19FRVBST01fQ18KLSNkZWZpbmUgX0hXX0VFUFJPTV9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBERVZJQ0UKLQotCi0gICBlZXByb20gLSBKRURFQz8gY29tcGF0aWJsZSBlbGVjdHJpY2FseSBlcmFzYWJsZSBwcm9ncmFtYWJsZSBkZXZpY2UKLQotCi0gICBERVNDUklQVElPTgotCi0KLSAgIFRoaXMgZGV2aWNlIGltcGxlbWVudHMgYSBzbWFsbCBieXRlIGFkZHJlc3NhYmxlIEVFUFJPTS4KLSAgIFByb2dyYW1taW5nIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgc2FtZSB3cml0ZSBzZXF1ZW5jZXMgYXMgdXNlZCBieQotICAgc3RhbmRhcmQgbW9kZXJuIEVFUFJPTSBjb21wb25lbnRzLiAgV3JpdGVzIG9jY3VyZSBpbiByZWFsIHRpbWUsIHRoZQotICAgZGV2aWNlIHJldHVybmluZyBhIHByb2dyZXNzIHZhbHVlIHVudGlsIHRoZSBwcm9ncmFtaW5nIGhhcyBiZWVuCi0gICBjb21wbGV0ZWQuCi0KLSAgIEl0IGlzIGJhc2VkIG9uIHRoZSBBTUQgMjlGMDQwIGNvbXBvbmVudC4KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgcmVnID0gPGFkZHJlc3M+IDxzaXplPiAocmVxdWlyZWQpCi0KLSAgIERldGVybWluZSB3aGVyZSB0aGUgZGV2aWNlIGxpdmVzIGluIHRoZSBwYXJlbnRzIGFkZHJlc3Mgc3BhY2UuCi0KLQotICAgbnItc2VjdG9ycyA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCi0KLSAgIFdoZW4gZXJhc2luZyBhbiBlbnRpcmUgc2VjdG9yIGlzIGNsZWFyZWQgYXQgYSB0aW1lLiAgVGhpcyBzcGVjaWZpZXMKLSAgIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBpbiB0aGUgRUVQUk9NIGNvbXBvbmVudC4KLQotCi0gICBzZWN0b3Itc2l6ZSA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCi0KLSAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzZWN0b3IuICBXaGVuIGVyYXNpbmcsIG1lbW9yeSBjaHVua3Mgb2YKLSAgIHRoaXMgc2l6ZSBhcmUgY2xlYXJlZC4KLQotICAgTk9URTogVGhlIHByb2R1Y3QgbnItc2VjdG9ycyAqIHNlY3Rvci1zaXplIGRvZXMgbm90IG5lZWQgdG8gbWFwIHRoZQotICAgc2l6ZSBzcGVjaWZpZWQgaW4gdGhlIHJlZyBwcm9wZXJ0eS4gIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBpcwotICAgc21hbGxlciBwYXJ0IG9mIHRoZSBlZXByb20gd2lsbCBub3QgYmUgYWNjZXNzaWJsZSB3aGlsZSBpZiBpdCBpcwotICAgbGFyZ2VyIHRoZSBhZGRyZXNzZXMgd2lsbCB3cmFwLgotCi0KLSAgIGJ5dGUtd3JpdGUtZGVsYXkgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQotCi0gICBOdW1iZXIgb2YgY2xvY2sgdGlja3MgYmVmb3JlIHRoZSBwcm9ncmFtbWluZyBvZiBhIHNpbmdsZSBieXRlCi0gICBjb21wbGV0ZXMuCi0KLQotICAgc2VjdG9yLXN0YXJ0LWRlbGF5ID0gPGludGVnZXI+IChyZXF1aXJlZCkKLQotICAgV2hlbiBlcmFzaW5nIHNlY3RvcnMsIHRoZSBudW1iZXIgb2YgY2xvY2sgdGlja3MgYWZ0ZXIgdGhlIHNlY3RvcgotICAgaGFzIGJlZW4gc3BlY2lmaWVkIHRoYXQgdGhlIGFjdHVhbCBlcmFzZSBwcm9jZXNzIGNvbW1lbmNlcy4KLQotCi0gICBlcmFzZS1kZWxheSA9IDxpbnRnZXI+IChyZXF1aXJlZCkKLQotICAgTnVtYmVyIG9mIGNsb2NrIHRpY2tzIGJlZm9yZSBhbiBlcmFzZSBwcm9ncmFtIGNvbXBsZXRlcwotCi0KLSAgIG1hbnVmYWN0dXJlLWNvZGUgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQotCi0gICBUaGUgb25lIGJ5dGUgdmFsdWUgcmV0dXJuZWQgd2hlbiB0aGUgYXV0by1zZWxlY3QgbWFudWZhY3R1cmVyIGNvZGUKLSAgIGlzIHJlYWQuCi0KLQotICAgZGV2aWNlLWNvZGUgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQotCi0gICBUaGUgb25lIGJ5dGUgdmFsdWUgcmV0dXJuZWQgd2hlbiB0aGUgYXV0by1zZWxlY3QgZGV2aWNlIGNvZGUgaXMKLSAgIHJlYWQuCi0KLQotICAgaW5wdXQtZmlsZSA9IDxmaWxlLW5hbWU+IChvcHRpb25hbCkKLQotICAgSW5pdGlhbGl6ZSB0aGUgZWVwcm9tIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmluYXJ5IGZpbGUuCi0KLQotICAgb3V0cHV0LWZpbGUgPSA8ZmlsZS1uYW1lPiAob3B0aW9uYWwpCi0KLSAgIFdoZW4gZXZlciB0aGUgZWVwcm9tIGlzIHVwZGF0ZWQsIHNhdmUgdGhlIG1vZGlmaWVkIGltYWdlIGludG8gdGhlCi0gICBzcGVjaWZpZWQgZmlsZS4KLQotCi0gICBFWEFNUExFUwotCi0KLSAgIEVuYWJsZSB0cmFjaW5nIG9mIHRoZSBlZXByb206Ci0KLSAgIHwgIGJhc2gkIHBzaW0gLXQgZWVwcm9tLWRldmljZSBcCi0KLQotICAgQ29uZmlndXJlIHNvbWV0aGluZyB2ZXJ5IGxpa2UgdGhlIEFtZCBBbTI5RjA0MCAtIDUxMmJ5dGUgRUVQUk9NCi0gICAoYnV0IGEgYml0IGZhc3Rlcik6Ci0KLSAgIHwgIC1vICcvZWVwcm9tQDB4ZmZmMDAwMDAvcmVnIDB4ZmZmMDAwMDAgMHg4MDAwMCcgXAotICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9uci1zZWN0b3JzIDgnIFwKLSAgIHwgIC1vICcvZWVwcm9tQDB4ZmZmMDAwMDAvc2VjdG9yLXNpemUgMHgxMDAwMCcgXAotICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9ieXRlLXdyaXRlLWRlbGF5IDEwMDAnIFwKLSAgIHwgIC1vICcvZWVwcm9tQDB4ZmZmMDAwMDAvc2VjdG9yLXN0YXJ0LWRlbGF5IDEwMCcgXAotICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9lcmFzZS1kZWxheSAxMDAwJyBcCi0gICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL21hbnVmYWN0dXJlLWNvZGUgMHgwMScgXAotICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9kZXZpY2UtY29kZSAweGE0JyBcCi0KLQotICAgSW5pdGlhbGl6ZSB0aGUgZWVwcm9tIGZyb20gdGhlIGZpbGUgPDwvZGV2L3plcm8+PjoKLQotICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9pbnB1dC1maWxlIC9kZXYvemVybycKLQotCi0gICBCVUdTCi0KLQotICAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgcmVhZF9yZXNldCwKLSAgd3JpdGVfbnJfMiwKLSAgd3JpdGVfbnJfMywKLSAgd3JpdGVfbnJfNCwKLSAgd3JpdGVfbnJfNSwKLSAgd3JpdGVfbnJfNiwKLSAgYnl0ZV9wcm9ncmFtLAotICBieXRlX3Byb2dyYW1taW5nLAotICBjaGlwX2VyYXNlLAotICBzZWN0b3JfZXJhc2UsCi0gIHNlY3Rvcl9lcmFzZV9zdXNwZW5kLAotICBhdXRvc2VsZWN0LAotfSBod19lZXByb21fc3RhdGVzOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zdGF0ZTJhKGh3X2VlcHJvbV9zdGF0ZXMgc3RhdGUpCi17Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgY2FzZSByZWFkX3Jlc2V0OiByZXR1cm4gInJlYWRfcmVzZXQiOwotICBjYXNlIHdyaXRlX25yXzI6IHJldHVybiAid3JpdGVfbnJfMiI7Ci0gIGNhc2Ugd3JpdGVfbnJfMzogcmV0dXJuICJ3cml0ZV9ucl8zIjsKLSAgY2FzZSB3cml0ZV9ucl80OiByZXR1cm4gIndyaXRlX25yXzQiOwotICBjYXNlIHdyaXRlX25yXzU6IHJldHVybiAid3JpdGVfbnJfNSI7Ci0gIGNhc2Ugd3JpdGVfbnJfNjogcmV0dXJuICJ3cml0ZV9ucl82IjsKLSAgY2FzZSBieXRlX3Byb2dyYW06IHJldHVybiAiYnl0ZV9wcm9ncmFtIjsKLSAgY2FzZSBieXRlX3Byb2dyYW1taW5nOiByZXR1cm4gImJ5dGVfcHJvZ3JhbW1pbmciOwotICBjYXNlIGNoaXBfZXJhc2U6IHJldHVybiAiY2hpcF9lcmFzZSI7Ci0gIGNhc2Ugc2VjdG9yX2VyYXNlOiByZXR1cm4gInNlY3Rvcl9lcmFzZSI7Ci0gIGNhc2Ugc2VjdG9yX2VyYXNlX3N1c3BlbmQ6IHJldHVybiAic2VjdG9yX2VyYXNlX3N1c3BlbmQiOwotICBjYXNlIGF1dG9zZWxlY3Q6IHJldHVybiAiYXV0b3NlbGVjdCI7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IF9od19lZXByb21fZGV2aWNlIHsKLSAgLyogZ2VuZXJhbCAqLwotICBod19lZXByb21fc3RhdGVzIHN0YXRlOwotICB1bnNpZ25lZDggKm1lbW9yeTsKLSAgdW5zaWduZWQgc2l6ZW9mX21lbW9yeTsKLSAgdW5zaWduZWQgZXJhc2VfZGVsYXk7Ci0gIHNpZ25lZDY0IHByb2dyYW1fc3RhcnRfdGltZTsKLSAgc2lnbmVkNjQgcHJvZ3JhbV9maW5pc2hfdGltZTsKLSAgdW5zaWduZWQ4IG1hbnVmYWN0dXJlX2NvZGU7Ci0gIHVuc2lnbmVkOCBkZXZpY2VfY29kZTsKLSAgdW5zaWduZWQ4IHRvZ2dsZV9iaXQ7Ci0gIC8qIGluaXRpYWxpemF0aW9uICovCi0gIGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVfbmFtZTsKLSAgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVfbmFtZTsKLSAgLyogZm9yIHNlY3RvciBhbmQgc2VjdG9yIHByb2dyYW1taW5nICovCi0gIGh3X2VlcHJvbV9zdGF0ZXMgc2VjdG9yX3N0YXRlOwotICB1bnNpZ25lZDggKnNlY3RvcnM7Ci0gIHVuc2lnbmVkIG5yX3NlY3RvcnM7Ci0gIHVuc2lnbmVkIHNpemVvZl9zZWN0b3I7Ci0gIHVuc2lnbmVkIHNlY3Rvcl9zdGFydF9kZWxheTsKLSAgdW5zaWduZWQgc2VjdG9yX3N0YXJ0X3RpbWU7Ci0gIC8qIGJ5dGUgYW5kIGJ5dGUgcHJvZ3JhbW1pbmcgKi8KLSAgdW5zaWduZWQgYnl0ZV93cml0ZV9kZWxheTsKLSAgdW5zaWduZWRfd29yZCBieXRlX3Byb2dyYW1fYWRkcmVzczsKLSAgdW5zaWduZWQ4IGJ5dGVfcHJvZ3JhbV9ieXRlOwotfSBod19lZXByb21fZGV2aWNlOwotCi10eXBlZGVmIHN0cnVjdCBfaHdfZWVwcm9tX3JlZ19zcGVjIHsKLSAgdW5zaWduZWQzMiBiYXNlOwotICB1bnNpZ25lZDMyIHNpemU7Ci19IGh3X2VlcHJvbV9yZWdfc3BlYzsKLQotc3RhdGljIHZvaWQKLWh3X2VlcHJvbV9pbml0X2RhdGEoZGV2aWNlICptZSkKLXsKLSAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tID0gKGh3X2VlcHJvbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLQotICAvKiBoYXZlIHdlIGFueSBpbnB1dCBvciBvdXRwdXQgZmlsZXMgKi8KLSAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiaW5wdXQtZmlsZSIpICE9IE5VTEwpCi0gICAgZWVwcm9tLT5pbnB1dF9maWxlX25hbWUgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJpbnB1dC1maWxlIik7Ci0gIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm91dHB1dC1maWxlIikgIT0gTlVMTCkKLSAgICBlZXByb20tPmlucHV0X2ZpbGVfbmFtZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgIm91dHB1dC1maWxlIik7Ci0KLSAgLyogZmlndXJlIG91dCB0aGUgc2VjdG9ycyBpbiB0aGUgZWVwcm9tICovCi0gIGlmIChlZXByb20tPnNlY3RvcnMgPT0gTlVMTCkgewotICAgIGVlcHJvbS0+bnJfc2VjdG9ycyA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJuci1zZWN0b3JzIik7Ci0gICAgZWVwcm9tLT5zaXplb2Zfc2VjdG9yID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInNlY3Rvci1zaXplIik7Ci0gICAgZWVwcm9tLT5zZWN0b3JzID0gemFsbG9jKGVlcHJvbS0+bnJfc2VjdG9ycyk7Ci0gIH0KLSAgZWxzZQotICAgIG1lbXNldChlZXByb20tPnNlY3RvcnMsIDAsIGVlcHJvbS0+bnJfc2VjdG9ycyk7Ci0KLSAgLyogaW5pdGlhbGl6ZSB0aGUgZWVwcm9tICovCi0gIGlmIChlZXByb20tPm1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgZWVwcm9tLT5zaXplb2ZfbWVtb3J5ID0gZWVwcm9tLT5zaXplb2Zfc2VjdG9yICogZWVwcm9tLT5ucl9zZWN0b3JzOwotICAgIGVlcHJvbS0+bWVtb3J5ID0gemFsbG9jKGVlcHJvbS0+c2l6ZW9mX21lbW9yeSk7Ci0gIH0KLSAgZWxzZQotICAgIG1lbXNldChlZXByb20tPm1lbW9yeSwgMCwgZWVwcm9tLT5zaXplb2ZfbWVtb3J5KTsKLSAgaWYgKGVlcHJvbS0+aW5wdXRfZmlsZV9uYW1lICE9IE5VTEwpIHsKLSAgICBpbnQgaTsKLSAgICBGSUxFICppbnB1dF9maWxlID0gZm9wZW4oZWVwcm9tLT5pbnB1dF9maWxlX25hbWUsICJyIik7Ci0gICAgaWYgKGlucHV0X2ZpbGUgPT0gTlVMTCkgewotICAgICAgcGVycm9yKCJlZXByb20iKTsKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIkZhaWxlZCB0byBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGVlcHJvbS0+aW5wdXRfZmlsZV9uYW1lKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGVlcHJvbS0+c2l6ZW9mX21lbW9yeTsgaSsrKSB7Ci0gICAgICBpZiAoZnJlYWQoJmVlcHJvbS0+bWVtb3J5W2ldLCAxLCAxLCBpbnB1dF9maWxlKSAhPSAxKQotCWJyZWFrOwotICAgIH0KLSAgICBmY2xvc2UoaW5wdXRfZmlsZSk7Ci0gIH0KLQotICAvKiB0aW1pbmcgKi8KLSAgZWVwcm9tLT5ieXRlX3dyaXRlX2RlbGF5ID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImJ5dGUtd3JpdGUtZGVsYXkiKTsKLSAgZWVwcm9tLT5zZWN0b3Jfc3RhcnRfZGVsYXkgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAic2VjdG9yLXN0YXJ0LWRlbGF5Iik7Ci0gIGVlcHJvbS0+ZXJhc2VfZGVsYXkgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiZXJhc2UtZGVsYXkiKTsKLQotICAvKiBtaXNjICovCi0gIGVlcHJvbS0+bWFudWZhY3R1cmVfY29kZSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJtYW51ZmFjdHVyZS1jb2RlIik7Ci0gIGVlcHJvbS0+ZGV2aWNlX2NvZGUgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiZGV2aWNlLWNvZGUiKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotaW52YWxpZF9yZWFkKGRldmljZSAqbWUsCi0JICAgICBod19lZXByb21fc3RhdGVzIHN0YXRlLAotCSAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzLAotCSAgICAgY29uc3QgY2hhciAqcmVhc29uKQotewotICBEVFJBQ0UoZWVwcm9tLCAoIkludmFsaWQgcmVhZCB0byAweCVseCB3aGlsZSBpbiBzdGF0ZSAlcyAoJXMpXG4iLAotCQkgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCi0JCSAgc3RhdGUyYShzdGF0ZSksCi0JCSAgcmVhc29uKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkX3dyaXRlKGRldmljZSAqbWUsCi0JICAgICAgaHdfZWVwcm9tX3N0YXRlcyBzdGF0ZSwKLQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCi0JICAgICAgdW5zaWduZWQ4IGRhdGEsCi0JICAgICAgY29uc3QgY2hhciAqcmVhc29uKQotewotICBEVFJBQ0UoZWVwcm9tLCAoIkludmFsaWQgd3JpdGUgb2YgMHglbHggdG8gMHglbHggd2hpbGUgaW4gc3RhdGUgJXMgKCVzKVxuIiwKLQkJICAodW5zaWduZWQgbG9uZylkYXRhLAotCQkgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCi0JCSAgc3RhdGUyYShzdGF0ZSksCi0JCSAgcmVhc29uKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2VlcHJvbShkZXZpY2UgKm1lLAotCSAgICBod19lZXByb21fZGV2aWNlICplZXByb20pCi17Ci0gIGlmIChlZXByb20tPm91dHB1dF9maWxlX25hbWUgIT0gTlVMTCkgewotICAgIGludCBpOwotICAgIEZJTEUgKm91dHB1dF9maWxlID0gZm9wZW4oZWVwcm9tLT5vdXRwdXRfZmlsZV9uYW1lLCAidyIpOwotICAgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKSB7Ci0gICAgICBwZXJyb3IoImVlcHJvbSIpOwotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsCi0JCSAgIGVlcHJvbS0+b3V0cHV0X2ZpbGVfbmFtZSk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBlZXByb20tPnNpemVvZl9tZW1vcnk7IGkrKykgewotICAgICAgaWYgKGZ3cml0ZSgmZWVwcm9tLT5tZW1vcnlbaV0sIDEsIDEsIG91dHB1dF9maWxlKSAhPSAxKQotCWJyZWFrOwotICAgIH0KLSAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOwotICB9Ci19Ci0KLQotLyogcHJvZ3JhbSBhIHNpbmdsZSBieXRlIG9mIGVlcHJvbSAqLwotCi1zdGF0aWMgdm9pZAotc3RhcnRfcHJvZ3JhbW1pbmdfYnl0ZShkZXZpY2UgKm1lLAotCQkgICAgICAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzLAotCQkgICAgICAgdW5zaWduZWQ4IG5ld19ieXRlKQotewotICB1bnNpZ25lZDggb2xkX2J5dGUgPSBlZXByb20tPm1lbW9yeVthZGRyZXNzXTsKLSAgRFRSQUNFKGVlcHJvbSwgKCJzdGFydC1wcm9ncmFtaW5nLWJ5dGUgLSBhZGRyZXNzIDB4JWx4LCBuZXcgMHglbHgsIG9sZCAweCVseFxuIiwKLQkJICAodW5zaWduZWQgbG9uZylhZGRyZXNzLAotCQkgICh1bnNpZ25lZCBsb25nKW5ld19ieXRlLAotCQkgICh1bnNpZ25lZCBsb25nKW9sZF9ieXRlKSk7Ci0gIGVlcHJvbS0+Ynl0ZV9wcm9ncmFtX2FkZHJlc3MgPSBhZGRyZXNzOwotICAvKiA6IG9sZCBuZXcgOiB+b2xkIDogbmV3Jn5vbGQKLSAgICAgOiAgMCAgIDAgIDogICAxICA6ICAgIDAKLSAgICAgOiAgMCAgIDEgIDogICAxICA6ICAgIDEgICAgIC0tIGNhbiBub3Qgc2V0IGEgYml0Ci0gICAgIDogIDEgICAwICA6ICAgMCAgOiAgICAwCi0gICAgIDogIDEgICAxICA6ICAgMCAgOiAgICAwICovCi0gIGlmICh+b2xkX2J5dGUgJiBuZXdfYnl0ZSkKLSAgICBpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBuZXdfYnl0ZSwgInNldHRpbmcgY2xlYXJlZCBiaXQiKTsKLSAgLyogOiBvbGQgbmV3IDogb2xkJm5ldwotICAgICA6ICAwICAgMCAgOiAgICAwCi0gICAgIDogIDAgICAxICA6ICAgIDAKLSAgICAgOiAgMSAgIDAgIDogICAgMAotICAgICA6ICAxICAgMSAgOiAgICAxICovCi0gIGVlcHJvbS0+Ynl0ZV9wcm9ncmFtX2J5dGUgPSBuZXdfYnl0ZSAmIG9sZF9ieXRlOwotICBlZXByb20tPm1lbW9yeVthZGRyZXNzXSA9IH5uZXdfYnl0ZSAmIH4weDI0OyAvKiBMRS1iaXRzIDU6MyB6ZXJvICovCi0gIGVlcHJvbS0+cHJvZ3JhbV9zdGFydF90aW1lID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotICBlZXByb20tPnByb2dyYW1fZmluaXNoX3RpbWUgPSAoZWVwcm9tLT5wcm9ncmFtX3N0YXJ0X3RpbWUKLQkJCQkgKyBlZXByb20tPmJ5dGVfd3JpdGVfZGVsYXkpOwotfQotCi1zdGF0aWMgdm9pZAotZmluaXNoX3Byb2dyYW1taW5nX2J5dGUoZGV2aWNlICptZSwKLQkJCWh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSkKLXsKLSAgRFRSQUNFKGVlcHJvbSwgKCJmaW5pc2gtcHJvZ3JhbW1pbmctYnl0ZSAtIGFkZHJlc3MgMHglbHgsIGJ5dGUgMHglbHhcbiIsCi0JCSAgKHVuc2lnbmVkIGxvbmcpZWVwcm9tLT5ieXRlX3Byb2dyYW1fYWRkcmVzcywKLQkJICAodW5zaWduZWQgbG9uZyllZXByb20tPmJ5dGVfcHJvZ3JhbV9ieXRlKSk7Ci0gIGVlcHJvbS0+bWVtb3J5W2VlcHJvbS0+Ynl0ZV9wcm9ncmFtX2FkZHJlc3NdID0gZWVwcm9tLT5ieXRlX3Byb2dyYW1fYnl0ZTsKLSAgZHVtcF9lZXByb20obWUsIGVlcHJvbSk7Ci19Ci0KLQotLyogZXJhc2UgdGhlIGVlcHJvbSBjb21wbGV0bHkgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0X2VyYXNpbmdfY2hpcChkZXZpY2UgKm1lLAotCQkgICBod19lZXByb21fZGV2aWNlICplZXByb20pCi17Ci0gIERUUkFDRShlZXByb20sICgic3RhcnQtZXJhc2luZy1jaGlwXG4iKSk7Ci0gIG1lbXNldChlZXByb20tPm1lbW9yeSwgMCwgZWVwcm9tLT5zaXplb2ZfbWVtb3J5KTsKLSAgZWVwcm9tLT5wcm9ncmFtX3N0YXJ0X3RpbWUgPSBkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSk7Ci0gIGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSA9IChlZXByb20tPnByb2dyYW1fc3RhcnRfdGltZQotCQkJCSArIGVlcHJvbS0+ZXJhc2VfZGVsYXkpOwotfQotCi1zdGF0aWMgdm9pZAotZmluaXNoX2VyYXNpbmdfY2hpcChkZXZpY2UgKm1lLAotCQkgICAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tKQotewotICBEVFJBQ0UoZWVwcm9tLCAoImZpbmlzaC1lcmFzaW5nLWNoaXBcbiIpKTsKLSAgbWVtc2V0KGVlcHJvbS0+bWVtb3J5LCAweGZmLCBlZXByb20tPnNpemVvZl9tZW1vcnkpOwotICBkdW1wX2VlcHJvbShtZSwgZWVwcm9tKTsKLX0KLQotCi0vKiBlcmFzZSBhIHNpbmdsZSBzZWN0b3Igb2YgdGhlIGVlcHJvbSAqLwotCi1zdGF0aWMgdm9pZAotc3RhcnRfZXJhc2luZ19zZWN0b3IoZGV2aWNlICptZSwKLQkJICAgICBod19lZXByb21fZGV2aWNlICplZXByb20sCi0JCSAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzKQotewotICBpbnQgc2VjdG9yID0gYWRkcmVzcyAvIGVlcHJvbS0+c2l6ZW9mX3NlY3RvcjsKLSAgRFRSQUNFKGVlcHJvbSwgKCJzdGFydC1lcmFzaW5nLXNlY3RvciAtIGFkZHJlc3MgMHglbHgsIHNlY3RvciAlZFxuIiwKLQkJICAodW5zaWduZWQgbG9uZylhZGRyZXNzLCBzZWN0b3IpKTsKLSAgQVNTRVJUKHNlY3RvciA8IGVlcHJvbS0+bnJfc2VjdG9ycyk7Ci0gIGVlcHJvbS0+c2VjdG9yc1tzZWN0b3JdID0gMTsKLSAgbWVtc2V0KGVlcHJvbS0+bWVtb3J5ICsgc2VjdG9yICogZWVwcm9tLT5zaXplb2Zfc2VjdG9yLAotCSAweDQsIGVlcHJvbS0+c2l6ZW9mX3NlY3Rvcik7Ci0gIGVlcHJvbS0+cHJvZ3JhbV9zdGFydF90aW1lID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotICBlZXByb20tPnNlY3Rvcl9zdGFydF90aW1lID0gKGVlcHJvbS0+cHJvZ3JhbV9zdGFydF90aW1lCi0JCQkgICAgICAgKyBlZXByb20tPnNlY3Rvcl9zdGFydF9kZWxheSk7Ci0gIGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSA9IChlZXByb20tPnNlY3Rvcl9zdGFydF90aW1lCi0JCQkJICsgZWVwcm9tLT5lcmFzZV9kZWxheSk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLWZpbmlzaF9lcmFzaW5nX3NlY3RvcihkZXZpY2UgKm1lLAotCQkgICAgICBod19lZXByb21fZGV2aWNlICplZXByb20pCi17Ci0gIGludCBzZWN0b3I7Ci0gIERUUkFDRShlZXByb20sICgiZmluaXNoLWVyYXNpbmctc2VjdG9yXG4iKSk7Ci0gIGZvciAoc2VjdG9yID0gMDsgc2VjdG9yIDwgZWVwcm9tLT5ucl9zZWN0b3JzOyBzZWN0b3IrKykgewotICAgIGlmIChlZXByb20tPnNlY3RvcnNbc2VjdG9yXSkgewotICAgICAgZWVwcm9tLT5zZWN0b3JzW3NlY3Rvcl0gPSAwOwotICAgICAgbWVtc2V0KGVlcHJvbS0+bWVtb3J5ICsgc2VjdG9yICogZWVwcm9tLT5zaXplb2Zfc2VjdG9yLAotCSAgICAgMHhmZiwgZWVwcm9tLT5zaXplb2Zfc2VjdG9yKTsKLSAgICB9Ci0gIH0KLSAgZHVtcF9lZXByb20obWUsIGVlcHJvbSk7Ci19Ci0KLQotLyogZWVwcm9tIHJlYWRzICovCi0KLXN0YXRpYyB1bnNpZ25lZDgKLXRvZ2dsZShod19lZXByb21fZGV2aWNlICplZXByb20sCi0gICAgICAgdW5zaWduZWQ4IGJ5dGUpCi17Ci0gIGVlcHJvbS0+dG9nZ2xlX2JpdCA9IGVlcHJvbS0+dG9nZ2xlX2JpdCBeIDB4NDA7IC8qIGxlLWJpdCA2ICovCi0gIHJldHVybiBlZXByb20tPnRvZ2dsZV9iaXQgXiBieXRlOwotfQotCi1zdGF0aWMgdW5zaWduZWQ4Ci1yZWFkX2J5dGUoZGV2aWNlICptZSwKLQkgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSwKLQkgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcykKLXsKLSAgLyogbWF5IG5lZWQgbXVsdGlwbGUgaXRlcmF0aW9ucyBvZiB0aGlzICovCi0gIHdoaWxlICgxKSB7Ci0gICAgc3dpdGNoIChlZXByb20tPnN0YXRlKSB7Ci0KLSAgICBjYXNlIHJlYWRfcmVzZXQ6Ci0gICAgICByZXR1cm4gZWVwcm9tLT5tZW1vcnlbYWRkcmVzc107Ci0KLSAgICBjYXNlIGF1dG9zZWxlY3Q6Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAweGZmKSA9PSAweDAwKQotCXJldHVybiBlZXByb20tPm1hbnVmYWN0dXJlX2NvZGU7Ci0gICAgICBlbHNlIGlmICgoYWRkcmVzcyAmIDB4ZmYpID09IDB4MDEpCi0JcmV0dXJuIGVlcHJvbS0+ZGV2aWNlX2NvZGU7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7IC8qIG5vdCBjZXJ0YWluIGFib3V0IHRoaXMgKi8KLQotICAgIGNhc2UgYnl0ZV9wcm9ncmFtbWluZzoKLSAgICAgIGlmIChkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSkgPiBlZXByb20tPnByb2dyYW1fZmluaXNoX3RpbWUpIHsKLQlmaW5pc2hfcHJvZ3JhbW1pbmdfYnl0ZShtZSwgZWVwcm9tKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFkZHJlc3MgPT0gZWVwcm9tLT5ieXRlX3Byb2dyYW1fYWRkcmVzcykgewotCXJldHVybiB0b2dnbGUoZWVwcm9tLCBlZXByb20tPm1lbW9yeVthZGRyZXNzXSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkvKiB0cmFzaCB0aGF0IG1lbW9yeSBsb2NhdGlvbiAqLwotCWludmFsaWRfcmVhZChtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgIm5vdCBieXRlIHByb2dyYW0gYWRkcmVzcyIpOwotCWVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdID0gKGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdCi0JCQkJICAgJiBlZXByb20tPmJ5dGVfcHJvZ3JhbV9ieXRlKTsKLQlyZXR1cm4gdG9nZ2xlKGVlcHJvbSwgZWVwcm9tLT5tZW1vcnlbZWVwcm9tLT5ieXRlX3Byb2dyYW1fYWRkcmVzc10pOwotICAgICAgfQotCi0gICAgY2FzZSBjaGlwX2VyYXNlOgotICAgICAgaWYgKGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKSA+IGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSkgewotCWZpbmlzaF9lcmFzaW5nX2NoaXAobWUsIGVlcHJvbSk7Ci0JZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlyZXR1cm4gdG9nZ2xlKGVlcHJvbSwgZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10pOwotICAgICAgfQotCi0gICAgY2FzZSBzZWN0b3JfZXJhc2U6Ci0gICAgICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lKSB7Ci0JZmluaXNoX2VyYXNpbmdfc2VjdG9yKG1lLCBlZXByb20pOwotCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OwotCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIWVlcHJvbS0+c2VjdG9yc1thZGRyZXNzIC8gZWVwcm9tLT5zaXplb2Zfc2VjdG9yXSkgewotCS8qIHJlYWQgdG8gd3Jvbmcgc2VjdG9yICovCi0JaW52YWxpZF9yZWFkKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCAic2VjdG9yIG5vdCBiZWluZyBlcmFzZWQiKTsKLQlyZXR1cm4gdG9nZ2xlKGVlcHJvbSwgZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10pICYgfjB4ODsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKSA+IGVlcHJvbS0+c2VjdG9yX3N0YXJ0X3RpbWUpIHsKLQlyZXR1cm4gdG9nZ2xlKGVlcHJvbSwgZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10pIHwgMHg4OwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JcmV0dXJuIHRvZ2dsZShlZXByb20sIGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdKSAmIH4weDg7Ci0gICAgICB9Ci0KLSAgICBjYXNlIHNlY3Rvcl9lcmFzZV9zdXNwZW5kOgotICAgICAgaWYgKCFlZXByb20tPnNlY3RvcnNbYWRkcmVzcyAvIGVlcHJvbS0+c2l6ZW9mX3NlY3Rvcl0pIHsKLQlyZXR1cm4gZWVwcm9tLT5tZW1vcnlbYWRkcmVzc107Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlpbnZhbGlkX3JlYWQobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsICJzZWN0b3IgYmVpbmcgZXJhc2VkIik7Ci0JcmV0dXJuIGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGludmFsaWRfcmVhZChtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgImludmFsaWQgc3RhdGUiKTsKLSAgICAgIHJldHVybiBlZXByb20tPm1lbW9yeVthZGRyZXNzXTsKLQotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQkJICAgICAgIAotc3RhdGljIHVuc2lnbmVkCi1od19lZXByb21faW9fcmVhZF9idWZmZXIoZGV2aWNlICptZSwKLQkJCSB2b2lkICpkZXN0LAotCQkJIGludCBzcGFjZSwKLQkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkgY3B1ICpwcm9jZXNzb3IsCi0JCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSA9IChod19lZXByb21fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykgewotICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcyA9IChhZGRyICsgaSkgJSBlZXByb20tPnNpemVvZl9tZW1vcnk7Ci0gICAgdW5zaWduZWQ4IGJ5dGUgPSByZWFkX2J5dGUobWUsIGVlcHJvbSwgYWRkcmVzcyk7Ci0gICAgKCh1bnNpZ25lZDgqKWRlc3QpW2ldID0gYnl0ZTsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotLyogZWVwcm9tIHdyaXRlcyAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfYnl0ZShkZXZpY2UgKm1lLAotCSAgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSwKLQkgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCi0JICAgdW5zaWduZWQ4IGRhdGEpCi17Ci0gIC8qIG1heSBuZWVkIG11bHRpcGxlIHRyYW5zaXRpb25zIHRvIHByb2Nlc3MgYSB3cml0ZSAqLwotICB3aGlsZSAoMSkgewotICAgIHN3aXRjaCAoZWVwcm9tLT5zdGF0ZSkgewotCi0gICAgY2FzZSByZWFkX3Jlc2V0OgotICAgICAgaWYgKGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhhYSkKLQllZXByb20tPnN0YXRlID0gd3JpdGVfbnJfMjsKLSAgICAgIGVsc2UgaWYgKGRhdGEgPT0gMHhmMCkKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLSAgICAgIGVsc2UgewotCWludmFsaWRfd3JpdGUobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsIGRhdGEsICJ1bmV4cGVjdGVkIik7Ci0JZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIHdyaXRlX25yXzI6Ci0gICAgICBpZiAoYWRkcmVzcyA9PSAweDJhYWEgJiYgZGF0YSA9PSAweDU1KQotCWVlcHJvbS0+c3RhdGUgPSB3cml0ZV9ucl8zOwotICAgICAgZWxzZSB7Ci0JaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgInVuZXhwZWN0ZWQiKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2Ugd3JpdGVfbnJfMzoKLSAgICAgIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4ZjApCi0JZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0gICAgICBlbHNlIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4OTApCi0JZWVwcm9tLT5zdGF0ZSA9IGF1dG9zZWxlY3Q7Ci0gICAgICBlbHNlIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4YTApIHsKLQllZXByb20tPnN0YXRlID0gYnl0ZV9wcm9ncmFtOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweDgwKQotCWVlcHJvbS0+c3RhdGUgPSB3cml0ZV9ucl80OwotICAgICAgZWxzZSB7Ci0JaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgInVuZXhwZWN0ZWQiKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2Ugd3JpdGVfbnJfNDoKLSAgICAgIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4YWEpCi0JZWVwcm9tLT5zdGF0ZSA9IHdyaXRlX25yXzU7Ci0gICAgICBlbHNlIHsKLQlpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBkYXRhLCAidW5leHBlY3RlZCIpOwotCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OwotICAgICAgfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSB3cml0ZV9ucl81OgotICAgICAgaWYgKGFkZHJlc3MgPT0gMHgyYWFhICYmIGRhdGEgPT0gMHg1NSkKLQllZXByb20tPnN0YXRlID0gd3JpdGVfbnJfNjsKLSAgICAgIGVsc2UgewotCWludmFsaWRfd3JpdGUobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsIGRhdGEsICJ1bmV4cGVjdGVkIik7Ci0JZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIHdyaXRlX25yXzY6Ci0gICAgICBpZiAoYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweDEwKSB7Ci0Jc3RhcnRfZXJhc2luZ19jaGlwKG1lLCBlZXByb20pOwotCWVlcHJvbS0+c3RhdGUgPSBjaGlwX2VyYXNlOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0Jc3RhcnRfZXJhc2luZ19zZWN0b3IobWUsIGVlcHJvbSwgYWRkcmVzcyk7Ci0JZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSByZWFkX3Jlc2V0OwotCWVlcHJvbS0+c3RhdGUgPSBzZWN0b3JfZXJhc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIGF1dG9zZWxlY3Q6Ci0gICAgICBpZiAoZGF0YSA9PSAweGYwKQotCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OwotICAgICAgZWxzZSBpZiAoYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweGFhKQotCWVlcHJvbS0+c3RhdGUgPSB3cml0ZV9ucl8yOwotICAgICAgZWxzZSB7Ci0JaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgInVuc3VwcG9ydGVkIGFkZHJlc3MiKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgYnl0ZV9wcm9ncmFtOgotICAgICAgc3RhcnRfcHJvZ3JhbW1pbmdfYnl0ZShtZSwgZWVwcm9tLCBhZGRyZXNzLCBkYXRhKTsKLSAgICAgIGVlcHJvbS0+c3RhdGUgPSBieXRlX3Byb2dyYW1taW5nOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBieXRlX3Byb2dyYW1taW5nOgotICAgICAgaWYgKGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKSA+IGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSkgewotCWZpbmlzaF9wcm9ncmFtbWluZ19ieXRlKG1lLCBlZXByb20pOwotCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OwotCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgLyogaWdub3JlIGl0ICovCi0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIGNoaXBfZXJhc2U6Ci0gICAgICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lKSB7Ci0JZmluaXNoX2VyYXNpbmdfY2hpcChtZSwgZWVwcm9tKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8qIGlnbm9yZSBpdCAqLwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBzZWN0b3JfZXJhc2U6Ci0gICAgICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lKSB7Ci0JZmluaXNoX2VyYXNpbmdfc2VjdG9yKG1lLCBlZXByb20pOwotCWVlcHJvbS0+c3RhdGUgPSBlZXByb20tPnNlY3Rvcl9zdGF0ZTsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKSA+IGVlcHJvbS0+c2VjdG9yX3N0YXJ0X3RpbWUKLQkgICAgICAgJiYgZGF0YSA9PSAweGIwKSB7Ci0JZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSByZWFkX3Jlc2V0OwotCWVlcHJvbS0+c3RhdGUgPSBzZWN0b3JfZXJhc2Vfc3VzcGVuZDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWlmIChlZXByb20tPnNlY3Rvcl9zdGF0ZSA9PSByZWFkX3Jlc2V0Ci0JICAgICYmIGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhhYSkKLQkgIGVlcHJvbS0+c2VjdG9yX3N0YXRlID0gd3JpdGVfbnJfMjsKLQllbHNlIGlmIChlZXByb20tPnNlY3Rvcl9zdGF0ZSA9PSB3cml0ZV9ucl8yCi0JCSAmJiBhZGRyZXNzID09IDB4MmFhYSAmJiBkYXRhID09IDB4NTUpCi0JICBlZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHdyaXRlX25yXzM7Ci0JZWxzZSBpZiAoZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPT0gd3JpdGVfbnJfMwotCQkgJiYgYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweDgwKQotCSAgZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSB3cml0ZV9ucl80OwotCWVsc2UgaWYgKGVlcHJvbS0+c2VjdG9yX3N0YXRlID09IHdyaXRlX25yXzQKLQkJICYmIGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhhYSkKLQkgIGVlcHJvbS0+c2VjdG9yX3N0YXRlID0gd3JpdGVfbnJfNTsKLQllbHNlIGlmIChlZXByb20tPnNlY3Rvcl9zdGF0ZSA9PSB3cml0ZV9ucl81Ci0JCSAmJiBhZGRyZXNzID09IDB4MmFhYSAmJiBkYXRhID09IDB4NTUpCi0JICBlZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHdyaXRlX25yXzY7Ci0JZWxzZSBpZiAoZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPT0gd3JpdGVfbnJfNgotCQkgJiYgYWRkcmVzcyAhPSAweDU1NTUgJiYgZGF0YSA9PSAweDMwKSB7Ci0JICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5zZWN0b3Jfc3RhcnRfdGltZSkgewotCSAgICBEVFJBQ0UoZWVwcm9tLCAoInNlY3RvciBlcmFzZSBjb21tYW5kIGFmdGVyIHdpbmRvdyBjbG9zZWRcbiIpKTsKLQkgICAgZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSByZWFkX3Jlc2V0OwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIHN0YXJ0X2VyYXNpbmdfc2VjdG9yKG1lLCBlZXByb20sIGFkZHJlc3MpOwotCSAgICBlZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0JICB9Ci0JfQotCWVsc2UgewotCSAgaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgc3RhdGUyYShlZXByb20tPnNlY3Rvcl9zdGF0ZSkpOwotCSAgZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7Ci0JfQotICAgICAgfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBzZWN0b3JfZXJhc2Vfc3VzcGVuZDoKLSAgICAgIGlmIChkYXRhID09IDB4MzApCi0JZWVwcm9tLT5zdGF0ZSA9IHNlY3Rvcl9lcmFzZTsKLSAgICAgIGVsc2UgewotCWludmFsaWRfd3JpdGUobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsIGRhdGEsICJub3QgcmVzdW1lIGNvbW1hbmQiKTsKLQllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X2VlcHJvbV9pb193cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICBpbnQgc3BhY2UsCi0JCQkgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkgIGNwdSAqcHJvY2Vzc29yLAotCQkJICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tID0gKGh3X2VlcHJvbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9ieXRlczsgaSsrKSB7Ci0gICAgdW5zaWduZWRfd29yZCBhZGRyZXNzID0gKGFkZHIgKyBpKSAlIGVlcHJvbS0+c2l6ZW9mX21lbW9yeTsKLSAgICB1bnNpZ25lZDggYnl0ZSA9ICgodW5zaWduZWQ4Kilzb3VyY2UpW2ldOwotICAgIHdyaXRlX2J5dGUobWUsIGVlcHJvbSwgYWRkcmVzcywgYnl0ZSk7Ci0gIH0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfQotCi0KLS8qIEFuIGluc3RhbmNlIG9mIHRoZSBlZXByb20gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X2VlcHJvbV9pbnN0YW5jZSB7Ci0gIHVuc2lnbmVkX3dvcmQgcG9zOwotICBod19lZXByb21fZGV2aWNlICplZXByb207Ci0gIGRldmljZSAqbWU7Ci19IGh3X2VlcHJvbV9pbnN0YW5jZTsKLQotc3RhdGljIHZvaWQKLWh3X2VlcHJvbV9pbnN0YW5jZV9kZWxldGUoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKLXsKLSAgaHdfZWVwcm9tX2luc3RhbmNlICpkYXRhID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICB6ZnJlZShkYXRhKTsKLX0KLQotc3RhdGljIGludAotaHdfZWVwcm9tX2luc3RhbmNlX3JlYWQoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLQkJCXZvaWQgKmJ1ZiwKLQkJCXVuc2lnbmVkX3dvcmQgbGVuKQotewotICBod19lZXByb21faW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7Ci0gIGludCBpOwotICBpZiAoZGF0YS0+ZWVwcm9tLT5zdGF0ZSAhPSByZWFkX3Jlc2V0KQotICAgIERJVFJBQ0UoZWVwcm9tLCAoImVlcHJvbSBub3QgaWRsZSBkdXJpbmcgaW5zdGFuY2UgcmVhZFxuIikpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAoKHVuc2lnbmVkOCopYnVmKVtpXSA9IGRhdGEtPmVlcHJvbS0+bWVtb3J5W2RhdGEtPnBvc107Ci0gICAgZGF0YS0+cG9zID0gKGRhdGEtPnBvcyArIDEpICUgZGF0YS0+ZWVwcm9tLT5zaXplb2ZfbWVtb3J5OwotICB9Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2VlcHJvbV9pbnN0YW5jZV93cml0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJCSB1bnNpZ25lZF93b3JkIGxlbikKLXsKLSAgaHdfZWVwcm9tX2luc3RhbmNlICpkYXRhID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBpbnQgaTsKLSAgaWYgKGRhdGEtPmVlcHJvbS0+c3RhdGUgIT0gcmVhZF9yZXNldCkKLSAgICBESVRSQUNFKGVlcHJvbSwgKCJlZXByb20gbm90IGlkbGUgZHVyaW5nIGluc3RhbmNlIHdyaXRlXG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGRhdGEtPmVlcHJvbS0+bWVtb3J5W2RhdGEtPnBvc10gPSAoKHVuc2lnbmVkOCopYnVmKVtpXTsKLSAgICBkYXRhLT5wb3MgPSAoZGF0YS0+cG9zICsgMSkgJSBkYXRhLT5lZXByb20tPnNpemVvZl9tZW1vcnk7Ci0gIH0KLSAgZHVtcF9lZXByb20oZGF0YS0+bWUsIGRhdGEtPmVlcHJvbSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X2VlcHJvbV9pbnN0YW5jZV9zZWVrKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2hpLAotCQkgICAgICB1bnNpZ25lZF93b3JkIHBvc19sbykKLXsKLSAgaHdfZWVwcm9tX2luc3RhbmNlICpkYXRhID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBpZiAocG9zX2xvID49IGRhdGEtPmVlcHJvbS0+c2l6ZW9mX21lbW9yeSkKLSAgICBkZXZpY2VfZXJyb3IoZGF0YS0+bWUsICJzZWVrIHZhbHVlIDB4JWx4IG91dCBvZiByYW5nZVxuIiwKLQkJICh1bnNpZ25lZCBsb25nKXBvc19sbyk7Ci0gIGRhdGEtPnBvcyA9IHBvc19sbzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGh3X2VlcHJvbV9pbnN0YW5jZV9jYWxsYmFja3MgPSB7Ci0gIGh3X2VlcHJvbV9pbnN0YW5jZV9kZWxldGUsCi0gIGh3X2VlcHJvbV9pbnN0YW5jZV9yZWFkLAotICBod19lZXByb21faW5zdGFuY2Vfd3JpdGUsCi0gIGh3X2VlcHJvbV9pbnN0YW5jZV9zZWVrLAotfTsKLQotc3RhdGljIGRldmljZV9pbnN0YW5jZSAqCi1od19lZXByb21fY3JlYXRlX2luc3RhbmNlKGRldmljZSAqbWUsCi0JCQkgIGNvbnN0IGNoYXIgKnBhdGgsCi0JCQkgIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSA9IGRldmljZV9kYXRhKG1lKTsKLSAgaHdfZWVwcm9tX2luc3RhbmNlICpkYXRhID0gWkFMTE9DKGh3X2VlcHJvbV9pbnN0YW5jZSk7Ci0gIGRhdGEtPmVlcHJvbSA9IGVlcHJvbTsKLSAgZGF0YS0+bWUgPSBtZTsKLSAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbShtZSwgTlVMTCwKLQkJCQkgICAgIGRhdGEsCi0JCQkJICAgICBwYXRoLCBhcmdzLAotCQkJCSAgICAgJmh3X2VlcHJvbV9pbnN0YW5jZV9jYWxsYmFja3MpOwotfQotCi0KLQotc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfZWVwcm9tX2NhbGxiYWNrcyA9IHsKLSAgeyBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MsCi0gICAgaHdfZWVwcm9tX2luaXRfZGF0YSB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19lZXByb21faW9fcmVhZF9idWZmZXIsCi0gICAgaHdfZWVwcm9tX2lvX3dyaXRlX2J1ZmZlciB9LCAvKiBJTyAqLwotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KLSAgaHdfZWVwcm9tX2NyZWF0ZV9pbnN0YW5jZSwKLX07Ci0KLXN0YXRpYyB2b2lkICoKLWh3X2VlcHJvbV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkJIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCi0JCSBjb25zdCBjaGFyICphcmdzKQotewotICBod19lZXByb21fZGV2aWNlICplZXByb20gPSBaQUxMT0MoaHdfZWVwcm9tX2RldmljZSk7Ci0gIHJldHVybiBlZXByb207Ci19Ci0KLQotCi1jb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19lZXByb21fZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAiZWVwcm9tIiwgaHdfZWVwcm9tX2NyZWF0ZSwgJmh3X2VlcHJvbV9jYWxsYmFja3MgfSwKLSAgeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX0VFUFJPTV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19nbHVlLmMgYi9zaW0vcHBjL2h3X2dsdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZDkyOS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X2dsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19HTFVFX0NfCi0jZGVmaW5lIF9IV19HTFVFX0NfCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLQotCi0vKiBERVZJQ0UKLSAgIAotCi0gICBnbHVlIC0gZ2x1ZSB0byBpbnRlcmNvbm5lY3QgYW5kIHRlc3QgaW50ZXJydXB0cwotICAgCi0KLSAgIERFU0NSSVBUSU9OCi0gICAKLQotICAgVGhlIGdsdWUgZGV2aWNlIHByb3ZpZGVzIHR3byBmdW5jdGlvbnMuICBGaXJzdGx5LCBpdCBwcm92aWRlcyBhCi0gICBtZWNoYW5pc20gZm9yIGluc3BlY3RpbmcgYW5kIGRyaXZpbmcgdGhlIGludGVycnVwdCBuZXQuICBTZWNvbmRseSwKLSAgIGl0IHByb3ZpZGVzIGEgc2V0IG9mIGJvb2xlYW4gcHJpbWl0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIGFkZAotICAgY29tYmluYXRvcmlhbCBvcGVyYXRpb25zIHRvIHRoZSBpbnRlcnJ1cHQgbmV0d29yay4KLQotICAgR2x1ZSBkZXZpY2VzIGhhdmUgYSB2YXJpYWJsZSBudW1iZXIgb2YgYmlnIGVuZGlhbiA8PG91dHB1dD4+Ci0gICByZWdpc3RlcnMuICBFYWNoIGhvc3Qtd29yZCBzaXplLiAgVGhlIHJlZ2lzdGVycyBjYW4gYmUgYm90aCByZWFkCi0gICBhbmQgd3JpdHRlbi4KLQotICAgV3JpdGluZyBhIHZhbHVlIHRvIGFuIG91dHB1dCByZWdpc3RlciBjYXVzZXMgYW4gaW50ZXJydXB0IChvZiB0aGUKLSAgIHNwZWNpZmllZCBsZXZlbCkgdG8gYmUgZHJpdmVuIG9uIHRoZSBkZXZpY2VzIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0gICBpbnRlcnJ1cHQgcG9ydC4KLQotICAgUmVhZGluZyBhbiA8PG91dHB1dD4+IHJlZ2lzdGVyIHJldHVybnMgZWl0aGVyIHRoZSBsYXN0IHZhbHVlCi0gICB3cml0dGVuIG9yIHRoZSBtb3N0IHJlY2VudGx5IGNvbXB1dGVkIHZhbHVlIChmb3IgdGhhdCByZWdpc3RlcikgYXMKLSAgIGEgcmVzdWx0IG9mIGFuIGludGVycnVwdCBhcml2aW5nICh3aGljaCBldmVyIHdhcyBjb21wdXRlZCBsYXN0KS4KLQotICAgQXQgcHJlc2VudCB0aGUgZm9sbG93aW5nIHN1YiBkZXZpY2UgdHlwZXMgYXJlIGF2YWlsYWJsZToKLQotICAgPDxnbHVlPj46IEluIGFkZGl0aW9uIHRvIGRyaXZpbmcgaXRzIG91dHB1dCBpbnRlcnJ1cHQgcG9ydCB3aXRoIGFueQotICAgdmFsdWUgd3JpdHRlbiB0byBhbiBpbnRlcnJ1cHQgaW5wdXQgcG9ydCBpcyBzdG9yZWQgaW4gdGhlCi0gICBjb3JyZXNwb25kaW5nIDw8b3V0cHV0Pj4gcmVnaXN0ZXIuICBTdWNoIGlucHV0IGludGVycnVwdHMsIGhvd2V2ZXIsCi0gICBhcmUgbm90IHByb3BvZ2F0ZWQgdG8gYW4gb3V0cHV0IGludGVycnVwdCBwb3J0LgotCi0gICA8PGdsdWUtYW5kPj46IFRoZSBiaXQtd2lzZSBBTkQgb2YgdGhlIGludGVycnVwdCBpbnB1dHMgaXMgY29tcHV0ZWQKLSAgIGFuZCB0aGVuIGJvdGggc3RvcmVkIGluIDw8b3V0cHV0Pj4gcmVnaXN0ZXIgemVybyBhbmQgcHJvcG9nYXRlZCB0bwotICAgb3V0cHV0IGludGVycnVwdCBvdXRwdXQgcG9ydCB6ZXJvLgotCi0KLSAgIFBST1BFUlRJRVMKLSAgIAotCi0gICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IChyZXF1aXJlZCkKLQotICAgU3BlY2lmeSB0aGUgYWRkcmVzcyAod2l0aGluIHRoZSBwYXJlbnQgYnVzKSB0aGF0IHRoaXMgZGV2aWNlIGlzIHRvCi0gICBsaXZlLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAyMDQ4ICogc2l6ZW9mKHdvcmQpICg4ayBpbiBhIDMyYml0Ci0gICBzaW11bGF0aW9uKSBhbGlnbmVkLgotCi0KLSAgIGludGVycnVwdC1yYW5nZXMgPSA8aW50LW51bWJlcj4gPHJhbmdlPiAob3B0aW9uYWwpCi0KLSAgIElmIHByZXNlbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW50ZXJydXB0IGlucHV0cyAodXAKLSAgIHRvIHRoZSBtYXhpbXVtIG9mIDIwNDgpLiAgQnkgZGVmYXVsdCwgPDxpbnQtbnVtYmVyPj4gaXMgemVybyBhbmQKLSAgIHJhbmdlIGlzIGRldGVybWluZWQgYnkgdGhlIDw8cmVnPj4gc2l6ZS4KLQotCi0gICBFWEFNUExFUwotCi0KLSAgIEVuYWJsZSB0cmFjaW5nIG9mIHRoZSBkZXZpY2U6Ci0KLSAgIHwgLXQgZ2x1ZS1kZXZpY2UgXAotCi0KLSAgIENyZWF0ZSBzb3VyY2UsIGJpdHdpemUtYW5kLCBhbmQgc2luayBnbHVlIGRldmljZXMuICBTaW5jZSB0aGUKLSAgIGRldmljZSBhdCBhZGRyZXNzIDw8MHgxMDAwMD4+IGlzIG9mIHNpemUgPDw4Pj4gaXQgd2lsbCBoYXZlIHR3bwotICAgb3V0cHV0IGludGVycnVwdCBwb3J0cy4KLQotICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwL3JlZyAweDEwMDAwIDgnIFwKLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kQDB4MjAwMDAvcmVnIDB4MjAwMDAgNCcgXAotICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZS1hbmQvaW50ZXJydXB0LXJhbmdlcyAwIDInIFwKLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWVAMHgzMDAwMC9yZWcgMHgzMDAwMCA0JyBcCi0KLQotICAgV2lyZSB0aGUgdHdvIHNvdXJjZSBpbnRlcnJ1cHRzIHRvIHRoZSBBTkQgZGV2aWNlOgotCi0gICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MTAwMDAgPiAwIDAgL2lvYnVzL2dsdWUtYW5kJyBcCi0gICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MTAwMDAgPiAxIDEgL2lvYnVzL2dsdWUtYW5kJyBcCi0KLQotICAgV2lyZSB0aGUgQU5EIGRldmljZSB1cCB0byB0aGUgc2luayBzbyB0aGF0IHRoZSBhbmQncyBvdXRwdXQgaXMgbm90Ci0gICBsZWZ0IG9wZW4uCi0KLSAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kID4gMCAwIC9pb2J1cy9nbHVlQDB4MzAwMDAnIFwKLQotCi0gICBXaXRoIHRoZSBhYm92ZSBjb25maWd1cmF0aW9uLiAgVGhlIGNsaWVudCBwcm9ncmFtIGlzIGFibGUgdG8KLSAgIGNvbXB1dGUgYSB0d28gYml0IEFORC4gIEZvciBpbnN0YW5jZSB0aGUgPDxDPj4gc3R1YiBiZWxvdyBwcmludHMgMQotICAgQU5EIDAuCi0KLSAgIHwgIHVuc2lnbmVkICppbnB1dCA9ICh2b2lkKikweGYwMDEwMDAwOwotICAgfCAgdW5zaWduZWQgKm91dHB1dCA9ICh2b2lkKikweGYwMDMwMDAwOwotICAgfCAgdW5zaWduZWQgYW5zOwotICAgfCAgaW5wdXRbMF0gPSBodG9ubCgxKTsKLSAgIHwgIGlucHV0WzFdID0gaHRvbmwoMCk7Ci0gICB8ICBhbnMgPSBudG9obCgqb3V0cHV0KTsKLSAgIHwgIHdyaXRlX3N0cmluZygiQU5EIGlzICIpOwotICAgfCAgd3JpdGVfaW50KGFucyk7Ci0gICB8ICB3cml0ZV9saW5lKCk7Ci0gICAKLQotICAgQlVHUwotCi0gICAKLSAgIEEgZnV0dXJlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZGV2aWNlIG1heSBzdXBwb3J0IG11bHRpcGxlCi0gICBpbnRlcnJ1cHQgcmFuZ2VzLgotCi0gICBTb21lIG9mIHRoZSBkZXZpY2VzIGxpc3RlZCBtYXkgbm90IHlldCBiZSBmdWxseSBpbXBsZW1lbnRlZC4KLQotICAgQWRkaXRpb25hbCBkZXZpY2VzIHN1Y2ggYXMgYSBkZmYsIGFuIGludmVydGVyIG9yIGEgbGF0Y2ggbWF5IGJlCi0gICB1c2VmdWwuCi0KLSAgICovCi0KLQotZW51bSB7Ci0gIG1heF9ucl9pbnRlcnJ1cHRzID0gMjA0OCwKLX07Ci0KLXR5cGVkZWYgZW51bSBfaHdfZ2x1ZV90eXBlIHsKLSAgZ2x1ZV91bmRlZmluZWQgPSAwLAotICBnbHVlX2lvLAotICBnbHVlX2FuZCwKLSAgZ2x1ZV9uYW5kLAotICBnbHVlX29yLAotICBnbHVlX3hvciwKLSAgZ2x1ZV9ub3IsCi0gIGdsdWVfbm90LAotfSBod19nbHVlX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9od19nbHVlX2RldmljZSB7Ci0gIGh3X2dsdWVfdHlwZSB0eXBlOwotICBpbnQgaW50X251bWJlcjsKLSAgaW50ICppbnB1dDsKLSAgaW50IG5yX2lucHV0czsKLSAgdW5zaWduZWQgc2l6ZW9mX2lucHV0OwotICAvKiBvdXIgb3V0cHV0IHJlZ2lzdGVycyAqLwotICBpbnQgc3BhY2U7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgdW5zaWduZWQgc2l6ZW9mX291dHB1dDsKLSAgaW50ICpvdXRwdXQ7Ci0gIGludCBucl9vdXRwdXRzOwotfSBod19nbHVlX2RldmljZTsKLQotCi1zdGF0aWMgdm9pZAotaHdfZ2x1ZV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKLXsKLSAgaHdfZ2x1ZV9kZXZpY2UgKmdsdWUgPSAoaHdfZ2x1ZV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLQotICAvKiBhdHRhY2ggdG8gbXkgcGFyZW50ICovCi0gIGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcyhtZSk7Ci0KLSAgLyogZXN0YWJsaXNoIHRoZSBvdXRwdXQgcmVnaXN0ZXJzICovCi0gIGlmIChnbHVlLT5vdXRwdXQgIT0gTlVMTCkgewotICAgIG1lbXNldChnbHVlLT5vdXRwdXQsIDAsIGdsdWUtPnNpemVvZl9vdXRwdXQpOwotICB9Ci0gIGVsc2UgewotICAgIHJlZ19wcm9wZXJ0eV9zcGVjIHVuaXQ7Ci0gICAgaW50IHJlZ19ucjsKLSAgICAvKiBmaW5kIGEgcmVsZXZhbnQgcmVnIGVudHJ5ICovCi0gICAgcmVnX25yID0gMDsKLSAgICB3aGlsZSAoZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCAicmVnIiwgcmVnX25yLCAmdW5pdCkKLQkgICAmJiAhZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlX3BhcmVudChtZSksICZ1bml0LnNpemUsCi0JCQkJCSAgJmdsdWUtPnNpemVvZl9vdXRwdXQsIG1lKSkKLSAgICAgIHJlZ19ucisrOwotICAgIC8qIGNoZWNrIG91dCB0aGUgc2l6ZSAqLwotICAgIGlmIChnbHVlLT5zaXplb2Zfb3V0cHV0ID09IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJhdCBsZWFzdCBvbmUgcmVnIHByb3BlcnR5IHNpemUgbXVzdCBiZSBub256ZXJvIik7Ci0gICAgaWYgKGdsdWUtPnNpemVvZl9vdXRwdXQgJSBzaXplb2YodW5zaWduZWRfd29yZCkgIT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgInJlZyBwcm9wZXJ0eSBzaXplIG11c3QgYmUgJWQgYWxpZ25lZCIsIHNpemVvZih1bnNpZ25lZF93b3JkKSk7Ci0gICAgLyogYW5kIHRoZSBhZGRyZXNzICovCi0gICAgZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCi0JCQkJICAgICAmdW5pdC5hZGRyZXNzLCAmZ2x1ZS0+c3BhY2UsICZnbHVlLT5hZGRyZXNzLAotCQkJCSAgICAgbWUpOwotICAgIGlmIChnbHVlLT5hZGRyZXNzICUgKHNpemVvZih1bnNpZ25lZF93b3JkKSAqIG1heF9ucl9pbnRlcnJ1cHRzKSAhPSAwKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAicmVnIHByb3BlcnR5IGFkZHJlc3MgbXVzdCBiZSAlZCBhbGlnbmVkIiwKLQkJICAgc2l6ZW9mKHVuc2lnbmVkX3dvcmQpICogbWF4X25yX2ludGVycnVwdHMpOwotICAgIGdsdWUtPm5yX291dHB1dHMgPSBnbHVlLT5zaXplb2Zfb3V0cHV0IC8gc2l6ZW9mKHVuc2lnbmVkX3dvcmQpOwotICAgIGdsdWUtPm91dHB1dCA9IHphbGxvYyhnbHVlLT5zaXplb2Zfb3V0cHV0KTsKLSAgfQotCi0gIC8qIGVzdGFibGlzaCB0aGUgaW5wdXQgaW50ZXJydXB0IHBvcnRzICovCi0gIGlmIChnbHVlLT5pbnB1dCAhPSBOVUxMKSB7Ci0gICAgbWVtc2V0KGdsdWUtPmlucHV0LCAwLCBnbHVlLT5zaXplb2ZfaW5wdXQpOwotICB9Ci0gIGVsc2UgewotICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcmFuZ2VzID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJpbnRlcnJ1cHQtcmFuZ2VzIik7Ci0gICAgaWYgKHJhbmdlcyA9PSBOVUxMKSB7Ci0gICAgICBnbHVlLT5pbnRfbnVtYmVyID0gMDsKLSAgICAgIGdsdWUtPm5yX2lucHV0cyA9IGdsdWUtPm5yX291dHB1dHM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJhbmdlcy0+c2l6ZW9mX2FycmF5ICE9IHNpemVvZih1bnNpZ25lZF9jZWxsKSAqIDIpIHsKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImludmFsaWQgaW50ZXJydXB0LXJhbmdlcyBwcm9wZXJ0eSAoaW5jb3JyZWN0IHNpemUpIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY29uc3QgdW5zaWduZWRfY2VsbCAqaW50X3JhbmdlID0gcmFuZ2VzLT5hcnJheTsKLSAgICAgIGdsdWUtPmludF9udW1iZXIgPSBCRTJIX2NlbGwoaW50X3JhbmdlWzBdKTsKLSAgICAgIGdsdWUtPm5yX2lucHV0cyA9IEJFMkhfY2VsbChpbnRfcmFuZ2VbMV0pOwotICAgIH0KLSAgICBnbHVlLT5zaXplb2ZfaW5wdXQgPSBnbHVlLT5ucl9pbnB1dHMgKiBzaXplb2YodW5zaWduZWQpOwotICAgIGdsdWUtPmlucHV0ID0gemFsbG9jKGdsdWUtPnNpemVvZl9pbnB1dCk7Ci0gIH0KLQotICAvKiBkZXRlcm1pbmUgb3VyIHR5cGUgKi8KLSAgaWYgKGdsdWUtPnR5cGUgPT0gZ2x1ZV91bmRlZmluZWQpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gZGV2aWNlX25hbWUobWUpOwotICAgIGlmIChzdHJjbXAobmFtZSwgImdsdWUiKSA9PSAwKQotICAgICAgZ2x1ZS0+dHlwZSA9IGdsdWVfaW87Ci0gICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJnbHVlLWFuZCIpID09IDApCi0gICAgICBnbHVlLT50eXBlID0gZ2x1ZV9hbmQ7Ci0gICAgZWxzZQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAidW5pbXBsZW1lbnRlZCBnbHVlIHR5cGUiKTsKLSAgfQotCi0gIERUUkFDRShnbHVlLCAoImludC1udW1iZXIgJWQsIG5yX2lucHV0cyAlZCwgbnJfb3V0cHV0cyAlZFxuIiwKLQkJZ2x1ZS0+aW50X251bWJlciwgZ2x1ZS0+bnJfaW5wdXRzLCBnbHVlLT5ucl9vdXRwdXRzKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotaHdfZ2x1ZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayhkZXZpY2UgKm1lLAotCQkJCXZvaWQgKmRlc3QsCi0JCQkJaW50IHNwYWNlLAotCQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQl1bnNpZ25lZCBucl9ieXRlcywKLQkJCQljcHUgKnByb2Nlc3NvciwKLQkJCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfZ2x1ZV9kZXZpY2UgKmdsdWUgPSAoaHdfZ2x1ZV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgaW50IHJlZyA9ICgoYWRkciAtIGdsdWUtPmFkZHJlc3MpIC8gc2l6ZW9mKHVuc2lnbmVkX3dvcmQpKSAlIGdsdWUtPm5yX291dHB1dHM7Ci0gIGlmIChucl9ieXRlcyAhPSBzaXplb2YodW5zaWduZWRfd29yZCkKLSAgICAgIHx8IChhZGRyICUgc2l6ZW9mKHVuc2lnbmVkX3dvcmQpKSAhPSAwKQotICAgICBkZXZpY2VfZXJyb3IobWUsICJtaXNzYWxpZ25lZCByZWFkIGFjY2VzcyAoJWQ6MHglbHg6JWQpIG5vdCBzdXBwb3J0ZWQiLAotCQkgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBucl9ieXRlcyk7Ci0gICoodW5zaWduZWRfd29yZCopZGVzdCA9IEgyQkVfNChnbHVlLT5vdXRwdXRbcmVnXSk7Ci0gIERUUkFDRShnbHVlLCAoInJlYWQgLSBpbnRlcnJ1cHQgJWQgKDB4JWx4KSwgbGV2ZWwgJWRcbiIsCi0JCXJlZywgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGdsdWUtPm91dHB1dFtyZWddKSk7Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X2dsdWVfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCQkgaW50IHNwYWNlLAotCQkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkJIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkJCSBjcHUgKnByb2Nlc3NvciwKLQkJCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X2dsdWVfZGV2aWNlICpnbHVlID0gKGh3X2dsdWVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGludCByZWcgPSAoKGFkZHIgLSBnbHVlLT5hZGRyZXNzKSAvIHNpemVvZih1bnNpZ25lZF93b3JkKSkgJSBtYXhfbnJfaW50ZXJydXB0czsKLSAgaWYgKG5yX2J5dGVzICE9IHNpemVvZih1bnNpZ25lZF93b3JkKQotICAgICAgfHwgKGFkZHIgJSBzaXplb2YodW5zaWduZWRfd29yZCkpICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibWlzc2FsaWduZWQgd3JpdGUgYWNjZXNzICglZDoweCVseDolZCkgbm90IHN1cHBvcnRlZCIsCi0JCSBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkciwgbnJfYnl0ZXMpOwotICBnbHVlLT5vdXRwdXRbcmVnXSA9IEgyQkVfNCgqKHVuc2lnbmVkX3dvcmQqKXNvdXJjZSk7Ci0gIERUUkFDRShnbHVlLCAoIndyaXRlIC0gaW50ZXJydXB0ICVkICgweCVseCksIGxldmVsICVkXG4iLAotCQlyZWcsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBnbHVlLT5vdXRwdXRbcmVnXSkpOwotICBkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCByZWcsIGdsdWUtPm91dHB1dFtyZWddLCBwcm9jZXNzb3IsIGNpYSk7Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotc3RhdGljIHZvaWQKLWh3X2dsdWVfaW50ZXJydXB0X2V2ZW50KGRldmljZSAqbWUsCi0JCQlpbnQgbXlfcG9ydCwKLQkJCWRldmljZSAqc291cmNlLAotCQkJaW50IHNvdXJjZV9wb3J0LAotCQkJaW50IGxldmVsLAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfZ2x1ZV9kZXZpY2UgKmdsdWUgPSAoaHdfZ2x1ZV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgaW50IGk7Ci0gIGlmIChteV9wb3J0IDwgZ2x1ZS0+aW50X251bWJlcgotICAgICAgfHwgbXlfcG9ydCA+PSBnbHVlLT5pbnRfbnVtYmVyICsgZ2x1ZS0+bnJfaW5wdXRzKQotICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCAlZCBvdXRzaWRlIG9mIHZhbGlkIHJhbmdlIiwgbXlfcG9ydCk7Ci0gIGdsdWUtPmlucHV0W215X3BvcnQgLSBnbHVlLT5pbnRfbnVtYmVyXSA9IGxldmVsOwotICBzd2l0Y2ggKGdsdWUtPnR5cGUpIHsKLSAgY2FzZSBnbHVlX2lvOgotICAgIHsKLSAgICAgIGludCBwb3J0ID0gbXlfcG9ydCAlIGdsdWUtPm5yX291dHB1dHM7Ci0gICAgICBnbHVlLT5vdXRwdXRbcG9ydF0gPSBsZXZlbDsKLSAgICAgIERUUkFDRShnbHVlLCAoImlucHV0IC0gaW50ZXJydXB0ICVkICgweCVseCksIGxldmVsICVkXG4iLAotCQkgICAgbXlfcG9ydCwKLQkJICAgICh1bnNpZ25lZCBsb25nKWdsdWUtPmFkZHJlc3MgKyBwb3J0ICogc2l6ZW9mKHVuc2lnbmVkX3dvcmQpLAotCQkgICAgbGV2ZWwpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgY2FzZSBnbHVlX2FuZDoKLSAgICBnbHVlLT5vdXRwdXRbMF0gPSBnbHVlLT5pbnB1dFswXTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgZ2x1ZS0+bnJfaW5wdXRzOyBpKyspCi0gICAgICBnbHVlLT5vdXRwdXRbMF0gJj0gZ2x1ZS0+aW5wdXRbaV07Ci0gICAgRFRSQUNFKGdsdWUsICgiYW5kIC0gaW50ZXJydXB0ICVkLCBsZXZlbCAlZCBhcnJpdmVkIC0gb3V0cHV0ICVkXG4iLAotCQkgIG15X3BvcnQsIGxldmVsLCBnbHVlLT5vdXRwdXRbMF0pKTsKLSAgICBkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCAwLCBnbHVlLT5vdXRwdXRbMF0sIHByb2Nlc3NvciwgY2lhKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJvcGVyYXRvciBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLXN0YXRpYyBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciBod19nbHVlX2ludGVycnVwdF9wb3J0c1tdID0gewotICB7ICJpbnQiLCAwLCBtYXhfbnJfaW50ZXJydXB0cyB9LAotICB7IE5VTEwgfQotfTsKLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19nbHVlX2NhbGxiYWNrcyA9IHsKLSAgeyBod19nbHVlX2luaXRfYWRkcmVzcywgTlVMTCB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19nbHVlX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrLAotICAgICAgaHdfZ2x1ZV9pb193cml0ZV9idWZmZXJfY2FsbGJhY2ssIH0sCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgaHdfZ2x1ZV9pbnRlcnJ1cHRfZXZlbnQsIE5VTEwsIGh3X2dsdWVfaW50ZXJydXB0X3BvcnRzIH0sIC8qIGludGVycnVwdCAqLwotICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KLSAgTlVMTCwgLyogaW5zdGFuY2UgKi8KLX07Ci0KLQotc3RhdGljIHZvaWQgKgotaHdfZ2x1ZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIC8qIGNyZWF0ZSB0aGUgZGVzY3JpcHRvciAqLwotICBod19nbHVlX2RldmljZSAqZ2x1ZSA9IFpBTExPQyhod19nbHVlX2RldmljZSk7Ci0gIHJldHVybiBnbHVlOwotfQotCi0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X2dsdWVfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAiZ2x1ZSIsIGh3X2dsdWVfY3JlYXRlLCAmaHdfZ2x1ZV9jYWxsYmFja3MgfSwKLSAgeyAiZ2x1ZS1hbmQiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCi0gIHsgImdsdWUtbmFuZCIsIGh3X2dsdWVfY3JlYXRlLCAmaHdfZ2x1ZV9jYWxsYmFja3MgfSwKLSAgeyAiZ2x1ZS1vciIsIGh3X2dsdWVfY3JlYXRlLCAmaHdfZ2x1ZV9jYWxsYmFja3MgfSwKLSAgeyAiZ2x1ZS14b3IiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCi0gIHsgImdsdWUtbm9yIiwgaHdfZ2x1ZV9jcmVhdGUsICZod19nbHVlX2NhbGxiYWNrcyB9LAotICB7ICJnbHVlLW5vdCIsIGh3X2dsdWVfY3JlYXRlLCAmaHdfZ2x1ZV9jYWxsYmFja3MgfSwKLSAgeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX0dMVUVfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfaHRhYi5jIGIvc2ltL3BwYy9od19odGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YWE1NzEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19odGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfSFRBQl9DXwotI2RlZmluZSBfSFdfSFRBQl9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotCi0vKiBERVZJQ0UKLQotCi0gICBodGFiIC0gcHNldWRvLWRldmljZSBkZXNjcmliaW5nIGEgUG93ZXJQQyBoYXNoIHRhYmxlCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLSAgIAotICAgCi0gICBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkZXZpY2UgdHJlZSwgdGhlIHBzZXVkby1kZXZpY2UKLSAgIDw8aHRhYj4+LCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBjaGlsZCA8PHB0ZT4+IHBzZXVkby1kZXZpY2VzLAotICAgd2lsbCBjcmVhdGUgYSBQb3dlclBDIGhhc2ggdGFibGUgaW4gbWVtb3J5LiAgVGhlIGhhc2ggdGFibGUgdmFsdWVzCi0gICBhcmUgd3JpdHRlbiB1c2luZyBkbWEgdHJhbnNmZXJzLgotICAgCi0gICBUaGUgc2l6ZSBhbmQgYWRkcmVzcyBvZiB0aGUgaGFzaCB0YWJsZSBhcmUgZGV0ZXJtaW5lZCBieSBwcm9wZXJ0aWVzCi0gICBvZiB0aGUgaHRhYiBub2RlLgotICAgIAotICAgQnkgY29udmVudGlvbiwgdGhlIGh0YWIgZGV2aWNlIGlzIG1hZGUgYSBjaGlsZCBvZiB0aGUKLSAgIDw8L29wZW5wcm9tL2luaXQ+PiBub2RlLgotICAgCi0gICBCeSBjb252ZW50aW9uLCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSBodGFiIGlzIHVzZWQgYXMgdGhlIGh0YWIKLSAgIG5vZGVzIHVuaXQgYWRkcmVzcy4KLSAgIAotICAgCi0gICBQUk9QRVJUSUVTCi0gICAKLQotICAgcmVhbC1hZGRyZXNzID0gPGFkZHJlc3M+IChyZXF1aXJlZCkKLQotICAgVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhhc2ggdGFibGUuICBUaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUKLSAgIHBsYWNlcyBsaW1pdGF0aW9ucyBvbiB3aGF0IGlzIGEgdmFsaWQgaGFzaCB0YWJsZSByZWFsLWFkZHJlc3MuCi0KLSAgIAotICAgbnItYnl0ZXMgPSA8c2l6ZT4gKHJlcXVpcmVkKQotCi0gICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAoaW4gYnl0ZXMpIHRoYXQgaXMgdG8gYmUgY3JlYXRlZCBhdAotICAgPDxyZWFsLWFkZHJlc3M+Pi4gIFRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZSBwbGFjZXMgbGltaXRhdGlvbnMgb24KLSAgIHdoYXQgaXMgYSB2YWxpZCBoYXNoIHRhYmxlIHNpemUuCi0KLSAgIAotICAgY2xhaW0gPSA8YW55dGhpbmc+IChvcHRpb25hbCkKLQotICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50LCB0aGUgbWVtb3J5IHVzZWQgdG8gY29uc3RydWN0IHRoZSBoYXNoCi0gICB0YWJsZSB3aWxsIGJlIGNsYWltZWQgZnJvbSB0aGUgbWVtb3J5IGRldmljZS4gIFRoZSBtZW1vcnkgZGV2aWNlCi0gICBiZWluZyBzcGVjaWZpZWQgYnkgdGhlIDw8L2Nob3Nlbi9tZW1vcnk+PiBpaGFuZGxlIHByb3BlcnR5LgotCi0gICAKLSAgIEVYQU1QTEVTCi0gICAKLSAgIEVuYWJsZSB0cmFjaW5nLgotICAgCi0gICB8ICAkICBwc2ltIC10IGh0YWItZGV2aWNlIFwKLSAgIAotICAgCi0gICBDcmVhdGUgYSBodGFiIHNwZWNpZnlpbmcgdGhlIGJhc2UgYWRkcmVzcyBhbmQgbWluaW11bSBzaXplLgotICAgCi0gICB8ICAgIC1vICcvb3BlbnByb20vaW5pdC9odGFiQDB4MTAwMDAvcmVhbC1hZGRyZXNzIDB4MTAwMDAnIFwKLSAgIHwgICAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWJAMHgxMDAwMC9jbGFpbSAwJyBcCi0gICB8ICAgIC1vICcvb3BlbnByb20vaW5pdC9odGFiQDB4MTAwMDAvbnItYnl0ZXMgNjU1MzYnIFwKLSAgIAotICAgCi0gICBCVUdTCi0gICAKLSAgIAotICAgU2VlIHRoZSA8PHB0ZT4+IGRldmljZS4KLSAgIAotICAgCi0gICAqLwotCi0gICAKLS8qIERFVklDRQotCi0KLSAgIHB0ZSAtIHBzZXVkby1kZXZpY2UgZGVzY3JpYmluZyBhIGh0YWIgZW50cnkKLQotCi0gICBERVNDUklQVElPTgotCi0gICAKLSAgIFRoZSA8PHB0ZT4+IHBzZXVkby1kZXZpY2UsIHdoaWNoIG11c3QgYmUgYSBjaGlsZCBvZiBhIDw8aHRhYmw+PgotICAgbm9kZSwgZGVzY3JpYmVzIGEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nIHRoYXQgaXMgdG8gYmUgZW50ZXJlZAotICAgaW50byB0aGUgcGFyZW50cyBoYXNoIHRhYmxlLgotICAgCi0gICBUd28gYWx0ZXJuYXRpdmUgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIG1hcHBpbmcgYXJlIGFsbG93ZWQuICBFaXRoZXIKLSAgIGEgc2VjdGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkgY2FuIGJlIG1hcHBlZCB0byBhIHZpcnR1YWwgYWRkcmVzcywgb3IKLSAgIHRoZSBoZWFkZXIgb2YgYW4gZXhlY3V0aWJsZSBpbWFnZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlCi0gICBtYXBwaW5nLgotICAgCi0gICBCeSBjb252ZW50aW9uLCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSBtYXAgaXMgc3BlY2lmaWVkIGFzIHRoZSBwdGUKLSAgIGRldmljZXMgdW5pdCBhZGRyZXNzLgotICAgCi0gICAKLSAgIFBST1BFUlRJRVMKLQotICAgCi0gICByZWFsLWFkZHJlc3MgPSA8YWRkcmVzcz4gKHJlcXVpcmVkKQotCi0gICBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyB0aGF0IGlzIHRvIGJlIG1hcHBlZCBieSB0aGUgaGFzaAotICAgdGFibGUuCi0KLSAgIAotICAgd2ltZyA9IDxpbnQ+IChyZXF1aXJlZCkKLSAgIHBwID0gPGludD4gKHJlcXVpcmVkKQotCi0gICBUaGUgdmFsdWUgb2YgaGFzaCB0YWJsZSBwcm90ZWN0aW9uIGJpdHMgdGhhdCBhcmUgdG8gYmUgdXNlZCB3aGVuCi0gICBjcmVhdGluZyB0aGUgdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzIG1hcC4KLQotICAgCi0gICBjbGFpbSA9IDxhbnl0aGluZz4gKG9wdGlvbmFsKQotCi0gICBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSByZWFsIG1lbW9yeSB0aGF0IGlzIGJlaW5nIG1hcHBlZCBieSB0aGUgCi0gICBoYXNoIHRhYmxlIHdpbGwgYmUgY2xhaW1lZCBmcm9tIHRoZSBtZW1vcnkgbm9kZSAoc3BlY2lmaWVkIGJ5IHRoZSAKLSAgIGloYW5kbGUgPDwvY2hvc2VuL21lbW9yeT4+KS4KLSAgIAotCi0gICB2aXJ0dWFsLWFkZHJlc3MgPSA8aW50ZWdlcj4gWyA8aW50ZWdlcj4gXSAgKG9wdGlvbiBBKQotICAgbnItYnl0ZXMgPSA8c2l6ZT4gIChvcHRpb24gQSkKLQotICAgT3B0aW9uIEEgLSBWaXJ0dWFsIHZpcnR1YWwgYWRkcmVzcyAoYW5kIHNpemUpIGF0IHdoaWNoIHRoZSBwaHlzaWNhbAotICAgYWRkcmVzcyBpcyB0byBiZSBtYXBwZWQuICBJZiBtdWx0aXBsZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgdGhlCi0gICB2aXJ0dWFsIGFkZHJlc3MgdGhlbiB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgdG8gZ2V0aGVyIHRvIGZvcm0gYQotICAgbG9uZ2VyIHZpcnR1YWwgYWRkcmVzcy4KLQotICAgCi0gICBmaWxlLW5hbWUgPSA8c3RyaW5nPiAgKG9wdGlvbiBCKQotCi0gICBPcHRpb24gQiAtIEFuIGV4ZWN1dGFibGUgaW1hZ2UgdGhhdCBpcyB0byBiZSBsb2FkZWQgKHN0YXJ0aW5nIGF0Ci0gICB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGVjaWZpZWQgYWJvdmUpIGFuZCB0aGVuIG1hcHBlZCBpbiB1c2luZwotICAgaW5mb3JtYXRpb2luIHRha2VuIGZyb20gdGhlIGV4ZWN1dGFibGVzIGhlYWRlci4gIGluZm9ybWF0aW9uIGZvdW5kCi0gICBpbiB0aGUgZmlsZXMgaGVhZGVyLgotCi0gICAKLSAgIEVYQU1QTEVTCi0gICAKLSAgIAotICAgRW5hYmxlIHRyYWNpbmcgKG5vdGUgdGhhdCBib3RoIHRoZSA8PGh0YWI+PiBhbmQgPDxwdGU+PiBkZXZpY2UgdXNlIHRoZSAKLSAgIHNhbWUgdHJhY2Ugb3B0aW9uKS4KLSAgIAotICAgfCAgIC10IGh0YWItZGV2aWNlIFwKLSAgIAotICAgCi0gICBNYXAgYSBibG9jayBvZiBwaHlzaWNhbCBtZW1vcnkgaW50byBhIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3M6Ci0gCQotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9yZWFsLWFkZHJlc3MgMCcgXAotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9uci1ieXRlcyA0MDk2JyBcCi0gICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgwL3ZpcnR1YWwtYWRkcmVzcyAweDEwMDAwMDAnIFwKLSAgIHwgIC1vICcvb3BlbnByb20vaW5pdC9odGFiL3B0ZUAweDAvY2xhaW0gMCcgXAotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC93aW1nIDB4NycgXAotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9wcCAweDInIFwKLSAgIAotICAgCi0gICBNYXAgYSBmaWxlIGludG8gbWVtb3J5LgotICAgCi0gICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgxMDAwMC9yZWFsLWFkZHJlc3MgMHgxMDAwMCcgXAotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MTAwMDAvZmlsZS1uYW1lICJuZXRic2QuZWxmJyBcCi0gICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgxMDAwMC93aW1nIDB4NycgXAotICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MTAwMDAvcHAgMHgyJyBcCi0gICAKLSAgIAotICAgQlVHUwotICAgCi0gICAKLSAgIEZvciBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGhlYWRlciBkZWZpbmVzIGJvdGggdGhlIHZpcnR1YWwgYW5kIHJlYWwgCi0gICBhZGRyZXNzIGF0IHdoaWNoIGVhY2ggZmlsZSBzZWN0aW9uIHNob3VsZCBiZSBsb2FkZWQuICBBdCBwcmVzZW50LCB0aGUgCi0gICByZWFsIGFkZHJlc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmUgaWdub3JlZCwgdGhlIGZpbGUgCi0gICBpbnN0ZWFkIGJlaW5nIGxvYWRlZCBpbiB0byBwaHlzaWNhbCBtZW1vcnkgaW4gYSBsaW5lYXIgZmFzaGlvbi4KLSAgIAotICAgV2hlbiBjbGFpbWluZyBtZW1vcnksIHRoaXMgZGV2aWNlIGFzc3VtZXMgdGhhdCB0aGUgI2FkZHJlc3MtY2VsbHMKLSAgIGFuZCAjc2l6ZS1jZWxscyBpcyBvbmUuICBGb3IgZnV0dXJlIGltcGxlbWVudGF0aW9ucywgdGhpcyBtYXkgbm90Ci0gICBiZSB0aGUgY2FzZS4KLSAgIAotICAgKi8KLQotCi0KLXN0YXRpYyB2b2lkCi1odGFiX2RlY29kZV9oYXNoX3RhYmxlKGRldmljZSAqbWUsCi0JCSAgICAgICB1bnNpZ25lZDMyICpodGFib3JnLAotCQkgICAgICAgdW5zaWduZWQzMiAqaHRhYm1hc2spCi17Ci0gIHVuc2lnbmVkX3dvcmQgaHRhYl9yYTsKLSAgdW5zaWduZWQgaHRhYl9ucl9ieXRlczsKLSAgdW5zaWduZWQgbjsKLSAgZGV2aWNlICpwYXJlbnQgPSBkZXZpY2VfcGFyZW50KG1lKTsKLSAgLyogZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbi9zaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCi0gIGlmIChwYXJlbnQgPT0gTlVMTAotICAgICAgfHwgc3RyY21wKGRldmljZV9uYW1lKHBhcmVudCksICJodGFiIikgIT0gMCkKLSAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAibXVzdCBiZSBhIGh0YWIgZGV2aWNlIik7Ci0gIGh0YWJfcmEgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHBhcmVudCwgInJlYWwtYWRkcmVzcyIpOwotICBodGFiX25yX2J5dGVzID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShwYXJlbnQsICJuci1ieXRlcyIpOwotICBmb3IgKG4gPSBodGFiX25yX2J5dGVzOyBuID4gMTsgbiA9IG4gLyAyKSB7Ci0gICAgaWYgKG4gJSAyICE9IDApCi0gICAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAiaHRhYiBzaXplIDB4JXggbm90IGEgcG93ZXIgb2YgdHdvIiwKLQkJICAgaHRhYl9ucl9ieXRlcyk7Ci0gIH0KLSAgKmh0YWJvcmcgPSBodGFiX3JhOwotICAqaHRhYm1hc2sgPSBNQVNLRUQzMihodGFiX25yX2J5dGVzIC0gMSwgNywgMzEtNik7Ci0gIGlmICgoaHRhYl9yYSAmIElOU0VSVEVEMzIoKmh0YWJtYXNrLCA3LCAxNSkpICE9IDApIHsKLSAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAiaHRhYm9yZyAweCVseCBub3QgYWxpZ25lZCB0byBodGFibWFzayAweCVseCIsCi0JCSAodW5zaWduZWQgbG9uZykqaHRhYm9yZywgKHVuc2lnbmVkIGxvbmcpKmh0YWJtYXNrKTsKLSAgfQotICBEVFJBQ0UoaHRhYiwgKCJodGFiIC0gaHRhYm9yZz0weCVseCBodGFibWFzaz0weCVseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcpKmh0YWJvcmcsICh1bnNpZ25lZCBsb25nKSpodGFibWFzaykpOwotfQotCi1zdGF0aWMgdm9pZAotaHRhYl9tYXBfcGFnZShkZXZpY2UgKm1lLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgcmEsCi0JICAgICAgdW5zaWduZWQ2NCB2YSwKLQkgICAgICB1bnNpZ25lZCB3aW1nLAotCSAgICAgIHVuc2lnbmVkIHBwLAotCSAgICAgIHVuc2lnbmVkMzIgaHRhYm9yZywKLQkgICAgICB1bnNpZ25lZDMyIGh0YWJtYXNrKQotewotICAvKiBrZWVwIGV2ZXJ5dGhpbmcgbGVmdCBzaGlmdGVkIHNvIHRoYXQgdGhlIG51bWJlcmluZyBpcyBlYXNpZXIgKi8KLSAgdW5zaWduZWQ2NCB2cG4gPSB2YSA8PCAxMjsKLSAgdW5zaWduZWQzMiB2c2lkID0gSU5TRVJURUQzMihFWFRSQUNURUQ2NCh2cG4sIDAsIDIzKSwgMCwgMjMpOwotICB1bnNpZ25lZDMyIHZwYWdlID0gSU5TRVJURUQzMihFWFRSQUNURUQ2NCh2cG4sIDI0LCAzOSksIDAsIDE1KTsKLSAgdW5zaWduZWQzMiBoYXNoID0gSU5TRVJURUQzMihFWFRSQUNURUQzMih2c2lkLCA1LCAyMykKLQkJCSAgICAgICBeIEVYVFJBQ1RFRDMyKHZwYWdlLCAwLCAxNSksCi0JCQkgICAgICAgNywgMzEtNik7Ci0gIGludCBoOwotICBmb3IgKGggPSAwOyBoIDwgMjsgaCsrKSB7Ci0gICAgdW5zaWduZWQzMiBwdGVnID0gKGh0YWJvcmcgfCAoaGFzaCAmIGh0YWJtYXNrKSk7Ci0gICAgaW50IHB0aTsKLSAgICBmb3IgKHB0aSA9IDA7IHB0aSA8IDg7IHB0aSsrKSB7Ci0gICAgICB1bnNpZ25lZDMyIHB0ZSA9IHB0ZWcgKyA4ICogcHRpOwotICAgICAgdW5zaWduZWQzMiBjdXJyZW50X3RhcmdldF9wdGUwOwotICAgICAgdW5zaWduZWQzMiBjdXJyZW50X3B0ZTA7Ci0gICAgICBpZiAoZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKLQkJCQkgJmN1cnJlbnRfdGFyZ2V0X3B0ZTAsCi0JCQkJIDAsIC8qc3BhY2UqLwotCQkJCSBwdGUsCi0JCQkJIHNpemVvZihjdXJyZW50X3RhcmdldF9wdGUwKSkgIT0gNCkKLQlkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gcmVhZCBhIHB0ZSBhdCAweCVseCIsICh1bnNpZ25lZCBsb25nKXB0ZSk7Ci0gICAgICBjdXJyZW50X3B0ZTAgPSBUMkhfNChjdXJyZW50X3RhcmdldF9wdGUwKTsKLSAgICAgIGlmIChNQVNLRUQzMihjdXJyZW50X3B0ZTAsIDAsIDApKSB7Ci0JLyogZnVsbCBwdGUsIGNoZWNrIGl0IGlzbid0IGFscmVhZHkgbWFwcGluZyB0aGUgc2FtZSB2aXJ0dWFsCi0gICAgICAgICAgIGFkZHJlc3MgKi8KLQl1bnNpZ25lZDMyIGN1cnJfdnNpZCA9IElOU0VSVEVEMzIoRVhUUkFDVEVEMzIoY3VycmVudF9wdGUwLCAxLCAyNCksIDAsIDIzKTsKLQl1bnNpZ25lZDMyIGN1cnJfYXBpID0gSU5TRVJURUQzMihFWFRSQUNURUQzMihjdXJyZW50X3B0ZTAsIDI2LCAzMSksIDAsIDUpOwotCXVuc2lnbmVkMzIgY3Vycl9oID0gRVhUUkFDVEVEMzIoY3VycmVudF9wdGUwLCAyNSwgMjUpOwotCWlmIChjdXJyX2ggPT0gaAotCSAgICAmJiBjdXJyX3ZzaWQgPT0gdnNpZAotCSAgICAmJiBjdXJyX2FwaSA9PSBNQVNLRUQzMih2cGFnZSwgMCwgNSkpCi0JICBkZXZpY2VfZXJyb3IobWUsICJkdXBsaWNhdGUgbWFwIC0gdmE9MHglMDhseCByYT0weCVseCB2c2lkPTB4JWx4IGg9JWQgdnBhZ2U9MHglbHggaGFzaD0weCVseCBwdGVnPTB4JWx4KyUyZCBwdGUwPTB4JWx4IiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXZhLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmEsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyl2c2lkLAotCQkgICAgICAgaCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXZwYWdlLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaGFzaCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXB0ZWcsCi0JCSAgICAgICBwdGkgKiA4LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY3VycmVudF9wdGUwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCS8qIGVtcHR5IHB0ZSBmaWxsIGl0ICovCi0JdW5zaWduZWQzMiBwdGUwID0gKE1BU0szMigwLCAwKQotCQkJICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHZzaWQsIDAsIDIzKSwgMSwgMjQpCi0JCQkgICB8IElOU0VSVEVEMzIoaCwgMjUsIDI1KQotCQkJICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHZwYWdlLCAwLCA1KSwgMjYsIDMxKSk7Ci0JdW5zaWduZWQzMiB0YXJnZXRfcHRlMCA9IEgyVF80KHB0ZTApOwotCXVuc2lnbmVkMzIgcHRlMSA9IChJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHJhLCAwLCAxOSksIDAsIDE5KQotCQkJICAgfCBJTlNFUlRFRDMyKHdpbWcsIDI1LCAyOCkKLQkJCSAgIHwgSU5TRVJURUQzMihwcCwgMzAsIDMxKSk7Ci0JdW5zaWduZWQzMiB0YXJnZXRfcHRlMSA9IEgyVF80KHB0ZTEpOwotCWlmIChkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKLQkJCQkgICAgJnRhcmdldF9wdGUwLAotCQkJCSAgICAwLCAvKnNwYWNlKi8KLQkJCQkgICAgcHRlLAotCQkJCSAgICBzaXplb2YodGFyZ2V0X3B0ZTApLAotCQkJCSAgICAxLypybz8qLykgIT0gNAotCSAgICB8fCBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKLQkJCQkgICAgICAgJnRhcmdldF9wdGUxLAotCQkJCSAgICAgICAwLCAvKnNwYWNlKi8KLQkJCQkgICAgICAgcHRlICsgNCwKLQkJCQkgICAgICAgc2l6ZW9mKHRhcmdldF9wdGUxKSwKLQkJCQkgICAgICAgMS8qcm8/Ki8pICE9IDQpCi0JICBkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gd3JpdGUgYSBwdGUgYSAweCVseCIsICh1bnNpZ25lZCBsb25nKXB0ZSk7Ci0JRFRSQUNFKGh0YWIsICgibWFwIC0gdmE9MHglMDhseCByYT0weCVseCB2c2lkPTB4JWx4IGg9JWQgdnBhZ2U9MHglbHggaGFzaD0weCVseCBwdGVnPTB4JWx4KyUyZCBwdGUwPTB4JWx4IHB0ZTE9MHglbHhcbiIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKXZhLAotCQkgICAgICAodW5zaWduZWQgbG9uZylyYSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpdnNpZCwKLQkJICAgICAgaCwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpdnBhZ2UsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKWhhc2gsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZWcsCi0JCSAgICAgIHB0aSAqIDgsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZTAsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZTEpKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIHJlLWhhc2ggKi8KLSAgICBoYXNoID0gTUFTS0VEMzIofmhhc2gsIDAsIDE4KTsKLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWRfd29yZAotY2xhaW1fbWVtb3J5KGRldmljZSAqbWUsCi0JICAgICBkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKLQkgICAgIHVuc2lnbmVkX3dvcmQgcmEsCi0JICAgICB1bnNpZ25lZF93b3JkIHNpemUpCi17Ci0gIHVuc2lnbmVkMzIgYXJnc1szXTsKLSAgdW5zaWduZWQzMiByZXN1bHRzWzFdOwotICBpbnQgc3RhdHVzOwotICBhcmdzWzBdID0gMDsgLyogYWxpZ25tZW50ICovCi0gIGFyZ3NbMV0gPSBzaXplOwotICBhcmdzWzJdID0gcmE7Ci0gIHN0YXR1cyA9IGRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZChtZW1vcnksICJjbGFpbSIsIDMsIGFyZ3MsIDEsIHJlc3VsdHMpOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiZmFpbGVkIHRvIGNsYWltIG1lbW9yeSIpOwotICByZXR1cm4gcmVzdWx0c1swXTsKLX0KLQotc3RhdGljIHZvaWQKLWh0YWJfbWFwX3JlZ2lvbihkZXZpY2UgKm1lLAotCQlkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKLQkJdW5zaWduZWRfd29yZCBwdGVfcmEsCi0JCXVuc2lnbmVkNjQgcHRlX3ZhLAotCQl1bnNpZ25lZCBucl9ieXRlcywKLQkJdW5zaWduZWQgd2ltZywKLQkJdW5zaWduZWQgcHAsCi0JCXVuc2lnbmVkMzIgaHRhYm9yZywKLQkJdW5zaWduZWQzMiBodGFibWFzaykKLXsKLSAgdW5zaWduZWRfd29yZCByYTsKLSAgdW5zaWduZWQ2NCB2YTsKLSAgLyogY2xhaW0gdGhlIG1lbW9yeSAqLwotICBpZiAobWVtb3J5ICE9IE5VTEwpCi0gICAgY2xhaW1fbWVtb3J5KG1lLCBtZW1vcnksIHB0ZV9yYSwgbnJfYnl0ZXMpOwotICAvKiBnbyB0aHJvdWdoIGFsbCBwYWdlcyBhbmQgY3JlYXRlIGEgcHRlIGZvciBlYWNoICovCi0gIGZvciAocmEgPSBwdGVfcmEsIHZhID0gcHRlX3ZhOwotICAgICAgIHJhIDwgcHRlX3JhICsgbnJfYnl0ZXM7Ci0gICAgICAgcmEgKz0gMHgxMDAwLCB2YSArPSAweDEwMDApIHsKLSAgICBodGFiX21hcF9wYWdlKG1lLCByYSwgdmEsIHdpbWcsIHBwLCBodGFib3JnLCBodGFibWFzayk7Ci0gIH0KLX0KLSAgCi10eXBlZGVmIHN0cnVjdCBfaHRhYl9iaW5hcnlfc2l6ZXMgewotICB1bnNpZ25lZF93b3JkIHRleHRfcmE7Ci0gIHVuc2lnbmVkX3dvcmQgdGV4dF9iYXNlOwotICB1bnNpZ25lZF93b3JkIHRleHRfYm91bmQ7Ci0gIHVuc2lnbmVkX3dvcmQgZGF0YV9yYTsKLSAgdW5zaWduZWRfd29yZCBkYXRhX2Jhc2U7Ci0gIHVuc2lnbmVkIGRhdGFfYm91bmQ7Ci0gIGRldmljZSAqbWU7Ci19IGh0YWJfYmluYXJ5X3NpemVzOwotCi1zdGF0aWMgdm9pZAotaHRhYl9zdW1fYmluYXJ5KGJmZCAqYWJmZCwKLQkJc2VjX3B0ciBzZWMsCi0JCVBUUiBkYXRhKQotewotICBodGFiX2JpbmFyeV9zaXplcyAqc2l6ZXMgPSAoaHRhYl9iaW5hcnlfc2l6ZXMqKWRhdGE7Ci0gIHVuc2lnbmVkX3dvcmQgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgdW5zaWduZWRfd29yZCB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbG1hKGFiZmQsIHNlYykgKChzZWMpLT5sbWEgKyAwKQotICB1bnNpZ25lZF93b3JkIHJhID0gYmZkX2dldF9zZWN0aW9uX2xtYSAoYWJmZCwgc2VjKTsKLQotICAvKiBza2lwIHRoZSBzZWN0aW9uIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAqLwotICBpZiAoISAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpKQotICAgIHJldHVybjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgICAgfHwgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19SRUFET05MWSkpIHsKLSAgICBpZiAoc2l6ZXMtPnRleHRfYm91bmQgPCB2bWEgKyBzaXplKQotICAgICAgc2l6ZXMtPnRleHRfYm91bmQgPSBBTElHTl9QQUdFKHZtYSArIHNpemUpOwotICAgIGlmIChzaXplcy0+dGV4dF9iYXNlID4gdm1hKQotICAgICAgc2l6ZXMtPnRleHRfYmFzZSA9IEZMT09SX1BBR0Uodm1hKTsKLSAgICBpZiAoc2l6ZXMtPnRleHRfcmEgPiByYSkKLSAgICAgIHNpemVzLT50ZXh0X3JhID0gRkxPT1JfUEFHRShyYSk7Ci0gIH0KLSAgZWxzZSBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotCSAgIHx8IChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpKSB7Ci0gICAgaWYgKHNpemVzLT5kYXRhX2JvdW5kIDwgdm1hICsgc2l6ZSkKLSAgICAgIHNpemVzLT5kYXRhX2JvdW5kID0gQUxJR05fUEFHRSh2bWEgKyBzaXplKTsKLSAgICBpZiAoc2l6ZXMtPmRhdGFfYmFzZSA+IHZtYSkKLSAgICAgIHNpemVzLT5kYXRhX2Jhc2UgPSBGTE9PUl9QQUdFKHZtYSk7Ci0gICAgaWYgKHNpemVzLT5kYXRhX3JhID4gcmEpCi0gICAgICBzaXplcy0+ZGF0YV9yYSA9IEZMT09SX1BBR0UocmEpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1odGFiX2RtYV9iaW5hcnkoYmZkICphYmZkLAotCQlzZWNfcHRyIHNlYywKLQkJUFRSIGRhdGEpCi17Ci0gIGh0YWJfYmluYXJ5X3NpemVzICpzaXplcyA9IChodGFiX2JpbmFyeV9zaXplcyopZGF0YTsKLSAgdm9pZCAqc2VjdGlvbl9pbml0OwotICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fdm1hOwotICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fc2l6ZTsKLSAgdW5zaWduZWRfd29yZCBzZWN0aW9uX3JhOwotICBkZXZpY2UgKm1lID0gc2l6ZXMtPm1lOwotCi0gIC8qIHNraXAgdGhlIHNlY3Rpb24gaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlICovCi0gIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19BTExPQykpCi0gICAgcmV0dXJuOwotCi0gIC8qIGNoZWNrL2lnbm9yZSBhbnkgc2VjdGlvbnMgb2Ygc2l6ZSB6ZXJvICovCi0gIHNlY3Rpb25fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWMpOwotICBpZiAoc2VjdGlvbl9zaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIGlmIG5vdGhpbmcgdG8gbG9hZCwgaWdub3JlIHRoaXMgb25lICovCi0gIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19MT0FEKSkKLSAgICByZXR1cm47Ci0KLSAgLyogZmluZCB3aGVyZSBpdCBpcyB0byBnbyAqLwotICBzZWN0aW9uX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEoYWJmZCwgc2VjKTsKLSAgc2VjdGlvbl9yYSA9IDA7Ci0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpCi0gICAgICB8fCAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX1JFQURPTkxZKSkKLSAgICBzZWN0aW9uX3JhID0gKHNlY3Rpb25fdm1hIC0gc2l6ZXMtPnRleHRfYmFzZSArIHNpemVzLT50ZXh0X3JhKTsKLSAgZWxzZSBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKSkKLSAgICBzZWN0aW9uX3JhID0gKHNlY3Rpb25fdm1hIC0gc2l6ZXMtPmRhdGFfYmFzZSArIHNpemVzLT5kYXRhX3JhKTsKLSAgZWxzZSAKLSAgICByZXR1cm47IC8qIGp1c3QgaWdub3JlIGl0ICovCi0KLSAgRFRSQUNFKGh0YWIsCi0JICgibG9hZCAtIG5hbWU9JS03cyB2bWE9MHglLjhseCBzaXplPSU2bGQgcmE9MHglLjhseCBmbGFncz0lM2x4KCVzJXMlcyVzJXMgKVxuIiwKLQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGFiZmQsIHNlYyksCi0JICAobG9uZylzZWN0aW9uX3ZtYSwKLQkgIChsb25nKXNlY3Rpb25fc2l6ZSwKLQkgIChsb25nKXNlY3Rpb25fcmEsCi0JICAobG9uZyliZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSwKLQkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX0xPQUQgPyAiIExPQUQiIDogIiIsCi0JICBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19DT0RFID8gIiBDT0RFIiA6ICIiLAotCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHNlYykgJiBTRUNfREFUQSA/ICIgREFUQSIgOiAiIiwKLQkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX0FMTE9DID8gIiBBTExPQyIgOiAiIiwKLQkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX1JFQURPTkxZID8gIiBSRUFET05MWSIgOiAiIgotCSAgKSk7Ci0KLSAgLyogZG1hIGluIHRoZSBzZWN0aW9ucyBkYXRhICovCi0gIHNlY3Rpb25faW5pdCA9IHphbGxvYyhzZWN0aW9uX3NpemUpOwotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLAotCQkJCXNlYywKLQkJCQlzZWN0aW9uX2luaXQsIDAsCi0JCQkJc2VjdGlvbl9zaXplKSkgewotICAgIGJmZF9wZXJyb3IoImRldmljZXMvcHRlIik7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gZGF0YSBsb2FkZWQiKTsKLSAgfQotICBpZiAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCi0JCQkgICAgICBzZWN0aW9uX2luaXQsCi0JCQkgICAgICAwIC8qc3BhY2UqLywKLQkJCSAgICAgIHNlY3Rpb25fcmEsCi0JCQkgICAgICBzZWN0aW9uX3NpemUsCi0JCQkgICAgICAxIC8qdmlvbGF0ZV9yZWFkX29ubHkqLykKLSAgICAgICE9IHNlY3Rpb25fc2l6ZSkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJicm9rZW4gZG1hIHRyYW5zZmVyIik7Ci0gIHpmcmVlKHNlY3Rpb25faW5pdCk7IC8qIG9ubHkgZnJlZSBpZiBsb2FkICovCi19Ci0KLS8qIGNyZWF0ZSBhIG1lbW9yeSBtYXAgZnJvbSBhIGJpbmFyaWVzIHZpcnR1YWwgYWRkcmVzc2VzIHRvIGEgY29weSBvZgotICAgdGhlIGJpbmFyeSBsYWlkIG91dCBsaW5lYXJseSBpbiBtZW1vcnkgKi8KLQotc3RhdGljIHZvaWQKLWh0YWJfbWFwX2JpbmFyeShkZXZpY2UgKm1lLAotCQlkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKLQkJdW5zaWduZWRfd29yZCByYSwKLQkJdW5zaWduZWQgd2ltZywKLQkJdW5zaWduZWQgcHAsCi0JCWNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkJdW5zaWduZWQzMiBodGFib3JnLAotCQl1bnNpZ25lZDMyIGh0YWJtYXNrKQotewotICBodGFiX2JpbmFyeV9zaXplcyBzaXplczsKLSAgYmZkICppbWFnZTsKLSAgc2l6ZXMudGV4dF9yYSA9IC0xOwotICBzaXplcy5kYXRhX3JhID0gLTE7Ci0gIHNpemVzLnRleHRfYmFzZSA9IC0xOwotICBzaXplcy5kYXRhX2Jhc2UgPSAtMTsKLSAgc2l6ZXMudGV4dF9ib3VuZCA9IDA7Ci0gIHNpemVzLmRhdGFfYm91bmQgPSAwOwotICBzaXplcy5tZSA9IG1lOwotCi0gIC8qIG9wZW4gdGhlIGZpbGUgKi8KLSAgaW1hZ2UgPSBiZmRfb3BlbnIoZmlsZV9uYW1lLCBOVUxMKTsKLSAgaWYgKGltYWdlID09IE5VTEwpIHsKLSAgICBiZmRfcGVycm9yKCJkZXZpY2VzL3B0ZSIpOwotICAgIGRldmljZV9lcnJvcihtZSwgInRoZSBmaWxlICVzIG5vdCBsb2FkZWQiLCBmaWxlX25hbWUpOwotICB9Ci0KLSAgLyogY2hlY2sgaXQgaXMgdmFsaWQgKi8KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0KGltYWdlLCBiZmRfb2JqZWN0KSkgewotICAgIGJmZF9jbG9zZShpbWFnZSk7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAidGhlIGZpbGUgJXMgaGFzIGFuIGludmFsaWQgYmluYXJ5IGZvcm1hdCIsIGZpbGVfbmFtZSk7Ci0gIH0KLQotICAvKiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZWFjaCBvZiB0aGUgZmlsZXMgcmVnaW9ucyAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGltYWdlLCBodGFiX3N1bV9iaW5hcnksIChQVFIpICZzaXplcyk7Ci0KLSAgLyogaWYgbmVlZGVkLCBkZXRlcm1pbmUgdGhlIHJlYWwgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBpZiAocmEgIT0gLTEpIHsKLSAgICBzaXplcy50ZXh0X3JhID0gcmE7Ci0gICAgc2l6ZXMuZGF0YV9yYSA9IEFMSUdOX1BBR0Uoc2l6ZXMudGV4dF9yYSArIAotCQkJICAgICAgIChzaXplcy50ZXh0X2JvdW5kIC0gc2l6ZXMudGV4dF9iYXNlKSk7Ci0gIH0KLQotICBEVFJBQ0UoaHRhYiwgKCJ0ZXh0IG1hcCAtIGJhc2U9MHglbHggYm91bmQ9MHglbHgtMSByYT0weCVseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcpc2l6ZXMudGV4dF9iYXNlLAotCQkodW5zaWduZWQgbG9uZylzaXplcy50ZXh0X2JvdW5kLAotCQkodW5zaWduZWQgbG9uZylzaXplcy50ZXh0X3JhKSk7Ci0gIERUUkFDRShodGFiLCAoImRhdGEgbWFwIC0gYmFzZT0weCVseCBib3VuZD0weCVseC0xIHJhPTB4JWx4XG4iLAotCQkodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX2Jhc2UsCi0JCSh1bnNpZ25lZCBsb25nKXNpemVzLmRhdGFfYm91bmQsCi0JCSh1bnNpZ25lZCBsb25nKXNpemVzLmRhdGFfcmEpKTsKLQotICAvKiBjaGVjayBmb3IgYW5kIGZpeCBhIGJvdGNoZWQgaW1hZ2UgKHRleHQgYW5kIGRhdGEgc2VnbWVudHMKLSAgICAgb3ZlcmxhcCkgKi8KLSAgaWYgKChzaXplcy50ZXh0X2Jhc2UgPD0gc2l6ZXMuZGF0YV9iYXNlCi0gICAgICAgJiYgc2l6ZXMudGV4dF9ib3VuZCA+PSBzaXplcy5kYXRhX2JvdW5kKQotICAgICAgfHwgKHNpemVzLmRhdGFfYmFzZSA8PSBzaXplcy50ZXh0X2Jhc2UKLQkgICYmIHNpemVzLmRhdGFfYm91bmQgPj0gc2l6ZXMuZGF0YV9ib3VuZCkKLSAgICAgIHx8IChzaXplcy50ZXh0X2JvdW5kID4gc2l6ZXMuZGF0YV9iYXNlCi0JICAmJiBzaXplcy50ZXh0X2JvdW5kIDw9IHNpemVzLmRhdGFfYm91bmQpCi0gICAgICB8fCAoc2l6ZXMudGV4dF9iYXNlID49IHNpemVzLmRhdGFfYmFzZQotCSAgJiYgc2l6ZXMudGV4dF9iYXNlIDwgc2l6ZXMuZGF0YV9ib3VuZCkpIHsKLSAgICBEVFJBQ0UoaHRhYiwgKCJ0ZXh0IGFuZCBkYXRhIHNlZ21lbnQgb3ZlcmxhcGVkIC0gdXNpbmcganVzdCBkYXRhIHNlZ21lbnRcbiIpKTsKLSAgICAvKiBjaGVjayB2YS0+cmEgbGluZWFyICovCi0gICAgaWYgKChzaXplcy50ZXh0X2Jhc2UgLSBzaXplcy50ZXh0X3JhKQotCSE9IChzaXplcy5kYXRhX2Jhc2UgLSBzaXplcy5kYXRhX3JhKSkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIm92ZXJsYXBwaW5nIGJ1dCBtaXNzYWxpZ25lZCB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzIik7Ci0gICAgLyogZW5sYXJnZSB0aGUgZGF0YSBzZWdtZW50ICovCi0gICAgaWYgKHNpemVzLnRleHRfYmFzZSA8IHNpemVzLmRhdGFfYmFzZSkKLSAgICAgIHNpemVzLmRhdGFfYmFzZSA9IHNpemVzLnRleHRfYmFzZTsKLSAgICBpZiAoc2l6ZXMudGV4dF9ib3VuZCA+IHNpemVzLmRhdGFfYm91bmQpCi0gICAgICBzaXplcy5kYXRhX2JvdW5kID0gc2l6ZXMudGV4dF9ib3VuZDsKLSAgICBpZiAoc2l6ZXMudGV4dF9yYSA8IHNpemVzLmRhdGFfcmEpCi0gICAgICBzaXplcy5kYXRhX3JhID0gc2l6ZXMudGV4dF9yYTsKLSAgICAvKiB6YXAgdGhlIHRleHQgc2VnbWVudCAqLwotICAgIHNpemVzLnRleHRfYmFzZSA9IDA7Ci0gICAgc2l6ZXMudGV4dF9ib3VuZCA9IDA7Ci0gICAgc2l6ZXMudGV4dF9yYSA9IDA7Ci0gICAgRFRSQUNFKGh0YWIsICgiY29tbW9uIG1hcCAtIGJhc2U9MHglbHggYm91bmQ9MHglbHgtMSByYT0weCVseFxuIiwKLQkJICAodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX2Jhc2UsCi0JCSAgKHVuc2lnbmVkIGxvbmcpc2l6ZXMuZGF0YV9ib3VuZCwKLQkJICAodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX3JhKSk7Ci0gIH0KLQotICAvKiBzZXQgdXAgdmlydHVhbCBtZW1vcnkgbWFwcyBmb3IgZWFjaCBvZiB0aGUgcmVnaW9ucyAqLwotICBodGFiX21hcF9yZWdpb24obWUsIG1lbW9yeSwgc2l6ZXMudGV4dF9yYSwgc2l6ZXMudGV4dF9iYXNlLAotCQkgIHNpemVzLnRleHRfYm91bmQgLSBzaXplcy50ZXh0X2Jhc2UsCi0JCSAgd2ltZywgcHAsCi0JCSAgaHRhYm9yZywgaHRhYm1hc2spOwotCi0gIGh0YWJfbWFwX3JlZ2lvbihtZSwgbWVtb3J5LCBzaXplcy5kYXRhX3JhLCBzaXplcy5kYXRhX2Jhc2UsCi0JCSAgc2l6ZXMuZGF0YV9ib3VuZCAtIHNpemVzLmRhdGFfYmFzZSwKLQkJICB3aW1nLCBwcCwKLQkJICBodGFib3JnLCBodGFibWFzayk7Ci0KLSAgLyogZG1hIHRoZSBzZWN0aW9ucyBpbnRvIHBoeXNpY2FsIG1lbW9yeSAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGltYWdlLCBodGFiX2RtYV9iaW5hcnksIChQVFIpICZzaXplcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1odGFiX2luaXRfZGF0YV9jYWxsYmFjayhkZXZpY2UgKm1lKQotewotICBkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSA9IE5VTEw7Ci0gIGlmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgIT0gMzIpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAib25seSAzMmJpdCB0YXJnZXRzIGN1cnJlbnRseSBzdXBvcnRlZCIpOwotCi0gIC8qIGZpbmQgbWVtb3J5IGRldmljZSAqLwotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJjbGFpbSIpICE9IE5VTEwpCi0gICAgbWVtb3J5ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkobWUsICIvY2hvc2VuL21lbW9yeSIpOwotCi0gIC8qIGZvciB0aGUgaHRhYiwganVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgaXQgKi8KLSAgaWYgKHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJodGFiIikgPT0gMCkgewotICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcyA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFsLWFkZHJlc3MiKTsKLSAgICB1bnNpZ25lZF93b3JkIGxlbmd0aCA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJuci1ieXRlcyIpOwotICAgIHVuc2lnbmVkX3dvcmQgYmFzZSA9IGNsYWltX21lbW9yeShtZSwgbWVtb3J5LCBhZGRyZXNzLCBsZW5ndGgpOwotICAgIGlmIChiYXNlID09IC0xIHx8IGJhc2UgIT0gYWRkcmVzcykKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImNhbm5vdCBhbGxvY2F0ZSBoYXNoIHRhYmxlIik7Ci0gIH0KLQotICAvKiBmb3IgdGhlIHB0ZSwgZG8gYWxsIHRoZSByZWFsIHdvcmsgKi8KLSAgaWYgKHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJwdGUiKSA9PSAwKSB7Ci0gICAgdW5zaWduZWQzMiBodGFib3JnOwotICAgIHVuc2lnbmVkMzIgaHRhYm1hc2s7Ci0KLSAgICBodGFiX2RlY29kZV9oYXNoX3RhYmxlKG1lLCAmaHRhYm9yZywgJmh0YWJtYXNrKTsKLQotICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImZpbGUtbmFtZSIpICE9IE5VTEwpIHsKLSAgICAgIC8qIG1hcCBpbiBhIGJpbmFyeSAqLwotICAgICAgdW5zaWduZWQgcHRlX3dpbWcgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAid2ltZyIpOwotICAgICAgdW5zaWduZWQgcHRlX3BwID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInBwIik7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJmaWxlLW5hbWUiKTsKLSAgICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgInJlYWwtYWRkcmVzcyIpICE9IE5VTEwpIHsKLQl1bnNpZ25lZDMyIHB0ZV9yYSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFsLWFkZHJlc3MiKTsKLQlEVFJBQ0UoaHRhYiwgKCJwdGUgLSByYT0weCVseCwgd2ltZz0lbGQsIHBwPSVsZCwgZmlsZS1uYW1lPSVzXG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZylwdGVfcmEsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZV93aW1nLAotCQkgICAgICAobG9uZylwdGVfcHAsCi0JCSAgICAgIGZpbGVfbmFtZSkpOwotCWh0YWJfbWFwX2JpbmFyeShtZSwgbWVtb3J5LCBwdGVfcmEsIHB0ZV93aW1nLCBwdGVfcHAsIGZpbGVfbmFtZSwKLQkJCWh0YWJvcmcsIGh0YWJtYXNrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCURUUkFDRShodGFiLCAoInB0ZSAtIHdpbWc9JWxkLCBwcD0lbGQsIGZpbGUtbmFtZT0lc1xuIiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpcHRlX3dpbWcsCi0JCSAgICAgIChsb25nKXB0ZV9wcCwKLQkJICAgICAgZmlsZV9uYW1lKSk7Ci0JaHRhYl9tYXBfYmluYXJ5KG1lLCBtZW1vcnksIC0xLCBwdGVfd2ltZywgcHRlX3BwLCBmaWxlX25hbWUsCi0JCQlodGFib3JnLCBodGFibWFzayk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogaGFuZGxlIGEgbm9ybWFsIG1hcHBpbmcgZGVmaW5pdGlvbiAqLwotICAgICAgdW5zaWduZWQ2NCBwdGVfdmEgPSAwOwotICAgICAgdW5zaWduZWQzMiBwdGVfcmEgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAicmVhbC1hZGRyZXNzIik7Ci0gICAgICB1bnNpZ25lZCBwdGVfbnJfYnl0ZXMgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAibnItYnl0ZXMiKTsKLSAgICAgIHVuc2lnbmVkIHB0ZV93aW1nID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIndpbWciKTsKLSAgICAgIHVuc2lnbmVkIHB0ZV9wcCA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJwcCIpOwotICAgICAgc2lnbmVkX2NlbGwgcGFydGlhbF92YTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsKLQkgICBkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAidmlydHVhbC1hZGRyZXNzIiwgaSwgJnBhcnRpYWxfdmEpOwotCSAgIGkrKykgewotCXB0ZV92YSA9IChwdGVfdmEgPDwgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKSB8ICh1bnNpZ25lZF9jZWxsKXBhcnRpYWxfdmE7Ci0gICAgICB9Ci0gICAgICBEVFJBQ0UoaHRhYiwgKCJwdGUgLSByYT0weCVseCwgd2ltZz0lbGQsIHBwPSVsZCwgdmE9MHglbHgsIG5yX2J5dGVzPSVsZFxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nKXB0ZV9yYSwKLQkJICAgIChsb25nKXB0ZV93aW1nLAotCQkgICAgKGxvbmcpcHRlX3BwLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcHRlX3ZhLAotCQkgICAgKGxvbmcpcHRlX25yX2J5dGVzKSk7Ci0gICAgICBodGFiX21hcF9yZWdpb24obWUsIG1lbW9yeSwgcHRlX3JhLCBwdGVfdmEsIHB0ZV9ucl9ieXRlcywgcHRlX3dpbWcsIHB0ZV9wcCwKLQkJICAgICAgaHRhYm9yZywgaHRhYm1hc2spOwotICAgIH0KLSAgfQotfQotCi0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh0YWJfY2FsbGJhY2tzID0gewotICB7IE5VTEwsIGh0YWJfaW5pdF9kYXRhX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBOVUxMLCB9LCAvKiBJTyAqLwotICB7IHBhc3N0aHJvdWdoX2RldmljZV9kbWFfcmVhZF9idWZmZXIsCi0gICAgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXIsIH0sCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsIH0sCi19OwotCi1jb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19odGFiX2RldmljZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgImh0YWIiLCBOVUxMLCAmaHRhYl9jYWxsYmFja3MgfSwKLSAgeyAicHRlIiwgTlVMTCwgJmh0YWJfY2FsbGJhY2tzIH0sIC8qIHllcCAtIHVzZXMgaHRhYidzIHRhYmxlICovCi0gIHsgTlVMTCB9LAotfTsKLQotI2VuZGlmIC8qIF9IV19IVEFCX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2lkZS5jIGIvc2ltL3BwYy9od19pZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkNTRiMy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X2lkZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODY5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19JREVfQ18KLSNkZWZpbmUgX0hXX0lERV9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLQotCi0vKiBERVZJQ0UKLQotCi0gICBpZGUgLSBJbnRlZ3JhdGVkIERpc2sgRWxlY3Ryb25pY3MKLQotCi0gICBERVNDUklQVElPTgotCi0KLSAgIFRoaXMgZGV2aWNlIG1vZGVscyB0aGUgcHJpbWFyeS9zZWNvbmRhcnkgPDxpZGU+PiBjb250cm9sbGVyCi0gICBkZXNjcmliZWQgaW4gdGhlIFtDSFJQSU9dIGRvY3VtZW50LgotCi0gICBUaGUgY29udHJvbGxlciBoYXMgc2VwYXJhdGUgaW5kZXBlbmRhbnQgaW50ZXJydXB0IG91dHB1dHMgZm9yIGVhY2gKLSAgIDw8aWRlPj4gYnVzLgotCi0KLSAgIFBST1BFUlRJRVMKLQotCi0gICByZWcgPSAuLi4gIChyZXF1aXJlZCkKLQotICAgVGhlIDw8cmVnPj4gcHJvcGVydHkgaXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudCBbQ0hSUElPXS4KLQotCi0gICByZWFkeS1kZWxheSA9IDxpbnRlZ2VyPiAgKG9wdGlvbmFsKQotCi0gICBJZiBwcmVzZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgdGltZSB0aGF0IHRoZSA8PGlkZT4+IGRldmljZSB0YWtlcwotICAgdG8gY29tcGxldGUgYW4gSS9PIG9wZXJhdGlvbi4KLQotCi0gICBkaXNrQD8vaWRlLWJ5dGUtY291bnQgPSA8aW50ZWdlcj4gIChvcHRpb25hbCkKLQotICAgZGlza0A/L2lkZS1zZWN0b3ItY291bnQgPSA8aW50ZWdlcj4gIChvcHRpb25hbCkKLQotICAgZGlza0A/L2lkZS1oZWFkLWNvdW50ID0gPGludGVnZXI+ICAob3B0aW9uYWwpCi0KLSAgIFRoZSA8PGlkZT4+IGRldmljZSBjaGVja3MgZWFjaCBjaGlsZCAoZGlzayBkZXZpY2UpIG5vZGUgdG8gc2VlIGlmCi0gICBpdCBoYXMgdGhlIGFib3ZlIHByb3BlcnRpZXMuICBJZiBwcmVzZW50LCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSB1c2VkCi0gICB0byBjb21wdXRlIHRoZSA8PExCQT4+IGFkZHJlc3MgaW4gPDxDSFM+PiBhZGRyZXNzaW5nIG1vZGUuCi0KLQotICAgRVhBTVBMRVMKLQotCi0gICBFbmFibGUgdHJhY2luZzoKLQotICAgfCAgLXQgaWRlLWRldmljZSBcCi0KLQotICAgQXR0YWNoIHRoZSA8PGlkZT4+IGRldmljZSB0byB0aGUgPDxwY2k+PiBidXMgYXQgc2xvdCBvbmUuICBTcGVjaWZ5Ci0gICBsZWdhY3kgSS9PIGFkZHJlc3NlczoKLQotICAgfCAgLW8gJy9waGIvaWRlQDEvYXNzaWduZWQtYWRkcmVzc2VzIFwKLSAgIHwgICAgICAgIG5pMCwwLDEwLDFmMCA4IFwKLSAgIHwgICAgICAgIG5pMCwwLDE0LDNmOCA4IFwKLSAgIHwgICAgICAgIG5pMCwwLDE4LDE3MCA4IFwKLSAgIHwgICAgICAgIG5pMCwwLDFjLDM3OCA4IFwKLSAgIHwgICAgICAgIG5pMCwwLDIwLDIwMCA4JyBcCi0gICB8ICAtbyAnL3BoYkAweDgwMDAwMDAwL2lkZUAxL3JlZyBcCi0gICB8ICAgICAgICAxIDAgXAotICAgfCAgICAgICAgaTAsMCwxMCwwIDggXAotICAgfCAgICAgICAgaTAsMCwxOCwwIDggXAotICAgfCAgICAgICAgaTAsMCwxNCw2IDEgXAotICAgfCAgICAgICAgaTAsMCwxYyw2IDEgXAotICAgfCAgICAgICAgaTAsMCwyMCwwIDgnIFwKLQotICAgTm90ZTogdGhlIGZvdXRoIGFuZCBmaWZ0aCByZWcgZW50cmllcyBzcGVjaWZ5IHRoYXQgdGhlIHJlZ2lzdGVyIGlzCi0gICBhdCBhbiBvZmZzZXQgaW50byB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgdGhlIGJhc2UgcmVnaXN0ZXIKLSAgICg8PGFzc2lnbmVkLWFkZHJlc3Nlcz4+KTsgQXBhcnQgZnJvbSByZXN0cmljdGlvbnMgcGxhY2VkIGJ5IHRoZQotICAgPDxwY2k+PiBzcGVjaWZpY2F0aW9uLCBubyByZXN0cmljdGlvbnMgYXJlIHBsYWNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICBiYXNlIHJlZ2lzdGVycyBzcGVjaWZpZWQgYnkgdGhlIDw8YXNzaWduZWQtYWRkcmVzc2VzPj4gcHJvcGVydHkuCi0gICAKLSAgIEF0dGFjaCBhIDw8ZGlzaz4+IHRvIHRoZSBwcmltYXJ5IGFuZCBhIDw8Y2Ryb20+PiB0byB0aGUgc2Vjb25kYXJ5Ci0gICA8PGlkZT4+IGNvbnRyb2xsZXIuCi0KLSAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvaWRlQDEvZGlza0AwL2ZpbGUgInplcm8nIFwKLSAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvaWRlQDEvY2Ryb21AMi9maWxlICIvZGV2L2Nkcm9tIicgXAotCi0gICBDb25uZWN0IHRoZSB0d28gaW50ZXJydXB0IG91dHB1dHMgKGEgYW5kIGIpIHRvIGEgPDxnbHVlPj4gZGV2aWNlIHRvCi0gICBhbGxvdyB0ZXN0aW5nIG9mIHRoZSBpbnRlcnJ1cHQgcG9ydC4gSW4gYSByZWFsIHNpbXVsYXRpb24gdGhleQotICAgd291bGQgYmUgd2lyZWQgdG8gdGhlIGludGVycnVwdCBjb250cm9sbGVyLgotCi0gICB8ICAtbyAnL3BoYkAweDgwMDAwMDAwL2dsdWVAMi9yZWcgMiAwIG5pMCwwLDAsMCA4JyBcCi0gICB8ICAtbyAnL3BoYkAweDgwMDAwMDAwL2lkZUAxID4gYSAwIC9waGJAMHg4MDAwMDAwMC9nbHVlQDInIFwKLSAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvaWRlQDEgPiBiIDEgL3BoYkAweDgwMDAwMDAwL2dsdWVAMicgCi0KLSAgIAotICAgQlVHUwotICAgCi0KLSAgIFdoaWxlIHRoZSBETUEgcmVnaXN0ZXJzIGFyZSBwcmVzZW50LCBETUEgc3VwcG9ydCBoYXMgbm90IHlldCBiZWVuCi0gICBpbXBsZW1lbnRlZC4KLQotICAgVGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgY29tbWFuZHMgaXMgdmVyeSBsaW1pdGVkLgotCi0gICBUaGUgc3RhbmRhcmRzIGRvY3VtZW50cyBhcHBlYXIgdG8gYmUgdmFndWUgb24gaG93IHRvIHNwZWNpZnkgdGhlCi0gICA8PHVuaXQtYWRkcmVzcz4+IG9mIGRpc2sgZGV2aWNlcyBkZXZpY2VzIGJlaW5nIGF0dGFjaGVkIHRvIHRoZQotICAgPDxpZGU+PiBjb250cm9sbGVyLiAgSSd2ZSBjaG9zZW4gdG8gdXNlIGludGVnZXJzIHdpdGggZGV2aWNlcyB6ZXJvCi0gICBhbmQgb25lIGdvaW5nIHRvIHRoZSBwcmltYXJ5IGNvbnRyb2xsZXIgd2hpbGUgdHdvIGFuZCB0aHJlZSBhcmUKLSAgIGNvbm5lY3RlZCB0byB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIuCi0KLQotICAgUkVGRVJFTkNFUwotCi0KLSAgIFtDSFJQSU9dIFBvd2VyUEModG0pIE1pY3JvcHJvY2Vzc29yIENvbW1vbiBIYXJkd2FyZSBSZWZlcmVuY2UKLSAgIFBsYXRmb3JtOiBJL08gRGV2aWNlIFJlZmVyZW5jZS4gIGh0dHA6Ly9jaHJwLmFwcGxlLmNvbS8/Pz8uCi0KLSAgIFtTQ0hNSURUXSBUaGUgU0NTSSBCdXMgYW5kIElERSBJbnRlcmZhY2UgLSBQcm90b2NvbHMsIEFwcGxpY2F0aW9ucwotICAgYW5kIFByb2dyYW1taW5nLiAgRnJpZWRoZWxtIFNjaG1pZHQgKHRyYW5zbGF0ZWQgYnkgTWljaGFlbAotICAgU2NodWx0eikuICBJU0JOIDAtMjAxLTQyMjg0LTAuICBBZGRpc29uLVdlc2xleSBQdWJsaXNoaW5nIENvbXBhbnkuCi0KLQotICAgKi8KLQotICAgCi0KLXR5cGVkZWYgZW51bSBfaW9fZGlyZWN0aW9uIHsKLSAgaXNfcmVhZCwKLSAgaXNfd3JpdGUsCi19IGlvX2RpcmVjdGlvbjsKLQotCi1lbnVtIHsKLSAgbnJfaWRlX2NvbnRyb2xsZXJzID0gMiwKLSAgbnJfaWRlX2RyaXZlc19wZXJfY29udHJvbGxlciA9IDIsCi0gIG5yX2ZpZm9fZW50cmllcyA9IDgxOTIsCi19OwotCi1lbnVtIHsKLSAgLyogY29tbWFuZCByZWdpc3RlciBibG9jayAtIHJlYWQgKi8KLSAgaWRlX2RhdGFfcmVnLAotICBpZGVfZXJyb3JfcmVnLCAvKmlkZV9mZWF0dXJlX3JlZyovCi0gIGlkZV9zZWN0b3JfY291bnRfcmVnLAotICBpZGVfc2VjdG9yX251bWJlcl9yZWcsCi0gIGlkZV9jeWxpbmRlcl9yZWcwLAotICBpZGVfY3lsaW5kZXJfcmVnMSwKLSAgaWRlX2RyaXZlX2hlYWRfcmVnLAotICBpZGVfc3RhdHVzX3JlZywgLyppZGVfY29tbWFuZF9yZWcqLwotICAvKiBjb21tYW5kIHJlZ2lzdGVyIGJsb2NrIC0gd3JpdGUgKi8KLSAgaWRlX2ZlYXR1cmVfcmVnLCAvKmlkZV9lcnJvcl9yZWcqLwotICBpZGVfY29tbWFuZF9yZWcsIC8qaWRlX3N0YXR1c19yZWcqLwotICAvKiBjb250cm9sIHJlZ2lzdGVyIGJsb2NrIC0gcmVhZCAqLwotICBpZGVfYWx0ZXJuYXRlX3N0YXR1c19yZWcsIC8qaWRlX2NvbnRyb2xfcmVnKi8KLSAgaWRlX2NvbnRyb2xfcmVnLCAvKmlkZV9hbHRlcm5hdGVfc3RhdHVzX3JlZyovCi0gIC8qIGRtYSByZWdpc3RlciBibG9jayAqLwotICBpZGVfZG1hX2NvbW1hbmRfcmVnLAotICBpZGVfZG1hX3VudXNlZF8xX3JlZywKLSAgaWRlX2RtYV9zdGF0dXNfcmVnLAotICBpZGVfZG1hX3VudXNlZF8zX3JlZywKLSAgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcwLAotICBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzEsCi0gIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMiwKLSAgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWczLAotICBucl9pZGVfcmVnaXN0ZXJzLAotfTsKLQotCi10eXBlZGVmIGVudW0gX2lkZV9zdGF0ZXMgewotICBpZGxlX3N0YXRlLAotICBidXN5X2xvYWRlZF9zdGF0ZSwKLSAgYnVzeV9kcmFpbmVkX3N0YXRlLAotICBidXN5X2RtYV9zdGF0ZSwKLSAgYnVzeV9jb21tYW5kX3N0YXRlLAotICBsb2FkaW5nX3N0YXRlLAotICBkcmFpbmluZ19zdGF0ZSwKLX0gaWRlX3N0YXRlczsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaWRlX3N0YXRlX25hbWUoaWRlX3N0YXRlcyBzdGF0ZSkKLXsKLSAgc3dpdGNoIChzdGF0ZSkgewotICBjYXNlIGlkbGVfc3RhdGU6IHJldHVybiAiaWRsZSI7Ci0gIGNhc2UgYnVzeV9sb2FkZWRfc3RhdGU6IHJldHVybiAiYnVzeV9sb2FkZWRfc3RhdGUiOwotICBjYXNlIGJ1c3lfZHJhaW5lZF9zdGF0ZTogcmV0dXJuICJidXN5X2RyYWluZWRfc3RhdGUiOwotICBjYXNlIGJ1c3lfZG1hX3N0YXRlOiByZXR1cm4gImJ1c3lfZG1hX3N0YXRlIjsKLSAgY2FzZSBidXN5X2NvbW1hbmRfc3RhdGU6IHJldHVybiAiYnVzeV9jb21tYW5kX3N0YXRlIjsKLSAgY2FzZSBsb2FkaW5nX3N0YXRlOiByZXR1cm4gImxvYWRpbmdfc3RhdGUiOwotICBjYXNlIGRyYWluaW5nX3N0YXRlOiByZXR1cm4gImRyYWluaW5nX3N0YXRlIjsKLSAgZGVmYXVsdDogcmV0dXJuICJpbGxlZ2FsLXN0YXRlIjsKLSAgfQotfQotCi10eXBlZGVmIHN0cnVjdCBfaWRlX2dlb21ldHJ5IHsKLSAgaW50IGhlYWQ7Ci0gIGludCBzZWN0b3I7Ci0gIGludCBieXRlOwotfSBpZGVfZ2VvbWV0cnk7Ci0KLXR5cGVkZWYgc3RydWN0IF9pZGVfZHJpdmUgewotICBpbnQgbnI7Ci0gIGRldmljZSAqZGV2aWNlOwotICBpZGVfZ2VvbWV0cnkgZ2VvbWV0cnk7Ci0gIGlkZV9nZW9tZXRyeSBkZWZhdWx0X2dlb21ldHJ5OwotfSBpZGVfZHJpdmU7Ci0KLXR5cGVkZWYgc3RydWN0IF9pZGVfY29udHJvbGxlciB7Ci0gIGludCBucjsKLSAgaWRlX3N0YXRlcyBzdGF0ZTsKLSAgdW5zaWduZWQ4IHJlZ1tucl9pZGVfcmVnaXN0ZXJzXTsKLSAgdW5zaWduZWQ4IGZpZm9bbnJfZmlmb19lbnRyaWVzXTsKLSAgaW50IGZpZm9fcG9zOwotICBpbnQgZmlmb19zaXplOwotICBpZGVfZHJpdmUgKmN1cnJlbnRfZHJpdmU7Ci0gIGludCBjdXJyZW50X2J5dGU7Ci0gIGludCBjdXJyZW50X3RyYW5zZmVyOwotICBpZGVfZHJpdmUgZHJpdmVbbnJfaWRlX2RyaXZlc19wZXJfY29udHJvbGxlcl07Ci0gIGRldmljZSAqbWU7Ci0gIGV2ZW50X2VudHJ5X3RhZyBldmVudF90YWc7Ci0gIGludCBpc19pbnRlcnJ1cHRpbmc7Ci0gIHNpZ25lZDY0IHJlYWR5X2RlbGF5OwotfSBpZGVfY29udHJvbGxlcjsKLQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfaW50ZXJydXB0KGRldmljZSAqbWUsCi0JICAgICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCi17Ci0gIGlmICgoY29udHJvbGxlci0+cmVnW2lkZV9jb250cm9sX3JlZ10gJiAweDIpID09IDApIHsKLSAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQgLSBpbnRlcnJ1cHQgc2V0XG4iLCBjb250cm9sbGVyLT5ucikpOwotICAgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIGNvbnRyb2xsZXItPm5yLCAxLCBOVUxMLCAwKTsKLSAgICBjb250cm9sbGVyLT5pc19pbnRlcnJ1cHRpbmcgPSAxOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNsZWFyX2ludGVycnVwdChkZXZpY2UgKm1lLAotCQlpZGVfY29udHJvbGxlciAqY29udHJvbGxlcikKLXsKLSAgaWYgKGNvbnRyb2xsZXItPmlzX2ludGVycnVwdGluZykgewotICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZCAtIGludGVycnVwdCBjbGVhclxuIiwgY29udHJvbGxlci0+bnIpKTsKLSAgICBkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCBjb250cm9sbGVyLT5uciwgMCwgTlVMTCwgMCk7Ci0gICAgY29udHJvbGxlci0+aXNfaW50ZXJydXB0aW5nID0gMDsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19ldmVudCh2b2lkICpkYXRhKQotewotICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlciA9IGRhdGE7Ci0gIGRldmljZSAqbWUgPSBjb250cm9sbGVyLT5tZTsKLSAgY29udHJvbGxlci0+ZXZlbnRfdGFnID0gMDsKLSAgc3dpdGNoIChjb250cm9sbGVyLT5zdGF0ZSkgewotICBjYXNlIGJ1c3lfbG9hZGVkX3N0YXRlOgotICBjYXNlIGJ1c3lfZHJhaW5lZF9zdGF0ZToKLSAgICBpZiAoY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA+IDApIHsKLSAgICAgIGNvbnRyb2xsZXItPnN0YXRlID0gKGNvbnRyb2xsZXItPnN0YXRlID09IGJ1c3lfbG9hZGVkX3N0YXRlCi0JCQkgICA/IGxvYWRpbmdfc3RhdGUgOiBkcmFpbmluZ19zdGF0ZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY29udHJvbGxlci0+c3RhdGUgPSBpZGxlX3N0YXRlOwotICAgIH0KLSAgICBzZXRfaW50ZXJydXB0KG1lLCBjb250cm9sbGVyKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gdW5leHBlY3RlZCBldmVudCIsIGNvbnRyb2xsZXItPm5yKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1zY2hlZHVsZV9yZWFkeV9ldmVudChkZXZpY2UgKm1lLAotCQkgICAgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyKQotewotICBpZiAoY29udHJvbGxlci0+ZXZlbnRfdGFnICE9IDApCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIGF0dGVtcHRpbmcgdG8gc2NoZWR1bGUgbXVsdGlwbGUgZXZlbnRzIiwKLQkJIGNvbnRyb2xsZXItPm5yKTsKLSAgY29udHJvbGxlci0+ZXZlbnRfdGFnID0gCi0gICAgZGV2aWNlX2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCBjb250cm9sbGVyLT5yZWFkeV9kZWxheSwKLQkJCQlkb19ldmVudCwgY29udHJvbGxlcik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX2ZpZm9fcmVhZChkZXZpY2UgKm1lLAotCSAgICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsCi0JICAgICB2b2lkICpkZXN0LAotCSAgICAgaW50IG5yX2J5dGVzKQotewotICBpZiAoY29udHJvbGxlci0+c3RhdGUgIT0gZHJhaW5pbmdfc3RhdGUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIHJlYWRpbmcgZmlmbyB3aGVuIG5vdCByZWFkeSAoJXMpIiwKLQkJIGNvbnRyb2xsZXItPm5yLAotCQkgaWRlX3N0YXRlX25hbWUoY29udHJvbGxlci0+c3RhdGUpKTsKLSAgaWYgKGNvbnRyb2xsZXItPmZpZm9fcG9zICsgbnJfYnl0ZXMgPiBjb250cm9sbGVyLT5maWZvX3NpemUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIGZpZm8gdW5kZXJmbG93IiwgY29udHJvbGxlci0+bnIpOwotICBpZiAobnJfYnl0ZXMgPiAwKSB7Ci0gICAgbWVtY3B5KGRlc3QsICZjb250cm9sbGVyLT5maWZvW2NvbnRyb2xsZXItPmZpZm9fcG9zXSwgbnJfYnl0ZXMpOwotICAgIGNvbnRyb2xsZXItPmZpZm9fcG9zICs9IG5yX2J5dGVzOwotICB9Ci0gIGlmIChjb250cm9sbGVyLT5maWZvX3BvcyA9PSBjb250cm9sbGVyLT5maWZvX3NpemUpIHsKLSAgICBjb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyIC09IDE7Ci0gICAgaWYgKGNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIgPiAwCi0JJiYgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZSAhPSBOVUxMKSB7Ci0gICAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQ6JWQgLSByZWFkaW5nICVkIGJ5dGUgYmxvY2sgYXQgMHgleFxuIiwKLQkJICAgY29udHJvbGxlci0+bnIsCi0JCSAgIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPm5yLAotCQkgICBjb250cm9sbGVyLT5maWZvX3NpemUsCi0JCSAgIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSkpOwotICAgICAgaWYgKGRldmljZV9pb19yZWFkX2J1ZmZlcihjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5kZXZpY2UsCi0JCQkJY29udHJvbGxlci0+ZmlmbywKLQkJCQkwLCBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUsCi0JCQkJY29udHJvbGxlci0+Zmlmb19zaXplLAotCQkJCU5VTEwsIDApCi0JICAhPSBjb250cm9sbGVyLT5maWZvX3NpemUpCi0JZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIGRpc2sgJXMgaW8gcmVhZCBlcnJvciIsCi0JCSAgICAgY29udHJvbGxlci0+bnIsCi0JCSAgICAgZGV2aWNlX3BhdGgoY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+ZGV2aWNlKSk7Ci0gICAgfQotICAgIGNvbnRyb2xsZXItPnN0YXRlID0gYnVzeV9kcmFpbmVkX3N0YXRlOwotICAgIGNvbnRyb2xsZXItPmZpZm9fcG9zID0gMDsKLSAgICBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUgKz0gY29udHJvbGxlci0+Zmlmb19zaXplOwotICAgIHNjaGVkdWxlX3JlYWR5X2V2ZW50KG1lLCBjb250cm9sbGVyKTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19maWZvX3dyaXRlKGRldmljZSAqbWUsCi0JICAgICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsCi0JICAgICAgY29uc3Qgdm9pZCAqc291cmNlLAotCSAgICAgIGludCBucl9ieXRlcykKLXsKLSAgaWYgKGNvbnRyb2xsZXItPnN0YXRlICE9IGxvYWRpbmdfc3RhdGUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIHdyaXRpbmcgZmlmbyB3aGVuIG5vdCByZWFkeSAoJXMpIiwKLQkJIGNvbnRyb2xsZXItPm5yLAotCQkgaWRlX3N0YXRlX25hbWUoY29udHJvbGxlci0+c3RhdGUpKTsKLSAgaWYgKGNvbnRyb2xsZXItPmZpZm9fcG9zICsgbnJfYnl0ZXMgPiBjb250cm9sbGVyLT5maWZvX3NpemUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIGZpZm8gb3ZlcmZsb3ciLCBjb250cm9sbGVyLT5ucik7Ci0gIGlmIChucl9ieXRlcyA+IDApIHsKLSAgICBtZW1jcHkoJmNvbnRyb2xsZXItPmZpZm9bY29udHJvbGxlci0+Zmlmb19wb3NdLCBzb3VyY2UsIG5yX2J5dGVzKTsKLSAgICBjb250cm9sbGVyLT5maWZvX3BvcyArPSBucl9ieXRlczsKLSAgfQotICBpZiAoY29udHJvbGxlci0+Zmlmb19wb3MgPT0gY29udHJvbGxlci0+Zmlmb19zaXplKSB7Ci0gICAgaWYgKGNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIgPiAwCi0JJiYgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZSAhPSBOVUxMKSB7Ci0gICAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQ6JWQgLSB3cml0aW5nICVkIGJ5dGUgYmxvY2sgYXQgMHgleFxuIiwKLQkJICAgY29udHJvbGxlci0+bnIsCi0JCSAgIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPm5yLAotCQkgICBjb250cm9sbGVyLT5maWZvX3NpemUsCi0JCSAgIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSkpOwotICAgICAgaWYgKGRldmljZV9pb193cml0ZV9idWZmZXIoY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+ZGV2aWNlLAotCQkJCSBjb250cm9sbGVyLT5maWZvLAotCQkJCSAwLCBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUsCi0JCQkJIGNvbnRyb2xsZXItPmZpZm9fc2l6ZSwKLQkJCQkgTlVMTCwgMCkKLQkgICE9IGNvbnRyb2xsZXItPmZpZm9fc2l6ZSkKLQlkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gZGlzayAlcyBpbyB3cml0ZSBlcnJvciIsCi0JCSAgICAgY29udHJvbGxlci0+bnIsCi0JCSAgICAgZGV2aWNlX3BhdGgoY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+ZGV2aWNlKSk7Ci0gICAgfQotICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIgLT0gMTsKLSAgICBjb250cm9sbGVyLT5maWZvX3BvcyA9IDA7Ci0gICAgY29udHJvbGxlci0+Y3VycmVudF9ieXRlICs9IGNvbnRyb2xsZXItPmZpZm9fc2l6ZTsKLSAgICBjb250cm9sbGVyLT5zdGF0ZSA9IGJ1c3lfbG9hZGVkX3N0YXRlOwotICAgIHNjaGVkdWxlX3JlYWR5X2V2ZW50KG1lLCBjb250cm9sbGVyKTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9maWZvKGRldmljZSAqbWUsCi0JICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsCi0JICAgaW50IGlzX3NpbXBsZSwKLQkgICBpbnQgaXNfd2l0aF9kaXNrLAotCSAgIGlvX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gIC8qIGZpbmQgdGhlIGRpc2sgKi8KLSAgaWYgKGlzX3dpdGhfZGlzaykgewotICAgIGludCBkcml2ZV9uciA9IChjb250cm9sbGVyLT5yZWdbaWRlX2RyaXZlX2hlYWRfcmVnXSAmIDB4MTApICE9IDA7Ci0gICAgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZSA9ICZjb250cm9sbGVyLT5kcml2ZVtkcml2ZV9ucl07Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZSA9IE5VTEw7Ci0gIH0KLQotICAvKiBudW1iZXIgb2YgdHJhbnNmZXJzICovCi0gIGlmIChpc19zaW1wbGUpCi0gICAgY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA9IDE7Ci0gIGVsc2UgewotICAgIGludCBzZWN0b3JfY291bnQgPSBjb250cm9sbGVyLT5yZWdbaWRlX3NlY3Rvcl9jb3VudF9yZWddOwotICAgIGlmIChzZWN0b3JfY291bnQgPT0gMCkKLSAgICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIgPSAyNTY7Ci0gICAgZWxzZQotICAgICAgY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA9IHNlY3Rvcl9jb3VudDsKLSAgfQotCi0gIC8qIHRoZSB0cmFuc2ZlciBzaXplICovCi0gIGlmIChjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlID09IE5VTEwpCi0gICAgY29udHJvbGxlci0+Zmlmb19zaXplID0gNTEyOwotICBlbHNlCi0gICAgY29udHJvbGxlci0+Zmlmb19zaXplID0gY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+Z2VvbWV0cnkuYnl0ZTsKLQotICAvKiBlbXB0eSB0aGUgZmlmbyAqLwotICBjb250cm9sbGVyLT5maWZvX3BvcyA9IDA7Ci0KLSAgLyogdGhlIHN0YXJ0aW5nIGFkZHJlc3MgKi8KLSAgaWYgKGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUgPT0gTlVMTCkKLSAgICBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUgPSAwOwotICBlbHNlIGlmIChjb250cm9sbGVyLT5yZWdbaWRlX2RyaXZlX2hlYWRfcmVnXSAmIDB4NDApIHsKLSAgICAvKiBMQkEgYWRkcmVzc2luZyBtb2RlICovCi0gICAgY29udHJvbGxlci0+Y3VycmVudF9ieXRlID0gY29udHJvbGxlci0+Zmlmb19zaXplCi0gICAgICAqICgoKGNvbnRyb2xsZXItPnJlZ1tpZGVfZHJpdmVfaGVhZF9yZWddICYgMHhmKSA8PCAyNCkKLQkgfCAoY29udHJvbGxlci0+cmVnW2lkZV9jeWxpbmRlcl9yZWcxXSA8PCAxNikKLQkgfCAoY29udHJvbGxlci0+cmVnW2lkZV9jeWxpbmRlcl9yZWcwXSA8PCA4KQotCSB8IChjb250cm9sbGVyLT5yZWdbaWRlX3NlY3Rvcl9udW1iZXJfcmVnXSkpOwotICB9Ci0gIGVsc2UgaWYgKGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPmdlb21ldHJ5LmhlYWQgIT0gMAotCSAgICYmIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPmdlb21ldHJ5LnNlY3RvciAhPSAwKSB7Ci0gICAgLyogQ0hTIGFkZHJlc3NpbmcgbW9kZSAqLwotICAgIGludCBoZWFkX25yID0gY29udHJvbGxlci0+cmVnW2lkZV9kcml2ZV9oZWFkX3JlZ10gJiAweGY7Ci0gICAgaW50IGN5bGluZGVyX25yID0gKChjb250cm9sbGVyLT5yZWdbaWRlX2N5bGluZGVyX3JlZzFdIDw8IDgpCi0JCSAgICB8IGNvbnRyb2xsZXItPnJlZ1tpZGVfY3lsaW5kZXJfcmVnMF0pOwotICAgIGludCBzZWN0b3JfbnIgPSBjb250cm9sbGVyLT5yZWdbaWRlX3NlY3Rvcl9udW1iZXJfcmVnXTsKLSAgICBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUgPSBjb250cm9sbGVyLT5maWZvX3NpemUKLSAgICAgICogKChjeWxpbmRlcl9uciAqIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPmdlb21ldHJ5LmhlYWQgKyBoZWFkX25yKQotCSAqIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPmdlb21ldHJ5LnNlY3RvciArIHNlY3Rvcl9uciAtIDEpOwotICB9Ci0gIGVsc2UKLSAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkOiVkIC0gQ0hTIGFkZHJlc3NpbmcgZGlzYWJsZWQiLAotCQkgY29udHJvbGxlci0+bnIsIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPm5yKTsKLSAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVsZDolbGQgLSB0cmFuc2ZlciAoJXMpICVsZCBibG9ja3Mgb2YgJWxkIGJ5dGVzIGZyb20gMHglbHhcbiIsCi0JICAgICAgIChsb25nKWNvbnRyb2xsZXItPm5yLAotCSAgICAgICBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlID09IE5VTEwgPyAtMUwgOiAobG9uZyljb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5uciwKLQkgICAgICAgZGlyZWN0aW9uID09IGlzX3JlYWQgPyAicmVhZCIgOiAid3JpdGUiLAotCSAgICAgICAobG9uZyljb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyLAotCSAgICAgICAobG9uZyljb250cm9sbGVyLT5maWZvX3NpemUsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSkpOwotICBzd2l0Y2ggKGRpcmVjdGlvbikgewotICBjYXNlIGlzX3JlYWQ6Ci0gICAgLyogZm9yY2UgYSBwcmltZWluZyByZWFkICovCi0gICAgY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciArPSAxOwotICAgIGNvbnRyb2xsZXItPnN0YXRlID0gZHJhaW5pbmdfc3RhdGU7IAotICAgIGNvbnRyb2xsZXItPmZpZm9fcG9zID0gY29udHJvbGxlci0+Zmlmb19zaXplOwotICAgIGRvX2ZpZm9fcmVhZChtZSwgY29udHJvbGxlciwgTlVMTCwgMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaXNfd3JpdGU6Ci0gICAgY29udHJvbGxlci0+c3RhdGUgPSBsb2FkaW5nX3N0YXRlOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX2NvbW1hbmQoZGV2aWNlICptZSwKLQkgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlciwKLQkgICBpbnQgY29tbWFuZCkKLXsKLSAgaWYgKGNvbnRyb2xsZXItPnN0YXRlICE9IGlkbGVfc3RhdGUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY29udHJvbGxlciAlZCAtIGNvbW1hbmQgd2hlbiBub3QgaWRsZSIsIGNvbnRyb2xsZXItPm5yKTsKLSAgc3dpdGNoIChjb21tYW5kKSB7Ci0gIGNhc2UgMHgyMDogY2FzZSAweDIxOiAvKiByZWFkLXNlY3RvcnMgKi8KLSAgICBzZXR1cF9maWZvKG1lLCBjb250cm9sbGVyLCAwLyppc19zaW1wbGUqLywgMS8qaXNfd2l0aF9kaXNrKi8sIGlzX3JlYWQpOwotICAgIGJyZWFrOwotICBjYXNlIDB4MzA6IGNhc2UgMHgzMTogLyogd3JpdGUgKi8KLSAgICBzZXR1cF9maWZvKG1lLCBjb250cm9sbGVyLCAwLyppc19zaW1wbGUqLywgMS8qaXNfd2l0aF9kaXNrKi8sIGlzX3dyaXRlKTsKLSAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQ4Ci1nZXRfc3RhdHVzKGRldmljZSAqbWUsCi0JICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCi17Ci0gIHN3aXRjaCAoY29udHJvbGxlci0+c3RhdGUpIHsKLSAgY2FzZSBsb2FkaW5nX3N0YXRlOgotICBjYXNlIGRyYWluaW5nX3N0YXRlOgotICAgIHJldHVybiAweDA4OyAvKiBkYXRhIHJlcSAqLwotICBjYXNlIGJ1c3lfbG9hZGVkX3N0YXRlOgotICBjYXNlIGJ1c3lfZHJhaW5lZF9zdGF0ZToKLSAgICByZXR1cm4gMHg4MDsgLyogYnVzeSAqLwotICBjYXNlIGlkbGVfc3RhdGU6Ci0gICAgcmV0dXJuIDB4NDA7IC8qIGRyaXZlIHJlYWR5ICovCi0gIGRlZmF1bHQ6Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJuYWwgZXJyb3IiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCSAgCi0KLS8qIFRoZSBhZGRyZXNzIHByZXNlbnRlZCB0byB0aGUgSURFIGNvbnRyb2xlciBpcyBkZWNvZGVkIGFuZCB0aGVuCi0gICBtYXBwZWQgb250byBhIGNvbnRyb2xsZXI6cmVnIHBhaXIgKi8KLQotZW51bSB7Ci0gIG5yX2FkZHJlc3NfYmxvY2tzID0gNiwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9hZGRyZXNzX2Jsb2NrIHsKLSAgaW50IHNwYWNlOwotICB1bnNpZ25lZF93b3JkIGJhc2VfYWRkcjsKLSAgdW5zaWduZWRfd29yZCBib3VuZF9hZGRyOwotICBpbnQgY29udHJvbGxlcjsKLSAgaW50IGJhc2VfcmVnOwotfSBhZGRyZXNzX2Jsb2NrOwotCi10eXBlZGVmIHN0cnVjdCBfYWRkcmVzc19kZWNvZGVyIHsKLSAgYWRkcmVzc19ibG9jayBibG9ja1tucl9hZGRyZXNzX2Jsb2Nrc107Ci19IGFkZHJlc3NfZGVjb2RlcjsKLQotc3RhdGljIHZvaWQKLWRlY29kZV9hZGRyZXNzKGRldmljZSAqbWUsCi0JICAgICAgIGFkZHJlc3NfZGVjb2RlciAqZGVjb2RlciwKLQkgICAgICAgaW50IHNwYWNlLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCi0JICAgICAgIGludCAqY29udHJvbGxlciwKLQkgICAgICAgaW50ICpyZWcsCi0JICAgICAgIGlvX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfYWRkcmVzc19ibG9ja3M7IGkrKykgewotICAgIGlmIChzcGFjZSA9PSBkZWNvZGVyLT5ibG9ja1tpXS5zcGFjZQotCSYmIGFkZHJlc3MgPj0gZGVjb2Rlci0+YmxvY2tbaV0uYmFzZV9hZGRyCi0JJiYgYWRkcmVzcyA8PSBkZWNvZGVyLT5ibG9ja1tpXS5ib3VuZF9hZGRyKSB7Ci0gICAgICAqY29udHJvbGxlciA9IGRlY29kZXItPmJsb2NrW2ldLmNvbnRyb2xsZXI7Ci0gICAgICAqcmVnID0gKGFkZHJlc3MKLQkgICAgICAtIGRlY29kZXItPmJsb2NrW2ldLmJhc2VfYWRkcgotCSAgICAgICsgZGVjb2Rlci0+YmxvY2tbaV0uYmFzZV9yZWcpOwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBpc193cml0ZSkgewotCXN3aXRjaCAoKnJlZykgewotCWNhc2UgaWRlX2Vycm9yX3JlZzogKnJlZyA9IGlkZV9mZWF0dXJlX3JlZzsgYnJlYWs7Ci0JY2FzZSBpZGVfc3RhdHVzX3JlZzogKnJlZyA9IGlkZV9jb21tYW5kX3JlZzsgYnJlYWs7Ci0JY2FzZSBpZGVfYWx0ZXJuYXRlX3N0YXR1c19yZWc6ICpyZWcgPSBpZGVfY29udHJvbF9yZWc7IGJyZWFrOwotCWRlZmF1bHQ6IGJyZWFrOwotCX0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZGV2aWNlX2Vycm9yKG1lLCAiYWRkcmVzcyAlZDoweCVseCBpbnZhbGlkIiwKLQkgICAgICAgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9hZGRyZXNzX2RlY29kZXIoZGV2aWNlICptZSwKLQkJICAgICAgYWRkcmVzc19kZWNvZGVyICpkZWNvZGVyKQotewotICBpbnQgcmVnOwotICBmb3IgKHJlZyA9IDE7IHJlZyA8IDY7IHJlZysrKSB7Ci0gICAgcmVnX3Byb3BlcnR5X3NwZWMgdW5pdDsKLSAgICBpbnQgc3BhY2U7Ci0gICAgdW5zaWduZWRfd29yZCBhZGRyZXNzOwotICAgIHVuc2lnbmVkIHNpemU7Ci0gICAgLyogZmluZCBhbmQgZGVjb2RlIHRoZSByZWcgcHJvcGVydHkgKi8KLSAgICBpZiAoIWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZywgJnVuaXQpKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibWlzc2luZyBvciBpbnZhbGlkIHJlZyBlbnRyeSAlZCIsIHJlZyk7Ci0gICAgZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZ1bml0LmFkZHJlc3MsCi0JCQkJICAgICAmc3BhY2UsICZhZGRyZXNzLCBtZSk7Ci0gICAgZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlX3BhcmVudChtZSksICZ1bml0LnNpemUsICZzaXplLCBtZSk7Ci0gICAgLyogaW5zZXJ0IGl0IGludG8gdGhlIGFkZHJlc3MgZGVjb2RlciAqLwotICAgIHN3aXRjaCAocmVnKSB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICAgIC8qIGNvbW1hbmQgcmVnaXN0ZXIgYmxvY2sgKi8KLSAgICAgIGlmIChzaXplICE9IDgpCi0JZGV2aWNlX2Vycm9yKG1lLCAicmVnIGVudHJ5ICVkIG11c3QgaGF2ZSBhIHNpemUgb2YgOCIsIHJlZyk7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UgPSBzcGFjZTsKLSAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX2FkZHIgPSBhZGRyZXNzOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIgPSBhZGRyZXNzICsgc2l6ZSAtIDE7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uY29udHJvbGxlciA9IChyZWcgKyAxKSAlIG5yX2lkZV9jb250cm9sbGVyczsKLSAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX3JlZyA9IGlkZV9kYXRhX3JlZzsKLSAgICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZCBjb21tYW5kIHJlZ2lzdGVyIGJsb2NrIGF0ICVkOjB4JWx4Li4weCVseFxuIiwKLQkJICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmNvbnRyb2xsZXIsCi0JCSAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5zcGFjZSwKLQkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfYWRkciwKLQkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgICAvKiBjb250cm9sIHJlZ2lzdGVyIGJsb2NrICovCi0gICAgICBpZiAoc2l6ZSAhPSAxKQotCWRldmljZV9lcnJvcihtZSwgInJlZyBlbnRyeSAlZCBtdXN0IGhhdmUgYSBzaXplIG9mIDEiLCByZWcpOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLnNwYWNlID0gc3BhY2U7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uYmFzZV9hZGRyID0gYWRkcmVzczsKLSAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5ib3VuZF9hZGRyID0gYWRkcmVzcyArIHNpemUgLSAxOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmNvbnRyb2xsZXIgPSAocmVnICsgMSkgJSBucl9pZGVfY29udHJvbGxlcnM7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uYmFzZV9yZWcgPSBpZGVfYWx0ZXJuYXRlX3N0YXR1c19yZWc7Ci0gICAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQgY29udHJvbCByZWdpc3RlciBibG9jayBhdCAlZDoweCVseC4uMHglbHhcbiIsCi0JCSAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5jb250cm9sbGVyLAotCQkgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX2FkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRlY29kZXItPmJsb2NrW3JlZy0xXS5ib3VuZF9hZGRyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAvKiBkbWEgcmVnaXN0ZXIgYmxvY2sgKi8KLSAgICAgIGlmIChzaXplICE9IDgpCi0JZGV2aWNlX2Vycm9yKG1lLCAicmVnIGVudHJ5ICVkIG11c3QgaGF2ZSBhIHNpemUgb2YgOCIsIHJlZyk7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UgPSBzcGFjZTsKLSAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX2FkZHIgPSBhZGRyZXNzOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIgPSBhZGRyZXNzICsgNCAtIDE7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uYmFzZV9yZWcgPSBpZGVfZG1hX2NvbW1hbmRfcmVnOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmNvbnRyb2xsZXIgPSAwOwotICAgICAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVkIGRtYSByZWdpc3RlciBibG9jayBhdCAlZDoweCVseC4uMHglbHhcbiIsCi0JCSAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5jb250cm9sbGVyLAotCQkgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX2FkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRlY29kZXItPmJsb2NrW3JlZy0xXS5ib3VuZF9hZGRyKSk7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWddLnNwYWNlID0gc3BhY2U7Ci0gICAgICBkZWNvZGVyLT5ibG9ja1tyZWddLmJhc2VfYWRkciA9IGFkZHJlc3MgKyA0OwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnXS5ib3VuZF9hZGRyID0gYWRkcmVzcyArIDggLSAxOwotICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnXS5jb250cm9sbGVyID0gMTsKLSAgICAgIGRlY29kZXItPmJsb2NrW3JlZ10uYmFzZV9yZWcgPSBpZGVfZG1hX2NvbW1hbmRfcmVnOwotICAgICAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVkIGRtYSByZWdpc3RlciBibG9jayBhdCAlZDoweCVseC4uMHglbHhcbiIsCi0JCSAgIGRlY29kZXItPmJsb2NrW3JlZ10uY29udHJvbGxlciwKLQkJICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLnNwYWNlLAotCQkgICAodW5zaWduZWQgbG9uZylkZWNvZGVyLT5ibG9ja1tyZWddLmJhc2VfYWRkciwKLQkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnXS5ib3VuZF9hZGRyKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQkJICAgICAgCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X2lkZV9kZXZpY2UgewotICBpZGVfY29udHJvbGxlciBjb250cm9sbGVyW25yX2lkZV9jb250cm9sbGVyc107Ci0gIGFkZHJlc3NfZGVjb2RlciBkZWNvZGVyOwotfSBod19pZGVfZGV2aWNlOwotCi0KLXN0YXRpYyB2b2lkCi1od19pZGVfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCi17Ci0gIGh3X2lkZV9kZXZpY2UgKmlkZSA9IGRldmljZV9kYXRhKG1lKTsKLSAgaW50IGNvbnRyb2xsZXI7Ci0gIGludCBkcml2ZTsKLSAKLSAgLyogemVybyBzb21lIHRoaW5ncyAqLwotICBmb3IgKGNvbnRyb2xsZXIgPSAwOyBjb250cm9sbGVyIDwgbnJfaWRlX2NvbnRyb2xsZXJzOyBjb250cm9sbGVyKyspIHsKLSAgICBtZW1zZXQoJmlkZS0+Y29udHJvbGxlcltjb250cm9sbGVyXSwgMCwgc2l6ZW9mKGlkZV9jb250cm9sbGVyKSk7Ci0gICAgZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgbnJfaWRlX2RyaXZlc19wZXJfY29udHJvbGxlcjsgZHJpdmUrKykgewotICAgICAgaWRlLT5jb250cm9sbGVyW2NvbnRyb2xsZXJdLmRyaXZlW2RyaXZlXS5uciA9IGRyaXZlOwotICAgIH0KLSAgICBpZGUtPmNvbnRyb2xsZXJbY29udHJvbGxlcl0ubWUgPSBtZTsKLSAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJyZWFkeS1kZWxheSIpICE9IE5VTEwpCi0gICAgICBpZGUtPmNvbnRyb2xsZXJbY29udHJvbGxlcl0ucmVhZHlfZGVsYXkgPQotCWRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFkeS1kZWxheSIpOwotICB9Ci0KLSAgLyogYXR0YWNoIHRoaXMgZGV2aWNlIHRvIGl0cyBwYXJlbnQgKi8KLSAgZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKG1lKTsKLQotICAvKiBkZXRlcm1pbmUgb3VyIG93biBhZGRyZXNzIG1hcCAqLwotICBidWlsZF9hZGRyZXNzX2RlY29kZXIobWUsICZpZGUtPmRlY29kZXIpOwotCi19Ci0KLQotc3RhdGljIHZvaWQKLWh3X2lkZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAotCQkgICAgICBhdHRhY2hfdHlwZSB0eXBlLAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKLQkJICAgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCi17Ci0gIGh3X2lkZV9kZXZpY2UgKmlkZSA9IChod19pZGVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGludCBjb250cm9sbGVyX25yID0gYWRkciAvIG5yX2lkZV9kcml2ZXNfcGVyX2NvbnRyb2xsZXI7Ci0gIGludCBkcml2ZV9uciA9IGFkZHIgJSBucl9pZGVfZHJpdmVzX3Blcl9jb250cm9sbGVyOwotICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlcjsKLSAgaWRlX2RyaXZlICpkcml2ZTsKLSAgaWYgKGNvbnRyb2xsZXJfbnIgPj0gbnJfaWRlX2NvbnRyb2xsZXJzKQotICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGNvbnRyb2xsZXIgZm9yIGRpc2sgJXMiLAotCQkgZGV2aWNlX3BhdGgoY2xpZW50KSk7Ci0KLSAgY29udHJvbGxlciA9ICZpZGUtPmNvbnRyb2xsZXJbY29udHJvbGxlcl9ucl07Ci0gIGRyaXZlID0gJmNvbnRyb2xsZXItPmRyaXZlW2RyaXZlX25yXTsKLSAgZHJpdmUtPmRldmljZSA9IGNsaWVudDsKLSAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KGNsaWVudCwgImlkZS1ieXRlLWNvdW50IikgIT0gTlVMTCkKLSAgICBkcml2ZS0+Z2VvbWV0cnkuYnl0ZSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkoY2xpZW50LCAiaWRlLWJ5dGUtY291bnQiKTsKLSAgZWxzZQotICAgIGRyaXZlLT5nZW9tZXRyeS5ieXRlID0gNTEyOwotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkoY2xpZW50LCAiaWRlLXNlY3Rvci1jb3VudCIpICE9IE5VTEwpCi0gICAgZHJpdmUtPmdlb21ldHJ5LnNlY3RvciA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkoY2xpZW50LCAiaWRlLXNlY3Rvci1jb3VudCIpOwotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkoY2xpZW50LCAiaWRlLWhlYWQtY291bnQiKSAhPSBOVUxMKQotICAgIGRyaXZlLT5nZW9tZXRyeS5oZWFkID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShjbGllbnQsICJpZGUtaGVhZC1jb3VudCIpOwotICBkcml2ZS0+ZGVmYXVsdF9nZW9tZXRyeSA9IGRyaXZlLT5nZW9tZXRyeTsKLSAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVkOiVkICVzIGJ5dGUtY291bnQgJWQsIHNlY3Rvci1jb3VudCAlZCwgaGVhZC1jb3VudCAlZFxuIiwKLQkgICAgICAgY29udHJvbGxlcl9uciwKLQkgICAgICAgZHJpdmUtPm5yLAotCSAgICAgICBkZXZpY2VfcGF0aChjbGllbnQpLAotCSAgICAgICBkcml2ZS0+Z2VvbWV0cnkuYnl0ZSwKLQkgICAgICAgZHJpdmUtPmdlb21ldHJ5LnNlY3RvciwKLQkgICAgICAgZHJpdmUtPmdlb21ldHJ5LmhlYWQpKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X2lkZV9pb19yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkgICAgICB2b2lkICpkZXN0LAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfaWRlX2RldmljZSAqaWRlID0gKGh3X2lkZV9kZXZpY2UgKilkZXZpY2VfZGF0YShtZSk7Ci0gIGludCBjb250cm9sX25yOwotICBpbnQgcmVnOwotICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlcjsKLQotICAvKiBmaW5kIHRoZSBpbnRlcmZhY2UgKi8KLSAgZGVjb2RlX2FkZHJlc3MobWUsICZpZGUtPmRlY29kZXIsIHNwYWNlLCBhZGRyLCAmY29udHJvbF9uciwgJnJlZywgaXNfcmVhZCk7Ci0gIGNvbnRyb2xsZXIgPSAmIGlkZS0+Y29udHJvbGxlcltjb250cm9sX25yXTsKLQotICAvKiBwcm9jZXNzIHRoZSB0cmFuc2ZlciAqLwotICBtZW1zZXQoZGVzdCwgMCwgbnJfYnl0ZXMpOwotICBzd2l0Y2ggKHJlZykgewotICBjYXNlIGlkZV9kYXRhX3JlZzoKLSAgICBkb19maWZvX3JlYWQobWUsIGNvbnRyb2xsZXIsIGRlc3QsIG5yX2J5dGVzKTsKLSAgICBicmVhazsKLSAgY2FzZSBpZGVfc3RhdHVzX3JlZzoKLSAgICAqKHVuc2lnbmVkOCopZGVzdCA9IGdldF9zdGF0dXMobWUsIGNvbnRyb2xsZXIpOwotICAgIGNsZWFyX2ludGVycnVwdChtZSwgY29udHJvbGxlcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaWRlX2FsdGVybmF0ZV9zdGF0dXNfcmVnOgotICAgICoodW5zaWduZWQ4KilkZXN0ID0gZ2V0X3N0YXR1cyhtZSwgY29udHJvbGxlcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaWRlX2Vycm9yX3JlZzoKLSAgY2FzZSBpZGVfc2VjdG9yX2NvdW50X3JlZzoKLSAgY2FzZSBpZGVfc2VjdG9yX251bWJlcl9yZWc6Ci0gIGNhc2UgaWRlX2N5bGluZGVyX3JlZzA6Ci0gIGNhc2UgaWRlX2N5bGluZGVyX3JlZzE6Ci0gIGNhc2UgaWRlX2RyaXZlX2hlYWRfcmVnOgotICBjYXNlIGlkZV9jb250cm9sX3JlZzoKLSAgY2FzZSBpZGVfZG1hX2NvbW1hbmRfcmVnOgotICBjYXNlIGlkZV9kbWFfc3RhdHVzX3JlZzoKLSAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzA6Ci0gIGNhc2UgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcxOgotICBjYXNlIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMjoKLSAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzM6Ci0gICAgKih1bnNpZ25lZDgqKWRlc3QgPSBjb250cm9sbGVyLT5yZWdbcmVnXTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJidXMtZXJyb3IgYXQgYWRkcmVzcyAweCVseCIsIGFkZHIpOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X2lkZV9pb193cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfaWRlX2RldmljZSAqaWRlID0gKGh3X2lkZV9kZXZpY2UgKilkZXZpY2VfZGF0YShtZSk7Ci0gIGludCBjb250cm9sX25yOwotICBpbnQgcmVnOwotICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlcjsKLQotICAvKiBmaW5kIHRoZSBpbnRlcmZhY2UgKi8KLSAgZGVjb2RlX2FkZHJlc3MobWUsICZpZGUtPmRlY29kZXIsIHNwYWNlLCBhZGRyLCAmY29udHJvbF9uciwgJnJlZywgaXNfd3JpdGUpOwotICBjb250cm9sbGVyID0gJmlkZS0+Y29udHJvbGxlcltjb250cm9sX25yXTsKLQotICAvKiBwcm9jZXNzIHRoZSBhY2Nlc3MgKi8KLSAgc3dpdGNoIChyZWcpIHsKLSAgY2FzZSBpZGVfZGF0YV9yZWc6Ci0gICAgZG9fZmlmb193cml0ZShtZSwgY29udHJvbGxlciwgc291cmNlLCBucl9ieXRlcyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaWRlX2NvbW1hbmRfcmVnOgotICAgIGRvX2NvbW1hbmQobWUsIGNvbnRyb2xsZXIsICoodW5zaWduZWQ4Kilzb3VyY2UpOwotICAgIGJyZWFrOwotICBjYXNlIGlkZV9jb250cm9sX3JlZzoKLSAgICBjb250cm9sbGVyLT5yZWdbcmVnXSA9ICoodW5zaWduZWQ4Kilzb3VyY2U7Ci0gICAgLyogcG9zc2libHkgY2FuY2VsIGludGVycnVwdHMgKi8KLSAgICBpZiAoKGNvbnRyb2xsZXItPnJlZ1tyZWddICYgMHgwMikgPT0gMHgwMikKLSAgICAgIGNsZWFyX2ludGVycnVwdChtZSwgY29udHJvbGxlcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaWRlX2ZlYXR1cmVfcmVnOgotICBjYXNlIGlkZV9zZWN0b3JfY291bnRfcmVnOgotICBjYXNlIGlkZV9zZWN0b3JfbnVtYmVyX3JlZzoKLSAgY2FzZSBpZGVfY3lsaW5kZXJfcmVnMDoKLSAgY2FzZSBpZGVfY3lsaW5kZXJfcmVnMToKLSAgY2FzZSBpZGVfZHJpdmVfaGVhZF9yZWc6Ci0gIGNhc2UgaWRlX2RtYV9jb21tYW5kX3JlZzoKLSAgY2FzZSBpZGVfZG1hX3N0YXR1c19yZWc6Ci0gIGNhc2UgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcwOgotICBjYXNlIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMToKLSAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzI6Ci0gIGNhc2UgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWczOgotICAgIGNvbnRyb2xsZXItPnJlZ1tyZWddID0gKih1bnNpZ25lZDgqKXNvdXJjZTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJidXMtZXJyb3IgYXQgMHglbHgiLCBhZGRyKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yIGh3X2lkZV9pbnRlcnJ1cHRfcG9ydHNbXSA9IHsKLSAgeyAiYSIsIDAsIDAgfSwKLSAgeyAiYiIsIDEsIDAgfSwKLSAgeyAiYyIsIDIsIDAgfSwKLSAgeyAiZCIsIDMsIDAgfSwKLSAgeyBOVUxMIH0KLX07Ci0KLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19pZGVfY2FsbGJhY2tzID0gewotICB7IGh3X2lkZV9pbml0X2FkZHJlc3MsIH0sCi0gIHsgaHdfaWRlX2F0dGFjaF9hZGRyZXNzLCB9LCAvKiBhdHRhY2ggKi8KLSAgeyBod19pZGVfaW9fcmVhZF9idWZmZXIsIGh3X2lkZV9pb193cml0ZV9idWZmZXIsIH0sCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgTlVMTCwgTlVMTCwgaHdfaWRlX2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBnZW5lcmljX2RldmljZV91bml0X2RlY29kZSwKLSAgICBnZW5lcmljX2RldmljZV91bml0X2VuY29kZSwKLSAgICBnZW5lcmljX2RldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzLAotICAgIGdlbmVyaWNfZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUgfSwKLX07Ci0KLQotc3RhdGljIHZvaWQgKgotaHdfaWRlX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAotCSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCi0JICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgaHdfaWRlX2RldmljZSAqaWRlID0gWkFMTE9DKGh3X2lkZV9kZXZpY2UpOwotICByZXR1cm4gaWRlOwotfQotCi0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X2lkZV9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJpZGUiLCBod19pZGVfY3JlYXRlLCAmaHdfaWRlX2NhbGxiYWNrcyB9LAotICB7IE5VTEwsIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX0lERV8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfaW5pdC5jIGIvc2ltL3BwYy9od19pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODZmNmYuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfSU5JVF9DXwotI2RlZmluZSBfSFdfSU5JVF9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHNpbS5oIgotCi0KLS8qIERNQSBhIGZpbGUgaW50byBtZW1vcnkgKi8KLXN0YXRpYyBpbnQKLWRtYV9maWxlKGRldmljZSAqbWUsCi0JIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkgdW5zaWduZWRfd29yZCBhZGRyKQotewotICBpbnQgY291bnQ7Ci0gIGludCBpbmM7Ci0gIEZJTEUgKmltYWdlOwotICBjaGFyIGJ1ZlsxMDI0XTsKLQotICAvKiBnZXQgaXQgb3BlbiAqLwotICBpbWFnZSA9IGZvcGVuKGZpbGVfbmFtZSwgInIiKTsKLSAgaWYgKGltYWdlID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIHJlYWQgaXQgaW4gc2xvd2x5ICovCi0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKDEpIHsKLSAgICBpbmMgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbWFnZSk7Ci0gICAgaWYgKGZlb2YoaW1hZ2UpIHx8IGZlcnJvcihpbWFnZSkpCi0gICAgICBicmVhazsKLSAgICBpZiAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCi0JCQkJYnVmLAotCQkJCTAgLyphZGRyZXNzLXNwYWNlKi8sCi0JCQkJYWRkcitjb3VudCwKLQkJCQlpbmMgLypuci1ieXRlcyovLAotCQkJCTEgLyp2aW9sYXRlIHJvKi8pICE9IGluYykgewotICAgICAgZmNsb3NlKGltYWdlKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY291bnQgKz0gaW5jOwotICB9Ci0KLSAgLyogY2xvc2UgZG93biBhZ2FpbiAqLwotICBmY2xvc2UoaW1hZ2UpOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotCi0vKiBERVZJQ0UKLQotICAgZmlsZSAtIGxvYWQgYSBmaWxlIGludG8gbWVtb3J5Ci0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIExvYWRzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgPGZpbGUtbmFtZT4gaW50byBtZW1vcnkgYXQgc3RhcnRpbmcgYXQKLSAgIDw8cmVhbC1hZGRyZXNzPj4uICBBc3N1bWVzIHRoYXQgbWVtb3J5IGV4aXN0cyBmb3IgdGhlIGxvYWQuCi0KLSAgIFBST1BFUlRJRVMKLQotICAgZmlsZS1uYW1lID0gPHN0cmluZz4KLQotICAgTmFtZSBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQgaW50byBtZW1vcnkKLQotICAgcmVhbC1hZGRyZXNzID0gPGludGVnZXI+Ci0KLSAgIFJlYWwgYWRkcmVzcyBhdCB3aGljaCB0aGUgZmlsZSBpcyB0byBiZSBsb2FkZWQgKi8KLQotc3RhdGljIHZvaWQKLWh3X2ZpbGVfaW5pdF9kYXRhX2NhbGxiYWNrKGRldmljZSAqbWUpCi17Ci0gIGludCBjb3VudDsKLSAgY29uc3QgY2hhciAqZmlsZV9uYW1lID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAiZmlsZS1uYW1lIik7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkciA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFsLWFkZHJlc3MiKTsKLSAgLyogbG9hZCB0aGUgZmlsZSAqLwotICBjb3VudCA9IGRtYV9maWxlKG1lLCBmaWxlX25hbWUsIGFkZHIpOwotICBpZiAoY291bnQgPCAwKQotICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gbG9hZGluZyBmaWxlICVzXG4iLCBmaWxlX25hbWUpOwotfQotCi0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2ZpbGVfY2FsbGJhY2tzID0gewotICB7IE5VTEwsIGh3X2ZpbGVfaW5pdF9kYXRhX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBOVUxMLCB9LCAvKiBJTyAqLwotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KLX07Ci0KLQotLyogREVWSUNFCi0KLQotICAgZGF0YSAtIGluaXRpYWxpemUgYSBtZW1vcnkgbG9jYXRpb24gd2l0aCBzcGVjaWZpZWQgZGF0YQotCi0KLSAgIERFU0NSSVBUSU9OCi0KLQotICAgVGhlIHBzZXVkbyBkZXZpY2UgPDxkYXRhPj4gcHJvdmlkZXMgYSBtZWNoYW5pc20gc3BlY2lmeWluZyB0aGUKLSAgIGluaXRpYWxpemF0aW9uIG9mIGEgc21hbGwgc2VjdGlvbiBvZiBtZW1vcnkuCi0KLSAgIE5vcm1hbGx5LCB0aGUgZGF0YSB3b3VsZCBiZSB3cml0dGVuIHVzaW5nIGEgZG1hIG9wZXJhdGlvbi4KLSAgIEhvd2V2ZXIsIGZvciBzb21lIGFkZHJlc3NlcyB0aGlzIHdpbGwgbm90IHJlc3VsdCBpbiB0aGUgZGVzaXJlZAotICAgcmVzdWx0LiAgRm9yIGluc3RhbmNlLCB0byBpbml0aWFsaXplIGFuIGFkZHJlc3MgaW4gYW4gZWVwcm9tLAotICAgaW5zdGVhZCBvZiBhIHNpbXBsZSBkbWEgb2YgdGhlIGRhdGEsIGEgc2VxdWVuY2Ugb2Ygd3JpdGVzIChhbmQgdGhlbgotICAgcmVhbCBkZWxheXMpIHRoYXQgcHJvZ3JhbSB0aGUgZWVwcm9tIHdvdWxkIGJlIHJlcXVpcmVkLgotCi0gICBGb3IgZG1hIHdyaXRlIGluaXRpYWxpemF0aW9uLCB0aGUgZGF0YSBkZXZpY2Ugd2lsbCB3cml0ZSB0aGUKLSAgIHNwZWNpZmllZCA8PGRhdGE+PiB0byA8PHJlYWwtYWRkcmVzcz4+IHVzaW5nIGEgbm9ybWFsIGRtYS4KLQotICAgRm9yIGluc3RhbmNlIHdyaXRlIGluaXRpYWxpemF0aW9uLCB0aGUgc3BlY2lmaWVkIDw8aW5zdGFuY2U+PiBpcwotICAgb3BlbmVkLiAgVGhlbiBhIHNlZWsgdG8gdGhlIDw8cmVhbC1hZGRyZXNzPj4gaXMgcGVyZm9ybWVkIGZvbGxvd2VkCi0gICBieSBhIHdyaXRlIG9mIHRoZSBkYXRhLgotCi0KLSAgIEludGVnZXIgcHJvcGVydGllcyBhcmUgc3RvcmVkIHVzaW5nIHRoZSB0YXJnZXQncyBlbmRpYW4gbW9kZS4KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgZGF0YSA9IDxhbnktdmFsaWQtcHJvcGVydHk+IChyZXF1aXJlZCkKLQotICAgRGF0YSB0byBiZSBsb2FkZWQgaW50byBtZW1vcnkuICBUaGUgcHJvcGVydHkgdHlwZSBkZXRlcm1pbmVzIGhvdyBpdAotICAgaXMgbG9hZGVkLgotCi0KLSAgIHJlYWwtYWRkcmVzcyA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCi0KLSAgIFN0YXJ0IGFkZHJlc3MgYXQgd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgc3RvcmVkLgotCi0KLSAgIGluc3RhbmNlID0gPHN0cmluZz4gKG9wdGlvbmFsKQotCi0gICBJbnN0YW5jZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBkZXZpY2UgdGhhdCBpcyB0byBiZSBvcGVuZWQgc28gdGhhdAotICAgdGhlIHNwZWNpZmllZCBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIGl0LgotCi0KLSAgIEVYQU1QTEVTCi0KLQotICAgVGhlIGV4YW1wbGVzIGJlbG93IGlsbHVzdHJhdGUgdGhlIHR3byBhbHRlcm5hdGl2ZSBtZWNoYW5pc21zIHRoYXQKLSAgIGNhbiBiZSB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZSAweDEyMzQ1Njc4IGF0IGFkZHJlc3MgMHhmZmYwMGMwMCwKLSAgIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIDUxMmsgc3lzdGVtIGVlcHJvbS4KLQotCi0gICBJZiB0aGUgZWVwcm9tIGlzIGJlaW5nIG1vZGVsZWQgYnkgcmFtICg8PG1lbW9yeT4+IGRldmljZSkgdGhlbiB0aGUKLSAgIHN0YW5kYXJkIGRtYSBpbml0aWFsaXphdGlvbiBjYW4gYmUgdXNlZC4gIEJ5IGNvbnZlbnRpb246IHRoZSBkYXRhCi0gICBkZXZpY2VzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGFyZ3VtZW50aW5nIHRoZW0gd2l0aCB0aGUKLSAgIGRlc3RpbmF0aW9ucyByZWFsIGFkZHJlc3M7IGFuZCBhbGwgZGF0YSBkZXZpY2VzIGFyZSBwdXQgdW5kZXIgdGhlCi0gICBub2RlIDw8L29wZW5wcm9tL2luaXQ+Pi4KLQotICAgfCAvb3BlbnByb20vbWVtb3J5QDB4ZmZmMDAwMDAvcmVnIDB4ZmZmMDAwMDAgMHg4MDAwMAotICAgfCAvb3BlbnByb20vaW5pdC9kYXRhQDB4MTAwMC9kYXRhIDB4MTIzNDU2NzgKLSAgIHwgL29wZW5wcm9tL2luaXQvZGF0YUAweDEwMDAvcmVhbC1hZGRyZXNzIDB4MTAwMAotCi0KLSAgIElmIGluc3RlYWQgYSByZWFsIGVlcHJvbSB3YXMgYmVpbmcgdXNlZCB0aGUgaW5zdGFuY2Ugd3JpdGUgbWV0aG9kCi0gICB3b3VsZCBpbnN0ZWFkIG5lZWQgdG8gYmUgdXNlZCAoc3RvcmluZyBqdXN0IGEgc2luZ2xlIGJ5dGUgaW4gYW4KLSAgIGVlcHJvbSByZXF1aXJlcyBhIGNvbXBsZXggc2VxdWVuY2Ugb2YgYWNjZXNzZXMpLiAgVGhlCi0gICA8PHJlYWwtYWRkcmVzcz4+IGlzIHNwZWNpZmllZCBhcyA8PDB4MGMwMD4+IHdoaWNoIGlzIHRoZSBvZmZzZXQKLSAgIGludG8gdGhlIGVlcHJvbS4gIEZvciBicmV2aXR5LCBtb3N0IG9mIHRoZSBlZXByb20gcHJvcGVydGllcyBoYXZlCi0gICBiZWVuIG9taXRlZC4KLQotICAgfCAvaW9idXMvZWVwcm9tQDB4ZmZmMDAwMDAvcmVnIDB4ZmZmMDAwMDAgMHg4MDAwMAotICAgfCAvb3BlbnByb20vaW5pdC9kYXRhQDB4ZmZmMDBjMDAvcmVhbC1hZGRyZXNzIDB4MGMwMAotICAgfCAvb3BlbnByb20vaW5pdC9kYXRhQDB4ZmZmMDBjMDAvZGF0YSAweDEyMzQ1NjY3Ci0gICB8IC9vcGVucHJvbS9pbml0L2RhdGFAMHhmZmYwMGMwMC9pbnN0YW5jZSAvaW9idXMvZWVwcm9tQDB4ZmZmMDAwMDAvcmVnCi0KLQotICAgQlVHUwotCi0KLSAgIEF0IHByZXNlbnQsIG9ubHkgPDxpbnRlZ2VyPj4gcHJvcGVydGllcyBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbgotICAgaW5pdGlhbCBkYXRhIHZhbHVlLgotCi0gICAqLwotCi0KLXN0YXRpYyB2b2lkCi1od19kYXRhX2luaXRfZGF0YV9jYWxsYmFjayhkZXZpY2UgKm1lKQotewotICB1bnNpZ25lZF93b3JkIGFkZHIgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAicmVhbC1hZGRyZXNzIik7Ci0gIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqZGF0YSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiZGF0YSIpOwotICBjb25zdCBjaGFyICppbnN0YW5jZV9zcGVjID0gKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiaW5zdGFuY2UiKSAhPSBOVUxMCi0JCQkgICAgICAgPyBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJpbnN0YW5jZSIpCi0JCQkgICAgICAgOiBOVUxMKTsKLSAgZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSA9IE5VTEw7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAibWlzc2luZyBwcm9wZXJ0eSA8ZGF0YT5cbiIpOwotICBpZiAoaW5zdGFuY2Vfc3BlYyAhPSBOVUxMKQotICAgIGluc3RhbmNlID0gdHJlZV9pbnN0YW5jZShtZSwgaW5zdGFuY2Vfc3BlYyk7Ci0gIHN3aXRjaCAoZGF0YS0+dHlwZSkgewotICBjYXNlIGludGVnZXJfcHJvcGVydHk6Ci0gICAgewotICAgICAgdW5zaWduZWRfY2VsbCBidWYgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiZGF0YSIpOwotICAgICAgSDJUKGJ1Zik7Ci0gICAgICBpZiAoaW5zdGFuY2UgPT0gTlVMTCkgewotCWlmIChkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKLQkJCQkgICAgJmJ1ZiwKLQkJCQkgICAgMCAvKmFkZHJlc3Mtc3BhY2UqLywKLQkJCQkgICAgYWRkciwKLQkJCQkgICAgc2l6ZW9mKGJ1ZiksIC8qbnItYnl0ZXMqLwotCQkJCSAgICAxIC8qdmlvbGF0ZSBybyovKSAhPSBzaXplb2YoYnVmKSkKLQkgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gc3RvcmluZyBpbnRlZ2VyIDB4JXggYXQgMHglbHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQpYnVmLCAodW5zaWduZWQgbG9uZylhZGRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWlmIChkZXZpY2VfaW5zdGFuY2Vfc2VlayhpbnN0YW5jZSwgMCwgYWRkcikgPCAwCi0JICAgIHx8IGRldmljZV9pbnN0YW5jZV93cml0ZShpbnN0YW5jZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpICE9IHNpemVvZihidWYpKQotCSAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBzdG9yaW5nIGludGVnZXIgMHgleCBhdCAweCVseCBvZiBpbnN0YW5jZSAlc1xuIiwKLQkJICAgICAgICh1bnNpZ25lZClidWYsICh1bnNpZ25lZCBsb25nKWFkZHIsIGluc3RhbmNlX3NwZWMpOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBkZXZpY2VfZXJyb3IobWUsICJXcml0ZSBvZiB0aGlzIGRhdGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGluc3RhbmNlICE9IE5VTEwpCi0gICAgZGV2aWNlX2luc3RhbmNlX2RlbGV0ZShpbnN0YW5jZSk7Ci19Ci0KLQotc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfZGF0YV9jYWxsYmFja3MgPSB7Ci0gIHsgTlVMTCwgaHdfZGF0YV9pbml0X2RhdGFfY2FsbGJhY2ssIH0sCi0gIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLwotICB7IE5VTEwsIH0sIC8qIElPICovCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgTlVMTCwgfSwgLyogdW5pdCAqLwotfTsKLQotCi0vKiBERVZJQ0UKLQotCi0gICBsb2FkLWJpbmFyeSAtIGxvYWQgYmluYXJ5IHNlZ21lbnRzIGludG8gbWVtb3J5Ci0KLQotICAgREVTQ1JJUFRJT04KLQotICAgRWFjaCBsb2FkYWJsZSBzZWdtZW50IG9mIHRoZSBzcGVjaWZpZWQgYmluYXJ5IGlzIGxvYWRlZCBpbnRvIG1lbW9yeQotICAgYXQgaXRzIHJlcXVpcmVkIGFkZHJlc3MuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG1lbW9yeSBhdCB0aG9zZQotICAgYWRkcmVzc2VzIGFscmVhZHkgZXhpc3RzLgotCi0gICBUaGlzIGRldmljZSBpcyBub3JtYWxseSB1c2VkIHRvIGxvYWQgYW4gZXhlY3V0YWJsZSBpbnRvIG1lbW9yeSBhcwotICAgcGFydCBvZiByZWFsIG1vZGUgc2ltdWxhdGlvbi4KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgZmlsZS1uYW1lID0gPHN0cmluZz4KLQotICAgTmFtZSBvZiB0aGUgYmluYXJ5IHRvIGJlIGxvYWRlZC4KLQotCi0gICBjbGFpbSA9IDxhbnl0aGluZz4gKG9wdGlvbmFsKQotCi0gICBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSByZWFsIG1lbW9yeSB0aGF0IGlzIHRvIGJlIHVzZWQgYnkKLSAgIHRoZSBpbWFnZSBiZWluZyBsb2FkZWQgd2lsbCBiZSBjbGFpbWVkIGZyb20gdGhlIG1lbW9yeSBub2RlCi0gICAoc3BlY2lmaWVkIGJ5IHRoZSBpaGFuZGxlIDw8L2Nob3Nlbi9tZW1vcnk+PikuCi0KLQotICAgQlVHUwotCi0gICAKLSAgIFdoZW4gbG9hZGluZyB0aGUgYmluYXJ5IHRoZSBiZmQgdmlydHVhbC1hZGRyZXNzIGlzIHVzZWQuICBJdCBzaG91bGQKLSAgIGJlIHVzaW5nIHRoZSBiZmQgbG9hZC1hZGRyZXNzLgotCi0gICAqLwotCi0vKiBERVZJQ0UKLQotICAgbWFwLWJpbmFyeSAtIG1hcCB0aGUgYmluYXJ5IGludG8gdGhlIHVzZXJzIGFkZHJlc3Mgc3BhY2UKLQotICAgREVTQ1JJUFRJT04KLSAgIAotICAgU2ltaWxhciB0byBsb2FkLWJpbmFyeSBleGNlcHQgdGhhdCBtZW1vcnkgZm9yIGVhY2ggc2VnbWVudCBpcwotICAgY3JlYXRlZCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBmb3IgdGhlIHNlZ21lbnQgaXMgbG9hZGVkLgotCi0gICBUaGlzIGRldmljZSBpcyBub3JtYWxseSB1c2VkIHRvIGxvYWQgYW4gZXhlY3V0YWJsZSBpbnRvIGEgdXNlciBtb2RlCi0gICBzaW11bGF0aW9uLgotCi0gICBQUk9QRVJUSUVTCi0KLSAgIGZpbGUtbmFtZSA9IDxzdHJpbmc+Ci0KLSAgIE5hbWUgb2YgdGhlIGJpbmFyeSB0byBiZSBsb2FkZWQuCi0KLSAgICovCi0KLXN0YXRpYyB2b2lkCi11cGRhdGVfZm9yX2JpbmFyeV9zZWN0aW9uKGJmZCAqYWJmZCwKLQkJCSAgYXNlY3Rpb24gKnRoZV9zZWN0aW9uLAotCQkJICBQVFIgb2JqKQotewotICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fdm1hOwotICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fc2l6ZTsKLSAgYWNjZXNzX3R5cGUgYWNjZXNzOwotICBkZXZpY2UgKm1lID0gKGRldmljZSopb2JqOwotCi0gIC8qIHNraXAgdGhlIHNlY3Rpb24gaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlICovCi0gIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgdGhlX3NlY3Rpb24pICYgU0VDX0FMTE9DKSkKLSAgICByZXR1cm47Ci0KLSAgLyogY2hlY2svaWdub3JlIGFueSBzZWN0aW9ucyBvZiBzaXplIHplcm8gKi8KLSAgc2VjdGlvbl9zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHRoZV9zZWN0aW9uKTsKLSAgaWYgKHNlY3Rpb25fc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBmaW5kIHdoZXJlIGl0IGlzIHRvIGdvICovCi0gIHNlY3Rpb25fdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYShhYmZkLCB0aGVfc2VjdGlvbik7Ci0KLSAgRFRSQUNFKGJpbmFyeSwKLQkgKCJuYW1lPSUtN3MsIHZtYT0weCUuOGx4LCBzaXplPSU2bGQsIGZsYWdzPSUzbHgoJXMlcyVzJXMlcyApXG4iLAotCSAgYmZkX2dldF9zZWN0aW9uX25hbWUoYWJmZCwgdGhlX3NlY3Rpb24pLAotCSAgKGxvbmcpc2VjdGlvbl92bWEsCi0JICAobG9uZylzZWN0aW9uX3NpemUsCi0JICAobG9uZyliZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgdGhlX3NlY3Rpb24pLAotCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19MT0FEID8gIiBMT0FEIiA6ICIiLAotCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19DT0RFID8gIiBDT0RFIiA6ICIiLAotCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19EQVRBID8gIiBEQVRBIiA6ICIiLAotCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19BTExPQyA/ICIgQUxMT0MiIDogIiIsCi0JICBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgdGhlX3NlY3Rpb24pICYgU0VDX1JFQURPTkxZID8gIiBSRUFET05MWSIgOiAiIgotCSAgKSk7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYW4gLmludGVycCBzZWN0aW9uLCBpdCBtZWFucyBpdCBuZWVkcyBhIHNoYXJlZCBsaWJyYXJ5IGludGVycHJldGVyLiAgKi8KLSAgaWYgKHN0cmNtcCgiLmludGVycCIsIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGFiZmQsIHRoZV9zZWN0aW9uKSkgPT0gMCkKLSAgICBlcnJvcigiU2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4iKTsKLQotICAvKiBkZXRlcm1pbmUgdGhlIGRldmljZXMgYWNjZXNzICovCi0gIGFjY2VzcyA9IGFjY2Vzc19yZWFkOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19DT0RFKQotICAgIGFjY2VzcyB8PSBhY2Nlc3NfZXhlYzsKLSAgaWYgKCEoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19SRUFET05MWSkpCi0gICAgYWNjZXNzIHw9IGFjY2Vzc193cml0ZTsKLQotICAvKiBpZiBjbGFpbSBzcGVjaWZpZWQsIGFsbG9jYXRlIHJlZ2lvbiBmcm9tIHRoZSBtZW1vcnkgZGV2aWNlICovCi0gIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImNsYWltIikgIT0gTlVMTCkgewotICAgIGRldmljZV9pbnN0YW5jZSAqbWVtb3J5ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkobWUsICIvY2hvc2VuL21lbW9yeSIpOwotICAgIHVuc2lnbmVkX2NlbGwgbWVtX2luWzNdOwotICAgIHVuc2lnbmVkX2NlbGwgbWVtX291dFsxXTsKLSAgICBtZW1faW5bMF0gPSAwOyAvKmFsaWdubWVudCAtIHRvcC1vZi1zdGFjayovCi0gICAgbWVtX2luWzFdID0gc2VjdGlvbl9zaXplOwotICAgIG1lbV9pblsyXSA9IHNlY3Rpb25fdm1hOwotICAgIGlmIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QobWVtb3J5LCAiY2xhaW0iLCAzLCBtZW1faW4sIDEsIG1lbV9vdXQpIDwgMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImZhaWxlZCB0byBjbGFpbSBtZW1vcnkgZm9yIHNlY3Rpb24gYXQgMHglbHggKDB4JWx4IiwKLQkJICAgc2VjdGlvbl92bWEsCi0JCSAgIHNlY3Rpb25fc2l6ZSk7Ci0gICAgaWYgKG1lbV9vdXRbMF0gIT0gc2VjdGlvbl92bWEpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJzZWN0aW9uIGFkZHJlc3Mgbm90IGFzIHJlcXVlc3RlZCIpOwotICB9Ci0KLSAgLyogaWYgYSBtYXAsIHBhc3MgdXAgYSByZXF1ZXN0IHRvIGNyZWF0ZSB0aGUgbWVtb3J5IGluIGNvcmUgKi8KLSAgaWYgKHN0cm5jbXAoZGV2aWNlX25hbWUobWUpLCAibWFwLWJpbmFyeSIsIHN0cmxlbigibWFwLWJpbmFyeSIpKSA9PSAwKQotICAgIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKLQkJCSAgYXR0YWNoX3Jhd19tZW1vcnksCi0JCQkgIDAgLyphZGRyZXNzIHNwYWNlKi8sCi0JCQkgIHNlY3Rpb25fdm1hLAotCQkJICBzZWN0aW9uX3NpemUsCi0JCQkgIGFjY2VzcywKLQkJCSAgbWUpOwotCi0gIC8qIGlmIGEgbG9hZCBkbWEgaW4gdGhlIHJlcXVpcmVkIGRhdGEgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfTE9BRCkgewotICAgIHZvaWQgKnNlY3Rpb25faW5pdCA9IHphbGxvYyhzZWN0aW9uX3NpemUpOwotICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGFiZmQsCi0JCQkJICB0aGVfc2VjdGlvbiwKLQkJCQkgIHNlY3Rpb25faW5pdCwgMCwKLQkJCQkgIHNlY3Rpb25fc2l6ZSkpIHsKLSAgICAgIGJmZF9wZXJyb3IoImJpbmFyeSIpOwotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibG9hZCBvZiBkYXRhIGZhaWxlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCi0JCQkJc2VjdGlvbl9pbml0LAotCQkJCTAgLypzcGFjZSovLAotCQkJCXNlY3Rpb25fdm1hLAotCQkJCXNlY3Rpb25fc2l6ZSwKLQkJCQkxIC8qdmlvbGF0ZV9yZWFkX29ubHkqLykKLQkhPSBzZWN0aW9uX3NpemUpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJicm9rZW4gdHJhbnNmZXJcbiIpOwotICAgIHpmcmVlKHNlY3Rpb25faW5pdCk7IC8qIG9ubHkgZnJlZSBpZiBsb2FkICovCi0gIH0KLX0KLQotc3RhdGljIHZvaWQKLWh3X2JpbmFyeV9pbml0X2RhdGFfY2FsbGJhY2soZGV2aWNlICptZSkKLXsKLSAgLyogZ2V0IHRoZSBmaWxlIG5hbWUgKi8KLSAgY29uc3QgY2hhciAqZmlsZV9uYW1lID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAiZmlsZS1uYW1lIik7Ci0gIGJmZCAqaW1hZ2U7Ci0KLSAgLyogb3BlbiB0aGUgZmlsZSAqLwotICBpbWFnZSA9IGJmZF9vcGVucihmaWxlX25hbWUsIE5VTEwpOwotICBpZiAoaW1hZ2UgPT0gTlVMTCkgewotICAgIGJmZF9wZXJyb3IoImJpbmFyeSIpOwotICAgIGRldmljZV9lcnJvcihtZSwgIkZhaWxlZCB0byBvcGVuIGZpbGUgJXNcbiIsIGZpbGVfbmFtZSk7Ci0gIH0KLQotICAvKiBjaGVjayBpdCBpcyB2YWxpZCAqLwotICBpZiAoIWJmZF9jaGVja19mb3JtYXQoaW1hZ2UsIGJmZF9vYmplY3QpKSB7Ci0gICAgYmZkX2Nsb3NlKGltYWdlKTsKLSAgICBkZXZpY2VfZXJyb3IobWUsICJUaGUgZmlsZSAlcyBoYXMgYW4gaW52YWxpZCBiaW5hcnkgZm9ybWF0XG4iLCBmaWxlX25hbWUpOwotICB9Ci0KLSAgLyogYW5kIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyhpbWFnZSwKLQkJCXVwZGF0ZV9mb3JfYmluYXJ5X3NlY3Rpb24sCi0JCQkoUFRSKW1lKTsKLQotICBiZmRfY2xvc2UoaW1hZ2UpOwotfQotCi0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2JpbmFyeV9jYWxsYmFja3MgPSB7Ci0gIHsgTlVMTCwgaHdfYmluYXJ5X2luaXRfZGF0YV9jYWxsYmFjaywgfSwKLSAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCi0gIHsgTlVMTCwgfSwgLyogSU8gKi8KLSAgeyBOVUxMLCB9LCAvKiBETUEgKi8KLSAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBOVUxMLCB9LCAvKiB1bml0ICovCi19OwotCi0KLS8qIERFVklDRQotCi0gICBzdGFjayAtIGNyZWF0ZSBhbiBpbml0aWFsIHN0YWNrIGZyYW1lIGluIG1lbW9yeQotCi0gICBERVNDUklQVElPTgotCi0gICBDcmVhdGVzIGEgc3RhY2sgZnJhbWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGluIG1lbW9yeS4KLQotICAgRHVlIHRvIHRoZSBzdGFydHVwIHNlcXVlbmNlIGdkYiB1c2VzIHdoZW4gY29tbWVuY2luZyBhIHNpbXVsYXRpb24sCi0gICBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBkYXRhIHRvIGJlIHBsYWNlZCBvbiB0aGUgc3RhY2sgdG8gYmUKLSAgIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBkZXZpY2UgdHJlZS4gIEluc3RlYWQgdGhlIGFyZ3VtZW50cyB0byBiZQotICAgcHVzaGVkIG9udG8gdGhlIHN0YWNrIGFyZSBzcGVjaWZpZWQgdXNpbmcgYW4gSU9DVEwgY2FsbC4KLQotICAgVGhlIElPQ1RMIHRha2VzIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50czoKLQotICAgfCB1bnNpZ25lZF93b3JkIHN0YWNrX2VuZCAtLSB3aGVyZSB0aGUgc3RhY2sgc2hvdWxkIGNvbWUgZG93biBmcm9tCi0gICB8IGNoYXIgKiphcmd2IC0tIC4uLgotICAgfCBjaGFyICoqZW52cCAtLSAuLi4KLQotICAgUFJPUEVSVElFUwotCi0gICBzdGFjay10eXBlID0gPHN0cmluZz4KLQotICAgVGhlIGZvcm0gb2YgdGhlIHN0YWNrIGZyYW1lIHRoYXQgaXMgdG8gYmUgY3JlYXRlZC4KLQotICAgKi8KLQotc3RhdGljIGludAotc2l6ZW9mX2FyZ3VtZW50X3N0cmluZ3MoY2hhciAqKmFyZykKLXsKLSAgaW50IHNpemVvZl9zdHJpbmdzID0gMDsKLQotICAvKiByb2J1c3QgKi8KLSAgaWYgKGFyZyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIGFkZCB1cCBhbGwgdGhlIHN0cmluZyBzaXplcyAocGFkZGluZyBhcyB3ZSBnbykgKi8KLSAgZm9yICg7ICphcmcgIT0gTlVMTDsgYXJnKyspIHsKLSAgICBpbnQgbGVuID0gc3RybGVuKCphcmcpICsgMTsKLSAgICBzaXplb2Zfc3RyaW5ncyArPSBBTElHTl84KGxlbik7Ci0gIH0KLQotICByZXR1cm4gc2l6ZW9mX3N0cmluZ3M7Ci19Ci0KLXN0YXRpYyBpbnQKLW51bWJlcl9vZl9hcmd1bWVudHMoY2hhciAqKmFyZykKLXsKLSAgaW50IG5yOwotICBpZiAoYXJnID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGZvciAobnIgPSAwOyAqYXJnICE9IE5VTEw7IGFyZysrLCBucisrKTsKLSAgcmV0dXJuIG5yOwotfQotCi1zdGF0aWMgaW50Ci1zaXplb2ZfYXJndW1lbnRzKGNoYXIgKiphcmcpCi17Ci0gIHJldHVybiBBTElHTl84KChudW1iZXJfb2ZfYXJndW1lbnRzKGFyZykgKyAxKSAqIHNpemVvZih1bnNpZ25lZF93b3JkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9zdGFja19hcmd1bWVudHMoZGV2aWNlICptZSwKLQkJICAgICAgY2hhciAqKmFyZywKLQkJICAgICAgdW5zaWduZWRfd29yZCBzdGFydF9ibG9jaywKLQkJICAgICAgdW5zaWduZWRfd29yZCBlbmRfYmxvY2ssCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgc3RhcnRfYXJnLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGVuZF9hcmcpCi17Ci0gIERUUkFDRShzdGFjaywKLQkoIndyaXRlX3N0YWNrX2FyZ3VtZW50cyhkZXZpY2U9JXMsIGFyZz0weCVseCwgc3RhcnRfYmxvY2s9MHglbHgsIGVuZF9ibG9jaz0weCVseCwgc3RhcnRfYXJnPTB4JWx4LCBlbmRfYXJnPTB4JWx4KVxuIiwKLQkgZGV2aWNlX25hbWUobWUpLCAobG9uZylhcmcsIChsb25nKXN0YXJ0X2Jsb2NrLCAobG9uZyllbmRfYmxvY2ssIChsb25nKXN0YXJ0X2FyZywgKGxvbmcpZW5kX2FyZykpOwotICBpZiAoYXJnID09IE5VTEwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiQXR0ZW1wdCB0byB3cml0ZSBhIG51bGwgYXJyYXkgb250byB0aGUgc3RhY2tcbiIpOwotICAvKiBvbmx5IGNvcHkgaW4gYXJndW1lbnRzLCBtZW1vcnkgaXMgYWxyZWFkeSB6ZXJvICovCi0gIGZvciAoOyAqYXJnICE9IE5VTEw7IGFyZysrKSB7Ci0gICAgaW50IGxlbiA9IHN0cmxlbigqYXJnKSsxOwotICAgIHVuc2lnbmVkX3dvcmQgdGFyZ2V0X3N0YXJ0X2Jsb2NrOwotICAgIERUUkFDRShzdGFjaywKLQkgICgid3JpdGVfc3RhY2tfYXJndW1lbnRzKCkgd3JpdGUgJXM9JXMgYXQgJXM9MHglbHggJXM9MHglbHggJXM9MHglbHhcbiIsCi0JICAgIioqYXJnIiwgKmFyZywgInN0YXJ0X2Jsb2NrIiwgKGxvbmcpc3RhcnRfYmxvY2ssCi0JICAgImxlbiIsIChsb25nKWxlbiwgInN0YXJ0X2FyZyIsIChsb25nKXN0YXJ0X2FyZykpOwotICAgIGlmIChwc2ltX3dyaXRlX21lbW9yeShkZXZpY2Vfc3lzdGVtKG1lKSwgMCwgKmFyZywKLQkJCSAgc3RhcnRfYmxvY2ssIGxlbiwKLQkJCSAgMC8qdmlvbGF0ZV9yZWFkb25seSovKSAhPSBsZW4pCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJXcml0ZSBvZiAqKmFyZyAoJXMpIGF0IDB4JWx4IG9mIHN0YWNrIGZhaWxlZFxuIiwKLQkJICAgKmFyZywgKHVuc2lnbmVkIGxvbmcpc3RhcnRfYmxvY2spOwotICAgIHRhcmdldF9zdGFydF9ibG9jayA9IEgyVF93b3JkKHN0YXJ0X2Jsb2NrKTsKLSAgICBpZiAocHNpbV93cml0ZV9tZW1vcnkoZGV2aWNlX3N5c3RlbShtZSksIDAsICZ0YXJnZXRfc3RhcnRfYmxvY2ssCi0JCQkgIHN0YXJ0X2FyZywgc2l6ZW9mKHRhcmdldF9zdGFydF9ibG9jayksCi0JCQkgIDApICE9IHNpemVvZih0YXJnZXRfc3RhcnRfYmxvY2spKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiV3JpdGUgb2YgKmFyZyBvbnRvIHN0YWNrIGZhaWxlZFxuIik7Ci0gICAgc3RhcnRfYmxvY2sgKz0gQUxJR05fOChsZW4pOwotICAgIHN0YXJ0X2FyZyArPSBzaXplb2Yoc3RhcnRfYmxvY2spOwotICB9Ci0gIHN0YXJ0X2FyZyArPSBzaXplb2Yoc3RhcnRfYmxvY2spOyAvKnRoZSBudWxsIGF0IHRoZSBlbmQqLwotICBpZiAoc3RhcnRfYmxvY2sgIT0gZW5kX2Jsb2NrCi0gICAgICB8fCBBTElHTl84KHN0YXJ0X2FyZykgIT0gZW5kX2FyZykKLSAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9iYWJsZSBjb3JycHV0aW9uIG9mIHN0YWNrIGFyZ3VtZW50c1xuIik7Ci0gIERUUkFDRShzdGFjaywgKCJ3cml0ZV9zdGFja19hcmd1bWVudHMoKSA9IHZvaWRcbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9wcGNfZWxmX3N0YWNrX2ZyYW1lKGRldmljZSAqbWUsCi0JCQkgICB1bnNpZ25lZF93b3JkIGJvdHRvbV9vZl9zdGFjaywKLQkJCSAgIGNoYXIgKiphcmd2LAotCQkJICAgY2hhciAqKmVudnApCi17Ci0gIC8qIGZpeG1lIC0gdGhpcyBpcyBvdmVyIGFsaWduZWQgKi8KLQotICAvKiBpbmZvcm1hdGlvbiBibG9jayAqLwotICBjb25zdCB1bnNpZ25lZCBzaXplb2ZfZW52cF9ibG9jayA9IHNpemVvZl9hcmd1bWVudF9zdHJpbmdzKGVudnApOwotICBjb25zdCB1bnNpZ25lZF93b3JkIHN0YXJ0X2VudnBfYmxvY2sgPSBib3R0b21fb2Zfc3RhY2sgLSBzaXplb2ZfZW52cF9ibG9jazsKLSAgY29uc3QgdW5zaWduZWQgc2l6ZW9mX2FyZ3ZfYmxvY2sgPSBzaXplb2ZfYXJndW1lbnRfc3RyaW5ncyhhcmd2KTsKLSAgY29uc3QgdW5zaWduZWRfd29yZCBzdGFydF9hcmd2X2Jsb2NrID0gc3RhcnRfZW52cF9ibG9jayAtIHNpemVvZl9hcmd2X2Jsb2NrOwotCi0gIC8qIGF1eGlsaWFyeSB2ZWN0b3IgLSBjb250YWlucyBvbmx5IG9uZSBlbnRyeSAqLwotICBjb25zdCB1bnNpZ25lZCBzaXplb2ZfYXV4X2VudHJ5ID0gMipzaXplb2YodW5zaWduZWRfd29yZCk7IC8qIG1hZ2ljICovCi0gIGNvbnN0IHVuc2lnbmVkX3dvcmQgc3RhcnRfYXV4ID0gc3RhcnRfYXJndl9ibG9jayAtIEFMSUdOXzgoc2l6ZW9mX2F1eF9lbnRyeSk7Ci0KLSAgLyogZW52aXJvbm1lbnQgcG9pbnRzIChpbmNsdWRpbmcgbnVsbCBzZW50aW5hbCkgKi8KLSAgY29uc3QgdW5zaWduZWQgc2l6ZW9mX2VudnAgPSBzaXplb2ZfYXJndW1lbnRzKGVudnApOwotICBjb25zdCB1bnNpZ25lZF93b3JkIHN0YXJ0X2VudnAgPSBzdGFydF9hdXggLSBzaXplb2ZfZW52cDsKLQotICAvKiBhcmd1bWVudCBwb2ludGVycyAoaW5jbHVkaW5nIG51bGwgc2VudGluYWwpICovCi0gIGNvbnN0IGludCBhcmdjID0gbnVtYmVyX29mX2FyZ3VtZW50cyhhcmd2KTsKLSAgY29uc3QgdW5zaWduZWQgc2l6ZW9mX2FyZ3YgPSBzaXplb2ZfYXJndW1lbnRzKGFyZ3YpOwotICBjb25zdCB1bnNpZ25lZF93b3JkIHN0YXJ0X2FyZ3YgPSBzdGFydF9lbnZwIC0gc2l6ZW9mX2FyZ3Y7Ci0KLSAgLyogbGluayByZWdpc3RlciBzYXZlIGFkZHJlc3MgLSBhbGxpZ25lZCB0byBhIDE2Ynl0ZSBib3VuZGFyeSAqLwotICBjb25zdCB1bnNpZ25lZF93b3JkIHRvcF9vZl9zdGFjayA9ICgoc3RhcnRfYXJndgotCQkJCSAgICAgICAtIDIgKiBzaXplb2YodW5zaWduZWRfd29yZCkpCi0JCQkJICAgICAgJiB+MHhmKTsKLQotICAvKiBpbnN0YWxsIGFyZ3VtZW50cyBvbiBzdGFjayAqLwotICB3cml0ZV9zdGFja19hcmd1bWVudHMobWUsIGVudnAsCi0JCQlzdGFydF9lbnZwX2Jsb2NrLCBib3R0b21fb2Zfc3RhY2ssCi0JCQlzdGFydF9lbnZwLCBzdGFydF9hdXgpOwotICB3cml0ZV9zdGFja19hcmd1bWVudHMobWUsIGFyZ3YsCi0JCQlzdGFydF9hcmd2X2Jsb2NrLCBzdGFydF9lbnZwX2Jsb2NrLAotCQkJc3RhcnRfYXJndiwgc3RhcnRfZW52cCk7Ci0KLSAgLyogc2V0IHVwIHRoZSByZWdpc3RlcnMgKi8KLSAgcHNpbV93cml0ZV9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgLTEsCi0JCSAgICAgICZ0b3Bfb2Zfc3RhY2ssICJzcCIsIGNvb2tlZF90cmFuc2Zlcik7Ci0gIHBzaW1fd3JpdGVfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIC0xLAotCQkgICAgICAmYXJnYywgInIzIiwgY29va2VkX3RyYW5zZmVyKTsKLSAgcHNpbV93cml0ZV9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgLTEsCi0JCSAgICAgICZzdGFydF9hcmd2LCAicjQiLCBjb29rZWRfdHJhbnNmZXIpOwotICBwc2ltX3dyaXRlX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAtMSwKLQkJICAgICAgJnN0YXJ0X2VudnAsICJyNSIsIGNvb2tlZF90cmFuc2Zlcik7Ci0gIHBzaW1fd3JpdGVfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIC0xLAotCQkgICAgICAmc3RhcnRfYXV4LCAicjYiLCBjb29rZWRfdHJhbnNmZXIpOwotfQotCi1zdGF0aWMgdm9pZAotY3JlYXRlX3BwY19haXhfc3RhY2tfZnJhbWUoZGV2aWNlICptZSwKLQkJCSAgIHVuc2lnbmVkX3dvcmQgYm90dG9tX29mX3N0YWNrLAotCQkJICAgY2hhciAqKmFyZ3YsCi0JCQkgICBjaGFyICoqZW52cCkKLXsKLSAgdW5zaWduZWRfd29yZCBjb3JlX2VudnA7Ci0gIHVuc2lnbmVkX3dvcmQgY29yZV9hcmd2OwotICB1bnNpZ25lZF93b3JkIGNvcmVfYXJnYzsKLSAgdW5zaWduZWRfd29yZCBjb3JlX2F1eDsKLSAgdW5zaWduZWRfd29yZCB0b3Bfb2Zfc3RhY2s7Ci0KLSAgLyogY2hlYXQgLSBjcmVhdGUgYW4gZWxmIHN0YWNrIGZyYW1lICovCi0gIGNyZWF0ZV9wcGNfZWxmX3N0YWNrX2ZyYW1lKG1lLCBib3R0b21fb2Zfc3RhY2ssIGFyZ3YsIGVudnApOwotICAKLSAgLyogZXh0cmFjdCBhcmd1bWVudCBhZGRyZXNzZXMgZnJvbSByZWdpc3RlcnMgKi8KLSAgcHNpbV9yZWFkX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAwLAotCQkgICAgICZ0b3Bfb2Zfc3RhY2ssICJyMSIsIGNvb2tlZF90cmFuc2Zlcik7Ci0gIHBzaW1fcmVhZF9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgMCwKLQkJICAgICAmY29yZV9hcmdjLCAicjMiLCBjb29rZWRfdHJhbnNmZXIpOwotICBwc2ltX3JlYWRfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIDAsCi0JCSAgICAgJmNvcmVfYXJndiwgInI0IiwgY29va2VkX3RyYW5zZmVyKTsKLSAgcHNpbV9yZWFkX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAwLAotCQkgICAgICZjb3JlX2VudnAsICJyNSIsIGNvb2tlZF90cmFuc2Zlcik7Ci0gIHBzaW1fcmVhZF9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgMCwKLQkJICAgICAmY29yZV9hdXgsICJyNiIsIGNvb2tlZF90cmFuc2Zlcik7Ci0KLSAgLyogZXh0cmFjdCBhcmd1bWVudHMgZnJvbSByZWdpc3RlcnMgKi8KLSAgZGV2aWNlX2Vycm9yKG1lLCAiVW5maW5pc2hlZCBwcm9jZWR1cmUgY3JlYXRlX3BwY19haXhfc3RhY2tfZnJhbWVcbiIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1jcmVhdGVfcHBjX2NoaXJwX2Jvb3RhcmdzKGRldmljZSAqbWUsCi0JCQkgIGNoYXIgKiphcmd2KQotewotICAvKiBjb25jYXQgdGhlIGFyZ3VtZW50cyAqLwotICBjaGFyIGFyZ3NbMTAyNF07Ci0gIGNoYXIgKipjaHAgPSBhcmd2ICsgMTsKLSAgYXJnc1swXSA9ICdcMCc7Ci0gIHdoaWxlICgqY2hwICE9IE5VTEwpIHsKLSAgICBpZiAoc3RybGVuKGFyZ3MpID4gMCkKLSAgICAgIHN0cmNhdChhcmdzLCAiICIpOwotICAgIGlmIChzdHJsZW4oYXJncykgKyBzdHJsZW4oKmNocCkgPj0gc2l6ZW9mKGFyZ3MpKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgc3RyY2F0KGFyZ3MsICpjaHApOwotICAgIGNocCsrOwotICB9Ci0KLSAgLyogc2V0IHRoZSBhcmd1bWVudHMgcHJvcGVydHkgKi8KLSAgdHJlZV9wYXJzZShtZSwgIi9jaG9zZW4vYm9vdGFyZ3MgXCIlcyIsIGFyZ3MpOwotfQotCi0KLXN0YXRpYyBpbnQKLWh3X3N0YWNrX2lvY3RsKGRldmljZSAqbWUsCi0JICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKLQkgICAgICAgZGV2aWNlX2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKLQkgICAgICAgdmFfbGlzdCBhcCkKLXsKLSAgc3dpdGNoIChyZXF1ZXN0KSB7Ci0gIGNhc2UgZGV2aWNlX2lvY3RsX2NyZWF0ZV9zdGFjazoKLSAgICB7Ci0gICAgICB1bnNpZ25lZF93b3JkIHN0YWNrX3BvaW50ZXIgPSB2YV9hcmcoYXAsIHVuc2lnbmVkX3dvcmQpOwotICAgICAgY2hhciAqKmFyZ3YgPSB2YV9hcmcoYXAsIGNoYXIgKiopOwotICAgICAgY2hhciAqKmVudnAgPSB2YV9hcmcoYXAsIGNoYXIgKiopOwotICAgICAgY29uc3QgY2hhciAqc3RhY2tfdHlwZTsKLSAgICAgIERUUkFDRShzdGFjaywKLQkgICAgICgic3RhY2tfaW9jdGxfY2FsbGJhY2sobWU9MHglbHg6JXMgcHJvY2Vzc29yPTB4JWx4IGNpYT0weCVseCBhcmd2PTB4JWx4IGVudnA9MHglbHgpXG4iLAotCSAgICAgIChsb25nKW1lLCBkZXZpY2VfbmFtZShtZSksCi0JICAgICAgKGxvbmcpcHJvY2Vzc29yLAotCSAgICAgIChsb25nKWNpYSwKLQkgICAgICAobG9uZylhcmd2LAotCSAgICAgIChsb25nKWVudnApKTsKLSAgICAgIHN0YWNrX3R5cGUgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJzdGFjay10eXBlIik7Ci0gICAgICBpZiAoc3RyY21wKHN0YWNrX3R5cGUsICJwcGMtZWxmIikgPT0gMCkKLQljcmVhdGVfcHBjX2VsZl9zdGFja19mcmFtZShtZSwgc3RhY2tfcG9pbnRlciwgYXJndiwgZW52cCk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RhY2tfdHlwZSwgInBwYy14Y29mZiIpID09IDApCi0JY3JlYXRlX3BwY19haXhfc3RhY2tfZnJhbWUobWUsIHN0YWNrX3BvaW50ZXIsIGFyZ3YsIGVudnApOwotICAgICAgZWxzZSBpZiAoc3RyY21wKHN0YWNrX3R5cGUsICJjaGlycCIpID09IDApCi0JY3JlYXRlX3BwY19jaGlycF9ib290YXJncyhtZSwgYXJndik7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RhY2tfdHlwZSwgIm5vbmUiKSAhPSAwKQotCWRldmljZV9lcnJvcihtZSwgIlVua25vd24gaW5pdGlhbCBzdGFjayBmcmFtZSB0eXBlICVzIiwgc3RhY2tfdHlwZSk7Ci0gICAgICBEVFJBQ0Uoc3RhY2ssIAotCSAgICAgKCJzdGFja19pb2N0bF9jYWxsYmFjaygpID0gdm9pZFxuIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBkZWZhdWx0OgotICAgIGRldmljZV9lcnJvcihtZSwgIlVuc3VwcG9ydGVkIGlvY3RsIHJlcXVlc3RlZCIpOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19zdGFja19jYWxsYmFja3MgPSB7Ci0gIHsgTlVMTCwgfSwKLSAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCi0gIHsgTlVMTCwgfSwgLyogSU8gKi8KLSAgeyBOVUxMLCB9LCAvKiBETUEgKi8KLSAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBOVUxMLCB9LCAvKiB1bml0ICovCi0gIE5VTEwsIC8qIGluc3RhbmNlICovCi0gIGh3X3N0YWNrX2lvY3RsLAotfTsKLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfaW5pdF9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJmaWxlIiwgTlVMTCwgJmh3X2ZpbGVfY2FsbGJhY2tzIH0sCi0gIHsgImRhdGEiLCBOVUxMLCAmaHdfZGF0YV9jYWxsYmFja3MgfSwKLSAgeyAibG9hZC1iaW5hcnkiLCBOVUxMLCAmaHdfYmluYXJ5X2NhbGxiYWNrcyB9LAotICB7ICJtYXAtYmluYXJ5IiwgTlVMTCwgJmh3X2JpbmFyeV9jYWxsYmFja3MgfSwKLSAgeyAic3RhY2siLCBOVUxMLCAmaHdfc3RhY2tfY2FsbGJhY2tzIH0sCi0gIHsgTlVMTCB9LAotfTsKLQotI2VuZGlmIF9IV19JTklUX0NfCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2lvYnVzLmMgYi9zaW0vcHBjL2h3X2lvYnVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDEzOGMuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19pb2J1cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0hXX0lPQlVTX0NfCi0jZGVmaW5lIF9IV19JT0JVU19DXwotCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkVfSFdfSU9CVVMKLSNkZWZpbmUgU1RBVElDX0lOTElORV9IV19JT0JVUyBTVEFUSUNfSU5MSU5FCi0jZW5kaWYKLQotI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgotCi0KLS8qIERFVklDRQotCi0gICBpb2J1cyAtIHNpbXBsZSBidXMgZm9yIGF0dGFjaGluZyBkZXZpY2VzCi0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIElPQlVTIHByb3ZpZGVzIGEgc2ltcGxlIGBsb2NhbCcgYnVzIGZvciBhdHRhY2hpbmcgKGhhbmdpbmcpCi0gICBwcm9ncmFtbWVkIElPIGRldmljZXMgZnJvbS4gIEFsbCBjaGlsZCBkZXZpY2VzIGFyZSBkaXJlY3RseSBtYXBwZWQKLSAgIGludG8gdGhpcyBkZXZpY2VzIHBhcmVudCBhZGRyZXNzIHNwYWNlIChhZnRlciBjaGVja2luZyB0aGF0IHRoZQotICAgYXR0YWNoIGFkZHJlc3MgbGllcyB3aXRoaW4gdGhlIDw8aW9idXM+PiBhZGRyZXNzIHJhbmdlLiAgYWRkcmVzcykuCi0KLSAgIFBST1BFUlRJRVMKLQotICAgTm9uZS4KLQotICAgKi8KLQotc3RhdGljIHZvaWQKLWh3X2lvYnVzX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkJIGF0dGFjaF90eXBlIHR5cGUsCi0JCQkJIGludCBzcGFjZSwKLQkJCQkgdW5zaWduZWRfd29yZCBhZGRyLAotCQkJCSB1bnNpZ25lZCBucl9ieXRlcywKLQkJCQkgYWNjZXNzX3R5cGUgYWNjZXNzLAotCQkJCSBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KLXsKLSAgaW50IGF0dGFjaF9zcGFjZTsKLSAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKLSAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmIChzcGFjZSAhPSAwKQotICAgIGRldmljZV9lcnJvcihtZSwgImludmFsaWQgc3BhY2UgKCVkKSBzcGVjaWZpZWQgYnkgJXMiLAotCQkgc3BhY2UsIGRldmljZV9wYXRoKGNsaWVudCkpOwotICAvKiBnZXQgdGhlIGJ1cyBhZGRyZXNzICovCi0gIGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLAotCQkJCSAgIGRldmljZV91bml0X2FkZHJlc3MobWUpLAotCQkJCSAgICZhdHRhY2hfc3BhY2UsCi0JCQkJICAgJmF0dGFjaF9hZGRyZXNzLAotCQkJCSAgIG1lKTsKLSAgaWYgKGFkZHIgPCBhdHRhY2hfYWRkcmVzcykKLSAgICBkZXZpY2VfZXJyb3IobWUsICJJbnZhbGlkIGF0dGFjaCBhZGRyZXNzIDB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0gIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKLQkJCXR5cGUsCi0JCQlhdHRhY2hfc3BhY2UsCi0JCQlhZGRyLAotCQkJbnJfYnl0ZXMsCi0JCQlhY2Nlc3MsCi0JCQljbGllbnQpOwotfQotCi0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2lvYnVzX2NhbGxiYWNrcyA9IHsKLSAgeyBOVUxMLCB9LAotICB7IGh3X2lvYnVzX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIElPICovCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcywKLSAgICBnZW5lcmljX2RldmljZV9zaXplX3RvX2F0dGFjaF9zaXplIH0KLX07Ci0KLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfaW9idXNfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAiaW9idXMiLCBOVUxMLCAmaHdfaW9idXNfY2FsbGJhY2tzIH0sCi0gIHsgTlVMTCwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfSU9CVVNfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X21lbW9yeS5jIGIvc2ltL3BwYy9od19tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3MzI0Yi4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X21lbW9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0hXX01FTU9SWV9DXwotI2RlZmluZSBfSFdfTUVNT1JZX0NfCi0KLSNpZm5kZWYgU1RBVElDX0lOTElORV9IV19NRU1PUlkKLSNkZWZpbmUgU1RBVElDX0lOTElORV9IV19NRU1PUlkgU1RBVElDX0lOTElORQotI2VuZGlmCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLQotLyogREVWSUNFCi0KLQotICAgbWVtb3J5IC0gZGVzY3JpcHRpb24gb2Ygc3lzdGVtIG1lbW9yeQotCi0KLSAgIERFU0NSSVBUSU9OCi0KLQotICAgVGhpcyBkZXZpY2UgZGVzY3JpYmVzIHRoZSBzaXplIGFuZCBsb2NhdGlvbiBvZiB0aGUgYmFua3Mgb2YKLSAgIHBoeXNpY2FsIG1lbW9yeSB3aXRoaW4gdGhlIHNpbXVsYXRpb24uCi0KLSAgIEluIGFkZGl0aW9uLCB0aGlzIGRldmljZSBzdXBwb3J0cyB0aGUgImNsYWltIiBhbmQgInJlbGVhc2UiIG1ldGhvZHMKLSAgIHRoYXQgY2FuIGJlIHVzZWQgYnkgT3BlbkJvb3QgY2xpZW50IHByb2dyYW1zIHRvIG1hbmFnZSB0aGUKLSAgIGFsbG9jYXRpb24gb2YgcGh5c2ljYWwgbWVtb3J5LgotCi0KLSAgIFBST1BFUlRJRVMKLQotCi0gICByZWcgPSB7IDxhZGRyZXNzPiA8c2l6ZT4gfSAocmVxdWlyZWQpCi0KLSAgIEVhY2ggcGFpciBzcGVjaWZ5IG9uZSBiYW5rIG9mIG1lbW9yeS4KLQotICAgYXZhaWxhYmxlID0geyA8YWRkcmVzcz4gPHNpemU+IH0gKGF1dG9tYXRpYykKLQotICAgRWFjaCBwYWlyIHNwZWNpZmllcyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGlzIGN1cnJlbnRseSB1bmFsbG9jYXRlZC4gIAotCi0KLSAgIEJVR1MKLQotCi0gICBPcGVuRmlybXdhcmUgZG9lc24ndCBtYWtlIGl0IGNsZWFyIGlmLCB3aGVuIHJlbGVhc2luZyBtZW1vcnkgdGhlCi0gICBzYW1lIGFkZHJlc3MgKyBzaXplIHBhaXIgYXMgd2FzIHVzZWQgZHVyaW5nIHRoZSBjbGFpbSBzaG91bGQgYmUKLSAgIHNwZWNpZmllZC4KLQotICAgSXQgaXMgYXNzdW1lZCB0aGF0ICNzaXplLWNlbGxzIGFuZCAjYWRkcmVzcy1jZWxscyBmb3IgdGhlIHBhcmVudAotICAgbm9kZSBvZiB0aGlzIGRldmljZSBhcmUgYm90aCBvbmUgaS5lLiBhbiBhZGRyZXNzIG9yIHNpemUgY2FuIGJlCi0gICBzcGVjaWZpZWQgdXNpbmcgYSBzaW5nbGUgbWVtb3J5IGNlbGwgKHdvcmQpLgotCi0gICBTaWduaWZpY2FudCB3b3JrIHdpbGwgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSA8PG1lbW9yeT4+IGRldmljZSBjYW4KLSAgIHN1cHBvcnQgNjRiaXQgYWRkcmVzc2VzICgjYWRkcmVzcy1jZWxscyBlcXVhbCB0d28pLgotCi0gICAqLwotCi10eXBlZGVmIHN0cnVjdCBfbWVtb3J5X3JlZ19zcGVjIHsKLSAgdW5zaWduZWRfY2VsbCBiYXNlOwotICB1bnNpZ25lZF9jZWxsIHNpemU7Ci19IG1lbW9yeV9yZWdfc3BlYzsKLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X21lbW9yeV9jaHVuayBod19tZW1vcnlfY2h1bms7Ci1zdHJ1Y3QgX2h3X21lbW9yeV9jaHVuayB7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgdW5zaWduZWRfd29yZCBzaXplOwotICBpbnQgYXZhaWxhYmxlOwotICBod19tZW1vcnlfY2h1bmsgKm5leHQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfaHdfbWVtb3J5X2RldmljZSB7Ci0gIGh3X21lbW9yeV9jaHVuayAqaGVhcDsKLX0gaHdfbWVtb3J5X2RldmljZTsKLQotCi1zdGF0aWMgdm9pZCAqCi1od19tZW1vcnlfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCi0JCSBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCQkgY29uc3QgY2hhciAqYXJncykKLXsKLSAgaHdfbWVtb3J5X2RldmljZSAqaHdfbWVtb3J5ID0gWkFMTE9DKGh3X21lbW9yeV9kZXZpY2UpOwotICByZXR1cm4gaHdfbWVtb3J5OwotfQotCi0KLXN0YXRpYyB2b2lkCi1od19tZW1vcnlfc2V0X2F2YWlsYWJsZShkZXZpY2UgKm1lLAotCQkJaHdfbWVtb3J5X2RldmljZSAqaHdfbWVtb3J5KQotewotICBod19tZW1vcnlfY2h1bmsgKmNodW5rID0gTlVMTDsKLSAgbWVtb3J5X3JlZ19zcGVjICphdmFpbGFibGUgPSBOVUxMOwotICBpbnQgbnJfYXZhaWxhYmxlID0gMDsKLSAgaW50IGN1cnIgPSAwOwotICBpbnQgc2l6ZW9mX2F2YWlsYWJsZSA9IDA7Ci0gIC8qIGRldGVybWluZSB0aGUgbnIgb2YgYXZhaWxhYmxlIGNodW5rcyAqLwotICBjaHVuayA9IGh3X21lbW9yeS0+aGVhcDsKLSAgbnJfYXZhaWxhYmxlID0gMDsKLSAgd2hpbGUgKGNodW5rICE9IE5VTEwpIHsKLSAgICBpZiAoY2h1bmstPmF2YWlsYWJsZSkKLSAgICAgIG5yX2F2YWlsYWJsZSArPSAxOwotICAgIEFTU0VSVChjaHVuay0+bmV4dCA9PSBOVUxMCi0JICAgfHwgY2h1bmstPmFkZHJlc3MgPCBjaHVuay0+bmV4dC0+YWRkcmVzcyk7Ci0gICAgQVNTRVJUKGNodW5rLT5uZXh0ID09IE5VTEwKLQkgICB8fCBjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplID09IGNodW5rLT5uZXh0LT5hZGRyZXNzKTsKLSAgICBjaHVuayA9IGNodW5rLT5uZXh0OwotICB9Ci0gIC8qIG5vdyBjcmVhdGUgdGhlIGF2YWlsYWJsZSBzdHJ1Y3QgKi8KLSAgQVNTRVJUKG5yX2F2YWlsYWJsZSA+IDApOwotICBzaXplb2ZfYXZhaWxhYmxlID0gc2l6ZW9mKG1lbW9yeV9yZWdfc3BlYykgKiBucl9hdmFpbGFibGU7Ci0gIGF2YWlsYWJsZSA9IHphbGxvYyhzaXplb2ZfYXZhaWxhYmxlKTsKLSAgY2h1bmsgPSBod19tZW1vcnktPmhlYXA7Ci0gIGN1cnIgPSAwOwotICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgewotICAgIGlmIChjaHVuay0+YXZhaWxhYmxlKSB7Ci0gICAgICBhdmFpbGFibGVbY3Vycl0uYmFzZSA9IEgyQkVfY2VsbChjaHVuay0+YWRkcmVzcyk7Ci0gICAgICBhdmFpbGFibGVbY3Vycl0uc2l6ZSA9IEgyQkVfY2VsbChjaHVuay0+c2l6ZSk7Ci0gICAgICBjdXJyICs9IDE7Ci0gICAgfQotICAgIGNodW5rID0gY2h1bmstPm5leHQ7Ci0gIH0KLSAgLyogdXBkYXRlICovCi0gIGRldmljZV9zZXRfYXJyYXlfcHJvcGVydHkobWUsICJhdmFpbGFibGUiLCBhdmFpbGFibGUsIHNpemVvZl9hdmFpbGFibGUpOwotICB6ZnJlZShhdmFpbGFibGUpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1od19tZW1vcnlfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCi17Ci0gIGh3X21lbW9yeV9kZXZpY2UgKmh3X21lbW9yeSA9IChod19tZW1vcnlfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0KLSAgLyogZnJlZSB1cCBhbnkgcHJldmlvdXMgc3RydWN0dXJlcyAqLwotICB7Ci0gICAgaHdfbWVtb3J5X2NodW5rICpjdXJyX2NodW5rID0gaHdfbWVtb3J5LT5oZWFwOwotICAgIGh3X21lbW9yeS0+aGVhcCA9IE5VTEw7Ci0gICAgd2hpbGUgKGN1cnJfY2h1bmsgIT0gTlVMTCkgewotICAgICAgaHdfbWVtb3J5X2NodW5rICpkZWFkX2NodW5rID0gY3Vycl9jaHVuazsKLSAgICAgIGN1cnJfY2h1bmsgPSBkZWFkX2NodW5rLT5uZXh0OwotICAgICAgZGVhZF9jaHVuay0+bmV4dCA9IE5VTEw7Ci0gICAgICB6ZnJlZShkZWFkX2NodW5rKTsKLSAgICB9Ci0gIH0KLQotICAvKiBhdHRhY2ggbWVtb3J5IHJlZ2lvbnMgYWNjb3JkaW5nIHRvIHRoZSAicmVnIiBwcm9wZXJ0eSAqLwotICB7Ci0gICAgaW50IHJlZ19ucjsKLSAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0gICAgZm9yIChyZWdfbnIgPSAwOwotCSBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkobWUsICJyZWciLCByZWdfbnIsICZyZWcpOwotCSByZWdfbnIrKykgewotICAgICAgaW50IGk7Ci0gICAgICAvKiBjaGVjayB0aGF0IHRoZSBlbnRyeSBtZWV0cyByZXN0cmljdGlvbnMgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWcuYWRkcmVzcy5ucl9jZWxscyAtIDE7IGkrKykKLQlpZiAocmVnLmFkZHJlc3MuY2VsbHNbaV0gIT0gMCkKLQkgIGRldmljZV9lcnJvcihtZSwgIk9ubHkgc2luZ2xlIGNlbGxlZCBhZGRyZXNzZXMgc3VwcG9ydGVkIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVnLnNpemUubnJfY2VsbHMgLSAxOyBpKyspCi0JaWYgKHJlZy5zaXplLmNlbGxzW2ldICE9IDApCi0JICBkZXZpY2VfZXJyb3IobWUsICJPbmx5IHNpbmdsZSBjZWxsZWQgc2l6ZXMgc3VwcG9ydGVkIik7Ci0gICAgICAvKiBhdHRhY2ggdGhlIHJhbmdlICovCi0gICAgICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCi0JCQkgICAgYXR0YWNoX3Jhd19tZW1vcnksCi0JCQkgICAgMCAvKmFkZHJlc3Mgc3BhY2UqLywKLQkJCSAgICByZWcuYWRkcmVzcy5jZWxsc1tyZWcuYWRkcmVzcy5ucl9jZWxscyAtIDFdLAotCQkJICAgIHJlZy5zaXplLmNlbGxzW3JlZy5zaXplLm5yX2NlbGxzIC0gMV0sCi0JCQkgICAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYywKLQkJCSAgICBtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyogY3JlYXRlIHRoZSBpbml0aWFsIGBhdmFpbGFibGUgbWVtb3J5JyBkYXRhIHN0cnVjdHVyZSAqLwotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJhdmFpbGFibGUiKSAhPSBOVUxMKSB7Ci0gICAgaHdfbWVtb3J5X2NodW5rICoqY3Vycl9jaHVuayA9ICZod19tZW1vcnktPmhlYXA7Ci0gICAgaW50IGNlbGxfbnI7Ci0gICAgdW5zaWduZWRfY2VsbCBkdW1teTsKLSAgICBpbnQgbnJfY2VsbHMgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAiYXZhaWxhYmxlIiwgMCwgJmR1bW15KTsKLSAgICBpZiAoKG5yX2NlbGxzICUgMikgIT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5IFwiYXZhaWxhYmxlXCIgaW52YWxpZCAtIGNvbnRhaW5zIGFuIG9kZCBudW1iZXIgb2YgY2VsbHMiKTsKLSAgICBmb3IgKGNlbGxfbnIgPSAwOwotCSBjZWxsX25yIDwgbnJfY2VsbHM7Ci0JIGNlbGxfbnIgKz0gMikgewotICAgICAgaHdfbWVtb3J5X2NodW5rICpuZXdfY2h1bmsgPSBaQUxMT0MoaHdfbWVtb3J5X2NodW5rKTsKLSAgICAgIGRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkobWUsICJhdmFpbGFibGUiLCBjZWxsX25yLAotCQkJCQkgJm5ld19jaHVuay0+YWRkcmVzcyk7Ci0gICAgICBkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAiYXZhaWxhYmxlIiwgY2VsbF9uciArIDEsCi0JCQkJCSAmbmV3X2NodW5rLT5zaXplKTsKLSAgICAgIG5ld19jaHVuay0+YXZhaWxhYmxlID0gMTsKLSAgICAgICpjdXJyX2NodW5rID0gbmV3X2NodW5rOwotICAgICAgY3Vycl9jaHVuayA9ICZuZXdfY2h1bmstPm5leHQ7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGh3X21lbW9yeV9jaHVuayAqKmN1cnJfY2h1bmsgPSAmaHdfbWVtb3J5LT5oZWFwOwotICAgIGludCByZWdfbnI7Ci0gICAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOwotICAgIGZvciAocmVnX25yID0gMDsKLQkgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCAicmVnIiwgcmVnX25yLCAmcmVnKTsKLQkgcmVnX25yKyspIHsKLSAgICAgIGh3X21lbW9yeV9jaHVuayAqbmV3X2NodW5rOwotICAgICAgbmV3X2NodW5rID0gWkFMTE9DKGh3X21lbW9yeV9jaHVuayk7Ci0gICAgICBuZXdfY2h1bmstPmFkZHJlc3MgPSByZWcuYWRkcmVzcy5jZWxsc1tyZWcuYWRkcmVzcy5ucl9jZWxscyAtIDFdOwotICAgICAgbmV3X2NodW5rLT5zaXplID0gcmVnLnNpemUuY2VsbHNbcmVnLnNpemUubnJfY2VsbHMgLSAxXTsKLSAgICAgIG5ld19jaHVuay0+YXZhaWxhYmxlID0gMTsKLSAgICAgICpjdXJyX2NodW5rID0gbmV3X2NodW5rOwotICAgICAgY3Vycl9jaHVuayA9ICZuZXdfY2h1bmstPm5leHQ7Ci0gICAgfQotICB9Ci0KLSAgLyogaW5pdGlhbGl6ZSB0aGUgYWxsb2MgcHJvcGVydHkgZm9yIHRoaXMgZGV2aWNlICovCi0gIGh3X21lbW9yeV9zZXRfYXZhaWxhYmxlKG1lLCBod19tZW1vcnkpOwotfQotCi1zdGF0aWMgdm9pZAotaHdfbWVtb3J5X2luc3RhbmNlX2RlbGV0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQotewotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWh3X21lbW9yeV9pbnN0YW5jZV9jbGFpbShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJIGludCBuX3N0YWNrX2FyZ3MsCi0JCQkgdW5zaWduZWRfY2VsbCBzdGFja19hcmdzWy8qbl9zdGFja19hcmdzKi9dLAotCQkJIGludCBuX3N0YWNrX3JldHVybnMsCi0JCQkgdW5zaWduZWRfY2VsbCBzdGFja19yZXR1cm5zWy8qbl9zdGFja19yZXR1cm5zKi9dKQotewotICBod19tZW1vcnlfZGV2aWNlICpod19tZW1vcnkgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7Ci0gIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKLSAgaW50IHN0YWNrcCA9IDA7Ci0gIHVuc2lnbmVkX3dvcmQgYWxpZ25tZW50OwotICB1bnNpZ25lZF9jZWxsIHNpemU7Ci0gIHVuc2lnbmVkX2NlbGwgYWRkcmVzczsKLSAgaHdfbWVtb3J5X2NodW5rICpjaHVuayA9IE5VTEw7Ci0KLSAgLyogZ2V0IHRoZSBhbGlnbm1lbnQgZnJvbSB0aGUgc3RhY2sgKi8KLSAgaWYgKG5fc3RhY2tfYXJncyA8IHN0YWNrcCArIDEpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAoYWxpZ25tZW50IG1pc3NpbmcpIik7Ci0gIGFsaWdubWVudCA9IHN0YWNrX2FyZ3Nbc3RhY2twXTsKLSAgc3RhY2twKys7Ci0KLSAgLyogZ2V0IHRoZSBzaXplIGZyb20gdGhlIHN0YWNrICovCi0gIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbnJfY2VsbHMgPSBkZXZpY2VfbnJfc2l6ZV9jZWxscyhkZXZpY2VfcGFyZW50KG1lKSk7Ci0gICAgaWYgKG5fc3RhY2tfYXJncyA8IHN0YWNrcCArIG5yX2NlbGxzKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAoc2l6ZSBtaXNzaW5nKSIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBucl9jZWxscyAtIDE7IGkrKykgewotICAgICAgaWYgKHN0YWNrX2FyZ3Nbc3RhY2twXSAhPSAwKQotCWRldmljZV9lcnJvcihtZSwgImNsYWltIC0gbXVsdGktY2VsbCBzaXplcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICBzdGFja3ArKzsKLSAgICB9Ci0gICAgc2l6ZSA9IHN0YWNrX2FyZ3Nbc3RhY2twXTsKLSAgICBzdGFja3ArKzsKLSAgfQotCi0gIC8qIGdldCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBzdGFjayAqLwotICB7Ci0gICAgaW50IG5yX2NlbGxzID0gZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpOwotICAgIGlmIChhbGlnbm1lbnQgIT0gMCkgewotICAgICAgaWYgKG5fc3RhY2tfYXJncyAhPSBzdGFja3ApIHsKLQlpZiAobl9zdGFja19hcmdzID09IHN0YWNrcCArIG5yX2NlbGxzKQotCSAgRFRSQUNFKG1lbW9yeSwgKCJjbGFpbSAtIGV4dHJhIGFkZHJlc3MgYXJndW1lbnQgaWdub3JlZFxuIikpOwotCWVsc2UKLQkgIGRldmljZV9lcnJvcihtZSwgImNsYWltIC0gaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgKG9wdGlvbmFsIGFkZHIpIik7Ci0gICAgICB9Ci0gICAgICBhZGRyZXNzID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlmIChuX3N0YWNrX2FyZ3MgIT0gc3RhY2twICsgbnJfY2VsbHMpCi0JZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAoYWRkciBtaXNzaW5nKSIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5yX2NlbGxzIC0gMTsgaSsrKSB7Ci0JaWYgKHN0YWNrX2FyZ3Nbc3RhY2twXSAhPSAwKQotCSAgZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBtdWx0aS1jZWxsIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIik7Ci0Jc3RhY2twKys7Ci0gICAgICB9Ci0gICAgICBhZGRyZXNzID0gc3RhY2tfYXJnc1tzdGFja3BdOwotICAgIH0KLSAgfQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgc3BhY2UgZm9yIHRoZSByZXN1bHQgKi8KLSAgaWYgKG5fc3RhY2tfcmV0dXJucyAhPSAwCi0gICAgICAmJiBuX3N0YWNrX3JldHVybnMgIT0gZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKQotICAgIGRldmljZV9lcnJvcihtZSwgImNsYWltIC0gaW52YWxpZCBudW1iZXIgb2YgcmV0dXJuIGFyZ3VtZW50cyIpOwotCi0gIC8qIGZpbmQgYSBjaHVuayBjYW5kaWRhdGUsIGVpdGhlciBhY2NvcmRpbmcgdG8gYWRkcmVzcyBvciBhbGlnbm1lbnQgKi8KLSAgaWYgKGFsaWdubWVudCA9PSAwKSB7Ci0gICAgY2h1bmsgPSBod19tZW1vcnktPmhlYXA7Ci0gICAgd2hpbGUgKGNodW5rICE9IE5VTEwpIHsKLSAgICAgIGlmICgoYWRkcmVzcyArIHNpemUpIDw9IChjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplKSkKLQlicmVhazsKLSAgICAgIGNodW5rID0gY2h1bmstPm5leHQ7Ci0gICAgfQotICAgIGlmIChjaHVuayA9PSBOVUxMIHx8IGFkZHJlc3MgPCBjaHVuay0+YWRkcmVzcyB8fCAhY2h1bmstPmF2YWlsYWJsZSkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgYXQgMHglbHgiLAotCQkgICAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZylhZGRyZXNzKTsKLSAgICBEVFJBQ0UobWVtb3J5LCAoImNsYWltIC0gYWRkcmVzcz0weCVseCBzaXplPTB4JWx4XG4iLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKLQkJICAgICh1bnNpZ25lZCBsb25nKXNpemUpKTsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBhZGp1c3QgdGhlIGFsaWdubWVudCBzbyB0aGF0IGl0IGlzIGEgcG93ZXIgb2YgdHdvICovCi0gICAgdW5zaWduZWRfd29yZCBhbGlnbl9tYXNrID0gMTsKLSAgICB3aGlsZSAoYWxpZ25fbWFzayA8IGFsaWdubWVudCAmJiBhbGlnbl9tYXNrICE9IDApCi0gICAgICBhbGlnbl9tYXNrIDw8PSAxOwotICAgIGlmIChhbGlnbl9tYXNrID09IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJhbGlnbm1lbnQgMHglbHggaXMgdG8gbGFyZ2UiLCAodW5zaWduZWQgbG9uZylhbGlnbm1lbnQpOwotICAgIGFsaWduX21hc2sgLT0gMTsKLSAgICAvKiBub3cgZmluZCBhbiBhbGlnbmVkIGNodW5rIHRoYXQgZml0cyAqLwotICAgIGNodW5rID0gaHdfbWVtb3J5LT5oZWFwOwotICAgIHdoaWxlIChjaHVuayAhPSBOVUxMKSB7Ci0gICAgICBhZGRyZXNzID0gKChjaHVuay0+YWRkcmVzcyArIGFsaWduX21hc2spICYgfmFsaWduX21hc2spOwotICAgICAgaWYgKChjaHVuay0+YXZhaWxhYmxlKQotCSAgJiYgKGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUgPj0gYWRkcmVzcyArIHNpemUpKQotCWJyZWFrOwotICAgICAgY2h1bmsgPSBjaHVuay0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKGNodW5rID09IE5VTEwpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzIHdpdGggYWxpZ25tZW50ICVsZCIsCi0JCSAgICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKWFsaWdubWVudCk7Ci0gICAgRFRSQUNFKG1lbW9yeSwgKCJjbGFpbSAtIHNpemU9MHglbHggYWxpZ25tZW50PSVsZCAoMHglbHgpLCBhZGRyZXNzPTB4JWx4XG4iLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSwKLQkJICAgICh1bnNpZ25lZCBsb25nKWFsaWdubWVudCwKLQkJICAgICh1bnNpZ25lZCBsb25nKWFsaWdubWVudCwKLQkJICAgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MpKTsKLSAgfQotCi0gIC8qIGJyZWFrIG9mZiBhIGJpdCBiZWZvcmUgdGhpcyBjaHVuayBpZiBuZWVkZWQgKi8KLSAgQVNTRVJUKGFkZHJlc3MgPj0gY2h1bmstPmFkZHJlc3MpOwotICBpZiAoYWRkcmVzcyA+IGNodW5rLT5hZGRyZXNzKSB7Ci0gICAgaHdfbWVtb3J5X2NodW5rICpuZXh0X2NodW5rID0gWkFMTE9DKGh3X21lbW9yeV9jaHVuayk7Ci0gICAgLyogaW5zZXJ0IGEgbmV3IGNodW5rICovCi0gICAgbmV4dF9jaHVuay0+bmV4dCA9IGNodW5rLT5uZXh0OwotICAgIGNodW5rLT5uZXh0ID0gbmV4dF9jaHVuazsKLSAgICAvKiBhZGp1c3QgdGhlIGFkZHJlc3Mvc2l6ZSAqLwotICAgIG5leHRfY2h1bmstPmFkZHJlc3MgPSBhZGRyZXNzOwotICAgIG5leHRfY2h1bmstPnNpemUgPSBjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplIC0gbmV4dF9jaHVuay0+YWRkcmVzczsKLSAgICBuZXh0X2NodW5rLT5hdmFpbGFibGUgPSAxOwotICAgIGNodW5rLT5zaXplID0gbmV4dF9jaHVuay0+YWRkcmVzcyAtIGNodW5rLT5hZGRyZXNzOwotICAgIC8qIG1ha2UgdGhpcyBuZXcgY2h1bmsgdGhlIG9uZSB0byBhbGxvY2F0ZSAqLwotICAgIGNodW5rID0gbmV4dF9jaHVuazsKLSAgfQotICBBU1NFUlQoYWRkcmVzcyA9PSBjaHVuay0+YWRkcmVzcyk7Ci0KLSAgLyogYnJlYWsgb2ZmIGEgYml0IGFmdGVyIHRoaXMgY2h1bmsgaWYgbmVlZGVkICovCi0gIEFTU0VSVChhZGRyZXNzICsgc2l6ZSA8PSBjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplKTsKLSAgaWYgKGFkZHJlc3MgKyBzaXplIDwgY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSkgewotICAgIGh3X21lbW9yeV9jaHVuayAqbmV4dF9jaHVuayA9IFpBTExPQyhod19tZW1vcnlfY2h1bmspOwotICAgIC8qIGluc2VydCBpdCBpbiB0byB0aGUgbGlzdCAqLwotICAgIG5leHRfY2h1bmstPm5leHQgPSBjaHVuay0+bmV4dDsKLSAgICBjaHVuay0+bmV4dCA9IG5leHRfY2h1bms7Ci0gICAgLyogYWRqdXN0IHRoZSBhZGRyZXNzL3NpemUgKi8KLSAgICBuZXh0X2NodW5rLT5hZGRyZXNzID0gYWRkcmVzcyArIHNpemU7Ci0gICAgbmV4dF9jaHVuay0+c2l6ZSA9IGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUgLSBuZXh0X2NodW5rLT5hZGRyZXNzOwotICAgIG5leHRfY2h1bmstPmF2YWlsYWJsZSA9IDE7Ci0gICAgY2h1bmstPnNpemUgPSBuZXh0X2NodW5rLT5hZGRyZXNzIC0gY2h1bmstPmFkZHJlc3M7Ci0gIH0KLSAgQVNTRVJUKGFkZHJlc3MgKyBzaXplID09IGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUpOwotCi0gIC8qIG5vdyBhbGxvY2F0ZS9yZXR1cm4gaXQgKi8KLSAgY2h1bmstPmF2YWlsYWJsZSA9IDA7Ci0gIGh3X21lbW9yeV9zZXRfYXZhaWxhYmxlKGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpLCBod19tZW1vcnkpOwotICBpZiAobl9zdGFja19yZXR1cm5zID4gMCkgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuX3N0YWNrX3JldHVybnMgLSAxOyBpKyspCi0gICAgICBzdGFja19yZXR1cm5zW2ldID0gMDsKLSAgICBzdGFja19yZXR1cm5zW25fc3RhY2tfcmV0dXJucyAtIDFdID0gYWRkcmVzczsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWh3X21lbW9yeV9pbnN0YW5jZV9yZWxlYXNlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkgICBpbnQgbl9zdGFja19hcmdzLAotCQkJICAgdW5zaWduZWRfY2VsbCBzdGFja19hcmdzWy8qbl9zdGFja19hcmdzKi9dLAotCQkJICAgaW50IG5fc3RhY2tfcmV0dXJucywKLQkJCSAgIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSkKLXsKLSAgaHdfbWVtb3J5X2RldmljZSAqaHdfbWVtb3J5ID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBkZXZpY2UgKm1lID0gZGV2aWNlX2luc3RhbmNlX2RldmljZShpbnN0YW5jZSk7Ci0gIHVuc2lnbmVkX3dvcmQgbGVuZ3RoOwotICB1bnNpZ25lZF93b3JkIGFkZHJlc3M7Ci0gIGludCBzdGFja3AgPSAwOwotICBod19tZW1vcnlfY2h1bmsgKmNodW5rOwotICAKLSAgLyogZ2V0IHRoZSBsZW5ndGggZnJvbSB0aGUgc3RhY2sgKi8KLSAgewotICAgIGludCBpOwotICAgIGludCBucl9jZWxscyA9IGRldmljZV9ucl9zaXplX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKTsKLSAgICBpZiAobl9zdGFja19hcmdzIDwgc3RhY2twICsgbnJfY2VsbHMpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJyZWxlYXNlIC0gaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgKGxlbmd0aCBtaXNzaW5nKSIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBucl9jZWxscyAtIDE7IGkrKykgewotICAgICAgaWYgKHN0YWNrX2FyZ3Nbc3RhY2twXSAhPSAwKQotCWRldmljZV9lcnJvcihtZSwgInJlbGVhc2UgLSBtdWx0aS1jZWxsIGxlbmd0aCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICBzdGFja3ArKzsKLSAgICB9Ci0gICAgbGVuZ3RoID0gc3RhY2tfYXJnc1tzdGFja3BdOwotICAgIHN0YWNrcCsrOwotICB9Ci0KLSAgLyogZ2V0IHRoZSBhZGRyZXNzIGZyb20gdGhlIHN0YWNrICovCi0gIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbnJfY2VsbHMgPSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSk7Ci0gICAgaWYgKG5fc3RhY2tfYXJncyAhPSBzdGFja3AgKyBucl9jZWxscykKLSAgICAgIGRldmljZV9lcnJvcihtZSwgInJlbGVhc2UgLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAoYWRkciBtaXNzaW5nKSIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBucl9jZWxscyAtIDE7IGkrKykgewotICAgICAgaWYgKHN0YWNrX2FyZ3Nbc3RhY2twXSAhPSAwKQotCWRldmljZV9lcnJvcihtZSwgInJlbGVhc2UgLSBtdWx0aS1jZWxsIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICBzdGFja3ArKzsKLSAgICB9Ci0gICAgYWRkcmVzcyA9IHN0YWNrX2FyZ3Nbc3RhY2twXTsKLSAgfQotCi0gIC8qIHJldHVybnMgb2sgKi8KLSAgaWYgKG5fc3RhY2tfcmV0dXJucyAhPSAwKQotICAgIGRldmljZV9lcnJvcihtZSwgInJlbGVhc2UgLSBub256ZXJvIG51bWJlciBvZiByZXN1bHRzIik7Ci0KLSAgLyogdHJ5IHRvIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IGNodW5rICovCi0gIGNodW5rID0gaHdfbWVtb3J5LT5oZWFwOwotICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgewotICAgIGlmIChjaHVuay0+YWRkcmVzcyA9PSBhZGRyZXNzCi0JJiYgY2h1bmstPnNpemUgPT0gbGVuZ3RoKSB7Ci0gICAgICAvKiBhbiBleGFjdCBtYXRjaCAqLwotICAgICAgaWYgKGNodW5rLT5hdmFpbGFibGUpCi0JZGV2aWNlX2Vycm9yKG1lLCAibWVtb3J5IGNodW5rIDB4JWx4IChzaXplIDB4JWx4KSBhbHJlYWR5IGF2YWlsYWJsZSIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKLQkJICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotICAgICAgZWxzZSB7Ci0JLyogZnJlZSB0aGlzIGNodW5rICovCi0JRFRSQUNFKG1lbW9yeSwgKCJyZWxlYXNlIC0gYWRkcmVzcz0weCVseCwgbGVuZ3RoPTB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3MsCi0JCQkodW5zaWduZWQgbG9uZykgbGVuZ3RoKSk7Ci0JY2h1bmstPmF2YWlsYWJsZSA9IDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNodW5rLT5hZGRyZXNzID49IGFkZHJlc3MKLQkgICAgICYmIGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUgPD0gYWRkcmVzcyArIGxlbmd0aCkgewotICAgICAgLyogYSBzdWIgcmVnaW9uICovCi0gICAgICBpZiAoIWNodW5rLT5hdmFpbGFibGUpIHsKLQlEVFJBQ0UobWVtb3J5LCAoInJlbGVhc2UgLSBhZGRyZXNzPTB4JWx4LCBzaXplPTB4JWx4IHdpdGhpbiByZWdpb24gMHglbHggbGVuZ3RoIDB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIGNodW5rLT5hZGRyZXNzLAotCQkJKHVuc2lnbmVkIGxvbmcpIGNodW5rLT5zaXplLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3MsCi0JCQkodW5zaWduZWQgbG9uZykgbGVuZ3RoKSk7Ci0JY2h1bmstPmF2YWlsYWJsZSA9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGNodW5rID0gY2h1bmstPm5leHQ7Ci0gIH0KLSAgaWYgKGNodW5rID09IE5VTEwpIHsKLSAgICBwcmludGZfZmlsdGVyZWQoIndhcm5pbmc6IHJlbGVhc2VkIGNodW5rcyB3aXRoaW4gcmVnaW9uIDB4JWx4Li4weCVseFxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCi0JCSAgICAodW5zaWduZWQgbG9uZykoYWRkcmVzcyArIGxlbmd0aCAtIDEpKTsKLSAgfQotCi0gIC8qIGNoZWNrIGZvciB0aGUgY2hhbmNlIHRvIG1lcmdlIHR3byBhZGphY2VudCBhdmFpbGFibGUgbWVtb3J5IGNodW5rcyAqLwotICBjaHVuayA9IGh3X21lbW9yeS0+aGVhcDsKLSAgd2hpbGUgKGNodW5rICE9IE5VTEwpIHsKLSAgICBpZiAoY2h1bmstPmF2YWlsYWJsZQotCSYmIGNodW5rLT5uZXh0ICE9IE5VTEwgJiYgY2h1bmstPm5leHQtPmF2YWlsYWJsZSkgewotICAgICAgLyogYWRqYWNlbnQgKi8KLSAgICAgIGh3X21lbW9yeV9jaHVuayAqZGVsZXRlID0gY2h1bmstPm5leHQ7Ci0gICAgICBBU1NFUlQoY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSA9PSBkZWxldGUtPmFkZHJlc3MpOwotICAgICAgY2h1bmstPnNpemUgKz0gZGVsZXRlLT5zaXplOwotICAgICAgY2h1bmstPm5leHQgPSBkZWxldGUtPm5leHQ7Ci0gICAgICB6ZnJlZShkZWxldGUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGNodW5rID0gY2h1bmstPm5leHQ7Ci0gICAgfQotICB9Ci0KLSAgLyogdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5ICovCi0gIGh3X21lbW9yeV9zZXRfYXZhaWxhYmxlKGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpLCBod19tZW1vcnkpOwotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBkZXZpY2VfaW5zdGFuY2VfbWV0aG9kcyBod19tZW1vcnlfaW5zdGFuY2VfbWV0aG9kc1tdID0gewotICB7ICJjbGFpbSIsIGh3X21lbW9yeV9pbnN0YW5jZV9jbGFpbSB9LAotICB7ICJyZWxlYXNlIiwgaHdfbWVtb3J5X2luc3RhbmNlX3JlbGVhc2UgfSwKLSAgeyBOVUxMLCB9LAotfTsKLQotc3RhdGljIGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgY29uc3QgaHdfbWVtb3J5X2luc3RhbmNlX2NhbGxiYWNrcyA9IHsKLSAgaHdfbWVtb3J5X2luc3RhbmNlX2RlbGV0ZSwKLSAgTlVMTCAvKnJlYWQqLywgTlVMTCAvKndyaXRlKi8sIE5VTEwgLypzZWVrKi8sCi0gIGh3X21lbW9yeV9pbnN0YW5jZV9tZXRob2RzCi19OwotCi1zdGF0aWMgZGV2aWNlX2luc3RhbmNlICoKLWh3X21lbW9yeV9jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKLQkJCSAgY29uc3QgY2hhciAqcGF0aCwKLQkJCSAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbShtZSwgTlVMTCwKLQkJCQkgICAgIGRldmljZV9kYXRhKG1lKSwgLyogbm90aGluZyBiZXR0ZXIgKi8KLQkJCQkgICAgIHBhdGgsIGFyZ3MsCi0JCQkJICAgICAmaHdfbWVtb3J5X2luc3RhbmNlX2NhbGxiYWNrcyk7Ci19Ci0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X21lbW9yeV9jYWxsYmFja3MgPSB7Ci0gIHsgaHdfbWVtb3J5X2luaXRfYWRkcmVzcywgfSwKLSAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCi0gIHsgTlVMTCwgfSwgLyogSU8gKi8KLSAgeyBOVUxMLCB9LCAvKiBETUEgKi8KLSAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBOVUxMLCB9LCAvKiB1bml0ICovCi0gIGh3X21lbW9yeV9jcmVhdGVfaW5zdGFuY2UsCi19OwotCi1jb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19tZW1vcnlfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKLSAgeyAibWVtb3J5IiwgaHdfbWVtb3J5X2NyZWF0ZSwgJmh3X21lbW9yeV9jYWxsYmFja3MgfSwKLSAgeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogX0hXX01FTU9SWV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19udnJhbS5jIGIvc2ltL3BwYy9od19udnJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg3ZDA1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaHdfbnZyYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19OVlJBTV9DXwotI2RlZmluZSBfSFdfTlZSQU1fQ18KLQotI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0hXX05WUkFNCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkVfSFdfTlZSQU0gU1RBVElDX0lOTElORQotI2VuZGlmCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLQotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyogREVWSUNFCi0KLQotICAgbnZyYW0gLSBub24tdm9sYXRpbGUgbWVtb3J5IHdpdGggY2xvY2sKLQotCi0gICBERVNDUklQVElPTgotCi0KLSAgIFRoaXMgZGV2aWNlIGltcGxlbWVudHMgYSBzbWFsbCBieXRlIGFkZHJlc3NhYmxlIG5vbi12b2xhdGlsZQotICAgbWVtb3J5LiAgVGhlIHRvcCA4IGJ5dGVzIG9mIHRoaXMgbWVtb3J5IGluY2x1ZGUgYSByZWFsLXRpbWUgY2xvY2suCi0KLQotICAgUFJPUEVSVElFUwotCi0KLSAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gKHJlcXVpcmVkKQotCi0gICBTcGVjaWZ5IHRoZSBhZGRyZXNzL3NpemUgb2YgdGhpcyBkZXZpY2Ugd2l0aGluIGl0cyBwYXJlbnRzIGFkZHJlc3MKLSAgIHNwYWNlLgotCi0KLSAgIHRpbWV6b25lID0gPGludGVnZXI+IChvcHRpb25hbCkKLQotICAgQWRqdXN0bWVudCB0byB0aGUgaG9zdHMgY3VycmVudCBHTVQgKGluIHNlY29uZHMpIHRoYXQgc2hvdWxkIGJlCi0gICBhcHBsaWVkIHdoZW4gdXBkYXRpbmcgdGhlIE5WUkFNJ3MgY2xvY2suICBJZiBubyB0aW1lem9uZSBpcwotICAgc3BlY2lmaWVkLCB6ZXJvIChHTVQgb3IgVUNUKSBpcyBhc3N1bWVkLgotCi0KLSAgICovCi0KLXR5cGVkZWYgc3RydWN0IF9od19udnJhbV9kZXZpY2UgewotICB1bnNpZ25lZDggKm1lbW9yeTsKLSAgdW5zaWduZWQgc2l6ZW9mX21lbW9yeTsKLSNpZmRlZiBIQVZFX1RJTUVfSAotICB0aW1lX3QgaG9zdF90aW1lOwotI2Vsc2UKLSAgbG9uZyBob3N0X3RpbWU7Ci0jZW5kaWYKLSAgdW5zaWduZWQgdGltZXpvbmU7Ci0gIC8qIHVzZWZ1bCAqLwotICB1bnNpZ25lZCBhZGRyX3llYXI7Ci0gIHVuc2lnbmVkIGFkZHJfbW9udGg7Ci0gIHVuc2lnbmVkIGFkZHJfZGF0ZTsKLSAgdW5zaWduZWQgYWRkcl9kYXk7Ci0gIHVuc2lnbmVkIGFkZHJfaG91cjsKLSAgdW5zaWduZWQgYWRkcl9taW51dGVzOwotICB1bnNpZ25lZCBhZGRyX3NlY29uZHM7Ci0gIHVuc2lnbmVkIGFkZHJfY29udHJvbDsKLX0gaHdfbnZyYW1fZGV2aWNlOwotCi1zdGF0aWMgdm9pZCAqCi1od19udnJhbV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkJY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkJY29uc3QgY2hhciAqYXJncykKLXsKLSAgaHdfbnZyYW1fZGV2aWNlICpudnJhbSA9IFpBTExPQyhod19udnJhbV9kZXZpY2UpOwotICByZXR1cm4gbnZyYW07Ci19Ci0KLXR5cGVkZWYgc3RydWN0IF9od19udnJhbV9yZWdfc3BlYyB7Ci0gIHVuc2lnbmVkMzIgYmFzZTsKLSAgdW5zaWduZWQzMiBzaXplOwotfSBod19udnJhbV9yZWdfc3BlYzsKLQotc3RhdGljIHZvaWQKLWh3X252cmFtX2luaXRfYWRkcmVzcyhkZXZpY2UgKm1lKQotewotICBod19udnJhbV9kZXZpY2UgKm52cmFtID0gKGh3X252cmFtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICAKLSAgLyogdXNlIHRoZSBnZW5lcmljIGluaXQgY29kZSB0byBhdHRhY2ggdGhpcyBkZXZpY2UgdG8gaXRzIHBhcmVudCBidXMgKi8KLSAgZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKG1lKTsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBub24gemVybyByZWcgcHJvcGVydHkgYW5kIHVzZSB0aGF0IGFzIHRoZSBkZXZpY2UKLSAgICAgc2l6ZSAqLwotICBpZiAobnZyYW0tPnNpemVvZl9tZW1vcnkgPT0gMCkgewotICAgIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKLSAgICBpbnQgcmVnX25yOwotICAgIGZvciAocmVnX25yID0gMDsKLQkgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCAicmVnIiwgcmVnX25yLCAmcmVnKTsKLQkgcmVnX25yKyspIHsKLSAgICAgIHVuc2lnbmVkIGF0dGFjaF9zaXplOwotICAgICAgaWYgKGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKGRldmljZV9wYXJlbnQobWUpLAotCQkJCSAgICAgJnJlZy5zaXplLCAmYXR0YWNoX3NpemUsCi0JCQkJICAgICBtZSkpIHsKLQludnJhbS0+c2l6ZW9mX21lbW9yeSA9IGF0dGFjaF9zaXplOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobnZyYW0tPnNpemVvZl9tZW1vcnkgPT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgInJlZyBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBub24temVybyBwaHlzLWFkZHI6c2l6ZSB0dXBwbGUiKTsKLSAgICBpZiAobnZyYW0tPnNpemVvZl9tZW1vcnkgPCA4KQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiTlZSQU0gbXVzdCBiZSBhdCBsZWFzdCA4IGJ5dGVzIGluIHNpemUiKTsKLSAgfQotCi0gIC8qIGluaXRpYWxpemUgdGhlIGh3X252cmFtICovCi0gIGlmIChudnJhbS0+bWVtb3J5ID09IE5VTEwpIHsKLSAgICBudnJhbS0+bWVtb3J5ID0gemFsbG9jKG52cmFtLT5zaXplb2ZfbWVtb3J5KTsKLSAgfQotICBlbHNlCi0gICAgbWVtc2V0KG52cmFtLT5tZW1vcnksIG52cmFtLT5zaXplb2ZfbWVtb3J5LCAwKTsKLSAgCi0gIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgInRpbWV6b25lIikgPT0gTlVMTCkKLSAgICBudnJhbS0+dGltZXpvbmUgPSAwOwotICBlbHNlCi0gICAgbnZyYW0tPnRpbWV6b25lID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInRpbWV6b25lIik7Ci0gIAotICBudnJhbS0+YWRkcl95ZWFyID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSAxOwotICBudnJhbS0+YWRkcl9tb250aCA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gMjsKLSAgbnZyYW0tPmFkZHJfZGF0ZSA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gMzsKLSAgbnZyYW0tPmFkZHJfZGF5ID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSA0OwotICBudnJhbS0+YWRkcl9ob3VyID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSA1OwotICBudnJhbS0+YWRkcl9taW51dGVzID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSA2OwotICBudnJhbS0+YWRkcl9zZWNvbmRzID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSA3OwotICBudnJhbS0+YWRkcl9jb250cm9sID0gbnZyYW0tPnNpemVvZl9tZW1vcnkgLSA4OwotICAKLX0KLQotc3RhdGljIGludAotaHdfbnZyYW1fYmNkKGludCB2YWwpCi17Ci0gIHZhbCA9IHZhbCAlIDEwMDsKLSAgaWYgKHZhbCA8IDApCi0gICAgdmFsICs9IDEwMDsKLSAgcmV0dXJuICgodmFsIC8gMTApIDw8IDQpICsgKHZhbCAlIDEwKTsKLX0KLQotCi0vKiBJZiByZWFjaGVkIGFuIHVwZGF0ZSBpbnRlcnZhbCBhbmQgYWxsb3dlZCwgdXBkYXRlIHRoZSBjbG9jayB3aXRoaW4KLSAgIHRoZSBod19udnJhbS4gIFdoaWxlIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgZXZlbnRzCi0gICBpdCBpc24ndCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBIV19OVlJBTSB3aWxsIGhhcmRseSBldmVyIGJlCi0gICByZWZlcmVuY2VkIGFuZCBoZW5jZSB0aGVyZSBpcyBsaXR0bGUgbmVlZCBpbiBrZWVwaW5nIHRoZSBjbG9jawotICAgY29udGludWFsbHkgdXAtdG8tZGF0ZSAqLwotCi1zdGF0aWMgdm9pZAotaHdfbnZyYW1fdXBkYXRlX2Nsb2NrKGh3X252cmFtX2RldmljZSAqbnZyYW0sCi0JCSAgICAgIGNwdSAqcHJvY2Vzc29yKQotewotI2lmZGVmIEhBVkVfVElNRV9ICi0gIGlmICghKG52cmFtLT5tZW1vcnlbbnZyYW0tPmFkZHJfY29udHJvbF0gJiAweGMwKSkgewotICAgIHRpbWVfdCBob3N0X3RpbWUgPSB0aW1lKE5VTEwpOwotICAgIGlmIChudnJhbS0+aG9zdF90aW1lICE9IGhvc3RfdGltZSkgewotICAgICAgdGltZV90IG52dGltZSA9IGhvc3RfdGltZSArIG52cmFtLT50aW1lem9uZTsKLSAgICAgIHN0cnVjdCB0bSAqY2xvY2sgPSBnbXRpbWUoJm52dGltZSk7Ci0gICAgICBudnJhbS0+aG9zdF90aW1lID0gaG9zdF90aW1lOwotICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl95ZWFyXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1feWVhcik7Ci0gICAgICBudnJhbS0+bWVtb3J5W252cmFtLT5hZGRyX21vbnRoXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1fbW9uICsgMSk7Ci0gICAgICBudnJhbS0+bWVtb3J5W252cmFtLT5hZGRyX2RhdGVdID0gaHdfbnZyYW1fYmNkKGNsb2NrLT50bV9tZGF5KTsKLSAgICAgIG52cmFtLT5tZW1vcnlbbnZyYW0tPmFkZHJfZGF5XSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1fd2RheSArIDEpOwotICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl9ob3VyXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1faG91cik7Ci0gICAgICBudnJhbS0+bWVtb3J5W252cmFtLT5hZGRyX21pbnV0ZXNdID0gaHdfbnZyYW1fYmNkKGNsb2NrLT50bV9taW4pOwotICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl9zZWNvbmRzXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1fc2VjKTsKLSAgICB9Ci0gIH0KLSNlbHNlCi0gIGVycm9yKCJmaXhtZSAtIHdoZXJlIGRvIEkgZmluZCBvdXQgR01UXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotaHdfbnZyYW1fc2V0X2Nsb2NrKGh3X252cmFtX2RldmljZSAqbnZyYW0sIGNwdSAqcHJvY2Vzc29yKQotewotICBlcnJvciAoImZpeG1lIC0gaG93IGRvIEkgc2V0IHRoZSBsb2NhbHRpbWVcbiIpOwotfQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X252cmFtX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCi0JCQl2b2lkICpkZXN0LAotCQkJaW50IHNwYWNlLAotCQkJdW5zaWduZWRfd29yZCBhZGRyLAotCQkJdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQljcHUgKnByb2Nlc3NvciwKLQkJCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgaTsKLSAgaHdfbnZyYW1fZGV2aWNlICpudnJhbSA9IChod19udnJhbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgZm9yIChpID0gMDsgaSA8IG5yX2J5dGVzOyBpKyspIHsKLSAgICB1bnNpZ25lZCBhZGRyZXNzID0gKGFkZHIgKyBpKSAlIG52cmFtLT5zaXplb2ZfbWVtb3J5OwotICAgIHVuc2lnbmVkOCBkYXRhID0gbnZyYW0tPm1lbW9yeVthZGRyZXNzXTsKLSAgICBod19udnJhbV91cGRhdGVfY2xvY2sobnZyYW0sIHByb2Nlc3Nvcik7Ci0gICAgKCh1bnNpZ25lZDgqKWRlc3QpW2ldID0gZGF0YTsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotaHdfbnZyYW1faW9fd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCi0JCQkgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJIGludCBzcGFjZSwKLQkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkgY3B1ICpwcm9jZXNzb3IsCi0JCQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGludCBpOwotICBod19udnJhbV9kZXZpY2UgKm52cmFtID0gKGh3X252cmFtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykgewotICAgIHVuc2lnbmVkIGFkZHJlc3MgPSAoYWRkciArIGkpICUgbnZyYW0tPnNpemVvZl9tZW1vcnk7Ci0gICAgdW5zaWduZWQ4IGRhdGEgPSAoKHVuc2lnbmVkOCopc291cmNlKVtpXTsKLSAgICBpZiAoYWRkcmVzcyA9PSBudnJhbS0+YWRkcl9jb250cm9sCi0JJiYgKGRhdGEgJiAweDgwKSA9PSAwCi0JJiYgKG52cmFtLT5tZW1vcnlbYWRkcmVzc10gJiAweDgwKSA9PSAweDgwKQotICAgICAgaHdfbnZyYW1fc2V0X2Nsb2NrKG52cmFtLCBwcm9jZXNzb3IpOwotICAgIGVsc2UKLSAgICAgIGh3X252cmFtX3VwZGF0ZV9jbG9jayhudnJhbSwgcHJvY2Vzc29yKTsKLSAgICBudnJhbS0+bWVtb3J5W2FkZHJlc3NdID0gZGF0YTsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X252cmFtX2NhbGxiYWNrcyA9IHsKLSAgeyBod19udnJhbV9pbml0X2FkZHJlc3MsIH0sCi0gIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLwotICB7IGh3X252cmFtX2lvX3JlYWRfYnVmZmVyLCBod19udnJhbV9pb193cml0ZV9idWZmZXIgfSwgLyogSU8gKi8KLX07Ci0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X252cmFtX2RldmljZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgIm52cmFtIiwgaHdfbnZyYW1fY3JlYXRlLCAmaHdfbnZyYW1fY2FsbGJhY2tzIH0sCi0gIHsgTlVMTCB9LAotfTsKLQotI2VuZGlmIC8qIF9IV19OVlJBTV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19vcGljLmMgYi9zaW0vcHBjL2h3X29waWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxNDM0Ny4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X29waWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MjcgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfT1BJQ19DXwotI2RlZmluZSBfSFdfT1BJQ19DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBERVZJQ0UKLQotCi0gICBvcGljIC0gT3BlbiBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKE9wZW5QSUMpCi0KLQotICAgREVTQ1JJUFRJT04KLQotCi0gICBUaGlzIGRldmljZSBpbXBsZW1lbnRzIHRoZSBjb3JlIG9mIHRoZSBPcGVuUElDIGludGVycnVwdCBjb250cm9sbGVyCi0gICBhcyBkZXNjcmliZWQgaW4gdGhlIE9wZW5QSUMgc3BlY2lmaWNhdGlvbiAxLjIgYW5kIG90aGVyIHJlbGF0ZWQKLSAgIGRvY3VtZW50cy4KLQotICAgVGhlIG1vZGVsIGluY2x1ZGVzOgotCi0gICBvCVVwIHRvIDIwNDggZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMKLQotICAgbwlUaGUgZm91ciBjb3VudCBkb3duIHRpbWVycwotCi0gICBvCVRoZSBmb3VyIGludGVycHJvY2Vzc29yIG11bHRpY2FzdCBpbnRlcnJ1cHRzCi0KLSAgIG8JbXVsdGlwcm9jZXNzb3Igc3VwcG9ydAotCi0gICBvCUZ1bGwgdHJhY2luZyB0byBhc3Npc3QgaGVscCBkZWJ1Z2dpbmcKLQotICAgbwlTdXBwb3J0IGZvciBhbGwgdmFyaWF0aW9ucyBvZiBlZGdlL2xldmVsIHggaGlnaC9sb3cgcG9sYXJpdHkuCi0KLQotCi0gICBQUk9QRVJUSUVTCi0KLQotICAgcmVnID0gPGFkZHJlc3M+IDxzaXplPiAuLi4gKHJlcXVpcmVkKQotCi0gICBEZXRlcm1pbmUgd2hlcmUgdGhlIGRldmljZSBsaXZlcyBpbiB0aGUgcGFyZW50cyBhZGRyZXNzIHNwYWNlLiAgVGhlCi0gICBmaXJzdCA8PGFkZHJlc3M+PiA8PHNpemU+PiBwYWlyIHNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGludGVycnVwdCBkZXN0aW5hdGlvbiB1bml0ICh3aGljaCBtaWdodCBjb250YWluIGFuIGludGVycnVwdCBzb3VyY2UKLSAgIHVuaXQpIHdoaWxlIHN1Y2Nlc3NpdmUgcmVnIGVudHJpZXMgc3BlY2lmeSBhZGRpdGlvbmFsIGludGVycnVwdAotICAgc291cmNlIHVuaXRzLgotCi0gICBOb3RlIHRoYXQgZm9yIGFuIDw8b3BpYz4+IGRldmljZSBhdHRhY2hlZCB0byBhIDw8cGNpPj4gYnVzLCB0aGUKLSAgIGZpcnN0IDw8cmVnPj4gZW50cnkgbWF5IG5lZWQgdG8gYmUgaWdub3JlZCBpdCB3aWxsIGJlIHRoZSBhZGRyZXNzCi0gICBvZiB0aGUgZGV2aWNlcyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KLQotCi0gICBpbnRlcnJ1cHQtcmFuZ2VzID0gPGludC1udW1iZXI+IDxyYW5nZT4gLi4uIChyZXF1aXJlZCkKLQotICAgQSBsaXN0IG9mIHBhaXJzLiAgRWFjaCBwYWlyIGNvcnJlc3BvbmRzIHRvIGEgYmxvY2sgb2YgaW50ZXJydXB0Ci0gICBzb3VyY2UgdW5pdHMgKHRoZSBhZGRyZXNzIG9mIHdoaWNoIGJlaW5nIHNwZWNpZmllZCBieSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgcmVnIHR1cHBsZSkuICA8PGludC1udW1iZXI+PiBpcyB0aGUgbnVtYmVyIG9mIHRoZQotICAgZmlyc3QgaW50ZXJydXB0IGluIHRoZSBibG9jayB3aGlsZSA8PHJhbmdlPj4gaXMgdGhlIG51bWJlciBvZgotICAgaW50ZXJydXB0cyBpbiB0aGUgYmxvY2suCi0KLQotICAgdGltZXItZnJlcXVlbmN5ID0gPGludGVnZXI+ICAob3B0aW9uYWwpCi0KLSAgIElmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdGltZXIgZnJlcXVlbmN5Ci0gICByZXBvcnRpbmcgcmVnaXN0ZXIuICBCeSBkZWZhdWx0IGEgdmFsdWUgb2YgMSBIWiBpcyB1c2VkLiAgVGhlIHZhbHVlCi0gICBpcyBhcmJpdHJhcnksIHRoZSB0aW1lcnMgYXJlIGFsd2F5cyB1cGRhdGVkIG9uY2UgcGVyIG1hY2hpbmUgY3ljbGUuCi0KLQotICAgdmVuZG9yLWlkZW50aWZpY2F0aW9uID0gPGludGVnZXI+ICAob3B0aW9uYWwpCi0KLSAgIElmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgdmVuZG9yCi0gICBpZGVudGlmaWNhdGlvbiByZWdpc3RlciBpcyByZWFkLgotCi0KLSAgIEVYQU1QTEVTCi0KLQotICAgU2VlIHRoZSB0ZXN0IHN1aXRlIGRpcmVjdG9yeToKLQotICAgfCAgcHNpbS10ZXN0L2h3LW9waWMKLQotCi0gICBCVUdTCi0KLSAgIEZvciBhbiBPUElDIGNvbnRyb2xsZXIgYXR0YWNoZWQgdG8gYSBQQ0kgYnVzLCBpdCBpcyBub3QgY2xlYXIgd2hhdAotICAgdGhlIHZhbHVlIG9mIHRoZSA8PHJlZz4+IGFuZCA8PGludGVycnVwdC1yYW5nZXM+PiBwcm9wZXJ0aWVzIHNob3VsZAotICAgYmUuICBJbiBwYXJ0aWN1bGFyLCB0aGUgUENJIGZpcm13YXJlIGJpbmRpbmdzIHJlcXVpcmUgdGhlIGZpcnN0Ci0gICB2YWx1ZSBvZiB0aGUgPDxyZWc+PiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBkZXZpY2VzIGNvbmZpZ3VyYXRpb24KLSAgIGFkZHJlc3Mgd2hpbGUgdGhlIE9wZW5QSUMgYmluZGluZ3MgcmVxdWlyZSB0aGF0IHNhbWUgZW50cnkgdG8KLSAgIHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgdGhlIEludGVycnVwdCBEZWxpdmVyeSBVbml0LiAgVGhpcwotICAgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBhbmQsIGlmIHByZXNlbnQsIGlnbm9yZXMgYW55Ci0gICBjb25maWd1cmF0aW9uIGFkZHJlc3MgKGFuZCBpdHMgY29ycmVzcG9uZGluZyA8PGludGVycnVwdC1yYW5nZXM+PgotICAgZW50cnkpLgotCi0gICBUaGUgT3BlblBJQyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSBjb250cm9sbGVyIHRvIGJlIGZhaXIgd2hlbgotICAgZGlzdHJpYnV0aW5nIGludGVycnVwdHMgYmV0d2VlbiBwcm9jZXNzb3JzLiAgQXQgcHJlc2VudCB0aGUKLSAgIGFsZ29yaXRobSB1c2VkIGlzbid0IGZhaXIuICBJdCBpcyBiaWFzZWQgdG93YXJkcyBwcm9jZXNzb3IgemVyby4KLQotICAgVGhlIE9wZW5QSUMgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhIDgyNTkgcGFzcyB0aHJvdWdoIG1vZGUuICBUaGlzCi0gICBpcyBub3Qgc3VwcG9ydGVkLgotCi0KLSAgIFJFRkVSRU5DRVMKLQotICAgCi0gICBQb3dlclBDIE11bHRpcHJvY2Vzc29yIEludGVycnVwdCBDb250cm9sbGVyIChNUElDKSwgSmFudWFyeSAxOSwKLSAgIDE5OTYuIEF2YWlsYWJsZSBmcm9tIElCTS4KLQotCi0gICBUaGUgT3BlbiBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKFBJQykgUmVnaXN0ZXIgSW50ZXJmYWNlCi0gICBTcGVjaWZpY2F0aW9uIFJldmlzaW9uIDEuMi4gIElzc3VlIERhdGU6IE9wY3RvYmVyIDE5OTUuICBBdmFpbGFibGUKLSAgIHNvbWV3aGVyZSBvbiBBTUQncyB3ZWIgcGFnZSAoaHR0cDovL3d3dy5hbWQuY29tLykKLQotCi0gICBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENvbW1vbiBIYXJkd2FyZSBSZWZlcmVuY2UgUGxhdGZvcm0gKENIUlApCi0gICBTeXN0ZW0gYmluZGluZ3MgdG86IElFRUUgU3RkIDEyNzUtMTk5NCBTdGFuZGFyZCBmb3IgQm9vdAotICAgKEluaXRpYWxpemF0aW9uLCBDb25maWd1cmF0aW9uKSBGaXJtd2FyZS4gIFJldmlzaW9uIDEuMmIgKElOVEVSSU0KLSAgIERSQUZUKS4gIEFwcmlsIDIyLCAxOTk2LiAgQXZhaWxhYmxlIG9uIHRoZSBPcGVuIEZpcm13YXJlIHdlYiBzaXRlCi0gICBodHRwOi8vcGxheWdyb3VuZC5zdW4uY29tL3AxMjc1Ly4KLQotCi0gICAqLwotCi0KLS8qIGZvcndhcmQgdHlwZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X29waWNfZGV2aWNlIGh3X29waWNfZGV2aWNlOwotCi0KLS8qIGJvdW5kcyAqLwotCi1lbnVtIHsKLSAgbWF4X25yX2ludGVycnVwdF9zb3VyY2VzID0gMjA0OCwKLSAgbWF4X25yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMgPSAzMiwKLSAgbWF4X25yX3Rhc2tfcHJpb3JpdGllcyA9IDE2LAotfTsKLQotCi1lbnVtIHsKLSAgb3BpY19hbGlnbm1lbnQgPSAxNiwKLX07Ci0KLQotLyogZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQotZW51bSB7Ci0gIGdjcjBfODI1OV9iaXQgPSAweDIwMDAwMDAwLAotICBnY3IwX3Jlc2V0X2JpdCA9IDB4ODAwMDAwMDAsCi19OwotCi0KLS8qIG9mZnNldHMgYW5kIHNpemVzICovCi0KLWVudW0gewotICBpZHVfaXN1X2Jhc2UgPSAweDEwMDAwLAotICBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrID0gMzIsCi0gIGlkdV9wZXJfcHJvY2Vzc29yX3JlZ2lzdGVyX2Jhc2UgPSAweDIwMDAwLAotICBzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sgPSAweDEwMDAsCi0gIGlkdV90aW1lcl9iYXNlID0gMHgwMTEwMCwKLSAgc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrID0gMHgwMDA0MCwKLX07Ci0KLQotLyogSW50ZXJydXB0IHNvdXJjZXMgKi8KLQotZW51bSB7Ci0gIGlzdV9tYXNrX2JpdCA9IDB4ODAwMDAwMDAsCi0gIGlzdV9hY3RpdmVfYml0ID0gMHg0MDAwMDAwMCwKLSAgaXN1X211bHRpY2FzdF9iaXQgPSAweDIwMDAwMDAwLAotICBpc3VfcG9zaXRpdmVfcG9sYXJpdHlfYml0ID0gMHgwMDgwMDAwMCwKLSAgaXN1X2xldmVsX3RyaWdnZXJlZF9iaXQgPSAweDAwNDAwMDAwLAotICBpc3VfcHJpb3JpdHlfc2hpZnQgPSAxNiwKLSAgaXN1X3ZlY3Rvcl9iaXRzID0gMHgwMDAwMDBmZiwKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX29waWNfaW50ZXJydXB0X3NvdXJjZSB7Ci0gIHVuc2lnbmVkIGlzX21hc2tlZDsgLyogbGVmdCBpbiBwbGFjZSAqLwotICB1bnNpZ25lZCBpc19tdWx0aWNhc3Q7IC8qIGxlZnQgaW4gcGxhY2UgKi8KLSAgdW5zaWduZWQgaXNfcG9zaXRpdmVfcG9sYXJpdHk7IC8qIGxlZnQgaW4gcGxhY2UgKi8KLSAgdW5zaWduZWQgaXNfbGV2ZWxfdHJpZ2dlcmVkOyAvKiBsZWZ0IGluIHBsYWNlICovCi0gIHVuc2lnbmVkIHByaW9yaXR5OwotICB1bnNpZ25lZCB2ZWN0b3I7Ci0gIC8qIG1pc2MgKi8KLSAgaW50IG5yOwotICB1bnNpZ25lZCBkZXN0aW5hdGlvbjsKLSAgdW5zaWduZWQgcGVuZGluZzsKLSAgdW5zaWduZWQgaW5fc2VydmljZTsKLX0gb3BpY19pbnRlcnJ1cHRfc291cmNlOwotCi0KLS8qIGludGVycnVwdCBkZXN0aW5hdGlvbnMgKG5vcm1hbGx5IHByb2Nlc3NvcnMpICovCi0KLXR5cGVkZWYgc3RydWN0IF9vcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiB7Ci0gIGludCBucjsKLSAgdW5zaWduZWQgYmFzZV9wcmlvcml0eTsKLSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICpjdXJyZW50X3BlbmRpbmc7Ci0gIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqY3VycmVudF9pbl9zZXJ2aWNlOwotICB1bnNpZ25lZCBiaXQ7Ci0gIGludCBpbml0X3BvcnQ7Ci0gIGludCBpbnRyX3BvcnQ7Ci19IG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uOwotCi0KLS8qIGFkZHJlc3MgbWFwIGRlc2NyaXB0b3JzICovCi0KLXR5cGVkZWYgc3RydWN0IF9vcGljX2lzdV9ibG9jayB7IC8qIGludGVycnVwdCBzb3VyY2UgdW5pdCBibG9jayAqLwotICBpbnQgc3BhY2U7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgdW5zaWduZWQgc2l6ZTsKLSAgdW5zaWduZWRfY2VsbCBpbnRfbnVtYmVyOwotICB1bnNpZ25lZF9jZWxsIHJhbmdlOwotICBpbnQgcmVnOwotfSBvcGljX2lzdV9ibG9jazsKLQotCi10eXBlZGVmIHN0cnVjdCBfb3BpY19pZHUgeyAvKiBpbnRlcnJ1cHQgZGVsaXZlcnkgdW5pdCAqLwotICBpbnQgcmVnOwotICBpbnQgc3BhY2U7Ci0gIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKLSAgdW5zaWduZWQgc2l6ZTsKLX0gb3BpY19pZHU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIGJhZCAqLwotICBpbnZhbGlkX29waWNfcmVnaXN0ZXIsCi0gIC8qIGludGVycnVwdCBzb3VyY2UgKi8KLSAgaW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyLAotICBpbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyLAotICAvKiB0aW1lcnMgKi8KLSAgdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3RlciwKLSAgdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIsCi0gIHRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlciwKLSAgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyLAotICB0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyLAotICAvKiBpbnRlci1wcm9jZXNzb3IgaW50ZXJydXB0cyAqLwotICBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIsCi0gIGlwaV9OX2Rpc3BhdGNoX3JlZ2lzdGVyLAotICAvKiBnbG9iYWwgY29uZmlndXJhdGlvbiAqLwotICBzcHVyaW91c192ZWN0b3JfcmVnaXN0ZXIsCi0gIHByb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyLAotICB2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXIsCi0gIGdsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX04sCi0gIGZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX04sCi0gIC8qIHBlciBwcm9jZXNzb3IgKi8KLSAgZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OLAotICBpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTiwKLSAgY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX04sCi19IG9waWNfcmVnaXN0ZXI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW9waWNfcmVnaXN0ZXJfbmFtZShvcGljX3JlZ2lzdGVyIHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIGludmFsaWRfb3BpY19yZWdpc3RlcjogcmV0dXJuICJpbnZhbGlkX29waWNfcmVnaXN0ZXIiOwotICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjogcmV0dXJuICJpbnRlcnJ1cHRfc291cmNlX05fZGVzdGluYXRpb25fcmVnaXN0ZXIiOwotICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6IHJldHVybiAiaW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlciI7Ci0gIGNhc2UgdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyIjsKLSAgY2FzZSB0aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlciI7Ci0gIGNhc2UgdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyOiByZXR1cm4gInRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlciI7Ci0gIGNhc2UgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOiByZXR1cm4gInRpbWVyX05fY3VycmVudF9jb3VudF9yZWdpc3RlciI7Ci0gIGNhc2UgdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyIjsKLSAgY2FzZSBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6IHJldHVybiAiaXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyIjsKLSAgY2FzZSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjogcmV0dXJuICJpcGlfTl9kaXNwYXRjaF9yZWdpc3RlciI7Ci0gIGNhc2Ugc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOiByZXR1cm4gInNwdXJpb3VzX3ZlY3Rvcl9yZWdpc3RlciI7Ci0gIGNhc2UgcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXI6IHJldHVybiAicHJvY2Vzc29yX2luaXRfcmVnaXN0ZXIiOwotICBjYXNlIHZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3RlcjogcmV0dXJuICJ2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXIiOwotICBjYXNlIGdsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX046IHJldHVybiAiZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTiI7Ci0gIGNhc2UgZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTjogcmV0dXJuICJmZWF0dXJlX3JlcG9ydGluZ19yZWdpc3Rlcl9OIjsKLSAgY2FzZSBlbmRfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyX046IHJldHVybiAiZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OIjsKLSAgY2FzZSBpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTjogcmV0dXJuICJpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTiI7Ci0gIGNhc2UgY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX046IHJldHVybiAiY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX04iOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLQotLyogdGltZXJzICovCi0KLXR5cGVkZWYgc3RydWN0IF9vcGljX3RpbWVyIHsKLSAgaW50IG5yOwotICBkZXZpY2UgKm1lOyAvKiBmaW5kIG15IHdheSBob21lICovCi0gIGh3X29waWNfZGV2aWNlICpvcGljOyAvKiBkaXR0byAqLwotICB1bnNpZ25lZCBiYXNlX2NvdW50OwotICBpbnQgaW5oaWJpdGVkOwotICBzaWduZWQ2NCBjb3VudDsgLyogKk9OTFkqIGlmIGluaGliaXRlZCAqLwotICBldmVudF9lbnRyeV90YWcgdGltZW91dF9ldmVudDsKLSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHRfc291cmNlOwotfSBvcGljX3RpbWVyOwotCi0KLS8qIHRoZSBPUElDICovCi0KLXN0cnVjdCBfaHdfb3BpY19kZXZpY2UgewotCi0gIC8qIHZlbmRvciBpZCAqLwotICB1bnNpZ25lZCB2ZW5kb3JfaWRlbnRpZmljYXRpb247Ci0KLSAgLyogaW50ZXJydXB0IGRlc3RpbmF0aW9ucyAtIHByb2Nlc3NvcnMgKi8KLSAgaW50IG5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnM7Ci0gIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICppbnRlcnJ1cHRfZGVzdGluYXRpb247Ci0gIHVuc2lnbmVkIHNpemVvZl9pbnRlcnJ1cHRfZGVzdGluYXRpb247Ci0KLSAgLyogYm9ndXMgaW50ZXJydXB0cyAqLwotICBpbnQgc3B1cmlvdXNfdmVjdG9yOwotCi0gIC8qIGludGVycnVwdCBzb3VyY2VzIC0gZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZSB1bml0cyArIGV4dHJhIGludGVybmFsIG9uZXMgKi8KLSAgaW50IG5yX2ludGVycnVwdF9zb3VyY2VzOwotICBvcGljX2ludGVycnVwdF9zb3VyY2UgKmludGVycnVwdF9zb3VyY2U7Ci0gIHVuc2lnbmVkIHNpemVvZl9pbnRlcnJ1cHRfc291cmNlOwotCi0gIC8qIGV4dGVybmFsIGludGVycnVwdHMgKi8KLSAgaW50IG5yX2V4dGVybmFsX2ludGVycnVwdHM7Ci0gIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZTsKLQotICAvKiBpbnRlci1wcm9jZXNzb3ItaW50ZXJydXB0cyAqLwotICBpbnQgbnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0czsKLSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlOwotCi0gIC8qIHRpbWVycyAqLwotICBpbnQgbnJfdGltZXJfaW50ZXJydXB0czsKLSAgb3BpY190aW1lciAqdGltZXI7Ci0gIHVuc2lnbmVkIHNpemVvZl90aW1lcjsKLSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICp0aW1lcl9pbnRlcnJ1cHRfc291cmNlOwotICB1bnNpZ25lZCB0aW1lcl9mcmVxdWVuY3k7Ci0KLSAgLyogaW5pdCByZWdpc3RlciAqLwotICB1bnNpZ25lZDMyIGluaXQ7Ci0KLSAgLyogYWRkcmVzcyBtYXBzICovCi0gIG9waWNfaWR1IGlkdTsKLSAgaW50IG5yX2lzdV9ibG9ja3M7Ci0gIG9waWNfaXN1X2Jsb2NrICppc3VfYmxvY2s7Ci19OwotCi0KLXN0YXRpYyB2b2lkCi1od19vcGljX2luaXRfZGF0YShkZXZpY2UgKm1lKQotewotICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBpbnQgaXNiOwotICBpbnQgaWR1X3JlZzsKLSAgaW50IG5yX2lzdV9ibG9ja3M7Ci0gIGludCBpOwotCi0gIC8qIGRldGVybWluZSB0aGUgZmlyc3QgdmFsaWQgcmVnIHByb3BlcnR5IGVudHJ5ICh0aGVyZSBjb3VsZCBiZQotICAgICBsZWFkaW5nIHJlZyBlbnRyaWVzIHdpdGggaW52YWxpZCAoemVybykgc2l6ZSBmaWVsZHMpIGFuZCB0aGUKLSAgICAgbnVtYmVyIG9mIGlzdSBlbnRyaWVzIGZvdW5kIGluIHRoZSByZWcgcHJvcGVydHkuICovCi0gIGlkdV9yZWcgPSAwOwotICBucl9pc3VfYmxvY2tzID0gMDsKLSAgd2hpbGUgKDEpIHsKLSAgICByZWdfcHJvcGVydHlfc3BlYyB1bml0OwotICAgIGludCBhdHRhY2hfc3BhY2U7Ci0gICAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKLSAgICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKLSAgICBpZiAoIWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIGlkdV9yZWcgKyBucl9pc3VfYmxvY2tzLAotCQkJCQkmdW5pdCkpCi0gICAgICBicmVhazsKLSAgICBpZiAobnJfaXN1X2Jsb2NrcyA+IDAKLQl8fCAoZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZ1bml0LmFkZHJlc3MsCi0JCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwgJmF0dGFjaF9hZGRyZXNzLAotCQkJCQkgICAgIG1lKQotCSAgICAmJiBkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2VfcGFyZW50KG1lKSwgJnVuaXQuc2l6ZSwKLQkJCQkJICAmYXR0YWNoX3NpemUsCi0JCQkJCSAgbWUpKSkgewotICAgICAgLyogd2UgY291bnQgYW55IHRoaW5nIG9uY2Ugd2UndmUgZm91bmQgb25lIHZhbGlkIGFkZHJlc3Mvc2l6ZSBwYWlyICovCi0gICAgICBucl9pc3VfYmxvY2tzICs9IDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWR1X3JlZyArPSAxOwotICAgIH0KLSAgfQotCi0gIC8qIGRldGVybWluZSB0aGUgbnVtYmVyIGFuZCBsb2NhdGlvbiBvZiB0aGUgbXVsdGlwbGUgaW50ZXJydXB0Ci0gICAgIHNvdXJjZSB1bml0cyBhbmQgdGhlIHNpbmdsZSBpbnRlcnJ1cHQgZGVsaXZlcnkgdW5pdCAqLwotICBpZiAob3BpYy0+aXN1X2Jsb2NrID09IE5VTEwpIHsKLSAgICBpbnQgcmVnX25yOwotICAgIG9waWMtPm5yX2lzdV9ibG9ja3MgPSBucl9pc3VfYmxvY2tzOwotICAgIG9waWMtPmlzdV9ibG9jayA9IHphbGxvYyhzaXplb2Yob3BpY19pc3VfYmxvY2spICogb3BpYy0+bnJfaXN1X2Jsb2Nrcyk7Ci0gICAgaXNiID0gMDsKLSAgICByZWdfbnIgPSBpZHVfcmVnOwotICAgIHdoaWxlIChpc2IgPCBvcGljLT5ucl9pc3VfYmxvY2tzKSB7Ci0gICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7Ci0gICAgICBpZiAoIWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZ19uciwgJnJlZykpCi0JZGV2aWNlX2Vycm9yKG1lLCAicmVnIHByb3BlcnR5IG1pc3NpbmcgZW50cnkgbnVtYmVyICVkIiwgcmVnX25yKTsKLSAgICAgIG9waWMtPmlzdV9ibG9ja1tpc2JdLnJlZyA9IHJlZ19ucjsKLSAgICAgIGlmICghZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZyZWcuYWRkcmVzcywKLQkJCQkJICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5zcGFjZSwKLQkJCQkJICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzLAotCQkJCQkgICAgbWUpCi0JICB8fCAhZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlX3BhcmVudChtZSksICZyZWcuc2l6ZSwKLQkJCQkJICZvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplLAotCQkJCQkgbWUpKSB7Ci0JZGV2aWNlX2Vycm9yKG1lLCAicmVnIHByb3BlcnR5IGVudHJ5ICVkIGludmFsaWQiLCByZWdfbnIpOwotICAgICAgfQotICAgICAgaWYgKCFkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAiaW50ZXJydXB0LXJhbmdlcyIsCi0JCQkJCSAgICAgIHJlZ19uciAqIDIsCi0JCQkJCSAgICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5pbnRfbnVtYmVyKQotCSAgfHwgIWRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkobWUsICJpbnRlcnJ1cHQtcmFuZ2VzIiwKLQkJCQkJCSByZWdfbnIgKiAyICsgMSwKLQkJCQkJCSAmb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpKQotCWRldmljZV9lcnJvcihtZSwgIm1pc3Npbmcgb3IgaW52YWxpZCBpbnRlcnJ1cHQtcmFuZ2VzIHByb3BlcnR5IGVudHJ5ICVkIiwgcmVnX25yKTsKLSAgICAgIC8qIGZpcnN0IHJlZyBlbnRyeSBzcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgYm90aCB0aGUgSURVIGFuZCB0aGUKLSAgICAgICAgIGZpcnN0IHNldCBvZiBJU1UgcmVnaXN0ZXJzLCBhZGp1c3QgdGhpbmdzIGFjY29yZGluZ2x5ICovCi0gICAgICBpZiAocmVnX25yID09IGlkdV9yZWcpIHsKLQlvcGljLT5pZHUucmVnID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmVnOwotCW9waWMtPmlkdS5zcGFjZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnNwYWNlOwotCW9waWMtPmlkdS5hZGRyZXNzID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzczsKLQlvcGljLT5pZHUuc2l6ZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnNpemU7Ci0Jb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzcyArPSBpZHVfaXN1X2Jhc2U7Ci0Jb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc2l6ZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnJhbmdlICogKDE2ICsgMTYpOwotICAgICAgfQotICAgICAgLyogd2FzIHRoaXMgYSB2YWxpZCByZWcgZW50cnk/ICovCi0gICAgICBpZiAob3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UgPT0gMCkgewotCW9waWMtPm5yX2lzdV9ibG9ja3MgLT0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCW9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMgKz0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2U7Ci0JaXNiKys7Ci0gICAgICB9Ci0gICAgICByZWdfbnIrKzsKLSAgICB9Ci0gIH0KLSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZSB1bml0IGJsb2NrIC0gZWZmZWN0aXZlIG51bWJlciBvZiBibG9ja3MgJWRcbiIsCi0JCShpbnQpb3BpYy0+bnJfaXN1X2Jsb2NrcykpOwotCi0KLSAgLyogdGhlIG51bWJlciBvZiBvdGhlciBpbnRlcnJ1cHRzICovCi0gIG9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMgPSA0OwotICBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzID0gNDsKLQotCi0gIC8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXJzICovCi0gIGlmIChvcGljLT5pbnRlcnJ1cHRfc291cmNlICE9IE5VTEwpIHsKLSAgICBtZW1zZXQob3BpYy0+aW50ZXJydXB0X3NvdXJjZSwgMCwgb3BpYy0+c2l6ZW9mX2ludGVycnVwdF9zb3VyY2UpOwotICB9Ci0gIGVsc2UgewotICAgIG9waWMtPm5yX2ludGVycnVwdF9zb3VyY2VzID0gKG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMKLQkJCQkgICsgb3BpYy0+bnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0cwotCQkJCSAgKyBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzKTsKLSAgICBpZiAob3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXMgPiBtYXhfbnJfaW50ZXJydXB0X3NvdXJjZXMpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJudW1iZXIgb2YgaW50ZXJydXB0IHNvdXJjZXMgZXhjZWVkZWQiKTsKLSAgICBvcGljLT5zaXplb2ZfaW50ZXJydXB0X3NvdXJjZSA9IChzaXplb2Yob3BpY19pbnRlcnJ1cHRfc291cmNlKQotCQkJCSAgICAgKiBvcGljLT5ucl9pbnRlcnJ1cHRfc291cmNlcyk7Ci0gICAgb3BpYy0+aW50ZXJydXB0X3NvdXJjZSA9IHphbGxvYyhvcGljLT5zaXplb2ZfaW50ZXJydXB0X3NvdXJjZSk7Ci0gICAgb3BpYy0+ZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZSA9IG9waWMtPmludGVycnVwdF9zb3VyY2U7Ci0gICAgb3BpYy0+aW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0X3NvdXJjZSA9IChvcGljLT5leHRlcm5hbF9pbnRlcnJ1cHRfc291cmNlCi0JCQkJCSAgICAgKyBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKLSAgICBvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlID0gKG9waWMtPmludGVycHJvY2Vzc29yX2ludGVycnVwdF9zb3VyY2UKLQkJCQkgICAgKyBvcGljLT5ucl9pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRzKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXM7IGkrKykgewotICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc291cmNlID0gJm9waWMtPmludGVycnVwdF9zb3VyY2VbaV07Ci0gICAgc291cmNlLT5uciA9IGk7Ci0gICAgc291cmNlLT5pc19tYXNrZWQgPSBpc3VfbWFza19iaXQ7Ci0gIH0KLSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZXMgLSBleHRlcm5hbCAlZCwgdGltZXIgJWQsIGlwaSAlZCwgdG90YWwgJWRcbiIsCi0JCW9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMsCi0JCW9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMsCi0JCW9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMsCi0JCW9waWMtPm5yX2ludGVycnVwdF9zb3VyY2VzKSk7Ci0KLQotICAvKiB0aW1lcnMgb3IgaW50ZXJwcm9jZXNzb3IgaW50ZXJydXB0cyAqLwotICBpZiAob3BpYy0+dGltZXIgIT0gTlVMTCkKLSAgICBtZW1zZXQob3BpYy0+dGltZXIsIDAsIG9waWMtPnNpemVvZl90aW1lcik7Ci0gIGVsc2UgewotICAgIG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMgPSA0OwotICAgIG9waWMtPnNpemVvZl90aW1lciA9IHNpemVvZihvcGljX3RpbWVyKSAqIG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHM7Ci0gICAgb3BpYy0+dGltZXIgPSB6YWxsb2Mob3BpYy0+c2l6ZW9mX3RpbWVyKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0czsgaSsrKSB7Ci0gICAgb3BpY190aW1lciAqdGltZXIgPSAmb3BpYy0+dGltZXJbaV07Ci0gICAgdGltZXItPm5yID0gaTsKLSAgICB0aW1lci0+bWUgPSBtZTsKLSAgICB0aW1lci0+b3BpYyA9IG9waWM7Ci0gICAgdGltZXItPmluaGliaXRlZCA9IDE7Ci0gICAgdGltZXItPmludGVycnVwdF9zb3VyY2UgPSAmb3BpYy0+dGltZXJfaW50ZXJydXB0X3NvdXJjZVtpXTsKLSAgfQotICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJ0aW1lci1mcmVxdWVuY3kiKSkKLSAgICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAidGltZXItZnJlcXVlbmN5Iik7Ci0gIGVsc2UKLSAgICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSAxOwotCi0KLSAgLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgaW50ZXJydXB0IGRlc3RpbmF0aW9uIHJlZ2lzdGVycyAqLwotICBpZiAob3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uICE9IE5VTEwpIHsKLSAgICBtZW1zZXQob3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uLCAwLCBvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKLSAgfQotICBlbHNlIHsKLSAgICBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKLSAgICBvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uID0gKHNpemVvZihvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbikKLQkJCQkJICAqIG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOwotICAgIG9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbiA9IHphbGxvYyhvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKLSAgICBpZiAob3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyA+IG1heF9ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibnVtYmVyIG9mIGludGVycnVwdCBkZXN0aW5hdGlvbnMgZXhjZWVkZWQiKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7Ci0gICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOwotICAgIGRlc3QtPmJpdCA9ICgxIDw8IGkpOwotICAgIGRlc3QtPm5yID0gaTsKLSAgICBkZXN0LT5pbml0X3BvcnQgPSAoZGV2aWNlX2ludGVycnVwdF9kZWNvZGUobWUsICJpbml0MCIsIG91dHB1dF9wb3J0KQotCQkgICAgICAgKyBpKTsKLSAgICBkZXN0LT5pbnRyX3BvcnQgPSAoZGV2aWNlX2ludGVycnVwdF9kZWNvZGUobWUsICJpbnRyMCIsIG91dHB1dF9wb3J0KQotCQkgICAgICAgKyBpKTsKLSAgICBkZXN0LT5iYXNlX3ByaW9yaXR5ID0gbWF4X25yX3Rhc2tfcHJpb3JpdGllcyAtIDE7Ci0gIH0KLSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGRlc3RpbmF0aW9ucyAtIHRvdGFsICVkXG4iLAotCQkoaW50KW9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpKTsKLSAgCi0KLSAgLyogdmVyaWZ5IGFuZCBwcmludCBvdXQgdGhlIElTVSdzICovCi0gIGZvciAoaXNiID0gMDsgaXNiIDwgb3BpYy0+bnJfaXN1X2Jsb2NrczsgaXNiKyspIHsKLSAgICB1bnNpZ25lZCBjb3JyZWN0X3NpemU7Ci0gICAgaWYgKChvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzICUgb3BpY19hbGlnbm1lbnQpICE9IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcnJ1cHQgc291cmNlIHVuaXQgJWQgYWRkcmVzcyBub3QgYWxpZ25lZCB0byAlZCBieXRlIGJvdW5kYXJ5IiwKLQkJICAgaXNiLCBvcGljX2FsaWdubWVudCk7Ci0gICAgY29ycmVjdF9zaXplID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UgKiBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrOwotICAgIGlmIChvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplICE9IGNvcnJlY3Rfc2l6ZSkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCBzb3VyY2UgdW5pdCAlZCAocmVnICVkKSBoYXMgYW4gaW5jb3JyZWN0IHNpemUsIHNob3VsZCBiZSAweCV4IiwKLQkJICAgaXNiLCBvcGljLT5pc3VfYmxvY2tbaXNiXS5yZWcsIGNvcnJlY3Rfc2l6ZSk7Ci0gICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZSB1bml0IGJsb2NrICVsZCAtIGFkZHJlc3MgJWQ6MHglbHgsIHNpemUgMHglbHgsIGludC1udW1iZXIgJWxkLCByYW5nZSAlbGRcbiIsCi0JCSAgKGxvbmcpaXNiLAotCQkgIChpbnQpb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc3BhY2UsCi0JCSAgKHVuc2lnbmVkIGxvbmcpb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzcywKLQkJICAodW5zaWduZWQgbG9uZylvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplLAotCQkgIChsb25nKW9waWMtPmlzdV9ibG9ja1tpc2JdLmludF9udW1iZXIsCi0JCSAgKGxvbmcpb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpKTsKLSAgfQotCi0KLSAgLyogdmVyaWZ5IGFuZCBwcmludCBvdXQgdGhlIElEVSAqLwotICB7Ci0gICAgdW5zaWduZWQgY29ycmVjdF9zaXplOwotICAgIHVuc2lnbmVkIGFsdGVybmF0ZV9zaXplOwotICAgIGlmICgob3BpYy0+aWR1LmFkZHJlc3MgJSBvcGljX2FsaWdubWVudCkgIT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCBkZWxpdmVyeSB1bml0IG5vdCBhbGlnbmVkIHRvICVkIGJ5dGUgYm91bmRhcnkiLAotCQkgICBvcGljX2FsaWdubWVudCk7Ci0gICAgY29ycmVjdF9zaXplID0gKGlkdV9wZXJfcHJvY2Vzc29yX3JlZ2lzdGVyX2Jhc2UKLQkJICAgICsgKHNpemVvZl9pZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9ibG9jawotCQkgICAgICAgKiBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKSk7Ci0gICAgYWx0ZXJuYXRlX3NpemUgPSAoaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmFzZQotCQkgICAgICArIChzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sKLQkJCSAqIG1heF9ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKSk7Ci0gICAgaWYgKG9waWMtPmlkdS5zaXplICE9IGNvcnJlY3Rfc2l6ZQotCSYmIG9waWMtPmlkdS5zaXplICE9IGFsdGVybmF0ZV9zaXplKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJydXB0IGRlbGl2ZXJ5IHVuaXQgaGFzIGluY29ycmVjdCBzaXplLCBzaG91bGQgYmUgMHgleCBvciAweCV4IiwKLQkJICAgY29ycmVjdF9zaXplLCBhbHRlcm5hdGVfc2l6ZSk7Ci0gICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGRlbGl2ZXJ5IHVuaXQgLSBhZGRyZXNzICVkOjB4JWx4LCBzaXplIDB4JWx4XG4iLAotCQkgIChpbnQpb3BpYy0+aWR1LnNwYWNlLAotCQkgICh1bnNpZ25lZCBsb25nKW9waWMtPmlkdS5hZGRyZXNzLAotCQkgICh1bnNpZ25lZCBsb25nKW9waWMtPmlkdS5zaXplKSk7Ci0gIH0KLQotICAvKiBpbml0aWFsaXplIHRoZSBpbml0IGludGVycnVwdHMgKi8KLSAgb3BpYy0+aW5pdCA9IDA7Ci0KLQotICAvKiB2ZW5kb3IgaWRlbnQgKi8KLSAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAidmVuZG9yLWlkZW50aWZpY2F0aW9uIikgIT0gTlVMTCkKLSAgICBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb24gPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAidmVuZG9yLWlkZW50aWZpY2F0aW9uIik7Ci0gIGVsc2UKLSAgICBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb24gPSAwOwotCi0gIC8qIG1pc2MgcmVnaXN0ZXJzICovCi0gIG9waWMtPnNwdXJpb3VzX3ZlY3RvciA9IDB4ZmY7Ci0KLX0KLQotCi0vKiBpbnRlcnJ1cHQgcmVsYXRlZCBhY3Rpb25zICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlcnRfaW50ZXJydXB0KGRldmljZSAqbWUsCi0JCSBod19vcGljX2RldmljZSAqb3BpYywKLQkJIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQotewotICBBU1NFUlQoZGVzdCA+PSBvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb24pOwotICBBU1NFUlQoZGVzdCA8IG9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbiArIG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOwotICBEVFJBQ0Uob3BpYywgKCJhc3NlcnQgaW50ZXJydXB0IC0gaW50ciBwb3J0ICVkXG4iLCBkZXN0LT5pbnRyX3BvcnQpKTsKLSAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgZGVzdC0+aW50cl9wb3J0LCAxLCBOVUxMLCAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmVnYXRlX2ludGVycnVwdChkZXZpY2UgKm1lLAotCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCSBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqZGVzdCkKLXsKLSAgQVNTRVJUKGRlc3QgPj0gb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKLSAgQVNTRVJUKGRlc3QgPCBvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb24gKyBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKTsKLSAgRFRSQUNFKG9waWMsICgibmVnYXRlIGludGVycnVwdCAtIGludHIgcG9ydCAlZFxuIiwgZGVzdC0+aW50cl9wb3J0KSk7Ci0gIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIGRlc3QtPmludHJfcG9ydCwgMCwgTlVMTCwgMCk7Ci19Ci0KLQotc3RhdGljIGludAotY2FuX2RlbGl2ZXIoZGV2aWNlICptZSwKLQkgICAgb3BpY19pbnRlcnJ1cHRfc291cmNlICpzb3VyY2UsCi0JICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQotewotICByZXR1cm4gKHNvdXJjZSAhPSBOVUxMICYmIGRlc3QgIT0gTlVMTAotCSAgJiYgc291cmNlLT5wcmlvcml0eSA+IGRlc3QtPmJhc2VfcHJpb3JpdHkKLQkgICYmIChkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgPT0gTlVMTAotCSAgICAgIHx8IHNvdXJjZS0+cHJpb3JpdHkgPiBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPnByaW9yaXR5KSk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1kZWxpdmVyX3BlbmRpbmcoZGV2aWNlICptZSwKLQkJaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCW9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQotewotICBBU1NFUlQoY2FuX2RlbGl2ZXIobWUsIGRlc3QtPmN1cnJlbnRfcGVuZGluZywgZGVzdCkpOwotICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgPSBkZXN0LT5jdXJyZW50X3BlbmRpbmc7Ci0gIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSB8PSBkZXN0LT5iaXQ7Ci0gIGlmICghZGVzdC0+Y3VycmVudF9wZW5kaW5nLT5pc19sZXZlbF90cmlnZ2VyZWQpIHsKLSAgICBpZiAoZGVzdC0+Y3VycmVudF9wZW5kaW5nLT5pc19tdWx0aWNhc3QpCi0gICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgJj0gfmRlc3QtPmJpdDsKLSAgICBlbHNlCi0gICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgPSAwOwotICB9Ci0gIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IE5VTEw7Ci0gIG5lZ2F0ZV9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOwotICByZXR1cm4gZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3I7Ci19Ci0KLQotdHlwZWRlZiBlbnVtIHsKLSAgcGVuZGluZ19pbnRlcnJ1cHQsCi0gIGluX3NlcnZpY2VfaW50ZXJydXB0LAotfSBpbnRlcnJ1cHRfY2xhc3M7Ci0KLXN0YXRpYyBvcGljX2ludGVycnVwdF9zb3VyY2UgKgotZmluZF9pbnRlcnJ1cHRfZm9yX2Rlc3QoZGV2aWNlICptZSwKLQkJCWh3X29waWNfZGV2aWNlICpvcGljLAotCQkJb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QsCi0JCQlpbnRlcnJ1cHRfY2xhc3MgY2xhc3MpCi17Ci0gIGludCBpOwotICBvcGljX2ludGVycnVwdF9zb3VyY2UgKnBlbmRpbmcgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXM7IGkrKykgewotICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc3JjID0gJm9waWMtPmludGVycnVwdF9zb3VyY2VbaV07Ci0gICAgLyogaXMgdGhpcyBhIHBvdGVudGlhbCBoaXQ/ICovCi0gICAgc3dpdGNoIChjbGFzcykgewotICAgIGNhc2UgaW5fc2VydmljZV9pbnRlcnJ1cHQ6Ci0gICAgICBpZiAoKHNyYy0+aW5fc2VydmljZSAmIGRlc3QtPmJpdCkgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcGVuZGluZ19pbnRlcnJ1cHQ6Ci0gICAgICBpZiAoKHNyYy0+cGVuZGluZyAmIGRlc3QtPmJpdCkgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBzZWUgaWYgaXQgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKi8KLSAgICBpZiAocGVuZGluZyA9PSBOVUxMKQotICAgICAgcGVuZGluZyA9IHNyYzsKLSAgICBlbHNlIGlmIChzcmMtPnByaW9yaXR5ID4gcGVuZGluZy0+cHJpb3JpdHkpCi0gICAgICBwZW5kaW5nID0gc3JjOwotICB9Ci0gIHJldHVybiBwZW5kaW5nOwotfQotCi0KLXN0YXRpYyBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqCi1maW5kX2xvd2VzdF9kZXN0KGRldmljZSAqbWUsIAotCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCSBvcGljX2ludGVycnVwdF9zb3VyY2UgKnNyYykKLXsKLSAgaW50IGk7Ci0gIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpsb3dlc3QgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7Ci0gICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOwotICAgIGlmIChzcmMtPmRlc3RpbmF0aW9uICYgZGVzdC0+Yml0KSB7Ci0gICAgICBpZiAoZGVzdC0+YmFzZV9wcmlvcml0eSA8IHNyYy0+cHJpb3JpdHkpIHsKLQlpZiAobG93ZXN0ID09IE5VTEwpCi0JICBsb3dlc3QgPSBkZXN0OwotCWVsc2UgaWYgKGxvd2VzdC0+YmFzZV9wcmlvcml0eSA+IGRlc3QtPmJhc2VfcHJpb3JpdHkpCi0JICBsb3dlc3QgPSBkZXN0OwotCWVsc2UgaWYgKGxvd2VzdC0+Y3VycmVudF9pbl9zZXJ2aWNlICE9IE5VTEwKLQkJICYmIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSA9PSBOVUxMKQotCSAgbG93ZXN0ID0gZGVzdDsgLyogbm90IGRvaW5nIGFueXRoaW5nICovCi0JZWxzZSBpZiAobG93ZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgIT0gTlVMTAotCQkgJiYgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlICE9IE5VTEwKLQkJICYmIChsb3dlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkKLQkJICAgICA+IGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkpKQotCSAgbG93ZXN0ID0gZGVzdDsgLyogbGVzcyB1cmdlbnQgKi8KLQkvKiBGSVhNRSAtIG5lZWQgdG8gYmUgbW9yZSBmYWlyICovCQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbG93ZXN0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfaW50ZXJydXB0KGRldmljZSAqbWUsCi0JCSBod19vcGljX2RldmljZSAqb3BpYywKLQkJIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc3JjLAotCQkgaW50IGFzc2VydGVkKQotewotICBpZiAoc3JjLT5pc19tYXNrZWQpIHsKLSAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgbWFza2VkXG4iLCBzcmMtPm5yKSk7Ci0gIH0KLSAgZWxzZSBpZiAoc3JjLT5pc19tdWx0aWNhc3QpIHsKLSAgICAvKiBhbHdheXMgdHJ5IHRvIGRlbGl2ZXIgbXVsdGljYXN0IGludGVycnVwdHMgLSBqdXN0IGVhc2llciAqLwotICAgIGludCBpOwotICAgIEFTU0VSVCghc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQpOwotICAgIEFTU0VSVChzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5KTsKLSAgICBBU1NFUlQoYXNzZXJ0ZWQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zOyBpKyspIHsKLSAgICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltpXTsKLSAgICAgIGlmIChzcmMtPmRlc3RpbmF0aW9uICYgZGVzdC0+Yml0KSB7Ci0JaWYgKHNyYy0+cGVuZGluZyAmIGRlc3QtPmJpdCkgewotCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHN0aWxsIHBlbmRpbmcgdG8gJWRcbiIsCi0JCQlzcmMtPm5yLCBkZXN0LT5ucikpOwotCX0KLQllbHNlIGlmIChjYW5fZGVsaXZlcihtZSwgc3JjLCBkZXN0KSkgewotCSAgZGVzdC0+Y3VycmVudF9wZW5kaW5nID0gc3JjOwotCSAgc3JjLT5wZW5kaW5nIHw9IGRlc3QtPmJpdDsKLQkgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOwotCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHRvICVkXG4iLAotCQkJc3JjLT5uciwgZGVzdC0+bnIpKTsKLQl9Ci0JZWxzZSB7Ci0JICBzcmMtPnBlbmRpbmcgfD0gZGVzdC0+Yml0OwotCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHBlbmRpbmcgdG8gJWRcbiIsCi0JCQlzcmMtPm5yLCBkZXN0LT5ucikpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSBpZiAoc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQKLQkgICAmJiBzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5Ci0JICAgJiYgIWFzc2VydGVkKSB7Ci0gICAgaWYgKHNyYy0+cGVuZGluZykKLSAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlZCAtIGlnbm9yZSB3aXRoZHJhd24gKGFjdGl2ZSBoaWdoKVxuIiwKLQkJICAgIHNyYy0+bnIpKTsKLSAgICBlbHNlCi0gICAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgbG93IGxldmVsIChhY3RpdmUgaGlnaClcbiIsCi0JCSAgICBzcmMtPm5yKSk7Ci0gICAgQVNTRVJUKCFzcmMtPmlzX211bHRpY2FzdCk7Ci0gICAgc3JjLT5wZW5kaW5nID0gMDsKLSAgfQotICBlbHNlIGlmIChzcmMtPmlzX2xldmVsX3RyaWdnZXJlZAotCSAgICYmICFzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5Ci0JICAgJiYgYXNzZXJ0ZWQpIHsKLSAgICBpZiAoc3JjLT5wZW5kaW5nKQotICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIHdpdGhkcmF3biAoYWN0aXZlIGxvdylcbiIsCi0JCSAgICBzcmMtPm5yKSk7Ci0gICAgZWxzZQotICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIGhpZ2ggbGV2ZWwgKGFjdGl2ZSBsb3cpXG4iLAotCQkgICAgc3JjLT5ucikpOwotCi0gICAgQVNTRVJUKCFzcmMtPmlzX211bHRpY2FzdCk7Ci0gICAgc3JjLT5wZW5kaW5nID0gMDsKLSAgfQotICBlbHNlIGlmICghc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQKLQkgICAmJiBzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5Ci0JICAgJiYgIWFzc2VydGVkKSB7Ci0gICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIGZhbGxpbmcgZWRnZSAocG9zaXRpdmUgZWRnZSB0cmlnZXJlZClcbiIsCi0JCSAgc3JjLT5ucikpOwotICB9Ci0gIGVsc2UgaWYgKCFzcmMtPmlzX2xldmVsX3RyaWdnZXJlZAotCSAgICYmICFzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5Ci0JICAgJiYgYXNzZXJ0ZWQpIHsKLSAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgcmlzaW5nIGVkZ2UgKG5lZ2F0aXZlIGVkZ2UgdHJpZ2VyZWQpXG4iLAotCQkgIHNyYy0+bnIpKTsKLSAgfQotICBlbHNlIGlmIChzcmMtPmluX3NlcnZpY2UgIT0gMCkgewotICAgIC8qIGxlYXZlIHRoZSBpbnRlcnJ1cHQgd2hlcmUgaXQgaXMgKi8KLSAgICBBU1NFUlQoIXNyYy0+aXNfbXVsdGljYXN0KTsKLSAgICBBU1NFUlQoc3JjLT5wZW5kaW5nID09IDAgfHwgc3JjLT5wZW5kaW5nID09IHNyYy0+aW5fc2VydmljZSk7Ci0gICAgc3JjLT5wZW5kaW5nID0gc3JjLT5pbl9zZXJ2aWNlOwotICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlbGQgLSBpZ25vcmUgYWxyZWFkeSBpbiBzZXJ2aWNlIHRvIDB4JWx4XG4iLAotCQkgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+aW5fc2VydmljZSkpOwotICB9Ci0gIGVsc2UgaWYgKHNyYy0+cGVuZGluZyAhPSAwKSB7Ci0gICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVsZCAtIGlnbm9yZSBzdGlsbCBwZW5kaW5nIHRvIDB4JWx4XG4iLAotCQkgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+cGVuZGluZykpOwotICB9Ci0gIGVsc2UgewotICAgIC8qIGRlbGl2ZXJ5IGlzIG5lZWRlZCAqLwotICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gZmluZF9sb3dlc3RfZGVzdChtZSwgb3BpYywgc3JjKTsKLSAgICBpZiAoY2FuX2RlbGl2ZXIobWUsIHNyYywgZGVzdCkpIHsKLSAgICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IHNyYzsKLSAgICAgIHNyYy0+cGVuZGluZyA9IGRlc3QtPmJpdDsKLSAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlZCAtIGRlbGl2ZXJlZCB0byAlZFxuIiwgc3JjLT5uciwgZGVzdC0+bnIpKTsKLSAgICAgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHNyYy0+cGVuZGluZyA9IHNyYy0+ZGVzdGluYXRpb247IC8qIGFueSBjYW4gdGFrZSB0aGlzICovCi0gICAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWxkIC0gcGVuZGluZyB0byAweCVseFxuIiwKLQkJICAgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+cGVuZGluZykpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQKLWRvX2ludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OX3JlYWQoZGV2aWNlICptZSwKLQkJCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCQkgaW50IGRlc3RfbnIpCi17Ci0gIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltkZXN0X25yXTsKLSAgdW5zaWduZWQgdmVjdG9yOwotCi0gIEFTU0VSVChkZXN0X25yID49IDAgJiYgZGVzdF9uciA8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOwotICBBU1NFUlQoZGVzdF9uciA9PSBkZXN0LT5ucik7Ci0KLSAgLyogdHJ5IHRoZSBjdXJyZW50IHBlbmRpbmcgKi8KLSAgaWYgKGNhbl9kZWxpdmVyKG1lLCBkZXN0LT5jdXJyZW50X3BlbmRpbmcsIGRlc3QpKSB7Ci0gICAgQVNTRVJUKGRlc3QtPmN1cnJlbnRfcGVuZGluZy0+cGVuZGluZyAmIGRlc3QtPmJpdCk7Ci0gICAgdmVjdG9yID0gZGVsaXZlcl9wZW5kaW5nKG1lLCBvcGljLCBkZXN0KTsKLSAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgYWNrICVkIC0gZW50ZXJpbmcgJWQgKHBlbmRpbmcpIC0gdmVjdG9yICVkICglZCksIHByaW9yaXR5ICVkXG4iLAotCQkgIGRlc3QtPm5yLAotCQkgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+bnIsCi0JCSAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IsIHZlY3RvciwKLQkJICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPnByaW9yaXR5KSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogdHJ5IGZvciBzb21ldGhpbmcgZWxzZSAqLwotICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IGZpbmRfaW50ZXJydXB0X2Zvcl9kZXN0KG1lLCBvcGljLCBkZXN0LCBwZW5kaW5nX2ludGVycnVwdCk7Ci0gICAgaWYgKGNhbl9kZWxpdmVyKG1lLCBkZXN0LT5jdXJyZW50X3BlbmRpbmcsIGRlc3QpKSB7Ci0gICAgICB2ZWN0b3IgPSBkZWxpdmVyX3BlbmRpbmcobWUsIG9waWMsIGRlc3QpOyAgICAKLSAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCBhY2sgJWQgLSBlbnRlcmluZyAlZCAobm90IHBlbmRpbmcpIC0gdmVjdG9yICVkICglZCksIHByaW9yaXR5ICVkXG4iLAotCQkgICAgZGVzdC0+bnIsCi0JCSAgICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPm5yLAotCQkgICAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IsIHZlY3RvciwKLQkJICAgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmcgPSBOVUxMOwotICAgICAgdmVjdG9yID0gb3BpYy0+c3B1cmlvdXNfdmVjdG9yOwotICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGFjayAlZCAtIHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwKLQkJICAgIGRlc3QtPm5yLCB2ZWN0b3IpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZlY3RvcjsKLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OX3dyaXRlKGRldmljZSAqbWUsCi0JCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkgICAgIGludCBkZXN0X25yLAotCQkJCSAgICAgdW5zaWduZWQgcmVnKQotewotICBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqZGVzdCA9ICZvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25bZGVzdF9ucl07Ci0KLSAgQVNTRVJUKGRlc3RfbnIgPj0gMCAmJiBkZXN0X25yIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyk7Ci0gIEFTU0VSVChkZXN0X25yID09IGRlc3QtPm5yKTsKLQotICAvKiBjaGVjayB0aGUgdmFsdWUgd3JpdHRlbiBpcyB6ZXJvICovCi0gIGlmIChyZWcgIT0gMCkgewotICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIGlnbm9yaW5nIG5vbnplcm8gdmFsdWVcbiIsIGRlc3QtPm5yKSk7Ci0gIH0KLQotICAvKiB1c2VyIGRvaW5nIHdpZXJkIHRoaW5ncz8gKi8KLSAgaWYgKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSA9PSBOVUxMKSB7Ci0gICAgRFRSQUNFKG9waWMsICgiZW9pICVkIC0gc3RyYW5nZSwgbm8gY3VycmVudCBpbnRlcnJ1cHRcbiIsIGRlc3QtPm5yKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogYW4gaW50ZXJuYWwgc3R1ZmYgdXA/ICovCi0gIGlmICghKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSAmIGRlc3QtPmJpdCkpIHsKLSAgICBkZXZpY2VfZXJyb3IobWUsICJlb2kgJWQgLSBjdXJyZW50IGludGVycnVwdCBub3QgaW4gc2VydmljZSIsIGRlc3QtPm5yKTsKLSAgfQotCi0gIC8qIGZpbmQgd2hhdCB3YXMgcHJvYmFibHkgdGhlIHByZXZpb3VzIGluIHNlcnZpY2UgaW50ZXJydXB0ICovCi0gIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSAmPSB+ZGVzdC0+Yml0OwotICBEVFJBQ0Uob3BpYywgKCJlb2kgJWQgLSBlbmRpbmcgJWQgLSBwcmlvcml0eSAlZCwgdmVjdG9yICVkXG4iLAotCQlkZXN0LT5uciwKLQkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT5uciwKLQkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT5wcmlvcml0eSwKLQkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IpKTsKLSAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlID0gZmluZF9pbnRlcnJ1cHRfZm9yX2Rlc3QobWUsIG9waWMsIGRlc3QsIGluX3NlcnZpY2VfaW50ZXJydXB0KTsKLSAgaWYgKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSAhPSBOVUxMKQotICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIHJlc3VtaW5nICVkIC0gcHJpb3JpdHkgJWQsIHZlY3RvciAlZFxuIiwKLQkJICBkZXN0LT5uciwKLQkJICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPm5yLAotCQkgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHksCi0JCSAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IpKTsKLSAgZWxzZQotICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIHJlc3VtaW5nIG5vbmVcbiIsIGRlc3QtPm5yKSk7Ci0KLSAgLyogY2hlY2sgdG8gc2VlIGlmIHRoYXQgc2hvdWxkbid0IGJlIGludGVycnVwdGVkICovCi0gIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IGZpbmRfaW50ZXJydXB0X2Zvcl9kZXN0KG1lLCBvcGljLCBkZXN0LCBwZW5kaW5nX2ludGVycnVwdCk7Ci0gIGlmIChjYW5fZGVsaXZlcihtZSwgZGVzdC0+Y3VycmVudF9wZW5kaW5nLCBkZXN0KSkgewotICAgIEFTU0VSVChkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgJiBkZXN0LT5iaXQpOwotICAgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOwotICB9Ci0gIGVsc2UgewotICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IE5VTEw7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZGVjb2RlX29waWNfYWRkcmVzcyhkZXZpY2UgKm1lLAotCQkgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCSAgICBpbnQgc3BhY2UsCi0JCSAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCi0JCSAgICB1bnNpZ25lZCBucl9ieXRlcywKLQkJICAgIG9waWNfcmVnaXN0ZXIgKnR5cGUsCi0JCSAgICBpbnQgKmluZGV4KQotewotICBpbnQgaXNiID0gMDsKLQotICAvKiBpcyB0aGUgc2l6ZSB2YWxpZD8gKi8KLSAgaWYgKG5yX2J5dGVzICE9IDQpIHsKLSAgICAqdHlwZSA9IGludmFsaWRfb3BpY19yZWdpc3RlcjsKLSAgICAqaW5kZXggPSAtMTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiB0cnkgZm9yIGEgcGVyLXByb2Nlc3NvciByZWdpc3RlciB3aXRoaW4gdGhlIGludGVycnVwdCBkZWxpdmVyeQotICAgICB1bml0ICovCi0gIGlmIChzcGFjZSA9PSBvcGljLT5pZHUuc3BhY2UKLSAgICAgICYmIGFkZHJlc3MgPj0gKG9waWMtPmlkdS5hZGRyZXNzICsgaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmFzZSkKLSAgICAgICYmIGFkZHJlc3MgPCAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9iYXNlCi0JCSAgICArIChzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sKLQkJICAgICAgICogb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucykpKSB7Ci0gICAgdW5zaWduZWRfd29yZCBibG9ja19vZmZzZXQgPSAoYWRkcmVzcwotCQkJCSAgLSBvcGljLT5pZHUuYWRkcmVzcwotCQkJCSAgLSBpZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9iYXNlKTsKLSAgICB1bnNpZ25lZF93b3JkIG9mZnNldCA9IGJsb2NrX29mZnNldCAlIHNpemVvZl9pZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9ibG9jazsKLSAgICAqaW5kZXggPSBibG9ja19vZmZzZXQgLyBzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2s7Ci0gICAgc3dpdGNoIChvZmZzZXQpIHsKLSAgICBjYXNlIDB4MDQwOgotICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDUwOgotICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDYwOgotICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDcwOgotICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDgwOgotICAgICAgKnR5cGUgPSBjdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwYTA6Ci0gICAgICAqdHlwZSA9IGludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDBiMDoKLSAgICAgICp0eXBlID0gZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIERUUkFDRShvcGljLCAoInBlci1wcm9jZXNzb3IgcmVnaXN0ZXIgJWQ6MHglbHggLSAlc1slZF1cbiIsCi0JCSAgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCi0JCSAgb3BpY19yZWdpc3Rlcl9uYW1lKCp0eXBlKSwKLQkJICAqaW5kZXgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiB0cnkgZm9yIGFuIGludGVycnVwdCBzb3VyY2UgdW5pdCAqLwotICBmb3IgKGlzYiA9IDA7IGlzYiA8IG9waWMtPm5yX2lzdV9ibG9ja3M7IGlzYisrKSB7Ci0gICAgaWYgKG9waWMtPmlzdV9ibG9ja1tpc2JdLnNwYWNlID09IHNwYWNlCi0JJiYgYWRkcmVzcyA+PSBvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzCi0JJiYgYWRkcmVzcyA8IChvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzICsgb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc2l6ZSkpIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgYmxvY2tfb2Zmc2V0ID0gYWRkcmVzcyAtIG9waWMtPmlzdV9ibG9ja1tpc2JdLmFkZHJlc3M7Ci0gICAgICB1bnNpZ25lZF93b3JkIG9mZnNldCA9IGJsb2NrX29mZnNldCAlIHNpemVvZl9pc3VfcmVnaXN0ZXJfYmxvY2s7Ci0gICAgICAqaW5kZXggPSAob3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcgotCQkrIChibG9ja19vZmZzZXQgLyBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrKSk7Ci0gICAgICBzd2l0Y2ggKG9mZnNldCkgewotICAgICAgY2FzZSAweDAwOgotCSp0eXBlID0gaW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjsKLQlicmVhazsKLSAgICAgIGNhc2UgMHgxMDoKLQkqdHlwZSA9IGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JKnR5cGUgPSBpbnZhbGlkX29waWNfcmVnaXN0ZXI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBEVFJBQ0Uob3BpYywgKCJpc3UgcmVnaXN0ZXIgJWQ6MHglbHggLSAlc1slZF1cbiIsCi0JCSAgICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKLQkJICAgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCi0JCSAgICAqaW5kZXgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvKiB0cnkgZm9yIGEgdGltZXIgKi8KLSAgaWYgKHNwYWNlID09IG9waWMtPmlkdS5zcGFjZQotICAgICAgJiYgYWRkcmVzcyA+PSAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfdGltZXJfYmFzZSkKLSAgICAgICYmIGFkZHJlc3MgPCAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfdGltZXJfYmFzZQotCQkgICAgKyBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzICogc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrKSkgewotICAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0ID0gYWRkcmVzcyAlIHNpemVvZl90aW1lcl9yZWdpc3Rlcl9ibG9jazsKLSAgICAqaW5kZXggPSAoKGFkZHJlc3MgLSBvcGljLT5pZHUuYWRkcmVzcyAtIGlkdV90aW1lcl9iYXNlKQotCSAgICAgIC8gc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrKTsKLSAgICBzd2l0Y2ggKG9mZnNldCkgewotICAgIGNhc2UgMHgwMDoKLSAgICAgICp0eXBlID0gdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDEwOgotICAgICAgKnR5cGUgPSB0aW1lcl9OX2Jhc2VfY291bnRfcmVnaXN0ZXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MjA6Ci0gICAgICAqdHlwZSA9IHRpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDMwOgotICAgICAgKnR5cGUgPSB0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIERUUkFDRShvcGljLCAoInRpbWVyIHJlZ2lzdGVyICVkOjB4JWx4IC0gJXNbJWRdXG4iLAotCQkgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAotCQkgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCi0JCSAgKmluZGV4KSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogZmluYWxseSBzb21lIG90aGVyIG1pc2MgZ2xvYmFsIHJlZ2lzdGVyICovCi0gIGlmIChzcGFjZSA9PSBvcGljLT5pZHUuc3BhY2UKLSAgICAgICYmIGFkZHJlc3MgPj0gb3BpYy0+aWR1LmFkZHJlc3MKLSAgICAgICYmIGFkZHJlc3MgPCBvcGljLT5pZHUuYWRkcmVzcyArIG9waWMtPmlkdS5zaXplKSB7Ci0gICAgdW5zaWduZWRfd29yZCBibG9ja19vZmZzZXQgPSBhZGRyZXNzIC0gb3BpYy0+aWR1LmFkZHJlc3M7Ci0gICAgc3dpdGNoIChibG9ja19vZmZzZXQpIHsKLSAgICBjYXNlIDB4MDEwZjA6Ci0gICAgICAqdHlwZSA9IHRpbWVyX2ZyZXF1ZW5jeV9yZXBvcnRpbmdfcmVnaXN0ZXI7Ci0gICAgICAqaW5kZXggPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwMTBlMDoKLSAgICAgICp0eXBlID0gc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOwotICAgICAgKmluZGV4ID0gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDEwZDA6Ci0gICAgY2FzZSAweDAxMGMwOgotICAgIGNhc2UgMHgwMTBiMDoKLSAgICBjYXNlIDB4MDEwYTA6Ci0gICAgICAqdHlwZSA9IGlwaV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IChibG9ja19vZmZzZXQgLSAweDAxMGEwKSAvIDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDAxMDkwOgotICAgICAgKnR5cGUgPSBwcm9jZXNzb3JfaW5pdF9yZWdpc3RlcjsKLSAgICAgICppbmRleCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDAxMDgwOgotICAgICAgKnR5cGUgPSB2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXI7Ci0gICAgICAqaW5kZXggPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwMTAyMDoKLSAgICAgICp0eXBlID0gZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTjsKLSAgICAgICppbmRleCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDEwMDA6Ci0gICAgICAqdHlwZSA9IGZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX047Ci0gICAgICAqaW5kZXggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOwotICAgICAgKmluZGV4ID0gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgRFRSQUNFKG9waWMsICgiZ2xvYmFsIHJlZ2lzdGVyICVkOjB4JWx4IC0gJXNbJWRdXG4iLAotCQkgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAotCQkgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCi0JCSAgKmluZGV4KSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogbm90aGluZyBtYXRjaGVkICovCi0gICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOwotICBEVFJBQ0Uob3BpYywgKCJpbnZhbGlkIHJlZ2lzdGVyICVkOjB4JWx4XG4iLAotCQlzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcykpOwotICByZXR1cm47Ci19Ci0KLQotLyogUHJvY2Vzc29yIGluaXQgcmVnaXN0ZXI6Ci0KLSAgIFRoZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgKG9uZSBwZXIgcHJvY2Vzc29yKSBhcmUgZGlyZWN0bHkgd2lyZWQgdG8KLSAgIG91dHB1dCAiaW5pdCIgaW50ZXJydXB0IHBvcnRzLiAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWRvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQlod19vcGljX2RldmljZSAqb3BpYykKLXsKLSAgdW5zaWduZWQgcmVnID0gb3BpYy0+aW5pdDsKLSAgRFRSQUNFKG9waWMsICgicHJvY2Vzc29yIGluaXQgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAotCQkobG9uZylyZWcpKTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCi0JCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCSB1bnNpZ25lZCByZWcpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7Ci0gICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOwotICAgIGlmICgocmVnICYgZGVzdC0+Yml0KSAhPSAob3BpYy0+aW5pdCAmIGRlc3QtPmJpdCkpIHsKLSAgICAgIGlmIChyZWcgJiBkZXN0LT5iaXQpIHsKLQlEVFJBQ0Uob3BpYywgKCJwcm9jZXNzb3IgaW5pdCByZWdpc3RlciAtIHdyaXRlIDB4JWx4IC0gYXNzZXJ0aW5nIGluaXQlZFxuIiwKLQkJICAgICAgKGxvbmcpcmVnLCBpKSk7Ci0Jb3BpYy0+aW5pdCB8PSBkZXN0LT5iaXQ7Ci0JZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgZGVzdC0+aW5pdF9wb3J0LCAxLCBOVUxMLCAwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCURUUkFDRShvcGljLCAoInByb2Nlc3NvciBpbml0IHJlZ2lzdGVyIC0gd3JpdGUgMHglbHggLSBuZWdhdGluZyBpbml0JWRcbiIsCi0JCSAgICAgIChsb25nKXJlZywgaSkpOwotCW9waWMtPmluaXQgJj0gfmRlc3QtPmJpdDsKLQlkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCBkZXN0LT5pbml0X3BvcnQsIDAsIE5VTEwsIDApOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLQotLyogSW50ZXJydXB0IFNvdXJjZSBWZWN0b3IvUHJpb3JpdHkgUmVnaXN0ZXI6ICovCi0KLXN0YXRpYyB1bnNpZ25lZAotcmVhZF92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIoZGV2aWNlICptZSwKLQkJCSAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJICAgICAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHQsCi0JCQkgICAgICBjb25zdCBjaGFyICpyZWdfbmFtZSwKLQkJCSAgICAgIGludCByZWdfaW5kZXgpCi17Ci0gIHVuc2lnbmVkIHJlZzsKLSAgcmVnID0gMDsKLSAgcmVnIHw9IGludGVycnVwdC0+aXNfbWFza2VkOwotICByZWcgfD0gKGludGVycnVwdC0+aW5fc2VydmljZSB8fCBpbnRlcnJ1cHQtPnBlbmRpbmcKLQkgID8gaXN1X2FjdGl2ZV9iaXQgOiAwKTsgLyogYWN0aXZlICovCi0gIHJlZyB8PSBpbnRlcnJ1cHQtPmlzX211bHRpY2FzdDsKLSAgcmVnIHw9IGludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHk7Ci0gIHJlZyB8PSBpbnRlcnJ1cHQtPmlzX2xldmVsX3RyaWdnZXJlZDsgLyogc2Vuc2U/ICovCi0gIHJlZyB8PSBpbnRlcnJ1cHQtPnByaW9yaXR5IDw8IGlzdV9wcmlvcml0eV9zaGlmdDsKLSAgcmVnIHw9IGludGVycnVwdC0+dmVjdG9yOwotICBEVFJBQ0Uob3BpYywgKCIlcyAlZCB2ZWN0b3IvcHJpb3JpdHkgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAotCQlyZWdfbmFtZSwgcmVnX2luZGV4LCAodW5zaWduZWQgbG9uZylyZWcpKTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1kb19pbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkJCSAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJCSAgICBpbnQgaW5kZXgpCi17Ci0gIHVuc2lnbmVkIHJlZzsKLSAgQVNTRVJUKGluZGV4IDwgb3BpYy0+bnJfZXh0ZXJuYWxfaW50ZXJydXB0cyk7Ci0gIHJlZyA9IHJlYWRfdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyKG1lLCBvcGljLAotCQkJCSAgICAgICZvcGljLT5pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgICAgICAiaW50ZXJydXB0IHNvdXJjZSIsIGluZGV4KTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcihkZXZpY2UgKm1lLAotCQkJICAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJICAgICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqaW50ZXJydXB0LAotCQkJICAgICAgIHVuc2lnbmVkIHJlZywKLQkJCSAgICAgICBjb25zdCBjaGFyICpyZWdfbmFtZSwKLQkJCSAgICAgICBpbnQgcmVnX2luZGV4KQotewotICBpbnRlcnJ1cHQtPmlzX21hc2tlZCA9IChyZWcgJiBpc3VfbWFza19iaXQpOwotICBpbnRlcnJ1cHQtPmlzX211bHRpY2FzdCA9IChyZWcgJiBpc3VfbXVsdGljYXN0X2JpdCk7Ci0gIGludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHkgPSAocmVnICYgaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdCk7Ci0gIGludGVycnVwdC0+aXNfbGV2ZWxfdHJpZ2dlcmVkID0gKHJlZyAmIGlzdV9sZXZlbF90cmlnZ2VyZWRfYml0KTsKLSAgaW50ZXJydXB0LT5wcmlvcml0eSA9ICgocmVnID4+IGlzdV9wcmlvcml0eV9zaGlmdCkKLQkJCSAlIG1heF9ucl90YXNrX3ByaW9yaXRpZXMpOwotICBpbnRlcnJ1cHQtPnZlY3RvciA9IChyZWcgJiBpc3VfdmVjdG9yX2JpdHMpOwotICBEVFJBQ0Uob3BpYywgKCIlcyAlZCB2ZWN0b3IvcHJpb3JpdHkgcmVnaXN0ZXIgLSB3cml0ZSAweCVseCAtICVzJXMlcy1wb2xhcml0eSwgJXMtdHJpZ2dlcmVkLCBwcmlvcml0eSAlbGQgdmVjdG9yICVsZFxuIiwKLQkJcmVnX25hbWUsCi0JCXJlZ19pbmRleCwKLQkJKHVuc2lnbmVkIGxvbmcpcmVnLAotCQlpbnRlcnJ1cHQtPmlzX21hc2tlZCA/ICJtYXNrZWQsICIgOiAiIiwKLQkJaW50ZXJydXB0LT5pc19tdWx0aWNhc3QgPyAibXVsdGljYXN0LCAiIDogIiIsCi0JCWludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHkgPyAicG9zaXRpdmUiIDogIm5lZ2F0aXZlIiwKLQkJaW50ZXJydXB0LT5pc19sZXZlbF90cmlnZ2VyZWQgPyAibGV2ZWwiIDogImVkZ2UiLAotCQkobG9uZylpbnRlcnJ1cHQtPnByaW9yaXR5LAotCQkobG9uZylpbnRlcnJ1cHQtPnZlY3RvcikpOwotfQotCi1zdGF0aWMgdm9pZAotZG9faW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAotCQkJCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJCSAgICAgaW50IGluZGV4LAotCQkJCQkJICAgICB1bnNpZ25lZCByZWcpCi17Ci0gIEFTU0VSVChpbmRleCA8IG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMpOwotICByZWcgJj0gfmlzdV9tdWx0aWNhc3RfYml0OyAvKiBkaXNhYmxlIG11bHRpY2FzdCAqLwotICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCi0JCQkJICZvcGljLT5pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgcmVnLCAiaW50ZXJydXB0IHNvdXJjZSIsIGluZGV4KTsKLX0KLQotCi0KLS8qIEludGVycnVwdCBTb3VyY2UgRGVzdGluYXRpb24gUmVnaXN0ZXI6ICovCi0KLXN0YXRpYyB1bnNpZ25lZAotcmVhZF9kZXN0aW5hdGlvbl9yZWdpc3RlcihkZXZpY2UgKm1lLAotCQkJICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHQsCi0JCQkgIGNvbnN0IGNoYXIgKnJlZ19uYW1lLAotCQkJICBpbnQgcmVnX2luZGV4KQotewotICB1bnNpZ25lZCBsb25nIHJlZzsKLSAgcmVnID0gaW50ZXJydXB0LT5kZXN0aW5hdGlvbjsKLSAgRFRSQUNFKG9waWMsICgiJXMgJWQgZGVzdGluYXRpb24gcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAotCQlyZWdfbmFtZSwgcmVnX2luZGV4LCByZWcpKTsKLSAgcmV0dXJuIHJlZzsKLX0KLQkJCSAgICAgCi1zdGF0aWMgdW5zaWduZWQKLWRvX2ludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCi0JCQkJCQlod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJCWludCBpbmRleCkKLXsKLSAgdW5zaWduZWQgcmVnOwotICBBU1NFUlQoaW5kZXggPCBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKLSAgcmVnID0gcmVhZF9kZXN0aW5hdGlvbl9yZWdpc3RlcihtZSwgb3BpYywgJm9waWMtPmV4dGVybmFsX2ludGVycnVwdF9zb3VyY2VbaW5kZXhdLAotCQkJCSAgImludGVycnVwdCBzb3VyY2UiLCBpbmRleCk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9kZXN0aW5hdGlvbl9yZWdpc3RlcihkZXZpY2UgKm1lLAotCQkJICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkgICBvcGljX2ludGVycnVwdF9zb3VyY2UgKmludGVycnVwdCwKLQkJCSAgIHVuc2lnbmVkIHJlZywKLQkJCSAgIGNvbnN0IGNoYXIgKnJlZ19uYW1lLAotCQkJICAgaW50IHJlZ19pbmRleCkKLXsKLSAgcmVnICY9ICgxIDw8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpIC0gMTsgLyogbWFzayBvdXQgaW52YWxpZCAqLwotICBEVFJBQ0Uob3BpYywgKCIlcyAlZCBkZXN0aW5hdGlvbiByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsCi0JCXJlZ19uYW1lLCByZWdfaW5kZXgsIHJlZykpOwotICBpbnRlcnJ1cHQtPmRlc3RpbmF0aW9uID0gcmVnOwotfQotCi1zdGF0aWMgdm9pZAotZG9faW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCi0JCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJCQkgaW50IGluZGV4LAotCQkJCQkJIHVuc2lnbmVkIHJlZykKLXsKLSAgQVNTRVJUKGluZGV4IDwgb3BpYy0+bnJfZXh0ZXJuYWxfaW50ZXJydXB0cyk7Ci0gIHdyaXRlX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyKG1lLCBvcGljLCAmb3BpYy0+ZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZVtpbmRleF0sCi0JCQkgICAgIHJlZywgImludGVycnVwdCBzb3VyY2UiLCBpbmRleCk7Ci19Ci0KLQotCi0vKiBTcHVyaW91cyB2ZWN0b3IgcmVnaXN0ZXI6ICovCi0KLXN0YXRpYyB1bnNpZ25lZAotZG9fc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcmVnID0gb3BpYy0+c3B1cmlvdXNfdmVjdG9yOwotICBEVFJBQ0Uob3BpYywgKCJzcHVyaW91cyB2ZWN0b3IgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLCByZWcpKTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3NwdXJpb3VzX3ZlY3Rvcl9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAotCQkJCSAgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJICB1bnNpZ25lZCByZWcpCi17Ci0gIHJlZyAmPSAweGZmOyAvKiBtYXNrIG9mZiBpbnZhbGlkICovCi0gIERUUkFDRShvcGljLCAoInNwdXJpb3VzIHZlY3RvciByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIHJlZykpOwotICBvcGljLT5zcHVyaW91c192ZWN0b3IgPSByZWc7Ci19Ci0KLQotCi0vKiBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXI6ICovCi0KLXN0YXRpYyB1bnNpZ25lZAotZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fcmVhZChkZXZpY2UgKm1lLAotCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJCSBpbnQgaW5kZXgpCi17Ci0gIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICppbnRlcnJ1cHRfZGVzdGluYXRpb24gPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2luZGV4XTsKLSAgdW5zaWduZWQgcmVnOwotICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOwotICByZWcgPSBpbnRlcnJ1cHRfZGVzdGluYXRpb24tPmJhc2VfcHJpb3JpdHk7Ci0gIERUUkFDRShvcGljLCAoImN1cnJlbnQgdGFzayBwcmlvcml0eSByZWdpc3RlciAlZCAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOwotICByZXR1cm4gcmVnOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fd3JpdGUoZGV2aWNlICptZSwKLQkJCQkJICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJICBpbnQgaW5kZXgsCi0JCQkJCSAgdW5zaWduZWQgcmVnKQotewotICBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqaW50ZXJydXB0X2Rlc3RpbmF0aW9uID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltpbmRleF07Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyk7Ci0gIHJlZyAlPSBtYXhfbnJfdGFza19wcmlvcml0aWVzOwotICBEVFJBQ0Uob3BpYywgKCJjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgJWQgLSB3cml0ZSAweCV4XG4iLCBpbmRleCwgcmVnKSk7Ci0gIGludGVycnVwdF9kZXN0aW5hdGlvbi0+YmFzZV9wcmlvcml0eSA9IHJlZzsKLX0KLQotCi0KLS8qIFRpbWVyIEZyZXF1ZW5jeSBSZXBvcnRpbmcgUmVnaXN0ZXI6ICovCi0KLXN0YXRpYyB1bnNpZ25lZAotZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCi0JCQkJCSAgIGh3X29waWNfZGV2aWNlICpvcGljKQotewotICB1bnNpZ25lZCByZWc7Ci0gIHJlZyA9IG9waWMtPnRpbWVyX2ZyZXF1ZW5jeTsKLSAgRFRSQUNFKG9waWMsICgidGltZXIgZnJlcXVlbmN5IHJlcG9ydGluZyByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgcmVnKSk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCi0JCQkJCSAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJICAgIHVuc2lnbmVkIHJlZykKLXsKLSAgRFRSQUNFKG9waWMsICgidGltZXIgZnJlcXVlbmN5IHJlcG9ydGluZyByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIHJlZykpOwotICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSByZWc7Ci19Ci0KLQotLyogdGltZXIgcmVnaXN0ZXJzOiAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWRvX3RpbWVyX05fY3VycmVudF9jb3VudF9yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCi0JCQkJICAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCSAgICAgICBpbnQgaW5kZXgpCi17Ci0gIG9waWNfdGltZXIgKnRpbWVyID0gJm9waWMtPnRpbWVyW2luZGV4XTsKLSAgdW5zaWduZWQgcmVnOwotICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOwotICBpZiAodGltZXItPmluaGliaXRlZCkKLSAgICByZWcgPSB0aW1lci0+Y291bnQ7IC8qIHN0YWxsZWQgdmFsdWUgKi8KLSAgZWxzZQotICAgIHJlZyA9IHRpbWVyLT5jb3VudCAtIGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKTsgLyogdGltZSByZW1haW5pbmcgKi8KLSAgRFRSQUNFKG9waWMsICgidGltZXIgJWQgY3VycmVudCBjb3VudCByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOwotICByZXR1cm4gcmVnOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotZG9fdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJICAgIGludCBpbmRleCkKLXsKLSAgb3BpY190aW1lciAqdGltZXIgPSAmb3BpYy0+dGltZXJbaW5kZXhdOwotICB1bnNpZ25lZCByZWc7Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7Ci0gIHJlZyA9IHRpbWVyLT5iYXNlX2NvdW50OwotICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCBiYXNlIGNvdW50IHJlZ2lzdGVyIC0gcmVhZCAweCV4XG4iLCBpbmRleCwgcmVnKSk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXRpbWVyX2V2ZW50KHZvaWQgKmRhdGEpCi17Ci0gIG9waWNfdGltZXIgKnRpbWVyID0gZGF0YTsKLSAgZGV2aWNlICptZSA9IHRpbWVyLT5tZTsKLSAgaWYgKHRpbWVyLT5pbmhpYml0ZWQpCi0gICAgZGV2aWNlX2Vycm9yKHRpbWVyLT5tZSwgImludGVybmFsLWVycm9yIC0gdGltZXIgZXZlbnQgb2NjdXJlZCB3aGVuIHRpbWVyICVkIGluaGliaXRlZCIsCi0JCSB0aW1lci0+bnIpOwotICBoYW5kbGVfaW50ZXJydXB0KHRpbWVyLT5tZSwgdGltZXItPm9waWMsIHRpbWVyLT5pbnRlcnJ1cHRfc291cmNlLCAxKTsKLSAgdGltZXItPnRpbWVvdXRfZXZlbnQgPSBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIHRpbWVyLT5iYXNlX2NvdW50LAotCQkJCQkJICAgICB0aW1lcl9ldmVudCwgdGltZXIpOwotICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCAtIGludGVycnVwdCBhdCAlbGQsIG5leHQgYXQgJWRcbiIsCi0JCXRpbWVyLT5uciwgKGxvbmcpZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpLCB0aW1lci0+YmFzZV9jb3VudCkpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb190aW1lcl9OX2Jhc2VfY291bnRfcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKLQkJCQkgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCSAgICAgaW50IGluZGV4LAotCQkJCSAgICAgdW5zaWduZWQgcmVnKQotewotICBvcGljX3RpbWVyICp0aW1lciA9ICZvcGljLT50aW1lcltpbmRleF07Ci0gIGludCBpbmhpYml0OwotICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOwotICBpbmhpYml0ID0gcmVnICYgMHg4MDAwMDAwMDsKLSAgaWYgKHRpbWVyLT5pbmhpYml0ZWQgJiYgIWluaGliaXQpIHsKLSAgICB0aW1lci0+aW5oaWJpdGVkID0gMDsKLSAgICBpZiAodGltZXItPnRpbWVvdXRfZXZlbnQgIT0gTlVMTCkKLSAgICAgIGRldmljZV9ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCB0aW1lci0+dGltZW91dF9ldmVudCk7Ci0gICAgdGltZXItPmNvdW50ID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpICsgcmVnOwotICAgIHRpbWVyLT5iYXNlX2NvdW50ID0gcmVnOwotICAgIHRpbWVyLT50aW1lb3V0X2V2ZW50ID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCB0aW1lci0+YmFzZV9jb3VudCwKLQkJCQkJCSAgICAgICB0aW1lcl9ldmVudCwgKHZvaWQqKXRpbWVyKTsKLSAgICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCBiYXNlIGNvdW50IHJlZ2lzdGVyIC0gd3JpdGUgMHgleCAtIHRpbWVyIHN0YXJ0ZWRcbiIsCi0JCSAgaW5kZXgsIHJlZykpOwotICB9Ci0gIGVsc2UgaWYgKCF0aW1lci0+aW5oaWJpdGVkICYmIGluaGliaXQpIHsKLSAgICBpZiAodGltZXItPnRpbWVvdXRfZXZlbnQgIT0gTlVMTCkKLSAgICAgIGRldmljZV9ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCB0aW1lci0+dGltZW91dF9ldmVudCk7Ci0gICAgdGltZXItPmNvdW50ID0gdGltZXItPmNvdW50IC0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpOwotICAgIHRpbWVyLT5pbmhpYml0ZWQgPSAxOwotICAgIHRpbWVyLT5iYXNlX2NvdW50ID0gcmVnOwotICAgIERUUkFDRShvcGljLCAoInRpbWVyICVkIGJhc2UgY291bnQgcmVnaXN0ZXIgLSB3cml0ZSAweCV4IC0gdGltZXIgc3RvcHBlZFxuIiwKLQkJICBpbmRleCwgcmVnKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgQVNTRVJUKCh0aW1lci0+aW5oaWJpdGVkICYmIGluaGliaXQpIHx8ICghdGltZXItPmluaGliaXRlZCAmJiAhaW5oaWJpdCkpOwotICAgIERUUkFDRShvcGljLCAoInRpbWVyICVkIGJhc2UgY291bnQgcmVnaXN0ZXIgLSB3cml0ZSAweCV4XG4iLCBpbmRleCwgcmVnKSk7Ci0gICAgdGltZXItPmJhc2VfY291bnQgPSByZWc7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWRvX3RpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCQkgaW50IGluZGV4KQotewotICB1bnNpZ25lZCByZWc7Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7Ci0gIHJlZyA9IHJlYWRfdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyKG1lLCBvcGljLAotCQkJCSAgICAgICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgICAgICAidGltZXIiLCBpbmRleCk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAotCQkJCQkgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCQkgIGludCBpbmRleCwKLQkJCQkJICB1bnNpZ25lZCByZWcpCi17Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7Ci0gIHJlZyAmPSB+aXN1X2xldmVsX3RyaWdnZXJlZF9iaXQ7IC8qIGZvcmNlIGVkZ2UgdHJpZ2dlciAqLwotICByZWcgfD0gaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdDsgLyogZm9yY2UgcmlzaW5nIChwb3NpdGl2ZSkgZWRnZSAqLwotICByZWcgfD0gaXN1X211bHRpY2FzdF9iaXQ7IC8qIGZvcmNlIG11bHRpY2FzdCAqLwotICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCi0JCQkJICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgcmVnLCAidGltZXIiLCBpbmRleCk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1kb190aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCSAgICAgaW50IGluZGV4KQotewotICB1bnNpZ25lZCByZWc7Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7Ci0gIHJlZyA9IHJlYWRfZGVzdGluYXRpb25fcmVnaXN0ZXIobWUsIG9waWMsICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgICJ0aW1lciIsIGluZGV4KTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RpbWVyX05fZGVzdGluYXRpb25fcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKLQkJCQkgICAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkgICAgICBpbnQgaW5kZXgsCi0JCQkJICAgICAgdW5zaWduZWQgcmVnKQotewotICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOwotICB3cml0ZV9kZXN0aW5hdGlvbl9yZWdpc3RlcihtZSwgb3BpYywgJm9waWMtPnRpbWVyX2ludGVycnVwdF9zb3VyY2VbaW5kZXhdLAotCQkJICAgICByZWcsICJ0aW1lciIsIGluZGV4KTsKLX0KLQotCi0vKiBJUEkgcmVnaXN0ZXJzICovCi0KLXN0YXRpYyB1bnNpZ25lZAotZG9faXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKLQkJCQkgICAgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJICAgICAgIGludCBpbmRleCkKLXsKLSAgdW5zaWduZWQgcmVnOwotICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMpOwotICByZWcgPSByZWFkX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcihtZSwgb3BpYywKLQkJCQkgICAgICAmb3BpYy0+aW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0X3NvdXJjZVtpbmRleF0sCi0JCQkJICAgICAgImlwaSIsIGluZGV4KTsKLSAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2lwaV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAotCQkJCQlod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkJaW50IGluZGV4LAotCQkJCQl1bnNpZ25lZCByZWcpCi17Ci0gIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0cyk7Ci0gIHJlZyAmPSB+aXN1X2xldmVsX3RyaWdnZXJlZF9iaXQ7IC8qIGZvcmNlIGVkZ2UgdHJpZ2dlciAqLwotICByZWcgfD0gaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdDsgLyogZm9yY2UgcmlzaW5nIChwb3NpdGl2ZSkgZWRnZSAqLwotICByZWcgfD0gaXN1X211bHRpY2FzdF9iaXQ7IC8qIGZvcmNlIGEgbXVsdGljYXN0IHNvdXJjZSAqLwotICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCi0JCQkJICZvcGljLT5pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKLQkJCQkgcmVnLCAiaXBpIiwgaW5kZXgpOwotfQotCi1zdGF0aWMgdm9pZAotZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKLQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJIGludCBpbmRleCwKLQkJCQkgdW5zaWduZWQgcmVnKQotewotICBvcGljX2ludGVycnVwdF9zb3VyY2UgKnNvdXJjZSA9ICZvcGljLT5pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XTsKLSAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBvcGljLT5ucl9pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRzKTsKLSAgRFRSQUNFKG9waWMsICgiaXBpICVkIGludGVycnVwdCBkaXNwYXRjaCByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIGluZGV4LCByZWcpKTsKLSAgc291cmNlLT5kZXN0aW5hdGlvbiA9IHJlZzsKLSAgaGFuZGxlX2ludGVycnVwdChtZSwgb3BpYywgc291cmNlLCAxKTsKLX0KLQotCi0vKiB2ZW5kb3IgYW5kIG90aGVyIGdsb2JhbCByZWdpc3RlcnMgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1kb192ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXJfcmVhZChkZXZpY2UgKm1lLAotCQkJCSAgICAgICBod19vcGljX2RldmljZSAqb3BpYykKLXsKLSAgdW5zaWduZWQgcmVnOwotICByZWcgPSBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb247Ci0gIERUUkFDRShvcGljLCAoInZlbmRvciBpZGVudGlmaWNhdGlvbiByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgcmVnKSk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotZG9fZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTl9yZWFkKGRldmljZSAqbWUsCi0JCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKLQkJCQkgICAgIGludCBpbmRleCkKLXsKLSAgdW5zaWduZWQgcmVnID0gMDsKLSAgQVNTRVJUKGluZGV4ID09IDApOwotICBzd2l0Y2ggKGluZGV4KSB7Ci0gIGNhc2UgMDoKLSAgICByZWcgfD0gKG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMgPDwgMTYpOwotICAgIHJlZyB8PSAob3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyA8PCA4KTsKLSAgICByZWcgfD0gKDIvKnZlcnNpb24gMS4yKi8pOwotICAgIGJyZWFrOwotICB9Ci0gIERUUkFDRShvcGljLCAoImZlYXR1cmUgcmVwb3J0aW5nIHJlZ2lzdGVyICVkIC0gcmVhZCAweCV4XG4iLCBpbmRleCwgcmVnKSk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl9yZWFkKGRldmljZSAqbWUsCi0JCQkJCWh3X29waWNfZGV2aWNlICpvcGljLAotCQkJCQlpbnQgaW5kZXgpCi17Ci0gIHVuc2lnbmVkIHJlZyA9IDA7Ci0gIEFTU0VSVChpbmRleCA9PSAwKTsKLSAgc3dpdGNoIChpbmRleCkgewotICBjYXNlIDA6Ci0gICAgcmVnIHw9IGdjcjBfODI1OV9iaXQ7IC8qIGhhcmR3aXJlIDgyNTkgZGlzYWJsZWQgKi8KLSAgICBicmVhazsKLSAgfQotICBEVFJBQ0Uob3BpYywgKCJnbG9iYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciAlZCAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOwotICByZXR1cm4gcmVnOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl93cml0ZShkZXZpY2UgKm1lLAotCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCi0JCQkJCSBpbnQgaW5kZXgsCi0JCQkJCSB1bnNpZ25lZCByZWcpCi17Ci0gIEFTU0VSVChpbmRleCA9PSAwKTsKLSAgaWYgKHJlZyAmIGdjcjBfcmVzZXRfYml0KSB7Ci0gICAgRFRSQUNFKG9waWMsICgiZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgJWQgLSB3cml0ZSAweCV4IC0gcmVzZXRpbmcgb3BpY1xuIiwgaW5kZXgsIHJlZykpOwotICAgIGh3X29waWNfaW5pdF9kYXRhKG1lKTsKLSAgfQotICBpZiAoIShyZWcgJiBnY3IwXzgyNTlfYml0KSkgewotICAgIERUUkFDRShvcGljLCAoImdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICVkIC0gd3JpdGUgMHgleCAtIGlnbm9yaW5nIDgyNTkgZW5hYmxlXG4iLCBpbmRleCwgcmVnKSk7Ci0gIH0KLX0KLQotCi0KLS8qIHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1od19vcGljX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCi0JCSAgICAgICB2b2lkICpkZXN0LAotCQkgICAgICAgaW50IHNwYWNlLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAotCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBvcGljX3JlZ2lzdGVyIHR5cGU7Ci0gIGludCBpbmRleDsKLSAgZGVjb2RlX29waWNfYWRkcmVzcyhtZSwgb3BpYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCAmdHlwZSwgJmluZGV4KTsKLSAgaWYgKHR5cGUgPT0gaW52YWxpZF9vcGljX3JlZ2lzdGVyKSB7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBvcGljIHJlYWQgYWNjZXNzIHRvICVkOjB4JWx4ICglZCBieXRlcykiLAotCQkgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHIsIG5yX2J5dGVzKTsKLSAgfQotICBlbHNlIHsKLSAgICB1bnNpZ25lZCByZWc7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBwcm9jZXNzb3JfaW5pdF9yZWdpc3RlcjoKLSAgICAgIHJlZyA9IGRvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBpbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgotICAgICAgcmVnID0gZG9faW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjoKLSAgICAgIHJlZyA9IGRvX2ludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OOgotICAgICAgcmVnID0gZG9faW50ZXJydXB0X2Fja25vd2xlZGdlX3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzcHVyaW91c192ZWN0b3JfcmVnaXN0ZXI6Ci0gICAgICByZWcgPSBkb19zcHVyaW91c192ZWN0b3JfcmVnaXN0ZXJfcmVhZChtZSwgb3BpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGN1cnJlbnRfdGFza19wcmlvcml0eV9yZWdpc3Rlcl9OOgotICAgICAgcmVnID0gZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyOgotICAgICAgcmVnID0gZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl9yZWFkKG1lLCBvcGljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOgotICAgICAgcmVnID0gZG9fdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyOgotICAgICAgcmVnID0gZG9fdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6Ci0gICAgICByZWcgPSBkb190aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRpbWVyX05fZGVzdGluYXRpb25fcmVnaXN0ZXI6Ci0gICAgICByZWcgPSBkb190aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgotICAgICAgcmVnID0gZG9faXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTjoKLSAgICAgIHJlZyA9IGRvX2ZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBnbG9iYWxfY29uZmlndXJhdGlvbl9yZWdpc3Rlcl9OOgotICAgICAgcmVnID0gZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl9yZWFkKG1lLCBvcGljLCBpbmRleCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3RlcjoKLSAgICAgIHJlZyA9IGRvX3ZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZWcgPSAwOwotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAidW5pbXBsZW1lbnRlZCByZWFkIG9mIHJlZ2lzdGVyICVzWyVkXSIsCi0JCSAgIG9waWNfcmVnaXN0ZXJfbmFtZSh0eXBlKSwgaW5kZXgpOwotICAgIH0KLSAgICAqKHVuc2lnbmVkXzQqKWRlc3QgPSBIMkxFXzQocmVnKTsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkCi1od19vcGljX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkJY29uc3Qgdm9pZCAqc291cmNlLAotCQkJaW50IHNwYWNlLAotCQkJdW5zaWduZWRfd29yZCBhZGRyLAotCQkJdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQljcHUgKnByb2Nlc3NvciwKLQkJCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBvcGljX3JlZ2lzdGVyIHR5cGU7Ci0gIGludCBpbmRleDsKLSAgZGVjb2RlX29waWNfYWRkcmVzcyhtZSwgb3BpYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCAmdHlwZSwgJmluZGV4KTsKLSAgaWYgKHR5cGUgPT0gaW52YWxpZF9vcGljX3JlZ2lzdGVyKSB7Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBvcGljIHdyaXRlIGFjY2VzcyB0byAlZDoweCVseCAoJWQgYnl0ZXMpIiwKLQkJIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBucl9ieXRlcyk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdW5zaWduZWQgcmVnID0gTEUySF80KCoodW5zaWduZWRfNCopc291cmNlKTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIHByb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyOgotICAgICAgZG9fcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIHJlZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6Ci0gICAgICBkb19pbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOgotICAgICAgZG9faW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OOgotICAgICAgZG9fZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOgotICAgICAgZG9fc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCByZWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTjoKLSAgICAgIGRvX2N1cnJlbnRfdGFza19wcmlvcml0eV9yZWdpc3Rlcl9OX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3RlcjoKLSAgICAgIGRvX3RpbWVyX2ZyZXF1ZW5jeV9yZXBvcnRpbmdfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIHJlZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlcjoKLSAgICAgIGRvX3RpbWVyX05fYmFzZV9jb3VudF9yZWdpc3Rlcl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgotICAgICAgZG9fdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOgotICAgICAgZG9fdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGlwaV9OX2Rpc3BhdGNoX3JlZ2lzdGVyOgotICAgICAgZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6Ci0gICAgICBkb19pcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBnbG9iYWxfY29uZmlndXJhdGlvbl9yZWdpc3Rlcl9OOgotICAgICAgZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAidW5pbXBsZW1lbnRlZCB3cml0ZSB0byByZWdpc3RlciAlc1slZF0iLAotCQkgICBvcGljX3JlZ2lzdGVyX25hbWUodHlwZSksIGluZGV4KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5yX2J5dGVzOwotfQotICAKLSAgCi1zdGF0aWMgdm9pZAotaHdfb3BpY19pbnRlcnJ1cHRfZXZlbnQoZGV2aWNlICptZSwKLQkJCWludCBteV9wb3J0LAotCQkJZGV2aWNlICpzb3VyY2UsCi0JCQlpbnQgc291cmNlX3BvcnQsCi0JCQlpbnQgbGV2ZWwsCi0JCQljcHUgKnByb2Nlc3NvciwKLQkJCXVuc2lnbmVkX3dvcmQgY2lhKQotewotICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotCi0gIGludCBpc2I7Ci0gIGludCBzcmNfbnIgPSAwOwotCi0gIC8qIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJuYWwgaW5wdXQgcG9ydCAqLwotICBmb3IgKGlzYiA9IDA7IGlzYiA8IG9waWMtPm5yX2lzdV9ibG9ja3M7IGlzYisrKSB7Ci0gICAgaWYgKG15X3BvcnQgPj0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcgotCSYmIG15X3BvcnQgPCBvcGljLT5pc3VfYmxvY2tbaXNiXS5pbnRfbnVtYmVyICsgb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpIHsKLSAgICAgIHNyY19uciArPSBteV9wb3J0IC0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBzcmNfbnIgKz0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2U7Ci0gIH0KLSAgaWYgKGlzYiA9PSBvcGljLT5ucl9pc3VfYmxvY2tzKQotICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCAlZCBvdXQgb2YgcmFuZ2UiLCBteV9wb3J0KTsKLSAgRFRSQUNFKG9waWMsICgiZXh0ZXJuYWwtaW50ZXJydXB0ICVkLCBpbnRlcm5hbCAlZCwgbGV2ZWwgJWRcbiIsCi0JCW15X3BvcnQsIHNyY19uciwgbGV2ZWwpKTsKLQotICAvKiBwYXNzIGl0IG9uICovCi0gIEFTU0VSVChzcmNfbnIgPj0gMCAmJiBzcmNfbnIgPCBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKLSAgaGFuZGxlX2ludGVycnVwdChtZSwgb3BpYywgJm9waWMtPmV4dGVybmFsX2ludGVycnVwdF9zb3VyY2Vbc3JjX25yXSwgbGV2ZWwpOwotfQotCi0KLXN0YXRpYyBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciBod19vcGljX2ludGVycnVwdF9wb3J0c1tdID0gewotICB7ICJpcnEiLCAwLCBtYXhfbnJfaW50ZXJydXB0X3NvdXJjZXMsIGlucHV0X3BvcnQsIH0sCi0gIHsgImludHIiLCAwLCBtYXhfbnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucywgb3V0cHV0X3BvcnQsIH0sCi0gIHsgImluaXQiLCBtYXhfbnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucywgbWF4X25yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMsIG91dHB1dF9wb3J0LCB9LAotICB7IE5VTEwgfQotfTsKLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19vcGljX2NhbGxiYWNrcyA9IHsKLSAgeyBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MsCi0gICAgaHdfb3BpY19pbml0X2RhdGEgfSwKLSAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCi0gIHsgaHdfb3BpY19pb19yZWFkX2J1ZmZlciwKLSAgICBod19vcGljX2lvX3dyaXRlX2J1ZmZlciB9LCAvKiBJTyAqLwotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IGh3X29waWNfaW50ZXJydXB0X2V2ZW50LCBOVUxMLCBod19vcGljX2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHQgKi8KLSAgeyBOVUxMLCB9LCAvKiB1bml0ICovCi0gIE5VTEwsIC8qIGluc3RhbmNlICovCi19OwotCi1zdGF0aWMgdm9pZCAqCi1od19vcGljX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAotCSAgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCSAgICAgICBjb25zdCBjaGFyICphcmdzKQotewotICBod19vcGljX2RldmljZSAqb3BpYyA9IFpBTExPQyhod19vcGljX2RldmljZSk7Ci0gIHJldHVybiBvcGljOwotfQotCi0KLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfb3BpY19kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJvcGljIiwgaHdfb3BpY19jcmVhdGUsICZod19vcGljX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfT1BJQ19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19wYWwuYyBiL3NpbS9wcGMvaHdfcGFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjU2YjkuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19wYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSAgICAKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAgCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICAgCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19QQUxfQ18KLSNkZWZpbmUgX0hXX1BBTF9DXwotCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkVfSFdfUEFMCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkVfSFdfUEFMIFNUQVRJQ19JTkxJTkUKLSNlbmRpZgotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpbmNsdWRlICJjcHUuaCIKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLQotLyogREVWSUNFCi0KLSAgIAotICAgcGFsIC0gZ2x1ZSBsb2dpYyBkZXZpY2UgY29udGFpbmluZyBhc3NvcnRlZCBqdW5rCi0KLSAgIAotICAgREVTQ1JJUFRJT04KLQotICAgCi0gICBUeXBpY2FsIGhhcmR3YXJlIGRlcGVuZGFudCBoYWNrLiAgVGhpcyBkZXZpY2UgYWxsb3dzIHRoZSBmaXJtd2FyZQotICAgdG8gZ2FpbiBhY2Nlc3MgdG8gYWxsIHRoZSB0aGluZ3MgdGhlIGZpcm13YXJlIG5lZWRzIChidXQgdGhlIE9TCi0gICBkb2Vzbid0KS4KLQotICAgVGhlIHBhbCBjb250YWlucyB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycy4gIEV4Y2VwdCBmb3IgdGhlIGludGVycnVwdAotICAgbGV2ZWwgcmVnaXN0ZXIsIGVhY2ggb2YgdGhlIGJlbG93IGlzIDggYnl0ZXMgaW4gc2l6ZSBhbmQgbXVzdCBiZQotICAgYWNjZXNzZWQgdXNpbmcgY29ycmVjdCBhbGlnbm1lbnQuICBGb3IgMTYgYW5kIDMyIGJpdCBhY2Nlc3NlcyB0aGUKLSAgIGJ5dGVzIG5vdCBkaXJlY3RlZCB0byB0aGUgcmVnaXN0ZXIgYXJlIGlnbm9yZWQ6Ci0gICAKLSAgIHwwCXJlc2V0IHJlZ2lzdGVyICh3cml0ZSkKLSAgIHw0CXByb2Nlc3NvciBpZCByZWdpc3RlciAocmVhZCkKLSAgIHw4CWludGVycnVwdCBwb3J0ICh3cml0ZSkKLSAgIHw5CWludGVycnVwdCBsZXZlbCAod3JpdGUpCi0gICB8MTIJcHJvY2Vzc29yIGNvdW50IHJlZ2lzdGVyIChyZWFkKQotICAgfDE2CXR0eSBpbnB1dCBmaWZvIHJlZ2lzdGVyIChyZWFkKQotICAgfDIwCXR0eSBpbnB1dCBzdGF0dXMgcmVnaXN0ZXIgKHJlYWQpCi0gICB8MjQJdHR5IG91dHB1dCBmaWZvIHJlZ2lzdGVyICh3cml0ZSkKLSAgIHwyOAl0dHkgb3V0cHV0IHN0YXR1cyByZWdpc3RlciAocmVhZCkKLQotICAgUmVzZXQgcmVnaXN0ZXIgKHdyaXRlKSBoYWx0cyB0aGUgc2ltdWxhdG9yIGV4aXRpbmcgd2l0aCB0aGUKLSAgIHZhbHVlIHdyaXR0ZW4uCi0gICAKLSAgIFByb2Nlc3NvciBpZCByZWdpc3RlciAocmVhZCkgcmV0dXJucyB0aGUgcHJvY2Vzc29yIG51bWJlciAoMAotICAgLi4gTi0xKSBvZiB0aGUgcHJvY2Vzc29yIHBlcmZvcm1pbmcgdGhlIHJlYWQuCi0gICAKLSAgIFRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIHNob3VsZCBiZSBhY2Nlc3NlZCBhcyBhIHBhaXIgKHVzaW5nIGEgMTYgb3IKLSAgIDMyIGJpdCBzdG9yZSkuICBUaGUgbG93IGJ5dGUgc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcG9ydCB3aGlsZSB0aGUKLSAgIGhpZ2ggYnl0ZSBzcGVjaWZpZXMgdGhlIGxldmVsIHRvIGRyaXZlIHRoYXQgcG9ydCBhdC4gIEJ5Ci0gICBjb252ZW50aW9uLCB0aGUgcGFsJ3MgaW50ZXJydXB0IHBvcnRzIChpbnQwLCBpbnQxLCAuLi4pIGFyZSB3aXJlZAotICAgdXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcHJvY2Vzc29yJ3MgbGV2ZWwgc2Vuc2F0aXZlIGV4dGVybmFsCi0gICBpbnRlcnJ1cHQgcGluLiAgRWc6IEEgdHdvIGJ5dGUgd3JpdGUgdG8gYWRkcmVzcyA4IG9mIDB4MDEwMgotICAgKGJpZy1lbmRpYW4pIHdpbGwgcmVzdWx0IGluIHByb2Nlc3NvciAyJ3MgZXh0ZXJuYWwgaW50ZXJydXB0IHBpbiB0bwotICAgYmUgYXNzZXJ0ZWQuCi0KLSAgIFByb2Nlc3NvciBjb3VudCByZWdpc3RlciAocmVhZCkgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mCi0gICBwcm9jZXNzb3JzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzaW11bGF0aW9uLgotCi0gICBUVFkgaW5wdXQgZmlmbyByZWdpc3RlciAocmVhZCksIGlmIHRoZSBUVFkgaW5wdXQgc3RhdHVzIHJlZ2lzdGVyCi0gICBpbmRpY2F0ZXMgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlIGJ5IGJlaW5nIG5vbnplcm8sIHJldHVybnMgdGhlCi0gICBuZXh0IGF2YWlsYWJsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcGFsJ3MgdHR5IGlucHV0IHBvcnQuCi0KLSAgIFNpbWlsYXJseSwgdGhlIFRUWSBvdXRwdXQgZmlmbyByZWdpc3RlciAod3JpdGUpLCBpZiB0aGUgVFRZIG91dHB1dAotICAgc3RhdHVzIHJlZ2lzdGVyIGluZGljYXRlcyB0aGUgb3V0cHV0IGZpZm8gaXMgbm90IGZ1bGwgYnkgYmVpbmcKLSAgIG5vbnplcm8sIG91dHB1dHMgdGhlIGNoYXJhY3RlciB3cml0dGVuIHRvIHRoZSB0dHkncyBvdXRwdXQgcG9ydC4KLQotCi0gICBQUk9QRVJUSUVTCi0gICAKLQotICAgcmVnID0gPGFkZHJlc3M+IDxzaXplPiAocmVxdWlyZWQpCi0KLSAgIFNwZWNpZnkgdGhlIGFkZHJlc3MgKHdpdGhpbiB0aGUgcGFyZW50IGJ1cykgdGhhdCB0aGlzIGRldmljZSBpcyB0bwotICAgbGl2ZS4KLQotCi0gICAqLwotCi0KLWVudW0gewotICBod19wYWxfcmVzZXRfcmVnaXN0ZXIgPSAweDAsCi0gIGh3X3BhbF9jcHVfbnJfcmVnaXN0ZXIgPSAweDQsCi0gIGh3X3BhbF9pbnRfcmVnaXN0ZXIgPSAweDgsCi0gIGh3X3BhbF9ucl9jcHVfcmVnaXN0ZXIgPSAweGEsCi0gIGh3X3BhbF9yZWFkX2ZpZm8gPSAweDEwLAotICBod19wYWxfcmVhZF9zdGF0dXMgPSAweDE0LAotICBod19wYWxfd3JpdGVfZmlmbyA9IDB4MTgsCi0gIGh3X3BhbF93cml0ZV9zdGF0dXMgPSAweDFhLAotICBod19wYWxfYWRkcmVzc19tYXNrID0gMHgxZiwKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2h3X3BhbF9jb25zb2xlX2J1ZmZlciB7Ci0gIGNoYXIgYnVmZmVyOwotICBpbnQgc3RhdHVzOwotfSBod19wYWxfY29uc29sZV9idWZmZXI7Ci0KLXR5cGVkZWYgc3RydWN0IF9od19wYWxfZGV2aWNlIHsKLSAgaHdfcGFsX2NvbnNvbGVfYnVmZmVyIGlucHV0OwotICBod19wYWxfY29uc29sZV9idWZmZXIgb3V0cHV0OwotICBkZXZpY2UgKmRpc2s7Ci19IGh3X3BhbF9kZXZpY2U7Ci0KLQotLyogY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGFuIGF2YWlsYWJsZSBjaGFyYWN0ZXIgKi8KLXN0YXRpYyB2b2lkCi1zY2FuX2h3X3BhbChod19wYWxfZGV2aWNlICpod19wYWwpCi17Ci0gIGNoYXIgYzsKLSAgaW50IGNvdW50OwotICBjb3VudCA9IHNpbV9pb19yZWFkX3N0ZGluKCZjLCBzaXplb2YoYykpOwotICBzd2l0Y2ggKGNvdW50KSB7Ci0gIGNhc2Ugc2ltX2lvX25vdF9yZWFkeToKLSAgY2FzZSBzaW1faW9fZW9mOgotICAgIGh3X3BhbC0+aW5wdXQuYnVmZmVyID0gMDsKLSAgICBod19wYWwtPmlucHV0LnN0YXR1cyA9IDA7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgaHdfcGFsLT5pbnB1dC5idWZmZXIgPSBjOwotICAgIGh3X3BhbC0+aW5wdXQuc3RhdHVzID0gMTsKLSAgfQotfQotCi0vKiB3cml0ZSB0aGUgY2hhcmFjdGVyIHRvIHRoZSBod19wYWwgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9od19wYWwoaHdfcGFsX2RldmljZSAqaHdfcGFsLAotCSAgICAgY2hhciB2YWwpCi17Ci0gIHNpbV9pb193cml0ZV9zdGRvdXQoJnZhbCwgMSk7Ci0gIGh3X3BhbC0+b3V0cHV0LmJ1ZmZlciA9IHZhbDsKLSAgaHdfcGFsLT5vdXRwdXQuc3RhdHVzID0gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X3BhbF9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayhkZXZpY2UgKm1lLAotCQkJICAgICAgIHZvaWQgKmRlc3QsCi0JCQkgICAgICAgaW50IHNwYWNlLAotCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcywKLQkJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgdW5zaWduZWRfMSB2YWw7Ci0gIHN3aXRjaCAoYWRkciAmIGh3X3BhbF9hZGRyZXNzX21hc2spIHsKLSAgY2FzZSBod19wYWxfY3B1X25yX3JlZ2lzdGVyOgotICAgIHZhbCA9IGNwdV9ucihwcm9jZXNzb3IpOwotICAgIERUUkFDRShwYWwsICgicmVhZCAtIGNwdS1uciAlZFxuIiwgdmFsKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaHdfcGFsX25yX2NwdV9yZWdpc3RlcjoKLSAgICB2YWwgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIi9vcGVucHJvbS9vcHRpb25zL3NtcCIpOwotICAgIERUUkFDRShwYWwsICgicmVhZCAtIG5yLWNwdSAlZFxuIiwgdmFsKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaHdfcGFsX3JlYWRfZmlmbzoKLSAgICB2YWwgPSBod19wYWwtPmlucHV0LmJ1ZmZlcjsKLSAgICBEVFJBQ0UocGFsLCAoInJlYWQgLSBpbnB1dC1maWZvICVkXG4iLCB2YWwpKTsKLSAgICBicmVhazsKLSAgY2FzZSBod19wYWxfcmVhZF9zdGF0dXM6Ci0gICAgc2Nhbl9od19wYWwoaHdfcGFsKTsKLSAgICB2YWwgPSBod19wYWwtPmlucHV0LnN0YXR1czsKLSAgICBEVFJBQ0UocGFsLCAoInJlYWQgLSBpbnB1dC1zdGF0dXMgJWRcbiIsIHZhbCkpOwotICAgIGJyZWFrOwotICBjYXNlIGh3X3BhbF93cml0ZV9maWZvOgotICAgIHZhbCA9IGh3X3BhbC0+b3V0cHV0LmJ1ZmZlcjsKLSAgICBEVFJBQ0UocGFsLCAoInJlYWQgLSBvdXRwdXQtZmlmbyAlZFxuIiwgdmFsKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaHdfcGFsX3dyaXRlX3N0YXR1czoKLSAgICB2YWwgPSBod19wYWwtPm91dHB1dC5zdGF0dXM7Ci0gICAgRFRSQUNFKHBhbCwgKCJyZWFkIC0gb3V0cHV0LXN0YXR1cyAlZFxuIiwgdmFsKSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgdmFsID0gMDsKLSAgICBEVFJBQ0UocGFsLCAoInJlYWQgLSA/Pz9cbiIpKTsKLSAgfQotICBtZW1zZXQoZGVzdCwgMCwgbnJfYnl0ZXMpOwotICAqKHVuc2lnbmVkXzEqKWRlc3QgPSB2YWw7Ci0gIHJldHVybiBucl9ieXRlczsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X3BhbF9pb193cml0ZV9idWZmZXJfY2FsbGJhY2soZGV2aWNlICptZSwKLQkJCQljb25zdCB2b2lkICpzb3VyY2UsCi0JCQkJaW50IHNwYWNlLAotCQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCQl1bnNpZ25lZCBucl9ieXRlcywKLQkJCQljcHUgKnByb2Nlc3NvciwKLQkJCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgdW5zaWduZWRfMSAqYnl0ZSA9ICh1bnNpZ25lZF8xKilzb3VyY2U7Ci0gIAotICBzd2l0Y2ggKGFkZHIgJiBod19wYWxfYWRkcmVzc19tYXNrKSB7Ci0gIGNhc2UgaHdfcGFsX3Jlc2V0X3JlZ2lzdGVyOgotICAgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfZXhpdGVkLCBieXRlWzBdKTsKLSAgICBicmVhazsKLSAgY2FzZSBod19wYWxfaW50X3JlZ2lzdGVyOgotICAgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsCi0JCQkgICBieXRlWzBdLCAvKnBvcnQqLwotCQkJICAgKG5yX2J5dGVzID4gMSA/IGJ5dGVbMV0gOiAwKSwgLyogdmFsICovCi0JCQkgICBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaHdfcGFsX3JlYWRfZmlmbzoKLSAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IGJ5dGVbMF07Ci0gICAgRFRSQUNFKHBhbCwgKCJ3cml0ZSAtIGlucHV0LWZpZm8gJWRcbiIsIGJ5dGVbMF0pKTsKLSAgICBicmVhazsKLSAgY2FzZSBod19wYWxfcmVhZF9zdGF0dXM6Ci0gICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSBieXRlWzBdOwotICAgIERUUkFDRShwYWwsICgid3JpdGUgLSBpbnB1dC1zdGF0dXMgJWRcbiIsIGJ5dGVbMF0pKTsKLSAgICBicmVhazsKLSAgY2FzZSBod19wYWxfd3JpdGVfZmlmbzoKLSAgICB3cml0ZV9od19wYWwoaHdfcGFsLCBieXRlWzBdKTsKLSAgICBEVFJBQ0UocGFsLCAoIndyaXRlIC0gb3V0cHV0LWZpZm8gJWRcbiIsIGJ5dGVbMF0pKTsKLSAgICBicmVhazsKLSAgY2FzZSBod19wYWxfd3JpdGVfc3RhdHVzOgotICAgIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IGJ5dGVbMF07Ci0gICAgRFRSQUNFKHBhbCwgKCJ3cml0ZSAtIG91dHB1dC1zdGF0dXMgJWRcbiIsIGJ5dGVbMF0pKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gbnJfYnl0ZXM7Ci19Ci0KLQotLyogaW5zdGFuY2VzIG9mIHRoZSBod19wYWwgZGV2aWNlICovCi0KLXN0YXRpYyB2b2lkCi1od19wYWxfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCi17Ci0gIC8qIG5vdGhpbmcgdG8gZGVsZXRlLCB0aGUgaHdfcGFsIGlzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UgKi8KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1od19wYWxfaW5zdGFuY2VfcmVhZF9jYWxsYmFjayhkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJICAgICAgdm9pZCAqYnVmLAotCQkJICAgICAgdW5zaWduZWRfd29yZCBsZW4pCi17Ci0gIERJVFJBQ0UocGFsLCAoInJlYWQgLSAlcyAoJWxkKSIsIChjb25zdCBjaGFyKilidWYsIChsb25nIGludClsZW4pKTsKLSAgcmV0dXJuIHNpbV9pb19yZWFkX3N0ZGluKGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIGludAotaHdfcGFsX2luc3RhbmNlX3dyaXRlX2NhbGxiYWNrKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqYnVmLAotCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgbGVuKQotewotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqY2hwID0gYnVmOwotICBod19wYWxfZGV2aWNlICpod19wYWwgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7Ci0gIERJVFJBQ0UocGFsLCAoIndyaXRlIC0gJXMgKCVsZCkiLCAoY29uc3QgY2hhciopYnVmLCAobG9uZyBpbnQpbGVuKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICB3cml0ZV9od19wYWwoaHdfcGFsLCBjaHBbaV0pOwotICBzaW1faW9fZmx1c2hfc3Rkb3V0cHV0KCk7Ci0gIHJldHVybiBpOwotfQotCi1zdGF0aWMgY29uc3QgZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyBod19wYWxfaW5zdGFuY2VfY2FsbGJhY2tzID0gewotICBod19wYWxfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrLAotICBod19wYWxfaW5zdGFuY2VfcmVhZF9jYWxsYmFjaywKLSAgaHdfcGFsX2luc3RhbmNlX3dyaXRlX2NhbGxiYWNrLAotfTsKLQotc3RhdGljIGRldmljZV9pbnN0YW5jZSAqCi1od19wYWxfY3JlYXRlX2luc3RhbmNlKGRldmljZSAqbWUsCi0JCSAgICAgICBjb25zdCBjaGFyICpwYXRoLAotCQkgICAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbShtZSwgTlVMTCwKLQkJCQkgICAgIGRldmljZV9kYXRhKG1lKSwKLQkJCQkgICAgIHBhdGgsIGFyZ3MsCi0JCQkJICAgICAmaHdfcGFsX2luc3RhbmNlX2NhbGxiYWNrcyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciBod19wYWxfaW50ZXJydXB0X3BvcnRzW10gPSB7Ci0gIHsgImludCIsIDAsIE1BWF9OUl9QUk9DRVNTT1JTIH0sCi0gIHsgTlVMTCB9Ci19OwotCi0KLXN0YXRpYyB2b2lkCi1od19wYWxfYXR0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKLQkJICAgICAgYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKLQkJICAgICAgZGV2aWNlICpjbGllbnQpCi17Ci0gIGh3X3BhbF9kZXZpY2UgKnBhbCA9IChod19wYWxfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIHBhbC0+ZGlzayA9IGNsaWVudDsKLX0KLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19wYWxfY2FsbGJhY2tzID0gewotICB7IGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcywgfSwKLSAgeyBod19wYWxfYXR0YWNoX2FkZHJlc3MsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBod19wYWxfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssCi0gICAgICBod19wYWxfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIE5VTEwsIGh3X3BhbF9pbnRlcnJ1cHRfcG9ydHMgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcywKLSAgICBnZW5lcmljX2RldmljZV9zaXplX3RvX2F0dGFjaF9zaXplIH0sCi0gIGh3X3BhbF9jcmVhdGVfaW5zdGFuY2UsCi19OwotCi0KLXN0YXRpYyB2b2lkICoKLWh3X3BhbF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAotCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gIC8qIGNyZWF0ZSB0aGUgZGVzY3JpcHRvciAqLwotICBod19wYWxfZGV2aWNlICpod19wYWwgPSBaQUxMT0MoaHdfcGFsX2RldmljZSk7Ci0gIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IDE7Ci0gIGh3X3BhbC0+b3V0cHV0LmJ1ZmZlciA9ICdcMCc7Ci0gIGh3X3BhbC0+aW5wdXQuc3RhdHVzID0gMDsKLSAgaHdfcGFsLT5pbnB1dC5idWZmZXIgPSAnXDAnOwotICByZXR1cm4gaHdfcGFsOwotfQotCi0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X3BhbF9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJwYWwiLCBod19wYWxfY3JlYXRlLCAmaHdfcGFsX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfUEFMX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X3BoYi5jIGIvc2ltL3BwYy9od19waGIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MWY1OS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X3BoYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2OCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9IV19QSEJfQ18KLSNkZWZpbmUgX0hXX1BIQl9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0KLSNpbmNsdWRlICJod19waGIuaCIKLQotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQotLyogREVWSUNFCi0KLQotICAgcGhiIC0gUENJIEhvc3QgQnJpZGdlCi0KLQotICAgREVTQ1JJUFRJT04KLQotCi0gICBQSEIgaW1wbGVtZW50cyBhIG1vZGVsIG9mIHRoZSBQQ0ktaG9zdCBicmlkZ2UgZGVzY3JpYmVkIGluIHRoZSBQUENQCi0gICBkb2N1bWVudC4KLQotICAgRm9yIGJyaWRnZSBkZXZpY2VzLCBPcGVuIEZpcm13YXJlIHNwZWNpZmllcyB0aGF0IHRoZSA8PHJhbmdlcz4+Ci0gICBwcm9wZXJ0eSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG1hcHBpbmcgb2YgYWRkcmVzcyBzcGFjZXMgYmV0d2VlbiBhCi0gICBicmlkZ2VzIHBhcmVudCBhbmQgY2hpbGQgYnVzc2VzLiAgVGhpcyBQSEIgbW9kZWwgY29uZmlndXJlcyBpdHNzZWxmCi0gICBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHNwZWNpZmllZCBpbiBpdHMgcmFuZ2VzIHByb3BlcnR5LiAgVGhlCi0gICA8PHJhbmdlcz4+IHByb3BlcnR5IGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gdGhlIE9wZW4gRmlybXdhcmUKLSAgIGRvY3VtZW50YXRpb24uCi0KLSAgIEZvciBETUEgdHJhbnNmZXJzLCBhbnkgYWNjZXNzIHRvIGEgUENJIGFkZHJlc3Mgc3BhY2Ugd2hpY2ggZmFsbHMKLSAgIG91dHNpZGUgb2YgdGhlIG1hcHBlZCBtZW1vcnkgc3BhY2UgaXMgYXNzdW1lZCB0byBiZSBhIHRyYW5zZmVyCi0gICBpbnRlbmRlZCBmb3IgdGhlIHBhcmVudCBidXMuCi0KLQotICAgUFJPUEVSVElFUwotCi0KLSAgIHJhbmdlcyA9IDxteS1waHlzLWFkZHI+IDxwYXJlbnQtcGh5cy1hZGRyPiA8bXktc2l6ZT4gLi4uICAocmVxdWlyZWQpCi0gICAKLSAgIERlZmluZSBhIG51bWJlciBvZiBtYXBwaW5ncyBmcm9tIHRoZSBwYXJlbnQgYnVzIHRvIG9uZSBvZiB0aGlzCi0gICBkZXZpY2VzIFBDSSBidXNzZXMuICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSA8PHBhcmVudC1waHlzLWFkZHI+PgotICAgaXMgcGFyZW50IGJ1cyBkZXBlbmRhbnQuICBUaGUgZm9ybWF0IG9mIDw8bXktcGh5cy1hZGRyPj4gaXMKLSAgIGRlc2NyaWJlZCBpbiB0aGUgT3BlbiBGaXJtd2FyZSBQQ0kgYmluZGluZ3MgZG9jdW1lbnQgKG5vdGUgdGhhdCB0aGUKLSAgIGFkZHJlc3MgbXVzdCBiZSBub24tcmVsb2NhdGFibGUpLgotCi0KLSAgICNhZGRyZXNzLWNlbGxzID0gMyAgKHJlcXVpcmVkKQotCi0gICBOdW1iZXIgb2YgY2VsbHMgdXNlZCBieSBhbiBPcGVuIEZpcm13YXJlIFBDSSBhZGRyZXNzLiAgVGhpcwotICAgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBzcGVjaWZ5aW5nIHRoZSA8PHJhbmdlcz4+IHByb3BlcnR5LgotCi0KLSAgICNzaXplLWNlbGxzID0gMiAgKHJlcXVpcmVkKQotCi0gICBOdW1iZXIgb2YgY2VsbHMgdXNlZCBieSBhbiBPcGVuIEZpcm13YXJlIFBDSSBzaXplLiAgVGhpcyBwcm9wZXJ0eQotICAgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBzcGVjaWZ5aW5nIHRoZSA8PHJhbmdlcz4+IHByb3BlcnR5LgotCi0KLSAgIEVYQU1QTEVTCi0gICAKLQotICAgRW5hYmxlIHRyYWNpbmc6Ci0KLSAgIHwgICQgcHNpbSBcCi0gICB8ICAgIC10IHBoYi1kZXZpY2UgXAotCi0KLSAgIFNpbmNlIGRldmljZSB0cmVlIGVudHJpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKLSAgIGFyZSBhZGRlZCBiZWZvcmUgbW9zdCBvZiB0aGUgZGV2aWNlIHRyZWUgaGFzIGJlZW4gYnVpbHQgaXQgaXMgb2Z0ZW4KLSAgIG5lY2Vzc2FyeSB0byBleHBsaWN0bHkgYWRkIGNlcnRhaW4gZGV2aWNlIHByb3BlcnRpZXMgYW5kIHRodXMKLSAgIGVuc3VyZSB0aGV5IGFyZSBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGRldmljZSB0cmVlLiAgRm9yIHRoZQotICAgPDxwaGI+PiBvbmUgc3VjaCBwcm9wZXJ0eSBpcyBwYXJlbnQgYnVzc2VzIDw8I2FkZHJlc3MtY2VsbHM+Pi4KLQotICAgfCAgICAtbyAnLyNhZGRyZXNzLWNlbGxzIDEnIFwKLQotCi0gICBDcmVhdGUgdGhlIFBIQiByZW1lbWJlcmluZyB0byBpbmNsdWRlIHRoZSBjZWxsIHNpemUgcHJvcGVydGllczoKLSAgIAotICAgfCAgICAtbyAnL3BoYkAweDgwMDAwMDAwLyNhZGRyZXNzLWNlbGxzIDMnIFwKLSAgIHwgICAgLW8gJy9waGJAMHg4MDAwMDAwMC8jc2l6ZS1jZWxscyAyJyBcCi0KLQotICAgU3BlY2lmeSB0aGF0IHRoZSBtZW1vcnkgYWRkcmVzcyByYW5nZSA8PDB4ODAwMDAwMDA+PiB0bwotICAgPDwweDhmZmZmZmZmPj4gc2hvdWxkIG1hcCBkaXJlY3RseSBvbnRvIHRoZSBQQ0kgbWVtb3J5IGFkZHJlc3MKLSAgIHNwYWNlIHdoaWxlIHRoZSBwcm9jZXNzb3IgYWRkcmVzcyByYW5nZSA8PDB4YzAwMDAwMDA+PiB0bwotICAgPDwweGMwMDBmZmZmPj4gc2hvdWxkIG1hcCBvbnRvIHRoZSBQQ0kgSS9PIGFkZHJlc3MgcmFuZ2Ugc3RhcnRpbmcKLSAgIGF0IGxvY2F0aW9uIHplcm86Ci0KLSAgIHwgICAgLW8gJy9waGJAMHg4MDAwMDAwMC9yYW5nZXMgXAotICAgfCAgICAgICAgICAgICAgICBubTAsMCwwLDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgxMDAwMDAwMCBcCi0gICB8ICAgICAgICAgICAgICAgIG5pMCwwLDAsMCAweGMwMDAwMDAwIDB4MTAwMDAnIFwKLQotCi0gICBJbnNlcnQgYSA0ayA8PG52cmFtPj4gaW50byBzbG90IHplcm8gb2YgdGhlIFBDSSBidXMuICBIYXZlIGl0Ci0gICBkaXJlY3RseSBhY2Nlc3NpYmxlIGluIGJvdGggdGhlIEkvTyAoYWRkcmVzcyA8PDB4MTAwPj4pIGFuZCBtZW1vcnkKLSAgIChhZGRyZXNzIDB4ODAwMDEwMDApIHNwYWNlczoKLQotICAgfCAgICAtbyAnL3BoYkAweDgwMDAwMDAwL252cmFtQDAvYXNzaWduZWQtYWRkcmVzc2VzIFwKLSAgIHwgICAgICAgICAgICAgICAgbm0wLDAsMTAsODAwMDEwMDAgNDA5NiBcCi0gICB8ICAgICAgICAgICAgICAgIG5pMCwwLDE0LDEwMCA0MDk2JwotICAgfCAgICAtbyAnL3BoYkAweDgwMDAwMDAwL252cmFtQDAvcmVnIFwKLSAgIHwgICAgICAgICAgICAgICAgMCAwIFwKLSAgIHwgICAgICAgICAgICAgICAgaTAsMCwxNCwwIDQwOTYnCi0gICB8ICAgIC1vICcvcGhiQDB4ODAwMDAwMDAvbnZyYW1AMC9hbHRlcm5hdGUtcmVnIFwKLSAgIHwgICAgICAgICAgICAgICAgMCAwIFwKLSAgIHwgICAgICAgICAgICAgICAgbTAsMCwxMCwwIDQwOTYnCi0KLSAgIFRoZSA8PGFzc2lnbmVkLWFkZHJlc3M+PiBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHdoYXQgKGlmIGl0IHdlcmUKLSAgIGltcGxlbWVudGVkKSBiZSBmb3VuZCBpbiB0aGUgY29uZmlnIGJhc2UgcmVnaXN0ZXJzIHdoaWxlIHRoZQotICAgPDxyZWc+PiBhbmQgPDxhbHRlcm5hdGl2ZS1yZWc+PiBwcm9wZXJ0aWVzIGluZGljYXRpbmcgdGhlIGxvY2F0aW9uCi0gICBvZiByZWdpc3RlcnMgd2l0aGluIGVhY2ggYWRkcmVzcyBzcGFjZS4KLQotICAgT2YgdGhlIHBvc3NpYmxlIGFkZHJlc3Nlcywgb25seSB0aGUgbm9uLXJlbG9jYXRhYmxlIHZlcnNpb25zIGFyZQotICAgdXNlZCB3aGVuIGF0dGFjaGluZyB0aGUgZGV2aWNlIHRvIHRoZSBidXMuCi0KLQotICAgQlVHUwotICAgCi0KLSAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgaXMgbGVmdCBhcyBhbgotICAgZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuICBTdWNoIGEgcmVzdHJpY3Rpb24gc2hvdWxkIG9ubHkgaW1wYWN0IG9uCi0gICBzeXN0ZW1zIHdhbnRpbmcgdG8gZHluYW1pY2FsbHkgY29uZmlndXJlIGRldmljZXMgb24gdGhlIFBDSSBidXMuCi0KLSAgIFRoZSA8PENIUlA+PiBkb2N1bWVudCBzcGVjZmllcyBhZGRpdGlvbmFsIChvcHRpb25hbCkgZnVuY3Rpb25hbGl0eQotICAgb2YgdGhlIHByaW1hcnkgUEhCLiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3VjaCBmdW5jdGlvbmFsaXR5IGlzCi0gICBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgotCi0gICBUaGUgT3BlbiBGaXJtd2FyZSBQQ0kgYnVzIGJpbmRpbmdzIGRvY3VtZW50IChyZXYgMS42IGFuZCAyLjApIGlzCi0gICB1bmNsZWFyIG9uIHRoZSB2YWx1ZSBvZiB0aGUgInNzIiBiaXRzIGZvciBhIDY0Yml0IG1lbW9yeSBhZGRyZXNzLgotICAgVGhlIGNvcnJlY3QgdmFsdWUsIGFzIHVzZWQgYnkgdGhpcyBtb2R1bGUsIGlzIDBiMTEuCi0gICAKLSAgIFRoZSBPcGVuIEZpcm13YXJlIFBDSSBidXMgYmluZGluZ3MgZG9jdW1lbnQgKHJldiAxLjYpIHN1Z2dlc3RzIHRoYXQKLSAgIHRoZSByZWdpc3RlciBmaWVsZCBvZiBub24tcmVsb2NhdGFibGUgUENJIGFkZHJlc3Mgc2hvdWxkIGJlIHplcm8uCi0gICBVbmZvcnR1bmF0bHksIFBDSSBhZGRyZXNzZXMgc3BlY2lmaWVkIGluIHRoZSA8PGFzc2lnbmVkLWFkZHJlc3Nlcz4+Ci0gICBwcm9wZXJ0eSBtdXN0IGJlIGJvdGggbm9uLXJlbG9jYXRhYmxlIGFuZCBoYXZlIG5vbi16ZXJvIHJlZ2lzdGVyCi0gICBmaWVsZHMuCi0KLSAgIFRoZSB1bml0LWRlY29kZSBtZXRob2QgaXMgbm90IGluc2VydGluZyBhIGJ1cyBudW1iZXIgaW50byBhbnkKLSAgIGFkZHJlc3MgdGhhdCBpdCBkZWNvZGVzLiAgSW5zdGVhZCB0aGUgYnVzLW51bWJlciBpcyBsZWZ0IGFzIHplcm8uCi0KLSAgIFN1cHBvcnQgZm9yIGFsaWFzZWQgbWVtb3J5IGFuZCBJL08gYWRkcmVzc2VzIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UKLSAgIGZvciB0aGUgcmVhZGVyLgotCi0gICBTdXBwb3J0IGZvciBpbnRlcnJ1cHQtYWNrIGFuZCBzcGVjaWFsIGN5Y2xlcyBhcmUgbGVmdCBhcyBhbgotICAgZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuICBPbmUgaXNzdWUgdG8gY29uc2lkZXIgd2hlbiBhdHRlbXB0aW5nCi0gICB0aGlzIGV4ZXJjaXNlIGlzIGhvdyB0byBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnQtYWNrIGFuZAotICAgc3BlY2lhbCBjeWNsZSByZWdpc3Rlci4gIEhpbnQ6IDw8LzgyNTktaW50ZXJydXB0LWFja293bGVkZ2U+PiBpcwotICAgdGhlIHdyb25nIGFuc3dlci4KLQotICAgQ2hpbGRyZW4gb2YgdGhpcyBub2RlIGNhbiBvbmx5IHVzZSB0aGUgY2xpZW50IGNhbGxiYWNrIGludGVyZmFjZQotICAgd2hlbiBhdHRhY2hpbmcgdGhlbXNlbHZlcyB0byB0aGUgPDxwaGI+Pi4KLQotICAgCi0gICBSRUZFUkVOQ0VTCi0KLQotICAgaHR0cDovL3BsYXlncm91bmQuc3VuLmNvbS8xMjc1L2hvbWUuaHRtbCNPRkRidXNQQ0kKLQotCi0gICAqLwotCi0gICAKLXR5cGVkZWYgc3RydWN0IF9waGJfc3BhY2UgewotICBjb3JlICptYXA7Ci0gIGNvcmVfbWFwICpyZWFkYWJsZTsKLSAgY29yZV9tYXAgKndyaXRlYWJsZTsKLSAgdW5zaWduZWRfd29yZCBwYXJlbnRfYmFzZTsKLSAgaW50IHBhcmVudF9zcGFjZTsKLSAgdW5zaWduZWRfd29yZCBteV9iYXNlOwotICBpbnQgbXlfc3BhY2U7Ci0gIHVuc2lnbmVkIHNpemU7CQotICBjb25zdCBjaGFyICpuYW1lOwotfSBwaGJfc3BhY2U7Ci0KLXR5cGVkZWYgc3RydWN0IF9od19waGJfZGV2aWNlICB7Ci0gIHBoYl9zcGFjZSBzcGFjZVtucl9od19waGJfc3BhY2VzXTsKLX0gaHdfcGhiX2RldmljZTsKLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1od19waGJfZGVjb2RlX25hbWUoaHdfcGhiX2RlY29kZSBsZXZlbCkKLXsKLSAgc3dpdGNoIChsZXZlbCkgewotICBjYXNlIGh3X3BoYl9ub3JtYWxfZGVjb2RlOiByZXR1cm4gIm5vcm1hbCI7Ci0gIGNhc2UgaHdfcGhiX3N1YnRyYWN0aXZlX2RlY29kZTogcmV0dXJuICJzdWJ0cmFjdGl2ZSI7Ci0gIGNhc2UgaHdfcGhiX21hc3Rlcl9hYm9ydF9kZWNvZGU6IHJldHVybiAibWFzdGVyLWFib3J0IjsKLSAgZGVmYXVsdDogcmV0dXJuICJpbnZhbGlkIGRlY29kZSI7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaHdfcGhiX2luaXRfYWRkcmVzcyhkZXZpY2UgKm1lKQotewotICBod19waGJfZGV2aWNlICpwaGIgPSBkZXZpY2VfZGF0YShtZSk7Ci0gCi0gIC8qIGNoZWNrIHNvbWUgYmFzaWMgcHJvcGVydGllcyAqLwotICBpZiAoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMobWUpICE9IDMpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW5jb3JyZWN0ICNhZGRyZXNzLWNlbGxzIik7Ci0gIGlmIChkZXZpY2VfbnJfc2l6ZV9jZWxscyhtZSkgIT0gMikKLSAgICBkZXZpY2VfZXJyb3IobWUsICJpbmNvcnJlY3QgI3NpemUtY2VsbHMiKTsKLQotICAvKiAocmUpIGluaXRpYWxpemUgZWFjaCBQQ0kgc3BhY2UgKi8KLSAgewotICAgIGh3X3BoYl9zcGFjZXMgc3BhY2VfbnI7Ci0gICAgZm9yIChzcGFjZV9uciA9IDA7IHNwYWNlX25yIDwgbnJfaHdfcGhiX3NwYWNlczsgc3BhY2VfbnIrKykgewotICAgICAgcGhiX3NwYWNlICpwY2lfc3BhY2UgPSAmcGhiLT5zcGFjZVtzcGFjZV9ucl07Ci0gICAgICBjb3JlX2luaXQocGNpX3NwYWNlLT5tYXApOwotICAgICAgcGNpX3NwYWNlLT5zaXplID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKiBkZWNvZGUgZWFjaCBvZiB0aGUgcmFuZ2VzIHByb3BlcnRpZXMgZW50ZXJpbmcgdGhlIGluZm9ybWF0aW9uCi0gICAgIGludG8gdGhlIHNwYWNlIHRhYmxlICovCi0gIHsKLSAgICByYW5nZV9wcm9wZXJ0eV9zcGVjIHJhbmdlOwotICAgIGludCByYW5nZXNfZW50cnk7Ci0gICAgCi0gICAgZm9yIChyYW5nZXNfZW50cnkgPSAwOwotCSBkZXZpY2VfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eShtZSwgInJhbmdlcyIsIHJhbmdlc19lbnRyeSwKLQkJCQkJICAmcmFuZ2UpOwotCSByYW5nZXNfZW50cnkrKykgewotICAgICAgaW50IG15X2F0dGFjaF9zcGFjZTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgbXlfYXR0YWNoX2FkZHJlc3M7Ci0gICAgICBpbnQgcGFyZW50X2F0dGFjaF9zcGFjZTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgcGFyZW50X2F0dGFjaF9hZGRyZXNzOwotICAgICAgdW5zaWduZWQgc2l6ZTsKLSAgICAgIHBoYl9zcGFjZSAqcGNpX3NwYWNlOwotICAgICAgLyogY29udmVydCB0aGUgYWRkcmVzc2VzIGludG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgKi8KLSAgICAgIGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKG1lLCAmcmFuZ2UuY2hpbGRfYWRkcmVzcywKLQkJCQkgICAgICAgJm15X2F0dGFjaF9zcGFjZSwKLQkJCQkgICAgICAgJm15X2F0dGFjaF9hZGRyZXNzLAotCQkJCSAgICAgICBtZSk7Ci0gICAgICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKLQkJCQkgICAgICAgJnJhbmdlLnBhcmVudF9hZGRyZXNzLAotCQkJCSAgICAgICAmcGFyZW50X2F0dGFjaF9zcGFjZSwKLQkJCQkgICAgICAgJnBhcmVudF9hdHRhY2hfYWRkcmVzcywKLQkJCQkgICAgICAgbWUpOwotICAgICAgZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUobWUsICZyYW5nZS5zaXplLCAmc2l6ZSwgbWUpOwotICAgICAgaWYgKG15X2F0dGFjaF9zcGFjZSA8IDAgfHwgbXlfYXR0YWNoX3NwYWNlID49IG5yX2h3X3BoYl9zcGFjZXMpCi0JZGV2aWNlX2Vycm9yKG1lLCAicmFuZ2VzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGludmFsaWQgYWRkcmVzcyBzcGFjZSIpOwotICAgICAgcGNpX3NwYWNlID0gJnBoYi0+c3BhY2VbbXlfYXR0YWNoX3NwYWNlXTsKLSAgICAgIGlmIChwY2lfc3BhY2UtPnNpemUgIT0gMCkKLQlkZXZpY2VfZXJyb3IobWUsICJyYW5nZXMgcHJvcGVydHkgY29udGFpbnMgZHVwbGljYXRlIG1hcHBpbmdzIGZvciAlcyBhZGRyZXNzIHNwYWNlIiwKLQkJICAgICBwY2lfc3BhY2UtPm5hbWUpOwotICAgICAgcGNpX3NwYWNlLT5wYXJlbnRfYmFzZSA9IHBhcmVudF9hdHRhY2hfYWRkcmVzczsKLSAgICAgIHBjaV9zcGFjZS0+cGFyZW50X3NwYWNlID0gcGFyZW50X2F0dGFjaF9zcGFjZTsKLSAgICAgIHBjaV9zcGFjZS0+bXlfYmFzZSA9IG15X2F0dGFjaF9hZGRyZXNzOwotICAgICAgcGNpX3NwYWNlLT5teV9zcGFjZSA9IG15X2F0dGFjaF9zcGFjZTsKLSAgICAgIHBjaV9zcGFjZS0+c2l6ZSA9IHNpemU7Ci0gICAgICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCi0JCQkgICAgYXR0YWNoX2NhbGxiYWNrLAotCQkJICAgIHBhcmVudF9hdHRhY2hfc3BhY2UsIHBhcmVudF9hdHRhY2hfYWRkcmVzcywgc2l6ZSwKLQkJCSAgICBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLAotCQkJICAgIG1lKTsKLSAgICAgIERUUkFDRShwaGIsICgibWFwICVkOjB4JWx4IHRvICVzOjB4JWx4ICgweCVseCBieXRlcylcbiIsCi0JCSAgIChpbnQpcGFyZW50X2F0dGFjaF9zcGFjZSwKLQkJICAgKHVuc2lnbmVkIGxvbmcpcGFyZW50X2F0dGFjaF9hZGRyZXNzLAotCQkgICBwY2lfc3BhY2UtPm5hbWUsCi0JCSAgICh1bnNpZ25lZCBsb25nKW15X2F0dGFjaF9hZGRyZXNzLAotCQkgICAodW5zaWduZWQgbG9uZylzaXplKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChyYW5nZXNfZW50cnkgPT0gMCkgewotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiTWlzc2luZyBvciBlbXB0eSByYW5nZXMgcHJvcGVydHkiKTsKLSAgICB9Ci0KLSAgfQotICAKLX0KLQotc3RhdGljIHZvaWQKLWh3X3BoYl9hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAotCQkgICAgICBhdHRhY2hfdHlwZSB0eXBlLAotCQkgICAgICBpbnQgc3BhY2UsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKLQkJICAgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCi17Ci0gIGh3X3BoYl9kZXZpY2UgKnBoYiA9IGRldmljZV9kYXRhKG1lKTsKLSAgcGhiX3NwYWNlICpwY2lfc3BhY2U7Ci0gIC8qIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKHNwYWNlIDwgMCB8fCBzcGFjZSA+PSBucl9od19waGJfc3BhY2VzKQotICAgIGRldmljZV9lcnJvcihtZSwgImF0dGFjaCBzcGFjZSAoJWQpIHNwZWNpZmllZCBieSAlcyBpbnZhbGlkIiwKLQkJIHNwYWNlLCBkZXZpY2VfcGF0aChjbGllbnQpKTsKLSAgcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VdOwotICBpZiAoYWRkciArIG5yX2J5dGVzID4gcGNpX3NwYWNlLT5teV9iYXNlICsgcGNpX3NwYWNlLT5zaXplCi0gICAgICB8fCBhZGRyIDwgcGNpX3NwYWNlLT5teV9iYXNlKQotICAgIGRldmljZV9lcnJvcihtZSwgImF0dGFjaCBhZGRyICgweCVseCkgc3BlY2lmaWVkIGJ5ICVzIG91dHNpZGUgb2YgYnVzIGFkZHJlc3MgcmFuZ2UiLAotCQkgKHVuc2lnbmVkIGxvbmcpYWRkciwgZGV2aWNlX3BhdGgoY2xpZW50KSk7Ci0gIGlmICh0eXBlICE9IGh3X3BoYl9ub3JtYWxfZGVjb2RlCi0gICAgICAmJiB0eXBlICE9IGh3X3BoYl9zdWJ0cmFjdGl2ZV9kZWNvZGUpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiYXR0YWNoIHR5cGUgKCVkKSBzcGVjaWZpZWQgYnkgJXMgaW52YWxpZCIsCi0JCSB0eXBlLCBkZXZpY2VfcGF0aChjbGllbnQpKTsKLSAgLyogYXR0YWNoIGl0IHRvIHRoZSByZWxldmVudCBidXMgKi8KLSAgRFRSQUNFKHBoYiwgKCJhdHRhY2ggJXMgLSAlcyAlczoweCVseCAoMHglbHggYnl0ZXMpXG4iLAotCSAgICAgICBkZXZpY2VfcGF0aChjbGllbnQpLAotCSAgICAgICBod19waGJfZGVjb2RlX25hbWUodHlwZSksCi0JICAgICAgIHBjaV9zcGFjZS0+bmFtZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYWRkciwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpbnJfYnl0ZXMpKTsKLSAgY29yZV9hdHRhY2gocGNpX3NwYWNlLT5tYXAsCi0JICAgICAgdHlwZSwKLQkgICAgICBzcGFjZSwKLQkgICAgICBhY2Nlc3MsCi0JICAgICAgYWRkciwKLQkgICAgICBucl9ieXRlcywKLQkgICAgICBjbGllbnQpOwotfQotCi0KLS8qIEV4dHJhY3Qvc2V0IHZhcmlvdXMgZmllbGRzIGZyb20gYSBQQ0kgdW5pdCBhZGRyZXNzLgotCi0gICBOb3RlOiBvbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGVhY2ggY2VsbCBpcyB1c2VkLgotCi0gICBOb3RlOiBmb3IgUFBDIE1TQiBpcyAwIHdoaWxlIGZvciBQQ0kgaXQgaXMgMzEuICovCi0KLQotLyogcmVsb2NhdGFibGUgYml0IG4gKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X24oY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCi17Ci0gIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfbihkZXZpY2VfdW5pdCAqYWRkcmVzcykKLXsKLSAgQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAwLCAxKTsKLX0KLQotCi0vKiBwcmVmZXRjaGFibGUgYml0IHAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X3AoY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCi17Ci0gIEFTU0VSVChhZGRyZXNzLT5ucl9jZWxscyA9PSAzKTsKLSAgcmV0dXJuIEVYVFJBQ1RFRDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAxLCAxKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wKGRldmljZV91bml0ICphZGRyZXNzKQotewotICBCTElUMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDEsIDEpOwotfQotCi0KLS8qIGFsaWFzZWQgYml0IHQgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X3QoY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCi17Ci0gIEFTU0VSVChhZGRyZXNzLT5ucl9jZWxscyA9PSAzKTsKLSAgcmV0dXJuIEVYVFJBQ1RFRDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAyLCAyKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF90KGRldmljZV91bml0ICphZGRyZXNzKQotewotICBCTElUMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDIsIDEpOwotfQotCi0KLS8qIHNwYWNlIGNvZGUgc3MgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgc3NfY29uZmlnX2NvZGUgPSAwLAotICBzc19pb19jb2RlID0gMSwKLSAgc3NfMzJiaXRfbWVtb3J5X2NvZGUgPSAyLAotICBzc182NGJpdF9tZW1vcnlfY29kZSA9IDMsCi19IHNzX3R5cGU7Ci0KLXN0YXRpYyBzc190eXBlCi1leHRyYWN0X3NzKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQotewotICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7Ci0gIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgNiwgNyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc3MoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHNzX3R5cGUgdmFsKQotewotICBNQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCA2LCA3LCB2YWwpOwotfQotCi0KLS8qIGJ1cyBudW1iZXIgYmJiYmJiYmIgKi8KLQotI2lmIDAKLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF9iYmJiYmJiYihjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKLXsKLSAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOwotICByZXR1cm4gRVhUUkFDVEVEMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDgsIDE1KTsKLX0KLSNlbmRpZgotCi0jaWYgMAotc3RhdGljIHZvaWQKLXNldF9iYmJiYmJiYihkZXZpY2VfdW5pdCAqYWRkcmVzcywgdW5zaWduZWQgdmFsKQotewotICBNQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCA4LCAxNSwgdmFsKTsKLX0KLSNlbmRpZgotCi0KLS8qIGRldmljZSBudW1iZXIgZGRkZGQgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X2RkZGRkKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQotewotICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7Ci0gIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMTYsIDIwKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9kZGRkZChkZXZpY2VfdW5pdCAqYWRkcmVzcywgdW5zaWduZWQgdmFsKQotewotICBNQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAxNiwgMjAsIHZhbCk7Ci19Ci0KLQotLyogZnVuY3Rpb24gbnVtYmVyIGZmZiAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfZmZmKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQotewotICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7Ci0gIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMjEsIDIzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9mZmYoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHVuc2lnbmVkIHZhbCkKLXsKLSAgTUJMSVQzMihhZGRyZXNzLT5jZWxsc1swXSwgMjEsIDIzLCB2YWwpOwotfQotCi0KLS8qIHJlZ2lzdGVyIG51bWJlciBycnJycnJyciAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfcnJycnJycnIoY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCi17Ci0gIEFTU0VSVChhZGRyZXNzLT5ucl9jZWxscyA9PSAzKTsKLSAgcmV0dXJuIEVYVFJBQ1RFRDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAyNCwgMzEpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3JycnJycnJyKGRldmljZV91bml0ICphZGRyZXNzLCB1bnNpZ25lZCB2YWwpCi17Ci0gIE1CTElUMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDI0LCAzMSwgdmFsKTsKLX0KLQotCi0vKiBNU1cgb2YgNjRiaXQgYWRkcmVzcyBoaC4uaGggKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X2hoX2hoKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQotewotICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7Ci0gIHJldHVybiBhZGRyZXNzLT5jZWxsc1sxXTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9oaF9oaChkZXZpY2VfdW5pdCAqYWRkcmVzcywgdW5zaWduZWQgdmFsKQotewotICBhZGRyZXNzLT5jZWxsc1syXSA9IHZhbDsKLX0KLQotCi0vKiBMU1cgb2YgNjRiaXQgYWRkcmVzcyBsbC4ubGwgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0X2xsX2xsKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQotewotICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7Ci0gIHJldHVybiBhZGRyZXNzLT5jZWxsc1syXTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9sbF9sbChkZXZpY2VfdW5pdCAqYWRkcmVzcywgdW5zaWduZWQgdmFsKQotewotICBhZGRyZXNzLT5jZWxsc1syXSA9IHZhbDsKLX0KLQotCi0vKiBDb252ZXJ0IFBDSSB0ZXh0dWFsIGJ1cyBhZGRyZXNzIGludG8gYSBkZXZpY2UgdW5pdCAqLwotCi1zdGF0aWMgaW50Ci1od19waGJfdW5pdF9kZWNvZGUoZGV2aWNlICptZSwKLQkJICAgY29uc3QgY2hhciAqdW5pdCwKLQkJICAgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCi17Ci0gIGNoYXIgKmVuZCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmNocCA9IHVuaXQ7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhtZSkgIT0gMykKLSAgICBkZXZpY2VfZXJyb3IobWUsICJQQ0kgYnVzIHNob3VsZCBoYXZlICNhZGRyZXNzLWNlbGxzID09IDMiKTsKLSAgbWVtc2V0KGFkZHJlc3MsIDAsIHNpemVvZigqYWRkcmVzcykpOwotCi0gIGlmICh1bml0ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYWRkcmVzcy0+bnJfY2VsbHMgPSAzOwotCi0gIGlmIChpc3hkaWdpdCgqY2hwKSkgewotICAgIHNldF9zcyhhZGRyZXNzLCBzc19jb25maWdfY29kZSk7Ci0gIH0KLSAgZWxzZSB7Ci0KLSAgICAvKiBub24tcmVsb2NhdGFibGU/ICovCi0gICAgaWYgKCpjaHAgPT0gJ24nKSB7Ci0gICAgICBzZXRfbihhZGRyZXNzKTsKLSAgICAgIGNocCsrOwotICAgIH0KLQotICAgIC8qIGFkZHJlc3Mtc3BhY2U/ICovCi0gICAgaWYgKCpjaHAgPT0gJ2knKSB7Ci0gICAgICBzZXRfc3MoYWRkcmVzcywgc3NfaW9fY29kZSk7Ci0gICAgICBjaHArKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKmNocCA9PSAnbScpIHsKLSAgICAgIHNldF9zcyhhZGRyZXNzLCBzc18zMmJpdF9tZW1vcnlfY29kZSk7Ci0gICAgICBjaHArKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKmNocCA9PSAneCcpIHsKLSAgICAgIHNldF9zcyhhZGRyZXNzLCBzc182NGJpdF9tZW1vcnlfY29kZSk7Ci0gICAgICBjaHArKzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBwYXJzaW5nIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7Ci0KLSAgICAvKiBwb3NzaWJsZSBhbGlhcyAqLwotICAgIGlmICgqY2hwID09ICd0JykgewotICAgICAgaWYgKGV4dHJhY3Rfc3MoYWRkcmVzcykgPT0gc3NfNjRiaXRfbWVtb3J5X2NvZGUpCi0JZGV2aWNlX2Vycm9yKG1lLCAiSW52YWxpZCBhbGlhcyBiaXQgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgICAgIHNldF90KGFkZHJlc3MpOwotICAgICAgY2hwKys7Ci0gICAgfQotCi0gICAgLyogcG9zc2libGUgcCAqLwotICAgIGlmICgqY2hwID09ICdwJykgewotICAgICAgaWYgKGV4dHJhY3Rfc3MoYWRkcmVzcykgIT0gc3NfMzJiaXRfbWVtb3J5X2NvZGUpCi0JZGV2aWNlX2Vycm9yKG1lLCAiSW52YWxpZCBwcmVmZXRjaGFibGUgYml0IChwKSBpbiBQQ0kgYWRkcmVzcyAlcyIsCi0JCSAgICAgdW5pdCk7Ci0gICAgICBzZXRfcChhZGRyZXNzKTsKLSAgICAgIGNocCsrOwotICAgIH0KLQotICB9Ci0KLSAgLyogcmVxdWlyZWQgREQgKi8KLSAgaWYgKCFpc3hkaWdpdCgqY2hwKSkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJNaXNzaW5nIGRldmljZSBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgdmFsID0gc3RydG91bChjaHAsICZlbmQsIDE2KTsKLSAgaWYgKGNocCA9PSBlbmQpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBwYXJzaW5nIGRldmljZSBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgaWYgKCh2YWwgJiAweDFmKSAhPSB2YWwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiRGV2aWNlIG51bWJlciAoMHglbHgpIG91dCBvZiByYW5nZSAoMC4uMHgxZikgaW4gUENJIGFkZHJlc3MgJXMiLAotCQkgdmFsLCB1bml0KTsKLSAgc2V0X2RkZGRkKGFkZHJlc3MsIHZhbCk7Ci0gIGNocCA9IGVuZDsKLQotICAvKiBGb3IgY29uZmlnIHNwYWNlLCB0aGUgRiBpcyBvcHRpb25hbCAqLwotICBpZiAoZXh0cmFjdF9zcyhhZGRyZXNzKSA9PSBzc19jb25maWdfY29kZQotICAgICAgJiYgKGlzc3BhY2UoKmNocCkgfHwgKmNocCA9PSAnXDAnKSkKLSAgICByZXR1cm4gY2hwIC0gdW5pdDsKLQotICAvKiBmdW5jdGlvbiBudW1iZXIgRiAqLwotICBpZiAoKmNocCAhPSAnLCcpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiTWlzc2luZyBmdW5jdGlvbiBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgY2hwKys7Ci0gIHZhbCA9IHN0cnRvdWwoY2hwLCAmZW5kLCAxMCk7Ci0gIGlmIChjaHAgPT0gZW5kKQotICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBmdW5jdGlvbiBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLAotCQkgdW5pdCk7Ci0gIGlmICgodmFsICYgNykgIT0gdmFsKQotICAgIGRldmljZV9lcnJvcihtZSwgIkZ1bmN0aW9uIG51bWJlciAoJWxkKSBvdXQgb2YgcmFuZ2UgKDAuLjcpIGluIFBDSSBhZGRyZXNzICVzIiwKLQkJIChsb25nKXZhbCwgdW5pdCk7Ci0gIHNldF9mZmYoYWRkcmVzcywgdmFsKTsKLSAgY2hwID0gZW5kOwotCi0gIC8qIGZvciBjb25maWcgc3BhY2UsIG11c3QgYmUgZW5kICovCi0gIGlmIChleHRyYWN0X3NzKGFkZHJlc3MpID09IHNzX2NvbmZpZ19jb2RlKSB7Ci0gICAgaWYgKCFpc3NwYWNlKCpjaHApICYmICpjaHAgIT0gJ1wwJykKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBQQ0kgY29uZmlnIGFkZHJlc3MgJXMiLAotCQkgICB1bml0KTsKLSAgICByZXR1cm4gY2hwIC0gdW5pdDsKLSAgfQotCi0gIC8qIHJlZ2lzdGVyIG51bWJlciBSUiAqLwotICBpZiAoKmNocCAhPSAnLCcpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiTWlzc2luZyByZWdpc3RlciBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgY2hwKys7Ci0gIHZhbCA9IHN0cnRvdWwoY2hwLCAmZW5kLCAxNik7Ci0gIGlmIChjaHAgPT0gZW5kKQotICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyByZWdpc3RlciBudW1iZXIgaW4gUENJIGFkZHJlc3MgJXMiLAotCQkgdW5pdCk7Ci0gIHN3aXRjaCAoZXh0cmFjdF9zcyhhZGRyZXNzKSkgewotICBjYXNlIHNzX2lvX2NvZGU6Ci0jaWYgMAotICAgIGlmIChleHRyYWN0X24oYWRkcmVzcykgJiYgdmFsICE9IDApCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICJub24tcmVsb2NhdGFibGUgSS9PIHJlZ2lzdGVyIG11c3QgYmUgemVybyBpbiBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOwotICAgIGVsc2UgaWYgKCFleHRyYWN0X24oYWRkcmVzcykKLQkgICAgICYmIHZhbCAhPSAweDEwICYmIHZhbCAhPSAweDE0ICYmIHZhbCAhPSAweDE4Ci0JICAgICAmJiB2YWwgIT0gMHgxYyAmJiB2YWwgIT0gMHgyMCAmJiB2YWwgIT0gMHgyNCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIkkvTyByZWdpc3RlciBpbnZhbGlkIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7Ci0jZW5kaWYKLSAgICBicmVhazsKLSAgY2FzZSBzc18zMmJpdF9tZW1vcnlfY29kZToKLSNpZiAwCi0gICAgaWYgKGV4dHJhY3RfbihhZGRyZXNzKSAmJiB2YWwgIT0gMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIm5vbi1yZWxvY2F0YWJsZSBtZW1vcnkgcmVnaXN0ZXIgbXVzdCBiZSB6ZXJvIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7Ci0gICAgZWxzZSBpZiAoIWV4dHJhY3RfbihhZGRyZXNzKQotCSAgICAgJiYgdmFsICE9IDB4MTAgJiYgdmFsICE9IDB4MTQgJiYgdmFsICE9IDB4MTgKLQkgICAgICYmIHZhbCAhPSAweDFjICYmIHZhbCAhPSAweDIwICYmIHZhbCAhPSAweDI0ICYmIHZhbCAhPSAweDMwKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiSS9PIHJlZ2lzdGVyICgweCVseCkgaW52YWxpZCBpbiBQQ0kgYWRkcmVzcyAlcyIsCi0JCSAgIHZhbCwgdW5pdCk7Ci0jZW5kaWYKLSAgICBicmVhazsKLSAgY2FzZSBzc182NGJpdF9tZW1vcnlfY29kZToKLSAgICBpZiAoZXh0cmFjdF9uKGFkZHJlc3MpICYmIHZhbCAhPSAwKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibm9uLXJlbG9jYXRhYmxlIDMyYml0IG1lbW9yeSByZWdpc3RlciBtdXN0IGJlIHplcm8gaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgICBlbHNlIGlmICghZXh0cmFjdF9uKGFkZHJlc3MpCi0JICAgICAmJiB2YWwgIT0gMHgxMCAmJiB2YWwgIT0gMHgxOCAmJiB2YWwgIT0gMHgyMCkKLSAgICAgIGRldmljZV9lcnJvcihtZSwgIlJlZ2lzdGVyIG51bWJlciAoMHglbHgpIGludmFsaWQgaW4gNjRiaXQgUENJIGFkZHJlc3MgJXMiLAotCQkgICB2YWwsIHVuaXQpOwotICBjYXNlIHNzX2NvbmZpZ19jb2RlOgotICAgIGRldmljZV9lcnJvcihtZSwgImludGVybmFsIGVycm9yIik7Ci0gIH0KLSAgaWYgKCh2YWwgJiAweGZmKSAhPSB2YWwpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiUmVnaXN0ZXIgbnVtYmVyICgweCVseCkgb3V0IG9mIHJhbmdlICgwLi4weGZmKSBpbiBQQ0kgYWRkcmVzcyAlcyIsCi0JCSB2YWwsIHVuaXQpOwotICBzZXRfcnJycnJycnIoYWRkcmVzcywgdmFsKTsKLSAgY2hwID0gZW5kOwotCi0gIC8qIGFkZHJlc3MgKi8KLSAgaWYgKCpjaHAgIT0gJywnKQotICAgIGRldmljZV9lcnJvcihtZSwgIk1pc3NpbmcgYWRkcmVzcyBpbiBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOwotICBjaHArKzsKLSAgc3dpdGNoIChleHRyYWN0X3NzKGFkZHJlc3MpKSB7Ci0gIGNhc2Ugc3NfaW9fY29kZToKLSAgY2FzZSBzc18zMmJpdF9tZW1vcnlfY29kZToKLSAgICB2YWwgPSBzdHJ0b3VsKGNocCwgJmVuZCwgMTYpOwotICAgIGlmIChjaHAgPT0gZW5kKQotICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBwYXJzaW5nIGFkZHJlc3MgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKLSAgICBzd2l0Y2ggKGV4dHJhY3Rfc3MoYWRkcmVzcykpIHsKLSAgICBjYXNlIHNzX2lvX2NvZGU6Ci0gICAgICBpZiAoZXh0cmFjdF9uKGFkZHJlc3MpICYmIGV4dHJhY3RfdChhZGRyZXNzKQotCSAgJiYgKHZhbCAmIDEwMjQpICE9IHZhbCkKLQlkZXZpY2VfZXJyb3IobWUsICIxMGJpdCBhbGlhc2VkIG5vbi1yZWxvY2F0YWJsZSBhZGRyZXNzICgweCVseCkgb3V0IG9mIHJhbmdlIGluIFBDSSBhZGRyZXNzICVzIiwKLQkJICAgICB2YWwsIHVuaXQpOwotICAgICAgaWYgKCFleHRyYWN0X24oYWRkcmVzcykgJiYgZXh0cmFjdF90KGFkZHJlc3MpCi0JICAmJiAodmFsICYgMHhmZmZmKSAhPSB2YWwpCi0JZGV2aWNlX2Vycm9yKG1lLCAiNjRrIHJlbG9jYXRhYmxlIGFkZHJlc3MgKDB4JWx4KSBvdXQgb2YgcmFuZ2UgaW4gUENJIGFkZHJlc3MgJXMiLAotCQkgICAgIHZhbCwgdW5pdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNzXzMyYml0X21lbW9yeV9jb2RlOgotICAgICAgaWYgKGV4dHJhY3RfdChhZGRyZXNzKSAmJiAodmFsICYgMHhmZmZmZikgIT0gdmFsKQotCWRldmljZV9lcnJvcihtZSwgIjFtYiBtZW1vcnkgYWRkcmVzcyAoMHglbHgpIG91dCBvZiByYW5nZSBpbiBQQ0kgYWRkcmVzcyAlcyIsCi0JCSAgICAgdmFsLCB1bml0KTsKLSAgICAgIGlmICghZXh0cmFjdF90KGFkZHJlc3MpICYmICh2YWwgJiAweGZmZmZmZmZmKSAhPSB2YWwpCi0JZGV2aWNlX2Vycm9yKG1lLCAiMzJiaXQgbWVtb3J5IGFkZHJlc3MgKDB4JWx4KSBvdXQgb2YgcmFuZ2UgaW4gUENJIGFkZHJlc3MgJXMiLAotCQkgICAgIHZhbCwgdW5pdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNzXzY0Yml0X21lbW9yeV9jb2RlOgotICAgIGNhc2Ugc3NfY29uZmlnX2NvZGU6Ci0gICAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcm5hbCBlcnJvciIpOwotICAgIH0KLSAgICBzZXRfbGxfbGwoYWRkcmVzcywgdmFsKTsKLSAgICBjaHAgPSBlbmQ7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugc3NfNjRiaXRfbWVtb3J5X2NvZGU6Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiNjRiaXQgYWRkcmVzc2VzIHVuaW1wbGVtZW50ZWQiKTsKLSAgICBzZXRfaGhfaGgoYWRkcmVzcywgdmFsKTsKLSAgICBzZXRfbGxfbGwoYWRkcmVzcywgdmFsKTsKLSAgICBicmVhazsKLSAgY2FzZSBzc19jb25maWdfY29kZToKLSAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcm5hbCBlcnJvciIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogZmluaXNoZWQ/ICovCi0gIGlmICghaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmxlbSBwYXJzaW5nIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7Ci0KLSAgcmV0dXJuIGNocCAtIHVuaXQ7Ci19Ci0KLQotLyogQ29udmVydCBQQ0kgZGV2aWNlIHVuaXQgaW50byBpdHMgY29ycmVzcG9uZGluZyB0ZXh0dWFsCi0gICByZXByZXNlbnRhdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1od19waGJfdW5pdF9lbmNvZGUoZGV2aWNlICptZSwKLQkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkJICAgY2hhciAqYnVmLAotCQkgICBpbnQgc2l6ZW9mX2J1ZikKLXsKLSAgaWYgKHVuaXRfYWRkcmVzcy0+bnJfY2VsbHMgIT0gMykKLSAgICBkZXZpY2VfZXJyb3IobWUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNlbGxzIGluIFBDSSB1bml0IGFkZHJlc3MiKTsKLSAgaWYgKGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKG1lKSAhPSAzKQotICAgIGRldmljZV9lcnJvcihtZSwgIlBDSSBidXMgc2hvdWxkIGhhdmUgI2FkZHJlc3MtY2VsbHMgPT0gMyIpOwotICBpZiAoZXh0cmFjdF9zcyh1bml0X2FkZHJlc3MpID09IHNzX2NvbmZpZ19jb2RlCi0gICAgICAmJiBleHRyYWN0X2ZmZih1bml0X2FkZHJlc3MpID09IDAKLSAgICAgICYmIGV4dHJhY3RfcnJycnJycnIodW5pdF9hZGRyZXNzKSA9PSAwCi0gICAgICAmJiBleHRyYWN0X2hoX2hoKHVuaXRfYWRkcmVzcykgPT0gMAotICAgICAgJiYgZXh0cmFjdF9sbF9sbCh1bml0X2FkZHJlc3MpID09IDApIHsKLSAgICAvKiBERCAtIENvbmZpZ3VyYXRpb24gU3BhY2UgYWRkcmVzcyAqLwotICAgIHNwcmludGYoYnVmLCAiJXgiLAotCSAgICBleHRyYWN0X2RkZGRkKHVuaXRfYWRkcmVzcykpOwotICB9Ci0gIGVsc2UgaWYgKGV4dHJhY3Rfc3ModW5pdF9hZGRyZXNzKSA9PSBzc19jb25maWdfY29kZQotCSAgICYmIGV4dHJhY3RfZmZmKHVuaXRfYWRkcmVzcykgIT0gMAotCSAgICYmIGV4dHJhY3RfcnJycnJycnIodW5pdF9hZGRyZXNzKSA9PSAwCi0JICAgJiYgZXh0cmFjdF9oaF9oaCh1bml0X2FkZHJlc3MpID09IDAKLQkgICAmJiBleHRyYWN0X2xsX2xsKHVuaXRfYWRkcmVzcykgPT0gMCkgewotICAgIC8qIERELEYgLSBDb25maWd1cmF0aW9uIFNwYWNlICovCi0gICAgc3ByaW50ZihidWYsICIleCwlZCIsCi0JICAgIGV4dHJhY3RfZGRkZGQodW5pdF9hZGRyZXNzKSwKLQkgICAgZXh0cmFjdF9mZmYodW5pdF9hZGRyZXNzKSk7Ci0gIH0KLSAgZWxzZSBpZiAoZXh0cmFjdF9zcyh1bml0X2FkZHJlc3MpID09IHNzX2lvX2NvZGUKLQkgICAmJiBleHRyYWN0X2hoX2hoKHVuaXRfYWRkcmVzcykgPT0gMCkgewotICAgIC8qIFtuXWlbdF1ERCxGLFJSLE5OTk5OTk5OIC0gMzJiaXQgSS9PIHNwYWNlICovCi0gICAgc3ByaW50ZihidWYsICIlc2klcyV4LCVkLCV4LCV4IiwKLQkgICAgZXh0cmFjdF9uKHVuaXRfYWRkcmVzcykgPyAibiIgOiAiIiwKLQkgICAgZXh0cmFjdF90KHVuaXRfYWRkcmVzcykgPyAidCIgOiAiIiwKLQkgICAgZXh0cmFjdF9kZGRkZCh1bml0X2FkZHJlc3MpLAotCSAgICBleHRyYWN0X2ZmZih1bml0X2FkZHJlc3MpLAotCSAgICBleHRyYWN0X3JycnJycnJyKHVuaXRfYWRkcmVzcyksCi0JICAgIGV4dHJhY3RfbGxfbGwodW5pdF9hZGRyZXNzKSk7Ci0gIH0KLSAgZWxzZSBpZiAoZXh0cmFjdF9zcyh1bml0X2FkZHJlc3MpID09IHNzXzMyYml0X21lbW9yeV9jb2RlCi0JICAgJiYgZXh0cmFjdF9oaF9oaCh1bml0X2FkZHJlc3MpID09IDApIHsKLSAgICAvKiBbbl1tW3RdW3BdREQsRixSUixOTk5OTk5OTiAtIDMyYml0IG1lbW9yeSBzcGFjZSAqLwotICAgIHNwcmludGYoYnVmLCAiJXNtJXMlcyV4LCVkLCV4LCV4IiwKLQkgICAgZXh0cmFjdF9uKHVuaXRfYWRkcmVzcykgPyAibiIgOiAiIiwKLQkgICAgZXh0cmFjdF90KHVuaXRfYWRkcmVzcykgPyAidCIgOiAiIiwKLQkgICAgZXh0cmFjdF9wKHVuaXRfYWRkcmVzcykgPyAicCIgOiAiIiwKLQkgICAgZXh0cmFjdF9kZGRkZCh1bml0X2FkZHJlc3MpLAotCSAgICBleHRyYWN0X2ZmZih1bml0X2FkZHJlc3MpLAotCSAgICBleHRyYWN0X3JycnJycnJyKHVuaXRfYWRkcmVzcyksCi0JICAgIGV4dHJhY3RfbGxfbGwodW5pdF9hZGRyZXNzKSk7Ci0gIH0KLSAgZWxzZSBpZiAoZXh0cmFjdF9zcyh1bml0X2FkZHJlc3MpID09IHNzXzMyYml0X21lbW9yeV9jb2RlKSB7Ci0gICAgLyogW25deFtwXURELEYsUlIsTk5OTk5OTk5OTk5OTk5OTiAtIDY0Yml0IG1lbW9yeSBzcGFjZSAqLwotICAgIHNwcmludGYoYnVmLCAiJXN4JXMleCwlZCwleCwleCUwOHgiLAotCSAgICBleHRyYWN0X24odW5pdF9hZGRyZXNzKSA/ICJuIiA6ICIiLAotCSAgICBleHRyYWN0X3AodW5pdF9hZGRyZXNzKSA/ICJwIiA6ICIiLAotCSAgICBleHRyYWN0X2RkZGRkKHVuaXRfYWRkcmVzcyksCi0JICAgIGV4dHJhY3RfZmZmKHVuaXRfYWRkcmVzcyksCi0JICAgIGV4dHJhY3RfcnJycnJycnIodW5pdF9hZGRyZXNzKSwKLQkgICAgZXh0cmFjdF9oaF9oaCh1bml0X2FkZHJlc3MpLAotCSAgICBleHRyYWN0X2xsX2xsKHVuaXRfYWRkcmVzcykpOwotICB9Ci0gIGVsc2UgewotICAgIGRldmljZV9lcnJvcihtZSwgIkludmFsaWQgUENJIHVuaXQgYWRkcmVzcyAweCUwOGx4IDB4JTA4bHggMHglMDhseCIsCi0JCSAodW5zaWduZWQgbG9uZyl1bml0X2FkZHJlc3MtPmNlbGxzWzBdLAotCQkgKHVuc2lnbmVkIGxvbmcpdW5pdF9hZGRyZXNzLT5jZWxsc1sxXSwKLQkJICh1bnNpZ25lZCBsb25nKXVuaXRfYWRkcmVzcy0+Y2VsbHNbMl0pOwotICB9Ci0gIGlmIChzdHJsZW4oYnVmKSA+IHNpemVvZl9idWYpCi0gICAgZXJyb3IoImJ1ZmZlciBvdmVyZmxvdyIpOwotICByZXR1cm4gc3RybGVuKGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludAotaHdfcGhiX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKLQkJCQkgY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MsCi0JCQkJIGludCAqYXR0YWNoX3NwYWNlLAotCQkJCSB1bnNpZ25lZF93b3JkICphdHRhY2hfYWRkcmVzcywKLQkJCQkgZGV2aWNlICpjbGllbnQpCi17Ci0gIGlmIChhZGRyZXNzLT5ucl9jZWxscyAhPSAzKQotICAgIGRldmljZV9lcnJvcihtZSwgImF0dGFjaCBhZGRyZXNzIGhhcyBpbmNvcnJlY3QgbnVtYmVyIG9mIGNlbGxzIik7Ci0gIGlmIChhZGRyZXNzLT5jZWxsc1sxXSAhPSAwKQotICAgIGRldmljZV9lcnJvcihtZSwgIjY0Yml0IGF0dGFjaCBhZGRyZXNzIHVuc3VwcG9ydGVkIik7Ci0KLSAgLyogZGlyZWN0bHkgZGVjb2RlIHRoZSBhZGRyZXNzL3NwYWNlICovCi0gICphdHRhY2hfYWRkcmVzcyA9IGFkZHJlc3MtPmNlbGxzWzJdOwotICBzd2l0Y2ggKGV4dHJhY3Rfc3MoYWRkcmVzcykpIHsKLSAgY2FzZSBzc19jb25maWdfY29kZToKLSAgICAqYXR0YWNoX3NwYWNlID0gaHdfcGhiX2NvbmZpZ19zcGFjZTsKLSAgICBicmVhazsKLSAgY2FzZSBzc19pb19jb2RlOgotICAgICphdHRhY2hfc3BhY2UgPSBod19waGJfaW9fc3BhY2U7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugc3NfMzJiaXRfbWVtb3J5X2NvZGU6Ci0gIGNhc2Ugc3NfNjRiaXRfbWVtb3J5X2NvZGU6Ci0gICAgKmF0dGFjaF9zcGFjZSA9IGh3X3BoYl9tZW1vcnlfc3BhY2U7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBpZiBub24tcmVsb2NhdGFibGUgZmluaXNoZWQgKi8KLSAgaWYgKGV4dHJhY3RfbihhZGRyZXNzKSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBtYWtlIG1lbW9yeSBhbmQgSS9PIGFkZHJlc3NlcyBhYnNvbHV0ZSAqLwotICBpZiAoKmF0dGFjaF9zcGFjZSA9PSBod19waGJfaW9fc3BhY2UKLSAgICAgIHx8ICphdHRhY2hfc3BhY2UgPT0gaHdfcGhiX21lbW9yeV9zcGFjZSkgewotICAgIGludCByZWdfbnI7Ci0gICAgcmVnX3Byb3BlcnR5X3NwZWMgYXNzaWduZWQ7Ci0gICAgaWYgKGV4dHJhY3Rfc3MoYWRkcmVzcykgPT0gc3NfNjRiaXRfbWVtb3J5X2NvZGUpCi0gICAgICBkZXZpY2VfZXJyb3IobWUsICI2NGJpdCBtZW1vcnkgYWRkcmVzcyBub3QgdW5zdXBvcnRlZCIpOwotICAgIGZvciAocmVnX25yID0gMDsKLQkgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KGNsaWVudCwgImFzc2lnbmVkLWFkZHJlc3NlcyIsIHJlZ19uciwKLQkJCQkJJmFzc2lnbmVkKTsKLQkgcmVnX25yKyspIHsKLSAgICAgIGlmICghZXh0cmFjdF9uKCZhc3NpZ25lZC5hZGRyZXNzKQotCSAgfHwgZXh0cmFjdF9ycnJycnJycigmYXNzaWduZWQuYWRkcmVzcykgPT0gMCkKLQlkZXZpY2VfZXJyb3IobWUsICJjbGllbnQgJXMgaGFzIGludmFsaWQgYXNzaWduZWQtYWRkcmVzcyBwcm9wZXJ0eSIsCi0JCSAgICAgZGV2aWNlX3BhdGgoY2xpZW50KSk7Ci0gICAgICBpZiAoZXh0cmFjdF9ycnJycnJycihhZGRyZXNzKSA9PSBleHRyYWN0X3JycnJycnJyKCZhc3NpZ25lZC5hZGRyZXNzKSkgewotCS8qIGNvcnJlc3BvbmRpbmcgYmFzZSByZWdpc3RlciAqLwotCWlmIChleHRyYWN0X3NzKGFkZHJlc3MpICE9IGV4dHJhY3Rfc3MoJmFzc2lnbmVkLmFkZHJlc3MpKQotCSAgZGV2aWNlX2Vycm9yKG1lLCAiY2xpZW50ICVzIGhhcyBjb25mbGljdGluZyB0eXBlcyBmb3IgYmFzZSByZWdpc3RlciAweCVseCIsCi0JCSAgICAgICBkZXZpY2VfcGF0aChjbGllbnQpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZXh0cmFjdF9ycnJycnJycihhZGRyZXNzKSk7Ci0JKmF0dGFjaF9hZGRyZXNzICs9IGFzc2lnbmVkLmFkZHJlc3MuY2VsbHNbMl07Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGRldmljZV9lcnJvcihtZSwgImNsaWVudCAlcyBtaXNzaW5nIGJhc2UgYWRkcmVzcyByZWdpc3RlciAweCVseCBpbiBhc3NpZ25lZC1hZGRyZXNzZXMgcHJvcGVydHkiLAotCQkgZGV2aWNlX3BhdGgoY2xpZW50KSwKLQkJICh1bnNpZ25lZCBsb25nKWV4dHJhY3RfcnJycnJycnIoYWRkcmVzcykpOwotICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1od19waGJfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2UgKm1lLAotCQkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnNpemUsCi0JCQkgICB1bnNpZ25lZCAqbnJfYnl0ZXMsCi0JCQkgICBkZXZpY2UgKmNsaWVudCkKLXsKLSAgaWYgKHNpemUtPm5yX2NlbGxzICE9IDIpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAic2l6ZSBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBjZWxscyIpOwotICBpZiAoc2l6ZS0+Y2VsbHNbMF0gIT0gMCkKLSAgICBkZXZpY2VfZXJyb3IobWUsICI2NGJpdCBzaXplIHVuc3VwcG9ydGVkIik7Ci0gICpucl9ieXRlcyA9IHNpemUtPmNlbGxzWzFdOwotICByZXR1cm4gc2l6ZS0+Y2VsbHNbMV07Ci19Ci0KLQotc3RhdGljIGNvbnN0IHBoYl9zcGFjZSAqCi1maW5kX3BoYl9zcGFjZShod19waGJfZGV2aWNlICpwaGIsCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIGh3X3BoYl9zcGFjZXMgc3BhY2U7Ci0gIC8qIGZpbmQgdGhlIHNwYWNlIHRoYXQgbWF0Y2hlcyB0aGUgYWRkcmVzcyAqLwotICBmb3IgKHNwYWNlID0gMDsgc3BhY2UgPCBucl9od19waGJfc3BhY2VzOyBzcGFjZSsrKSB7Ci0gICAgcGhiX3NwYWNlICpwY2lfc3BhY2UgPSAmcGhiLT5zcGFjZVtzcGFjZV07Ci0gICAgaWYgKGFkZHIgPj0gcGNpX3NwYWNlLT5wYXJlbnRfYmFzZQotCSYmIChhZGRyICsgbnJfYnl0ZXMpIDw9IChwY2lfc3BhY2UtPnBhcmVudF9iYXNlICsgcGNpX3NwYWNlLT5zaXplKSkgewotICAgICAgcmV0dXJuIHBjaV9zcGFjZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkX3dvcmQKLW1hcF9waGJfYWRkcihjb25zdCBwaGJfc3BhY2UgKnNwYWNlLAotCSAgICAgdW5zaWduZWRfd29yZCBhZGRyKQotewotICByZXR1cm4gYWRkciAtIHNwYWNlLT5wYXJlbnRfYmFzZSArIHNwYWNlLT5teV9iYXNlOwotfQotCi0KLQotc3RhdGljIHVuc2lnbmVkCi1od19waGJfaW9fcmVhZF9idWZmZXIoZGV2aWNlICptZSwKLQkJICAgICAgdm9pZCAqZGVzdCwKLQkJICAgICAgaW50IHNwYWNlLAotCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X3BoYl9kZXZpY2UgKnBoYiA9IChod19waGJfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGNvbnN0IHBoYl9zcGFjZSAqcGNpX3NwYWNlID0gZmluZF9waGJfc3BhY2UocGhiLCBhZGRyLCBucl9ieXRlcyk7Ci0gIHVuc2lnbmVkX3dvcmQgYnVzX2FkZHI7Ci0gIGlmIChwY2lfc3BhY2UgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgYnVzX2FkZHIgPSBtYXBfcGhiX2FkZHIocGNpX3NwYWNlLCBhZGRyKTsKLSAgRFRSQUNFKHBoYiwgKCJpbyByZWFkIC0gJWQ6MHglbHggLT4gJXM6MHglbHggKCV1IGJ5dGVzKVxuIiwKLQkgICAgICAgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHIsIHBjaV9zcGFjZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnVzX2FkZHIsCi0JICAgICAgIG5yX2J5dGVzKSk7Ci0gIHJldHVybiBjb3JlX21hcF9yZWFkX2J1ZmZlcihwY2lfc3BhY2UtPnJlYWRhYmxlLAotCQkJICAgICAgZGVzdCwgYnVzX2FkZHIsIG5yX2J5dGVzKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X3BoYl9pb193cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAotCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaHdfcGhiX2RldmljZSAqcGhiID0gKGh3X3BoYl9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKLSAgY29uc3QgcGhiX3NwYWNlICpwY2lfc3BhY2UgPSBmaW5kX3BoYl9zcGFjZShwaGIsIGFkZHIsIG5yX2J5dGVzKTsKLSAgdW5zaWduZWRfd29yZCBidXNfYWRkcjsKLSAgaWYgKHBjaV9zcGFjZSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBidXNfYWRkciA9IG1hcF9waGJfYWRkcihwY2lfc3BhY2UsIGFkZHIpOwotICBEVFJBQ0UocGhiLCAoImlvIHdyaXRlIC0gJWQ6MHglbHggLT4gJXM6MHglbHggKCV1IGJ5dGVzKVxuIiwKLQkgICAgICAgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHIsIHBjaV9zcGFjZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnVzX2FkZHIsCi0JICAgICAgIG5yX2J5dGVzKSk7Ci0gIHJldHVybiBjb3JlX21hcF93cml0ZV9idWZmZXIocGNpX3NwYWNlLT53cml0ZWFibGUsIHNvdXJjZSwKLQkJCSAgICAgICBidXNfYWRkciwgbnJfYnl0ZXMpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfcGhiX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAotCQkgICAgICAgdm9pZCAqZGVzdCwKLQkJICAgICAgIGludCBzcGFjZSwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQotewotICBod19waGJfZGV2aWNlICpwaGIgPSAoaHdfcGhiX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBjb25zdCBwaGJfc3BhY2UgKnBjaV9zcGFjZTsKLSAgLyogZmluZCB0aGUgc3BhY2UgKi8KLSAgaWYgKHNwYWNlICE9IGh3X3BoYl9tZW1vcnlfc3BhY2UpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBkbWEgYWRkcmVzcyBzcGFjZSAlZCIsIHNwYWNlKTsKLSAgcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VdOwotICAvKiBjaGVjayBvdXQgdGhlIGFkZHJlc3MgKi8KLSAgaWYgKChhZGRyID49IHBjaV9zcGFjZS0+bXlfYmFzZQotICAgICAgICYmIGFkZHIgPD0gcGNpX3NwYWNlLT5teV9iYXNlICsgcGNpX3NwYWNlLT5zaXplKQotICAgICAgfHwgKGFkZHIgKyBucl9ieXRlcyA+PSBwY2lfc3BhY2UtPm15X2Jhc2UKLQkgICYmIGFkZHIgKyBucl9ieXRlcyA8PSBwY2lfc3BhY2UtPm15X2Jhc2UgKyBwY2lfc3BhY2UtPnNpemUpKQotICAgIGRldmljZV9lcnJvcihtZSwgIkRvIG5vdCBzdXBwb3J0IERNQSBpbnRvIG93biBidXMiKTsKLSAgLyogZG8gaXQgKi8KLSAgRFRSQUNFKHBoYiwgKCJkbWEgcmVhZCAtICVzOjB4JWx4ICglZCBieXRlcylcbiIsCi0JICAgICAgIHBjaV9zcGFjZS0+bmFtZSwgYWRkciwgbnJfYnl0ZXMpKTsKLSAgcmV0dXJuIGRldmljZV9kbWFfcmVhZF9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCi0JCQkJZGVzdCwgcGNpX3NwYWNlLT5wYXJlbnRfc3BhY2UsCi0JCQkJYWRkciwgbnJfYnl0ZXMpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfcGhiX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlICptZSwKLQkJCWNvbnN0IHZvaWQgKnNvdXJjZSwKLQkJCWludCBzcGFjZSwKLQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXVuc2lnbmVkIG5yX2J5dGVzLAotCQkJaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pCi17Ci0gIGh3X3BoYl9kZXZpY2UgKnBoYiA9IChod19waGJfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIGNvbnN0IHBoYl9zcGFjZSAqcGNpX3NwYWNlOwotICAvKiBmaW5kIHRoZSBzcGFjZSAqLwotICBpZiAoc3BhY2UgIT0gaHdfcGhiX21lbW9yeV9zcGFjZSkKLSAgICBkZXZpY2VfZXJyb3IobWUsICJpbnZhbGlkIGRtYSBhZGRyZXNzIHNwYWNlICVkIiwgc3BhY2UpOwotICBwY2lfc3BhY2UgPSAmcGhiLT5zcGFjZVtzcGFjZV07Ci0gIC8qIGNoZWNrIG91dCB0aGUgYWRkcmVzcyAqLwotICBpZiAoKGFkZHIgPj0gcGNpX3NwYWNlLT5teV9iYXNlCi0gICAgICAgJiYgYWRkciA8PSBwY2lfc3BhY2UtPm15X2Jhc2UgKyBwY2lfc3BhY2UtPnNpemUpCi0gICAgICB8fCAoYWRkciArIG5yX2J5dGVzID49IHBjaV9zcGFjZS0+bXlfYmFzZQotCSAgJiYgYWRkciArIG5yX2J5dGVzIDw9IHBjaV9zcGFjZS0+bXlfYmFzZSArIHBjaV9zcGFjZS0+c2l6ZSkpCi0gICAgZGV2aWNlX2Vycm9yKG1lLCAiRG8gbm90IHN1cHBvcnQgRE1BIGludG8gb3duIGJ1cyIpOwotICAvKiBkbyBpdCAqLwotICBEVFJBQ0UocGhiLCAoImRtYSB3cml0ZSAtICVzOjB4JWx4ICglZCBieXRlcylcbiIsCi0JICAgICAgIHBjaV9zcGFjZS0+bmFtZSwgYWRkciwgbnJfYnl0ZXMpKTsKLSAgcmV0dXJuIGRldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZV9wYXJlbnQobWUpLAotCQkJCSBzb3VyY2UsIHBjaV9zcGFjZS0+cGFyZW50X3NwYWNlLAotCQkJCSBhZGRyLCBucl9ieXRlcywKLQkJCQkgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Ci19Ci0KLQotc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfcGhiX2NhbGxiYWNrcyA9IHsKLSAgeyBod19waGJfaW5pdF9hZGRyZXNzLCB9LAotICB7IGh3X3BoYl9hdHRhY2hfYWRkcmVzcywgfSwKLSAgeyBod19waGJfaW9fcmVhZF9idWZmZXIsIGh3X3BoYl9pb193cml0ZV9idWZmZXIgfSwKLSAgeyBod19waGJfZG1hX3JlYWRfYnVmZmVyLCBod19waGJfZG1hX3dyaXRlX2J1ZmZlciB9LAotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IGh3X3BoYl91bml0X2RlY29kZSwKLSAgICBod19waGJfdW5pdF9lbmNvZGUsCi0gICAgaHdfcGhiX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCi0gICAgaHdfcGhiX3NpemVfdG9fYXR0YWNoX3NpemUgfQotfTsKLQotCi1zdGF0aWMgdm9pZCAqCi1od19waGJfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKLQkgICAgICBjb25zdCBjaGFyICphcmdzKQotewotICAvKiBjcmVhdGUgdGhlIGRlc2NyaXB0b3IgKi8KLSAgaHdfcGhiX2RldmljZSAqcGhiID0gWkFMTE9DKGh3X3BoYl9kZXZpY2UpOwotCi0gIC8qIGNyZWF0ZSB0aGUgY29yZSBtYXBzIG5vdyAqLwotICBod19waGJfc3BhY2VzIHNwYWNlX25yOwotICBmb3IgKHNwYWNlX25yID0gMDsgc3BhY2VfbnIgPCBucl9od19waGJfc3BhY2VzOyBzcGFjZV9ucisrKSB7Ci0gICAgcGhiX3NwYWNlICpwY2lfc3BhY2UgPSAmcGhiLT5zcGFjZVtzcGFjZV9ucl07Ci0gICAgcGNpX3NwYWNlLT5tYXAgPSBjb3JlX2NyZWF0ZSgpOwotICAgIHBjaV9zcGFjZS0+cmVhZGFibGUgPSBjb3JlX3JlYWRhYmxlKHBjaV9zcGFjZS0+bWFwKTsKLSAgICBwY2lfc3BhY2UtPndyaXRlYWJsZSA9IGNvcmVfd3JpdGVhYmxlKHBjaV9zcGFjZS0+bWFwKTsKLSAgICBzd2l0Y2ggKHNwYWNlX25yKSB7Ci0gICAgY2FzZSBod19waGJfbWVtb3J5X3NwYWNlOgotICAgICAgcGNpX3NwYWNlLT5uYW1lID0gIm1lbW9yeSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGh3X3BoYl9pb19zcGFjZToKLSAgICAgIHBjaV9zcGFjZS0+bmFtZSA9ICJJL08iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBod19waGJfY29uZmlnX3NwYWNlOgotICAgICAgcGNpX3NwYWNlLT5uYW1lID0gImNvbmZpZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGh3X3BoYl9zcGVjaWFsX3NwYWNlOgotICAgICAgcGNpX3NwYWNlLT5uYW1lID0gInNwZWNpYWwiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yICgiaW50ZXJuYWwgZXJyb3IiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBwaGI7Ci19Ci0KLQotY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfcGhiX2RldmljZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgInBoYiIsIGh3X3BoYl9jcmVhdGUsICZod19waGJfY2FsbGJhY2tzIH0sCi0gIHsgInBjaSIsIE5VTEwsICZod19waGJfY2FsbGJhY2tzIH0sCi0gIHsgTlVMTCwgfSwKLX07Ci0KLSNlbmRpZiAvKiBfSFdfUEhCXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19waGIuaCBiL3NpbS9wcGMvaHdfcGhiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMGZlMGEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od19waGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0hXX1BIQl9IXwotI2RlZmluZSBfSFdfUEhCX0hfCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGh3X3BoYl9tZW1vcnlfc3BhY2UsCi0gIGh3X3BoYl9pb19zcGFjZSwKLSAgaHdfcGhiX2NvbmZpZ19zcGFjZSwKLSAgaHdfcGhiX3NwZWNpYWxfc3BhY2UsCi0gIG5yX2h3X3BoYl9zcGFjZXMsCi19IGh3X3BoYl9zcGFjZXM7Ci0KLXR5cGVkZWYgZW51bSAgewotICBod19waGJfbm9ybWFsX2RlY29kZSA9IGF0dGFjaF9jYWxsYmFjaywKLSAgaHdfcGhiX3N1YnRyYWN0aXZlX2RlY29kZSwKLSAgaHdfcGhiX21hc3Rlcl9hYm9ydF9kZWNvZGUsCi19IGh3X3BoYl9kZWNvZGU7Ci0KLQotI2VuZGlmIC8qIF9IV19QSEJfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfcmVnaXN0ZXIuYyBiL3NpbS9wcGMvaHdfcmVnaXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2MWU0Ni4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X3JlZ2lzdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfUkVHSVNURVJfQ18KLSNkZWZpbmUgX0hXX1JFR0lTVEVSX0NfCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJwc2ltLmgiCi0KLS8qIERFVklDRQotCi0KLSAgIHJlZ2lzdGVyIC0gZHVtbXkgZGV2aWNlIHRvIGluaXRpYWxpemUgcHJvY2Vzc29yIHJlZ2lzdGVycwotCi0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgZGV2aWNlIGFyZSB1c2VkLCBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRvCi0gICBzcGVjaWZ5IHRoZSBpbml0aWFsIHZhbHVlIG9mIHZhcmlvdXMgcHJvY2Vzc29yIHJlZ2lzdGVycy4gIFRoZQotICAgcHJvcGVydHkgbmFtZSBzcGVjaWZ5aW5nIHRoZSByZWdpc3RlciB0byBiZSBpbml0aWFsaXplZCB3aXRoIHRoZQotICAgc3BlY2lhbCBmb3JtIDxjcHUtbnI+LjxyZWdpc3Rlcj4gYmVpbmcgdXNlZCB0byBpbml0aWFsaXplIGEKLSAgIHNwZWNpZmljIHByb2Nlc3NvcidzIHJlZ2lzdGVyIChlZyAwLnBjKS4KLQotICAgQmVjYXVzZSwgd2hlbiB0aGUgZGV2aWNlIHRyZWUgaXMgY3JlYXRlZCwgb3ZlcnJpZGluZyBwcm9wZXJ0aWVzIGFyZQotICAgZW50ZXJlZCBpbnRvIHRoZSB0cmVlIGJlZm9yZSBhbnkgZGVmYXVsdCB2YWx1ZXMsIHRoaXMgZGV2aWNlIG11c3QKLSAgIGluaXRpYWxpemUgcmVnaXN0ZXJzIGluIG5ld2VzdCAoZGVmYXVsdCkgdG8gb2xkZXN0IChvdmVycmlkaW5nKQotICAgcHJvcGVydHkgb3JkZXIuCi0KLSAgIFRoZSBhY3R1YWwgcmVnaXN0ZXJzIChmb3IgYSBnaXZlbiB0YXJnZXQpIGFyZSBkZWZpbmVkIGluIHRoZSBmaWxlCi0gICByZWdpc3RlcnMuYy4KLQotICAgVGhpcyBkZXZpY2UgaXMgbm9ybWFsbHkgYSBjaGlsZCBvZiB0aGUgL29wZW5wcm9tL2luaXQgbm9kZS4KLQotCi0gICBFWEFNUExFUwotCi0KLSAgIEdpdmVuIGEgZGV2aWNlIHRyZWUgY29udGFpbmluZyB0aGUgZW50cnk6Ci0KLSAgIHwJL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHhmZmYwMGNmMAotCi0gICB0aGVuIHNwZWNpZnlpbmcgdGhlIGNvbW1hbmQgbGluZSBvcHRpb246Ci0KLSAgIHwJLW8gJy9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3BjIDB4MCcKLQotICAgd291bGQgb3ZlcnJpZGUgdGhlIGluaXRpYWwgdmFsdWUgb2YgcHJvY2Vzc29yIHplcm8ncyBwcm9ncmFtCi0gICBjb3VudGVyLiAgVGhlIHJlc3VsdGFudCBkZXZpY2UgdHJlZSB0cmVlIGNvbnRhaW5pbmc6Ci0KLSAgIHwJL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvMC5wYyAweDAKLSAgIHwJL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHhmZmYwMGNmMAotCi0gICBhbmQgd291bGQgYmUgcHJvY2Vzc2VkIGxhc3QgdG8gZmlyc3QgcmVzdWx0aW5nIGluIHRoZSBzZXF1ZW5jZTogc2V0Ci0gICBhbGwgcHJvZ3JhbSBjb3VudGVycyB0byAweGZmZjAwY2YwOyBzZXQgcHJvY2Vzc29yIHplcm8ncyBwcm9ncmFtCi0gICBjb3VudGVyIHRvIHplcm8uCi0KLSAgICovCi0KLXN0YXRpYyB2b2lkCi1kb19yZWdpc3Rlcl9pbml0KGRldmljZSAqbWUsCi0JCSBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3ApCi17Ci0gIHBzaW0gKnN5c3RlbSA9IGRldmljZV9zeXN0ZW0obWUpOwotICBpZiAocHJvcCAhPSBOVUxMKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IHByb3AtPm5hbWU7Ci0gICAgdW5zaWduZWQzMiB2YWx1ZSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsIG5hbWUpOwotICAgIGludCBwcm9jZXNzb3I7Ci0KLSAgICBkb19yZWdpc3Rlcl9pbml0KG1lLCBkZXZpY2VfbmV4dF9wcm9wZXJ0eShwcm9wKSk7Ci0KLSAgICBpZiAoc3RyY2hyKG5hbWUsICcuJykgPT0gTlVMTCkgewotICAgICAgcHJvY2Vzc29yID0gLTE7Ci0gICAgICBEVFJBQ0UocmVnaXN0ZXIsICgiJXM9MHglbHhcbiIsIG5hbWUsICh1bnNpZ25lZCBsb25nKXZhbHVlKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hhciAqZW5kOwotICAgICAgcHJvY2Vzc29yID0gc3RydG91bChuYW1lLCAmZW5kLCAwKTsKLSAgICAgIEFTU0VSVChlbmRbMF0gPT0gJy4nKTsKLSAgICAgIG5hbWUgPSBlbmQrMTsKLSAgICAgIERUUkFDRShyZWdpc3RlciwgKCIlZC4lcz0weCVseFxuIiwgcHJvY2Vzc29yLCBuYW1lLAotCQkJKHVuc2lnbmVkIGxvbmcpdmFsdWUpKTsKLSAgICB9ICAgIAotICAgIHBzaW1fd3JpdGVfcmVnaXN0ZXIoc3lzdGVtLCBwcm9jZXNzb3IsIC8qIGFsbCBwcm9jZXNzb3JzICovCi0JCQkmdmFsdWUsCi0JCQluYW1lLAotCQkJY29va2VkX3RyYW5zZmVyKTsKLSAgfQotfQotCQkgCi0KLXN0YXRpYyB2b2lkCi1yZWdpc3Rlcl9pbml0X2RhdGFfY2FsbGJhY2soZGV2aWNlICptZSkKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIE5VTEwpOwotICBkb19yZWdpc3Rlcl9pbml0KG1lLCBwcm9wKTsKLX0KLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCByZWdpc3Rlcl9jYWxsYmFja3MgPSB7Ci0gIHsgTlVMTCwgcmVnaXN0ZXJfaW5pdF9kYXRhX2NhbGxiYWNrLCB9LAotICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KLSAgeyBOVUxMLCB9LCAvKiBJTyAqLwotICB7IE5VTEwsIH0sIC8qIERNQSAqLwotICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLwotICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KLX07Ci0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X3JlZ2lzdGVyX2RldmljZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgInJlZ2lzdGVyIiwgTlVMTCwgJnJlZ2lzdGVyX2NhbGxiYWNrcyB9LAotICB7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiBfSFdfUkVHSVNURVJfQ18KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfdHJhY2UuYyBiL3NpbS9wcGMvaHdfdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2NDgzYS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2h3X3RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0gICAgCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgICAKLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICAgIAotICAgICovCi0KLQotI2lmbmRlZiBfSFdfVFJBQ0VfQ18KLSNkZWZpbmUgX0hXX1RSQUNFX0NfCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyogREVWSUNFCi0KLSAgIHRyYWNlIC0gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBkdW1teSBkZXZpY2Ugc3BlY2lmeSB0cmFjZSBvcHRpb25zCi0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgZGV2aWNlIGFyZSB1c2VkLCBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRvCi0gICBzcGVjaWZ5IHRoZSB2YWx1ZSB2YXJpb3VzIHNpbXVsYXRpb24gdHJhY2Ugb3B0aW9ucy4gIFRoZQotICAgaW5pdGlhbGl6YXRpb24gY2FuIG9jY3VyZSBpbXBsaWNpdGx5IChkdXJpbmcgZGV2aWNlIHRyZWUgaW5pdCkgb3IKLSAgIGV4cGxpY2l0bHkgdXNpbmcgdGhpcyBkZXZpY2VzIGlvY3RsIG1ldGhvZC4KLQotICAgVGhlIGFjdHVhbCBvcHRpb25zIGFuZCB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZm9yIGEgZ2l2ZW4gdGFyZ2V0KQotICAgYXJlIGRlZmluZWQgaW4gdGhlIGZpbGUgZGVidWcuCi0KLSAgIFRoaXMgZGV2aWNlIGlzIG5vcm1hbGx5IGEgY2hpbGQgb2YgdGhlIC9vcGVucHJvbSBub2RlLgotCi0gICBFWEFNUExFCi0KLSAgIFRoZSB0cmFjZSBvcHRpb24gZHVtcC1kZXZpY2UtdHJlZSBjYW4gYmUgZW5hYmxlZCBieSBzcGVjaWZ5aW5nIHRoZQotICAgb3B0aW9uOgotCi0gICB8CS1vICcvb3BlbnByb20vdHJhY2UvZHVtcC1kZXZpY2UtdHJlZSAweDEnCi0KLSAgIEFsdGVybmF0aXZseSB0aGUgc2hvcnRoYW5kIHZlcnNpb246Ci0KLSAgIHwJLXQgZHVtcC1kZXZpY2UtdHJlZQotCi0gICBjYW4gYmUgdXNlZC4gKi8KLQotCi0vKiBIb29rIHRvIGFsbG93IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdHJhY2Ugb3B0aW9ucyBhdCBhbnkgdGltZSAqLwotCi1zdGF0aWMgaW50Ci1od190cmFjZV9pb2N0bChkZXZpY2UgKm1lLAotCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JICAgICAgIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCi0JICAgICAgIHZhX2xpc3QgYXApCi17Ci0gIHN3aXRjaCAocmVxdWVzdCkgewotICBjYXNlIGRldmljZV9pb2N0bF9zZXRfdHJhY2U6Ci0gICAgewotICAgICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIE5VTEwpOwotICAgICAgd2hpbGUgKHByb3AgIT0gTlVMTCkgewotCWNvbnN0IGNoYXIgKm5hbWUgPSBwcm9wLT5uYW1lOwotCXVuc2lnbmVkMzIgdmFsdWUgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCBuYW1lKTsKLQl0cmFjZV9vcHRpb24obmFtZSwgdmFsdWUpOwotCXByb3AgPSBkZXZpY2VfbmV4dF9wcm9wZXJ0eShwcm9wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZGV2aWNlX2Vycm9yKG1lLCAiaW5zdXBwb3J0ZWQgaW9jdGwgcmVxdWVzdCIpOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X3RyYWNlX2NhbGxiYWNrcyA9IHsKLSAgeyBOVUxMLCB9LCAvKiBpbml0ICovCi0gIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLwotICB7IE5VTEwsIH0sIC8qIElPICovCi0gIHsgTlVMTCwgfSwgLyogRE1BICovCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgTlVMTCwgfSwgLyogdW5pdCAqLwotICBOVUxMLCAvKiBpbnN0YW5jZS1jcmVhdGUgKi8KLSAgaHdfdHJhY2VfaW9jdGwsCi19OwotCi1jb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod190cmFjZV9kZXZpY2VfZGVzY3JpcHRvcltdID0gewotICB7ICJ0cmFjZSIsIE5VTEwsICZod190cmFjZV9jYWxsYmFja3MgfSwKLSAgeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgX0hXX1RSQUNFX0NfCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X3ZtLmMgYi9zaW0vcHBjL2h3X3ZtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmI4MDAuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9od192bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0KLSNpZm5kZWYgX0hXX1ZNX0NfCi0jZGVmaW5lIF9IV19WTV9DXwotCi0jaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCi0jaW5jbHVkZSAiY3B1LmgiCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogREVWSUNFCi0KLSAgIHZtIC0gdmlydHVhbCBtZW1vcnkgZGV2aWNlIGZvciB1c2VyIHNpbXVsYXRpb24gbW9kZXMKLQotICAgREVTQ1JJUFRJT04KLQotICAgSW4gdXNlciBtb2RlLCBtYXBwZWQgdGV4dCwgZGF0YSBhbmQgc3RhY2sgYWRkcmVzc2VzIGFyZSBtYW5hZ2VkIGJ5Ci0gICB0aGUgY29yZS4gIFVubWFwcGVkIGFkZHJlc3NlcyBhcmUgcGFzc2VkIG9udG8gdGhpcyBkZXZpY2UgKGJlY2F1c2UKLSAgIGl0IGVzdGFibGlzaGVzIGl0cyBzZWxmIGFzIHRoZSBmYWxsYmFjayBkZXZpY2UpIGZvciBwcm9jZXNzaW5nLgotCi0gICBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIGNoaWxkcmVuIG9mIHRoaXMgZGV2aWNlIHdpbGwgcmVxdWVzdCB0aGUKLSAgIG1hcHBpbmcgb2YgdGhlIGluaXRpYWwgdGV4dCBhbmQgZGF0YSBzZWdtZW50cy4gIFRob3NlIHJlcXVlc3RzIGFyZQotICAgcGFzc2VkIG9udG8gdGhlIGNvcmUgZGV2aWNlIHNvIHRoYXQgdGhhdCBtYXkgZXN0YWJsaXNoIHRoZSBpbml0aWFsCi0gICBtZW1vcnkgcmVnaW9ucy4KLQotICAgT25jZSB0aGUgc2ltdWxhdGlvbiBoYXMgc3RhcnRlZCAoYXMgbm90ZWQgYWJvdmUpIGFueSBhY2Nlc3MgdG8gYW4KLSAgIHVubWFwcGVkIGFkZHJlc3MgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgZG93biB0byB0aGlzIGRldmljZSBhcyBhbiBJTwotICAgYWNjZXNzLiAgVGhpcyBkZXZpY2Ugd2lsbCB0aGVuIGVpdGhlciBhdHRhY2ggYWRkaXRpb25hbCBtZW1vcnkgdG8KLSAgIHRoZSBjb3JlIGRldmljZSBvciBzaWduYWwgdGhlIGFjY2VzcyBhcyBiZWluZyBpbnZhbGlkLgotCi0gICBUaGUgSU9DVEwgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgdGhpcyBkZXZpY2Ugb2YgYW55IGNoYW5nZXMgdG8KLSAgIHRoZSB1c2VycyBgYnJrJyBwb2ludC4KLQotICAgUFJPUEVSVElFUwotCi0gICBzdGFjay1iYXNlID0gPG51bWJlcj4KLQotICAgU3BlY2lmaWVzIHRoZSBsb3dlciBhZGRyZXNzIG9mIHRoZSBzdGFjayBzZWdtZW50IGluIHRoZSB1c2VycwotICAgdmlydHVhbCBhZGRyZXNzIHNwYWNlLiAgVGhlIGluaXRpYWwgc3RhY2sgcGFnZSBpcyBkZWZpbmVkIGJ5Ci0gICBzdGFjay1iYXNlICsgbnItYnl0ZXMuCi0KLSAgIG5yLWJ5dGVzID0gPG51bWJlcj4KLQotICAgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrIHNlZ21lbnQgaW4gdGhlIHVzZXJzCi0gICBhZGRyZXNzIHNwYWNlLgotCi0gICAqLwotCi10eXBlZGVmIHN0cnVjdCBfaHdfdm1fZGV2aWNlIHsKLSAgLyogYXJlYSBvZiBtZW1vcnkgdmFsaWQgZm9yIHN0YWNrIGFkZHJlc3NlcyAqLwotICB1bnNpZ25lZF93b3JkIHN0YWNrX2Jhc2U7IC8qIG1pbiBwb3NzaWJsZSBzdGFjayB2YWx1ZSAqLwotICB1bnNpZ25lZF93b3JkIHN0YWNrX2JvdW5kOwotICB1bnNpZ25lZF93b3JkIHN0YWNrX2xvd2VyX2xpbWl0OwotICAvKiBhcmVhIG9mIG1lbW9yeSB2YWxpZCBmb3IgaGVhcCBhZGRyZXNzZXMgKi8KLSAgdW5zaWduZWRfd29yZCBoZWFwX2Jhc2U7Ci0gIHVuc2lnbmVkX3dvcmQgaGVhcF9ib3VuZDsKLSAgdW5zaWduZWRfd29yZCBoZWFwX3VwcGVyX2xpbWl0OwotfSBod192bV9kZXZpY2U7Ci0KLQotc3RhdGljIHZvaWQKLWh3X3ZtX2luaXRfYWRkcmVzc19jYWxsYmFjayhkZXZpY2UgKm1lKQotewotICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotCi0gIC8qIHJldmVydCB0aGUgc3RhY2svaGVhcCB2YXJpYWJsZXMgdG8gdGhlaXIgZGVmYXVsdHMgKi8KLSAgdm0tPnN0YWNrX2Jhc2UgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAic3RhY2stYmFzZSIpOwotICB2bS0+c3RhY2tfYm91bmQgPSAodm0tPnN0YWNrX2Jhc2UKLQkJICAgICArIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJuci1ieXRlcyIpKTsKLSAgdm0tPnN0YWNrX2xvd2VyX2xpbWl0ID0gdm0tPnN0YWNrX2JvdW5kOwotICB2bS0+aGVhcF9iYXNlID0gMDsKLSAgdm0tPmhlYXBfYm91bmQgPSAwOwotICB2bS0+aGVhcF91cHBlcl9saW1pdCA9IDA7Ci0KLSAgLyogZXN0YWJsaXNoIHRoaXMgZGV2aWNlIGFzIHRoZSBkZWZhdWx0IG1lbW9yeSBoYW5kbGVyICovCi0gIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKLQkJCWF0dGFjaF9jYWxsYmFjayArIDEsCi0JCQkwIC8qYWRkcmVzcyBzcGFjZSAtIGlnbm9yZSovLAotCQkJMCAvKmFkZHIgLSBpZ25vcmUqLywKLQkJCSgoKHVuc2lnbmVkKTApLTEpIC8qbnJfYnl0ZXMgLSBpZ25vcmUqLywKLQkJCWFjY2Vzc19yZWFkX3dyaXRlIC8qYWNjZXNzKi8sCi0JCQltZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWh3X3ZtX2F0dGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCi0JCSAgICAgYXR0YWNoX3R5cGUgYXR0YWNoLAotCQkgICAgIGludCBzcGFjZSwKLQkJICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCSAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAotCQkgICAgIGRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLwotewotICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICAvKiB1cGRhdGUgZW5kIG9mIGJzcyBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKHZtLT5oZWFwX2Jhc2UgPCBhZGRyICsgbnJfYnl0ZXMpIHsKLSAgICB2bS0+aGVhcF9iYXNlID0gYWRkciArIG5yX2J5dGVzOwotICAgIHZtLT5oZWFwX2JvdW5kID0gYWRkciArIG5yX2J5dGVzOwotICAgIHZtLT5oZWFwX3VwcGVyX2xpbWl0ID0gYWRkciArIG5yX2J5dGVzOwotICB9Ci0gIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKLQkJCWF0dGFjaF9yYXdfbWVtb3J5LAotCQkJMCAvKmFkZHJlc3Mgc3BhY2UqLywKLQkJCWFkZHIsCi0JCQlucl9ieXRlcywKLQkJCWFjY2VzcywKLQkJCW1lKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQKLWh3X3ZtX2FkZF9zcGFjZShkZXZpY2UgKm1lLAotCQl1bnNpZ25lZF93b3JkIGFkZHIsCi0JCXVuc2lnbmVkIG5yX2J5dGVzLAotCQljcHUgKnByb2Nlc3NvciwKLQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGh3X3ZtX2RldmljZSAqdm0gPSAoaHdfdm1fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7Ci0gIHVuc2lnbmVkX3dvcmQgYmxvY2tfYWRkcjsKLSAgdW5zaWduZWQgYmxvY2tfbnJfYnl0ZXM7Ci0KLSAgLyogYW4gYWRkcmVzcyBpbiB0aGUgc3RhY2sgYXJlYSwgYWxsb2NhdGUganVzdCBkb3duIHRvIHRoZSBhZGRyZXNzZWQKLSAgICAgcGFnZSAqLwotICBpZiAoYWRkciA+PSB2bS0+c3RhY2tfYmFzZSAmJiBhZGRyIDwgdm0tPnN0YWNrX2xvd2VyX2xpbWl0KSB7Ci0gICAgYmxvY2tfYWRkciA9IEZMT09SX1BBR0UoYWRkcik7Ci0gICAgYmxvY2tfbnJfYnl0ZXMgPSB2bS0+c3RhY2tfbG93ZXJfbGltaXQgLSBibG9ja19hZGRyOwotICAgIHZtLT5zdGFja19sb3dlcl9saW1pdCA9IGJsb2NrX2FkZHI7Ci0gIH0KLSAgLyogYW4gYWRkcmVzcyBpbiB0aGUgaGVhcCBhcmVhLCBhbGxvY2F0ZSBhbGwgb2YgdGhlIHJlcXVpcmVkIGhlYXAgKi8KLSAgZWxzZSBpZiAoYWRkciA+PSB2bS0+aGVhcF91cHBlcl9saW1pdCAmJiBhZGRyIDwgdm0tPmhlYXBfYm91bmQpIHsKLSAgICBibG9ja19hZGRyID0gdm0tPmhlYXBfdXBwZXJfbGltaXQ7Ci0gICAgYmxvY2tfbnJfYnl0ZXMgPSB2bS0+aGVhcF9ib3VuZCAtIHZtLT5oZWFwX3VwcGVyX2xpbWl0OwotICAgIHZtLT5oZWFwX3VwcGVyX2xpbWl0ID0gdm0tPmhlYXBfYm91bmQ7Ci0gIH0KLSAgLyogb29wcyAtIGFuIGludmFsaWQgYWRkcmVzcyAtIGFib3J0IHRoZSBjcHUgKi8KLSAgZWxzZSBpZiAocHJvY2Vzc29yICE9IE5VTEwpIHsKLSAgICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX3NpZ25hbGxlZCwgU0lHU0VHVik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogMipvb3BzIC0gYW4gaW52YWxpZCBhZGRyZXNzIGFuZCBubyBwcm9jZXNzb3IgKi8KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBnb3QgdGhlIHBhcmFtZXRlcnMsIGFsbG9jYXRlIHRoZSBzcGFjZSAqLwotICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCi0JCQlhdHRhY2hfcmF3X21lbW9yeSwKLQkJCTAgLyphZGRyZXNzIHNwYWNlKi8sCi0JCQlibG9ja19hZGRyLAotCQkJYmxvY2tfbnJfYnl0ZXMsCi0JCQlhY2Nlc3NfcmVhZF93cml0ZSwKLQkJCW1lKTsKLSAgcmV0dXJuIGJsb2NrX25yX2J5dGVzOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfdm1faW9fcmVhZF9idWZmZXJfY2FsbGJhY2soZGV2aWNlICptZSwKLQkJCSAgIHZvaWQgKmRlc3QsCi0JCQkgICBpbnQgc3BhY2UsCi0JCQkgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgICB1bnNpZ25lZCBucl9ieXRlcywKLQkJCSAgIGNwdSAqcHJvY2Vzc29yLAotCQkJICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGlmIChod192bV9hZGRfc3BhY2UobWUsIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSkgPj0gbnJfYnl0ZXMpIHsKLSAgICBtZW1zZXQoZGVzdCwgMCwgbnJfYnl0ZXMpOyAvKiBhbHdheXMgaW5pdGlhbGl6ZWQgdG8gemVybyAqLwotICAgIHJldHVybiBucl9ieXRlczsKLSAgfQotICBlbHNlIAotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZAotaHdfdm1faW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCi0JCQkgICAgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJICAgIGludCBzcGFjZSwKLQkJCSAgICB1bnNpZ25lZF93b3JkIGFkZHIsCi0JCQkgICAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JCQkgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGlmIChod192bV9hZGRfc3BhY2UobWUsIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSkgPj0gbnJfYnl0ZXMpIHsKLSAgICByZXR1cm4gZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksIHNvdXJjZSwKLQkJCQkgICBzcGFjZSwgYWRkciwKLQkJCQkgICBucl9ieXRlcywKLQkJCQkgICAwLyp2aW9sYXRlX3JlYWRfb25seSovKTsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaHdfdm1faW9jdGwoZGV2aWNlICptZSwKLQkgICAgY3B1ICpwcm9jZXNzb3IsCi0JICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCSAgICBkZXZpY2VfaW9jdGxfcmVxdWVzdCByZXF1ZXN0LAotCSAgICB2YV9saXN0IGFwKQotewotICAvKiBXaGlsZSB0aGUgY2FsbGVyIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGhlYXAgaGFzIGdyb3duIGJ5IHRoZQotICAgICByZXF1ZXN0ZWQgYW1vdW50LCB0aGUgaGVhcCBpcyBhY3R1YWxseSBleHRlbmRlZCBvdXQgdG8gYSBwYWdlCi0gICAgIGJvdW5kYXJ5LiAqLwotICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOwotICBzd2l0Y2ggKHJlcXVlc3QpIHsKLSAgY2FzZSBkZXZpY2VfaW9jdGxfYnJlYWs6Ci0gICAgewotICAgICAgdW5zaWduZWRfd29yZCByZXF1ZXN0ZWRfYnJlYWsgPSB2YV9hcmcoYXAsIHVuc2lnbmVkX3dvcmQpOwotICAgICAgdW5zaWduZWRfd29yZCBuZXdfYnJlYWsgPSBBTElHTl84KHJlcXVlc3RlZF9icmVhayk7Ci0gICAgICB1bnNpZ25lZF93b3JkIG9sZF9icmVhayA9IHZtLT5oZWFwX2JvdW5kOwotICAgICAgc2lnbmVkX3dvcmQgZGVsdGEgPSBuZXdfYnJlYWsgLSBvbGRfYnJlYWs7Ci0gICAgICBpZiAoZGVsdGEgPiAwKQotCXZtLT5oZWFwX2JvdW5kID0gQUxJR05fUEFHRShuZXdfYnJlYWspOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBkZWZhdWx0OgotICAgIGRldmljZV9lcnJvcihtZSwgIlVuc3VwcG9ydGVkIGlvY3RsIHJlcXVlc3QiKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gMDsKLSAgICAKLX0KLQotCi1zdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod192bV9jYWxsYmFja3MgPSB7Ci0gIHsgaHdfdm1faW5pdF9hZGRyZXNzX2NhbGxiYWNrLCB9LAotICB7IGh3X3ZtX2F0dGFjaF9hZGRyZXNzLAotICAgIHBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2RldGFjaCwgfSwKLSAgeyBod192bV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaywKLSAgICBod192bV9pb193cml0ZV9idWZmZXJfY2FsbGJhY2ssIH0sCi0gIHsgTlVMTCwgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXIsIH0sCi0gIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCi0gIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCi0gICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsIH0sCi0gIE5VTEwsIC8qIGluc3RhbmNlICovCi0gIGh3X3ZtX2lvY3RsLAotfTsKLQotCi1zdGF0aWMgdm9pZCAqCi1od192bV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkgICAgIGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzLAotCSAgICAgY29uc3QgY2hhciAqYXJncykKLXsKLSAgaHdfdm1fZGV2aWNlICp2bSA9IFpBTExPQyhod192bV9kZXZpY2UpOwotICByZXR1cm4gdm07Ci19Ci0KLWNvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X3ZtX2RldmljZV9kZXNjcmlwdG9yW10gPSB7Ci0gIHsgInZtIiwgaHdfdm1fY3JlYXRlLCAmaHdfdm1fY2FsbGJhY2tzIH0sCi0gIHsgTlVMTCB9LAotfTsKLQotI2VuZGlmIF9IV19WTV9DXwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pZGVjb2RlX2JyYW5jaC5oIGIvc2ltL3BwYy9pZGVjb2RlX2JyYW5jaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FlOThlLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaWRlY29kZV9icmFuY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLS8qIGJyYW5jaCBtYWNybydzOgotCi0gICBUaGUgbWFjcm8ncyBiZWxvdyBpbXBsZW1lbnQgdGhlIHNlbWFudGljcyBvZiB0aGUgUG93ZXJQQyBqdW1wCi0gICBpbnN0cnVjdGlvbnMuICovCi0KLQotLyogSWYgc28gcmVxdWlyZWQsIHVwZGF0ZSB0aGUgTGluayBSZWdpc3RlciB3aXRoIHRoZSBuZXh0IHNlcXVlbnRpYWwKLSAgIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQotI2RlZmluZSBVUERBVEVfTEsgXAotZG8geyBcCi0gIGlmICh1cGRhdGVfTEspIHsgXAotICAgIHBwY19pYSB0YXJnZXQgPSBjaWEgKyA0OyBcCi0gICAgcHBjX3NwciBuZXdfYWRkcmVzcyA9IChwcGNfc3ByKUlFQV9NQVNLRUQocHBjX2lzXzY0Yml0KHByb2Nlc3NvciksIFwKLQkJCSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOyBcCi0gICAgTFIgPSBuZXdfYWRkcmVzczsgXAotICB9IFwKLSAgSVRSQUNFKHRyYWNlX2JyYW5jaCwgXAotCSAoIlVQREFURV9MSyAtIHVwZGF0ZV9MSz0lZCBscj0weCV4IGNpYT0weCV4XG4iLCBcCi0JICB1cGRhdGVfTEssIExSLCBjaWEpOyBcCi19IHdoaWxlICgwKQotCi0KLS8qIHRha2UgdGhlIGJyYW5jaCAtIGFic29sdXRlIG9yIHJlbGF0aXZlIC0gcG9zc2libHkgdXBkYXRpbmcgdGhlIGxpbmsKLSAgIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQlJBTkNIKEFERFJFU1MpIFwKLWRvIHsgXAotICBVUERBVEVfTEs7IFwKLSAgaWYgKHVwZGF0ZV9BQSkgeyBcCi0gICAgcHBjX2lhIHRhcmdldCA9IChwcGNfaWEpKEFERFJFU1MpOyBcCi0gICAgbmlhID0gKHBwY19pYSlJRUFfTUFTS0VEKHBwY19pc182NGJpdChwcm9jZXNzb3IpLCB0YXJnZXQpOyBcCi0gIH0gXAotICBlbHNlIHsgXAotICAgIHBwY19pYSB0YXJnZXQgPSBjaWEgKyBBRERSRVNTOyBcCi0gICAgbmlhID0gKHBwY19pYSlJRUFfTUFTS0VEKHBwY19pc182NGJpdChwcm9jZXNzb3IpLCB0YXJnZXQpOyBcCi0gIH0gXAotICBQVFJBQ0UodHJhY2VfYnJhbmNoLCBcCi0JICgiQlJBTkNIIC0gdXBkYXRlX0FBPSVkIHVwZGF0ZV9MSz0lZCBuaWE9MHgleCBjaWE9MHgleFxuIiwgXAotCSAgdXBkYXRlX0FBLCB1cGRhdGVfTEssIG5pYSwgY2lhKTsgXAotfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL3NpbS9wcGMvaWRlY29kZV9leHByZXNzaW9uLmggYi9zaW0vcHBjL2lkZWNvZGVfZXhwcmVzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjliNzI1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaWRlY29kZV9leHByZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogMzJiaXQgdGFyZ2V0IGV4cHJlc3Npb25zOgotCi0gICBFYWNoIGNhbGN1bGF0aW9uIGlzIHBlcmZvcm1lZCB0aHJlZSB0aW1lcyB1c2luZyBlYWNoIG9mIHRoZQotICAgc2lnbmVkNjQsIHVuc2lnbmVkNjQgYW5kIGxvbmcgaW50ZWdlciB0eXBlcy4gIFRoZSBtYWNybyBBTFVfRU5ECi0gICAoaW4gX0FMVV9SRVNVTFRfVkFMKSB0aGVuIHNlbGVjdHMgd2hpY2ggb2YgdGhlIHRocmVlIGFsdGVybmF0aXZlCi0gICByZXN1bHRzIHdpbGwgYmUgdXNlZCBpbiB0aGUgZmluYWwgYXNzaWdubWVudCBvZiB0aGUgdGFyZ2V0Ci0gICByZWdpc3Rlci4gIEFzIHRoaXMgc2VsZWN0aW9uIGlzIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lIGJ5Ci0gICBmaWVsZHMgaW4gdGhlIGluc3RydWN0aW9uIChPRSwgRUEsIFJjKSB0aGUgY29tcGlsZXIgaGFzIHN1ZmZpY2llbnQKLSAgIGluZm9ybWF0aW9uIHRvIGZpcnN0bHkgc2ltcGxpZnkgdGhlIHNlbGVjdGlvbiBjb2RlIGludG8gYSBzaW5nbGUKLSAgIGNhc2UgYW5kIHRoZW4gYmFjayBhbm90YXRlIHRoZSBlcXVhdGlvbnMgYW5kIGhlbmNlIGVsaW1pbmF0ZSBhbnkKLSAgIHJlc3VsdGluZyBkZWFkIGNvZGUuICBUaGF0IGRlYWQgY29kZSBiZWluZyB0aGUgY2FsY3VsYXRpb25zIHRoYXQsCi0gICBhcyBpdCB0dXJuZWQgb3V0IHdlcmUgbm90IGluIHRoZSBlbmQgbmVlZGVkLgotCi0gICA2NGJpdCBhcnJpdGhlbWV0aWMgaXMgdXNlZCBmaXJzdGx5IGJlY2F1c2UgaXQgYWxsb3dzIHRoZSB1c2Ugb2YKLSAgIGdjYydzIGVmZmljaWVudCBsb25nIGxvbmcgb3BlcmF0b3JzICh0eXBpY2FsbHkgZWZmaWNpZW50bHkgb3V0cHV0Ci0gICBpbmxpbmUpIGFuZCBzZWNvbmRseSBiZWNhdXNlIHRoZSByZXN1bHRhbnQgYW5zd2VyIHdpbGwgY29udGFpbiBpbgotICAgdGhlIGxvdyAzMmJpdHMgdGhlIGFuc3dlciB3aGlsZSBpbiB0aGUgaGlnaCAzMmJpdHMgaXMgZWl0aGVyIGNhcnJ5Ci0gICBvciBzdGF0dXMgaW5mb3JtYXRpb24uICovCi0KLS8qIDY0Yml0IHRhcmdldCBleHByZXNzaW9uczoKLQotICAgVW5mb3J0dW5hdGx5IDEyOGJpdCBhcnJpdGhlbWV0aWMgaXNuJ3QgdGhhdCBjb21tb24uICBDb25zZXF1ZW50bHkKLSAgIHRoZSAzMi82NCBiaXQgdHJpY2sgY2FuIG5vdCBiZSB1c2VkLiAgSW5zdGVhZCBhbGwgY2FsY3VsYXRpb25zIGFyZQotICAgcmVxdWlyZWQgdG8gcmV0YWluIGNhcnJ5L292ZXJmbG93IGluZm9ybWF0aW9uIGluIHNlcGFyYXRlCi0gICB2YXJpYWJsZXMuICBFdmVuIHdpdGggdGhpcyByZXN0cmljdGlvbiBpdCBpcyBzdGlsbCBwb3NzaWJsZSBmb3IgdGhlCi0gICB0cmljayBvZiBsZXR0aW5nIHRoZSBjb21waWxlciBkaXNjYXJkIHRoZSBjYWxjdWxhdGlvbiBvZiB1bm5lZWRlZAotICAgdmFsdWVzICovCi0KLQotLyogTWFjcm8ncyB0byB0eXBlIGNhc3QgMzJiaXQgY29uc3RhbnRzIHRvIDY0Yml0cyAqLwotI2RlZmluZSBTSUdORUQ2NCh2YWwpICAgKChzaWduZWQ2NCkoc2lnbmVkMzIpKHZhbCkpCi0jZGVmaW5lIFVOU0lHTkVENjQodmFsKSAoKHVuc2lnbmVkNjQpKHVuc2lnbmVkMzIpKHZhbCkpCi0KLQotLyogU3RhcnQgYSBzZWN0aW9uIG9mIEFMVSBjb2RlICovCi0KLSNkZWZpbmUgQUxVX0JFR0lOKHZhbCkgXAoteyBcCi0gIG5hdHVyYWxfd29yZCBhbHVfdmFsOyBcCi0gIHVuc2lnbmVkNjQgYWx1X2NhcnJ5X3ZhbDsgXAotICBzaWduZWQ2NCBhbHVfb3ZlcmZsb3dfdmFsOyBcCi0gIEFMVV9TRVQodmFsKQotCi0KLS8qIGFzc2lnbiB0aGUgcmVzdWx0IHRvIHRoZSB0YXJnZXQgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBTFVfRU5EKFRBUkcsQ0EsT0UsUmMpIFwKLXsgLyogc2VsZWN0IHRoZSByZXN1bHQgdG8gdXNlICovIFwKLSAgc2lnbmVkX3dvcmQgY29uc3QgYWx1X3Jlc3VsdCA9IF9BTFVfUkVTVUxUX1ZBTChDQSxPRSxSYyk7IFwKLSAgLyogZGV0ZXJtaW5lIHRoZSBvdmVyZmxvdyBiaXQgaWYgbmVlZGVkICovIFwKLSAgaWYgKE9FKSB7IFwKLSAgICBpZiAoKCgodW5zaWduZWQ2NCkoYWx1X292ZXJmbG93X3ZhbCAmIEJJVDY0KDApKSkgXAotCSA+PiAzMikgXAotICAgICAgICA9PSAoYWx1X292ZXJmbG93X3ZhbCAmIEJJVDY0KDMyKSkpIFwKLSAgICAgIFhFUiAmPSAofnhlcl9vdmVyZmxvdyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIFhFUiB8PSAoeGVyX3N1bW1hcnlfb3ZlcmZsb3cgfCB4ZXJfb3ZlcmZsb3cpOyBcCi0gIH0gXAotICAvKiBVcGRhdGUgdGhlIGNhcnJ5IGJpdCBpZiBuZWVkZWQgKi8gXAotICBpZiAoQ0EpIHsgXAotICAgIFhFUiA9ICgoWEVSICYgfnhlcl9jYXJyeSkgXAotICAgICAgICAgICB8IFNIVUZGTEVEMzIoKGFsdV9jYXJyeV92YWwgPj4gMzIpLCAzMSwgeGVyX2NhcnJ5X2JpdCkpOyBcCi0gICAgLyogaWYgKGFsdV9jYXJyeV92YWwgJiBCSVQ2NCgzMSkpIFwKLSAgICAgICAgIFhFUiB8PSAoeGVyX2NhcnJ5KTsgXAotICAgICAgIGVsc2UgXAotICAgICAgICAgWEVSICY9ICh+eGVyX2NhcnJ5KTsgKi8gXAotICB9IFwKLSAgVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KSwgWEVSID0gJWxkXG4iLCBcCi0gICAgICAgICAgICAgICAgICAgIChsb25nKWFsdV9yZXN1bHQsIChsb25nKWFsdV9yZXN1bHQsIChsb25nKVhFUikpOyBcCi0gIC8qIFVwZGF0ZSB0aGUgUmVzdWx0IENvbmRpdGlvbnMgaWYgbmVlZGVkICovIFwKLSAgQ1IwX0NPTVBBUkUoYWx1X3Jlc3VsdCwgMCwgUmMpOyBcCi0gIC8qIGFzc2lnbiB0YXJnIHNhbWUgKi8gXAotICBUQVJHID0gYWx1X3Jlc3VsdDsgXAotfX0KLQotLyogc2VsZWN0IHRoZSByZXN1bHQgZnJvbSB0aGUgZGlmZmVyZW50IG9wdGlvbnMgKi8KLQotI2RlZmluZSBfQUxVX1JFU1VMVF9WQUwoQ0EsT0UsUmMpIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgXAotCQkJCSAgID8gYWx1X3ZhbCBcCi0JCQkJICAgOiAoT0UgXAotCQkJCSAgICAgID8gYWx1X292ZXJmbG93X3ZhbCBcCi0JCQkJICAgICAgOiAoQ0EgXAotCQkJCQkgPyBhbHVfY2FycnlfdmFsIFwKLQkJCQkJIDogYWx1X3ZhbCkpKQotCi0KLS8qIE1vcmUgYmFzaWMgYWx1IG9wZXJhdGlvbnMgKi8KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBBTFVfU0VUKHZhbCkgXAotZG8geyBcCi0gIGFsdV92YWwgPSB2YWw7IFwKLSAgYWx1X2NhcnJ5X3ZhbCA9ICgodW5zaWduZWQ2NClhbHVfdmFsKSA+PiAzMjsgXAotICBhbHVfb3ZlcmZsb3dfdmFsID0gKChzaWduZWQ2NClhbHVfdmFsKSA+PiAzMjsgXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEFMVV9TRVQodmFsKSBcCi1kbyB7IFwKLSAgYWx1X3ZhbCA9IHZhbDsgXAotICBhbHVfY2FycnlfdmFsID0gKHVuc2lnbmVkMzIpKGFsdV92YWwpOyBcCi0gIGFsdV9vdmVyZmxvd192YWwgPSAoc2lnbmVkMzIpKGFsdV92YWwpOyBcCi19IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBBTFVfQUREKHZhbCkgXAotZG8geyBcCi0gIHVuc2lnbmVkNjQgYWx1X2xvID0gKFVOU0lHTkVENjQoYWx1X3ZhbCkgXAotCQkgICAgICAgKyBVTlNJR05FRDY0KHZhbCkpOyBcCi0gIHNpZ25lZCBhbHVfY2FycnkgPSAoKGFsdV9sbyAmIEJJVCgzMSkpICE9IDApOyBcCi0gIGFsdV9jYXJyeV92YWwgPSAoYWx1X2NhcnJ5X3ZhbCBcCi0JCSAgICsgVU5TSUdORUQ2NChFWFRSQUNURUQodmFsLCAwLCAzMSkpIFwKLQkJICAgKyBhbHVfY2FycnkpOyBcCi0gIGFsdV9vdmVyZmxvd192YWwgPSAoYWx1X292ZXJmbG93X3ZhbCBcCi0JCSAgICAgICsgU0lHTkVENjQoRVhUUkFDVEVEKHZhbCwgMCwgMzEpKSBcCi0JCSAgICAgICsgYWx1X2NhcnJ5KTsgXAotICBhbHVfdmFsID0gYWx1X3ZhbCArIHZhbDsgXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEFMVV9BREQodmFsKSBcCi1kbyB7IFwKLSAgYWx1X3ZhbCArPSB2YWw7IFwKLSAgYWx1X2NhcnJ5X3ZhbCArPSAodW5zaWduZWQzMikodmFsKTsgXAotICBhbHVfb3ZlcmZsb3dfdmFsICs9IChzaWduZWQzMikodmFsKTsgXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBBTFVfQUREX0NBIFwKLWRvIHsgXAotICBzaWduZWQgY2FycnkgPSBNQVNLRUQzMihYRVIsIHhlcl9jYXJyeV9iaXQsIHhlcl9jYXJyeV9iaXQpICE9IDA7IFwKLSAgQUxVX0FERChjYXJyeSk7IFwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotI2RlZmluZSBBTFVfQUREX0NBIFwKLWRvIHsgXAotICBzaWduZWQgY2FycnkgPSBNQVNLRUQzMihYRVIsIHhlcl9jYXJyeV9iaXQsIHhlcl9jYXJyeV9iaXQpICE9IDA7IFwKLSAgQUxVX0FERChjYXJyeSk7IFwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0jaWYgMAotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotI2RlZmluZSBBTFVfU1VCKHZhbCkgXAotZG8geyBcCi0gIGFsdV92YWwgLT0gdmFsOyBcCi0gIGFsdV9jYXJyeV92YWwgLT0gKHVuc2lnbmVkMzIpKHZhbCk7IFwKLSAgYWx1X292ZXJmbG93X3ZhbCAtPSAoc2lnbmVkMzIpKHZhbCk7IFwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEFMVV9PUih2YWwpIFwKLWRvIHsgXAotICBhbHVfdmFsIHw9IHZhbDsgXAotICBhbHVfY2FycnlfdmFsID0gKHVuc2lnbmVkMzIpKGFsdV92YWwpOyBcCi0gIGFsdV9vdmVyZmxvd192YWwgPSAoc2lnbmVkMzIpKGFsdV92YWwpOyBcCi19IHdoaWxlICgwKQotI2VuZGlmCi0KLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotI2RlZmluZSBBTFVfWE9SKHZhbCkgXAotZG8geyBcCi0gIGFsdV92YWwgXj0gdmFsOyBcCi0gIGFsdV9jYXJyeV92YWwgPSAodW5zaWduZWQzMikoYWx1X3ZhbCk7IFwKLSAgYWx1X292ZXJmbG93X3ZhbCA9IChzaWduZWQzMikoYWx1X3ZhbCk7IFwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0jaWYgMAotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotI2RlZmluZSBBTFVfTkVHQVRFIFwKLWRvIHsgXAotICBhbHVfdmFsID0gLWFsdV92YWw7IFwKLSAgYWx1X2NhcnJ5X3ZhbCA9IC1hbHVfY2FycnlfdmFsOyBcCi0gIGFsdV9vdmVyZmxvd192YWwgPSAtYWx1X292ZXJmbG93X3ZhbDsgXAotfSB3aGlsZSgwKQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0jZGVmaW5lIEFMVV9BTkQodmFsKSBcCi1kbyB7IFwKLSAgYWx1X3ZhbCAmPSB2YWw7IFwKLSAgYWx1X2NhcnJ5X3ZhbCA9ICh1bnNpZ25lZDMyKShhbHVfdmFsKTsgXAotICBhbHVfb3ZlcmZsb3dfdmFsID0gKHNpZ25lZDMyKShhbHVfdmFsKTsgXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotI2RlZmluZSBBTFVfTk9UIFwKLWRvIHsgXAotICBzaWduZWQ2NCBuZXdfYWx1X3ZhbCA9IH5hbHVfdmFsOyBcCi0gIEFMVV9TRVQobmV3X2FsdV92YWwpOyBcCi19IHdoaWxlICgwKQotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSNkZWZpbmUgQUxVX05PVCBcCi1kbyB7IFwKLSAgc2lnbmVkIG5ld19hbHVfdmFsID0gfmFsdV92YWw7IFwKLSAgQUxVX1NFVChuZXdfYWx1X3ZhbCk7IFwKLX0gd2hpbGUoMCkKLSNlbmRpZgotCi0KLS8qIE1hY3JvcyBmb3IgdXBkYXRpbmcgdGhlIGNvbmRpdGlvbiByZWdpc3RlciAqLwotCi0jZGVmaW5lIENSMV9VUERBVEUoUmMpIFwKLWRvIHsgXAotICBpZiAoUmMpIHsgXAotICAgIENSX1NFVCgxLCBFWFRSQUNURUQzMihGUFNDUiwgZnBzY3JfZnhfYml0LCBmcHNjcl9veF9iaXQpKTsgXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLQotI2RlZmluZSBfRE9fQ1JfQ09NUEFSRShMSFMsIFJIUykgXAotKCgoTEhTKSA8IChSSFMpKSBcCi0gPyBjcl9pX25lZ2F0aXZlIFwKLSA6ICgoKExIUykgPiAoUkhTKSkgXAotICAgID8gY3JfaV9wb3NpdGl2ZSBcCi0gICAgOiBjcl9pX3plcm8pKQotCi0jZGVmaW5lIENSX1NFVChSRUcsIFZBTCkgTUJMSVQzMihDUiwgUkVHKjQsIFJFRyo0KzMsIFZBTCkKLSNkZWZpbmUgQ1JfRklFTEQoUkVHKSBFWFRSQUNURUQzMihDUiwgUkVHKjQsIFJFRyo0KzMpCi0jZGVmaW5lIENSX1NFVF9YRVJfU08oUkVHLCBWQUwpIFwKLWRvIHsgXAotICBjcmVnIG5ld19iaXRzID0gKChYRVIgJiB4ZXJfc3VtbWFyeV9vdmVyZmxvdykgXAotICAgICAgICAgICAgICAgICAgID8gKGNyX2lfc3VtbWFyeV9vdmVyZmxvdyB8IFZBTCkgXAotICAgICAgICAgICAgICAgICAgIDogVkFMKTsgXAotICBDUl9TRVQoUkVHLCBuZXdfYml0cyk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBDUl9DT01QQVJFKFJFRywgTEhTLCBSSFMpIFwKLWRvIHsgXAotICBjcmVnIG5ld19iaXRzID0gKChYRVIgJiB4ZXJfc3VtbWFyeV9vdmVyZmxvdykgXAotICAgICAgICAgICAgICAgICAgID8gKGNyX2lfc3VtbWFyeV9vdmVyZmxvdyB8IF9ET19DUl9DT01QQVJFKExIUyxSSFMpKSBcCi0gICAgICAgICAgICAgICAgICAgOiBfRE9fQ1JfQ09NUEFSRShMSFMsUkhTKSk7IFwKLSAgQ1JfU0VUKFJFRywgbmV3X2JpdHMpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENSMF9DT01QQVJFKExIUywgUkhTLCBSYykgXAotZG8geyBcCi0gIGlmIChSYykgeyBcCi0gICAgQ1JfQ09NUEFSRSgwLCBMSFMsIFJIUyk7IFwKLSAgICBUUkFDRSh0cmFjZV9hbHUsIFwKLQkgICgiQ1I9MHglMDhseCwgTEhTPSVsZCwgUkhTPSVsZFxuIiwgXAotCSAgICh1bnNpZ25lZCBsb25nKUNSLCAobG9uZylMSFMsIChsb25nKVJIUykpOyBcCi0gIH0gXAotfSB3aGlsZSAoMCkKLQotCi0KLS8qIEJyaW5nIGRhdGEgaW4gZnJvbSB0aGUgY29sZCAqLwotCi0jZGVmaW5lIE1FTShTSUdOLCBFQSwgTlJfQllURVMpIFwKLSgoU0lHTiMjXyMjTlJfQllURVMpIHZtX2RhdGFfbWFwX3JlYWRfIyNOUl9CWVRFUyhjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwgRUEsIFwKLQkJCQkJCSBwcm9jZXNzb3IsIGNpYSkpIFwKLQotI2RlZmluZSBTVE9SRShFQSwgTlJfQllURVMsIFZBTCkgXAotZG8geyBcCi0gIHZtX2RhdGFfbWFwX3dyaXRlXyMjTlJfQllURVMoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksIEVBLCBWQUwsIFwKLQkJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7IFwKLX0gd2hpbGUgKDApCi0KLQotCi0vKiBzb21lIEZQU0NSIHVwZGF0ZSBtYWNyb3MuICovCi0KLSNkZWZpbmUgRlBTQ1JfQkVHSU4gXAoteyBcCi0gIGZwc2NyZWcgb2xkX2Zwc2NyIFVOVVNFRCA9IEZQU0NSCi0KLSNkZWZpbmUgRlBTQ1JfRU5EKFJjKSB7IFwKLSAgLyogYWx3YXlzIHVwZGF0ZSBWWCAqLyBcCi0gIGlmICgoRlBTQ1IgJiBmcHNjcl92eF9iaXRzKSkgXAotICAgIEZQU0NSIHw9IGZwc2NyX3Z4OyBcCi0gIGVsc2UgXAotICAgIEZQU0NSICY9IH5mcHNjcl92eDsgXAotICAvKiBhbHdheXMgdXBkYXRlIEZFWCAqLyBcCi0gIGlmICgoKEZQU0NSICYgZnBzY3JfdngpICYmIChGUFNDUiAmIGZwc2NyX3ZlKSkgXAotICAgICAgfHwgKChGUFNDUiAmIGZwc2NyX294KSAmJiAoRlBTQ1IgJiBmcHNjcl9vZSkpIFwKLSAgICAgIHx8ICgoRlBTQ1IgJiBmcHNjcl91eCkgJiYgKEZQU0NSICYgZnBzY3JfdWUpKSBcCi0gICAgICB8fCAoKEZQU0NSICYgZnBzY3JfengpICYmIChGUFNDUiAmIGZwc2NyX3plKSkgXAotICAgICAgfHwgKChGUFNDUiAmIGZwc2NyX3h4KSAmJiAoRlBTQ1IgJiBmcHNjcl94ZSkpKSBcCi0gICAgRlBTQ1IgfD0gZnBzY3JfZmV4OyBcCi0gIGVsc2UgXAotICAgIEZQU0NSICY9IH5mcHNjcl9mZXg7IFwKLSAgQ1IxX1VQREFURShSYyk7IFwKLSAgLyogaW50ZXJydXB0IGVuYWJsZWQ/ICovIFwKLSAgaWYgKChNU1IgJiAobXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAgXAotICAgICAgICAgICAgICB8IG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8xKSkgXAotICAgICAgJiYgKEZQU0NSICYgZnBzY3JfZmV4KSkgXAotICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBcCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdfcG9pbnRfZW5hYmxlZF9wcm9ncmFtX2ludGVycnVwdCk7IFwKLX19Ci0KLSNkZWZpbmUgRlBTQ1JfU0VUKFJFRywgVkFMKSBNQkxJVDMyKEZQU0NSLCBSRUcqNCwgUkVHKjQrMywgVkFMKQotI2RlZmluZSBGUFNDUl9GSUVMRChSRUcpIEVYVFJBQ1RFRDMyKEZQU0NSLCBSRUcqNCwgUkVHKjQrMykKLQotI2RlZmluZSBGUFNDUl9TRVRfRlBDQyhWQUwpIE1CTElUMzIoRlBTQ1IsIGZwc2NyX2ZwY2NfYml0LCBmcHNjcl9mcGNjX2JpdCszLCBWQUwpCi0KLS8qIEhhbmRsZSB2YXJpb3VzIGV4Y2VwdGlvbnMgKi8KLQotI2RlZmluZSBGUFNDUl9PUl9WWChWQUwpIFwKLWRvIHsgXAotICAvKiBOT1RFOiBWQUwgIT0gMCAqLyBcCi0gIEZQU0NSIHw9IChWQUwpOyBcCi0gIEZQU0NSIHw9IGZwc2NyX2Z4OyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQU0NSX1NFVF9PWChDT05EKSBcCi1kbyB7IFwKLSAgaWYgKENPTkQpIHsgXAotICAgIEZQU0NSIHw9IGZwc2NyX294OyBcCi0gICAgRlBTQ1IgfD0gZnBzY3JfZng7IFwKLSAgfSBcCi0gIGVsc2UgXAotICAgIEZQU0NSICY9IH5mcHNjcl9veDsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGUFNDUl9TRVRfVVgoQ09ORCkgXAotZG8geyBcCi0gIGlmIChDT05EKSB7IFwKLSAgICBGUFNDUiB8PSBmcHNjcl91eDsgXAotICAgIEZQU0NSIHw9IGZwc2NyX2Z4OyBcCi0gIH0gXAotICBlbHNlIFwKLSAgICBGUFNDUiAmPSB+ZnBzY3JfdXg7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRlBTQ1JfU0VUX1pYKENPTkQpIFwKLWRvIHsgXAotICBpZiAoQ09ORCkgeyBcCi0gICAgRlBTQ1IgfD0gZnBzY3Jfeng7IFwKLSAgICBGUFNDUiB8PSBmcHNjcl9meDsgXAotICB9IFwKLSAgZWxzZSBcCi0gICAgRlBTQ1IgJj0gfmZwc2NyX3p4OyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQU0NSX1NFVF9YWChDT05EKSBcCi1kbyB7IFwKLSAgaWYgKENPTkQpIHsgXAotICAgIEZQU0NSIHw9IGZwc2NyX3h4OyBcCi0gICAgRlBTQ1IgfD0gZnBzY3JfZng7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0vKiBOb3RlOiBjb2RlIHVzaW5nIFNFVF9GSSBtdXN0IGFsc28gZXhwbGljaXRseSBjYWxsIFNFVF9YWCAqLwotCi0jZGVmaW5lIEZQU0NSX1NFVF9GUihDT05EKSBkbyB7IFwKLSAgaWYgKENPTkQpIFwKLSAgICBGUFNDUiB8PSBmcHNjcl9mcjsgXAotICBlbHNlIFwKLSAgICBGUFNDUiAmPSB+ZnBzY3JfZnI7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRlBTQ1JfU0VUX0ZJKENPTkQpIFwKLWRvIHsgXAotICBpZiAoQ09ORCkgeyBcCi0gICAgRlBTQ1IgfD0gZnBzY3JfZmk7IFwKLSAgfSBcCi0gIGVsc2UgXAotICAgIEZQU0NSICY9IH5mcHNjcl9maTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGUFNDUl9TRVRfRlBSRihWQUwpIFwKLWRvIHsgXAotICBGUFNDUiA9IChGUFNDUiAmIH5mcHNjcl9mcHJmKSB8IChWQUwpOyBcCi19IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pZGVjb2RlX2ZpZWxkcy5oIGIvc2ltL3BwYy9pZGVjb2RlX2ZpZWxkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQ0OWJjLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaWRlY29kZV9maWVsZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0vKiBJbnN0cnVjdGlvbiBmaWVsZCBtYWNyb3M6Ci0KLSAgIFRoZSBtYWNybydzIGJlbG93IGdyZWF0bHkgc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgdHJhbnNsYXRpbmcgdGhlCi0gICBwc2V1ZG8gY29kZSBmb3VuZCBpbiB0aGUgUG93ZXJQQyBtYW51YWwgaW50byBDLgotCi0gICBJbiBhZGRpdGlvbiB0byB0aGUgYmVsb3csIG1vcmUgd2lsbCBiZSBmb3VuZCBpbiB0aGUgZ2VuIHByb2dyYW0ncwotICAgY2FjaGUgdGFibGUgKi8KLQotCi0vKiBtYXAgc29tZSBzdGF0ZW1lbnRzIGFuZCB2YXJpYWJsZXMgZGlyZWN0bHkgYWNyb3NzICovCi0KLSNkZWZpbmUgaXNfNjRiaXRfaW1wbGVtZW50YXRpb24gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSNkZWZpbmUgaXNfNjRiaXRfbW9kZSAgICAgICAgICAgSVNfNjRCSVRfTU9ERShwcm9jZXNzb3IpCi0KLSNkZWZpbmUgTklBIG5pYQotI2RlZmluZSBDSUEgY2lhCi0KLQotLyogcmVzZXJ2YXRpb24gKi8KLQotI2RlZmluZSBSRVNFUlZFICAgICAgICBjcHVfcmVzZXJ2YXRpb24ocHJvY2Vzc29yKS0+dmFsaWQKLSNkZWZpbmUgUkVTRVJWRV9BRERSICAgY3B1X3Jlc2VydmF0aW9uKHByb2Nlc3NvciktPmFkZHIKLSNkZWZpbmUgUkVTRVJWRV9EQVRBICAgY3B1X3Jlc2VydmF0aW9uKHByb2Nlc3NvciktPmRhdGEKLQotI2RlZmluZSByZWFsX2FkZHIoRUEsIElTX1JFQUQpICB2bV9yZWFsX2RhdGFfYWRkcihjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwgXAotCQkJCQkJICBFQSwgXAotCQkJCQkJICBJU19SRUFELCBcCi0JCQkJCQkgIHByb2Nlc3NvciwgXAotCQkJCQkJICBjaWEpCi0KLQotLyogZGVwZW5kaW5nIG9uIG1vZGUgcmV0dXJuIGEgMzIgb3IgNjRiaXQgbnVtYmVyICovCi0KLSNkZWZpbmUgSUVBKFgpICAgICAgIChpc182NGJpdF9tb2RlIFwKLQkJICAgICAgPyAoWCkgXAotCQkgICAgICA6IE1BU0tFRCgoWCksIDMyLCA2MykpCi0KLS8qIEV4cGFuZCBhcmd1bWVudCB0byBjdXJyZW50IGFyY2hpdGVjdHVyZSBzaXplICovCi0KLSNkZWZpbmUgRVhUUyhYKQkJRVhUU18jI1gKLQotCi0vKiBHZW4gdHJhbnNsYXRlcyB0ZXh0IG9mIHRoZSBmb3JtIEF7WFg6WVl9IGludG8gQV9YWF9ZWV8gdGhlIG1hY3JvJ3MKLSAgIGJlbG93IGRlZmluZSBzdWNoIHRyYW5zbGF0ZWQgdGV4dCBpbnRvIHJlYWwgZXhwcmVzc2lvbnMgKi8KLQotLyogdGhlIHNwciBmaWVsZCBhcyBpdCBub3JtYWxseSBpcyB1c2VkICovCi0KLSNkZWZpbmUgU1BSXzVfOV8gKFNQUiAmIDB4MWYpCi0jZGVmaW5lIFNQUl8wXzRfIChTUFIgPj4gNSkKLSNkZWZpbmUgU1BSXzBfICgoU1BSICYgQklUMTAoMCkpICE9IDApCi0KLSNkZWZpbmUgdGJyXzVfOV8gKHRiciAmIDB4MWYpCi0jZGVmaW5lIHRicl8wXzRfICh0YnIgPj4gNSkKLQotCi0jZGVmaW5lIFRCIGNwdV9nZXRfdGltZV9iYXNlKHByb2Nlc3NvcikKLQotCi0vKiB2YXJpb3VzIHJlZ2lzdGVycyB3aXRoIGltcG9ydGFudCBtYXNrcyAqLwotCi0jZGVmaW5lIExSXzBiMDAJCShMUiAmIH4zKQotI2RlZmluZSBDVFJfMGIwMAkoQ1RSICYgfjMpCi0KLSNkZWZpbmUgQ1JfQklfICAoKENSICYgQklUMzJfQkkpICE9IDApCi0jZGVmaW5lIENSX0JBXwkoKENSICYgQklUMzJfQkEpICE9IDApCi0jZGVmaW5lIENSX0JCXwkoKENSICYgQklUMzJfQkIpICE9IDApCi0KLQotLyogZXh0ZW5kZWQgZXh0cmFjdGVkIGZpZWxkcyAqLwotCi0jZGVmaW5lIFRPXzBfICgoVE8gJiBCSVQ1KDApKSAhPSAwKQotI2RlZmluZSBUT18xXyAoKFRPICYgQklUNSgxKSkgIT0gMCkKLSNkZWZpbmUgVE9fMl8gKChUTyAmIEJJVDUoMikpICE9IDApCi0jZGVmaW5lIFRPXzNfICgoVE8gJiBCSVQ1KDMpKSAhPSAwKQotI2RlZmluZSBUT180XyAoKFRPICYgQklUNSg0KSkgIT0gMCkKLQotI2RlZmluZSBCT18wXyAoKEJPICYgQklUNSgwKSkgIT0gMCkKLSNkZWZpbmUgQk9fMV8gKChCTyAmIEJJVDUoMSkpICE9IDApCi0jZGVmaW5lIEJPXzJfICgoQk8gJiBCSVQ1KDIpKSAhPSAwKQotI2RlZmluZSBCT18zXyAoKEJPICYgQklUNSgzKSkgIT0gMCkKLSNkZWZpbmUgQk9fNF8gKChCTyAmIEJJVDUoNCkpICE9IDApCi0KLSNkZWZpbmUgR09UTyhkZXN0KSAgIGdvdG8gWENPTkNBVDQobGFiZWxfXyxkZXN0LF9fLE1ZX1BSRUZJWCkKLSNkZWZpbmUgTEFCRUwoZGVzdCkgIFhDT05DQVQ0KGxhYmVsX18sZGVzdCxfXyxNWV9QUkVGSVgpCmRpZmYgLS1naXQgYS9zaW0vcHBjL2lnZW4uYyBiL3NpbS9wcGMvaWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjZjUxLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLQotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgImZpbHRlci5oIgotCi0jaW5jbHVkZSAibGQtZGVjb2RlLmgiCi0jaW5jbHVkZSAibGQtY2FjaGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJpZ2VuLmgiCi0KLSNpbmNsdWRlICJnZW4tbW9kZWwuaCIKLSNpbmNsdWRlICJnZW4taWNhY2hlLmgiCi0jaW5jbHVkZSAiZ2VuLWl0YWJsZS5oIgotI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCi0jaW5jbHVkZSAiZ2VuLXNlbWFudGljcy5oIgotI2luY2x1ZGUgImdlbi1zdXBwb3J0LmgiCi0KLWludCBoaV9iaXRfbnI7Ci1pbnQgaW5zbl9iaXRfc2l6ZSA9IG1heF9pbnNuX2JpdF9zaXplOwotCi1pZ2VuX2NvZGUgY29kZSA9IGdlbmVyYXRlX2NhbGxzOwotCi1pbnQgZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zOwotaW50IGljYWNoZV9zaXplID0gMTAyNDsKLWludCBnZW5lcmF0ZV9zbXA7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2JpdHMobGYgKmZpbGUsIGluc25fYml0cyAqYml0cykKLXsKLSAgaW50IG5yID0gMDsKLSAgaWYgKGJpdHMgPT0gTlVMTCkKLSAgICByZXR1cm4gbnI7Ci0gIG5yICs9IHByaW50X2luc25fYml0cyhmaWxlLCBiaXRzLT5sYXN0KTsKLSAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7Ci0gIG5yICs9IGxmX3B1dHN0cihmaWxlLCBiaXRzLT5maWVsZC0+dmFsX3N0cmluZyk7Ci0gIGlmIChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4gJiYgYml0cy0+dmFsdWUgPT0gMCkKLSAgICBuciArPSBsZl9wdXRpbnQoZmlsZSwgYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KTsKLSAgZWxzZSBpZiAoIWJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbikgewotICAgIGlmIChiaXRzLT5vcGNvZGUtPmxhc3QgPCBiaXRzLT5maWVsZC0+bGFzdCkKLSAgICAgIG5yICs9IGxmX3B1dGludChmaWxlLCBiaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKTsKLSAgICBlbHNlCi0gICAgICBuciArPSBsZl9wdXRpbnQoZmlsZSwgYml0cy0+dmFsdWUpOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotZXh0ZXJuIGludAotcHJpbnRfZnVuY3Rpb25fbmFtZShsZiAqZmlsZSwKLQkJICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotCQkgICAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAotCQkgICAgbGZfZnVuY3Rpb25fbmFtZV9wcmVmaXhlcyBwcmVmaXgpCi17Ci0gIGludCBuciA9IDA7Ci0gIC8qIHRoZSBwcmVmaXggKi8KLSAgc3dpdGNoIChwcmVmaXgpIHsKLSAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3M6Ci0gICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICJzZW1hbnRpY18iKTsKLSAgICBicmVhazsKLSAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlOgotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiaWRlY29kZV8iKTsKLSAgICBicmVhazsKLSAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGU6Ci0gICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICJpdGFibGVfIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlOgotICAgIG5yICs9IGxmX3B1dHN0cihmaWxlLCAiaWNhY2hlXyIpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogdGhlIGZ1bmN0aW9uIG5hbWUgKi8KLSAgewotICAgIGNvbnN0IGNoYXIgKnBvczsKLSAgICBmb3IgKHBvcyA9IGJhc2VuYW1lOwotCSAqcG9zICE9ICdcMCc7Ci0JIHBvcysrKSB7Ci0gICAgICBzd2l0Y2ggKCpwb3MpIHsKLSAgICAgIGNhc2UgJy8nOgotICAgICAgY2FzZSAnLSc6Ci0JYnJlYWs7Ci0gICAgICBjYXNlICcgJzoKLQluciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICpwb3MpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIHRoZSBzdWZmaXggKi8KLSAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKLSAgICBuciArPSBwcmludF9pbnNuX2JpdHMoZmlsZSwgZXhwYW5kZWRfYml0cyk7Ci0KLSAgcmV0dXJuIG5yOwotfQotCi0KLXZvaWQKLXByaW50X215X2RlZmluZXMobGYgKmZpbGUsCi0JCSBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCi0JCSB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSkKLXsKLSAgLyogI2RlZmluZSBNWV9JTkRFWCB4eHh4eCAqLwotICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiI3VuZGVmIE1ZX0lOREVYXG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOwotICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgTVlfSU5ERVggIik7Ci0gIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgLyogI2RlZmluZSBNWV9QUkVGSVggeHh4eHh4ICovCi0gIGxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKLSAgbGZfcHJpbnRmKGZpbGUsICIjdW5kZWYgTVlfUFJFRklYXG4iKTsKLSAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOwotICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgTVlfUFJFRklYICIpOwotICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCi0JCSAgICAgIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAotCQkgICAgICBleHBhbmRlZF9iaXRzLAotCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9ub25lKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotfQotCi0KLXZvaWQKLXByaW50X2l0cmFjZShsZiAqZmlsZSwKLQkgICAgIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5LAotCSAgICAgaW50IGlkZWNvZGUpCi17Ci0gIGxmX3ByaW50X19leHRlcm5hbF9yZWZlcmVuY2UoZmlsZSwgZmlsZV9lbnRyeS0+bGluZV9uciwgZmlsZV9lbnRyeS0+ZmlsZV9uYW1lKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJJVFJBQ0UodHJhY2VfJXMsIChcIiVzICVzXFxuXCIpKTtcbiIsCi0JICAgIChpZGVjb2RlID8gImlkZWNvZGUiIDogInNlbWFudGljcyIpLAotCSAgICAoaWRlY29kZSA/ICJpZGVjb2RlIiA6ICJzZW1hbnRpY3MiKSwKLQkgICAgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0pOwotICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkCi1nZW5fc2VtYW50aWNzX2goaW5zbl90YWJsZSAqdGFibGUsCi0JCWxmICpmaWxlLAotCQlpZ2VuX2NvZGUgZ2VuZXJhdGUpCi17Ci0gIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiAlcyBpZGVjb2RlX3NlbWFudGljXG4oJXMpO1xuIiwKLQkgICAgU0VNQU5USUNfRlVOQ1RJT05fVFlQRSwKLQkgICAgU0VNQU5USUNfRlVOQ1RJT05fRk9STUFMKTsKLSAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpIHsKLSAgICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBpbnQgb3B0aW9uX21wYzg2MGMwO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIFBBR0VfU0laRSAweDEwMDBcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIkVYVEVSTl9TRU1BTlRJQ1Modm9pZClcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAic2VtYW50aWNfaW5pdChkZXZpY2UqIHJvb3QpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpCi0gICAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCi0JCQkgICAgICAgZmlsZSwgTlVMTCwKLQkJCSAgICAgICAxLAotCQkJICAgICAgIE5VTEwsIC8qIHN0YXJ0ICovCi0JCQkgICAgICAgcHJpbnRfc2VtYW50aWNfZGVjbGFyYXRpb24sIC8qIGxlYWYgKi8KLQkJCSAgICAgICBOVUxMLCAvKiBlbmQgKi8KLQkJCSAgICAgICBOVUxMKTsgLyogcGFkZGluZyAqLwotICAgIGVsc2UKLSAgICAgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBOVUxMLAotCQkJICAgICAgIHByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uKTsKLSAgICAKLSAgfQotICBlbHNlIHsKLSAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5KGZpbGUpOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWdlbl9zZW1hbnRpY3NfYyhpbnNuX3RhYmxlICp0YWJsZSwKLQkJY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzLAotCQlsZiAqZmlsZSwKLQkJaWdlbl9jb2RlIGdlbmVyYXRlKQotewotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpIHsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImNwdS5oXCJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlLmhcIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInNlbWFudGljcy5oXCJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJzdXBwb3J0LmhcIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiaW50IG9wdGlvbl9tcGM4NjBjMCA9IDA7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJFWFRFUk5fU0VNQU5USUNTKHZvaWQpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgInNlbWFudGljX2luaXQoZGV2aWNlKiByb290KVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgb3B0aW9uX21wYzg2MGMwID0gMDtcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsIFwiL29wdGlvbnMvbXBjODYwYzBcIikpXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiAgICBvcHRpb25fbXBjODYwYzAgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCBcIi9vcHRpb25zL21wYzg2MGMwXCIpO1xuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIgICAgb3B0aW9uX21wYzg2MGMwICo9IDQ7ICAgLyogY29udmVydCB3b3JkIGNvdW50IHRvIGJ5dGUgY291bnQgKi9cbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpCi0gICAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCi0JCQkgICAgICAgZmlsZSwgY2FjaGVfcnVsZXMsCi0JCQkgICAgICAgMSwKLQkJCSAgICAgICBOVUxMLCAvKiBzdGFydCAqLwotCQkJICAgICAgIHByaW50X3NlbWFudGljX2RlZmluaXRpb24sIC8qIGxlYWYgKi8KLQkJCSAgICAgICBOVUxMLCAvKiBlbmQgKi8KLQkJCSAgICAgICBOVUxMKTsgLyogcGFkZGluZyAqLwotICAgIGVsc2UKLSAgICAgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBjYWNoZV9ydWxlcywKLQkJCSAgICAgICBwcmludF9zZW1hbnRpY19kZWZpbml0aW9uKTsKLSAgICAKLSAgfQotICBlbHNlIHsKLSAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5KGZpbGUpOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIHZvaWQKLWdlbl9pY2FjaGVfaChpbnNuX3RhYmxlICp0YWJsZSwKLQkgICAgIGxmICpmaWxlLAotCSAgICAgaWdlbl9jb2RlIGdlbmVyYXRlKQotewotICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgJXMgaWRlY29kZV9pY2FjaGVcbiglcyk7XG4iLAotCSAgICBJQ0FDSEVfRlVOQ1RJT05fVFlQRSwKLQkgICAgSUNBQ0hFX0ZVTkNUSU9OX0ZPUk1BTCk7Ci0gIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpCi0gICAgICAmJiAoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgewotICAgIGluc25fdGFibGVfdHJhdmVyc2VfZnVuY3Rpb24odGFibGUsCi0JCQkJIGZpbGUsIE5VTEwsCi0JCQkJIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbik7Ci0gICAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKLSAgICAgIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBOVUxMLAotCQkJICAgICAgIDEsCi0JCQkgICAgICAgTlVMTCwgLyogc3RhcnQgKi8KLQkJCSAgICAgICBwcmludF9pY2FjaGVfZGVjbGFyYXRpb24sIC8qIGxlYWYgKi8KLQkJCSAgICAgICBOVUxMLCAvKiBlbmQgKi8KLQkJCSAgICAgICBOVUxMKTsgLyogcGFkZGluZyAqLwotICAgIGVsc2UKLSAgICAgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKLQkJCSAgICAgICBmaWxlLCBOVUxMLAotCQkJICAgICAgIHByaW50X2ljYWNoZV9kZWNsYXJhdGlvbik7Ci0gICAgCi0gIH0KLSAgZWxzZSB7Ci0gICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eShmaWxlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2ljYWNoZV9jKGluc25fdGFibGUgKnRhYmxlLAotCSAgICAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzLAotCSAgICAgbGYgKmZpbGUsCi0JICAgICBpZ2VuX2NvZGUgZ2VuZXJhdGUpCi17Ci0gIC8qIG91dHB1dCBgaW50ZXJuYWwnIGludmFsaWQvZmxvYXRpbmctcG9pbnQgdW5hdmFpbGFibGUgZnVuY3Rpb25zCi0gICAgIHdoZXJlIG5lZWRlZCAqLwotICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykKLSAgICAgICYmIChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaWRlY29kZS5oXCJcbiIpOwotICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJzZW1hbnRpY3MuaFwiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaWNhY2hlLmhcIlxuIik7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInN1cHBvcnQuaFwiXG4iKTsKLSAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKLQkJCQkgZmlsZSwgTlVMTCwKLQkJCQkgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlZmluaXRpb24pOwotICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKQotICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAotCQkJICAgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAotCQkJICAgICAgIDEsCi0JCQkgICAgICAgTlVMTCwgLyogc3RhcnQgKi8KLQkJCSAgICAgICBwcmludF9pY2FjaGVfZGVmaW5pdGlvbiwgLyogbGVhZiAqLwotCQkJICAgICAgIE5VTEwsIC8qIGVuZCAqLwotCQkJICAgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCi0gICAgZWxzZQotICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAotCQkJICAgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAotCQkJICAgICAgIHByaW50X2ljYWNoZV9kZWZpbml0aW9uKTsKLSAgICAKLSAgfQotICBlbHNlIHsKLSAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5KGZpbGUpOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotaW50Ci1tYWluKGludCBhcmdjLAotICAgICBjaGFyICoqYXJndiwKLSAgICAgY2hhciAqKmVudnApCi17Ci0gIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcyA9IE5VTEw7Ci0gIGxmX2ZpbGVfcmVmZXJlbmNlcyBmaWxlX3JlZmVyZW5jZXMgPSBsZl9pbmNsdWRlX3JlZmVyZW5jZXM7Ci0gIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzID0gTlVMTDsKLSAgZmlsdGVyICpmaWx0ZXJzID0gTlVMTDsKLSAgaW5zbl90YWJsZSAqaW5zdHJ1Y3Rpb25zID0gTlVMTDsKLSAgY2hhciAqcmVhbF9maWxlX25hbWUgPSBOVUxMOwotICBpbnQgaXNfaGVhZGVyID0gMDsKLSAgaW50IGNoOwotCi0gIGlmIChhcmdjID09IDEpIHsKLSAgICBwcmludGYoIlVzYWdlOlxuIik7Ci0gICAgcHJpbnRmKCIgIGlnZW4gPGNvbmZpZy1vcHRzPiAuLi4gPGlucHV0LW9wdHM+Li4uIDxvdXRwdXQtb3B0cz4uLi5cbiIpOwotICAgIHByaW50ZigiQ29uZmlnIG9wdGlvbnM6XG4iKTsKLSAgICBwcmludGYoIiAgLUYgPGZpbHRlci1vdXQtZmxhZz4gIGVnIC1GIDY0IHRvIHNraXAgNjRiaXQgaW5zdHJ1Y3Rpb25zXG4iKTsKLSAgICBwcmludGYoIiAgLUUgICAgICAgICAgICAgICAgICAgIEV4cGFuZCAoZHVwbGljYXRlKSBzZW1hbnRpYyBmdW5jdGlvbnNcbiIpOwotICAgIHByaW50ZigiICAtSSA8aWNhY2hlLXNpemU+ICAgICAgR2VuZXJhdGUgY3JhY2tpbmcgY2FjaGUgdmVyc2lvblxuIik7Ci0gICAgcHJpbnRmKCIgIC1DICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIHNlbWFudGljcyBpbiBjYWNoZSBmdW5jdGlvbnNcbiIpOwotICAgIHByaW50ZigiICAtUyAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBpbnNuIChpbnN0cnVjdGlvbikgaW4gaWNhY2hlXG4iKTsKLSAgICBwcmludGYoIiAgLVIgICAgICAgICAgICAgICAgICAgIFVzZSBkZWZpbmVzIHRvIHJlZmVyZW5jZSBjYWNoZSB2YXJzXG4iKTsKLSAgICBwcmludGYoIiAgLUwgICAgICAgICAgICAgICAgICAgIFN1cHJlc3MgbGluZSBudW1iZXJpbmcgaW4gb3V0cHV0IGZpbGVzXG4iKTsKLSAgICBwcmludGYoIiAgLUIgPGJpdC1zaXplPiAgICAgICAgIFNldCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW5zdHJ1Y3Rpb25cbiIpOwotICAgIHByaW50ZigiICAtSCA8aGlnaC1iaXQ+ICAgICAgICAgU2V0IHRoZSBuciBvZiB0aGUgaGlnaCAobXNiIGJpdClcbiIpOwotICAgIHByaW50ZigiICAtTiA8bnItY3B1cz4gICAgICAgICAgU3BlY2lmeSB0aGUgbWF4IG51bWJlciBvZiBjcHVzIHRoZSBzaW11bGF0aW9uIHdpbGwgc3VwcG9ydFxuIik7Ci0gICAgcHJpbnRmKCIgIC1KICAgICAgICAgICAgICAgICAgICBVc2UganVtcHMgaW5zdGVhZCBvZiBmdW5jdGlvbiBjYWxsc1xuIik7Ci0gICAgcHJpbnRmKCIgIC1UIDxtZWNoYW5pc20+ICAgICAgICBPdmVycmlkZSB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gZGVjb2RlIGFuIGluc3RydWN0aW9uXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIDxtZWNoYW5pc20+IGluc3RlYWQgb2Ygd2hhdCB3YXMgc3BlY2lmaWVkIGluIHRoZVxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGUtcnVsZXMgaW5wdXQgZmlsZVxuIik7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiSW5wdXQgb3B0aW9ucyAodWNhc2UgdmVyc2lvbiBhbHNvIGR1bXBzIGxvYWRlZCB0YWJsZSk6XG4iKTsKLSAgICBwcmludGYoIiAgLW8gPGRlY29kZS1ydWxlcz5cbiIpOwotICAgIHByaW50ZigiICAtayA8Y2FjaGUtcnVsZXM+XG4iKTsKLSAgICBwcmludGYoIiAgLWkgPGluc3RydWN0aW9uLXRhYmxlPlxuIik7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiT3V0cHV0IG9wdGlvbnM6XG4iKTsKLSAgICBwcmludGYoIiAgLW4gPHJlYWwtbmFtZT4gICAgICAgIFNwZWNpZnkgdGhlIHJlYWwgbmFtZSBvZiBmb3IgdGhlIG5leHQgb3V0cHV0IGZpbGVcbiIpOyAKLSAgICBwcmludGYoIiAgLWggCQkgICAgR2VuZXJhdGUgaGVhZGVyIGZpbGVcbiIpOwotICAgIHByaW50ZigiICAtYyA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IGljYWNoZVxuIik7Ci0gICAgcHJpbnRmKCIgIC1kIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaWRlY29kZVxuIik7Ci0gICAgcHJpbnRmKCIgIC1tIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgbW9kZWxcbiIpOwotICAgIHByaW50ZigiICAtcyA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IHNjaGVtYXRpY1xuIik7Ci0gICAgcHJpbnRmKCIgIC10IDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaXRhYmxlXG4iKTsKLSAgICBwcmludGYoIiAgLWYgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBzdXBwb3J0IGZ1bmN0aW9uc1xuIik7Ci0gIH0KLQotICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCi0JCSAgICAgICJGOkVJOlJTTEpUOkNCOkg6TjpvOms6aTpuOmhjOmQ6bTpzOnQ6ZjoiKSkKLQkgIT0gLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LSVjICVzXG4iLCBjaCwgKG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7Ci0gICAgc3dpdGNoKGNoKSB7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBjb2RlIHw9IGdlbmVyYXRlX3dpdGhfaWNhY2hlOwotICAgICAgY29kZSB8PSBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1MnOgotICAgICAgY29kZSB8PSBnZW5lcmF0ZV93aXRoX2ljYWNoZTsKLSAgICAgIGNvZGUgfD0gZ2VuZXJhdGVfd2l0aF9pbnNuX2luX2ljYWNoZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0wnOgotICAgICAgZmlsZV9yZWZlcmVuY2VzID0gbGZfb21pdF9yZWZlcmVuY2VzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRSc6Ci0gICAgICBnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnSSc6Ci0gICAgICBpY2FjaGVfc2l6ZSA9IGEyaShvcHRhcmcpOwotICAgICAgY29kZSB8PSBnZW5lcmF0ZV93aXRoX2ljYWNoZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ04nOgotICAgICAgZ2VuZXJhdGVfc21wID0gYTJpKG9wdGFyZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdSJzoKLSAgICAgIGNvZGUgfD0gZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQic6Ci0gICAgICBpbnNuX2JpdF9zaXplID0gYTJpKG9wdGFyZyk7Ci0gICAgICBBU1NFUlQoaW5zbl9iaXRfc2l6ZSA+IDAgJiYgaW5zbl9iaXRfc2l6ZSA8PSBtYXhfaW5zbl9iaXRfc2l6ZQotCSAgICAgJiYgKGhpX2JpdF9uciA9PSBpbnNuX2JpdF9zaXplLTEgfHwgaGlfYml0X25yID09IDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0gnOgotICAgICAgaGlfYml0X25yID0gYTJpKG9wdGFyZyk7Ci0gICAgICBBU1NFUlQoaGlfYml0X25yID09IGluc25fYml0X3NpemUtMSB8fCBoaV9iaXRfbnIgPT0gMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdGJzoKLSAgICAgIGZpbHRlcnMgPSBuZXdfZmlsdGVyKG9wdGFyZywgZmlsdGVycyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdKJzoKLSAgICAgIGNvZGUgJj0gfmdlbmVyYXRlX2NhbGxzOwotICAgICAgY29kZSB8PSBnZW5lcmF0ZV9qdW1wczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1QnOgotICAgICAgZm9yY2VfZGVjb2RlX2dlbl90eXBlKG9wdGFyZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIGlmIChkZWNvZGVfcnVsZXMgPT0gTlVMTCB8fCBjYWNoZV9ydWxlcyA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNpZnkgZGVjb2RlIGFuZCBjYWNoZSB0YWJsZXNcbiIpOwotCWV4aXQgKDEpOwotICAgICAgfQotICAgICAgaW5zdHJ1Y3Rpb25zID0gbG9hZF9pbnNuX3RhYmxlKG9wdGFyZywgZGVjb2RlX3J1bGVzLCBmaWx0ZXJzKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHRleHBhbmRpbmcgLi4uXG4iKTsKLSAgICAgIGluc25fdGFibGVfZXhwYW5kX2luc25zKGluc3RydWN0aW9ucyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdvJzoKLSAgICAgIGRlY29kZV9ydWxlcyA9IGxvYWRfZGVjb2RlX3RhYmxlKG9wdGFyZywgaGlfYml0X25yKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2snOgotICAgICAgY2FjaGVfcnVsZXMgPSBsb2FkX2NhY2hlX3RhYmxlKG9wdGFyZywgaGlfYml0X25yKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ24nOgotICAgICAgcmVhbF9maWxlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2gnOgotICAgICAgaXNfaGVhZGVyID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ20nOgotICAgIGNhc2UgJ3QnOgotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ2MnOgotICAgICAgewotCWxmICpmaWxlID0gbGZfb3BlbihvcHRhcmcsIHJlYWxfZmlsZV9uYW1lLCBmaWxlX3JlZmVyZW5jZXMsCi0JCQkgICAoaXNfaGVhZGVyID8gbGZfaXNfaCA6IGxmX2lzX2MpLAotCQkJICAgYXJndlswXSk7Ci0JbGZfcHJpbnRfX2ZpbGVfc3RhcnQoZmlsZSk7Ci0JQVNTRVJUKGluc3RydWN0aW9ucyAhPSBOVUxMKTsKLQlzd2l0Y2ggKGNoKSB7Ci0JY2FzZSAncyc6Ci0JICBpZihpc19oZWFkZXIpCi0JICAgIGdlbl9zZW1hbnRpY3NfaChpbnN0cnVjdGlvbnMsIGZpbGUsIGNvZGUpOwotCSAgZWxzZQotCSAgICBnZW5fc2VtYW50aWNzX2MoaW5zdHJ1Y3Rpb25zLCBjYWNoZV9ydWxlcywgZmlsZSwgY29kZSk7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGlmIChpc19oZWFkZXIpCi0JICAgIGdlbl9pZGVjb2RlX2goZmlsZSwgaW5zdHJ1Y3Rpb25zLCBjYWNoZV9ydWxlcyk7Ci0JICBlbHNlCi0JICAgIGdlbl9pZGVjb2RlX2MoZmlsZSwgaW5zdHJ1Y3Rpb25zLCBjYWNoZV9ydWxlcyk7Ci0JICBicmVhazsKLQljYXNlICdtJzoKLQkgIGlmIChpc19oZWFkZXIpCi0JICAgIGdlbl9tb2RlbF9oKGluc3RydWN0aW9ucywgZmlsZSk7Ci0JICBlbHNlCi0JICAgIGdlbl9tb2RlbF9jKGluc3RydWN0aW9ucywgZmlsZSk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGlmIChpc19oZWFkZXIpCi0JICAgIGdlbl9pdGFibGVfaChpbnN0cnVjdGlvbnMsIGZpbGUpOwotCSAgZWxzZQotCSAgICBnZW5faXRhYmxlX2MoaW5zdHJ1Y3Rpb25zLCBmaWxlKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgaWYgKGlzX2hlYWRlcikKLQkgICAgZ2VuX3N1cHBvcnRfaChpbnN0cnVjdGlvbnMsIGZpbGUpOwotCSAgZWxzZQotCSAgICBnZW5fc3VwcG9ydF9jKGluc3RydWN0aW9ucywgZmlsZSk7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIGlmIChpc19oZWFkZXIpCi0JICAgIGdlbl9pY2FjaGVfaChpbnN0cnVjdGlvbnMsIGZpbGUsIGNvZGUpOwotCSAgZWxzZQotCSAgICBnZW5faWNhY2hlX2MoaW5zdHJ1Y3Rpb25zLCBjYWNoZV9ydWxlcywgZmlsZSwgY29kZSk7Ci0JICBicmVhazsKLQl9Ci0JbGZfcHJpbnRfX2ZpbGVfZmluaXNoKGZpbGUpOwotCWxmX2Nsb3NlKGZpbGUpOwotCWlzX2hlYWRlciA9IDA7Ci0gICAgICB9Ci0gICAgICByZWFsX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IoInVua25vd24gb3B0aW9uXG4iKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL2lnZW4uaCBiL3NpbS9wcGMvaWdlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ2MjA5Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvaWdlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogV2hhdCBkb2VzIHRoZSBpbnN0cnVjdGlvbiBsb29rIGxpa2UgLSBiaXQgb3JkZXJpbmcgYW5kIHNpemUgKi8KLWV4dGVybiBpbnQgaGlfYml0X25yOwotZXh0ZXJuIGludCBpbnNuX2JpdF9zaXplOwotCi0KLS8qIGdlbmVyYXRpb24gb3B0aW9uczogKi8KLQotCi1lbnVtIHsKLSAgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzID0gMHgxLAotICBnZW5lcmF0ZV93aXRoX2ljYWNoZSA9IDB4MiwKLSAgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUgPSAweDQsCi0gIGdlbmVyYXRlX3dpdGhfaW5zbl9pbl9pY2FjaGUgPSAweDgsCi19OwotCi0KLXR5cGVkZWYgZW51bSB7Ci0KLSAgLyogVHJhbnNmZXIgY29udHJvbCB0byBhbiBpbnN0cnVjdGlvbnMgc2VtYW50aWMgY29kZSB1c2luZyB0aGUgdGhlCi0gICAgIHN0YW5kYXJkIGNhbGwvcmV0dXJuIG1lY2hhbmlzbSAqLwotCi0gIGdlbmVyYXRlX2NhbGxzID0gMHgxMDAsCi0KLSAgLyogSW4gYWRkaXRpb24sIHdoZW4gcmVmZXJpbmcgdG8gZmllbGRzIGFjY2VzcyB0aGVtIGRpcmVjdGx5IGluc3RlYWQKLSAgICAgb2YgdmlhIHZhcmlhYmxlcyAqLwotCi0gIGdlbmVyYXRlX2NhbGxzX3dpdGhfZGlyZWN0X2FjY2VzcwotICAgID0gZ2VuZXJhdGVfY2FsbHMgfCBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MsCi0KLSAgLyogSW4gYWRkaXRpb24sIHByZS1kZWNvZGUgYW4gaW5zdHJ1Y3Rpb25zIG9wY29kZSBmaWVsZHMgKGVudGVyaW5nCi0gICAgIHRoZW0gaW50byBhbiBpY2FjaGUpIHNvIHRoYXQgc2VtYW50aWMgY29kZSBjYW4gYXZvaWQgdGhlIG5lZWQgdG8KLSAgICAgcmUtZGVjb2RlIGZpZWxkcyBlYWNoIHRpbWUgaXQgaXMgZXhlY3V0ZWQgKi8KLQotICBnZW5lcmF0ZV9jYWxsc193aXRoX2ljYWNoZQotICAgID0gZ2VuZXJhdGVfY2FsbHMgfCBnZW5lcmF0ZV93aXRoX2ljYWNoZSwKLQotICAvKiBJbiBhZGRpdGlvbiwgdGhlIGluc3RydWN0aW9uIGRlY29kZSBjb2RlIGluY2x1ZGVzIGEgZHVwbGljYXRlZAotICAgICBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbnMgc2VtYW50aWMgY29kZS4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvCi0gICAgIHBlcmZvcm0gdHdvIGNhbGxzIChvbmUgdG8gZGVjb2RlIGFuIGluc3RydWN0aW9ucyBvcGNvZGUgZmllbGRzCi0gICAgIGFuZCBvbmUgdG8gZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24pIHdoZW4gdGhlcmUgaXMgYSBtaXNzIG9mIHRoZQotICAgICBpY2FjaGUgKi8KLQotICBnZW5lcmF0ZV9jYWxsc193aXRoX3NlbWFudGljX2ljYWNoZQotICAgID0gZ2VuZXJhdGVfY2FsbHNfd2l0aF9pY2FjaGUgfCBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSwKLQotICAvKiBJbiBhZGRpdGlvbiwgdGhlIHNlbWFudGljIGZ1bmN0aW9uIHJlZmVycyB0byBpY2FjaGUgZW50cmllcwotICAgICBkaXJlY3RseSBpbnN0ZWFkIG9mIGZpcnN0IG1vdmluZyB0aGVtIGludG8gbG9jYWwgdmFyaWFibGVzICovCi0KLSAgZ2VuZXJhdGVfY2FsbHNfd2l0aF9kaXJlY3RfYWNjZXNzX2ljYWNoZQotICAgID0gZ2VuZXJhdGVfY2FsbHNfd2l0aF9pY2FjaGUgfCBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MsCi0KLSAgZ2VuZXJhdGVfY2FsbHNfd2l0aF9kaXJlY3RfYWNjZXNzX3NlbWFudGljX2ljYWNoZQotICAgID0gZ2VuZXJhdGVfY2FsbHNfd2l0aF9kaXJlY3RfYWNjZXNzX2ljYWNoZSB8IGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlLAotCi0KLSAgLyogVHJhbnNmZXIgY29udHJvbCB0byBhbiBpbnN0cnVjdGlvbnMgc2VtYW50aWMgY29kZSB1c2luZwotICAgICAoY29tcHV0ZWQpIGdvdG8ncyBpbnN0ZWFkIG9mIHRoZSBtb3JlIGNvbnZlbnRpb25hbCBjYWxsL3JldHVybgotICAgICBtZWNoYW5pc20gKi8KLQotICBnZW5lcmF0ZV9qdW1wcyA9IDB4MjAwLAotCi0gIC8qIEFzIGZvciBnZW5lcmF0ZSBqdW1wcyBidXQgd2l0aCBpbnN0cnVjdGlvbiBmaWVsZHMgYWNjZXNzZWQKLSAgICAgZGlyZWN0bHkgKi8KLQotICBnZW5lcmF0ZV9qdW1wc193aXRoX2RpcmVjdF9hY2Nlc3MKLSAgICA9IGdlbmVyYXRlX2p1bXBzIHwgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzLAotCi0gIC8qIEFzIGZvciBnZW5lcmF0ZV9jYWxsc193aXRoX2ljYWNoZSBidXQgYXBwbGllcyB0byBqdW1waW5nIGNvZGUgKi8KLQotICBnZW5lcmF0ZV9qdW1wc193aXRoX2ljYWNoZQotICAgID0gZ2VuZXJhdGVfanVtcHMgfCBnZW5lcmF0ZV93aXRoX2ljYWNoZSwKLQotICAvKiBBcyBmb3IgZ2VuZXJhdGVfY2FsbHNfd2l0aF9zZW1hbnRpY19pY2FjaGUgYnV0IGFwcGxpZXMgdG8ganVtcGluZwotICAgICBjb2RlICovCi0KLSAgZ2VuZXJhdGVfanVtcHNfd2l0aF9zZW1hbnRpY19pY2FjaGUKLSAgICA9IGdlbmVyYXRlX2p1bXBzX3dpdGhfaWNhY2hlIHwgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUsCi0KLSAgLyogQXMgZm9yIGdlbmVyYXRlX2NhbGxzX3dpdGhfZGlyZWN0X2FjY2VzcyAqLwotCi0gIGdlbmVyYXRlX2p1bXBzX3dpdGhfZGlyZWN0X2FjY2Vzc19pY2FjaGUKLSAgICA9IGdlbmVyYXRlX2p1bXBzX3dpdGhfaWNhY2hlIHwgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzLAotCi0gIGdlbmVyYXRlX2p1bXBzX3dpdGhfZGlyZWN0X2FjY2Vzc19zZW1hbnRpY19pY2FjaGUKLSAgICA9IGdlbmVyYXRlX2p1bXBzX3dpdGhfZGlyZWN0X2FjY2Vzc19pY2FjaGUgfCBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSwKLQotfSBpZ2VuX2NvZGU7Ci0KLWV4dGVybiBpZ2VuX2NvZGUgY29kZTsKLQotCi0KLQotZXh0ZXJuIGludCBpY2FjaGVfc2l6ZTsKLQotCi0vKiBJbnN0cnVjdGlvbiBleHBhbnNpb24/Ci0KLSAgIFNob3VsZCB0aGUgc2VtYW50aWMgY29kZSBmb3IgZWFjaCBpbnN0cnVjdGlvbiwgd2hlbiB0aGUgb3BvcnR1bml0eQotICAgYXJyaXNlcywgYmUgZXhwYW5kZWQgYWNjb3JkaW5nIHRvIHRoZSB2YXJpYWJsZSBvcGNvZGUgZmlsZXMgdGhhdAotICAgdGhlIGluc3RydWN0aW9uIGRlY29kZSBwcm9jZXNzIHJlbmRlcnMgY29uc3RhbnQgKi8KLQotZXh0ZXJuIGludCBnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnM7Ci0KLQotLyogU01QPwotCi0gICBTaG91bGQgdGhlIGdlbmVyYXRlZCBjb2RlIGluY2x1ZGUgU01QIHN1cHBvcnQgKD4wKSBhbmQgaWYgc28sIGZvcgotICAgaG93IG1hbnkgcHJvY2Vzc29ycz8gKi8KLQotZXh0ZXJuIGludCBnZW5lcmF0ZV9zbXA7Ci0KLQotCi0KLS8qIE1pc2MganVuayAqLwotCi0KLQotLyogRnVuY3Rpb24gaGVhZGVyIGRlZmluaXRpb25zICovCi0KLQotLyogQ2FjaGUgZnVuY3Rpb25zOiAqLwotCi0jZGVmaW5lIElDQUNIRV9GVU5DVElPTl9GT1JNQUwgXAotImNwdSAqcHJvY2Vzc29yLFxuXAotIGluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24sXG5cCi0gdW5zaWduZWRfd29yZCBjaWEsXG5cCi0gaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkiCi0KLSNkZWZpbmUgSUNBQ0hFX0ZVTkNUSU9OX0FDVFVBTCAicHJvY2Vzc29yLCBpbnN0cnVjdGlvbiwgY2lhLCBjYWNoZV9lbnRyeSIKLQotI2RlZmluZSBJQ0FDSEVfRlVOQ1RJT05fVFlQRSBcCi0oKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkgXAotID8gU0VNQU5USUNfRlVOQ1RJT05fVFlQRSBcCi0gOiAiaWRlY29kZV9zZW1hbnRpYyAqIikKLQotCi0vKiBTZW1hbnRpYyBmdW5jdGlvbnM6ICovCi0KLSNkZWZpbmUgU0VNQU5USUNfRlVOQ1RJT05fRk9STUFMIFwKLSgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSBcCi0gPyAiY3B1ICpwcm9jZXNzb3IsXG4gaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnksXG4gdW5zaWduZWRfd29yZCBjaWEiIFwKLSA6ICJjcHUgKnByb2Nlc3NvcixcbiBpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uLFxuIHVuc2lnbmVkX3dvcmQgY2lhIikKLQotI2RlZmluZSBTRU1BTlRJQ19GVU5DVElPTl9BQ1RVQUwgXAotKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpIFwKLSA/ICJwcm9jZXNzb3IsIGluc3RydWN0aW9uLCBjaWEsIGNhY2hlX2VudHJ5IiBcCi0gOiAicHJvY2Vzc29yLCBpbnN0cnVjdGlvbiwgY2lhIikKLQotI2RlZmluZSBTRU1BTlRJQ19GVU5DVElPTl9UWVBFICJ1bnNpZ25lZF93b3JkIgotCi0KLQotZXh0ZXJuIHZvaWQgcHJpbnRfbXlfZGVmaW5lcwotKGxmICpmaWxlLAotIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKLSB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSk7Ci0KLWV4dGVybiB2b2lkIHByaW50X2l0cmFjZQotKGxmICpmaWxlLAotIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5LAotIGludCBpZGVjb2RlKTsKLQotCi10eXBlZGVmIGVudW0gewotICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MsCi0gIGZ1bmN0aW9uX25hbWVfcHJlZml4X2lkZWNvZGUsCi0gIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSwKLSAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlLAotICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9ub25lCi19IGxmX2Z1bmN0aW9uX25hbWVfcHJlZml4ZXM7Ci0KLWV4dGVybiBpbnQgcHJpbnRfZnVuY3Rpb25fbmFtZQotKGxmICpmaWxlLAotIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAotIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKLSBsZl9mdW5jdGlvbl9uYW1lX3ByZWZpeGVzIHByZWZpeCk7CmRpZmYgLS1naXQgYS9zaW0vcHBjL2lubGluZS5jIGIvc2ltL3BwYy9pbmxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1OTVhNS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2lubGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfSU5MSU5FX0NfCi0jZGVmaW5lIF9JTkxJTkVfQ18KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInBwYy1jb25maWcuaCIKLQotI2luY2x1ZGUgImlubGluZS5oIgotCi0jaWYgKEJJVFNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAiYml0cy5jIgotI2VuZGlmCi0KLSNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSNpbmNsdWRlICJzaW0tZW5kaWFuLmMiCi0jZW5kaWYKLQotI2lmIChJQ0FDSEVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAiaWNhY2hlLmMiCi0jZW5kaWYKLQotI2lmIChDT1JFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgImNvcmVmaWxlLmMiCi0jZW5kaWYKLQotI2lmIChWTV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSNpbmNsdWRlICJ2bS5jIgotI2VuZGlmCi0KLSNpZiAoRVZFTlRTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgImV2ZW50cy5jIgotI2VuZGlmCi0KLSNpZiAoTU9ERUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAibW9kZWwuYyIKLSNlbmRpZgotCi0jaWYgKE9QVElPTlNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAib3B0aW9ucy5jIgotI2VuZGlmCi0KLSNpZiAoTU9OX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgIm1vbi5jIgotI2VuZGlmCi0KLSNpZiAoUkVHSVNURVJTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgInJlZ2lzdGVycy5jIgotI2VuZGlmCi0KLSNpZiAoSU5URVJSVVBUU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSNpbmNsdWRlICJpbnRlcnJ1cHRzLmMiCi0jZW5kaWYKLQotI2lmIChERVZJQ0VfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAiZGV2aWNlLmMiCi0jZW5kaWYKLQotI2lmIChUUkVFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgInRyZWUuYyIKLSNlbmRpZgotCi0jaWYgKFNQUkVHX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgInNwcmVnLmMiCi0jZW5kaWYKLQotI2lmIChTRU1BTlRJQ1NfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAic2VtYW50aWNzLmMiCi0jZW5kaWYKLQotI2lmIChJREVDT0RFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotI2luY2x1ZGUgImlkZWNvZGUuYyIKLSNlbmRpZgotCi0jaWYgKE9TX0VNVUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jaW5jbHVkZSAib3NfZW11bC5jIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pbmxpbmUuaCBiL3NpbS9wcGMvaW5saW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGNkOWUuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9pbmxpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9JTkxJTkVfSF8KLSNkZWZpbmUgX0lOTElORV9IXwotCi0KLSNkZWZpbmUgU1RBVElDKFRZUEUpIHN0YXRpYyBUWVBFCi0KLQotLyogc2ltX2VuZGlhbiBpcyBhbHdheXMgaW5saW5lZCAqLwotCi0jaWYgIWRlZmluZWQoX1NJTV9FTkRJQU5fQ18pICYmIChTSU1fRU5ESUFOX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU0lNX0VORElBTihUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgZWxzZQotIyAgZGVmaW5lIElOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotIyBlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9TSU1fRU5ESUFOKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9TSU1fRU5ESUFOKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKFNJTV9FTkRJQU5fSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0VORElBTihUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIGJpdHMgaXMgYWx3YXlzIGlubGluZWQgKi8KLQotI2lmICFkZWZpbmVkKF9CSVRTX0NfKSAmJiAoQklUU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKEJJVFNfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKLSMgIGRlZmluZSBJTkxJTkVfQklUUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0JJVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jIGVsc2UKLSMgIGRlZmluZSBJTkxJTkVfQklUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fQklUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfQklUUyhUWVBFKSBUWVBFCi0jIGRlZmluZSBFWFRFUk5fQklUUyhUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChCSVRTX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0JJVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9CSVRTKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBjb3JlIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfQ09SRV9DXykgJiYgKENPUkVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChDT1JFX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX0NPUkUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9DT1JFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfQ09SRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fQ09SRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9DT1JFKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9DT1JFKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKENPUkVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ09SRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0NPUkUoVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIHZtIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfVk1fQ18pICYmIChWTV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKFZNX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX1ZNKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fVk0oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9WTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fVk0oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfVk0oVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX1ZNKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKFZNX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1ZNKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfVk0oVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIGNwdSBpcyBhbHdheXMgaW5saW5lZCAqLwotCi0jaWYgIWRlZmluZWQoX0NQVV9DXykgJiYgKENQVV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKENQVV9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9DUFUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9DUFUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9DUFUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0NQVShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9DUFUoVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX0NQVShUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChDUFVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ1BVKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ1BVKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBtb2RlbCBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX01PREVMX0NfKSAmJiAoTU9ERUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChNT0RFTF9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9NT0RFTChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX01PREVMKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfTU9ERUwoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX01PREVMKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX01PREVMKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9NT0RFTChUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChNT0RFTF9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9NT0RFTChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX01PREVMKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBldmVudHMgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCi0KLSNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9FVkVOVFNfQ18pICYmIChFVkVOVFNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChFVkVOVFNfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKLSMgIGRlZmluZSBJTkxJTkVfRVZFTlRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fRVZFTlRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfRVZFTlRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfRVZFTlRTKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9FVkVOVFMoVFlQRSkgVFlQRQotI2VuZGlmCi0KLSNpZiAoRVZFTlRTX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0VWRU5UUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0VWRU5UUyhUWVBFKSBzdGF0aWMgVFlQRQotI2VuZGlmCi0KLQotLyogbW9uIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfTU9OX0NfKSAmJiAoTU9OX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpZiAoTU9OX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX01PTihUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX01PTihUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX01PTihUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fTU9OKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX01PTihUWVBFKSBUWVBFCi0jIGRlZmluZSBFWFRFUk5fTU9OKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKE1PTl9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9NT04oVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9NT04oVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIHJlZ2lzdGVycyBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX1JFR0lTVEVSU19DXykgJiYgKFJFR0lTVEVSU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKFJFR0lTVEVSU19JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9SRUdJU1RFUlMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9SRUdJU1RFUlMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9SRUdJU1RFUlMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX1JFR0lTVEVSUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9SRUdJU1RFUlMoVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX1JFR0lTVEVSUyhUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChSRUdJU1RFUlNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfUkVHSVNURVJTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfUkVHSVNURVJTKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBpbnRlcnJ1cHRzIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfSU5URVJSVVBUU19DXykgJiYgKElOVEVSUlVQVFNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChJTlRFUlJVUFRTX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX0lOVEVSUlVQVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9JTlRFUlJVUFRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfSU5URVJSVVBUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fSU5URVJSVVBUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9JTlRFUlJVUFRTKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9JTlRFUlJVUFRTKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKElOVEVSUlVQVFNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSU5URVJSVVBUUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lOVEVSUlVQVFMoVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIGRldmljZSBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX0RFVklDRV9DXykgJiYgKERFVklDRV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKERFVklDRV9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9ERVZJQ0UoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9ERVZJQ0UoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9ERVZJQ0UoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0RFVklDRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9ERVZJQ0UoVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX0RFVklDRShUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChERVZJQ0VfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfREVWSUNFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfREVWSUNFKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiB0cmVlIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfVFJFRV9DXykgJiYgKFRSRUVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChUUkVFX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX1RSRUUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9UUkVFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfVFJFRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fVFJFRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9UUkVFKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9UUkVFKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKFRSRUVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfVFJFRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1RSRUUoVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIHNwcmVnIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfU1BSRUdfQ18pICYmIChTUFJFR19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKFNQUkVHX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX1NQUkVHKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU1BSRUcoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9TUFJFRyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fU1BSRUcoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfU1BSRUcoVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX1NQUkVHKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKFNQUkVHX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NQUkVHKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU1BSRUcoVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIHNlbWFudGljcyBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX1NFTUFOVElDU19DXykgJiYgKFNFTUFOVElDU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKFNFTUFOVElDU19JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk0KLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQotIyAgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk0KLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9TRU1BTlRJQ1MoVFlQRSkgVFlQRSBSRUdQQVJNCi0jIGRlZmluZSBFWFRFUk5fU0VNQU5USUNTKFRZUEUpIFRZUEUgUkVHUEFSTQotI2VuZGlmCi0KLSNpZiAoU0VNQU5USUNTX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNCi0jZW5kaWYKLQotCi0vKiBpZGVjb2RlIGlzIGFjdHVhbGx5IG5vdCBpbmxpbmVkICovCi0KLSNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9JREVDT0RFX0NfKSAmJiAoSURFQ09ERV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKElERUNPREVfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKLSMgIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0lERUNPREUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk0KLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX0lERUNPREUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk0KLSMgIGRlZmluZSBFWFRFUk5fSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX0lERUNPREUoVFlQRSkgVFlQRSBSRUdQQVJNCi0jIGRlZmluZSBFWFRFUk5fSURFQ09ERShUWVBFKSBUWVBFIFJFR1BBUk0KLSNlbmRpZgotCi0jaWYgKElERUNPREVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lERUNPREUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTQotI2VuZGlmCi0KLQotLyogaWNhY2hlIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfSUNBQ0hFX0NfKSAmJiAoSUNBQ0hFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpZiAoSUNBQ0hFX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX0lDQUNIRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX0lDQUNIRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfSUNBQ0hFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNCi0jICBkZWZpbmUgRVhURVJOX0lDQUNIRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX0lDQUNIRShUWVBFKSBUWVBFIFJFR1BBUk0KLSMgZGVmaW5lIEVYVEVSTl9JQ0FDSEUoVFlQRSkgVFlQRSBSRUdQQVJNCi0jZW5kaWYKLQotI2lmIChJQ0FDSEVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSUNBQ0hFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSUNBQ0hFKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk0KLSNlbmRpZgotCi0KLS8qIHN1cHBvcnQgaXMgYWx3YXlzIGlubGluZWQgKi8KLQotI2lmICFkZWZpbmVkKF9TVVBQT1JUX0NfKSAmJiAoU1VQUE9SVF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKLSMgaWYgKFNVUFBPUlRfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKLSMgIGRlZmluZSBJTkxJTkVfU1VQUE9SVChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX1NVUFBPUlQoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZWxzZQotIyAgZGVmaW5lIElOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9TVVBQT1JUKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2VuZGlmCi0jZWxzZQotIyBkZWZpbmUgSU5MSU5FX1NVUFBPUlQoVFlQRSkgVFlQRQotIyBkZWZpbmUgRVhURVJOX1NVUFBPUlQoVFlQRSkgVFlQRQotI2VuZGlmCi0KLSNpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQotI2Vsc2UKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU1VQUE9SVChUWVBFKSBzdGF0aWMgVFlQRQotI2VuZGlmCi0KLQotLyogb3B0aW9ucyBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX09QVElPTlNfQ18pICYmIChPUFRJT05TX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpZiAoT1BUSU9OU19JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9PUFRJT05TKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fT1BUSU9OUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX09QVElPTlMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX09QVElPTlMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfT1BUSU9OUyhUWVBFKSBUWVBFCi0jIGRlZmluZSBFWFRFUk5fT1BUSU9OUyhUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChPUFRJT05TX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX09QVElPTlMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9PUFRJT05TKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBvc19lbXVsIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLwotCi0jaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfT1NfRU1VTF9DXykgJiYgKE9TX0VNVUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChPU19FTVVMX0lOTElORSAmIElOTElORV9NT0RVTEUpCi0jICBkZWZpbmUgSU5MSU5FX09TX0VNVUwoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9PU19FTVVMKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfT1NfRU1VTChUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fT1NfRU1VTChUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIElOTElORV9PU19FTVVMKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9PU19FTVVMKFRZUEUpIFRZUEUKLSNlbmRpZgotCi0jaWYgKE9TX0VNVUxfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfT1NfRU1VTChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX09TX0VNVUwoVFlQRSkgc3RhdGljIFRZUEUKLSNlbmRpZgotCi0KLS8qIHBzaW0gaXMgYWN0dWFsbHkgbm90IGlubGluZWQgKi8KLQotI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX1BTSU1fQ18pICYmIChQU0lNX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpZiAoUFNJTV9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQotIyAgZGVmaW5lIElOTElORV9QU0lNKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fUFNJTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKLSNlbHNlCi0jICBkZWZpbmUgSU5MSU5FX1BTSU0oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jICBkZWZpbmUgRVhURVJOX1BTSU0oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfUFNJTShUWVBFKSBUWVBFCi0jIGRlZmluZSBFWFRFUk5fUFNJTShUWVBFKSBUWVBFCi0jZW5kaWYKLQotI2lmIChQU0lNX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX1BTSU0oVFlQRSkgc3RhdGljIElOTElORSBUWVBFCi0jZWxzZQotIyBkZWZpbmUgU1RBVElDX0lOTElORV9QU0lNKFRZUEUpIHN0YXRpYyBUWVBFCi0jZW5kaWYKLQotCi0vKiBjYXAgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCi0KLSNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9DQVBfQ18pICYmIChDQVBfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCi0jIGlmIChDQVBfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKLSMgIGRlZmluZSBJTkxJTkVfQ0FQKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKLSMgIGRlZmluZSBFWFRFUk5fQ0FQKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotI2Vsc2UKLSMgIGRlZmluZSBJTkxJTkVfQ0FQKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAotIyAgZGVmaW5lIEVYVEVSTl9DQVAoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECi0jZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBJTkxJTkVfQ0FQKFRZUEUpIFRZUEUKLSMgZGVmaW5lIEVYVEVSTl9DQVAoVFlQRSkgVFlQRQotI2VuZGlmCi0KLSNpZiAoQ0FQX0lOTElORSAmIElOTElORV9MT0NBTFMpCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0NBUChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKLSNlbHNlCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FX0NBUChUWVBFKSBzdGF0aWMgVFlQRQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pbnRlcnJ1cHRzLmMgYi9zaW0vcHBjL2ludGVycnVwdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxZTc5MS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2ludGVycnVwdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9JTlRFUlJVUFRTX0NfCi0jZGVmaW5lIF9JTlRFUlJVUFRTX0NfCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImlkZWNvZGUuaCIKLSNpbmNsdWRlICJvc19lbXVsLmgiCi0KLQotLyogT3BlcmF0aW5nIGVudmlyb25tZW50IHN1cHBvcnQgY29kZQotCi0gICBVbmxpa2UgdGhlIFZFQSwgdGhlIE9FQSBtdXN0IGZ1bGx5IG1vZGVsIHRoZSBlZmZlY3QgYW4gaW50ZXJydXB0Ci0gICBoYXMgb24gdGhlIHByb2Nlc3NvcnMgc3RhdGUuCi0KLSAgIEVhY2ggZnVuY3Rpb24gYmVsb3cgcmV0dXJuIHVwZGF0ZWQgdmFsdWVzIGZvciByZWdpc3RlcnMgZWZmZWN0ZWQgYnkKLSAgIGludGVycnVwdHMgKi8KLQotCi1TVEFUSUNfSU5MSU5FX0lOVEVSUlVQVFNcCi0obXNyZWcpCi1pbnRlcnJ1cHRfbXNyKG1zcmVnIG9sZF9tc3IsCi0JICAgICAgbXNyZWcgbXNyX2NsZWFyLAotCSAgICAgIG1zcmVnIG1zcl9zZXQpCi17Ci0gIG1zcmVnIG1zcl9zZXRfdG9fMCA9IChtc3JfYnJhbmNoX3RyYWNlX2VuYWJsZQotCQkJfCBtc3JfZGF0YV9yZWxvY2F0ZQotCQkJfCBtc3JfZXh0ZXJuYWxfaW50ZXJydXB0X2VuYWJsZQotCQkJfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMAotCQkJfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMQotCQkJfCBtc3JfZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlCi0JCQl8IG1zcl9pbnN0cnVjdGlvbl9yZWxvY2F0ZQotCQkJfCBtc3JfcG93ZXJfbWFuYWdlbWVudF9lbmFibGUKLQkJCXwgbXNyX3Byb2JsZW1fc3RhdGUKLQkJCXwgbXNyX3JlY292ZXJhYmxlX2ludGVycnVwdAotCQkJfCBtc3Jfc2luZ2xlX3N0ZXBfdHJhY2VfZW5hYmxlKTsKLSAgLyogcmVtZW1iZXIsIGluIDMyYml0IG1vZGUgbXNyXzY0Yml0X21vZGUgaXMgemVybyAqLwotICBtc3JlZyBuZXdfbXNyID0gKCgoKG9sZF9tc3IgJiB+bXNyX3NldF90b18wKQotCQkgICAgIHwgbXNyXzY0Yml0X21vZGUpCi0JCSAgICAmIH5tc3JfY2xlYXIpCi0JCSAgIHwgbXNyX3NldCk7Ci0gIHJldHVybiBuZXdfbXNyOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfSU5URVJSVVBUU1wKLShtc3JlZykKLWludGVycnVwdF9zcnIxKG1zcmVnIG9sZF9tc3IsCi0JICAgICAgIG1zcmVnIHNycjFfY2xlYXIsCi0JICAgICAgIG1zcmVnIHNycjFfc2V0KQotewotICBzcHJlZyBzcnIxX21hc2sgPSAoTUFTSygwLDMyKQotCQkgICAgIHwgTUFTSygzNywgNDEpCi0JCSAgICAgfCBNQVNLKDQ4LCA2MykpOwotICBzcHJlZyBzcnIxID0gKG9sZF9tc3IgJiBzcnIxX21hc2sgJiB+c3JyMV9jbGVhcikgfCBzcnIxX3NldDsKLSAgcmV0dXJuIHNycjE7Ci19Ci0KLQotU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAotKHVuc2lnbmVkX3dvcmQpCi1pbnRlcnJ1cHRfYmFzZV9lYShtc3JlZyBtc3IpCi17Ci0gIGlmIChtc3IgJiBtc3JfaW50ZXJydXB0X3ByZWZpeCkKLSAgICByZXR1cm4gTUFTSygwLCA0Myk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBmaW5pc2ggb2ZmIGFuIGludGVycnVwdCBmb3IgdGhlIE9FQSBtb2RlbCwgdXBkYXRpbmcgYWxsIHJlZ2lzdGVycwotICAgYW5kIGZvcmNpbmcgYSByZXN0YXJ0IG9mIHRoZSBwcm9jZXNzb3IgKi8KLQotU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAotKHVuc2lnbmVkX3dvcmQpCi1wZXJmb3JtX29lYV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkgICAgICB1bnNpZ25lZF93b3JkIHZlY3Rvcl9vZmZzZXQsCi0JCSAgICAgIG1zcmVnIG1zcl9jbGVhciwKLQkJICAgICAgbXNyZWcgbXNyX3NldCwKLQkJICAgICAgbXNyZWcgc3JyMV9jbGVhciwKLQkJICAgICAgbXNyZWcgc3JyMV9zZXQpCi17Ci0gIG1zcmVnIG9sZF9tc3IgPSBNU1I7Ci0gIG1zcmVnIG5ld19tc3IgPSBpbnRlcnJ1cHRfbXNyKG9sZF9tc3IsIG1zcl9jbGVhciwgbXNyX3NldCk7Ci0gIHVuc2lnbmVkX3dvcmQgbmlhOwotICBpZiAoIShvbGRfbXNyICYgbXNyX3JlY292ZXJhYmxlX2ludGVycnVwdCkpIHsKLSAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgImRvdWJsZSBpbnRlcnJ1cHQgLSBNU1JbUkldIGJpdCBjbGVhciB3aGVuIGF0dGVtcHRpbmcgdG8gZGVsaXZlciBpbnRlcnJ1cHQsIGNpYT0weCVseCwgbXNyPTB4JWx4OyBzcnIwPTB4JWx4KGNpYSksIHNycjE9MHglbHgobXNyKTsgdHJhcC12ZWN0b3I9MHglbHgsIHRyYXAtbXNyPTB4JWx4IiwKLQkgICAgICAodW5zaWduZWQgbG9uZyljaWEsCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpb2xkX21zciwKLQkgICAgICAodW5zaWduZWQgbG9uZylTUlIwLAotCSAgICAgICh1bnNpZ25lZCBsb25nKVNSUjEsCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpdmVjdG9yX29mZnNldCwKLQkgICAgICAodW5zaWduZWQgbG9uZyluZXdfbXNyKTsKLSAgfQotICBTUlIwID0gKHNwcmVnKShjaWEpOwotICBTUlIxID0gaW50ZXJydXB0X3NycjEob2xkX21zciwgc3JyMV9jbGVhciwgc3JyMV9zZXQpOwotICBNU1IgPSBuZXdfbXNyOwotICBuaWEgPSBpbnRlcnJ1cHRfYmFzZV9lYShuZXdfbXNyKSArIHZlY3Rvcl9vZmZzZXQ7Ci0gIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3NvciwgY2lhKTsKLSAgcmV0dXJuIG5pYTsKLX0KLQotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKQotbWFjaGluZV9jaGVja19pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7Ci0KLSAgY2FzZSBVU0VSX0VOVklST05NRU5UOgotICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6Ci0gICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAibWFjaGluZS1jaGVjayBpbnRlcnJ1cHQiKTsKLQotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKLSAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoIm1hY2hpbmUtY2hlY2sgaW50ZXJydXB0IC0gY2lhPTB4JWx4XG4iLAotCQkJICAgICAodW5zaWduZWQgbG9uZyljaWEpKTsKLSAgICBjaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIDB4MDAyMDAsIDAsIDAsIDAsIDApOwotICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKTsKLQotICBkZWZhdWx0OgotICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIG1hY2hpbmVfY2hlY2tfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOwotCi0gIH0KLX0KLQotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKQotZGF0YV9zdG9yYWdlX2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkgICAgICAgdW5zaWduZWRfd29yZCBlYSwKLQkJICAgICAgIHN0b3JhZ2VfaW50ZXJydXB0X3JlYXNvbnMgcmVhc29uLAotCQkgICAgICAgaW50IGlzX3N0b3JlKQotewotICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKLQotICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6Ci0gIGNhc2UgVklSVFVBTF9FTlZJUk9OTUVOVDoKLSAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0IC0gc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gVkVBIG1vZGUiKTsKLSAgICBicmVhazsKLQotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKLSAgICB7Ci0gICAgICBzcHJlZyBkaXJlY3Rpb24gPSAoaXNfc3RvcmUgPyBkc2lzcl9zdG9yZV9vcGVyYXRpb24gOiAwKTsKLSAgICAgIHN3aXRjaCAocmVhc29uKSB7Ci0gICAgICBjYXNlIGRpcmVjdF9zdG9yZV9zdG9yYWdlX2ludGVycnVwdDoKLQlEU0lTUiA9IGRzaXNyX2RpcmVjdF9zdG9yZV9lcnJvcl9leGNlcHRpb24gfCBkaXJlY3Rpb247Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGhhc2hfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdDoKLQlEU0lTUiA9IGRzaXNyX2hhc2hfdGFibGVfb3JfZGJhdF9taXNzIHwgZGlyZWN0aW9uOwotCWJyZWFrOwotICAgICAgY2FzZSBwcm90ZWN0aW9uX3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdDoKLQlEU0lTUiA9IGRzaXNyX3Byb3RlY3Rpb25fdmlvbGF0aW9uIHwgZGlyZWN0aW9uOwotCWJyZWFrOwotICAgICAgY2FzZSBlYXJ3YXhfdmlvbGF0aW9uX3N0b3JhZ2VfaW50ZXJydXB0OgotCURTSVNSID0gZHNpc3JfZWFyd2F4X3Zpb2xhdGlvbiB8IGRpcmVjdGlvbjsKLQlicmVhazsKLSAgICAgIGNhc2Ugc2VnbWVudF90YWJsZV9taXNzX3N0b3JhZ2VfaW50ZXJydXB0OgotCURTSVNSID0gZHNpc3Jfc2VnbWVudF90YWJsZV9taXNzIHwgZGlyZWN0aW9uOwotCWJyZWFrOwotICAgICAgY2FzZSBlYXJ3YXhfZGlzYWJsZWRfc3RvcmFnZV9pbnRlcnJ1cHQ6Ci0JRFNJU1IgPSBkc2lzcl9lYXJ3YXhfZGlzYWJsZWQgfCBkaXJlY3Rpb247Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGRhdGFfc3RvcmFnZV9pbnRlcnJ1cHQgLSByZWFzb24gJWQgbm90IGltcGxlbWVudGVkIiwgcmVhc29uKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIERBUiA9IChzcHJlZyllYTsKLSAgICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiZGF0YSBzdG9yYWdlIGludGVycnVwdCAtIGNpYT0weCVseCBEQVI9MHglbHggRFNJU1I9MHglbHhcbiIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKURBUiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylEU0lTUikpOwotICAgICAgY2lhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCAweDAwMzAwLCAwLCAwLCAwLCAwKTsKLSAgICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKTsKLSAgICB9Ci0KLSAgZGVmYXVsdDoKLSAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOwotCi0gIH0KLX0KLQotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKQotaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKLQkJCSAgICAgIHN0b3JhZ2VfaW50ZXJydXB0X3JlYXNvbnMgcmVhc29uKQotewotICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKLQotICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6Ci0gIGNhc2UgVklSVFVBTF9FTlZJUk9OTUVOVDoKLSAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBpbnN0cnVjdGlvbl9zdG9yYWdlX2ludGVycnVwdCAtIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIFZFQSBtb2RlIik7Ci0KLSAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6Ci0gICAgewotICAgICAgbXNyZWcgc3JyMV9zZXQ7Ci0gICAgICBzd2l0Y2gocmVhc29uKSB7Ci0gICAgICBjYXNlIGhhc2hfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdDoKLQlzcnIxX3NldCA9IHNycjFfaGFzaF90YWJsZV9vcl9pYmF0X21pc3M7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGRpcmVjdF9zdG9yZV9zdG9yYWdlX2ludGVycnVwdDoKLQlzcnIxX3NldCA9IHNycjFfZGlyZWN0X3N0b3JlX2Vycm9yX2V4Y2VwdGlvbjsKLQlicmVhazsKLSAgICAgIGNhc2UgcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQ6Ci0Jc3JyMV9zZXQgPSBzcnIxX3Byb3RlY3Rpb25fdmlvbGF0aW9uOwotCWJyZWFrOwotICAgICAgY2FzZSBzZWdtZW50X3RhYmxlX21pc3Nfc3RvcmFnZV9pbnRlcnJ1cHQ6Ci0Jc3JyMV9zZXQgPSBzcnIxX3NlZ21lbnRfdGFibGVfbWlzczsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3JyMV9zZXQgPSAwOwotCWVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGluc3RydWN0aW9uX3N0b3JhZ2VfaW50ZXJydXB0IC0gcmVhc29uICVkIG5vdCBpbXBsZW1lbnRlZCIpOwotCWJyZWFrOwotICAgICAgfQotICAgICAgVFJBQ0UodHJhY2VfaW50ZXJydXB0cywgKCJpbnN0cnVjdGlvbiBzdG9yYWdlIGludGVycnVwdCAtIGNpYT0weCVseCBTUlIxfD0weCVseFxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyljaWEsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpc3JyMV9zZXQpKTsKLSAgICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgMHgwMDQwMCwgMCwgMCwgMCwgc3JyMV9zZXQpOwotICAgICAgY3B1X3Jlc3RhcnQocHJvY2Vzc29yLCBjaWEpOwotICAgIH0KLQotICBkZWZhdWx0OgotICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGluc3RydWN0aW9uX3N0b3JhZ2VfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOwotCi0gIH0KLX0KLQotCi0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpCi1hbGlnbm1lbnRfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAotCQkgICAgdW5zaWduZWRfd29yZCBjaWEsCi0JCSAgICB1bnNpZ25lZF93b3JkIHJhKQotewotICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKLQotICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6Ci0gIGNhc2UgVklSVFVBTF9FTlZJUk9OTUVOVDoKLSAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJhbGlnbm1lbnQgaW50ZXJydXB0IC0gcmE9MHglbHgiLCByYSk7Ci0gICAgCi0gIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgotICAgIERBUiA9IChzcHJlZylyYTsKLSAgICBEU0lTUiA9IDA7IC8qIEZJWE1FICovCi0gICAgVFJBQ0UodHJhY2VfaW50ZXJydXB0cywgKCJhbGlnbm1lbnQgaW50ZXJydXB0IC0gY2lhPTB4JWx4IERBUj0weCVseCBEU0lTUj0weCVseFxuIiwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAotCQkJICAgICAodW5zaWduZWQgbG9uZylEQVIsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKURTSVNSKSk7Ci0gICAgY2lhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCAweDAwNjAwLCAwLCAwLCAwLCAwKTsKLSAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7Ci0KLSAgZGVmYXVsdDoKLSAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBhbGlnbm1lbnRfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOwotICAgIAotICB9Ci19Ci0KLQotCi0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpCi1wcm9ncmFtX2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKLQkJICB1bnNpZ25lZF93b3JkIGNpYSwKLQkJICBwcm9ncmFtX2ludGVycnVwdF9yZWFzb25zIHJlYXNvbikKLXsKLSAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7Ci0KLSAgY2FzZSBVU0VSX0VOVklST05NRU5UOgotICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6Ci0gICAgc3dpdGNoIChyZWFzb24pIHsKLSAgICBjYXNlIGZsb2F0aW5nX3BvaW50X2VuYWJsZWRfcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0gICAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJwcm9ncmFtIGludGVycnVwdCAtICVzIiwKLQkJImZsb2F0aW5nIHBvaW50IGVuYWJsZWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKLSAgICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgInByb2dyYW0gaW50ZXJydXB0IC0gJXMiLAotCQkiaWxsZWdhbCBpbnN0cnVjdGlvbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwcml2aWxlZ2VkX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0OgotICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCi0JCSJwcml2aWxlZ2VkIGluc3RydWN0aW9uIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRyYXBfcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0gICAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJwcm9ncmFtIGludGVycnVwdCAtICVzIiwKLQkJInRyYXAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0gICAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJwcm9ncmFtIGludGVycnVwdCAtICVzIiwKLQkJImlsbGVnYWwgaW5zdHJ1Y3Rpb24gKG9wdGlvbmFsIGluc3RydWN0aW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1wYzg2MGMwX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0OgotICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCi0gICAgICAgIAkicHJvYmxlbWF0aWMgYnJhbmNoIGRldGVjdGVkLCBzZWUgTVBDODYwIEMwIGVycmF0YSIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHByb2dyYW1faW50ZXJydXB0IC0gcmVhc29uICVkIG5vdCBpbXBsZW1lbnRlZCIsIHJlYXNvbik7Ci0gICAgfQotCi0gIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgotICAgIHsKLSAgICAgIG1zcmVnIHNycjFfc2V0OwotICAgICAgc3dpdGNoIChyZWFzb24pIHsKLSAgICAgIGNhc2UgZmxvYXRpbmdfcG9pbnRfZW5hYmxlZF9wcm9ncmFtX2ludGVycnVwdDoKLQlzcnIxX3NldCA9IHNycjFfZmxvYXRpbmdfcG9pbnRfZW5hYmxlZDsKLQlicmVhazsKLSAgICAgIGNhc2Ugb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0gICAgICBjYXNlIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0Jc3JyMV9zZXQgPSBzcnIxX2lsbGVnYWxfaW5zdHJ1Y3Rpb247Ci0JYnJlYWs7Ci0gICAgICBjYXNlIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0Jc3JyMV9zZXQgPSBzcnIxX3ByaXZpbGlnZWRfaW5zdHJ1Y3Rpb247Ci0JYnJlYWs7Ci0gICAgICBjYXNlIHRyYXBfcHJvZ3JhbV9pbnRlcnJ1cHQ6Ci0Jc3JyMV9zZXQgPSBzcnIxX3RyYXA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIG1wYzg2MGMwX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0OgotICAgICAgICBzcnIxX3NldCA9IDA7Ci0gICAgICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgInByb2dyYW0gaW50ZXJydXB0IC0gJXMiLAotICAgICAgICAgICAgICAicHJvYmxlbWF0aWMgYnJhbmNoIGRldGVjdGVkLCBzZWUgTVBDODYwIEMwIGVycmF0YSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3JyMV9zZXQgPSAwOwotCWVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHByb2dyYW1faW50ZXJydXB0IC0gcmVhc29uICVkIG5vdCBpbXBsZW1lbnRlZCIsIHJlYXNvbik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoInByb2dyYW0gaW50ZXJydXB0IC0gY2lhPTB4JWx4IFNSUjF8PTB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWNpYSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylzcnIxX3NldCkpOwotICAgICAgY2lhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCAweDAwNzAwLCAwLCAwLCAwLCBzcnIxX3NldCk7Ci0gICAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7Ci0gICAgfQotCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gcHJvZ3JhbV9pbnRlcnJ1cHQgLSBiYWQgc3dpdGNoIik7Ci0KLSAgfQotfQotCi0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpCi1mbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JCQkJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7Ci0gICAgCi0gIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKLSAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgotICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgImZsb2F0aW5nLXBvaW50IHVuYXZhaWxhYmxlIGludGVycnVwdCIpOwotCi0gIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgotICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiZmxvYXRpbmctcG9pbnQgdW5hdmFpbGFibGUgaW50ZXJydXB0IC0gY2lhPTB4JWx4XG4iLAotCQkJICAgICAodW5zaWduZWQgbG9uZyljaWEpKTsKLSAgICBjaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIDB4MDA4MDAsIDAsIDAsIDAsIDApOwotICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKTsKLQotICBkZWZhdWx0OgotICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGZsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlX2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKLQotICB9Ci19Ci0KLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkKLXN5c3RlbV9jYWxsX2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgic3lzdGVtLWNhbGwgaW50ZXJydXB0IC0gY2lhPTB4JWx4XG4iLCAodW5zaWduZWQgbG9uZyljaWEpKTsKLQotICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKLQotICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6Ci0gIGNhc2UgVklSVFVBTF9FTlZJUk9OTUVOVDoKLSAgICBvc19lbXVsX3N5c3RlbV9jYWxsKHByb2Nlc3NvciwgY2lhKTsKLSAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSs0KTsKLQotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKLSAgICBjaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWErNCwgMHgwMGMwMCwgMCwgMCwgMCwgMCk7Ci0gICAgY3B1X3Jlc3RhcnQocHJvY2Vzc29yLCBjaWEpOwotCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gc3lzdGVtX2NhbGxfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOwotCi0gIH0KLX0KLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkKLWZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JCQkJdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9FTlZJUk9OTUVOVCkgewotCi0gIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKLSAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgotICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgImZsb2F0aW5nLXBvaW50IGFzc2lzdCBpbnRlcnJ1cHQiKTsKLQotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKLSAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoImZsb2F0aW5nLXBvaW50IGFzc2lzdCBpbnRlcnJ1cHQgLSBjaWE9MHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWNpYSkpOwotICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgMHgwMGUwMCwgMCwgMCwgMCwgMCk7Ci0gICAgY3B1X3Jlc3RhcnQocHJvY2Vzc29yLCBjaWEpOwotCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKLQotICB9Ci19Ci0KLQotCi0vKiBoYW5kbGUgYW4gZXh0ZXJuYWxseSBnZW5lcmF0ZWQgZXZlbnQgb3IgYW4gaW50ZXJydXB0IHRoYXQgaGFzIGp1c3QKLSAgIGJlZW4gZW5hYmxlZCB0aHJvdWdoIGNoYW5nZXMgdG8gdGhlIE1TUi4gKi8KLQotU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpCi1kZWxpdmVyX2hhcmR3YXJlX2ludGVycnVwdCh2b2lkICpkYXRhKQotewotICBjcHUgKnByb2Nlc3NvciA9IChjcHUqKWRhdGE7Ci0gIGludGVycnVwdHMgKmludHMgPSBjcHVfaW50ZXJydXB0cyhwcm9jZXNzb3IpOwotICBpbnRzLT5kZWxpdmVyeV9zY2hlZHVsZWQgPSBOVUxMOwotICBpZiAoKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgKG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8wCi0JCQkJCXwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzEpKQotICAgICAgJiYgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHNjciAmIGZwc2NyX2ZleCkgewotICAgIG1zcmVnIHNycjFfc2V0ID0gc3JyMV9mbG9hdGluZ19wb2ludF9lbmFibGVkIHwgc3JyMV9zdWJzZXF1ZW50X2luc3RydWN0aW9uOwotICAgIHVuc2lnbmVkX3dvcmQgY2lhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTsKLSAgICB1bnNpZ25lZF93b3JkIG5pYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsCi0JCQkJCSAgICAgIGNpYSwgMHgwMDcwMCwgMCwgMCwgMCwgc3JyMV9zZXQpOwotICAgIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKLSAgfQotICBlbHNlIGlmIChjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPm1zciAmIG1zcl9leHRlcm5hbF9pbnRlcnJ1cHRfZW5hYmxlKSB7Ci0gICAgLyogZXh0ZXJuYWwgaW50ZXJydXB0cyBoYXZlIGEgaGlnaCBwcmlvcml0eSBhbmQgcmVtYWluIHBlbmRpbmcgKi8KLSAgICBpZiAoaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICYgZXh0ZXJuYWxfaW50ZXJydXB0X3BlbmRpbmcpIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgbmlhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwKLQkJCQkJCWNpYSwgMHgwMDUwMCwgMCwgMCwgMCwgMCk7Ci0gICAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoImV4dGVybmFsIGludGVycnVwdCAtIGNpYT0weCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpY2lhKSk7Ci0gICAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIG5pYSk7Ci0gICAgfQotICAgIC8qIGRlY3JlbWVudGVyIGludGVycnVwdHMgaGF2ZSBhIGxvd2VyIHByaW9yaXR5IGFuZCBhcmUgb25jZSBvbmx5ICovCi0gICAgZWxzZSBpZiAoaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICYgZGVjcmVtZW50ZXJfaW50ZXJydXB0X3BlbmRpbmcpIHsKLSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTsKLSAgICAgIHVuc2lnbmVkX3dvcmQgbmlhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwKLQkJCQkJCWNpYSwgMHgwMDkwMCwgMCwgMCwgMCwgMCk7Ci0gICAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoImRlY3JlbWVudGVyIGludGVycnVwdCAtIGNpYSAweCVseCwgdGltZSAlbGRcbiIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWV2ZW50X3F1ZXVlX3RpbWUocHNpbV9ldmVudF9xdWV1ZShjcHVfc3lzdGVtKHByb2Nlc3NvcikpKQotCQkJICAgICAgICkpOwotICAgICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBuaWEpOwotICAgICAgaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICY9IH5kZWNyZW1lbnRlcl9pbnRlcnJ1cHRfcGVuZGluZzsKLSAgICB9Ci0gIH0KLX0KLQotU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpCi1zY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkoY3B1ICpwcm9jZXNzb3IpIAotewotICBpbnRlcnJ1cHRzICppbnRzID0gY3B1X2ludGVycnVwdHMocHJvY2Vzc29yKTsKLSAgaWYgKGludHMtPmRlbGl2ZXJ5X3NjaGVkdWxlZCA9PSBOVUxMKSB7Ci0gICAgaW50cy0+ZGVsaXZlcnlfc2NoZWR1bGVkID0KLSAgICAgIGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHBzaW1fZXZlbnRfcXVldWUoY3B1X3N5c3RlbShwcm9jZXNzb3IpKSwKLQkJCSAgIDAsIGRlbGl2ZXJfaGFyZHdhcmVfaW50ZXJydXB0LCBwcm9jZXNzb3IpOwotICB9Ci19Ci0KLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkKLWNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKGNwdSAqcHJvY2Vzc29yKQotewotICBpZiAoKChjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPm1zciAmIChtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMAotCQkJCQkgfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSkpCi0gICAgICAgJiYgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHNjciAmIGZwc2NyX2ZleCkKLSAgICAgIHx8ICgoY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgJiBtc3JfZXh0ZXJuYWxfaW50ZXJydXB0X2VuYWJsZSkKLQkgICYmIChjcHVfaW50ZXJydXB0cyhwcm9jZXNzb3IpLT5wZW5kaW5nX2ludGVycnVwdHMpKSkKLSAgICBzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKLX0KLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkKLWRlY3JlbWVudGVyX2ludGVycnVwdChjcHUgKnByb2Nlc3NvcikKLXsKLSAgaW50ZXJydXB0cyAqaW50cyA9IGNwdV9pbnRlcnJ1cHRzKHByb2Nlc3Nvcik7Ci0gIGludHMtPnBlbmRpbmdfaW50ZXJydXB0cyB8PSBkZWNyZW1lbnRlcl9pbnRlcnJ1cHRfcGVuZGluZzsKLSAgaWYgKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUpIHsKLSAgICBzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKLSAgfQotfQotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKQotZXh0ZXJuYWxfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAotCQkgICBpbnQgaXNfYXNzZXJ0ZWQpCi17Ci0gIGludGVycnVwdHMgKmludHMgPSBjcHVfaW50ZXJydXB0cyhwcm9jZXNzb3IpOwotICBpZiAoaXNfYXNzZXJ0ZWQpIHsKLSAgICBpZiAoIWludHMtPnBlbmRpbmdfaW50ZXJydXB0cyAmIGV4dGVybmFsX2ludGVycnVwdF9wZW5kaW5nKSB7Ci0gICAgICBpbnRzLT5wZW5kaW5nX2ludGVycnVwdHMgfD0gZXh0ZXJuYWxfaW50ZXJydXB0X3BlbmRpbmc7Ci0gICAgICBpZiAoY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgJiBtc3JfZXh0ZXJuYWxfaW50ZXJydXB0X2VuYWJsZSkKLQlzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmVuJ3QgbWlzc2VkIG91dCBvbiBhIGNoYW5jZSB0byBkZWxpdmVyIGFuCi0gICAgICAgICBpbnRlcnJ1cHQgKi8KLSAgICAgIEFTU0VSVCghKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUpKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICY9IH5leHRlcm5hbF9pbnRlcnJ1cHRfcGVuZGluZzsKLSAgfQotfQotCi0jZW5kaWYgLyogX0lOVEVSUlVQVFNfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaW50ZXJydXB0cy5oIGIvc2ltL3BwYy9pbnRlcnJ1cHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDQ3YTguLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9pbnRlcnJ1cHRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfSU5URVJSVVBUU19IXwotI2RlZmluZSBfSU5URVJSVVBUU19IXwotCi0vKiBJbnRlcnJ1cHRzOgotCi0gICBUaGUgY29kZSBiZWxvdyBoYW5kbGVzIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgaW50ZXJydXB0cy4KLSAgIFN5bmNocm9ub3VzIGFuZCBBc3luY2hyb25vdXMuCi0KLSAgIFN5bmNocm9ub3VzOgotCi0gICBJbnRlcnJ1cHRzIHRoYXQgbXVzdCBpbW1lZGlhdGVseSBmb3JjZSBlaXRoZXIgYW4gYWJvcnQgb3IgcmVzdGFydAotICAgb2YgYSBjdXJyZW50IGluc3RydWN0aW9uIGFyZSBpbXBsZW1lbnRlZCBieSBmb3JjaW5nIGFuIGluc3RydWN0aW9uCi0gICByZXN0YXJ0LiAob3IgdG8gcHV0IGl0IGFub3RoZXIgd2F5LCBsb25nIGp1bXApLiAgSW4gbG9va2luZyBhdCB0aGUKLSAgIGNvZGUgaXQgbWF5IG9jY3VyZSB0byB5b3UgdGhhdCwgZm9yIHNvbWUgaW50ZXJydXB0cywgdGhleSBjb3VsZAotICAgcmV0dXJuIGluc3RlYWQgb2YgcmVzdGFydGluZyB0aGUgY3B1IChlZyBzeXN0ZW1fY2FsbCkuICBXaGlsZSB0cnVlCi0gICAoaXQgb25jZSB3YXMgbGlrZSB0aGF0KSBJJ3ZlIGRlY2lkZWQgdG8gbWFrZSB0aGUgYmVoYXZvdXIgb2YgYWxsCi0gICBpbnRlcnJ1cHQgcm91dGluZXMgcm91Z2hseSBpZGVudGljYWwuCi0KLSAgIEJlY2F1c2UsIGEgY3B1J3MgcmVjb3JkZWQgc3RhdGUgKGllIHdoYXQgaXMgaW4gdGhlIGNwdSBzdHJ1Y3R1cmUpCi0gICBpcyBhbGxvd2VkIHRvIGxhZyBiZWhpbmQgdGhlIGNwdSdzIHRydWUgY3VycmVudCBzdGF0ZSAoZWcgUEMgbm90Ci0gICB1cGRhdGVkKSBzeWNucm9ub3VzIGludGVycnVwdCBoYW5kZXJzIGFyZSBwYXJhbWV0ZXJpemVkIHdpdGggdGhlCi0gICB0aGUgY3B1IGJlaW5nIGludGVycnVwdGVkIHNvIHRoYXQsIGFzIHBhcnQgb2YgbW9kZGVsaW5nIHRoZQotICAgaW50ZXJydXB0LCB0aGUgY3B1J3Mgc3RhdGUgY2FuIGJlIHVwZGF0ZWQuCi0KLSAgIEFzeW5jaHJvbm91czoKLQotICAgSW50ZXJydXB0cyBzdWNoIGFzIHJlc2V0IG9yIGV4dGVybmFsIGV4Y2VwdGlvbiBhcmUgZGVsaXZlcmVkIHVzaW5nCi0gICBtb3JlIG5vcm1hbCAocmV0dXJuaW5nKSBmdW5jdGlvbnMuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlc2UKLSAgIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIG91dCBzaWRlIG9mIHRoZSBub3JtYWwgcHJvY2Vzc29yIGV4ZWN1dGlvbgotICAgY3ljbGUuICovCi0KLQotLyogU29mdHdhcmUgZ2VuZXJhdGVkIGludGVycnVwdHMuCi0KLSAgIFRoZSBiZWxvdyBhcmUgZ2VuZXJhdGVkIGJ5IHNvZnR3YXJlIGRyaXZlbiBldmVudHMuICBGb3IgaW5zdGFuY2UsCi0gICBhbiBpbnZhbGlkIGluc3RydWN0aW9uIG9yIGFjY2VzcyAodmlydHVhbCBvciBwaHlzaWNhbCkgdG8gYW4KLSAgIGludmFsaWQgYWRkcmVzcyAqLwotCi10eXBlZGVmIGVudW0gewotICBkaXJlY3Rfc3RvcmVfc3RvcmFnZV9pbnRlcnJ1cHQsCi0gIGhhc2hfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdCwKLSAgcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQsCi0gIGVhcndheF92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQsCi0gIHNlZ21lbnRfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdCwKLSAgZWFyd2F4X2Rpc2FibGVkX3N0b3JhZ2VfaW50ZXJydXB0LAotICB2ZWFfc3RvcmFnZV9pbnRlcnJ1cHQsCi19IHN0b3JhZ2VfaW50ZXJydXB0X3JlYXNvbnM7Ci0KLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkgZGF0YV9zdG9yYWdlX2ludGVycnVwdAotKGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhLAotIHVuc2lnbmVkX3dvcmQgZWEsCi0gc3RvcmFnZV9pbnRlcnJ1cHRfcmVhc29ucyByZWFzb24sCi0gaW50IGlzX3N0b3JlKTsKLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkgaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSwKLSBzdG9yYWdlX2ludGVycnVwdF9yZWFzb25zIHJlYXNvbik7Ci0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpIGFsaWdubWVudF9pbnRlcnJ1cHQKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSwKLSB1bnNpZ25lZF93b3JkIHJhKTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgZmxvYXRpbmdfcG9pbnRfZW5hYmxlZF9wcm9ncmFtX2ludGVycnVwdCwKLSAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCwKLSAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCwKLSAgdHJhcF9wcm9ncmFtX2ludGVycnVwdCwKLSAgb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQsIC8qIHN1YnNldCBvZiBpbGxlZ2FsIGluc3RydWN0aW9uICovCi0gIG1wYzg2MGMwX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0LCAvKiBmd2QgYnIsIHRha2VuIGJ1dCBub3QgcHJlZGljdGVkLCBuZWFyIEVPIHBhZ2UgKi8KLSAgbnJfcHJvZ3JhbV9pbnRlcnJ1cHRfcmVhc29ucwotfSBwcm9ncmFtX2ludGVycnVwdF9yZWFzb25zOwotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKSBwcm9ncmFtX2ludGVycnVwdAotKGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhLAotIHByb2dyYW1faW50ZXJydXB0X3JlYXNvbnMgcmVhc29uKTsKLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkgZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGVfaW50ZXJydXB0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKSBzeXN0ZW1fY2FsbF9pbnRlcnJ1cHQKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpIGZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLUlOTElORV9JTlRFUlJVUFRTXAotKHZvaWQpIG1hY2hpbmVfY2hlY2tfaW50ZXJydXB0Ci0oY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi0vKiBIYXJkd2FyZSBnZW5lcmF0ZWQgaW50ZXJydXB0czoKLQotICAgVGhlc2UgYXN5bmNocm9ub3VzIGhhcmR3YXJlIGdlbmVyYXRlZCBpbnRlcnJ1cHRzIG1heSBiZSBjYWxsZWQgYXQKLSAgIGFueSB0aW1lLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgKHRoZSBpbnRlcnJ1cHRzKSBtb2R1bGUKLSAgIHRvIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGRlbGl2ZXJlZCBjb3JyZWN0bHkgKHdoZW4gcG9zc2libGUpLgotICAgVGhlIGRlbGl2ZXJ5IG9mIHRoZXNlIGludGVycnVwdHMgaXMgY29udHJvbGxlZCBieSB0aGUgTVNSJ3MKLSAgIGV4dGVybmFsIGludGVycnVwdCBlbmFibGUgYml0LiAgV2hlbiBldmVyIHRoZSBNU1IncyB2YWx1ZSBpcwotICAgY2hhbmdlZCwgdGhlIHByb2Nlc3NvciBtdXN0IGNhbGwgdGhlIGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKCkKLSAgIGZ1bmN0aW9uIGluIGNhc2UgZGVsaXZlcnkgaGFzIGJlZW4gbWFkZSBwb3NzaWJsZS4KLQotICAgZGVjcmVtZW50ZXJfaW50ZXJydXB0IGlzIGBlZGdlJyBzZW5zaXRpdmUuICBNdWx0aXBsZSBlZGdlcyBhcnJpdmluZwotICAgYmVmb3JlIHRoZSBmaXJzdCBlZGdlIGhhcyBiZWVuIGRlbGl2ZXJlZCByZXN1bHQgaW4gb25seSBvbmUKLSAgIGludGVycnVwdC4KLQotICAgZXh0ZXJuYWxfaW50ZXJydXB0IGlzIGBsZXZlbCcgc2Vuc2l0aXZlLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0Ci0gICB3aWxsIG9ubHkgYmUgZGVsaXZlcmVkIHdoZW4gdGhlIGV4dGVybmFsIGludGVycnVwdCBwb3J0IGlzCi0gICBgYXNzZXJ0ZWQnLiBXaGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlIGV4dGVybmFsIGludGVycnVwdAotICAgY2FuIGJlIGFzc2VydGVkIGFuZCB0aGVuIGRlLWFzc2VydGVkIHdpdGhvdXQgYW4gaW50ZXJydXB0Ci0gICBldmVudHVhbGx5IGJlaW5nIGRlbGl2ZXJlZC4gKi8KLQotZW51bSB7Ci0gIGV4dGVybmFsX2ludGVycnVwdF9wZW5kaW5nID0gMSwKLSAgZGVjcmVtZW50ZXJfaW50ZXJydXB0X3BlbmRpbmcgPSAyLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2ludGVycnVwdHMgewotICBldmVudF9lbnRyeV90YWcgZGVsaXZlcnlfc2NoZWR1bGVkOwotICBpbnQgcGVuZGluZ19pbnRlcnJ1cHRzOwotfSBpbnRlcnJ1cHRzOwotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKSBjaGVja19tYXNrZWRfaW50ZXJydXB0cwotKGNwdSAqcHJvY2Vzc29yKTsKLQotSU5MSU5FX0lOVEVSUlVQVFNcCi0odm9pZCkgZGVjcmVtZW50ZXJfaW50ZXJydXB0Ci0oY3B1ICpwcm9jZXNzb3IpOwotCi1JTkxJTkVfSU5URVJSVVBUU1wKLSh2b2lkKSBleHRlcm5hbF9pbnRlcnJ1cHQKLShjcHUgKnByb2Nlc3NvciwKLSBpbnQgaXNfYXNzZXJ0ZWQpOwotCi0jZW5kaWYgLyogX0lOVEVSUlVQVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtY2FjaGUuYyBiL3NpbS9wcGMvbGQtY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1MDEzZS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2xkLWNhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAibGQtY2FjaGUuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLQotZW51bSB7Ci0gIGNhX3R5cGUsCi0gIGNhX2ZpZWxkX25hbWUsCi0gIGNhX2Rlcml2ZWRfbmFtZSwKLSAgY2FfdHlwZV9kZWYsCi0gIGNhX2V4cHJlc3Npb24sCi0gIG5yX2NhY2hlX3J1bGVfZmllbGRzLAotfTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGNhY2hlX3R5cGVfbWFwW10gPSB7Ci0gIHsgImNhY2hlIiwgY2FjaGVfdmFsdWUgfSwKLSAgeyAiY29tcHV0ZSIsIGNvbXB1dGVfdmFsdWUgfSwKLSAgeyAic2NyYXRjaCIsIHNjcmF0Y2hfdmFsdWUgfSwKLSAgeyBOVUxMLCAwIH0sCi19OwotCi0KLWNhY2hlX3RhYmxlICoKLWxvYWRfY2FjaGVfdGFibGUoY2hhciAqZmlsZV9uYW1lLAotCQkgaW50IGhpX2JpdF9ucikKLXsKLSAgdGFibGUgKmZpbGUgPSB0YWJsZV9vcGVuKGZpbGVfbmFtZSwgbnJfY2FjaGVfcnVsZV9maWVsZHMsIDApOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIGNhY2hlX3RhYmxlICp0YWJsZSA9IE5VTEw7Ci0gIGNhY2hlX3RhYmxlICoqY3Vycl9ydWxlID0gJnRhYmxlOwotICB3aGlsZSAoKGVudHJ5ID0gdGFibGVfZW50cnlfcmVhZChmaWxlKSkgIT0gTlVMTCkgewotICAgIGNhY2hlX3RhYmxlICpuZXdfcnVsZSA9IFpBTExPQyhjYWNoZV90YWJsZSk7Ci0gICAgbmV3X3J1bGUtPnR5cGUgPSBuYW1lMmkoZW50cnktPmZpZWxkc1tjYV90eXBlXSwgY2FjaGVfdHlwZV9tYXApOwotICAgIG5ld19ydWxlLT5maWVsZF9uYW1lID0gZW50cnktPmZpZWxkc1tjYV9maWVsZF9uYW1lXTsKLSAgICBuZXdfcnVsZS0+ZGVyaXZlZF9uYW1lID0gZW50cnktPmZpZWxkc1tjYV9kZXJpdmVkX25hbWVdOwotICAgIG5ld19ydWxlLT50eXBlX2RlZiA9IChzdHJsZW4oZW50cnktPmZpZWxkc1tjYV90eXBlX2RlZl0pCi0JCQkgID8gZW50cnktPmZpZWxkc1tjYV90eXBlX2RlZl0KLQkJCSAgOiBOVUxMKTsKLSAgICBuZXdfcnVsZS0+ZXhwcmVzc2lvbiA9IChzdHJsZW4oZW50cnktPmZpZWxkc1tjYV9leHByZXNzaW9uXSkgPiAwCi0JCQkgICAgPyBlbnRyeS0+ZmllbGRzW2NhX2V4cHJlc3Npb25dCi0JCQkgICAgOiBOVUxMKTsKLSAgICBuZXdfcnVsZS0+ZmlsZV9lbnRyeSA9IGVudHJ5OwotICAgICpjdXJyX3J1bGUgPSBuZXdfcnVsZTsKLSAgICBjdXJyX3J1bGUgPSAmbmV3X3J1bGUtPm5leHQ7Ci0gIH0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0KLQotI2lmZGVmIE1BSU4KLQotc3RhdGljIHZvaWQKLWR1bXBfY2FjaGVfcnVsZShjYWNoZV90YWJsZSogcnVsZSwKLQkJaW50IGluZGVudCkKLXsKLSAgZHVtcGYoaW5kZW50LCAiKChjYWNoZV90YWJsZSopMHgleFxuIiwgcnVsZSk7Ci0gIGR1bXBmKGluZGVudCwgIiAodHlwZSAlcylcbiIsIGkybmFtZShydWxlLT50eXBlLCBjYWNoZV90eXBlX21hcCkpOwotICBkdW1wZihpbmRlbnQsICIgKGZpZWxkX25hbWUgXCIlc1wiKVxuIiwgcnVsZS0+ZmllbGRfbmFtZSk7Ci0gIGR1bXBmKGluZGVudCwgIiAoZGVyaXZlZF9uYW1lIFwiJXNcIilcbiIsIHJ1bGUtPmRlcml2ZWRfbmFtZSk7Ci0gIGR1bXBmKGluZGVudCwgIiAodHlwZS1kZWYgXCIlc1wiKVxuIiwgcnVsZS0+dHlwZV9kZWYpOwotICBkdW1wZihpbmRlbnQsICIgKGV4cHJlc3Npb24gXCIlc1wiKVxuIiwgcnVsZS0+ZXhwcmVzc2lvbik7Ci0gIGR1bXBmKGluZGVudCwgIiAobmV4dCAweCV4KVxuIiwgcnVsZS0+bmV4dCk7Ci0gIGR1bXBmKGluZGVudCwgIiApXG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZHVtcF9jYWNoZV9ydWxlcyhjYWNoZV90YWJsZSogcnVsZSwKLQkJIGludCBpbmRlbnQpCi17Ci0gIHdoaWxlIChydWxlKSB7Ci0gICAgZHVtcF9jYWNoZV9ydWxlKHJ1bGUsIGluZGVudCk7Ci0gICAgcnVsZSA9IHJ1bGUtPm5leHQ7Ci0gIH0KLX0KLQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBjYWNoZV90YWJsZSAqcnVsZXM7Ci0gIGlmIChhcmdjICE9IDMpCi0gICAgZXJyb3IoIlVzYWdlOiBjYWNoZSA8Y2FjaGUtZmlsZT4gPGhpLWJpdC1ucj5cbiIpOwotICBydWxlcyA9IGxvYWRfY2FjaGVfdGFibGUoYXJndlsxXSwgYTJpKGFyZ3ZbMl0pKTsKLSAgZHVtcF9jYWNoZV9ydWxlcyhydWxlcywgMCk7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWNhY2hlLmggYi9zaW0vcHBjL2xkLWNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTM5NTAuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9sZC1jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIEluc3RydWN0aW9uIHVucGFja2luZzoKLQotICAgT25jZSB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZGVjb2RlZCwgdGhlIHJlZ2lzdGVyIChhbmQgb3RoZXIpCi0gICBmaWVsZHMgd2l0aGluIHRoZSBpbnN0cnVjdGlvbiBuZWVkIHRvIGJlIGV4dHJhY3RlZC4KLQotICAgVGhlIHRhYmxlIHRoYXQgZm9sbG93cyBkZXRlcm1pbmVzIGhvdyBlYWNoIGZpZWxkIHNob3VsZCBiZSB0cmVhdGVkLgotICAgSW1wb3J0YW50bHkgaXQgY29uc2lkZXJzIHRoZSBjYXNlIHdoZXJlIHRoZSBleHRyYWN0ZWQgZmllbGQgaXMgdG8KLSAgIGJlIHVzZWQgaW1tZWRpYXRseSBvciBzdG9yZWQgaW4gYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCi0KLSAgIDx0eXBlPgotCi0gICBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIHRoZSBjYWNoZSBlbnRyeS4gIElmIGEgY2FjaGUgaXMgdG8gYmUKLSAgIHVzZWQuICBTQ1JBVENIIGFuZCBDQUNIRSB2YWx1ZXMgYXJlIGRlZmluZWQgd2hlbiBhIGNhY2hlIGVudHJ5IGlzCi0gICBiZWluZyBmaWxsZWQgd2hpbGUgQ0FDSEUgYW5kIENPTVBVVEUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHRoZQotICAgc2VtYW50aWMgY29kZS4KLQotICAgWmVybyBtYXJrcyB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gIE1vcmUgaW1wb3J0YW50bHkgMS4gaW5kaWNhdGVzCi0gICB0aGF0IHRoZSBlbnRyeSBpcyB2YWxpZCBhbmQgY2FuIGJlIGNhY2hlZC4gMi4gaW5kaWNhdGVzIHRoYXQgdGhhdAotICAgdGhlIGVudHJ5IGlzIHZhbGlkIGJ1dCBjYW4gbm90IGJlIGNhY2hlZC4KLQotICAgPGZpZWxkX25hbWU+Ci0KLSAgIFRoZSBmaWVsZCBuYW1lIGFzIGdpdmVuIGluIHRoZSBpbnN0cnVjdGlvbiBzcGVjLgotCi0gICA8ZGVyaXZlZF9uYW1lPgotCi0gICBBIG5ldyBuYW1lIGZvciA8ZmllbGRfbmFtZT4gb25jZSBpdCBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUKLSAgIGluc3RydWN0aW9uIChhbmQgcG9zc2libHkgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSkuCi0KLSAgIDx0eXBlPgotCi0gICBTdHJpbmcgc3BlY2lmeWluZyB0aGUgc3RvcmFnZSB0eXBlIGZvciA8bmV3X25hbWU+ICh0aGUgZXh0cmFjdGVkCi0gICBmaWVsZD4uCi0KLSAgIDxleHByZXNzaW9uPgotCi0gICBTcGVjaWZpZXMgaG93IHRvIGdldCA8bmV3X25hbWU+IGZyb20gPG9sZF9uYW1lPi4gIElmIG51bGwsIG9sZCBhbmQKLSAgIG5ldyBuYW1lIGhhZCBiZXR0ZXIgYmUgdGhlIHNhbWUuICovCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgc2NyYXRjaF92YWx1ZSwKLSAgY2FjaGVfdmFsdWUsCi0gIGNvbXB1dGVfdmFsdWUsCi19IGNhY2hlX3J1bGVfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2NhY2hlX3RhYmxlIGNhY2hlX3RhYmxlOwotc3RydWN0IF9jYWNoZV90YWJsZSB7Ci0gIGNhY2hlX3J1bGVfdHlwZSB0eXBlOwotICBjaGFyICpmaWVsZF9uYW1lOwotICBjaGFyICpkZXJpdmVkX25hbWU7Ci0gIGNoYXIgKnR5cGVfZGVmOwotICBjaGFyICpleHByZXNzaW9uOwotICB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeTsKLSAgY2FjaGVfdGFibGUgKm5leHQ7Ci19OwotCi0KLWV4dGVybiBjYWNoZV90YWJsZSAqbG9hZF9jYWNoZV90YWJsZQotKGNoYXIgKmZpbGVfbmFtZSwKLSBpbnQgaGlfYml0X25yKTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtZGVjb2RlLmMgYi9zaW0vcHBjL2xkLWRlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY0OTYwLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbGQtZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIGxvYWQgdGhlIG9wY29kZSBzdGF0IHN0cnVjdHVyZSAqLwotCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLSNpbmNsdWRlICJsZC1kZWNvZGUuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLWVudW0gewotICBvcF9vcHRpb25zLAotICBvcF9maXJzdCwKLSAgb3BfbGFzdCwKLSAgb3BfZm9yY2VfZmlyc3QsCi0gIG9wX2ZvcmNlX2xhc3QsCi0gIG9wX2ZvcmNlX2V4cGFuc2lvbiwKLSAgb3Bfc3BlY2lhbF9tYXNrLAotICBvcF9zcGVjaWFsX3ZhbHVlLAotICBvcF9zcGVjaWFsX2NvbnN0YW50LAotICBucl9kZWNvZGVfZmllbGRzLAotfTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV90eXBlX21hcFtdID0gewotICB7ICJub3JtYWwiLCBub3JtYWxfZGVjb2RlX3J1bGUgfSwKLSAgeyAiZXhwYW5kLWZvcmNlZCIsIGV4cGFuZF9mb3JjZWRfcnVsZSB9LAotICB7ICJib29sZWFuIiwgYm9vbGVhbl9ydWxlIH0sCi0gIHsgTlVMTCwgbm9ybWFsX2RlY29kZV9ydWxlIH0sCi19OwotCi1zdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2dlbl9tYXBbXSA9IHsKLSAgeyAiYXJyYXkiLCBhcnJheV9nZW4gfSwKLSAgeyAic3dpdGNoIiwgc3dpdGNoX2dlbiB9LAotICB7ICJwYWRkZWQtc3dpdGNoIiwgcGFkZGVkX3N3aXRjaF9nZW4gfSwKLSAgeyAiZ290by1zd2l0Y2giLCBnb3RvX3N3aXRjaF9nZW4gfSwKLSAgeyBOVUxMLCAtMSB9LAotfTsKLQotc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9zbGFzaF9tYXBbXSA9IHsKLSAgeyAidmFyaWFibGUtc2xhc2giLCAwIH0sCi0gIHsgImNvbnN0YW50LXNsYXNoIiwgMSB9LAotICB7IE5VTEwgfSwKLX07Ci0KLQotc3RhdGljIGRlY29kZV9nZW5fdHlwZSBvdmVycmlkaW5nX2dlbl90eXBlID0gaW52YWxpZF9nZW47Ci0KLXZvaWQKLWZvcmNlX2RlY29kZV9nZW5fdHlwZShjb25zdCBjaGFyICp0eXBlKQotewotICBvdmVycmlkaW5nX2dlbl90eXBlID0gbmFtZTJpKHR5cGUsIGRlY29kZV9nZW5fbWFwKTsKLX0KLQotCi1kZWNvZGVfdGFibGUgKgotbG9hZF9kZWNvZGVfdGFibGUoY2hhciAqZmlsZV9uYW1lLAotCQkgIGludCBoaV9iaXRfbnIpCi17Ci0gIHRhYmxlICpmaWxlID0gdGFibGVfb3BlbihmaWxlX25hbWUsIG5yX2RlY29kZV9maWVsZHMsIDApOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0gIGRlY29kZV90YWJsZSAqdGFibGUgPSBOVUxMOwotICBkZWNvZGVfdGFibGUgKipjdXJyX3J1bGUgPSAmdGFibGU7Ci0gIHdoaWxlICgoZW50cnkgPSB0YWJsZV9lbnRyeV9yZWFkKGZpbGUpKSAhPSBOVUxMKSB7Ci0gICAgZGVjb2RlX3RhYmxlICpuZXdfcnVsZSA9IFpBTExPQyhkZWNvZGVfdGFibGUpOwotICAgIG5ld19ydWxlLT50eXBlID0gbmFtZTJpKGVudHJ5LT5maWVsZHNbb3Bfb3B0aW9uc10sIGRlY29kZV90eXBlX21hcCk7Ci0gICAgbmV3X3J1bGUtPmdlbiA9IChvdmVycmlkaW5nX2dlbl90eXBlICE9IGludmFsaWRfZ2VuCi0JCSAgICAgPyBvdmVycmlkaW5nX2dlbl90eXBlCi0JCSAgICAgOiBuYW1lMmkoZW50cnktPmZpZWxkc1tvcF9vcHRpb25zXSwgZGVjb2RlX2dlbl9tYXApKTsKLSAgICBuZXdfcnVsZS0+Zm9yY2Vfc2xhc2ggPSBuYW1lMmkoZW50cnktPmZpZWxkc1tvcF9vcHRpb25zXSwgZGVjb2RlX3NsYXNoX21hcCk7Ci0gICAgbmV3X3J1bGUtPmZpcnN0ID0gdGFyZ2V0X2EyaShoaV9iaXRfbnIsIGVudHJ5LT5maWVsZHNbb3BfZmlyc3RdKTsKLSAgICBuZXdfcnVsZS0+bGFzdCA9IHRhcmdldF9hMmkoaGlfYml0X25yLCBlbnRyeS0+ZmllbGRzW29wX2xhc3RdKTsKLSAgICBuZXdfcnVsZS0+Zm9yY2VfZmlyc3QgPSAoc3RybGVuKGVudHJ5LT5maWVsZHNbb3BfZm9yY2VfZmlyc3RdKQotCQkJICAgICA/IHRhcmdldF9hMmkoaGlfYml0X25yLCBlbnRyeS0+ZmllbGRzW29wX2ZvcmNlX2ZpcnN0XSkKLQkJCSAgICAgOiBuZXdfcnVsZS0+bGFzdCArIDEpOwotICAgIG5ld19ydWxlLT5mb3JjZV9sYXN0ID0gKHN0cmxlbihlbnRyeS0+ZmllbGRzW29wX2ZvcmNlX2xhc3RdKQotCQkJICAgID8gdGFyZ2V0X2EyaShoaV9iaXRfbnIsIGVudHJ5LT5maWVsZHNbb3BfZm9yY2VfbGFzdF0pCi0JCQkgICAgOiBuZXdfcnVsZS0+Zmlyc3QgLSAxKTsKLSAgICBuZXdfcnVsZS0+Zm9yY2VfZXhwYW5zaW9uID0gZW50cnktPmZpZWxkc1tvcF9mb3JjZV9leHBhbnNpb25dOwotICAgIG5ld19ydWxlLT5zcGVjaWFsX21hc2sgPSBhMmkoZW50cnktPmZpZWxkc1tvcF9zcGVjaWFsX21hc2tdKTsKLSAgICBuZXdfcnVsZS0+c3BlY2lhbF92YWx1ZSA9IGEyaShlbnRyeS0+ZmllbGRzW29wX3NwZWNpYWxfdmFsdWVdKTsKLSAgICBuZXdfcnVsZS0+c3BlY2lhbF9jb25zdGFudCA9IGEyaShlbnRyeS0+ZmllbGRzW29wX3NwZWNpYWxfY29uc3RhbnRdKTsKLSAgICAqY3Vycl9ydWxlID0gbmV3X3J1bGU7Ci0gICAgY3Vycl9ydWxlID0gJm5ld19ydWxlLT5uZXh0OwotICB9Ci0gIHJldHVybiB0YWJsZTsKLX0KLQotICAKLXZvaWQKLWR1bXBfZGVjb2RlX3J1bGUoZGVjb2RlX3RhYmxlICpydWxlLAotCQkgaW50IGluZGVudCkKLXsKLSAgZHVtcGYoaW5kZW50LCAiKChkZWNvZGVfdGFibGUqKSVwXG4iLCBydWxlKTsKLSAgaWYgKHJ1bGUpIHsKLSAgICBkdW1wZihpbmRlbnQsICIgKHR5cGUgJXMpXG4iLCBpMm5hbWUocnVsZS0+dHlwZSwgZGVjb2RlX3R5cGVfbWFwKSk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIChnZW4gJXMpXG4iLCBpMm5hbWUocnVsZS0+Z2VuLCBkZWNvZGVfZ2VuX21hcCkpOwotICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2Vfc2xhc2ggJWQpXG4iLCBydWxlLT5mb3JjZV9zbGFzaCk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIChmaXJzdCAlZClcbiIsIHJ1bGUtPmZpcnN0KTsKLSAgICBkdW1wZihpbmRlbnQsICIgKGxhc3QgJWQpXG4iLCBydWxlLT5sYXN0KTsKLSAgICBkdW1wZihpbmRlbnQsICIgKGZvcmNlX2ZpcnN0ICVkKVxuIiwgcnVsZS0+Zm9yY2VfZmlyc3QpOwotICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2VfbGFzdCAlZClcbiIsIHJ1bGUtPmZvcmNlX2xhc3QpOwotICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2VfZXhwYW5zaW9uIFwiJXNcIilcbiIsIHJ1bGUtPmZvcmNlX2V4cGFuc2lvbik7Ci0gICAgZHVtcGYoaW5kZW50LCAiIChzcGVjaWFsX21hc2sgMHgleClcbiIsIHJ1bGUtPnNwZWNpYWxfbWFzayk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIChzcGVjaWFsX3ZhbHVlIDB4JXgpXG4iLCBydWxlLT5zcGVjaWFsX3ZhbHVlKTsKLSAgICBkdW1wZihpbmRlbnQsICIgKHNwZWNpYWxfY29uc3RhbnQgMHgleClcbiIsIHJ1bGUtPnNwZWNpYWxfY29uc3RhbnQpOwotICAgIGR1bXBmKGluZGVudCwgIiAobmV4dCAweCV4KVxuIiwgcnVsZS0+bmV4dCk7Ci0gIH0KLSAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotfQotCi0KLSNpZmRlZiBNQUlOCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2RlY29kZV9ydWxlcyhkZWNvZGVfdGFibGUgKnJ1bGUsCi0JCSAgaW50IGluZGVudCkKLXsKLSAgd2hpbGUgKHJ1bGUpIHsKLSAgICBkdW1wX2RlY29kZV9ydWxlKHJ1bGUsIGluZGVudCk7Ci0gICAgcnVsZSA9IHJ1bGUtPm5leHQ7Ci0gIH0KLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgZGVjb2RlX3RhYmxlICpydWxlczsKLSAgaWYgKGFyZ2MgIT0gMykKLSAgICBlcnJvcigiVXNhZ2U6IGRlY29kZSA8ZGVjb2RlLWZpbGU+IDxoaS1iaXQtbnI+XG4iKTsKLSAgcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZShhcmd2WzFdLCBhMmkoYXJndlsyXSkpOwotICBkdW1wX2RlY29kZV9ydWxlcyhydWxlcywgMCk7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWRlY29kZS5oIGIvc2ltL3BwYy9sZC1kZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyMzE4MS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL2xkLWRlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLS8qIEluc3RydWN0aW9uIGRlY29kZSB0YWJsZToKLQotICAgPG9wdGlvbnM+OjxmaXJzdD46PGxhc3Q+Ojxmb3JjZS1maXJzdD46PGZvcmNlLWxhc3Q+Ojxmb3JjZS1leHBhbmQ+OjxzcGVjaWFsPi4uLgotCi0KLQotICAgSWdub3JlIHRoZSBiZWxvdzoKLQotCi0gICBUaGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIHRhYmxlIGNvbnRhaW5zIHJ1bGVzIHRoYXQgZGljdGF0ZSBob3cgaWdlbgotICAgaXMgZ29pbmcgdG8gZmlyc3RseSBicmVhayBkb3duIHRoZSBvcGNvZGUgdGFibGUgYW5kIHNlY29uZGx5Ci0KLSAgIFRoZSB0YWJsZSB0aGF0IGZvbGxvd3MgaXMgdXNlZCBieSBnZW4gdG8gY29uc3RydWN0IGEgZGVjaXNpb24gdHJlZQotICAgdGhhdCBjYW4gaWRlbnRpZnkgZWFjaCBwb3NzaWJsZSBpbnN0cnVjdGlvbi4gIEdlbiB0aGVuIG91dHB1dHMgdGhpcwotICAgZGVjaXNpb24gdHJlZSBhcyAoYWNjb3JkaW5nIHRvIGNvbmZpZykgYSB0YWJsZSBvciBzd2l0Y2ggc3RhdGVtZW50Ci0gICBhcyB0aGUgZnVuY3Rpb24gaWRlY29kZS4KLQotICAgSW4gcGFyYWxsZWwgdG8gdGhpcywgYXMgbWVudGlvbmVkIGFib3ZlLCBXSVRIX0VYUEFOREVEX1NFTUFOVElDUwotICAgZGV0ZXJtaW5lcyBvZiB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIHRoZW1zZWx2ZXMgc2hvdWxkIGJlIGV4cGFuZGVkCi0gICBpbiBhIHNpbWlsYXIgd2F5LgotCi0gICA8Zmlyc3Q+Ci0gICA8bGFzdD4KLQotICAgUmFuZ2Ugb2YgYml0cyAod2l0aGluIHRoZSBpbnN0cnVjdGlvbikgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yCi0gICBhbiBpbnN0cnVjdGlvbiBmaWVsZC4gIFdpdGhpbiBzdWNoIHJhbmdlcywgZ2VuIGxvb2tzIGZvciBvcGNvZGVzCi0gICAoY29uc3RhbnRzKSwgcmVnaXN0ZXJzIChzdHJpbmdzKSBhbmQgcmVzZXJ2ZWQgYml0cyAoc2xhc2gpIGFuZAotICAgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyB0aGF0IGZvbGxvd3MgaW5jbHVkZXMgb3IgZXhjbHVkZXMgdGhlbSBmcm9tCi0gICBhIHBvc3NpYmxlIGluc3RydWN0aW9uIGZpZWxkLgotCi0gICA8Zm9yY2VfZmlyc3Q+Ci0gICA8Zm9yY2VfbGFzdD4KLQotICAgSWYgYW4gaW5zdHJ1Y3Rpb24gZmllbGQgd2FzIGZvdW5kLCBlbmxhcmdlIHRoZSBmaWVsZCBzaXplIHNvIHRoYXQKLSAgIGl0IGlzIGZvcmNlZCB0byBhdCBsZWFzdCBpbmNsdWRlIGJpdHMgc3RhcnRpbmcgZnJvbSA8Zm9yY2VfZmlyc3Q+Ci0gICAoPGZvcmNlX2xhc3Q+KS4gIFRvIHN0b3AgdGhpcyBvY2N1cmluZywgdXNlIDxmb3JjZV9maXJzdD4gPSA8bGFzdD4KLSAgICsgMSBhbmQgPGZvcmNlX2xhc3Q+ID0gPGZpcnN0PiAtIDEuCi0KLSAgIDxmb3JjZV9zbGFzaD4KLQotICAgVHJlYXQgYC8nIGZpZWxkcyBhcyBhIGNvbnN0YW50IGluc3RlYWQgb2YgdmFyaWFibGUgd2hlbiBsb29raW5nIGZvcgotICAgYW4gaW5zdHJ1Y3Rpb24gZmllbGQuCi0KLSAgIDxmb3JjZV9leHBhbnNpb24+Ci0KLSAgIFRyZWF0IGFueSBjb250YWluZWQgcmVnaXN0ZXIgKHN0cmluZykgZmllbGRzIGFzIGNvbnN0YW50IHdoZW4KLSAgIGRldGVybWluaW5nIHRoZSBpbnN0cnVjdGlvbiBmaWVsZC4gIEZvciB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIChhbmQKLSAgIGNvbnRyb2xlZCBieSBJREVDT0RFX0VYUEFORF9TRU1BTlRJQ1MpIHRoaXMgZm9yY2VzIHRoZSBleHBhbnNpb24gb2YKLSAgIHdoYXQgd291bGQgb3RoZXJ3aXplIGJlIG5vbiBjb25zdGFudCBiaXRzIG9mIGFuIGluc3RydWN0aW9uLgotCi0gICA8dXNlX3N3aXRjaD4KLQotICAgU2hvdWxkIHRoaXMgdGFibGUgYmUgZXhwYW5kZWQgdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50ICh2YWwgMSkgYW5kCi0gICBpZiBzbywgc2hvdWxkIGl0IGJlIHBhZGRlZCB3aXRoIGVudHJpZXMgc28gYXMgdG8gZm9yY2UgdGhlIGNvbXBpbGVyCi0gICB0byBnZW5lcmF0ZSBhIGp1bXAgdGFibGUgKHZhbCAyKS4gT3IgYSBicmFuY2ggdGFibGUgKHZhbCAzKS4KLQotICAgPHNwZWNpYWxfbWFzaz4KLSAgIDxzcGVjaWFsX3ZhbHVlPgotICAgPHNwZWNpYWxfcnVsZT4KLSAgIDxzcGVjaWFsX2NvbnN0YW50PgotCi0gICBTcGVjaWFsIHJ1bGUgdG8gZmluZSB0dW5lIGhvdyBzcGVjaWZpYyAob3IgZ3JvdXBzKSBvZiBpbnN0cnVjdGlvbnMKLSAgIGFyZSBleHBhbmRlZC4gIFRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoZSBydWxlIGlzIGRldGVybWluZWQgYnkKLQotICAgICA8c3BlY2lhbF9tYXNrPiAhPSAwICYmIChpbnN0cnVjdGlvbj4gJiA8c3BlY2lhbF9tYXNrPikgPT0gPHNwZWNpYWxfdmFsdWU+Ci0KLSAgIFdoZXJlIDxpbnN0cnVjdGlvbj4gaXMgb2J0YWluZWQgYnkgbG9va2luZyBvbmx5IGF0IGNvbnN0YW50IGZpZWxkcwotICAgd2l0aCBpbiBhbiBpbnN0cnVjdGlvbnMgc3BlYy4gIFdoZW4gZGV0ZXJtaW5pbmcgYW4gZXhwYW5zaW9uLCB0aGUKLSAgIHJ1bGUgaXMgb25seSBjb25zaWRlcmVkIHdoZW4gYSBub2RlIGNvbnRhaW5zIGEgc2luZ2xlIGluc3RydWN0aW9uLgotICAgPHNwZWNpYWxfcnVsZT4gY2FuIGJlIGFueSBvZjoKLQotICAgICAgICAwOiBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgZXhwYW5kIGJ5IGVhcmxpZXIgcnVsZXMKLSAgIAkxOiBleHBhbmQgYml0cyA8Zm9yY2VfbG93PiAuLiA8Zm9yY2VfaGk+IG9ubHkKLQkyOiBib29sZWFuIGV4cGFuc2lvbiBvZiBvbmx5IHplcm8vbm9uLXplcm8gY2FzZXMKLQkzOiBib29sZWFuIGV4cGFuc2lvbiBvZiBlcXVhbGl0eSBvZiBzcGVjaWFsIGNvbnN0YW50Ci0KLQkqLwotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIG5vcm1hbF9kZWNvZGVfcnVsZSwKLSAgZXhwYW5kX2ZvcmNlZF9ydWxlLAotICBib29sZWFuX3J1bGUsCi0gIG5yX2RlY29kZV9ydWxlcwotfSBkZWNvZGVfc3BlY2lhbF90eXBlOwotCi10eXBlZGVmIGVudW0gewotICBpbnZhbGlkX2dlbiwKLSAgYXJyYXlfZ2VuLAotICBzd2l0Y2hfZ2VuLAotICBwYWRkZWRfc3dpdGNoX2dlbiwKLSAgZ290b19zd2l0Y2hfZ2VuLAotICBucl9kZWNvZGVfZ2VuX3R5cGVzLAotfSBkZWNvZGVfZ2VuX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2RlY29kZV90YWJsZSBkZWNvZGVfdGFibGU7Ci1zdHJ1Y3QgX2RlY29kZV90YWJsZSB7Ci0gIGRlY29kZV9zcGVjaWFsX3R5cGUgdHlwZTsKLSAgZGVjb2RlX2dlbl90eXBlIGdlbjsKLSAgaW50IGZpcnN0OwotICBpbnQgbGFzdDsKLSAgaW50IGZvcmNlX2ZpcnN0OwotICBpbnQgZm9yY2VfbGFzdDsKLSAgaW50IGZvcmNlX3NsYXNoOwotICBjaGFyICpmb3JjZV9leHBhbnNpb247Ci0gIHVuc2lnbmVkIHNwZWNpYWxfbWFzazsKLSAgdW5zaWduZWQgc3BlY2lhbF92YWx1ZTsKLSAgdW5zaWduZWQgc3BlY2lhbF9jb25zdGFudDsKLSAgZGVjb2RlX3RhYmxlICpuZXh0OwotfTsKLQotCi1leHRlcm4gdm9pZCBmb3JjZV9kZWNvZGVfZ2VuX3R5cGUKLShjb25zdCBjaGFyICp0eXBlKTsKLQotZXh0ZXJuIGRlY29kZV90YWJsZSAqbG9hZF9kZWNvZGVfdGFibGUKLShjaGFyICpmaWxlX25hbWUsCi0gaW50IGhpX2JpdF9ucik7Ci0KLWV4dGVybiB2b2lkIGR1bXBfZGVjb2RlX3J1bGUKLShkZWNvZGVfdGFibGUgKnJ1bGUsCi0gaW50IGluZGVudCk7CmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWluc24uYyBiL3NpbS9wcGMvbGQtaW5zbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkwZDg1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbGQtaW5zbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsZi5oIgotI2luY2x1ZGUgInRhYmxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyLmgiCi0jaW5jbHVkZSAibGQtZGVjb2RlLmgiCi0jaW5jbHVkZSAibGQtY2FjaGUuaCIKLSNpbmNsdWRlICJsZC1pbnNuLmgiCi0KLSNpbmNsdWRlICJpZ2VuLmgiCi0KLXN0YXRpYyB2b2lkCi11cGRhdGVfZGVwdGgoaW5zbl90YWJsZSAqZW50cnksCi0JICAgICBsZiAqZmlsZSwKLQkgICAgIHZvaWQgKmRhdGEsCi0JICAgICBpbnNuICppbnN0cnVjdGlvbiwKLQkgICAgIGludCBkZXB0aCkKLXsKLSAgaW50ICptYXhfZGVwdGggPSAoaW50KilkYXRhOwotICBpZiAoKm1heF9kZXB0aCA8IGRlcHRoKQotICAgICptYXhfZGVwdGggPSBkZXB0aDsKLX0KLQotCi1pbnQKLWluc25fdGFibGVfZGVwdGgoaW5zbl90YWJsZSAqdGFibGUpCi17Ci0gIGludCBkZXB0aCA9IDA7Ci0gIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKLQkJCSAgIE5VTEwsCi0JCQkgICAmZGVwdGgsCi0JCQkgICAxLAotCQkJICAgTlVMTCwgLypzdGFydCovCi0JCQkgICB1cGRhdGVfZGVwdGgsCi0JCQkgICBOVUxMLCAvKmVuZCovCi0JCQkgICBOVUxMKTsgLypwYWRkaW5nKi8KLSAgcmV0dXJuIGRlcHRoOwotfQotCi0KLXN0YXRpYyBpbnNuX2ZpZWxkcyAqCi1wYXJzZV9pbnNuX2Zvcm1hdCh0YWJsZV9lbnRyeSAqZW50cnksCi0JCSAgY2hhciAqZm9ybWF0KQotewotICBjaGFyICpjaHA7Ci0gIGluc25fZmllbGRzICpmaWVsZHMgPSBaQUxMT0MoaW5zbl9maWVsZHMpOwotCi0gIC8qIGNyZWF0ZSBhIGxlYWRpbmcgc2VudGluYWwgKi8KLSAgZmllbGRzLT5maXJzdCA9IFpBTExPQyhpbnNuX2ZpZWxkKTsKLSAgZmllbGRzLT5maXJzdC0+Zmlyc3QgPSAtMTsKLSAgZmllbGRzLT5maXJzdC0+bGFzdCA9IC0xOwotICBmaWVsZHMtPmZpcnN0LT53aWR0aCA9IDA7Ci0KLSAgLyogYW5kIGEgdHJhaWxpbmcgc2VudGluYWwgKi8KLSAgZmllbGRzLT5sYXN0ID0gWkFMTE9DKGluc25fZmllbGQpOwotICBmaWVsZHMtPmxhc3QtPmZpcnN0ID0gaW5zbl9iaXRfc2l6ZTsKLSAgZmllbGRzLT5sYXN0LT5sYXN0ID0gaW5zbl9iaXRfc2l6ZTsKLSAgZmllbGRzLT5sYXN0LT53aWR0aCA9IDA7Ci0KLSAgLyogbGluayB0aGVtIHRvZ2V0aGVyICovCi0gIGZpZWxkcy0+Zmlyc3QtPm5leHQgPSBmaWVsZHMtPmxhc3Q7Ci0gIGZpZWxkcy0+bGFzdC0+cHJldiA9IGZpZWxkcy0+Zmlyc3Q7Ci0KLSAgLyogbm93IHdvcmsgdGhyb3VnaCB0aGUgZm9ybWF0cyAqLwotICBjaHAgPSBmb3JtYXQ7Ci0KLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJykgewotICAgIGNoYXIgKnN0YXJ0X3BvczsKLSAgICBjaGFyICpzdGFydF92YWw7Ci0gICAgaW50IHN0cmxlbl92YWw7Ci0gICAgaW50IHN0cmxlbl9wb3M7Ci0gICAgaW5zbl9maWVsZCAqbmV3X2ZpZWxkOwotCi0gICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgaWYgKCFpc2RpZ2l0KCpjaHApKSB7Ci0gICAgICBlcnJvcigiJXM6JWQ6IG1pc3NpbmcgcG9zaXRpb24gZmllbGQgYXQgYCVzJ1xuIiwKLQkgICAgZW50cnktPmZpbGVfbmFtZSwgZW50cnktPmxpbmVfbnIsIGNocCk7Ci0gICAgfQotCi0gICAgLyogYnJlYWsgb3V0IHRoZSBiaXQgcG9zaXRpb24gKi8KLSAgICBzdGFydF9wb3MgPSBjaHA7Ci0gICAgd2hpbGUgKGlzZGlnaXQoKmNocCkpCi0gICAgICBjaHArKzsKLSAgICBzdHJsZW5fcG9zID0gY2hwIC0gc3RhcnRfcG9zOwotICAgIGlmICgqY2hwID09ICcuJyAmJiBzdHJsZW5fcG9zID4gMCkKLSAgICAgIGNocCsrOwotICAgIGVsc2UgewotICAgICAgZXJyb3IoIiVzOiVkOiBtaXNzaW5nIGZpZWxkIHZhbHVlIGF0ICVzXG4iLAotCSAgICBlbnRyeS0+ZmlsZV9uYW1lLCBlbnRyeS0+bGluZV9uciwgY2hwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGJyZWFrIG91dCB0aGUgdmFsdWUgKi8KLSAgICBzdGFydF92YWwgPSBjaHA7Ci0gICAgd2hpbGUgKCgqc3RhcnRfdmFsID09ICcvJyAmJiAqY2hwID09ICcvJykKLQkgICB8fCAoaXNkaWdpdCgqc3RhcnRfdmFsKSAmJiBpc2RpZ2l0KCpjaHApKQotCSAgIHx8IChpc2FscGhhKCpzdGFydF92YWwpICYmIChpc2FsbnVtKCpjaHApIHx8ICpjaHAgPT0gJ18nKSkpCi0gICAgICBjaHArKzsKLSAgICBzdHJsZW5fdmFsID0gY2hwIC0gc3RhcnRfdmFsOwotICAgIGlmICgqY2hwID09ICcsJykKLSAgICAgIGNocCsrOwotICAgIGVsc2UgaWYgKCpjaHAgIT0gJ1wwJyB8fCBzdHJsZW5fdmFsID09IDApIHsKLSAgICAgIGVycm9yKCIlczolZDogbWlzc2luZyBmaWVsZCB0ZXJtaW5hdG9yIGF0ICVzXG4iLAotCSAgICBlbnRyeS0+ZmlsZV9uYW1lLCBlbnRyeS0+bGluZV9uciwgY2hwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBhIG5ldyBmaWVsZCBhbmQgaW5zZXJ0IGl0ICovCi0gICAgbmV3X2ZpZWxkID0gWkFMTE9DKGluc25fZmllbGQpOwotICAgIG5ld19maWVsZC0+bmV4dCA9IGZpZWxkcy0+bGFzdDsKLSAgICBuZXdfZmllbGQtPnByZXYgPSBmaWVsZHMtPmxhc3QtPnByZXY7Ci0gICAgbmV3X2ZpZWxkLT5uZXh0LT5wcmV2ID0gbmV3X2ZpZWxkOwotICAgIG5ld19maWVsZC0+cHJldi0+bmV4dCA9IG5ld19maWVsZDsKLQotICAgIC8qIHRoZSB2YWx1ZSAqLwotICAgIG5ld19maWVsZC0+dmFsX3N0cmluZyA9IChjaGFyKil6YWxsb2Moc3RybGVuX3ZhbCsxKTsKLSAgICBzdHJuY3B5KG5ld19maWVsZC0+dmFsX3N0cmluZywgc3RhcnRfdmFsLCBzdHJsZW5fdmFsKTsKLSAgICBpZiAoaXNkaWdpdCgqbmV3X2ZpZWxkLT52YWxfc3RyaW5nKSkgewotICAgICAgbmV3X2ZpZWxkLT52YWxfaW50ID0gYTJpKG5ld19maWVsZC0+dmFsX3N0cmluZyk7Ci0gICAgICBuZXdfZmllbGQtPmlzX2ludCA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5ld19maWVsZC0+dmFsX3N0cmluZ1swXSA9PSAnLycpIHsKLSAgICAgIG5ld19maWVsZC0+aXNfc2xhc2ggPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5ld19maWVsZC0+aXNfc3RyaW5nID0gMTsKLSAgICB9Ci0gICAgCi0gICAgLyogdGhlIHBvcyAqLwotICAgIG5ld19maWVsZC0+cG9zX3N0cmluZyA9IChjaGFyKil6YWxsb2Moc3RybGVuX3BvcysxKTsKLSAgICBzdHJuY3B5KG5ld19maWVsZC0+cG9zX3N0cmluZywgc3RhcnRfcG9zLCBzdHJsZW5fcG9zKTsKLSAgICBuZXdfZmllbGQtPmZpcnN0ID0gdGFyZ2V0X2EyaShoaV9iaXRfbnIsIG5ld19maWVsZC0+cG9zX3N0cmluZyk7Ci0gICAgbmV3X2ZpZWxkLT5sYXN0ID0gbmV3X2ZpZWxkLT5uZXh0LT5maXJzdCAtIDE7IC8qIGd1ZXNzICovCi0gICAgbmV3X2ZpZWxkLT53aWR0aCA9IG5ld19maWVsZC0+bGFzdCAtIG5ld19maWVsZC0+Zmlyc3QgKyAxOyAvKiBndWVzcyAqLwotICAgIG5ld19maWVsZC0+cHJldi0+bGFzdCA9IG5ld19maWVsZC0+Zmlyc3QtMTsgLypmaXgqLwotICAgIG5ld19maWVsZC0+cHJldi0+d2lkdGggPSBuZXdfZmllbGQtPmZpcnN0IC0gbmV3X2ZpZWxkLT5wcmV2LT5maXJzdDsgLypmaXgqLwotICB9Ci0KLSAgLyogZmlkZGxlIGZpcnN0L2xhc3Qgc28gdGhhdCB0aGUgc2VudGluYWxzIGBkaXNhcGVhcicgKi8KLSAgQVNTRVJUKGZpZWxkcy0+Zmlyc3QtPmxhc3QgPCAwKTsKLSAgQVNTRVJUKGZpZWxkcy0+bGFzdC0+Zmlyc3QgPj0gaW5zbl9iaXRfc2l6ZSk7Ci0gIGZpZWxkcy0+Zmlyc3QgPSBmaWVsZHMtPmZpcnN0LT5uZXh0OwotICBmaWVsZHMtPmxhc3QgPSBmaWVsZHMtPmxhc3QtPnByZXY7Ci0KLSAgLyogbm93IGdvIG92ZXIgdGhpcyBhZ2FpbiwgcG9pbnRpbmcgZWFjaCBiaXQgcG9zaXRpb24gYXQgYSBmaWVsZAotICAgICByZWNvcmQgKi8KLSAgewotICAgIGludCBpOwotICAgIGluc25fZmllbGQgKmZpZWxkOwotICAgIGZpZWxkID0gZmllbGRzLT5maXJzdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbl9iaXRfc2l6ZTsgaSsrKSB7Ci0gICAgICB3aGlsZSAoZmllbGQtPmxhc3QgPCBpKQotCWZpZWxkID0gZmllbGQtPm5leHQ7Ci0gICAgICBmaWVsZHMtPmJpdHNbaV0gPSBmaWVsZDsKLSAgICB9Ci0gIH0KLQotICAvKiBnbyBvdmVyIGVhY2ggb2YgdGhlIGZpZWxkcywgYW5kIGNvbXB1dGUgYSBgdmFsdWUnIGZvciB0aGUgaW5zbiAqLwotICB7Ci0gICAgaW5zbl9maWVsZCAqZmllbGQ7Ci0gICAgZmllbGRzLT52YWx1ZSA9IDA7Ci0gICAgZm9yIChmaWVsZCA9IGZpZWxkcy0+Zmlyc3Q7Ci0JIGZpZWxkLT5sYXN0IDwgaW5zbl9iaXRfc2l6ZTsKLQkgZmllbGQgPSBmaWVsZC0+bmV4dCkgewotICAgICAgZmllbGRzLT52YWx1ZSA8PD0gZmllbGQtPndpZHRoOwotICAgICAgaWYgKGZpZWxkLT5pc19pbnQpCi0JZmllbGRzLT52YWx1ZSB8PSBmaWVsZC0+dmFsX2ludDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZpZWxkczsKLX0KLQotCi1zdGF0aWMgdm9pZAotbW9kZWxfdGFibGVfaW5zZXJ0KGluc25fdGFibGUgKnRhYmxlLAotCQkgICB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSkKLXsKLSAgaW50IGxlbjsKLQotICAvKiBjcmVhdGUgYSBuZXcgbW9kZWwgKi8KLSAgbW9kZWwgKm5ld19tb2RlbCA9IFpBTExPQyhtb2RlbCk7Ci0KLSAgbmV3X21vZGVsLT5uYW1lID0gZmlsZV9lbnRyeS0+ZmllbGRzW21vZGVsX2lkZW50aWZlcl07Ci0gIG5ld19tb2RlbC0+cHJpbnRhYmxlX25hbWUgPSBmaWxlX2VudHJ5LT5maWVsZHNbbW9kZWxfbmFtZV07Ci0gIG5ld19tb2RlbC0+aW5zbl9kZWZhdWx0ID0gZmlsZV9lbnRyeS0+ZmllbGRzW21vZGVsX2RlZmF1bHRdOwotCi0gIHdoaWxlICgqbmV3X21vZGVsLT5pbnNuX2RlZmF1bHQgJiYgaXNzcGFjZSgqbmV3X21vZGVsLT5pbnNuX2RlZmF1bHQpKQotICAgIG5ld19tb2RlbC0+aW5zbl9kZWZhdWx0Kys7Ci0KLSAgbGVuID0gc3RybGVuKG5ld19tb2RlbC0+aW5zbl9kZWZhdWx0KTsKLSAgaWYgKG1heF9tb2RlbF9maWVsZHNfbGVuIDwgbGVuKQotICAgIG1heF9tb2RlbF9maWVsZHNfbGVuID0gbGVuOwotCi0gIC8qIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBtb2RlbCBsaXN0ICovCi0gIGlmIChsYXN0X21vZGVsKQotICAgIGxhc3RfbW9kZWwtPm5leHQgPSBuZXdfbW9kZWw7Ci0gIGVsc2UKLSAgICBtb2RlbHMgPSBuZXdfbW9kZWw7Ci0gIGxhc3RfbW9kZWwgPSBuZXdfbW9kZWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb2RlbF90YWJsZV9pbnNlcnRfc3BlY2lmaWMoaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgICAgdGFibGVfZW50cnkgKmZpbGVfZW50cnksCi0JCQkgICAgaW5zbiAqKnN0YXJ0X3B0ciwKLQkJCSAgICBpbnNuICoqZW5kX3B0cikKLXsKLSAgaW5zbiAqcHRyID0gWkFMTE9DKGluc24pOwotICBwdHItPmZpbGVfZW50cnkgPSBmaWxlX2VudHJ5OwotICBpZiAoKmVuZF9wdHIpCi0gICAgKCplbmRfcHRyKS0+bmV4dCA9IHB0cjsKLSAgZWxzZQotICAgICgqc3RhcnRfcHRyKSA9IHB0cjsKLSAgKCplbmRfcHRyKSA9IHB0cjsKLX0KLQotCi1zdGF0aWMgdm9pZAotaW5zbl90YWJsZV9pbnNlcnRfZnVuY3Rpb24oaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgICB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSkKLXsKLSAgLyogY3JlYXRlIGEgbmV3IGZ1bmN0aW9uICovCi0gIGluc24gKm5ld19mdW5jdGlvbiA9IFpBTExPQyhpbnNuKTsKLSAgbmV3X2Z1bmN0aW9uLT5maWxlX2VudHJ5ID0gZmlsZV9lbnRyeTsKLQotICAvKiBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gbGlzdCAqLwotICBpZiAodGFibGUtPmxhc3RfZnVuY3Rpb24pCi0gICAgdGFibGUtPmxhc3RfZnVuY3Rpb24tPm5leHQgPSBuZXdfZnVuY3Rpb247Ci0gIGVsc2UKLSAgICB0YWJsZS0+ZnVuY3Rpb25zID0gbmV3X2Z1bmN0aW9uOwotICB0YWJsZS0+bGFzdF9mdW5jdGlvbiA9IG5ld19mdW5jdGlvbjsKLX0KLQotZXh0ZXJuIHZvaWQKLWluc25fdGFibGVfaW5zZXJ0X2luc24oaW5zbl90YWJsZSAqdGFibGUsCi0JCSAgICAgICB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSwKLQkJICAgICAgIGluc25fZmllbGRzICpmaWVsZHMpCi17Ci0gIGluc24gKipwdHJfdG9fY3VyX2luc24gPSAmdGFibGUtPmluc25zOwotICBpbnNuICpjdXJfaW5zbiA9ICpwdHJfdG9fY3VyX2luc247Ci0gIHRhYmxlX21vZGVsX2VudHJ5ICppbnNuX21vZGVsX3B0cjsKLSAgbW9kZWwgKm1vZGVsX3B0cjsKLQotICAvKiBjcmVhdGUgYSBuZXcgaW5zdHJ1Y3Rpb24gKi8KLSAgaW5zbiAqbmV3X2luc24gPSBaQUxMT0MoaW5zbik7Ci0gIG5ld19pbnNuLT5maWxlX2VudHJ5ID0gZmlsZV9lbnRyeTsKLSAgbmV3X2luc24tPmZpZWxkcyA9IGZpZWxkczsKLQotICAvKiBDaGVjayBvdXQgYW55IG1vZGVsIGluZm9ybWF0aW9uIHJldHVybmVkIHRvIG1ha2Ugc3VyZSB0aGUgbW9kZWwKLSAgICAgaXMgY29ycmVjdC4gICovCi0gIGZvcihpbnNuX21vZGVsX3B0ciA9IGZpbGVfZW50cnktPm1vZGVsX2ZpcnN0OyBpbnNuX21vZGVsX3B0cjsgaW5zbl9tb2RlbF9wdHIgPSBpbnNuX21vZGVsX3B0ci0+bmV4dCkgewotICAgIGNoYXIgKm5hbWUgPSBpbnNuX21vZGVsX3B0ci0+ZmllbGRzW2luc25fbW9kZWxfbmFtZV07Ci0gICAgaW50IGxlbiA9IHN0cmxlbiAoaW5zbl9tb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX2ZpZWxkc10pOwotCi0gICAgd2hpbGUgKGxlbiA+IDAgJiYgaXNzcGFjZSgqaW5zbl9tb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX2ZpZWxkc10pKSB7Ci0gICAgICBsZW4tLTsKLSAgICAgIGluc25fbW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9maWVsZHNdKys7Ci0gICAgfQotCi0gICAgaWYgKG1heF9tb2RlbF9maWVsZHNfbGVuIDwgbGVuKQotICAgICAgbWF4X21vZGVsX2ZpZWxkc19sZW4gPSBsZW47Ci0KLSAgICBmb3IobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgewotICAgICAgaWYgKHN0cmNtcChuYW1lLCBtb2RlbF9wdHItPnByaW50YWJsZV9uYW1lKSA9PSAwKSB7Ci0KLQkvKiBSZXBsYWNlIHRoZSBuYW1lIGZpZWxkIHdpdGggdGhhdCBvZiB0aGUgZ2xvYmFsIG1vZGVsLCBzbyB0aGF0IHdoZW4gd2UKLQkgICB3YW50IHRvIHByaW50IGl0IG91dCwgd2UgY2FuIGp1c3QgY29tcGFyZSBwb2ludGVycy4gICovCi0JaW5zbl9tb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX25hbWVdID0gbW9kZWxfcHRyLT5wcmludGFibGVfbmFtZTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW1vZGVsX3B0cikKLSAgICAgIGVycm9yKCIlczolZDogbWFjaGluZSBtb2RlbCBgJXMnIHdhcyBub3Qga25vd24gYWJvdXRcbiIsCi0JICAgIGZpbGVfZW50cnktPmZpbGVfbmFtZSwgZmlsZV9lbnRyeS0+bGluZV9uciwgbmFtZSk7Ci0gIH0KLQotICAvKiBpbnNlcnQgaXQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBvZiB0aGUgZmllbGRzICovCi0gIHdoaWxlIChjdXJfaW5zbiAhPSBOVUxMCi0JICYmIG5ld19pbnNuLT5maWVsZHMtPnZhbHVlID49IGN1cl9pbnNuLT5maWVsZHMtPnZhbHVlKSB7Ci0gICAgcHRyX3RvX2N1cl9pbnNuID0gJmN1cl9pbnNuLT5uZXh0OwotICAgIGN1cl9pbnNuID0gKnB0cl90b19jdXJfaW5zbjsKLSAgfQotCi0gIG5ld19pbnNuLT5uZXh0ID0gY3VyX2luc247Ci0gICpwdHJfdG9fY3VyX2luc24gPSBuZXdfaW5zbjsKLQotICB0YWJsZS0+bnJfaW5zbisrOwotfQotCi0KLQotaW5zbl90YWJsZSAqCi1sb2FkX2luc25fdGFibGUoY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCQlkZWNvZGVfdGFibGUgKmRlY29kZV9ydWxlcywKLQkJZmlsdGVyICpmaWx0ZXJzKQotewotICB0YWJsZSAqZmlsZSA9IHRhYmxlX29wZW4oZmlsZV9uYW1lLCBucl9pbnNuX3RhYmxlX2ZpZWxkcywgbnJfaW5zbl9tb2RlbF90YWJsZV9maWVsZHMpOwotICBpbnNuX3RhYmxlICp0YWJsZSA9IFpBTExPQyhpbnNuX3RhYmxlKTsKLSAgdGFibGVfZW50cnkgKmZpbGVfZW50cnk7Ci0gIHRhYmxlLT5vcGNvZGVfcnVsZSA9IGRlY29kZV9ydWxlczsKLQotICB3aGlsZSAoKGZpbGVfZW50cnkgPSB0YWJsZV9lbnRyeV9yZWFkKGZpbGUpKSAhPSBOVUxMKSB7Ci0gICAgaWYgKGl0X2lzKCJmdW5jdGlvbiIsIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkKLQl8fCBpdF9pcygiaW50ZXJuYWwiLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgICBpbnNuX3RhYmxlX2luc2VydF9mdW5jdGlvbih0YWJsZSwgZmlsZV9lbnRyeSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGl0X2lzKCJtb2RlbCIsIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKLSAgICAgIG1vZGVsX3RhYmxlX2luc2VydCh0YWJsZSwgZmlsZV9lbnRyeSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGl0X2lzKCJtb2RlbC1tYWNybyIsIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKLSAgICAgIG1vZGVsX3RhYmxlX2luc2VydF9zcGVjaWZpYyh0YWJsZSwgZmlsZV9lbnRyeSwgJm1vZGVsX21hY3JvcywgJmxhc3RfbW9kZWxfbWFjcm8pOwotICAgIH0KLSAgICBlbHNlIGlmIChpdF9pcygibW9kZWwtZnVuY3Rpb24iLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgICBtb2RlbF90YWJsZV9pbnNlcnRfc3BlY2lmaWModGFibGUsIGZpbGVfZW50cnksICZtb2RlbF9mdW5jdGlvbnMsICZsYXN0X21vZGVsX2Z1bmN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaXRfaXMoIm1vZGVsLWludGVybmFsIiwgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgewotICAgICAgbW9kZWxfdGFibGVfaW5zZXJ0X3NwZWNpZmljKHRhYmxlLCBmaWxlX2VudHJ5LCAmbW9kZWxfaW50ZXJuYWwsICZsYXN0X21vZGVsX2ludGVybmFsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaXRfaXMoIm1vZGVsLXN0YXRpYyIsIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKLSAgICAgIG1vZGVsX3RhYmxlX2luc2VydF9zcGVjaWZpYyh0YWJsZSwgZmlsZV9lbnRyeSwgJm1vZGVsX3N0YXRpYywgJmxhc3RfbW9kZWxfc3RhdGljKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaXRfaXMoIm1vZGVsLWRhdGEiLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7Ci0gICAgICBtb2RlbF90YWJsZV9pbnNlcnRfc3BlY2lmaWModGFibGUsIGZpbGVfZW50cnksICZtb2RlbF9kYXRhLCAmbGFzdF9tb2RlbF9kYXRhKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbnNuX2ZpZWxkcyAqZmllbGRzOwotICAgICAgLyogc2tpcCBpbnN0cnVjdGlvbnMgdGhhdCBhcmVuJ3QgcmVsZXZhbnQgdG8gdGhlIG1vZGUgKi8KLSAgICAgIGlmIChpc19maWx0ZXJlZF9vdXQoZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdLCBmaWx0ZXJzKSkgewotCWZwcmludGYoc3RkZXJyLCAiRHJvcHBpbmcgJXMgLSAlc1xuIiwKLQkJZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCi0JCWZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkvKiBjcmVhdGUvaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24gKi8KLQlmaWVsZHMgPSBwYXJzZV9pbnNuX2Zvcm1hdChmaWxlX2VudHJ5LAotCQkJCSAgIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2Zvcm1hdF0pOwotCWluc25fdGFibGVfaW5zZXJ0X2luc24odGFibGUsIGZpbGVfZW50cnksIGZpZWxkcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0YWJsZTsKLX0KLQotCi1leHRlcm4gdm9pZAotaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKGluc25fdGFibGUgKnRhYmxlLAotCQkJIGxmICpmaWxlLAotCQkJIHZvaWQgKmRhdGEsCi0JCQkgaW50IGRlcHRoLAotCQkJIGxlYWZfaGFuZGxlciAqc3RhcnQsCi0JCQkgaW5zbl9oYW5kbGVyICpsZWFmLAotCQkJIGxlYWZfaGFuZGxlciAqZW5kLAotCQkJIHBhZGRpbmdfaGFuZGxlciAqcGFkZGluZykKLXsKLSAgaW5zbl90YWJsZSAqZW50cnk7Ci0gIGludCBlbnRyeV9ucjsKLSAgCi0gIEFTU0VSVCh0YWJsZSAhPSBOVUxMCi0JICYmIHRhYmxlLT5vcGNvZGUgIT0gTlVMTAotCSAmJiB0YWJsZS0+bnJfZW50cmllcyA+IDAKLQkgJiYgdGFibGUtPmVudHJpZXMgIT0gMCk7Ci0KLSAgaWYgKHN0YXJ0ICE9IE5VTEwgJiYgZGVwdGggPj0gMCkKLSAgICBzdGFydCh0YWJsZSwgZmlsZSwgZGF0YSwgZGVwdGgpOwotCi0gIGZvciAoZW50cnlfbnIgPSAwLCBlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOwotICAgICAgIGVudHJ5X25yIDwgKHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQkJICAgPyAyCi0JCSAgIDogKDEgPDwgKHRhYmxlLT5vcGNvZGUtPmxhc3QgLSB0YWJsZS0+b3Bjb2RlLT5maXJzdCArIDEpKSk7Ci0gICAgICAgZW50cnlfbnIgKyspIHsKLSAgICBpZiAoZW50cnkgPT0gTlVMTAotCXx8ICghdGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbgotCSAgICAmJiBlbnRyeV9uciA8IGVudHJ5LT5vcGNvZGVfbnIpKSB7Ci0gICAgICBpZiAocGFkZGluZyAhPSBOVUxMICYmIGRlcHRoID49IDApCi0JcGFkZGluZyh0YWJsZSwgZmlsZSwgZGF0YSwgZGVwdGgsIGVudHJ5X25yKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBBU1NFUlQoZW50cnkgIT0gTlVMTCAmJiAoZW50cnktPm9wY29kZV9uciA9PSBlbnRyeV9ucgotCQkJICAgICAgIHx8IHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4pKTsKLSAgICAgIGlmIChlbnRyeS0+b3Bjb2RlICE9IE5VTEwgJiYgZGVwdGggIT0gMCkgewotCWluc25fdGFibGVfdHJhdmVyc2VfdHJlZShlbnRyeSwgZmlsZSwgZGF0YSwgZGVwdGgrMSwKLQkJCQkgc3RhcnQsIGxlYWYsIGVuZCwgcGFkZGluZyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkZXB0aCA+PSAwKSB7Ci0JaWYgKGxlYWYgIT0gTlVMTCkKLQkgIGxlYWYoZW50cnksIGZpbGUsIGRhdGEsIGVudHJ5LT5pbnNucywgZGVwdGgpOwotICAgICAgfQotICAgICAgZW50cnkgPSBlbnRyeS0+c2libGluZzsKLSAgICB9Ci0gIH0KLSAgaWYgKGVuZCAhPSBOVUxMICYmIGRlcHRoID49IDApCi0gICAgZW5kKHRhYmxlLCBmaWxlLCBkYXRhLCBkZXB0aCk7Ci19Ci0KLQotZXh0ZXJuIHZvaWQKLWluc25fdGFibGVfdHJhdmVyc2VfZnVuY3Rpb24oaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgICAgIGxmICpmaWxlLAotCQkJICAgICB2b2lkICpkYXRhLAotCQkJICAgICBmdW5jdGlvbl9oYW5kbGVyICpsZWFmKQotewotICBpbnNuICpmdW5jdGlvbjsKLSAgZm9yIChmdW5jdGlvbiA9IHRhYmxlLT5mdW5jdGlvbnM7Ci0gICAgICAgZnVuY3Rpb24gIT0gTlVMTDsKLSAgICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLT5uZXh0KSB7Ci0gICAgbGVhZih0YWJsZSwgZmlsZSwgZGF0YSwgZnVuY3Rpb24tPmZpbGVfZW50cnkpOwotICB9Ci19Ci0KLWV4dGVybiB2b2lkCi1pbnNuX3RhYmxlX3RyYXZlcnNlX2luc24oaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgbGYgKmZpbGUsCi0JCQkgdm9pZCAqZGF0YSwKLQkJCSBpbnNuX2hhbmRsZXIgKmhhbmRsZXIpCi17Ci0gIGluc24gKmluc3RydWN0aW9uOwotICBmb3IgKGluc3RydWN0aW9uID0gdGFibGUtPmluc25zOwotICAgICAgIGluc3RydWN0aW9uICE9IE5VTEw7Ci0gICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi0+bmV4dCkgewotICAgIGhhbmRsZXIodGFibGUsIGZpbGUsIGRhdGEsIGluc3RydWN0aW9uLCAwKTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIGVudW0gewotICBmaWVsZF9jb25zdGFudF9pbnQgPSAxLAotICBmaWVsZF9jb25zdGFudF9zbGFzaCA9IDIsCi0gIGZpZWxkX2NvbnN0YW50X3N0cmluZyA9IDMKLX0gY29uc3RhbnRfZmllbGRfdHlwZXM7Ci0KLQotc3RhdGljIGludAotaW5zbl9maWVsZF9pc19jb25zdGFudChpbnNuX2ZpZWxkICpmaWVsZCwKLQkJICAgICAgIGRlY29kZV90YWJsZSAqcnVsZSkKLXsKLSAgLyogZmllbGQgaXMgYW4gaW50ZWdlciAqLwotICBpZiAoZmllbGQtPmlzX2ludCkKLSAgICByZXR1cm4gZmllbGRfY29uc3RhbnRfaW50OwotICAvKiBmaWVsZCBpcyBgLycgYW5kIHRyZWF0aW5nIHRoYXQgYXMgYSBjb25zdGFudCAqLwotICBpZiAoZmllbGQtPmlzX3NsYXNoICYmIHJ1bGUtPmZvcmNlX3NsYXNoKQotICAgIHJldHVybiBmaWVsZF9jb25zdGFudF9zbGFzaDsKLSAgLyogZmllbGQsIHRob3VnaCB2YXJpYWJsZSBpcyBvbiB0aGUgbGlzdCAqLwotICBpZiAoZmllbGQtPmlzX3N0cmluZyAmJiBydWxlLT5mb3JjZV9leHBhbnNpb24gIT0gTlVMTCkgewotICAgIGNoYXIgKmZvcmNlZF9maWVsZHMgPSBydWxlLT5mb3JjZV9leHBhbnNpb247Ci0gICAgd2hpbGUgKCpmb3JjZWRfZmllbGRzICE9ICdcMCcpIHsKLSAgICAgIGludCBmaWVsZF9sZW47Ci0gICAgICBjaGFyICplbmQgPSBzdHJjaHIoZm9yY2VkX2ZpZWxkcywgJywnKTsKLSAgICAgIGlmIChlbmQgPT0gTlVMTCkKLQlmaWVsZF9sZW4gPSBzdHJsZW4oZm9yY2VkX2ZpZWxkcyk7Ci0gICAgICBlbHNlCi0JZmllbGRfbGVuID0gZW5kLWZvcmNlZF9maWVsZHM7Ci0gICAgICBpZiAoc3RybmNtcChmb3JjZWRfZmllbGRzLCBmaWVsZC0+dmFsX3N0cmluZywgZmllbGRfbGVuKSA9PSAwCi0JICAmJiBmaWVsZC0+dmFsX3N0cmluZ1tmaWVsZF9sZW5dID09ICdcMCcpCi0JcmV0dXJuIGZpZWxkX2NvbnN0YW50X3N0cmluZzsKLSAgICAgIGZvcmNlZF9maWVsZHMgKz0gZmllbGRfbGVuOwotICAgICAgaWYgKCpmb3JjZWRfZmllbGRzID09ICcsJykKLQlmb3JjZWRfZmllbGRzKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBvcGNvZGVfZmllbGQgKgotaW5zbl90YWJsZV9maW5kX29wY29kZV9maWVsZChpbnNuICppbnNucywKLQkJCSAgICAgZGVjb2RlX3RhYmxlICpydWxlLAotCQkJICAgICBpbnQgc3RyaW5nX29ubHkpCi17Ci0gIG9wY29kZV9maWVsZCAqY3Vycl9vcGNvZGUgPSBaQUxMT0Mob3Bjb2RlX2ZpZWxkKTsKLSAgaW5zbiAqZW50cnk7Ci0gIEFTU0VSVChydWxlKTsKLQotICBjdXJyX29wY29kZS0+Zmlyc3QgPSBpbnNuX2JpdF9zaXplOwotICBjdXJyX29wY29kZS0+bGFzdCA9IC0xOwotICBmb3IgKGVudHJ5ID0gaW5zbnM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKLSAgICBpbnNuX2ZpZWxkcyAqZmllbGRzID0gZW50cnktPmZpZWxkczsKLSAgICBvcGNvZGVfZmllbGQgbmV3X29wY29kZTsKLQotICAgIC8qIGZpbmQgYSBzdGFydCBwb2ludCBmb3IgdGhlIG9wY29kZSBmaWVsZCAqLwotICAgIG5ld19vcGNvZGUuZmlyc3QgPSBydWxlLT5maXJzdDsKLSAgICB3aGlsZSAobmV3X29wY29kZS5maXJzdCA8PSBydWxlLT5sYXN0Ci0JICAgJiYgKCFzdHJpbmdfb25seQotCSAgICAgICB8fCBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmZpcnN0XSwKLQkJCQkJIHJ1bGUpICE9IGZpZWxkX2NvbnN0YW50X3N0cmluZykKLQkgICAmJiAoc3RyaW5nX29ubHkKLQkgICAgICAgfHwgIWluc25fZmllbGRfaXNfY29uc3RhbnQoZmllbGRzLT5iaXRzW25ld19vcGNvZGUuZmlyc3RdLAotCQkJCQkgIHJ1bGUpKSkKLSAgICAgIG5ld19vcGNvZGUuZmlyc3QgPSBmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5maXJzdF0tPmxhc3QgKyAxOwotICAgIEFTU0VSVChuZXdfb3Bjb2RlLmZpcnN0ID4gcnVsZS0+bGFzdAotCSAgIHx8IChzdHJpbmdfb25seQotCSAgICAgICAmJiBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmZpcnN0XSwKLQkJCQkJIHJ1bGUpID09IGZpZWxkX2NvbnN0YW50X3N0cmluZykKLQkgICB8fCAoIXN0cmluZ19vbmx5Ci0JICAgICAgICYmIGluc25fZmllbGRfaXNfY29uc3RhbnQoZmllbGRzLT5iaXRzW25ld19vcGNvZGUuZmlyc3RdLAotCQkJCQkgcnVsZSkpKTsKLSAgCi0gICAgLyogZmluZCB0aGUgZW5kIHBvaW50IGZvciB0aGUgb3Bjb2RlIGZpZWxkICovCi0gICAgbmV3X29wY29kZS5sYXN0ID0gcnVsZS0+bGFzdDsKLSAgICB3aGlsZSAobmV3X29wY29kZS5sYXN0ID49IHJ1bGUtPmZpcnN0Ci0JICAgJiYgKCFzdHJpbmdfb25seQotCSAgICAgICB8fCBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmxhc3RdLAotCQkJCQkgcnVsZSkgIT0gZmllbGRfY29uc3RhbnRfc3RyaW5nKQotCSAgICYmIChzdHJpbmdfb25seQotCSAgICAgICB8fCAhaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5sYXN0XSwKLQkJCQkJICBydWxlKSkpCi0gICAgICBuZXdfb3Bjb2RlLmxhc3QgPSBmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5sYXN0XS0+Zmlyc3QgLSAxOwotICAgIEFTU0VSVChuZXdfb3Bjb2RlLmxhc3QgPCBydWxlLT5maXJzdAotCSAgIHx8IChzdHJpbmdfb25seQotCSAgICAgICAmJiBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmxhc3RdLAotCQkJCQkgcnVsZSkgPT0gZmllbGRfY29uc3RhbnRfc3RyaW5nKQotCSAgIHx8ICghc3RyaW5nX29ubHkKLQkgICAgICAgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5sYXN0XSwKLQkJCQkJIHJ1bGUpKSk7Ci0KLSAgICAvKiBub3cgc2VlIGlmIG91ciBjdXJyZW50IG9wY29kZSBuZWVkcyBleHBhbmRpbmcgKi8KLSAgICBpZiAobmV3X29wY29kZS5maXJzdCA8PSBydWxlLT5sYXN0Ci0JJiYgY3Vycl9vcGNvZGUtPmZpcnN0ID4gbmV3X29wY29kZS5maXJzdCkKLSAgICAgIGN1cnJfb3Bjb2RlLT5maXJzdCA9IG5ld19vcGNvZGUuZmlyc3Q7Ci0gICAgaWYgKG5ld19vcGNvZGUubGFzdCA+PSBydWxlLT5maXJzdAotCSYmIGN1cnJfb3Bjb2RlLT5sYXN0IDwgbmV3X29wY29kZS5sYXN0KQotICAgICAgY3Vycl9vcGNvZGUtPmxhc3QgPSBuZXdfb3Bjb2RlLmxhc3Q7Ci0gICAgCi0gIH0KLQotICAvKiB3YXMgYW55IHRoaW5nIGludGVyZXN0aW5nIGZvdW5kPyAqLwotICBpZiAoY3Vycl9vcGNvZGUtPmZpcnN0ID4gcnVsZS0+bGFzdCkgewotICAgIEFTU0VSVChjdXJyX29wY29kZS0+bGFzdCA8IHJ1bGUtPmZpcnN0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBBU1NFUlQoY3Vycl9vcGNvZGUtPmxhc3QgPj0gcnVsZS0+Zmlyc3QpOwotICBBU1NFUlQoY3Vycl9vcGNvZGUtPmZpcnN0IDw9IHJ1bGUtPmxhc3QpOwotCi0gIC8qIGlmIHNvbWV0aGluZyB3YXMgZm91bmQsIGNoZWNrIGl0IGluY2x1ZGVzIHRoZSBmb3JjZWQgZmllbGQgcmFuZ2UgKi8KLSAgaWYgKCFzdHJpbmdfb25seQotICAgICAgJiYgY3Vycl9vcGNvZGUtPmZpcnN0ID4gcnVsZS0+Zm9yY2VfZmlyc3QpIHsKLSAgICBjdXJyX29wY29kZS0+Zmlyc3QgPSBydWxlLT5mb3JjZV9maXJzdDsKLSAgfQotICBpZiAoIXN0cmluZ19vbmx5Ci0gICAgICAmJiBjdXJyX29wY29kZS0+bGFzdCA8IHJ1bGUtPmZvcmNlX2xhc3QpIHsKLSAgICBjdXJyX29wY29kZS0+bGFzdCA9IHJ1bGUtPmZvcmNlX2xhc3Q7Ci0gIH0KLSAgLyogaGFuZGxlIHNwZWNpYWwgY2FzZSBlbG1pbmF0aW5nIGFueSBuZWVkIHRvIGRvIHNoaWZ0IGFmdGVyIG1hc2sgKi8KLSAgaWYgKHN0cmluZ19vbmx5Ci0gICAgICAmJiBydWxlLT5mb3JjZV9sYXN0ID09IGluc25fYml0X3NpemUtMSkgewotICAgIGN1cnJfb3Bjb2RlLT5sYXN0ID0gaW5zbl9iaXRfc2l6ZS0xOwotICB9Ci0KLSAgLyogaGFuZGxlIGFueSBzcGVjaWFsIGNhc2VzICovCi0gIHN3aXRjaCAocnVsZS0+dHlwZSkgewotICBjYXNlIG5vcm1hbF9kZWNvZGVfcnVsZToKLSAgICAvKiBsZXQgdGhlIGFib3ZlIGFwcGx5ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgZXhwYW5kX2ZvcmNlZF9ydWxlOgotICAgIC8qIGV4cGFuZCBhIGxpbWl0ZWQgbnIgb2YgYml0cywgaWdub3JpbmcgdGhlIHJlc3QgKi8KLSAgICBjdXJyX29wY29kZS0+Zmlyc3QgPSBydWxlLT5mb3JjZV9maXJzdDsKLSAgICBjdXJyX29wY29kZS0+bGFzdCA9IHJ1bGUtPmZvcmNlX2xhc3Q7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYm9vbGVhbl9ydWxlOgotICAgIGN1cnJfb3Bjb2RlLT5pc19ib29sZWFuID0gMTsKLSAgICBjdXJyX29wY29kZS0+Ym9vbGVhbl9jb25zdGFudCA9IHJ1bGUtPnNwZWNpYWxfY29uc3RhbnQ7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoIlNvbWV0aGluZyBpcyBnb2luZyB3cm9uZ1xuIik7Ci0gIH0KLQotICByZXR1cm4gY3Vycl9vcGNvZGU7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWluc25fdGFibGVfaW5zZXJ0X2V4cGFuZGVkKGluc25fdGFibGUgKnRhYmxlLAotCQkJICAgaW5zbiAqb2xkX2luc24sCi0JCQkgICBpbnQgbmV3X29wY29kZV9uciwKLQkJCSAgIGluc25fYml0cyAqbmV3X2JpdHMpCi17Ci0gIGluc25fdGFibGUgKipwdHJfdG9fY3VyX2VudHJ5ID0gJnRhYmxlLT5lbnRyaWVzOwotICBpbnNuX3RhYmxlICpjdXJfZW50cnkgPSAqcHRyX3RvX2N1cl9lbnRyeTsKLQotICAvKiBmaW5kIHRoZSBuZXcgdGFibGUgZm9yIHRoaXMgZW50cnkgKi8KLSAgd2hpbGUgKGN1cl9lbnRyeSAhPSBOVUxMCi0JICYmIGN1cl9lbnRyeS0+b3Bjb2RlX25yIDwgbmV3X29wY29kZV9ucikgewotICAgIHB0cl90b19jdXJfZW50cnkgPSAmY3VyX2VudHJ5LT5zaWJsaW5nOwotICAgIGN1cl9lbnRyeSA9ICpwdHJfdG9fY3VyX2VudHJ5OwotICB9Ci0KLSAgaWYgKGN1cl9lbnRyeSA9PSBOVUxMIHx8IGN1cl9lbnRyeS0+b3Bjb2RlX25yICE9IG5ld19vcGNvZGVfbnIpIHsKLSAgICBpbnNuX3RhYmxlICpuZXdfZW50cnkgPSBaQUxMT0MoaW5zbl90YWJsZSk7Ci0gICAgbmV3X2VudHJ5LT5vcGNvZGVfbnIgPSBuZXdfb3Bjb2RlX25yOwotICAgIG5ld19lbnRyeS0+ZXhwYW5kZWRfYml0cyA9IG5ld19iaXRzOwotICAgIG5ld19lbnRyeS0+b3Bjb2RlX3J1bGUgPSB0YWJsZS0+b3Bjb2RlX3J1bGUtPm5leHQ7Ci0gICAgbmV3X2VudHJ5LT5zaWJsaW5nID0gY3VyX2VudHJ5OwotICAgIG5ld19lbnRyeS0+cGFyZW50ID0gdGFibGU7Ci0gICAgKnB0cl90b19jdXJfZW50cnkgPSBuZXdfZW50cnk7Ci0gICAgY3VyX2VudHJ5ID0gbmV3X2VudHJ5OwotICAgIHRhYmxlLT5ucl9lbnRyaWVzKys7Ci0gIH0KLSAgLyogQVNTRVJUIG5ld19iaXRzID09IGN1cl9lbnRyeSBiaXRzICovCi0gIEFTU0VSVChjdXJfZW50cnkgIT0gTlVMTCAmJiBjdXJfZW50cnktPm9wY29kZV9uciA9PSBuZXdfb3Bjb2RlX25yKTsKLSAgaW5zbl90YWJsZV9pbnNlcnRfaW5zbihjdXJfZW50cnksCi0JCQkgb2xkX2luc24tPmZpbGVfZW50cnksCi0JCQkgb2xkX2luc24tPmZpZWxkcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNuX3RhYmxlX2V4cGFuZF9vcGNvZGUoaW5zbl90YWJsZSAqdGFibGUsCi0JCQkgaW5zbiAqaW5zdHJ1Y3Rpb24sCi0JCQkgaW50IGZpZWxkX25yLAotCQkJIGludCBvcGNvZGVfbnIsCi0JCQkgaW5zbl9iaXRzICpiaXRzKQotewotCi0gIGlmIChmaWVsZF9uciA+IHRhYmxlLT5vcGNvZGUtPmxhc3QpIHsKLSAgICBpbnNuX3RhYmxlX2luc2VydF9leHBhbmRlZCh0YWJsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZV9uciwgYml0cyk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW5zbl9maWVsZCAqZmllbGQgPSBpbnN0cnVjdGlvbi0+ZmllbGRzLT5iaXRzW2ZpZWxkX25yXTsKLSAgICBpZiAoZmllbGQtPmlzX2ludCB8fCBmaWVsZC0+aXNfc2xhc2gpIHsKLSAgICAgIEFTU0VSVChmaWVsZC0+Zmlyc3QgPj0gdGFibGUtPm9wY29kZS0+Zmlyc3QKLQkgICAgICYmIGZpZWxkLT5sYXN0IDw9IHRhYmxlLT5vcGNvZGUtPmxhc3QpOwotICAgICAgaW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKHRhYmxlLCBpbnN0cnVjdGlvbiwgZmllbGQtPmxhc3QrMSwKLQkJCSAgICAgICAoKG9wY29kZV9uciA8PCBmaWVsZC0+d2lkdGgpICsgZmllbGQtPnZhbF9pbnQpLAotCQkJICAgICAgIGJpdHMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBpbnQgbGFzdF9wb3MgPSAoKGZpZWxkLT5sYXN0IDwgdGFibGUtPm9wY29kZS0+bGFzdCkKLQkJCT8gZmllbGQtPmxhc3QgOiB0YWJsZS0+b3Bjb2RlLT5sYXN0KTsKLSAgICAgIGludCBmaXJzdF9wb3MgPSAoKGZpZWxkLT5maXJzdCA+IHRhYmxlLT5vcGNvZGUtPmZpcnN0KQotCQkJID8gZmllbGQtPmZpcnN0IDogdGFibGUtPm9wY29kZS0+Zmlyc3QpOwotICAgICAgaW50IHdpZHRoID0gbGFzdF9wb3MgLSBmaXJzdF9wb3MgKyAxOwotICAgICAgaW50IGxhc3RfdmFsID0gKHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4KLQkJICAgICAgPyAyIDogKDEgPDwgd2lkdGgpKTsKLSAgICAgIGZvciAodmFsID0gMDsgdmFsIDwgbGFzdF92YWw7IHZhbCsrKSB7Ci0JaW5zbl9iaXRzICpuZXdfYml0cyA9IFpBTExPQyhpbnNuX2JpdHMpOwotCW5ld19iaXRzLT5maWVsZCA9IGZpZWxkOwotCW5ld19iaXRzLT52YWx1ZSA9IHZhbDsKLQluZXdfYml0cy0+bGFzdCA9IGJpdHM7Ci0JbmV3X2JpdHMtPm9wY29kZSA9IHRhYmxlLT5vcGNvZGU7Ci0JaW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKHRhYmxlLCBpbnN0cnVjdGlvbiwgbGFzdF9wb3MrMSwKLQkJCQkgKChvcGNvZGVfbnIgPDwgd2lkdGgpIHwgdmFsKSwKLQkJCQkgbmV3X2JpdHMpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZAotaW5zbl90YWJsZV9pbnNlcnRfZXhwYW5kaW5nKGluc25fdGFibGUgKnRhYmxlLAotCQkJICAgIGluc24gKmVudHJ5KQotewotICBpbnNuX3RhYmxlX2V4cGFuZF9vcGNvZGUodGFibGUsCi0JCQkgICBlbnRyeSwKLQkJCSAgIHRhYmxlLT5vcGNvZGUtPmZpcnN0LAotCQkJICAgMCwKLQkJCSAgIHRhYmxlLT5leHBhbmRlZF9iaXRzKTsKLX0KLQotCi1leHRlcm4gdm9pZAotaW5zbl90YWJsZV9leHBhbmRfaW5zbnMoaW5zbl90YWJsZSAqdGFibGUpCi17Ci0KLSAgQVNTRVJUKHRhYmxlLT5ucl9pbnNuID49IDEpOwotCi0gIC8qIGRldGVybWluZSBhIHZhbGlkIG9wY29kZSAqLwotICB3aGlsZSAodGFibGUtPm9wY29kZV9ydWxlKSB7Ci0gICAgLyogc3BlY2lhbHMgb25seSBmb3Igc2luZ2xlIGluc3RydWN0aW9ucyAqLwotICAgIGlmICgodGFibGUtPm5yX2luc24gPiAxCi0JICYmIHRhYmxlLT5vcGNvZGVfcnVsZS0+c3BlY2lhbF9tYXNrID09IDAKLQkgJiYgdGFibGUtPm9wY29kZV9ydWxlLT50eXBlID09IG5vcm1hbF9kZWNvZGVfcnVsZSkKLQl8fCAodGFibGUtPm5yX2luc24gPT0gMQotCSAgICAmJiB0YWJsZS0+b3Bjb2RlX3J1bGUtPnNwZWNpYWxfbWFzayAhPSAwCi0JICAgICYmICgodGFibGUtPmluc25zLT5maWVsZHMtPnZhbHVlCi0JCSAmIHRhYmxlLT5vcGNvZGVfcnVsZS0+c3BlY2lhbF9tYXNrKQotCQk9PSB0YWJsZS0+b3Bjb2RlX3J1bGUtPnNwZWNpYWxfdmFsdWUpKQotCXx8IChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMKLQkgICAgJiYgdGFibGUtPm9wY29kZV9ydWxlLT5zcGVjaWFsX21hc2sgPT0gMAotCSAgICAmJiB0YWJsZS0+b3Bjb2RlX3J1bGUtPnR5cGUgPT0gbm9ybWFsX2RlY29kZV9ydWxlKSkKLSAgICAgIHRhYmxlLT5vcGNvZGUgPQotCWluc25fdGFibGVfZmluZF9vcGNvZGVfZmllbGQodGFibGUtPmluc25zLAotCQkJCSAgICAgdGFibGUtPm9wY29kZV9ydWxlLAotCQkJCSAgICAgdGFibGUtPm5yX2luc24gPT0gMS8qc3RyaW5nKi8KLQkJCQkgICAgICk7Ci0gICAgaWYgKHRhYmxlLT5vcGNvZGUgIT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICAgIHRhYmxlLT5vcGNvZGVfcnVsZSA9IHRhYmxlLT5vcGNvZGVfcnVsZS0+bmV4dDsKLSAgfQotCi0gIC8qIGRpZCB3ZSBmaW5kIGFueXRoaW5nICovCi0gIGlmICh0YWJsZS0+b3Bjb2RlID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQVNTRVJUKHRhYmxlLT5vcGNvZGUgIT0gTlVMTCk7Ci0KLSAgLyogYmFjayBsaW5rIHdoYXQgd2UgZm91bmQgdG8gaXRzIHBhcmVudCAqLwotICBpZiAodGFibGUtPnBhcmVudCAhPSBOVUxMKSB7Ci0gICAgQVNTRVJUKHRhYmxlLT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKLSAgICB0YWJsZS0+b3Bjb2RlLT5wYXJlbnQgPSB0YWJsZS0+cGFyZW50LT5vcGNvZGU7Ci0gIH0KLQotICAvKiBleHBhbmQgdGhlIHJhdyBpbnN0cnVjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBvcGNvZGUgKi8KLSAgewotICAgIGluc24gKmVudHJ5OwotICAgIGZvciAoZW50cnkgPSB0YWJsZS0+aW5zbnM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKLSAgICAgIGluc25fdGFibGVfaW5zZXJ0X2V4cGFuZGluZyh0YWJsZSwgZW50cnkpOwotICAgIH0KLSAgfQotCi0gIC8qIGFuZCBkbyB0aGUgc2FtZSBmb3IgdGhlIHN1YiBlbnRyaWVzICovCi0gIHsKLSAgICBpbnNuX3RhYmxlICplbnRyeTsKLSAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmVudHJpZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gIGVudHJ5LT5zaWJsaW5nKSB7Ci0gICAgICBpbnNuX3RhYmxlX2V4cGFuZF9pbnNucyhlbnRyeSk7Ci0gICAgfQotICB9Ci19Ci0KLQotCi0KLSNpZmRlZiBNQUlOCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2luc25fZmllbGQoaW5zbl9maWVsZCAqZmllbGQsCi0JCWludCBpbmRlbnQpCi17Ci0KLSAgcHJpbnRmKCIoaW5zbl9maWVsZCopMHgleFxuIiwgKHVuc2lnbmVkKWZpZWxkKTsKLQotICBkdW1wZihpbmRlbnQsICIoZmlyc3QgJWQpXG4iLCBmaWVsZC0+Zmlyc3QpOwotCi0gIGR1bXBmKGluZGVudCwgIihsYXN0ICVkKVxuIiwgZmllbGQtPmxhc3QpOwotCi0gIGR1bXBmKGluZGVudCwgIih3aWR0aCAlZClcbiIsIGZpZWxkLT53aWR0aCk7Ci0KLSAgaWYgKGZpZWxkLT5pc19pbnQpCi0gICAgZHVtcGYoaW5kZW50LCAiKGlzX2ludCAlZClcbiIsIGZpZWxkLT52YWxfaW50KTsKLQotICBpZiAoZmllbGQtPmlzX3NsYXNoKQotICAgIGR1bXBmKGluZGVudCwgIihpc19zbGFzaClcbiIpOwotCi0gIGlmIChmaWVsZC0+aXNfc3RyaW5nKQotICAgIGR1bXBmKGluZGVudCwgIihpc19zdHJpbmcgYCVzJylcbiIsIGZpZWxkLT52YWxfc3RyaW5nKTsKLSAgCi0gIGR1bXBmKGluZGVudCwgIihuZXh0IDB4JXgpXG4iLCBmaWVsZC0+bmV4dCk7Ci0gIAotICBkdW1wZihpbmRlbnQsICIocHJldiAweCV4KVxuIiwgZmllbGQtPnByZXYpOwotICAKLQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9pbnNuX2ZpZWxkcyhpbnNuX2ZpZWxkcyAqZmllbGRzLAotCQkgaW50IGluZGVudCkKLXsKLSAgaW50IGk7Ci0KLSAgcHJpbnRmKCIoaW5zbl9maWVsZHMqKSVwXG4iLCBmaWVsZHMpOwotCi0gIGR1bXBmKGluZGVudCwgIihmaXJzdCAweCV4KVxuIiwgZmllbGRzLT5maXJzdCk7Ci0gIGR1bXBmKGluZGVudCwgIihsYXN0IDB4JXgpXG4iLCBmaWVsZHMtPmxhc3QpOwotCi0gIGR1bXBmKGluZGVudCwgIih2YWx1ZSAweCV4KVxuIiwgZmllbGRzLT52YWx1ZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluc25fYml0X3NpemU7IGkrKykgewotICAgIGR1bXBmKGluZGVudCwgIihiaXRzWyVkXSAiLCBpLCBmaWVsZHMtPmJpdHNbaV0pOwotICAgIGR1bXBfaW5zbl9maWVsZChmaWVsZHMtPmJpdHNbaV0sIGluZGVudCsxKTsKLSAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7Ci0gIH0KLQotfQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX29wY29kZV9maWVsZChvcGNvZGVfZmllbGQgKmZpZWxkLCBpbnQgaW5kZW50LCBpbnQgbGV2ZWxzKQotewotICBwcmludGYoIihvcGNvZGVfZmllbGQqKSVwXG4iLCBmaWVsZCk7Ci0gIGlmIChsZXZlbHMgJiYgZmllbGQgIT0gTlVMTCkgewotICAgIGR1bXBmKGluZGVudCwgIihmaXJzdCAlZClcbiIsIGZpZWxkLT5maXJzdCk7Ci0gICAgZHVtcGYoaW5kZW50LCAiKGxhc3QgJWQpXG4iLCBmaWVsZC0+bGFzdCk7Ci0gICAgZHVtcGYoaW5kZW50LCAiKGlzX2Jvb2xlYW4gJWQpXG4iLCBmaWVsZC0+aXNfYm9vbGVhbik7Ci0gICAgZHVtcGYoaW5kZW50LCAiKHBhcmVudCAiKTsKLSAgICBkdW1wX29wY29kZV9maWVsZChmaWVsZC0+cGFyZW50LCBpbmRlbnQsIGxldmVscy0xKTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2luc25fYml0cyhpbnNuX2JpdHMgKmJpdHMsIGludCBpbmRlbnQsIGludCBsZXZlbHMpCi17Ci0gIHByaW50ZigiKGluc25fYml0cyopJXBcbiIsIGJpdHMpOwotCi0gIGlmIChsZXZlbHMgJiYgYml0cyAhPSBOVUxMKSB7Ci0gICAgZHVtcGYoaW5kZW50LCAiKHZhbHVlICVkKVxuIiwgYml0cy0+dmFsdWUpOwotICAgIGR1bXBmKGluZGVudCwgIihvcGNvZGUgIik7Ci0gICAgZHVtcF9vcGNvZGVfZmllbGQoYml0cy0+b3Bjb2RlLCBpbmRlbnQrMSwgMCk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotICAgIGR1bXBmKGluZGVudCwgIihmaWVsZCAiKTsKLSAgICBkdW1wX2luc25fZmllbGQoYml0cy0+ZmllbGQsIGluZGVudCsxKTsKLSAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7Ci0gICAgZHVtcGYoaW5kZW50LCAiKGxhc3QgIik7Ci0gICAgZHVtcF9pbnNuX2JpdHMoYml0cy0+bGFzdCwgaW5kZW50KzEsIGxldmVscy0xKTsKLSAgfQotfQotCi0KLQotc3RhdGljIHZvaWQKLWR1bXBfaW5zbihpbnNuICplbnRyeSwgaW50IGluZGVudCwgaW50IGxldmVscykKLXsKLSAgcHJpbnRmKCIoaW5zbiopJXBcbiIsIGVudHJ5KTsKLQotICBpZiAobGV2ZWxzICYmIGVudHJ5ICE9IE5VTEwpIHsKLQotICAgIGR1bXBmKGluZGVudCwgIihmaWxlX2VudHJ5ICIpOwotICAgIGR1bXBfdGFibGVfZW50cnkoZW50cnktPmZpbGVfZW50cnksIGluZGVudCsxKTsKLSAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7Ci0KLSAgICBkdW1wZihpbmRlbnQsICIoZmllbGRzICIpOwotICAgIGR1bXBfaW5zbl9maWVsZHMoZW50cnktPmZpZWxkcywgaW5kZW50KzEpOwotICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKLQotICAgIGR1bXBmKGluZGVudCwgIihuZXh0ICIpOwotICAgIGR1bXBfaW5zbihlbnRyeS0+bmV4dCwgaW5kZW50KzEsIGxldmVscy0xKTsKLSAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7Ci0KLSAgfQotCi19Ci0KLQotc3RhdGljIHZvaWQKLWR1bXBfaW5zbl90YWJsZShpbnNuX3RhYmxlICp0YWJsZSwKLQkJaW50IGluZGVudCwgaW50IGxldmVscykKLXsKLQotICBwcmludGYoIihpbnNuX3RhYmxlKiklcFxuIiwgdGFibGUpOwotCi0gIGlmIChsZXZlbHMgJiYgdGFibGUgIT0gTlVMTCkgewotCi0gICAgZHVtcGYoaW5kZW50LCAiKG9wY29kZV9uciAlZClcbiIsIHRhYmxlLT5vcGNvZGVfbnIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKGV4cGFuZGVkX2JpdHMgIik7Ci0gICAgZHVtcF9pbnNuX2JpdHModGFibGUtPmV4cGFuZGVkX2JpdHMsIGluZGVudCsxLCAtMSk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKGludCBucl9pbnNuICVkKVxuIiwgdGFibGUtPm5yX2luc24pOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKGluc25zICIpOwotICAgIGR1bXBfaW5zbih0YWJsZS0+aW5zbnMsIGluZGVudCsxLCB0YWJsZS0+bnJfaW5zbik7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKG9wY29kZV9ydWxlICIpOwotICAgIGR1bXBfZGVjb2RlX3J1bGUodGFibGUtPm9wY29kZV9ydWxlLCBpbmRlbnQrMSk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKG9wY29kZSAiKTsKLSAgICBkdW1wX29wY29kZV9maWVsZCh0YWJsZS0+b3Bjb2RlLCBpbmRlbnQrMSwgMSk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKG5yX2VudHJpZXMgJWQpXG4iLCB0YWJsZS0+ZW50cmllcyk7Ci0gICAgZHVtcGYoaW5kZW50LCAiKGVudHJpZXMgIik7Ci0gICAgZHVtcF9pbnNuX3RhYmxlKHRhYmxlLT5lbnRyaWVzLCBpbmRlbnQrMSwgdGFibGUtPm5yX2VudHJpZXMpOwotICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKLQotICAgIGR1bXBmKGluZGVudCwgIihzaWJsaW5nICIsIHRhYmxlLT5zaWJsaW5nKTsKLSAgICBkdW1wX2luc25fdGFibGUodGFibGUtPnNpYmxpbmcsIGluZGVudCsxLCBsZXZlbHMtMSk7Ci0gICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKHBhcmVudCAiLCB0YWJsZS0+cGFyZW50KTsKLSAgICBkdW1wX2luc25fdGFibGUodGFibGUtPnBhcmVudCwgaW5kZW50KzEsIDApOwotICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKLQotICB9Ci19Ci0KLWludCBpbnNuX2JpdF9zaXplID0gbWF4X2luc25fYml0X3NpemU7Ci1pbnQgaGlfYml0X25yOwotaW50IGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9uczsKLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgZmlsdGVyICpmaWx0ZXJzID0gTlVMTDsKLSAgZGVjb2RlX3RhYmxlICpkZWNvZGVfcnVsZXMgPSBOVUxMOwotICBpbnNuX3RhYmxlICppbnN0cnVjdGlvbnMgPSBOVUxMOwotCi0gIGlmIChhcmdjICE9IDUpCi0gICAgZXJyb3IoIlVzYWdlOiBpbnNuIDxmaWx0ZXI+IDxoaS1iaXQtbnI+IDxkZWNvZGUtdGFibGU+IDxpbnNuLXRhYmxlPlxuIik7Ci0KLSAgZmlsdGVycyA9IG5ld19maWx0ZXIoYXJndlsxXSwgZmlsdGVycyk7Ci0gIGhpX2JpdF9uciA9IGEyaShhcmd2WzJdKTsKLSAgQVNTRVJUKGhpX2JpdF9uciA8IGluc25fYml0X3NpemUpOwotICBkZWNvZGVfcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZShhcmd2WzNdLCBoaV9iaXRfbnIpOwotICBpbnN0cnVjdGlvbnMgPSBsb2FkX2luc25fdGFibGUoYXJndls0XSwgZGVjb2RlX3J1bGVzLCBmaWx0ZXJzKTsKLSAgaW5zbl90YWJsZV9leHBhbmRfaW5zbnMoaW5zdHJ1Y3Rpb25zKTsKLQotICBkdW1wX2luc25fdGFibGUoaW5zdHJ1Y3Rpb25zLCAwLCAtMSk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtaW5zbi5oIGIvc2ltL3BwYy9sZC1pbnNuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDBmMGQuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9sZC1pbnNuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotLyoKLSMgICAtLQotIwotIwotIyBGaWVsZHM6Ci0jCi0jCTEJSW5zdHJ1Y3Rpb24gZm9ybWF0IGFzIGEgYHN0YXJ0LWJpdCxjb250ZW50JyBwYWlycy4KLSMJCXRoZSBjb250ZW50IGlzIG9uZSBvZiBhIGRpZ2l0LCBmaWVsZCBuYW1lIG9yIGAvJyAoYWthLjApCi0jCi0jCTIJRm9ybWF0IHNwZWNpZmllcgotIwotIwkzCUZsYWdzOgk2NCAtIDY0Yml0IG9ubHkKLSMJCQlmIC0gZmxvYXRpbmcgcG9pbnQgZW5hYmxlZCByZXF1aXJlZAotIwotIwk0IAlzaG9ydCBuYW1lCi0jCi0jCTUJRGVzY3JpcHRpb24KLSMKLSMKLSMgRm9yIGZsYWdzIG1hcmtlZCAnbW9kZWwnLCB0aGUgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgotIwotIwkxCU5vdCB1c2VkCi0jCi0jCTIJTm90IHVzZWQKLSMKLSMJMwkibWFjcm8iCi0jCi0jCTQJU3RyaW5nIG5hbWUgZm9yIG1vZGVsCi0jCi0jCTUJU3BlY2lmaWMgQ1BVIG1vZGVsLCBtdXN0IGJlIGFuIGlkZW50aWZpZXIKLSMKLSMJNglDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmdW5jdGlvbmFsIHVuaXRzCi0KLSovCi0KLQotLyogR2xvYmFsIGNvbnN0YW50cyAqLwotCi1lbnVtIHsKLSAgbWF4X2luc25fYml0X3NpemUgPSAzMiwKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2luc25fZmllbGQgaW5zbl9maWVsZDsKLXN0cnVjdCBfaW5zbl9maWVsZCB7Ci0gIGludCBmaXJzdDsKLSAgaW50IGxhc3Q7Ci0gIGludCB3aWR0aDsKLSAgaW50IGlzX2ludDsKLSAgaW50IGlzX3NsYXNoOwotICBpbnQgaXNfc3RyaW5nOwotICBpbnQgdmFsX2ludDsKLSAgY2hhciAqcG9zX3N0cmluZzsKLSAgY2hhciAqdmFsX3N0cmluZzsKLSAgaW5zbl9maWVsZCAqbmV4dDsKLSAgaW5zbl9maWVsZCAqcHJldjsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9pbnNuX2ZpZWxkcyBpbnNuX2ZpZWxkczsKLXN0cnVjdCBfaW5zbl9maWVsZHMgewotICBpbnNuX2ZpZWxkICpiaXRzW21heF9pbnNuX2JpdF9zaXplXTsKLSAgaW5zbl9maWVsZCAqZmlyc3Q7Ci0gIGluc25fZmllbGQgKmxhc3Q7Ci0gIHVuc2lnbmVkIHZhbHVlOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX29wY29kZV9maWVsZCBvcGNvZGVfZmllbGQ7Ci1zdHJ1Y3QgX29wY29kZV9maWVsZCB7Ci0gIGludCBmaXJzdDsKLSAgaW50IGxhc3Q7Ci0gIGludCBpc19ib29sZWFuOwotICB1bnNpZ25lZCBib29sZWFuX2NvbnN0YW50OwotICBvcGNvZGVfZmllbGQgKnBhcmVudDsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IF9pbnNuX2JpdHMgaW5zbl9iaXRzOwotc3RydWN0IF9pbnNuX2JpdHMgewotICBpbnQgaXNfZXhwYW5kZWQ7Ci0gIGludCB2YWx1ZTsKLSAgaW5zbl9maWVsZCAqZmllbGQ7Ci0gIG9wY29kZV9maWVsZCAqb3Bjb2RlOwotICBpbnNuX2JpdHMgKmxhc3Q7Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGluc25fZm9ybWF0LAotICBpbnNuX2Zvcm0sCi0gIGluc25fZmxhZ3MsCi0gIGluc25fbW5lbW9uaWMsCi0gIGluc25fbmFtZSwKLSAgaW5zbl9jb21tZW50LAotICBucl9pbnNuX3RhYmxlX2ZpZWxkcwotfSBpbnNuX3RhYmxlX2ZpZWxkczsKLQotdHlwZWRlZiBlbnVtIHsKLSAgZnVuY3Rpb25fdHlwZSA9IGluc25fZm9ybWF0LAotICBmdW5jdGlvbl9uYW1lID0gaW5zbl9uYW1lLAotICBmdW5jdGlvbl9wYXJhbSA9IGluc25fY29tbWVudAotfSBmdW5jdGlvbl90YWJsZV9maWVsZHM7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIG1vZGVsX25hbWUgPSBpbnNuX21uZW1vbmljLAotICBtb2RlbF9pZGVudGlmZXIgPSBpbnNuX25hbWUsCi0gIG1vZGVsX2RlZmF1bHQgPSBpbnNuX2NvbW1lbnQsCi19IG1vZGVsX3RhYmxlX2ZpZWxkczsKLQotdHlwZWRlZiBzdHJ1Y3QgX2luc24gaW5zbjsKLXN0cnVjdCBfaW5zbiB7Ci0gIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5OwotICBpbnNuX2ZpZWxkcyAqZmllbGRzOwotICBpbnNuICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2luc25fdW5kZWYgaW5zbl91bmRlZjsKLXN0cnVjdCBfaW5zbl91bmRlZiB7Ci0gIGluc25fdW5kZWYgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfbW9kZWwgbW9kZWw7Ci1zdHJ1Y3QgX21vZGVsIHsKLSAgbW9kZWwgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnByaW50YWJsZV9uYW1lOwotICBjaGFyICppbnNuX2RlZmF1bHQ7Ci0gIHRhYmxlX21vZGVsX2VudHJ5ICpmdW5jX3VuaXRfc3RhcnQ7Ci0gIHRhYmxlX21vZGVsX2VudHJ5ICpmdW5jX3VuaXRfZW5kOwotfTsKLSAgCi10eXBlZGVmIHN0cnVjdCBfaW5zbl90YWJsZSBpbnNuX3RhYmxlOwotc3RydWN0IF9pbnNuX3RhYmxlIHsKLSAgaW50IG9wY29kZV9ucjsKLSAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzOwotICBpbnQgbnJfaW5zbjsKLSAgaW5zbiAqaW5zbnM7Ci0gIGluc24gKmZ1bmN0aW9uczsKLSAgaW5zbiAqbGFzdF9mdW5jdGlvbjsKLSAgZGVjb2RlX3RhYmxlICpvcGNvZGVfcnVsZTsKLSAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7Ci0gIGludCBucl9lbnRyaWVzOwotICBpbnNuX3RhYmxlICplbnRyaWVzOwotICBpbnNuX3RhYmxlICpzaWJsaW5nOwotICBpbnNuX3RhYmxlICpwYXJlbnQ7Ci19OwotCi10eXBlZGVmIGVudW0gewotICBpbnNuX21vZGVsX25hbWUsCi0gIGluc25fbW9kZWxfZmllbGRzLAotICBucl9pbnNuX21vZGVsX3RhYmxlX2ZpZWxkcwotfSBpbnNuX21vZGVsX3RhYmxlX2ZpZWxkczsKLQotCi1leHRlcm4gaW5zbl90YWJsZSAqbG9hZF9pbnNuX3RhYmxlCi0oY29uc3QgY2hhciAqZmlsZV9uYW1lLAotIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzLAotIGZpbHRlciAqZmlsdGVycyk7Ci0KLW1vZGVsICptb2RlbHM7Ci1tb2RlbCAqbGFzdF9tb2RlbDsKLQotaW5zbiAqbW9kZWxfbWFjcm9zOwotaW5zbiAqbGFzdF9tb2RlbF9tYWNybzsKLQotaW5zbiAqbW9kZWxfZnVuY3Rpb25zOwotaW5zbiAqbGFzdF9tb2RlbF9mdW5jdGlvbjsKLQotaW5zbiAqbW9kZWxfaW50ZXJuYWw7Ci1pbnNuICpsYXN0X21vZGVsX2ludGVybmFsOwotCi1pbnNuICptb2RlbF9zdGF0aWM7Ci1pbnNuICpsYXN0X21vZGVsX3N0YXRpYzsKLQotaW5zbiAqbW9kZWxfZGF0YTsKLWluc24gKmxhc3RfbW9kZWxfZGF0YTsKLQotaW50IG1heF9tb2RlbF9maWVsZHNfbGVuOwotCi1leHRlcm4gdm9pZCBpbnNuX3RhYmxlX2luc2VydF9pbnNuCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gdGFibGVfZW50cnkgKmZpbGVfZW50cnksCi0gaW5zbl9maWVsZHMgKmZpZWxkcyk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHZvaWQgbGVhZl9oYW5kbGVyCi0oaW5zbl90YWJsZSAqZW50cnksCi0gbGYgKmZpbGUsCi0gdm9pZCAqZGF0YSwKLSBpbnQgZGVwdGgpOwotCi10eXBlZGVmIHZvaWQgaW5zbl9oYW5kbGVyCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUsCi0gdm9pZCAqZGF0YSwKLSBpbnNuICppbnN0cnVjdGlvbiwKLSBpbnQgZGVwdGgpOwotCi10eXBlZGVmIHZvaWQgcGFkZGluZ19oYW5kbGVyCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUsCi0gdm9pZCAqZGF0YSwKLSBpbnQgZGVwdGgsCi0gaW50IG9wY29kZV9ucik7Ci0KLQotZXh0ZXJuIHZvaWQgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUsCi0gdm9pZCAqZGF0YSwKLSBpbnQgZGVwdGgsCi0gbGVhZl9oYW5kbGVyICpzdGFydCwKLSBpbnNuX2hhbmRsZXIgKmhhbmRsZXIsCi0gbGVhZl9oYW5kbGVyICplbmQsCi0gcGFkZGluZ19oYW5kbGVyICpwYWRkaW5nKTsKLQotCi1leHRlcm4gdm9pZCBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24KLShpbnNuX3RhYmxlICp0YWJsZSwKLSBsZiAqZmlsZSwKLSB2b2lkICpkYXRhLAotIGluc25faGFuZGxlciAqaGFuZGxlcik7Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB2b2lkIGZ1bmN0aW9uX2hhbmRsZXIKLShpbnNuX3RhYmxlICp0YWJsZSwKLSBsZiAqZmlsZSwKLSB2b2lkICpkYXRhLAotIHRhYmxlX2VudHJ5ICpmdW5jdGlvbik7Ci0KLWV4dGVybiB2b2lkCi1pbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uCi0oaW5zbl90YWJsZSAqdGFibGUsCi0gbGYgKmZpbGUsCi0gdm9pZCAqZGF0YSwKLSBmdW5jdGlvbl9oYW5kbGVyICpsZWFmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1leHRlcm4gdm9pZCBpbnNuX3RhYmxlX2V4cGFuZF9pbnNucwotKGluc25fdGFibGUgKnRhYmxlKTsKLQotZXh0ZXJuIGludCBpbnNuX3RhYmxlX2RlcHRoCi0oaW5zbl90YWJsZSAqdGFibGUpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9sZi5jIGIvc2ltL3BwYy9sZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQyMDE1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi1zdHJ1Y3QgX2xmIHsKLSAgRklMRSAqc3RyZWFtOwotICBpbnQgbGluZV9ucjsgLyogbnIgY29tcGxldGUgbGluZXMgd3JpdHRlbiwgY3VyciBsaW5lIGlzIGxpbmVfbnIrMSAqLwotICBpbnQgaW5kZW50OwotICBpbnQgbGluZV9ibGFuazsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgbGZfZmlsZV9yZWZlcmVuY2VzIHJlZmVyZW5jZXM7Ci0gIGxmX2ZpbGVfdHlwZSB0eXBlOwotfTsKLQotCi1sZiAqCi1sZl9vcGVuKGNoYXIgKm5hbWUsCi0JY2hhciAqcmVhbF9uYW1lLAotCWxmX2ZpbGVfcmVmZXJlbmNlcyByZWZlcmVuY2VzLAotCWxmX2ZpbGVfdHlwZSB0eXBlLAotCWNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gIC8qIGNyZWF0ZSBhIGZpbGUgb2JqZWN0ICovCi0gIGxmICpuZXdfbGYgPSBaQUxMT0MobGYpOwotICBBU1NFUlQobmV3X2xmICE9IE5VTEwpOwotICBuZXdfbGYtPnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOwotICBuZXdfbGYtPnR5cGUgPSB0eXBlOwotICBuZXdfbGYtPm5hbWUgPSAocmVhbF9uYW1lID09IE5VTEwgPyBuYW1lIDogcmVhbF9uYW1lKTsKLSAgbmV3X2xmLT5wcm9ncmFtID0gcHJvZ3JhbTsKLSAgLyogYXR0YWNoIHRvIHN0ZG91dCBpZiBwaXBlICovCi0gIGlmICghc3RyY21wKG5hbWUsICItIikpIHsKLSAgICBuZXdfbGYtPnN0cmVhbSA9IHN0ZG91dDsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBjcmVhdGUgYSBuZXcgZmlsZSAqLwotICAgIG5ld19sZi0+c3RyZWFtID0gZm9wZW4obmFtZSwgInciKTsKLSAgICBpZiAobmV3X2xmLT5zdHJlYW0gPT0gTlVMTCkgewotICAgICAgcGVycm9yKG5hbWUpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5ld19sZjsKLX0KLQotCi12b2lkCi1sZl9jbG9zZShsZiAqZmlsZSkKLXsKLSAgaWYgKGZpbGUtPnN0cmVhbSAhPSBzdGRvdXQpIHsKLSAgICBpZiAoZmNsb3NlKGZpbGUtPnN0cmVhbSkpIHsKLSAgICAgIHBlcnJvcigibGZfY2xvc2UuZmNsb3NlIik7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBmcmVlKGZpbGUpOwotICB9Ci19Ci0KLQotaW50Ci1sZl9wdXRjaHIobGYgKmZpbGUsCi0JICBjb25zdCBjaGFyIGNocikKLXsKLSAgaW50IG5yID0gMDsKLSAgaWYgKGNociA9PSAnXG4nKSB7Ci0gICAgZmlsZS0+bGluZV9uciArPSAxOwotICAgIGZpbGUtPmxpbmVfYmxhbmsgPSAxOwotICB9Ci0gIGVsc2UgaWYgKGZpbGUtPmxpbmVfYmxhbmspIHsKLSAgICBpbnQgcGFkOwotICAgIGZvciAocGFkID0gZmlsZS0+aW5kZW50OyBwYWQgPiAwOyBwYWQtLSkKLSAgICAgIHB1dGMoJyAnLCBmaWxlLT5zdHJlYW0pOwotICAgIG5yICs9IGZpbGUtPmluZGVudDsKLSAgICBmaWxlLT5saW5lX2JsYW5rID0gMDsKLSAgfQotICBwdXRjKGNociwgZmlsZS0+c3RyZWFtKTsKLSAgbnIgKz0gMTsKLSAgcmV0dXJuIG5yOwotfQotCi12b2lkCi1sZl9pbmRlbnRfc3VwcHJlc3MobGYgKmZpbGUpCi17Ci0gIGZpbGUtPmxpbmVfYmxhbmsgPSAwOwotfQotCi0KLWludAotbGZfcHV0c3RyKGxmICpmaWxlLAotCSAgY29uc3QgY2hhciAqc3RyaW5nKQotewotICBpbnQgbnIgPSAwOwotICBjb25zdCBjaGFyICpjaHA7Ci0gIGlmIChzdHJpbmcgIT0gTlVMTCkgewotICAgIGZvciAoY2hwID0gc3RyaW5nOyAqY2hwICE9ICdcMCc7IGNocCsrKSB7Ci0gICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgKmNocCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucjsKLX0KLQotc3RhdGljIGludAotZG9fbGZfcHV0dW5zaWduZWQobGYgKmZpbGUsCi0JICAgICAgdW5zaWduZWQgdSkKLXsKLSAgaW50IG5yID0gMDsKLSAgaWYgKHUgPiAwKSB7Ci0gICAgbnIgKz0gZG9fbGZfcHV0dW5zaWduZWQoZmlsZSwgdSAvIDEwKTsKLSAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgKHUgJSAxMCkgKyAnMCcpOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotCi1pbnQKLWxmX3B1dGludChsZiAqZmlsZSwKLQkgIGludCBkZWNpbWFsKQotewotICBpbnQgbnIgPSAwOwotICBpZiAoZGVjaW1hbCA9PSAwKQotICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnMCcpOwotICBlbHNlIGlmIChkZWNpbWFsIDwgMCkgewotICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnLScpOwotICAgIG5yICs9IGRvX2xmX3B1dHVuc2lnbmVkKGZpbGUsIC1kZWNpbWFsKTsKLSAgfQotICBlbHNlIGlmIChkZWNpbWFsID4gMCkgewotICAgIG5yICs9IGRvX2xmX3B1dHVuc2lnbmVkKGZpbGUsIGRlY2ltYWwpOwotICB9Ci0gIGVsc2UKLSAgICBBU1NFUlQoMCk7Ci0gIHJldHVybiBucjsKLX0KLQotCi1pbnQKLWxmX3ByaW50ZihsZiAqZmlsZSwKLQkgIGNvbnN0IGNoYXIgKmZtdCwKLQkgIC4uLikKLXsKLSAgaW50IG5yID0gMDsKLSAgY2hhciBidWZbMTAyNF07Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIHZzcHJpbnRmKGJ1ZiwgZm10LCBhcCk7Ci0gIC8qIEZJWE1FIC0gdGhpcyBpcyByZWFsbHkgc3R1ZmZlZCBidXQgc28gaXMgdnNwcmludGYoKSBvbiBhIHN1biEgKi8KLSAgQVNTRVJUKHN0cmxlbihidWYpID4gMCAmJiBzdHJsZW4oYnVmKSA8IHNpemVvZihidWYpKTsKLSAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsIGJ1Zik7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBucjsKLX0KLQotCi1pbnQKLWxmX3ByaW50X19jX2NvZGUobGYgKmZpbGUsCi0JCSBjb25zdCBjaGFyICpjb2RlKQotewotICBpbnQgbnIgPSAwOwotICBjb25zdCBjaGFyICpjaHAgPSBjb2RlOwotICBpbnQgaW5fYml0X2ZpZWxkID0gMDsKLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJykgewotICAgIGlmICgqY2hwID09ICdcdCcpCi0gICAgICBjaHArKzsKLSAgICBpZiAoKmNocCA9PSAnIycpCi0gICAgICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7Ci0gICAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiAqY2hwICE9ICdcbicpIHsKLSAgICAgIGlmIChjaHBbMF0gPT0gJ3snICYmICFpc3NwYWNlKGNocFsxXSkpIHsKLQlpbl9iaXRfZmllbGQgPSAxOwotCW5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5fYml0X2ZpZWxkICYmIGNocFswXSA9PSAnOicpIHsKLQluciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGluX2JpdF9maWVsZCAmJiAqY2hwID09ICd9JykgewotCW5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOwotCWluX2JpdF9maWVsZCA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQluciArPSBsZl9wdXRjaHIoZmlsZSwgKmNocCk7Ci0gICAgICB9Ci0gICAgICBjaHArKzsKLSAgICB9Ci0gICAgaWYgKGluX2JpdF9maWVsZCkKLSAgICAgIGVycm9yKCJiaXQgZmllbGQgcGFyZW4gbWlzcyBtYXRjaCBzb21lIHdoZXJlXG4iKTsKLSAgICBpZiAoKmNocCA9PSAnXG4nKSB7Ci0gICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ1xuJyk7Ci0gICAgICBjaHArKzsKLSAgICB9Ci0gIH0KLSAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdcbicpOwotICByZXR1cm4gbnI7Ci19Ci0KLQotaW50Ci1sZl9wcmludF9fZXh0ZXJuYWxfcmVmZXJlbmNlKGxmICpmaWxlLAotCQkJICAgICBpbnQgbGluZV9uciwKLQkJCSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQotewotICBpbnQgbnIgPSAwOwotICBzd2l0Y2ggKGZpbGUtPnJlZmVyZW5jZXMpIHsKLSAgY2FzZSBsZl9pbmNsdWRlX3JlZmVyZW5jZXM6Ci0gICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOwotICAgIG5yICs9IGxmX3B1dHN0cihmaWxlLCAiI2xpbmUgIik7Ci0gICAgbnIgKz0gbGZfcHV0aW50KGZpbGUsIGxpbmVfbnIpOwotICAgIG5yICs9IGxmX3B1dHN0cihmaWxlLCAiIFwiIik7Ci0gICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsIGZpbGVfbmFtZSk7Ci0gICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICJcIlxuIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgbGZfb21pdF9yZWZlcmVuY2VzOgotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGxmICpmaWxlKQotewotICBpbnQgbnIgPSAwOwotICBuciArPSBsZl9wcmludF9fZXh0ZXJuYWxfcmVmZXJlbmNlKGZpbGUsIGZpbGUtPmxpbmVfbnIrMiwgZmlsZS0+bmFtZSk7Ci0gIC8qIGxpbmVfbnIgPT0gbGFzdF9saW5lLCB3YW50IHRvIG51bWJlciBmcm9tIG5leHQgKi8KLSAgcmV0dXJuIG5yOwotfQotCi12b2lkCi1sZl9pbmRlbnQobGYgKmZpbGUsIGludCBkZWx0YSkKLXsKLSAgZmlsZS0+aW5kZW50ICs9IGRlbHRhOwotfQotCi0KLWludAotbGZfcHJpbnRfX2dudV9jb3B5bGVmdChsZiAqZmlsZSkKLXsKLSAgaW50IG5yID0gMDsKLSAgc3dpdGNoIChmaWxlLT50eXBlKSB7Ci0gIGNhc2UgbGZfaXNfYzoKLSAgY2FzZSBsZl9pc19oOgotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiXAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgIC0tCi0KLSAgICBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSAlcyAqLwotIiwgZmlsdGVyX2ZpbGVuYW1lKGZpbGUtPnByb2dyYW0pKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBBU1NFUlQoMCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIG5yOwotfQotCi0KLWludAotbGZfcHV0YmluKGxmICpmaWxlLCBpbnQgZGVjaW1hbCwgaW50IHdpZHRoKQotewotICBpbnQgbnIgPSAwOwotICBpbnQgYml0OwotICBBU1NFUlQod2lkdGggPiAwKTsKLSAgZm9yIChiaXQgPSAxIDw8ICh3aWR0aC0xKTsgYml0ICE9IDA7IGJpdCA+Pj0gMSkgewotICAgIGlmIChkZWNpbWFsICYgYml0KQotICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICcxJyk7Ci0gICAgZWxzZQotICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICcwJyk7Ci0gIH0KLSAgcmV0dXJuIG5yOwotfQotCi1pbnQKLWxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkobGYgKmZpbGUpCi17Ci0gIGludCBuciA9IDA7Ci0gIHN3aXRjaCAoZmlsZS0+dHlwZSkgewotICBjYXNlIGxmX2lzX2M6Ci0gIGNhc2UgbGZfaXNfaDoKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwKLQkJICAgICIvKiBUaGlzIGdlbmVyYXRlZCBmaWxlICglcykgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rICovXG4iLAotCQkgICAgZmlsZS0+bmFtZSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgQVNTRVJUKDApOwotICB9Ci0gIHJldHVybiBucjsKLX0KLQotaW50Ci1sZl9wcmludF9fdWNhc2VfZmlsZW5hbWUobGYgKmZpbGUpCi17Ci0gIGludCBuciA9IDA7Ci0gIGNvbnN0IGNoYXIgKmNocCA9IGZpbGUtPm5hbWU7Ci0gIHdoaWxlICgqY2hwICE9ICdcMCcpIHsKLSAgICBjaGFyIGNoID0gKmNocDsKLSAgICBpZiAoaXNsb3dlcihjaCkpIHsKLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCB0b3VwcGVyKGNoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoID09ICcuJykKLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOwotICAgIGVsc2UKLSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCBjaCk7Ci0gICAgY2hwKys7Ci0gIH0KLSAgcmV0dXJuIG5yOwotfQotCi1pbnQKLWxmX3ByaW50X19maWxlX3N0YXJ0KGxmICpmaWxlKQotewotICBpbnQgbnIgPSAwOwotICBzd2l0Y2ggKGZpbGUtPnR5cGUpIHsKLSAgY2FzZSBsZl9pc19oOgotICBjYXNlIGxmX2lzX2M6Ci0gICAgbnIgKz0gbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICIjaWZuZGVmIF8iKTsKLSAgICBuciArPSBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJfXG4iKTsKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgXyIpOwotICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIl9cbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBBU1NFUlQoMCk7Ci0gIH0KLSAgcmV0dXJuIG5yOwotfQotCi0KLWludAotbGZfcHJpbnRfX2ZpbGVfZmluaXNoKGxmICpmaWxlKQotewotICBpbnQgbnIgPSAwOwotICBzd2l0Y2ggKGZpbGUtPnR5cGUpIHsKLSAgY2FzZSBsZl9pc19oOgotICBjYXNlIGxmX2lzX2M6Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmIC8qIF8iKTsKLSAgICBuciArPSBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUoZmlsZSk7Ci0gICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJfKi9cbiIpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEFTU0VSVCgwKTsKLSAgfQotICByZXR1cm4gbnI7Ci19Ci0KLQotaW50Ci1sZl9wcmludF9mdW5jdGlvbl90eXBlKGxmICpmaWxlLAotCQkgICAgICAgY29uc3QgY2hhciAqdHlwZSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnRyYWlsaW5nX3NwYWNlKQotewotICBpbnQgbnIgPSAwOwotICBuciArPSBsZl9wcmludGYoZmlsZSwgIiVzXFxcbiglcykiLCBwcmVmaXgsIHR5cGUpOwotICBpZiAodHJhaWxpbmdfc3BhY2UgIT0gTlVMTCkKLSAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIiVzIiwgdHJhaWxpbmdfc3BhY2UpOwotI2lmIDAKLSAgY29uc3QgY2hhciAqdHlwZV9wb2ludGVyID0gc3RycmNocih0eXBlLCAnKicpOwotICBpbnQgdHlwZV9wb2ludGVyX29mZnNldCA9ICh0eXBlX3BvaW50ZXIgIT0gTlVMTAotCQkJICAgICA/IHR5cGVfcG9pbnRlciAtIHR5cGUKLQkJCSAgICAgOiAwKTsKLSAgaWYgKHR5cGVfcG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIlcyAlcyIsIHR5cGUsIHByZWZpeCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciAqbXVuZ2VkX3R5cGUgPSAoY2hhciopemFsbG9jKHN0cmxlbih0eXBlKQotCQkJCSAgICAgICsgc3RybGVuKHByZWZpeCkKLQkJCQkgICAgICArIHN0cmxlbigiICogIikKLQkJCQkgICAgICArIDEpOwotICAgIHN0cmNweShtdW5nZWRfdHlwZSwgdHlwZSk7Ci0gICAgbXVuZ2VkX3R5cGVbdHlwZV9wb2ludGVyX29mZnNldF0gPSAnXDAnOwotICAgIGlmICh0eXBlX3BvaW50ZXJfb2Zmc2V0ID4gMCAmJiB0eXBlW3R5cGVfcG9pbnRlcl9vZmZzZXQtMV0gIT0gJyAnKQotICAgICAgc3RyY2F0KG11bmdlZF90eXBlLCAiICIpOwotICAgIHN0cmNhdChtdW5nZWRfdHlwZSwgcHJlZml4KTsKLSAgICBzdHJjYXQobXVuZ2VkX3R5cGUsICIgIik7Ci0gICAgc3RyY2F0KG11bmdlZF90eXBlLCB0eXBlICsgdHlwZV9wb2ludGVyX29mZnNldCk7Ci0gICAgbGZfcHJpbnRmKGZpbGUsICIlcyIsIG11bmdlZF90eXBlKTsKLSAgICBmcmVlKG11bmdlZF90eXBlKTsKLSAgfQotICBpZiAodHJhaWxpbmdfc3BhY2UgIT0gTlVMTCAmJiB0eXBlX3BvaW50ZXJfb2Zmc2V0IDwgc3RybGVuKHR5cGUpIC0gMSkKLSAgICBsZl9wcmludGYoZmlsZSwgdHJhaWxpbmdfc3BhY2UpOwotI2VuZGlmCi0gIHJldHVybiBucjsKLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9sZi5oIGIvc2ltL3BwYy9sZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY2ZDFjLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0vKiBMRjogTGluZSBOdW1iZXJlZCBPdXRwdXQgU3RyZWFtICovCi0KLXR5cGVkZWYgc3RydWN0IF9sZiBsZjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgbGZfaXNfaCwKLSAgbGZfaXNfYywKLSAgbGZfaXNfdGV4dCwKLX0gbGZfZmlsZV90eXBlOwotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGxmX2luY2x1ZGVfcmVmZXJlbmNlcywKLSAgbGZfb21pdF9yZWZlcmVuY2VzLAotfSBsZl9maWxlX3JlZmVyZW5jZXM7Ci0KLQotLyogT3BlbiB0aGUgZmlsZSBOQU1FIGZvciB3cml0aW5nLiAgUkVBTF9OQU1FIGlzIHRvIGJlIGluY2x1ZGVkIGluIGFueQotICAgbGluZSBudW1iZXIgb3V0cHV0cy4gIFRoZSBvdXRwdXQgb2YgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gY2FuIGJlCi0gICBzdXBwcmVzc2VkIHdpdGggTElORV9OVU1CRVJTICovCi0KLWV4dGVybiBsZiAqbGZfb3BlbgotKGNoYXIgKm5hbWUsCi0gY2hhciAqcmVhbF9uYW1lLAotIGxmX2ZpbGVfcmVmZXJlbmNlcyBmaWxlX3JlZmVyZW5jZXMsCi0gbGZfZmlsZV90eXBlIHR5cGUsCi0gY29uc3QgY2hhciAqcHJvZ3JhbSk7Ci0KLWV4dGVybiB2b2lkIGxmX2Nsb3NlCi0obGYgKmZpbGUpOwotCi0KLS8qIEJhc2ljIG91dHB1dCBmdW5jdGlvbnMgKi8KLQotZXh0ZXJuIGludCBsZl9wdXRjaHIKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyIGNoKTsKLQotZXh0ZXJuIGludCBsZl9wdXRzdHIKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpzdHJpbmcpOwotCi1leHRlcm4gaW50IGxmX3B1dGludAotKGxmICpmaWxlLAotIGludCBkZWNpbWFsKTsKLQotZXh0ZXJuIGludCBsZl9wdXRiaW4KLShsZiAqZmlsZSwKLSBpbnQgZGVjaW1hbCwKLSBpbnQgd2lkdGgpOwotCi1leHRlcm4gaW50IGxmX3ByaW50ZgotKGxmICpmaWxlLAotIGNvbnN0IGNoYXIgKmZtdCwKLSAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Ci0KLQotLyogSW5kZW50YXRpb24gY29udHJvbC4KLQotICAgbGZfaW5kZW50X3N1cHByZXNzIHN1cHByZXNzZXMgaW5kZW50YXRpb24gb24gdGhlIG5leHQgbGluZSAoY3VycmVudAotICAgbGluZSBpZiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZCkgKi8KLQotZXh0ZXJuIHZvaWQgbGZfaW5kZW50X3N1cHByZXNzCi0obGYgKmZpbGUpOwotCi1leHRlcm4gdm9pZCBsZl9pbmRlbnQKLShsZiAqZmlsZSwKLSBpbnQgZGVsdGEpOwotCi0KLS8qIFByaW50IGdlbmVyaWMgdGV4dDogKi8KLQotCi1leHRlcm4gaW50IGxmX3ByaW50X19nbnVfY29weWxlZnQKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgbGZfcHJpbnRfX2ZpbGVfc3RhcnQKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eQotKGxmICpmaWxlKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9fZmlsZV9maW5pc2gKLShsZiAqZmlsZSk7Ci0KLWV4dGVybiBpbnQgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZQotKGxmICpmaWxlKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9fZXh0ZXJuYWxfcmVmZXJlbmNlCi0obGYgKmZpbGUsCi0gaW50IGxpbmVfbnIsCi0gY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKLQotZXh0ZXJuIGludCBsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUKLShsZiAqZmlsZSk7Ci0KLS8qIFRhYiBwcmVmaXggaXMgc3VwcHJlc3NlZCAqLwotCi1leHRlcm4gaW50IGxmX3ByaW50X19jX2NvZGUKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICpjb2RlKTsKLQotCi1leHRlcm4gaW50IGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUKLShsZiAqZmlsZSwKLSBjb25zdCBjaGFyICp0eXBlLAotIGNvbnN0IGNoYXIgKnByZWZpeCwKLSBjb25zdCBjaGFyICp0cmFpbGluZ19zcGFjZSk7CmRpZmYgLS1naXQgYS9zaW0vcHBjL21haW4uYyBiL3NpbS9wcGMvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjk0OGUwLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgInBzaW0uaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAiZGV2aWNlLmgiIC8qIEZJWE1FOiBwc2ltIHNob3VsZCBwcm92aWRlIHRoZSBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJldmVudHMuaCIgLyogRklYTUU6IHBzaW0gc2hvdWxkIHByb3ZpZGUgdGhlIGludGVyZmFjZSAqLwotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmICFkZWZpbmVkKE9fTkRFTEFZKSB8fCAhZGVmaW5lZChGX0dFVEZMKSB8fCAhZGVmaW5lZChGX1NFVEZMKQotI3VuZGVmIFdJVEhfU1RESU8KLSNkZWZpbmUgV0lUSF9TVERJTyBET19VU0VfU1RESU8KLSNlbmRpZgotCi0KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLQotc3RhdGljIHBzaW0gKnNpbXVsYXRpb24gPSBOVUxMOwotCi0KLXZvaWQKLXNpbV9pb19wb2xsX3F1aXQgKHZvaWQpCi17Ci0gIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotdm9pZAotc2ltX2lvX3ByaW50Zl9maWx0ZXJlZChjb25zdCBjaGFyICptc2csIC4uLikKLXsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1zZyk7Ci0gIHZwcmludGYobXNnLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQKLWVycm9yIChjb25zdCBjaGFyICptc2csIC4uLikKLXsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1zZyk7Ci0gIHZwcmludGYobXNnLCBhcCk7Ci0gIHByaW50ZigiXG4iKTsKLSAgdmFfZW5kKGFwKTsKLQotICAvKiBhbnkgZmluYWwgY2xlYW4gdXAgKi8KLSAgaWYgKHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSAmJiBzaW11bGF0aW9uICE9IE5VTEwpCi0gICAgcHNpbV9wcmludF9pbmZvIChzaW11bGF0aW9uLCBwcGNfdHJhY2VbdHJhY2VfcHJpbnRfaW5mb10pOwotCi0gIGV4aXQgKDEpOwotfQotCi1pbnQKLXNpbV9pb193cml0ZV9zdGRvdXQoY29uc3QgY2hhciAqYnVmLAotCQkgICAgaW50IHNpemVvZl9idWYpCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgewotICBjYXNlIERPX1VTRV9TVERJTzoKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2ZfYnVmOyBpKyspIHsKLQlwdXRjaGFyKGJ1ZltpXSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE9OVF9VU0VfU1RESU86Ci0gICAgcmV0dXJuIHdyaXRlKDEsIGJ1Ziwgc2l6ZW9mX2J1Zik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoInNpbV9pb193cml0ZV9zdGRvdXQ6IGludmFsaWQgc3dpdGNoXG4iKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1zaW1faW9fd3JpdGVfc3RkZXJyKGNvbnN0IGNoYXIgKmJ1ZiwKLQkJICAgIGludCBzaXplb2ZfYnVmKQotewotICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKLSAgY2FzZSBET19VU0VfU1RESU86Ci0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mX2J1ZjsgaSsrKSB7Ci0JZnB1dGMoYnVmW2ldLCBzdGRlcnIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotICAgIHJldHVybiB3cml0ZSgyLCBidWYsIHNpemVvZl9idWYpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGVycm9yKCJzaW1faW9fd3JpdGVfc3Rkb3V0OiBpbnZhbGlkIHN3aXRjaFxuIik7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotc2ltX2lvX3JlYWRfc3RkaW4oY2hhciAqYnVmLAotCQkgIGludCBzaXplb2ZfYnVmKQotewotICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKLSAgY2FzZSBET19VU0VfU1RESU86Ci0gICAgaWYgKHNpemVvZl9idWYgPiAxKSB7Ci0gICAgICBpZiAoZmdldHMoYnVmLCBzaXplb2ZfYnVmLCBzdGRpbikgIT0gTlVMTCkKLQlyZXR1cm4gc3RybGVuKGJ1Zik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNpemVvZl9idWYgPT0gMSkgewotICAgICAgY2hhciBiWzJdOwotICAgICAgaWYgKGZnZXRzKGIsIHNpemVvZihiKSwgc3RkaW4pICE9IE5VTEwpIHsKLQltZW1jcHkoYnVmLCBiLCBzdHJsZW4oYikpOwotCXJldHVybiBzdHJsZW4oYik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHNpemVvZl9idWYgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzaW1faW9fZW9mOwotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotI2lmIGRlZmluZWQoT19OREVMQVkpICYmIGRlZmluZWQoRl9HRVRGTCkgJiYgZGVmaW5lZChGX1NFVEZMKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGZvciBpbnB1dCAqLwotICAgICAgaW50IGZsYWdzOwotICAgICAgaW50IHN0YXR1czsKLSAgICAgIGludCBucl9yZWFkOwotICAgICAgaW50IHJlc3VsdDsKLSAgICAgIC8qIGdldCB0aGUgb2xkIHN0YXR1cyAqLwotICAgICAgZmxhZ3MgPSBmY250bCgwLCBGX0dFVEZMLCAwKTsKLSAgICAgIGlmIChmbGFncyA9PSAtMSkgewotCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKLQlyZXR1cm4gc2ltX2lvX2VvZjsKLSAgICAgIH0KLSAgICAgIC8qIHRlbXAsIGRpc2FibGUgYmxvY2tpbmcgSU8gKi8KLSAgICAgIHN0YXR1cyA9IGZjbnRsKDAsIEZfU0VURkwsIGZsYWdzIHwgT19OREVMQVkpOwotICAgICAgaWYgKHN0YXR1cyA9PSAtMSkgewotCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKLQlyZXR1cm4gc2ltX2lvX2VvZjsKLSAgICAgIH0KLSAgICAgIC8qIHRyeSBmb3IgaW5wdXQgKi8KLSAgICAgIG5yX3JlYWQgPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mX2J1Zik7Ci0gICAgICBpZiAobnJfcmVhZCA+IDAKLQkgIHx8IChucl9yZWFkID09IDAgJiYgc2l6ZW9mX2J1ZiA9PSAwKSkKLQlyZXN1bHQgPSBucl9yZWFkOwotICAgICAgZWxzZSBpZiAobnJfcmVhZCA9PSAwKQotCXJlc3VsdCA9IHNpbV9pb19lb2Y7Ci0gICAgICBlbHNlIHsgLyogbnJfcmVhZCA8IDAgKi8KLQlpZiAoZXJybm8gPT0gRUFHQUlOKQotCSAgcmVzdWx0ID0gc2ltX2lvX25vdF9yZWFkeTsKLQllbHNlIAotCSAgcmVzdWx0ID0gc2ltX2lvX2VvZjsKLSAgICAgIH0KLSAgICAgIC8qIHJldHVybiB0byByZWd1bGFyIHZld2luZyAqLwotICAgICAgc3RhdHVzID0gZmNudGwoMCwgRl9TRVRGTCwgZmxhZ3MpOwotICAgICAgaWYgKHN0YXR1cyA9PSAtMSkgewotCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKLQlyZXR1cm4gc2ltX2lvX2VvZjsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoInNpbV9pb19yZWFkX3N0ZGluOiBpbnZhbGlkIHN3aXRjaFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXNpbV9pb19mbHVzaF9zdGRvdXRwdXQodm9pZCkKLXsKLSAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7Ci0gIGNhc2UgRE9fVVNFX1NURElPOgotICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICBicmVhazsKLSAgY2FzZSBET05UX1VTRV9TVERJTzoKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlcnJvcigic2ltX2lvX2ZsdXNoX3N0ZG91dHB1dDogaW52YWxpZCBzd2l0Y2hcbiIpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotdm9pZCAqCi16YWxsb2MobG9uZyBzaXplKQotewotICB2b2lkICptZW1vcnkgPSBtYWxsb2Moc2l6ZSk7Ci0gIGlmIChtZW1vcnkgPT0gTlVMTCkKLSAgICBlcnJvcigiem1hbGxvYyBmYWlsZWRcbiIpOwotICBtZW1zZXQobWVtb3J5LCAwLCBzaXplKTsKLSAgcmV0dXJuIG1lbW9yeTsKLX0KLQotdm9pZAotemZyZWUodm9pZCAqY2h1bmspCi17Ci0gIGZyZWUoY2h1bmspOwotfQotCi0vKiBXaGVuIGEgQ05UUkwtQyBvY2N1cmVzLCBxdWV1ZSBhbiBldmVudCB0byBzaHV0IGRvd24gdGhlIHNpbXVsYXRpb24gKi8KLQotc3RhdGljIFJFVFNJR1RZUEUKLWNudHJsX2MoaW50IHNpZykKLXsKLSAgcHNpbV9zdG9wIChzaW11bGF0aW9uKTsKLX0KLQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBjb25zdCBjaGFyICpuYW1lX29mX2ZpbGU7Ci0gIGNoYXIgKmFyZ187Ci0gIHBzaW1fc3RhdHVzIHN0YXR1czsKLSAgZGV2aWNlICpyb290ID0gcHNpbV90cmVlKCk7Ci0KLSAgLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLwotICBhcmd2ID0gcHNpbV9vcHRpb25zKHJvb3QsIGFyZ3YgKyAxKTsKLSAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkgewotICAgIGlmIChwcGNfdHJhY2VbdHJhY2Vfb3B0c10pIHsKLSAgICAgIHByaW50X29wdGlvbnMgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgcHNpbV91c2FnZSgwKTsKLSAgICB9Ci0gIH0KLSAgbmFtZV9vZl9maWxlID0gYXJndlswXTsKLQotICBpZiAocHBjX3RyYWNlW3RyYWNlX29wdHNdKQotICAgIHByaW50X29wdGlvbnMgKCk7Ci0KLSAgLyogY3JlYXRlIHRoZSBzaW11bGF0b3IgKi8KLSAgc2ltdWxhdGlvbiA9IHBzaW1fY3JlYXRlKG5hbWVfb2ZfZmlsZSwgcm9vdCk7Ci0KLSAgLyogZnVkZ2UgdGhlIGVudmlyb25tZW50IHNvIHRoYXQgXz1wcm9nLW5hbWUgKi8KLSAgYXJnXyA9IChjaGFyKil6YWxsb2Moc3RybGVuKGFyZ3ZbMF0pICsgc3RybGVuKCJfPSIpICsgMSk7Ci0gIHN0cmNweShhcmdfLCAiXz0iKTsKLSAgc3RyY2F0KGFyZ18sIGFyZ3ZbMF0pOwotICBwdXRlbnYoYXJnXyk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBpdCAqLwotICBwc2ltX2luaXQoc2ltdWxhdGlvbik7Ci0gIHBzaW1fc3RhY2soc2ltdWxhdGlvbiwgYXJndiwgZW52aXJvbik7Ci0KLSAgewotICAgIFJFVFNJR1RZUEUgKCpwcmV2KSAoKTsKLSAgICBwcmV2ID0gc2lnbmFsKFNJR0lOVCwgY250cmxfYyk7Ci0gICAgcHNpbV9ydW4oc2ltdWxhdGlvbik7Ci0gICAgc2lnbmFsKFNJR0lOVCwgcHJldik7Ci0gIH0KLQotICAvKiBhbnkgZmluYWwgY2xlYW4gdXAgKi8KLSAgaWYgKHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSkKLSAgICBwc2ltX3ByaW50X2luZm8gKHNpbXVsYXRpb24sIHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSk7Ci0KLSAgLyogd2h5IGRpZCB3ZSBzdG9wICovCi0gIHN0YXR1cyA9IHBzaW1fZ2V0X3N0YXR1cyhzaW11bGF0aW9uKTsKLSAgc3dpdGNoIChzdGF0dXMucmVhc29uKSB7Ci0gIGNhc2Ugd2FzX2NvbnRpbnVpbmc6Ci0gICAgZXJyb3IoInBzaW06IGNvbnRpbnVpbmcgd2hpbGUgc3RvcGVkIVxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIGNhc2Ugd2FzX3RyYXA6Ci0gICAgZXJyb3IoInBzaW06IG5vIHRyYXAgaW5zblxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIGNhc2Ugd2FzX2V4aXRlZDoKLSAgICByZXR1cm4gc3RhdHVzLnNpZ25hbDsKLSAgY2FzZSB3YXNfc2lnbmFsbGVkOgotICAgIHByaW50ZiAoIiVzOiBDYXVnaHQgc2lnbmFsICVkIGF0IGFkZHJlc3MgMHglbHhcbiIsCi0gCSAgICBuYW1lX29mX2ZpbGUsIChpbnQpc3RhdHVzLnNpZ25hbCwKLSAJICAgIChsb25nKXN0YXR1cy5wcm9ncmFtX2NvdW50ZXIpOwotICAgIHJldHVybiBzdGF0dXMuc2lnbmFsOwotICBkZWZhdWx0OgotICAgIGVycm9yKCJ1bmtub3duIGhhbHQgY29uZGl0aW9uXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9taXNjLmMgYi9zaW0vcHBjL21pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlNTRlZC4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL21pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLQotdm9pZAotZXJyb3IgKGNoYXIgKm1zZywgLi4uKQotewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbXNnKTsKLSAgdnByaW50Zihtc2csIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgZXhpdCAoMSk7Ci19Ci0KLXZvaWQgKgotemFsbG9jKGxvbmcgc2l6ZSkKLXsKLSAgdm9pZCAqbWVtb3J5ID0gbWFsbG9jKHNpemUpOwotICBpZiAobWVtb3J5ID09IE5VTEwpCi0gICAgZXJyb3IoInphbGxvYyBmYWlsZWRcbiIpOwotICBtZW1zZXQobWVtb3J5LCAwLCBzaXplKTsKLSAgcmV0dXJuIG1lbW9yeTsKLX0KLQotdm9pZAotZHVtcGYgKGludCBpbmRlbnQsIGNoYXIgKm1zZywgLi4uKQotewotICB2YV9saXN0IGFwOwotICBmb3IgKDsgaW5kZW50ID4gMDsgaW5kZW50LS0pCi0gICAgcHJpbnRmKCIgIik7Ci0gIHZhX3N0YXJ0KGFwLCBtc2cpOwotICB2cHJpbnRmKG1zZywgYXApOwotICB2YV9lbmQoYXApOwotfQotCi0KLXVuc2lnbmVkCi1hMmkoY29uc3QgY2hhciAqYSkKLXsKLSAgaW50IG5lZyA9IDA7Ci0gIGludCBiYXNlID0gMTA7Ci0gIHVuc2lnbmVkIG51bSA9IDA7Ci0gIGludCBsb29waW5nOwotCi0gIHdoaWxlIChpc3NwYWNlICgqYSkpCi0gICAgYSsrOwotCi0gIGlmICgqYSA9PSAnLScpIHsKLSAgICBuZWcgPSAxOwotICAgIGErKzsKLSAgfQotCi0gIGlmICgqYSA9PSAnMCcpIHsKLSAgICBpZiAoYVsxXSA9PSAneCcgfHwgYVsxXSA9PSAnWCcpIHsKLSAgICAgIGEgKz0gMjsKLSAgICAgIGJhc2UgPSAxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYmFzZSA9IDg7Ci0gIH0KLQotICBsb29waW5nID0gMTsKLSAgd2hpbGUgKGxvb3BpbmcpIHsKLSAgICBpbnQgY2ggPSAqYSsrOwotCi0gICAgc3dpdGNoIChiYXNlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGxvb3BpbmcgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwOgotICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLQludW0gPSAobnVtICogMTApICsgKGNoIC0gJzAnKTsKLSAgICAgIH0gZWxzZSB7Ci0JbG9vcGluZyA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7Ci0JbnVtID0gKG51bSAqIDgpICsgKGNoIC0gJzAnKTsKLSAgICAgIH0gZWxzZSB7Ci0JbG9vcGluZyA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotCW51bSA9IChudW0gKiAxNikgKyAoY2ggLSAnMCcpOwotICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0JbnVtID0gKG51bSAqIDE2KSArIChjaCAtICdhJyArIDEwKTsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotCW51bSA9IChudW0gKiAxNikgKyAoY2ggLSAnQScgKyAxMCk7Ci0gICAgICB9IGVsc2UgewotCWxvb3BpbmcgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5lZykKLSAgICBudW0gPSAtIG51bTsKLQotICByZXR1cm4gbnVtOwotfQotCi11bnNpZ25lZAotdGFyZ2V0X2EyaShpbnQgbXNfYml0X25yLAotCSAgIGNvbnN0IGNoYXIgKmEpCi17Ci0gIGlmIChtc19iaXRfbnIpCi0gICAgcmV0dXJuIChtc19iaXRfbnIgLSBhMmkoYSkpOwotICBlbHNlCi0gICAgcmV0dXJuIGEyaShhKTsKLX0KLQotdW5zaWduZWQKLWkydGFyZ2V0KGludCBtc19iaXRfbnIsCi0JIHVuc2lnbmVkIGJpdCkKLXsKLSAgaWYgKG1zX2JpdF9ucikKLSAgICByZXR1cm4gbXNfYml0X25yIC0gYml0OwotICBlbHNlCi0gICAgcmV0dXJuIGJpdDsKLX0KLQotCi1pbnQKLW5hbWUyaShjb25zdCBjaGFyICpuYW1lcywKLSAgICAgICBjb25zdCBuYW1lX21hcCAqbWFwKQotewotICBjb25zdCBuYW1lX21hcCAqY3VycjsKLSAgY29uc3QgY2hhciAqbmFtZSA9IG5hbWVzOwotICB3aGlsZSAoKm5hbWUgIT0gJ1wwJykgewotICAgIC8qIGZpbmQgb3VyIG5hbWUgKi8KLSAgICBjaGFyICplbmQgPSBzdHJjaHIobmFtZSwgJywnKTsKLSAgICBjaGFyICpuZXh0OwotICAgIGludCBsZW47Ci0gICAgaWYgKGVuZCA9PSBOVUxMKSB7Ci0gICAgICBlbmQgPSBzdHJjaHIobmFtZSwgJ1wwJyk7Ci0gICAgICBuZXh0ID0gZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5leHQgPSBlbmQgKyAxOwotICAgIH0KLSAgICBsZW4gPSBlbmQgLSBuYW1lOwotICAgIC8qIGxvb2sgaXQgdXAgKi8KLSAgICBjdXJyID0gbWFwOwotICAgIHdoaWxlIChjdXJyLT5uYW1lICE9IE5VTEwpIHsKLSAgICAgIGlmIChzdHJuY21wKGN1cnItPm5hbWUsIG5hbWUsIGxlbikgPT0gMAotCSAgJiYgc3RybGVuKGN1cnItPm5hbWUpID09IGxlbikKLQlyZXR1cm4gY3Vyci0+aTsKLSAgICAgIGN1cnIrKzsKLSAgICB9Ci0gICAgbmFtZSA9IG5leHQ7Ci0gIH0KLSAgLyogbm90aGluZyBmb3VuZCwgcG9zc2libHkgcmV0dXJuIGEgZGVmYXVsdCAqLwotICBjdXJyID0gbWFwOwotICB3aGlsZSAoY3Vyci0+bmFtZSAhPSBOVUxMKQotICAgIGN1cnIrKzsKLSAgaWYgKGN1cnItPmkgPj0gMCkKLSAgICByZXR1cm4gY3Vyci0+aTsKLSAgZWxzZQotICAgIGVycm9yKCIlcyBjb250YWlucyBubyB2YWxpZCBuYW1lc1xuIiwgbmFtZXMpOwotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciAqCi1pMm5hbWUoY29uc3QgaW50IGksCi0gICAgICAgY29uc3QgbmFtZV9tYXAgKm1hcCkKLXsKLSAgd2hpbGUgKG1hcC0+bmFtZSAhPSBOVUxMKSB7Ci0gICAgaWYgKG1hcC0+aSA9PSBpKQotICAgICAgcmV0dXJuIG1hcC0+bmFtZTsKLSAgICBtYXArKzsKLSAgfQotICBlcnJvcigibWFwIGxvb2t1cCBmYWlsZWQgZm9yICVkXG4iLCBpKTsKLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL21pc2MuaCBiL3NpbS9wcGMvbWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFiZDZkLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvbWlzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogRnJ1c3RyYXRpbmcgaGVhZGVyIGp1bmsgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChfX2F0dHJpYnV0ZV9fKSAmJiAoIWRlZmluZWQoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpKQotI2RlZmluZSBfX2F0dHJpYnV0ZV9fKGFyZykKLSNlbmRpZgotCi0KLQotI2luY2x1ZGUgImZpbHRlcl9maWxlbmFtZS5oIgotCi1leHRlcm4gdm9pZCBlcnJvcgotKGNoYXIgKm1zZywgLi4uKTsKLQotI2RlZmluZSBBU1NFUlQoRVhQUkVTU0lPTikgXAotZG8geyBcCi0gIGlmICghKEVYUFJFU1NJT04pKSB7IFwKLSAgICBlcnJvcigiJXM6JWQ6IGFzc2VydGlvbiBmYWlsZWQgLSAlc1xuIiwgXAotCSAgZmlsdGVyX2ZpbGVuYW1lIChfX0ZJTEVfXyksIF9fTElORV9fLCAjRVhQUkVTU0lPTik7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFpBTExPQyhUWVBFKSAoVFlQRSopemFsbG9jKHNpemVvZihUWVBFKSkKLQotZXh0ZXJuIHZvaWQgKnphbGxvYwotKGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB2b2lkIGR1bXBmCi0oaW50IGluZGVudCwgY2hhciAqbXNnLCAuLi4pOwotCi1leHRlcm4gdW5zaWduZWQgdGFyZ2V0X2EyaQotKGludCBtc19iaXRfbnIsCi0gY29uc3QgY2hhciAqYSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpMnRhcmdldAotKGludCBtc19iaXRfbnIsCi0gdW5zaWduZWQgYml0KTsKLQotZXh0ZXJuIHVuc2lnbmVkIGEyaQotKGNvbnN0IGNoYXIgKmEpOwotCi0vKiBUcnkgbG9va2luZyBmb3IgbmFtZSBpbiB0aGUgbWFwIHRhYmxlIChyZXR1cm5pbmcgdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGludGVnZXIgdmFsdWUpLiAgSWYgdGhhdCBmYWlscywgdHJ5IGNvbnZlcnRpbmcgdGhlIG5hbWUgaW50byBhbgotICAgaW50ZWdlciAqLwotCi10eXBlZGVmIHN0cnVjdCBfbmFtZV9tYXAgewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgaTsKLX0gbmFtZV9tYXA7Ci0KLWV4dGVybiBpbnQgbmFtZTJpCi0oY29uc3QgY2hhciAqbmFtZSwKLSBjb25zdCBuYW1lX21hcCAqbWFwKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmkybmFtZQotKGNvbnN0IGludCBpLAotIGNvbnN0IG5hbWVfbWFwICptYXApOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9tb24uYyBiL3NpbS9wcGMvbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGFmNDcuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9NT05fQ18KLSNkZWZpbmUgX01PTl9DXwotCi0jaW5jbHVkZSAiYmFzaWNzLmgiCi0jaW5jbHVkZSAiY3B1LmgiCi0jaW5jbHVkZSAibW9uLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1RJTUVTX0gKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotaW50IGdldHJ1c2FnZSgpOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0JZVEVfUkVBRFdSSVRFIDkKLSNkZWZpbmUgTUFYX1NISUZUX1JFQURXUklURSAzCi0KLXN0cnVjdCBfY3B1X21vbiB7Ci0gIGNvdW50X3R5cGUgaXNzdWVfY291bnRbbnJfaXRhYmxlX2VudHJpZXNdOwotICBjb3VudF90eXBlIHJlYWRfY291bnQ7Ci0gIGNvdW50X3R5cGUgcmVhZF9ieXRlX2NvdW50W01BWF9CWVRFX1JFQURXUklURV07Ci0gIGNvdW50X3R5cGUgd3JpdGVfY291bnQ7Ci0gIGNvdW50X3R5cGUgd3JpdGVfYnl0ZV9jb3VudFtNQVhfQllURV9SRUFEV1JJVEVdOwotICBjb3VudF90eXBlIHVuYWxpZ25lZF9yZWFkX2NvdW50OwotICBjb3VudF90eXBlIHVuYWxpZ25lZF93cml0ZV9jb3VudDsKLSAgY291bnRfdHlwZSBldmVudF9jb3VudFtucl9tb25fZXZlbnRzXTsKLX07Ci0KLXN0cnVjdCBfbW9uIHsKLSAgaW50IG5yX2NwdXM7Ci0gIGNwdV9tb24gY3B1X21vbml0b3JbTUFYX05SX1BST0NFU1NPUlNdOwotfTsKLQotCi1JTkxJTkVfTU9OXAotKG1vbiAqKQotbW9uX2NyZWF0ZSh2b2lkKQotewotICBtb24gKm1vbml0b3IgPSBaQUxMT0MobW9uKTsKLSAgcmV0dXJuIG1vbml0b3I7Ci19Ci0KLQotSU5MSU5FX01PTlwKLShjcHVfbW9uICopCi1tb25fY3B1KG1vbiAqbW9uaXRvciwKLQlpbnQgY3B1X25yKQotewotICBpZiAoY3B1X25yIDwgMCB8fCBjcHVfbnIgPj0gTUFYX05SX1BST0NFU1NPUlMpCi0gICAgZXJyb3IoIm1vbl9jcHUoKSAtIGludmFsaWQgY3B1IG51bWJlclxuIik7Ci0gIHJldHVybiAmbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXTsKLX0KLQotCi1JTkxJTkVfTU9OXAotKHZvaWQpCi1tb25faW5pdChtb24gKm1vbml0b3IsCi0JIGludCBucl9jcHVzKQotewotICBtZW1zZXQobW9uaXRvciwgMCwgc2l6ZW9mKCptb25pdG9yKSk7Ci0gIG1vbml0b3ItPm5yX2NwdXMgPSBucl9jcHVzOwotfQotCi0KLUlOTElORV9NT05cCi0odm9pZCkKLW1vbl9pc3N1ZShpdGFibGVfaW5kZXggaW5kZXgsCi0JICBjcHUgKnByb2Nlc3NvciwgCi0JICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgY3B1X21vbiAqbW9uaXRvciA9IGNwdV9tb25pdG9yKHByb2Nlc3Nvcik7Ci0gIEFTU0VSVChpbmRleCA8PSBucl9pdGFibGVfZW50cmllcyk7Ci0gIG1vbml0b3ItPmlzc3VlX2NvdW50W2luZGV4XSArPSAxOwotfQotCi0KLUlOTElORV9NT05cCi0odm9pZCkKLW1vbl9yZWFkKHVuc2lnbmVkX3dvcmQgZWEsCi0JIHVuc2lnbmVkX3dvcmQgcmEsCi0JIHVuc2lnbmVkIG5yX2J5dGVzLAotCSBjcHUgKnByb2Nlc3NvciwKLQkgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGNwdV9tb24gKm1vbml0b3IgPSBjcHVfbW9uaXRvcihwcm9jZXNzb3IpOwotICBtb25pdG9yLT5yZWFkX2NvdW50ICs9IDE7Ci0gIG1vbml0b3ItPnJlYWRfYnl0ZV9jb3VudFtucl9ieXRlc10gKz0gMTsKLSAgaWYgKChucl9ieXRlcyAtIDEpICYgZWEpCi0gICAgbW9uaXRvci0+dW5hbGlnbmVkX3JlYWRfY291bnQgKz0gMTsKLX0KLQotCi1JTkxJTkVfTU9OXAotKHZvaWQpCi1tb25fd3JpdGUodW5zaWduZWRfd29yZCBlYSwKLQkgIHVuc2lnbmVkX3dvcmQgcmEsCi0JICB1bnNpZ25lZCBucl9ieXRlcywKLQkgIGNwdSAqcHJvY2Vzc29yLAotCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGNwdV9tb24gKm1vbml0b3IgPSBjcHVfbW9uaXRvcihwcm9jZXNzb3IpOwotICBtb25pdG9yLT53cml0ZV9jb3VudCArPSAxOwotICBtb25pdG9yLT53cml0ZV9ieXRlX2NvdW50W25yX2J5dGVzXSArPSAxOwotICBpZiAoKG5yX2J5dGVzIC0gMSkgJiBlYSkKLSAgICBtb25pdG9yLT51bmFsaWduZWRfd3JpdGVfY291bnQgKz0gMTsKLX0KLQotSU5MSU5FX01PTlwKLSh2b2lkKQotbW9uX2V2ZW50KG1vbl9ldmVudHMgZXZlbnQsCi0JICBjcHUgKnByb2Nlc3NvciwKLQkgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBjcHVfbW9uICptb25pdG9yID0gY3B1X21vbml0b3IocHJvY2Vzc29yKTsKLSAgQVNTRVJUKGV2ZW50IDwgbnJfbW9uX2V2ZW50cyk7Ci0gIG1vbml0b3ItPmV2ZW50X2NvdW50W2V2ZW50XSArPSAxOwotfQotCi1JTkxJTkVfTU9OXAotKHVuc2lnbmVkKQotbW9uX2dldF9udW1iZXJfb2ZfaW5zbnMobW9uICptb25pdG9yLAotCQkJaW50IGNwdV9ucikKLXsKLSAgaXRhYmxlX2luZGV4IGluZGV4OwotICB1bnNpZ25lZCB0b3RhbF9pbnNucyA9IDA7Ci0gIEFTU0VSVChjcHVfbnIgPj0gMCAmJiBjcHVfbnIgPCBtb25pdG9yLT5ucl9jcHVzKTsgCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5yX2l0YWJsZV9lbnRyaWVzOyBpbmRleCsrKQotICAgIHRvdGFsX2luc25zICs9IG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0uaXNzdWVfY291bnRbaW5kZXhdOwotICByZXR1cm4gdG90YWxfaW5zbnM7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfTU9OXAotKGludCkKLW1vbl9zb3J0X2luc3RydWN0aW9uX25hbWVzKGNvbnN0IHZvaWQgKnB0cl9hLCBjb25zdCB2b2lkICpwdHJfYikKLXsKLSAgaXRhYmxlX2luZGV4IGEgPSAqKGNvbnN0IGl0YWJsZV9pbmRleCAqKXB0cl9hOwotICBpdGFibGVfaW5kZXggYiA9ICooY29uc3QgaXRhYmxlX2luZGV4ICopcHRyX2I7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoaXRhYmxlW2FdLm5hbWUsIGl0YWJsZVtiXS5uYW1lKTsKLX0KLQotU1RBVElDX0lOTElORV9NT05cCi0oY2hhciAqKQotbW9uX2FkZF9jb21tYXMoY2hhciAqYnVmLAotCSAgICAgICBpbnQgc2l6ZW9mX2J1ZiwKLQkgICAgICAgY291bnRfdHlwZSB2YWx1ZSkKLXsKLSAgaW50IGNvbW1hID0gMzsKLSAgY2hhciAqZW5kYnVmID0gYnVmICsgc2l6ZW9mX2J1ZiAtIDE7Ci0KLSAgKi0tZW5kYnVmID0gJ1wwJzsKLSAgZG8gewotICAgIGlmIChjb21tYS0tID09IDApCi0gICAgICB7Ci0JKi0tZW5kYnVmID0gJywnOwotCWNvbW1hID0gMjsKLSAgICAgIH0KLQotICAgICotLWVuZGJ1ZiA9ICh2YWx1ZSAlIDEwKSArICcwJzsKLSAgfSB3aGlsZSAoKHZhbHVlIC89IDEwKSAhPSAwKTsKLQotICBBU1NFUlQoZW5kYnVmID49IGJ1Zik7Ci0gIHJldHVybiBlbmRidWY7Ci19Ci0KLQotSU5MSU5FX01PTlwKLSh2b2lkKQotbW9uX3ByaW50X2luZm8ocHNpbSAqc3lzdGVtLAotCSAgICAgICBtb24gKm1vbml0b3IsCi0JICAgICAgIGludCB2ZXJib3NlKQotewotICBjaGFyIGJ1ZmZlclsyMF07Ci0gIGNoYXIgYnVmZmVyMVsyMF07Ci0gIGNoYXIgYnVmZmVyMlsyMF07Ci0gIGNoYXIgYnVmZmVyNFsyMF07Ci0gIGNoYXIgYnVmZmVyOFsyMF07Ci0gIGludCBjcHVfbnI7Ci0gIGludCBsZW5fY3B1OwotICBpbnQgbGVuX251bSA9IDA7Ci0gIGludCBsZW5fc3ViX251bVtNQVhfQllURV9SRUFEV1JJVEVdOwotICBpbnQgbGVuOwotICBpbnQgaTsKLSAgbG9uZyB0b3RhbF9pbnNucyA9IDA7Ci0gIGxvbmcgY3B1X2luc25zX3NlY29uZCA9IDA7Ci0gIGxvbmcgdG90YWxfc2ltX2N5Y2xlcyA9IDA7Ci0gIGxvbmcgc2ltX2N5Y2xlc19zZWNvbmQgPSAwOwotICBkb3VibGUgY3B1X3RpbWUgPSAwLjA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9CWVRFX1JFQURXUklURTsgaSsrKQotICAgIGxlbl9zdWJfbnVtW2ldID0gMDsKLQotICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IG1vbml0b3ItPm5yX2NwdXM7IGNwdV9ucisrKSB7Ci0gICAgY291bnRfdHlwZSBudW1faW5zbnMgPSBtb25fZ2V0X251bWJlcl9vZl9pbnNucyhtb25pdG9yLCBjcHVfbnIpOwotCi0gICAgdG90YWxfaW5zbnMgKz0gbnVtX2luc25zOwotICAgIGxlbiA9IHN0cmxlbiAobW9uX2FkZF9jb21tYXMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgbnVtX2luc25zKSk7Ci0gICAgaWYgKGxlbl9udW0gPCBsZW4pCi0gICAgICBsZW5fbnVtID0gbGVuOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSBNQVhfU0hJRlRfUkVBRFdSSVRFOyBpKyspIHsKLSAgICAgIGludCBzaXplID0gMTw8aTsKLSAgICAgIGxlbiA9IHN0cmxlbiAobW9uX2FkZF9jb21tYXMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCQkgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfYnl0ZV9jb3VudFtzaXplXSkpOwotICAgICAgaWYgKGxlbl9zdWJfbnVtW3NpemVdIDwgbGVuKQotCWxlbl9zdWJfbnVtW3NpemVdID0gbGVuOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS53cml0ZV9ieXRlX2NvdW50W3NpemVdKSk7Ci0gICAgICBpZiAobGVuX3N1Yl9udW1bc2l6ZV0gPCBsZW4pCi0JbGVuX3N1Yl9udW1bc2l6ZV0gPSBsZW47Ci0gICAgfQotICB9Ci0KLSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCAoaW50KW1vbml0b3ItPm5yX2NwdXMgKyAxKTsKLSAgbGVuX2NwdSA9IHN0cmxlbiAoYnVmZmVyKTsKLQotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0gIHsKLSAgICBzdHJ1Y3QgcnVzYWdlIG15dGltZTsKLSAgICBpZiAoZ2V0cnVzYWdlIChSVVNBR0VfU0VMRiwgJm15dGltZSkgPT0gMAotCSYmIChteXRpbWUucnVfdXRpbWUudHZfc2VjID4gMCB8fCBteXRpbWUucnVfdXRpbWUudHZfdXNlYyA+IDApKSB7Ci0gICAgICAKLSAgICAgIGNwdV90aW1lID0gKGRvdWJsZSlteXRpbWUucnVfdXRpbWUudHZfc2VjICsgKCgoZG91YmxlKW15dGltZS5ydV91dGltZS50dl91c2VjKSAvIDEwMDAwMDAuMCk7Ci0gICAgfQotICB9Ci0gIGlmIChXSVRIX0VWRU5UUykKLSAgICB0b3RhbF9zaW1fY3ljbGVzID0gZXZlbnRfcXVldWVfdGltZShwc2ltX2V2ZW50X3F1ZXVlKHN5c3RlbSkpIC0gMTsKLSAgaWYgKGNwdV90aW1lID4gMCkgewotICAgIGlmICh0b3RhbF9pbnNucyA+IDApCi0gICAgICBjcHVfaW5zbnNfc2Vjb25kID0gKGxvbmcpKCgoZG91YmxlKXRvdGFsX2luc25zIC8gY3B1X3RpbWUpICsgMC41KTsKLSAgICBpZiAodG90YWxfc2ltX2N5Y2xlcykgewotICAgICAgc2ltX2N5Y2xlc19zZWNvbmQgPSAobG9uZykoKChkb3VibGUpdG90YWxfc2ltX2N5Y2xlcyAvIGNwdV90aW1lKSArIDAuNSk7Ci0gICAgfQotICB9Ci0jZW5kaWYKLQotICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IG1vbml0b3ItPm5yX2NwdXM7IGNwdV9ucisrKSB7Ci0KLSAgICBpZiAodmVyYm9zZSA+IDEpIHsKLSAgICAgIGl0YWJsZV9pbmRleCBzb3J0X2luc25zW25yX2l0YWJsZV9lbnRyaWVzXTsKLSAgICAgIGludCBucl9zb3J0X2luc25zID0gMDsKLSAgICAgIGl0YWJsZV9pbmRleCBpbmRleDsKLSAgICAgIGludCBpbmRleDI7Ci0KLSAgICAgIGlmIChjcHVfbnIpCi0JcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKLQotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnJfaXRhYmxlX2VudHJpZXM7IGluZGV4KyspIHsKLQlpZiAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5pc3N1ZV9jb3VudFtpbmRleF0pIHsKLQkgIHNvcnRfaW5zbnNbbnJfc29ydF9pbnNucysrXSA9IGluZGV4OwotCX0KLSAgICAgIH0KLQotICAgICAgcXNvcnQoKHZvaWQgKilzb3J0X2luc25zLCBucl9zb3J0X2luc25zLCBzaXplb2Yoc29ydF9pbnNuc1swXSksIG1vbl9zb3J0X2luc3RydWN0aW9uX25hbWVzKTsKLQotICAgICAgZm9yIChpbmRleDIgPSAwOyBpbmRleDIgPCBucl9zb3J0X2luc25zOyBpbmRleDIrKykgewotCWluZGV4ID0gc29ydF9pbnNuc1tpbmRleDJdOwotCXByaW50Zl9maWx0ZXJlZCgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzICVzIGluc3RydWN0aW9uJXMuXG4iLAotCQkJbGVuX2NwdSwgY3B1X25yKzEsCi0JCQlsZW5fbnVtLCBtb25fYWRkX2NvbW1hcyhidWZmZXIsCi0JCQkJCQlzaXplb2YoYnVmZmVyKSwKLQkJCQkJCW1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0uaXNzdWVfY291bnRbaW5kZXhdKSwKLQkJCSAgaXRhYmxlW2luZGV4XS5uYW1lLAotCQkJICAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5pc3N1ZV9jb3VudFtpbmRleF0gPT0gMSkgPyAiIiA6ICJzIik7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Ci0gICAgfQotCi0gICAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQotICAgICAgewotCW1vZGVsX2RhdGEgKm1vZGVsX3B0ciA9IGNwdV9tb2RlbChwc2ltX2NwdShzeXN0ZW0sIGNwdV9ucikpOwotCW1vZGVsX3ByaW50ICpwdHIgPSBtb2RlbF9tb25faW5mbyhtb2RlbF9wdHIpOwotCW1vZGVsX3ByaW50ICpvcmlnX3B0ciA9IHB0cjsKLQotCXdoaWxlIChwdHIpIHsKLQkgIGlmIChwdHItPmNvdW50KQotCSAgICBwcmludGZfZmlsdGVyZWQoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyAlcyVzLlxuIiwKLQkJCSAgICBsZW5fY3B1LCBjcHVfbnIrMSwKLQkJCSAgICBsZW5fbnVtLCBtb25fYWRkX2NvbW1hcyhidWZmZXIsCi0JCQkJCQkgICAgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCQkgICAgcHRyLT5jb3VudCksCi0JCQkgICAgcHRyLT5uYW1lLAotCQkJICAgICgocHRyLT5jb3VudCA9PSAxKQotCQkJICAgICA/IHB0ci0+c3VmZml4X3Npbmd1bGFyCi0JCQkgICAgIDogcHRyLT5zdWZmaXhfcGx1cmFsKSk7Ci0KLQkgIHB0ciA9IHB0ci0+bmV4dDsKLQl9Ci0KLQltb2RlbF9tb25faW5mb19mcmVlKG1vZGVsX3B0ciwgb3JpZ19wdHIpOwotICAgICAgfQotCi0gICAgaWYgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ucmVhZF9jb3VudCkKLSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyByZWFkJXMgICglKnMgMS1ieXRlLCAlKnMgMi1ieXRlLCAlKnMgNC1ieXRlLCAlKnMgOC1ieXRlKS5cbiIsCi0JCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKLQkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKLQkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAotCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2NvdW50KSwKLQkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfY291bnQgPT0gMSkgPyAiIiA6ICJzIiwKLQkJICAgICAgIGxlbl9zdWJfbnVtWzFdLCBtb25fYWRkX2NvbW1hcyhidWZmZXIxLAotCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZmZlcjEpLAotCQkJCQkJICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2J5dGVfY291bnRbMV0pLAotCQkgICAgICAgbGVuX3N1Yl9udW1bMl0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlcjIsCi0JCQkJCQkgICAgICBzaXplb2YoYnVmZmVyMiksCi0JCQkJCQkgICAgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfYnl0ZV9jb3VudFsyXSksCi0JCSAgICAgICBsZW5fc3ViX251bVs0XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyNCwKLQkJCQkJCSAgICAgIHNpemVvZihidWZmZXI0KSwKLQkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ucmVhZF9ieXRlX2NvdW50WzRdKSwKLQkJICAgICAgIGxlbl9zdWJfbnVtWzhdLCBtb25fYWRkX2NvbW1hcyhidWZmZXI4LAotCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZmZlcjgpLAotCQkJCQkJICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2J5dGVfY291bnRbOF0pKTsKLQotICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50KQotICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzIHdyaXRlJXMgKCUqcyAxLWJ5dGUsICUqcyAyLWJ5dGUsICUqcyA0LWJ5dGUsICUqcyA4LWJ5dGUpLlxuIiwKLQkJICAgICAgIGxlbl9jcHUsIGNwdV9ucisxLAotCQkgICAgICAgbGVuX251bSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyLAotCQkJCQkgICAgICAgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCSAgICAgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50KSwKLQkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50ID09IDEpID8gIiIgOiAicyIsCi0JCSAgICAgICBsZW5fc3ViX251bVsxXSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyMSwKLQkJCQkJCSAgICAgIHNpemVvZihidWZmZXIxKSwKLQkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFsxXSksCi0JCSAgICAgICBsZW5fc3ViX251bVsyXSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyMiwKLQkJCQkJCSAgICAgIHNpemVvZihidWZmZXIyKSwKLQkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFsyXSksCi0JCSAgICAgICBsZW5fc3ViX251bVs0XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyNCwKLQkJCQkJCSAgICAgIHNpemVvZihidWZmZXI0KSwKLQkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFs0XSksCi0JCSAgICAgICBsZW5fc3ViX251bVs4XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyOCwKLQkJCQkJCSAgICAgIHNpemVvZihidWZmZXI4KSwKLQkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFs4XSkpOwotCi0gICAgaWYgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0udW5hbGlnbmVkX3JlYWRfY291bnQpCi0gICAgICBwcmludGZfZmlsdGVyZWQgKCJDUFUgIyUqZCBleGVjdXRlZCAlKnMgdW5hbGlnbmVkIHJlYWQlcy5cbiIsCi0JCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKLQkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKLQkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAotCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfcmVhZF9jb3VudCksCi0JCSAgICAgICAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfcmVhZF9jb3VudCA9PSAxKSA/ICIiIDogInMiKTsKLQotICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnVuYWxpZ25lZF93cml0ZV9jb3VudCkKLSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyB1bmFsaWduZWQgd3JpdGUlcy5cbiIsCi0JCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKLQkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKLQkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAotCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfd3JpdGVfY291bnQpLAotCQkgICAgICAgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0udW5hbGlnbmVkX3dyaXRlX2NvdW50ID09IDEpID8gIiIgOiAicyIpOwotICAgIAotICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLmV2ZW50X2NvdW50W21vbl9ldmVudF9pY2FjaGVfbWlzc10pCi0gICAgICBwcmludGZfZmlsdGVyZWQgKCJDUFUgIyUqZCBleGVjdXRlZCAlKnMgaWNhY2hlIG1pc3Mlcy5cbiIsCi0JCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKLQkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKLQkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAotCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5ldmVudF9jb3VudFttb25fZXZlbnRfaWNhY2hlX21pc3NdKSwKLQkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLmV2ZW50X2NvdW50W21vbl9ldmVudF9pY2FjaGVfbWlzc10gPT0gMSkgPyAiIiA6ICJlcyIpOwotCi0gICAgewotICAgICAgbG9uZyBucl9pbnNucyA9IG1vbl9nZXRfbnVtYmVyX29mX2luc25zKG1vbml0b3IsIGNwdV9ucik7Ci0gICAgICBpZiAobnJfaW5zbnMgPiAwKQotCXByaW50Zl9maWx0ZXJlZCgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzIGluc3RydWN0aW9ucyBpbiB0b3RhbC5cbiIsCi0JCQlsZW5fY3B1LCBjcHVfbnIrMSwKLQkJCWxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKLQkJCQkJCXNpemVvZihidWZmZXIpLAotCQkJCQkJbnJfaW5zbnMpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodG90YWxfaW5zbnMgPiAwKSB7Ci0gICAgaWYgKG1vbml0b3ItPm5yX2NwdXMgPiAxKQotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbkFsbCBDUFVzIGV4ZWN1dGVkICVzIGluc3RydWN0aW9ucyBpbiB0b3RhbC5cbiIsCi0JCSAgICAgIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHRvdGFsX2luc25zKSk7Ci0gIH0KLSAgZWxzZSBpZiAodG90YWxfc2ltX2N5Y2xlcyA+IDApIHsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuU2ltdWxhdG9yIHBlcmZvcm1lZCAlcyBzaW11bGF0aW9uIGN5Y2xlcy5cbiIsCi0JCSAgICBtb25fYWRkX2NvbW1hcyhidWZmZXIsIHNpemVvZihidWZmZXIpLCB0b3RhbF9zaW1fY3ljbGVzKSk7Ci0gIH0KLQotICBpZiAoY3B1X2luc25zX3NlY29uZCkKLSAgICBwcmludGZfZmlsdGVyZWQgKCIlc1NpbXVsYXRvciBzcGVlZCB3YXMgJXMgaW5zdHJ1Y3Rpb25zL3NlY29uZC5cbiIsCi0JCSAgICAgKG1vbml0b3ItPm5yX2NwdXMgPiAxKSA/ICIiIDogIlxuIiwKLQkJICAgICBtb25fYWRkX2NvbW1hcyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBjcHVfaW5zbnNfc2Vjb25kKSk7Ci0gIGVsc2UgaWYgKHNpbV9jeWNsZXNfc2Vjb25kKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIlNpbXVsYXRvciBzcGVlZCB3YXMgJXMgc2ltdWxhdGlvbiBjeWNsZXMvc2Vjb25kXG4iLAotCQkgICAgIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHNpbV9jeWNsZXNfc2Vjb25kKSk7Ci0gIGVsc2UgaWYgKGNwdV90aW1lID4gMC4wKQotICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzU2ltdWxhdG9yIGV4ZWN1dGVkIGZvciAlLjJmIHNlY29uZHNcbiIsCi0JCSAgICAgKG1vbml0b3ItPm5yX2NwdXMgPiAxKSA/ICIiIDogIlxuIiwgY3B1X3RpbWUpOwotCi19Ci0KLSNlbmRpZiAvKiBfTU9OX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL21vbi5oIGIvc2ltL3BwYy9tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NGI4ZS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL21vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX01PTl9IXwotI2RlZmluZSBfTU9OX0hfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLSNpbmNsdWRlICJpdGFibGUuaCIKLQotLyogbW9uaXRvci9sb2dnZXI6IGNvdW50cyB3aGF0IHRoZSBzaW11bGF0aW9uIGlzIHVwIHRvICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBjb3VudF90eXBlOwotCi0vKiBJbnRlcmZhY3QgdG8gbW9kZWwgdG8gcmV0dXJuIG1vZGVsIHNwZWNpZmljIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfbW9kZWxfcHJpbnQgbW9kZWxfcHJpbnQ7Ci1zdHJ1Y3QgX21vZGVsX3ByaW50IHsKLSAgbW9kZWxfcHJpbnQgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeF9zaW5ndWxhcjsKLSAgY29uc3QgY2hhciAqc3VmZml4X3BsdXJhbDsKLSAgY291bnRfdHlwZSBjb3VudDsKLX07Ci0KLS8qIEFkZGl0aW9uYWwgZXZlbnRzIHRvIG1vbml0b3IgKi8KLXR5cGVkZWYgZW51bSBfbW9uX2V2ZW50cyB7Ci0gIG1vbl9ldmVudF9pY2FjaGVfbWlzcywKLSAgbnJfbW9uX2V2ZW50cwotfSBtb25fZXZlbnRzOwotCi10eXBlZGVmIHN0cnVjdCBfbW9uIG1vbjsKLXR5cGVkZWYgc3RydWN0IF9jcHVfbW9uIGNwdV9tb247Ci0KLUlOTElORV9NT05cCi0obW9uICopIG1vbl9jcmVhdGUKLSh2b2lkKTsKLQotSU5MSU5FX01PTlwKLShjcHVfbW9uICopIG1vbl9jcHUKLShtb24gKm1vbml0b3IsCi0gaW50IGNwdV9ucik7Ci0KLUlOTElORV9NT05cCi0odm9pZCkgbW9uX2luaXQKLShtb24gKm1vbml0b3IsCi0gaW50IG5yX2NwdXMpOwotCi1JTkxJTkVfTU9OXAotKHZvaWQpIG1vbl9pc3N1ZQotKGl0YWJsZV9pbmRleCBpbmRleCwKLSBjcHUgKnByb2Nlc3NvciwgCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi0vKiBOT1RFIC0gdGhlcmUgaXMgbm8gbW9uX2lsb2FkIC0gaXQgaXMgbWFkZSByZWR1bnRhbnQgYnkgbW9uX2lzc3VlKCkKLSAgIGFuZCBiZXNpZGVzIHdoZW4gdGhlIGNwdSdzIGhhdmUgdGhlaXIgb3duIGNhY2hlLCB0aGUgaW5mb3JtYXRpb24gaXMKLSAgIHdyb25nICovCi0KLUlOTElORV9NT05cCi0odm9pZCkgbW9uX3JlYWQKLSh1bnNpZ25lZF93b3JkIGVhLAotIHVuc2lnbmVkX3dvcmQgcmEsCi0gdW5zaWduZWQgbnJfYnl0ZXMsCi0gY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi1JTkxJTkVfTU9OXAotKHZvaWQpIG1vbl93cml0ZQotKHVuc2lnbmVkX3dvcmQgZWEsCi0gdW5zaWduZWRfd29yZCByYSwKLSB1bnNpZ25lZCBucl9ieXRlcywKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLUlOTElORV9NT05cCi0odm9pZCkgbW9uX2V2ZW50Ci0obW9uX2V2ZW50cyBldmVudCwKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLUlOTElORV9NT05cCi0odW5zaWduZWQpIG1vbl9nZXRfbnVtYmVyX29mX2luc25zCi0obW9uICptb25pdG9yLAotIGludCBjcHVfbnIpOwotCi1JTkxJTkVfTU9OXAotKHZvaWQpIG1vbl9wcmludF9pbmZvCi0ocHNpbSAqc3lzdGVtLAotIG1vbiAqbW9uaXRvciwKLSBpbnQgdmVyYm9zZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9vcHRpb25zLmMgYi9zaW0vcHBjL29wdGlvbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzMTEyNC4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL29wdGlvbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgICovCi0KLSNpZm5kZWYgX09QVElPTlNfQ18KLSNkZWZpbmUgX09QVElPTlNfQ18KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgIm9wdGlvbnMuaCIKLQotU1RBVElDX0lOTElORV9PUFRJT05TXAotKGNvbnN0IGNoYXIgKikKLW9wdGlvbnNfYnl0ZV9vcmRlciAoaW50IG9yZGVyKQotewotICBzd2l0Y2ggKG9yZGVyKSB7Ci0gIGNhc2UgMDoJCXJldHVybiAiMCI7Ci0gIGNhc2UgQklHX0VORElBTjoJcmV0dXJuICJCSUdfRU5ESUFOIjsKLSAgY2FzZSBMSVRUTEVfRU5ESUFOOglyZXR1cm4gIkxJVFRMRV9FTkRJQU4iOwotICB9Ci0KLSAgcmV0dXJuICJVTktOT1dOIjsKLX0KLQotU1RBVElDX0lOTElORV9PUFRJT05TXAotKGNvbnN0IGNoYXIgKikKLW9wdGlvbnNfZW52IChpbnQgZW52KQotewotICBzd2l0Y2ggKGVudikgewotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoJcmV0dXJuICJPUEVSQVRJTkciOwotICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CXJldHVybiAiVklSVFVBTCI7Ci0gIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoJcmV0dXJuICJVU0VSIjsKLSAgY2FzZSAwOgkJCXJldHVybiAiMCI7Ci0gIH0KLQotICByZXR1cm4gIlVOS05PV04iOwotfQotCi1TVEFUSUNfSU5MSU5FX09QVElPTlNcCi0oY29uc3QgY2hhciAqKQotb3B0aW9uc19hbGlnbiAoaW50IGFsaWduKQotewotICBzd2l0Y2ggKGFsaWduKSB7Ci0gIGNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoJcmV0dXJuICJOT05TVFJJQ1QiOwotICBjYXNlIFNUUklDVF9BTElHTk1FTlQ6CXJldHVybiAiU1RSSUNUIjsKLSAgY2FzZSAwOgkJCXJldHVybiAiMCI7Ci0gIH0KLQotICByZXR1cm4gIlVOS05PV04iOwotfQotCi1TVEFUSUNfSU5MSU5FX09QVElPTlNcCi0oY29uc3QgY2hhciAqKQotb3B0aW9uc19mbG9hdCAoaW50IGZsb2F0X3R5cGUpCi17Ci0gIHN3aXRjaCAoZmxvYXRfdHlwZSkgewotICBjYXNlIFNPRlRfRkxPQVRJTkdfUE9JTlQ6CXJldHVybiAiU09GVFdBUkUiOwotICBjYXNlIEhBUkRfRkxPQVRJTkdfUE9JTlQ6CXJldHVybiAiSEFSRFdBUkUiOwotICB9Ci0KLSAgcmV0dXJuICJVTktOT1dOIjsKLX0KLQotU1RBVElDX0lOTElORV9PUFRJT05TXAotKGNvbnN0IGNoYXIgKikKLW9wdGlvbnNfbW9uIChpbnQgbW9uKQotewotICBzd2l0Y2ggKG1vbikgewotICBjYXNlIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUV8TU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQ6CXJldHVybiAiQUxMIjsKLSAgY2FzZSBNT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFOgkJCQlyZXR1cm4gIklOU1RSVUNUSU9OIjsKLSAgY2FzZSBNT05JVE9SX0xPQURfU1RPUkVfVU5JVDoJCQkJCXJldHVybiAiTUVNT1JZIjsKLSAgY2FzZSAwOgkJCQkJCQlyZXR1cm4gIjAiOwotICB9Ci0KLSAgcmV0dXJuICJVTktOT1dOIjsKLX0KLQotU1RBVElDX0lOTElORV9PUFRJT05TXAotKGNvbnN0IGNoYXIgKikKLW9wdGlvbnNfaW5saW5lIChpbnQgaW4pCi17Ci0gIHN3aXRjaCAoaW4pIHsKLSAgY2FzZSAvKjAqLyAwOgkJCQkJcmV0dXJuICIwIjsKLSAgY2FzZSAvKjEqLyBSRVZFQUxfTU9EVUxFOgkJCXJldHVybiAiUkVWRUFMX01PRFVMRSI7Ci0gIGNhc2UgLyoyKi8gSU5MSU5FX01PRFVMRToJCQlyZXR1cm4gIklOTElORV9NT0RVTEUiOwotICBjYXNlIC8qMyovIFJFVkVBTF9NT0RVTEV8SU5MSU5FX01PRFVMRToJcmV0dXJuICJSRVZFQUxfTU9EVUxFfElOTElORV9NT0RVTEUiOwotICBjYXNlIC8qNCovIElOTElORV9MT0NBTFM6CQkJcmV0dXJuICJMT0NBTFNfSU5MSU5FIjsKLSAgY2FzZSAvKjUqLyBJTkxJTkVfTE9DQUxTfFJFVkVBTF9NT0RVTEU6CXJldHVybiAiSU5MSU5FX0xPQ0FMU3xSRVZFQUxfTU9EVUxFIjsKLSAgY2FzZSAvKjYqLyBJTkxJTkVfTE9DQUxTfElOTElORV9NT0RVTEU6CXJldHVybiAiSU5MSU5FX0xPQ0FMU3xJTkxJTkVfTU9EVUxFIjsKLSAgY2FzZSAvKjcqLyBBTExfSU5MSU5FOgkJCXJldHVybiAiQUxMX0lOTElORSI7Ci0gIH0KLSAgcmV0dXJuICIwIjsKLX0KLQotCi1JTkxJTkVfT1BUSU9OU1wKLSh2b2lkKQotcHJpbnRfb3B0aW9ucyAodm9pZCkKLXsKLSNpZiBkZWZpbmVkKF9HTlVDXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKLSAgcHJpbnRmX2ZpbHRlcmVkICgiQ29tcGlsZWQgYnkgR0NDICVzIG9uICVzICVzXG4iLCBfX1ZFUlNJT05fXywgX19EQVRFX18sIF9fVElNRV9fKTsKLSNlbHNlCi0gIHByaW50Zl9maWx0ZXJlZCAoIkNvbXBpbGVkIG9uICVzICVzXG4iLCBfX0RBVEVfXywgX19USU1FX18pOwotI2VuZGlmCi0KLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9IT1NUX0JZVEVfT1JERVIgICAgID0gJXNcbiIsIG9wdGlvbnNfYnl0ZV9vcmRlciAoV0lUSF9IT1NUX0JZVEVfT1JERVIpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9UQVJHRVRfQllURV9PUkRFUiAgID0gJXNcbiIsIG9wdGlvbnNfYnl0ZV9vcmRlciAoV0lUSF9UQVJHRVRfQllURV9PUkRFUikpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1hPUl9FTkRJQU4gICAgICAgICAgPSAlZFxuIiwgV0lUSF9YT1JfRU5ESUFOKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9CU1dBUCAgICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfQlNXQVApOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1NNUCAgICAgICAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9TTVApOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0hPU1RfV09SRF9CSVRTSVpFICAgPSAlZFxuIiwgV0lUSF9IT1NUX1dPUkRfQklUU0laRSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9ICVkXG4iLCBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0VOVklST05NRU5UICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19lbnYoV0lUSF9FTlZJUk9OTUVOVCkpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0VWRU5UUyAgICAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9FVkVOVFMpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1RJTUVfQkFTRSAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9USU1FX0JBU0UpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0NBTExCQUNLX01FTU9SWSAgICAgPSAlZFxuIiwgV0lUSF9DQUxMQkFDS19NRU1PUlkpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0FMSUdOTUVOVCAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19hbGlnbiAoV0lUSF9BTElHTk1FTlQpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9GTE9BVElOR19QT0lOVCAgICAgID0gJXNcbiIsIG9wdGlvbnNfZmxvYXQgKFdJVEhfRkxPQVRJTkdfUE9JTlQpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9UUkFDRSAgICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfVFJBQ0UpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0FTU0VSVCAgICAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9BU1NFUlQpOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX01PTiAgICAgICAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19tb24gKFdJVEhfTU9OKSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfREVGQVVMVF9NT0RFTCAgICAgICA9ICVzXG4iLCBtb2RlbF9uYW1lW1dJVEhfREVGQVVMVF9NT0RFTF0pOwotICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX01PREVMICAgICAgICAgICAgICAgPSAlc1xuIiwgbW9kZWxfbmFtZVtXSVRIX01PREVMXSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfTU9ERUxfSVNTVUUgICAgICAgICA9ICVkXG4iLCBXSVRIX01PREVMX0lTU1VFKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9SRVNFUlZFRF9CSVRTICAgICAgID0gJWRcbiIsIFdJVEhfUkVTRVJWRURfQklUUyk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfU1RESU8gICAgICAgICAgICAgICA9ICVkXG4iLCBXSVRIX1NURElPKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9SRUdQQVJNICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfUkVHUEFSTSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfU1REQ0FMTCAgICAgICAgICAgICA9ICVkXG4iLCBXSVRIX1NURENBTEwpOwotICBwcmludGZfZmlsdGVyZWQgKCJERUZBVUxUX0lOTElORSAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKERFRkFVTFRfSU5MSU5FKSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIlNJTV9FTkRJQU5fSU5MSU5FICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoU0lNX0VORElBTl9JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiQklUU19JTkxJTkUgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChCSVRTX0lOTElORSkpOwotICBwcmludGZfZmlsdGVyZWQgKCJDUFVfSU5MSU5FICAgICAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKENQVV9JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiVk1fSU5MSU5FICAgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChWTV9JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiQ09SRV9JTkxJTkUgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChDT1JFX0lOTElORSkpOwotICBwcmludGZfZmlsdGVyZWQgKCJFVkVOVFNfSU5MSU5FICAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKEVWRU5UU19JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiTU9OX0lOTElORSAgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChNT05fSU5MSU5FKSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIklOVEVSUlVQVFNfSU5MSU5FICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoSU5URVJSVVBUU19JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiUkVHSVNURVJTX0lOTElORSAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChSRUdJU1RFUlNfSU5MSU5FKSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIkRFVklDRV9JTkxJTkUgICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoREVWSUNFX0lOTElORSkpOwotICBwcmludGZfZmlsdGVyZWQgKCJTUFJFR19JTkxJTkUgICAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKFNQUkVHX0lOTElORSkpOwotICBwcmludGZfZmlsdGVyZWQgKCJTRU1BTlRJQ1NfSU5MSU5FICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKFNFTUFOVElDU19JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiSURFQ09ERV9JTkxJTkUgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChJREVDT0RFX0lOTElORSkpOwotICBwcmludGZfZmlsdGVyZWQgKCJPUFRJT05TX0lOTElORSAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKE9QVElPTlNfSU5MSU5FKSk7Ci0gIHByaW50Zl9maWx0ZXJlZCAoIk9TX0VNVUxfSU5MSU5FICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoT1NfRU1VTF9JTkxJTkUpKTsKLSAgcHJpbnRmX2ZpbHRlcmVkICgiU1VQUE9SVF9JTkxJTkUgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChTVVBQT1JUX0lOTElORSkpOwotCi0jaWZkZWYgT1BDT0RFX1JVTEVTCi0gIHByaW50Zl9maWx0ZXJlZCAoIk9QQ09ERSBydWxlcyAgICAgICAgICAgICA9ICVzXG4iLCBPUENPREVfUlVMRVMpOwotI2VuZGlmCi0KLSNpZmRlZiBJR0VOX0ZMQUdTCi0gIHByaW50Zl9maWx0ZXJlZCAoIklHRU5fRkxBR1MgICAgICAgICAgICAgICA9ICVzXG4iLCBJR0VOX0ZMQUdTKTsKLSNlbmRpZgotCi0jaWZkZWYgREdFTl9GTEFHUwotICBwcmludGZfZmlsdGVyZWQgKCJER0VOX0ZMQUdTICAgICAgICAgICAgICAgPSAlc1xuIiwgREdFTl9GTEFHUyk7Ci0jZW5kaWYKLQotICB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRlZmluZXNbXSA9IHsKLSNpZmRlZiBfX0dOVUNfXwotICAgICAgIl9fR05VQ19fIiwKLSNlbmRpZgotCi0jaWZkZWYgX19TVFJJQ1RfQU5TSV9fCi0gICAgICAiX19TVFJJQ1RfQU5TSV9fIiwKLSNlbmRpZgotCi0jaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KLSAgICAgICJfX0NIQVJfVU5TSUdORURfXyIsCi0jZW5kaWYKLQotI2lmZGVmIF9fT1BUSU1JWkVfXwotICAgICAgIl9fT1BUSU1JWkVfXyIsCi0jZW5kaWYKLQotI2lmZGVmIFNURENfSEVBREVSUwotICAgICAgIlNURENfSEVBREVSUyIsCi0jZW5kaWYKLQotI2luY2x1ZGUgImRlZmluZXMuaCIKLQotI2lmZGVmIEhBVkVfVEVSTUlPU19DTElORQotICAgICAgIkhBVkVfVEVSTUlPU19DTElORSIsCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUKLSAgICAgICJIQVZFX1RFUk1JT1NfU1RSVUNUVVJFIiwKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9URVJNSU9fQ0xJTkUKLSAgICAgICJIQVZFX1RFUk1JT19DTElORSIsCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQotICAgICAgIkhBVkVfVEVSTUlPX1NUUlVDVFVSRSIsCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfREVWWkVSTwotICAgICAgIkhBVkVfREVWWkVSTyIsCi0jZW5kaWYKLSAgICB9OwotCi0gICAgaW50IGk7Ci0gICAgaW50IG1heF9sZW4gPSAwOwotICAgIGludCBjb2xzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGVmaW5lcykgLyBzaXplb2YgKGRlZmluZXNbMF0pOyBpKyspIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKGRlZmluZXNbaV0pOwotICAgICAgaWYgKGxlbiA+IG1heF9sZW4pCi0JbWF4X2xlbiA9IGxlbjsKLSAgICB9Ci0KLSAgICBjb2xzID0gNzggLyAobWF4X2xlbiArIDIpOwotICAgIGlmIChjb2xzIDwgMCkKLSAgICAgIGNvbHMgPSAxOwotCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4jZGVmaW5lczoiKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkZWZpbmVzKSAvIHNpemVvZiAoZGVmaW5lc1swXSk7IGkrKykgewotICAgICAgY29uc3QgY2hhciAqY29uc3QgcHJlZml4ID0gKChpICUgY29scykgPT0gMCkgPyAiXG4iIDogIiI7Ci0gICAgICBwcmludGZfZmlsdGVyZWQgKCIlcyAgJXMlKnMiLCBwcmVmaXgsIGRlZmluZXNbaV0sCi0JCSAgICAgICAoKChpID09IChzaXplb2YgKGRlZmluZXMpIC8gc2l6ZW9mIChkZWZpbmVzWzBdKSkgLSAxKQotCQkJIHx8ICgoKGkgKyAxKSAlIGNvbHMpID09IDApKQotCQkJPyAwCi0JCQk6IG1heF9sZW4gKyA0IC0gc3RybGVuIChkZWZpbmVzW2ldKSksCi0JCSAgICAgICAiIik7Ci0gICAgfQotICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIF9PUFRJT05TX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL29wdGlvbnMuaCBiL3NpbS9wcGMvb3B0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRiOWViLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvb3B0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSAgICAqLwotCi0jaWZuZGVmIF9PUFRJT05TX0hfCi0jZGVmaW5lIF9PUFRJT05TX0hfCi0KLSNpZm5kZWYgSU5MSU5FX09QVElPTlMKLSNkZWZpbmUgSU5MSU5FX09QVElPTlMKLSNlbmRpZgotCi1JTkxJTkVfT1BUSU9OUyh2b2lkKSBwcmludF9vcHRpb25zICh2b2lkKTsKLQotI2VuZGlmIC8qIF9PUFRJT05TX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL29zX2VtdWwuYyBiL3NpbS9wcGMvb3NfZW11bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYwYzhmLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvb3NfZW11bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX09TX0VNVUxfQ18KLSNkZWZpbmUgX09TX0VNVUxfQ18KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImlkZWNvZGUuaCIKLSNpbmNsdWRlICJvc19lbXVsLmgiCi0KLSNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJlbXVsX25ldGJzZC5oIgotI2luY2x1ZGUgImVtdWxfdW5peC5oIgotI2luY2x1ZGUgImVtdWxfY2hpcnAuaCIKLSNpbmNsdWRlICJlbXVsX2J1Z2FwaS5oIgotCi1zdGF0aWMgY29uc3Qgb3NfZW11bCAqKG9zX2VtdWxhdGlvbnNbXSkgPSB7Ci0gICZlbXVsX2NoaXJwLAotICAmZW11bF9idWdhcGksCi0gICZlbXVsX25ldGJzZCwKLSAgJmVtdWxfc29sYXJpcywKLSAgJmVtdWxfbGludXgsCi0gIDAKLX07Ci0KLQotSU5MSU5FX09TX0VNVUxcCi0ob3NfZW11bCAqKQotb3NfZW11bF9jcmVhdGUoY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCSAgICAgICBkZXZpY2UgKnJvb3QpCi17Ci0gIGNvbnN0IGNoYXIgKmVtdWxhdGlvbl9uYW1lID0gTlVMTDsKLSAgYmZkICppbWFnZTsKLSAgb3NfZW11bCAqY2hvc2VuX2VtdWxhdGlvbiA9IE5VTEw7Ci0KLSAgYmZkX2luaXQoKTsgLyogd291bGQgbmV2ZXIgaHVydCAqLwotCi0gIC8qIG9wZW4gdGhlIGZpbGUgKi8KLSAgaW1hZ2UgPSBiZmRfb3BlbnIoZmlsZV9uYW1lLCBOVUxMKTsKLSAgaWYgKGltYWdlID09IE5VTEwpIHsKLSAgICBiZmRfcGVycm9yKGZpbGVfbmFtZSk7Ci0gICAgZXJyb3IoIm5vdGhpbmcgbG9hZGVkXG4iKTsKLSAgfQotCi0gIC8qIGNoZWNrIGl0IGlzIGFuIGV4ZWN1dGFibGUgKi8KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0KGltYWdlLCBiZmRfb2JqZWN0KSkgewotICAgIFRSQUNFKHRyYWNlX3RiZCwKLQkgICgiRklYTUUgLSBzaG91bGQgY2hlY2sgbW9yZSB0aGFuIGp1c3QgYmZkX2NoZWNrX2Zvcm1hdFxuIikpOwotICAgIFRSQUNFKHRyYWNlX29zX2VtdWwsCi0JICAoIiVzIG5vdCBhbiBleGVjdXRhYmxlLCBhc3N1bWVpbmcgYSBkZXZpY2UgZmlsZVxuIiwgZmlsZV9uYW1lKSk7Ci0gICAgYmZkX2Nsb3NlKGltYWdlKTsKLSAgICBpbWFnZSA9IE5VTEw7Ci0gIH0KLQotICAvKiBpZiBhIGRldmljZSBmaWxlLCBsb2FkIHRoYXQgYmVmb3JlIHRyeWluZyB0aGUgZW11bGF0aW9ucyBvbiAqLwotICBpZiAoaW1hZ2UgPT0gTlVMTCkgewotICAgIHBzaW1fbWVyZ2VfZGV2aWNlX2ZpbGUocm9vdCwgZmlsZV9uYW1lKTsKLSAgfQotCi0gIC8qIHNlZSBpZiB0aGUgZGV2aWNlIHRyZWUgYWxyZWFkeSBzcGVjaWZpZXMgdGhlIHJlcXVpcmVkIGVtdWxhdGlvbiAqLwotICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vcy1lbXVsIikgIT0gTlVMTCkKLSAgICBlbXVsYXRpb25fbmFtZSA9Ci0gICAgICB0cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vcy1lbXVsIik7Ci0gIGVsc2UKLSAgICBlbXVsYXRpb25fbmFtZSA9IE5VTEw7Ci0KLSAgLyogZ28gdGhyb3VnaCBlYWNoIGVtdWxhdGlvbiB0byBzZWUgaWYgdGhleSByZWNvbml6ZSBpdC4gRklYTUUgLQotICAgICBzaG91bGQgaGF2ZSBzb21lIHNvcnQgb2YgaW1wb3J0ZWQgdGFibGUgZnJvbSBhIHNlcGFyYXRlIGZpbGUgKi8KLSAgewotICAgIG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhOwotICAgIGNvbnN0IG9zX2VtdWwgKipwb3NzaWJsZV9lbXVsYXRpb247Ci0gICAgY2hvc2VuX2VtdWxhdGlvbiA9IE5VTEw7Ci0gICAgZm9yIChwb3NzaWJsZV9lbXVsYXRpb24gPSBvc19lbXVsYXRpb25zLCBlbXVsX2RhdGEgPSBOVUxMOwotCSAqcG9zc2libGVfZW11bGF0aW9uICE9IE5VTEwgJiYgZW11bF9kYXRhID09IE5VTEw7Ci0JIHBvc3NpYmxlX2VtdWxhdGlvbisrKSB7Ci0gICAgICBlbXVsX2RhdGEgPSAoKnBvc3NpYmxlX2VtdWxhdGlvbiktPmNyZWF0ZShyb290LAotCQkJCQkJaW1hZ2UsCi0JCQkJCQllbXVsYXRpb25fbmFtZSk7Ci0gICAgICBpZiAoZW11bF9kYXRhICE9IE5VTEwpIHsKLQljaG9zZW5fZW11bGF0aW9uID0gWkFMTE9DKG9zX2VtdWwpOwotCSpjaG9zZW5fZW11bGF0aW9uID0gKipwb3NzaWJsZV9lbXVsYXRpb247Ci0JY2hvc2VuX2VtdWxhdGlvbi0+ZGF0YSA9IGVtdWxfZGF0YTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBjbGVhbiB1cCAqLwotICBpZiAoaW1hZ2UgIT0gTlVMTCkKLSAgICBiZmRfY2xvc2UoaW1hZ2UpOwotICByZXR1cm4gY2hvc2VuX2VtdWxhdGlvbjsKLX0KLQotSU5MSU5FX09TX0VNVUxcCi0odm9pZCkKLW9zX2VtdWxfaW5pdChvc19lbXVsICplbXVsYXRpb24sCi0JICAgICBpbnQgbnJfY3B1cykKLXsKLSAgaWYgKGVtdWxhdGlvbiAhPSAob3NfZW11bCopMCkKLSAgICBlbXVsYXRpb24tPmluaXQoZW11bGF0aW9uLT5kYXRhLCBucl9jcHVzKTsKLX0KLQotSU5MSU5FX09TX0VNVUxcCi0odm9pZCkKLW9zX2VtdWxfc3lzdGVtX2NhbGwoY3B1ICpwcm9jZXNzb3IsCi0JCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgb3NfZW11bCAqZW11bGF0aW9uID0gY3B1X29zX2VtdWxhdGlvbihwcm9jZXNzb3IpOwotICBpZiAoZW11bGF0aW9uICE9IChvc19lbXVsKikwICYmIGVtdWxhdGlvbi0+c3lzdGVtX2NhbGwgIT0gMCkKLSAgICBlbXVsYXRpb24tPnN5c3RlbV9jYWxsKHByb2Nlc3NvciwgY2lhLCBlbXVsYXRpb24tPmRhdGEpOwotICBlbHNlCi0gICAgZXJyb3IoIlN5c3RlbSBjYWxsIGVtdWxhdGlvbiBub3QgYXZhaWxhYmxlXG4iKTsKLX0KLQotSU5MSU5FX09TX0VNVUxcCi0oaW50KQotb3NfZW11bF9pbnN0cnVjdGlvbl9jYWxsKGNwdSAqcHJvY2Vzc29yLAotCQkJIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkJIHVuc2lnbmVkX3dvcmQgcmEpCi17Ci0gIG9zX2VtdWwgKmVtdWxhdGlvbiA9IGNwdV9vc19lbXVsYXRpb24ocHJvY2Vzc29yKTsKLSAgaWYgKGVtdWxhdGlvbiAhPSAob3NfZW11bCopMCAmJiBlbXVsYXRpb24tPmluc3RydWN0aW9uX2NhbGwgIT0gMCkKLSAgICByZXR1cm4gZW11bGF0aW9uLT5pbnN0cnVjdGlvbl9jYWxsKHByb2Nlc3NvciwgY2lhLCByYSwgZW11bGF0aW9uLT5kYXRhKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0KLSNlbmRpZiAvKiBfT1NfRU1VTF9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9vc19lbXVsLmggYi9zaW0vcHBjL29zX2VtdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3NGU5Yy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL29zX2VtdWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX09TX0VNVUxfSF8KLSNkZWZpbmUgX09TX0VNVUxfSF8KLQotdHlwZWRlZiBzdHJ1Y3QgX29zX2VtdWwgb3NfZW11bDsKLQotSU5MSU5FX09TX0VNVUxcCi0ob3NfZW11bCAqKSBvc19lbXVsX2NyZWF0ZQotKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLSBkZXZpY2UgKnJvb3QpOwotCi1JTkxJTkVfT1NfRU1VTFwKLSh2b2lkKSBvc19lbXVsX2luaXQKLShvc19lbXVsICplbXVsYXRpb24sCi0gaW50IG5yX2NwdXMpOwotCi0KLS8qIFN5c3RlbS1jYWxsIGVtdWxhdGlvbiAtIGZvciB1c2VyIGNvZGUuICBJbnN0ZWFkIG9mIHRyYXBwaW5nIHN5c3RlbQotICAgY2FsbHMgdG8ga2VybmVsIG1vZGUsIHRoZSBzaW11bGF0b3IgZW11bGF0ZXMgdGhlIGtlcm5lbHMgYmVoYXZvdXIgKi8KLQotSU5MSU5FX09TX0VNVUxcCi0odm9pZCkgb3NfZW11bF9zeXN0ZW1fY2FsbAotKGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotCi0vKiBJbnN0cnVjdGlvbiBlbXVsYXRpb24gLSBmb3Iga2VybmVsIGNvZGUuICBFeHRyYSAobm9ybWFsbHkgaWxsZWdhbCkKLSAgIGluc3RydWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGluc3RydWN0aW9uIHRhYmxlIHRoYXQgd2hlbiBleGVjdXRlZAotICAgY2FsbCB0aGlzIGVtdWxhdGlvbiBmdW5jdGlvbi4gVGhlIGluc3RydWN0aW9uIGNhbGwgZW11bGF0b3Igc2hvdWxkCi0gICB2ZXJpZnkgdGhlIGFkZHJlc3MgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gYXBwZWFycyBiZWZvcmUgZW11bGF0aW5nCi0gICB0aGUgcmVxdWlyZWQgYmVoYXZvdXIuICBJZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLCBhIHplcm8gdmFsdWUKLSAgIHNob3VsZCBiZSByZXR1cm5lZCAoaW5kaWNhdGluZyBpbnN0cnVjdGlvbiBpbGxlZ2FsKS4gKi8KLQotSU5MSU5FX09TX0VNVUxcCi0oaW50KSBvc19lbXVsX2luc3RydWN0aW9uX2NhbGwKLShjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSwKLSB1bnNpZ25lZF93b3JkIHJhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL3BrX2Rpc2tsYWJlbC5jIGIvc2ltL3BwYy9wa19kaXNrbGFiZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkY2Y3Yy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3BrX2Rpc2tsYWJlbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotICAgIAotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotICAgIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAgCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAgICAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1BLX0RJU0tMQUJFTF9DXwotI2RlZmluZSBfUEtfRElTS0xBQkVMX0NfCi0KLSNpZm5kZWYgU1RBVElDX0lOTElORV9QS19ESVNLTEFCRUwKLSNkZWZpbmUgU1RBVElDX0lOTElORV9QS19ESVNLTEFCRUwgU1RBVElDX0lOTElORQotI2VuZGlmCi0KLSNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKLQotI2luY2x1ZGUgInBrLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotCi0KLS8qIFBBQ0tBR0UKLQotICAgZGlzay1sYWJlbCAtIGFsbCBrbm93aW5nIGRpc2sgSS9PIHBhY2thZ2UKLQotICAgREVTQ1JJUFRJT04KLQotICAgVGhlIGRpc2stbGFiZWwgcGFja2FnZSBwcm92aWRlcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHRvIGRpc2sKLSAgIGRldmljZXMuICBJdCB1c2VzIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIHdoZW4gYW4gaW5zdGFuY2UgaXMgYmVpbmcKLSAgIGNyZWF0ZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByYXcgZGlzaywgYSBwYXJ0aXRpb24sIG9yIGEgZmlsZSB3aXRoaW4KLSAgIGEgcGFydGl0aW9uIHNob3VsZCBiZSBvcGVuZWQuCi0KLSAgIEFuIGluc3RhbmNlIGNyZWF0ZSBjYWxsIHRvIGRpc2stbGFiZWwgY291bGQgcmVzdWx0LCBmb3IgaW5zdGFuY2UsCi0gICBpbiB0aGUgb3BlbmluZyBvZiBhIERPUyBmaWxlIHN5c3RlbSBjb250YWluZWQgd2l0aGluIGEgZG9zCi0gICBwYXJ0aXRpb24gY29udGFpbmVkIHdpdGhpbiBhIHBoeXNpY2FsIGRpc2suCi0KLSAgICovCi0KLS8qIHRha2VuIGZyb20gYmZkL3BwY2Jvb3QuYyBieSBNaWNoYWVsIE1laXNzbmVyICovCi0KLS8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24gewotICB1bnNpZ25lZDggaW5kOwotICB1bnNpZ25lZDggaGVhZDsKLSAgdW5zaWduZWQ4IHNlY3RvcjsKLSAgdW5zaWduZWQ4IGN5bGluZGVyOwotfSBwcGNib290X2xvY2F0aW9uX3Q7Ci0KLS8qIFBQQ2J1ZyBwYXJ0aXRpb24gdGFibGUgbGF5b3V0ICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X3BhcnRpdGlvbiB7Ci0gIHBwY2Jvb3RfbG9jYXRpb25fdCBwYXJ0aXRpb25fYmVnaW47CS8qIHBhcnRpdGlvbiBiZWdpbiAqLwotICBwcGNib290X2xvY2F0aW9uX3QgcGFydGl0aW9uX2VuZDsJLyogcGFydGl0aW9uIGVuZCAqLwotICB1bnNpZ25lZDggc2VjdG9yX2JlZ2luWzRdOwkJLyogMzItYml0IHN0YXJ0IFJCQSAoemVyby1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KLSAgdW5zaWduZWQ4IHNlY3Rvcl9sZW5ndGhbNF07CQkvKiAzMi1iaXQgUkJBIGNvdW50IChvbmUtYmFzZWQpLCBsaXR0bGUgZW5kaWFuICovCi19IHBwY2Jvb3RfcGFydGl0aW9uX3Q7Ci0KLSNpZiAwCi0vKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgewotICB1bnNpZ25lZDgJCXBjX2NvbXBhdGliaWxpdHlbNDQ2XTsJLyogeDg2IGluc3RydWN0aW9uIGZpZWxkICovCi0gIHBwY2Jvb3RfcGFydGl0aW9uX3QJcGFydGl0aW9uWzRdOwkJLyogcGFydGl0aW9uIGluZm9ybWF0aW9uICovCi0gIHVuc2lnbmVkOAkJc2lnbmF0dXJlWzJdOwkJLyogMHg1NSBhbmQgMHhhYSAqLwotICB1bnNpZ25lZDgJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCi0gIHVuc2lnbmVkOAkJbGVuZ3RoWzRdOwkJLyogbG9hZCBpbWFnZSBsZW5ndGgsIGxpdHRsZSBlbmRpYW4gKi8KLSAgdW5zaWduZWQ4CQlmbGFnczsJCQkvKiBmbGFnIGZpZWxkICovCi0gIHVuc2lnbmVkOAkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KLSAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KLSAgdW5zaWduZWQ4CQlyZXNlcnZlZDFbNDcwXTsJCS8qIHJlc2VydmVkICovCi19IHBwY2Jvb3RfaGRyX3Q7Ci0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCBfZGlza2xhYmVsIHsKLSAgZGV2aWNlX2luc3RhbmNlICpwYXJlbnQ7Ci0gIGRldmljZV9pbnN0YW5jZSAqcmF3X2Rpc2s7Ci0gIHVuc2lnbmVkX3dvcmQgcG9zOwotICB1bnNpZ25lZF93b3JkIHNlY3Rvcl9iZWdpbjsKLSAgdW5zaWduZWRfd29yZCBzZWN0b3JfbGVuZ3RoOwotfSBkaXNrbGFiZWw7Ci0KLQotc3RhdGljIHVuc2lnbmVkX3dvcmQKLXNlY3RvcjJ1dyh1bnNpZ25lZDggc1s0XSkKLXsKLSAgcmV0dXJuICgoc1szXSA8PCAyNCkKLQkgICsgKHNbMl0gPDwgMTYpCi0JICArIChzWzFdIDw8IDgpCi0JICArIChzWzBdIDw8IDApKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZGlza2xhYmVsX2RlbGV0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQotewotICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKGxhYmVsLT5yYXdfZGlzayk7Ci0gIHpmcmVlKGxhYmVsKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1kaXNrbGFiZWxfcmVhZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAotCSAgICAgICB2b2lkICpidWYsCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgbGVuKQotewotICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBpbnQgbnJfcmVhZDsKLSAgaWYgKGxhYmVsLT5wb3MgKyBsZW4gPiBsYWJlbC0+c2VjdG9yX2xlbmd0aCkKLSAgICBsZW4gPSBsYWJlbC0+c2VjdG9yX2xlbmd0aCAtIGxhYmVsLT5wb3M7Ci0gIGlmIChkZXZpY2VfaW5zdGFuY2Vfc2VlayhsYWJlbC0+cmF3X2Rpc2ssIDAsCi0JCQkgICBsYWJlbC0+c2VjdG9yX2JlZ2luICsgbGFiZWwtPnBvcykgPCAwKQotICAgIHJldHVybiAtMTsKLSAgbnJfcmVhZCA9IGRldmljZV9pbnN0YW5jZV9yZWFkKGxhYmVsLT5yYXdfZGlzaywgYnVmLCBsZW4pOwotICBpZiAobnJfcmVhZCA+IDApCi0gICAgbGFiZWwtPnBvcyArPSBucl9yZWFkOwotICByZXR1cm4gbnJfcmVhZDsKLX0KLQotc3RhdGljIGludAotZGlza2xhYmVsX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCWNvbnN0IHZvaWQgKmJ1ZiwKLQkJdW5zaWduZWRfd29yZCBsZW4pCi17Ci0gIGRpc2tsYWJlbCAqbGFiZWwgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7Ci0gIGludCBucl93cml0dGVuOwotICBpZiAobGFiZWwtPnBvcyArIGxlbiA+IGxhYmVsLT5zZWN0b3JfbGVuZ3RoKQotICAgIGxlbiA9IGxhYmVsLT5zZWN0b3JfbGVuZ3RoIC0gbGFiZWwtPnBvczsKLSAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKGxhYmVsLT5yYXdfZGlzaywgMCwKLQkJCSAgIGxhYmVsLT5zZWN0b3JfYmVnaW4gKyBsYWJlbC0+cG9zKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICBucl93cml0dGVuID0gZGV2aWNlX2luc3RhbmNlX3dyaXRlKGxhYmVsLT5yYXdfZGlzaywgYnVmLCBsZW4pOwotICBpZiAobnJfd3JpdHRlbiA+IDApCi0gICAgbGFiZWwtPnBvcyArPSBucl93cml0dGVuOwotICByZXR1cm4gbnJfd3JpdHRlbjsKLX0KLQotc3RhdGljIGludAotZGlza2xhYmVsX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKLQkgICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCi0JICAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQotewotICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOwotICBpZiAocG9zX2xvID49IGxhYmVsLT5zZWN0b3JfbGVuZ3RoIHx8IHBvc19oaSAhPSAwKQotICAgIHJldHVybiAtMTsKLSAgbGFiZWwtPnBvcyA9IHBvc19sbzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgcGFja2FnZV9kaXNrbGFiZWxfY2FsbGJhY2tzID0gewotICBkaXNrbGFiZWxfZGVsZXRlLAotICBkaXNrbGFiZWxfcmVhZCwKLSAgZGlza2xhYmVsX3dyaXRlLAotICBkaXNrbGFiZWxfc2VlaywKLX07Ci0KLS8qIFJlY29uaXplIGRpZmZlcmVudCB0eXBlcyBvZiBib290IGJsb2NrICovCi0KLXN0YXRpYyBpbnQKLWJsb2NrMF9pc19icGIoY29uc3QgdW5zaWduZWQ4IGJsb2NrW10pCi17Ci0gIGNvbnN0IGNoYXIgZWJkaWNfaWJtYVtdID0geyAweGM5LCAweGMyLCAweGQ0LCAweGMxIH07Ci0gIC8qIHJlZiBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENIUlAgYmluZGluZ3MgMS4yYiAtIHBhZ2UgNDcgKi8KLSAgLyogY2FuJ3Qgc3RhcnQgd2l0aCBJQk1BICovCi0gIGlmIChtZW1jbXAoYmxvY2ssIGViZGljX2libWEsIHNpemVvZihlYmRpY19pYm1hKSkgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgLyogbXVzdCBoYXZlIExFIDB4QUE1NSBzaWduYXR1cmUgYXQgb2Zmc2V0IDUxMCAqLwotICBpZiAoYmxvY2tbNTExXSAhPSAweEFBICYmIGJsb2NrWzUxMF0gIT0gMHg1NSkKLSAgICByZXR1cm4gMDsKLSAgLyogdmFsaWQgMTYgYml0IExFIGJ5dGVzIHBlciBzZWN0b3IgLSAyNTYsIDUxMiwgMTAyNCAqLwotICBpZiAoYmxvY2tbMTFdICE9IDAKLSAgICAgIHx8IChibG9ja1sxMl0gIT0gMSAmJiBibG9ja1sxMl0gIT0gMiAmJiBibG9ja1sxMl0gIT0gNCkpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIG5yIGZhdHMgaXMgMSBvciAyICovCi0gIGlmIChibG9ja1sxNl0gIT0gMSAmJiBibG9ja1sxNl0gIT0gMikKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogVmVyaWZ5IHRoYXQgdGhlIGRldmljZSBjb250YWlucyBhbiBJU08tOTY2MCBGaWxlIHN5c3RlbSAqLwotCi1zdGF0aWMgaW50Ci1pc19pc285NjYwKGRldmljZV9pbnN0YW5jZSAqcmF3X2Rpc2spCi17Ci0gIC8qIHJlZiBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENIUlAgYmluZGluZ3MgMS4yYiAtIHBhZ2UgNDcgKi8KLSAgdW5zaWduZWQ4IGJsb2NrWzUxMl07Ci0gIGlmIChkZXZpY2VfaW5zdGFuY2Vfc2VlayhyYXdfZGlzaywgMCwgNTEyICogNjQpIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGRldmljZV9pbnN0YW5jZV9yZWFkKHJhd19kaXNrLCBibG9jaywgc2l6ZW9mKGJsb2NrKSkgIT0gc2l6ZW9mKGJsb2NrKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGJsb2NrWzBdID09IDB4MDEKLSAgICAgICYmIGJsb2NrWzFdID09ICdDJwotICAgICAgJiYgYmxvY2tbMl0gPT0gJ0QnCi0gICAgICAmJiBibG9ja1szXSA9PSAnMCcKLSAgICAgICYmIGJsb2NrWzRdID09ICcwJwotICAgICAgJiYgYmxvY2tbNV0gPT0gJzEnKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBWZXJpZnkgdGhhdCB0aGUgZGlzayBibG9jayBjb250YWlucyBhIHZhbGlkIERPUyBwYXJ0aXRpb24gdGFibGUuCi0gICBXaGlsZSB3ZSdyZSBhdCBpdCBoYXZlIGEgbG9vayBhcm91bmQgZm9yIGFjdGl2ZSBwYXJ0aXRpb25zIGV0Yy4KLQotICAgUmV0dXJuIDA6IGludmFsaWQKLSAgIFJldHVybiAxLi40OiB2YWxpZCwgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwYXJ0aXRpb24KLSAgIFJldHVybiAtMTogbm8gYWN0aXZlIHBhcnRpdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1ibG9jazBfaXNfZmRpc2soY29uc3QgdW5zaWduZWQ4IGJsb2NrW10pCi17Ci0gIGNvbnN0IGludCBwYXJ0aXRpb25fdHlwZV9maWVsZHNbXSA9IHsgMCwgMHgxYzIsIDB4MWQyLCAweDFlMiwgMHgxZjIgfTsKLSAgY29uc3QgaW50IHBhcnRpdGlvbl9hY3RpdmVfZmllbGRzW10gPSB7IDAsIDB4MWJlLCAweDFjZSwgMHgxZGUsIDB4ZWUgfTsKLSAgaW50IHBhcnRpdGlvbjsKLSAgaW50IGFjdGl2ZSA9IC0xOwotICAvKiByZWYgUG93ZXJQQyBNaWNyb3Byb2Nlc3NvciBDSFJQIGJpbmRpbmdzIDEuMmIgLSBwYWdlIDQ3ICovCi0gIC8qIG11c3QgaGF2ZSBMRSAweEFBNTUgc2lnbmF0dXJlIGF0IG9mZnNldCA1MTAgKi8KLSAgaWYgKGJsb2NrWzUxMS8qMHgxZmYqL10gIT0gMHhBQSAmJiBibG9ja1s1MTAvKjB4MWZlKi9dICE9IDB4NTUpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIG11c3QgY29udGFpbiB2YWxpZCBwYXJ0aXRpb24gdHlwZXMgKi8KLSAgZm9yIChwYXJ0aXRpb24gPSAxOyBwYXJ0aXRpb24gPD0gNCAmJiBhY3RpdmUgIT0gMDsgcGFydGl0aW9uKyspIHsKLSAgICBpbnQgcGFydGl0aW9uX3R5cGUgPSBibG9ja1twYXJ0aXRpb25fdHlwZV9maWVsZHNbcGFydGl0aW9uXV07Ci0gICAgaW50IGlzX2FjdGl2ZSA9IGJsb2NrW3BhcnRpdGlvbl9hY3RpdmVfZmllbGRzW3BhcnRpdGlvbl1dID09IDB4ODA7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLSAgICBzd2l0Y2ggKHBhcnRpdGlvbl90eXBlKSB7Ci0gICAgY2FzZSAweDAwOgotICAgICAgdHlwZSA9ICJVTlVTRUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDAxOgotICAgICAgdHlwZSA9ICJGQVQgMTIgRmlsZSBzeXN0ZW0iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA0OgotICAgICAgdHlwZSA9ICJGQVQgMTYgRmlsZSBzeXN0ZW0iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA1OgotICAgIGNhc2UgMHgwNjoKLSAgICAgIHR5cGUgPSAicmVqZWN0ZWQgLSBleHRlbmRlZC9jaGFpbmVkIHBhcnRpdGlvbiBub3Qgc3VwcG9ydGVkIjsKLSAgICAgIGFjdGl2ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NDE6Ci0gICAgICB0eXBlID0gIlNpbmdsZSBwcm9ncmFtIGltYWdlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4MjoKLSAgICAgIHR5cGUgPSAiU29sYXJpcz8iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDk2OgotICAgICAgdHlwZSA9ICJJU08gOTY2MCBGaWxlIHN5c3RlbSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdHlwZSA9ICJyZWplY3RlZCAtIHVua25vd24gdHlwZSI7Ci0gICAgICBhY3RpdmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFBUUkFDRShkaXNrbGFiZWwsICgicGFydGl0aW9uICVkIG9mIHR5cGUgMHglMDJ4IC0gJXMlc1xuIiwKLQkJICAgICAgIHBhcnRpdGlvbiwKLQkJICAgICAgIHBhcnRpdGlvbl90eXBlLAotCQkgICAgICAgdHlwZSwKLQkJICAgICAgIGlzX2FjdGl2ZSAmJiBhY3RpdmUgIT0gMCA/ICIgKGFjdGl2ZSkiIDogIiIpKTsKLSAgICBpZiAocGFydGl0aW9uX3R5cGUgIT0gMCAmJiBpc19hY3RpdmUgJiYgYWN0aXZlIDwgMCkKLSAgICAgIGFjdGl2ZSA9IHBhcnRpdGlvbjsKLSAgfQotICByZXR1cm4gYWN0aXZlOwotfQotCi0KLS8qIFZlcmlmeSB0aGF0IGJsb2NrMCBjb3JyZXNwb25kcyB0byBhIE1BQyBkaXNrICovCi0KLXN0YXRpYyBpbnQKLWJsb2NrMF9pc19tYWNfZGlzayhjb25zdCB1bnNpZ25lZDggYmxvY2tbXSkKLXsKLSAgLyogcmVmIFBvd2VyUEMgTWljcm9wcm9jZXNzb3IgQ0hSUCBiaW5kaW5ncyAxLjJiIC0gcGFnZSA0NyAqLwotICAvKiBzaWduYXR1cmUgLSBCRXg0NTUyIGF0IG9mZnNldCAwICovCi0gIGlmIChibG9ja1swXSAhPSAweDQ1IHx8IGJsb2NrWzFdICE9IDB4NTIpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qIE9wZW4gYSBsb2dpY2FsIGRpc2svZmlsZSAqLwotCi1kZXZpY2VfaW5zdGFuY2UgKgotcGtfZGlza2xhYmVsX2NyZWF0ZV9pbnN0YW5jZShkZXZpY2VfaW5zdGFuY2UgKnJhd19kaXNrLAotCQkJICAgICBjb25zdCBjaGFyICphcmdzKQotewotICBpbnQgcGFydGl0aW9uOwotICBjaGFyICpmaWxlbmFtZTsKLQotICAvKiBwYXJzZSB0aGUgYXJndW1lbnRzICovCi0gIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICBwYXJ0aXRpb24gPSAwOwotICAgIGZpbGVuYW1lID0gTlVMTDsKLSAgfQotICBlbHNlIHsKLSAgICBwYXJ0aXRpb24gPSBzdHJ0b3VsKChjaGFyKilhcmdzLCAmZmlsZW5hbWUsIDApOwotICAgIGlmIChmaWxlbmFtZSA9PSBhcmdzKQotICAgICAgcGFydGl0aW9uID0gLTE7IC8qIG5vdCBzcGVjaWZpZWQgKi8KLSAgICBpZiAoKmZpbGVuYW1lID09ICcsJykKLSAgICAgIGZpbGVuYW1lKys7Ci0gICAgaWYgKCpmaWxlbmFtZSA9PSAnXDAnKQotICAgICAgZmlsZW5hbWUgPSBOVUxMOyAvKiBlYXNpZXIgKi8KLSAgfQotCi0gIGlmIChwYXJ0aXRpb24gPT0gMCkgewotICAgIC8qIHNlbGVjdCB0aGUgcmF3IGRpc2sgKi8KLSAgICByZXR1cm4gcmF3X2Rpc2s7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdW5zaWduZWQ4IGJvb3RfYmxvY2tbNTEyXTsKLSAgICAvKiBnZXQgdGhlIGJvb3QgYmxvY2sgZm9yIGV4YW1pbmF0aW9uICovCi0gICAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKHJhd19kaXNrLCAwLCAwKSA8IDApCi0gICAgICBkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksCi0JCSAgICJQcm9ibGVtIHNlZWtpbmcgb24gcmF3IGRpc2siKTsKLSAgICBpZiAoZGV2aWNlX2luc3RhbmNlX3JlYWQocmF3X2Rpc2ssICZib290X2Jsb2NrLCBzaXplb2YoYm9vdF9ibG9jaykpCi0JIT0gc2l6ZW9mKGJvb3RfYmxvY2spKQotICAgICAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLCAiUHJvYmxlbSByZWFkaW5nIGJvb3QgYmxvY2siKTsKLQotICAgIGlmIChwYXJ0aXRpb24gPCAwKSB7Ci0gICAgICAvKiBzZWxlY3QgdGhlIGFjdGl2ZSBwYXJ0aXRpb24gKi8KLSAgICAgIGlmIChibG9jazBfaXNfYnBiKGJvb3RfYmxvY2spKSB7Ci0JZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLCAiVW5pbXBsZW1lbnRlZCBhY3RpdmUgQlBCIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChibG9jazBfaXNfZmRpc2soYm9vdF9ibG9jaykpIHsKLQlpbnQgYWN0aXZlID0gYmxvY2swX2lzX2ZkaXNrKGJvb3RfYmxvY2spOwotCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIEZESVNLICglZCkiLAotCQkgICAgIGFjdGl2ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpc19pc285NjYwKHJhd19kaXNrKSkgewotCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIElTTzk2NjAiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGJsb2NrMF9pc19tYWNfZGlzayhib290X2Jsb2NrKSkgewotCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIE1BQyBESVNLIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbnJlY29uaXplZCBib290YmxvY2siKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBzZWxlY3QgdGhlIHNwZWNpZmllZCBkaXNrIHBhcnRpdGlvbiAqLwotICAgICAgaWYgKGJsb2NrMF9pc19icGIoYm9vdF9ibG9jaykpIHsKLQlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbmltcGxlbWVudGVkIEJQQiIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYmxvY2swX2lzX2ZkaXNrKGJvb3RfYmxvY2spKSB7Ci0JLyogcmV0dXJuIGFuIGluc3RhbmNlICovCi0JcHBjYm9vdF9wYXJ0aXRpb25fdCAqcGFydGl0aW9uX3RhYmxlID0gKHBwY2Jvb3RfcGFydGl0aW9uX3QqKSAmYm9vdF9ibG9ja1s0NDZdOwotCXBwY2Jvb3RfcGFydGl0aW9uX3QgKnBhcnRpdGlvbl9lbnRyeTsKLQlkaXNrbGFiZWwgKmxhYmVsOwotCWlmIChwYXJ0aXRpb24gPiA0KQotCSAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLAotCQkgICAgICAgIk9ubHkgRkRJU0sgcGFydGl0aW9ucyAxLi40IHN1cHBvcnRlZCIpOwotCXBhcnRpdGlvbl9lbnRyeSA9ICZwYXJ0aXRpb25fdGFibGVbcGFydGl0aW9uIC0gMV07Ci0JbGFiZWwgPSBaQUxMT0MoZGlza2xhYmVsKTsKLQlsYWJlbC0+cmF3X2Rpc2sgPSByYXdfZGlzazsKLQlsYWJlbC0+cG9zID0gMDsKLQlsYWJlbC0+c2VjdG9yX2JlZ2luID0gNTEyICogc2VjdG9yMnV3KHBhcnRpdGlvbl9lbnRyeS0+c2VjdG9yX2JlZ2luKTsKLQlsYWJlbC0+c2VjdG9yX2xlbmd0aCA9IDUxMiAqIHNlY3RvcjJ1dyhwYXJ0aXRpb25fZW50cnktPnNlY3Rvcl9sZW5ndGgpOwotCVBUUkFDRShkaXNrbGFiZWwsICgicGFydGl0aW9uICVsZCwgc2VjdG9yLWJlZ2luICVsZCwgbGVuZ3RoICVsZFxuIiwKLQkJCSAgIChsb25nKXBhcnRpdGlvbiwKLQkJCSAgIChsb25nKWxhYmVsLT5zZWN0b3JfYmVnaW4sCi0JCQkgICAobG9uZylsYWJlbC0+c2VjdG9yX2xlbmd0aCkpOwotCWlmIChmaWxlbmFtZSAhPSBOVUxMKQotCSAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLAotCQkgICAgICAgIkZESVNLIGZpbGUgbmFtZXMgbm90IHlldCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKE5VTEwsIHJhd19kaXNrLAotCQkJCQkgICBsYWJlbCwKLQkJCQkJICAgTlVMTCwgYXJncywKLQkJCQkJICAgJnBhY2thZ2VfZGlza2xhYmVsX2NhbGxiYWNrcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChibG9jazBfaXNfbWFjX2Rpc2soYm9vdF9ibG9jaykpIHsKLQlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbmltcGxlbWVudGVkIE1BQyBESVNLIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksCi0JCSAgICAgIlVucmVjb25pemVkIGJvb3RibG9jayIpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0gIAotICAKLSNlbmRpZiAvKiBfUEtfRElTS0xBQkVMX0NfICovCi0KZGlmZiAtLWdpdCBhL3NpbS9wcGMvcHBjLWNhY2hlLXJ1bGVzIGIvc2ltL3BwYy9wcGMtY2FjaGUtcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY0NzIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9wcGMtY2FjaGUtcnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jCi0jICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi1jYWNoZTpSQTpSQTo6Ci1jYWNoZTpSQTpyQTpzaWduZWRfd29yZCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwciArIFJBKQotY2FjaGU6UkE6UkFfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IFJBKQotY29tcHV0ZTpSQTpSQV9pc18wOmludDooUkEgPT0gMCkKLWNhY2hlOlJUOlJUOjoKLWNhY2hlOlJUOnJUOnNpZ25lZF93b3JkICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByICsgUlQpCi1jYWNoZTpSVDpSVF9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgUlQpCi1jYWNoZTpSUzpSUzo6Ci1jYWNoZTpSUzpyUzpzaWduZWRfd29yZCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwciArIFJTKQotY2FjaGU6UlM6UlNfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IFJTKQotY2FjaGU6UkI6UkI6OgotY2FjaGU6UkI6ckI6c2lnbmVkX3dvcmQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHIgKyBSQikKLWNhY2hlOlJCOlJCX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBSQikKLXNjcmF0Y2g6RlJBOkZSQTo6Ci1jYWNoZTpGUkE6ZnJBOnVuc2lnbmVkNjQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHIgKyBGUkEpCi1jYWNoZTpGUkE6RlJBX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBGUkEpCi1zY3JhdGNoOkZSQjpGUkI6OgotY2FjaGU6RlJCOmZyQjp1bnNpZ25lZDY0ICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnByICsgRlJCKQotY2FjaGU6RlJCOkZSQl9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgRlJCKQotc2NyYXRjaDpGUkM6RlJDOjoKLWNhY2hlOkZSQzpmckM6dW5zaWduZWQ2NCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwciArIEZSQykKLWNhY2hlOkZSQzpGUkNfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEZSQykKLXNjcmF0Y2g6RlJTOkZSUzo6Ci1jYWNoZTpGUlM6ZnJTOnVuc2lnbmVkNjQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHIgKyBGUlMpCi1jYWNoZTpGUlM6RlJTX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBGUlMpCi1zY3JhdGNoOkZSVDpGUlQ6OgotY2FjaGU6RlJUOmZyVDp1bnNpZ25lZDY0ICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnByICsgRlJUKQotY2FjaGU6RlJUOkZSVF9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgRlJUKQotY2FjaGU6U0k6RVhUU19TSTp1bnNpZ25lZF93b3JkOigoc2lnbmVkX3dvcmQpKHNpZ25lZDE2KWluc3RydWN0aW9uKQotc2NyYXRjaDpCSTpCSTo6Ci1jYWNoZTpCSTpCSVQzMl9CSTo6QklUMzIoQkkpCi1jYWNoZTpCRjpCRjo6Ci1jYWNoZTpCRjpCRl9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgQkYpCi1zY3JhdGNoOkJBOkJBOjoKLWNhY2hlOkJBOkJJVDMyX0JBOjpCSVQzMihCQSkKLWNhY2hlOkJBOkJBX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBCQSkKLXNjcmF0Y2g6QkI6QkI6OgotY2FjaGU6QkI6QklUMzJfQkI6OkJJVDMyKEJCKQotY2FjaGU6QkI6QkJfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEJCKQotY2FjaGU6QlQ6QlQ6OgotY2FjaGU6QlQ6QlRfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEJUKQotY2FjaGU6QkQ6RVhUU19CRF8wYjAwOnVuc2lnbmVkX3dvcmQ6KCgoc2lnbmVkX3dvcmQpKHNpZ25lZDE2KWluc3RydWN0aW9uKSAmIH4zKQotY2FjaGU6TEk6RVhUU19MSV8wYjAwOnVuc2lnbmVkX3dvcmQ6KCgoKHNpZ25lZF93b3JkKShzaWduZWQzMikoaW5zdHJ1Y3Rpb24gPDwgNikpID4+IDYpICYgfjB4MykKLWNhY2hlOkQ6RVhUU19EOnVuc2lnbmVkX3dvcmQ6KChzaWduZWRfd29yZCkoc2lnbmVkMTYpKGluc3RydWN0aW9uKSkKLWNhY2hlOkRTOkVYVFNfRFNfMGIwMDp1bnNpZ25lZF93b3JkOigoKHNpZ25lZF93b3JkKShzaWduZWQxNilpbnN0cnVjdGlvbikgJiB+MHgzKQotI2NvbXB1dGU6U1BSOlNQUl9pc18yNTY6aW50OihTUFIgPT0gMjU2KQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wcGMtaW5zdHJ1Y3Rpb25zIGIvc2ltL3BwYy9wcGMtaW5zdHJ1Y3Rpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWEzMjg3Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvcHBjLWluc3RydWN0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQ5MjcgKzAsMCBAQAotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0jCi0jICAgLS0KLSMKLSMgICBUaGUgcHNldWRvLWNvZGUgdGhhdCBhcHBlYXJzIGJlbG93LCB0cmFuc2xhdGVkIGludG8gQywgd2FzIGNvcGllZAotIyAgIGJ5IEFuZHJldyBDYWduZXkgb2YgTW9zcyBWYWxlLCBBdXN0cmFsaWEuCi0jCi0jICAgVGhpcyBwc2V1ZG8tY29kZSBpcyBjb3BpZWQgYnkgcGVybWlzc2lvbiBmcm9tIHRoZSBwdWJsaWNhdGlvbgotIyAgICJUaGUgUG93ZXJQQyBBcmNoaXRlY3R1cmU6IEEgU3BlY2lmaWNhdGlvbiBmb3IgQSBOZXcgRmFtaWx5IG9mCi0jICAgUklTQyBQcm9jZXNzb3JzIiAoSVNCTiAxLTU1ODYwLTMxNi02KSBjb3B5cmlnaHQgMTk5MywgMTk5NCBieQotIyAgIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24uCi0jCi0jICAgVEhJUyBQRVJNSVNTSU9OIElTIFBST1ZJREVEIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUgotIyAgIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIElNUExJRUQgV0FSUkFOVElFUwotIyAgIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0jCi0jICAgLS0KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0MCi0jIFBvd2VyUEMgbW9kZWxzCi06Om1vZGVsOjYwNDpwcGM2MDQ6ICBQUENfVU5JVF9CQUQsICAgUFBDX1VOSVRfQkFELCAgIDEsICAxLCAgMAotOjptb2RlbDo2MDNlOnBwYzYwM2U6UFBDX1VOSVRfQkFELCAgIFBQQ19VTklUX0JBRCwgICAxLCAgMSwgIDAKLTo6bW9kZWw6NjAzOnBwYzYwMzogIFBQQ19VTklUX0JBRCwgICBQUENfVU5JVF9CQUQsICAgMSwgIDEsICAwCi06Om1vZGVsOjYwMTpwcGM2MDE6ICBQUENfVU5JVF9CQUQsICAgUFBDX1VOSVRfQkFELCAgIDEsICAxLCAgMAotCi0jIEZsYWdzIGZvciBtb2RlbC5oCi06Om1vZGVsLW1hY3JvOjo6Ci0JI2RlZmluZSBQUENfSU5TTl9JTlQoT1VUX01BU0ssIElOX01BU0ssIFJDKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgeyBcCi0JCSAgICBpZiAoUkMpIFwKLQkJICAgICAgcHBjX2luc25faW50X2NyKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0ssIDEgPDwgMCk7IFwKLQkJICAgIGVsc2UgXAotCQkgICAgICBwcGNfaW5zbl9pbnQoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBPVVRfTUFTSywgSU5fTUFTSyk7IFwKLQkJICB9IFwKLQkJfSB3aGlsZSAoMCkKLQotCSNkZWZpbmUgUFBDX0lOU05fSU5UX0NSKE9VVF9NQVNLLCBJTl9NQVNLLCBDUl9NQVNLKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25faW50X2NyKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0ssIENSX01BU0spOyBcCi0JCX0gd2hpbGUgKDApCi0KLQkjZGVmaW5lIFBQQ19JTlNOX0NSKE9VVF9NQVNLLCBJTl9NQVNLKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25fY3IoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBPVVRfTUFTSywgSU5fTUFTSyk7IFwKLQkJfSB3aGlsZSAoMCkKLQotCSNkZWZpbmUgUFBDX0lOU05fRkxPQVQoT1VUX01BU0ssIElOX01BU0ssIFJDKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgeyBcCi0JCSAgICBpZiAoUkMpIFwKLQkJICAgICAgcHBjX2luc25fZmxvYXQoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBPVVRfTUFTSywgSU5fTUFTSyk7IFwKLQkJICAgIGVsc2UgXAotCQkgICAgICBwcGNfaW5zbl9mbG9hdF9jcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIE9VVF9NQVNLLCBJTl9NQVNLLCAxIDw8IDApOyBcCi0JCSAgfSBcCi0JCX0gd2hpbGUgKDApCi0KLQkjZGVmaW5lIFBQQ19JTlNOX0ZMT0FUX0NSKE9VVF9NQVNLLCBJTl9NQVNLLCBDUl9NQVNLKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25fZmxvYXRfY3IoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBPVVRfTUFTSywgSU5fTUFTSywgQ1JfTUFTSyk7IFwKLQkJfSB3aGlsZSAoMCkKLQotCSNkZWZpbmUgUFBDX0lOU05fSU5UX0ZMT0FUKE9VVF9JTlRfTUFTSywgT1VUX0ZQX01BU0ssIElOX0lOVF9NQVNLLCBJTl9GUF9NQVNLKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25faW50X2Zsb2F0KE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX0lOVF9NQVNLLCBPVVRfRlBfTUFTSywgSU5fSU5UX01BU0ssIElOX0ZQX01BU0spOyBcCi0JCX0gd2hpbGUgKDApCi0KLQkjZGVmaW5lIFBQQ19JTlNOX0ZST01fU1BSKElOVF9NQVNLLCBTUFIpIFwKLQkJZG8geyBcCi0JCSAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKSBcCi0JCSAgICBwcGNfaW5zbl9mcm9tX3NwcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIElOVF9NQVNLLCBTUFIpOyBcCi0JCX0gd2hpbGUgKDApCi0KLQkjZGVmaW5lIFBQQ19JTlNOX1RPX1NQUihJTlRfTUFTSywgU1BSKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25fdG9fc3ByKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgSU5UX01BU0ssIFNQUik7IFwKLQkJfSB3aGlsZSAoMCkKLQotCSNkZWZpbmUgUFBDX0lOU05fTUZDUihJTlRfTUFTSykgXAotCQlkbyB7IFwKLQkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKLQkJICAgIHBwY19pbnNuX21mY3IoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBJTlRfTUFTSyk7IFwKLQkJfSB3aGlsZSAoMCkKLQotCSNkZWZpbmUgUFBDX0lOU05fTVRDUihJTlRfTUFTSywgRlhNKSBcCi0JCWRvIHsgXAotCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAotCQkgICAgcHBjX2luc25fbXRjcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIElOVF9NQVNLLCBGWE0pOyBcCi0JCX0gd2hpbGUgKDApCi0KLTo6bW9kZWwtZGF0YTo6OgotCXR5cGVkZWYgZW51bSBfcHBjX2Z1bmN0aW9uX3VuaXQgewotCSAgUFBDX1VOSVRfQkFELAkJCQkvKiB1bmtub3duIGZ1bmN0aW9uIHVuaXQgKi8KLQkgIFBQQ19VTklUX0lVLAkJCQkvKiBpbnRlZ2VyIHVuaXQgKDYwMS82MDMgc3R5bGUpICovCi0JICBQUENfVU5JVF9TUlUsCQkJCS8qIHN5c3RlbSByZWdpc3RlciB1bml0ICg2MDEvNjAzIHN0eWxlKSAqLwotCSAgUFBDX1VOSVRfU0NJVTEsCQkJLyogMXN0IHNpbmdsZSBjeWNsZSBpbnRlZ2VyIHVuaXQgKDYwNCBzdHlsZSkgKi8KLQkgIFBQQ19VTklUX1NDSVUyLAkJCS8qIDJuZCBzaW5nbGUgY3ljbGUgaW50ZWdlciB1bml0ICg2MDQgc3R5bGUpICovCi0JICBQUENfVU5JVF9NQ0lVLAkJCS8qIG11bHRpcGxlIGN5Y2xlIGludGVnZXIgdW5pdCAoNjA0IHN0eWxlKSAqLwotCSAgUFBDX1VOSVRfRlBVLAkJCQkvKiBmbG9hdGluZyBwb2ludCB1bml0ICovCi0JICBQUENfVU5JVF9MU1UsCQkJCS8qIGxvYWQvc3RvcmUgdW5pdCAqLwotCSAgUFBDX1VOSVRfQlBVLAkJCQkvKiBicmFuY2ggdW5pdCAqLwotCSAgbnJfcHBjX2Z1bmN0aW9uX3VuaXRzCi0JfSBwcGNfZnVuY3Rpb25fdW5pdDsKLQotCS8qIFN0cnVjdHVyZSB0byBob2xkIHRpbWluZyBpbmZvcm1hdGlvbiBvbiBhIHBlciBpbnN0cnVjdGlvbiBiYXNpcyAqLwotCXN0cnVjdCBfbW9kZWxfdGltZSB7Ci0JICBwcGNfZnVuY3Rpb25fdW5pdCBmaXJzdF91bml0OwkJCS8qIGZpcnN0IGZ1bmN0aW9uYWwgdW5pdCB0aGlzIGluc24gY291bGQgdXNlICovCi0JICBwcGNfZnVuY3Rpb25fdW5pdCBzZWNvbmRfdW5pdDsJCS8qIHNlY29uZCBmdW5jdGlvbmFsIHVuaXQgdGhpcyBpbnNuIGNvdWxkIHVzZSAqLwotCSAgc2lnbmVkMTYJICAgIGlzc3VlOwkJCS8qICMgY3ljbGVzIGJlZm9yZSBmdW5jdGlvbiB1bml0IGNhbiBwcm9jZXNzIG90aGVyIGluc25zICovCi0JICBzaWduZWQxNgkgICAgZG9uZTsJCQkvKiAjIGN5Y2xlcyBiZWZvcmUgaW5zbiBpcyBkb25lICovCi0JICB1bnNpZ25lZDMyCSAgICBmbGFnczsJCQkvKiBhbnkgZmxhZ3MgdGhhdCBhcmUgbmVlZGVkICovCi0JfTsKLQotCS8qIFJlZ2lzdGVyIG1hcHBpbmdzIGluIHN0YXR1cyBtYXNrcyAqLwotCSNkZWZpbmUgUFBDX0NSX1JFRwkwCQkJLyogc3RhcnQgb2YgQ1IwIC4uIENSNyAqLwotCSNkZWZpbmUgUFBDX0ZQU0NSX1JFRwkoUFBDX0NSX1JFRyArIDgpCS8qIHN0YXJ0IG9mIGZwc2NyIHJlZ2lzdGVyICovCi0KLQkjZGVmaW5lIFBQQ19OT19TUFIJKC0xKQkJCS8qIGZsYWcgZm9yIG5vIFNQUiByZWdpc3RlciAqLwotCi0JLyogUmV0dXJuIGlmIDEgYml0IHNldCAqLwotCSNkZWZpbmUgUFBDX09ORV9CSVRfU0VUX1AoeCkgKCgoeCkgJiAoKHgpLTEpKSA9PSAwKQotCi0JLyogU3RydWN0dXJlIGZvciBlYWNoIGZ1bmN0aW9uYWwgdW5pdCB0aGF0IGlzIGJ1c3kgKi8KLQl0eXBlZGVmIHN0cnVjdCBfbW9kZWxfYnVzeSBtb2RlbF9idXN5OwotCXN0cnVjdCBfbW9kZWxfYnVzeSB7Ci0JICBtb2RlbF9idXN5ICpuZXh0OwkJCQkvKiBuZXh0IGZ1bmN0aW9uIHVuaXQgKi8KLQkgIHBwY19mdW5jdGlvbl91bml0IHVuaXQ7CQkJLyogZnVuY3Rpb24gdW5pdCBuYW1lICovCi0JICB1bnNpZ25lZDMyIGludF9idXN5OwkJCQkvKiBpbnQgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KLQkgIHVuc2lnbmVkMzIgZnBfYnVzeTsJCQkJLyogZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KLQkgIHVuc2lnbmVkMzIgY3JfZnBzY3JfYnVzeTsJCQkvKiBDUi9GUFNDUiByZWdpc3RlcnMgdGhhdCBhcmUgYnVzeSAqLwotCSAgc2lnbmVkMTYgc3ByX2J1c3k7CQkJCS8qIFNQUiByZWdpc3RlciB0aGF0IGlzIGJ1c3kgb3IgUFBDX05PX1NQUiAqLwotCSAgc2lnbmVkMTYgaXNzdWU7CQkJCS8qICMgb2YgY3ljbGVzIHVudGlsIHVuaXQgY2FuIGFjY2VwdCBhbm90aGVyIGluc24gKi8KLQkgIHNpZ25lZDE2IGRvbmU7CQkJCS8qICMgb2YgY3ljbGVzIHVudGlsIGluc24gaXMgZG9uZSAqLwotCSAgc2lnbmVkMTYgbnJfd3JpdGViYWNrczsJCQkvKiAjIG9mIHJlZ2lzdGVycyB0aGlzIHVuaXQgd3JpdGVzIGJhY2sgKi8KLQl9OwotCQotCS8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgc2ltdWxhdGVkIENQVSBtb2RlbCAqLwotCXN0cnVjdCBfbW9kZWxfZGF0YSB7Ci0JICBjcHUgKnByb2Nlc3NvcjsJCQkJLyogcG9pbnQgYmFjayB0byBwcm9jZXNzb3IgKi8KLQkgIGNvbnN0IGNoYXIgKm5hbWU7CQkJCS8qIG1vZGVsIG5hbWUgKi8KLQkgIGNvbnN0IG1vZGVsX3RpbWUgKnRpbWluZzsJCQkvKiB0aW1pbmcgaW5mb3JtYXRpb24gKi8KLQkgIG1vZGVsX2J1c3kgYnVzeV9oZWFkOwkJCQkvKiBkdW1teSBlbnRyeSB0byBoZWFkIGxpc3Qgb2YgYnVzeSBmdW5jdGlvbiB1bml0cyAqLwotCSAgbW9kZWxfYnVzeSAqYnVzeV90YWlsOwkJCS8qIHRhaWwgb2YgbGlzdCBvZiBidXN5IGZ1bmN0aW9uIHVuaXRzICovCi0JICBtb2RlbF9idXN5ICpmcmVlX2xpc3Q7CQkJLyogbGlzdCBvZiBtb2RlbF9idXN5IHN0cnVjdHMgbm90IGluIHVzZSAqLwotCSAgY291bnRfdHlwZSBucl9jeWNsZXM7CQkJCS8qICMgY3ljbGVzICovCi0JICBjb3VudF90eXBlIG5yX2JyYW5jaGVzOwkJCS8qICMgYnJhbmNoZXMgKi8KLQkgIGNvdW50X3R5cGUgbnJfYnJhbmNoZXNfZmFsbHRocm91Z2g7CQkvKiAjIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRoYXQgZmVsbCB0aHJvdWdoICovCi0JICBjb3VudF90eXBlIG5yX2JyYW5jaF9wcmVkaWN0X3RydWVzOwkJLyogIyBicmFuY2hlcyBwcmVkaWN0ZWQgY29ycmVjdGx5ICovCi0JICBjb3VudF90eXBlIG5yX2JyYW5jaF9wcmVkaWN0X2ZhbHNlczsJCS8qICMgYnJhbmNoZXMgcHJlZGljdGVkIGluY29ycmVjdGx5ICovCi0JICBjb3VudF90eXBlIG5yX2JyYW5jaF9jb25kaXRpb25hbFszMl07CQkvKiAjIG9mIGVhY2ggdHlwZSBvZiBiYyAqLwotCSAgY291bnRfdHlwZSBucl9tdGNyZl9jcnNbOV07CQkJLyogIyBvZiBDUidzIG1vdmVkIGluIGEgbXRjcmYgaW5zdHJ1Y3Rpb24gKi8KLQkgIGNvdW50X3R5cGUgbnJfc3RhbGxzX2RhdGE7CQkJLyogIyBvZiBzdGFsbHMgZm9yIGRhdGEgKi8KLQkgIGNvdW50X3R5cGUgbnJfc3RhbGxzX3VuaXQ7CQkJLyogIyBvZiBzdGFsbHMgd2FpdGluZyBmb3IgYSBmdW5jdGlvbiB1bml0ICovCi0JICBjb3VudF90eXBlIG5yX3N0YWxsc19zZXJpYWxpemU7CQkvKiAjIG9mIHN0YWxscyB3YWl0aW5nIGZvciB0aGluZ3MgdG8gcXVpZXQgZG93biAqLwotCSAgY291bnRfdHlwZSBucl9zdGFsbHNfd3JpdGViYWNrOwkJLyogIyBvZiBzdGFsbHMgd2FpdGluZyBmb3IgYSB3cml0ZWJhY2sgc2xvdCAqLwotCSAgY291bnRfdHlwZSBucl91bml0c1tucl9wcGNfZnVuY3Rpb25fdW5pdHNdOwkvKiBmdW5jdGlvbiB1bml0IGNvdW50cyAqLwotCSAgaW50IG1heF9ucl93cml0ZWJhY2tzOwkJCS8qIG1heCAjIG9mIHdyaXRlYmFjayBzbG90cyBhdmFpbGFibGUgKi8KLQkgIHVuc2lnbmVkMzIgaW50X2J1c3k7CQkJCS8qIGludCByZWdpc3RlcnMgdGhhdCBhcmUgYnVzeSAqLwotCSAgdW5zaWduZWQzMiBmcF9idXN5OwkJCQkvKiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdGhhdCBhcmUgYnVzeSAqLwotCSAgdW5zaWduZWQzMiBjcl9mcHNjcl9idXN5OwkJCS8qIENSL0ZQU0NSIHJlZ2lzdGVycyB0aGF0IGFyZSBidXN5ICovCi0JICB1bnNpZ25lZDggc3ByX2J1c3lbbnJfb2Zfc3Byc107CQkvKiBTUFIgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KLQkgIHVuc2lnbmVkOCBidXN5W25yX3BwY19mdW5jdGlvbl91bml0c107CS8qIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBidXN5IG9yIG5vdCAqLwotCX07Ci0KLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZVsgKGludClucl9wcGNfZnVuY3Rpb25fdW5pdHMgXSA9IHsKLQkgICJ1bmtub3duIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbiIsCi0JICAiaW50ZWdlciBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAotCSAgInN5c3RlbSByZWdpc3RlciBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAotCSAgIjFzdCBzaW5nbGUgY3ljbGUgaW50ZWdlciBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAotCSAgIjJuZCBzaW5nbGUgY3ljbGUgaW50ZWdlciBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAotCSAgIm11bHRpcGxlIGN5Y2xlIGludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKLQkgICJmbG9hdGluZyBwb2ludCBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAotCSAgImxvYWQvc3RvcmUgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKLQkgICJicmFuY2ggZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKLQl9OwotCi0Jc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHBwY19icmFuY2hfY29uZGl0aW9uYWxfbmFtZVszMl0gPSB7Ci0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAgYW5kIGNvbmRpdGlvbiBpcyBGQUxTRSIsCQkJCS8qIDAwMDB5ICovCi0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAgYW5kIGNvbmRpdGlvbiBpcyBGQUxTRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKLQkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCBhbmQgY29uZGl0aW9uIGlzIEZBTFNFIiwJCQkJLyogMDAwMXkgKi8KLQkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCBhbmQgY29uZGl0aW9uIGlzIEZBTFNFLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkiLAotCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIEZBTFNFIiwJCQkJCQkvKiAwMDF6eSAqLwotCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIEZBTFNFLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkiLAotCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIEZBTFNFIChpZ25vcmVkIGJpdCAxIHNldCB0byAxKSIsCQkJLyogMDAxenkgKi8KLQkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBGQUxTRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IChpZ25vcmVkIGJpdCA0IHNldCB0byAxKSIsCi0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAgYW5kIGNvbmRpdGlvbiBpcyBUUlVFIiwJCQkJCS8qIDAxMDB5ICovCi0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAgYW5kIGNvbmRpdGlvbiBpcyBUUlVFLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkiLAotCSAgImJyYW5jaCBpZiAtLUNUUiA9PSAwIGFuZCBjb25kaXRpb24gaXMgVFJVRSIsCQkJCQkvKiAwMTAxeSAqLwotCSAgImJyYW5jaCBpZiAtLUNUUiA9PSAwIGFuZCBjb25kaXRpb24gaXMgVFJVRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKLQkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBUUlVFIiwJCQkJCQkvKiAwMTF6eSAqLwotCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIFRSVUUsIHJldmVyc2UgYnJhbmNoIGxpa2VseSIsCi0JICAiYnJhbmNoIGlmIHRoZSBjb25kaXRpb24gaXMgVFJVRSAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAkJCS8qIDAxMXp5ICovCi0JICAiYnJhbmNoIGlmIHRoZSBjb25kaXRpb24gaXMgVFJVRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IChpZ25vcmVkIGJpdCA0IHNldCB0byAxKSIsCi0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAiLAkJCQkJCQkvKiAxejAweSAqLwotCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkiLAotCSAgImJyYW5jaCBpZiAtLUNUUiA9PSAwIiwJCQkJCQkJLyogMXowMXkgKi8KLQkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKLQkgICJicmFuY2ggYWx3YXlzIiwJCQkJCQkJCS8qIDF6MXp6ICovCi0JICAiYnJhbmNoIGFsd2F5cyAoaWdub3JlZCBiaXQgNSBzZXQgdG8gMSkiLAotCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0IDQgc2V0IHRvIDEpIiwJCQkJCS8qIDF6MXp6ICovCi0JICAiYnJhbmNoIGFsd2F5cyAoaWdub3JlZCBiaXRzIDQsNSBzZXQgdG8gMSkiLAotCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIChpZ25vcmVkIGJpdCAxIHNldCB0byAxKSIsCQkJCS8qIDF6MDB5ICovCi0JICAiYnJhbmNoIGlmIC0tQ1RSICE9IDAsIHJldmVyc2UgYnJhbmNoIGxpa2VseSAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAotCSAgImJyYW5jaCBpZiAtLUNUUiA9PSAwIChpZ25vcmVkIGJpdCAxIHNldCB0byAxKSIsCQkJCS8qIDF6MDF5ICovCi0JICAiYnJhbmNoIGlmIC0tQ1RSID09IDAsIHJldmVyc2UgYnJhbmNoIGxpa2VseSAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAotCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0IDEgc2V0IHRvIDEpIiwJCQkJCS8qIDF6MXp6ICovCi0JICAiYnJhbmNoIGFsd2F5cyAoaWdub3JlZCBiaXRzIDEsNSBzZXQgdG8gMSkiLAotCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0cyAxLDQgc2V0IHRvIDEpIiwJCQkJCS8qIDF6MXp6ICovCi0JICAiYnJhbmNoIGFsd2F5cyAoaWdub3JlZCBiaXRzIDEsNCw1IHNldCB0byAxKSIsCi0JfTsKLQotCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcGNfbnJfbXRjcmZfY3JzWzldID0gewotCSAgIm10Y3JmIG1vdmluZyAwIENScyIsCi0JICAibXRjcmYgbW92aW5nIDEgQ1IiLAotCSAgIm10Y3JmIG1vdmluZyAyIENScyIsCi0JICAibXRjcmYgbW92aW5nIDMgQ1JzIiwKLQkgICJtdGNyZiBtb3ZpbmcgNCBDUnMiLAotCSAgIm10Y3JmIG1vdmluZyA1IENScyIsCi0JICAibXRjcmYgbW92aW5nIDYgQ1JzIiwKLQkgICJtdGNyZiBtb3ZpbmcgNyBDUnMiLAotCSAgIm10Y3JmIG1vdmluZyBhbGwgQ1JzIiwKLQl9OwotDAotIyBUcmFjZSByZWxlYXNpbmcgcmVzb3VyY2VzCi12b2lkOjptb2RlbC1zdGF0aWM6Om1vZGVsX3RyYWNlX3JlbGVhc2U6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBtb2RlbF9idXN5ICpidXN5Ci0JaW50IGk7Ci0JVFJBQ0UodHJhY2VfbW9kZWwsKCJkb25lLCAlcywgJWQgd3JpdGViYWNrJXNcbiIsIHBwY19mdW5jdGlvbl91bml0X25hbWVbYnVzeS0+dW5pdF0sCi0JCQkgICBidXN5LT5ucl93cml0ZWJhY2tzLCBidXN5LT5ucl93cml0ZWJhY2tzID09IDEgPyAiIiA6ICJzIikpOwotCWlmIChidXN5LT5pbnRfYnVzeSkgewotCSAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCSAgICBpZiAoKCgxIDw8IGkpICYgYnVzeS0+aW50X2J1c3kpICE9IDApIHsKLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciByJWQgaXMgbm93IGF2YWlsYWJsZS5cbiIsIGkpKTsKLQkgICAgfQotCSAgfQotCX0KLQlpZiAoYnVzeS0+ZnBfYnVzeSkgewotCSAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCSAgICBpZiAoKCgxIDw8IGkpICYgYnVzeS0+ZnBfYnVzeSkgIT0gMCkgewotCSAgICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIlJlZ2lzdGVyIGYlZCBpcyBub3cgYXZhaWxhYmxlLlxuIiwgaSkpOwotCSAgICB9Ci0JICB9Ci0JfQotCWlmIChidXN5LT5jcl9mcHNjcl9idXN5KSB7Ci0JICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkgICAgaWYgKCgoMSA8PCBpKSAmIGJ1c3ktPmNyX2Zwc2NyX2J1c3kpICE9IDApIHsKLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciBjciVkIGlzIG5vdyBhdmFpbGFibGUuXG4iLCBpKSk7Ci0JICAgIH0KLQkgIH0KLQkgIGlmIChidXN5LT5jcl9mcHNjcl9idXN5ICYgMHgxMDApCi0JICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIlJlZ2lzdGVyIGZwc2NyIGlzIG5vdyBhdmFpbGFibGUuXG4iKSk7Ci0JfQotCWlmIChidXN5LT5zcHJfYnVzeSAhPSBQUENfTk9fU1BSKQotCSAgVFJBQ0UodHJhY2VfbW9kZWwsICgiUmVnaXN0ZXIgJXMgaXMgbm93IGF2YWlsYWJsZS5cbiIsIHNwcl9uYW1lKGJ1c3ktPnNwcl9idXN5KSkpOwotCi0jIFRyYWNlIG1ha2luZyByZWdpc3RlcnMgYnVzeQotdm9pZDo6bW9kZWwtc3RhdGljOjptb2RlbF90cmFjZV9tYWtlX2J1c3k6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCB1bnNpZ25lZDMyIGludF9tYXNrLCB1bnNpZ25lZDMyIGZwX21hc2ssIHVuc2lnbmVkMzIgY3JfbWFzawotCWludCBpOwotCWlmIChpbnRfbWFzaykgewotCSAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCSAgICBpZiAoKCgxIDw8IGkpICYgaW50X21hc2spICE9IDApIHsKLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciByJWQgaXMgbm93IGJ1c3kuXG4iLCBpKSk7Ci0JICAgIH0KLQkgIH0KLQl9Ci0JaWYgKGZwX21hc2spIHsKLQkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkgICAgaWYgKCgoMSA8PCBpKSAmIGZwX21hc2spICE9IDApIHsKLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciBmJWQgaXMgbm93IGJ1c3kuXG4iLCBpKSk7Ci0JICAgIH0KLQkgIH0KLQl9Ci0JaWYgKGNyX21hc2spIHsKLQkgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgewotCSAgICBpZiAoKCgxIDw8IGkpICYgY3JfbWFzaykgIT0gMCkgewotCSAgICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIlJlZ2lzdGVyIGNyJWQgaXMgbm93IGJ1c3kuXG4iLCBpKSk7Ci0JICAgIH0KLQkgIH0KLQl9Ci0KLSMgVHJhY2Ugd2FpdGluZyBmb3IgcmVnaXN0ZXJzIHRvIGJlY29tZSBhdmFpbGFibGUKLXZvaWQ6Om1vZGVsLXN0YXRpYzo6bW9kZWxfdHJhY2VfYnVzeV9wOm1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgdW5zaWduZWQzMiBpbnRfYnVzeSwgdW5zaWduZWQzMiBmcF9idXN5LCB1bnNpZ25lZDMyIGNyX29yX2Zwc2NyX2J1c3ksIGludCBzcHJfYnVzeQotCWludCBpOwotCWlmIChpbnRfYnVzeSkgewotCSAgaW50X2J1c3kgJj0gbW9kZWxfcHRyLT5pbnRfYnVzeTsKLQkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkgICAgaWYgKCgoMSA8PCBpKSAmIGludF9idXN5KSAhPSAwKSB7Ci0JICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiV2FpdGluZyBmb3IgcmVnaXN0ZXIgciVkLlxuIiwgaSkpOwotCSAgICB9Ci0JICB9Ci0JfQotCWlmIChmcF9idXN5KSB7Ci0JICBmcF9idXN5ICY9IG1vZGVsX3B0ci0+ZnBfYnVzeTsKLQkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkgICAgaWYgKCgoMSA8PCBpKSAmIGZwX2J1c3kpICE9IDApIHsKLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJXYWl0aW5nIGZvciByZWdpc3RlciBmJWQuXG4iLCBpKSk7Ci0JICAgIH0KLQkgIH0KLQl9Ci0JaWYgKGNyX29yX2Zwc2NyX2J1c3kpIHsKLQkgIGNyX29yX2Zwc2NyX2J1c3kgJj0gbW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5OwotCSAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JICAgIGlmICgoKDEgPDwgaSkgJiBjcl9vcl9mcHNjcl9idXN5KSAhPSAwKSB7Ci0JICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiV2FpdGluZyBmb3IgcmVnaXN0ZXIgY3IlZC5cbiIsIGkpKTsKLQkgICAgfQotCSAgfQotCSAgaWYgKGNyX29yX2Zwc2NyX2J1c3kgJiAweDEwMCkKLQkgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiV2FpdGluZyBmb3IgcmVnaXN0ZXIgZnBzY3IuXG4iKSk7Ci0JfQotCWlmIChzcHJfYnVzeSAhPSBQUENfTk9fU1BSICYmIG1vZGVsX3B0ci0+c3ByX2J1c3lbc3ByX2J1c3ldKQotCSAgVFJBQ0UodHJhY2VfbW9kZWwsICgiV2FpdGluZyBmb3IgcmVnaXN0ZXIgJXMuXG4iLCBzcHJfbmFtZShzcHJfYnVzeSkpKTsKLQwKLSMgQWR2YW5jZSBzdGF0ZSB0byBuZXh0IGN5Y2xlLCByZWxlYXNpbmcgYW55IHJlZ2lzdGVycyBhbGxvY2F0ZWQKLXZvaWQ6Om1vZGVsLWludGVybmFsOjptb2RlbF9uZXdfY3ljbGU6bW9kZWxfZGF0YSAqbW9kZWxfcHRyCi0JbW9kZWxfYnVzeSAqY3VyX2J1c3kgID0gbW9kZWxfcHRyLT5idXN5X2hlYWQubmV4dDsKLQltb2RlbF9idXN5ICpmcmVlX2xpc3QgPSBtb2RlbF9wdHItPmZyZWVfbGlzdDsKLQltb2RlbF9idXN5ICpidXN5X3RhaWwgPSAmbW9kZWxfcHRyLT5idXN5X2hlYWQ7Ci0JaW50IG5yX3dyaXRlYmFja3MgICAgID0gbW9kZWxfcHRyLT5tYXhfbnJfd3JpdGViYWNrczsKLQltb2RlbF9idXN5ICpuZXh0OwotCi0JbW9kZWxfcHRyLT5ucl9jeWNsZXMrKzsKLQlUUkFDRSh0cmFjZV9tb2RlbCwoIk5ldyBjeWNsZSAlbHVcbiIsICh1bnNpZ25lZCBsb25nKW1vZGVsX3B0ci0+bnJfY3ljbGVzKSk7Ci0JZm9yICggOyBjdXJfYnVzeTsgY3VyX2J1c3kgPSBuZXh0KSB7Ci0JICBuZXh0ID0gY3VyX2J1c3ktPm5leHQ7Ci0JICBpZiAoLS1jdXJfYnVzeS0+ZG9uZSA8PSAwKSB7CQkvKiBmdW5jdGlvbiB1bml0IGRvbmUsIHJlbGVhc2UgcmVnaXN0ZXJzIGlmIHdlIGhhdmUgd3JpdGViYWNrIHNsb3RzICovCi0JICAgIG5yX3dyaXRlYmFja3MgLT0gY3VyX2J1c3ktPm5yX3dyaXRlYmFja3M7Ci0JICAgIGlmIChucl93cml0ZWJhY2tzID49IDApIHsKLQkgICAgICBtb2RlbF9wdHItPmludF9idXN5ICY9IH5jdXJfYnVzeS0+aW50X2J1c3k7Ci0JICAgICAgbW9kZWxfcHRyLT5mcF9idXN5ICY9IH5jdXJfYnVzeS0+ZnBfYnVzeTsKLQkgICAgICBtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJj0gfmN1cl9idXN5LT5jcl9mcHNjcl9idXN5OwotCSAgICAgIGlmIChjdXJfYnVzeS0+c3ByX2J1c3kgIT0gUFBDX05PX1NQUikKLQkJbW9kZWxfcHRyLT5zcHJfYnVzeVtjdXJfYnVzeS0+c3ByX2J1c3ldID0gMDsKLQotCSAgICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JCW1vZGVsX3RyYWNlX3JlbGVhc2UobW9kZWxfcHRyLCBjdXJfYnVzeSk7Ci0KLQkgICAgICBtb2RlbF9wdHItPmJ1c3lbY3VyX2J1c3ktPnVuaXRdID0gMDsKLQkgICAgICBjdXJfYnVzeS0+bmV4dCA9IGZyZWVfbGlzdDsKLQkgICAgICBmcmVlX2xpc3QgPSBjdXJfYnVzeTsKLQkgICAgfQotCSAgICBlbHNlIHsJLyogd3JpdGViYWNrIHNsb3RzIG5vdCBhdmFpbGFibGUgKi8KLQkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwoIiVkIHdyaXRlYmFjayBzbG90JXMgbm90IGF2YWlsYWJsZSBmb3IgJXNcbiIsCi0JCQkJIGN1cl9idXN5LT5ucl93cml0ZWJhY2tzLAotCQkJCSBjdXJfYnVzeS0+bnJfd3JpdGViYWNrcyA9PSAxID8gIiBpcyIgOiAicyBhcmUiLAotCQkJCSBwcGNfZnVuY3Rpb25fdW5pdF9uYW1lW2N1cl9idXN5LT51bml0XSkpOwotCSAgICAgIGN1cl9idXN5LT5kb25lKys7CQkJLyogdW5kbyAtLSBhYm92ZSAqLwotCSAgICAgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3dyaXRlYmFjaysrOwotCSAgICAgIGJ1c3lfdGFpbC0+bmV4dCA9IGN1cl9idXN5OwotCSAgICAgIGJ1c3lfdGFpbCA9IGN1cl9idXN5OwotCSAgICB9Ci0JICB9Ci0JICBlbHNlIGlmICgtLWN1cl9idXN5LT5pc3N1ZSA8PSAwKSB7CS8qIGZ1bmN0aW9uIHVuaXQgcGlwZWxpbmVkLCBhbGxvdyBuZXcgdXNlICovCi0JICAgIFRSQUNFKHRyYWNlX21vZGVsLCgicGlwZWxpbmUsICVzIHJlYWR5IGZvciBuZXh0IGNsaWVudFxuIiwgcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZVtjdXJfYnVzeS0+dW5pdF0pKTsKLQkgICAgbW9kZWxfcHRyLT5idXN5W2N1cl9idXN5LT51bml0XSA9IDA7Ci0JICAgIGJ1c3lfdGFpbC0+bmV4dCA9IGN1cl9idXN5OwotCSAgICBidXN5X3RhaWwgPSBjdXJfYnVzeTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICBUUkFDRSh0cmFjZV9tb2RlbCwoIiVzIHN0aWxsIHdvcmtpbmcsIGlzc3VlID0gJWQsIGRvbmUgPSAlZFxuIiwKLQkJCSAgICAgICBwcGNfZnVuY3Rpb25fdW5pdF9uYW1lW2N1cl9idXN5LT51bml0XSwKLQkJCSAgICAgICBjdXJfYnVzeS0+aXNzdWUsCi0JCQkgICAgICAgY3VyX2J1c3ktPmRvbmUpKTsKLQkgICAgYnVzeV90YWlsLT5uZXh0ID0gY3VyX2J1c3k7Ci0JICAgIGJ1c3lfdGFpbCA9IGN1cl9idXN5OwotCSAgfQotCX0KLQotCWJ1c3lfdGFpbC0+bmV4dCA9IChtb2RlbF9idXN5ICopMDsKLQltb2RlbF9wdHItPmJ1c3lfdGFpbCA9IGJ1c3lfdGFpbDsKLQltb2RlbF9wdHItPmZyZWVfbGlzdCA9IGZyZWVfbGlzdDsKLQotIyBNYXJrIGEgZnVuY3Rpb24gdW5pdCBhcyBidXN5LCByZXR1cm4gdGhlIGJ1c3kgc3RydWN0dXJlCi1tb2RlbF9idXN5ICo6Om1vZGVsLWludGVybmFsOjptb2RlbF9tYWtlX2J1c3k6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBwcGNfZnVuY3Rpb25fdW5pdCB1bml0LCBpbnQgaXNzdWUsIGludCBkb25lCi0JbW9kZWxfYnVzeSAqYnVzeTsKLQotCVRSQUNFKHRyYWNlX21vZGVsLCgidW5pdCA9ICVzLCBpc3N1ZSA9ICVkLCBkb25lID0gJWRcbiIsIHBwY19mdW5jdGlvbl91bml0X25hbWVbdW5pdF0sIGlzc3VlLCBkb25lKSk7Ci0KLQlpZiAoIW1vZGVsX3B0ci0+ZnJlZV9saXN0KSB7Ci0JICBidXN5ID0gWkFMTE9DKG1vZGVsX2J1c3kpOwotCX0KLQllbHNlIHsKLQkgIGJ1c3kgPSBtb2RlbF9wdHItPmZyZWVfbGlzdDsKLQkgIG1vZGVsX3B0ci0+ZnJlZV9saXN0ID0gYnVzeS0+bmV4dDsKLQkgIGJ1c3ktPm5leHQgPSAobW9kZWxfYnVzeSAqKTA7Ci0JICBidXN5LT5pbnRfYnVzeSA9IDA7Ci0JICBidXN5LT5mcF9idXN5ID0gMDsKLQkgIGJ1c3ktPmNyX2Zwc2NyX2J1c3kgPSAwOwotCSAgYnVzeS0+bnJfd3JpdGViYWNrcyA9IDA7Ci0JfQotCi0JYnVzeS0+dW5pdCA9IHVuaXQ7Ci0JYnVzeS0+aXNzdWUgPSBpc3N1ZTsKLQlidXN5LT5kb25lID0gZG9uZTsKLQlidXN5LT5zcHJfYnVzeSA9IFBQQ19OT19TUFI7Ci0JbW9kZWxfcHRyLT5idXN5X3RhaWwtPm5leHQgPSBidXN5OwotCW1vZGVsX3B0ci0+YnVzeV90YWlsID0gYnVzeTsKLQltb2RlbF9wdHItPmJ1c3lbdW5pdF0gPSAxOwotCW1vZGVsX3B0ci0+bnJfdW5pdHNbdW5pdF0rKzsKLQlyZXR1cm4gYnVzeTsKLQwKLSMgV2FpdCB1bnRpbCBhIGZ1bmN0aW9uIHVuaXQgaXMgbm9uLWJ1c3ksIGFuZCB0aGVuIGFsbG9jYXRlIGEgYnVzeSBwb2ludGVyICYgcmV0dXJuIHRoZSBwb2ludGVyCi1tb2RlbF9idXN5ICo6Om1vZGVsLWludGVybmFsOjptb2RlbF93YWl0X2Zvcl91bml0Oml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqY29uc3QgbW9kZWxfcHRyLCBjb25zdCBtb2RlbF90aW1lICpjb25zdCB0aW1lX3B0cgotCXBwY19mdW5jdGlvbl91bml0IGZpcnN0X3VuaXQgPSB0aW1lX3B0ci0+Zmlyc3RfdW5pdDsKLQlwcGNfZnVuY3Rpb25fdW5pdCBzZWNvbmRfdW5pdCA9IHRpbWVfcHRyLT5zZWNvbmRfdW5pdDsKLQlpbnQgc3RhbGxfaW5jcmVtZW50ID0gMDsKLQotCWZvciAoOzspIHsKLQkgIGlmICghbW9kZWxfcHRyLT5idXN5W2ZpcnN0X3VuaXRdKQotCSAgICByZXR1cm4gbW9kZWxfbWFrZV9idXN5KG1vZGVsX3B0ciwgZmlyc3RfdW5pdCwKLQkJCQkgICBtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0uaXNzdWUsCi0JCQkJICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmRvbmUpOwotCi0JICBpZiAoIW1vZGVsX3B0ci0+YnVzeVtzZWNvbmRfdW5pdF0pCi0JICAgIHJldHVybiBtb2RlbF9tYWtlX2J1c3kobW9kZWxfcHRyLCBzZWNvbmRfdW5pdCwKLQkJCQkgICBtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0uaXNzdWUsCi0JCQkJICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmRvbmUpOwotCi0JICBUUkFDRSh0cmFjZV9tb2RlbCwoImFsbCBmdW5jdGlvbiB1bml0cyBhcmUgYnVzeSBmb3IgJXNcbiIsIGl0YWJsZVtpbmRleF0ubmFtZSkpOwotCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfdW5pdCArPSBzdGFsbF9pbmNyZW1lbnQ7CQkvKiBkb24ndCBjb3VudCBmaXJzdCBzdGFsbCAqLwotCSAgc3RhbGxfaW5jcmVtZW50ID0gMTsKLQkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwotCX0KLQotIyBTZXJpYWxpemUgdGhlIHByb2Nlc3Nvciwgd2FpdGluZyBmb3IgYWxsIGluc3RydWN0aW9ucyB0byBkcmFpbiBvdXQgYmVmb3JlIGFkZGluZyBhbiBpbnN0cnVjdGlvbi4KLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9zZXJpYWxpemU6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIKLQl3aGlsZSAobW9kZWxfcHRyLT5idXN5X2hlYWQubmV4dCkgewotCSAgVFJBQ0UodHJhY2VfbW9kZWwsKCJ3YWl0aW5nIGZvciBwaXBlbGluZSB0byBlbXB0eVxuIikpOwotCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfc2VyaWFsaXplKys7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQl9Ci0JKHZvaWQpIG1vZGVsX21ha2VfYnVzeShtb2RlbF9wdHIsCi0JCQkgICAgICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmZpcnN0X3VuaXQsCi0JCQkgICAgICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmlzc3VlLAotCQkJICAgICAgIG1vZGVsX3B0ci0+dGltaW5nW2luZGV4XS5kb25lKTsKLQotIyBXYWl0IGZvciBhIENSIHRvIGJlY29tZSB1bmJ1c3kKLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF93YWl0X2Zvcl9jcjptb2RlbF9kYXRhICptb2RlbF9wdHIsIHVuc2lnbmVkIENSQklUCi0JdW5zaWduZWQgdTsKLQl1bnNpZ25lZDMyIGNyX21hc2s7Ci0JaW50IGNyX3ZhciA9IDA7Ci0JZm9yICh1ID0gMHhjMDAwMDAwMDsgKHUgIT0gMCkgJiYgKENSQklUICYgdSkgPT0gMDsgdSA+Pj0gNCApCi0JICBjcl92YXIrKzsKLQotCWNyX21hc2sgPSAoMSA8PCBjcl92YXIpOwotCXdoaWxlICgobW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICYgY3JfbWFzaykgIT0gMCkgewotCSAgVFJBQ0UodHJhY2VfbW9kZWwsKCJ3YWl0aW5nIGZvciBDUiAlZFxuIiwgY3JfdmFyKSk7Ci0JICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQl9Ci0KLSMgU2NoZWR1bGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyBpbnRlZ2VyIGlucHV0IHJlZ2lzdGVycyBhbmQgcHJvZHVjZXMgb3V0cHV0IHJlZ2lzdGVycwotdm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX2ludDppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9tYXNrCi0JY29uc3QgdW5zaWduZWQzMiBpbnRfbWFzayA9IG91dF9tYXNrIHwgaW5fbWFzazsKLQltb2RlbF9idXN5ICpidXN5X3B0cjsKLQotCWlmICgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSAhPSAwKSB7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJCQkvKiBkb24ndCBjb3VudCBmaXJzdCBkZXBlbmRlbmN5IGFzIGEgc3RhbGwgKi8KLQotCSAgd2hpbGUgKChtb2RlbF9wdHItPmludF9idXN5ICYgaW50X21hc2spICE9IDApIHsKLQkgICAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgICAgICBtb2RlbF90cmFjZV9idXN5X3AobW9kZWxfcHRyLCBpbnRfbWFzaywgMCwgMCwgUFBDX05PX1NQUik7Ci0KLQkgICAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOwotCSAgICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQkgIH0KLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7Ci0JbW9kZWxfcHRyLT5pbnRfYnVzeSB8PSBvdXRfbWFzazsKLQlidXN5X3B0ci0+aW50X2J1c3kgfD0gb3V0X21hc2s7Ci0JaWYgKG91dF9tYXNrKQotCSAgYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAoUFBDX09ORV9CSVRfU0VUX1Aob3V0X21hc2spKSA/IDEgOiAyOwotCi0JaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIG91dF9tYXNrLCAwLCAwKTsKLQotIyBTY2hlZHVsZSBhbiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIGludGVnZXIgaW5wdXQgcmVnaXN0ZXJzIGFuZCBwcm9kdWNlcyBvdXRwdXQgcmVnaXN0ZXJzICYgc2V0cyBhIENSIHJlZ2lzdGVyCi12b2lkOjptb2RlbC1mdW5jdGlvbjo6cHBjX2luc25faW50X2NyOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBjb25zdCB1bnNpZ25lZDMyIG91dF9tYXNrLCBjb25zdCB1bnNpZ25lZDMyIGluX21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgY3JfbWFzawotCWNvbnN0IHVuc2lnbmVkMzIgaW50X21hc2sgPSBvdXRfbWFzayB8IGluX21hc2s7Ci0JbW9kZWxfYnVzeSAqYnVzeV9wdHI7Ci0KLQlpZiAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgfHwgKG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSAmIGNyX21hc2spKSB7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJCQkvKiBkb24ndCBjb3VudCBmaXJzdCBkZXBlbmRlbmN5IGFzIGEgc3RhbGwgKi8KLQotCSAgd2hpbGUgKChtb2RlbF9wdHItPmludF9idXN5ICYgaW50X21hc2spIHx8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgewotCSAgICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQotCSAgICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCAwLCBjcl9tYXNrLCBQUENfTk9fU1BSKTsKLQotCSAgICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICAgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwotCSAgfQotCX0KLQotCWJ1c3lfcHRyID0gbW9kZWxfd2FpdF9mb3JfdW5pdChpbmRleCwgbW9kZWxfcHRyLCAmbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdKTsKLQltb2RlbF9wdHItPmludF9idXN5IHw9IG91dF9tYXNrOwotCWJ1c3lfcHRyLT5pbnRfYnVzeSB8PSBvdXRfbWFzazsKLQltb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgfD0gY3JfbWFzazsKLQlidXN5X3B0ci0+Y3JfZnBzY3JfYnVzeSB8PSBjcl9tYXNrOwotCWlmIChvdXRfbWFzaykKLQkgIGJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gKFBQQ19PTkVfQklUX1NFVF9QKG91dF9tYXNrKSkgPyAxIDogMjsKLQotCWlmIChjcl9tYXNrKQotCSAgYnVzeV9wdHItPm5yX3dyaXRlYmFja3MrKzsKLQotCWlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICBtb2RlbF90cmFjZV9tYWtlX2J1c3kobW9kZWxfcHRyLCBvdXRfbWFzaywgMCwgY3JfbWFzayk7Ci0KLQotIyBTY2hlZHVsZSBhbiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIENSIGlucHV0IHJlZ2lzdGVycyBhbmQgcHJvZHVjZXMgb3V0cHV0IENSIHJlZ2lzdGVycwotdm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX2NyOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBjb25zdCB1bnNpZ25lZDMyIG91dF9tYXNrLCBjb25zdCB1bnNpZ25lZDMyIGluX21hc2sKLQljb25zdCB1bnNpZ25lZDMyIGNyX21hc2sgPSBvdXRfbWFzayB8IGluX21hc2s7Ci0JbW9kZWxfYnVzeSAqYnVzeV9wdHI7Ci0KLQlpZiAoKG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSAmIGNyX21hc2spICE9IDApIHsKLQkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwkJCS8qIGRvbid0IGNvdW50IGZpcnN0IGRlcGVuZGVuY3kgYXMgYSBzdGFsbCAqLwotCi0JICB3aGlsZSAoKG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSAmIGNyX21hc2spICE9IDApIHsKLQkgICAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgICAgICBtb2RlbF90cmFjZV9idXN5X3AobW9kZWxfcHRyLCAwLCAwLCBjcl9tYXNrLCBQUENfTk9fU1BSKTsKLQotCSAgICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICAgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwotCSAgfQotCX0KLQotCWJ1c3lfcHRyID0gbW9kZWxfd2FpdF9mb3JfdW5pdChpbmRleCwgbW9kZWxfcHRyLCAmbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdKTsKLQltb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgfD0gb3V0X21hc2s7Ci0JYnVzeV9wdHItPmNyX2Zwc2NyX2J1c3kgfD0gb3V0X21hc2s7Ci0JaWYgKG91dF9tYXNrKQotCSAgYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAxOwotCi0JaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIDAsIDAsIG91dF9tYXNrKTsKLQotCi0jIFNjaGVkdWxlIGFuIGluc3RydWN0aW9uIHRoYXQgdGFrZXMgZmxvYXRpbmcgcG9pbnQgaW5wdXQgcmVnaXN0ZXJzIGFuZCBwcm9kdWNlcyBhbiBvdXRwdXQgZnAgcmVnaXN0ZXIKLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9mbG9hdDppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9tYXNrCi0JY29uc3QgdW5zaWduZWQzMiBmcF9tYXNrID0gb3V0X21hc2sgfCBpbl9tYXNrOwotCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOwotCi0JaWYgKChtb2RlbF9wdHItPmZwX2J1c3kgJiBmcF9tYXNrKSAhPSAwKSB7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJCQkvKiBkb24ndCBjb3VudCBmaXJzdCBkZXBlbmRlbmN5IGFzIGEgc3RhbGwgKi8KLQotCSAgd2hpbGUgKChtb2RlbF9wdHItPmZwX2J1c3kgJiBmcF9tYXNrKSAhPSAwKSB7Ci0JICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICAgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgMCwgZnBfbWFzaywgMCwgUFBDX05PX1NQUik7Ci0KLQkgICAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOwotCSAgICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQkgIH0KLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7Ci0JbW9kZWxfcHRyLT5mcF9idXN5IHw9IG91dF9tYXNrOwotCWJ1c3lfcHRyLT5mcF9idXN5IHw9IG91dF9tYXNrOwotCWJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gMTsKLQlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQotCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgMCwgb3V0X21hc2ssIDApOwotCi0KLSMgU2NoZWR1bGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyBmbG9hdGluZyBwb2ludCBpbnB1dCByZWdpc3RlcnMgYW5kIHByb2R1Y2VzIGFuIG91dHB1dCBmcCByZWdpc3RlciAmIHNldHMgYSBDUiByZWcKLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9mbG9hdF9jcjppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9tYXNrLCBjb25zdCB1bnNpZ25lZDMyIGNyX21hc2sKLQljb25zdCB1bnNpZ25lZDMyIGZwX21hc2sgPSBvdXRfbWFzayB8IGluX21hc2s7Ci0JbW9kZWxfYnVzeSAqYnVzeV9wdHI7Ci0KLQlpZiAoKG1vZGVsX3B0ci0+ZnBfYnVzeSAmIGZwX21hc2spIHx8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgewotCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CQkJLyogZG9uJ3QgY291bnQgZmlyc3QgZGVwZW5kZW5jeSBhcyBhIHN0YWxsICovCi0KLQkgIHdoaWxlICgobW9kZWxfcHRyLT5mcF9idXN5ICYgZnBfbWFzaykgfHwgKG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSAmIGNyX21hc2spKSB7Ci0JICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICAgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgMCwgZnBfbWFzaywgY3JfbWFzaywgUFBDX05PX1NQUik7Ci0KLQkgICAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOwotCSAgICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQkgIH0KLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7Ci0JbW9kZWxfcHRyLT5mcF9idXN5IHw9IG91dF9tYXNrOwotCWJ1c3lfcHRyLT5mcF9idXN5IHw9IG91dF9tYXNrOwotCW1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSB8PSBjcl9tYXNrOwotCWJ1c3lfcHRyLT5jcl9mcHNjcl9idXN5IHw9IGNyX21hc2s7Ci0JYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAoY3JfbWFzaykgPyAyIDogMTsKLQlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQotCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgMCwgb3V0X21hc2ssIGNyX21hc2spOwotCi0KLSMgU2NoZWR1bGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyBib3RoIGludC9mbG9hdCBpbnB1dCByZWdpc3RlcnMgYW5kIHByb2R1Y2VzIG91dHB1dCBpbnQvZmxvYXQgcmVnaXN0ZXJzCi12b2lkOjptb2RlbC1mdW5jdGlvbjo6cHBjX2luc25faW50X2Zsb2F0Oml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBjb25zdCB1bnNpZ25lZDMyIG91dF9pbnRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBvdXRfZnBfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9pbnRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9mcF9tYXNrCi0JY29uc3QgdW5zaWduZWQzMiBpbnRfbWFzayA9IG91dF9pbnRfbWFzayB8IGluX2ludF9tYXNrOwotCWNvbnN0IHVuc2lnbmVkMzIgZnBfbWFzayA9IG91dF9mcF9tYXNrIHwgaW5fZnBfbWFzazsKLQltb2RlbF9idXN5ICpidXN5X3B0cjsKLQotCWlmICgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSB8fCAobW9kZWxfcHRyLT5mcF9idXN5ICYgZnBfbWFzaykpIHsKLQkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwkJCS8qIGRvbid0IGNvdW50IGZpcnN0IGRlcGVuZGVuY3kgYXMgYSBzdGFsbCAqLwotCi0JICB3aGlsZSAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgfHwgKG1vZGVsX3B0ci0+ZnBfYnVzeSAmIGZwX21hc2spKSB7Ci0JICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICAgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgaW50X21hc2ssIGZwX21hc2ssIDAsIFBQQ19OT19TUFIpOwotCi0JICAgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGErKzsKLQkgICAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7Ci0JICB9Ci0KLQkgIGJ1c3lfcHRyID0gbW9kZWxfd2FpdF9mb3JfdW5pdChpbmRleCwgbW9kZWxfcHRyLCAmbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdKTsKLQkgIG1vZGVsX3B0ci0+aW50X2J1c3kgfD0gb3V0X2ludF9tYXNrOwotCSAgYnVzeV9wdHItPmludF9idXN5IHw9IG91dF9pbnRfbWFzazsKLQkgIG1vZGVsX3B0ci0+ZnBfYnVzeSB8PSBvdXRfZnBfbWFzazsKLQkgIGJ1c3lfcHRyLT5mcF9idXN5IHw9IG91dF9mcF9tYXNrOwotCSAgYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAoKG91dF9pbnRfbWFzaykgPyAxIDogMCkgKyAoKG91dF9mcF9tYXNrKSA/IDEgOiAwKTsKLQkgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICAgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIG91dF9pbnRfbWFzaywgb3V0X2ZwX21hc2ssIDApOwotCSAgcmV0dXJuOwotCX0KLQotIyBTY2hlZHVsZSBhbiBNRlNQUiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIDEgc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVyIGFuZCBwcm9kdWNlcyBhbiBpbnRlZ2VyIG91dHB1dCByZWdpc3Rlcgotdm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX2Zyb21fc3ByOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBjb25zdCB1bnNpZ25lZDMyIGludF9tYXNrLCBjb25zdCB1bnNpZ25lZCBuU1BSCi0JbW9kZWxfYnVzeSAqYnVzeV9wdHI7Ci0KLQl3aGlsZSAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgIT0gMCB8fCBtb2RlbF9wdHItPnNwcl9idXN5W25TUFJdICE9IDApIHsKLQkgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCAwLCAwLCBuU1BSKTsKLQotCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOwotCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7Ci0JfQotCi0JYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOwotCW1vZGVsX3B0ci0+aW50X2J1c3kgfD0gaW50X21hc2s7Ci0JYnVzeV9wdHItPmludF9idXN5IHw9IGludF9tYXNrOwotCWJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gMTsKLQlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQotCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIDApOwotCi0jIFNjaGVkdWxlIGFuIE1UU1BSIGluc3RydWN0aW9uIHRoYXQgdGFrZXMgMSBpbnRlZ2VyIHJlZ2lzdGVyIGFuZCBwcm9kdWNlcyBhIHNwZWNpYWwgcHVycG9zZSBvdXRwdXQgcmVnaXN0ZXIKLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl90b19zcHI6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIGNvbnN0IHVuc2lnbmVkMzIgaW50X21hc2ssIGNvbnN0IHVuc2lnbmVkIG5TUFIKLQltb2RlbF9idXN5ICpidXN5X3B0cjsKLQotCXdoaWxlICgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSAhPSAwIHx8IG1vZGVsX3B0ci0+c3ByX2J1c3lbblNQUl0gIT0gMCkgewotCSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIDAsIG5TUFIpOwotCi0JICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7Ci0JYnVzeV9wdHItPnNwcl9idXN5ID0gblNQUjsKLQltb2RlbF9wdHItPnNwcl9idXN5W25TUFJdID0gMTsKLQlidXN5X3B0ci0+bnJfd3JpdGViYWNrcyA9IDE7Ci0JVFJBQ0UodHJhY2VfbW9kZWwsKCJNYWtpbmcgcmVnaXN0ZXIgJXMgYnVzeS5cbiIsIHNwcl9uYW1lKG5TUFIpKSk7Ci0KLSMgU2NoZWR1bGUgYSBNRkNSIGluc3RydWN0aW9uIHRoYXQgbW92ZXMgdGhlIENSIGludG8gYW4gaW50ZWdlciByZWdzaXRlcgotdm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX21mY3I6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIHVuc2lnbmVkMzIgaW50X21hc2sKLQljb25zdCB1bnNpZ25lZDMyIGNyX21hc2sgPSAweGZmOwotCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOwotCi0Jd2hpbGUgKCgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSB8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgIT0gMCkgewotCSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIGNyX21hc2ssIFBQQ19OT19TUFIpOwotCi0JICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7Ci0JbW9kZWxfcHRyLT5pbnRfYnVzeSB8PSBpbnRfbWFzazsKLQlidXN5X3B0ci0+aW50X2J1c3kgfD0gaW50X21hc2s7Ci0JYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAxOwotCWlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCi0JICBtb2RlbF90cmFjZV9tYWtlX2J1c3kobW9kZWxfcHRyLCBpbnRfbWFzaywgMCwgMCk7Ci0KLSMgU2NoZWR1bGUgYSBNVENSIGluc3RydWN0aW9uIHRoYXQgbW92ZXMgYW4gaW50ZWdlciByZWdpc3RlciBpbnRvIHRoZSBDUgotdm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX210Y3I6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIHVuc2lnbmVkMzIgaW50X21hc2ssIHVuc2lnbmVkIEZYTQotCWludCBmOwotCWludCBucl9jcnMgPSAwOwotCXVuc2lnbmVkMzIgY3JfbWFzayA9IDA7Ci0JY29uc3QgbW9kZWxfdGltZSAqbm9ybWFsX3RpbWUgPSAmbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdOwotCXN0YXRpYyBjb25zdCBtb2RlbF90aW1lIHBwYzYwNF8xYml0X3RpbWUgPSB7IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwIH07Ci0JbW9kZWxfYnVzeSAqYnVzeV9wdHI7Ci0KLQlmb3IgKGYgPSAwOyBmIDwgODsgZisrKSB7Ci0JICBpZiAoRlhNICYgKDB4ODAgPj4gZikpIHsKLQkgICAgY3JfbWFzayB8PSAoMSA8PCBmKTsKLQkgICAgbnJfY3JzKys7Ci0JICB9Ci0JfQotCi0Jd2hpbGUgKCgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSB8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgIT0gMCkgewotCSAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKLQkgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIGNyX21hc2ssIFBQQ19OT19TUFIpOwotCi0JICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7Ci0JICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKLQl9Ci0KLQkvKiBJZiBvbmx5IG9uZSBDUiBpcyBiZWluZyBtb3ZlZCwgdXNlIHRoZSBTQ0lVLCBub3QgdGhlIE1DSVUgb24gdGhlIDYwNCAqLwotCWlmIChDVVJSRU5UX01PREVMID09IE1PREVMX3BwYzYwNCAmJiBucl9jcnMgPT0gMSkgewotCSAgbm9ybWFsX3RpbWUgPSAmcHBjNjA0XzFiaXRfdGltZTsKLQl9Ci0KLQlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgbm9ybWFsX3RpbWUpOwotCWJ1c3lfcHRyLT5jcl9mcHNjcl9idXN5IHw9IGNyX21hc2s7Ci0JbW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5IHw9IGNyX21hc2s7Ci0JbW9kZWxfcHRyLT5ucl9tdGNyZl9jcnNbbnJfY3JzXSsrOwotCWJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gMTsKLQlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQotCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgMCwgMCwgY3JfbWFzayk7Ci0MCi1tb2RlbF9kYXRhICo6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9jcmVhdGU6Y3B1ICpwcm9jZXNzb3IKLQltb2RlbF9kYXRhICptb2RlbF9wdHIgPSBaQUxMT0MobW9kZWxfZGF0YSk7Ci0JbW9kZWxfcHRyLT5uYW1lID0gbW9kZWxfbmFtZVtDVVJSRU5UX01PREVMXTsKLQltb2RlbF9wdHItPnRpbWluZyA9IG1vZGVsX3RpbWVfbWFwcGluZ1tDVVJSRU5UX01PREVMXTsKLQltb2RlbF9wdHItPnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLQltb2RlbF9wdHItPm5yX2N5Y2xlcyA9IDE7Ci0JbW9kZWxfcHRyLT5idXN5X3RhaWwgPSAmbW9kZWxfcHRyLT5idXN5X2hlYWQ7Ci0Jc3dpdGNoIChDVVJSRU5UX01PREVMKSB7Ci0JY2FzZSBNT0RFTF9wcGM2MDE6ICBtb2RlbF9wdHItPm1heF9ucl93cml0ZWJhY2tzID0gMTsgYnJlYWs7CS8qID8/PyAqLwotCWNhc2UgTU9ERUxfcHBjNjAzOiAgbW9kZWxfcHRyLT5tYXhfbnJfd3JpdGViYWNrcyA9IDI7IGJyZWFrOwotCWNhc2UgTU9ERUxfcHBjNjAzZTogbW9kZWxfcHRyLT5tYXhfbnJfd3JpdGViYWNrcyA9IDI7IGJyZWFrOwotCWNhc2UgTU9ERUxfcHBjNjA0OiAgbW9kZWxfcHRyLT5tYXhfbnJfd3JpdGViYWNrcyA9IDI7IGJyZWFrOwotCWRlZmF1bHQ6IGVycm9yICgiVW5rbm93biBtb2RlbCAlZFxuIiwgQ1VSUkVOVF9NT0RFTCk7Ci0JfQotCXJldHVybiBtb2RlbF9wdHI7Ci0KLXZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9pbml0Om1vZGVsX2RhdGEgKm1vZGVsX3B0cgotCi12b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfaGFsdDptb2RlbF9kYXRhICptb2RlbF9wdHIKLQkvKiBMZXQgcGlwZWxpbmUgZHJhaW4gKi8KLQl3aGlsZSAobW9kZWxfcHRyLT5idXN5X2hlYWQubmV4dCkKLQkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwotCi11bnNpZ25lZF93b3JkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfZ2V0X251bWJlcl9vZl9zdGFsbHM6bW9kZWxfZGF0YSAqbW9kZWxfcHRyCi0JcmV0dXJuIChtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhCi0JICAgICAgICArIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3VuaXQKLQkgICAgICAgICsgbW9kZWxfcHRyLT5ucl9zdGFsbHNfc2VyaWFsaXplCi0JICAgICAgICArIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3dyaXRlYmFjayk7Ci0KLXVuc2lnbmVkX3dvcmQ6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlczptb2RlbF9kYXRhICptb2RlbF9wdHIKLQlyZXR1cm4gKG1vZGVsX3B0ci0+bnJfY3ljbGVzKTsKLQotbW9kZWxfcHJpbnQgKjo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX21vbl9pbmZvOm1vZGVsX2RhdGEgKm1vZGVsX3B0cgotCW1vZGVsX3ByaW50ICpoZWFkOwotCW1vZGVsX3ByaW50ICp0YWlsOwotCXBwY19mdW5jdGlvbl91bml0IGk7Ci0JY291bnRfdHlwZSBucl9pbnNuczsKLQlpbnQgajsKLQotCWhlYWQgPSB0YWlsID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKLQl0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfY3ljbGVzOwotCXRhaWwtPm5hbWUgPSAiY3ljbGUiOwotCXRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyI7Ci0JdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiI7Ci0KLQlpZiAobW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSkgewotCSAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7Ci0JICB0YWlsID0gdGFpbC0+bmV4dDsKLQkgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YTsKLQkgIHRhaWwtPm5hbWUgPSAic3RhbGwiOwotCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIHdhaXRpbmcgZm9yIGRhdGEiOwotCSAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiB3YWl0aW5nIGZvciBkYXRhIjsKLQl9Ci0KLQlpZiAobW9kZWxfcHRyLT5ucl9zdGFsbHNfdW5pdCkgewotCSAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7Ci0JICB0YWlsID0gdGFpbC0+bmV4dDsKLQkgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9zdGFsbHNfdW5pdDsKLQkgIHRhaWwtPm5hbWUgPSAic3RhbGwiOwotCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIHdhaXRpbmcgZm9yIGEgZnVuY3Rpb24gdW5pdCI7Ci0JICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIHdhaXRpbmcgZm9yIGEgZnVuY3Rpb24gdW5pdCI7Ci0JfQotCi0JaWYgKG1vZGVsX3B0ci0+bnJfc3RhbGxzX3NlcmlhbGl6ZSkgewotCSAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7Ci0JICB0YWlsID0gdGFpbC0+bmV4dDsKLQkgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9zdGFsbHNfc2VyaWFsaXplOwotCSAgdGFpbC0+bmFtZSA9ICJzdGFsbCI7Ci0JICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gInMgd2FpdGluZyBmb3Igc2VyaWFsaXphdGlvbiI7Ci0JICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIHdhaXRpbmcgZm9yIHNlcmlhbGl6YXRpb24iOwotCX0KLQotCWlmIChtb2RlbF9wdHItPm5yX3N0YWxsc193cml0ZWJhY2spIHsKLQkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOwotCSAgdGFpbCA9IHRhaWwtPm5leHQ7Ci0JICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfc3RhbGxzX3dyaXRlYmFjazsKLQkgIHRhaWwtPm5hbWUgPSAiIjsKLQkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAidGltZXMgYSB3cml0ZS1iYWNrIHNsb3Qgd2FzIHVuYXZhaWxhYmxlIjsKLQkgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICJ0aW1lIGEgd3JpdGViYWNrIHdhcyB1bmF2YWlsYWJsZSI7Ci0JfQotCi0JaWYgKG1vZGVsX3B0ci0+bnJfYnJhbmNoZXMpIHsKLQkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOwotCSAgdGFpbCA9IHRhaWwtPm5leHQ7Ci0JICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfYnJhbmNoZXM7Ci0JICB0YWlsLT5uYW1lID0gImJyYW5jaCI7Ci0JICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gImVzIjsKLQkgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIiOwotCX0KLQotCWlmIChtb2RlbF9wdHItPm5yX2JyYW5jaGVzX2ZhbGx0aHJvdWdoKSB7Ci0JICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKLQkgIHRhaWwgPSB0YWlsLT5uZXh0OwotCSAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX2JyYW5jaGVzX2ZhbGx0aHJvdWdoOwotCSAgdGFpbC0+bmFtZSA9ICJjb25kaXRpb25hbCBicmFuY2giOwotCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJlcyBmZWxsIHRocm91Z2giOwotCSAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiBmZWxsIHRocm91Z2giOwotCX0KLQotCWlmIChtb2RlbF9wdHItPm5yX2JyYW5jaF9wcmVkaWN0X3RydWVzKSB7Ci0JICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKLQkgIHRhaWwgPSB0YWlsLT5uZXh0OwotCSAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX2JyYW5jaF9wcmVkaWN0X3RydWVzOwotCSAgdGFpbC0+bmFtZSA9ICJzdWNjZXNzZnVsIGJyYW5jaCBwcmVkaWN0aW9uIjsKLQkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyI7Ci0JICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIjsKLQl9Ci0KLQlpZiAobW9kZWxfcHRyLT5ucl9icmFuY2hfcHJlZGljdF9mYWxzZXMpIHsKLQkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOwotCSAgdGFpbCA9IHRhaWwtPm5leHQ7Ci0JICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfYnJhbmNoX3ByZWRpY3RfZmFsc2VzOwotCSAgdGFpbC0+bmFtZSA9ICJ1bnN1Y2Nlc3NmdWwgYnJhbmNoIHByZWRpY3Rpb24iOwotCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIjsKLQkgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIiOwotCX0KLQotCWZvciAoaiA9IDA7IGogPCAoc2l6ZW9mKHBwY19icmFuY2hfY29uZGl0aW9uYWxfbmFtZSkgLyBzaXplb2YocHBjX2JyYW5jaF9jb25kaXRpb25hbF9uYW1lWzBdKSkgOyBqKyspIHsKLQkgIGlmIChtb2RlbF9wdHItPm5yX2JyYW5jaF9jb25kaXRpb25hbFtqXSkgewotCSAgICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKLQkgICAgdGFpbCA9IHRhaWwtPm5leHQ7Ci0JICAgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9icmFuY2hfY29uZGl0aW9uYWxbal07Ci0JICAgIHRhaWwtPm5hbWUgPSBwcGNfYnJhbmNoX2NvbmRpdGlvbmFsX25hbWVbal07Ci0JICAgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAiIGNvbmRpdGlvbmFsIGJyYW5jaGVzIjsKLQkgICAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiBjb25kaXRpb25hbCBicmFuY2giOwotCSAgfQotCX0KLQotCWZvciAoaiA9IDA7IGogPCA5OyBqKyspIHsKLQkgIGlmIChtb2RlbF9wdHItPm5yX210Y3JmX2Nyc1tqXSkgewotCSAgICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKLQkgICAgdGFpbCA9IHRhaWwtPm5leHQ7Ci0JICAgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9tdGNyZl9jcnNbal07Ci0JICAgIHRhaWwtPm5hbWUgPSBwcGNfbnJfbXRjcmZfY3JzW2pdOwotCSAgICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gIiBpbnN0cnVjdGlvbnMiOwotCSAgICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIGluc3RydWN0aW9uIjsKLQkgIH0KLQl9Ci0KLQlucl9pbnNucyA9IDA7Ci0JZm9yIChpID0gUFBDX1VOSVRfQkFEOyBpIDwgbnJfcHBjX2Z1bmN0aW9uX3VuaXRzOyBpKyspIHsKLQkgIGlmIChtb2RlbF9wdHItPm5yX3VuaXRzW2ldKSB7Ci0JICAgIG5yX2luc25zICs9IG1vZGVsX3B0ci0+bnJfdW5pdHNbaV07Ci0JICAgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOwotCSAgICB0YWlsID0gdGFpbC0+bmV4dDsKLQkgICAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX3VuaXRzW2ldOwotCSAgICB0YWlsLT5uYW1lID0gcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZVtpXTsKLQkgICAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIjsKLQkgICAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiI7Ci0JICB9Ci0JfQotCi0JdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7Ci0JdGFpbCA9IHRhaWwtPm5leHQ7Ci0JdGFpbC0+Y291bnQgPSBucl9pbnNuczsKLQl0YWlsLT5uYW1lID0gImluc3RydWN0aW9uIjsKLQl0YWlsLT5zdWZmaXhfcGx1cmFsID0gInMgdGhhdCB3ZXJlIGFjY291bnRlZCBmb3IgaW4gdGltaW5nIGluZm8iOwotCXRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIgdGhhdCB3YXMgYWNjb3VudGVkIGZvciBpbiB0aW1pbmcgaW5mbyI7Ci0KLQl0YWlsLT5uZXh0ID0gKG1vZGVsX3ByaW50ICopMDsKLQlyZXR1cm4gaGVhZDsKLQotdm9pZDo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX21vbl9pbmZvX2ZyZWU6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBtb2RlbF9wcmludCAqcHRyCi0Jd2hpbGUgKHB0cikgewotCSAgbW9kZWxfcHJpbnQgKm5leHQgPSBwdHItPm5leHQ7Ci0JICBmcmVlKCh2b2lkICopcHRyKTsKLQkgIHB0ciA9IG5leHQ7Ci0JfQotCi12b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfYnJhbmNoZXM6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBpbnQgZmFpbGVkLCBpbnQgY29uZGl0aW9uYWwKLQltb2RlbF9wdHItPm5yX3VuaXRzW1BQQ19VTklUX0JQVV0rKzsKLQlpZiAoZmFpbGVkKQotCSAgbW9kZWxfcHRyLT5ucl9icmFuY2hlc19mYWxsdGhyb3VnaCsrOwotCWVsc2UKLQkgIG1vZGVsX3B0ci0+bnJfYnJhbmNoZXMrKzsKLQlpZiAoY29uZGl0aW9uYWwgPj0gMCkKLQkgIG1vZGVsX3B0ci0+bnJfYnJhbmNoX2NvbmRpdGlvbmFsW2NvbmRpdGlvbmFsXSsrOwotCW1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwkvKiBBIGJyYW5jaCBhbHdheXMgZW5kcyB0aGUgY3VycmVudCBjeWNsZSAqLwotCi12b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfYnJhbmNoX3ByZWRpY3Q6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBpbnQgc3VjY2VzcwotCWlmIChzdWNjZXNzKQotCSAgbW9kZWxfcHRyLT5ucl9icmFuY2hfcHJlZGljdF90cnVlcysrOwotCWVsc2UKLQkgIG1vZGVsX3B0ci0+bnJfYnJhbmNoX3ByZWRpY3RfZmFsc2VzKys7Ci0KLQwKLSMgVGhlIGZvbGxvd2luZyAoaWxsZWdhbCkgaW5zdHJ1Y3Rpb24gaXMgYGtub3duJyBieSBnZW4gYW5kIGlzCi0jIGNhbGxlZCB3aGVuIGV2ZXIgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZAotOjppbnRlcm5hbDo6aWxsZWdhbAotCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCi0KLSMgVGhlIGZvbGxvd2luZyAoZmxvYXRpbmcgcG9pbnQgdW5hdmFpbGFibGUpIGluc3RydWN0aW9uIGlzIGBrbm93bicgYnkgZ2VuCi0jIGFuZCBpcyBjYWxsZWQgd2hlbiBldmVyIGFuIGEgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gaXMgdG8gYmUKLSMgZXhlY3V0ZWQgYnV0IGZsb2F0aW5nIHBvaW50IGlzIG1ha2UgdW5hdmFpbGFibGUgYnkgdGhlIE1TUgotOjppbnRlcm5hbDo6ZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGUKLQlmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEpOwotCi0KLSMKLSMgRmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBmdW5jdGlvbnMKLSMKLQotIyBDb252ZXJ0IDMyYml0IHNpbmdsZSB0byA2NGJpdCBkb3VibGUKLXVuc2lnbmVkNjQ6OmZ1bmN0aW9uOjpET1VCTEU6dW5zaWduZWQzMiBXT1JECi0JdW5zaWduZWQ2NCBGUlQ7Ci0JaWYgKEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDgpID4gMAotCSAgICAmJiBFWFRSQUNURUQzMihXT1JELCAxLCA4KSA8IDI1NSkgewotCSAgLyogbm9ybWFsaXplZCBvcGVyYW5kICovCi0JICBpbnQgbm90X3dvcmRfMV8xID0gIUVYVFJBQ1RFRDMyKFdPUkQsIDEsIDEpOyAvKjIuNi4zIGJ1ZyovCi0JICBGUlQgPSAoSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCAwLCAxKSwgMCwgMSkKLQkgICAgICAgICB8IElOU0VSVEVENjQobm90X3dvcmRfMV8xLCAyLCAyKQotCSAgICAgICAgIHwgSU5TRVJURUQ2NChub3Rfd29yZF8xXzEsIDMsIDMpCi0JICAgICAgICAgfCBJTlNFUlRFRDY0KG5vdF93b3JkXzFfMSwgNCwgNCkKLQkgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgMiwgMzEpLCA1LCAoNjMgLSAyOSkpKTsKLQl9Ci0JZWxzZSBpZiAoRVhUUkFDVEVEMzIoV09SRCwgMSwgOCkgPT0gMAotCSAgICAgICAgICYmIEVYVFJBQ1RFRDMyKFdPUkQsIDksIDMxKSAhPSAwKSB7Ci0JICAvKiBkZW5vcm1hbGl6ZWQgb3BlcmFuZCAqLwotCSAgaW50IHNpZ24gPSBFWFRSQUNURUQzMihXT1JELCAwLCAwKTsKLQkgIGludCBleHAgPSAtMTI2OwotCSAgdW5zaWduZWQ2NCBmcmFjID0gSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCA5LCAzMSksIDEsICg1MiAtIDI5KSk7Ci0JICAvKiBub3JtYWxpemUgdGhlIG9wZXJhbmQgKi8KLQkgIHdoaWxlIChNQVNLRUQ2NChmcmFjLCAwLCAwKSA9PSAwKSB7Ci0JICAgIGZyYWMgPDw9IDE7Ci0JICAgIGV4cCAtPSAxOwotCSAgfQotCSAgRlJUID0gKElOU0VSVEVENjQoc2lnbiwgMCwgMCkKLQkgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCi0JICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KGZyYWMsIDEsIDUyKSwgMTIsIDYzKSk7Ci0JfQotCWVsc2UgaWYgKEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDgpID09IDI1NQotCQkgfHwgRVhUUkFDVEVEMzIoV09SRCwgMSwgMzEpID09IDApIHsKLQkgIEZSVCA9IChJTlNFUlRFRDY0KEVYVFJBQ1RFRDMyKFdPUkQsIDAsIDEpLCAwLCAxKQotCSAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCAxLCAxKSwgMiwgMikKLQkgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgMSwgMSksIDMsIDMpCi0JICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDEpLCA0LCA0KQotCSAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCAyLCAzMSksIDUsICg2MyAtIDI5KSkpOwotCX0KLQllbHNlIHsKLQkgIGVycm9yKCJET1VCTEUgLSB1bmtub3duIGNhc2VcbiIpOwotCSAgRlJUID0gMDsKLQl9Ci0JcmV0dXJuIEZSVDsKLQotIyBDb252ZXJ0IDY0Yml0IHNpbmdsZSB0byAzMmJpdCBkb3VibGUKLXVuc2lnbmVkMzI6OmZ1bmN0aW9uOjpTSU5HTEU6dW5zaWduZWQ2NCBGUlMKLQl1bnNpZ25lZDMyIFdPUkQ7Ci0JaWYgKEVYVFJBQ1RFRDY0KEZSUywgMSwgMTEpID4gODk2Ci0JICAgIHx8IEVYVFJBQ1RFRDY0KEZSUywgMSwgNjMpID09IDApIHsKLQkgIC8qIG5vIGRlbm9ybWFsaXphdGlvbiByZXF1aXJlZCAoaW5jbHVkZXMgWmVyby9JbmZpbml0eS9OYU4pICovCi0JICBXT1JEID0gKElOU0VSVEVEMzIoRVhUUkFDVEVENjQoRlJTLCAwLCAxKSwgMCwgMSkKLQkgICAgICAgICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDY0KEZSUywgNSwgMzQpLCAyLCAzMSkpOwotCX0KLQllbHNlIGlmICg4NzQgPD0gRVhUUkFDVEVENjQoRlJTLCAxLCAxMSkKLQkgICAgICAgICAmJiBFWFRSQUNURUQ2NChGUlMsIDEsIDExKSA8PSA4OTYpIHsKLQkgIC8qIGRlbm9ybWFsaXphdGlvbiByZXF1aXJlZCAqLwotCSAgaW50IHNpZ24gPSBFWFRSQUNURUQ2NChGUlMsIDAsIDApOwotCSAgaW50IGV4cCA9IEVYVFJBQ1RFRDY0KEZSUywgMSwgMTEpIC0gMTAyMzsKLQkgIHVuc2lnbmVkNjQgZnJhYyA9IChCSVQ2NCgwKQotCSAgICAgICAgICAgICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChGUlMsIDEyLCA2MyksIDEsIDUyKSk7Ci0JICAvKiBkZW5vcm1hbGl6ZSB0aGUgb3BlcmFuZCAqLwotCSAgd2hpbGUgKGV4cCA8IC0xMjYpIHsKLQkgICAgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhYywgMCwgNjIpLCAxLCA2Myk7Ci0JICAgIGV4cCArPSAxOwotCSAgfQotCSAgV09SRCA9IChJTlNFUlRFRDMyKHNpZ24sIDAsIDApCi0JICAgICAgICAgIHwgSU5TRVJURUQzMigweDAwLCAxLCA4KQotCSAgICAgICAgICB8IElOU0VSVEVEMzIoRVhUUkFDVEVENjQoZnJhYywgMSwgMjMpLCA5LCAzMSkpOwotCX0KLQllbHNlIHsKLQkgIFdPUkQgPSAweDA7IC8qID8/PyAqLwotCX0JICAKLQlyZXR1cm4gV09SRDsKLQotCi0jIHJvdW5kIDY0Yml0IGRvdWJsZSB0byA2NGJpdCBidXQgc2luZ2xlCi12b2lkOjpmdW5jdGlvbjo6Um91bmRfU2luZ2xlOmNwdSAqcHJvY2Vzc29yLCBpbnQgc2lnbiwgaW50ICpleHAsIHVuc2lnbmVkNjQgKmZyYWNfZ3J4Ci0JLyogY29tcGFyaXNvbnMgaWdub3JlIHUgYml0cyAqLwotCXVuc2lnbmVkNjQgb3V0OwotCWludCBpbmMgPSAwOwotCWludCBsc2IgPSBFWFRSQUNURUQ2NCgqZnJhY19ncngsIDIzLCAyMyk7Ci0JaW50IGdiaXQgPSBFWFRSQUNURUQ2NCgqZnJhY19ncngsIDI0LCAyNCk7Ci0JaW50IHJiaXQgPSBFWFRSQUNURUQ2NCgqZnJhY19ncngsIDI1LCAyNSk7Ci0JaW50IHhiaXQgPSBFWFRSQUNURUQ2NCgqZnJhY19ncngsIDI2LCA1NSkgIT0gMDsKLQlpZiAoKEZQU0NSICYgZnBzY3Jfcm4pID09IGZwc2NyX3JuX3JvdW5kX3RvX25lYXJlc3QpIHsKLQkgIGlmIChsc2IgPT0gMSAmJiBnYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAobHNiID09IDAgJiYgZ2JpdCA9PSAxICYmIHJiaXQgPT0gMSkgaW5jID0gMTsKLQkgIGlmIChsc2IgPT0gMCAmJiBnYml0ID09IDEgJiYgeGJpdCA9PSAxKSBpbmMgPSAxOwotCX0KLQlpZiAoKEZQU0NSICYgZnBzY3Jfcm4pID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfcG9zX2luZmluaXR5KSB7Ci0JICBpZiAoc2lnbiA9PSAwICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKLQkgIGlmIChzaWduID09IDAgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKHNpZ24gPT0gMCAmJiB4Yml0ID09IDEpIGluYyA9IDE7Ci0JfQotCWlmICgoRlBTQ1IgJiBmcHNjcl9ybikgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19uZWdfaW5maW5pdHkpIHsKLQkgIGlmIChzaWduID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKHNpZ24gPT0gMSAmJiByYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAoc2lnbiA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKLQl9Ci0JLyogd29yayBvdXQgYWRkaXRpb24gaW4gbG93IDI1IGJpdHMgb2Ygb3V0ICovCi0Jb3V0ID0gRVhUUkFDVEVENjQoKmZyYWNfZ3J4LCAwLCAyMykgKyBpbmM7Ci0JKmZyYWNfZ3J4ID0gSU5TRVJURUQ2NChvdXQsIDAsIDIzKTsKLQlpZiAob3V0ICYgQklUNjQoNjQgLSAyMyAtIDEgLSAxKSkgewotCSAgKmZyYWNfZ3J4ID0gKEJJVDY0KDApIHwKLQkgICAgICAgICAgICAgICBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KCpmcmFjX2dyeCwgMCwgMjIpLCAxLCAyMykpOwotCSAgKmV4cCA9ICpleHAgKyAxOwotCX0KLQkvKiBmcmFjX2dyeFsyNDo1Ml0gPSAwIGFscmVhZHkgKi8KLQlGUFNDUl9TRVRfRlIoaW5jKTsKLQlGUFNDUl9TRVRfRkkoZ2JpdCB8fCByYml0IHx8IHhiaXQpOwotCi0KLSMKLXZvaWQ6OmZ1bmN0aW9uOjpSb3VuZF9JbnRlZ2VyOmNwdSAqcHJvY2Vzc29yLCBpbnQgc2lnbiwgdW5zaWduZWQ2NCAqZnJhYywgaW50ICpmcmFjNjQsIGludCBnYml0LCBpbnQgcmJpdCwgaW50IHhiaXQsIGZwc2NyZWcgcm91bmRfbW9kZQotCWludCBpbmMgPSAwOwotCWlmIChyb3VuZF9tb2RlID09IGZwc2NyX3JuX3JvdW5kX3RvX25lYXJlc3QpIHsKLQkgIGlmICgqZnJhYzY0ID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKCpmcmFjNjQgPT0gMCAmJiBnYml0ID09IDEgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKCpmcmFjNjQgPT0gMCAmJiBnYml0ID09IDEgJiYgeGJpdCA9PSAxKSBpbmMgPSAxOwotCX0KLQlpZiAocm91bmRfbW9kZSA9PSBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX3Bvc19pbmZpbml0eSkgewotCSAgaWYgKHNpZ24gPT0gMCAmJiBnYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAoc2lnbiA9PSAwICYmIHJiaXQgPT0gMSkgaW5jID0gMTsKLQkgIGlmIChzaWduID09IDAgJiYgeGJpdCA9PSAxKSBpbmMgPSAxOwotCX0KLQlpZiAocm91bmRfbW9kZSA9PSBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX25lZ19pbmZpbml0eSkgewotCSAgaWYgKHNpZ24gPT0gMSAmJiBnYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAoc2lnbiA9PSAxICYmIHJiaXQgPT0gMSkgaW5jID0gMTsKLQkgIGlmIChzaWduID09IDEgJiYgeGJpdCA9PSAxKSBpbmMgPSAxOwotCX0KLQkvKiBmcmFjWzA6NjRdID0gZnJhY1swOjY0fSArIGluYyAqLwotCSpmcmFjICs9ICgqZnJhYzY0ICYmIGluYyA/IDEgOiAwKTsKLQkqZnJhYzY0ID0gKCpmcmFjNjQgKyBpbmMpICYgMHgxOwotCUZQU0NSX1NFVF9GUihpbmMpOwotCUZQU0NSX1NFVF9GSShnYml0IHwgcmJpdCB8IHhiaXQpOwotCi0KLXZvaWQ6OmZ1bmN0aW9uOjpSb3VuZF9GbG9hdDpjcHUgKnByb2Nlc3NvciwgaW50IHNpZ24sIGludCAqZXhwLCB1bnNpZ25lZDY0ICpmcmFjLCBmcHNjcmVnIHJvdW5kX21vZGUKLQlpbnQgY2Fycnlfb3V0OwotCWludCBpbmMgPSAwOwotCWludCBsc2IgPSBFWFRSQUNURUQ2NCgqZnJhYywgNTIsIDUyKTsKLQlpbnQgZ2JpdCA9IEVYVFJBQ1RFRDY0KCpmcmFjLCA1MywgNTMpOwotCWludCByYml0ID0gRVhUUkFDVEVENjQoKmZyYWMsIDU0LCA1NCk7Ci0JaW50IHhiaXQgPSBFWFRSQUNURUQ2NCgqZnJhYywgNTUsIDU1KTsKLQlpZiAocm91bmRfbW9kZSA9PSBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0KSB7Ci0JICBpZiAobHNiID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKGxzYiA9PSAwICYmIGdiaXQgPT0gMSAmJiByYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAobHNiID09IDAgJiYgZ2JpdCA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKLQl9Ci0JaWYgKHJvdW5kX21vZGUgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19wb3NfaW5maW5pdHkpIHsKLQkgIGlmIChzaWduID09IDAgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKHNpZ24gPT0gMCAmJiByYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAoc2lnbiA9PSAwICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKLQl9Ci0JaWYgKHJvdW5kX21vZGUgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19uZWdfaW5maW5pdHkpIHsKLQkgIGlmIChzaWduID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOwotCSAgaWYgKHNpZ24gPT0gMSAmJiByYml0ID09IDEpIGluYyA9IDE7Ci0JICBpZiAoc2lnbiA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKLQl9Ci0JLyogZnJhYy8vY2Fycnlfb3V0ID0gZnJhYyArIGluYyAqLwotCSpmcmFjID0gKCpmcmFjID4+IDEpICsgKElOU0VSVEVENjQoaW5jLCA1MiwgNTIpID4+IDEpOwotCWNhcnJ5X291dCA9IEVYVFJBQ1RFRDY0KCpmcmFjLCAwLCAwKTsKLQkqZnJhYyA8PD0gMTsKLQlpZiAoY2Fycnlfb3V0ID09IDEpICpleHAgPSAqZXhwICsgMTsKLQlGUFNDUl9TRVRfRlIoaW5jKTsKLQlGUFNDUl9TRVRfRkkoZ2JpdCB8IHJiaXQgfCB4Yml0KTsKLQlGUFNDUl9TRVRfWFgoRlBTQ1IgJiBmcHNjcl9maSk7Ci0KLQotIyBjb252ZXJzaW9uIG9mIEZQIHRvIGludGVnZXIKLXZvaWQ6OmZ1bmN0aW9uOjpjb252ZXJ0X3RvX2ludGVnZXI6Y3B1ICpwcm9jZXNzb3IsIHVuc2lnbmVkX3dvcmQgY2lhLCB1bnNpZ25lZDY0ICpmcnQsIHVuc2lnbmVkNjQgZnJiLCBmcHNjcmVnIHJvdW5kX21vZGUsIGludCB0Z3RfcHJlY2lzaW9uCi0JaW50IGk7Ci0JaW50IGV4cCA9IDA7Ci0JdW5zaWduZWQ2NCBmcmFjID0gMDsKLQlpbnQgZnJhYzY0ID0gMDsKLQlpbnQgZ2JpdCA9IDA7Ci0JaW50IHJiaXQgPSAwOwotCWludCB4Yml0ID0gMDsKLQlpbnQgc2lnbiA9IEVYVFJBQ1RFRDY0KGZyYiwgMCwgMCk7Ci0JLyoqKi8KLQkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA9PSAyMDQ3ICYmIEVYVFJBQ1RFRDY0KGZyYiwgMTIsIDYzKSA9PSAwKQotCSAgICBHT1RPKEluZmluaXR5X09wZXJhbmQpOwotCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpID09IDIwNDcgJiYgRVhUUkFDVEVENjQoZnJiLCAxMiwgMTIpID09IDApCi0JICAgIEdPVE8oU05hTl9PcGVyYW5kKTsKLQkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA9PSAyMDQ3ICYmIEVYVFJBQ1RFRDY0KGZyYiwgMTIsIDEyKSA9PSAxKQotCSAgICBHT1RPKFFOYU5fT3BlcmFuZCk7Ci0JICBpZiAoRVhUUkFDVEVENjQoZnJiLCAxLCAxMSkgPiAxMDg2KSBHT1RPKExhcmdlX09wZXJhbmQpOwotCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpID4gMCkgZXhwID0gRVhUUkFDVEVENjQoZnJiLCAxLCAxMSkgLSAxMDIzOwotCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpID09IDApIGV4cCA9IC0xMDIyOwotCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpID4gMCkgeyAvKiBub3JtYWwgKi8KLQkgICAgZnJhYyA9IEJJVDY0KDEpIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmIsIDEyLCA2MyksIDIsIDUzKTsKLQkgICAgZnJhYzY0ID0gMDsKLQkgIH0KLQkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA9PSAwKSB7IC8qIGRlbm9ybSAqLwotCSAgICBmcmFjID0gSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmIsIDEyLCA2MyksIDIsIDUzKTsKLQkgICAgZnJhYzY0ID0gMDsKLQkgIH0KLQkgIGdiaXQgPSAwLCByYml0ID0gMCwgeGJpdCA9IDA7Ci0JICBmb3IgKGkgPSAxOyBpIDw9IDYzIC0gZXhwOyBpKyspIHsKLQkgICAgeGJpdCA9IHJiaXQgfCB4Yml0OwotCSAgICByYml0ID0gZ2JpdDsKLQkgICAgZ2JpdCA9IGZyYWM2NDsKLQkgICAgZnJhYzY0ID0gRVhUUkFDVEVENjQoZnJhYywgNjMsIDYzKTsKLQkgICAgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhYywgMCwgNjIpLCAxLCA2Myk7Ci0JICB9Ci0JICBSb3VuZF9JbnRlZ2VyKHByb2Nlc3Nvciwgc2lnbiwgJmZyYWMsICZmcmFjNjQsIGdiaXQsIHJiaXQsIHhiaXQsIHJvdW5kX21vZGUpOwotCSAgaWYgKHNpZ24gPT0gMSkgeyAvKiBmcmFjWzA6NjRdID0gfmZyYWNbMDo2NF0gKyAxICovCi0JICAgIGZyYWMgPSB+ZnJhYzsKLQkgICAgZnJhYzY0IF49IDE7Ci0JICAgIGZyYWMgKz0gKGZyYWM2NCA/IDEgOiAwKTsKLQkgICAgZnJhYzY0ID0gKGZyYWM2NCArIDEpICYgMHgxOwotCSAgfQotCSAgaWYgKHRndF9wcmVjaXNpb24gPT0gMzIgLyogY2FuIGlnbm9yZSBmcmFjNjQgaW4gY29tcGFyZSAqLwotCSAgICAgICYmIChzaWduZWQ2NClmcmFjID4gKHNpZ25lZDY0KU1BU0s2NCgzMysxLCA2MykvKjJeMzEtMSA+PjEqLykKLQkgICAgR09UTyhMYXJnZV9PcGVyYW5kKTsKLQkgIGlmICh0Z3RfcHJlY2lzaW9uID09IDY0IC8qIGNhbiBpZ25vcmUgZnJhYzY0IGluIGNvbXBhcmUgKi8KLQkgICAgICAmJiAoc2lnbmVkNjQpZnJhYyA+IChzaWduZWQ2NClNQVNLNjQoMSsxLCA2MykvKjJeNjMtMSA+PjEqLykKLQkgICAgR09UTyhMYXJnZV9PcGVyYW5kKTsKLQkgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyIC8qIGNhbiBpZ25vcmUgZnJhYzY0IGluIGNvbXBhcmUgKi8KLQkgICAgICAmJiAoc2lnbmVkNjQpZnJhYyA8IChzaWduZWQ2NClNQVNLNjQoMCwgMzIrMSkvKi0yXjMxID4+MSovKQotCSAgICBHT1RPKExhcmdlX09wZXJhbmQpOwotCSAgaWYgKHRndF9wcmVjaXNpb24gPT0gNjQgLyogY2FuIGlnbm9yZSBmcmFjNjQgaW4gY29tcGFyZSAqLwotCSAgICAgICYmIChzaWduZWQ2NClmcmFjIDwgKHNpZ25lZDY0KU1BU0s2NCgwLCAwKzEpLyotMl42MyA+PjEqLykKLQkgICAgR09UTyhMYXJnZV9PcGVyYW5kKTsKLQkgIEZQU0NSX1NFVF9YWChGUFNDUiAmIGZwc2NyX2ZpKTsKLQkgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyKQotCSAgICAqZnJ0ID0gTUFTS0VENjQoKmZydCwgMCwgMzEpIHwgKEVYVFJBQ1RFRDY0KGZyYWMsIDMzLCA2MykgPDwgMSkgfCBmcmFjNjQ7Ci0JICBpZiAodGd0X3ByZWNpc2lvbiA9PSA2NCkKLQkgICAgKmZydCA9IChFWFRSQUNURUQ2NChmcmFjLCAxLCA2MykgPDwgMSkgfCBmcmFjNjQ7Ci0JICAvKkZQU0NSW2ZwcmZdID0gdW5kZWZpbmVkICovCi0JICBHT1RPKERvbmUpOwotCSAgLyoqLwotCUxBQkVMKEluZmluaXR5X09wZXJhbmQpOgotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhjdmkpOwotCSAgaWYgKChGUFNDUiAmIGZwc2NyX3ZlKSA9PSAwKSB7Ci0JICAgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyKSB7Ci0JICAgICAgaWYgKHNpZ24gPT0gMCkgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IDB4N0ZGRkZGRkY7Ci0JICAgICAgaWYgKHNpZ24gPT0gMSkgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IDB4ODAwMDAwMDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgaWYgKHNpZ24gPT0gMCkgKmZydCA9IE1BU0s2NCgxLCA2Myk7IC8qMHg3RkZGX0ZGRkZfRkZGRl9GRkZGKi8KLQkgICAgICBpZiAoc2lnbiA9PSAxKSAqZnJ0ID0gQklUNjQoMCk7IC8qMHg4MDAwXzAwMDBfMDAwMF8wMDAwKi8KLQkgICAgfQotCSAgICAvKiBGUFNDUltGUFJGXSA9IHVuZGVmaW5lZCAqLwotCSAgfQotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoU05hTl9PcGVyYW5kKToKLQkgIEZQU0NSX1NFVF9GUigwKTsKLQkgIEZQU0NSX1NFVF9GSSgwKTsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4Y3ZpKTsKLQkgIGlmICgoRlBTQ1IgJiBmcHNjcl92ZSkgPT0gMCkgewotCSAgICBpZiAodGd0X3ByZWNpc2lvbiA9PSAzMikgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IDB4ODAwMDAwMDA7Ci0JICAgIGlmICh0Z3RfcHJlY2lzaW9uID09IDY0KSAqZnJ0ID0gQklUNjQoMCk7IC8qMHg4MDAwXzAwMDBfMDAwMF8wMDAwKi8KLQkgICAgLyogRlBTQ1JbZnByZl0gPSB1bmRlZmluZWQgKi8KLQkgIH0KLQkgIEdPVE8oRG9uZSk7Ci0JLyoqLwotCUxBQkVMKFFOYU5fT3BlcmFuZCk6Ci0JICBGUFNDUl9TRVRfRlIoMCk7Ci0JICBGUFNDUl9TRVRfRkkoMCk7Ci0JICBGUFNDUl9PUl9WWChmcHNjcl92eGN2aSk7Ci0JICBpZiAoKEZQU0NSICYgZnBzY3JfdmUpID09IDApIHsKLQkgICAgaWYgKHRndF9wcmVjaXNpb24gPT0gMzIpICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDgwMDAwMDAwOwotCSAgICBpZiAodGd0X3ByZWNpc2lvbiA9PSA2NCkgKmZydCA9IEJJVDY0KDApOy8qMHg4MDAwXzAwMDBfMDAwMF8wMDAwKi8KLQkgICAgLyogRlBTQ1JbZnByZl0gPSB1bmRlZmluZWQgKi8KLQkgIH0KLQkgIEdPVE8oRG9uZSk7Ci0JLyoqLwotCUxBQkVMKExhcmdlX09wZXJhbmQpOgotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhjdmkpOwotCSAgaWYgKChGUFNDUiAmIGZwc2NyX3ZlKSA9PSAwKSB7Ci0JICAgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyKSB7Ci0JICAgICAgaWYgKHNpZ24gPT0gMCkgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IDB4N2ZmZmZmZmY7Ci0JICAgICAgaWYgKHNpZ24gPT0gMSkgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IDB4ODAwMDAwMDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgaWYgKHNpZ24gPT0gMCkgKmZydCA9IE1BU0s2NCgxLCA2Myk7IC8qMHg3RkZGX0ZGRkZfRkZGRl9GRkZGKi8KLQkgICAgICBpZiAoc2lnbiA9PSAxKSAqZnJ0ID0gQklUNjQoMCk7IC8qMHg4MDAwXzAwMDBfMDAwMF8wMDAwKi8KLQkgICAgfQotCSAgICAvKiBGUFNDUltmcHJmXSA9IHVuZGVmaW5lZCAqLwotCSAgfQotCS8qKi8KLQlMQUJFTChEb25lKToKLQotCi0jIGV4dHJhY3Qgb3V0IHJhdyBmaWVsZHMgb2YgYSBGUCBudW1iZXIKLWludDo6ZnVuY3Rpb246OnNpZ246dW5zaWduZWQ2NCBGUlMKLQlyZXR1cm4gKE1BU0tFRDY0KEZSUywgMCwgMCkKLQkgICAgICAgID8gLTEKLQkgICAgICAgIDogMSk7Ci1pbnQ6OmZ1bmN0aW9uOjpiaWFzZWRfZXhwOnVuc2lnbmVkNjQgZnJzLCBpbnQgc2luZ2xlCi0JaWYgKHNpbmdsZSkKLQkgIHJldHVybiBFWFRSQUNURUQ2NChmcnMsIDEsIDgpOwotCWVsc2UKLQkgIHJldHVybiBFWFRSQUNURUQ2NChmcnMsIDEsIDExKTsKLXVuc2lnbmVkNjQ6OmZ1bmN0aW9uOjpmcmFjdGlvbjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQotCWlmIChzaW5nbGUpCi0JICByZXR1cm4gRVhUUkFDVEVENjQoZnJzLCA5LCAzMSk7Ci0JZWxzZQotCSAgcmV0dXJuIEVYVFJBQ1RFRDY0KGZycywgMTIsIDYzKTsKLQotIyBhIG51bWJlcj8sIGVhY2ggb2YgdGhlIGJlbG93IHJldHVybiArMSBvciAtMSAoYmFzZWQgb24gc2lnbiBiaXQpCi0jIGlmIHRydWUuCi1pbnQ6OmZ1bmN0aW9uOjppc19ub3I6dW5zaWduZWQ2NCBmcnMsIGludCBzaW5nbGUKLQlpbnQgZXhwID0gYmlhc2VkX2V4cChmcnMsIHNpbmdsZSk7Ci0JcmV0dXJuIChleHAgPj0gMQotCSAgICAgICAgJiYgZXhwIDw9IChzaW5nbGUgPyAyNTQgOiAyMDQ2KSk7Ci1pbnQ6OmZ1bmN0aW9uOjppc196ZXJvOnVuc2lnbmVkNjQgRlJTCi0JcmV0dXJuIChNQVNLRUQ2NChGUlMsIDEsIDYzKSA9PSAwCi0JICAgICAgICA/IHNpZ24oRlJTKQotCSAgICAgICAgOiAwKTsKLWludDo6ZnVuY3Rpb246OmlzX2Rlbjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQotCWludCBleHAgPSBiaWFzZWRfZXhwKGZycywgc2luZ2xlKTsKLQl1bnNpZ25lZDY0IGZyYWMgPSBmcmFjdGlvbihmcnMsIHNpbmdsZSk7Ci0JcmV0dXJuIChleHAgPT0gMCAmJiBmcmFjICE9IDAKLQkgICAgICAgID8gc2lnbihmcnMpCi0JICAgICAgICA6IDApOwotaW50OjpmdW5jdGlvbjo6aXNfaW5mOnVuc2lnbmVkNjQgZnJzLCBpbnQgc2luZ2xlCi0JaW50IGV4cCA9IGJpYXNlZF9leHAoZnJzLCBzaW5nbGUpOwotCXVuc2lnbmVkNjQgZnJhYyA9IGZyYWN0aW9uKGZycywgc2luZ2xlKTsKLQlyZXR1cm4gKGV4cCA9PSAoc2luZ2xlID8gMjU1IDogMjA0NykgJiYgZnJhYyA9PSAwCi0JICAgICAgICA/IHNpZ24oZnJzKQotCSAgICAgICAgOiAwKTsKLWludDo6ZnVuY3Rpb246OmlzX05hTjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQotCWludCBleHAgPSBiaWFzZWRfZXhwKGZycywgc2luZ2xlKTsKLQl1bnNpZ25lZDY0IGZyYWMgPSBmcmFjdGlvbihmcnMsIHNpbmdsZSk7Ci0JcmV0dXJuIChleHAgPT0gKHNpbmdsZSA/IDI1NSA6IDIwNDcpICYmIGZyYWMgIT0gMAotCSAgICAgICAgPyBzaWduKGZycykKLQkgICAgICAgIDogMCk7Ci1pbnQ6OmZ1bmN0aW9uOjppc19TTmFOOnVuc2lnbmVkNjQgZnJzLCBpbnQgc2luZ2xlCi0JcmV0dXJuIChpc19OYU4oZnJzLCBzaW5nbGUpCi0JICAgICAgICAmJiAhKGZycyAmIChzaW5nbGUgPyBNQVNLNjQoOSwgOSkgOiBNQVNLNjQoMTIsIDEyKSkpCi0JICAgICAgICAgICAgID8gc2lnbihmcnMpCi0JICAgICAgICAgICAgIDogMCk7Ci1pbnQ6OmZ1bmN0aW9uOjppc19RTmFOOnVuc2lnbmVkNjQgZnJzLCBpbnQgc2luZ2xlCi0JcmV0dXJuIChpc19OYU4oZnJzLCBzaW5nbGUpICYmICFpc19TTmFOKGZycywgc2luZ2xlKSk7Ci1pbnQ6OmZ1bmN0aW9uOjppc19sZXNzX3RoYW46dW5zaWduZWQ2NCAqZnJhLCB1bnNpZ25lZDY0ICpmcmIKLQlyZXR1cm4gKihkb3VibGUqKWZyYSA8ICooZG91YmxlKilmcmI7Ci1pbnQ6OmZ1bmN0aW9uOjppc19ncmVhdGVyX3RoYW46dW5zaWduZWQ2NCAqZnJhLCB1bnNpZ25lZDY0ICpmcmIKLQlyZXR1cm4gKihkb3VibGUqKWZyYSA+ICooZG91YmxlKilmcmI7Ci1pbnQ6OmZ1bmN0aW9uOjppc19lcXVhbl90bzp1bnNpZ25lZDY0ICpmcmEsIHVuc2lnbmVkNjQgKmZyYgotCXJldHVybiAqKGRvdWJsZSopZnJhID09ICooZG91YmxlKilmcmI7Ci0KLQotIyB3aGljaCBxdWlldCBuYW4gc2hvdWxkIGJlY29tZSB0aGUgcmVzdWx0Ci11bnNpZ25lZDY0OjpmdW5jdGlvbjo6c2VsZWN0X3FuYW46dW5zaWduZWQ2NCBmcmEsIHVuc2lnbmVkNjQgZnJiLCB1bnNpZ25lZDY0IGZyYywgaW50IGluc3RydWN0aW9uX2lzX2Zyc3AsIGludCBnZW5lcmF0ZV9xbmFuLCBpbnQgc2luZ2xlCi0JdW5zaWduZWQ2NCBmcnQgPSAwOwotCWlmIChpc19OYU4oZnJhLCBzaW5nbGUpKQotCSAgZnJ0ID0gZnJhOwotCWVsc2UgaWYgKGlzX05hTihmcmIsIHNpbmdsZSkpCi0JICBpZiAoaW5zdHJ1Y3Rpb25faXNfZnJzcCkKLQkgICAgZnJ0ID0gTUFTS0VENjQoZnJiLCAwLCAzNCk7Ci0JICBlbHNlCi0JICAgIGZydCA9IGZyYjsKLQllbHNlIGlmIChpc19OYU4oZnJjLCBzaW5nbGUpKQotCSAgZnJ0ID0gZnJjOwotCWVsc2UgaWYgKGdlbmVyYXRlX3FuYW4pCi0JICBmcnQgPSBNQVNLNjQoMSwgMTIpOyAvKiAweDdGRjhfMDAwMF8wMDAwXzAwMDAgKi8KLQllbHNlCi0JICBlcnJvcigic2VsZWN0X3FuYW4gLSBkZWZhdWx0IHJlYWNoZWRcbiIpOwotCXJldHVybiBmcnQ7Ci0KLQotIyBkZXRlY3QgaW52YWxpZCBvcGVyYXRpb24KLWludDo6ZnVuY3Rpb246OmlzX2ludmFsaWRfb3BlcmF0aW9uOmNwdSAqcHJvY2Vzc29yLCB1bnNpZ25lZF93b3JkIGNpYSwgdW5zaWduZWQ2NCBmcmEsIHVuc2lnbmVkNjQgZnJiLCBmcHNjcmVnIGNoZWNrLCBpbnQgc2luZ2xlLCBpbnQgbmVnYXRlCi0JaW50IGZhaWwgPSAwOwotCWlmICgoY2hlY2sgJiBmcHNjcl92eHNuYW4pCi0JICAgICYmIChpc19TTmFOKGZyYSwgc2luZ2xlKSB8fCBpc19TTmFOKGZyYiwgc2luZ2xlKSkpIHsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4c25hbik7Ci0JICBmYWlsID0gMTsKLQl9Ci0JaWYgKChjaGVjayAmIGZwc2NyX3Z4aXNpKQotCSAgICAmJiAoaXNfaW5mKGZyYSwgc2luZ2xlKSAmJiBpc19pbmYoZnJiLCBzaW5nbGUpKQotCSAgICAmJiAoKG5lZ2F0ZSAmJiBzaWduKGZyYSkgIT0gc2lnbihmcmIpKQotCSAgICAgICAgfHwgKCFuZWdhdGUgJiYgc2lnbihmcmEpID09IHNpZ24oZnJiKSkpKSB7Ci0JICAgLypGSVhNRTogZG9uJ3QgaGFuZGxlIGluZi1pbmYgVlMgaW5mKy1pbmYgKi8KLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4aXNpKTsKLQkgIGZhaWwgPSAxOwotCX0KLQlpZiAoKGNoZWNrICYgZnBzY3JfdnhpZGkpCi0JICAgICYmIChpc19pbmYoZnJhLCBzaW5nbGUpICYmIGlzX2luZihmcmIsIHNpbmdsZSkpKSB7Ci0JICBGUFNDUl9PUl9WWChmcHNjcl92eGlkaSk7Ci0JICBmYWlsID0gMTsKLQl9Ci0JaWYgKChjaGVjayAmIGZwc2NyX3Z4emR6KQotCSAgICAmJiAoaXNfemVybyhmcmEpICYmIGlzX3plcm8oZnJiKSkpIHsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4emR6KTsKLQkgIGZhaWwgPSAxOwotCX0KLQlpZiAoKGNoZWNrICYgZnBzY3JfdnhpbXopCi0JICAgICYmIChpc196ZXJvKGZyYSkgJiYgaXNfaW5mKGZyYiwgc2luZ2xlKSkpIHsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4aW16KTsKLQkgIGZhaWwgPSAxOwotCX0KLQlpZiAoKGNoZWNrICYgZnBzY3Jfdnh2YykKLQkgICAgJiYgKGlzX05hTihmcmEsIHNpbmdsZSkgfHwgaXNfTmFOKGZyYiwgc2luZ2xlKSkpIHsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4dmMpOwotCSAgZmFpbCA9IDE7Ci0JfQotCWlmICgoY2hlY2sgJiBmcHNjcl92eHNvZnQpKSB7Ci0JICBGUFNDUl9PUl9WWChmcHNjcl92eHNvZnQpOwotCSAgZmFpbCA9IDE7Ci0JfQotCWlmICgoY2hlY2sgJiBmcHNjcl92eHNxcnQpCi0JICAgICYmIHNpZ24oZnJhKSA8IDApIHsKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4c3FydCk7Ci0JICBmYWlsID0gMTsKLQl9Ci0JLyogaWYgKChjaGVjayAmJiBmcHNjcl92eGN2aSkgewotCSAgICAmJiAoaXNfaW5mKGZyYSwgc2luZ2xlKSB8fCBpc19OYU4oZnJhLCBzaW5nbGUpIHx8IGlzX2xhcmdlKGZyYSwgc2luZ2xlKSkpCi0JICBGUFNDUl9PUl9WWChmcHNjcl92eGN2aSk7Ci0JICBmYWlsID0gMTsKLQl9Ci0JKi8KLQlyZXR1cm4gZmFpbDsKLQotCi0KLQotCi0jIGhhbmRsZSBjYXNlIG9mIGludmFsaWQgb3BlcmF0aW9uCi12b2lkOjpmdW5jdGlvbjo6aW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb246Y3B1ICpwcm9jZXNzb3IsIHVuc2lnbmVkX3dvcmQgY2lhLCB1bnNpZ25lZDY0ICpmcnQsIHVuc2lnbmVkNjQgZnJhLCB1bnNpZ25lZDY0IGZyYiwgdW5zaWduZWQ2NCBmcmMsIGludCBpbnN0cnVjdGlvbl9pc19mcnNwLCBpbnQgaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCwgaW50IGluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQsIGludCBzaW5nbGUKLQlpZiAoRlBTQ1IgJiBmcHNjcl92ZSkgewotCSAgLyogaW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9uIGVuYWJsZWQgKi8KLQkgIC8qIEZSVCB1bmNoYWdlZCAqLwotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgLyogZnBzY3JfRlBSRiB1bmNoYW5nZWQgKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKiBpbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24gZGlzYWJsZWQgKi8KLQkgIGlmIChpbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0KSB7Ci0JICAgIGVycm9yKCJvb3BzaSIpOwotCSAgfQotCSAgZWxzZSBpZiAoaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCkgewotCSAgICBlcnJvcigib29wc2kiKTsKLQkgIH0KLQkgIGVsc2UgeyAvKiBhcnJpdGgsIGZyc3AgKi8KLQkgICAgKmZydCA9IHNlbGVjdF9xbmFuKGZyYSwgZnJiLCBmcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl9pc19mcnNwLCAxLypnZW5lcmF0ZSovLCBzaW5nbGUpOwotCSAgICBGUFNDUl9TRVRfRlIoMCk7Ci0JICAgIEZQU0NSX1NFVF9GSSgwKTsKLQkgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcXVpZXRfbmFuKTsKLQkgIH0KLQl9Ci0KLQotCi0KLSMgZGV0ZWN0IGRpdmlkZSBieSB6ZXJvCi1pbnQ6OmZ1bmN0aW9uOjppc19pbnZhbGlkX3plcm9fZGl2aWRlOmNwdSAqcHJvY2Vzc29yLCB1bnNpZ25lZF93b3JkIGNpYSwgdW5zaWduZWQ2NCBmcmEsIHVuc2lnbmVkNjQgZnJiLCBpbnQgc2luZ2xlCi0JaW50IGZhaWwgPSAwOwotCWlmIChpc196ZXJvIChmcmIpKSB7Ci0JICBGUFNDUl9TRVRfWlggKDEpOwotCSAgZmFpbCA9IDE7Ci0JfQotCXJldHVybiBmYWlsOwotCi0KLQotCi0jIGhhbmRsZSBjYXNlIG9mIGludmFsaWQgb3BlcmF0aW9uCi12b2lkOjpmdW5jdGlvbjo6aW52YWxpZF96ZXJvX2RpdmlkZV9vcGVyYXRpb246Y3B1ICpwcm9jZXNzb3IsIHVuc2lnbmVkX3dvcmQgY2lhLCB1bnNpZ25lZDY0ICpmcnQsIHVuc2lnbmVkNjQgZnJhLCB1bnNpZ25lZDY0IGZyYiwgaW50IHNpbmdsZQotCWlmIChGUFNDUiAmIGZwc2NyX3plKSB7Ci0JICAvKiB6ZXJvLWRpdmlkZSBleGNlcHRpb24gZW5hYmxlZCAqLwotCSAgLyogRlJUIHVuY2hhZ2VkICovCi0JICBGUFNDUl9TRVRfRlIoMCk7Ci0JICBGUFNDUl9TRVRfRkkoMCk7Ci0JICAvKiBmcHNjcl9GUFJGIHVuY2hhbmdlZCAqLwotCX0KLQllbHNlIHsKLQkgIC8qIHplcm8tZGl2aWRlIGV4Y2VwdGlvbiBkaXNhYmxlZCAqLwotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgaWYgKChzaWduIChmcmEpIDwgMCAmJiBzaWduIChmcmIpIDwgMCkKLQkgICAgICB8fCAoc2lnbiAoZnJhKSA+IDAgJiYgc2lnbiAoZnJiKSA+IDApKSB7Ci0JICAgICpmcnQgPSBNQVNLNjQgKDEsIDExKTsgLyogMCA6IDIwNDcgOiAwLi4wICovCi0JICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19pbmZpbml0eSk7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgKmZydCA9IE1BU0s2NCAoMCwgMTEpOyAvKiAxIDogMjA0NyA6IDAuLjAgKi8KLQkgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX2luZmluaXR5KTsKLQkgIH0KLQl9Ci0KLQotCi0KLQotIwotIyAwLjAuMC4wIElsbGVnYWwgaW5zdHJ1Y3Rpb24gdXNlZCBmb3Iga2VybmVsIG1vZGUgZW11bGF0aW9uCi0jCi0wLjAsNi4vLDExLi8sMTYuLywyMS4vLDMxLjE6WDo6Omluc3RydWN0aW9uX2NhbGwKLQlpZiAoIW9zX2VtdWxfaW5zdHJ1Y3Rpb25fY2FsbChwcm9jZXNzb3IsIGNpYSwgcmVhbF9hZGRyKGNpYSwgMSkpKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQotIwotIyBJLjIuNC4xIEJyYW5jaCBJbnN0cnVjdGlvbnMKLSMKLTAuMTgsNi5MSSwzMC5BQSwzMS5MSzpJOjo6QnJhbmNoCi0qNjAxOiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCS8qIG9wdGlvbl9tcGM4NjBjMDoKLQlObyBwcm9ibGVtIGhlcmUgYmVjYXVzZSB0aGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgdGFrZW4gKHVuY29uZGl0aW9uYWwpLiAqLwotCWlmIChBQSkgTklBID0gSUVBKEVYVFMoTElfMGIwMCkpOwotCWVsc2UgICAgTklBID0gSUVBKENJQSArIEVYVFMoTElfMGIwMCkpOwotCWlmIChMSykgTFIgPSAoc3ByZWcpQ0lBKzQ7Ci0JaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQotCSAgbW9kZWxfYnJhbmNoZXMoY3B1X21vZGVsKHByb2Nlc3NvciksIDEsIC0xKTsKLQotMC4xNiw2LkJPLDExLkJJLDE2LkJELDMwLkFBLDMxLkxLOkI6OjpCcmFuY2ggQ29uZGl0aW9uYWwKLSo2MDE6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0JaW50IE0sIGN0cl9vaywgY29uZF9vaywgc3VjY2VlZDsKLQlpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDAgJiYgISBCT3swfSkKLQkgIG1vZGVsX3dhaXRfZm9yX2NyKGNwdV9tb2RlbChwcm9jZXNzb3IpLCBCSVQzMl9CSSk7Ci0JaWYgKGlzXzY0Yml0X2ltcGxlbWVudGF0aW9uICYmIGlzXzY0Yml0X21vZGUpIE0gPSAwOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNID0gMzI7Ci0JaWYgKCFCT3syfSkgQ1RSID0gQ1RSIC0gMTsKLQljdHJfb2sgPSBCT3syfSB8fCAoKE1BU0tFRChDVFIsIE0sIDYzKSAhPSAwKSAhPSAoQk97M30pKTsKLQljb25kX29rID0gQk97MH0gfHwgKChDUntCSX0pID09IChCT3sxfSkpOwotCWlmIChjdHJfb2sgJiYgY29uZF9vaykgewotCSAgaWYgKEFBKSBOSUEgPSBJRUEoRVhUUyhCRF8wYjAwKSk7Ci0JICBlbHNlICAgIE5JQSA9IElFQShDSUEgKyBFWFRTKEJEXzBiMDApKTsKLQkgIHN1Y2NlZWQgPSAxOwotCX0KLQllbHNlCi0JICBzdWNjZWVkID0gMDsKLQlpZiAoTEspIExSID0gKHNwcmVnKUlFQShDSUEgKyA0KTsKLQlpZiAob3B0aW9uX21wYzg2MGMwICYmICghQk97MH0gfHwgIUJPezJ9KSAmJiAhQk97NH0pIHsKLQkgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyAibm9ybWFsIi4KLQkgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCBhbmQgaXQgaXMgbmVhciB0aGUgZW5kIG9mIGEgcGFnZSwKLQkgIHdlJ3ZlIGRldGVjdGVkIGEgcHJvYmxlbWF0aWMgYnJhbmNoLiAqLwotCSAgaWYgKHN1Y2NlZWQgJiYgTklBID4gQ0lBKSB7Ci0JICAgIGlmIChQQUdFX1NJWkUgLSAoQ0lBICYgKFBBR0VfU0laRS0xKSkgPD0gb3B0aW9uX21wYzg2MGMwKQotCSAgICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JICB9Ci0JfQotCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkKLQkgIG1vZGVsX2JyYW5jaGVzKGNwdV9tb2RlbChwcm9jZXNzb3IpLCBzdWNjZWVkLCBCTyk7Ci0JaWYgKCEgQk97MH0pIHsKLQkgIGludCByZXZlcnNlOwotCSAgaWYgKEJPezR9KSB7CS8qIGJyYW5jaCBwcmVkaWN0aW9uIGJpdCBzZXQsIHJldmVyc2Ugc2Vuc2Ugb2YgdGVzdCAqLwotCSAgICByZXZlcnNlID0gRVhUUyhCRF8wYjAwKSA8IDA7Ci0JICB9IGVsc2UgewkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgbm90IHNldCAqLwotCSAgICByZXZlcnNlID0gRVhUUyhCRF8wYjAwKSA+PSAwOwotCSAgfQotCSAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQotCSAgICBtb2RlbF9icmFuY2hfcHJlZGljdChjcHVfbW9kZWwocHJvY2Vzc29yKSwgcmV2ZXJzZSA/ICFzdWNjZWVkIDogc3VjY2VlZCk7Ci0JfQotCi0wLjE5LDYuQk8sMTEuQkksMTYuLywyMS4xNiwzMS5MSzpYTDo6OkJyYW5jaCBDb25kaXRpb25hbCB0byBMaW5rIFJlZ2lzdGVyCi0qNjAxOiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCWludCBNLCBjdHJfb2ssIGNvbmRfb2ssIHN1Y2NlZWQ7Ci0JaWYgKGlzXzY0Yml0X2ltcGxlbWVudGF0aW9uICYmIGlzXzY0Yml0X21vZGUpIE0gPSAwOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNID0gMzI7Ci0JaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwICYmICEgQk97MH0pCi0JICBtb2RlbF93YWl0X2Zvcl9jcihjcHVfbW9kZWwocHJvY2Vzc29yKSwgQklUMzJfQkkpOwotCWlmICghQk97Mn0pIENUUiA9IENUUiAtIDE7Ci0JY3RyX29rID0gQk97Mn0gfHwgKChNQVNLRUQoQ1RSLCBNLCA2MykgIT0gMCkgIT0gQk97M30pOwotCWNvbmRfb2sgPSBCT3swfSB8fCAoQ1J7Qkl9ID09IEJPezF9KTsKLQlpZiAoY3RyX29rICYmIGNvbmRfb2spIHsKLQkgIE5JQSA9IElFQShMUl8wYjAwKTsKLQkgIHN1Y2NlZWQgPSAxOwotCX0KLQllbHNlCi0JICBzdWNjZWVkID0gMDsKLQlpZiAoTEspIExSID0gKHNwcmVnKUlFQShDSUEgKyA0KTsKLQlpZiAob3B0aW9uX21wYzg2MGMwICYmICghQk97MH0gfHwgIUJPezJ9KSAmJiAhQk97NH0pIHsKLQkgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCi0JICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2ggYW5kIGl0IGlzIG5lYXIgdGhlIGVuZCBvZiBhIHBhZ2UsCi0JICB3ZSd2ZSBkZXRlY3RlZCBhIHByb2JsZW1hdGljIGJyYW5jaC4gKi8KLQkgIGlmIChzdWNjZWVkICYmIE5JQSA+IENJQSkgewotCSAgICBpZiAoUEFHRV9TSVpFIC0gKENJQSAmIChQQUdFX1NJWkUtMSkpIDw9IG9wdGlvbl9tcGM4NjBjMCkKLQkgICAgICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgbXBjODYwYzBfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCSAgfQotCX0KLQlpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIHsKLQkgIG1vZGVsX2JyYW5jaGVzKGNwdV9tb2RlbChwcm9jZXNzb3IpLCBzdWNjZWVkLCBCTyk7Ci0JICBpZiAoISBCT3swfSkKLQkgICAgbW9kZWxfYnJhbmNoX3ByZWRpY3QoY3B1X21vZGVsKHByb2Nlc3NvciksIEJPezR9ID8gIXN1Y2NlZWQgOiBzdWNjZWVkKTsKLQl9Ci0KLTAuMTksNi5CTywxMS5CSSwxNi4vLDIxLjUyOCwzMS5MSzpYTDo6OkJyYW5jaCBDb25kaXRpb25hbCB0byBDb3VudCBSZWdpc3RlcgotKjYwMTogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLQlpbnQgY29uZF9vaywgc3VjY2VlZDsKLQlpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDAgJiYgISBCT3swfSkKLQkgIG1vZGVsX3dhaXRfZm9yX2NyKGNwdV9tb2RlbChwcm9jZXNzb3IpLCBCSVQzMl9CSSk7Ci0JY29uZF9vayA9IEJPezB9IHx8IChDUntCSX0gPT0gQk97MX0pOwotCWlmIChjb25kX29rKSB7Ci0JICBOSUEgPSBJRUEoQ1RSXzBiMDApOwotCSAgc3VjY2VlZCA9IDE7Ci0JfQotCWVsc2UKLQkgIHN1Y2NlZWQgPSAwOwotCWlmIChMSykgTFIgPSAoc3ByZWcpSUVBKENJQSArIDQpOwotCWlmIChvcHRpb25fbXBjODYwYzAgJiYgKCFCT3swfSB8fCAhQk97Mn0pICYmICFCT3s0fSkgewotCSAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KLQkgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCBhbmQgaXQgaXMgbmVhciB0aGUgZW5kIG9mIGEgcGFnZSwKLQkgIHdlJ3ZlIGRldGVjdGVkIGEgcHJvYmxlbWF0aWMgYnJhbmNoLiAqLwotCSAgaWYgKHN1Y2NlZWQgJiYgTklBID4gQ0lBKSB7Ci0JICAgIGlmIChQQUdFX1NJWkUgLSAoQ0lBICYgKFBBR0VfU0laRS0xKSkgPD0gb3B0aW9uX21wYzg2MGMwKQotCSAgICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JICB9Ci0JfQotCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgewotCSAgbW9kZWxfYnJhbmNoZXMoY3B1X21vZGVsKHByb2Nlc3NvciksIHN1Y2NlZWQsIEJPKTsKLQkgIGlmICghIEJPezB9KQotCSAgICBtb2RlbF9icmFuY2hfcHJlZGljdChjcHVfbW9kZWwocHJvY2Vzc29yKSwgQk97NH0gPyAhc3VjY2VlZCA6IHN1Y2NlZWQpOwotCX0KLQotIwotIyBJLjIuNC4yIFN5c3RlbSBDYWxsIEluc3RydWN0aW9uCi0jCi0wLjE3LDYuLywxMS4vLDE2Li8sMzAuMSwzMS4vOlNDOjo6U3lzdGVtIENhbGwKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQotCSAgbW9kZWxfc2VyaWFsaXplKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSk7Ci0Jc3lzdGVtX2NhbGxfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhKTsKLQotIwotIyBJLjIuNC4zIENvbmRpdGlvbiBSZWdpc3RlciBMb2dpY2FsIEluc3RydWN0aW9ucwotIwotMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjI1NywzMS4vOlhMOjpjcmFuZDpDb25kaXRpb24gUmVnaXN0ZXIgQU5ECi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCUJMSVQzMihDUiwgQlQsIENSe0JBfSAmJiBDUntCQn0pOwotCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKLQotMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjQ0OSwzMS4vOlhMOjpjcm9yOkNvbmRpdGlvbiBSZWdpc3RlciBPUgotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLQlCTElUMzIoQ1IsIEJULCBDUntCQX0gfHwgQ1J7QkJ9KTsKLQlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7Ci0KLTAuMTksNi5CVCwxMS5CQSwxNi5CQiwyMS4xOTMsMzEuLzpYTDo6Y3J4b3I6Q29uZGl0aW9uIFJlZ2lzdGVyIFhPUgotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLQlCTElUMzIoQ1IsIEJULCBDUntCQX0gIT0gQ1J7QkJ9KTsKLQlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7Ci0KLTAuMTksNi5CVCwxMS5CQSwxNi5CQiwyMS4yMjUsMzEuLzpYTDo6Y3JuYW5kOkNvbmRpdGlvbiBSZWdpc3RlciBOQU5ECi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCUJMSVQzMihDUiwgQlQsICEoQ1J7QkF9ICYmIENSe0JCfSkpOwotCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKLQotMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjMzLDMxLi86WEw6OmNybm9yOkNvbmRpdGlvbiBSZWdpc3RlciBOT1IKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0JQkxJVDMyKENSLCBCVCwgIShDUntCQX0gfHwgQ1J7QkJ9KSk7Ci0JUFBDX0lOU05fQ1IoQlRfQklUTUFTSywgQkFfQklUTUFTSyB8IEJCX0JJVE1BU0spOwotCi0wLjE5LDYuQlQsMTEuQkEsMTYuQkIsMjEuMjg5LDMxLi86WEw6OmNyZXF2OkNvbmRpdGlvbiBSZWdpc3RlciBFcXVpdmFsZW50Ci0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCUJMSVQzMihDUiwgQlQsIENSe0JBfSA9PSBDUntCQn0pOwotCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKLQotMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjEyOSwzMS4vOlhMOjpjcmFuZGM6Q29uZGl0aW9uIFJlZ2lzdGVyIEFORCB3aXRoIENvbXBsZW1lbnQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCi0JQkxJVDMyKENSLCBCVCwgQ1J7QkF9ICYmICFDUntCQn0pOwotCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKLQotMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjQxNywzMS4vOlhMOjpjcm9yYzpDb25kaXRpb24gUmVnaXN0ZXIgT1Igd2l0aCBDb21wbGVtZW50Ci0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAotCUJMSVQzMihDUiwgQlQsIENSe0JBfSB8fCAhQ1J7QkJ9KTsKLQlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7Ci0KLSMKLSMgSS4yLjQuNCBDb25kaXRpb24gUmVnaXN0ZXIgRmllbGQgSW5zdHJ1Y3Rpb24KLSMKLTAuMTksNi5CRiw5Li8sMTEuQkZBLDE0Li8sMTYuLywyMS4wLDMxLi86WEw6OjpNb3ZlIENvbmRpdGlvbiBSZWdpc3RlciBGaWVsZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKLQlNQkxJVDMyKENSLCA0KkJGLCA0KkJGKzMsIEVYVFJBQ1RFRDMyKENSLCA0KkJGQSwgNCpCRkErMykpOwotCVBQQ19JTlNOX0NSKEJGX0JJVE1BU0ssIDEgPDwgQkZBKTsKLQotCi0jCi0jIEkuMy4zLjIgRml4ZWQtUG9pbnQgTG9hZCBJbnN0cnVjdGlvbnMKLSMKLQotMC4zNCw2LlJULDExLlJBLDE2LkQ6RDo6OkxvYWQgQnl0ZSBhbmQgWmVybwotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgRVhUUyhEKTsKLQkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAxKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOwotCi0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS44NywzMS4vOlg6OjpMb2FkIEJ5dGUgYW5kIFplcm8gSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDEpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjM1LDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBCeXRlIGFuZCBaZXJvIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAxKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMTE5LDMxLi86WDo6OkxvYWQgQnl0ZSBhbmQgWmVybyB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDEpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLIHwgUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjQwLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBhbmQgWmVybwotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgRVhUUyhEKTsKLQkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAyKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMjc5LDMxLi86WDo6OkxvYWQgSGFsZndvcmQgYW5kIFplcm8gSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDIpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjQxLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBhbmQgWmVybyB3aXRoIFVwZGF0ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQlFQSA9ICpyQSArIEVYVFMoRCk7Ci0JKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgMik7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjMxMSwzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JRUEgPSAqckEgKyAqckI7Ci0JKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgMik7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgMCk7Ci0KLTAuNDIsNi5SVCwxMS5SQSwxNi5EOkQ6OjpMb2FkIEhhbGZ3b3JkIEFsZ2VicmFpYwotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgRVhUUyhEKTsKLQkqclQgPSBNRU0oc2lnbmVkLCBFQSwgMik7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjM0MywzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIEFsZ2VicmFpYyBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JKnJUID0gTUVNKHNpZ25lZCwgRUEsIDIpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjQzLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBBbGdlYnJhaWMgd2l0aCBVcGRhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JRUEgPSAqckEgKyBFWFRTKEQpOwotCSpyVCA9IE1FTShzaWduZWQsIEVBLCAyKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzc1LDMxLi86WDo6OkxvYWQgSGFsZndvcmQgQWxnZWJyYWljIHdpdGggVXBkYXRlIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JRUEgPSAqckEgKyAqckI7Ci0JKnJUID0gTUVNKHNpZ25lZCwgRUEsIDIpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLIHwgUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjMyLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBXb3JkIGFuZCBaZXJvCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyBFWFRTKEQpOwotCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDQpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMywzMS4vOlg6OjpMb2FkIFdvcmQgYW5kIFplcm8gSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDQpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjMzLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBXb3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA0KTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuNTUsMzEuLzpYOjo6TG9hZCBXb3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JRUEgPSAqckEgKyAqckI7Ci0JKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgMCk7Ci0KLTAuNTgsNi5SVCwxMS5SQSwxNi5EUywzMC4yOkRTOjY0OjpMb2FkIFdvcmQgQWxnZWJyYWljCi0jCXVuc2lnbmVkX3dvcmQgYjsKLSMJdW5zaWduZWRfd29yZCBFQTsKLSMJaWYgKFJBX2lzXzApIGIgPSAwOwotIwllbHNlICAgICAgICAgYiA9ICpyQTsKLSMJRUEgPSBiICsgRVhUUyhEU18wYjAwKTsKLSMJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDQpOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzQxLDMxLi86WDo2NDo6TG9hZCBXb3JkIEFsZ2VicmFpYyBJbmRleGVkCi0jCXVuc2lnbmVkX3dvcmQgYjsKLSMJdW5zaWduZWRfd29yZCBFQTsKLSMJaWYgKFJBX2lzXzApIGIgPSAwOwotIwllbHNlICAgICAgICAgYiA9ICpyQTsKLSMJRUEgPSBiICsgKnJCOzsKLSMJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDQpOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzczLDMxLi86WDo2NDo6TG9hZCBXb3JkIEFsZ2VicmFpYyB3aXRoIFVwZGF0ZSBJbmRleGVkCi0jCXVuc2lnbmVkX3dvcmQgRUE7Ci0jCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQotIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCi0jCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0jCUVBID0gKnJBICsgKnJCOwotIwkqclQgPSBNRU0oc2lnbmVkLCBFQSwgNCk7Ci0jCSpyQSA9IEVBOwotCi0wLjU4LDYuUlQsMTEuUkEsMTYuRFMsMzAuMDpEUzo2NDo6TG9hZCBEb3VibGV3b3JkCi0jCXVuc2lnbmVkX3dvcmQgYjsKLSMJdW5zaWduZWRfd29yZCBFQTsKLSMJaWYgKFJBX2lzXzApIGIgPSAwOwotIwllbHNlICAgICAgICAgYiA9ICpyQTsKLSMJRUEgPSBiICsgRVhUUyhEU18wYjAwKTsKLSMJKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgOCk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMSwzMS4vOlg6NjQ6OkxvYWQgRG91Ymxld29yZCBJbmRleGVkCi0jCXVuc2lnbmVkX3dvcmQgYjsKLSMJdW5zaWduZWRfd29yZCBFQTsKLSMJaWYgKFJBX2lzXzApIGIgPSAwOwotIwllbHNlICAgICAgICAgYiA9ICpyQTsKLSMJRUEgPSBiICsgKnJCOwotIwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKLQotMC41OCw2LlJULDExLlJBLDE2LkRTLDMwLjE6RFM6NjQ6OkxvYWQgRG91Ymxld29yZCB3aXRoIFVwZGF0ZQotIwl1bnNpZ25lZF93b3JkIEVBOwotIwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKLSMJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYQotIwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotIwlFQSA9ICpyQSArIEVYVFMoRFNfMGIwMCk7Ci0jCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDgpOwotIwkqckEgPSBFQTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzLDMxLi86RFM6NjQ6OkxvYWQgRG91Ymxld29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCi0jCXVuc2lnbmVkX3dvcmQgRUE7Ci0jCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQotIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCi0jCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0jCUVBID0gKnJBICsgKnJCOwotIwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKLSMJKnJBID0gRUE7Ci0KLQotCi0jCi0jIEkuMy4zLjMgRml4ZWQtUG9pbnQgU3RvcmUgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuMzgsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBCeXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyBFWFRTKEQpOwotCVNUT1JFKEVBLCAxLCAqclMpOwotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMjE1LDMxLi86WDo6OlN0b3JlIEJ5dGUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCVNUT1JFKEVBLCAxLCAqclMpOwotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKLQotMC4zOSw2LlJTLDExLlJBLDE2LkQ6RDo6OlN0b3JlIEJ5dGUgd2l0aCBVcGRhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JRUEgPSAqckEgKyBFWFRTKEQpOwotCVNUT1JFKEVBLCAxLCAqclMpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUlNfQklUTUFTSywgMCk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yNDcsMzEuLzpYOjo6U3RvcmUgQnl0ZSB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCVNUT1JFKEVBLCAxLCAqclMpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjQ0LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgSGFsZiBXb3JkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyBFWFRTKEQpOwotCVNUT1JFKEVBLCAyLCAqclMpOwotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDA3LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JU1RPUkUoRUEsIDIsICpyUyk7Ci0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjQ1LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgSGFsZiBXb3JkIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQlTVE9SRShFQSwgMiwgKnJTKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDM5LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCVNUT1JFKEVBLCAyLCAqclMpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjM2LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgV29yZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgRVhUUyhEKTsKLQlTVE9SRShFQSwgNCwgKnJTKTsKLQlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSU19CSVRNQVNLLCAwKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjE1MSwzMS4vOlg6OjpTdG9yZSBXb3JkIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArICpyQjsKLQlTVE9SRShFQSwgNCwgKnJTKTsKLQlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLIHwgUlNfQklUTUFTSywgMCk7Ci0KLTAuMzcsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBXb3JkIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQlTVE9SRShFQSwgNCwgKnJTKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMTgzLDMxLi86WDo6OlN0b3JlIFdvcmQgd2l0aCBVcGRhdGUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQlFQSA9ICpyQSArICpyQjsKLQlTVE9SRShFQSwgNCwgKnJTKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKLQotMC42Miw2LlJTLDExLlJBLDE2LkRTLDMwLjA6RFM6NjQ6OlN0b3JlIERvdWJsZXdvcmQKLSMJdW5zaWduZWRfd29yZCBiOwotIwl1bnNpZ25lZF93b3JkIEVBOwotIwlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0jCWVsc2UgICAgICAgICBiID0gKnJBOwotIwlFQSA9IGIgKyBFWFRTKERTXzBiMDApOwotIwlTVE9SRShFQSwgOCwgKnJTKTsKLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4xNDksMzEuLzpYOjY0OjpTdG9yZSBEb3VibGV3b3JkIEluZGV4ZWQKLSMJdW5zaWduZWRfd29yZCBiOwotIwl1bnNpZ25lZF93b3JkIEVBOwotIwlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0jCWVsc2UgICAgICAgICBiID0gKnJBOwotIwlFQSA9IGIgKyAqckI7Ci0jCVNUT1JFKEVBLCA4LCAqclMpOwotMC42Miw2LlJTLDExLlJBLDE2LkRTLDMwLjE6RFM6NjQ6OlN0b3JlIERvdWJsZXdvcmQgd2l0aCBVcGRhdGUKLSMJdW5zaWduZWRfd29yZCBFQTsKLSMJaWYgKFJBX2lzXzApCi0jCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEKLSMJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLSMJRUEgPSAqckEgKyBFWFRTKERTXzBiMDApOwotIwlTVE9SRShFQSwgOCwgKnJTKTsKLSMJKnJBID0gRUE7Ci0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMTgxLDMxLi86WDo2NDo6U3RvcmUgRG91Ymxld29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCi0jCXVuc2lnbmVkX3dvcmQgRUE7Ci0jCWlmIChSQV9pc18wKQotIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCi0jCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0jCUVBID0gKnJBICsgKnJCOwotIwlTVE9SRShFQSwgOCwgKnJTKTsKLSMJKnJBID0gRUE7Ci0KLQotIwotIyBJLjMuMy40IEZpeGVkLVBvaW50IExvYWQgYW5kIFN0b3JlIHdpdGggQnl0ZSBSZXZlcnNhbCBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjc5MCwzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIEJ5dGUtUmV2ZXJzZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JKnJUID0gU1dBUF8yKE1FTSh1bnNpZ25lZCwgRUEsIDIpKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzNCwzMS4vOlg6OjpMb2FkIFdvcmQgQnl0ZS1SZXZlcnNlIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArICpyQjsKLQkqclQgPSBTV0FQXzQoTUVNKHVuc2lnbmVkLCBFQSwgNCkpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuOTE4LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCBCeXRlLVJldmVyc2VkIEluZGV4ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArICpyQjsKLQlTVE9SRShFQSwgMiwgU1dBUF8yKCpyUykpOwotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjY2MiwzMS4vOlg6OjpTdG9yZSBXb3JkIEJ5dGUtUmV2ZXJzZWQgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCVNUT1JFKEVBLCA0LCBTV0FQXzQoKnJTKSk7Ci0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOwotCi0KLSMKLSMgSS4zLjMuNSBGaXhlZC1Qb2ludCBMb2FkIGFuZCBTdG9yZSBNdWx0aXBsZSBJbnN0cmN0aW9ucwotIwotCi0wLjQ2LDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBNdWx0aXBsZSBXb3JkCi0JdW5zaWduZWRfd29yZCBFQTsKLQl1bnNpZ25lZF93b3JkIGI7Ci0JaW50IHI7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArIEVYVFMoRCk7Ci0JciA9IFJUOwotCWlmIChSQSA+PSByKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQgfHwgKEVBICUgNCAhPSAwKSkKLQkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKLQl3aGlsZSAociA8PSAzMSkgewotCSAgR1BSKHIpID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7Ci0JICByID0gciArIDE7Ci0JICBFQSA9IEVBICsgNDsKLQl9Ci0KLTAuNDcsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBNdWx0aXBsZSBXb3JkCi0JdW5zaWduZWRfd29yZCBFQTsKLQl1bnNpZ25lZF93b3JkIGI7Ci0JaW50IHI7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArIEVYVFMoRCk7Ci0JaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQKLQkgICAgfHwgKEVBICUgNCAhPSAwKSkKLQkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKLQlyID0gUlM7Ci0Jd2hpbGUgKHIgPD0gMzEpIHsKLQkgIFNUT1JFKEVBLCA0LCBHUFIocikpOwotCSAgciA9IHIgKyAxOwotCSAgRUEgPSBFQSArIDQ7Ci0JfQotCi0KLSMKLSMgSS4zLjMuNiBGaXhlZC1Qb2ludCBNb3ZlIEFzc2lzdCBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2LlJULDExLlJBLDE2Lk5CLDIxLjU5NywzMS4vOlg6OjpMb2FkIFN0cmluZyBXb3JkIEltbWVkaWF0ZQotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaW50IG47Ci0JaW50IHI7Ci0JaW50IGk7Ci0JaW50IG5yOwotCWlmIChSQV9pc18wKSBFQSA9IDA7Ci0JZWxzZSAgICAgICAgIEVBID0gKnJBOwotCWlmIChOQiA9PSAwKSBuID0gMzI7Ci0JZWxzZSAgICAgICAgIG4gPSBOQjsKLQlyID0gUlQgLSAxOwotCWkgPSAzMjsKLQluciA9IChuICsgMykgLyA0OwotCWlmICgoUlQgKyBuciA+PSAzMikKLQkgICAgPyAoUkEgPj0gUlQgfHwgUkEgPCAoUlQgKyBucikgJSAzMikKLQkgICAgOiAoUkEgPj0gUlQgJiYgUkEgPCBSVCArIG5yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCi0JICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JICBpZiAoaSA9PSAzMikgewotCSAgICByID0gKHIgKyAxKSAlIDMyOwotCSAgICBHUFIocikgPSAwOwotCSAgfQotCSAgR1BSKHIpIHw9IElOU0VSVEVEKE1FTSh1bnNpZ25lZCwgRUEsIDEpLCBpLCBpKzcpOwotCSAgaWYgKGkgPT0gNjQpIGkgPSAzMjsKLQkgIEVBID0gRUEgKyAxOwotCSAgbiA9IG4gLSAxOwotCX0KLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzMywzMS4vOlg6OjpMb2FkIFN0cmluZyBXb3JkIEluZGV4ZWQKLQl1bnNpZ25lZF93b3JkIEVBOwotCXVuc2lnbmVkX3dvcmQgYjsKLQlpbnQgbjsKLQlpbnQgcjsKLQlpbnQgaTsKLQlpbnQgbnI7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArICpyQjsKLQluID0gRVhUUkFDVEVEMzIoWEVSLCAyNSwgMzEpOwotCXIgPSBSVCAtIDE7Ci0JaSA9IDMyOwotCW5yID0gKG4gKyAzKSAvIDQ7Ci0JaWYgKCgoUlQgKyBuID49IDMyKQotCSAgICAgPyAoKFJBID49IFJUIHx8IFJBIDwgKFJUICsgbikgJSAzMikKLQkgICAgICAgIHx8IChSQiA+PSBSVCB8fCBSQiA8IChSVCArIG4pICUgMzIpKQotCSAgICAgOiAoKFJBID49IFJUICYmIFJBIDwgUlQgKyBuKQotCSAgICAgICAgfHwgKFJCID49IFJUICYmIFJCIDwgUlQgKyBuKSkpCi0JICAgIHx8IChSVCA9PSBSQSB8fCBSVCA9PSBSQikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQlpZiAoQ1VSUkVOVF9BTElHTk1FTlQgPT0gU1RSSUNUX0FMSUdOTUVOVCkKLQkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKLQl3aGlsZSAobiA+IDApIHsKLQkgIGlmIChpID09IDMyKSB7Ci0JICAgIHIgPSAociArIDEpICUgMzI7Ci0JICAgIEdQUihpKSA9IDA7Ci0JICB9Ci0JICBHUFIocikgfD0gSU5TRVJURUQoTUVNKHVuc2lnbmVkLCBFQSwgMSksIGksIGkrNyk7Ci0JICBpID0gaSArIDg7Ci0JICBpZiAoaSA9PSA2NCkgaSA9IDMyOwotCSAgRUEgPSBFQSArIDE7Ci0JICBuID0gbiAtIDE7Ci0JfQotCi0wLjMxLDYuUlMsMTEuUkEsMTYuTkIsMjEuNzI1LDMxLi86WDo6OlN0b3JlIFN0cmluZyBXb3JkIEltbWVkYXRlCi0JdW5zaWduZWRfd29yZCBFQTsKLQlpbnQgbjsKLQlpbnQgcjsKLQlpbnQgaTsKLQlpZiAoUkFfaXNfMCkgRUEgPSAwOwotCWVsc2UgICAgICAgICBFQSA9ICpyQTsKLQlpZiAoTkIgPT0gMCkgbiA9IDMyOwotCWVsc2UgICAgICAgICBuID0gTkI7Ci0JciA9IFJTIC0gMTsKLQlpID0gMzI7Ci0JaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCi0JICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JICBpZiAoaSA9PSAzMikgciA9IChyICsgMSkgJSAzMjsKLQkgIFNUT1JFKEVBLCAxLCBFWFRSQUNURUQoR1BSKHIpLCBpLCBpKzcpKTsKLQkgIGkgPSBpICsgODsKLQkgIGlmIChpID09IDY0KSBpID0gMzI7Ci0JICBFQSA9IEVBICsgMTsKLQkgIG4gPSBuIC0gMTsKLQl9Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS42NjEsMzEuLzpYOjo6U3RvcmUgU3RyaW5nIFdvcmQgSW5kZXhlZAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JdW5zaWduZWRfd29yZCBiOwotCWludCBuOwotCWludCByOwotCWludCBpOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCi0JICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7Ci0JbiA9IEVYVFJBQ1RFRDMyKFhFUiwgMjUsIDMxKTsKLQlyID0gUlMgLSAxOwotCWkgPSAzMjsKLQl3aGlsZSAobiA+IDApIHsKLQkgIGlmIChpID09IDMyKSByID0gKHIgKyAxKSAlIDMyOwotCSAgU1RPUkUoRUEsIDEsIEVYVFJBQ1RFRChHUFIociksIGksIGkrNykpOwotCSAgaSA9IGkgKyA4OwotCSAgaWYgKGkgPT0gNjQpIGkgPSAzMjsKLQkgIEVBID0gRUEgKyAxOwotCSAgbiA9IG4gLSAxOwotCX0KLQotCi0jCi0jIEkuMy4zLjcgU3RvcmFnZSBTeW5jaHJvbml6YXRpb24gSW5zdHJ1Y3Rpb25zCi0jCi0jIEhBQ0s6IFJhdGhlciB0aGFuIG1vbml0b3IgYWRkcmVzc2VzIGxvb2tpbmcgZm9yIGEgcmVhc29uCi0jICAgICAgIHRvIGNhbmNlbCBhIHJlc2VydmF0aW9uLiAgVGhpcyBjb2RlIGluc3RlYWQga2VlcHMKLSMJYSBjb3B5IG9mIHRoZSBkYXRhIHJlYWQgZnJvbSBtZW1vcnkuICBCZWZvcmUgcGVyZm9ybWluZwotIwlhIHN0b3JlLCB0aGUgbWVtb3J5IGFyZWEgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaGFzCi0jCWJlZW4gY2hhbmdlZC4KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMCwzMS4vOlg6OjpMb2FkIFdvcmQgQW5kIFJlc2VydmUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAyLCAgMiwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCVJFU0VSVkUgPSAxOwotCVJFU0VSVkVfQUREUiA9IHJlYWxfYWRkcihFQSwgMS8qaXMtcmVhZD8qLyk7Ci0JUkVTRVJWRV9EQVRBID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7Ci0JKnJUID0gUkVTRVJWRV9EQVRBOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuODQsMzEuLzpYOjY0OjpMb2FkIERvdWJsZXdvcmQgQW5kIFJlc2VydmUgSW5kZXhlZAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JUkVTRVJWRSA9IDE7Ci0JUkVTRVJWRV9BRERSID0gcmVhbF9hZGRyKEVBLCAxLyppcy1yZWFkPyovKTsKLQlSRVNFUlZFX0RBVEEgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKLQkqclQgPSBSRVNFUlZFX0RBVEE7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4xNTAsMzEuMTpYOjo6U3RvcmUgV29yZCBDb25kaXRpb25hbCBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICA4LCAgOCwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgOCwgIDgsICAwCi0qNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JaWYgKFJFU0VSVkUpIHsKLQkgIGlmIChSRVNFUlZFX0FERFIgPT0gcmVhbF9hZGRyKEVBLCAwLyppcy1yZWFkPyovKQotCSAgICAgICYmIC8qSEFDSyovIFJFU0VSVkVfREFUQSA9PSBNRU0odW5zaWduZWQsIEVBLCA0KSkgewotCSAgICBTVE9SRShFQSwgNCwgKnJTKTsKLQkgICAgQ1JfU0VUX1hFUl9TTygwLCBjcl9pX3plcm8pOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIG1lbnQgdG8gcmFuZG9tbHkgdG8gc3RvcmUsIHdlIG5ldmVyIGRvISAqLwkKLQkgICAgQ1JfU0VUX1hFUl9TTygwLCAwKTsKLQkgIH0KLQkgIFJFU0VSVkUgPSAwOwotCX0KLQllbHNlIHsKLQkgIENSX1NFVF9YRVJfU08oMCwgMCk7Ci0JfQotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAxLypSYyovKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjIxNCwzMS4xOlg6NjQ6OlN0b3JlIERvdWJsZXdvcmQgQ29uZGl0aW9uYWwgSW5kZXhlZAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JaWYgKFJFU0VSVkUpIHsKLQkgIGlmIChSRVNFUlZFX0FERFIgPT0gcmVhbF9hZGRyKEVBLCAwLyppcy1yZWFkPyovKQotCSAgICAgICYmIC8qSEFDSyovIFJFU0VSVkVfREFUQSA9PSBNRU0odW5zaWduZWQsIEVBLCA4KSkgewotCSAgICBTVE9SRShFQSwgOCwgKnJTKTsKLQkgICAgQ1JfU0VUX1hFUl9TTygwLCBjcl9pX3plcm8pOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIG1lbnQgdG8gcmFuZG9tbHkgdG8gc3RvcmUsIHdlIG5ldmVyIGRvICovCQotCSAgICBDUl9TRVRfWEVSX1NPKDAsIDApOwotCSAgfQotCSAgUkVTRVJWRSA9IDA7Ci0JfQotCWVsc2UgewotCSAgQ1JfU0VUX1hFUl9TTygwLCAwKTsKLQl9Ci0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDEvKlJjKi8pOwotCi0wLjMxLDYuLywxMS4vLDE2Li8sMjEuNTk4LDMxLi86WDo6c3luYzpTeW5jaHJvbml6ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMSwgIDAKLQkvKiBkbyBub3RoaW5nICovCi0KLQotIwotIyBJLjMuMy45IEZpeGVkLVBvaW50IEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuMTQsNi5SVCwxMS5SQSwxNi5TSTpEOjo6QWRkIEltbWVkaWF0ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlpZiAoUkFfaXNfMCkJKnJUID0gRVhUUyhTSSk7Ci0JZWxzZQkJKnJUID0gKnJBICsgRVhUUyhTSSk7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyVCwgKGxvbmcpKnJUKSk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKLQotMC4xNSw2LlJULDExLlJBLDE2LlNJOkQ6OjpBZGQgSW1tZWRpYXRlIFNoaWZ0ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaWYgKFJBX2lzXzApCSpyVCA9IEVYVFMoU0kpIDw8IDE2OwotCWVsc2UJCSpyVCA9ICpyQSArIChFWFRTKFNJKSA8PCAxNik7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyVCwgKGxvbmcpKnJUKSk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjI2NiwzMS5SYzpYTzo6OkFkZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlBTFVfQkVHSU4oKnJBKTsKLQlBTFVfQUREKCpyQik7Ci0JQUxVX0VORCgqclQsIDAvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi40MCwzMS5SYzpYTzo6OlN1YnRyYWN0IEZyb20KLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JQUxVX0JFR0lOKCpyQSk7Ci0JQUxVX05PVDsKLQlBTFVfQUREKCpyQik7Ci0JQUxVX0FERCgxKTsKLQlBTFVfRU5EKCpyVCwgMC8qQ0EqLywgT0UsIFJjKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4xMiw2LlJULDExLlJBLDE2LlNJOkQ6OjpBZGQgSW1tZWRpYXRlIENhcnJ5aW5nCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCUFMVV9CRUdJTigqckEpOwotCUFMVV9BREQoRVhUUyhTSSkpOwotCUFMVV9FTkQoKnJULCAxLypDQSovLCAwLypPRSovLCAwLypSYyovKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgMC8qUmMqLyk7Ci0KLTAuMTMsNi5SVCwxMS5SQSwxNi5TSTpEOjo6QWRkIEltbWVkaWF0ZSBDYXJyeWluZyBhbmQgUmVjb3JkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCUFMVV9CRUdJTigqckEpOwotCUFMVV9BREQoRVhUUyhTSSkpOwotCUFMVV9FTkQoKnJULCAxLypDQSovLCAwLypPRSovLCAxLypSYyovKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgMS8qUmMqLyk7Ci0KLTAuOCw2LlJULDExLlJBLDE2LlNJOkQ6OjpTdWJ0cmFjdCBGcm9tIEltbWVkaWF0ZSBDYXJyeWluZwotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlBTFVfQkVHSU4oKnJBKTsKLQlBTFVfTk9UOwotCUFMVV9BREQoRVhUUyhTSSkpOwotCUFMVV9BREQoMSk7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIDAvKk9FKi8sIDAvKlJjKi8pOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwLypSYyovKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjEwLDMxLlJjOlhPOjo6QWRkIENhcnJ5aW5nCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCUFMVV9CRUdJTigqckEpOwotCUFMVV9BREQoKnJCKTsKLQlBTFVfRU5EKCpyVCwgMS8qQ0EqLywgT0UsIFJjKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjgsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIENhcnJ5aW5nCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCS8qIFJUIDwtIH5SQSArIFJCICsgMSA9PT0gUlQgPC0gUkIgLSBSQSAqLwotCUFMVV9CRUdJTigqckEpOwotCUFMVV9OT1Q7Ci0JQUxVX0FERCgqckIpOwotCUFMVV9BREQoMSk7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi4xMzgsMzEuUmM6WE86OjpBZGQgRXh0ZW5kZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JQUxVX0JFR0lOKCpyQSk7Ci0JQUxVX0FERCgqckIpOwotCUFMVV9BRERfQ0E7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi4xMzYsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIEV4dGVuZGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCUFMVV9CRUdJTigqckEpOwotCUFMVV9OT1Q7Ci0JQUxVX0FERCgqckIpOwotCUFMVV9BRERfQ0E7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi4vLDIxLk9FLDIyLjIzNCwzMS5SYzpYTzo6OkFkZCB0byBNaW51cyBPbmUgRXh0ZW5kZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JQUxVX0JFR0lOKCpyQSk7Ci0JQUxVX0FERF9DQTsKLQlBTFVfQUREKC0xKTsKLQlBTFVfRU5EKCpyVCwgMS8qQ0EqLywgT0UsIFJjKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuLywyMS5PRSwyMi4yMzIsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIE1pbnVzIE9uZSBFeHRlbmRlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlBTFVfQkVHSU4oKnJBKTsKLQlBTFVfTk9UOwotCUFMVV9BRERfQ0E7Ci0JQUxVX0FERCgtMSk7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJULDExLlJBLDE2Li8sMjEuT0UsMjIuMjAyLDMxLlJjOlhPOjphZGR6ZTpBZGQgdG8gWmVybyBFeHRlbmRlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlBTFVfQkVHSU4oKnJBKTsKLQlBTFVfQUREX0NBOwotCUFMVV9FTkQoKnJULCAxLypDQSovLCBPRSwgUmMpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SVCwxMS5SQSwxNi4vLDIxLk9FLDIyLjIwMCwzMS5SYzpYTzo6OlN1YnRyYWN0IGZyb20gWmVybyBFeHRlbmRlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlBTFVfQkVHSU4oKnJBKTsKLQlBTFVfTk9UOwotCUFMVV9BRERfQ0E7Ci0JQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7Ci0JUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJULDExLlJBLDE2Li8sMjEuT0UsMjIuMTA0LDMxLlJjOlhPOjo6TmVnYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCUFMVV9CRUdJTigqckEpOwotCUFMVV9OT1Q7Ci0JQUxVX0FERCgxKTsKLQlBTFVfRU5EKCpyVCwwLypDQSovLE9FLFJjKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgUmMpOwotCi0wLjcsNi5SVCwxMS5SQSwxNi5TSTpEOjptdWxsaTpNdWx0aXBseSBMb3cgSW1tZWRpYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDMsICAzLCAgMAotCXNpZ25lZF93b3JkIHByb2QgPSAqckEgKiBFWFRTKFNJKTsKLQkqclQgPSBwcm9kOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwLypSYyovKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjIzMywzMS5SYzpEOjY0OjpNdWx0aXBseSBMb3cgRG91Ymxld29yZAotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuT0UsMjIuMjM1LDMxLlJjOlhPOjptdWxsdzpNdWx0aXBseSBMb3cgV29yZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA1LCAgNSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgNSwgIDUsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAotKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICA0LCAgNCwgIDAKLQlzaWduZWQ2NCBhID0gKHNpZ25lZDMyKSgqckEpOwotCXNpZ25lZDY0IGIgPSAoc2lnbmVkMzIpKCpyQik7Ci0Jc2lnbmVkNjQgcHJvZCA9IGEgKiBiOwotCXNpZ25lZF93b3JkIHQgPSBwcm9kOwotCSpyVCA9ICpyQSAqICpyQjsKLQlpZiAodCAhPSBwcm9kICYmIE9FKQotCSAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7Ci0JQ1IwX0NPTVBBUkUodCwgMCwgUmMpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuLywyMi43MywzMS5SYzpYTzo2NDo6TXVsdGlwbHkgSGlnaCBEb3VibGV3b3JkCi0KLTAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4vLDIyLjc1LDMxLlJjOlhPOjptdWxodzpNdWx0aXBseSBIaWdoIFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgNSwgIDUsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA1LCAgNSwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgNCwgIDQsICAwCi0Jc2lnbmVkNjQgYSA9IChzaWduZWQzMikoKnJBKTsKLQlzaWduZWQ2NCBiID0gKHNpZ25lZDMyKSgqckIpOwotCXNpZ25lZDY0IHByb2QgPSBhICogYjsKLQlzaWduZWRfd29yZCB0ID0gRVhUUkFDVEVENjQocHJvZCwgMCwgMzEpOwotCSpyVCA9IHQ7Ci0JQ1IwX0NPTVBBUkUodCwgMCwgUmMpOwotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuLywyMi45LDMxLlJjOlhPOjY0OjpNdWx0aXBseSBIaWdoIERvdWJsZXdvcmQgVW5zaWduZWQKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLi8sMjIuMTEsMzEuUmM6WE86Om11bGh3dTpNdWx0aXBseSBIaWdoIFdvcmQgVW5zaWduZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMTAsIDEwLCAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDYsICA2LCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA2LCAgNiwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgNCwgIDQsICAwCi0JdW5zaWduZWQ2NCBhID0gKHVuc2lnbmVkMzIpKCpyQSk7Ci0JdW5zaWduZWQ2NCBiID0gKHVuc2lnbmVkMzIpKCpyQik7Ci0JdW5zaWduZWQ2NCBwcm9kID0gYSAqIGI7Ci0Jc2lnbmVkX3dvcmQgdCA9IEVYVFJBQ1RFRDY0KHByb2QsIDAsIDMxKTsKLQkqclQgPSB0OwotCUNSMF9DT01QQVJFKHQsIDAsIFJjKTsKLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ4OSwzMS5SYzpYTzo2NDo6RGl2aWRlIERvdWJsZXdvcmQKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ5MSwzMS5SYzpYTzo6ZGl2dzpEaXZpZGUgV29yZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzNiwgMzYsIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMzcsIDM3LCAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDM3LCAzNywgMAotKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAyMCwgMjAsIDAKLQlzaWduZWQ2NCBkaXZpZGVuZCA9IChzaWduZWQzMikoKnJBKTsKLQlzaWduZWQ2NCBkaXZpc29yID0gKHNpZ25lZDMyKSgqckIpOwotCWlmIChkaXZpc29yID09IDAgLyogbmIgMHg4MDAwLi4wIGlzIHNpZ24gZXh0ZW5kZWQgKi8KLQkgICAgfHwgKGRpdmlkZW5kID09IDB4ODAwMDAwMDAgJiYgZGl2aXNvciA9PSAtMSkpIHsKLQkgIGlmIChPRSkKLQkgICAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7Ci0JICBDUjBfQ09NUEFSRSgwLCAwLCBSYyk7Ci0JfQotCWVsc2UgewotCSAgc2lnbmVkNjQgcXVvdGVudCA9IGRpdmlkZW5kIC8gZGl2aXNvcjsKLQkgICpyVCA9IHF1b3RlbnQ7Ci0JICBDUjBfQ09NUEFSRSgoc2lnbmVkX3dvcmQpcXVvdGVudCwgMCwgUmMpOwotCX0KLQlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ1NywzMS5SYzpYTzo2NDo6RGl2aWRlIERvdWJsZXdvcmQgVW5zaWduZWQKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ1OSwzMS5SYzpYTzo6ZGl2d3U6RGl2aWRlIFdvcmQgVW5zaWduZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMzYsIDM2LCAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDM3LCAzNywgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzNywgMzcsIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMjAsIDIwLCAwCi0JdW5zaWduZWQ2NCBkaXZpZGVuZCA9ICh1bnNpZ25lZDMyKSgqckEpOwotCXVuc2lnbmVkNjQgZGl2aXNvciA9ICh1bnNpZ25lZDMyKSgqckIpOwotCWlmIChkaXZpc29yID09IDApIHsKLQkgIGlmIChPRSkKLQkgICAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7Ci0JICBDUjBfQ09NUEFSRSgwLCAwLCBSYyk7Ci0JfQotCWVsc2UgewotCSAgdW5zaWduZWQ2NCBxdW90ZW50ID0gZGl2aWRlbmQgLyBkaXZpc29yOwotCSAgKnJUID0gcXVvdGVudDsKLQkgIENSMF9DT01QQVJFKChzaWduZWRfd29yZClxdW90ZW50LCAwLCBSYyk7Ci0JfQotCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0KLSMKLSMgSS4zLjMuMTAgRml4ZWQtUG9pbnQgQ29tcGFyZSBJbnN0cnVjdGlvbnMKLSMKLQotMC4xMSw2LkJGLDkuLywxMC5MLDExLlJBLDE2LlNJOkQ6OjpDb21wYXJlIEltbWVkaWF0ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlpZiAoIWlzXzY0Yml0X21vZGUgJiYgTCkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICBzaWduZWRfd29yZCBhOwotCSAgc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOwotCSAgaWYgKEwgPT0gMCkKLQkgICAgYSA9IEVYVEVOREVEKCpyQSk7Ci0JICBlbHNlCi0JICAgIGEgPSAqckE7Ci0JICBDUl9DT01QQVJFKEJGLCBhLCBiKTsKLQl9Ci0JUFBDX0lOU05fSU5UX0NSKDAsIFJBX0JJVE1BU0ssIEJGX0JJVE1BU0spOwotCi0wLjMxLDYuQkYsOS4vLDEwLkwsMTEuUkEsMTYuUkIsMjEuMCwzMS4vOlg6OjpDb21wYXJlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCWlmICghaXNfNjRiaXRfbW9kZSAmJiBMKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQllbHNlIHsKLQkgIHNpZ25lZF93b3JkIGE7Ci0JICBzaWduZWRfd29yZCBiOwotCSAgaWYgKEwgPT0gMCkgewotCSAgICBhID0gRVhURU5ERUQoKnJBKTsKLQkgICAgYiA9IEVYVEVOREVEKCpyQik7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgYSA9ICpyQTsKLQkgICAgYiA9ICpyQjsKLQkgIH0KLQkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOwotCX0KLQlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOwotCi0wLjEwLDYuQkYsOS4vLDEwLkwsMTEuUkEsMTYuVUk6RDo6OkNvbXBhcmUgTG9naWNhbCBJbW1lZGlhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaWYgKCFpc182NGJpdF9tb2RlICYmIEwpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgewotCSAgdW5zaWduZWRfd29yZCBhOwotCSAgdW5zaWduZWRfd29yZCBiID0gVUk7Ci0JICBpZiAoTCA9PSAwKQotCSAgICBhID0gTUFTS0VEKCpyQSwgMzIsIDYzKTsKLQkgIGVsc2UKLQkgICAgYSA9ICpyQTsKLQkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOwotCX0KLQlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSywgQkZfQklUTUFTSyk7Ci0KLTAuMzEsNi5CRiw5Li8sMTAuTCwxMS5SQSwxNi5SQiwyMS4zMiwzMS4vOlg6OjpDb21wYXJlIExvZ2ljYWwKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaWYgKCFpc182NGJpdF9tb2RlICYmIEwpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgewotCSAgdW5zaWduZWRfd29yZCBhOwotCSAgdW5zaWduZWRfd29yZCBiOwotCSAgaWYgKEwgPT0gMCkgewotCSAgICBhID0gTUFTS0VEKCpyQSwgMzIsIDYzKTsKLQkgICAgYiA9IE1BU0tFRCgqckIsIDMyLCA2Myk7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgYSA9ICpyQTsKLQkgICAgYiA9ICpyQjsKLQkgIH0KLQkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOwotCX0KLQlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOwotCi0KLSMKLSMgSS4zLjMuMTEgRml4ZWQtUG9pbnQgVHJhcCBJbnN0cnVjdGlvbnMKLSMKLQotMC4yLDYuVE8sMTEuUkEsMTYuU0k6RDo2NDo6VHJhcCBEb3VibGV3b3JkIEltbWVkaWF0ZQotCWlmICghaXNfNjRiaXRfbW9kZSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICBzaWduZWRfd29yZCBhID0gKnJBOwotCSAgc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOwotCSAgaWYgKChhIDwgYiAmJiBUT3swfSkKLQkgICAgICB8fCAoYSA+IGIgJiYgVE97MX0pCi0JICAgICAgfHwgKGEgPT0gYiAmJiBUT3syfSkKLQkgICAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA8ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97M30pCi0JICAgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPiAodW5zaWduZWRfd29yZCliICYmIFRPezR9KQotCSAgICAgICkKLQkgICAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgIHRyYXBfcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCX0KLQotMC4zLDYuVE8sMTEuUkEsMTYuU0k6RDo6OlRyYXAgV29yZCBJbW1lZGlhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAyLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0Jc2lnbmVkX3dvcmQgYSA9IEVYVEVOREVEKCpyQSk7Ci0Jc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOwotCWlmICgoYSA8IGIgJiYgVE97MH0pCi0JICAgIHx8IChhID4gYiAmJiBUT3sxfSkKLQkgICAgfHwgKGEgPT0gYiAmJiBUT3syfSkKLQkgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPCAodW5zaWduZWRfd29yZCliICYmIFRPezN9KQotCSAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA+ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97NH0pCi0JICAgICkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgdHJhcF9wcm9ncmFtX2ludGVycnVwdCk7Ci0KLTAuMzEsNi5UTywxMS5SQSwxNi5SQiwyMS42OCwzMS4vOlg6NjQ6OlRyYXAgRG91Ymxld29yZAotCWlmICghaXNfNjRiaXRfbW9kZSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICBzaWduZWRfd29yZCBhID0gKnJBOwotCSAgc2lnbmVkX3dvcmQgYiA9ICpyQjsKLQkgIGlmICgoYSA8IGIgJiYgVE97MH0pCi0JICAgICAgfHwgKGEgPiBiICYmIFRPezF9KQotCSAgICAgIHx8IChhID09IGIgJiYgVE97Mn0pCi0JICAgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPCAodW5zaWduZWRfd29yZCliICYmIFRPezN9KQotCSAgICAgIHx8ICgodW5zaWduZWRfd29yZClhID4gKHVuc2lnbmVkX3dvcmQpYiAmJiBUT3s0fSkKLQkgICAgICApCi0JICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICB0cmFwX3Byb2dyYW1faW50ZXJydXB0KTsKLQl9Ci0KLTAuMzEsNi5UTywxMS5SQSwxNi5SQiwyMS40LDMxLi86WDo6OlRyYXAgV29yZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQlzaWduZWRfd29yZCBhID0gRVhURU5ERUQoKnJBKTsKLQlzaWduZWRfd29yZCBiID0gRVhURU5ERUQoKnJCKTsKLQlpZiAoVE8gPT0gMTIgJiYgckEgPT0gckIpIHsKLQkgIElUUkFDRSh0cmFjZV9icmVha3BvaW50LCAoImJyZWFrcG9pbnRcbiIpKTsKLQkgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfdHJhcCwgMCk7Ci0JfQotCWVsc2UgaWYgKChhIDwgYiAmJiBUT3swfSkKLQkgICAgfHwgKGEgPiBiICYmIFRPezF9KQotCSAgICB8fCAoYSA9PSBiICYmIFRPezJ9KQotCSAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA8ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97M30pCi0JICAgIHx8ICgodW5zaWduZWRfd29yZClhID4gKHVuc2lnbmVkX3dvcmQpYiAmJiBUT3s0fSkKLQkgICAgKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICB0cmFwX3Byb2dyYW1faW50ZXJydXB0KTsKLQotIwotIyBJLjMuMy4xMiBGaXhlZC1Qb2ludCBMb2dpY2FsIEluc3RydWN0aW9ucwotIwotCi0wLjI4LDYuUlMsMTEuUkEsMTYuVUk6RDo6OkFORCBJbW1lZGlhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JKnJBID0gKnJTICYgVUk7Ci0JQ1IwX0NPTVBBUkUoKnJBLCAwLCAxLypSYyovKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMS8qUmMqLyk7Ci0KLTAuMjksNi5SUywxMS5SQSwxNi5VSTpEOjo6QU5EIEltbWVkaWF0ZSBTaGlmdGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9ICpyUyAmIChVSSA8PCAxNik7Ci0JQ1IwX0NPTVBBUkUoKnJBLCAwLCAxLypSYyovKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMS8qUmMqLyk7Ci0KLTAuMjQsNi5SUywxMS5SQSwxNi5VSTpEOjo6T1IgSW1tZWRpYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9ICpyUyB8IFVJOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKLQotMC4yNSw2LlJTLDExLlJBLDE2LlVJOkQ6OjpPUiBJbW1lZGlhdGUgU2hpZnRlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQkqckEgPSAqclMgfCAoVUkgPDwgMTYpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKLQotMC4yNiw2LlJTLDExLlJBLDE2LlVJOkQ6OjpYT1IgSW1tZWRpYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9ICpyUyBeIFVJOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKLQotMC4yNyw2LlJTLDExLlJBLDE2LlVJOkQ6OjpYT1IgSW1tZWRpYXRlIFNoaWZ0ZWQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JKnJBID0gKnJTIF4gKFVJIDw8IDE2KTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMC8qUmMqLyk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yOCwzMS5SYzpYOjo6QU5ECi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9ICpyUyAmICpyQjsKLQlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjQ0NCwzMS5SYzpYOjo6T1IKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JKnJBID0gKnJTIHwgKnJCOwotCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMzE2LDMxLlJjOlg6OjpYT1IKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JKnJBID0gKnJTIF4gKnJCOwotCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDc2LDMxLlJjOlg6OjpOQU5ECi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9IH4oKnJTICYgKnJCKTsKLQlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjEyNCwzMS5SYzpYOjo6Tk9SCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9IH4oKnJTIHwgKnJCKTsKLQlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjI4NCwzMS5SYzpYOjo6RXF1aXZhbGVudAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQkqckEgPSB+KCpyUyBeICpyQik7IC8qIEEgPT09IEIgKi8KLQlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjYwLDMxLlJjOlg6OjpBTkQgd2l0aCBDb21wbGVtZW50Ci0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCSpyQSA9ICpyUyAmIH4qckI7Ci0JQ1IwX0NPTVBBUkUoKnJBLCAwLCBSYyk7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7Ci0JUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS40MTIsMzEuUmM6WDo6Ok9SIHdpdGggQ29tcGxlbWVudAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQkqckEgPSAqclMgfCB+KnJCOwotCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuLywyMS45NTQsMzEuUmM6WDo6ZXh0c2I6RXh0ZW5kIFNpZ24gQnl0ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKLQkqckEgPSAoc2lnbmVkX3dvcmQpKHNpZ25lZDgpKnJTOwotCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi4vLDIxLjkyMiwzMS5SYzpYOjpleHRzaDpFeHRlbmQgU2lnbiBIYWxmIFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JKnJBID0gKHNpZ25lZF93b3JkKShzaWduZWQxNikqclM7Ci0JQ1IwX0NPTVBBUkUoKnJBLCAwLCBSYyk7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7Ci0JUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2Li8sMjEuOTg2LDMxLlJjOlg6NjQ6OkV4dGVuZCBTaWduIFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0jCSpyQSA9IChzaWduZWRfd29yZCkoc2lnbmVkMzIpKnJTOwotIwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2Li8sMjEuNTgsMzEuUmM6WDo2NDo6Q291bnQgTGVhZGluZyBaZXJvcyBEb3VibGV3b3JkCi0jCWludCBjb3VudCA9IDA7Ci0jCXVuc2lnbmVkNjQgbWFzayA9IEJJVDY0KDApOwotIwl1bnNpZ25lZDY0IHNvdXJjZSA9ICpyUzsKLSMJd2hpbGUgKCEoc291cmNlICYgbWFzaykgJiYgbWFzayAhPSAwKSB7Ci0jCSAgbWFzayA+Pj0gMTsKLSMJICBjb3VudCsrOwotIwl9Ci0jCSpyQSA9IGNvdW50OwotIwlDUjBfQ09NUEFSRShjb3VudCwgMCwgUmMpOyAvKiBGSVhNRSAtIGlzIHRoaXMgY29ycmVjdCAqLwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuLywyMS4yNiwzMS5SYzpYOjo6Q291bnQgTGVhZGluZyBaZXJvcyBXb3JkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQzMiBtYXNrID0gQklUMzIoMCk7Ci0JdW5zaWduZWQzMiBzb3VyY2UgPSAqclM7Ci0Jd2hpbGUgKCEoc291cmNlICYgbWFzaykgJiYgbWFzayAhPSAwKSB7Ci0JICBtYXNrID4+PSAxOwotCSAgY291bnQrKzsKLQl9Ci0JKnJBID0gY291bnQ7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7Ci0JQ1IwX0NPTVBBUkUoY291bnQsIDAsIFJjKTsgLyogRklYTUUgLSBpcyB0aGlzIGNvcnJlY3QgKi8KLQotCi0jCi0jIEkuMy4zLjEzIEZpeGVkLVBvaW50IFJvdGF0ZSBhbmQgU2hpZnQgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMCwzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIENsZWFyIExlZnQKLSMJbG9uZyBuID0gKHNoXzUgPDwgNCkgfCBzaF8wXzQ7Ci0jCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOwotIwlsb25nIGIgPSAobWJfNSA8PCA0KSB8IG1iXzBfNDsKLSMJdW5zaWduZWRfd29yZCBtID0gTUFTSyhiLCA2Myk7Ci0jCXNpZ25lZF93b3JkIHJlc3VsdCA9IHIgJiBtOwotIwkqckEgPSByZXN1bHQ7Ci0jCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOwotIwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsgLyogRklYTUUgLSBpcyB0aGlzIGNvcnJlY3QgKi8KLQotMC4zMCw2LlJTLDExLlJBLDE2LnNoXzBfNCwyMS5tZSwyNy4xLDMwLnNoXzUsMzEuUmM6TUQ6NjQ6OlJvdGF0ZSBMZWZ0IERvdWJsZXdvcmQgSW1tZWRpYXRlIHRoZW4gQ2xlYXIgUmlnaHQKLSMJbG9uZyBuID0gKHNoXzUgPDwgNCkgfCBzaF8wXzQ7Ci0jCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOwotIwlsb25nIGUgPSAobWVfNSA8PCA0KSB8IG1lXzBfNDsKLSMJdW5zaWduZWRfd29yZCBtID0gTUFTSygwLCBlKTsKLSMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07Ci0jCSpyQSA9IHJlc3VsdDsKLSMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7IC8qIEZJWE1FIC0gaXMgdGhpcyBjb3JyZWN0ICovCi0KLTAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMiwzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIENsZWFyCi0jCWxvbmcgbiA9IChzaF81IDw8IDQpIHwgc2hfMF80OwotIwl1bnNpZ25lZF93b3JkIHIgPSBST1RMNjQoKnJTLCBuKTsKLSMJbG9uZyBiID0gKG1iXzUgPDwgNCkgfCBtYl8wXzQ7Ci0jCXVuc2lnbmVkX3dvcmQgbSA9IE1BU0soMCwgKDY0LW4pKTsKLSMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07Ci0jCSpyQSA9IHJlc3VsdDsKLSMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7IC8qIEZJWE1FIC0gaXMgdGhpcyBjb3JyZWN0ICovCi0KLTAuMjEsNi5SUywxMS5SQSwxNi5TSCwyMS5NQiwyNi5NRSwzMS5SYzpNOjo6Um90YXRlIExlZnQgV29yZCBJbW1lZGlhdGUgdGhlbiBBTkQgd2l0aCBNYXNrCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCWxvbmcgbiA9IFNIOwotCXVuc2lnbmVkMzIgcyA9ICpyUzsKLQl1bnNpZ25lZDMyIHIgPSBST1RMMzIocywgbik7Ci0JdW5zaWduZWQzMiBtID0gTUFTSyhNQiszMiwgTUUrMzIpOwotCXNpZ25lZF93b3JkIHJlc3VsdCA9IHIgJiBtOwotCSpyQSA9IHJlc3VsdDsKLQlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LAotCSAgICAgICAoIm49JWxkLCBzPTB4JWx4LCByPTB4JWx4LCBtPTB4JWx4LCByZXN1bHQ9MHglbHgsIGNyPTB4JWx4XG4iLAotCSAgICAgICAgbiwgKHVuc2lnbmVkIGxvbmcpcywgKHVuc2lnbmVkIGxvbmcpciwgKHVuc2lnbmVkIGxvbmcpbSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVzdWx0LCAodW5zaWduZWQgbG9uZylDUikpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7Ci0KLTAuMzAsNi5SUywxMS5SQSwxNi5SQiwyMS5tYiwyNy44LDMxLlJjOk1EUzo2NDo6Um90YXRlIExlZnQgRG91Ymxld29yZCB0aGVuIENsZWFyIExlZnQKLSMJbG9uZyBuID0gTUFTS0VEKCpyQiwgNTgsIDYzKTsKLSMJdW5zaWduZWRfd29yZCByID0gUk9UTDY0KCpyUywgbik7Ci0jCWxvbmcgYiA9IChtYl81IDw8IDQpIHwgbWJfMF80OwotIwl1bnNpZ25lZF93b3JkIG0gPSBNQVNLKGIsIDYzKTsKLSMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07Ci0jCSpyQSA9IHJlc3VsdDsKLSMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7Ci0KLTAuMzAsNi5SUywxMS5SQSwxNi5SQiwyMS5tZSwyNy45LDMxLlJjOk1EUzo2NDo6Um90YXRlIExlZnQgRG91Ymxld29yZCB0aGVuIENsZWFyIFJpZ2h0Ci0jCWxvbmcgbiA9IE1BU0tFRCgqckIsIDU4LCA2Myk7Ci0jCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOwotIwlsb25nIGUgPSAobWVfNSA8PCA0KSB8IG1lXzBfNDsKLSMJdW5zaWduZWRfd29yZCBtID0gTUFTSygwLCBlKTsKLSMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07Ci0jCSpyQSA9IHJlc3VsdDsKLSMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7Ci0KLTAuMjMsNi5SUywxMS5SQSwxNi5SQiwyMS5NQiwyNi5NRSwzMS5SYzpNOjo6Um90YXRlIExlZnQgV29yZCB0aGVuIEFORCB3aXRoIE1hc2sKLQlsb25nIG4gPSBNQVNLRUQoKnJCLCA1OSwgNjMpOwotCXVuc2lnbmVkMzIgciA9IFJPVEwzMigqclMsIG4pOwotCXVuc2lnbmVkMzIgbSA9IE1BU0soTUIrMzIsIE1FKzMyKTsKLQlzaWduZWRfd29yZCByZXN1bHQgPSByICYgbTsKLQkqckEgPSByZXN1bHQ7Ci0JQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7Ci0KLTAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMywzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIE1hc2sgSW5zZXJ0Ci0jCWxvbmcgbiA9IChzaF81IDw8IDQpIHwgc2hfMF80OwotIwl1bnNpZ25lZF93b3JkIHIgPSBST1RMNjQoKnJTLCBuKTsKLSMJbG9uZyBiID0gKG1iXzUgPDwgNCkgfCBtYl8wXzQ7Ci0jCXVuc2lnbmVkX3dvcmQgbSA9IE1BU0soYiwgKDY0LW4pKTsKLSMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gKHIgJiBtKSB8ICgqckEgJiB+bSkKLSMJKnJBID0gcmVzdWx0OwotIwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKLQotMC4yMCw2LlJTLDExLlJBLDE2LlNILDIxLk1CLDI2Lk1FLDMxLlJjOk06OnJsd2ltaTpSb3RhdGUgTGVmdCBXb3JkIEltbWVkaWF0ZSB0aGVuIE1hc2sgSW5zZXJ0Ci0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCWxvbmcgbiA9IFNIOwotCXVuc2lnbmVkMzIgciA9IFJPVEwzMigqclMsIG4pOwotCXVuc2lnbmVkMzIgbSA9IE1BU0soTUIrMzIsIE1FKzMyKTsKLQlzaWduZWRfd29yZCByZXN1bHQgPSAociAmIG0pIHwgKCpyQSAmIH5tKTsKLQkqckEgPSByZXN1bHQ7Ci0JSVRSQUNFKHRyYWNlX2FsdSwgKCI6IG49JWxkICpyUz0weCVseCByPTB4JWx4IG09MHglbHggcmVzdWx0PTB4JWx4XG4iLAotCSAgICAgICAgICAgICAgICAgICBuLCAodW5zaWduZWQgbG9uZykqclMsICh1bnNpZ25lZCBsb25nKXIsICh1bnNpZ25lZCBsb25nKW0sCi0JCQkgICAodW5zaWduZWQgbG9uZylyZXN1bHQpKTsKLQlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgUmMpOwotCi0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yNywzMS5SYzpYOjY0OjpTaGlmdCBMZWZ0IERvdWJsZXdvcmQKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjI0LDMxLlJjOlg6OjpTaGlmdCBMZWZ0IFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaW50IG4gPSBNQVNLRUQoKnJCLCA1OCwgNjMpOwotCXVuc2lnbmVkMzIgc291cmNlID0gKnJTOwotCXNpZ25lZF93b3JkIHNoaWZ0ZWQ7Ci0JaWYgKG4gPCAzMikKLQkgIHNoaWZ0ZWQgPSAoc291cmNlIDw8IG4pOwotCWVsc2UKLQkgIHNoaWZ0ZWQgPSAwOwotCSpyQSA9IHNoaWZ0ZWQ7Ci0JQ1IwX0NPTVBBUkUoc2hpZnRlZCwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsCi0JICAgICAgICgibj0lZCwgc291cmNlPTB4JWx4LCBzaGlmdGVkPTB4JWx4XG4iLAotCSAgICAgICAgbiwgKHVuc2lnbmVkIGxvbmcpc291cmNlLCAodW5zaWduZWQgbG9uZylzaGlmdGVkKSk7Ci0JUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjUzOSwzMS5SYzpYOjY0OjpTaGlmdCBSaWdodCBEb3VibGV3b3JkCi0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS41MzYsMzEuUmM6WDo6OlNoaWZ0IFJpZ2h0IFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JaW50IG4gPSBNQVNLRUQoKnJCLCA1OCwgNjMpOwotCXVuc2lnbmVkMzIgc291cmNlID0gKnJTOwotCXNpZ25lZF93b3JkIHNoaWZ0ZWQ7Ci0JaWYgKG4gPCAzMikKLQkgIHNoaWZ0ZWQgPSAoc291cmNlID4+IG4pOwotCWVsc2UKLQkgIHNoaWZ0ZWQgPSAwOwotCSpyQSA9IHNoaWZ0ZWQ7Ci0JQ1IwX0NPTVBBUkUoc2hpZnRlZCwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsIFwKLQkgICAgICAgKCJuPSVkLCBzb3VyY2U9MHglbHgsIHNoaWZ0ZWQ9MHglbHhcbiIsCi0JICAgICAgICBuLCAodW5zaWduZWQgbG9uZylzb3VyY2UsICh1bnNpZ25lZCBsb25nKXNoaWZ0ZWQpKTsKLQlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgUmMpOwotCi0wLjMxLDYuUlMsMTEuUkEsMTYuc2hfMF80LDIxLjQxMywzMC5zaF81LDMxLlJjOlhTOjY0OjpTaGlmdCBSaWdodCBBbGdlYnJhaWMgRG91Ymxld29yZCBJbW1lZGlhdGUKLQotMC4zMSw2LlJTLDExLlJBLDE2LlNILDIxLjgyNCwzMS5SYzpYOjo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIFdvcmQgSW1tZWRpYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAotCWludCBuID0gU0g7Ci0Jc2lnbmVkX3dvcmQgciA9IFJPVEwzMigqclMsIC8qNjQqLzMyLW4pOwotCXNpZ25lZF93b3JkIG0gPSBNQVNLKG4rMzIsIDYzKTsKLQlpbnQgUyA9IE1BU0tFRCgqclMsIDMyLCAzMik7Ci0Jc2lnbmVkX3dvcmQgc2hpZnRlZCA9IChyICYgbSkgfCAoUyA/IH5tIDogMCk7Ci0JKnJBID0gc2hpZnRlZDsKLQlpZiAoUyAmJiAoKHIgJiB+bSkgJiBNQVNLKDMyLCA2MykpICE9IDApCi0JICBYRVIgfD0geGVyX2NhcnJ5OwotCWVsc2UKLQkgIFhFUiAmPSB+eGVyX2NhcnJ5OwotCUNSMF9DT01QQVJFKHNoaWZ0ZWQsIDAsIFJjKTsKLQlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KSwgWEVSID0gJWxkXG4iLAotCQkJICAgKGxvbmcpKnJBLCAobG9uZykqckEsIChsb25nKVhFUikpOwotCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7Ci0KLTAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS43OTQsMzEuUmM6WDo2NDo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIERvdWJsZXdvcmQKLQotMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjc5MiwzMS5SYzpYOjo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIFdvcmQKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCi0JdW5zaWduZWQ2NCBtYXNrOwotCWludCBuID0gTUFTS0VEKCpyQiwgNTksIDYzKTsKLQlzaWduZWQzMiBzb3VyY2UgPSAoc2lnbmVkMzIpKnJTOyAvKiBzaWduZWQgdG8ga2VlcCBzaWduIGJpdCAqLwotCXNpZ25lZDMyIHNoaWZ0ZWQgPSBzb3VyY2UgPj4gbjsKLQlpbnQgUyA9IChNQVNLRUQoKnJTLDMyLDMyKSAhPSAwKTsKLQlzaWduZWQ2NCByID0gKCh1bnNpZ25lZDY0KSBzb3VyY2UpOwotCXIgPSAoKHVuc2lnbmVkNjQpIHNvdXJjZSkgPDwgMzIgfCAodW5zaWduZWQzMikgc291cmNlOwotCXIgPSBST1RMNjQociw2NC1uKTsKLQlpZiAoTUFTS0VEKCpyQiw1OCw1OCkgPT0gMCkKLQkJbWFzayA9ICh1bnNpZ25lZDY0KSBNQVNLNjQobiszMiw2Myk7Ci0JZWxzZQotCQltYXNrID0gKHVuc2lnbmVkNjQpIDA7Ci0JKnJBID0gKHNpZ25lZF93b3JkKSAociAmIG1hc2sgfCAoKHNpZ25lZDY0KSAtMSpTKSAmIH5tYXNrKTsgLyogaWYgNjRiaXQgd2lsbCBzaWduIGV4dGVuZCAqLwotCWlmIChTICYmIChNQVNLRUQociAmIH5tYXNrLDMyLDYzKSE9MCkpCi0JICBYRVIgfD0geGVyX2NhcnJ5OwotCWVsc2UKLQkgIFhFUiAmPSB+eGVyX2NhcnJ5OwotCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOwotCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpLCBYRVIgPSAlbGRcbiIsCi0JCQkgICAobG9uZykqckEsIChsb25nKSpyQSwgKGxvbmcpWEVSKSk7Ci0JUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKLQotIwotIyBJLjMuMy4xNCBNb3ZlIHRvL2Zyb20gU3lzdGVtIFJlZ2lzdGVyIEluc3RydWN0aW9ucwotIwotCi0wLjMxLDYuUlMsMTEuU1BSLDIxLjQ2NywzMS4vOlhGWDo6bXRzcHIgJVNQUiwgJVJTOk1vdmUgdG8gU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMiwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAotCWludCBuID0gKFNQUns1Ojl9IDw8IDUpIHwgU1BSezA6NH07Ci0JaWYgKFNQUnswfSAmJiBJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgaWYgKCFzcHJfaXNfdmFsaWQobikKLQkgICAgICAgICB8fCBzcHJfaXNfcmVhZG9ubHkobikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgewotCSAgc3ByZWcgbmV3X3ZhbCA9IChzcHJfbGVuZ3RoKG4pID09IDY0Ci0JCQkgICA/ICpyUwotCQkJICAgOiBNQVNLRUQoKnJTLCAzMiwgNjMpKTsKLQkgIC8qIEhBQ0sgLSB0aW1lIGJhc2UgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgdXBkYXRlZCBpbW1lZGlhdGx5ICovCi0JICBpZiAoV0lUSF9USU1FX0JBU0UpIHsKLQkgICAgc3dpdGNoIChuKSB7Ci0JICAgIGNhc2Ugc3ByX3RidToKLQkgICAgICBjcHVfc2V0X3RpbWVfYmFzZShwcm9jZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgKE1BU0tFRDY0KGNwdV9nZXRfdGltZV9iYXNlKHByb2Nlc3NvciksIDMyLCA2MykKLQkgICAgICAgICAgICAgICAgICAgICAgICAgfCBJTlNFUlRFRDY0KG5ld192YWwsIDAsIDMxKSkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHNwcl90Ymw6Ci0JICAgICAgY3B1X3NldF90aW1lX2Jhc2UocHJvY2Vzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgIChNQVNLRUQ2NChjcHVfZ2V0X3RpbWVfYmFzZShwcm9jZXNzb3IpLCAwLCAzMSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgfCBJTlNFUlRFRDY0KG5ld192YWwsIDMyLCA2MykpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzcHJfZGVjOgotCSAgICAgIGNwdV9zZXRfZGVjcmVtZW50ZXIocHJvY2Vzc29yLCBuZXdfdmFsKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBTUFJFRyhuKSA9IG5ld192YWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIH0KLQkgIGVsc2UgewotCSAgICBTUFJFRyhuKSA9IG5ld192YWw7Ci0JICB9Ci0JfQotCVBQQ19JTlNOX1RPX1NQUihSU19CSVRNQVNLLCBuKTsKLQotMC4zMSw2LlJULDExLlNQUiwyMS4zMzksMzEuLzpYRlg6Om1mc3ByICVSVCwgJVNQUjpNb3ZlIGZyb20gU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDMsICAzLCAgMAotCWludCBuID0gKFNQUns1Ojl9IDw8IDUpIHwgU1BSezA6NH07Ci0JaWYgKFNQUnswfSAmJiBJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgaWYgKCFzcHJfaXNfdmFsaWQobikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgewotCSAgLyogSEFDSyAtIHRpbWUgYmFzZSByZWdpc3RlcnMgbmVlZCB0byBiZSBjYWxjdWxhdGVkICovCi0JICBpZiAoV0lUSF9USU1FX0JBU0UpIHsKLQkgICAgc3dpdGNoIChuKSB7Ci0JICAgIGNhc2Ugc3ByX2RlYzoKLQkgICAgICAqclQgPSBjcHVfZ2V0X2RlY3JlbWVudGVyKHByb2Nlc3Nvcik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3ByX3RidToKLQkgICAgY2FzZSBzcHJfdGJsOgotCSAgICAgIC8qIE5PVEUgLSB0aGVzZSBTUFIncyBhcmUgbm90IHJlYWRhYmxlLiBVc2UgbWZ0Ylt1bF0gKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAqclQgPSBTUFJFRyhuKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgfQotCSAgZWxzZSB7Ci0JICAgICpyVCA9IFNQUkVHKG4pOwotCSAgfQotCX0KLQlQUENfSU5TTl9GUk9NX1NQUihSVF9CSVRNQVNLLCBuKTsKLQotMC4zMSw2LlJTLDExLi8sMTIuRlhNLDIwLi8sMjEuMTQ0LDMxLi86WEZYOjptdGZjcjpNb3ZlIHRvIENvbmRpdGlvbiBSZWdpc3RlciBGaWVsZHMKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCi0JaWYgKEZYTSA9PSAweGZmKSB7Ci0JICBDUiA9ICpyUzsKLQl9Ci0JZWxzZSB7Ci0JICB1bnNpZ25lZF93b3JkIG1hc2sgPSAwOwotCSAgdW5zaWduZWRfd29yZCBmOwotCSAgZm9yIChmID0gMDsgZiA8IDg7IGYrKykgewotCSAgICBpZiAoRlhNICYgKDB4ODAgPj4gZikpCi0JICAgICAgbWFzayB8PSAoMHhmIDw8IDQqKDctZikpOwotCSAgfQotCSAgQ1IgPSAoTUFTS0VEKCpyUywgMzIsIDYzKSAmIG1hc2spIHwgKENSICYgfm1hc2spOwotCX0KLQlQUENfSU5TTl9NVENSKFJTX0JJVE1BU0ssIEZYTSk7Ci0KLTAuMzEsNi5CRiw5Li8sMTEuLywxNi4vLDIxLjUxMiwzMS4vOlg6OjpNb3ZlIHRvIENvbmRpdGlvbiBSZWdpc3RlciBmcm9tIFhFUgotIwlDUl9TRVQoQkYsIEVYVFJBQ1RFRDMyKFhFUiwgMCwgMykpOwotIwlNQkxJVDMyKFhFUiwgMCwgMywgMCk7Ci0KLTAuMzEsNi5SVCwxMS4vLDE2Li8sMjEuMTksMzEuLzpYOjo6TW92ZSBGcm9tIENvbmRpdGlvbiBSZWdpc3RlcgotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAzLCAgMywgIDAKLQkqclQgPSAodW5zaWduZWQzMilDUjsKLQlQUENfSU5TTl9NRkNSKFJUX0JJVE1BU0spOwotCi0jCi0jIEkuNC42LjIgRmxvYXRpbmctUG9pbnQgTG9hZCBJbnN0cnVjdGlvbnMKLSMKLQotMC40OCw2LkZSVCwxMS5SQSwxNi5EOkQ6ZjpsZnM6TG9hZCBGbG9hdGluZy1Qb2ludCBTaW5nbGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArIEVYVFMoRCk7Ci0JKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKDAsIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7Ci0KLTAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNTM1LDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKDAsIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOwotCi0wLjQ5LDYuRlJULDExLlJBLDE2LkQ6RDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZQotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQlFQSA9ICpyQSArIEVYVFMoRCk7Ci0JKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7Ci0KLTAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNTc2LDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCSpmclQgPSBET1VCTEUoTUVNKHVuc2lnbmVkLCBFQSwgNCkpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVF9GTE9BVChSQV9CSVRNQVNLLCBGUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwKTsKLQotMC41MCw2LkZSVCwxMS5SQSwxNi5EOkQ6Zjo6TG9hZCBGbG9hdGluZy1Qb2ludCBEb3VibGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArIEVYVFMoRCk7Ci0JKmZyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDgpOwotCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCBGUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOwotCi0wLjMxLDYuRlJULDExLlJBLDE2LlJCLDIxLjU5OSwzMS4vOlg6Zjo6TG9hZCBGbG9hdGluZy1Qb2ludCBEb3VibGUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCSpmclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKLQlQUENfSU5TTl9JTlRfRkxPQVQoMCwgRlJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7Ci0KLTAuNTEsNi5GUlQsMTEuUkEsMTYuRDpEOmY6OkxvYWQgRmxvYXRpbmctUG9pbnQgRG91YmxlIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQkqZnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgOCk7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7Ci0KLTAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNjMxLDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IERvdWJsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCSpmclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlRfRkxPQVQoUkFfQklUTUFTSywgRlJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7Ci0KLQotIwotIyBJLjQuNi4zIEZsb2F0aW5nLVBvaW50IFN0b3JlIEluc3RydWN0aW9ucwotIwotCi0wLjUyLDYuRlJTLDExLlJBLDE2LkQ6RDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBTaW5nbGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JdW5zaWduZWRfd29yZCBiOwotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApIGIgPSAwOwotCWVsc2UgICAgICAgICBiID0gKnJBOwotCUVBID0gYiArIEVYVFMoRCk7Ci0JU1RPUkUoRUEsIDQsIFNJTkdMRSgqZnJTKSk7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKDAsIDAsIChSQV9CSVRNQVNLICYgfjEpLCBGUlNfQklUTUFTSyk7Ci0KLTAuMzEsNi5GUlMsMTEuUkEsMTYuUkIsMjEuNjYzLDMxLi86WDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBTaW5nbGUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIGI7Ci0JdW5zaWduZWRfd29yZCBFQTsKLQlpZiAoUkFfaXNfMCkgYiA9IDA7Ci0JZWxzZSAgICAgICAgIGIgPSAqckE7Ci0JRUEgPSBiICsgKnJCOwotCVNUT1JFKEVBLCA0LCBTSU5HTEUoKmZyUykpOwotCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKLQotMC41Myw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgU2luZ2xlIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQlTVE9SRShFQSwgNCwgU0lOR0xFKCpmclMpKTsKLQkqckEgPSBFQTsKLQlQUENfSU5TTl9JTlRfRkxPQVQoUkFfQklUTUFTSywgMCwgKFJBX0JJVE1BU0sgJiB+MSksIEZSU19CSVRNQVNLKTsKLQotMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS42OTUsMzEuLzpYOmY6OlN0b3JlIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgKnJCOwotCVNUT1JFKEVBLCA0LCBTSU5HTEUoKmZyUykpOwotCSpyQSA9IEVBOwotCVBQQ19JTlNOX0lOVF9GTE9BVChSQV9CSVRNQVNLLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKLQotMC41NCw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgRG91YmxlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyBFWFRTKEQpOwotCVNUT1JFKEVBLCA4LCAqZnJTKTsKLQlQUENfSU5TTl9JTlRfRkxPQVQoMCwgMCwgKFJBX0JJVE1BU0sgJiB+MSksIEZSU19CSVRNQVNLKTsKLQotMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS43MjcsMzEuLzpYOmY6OlN0b3JlIEZsb2F0aW5nLVBvaW50IERvdWJsZSBJbmRleGVkCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgYjsKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKSBiID0gMDsKLQllbHNlICAgICAgICAgYiA9ICpyQTsKLQlFQSA9IGIgKyAqckI7Ci0JU1RPUkUoRUEsIDgsICpmclMpOwotCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKLQotMC41NSw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgRG91YmxlIHdpdGggVXBkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCXVuc2lnbmVkX3dvcmQgRUE7Ci0JaWYgKFJBX2lzXzApCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCUVBID0gKnJBICsgRVhUUyhEKTsKLQlTVE9SRShFQSwgOCwgKmZyUyk7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIDAsIChSQV9CSVRNQVNLICYgfjEpLCBGUlNfQklUTUFTSyk7Ci0KLTAuMzEsNi5GUlMsMTEuUkEsMTYuUkIsMjEuNzU5LDMxLi86WDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBEb3VibGUgd2l0aCBVcGRhdGUgSW5kZXhlZAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQl1bnNpZ25lZF93b3JkIEVBOwotCWlmIChSQV9pc18wKQotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQlFQSA9ICpyQSArICpyQjsKLQlTVE9SRShFQSwgOCwgKmZyUyk7Ci0JKnJBID0gRUE7Ci0JUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgRlJTX0JJVE1BU0spOwotCi0KLSMKLSMgSS40LjYuNCBGbG9hdGluZy1Qb2ludCBNb3ZlIEluc3RydWN0aW9ucwotIwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjcyLDMxLlJjOlg6Zjo6RmxvYXRpbmcgTW92ZSBSZWdpc3RlcgotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQkqZnJUID0gKmZyQjsKLQlDUjFfVVBEQVRFKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJCX0JJVE1BU0ssIFJjKTsKLQotMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS40MCwzMS5SYzpYOmY6OkZsb2F0aW5nIE5lZ2F0ZQotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQkqZnJUID0gKmZyQiBeIEJJVDY0KDApOwotCUNSMV9VUERBVEUoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkJfQklUTUFTSywgUmMpOwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjI2NCwzMS5SYzpYOmY6OkZsb2F0aW5nIEFic29sdXRlIFZhbHVlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCSpmclQgPSAqZnJCICYgfkJJVDY0KDApOwotCUNSMV9VUERBVEUoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkJfQklUTUFTSywgUmMpOwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjEzNiwzMS5SYzpYOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIEFic29sdXRlIFZhbHVlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCSpmclQgPSAqZnJCIHwgQklUNjQoMCk7Ci0JQ1IxX1VQREFURShSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7Ci0KLQotIwotIyBJLjQuNi41IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIxLDMxLlJjOkE6ZjpmYWRkOkZsb2F0aW5nIEFkZAotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsICpmckIsIDAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIGRvdWJsZSBzID0gKihkb3VibGUqKWZyQSArICooZG91YmxlKilmckI7Ci0JICAqKGRvdWJsZSopZnJUID0gczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgUmMpOwotCi0wLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuLywyNi4yMSwzMS5SYzpBOmY6ZmFkZHM6RmxvYXRpbmcgQWRkIFNpbmdsZQotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsICpmckIsIDAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIGZsb2F0IHMgPSAqKGRvdWJsZSopZnJBICsgKihkb3VibGUqKWZyQjsKLQkgICooZG91YmxlKilmclQgPSBzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIwLDMxLlJjOkE6Zjpmc3ViOkZsb2F0aW5nIFN1YnRyYWN0Ci0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCUZQU0NSX0JFR0lOOwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZG91YmxlIHMgPSAqKGRvdWJsZSopZnJBIC0gKihkb3VibGUqKWZyQjsKLQkgICooZG91YmxlKilmclQgPSBzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIwLDMxLlJjOkE6Zjpmc3ViczpGbG9hdGluZyBTdWJ0cmFjdCBTaW5nbGUKLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLCAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBmbG9hdCBzID0gKihkb3VibGUqKWZyQSAtICooZG91YmxlKilmckI7Ci0JICAqKGRvdWJsZSopZnJUID0gczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgUmMpOwotCi0wLjYzLDYuRlJULDExLkZSQSwxNi4vLDIxLkZSQywyNi4yNSwzMS5SYzpBOmY6Zm11bDpGbG9hdGluZyBNdWx0aXBseQotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsIDAsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIGRvdWJsZSBzID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7Ci0JICAqKGRvdWJsZSopZnJUID0gczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOwotCi0wLjU5LDYuRlJULDExLkZSQSwxNi4vLDIxLkZSQywyNi4yNSwzMS5SYzpBOmY6Zm11bHM6RmxvYXRpbmcgTXVsdGlwbHkgU2luZ2xlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCUZQU0NSX0JFR0lOOwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3JfdnhpbXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgMCwgKmZyQywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZmxvYXQgcyA9ICooZG91YmxlKilmckEgKiAqKGRvdWJsZSopZnJDOwotCSAgKihkb3VibGUqKWZyVCA9IHM7Ci0JfQotCUZQU0NSX0VORChSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKLQotMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLi8sMjYuMTgsMzEuUmM6QTpmOmZkaXY6RmxvYXRpbmcgRGl2aWRlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDMxLCAzMSwgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAzMywgMzMsIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMzMsIDMzLCAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDMyLCAzMiwgMAotCUZQU0NSX0JFR0lOOwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnh6ZHosCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIGlmIChpc19pbnZhbGlkX3plcm9fZGl2aWRlIChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLypzaW5nbGU/Ki8pKSB7Ci0JICBpbnZhbGlkX3plcm9fZGl2aWRlX29wZXJhdGlvbiAocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLypzaW5nbGU/Ki8pOwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZG91YmxlIHMgPSAqKGRvdWJsZSopZnJBIC8gKihkb3VibGUqKWZyQjsKLQkgICooZG91YmxlKilmclQgPSBzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjE4LDMxLlJjOkE6ZjpmZGl2czpGbG9hdGluZyBEaXZpZGUgU2luZ2xlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDE3LCAxNywgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxOCwgMTgsIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMTgsIDE4LCAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDE4LCAxOCwgMAotCUZQU0NSX0JFR0lOOwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnh6ZHosCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIGlmIChpc19pbnZhbGlkX3plcm9fZGl2aWRlIChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypzaW5nbGU/Ki8pKSB7Ci0JICBpbnZhbGlkX3plcm9fZGl2aWRlX29wZXJhdGlvbiAocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypzaW5nbGU/Ki8pOwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZmxvYXQgcyA9ICooZG91YmxlKilmckEgLyAqKGRvdWJsZSopZnJCOwotCSAgKihkb3VibGUqKWZyVCA9IHM7Ci0JfQotCUZQU0NSX0VORChSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0ssIFJjKTsKLQotMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yOSwzMS5SYzpBOmY6Zm1hZGQ6RmxvYXRpbmcgTXVsdGlwbHktQWRkCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDUsICA1LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAyLCAgNCwgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCUZQU0NSX0JFR0lOOwotCWRvdWJsZSBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCi0JLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKLQl9Ci0JLyogY29tcHV0ZSB0aGUgYWRkICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBkb3VibGUgcyA9IHByb2R1Y3QgKyAqKGRvdWJsZSopZnJCOwotCSAgKihkb3VibGUqKWZyVCA9IHM7Ci0JfQotCUZQU0NSX0VORChSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOwotCi0wLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuRlJDLDI2LjI5LDMxLlJjOkE6Zjo6RmxvYXRpbmcgTXVsdGlwbHktQWRkIFNpbmdsZQotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlmbG9hdCBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCi0JLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKLQl9Ci0JLyogY29tcHV0ZSB0aGUgYWRkICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBmbG9hdCBzID0gcHJvZHVjdCArICooZG91YmxlKilmckI7Ci0JICAqKGRvdWJsZSopZnJUID0gKGRvdWJsZSlzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKLQotMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yOCwzMS5SYzpBOmY6OkZsb2F0aW5nIE11bHRpcGx5LVN1YnRyYWN0Ci0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDUsICA1LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAyLCAgNCwgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCUZQU0NSX0JFR0lOOwotCWRvdWJsZSBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCi0JLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKLQl9Ci0JLyogY29tcHV0ZSB0aGUgc3VidHJhY3QgKi8KLQlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QsICpmckIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgewotCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsIHByb2R1Y3QsICpmckIsIDAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KLQl9Ci0JZWxzZSB7Ci0JICAvKkhBQ0shKi8KLQkgIGRvdWJsZSBzID0gcHJvZHVjdCAtICooZG91YmxlKilmckI7Ci0JICAqKGRvdWJsZSopZnJUID0gczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7Ci0KLTAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS5GUkMsMjYuMjgsMzEuUmM6QTpmOjpGbG9hdGluZyBNdWx0aXBseS1TdWJ0cmFjdCBTaW5nbGUKLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JZmxvYXQgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLwotCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7Ci0JfQotCS8qIGNvbXB1dGUgdGhlIHN1YnRyYWN0ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBmbG9hdCBzID0gcHJvZHVjdCAtICooZG91YmxlKilmckI7Ci0JICAqKGRvdWJsZSopZnJUID0gKGRvdWJsZSlzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKLQotMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4zMSwzMS5SYzpBOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIE11bHRpcGx5LUFkZAotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlkb3VibGUgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLwotCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7Ci0JfQotCS8qIGNvbXB1dGUgdGhlIGFkZCAqLwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZG91YmxlIHMgPSAtKHByb2R1Y3QgKyAqKGRvdWJsZSopZnJCKTsKLQkgICooZG91YmxlKilmclQgPSBzOwotCX0KLQlGUFNDUl9FTkQoUmMpOwotCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKLQotMC41OSw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4zMSwzMS5SYzpBOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIE11bHRpcGx5LUFkZCBTaW5nbGUKLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JZmxvYXQgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLwotCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7Ci0JfQotCS8qIGNvbXB1dGUgdGhlIGFkZCAqLwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZmxvYXQgcyA9IC0ocHJvZHVjdCArICooZG91YmxlKilmckIpOwotCSAgKihkb3VibGUqKWZyVCA9IChkb3VibGUpczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7Ci0KLTAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS5GUkMsMjYuMzAsMzEuUmM6QTpmOjpGbG9hdGluZyBOZWdhdGl2ZSBNdWx0aXBseS1TdWJ0cmFjdAotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlGUFNDUl9CRUdJTjsKLQlkb3VibGUgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLwotCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7Ci0JfQotCS8qIGNvbXB1dGUgdGhlIHN1YnRyYWN0ICovCi0JaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKLQkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCi0JfQotCWVsc2UgewotCSAgLypIQUNLISovCi0JICBkb3VibGUgcyA9IC0ocHJvZHVjdCAtICooZG91YmxlKilmckIpOwotCSAgKihkb3VibGUqKWZyVCA9IHM7Ci0JfQotCUZQU0NSX0VORChSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOwotCi0wLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuRlJDLDI2LjMwLDMxLlJjOkE6Zjo6RmxvYXRpbmcgTmVnYXRpdmUgTXVsdGlwbHktU3VidHJhY3QgU2luZ2xlCi0qNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCUZQU0NSX0JFR0lOOwotCWZsb2F0IHByb2R1Y3Q7IC8qSEFDSyEgLSBpbmNvcnJlY3RseSBsb29zaW5nIHByZWNpc2lvbiAuLi4gKi8KLQkvKiBjb21wdXRlIHRoZSBtdWx0aXBseSAqLwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3JfdnhpbXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZDY0KikmcHJvZHVjdCwgKmZyQSwgMCwgKmZyQywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgcHJvZHVjdCA9ICooZG91YmxlKilmckEgKiAqKGRvdWJsZSopZnJDOwotCX0KLQkvKiBjb21wdXRlIHRoZSBzdWJ0cmFjdCAqLwotCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7Ci0JICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLwotCX0KLQllbHNlIHsKLQkgIC8qSEFDSyEqLwotCSAgZmxvYXQgcyA9IC0ocHJvZHVjdCAtICooZG91YmxlKilmckIpOwotCSAgKihkb3VibGUqKWZyVCA9IChkb3VibGUpczsKLQl9Ci0JRlBTQ1JfRU5EKFJjKTsKLQlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7Ci0KLQotIwotIyBJLjQuNi42IEZsb2F0aW5nLVBvaW50IFJvdW5kaW5nIGFuZCBDb252ZXJzaW9uIEluc3RydWN0aW9ucwotIwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjEyLDMxLlJjOlg6Zjo6RmxvYXRpbmcgUm91bmQgdG8gU2luZ2xlLVByZWNpc2lvbgotKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKLSo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLQlpbnQgc2lnbjsKLQlpbnQgZXhwOwotCXVuc2lnbmVkNjQgZnJhY19ncng7Ci0JLyoqKi8KLQkgIC8qIHNwbGl0IG9mZiBjYXNlcyBmb3Igd2hhdCB0byBkbyAqLwotCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSA8IDg5NwotCSAgICAgICYmIEVYVFJBQ1RFRDY0KCpmckIsIDEsIDYzKSA+IDApIHsKLQkgICAgICBpZiAoKEZQU0NSICYgZnBzY3JfdWUpID09IDApIEdPVE8oRGlzYWJsZWRfRXhwb25lbnRfVW5kZXJmbG93KTsKLQkgICAgICBpZiAoKEZQU0NSICYgZnBzY3JfdWUpICE9IDApIEdPVE8oRW5hYmxlZF9FeHBvbmVudF9VbmRlcmZsb3cpOwotCSAgfQotCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSA+IDExNTAKLQkgICAgICAmJiBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgPCAyMDQ3KSB7Ci0JICAgICAgaWYgKChGUFNDUiAmIGZwc2NyX29lKSA9PSAwKSBHT1RPKERpc2FibGVkX0V4cG9uZW50X092ZXJmbG93KTsKLQkgICAgICBpZiAoKEZQU0NSICYgZnBzY3Jfb2UpICE9IDApIEdPVE8oRW5hYmxlZF9FeHBvbmVudF9PdmVyZmxvdyk7Ci0JICB9Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gODk2Ci0JICAgICAgJiYgRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpIDwgMTE1MSkgR09UTyhOb3JtYWxfT3BlcmFuZCk7Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgNjMpID09IDApIEdPVE8oWmVyb19PcGVyYW5kKTsKLQkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgPT0gMjA0NykgewotCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSA9PSAwKSBHT1RPKEluZmluaXR5X09wZXJhbmQpOwotCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDEyKSA9PSAxKSBHT1RPKFFOYU5fT3BlcmFuZCk7Ci0JICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgMTIpID09IDAKLQkgICAgICAgICYmIEVYVFJBQ1RFRDY0KCpmckIsIDEzLCA2MykgPiAwKSBHT1RPKFNOYU5fT3BlcmFuZCk7Ci0JICB9Ci0JLyoqLwotCUxBQkVMKERpc2FibGVkX0V4cG9uZW50X1VuZGVyZmxvdyk6Ci0JICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID09IDApIHsKLQkgICAgZXhwID0gLTEwMjI7Ci0JICAgIGZyYWNfZ3J4ID0gSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7Ci0JICB9Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gMCkgewotCSAgICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOwotCSAgICBmcmFjX2dyeCA9IEJJVDY0KDApIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7Ci0JICB9Ci0JICAgIC8qIEd8UnxYID09IHplcm8gZnJvbSBhYm92ZSAqLwotCSAgICB3aGlsZSAoZXhwIDwgLTEyNikgewotCSAgICAgIGV4cCA9IGV4cCArIDE7Ci0JICAgICAgZnJhY19ncnggPSAoSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMCwgNTQpLCAxLCA1NSkKLQkgICAgICAgICAgICAgICAgICB8IE1BU0tFRDY0KGZyYWNfZ3J4LCA1NSwgNTUpKTsKLQkgICAgfQotCSAgRlBTQ1JfU0VUX1VYKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAyNCwgNTUpID4gMCk7Ci0JICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOwotCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOwotCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCA1MikgPT0gMCkgewotCSAgICAqZnJUID0gSU5TRVJURUQ2NChzaWduLCAwLCAwKTsKLQkgICAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX3plcm8pOwotCSAgICBpZiAoc2lnbiA9PSAxKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfemVybyk7Ci0JICB9Ci0JICBpZiAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDUyKSA+IDApIHsKLQkgICAgaWYgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCAwKSA9PSAxKSB7Ci0JICAgICAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOwotCSAgICAgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKLQkgICAgfQotCSAgICBpZiAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDApID09IDApIHsKLQkgICAgICBpZiAoc2lnbiA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfZGVub3JtYWxpemVkX251bWJlcik7Ci0JICAgICAgaWYgKHNpZ24gPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX2Rlbm9ybWFsaXplZF9udW1iZXIpOwotCSAgICB9Ci0JICAgIC8qTm9ybWFsaXplX09wZXJhbmQ6Ki8KLQkgICAgICB3aGlsZSAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDApID09IDApIHsKLQkgICAgICAgIGV4cCA9IGV4cCAtIDE7Ci0JICAgICAgICBmcmFjX2dyeCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsICA1MiksIDAsIDUxKTsKLQkgICAgICB9Ci0JICAgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQotCSAgICAgICAgICAgIHwgSU5TRVJURUQ2NChleHAgKyAxMDIzLCAxLCAxMSkKLQkgICAgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsIDUyKSwgMTIsIDYzKSk7Ci0JICB9Ci0JICBHT1RPKERvbmUpOwotCS8qKi8KLQlMQUJFTChFbmFibGVkX0V4cG9uZW50X1VuZGVyZmxvdyk6Ci0JICBGUFNDUl9TRVRfVVgoMSk7Ci0JICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID09IDApIHsKLQkgICAgZXhwID0gLTEwMjI7Ci0JICAgIGZyYWNfZ3J4ID0gSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7Ci0JICB9Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gMCkgewotCSAgICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOwotCSAgICBmcmFjX2dyeCA9IChCSVQ2NCgwKSB8Ci0JICAgICAgICAgICAgICAgIElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSwgMSwgNTIpKTsKLQkgIH0KLQkgIC8qTm9ybWFsaXplX09wZXJhbmQ6Ki8KLQkgICAgd2hpbGUgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCAwKSA9PSAwKSB7Ci0JICAgICAgZXhwID0gZXhwIC0gMTsKLQkgICAgICBmcmFjX2dyeCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsIDUyKSwgMCwgNTEpOwotCSAgICB9Ci0JICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOwotCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOwotCSAgZXhwID0gZXhwICsgMTkyOwotCSAgKmZyVCA9IChJTlNFUlRFRDY0KHNpZ24sIDAsIDApCi0JICAgICAgICAgIHwgSU5TRVJURUQ2NChleHAgKyAxMDIzLCAxLCAxMSkKLQkgICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAxLCA1MiksIDEyLCA2MykpOwotCSAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOwotCSAgaWYgKHNpZ24gPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX25vcm1hbF9udW1iZXIpOwotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoRGlzYWJsZWRfRXhwb25lbnRfT3ZlcmZsb3cpOgotCSAgRlBTQ1JfU0VUX09YKDEpOwotCSAgaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0KSB7Ci0JICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSB7Ci0JICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHg3RkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKLQkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfaW5maW5pdHkpOwotCSAgICB9Ci0JICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7Ci0JICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhGRkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKLQkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfaW5maW5pdHkpOwotCSAgICB9Ci0JICB9Ci0JICBpZiAoKEZQU0NSICYgZnBzY3Jfcm4pID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfemVybykgewotCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMCkgewotCSAgICAgICpmclQgPSBJTlNFUlRFRDY0KDB4NDdFRkZGRkYsIDAsIDMxKSB8IDB4RTAwMDAwMDA7Ci0JICAgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOwotCSAgICB9Ci0JICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7Ci0JICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhDN0VGRkZGRiwgMCwgMzEpIHwgMHhFMDAwMDAwMDsKLQkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfbm9ybWFsX251bWJlcik7Ci0JICAgIH0KLQkgIH0KLQkgIGlmICgoRlBTQ1IgJiBmcHNjcl9ybikgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19wb3NfaW5maW5pdHkpIHsKLQkgICAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDApIHsKLQkgICAgICAqZnJUID0gSU5TRVJURUQ2NCgweDdGRjAwMDAwLCAwLCAzMSkgfCAweDAwMDAwMDAwOwotCSAgICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19pbmZpbml0eSk7Ci0JICAgIH0KLQkgICAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDEpIHsKLQkgICAgICAqZnJUID0gSU5TRVJURUQ2NCgweEM3RUZGRkZGLCAwLCAzMSkgfCAweEUwMDAwMDAwOwotCSAgICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKLQkgICAgfQotCSAgfQotCSAgaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX25lZ19pbmZpbml0eSkgewotCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMCkgewotCSAgICAgICpmclQgPSBJTlNFUlRFRDY0KDB4NDdFRkZGRkYsIDAsIDMxKSB8IDB4RTAwMDAwMDA7Ci0JICAgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOwotCSAgICB9Ci0JICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7Ci0JICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhGRkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKLQkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfaW5maW5pdHkpOwotCSAgICB9Ci0JICB9Ci0JICAvKiBGUFNDUltGUl0gPC0gdW5kZWZpbmVkICovCi0JICBGUFNDUl9TRVRfRkkoMSk7Ci0JICBGUFNDUl9TRVRfWFgoMSk7Ci0JICBHT1RPKERvbmUpOwotCS8qKi8KLQlMQUJFTChFbmFibGVkX0V4cG9uZW50X092ZXJmbG93KToKLQkgIHNpZ24gPSBFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKTsKLQkgIGV4cCA9IEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSAtIDEwMjM7Ci0JICBmcmFjX2dyeCA9IEJJVDY0KDApIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7Ci0JICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOwotCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOwotCS8qKi8KLQlMQUJFTChFbmFibGVkX092ZXJmbG93KToKLQkgIEZQU0NSX1NFVF9PWCgxKTsKLQkgIGV4cCA9IGV4cCAtIDE5MjsKLQkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQotCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCi0JICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMSwgNTIpLCAxMiwgNjMpKTsKLQkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKLQkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKLQkgIEdPVE8oRG9uZSk7Ci0JLyoqLwotCUxBQkVMKFplcm9fT3BlcmFuZCk6Ci0JICAqZnJUID0gKmZyQjsKLQkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfemVybyk7Ci0JICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX3plcm8pOwotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoSW5maW5pdHlfT3BlcmFuZCk6Ci0JICAqZnJUID0gKmZyQjsKLQkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfaW5maW5pdHkpOwotCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19pbmZpbml0eSk7Ci0JICBGUFNDUl9TRVRfRlIoMCk7Ci0JICBGUFNDUl9TRVRfRkkoMCk7Ci0JICBHT1RPKERvbmUpOwotCS8qKi8KLQlMQUJFTChRTmFOX09wZXJhbmQpOgotCSAgKmZyVCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMCwgMzQpLCAwLCAzNCk7Ci0JICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9xdWlldF9uYW4pOwotCSAgRlBTQ1JfU0VUX0ZSKDApOwotCSAgRlBTQ1JfU0VUX0ZJKDApOwotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoU05hTl9PcGVyYW5kKToKLQkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4c25hbik7Ci0JICBpZiAoKEZQU0NSICYgZnBzY3JfdmUpID09IDApIHsKLQkgICAgKmZyVCA9IChNQVNLRUQ2NCgqZnJCLCAwLCAxMSkKLQkgICAgICAgICAgICB8IEJJVDY0KDEyKQotCSAgICAgICAgICAgIHwgTUFTS0VENjQoKmZyQiwgMTMsIDM0KSk7Ci0JICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3F1aWV0X25hbik7Ci0JICB9Ci0JICBGUFNDUl9TRVRfRlIoMCk7Ci0JICBGUFNDUl9TRVRfRkkoMCk7Ci0JICBHT1RPKERvbmUpOwotCS8qKi8KLQlMQUJFTChOb3JtYWxfT3BlcmFuZCk6Ci0JICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7Ci0JICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOwotCSAgZnJhY19ncnggPSBCSVQ2NCgwKSB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSwgMSwgNTIpOwotCSAgUm91bmRfU2luZ2xlKHByb2Nlc3Nvciwgc2lnbiwgJmV4cCwgJmZyYWNfZ3J4KTsKLQkgIEZQU0NSX1NFVF9YWChGUFNDUiAmIGZwc2NyX2ZpKTsKLQkgIGlmIChleHAgPiAxMjcgJiYgKEZQU0NSICYgZnBzY3Jfb2UpID09IDApIEdPVE8oRGlzYWJsZWRfRXhwb25lbnRfT3ZlcmZsb3cpOwotCSAgaWYgKGV4cCA+IDEyNyAmJiAoRlBTQ1IgJiBmcHNjcl9vZSkgIT0gMCkgR09UTyhFbmFibGVkX092ZXJmbG93KTsKLQkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQotCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCi0JICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMSwgNTIpLCAxMiwgNjMpKTsKLQkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKLQkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKLQkgIEdPVE8oRG9uZSk7Ci0JLyoqLwotCUxBQkVMKERvbmUpOgotCSAgUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7Ci0KLQotMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS44MTQsMzEuUmM6WDo2NCxmOjpGbG9hdGluZyBDb252ZXJ0IFRvIEludGVnZXIgRG91Ymxld29yZAotCWZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEpOwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjgxNSwzMS5SYzpYOjY0LGY6OkZsb2F0aW5nIENvbnZlcnQgVG8gSW50ZWdlciBEb3VibGV3b3JkIHdpdGggcm91bmQgdG93YXJkcyBaZXJvCi0JZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSk7Ci0KLTAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuMTQsMzEuUmM6WDpmOjpGbG9hdGluZyBDb252ZXJ0IFRvIEludGVnZXIgV29yZAotCWZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEpOwotCi0wLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjE1LDMxLlJjOlg6ZjpmY3Rpd3o6RmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIFdvcmQgd2l0aCByb3VuZCB0b3dhcmRzIFplcm8KLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JY29udmVydF90b19pbnRlZ2VyKHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICBmclQsICpmckIsCi0JICAgICAgICAgICAgICAgICAgIGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfemVybywgMzIpOwotCUZQU0NSX0VORChSYyk7Ci0JUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7Ci0KLTAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuODQ2LDMxLlJjOlg6NjQsZjo6RmxvYXRpbmcgQ29udmVydCBmcm9tIEludGVnZXIgRG91Ymxld29yZAotCWludCBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7Ci0JaW50IGV4cCA9IDYzOwotCXVuc2lnbmVkNjQgZnJhYyA9ICpmckI7Ci0JLyoqKi8KLQkgIGlmIChmcmFjID09IDApIEdPVE8oWmVyb19PcGVyYW5kKTsKLQkgIGlmIChzaWduID09IDEpIGZyYWMgPSB+ZnJhYyArIDE7Ci0JICB3aGlsZSAoRVhUUkFDVEVENjQoZnJhYywgMCwgMCkgPT0gMCkgewotCSAgICAvKj8/PyBkbyB0aGUgbG9vcCAwIHRpbWVzIGlmIChGUkIpID0gbWF4IG5lZ2F0aXZlIGludGVnZXIgKi8KLQkgICAgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhYywgMSwgNjMpLCAwLCA2Mik7Ci0JICAgIGV4cCA9IGV4cCAtIDE7Ci0JICB9Ci0JICBSb3VuZF9GbG9hdChwcm9jZXNzb3IsIHNpZ24sICZleHAsICZmcmFjLCBGUFNDUiAmIGZwc2NyX3JuKTsKLQkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKLQkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKLQkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQotCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCi0JICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjLCAxLCA1MiksIDEyLCA2MykpOwotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoWmVyb19PcGVyYW5kKToKLQkgIEZQU0NSX1NFVF9GUigwKTsKLQkgIEZQU0NSX1NFVF9GSSgwKTsKLQkgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc196ZXJvKTsKLQkgICpmclQgPSAwOwotCSAgR09UTyhEb25lKTsKLQkvKiovCi0JTEFCRUwoRG9uZSk6Ci0JICBQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJCX0JJVE1BU0ssIFJjKTsKLQotCi0jCi0jIEkuNC42LjcgRmxvYXRpbmctUG9pbnQgQ29tcGFyZSBJbnN0cnVjdGlvbnMKLSMKLQotMC42Myw2LkJGLDkuLywxMS5GUkEsMTYuRlJCLDIxLjAsMzEuLzpYOmY6ZmNtcHU6RmxvYXRpbmcgQ29tcGFyZSBVbm9yZGVyZWQKLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JdW5zaWduZWQgYzsKLQlpZiAoaXNfTmFOKCpmckEsIDApIHx8IGlzX05hTigqZnJCLCAwKSkKLQkgIGMgPSBjcl9pX3N1bW1hcnlfb3ZlcmZsb3c7IC8qIDBiMDAwMSAtIChGUkEpID8gKEZSQikgKi8KLQllbHNlIGlmIChpc19sZXNzX3RoYW4oZnJBLCBmckIpKQotCSAgYyA9IGNyX2lfbmVnYXRpdmU7IC8qIDBiMTAwMCAtIChGUkEpIDwgKEZSQikgKi8KLQllbHNlIGlmIChpc19ncmVhdGVyX3RoYW4oZnJBLCBmckIpKQotCSAgYyA9IGNyX2lfcG9zaXRpdmU7IC8qIDBiMDEwMCAtIChGUkEpID4gKEZSQikgKi8KLQllbHNlCi0JICBjID0gY3JfaV96ZXJvOyAvKiAwYjAwMTAgLSAoRlJBKSA9IChGUkIpICovCi0JRlBTQ1JfU0VUX0ZQQ0MoYyk7Ci0JQ1JfU0VUKEJGLCBjKTsgLyogQ1JbNCpCRi4uNCpCRiszXSA9IGMgKi8KLQlpZiAoaXNfU05hTigqZnJBLCAwKSB8fCBpc19TTmFOKCpmckIsIDApKQotCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhzbmFuKTsKLQlGUFNDUl9FTkQoMCk7Ci0JUFBDX0lOU05fRkxPQVRfQ1IoMCwgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgQkZfQklUTUFTSyk7Ci0KLTAuNjMsNi5CRiw5Li8sMTEuRlJBLDE2LkZSQiwyMS4zMiwzMS4vOlg6ZjpmY21wbzpGbG9hdGluZyBDb21wYXJlIE9yZGVyZWQKLSo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCi0qNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0JRlBTQ1JfQkVHSU47Ci0JdW5zaWduZWQgYzsKLQlpZiAoaXNfTmFOKCpmckEsIDApIHx8IGlzX05hTigqZnJCLCAwKSkKLQkgIGMgPSBjcl9pX3N1bW1hcnlfb3ZlcmZsb3c7IC8qIDBiMDAwMSAtIChGUkEpID8gKEZSQikgKi8KLQllbHNlIGlmIChpc19sZXNzX3RoYW4oZnJBLCBmckIpKQotCSAgYyA9IGNyX2lfbmVnYXRpdmU7IC8qIDBiMTAwMCAtIChGUkEpIDwgKEZSQikgKi8KLQllbHNlIGlmIChpc19ncmVhdGVyX3RoYW4oZnJBLCBmckIpKQotCSAgYyA9IGNyX2lfcG9zaXRpdmU7IC8qIDBiMDEwMCAtIChGUkEpID4gKEZSQikgKi8KLQllbHNlCi0JICBjID0gY3JfaV96ZXJvOyAvKiAwYjAwMTAgLSAoRlJBKSA9IChGUkIpICovCi0JRlBTQ1JfU0VUX0ZQQ0MoYyk7Ci0JQ1JfU0VUKEJGLCBjKTsgLyogQ1JbNCpCRi4uNCpCRiszXSA9IGMgKi8KLQlpZiAoaXNfU05hTigqZnJBLCAwKSB8fCBpc19TTmFOKCpmckIsIDApKSB7Ci0JICBGUFNDUl9PUl9WWChmcHNjcl92eHNuYW4pOwotCSAgaWYgKChGUFNDUiAmIGZwc2NyX3ZlKSA9PSAwKQotCSAgICBGUFNDUl9PUl9WWChmcHNjcl92eHZjKTsKLQl9Ci0JZWxzZSBpZiAoaXNfUU5hTigqZnJBLCAwKSB8fCBpc19RTmFOKCpmckIsIDApKSB7Ci0JICBGUFNDUl9PUl9WWChmcHNjcl92eHZjKTsKLQl9Ci0JRlBTQ1JfRU5EKDApOwotCVBQQ19JTlNOX0ZMT0FUX0NSKDAsIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOwotCi0KLSMKLSMgSS40LjYuOCBGbG9hdGluZy1Qb2ludCBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuNjMsNi5GUlQsMTEuLywxNi4vLDIxLjU4MywzMS5SYzpYOmY6Ok1vdmUgRnJvbSBGUFNDUgotCUZQU0NSX0JFR0lOOwotCSpmclQgPSBGUFNDUjsKLQlGUFNDUl9FTkQoUmMpOwotCi0wLjYzLDYuQkYsOS4vLDExLkJGQSwxNC4vLDE2Li8sMjEuNjQsMzEuLzpYOmY6Ok1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gRlBTQ1IKLQlGUFNDUl9CRUdJTjsKLQl1bnNpZ25lZCBmaWVsZCA9IEZQU0NSX0ZJRUxEKEJGQSk7Ci0JQ1JfU0VUKEJGLCBmaWVsZCk7Ci0JRlBTQ1JfU0VUKEJGQSwgMCk7IC8qIEZQU0NSX0VORCBmaXhlcyB1cCBGRVgvVlggKi8KLQlGUFNDUl9FTkQoMCk7Ci0KLTAuNjQsNi5CRiw5Li8sMTEuLywxNi5VLDIwLi8sMjEuMTM0LDMxLlJjOlg6Zjo6TW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUKLQlGUFNDUl9CRUdJTjsKLQlGUFNDUl9TRVQoQkYsIFUpOwotCUZQU0NSX0VORChSYyk7Ci0KLTAuNjMsNi4vLDcuRkxNLDE1Li8sMTYuRlJCLDIxLjcxMSwzMS5SYzpYRkw6Zjo6TW92ZSBUbyBGUFNDUiBGaWVsZHMKLQlGUFNDUl9CRUdJTjsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JICBpZiAoKEZMTSAmIEJJVDgoaSkpKSB7Ci0JICAgIEZQU0NSICY9IH5NQVNLMzIoaSo0LCBpKjQrMyk7Ci0JICAgIEZQU0NSIHw9IE1BU0tFRDMyKCpmckIsIGkqNCwgaSo0KzMpOwotCSAgfQotCX0KLQlGUFNDUl9FTkQoUmMpOwotCi0wLjYzLDYuQlQsMTEuLywxNi4vLDIxLjcwLDMxLlJjOlg6Zjo6TW92ZSBUbyBGUFNDUiBCaXQgMAotCUZQU0NSX0JFR0lOOwotCXVuc2lnbmVkMzIgYml0ID0gQklUMzIoQlQpOwotCUZQU0NSICY9IH5iaXQ7Ci0JRlBTQ1JfRU5EKFJjKTsKLQotMC42Myw2LkJULDExLi8sMTYuLywyMS4zOCwzMS5SYzpYOmY6Ok1vdmUgVG8gRlBTQ1IgQml0IDEKLQlGUFNDUl9CRUdJTjsKLQl1bnNpZ25lZDMyIGJpdCA9IEJJVDMyKEJUKTsKLQlpZiAoYml0ICYgZnBzY3JfZmkpCi0JICBiaXQgfD0gZnBzY3JfeHg7Ci0JaWYgKChiaXQgJiBmcHNjcl92eF9iaXRzKSkKLQkgIGJpdCB8PSBmcHNjcl9meDsKLQkvKiBub3RlIC0gb21pdCB2eCBiaXQgKi8KLQlpZiAoKGJpdCAmIChmcHNjcl9veCB8IGZwc2NyX3V4IHwgZnBzY3JfenggfCBmcHNjcl94eCkpKQotCSAgYml0IHw9IGZwc2NyX2Z4OwotCUZQU0NSIHw9IGJpdDsKLQlGUFNDUl9FTkQoUmMpOwotCi0KLSMKLSMgSS5BLjEuMSBGbG9hdGluZy1Qb2ludCBTdG9yZSBJbnN0cnVjdGlvbgotIwotMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS45ODMsMzEuLzpYOmYsbzo6U3RvcmUgRmxvYXRpbmctUG9pbnQgYXMgSW50ZWdlciBXb3JkIEluZGV4ZWQKLQlwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCi0jCi0jIEkuQS4xLjIgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMKLSMKLQotMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS4vLDI2LjIyLDMxLlJjOkE6ZixvOjpGbG9hdGluZyBTcXVhcmUgUm9vdAotCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0KLTAuNTksNi5GUlQsMTEuLywxNi5GUkIsMjEuLywyNi4yMiwzMS5SYzpBOmYsbzo6RmxvYXRpbmcgU3F1YXJlIFJvb3QgU2luZ2xlCi0JcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQotMC41OSw2LkZSVCwxMS4vLDE2LkZSQiwyMS4vLDI2LjI0LDMxLlJjOkE6ZixvOjpGbG9hdGluZyBSZWNpcHJvY2FsIEVzdGltYXRlIFNpbmdsZQotCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0KLTAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuLywyNi4yNiwzMS5SYzpBOmYsbzo6RmxvYXRpbmcgUmVjaXByb2NhbCBTcXVhcmUgUm9vdCBFc3RpbWF0ZQotCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0KLSMKLSMgSS5BLjEuMyBGbG9hdGluZy1Qb2ludCBTZWxlY3QgSW5zdHJ1Y3Rpb24KLSMKLQotMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yMywzMS5SYzpBOmYsbzo6RmxvYXRpbmcgU2VsZWN0Ci0qNjAxOiBQUENfVU5JVF9CQUQsICAgUFBDX1VOSVRfQkFELCAgIDAsICAwLCAgMAotKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAotCWlmIChDVVJSRU5UX01PREVMID09IE1PREVMX3BwYzYwMSkgewotCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKLQl9IGVsc2UgewotCSAgdW5zaWduZWQ2NCB6ZXJvID0gMDsKLQkgIEZQU0NSX0JFR0lOOwotCSAgaWYgKGlzX05hTigqZnJBLCAwKSB8fCBpc19sZXNzX3RoYW4gKGZyQSwgJnplcm8pKSAqZnJUID0gKmZyQjsKLQkgIGVsc2UJCQkJCQkgICAgKmZyVCA9ICpmckM7Ci0JICBGUFNDUl9FTkQoUmMpOwotCSAgUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOwotCX0KLQotIwotIyBJSS4zLjIgQ2FjaGUgTWFuYWdlbWVudCBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuOTgyLDMxLi86WDo6aWNiaTpJbnN0cnVjdGlvbiBDYWNoZSBCbG9jayBJbnZhbGlkYXRlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAotCS8qIGJsaW5kbHkgZmx1c2ggYWxsIGluc3RydWN0aW9uIGNhY2hlIGVudHJpZXMgKi8KLQkjaWYgV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUKLQljcHVfZmx1c2hfaWNhY2hlKHByb2Nlc3Nvcik7Ci0JI2VuZGlmCi0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7Ci0KLTAuMTksNi4vLDExLi8sMTYuLywyMS4xNTAsMzEuLzpYTDo6aXN5bmM6SW5zdHJ1Y3Rpb24gU3luY2hyb25pemUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDEsICAwCi0JY3B1X3N5bmNocm9uaXplX2NvbnRleHQocHJvY2Vzc29yLCBjaWEpOwotCVBQQ19JTlNOX0lOVCgwLCAwLCAwKTsKLQotCi0jCi0jIElJLjMuMi4yIERhdGEgQ2FjaGUgSW5zdHJ1Y3Rpb25zCi0jCi0KLTAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjI3OCwzMS4vOlg6OjpEYXRhIENhY2hlIEJsb2NrIFRvdWNoCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMiwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAotCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2hcbiIpKTsKLQlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwLypSYyovKTsKLQotMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuMjQ2LDMxLi86WDo6OkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2ggZm9yIFN0b3JlCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMiwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAotCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2ggZm9yIFN0b3JlXG4iKSk7Ci0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMC8qUmMqLyk7Ci0KLTAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjEwMTQsMzEuLzpYOjo6RGF0YSBDYWNoZSBCbG9jayBzZXQgdG8gWmVybwotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMTAsIDEwLCAwCi0qNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEwLCAxMCwgMAotKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKLQlUUkFDRSh0cmFjZV90YmQsKCJEYXRhIENhY2hlIEJsb2NrIHNldCB0byBaZXJvXG4iKSk7Ci0JUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMC8qUmMqLyk7Ci0KLTAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjU0LDMxLi86WDo6OkRhdGEgQ2FjaGUgQmxvY2sgU3RvcmUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDUsICA1LCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICA1LCAgNSwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDEsICAwCi0JVFJBQ0UodHJhY2VfdGJkLCgiRGF0YSBDYWNoZSBCbG9jayBTdG9yZVxuIikpOwotCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDAvKlJjKi8pOwotCi0wLjMxLDYuLywxMS5SQSwxNi5SQiwyMS44NiwzMS4vOlg6OjpEYXRhIENhY2hlIEJsb2NrIEZsdXNoCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICA1LCAgNSwgIDAKLSo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgNSwgIDUsICAwCi0qNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAotCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgRmx1c2hcbiIpKTsKLQlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwLypSYyovKTsKLQotIwotIyBJSS4zLjMgRW5mb3JjZSBJbi1vcmRlciBFeGVjdXRpb24gb2YgSS9PIEluc3RydWN0aW9uCi0jCi0KLTAuMzEsNi4vLDExLi8sMTYuLywyMS44NTQsMzEuLzpYOjplaWVpbzpFbmZvcmNlIEluLW9yZGVyIEV4ZWN1dGlvbiBvZiBJL08KLQkvKiBTaW5jZSB0aGlzIG1vZGVsIGhhcyBubyBpbnN0cnVjdGlvbiBvdmVybGFwCi0JICAgdGhpcyBpbnN0cnVjdGlvbiBuZWVkIGRvIG5vdGhpbmcgKi8KLQotIwotIyBJSS40LjEgVGltZSBCYXNlIEluc3RydWN0aW9ucwotIwotCi0wLjMxLDYuUlQsMTEudGJyLDIxLjM3MSwzMS4vOlhGWDo6bWZ0YjpNb3ZlIEZyb20gVGltZSBCYXNlCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMywgIDMsICAwCi0JaW50IG4gPSAodGJyezU6OX0gPDwgNSkgfCB0YnJ7MDo0fTsKLQlpZiAobiA9PSAyNjgpIHsKLQkgIGlmIChpc182NGJpdF9pbXBsZW1lbnRhdGlvbikgKnJUID0gVEI7Ci0JICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICpyVCA9IEVYVFJBQ1RFRDY0KFRCLCAzMiwgNjMpOwotCX0KLQllbHNlIGlmIChuID09IDI2OSkgewotCSAgaWYgKGlzXzY0Yml0X2ltcGxlbWVudGF0aW9uKSAqclQgPSBFWFRSQUNURUQ2NChUQiwgMCwgMzEpOwotCSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAqclQgPSBFWFRSQUNURUQ2NChUQiwgMCwgMzEpOwotCX0KLQllbHNlCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCi0KLSMKLSMgSUlJLjIuMy4xIFN5c3RlbSBMaW5rYWdlIEluc3RydWN0aW9ucwotIwotCi0wLjE5LDYuLywxMS4vLDE2Li8sMjEuNTAsMzEuLzpYTDo6cmZpOlJldHVybiBGcm9tIEludGVycnVwdAotKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKLSo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMywgIDMsICAwCi0qNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAotKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAzLCAgMywgIDAKLQlpZiAoSVNfUFJPQkxFTV9TVEFURShwcm9jZXNzb3IpKSB7Ci0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCX0KLQllbHNlIHsKLQkgIE1TUiA9IChNQVNLRUQoU1JSMSwgMCwgMzIpCi0JICAgICAgICAgfCBNQVNLRUQoU1JSMSwgMzcsIDQxKQotCSAgICAgICAgIHwgTUFTS0VEKFNSUjEsIDQ4LCA2MykpOwotCSAgTklBID0gTUFTS0VEKFNSUjAsIDAsIDYxKTsKLQkgIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3NvciwgY2lhKTsKLQkgIGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKHByb2Nlc3Nvcik7Ci0JfQotCi0jCi0jIElJSS4zLjQuMSBNb3ZlIHRvL2Zyb20gU3lzdGVtIFJlZ2lzdGVyIEluc3RydWN0aW9ucwotIwotCi0jMC4zMSw2LlJTLDExLlNQUiwyMS40NjcsMzEuLzpYRlg6OjpNb3ZlIFRvIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcgotIzAuMzEsNi5SVCwxMS5TUFIsMjEuMzM5LDMxLi86WEZYOjo6TW92ZSBGcm9tIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcgotMC4zMSw2LlJTLDExLi8sMTYuLywyMS4xNDYsMzEuLzpYOjo6TW92ZSBUbyBNYWNoaW5lIFN0YXRlIFJlZ2lzdGVyCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMiwgIDIsICAwCi0qNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAotCWlmIChJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UgewotCSAgTVNSID0gKnJTOwotCSAgY2hlY2tfbWFza2VkX2ludGVycnVwdHMocHJvY2Vzc29yKTsKLQl9Ci0KLTAuMzEsNi5SVCwxMS4vLDE2Li8sMjEuODMsMzEuLzpYOjo6TW92ZSBGcm9tIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMywgIDMsICAwCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICAqclQgPSBNU1I7Ci0JICBjaGVja19tYXNrZWRfaW50ZXJydXB0cyhwcm9jZXNzb3IpOwotCX0KLQotCi0jCi0jIElJSS40LjExLjEgQ2FjaGUgTWFuYWdlbWVudCBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuNDcwLDMxLi86WDo6ZGNiaTpEYXRhIENhY2hlIEJsb2NrIEludmFsaWRhdGUKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDIsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZQotCSAgVFJBQ0UodHJhY2VfdGJkLCgiRGF0YSBDYWNoZSBCbG9jayBJbnZhbGlkYXRlXG4iKSk7Ci0KLSMKLSMgSUlJLjQuMTEuMiBTZWdtZW50IFJlZ2lzdGVyIE1hbmlwdWxhdGlvbiBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2LlJTLDExLi8sMTIuU1IsMTYuLywyMS4yMTAsMzEuLzpYOjMyOm10c3IgJVNSLCVSUzpNb3ZlIFRvIFNlZ21lbnQgUmVnaXN0ZXIKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDIsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZQotCSAgU0VHUkVHKFNSKSA9ICpyUzsKLQotMC4zMSw2LlJTLDExLi8sMTYuUkIsMjEuMjQyLDMxLi86WDozMjptdHNyaW4gJVJTLCVSQjpNb3ZlIFRvIFNlZ21lbnQgUmVnaXN0ZXIgSW5kaXJlY3QKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDIsICAyLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZQotCSAgU0VHUkVHKEVYVFJBQ1RFRDMyKCpyQiwgMCwgMykpID0gKnJTOwotCi0wLjMxLDYuUlQsMTEuLywxMi5TUiwxNi4vLDIxLjU5NSwzMS4vOlg6MzI6bWZzciAlUlQsJVJTOk1vdmUgRnJvbSBTZWdtZW50IFJlZ2lzdGVyCi0qNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAotKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKLSo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMywgIDMsICAwCi0qNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAotCWlmIChJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCi0JICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKLQkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOwotCWVsc2UKLQkgICpyVCA9IFNFR1JFRyhTUik7Ci0KLTAuMzEsNi5SVCwxMS4vLDE2LlJCLDIxLjY1OSwzMS4vOlg6MzI6bWZzcmluICVSVCwlUkI6TW92ZSBGcm9tIFNlZ21lbnQgUmVnaXN0ZXIgSW5kaXJlY3QKLSo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCi0qNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAotKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKLSo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZQotCSAgKnJUID0gU0VHUkVHKEVYVFJBQ1RFRDMyKCpyQiwgMCwgMykpOwotCi0KLSMKLSMgSUlJLjQuMTEuMyBMb29rYXNpZGUgQnVmZmVyIE1hbmFnZW1lbnQgSW5zdHJ1Y3Rpb25zIChPcHRpb25hbCkKLSMKLQotMC4zMSw2Li8sMTEuLywxNi5SQiwyMS40MzQsMzEuLzpYOjY0OjpTTEIgSW52YWxpZGF0ZSBFbnRyeQotCi0wLjMxLDYuLywxMS4vLDE2Li8sMjEuNDk4LDMxLi86WDo2NDo6U0xCIEludmFsaWRhdGUgQWxsCi0KLTAuMzEsNi4vLDExLi8sMTYuUkIsMjEuMzA2LDMxLi86WDo6OlRMQiBJbnZhbGlkYXRlIEVudHJ5Ci0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICBpbnQgbnIgPSAwOwotCSAgY3B1ICpwcm9jOwotCSAgd2hpbGUgKDEpIHsKLQkgICAgcHJvYyA9IHBzaW1fY3B1KGNwdV9zeXN0ZW0ocHJvY2Vzc29yKSwgbnIpOwotCSAgICBpZiAocHJvYyA9PSBOVUxMKSBicmVhazsKLQkgICAgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkocHJvYywgKnJCKTsKLQkgICAgbnIrKzsKLQkgIH0KLQl9Ci0KLTAuMzEsNi4vLDExLi8sMTYuLywyMS4zNzAsMzEuLzpYOjo6VExCIEludmFsaWRhdGUgQWxsCi0JaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKLQkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAotCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7Ci0JZWxzZSB7Ci0JICBpbnQgbnIgPSAwOwotCSAgY3B1ICpwcm9jOwotCSAgd2hpbGUgKDEpIHsKLQkgICAgcHJvYyA9IHBzaW1fY3B1KGNwdV9zeXN0ZW0ocHJvY2Vzc29yKSwgbnIpOwotCSAgICBpZiAocHJvYyA9PSBOVUxMKSBicmVhazsKLQkgICAgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKHByb2MpOwotCSAgICBucisrOwotCSAgfQotCX0KLQotMC4zMSw2Li8sMTEuLywxNi4vLDIxLjU2NiwzMS4vOlg6OjpUTEIgU3luY2hyb25pemUKLQkvKiBub3RoaW5nIGhhcHBlbnMgaGVyZSAtIGFsd2F5cyBpbiBzeW5jICovCi0KLSMKLSMgSUlJLkEuMS4yIEV4dGVybmFsIEFjY2VzcyBJbnN0cnVjdGlvbnMKLSMKLQotMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjMxMCwzMS4vOlg6ZWFyd2F4OjpFeHRlcm5hbCBDb250cm9sIEluIFdvcmQgSW5kZXhlZAotCi0wLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDM4LDMxLi86WDplYXJ3YXg6OkV4dGVybmFsIENvbnRyb2wgT3V0IFdvcmQgSW5kZXhlZApkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wcGMtc3ByLXRhYmxlIGIvc2ltL3BwYy9wcGMtc3ByLXRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U2NTMyLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvcHBjLXNwci10YWJsZQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMKLSMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotIwotIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLQotIyBOYW1lOnJlZy1ucjpyZWFkLW9ubHk6bGVuZ3RoCi1NUTowOjA6MAotWEVSOjE6MDowCi1SVENVOjQ6MDowCi1SVENMOjU6MDowCi1MUjo4OjA6MAotQ1RSOjk6MDowCi1EU0lTUjoxODowOjAKLURBUjoxOTowOjAKLURFQzoyMjowOjAKLVNEUjE6MjU6MDowCi1TUlIwOjI2OjA6MAotU1JSMToyNzowOjAKLVNQUkcwOjI3MjowOjAKLVNQUkcxOjI3MzowOjAKLVNQUkcyOjI3NDowOjAKLVNQUkczOjI3NTowOjAKLUVBUjoyODI6MDowCi1UQkw6Mjg0OjA6MAotVEJVOjI4NTowOjAKLVBWUjoyODc6MDowCi1JQkFUMFU6NTI4OjA6MAotSUJBVDBMOjUyOTowOjAKLUlCQVQxVTo1MzA6MDowCi1JQkFUMUw6NTMxOjA6MAotSUJBVDJVOjUzMjowOjAKLUlCQVQyTDo1MzM6MDowCi1JQkFUM1U6NTM0OjA6MAotSUJBVDNMOjUzNTowOjAKLURCQVQwVTo1MzY6MDowCi1EQkFUMEw6NTM3OjA6MAotREJBVDFVOjUzODowOjAKLURCQVQxTDo1Mzk6MDowCi1EQkFUMlU6NTQwOjA6MAotREJBVDJMOjU0MTowOjAKLURCQVQzVTo1NDI6MDowCi1EQkFUM0w6NTQzOjA6MAotVU1NQ1IwOjkzNjowOjAKLVVNTUNSMTo5NDA6MDowCi1VUE1DMTo5Mzc6MDowCi1VUE1DMjo5Mzg6MDowCi1VU0lBOjkzOTowOjAKLVVQTUMzOjk0MTowOjAKLVVQTUM0Ojk0MjowOjAKLU1NQ1IwOjk1MjowOjAKLVBNQzE6OTUzOjA6MAotUE1DMjo5NTQ6MDowCi1TSUE6OTU1OjA6MAotTU1DUjE6OTU2OjA6MAotUE1DMzo5NTc6MDowCi1QTUM0Ojk1ODowOjAKLURNSVNTOjk3NjowOjAKLURDTVA6OTc3OjA6MAotSEFTSDE6OTc4OjA6MAotSEFTSDI6OTc5OjA6MAotSU1JU1M6OTgwOjA6MAotSUNNUDo5ODE6MDowCi1SUEE6OTgyOjA6MAotSElEMDoxMDA4OjA6MAotSElEMToxMDA5OjA6MAotSUFCUjoxMDEwOjA6MAotREFCUjoxMDEzOjA6MAotTDJDUjoxMDE3OjA6MAotSUNUQzoxMDE5OjA6MAotVEhSTTE6MTAyMDowOjAKLVRIUk0yOjEwMjE6MDowCi1USFJNMzoxMDIyOjA6MAotSElEMTU6MTAyMzowOjAKZGlmZiAtLWdpdCBhL3NpbS9wcGMvcHBjLm10IGIvc2ltL3BwYy9wcGMubXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmM2VhNjguLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9wcGMubXQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUFMTD1hbGwtcHBjCi1DTEVBTj1jbGVhbi1wcGMKLURPX0lOU1RBTEw9aW5zdGFsbC1wcGMKZGlmZiAtLWdpdCBhL3NpbS9wcGMvcHNpbS5jIGIvc2ltL3BwYy9wc2ltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDg0M2IuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9wc2ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1BTSU1fQ18KLSNkZWZpbmUgX1BTSU1fQ18KLQotI2luY2x1ZGUgImNwdS5oIiAvKiBpbmNsdWRlcyBwc2ltLmggKi8KLSNpbmNsdWRlICJpZGVjb2RlLmgiCi0jaW5jbHVkZSAib3B0aW9ucy5oIgotCi0jaW5jbHVkZSAidHJlZS5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLQotI2luY2x1ZGUgImJmZC5oIgotCi0KLS8qIHN5c3RlbSBzdHJ1Y3R1cmUsIGFjdHVhbCBzaXplIG9mIHByb2Nlc3NvciBhcnJheSBkZXRlcm1pbmVkIGF0Ci0gICBydW50aW1lICovCi0KLXN0cnVjdCBfcHNpbSB7Ci0gIGV2ZW50X3F1ZXVlICpldmVudHM7Ci0gIGRldmljZSAqZGV2aWNlczsKLSAgbW9uICptb25pdG9yOwotICBvc19lbXVsICpvc19lbXVsYXRpb247Ci0gIGNvcmUgKm1lbW9yeTsKLQotICAvKiBlc2NhcGUgcm91dGluZSBmb3IgaW5uZXIgZnVuY3Rpb25zICovCi0gIHZvaWQgKnBhdGhfdG9faGFsdDsKLSAgdm9pZCAqcGF0aF90b19yZXN0YXJ0OwotCi0gIC8qIHN0YXR1cyBmcm9tIGxhc3QgaGFsdCAqLwotICBwc2ltX3N0YXR1cyBoYWx0X3N0YXR1czsKLQotICAvKiB0aGUgcHJvY2Vzc29ycyBwcm9wZXIgKi8KLSAgaW50IG5yX2NwdXM7Ci0gIGludCBsYXN0X2NwdTsgLyogQ1BVIHRoYXQgbGFzdCAodHJpZWQgdG8pIGV4ZWN1dGUgYW4gaW5zdHJ1Y3Rpb24gKi8KLSAgY3B1ICpwcm9jZXNzb3JzW01BWF9OUl9QUk9DRVNTT1JTXTsKLX07Ci0KLQotaW50IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXI7Ci1pbnQgY3VycmVudF9ob3N0X2J5dGVfb3JkZXI7Ci1pbnQgY3VycmVudF9lbnZpcm9ubWVudDsKLWludCBjdXJyZW50X2FsaWdubWVudDsKLWludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OwotaW50IGN1cnJlbnRfbW9kZWxfaXNzdWUgPSBNT0RFTF9JU1NVRV9JR05PUkU7Ci1pbnQgY3VycmVudF9zdGRpbyA9IERPX1VTRV9TVERJTzsKLW1vZGVsX2VudW0gY3VycmVudF9tb2RlbCA9IFdJVEhfREVGQVVMVF9NT0RFTDsKLQotCi0vKiBjcmVhdGUgdGhlIGRldmljZSB0cmVlICovCi0KLUlOTElORV9QU0lNXAotKGRldmljZSAqKQotcHNpbV90cmVlKHZvaWQpCi17Ci0gIGRldmljZSAqcm9vdCA9IHRyZWVfcGFyc2UoTlVMTCwgImNvcmUiKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL2FsaWFzZXMiKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMiKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL2Nob3NlbiIpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvcGFja2FnZXMiKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL2NwdXMiKTsKLSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tIik7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0Iik7Ci0gIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS90cmFjZSIpOwotICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vb3B0aW9ucyIpOwotICByZXR1cm4gcm9vdDsKLX0KLQotU1RBVElDX0lOTElORV9QU0lNXAotKGNoYXIgKikKLWZpbmRfYXJnKGNoYXIgKmVycl9tc2csCi0JIGludCAqcHRyX3RvX2FyZ3AsCi0JIGNoYXIgKiphcmd2KQotewotICAqcHRyX3RvX2FyZ3AgKz0gMTsKLSAgaWYgKGFyZ3ZbKnB0cl90b19hcmdwXSA9PSBOVUxMKQotICAgIGVycm9yKGVycl9tc2cpOwotICByZXR1cm4gYXJndlsqcHRyX3RvX2FyZ3BdOwotfQotCi1JTkxJTkVfUFNJTVwKLSh2b2lkKQotcHNpbV91c2FnZShpbnQgdmVyYm9zZSkKLXsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJVc2FnZTpcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHRwc2ltIFsgPHBzaW0tb3B0aW9uPiAuLi4gXSA8aW1hZ2U+IFsgPGltYWdlLWFyZz4gLi4uIF1cbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiV2hlcmVcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQ8aW1hZ2U+ICAgICAgICAgTmFtZSBvZiB0aGUgUG93ZXJQQyBwcm9ncmFtIHRvIHJ1bi5cbiIpOwotICBpZiAodmVyYm9zZSkgewotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIFRoaXMgY2FuIGVpdGhlciBiZSBhIFBvd2VyUEMgYmluYXJ5IG9yXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBhIHRleHQgZmlsZSBjb250YWluaW5nIGEgZGV2aWNlIHRyZWVcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24uXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBQU0lNIHdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgZnJvbSB0aGVcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIHNwZWNpZmllZCA8aW1hZ2U+IHRoZSBpbnRlbmRlZCBlbXVsYXRpb25cbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGVudmlyb25tZW50LlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgSWYgUFNJTSBnZXRzIGl0IHdyb25nLCB0aGUgZW11bGF0aW9uXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZVxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgYC1lJyBvcHRpb24gKGRlc2NyaWJlZCBiZWxvdykuXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQ8aW1hZ2UtYXJnPiAgICAgQXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIDxpbWFnZT5cbiIpOwotICBpZiAodmVyYm9zZSkgewotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIFRoZXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0b1xuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgPGltYWdlPiAoYXMgc3RhbmRhcmQgQyBhcmd2LCBhcmdjKVxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgd2hlbiA8aW1hZ2U+IGlzIHN0YXJ0ZWQuXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQ8cHNpbS1vcHRpb24+ICAgU2VlIGJlbG93XG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIDxwc2ltLW9wdGlvbj5zOlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKLQotICBwcmludGZfZmlsdGVyZWQoIlx0LWMgPGNvdW50PiAgICAgIExpbWl0IHRoZSBzaW11bGF0aW9uIHRvIDxjb3VudD4gaXRlcmF0aW9uc1xuIik7Ci0gIGlmICh2ZXJib3NlKSB7IAotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLQotICBwcmludGZfZmlsdGVyZWQoIlx0LWkgb3IgLWkyICAgICAgIFByaW50IGluc3RydWN0aW9uIGNvdW50aW5nIHN0YXRpc3RpY3NcbiIpOwotICBpZiAodmVyYm9zZSkgeyAKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBTcGVjaWZ5IC1pMiBmb3IgYSBtb3JlIGRldGFpbGVkIGRpc3BsYXlcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLQotICBwcmludGZfZmlsdGVyZWQoIlx0LUkgICAgICAgICAgICAgIFByaW50IGV4ZWN1dGlvbiB1bml0IHN0YXRpc3RpY3NcbiIpOwotICBpZiAodmVyYm9zZSkgeyBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KLQotICBwcmludGZfZmlsdGVyZWQoIlx0LWUgPG9zLWVtdWw+ICAgIHNwZWNpZnkgYW4gT1Mgb3IgcGxhdGZvcm0gdG8gbW9kZWxcbiIpOwotICBpZiAodmVyYm9zZSkgewotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzpcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGJ1ZyAtIE9FQSArIE1PVE8gQlVHIFJPTSBjYWxsc1xuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgbmV0YnNkIC0gVUVBICsgTmV0QlNEIHN5c3RlbSBjYWxsc1xuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgc29sYXJpcyAtIFVFQSArIFNvbGFyaXMgc3lzdGVtIGNhbGxzXG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBsaW51eCAtIFVFQSArIExpbnV4IHN5c3RlbSBjYWxsc1xuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgY2hpcnAgLSBPRUEgKyBhIGZldyBPcGVuQm9vdCBjYWxsc1xuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQtRSA8ZW5kaWFuPiAgICAgU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0XG4iKTsKLSAgaWYgKHZlcmJvc2UpIHsgCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgYmlnIC0gYmlnIGVuZGlhbiB0YXJnZXRcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGxpdHRsZSAtIGxpdHRsZSBlbmRpYW4gdGFyZ2V0XG4iKTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9Ci0KLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdC1mIDxmaWxlPiAgICAgICBNZXJnZSA8ZmlsZT4gaW50byB0aGUgZGV2aWNlIHRyZWVcbiIpOwotICBpZiAodmVyYm9zZSkgeyBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KLQotICBwcmludGZfZmlsdGVyZWQoIlx0LWggLT8gLUggICAgICAgIGdpdmUgbW9yZSBkZXRhaWxlZCB1c2FnZVxuIik7Ci0gIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQtbSA8bW9kZWw+ICAgICAgU3BlY2lmeSB0aGUgcHJvY2Vzc29yIHRvIG1vZGVsICg2MDQpXG4iKTsKLSAgaWYgKHZlcmJvc2UpIHsKLSAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBTZWxlY3RzIHRoZSBwcm9jZXNzb3IgdG8gdXNlIHdoZW5cbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIG1vZGVsaW5nIGV4ZWN1dGlvbiB1bml0cy4gIEluY2x1ZGVzOlxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgNjA0LCA2MDMgYW5kIDYwM2VcbiIpOwotICBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KLQotICBwcmludGZfZmlsdGVyZWQoIlx0LW4gPG5yLXNtcD4gICAgIFNwZWNpZnkgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGluIFNNUCBzaW11bGF0aW9uc1xuIik7Ci0gIGlmICh2ZXJib3NlKSB7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0IGFyZVxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgdG8gYmUgbW9kZWxlZCBpbiBhIHN5bWV0cmljIG11bHRpLXByb2Nlc3NvciAoU01QKVxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgc2ltdWxhdGlvblxuIik7Ci0gIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQtbyA8ZGV2LXNwZWM+ICAgQWRkIGRldmljZSA8ZGV2LXNwZWM+IHRvIHRoZSBkZXZpY2UgdHJlZVxuIik7Ci0gIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQtciA8cmFtLXNpemU+ICAgU2V0IFJBTSBzaXplIGluIGJ5dGVzIChPRUEgZW52aXJvbm1lbnRzKVxuIik7Ci0gIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXHQtdCBbIV08dHJhY2U+ICAgRW5hYmxlIChkaXNhYmxlKSA8dHJhY2U+IG9wdGlvblxuIik7Ci0gIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQotCi0gIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKLSAgdHJhY2VfdXNhZ2UodmVyYm9zZSk7Ci0gIGRldmljZV91c2FnZSh2ZXJib3NlKTsKLSAgaWYgKHZlcmJvc2UgPiAxKSB7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICAgIHByaW50X29wdGlvbnMoKTsKLSAgfQotICBlcnJvcigiIik7Ci19Ci0KLS8qIFRlc3QgInN0cmluZyIgZm9yIGNvbnRhaW5pbmcgYSBzdHJpbmcgb2YgZGlnaXRzIHRoYXQgZm9ybSBhIG51bWJlcgotYmV0d2VlbiAibWluIiBhbmQgIm1heCIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb3IgImVyciIuICovCi1zdGF0aWMKLWludCBpc19udW0oIGNoYXIgKnN0cmluZywgaW50IG1pbiwgaW50IG1heCwgaW50IGVycikKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgZm9yICggOyAqc3RyaW5nOyArK3N0cmluZykKLSAgewotICAgIGlmICghaXNkaWdpdCgqc3RyaW5nKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlcnI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyAoKnN0cmluZyAtICcwJyk7Ci0gIH0KLSAgaWYgKHJlc3VsdCA8IG1pbiB8fCByZXN1bHQgPiBtYXgpCi0gICAgcmVzdWx0ID0gZXJyOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUlOTElORV9QU0lNXAotKGNoYXIgKiopCi1wc2ltX29wdGlvbnMoZGV2aWNlICpyb290LAotCSAgICAgY2hhciAqKmFyZ3YpCi17Ci0gIGRldmljZSAqY3VycmVudCA9IHJvb3Q7Ci0gIGludCBhcmdwOwotICBpZiAoYXJndiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBhcmdwID0gMDsKLSAgd2hpbGUgKGFyZ3ZbYXJncF0gIT0gTlVMTCAmJiBhcmd2W2FyZ3BdWzBdID09ICctJykgewotICAgIGNoYXIgKnAgPSBhcmd2W2FyZ3BdICsgMTsKLSAgICBjaGFyICpwYXJhbTsKLSAgICB3aGlsZSAoKnAgIT0gJ1wwJykgewotICAgICAgc3dpdGNoICgqcCkgewotICAgICAgZGVmYXVsdDoKLQlwc2ltX3VzYWdlKDApOwotCWVycm9yICgiIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdjJzoKLQlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxjb3VudD4gb3B0aW9uIGZvciAtYyAobWF4LWl0ZXJhdGlvbnMpXG4iLCAmYXJncCwgYXJndik7Ci0JdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbWF4LWl0ZXJhdGlvbnMgJXMiLCBwYXJhbSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdlJzoKLQlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxlbXVsPiBvcHRpb24gZm9yIC1lIChvcy1lbXVsKVxuIiwgJmFyZ3AsIGFyZ3YpOwotCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29zLWVtdWwgJXMiLCBwYXJhbSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdFJzoKLQkvKiBlbmRpYW4gc3BlYywgaWdub3JlZCBmb3Igbm93ICovCi0JcGFyYW0gPSBmaW5kX2FyZygiTWlzc2luZyA8ZW5kaWFuPiBvcHRpb24gZm9yIC1FICh0YXJnZXQtZW5kaWFuKVxuIiwgJmFyZ3AsIGFyZ3YpOwotCWlmIChzdHJjbXAgKHBhcmFtLCAiYmlnIikgPT0gMCkKLQkgIHRyZWVfcGFyc2UgKHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyBmYWxzZSIpOwotCWVsc2UgaWYgKHN0cmNtcCAocGFyYW0sICJsaXR0bGUiKSA9PSAwKQotCSAgdHJlZV9wYXJzZSAocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IHRydWUiKTsKLQllbHNlCi0JICB7Ci0JICAgIHByaW50Zl9maWx0ZXJlZCAoIkludmFsaWQgPGVuZGlhbj4gb3B0aW9uIGZvciAtRSAodGFyZ2V0LWVuZGlhbilcbiIpOwotCSAgICBwc2ltX3VzYWdlICgwKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgJ2YnOgotCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPGZpbGU+IG9wdGlvbiBmb3IgLWZcbiIsICZhcmdwLCBhcmd2KTsKLQlwc2ltX21lcmdlX2RldmljZV9maWxlKHJvb3QsIHBhcmFtKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ2gnOgotICAgICAgY2FzZSAnPyc6Ci0JcHNpbV91c2FnZSgxKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ0gnOgotCXBzaW1fdXNhZ2UoMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdpJzoKLQlpZiAoaXNkaWdpdChwWzFdKSkgewotCSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3RyYWNlL3ByaW50LWluZm8gJWMiLCBwWzFdKTsKLQkgIHArKzsKLQl9Ci0JZWxzZSB7Ci0JICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdHJhY2UvcHJpbnQtaW5mbyAxIik7Ci0JfQotCWJyZWFrOwotICAgICAgY2FzZSAnSSc6Ci0JdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3RyYWNlL3ByaW50LWluZm8gMiIpOwotCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL21vZGVsLWlzc3VlICVkIiwKLQkJICAgTU9ERUxfSVNTVUVfUFJPQ0VTUyk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdtJzoKLQlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxtb2RlbD4gb3B0aW9uIGZvciAtbSAobW9kZWwpXG4iLCAmYXJncCwgYXJndik7Ci0JdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwgXCIlcyIsIHBhcmFtKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ24nOgotCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPG5yLXNtcD4gb3B0aW9uIGZvciAtbiAoc21wKVxuIiwgJmFyZ3AsIGFyZ3YpOwotCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL3NtcCAlcyIsIHBhcmFtKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ28nOgotCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPGRldi1zcGVjPiBvcHRpb24gZm9yIC1vXG4iLCAmYXJncCwgYXJndik7Ci0JaWYgKG1lbWNtcChwYXJhbSwgIm1wYzg2MGMwIiwgOCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJhbVs4XSA9PSAnXDAnKQotICAgICAgICAgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvbXBjODYwYzAgNSIpOwotICAgICAgICAgIGVsc2UgaWYgKHBhcmFtWzhdID09ICc9JyAmJiBpc19udW0ocGFyYW0rOSwgMSwgMTAsIDApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcHRpb25zL21wYzg2MGMwICVzIiwgcGFyYW0rOSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgZXJyb3IoIkludmFsaWQgbXBjODYwYzAgb3B0aW9uIGZvciAtb1xuIik7Ci0gICAgICAgIH0KLQllbHNlCi0gICAgICAgICAgY3VycmVudCA9IHRyZWVfcGFyc2UoY3VycmVudCwgIiVzIiwgcGFyYW0pOwotCWJyZWFrOwotICAgICAgY2FzZSAncic6Ci0JcGFyYW0gPSBmaW5kX2FyZygiTWlzc2luZyA8cmFtLXNpemU+IG9wdGlvbiBmb3IgLXIgKG9lYS1tZW1vcnktc2l6ZSlcbiIsICZhcmdwLCBhcmd2KTsKLQl0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vZWEtbWVtb3J5LXNpemUgJXMiLAotCQkJICAgICAgIHBhcmFtKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ3QnOgotCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPHRyYWNlPiBvcHRpb24gZm9yIC10ICh0cmFjZS8qKVxuIiwgJmFyZ3AsIGFyZ3YpOwotCWlmIChwYXJhbVswXSA9PSAnIScpCi0JICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdHJhY2UvJXMgMCIsIHBhcmFtKzEpOwotCWVsc2UKLQkgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS90cmFjZS8lcyAxIiwgcGFyYW0pOwotCWJyZWFrOwotICAgICAgfQotICAgICAgcCArPSAxOwotICAgIH0KLSAgICBhcmdwICs9IDE7Ci0gIH0KLSAgLyogZm9yY2UgdGhlIHRyYWNlIG5vZGUgdG8gcHJvY2VzcyBpdHMgb3B0aW9ucyBub3cgKmJlZm9yZSogdGhlIHRyZWUKLSAgICAgaW5pdGlhbGl6YXRpb24gb2NjdXJlcyAqLwotICBkZXZpY2VfaW9jdGwodHJlZV9maW5kX2RldmljZShyb290LCAiL29wZW5wcm9tL3RyYWNlIiksCi0JICAgICAgIE5VTEwsIDAsCi0JICAgICAgIGRldmljZV9pb2N0bF9zZXRfdHJhY2UpOwotCi0gIHsKLSAgICB2b2lkIHNlbWFudGljX2luaXQoZGV2aWNlKiByb290KTsKLSAgICBzZW1hbnRpY19pbml0KHJvb3QpOwotICB9Ci0KLSAgLyogcmV0dXJuIHdoZXJlIHRoZSBvcHRpb25zIGVuZCAqLwotICByZXR1cm4gYXJndiArIGFyZ3A7Ci19Ci0KLUlOTElORV9QU0lNXAotKHZvaWQpCi1wc2ltX2NvbW1hbmQoZGV2aWNlICpyb290LAotCSAgICAgY2hhciAqKmFyZ3YpCi17Ci0gIGludCBhcmdwID0gMDsKLSAgaWYgKGFyZ3ZbYXJncF0gPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAoYXJndlthcmdwXSwgInRyYWNlIikgPT0gMCkgewotICAgIGNvbnN0IGNoYXIgKm9wdCA9IGZpbmRfYXJnKCJNaXNzaW5nIDx0cmFjZT4gb3B0aW9uIiwgJmFyZ3AsIGFyZ3YpOwotICAgIGlmIChvcHRbMF0gPT0gJyEnKQotICAgICAgdHJhY2Vfb3B0aW9uKG9wdCArIDEsIDApOwotICAgIGVsc2UKLSAgICAgIHRyYWNlX29wdGlvbihvcHQsIDEpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImNoYW5nZS1tZWRpYSIpID09IDApIHsKLSAgICBjaGFyICpkZXZpY2UgPSBmaW5kX2FyZygiTWlzc2luZyBkZXZpY2UgbmFtZSIsICZhcmdwLCBhcmd2KTsKLSAgICBjaGFyICptZWRpYSA9IGFyZ3ZbKythcmdwXTsKLSAgICBkZXZpY2VfaW9jdGwodHJlZV9maW5kX2RldmljZShyb290LCBkZXZpY2UpLCBOVUxMLCAwLAotCQkgZGV2aWNlX2lvY3RsX2NoYW5nZV9tZWRpYSwgbWVkaWEpOwotICB9Ci0gIGVsc2UgewotICAgIHByaW50Zl9maWx0ZXJlZCgiVW5rbm93biBQU0lNIGNvbW1hbmQgJXMsIHRyeVxuIiwgYXJndlthcmdwXSk7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgdHJhY2UgPHRyYWNlLW9wdGlvbj5cbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiICAgIGNoYW5nZS1tZWRpYSA8ZGV2aWNlPiBbIDxuZXctaW1hZ2U+IF1cbiIpOwotICB9Ci19Ci0KLQotLyogY3JlYXRlIHRoZSBzaW11bGF0b3IgcHJvcGVyIGZyb20gdGhlIGRldmljZSB0cmVlIGFuZCBleGVjdXRhYmxlICovCi0KLUlOTElORV9QU0lNXAotKHBzaW0gKikKLXBzaW1fY3JlYXRlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkgICAgZGV2aWNlICpyb290KQotewotICBpbnQgY3B1X25yOwotICBjb25zdCBjaGFyICplbnY7Ci0gIHBzaW0gKnN5c3RlbTsKLSAgb3NfZW11bCAqb3NfZW11bGF0aW9uOwotICBpbnQgbnJfY3B1czsKLQotICAvKiBnaXZlbiB0aGlzIHBhcnRpYWxseSBwb3B1bGF0ZWQgZGV2aWNlIHRyZWUsIG9zX2VtdWxfY3JlYXRlKCkgdXNlcwotICAgICBpdCBhbmQgZmlsZV9uYW1lIHRvIGRldGVybWluZSB0aGUgc2VsZWN0ZWQgZW11bGF0aW9uIGFuZCBoZW5jZQotICAgICBmdXJ0aGVyIHBvcHVsYXRlIHRoZSB0cmVlIHdpdGggYW55IG90aGVyIHJlcXVpcmVkIG5vZGVzLiAqLwotCi0gIG9zX2VtdWxhdGlvbiA9IG9zX2VtdWxfY3JlYXRlKGZpbGVfbmFtZSwgcm9vdCk7Ci0gIGlmIChvc19lbXVsYXRpb24gPT0gTlVMTCkKLSAgICBlcnJvcigicHNpbTogZWl0aGVyIGZpbGUgJXMgd2FzIG5vdCByZWNvbml6ZWQgb3IgdW5yZWNvbml6ZWQgb3IgdW5rbm93biBvcy1lbXVsYXRpb24gdHlwZVxuIiwgZmlsZV9uYW1lKTsKLQotICAvKiBmaWxsIGluIHRoZSBtaXNzaW5nIHJlYWwgbnVtYmVyIG9mIENQVSdzICovCi0gIG5yX2NwdXMgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvc21wIik7Ci0gIGlmIChNQVhfTlJfUFJPQ0VTU09SUyA8IG5yX2NwdXMpCi0gICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBudW1iZXIgb2YgY3B1cyBjb25mbGljdFxuIik7Ci0KLSAgLyogZmlsbCBpbiB0aGUgbWlzc2luZyBUQVJHRVQgQllURSBPUkRFUiBpbmZvcm1hdGlvbiAqLwotICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyCi0gICAgPSAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IikKLSAgICAgICA/IExJVFRMRV9FTkRJQU4KLSAgICAgICA6IEJJR19FTkRJQU4pOwotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAhPSBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyKQotICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgYnl0ZSBvcmRlciBjb25mbGljdFxuIik7Ci0KLSAgLyogZmlsbCBpbiB0aGUgbWlzc2luZyBIT1NUIEJZVEUgT1JERVIgaW5mb3JtYXRpb24gKi8KLSAgY3VycmVudF9ob3N0X2J5dGVfb3JkZXIgPSAoY3VycmVudF9ob3N0X2J5dGVfb3JkZXIgPSAxLAotCQkJICAgICAoKihjaGFyKikoJmN1cnJlbnRfaG9zdF9ieXRlX29yZGVyKQotCQkJICAgICAgPyBMSVRUTEVfRU5ESUFOCi0JCQkgICAgICA6IEJJR19FTkRJQU4pKTsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSICE9IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyKQotICAgIGVycm9yKCJob3N0IGFuZCBjb25maWd1cmVkIGJ5dGUgb3JkZXIgY29uZmxpY3RcbiIpOwotCi0gIC8qIGZpbGwgaW4gdGhlIG1pc3NpbmcgT0VBL1ZFQSBpbmZvcm1hdGlvbiAqLwotICBlbnYgPSB0cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9lbnYiKTsKLSAgY3VycmVudF9lbnZpcm9ubWVudCA9ICgoc3RyY21wKGVudiwgInVzZXIiKSA9PSAwCi0JCQkgIHx8IHN0cmNtcChlbnYsICJ1ZWEiKSA9PSAwKQotCQkJID8gVVNFUl9FTlZJUk9OTUVOVAotCQkJIDogKHN0cmNtcChlbnYsICJ2aXJ0dWFsIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcChlbnYsICJ2ZWEiKSA9PSAwKQotCQkJID8gVklSVFVBTF9FTlZJUk9OTUVOVAotCQkJIDogKHN0cmNtcChlbnYsICJvcGVyYXRpbmciKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wKGVudiwgIm9lYSIpID09IDApCi0JCQkgPyBPUEVSQVRJTkdfRU5WSVJPTk1FTlQKLQkJCSA6IDApOwotICBpZiAoY3VycmVudF9lbnZpcm9ubWVudCA9PSAwKQotICAgIGVycm9yKCJ1bnJlY29uaXplZCAvb3B0aW9ucyBlbnYgcHJvcGVydHlcbiIpOwotICBpZiAoQ1VSUkVOVF9FTlZJUk9OTUVOVCAhPSBjdXJyZW50X2Vudmlyb25tZW50KQotICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgZW52aXJvbm1lbnQgY29uZmxpY3RcbiIpOwotCi0gIC8qIGZpbGwgaW4gdGhlIG1pc3NpbmcgQUxMSUdOTUVOVCBpbmZvcm1hdGlvbiAqLwotICBjdXJyZW50X2FsaWdubWVudAotICAgID0gKHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9zdHJpY3QtYWxpZ25tZW50PyIpCi0gICAgICAgPyBTVFJJQ1RfQUxJR05NRU5UCi0gICAgICAgOiBOT05TVFJJQ1RfQUxJR05NRU5UKTsKLSAgaWYgKENVUlJFTlRfQUxJR05NRU5UICE9IGN1cnJlbnRfYWxpZ25tZW50KQotICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgYWxpZ25tZW50IGNvbmZsaWN0XG4iKTsKLQotICAvKiBmaWxsIGluIHRoZSBtaXNzaW5nIEZMT0FUSU5HIFBPSU5UIGluZm9ybWF0aW9uICovCi0gIGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQKLSAgICA9ICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvZmxvYXRpbmctcG9pbnQ/IikKLSAgICAgICA/IEhBUkRfRkxPQVRJTkdfUE9JTlQKLSAgICAgICA6IFNPRlRfRkxPQVRJTkdfUE9JTlQpOwotICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCAhPSBjdXJyZW50X2Zsb2F0aW5nX3BvaW50KQotICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgZmxvYXRpbmctcG9pbnQgY29uZmxpY3RcbiIpOwotCi0gIC8qIGZpbGwgaW4gdGhlIG1pc3NpbmcgU1RESU8gaW5mb3JtYXRpb24gKi8KLSAgY3VycmVudF9zdGRpbwotICAgID0gKHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy91c2Utc3RkaW8/IikKLSAgICAgICA/IERPX1VTRV9TVERJTwotICAgICAgIDogRE9OVF9VU0VfU1RESU8pOwotICBpZiAoQ1VSUkVOVF9TVERJTyAhPSBjdXJyZW50X3N0ZGlvKQotICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgc3RkaW8gaW50ZXJmYWNlIGNvbmZsaWN0XG4iKTsKLQotICAvKiBzb3J0IG91dCB0aGUgbGV2ZWwgb2YgZGV0YWlsIGZvciBpc3N1ZSBtb2RlbGluZyAqLwotICBjdXJyZW50X21vZGVsX2lzc3VlCi0gICAgPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwtaXNzdWUiKTsKLSAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgIT0gY3VycmVudF9tb2RlbF9pc3N1ZSkKLSAgICBlcnJvcigidGFyZ2V0IGFuZCBjb25maWd1cmVkIG1vZGVsLWlzc3VlIGNvbmZsaWN0XG4iKTsKLQotICAvKiBzb3J0IG91dCBvdXIgbW9kZWwgYXJjaGl0ZWN0dXJlIC0gd3JvbmcuCi0KLSAgICAgRklYTUU6IHRoaXMgc2hvdWxkIGJlIG9idGFpbmluZyB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgZGV2aWNlIHRyZWUgdmlhIHRoZSAiL2Nob3NlbiIgcHJvcGVydHkgImNwdSIgd2hpY2ggaXMgYW4gaW5zdGFuY2UKLSAgICAgKGloYW5kbGUpIGZvciB0aGUgb25seSBleGVjdXRpbmcgcHJvY2Vzc29yLiBCeSBjb252ZXJ0aW5nIHRoYXQKLSAgICAgaWhhbmRsZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGNwdSdzIHBoYW5kbGUgYW5kIHRoZW4gcXVlcnlpbmcKLSAgICAgdGhlICJuYW1lIiBwcm9wZXJ0eSwgdGhlIGNwdSB0eXBlIGNhbiBiZSBkZXRlcm1pbmVkLiBPaz8gKi8KLQotICBtb2RlbF9zZXQodHJlZV9maW5kX3N0cmluZ19wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwiKSk7Ci0KLSAgLyogY3JlYXRlIHRoaW5ncyAqLwotICBzeXN0ZW0gPSBaQUxMT0MocHNpbSk7Ci0gIHN5c3RlbS0+ZXZlbnRzID0gZXZlbnRfcXVldWVfY3JlYXRlKCk7Ci0gIHN5c3RlbS0+bWVtb3J5ID0gY29yZV9mcm9tX2RldmljZShyb290KTsKLSAgc3lzdGVtLT5tb25pdG9yID0gbW9uX2NyZWF0ZSgpOwotICBzeXN0ZW0tPm5yX2NwdXMgPSBucl9jcHVzOwotICBzeXN0ZW0tPm9zX2VtdWxhdGlvbiA9IG9zX2VtdWxhdGlvbjsKLSAgc3lzdGVtLT5kZXZpY2VzID0gcm9vdDsKLQotICAvKiBub3cgYWxsIHRoZSBwcm9jZXNzb3JzIGF0dGFjaGluZyB0byBlYWNoIHRoZWlyIHBlci1jcHUgaW5mb3JtYXRpb24gKi8KLSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgY3B1X25yKyspIHsKLSAgICBzeXN0ZW0tPnByb2Nlc3NvcnNbY3B1X25yXSA9IGNwdV9jcmVhdGUoc3lzdGVtLAotCQkJCQkgICAgc3lzdGVtLT5tZW1vcnksCi0JCQkJCSAgICBtb25fY3B1KHN5c3RlbS0+bW9uaXRvciwKLQkJCQkJCSAgICBjcHVfbnIpLAotCQkJCQkgICAgc3lzdGVtLT5vc19lbXVsYXRpb24sCi0JCQkJCSAgICBjcHVfbnIpOwotICB9Ci0KLSAgLyogZHVtcCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXZpY2UgdHJlZSAqLwotICBpZiAocHBjX3RyYWNlW3RyYWNlX3ByaW50X2RldmljZV90cmVlXSB8fCBwcGNfdHJhY2VbdHJhY2VfZHVtcF9kZXZpY2VfdHJlZV0pCi0gICAgdHJlZV9wcmludChyb290KTsKLSAgaWYgKHBwY190cmFjZVt0cmFjZV9kdW1wX2RldmljZV90cmVlXSkKLSAgICBlcnJvcigiIik7Ci0KLSAgcmV0dXJuIHN5c3RlbTsKLX0KLQotCi0vKiBhbGxvdyB0aGUgc2ltdWxhdGlvbiB0byBzdG9wL3Jlc3RhcnQgYWJub3JtYWx5ICovCi0KLUlOTElORV9QU0lNXAotKHZvaWQpCi1wc2ltX3NldF9oYWx0X2FuZF9yZXN0YXJ0KHBzaW0gKnN5c3RlbSwKLQkJCSAgdm9pZCAqaGFsdF9qbXBfYnVmLAotCQkJICB2b2lkICpyZXN0YXJ0X2ptcF9idWYpCi17Ci0gIHN5c3RlbS0+cGF0aF90b19oYWx0ID0gaGFsdF9qbXBfYnVmOwotICBzeXN0ZW0tPnBhdGhfdG9fcmVzdGFydCA9IHJlc3RhcnRfam1wX2J1ZjsKLX0KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1fY2xlYXJfaGFsdF9hbmRfcmVzdGFydChwc2ltICpzeXN0ZW0pCi17Ci0gIHN5c3RlbS0+cGF0aF90b19oYWx0ID0gTlVMTDsKLSAgc3lzdGVtLT5wYXRoX3RvX3Jlc3RhcnQgPSBOVUxMOwotfQotCi1JTkxJTkVfUFNJTVwKLSh2b2lkKQotcHNpbV9yZXN0YXJ0KHBzaW0gKnN5c3RlbSwKLQkgICAgIGludCBjdXJyZW50X2NwdSkKLXsKLSAgQVNTRVJUKGN1cnJlbnRfY3B1ID49IDAgJiYgY3VycmVudF9jcHUgPCBzeXN0ZW0tPm5yX2NwdXMpOwotICBBU1NFUlQoc3lzdGVtLT5wYXRoX3RvX3Jlc3RhcnQgIT0gTlVMTCk7Ci0gIHN5c3RlbS0+bGFzdF9jcHUgPSBjdXJyZW50X2NwdTsKLSAgbG9uZ2ptcCgqKGptcF9idWYqKShzeXN0ZW0tPnBhdGhfdG9fcmVzdGFydCksIGN1cnJlbnRfY3B1ICsgMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNudHJsX2Nfc2ltdWxhdGlvbih2b2lkICpkYXRhKQotewotICBwc2ltICpzeXN0ZW0gPSBkYXRhOwotICBwc2ltX2hhbHQoc3lzdGVtLAotCSAgICBwc2ltX25yX2NwdXMoc3lzdGVtKSwKLQkgICAgd2FzX2NvbnRpbnVpbmcsCi0JICAgIFNJR0lOVCk7Ci19Ci0KLUlOTElORV9QU0lNXAotKHZvaWQpCi1wc2ltX3N0b3AocHNpbSAqc3lzdGVtKQotewotICBldmVudF9xdWV1ZV9zY2hlZHVsZV9hZnRlcl9zaWduYWwocHNpbV9ldmVudF9xdWV1ZShzeXN0ZW0pLAotCQkJCSAgICAwIC8qTk9XKi8sCi0JCQkJICAgIGNudHJsX2Nfc2ltdWxhdGlvbiwKLQkJCQkgICAgc3lzdGVtKTsKLX0KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1faGFsdChwc2ltICpzeXN0ZW0sCi0JICBpbnQgY3VycmVudF9jcHUsCi0JICBzdG9wX3JlYXNvbiByZWFzb24sCi0JICBpbnQgc2lnbmFsKQotewotICBBU1NFUlQoY3VycmVudF9jcHUgPj0gMCAmJiBjdXJyZW50X2NwdSA8PSBzeXN0ZW0tPm5yX2NwdXMpOwotICBBU1NFUlQoc3lzdGVtLT5wYXRoX3RvX2hhbHQgIT0gTlVMTCk7Ci0gIHN5c3RlbS0+bGFzdF9jcHUgPSBjdXJyZW50X2NwdTsKLSAgc3lzdGVtLT5oYWx0X3N0YXR1cy5yZWFzb24gPSByZWFzb247Ci0gIHN5c3RlbS0+aGFsdF9zdGF0dXMuc2lnbmFsID0gc2lnbmFsOwotICBpZiAoY3VycmVudF9jcHUgPT0gc3lzdGVtLT5ucl9jcHVzKSB7Ci0gICAgc3lzdGVtLT5oYWx0X3N0YXR1cy5jcHVfbnIgPSAwOwotICAgIHN5c3RlbS0+aGFsdF9zdGF0dXMucHJvZ3JhbV9jb3VudGVyID0KLSAgICAgIGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHN5c3RlbS0+cHJvY2Vzc29yc1swXSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3lzdGVtLT5oYWx0X3N0YXR1cy5jcHVfbnIgPSBjdXJyZW50X2NwdTsKLSAgICBzeXN0ZW0tPmhhbHRfc3RhdHVzLnByb2dyYW1fY291bnRlciA9Ci0gICAgICBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihzeXN0ZW0tPnByb2Nlc3NvcnNbY3VycmVudF9jcHVdKTsKLSAgfQotICBsb25nam1wKCooam1wX2J1ZiopKHN5c3RlbS0+cGF0aF90b19oYWx0KSwgY3VycmVudF9jcHUgKyAxKTsKLX0KLQotCi1JTkxJTkVfUFNJTVwKLShpbnQpCi1wc2ltX2xhc3RfY3B1KHBzaW0gKnN5c3RlbSkKLXsKLSAgcmV0dXJuIHN5c3RlbS0+bGFzdF9jcHU7Ci19Ci0KLUlOTElORV9QU0lNXAotKGludCkKLXBzaW1fbnJfY3B1cyhwc2ltICpzeXN0ZW0pCi17Ci0gIHJldHVybiBzeXN0ZW0tPm5yX2NwdXM7Ci19Ci0KLUlOTElORV9QU0lNXAotKHBzaW1fc3RhdHVzKQotcHNpbV9nZXRfc3RhdHVzKHBzaW0gKnN5c3RlbSkKLXsKLSAgcmV0dXJuIHN5c3RlbS0+aGFsdF9zdGF0dXM7Ci19Ci0KLQotSU5MSU5FX1BTSU1cCi0oY3B1ICopCi1wc2ltX2NwdShwc2ltICpzeXN0ZW0sCi0JIGludCBjcHVfbnIpCi17Ci0gIGlmIChjcHVfbnIgPCAwIHx8IGNwdV9uciA+PSBzeXN0ZW0tPm5yX2NwdXMpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGVsc2UKLSAgICByZXR1cm4gc3lzdGVtLT5wcm9jZXNzb3JzW2NwdV9ucl07Ci19Ci0KLQotSU5MSU5FX1BTSU1cCi0oZGV2aWNlICopCi1wc2ltX2RldmljZShwc2ltICpzeXN0ZW0sCi0JICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIHJldHVybiB0cmVlX2ZpbmRfZGV2aWNlKHN5c3RlbS0+ZGV2aWNlcywgcGF0aCk7Ci19Ci0KLUlOTElORV9QU0lNXAotKGV2ZW50X3F1ZXVlICopCi1wc2ltX2V2ZW50X3F1ZXVlKHBzaW0gKnN5c3RlbSkKLXsKLSAgcmV0dXJuIHN5c3RlbS0+ZXZlbnRzOwotfQotCi0KLQotU1RBVElDX0lOTElORV9QU0lNXAotKHZvaWQpCi1wc2ltX21heF9pdGVyYXRpb25zX2V4Y2VlZGVkKHZvaWQgKmRhdGEpCi17Ci0gIHBzaW0gKnN5c3RlbSA9IGRhdGE7Ci0gIHBzaW1faGFsdChzeXN0ZW0sCi0JICAgIHN5c3RlbS0+bnJfY3B1cywgLyogaGFsdGVkIGR1cmluZyBhbiBldmVudCAqLwotCSAgICB3YXNfc2lnbmFsbGVkLAotCSAgICAtMSk7Ci19Ci0KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1faW5pdChwc2ltICpzeXN0ZW0pCi17Ci0gIGludCBjcHVfbnI7Ci0KLSAgLyogc2NydWIgdGhlIG1vbml0b3IgKi8KLSAgbW9uX2luaXQoc3lzdGVtLT5tb25pdG9yLCBzeXN0ZW0tPm5yX2NwdXMpOwotCi0gIC8qIHRyYXNoIGFueSBwZW5kaW5nIGV2ZW50cyAqLwotICBldmVudF9xdWV1ZV9pbml0KHN5c3RlbS0+ZXZlbnRzKTsKLQotICAvKiBpZiBuZWVkZWQsIHNjaGVkdWxlIGEgaGFsdCBldmVudC4gIEZJWE1FIC0gSW4gdGhlIGZ1dHVyZSB0aGlzCi0gICAgIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBtb3JlIGdlbmVyaWMgY2hhbmdlIHRvIHBzaW1fY29tbWFuZCgpLiAgQQotICAgICBuZXcgY29tbWFuZCBgc2NoZWR1bGUgTk5OIGhhbHQnIGJlaW5nIGFkZGVkLiAqLwotICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHN5c3RlbS0+ZGV2aWNlcywgIi9vcGVucHJvbS9vcHRpb25zL21heC1pdGVyYXRpb25zIikpIHsKLSAgICBldmVudF9xdWV1ZV9zY2hlZHVsZShzeXN0ZW0tPmV2ZW50cywKLQkJCSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShzeXN0ZW0tPmRldmljZXMsCi0JCQkJCQkgICAgIi9vcGVucHJvbS9vcHRpb25zL21heC1pdGVyYXRpb25zIikgLSAyLAotCQkJIHBzaW1fbWF4X2l0ZXJhdGlvbnNfZXhjZWVkZWQsCi0JCQkgc3lzdGVtKTsKLSAgfQotCi0gIC8qIHNjcnViIGFsbCB0aGUgY3B1cyAqLwotICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IHN5c3RlbS0+bnJfY3B1czsgY3B1X25yKyspCi0gICAgY3B1X2luaXQoc3lzdGVtLT5wcm9jZXNzb3JzW2NwdV9ucl0pOwotCi0gIC8qIGluaXQgYWxsIHRoZSBkZXZpY2VzICh3aGljaCB1cGRhdGVzIHRoZSBjcHVzKSAqLwotICB0cmVlX2luaXQoc3lzdGVtLT5kZXZpY2VzLCBzeXN0ZW0pOwotCi0gIC8qIGFuZCB0aGUgZW11bGF0aW9uICh3aGljaCBuZWVkcyBhbiBpbml0aWFsaXplZCBkZXZpY2UgdHJlZSkgKi8KLSAgb3NfZW11bF9pbml0KHN5c3RlbS0+b3NfZW11bGF0aW9uLCBzeXN0ZW0tPm5yX2NwdXMpOwotCi0gIC8qIG5vdyBzeW5jIGVhY2ggY3B1IGFnYWluc3QgdGhlIGluaXRpYWxpemVkIHN0YXRlIG9mIGl0cyByZWdpc3RlcnMgKi8KLSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBzeXN0ZW0tPm5yX2NwdXM7IGNwdV9ucisrKSB7Ci0gICAgY3B1ICpwcm9jZXNzb3IgPSBzeXN0ZW0tPnByb2Nlc3NvcnNbY3B1X25yXTsKLSAgICBjcHVfc3luY2hyb25pemVfY29udGV4dChwcm9jZXNzb3IsIGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvcikpOwotICAgIGNwdV9wYWdlX3RsYl9pbnZhbGlkYXRlX2FsbChwcm9jZXNzb3IpOwotICB9Ci0KLSAgLyogZm9yY2UgbG9vcCB0byBzdGFydCB3aXRoIGZpcnN0IGNwdSAqLwotICBzeXN0ZW0tPmxhc3RfY3B1ID0gLTE7Ci19Ci0KLUlOTElORV9QU0lNXAotKHZvaWQpCi1wc2ltX3N0YWNrKHBzaW0gKnN5c3RlbSwKLQkgICBjaGFyICoqYXJndiwKLQkgICBjaGFyICoqZW52cCkKLXsKLSAgLyogcGFzcyB0aGUgc3RhY2sgZGV2aWNlIHRoZSBhcmd2L2VudnAgYW5kIGxldCBpdCB3b3JrIG91dCB3aGF0IHRvCi0gICAgIGRvIHdpdGggaXQgKi8KLSAgZGV2aWNlICpzdGFja19kZXZpY2UgPSB0cmVlX2ZpbmRfZGV2aWNlKHN5c3RlbS0+ZGV2aWNlcywKLQkJCQkJICAiL29wZW5wcm9tL2luaXQvc3RhY2siKTsKLSAgaWYgKHN0YWNrX2RldmljZSAhPSAoZGV2aWNlKikwKSB7Ci0gICAgdW5zaWduZWRfd29yZCBzdGFja19wb2ludGVyOwotICAgIHBzaW1fcmVhZF9yZWdpc3RlcihzeXN0ZW0sIDAsICZzdGFja19wb2ludGVyLCAic3AiLCBjb29rZWRfdHJhbnNmZXIpOwotICAgIGRldmljZV9pb2N0bChzdGFja19kZXZpY2UsCi0JCSBOVUxMLCAvKmNwdSovCi0JCSAwLCAvKmNpYSovCi0JCSBkZXZpY2VfaW9jdGxfY3JlYXRlX3N0YWNrLAotCQkgc3RhY2tfcG9pbnRlciwKLQkJIGFyZ3YsCi0JCSBlbnZwKTsKLSAgfQotfQotCi0KLQotLyogU0lNVUxBVEUgSU5TVFJVQ1RJT05TLCB2YXJpb3VzIGRpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZQotICAgdGhpbmcgKi8KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1fc3RlcChwc2ltICpzeXN0ZW0pCi17Ci0gIHZvbGF0aWxlIGludCBrZWVwX3J1bm5pbmcgPSAwOwotICBpZGVjb2RlX3J1bl91bnRpbF9zdG9wKHN5c3RlbSwgJmtlZXBfcnVubmluZywKLQkJCSBzeXN0ZW0tPmV2ZW50cywgc3lzdGVtLT5wcm9jZXNzb3JzLCBzeXN0ZW0tPm5yX2NwdXMpOwotfQotCi1JTkxJTkVfUFNJTVwKLSh2b2lkKQotcHNpbV9ydW4ocHNpbSAqc3lzdGVtKQotewotICBpZGVjb2RlX3J1bihzeXN0ZW0sCi0JICAgICAgc3lzdGVtLT5ldmVudHMsIHN5c3RlbS0+cHJvY2Vzc29ycywgc3lzdGVtLT5ucl9jcHVzKTsKLX0KLQotCi0vKiBzdG9yYWdlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1fcmVhZF9yZWdpc3Rlcihwc2ltICpzeXN0ZW0sCi0JCSAgIGludCB3aGljaF9jcHUsCi0JCSAgIHZvaWQgKmJ1ZiwKLQkJICAgY29uc3QgY2hhciByZWdbXSwKLQkJICAgdHJhbnNmZXJfbW9kZSBtb2RlKQotewotICByZWdpc3Rlcl9kZXNjcmlwdGlvbnMgZGVzY3JpcHRpb247Ci0gIGNoYXIgY29va2VkX2J1ZltzaXplb2YodW5zaWduZWRfOCldOwotICBjcHUgKnByb2Nlc3NvcjsKLQotICAvKiBmaW5kIG91ciBwcm9jZXNzb3IgKi8KLSAgaWYgKHdoaWNoX2NwdSA9PSBNQVhfTlJfUFJPQ0VTU09SUykgewotICAgIGlmIChzeXN0ZW0tPmxhc3RfY3B1ID09IHN5c3RlbS0+bnJfY3B1cwotCXx8IHN5c3RlbS0+bGFzdF9jcHUgPT0gLTEpCi0gICAgICB3aGljaF9jcHUgPSAwOwotICAgIGVsc2UKLSAgICAgIHdoaWNoX2NwdSA9IHN5c3RlbS0+bGFzdF9jcHU7Ci0gIH0KLSAgQVNTRVJUKHdoaWNoX2NwdSA+PSAwICYmIHdoaWNoX2NwdSA8IHN5c3RlbS0+bnJfY3B1cyk7Ci0KLSAgcHJvY2Vzc29yID0gc3lzdGVtLT5wcm9jZXNzb3JzW3doaWNoX2NwdV07Ci0KLSAgLyogZmluZCB0aGUgcmVnaXN0ZXIgZGVzY3JpcHRpb24gKi8KLSAgZGVzY3JpcHRpb24gPSByZWdpc3Rlcl9kZXNjcmlwdGlvbihyZWcpOwotICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PSByZWdfaW52YWxpZCkKLSAgICBlcnJvcigicHNpbV9yZWFkX3JlZ2lzdGVyKCkgaW52YWxpZCByZWdpc3RlciBuYW1lIGAlcydcbiIsIHJlZyk7Ci0KLSAgLyogZ2V0IHRoZSBjb29rZWQgdmFsdWUgKi8KLSAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7Ci0KLSAgY2FzZSByZWdfZ3ByOgotICAgICooZ3ByZWcqKWNvb2tlZF9idWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltkZXNjcmlwdGlvbi5pbmRleF07Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfc3ByOgotICAgICooc3ByZWcqKWNvb2tlZF9idWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPnNwcltkZXNjcmlwdGlvbi5pbmRleF07Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGNhc2UgcmVnX3NyOgotICAgICooc3JlZyopY29va2VkX2J1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3JbZGVzY3JpcHRpb24uaW5kZXhdOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX2ZwcjoKLSAgICAqKGZwcmVnKiljb29rZWRfYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHJbZGVzY3JpcHRpb24uaW5kZXhdOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX3BjOgotICAgICoodW5zaWduZWRfd29yZCopY29va2VkX2J1ZiA9IGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3Nvcik7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfY3I6Ci0gICAgKihjcmVnKiljb29rZWRfYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5jcjsKLSAgICBicmVhazsKLQotICBjYXNlIHJlZ19tc3I6Ci0gICAgKihtc3JlZyopY29va2VkX2J1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX2Zwc2NyOgotICAgICooZnBzY3JlZyopY29va2VkX2J1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnBzY3I7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfaW5zbnM6Ci0gICAgKih1bnNpZ25lZF93b3JkKiljb29rZWRfYnVmID0gbW9uX2dldF9udW1iZXJfb2ZfaW5zbnMoc3lzdGVtLT5tb25pdG9yLAotCQkJCQkJCSAgd2hpY2hfY3B1KTsKLSAgICBicmVhazsKLQotICBjYXNlIHJlZ19zdGFsbHM6Ci0gICAgaWYgKGNwdV9tb2RlbChwcm9jZXNzb3IpID09IE5VTEwpCi0gICAgICBlcnJvcigiJHN0YWxscyBvbmx5IHZhbGlkIGlmIHByb2Nlc3NvciB1bml0IG1vZGVsIGVuYWJsZWQgKC1JKVxuIik7Ci0gICAgKih1bnNpZ25lZF93b3JkKiljb29rZWRfYnVmID0gbW9kZWxfZ2V0X251bWJlcl9vZl9zdGFsbHMoY3B1X21vZGVsKHByb2Nlc3NvcikpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX2N5Y2xlczoKLSAgICBpZiAoY3B1X21vZGVsKHByb2Nlc3NvcikgPT0gTlVMTCkKLSAgICAgIGVycm9yKCIkY3ljbGVzIG9ubHkgdmFsaWQgaWYgcHJvY2Vzc29yIHVuaXQgbW9kZWwgZW5hYmxlZCAoLUkpXG4iKTsKLSAgICAqKHVuc2lnbmVkX3dvcmQqKWNvb2tlZF9idWYgPSBtb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlcyhjcHVfbW9kZWwocHJvY2Vzc29yKSk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBwcmludGZfZmlsdGVyZWQoInBzaW1fcmVhZF9yZWdpc3Rlcihwcm9jZXNzb3I9MHglbHgsYnVmPTB4JWx4LHJlZz0lcykgJXNcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylwcm9jZXNzb3IsICh1bnNpZ25lZCBsb25nKWJ1ZiwgcmVnLAotCQkgICAgInJlYWQgb2YgdGhpcyByZWdpc3RlciB1bmltcGxlbWVudGVkIik7Ci0gICAgYnJlYWs7Ci0KLSAgfQotCi0gIC8qIHRoZSBQU0lNIGludGVybmFsIHZhbHVlcyBhcmUgaW4gaG9zdCBvcmRlci4gIFRvIGZldGNoIHJhdyBkYXRhLAotICAgICB0aGV5IG5lZWQgdG8gYmUgY29udmVydGVkIGludG8gdGFyZ2V0IG9yZGVyIGFuZCB0aGVuIHJldHVybmVkICovCi0gIGlmIChtb2RlID09IHJhd190cmFuc2ZlcikgewotICAgIC8qIEZJWE1FIC0gYXNzdW1lcyB0aGF0IGFsbCByZWdpc3RlcnMgYXJlIHNpbXBsZSBpbnRlZ2VycyAqLwotICAgIHN3aXRjaCAoZGVzY3JpcHRpb24uc2l6ZSkgewotICAgIGNhc2UgMTogCi0gICAgICAqKHVuc2lnbmVkXzEqKWJ1ZiA9IEgyVF8xKCoodW5zaWduZWRfMSopY29va2VkX2J1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqKHVuc2lnbmVkXzIqKWJ1ZiA9IEgyVF8yKCoodW5zaWduZWRfMiopY29va2VkX2J1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAqKHVuc2lnbmVkXzQqKWJ1ZiA9IEgyVF80KCoodW5zaWduZWRfNCopY29va2VkX2J1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICAqKHVuc2lnbmVkXzgqKWJ1ZiA9IEgyVF84KCoodW5zaWduZWRfOCopY29va2VkX2J1Zik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWVtY3B5KGJ1Zi8qZGVzdCovLCBjb29rZWRfYnVmLypzcmMqLywgZGVzY3JpcHRpb24uc2l6ZSk7Ci0gIH0KLQotfQotCi0KLQotSU5MSU5FX1BTSU1cCi0odm9pZCkKLXBzaW1fd3JpdGVfcmVnaXN0ZXIocHNpbSAqc3lzdGVtLAotCQkgICAgaW50IHdoaWNoX2NwdSwKLQkJICAgIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJICAgIGNvbnN0IGNoYXIgcmVnW10sCi0JCSAgICB0cmFuc2Zlcl9tb2RlIG1vZGUpCi17Ci0gIGNwdSAqcHJvY2Vzc29yOwotICByZWdpc3Rlcl9kZXNjcmlwdGlvbnMgZGVzY3JpcHRpb247Ci0gIGNoYXIgY29va2VkX2J1ZltzaXplb2YodW5zaWduZWRfOCldOwotCi0gIC8qIGZpbmQgb3VyIHByb2Nlc3NvciAqLwotICBpZiAod2hpY2hfY3B1ID09IE1BWF9OUl9QUk9DRVNTT1JTKSB7Ci0gICAgaWYgKHN5c3RlbS0+bGFzdF9jcHUgPT0gc3lzdGVtLT5ucl9jcHVzCi0JfHwgc3lzdGVtLT5sYXN0X2NwdSA9PSAtMSkKLSAgICAgIHdoaWNoX2NwdSA9IDA7Ci0gICAgZWxzZQotICAgICAgd2hpY2hfY3B1ID0gc3lzdGVtLT5sYXN0X2NwdTsKLSAgfQotICBpZiAod2hpY2hfY3B1ID09IC0xKSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN5c3RlbS0+bnJfY3B1czsgaSsrKQotICAgICAgcHNpbV93cml0ZV9yZWdpc3RlcihzeXN0ZW0sIGksIGJ1ZiwgcmVnLCBtb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQVNTRVJUKHdoaWNoX2NwdSA+PSAwICYmIHdoaWNoX2NwdSA8IHN5c3RlbS0+bnJfY3B1cyk7Ci0KLSAgcHJvY2Vzc29yID0gc3lzdGVtLT5wcm9jZXNzb3JzW3doaWNoX2NwdV07Ci0KLSAgLyogZmluZCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlZ2lzdGVyICovCi0gIGRlc2NyaXB0aW9uID0gcmVnaXN0ZXJfZGVzY3JpcHRpb24ocmVnKTsKLSAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT0gcmVnX2ludmFsaWQpCi0gICAgZXJyb3IoInBzaW1fd3JpdGVfcmVnaXN0ZXIoKSBpbnZhbGlkIHJlZ2lzdGVyIG5hbWUgJXNcbiIsIHJlZyk7Ci0KLSAgLyogSWYgdGhlIGRhdGEgaXMgY29tbWluZyBpbiByYXcgKHRhcmdldCBvcmRlciksIG5lZWQgdG8gY29vayBpdAotICAgICBpbnRvIGhvc3Qgb3JkZXIgYmVmb3JlIHB1dHRpbmcgaXQgaW50byBQU0lNJ3MgaW50ZXJuYWwgc3RydWN0dXJlcyAqLwotICBpZiAobW9kZSA9PSByYXdfdHJhbnNmZXIpIHsKLSAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLnNpemUpIHsKLSAgICBjYXNlIDE6IAotICAgICAgKih1bnNpZ25lZF8xKiljb29rZWRfYnVmID0gVDJIXzEoKih1bnNpZ25lZF8xKilidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgKih1bnNpZ25lZF8yKiljb29rZWRfYnVmID0gVDJIXzIoKih1bnNpZ25lZF8yKilidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKih1bnNpZ25lZF80Kiljb29rZWRfYnVmID0gVDJIXzQoKih1bnNpZ25lZF80KilidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgKih1bnNpZ25lZF84Kiljb29rZWRfYnVmID0gVDJIXzgoKih1bnNpZ25lZF84KilidWYpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShjb29rZWRfYnVmLypkZXN0Ki8sIGJ1Zi8qc3JjKi8sIGRlc2NyaXB0aW9uLnNpemUpOwotICB9Ci0KLSAgLyogcHV0IHRoZSBjb29rZWQgdmFsdWUgaW50byB0aGUgcmVnaXN0ZXIgKi8KLSAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7Ci0KLSAgY2FzZSByZWdfZ3ByOgotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2Rlc2NyaXB0aW9uLmluZGV4XSA9ICooZ3ByZWcqKWNvb2tlZF9idWY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfZnByOgotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnByW2Rlc2NyaXB0aW9uLmluZGV4XSA9ICooZnByZWcqKWNvb2tlZF9idWY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfcGM6Ci0gICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCAqKHVuc2lnbmVkX3dvcmQqKWNvb2tlZF9idWYpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX3NwcjoKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPnNwcltkZXNjcmlwdGlvbi5pbmRleF0gPSAqKHNwcmVnKiljb29rZWRfYnVmOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX3NyOgotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3JbZGVzY3JpcHRpb24uaW5kZXhdID0gKihzcmVnKiljb29rZWRfYnVmOwotICAgIGJyZWFrOwotCi0gIGNhc2UgcmVnX2NyOgotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Y3IgPSAqKGNyZWcqKWNvb2tlZF9idWY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSByZWdfbXNyOgotICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyID0gKihtc3JlZyopY29va2VkX2J1ZjsKLSAgICBicmVhazsKLQotICBjYXNlIHJlZ19mcHNjcjoKLSAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwc2NyID0gKihmcHNjcmVnKiljb29rZWRfYnVmOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJwc2ltX3dyaXRlX3JlZ2lzdGVyKHByb2Nlc3Nvcj0weCVseCxjb29rZWRfYnVmPTB4JWx4LHJlZz0lcykgJXNcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylwcm9jZXNzb3IsICh1bnNpZ25lZCBsb25nKWNvb2tlZF9idWYsIHJlZywKLQkJICAgICJyZWFkIG9mIHRoaXMgcmVnaXN0ZXIgdW5pbXBsZW1lbnRlZCIpOwotICAgIGJyZWFrOwotCi0gIH0KLQotfQotCi0KLQotSU5MSU5FX1BTSU1cCi0odW5zaWduZWQpCi1wc2ltX3JlYWRfbWVtb3J5KHBzaW0gKnN5c3RlbSwKLQkJIGludCB3aGljaF9jcHUsCi0JCSB2b2lkICpidWZmZXIsCi0JCSB1bnNpZ25lZF93b3JkIHZhZGRyLAotCQkgdW5zaWduZWQgbnJfYnl0ZXMpCi17Ci0gIGNwdSAqcHJvY2Vzc29yOwotICBpZiAod2hpY2hfY3B1ID09IE1BWF9OUl9QUk9DRVNTT1JTKSB7Ci0gICAgaWYgKHN5c3RlbS0+bGFzdF9jcHUgPT0gc3lzdGVtLT5ucl9jcHVzCi0JfHwgc3lzdGVtLT5sYXN0X2NwdSA9PSAtMSkKLSAgICAgIHdoaWNoX2NwdSA9IDA7Ci0gICAgZWxzZQotICAgICAgd2hpY2hfY3B1ID0gc3lzdGVtLT5sYXN0X2NwdTsKLSAgfQotICBwcm9jZXNzb3IgPSBzeXN0ZW0tPnByb2Nlc3NvcnNbd2hpY2hfY3B1XTsKLSAgcmV0dXJuIHZtX2RhdGFfbWFwX3JlYWRfYnVmZmVyKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAotCQkJCSBidWZmZXIsIHZhZGRyLCBucl9ieXRlcywKLQkJCQkgTlVMTCwgLTEpOwotfQotCi0KLUlOTElORV9QU0lNXAotKHVuc2lnbmVkKQotcHNpbV93cml0ZV9tZW1vcnkocHNpbSAqc3lzdGVtLAotCQkgIGludCB3aGljaF9jcHUsCi0JCSAgY29uc3Qgdm9pZCAqYnVmZmVyLAotCQkgIHVuc2lnbmVkX3dvcmQgdmFkZHIsCi0JCSAgdW5zaWduZWQgbnJfYnl0ZXMsCi0JCSAgaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pCi17Ci0gIGNwdSAqcHJvY2Vzc29yOwotICBpZiAod2hpY2hfY3B1ID09IE1BWF9OUl9QUk9DRVNTT1JTKSB7Ci0gICAgaWYgKHN5c3RlbS0+bGFzdF9jcHUgPT0gc3lzdGVtLT5ucl9jcHVzCi0JfHwgc3lzdGVtLT5sYXN0X2NwdSA9PSAtMSkKLSAgICAgIHdoaWNoX2NwdSA9IDA7Ci0gICAgZWxzZQotICAgICAgd2hpY2hfY3B1ID0gc3lzdGVtLT5sYXN0X2NwdTsKLSAgfQotICBBU1NFUlQod2hpY2hfY3B1ID49IDAgJiYgd2hpY2hfY3B1IDwgc3lzdGVtLT5ucl9jcHVzKTsKLSAgcHJvY2Vzc29yID0gc3lzdGVtLT5wcm9jZXNzb3JzW3doaWNoX2NwdV07Ci0gIHJldHVybiB2bV9kYXRhX21hcF93cml0ZV9idWZmZXIoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCi0JCQkJICBidWZmZXIsIHZhZGRyLCBucl9ieXRlcywgMS8qdmlvbGF0ZS1yZWFkLW9ubHkqLywKLQkJCQkgIE5VTEwsIC0xKTsKLX0KLQotCi1JTkxJTkVfUFNJTVwKLSh2b2lkKQotcHNpbV9wcmludF9pbmZvKHBzaW0gKnN5c3RlbSwKLQkJaW50IHZlcmJvc2UpCi17Ci0gIG1vbl9wcmludF9pbmZvKHN5c3RlbSwgc3lzdGVtLT5tb25pdG9yLCB2ZXJib3NlKTsKLX0KLQotCi0vKiBNZXJnZSBhIGRldmljZSB0cmVlIGFuZCBhIGRldmljZSBmaWxlLiAqLwotCi1JTkxJTkVfUFNJTVwKLSh2b2lkKQotcHNpbV9tZXJnZV9kZXZpY2VfZmlsZShkZXZpY2UgKnJvb3QsCi0JCSAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUpCi17Ci0gIEZJTEUgKmRlc2NyaXB0aW9uOwotICBpbnQgbGluZV9ucjsKLSAgY2hhciBkZXZpY2VfcGF0aFsxMDAwXTsKLSAgZGV2aWNlICpjdXJyZW50OwotCi0gIC8qIHRyeSBvcGVuaW5nIHRoZSBmaWxlICovCi0gIGRlc2NyaXB0aW9uID0gZm9wZW4oZmlsZV9uYW1lLCAiciIpOwotICBpZiAoZGVzY3JpcHRpb24gPT0gTlVMTCkgewotICAgIHBlcnJvcihmaWxlX25hbWUpOwotICAgIGVycm9yKCJJbnZhbGlkIGZpbGUgJXMgc3BlY2lmaWVkIiwgZmlsZV9uYW1lKTsKLSAgfQotCi0gIGxpbmVfbnIgPSAwOwotICBjdXJyZW50ID0gcm9vdDsKLSAgd2hpbGUgKGZnZXRzKGRldmljZV9wYXRoLCBzaXplb2YoZGV2aWNlX3BhdGgpLCBkZXNjcmlwdGlvbikpIHsKLSAgICBjaGFyICpkZXZpY2U7Ci0gICAgLyogY2hlY2sgdGhhdCB0aGUgZnVsbCBsaW5lIHdhcyByZWFkICovCi0gICAgaWYgKHN0cmNocihkZXZpY2VfcGF0aCwgJ1xuJykgPT0gTlVMTCkgewotICAgICAgZmNsb3NlKGRlc2NyaXB0aW9uKTsKLSAgICAgIGVycm9yKCIlczolZDogbGluZSB0byBsb25nIC0gJXMiLAotCSAgICBmaWxlX25hbWUsIGxpbmVfbnIsIGRldmljZV9wYXRoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgKnN0cmNocihkZXZpY2VfcGF0aCwgJ1xuJykgPSAnXDAnOwotICAgIGxpbmVfbnIrKzsKLSAgICAvKiBza2lwIGNvbW1lbnRzICgiIyIgb3IgIjsiKSBhbmQgYmxhbmsgbGluZXMgbGluZXMgKi8KLSAgICBmb3IgKGRldmljZSA9IGRldmljZV9wYXRoOwotCSAqZGV2aWNlICE9ICdcMCcgJiYgaXNzcGFjZSgqZGV2aWNlKTsKLQkgZGV2aWNlKyspOwotICAgIGlmIChkZXZpY2VbMF0gPT0gJyMnCi0JfHwgZGV2aWNlWzBdID09ICc7JwotCXx8IGRldmljZVswXSA9PSAnXDAnKQotICAgICAgY29udGludWU7Ci0gICAgLyogbWVyZ2UgYW55IGFwcGVuZGVkIGxpbmVzICovCi0gICAgd2hpbGUgKGRldmljZV9wYXRoW3N0cmxlbihkZXZpY2VfcGF0aCkgLSAxXSA9PSAnXFwnKSB7Ci0gICAgICBpbnQgY3VybGVuID0gc3RybGVuKGRldmljZV9wYXRoKSAtIDE7Ci0gICAgICAvKiB6YXAgXCAqLwotICAgICAgZGV2aWNlX3BhdGhbY3VybGVuXSA9ICdcMCc7Ci0gICAgICAvKiBhcHBlbmQgdGhlIG5leHQgbGluZSAqLwotICAgICAgaWYgKCFmZ2V0cyhkZXZpY2VfcGF0aCArIGN1cmxlbiwgc2l6ZW9mKGRldmljZV9wYXRoKSAtIGN1cmxlbiwgZGVzY3JpcHRpb24pKSB7Ci0JZmNsb3NlKGRlc2NyaXB0aW9uKTsKLQllcnJvcigiJXM6JXM6IHVuZXhwZWN0ZWQgZW9mIGluIGxpbmUgY29udGludWF0aW9uIC0gJXMiLAotCSAgICAgIGZpbGVfbmFtZSwgbGluZV9uciwgZGV2aWNlX3BhdGgpOwotICAgICAgfQotICAgICAgaWYgKHN0cmNocihkZXZpY2VfcGF0aCwgJ1xuJykgPT0gTlVMTCkgewotCWZjbG9zZShkZXNjcmlwdGlvbik7Ci0JZXJyb3IoIiVzOiVkOiBsaW5lIHRvIGxvbmcgLSAlcyIsCi0JICAgIGZpbGVfbmFtZSwgbGluZV9uciwgZGV2aWNlX3BhdGgpOwotICAgICAgfQotICAgICAgZWxzZQotCSpzdHJjaHIoZGV2aWNlX3BhdGgsICdcbicpID0gJ1wwJzsKLSAgICAgIGxpbmVfbnIrKzsKLSAgICB9Ci0gICAgLyogcGFyc2UgdGhpcyBsaW5lICovCi0gICAgY3VycmVudCA9IHRyZWVfcGFyc2UoY3VycmVudCwgIiVzIiwgZGV2aWNlKTsKLSAgfQotICBmY2xvc2UoZGVzY3JpcHRpb24pOwotfQotCi0KLSNlbmRpZiAvKiBfUFNJTV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wc2ltLmggYi9zaW0vcHBjL3BzaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjZjNhNS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3BzaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9QU0lNX0hfCi0jZGVmaW5lIF9QU0lNX0hfCi0KLSNpbmNsdWRlICJiYXNpY3MuaCIKLQotCi0vKiB0aGUgc3lzdGVtIG9iamVjdCAqLwotLyogdHlwZWRlZiBzdHJ1Y3QgX3BzaW0gcHNpbTsgKi8KLS8qIHR5cGVkZWYgc3RydWN0IF9kZXZpY2UgZGV2aWNlOyAqLwotCi0vKiB3aGVuIHRoZSBgc3lzdGVtJyBzdG9wcywgZmluZCBvdXQgd2h5LiAgRklYTUUgLSBhdCB0aGlzIHBvaW50IHRoaXMKLSAgIGlzIHJlYWxseSBhIGJpdCBwdXp6bGluZy4gIEFmdGVyIGFsbCwgaG93IGNhbiB0aGVyZSBiZSBhIHN0YXR1cwotICAgd2hlbiB0aGVyZSBzZXZlcmFsIHByb2Nlc3NvcnMgaW52b2x2ZWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3BzaW1fc3RhdHVzIHsKLSAgaW50IGNwdV9ucjsKLSAgc3RvcF9yZWFzb24gcmVhc29uOwotICBpbnQgc2lnbmFsOwotICB1bnNpZ25lZF93b3JkIHByb2dyYW1fY291bnRlcjsKLX0gcHNpbV9zdGF0dXM7Ci0KLQotLyogY3JlYXRlIGFuIGluaXRpYWwgZGV2aWNlIHRyZWUgYW5kIHRoZW4gcG9wdWxhdGUgaXQgdXNpbmcKLSAgIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gZWl0aGVyIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBmaWxlICovCi0KLWV4dGVybiBkZXZpY2UgKnBzaW1fdHJlZQotKHZvaWQpOwotCi1leHRlcm4gY2hhciAqKnBzaW1fb3B0aW9ucwotKGRldmljZSAqcm9vdCwKLSBjaGFyICoqYXJndik7Ci0KLWV4dGVybiB2b2lkIHBzaW1fY29tbWFuZAotKGRldmljZSAqcm9vdCwKLSBjaGFyICoqYXJndik7Ci0KLQotZXh0ZXJuIHZvaWQgcHNpbV9tZXJnZV9kZXZpY2VfZmlsZQotKGRldmljZSAqcm9vdCwKLSBjb25zdCBjaGFyICpmaWxlX25hbWUpOwotCi1leHRlcm4gdm9pZCBwc2ltX3VzYWdlCi0oaW50IHZlcmJvc2UpOwotCi0KLS8qIGNyZWF0ZSBhIG5ldyBzaW11bGF0b3IgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KLQotZXh0ZXJuIHBzaW0gKnBzaW1fY3JlYXRlCi0oY29uc3QgY2hhciAqZmlsZV9uYW1lLAotIGRldmljZSAqcm9vdCk7Ci0KLQotLyogR2l2ZW4gdGhlIGNyZWF0ZWQgc2ltdWxhdG9yIChyZSkgaW5pdGlhbGl6ZSBpdCAqLwotCi1leHRlcm4gdm9pZCBwc2ltX2luaXQKLShwc2ltICpzeXN0ZW0pOwotCi1leHRlcm4gdm9pZCBwc2ltX3N0YWNrCi0ocHNpbSAqc3lzdGVtLAotIGNoYXIgKiphcmd2LAotIGNoYXIgKiplbnZwKTsKLQotCi0vKiBSdW4vc3RvcCB0aGUgc3lzdGVtICovCi0KLWV4dGVybiB2b2lkIHBzaW1fc3RlcAotKHBzaW0gKnN5c3RlbSk7Ci0KLWV4dGVybiB2b2lkIHBzaW1fcnVuCi0ocHNpbSAqc3lzdGVtKTsKLQotZXh0ZXJuIHZvaWQgcHNpbV9yZXN0YXJ0Ci0ocHNpbSAqc3lzdGVtLAotIGludCBjcHVfbnIpOwotCi1leHRlcm4gdm9pZCBwc2ltX3NldF9oYWx0X2FuZF9yZXN0YXJ0Ci0ocHNpbSAqc3lzdGVtLAotIHZvaWQgKmhhbHRfam1wX2J1ZiwKLSB2b2lkICpyZXN0YXJ0X2ptcF9idWYpOwotCi1leHRlcm4gdm9pZCBwc2ltX2NsZWFyX2hhbHRfYW5kX3Jlc3RhcnQKLShwc2ltICpzeXN0ZW0pOwotCi1leHRlcm4gdm9pZCBwc2ltX3N0b3AKLShwc2ltICpzeXN0ZW0pOwotCi1leHRlcm4gdm9pZCBwc2ltX2hhbHQKLShwc2ltICpzeXN0ZW0sCi0gaW50IGNwdV9uciwKLSBzdG9wX3JlYXNvbiByZWFzb24sCi0gaW50IHNpZ25hbCk7Ci0KLWV4dGVybiBpbnQgcHNpbV9sYXN0X2NwdQotKHBzaW0gKnN5c3RlbSk7Ci0KLWV4dGVybiBpbnQgcHNpbV9ucl9jcHVzCi0ocHNpbSAqc3lzdGVtKTsKLQotCi1leHRlcm4gcHNpbV9zdGF0dXMgcHNpbV9nZXRfc3RhdHVzCi0ocHNpbSAqc3lzdGVtKTsKLQotCi0vKiByZXZlYWwgdGhlIGludGVybmFscyBvZiB0aGUgc2ltdWxhdGlvbi4gIEdyYW50IGFjY2VzcyB0byB0aGUKLSAgIHByb2Nlc3NvciAoY3B1KSBkZXZpY2UgdHJlZSAoZGV2aWNlKSBhbmQgZXZlbnRzIChldmVudF9xdWV1ZSkuICovCi0KLWV4dGVybiBjcHUgKnBzaW1fY3B1Ci0ocHNpbSAqc3lzdGVtLAotIGludCBjcHVfbnIpOwotCi1leHRlcm4gZGV2aWNlICpwc2ltX2RldmljZQotKHBzaW0gKnN5c3RlbSwKLSBjb25zdCBjaGFyICpwYXRoKTsKLQotZXh0ZXJuIGV2ZW50X3F1ZXVlICpwc2ltX2V2ZW50X3F1ZXVlCi0ocHNpbSAqc3lzdGVtKTsKLSAKLQotCi0vKiBtYW5pcHVsYXRlIHRoZSBzdGF0ZSAocmVnaXN0ZXJzIG9yIG1lbW9yeSkgb2YgYSBwcm9jZXNzb3Igd2l0aGluCi0gICB0aGUgc3lzdGVtLiAgSW4gdGhlIGNhc2Ugb2YgbWVtb3J5LCB0aGUgcmVhZC93cml0ZSBpcyBwZXJmb3JtZWQKLSAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29ycyBhZGRyZXNzIHRyYW5zbGF0aW9uIHRhYmxlcy4KLQotICAgV2hlcmUgYXBwbGljYWJsZSwgV0hJQ0hfQ1BVID09IC0xIGluZGljYXRlcyBhbGwgcHJvY2Vzc29ycyBhbmQKLSAgIFdISUNIX0NQVSA9PSA8bnJfY3B1cz4gaW5kaWNhdGVzIHRoZSBgY3VycmVudCcgcHJvY2Vzc29yLiAqLwotCi1leHRlcm4gdm9pZCBwc2ltX3JlYWRfcmVnaXN0ZXIKLShwc2ltICpzeXN0ZW0sCi0gaW50IHdoaWNoX2NwdSwKLSB2b2lkICpob3N0X29yZGVyZWRfYnVmLAotIGNvbnN0IGNoYXIgcmVnW10sCi0gdHJhbnNmZXJfbW9kZSBtb2RlKTsKLQotZXh0ZXJuIHZvaWQgcHNpbV93cml0ZV9yZWdpc3RlcgotKHBzaW0gKnN5c3RlbSwKLSBpbnQgd2hpY2hfY3B1LAotIGNvbnN0IHZvaWQgKmJ1ZiwKLSBjb25zdCBjaGFyIHJlZ1tdLAotIHRyYW5zZmVyX21vZGUgbW9kZSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBwc2ltX3JlYWRfbWVtb3J5Ci0ocHNpbSAqc3lzdGVtLAotIGludCB3aGljaF9jcHUsCi0gdm9pZCAqYnVmLAotIHVuc2lnbmVkX3dvcmQgdmFkZHIsCi0gdW5zaWduZWQgbGVuKTsKLQotZXh0ZXJuIHVuc2lnbmVkIHBzaW1fd3JpdGVfbWVtb3J5Ci0ocHNpbSAqc3lzdGVtLAotIGludCB3aGljaF9jcHUsCi0gY29uc3Qgdm9pZCAqYnVmLAotIHVuc2lnbmVkX3dvcmQgdmFkZHIsCi0gdW5zaWduZWQgbGVuLAotIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKTsKLQotZXh0ZXJuIHZvaWQgcHNpbV9wcmludF9pbmZvCi0ocHNpbSAqc3lzdGVtLAotIGludCB2ZXJib3NlKTsKLQotI2VuZGlmIC8qIF9QU0lNX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3BzaW0udGV4aW5mbyBiL3NpbS9wcGMvcHNpbS50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFlNDYwLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvcHNpbS50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNSArMCwwIEBACi1caW5wdXQgdGV4aW5mby50ZXggICAgQGMgLSotdGV4aW5mby0qLQotQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgdGV4aW5mbwotQHNldHRpdGxlIFRleGluZm8gQHZhbHVle2VkaXRpb259Ci1Ac3luY29kZWluZGV4IHZyIGZuCi1AZm9vdG5vdGVzdHlsZSBzZXBhcmF0ZQotQHBhcmFncmFwaGluZGVudCAyCi1Ac21hbGxib29rCi1AY29tbWVudCAlKiplbmQgb2YgaGVhZGVyCi0KLUBjIFNldCBzbWFsbGJvb2sgaWYgcHJpbnRpbmcgaW4gc21hbGxib29rIGZvcm1hdCBzbyB0aGUgZXhhbXBsZSBvZiB0aGUKLUBjIHNtYWxsYm9vayBmb250IGlzIGFjdHVhbGx5IHdyaXR0ZW4gdXNpbmcgc21hbGxib29rOyBpbiBiaWdib29rLCBhIGtsdWRnZQotQGMgaXMgdXNlZCBmb3IgVGVYIG91dHB1dC4KLUBzZXQgc21hbGxib29rCi1AYyBAQGNsZWFyIHNtYWxsYm9vawotCi1AaWdub3JlCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBUZXhpbmZvOiAodGV4aW5mbykuICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQgZm9yIHRoZSBHTlUgUHJvamVjdC4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi1AZW5kIGlnbm9yZQotCi1Ac2V0IGVkaXRpb24gMi4yMQotQHNldCB1cGRhdGUtZGF0ZSA3IEp1bmUgMTk5NQotQHNldCB1cGRhdGUtbW9udGggSnVuZSAxOTk1Ci0KLUBjIEV4cGVyaW1lbnQgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2Ygd2hpdGVzcGFjZSBiZXR3ZWVuIGNoYXB0ZXJzCi1AYyBhbmQgc2VjdGlvbnMuCi1AdGV4Ci1cZ2xvYmFsXGNoYXBoZWFkaW5nc2tpcCA9IDE1cHQgcGx1cyA0cHQgbWludXMgMnB0IAotXGdsb2JhbFxzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Ci1cZ2xvYmFsXHN1YnNlY2hlYWRpbmdza2lwID0gOXB0IHBsdXMgMnB0IG1pbnVzIDJwdAotQGVuZCB0ZXgKLQotQGMgRXhwZXJpbWVudCB3aXRoIHNtYWxsZXIgYW1vdW50cyBvZiB3aGl0ZXNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbgotQGMgdGhlIDguNSBieSAxMSBpbmNoIGZvcm1hdC4KLUBpZmNsZWFyIHNtYWxsYm9vawotQHRleAotXGdsb2JhbFxwYXJza2lwIDZwdCBwbHVzIDFwdAotQGVuZCB0ZXgKLUBlbmQgaWZjbGVhcgotCi1AZmluYWxvdXQKLQotQGMgQ3VycmVudGx5IHVuZG9jdW1lbnRlZCBjb21tYW5kLCA1IERlY2VtYmVyIDE5OTM6Ci1AYwotQGMgbndub2RlICAgICAgICAgIChTYW1lIGFzIG5vZGUsIGJ1dCBubyB3YXJuaW5nczsgZm9yIGBtYWtlaW5mbycuKQotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIFRleGluZm8sIGEgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdCB1c2VzIGEgc2luZ2xlCi1zb3VyY2UgZmlsZSB0byBwcm9kdWNlIGJvdGggb24tbGluZSBpbmZvcm1hdGlvbiBhbmQgYSBwcmludGVkIG1hbnVhbC4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIHRoZSBzZWNvbmQgZWRpdGlvbiBvZiB0aGUgVGV4aW5mbyBkb2N1bWVudGF0aW9uLEAqCi1hbmQgaXMgY29uc2lzdGVudCB3aXRoIHZlcnNpb24gMiBvZiBAZmlsZXt0ZXhpbmZvLnRleH0uCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLQotQHNob3J0dGl0bGVwYWdlIFRleGluZm8KLQotQHRpdGxlcGFnZQotQGMgdXNlIHRoZSBuZXcgZm9ybWF0IGZvciB0aXRsZXMKLUB0aXRsZSBUZXhpbmZvCi1Ac3VidGl0bGUgVGhlIEdOVSBEb2N1bWVudGF0aW9uIEZvcm1hdAotQHN1YnRpdGxlIEVkaXRpb24gQHZhbHVle2VkaXRpb259LCBmb3IgVGV4aW5mbyBWZXJzaW9uIFRocmVlCi1Ac3VidGl0bGUgQHZhbHVle3VwZGF0ZS1tb250aH0KLQotQGF1dGhvciBieSBSb2JlcnQgSi4gQ2hhc3NlbGwgYW5kIFJpY2hhcmQgTS4gU3RhbGxtYW4KLQotQGNvbW1lbnQgICBJbmNsdWRlIHRoZSBEaXN0cmlidXRpb24gaW5zaWRlIHRoZSB0aXRsZXBhZ2Ugc28KLUBjIHRoYXQgaGVhZGluZ3MgYXJlIHR1cm5lZCBvZmYuIAotCi1AcGFnZQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1Ac3AgMgotVGhpcyBpcyB0aGUgc2Vjb25kIGVkaXRpb24gb2YgdGhlIFRleGluZm8gZG9jdW1lbnRhdGlvbixAKgotYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCB2ZXJzaW9uIDIgb2YgQGZpbGV7dGV4aW5mby50ZXh9LgotQHNwIDIKLQotUHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gQCoKLTU5IFRlbXBsZSBQbGFjZSBTdWl0ZSAzMzAsIEAqCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIEAqCi1QcmludGVkIGNvcGllcyBhcmUgYXZhaWxhYmxlIGZvciAkMTUgZWFjaC5AKgotSVNCTiAxLTg4MjExNC02My05Ci1AYyBJU0JOIG51bWJlciAxLTg4MjExNC02My05IGlzIGZvciBlZGl0aW9uIDIuMjAgb2YgMjggRmVicnVhcnkgMTk5NQotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBzcCAyCi1Db3ZlciBhcnQgYnkgRXRpZW5uZSBTdXZhc2EuCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AsIENvcHlpbmcsIChkaXIpLCAoZGlyKQotQHRvcCBUZXhpbmZvCi0KLVRleGluZm8gaXMgYSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0IHVzZXMgYSBzaW5nbGUgc291cmNlIGZpbGUgdG8KLXByb2R1Y2UgYm90aCBvbi1saW5lIGluZm9ybWF0aW9uIGFuZCBwcmludGVkIG91dHB1dC5AcmVmaWxsCi0KLVRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgbWFzdGVyIG1lbnUgbGlzdHMgdGhlIG1ham9yIG5vZGVzIGluIHRoaXMgSW5mbwotZG9jdW1lbnQsIGluY2x1ZGluZyB0aGUgQEAtY29tbWFuZCBhbmQgY29uY2VwdCBpbmRpY2VzLiAgVGhlIHJlc3Qgb2YKLXRoZSBtZW51IGxpc3RzIGFsbCB0aGUgbG93ZXIgbGV2ZWwgbm9kZXMgaW4gdGhlIGRvY3VtZW50LkByZWZpbGwKLQotVGhpcyBpcyBFZGl0aW9uIEB2YWx1ZXtlZGl0aW9ufSBvZiB0aGUgVGV4aW5mbyBkb2N1bWVudGF0aW9uLCAKLUB3e0B2YWx1ZXt1cGRhdGUtZGF0ZX0sfSBmb3IgVGV4aW5mbyBWZXJzaW9uIFRocmVlLgotQGVuZCBpZmluZm8KLQotQGMgSGVyZSBpcyBhIHNwYXJlIGNvcHkgb2YgdGhlIGNoYXB0ZXIgbWVudSBlbnRyeSBkZXNjcmlwdGlvbnMsCi1AYyBpbiBjYXNlIHRoZXkgYXJlIGFjY2lkZW50bHkgZGVsZXRlZCAKLUBpZ25vcmUKLVlvdXIgcmlnaHRzLgotVGV4aW5mbyBpbiBicmllZi4KLUhvdyB0byB1c2UgVGV4aW5mbyBtb2RlLgotV2hhdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgVGV4aW5mbyBmaWxlPwotV2hhdCBpcyBhdCB0aGUgZW5kIG9mIGEgVGV4aW5mbyBmaWxlPwotSG93IHRvIGNyZWF0ZSBjaGFwdGVycywgc2VjdGlvbnMsIHN1YnNlY3Rpb25zLAotICBhcHBlbmRpY2VzLCBhbmQgb3RoZXIgcGFydHMuCi1Ib3cgdG8gcHJvdmlkZSBzdHJ1Y3R1cmUgZm9yIGEgZG9jdW1lbnQuCi1Ib3cgdG8gd3JpdGUgbm9kZXMuCi1Ib3cgdG8gd3JpdGUgbWVudXMuCi1Ib3cgdG8gd3JpdGUgY3Jvc3MgcmVmZXJlbmNlcy4KLUhvdyB0byBtYXJrIHdvcmRzIGFuZCBwaHJhc2VzIGFzIGNvZGUsCi0gIGtleWJvYXJkIGlucHV0LCBtZXRhLXN5bnRhY3RpYwotICB2YXJpYWJsZXMsIGFuZCB0aGUgbGlrZS4KLUhvdyB0byB3cml0ZSBxdW90YXRpb25zLCBleGFtcGxlcywgZXRjLgotSG93IHRvIHdyaXRlIGxpc3RzIGFuZCB0YWJsZXMuCi1Ib3cgdG8gY3JlYXRlIGluZGljZXMuCi1Ib3cgdG8gaW5zZXJ0IEBALXNpZ25zLCBicmFjZXMsIGV0Yy4KLUhvdyB0byBpbmRpY2F0ZSByZXN1bHRzIG9mIGV2YWx1YXRpb24sCi0gIGV4cGFuc2lvbiBvZiBtYWNyb3MsIGVycm9ycywgZXRjLgotSG93IHRvIGZvcmNlIGFuZCBwcmV2ZW50IGxpbmUgYW5kIHBhZ2UgYnJlYWtzLgotSG93IHRvIGRlc2NyaWJlIGZ1bmN0aW9ucyBhbmQgdGhlIGxpa2UgaW4gYSB1bmlmb3JtIG1hbm5lci4KLUhvdyB0byB3cml0ZSBmb290bm90ZXMuCi1Ib3cgdG8gc3BlY2lmeSB0ZXh0IGZvciBlaXRoZXIgQFRlWHt9IG9yIEluZm8uCi1Ib3cgdG8gcHJpbnQgaGFyZGNvcHkuCi1Ib3cgdG8gY3JlYXRlIGFuIEluZm8gZmlsZS4KLUhvdyB0byBpbnN0YWxsIGFuIEluZm8gZmlsZQotQSBsaXN0IG9mIGFsbCB0aGUgVGV4aW5mbyBAQC1jb21tYW5kcy4KLUhpbnRzIG9uIGhvdyB0byB3cml0ZSBhIFRleGluZm8gZG9jdW1lbnQuCi1BIHNhbXBsZSBUZXhpbmZvIGZpbGUgdG8gbG9vayBhdC4KLVRlbGwgcmVhZGVycyB0aGV5IGhhdmUgdGhlIHJpZ2h0IHRvIGNvcHkKLSAgYW5kIGRpc3RyaWJ1dGUuCi1Ib3cgdG8gaW5jb3Jwb3JhdGUgb3RoZXIgVGV4aW5mbyBmaWxlcy4KLUhvdyB0byB3cml0ZSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KLUhvdyB0byBmaW5kIGZvcm1hdHRpbmcgbWlzdGFrZXMuCi1BbGwgYWJvdXQgcGFyYWdyYXBoIHJlZmlsbGluZy4KLUEgZGVzY3JpcHRpb24gb2YgQEAtQ29tbWFuZCBzeW50YXguCi1UZXhpbmZvIHNlY29uZCBlZGl0aW9uIGZlYXR1cmVzLgotQSBtZW51IGNvbnRhaW5pbmcgY29tbWFuZHMgYW5kIHZhcmlhYmxlcy4KLUEgbWVudSBjb3ZlcmluZyBtYW55IHRvcGljcy4KLUBlbmQgaWdub3JlCi0KLUBtZW51Ci0qIENvcHlpbmc6OiAgICAgICAgICAgICAgICAgICAgIFlvdXIgcmlnaHRzLiAKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgVGV4aW5mbyBpbiBicmllZi4KLSogVGV4aW5mbyBNb2RlOjogICAgICAgICAgICAgICAgSG93IHRvIHVzZSBUZXhpbmZvIG1vZGUuCi0qIEJlZ2lubmluZyBhIEZpbGU6OiAgICAgICAgICAgIFdoYXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFRleGluZm8gZmlsZT8KLSogRW5kaW5nIGEgRmlsZTo6ICAgICAgICAgICAgICAgV2hhdCBpcyBhdCB0aGUgZW5kIG9mIGEgVGV4aW5mbyBmaWxlPwotKiBTdHJ1Y3R1cmluZzo6ICAgICAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIGNoYXB0ZXJzLCBzZWN0aW9ucywgc3Vic2VjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kaWNlcywgYW5kIG90aGVyIHBhcnRzLgotKiBOb2Rlczo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgbm9kZXMuCi0qIE1lbnVzOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBtZW51cy4KLSogQ3Jvc3MgUmVmZXJlbmNlczo6ICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNyb3NzIHJlZmVyZW5jZXMuCi0qIE1hcmtpbmcgVGV4dDo6ICAgICAgICAgICAgICAgIEhvdyB0byBtYXJrIHdvcmRzIGFuZCBwaHJhc2VzIGFzIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQgaW5wdXQsIG1ldGEtc3ludGFjdGljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLCBhbmQgdGhlIGxpa2UuCi0qIFF1b3RhdGlvbnMgYW5kIEV4YW1wbGVzOjogICAgIEhvdyB0byB3cml0ZSBxdW90YXRpb25zLCBleGFtcGxlcywgZXRjLgotKiBMaXN0cyBhbmQgVGFibGVzOjogICAgICAgICAgICBIb3cgdG8gd3JpdGUgbGlzdHMgYW5kIHRhYmxlcy4KLSogSW5kaWNlczo6ICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGNyZWF0ZSBpbmRpY2VzLgotKiBJbnNlcnRpb25zOjogICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IEBALXNpZ25zLCBicmFjZXMsIGV0Yy4KLSogR2x5cGhzOjogICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHJlc3VsdHMgb2YgZXZhbHVhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb24gb2YgbWFjcm9zLCBlcnJvcnMsIGV0Yy4KLSogQnJlYWtzOjogICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcmNlIGFuZCBwcmV2ZW50IGxpbmUgYW5kIHBhZ2UgYnJlYWtzLgotKiBEZWZpbml0aW9uIENvbW1hbmRzOjogICAgICAgICBIb3cgdG8gZGVzY3JpYmUgZnVuY3Rpb25zIGFuZCB0aGUgbGlrZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHVuaWZvcm0gbWFubmVyLgotKiBGb290bm90ZXM6OiAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgZm9vdG5vdGVzLgotKiBDb25kaXRpb25hbHM6OiAgICAgICAgICAgICAgICBIb3cgdG8gc3BlY2lmeSB0ZXh0IGZvciBlaXRoZXIgQFRlWHt9IG9yIEluZm8uCi0qIEZvcm1hdC9QcmludCBIYXJkY29weTo6ICAgICAgIEhvdyB0byBjb252ZXJ0IGEgVGV4aW5mbyBmaWxlIHRvIGEgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcmludGluZyBhbmQgaG93IHRvIHByaW50IHRoYXQgZmlsZS4KLSogQ3JlYXRlIGFuIEluZm8gRmlsZTo6ICAgICAgICAgQ29udmVydCBhIFRleGluZm8gZmlsZSBpbnRvIGFuIEluZm8gZmlsZS4KLSogSW5zdGFsbCBhbiBJbmZvIEZpbGU6OiAgICAgICAgTWFrZSBhbiBJbmZvIGZpbGUgYWNjZXNzaWJsZSB0byB1c2Vycy4KLSogQ29tbWFuZCBMaXN0OjogICAgICAgICAgICAgICAgQWxsIHRoZSBUZXhpbmZvIEBALWNvbW1hbmRzLgotKiBUaXBzOjogICAgICAgICAgICAgICAgICAgICAgICBIaW50cyBvbiBob3cgdG8gd3JpdGUgYSBUZXhpbmZvIGRvY3VtZW50LgotKiBTYW1wbGUgVGV4aW5mbyBGaWxlOjogICAgICAgICBBIHNhbXBsZSBUZXhpbmZvIGZpbGUgdG8gbG9vayBhdC4KLSogU2FtcGxlIFBlcm1pc3Npb25zOjogICAgICAgICAgVGVsbCByZWFkZXJzIHRoZXkgaGF2ZSB0aGUgcmlnaHQgdG8gY29weQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlLgotKiBJbmNsdWRlIEZpbGVzOjogICAgICAgICAgICAgICBIb3cgdG8gaW5jb3Jwb3JhdGUgb3RoZXIgVGV4aW5mbyBmaWxlcy4KLSogSGVhZGluZ3M6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgotKiBDYXRjaGluZyBNaXN0YWtlczo6ICAgICAgICAgICBIb3cgdG8gZmluZCBmb3JtYXR0aW5nIG1pc3Rha2VzLgotKiBSZWZpbGxpbmcgUGFyYWdyYXBoczo6ICAgICAgICBBbGwgYWJvdXQgcGFyYWdyYXBoIHJlZmlsbGluZy4KLSogQ29tbWFuZCBTeW50YXg6OiAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiBAQC1Db21tYW5kIHN5bnRheC4KLSogT2J0YWluaW5nIFRlWDo6ICAgICAgICAgICAgICAgSG93IHRvIE9idGFpbiBAVGVYe30uCi0qIE5ldyBGZWF0dXJlczo6ICAgICAgICAgICAgICAgIFRleGluZm8gc2Vjb25kIGVkaXRpb24gZmVhdHVyZXMuCi0qIENvbW1hbmQgYW5kIFZhcmlhYmxlIEluZGV4OjogIEEgbWVudSBjb250YWluaW5nIGNvbW1hbmRzIGFuZCB2YXJpYWJsZXMuCi0qIENvbmNlcHQgSW5kZXg6OiAgICAgICAgICAgICAgIEEgbWVudSBjb3ZlcmluZyBtYW55IHRvcGljcy4KLQotIC0tLSBUaGUgRGV0YWlsZWQgTm9kZSBMaXN0aW5nIC0tLQotCi1PdmVydmlldyBvZiBUZXhpbmZvCi0KLSogVXNpbmcgVGV4aW5mbzo6ICAgICAgICAgICAgICAgQ3JlYXRlIGEgY29udmVudGlvbmFsIHByaW50ZWQgYm9vayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBJbmZvIGZpbGUuCi0qIEluZm8gRmlsZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgaXMgYW4gSW5mbyBmaWxlPwotKiBQcmludGVkIEJvb2tzOjogICAgICAgICAgICAgICBDaGFyYWN0ZXJpc3RpY3Mgb2YgYSBwcmludGVkIGJvb2sgb3IgbWFudWFsLgotKiBGb3JtYXR0aW5nIENvbW1hbmRzOjogICAgICAgICBAQC1jb21tYW5kcyBhcmUgdXNlZCBmb3IgZm9ybWF0dGluZy4KLSogQ29udmVudGlvbnM6OiAgICAgICAgICAgICAgICAgR2VuZXJhbCBydWxlcyBmb3Igd3JpdGluZyBhIFRleGluZm8gZmlsZS4KLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNvbW1lbnRzIGFuZCBtYXJrIHJlZ2lvbnMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXR0aW5nIGNvbW1hbmRzIHdpbGwgaWdub3JlLgotKiBNaW5pbXVtOjogICAgICAgICAgICAgICAgICAgICBXaGF0IGEgVGV4aW5mbyBmaWxlIG11c3QgaGF2ZS4KLSogU2l4IFBhcnRzOjogICAgICAgICAgICAgICAgICAgVXN1YWxseSwgYSBUZXhpbmZvIGZpbGUgaGFzIHNpeCBwYXJ0cy4KLSogU2hvcnQgU2FtcGxlOjogICAgICAgICAgICAgICAgQSBzaG9ydCBzYW1wbGUgVGV4aW5mbyBmaWxlLgotKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICAKLQotVXNpbmcgVGV4aW5mbyBNb2RlCi0KLSogVGV4aW5mbyBNb2RlIE92ZXJ2aWV3OjogICAgICAgSG93IFRleGluZm8gbW9kZSBjYW4gaGVscCB5b3UuCi0qIEVtYWNzIEVkaXRpbmc6OiAgICAgICAgICAgICAgIFRleGluZm8gbW9kZSBhZGRzIHRvIEdOVSBFbWFjcycgZ2VuZXJhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2UgZWRpdGluZyBmZWF0dXJlcy4KLSogSW5zZXJ0aW5nOjogICAgICAgICAgICAgICAgICAgSG93IHRvIGluc2VydCBmcmVxdWVudGx5IHVzZWQgQEAtY29tbWFuZHMuIAotKiBTaG93aW5nIHRoZSBTdHJ1Y3R1cmU6OiAgICAgICBIb3cgdG8gc2hvdyB0aGUgc3RydWN0dXJlIG9mIGEgZmlsZS4KLSogVXBkYXRpbmcgTm9kZXMgYW5kIE1lbnVzOjogICAgSG93IHRvIHVwZGF0ZSBvciBjcmVhdGUgbmV3IG5vZGVzIGFuZCBtZW51cy4KLSogSW5mbyBGb3JtYXR0aW5nOjogICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBmb3IgSW5mby4KLSogUHJpbnRpbmc6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBhbmQgcHJpbnQgcGFydCBvciBhbGwgb2YgYSBmaWxlLgotKiBUZXhpbmZvIE1vZGUgU3VtbWFyeTo6ICAgICAgICBTdW1tYXJ5IG9mIGFsbCB0aGUgVGV4aW5mbyBtb2RlIGNvbW1hbmRzLgotCi1VcGRhdGluZyBOb2RlcyBhbmQgTWVudXMKLQotKiBVcGRhdGluZyBDb21tYW5kczo6ICAgICAgICAgICBGaXZlIG1ham9yIHVwZGF0aW5nIGNvbW1hbmRzLgotKiBVcGRhdGluZyBSZXF1aXJlbWVudHM6OiAgICAgICBIb3cgdG8gc3RydWN0dXJlIGEgVGV4aW5mbyBmaWxlIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSB1cGRhdGluZyBjb21tYW5kLgotKiBPdGhlciBVcGRhdGluZyBDb21tYW5kczo6ICAgICBIb3cgdG8gaW5kZW50IGRlc2NyaXB0aW9ucywgaW5zZXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyBub2RlcyBsaW5lcywgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzIGluIHNlcXVlbmNlLgotCi1CZWdpbm5pbmcgYSBUZXhpbmZvIEZpbGUKLQotKiBGb3VyIFBhcnRzOjogICAgICAgICAgICAgICAgICBGb3VyIHBhcnRzIGJlZ2luIGEgVGV4aW5mbyBmaWxlLgotKiBTYW1wbGUgQmVnaW5uaW5nOjogICAgICAgICAgICBIZXJlIGlzIGEgc2FtcGxlIGJlZ2lubmluZyBmb3IgYSBUZXhpbmZvIGZpbGUuCi0qIEhlYWRlcjo6ICAgICAgICAgICAgICAgICAgICAgIFRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBhIFRleGluZm8gZmlsZS4KLSogSW5mbyBTdW1tYXJ5IGFuZCBQZXJtaXNzaW9uczo6ICBTdW1tYXJ5IGFuZCBjb3B5aW5nIHBlcm1pc3Npb25zIGZvciBJbmZvLgotKiBUaXRsZXBhZ2UgJiBDb3B5cmlnaHQgUGFnZTo6ICBDcmVhdGluZyB0aGUgdGl0bGUgYW5kIGNvcHlyaWdodCBwYWdlcy4KLSogVGhlIFRvcCBOb2RlOjogICAgICAgICAgICAgICAgQ3JlYXRpbmcgdGhlIGBUb3AnIG5vZGUgYW5kIG1hc3RlciBtZW51LgotKiBTb2Z0d2FyZSBDb3B5aW5nIFBlcm1pc3Npb25zOjogIEVuc3VyZSB0aGF0IHlvdSBhbmQgb3RoZXJzIGNvbnRpbnVlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgcmlnaHQgdG8gdXNlIGFuZCBzaGFyZSBzb2Z0d2FyZS4KLQotVGhlIFRleGluZm8gRmlsZSBIZWFkZXIKLQotKiBGaXJzdCBMaW5lOjogICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgbGluZSBvZiBhIFRleGluZm8gZmlsZS4gIAotKiBTdGFydCBvZiBIZWFkZXI6OiAgICAgICAgICAgICBGb3JtYXR0aW5nIGEgcmVnaW9uIHJlcXVpcmVzIHRoaXMuCi0qIHNldGZpbGVuYW1lOjogICAgICAgICAgICAgICAgIFRlbGwgSW5mbyB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLgotKiBzZXR0aXRsZTo6ICAgICAgICAgICAgICAgICAgICBDcmVhdGUgYSB0aXRsZSBmb3IgdGhlIHByaW50ZWQgd29yay4KLSogc2V0Y2hhcHRlcm5ld3BhZ2U6OiAgICAgICAgICAgU3RhcnQgY2hhcHRlcnMgb24gcmlnaHQtaGFuZCBwYWdlcy4KLSogcGFyYWdyYXBoaW5kZW50OjogICAgICAgICAgICAgQW4gb3B0aW9uIHRvIHNwZWNpZnkgcGFyYWdyYXBoIGluZGVudGF0aW9uLgotKiBFbmQgb2YgSGVhZGVyOjogICAgICAgICAgICAgICBGb3JtYXR0aW5nIGEgcmVnaW9uIHJlcXVpcmVzIHRoaXMuCi0KLVRoZSBUaXRsZSBhbmQgQ29weXJpZ2h0IFBhZ2VzCi0KLSogdGl0bGVwYWdlOjogICAgICAgICAgICAgICAgICAgQ3JlYXRlIGEgdGl0bGUgZm9yIHRoZSBwcmludGVkIGRvY3VtZW50LgotKiB0aXRsZWZvbnQgY2VudGVyIHNwOjogICAgICAgICBUaGUgQGNvZGV7QEB0aXRsZWZvbnR9LCBAY29kZXtAQGNlbnRlcn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEBjb2Rle0BAc3B9IGNvbW1hbmRzLgotKiB0aXRsZSBzdWJ0aXRsZSBhdXRob3I6OiAgICAgICBUaGUgQGNvZGV7QEB0aXRsZX0sIEBjb2Rle0BAc3VidGl0bGV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBAY29kZXtAQGF1dGhvcn0gY29tbWFuZHMuCi0qIENvcHlyaWdodCAmIFBlcm1pc3Npb25zOjogICAgIEhvdyB0byB3cml0ZSB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGNvcHlpbmcgcGVybWlzc2lvbnMuCi0qIGVuZCB0aXRsZXBhZ2U6OiAgICAgICAgICAgICAgIFR1cm4gb24gcGFnZSBoZWFkaW5ncyBhZnRlciB0aGUgdGl0bGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weXJpZ2h0IHBhZ2VzLgotKiBoZWFkaW5ncyBvbiBvZmY6OiAgICAgICAgICAgICBBbiBvcHRpb24gZm9yIHR1cm5pbmcgaGVhZGluZ3Mgb24gYW5kIG9mZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb3VibGUgb3Igc2luZ2xlIHNpZGVkIHByaW50aW5nLgotCi1UaGUgYFRvcCcgTm9kZSBhbmQgTWFzdGVyIE1lbnUKLQotKiBUaXRsZSBvZiBUb3AgTm9kZTo6ICAgICAgICAgICBTa2V0Y2ggd2hhdCB0aGUgZmlsZSBpcyBhYm91dC4KLSogTWFzdGVyIE1lbnUgUGFydHM6OiAgICAgICAgICAgQSBtYXN0ZXIgbWVudSBoYXMgdGhyZWUgb3IgbW9yZSBwYXJ0cy4KLQotRW5kaW5nIGEgVGV4aW5mbyBGaWxlCi0KLSogUHJpbnRpbmcgSW5kaWNlcyAmIE1lbnVzOjogICAgSG93IHRvIHByaW50IGFuIGluZGV4IGluIGhhcmRjb3B5IGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBpbmRleCBtZW51cyBpbiBJbmZvLgotKiBDb250ZW50czo6ICAgICAgICAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIGEgdGFibGUgb2YgY29udGVudHMuCi0qIEZpbGUgRW5kOjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBtYXJrIHRoZSBlbmQgb2YgYSBmaWxlLgotCi1DaGFwdGVyIFN0cnVjdHVyaW5nCi0KLSogVHJlZSBTdHJ1Y3R1cmluZzo6ICAgICAgICAgICAgQSBtYW51YWwgaXMgbGlrZSBhbiB1cHNpZGUgZG93biB0cmVlIEBkb3Rze30KLSogU3RydWN0dXJpbmcgQ29tbWFuZCBUeXBlczo6ICAgSG93IHRvIGRpdmlkZSBhIG1hbnVhbCBpbnRvIHBhcnRzLgotKiBtYWtlaW5mbyB0b3A6OiAgICAgICAgICAgICAgICBUaGUgQGNvZGV7QEB0b3B9IGNvbW1hbmQsIHBhcnQgb2YgdGhlIGBUb3AnIG5vZGUuCi0qIGNoYXB0ZXI6OiAgICAgICAgICAgICAgICAgICAgIAotKiB1bm51bWJlcmVkICYgYXBwZW5kaXg6OiAgICAgICAKLSogbWFqb3JoZWFkaW5nICYgY2hhcGhlYWRpbmc6OiAgCi0qIHNlY3Rpb246OiAgICAgICAgICAgICAgICAgICAgIAotKiB1bm51bWJlcmVkc2VjIGFwcGVuZGl4c2VjIGhlYWRpbmc6OiAgCi0qIHN1YnNlY3Rpb246OiAgICAgICAgICAgICAgICAgIAotKiB1bm51bWJlcmVkc3Vic2VjIGFwcGVuZGl4c3Vic2VjIHN1YmhlYWRpbmc6OiAgCi0qIHN1YnN1YnNlY3Rpb246OiAgICAgICAgICAgICAgIENvbW1hbmRzIGZvciB0aGUgbG93ZXN0IGxldmVsIHNlY3Rpb25zLgotKiBSYWlzZS9sb3dlciBzZWN0aW9uczo6ICAgICAgICBIb3cgdG8gY2hhbmdlIGNvbW1hbmRzJyBoaWVyYXJjaGljYWwgbGV2ZWwuCi0KLU5vZGVzCi0KLSogVHdvIFBhdGhzOjogICAgICAgICAgICAgICAgICAgRGlmZmVyZW50IGNvbW1hbmRzIHRvIHN0cnVjdHVyZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvIG91dHB1dCBhbmQgcHJpbnRlZCBvdXRwdXQuCi0qIE5vZGUgTWVudSBJbGx1c3RyYXRpb246OiAgICAgIEEgZGlhZ3JhbSwgYW5kIHNhbXBsZSBub2RlcyBhbmQgbWVudXMuCi0qIG5vZGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhIG5vZGUsIGluIGRldGFpbC4KLSogbWFrZWluZm8gUG9pbnRlciBDcmVhdGlvbjo6ICAgSG93IHRvIGNyZWF0ZSBub2RlIHBvaW50ZXJzIHdpdGggQGNvZGV7bWFrZWluZm99LgotCi1UaGUgQGNvZGV7QEBub2RlfSBDb21tYW5kCi0KLSogTm9kZSBOYW1lczo6ICAgICAgICAgICAgICAgICAgSG93IHRvIGNob29zZSBub2RlIGFuZCBwb2ludGVyIG5hbWVzLgotKiBXcml0aW5nIGEgTm9kZTo6ICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgYW4gQGNvZGV7QEBub2RlfSBsaW5lLgotKiBOb2RlIExpbmUgVGlwczo6ICAgICAgICAgICAgICBLZWVwIG5hbWVzIHNob3J0LgotKiBOb2RlIExpbmUgUmVxdWlyZW1lbnRzOjogICAgICBLZWVwIG5hbWVzIHVuaXF1ZSwgd2l0aG91dCBAQC1jb21tYW5kcy4KLSogRmlyc3QgTm9kZTo6ICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGEgYFRvcCcgbm9kZS4KLSogbWFrZWluZm8gdG9wIGNvbW1hbmQ6OiAgICAgICAgSG93IHRvIHVzZSB0aGUgQGNvZGV7QEB0b3B9IGNvbW1hbmQuIAotKiBUb3AgTm9kZSBTdW1tYXJ5OjogICAgICAgICAgICBXcml0ZSBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciByZWFkZXJzLgotCi1NZW51cwotCi0qIE1lbnUgTG9jYXRpb246OiAgICAgICAgICAgICAgIFB1dCBhIG1lbnUgaW4gYSBzaG9ydCBub2RlLgotKiBXcml0aW5nIGEgTWVudTo6ICAgICAgICAgICAgICBXaGF0IGlzIGEgbWVudT8KLSogTWVudSBQYXJ0czo6ICAgICAgICAgICAgICAgICAgQSBtZW51IGVudHJ5IGhhcyB0aHJlZSBwYXJ0cy4KLSogTGVzcyBDbHV0dGVyZWQgTWVudSBFbnRyeTo6ICAgVHdvIHBhcnQgbWVudSBlbnRyeS4KLSogTWVudSBFeGFtcGxlOjogICAgICAgICAgICAgICAgVHdvIGFuZCB0aHJlZSBwYXJ0IG1lbnUgZW50cmllcy4KLSogT3RoZXIgSW5mbyBGaWxlczo6ICAgICAgICAgICAgSG93IHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IEluZm8gZmlsZS4KLQotQ3Jvc3MgUmVmZXJlbmNlcwotCi0qIFJlZmVyZW5jZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgY3Jvc3MgcmVmZXJlbmNlcyBhcmUgZm9yLgotKiBDcm9zcyBSZWZlcmVuY2UgQ29tbWFuZHM6OiAgICBBIHN1bW1hcnkgb2YgdGhlIGRpZmZlcmVudCBjb21tYW5kcy4KLSogQ3Jvc3MgUmVmZXJlbmNlIFBhcnRzOjogICAgICAgQSBjcm9zcyByZWZlcmVuY2UgaGFzIHNldmVyYWwgcGFydHMuCi0qIHhyZWY6OiAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luIGEgcmVmZXJlbmNlIHdpdGggYFNlZScgQGRvdHN7fQotKiBUb3AgTm9kZSBOYW1pbmc6OiAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhbm90aGVyIGZpbGUuCi0qIHJlZjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVmZXJlbmNlIGZvciB0aGUgbGFzdCBwYXJ0IG9mIGEgc2VudGVuY2UuCi0qIHB4cmVmOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhIHBhcmVudGhldGljYWwgY3Jvc3MgcmVmZXJlbmNlLgotKiBpbmZvcmVmOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gYW4gSW5mby1vbmx5IGZpbGUuCi0KLUBjb2Rle0BAeHJlZn0KLQotKiBSZWZlcmVuY2UgU3ludGF4OjogICAgICAgICAgICBXaGF0IGEgcmVmZXJlbmNlIGxvb2tzIGxpa2UgYW5kIHJlcXVpcmVzLgotKiBPbmUgQXJndW1lbnQ6OiAgICAgICAgICAgICAgICBAY29kZXtAQHhyZWZ9IHdpdGggb25lIGFyZ3VtZW50LgotKiBUd28gQXJndW1lbnRzOjogICAgICAgICAgICAgICBAY29kZXtAQHhyZWZ9IHdpdGggdHdvIGFyZ3VtZW50cy4KLSogVGhyZWUgQXJndW1lbnRzOjogICAgICAgICAgICAgQGNvZGV7QEB4cmVmfSB3aXRoIHRocmVlIGFyZ3VtZW50cy4KLSogRm91ciBhbmQgRml2ZSBBcmd1bWVudHM6OiAgICAgQGNvZGV7QEB4cmVmfSB3aXRoIGZvdXIgYW5kIGZpdmUgYXJndW1lbnRzLgotCi1NYXJraW5nIFdvcmRzIGFuZCBQaHJhc2VzCi0KLSogSW5kaWNhdGluZzo6ICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGRlZmluaXRpb25zLCBmaWxlcywgZXRjLgotKiBFbXBoYXNpczo6ICAgICAgICAgICAgICAgICAgICBIb3cgdG8gZW1waGFzaXplIHRleHQuCi0KLUluZGljYXRpbmcgRGVmaW5pdGlvbnMsIENvbW1hbmRzLCBldGMuCi0KLSogVXNlZnVsIEhpZ2hsaWdodGluZzo6ICAgICAgICAgSGlnaGxpZ2h0aW5nIHByb3ZpZGVzIHVzZWZ1bCBpbmZvcm1hdGlvbi4KLSogY29kZTo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGNvZGUuCi0qIGtiZDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBzaG93IGtleWJvYXJkIGlucHV0LgotKiBrZXk6OiAgICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gc3BlY2lmeSBrZXlzLgotKiBzYW1wOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gc2hvdyBhIGxpdGVyYWwgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KLSogdmFyOjogICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGEgbWV0YXN5bnRhY3RpYyB2YXJpYWJsZS4KLSogZmlsZTo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHRoZSBuYW1lIG9mIGEgZmlsZS4KLSogZGZuOjogICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgYSBkZWZpbml0aW9uLgotKiBjaXRlOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gYSBib29rIHRoYXQgaXMgbm90IGluIEluZm8uCi0KLUVtcGhhc2l6aW5nIFRleHQKLQotKiBlbXBoICYgc3Ryb25nOjogICAgICAgICAgICAgICBIb3cgdG8gZW1waGFzaXplIHRleHQgaW4gVGV4aW5mby4KLSogU21hbGxjYXBzOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHVzZSB0aGUgc21hbGwgY2FwcyBmb250LgotKiBGb250czo6ICAgICAgICAgICAgICAgICAgICAgICBWYXJpb3VzIGZvbnQgY29tbWFuZHMgZm9yIHByaW50ZWQgb3V0cHV0LgotKiBDdXN0b21pemVkIEhpZ2hsaWdodGluZzo6ICAgICBIb3cgdG8gZGVmaW5lIGhpZ2hsaWdodGluZyBjb21tYW5kcy4KLQotUXVvdGF0aW9ucyBhbmQgRXhhbXBsZXMKLQotKiBCbG9jayBFbmNsb3NpbmcgQ29tbWFuZHM6OiAgICBVc2UgZGlmZmVyZW50IGNvbnN0cnVjdHMgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBwdXJwb3Nlcy4KLSogcXVvdGF0aW9uOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGEgcXVvdGF0aW9uLgotKiBleGFtcGxlOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgYW4gZXhhbXBsZSBpbiBhIGZpeGVkLXdpZHRoIGZvbnQuCi0qIG5vaW5kZW50OjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBwcmV2ZW50IHBhcmFncmFwaCBpbmRlbnRhdGlvbi4KLSogTGlzcCBFeGFtcGxlOjogICAgICAgICAgICAgICAgSG93IHRvIGlsbHVzdHJhdGUgTGlzcCBjb2RlLgotKiBzbWFsbGV4YW1wbGUgJiBzbWFsbGxpc3A6OiAgICBGb3JtcyBmb3IgdGhlIEBjb2Rle0BAc21hbGxib29rfSBvcHRpb24uCi0qIGRpc3BsYXk6OiAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhbiBleGFtcGxlIGluIHRoZSBjdXJyZW50IGZvbnQuCi0qIGZvcm1hdDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhbiBleGFtcGxlIHRoYXQgZG9lcyBub3QgbmFycm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmdpbnMuCi0qIGV4ZGVudDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB1bmRvIHRoZSBpbmRlbnRhdGlvbiBvZiBhIGxpbmUuCi0qIGZsdXNobGVmdCAmIGZsdXNocmlnaHQ6OiAgICAgIEhvdyB0byBwdXNoIHRleHQgZmx1c2hsZWZ0IG9yIGZsdXNocmlnaHQuCi0qIGNhcnRvdWNoZTo6ICAgICAgICAgICAgICAgICAgIEhvdyB0byBkcmF3IGNhcnRvdWNoZXMgYXJvdW5kIGV4YW1wbGVzLgotCi1NYWtpbmcgTGlzdHMgYW5kIFRhYmxlcwotCi0qIEludHJvZHVjaW5nIExpc3RzOjogICAgICAgICAgIFRleGluZm8gZm9ybWF0cyBsaXN0cyBmb3IgeW91LgotKiBpdGVtaXplOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgc2ltcGxlIGxpc3QuCi0qIGVudW1lcmF0ZTo6ICAgICAgICAgICAgICAgICAgIEhvdyB0byBjb25zdHJ1Y3QgYSBudW1iZXJlZCBsaXN0LgotKiBUd28tY29sdW1uIFRhYmxlczo6ICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgdHdvLWNvbHVtbiB0YWJsZS4KLQotTWFraW5nIGEgVHdvLWNvbHVtbiBUYWJsZQotCi0qIHRhYmxlOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBjb25zdHJ1Y3QgYSB0d28tY29sdW1uIHRhYmxlLgotKiBmdGFibGUgdnRhYmxlOjogICAgICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgdHdvLWNvbHVtbiB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYXV0b21hdGljIGluZGV4aW5nLgotKiBpdGVteDo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcHV0IG1vcmUgZW50cmllcyBpbiB0aGUgZmlyc3QgY29sdW1uLgotCi1DcmVhdGluZyBJbmRpY2VzCi0KLSogSW5kZXggRW50cmllczo6ICAgICAgICAgICAgICAgQ2hvb3NlIGRpZmZlcmVudCB3b3JkcyBmb3IgaW5kZXggZW50cmllcy4KLSogUHJlZGVmaW5lZCBJbmRpY2VzOjogICAgICAgICAgVXNlIGRpZmZlcmVudCBpbmRpY2VzIGZvciBkaWZmZXJlbnQga2luZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBlbnRyeS4KLSogSW5kZXhpbmcgQ29tbWFuZHM6OiAgICAgICAgICAgSG93IHRvIG1ha2UgYW4gaW5kZXggZW50cnkuCi0qIENvbWJpbmluZyBJbmRpY2VzOjogICAgICAgICAgIEhvdyB0byBjb21iaW5lIGluZGljZXMuCi0qIE5ldyBJbmRpY2VzOjogICAgICAgICAgICAgICAgIEhvdyB0byBkZWZpbmUgeW91ciBvd24gaW5kaWNlcy4KLQotQ29tYmluaW5nIEluZGljZXMKLQotKiBzeW5jb2RlaW5kZXg6OiAgICAgICAgICAgICAgICBIb3cgdG8gbWVyZ2UgdHdvIGluZGljZXMsIHVzaW5nIEBjb2Rle0BAY29kZX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvciB0aGUgbWVyZ2VkLWZyb20gaW5kZXguCi0qIHN5bmluZGV4OjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBtZXJnZSB0d28gaW5kaWNlcywgdXNpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBmb250IG9mIHRoZSBtZXJnZWQtdG8gaW5kZXguCi0KLVNwZWNpYWwgSW5zZXJ0aW9ucwotCi0qIEJyYWNlcyBBdHNpZ25zIFBlcmlvZHM6OiAgICAgIEhvdyB0byBpbnNlcnQgYnJhY2VzLCBAc2FtcHtAQH0gYW5kIHBlcmlvZHMuCi0qIGRtbjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBmb3JtYXQgYSBkaW1lbnNpb24uCi0qIERvdHMgQnVsbGV0czo6ICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgZG90cyBhbmQgYnVsbGV0cy4KLSogVGVYIGFuZCBjb3B5cmlnaHQ6OiAgICAgICAgICAgSG93IHRvIGluc2VydCB0aGUgQFRlWHt9IGxvZ28gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBjb3B5cmlnaHQgc3ltYm9sLgotKiBtaW51czo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGEgbWludXMgc2lnbi4KLSogbWF0aDo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBhIG1hdGhlbWF0aWNhbCBleHByZXNzaW9uLgotCi1JbnNlcnRpbmcgQHNhbXB7QEB9LCBCcmFjZXMsIGFuZCBQZXJpb2RzCi0KLSogSW5zZXJ0aW5nIEFuIEF0c2lnbjo6ICAgICAgICAgCi0qIEluc2VydGluZyBCcmFjZXM6OiAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgQHNhbXB7QHt9IGFuZCBAc2FtcHtAfX0KLSogQ29udHJvbGxpbmcgU3BhY2luZzo6ICAgICAgICAgSG93IHRvIGluc2VydCB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgcHVuY3R1YXRpb24gd2l0aGluIGEgc2VudGVuY2UuCi0KLUluc2VydGluZyBFbGxpcHNpcywgRG90cywgYW5kIEJ1bGxldHMKLQotKiBkb3RzOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGRvdHMgQGRvdHN7fQotKiBidWxsZXQ6OiAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGEgYnVsbGV0LgotCi1JbnNlcnRpbmcgQFRlWHt9IGFuZCB0aGUgQ29weXJpZ2h0IFN5bWJvbAotCi0qIHRleDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgdGhlIEBUZVh7fSBsb2dvLgotKiBjb3B5cmlnaHQgc3ltYm9sOjogICAgICAgICAgICBIb3cgdG8gdXNlIEBjb2Rle0BAY29weXJpZ2h0fUB7QH0uCi0KLUdseXBocyBmb3IgRXhhbXBsZXMgCi0KLSogR2x5cGhzIFN1bW1hcnk6OiAgICAgICAgICAgICAgCi0qIHJlc3VsdDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBzaG93IHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbi4KLSogZXhwYW5zaW9uOjogICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGFuIGV4cGFuc2lvbi4KLSogUHJpbnQgR2x5cGg6OiAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHByaW50ZWQgb3V0cHV0LgotKiBFcnJvciBHbHlwaDo6ICAgICAgICAgICAgICAgICBIb3cgdG8gaW5kaWNhdGUgYW4gZXJyb3IgbWVzc2FnZS4KLSogRXF1aXZhbGVuY2U6OiAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGVxdWl2YWxlbmNlLgotKiBQb2ludCBHbHlwaDo6ICAgICAgICAgICAgICAgICBIb3cgdG8gaW5kaWNhdGUgdGhlIGxvY2F0aW9uIG9mIHBvaW50LgotCi1NYWtpbmcgYW5kIFByZXZlbnRpbmcgQnJlYWtzCi0KLSogQnJlYWsgQ29tbWFuZHM6OiAgICAgICAgICAgICAgQ2F1c2UgYW5kIHByZXZlbnQgc3BsaXRzLgotKiBMaW5lIEJyZWFrczo6ICAgICAgICAgICAgICAgICBIb3cgdG8gZm9yY2UgYSBzaW5nbGUgbGluZSB0byB1c2UgdHdvIGxpbmVzLgotKiB3OjogICAgICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcHJldmVudCB1bndhbnRlZCBsaW5lIGJyZWFrcy4gCi0qIHNwOjogICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgYmxhbmsgbGluZXMuCi0qIHBhZ2U6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBmb3JjZSB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZS4KLSogZ3JvdXA6OiAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIHByZXZlbnQgdW53YW50ZWQgcGFnZSBicmVha3MuCi0qIG5lZWQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgd2F5IHRvIHByZXZlbnQgdW53YW50ZWQgcGFnZSBicmVha3MuCi0KLURlZmluaXRpb24gQ29tbWFuZHMKLQotKiBEZWYgQ21kIFRlbXBsYXRlOjogICAgICAgICAgICBIb3cgdG8gc3RydWN0dXJlIGEgZGVzY3JpcHRpb24gdXNpbmcgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gY29tbWFuZC4KLSogT3B0aW9uYWwgQXJndW1lbnRzOjogICAgICAgICAgSG93IHRvIGhhbmRsZSBvcHRpb25hbCBhbmQgcmVwZWF0ZWQgYXJndW1lbnRzLgotKiBkZWZmbng6OiAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gZ3JvdXAgdHdvIG9yIG1vcmUgYGZpcnN0JyBsaW5lcy4KLSogRGVmIENtZHMgaW4gRGV0YWlsOjogICAgICAgICAgQWxsIHRoZSBkZWZpbml0aW9uIGNvbW1hbmRzLgotKiBEZWYgQ21kIENvbnZlbnRpb25zOjogICAgICAgICBDb252ZW50aW9ucyBmb3Igd3JpdGluZyBkZWZpbml0aW9ucy4KLSogU2FtcGxlIEZ1bmN0aW9uIERlZmluaXRpb246OiAgCi0KLVRoZSBEZWZpbml0aW9uIENvbW1hbmRzCi0KLSogRnVuY3Rpb25zIENvbW1hbmRzOjogICAgICAgICAgQ29tbWFuZHMgZm9yIGZ1bmN0aW9ucyBhbmQgc2ltaWxhciBlbnRpdGllcy4KLSogVmFyaWFibGVzIENvbW1hbmRzOjogICAgICAgICAgQ29tbWFuZHMgZm9yIHZhcmlhYmxlcyBhbmQgc2ltaWxhciBlbnRpdGllcy4KLSogVHlwZWQgRnVuY3Rpb25zOjogICAgICAgICAgICAgQ29tbWFuZHMgZm9yIGZ1bmN0aW9ucyBpbiB0eXBlZCBsYW5ndWFnZXMuCi0qIFR5cGVkIFZhcmlhYmxlczo6ICAgICAgICAgICAgIENvbW1hbmRzIGZvciB2YXJpYWJsZXMgaW4gdHlwZWQgbGFuZ3VhZ2VzLgotKiBBYnN0cmFjdCBPYmplY3RzOjogICAgICAgICAgICBDb21tYW5kcyBmb3Igb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLgotKiBEYXRhIFR5cGVzOjogICAgICAgICAgICAgICAgICBUaGUgZGVmaW5pdGlvbiBjb21tYW5kIGZvciBkYXRhIHR5cGVzLgotCi1Gb290bm90ZXMKLQotKiBGb290bm90ZSBDb21tYW5kczo6ICAgICAgICAgICBIb3cgdG8gd3JpdGUgYSBmb290bm90ZSBpbiBUZXhpbmZvLgotKiBGb290bm90ZSBTdHlsZXM6OiAgICAgICAgICAgICBDb250cm9sbGluZyBob3cgZm9vdG5vdGVzIGFwcGVhciBpbiBJbmZvLgotCi1Db25kaXRpb25hbGx5IFZpc2libGUgVGV4dAotCi0qIENvbmRpdGlvbmFsIENvbW1hbmRzOjogICAgICAgIEhvdyB0byBzcGVjaWZ5IHRleHQgZm9yIEluZm8gb3IgQFRlWHt9LgotKiBVc2luZyBPcmRpbmFyeSBUZVggQ29tbWFuZHM6OiAgWW91IGNhbiB1c2UgYW55IGFuZCBhbGwgQFRlWHt9IGNvbW1hbmRzLgotKiBzZXQgY2xlYXIgdmFsdWU6OiAgICAgICAgICAgICBIb3cgdG8gZGVzaWduYXRlIHdoaWNoIHRleHQgdG8gZm9ybWF0IChmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIEluZm8gYW5kIEBUZVh7fSk7IGFuZCBob3cgdG8gc2V0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIHRvIGEgc3RyaW5nIHRoYXQgeW91IGNhbiBpbnNlcnQuCi0KLUBjb2Rle0BAc2V0fSwgQGNvZGV7QEBjbGVhcn0sIGFuZCBAY29kZXtAQHZhbHVlfQotCi0qIGlmc2V0IGlmY2xlYXI6OiAgICAgICAgICAgICAgIEZvcm1hdCBhIHJlZ2lvbiBpZiBhIGZsYWcgaXMgc2V0LgotKiB2YWx1ZTo6ICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlIGEgZmxhZyB3aXRoIGEgc3RyaW5nLiAKLSogdmFsdWUgRXhhbXBsZTo6ICAgICAgICAgICAgICAgQW4gZWFzeSB3YXkgdG8gdXBkYXRlIGVkaXRpb24gaW5mb3JtYXRpb24uCi0KLUZvcm1hdCBhbmQgUHJpbnQgSGFyZGNvcHkKLQotKiBVc2UgVGVYOjogICAgICAgICAgICAgICAgICAgICBVc2UgQFRlWHt9IHRvIGZvcm1hdCBmb3IgaGFyZGNvcHkuCi0qIEZvcm1hdCB3aXRoIHRleC90ZXhpbmRleDo6ICAgIEhvdyB0byBmb3JtYXQgaW4gYSBzaGVsbC4KLSogRm9ybWF0IHdpdGggdGV4aTJkdmk6OiAgICAgICAgQSBzaW1wbGVyIHdheSB0byB1c2UgdGhlIHNoZWxsLgotKiBQcmludCB3aXRoIGxwcjo6ICAgICAgICAgICAgICBIb3cgdG8gcHJpbnQuCi0qIFdpdGhpbiBFbWFjczo6ICAgICAgICAgICAgICAgIEhvdyB0byBmb3JtYXQgYW5kIHByaW50IGZyb20gYW4gRW1hY3Mgc2hlbGwuCi0qIFRleGluZm8gTW9kZSBQcmludGluZzo6ICAgICAgIEhvdyB0byBmb3JtYXQgYW5kIHByaW50IGluIFRleGluZm8gbW9kZS4KLSogQ29tcGlsZS1Db21tYW5kOjogICAgICAgICAgICAgSG93IHRvIHByaW50IHVzaW5nIEVtYWNzJ3MgY29tcGlsZSBjb21tYW5kLgotKiBSZXF1aXJlbWVudHMgU3VtbWFyeTo6ICAgICAgICBAVGVYe30gZm9ybWF0dGluZyByZXF1aXJlbWVudHMgc3VtbWFyeS4KLSogUHJlcGFyaW5nIGZvciBUZVg6OiAgICAgICAgICAgV2hhdCB5b3UgbmVlZCB0byBkbyB0byB1c2UgQFRlWHt9LgotKiBPdmVyZnVsbCBoYm94ZXM6OiAgICAgICAgICAgICBXaGF0IGFyZSBhbmQgd2hhdCB0byBkbyB3aXRoIG92ZXJmdWxsIGhib3hlcy4KLSogc21hbGxib29rOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHByaW50IHNtYWxsIGZvcm1hdCBib29rcyBhbmQgbWFudWFscy4KLSogQTQgUGFwZXI6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyLgotKiBDcm9wbWFya3MgYW5kIE1hZ25pZmljYXRpb246OiAgSG93IHRvIHByaW50IG1hcmtzIHRvIGluZGljYXRlIHRoZSBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHBhZ2VzIGFuZCBob3cgdG8gcHJpbnQgc2NhbGVkIHVwIG91dHB1dC4KLQotQ3JlYXRpbmcgYW4gSW5mbyBGaWxlCi0KLSogbWFrZWluZm8gYWR2YW50YWdlczo6ICAgICAgICAgQGNvZGV7bWFrZWluZm99IHByb3ZpZGVzIGJldHRlciBlcnJvciBjaGVja2luZy4KLSogSW52b2tpbmcgbWFrZWluZm86OiAgICAgICAgICAgSG93IHRvIHJ1biBAY29kZXttYWtlaW5mb30gZnJvbSBhIHNoZWxsLgotKiBtYWtlaW5mbyBvcHRpb25zOjogICAgICAgICAgICBTcGVjaWZ5IGZpbGwtY29sdW1uIGFuZCBvdGhlciBvcHRpb25zLgotKiBQb2ludGVyIFZhbGlkYXRpb246OiAgICAgICAgICBIb3cgdG8gY2hlY2sgdGhhdCBwb2ludGVycyBwb2ludCBzb21ld2hlcmUuCi0qIG1ha2VpbmZvIGluIEVtYWNzOjogICAgICAgICAgIEhvdyB0byBydW4gQGNvZGV7bWFrZWluZm99IGZyb20gRW1hY3MuCi0qIHRleGluZm8tZm9ybWF0IGNvbW1hbmRzOjogICAgIFR3byBJbmZvIGZvcm1hdHRpbmcgY29tbWFuZHMgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEVtYWNzIExpc3AgYXJlIGFuIGFsdGVybmF0aXZlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEBjb2Rle21ha2VpbmZvfS4KLSogQmF0Y2ggRm9ybWF0dGluZzo6ICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBmb3IgSW5mbyBpbiBFbWFjcyBCYXRjaCBtb2RlLgotKiBUYWcgYW5kIFNwbGl0IEZpbGVzOjogICAgICAgICBIb3cgdGFnZ2VkIGFuZCBzcGxpdCBmaWxlcyBoZWxwIEluZm8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcnVuIGJldHRlci4KLQotSW5zdGFsbGluZyBhbiBJbmZvIEZpbGUKLQotKiBEaXJlY3RvcnkgZmlsZTo6ICAgICAgICAgICAgICBUaGUgdG9wIGxldmVsIG1lbnUgZm9yIGFsbCBJbmZvIGZpbGVzLgotKiBOZXcgSW5mbyBGaWxlOjogICAgICAgICAgICAgICBMaXN0aW5nIGEgbmV3IGluZm8gZmlsZS4KLSogT3RoZXIgSW5mbyBEaXJlY3Rvcmllczo6ICAgICAgSG93IHRvIHNwZWNpZnkgSW5mbyBmaWxlcyB0aGF0IGFyZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGVkIGluIG90aGVyIGRpcmVjdG9yaWVzLgotCi1TYW1wbGUgUGVybWlzc2lvbnMKLQotKiBJbnNlcnRpbmcgUGVybWlzc2lvbnM6OiAgICAgICBIb3cgdG8gcHV0IHBlcm1pc3Npb25zIGluIHlvdXIgZG9jdW1lbnQuCi0qIGlmaW5mbyBQZXJtaXNzaW9uczo6ICAgICAgICAgIFNhbXBsZSBAc2FtcHtpZmluZm99IGNvcHlpbmcgcGVybWlzc2lvbnMuCi0qIFRpdGxlcGFnZSBQZXJtaXNzaW9uczo6ICAgICAgIFNhbXBsZSBUaXRsZXBhZ2UgY29weWluZyBwZXJtaXNzaW9ucy4KLQotSW5jbHVkZSBGaWxlcwotCi0qIFVzaW5nIEluY2x1ZGUgRmlsZXM6OiAgICAgICAgIEhvdyB0byB1c2UgdGhlIEBjb2Rle0BAaW5jbHVkZX0gY29tbWFuZC4KLSogdGV4aW5mby1tdWx0aXBsZS1maWxlcy11cGRhdGU6OiAgSG93IHRvIGNyZWF0ZSBhbmQgdXBkYXRlIG5vZGVzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVzIHdoZW4gdXNpbmcgaW5jbHVkZWQgZmlsZXMuCi0qIEluY2x1ZGUgRmlsZSBSZXF1aXJlbWVudHM6OiAgIFdoYXQgQGNvZGV7dGV4aW5mby1tdWx0aXBsZS1maWxlcy11cGRhdGV9IGV4cGVjdHMuCi0qIFNhbXBsZSBJbmNsdWRlIEZpbGU6OiAgICAgICAgIEEgc2FtcGxlIG91dGVyIGZpbGUgd2l0aCBpbmNsdWRlZCBmaWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiBpdDsgYW5kIGEgc2FtcGxlIGluY2x1ZGVkIGZpbGUuCi0qIEluY2x1ZGUgRmlsZXMgRXZvbHV0aW9uOjogICAgIEhvdyB1c2Ugb2YgdGhlIEBjb2Rle0BAaW5jbHVkZX0gY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBjaGFuZ2VkIG92ZXIgdGltZS4KLQotUGFnZSBIZWFkaW5ncwotCi0qIEhlYWRpbmdzIEludHJvZHVjZWQ6OiAgICAgICAgIENvbnZlbnRpb25zIGZvciB1c2luZyBwYWdlIGhlYWRpbmdzLgotKiBIZWFkaW5nIEZvcm1hdDo6ICAgICAgICAgICAgICBTdGFuZGFyZCBwYWdlIGhlYWRpbmcgZm9ybWF0cy4KLSogSGVhZGluZyBDaG9pY2U6OiAgICAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgcGFnZSBoZWFkaW5nLgotKiBDdXN0b20gSGVhZGluZ3M6OiAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIHlvdXIgb3duIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KLQotRm9ybWF0dGluZyBNaXN0YWtlcwotCi0qIG1ha2VpbmZvIHByZWZlcnJlZDo6ICAgICAgICAgIEBjb2Rle21ha2VpbmZvfSBmaW5kcyBlcnJvcnMuCi0qIERlYnVnZ2luZyB3aXRoIEluZm86OiAgICAgICAgIEhvdyB0byBjYXRjaCBlcnJvcnMgd2l0aCBJbmZvIGZvcm1hdHRpbmcuCi0qIERlYnVnZ2luZyB3aXRoIFRlWDo6ICAgICAgICAgIEhvdyB0byBjYXRjaCBlcnJvcnMgd2l0aCBAVGVYe30gZm9ybWF0dGluZy4KLSogVXNpbmcgdGV4aW5mby1zaG93LXN0cnVjdHVyZTo6ICBIb3cgdG8gdXNlIEBjb2Rle3RleGluZm8tc2hvdy1zdHJ1Y3R1cmV9LgotKiBVc2luZyBvY2N1cjo6ICAgICAgICAgICAgICAgICBIb3cgdG8gbGlzdCBhbGwgbGluZXMgY29udGFpbmluZyBhIHBhdHRlcm4uCi0qIFJ1bm5pbmcgSW5mby1WYWxpZGF0ZTo6ICAgICAgIEhvdyB0byBmaW5kIGJhZGx5IHJlZmVyZW5jZWQgbm9kZXMuCi0KLUZpbmRpbmcgQmFkbHkgUmVmZXJlbmNlZCBOb2RlcwotCi0qIFVzaW5nIEluZm8tdmFsaWRhdGU6OiAgICAgICAgIEhvdyB0byBydW4gQGNvZGV7SW5mby12YWxpZGF0ZX0uCi0qIFVuc3BsaXQ6OiAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBjcmVhdGUgYW4gdW5zcGxpdCBmaWxlLgotKiBUYWdpZnlpbmc6OiAgICAgICAgICAgICAgICAgICBIb3cgdG8gdGFnaWZ5IGEgZmlsZS4KLSogU3BsaXR0aW5nOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHNwbGl0IGEgZmlsZSBtYW51YWxseS4KLQotU2Vjb25kIEVkaXRpb24gRmVhdHVyZXMKLQotKiBOZXcgVGV4aW5mbyBNb2RlIENvbW1hbmRzOjogICBUaGUgdXBkYXRpbmcgY29tbWFuZHMgYXJlIGVzcGVjaWFsbHkgdXNlZnVsLgotKiBOZXcgQ29tbWFuZHM6OiAgICAgICAgICAgICAgICBNYW55IG5ld2x5IGRlc2NyaWJlZCBAQC1jb21tYW5kcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDb3B5aW5nLCBPdmVydmlldywgVG9wLCBUb3AKLUBjb21tZW50ICBub2RlLW5hbWUsIG5leHQsIHByZXZpb3VzLCAgdXAKLUB1bm51bWJlcmVkIFRleGluZm8gQ29weWluZyBDb25kaXRpb25zCi1AY2luZGV4IENvcHlpbmcgY29uZGl0aW9ucwotQGNpbmRleCBDb25kaXRpb25zIGZvciBjb3B5aW5nIFRleGluZm8KLQotVGhlIHByb2dyYW1zIGN1cnJlbnRseSBiZWluZyBkaXN0cmlidXRlZCB0aGF0IHJlbGF0ZSB0byBUZXhpbmZvIGluY2x1ZGUKLXBvcnRpb25zIG9mIEdOVSBFbWFjcywgcGx1cyBvdGhlciBzZXBhcmF0ZSBwcm9ncmFtcyAoaW5jbHVkaW5nCi1AY29kZXttYWtlaW5mb30sIEBjb2Rle2luZm99LCBAY29kZXt0ZXhpbmRleH0sIGFuZCBAZmlsZXt0ZXhpbmZvLnRleH0pLgotVGhlc2UgcHJvZ3JhbXMgYXJlIEBkZm57ZnJlZX07IHRoaXMgbWVhbnMgdGhhdCBldmVyeW9uZSBpcyBmcmVlIHRvIHVzZQotdGhlbSBhbmQgZnJlZSB0byByZWRpc3RyaWJ1dGUgdGhlbSBvbiBhIGZyZWUgYmFzaXMuICBUaGUgVGV4aW5mby1yZWxhdGVkCi1wcm9ncmFtcyBhcmUgbm90IGluIHRoZSBwdWJsaWMgZG9tYWluOyB0aGV5IGFyZSBjb3B5cmlnaHRlZCBhbmQgdGhlcmUKLWFyZSByZXN0cmljdGlvbnMgb24gdGhlaXIgZGlzdHJpYnV0aW9uLCBidXQgdGhlc2UgcmVzdHJpY3Rpb25zIGFyZQotZGVzaWduZWQgdG8gcGVybWl0IGV2ZXJ5dGhpbmcgdGhhdCBhIGdvb2QgY29vcGVyYXRpbmcgY2l0aXplbiB3b3VsZCB3YW50Ci10byBkby4gIFdoYXQgaXMgbm90IGFsbG93ZWQgaXMgdG8gdHJ5IHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZnVydGhlcgotc2hhcmluZyBhbnkgdmVyc2lvbiBvZiB0aGVzZSBwcm9ncmFtcyB0aGF0IHRoZXkgbWlnaHQgZ2V0IGZyb20KLXlvdS5AcmVmaWxsCi0KLSAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCi1hd2F5IGNvcGllcyBvZiB0aGUgcHJvZ3JhbXMgdGhhdCByZWxhdGUgdG8gVGV4aW5mbywgdGhhdCB5b3UgcmVjZWl2ZQotc291cmNlIGNvZGUgb3IgZWxzZSBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZXNlCi1wcm9ncmFtcyBvciB1c2UgcGllY2VzIG9mIHRoZW0gaW4gbmV3IGZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93Ci15b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy5AcmVmaWxsCi0KLSAgVG8gbWFrZSBzdXJlIHRoYXQgZXZlcnlvbmUgaGFzIHN1Y2ggcmlnaHRzLCB3ZSBoYXZlIHRvIGZvcmJpZCB5b3UgdG8KLWRlcHJpdmUgYW55b25lIGVsc2Ugb2YgdGhlc2UgcmlnaHRzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhlIFRleGluZm8gcmVsYXRlZCBwcm9ncmFtcywgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwKLXRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvcgotY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy5AcmVmaWxsCi0KLSAgQWxzbywgZm9yIG91ciBvd24gcHJvdGVjdGlvbiwgd2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZSBmaW5kcwotb3V0IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBwcm9ncmFtcyB0aGF0IHJlbGF0ZSB0byBUZXhpbmZvLgotSWYgdGhlc2UgcHJvZ3JhbXMgYXJlIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50Ci10aGVpciByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwKLXNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyCi1yZXB1dGF0aW9uLkByZWZpbGwKLQotICBUaGUgcHJlY2lzZSBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlcyBmb3IgdGhlIHByb2dyYW1zIGN1cnJlbnRseQotYmVpbmcgZGlzdHJpYnV0ZWQgdGhhdCByZWxhdGUgdG8gVGV4aW5mbyBhcmUgZm91bmQgaW4gdGhlIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyB0aGF0IGFjY29tcGFueSB0aGVtLkByZWZpbGwKLQotQG5vZGUgT3ZlcnZpZXcsIFRleGluZm8gTW9kZSwgQ29weWluZywgVG9wCi1AY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKLUBjaGFwdGVyIE92ZXJ2aWV3IG9mIFRleGluZm8KLUBjaW5kZXggT3ZlcnZpZXcgb2YgVGV4aW5mbwotQGNpbmRleCBUZXhpbmZvIG92ZXJ2aWV3Ci0KLUBkZm57VGV4aW5mb31AZm9vdG5vdGV7Tm90ZSB0aGF0IHRoZSBmaXJzdCBzeWxsYWJsZSBvZiBgYFRleGluZm8nJyBpcwotcHJvbm91bmNlZCBsaWtlIGBgc3BlY2snJywgbm90IGBgaGV4JycuICBUaGlzIG9kZCBwcm9udW5jaWF0aW9uIGlzCi1kZXJpdmVkIGZyb20sIGJ1dCBpcyBub3QgdGhlIHNhbWUgYXMsIHRoZSBwcm9udW5jaWF0aW9uIG9mIEBUZVh7fS4gIEluCi10aGUgd29yZCBAVGVYe30sIHRoZSBAc2FtcHtYfSBpcyBhY3R1YWxseSB0aGUgR3JlZWsgbGV0dGVyIGBgY2hpJycKLXJhdGhlciB0aGFuIHRoZSBFbmdsaXNoIGxldHRlciBgYGV4JycuICBQcm9ub3VuY2UgQFRlWHt9IGFzIGlmIHRoZQotQHNhbXB7WH0gd2VyZSB0aGUgbGFzdCBzb3VuZCBpbiB0aGUgbmFtZSBgQmFjaCc7IGJ1dCBwcm9ub3VuY2UgVGV4aW5mbwotYXMgaWYgdGhlIEBzYW1we3h9IHdlcmUgYSBgaycuICBTcGVsbCBgYFRleGluZm8nJyB3aXRoIGEgY2FwaXRhbCBgYFQnJwotYW5kIHdyaXRlIHRoZSBvdGhlciBsZXR0ZXJzIGluIGxvd2VyIGNhc2UufSAKLWlzIGEgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdCB1c2VzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHByb2R1Y2UgYm90aAotb24tbGluZSBpbmZvcm1hdGlvbiBhbmQgcHJpbnRlZCBvdXRwdXQuICBUaGlzIG1lYW5zIHRoYXQgaW5zdGVhZCBvZgotd3JpdGluZyB0d28gZGlmZmVyZW50IGRvY3VtZW50cywgb25lIGZvciB0aGUgb24tbGluZSBoZWxwIG9yIG90aGVyIG9uLWxpbmUKLWluZm9ybWF0aW9uIGFuZCB0aGUgb3RoZXIgZm9yIGEgdHlwZXNldCBtYW51YWwgb3Igb3RoZXIgcHJpbnRlZCB3b3JrLCB5b3UKLW5lZWQgd3JpdGUgb25seSBvbmUgZG9jdW1lbnQuICBXaGVuIHRoZSB3b3JrIGlzIHJldmlzZWQsIHlvdSBuZWVkIHJldmlzZQotb25seSBvbmUgZG9jdW1lbnQuICAoWW91IGNhbiByZWFkIHRoZSBvbi1saW5lIGluZm9ybWF0aW9uLCBrbm93biBhcyBhbgotQGRmbntJbmZvIGZpbGV9LCB3aXRoIGFuIEluZm8gZG9jdW1lbnRhdGlvbi1yZWFkaW5nIHByb2dyYW0uKUByZWZpbGwKLQotQG1lbnUKLSogVXNpbmcgVGV4aW5mbzo6ICAgICAgICAgICAgICAgQ3JlYXRlIGEgY29udmVudGlvbmFsIHByaW50ZWQgYm9vayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBJbmZvIGZpbGUuCi0qIEluZm8gRmlsZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgaXMgYW4gSW5mbyBmaWxlPwotKiBQcmludGVkIEJvb2tzOjogICAgICAgICAgICAgICBDaGFyYWN0ZXJpc3RpY3Mgb2YgYSBwcmludGVkIGJvb2sgb3IgbWFudWFsLgotKiBGb3JtYXR0aW5nIENvbW1hbmRzOjogICAgICAgICBAQC1jb21tYW5kcyBhcmUgdXNlZCBmb3IgZm9ybWF0dGluZy4KLSogQ29udmVudGlvbnM6OiAgICAgICAgICAgICAgICAgR2VuZXJhbCBydWxlcyBmb3Igd3JpdGluZyBhIFRleGluZm8gZmlsZS4KLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNvbW1lbnRzIGFuZCBtYXJrIHJlZ2lvbnMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXR0aW5nIGNvbW1hbmRzIHdpbGwgaWdub3JlLgotKiBNaW5pbXVtOjogICAgICAgICAgICAgICAgICAgICBXaGF0IGEgVGV4aW5mbyBmaWxlIG11c3QgaGF2ZS4KLSogU2l4IFBhcnRzOjogICAgICAgICAgICAgICAgICAgVXN1YWxseSwgYSBUZXhpbmZvIGZpbGUgaGFzIHNpeCBwYXJ0cy4KLSogU2hvcnQgU2FtcGxlOjogICAgICAgICAgICAgICAgQSBzaG9ydCBzYW1wbGUgVGV4aW5mbyBmaWxlLgotKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICAKLUBlbmQgbWVudQotCi1AYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0KLVxpbnB1dCB0ZXhpbmZvICBAYyAtKi10ZXhpbmZvLSotCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBwc2ltLmluZm8KLUBzZXR0aXRsZSBQU0lNCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLQotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBwcm9ncmFtIFBTSU0uCi0KLUNvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5LgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBQU0lNCi1Ac3VidGl0bGUgTW9kZWwgb2YgdGhlIFBvd2VyUEMgRW52aXJvbm1lbnRzCi1AYXV0aG9yIEFuZHJldyBDYWduZXkKLQotQHBhZ2UKLUB2c2tpcCBPcHQgcGx1cyBpZmlsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkKLQotVGhpcyBpcyB0aGUgZmlyc3QgZWRpdGlvbiBvZiB0aGUgUFNJTSBtYW51YWwgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQU0lNCi12ZXJzaW9uIDEuMC4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotCi0KLQotQG1lbnUKLQotKiBDb3B5aW5nOjogICAgICAgICAgICAgWW91ciByaWdodHMgYW5kIGZyZWVkb21zLgotKiBGaXJzdCBDaGFwcGV0ZXI6OiAgICAgR2V0dGluZyBzdGFydGVkIC4uLi4KLSogU2Vjb25kIENoYXB0ZXI6OiAgICAgIEdldHRpbmcgZmluaXNoZWQgLi4uLgotCi0KLUBlbmQgbWVudQotCi0KLVBTSU0gaXMgYSBwcm9ncmFtIHdyaXR0ZW4gaW4gZXh0ZW5kZWQgQU5TSS1DIHRoYXQgaW1wbGVtZW50cyBhbgotaW5zdHJ1Y3Rpb24gbGV2ZWwgc2ltdWxhdGlvbiBvZiB0aGUgUG93ZXJQQyBlbnZpcm9ubWVudC4gIEl0IGlzIGZyZWVseQotYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgKHZlcnNpb24gMiBvciBsYXRlcikuCi0KLVRoZSBQb3dlclBDIEFyY2hpdGVjdHVyZSBpcyBkZXNjcmliZWQgYXMgaGF2aW5nIHRocmVlIGxldmVscyBvZgotY29tcGxpYW5jZToKLQotCVVFQSAtIFVzZXIgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCi0JVkVBIC0gVmlydHVhbCBFbnZpcm9ubWVudCBBcmNoaXRlY3R1cmUKLQlPRUEgLSBPcGVyYXRpbmcgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCi0KLVBTSU0gYm90aCBpbXBsZW1lbnRzIGFsbCB0aHJlZSBsZXZlbHMgb2YgdGhlIFBvd2VyUEMgYW5kIGluY2x1ZGVzIChmb3IKLWVhY2ggbGV2ZWwpIGEgY29ycmVzcG9uZGluZyBzaW11bGF0ZWQgcnVuLXRpbWUgZW52aXJvbm1lbnQuCi0KLUluIGFkZGl0aW9uLCBQU0lNLCB0byB0aGUgZXhlY3V0aW9uIHVuaXQgbGV2ZWwsIG1vZGVscyB0aGUgcGVyZm9ybWFuY2UKLW9mIG1vc3Qgb2YgdGhlIGN1cnJlbnQgUG93ZXJQQyBpbXBsZW1lbnRhdGlvbnMgKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwKLU1laXNzbmVyKS4gIFRoaXMgZGV0YWlsZWQgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAodW5saWtlIG1hbnkgb3RoZXIKLXNpbXVsYXRvcnMpIHJlc3VsdGluZyBpbiBvbmx5IGEgcmVsYXRpdmVseSBtYXJnaW5hbCByZWR1Y3Rpb24gaW4gdGhlCi1zaW11bGF0b3JzIHBlcmZvcm1hbmNlLgotCi0KLUEgZGVzY3JpcHRpb24gb2YgaG93IHRvIGJ1aWxkIFBTSU0gaXMgY29udGFpbmVkIGluIHRoZSBmaWxlOgotCi0JCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vSU5TVEFMTAotCW9yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL0lOU1RBTEwKLQotd2hpbGUgYW4gb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSBQU0lNIGlzIGluOgotCi0JZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9SVU4KLW9yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL1JVTgotCi1UaGlzIGZpbGUgaXMgZm91bmQgaW46Ci0KLQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL1JFQURNRQotb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vUkVBRE1FCi0KLQotVGhhbmtzIGdvZXMgZmlyc3RseSB0bzoKLQotCUNvcmludGhpYW4gRW5naW5lZXJpbmcgUHR5IEx0ZAotCUN5Z251cyBTdXBwb3J0Ci0JSGlnaGxhbmQgTG9naWMgUHR5IEx0ZAotCi13aG8gcHJvdmlkZWQgdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIG1ha2luZyB0aGlzIHNvZnR3YXJlIGF2YWlsYWJsZQotb24gdGhlIEludGVybmV0LgotCi1Nb3JlIGltcG9ydGFudGx5IEknZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgd2hvIGVhY2gKLWNvbnRyaWJ1dGVkIGluIHRoZWlyIG93biB1bmlxdWUgd2F5OgotCi0JQWxsZW4gQnJpZ2dzLCBCZXR0IEtvY2gsIERhdmlkIEVkZWxzb2huLCBHb3Jkb24gSXJsYW0sCi0JTWljaGFlbCBNZWlzc25lciwgQm9iIE1lcmNpZXIsIFJpY2hhcmQgUGVyaW5pLCBEYWxlIFJhaG4sCi0JUmljaGFyZCBTdGFsbG1hbiwgTWl0Y2hlbGUgV2Fsa2VyCi0KLQotCQkJCUFuZHJldyBDYWduZXkKLQkJCQlGZWIsIDE5OTUKLQotCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBXaGF0IGZlYXR1cmVzIGRvZXMgUFNJTSBpbmNsdWRlPwotCi0JTW9uaXRvcmluZyBhbmQgbW9kZWxpbmcKLQotCQlQU0lNIGluY2x1ZGVzICh0aGFua3MgdG8gTWljaGFlbCBNZWlzc25lcikKLQkJYSBkZXRhaWxlZCBtb2RlbCBvZiBtb3N0IG9mIHRoZSBQb3dlclBDCi0JCWltcGxlbWVudGF0aW9ucyB0byB0aGUgZnVuY3Rpb25hbCB1bml0IGxldmVsLgotCi0KLQlTTVAKLQkJCi0JCVRoZSBQb3dlclBDIElTQSBkZWZpbmVzIFNNUCBzeW5jaHJvbml6aW5nIGluc3RydWN0aW9ucy4KLQkJVGhpcyBzaW11bGF0b3IgaW1wbGVtZW50cyBhIGxpbWl0ZWQsIGJ1dCBmdW5jdGlvbmFsLAotCQlzdWJzZXQgb2YgdGhlIFBvd2VyUEMgc3luY2hyb25pemF0aW9uIGluc3RydWN0aW9ucwotCQliZWhhdmlvdXIuICBQcm9ncmFtcyB0aGF0IHJlc3RyaWN0IHRoZWlyIHN5bmNocm9uaXphdGlvbgotCQlwcmltaXRpdmVzIHRvIHRob3NlIHRoYXQgd29yayB3aXRoIHRoaXMgZnVuY3Rpb25hbAotCQlzdWItc2V0IChlZyBQKCkgYW5kIFYoKSkgYXJlIGFibGUgdG8gcnVuIG9uIHRoZSBTTVAKLQkJdmVyc2lvbiBvZiBQU0lNLgotCi0JCVBlb3BsZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc3lzdGVtIHNob3VsZCBzdHVkeQotCQl0aGUgY29kZSBpbXBsZW1lbnRpbmcgdGhlIGx3YXJ4IGluc3RydWN0aW9uLgotCQkKLQlFTkRJQU4gU1VQUE9SVAotCi0JCVBTSU0gaW1wbGVtZW50cyB0aGUgUG93ZXJQQydzIGJpZyBhbmQgbGl0dGxlICh4b3IKLQkJZW5kaWFuKSBtb2RlcyBhbmQgY29ycmVjdGx5IHNpbXVsYXRlcyBjb2RlIHRoYXQKLQkJc3dpdGNoZXMgYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuCi0KLQkJSW4gYWRkaXRpb24sIHBzaW0gY2FuIG1vZGVsIGEgdHJ1ZSBsaXR0bGUtZW5kaWFuCi0JCW1hY2hpbmUuCi0KLQlJU0EgKEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUpIG1vZGVscwotCi0JCVBTSU0gaW5jbHVkZXMgYSBtb2RlbCBvZiB0aGUgVUVBLCBWRUEgYW5kIE9FQS4gIFRoaXMKLQkJaW5jbHVkZXMgdGhlIHRpbWUgYmFzZSByZWdpc3RlcnMgKFZFQSkgYW5kIEhUQUIKLQkJYW5kIEJBVFMgKE9FQSkuCi0KLQkJSW4gYWRkaXRpb24sIGEgcHJlbGltaW5hcnkgbW9kZWwgb2YgdGhlIDY0IGJpdAotCQlQb3dlclBDIGFyY2hpdGVjdHVyZSBpcyBpbXBsZW1lbnRlZC4KLQotCUlPIEhhcmR3YXJlCi0KLQkJUFNJTSdzIGludGVybmFscyBhcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0Ci0JCW9mIGEgRGV2aWNlIFRyZWUuICBUaGlzIHRyZWUgaW50ZW50aW9uYWxseQotCQlyZXNlbWJsZXMgdGhhdCBvZiB0aGUgRGV2aWNlIFRyZWUgZm91bmQgaW4KLQkJT3BlbkJvb3QgZmlybXdhcmUuICBQU0lNIGlzIGZsZXhpYmxlIGVub3VnaAotCQl0byBhbGxvdyB0aGUgdXNlciB0byBmdWxseSBjb25maWd1cmUgdGhpcyBkZXZpY2UKLQkJdHJlZSAoYW5kIGNvbnNlcXVlbnRseSB0aGUgaGFyZHdhcmUgbW9kZWwpIGF0Ci0JCXJ1biB0aW1lLgotCi0JUnVuLXRpbWUgZW52aXJvbm1lbnRzOgotCi0JCVBTSU0ncyBVRUEgbW9kZWwgaW5jbHVkZXMgZW11bGF0aW9uIGZvciBCU0QKLQkJYmFzZWQgVU5JWCBzeXN0ZW0gY2FsbHMuCi0KLQkJUFNJTSdzIE9FQSBtb2RlbCBpbmNsdWRlcyBlbXVsYXRpb24gb2YgZWl0aGVyOgotCi0JCQlvCU9wZW5Cb290IGNsaWVudCBpbnRlcmZhY2UKLQotCQkJbwlNT1RPJ3MgQlVHIGludGVyZmFjZS4KLQotCi0JRmxvYXRpbmcgcG9pbnQKLQotCQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBmbG9hdGluZyBwb2ludCBpcyBpbmNsdWRlZC4KLQotCi0gICAgV2hvIHdvdWxkIGJlIGludGVyZXN0ZWQgaW4gUFNJTT8KLQotCW8JdGhlIGN1cmlvdXMKLQotCQlVc2luZyBwc2ltLCBnZGIsIGdjYyBhbmQgYmludXRpbHMgdGhlIGN1cmlvdXMKLQkJdXNlciBjYW4gY29uc3RydWN0IGFuIGVudmlyb25tZW50IHRoYXQgYWxsb3dzCi0JCXRoZW0gdG8gcGxheSB3aXRoIFBvd2VyUEMgRW52aXJvbm1lbnQgd2l0aG91dAotCQl0aGUgbmVlZCBmb3IgcmVhbCBoYXJkd2FyZS4KLQotCi0Jbwl0aGUgYW5hbHlzdAotCi0JCVBTSU0gaW5jbHVkZXMgbWFueSAoY29udHJpYnV0ZWQpIG1vbml0b3JpbmcKLQkJZmVhdHVyZXMgd2hpY2ggKHVubGlrZSBtYW55IG90aGVyIHNpbXVsYXRvcnMpCi0JCWRvIG5vdCBjb21lIHdpdGggYSBncmVhdCBwZW5hbHR5IGluIHBlcmZvcm1hbmNlLgotCi0JCVRodXMgdGhlIHBlcmZvcm1hbmNlIGFuYWx5c3QgaXMgYWJsZSB0byB1c2UKLQkJdGhpcyBzaW11bGF0b3IgdG8gYW5hbHlzZSB0aGUgcGVyZm9ybWFuY2Ugb2YKLQkJdGhlIHN5c3RlbSB1bmRlciB0ZXN0LgotCi0JCUlmIFBTSU0gZG9lc24ndCBtb25pdG9yIGEgY29tcG9uZW50cyBvZiBpbnRlcmVzdCwKLQkJdGhlIHNvdXJjZSBjb2RlIGlzIGZyZWVseSBhdmFpbGFibGUsIGFuZCBoZW5jZQotCQl0aGVyZSBpcyBubyBoaW5kZXJhbmNlIHRvIGNoYW5naW5nIHRoaW5ncwotCQl0byBtZWV0IGEgc3BlY2lmaWMgYW5hbHlzdHMgbmVlZHMuCi0KLQotCW8JdGhlIHNlcmlvdXMgU1cgZGV2ZWxvcGVyCi0KLQkJUFNJTSBtb2RlbHMgYWxsIHRocmVlIGxldmVscyBvZiB0aGUgUG93ZXJQQwotCQlBcmNoaXRlY3R1cmU6IFVFQSwgVkVBIGFuZCBPRUEuICBGdXJ0aGVyLAotCQl0aGUgaW50ZXJuYWwgZGVzaWduIGlzIHN1Y2ggdGhhdCBQU0lNIGNhbgotCQliZSBleHRlbmRlZCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgotCi0KLSAgICBXaGF0IHBlcmZvcm1hbmNlIGFuYWx5c2lzIG1lYXN1cmVtZW50cyBjYW4gUFNJTSBwZXJmb3JtPwotCi0JQmVsb3cgaXMgdGhlIG91dHB1dCBmcm9tIGEgcmVjZW50IGFuYWx5c2lzIHJ1bgotCShjb250cmlidXRlZCBieSBNaWNoYWVsIE1laXNzbmVyKToKLQotCUZvciB0aGUgZm9sbG93aW5nIHByb2dyYW06Ci0KLQlsb25nCi0Jc2ltcGxlX3JhbmQgKCkKLQl7Ci0JICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWVkID0gNDcxMTQ3MTE7Ci0JICB1bnNpZ25lZCBsb25nIHRoaXMgPSBzZWVkICogMTEwMzUxNTI0NSArIDEyMzQ1OwotCSAgc2VlZCA9IHRoaXM7Ci0JLyogY3V0LWN1dC1jdXQgLSBzZWUgdGhlIGZpbGUgUlVOLnBzaW0gKi8KLQl9Ci0KLQlIZXJlIGlzIHRoZSBjdXJyZW50IG91dHB1dCBnZW5lcmF0ZWQgd2l0aCB0aGUgLUkgc3dpdGNoIG9uIGEgUDkwCi0JKHRoZSBjb21waWxlciB1c2VkIGlzIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIEdDQyB3aXRoIGEgbmV3Ci0Jc2NoZWR1bGVyIHJlcGxhY2luZyB0aGUgb2xkIG9uZSk6Ci0JCi0JQ1BVICMxIGV4ZWN1dGVkICAgICA0MSw5OTQgQU5EIGluc3RydWN0aW9ucy4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgNTE5LDc4NSBBTkQgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KLQkuCi0JLgotCS4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBTeXN0ZW0gQ2FsbCBpbnN0cnVjdGlvbi4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgMjA3LDc0NiBYT1IgaW5zdHJ1Y3Rpb25zLgotCQotCUNQVSAjMSBleGVjdXRlZCAyMyw3NDAsODU2IGN5Y2xlcy4KLQlDUFUgIzEgZXhlY3V0ZWQgMTAsMjQyLDc4MCBzdGFsbHMgd2FpdGluZyBmb3IgZGF0YS4KLQlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBzdGFsbCB3YWl0aW5nIGZvciBhIGZ1bmN0aW9uIHVuaXQuCi0JLgotCS4KLQkuCi0JQ1BVICMxIGV4ZWN1dGVkICAzLDEzNiwyMjkgYnJhbmNoIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbnMuCi0JQ1BVICMxIGV4ZWN1dGVkIDE2LDk0OSwzOTYgaW5zdHJ1Y3Rpb25zIHRoYXQgd2VyZSBhY2NvdW50ZWQgZm9yIGluIHRpbWluZyBpbmZvLgotCUNQVSAjMSBleGVjdXRlZCAgICA4NzEsOTIwIGRhdGEgcmVhZHMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgIDk3MSw5MjYgZGF0YSB3cml0ZXMuCi0JQ1BVICMxIGV4ZWN1dGVkICAgICAgICAyMjEgaWNhY2hlIG1pc3Nlcy4KLQlDUFUgIzEgZXhlY3V0ZWQgMTYsOTQ5LDM5NiBpbnN0cnVjdGlvbnMgaW4gdG90YWwuCi0JCi0JU2ltdWxhdG9yIHNwZWVkIHdhcyAyNTAsNzMxIGluc3RydWN0aW9ucy9zZWNvbmQKLQotCi0gICAgV2hhdCBtb3RpdmF0ZWQgUFNJTT8KLQotCUFzIGFuIGlkZWEsIHBzaW0gd2FzIGZpcnN0IGRpc2N1c3NlZCBzZXJpb3VzbHkgZHVyaW5nIG1pZAotCTE5OTQuICBBdCB0aGF0IHRpbWUgaXRzIG1haW4gb2JqZWN0aXZlcyB3ZXJlOgotCi0KLQkJbwlnb29kIHBlcmZvcm1hbmNlCi0KLQkJCU1hbnkgc2ltdWxhdG9ycyBsb29zZSBvdXQgYnkgb25seSBwcm92aWRpbmcKLQkJCWEgYmluYXJ5IGludGVyZmFjZSB0byB0aGUgaW50ZXJuYWxzLiAgVGhpcwotCQkJaW50ZXJmYWNlIGV2ZW50dWFsbHkgYmVjb21lcyBhIGJvdHRsZSBuZWNrCi0JCQlpbiB0aGUgc2ltdWxhdG9ycyBwZXJmb3JtYW5jZS4KLQotCQkJSXQgd2FzIGludGVuZGVkIHRoYXQgUFNJTSB3b3VsZCBhdm9pZCB0aGlzCi0JCQlwcm9ibGVtIGJ5IGdpdmluZyB0aGUgdXNlciBhY2Nlc3MgdG8gdGhlCi0JCQlmdWxsIHNvdXJjZSBjb2RlLgotCi0JCQlGdXJ0aGVyLCBieSBleHBsb2l0aW5nIHRoZSBwb3dlciBvZiBtb2Rlcm4KLQkJCWNvbXBpbGVycyBpdCB3YXMgaG9wZWQgdGhhdCBQU0lNIHdvdWxkIGFjaGlldmUKLQkJCWdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBvdXQgaGF2aW5nIHRvIGNvbXByb21pc2UKLQkJCWl0cyBpbnRlcm5hbCBkZXNpZ24uCi0KLQotCQlvCXByYWN0aWNhbCBwb3J0YWJpbGl0eQotCi0JCQlSYXRoZXIgdGhhbiB0cnkgdG8gYmUgcG9ydGFibGUgdG8gZXZlcnkKLQkJCUMgY29tcGlsZXIgb24gZXZlcnkgcGxhdGZvcm0sIGl0IHdhcyBkZWNpZGVkCi0JCQl0aGF0IFBTSU0gd291bGQgcmVzdHJpY3QgaXRzIHNlbGYgdG8gc3VwcG9ydGluZwotCQkJQU5TSSBjb21waWxlcnMgdGhhdCBpbmNsdWRlZCB0aGUgZXh0ZW5zaW9uCi0JCQlvZiBhIGxvbmcgbG9uZyB0eXBlLgotCi0JCQlHQ0MgaXMgb25lIHN1Y2ggY29tcGlsZXIsIGNvbnNlcXVlbnRseSBQU0lNCi0JCQlzaG91bGQgYmUgcG9ydGFibGUgdG8gYW55IG1hY2hpbmUgcnVubmluZyBHQ0MuCi0KLQotCQlvCWZsZXhpYmlsaXR5IGluIGl0cyBkZXNpZ24KLQotCQkJUFNJTSBzaG91bGQgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZQotCQkJZmVhdHVyZXMgcmVxdWlyZWQgYW5kIGN1c3RvbWlzZSB0aGUgYnVpbGQKLQkJCWFjY29yZGluZ2x5LiAgQnkgaGF2aW5nIHRoZSBzb3VyY2UgY29kZSwKLQkJCXRoZSBjb21waWxlciBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBhbnkgdW4KLQkJCXVzZWQgZmVhdHVyZXMgb2YgdGhlIHNpbXVsYXRvci4KLQotCQkJQWZ0ZXIgYWxsLCBsZXQgdGhlIGNvbXBpbGVyIGRvIHRoZSB3b3JrLgotCi0KLQkJbwlTTVAKLQotCQkJQSBtb2RlbCB0aGF0IGFsbG93ZWQgdGhlIHNpbXVsYXRpb24gb2YKLQkJCVNNUCBwbGF0Zm9ybXMgd2l0aCBvdXQgdGhlIGxhcmdlIG92ZXJoZWFkCi0JCQlvZnRlbiBlbmNvdW50ZXJlZCB3aXRoIHN1Y2ggbW9kZWxzLgotCi0KLQlQU0lNIGFjaGlldmVzIGVhY2ggb2YgdGhlc2Ugb2JqZWN0aXZlcy4KLQotCi0gICAgSXMgUFNJTSBQb3dlclBDIFBsYXRmb3JtIChQUENQKSAobmVlIENIUlApIENvbXBsaWFudD8KLQotCU5vLgotCi0JQW1vbmcgb3RoZXIgdGhpbmdzIGl0IGRvZXMgbm90IGhhdmUgYW4gQXBwbGUgUk9NIHNvY2tldC4KLQotCi0gICAgQ291bGQgUFNJTSBiZSBleHRlbmRlZCBzbyB0aGF0IGl0IG1vZGVscyBhIENIUlAgbWFjaGluZT8KLQotCVllcy4KLQotCVBTSU0gaGFzIGJlZW4gZGVzaWduZWQgd2l0aCB0aGUgQ0hSUCBzcGVjIGluIG1pbmQuIFRvIG1vZGVsCi0JYSBDSFJQIGRlc2t0b3AgdGhlIGZvbGxvd2luZyB3b3VsZCBuZWVkIHRvIGJlIGFkZGVkOgotCi0JCW8JQW4gYXBwbGUgUk9NIHNvY2tldCA6LSkKLQotCQlvCU1vZGVsIG9mIGVhY2ggb2YgdGhlIGRlc2t0b3AgSU8gZGV2aWNlcwotCi0JCW8JQW4gT3BlblBJQyBkZXZpY2UuCi0KLQkJbwlSVEFTIChSdW4gVGltZSBBYnN0cmFjdGlvbiBTZXJ2aWNlcykuCi0KLQkJbwlBIGZ1bGx5IHBvcHVsYXRlZCBkZXZpY2UgdHJlZS4KLQotCi0gICAgSXMgdGhlIHNvdXJjZSBjb2RlIGF2YWlsYWJsZT8KLQotCVllcy4KLQotCVRoZSBzb3VyY2UgY29kZSB0byBQU0lNIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLQl0aGUgR05VIFB1YmxpYyBMaWNlbmNlLiAgVGhpcyBhbGxvd3MgeW91IHRvIGRpc3RyaWJ1dGUKLQl0aGUgc291cmNlIGNvZGUgZm9yIGZyZWUgYnV0IHdpdGggY2VydGFpbiBjb25kaXRpb25zLgotCi0JU2VlIHRoZSBmaWxlOgotCi0JCWZ0cDovL2FyY2hpZS5hdS9nbnUvQ09QWUlORwotCi0JRm9yIGRldGFpbHMgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotCi0KLSAgICBXaGVyZSBkbyBJIHNlbmQgYnVncyBvciByZXBvcnQgcHJvYmxlbXM/Ci0KLQlUaGVyZSBpcyBhIG1haWxpbmcgbGlzdCAoc3Vic2NyaWJlIHRocm91Z2ggbWFqb3Jkb21vQGNpLmNvbS5hdSkgYXQ6Ci0KLQlwb3dlcnBjLXBzaW1AY2kuY29tLmF1Ci0KLQlJZiBJIGdldCB0aGUgZnRwIGFyY2hpdmUgdXBkYXRlZCBJIHBvc3QgYSBub3RlIHRvIHRoYXQgbWFpbGluZyBsaXN0LgotCUluIGFkZGl0aW9uIHlvdXIgd2VsY29tZSB0byBzZW5kIGJ1Z3Mgb3IgcHJvYmxlbXMgZWl0aGVyIHRvIG1lIG9yIHRvCi0JdGhhdCBlLW1haWwgbGlzdC4KLQotCVRoaXMgbGlzdCBjdXJyZW50bHkgYXZlcmFnZXMgemVybyBhcnRpY2xlcyBhIGRheS4KLQotCi0gICAgIERvZXMgUFNJTSBoYXZlIGFueSBsaW1pdGF0aW9ucyBvciBwcm9ibGVtcz8KLQotCVBTSU0gY2FuJ3QgcnVuIHJzNjAwMC9BSVggYmluYXJpZXMgLSBBdCBwcmVzZW50IFBTSU0gY2FuIG9ubHkKLQlzaW11bGF0ZSBzdGF0aWMgZXhlY3V0YWJsZXMuICBTaW5jZSBhbiBBSVggZXhlY3V0YWJsZSBpcwotCW5ldmVyIHN0YXRpYywgUFNJTSBpcyB1bmFibGUgdG8gc2ltdWxhdGUgaXRzIGV4ZWN1dGlvbi4KLQotCVBTSU0gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgLSBjb25zZXF1ZW50bHkgdGhlcmUgYXJlIGdvaW5nCi0JdG8gYmUgYnVncy4KLQotCVNlZSB0aGUgZmlsZSBCVUdTIChpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uKSBmb3IgYW55Ci0Jb3RoZXIgb3V0c3RhbmRpbmcgaXNzdWVzLgotCmRpZmYgLS1naXQgYS9zaW0vcHBjL3JlZ2lzdGVycy5jIGIvc2ltL3BwYy9yZWdpc3RlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MWNlZC4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3JlZ2lzdGVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1JFR0lTVEVSU19DXwotI2RlZmluZSBfUkVHSVNURVJTX0NfCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmFzaWNzLmgiCi0jaW5jbHVkZSAicmVnaXN0ZXJzLmgiCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0KLUlOTElORV9SRUdJU1RFUlNcCi0odm9pZCkKLXJlZ2lzdGVyc19kdW1wKHJlZ2lzdGVycyAqcmVnaXN0ZXJzKQotewotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICBwcmludGZfZmlsdGVyZWQoIkdQUiAlMmQ6IiwgaSo0KTsKLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICBwcmludGZfZmlsdGVyZWQoIiAweCUwOGx4IiwgKGxvbmcpcmVnaXN0ZXJzLT5ncHJbaSo0ICsgal0pOwotICAgIH0KLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLX0KLQotU1RBVElDX0lOTElORV9SRUdJU1RFUlNcCi0oc3BycykKLWZpbmRfc3ByKGNvbnN0IGNoYXIgbmFtZVtdKQotewotICBzcHJzIHNwcjsKLSAgZm9yIChzcHIgPSAwOyBzcHIgPCBucl9vZl9zcHJzOyBzcHIrKykKLSAgICBpZiAoc3ByX2lzX3ZhbGlkKHNwcikKLQkmJiAhc3RyY21wKG5hbWUsIHNwcl9uYW1lKHNwcikpCi0JJiYgc3ByX2luZGV4KHNwcikgPT0gc3ByKQotICAgICAgcmV0dXJuIHNwcjsKLSAgcmV0dXJuIG5yX29mX3NwcnM7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfUkVHSVNURVJTXAotKGludCkKLWFyZV9kaWdpdHMoY29uc3QgY2hhciAqZGlnaXRzKQotewotICB3aGlsZSAoaXNkaWdpdCgqZGlnaXRzKSkKLSAgICBkaWdpdHMrKzsKLSAgcmV0dXJuICpkaWdpdHMgPT0gJ1wwJzsKLX0KLQotCi1JTkxJTkVfUkVHSVNURVJTXAotKHJlZ2lzdGVyX2Rlc2NyaXB0aW9ucykKLXJlZ2lzdGVyX2Rlc2NyaXB0aW9uKGNvbnN0IGNoYXIgcmVnW10pCi17Ci0gIHJlZ2lzdGVyX2Rlc2NyaXB0aW9ucyBkZXNjcmlwdGlvbjsKLQotICAvKiB0cnkgZm9yIGEgZ2VuZXJhbC1wdXJwb3NlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KLSAgaWYgKHJlZ1swXSA9PSAncicgJiYgYXJlX2RpZ2l0cyhyZWcgKyAxKSkgewotICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfZ3ByOwotICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gYXRvaShyZWcrMSk7Ci0gICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihncHJlZyk7Ci0gIH0KLSAgZWxzZSBpZiAocmVnWzBdID09ICdmJyAmJiBhcmVfZGlnaXRzKHJlZyArIDEpKSB7Ci0gICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19mcHI7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSBhdG9pKHJlZysxKTsKLSAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKGZwcmVnKTsKLSAgfQotICBlbHNlIGlmICghc3RyY21wKHJlZywgInBjIikgfHwgIXN0cmNtcChyZWcsICJuaWEiKSkgewotICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfcGM7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSAwOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YodW5zaWduZWRfd29yZCk7Ci0gIH0KLSAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJzcCIpKSB7Ci0gICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19ncHI7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSAxOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YoZ3ByZWcpOwotICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAidG9jIikpIHsKLSAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2dwcjsKLSAgICBkZXNjcmlwdGlvbi5pbmRleCA9IDI7Ci0gICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihncHJlZyk7Ci0gIH0KLSAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJjciIpIHx8ICFzdHJjbXAocmVnLCAiY25kIikpIHsKLSAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2NyOwotICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gMDsKLSAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKGNyZWcpOyAvKiBGSVhNRSAqLwotICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAibXNyIikgfHwgIXN0cmNtcChyZWcsICJwcyIpKSB7Ci0gICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19tc3I7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSAwOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YobXNyZWcpOwotICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAiZnBzY3IiKSkgewotICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfZnBzY3I7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSAwOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YoZnBzY3JlZyk7Ci0gIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAocmVnLCAic3IiLCAyKSAmJiBhcmVfZGlnaXRzKHJlZyArIDIpKSB7Ci0gICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19zcjsKLSAgICBkZXNjcmlwdGlvbi5pbmRleCA9IGF0b2kocmVnKzIpOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2Yoc3JlZyk7Ci0gIH0KLSAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJjbnQiKSkgewotICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfc3ByOwotICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gc3ByX2N0cjsKLSAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKHNwcmVnKTsKLSAgfQotICBlbHNlIGlmICghc3RyY21wKHJlZywgImluc25zIikpIHsKLSAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2luc25zOwotICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gc3ByX2N0cjsKLSAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKHVuc2lnbmVkX3dvcmQpOwotICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAic3RhbGxzIikpIHsKLSAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX3N0YWxsczsKLSAgICBkZXNjcmlwdGlvbi5pbmRleCA9IHNwcl9jdHI7Ci0gICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZih1bnNpZ25lZF93b3JkKTsKLSAgfQotICBlbHNlIGlmICghc3RyY21wKHJlZywgImN5Y2xlcyIpKSB7Ci0gICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19jeWNsZXM7Ci0gICAgZGVzY3JpcHRpb24uaW5kZXggPSBzcHJfY3RyOwotICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YodW5zaWduZWRfd29yZCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3BycyBzcHIgPSBmaW5kX3NwcihyZWcpOwotICAgIGlmIChzcHIgIT0gbnJfb2Zfc3BycykgewotICAgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19zcHI7Ci0gICAgICBkZXNjcmlwdGlvbi5pbmRleCA9IHNwcjsKLSAgICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2Yoc3ByZWcpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfaW52YWxpZDsKLSAgICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gMDsKLSAgICAgIGRlc2NyaXB0aW9uLnNpemUgPSAwOwotICAgIH0KLSAgfQotICByZXR1cm4gZGVzY3JpcHRpb247Ci19Ci0KLSNlbmRpZiAvKiBfUkVHSVNURVJTX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3JlZ2lzdGVycy5oIGIvc2ltL3BwYy9yZWdpc3RlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhNmVhNC4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3JlZ2lzdGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1JFR0lTVEVSU19IXwotI2RlZmluZSBfUkVHSVNURVJTX0hfCi0KLQotLyoKLSAqIFRoZSBQb3dlclBDIHJlZ2lzdGVycwotICoKLSAqLwotCi0KLS8qKgotICoqIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMKLSAqKi8KLQotdHlwZWRlZiBzaWduZWRfd29yZCBncHJlZzsKLQotCi0KLS8qKgotICoqIEZsb2F0aW5nIFBvaW50IFJlZ2lzdGVycwotICoqLwotCi10eXBlZGVmIHVuc2lnbmVkNjQgZnByZWc7Ci0KLQotCi0vKioKLSAqKiBUaGUgY29uZGl0aW9uIHJlZ2lzdGVyCi0gKioKLSAqKi8KLQotdHlwZWRlZiB1bnNpZ25lZDMyIGNyZWc7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgc3ViIGJpdHMgYXJlIGRlZmluZWQgZm9yIHRoZSBjb25kaXRpb24gcmVnaXN0ZXIgKi8KLWVudW0gewotICBjcl9pX25lZ2F0aXZlID0gQklUNCgwKSwKLSAgY3JfaV9wb3NpdGl2ZSA9IEJJVDQoMSksCi0gIGNyX2lfemVybyA9IEJJVDQoMiksCi0gIGNyX2lfc3VtbWFyeV9vdmVyZmxvdyA9IEJJVDQoMyksCi0jaWYgMAotICAvKiBjcjAgLSBpbnRlZ2VyIHN0YXR1cyAqLwotICBjcjBfaV9zdW1tYXJ5X292ZXJmbG93X2JpdCA9IDMsCi0gIGNyMF9pX25lZ2F0aXZlID0gQklUMzIoMCksCi0gIGNyMF9pX3Bvc2l0aXZlID0gQklUMzIoMSksCi0gIGNyMF9pX3plcm8gPSBCSVQzMigyKSwKLSAgY3IwX2lfc3VtbWFyeV9vdmVyZmxvdyA9IEJJVDMyKDMpLAotICBjcjBfaV9tYXNrID0gTUFTSzMyKDAsMyksCi0jZW5kaWYKLSAgLyogY3IxIC0gZmxvYXRpbmctcG9pbnQgc3RhdHVzICovCi0gIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9zdW1tYXJ5X2JpdCA9IDQsCi0gIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2VuYWJsZWRfZXhjZXB0aW9uX3N1bW1hcnlfYml0ID0gNSwKLSAgY3IxX2lfZmxvYXRpbmdfcG9pbnRfaW52YWxpZF9vcGVyYXRpb25fZXhjZXB0aW9uX3N1bW1hcnlfYml0ID0gNiwKLSAgY3IxX2lfZmxvYXRpbmdfcG9pbnRfb3ZlcmZsb3dfZXhjZXB0aW9uX2JpdCA9IDcsCi0gIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9zdW1tYXJ5ID0gQklUMzIoNCksCi0gIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2VuYWJsZWRfZXhjZXB0aW9uX3N1bW1hcnkgPSBCSVQzMig1KSwKLSAgY3IxX2lfZmxvYXRpbmdfcG9pbnRfaW52YWxpZF9vcGVyYXRpb25fZXhjZXB0aW9uX3N1bW1hcnkgPSBCSVQzMig2KSwKLSAgY3IxX2lfZmxvYXRpbmdfcG9pbnRfb3ZlcmZsb3dfZXhjZXB0aW9uID0gQklUMzIoNyksCi0gIGNyMV9pX21hc2sgPSBNQVNLMzIoNCw3KSwKLX07Ci0KLQotLyogQ29uZGl0aW9uIHJlZ2lzdGVyIDEgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljICovCi1lbnVtIHsKLSAgY3JfZnBfZXhjZXB0aW9uID0gQklUNCgwKSwKLSAgY3JfZnBfZW5hYmxlZF9leGNlcHRpb24gPSBCSVQ0KDEpLAotICBjcl9mcF9pbnZhbGlkX2V4Y2VwdGlvbiA9IEJJVDQoMiksCi0gIGNyX2ZwX292ZXJmbG93X2V4Y2VwdGlvbiA9IEJJVDQoMyksCi19OwotCi0KLQotLyoqCi0gKiogRmxvYXRpbmctUG9pbnQgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyCi0gKiovCi0KLXR5cGVkZWYgdW5zaWduZWQzMiBmcHNjcmVnOwotZW51bSB7Ci0gIGZwc2NyX2Z4X2JpdCA9IDAsCi0gIGZwc2NyX2Z4ID0gQklUMzIoMCksCi0gIGZwc2NyX2ZleF9iaXQgPSAxLAotICBmcHNjcl9mZXggPSBCSVQzMigxKSwKLSAgZnBzY3JfdnhfYml0ID0gMiwKLSAgZnBzY3JfdnggPSBCSVQzMigyKSwKLSAgZnBzY3Jfb3hfYml0ID0gMywKLSAgZnBzY3Jfb3ggPSBCSVQzMigzKSwKLSAgZnBzY3JfdXggPSBCSVQzMig0KSwKLSAgZnBzY3JfenggPSBCSVQzMig1KSwKLSAgZnBzY3JfeHggPSBCSVQzMig2KSwKLSAgZnBzY3JfdnhzbmFuID0gQklUMzIoNyksIC8qIFNOQU4gKi8KLSAgZnBzY3Jfdnhpc2kgPSBCSVQzMig4KSwgLyogSU5GIC0gSU5GICovCi0gIGZwc2NyX3Z4aWRpID0gQklUMzIoOSksIC8qIElORiAvIElORiAqLwotICBmcHNjcl92eHpkeiA9IEJJVDMyKDEwKSwgLyogMCAvIDAgKi8KLSAgZnBzY3JfdnhpbXogPSBCSVQzMigxMSksIC8qIElORiAqIDAgKi8KLSAgZnBzY3Jfdnh2YyA9IEJJVDMyKDEyKSwKLSAgZnBzY3JfZnIgPSBCSVQzMigxMyksCi0gIGZwc2NyX2ZpID0gQklUMzIoMTQpLAotICBmcHNjcl9mcHJmID0gTUFTSzMyKDE1LCAxOSksCi0gIGZwc2NyX2MgPSBCSVQzMigxNSksCi0gIGZwc2NyX2ZwY2NfYml0ID0gMTYsIC8qIHdlbGwgc29ydCBvZiAqLwotICBmcHNjcl9mcGNjID0gTUFTSzMyKDE2LCAxOSksCi0gIGZwc2NyX2ZsID0gQklUMzIoMTYpLAotICBmcHNjcl9mZyA9IEJJVDMyKDE3KSwKLSAgZnBzY3JfZmUgPSBCSVQzMigxOCksCi0gIGZwc2NyX2Z1ID0gQklUMzIoMTkpLAotICBmcHNjcl9yZl9xdWlldF9uYW4gPSBmcHNjcl9jIHwgZnBzY3JfZnUsCi0gIGZwc2NyX3JmX25lZ19pbmZpbml0eSA9IGZwc2NyX2ZsIHwgZnBzY3JfZnUsCi0gIGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyID0gZnBzY3JfZmwsCi0gIGZwc2NyX3JmX25lZ19kZW5vcm1hbGl6ZWRfbnVtYmVyID0gZnBzY3JfYyB8IGZwc2NyX2ZsLAotICBmcHNjcl9yZl9uZWdfemVybyA9IGZwc2NyX2MgfCBmcHNjcl9mZSwKLSAgZnBzY3JfcmZfcG9zX3plcm8gPSBmcHNjcl9mZSwKLSAgZnBzY3JfcmZfcG9zX2Rlbm9ybWFsaXplZF9udW1iZXIgPSBmcHNjcl9jIHwgZnBzY3JfZmcsCi0gIGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyID0gZnBzY3JfZmcsCi0gIGZwc2NyX3JmX3Bvc19pbmZpbml0eSA9IGZwc2NyX2ZnIHwgZnBzY3JfZnUsCi0gIGZwc2NyX3Jlc2VydmVkXzIwID0gQklUMzIoMjApLAotICBmcHNjcl92eHNvZnQgPSBCSVQzMigyMSksCi0gIGZwc2NyX3Z4c3FydCA9IEJJVDMyKDIyKSwKLSAgZnBzY3JfdnhjdmkgPSBCSVQzMigyMyksCi0gIGZwc2NyX3ZlID0gQklUMzIoMjQpLAotICBmcHNjcl9vZSA9IEJJVDMyKDI1KSwKLSAgZnBzY3JfdWUgPSBCSVQzMigyNiksCi0gIGZwc2NyX3plID0gQklUMzIoMjcpLAotICBmcHNjcl94ZSA9IEJJVDMyKDI4KSwKLSAgZnBzY3JfbmkgPSBCSVQzMigyOSksCi0gIGZwc2NyX3JuID0gTUFTSzMyKDMwLCAzMSksCi0gIGZwc2NyX3JuX3JvdW5kX3RvX25lYXJlc3QgPSAwLAotICBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX3plcm8gPSBNQVNLMzIoMzEsMzEpLAotICBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX3Bvc19pbmZpbml0eSA9IE1BU0szMigzMCwzMCksCi0gIGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfbmVnX2luZmluaXR5ID0gTUFTSzMyKDMwLDMxKSwKLSAgZnBzY3JfdnhfYml0cyA9IChmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSB8IGZwc2NyX3Z4aWRpCi0JCSAgIHwgZnBzY3Jfdnh6ZHogfCBmcHNjcl92eGlteiB8IGZwc2NyX3Z4dmMKLQkJICAgfCBmcHNjcl92eHNvZnQgfCBmcHNjcl92eHNxcnQgfCBmcHNjcl92eGN2aSksCi19OwotCi0KLQotLyoqCi0gKiogWEVSIFJlZ2lzdGVyCi0gKiovCi0KLXR5cGVkZWYgdW5zaWduZWQzMiB4ZXJlZzsKLQotZW51bSB7Ci0gIHhlcl9zdW1tYXJ5X292ZXJmbG93ID0gQklUMzIoMCksIHhlcl9zdW1tYXJ5X292ZXJmbG93X2JpdCA9IDAsCi0gIHhlcl9jYXJyeSA9IEJJVDMyKDIpLCB4ZXJfY2FycnlfYml0ID0gMiwKLSAgeGVyX292ZXJmbG93ID0gQklUMzIoMSksCi0gIHhlcl9yZXNlcnZlZF8zXzI0ID0gTUFTSzMyKDMsMjQpLAotICB4ZXJfYnl0ZV9jb3VudF9tYXNrID0gTUFTSzMyKDI1LDMxKQotfTsKLQotCi0vKioKLSAqKiBTUFIncwotICoqLwotCi0jaW5jbHVkZSAic3ByZWcuaCIKLQotCi0vKioKLSAqKiBTZWdtZW50IFJlZ2lzdGVycwotICoqLwotCi10eXBlZGVmIHVuc2lnbmVkMzIgc3JlZzsKLWVudW0gewotICBucl9vZl9zcnMgPSAxNgotfTsKLQotCi0vKioKLSAqKiBNYWNoaW5lIHN0YXRlIHJlZ2lzdGVyIAotICoqLwotdHlwZWRlZiB1bnNpZ25lZF93b3JkIG1zcmVnOyAvKiAzMiBvciA2NCBiaXRzICovCi0KLWVudW0gewotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIG1zcl82NGJpdF9tb2RlID0gQklUKDApLAotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgbXNyXzY0Yml0X21vZGUgPSAwLAotI2VuZGlmCi0gIG1zcl9wb3dlcl9tYW5hZ2VtZW50X2VuYWJsZSA9IEJJVCg0NSksCi0gIG1zcl90ZW1wb2FyeV9ncHJfcmVtYXBwaW5nID0gQklUKDQ2KSwgLyogNjAzIHNwZWNpZmljICovCi0gIG1zcl9pbnRlcnJ1cHRfbGl0dGxlX2VuZGlhbl9tb2RlID0gQklUKDQ3KSwKLSAgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUgPSBCSVQoNDgpLAotICBtc3JfcHJvYmxlbV9zdGF0ZSA9IEJJVCg0OSksCi0gIG1zcl9mbG9hdGluZ19wb2ludF9hdmFpbGFibGUgPSBCSVQoNTApLAotICBtc3JfbWFjaGluZV9jaGVja19lbmFibGUgPSBCSVQoNTEpLAotICBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMCA9IEJJVCg1MiksCi0gIG1zcl9zaW5nbGVfc3RlcF90cmFjZV9lbmFibGUgPSBCSVQoNTMpLAotICBtc3JfYnJhbmNoX3RyYWNlX2VuYWJsZSA9IEJJVCg1NCksCi0gIG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8xID0gQklUKDU1KSwKLSAgbXNyX2ludGVycnVwdF9wcmVmaXggPSBCSVQoNTcpLAotICBtc3JfaW5zdHJ1Y3Rpb25fcmVsb2NhdGUgPSBCSVQoNTgpLAotICBtc3JfZGF0YV9yZWxvY2F0ZSA9IEJJVCg1OSksCi0gIG1zcl9yZWNvdmVyYWJsZV9pbnRlcnJ1cHQgPSBCSVQoNjIpLAotICBtc3JfbGl0dGxlX2VuZGlhbl9tb2RlID0gQklUKDYzKQotfTsKLQotZW51bSB7Ci0gIHNycjFfaGFzaF90YWJsZV9vcl9pYmF0X21pc3MgPSBCSVQoMzMpLAotICBzcnIxX2RpcmVjdF9zdG9yZV9lcnJvcl9leGNlcHRpb24gPSBCSVQoMzUpLAotICBzcnIxX3Byb3RlY3Rpb25fdmlvbGF0aW9uID0gQklUKDM2KSwKLSAgc3JyMV9zZWdtZW50X3RhYmxlX21pc3MgPSBCSVQoNDIpLAotICBzcnIxX2Zsb2F0aW5nX3BvaW50X2VuYWJsZWQgPSBCSVQoNDMpLAotICBzcnIxX2lsbGVnYWxfaW5zdHJ1Y3Rpb24gPSBCSVQoNDQpLAotICBzcnIxX3ByaXZpbGlnZWRfaW5zdHJ1Y3Rpb24gPSBCSVQoNDUpLAotICBzcnIxX3RyYXAgPSBCSVQoNDYpLAotICBzcnIxX3N1YnNlcXVlbnRfaW5zdHJ1Y3Rpb24gPSBCSVQoNDcpCi19OwotCi0KLS8qKgotICoqIHN0b3JhZ2UgaW50ZXJydXB0IHJlZ2lzdGVycwotICoqLwotCi10eXBlZGVmIGVudW0gewotICBkc2lzcl9kaXJlY3Rfc3RvcmVfZXJyb3JfZXhjZXB0aW9uID0gQklUMzIoMCksCi0gIGRzaXNyX2hhc2hfdGFibGVfb3JfZGJhdF9taXNzID0gQklUMzIoMSksCi0gIGRzaXNyX3Byb3RlY3Rpb25fdmlvbGF0aW9uID0gQklUMzIoNCksCi0gIGRzaXNyX2VhcndheF92aW9sYXRpb24gPSBCSVQzMig1KSwKLSAgZHNpc3Jfc3RvcmVfb3BlcmF0aW9uID0gQklUMzIoNiksCi0gIGRzaXNyX3NlZ21lbnRfdGFibGVfbWlzcyA9IEJJVDMyKDEwKSwKLSAgZHNpc3JfZWFyd2F4X2Rpc2FibGVkID0gQklUMzIoMTEpCi19IGRzaXNyX3N0YXR1czsKLQotCi0KLS8qKgotICoqIEFuZCB0aGUgcmVnaXN0ZXJzIHByb3BlcgotICoqLwotdHlwZWRlZiBzdHJ1Y3QgX3JlZ2lzdGVycyB7Ci0KLSAgZ3ByZWcgZ3ByWzMyXTsKLSAgZnByZWcgZnByWzMyXTsKLSAgY3JlZyBjcjsKLSAgZnBzY3JlZyBmcHNjcjsKLQotICAvKiBNYWNoaW5lIHN0YXRlIHJlZ2lzdGVyICovCi0gIG1zcmVnIG1zcjsKLQotICAvKiBTcHIncyAqLwotICBzcHJlZyBzcHJbbnJfb2Zfc3Byc107Ci0KLSAgLyogU2VnbWVudCBSZWdpc3RlcnMgKi8KLSAgc3JlZyBzcltucl9vZl9zcnNdOwotCi19IHJlZ2lzdGVyczsKLQotCi0vKiBkdW1wIG91dCBhbGwgdGhlIHJlZ2lzdGVycyAqLwotCi1JTkxJTkVfUkVHSVNURVJTXAotKHZvaWQpIHJlZ2lzdGVyc19kdW1wCi0ocmVnaXN0ZXJzICpyZWdzKTsKLQotCi0vKiByZXR1cm4gaW5mb3JtYXRpb24gb24gYSByZWdpc3RlciBiYXNlZCBvbiBuYW1lICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIHJlZ19pbnZhbGlkLAotICByZWdfZ3ByLCByZWdfZnByLCByZWdfc3ByLCByZWdfbXNyLAotICByZWdfY3IsIHJlZ19mcHNjciwgcmVnX3BjLCByZWdfc3IsCi0gIHJlZ19pbnNucywgcmVnX3N0YWxscywgcmVnX2N5Y2xlcywKLSAgbnJfcmVnaXN0ZXJfdHlwZXMKLX0gcmVnaXN0ZXJfdHlwZXM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgcmVnaXN0ZXJfdHlwZXMgdHlwZTsKLSAgaW50IGluZGV4OwotICBpbnQgc2l6ZTsKLX0gcmVnaXN0ZXJfZGVzY3JpcHRpb25zOwotCi1JTkxJTkVfUkVHSVNURVJTXAotKHJlZ2lzdGVyX2Rlc2NyaXB0aW9ucykgcmVnaXN0ZXJfZGVzY3JpcHRpb24KLShjb25zdCBjaGFyIHJlZ1tdKTsKLQotCi0vKiBTcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzIGJ5IHRoZWlyIG1vcmUgY29tbW9uIG5hbWVzICovCi0KLSNkZWZpbmUgU1BSRUcoTikJY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5zcHJbTl0KLSNkZWZpbmUgWEVSICAgICAgICAgICAgIFNQUkVHKHNwcl94ZXIpCi0jZGVmaW5lIExSICAgICAgICAgICAgICBTUFJFRyhzcHJfbHIpCi0jZGVmaW5lIENUUiAgICAgICAgICAgICBTUFJFRyhzcHJfY3RyKQotI2RlZmluZSBTUlIwCQlTUFJFRyhzcHJfc3JyMCkKLSNkZWZpbmUgU1JSMQkJU1BSRUcoc3ByX3NycjEpCi0jZGVmaW5lIERBUgkJU1BSRUcoc3ByX2RhcikKLSNkZWZpbmUgRFNJU1IJCVNQUkVHKHNwcl9kc2lzcikKLQotLyogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtIGluZGV4ZWQgYWNjZXNzICovCi0jZGVmaW5lIEdQUihOKSAgICAgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwcltOXQotCi0vKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBTRUdSRUcoTikgICAgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5zcltOXQotCi0vKiBjb25kaXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ1IgICAgICAgICAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Y3IKLQotLyogbWFjaGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVNSICAgICAgICAJY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IKLQotLyogZmxvYXRpbmctcG9pbnQgc3RhdHVzIGNvbmRpdGlvbiByZWdpc3RlciAqLwotI2RlZmluZSBGUFNDUgkJY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHNjcgotCi0jZW5kaWYgLyogX1JFR0lTVEVSU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zaW0tZW5kaWFuLW4uaCBiL3NpbS9wcGMvc2ltLWVuZGlhbi1uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDQxMGEuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9zaW0tZW5kaWFuLW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIE4KLSNlcnJvciAiTiBtdXN0IGJlICNkZWZpbmVkIgotI2VuZGlmCi0KLS8qIE5PVEU6IFNlZSBlbmQgb2YgZmlsZSBmb3IgI3VuZGVmICovCi0jZGVmaW5lIHVuc2lnbmVkX04gWENPTkNBVDIodW5zaWduZWRfLE4pCi0jZGVmaW5lIGVuZGlhbl90MmhfTiBYQ09OQ0FUMihlbmRpYW5fdDJoXyxOKQotI2RlZmluZSBlbmRpYW5faDJ0X04gWENPTkNBVDIoZW5kaWFuX2gydF8sTikKLSNkZWZpbmUgX1NXQVBfTiBYQ09OQ0FUMihfU1dBUF8sTikKLSNkZWZpbmUgc3dhcF9OIFhDT05DQVQyKHN3YXBfLE4pCi0jZGVmaW5lIGVuZGlhbl9oMmJlX04gWENPTkNBVDIoZW5kaWFuX2gyYmVfLE4pCi0jZGVmaW5lIGVuZGlhbl9iZTJoX04gWENPTkNBVDIoZW5kaWFuX2JlMmhfLE4pCi0jZGVmaW5lIGVuZGlhbl9oMmxlX04gWENPTkNBVDIoZW5kaWFuX2gybGVfLE4pCi0jZGVmaW5lIGVuZGlhbl9sZTJoX04gWENPTkNBVDIoZW5kaWFuX2xlMmhfLE4pCi0KLQotSU5MSU5FX1NJTV9FTkRJQU5cCi0odW5zaWduZWRfTikKLWVuZGlhbl90MmhfTih1bnNpZ25lZF9OIHJhd19pbikKLXsKLSAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIpIHsKLSAgICByZXR1cm4gcmF3X2luOwotICB9Ci0gIGVsc2UgewotICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci0gIH0KLX0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF9OKQotZW5kaWFuX2gydF9OKHVuc2lnbmVkX04gcmF3X2luKQotewotICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBDVVJSRU5UX0hPU1RfQllURV9PUkRFUikgewotICAgIHJldHVybiByYXdfaW47Ci0gIH0KLSAgZWxzZSB7Ci0gICAgX1NXQVBfTihyZXR1cm4scmF3X2luKTsKLSAgfQotfQotCi0KLUlOTElORV9TSU1fRU5ESUFOXAotKHVuc2lnbmVkX04pCi1zd2FwX04odW5zaWduZWRfTiByYXdfaW4pCi17Ci0gIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci19Ci0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF9OKQotZW5kaWFuX2gyYmVfTih1bnNpZ25lZF9OIHJhd19pbikKLXsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKLSAgICByZXR1cm4gcmF3X2luOwotICB9Ci0gIGVsc2UgewotICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci0gIH0KLX0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF9OKQotZW5kaWFuX2JlMmhfTih1bnNpZ25lZF9OIHJhd19pbikKLXsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKLSAgICByZXR1cm4gcmF3X2luOwotICB9Ci0gIGVsc2UgewotICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci0gIH0KLX0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF9OKQotZW5kaWFuX2gybGVfTih1bnNpZ25lZF9OIHJhd19pbikKLXsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pIHsKLSAgICByZXR1cm4gcmF3X2luOwotICB9Ci0gIGVsc2UgewotICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci0gIH0KLX0KLQotCi1JTkxJTkVfU0lNX0VORElBTlwKLSh1bnNpZ25lZF9OKQotZW5kaWFuX2xlMmhfTih1bnNpZ25lZF9OIHJhd19pbikKLXsKLSAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pIHsKLSAgICByZXR1cm4gcmF3X2luOwotICB9Ci0gIGVsc2UgewotICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Ci0gIH0KLX0KLQotCi0vKiBOT1RFOiBTZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSAqLwotI3VuZGVmIHVuc2lnbmVkX04KLSN1bmRlZiBlbmRpYW5fdDJoX04KLSN1bmRlZiBlbmRpYW5faDJ0X04KLSN1bmRlZiBfU1dBUF9OCi0jdW5kZWYgc3dhcF9OCi0jdW5kZWYgZW5kaWFuX2gyYmVfTgotI3VuZGVmIGVuZGlhbl9iZTJoX04KLSN1bmRlZiBlbmRpYW5faDJsZV9OCi0jdW5kZWYgZW5kaWFuX2xlMmhfTgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zaW0tZW5kaWFuLmMgYi9zaW0vcHBjL3NpbS1lbmRpYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlMzY2OS4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3NpbS1lbmRpYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1NJTV9FTkRJQU5fQ18KLSNkZWZpbmUgX1NJTV9FTkRJQU5fQ18KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImJhc2ljcy5oIgotCi0KLSNpZiAhZGVmaW5lZChfU1dBUF8xKQotI2RlZmluZSBfU1dBUF8xKFNFVCxSQVcpIFNFVCAoUkFXKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfU1dBUF8yKSAmJiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikgJiYgZGVmaW5lZChodG9ucykKLSNkZWZpbmUgX1NXQVBfMihTRVQsUkFXKSBTRVQgaHRvbnMgKFJBVykKLSNlbmRpZgotCi0jaWZuZGVmCV9TV0FQXzIKLSNkZWZpbmUgX1NXQVBfMihTRVQsUkFXKSBTRVQgKCgoUkFXKSA+PiA4KSB8ICgoUkFXKSA8PCA4KSkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1NXQVBfNCkgJiYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoaHRvbmwpCi0jZGVmaW5lIF9TV0FQXzQoU0VULFJBVykgU0VUIGh0b25sIChSQVcpCi0jZW5kaWYKLQotI2lmbmRlZiBfU1dBUF80Ci0jZGVmaW5lCV9TV0FQXzQoU0VULFJBVykgU0VUICgoKFJBVykgPDwgMjQpIHwgKCgoUkFXKSAmIDB4ZmYwMCkgPDwgOCkgfCAoKChSQVcpICYgMHhmZjAwMDApID4+IDgpIHwgKChSQVcpID4+IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIF9TV0FQXzgKLSNkZWZpbmUgX1NXQVBfOChTRVQsUkFXKSBcCi0gIHVuaW9uIHsgdW5zaWduZWRfOCBkd29yZDsgdW5zaWduZWRfNCB3b3Jkc1syXTsgfSBpbiwgb3V0OyBcCi0gIGluLmR3b3JkID0gUkFXOyBcCi0gIF9TV0FQXzQgKG91dC53b3Jkc1swXSA9LCBpbi53b3Jkc1sxXSk7IFwKLSAgX1NXQVBfNCAob3V0LndvcmRzWzFdID0sIGluLndvcmRzWzBdKTsgXAotICBTRVQgb3V0LmR3b3JkOwotI2VuZGlmCi0KLSNkZWZpbmUgTiAxCi0jaW5jbHVkZSAic2ltLWVuZGlhbi1uLmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gMgotI2luY2x1ZGUgInNpbS1lbmRpYW4tbi5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDQKLSNpbmNsdWRlICJzaW0tZW5kaWFuLW4uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiA4Ci0jaW5jbHVkZSAic2ltLWVuZGlhbi1uLmgiCi0jdW5kZWYgTgotCi0jZW5kaWYgLyogX1NJTV9FTkRJQU5fQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvc2ltLWVuZGlhbi5oIGIvc2ltL3BwYy9zaW0tZW5kaWFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2E5NzAuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy9zaW0tZW5kaWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfU0lNX0VORElBTl9IXwotI2RlZmluZSBfU0lNX0VORElBTl9IXwotCi0KLS8qIEMgYnl0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwotCi1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5faDJ0XzEodW5zaWduZWRfMSB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9oMnRfMih1bnNpZ25lZF8yIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2gydF80KHVuc2lnbmVkXzQgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5faDJ0XzgodW5zaWduZWRfOCB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX3QyaF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5fdDJoXzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl90MmhfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX3QyaF84KHVuc2lnbmVkXzggeCk7Ci0KLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIHN3YXBfMSh1bnNpZ25lZF8xIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgc3dhcF8yKHVuc2lnbmVkXzIgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBzd2FwXzQodW5zaWduZWRfNCB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIHN3YXBfOCh1bnNpZ25lZF84IHgpOwotCi1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5faDJiZV8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5faDJiZV8yKHVuc2lnbmVkXzIgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5faDJiZV80KHVuc2lnbmVkXzQgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5faDJiZV84KHVuc2lnbmVkXzggeCk7Ci0KLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9iZTJoXzEodW5zaWduZWRfMSB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9iZTJoXzIodW5zaWduZWRfMiB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9iZTJoXzQodW5zaWduZWRfNCB4KTsKLUlOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9iZTJoXzgodW5zaWduZWRfOCB4KTsKLQotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2gybGVfMSh1bnNpZ25lZF8xIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2gybGVfMih1bnNpZ25lZF8yIHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2gybGVfNCh1bnNpZ25lZF80IHgpOwotSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2gybGVfOCh1bnNpZ25lZF84IHgpOwotCi1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5fbGUyaF8xKHVuc2lnbmVkXzEgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5fbGUyaF8yKHVuc2lnbmVkXzIgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5fbGUyaF80KHVuc2lnbmVkXzQgeCk7Ci1JTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5fbGUyaF84KHVuc2lnbmVkXzggeCk7Ci0KLQotLyogSG9zdCBkZXBlbmRhbnQ6Ci0KLSAgIFRoZSBDUFAgYmVsb3cgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsYXRpb24gaG9zdC4gIEluCi0gICBwYXJ0aWN1bGFyIGl0IGRlZmluZXMgdGhlIG1hY3JvJ3M6Ci0KLSAgIAlXSVRIX0hPU1RfQllURV9PUkRFUglUaGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdC4gQ291bGQKLQkJCQliZSBhbnkgb2YgTElUVExFX0VORElBTiwgQklHX0VORElBTgotCQkJCW9yIDAgKHVua25vd24pLiAgVGhvc2UgbWFjcm8ncyBhbHNvCi0JCQkJbmVlZCB0byBiZSBkZWZpbmVkLgotCi0gKi8KLQotCi0vKiBOZXRCU0Q6Ci0KLSAgIE5ldEJTRCBpcyBlYXN5LCBldmVyeXRoaW5nIHlvdSBjb3VsZCBldmVyIHdhbnQgaXMgaW4gYSBoZWFkZXIgZmlsZQotICAgKHdlbGwgYWxtb3N0IDotKSAqLwotCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKQotIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyBlbmRpZgotIyBpZiAoQllURV9PUkRFUiAhPSBXSVRIX0hPU1RfQllURV9PUkRFUikKLSMgIGVycm9yICJob3N0IGVuZGlhbiBpbmNvcnJlY3RseSBjb25maWd1cmVkLCBjaGVjayBjb25maWcuaCIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBMaW51eCBpcyBzaW1pbGFybHkgZWFzeS4gICovCi0KLSNpZiBkZWZpbmVkKF9fbGludXhfXykKLSMgaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jIGluY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSMgaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKExJVFRMRV9FTkRJQU4pCi0jICBkZWZpbmUgTElUVExFX0VORElBTiBfX0xJVFRMRV9FTkRJQU4KLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKEJJR19FTkRJQU4pCi0jICBkZWZpbmUgQklHX0VORElBTiBfX0JJR19FTkRJQU4KLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpICYmICFkZWZpbmVkKEJZVEVfT1JERVIpCi0jICBkZWZpbmUgQllURV9PUkRFUiBfX0JZVEVfT1JERVIKLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJZVEVfT1JERVIKLSMgZW5kaWYKLSMgaWYgKEJZVEVfT1JERVIgIT0gV0lUSF9IT1NUX0JZVEVfT1JERVIpCi0jICBlcnJvciAiaG9zdCBlbmRpYW4gaW5jb3JyZWN0bHkgY29uZmlndXJlZCwgY2hlY2sgY29uZmlnLmgiCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogSU5TRVJUIEhFUkUgLSBob3N0cyB0aGF0IGhhdmUgYXZhaWxhYmxlIExJVFRMRV9FTkRJQU4gYW5kCi0gICBCSUdfRU5ESUFOIG1hY3JvJ3MgKi8KLQotCi0vKiBTb21lIGhvc3RzIGRvbid0IGRlZmluZSBMSVRUTEVfRU5ESUFOIG9yIEJJR19FTkRJQU4sIGhlbHAgdGhlbSBvdXQgKi8KLQotI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAotI2VuZGlmCi0jaWZuZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgQklHX0VORElBTiA0MzIxCi0jZW5kaWYKLQotCi0vKiBTdW5PUyBvbiBTUEFSQzoKLQotICAgQmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgKi8KLQotI2lmIGRlZmluZWQoc3BhcmMpIHx8IGRlZmluZWQoX19zcGFyY19fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTikKLSMgIGVycm9yICJzdW4gd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIFJhbmRvbSB4ODYKLQotICAgTGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgKi8KLQotI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChpNDg2KSB8fCBkZWZpbmVkKGk1ODYpIHx8IGRlZmluZWQgKGk2ODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKLSMgIGVycm9yICJ4ODYgd2FzIGxpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgKGRlZmluZWQgKF9faTQ4Nl9fKSB8fCBkZWZpbmVkIChfX2k1ODZfXykgfHwgZGVmaW5lZCAoX19pNjg2X18pKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBXSVRIX0JTV0FQCi0jdW5kZWYgIGh0b25sCi0jdW5kZWYgIG50b2hsCi0jZGVmaW5lIGh0b25sKElOKSBfX2V4dGVuc2lvbl9fICh7IGludCBfb3V0OyBfX2FzbV9fICgiYnN3YXAgJTAiIDogIj1yIiAoX291dCkgOiAiMCIgKElOKSk7IF9vdXQ7IH0pCi0jZGVmaW5lIG50b2hsKElOKSBfX2V4dGVuc2lvbl9fICh7IGludCBfb3V0OyBfX2FzbV9fICgiYnN3YXAgJTAiIDogIj1yIiAoX291dCkgOiAiMCIgKElOKSk7IF9vdXQ7IH0pCi0jZW5kaWYKLQotLyogUG93ZXIgb3IgUG93ZXJQQyBydW5uaW5nIEFJWCAgKi8KLSNpZiBkZWZpbmVkKF9QT1dFUikgJiYgZGVmaW5lZChfQUlYKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTikKLSMgIGVycm9yICJQb3dlci9Qb3dlclBDIEFJWCB3YXMgYmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFNvbGFyaXMgcnVubmluZyBQb3dlclBDICovCi0jaWYgZGVmaW5lZChfX1BQQykgJiYgZGVmaW5lZChfX3N1bl9fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKLSMgIGVycm9yICJTb2xhcmlzIG9uIFBvd2VyUENzIHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogSFAvUEEgKi8KLSNpZiBkZWZpbmVkKF9faHBwYV9fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTikKLSMgIGVycm9yICJIUC9QQSB3YXMgYmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEJpZyBlbmRpYW4gTUlQUyAqLwotI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCi0jICBlcnJvciAiTUlQU0VCIHdhcyBiaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogTGl0dGxlIGVuZGlhbiBNSVBTICovCi0jaWYgZGVmaW5lZChfX01JUFNFTF9fKQotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKLSMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBlbmRpZgotIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKLSMgIGVycm9yICJNSVBTRUwgd2FzIGxpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXaW5kb3dzIE5UICovCi0jaWYgZGVmaW5lZChfX1dJTjMyX18pCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQotIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKLSMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0jIGVuZGlmCi0jIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQotIyAgZXJyb3IgIldpbmRvd3MgTlQgd2FzIGxpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBBbHBoYSBydW5uaW5nIERFQyB1bml4ICovCi0jaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCi0jICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgZW5kaWYKLSMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCi0jICBlcnJvciAiQVhQIHJ1bm5pbmcgREVDIHVuaXggd2FzIGxpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIElOU0VSVCBIRVJFIC0gYWRkaXRpb25hbCBob3N0cyB0aGF0IGRvIG5vdCBoYXZlIExJVFRMRV9FTkRJQU4gYW5kCi0gICBCSUdfRU5ESUFOIGRlZmluaXRpb25zIGF2YWlsYWJsZS4gICovCi0KLS8qIFNXQVAgKi8KLQotI2RlZmluZSBTV0FQXzEoWCkgc3dhcF8xKFgpCi0jZGVmaW5lIFNXQVBfMihYKSBzd2FwXzIoWCkKLSNkZWZpbmUgU1dBUF80KFgpIHN3YXBfNChYKQotI2RlZmluZSBTV0FQXzgoWCkgc3dhcF84KFgpCi0KLQotLyogSE9TVCB0byBCRSAqLwotCi0jZGVmaW5lIEgyQkVfMShYKSBlbmRpYW5faDJiZV8xKFgpCi0jZGVmaW5lIEgyQkVfMihYKSBlbmRpYW5faDJiZV8yKFgpCi0jZGVmaW5lIEgyQkVfNChYKSBlbmRpYW5faDJiZV80KFgpCi0jZGVmaW5lIEgyQkVfOChYKSBlbmRpYW5faDJiZV84KFgpCi0jZGVmaW5lIEJFMkhfMShYKSBlbmRpYW5fYmUyaF8xKFgpCi0jZGVmaW5lIEJFMkhfMihYKSBlbmRpYW5fYmUyaF8yKFgpCi0jZGVmaW5lIEJFMkhfNChYKSBlbmRpYW5fYmUyaF80KFgpCi0jZGVmaW5lIEJFMkhfOChYKSBlbmRpYW5fYmUyaF84KFgpCi0KLQotLyogSE9TVCB0byBMRSAqLwotCi0jZGVmaW5lIEgyTEVfMShYKSBlbmRpYW5faDJsZV8xKFgpCi0jZGVmaW5lIEgyTEVfMihYKSBlbmRpYW5faDJsZV8yKFgpCi0jZGVmaW5lIEgyTEVfNChYKSBlbmRpYW5faDJsZV80KFgpCi0jZGVmaW5lIEgyTEVfOChYKSBlbmRpYW5faDJsZV84KFgpCi0jZGVmaW5lIExFMkhfMShYKSBlbmRpYW5fbGUyaF8xKFgpCi0jZGVmaW5lIExFMkhfMihYKSBlbmRpYW5fbGUyaF8yKFgpCi0jZGVmaW5lIExFMkhfNChYKSBlbmRpYW5fbGUyaF80KFgpCi0jZGVmaW5lIExFMkhfOChYKSBlbmRpYW5fbGUyaF84KFgpCi0KLQotLyogSE9TVCB0byBUQVJHRVQgKi8KLQotI2RlZmluZSBIMlRfMShYKSBlbmRpYW5faDJ0XzEoWCkKLSNkZWZpbmUgSDJUXzIoWCkgZW5kaWFuX2gydF8yKFgpCi0jZGVmaW5lIEgyVF80KFgpIGVuZGlhbl9oMnRfNChYKQotI2RlZmluZSBIMlRfOChYKSBlbmRpYW5faDJ0XzgoWCkKLSNkZWZpbmUgVDJIXzEoWCkgZW5kaWFuX3QyaF8xKFgpCi0jZGVmaW5lIFQySF8yKFgpIGVuZGlhbl90MmhfMihYKQotI2RlZmluZSBUMkhfNChYKSBlbmRpYW5fdDJoXzQoWCkKLSNkZWZpbmUgVDJIXzgoWCkgZW5kaWFuX3QyaF84KFgpCi0KLQotLyogQ09OVkVSVCBJTiBQTEFDRQotCi0gICBUaGVzZSBtYWNyb3MsIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHVua25vd24gc2l6ZSwgc3dhcCBpdHMgdmFsdWUgaW4KLSAgIHBsYWNlIGlmIGEgaG9zdC90YXJnZXQgY29udmVyc2lvbiBpcyByZXF1aXJlZC4gKi8KLQotI2RlZmluZSBIMlQoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gSDJUXzEoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDI6IFZBUklBQkxFID0gSDJUXzIoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDQ6IFZBUklBQkxFID0gSDJUXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gSDJUXzgoVkFSSUFCTEUpOyBicmVhazsgXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVDJIKFZBUklBQkxFKSBcCi1kbyB7IFwKLSAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKLSAgY2FzZSAxOiBWQVJJQUJMRSA9IFQySF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IFQySF8yKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSA0OiBWQVJJQUJMRSA9IFQySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSA4OiBWQVJJQUJMRSA9IFQySF84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNXQVAoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gU1dBUF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IFNXQVBfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBTV0FQXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gU1dBUF84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEgyQkUoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gSDJCRV8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IEgyQkVfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBIMkJFXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gSDJCRV84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEJFMkgoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gQkUySF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IEJFMkhfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBCRTJIXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gQkUySF84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEgyTEUoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gSDJMRV8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IEgyTEVfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBIMkxFXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gSDJMRV84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIExFMkgoVkFSSUFCTEUpIFwKLWRvIHsgXAotICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAotICBjYXNlIDE6IFZBUklBQkxFID0gTEUySF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgY2FzZSAyOiBWQVJJQUJMRSA9IExFMkhfMihWQVJJQUJMRSk7IGJyZWFrOyBcCi0gIGNhc2UgNDogVkFSSUFCTEUgPSBMRTJIXzQoVkFSSUFCTEUpOyBicmVhazsgXAotICBjYXNlIDg6IFZBUklBQkxFID0gTEUySF84KFZBUklBQkxFKTsgYnJlYWs7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0KLQotLyogVEFSR0VUIFdPUkQ6Ci0KLSAgIEJ5dGUgc3dhcCBhIHF1YW50aXR5IHRoZSBzaXplIG9mIHRoZSB0YXJnZXRzIHdvcmQgKi8KLQotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0jZGVmaW5lIEgyVF93b3JkKFgpIEgyVF84KFgpCi0jZGVmaW5lIFQySF93b3JkKFgpIFQySF84KFgpCi0jZGVmaW5lIEgyQkVfd29yZChYKSBIMkJFXzgoWCkKLSNkZWZpbmUgQkUySF93b3JkKFgpIEJFMkhfOChYKQotI2RlZmluZSBIMkxFX3dvcmQoWCkgSDJMRV84KFgpCi0jZGVmaW5lIExFMkhfd29yZChYKSBMRTJIXzgoWCkKLSNkZWZpbmUgU1dBUF93b3JkKFgpIFNXQVBfOChYKQotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSNkZWZpbmUgSDJUX3dvcmQoWCkgSDJUXzQoWCkKLSNkZWZpbmUgVDJIX3dvcmQoWCkgVDJIXzQoWCkKLSNkZWZpbmUgSDJCRV93b3JkKFgpIEgyQkVfNChYKQotI2RlZmluZSBCRTJIX3dvcmQoWCkgQkUySF80KFgpCi0jZGVmaW5lIEgyTEVfd29yZChYKSBIMkxFXzQoWCkKLSNkZWZpbmUgTEUySF93b3JkKFgpIExFMkhfNChYKQotI2RlZmluZSBTV0FQX3dvcmQoWCkgU1dBUF80KFgpCi0jZW5kaWYKLQotCi0vKiBUQVJHRVQgQ0VMTDoKLQotICAgQnl0ZSBzd2FwIGEgcXVhbnRpdHkgdGhlIHNpemUgb2YgdGhlIHRhcmdldHMgSUVFRSAxMjc1IG1lbW9yeSBjZWxsICovCi0KLSNkZWZpbmUgSDJUX2NlbGwoWCkgSDJUXzQoWCkKLSNkZWZpbmUgVDJIX2NlbGwoWCkgVDJIXzQoWCkKLSNkZWZpbmUgSDJCRV9jZWxsKFgpIEgyQkVfNChYKQotI2RlZmluZSBCRTJIX2NlbGwoWCkgQkUySF80KFgpCi0jZGVmaW5lIEgyTEVfY2VsbChYKSBIMkxFXzQoWCkKLSNkZWZpbmUgTEUySF9jZWxsKFgpIExFMkhfNChYKQotI2RlZmluZSBTV0FQX2NlbGwoWCkgU1dBUF80KFgpCi0KLQotI2lmIChTSU1fRU5ESUFOX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQotIyBpbmNsdWRlICJzaW0tZW5kaWFuLmMiCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TSU1fRU5ESUFOX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3NpbV9jYWxsYmFja3MuaCBiL3NpbS9wcGMvc2ltX2NhbGxiYWNrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJhZjlkLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvc2ltX2NhbGxiYWNrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfU0lNX0NBTExCQUNLU19IXwotI2RlZmluZSBfU0lNX0NBTExCQUNLU19IXwotCi0vKiBTaW11bGF0b3Igb3V0cHV0OgotCi0gICBGdW5jdGlvbnMgdG8gcmVwb3J0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuICovCi0KLSNkZWZpbmUgcHJpbnRmX2ZpbHRlcmVkIHNpbV9pb19wcmludGZfZmlsdGVyZWQKLXZvaWQgc2ltX2lvX3ByaW50Zl9maWx0ZXJlZAotKGNvbnN0IGNoYXIgKm1zZywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0KLXZvaWQgTk9SRVRVUk4gZXJyb3IKLShjb25zdCBjaGFyICptc2csIC4uLik7Ci0KLQotLyogRXh0ZXJuYWwgZW52aXJvbm1lbnQ6Ci0KLSAgIFNvbWUgSE9TVCBPUydzIHJlcXVpcmUgcmVndWxhciBwb2xsaW5nIHNvIHRoYXQgZXh0ZXJuYWwgZXZlbnRzIHN1Y2gKLSAgIGFzIEdVSSBpbyBjYW4gYmUgaGFuZGxlZC4gKi8KLQotdm9pZCBzaW1faW9fcG9sbF9xdWl0Ci0odm9pZCk7Ci0KLQotCi0vKiBNb2RlbCBJL086Ci0KLSAgIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbW9kZWxlZCB0YXJnZXRzCi0gICBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgYW5kIHRoZSBob3N0cyBleHRlcm5hbAotICAgZW52aXJvbm1lbnQuCi0KLSAgIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzIHJlc3BvbnNpYmxlIGZvciBjby1vcmRpbmF0aW5nIEkvTwotICAgaW50ZXJhY3Rpb25zIHN1Y2ggYXM6Ci0KLSAgICAgICAgbWFpbigpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyIG1lc3NbXSA9ICJIZWxsbyBXb3JsZFxyXG4iOwotICAgICAgICAgIGludCBvdXQ7Ci0gICAgICAgICAgb3V0ID0gZHVwKDEpOwotICAgICAgICAgIGNsb3NlKDEpOwotICAgICAgICAgIHdyaXRlKG91dCwgbWVzcywgc2l6ZW9mKG1lc3MpKQotICAgICAgICB9Ci0KLSAgIFRoYXQgaXMgdG8gc2F5LCB0aGUgdW5kZXJseWluZyBtb2RlbCB3b3VsZCwgaW4gaW1wbGVtZW50aW5nIGR1cCgpCi0gICByZWNvcmRlZCB0aGUgZmFjdCB0aGF0IGFueSBvdXRwdXQgZGlyZWN0ZWQgYXQgZmlkLU9VVCBzaG91bGQgYmUKLSAgIGRpc3BsYXllZCB1c2luZyBzaW1faW9fd3JpdGVfc3Rkb3V0KCkuICBXaGlsZSBmb3IgdGhlIGNvZGUgc3R1YjoKLQotICAgICAgICBtYWluKCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnN0IGNoYXIgbWVzc1tdID0gIkhlbGxvIFdvcmxkXHJcbiI7Ci0gICAgICAgICAgaW50IG91dDsKLSAgICAgICAgICBjbG9zZSgxKTsKLSAgICAgICAgICBvdXQgPSBvcGVuKCJvdXRwdXQiLCAweDAwMDF8MHgwMjAwLCAwKTsgLy8gd3JpdGUrY3JlYXRlCi0gICAgICAgICAgb3V0ID0gZHVwKDEpOwotICAgICAgICAgIHdyaXRlKG91dCwgbWVzcywgc2l6ZW9mKG1lc3MpKQotICAgICAgICB9Ci0KLSAgIHdvdWxkIHJlc3VsdCBpbiBvdXRwdXQgdG8gZmlkLTEgYmVpbmcgZGlyZWN0ZWQgdG93YXJkcyB0aGUgZmlsZQotICAgIm91dHB1dCIuICovCi0KLQotaW50Ci1zaW1faW9fd3JpdGVfc3Rkb3V0Ci0oY29uc3QgY2hhciAqYnVmLAotIGludCBzaXplb2ZfYnVmKTsKLQotaW50Ci1zaW1faW9fd3JpdGVfc3RkZXJyCi0oY29uc3QgY2hhciAqYnVmLAotIGludCBzaXplb2ZfYnVmKTsKLQotLyogcmVhZCByZXN1bHRzICovCi1lbnVtIHsgc2ltX2lvX2VvZiA9IC0xLCBzaW1faW9fbm90X3JlYWR5ID0gLTIsIH07IC8qIFNlZTogSUVFRSAxMjc1ICovCi0gIAotaW50Ci1zaW1faW9fcmVhZF9zdGRpbgotKGNoYXIgKmJ1ZiwKLSBpbnQgc2l6ZW9mX2J1Zik7Ci0KLSNkZWZpbmUgZmx1c2hfc3Rkb3V0cHV0IHNpbV9pb19mbHVzaF9zdGRvdXRwdXQKLXZvaWQgc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dAotKHZvaWQpOwotCi0KLS8qIE1lbW9yeSBtYW5hZ2VtZW50IHdpdGggYW4gYWxsb2NhdG9yIHRoYXQgY2xlYXJzIG1lbW9yeSBiZWZvcmUgdXNlLiAqLwotCi12b2lkICp6YWxsb2MKLShsb25nIHNpemUpOwotCi0jZGVmaW5lIFpBTExPQyhUWVBFKSAoVFlQRSopemFsbG9jKHNpemVvZiAoVFlQRSkpCi0KLXZvaWQgemZyZWUodm9pZCopOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvc2ltX2NhbGxzLmMgYi9zaW0vcHBjL3NpbV9jYWxscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRmM2M1Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvc2ltX2NhbGxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwxOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaW5jbHVkZSA8c2lnbmFsLmg+IC8qIEZJWE1FIC0gc2hvdWxkIGJlIG1hY2hpbmUgZGVwZW5kYW50IHZlcnNpb24gKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicHNpbS5oIgotI2luY2x1ZGUgIm9wdGlvbnMuaCIKLQotI3VuZGVmIHByaW50Zl9maWx0ZXJlZCAvKiBibG93IGF3YXkgdGhlIG1hcHBpbmcgKi8KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0KLS8qIERlZmluZSB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgc2ltdWxhdG9yIHNob3VsZCBwb2xsIHRoZSBob3N0Ci0gICBmb3IgYSBxdWl0LiAqLwotI2lmbmRlZiBQT0xMX1FVSVRfSU5URVJWQUwKLSNkZWZpbmUgUE9MTF9RVUlUX0lOVEVSVkFMIDB4MjAKLSNlbmRpZgotCi1zdGF0aWMgaW50IHBvbGxfcXVpdF9jb3VudCA9IFBPTExfUVVJVF9JTlRFUlZBTDsKLQotLyogU3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBzaW11bGF0b3IsIGZvciBnZGIganVzdCBoYXZlIHN0YXRpYyBzdHJ1Y3R1cmVzICovCi0KLXN0YXRpYyBwc2ltICpzaW11bGF0b3I7Ci1zdGF0aWMgZGV2aWNlICpyb290X2RldmljZTsKLXN0YXRpYyBob3N0X2NhbGxiYWNrICpjYWxsYmFja3M7Ci0KLS8qIFdlIHVzZSBHREIncyByZWdfbmFtZXMgYXJyYXkgdG8gbWFwIEdEQiByZWdpc3RlciBudW1iZXJzIG9udG8KLSAgIG5hbWVzLCB3aGljaCB3ZSBjYW4gdGhlbiBsb29rIHVwIGluIHRoZSByZWdpc3RlciB0YWJsZS4KLQotICAgV2UgdXNlZCB0byBqdXN0IHVzZSB0aGUgUkVHSVNURVJfTkFNRVMgbWFjcm8sIGZyb20gR0RCJ3MKLSAgIHRhcmdldC1kZXBlbmRlbnQgaGVhZGVyIGZpbGVzLiAgVGhhdCB3YXMga2luZCBvZiBuaWNlLCBiZWNhdXNlIGl0Ci0gICBtZWFudCB0aGF0IGxpYnNpbS5hIGhhZCBvbmx5IGEgY29tcGlsZS10aW1lIGRlcGVuZGVuY3kgb24gR0RCOwotICAgdXNpbmcgcmVnX25hbWVzIGRpcmVjdGx5IG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vdyBsaW5rLXRpbWUgYW5kCi0gICBydW4tdGltZSBkZXBlbmRlbmNpZXMgdG9vLgotCi0gICBIb3dldmVyLCB0aGUgR0RCIFBQQyBiYWNrLWVuZCBub3cgbW9kaWZpZXMgdGhlIHJlZ19uYW1lcyBhcnJheSB3aGVuCi0gICB0aGUgdXNlciBydW5zIHRoZSBgc2V0IHByb2Nlc3NvcicgY29tbWFuZCwgd2hpY2ggYWZmZWN0cyB0aGUKLSAgIG1lYW5pbmdzIG9mIHRoZSByZWdpc3RlciBudW1iZXJzLiAgU28gdGhlIHNpbSBuZWVkcyB0byBzZWUgdGhlCi0gICByZWdpc3RlciBuYW1lcyBHREIgaXMgYWN0dWFsbHkgdXNpbmcuCi0KLSAgIFBlcmhhcHMgdGhlIGhvc3RfY2FsbGJhY2sgc3RydWN0dXJlIGNvdWxkIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZQotICAgcmVnaXN0ZXIgbmFtZSB0YWJsZTsgdGhhdCB3b3VsZCBiZSBjbGVhbmVyLiAgKi8KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChTSU1fT1BFTl9LSU5EIGtpbmQsCi0JICBob3N0X2NhbGxiYWNrICpjYWxsYmFjaywKLQkgIHN0cnVjdCBfYmZkICphYmZkLAotCSAgY2hhciAqKmFyZ3YpCi17Ci0gIGNhbGxiYWNrcyA9IGNhbGxiYWNrOwotCi0gIC8qIE5vdGU6IFRoZSBzaW11bGF0aW9uIGlzIG5vdCBjcmVhdGVkIGJ5IHNpbV9vcGVuKCkgYmVjYXVzZQotICAgICBjb21wbGV0ZSBpbmZvcm1hdGlvbiBpcyBub3QgeWV0IGF2YWlsYWJsZSAqLwotICAvKiB0cmFjZSB0aGUgY2FsbCAqLwotICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX29wZW4gY2FsbGVkXG4iKSk7Ci0KLSAgaWYgKHJvb3RfZGV2aWNlICE9IE5VTEwpCi0gICAgc2ltX2lvX3ByaW50Zl9maWx0ZXJlZCgiV2FybmluZyAtIHJlLW9wZW4gb2Ygc2ltdWxhdG9yIGxlYWtzIG1lbW9yeVxuIik7Ci0gIHJvb3RfZGV2aWNlID0gcHNpbV90cmVlKCk7Ci0gIHNpbXVsYXRvciA9IE5VTEw7Ci0KLSAgcHNpbV9vcHRpb25zKHJvb3RfZGV2aWNlLCBhcmd2ICsgMSk7Ci0KLSAgaWYgKHBwY190cmFjZVt0cmFjZV9vcHRzXSkKLSAgICBwcmludF9vcHRpb25zICgpOwotCi0gIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yIGZvciBub3cgKi8KLSAgcmV0dXJuIChTSU1fREVTQykgMTsKLX0KLQotCi12b2lkCi1zaW1fY2xvc2UgKFNJTV9ERVNDIHNkLCBpbnQgcXVpdHRpbmcpCi17Ci0gIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fY2xvc2UocXVpdHRpbmc9JWQpIGNhbGxlZFxuIiwgcXVpdHRpbmcpKTsKLSAgaWYgKHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSAmJiBzaW11bGF0b3IgIT0gTlVMTCkKLSAgICBwc2ltX3ByaW50X2luZm8gKHNpbXVsYXRvciwgcHBjX3RyYWNlW3RyYWNlX3ByaW50X2luZm9dKTsKLX0KLQotCi1TSU1fUkMKLXNpbV9sb2FkIChTSU1fREVTQyBzZCwgY2hhciAqcHJvZywgYmZkICphYmZkLCBpbnQgZnJvbV90dHkpCi17Ci0gIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fbG9hZChwcm9nPSVzLCBmcm9tX3R0eT0lZCkgY2FsbGVkXG4iLAotCQkgICAgcHJvZywgZnJvbV90dHkpKTsKLSAgQVNTRVJUKHByb2cgIT0gTlVMTCk7Ci0KLSAgLyogY3JlYXRlIHRoZSBzaW11bGF0b3IgKi8KLSAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9sb2FkKCkgLSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNpbXVsYXRvclxuIikpOwotICBzaW11bGF0b3IgPSBwc2ltX2NyZWF0ZShwcm9nLCByb290X2RldmljZSk7Ci0KLSAgLyogYnJpbmcgaW4gYWxsIHRoZSBkYXRhIHNlY3Rpb24gKi8KLSAgcHNpbV9pbml0KHNpbXVsYXRvcik7Ci0KLSAgLyogZ2V0IHRoZSBzdGFydCBhZGRyZXNzICovCi0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgewotICAgICAgYWJmZCA9IGJmZF9vcGVuciAocHJvZywgMCk7Ci0gICAgICBpZiAoYWJmZCA9PSBOVUxMKQotCWVycm9yICgicHNpbTogY2FuJ3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCAKLQkgICAgICAgcHJvZywgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkgCi0JewotCSAgY29uc3QgY2hhciAqZXJybXNnID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0JICBiZmRfY2xvc2UgKGFiZmQpOwotCSAgZXJyb3IgKCJwc2ltOiBcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlc1xuIiwKLQkJIHByb2csIGVycm1zZyk7Ci0JfQotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotCi1pbnQKLXNpbV9yZWFkIChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpCi17Ci0gIGludCByZXN1bHQgPSBwc2ltX3JlYWRfbWVtb3J5KHNpbXVsYXRvciwgTUFYX05SX1BST0NFU1NPUlMsCi0JCQkJYnVmLCBtZW0sIGxlbmd0aCk7Ci0gIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fcmVhZChtZW09MHglbHgsIGJ1Zj0weCVseCwgbGVuZ3RoPSVkKSA9ICVkXG4iLAotCQkgICAgKGxvbmcpbWVtLCAobG9uZylidWYsIGxlbmd0aCwgcmVzdWx0KSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotaW50Ci1zaW1fd3JpdGUgKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKLXsKLSAgaW50IHJlc3VsdCA9IHBzaW1fd3JpdGVfbWVtb3J5KHNpbXVsYXRvciwgTUFYX05SX1BST0NFU1NPUlMsCi0JCQkJIGJ1ZiwgbWVtLCBsZW5ndGgsCi0JCQkJIDEvKnZpb2xhdGVfcm8qLyk7Ci0gIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fd3JpdGUobWVtPTB4JWx4LCBidWY9MHglbHgsIGxlbmd0aD0lZCkgPSAlZFxuIiwKLQkJICAgIChsb25nKW1lbSwgKGxvbmcpYnVmLCBsZW5ndGgsIHJlc3VsdCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpCi17Ci0gIGNoYXIgKnJlZ25hbWU7Ci0KLSAgaWYgKHNpbXVsYXRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBHREIgd2lsbCBzb21ldGltZXMgYXNrIGZvciB0aGUgY29udGVudHMgb2YgYSByZWdpc3RlciBuYW1lZCAiIjsKLSAgICAgd2UgaWdub3JlIHN1Y2ggcmVxdWVzdHMsIGFuZCBsZWF2ZSBnYXJiYWdlIGluICpCVUYuICBJbgotICAgICBSRUdfTkFNRVMsIHRoZSBlbXB0eSBzdHJpbmcgbWVhbnMgInRoZSByZWdpc3RlciB3aXRoIHRoaXMKLSAgICAgbnVtYmVyIGlzIG5vdCBwcmVzZW50IGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlCi0gICAgIHZhcmlhbnQuIiAgVGhhdCdzIGZvbGxvd2luZyB0aGUga2x1ZGdlIHdlJ3JlIHVzaW5nIGZvciB0aGUgTUlQUwotICAgICBwcm9jZXNzb3JzLiAgQnV0IHRoZXJlIGFyZSBsb29wcyB0aGF0IGp1c3Qgd2FsayB0aHJvdWdoIHRoZQotICAgICBlbnRpcmUgbGlzdCBvZiBuYW1lcyBhbmQgdHJ5IHRvIGdldCBldmVyeXRoaW5nLiAgKi8KLSAgcmVnbmFtZSA9IFJFR0lTVEVSX05BTUUgKHJlZ25vKTsKLSAgaWYgKCEgcmVnbmFtZSB8fCByZWduYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIC0xOwotCi0gIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fZmV0Y2hfcmVnaXN0ZXIocmVnbm89JWQoJXMpLCBidWY9MHglbHgpXG4iLAotCQkgICAgcmVnbm8sIHJlZ25hbWUsIChsb25nKWJ1ZikpOwotICBwc2ltX3JlYWRfcmVnaXN0ZXIoc2ltdWxhdG9yLCBNQVhfTlJfUFJPQ0VTU09SUywKLQkJICAgICBidWYsIHJlZ25hbWUsIHJhd190cmFuc2Zlcik7Ci0gIHJldHVybiAtMTsKLX0KLQotCi1pbnQKLXNpbV9zdG9yZV9yZWdpc3RlciAoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQotewotICBjaGFyICpyZWduYW1lOwotCi0gIGlmIChzaW11bGF0b3IgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZWUgY29tbWVudHMgaW4gc2ltX2ZldGNoX3JlZ2lzdGVyLCBhYm92ZS4gICovCi0gIHJlZ25hbWUgPSBSRUdJU1RFUl9OQU1FIChyZWdubyk7Ci0gIGlmICghIHJlZ25hbWUgfHwgcmVnbmFtZVswXSA9PSAnXDAnKQotICAgIHJldHVybiAtMTsKLQotICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX3N0b3JlX3JlZ2lzdGVyKHJlZ25vPSVkKCVzKSwgYnVmPTB4JWx4KVxuIiwKLQkJICAgIHJlZ25vLCByZWduYW1lLCAobG9uZylidWYpKTsKLSAgcHNpbV93cml0ZV9yZWdpc3RlcihzaW11bGF0b3IsIE1BWF9OUl9QUk9DRVNTT1JTLAotCQkgICAgICBidWYsIHJlZ25hbWUsIHJhd190cmFuc2Zlcik7Ci0gIHJldHVybiAtMTsKLX0KLQotCi12b2lkCi1zaW1faW5mbyAoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKQotewotICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX2luZm8odmVyYm9zZT0lZCkgY2FsbGVkXG4iLCB2ZXJib3NlKSk7Ci0gIHBzaW1fcHJpbnRfaW5mbyAoc2ltdWxhdG9yLCB2ZXJib3NlKTsKLX0KLQotCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKFNJTV9ERVNDIHNkLAotCQkgICAgIHN0cnVjdCBfYmZkICphYmZkLAotCQkgICAgIGNoYXIgKiphcmd2LAotCQkgICAgIGNoYXIgKiplbnZwKQotewotICB1bnNpZ25lZF93b3JkIGVudHJ5X3BvaW50OwotICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX2NyZWF0ZV9pbmZlcmlvcihzdGFydF9hZGRyZXNzPTB4JXgsIC4uLilcbiIsCi0JCSAgICBlbnRyeV9wb2ludCkpOwotCi0gIGlmIChzaW11bGF0b3IgPT0gTlVMTCkKLSAgICBlcnJvciAoIk5vIHByb2dyYW0gbG9hZGVkIik7Ci0KLSAgaWYgKGFiZmQgIT0gTlVMTCkKLSAgICBlbnRyeV9wb2ludCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBlbnRyeV9wb2ludCA9IDB4ZmZmMDAwMDA7IC8qID8/PyAqLwotCi0gIHBzaW1faW5pdChzaW11bGF0b3IpOwotICBwc2ltX3N0YWNrKHNpbXVsYXRvciwgYXJndiwgZW52cCk7Ci0KLSAgcHNpbV93cml0ZV9yZWdpc3RlcihzaW11bGF0b3IsIC0xIC8qIGFsbCBzdGFydCBhdCBzYW1lIFBDICovLAotCQkgICAgICAmZW50cnlfcG9pbnQsICJwYyIsIGNvb2tlZF90cmFuc2Zlcik7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLQotdm9pZAotc2ltX3N0b3BfcmVhc29uIChTSU1fREVTQyBzZCwgZW51bSBzaW1fc3RvcCAqcmVhc29uLCBpbnQgKnNpZ3JjKQotewotICBwc2ltX3N0YXR1cyBzdGF0dXMgPSBwc2ltX2dldF9zdGF0dXMoc2ltdWxhdG9yKTsKLQotICBzd2l0Y2ggKHN0YXR1cy5yZWFzb24pIHsKLSAgY2FzZSB3YXNfY29udGludWluZzoKLSAgICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci0gICAgaWYgKHN0YXR1cy5zaWduYWwgPT0gMCkKLSAgICAgICpzaWdyYyA9IFNJR1RSQVA7Ci0gICAgZWxzZQotICAgICAgKnNpZ3JjID0gc3RhdHVzLnNpZ25hbDsKLSAgICBicmVhazsKLSAgY2FzZSB3YXNfdHJhcDoKLSAgICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci0gICAgKnNpZ3JjID0gU0lHVFJBUDsKLSAgICBicmVhazsKLSAgY2FzZSB3YXNfZXhpdGVkOgotICAgICpyZWFzb24gPSBzaW1fZXhpdGVkOwotICAgICpzaWdyYyA9IHN0YXR1cy5zaWduYWw7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugd2FzX3NpZ25hbGxlZDoKLSAgICAqcmVhc29uID0gc2ltX3NpZ25hbGxlZDsKLSAgICAqc2lncmMgPSBzdGF0dXMuc2lnbmFsOwotICAgIGJyZWFrOwotICB9Ci0KLSAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9zdG9wX3JlYXNvbihyZWFzb249MHglbHgoJWxkKSwgc2lncmM9MHglbHgoJWxkKSlcbiIsCi0JCSAgICAobG9uZylyZWFzb24sIChsb25nKSpyZWFzb24sIChsb25nKXNpZ3JjLCAobG9uZykqc2lncmMpKTsKLX0KLQotCi0KLS8qIFJ1biAob3IgcmVzdW1lKSB0aGUgcHJvZ3JhbS4gICovCi0KLWludAotc2ltX3N0b3AgKFNJTV9ERVNDIHNkKQotewotICBwc2ltX3N0b3AgKHNpbXVsYXRvcik7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zaW1fcmVzdW1lIChTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKQotewotICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX3Jlc3VtZShzdGVwPSVkLCBzaWdnbmFsPSVkKVxuIiwKLQkJICAgIHN0ZXAsIHNpZ2duYWwpKTsKLQotICBpZiAoc3RlcCkKLSAgICB7Ci0gICAgICBwc2ltX3N0ZXAgKHNpbXVsYXRvcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHNpbV9ydW4gKHNpbXVsYXRvcik7Ci0gICAgfQotfQotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoU0lNX0RFU0Mgc2QsIGNoYXIgKmNtZCkKLXsKLSAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9kb19jb21tYW5kcyhjbWQ9JXMpIGNhbGxlZFxuIiwKLQkJICAgIGNtZCA/IGNtZCA6ICIobnVsbCkiKSk7Ci0gIGlmIChjbWQgIT0gTlVMTCkgewotICAgIGNoYXIgKiphcmd2ID0gYnVpbGRhcmd2KGNtZCk7Ci0gICAgcHNpbV9jb21tYW5kKHJvb3RfZGV2aWNlLCBhcmd2KTsKLSAgICBmcmVlYXJndihhcmd2KTsKLSAgfQotfQotCi0KLS8qIFBvbGxpbmcsIGlmIHJlcXVpcmVkICovCi0KLXZvaWQKLXNpbV9pb19wb2xsX3F1aXQgKHZvaWQpCi17Ci0gIGlmIChjYWxsYmFja3MtPnBvbGxfcXVpdCAhPSBOVUxMICYmIHBvbGxfcXVpdF9jb3VudC0tIDwgMCkKLSAgICB7Ci0gICAgICBwb2xsX3F1aXRfY291bnQgPSBQT0xMX1FVSVRfSU5URVJWQUw7Ci0gICAgICBpZiAoY2FsbGJhY2tzLT5wb2xsX3F1aXQgKGNhbGxiYWNrcykpCi0JcHNpbV9zdG9wIChzaW11bGF0b3IpOwotICAgIH0KLX0KLQotCi0KLS8qIE1hcCBzaW11bGF0b3IgSU8gb3BlcmF0aW9ucyBvbnRvIHRoZSBjb3JyZXNwb25kaW5nIEdEQiBJL08KLSAgIGZ1bmN0aW9ucy4KLSAgIAotICAgTkI6IE9ubHkgYSBsaW1pdGVkIHN1YnNldCBvZiBvcGVyYXRpb25zIGFyZSBtYXBwZWQgYWNyb3NzLiAgTW9yZQotICAgYWR2YW5jZWQgb3BlcmF0aW9ucyAoc3VjaCBhcyBkdXAgb3Igd3JpdGUpIG11c3QgZWl0aGVyIGJlIG1hcHBlZCB0bwotICAgb25lIG9mIHRoZSBiZWxvdyBjYWxscyBvciBoYW5kbGVkIGludGVybmFsbHkgKi8KLQotaW50Ci1zaW1faW9fcmVhZF9zdGRpbihjaGFyICpidWYsCi0JCSAgaW50IHNpemVvZl9idWYpCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgewotICBjYXNlIERPX1VTRV9TVERJTzoKLSAgICByZXR1cm4gY2FsbGJhY2tzLT5yZWFkX3N0ZGluKGNhbGxiYWNrcywgYnVmLCBzaXplb2ZfYnVmKTsKLSAgICBicmVhazsKLSAgY2FzZSBET05UX1VTRV9TVERJTzoKLSAgICByZXR1cm4gY2FsbGJhY2tzLT5yZWFkKGNhbGxiYWNrcywgMCwgYnVmLCBzaXplb2ZfYnVmKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW46IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotc2ltX2lvX3dyaXRlX3N0ZG91dChjb25zdCBjaGFyICpidWYsCi0JCSAgICBpbnQgc2l6ZW9mX2J1ZikKLXsKLSAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7Ci0gIGNhc2UgRE9fVVNFX1NURElPOgotICAgIHJldHVybiBjYWxsYmFja3MtPndyaXRlX3N0ZG91dChjYWxsYmFja3MsIGJ1Ziwgc2l6ZW9mX2J1Zik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE9OVF9VU0VfU1RESU86Ci0gICAgcmV0dXJuIGNhbGxiYWNrcy0+d3JpdGUoY2FsbGJhY2tzLCAxLCBidWYsIHNpemVvZl9idWYpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGVycm9yKCJzaW1faW9fd3JpdGVfc3Rkb3V0OiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOwotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLXNpbV9pb193cml0ZV9zdGRlcnIoY29uc3QgY2hhciAqYnVmLAotCQkgICAgaW50IHNpemVvZl9idWYpCi17Ci0gIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgewotICBjYXNlIERPX1VTRV9TVERJTzoKLSAgICAvKiBOQjogSSB0aGluayB0aGVyZSBzaG91bGQgYmUgYW4gZXhwbGljaXQgd3JpdGVfc3RkZXJyIGNhbGxiYWNrICovCi0gICAgcmV0dXJuIGNhbGxiYWNrcy0+d3JpdGUoY2FsbGJhY2tzLCAzLCBidWYsIHNpemVvZl9idWYpOwotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotICAgIHJldHVybiBjYWxsYmFja3MtPndyaXRlKGNhbGxiYWNrcywgMywgYnVmLCBzaXplb2ZfYnVmKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlcnJvcigic2ltX2lvX3dyaXRlX3N0ZGVycjogdW5hY2NvdW50ZWQgc3dpdGNoXG4iKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi12b2lkCi1zaW1faW9fcHJpbnRmX2ZpbHRlcmVkKGNvbnN0IGNoYXIgKmZtdCwKLQkJICAgICAgIC4uLikKLXsKLSAgY2hhciBtZXNzYWdlWzEwMjRdOwotICB2YV9saXN0IGFwOwotICAvKiBmb3JtYXQgdGhlIG1lc3NhZ2UgKi8KLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIHZzcHJpbnRmKG1lc3NhZ2UsIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKHN0cmxlbihtZXNzYWdlKSA+PSBzaXplb2YobWVzc2FnZSkpCi0gICAgZXJyb3IoInNpbV9pb19wcmludGZfZmlsdGVyZWQ6IGJ1ZmZlciBvdmVyZmxvd1xuIik7Ci0gIGNhbGxiYWNrcy0+cHJpbnRmX2ZpbHRlcmVkKGNhbGxiYWNrcywgIiVzIiwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQKLXNpbV9pb19mbHVzaF9zdGRvdXRwdXQodm9pZCkKLXsKLSAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7Ci0gIGNhc2UgRE9fVVNFX1NURElPOgotICAgIGNhbGxiYWNrcy0+Zmx1c2hfc3Rkb3V0IChjYWxsYmFja3MpOwotICAgIGJyZWFrOwotICBjYXNlIERPTlRfVVNFX1NURElPOgotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGVycm9yKCJzaW1faW9fcmVhZF9zdGRpbjogdW5hY2NvdW50ZWQgc3dpdGNoXG4iKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKioqKi8KLQotdm9pZCAqCi16YWxsb2MobG9uZyBzaXplKQotewotICB2b2lkICptZW1vcnkgPSAodm9pZCopeG1hbGxvYyhzaXplKTsKLSAgaWYgKG1lbW9yeSA9PSBOVUxMKQotICAgIGVycm9yKCJ4bWFsbG9jIGZhaWxlZFxuIik7Ci0gIG1lbXNldChtZW1vcnksIDAsIHNpemUpOwotICByZXR1cm4gbWVtb3J5OwotfQotCi12b2lkIHpmcmVlKHZvaWQgKmRhdGEpCi17Ci0gIGZyZWUoZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9zaW0vcHBjL3N0ZC1jb25maWcuaCBiL3NpbS9wcGMvc3RkLWNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYzNTU4Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvc3RkLWNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1BTSU1fQ09ORklHX0hfCi0jZGVmaW5lIF9QU0lNX0NPTkZJR19IXwotCi0KLS8qIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QvdGFyZ2V0OgotCi0gICBJZiB0aGUgYnVpbGQgcHJvY2VzcyBpcyBhd2FyZSAoYXQgY29tcGlsZSB0aW1lKSBvZiB0aGUgZW5kaWFubmVzcwotICAgb2YgdGhlIGhvc3QvdGFyZ2V0IGl0IGlzIGFibGUgdG8gZWxpbWluYXRlIHNsb3dlciBnZW5lcmljIGVuZGlhbgotICAgaGFuZGxpbmcgY29kZS4KLQotICAgUG9zc2libGUgdmFsdWVzIGFyZSAwICh1bmtub3duKSwgTElUVExFX0VORElBTiwgQklHX0VORElBTiAqLwotCi0jaWZuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCi0jZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSCQkwIC8qdW5rbm93biovCi0jZW5kaWYKLQotI2lmbmRlZiBXSVRIX1RBUkdFVF9CWVRFX09SREVSCi0jZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIJCTAgLyp1bmtub3duKi8KLSNlbmRpZgotCi1leHRlcm4gaW50IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyOwotI2RlZmluZSBDVVJSRU5UX0hPU1RfQllURV9PUkRFUiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgXAotCQkJCSA/IFdJVEhfSE9TVF9CWVRFX09SREVSIFwKLQkJCQkgOiBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcikKLWV4dGVybiBpbnQgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcjsKLSNkZWZpbmUgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAoV0lUSF9UQVJHRVRfQllURV9PUkRFUiBcCi0JCQkJICAgPyBXSVRIX1RBUkdFVF9CWVRFX09SREVSIFwKLQkJCQkgICA6IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpCi0KLQotLyogUG93ZXJQQyBYT1IgZW5kaWFuLgotCi0gICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIHRoZSBzaW11bGF0b3IgY2FuIHN1cHBvcnQgdGhlIFBvd2VyUEMncwotICAgaG9ycmlibGUgWE9SIGVuZGlhbiBtb2RlLiAgVGhpcyBmZWF0dXJlIG1ha2VzIGl0IHBvc3NpYmxlIHRvCi0gICBjb250cm9sIHRoZSBlbmRpYW4gbW9kZSBvZiBhIHByb2Nlc3NvciB1c2luZyB0aGUgTVNSLiAqLwotCi0jaWZuZGVmIFdJVEhfWE9SX0VORElBTgotI2RlZmluZSBXSVRIX1hPUl9FTkRJQU4JCTgKLSNlbmRpZgotCi0KLS8qIEludGVsIGhvc3QgQlNXQVAgc3VwcG9ydDoKLQotICAgV2hldGhlciB0byB1c2UgYnN3YXAgb24gdGhlIDQ4NiBhbmQgcGVudGl1bXMgcmF0aGVyIHRoYW4gdGhlIDM4NgotICAgc2VxdWVuY2UgdGhhdCB1c2VzIHhjaGdiL3JvcmwveGNoZ2IgKi8KLSNpZm5kZWYgV0lUSF9CU1dBUAotI2RlZmluZQlXSVRIX0JTV0FQIDAKLSNlbmRpZgotCi0KLS8qIFNNUCBzdXBwb3J0OgotCi0gICBTZXRzIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQgY2FuIGJlIHNpbXVsYXRlZC4gIElmCi0gICBXSVRIX1NNUCBpcyBzZXQgdG8gemVybyAoMCksIHRoZSBzaW11bGF0b3IgaXMgcmVzdHJpY3RlZCB0bwotICAgc3Vwb3J0aW5nIG9ubHkgb24gcHJvY2Vzc29yIChhbmQgYXMgYSBjb25zZXF1ZW5jZSBsZWF2ZXMgdGhlIFNNUAotICAgY29kZSBvdXQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MpLgotCi0gICBUaGUgYWN0dWFsIG51bWJlciBvZiBwcm9jZXNzb3JzIGlzIHRha2VuIGZyb20gdGhlIGRldmljZQotICAgL29wdGlvbnMvc21wQDxuci1jcHU+ICovCi0KLSNpZm5kZWYgV0lUSF9TTVAKLSNkZWZpbmUgV0lUSF9TTVAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZW5kaWYKLSNpZiBXSVRIX1NNUAotI2RlZmluZSBNQVhfTlJfUFJPQ0VTU09SUwkJV0lUSF9TTVAKLSNlbHNlCi0jZGVmaW5lIE1BWF9OUl9QUk9DRVNTT1JTCQkxCi0jZW5kaWYKLQotCi0vKiBXb3JkIHNpemUgb2YgaG9zdC90YXJnZXQ6Ci0KLSAgIFNldCB0aGVzZSBhY2NvcmRpbmcgdG8geW91ciBob3N0IGFuZCB0YXJnZXQgcmVxdWlyZW1lbnRzLiAgQXQgdGhpcwotICAgcG9pbnQgaW4gdGltZSwgSSd2ZSBvbmx5IGNvbXBpbGVkIChub3QgcnVuKSBmb3IgYSA2NGJpdCBhbmQgbmV2ZXIKLSAgIGJ1aWx0IGZvciBhIDY0Yml0IGhvc3QuICBUaGlzIHdpbGwgYWx3YXlzIHJlbWFpbiBhIGNvbXBpbGUgdGltZQotICAgb3B0aW9uICovCi0KLSNpZm5kZWYgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFCi0jZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSAgICAgICAgMzIgLyogY29tcGlsZWQgb25seSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgV0lUSF9IT1NUX1dPUkRfQklUU0laRQotI2RlZmluZSBXSVRIX0hPU1RfV09SRF9CSVRTSVpFCQkzMiAvKiA2NGJpdCByZWFkeT8gKi8KLSNlbmRpZgotCi0KLS8qIFByb2dyYW0gZW52aXJvbm1lbnQ6Ci0KLSAgIFRocmVlIGVudmlyb25tZW50cyBhcmUgYXZhaWxhYmxlIC0gVUVBICh1c2VyKSwgVkVBICh2aXJ0dWFsKSBhbmQKLSAgIE9FQSAocGVyYXRpbmcpLiAgVGhlIGZvcm1lciB0d28gYXJlIGVudmlyb25tZW50IHRoYXQgdXNlcnMgd291bGQKLSAgIGV4cGVjdCB0byBzZWUgKFZFQSBpbmNsdWRlcyB0aGluZ3MgbGlrZSBjb2hlcmVuY3kgYW5kIHRoZSB0aW1lCi0gICBiYXNlKSB3aGlsZSBPRUEgaXMgd2hhdCBhbiBvcGVyYXRpbmcgc3lzdGVtIGV4cGVjdHMgdG8gc2VlLiAgQnkKLSAgIHNldHRpbmcgdGhlc2UgdG8gc3BlY2lmaWMgdmFsdWVzLCB0aGUgYnVpbGQgcHJvY2VzcyBpcyBhYmxlIHRvCi0gICBlbGltaW5hdGUgbm9uIHJlbGV2ZW50IGVudmlyb25tZW50IGNvZGUKLQotICAgQ1VSUkVOVF9FTlZJUk9OTUVOVCBzcGVjaWZpZXMgd2hpY2ggb2YgdmVhIG9yIG9lYSBpcyByZXF1aXJlZCBmb3IKLSAgIHRoZSBjdXJyZW50IHJ1bnRpbWUuICovCi0KLSNkZWZpbmUgVVNFUl9FTlZJUk9OTUVOVAkJMQotI2RlZmluZSBWSVJUVUFMX0VOVklST05NRU5UCQkyCi0jZGVmaW5lIE9QRVJBVElOR19FTlZJUk9OTUVOVAkJMwotCi0jaWZuZGVmIFdJVEhfRU5WSVJPTk1FTlQKLSNkZWZpbmUgV0lUSF9FTlZJUk9OTUVOVAkJMAotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9lbnZpcm9ubWVudDsKLSNkZWZpbmUgQ1VSUkVOVF9FTlZJUk9OTUVOVCAoV0lUSF9FTlZJUk9OTUVOVCBcCi0JCQkgICAgID8gV0lUSF9FTlZJUk9OTUVOVCBcCi0JCQkgICAgIDogY3VycmVudF9lbnZpcm9ubWVudCkKLQotCi0vKiBPcHRpb25hbCBWRUEvT0VBIGNvZGU6IAotCi0gICBUaGUgYmVsb3csIHJlcXVpcmVkIGZvciB0aGUgT0VBIG1vZGVsIG1heSBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZQotICAgVkVBIG1vZGVsIGhvd2V2ZXIsIGFzIGZhciBhcyBJIGNhbiB0ZWxsIG9ubHkgbWFrZSB0aGluZ3MKLSAgIHNsb3dlci4uLiAqLwotCi0KLS8qIEV2ZW50cy4gIERldmljZXMgbW9kZWxpbmcgcmVhbCBIL1cgbmVlZCB0byBiZSBhYmxlIHRvIGVmZmljaWVudGx5Ci0gICBzY2hlZHVsZSB0aGluZ3MgdG8gZG8gYXQga25vd24gdGltZXMgaW4gdGhlIGZ1dHVyZS4gIFRoZSBldmVudAotICAgcXVldWUgaW1wbGVtZW50cyB0aGlzLiAgVW5mb3J0dW5hdGx5IHRoaXMgYWRkcyB0aGUgbmVlZCB0byBjaGVjawotICAgZm9yIGFueSBldmVudHMgb25jZSBlYWNoIGZ1bGwgaW5zdHJ1Y3Rpb24gY3ljbGUuICovCi0KLSNkZWZpbmUgV0lUSF9FVkVOVFMgICAgICAgICAgICAgICAgICAgICAoV0lUSF9FTlZJUk9OTUVOVCAhPSBVU0VSX0VOVklST05NRU5UKQotCi0KLS8qIFRpbWUgYmFzZToKLQotICAgVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGluY2x1ZGVzIHRoZSBhZGRpdGlvbiBvZiBib3RoIGEgdGltZSBiYXNlCi0gICByZWdpc3RlciBhbmQgYSBkZWNyZW1lbnQgdGltZXIuICBMaWtlIGV2ZW50cyBhZGRzIHRvIHRoZSBvdmVyaGVhZAotICAgb2Ygb2Ygc29tZSBpbnN0cnVjdGlvbiBjeWNsZXMuICovCi0KLSNpZm5kZWYgV0lUSF9USU1FX0JBU0UKLSNkZWZpbmUgV0lUSF9USU1FX0JBU0UJCQkoV0lUSF9FTlZJUk9OTUVOVCAhPSBVU0VSX0VOVklST05NRU5UKQotI2VuZGlmCi0KLQotLyogQ2FsbGJhY2svRGVmYXVsdCBNZW1vcnkuCi0KLSAgIENvcmUgaW5jbHVkZXMgYSBidWlsdGluIG1lbW9yeSB0eXBlIChyYXdfbWVtb3J5KSB0aGF0IGlzCi0gICBpbXBsZW1lbnRlZCB1c2luZyBhbiBhcnJheS4gIHJhd19tZW1vcnkgZG9lcyBub3QgcmVxdWlyZSBhbnkKLSAgIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGV0Yy4KLQotICAgQ2FsbGJhY2sgbWVtb3J5IGlzIHdoZXJlIHRoZSBjb3JlIGNhbGxzIGEgY29yZSBkZXZpY2UgZm9yIHRoZSBkYXRhCi0gICBpdCByZXF1aXJlcy4KLQotICAgRGVmYXVsdCBtZW1vcnkgaXMgYW4gZXh0ZW5zdGlvbiBvZiB0aGlzIHdoZXJlIGZvciBhZGRyZXNzZXMgdGhhdCBkbwotICAgbm90IG1hcCBpbnRvIGVpdGhlciBhIGNhbGxiYWNrIG9yIGNvcmUgbWVtb3J5IHJhbmdlIGEgZGVmYXVsdCBtYXAKLSAgIGNhbiBiZSB1c2VkLgotCi0gICBUaGUgT0VBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IGZvciBkZXZpY2VzIGFuZCBkZWZhdWx0IG1lbW9yeQotICAgZm9yIGJ1c2VzLgotCi0gICBUaGUgVkVBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IHRvIGNhcHR1cmUgYHBhZ2UgZmF1bHRzJy4KLQotICAgV2hpbGUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBjYWxsYmFjay9kZWZhdWx0IG1lbW9yeSAoYW5kCi0gICBoZW5jZSBhbHNvIGVsaW1pbmF0ZSBhbiBhZGRpdGlvbmFsIHRlc3QgcGVyIG1lbW9yeSBmZXRjaCkgaXQKLSAgIHByb2JhYmx5IGlzIG5vdCB3b3J0aCB0aGUgZWZmb3J0LgotCi0gICBCVFcsIHdoaWxlIHJhd19tZW1vcnkgY291bGQgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGFzIGEgY2FsbGJhY2ssCi0gICBwcm9maWxpbmcgaGFzIHNob3duIHRoYXQgdGhlcmUgaXMgYSBiaWdlciB3aW4gKGF0IGxlYXN0IGZvciB0aGUKLSAgIHg4NikgaW4gZWxpbWluYXRpbmcgYSBmdW5jdGlvbiBjYWxsIGZvciB0aGUgbW9zdCBjb21tb24KLSAgIChyYXdfbWVtb3J5KSBjYXNlLiAqLwotCi0jZGVmaW5lIFdJVEhfQ0FMTEJBQ0tfTUVNT1JZCQkxCi0KLQotLyogQWxpZ25tZW50OgotCi0gICBUaGUgUG93ZXJQQyBtYXkgb3IgbWF5IG5vdCBoYW5kbGUgbWlzcyBhbGlnbmVkIHRyYW5zZmVycy4gIEFuCi0gICBpbXBsZW1lbnRhdGlvbiBub3JtYWxseSBoYW5kbGVzIG1pc3MgYWxpZ25lZCB0cmFuc2ZlcnMgaW4gYmlnCi0gICBlbmRpYW4gbW9kZSBidXQgZ2VuZXJhdGVzIGFuIGV4Y2VwdGlvbiBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLSAgIFRoaXMgbW9kZWwuICBJbnN0ZWFkIGFsbG93cyBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiBtb2RlcyB0bwotICAgZWl0aGVyIHRha2UgZXhjZXB0aW9ucyBvciBoYW5kbGUgbWlzcyBhbGlnbmVkIHRyYW5zZmVycy4KLQotICAgSWYgMCBpcyBzcGVjaWZpZWQgdGhlbiBmb3IgYmlnLWVuZGlhbiBtb2RlIG1pc3MgYWxsaWduZWQgYWNjZXNzZXMKLSAgIGFyZSBwZXJtaXR0ZWQgKE5PTlNUUklDVF9BTElHTk1FTlQpIHdoaWxlIGluIGxpdHRsZS1lbmRpYW4gbW9kZSB0aGUKLSAgIHByb2Nlc3NvciB3aWxsIGZhdWx0IG9uIHRoZW0gKFNUUklDVF9BTElHTk1FTlQpLiAqLwotCi0jZGVmaW5lIE5PTlNUUklDVF9BTElHTk1FTlQgICAgCQkxCi0jZGVmaW5lIFNUUklDVF9BTElHTk1FTlQJICAgICAgIAkyCi0KLSNpZm5kZWYgV0lUSF9BTElHTk1FTlQKLSNkZWZpbmUgV0lUSF9BTElHTk1FTlQgICAgIAkJMAotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9hbGlnbm1lbnQ7Ci0jZGVmaW5lIENVUlJFTlRfQUxJR05NRU5UIChXSVRIX0FMSUdOTUVOVCBcCi0JCQkgICA/IFdJVEhfQUxJR05NRU5UIFwKLQkJCSAgIDogY3VycmVudF9hbGlnbm1lbnQpCi0KLQotLyogRmxvYXRpbmcgcG9pbnQgc3Vwb3J0OgotCi0gICBTdGlsbCB1bmRlciBkZXZlbG9wbWVudC4gKi8KLQotI2RlZmluZSBTT0ZUX0ZMT0FUSU5HX1BPSU5UCQkxCi0jZGVmaW5lIEhBUkRfRkxPQVRJTkdfUE9JTlQJCTIKLQotI2lmbmRlZiBXSVRIX0ZMT0FUSU5HX1BPSU5UCi0jZGVmaW5lIFdJVEhfRkxPQVRJTkdfUE9JTlQJCUhBUkRfRkxPQVRJTkdfUE9JTlQKLSNlbmRpZgotZXh0ZXJuIGludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OwotI2RlZmluZSBDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UIChXSVRIX0ZMT0FUSU5HX1BPSU5UIFwKLQkJCQk/IFdJVEhfRkxPQVRJTkdfUE9JTlQgXAotCQkJCTogY3VycmVudF9mbG9hdGluZ19wb2ludCkKLQotCi0vKiBEZWJ1Z2dpbmc6Ci0KLSAgIENvbnRyb2wgdGhlIGluY2x1c2lvbiBvZiBkZWJ1Z2dpbmcgY29kZS4gKi8KLQotLyogSW5jbHVkZSB0aGUgdHJhY2luZyBjb2RlLiAgRGlzYWJsaW5nIHRoaXMgZWxpbWluYXRlcyBhbGwgdHJhY2luZwotICAgY29kZSAqLwotCi0jaWZuZGVmIFdJVEhfVFJBQ0UKLSNkZWZpbmUgV0lUSF9UUkFDRSAgICAgICAgICAgICAgICAgICAgICAxCi0jZW5kaWYKLQotLyogaW5jbHVkZSBjb2RlIHRoYXQgY2hlY2tzIGFzc2VydGlvbnMgc2NhdHRlcmVkIHRocm91Z2ggb3V0IHRoZQotICAgcHJvZ3JhbSAqLwotCi0jaWZuZGVmIFdJVEhfQVNTRVJUCi0jZGVmaW5lIFdJVEhfQVNTRVJUCQkJMQotI2VuZGlmCi0KLS8qIFdoZXRoZXIgdG8gY2hlY2sgaW5zdHJ1Y3Rpb25zIGZvciByZXNlcnZlZCBiaXRzIGJlaW5nIHNldCAqLwotCi0jaWZuZGVmIFdJVEhfUkVTRVJWRURfQklUUwotI2RlZmluZSBXSVRIX1JFU0VSVkVEX0JJVFMJCTEKLSNlbmRpZgotCi0vKiBpbmNsdWRlIG1vbml0b3JpbmcgY29kZSAqLwotCi0jZGVmaW5lIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUJMQotI2RlZmluZSBNT05JVE9SX0xPQURfU1RPUkVfVU5JVAkJMgotI2lmbmRlZiBXSVRIX01PTgotI2RlZmluZSBXSVRIX01PTgkJCShNT05JVE9SX0xPQURfU1RPUkVfVU5JVCBcCi0JCQkJCSB8IE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpCi0jZW5kaWYKLQotLyogQ3VycmVudCBDUFUgbW9kZWwgKG1vZGVscyBhcmUgaW4gdGhlIGdlbmVyYXRlZCBtb2RlbHMuaCBpbmNsdWRlIGZpbGUpICAqLwotI2lmbmRlZiBXSVRIX01PREVMCi0jZGVmaW5lIFdJVEhfTU9ERUwJCQkwCi0jZW5kaWYKLQotI2RlZmluZSBDVVJSRU5UX01PREVMIChXSVRIX01PREVMCVwKLQkJICAgICAgID8gV0lUSF9NT0RFTAlcCi0JCSAgICAgICA6IGN1cnJlbnRfbW9kZWwpCi0KLSNpZm5kZWYgV0lUSF9ERUZBVUxUX01PREVMCi0jZGVmaW5lIFdJVEhfREVGQVVMVF9NT0RFTAkJREVGQVVMVF9NT0RFTAotI2VuZGlmCi0KLSNkZWZpbmUgTU9ERUxfSVNTVUVfSUdOT1JFCQkoLTEpCi0jZGVmaW5lIE1PREVMX0lTU1VFX1BST0NFU1MJCTEKLQotI2lmbmRlZiBXSVRIX01PREVMX0lTU1VFCi0jZGVmaW5lIFdJVEhfTU9ERUxfSVNTVUUJCTAKLSNlbmRpZgotCi1leHRlcm4gaW50IGN1cnJlbnRfbW9kZWxfaXNzdWU7Ci0jZGVmaW5lIENVUlJFTlRfTU9ERUxfSVNTVUUgKFdJVEhfTU9ERUxfSVNTVUUJXAotCQkJICAgICA/IFdJVEhfTU9ERUxfSVNTVUUJXAotCQkJICAgICA6IGN1cnJlbnRfbW9kZWxfaXNzdWUpCi0KLS8qIFdoZXRoZXIgb3Igbm90IGlucHV0L291dHB1dCBqdXN0IHVzZXMgc3RkaW8sIG9yIHVzZXMgcHJpbnRmX2ZpbHRlcmVkIGZvcgotICAgb3V0cHV0LCBhbmQgcG9sbGluZyBpbnB1dCBmb3IgaW5wdXQuICAqLwotCi0jZGVmaW5lIERPTlRfVVNFX1NURElPCQkJMgotI2RlZmluZSBET19VU0VfU1RESU8JCQkxCi0KLSNpZm5kZWYgV0lUSF9TVERJTwotI2RlZmluZSBXSVRIX1NURElPCQkJMAotI2VuZGlmCi0KLWV4dGVybiBpbnQgY3VycmVudF9zdGRpbzsKLSNkZWZpbmUgQ1VSUkVOVF9TVERJTyAoV0lUSF9TVERJTwlcCi0JCSAgICAgICA/IFdJVEhfU1RESU8gICAgIFwKLQkJICAgICAgIDogY3VycmVudF9zdGRpbykKLQotCi0KLS8qIElOTElORSBDT0RFIFNFTEVDVElPTjoKLQotICAgR0NDIC1PMyBhdHRlbXB0cyB0byBpbmxpbmUgYW55IGZ1bmN0aW9uIG9yIHByb2NlZHVyZSBpbiBzY29wZS4gIFRoZQotICAgb3B0aW9ucyBiZWxvdyBmYWNpbGl0YXRlIGZpbmUgZ3JhaW5lZCBjb250cm9sIG92ZXIgd2hhdCBpcyBhbmQgd2hhdAotICAgaXNuJ3QgbWFkZSBpbmxpbmUuICBGb3IgaW5zdGFuY2UgaXQgY2FuIGNvbnRyb2wgdGhpbmdzIGRvd24gdG8gYQotICAgc3BlY2lmaWMgbW9kdWxlcyBzdGF0aWMgcm91dGluZXMuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgY29tcGlsZXIKLSAgIHRvIGJvdGggZWxpbWluYXRlIHRoZSBvdmVyaGVhZCBvZiBmdW5jdGlvbiBjYWxscyBhbmQgKGFzIGEKLSAgIGNvbnNlcXVlbmNlKSBhbHNvIGVsaW1pbmF0ZSBmdXJ0aGVyIGRlYWQgY29kZS4KLQotICAgT24gYSBDSVNDICh4ODYpIEkndmUgZm91bmQgdGhhdCBJIGNhbiBhY2hpZXZlIGFuIG9yZGVyIG9mIG1hZ2ludHVkZQotICAgc3BlZWQgaW1wcm92ZW1lbnQgKHgzLXg1KS4gIEluIHRoZSBjYXNlIG9mIFJJU0MgKHNwYXJjKSB3aGlsZSB0aGUKLSAgIHBlcmZvcm1hbmNlIGdhaW4gaXNuJ3QgYXMgZ3JlYXQgaXQgaXMgc3RpbGwgc2lnbmlmaWNhbnQuCi0KLSAgIEVhY2ggbW9kdWxlIGlzIGNvbnRyb2xlZCBieSB0aGUgbWFjcm8gPG1vZHVsZT5fSU5MSU5FIHdoaWNoIGNhbgotICAgaGF2ZSB0aGUgdmFsdWVzIGRlc2NyaWJlZCBiZWxvdwotCi0gICAgICAgMCAgRG8gbm90IGlubGluZSBhbnkgdGhpbmcgZm9yIHRoZSBnaXZlbiBtb2R1bGUKLQotICAgVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYGJpdCBmaWVsZHMnIGFuZCBjYW4gYmUKLSAgIGNvbWJpbmVkLgotCi0gICAgICBSRVZFQUxfTU9EVUxFOgotCi0gICAgICAgICBJbmNsdWRlIHRoZSBDIGZpbGUgZm9yIHRoZSBtb2R1bGUgaW50byB0aGUgZmlsZSBiZWluZyBjb21waWxlZAotICAgICAgICAgYnV0IGRvIG5vdCBtYWtlIHRoZSBmdW5jdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgaW5saW5lLgotCi0JIFdoaWxlIG9mIG5vIGFwcGFyZW50IGJlbmVmaXQsIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZQotCSBpbmNsdWRlZCBtb2R1bGUsIHdoZW4gY29tcGlsZWQgdG8gaW5saW5lIGl0cyBjYWxscyB0byB3aGF0Ci0JIHdvdWxkIG90aGVyd2l6ZSBiZSBleHRlcm5hbCBmdW5jdGlvbnMuCi0KLSAgICAgIElOTElORV9NT0RVTEU6Ci0KLSAgICAgICAgIE1ha2UgZXh0ZXJuYWwgZnVuY3Rpb25zIHdpdGhpbiB0aGUgbW9kdWxlIGBpbmxpbmUnLiAgVGh1cyBpZgotICAgICAgICAgdGhlIG1vZHVsZSBpcyBpbmNsdWRlZCBpbnRvIGEgZmlsZSBiZWluZyBjb21waWxlZCwgY2FsbHMgdG8KLQkgaXRzIGZ1bnRpb25zIGNhbiBiZSBlbGltaW5hdGVkLiAyIGltcGxpZXMgMS4KLQotICAgICAgSU5MSU5FX0xPQ0FMUzoKLQotICAgICAgICAgTWFrZSBpbnRlcm5hbCAoc3RhdGljKSBmdW5jdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgYGlubGluZScuCi0KLSAgIFRoZSBmb2xsb3dpbmcgYWJyZXZpYXRpb25zIGFyZSBhdmFpbGFibGU6Ci0KLSAgICAgIElOQ0xVREVfTU9EVUxFID09IChSRVZFQUxfTU9EVUxFIHwgSU5MSU5FX01PRFVMRSkKLQotICAgICAgQUxMX0lOTElORSA9PSAoUkVWRUFMX01PRFVMRSB8IElOTElORV9NT0RVTEUgfCBJTkxJTkVfTE9DQUxTKQotCi0gICBJbiBhZGRpdGlvbiB0byB0aGlzLCBtb2R1bGVzIGhhdmUgYmVlbiBwdXQgaW50byB0d28gY2F0ZWdvcmllcy4KLQotICAgICAgICAgU2ltcGxlIG1vZHVsZXMgLSBlZyBzaW0tZW5kaWFuLmggYml0cy5oCi0KLQkgQmVjYXVzZSB0aGVzZSBtb2R1bGVzIGFyZSBzbWFsbCBhbmQgc2ltcGxlIGFuZCBkbyBub3QgaGF2ZQotCSBhbnkgY29tcGxleCBpbnRlcnBlbmRlbmNpZXMgdGhleSBhcmUgY29uZmlndXJlZCwgaWYKLQkgPG1vZHVsZT5fSU5MSU5FIGlzIHNvIGVuYWJsZWQsIHRvIGlubGluZSB0aGVtc2VsdmVzIGluIGFsbAotCSBtb2R1bGVzIHRoYXQgaW5jbHVkZSB0aG9zZSBmaWxlcy4KLQotCSBGb3IgdGhlIGRlZmF1bHQgYnVpbGQsIHRoaXMgaXMgYSByZWFsIHdpbiBhcyBhbGwgYnl0ZQotCSBjb252ZXJzaW9uIGFuZCBiaXQgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBhcmUgaW5saW5lZC4KLQotCSBDb21wbGV4IG1vZHVsZXMgLSB0aGUgcmVzdAotCi0JIFRoZXNlIGFyZSBhbGwgaGFuZGxlZCB1c2luZyB0aGUgZmlsZXMgaW5saW5lLmggYW5kIGlubGluZS5jLgotCSBwc2ltLmMgaW5jbHVkZXMgdGhlIGFib3ZlIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBhbnkgcmVtYWluaW5nCi0JIGNvZGUuCi0KLSAgIElNUExFTUVOVEFUSU9OOgotCi0gICBUaGUgaW5saW5lIGFiaWxpdHkgaXMgZW5hYmxlZCBieSBwcmVmaXhpbmcgZXZlcnkgZGF0YSAvIGZ1bmN0aW9uCi0gICBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0KLSAgICAgICBJTkxJTkVfPG1vZHVsZT4KLQotICAgICAgIFByZWZpeCB0byBhbnkgZ2xvYmFsIGZ1bmN0aW9uIHRoYXQgaXMgYSBjYW5kaWRhdGUgZm9yIGJlaW5nCi0gICAgICAgaW5saW5lLgotCi0gICAgICAgdmFsdWVzIC0gYCcsIGBzdGF0aWMnLCBgc3RhdGljIElOTElORScKLQotCi0gICAgICAgRVhURVJOXzxtb2R1bGU+Ci0gICAgICAKLSAgICAgICBQcmVmaXggdG8gYW55IGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBtb2R1bGUuICBHbG9iYWwKLSAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IHRvIGJlIGlubGluZWQgc2hhbGwgYWxzbyBiZSBwcmVmaXhlZAotICAgICAgIHdpdGggdGhpcy4KLQotICAgICAgIHZhbHVlcyAtIGAnLCBgc3RhdGljJywgYHN0YXRpYycKLQotCi0gICAgICAgU1RBVElDX0lOTElORV88bW9kdWxlPgotCi0gICAgICAgUHJlZml4IHRvIGFueSBsb2NhbCAoc3RhdGljKSBmdW5jdGlvbiB0aGF0IGlzIGEgY2FuZGlkYXRlIGZvcgotICAgICAgIGJlaW5nIG1hZGUgaW5saW5lLgotCi0gICAgICAgdmFsdWVzIC0gYHN0YXRpYycsIGBzdGF0aWMgSU5MSU5FJwotCi0KLSAgICAgICBzdGF0aWMKLQotICAgICAgIFByZWZpeCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzLiAgTG9jYWwgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdAotICAgICAgIHRvIGJlIGlubGluZWQgc2hhbGwgYWxzbyBiZSBwcmVmaXhlZCB3aXRoIHRoaXMuCi0KLSAgICAgICB2YWx1ZXMgLSBgc3RhdGljJywgYHN0YXRpYycKLQotICAgICAgIG5iOiB3aWxsIG5vdCB3b3JrIGZvciBtb2R1bGVzIHRoYXQgYXJlIGJlaW5nIGlubGluZWQgZm9yIGV2ZXJ5Ci0gICAgICAgdXNlICh3aGl0ZSBsaWUpLgotCi0KLSAgICAgICBleHRlcm4KLSAgICAgICAjaWZuZGVmIF9JTkxJTkVfQ18KLSAgICAgICAjZW5kaWYKLSAgICAgICAKLSAgICAgICBQcmVmaXggdG8gYW55IGRlY2xhcmF0aW9uIG9mIGEgZ2xvYmFsIG9iamVjdCAoZnVuY3Rpb24gb3IKLSAgICAgICB2YXJpYWJsZSkgdGhhdCBzaG91bGQgbm90IGJlIGlubGluZWQgYW5kIHNob3VsZCBoYXZlIG9ubHkgb25lCi0gICAgICAgZGVmaW5pdGlvbi4gIFRoZSAjaWZuZGVmIHdyYXBwZXIgZ29lcyBhcm91bmQgdGhlIGRlZmluaXRpb24KLSAgICAgICBwcm9wcGVyIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNvcHkgaXMgZ2VuZXJhdGVkLgotCi0gICAgICAgbmI6IHRoaXMgd2lsbCBub3Qgd29yayB3aGVuIGEgbW9kdWxlIGlzIGJlaW5nIGlubGluZWQgZm9yIGV2ZXJ5Ci0gICAgICAgdXNlLgotCi0KLSAgICAgICBTVEFUSUNfPG1vZHVsZT4KLQotICAgICAgIFJlcGxhY2VkIGJ5IGVpdGhlciBgc3RhdGljJyBvciBgRVhURVJOX01PRFVMRScuCi0KLQotICAgUkVBTElUWSBDSEVDSzoKLQotICAgVGhpcyBpcyBub3QgZm9yIHRoZSBmYWludCBoZWFydGVkLiAgSSd2ZSBzZWVuIEdDQyBnZXQgdXAgdG8gNTAwbWIKLSAgIHRyeWluZyB0byBjb21waWxlIHdoYXQgdGhpcyBjYW4gY3JlYXRlLgotCi0gICBTb21lIG9mIHRoZSBtb2R1bGVzIGRvIG5vdCB5ZXQgaW1wbGVtZW50IHRoZSBXSVRIX0lOTElORV9TVEFUSUMKLSAgIG9wdGlvbi4gIEluc3RlYWQgdGhleSB1c2UgdGhlIG1hY3JvIFNUQVRJQ19JTkxJTkUgdG8gY29udHJvbCB0aGVpcgotICAgbG9jYWwgZnVuY3Rpb24uCi0KLSAgIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGF0IEdDQyBwYXJzZXMgX19hdHRyaWJ1dGVfXygpLCB0aGUgbWFjcm8ncwotICAgbmVlZCB0byBiZSBhZGphY2VudCB0byB0aGUgZnVuY3Rpb2luIG5hbWUgcmF0aGVyIHRoZW4gYXQgdGhlIHN0YXJ0Ci0gICBvZiB0aGUgbGluZSB2aXM6Ci0KLSAgIAlpbnQgU1RBVElDX0lOTElORV9NT0RVTEUgZih2b2lkKTsKLQl2b2lkIElOTElORV9NT0RVTEUgKmcodm9pZCk7Ci0KLSAgICovCi0KLSNkZWZpbmUgUkVWRUFMX01PRFVMRQkJCTEKLSNkZWZpbmUgSU5MSU5FX01PRFVMRQkJCTIKLSNkZWZpbmUgSU5DTFVERV9NT0RVTEUJCQkoSU5MSU5FX01PRFVMRSB8IFJFVkVBTF9NT0RVTEUpCi0jZGVmaW5lIElOTElORV9MT0NBTFMJCQk0Ci0jZGVmaW5lIEFMTF9JTkxJTkUJCQk3Ci0KLS8qIFlvdXIgY29tcGlsZXJzIGlubGluZSByZXNlcnZlZCB3b3JkICovCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUgLyppbmxpbmUqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBZb3VyIGNvbXBpbGVycyBwYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIHJlc2VydmVkIHdvcmQgKi8KLQotI2lmbmRlZiBXSVRIX1JFR1BBUk0KLSNkZWZpbmUgV0lUSF9SRUdQQVJNICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKiBZb3VyIGNvbXBpbGVycyB1c2UgYW4gYWx0ZXJuYXRpdmUgY2FsbGluZyBzZXF1ZW5jZSByZXNlcnZlZCB3b3JkICovCi0KLSNpZm5kZWYgV0lUSF9TVERDQUxMCi0jZGVmaW5lIFdJVEhfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIFJFR1BBUk0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpCi0jaWYgKFdJVEhfUkVHUEFSTSAmJiBXSVRIX1NURENBTEwpCi0jZGVmaW5lIFJFR1BBUk0gX19hdHRyaWJ1dGVfXygoX19yZWdwYXJtX18oV0lUSF9SRUdQQVJNKSxfX3N0ZGNhbGxfXykpCi0jZWxzZQotI2lmIChXSVRIX1JFR1BBUk0gJiYgIVdJVEhfU1REQ0FMTCkKLSNkZWZpbmUgUkVHUEFSTSBfX2F0dHJpYnV0ZV9fKChfX3JlZ3Bhcm1fXyhXSVRIX1JFR1BBUk0pKSkKLSNlbHNlCi0jaWYgKCFXSVRIX1JFR1BBUk0gJiYgV0lUSF9TVERDQUxMKQotI2RlZmluZSBSRUdQQVJNIF9fYXR0cmlidXRlX18oKF9fc3RkY2FsbF9fKSkKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCBSRUdQQVJNCi0jZGVmaW5lIFJFR1BBUk0KLSNlbmRpZgotCi0KLQotLyogRGVmYXVsdCBwcmVmaXggZm9yIHN0YXRpYyBmdW5jdGlvbnMgKi8KLQotI2lmbmRlZiBTVEFUSUNfSU5MSU5FCi0jZGVmaW5lIFNUQVRJQ19JTkxJTkUgc3RhdGljIElOTElORQotI2VuZGlmCi0KLS8qIERlZmF1bHQgbWFjcm8gdG8gc2ltcGxpZnkgY29udHJvbCBzZXZlcmFsIG9mIGtleSB0aGUgaW5saW5lcyAqLwotCi0jaWZuZGVmIERFRkFVTFRfSU5MSU5FCi0jZGVmaW5lCURFRkFVTFRfSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUwotI2VuZGlmCi0KLS8qIENvZGUgdGhhdCBjb252ZXJ0cyBiZXR3ZWVuIGhvc3RzIGFuZCB0YXJnZXQgYnl0ZSBvcmRlci4gIFVzZWQgb24KLSAgIGV2ZXJ5IG1lbW9yeSBhY2Nlc3MgKGluc3RydWN0aW9uIGFuZCBkYXRhKS4gIFNlZSBzaW0tZW5kaWFuLmggZm9yCi0gICBhZGRpdGlvbmFsIGJ5dGUgc3dhcHBpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgbW9kdWxlCi0gICBjYW4gaW5saW5lIGZvciBhbGwgY2FsbGVycyAqLwotCi0jaWZuZGVmIFNJTV9FTkRJQU5fSU5MSU5FCi0jZGVmaW5lIFNJTV9FTkRJQU5fSU5MSU5FCQkoREVGQVVMVF9JTkxJTkUgPyBBTExfSU5MSU5FIDogMCkKLSNlbmRpZgotCi0vKiBMb3cgbGV2ZWwgYml0IG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gVGhpcyBtb2R1bGUgY2FuIGlubGluZSBmb3IgYWxsCi0gICBjYWxsZXJzICovCi0KLSNpZm5kZWYgQklUU19JTkxJTkUKLSNkZWZpbmUgQklUU19JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBBTExfSU5MSU5FIDogMCkKLSNlbmRpZgotCi0vKiBDb2RlIHRoYXQgZ2l2ZXMgYWNjZXNzIHRvIHZhcmlvdXMgQ1BVIGludGVybmFscyBzdWNoIGFzIHJlZ2lzdGVycy4KLSAgIFVzZWQgZXZlcnkgdGltZSBhbiBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZCAqLwotCi0jaWZuZGVmIENQVV9JTkxJTkUKLSNkZWZpbmUgQ1BVX0lOTElORQkJCShERUZBVUxUX0lOTElORSA/IEFMTF9JTkxJTkUgOiAwKQotI2VuZGlmCi0KLS8qIENvZGUgdGhhdCB0cmFuc2xhdGVzIGJldHdlZW4gYW4gZWZmZWN0aXZlIGFuZCByZWFsIGFkZHJlc3MuICBVc2VkCi0gICBieSBldmVyeSBsb2FkIG9yIHN0b3JlLiAqLwotCi0jaWZuZGVmIFZNX0lOTElORQotI2RlZmluZSBWTV9JTkxJTkUJCQlERUZBVUxUX0lOTElORQotI2VuZGlmCi0KLS8qIENvZGUgdGhhdCBsb2Fkcy9zdG9yZXMgZGF0YSB0by9mcm9tIHRoZSBtZW1vcnkgZGF0YSBzdHJ1Y3R1cmUuCi0gICBVc2VkIGJ5IGV2ZXJ5IGxvYWQgb3Igc3RvcmUgKi8KLQotI2lmbmRlZiBDT1JFX0lOTElORQotI2RlZmluZSBDT1JFX0lOTElORQkJCURFRkFVTFRfSU5MSU5FCi0jZW5kaWYKLQotLyogQ29kZSB0byBjaGVjayBmb3IgYW5kIHByb2Nlc3MgYW55IGV2ZW50cyBzY2hlZHVsZWQgaW4gdGhlIGZ1dHVyZS4KLSAgIENhbGxlZCBvbmNlIHBlciBpbnN0cnVjdGlvbiBjeWNsZSAqLwotCi0jaWZuZGVmIEVWRU5UU19JTkxJTkUKLSNkZWZpbmUgRVZFTlRTX0lOTElORQkJCShERUZBVUxUX0lOTElORSA/IEFMTF9JTkxJTkUgOiAwKQotI2VuZGlmCi0KLS8qIENvZGUgbW9ub3RvcmluZyB0aGUgcHJvY2Vzc29ycyBwZXJmb3JtYW5jZS4gIEl0IGNvdW50cyBldmVudHMgb24KLSAgIGV2ZXJ5IGluc3RydWN0aW9uIGN5Y2xlICovCi0KLSNpZm5kZWYgTU9OX0lOTElORQotI2RlZmluZSBNT05fSU5MSU5FCQkJKERFRkFVTFRfSU5MSU5FID8gQUxMX0lOTElORSA6IDApCi0jZW5kaWYKLQotLyogQ29kZSBjYWxsZWQgb24gdGhlIHJhcmUgb2NjYXNpb25zIHRoYXQgYW4gaW50ZXJydXB0IG9jY3VyZXMuICovCi0KLSNpZm5kZWYgSU5URVJSVVBUU19JTkxJTkUKLSNkZWZpbmUgSU5URVJSVVBUU19JTkxJTkUJCURFRkFVTFRfSU5MSU5FCi0jZW5kaWYKLQotLyogQ29kZSBjYWxsZWQgb24gdGhlIHJhcmUgb2NjYXNpb24gdGhhdCBlaXRoZXIgZ2RiIG9yIHRoZSBkZXZpY2UgdHJlZQotICAgbmVlZCB0byBtYW5pcHVsYXRlIGEgcmVnaXN0ZXIgd2l0aGluIGEgcHJvY2Vzc29yICovCi0KLSNpZm5kZWYgUkVHSVNURVJTX0lOTElORQotI2RlZmluZSBSRUdJU1RFUlNfSU5MSU5FCQlERUZBVUxUX0lOTElORQotI2VuZGlmCi0KLS8qIENvZGUgY2FsbGVkIG9uIHRoZSByYXJlIG9jY2FzaW9uIHRoYXQgYSBwcm9jZXNzb3IgaXMgbWFuaXB1bGF0aW5nCi0gICByZWFsIGhhcmR3YXJlIGluc3RlYWQgb2YgUkFNLgotCi0gICBBbHNvLCBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW4gZGV2aWNlcy5jIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2gKLSAgIGEganVtcCB0YWJsZS4gKi8KLQotI2lmbmRlZiBERVZJQ0VfSU5MSU5FCi0jZGVmaW5lIERFVklDRV9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBJTkxJTkVfTE9DQUxTIDogMCkKLSNlbmRpZgotCi0vKiBDb2RlIGNhbGxlZCB1c2VkIHdoaWxlIHRoZSBkZXZpY2UgdHJlZSBpcyBiZWluZyBidWlsdC4KLQotICAgSW5saW5pbmcgdGhpcyBpcyBvZiBubyBiZW5lZml0ICovCi0KLSNpZm5kZWYgVFJFRV9JTkxJTkUKLSNkZWZpbmUgVFJFRV9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBJTkxJTkVfTE9DQUxTIDogMCkKLSNlbmRpZgotCi0vKiBDb2RlIGNhbGxlZCB3aGVuZXZlciBpbmZvcm1hdGlvbiBvbiBhIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBpcwotICAgcmVxdWlyZWQuICBDYWxsZWQgYnkgdGhlIG1mbHIvbXRsciBwc2V1ZG8gaW5zdHJ1Y3Rpb25zICovCi0KLSNpZm5kZWYgU1BSRUdfSU5MSU5FCi0jZGVmaW5lIFNQUkVHX0lOTElORQkJCURFRkFVTFRfSU5MSU5FCi0jZW5kaWYKLQotLyogRnVuY3Rpb25zIG1vZGVsaW5nIHRoZSBzZW1hbnRpY3Mgb2YgZWFjaCBpbnN0cnVjdGlvbi4gIFR3byBjYXNlcyB0bwotICAgY29uc2lkZXIsIGZpcnN0bHkgb2YgaWRlY29kZSBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgc3dpdGNoIHRoZW4gdGhpcwotICAgYWxsb3dzIHRoZSBpZGVjb2RlIGZ1bmN0aW9uIHRvIGlubGluZSBlYWNoIHNlbWFudGljIGZ1bmN0aW9uCi0gICAoYXZvaWRpbmcgYSBjYWxsKS4gIFRoZSBzZWNvbmQgY2FzZSBpcyB3aGVuIGlkZWNvZGUgaXMgdXNpbmcgYQotICAgdGFibGUsIGV2ZW4gdGhlbiB3aGlsZSB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIGNhbid0IGJlIGlubGluZWQsCi0gICBzZXR0aW5nIGl0IHRvIG9uZSBzdGlsbCBlbmFibGVzIGVhY2ggc2VtYW50aWMgZnVuY3Rpb24gdG8gaW5saW5lCi0gICBhbnl0aGluZyB0aGV5IGNhbGwgKGlmIHRoYXQgY29kZSBpcyBtYXJrZWQgZm9yIGJlaW5nIGlubGluZWQpLgotCi0gICBXQVJOSU5HOiB5b3UgbmVlZCBsb3RzIChsaWtlIDIwMG1iIG9mIHN3YXApIG9mIHN3YXAuICBTZXR0aW5nIHRoaXMKLSAgIHRvIDEgaXMgdXNlZnVsIHdoZW4gdXNpbmcgYSB0YWJsZSBhcyBpdCBlbmFibGVzIHRoZSBzZW1hdGljIGNvZGUgdG8KLSAgIGlubGluZSBhbGwgb2YgdGhlaXIgY2FsbGVkIGZ1bmN0aW9ucyAqLwotCi0jaWZuZGVmIFNFTUFOVElDU19JTkxJTkUKLSNkZWZpbmUgU0VNQU5USUNTX0lOTElORQkJKERFRkFVTFRfSU5MSU5FICYgfklOTElORV9NT0RVTEUpCi0jZW5kaWYKLQotLyogV2hlbiB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUsIGNvZGUgdG8gZGVjb2RlIGFuIGluc3RydWN0aW9uIGFuZAotICAgaW5zdGFsbCBpdCBpbnRvIHRoZSBjYWNoZS4gIE5vcm1hbGx5IGNhbGxlZCB3aGVuIGV2ZXIgdGhlcmUgaXMgYQotICAgbWlzcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuICovCi0KLSNpZm5kZWYgSUNBQ0hFX0lOTElORQotI2RlZmluZSBJQ0FDSEVfSU5MSU5FCQkJKERFRkFVTFRfSU5MSU5FICYgfklOTElORV9NT0RVTEUpCi0jZW5kaWYKLQotLyogR2VuZXJhbCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHNlbWFudGljcyBmdW5jdGlvbnMgYnV0IHBhcnQgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB0YWJsZS4gIEFsdGhvdWdoIGNhbGxlZCBieSB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIHRoZQotICAgZnJlcXVlbmN5IG9mIGNhbGxzIGlzIGxvdy4gIENvbnNlcXVlbnRseSB0aGUgbmVlZCB0byBpbmxpbmUgdGhpcwotICAgY29kZSBpcyByZWR1Y2VkLiAqLwotCi0jaWZuZGVmIFNVUFBPUlRfSU5MSU5FCi0jZGVmaW5lIFNVUFBPUlRfSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUwotI2VuZGlmCi0KLS8qIE1vZGVsIHNwZWNpZmljIGNvZGUgdXNlZCBpbiBzaW11bGF0aW5nIGZ1bmN0aW9uYWwgdW5pdHMuICBOb3RlLCBpdCBhY3RhdWxseQotICAgcGF5cyBOT1QgdG8gaW5saW5lIHRoZSBQb3dlclBDIG1vZGVsIGZ1bmN0aW9ucyAoYXQgbGVhc3Qgb24gdGhlIHg4NikuICBUaGlzCi0gICBpcyBiZWNhdXNlIGlmIGl0IGlzIGlubGluZWQsIGVhY2ggUG93ZXJQQyBpbnN0cnVjdGlvbiBnZXRzIGEgc2VwYXJhdGUgY29weQotICAgb2YgdGhlIGNvZGUsIHdoaWNoIGlzIG5vdCBmcmllbmRseSB0byB0aGUgY2FjaGUuICAqLwotCi0jaWZuZGVmIE1PREVMX0lOTElORQotI2RlZmluZQlNT0RFTF9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgJiB+SU5MSU5FX01PRFVMRSkKLSNlbmRpZgotCi0vKiBDb2RlIHRvIHByaW50IG91dCB3aGF0IG9wdGlvbnMgd2Ugd2VyZSBjb21waWxlZCB3aXRoLiAgQmVjYXVzZSB0aGlzCi0gICBpcyBjYWxsZWQgYXQgcHJvY2VzcyBzdGFydHVwLCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgaW5saW5lZCwgYnV0Ci0gICBpZiBpdCBpc24ndCBicm91Z2h0IGluIGFuZCB0aGUgbW9kZWwgcm91dGluZXMgYXJlIGlubGluZSwgdGhlIG1vZGVsCi0gICByb3V0aW5lcyB3aWxsIGJlIHB1bGxlZCBpbiB0d2ljZS4gICovCi0KLSNpZm5kZWYgT1BUSU9OU19JTkxJTkUKLSNkZWZpbmUgT1BUSU9OU19JTkxJTkUJCQlNT0RFTF9JTkxJTkUKLSNlbmRpZgotCi0vKiBpZGVjb2RlIGFjdHMgYXMgdGhlIGh1YiBvZiB0aGUgc3lzdGVtLCBldmVyeXRoaW5nIGVsc2UgaXMgaW1wb3J0ZWQKLSAgIGludG8gdGhpcyBmaWxlICovCi0KLSNpZm5kZWYgSURFQ09DRV9JTkxJTkUKLSNkZWZpbmUgSURFQ09ERV9JTkxJTkUJCQlJTkxJTkVfTE9DQUxTCi0jZW5kaWYKLQotLyogcHNpbSwgaXNuJ3QgYWN0dWFsbHkgaW5saW5lZCAqLwotCi0jaWZuZGVmIFBTSU1fSU5MSU5FCi0jZGVmaW5lIFBTSU1fSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUwotI2VuZGlmCi0KLS8qIENvZGUgdG8gZW11bGF0ZSBvcyBvciByb20gY29tcGF0aWJpbGl0eS4gIFRoaXMgY29kZSBpcyBjYWxsZWQgdmlhIGEKLSAgIHRhYmxlIGFuZCBoZW5jZSB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBtYWtpbmcgaXQgaW5saW5lICovCi0KLSNpZm5kZWYgT1NfRU1VTF9JTkxJTkUKLSNkZWZpbmUgT1NfRU1VTF9JTkxJTkUJCQkwCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9QU0lNX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3RhYmxlLmMgYi9zaW0vcHBjL3RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTRkMGQuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImxmLmgiCi0jaW5jbHVkZSAidGFibGUuaCIKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLXN0cnVjdCBfdGFibGUgewotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqYnVmZmVyOwotICBjaGFyICpwb3M7Ci0gIGludCBsaW5lX25yOwotICBpbnQgbnJfZmllbGRzOwotICBpbnQgbnJfbW9kZWxfZmllbGRzOwotICBjaGFyICpmaWxlX25hbWU7Ci19OwotCi1leHRlcm4gdGFibGUgKgotdGFibGVfb3Blbihjb25zdCBjaGFyICpmaWxlX25hbWUsCi0JICAgaW50IG5yX2ZpZWxkcywKLQkgICBpbnQgbnJfbW9kZWxfZmllbGRzKQotewotICBpbnQgZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotICB0YWJsZSAqZmlsZTsKLSAgaW50IG5yOwotCi0gIC8qIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciAqLwotICBmaWxlID0gWkFMTE9DKHRhYmxlKTsKLSAgQVNTRVJUKGZpbGUgIT0gTlVMTCk7Ci0gIGZpbGUtPm5yX2ZpZWxkcyA9IG5yX2ZpZWxkczsKLSAgZmlsZS0+bnJfbW9kZWxfZmllbGRzID0gbnJfbW9kZWxfZmllbGRzOwotCi0gIC8qIHNhdmUgdGhlIGZpbGUgbmFtZSAqLwotICBmaWxlLT5maWxlX25hbWUgPSAoY2hhciopemFsbG9jKHN0cmxlbihmaWxlX25hbWUpICsgMSk7Ci0gIEFTU0VSVChmaWxlLT5maWxlX25hbWUgIT0gTlVMTCk7Ci0gIHN0cmNweShmaWxlLT5maWxlX25hbWUsIGZpbGVfbmFtZSk7Ci0KLSAgLyogb3BlbiB0aGUgZmlsZSAqLwotICBmZCA9IG9wZW4oZmlsZS0+ZmlsZV9uYW1lLCBPX1JET05MWSwgMCk7Ci0gIEFTU0VSVChmZCA+PSAwKTsKLQotICAvKiBkZXRlcm1pbmUgdGhlIHNpemUgKi8KLSAgaWYgKGZzdGF0KGZkLCAmc3RhdF9idWYpIDwgMCkgewotICAgIHBlcnJvcigidGFibGVfb3Blbi5mc3RhdCIpOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgZmlsZS0+c2l6ZSA9IHN0YXRfYnVmLnN0X3NpemU7Ci0KLSAgLyogYWxsb2NhdGUgdGhpcyBtdWNoIG1lbW9yeSAqLwotICBmaWxlLT5idWZmZXIgPSAoY2hhciopemFsbG9jKGZpbGUtPnNpemUrMSk7Ci0gIGlmKGZpbGUtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgcGVycm9yKCJ0YWJsZV9vcGVuLmNhbGxvYy5maWxlLT5zaXplKzEiKTsKLSAgICBleGl0KDEpOwotICB9Ci0gIGZpbGUtPnBvcyA9IGZpbGUtPmJ1ZmZlcjsKLQotICAvKiByZWFkIGl0IGluICovCi0jaWZkZWYgX19DWUdXSU4zMl9fCi0gIGlmICgoZmlsZS0+c2l6ZSkgJiYgKChuciA9IHJlYWQoZmQsIGZpbGUtPmJ1ZmZlciwgZmlsZS0+c2l6ZSkpIDw9IDApKSB7Ci0jZWxzZQotICBpZiAoKG5yID0gcmVhZChmZCwgZmlsZS0+YnVmZmVyLCBmaWxlLT5zaXplKSkgPCBmaWxlLT5zaXplKSB7Ci0jZW5kaWYKLSAgICBwZXJyb3IoInRhYmxlX29wZW4ucmVhZCIpOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgZmlsZS0+c2l6ZSA9IG5yOwotICBmaWxlLT5idWZmZXJbZmlsZS0+c2l6ZV0gPSAnXDAnOwotCi0gIC8qIGRvbmUgKi8KLSAgY2xvc2UoZmQpOwotICByZXR1cm4gZmlsZTsKLX0KLQotCi1leHRlcm4gdGFibGVfZW50cnkgKgotdGFibGVfZW50cnlfcmVhZCh0YWJsZSAqZmlsZSkKLXsKLSAgaW50IGZpZWxkOwotICB0YWJsZV9lbnRyeSAqZW50cnk7Ci0KLSAgLyogc2tpcCBjb21tZW50cy9ibGFua3MgKi8KLSAgd2hpbGUoMSkgewotICAgIC8qIGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KLSAgICB3aGlsZSAoKmZpbGUtPnBvcyAhPSAnXDAnCi0JICAgJiYgKmZpbGUtPnBvcyAhPSAnXG4nCi0JICAgJiYgaXNzcGFjZSgqZmlsZS0+cG9zKSkKLSAgICAgIGZpbGUtPnBvcysrOwotICAgIC8qIGNvbW1lbnQgKi8KLSAgICBpZiAoKmZpbGUtPnBvcyA9PSAnIycpIHsKLSAgICAgIGRvIHsKLQlmaWxlLT5wb3MrKzsKLSAgICAgIH0gd2hpbGUgKCpmaWxlLT5wb3MgIT0gJ1wwJyAmJiAqZmlsZS0+cG9zICE9ICdcbicpOwotICAgIH0KLSAgICAvKiBlbmQgb2YgbGluZT8gKi8KLSAgICBpZiAoKmZpbGUtPnBvcyA9PSAnXG4nKSB7Ci0gICAgICBmaWxlLT5wb3MrKzsKLSAgICAgIGZpbGUtPmxpbmVfbnIrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKCpmaWxlLT5wb3MgPT0gJ1wwJykKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBjcmVhdGUgdGhpcyBuZXcgZW50cnkgKi8KLSAgZW50cnkgPSAodGFibGVfZW50cnkqKXphbGxvYyhzaXplb2YodGFibGVfZW50cnkpCi0JCQkgICAgICAgKyAoZmlsZS0+bnJfZmllbGRzICsgMSkgKiBzaXplb2YoY2hhciopKTsKLSAgQVNTRVJUKGVudHJ5ICE9IE5VTEwpOwotICBlbnRyeS0+ZmlsZV9uYW1lID0gZmlsZS0+ZmlsZV9uYW1lOwotICBlbnRyeS0+bnJfZmllbGRzID0gZmlsZS0+bnJfZmllbGRzOwotCi0gIC8qIGJyZWFrIHRoZSBsaW5lIGludG8gaXRzIGNvbG9uIGRlbGltaXRlcmVkIGZpZWxkcyAqLwotICBmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBmaWxlLT5ucl9maWVsZHMtMTsgZmllbGQrKykgewotICAgIGVudHJ5LT5maWVsZHNbZmllbGRdID0gZmlsZS0+cG9zOwotICAgIHdoaWxlKCpmaWxlLT5wb3MgJiYgKmZpbGUtPnBvcyAhPSAnOicgJiYgKmZpbGUtPnBvcyAhPSAnXG4nKQotICAgICAgZmlsZS0+cG9zKys7Ci0gICAgaWYgKCpmaWxlLT5wb3MgPT0gJzonKSB7Ci0gICAgICAqZmlsZS0+cG9zID0gJ1wwJzsKLSAgICAgIGZpbGUtPnBvcysrOwotICAgIH0KLSAgfQotCi0gIC8qIGFueSB0cmFpbGluZyBzdHVmZiBub3QgdGhlIGxhc3QgZmllbGQgKi8KLSAgQVNTRVJUKGZpZWxkID09IGZpbGUtPm5yX2ZpZWxkcy0xKTsKLSAgZW50cnktPmZpZWxkc1tmaWVsZF0gPSBmaWxlLT5wb3M7Ci0gIHdoaWxlICgqZmlsZS0+cG9zICYmICpmaWxlLT5wb3MgIT0gJ1xuJykgewotICAgIGZpbGUtPnBvcysrOwotICB9Ci0gIGlmICgqZmlsZS0+cG9zID09ICdcbicpIHsKLSAgICAqZmlsZS0+cG9zID0gJ1wwJzsKLSAgICBmaWxlLT5wb3MrKzsKLSAgfQotICBmaWxlLT5saW5lX25yKys7Ci0KLSAgLyogaWYgZm9sbG93aW5nIGxpbmVzIGJlZ2luIHdpdGggYSBzdGFyLCBhZGQgdGhlbSB0byB0aGUgbW9kZWwKLSAgICAgc2VjdGlvbi4gICovCi0gIHdoaWxlICgoZmlsZS0+bnJfbW9kZWxfZmllbGRzID4gMCkgJiYgKCpmaWxlLT5wb3MgPT0gJyonKSkgewotICAgIHRhYmxlX21vZGVsX2VudHJ5ICptb2RlbCA9ICh0YWJsZV9tb2RlbF9lbnRyeSopemFsbG9jKHNpemVvZih0YWJsZV9tb2RlbF9lbnRyeSkKLQkJCQkJCQkgICsgKGZpbGUtPm5yX21vZGVsX2ZpZWxkcyArIDEpICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgaWYgKGVudHJ5LT5tb2RlbF9sYXN0KQotICAgICAgZW50cnktPm1vZGVsX2xhc3QtPm5leHQgPSBtb2RlbDsKLSAgICBlbHNlCi0gICAgICBlbnRyeS0+bW9kZWxfZmlyc3QgPSBtb2RlbDsKLSAgICBlbnRyeS0+bW9kZWxfbGFzdCA9IG1vZGVsOwotCi0gICAgLyogYnJlYWsgdGhlIGxpbmUgaW50byBpdHMgY29sb24gZGVsaW1pdGVyZWQgZmllbGRzICovCi0gICAgZmlsZS0+cG9zKys7Ci0gICAgZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgZmlsZS0+bnJfbW9kZWxfZmllbGRzLTE7IGZpZWxkKyspIHsKLSAgICAgIG1vZGVsLT5maWVsZHNbZmllbGRdID0gZmlsZS0+cG9zOwotICAgICAgd2hpbGUoKmZpbGUtPnBvcyAmJiAqZmlsZS0+cG9zICE9ICc6JyAmJiAqZmlsZS0+cG9zICE9ICdcbicpCi0JZmlsZS0+cG9zKys7Ci0gICAgICBpZiAoKmZpbGUtPnBvcyA9PSAnOicpIHsKLQkqZmlsZS0+cG9zID0gJ1wwJzsKLQlmaWxlLT5wb3MrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhbnkgdHJhaWxpbmcgc3R1ZmYgbm90IHRoZSBsYXN0IGZpZWxkICovCi0gICAgQVNTRVJUKGZpZWxkID09IGZpbGUtPm5yX21vZGVsX2ZpZWxkcy0xKTsKLSAgICBtb2RlbC0+ZmllbGRzW2ZpZWxkXSA9IGZpbGUtPnBvczsKLSAgICB3aGlsZSAoKmZpbGUtPnBvcyAmJiAqZmlsZS0+cG9zICE9ICdcbicpIHsKLSAgICAgIGZpbGUtPnBvcysrOwotICAgIH0KLSAgICBpZiAoKmZpbGUtPnBvcyA9PSAnXG4nKSB7Ci0gICAgICAqZmlsZS0+cG9zID0gJ1wwJzsKLSAgICAgIGZpbGUtPnBvcysrOwotICAgIH0KLQotICAgIGZpbGUtPmxpbmVfbnIrKzsKLSAgICBtb2RlbC0+bGluZV9uciA9IGZpbGUtPmxpbmVfbnI7Ci0gIH0KLQotICBlbnRyeS0+bGluZV9uciA9IGZpbGUtPmxpbmVfbnI7Ci0KLSAgLyogaWYgZm9sbG93aW5nIGxpbmVzIGFyZSB0YWIgaW5kZW50ZWQsIHB1dCBpbiB0aGUgYW5uZXggKi8KLSAgaWYgKCpmaWxlLT5wb3MgPT0gJ1x0JykgewotICAgIGVudHJ5LT5hbm5leCA9IGZpbGUtPnBvczsKLSAgICBkbyB7Ci0gICAgICBkbyB7Ci0JZmlsZS0+cG9zKys7Ci0gICAgICB9IHdoaWxlICgqZmlsZS0+cG9zICE9ICdcMCcgJiYgKmZpbGUtPnBvcyAhPSAnXG4nKTsKLSAgICAgIGlmICgqZmlsZS0+cG9zID09ICdcbicpIHsKLQljaGFyICpzYXZlX3BvcyA9ICsrZmlsZS0+cG9zOwotCWludCBleHRyYV9saW5lcyA9IDA7Ci0JZmlsZS0+bGluZV9ucisrOwotCS8qIEFsbG93IHRhYiBpbmRlbnRlZCB0byBoYXZlIGJsYW5rIGxpbmVzICovCi0Jd2hpbGUgKCpzYXZlX3BvcyA9PSAnXG4nKSB7Ci0JICBzYXZlX3BvcysrOwotCSAgZXh0cmFfbGluZXMrKzsKLQl9Ci0JaWYgKCpzYXZlX3BvcyA9PSAnXHQnKSB7Ci0JICBmaWxlLT5wb3MgPSBzYXZlX3BvczsKLQkgIGZpbGUtPmxpbmVfbnIgKz0gZXh0cmFfbGluZXM7Ci0JfQotICAgICAgfQotICAgIH0gd2hpbGUgKCpmaWxlLT5wb3MgIT0gJ1wwJyAmJiAqZmlsZS0+cG9zID09ICdcdCcpOwotICAgIGlmIChmaWxlLT5wb3NbLTFdID09ICdcbicpCi0gICAgICBmaWxlLT5wb3NbLTFdID0gJ1wwJzsKLSAgfQotICBlbHNlCi0gICAgZW50cnktPmFubmV4ID0gTlVMTDsKLQotICAvKiByZXR1cm4gaXQgKi8KLSAgcmV0dXJuIGVudHJ5OwotCi19Ci0KLQotZXh0ZXJuIHZvaWQKLWR1bXBfdGFibGVfZW50cnkodGFibGVfZW50cnkgKmVudHJ5LAotCQkgaW50IGluZGVudCkKLXsKLSAgcHJpbnRmKCIodGFibGVfZW50cnkqKSVwXG4iLCBlbnRyeSk7Ci0KLSAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKLSAgICBpbnQgZmllbGQ7Ci0gICAgY2hhciBzZXA7Ci0KLSAgICBzZXAgPSAnICc7Ci0gICAgZHVtcGYoaW5kZW50LCAiKGZpZWxkcyIpOwotICAgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IGVudHJ5LT5ucl9maWVsZHM7IGZpZWxkKyspIHsKLSAgICAgIHByaW50ZigiJWMlcyIsIHNlcCwgZW50cnktPmZpZWxkc1tmaWVsZF0pOwotICAgICAgc2VwID0gJzonOwotICAgIH0KLSAgICBwcmludGYoIilcbiIpOwotCi0gICAgZHVtcGYoaW5kZW50LCAiKGxpbmVfbnIgJWQpXG4iLCBlbnRyeS0+bGluZV9ucik7Ci0KLSAgICBkdW1wZihpbmRlbnQsICIoZmlsZV9uYW1lICVzKVxuIiwgZW50cnktPmZpbGVfbmFtZSk7Ci0KLSAgICBkdW1wZihpbmRlbnQsICIoYW5uZXhcbiVzXG4iLCBlbnRyeS0+YW5uZXgpOwotICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKLQotICB9Ci19Ci0KLQotZXh0ZXJuIHZvaWQKLXRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKGxmICpmaWxlLAotCQkJICAgICAgdGFibGVfZW50cnkgKmVudHJ5KQotewotICBsZl9wcmludF9fZXh0ZXJuYWxfcmVmZXJlbmNlKGZpbGUsIGVudHJ5LT5saW5lX25yLCBlbnRyeS0+ZmlsZV9uYW1lKTsKLX0KLQotCmRpZmYgLS1naXQgYS9zaW0vcHBjL3RhYmxlLmggYi9zaW0vcHBjL3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOWZiMjIuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotLyogbG9hZCBhIHRhYmxlIGludG8gbWVtb3J5ICovCi0KLXR5cGVkZWYgc3RydWN0IF90YWJsZSB0YWJsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3RhYmxlX21vZGVsX2VudHJ5IHRhYmxlX21vZGVsX2VudHJ5Owotc3RydWN0IF90YWJsZV9tb2RlbF9lbnRyeSB7Ci0gIHRhYmxlX21vZGVsX2VudHJ5ICpuZXh0OwotICBpbnQgbGluZV9ucjsKLSAgaW50IG5yX2ZpZWxkczsKLSAgY2hhciAqZmllbGRzWzBdOwkvKiBVc2VyIGRlZmluZWQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IF90YWJsZV9lbnRyeSB0YWJsZV9lbnRyeTsKLXN0cnVjdCBfdGFibGVfZW50cnkgewotICBpbnQgbGluZV9ucjsKLSAgaW50IG5yX2ZpZWxkczsKLSAgY2hhciAqZmlsZV9uYW1lOwotICB0YWJsZV9tb2RlbF9lbnRyeSAqbW9kZWxfZmlyc3Q7Ci0gIHRhYmxlX21vZGVsX2VudHJ5ICptb2RlbF9sYXN0OwotICBjaGFyICphbm5leDsKLSAgY2hhciAqZmllbGRzWzBdOwkgLyogVXNlciBkZWZpbmVkICovCi19OwotCi0KLWV4dGVybiB0YWJsZSAqdGFibGVfb3BlbgotKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLSBpbnQgbWF4X25yX2ZpZWxkcywKLSBpbnQgbWF4X25yX21vZGVsX2ZpZWxkcyk7Ci0KLWV4dGVybiB0YWJsZV9lbnRyeSAqdGFibGVfZW50cnlfcmVhZAotKHRhYmxlICpmaWxlKTsKLQotZXh0ZXJuIHZvaWQgZHVtcF90YWJsZV9lbnRyeQotKHRhYmxlX2VudHJ5ICplbnRyeSwKLSBpbnQgaW5kZW50KTsKLQotZXh0ZXJuIHZvaWQgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIKLShsZiAqZmlsZSwKLSB0YWJsZV9lbnRyeSAqZW50cnkpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy90cmVlLmMgYi9zaW0vcHBjL3RyZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMDU5My4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3RyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTYgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfUEFSU0VfQ18KLSNkZWZpbmUgX1BBUlNFX0NfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAiYmFzaWNzLmgiCi0KLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJ0cmVlLmgiCi0KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0KLS8qIG1hbmlwdWxhdGUvbG9va3VwIGRldmljZSBuYW1lcyAqLwotCi10eXBlZGVmIHN0cnVjdCBfbmFtZV9zcGVjaWZpZXIgewotICAvKiBjb21wb25lbnRzIGluIHRoZSBmdWxsIGxlbmd0aCBuYW1lICovCi0gIGNoYXIgKnBhdGg7Ci0gIGNoYXIgKnByb3BlcnR5OwotICBjaGFyICp2YWx1ZTsKLSAgLyogY3VycmVudCBkZXZpY2UgKi8KLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqYmFzZTsKLSAgY2hhciAqdW5pdDsKLSAgY2hhciAqYXJnczsKLSAgLyogcHJldmlvdXMgZGV2aWNlICovCi0gIGNoYXIgKmxhc3RfbmFtZTsKLSAgY2hhciAqbGFzdF9iYXNlOwotICBjaGFyICpsYXN0X3VuaXQ7Ci0gIGNoYXIgKmxhc3RfYXJnczsKLSAgLyogd29yayBhcmVhICovCi0gIGNoYXIgYnVmWzEwMjRdOwotfSBuYW1lX3NwZWNpZmllcjsKLQotCi0KLS8qIEdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciwgYnJlYWsgaXQgdXAgaW50byBpdHMgbWFpbiBjb21wb25lbnRzOgotICAgcGF0aCAoYW5kIGlmIHByZXNlbnQpIHByb3BlcnR5IG5hbWUgYW5kIHByb3BlcnR5IHZhbHVlLiAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oaW50KQotc3BsaXRfZGV2aWNlX3NwZWNpZmllcihkZXZpY2UgKmN1cnJlbnQsCi0JCSAgICAgICBjb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAotCQkgICAgICAgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGNoYXIgKmNocCA9IE5VTEw7Ci0KLSAgLyogZXhwYW5kIGFueSBsZWFkaW5nIGFsaWFzIGlmIHByZXNlbnQgKi8KLSAgaWYgKGN1cnJlbnQgIT0gTlVMTAotICAgICAgJiYgKmRldmljZV9zcGVjaWZpZXIgIT0gJ1wwJwotICAgICAgJiYgKmRldmljZV9zcGVjaWZpZXIgIT0gJy4nCi0gICAgICAmJiAqZGV2aWNlX3NwZWNpZmllciAhPSAnLycpIHsKLSAgICBkZXZpY2UgKmFsaWFzZXMgPSB0cmVlX2ZpbmRfZGV2aWNlKGN1cnJlbnQsICIvYWxpYXNlcyIpOwotICAgIGNoYXIgYWxpYXNbMzJdOwotICAgIGludCBsZW4gPSAwOwotICAgIHdoaWxlIChkZXZpY2Vfc3BlY2lmaWVyW2xlbl0gIT0gJ1wwJwotCSAgICYmIGRldmljZV9zcGVjaWZpZXJbbGVuXSAhPSAnLycKLQkgICAmJiBkZXZpY2Vfc3BlY2lmaWVyW2xlbl0gIT0gJzonCi0JICAgJiYgIWlzc3BhY2UoZGV2aWNlX3NwZWNpZmllcltsZW5dKSkgewotICAgICAgYWxpYXNbbGVuXSA9IGRldmljZV9zcGVjaWZpZXJbbGVuXTsKLSAgICAgIGxlbisrOwotICAgICAgaWYgKGxlbiA+PSBzaXplb2YoYWxpYXMpKQotCWVycm9yKCJzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyOiBidWZmZXIgb3ZlcmZsb3ciKTsKLSAgICB9Ci0gICAgYWxpYXNbbGVuXSA9ICdcMCc7Ci0gICAgaWYgKGFsaWFzZXMgIT0gTlVMTAotCSYmIGRldmljZV9maW5kX3Byb3BlcnR5KGFsaWFzZXMsIGFsaWFzKSkgewotICAgICAgc3RyY3B5KHNwZWMtPmJ1ZiwgZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KGFsaWFzZXMsIGFsaWFzKSk7Ci0gICAgICBzdHJjYXQoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyICsgbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzdHJjcHkoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3RyY3B5KHNwZWMtPmJ1ZiwgZGV2aWNlX3NwZWNpZmllcik7Ci0gIH0KLQotICAvKiBjaGVjayBubyBvdmVyZmxvdyAqLwotICBpZiAoc3RybGVuKHNwZWMtPmJ1ZikgPj0gc2l6ZW9mKHNwZWMtPmJ1ZikpCi0gICAgZXJyb3IoInNwbGl0X2RldmljZV9zcGVjaWZpZXI6IGJ1ZmZlciBvdmVyZmxvd1xuIik7Ci0KLSAgLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KLSAgY2hwID0gc3BlYy0+YnVmOwotICB3aGlsZSAoKmNocCAhPSAnXDAnICYmIGlzc3BhY2UoKmNocCkpCi0gICAgY2hwKys7Ci0gIGlmICgqY2hwID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogZmluZCB0aGUgcGF0aCBhbmQgdGVybWluYXRlIGl0IHdpdGggbnVsbCAqLwotICBzcGVjLT5wYXRoID0gY2hwOwotICB3aGlsZSAoKmNocCAhPSAnXDAnICYmICFpc3NwYWNlKCpjaHApKQotICAgIGNocCsrOwotICBpZiAoKmNocCAhPSAnXDAnKSB7Ci0gICAgKmNocCA9ICdcMCc7Ci0gICAgY2hwKys7Ci0gIH0KLQotICAvKiBhbmQgYW55IHZhbHVlICovCi0gIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgaXNzcGFjZSgqY2hwKSkKLSAgICBjaHArKzsKLSAgc3BlYy0+dmFsdWUgPSBjaHA7Ci0KLSAgLyogbm93IGdvIGJhY2sgYW5kIGNob3AgdGhlIHByb3BlcnR5IG9mZiBvZiB0aGUgcGF0aCAqLwotICBpZiAoc3BlYy0+dmFsdWVbMF0gPT0gJ1wwJykgewotICAgIHNwZWMtPnByb3BlcnR5ID0gTlVMTDsgLypub3QgYSBwcm9wZXJ0eSovCi0gICAgc3BlYy0+dmFsdWUgPSBOVUxMOwotICB9Ci0gIGVsc2UgaWYgKHNwZWMtPnZhbHVlWzBdID09ICc+JwotCSAgIHx8IHNwZWMtPnZhbHVlWzBdID09ICc8JykgewotICAgIC8qIGFuIGludGVycnVwdCBzcGVjICovCi0gICAgc3BlYy0+cHJvcGVydHkgPSBOVUxMOwotICB9Ci0gIGVsc2UgewotICAgIGNocCA9IHN0cnJjaHIoc3BlYy0+cGF0aCwgJy8nKTsKLSAgICBpZiAoY2hwID09IE5VTEwpIHsKLSAgICAgIHNwZWMtPnByb3BlcnR5ID0gc3BlYy0+cGF0aDsKLSAgICAgIHNwZWMtPnBhdGggPSBzdHJjaHIoc3BlYy0+cHJvcGVydHksICdcMCcpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICpjaHAgPSAnXDAnOwotICAgICAgc3BlYy0+cHJvcGVydHkgPSBjaHArMTsKLSAgICB9Ci0gIH0KLQotICAvKiBhbmQgbWFyayB0aGUgcmVzdCBhcyBpbnZhbGlkICovCi0gIHNwZWMtPm5hbWUgPSBOVUxMOwotICBzcGVjLT5iYXNlID0gTlVMTDsKLSAgc3BlYy0+dW5pdCA9IE5VTEw7Ci0gIHNwZWMtPmFyZ3MgPSBOVUxMOwotICBzcGVjLT5sYXN0X25hbWUgPSBOVUxMOwotICBzcGVjLT5sYXN0X2Jhc2UgPSBOVUxMOwotICBzcGVjLT5sYXN0X3VuaXQgPSBOVUxMOwotICBzcGVjLT5sYXN0X2FyZ3MgPSBOVUxMOwotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIGdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciBicmVhayBpdCB1cCBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHMgLQotICAgcGF0aCBhbmQgcHJvcGVydHkgbmFtZSAtIGFzc3VtaW5nIHRoYXQgdGhlIGxhc3QgYGRldmljZScgaXMgYQotICAgcHJvcGVydHkgbmFtZS4gKi8KLQotU1RBVElDX0lOTElORV9ERVZJQ0VcCi0oaW50KQotc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKGRldmljZSAqY3VycmVudCwKLQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eV9zcGVjaWZpZXIsCi0JCQkgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGlmIChzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKGN1cnJlbnQsIHByb3BlcnR5X3NwZWNpZmllciwgc3BlYykpIHsKLSAgICBpZiAoc3BlYy0+cHJvcGVydHkgPT0gTlVMTCkgewotICAgICAgLyogZm9yY2UgdGhlIGxhc3QgbmFtZSB0byBiZSBhIHByb3BlcnR5IG5hbWUgKi8KLSAgICAgIGNoYXIgKmNocCA9IHN0cnJjaHIoc3BlYy0+cGF0aCwgJy8nKTsKLSAgICAgIGlmIChjaHAgPT0gTlVMTCkgewotCXNwZWMtPnByb3BlcnR5ID0gc3BlYy0+cGF0aDsKLQlzcGVjLT5wYXRoID0gc3RycmNocihzcGVjLT5wcm9wZXJ0eSwgJ1wwJyk7OwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JKmNocCA9ICdcMCc7Ci0Jc3BlYy0+cHJvcGVydHkgPSBjaHArMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIGRldmljZSB0aGUgbmV4dCBkZXZpY2UgbmFtZSBhbmQgc3BsaXQgaXQgdXAsIHJldHVybiAwIHdoZW4gbm8gbW9yZQotICAgbmFtZXMgdG8gZGV2aWNlICovCi0KLVNUQVRJQ19JTkxJTkVfVFJFRVwKLShpbnQpCi1zcGxpdF9kZXZpY2VfbmFtZShuYW1lX3NwZWNpZmllciAqc3BlYykKLXsKLSAgY2hhciAqY2hwOwotICAvKiByZW1lbWJlciB3aGF0IGNhbWUgYmVmb3JlICovCi0gIHNwZWMtPmxhc3RfbmFtZSA9IHNwZWMtPm5hbWU7Ci0gIHNwZWMtPmxhc3RfYmFzZSA9IHNwZWMtPmJhc2U7Ci0gIHNwZWMtPmxhc3RfdW5pdCA9IHNwZWMtPnVuaXQ7Ci0gIHNwZWMtPmxhc3RfYXJncyA9IHNwZWMtPmFyZ3M7Ci0gIC8qIGZpbmlzaGVkPyAqLwotICBpZiAoc3BlYy0+cGF0aFswXSA9PSAnXDAnKSB7Ci0gICAgc3BlYy0+bmFtZSA9IE5VTEw7Ci0gICAgc3BlYy0+YmFzZSA9IE5VTEw7Ci0gICAgc3BlYy0+dW5pdCA9IE5VTEw7Ci0gICAgc3BlYy0+YXJncyA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogYnJlYWsgdGhlIGN1cnJlbnQgZGV2aWNlIHNwZWMgZnJvbSB0aGUgcGF0aCAqLwotICBzcGVjLT5uYW1lID0gc3BlYy0+cGF0aDsKLSAgY2hwID0gc3RyY2hyKHNwZWMtPm5hbWUsICcvJyk7Ci0gIGlmIChjaHAgPT0gTlVMTCkKLSAgICBzcGVjLT5wYXRoID0gc3RyY2hyKHNwZWMtPm5hbWUsICdcMCcpOwotICBlbHNlIHsKLSAgICBzcGVjLT5wYXRoID0gY2hwKzE7Ci0gICAgKmNocCA9ICdcMCc7Ci0gIH0KLSAgLyogYnJlYWsgb3V0IHRoZSBiYXNlICovCi0gIGlmIChzcGVjLT5uYW1lWzBdID09ICcoJykgewotICAgIGNocCA9IHN0cmNocihzcGVjLT5uYW1lLCAnKScpOwotICAgIGlmIChjaHAgPT0gTlVMTCkgewotICAgICAgc3BlYy0+YmFzZSA9IHNwZWMtPm5hbWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgKmNocCA9ICdcMCc7Ci0gICAgICBzcGVjLT5iYXNlID0gc3BlYy0+bmFtZSArIDE7Ci0gICAgICBzcGVjLT5uYW1lID0gY2hwICsgMTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3BlYy0+YmFzZSA9IHNwZWMtPm5hbWU7Ci0gIH0KLSAgLyogbm93IGJyZWFrIG91dCB0aGUgdW5pdCAqLwotICBjaHAgPSBzdHJjaHIoc3BlYy0+bmFtZSwgJ0AnKTsKLSAgaWYgKGNocCA9PSBOVUxMKSB7Ci0gICAgc3BlYy0+dW5pdCA9IE5VTEw7Ci0gICAgY2hwID0gc3BlYy0+bmFtZTsKLSAgfQotICBlbHNlIHsKLSAgICAqY2hwID0gJ1wwJzsKLSAgICBjaHAgKz0gMTsKLSAgICBzcGVjLT51bml0ID0gY2hwOwotICB9Ci0gIC8qIGZpbmFsbHkgYW55IGFyZ3MgKi8KLSAgY2hwID0gc3RyY2hyKGNocCwgJzonKTsKLSAgaWYgKGNocCA9PSBOVUxMKQotICAgIHNwZWMtPmFyZ3MgPSBOVUxMOwotICBlbHNlIHsKLSAgICAqY2hwID0gJ1wwJzsKLSAgICBzcGVjLT5hcmdzID0gY2hwKzE7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogZGV2aWNlIHRoZSB2YWx1ZSwgcmV0dXJuaW5nIHRoZSBuZXh0IG5vbi1zcGFjZSB0b2tlbiAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oY2hhciAqKQotc3BsaXRfdmFsdWUobmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIGNoYXIgKnRva2VuOwotICBpZiAoc3BlYy0+dmFsdWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCi0gIHdoaWxlIChpc3NwYWNlKHNwZWMtPnZhbHVlWzBdKSkKLSAgICBzcGVjLT52YWx1ZSsrOwotICBpZiAoc3BlYy0+dmFsdWVbMF0gPT0gJ1wwJykgewotICAgIHNwZWMtPnZhbHVlID0gTlVMTDsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICB0b2tlbiA9IHNwZWMtPnZhbHVlOwotICAvKiBmaW5kIHRyYWlsaW5nIHNwYWNlICovCi0gIHdoaWxlIChzcGVjLT52YWx1ZVswXSAhPSAnXDAnICYmICFpc3NwYWNlKHNwZWMtPnZhbHVlWzBdKSkKLSAgICBzcGVjLT52YWx1ZSsrOwotICAvKiBjaG9wIHRoaXMgdmFsdWUgb3V0ICovCi0gIGlmIChzcGVjLT52YWx1ZVswXSAhPSAnXDAnKSB7Ci0gICAgc3BlYy0+dmFsdWVbMF0gPSAnXDAnOwotICAgIHNwZWMtPnZhbHVlKys7Ci0gIH0KLSAgcmV0dXJuIHRva2VuOwotfQotCi0KLQotLyogdHJhdmVyc2UgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHNwZWMgc3RhcnRpbmcgYXQgY3VycmVudCAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oZGV2aWNlICopCi1zcGxpdF9maW5kX2RldmljZShkZXZpY2UgKmN1cnJlbnQsCi0JCSAgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCi17Ci0gIC8qIHN0cmlwIG9mZiAoYW5kIHByb2Nlc3MpIGFueSBsZWFkaW5nIC4sIC4uLCAuLyBhbmQgLyAqLwotICB3aGlsZSAoMSkgewotICAgIGlmIChzdHJuY21wKHNwZWMtPnBhdGgsICIvIiwgc3RybGVuKCIvIikpID09IDApIHsKLSAgICAgIC8qIGNkIC8uLi4gKi8KLSAgICAgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgZGV2aWNlX3BhcmVudChjdXJyZW50KSAhPSBOVUxMKQotCWN1cnJlbnQgPSBkZXZpY2VfcGFyZW50KGN1cnJlbnQpOwotICAgICAgc3BlYy0+cGF0aCArPSBzdHJsZW4oIi8iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChzcGVjLT5wYXRoLCAiLi8iLCBzdHJsZW4oIi4vIikpID09IDApIHsKLSAgICAgIC8qIGNkIC4vLi4uICovCi0gICAgICBjdXJyZW50ID0gY3VycmVudDsKLSAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuLyIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKHNwZWMtPnBhdGgsICIuLi8iLCBzdHJsZW4oIi4uLyIpKSA9PSAwKSB7Ci0gICAgICAvKiBjZCAuLi8uLi4gKi8KLSAgICAgIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgZGV2aWNlX3BhcmVudChjdXJyZW50KSAhPSBOVUxMKQotCWN1cnJlbnQgPSBkZXZpY2VfcGFyZW50KGN1cnJlbnQpOwotICAgICAgc3BlYy0+cGF0aCArPSBzdHJsZW4oIi4uLyIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoc3BlYy0+cGF0aCwgIi4iKSA9PSAwKSB7Ci0gICAgICAvKiBjZCAuICovCi0gICAgICBjdXJyZW50ID0gY3VycmVudDsKLSAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNtcChzcGVjLT5wYXRoLCAiLi4iKSA9PSAwKSB7Ci0gICAgICAvKiBjZCAuICovCi0gICAgICBpZiAoY3VycmVudCAhPSBOVUxMICYmIGRldmljZV9wYXJlbnQoY3VycmVudCkgIT0gTlVMTCkKLQljdXJyZW50ID0gZGV2aWNlX3BhcmVudChjdXJyZW50KTsKLSAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuLiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIG5vdyBnbyB0aHJvdWdoIHRoZSBwYXRoIHByb3BlciAqLwotCi0gIGlmIChjdXJyZW50ID09IE5VTEwpIHsKLSAgICBzcGxpdF9kZXZpY2VfbmFtZShzcGVjKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHdoaWxlIChzcGxpdF9kZXZpY2VfbmFtZShzcGVjKSkgewotICAgIGRldmljZSAqY2hpbGQ7Ci0gICAgZm9yIChjaGlsZCA9IGRldmljZV9jaGlsZChjdXJyZW50KTsKLQkgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBkZXZpY2Vfc2libGluZyhjaGlsZCkpIHsKLSAgICAgIGlmIChzdHJjbXAoc3BlYy0+bmFtZSwgZGV2aWNlX25hbWUoY2hpbGQpKSA9PSAwKSB7Ci0JaWYgKHNwZWMtPnVuaXQgPT0gTlVMTCkKLQkgIGJyZWFrOwotCWVsc2UgewotCSAgZGV2aWNlX3VuaXQgcGh5czsKLQkgIGRldmljZV9kZWNvZGVfdW5pdChjdXJyZW50LCBzcGVjLT51bml0LCAmcGh5cyk7Ci0JICBpZiAobWVtY21wKCZwaHlzLCBkZXZpY2VfdW5pdF9hZGRyZXNzKGNoaWxkKSwKLQkJICAgICBzaXplb2YoZGV2aWNlX3VuaXQpKSA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChjaGlsZCA9PSBOVUxMKQotICAgICAgcmV0dXJuIGN1cnJlbnQ7IC8qIHNlYXJjaCBmYWlsZWQgKi8KLSAgICBjdXJyZW50ID0gY2hpbGQ7Ci0gIH0KLQotICByZXR1cm4gY3VycmVudDsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oZGV2aWNlICopCi1zcGxpdF9maWxsX3BhdGgoZGV2aWNlICpjdXJyZW50LAotCQljb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAotCQluYW1lX3NwZWNpZmllciAqc3BlYykKLXsKLSAgLyogYnJlYWsgaXQgdXAgKi8KLSAgaWYgKCFzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsIHNwZWMpKQotICAgIGRldmljZV9lcnJvcihjdXJyZW50LCAiZXJyb3IgcGFyc2luZyAlc1xuIiwgZGV2aWNlX3NwZWNpZmllcik7Ci0KLSAgLyogZmlsbCBvdXIgdHJlZSB3aXRoIGl0cyBjb250ZW50cyAqLwotICBjdXJyZW50ID0gc3BsaXRfZmluZF9kZXZpY2UoY3VycmVudCwgc3BlYyk7Ci0KLSAgLyogYWRkIGFueSBhZGRpdGlvbmFsIGRldmljZXMgYXMgbmVlZGVkICovCi0gIGlmIChzcGVjLT5uYW1lICE9IE5VTEwpIHsKLSAgICBkbyB7Ci0gICAgICBjdXJyZW50ID0gZGV2aWNlX2NyZWF0ZShjdXJyZW50LCBzcGVjLT5iYXNlLCBzcGVjLT5uYW1lLAotCQkJICAgICAgc3BlYy0+dW5pdCwgc3BlYy0+YXJncyk7Ci0gICAgfSB3aGlsZSAoc3BsaXRfZGV2aWNlX25hbWUoc3BlYykpOwotICB9Ci0KLSAgcmV0dXJuIGN1cnJlbnQ7Ci19Ci0KLQotSU5MSU5FX1RSRUVcCi0odm9pZCkKLXRyZWVfaW5pdChkZXZpY2UgKnJvb3QsCi0JICBwc2ltICpzeXN0ZW0pCi17Ci0gIFRSQUNFKHRyYWNlX2RldmljZV90cmVlLCAoInRyZWVfaW5pdChyb290PTB4JWx4LCBzeXN0ZW09MHglbHgpXG4iLAotCQkJICAgIChsb25nKXJvb3QsCi0JCQkgICAgKGxvbmcpc3lzdGVtKSk7Ci0gIC8qIHJlbW92ZSB0aGUgb2xkLCByZWJ1aWxkIHRoZSBuZXcgKi8KLSAgdHJlZV90cmF2ZXJzZShyb290LCBkZXZpY2VfY2xlYW4sIE5VTEwsIHN5c3RlbSk7Ci0gIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfc3RhdGljX3Byb3BlcnRpZXMsIE5VTEwsIHN5c3RlbSk7Ci0gIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfYWRkcmVzcywgTlVMTCwgc3lzdGVtKTsKLSAgdHJlZV90cmF2ZXJzZShyb290LCBkZXZpY2VfaW5pdF9ydW50aW1lX3Byb3BlcnRpZXMsIE5VTEwsIHN5c3RlbSk7Ci0gIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfZGF0YSwgTlVMTCwgc3lzdGVtKTsKLX0KLQotCi0MCi0vKiA8bm9uLXdoaXRlLXNwYWNlPiAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oY29uc3QgY2hhciAqKQotc2tpcF90b2tlbihjb25zdCBjaGFyICpjaHApCi17Ci0gIHdoaWxlICghaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCi0gICAgY2hwKys7Ci0gIHdoaWxlIChpc3NwYWNlKCpjaHApICYmICpjaHAgIT0gJ1wwJykKLSAgICBjaHArKzsKLSAgcmV0dXJuIGNocDsKLX0KLQotCi0vKiBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgKi8KLQotU1RBVElDX0lOTElORV9UUkVFXAotKGludCkKLWNvdW50X2VudHJpZXMoZGV2aWNlICpjdXJyZW50LAotCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUsCi0JICAgICAgaW50IG1vZHVsbykKLXsKLSAgY29uc3QgY2hhciAqY2hwID0gcHJvcGVydHlfdmFsdWU7Ci0gIGludCBucl9lbnRyaWVzID0gMDsKLSAgd2hpbGUgKCpjaHAgIT0gJ1wwJykgewotICAgIG5yX2VudHJpZXMgKz0gMTsKLSAgICBjaHAgPSBza2lwX3Rva2VuKGNocCk7Ci0gIH0KLSAgaWYgKChucl9lbnRyaWVzICUgbW9kdWxvKSAhPSAwKSB7Ci0gICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJpbmNvcnJlY3QgbnVtYmVyIG9mIGVudHJpZXMgZm9yICVzIHByb3BlcnR5ICVzLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgJWQiLAotCQkgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUsIG1vZHVsbyk7Ci0gIH0KLSAgcmV0dXJuIG5yX2VudHJpZXMgLyBtb2R1bG87Ci19Ci0KLQotCi0vKiBwYXJzZTogPGFkZHJlc3M+IDo6PSA8dG9rZW4+IDsgZGV2aWNlIGRlcGVuZGFudCAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0oY29uc3QgY2hhciAqKQotcGFyc2VfYWRkcmVzcyhkZXZpY2UgKmN1cnJlbnQsCi0JICAgICAgZGV2aWNlICpidXMsCi0JICAgICAgY29uc3QgY2hhciAqY2hwLAotCSAgICAgIGRldmljZV91bml0ICphZGRyZXNzKQotewotICBpZiAoZGV2aWNlX2RlY29kZV91bml0KGJ1cywgY2hwLCBhZGRyZXNzKSA8IDApCi0gICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJpbnZhbGlkIHVuaXQgYWRkcmVzcyBpbiAlcyIsIGNocCk7Ci0gIHJldHVybiBza2lwX3Rva2VuKGNocCk7Ci19Ci0KLQotLyogcGFyc2U6IDxzaXplPiA6Oj0gPG51bWJlcj4geyAiLCIgPG51bWJlcj4gfSA7ICovCi0KLVNUQVRJQ19JTkxJTkVfVFJFRVwKLShjb25zdCBjaGFyICopCi1wYXJzZV9zaXplKGRldmljZSAqY3VycmVudCwKLQkgICBkZXZpY2UgKmJ1cywKLQkgICBjb25zdCBjaGFyICpjaHAsCi0JICAgZGV2aWNlX3VuaXQgKnNpemUpCi17Ci0gIGludCBpOwotICBpbnQgbnI7Ci0gIGNvbnN0IGNoYXIgKmN1cnIgPSBjaHA7Ci0gIG1lbXNldChzaXplLCAwLCBzaXplb2YoKnNpemUpKTsKLSAgLyogcGFyc2UgdGhlIG51bWVyaWMgbGlzdCAqLwotICBzaXplLT5ucl9jZWxscyA9IGRldmljZV9ucl9zaXplX2NlbGxzKGJ1cyk7Ci0gIG5yID0gMDsKLSAgd2hpbGUgKDEpIHsKLSAgICBjaGFyICpuZXh0OwotICAgIHNpemUtPmNlbGxzW25yXSA9IHN0cnRvdWwoY3VyciwgJm5leHQsIDApOwotICAgIGlmIChjdXJyID09IG5leHQpCi0gICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgIlByb2JsZW0gcGFyc2luZyA8c2l6ZT4gJXMiLCBjaHApOwotICAgIG5yICs9IDE7Ci0gICAgaWYgKG5leHRbMF0gIT0gJywnKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKG5yID09IHNpemUtPm5yX2NlbGxzKQotICAgICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJUb28gbWFueSB2YWx1ZXMgaW4gPHNpemU+ICVzIiwgY2hwKTsKLSAgICBjdXJyID0gbmV4dCArIDE7Ci0gIH0KLSAgQVNTRVJUKG5yID4gMCAmJiBuciA8PSBzaXplLT5ucl9jZWxscyk7Ci0gIC8qIHJpZ2h0IGFsaWduIHRoZSBudW1iZXJzICovCi0gIGZvciAoaSA9IDE7IGkgPD0gc2l6ZS0+bnJfY2VsbHM7IGkrKykgewotICAgIGlmIChpIDw9IG5yKQotICAgICAgc2l6ZS0+Y2VsbHNbc2l6ZS0+bnJfY2VsbHMgLSBpXSA9IHNpemUtPmNlbGxzW25yIC0gaV07Ci0gICAgZWxzZQotICAgICAgc2l6ZS0+Y2VsbHNbc2l6ZS0+bnJfY2VsbHMgLSBpXSA9IDA7Ci0gIH0KLSAgcmV0dXJuIHNraXBfdG9rZW4oY2hwKTsKLX0KLQotCi0vKiBwYXJzZTogPHJlZz4gOjo9IHsgPGFkZHJlc3M+IDxzaXplPiB9IDsgKi8KLQotU1RBVElDX0lOTElORV9UUkVFXAotKHZvaWQpCi1wYXJzZV9yZWdfcHJvcGVydHkoZGV2aWNlICpjdXJyZW50LAotCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAotCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKLXsKLSAgaW50IG5yX3JlZ3M7Ci0gIGludCByZWdfbnI7Ci0gIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzOwotICBjb25zdCBjaGFyICpjaHA7Ci0KLSAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmVnIGVudHJpZXMgYnkgY291bnRpbmcgdG9rZW5zICovCi0gIG5yX3JlZ3MgPSBjb3VudF9lbnRyaWVzKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCAyKTsKLQotICAvKiBjcmVhdGUgd29ya2luZyBzcGFjZSAqLwotICByZWdzID0gemFsbG9jKG5yX3JlZ3MgKiBzaXplb2YoKnJlZ3MpKTsKLQotICAvKiBmaWxsIGl0IGluICovCi0gIGNocCA9IHByb3BlcnR5X3ZhbHVlOwotICBmb3IgKHJlZ19uciA9IDA7IHJlZ19uciA8IG5yX3JlZ3M7IHJlZ19ucisrKSB7Ci0gICAgY2hwID0gcGFyc2VfYWRkcmVzcyhjdXJyZW50LCBkZXZpY2VfcGFyZW50KGN1cnJlbnQpLAotCQkJY2hwLCAmcmVnc1tyZWdfbnJdLmFkZHJlc3MpOwotICAgIGNocCA9IHBhcnNlX3NpemUoY3VycmVudCwgZGV2aWNlX3BhcmVudChjdXJyZW50KSwKLQkJICAgICBjaHAsICZyZWdzW3JlZ19ucl0uc2l6ZSk7Ci0gIH0KLQotICAvKiBjcmVhdGUgaXQgKi8KLSAgZGV2aWNlX2FkZF9yZWdfYXJyYXlfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKLQkJCQlyZWdzLCBucl9yZWdzKTsKLQotICB6ZnJlZShyZWdzKTsKLX0KLQotCi0vKiB7IDxjaGlsZC1hZGRyZXNzPiA8cGFyZW50LWFkZHJlc3M+IDxjaGlsZC1zaXplPiB9KiAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXBhcnNlX3Jhbmdlc19wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQotewotICBpbnQgbnJfcmFuZ2VzOwotICBpbnQgcmFuZ2VfbnI7Ci0gIHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlczsKLSAgY29uc3QgY2hhciAqY2hwOwotICAKLSAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHNwZWNpZmllZCAqLwotICBucl9yYW5nZXMgPSBjb3VudF9lbnRyaWVzKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCAzKTsKLQotICAvKiBjcmVhdGUgYSBwcm9wZXJ0eSBvZiB0aGF0IHNpemUgKi8KLSAgcmFuZ2VzID0gemFsbG9jKG5yX3JhbmdlcyAqIHNpemVvZigqcmFuZ2VzKSk7Ci0KLSAgLyogZmlsbCBpdCBpbiAqLwotICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKLSAgZm9yIChyYW5nZV9uciA9IDA7IHJhbmdlX25yIDwgbnJfcmFuZ2VzOyByYW5nZV9ucisrKSB7Ci0gICAgY2hwID0gcGFyc2VfYWRkcmVzcyhjdXJyZW50LCBjdXJyZW50LAotCQkJY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5jaGlsZF9hZGRyZXNzKTsKLSAgICBjaHAgPSBwYXJzZV9hZGRyZXNzKGN1cnJlbnQsIGRldmljZV9wYXJlbnQoY3VycmVudCksCi0JCQljaHAsICZyYW5nZXNbcmFuZ2VfbnJdLnBhcmVudF9hZGRyZXNzKTsKLSAgICBjaHAgPSBwYXJzZV9zaXplKGN1cnJlbnQsIGN1cnJlbnQsCi0JCSAgICAgY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5zaXplKTsKLSAgfQotCi0gIC8qIGNyZWF0ZSBpdCAqLwotICBkZXZpY2VfYWRkX3JhbmdlX2FycmF5X3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHJhbmdlcywgbnJfcmFuZ2VzKTsKLQotICB6ZnJlZShyYW5nZXMpOwotfQotCi0KLS8qIDxpbnRlZ2VyPiAuLi4gKi8KLQotU1RBVElDX0lOTElORV9UUkVFXAotKHZvaWQpCi1wYXJzZV9pbnRlZ2VyX3Byb3BlcnR5KGRldmljZSAqY3VycmVudCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKLXsKLSAgaW50IG5yX2VudHJpZXM7Ci0gIHVuc2lnbmVkX2NlbGwgd29yZHNbMTAyNF07Ci0gIC8qIGludGVnZXIgb3IgaW50ZWdlciBhcnJheT8gKi8KLSAgbnJfZW50cmllcyA9IDA7Ci0gIHdoaWxlICgxKSB7Ci0gICAgY2hhciAqZW5kOwotICAgIHdvcmRzW25yX2VudHJpZXNdID0gc3RydG91bChwcm9wZXJ0eV92YWx1ZSwgJmVuZCwgMCk7Ci0gICAgaWYgKHByb3BlcnR5X3ZhbHVlID09IGVuZCkKLSAgICAgIGJyZWFrOwotICAgIG5yX2VudHJpZXMgKz0gMTsKLSAgICBpZiAobnJfZW50cmllcyAqIHNpemVvZih3b3Jkc1swXSkgPj0gc2l6ZW9mKHdvcmRzKSkKLSAgICAgIGRldmljZV9lcnJvcihjdXJyZW50LCAiYnVmZmVyIG92ZXJmbG93Iik7Ci0gICAgcHJvcGVydHlfdmFsdWUgPSBlbmQ7Ci0gIH0KLSAgaWYgKG5yX2VudHJpZXMgPT0gMCkKLSAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgImVycm9yIHBhcnNpbmcgaW50ZWdlciBwcm9wZXJ0eSAlcyAoJXMpIiwKLSAgICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUpOwotICBlbHNlIGlmIChucl9lbnRyaWVzID09IDEpCi0gICAgZGV2aWNlX2FkZF9pbnRlZ2VyX3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHdvcmRzWzBdKTsKLSAgZWxzZSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKykgewotICAgICAgSDJCRSh3b3Jkc1tpXSk7Ci0gICAgfQotICAgIC8qIHBlcmhhcGhzIGludGVnZXIgYXJyYXkgcHJvcGVydHkgaXMgYmV0dGVyICovCi0gICAgZGV2aWNlX2FkZF9hcnJheV9wcm9wZXJ0eShjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCB3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3b3Jkc1swXSkgKiBucl9lbnRyaWVzKTsKLSAgfQotfQotCi0KLS8qIDxzdHJpbmc+IC4uLiAqLwotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXBhcnNlX3N0cmluZ19wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQotewotICBjaGFyICoqc3RyaW5nczsKLSAgY29uc3QgY2hhciAqY2hwOwotICBpbnQgbnJfc3RyaW5nczsKLSAgaW50IGFwcHJveF9ucl9zdHJpbmdzOwotCi0gIC8qIGdldCBhbiBlc3RpbWF0ZSBhcyB0byB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgYnkgY291bnRpbmcgZG91YmxlCi0gICAgIHF1b3RlcyAqLwotICBhcHByb3hfbnJfc3RyaW5ncyA9IDI7Ci0gIGZvciAoY2hwID0gcHJvcGVydHlfdmFsdWU7ICpjaHA7IGNocCsrKSB7Ci0gICAgaWYgKCpjaHAgPT0gJyInKQotICAgICAgYXBwcm94X25yX3N0cmluZ3MrKzsKLSAgfQotICBhcHByb3hfbnJfc3RyaW5ncyA9IChhcHByb3hfbnJfc3RyaW5ncykgLyAyOwotCi0gIC8qIGNyZWF0ZSBhIHN0cmluZyBidWZmZXIgZm9yIHRoYXQgbWFueSAocGx1cyBhIG51bGwpICovCi0gIHN0cmluZ3MgPSAoY2hhcioqKXphbGxvYygoYXBwcm94X25yX3N0cmluZ3MgKyAxKSAqIHNpemVvZihjaGFyKikpOwotCi0gIC8qIG5vdyBmaW5kIGFsbCB0aGUgc3RyaW5ncyAqLwotICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKLSAgbnJfc3RyaW5ncyA9IDA7Ci0gIHdoaWxlICgxKSB7Ci0KLSAgICAvKiBza2lwIGxlYWRpbmcgc3BhY2UgKi8KLSAgICB3aGlsZSAoKmNocCAhPSAnXDAnICYmIGlzc3BhY2UoKmNocCkpCi0gICAgICBjaHAgKz0gMTsKLSAgICBpZiAoKmNocCA9PSAnXDAnKQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBjb3B5IGl0IGluICovCi0gICAgaWYgKCpjaHAgPT0gJyInKSB7Ci0gICAgICAvKiBhIHF1b3RlZCBzdHJpbmcgLSB3YXRjaCBmb3IgJ1wnIGV0LmFsLiAqLwotICAgICAgLyogZXN0aW1hdGUgdGhlIHNpemUgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciBpdCAqLwotICAgICAgaW50IHBvczsKLSAgICAgIGNocCsrOwotICAgICAgcG9zID0gMDsKLSAgICAgIHdoaWxlIChjaHBbcG9zXSAhPSAnXDAnICYmIGNocFtwb3NdICE9ICciJykgewotCWlmIChjaHBbcG9zXSA9PSAnXFwnICYmIGNocFtwb3MrMV0gIT0gJ1wwJykKLQkgIHBvcyArPSAyOwotCWVsc2UKLQkgIHBvcyArPSAxOwotICAgICAgfQotICAgICAgc3RyaW5nc1tucl9zdHJpbmdzXSA9IHphbGxvYyhwb3MgKyAxKTsKLSAgICAgIC8qIGNvcHkgdGhlIHN0cmluZyBvdmVyICovCi0gICAgICBwb3MgPSAwOwotICAgICAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiAqY2hwICE9ICciJykgewotCWlmICgqY2hwID09ICdcXCcgJiYgKihjaHArMSkgIT0gJ1wwJykgewotCSAgc3RyaW5nc1tucl9zdHJpbmdzXVtwb3NdID0gKihjaHArMSk7Ci0JICBjaHAgKz0gMjsKLQkgIHBvcysrOwotCX0KLQllbHNlIHsKLQkgIHN0cmluZ3NbbnJfc3RyaW5nc11bcG9zXSA9ICpjaHA7Ci0JICBjaHAgKz0gMTsKLQkgIHBvcysrOwotCX0KLSAgICAgIH0KLSAgICAgIGlmICgqY2hwICE9ICdcMCcpCi0JY2hwKys7Ci0gICAgICBzdHJpbmdzW25yX3N0cmluZ3NdW3Bvc10gPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGNvcHkgb3ZlciBhIHNpbmdsZSB1bnF1b3RlZCB0b2tlbiAqLwotICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICB3aGlsZSAoY2hwW2xlbl0gIT0gJ1wwJyAmJiAhaXNzcGFjZShjaHBbbGVuXSkpCi0JbGVuKys7Ci0gICAgICBzdHJpbmdzW25yX3N0cmluZ3NdID0gemFsbG9jKGxlbiArIDEpOwotICAgICAgc3RybmNweShzdHJpbmdzW25yX3N0cmluZ3NdLCBjaHAsIGxlbik7Ci0gICAgICBzdHJpbmdzW25yX3N0cmluZ3NdW2xlbl0gPSAnXDAnOwotICAgICAgY2hwICs9IGxlbjsKLSAgICB9Ci0gICAgbnJfc3RyaW5ncysrOwotICAgIGlmIChucl9zdHJpbmdzID4gYXBwcm94X25yX3N0cmluZ3MpCi0gICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgIlN0cmluZyBwcm9wZXJ0eSAlcyBiYWRseSBmb3JtYXR0ZWQiLAotCQkgICBwcm9wZXJ0eV9uYW1lKTsKLSAgfQotICBBU1NFUlQoc3RyaW5nc1tucl9zdHJpbmdzXSA9PSBOVUxMKTsgLyogZnJvbSB6YWxsb2MgKi8KLQotICAvKiBpbnN0YWxsIGl0ICovCi0gIGlmIChucl9zdHJpbmdzID09IDApCi0gICAgZGV2aWNlX2FkZF9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgIiIpOwotICBlbHNlIGlmIChucl9zdHJpbmdzID09IDEpCi0gICAgZGV2aWNlX2FkZF9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgc3RyaW5nc1swXSk7Ci0gIGVsc2UgewotICAgIGNvbnN0IGNoYXIgKipzcGVjcyA9IChjb25zdCBjaGFyKiopc3RyaW5nczsgLyogc3RvcCBhIGJvZ3VzIGVycm9yICovCi0gICAgZGV2aWNlX2FkZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKLQkJCQkgICAgIHNwZWNzLCBucl9zdHJpbmdzKTsKLSAgfQotCi0gIC8qIGZsdXNoIHRoZSBjcmVhdGVkIHN0cmluZyAqLwotICB3aGlsZSAobnJfc3RyaW5ncyA+IDApIHsKLSAgICBucl9zdHJpbmdzLS07Ci0gICAgemZyZWUoc3RyaW5nc1tucl9zdHJpbmdzXSk7Ci0gIH0KLSAgemZyZWUoc3RyaW5ncyk7Ci19Ci0KLQotLyogPHBhdGgtdG8taWhhbmRsZS1kZXZpY2U+ICovCi0KLVNUQVRJQ19JTkxJTkVfVFJFRVwKLSh2b2lkKQotcGFyc2VfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCi0JCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBpaGFuZGxlOwotCi0gIC8qIHBhc3MgdGhlIGZ1bGwgcGF0aCAqLwotICBpaGFuZGxlLmZ1bGxfcGF0aCA9IHZhbHVlOwotCi0gIC8qIHNhdmUgdGhpcyByZWFkeSBmb3IgdGhlIGloYW5kbGUgY3JlYXRlICovCi0gIGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5LAotCQkJCSAgICAgICZpaGFuZGxlKTsKLX0KLQotCi0KLUVYVEVSTl9UUkVFXAotKGRldmljZSAqKQotdHJlZV9wYXJzZShkZXZpY2UgKmN1cnJlbnQsCi0JICAgY29uc3QgY2hhciAqZm10LAotCSAgIC4uLikKLXsKLSAgY2hhciBkZXZpY2Vfc3BlY2lmaWVyWzEwMjRdOwotICBuYW1lX3NwZWNpZmllciBzcGVjOwotCi0gIC8qIGZvcm1hdCB0aGUgcGF0aCAqLwotICB7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2c3ByaW50ZihkZXZpY2Vfc3BlY2lmaWVyLCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotICAgIGlmIChzdHJsZW4oZGV2aWNlX3NwZWNpZmllcikgPj0gc2l6ZW9mKGRldmljZV9zcGVjaWZpZXIpKQotICAgICAgZXJyb3IoImRldmljZV90cmVlX2FkZF9kZXZpY2VkOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwotICB9Ci0KLSAgLyogY29uc3RydWN0IHRoZSB0cmVlIGRvd24gdG8gdGhlIGZpbmFsIGRldmljZSAqLwotICBjdXJyZW50ID0gc3BsaXRfZmlsbF9wYXRoKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsICZzcGVjKTsKLQotICAvKiBpcyB0aGVyZSBhbiBpbnRlcnJ1cHQgc3BlYyAqLwotICBpZiAoc3BlYy5wcm9wZXJ0eSA9PSBOVUxMCi0gICAgICAmJiBzcGVjLnZhbHVlICE9IE5VTEwpIHsKLSAgICBjaGFyICpvcCA9IHNwbGl0X3ZhbHVlKCZzcGVjKTsKLSAgICBzd2l0Y2ggKG9wWzBdKSB7Ci0gICAgY2FzZSAnPic6Ci0gICAgICB7Ci0JY2hhciAqbXlfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUoJnNwZWMpOwotCWludCBteV9wb3J0OwotCWNoYXIgKmRlc3RfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUoJnNwZWMpOwotCWludCBkZXN0X3BvcnQ7Ci0JbmFtZV9zcGVjaWZpZXIgZGVzdF9zcGVjOwotCWNoYXIgKmRlc3RfZGV2aWNlX25hbWUgPSBzcGxpdF92YWx1ZSgmc3BlYyk7Ci0JZGV2aWNlICpkZXN0OwotCS8qIGZpbmQgbXkgbmFtZSAqLwotCW15X3BvcnQgPSBkZXZpY2VfaW50ZXJydXB0X2RlY29kZShjdXJyZW50LCBteV9wb3J0X25hbWUsCi0JCQkJCSAgb3V0cHV0X3BvcnQpOwotCS8qIGZpbmQgdGhlIGRlc3QgZGV2aWNlIGFuZCBwb3J0ICovCi0JZGVzdCA9IHNwbGl0X2ZpbGxfcGF0aChjdXJyZW50LCBkZXN0X2RldmljZV9uYW1lLCAmZGVzdF9zcGVjKTsKLQlkZXN0X3BvcnQgPSBkZXZpY2VfaW50ZXJydXB0X2RlY29kZShkZXN0LCBkZXN0X3BvcnRfbmFtZSwKLQkJCQkJICAgIGlucHV0X3BvcnQpOwotCS8qIGNvbm5lY3QgdGhlIHR3byAqLwotCWRldmljZV9pbnRlcnJ1cHRfYXR0YWNoKGN1cnJlbnQsCi0JCQkJbXlfcG9ydCwKLQkJCQlkZXN0LAotCQkJCWRlc3RfcG9ydCwKLQkJCQlwZXJtZW5hbnRfb2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgInVucmVjb25pc2VkIGludGVycnVwdCBzcGVjICVzXG4iLCBzcGVjLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qIGlzIHRoZXJlIGEgcHJvcGVydHkgKi8KLSAgaWYgKHNwZWMucHJvcGVydHkgIT0gTlVMTCkgewotICAgIGlmIChzdHJjbXAoc3BlYy52YWx1ZSwgInRydWUiKSA9PSAwKQotICAgICAgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIDEpOwotICAgIGVsc2UgaWYgKHN0cmNtcChzcGVjLnZhbHVlLCAiZmFsc2UiKSA9PSAwKQotICAgICAgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIDApOwotICAgIGVsc2UgewotICAgICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eTsKLSAgICAgIHN3aXRjaCAoc3BlYy52YWx1ZVswXSkgewotICAgICAgY2FzZSAnKic6Ci0JcGFyc2VfaWhhbmRsZV9wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlICsgMSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdbJzoKLQl7Ci0JICB1bnNpZ25lZDggd29yZHNbMTAyNF07Ci0JICBjaGFyICpjdXJyID0gc3BlYy52YWx1ZSArIDE7Ci0JICBpbnQgbnJfd29yZHMgPSAwOwotCSAgd2hpbGUgKDEpIHsKLQkgICAgY2hhciAqbmV4dDsKLQkgICAgd29yZHNbbnJfd29yZHNdID0gSDJCRV8xKHN0cnRvdWwoY3VyciwgJm5leHQsIDApKTsKLQkgICAgaWYgKGN1cnIgPT0gbmV4dCkKLQkgICAgICBicmVhazsKLQkgICAgY3VyciA9IG5leHQ7Ci0JICAgIG5yX3dvcmRzICs9IDE7Ci0JICB9Ci0JICBkZXZpY2VfYWRkX2FycmF5X3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksCi0JCQkJICAgIHdvcmRzLCBzaXplb2Yod29yZHNbMF0pICogbnJfd29yZHMpOwotCX0KLQlicmVhazsKLSAgICAgIGNhc2UgJyInOgotCXBhcnNlX3N0cmluZ19wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJyEnOgotCXNwZWMudmFsdWUrKzsKLQlwcm9wZXJ0eSA9IHRyZWVfZmluZF9wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnZhbHVlKTsKLQlpZiAocHJvcGVydHkgPT0gTlVMTCkKLQkgIGRldmljZV9lcnJvcihjdXJyZW50LCAicHJvcGVydHkgJXMgbm90IGZvdW5kXG4iLCBzcGVjLnZhbHVlKTsKLQlkZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShjdXJyZW50LAotCQkJCSAgICAgIHNwZWMucHJvcGVydHksCi0JCQkJICAgICAgcHJvcGVydHkpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlpZiAoc3RyY21wKHNwZWMucHJvcGVydHksICJyZWciKSA9PSAwCi0JICAgIHx8IHN0cmNtcChzcGVjLnByb3BlcnR5LCAiYXNzaWduZWQtYWRkcmVzc2VzIikgPT0gMAotCSAgICB8fCBzdHJjbXAoc3BlYy5wcm9wZXJ0eSwgImFsdGVybmF0ZS1yZWciKSA9PSAwKXsKLQkgIHBhcnNlX3JlZ19wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKHNwZWMucHJvcGVydHksICJyYW5nZXMiKSA9PSAwKSB7Ci0JICBwYXJzZV9yYW5nZXNfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7Ci0JfQotCWVsc2UgaWYgKGlzZGlnaXQoc3BlYy52YWx1ZVswXSkKLQkJIHx8IChzcGVjLnZhbHVlWzBdID09ICctJyAmJiBpc2RpZ2l0KHNwZWMudmFsdWVbMV0pKQotCQkgfHwgKHNwZWMudmFsdWVbMF0gPT0gJysnICYmIGlzZGlnaXQoc3BlYy52YWx1ZVsxXSkpKSB7Ci0JICBwYXJzZV9pbnRlZ2VyX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIHNwZWMudmFsdWUpOwotCX0KLQllbHNlCi0JICBwYXJzZV9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBjdXJyZW50OwotfQotCi0KLUlOTElORV9UUkVFXAotKHZvaWQpCi10cmVlX3RyYXZlcnNlKGRldmljZSAqcm9vdCwKLQkgICAgICB0cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwcmVmaXgsCi0JICAgICAgdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcG9zdGZpeCwKLQkgICAgICB2b2lkICpkYXRhKQotewotICBkZXZpY2UgKmNoaWxkOwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgcHJlZml4KHJvb3QsIGRhdGEpOwotICBmb3IgKGNoaWxkID0gZGV2aWNlX2NoaWxkKHJvb3QpOwotICAgICAgIGNoaWxkICE9IE5VTEw7Ci0gICAgICAgY2hpbGQgPSBkZXZpY2Vfc2libGluZyhjaGlsZCkpIHsKLSAgICB0cmVlX3RyYXZlcnNlKGNoaWxkLCBwcmVmaXgsIHBvc3RmaXgsIGRhdGEpOwotICB9Ci0gIGlmIChwb3N0Zml4ICE9IE5VTEwpCi0gICAgcG9zdGZpeChyb290LCBkYXRhKTsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXByaW50X2FkZHJlc3MoZGV2aWNlICpidXMsCi0JICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnBoeXMpCi17Ci0gIGNoYXIgdW5pdFszMl07Ci0gIGRldmljZV9lbmNvZGVfdW5pdChidXMsIHBoeXMsIHVuaXQsIHNpemVvZih1bml0KSk7Ci0gIHByaW50Zl9maWx0ZXJlZCgiICVzIiwgdW5pdCk7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfVFJFRVwKLSh2b2lkKQotcHJpbnRfc2l6ZShkZXZpY2UgKmJ1cywKLQkgICBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplLT5ucl9jZWxsczsgaSsrKQotICAgIGlmIChzaXplLT5jZWxsc1tpXSAhPSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChpIDwgc2l6ZS0+bnJfY2VsbHMpIHsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAweCVseCIsICh1bnNpZ25lZCBsb25nKXNpemUtPmNlbGxzW2ldKTsKLSAgICBpKys7Ci0gICAgZm9yICg7IGkgPCBzaXplLT5ucl9jZWxsczsgaSsrKQotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIsMHglbHgiLCAodW5zaWduZWQgbG9uZylzaXplLT5jZWxsc1tpXSk7Ci0gIH0KLSAgZWxzZQotICAgIHByaW50Zl9maWx0ZXJlZCgiIDAiKTsKLX0KLQotU1RBVElDX0lOTElORV9UUkVFXAotKHZvaWQpCi1wcmludF9yZWdfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eSkKLXsKLSAgaW50IHJlZ19ucjsKLSAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOwotICBmb3IgKHJlZ19uciA9IDA7Ci0gICAgICAgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgcmVnX25yLCAmcmVnKTsKLSAgICAgICByZWdfbnIrKykgewotICAgIHByaW50X2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZyZWcuYWRkcmVzcyk7Ci0gICAgcHJpbnRfc2l6ZShtZSwgJnJlZy5zaXplKTsKLSAgfQotfQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXByaW50X3Jhbmdlc19wcm9wZXJ0eShkZXZpY2UgKm1lLAotCQkgICAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3BlcnR5KQotewotICBpbnQgcmFuZ2VfbnI7Ci0gIHJhbmdlX3Byb3BlcnR5X3NwZWMgcmFuZ2U7Ci0gIGZvciAocmFuZ2VfbnIgPSAwOwotICAgICAgIGRldmljZV9maW5kX3JhbmdlX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgcmFuZ2VfbnIsICZyYW5nZSk7Ci0gICAgICAgcmFuZ2VfbnIrKykgewotICAgIHByaW50X2FkZHJlc3MobWUsICZyYW5nZS5jaGlsZF9hZGRyZXNzKTsKLSAgICBwcmludF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLCAmcmFuZ2UucGFyZW50X2FkZHJlc3MpOwotICAgIHByaW50X3NpemUobWUsICZyYW5nZS5zaXplKTsKLSAgfQotfQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXByaW50X3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gIHByaW50Zl9maWx0ZXJlZCgiIFwiIik7Ci0gIHdoaWxlICgqc3RyaW5nICE9ICdcMCcpIHsKLSAgICBzd2l0Y2ggKCpzdHJpbmcpIHsKLSAgICBjYXNlICciJzoKLSAgICAgIHByaW50Zl9maWx0ZXJlZCgiXFxcIiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXFwnOgotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJcXFxcIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlYyIsICpzdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZysrOwotICB9Ci0gIHByaW50Zl9maWx0ZXJlZCgiXCIiKTsKLX0KLQotU1RBVElDX0lOTElORV9UUkVFXAotKHZvaWQpCi1wcmludF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKLQkJCSAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3BlcnR5KQotewotICBpbnQgbnI7Ci0gIHN0cmluZ19wcm9wZXJ0eV9zcGVjIHN0cmluZzsKLSAgZm9yIChuciA9IDA7Ci0gICAgICAgZGV2aWNlX2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgbnIsICZzdHJpbmcpOwotICAgICAgIG5yKyspIHsKLSAgICBwcmludF9zdHJpbmcoc3RyaW5nKTsKLSAgfQotfQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXByaW50X3Byb3BlcnRpZXMoZGV2aWNlICptZSkKLXsKLSAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eTsKLSAgZm9yIChwcm9wZXJ0eSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBOVUxMKTsKLSAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOwotICAgICAgIHByb3BlcnR5ID0gZGV2aWNlX25leHRfcHJvcGVydHkocHJvcGVydHkpKSB7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIlcy8lcyIsIGRldmljZV9wYXRoKG1lKSwgcHJvcGVydHktPm5hbWUpOwotICAgIGlmIChwcm9wZXJ0eS0+b3JpZ2luYWwgIT0gTlVMTCkgewotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIgISIpOwotICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlcy8lcyIsIAotCQkgICAgICBkZXZpY2VfcGF0aChwcm9wZXJ0eS0+b3JpZ2luYWwtPm93bmVyKSwKLQkJICAgICAgcHJvcGVydHktPm9yaWdpbmFsLT5uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzd2l0Y2ggKHByb3BlcnR5LT50eXBlKSB7Ci0gICAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgotCWlmICgocHJvcGVydHktPnNpemVvZl9hcnJheSAlIHNpemVvZihzaWduZWRfY2VsbCkpID09IDApIHsKLQkgIHVuc2lnbmVkX2NlbGwgKncgPSAodW5zaWduZWRfY2VsbCopcHJvcGVydHktPmFycmF5OwotCSAgaW50IGNlbGxfbnI7Ci0JICBmb3IgKGNlbGxfbnIgPSAwOwotCSAgICAgICBjZWxsX25yIDwgKHByb3BlcnR5LT5zaXplb2ZfYXJyYXkgLyBzaXplb2YodW5zaWduZWRfY2VsbCkpOwotCSAgICAgICBjZWxsX25yKyspIHsKLQkgICAgcHJpbnRmX2ZpbHRlcmVkKCIgMHglbHgiLCAodW5zaWduZWQgbG9uZylCRTJIX2NlbGwod1tjZWxsX25yXSkpOwotCSAgfQotCX0KLQllbHNlIHsKLQkgIHVuc2lnbmVkOCAqdyA9ICh1bnNpZ25lZDgqKXByb3BlcnR5LT5hcnJheTsKLQkgIHByaW50Zl9maWx0ZXJlZCgiIFsiKTsKLQkgIHdoaWxlICgoY2hhciopdyAtIChjaGFyKilwcm9wZXJ0eS0+YXJyYXkgPCBwcm9wZXJ0eS0+c2l6ZW9mX2FycmF5KSB7Ci0JICAgIHByaW50Zl9maWx0ZXJlZCgiIDB4JTJ4IiwgQkUySF8xKCp3KSk7Ci0JICAgIHcrKzsKLQkgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6Ci0JewotCSAgaW50IGIgPSBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSk7Ci0JICBwcmludGZfZmlsdGVyZWQoIiAlcyIsIGIgPyAidHJ1ZSIgIDogImZhbHNlIik7Ci0JfQotCWJyZWFrOwotICAgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgotCXsKLQkgIGlmIChwcm9wZXJ0eS0+YXJyYXkgIT0gTlVMTCkgewotCSAgICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlID0gZGV2aWNlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShtZSwgcHJvcGVydHktPm5hbWUpOwotCSAgICBwcmludGZfZmlsdGVyZWQoIiAqJXMiLCBkZXZpY2VfaW5zdGFuY2VfcGF0aChpbnN0YW5jZSkpOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIGFzayB0aGUgZGV2aWNlIGZvciB0aGUgcGF0aCAqLwotCSAgICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBzcGVjOwotCSAgICBkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkobWUsIHByb3BlcnR5LT5uYW1lLCAmc3BlYyk7Ci0JICAgIHByaW50Zl9maWx0ZXJlZCgiIColcyIsIHNwZWMuZnVsbF9wYXRoKTsKLQkgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGludGVnZXJfcHJvcGVydHk6Ci0JewotCSAgdW5zaWduZWRfd29yZCB3ID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgcHJvcGVydHktPm5hbWUpOwotCSAgcHJpbnRmX2ZpbHRlcmVkKCIgMHglbHgiLCAodW5zaWduZWQgbG9uZyl3KTsKLQl9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIHJhbmdlX2FycmF5X3Byb3BlcnR5OgotCXByaW50X3Jhbmdlc19wcm9wZXJ0eShtZSwgcHJvcGVydHkpOwotCWJyZWFrOwotICAgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6Ci0JcHJpbnRfcmVnX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKLQl7Ci0JICBjb25zdCBjaGFyICpzID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSk7Ci0JICBwcmludF9zdHJpbmcocyk7Ci0JfQotCWJyZWFrOwotICAgICAgY2FzZSBzdHJpbmdfYXJyYXlfcHJvcGVydHk6Ci0JcHJpbnRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKLSAgfQotfQotCi1TVEFUSUNfSU5MSU5FX1RSRUVcCi0odm9pZCkKLXByaW50X2ludGVycnVwdHMoZGV2aWNlICptZSwKLQkJIGludCBteV9wb3J0LAotCQkgZGV2aWNlICpkZXN0LAotCQkgaW50IGRlc3RfcG9ydCwKLQkJIHZvaWQgKmlnbm9yZV9vcl9udWxsKQotewotICBjaGFyIHNyY1szMl07Ci0gIGNoYXIgZHN0WzMyXTsKLSAgZGV2aWNlX2ludGVycnVwdF9lbmNvZGUobWUsIG15X3BvcnQsIHNyYywgc2l6ZW9mKHNyYyksIG91dHB1dF9wb3J0KTsKLSAgZGV2aWNlX2ludGVycnVwdF9lbmNvZGUoZGVzdCwgZGVzdF9wb3J0LCBkc3QsIHNpemVvZihkc3QpLCBpbnB1dF9wb3J0KTsKLSAgcHJpbnRmX2ZpbHRlcmVkKCIlcyA+ICVzICVzICVzXG4iLAotCQkgIGRldmljZV9wYXRoKG1lKSwKLQkJICBzcmMsIGRzdCwKLQkJICBkZXZpY2VfcGF0aChkZXN0KSk7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfVFJFRVwKLSh2b2lkKQotcHJpbnRfZGV2aWNlKGRldmljZSAqbWUsCi0JICAgICB2b2lkICppZ25vcmVfb3JfbnVsbCkKLXsKLSAgcHJpbnRmX2ZpbHRlcmVkKCIlc1xuIiwgZGV2aWNlX3BhdGgobWUpKTsKLSAgcHJpbnRfcHJvcGVydGllcyhtZSk7Ci0gIGRldmljZV9pbnRlcnJ1cHRfdHJhdmVyc2UobWUsIHByaW50X2ludGVycnVwdHMsIE5VTEwpOwotfQotCi1JTkxJTkVfVFJFRVwKLSh2b2lkKQotdHJlZV9wcmludChkZXZpY2UgKnJvb3QpCi17Ci0gIHRyZWVfdHJhdmVyc2Uocm9vdCwKLQkJcHJpbnRfZGV2aWNlLCBOVUxMLAotCQlOVUxMKTsKLX0KLQotCi1JTkxJTkVfVFJFRVwKLSh2b2lkKQotdHJlZV91c2FnZShpbnQgdmVyYm9zZSkKLXsKLSAgaWYgKHZlcmJvc2UgPT0gMSkgewotICAgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIkEgZGV2aWNlL3Byb3BlcnR5IHNwZWNpZmllciBoYXMgdGhlIGZvcm06XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIC9wYXRoL3RvL2EvZGV2aWNlIFsgcHJvcGVydHktdmFsdWUgXVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiYW5kIGEgcG9zc2libGUgZGV2aWNlIGlzXG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gIH0KLSAgaWYgKHZlcmJvc2UgPiAxKSB7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiQSBkZXZpY2UvcHJvcGVydHkgc3BlY2lmaWVyICg8c3BlYz4pIGhhcyB0aGUgZm9ybWF0OlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiICA8c3BlYz4gOjo9IDxwYXRoPiBbIDx2YWx1ZT4gXSA7XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgPHBhdGg+IDo6PSB7IDxwcmVmaXg+IH0geyA8bm9kZT4gXCIvXCIgfSA8bm9kZT4gO1xuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxwcmVmaXg+IDo6PSAoIHwgXCIvXCIgfCBcIi4uL1wiIHwgXCIuL1wiICkgO1xuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxub2RlPiA6Oj0gPG5hbWU+IFsgXCJAXCIgPHVuaXQ+IF0gWyBcIjpcIiA8YXJncz4gXSA7XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgPHVuaXQ+IDo6PSA8bnVtYmVyPiB7IFwiLFwiIDxudW1iZXI+IH0gO1xuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiV2hlcmU6XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxuYW1lPiAgaXMgdGhlIG5hbWUgb2YgYSBkZXZpY2UgKGxpc3QgYmVsb3cpXG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgPHVuaXQ+ICBpcyB0aGUgdW5pdC1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgYnVzXG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgPGFyZ3M+ICBhZGRpdGlvbmFsIGFyZ3VtZW50cyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGRldmljZVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDx2YWx1ZT4gOjo9ICggPG51bWJlcj4gIyBpbnRlZ2VyIHByb3BlcnR5XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgICAgICAgICAgICAgfCBcIltcIiB7IDxudW1iZXI+IH0gIyBhcnJheSBwcm9wZXJ0eSAoYnl0ZSlcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwie1wiIHsgPG51bWJlcj4gfSAjIGFycmF5IHByb3BlcnR5IChjZWxsKVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgWyBcInRydWVcIiB8IFwiZmFsc2VcIiBdICMgYm9vbGVhbiBwcm9wZXJ0eVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCIqXCIgPHBhdGg+ICMgaWhhbmRsZSBwcm9wZXJ0eVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCIhXCIgPHBhdGg+ICMgY29weSBwcm9wZXJ0eVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCI+XCIgWyA8bnVtYmVyPiBdIDxwYXRoPiAjIGF0dGFjaCBpbnRlcnJ1cHRcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwiPFwiIDxwYXRoPiAjIGF0dGFjaCBjaGlsZCBpbnRlcnJ1cHRcbiIpOwotICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwiXFxcIlwiIDx0ZXh0PiAjIHN0cmluZyBwcm9wZXJ0eVxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgPHRleHQ+ICMgc3RyaW5nIHByb3BlcnR5XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIiAgICAgICAgICAgICAgKSA7XG4iKTsKLSAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJBbmQgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgZGV2aWNlIG5hbWVzOlxuIik7Ci0gICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOwotICB9Ci19Ci0KLQotCi1JTkxJTkVfVFJFRVwKLShkZXZpY2VfaW5zdGFuY2UgKikKLXRyZWVfaW5zdGFuY2UoZGV2aWNlICpyb290LAotCSAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9zcGVjaWZpZXIpCi17Ci0gIC8qIGZpbmQgdGhlIGRldmljZSBub2RlICovCi0gIGRldmljZSAqbWU7Ci0gIG5hbWVfc3BlY2lmaWVyIHNwZWM7Ci0gIGlmICghc3BsaXRfZGV2aWNlX3NwZWNpZmllcihyb290LCBkZXZpY2Vfc3BlY2lmaWVyLCAmc3BlYykpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG1lID0gc3BsaXRfZmluZF9kZXZpY2Uocm9vdCwgJnNwZWMpOwotICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIC8qIGNyZWF0ZSB0aGUgaW5zdGFuY2UgKi8KLSAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2UobWUsIGRldmljZV9zcGVjaWZpZXIsIHNwZWMubGFzdF9hcmdzKTsKLX0KLQotCi1JTkxJTkVfVFJFRVwKLShkZXZpY2UgKikKLXRyZWVfZmluZF9kZXZpY2UoZGV2aWNlICpyb290LAotCQkgY29uc3QgY2hhciAqcGF0aF90b19kZXZpY2UpCi17Ci0gIGRldmljZSAqbm9kZTsKLSAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKLQotICAvKiBwYXJzZSB0aGUgcGF0aCAqLwotICBzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKHJvb3QsIHBhdGhfdG9fZGV2aWNlLCAmc3BlYyk7Ci0gIGlmIChzcGVjLnZhbHVlICE9IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7IC8qIHNvbWV0aGluZyB3aWVyZCAqLwotCi0gIC8qIG5vdyBmaW5kIGl0ICovCi0gIG5vZGUgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7Ci0gIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsgLyogbm90IGEgbGVhZiAqLwotCi0gIHJldHVybiBub2RlOwotfQotCi0KLUlOTElORV9UUkVFXAotKGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqKQotdHJlZV9maW5kX3Byb3BlcnR5KGRldmljZSAqcm9vdCwKLQkJICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKLXsKLSAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKLSAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQotICAgIGRldmljZV9lcnJvcihyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7Ci0gIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7Ci0gIHJldHVybiBkZXZpY2VfZmluZF9wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKLX0KLQotSU5MSU5FX1RSRUVcCi0oaW50KQotdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkoZGV2aWNlICpyb290LAotCQkJICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKLXsKLSAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKLSAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQotICAgIGRldmljZV9lcnJvcihyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7Ci0gIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7Ci0gIHJldHVybiBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsIHNwZWMucHJvcGVydHkpOwotfQotCi1JTkxJTkVfVFJFRVwKLShzaWduZWRfY2VsbCkKLXRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KGRldmljZSAqcm9vdCwKLQkJCSAgIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpCi17Ci0gIG5hbWVfc3BlY2lmaWVyIHNwZWM7Ci0gIGlmICghc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKHJvb3QsIHBhdGhfdG9fcHJvcGVydHksICZzcGVjKSkKLSAgICBkZXZpY2VfZXJyb3Iocm9vdCwgIkludmFsaWQgcHJvcGVydHkgcGF0aCAlcyIsIHBhdGhfdG9fcHJvcGVydHkpOwotICByb290ID0gc3BsaXRfZmluZF9kZXZpY2Uocm9vdCwgJnNwZWMpOwotICByZXR1cm4gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKLX0KLQotSU5MSU5FX1RSRUVcCi0oZGV2aWNlX2luc3RhbmNlICopCi10cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKnJvb3QsCi0JCQkgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQotewotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcihyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCi0gICAgZGV2aWNlX2Vycm9yKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKLSAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlKHJvb3QsICZzcGVjKTsKLSAgcmV0dXJuIGRldmljZV9maW5kX2loYW5kbGVfcHJvcGVydHkocm9vdCwgc3BlYy5wcm9wZXJ0eSk7Ci19Ci0KLUlOTElORV9UUkVFXAotKGNvbnN0IGNoYXIgKikKLXRyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkoZGV2aWNlICpyb290LAotCQkJICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQotewotICBuYW1lX3NwZWNpZmllciBzcGVjOwotICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcihyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCi0gICAgZGV2aWNlX2Vycm9yKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKLSAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlKHJvb3QsICZzcGVjKTsKLSAgcmV0dXJuIGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKLX0KLQotCi0jZW5kaWYgLyogX1BBUlNFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3RyZWUuaCBiL3NpbS9wcGMvdHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU5MGNiLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgX1RSRUVfSF8KLSNkZWZpbmUgX1RSRUVfSF8KLQotI2lmbmRlZiBJTkxJTkVfVFJFRQotI2RlZmluZSBJTkxJTkVfVFJFRQotI2VuZGlmCi0KLS8qIENvbnN0cnVjdGluZyB0aGUgZGV2aWNlIHRyZWU6Ci0KLSAgIFRoZSBpbml0aWFsIGRldmljZSB0cmVlIHBvcHVsYXRlZCB3aXRoIGRldmljZXMgYW5kIGJhc2ljIHByb3BlcnRpZXMKLSAgIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIDw8ZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCgpPj4uICBUaGlzCi0gICBmdW5jdGlvbiBwYXJzZXMgYSBQU0lNIGRldmljZSBzcGVjaWZpY2F0aW9uIGFuZCB1c2VzIGl0IHRvIHBvcHVsYXRlCi0gICB0aGUgdHJlZSBhY2NvcmRpbmdseS4KLQotICAgVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGEgcHJpbnRmIHN0eWxlIGZvcm1hdHRlZCBzdHJpbmcgYXMgdGhlCi0gICBhcmd1bWVudCB0aGF0IGRlc2NyaWJlcyB0aGUgZW50cnkuICBBbnkgcHJvcGVydGllcyBvciBpbnRlcnJ1cHQKLSAgIGNvbm5lY3Rpb25zIGFkZGVkIHRvIGEgZGV2aWNlIHRyZWUgdXNpbmcgdGhpcyBmdW5jdGlvbiBhcmUgbWFya2VkCi0gICBhcyBoYXZpbmcgYSBwZXJtZW5hbnQgZGlzcG9zaXRpb24uICBXaGVuIHRoZSB0cmVlIGlzIChyZSkKLSAgIGluaXRpYWxpemVkIHRoZXkgd2lsbCBiZSByZXN0b3JlZCB0byB0aGVpciBpbml0aWFsIHZhbHVlLgotCi0gICAqLwotCi1FWFRFUk5fVFJFRVwKLShkZXZpY2UgKikgdHJlZV9wYXJzZQotKGRldmljZSAqcm9vdCwKLSBjb25zdCBjaGFyICpmbXQsCi0gLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0KLQotSU5MSU5FX1RSRUVcCi0odm9pZCkgdHJlZV91c2FnZQotKGludCB2ZXJib3NlKTsKLQotSU5MSU5FX1RSRUVcCi0odm9pZCkgdHJlZV9wcmludAotKGRldmljZSAqcm9vdCk7Ci0KLUlOTElORV9UUkVFXAotKGRldmljZV9pbnN0YW5jZSopIHRyZWVfaW5zdGFuY2UKLShkZXZpY2UgKnJvb3QsCi0gY29uc3QgY2hhciAqZGV2aWNlX3NwZWNpZmllcik7Ci0KLQotLyogVHJlZSB0cmF2ZXJzYWw6OgotCi0gICBUaGUgZW50aXJlIGRldmljZSB0cmVlIGNhbiBiZSB0cmF2ZXJzZWQgdXNpbmcgdGhlCi0gICA8PGRldmljZV90cmVlX3RyYXZlcnNlKCk+PiBmdW5jdGlvbi4gIFRoZSB0cmF2ZXJzYWwgY2FuIGJlIGluCi0gICBlaXRoZXIgcHJlLSBvciBwb3N0Zml4IG9yZGVyLgotCi0gICAqLwotCi10eXBlZGVmIHZvaWQgKHRyZWVfdHJhdmVyc2VfZnVuY3Rpb24pCi0gICAgIChkZXZpY2UgKmRldmljZSwKLSAgICAgIHZvaWQgKmRhdGEpOwotCi1JTkxJTkVfREVWSUNFXAotKHZvaWQpIHRyZWVfdHJhdmVyc2UKLShkZXZpY2UgKnJvb3QsCi0gdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcHJlZml4LAotIHRyZWVfdHJhdmVyc2VfZnVuY3Rpb24gKnBvc3RmaXgsCi0gdm9pZCAqZGF0YSk7Ci0KLQotLyogVHJlZSBsb29rdXA6OgotCi0gICBUaGUgZnVuY3Rpb24gPDx0cmVlX2ZpbmRfZGV2aWNlKCk+PiB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlCi0gICB0aGUgc3BlY2lmaWVkIGRldmljZSB3aXRoaW4gdGhlIHRyZWUuICBJZiB0aGUgZGV2aWNlIGlzIG5vdCBmb3VuZCBhCi0gICBOVUxMIGRldmljZSBpcyByZXR1cm5lZC4KLQotICAgKi8KLQotSU5MSU5FX1RSRUVcCi0oZGV2aWNlICopIHRyZWVfZmluZF9kZXZpY2UKLShkZXZpY2UgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aCk7Ci0KLQotSU5MSU5FX1RSRUVcCi0oY29uc3QgZGV2aWNlX3Byb3BlcnR5ICopIHRyZWVfZmluZF9wcm9wZXJ0eQotKGRldmljZSAqcm9vdCwKLSBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKLQotSU5MSU5FX1RSRUVcCi0oaW50KSB0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eQotKGRldmljZSAqcm9vdCwKLSBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKLQotSU5MSU5FX1RSRUVcCi0oc2lnbmVkX2NlbGwpIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5Ci0oZGV2aWNlICpyb290LAotIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOwotCi1JTkxJTkVfVFJFRVwKLShkZXZpY2VfaW5zdGFuY2UgKikgdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkKLShkZXZpY2UgKnJvb3QsCi0gY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7Ci0KLUlOTElORV9UUkVFXAotKGNvbnN0IGNoYXIgKikgdHJlZV9maW5kX3N0cmluZ19wcm9wZXJ0eQotKGRldmljZSAqcm9vdCwKLSBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKLQotCi0vKiBJbml0aWFsaXppbmcgdGhlIGNyZWF0ZWQgdHJlZToKLQotICAgT25jZSBhIGRldmljZSB0cmVlIGhhcyBiZWVuIGNyZWF0ZWQgdGhlIDw8ZGV2aWNlX3RyZWVfaW5pdCgpPj4KLSAgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoZSBleGFjdCBzZXF1ZW5jZSBvZiBldmVudHMKLSAgIHRoYXQgb2NjdXJlIGR1cmluZyBpbml0aWFsaXphdGlvbiBhcmUgZGVzY3JpYmVkIHNlcGFyYXRseS4KLQotICAgKi8KLQotSU5MSU5FX1RSRUVcCi0odm9pZCkgdHJlZV9pbml0Ci0oZGV2aWNlICpyb290LAotIHBzaW0gKnN5c3RlbSk7Ci0KLQotI2VuZGlmIC8qIF9UUkVFX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3ZtLmMgYi9zaW0vcHBjL3ZtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjk2MmMuLjAwMDAwMDAKLS0tIGEvc2ltL3BwYy92bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5OCArMCwwIEBACi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KLQotICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAgKi8KLQotCi0jaWZuZGVmIF9WTV9DXwotI2RlZmluZSBfVk1fQ18KLQotI2lmIDAKLSNpbmNsdWRlICJiYXNpY3MuaCIKLSNpbmNsdWRlICJyZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInZtLmgiCi0jaW5jbHVkZSAiaW50ZXJydXB0cy5oIgotI2luY2x1ZGUgIm1vbi5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJjcHUuaCIKLQotLyogT0VBIHZzIFZFQQotCi0gICBGb3IgdGhlIFZFQSBtb2RlbCwgdGhlIFZNIGxheWVyIGlzIGFsbW9zdCB0cmFuc3BhcmVudC4gIEl0J3Mgb25seQotICAgcHVycG9zZSBpcyB0byBtYWludGFpbiBzZXBhcmF0ZSBjb3JlX21hcCdzIGZvciB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGFuZCBkYXRhIGFkZHJlc3Mgc3BhY2VzLiAgVGhpcyBiZWluZyBzbyB0aGF0IHdyaXRlcyB0byBpbnN0cnVjdGlvbgotICAgc3BhY2Ugb3IgZXhlY3V0aW9uIG9mIGEgZGF0YSBzcGFjZSBpcyBwcmV2ZW50ZWQuCi0KLSAgIEZvciB0aGUgT0VBIG1vZGVsIHRoaW5ncyBhcmUgbW9yZSBjb21wbGV4LiAgVGhlIHJlYXNvbiBmb3Igc2VwYXJhdGUKLSAgIGluc3RydWN0aW9uIGFuZCBkYXRhIG1vZGVscyBiZWNvbWVzIGNydWNpYWwuICBUaGUgT0VBIG1vZGVsIGlzCi0gICBidWlsdCBvdXQgb2YgdGhyZWUgcGFydHMuICBBbiBpbnN0cnVjdGlvbiBtYXAsIGEgZGF0YSBtYXAgYW5kIGFuCi0gICB1bmRlcmx5aW5nIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVk0gZGF0YSBrZXB0IGluCi0gICBtYWluIG1lbW9yeS4gKi8KLQotCi0vKiBPRUEgZGF0YSBzdHJ1Y3R1cmVzOgotCi0gICBUaGUgT0VBIG1vZGVsIG1haW50YWlucyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBzaGFkb3cgdGhlCi0gICBzZW1hbnRpY3Mgb2YgdGhlIHZhcmlvdXMgT0VBIFZNIHJlZ2lzdGVycyAoQkFULCBTUiwgZXRjKS4gIFRoaXMKLSAgIGFsbG93cyBhIHNpbXBsZSBlZmZpY2llbnQgbW9kZWwgb2YgdGhlIFZNIHRvIGJlIGltcGxlbWVudGVkLgotCi0gICBDb25zaXN0ZW5jeSBiZXR3ZWVuIE9FQSByZWdpc3RlcnMgYW5kIHRoaXMgbW9kZWwncyBpbnRlcm5hbCBkYXRhCi0gICBzdHJ1Y3R1cmVzIGlzIG1haW50YWluZWQgYnkgdXBkYXRpbmcgdGhlIHN0cnVjdHVyZXMgYXQKLSAgIGBzeW5jaHJvbml6YXRpb24nIHBvaW50cy4gIE9mIHBhcnRpY3VsYXIgbm90ZSBpcyB0aGF0IChhdCB0aGUgdGltZQotICAgb2Ygd3JpdGluZykgdGhlIG1lbW9yeSBkYXRhIHR5cGVzIGZvciBCQVQgcmVnaXN0ZXJzIGFyZSByZWJ1aWx0Ci0gICB3aGVuIGV2ZXIgdGhlIHByb2Nlc3NvciBtb3ZlcyBiZXR3ZWVuIHByb2JsZW0gYW5kIHN5c3RlbSBzdGF0ZXMuCi0KLSAgIFVucGFja2VkIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBPRUEgc28gdGhhdCB0aGV5IGNvcnJlY3RseSBhbGlnbgotICAgdG8gd2hlcmUgdGhleSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgUFRFIGFkZHJlc3MuICovCi0KLQotLyogUHJvdGVjdGlvbiB0YWJsZToKLQotICAgTWF0cml4IG9mIHByb2Nlc3NvciBzdGF0ZSwgdHlwZSBvZiBhY2Nlc3MgYW5kIHZhbGlkaXR5ICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIG9tX3N1cGVydmlzb3Jfc3RhdGUsCi0gIG9tX3Byb2JsZW1fc3RhdGUsCi0gIG5yX29tX21vZGVzCi19IG9tX3Byb2Nlc3Nvcl9tb2RlczsKLQotdHlwZWRlZiBlbnVtIHsKLSAgb21fZGF0YV9yZWFkLCBvbV9kYXRhX3dyaXRlLAotICBvbV9pbnN0cnVjdGlvbl9yZWFkLCBvbV9hY2Nlc3NfYW55LAotICBucl9vbV9hY2Nlc3NfdHlwZXMKLX0gb21fYWNjZXNzX3R5cGVzOwotCi1zdGF0aWMgaW50IG9tX3ZhbGlkX2FjY2Vzc1syXVs0XVtucl9vbV9hY2Nlc3NfdHlwZXNdID0gewotICAvKiByZWFkLCB3cml0ZSwgaW5zdHJ1Y3Rpb24sIGFueSAqLwotICAvKiBLIGJpdCA9PSAwICovCi0gIHsgLypyICB3ICBpICBhICAgICAgIHBwICovCi0gICAgeyAxLCAxLCAxLCAxIH0sIC8qIDAwICovCi0gICAgeyAxLCAxLCAxLCAxIH0sIC8qIDAxICovCi0gICAgeyAxLCAxLCAxLCAxIH0sIC8qIDEwICovCi0gICAgeyAxLCAwLCAxLCAxIH0sIC8qIDExICovCi0gIH0sCi0gIC8qIEsgYml0ID09IDEgIG9yIFAgYml0IHZhbGlkICovCi0gIHsgLypyICB3ICBpICBhICAgICAgIHBwICovCi0gICAgeyAwLCAwLCAwLCAwIH0sIC8qIDAwICovCi0gICAgeyAxLCAwLCAxLCAxIH0sIC8qIDAxICovCi0gICAgeyAxLCAxLCAxLCAxIH0sIC8qIDEwICovCi0gICAgeyAxLCAwLCAxLCAxIH0sIC8qIDExICovCi0gIH0KLX07Ci0KLQotLyogQmF0IHRyYW5zbGF0aW9uOgotCi0gICBUaGUgYmF0IGRhdGEgc3RydWN0dXJlIG9ubHkgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdmFsaWQgQkFUCi0gICB0cmFuc2xhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIGFuZCB0eXBlIG9mIGFjY2Vzcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX29tX2JhdCB7Ci0gIHVuc2lnbmVkX3dvcmQgYmxvY2tfZWZmZWN0aXZlX3BhZ2VfaW5kZXg7Ci0gIHVuc2lnbmVkX3dvcmQgYmxvY2tfZWZmZWN0aXZlX3BhZ2VfaW5kZXhfbWFzazsKLSAgdW5zaWduZWRfd29yZCBibG9ja19sZW5ndGhfbWFzazsKLSAgdW5zaWduZWRfd29yZCBibG9ja19yZWFsX3BhZ2VfbnVtYmVyOwotICBpbnQgcHJvdGVjdGlvbl9iaXRzOwotfSBvbV9iYXQ7Ci0KLWVudW0gX25yX29tX2JhdF9yZWdpc3RlcnMgewotICBucl9vbV9iYXRfcmVnaXN0ZXJzID0gNAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29tX2JhdHMgewotICBpbnQgbnJfdmFsaWRfYmF0X3JlZ2lzdGVyczsKLSAgb21fYmF0IGJhdFtucl9vbV9iYXRfcmVnaXN0ZXJzXTsKLX0gb21fYmF0czsKLQotCi0vKiBTZWdtZW50IFRMQjoKLQotICAgSW4gdGhpcyBtb2RlbCB0aGUgMzIgYW5kIDY0IGJpdCBzZWdtZW50IHRhYmxlcyBhcmUgdHJlYXRlZCBpbiB2ZXJ5Ci0gICBzaW1pbGFyIHdheXMuICBUaGUgMzJiaXQgc2VnbWVudCByZWdpc3RlcnMgYXJlIHRyZWF0ZWQgYXMgYQotICAgc2ltcGxpZmljYXRpb24gb2YgdGhlIDY0Yml0IHNlZ21lbnQgdGxiICovCi0KLWVudW0gX29tX3NlZ21lbnRfdGxiX2NvbnN0YW50cyB7Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgc2l6ZW9mX3NlZ21lbnRfdGFibGVfZW50cnlfZ3JvdXAgPSAxMjgsCi0gIHNpemVvZl9zZWdtZW50X3RhYmxlX2VudHJ5ID0gMTYsCi0jZW5kaWYKLSAgb21fc2VnbWVudF90bGJfaW5kZXhfc3RhcnRfYml0ID0gMzIsCi0gIG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0b3BfYml0ID0gMzUsCi0gIG5yX29tX3NlZ21lbnRfdGxiX2VudHJpZXMgPSAxNiwKLSAgbnJfb21fc2VnbWVudF90bGJfY29uc3RhbnRzCi19OwotCi10eXBlZGVmIHN0cnVjdCBfb21fc2VnbWVudF90bGJfZW50cnkgewotICBpbnQga2V5W25yX29tX21vZGVzXTsKLSAgb21fYWNjZXNzX3R5cGVzIGludmFsaWRfYWNjZXNzOyAvKiBzZXQgdG8gaW5zdHJ1Y3Rpb24gaWYgbm9fZXhlY3V0ZSBiaXQgKi8KLSAgdW5zaWduZWRfd29yZCBtYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkOyAvKiBhbGlnbmVkIHJlYWR5IGZvciBwdGUgZ3JvdXAgYWRkciAqLwotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIGludCBpc192YWxpZDsKLSAgdW5zaWduZWRfd29yZCBtYXNrZWRfZWZmZWN0aXZlX3NlZ21lbnRfaWQ7Ci0jZW5kaWYKLX0gb21fc2VnbWVudF90bGJfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IF9vbV9zZWdtZW50X3RsYiB7Ci0gIG9tX3NlZ21lbnRfdGxiX2VudHJ5IGVudHJ5W25yX29tX3NlZ21lbnRfdGxiX2VudHJpZXNdOwotfSBvbV9zZWdtZW50X3RsYjsKLQotCi0vKiBQYWdlIFRMQjoKLQotICAgVGhpcyBPRUEgbW9kZWwgaW5jbHVkZXMgYSBzbWFsbCBkaXJlY3QgbWFwIFBhZ2UgVExCLiAgVGhlIHRsYiBpcyB0bwotICAgY3V0IGRvd24gb24gdGhlIG5lZWQgZm9yIHRoZSBPRUEgdG8gcGVyZm9ybSB3YWxrcyBvZiB0aGUgcGFnZSBoYXNoCi0gICB0YWJsZS4gKi8KLQotZW51bSBfb21fcGFnZV90bGJfY29uc3RhbnRzIHsKLSAgb21fcGFnZV90bGJfaW5kZXhfc3RhcnRfYml0ID0gNDYsCi0gIG9tX3BhZ2VfdGxiX2luZGV4X3N0b3BfYml0ID0gNTEsCi0gIG5yX29tX3BhZ2VfdGxiX2VudHJpZXMgPSA2NCwKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICBzaXplb2ZfcHRlX2dyb3VwID0gMTI4LAotICBzaXplb2ZfcHRlID0gMTYsCi0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotICBzaXplb2ZfcHRlX2dyb3VwID0gNjQsCi0gIHNpemVvZl9wdGUgPSA4LAotI2VuZGlmCi0gIG5yX29tX3BhZ2VfdGxiX2NvbnN0YW50cwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29tX3BhZ2VfdGxiX2VudHJ5IHsKLSAgaW50IHByb3RlY3Rpb247Ci0gIGludCBjaGFuZ2VkOwotICB1bnNpZ25lZF93b3JkIHJlYWxfYWRkcmVzc19vZl9wdGVfMTsKLSAgdW5zaWduZWRfd29yZCBtYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkOwotICB1bnNpZ25lZF93b3JkIG1hc2tlZF9wYWdlOwotICB1bnNpZ25lZF93b3JkIG1hc2tlZF9yZWFsX3BhZ2VfbnVtYmVyOwotfSBvbV9wYWdlX3RsYl9lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29tX3BhZ2VfdGxiIHsKLSAgb21fcGFnZV90bGJfZW50cnkgZW50cnlbbnJfb21fcGFnZV90bGJfZW50cmllc107Ci19IG9tX3BhZ2VfdGxiOwotCi0KLS8qIG1lbW9yeSB0cmFuc2xhdGlvbjoKLQotICAgT0VBIG1lbW9yeSB0cmFuc2xhdGlvbiBwb3NzaWJseSBpbnZvbHZlcyBCQVQsIFNSLCBUTEIgYW5kIEhUQUIKLSAgIGluZm9ybWF0aW9uKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX29tX21hcCB7Ci0KLSAgLyogbG9jYWwgY2FjaGUgb2YgcmVnaXN0ZXIgdmFsdWVzICovCi0gIGludCBpc19yZWxvY2F0ZTsKLSAgaW50IGlzX3Byb2JsZW1fc3RhdGU7Ci0KLSAgLyogYmxvY2sgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLwotICBvbV9iYXRzICpiYXRfcmVnaXN0ZXJzOwotCi0gIC8qIGZhaWxpbmcgdGhhdCwgdHJhbnNsYXRlIGVhIHRvIHZhIHVzaW5nIHNlZ21lbnQgdGxiICovCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2Zfc2VnbWVudF90YWJsZTsKLSNlbmRpZgotICBvbV9zZWdtZW50X3RsYiAqc2VnbWVudF90bGI7Ci0KLSAgLyogdGhlbiB2YSB0byByYSB1c2luZyBoYXNoZWQgcGFnZSB0YWJsZSBhbmQgdGxiICovCi0gIHVuc2lnbmVkX3dvcmQgcmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGU7Ci0gIHVuc2lnbmVkX3dvcmQgcGFnZV90YWJsZV9oYXNoX21hc2s7Ci0gIG9tX3BhZ2VfdGxiICpwYWdlX3RsYjsKLQotICAvKiBwaHlzaWNhbCBtZW1vcnkgZm9yIGZldGNoaW5nIHBhZ2UgdGFibGUgZW50cmllcyAqLwotICBjb3JlX21hcCAqcGh5c2ljYWw7Ci0KLSAgLyogYWRkcmVzcyB4b3IgZm9yIFBQQyBlbmRpYW4gKi8KLSAgdW5zaWduZWQgeG9yW1dJVEhfWE9SX0VORElBTl07Ci0KLX0gb21fbWFwOwotCi0KLS8qIFZNIG9iamVjdHM6Ci0KLSAgIEV4dGVybmFsIG9iamVjdHMgZGVmaW5lZCBieSB2bS5oICovCi0KLXN0cnVjdCBfdm1faW5zdHJ1Y3Rpb25fbWFwIHsKLSAgLyogcmVhbCBtZW1vcnkgZm9yIGxhc3QgcGFydCAqLwotICBjb3JlX21hcCAqY29kZTsKLSAgLyogdHJhbnNsYXRlIGVmZmVjdGl2ZSB0byByZWFsICovCi0gIG9tX21hcCB0cmFuc2xhdGlvbjsKLX07Ci0KLXN0cnVjdCBfdm1fZGF0YV9tYXAgewotICAvKiB0cmFuc2xhdGUgZWZmZWN0aXZlIHRvIHJlYWwgKi8KLSAgb21fbWFwIHRyYW5zbGF0aW9uOwotICAvKiByZWFsIG1lbW9yeSBmb3IgdHJhbnNsYXRlZCBhZGRyZXNzICovCi0gIGNvcmVfbWFwICpyZWFkOwotICBjb3JlX21hcCAqd3JpdGU7Ci19OwotCi0KLS8qIFZNOgotCi0gICBVbmRlcmx5aW5nIG1lbW9yeSBvYmplY3QuICBGb3IgdGhlIFZFQSB0aGlzIGlzIGp1c3QgdGhlCi0gICBjb3JlX21hcC4gRm9yIE9FQSBpdCBpcyB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5Ci0gICB0cmFuc2xhdGlvbidzICovCi0KLXN0cnVjdCBfdm0gewotCi0gIC8qIE9FQTogYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyAqLwotICBvbV9iYXRzIGliYXRzOwotICBvbV9iYXRzIGRiYXRzOwotCi0gIC8qIE9FQTogc2VnbWVudCByZWdpc3RlcnMgKi8KLSAgb21fc2VnbWVudF90bGIgc2VnbWVudF90bGI7Ci0KLSAgLyogT0VBOiB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVycyAqLwotICBvbV9wYWdlX3RsYiBpbnN0cnVjdGlvbl90bGI7Ci0gIG9tX3BhZ2VfdGxiIGRhdGFfdGxiOwotCi0gIC8qIHJlYWwgbWVtb3J5ICovCi0gIGNvcmUgKnBoeXNpY2FsOwotCi0gIC8qIG1lbW9yeSBtYXBzICovCi0gIHZtX2luc3RydWN0aW9uX21hcCBpbnN0cnVjdGlvbl9tYXA7Ci0gIHZtX2RhdGFfbWFwIGRhdGFfbWFwOwotCi19OwotCi0KLS8qIE9FQSBTdXBwb3J0IHByb2NlZHVyZXMgKi8KLQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpCi1vbV9zZWdtZW50X3RsYl9pbmRleCh1bnNpZ25lZF93b3JkIGVhKQotewotICB1bnNpZ25lZF93b3JkIGluZGV4ID0gRVhUUkFDVEVEKGVhLAotCQkJCSAgb21fc2VnbWVudF90bGJfaW5kZXhfc3RhcnRfYml0LAotCQkJCSAgb21fc2VnbWVudF90bGJfaW5kZXhfc3RvcF9iaXQpOwotICByZXR1cm4gaW5kZXg7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfVk1cCi0odW5zaWduZWRfd29yZCkKLW9tX3BhZ2VfdGxiX2luZGV4KHVuc2lnbmVkX3dvcmQgZWEpCi17Ci0gIHVuc2lnbmVkX3dvcmQgaW5kZXggPSBFWFRSQUNURUQoZWEsCi0JCQkJICBvbV9wYWdlX3RsYl9pbmRleF9zdGFydF9iaXQsCi0JCQkJICBvbV9wYWdlX3RsYl9pbmRleF9zdG9wX2JpdCk7Ci0gIHJldHVybiBpbmRleDsKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21faGFzaF9wYWdlKHVuc2lnbmVkX3dvcmQgbWFza2VkX3ZzaWQsCi0JICAgICB1bnNpZ25lZF93b3JkIGVhKQotewotICB1bnNpZ25lZF93b3JkIGV4dHJhY3RlZF9lYSA9IEVYVFJBQ1RFRChlYSwgMzYsIDUxKTsKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotICB1bnNpZ25lZF93b3JkIG1hc2tlZF9lYSA9IElOU0VSVEVEMzIoZXh0cmFjdGVkX2VhLCA3LCAzMS02KTsKLSAgdW5zaWduZWRfd29yZCBoYXNoID0gbWFza2VkX3ZzaWQgXiBtYXNrZWRfZWE7Ci0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICB1bnNpZ25lZF93b3JkIG1hc2tlZF9lYSA9IElOU0VSVEVENjQoZXh0cmFjdGVkX2VhLCAxOCwgNjMtNyk7Ci0gIHVuc2lnbmVkX3dvcmQgaGFzaCA9IG1hc2tlZF92c2lkIF4gbWFza2VkX2VhOwotI2VuZGlmCi0gIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gbWFza2VkLXZzaWQ9MHglbHggbWFza2VkLWVhPTB4JWx4IGhhc2g9MHglbHhcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKWVhLAotCQkgICAodW5zaWduZWQgbG9uZyltYXNrZWRfdnNpZCwKLQkJICAgKHVuc2lnbmVkIGxvbmcpbWFza2VkX2VhLAotCQkgICAodW5zaWduZWQgbG9uZyloYXNoKSk7Ci0gIHJldHVybiBoYXNoOwotfQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpCi1vbV9wdGVfMF9hcGkodW5zaWduZWRfd29yZCBwdGVfMCkKLXsKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotICByZXR1cm4gRVhUUkFDVEVEMzIocHRlXzAsIDI2LCAzMSk7Ci0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICByZXR1cm4gRVhUUkFDVEVENjQocHRlXzAsIDUyLCA1Nik7Ci0jZW5kaWYKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21fcHRlXzBfaGFzaCh1bnNpZ25lZF93b3JkIHB0ZV8wKQotewotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0gIHJldHVybiBFWFRSQUNURUQzMihwdGVfMCwgMjUsIDI1KTsKLSNlbmRpZgotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCi0gIHJldHVybiBFWFRSQUNURUQ2NChwdGVfMCwgNjIsIDYyKTsKLSNlbmRpZgotfQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKGludCkKLW9tX3B0ZV8wX3ZhbGlkKHVuc2lnbmVkX3dvcmQgcHRlXzApCi17Ci0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgcmV0dXJuIE1BU0tFRDMyKHB0ZV8wLCAwLCAwKSAhPSAwOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgcmV0dXJuIE1BU0tFRDY0KHB0ZV8wLCA2MywgNjMpICE9IDA7Ci0jZW5kaWYKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21fZWFfbWFza2VkX3BhZ2UodW5zaWduZWRfd29yZCBlYSkKLXsKLSAgcmV0dXJuIE1BU0tFRChlYSwgMzYsIDUxKTsKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21fZWFfbWFza2VkX2J5dGUodW5zaWduZWRfd29yZCBlYSkKLXsKLSAgcmV0dXJuIE1BU0tFRChlYSwgNTIsIDYzKTsKLX0KLQotLyogcmV0dXJuIHRoZSBWU0lEIGFsaWduZWQgZm9yIHB0ZSBncm91cCBhZGRyICovCi1TVEFUSUNfSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpCi1vbV9wdGVfMF9tYXNrZWRfdnNpZCh1bnNpZ25lZF93b3JkIHB0ZV8wKQotewotI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCi0gIHJldHVybiBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHB0ZV8wLCAxLCAyNCksIDMxLTYtMjQrMSwgMzEtNik7Ci0jZW5kaWYKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICByZXR1cm4gSU5TRVJURUQ2NChFWFRSQUNURUQ2NChwdGVfMCwgMCwgNTEpLCA2My03LTUyKzEsIDYzLTcpOwotI2VuZGlmCi19Ci0KLVNUQVRJQ19JTkxJTkVfVk1cCi0odW5zaWduZWRfd29yZCkKLW9tX3B0ZV8xX3BwKHVuc2lnbmVkX3dvcmQgcHRlXzEpCi17Ci0gIHJldHVybiBNQVNLRUQocHRlXzEsIDYyLCA2Myk7IC8qUFAqLwotfQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKGludCkKLW9tX3B0ZV8xX3JlZmVyZW5jZWQodW5zaWduZWRfd29yZCBwdGVfMSkKLXsKLSAgcmV0dXJuIEVYVFJBQ1RFRChwdGVfMSwgNTUsIDU1KTsKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLShpbnQpCi1vbV9wdGVfMV9jaGFuZ2VkKHVuc2lnbmVkX3dvcmQgcHRlXzEpCi17Ci0gIHJldHVybiBFWFRSQUNURUQocHRlXzEsIDU2LCA1Nik7Ci19Ci0KLVNUQVRJQ19JTkxJTkVfVk1cCi0oaW50KQotb21fcHRlXzFfbWFza2VkX3Jwbih1bnNpZ25lZF93b3JkIHB0ZV8xKQotewotICByZXR1cm4gTUFTS0VEKHB0ZV8xLCAwLCA1MSk7IC8qUlBOKi8KLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21fZWFfYXBpKHVuc2lnbmVkX3dvcmQgZWEpCi17Ci0gIHJldHVybiBFWFRSQUNURUQoZWEsIDM2LCA0MSk7Ci19Ci0KLQotLyogUGFnZSBhbmQgU2VnbWVudCB0YWJsZSByZWFkL3dyaXRlIG9wZXJhdG9ycywgdGhlc2UgbmVlZCB0byBzdGlsbAotICAgYWNjb3VudCBmb3IgdGhlIFBQQydzIFhPUiBvcGVyYXRpb24gKi8KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotb21fcmVhZF93b3JkKG9tX21hcCAqbWFwLAotCSAgICAgdW5zaWduZWRfd29yZCByYSwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGlmIChXSVRIX1hPUl9FTkRJQU4pCi0gICAgcmEgXj0gbWFwLT54b3Jbc2l6ZW9mKGluc3RydWN0aW9uX3dvcmQpIC0gMV07Ci0gIHJldHVybiBjb3JlX21hcF9yZWFkX3dvcmQobWFwLT5waHlzaWNhbCwgcmEsIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotU1RBVElDX0lOTElORV9WTVwKLSh2b2lkKQotb21fd3JpdGVfd29yZChvbV9tYXAgKm1hcCwKLQkgICAgICB1bnNpZ25lZF93b3JkIHJhLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgdmFsLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpZiAoV0lUSF9YT1JfRU5ESUFOKQotICAgIHJhIF49IG1hcC0+eG9yW3NpemVvZihpbnN0cnVjdGlvbl93b3JkKSAtIDFdOwotICBjb3JlX21hcF93cml0ZV93b3JkKG1hcC0+cGh5c2ljYWwsIHJhLCB2YWwsIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi0vKiBCcmluZyB0aGluZ3MgaW50byBleGlzdGFuY2UgKi8KLQotSU5MSU5FX1ZNXAotKHZtICopCi12bV9jcmVhdGUoY29yZSAqcGh5c2ljYWwpCi17Ci0gIHZtICp2aXJ0dWFsOwotCi0gIC8qIGludGVybmFsIGNoZWNrcyAqLwotICBpZiAobnJfb21fc2VnbWVudF90bGJfZW50cmllcwotICAgICAgIT0gKDEgPDwgKG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0b3BfYml0Ci0JCS0gb21fc2VnbWVudF90bGJfaW5kZXhfc3RhcnRfYml0ICsgMSkpKQotICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHZtX2NyZWF0ZSAtIHByb2JsZW0gd2l0aCBvbV9zZWdtZW50IGNvbnN0YW50c1xuIik7Ci0gIGlmIChucl9vbV9wYWdlX3RsYl9lbnRyaWVzCi0gICAgICAhPSAoMSA8PCAob21fcGFnZV90bGJfaW5kZXhfc3RvcF9iaXQKLQkJLSBvbV9wYWdlX3RsYl9pbmRleF9zdGFydF9iaXQgKyAxKSkpCi0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gdm1fY3JlYXRlIC0gcHJvYmxlbSB3aXRoIG9tX3BhZ2UgY29uc3RhbnRzXG4iKTsKLQotICAvKiBjcmVhdGUgdGhlIG5ldyB2bSByZWdpc3RlciBmaWxlICovCi0gIHZpcnR1YWwgPSBaQUxMT0Modm0pOwotCi0gIC8qIHNldCB1cCBjb3JlICovCi0gIHZpcnR1YWwtPnBoeXNpY2FsID0gcGh5c2ljYWw7Ci0KLSAgLyogc2V0IHVwIHRoZSBhZGRyZXNzIGRlY29kZXJzICovCi0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5iYXRfcmVnaXN0ZXJzID0gJnZpcnR1YWwtPmliYXRzOwotICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24uc2VnbWVudF90bGIgPSAmdmlydHVhbC0+c2VnbWVudF90bGI7Ci0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5wYWdlX3RsYiA9ICZ2aXJ0dWFsLT5pbnN0cnVjdGlvbl90bGI7Ci0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5pc19yZWxvY2F0ZSA9IDA7Ci0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5pc19wcm9ibGVtX3N0YXRlID0gMDsKLSAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLnBoeXNpY2FsID0gY29yZV9yZWFkYWJsZShwaHlzaWNhbCk7Ci0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC5jb2RlID0gY29yZV9yZWFkYWJsZShwaHlzaWNhbCk7Ci0KLSAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24uYmF0X3JlZ2lzdGVycyA9ICZ2aXJ0dWFsLT5kYmF0czsKLSAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24uc2VnbWVudF90bGIgPSAmdmlydHVhbC0+c2VnbWVudF90bGI7Ci0gIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLnBhZ2VfdGxiID0gJnZpcnR1YWwtPmRhdGFfdGxiOwotICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5pc19yZWxvY2F0ZSA9IDA7Ci0gIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLmlzX3Byb2JsZW1fc3RhdGUgPSAwOwotICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5waHlzaWNhbCA9IGNvcmVfcmVhZGFibGUocGh5c2ljYWwpOwotICB2aXJ0dWFsLT5kYXRhX21hcC5yZWFkID0gY29yZV9yZWFkYWJsZShwaHlzaWNhbCk7Ci0gIHZpcnR1YWwtPmRhdGFfbWFwLndyaXRlID0gY29yZV93cml0ZWFibGUocGh5c2ljYWwpOwotCi0gIHJldHVybiB2aXJ0dWFsOwotfQotCi0KLVNUQVRJQ19JTkxJTkVfVk1cCi0ob21fYmF0ICopCi1vbV9lZmZlY3RpdmVfdG9fYmF0KG9tX21hcCAqbWFwLAotCQkgICAgdW5zaWduZWRfd29yZCBlYSkKLXsKLSAgaW50IGN1cnJfYmF0ID0gMDsKLSAgb21fYmF0cyAqYmF0cyA9IG1hcC0+YmF0X3JlZ2lzdGVyczsKLSAgaW50IG5yX2JhdHMgPSBiYXRzLT5ucl92YWxpZF9iYXRfcmVnaXN0ZXJzOwotCi0gIGZvciAoY3Vycl9iYXQgPSAwOyBjdXJyX2JhdCA8IG5yX2JhdHM7IGN1cnJfYmF0KyspIHsKLSAgICBvbV9iYXQgKmJhdCA9IGJhdHMtPmJhdCArIGN1cnJfYmF0OwotICAgIGlmICgoZWEgJiBiYXQtPmJsb2NrX2VmZmVjdGl2ZV9wYWdlX2luZGV4X21hc2spCi0JIT0gYmF0LT5ibG9ja19lZmZlY3RpdmVfcGFnZV9pbmRleCkKLSAgICAgIGNvbnRpbnVlOwotICAgIHJldHVybiBiYXQ7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKG9tX3NlZ21lbnRfdGxiX2VudHJ5ICopCi1vbV9lZmZlY3RpdmVfdG9fdmlydHVhbChvbV9tYXAgKm1hcCwgCi0JCQl1bnNpZ25lZF93b3JkIGVhLAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgLyogZmlyc3QgdHJ5IHRoZSBzZWdtZW50IHRsYiAqLwotICBvbV9zZWdtZW50X3RsYl9lbnRyeSAqc2VnbWVudF90bGJfZW50cnkgPSAobWFwLT5zZWdtZW50X3RsYi0+ZW50cnkKLQkJCQkJICAgICArIG9tX3NlZ21lbnRfdGxiX2luZGV4KGVhKSk7Ci0KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQotICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHNyWyVsZF0gLSBtYXNrZWQtdnNpZD0weCVseCB2YT0weCVseCUwN2x4XG4iLAotCQkgICAodW5zaWduZWQgbG9uZyllYSwKLQkJICAgKGxvbmcpb21fc2VnbWVudF90bGJfaW5kZXgoZWEpLAotCQkgICAodW5zaWduZWQgbG9uZylzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCwgCi0JCSAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RFRDMyKHNlZ21lbnRfdGxiX2VudHJ5LT5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkLCAzMS02LTI0KzEsIDMxLTYpLAotCQkgICAodW5zaWduZWQgbG9uZylFWFRSQUNURUQzMihlYSwgNCwgMzEpKSk7Ci0gIHJldHVybiBzZWdtZW50X3RsYl9lbnRyeTsKLSNlbmRpZgotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLSAgaWYgKHNlZ21lbnRfdGxiX2VudHJ5LT5pc192YWxpZAotICAgICAgJiYgKHNlZ21lbnRfdGxiX2VudHJ5LT5tYXNrZWRfZWZmZWN0aXZlX3NlZ21lbnRfaWQgPT0gTUFTS0VEKGVhLCAwLCAzNSkpKSB7Ci0gICAgZXJyb3IoImZpeG1lIC0gaXMgdGhlcmUgYSBuZWVkIHRvIHVwZGF0ZSBhbnkgYml0c1xuIik7Ci0gICAgcmV0dXJuIHNlZ21lbnRfdGxiX2VudHJ5OwotICB9Ci0KLSAgLyogZHJhdHMsIHNlZ21lbnQgdGxiIG1pc3NlZCAqLwotICB7Ci0gICAgdW5zaWduZWRfd29yZCBzZWdtZW50X2lkX2hhc2ggPSBlYTsKLSAgICBpbnQgY3VycmVudF9oYXNoID0gMDsKLSAgICBmb3IgKGN1cnJlbnRfaGFzaCA9IDA7IGN1cnJlbnRfaGFzaCA8IDI7IGN1cnJlbnRfaGFzaCArPSAxKSB7Ci0gICAgICB1bnNpZ25lZF93b3JkIHNlZ21lbnRfdGFibGVfZW50cnlfZ3JvdXAgPQotCShtYXAtPnJlYWxfYWRkcmVzc19vZl9zZWdtZW50X3RhYmxlCi0JIHwgKE1BU0tFRDY0KHNlZ21lbnRfaWRfaGFzaCwgMzEsIDM1KSA+PiAoNTYtMzUpKSk7Ci0gICAgICB1bnNpZ25lZF93b3JkIHNlZ21lbnRfdGFibGVfZW50cnk7Ci0gICAgICBmb3IgKHNlZ21lbnRfdGFibGVfZW50cnkgPSBzZWdtZW50X3RhYmxlX2VudHJ5X2dyb3VwOwotCSAgIHNlZ21lbnRfdGFibGVfZW50cnkgPCAoc2VnbWVudF90YWJsZV9lbnRyeV9ncm91cAotCQkJCSAgKyBzaXplb2Zfc2VnbWVudF90YWJsZV9lbnRyeV9ncm91cCk7Ci0JICAgc2VnbWVudF90YWJsZV9lbnRyeSArPSBzaXplb2Zfc2VnbWVudF90YWJsZV9lbnRyeSkgewotCS8qIGJ5dGUgb3JkZXI/ICovCi0JdW5zaWduZWRfd29yZCBzZWdtZW50X3RhYmxlX2VudHJ5X2R3b3JkXzAgPQotCSAgb21fcmVhZF93b3JkKG1hcC0+cGh5c2ljYWwsIHNlZ21lbnRfdGFibGVfZW50cnksIHByb2Nlc3NvciwgY2lhKTsKLQl1bnNpZ25lZF93b3JkIHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMSA9Ci0JICBvbV9yZWFkX3dvcmQobWFwLT5waHlzaWNhbCwgc2VnbWVudF90YWJsZV9lbnRyeSArIDgsCi0JCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0JaW50IGlzX3ZhbGlkID0gTUFTS0VENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wLCA1NiwgNTYpICE9IDA7Ci0JdW5zaWduZWRfd29yZCBtYXNrZWRfZWZmZWN0aXZlX3NlZ21lbnRfaWQgPQotCSAgTUFTS0VENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wLCAwLCAzNSk7Ci0JaWYgKGlzX3ZhbGlkICYmIG1hc2tlZF9lZmZlY3RpdmVfc2VnbWVudF9pZCA9PSBNQVNLRUQ2NChlYSwgMCwgMzUpKSB7Ci0JICAvKiBkb24ndCBwZXJtaXQgc29tZSB0aGluZ3MgKi8KLQkgIGlmIChNQVNLRUQ2NChzZWdtZW50X3RhYmxlX2VudHJ5X2R3b3JkXzAsIDU3LCA1NykpCi0JICAgIGVycm9yKCJvbV9lZmZlY3RpdmVfdG9fdmlydHVhbCgpIC0gVD0xIGluIFNURSBub3Qgc3VwcG9ydGVkXG4iKTsKLQkgIC8qIHVwZGF0ZSBzZWdtZW50IHRsYiAqLwotCSAgc2VnbWVudF90bGJfZW50cnktPmlzX3ZhbGlkID0gaXNfdmFsaWQ7Ci0JICBzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX2VmZmVjdGl2ZV9zZWdtZW50X2lkID0KLQkgICAgbWFza2VkX2VmZmVjdGl2ZV9zZWdtZW50X2lkOwotCSAgc2VnbWVudF90bGJfZW50cnktPmtleVtvbV9zdXBlcnZpc29yX3N0YXRlXSA9Ci0JICAgIEVYVFJBQ1RFRDY0KHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMCwgNTgsIDU4KTsKLQkgIHNlZ21lbnRfdGxiX2VudHJ5LT5rZXlbb21fcHJvYmxlbV9zdGF0ZV0gPQotCSAgICBFWFRSQUNURUQ2NChzZWdtZW50X3RhYmxlX2VudHJ5X2R3b3JkXzAsIDU5LCA1OSk7Ci0JICBzZWdtZW50X3RsYl9lbnRyeS0+aW52YWxpZF9hY2Nlc3MgPQotCSAgICAoTUFTS0VENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wLCA2MCwgNjApCi0JICAgICA/IG9tX2luc3RydWN0aW9uX3JlYWQKLQkgICAgIDogb21fYWNjZXNzX2FueSk7Ci0JICBzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCA9Ci0JICAgIElOU0VSVEVENjQoRVhUUkFDVEVENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8xLCAwLCA1MSksCi0JCSAgICAgICAxOC0xMywgNjMtNyk7IC8qIGFsaWduZWQgcmVhZHkgZm9yIHB0ZSBncm91cCBhZGRyICovCi0JICByZXR1cm4gc2VnbWVudF90bGJfZW50cnk7Ci0JfQotICAgICAgfQotICAgICAgc2VnbWVudF9pZF9oYXNoID0gfnNlZ21lbnRfaWRfaGFzaDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLQotCi0KLVNUQVRJQ19JTkxJTkVfVk1cCi0ob21fcGFnZV90bGJfZW50cnkgKikKLW9tX3ZpcnR1YWxfdG9fcmVhbChvbV9tYXAgKm1hcCwgCi0JCSAgIHVuc2lnbmVkX3dvcmQgZWEsCi0JCSAgIG9tX3NlZ21lbnRfdGxiX2VudHJ5ICpzZWdtZW50X3RsYl9lbnRyeSwKLQkJICAgb21fYWNjZXNzX3R5cGVzIGFjY2VzcywKLQkJICAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBvbV9wYWdlX3RsYl9lbnRyeSAqcGFnZV90bGJfZW50cnkgPSAobWFwLT5wYWdlX3RsYi0+ZW50cnkKLQkJCQkgICAgICAgKyBvbV9wYWdlX3RsYl9pbmRleChlYSkpOwotCi0gIC8qIGlzIGl0IGEgdGxiIGhpdD8gKi8KLSAgaWYgKChwYWdlX3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZAotICAgICAgID09IHNlZ21lbnRfdGxiX2VudHJ5LT5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkKQotICAgICAgJiYgKHBhZ2VfdGxiX2VudHJ5LT5tYXNrZWRfcGFnZQotCSAgPT0gb21fZWFfbWFza2VkX3BhZ2UoZWEpKSkgewotICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gdGxiIGhpdCAtIHRsYj0weCVseFxuIiwKLQkgICAgICAgKGxvbmcpZWEsIChsb25nKXBhZ2VfdGxiX2VudHJ5KSk7Ci0gICAgcmV0dXJuIHBhZ2VfdGxiX2VudHJ5OwotICB9Ci0gICAgICAKLSAgLyogZHJhdHMsIGl0IGlzIGEgdGxiIG1pc3MgKi8KLSAgewotICAgIHVuc2lnbmVkX3dvcmQgcGFnZV9oYXNoID0KLSAgICAgIG9tX2hhc2hfcGFnZShzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCwgZWEpOwotICAgIGludCBjdXJyZW50X2hhc2g7Ci0gICAgZm9yIChjdXJyZW50X2hhc2ggPSAwOyBjdXJyZW50X2hhc2ggPCAyOyBjdXJyZW50X2hhc2ggKz0gMSkgewotICAgICAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2ZfcHRlX2dyb3VwID0KLQkobWFwLT5yZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZQotCSB8IChwYWdlX2hhc2ggJiBtYXAtPnBhZ2VfdGFibGVfaGFzaF9tYXNrKSk7Ci0gICAgICB1bnNpZ25lZF93b3JkIHJlYWxfYWRkcmVzc19vZl9wdGVfMDsKLSAgICAgIFRSQUNFKHRyYWNlX3ZtLAotCSAgICAoImVhPTB4JWx4IC0gaHRhYiBzZWFyY2ggJWQgLSBodGFiPTB4JWx4IGhhc2g9MHglbHggbWFzaz0weCVseCBwdGVnPTB4JWx4XG4iLAotCSAgICAgKGxvbmcpZWEsIGN1cnJlbnRfaGFzaCwKLQkgICAgIG1hcC0+cmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUsCi0JICAgICBwYWdlX2hhc2gsCi0JICAgICBtYXAtPnBhZ2VfdGFibGVfaGFzaF9tYXNrLAotCSAgICAgKGxvbmcpcmVhbF9hZGRyZXNzX29mX3B0ZV9ncm91cCkpOwotICAgICAgZm9yIChyZWFsX2FkZHJlc3Nfb2ZfcHRlXzAgPSByZWFsX2FkZHJlc3Nfb2ZfcHRlX2dyb3VwOwotCSAgIHJlYWxfYWRkcmVzc19vZl9wdGVfMCA8IChyZWFsX2FkZHJlc3Nfb2ZfcHRlX2dyb3VwCi0JCQkJICAgICsgc2l6ZW9mX3B0ZV9ncm91cCk7Ci0JICAgcmVhbF9hZGRyZXNzX29mX3B0ZV8wICs9IHNpemVvZl9wdGUpIHsKLQl1bnNpZ25lZF93b3JkIHB0ZV8wID0gb21fcmVhZF93b3JkKG1hcCwKLQkJCQkJICAgcmVhbF9hZGRyZXNzX29mX3B0ZV8wLAotCQkJCQkgICBwcm9jZXNzb3IsIGNpYSk7Ci0JLyogZGlkIHdlIGhpdD8gKi8KLQlpZiAob21fcHRlXzBfdmFsaWQocHRlXzApCi0JICAgICYmIChjdXJyZW50X2hhc2ggPT0gb21fcHRlXzBfaGFzaChwdGVfMCkpCi0JICAgICYmIChzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZAotCQk9PSBvbV9wdGVfMF9tYXNrZWRfdnNpZChwdGVfMCkpCi0JICAgICYmIChvbV9lYV9hcGkoZWEpID09IG9tX3B0ZV8wX2FwaShwdGVfMCkpKSB7Ci0JICB1bnNpZ25lZF93b3JkIHJlYWxfYWRkcmVzc19vZl9wdGVfMSA9IChyZWFsX2FkZHJlc3Nfb2ZfcHRlXzAKLQkJCQkJCSArIHNpemVvZl9wdGUgLyAyKTsKLQkgIHVuc2lnbmVkX3dvcmQgcHRlXzEgPSBvbV9yZWFkX3dvcmQobWFwLAotCQkJCQkgICAgIHJlYWxfYWRkcmVzc19vZl9wdGVfMSwKLQkJCQkJICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0JICBwYWdlX3RsYl9lbnRyeS0+cHJvdGVjdGlvbiA9IG9tX3B0ZV8xX3BwKHB0ZV8xKTsKLQkgIHBhZ2VfdGxiX2VudHJ5LT5jaGFuZ2VkID0gb21fcHRlXzFfY2hhbmdlZChwdGVfMSk7Ci0JICBwYWdlX3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCA9IHNlZ21lbnRfdGxiX2VudHJ5LT5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkOwotCSAgcGFnZV90bGJfZW50cnktPm1hc2tlZF9wYWdlID0gb21fZWFfbWFza2VkX3BhZ2UoZWEpOwotCSAgcGFnZV90bGJfZW50cnktPm1hc2tlZF9yZWFsX3BhZ2VfbnVtYmVyID0gb21fcHRlXzFfbWFza2VkX3JwbihwdGVfMSk7Ci0JICBwYWdlX3RsYl9lbnRyeS0+cmVhbF9hZGRyZXNzX29mX3B0ZV8xID0gcmVhbF9hZGRyZXNzX29mX3B0ZV8xOwotCSAgaWYgKCFvbV9wdGVfMV9yZWZlcmVuY2VkKHB0ZV8xKSkgewotCSAgICBvbV93cml0ZV93b3JkKG1hcCwKLQkJCSAgcmVhbF9hZGRyZXNzX29mX3B0ZV8xLAotCQkJICBwdGVfMSB8IEJJVCg1NSksCi0JCQkgIHByb2Nlc3NvciwgY2lhKTsKLQkgICAgVFJBQ0UodHJhY2Vfdm0sCi0JCSAgKCJlYT0weCVseCAtIGh0YWIgaGl0IC0gc2V0IHJlZiAtIHRsYj0weCVseCAmcHRlMT0weCVseFxuIiwKLQkJICAgKGxvbmcpZWEsIChsb25nKXBhZ2VfdGxiX2VudHJ5LCAobG9uZylyZWFsX2FkZHJlc3Nfb2ZfcHRlXzEpKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICBUUkFDRSh0cmFjZV92bSwKLQkJICAoImVhPTB4JWx4IC0gaHRhYiBoaXQgLSB0bGI9MHglbHggJnB0ZTE9MHglbHhcbiIsCi0JCSAgIChsb25nKWVhLCAobG9uZylwYWdlX3RsYl9lbnRyeSwgKGxvbmcpcmVhbF9hZGRyZXNzX29mX3B0ZV8xKSk7Ci0JICB9Ci0JICByZXR1cm4gcGFnZV90bGJfZW50cnk7Ci0JfQotICAgICAgfQotICAgICAgcGFnZV9oYXNoID0gfnBhZ2VfaGFzaDsgLyo/Pz8qLwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKHZvaWQpCi1vbV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCi0JICAgICB1bnNpZ25lZF93b3JkIGNpYSwKLQkgICAgIHVuc2lnbmVkX3dvcmQgZWEsCi0JICAgICBvbV9hY2Nlc3NfdHlwZXMgYWNjZXNzLAotCSAgICAgc3RvcmFnZV9pbnRlcnJ1cHRfcmVhc29ucyByZWFzb24pCi17Ci0gIHN3aXRjaCAoYWNjZXNzKSB7Ci0gIGNhc2Ugb21fZGF0YV9yZWFkOgotICAgIGRhdGFfc3RvcmFnZV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCByZWFzb24sIDAvKiFpc19zdG9yZSovKTsKLSAgICBicmVhazsKLSAgY2FzZSBvbV9kYXRhX3dyaXRlOgotICAgIGRhdGFfc3RvcmFnZV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCByZWFzb24sIDEvKmlzX3N0b3JlKi8pOwotICAgIGJyZWFrOwotICBjYXNlIG9tX2luc3RydWN0aW9uX3JlYWQ6Ci0gICAgaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIHJlYXNvbik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gb21faW50ZXJydXB0IC0gdW5leHBlY3RlZCBhY2Nlc3MgdHlwZSAlZCIsIGFjY2Vzcyk7Ci0gIH0KLX0KLQotCi1TVEFUSUNfSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpCi1vbV90cmFuc2xhdGVfZWZmZWN0aXZlX3RvX3JlYWwob21fbWFwICptYXAsCi0JCQkgICAgICAgdW5zaWduZWRfd29yZCBlYSwKLQkJCSAgICAgICBvbV9hY2Nlc3NfdHlwZXMgYWNjZXNzLAotCQkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAotCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCQkJICAgICAgIGludCBhYm9ydCkKLXsKLSAgb21fYmF0ICpiYXQgPSBOVUxMOwotICBvbV9zZWdtZW50X3RsYl9lbnRyeSAqc2VnbWVudF90bGJfZW50cnkgPSBOVUxMOwotICBvbV9wYWdlX3RsYl9lbnRyeSAqcGFnZV90bGJfZW50cnkgPSBOVUxMOwotICB1bnNpZ25lZF93b3JkIHJhOwotCi0gIGlmICghbWFwLT5pc19yZWxvY2F0ZSkgewotICAgIHJhID0gZWE7Ci0gICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBkaXJlY3QgbWFwIC0gcmE9MHglbHhcbiIsCi0JCSAgICAgKGxvbmcpZWEsIChsb25nKXJhKSk7Ci0gICAgcmV0dXJuIHJhOwotICB9Ci0KLSAgLyogbWF0Y2ggd2l0aCBCQVQ/ICovCi0gIGJhdCA9IG9tX2VmZmVjdGl2ZV90b19iYXQobWFwLCBlYSk7Ci0gIGlmIChiYXQgIT0gTlVMTCkgewotICAgIGlmICghb21fdmFsaWRfYWNjZXNzWzFdW2JhdC0+cHJvdGVjdGlvbl9iaXRzXVthY2Nlc3NdKSB7Ci0gICAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIGJhdCBhY2Nlc3MgdmlvbGF0aW9uXG4iLCAobG9uZyllYSkpOwotICAgICAgaWYgKGFib3J0KQotCW9tX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgZWEsIGFjY2VzcywKLQkJICAgICBwcm90ZWN0aW9uX3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdCk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIE1BU0soMCwgNjMpOwotICAgIH0KLQotICAgIHJhID0gKChlYSAmIGJhdC0+YmxvY2tfbGVuZ3RoX21hc2spIHwgYmF0LT5ibG9ja19yZWFsX3BhZ2VfbnVtYmVyKTsKLSAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIGJhdCB0cmFuc2xhdGlvbiAtIHJhPTB4JWx4XG4iLAotCQkgICAgIChsb25nKWVhLCAobG9uZylyYSkpOwotICAgIHJldHVybiByYTsKLSAgfQotCi0gIC8qIHRyYW5zbGF0ZSBlYSB0byB2YSB1c2luZyBzZWdtZW50IG1hcCAqLwotICBzZWdtZW50X3RsYl9lbnRyeSA9IG9tX2VmZmVjdGl2ZV90b192aXJ0dWFsKG1hcCwgZWEsIHByb2Nlc3NvciwgY2lhKTsKLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICBpZiAoc2VnbWVudF90bGJfZW50cnkgPT0gTlVMTCkgewotICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gc2VnbWVudCB0bGIgbWlzc1xuIiwgKGxvbmcpZWEpKTsKLSAgICBpZiAoYWJvcnQpCi0gICAgICBvbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCBhY2Nlc3MsCi0JCSAgIHNlZ21lbnRfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIE1BU0soMCwgNjMpOwotICB9Ci0jZW5kaWYKLSAgLyogY2hlY2sgZm9yIGludmFsaWQgc2VnbWVudCBhY2Nlc3MgdHlwZSAqLwotICBpZiAoc2VnbWVudF90bGJfZW50cnktPmludmFsaWRfYWNjZXNzID09IGFjY2VzcykgewotICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gc2VnbWVudCBhY2Nlc3MgaW52YWxpZFxuIiwgKGxvbmcpZWEpKTsKLSAgICBpZiAoYWJvcnQpCi0gICAgICBvbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCBhY2Nlc3MsCi0JCSAgIHByb3RlY3Rpb25fdmlvbGF0aW9uX3N0b3JhZ2VfaW50ZXJydXB0KTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTUFTSygwLCA2Myk7Ci0gIH0KLQotICAvKiBsb29rdXAgaW4gUFRFICovCi0gIHBhZ2VfdGxiX2VudHJ5ID0gb21fdmlydHVhbF90b19yZWFsKG1hcCwgZWEsIHNlZ21lbnRfdGxiX2VudHJ5LAotCQkJCSAgICAgIGFjY2VzcywKLQkJCQkgICAgICBwcm9jZXNzb3IsIGNpYSk7Ci0gIGlmIChwYWdlX3RsYl9lbnRyeSA9PSBOVUxMKSB7Ci0gICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBwYWdlIHRsYiBtaXNzXG4iLCAobG9uZyllYSkpOwotICAgIGlmIChhYm9ydCkKLSAgICAgIG9tX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgZWEsIGFjY2VzcywKLQkJICAgaGFzaF90YWJsZV9taXNzX3N0b3JhZ2VfaW50ZXJydXB0KTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTUFTSygwLCA2Myk7Ci0gIH0KLSAgaWYgKCEob21fdmFsaWRfYWNjZXNzCi0JW3NlZ21lbnRfdGxiX2VudHJ5LT5rZXlbbWFwLT5pc19wcm9ibGVtX3N0YXRlXV0KLQlbcGFnZV90bGJfZW50cnktPnByb3RlY3Rpb25dCi0JW2FjY2Vzc10pKSB7Ci0gICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBwYWdlIHRsYiBhY2Nlc3MgdmlvbGF0aW9uXG4iLCAobG9uZyllYSkpOwotICAgIGlmIChhYm9ydCkKLSAgICAgIG9tX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgZWEsIGFjY2VzcywKLQkJICAgcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBNQVNLKDAsIDYzKTsKLSAgfQotCi0gIC8qIHVwZGF0ZSBjaGFuZ2UgYml0IGFzIG5lZWRlZCAqLwotICBpZiAoYWNjZXNzID09IG9tX2RhdGFfd3JpdGUgJiYhcGFnZV90bGJfZW50cnktPmNoYW5nZWQpIHsKLSAgICB1bnNpZ25lZF93b3JkIHB0ZV8xID0gb21fcmVhZF93b3JkKG1hcCwKLQkJCQkgICAgICAgcGFnZV90bGJfZW50cnktPnJlYWxfYWRkcmVzc19vZl9wdGVfMSwKLQkJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOwotICAgIG9tX3dyaXRlX3dvcmQobWFwLAotCQkgIHBhZ2VfdGxiX2VudHJ5LT5yZWFsX2FkZHJlc3Nfb2ZfcHRlXzEsCi0JCSAgcHRlXzEgfCBCSVQoNTYpLAotCQkgIHByb2Nlc3NvciwgY2lhKTsKLSAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHNldCBjaGFuZ2UgYml0IC0gdGxiPTB4JWx4ICZwdGUxPTB4JWx4XG4iLAotCQkgICAgIChsb25nKWVhLCAobG9uZylwYWdlX3RsYl9lbnRyeSwKLQkJICAgICAobG9uZylwYWdlX3RsYl9lbnRyeS0+cmVhbF9hZGRyZXNzX29mX3B0ZV8xKSk7Ci0gIH0KLQotICByYSA9IChwYWdlX3RsYl9lbnRyeS0+bWFza2VkX3JlYWxfcGFnZV9udW1iZXIgfCBvbV9lYV9tYXNrZWRfYnl0ZShlYSkpOwotICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHBhZ2UgdHJhbnNsYXRpb24gLSByYT0weCVseFxuIiwKLQkJICAgKGxvbmcpZWEsIChsb25nKXJhKSk7Ci0gIHJldHVybiByYTsKLX0KLQotCi0vKgotICogRGVmaW5pdGlvbiBvZiBvcGVyYXRpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICovCi0KLQotLyogcmVidWlsZCBhbGwgdGhlIHJlbGV2YW50IGJhdCBpbmZvcm1hdGlvbiAqLwotU1RBVElDX0lOTElORV9WTVwKLSh2b2lkKQotb21fdW5wYWNrX2JhdChvbV9iYXQgKmJhdCwKLQkgICAgICBzcHJlZyB1YmF0LAotCSAgICAgIHNwcmVnIGxiYXQpCi17Ci0gIC8qIGZvciBleHRyYWN0aW5nIG91dCB0aGUgb2Zmc2V0IHdpdGhpbiBhIHBhZ2UgKi8KLSAgYmF0LT5ibG9ja19sZW5ndGhfbWFzayA9ICgoTUFTS0VEKHViYXQsIDUxLCA2MSkgPDwgKDE3LTIpKQotCQkJICAgIHwgTUFTSyg2My0xNysxLCA2MykpOwotCi0gIC8qIGZvciBjaGVja2luZyB0aGUgZWZmZWN0aXZlIHBhZ2UgaW5kZXggKi8KLSAgYmF0LT5ibG9ja19lZmZlY3RpdmVfcGFnZV9pbmRleCA9IE1BU0tFRCh1YmF0LCAwLCA0Nik7Ci0gIGJhdC0+YmxvY2tfZWZmZWN0aXZlX3BhZ2VfaW5kZXhfbWFzayA9IH5iYXQtPmJsb2NrX2xlbmd0aF9tYXNrOwotCi0gIC8qIHByb3RlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgYmF0LT5wcm90ZWN0aW9uX2JpdHMgPSBFWFRSQUNURUQobGJhdCwgNjIsIDYzKTsKLSAgYmF0LT5ibG9ja19yZWFsX3BhZ2VfbnVtYmVyID0gTUFTS0VEKGxiYXQsIDAsIDQ2KTsKLX0KLQotCi0vKiByZWJ1aWxkIHRoZSBnaXZlbiBiYXQgdGFibGUgKi8KLVNUQVRJQ19JTkxJTkVfVk1cCi0odm9pZCkKLW9tX3VucGFja19iYXRzKG9tX2JhdHMgKmJhdHMsCi0JICAgICAgIHNwcmVnICpyYXdfYmF0cywKLQkgICAgICAgbXNyZWcgbXNyKQotewotICBpbnQgaTsKLSAgYmF0cy0+bnJfdmFsaWRfYmF0X3JlZ2lzdGVycyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9vbV9iYXRfcmVnaXN0ZXJzKjI7IGkgKz0gMikgewotICAgIHNwcmVnIHViYXQgPSByYXdfYmF0c1tpXTsKLSAgICBzcHJlZyBsYmF0ID0gcmF3X2JhdHNbaSsxXTsKLSAgICBpZiAoKG1zciAmIG1zcl9wcm9ibGVtX3N0YXRlKQotCT8gRVhUUkFDVEVEKHViYXQsIDYzLCA2MykKLQk6IEVYVFJBQ1RFRCh1YmF0LCA2MiwgNjIpKSB7Ci0gICAgICBvbV91bnBhY2tfYmF0KCZiYXRzLT5iYXRbYmF0cy0+bnJfdmFsaWRfYmF0X3JlZ2lzdGVyc10sCi0JCSAgICB1YmF0LCBsYmF0KTsKLSAgICAgIGJhdHMtPm5yX3ZhbGlkX2JhdF9yZWdpc3RlcnMgKz0gMTsKLSAgICB9Ci0gIH0KLX0KLQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLVNUQVRJQ19JTkxJTkVfVk1cCi0odm9pZCkKLW9tX3VucGFja19zcih2bSAqdmlydHVhbCwKLQkgICAgIHNyZWcgKnNycywKLQkgICAgIGludCB3aGljaF9zciwKLQkgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIG9tX3NlZ21lbnRfdGxiX2VudHJ5ICpzZWdtZW50X3RsYl9lbnRyeSA9IDA7Ci0gIHNyZWcgbmV3X3NyX3ZhbHVlID0gMDsKLQotICAvKiBjaGVjayByZWdpc3RlciBpbiByYW5nZSAqLwotICBBU1NFUlQod2hpY2hfc3IgPj0gMCAmJiB3aGljaF9zciA8IG5yX29tX3NlZ21lbnRfdGxiX2VudHJpZXMpOwotCi0gIC8qIGdldCB0aGUgd29ya2luZyB2YWx1ZXMgKi8KLSAgc2VnbWVudF90bGJfZW50cnkgPSAmdmlydHVhbC0+c2VnbWVudF90bGIuZW50cnlbd2hpY2hfc3JdOyAgCi0gIG5ld19zcl92YWx1ZSA9IHNyc1t3aGljaF9zcl07Ci0gIAotICAvKiBkbyB3ZSBzdXBwb3J0IHRoaXMgKi8KLSAgaWYgKE1BU0tFRDMyKG5ld19zcl92YWx1ZSwgMCwgMCkpCi0gICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAidW5zdXBwb3J0ZWQgdmFsdWUgb2YgVCBpbiBzZWdtZW50IHJlZ2lzdGVyICVkIiwKLQkgICAgICB3aGljaF9zcik7Ci0KLSAgLyogdXBkYXRlIGluZm8gKi8KLSAgc2VnbWVudF90bGJfZW50cnktPmtleVtvbV9zdXBlcnZpc29yX3N0YXRlXSA9IEVYVFJBQ1RFRDMyKG5ld19zcl92YWx1ZSwgMSwgMSk7Ci0gIHNlZ21lbnRfdGxiX2VudHJ5LT5rZXlbb21fcHJvYmxlbV9zdGF0ZV0gPSBFWFRSQUNURUQzMihuZXdfc3JfdmFsdWUsIDIsIDIpOwotICBzZWdtZW50X3RsYl9lbnRyeS0+aW52YWxpZF9hY2Nlc3MgPSAoTUFTS0VEMzIobmV3X3NyX3ZhbHVlLCAzLCAzKQotCQkJCSAgICAgICA/IG9tX2luc3RydWN0aW9uX3JlYWQKLQkJCQkgICAgICAgOiBvbV9hY2Nlc3NfYW55KTsKLSAgc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPQotICAgIElOU0VSVEVEMzIoRVhUUkFDVEVEMzIobmV3X3NyX3ZhbHVlLCA4LCAzMSksCi0JICAgICAgIDMxLTYtMjQrMSwgMzEtNik7IC8qIGFsaWduZWQgcmVhZHkgZm9yIHB0ZSBncm91cCBhZGRyICovCi19Ci0jZW5kaWYKLQotCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLVNUQVRJQ19JTkxJTkVfVk1cCi0odm9pZCkKLW9tX3VucGFja19zcnModm0gKnZpcnR1YWwsCi0JICAgICAgc3JlZyAqc3JzLAotCSAgICAgIGNwdSAqcHJvY2Vzc29yLAotCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotICBpbnQgd2hpY2hfc3I7Ci0gIGZvciAod2hpY2hfc3IgPSAwOyB3aGljaF9zciA8IG5yX29tX3NlZ21lbnRfdGxiX2VudHJpZXM7IHdoaWNoX3NyKyspIHsKLSAgICBvbV91bnBhY2tfc3IodmlydHVhbCwgc3JzLCB3aGljaF9zciwKLQkJIHByb2Nlc3NvciwgY2lhKTsKLSAgfQotfQotI2VuZGlmCi0KLQotLyogUmVidWlsZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIG5ldyBjb250ZXh0IGFzIHNwZWNpZmVkIGJ5Ci0gICB0aGUgcGFzc2VkIHJlZ2lzdGVycyAqLwotSU5MSU5FX1ZNXAotKHZvaWQpCi12bV9zeW5jaHJvbml6ZV9jb250ZXh0KHZtICp2aXJ0dWFsLAotCQkgICAgICAgc3ByZWcgKnNwcnMsCi0JCSAgICAgICBzcmVnICpzcnMsCi0JCSAgICAgICBtc3JlZyBtc3IsCi0JCSAgICAgICAvKiovCi0JCSAgICAgICBjcHUgKnByb2Nlc3NvciwKLQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQotewotCi0gIC8qIGVuYWJsZS9kaXNhYmxlIHRyYW5zbGF0aW9uICovCi0gIGludCBwcm9ibGVtX3N0YXRlID0gKG1zciAmIG1zcl9wcm9ibGVtX3N0YXRlKSAhPSAwOwotICBpbnQgZGF0YV9yZWxvY2F0ZSA9IChtc3IgJiBtc3JfZGF0YV9yZWxvY2F0ZSkgIT0gMDsKLSAgaW50IGluc3RydWN0aW9uX3JlbG9jYXRlID0gKG1zciAmIG1zcl9pbnN0cnVjdGlvbl9yZWxvY2F0ZSkgIT0gMDsKLSAgaW50IGxpdHRsZV9lbmRpYW4gPSAobXNyICYgbXNyX2xpdHRsZV9lbmRpYW5fbW9kZSkgIT0gMDsKLQotICB1bnNpZ25lZF93b3JkIHBhZ2VfdGFibGVfaGFzaF9tYXNrOwotICB1bnNpZ25lZF93b3JkIHJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlOwotIAotICAvKiB1cGRhdGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAqLwotICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24uaXNfcmVsb2NhdGUgPSBpbnN0cnVjdGlvbl9yZWxvY2F0ZTsKLSAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLmlzX3Byb2JsZW1fc3RhdGUgPSBwcm9ibGVtX3N0YXRlOwotICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5pc19yZWxvY2F0ZSA9IGRhdGFfcmVsb2NhdGU7Ci0gIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLmlzX3Byb2JsZW1fc3RhdGUgPSBwcm9ibGVtX3N0YXRlOwotCi0gIC8qIHVwZGF0ZSBiYXQgcmVnaXN0ZXJzIGZvciB0aGUgbmV3IGNvbnRleHQgKi8KLSAgb21fdW5wYWNrX2JhdHMoJnZpcnR1YWwtPmliYXRzLCAmc3Byc1tzcHJfaWJhdDB1XSwgbXNyKTsKLSAgb21fdW5wYWNrX2JhdHMoJnZpcnR1YWwtPmRiYXRzLCAmc3Byc1tzcHJfZGJhdDB1XSwgbXNyKTsKLQotICAvKiB1bnBhY2sgU0RSMSAtIHRoZSBzdG9yYWdlIGRlc2NyaXB0aW9uIHJlZ2lzdGVyIDEgKi8KLSNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQotICByZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZSA9IE1BU0tFRDY0KHNwcnNbc3ByX3NkcjFdLCAwLCA0NSk7Ci0gIHBhZ2VfdGFibGVfaGFzaF9tYXNrID0gTUFTSzY0KDE4KzI4LUVYVFJBQ1RFRDY0KHNwcnNbc3ByX3NkcjFdLCA1OSwgNjMpLAotCQkJCTYzLTcpOwotI2VuZGlmCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgcmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUgPSBNQVNLRUQzMihzcHJzW3Nwcl9zZHIxXSwgMCwgMTUpOwotICBwYWdlX3RhYmxlX2hhc2hfbWFzayA9IChJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHNwcnNbc3ByX3NkcjFdLCAyMywgMzEpLAotCQkJCSAgICAgNywgNys5LTEpCi0JCQkgIHwgTUFTSzMyKDcrOSwgMzEtNikpOwotI2VuZGlmCi0gIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5yZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZSA9IHJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlOwotICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24ucGFnZV90YWJsZV9oYXNoX21hc2sgPSBwYWdlX3RhYmxlX2hhc2hfbWFzazsKLSAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24ucmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUgPSByZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZTsKLSAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24ucGFnZV90YWJsZV9oYXNoX21hc2sgPSBwYWdlX3RhYmxlX2hhc2hfbWFzazsKLQotCi0gIC8qIHVucGFjayB0aGUgc2VnbWVudCB0bGIgcmVnaXN0ZXJzICovCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKLSAgb21fdW5wYWNrX3Nycyh2aXJ0dWFsLCBzcnMsCi0JCXByb2Nlc3NvciwgY2lhKTsKLSNlbmRpZgotIAotICAvKiBzZXQgdXAgdGhlIFhPUiByZWdpc3RlcnMgaWYgdGhlIGN1cnJlbnQgZW5kaWFuIG1vZGUgY29uZmxpY3RzCi0gICAgIHdpdGggd2hhdCBpcyBpbiB0aGUgTVNSICovCi0gIGlmIChXSVRIX1hPUl9FTkRJQU4pIHsKLSAgICBpbnQgaSA9IDE7Ci0gICAgdW5zaWduZWQgbWFzazsKLSAgICBpZiAoKGxpdHRsZV9lbmRpYW4gJiYgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQotCXx8ICghbGl0dGxlX2VuZGlhbiAmJiBDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pKQotICAgICAgbWFzayA9IDA7Ci0gICAgZWxzZQotICAgICAgbWFzayA9IFdJVEhfWE9SX0VORElBTiAtIDE7Ci0gICAgd2hpbGUgKGkgLSAxIDwgV0lUSF9YT1JfRU5ESUFOKSB7Ci0gICAgICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24ueG9yW2ktMV0gPSBtYXNrOwotICAgICAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24ueG9yW2ktMV0gPSAgbWFzazsKLSAgICAgIG1hc2sgPSAobWFzayA8PCAxKSAmIChXSVRIX1hPUl9FTkRJQU4gLSAxKTsKLSAgICAgIGkgPSBpICogMjsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogZG9uJ3QgYWxsb3cgdGhlIHByb2Nlc3NvciB0byBjaGFuZ2UgZW5kaWFuIG1vZGVzICovCi0gICAgaWYgKChsaXR0bGVfZW5kaWFuICYmIENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKLQl8fCAoIWxpdHRsZV9lbmRpYW4gJiYgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKSkKLSAgICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgImF0dGVtcHQgdG8gY2hhbmdlIGhhcmR3aXJlZCBieXRlIG9yZGVyIik7Ci0gIH0KLX0KLQotLyogdXBkYXRlIHZtIGRhdGEgc3RydWN0dXJlcyBkdWUgdG8gYSBUTEIgb3BlcmF0aW9uICovCi0KLUlOTElORV9WTVwKLSh2b2lkKQotdm1fcGFnZV90bGJfaW52YWxpZGF0ZV9lbnRyeSh2bSAqbWVtb3J5LAotCQkJICAgICB1bnNpZ25lZF93b3JkIGVhKQotewotICBpbnQgaSA9IG9tX3BhZ2VfdGxiX2luZGV4KGVhKTsKLSAgbWVtb3J5LT5pbnN0cnVjdGlvbl90bGIuZW50cnlbaV0ubWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCA9IE1BU0soMCwgNjMpOwotICBtZW1vcnktPmRhdGFfdGxiLmVudHJ5W2ldLm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPSBNQVNLKDAsIDYzKTsKLSAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSB0bGIgaW52YWxpZGF0ZSBlbnRyeVxuIiwgKGxvbmcpZWEpKTsKLX0KLQotSU5MSU5FX1ZNXAotKHZvaWQpCi12bV9wYWdlX3RsYl9pbnZhbGlkYXRlX2FsbCh2bSAqbWVtb3J5KQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IG5yX29tX3BhZ2VfdGxiX2VudHJpZXM7IGkrKykgewotICAgIG1lbW9yeS0+aW5zdHJ1Y3Rpb25fdGxiLmVudHJ5W2ldLm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPSBNQVNLKDAsIDYzKTsKLSAgICBtZW1vcnktPmRhdGFfdGxiLmVudHJ5W2ldLm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPSBNQVNLKDAsIDYzKTsKLSAgfQotICBUUkFDRSh0cmFjZV92bSwgKCJ0bGIgaW52YWxpZGF0ZSBhbGxcbiIpKTsKLX0KLQotCi0KLUlOTElORV9WTVwKLSh2bV9kYXRhX21hcCAqKQotdm1fY3JlYXRlX2RhdGFfbWFwKHZtICptZW1vcnkpCi17Ci0gIHJldHVybiAmbWVtb3J5LT5kYXRhX21hcDsKLX0KLQotCi1JTkxJTkVfVk1cCi0odm1faW5zdHJ1Y3Rpb25fbWFwICopCi12bV9jcmVhdGVfaW5zdHJ1Y3Rpb25fbWFwKHZtICptZW1vcnkpCi17Ci0gIHJldHVybiAmbWVtb3J5LT5pbnN0cnVjdGlvbl9tYXA7Ci19Ci0KLQotU1RBVElDX0lOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKQotdm1fdHJhbnNsYXRlKG9tX21hcCAqbWFwLAotCSAgICAgdW5zaWduZWRfd29yZCBlYSwKLQkgICAgIG9tX2FjY2Vzc190eXBlcyBhY2Nlc3MsCi0JICAgICBjcHUgKnByb2Nlc3NvciwKLQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAotCSAgICAgaW50IGFib3J0KQotewotICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKLSAgY2FzZSBVU0VSX0VOVklST05NRU5UOgotICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6Ci0gICAgcmV0dXJuIGVhOwotICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKLSAgICByZXR1cm4gb21fdHJhbnNsYXRlX2VmZmVjdGl2ZV90b19yZWFsKG1hcCwgZWEsIGFjY2VzcywKLQkJCQkJICBwcm9jZXNzb3IsIGNpYSwKLQkJCQkJICBhYm9ydCk7Ci0gIGRlZmF1bHQ6Ci0gICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gdm1fdHJhbnNsYXRlIC0gYmFkIHN3aXRjaCIpOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLQotSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpCi12bV9yZWFsX2RhdGFfYWRkcih2bV9kYXRhX21hcCAqbWFwLAotCQkgIHVuc2lnbmVkX3dvcmQgZWEsCi0JCSAgaW50IGlzX3JlYWQsCi0JCSAgY3B1ICpwcm9jZXNzb3IsCi0JCSAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIHJldHVybiB2bV90cmFuc2xhdGUoJm1hcC0+dHJhbnNsYXRpb24sCi0JCSAgICAgIGVhLAotCQkgICAgICBpc19yZWFkID8gb21fZGF0YV9yZWFkIDogb21fZGF0YV93cml0ZSwKLQkJICAgICAgcHJvY2Vzc29yLAotCQkgICAgICBjaWEsCi0JCSAgICAgIDEpOyAvKmFib3J0Ki8KLX0KLQotCi1JTkxJTkVfVk1cCi0odW5zaWduZWRfd29yZCkKLXZtX3JlYWxfaW5zdHJ1Y3Rpb25fYWRkcih2bV9pbnN0cnVjdGlvbl9tYXAgKm1hcCwKLQkJCSBjcHUgKnByb2Nlc3NvciwKLQkJCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgcmV0dXJuIHZtX3RyYW5zbGF0ZSgmbWFwLT50cmFuc2xhdGlvbiwKLQkJICAgICAgY2lhLAotCQkgICAgICBvbV9pbnN0cnVjdGlvbl9yZWFkLAotCQkgICAgICBwcm9jZXNzb3IsCi0JCSAgICAgIGNpYSwKLQkJICAgICAgMSk7IC8qYWJvcnQqLwotfQotCi1JTkxJTkVfVk1cCi0oaW5zdHJ1Y3Rpb25fd29yZCkKLXZtX2luc3RydWN0aW9uX21hcF9yZWFkKHZtX2luc3RydWN0aW9uX21hcCAqbWFwLAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWRfd29yZCByYSA9IHZtX3JlYWxfaW5zdHJ1Y3Rpb25fYWRkcihtYXAsIHByb2Nlc3NvciwgY2lhKTsKLSAgQVNTRVJUKChjaWEgJiAweDMpID09IDApOyAvKiBhbHdheXMgYWxpZ25lZCAqLwotICBpZiAoV0lUSF9YT1JfRU5ESUFOKQotICAgIHJhIF49IG1hcC0+dHJhbnNsYXRpb24ueG9yW3NpemVvZihpbnN0cnVjdGlvbl93b3JkKSAtIDFdOwotICByZXR1cm4gY29yZV9tYXBfcmVhZF80KG1hcC0+Y29kZSwgcmEsIHByb2Nlc3NvciwgY2lhKTsKLX0KLQotCi1JTkxJTkVfVk1cCi0oaW50KQotdm1fZGF0YV9tYXBfcmVhZF9idWZmZXIodm1fZGF0YV9tYXAgKm1hcCwKLQkJCXZvaWQgKnRhcmdldCwKLQkJCXVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCXVuc2lnbmVkIG5yX2J5dGVzLAotCQkJY3B1ICpwcm9jZXNzb3IsCi0JCQl1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWQgY291bnQ7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG5yX2J5dGVzOyBjb3VudCsrKSB7Ci0gICAgdW5zaWduZWRfMSBieXRlOwotICAgIHVuc2lnbmVkX3dvcmQgZWEgPSBhZGRyICsgY291bnQ7Ci0gICAgdW5zaWduZWRfd29yZCByYSA9IHZtX3RyYW5zbGF0ZSgmbWFwLT50cmFuc2xhdGlvbiwKLQkJCQkgICAgZWEsIG9tX2RhdGFfcmVhZCwKLQkJCQkgICAgcHJvY2Vzc29yLCAvKnByb2Nlc3NvciovCi0JCQkJICAgIGNpYSwgLypjaWEqLwotCQkJCSAgICBwcm9jZXNzb3IgIT0gTlVMTCk7IC8qYWJvcnQ/Ki8KLSAgICBpZiAocmEgPT0gTUFTSygwLCA2MykpCi0gICAgICBicmVhazsKLSAgICBpZiAoV0lUSF9YT1JfRU5ESUFOKQotICAgICAgcmEgXj0gbWFwLT50cmFuc2xhdGlvbi54b3JbMF07Ci0gICAgaWYgKGNvcmVfbWFwX3JlYWRfYnVmZmVyKG1hcC0+cmVhZCwgJmJ5dGUsIHJhLCBzaXplb2YoYnl0ZSkpCi0JIT0gc2l6ZW9mKGJ5dGUpKQotICAgICAgYnJlYWs7Ci0gICAgKCh1bnNpZ25lZF8xKil0YXJnZXQpW2NvdW50XSA9IFQySF8xKGJ5dGUpOwotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotCi1JTkxJTkVfVk1cCi0oaW50KQotdm1fZGF0YV9tYXBfd3JpdGVfYnVmZmVyKHZtX2RhdGFfbWFwICptYXAsCi0JCQkgY29uc3Qgdm9pZCAqc291cmNlLAotCQkJIHVuc2lnbmVkX3dvcmQgYWRkciwKLQkJCSB1bnNpZ25lZCBucl9ieXRlcywKLQkJCSBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbiwKLQkJCSBjcHUgKnByb2Nlc3NvciwKLQkJCSB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgdW5zaWduZWQgY291bnQ7Ci0gIHVuc2lnbmVkXzEgYnl0ZTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbnJfYnl0ZXM7IGNvdW50KyspIHsKLSAgICB1bnNpZ25lZF93b3JkIGVhID0gYWRkciArIGNvdW50OwotICAgIHVuc2lnbmVkX3dvcmQgcmEgPSB2bV90cmFuc2xhdGUoJm1hcC0+dHJhbnNsYXRpb24sCi0JCQkJICAgIGVhLCBvbV9kYXRhX3dyaXRlLAotCQkJCSAgICBwcm9jZXNzb3IsCi0JCQkJICAgIGNpYSwKLQkJCQkgICAgcHJvY2Vzc29yICE9IE5VTEwpOyAvKmFib3J0PyovCi0gICAgaWYgKHJhID09IE1BU0soMCwgNjMpKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKFdJVEhfWE9SX0VORElBTikKLSAgICAgIHJhIF49IG1hcC0+dHJhbnNsYXRpb24ueG9yWzBdOwotICAgIGJ5dGUgPSBUMkhfMSgoKHVuc2lnbmVkXzEqKXNvdXJjZSlbY291bnRdKTsKLSAgICBpZiAoY29yZV9tYXBfd3JpdGVfYnVmZmVyKCh2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uCi0JCQkgICAgICAgPyBtYXAtPnJlYWQKLQkJCSAgICAgICA6IG1hcC0+d3JpdGUpLAotCQkJICAgICAgJmJ5dGUsIHJhLCBzaXplb2YoYnl0ZSkpICE9IHNpemVvZihieXRlKSkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotCi0vKiBkZWZpbmUgdGhlIHJlYWQvd3JpdGUgMS8yLzQvOC93b3JkIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIE4gMQotI2luY2x1ZGUgInZtX24uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiAyCi0jaW5jbHVkZSAidm1fbi5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDQKLSNpbmNsdWRlICJ2bV9uLmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gOAotI2luY2x1ZGUgInZtX24uaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiB3b3JkCi0jaW5jbHVkZSAidm1fbi5oIgotI3VuZGVmIE4KLQotCi0KLSNlbmRpZiAvKiBfVk1fQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvdm0uaCBiL3NpbS9wcGMvdm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjNGM4Yy4uMDAwMDAwMAotLS0gYS9zaW0vcHBjL3ZtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIAotICAgICovCi0KLQotI2lmbmRlZiBfVk1fSF8KLSNkZWZpbmUgX1ZNX0hfCi0KLXR5cGVkZWYgc3RydWN0IF92bSB2bTsKLXR5cGVkZWYgc3RydWN0IF92bV9kYXRhX21hcCB2bV9kYXRhX21hcDsKLXR5cGVkZWYgc3RydWN0IF92bV9pbnN0cnVjdGlvbl9tYXAgdm1faW5zdHJ1Y3Rpb25fbWFwOwotCi0KLS8qIGVhY2ggUG93ZXJQQyByZXF1aXJlcyB0d28gdmlydHVhbCBtZW1vcnkgbWFwcyAqLwotCi1JTkxJTkVfVk1cCi0odm0gKikgdm1fY3JlYXRlCi0oY29yZSAqbWVtb3J5KTsKLQotSU5MSU5FX1ZNXAotKHZtX2RhdGFfbWFwICopIHZtX2NyZWF0ZV9kYXRhX21hcAotKHZtICptZW1vcnkpOwotCi1JTkxJTkVfVk1cCi0odm1faW5zdHJ1Y3Rpb25fbWFwICopIHZtX2NyZWF0ZV9pbnN0cnVjdGlvbl9tYXAKLSh2bSAqbWVtb3J5KTsKLQotCi0vKiBhZGRyZXNzIHRyYW5zbGF0aW9uLCBpZiB0aGUgdHJhbnNsYXRpb24gaXMgaW52YWxpZAotICAgdGhlc2Ugd2lsbCBub3QgcmV0dXJuICovCi0KLUlOTElORV9WTVwKLSh1bnNpZ25lZF93b3JkKSB2bV9yZWFsX2RhdGFfYWRkcgotKHZtX2RhdGFfbWFwICpkYXRhX21hcCwKLSB1bnNpZ25lZF93b3JkIGVhLAotIGludCBpc19yZWFkLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotSU5MSU5FX1ZNXAotKHVuc2lnbmVkX3dvcmQpIHZtX3JlYWxfaW5zdHJ1Y3Rpb25fYWRkcgotKHZtX2luc3RydWN0aW9uX21hcCAqaW5zdHJ1Y3Rpb25fbWFwLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotCi0vKiBnZW5lcmljIGJsb2NrIHRyYW5zZmVycy4gIERlcGVuZGFudCBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlCi0gICBQUk9DRVNTT1IgYXJnLCBlaXRoZXIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQgb3IgKGlmCi0gICBQUk9DRVNTT1IgaXMgbm9uIE5VTEwpIGFib3J0cyB0aGUgc2ltdWxhdGlvbiAqLwotCi1JTkxJTkVfVk1cCi0oaW50KSB2bV9kYXRhX21hcF9yZWFkX2J1ZmZlcgotKHZtX2RhdGFfbWFwICptYXAsCi0gdm9pZCAqdGFyZ2V0LAotIHVuc2lnbmVkX3dvcmQgYWRkciwKLSB1bnNpZ25lZCBsZW4sCi0gY3B1ICpwcm9jZXNzb3IsCi0gdW5zaWduZWRfd29yZCBjaWEpOwotCi1JTkxJTkVfVk1cCi0oaW50KSB2bV9kYXRhX21hcF93cml0ZV9idWZmZXIKLSh2bV9kYXRhX21hcCAqbWFwLAotIGNvbnN0IHZvaWQgKnNvdXJjZSwKLSB1bnNpZ25lZF93b3JkIGFkZHIsCi0gdW5zaWduZWQgbGVuLAotIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uLAotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotCi0vKiBmZXRjaCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBmcm9tIG1lbW9yeSAqLwotCi1JTkxJTkVfVk1cCi0oaW5zdHJ1Y3Rpb25fd29yZCkgdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQKLSh2bV9pbnN0cnVjdGlvbl9tYXAgKmluc3RydWN0aW9uX21hcCwKLSBjcHUgKnByb2Nlc3NvciwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLQotLyogcmVhZCBkYXRhIGZyb20gbWVtb3J5ICovCi0KLSNkZWZpbmUgREVDTEFSRV9WTV9EQVRBX01BUF9SRUFEX04oTikgXAotSU5MSU5FX1ZNXAotKHVuc2lnbmVkXyMjTikgdm1fZGF0YV9tYXBfcmVhZF8jI04gXAotKHZtX2RhdGFfbWFwICptYXAsIFwKLSB1bnNpZ25lZF93b3JkIGVhLCBcCi0gY3B1ICpwcm9jZXNzb3IsIFwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLURFQ0xBUkVfVk1fREFUQV9NQVBfUkVBRF9OKDEpCi1ERUNMQVJFX1ZNX0RBVEFfTUFQX1JFQURfTigyKQotREVDTEFSRV9WTV9EQVRBX01BUF9SRUFEX04oNCkKLURFQ0xBUkVfVk1fREFUQV9NQVBfUkVBRF9OKDgpCi1ERUNMQVJFX1ZNX0RBVEFfTUFQX1JFQURfTih3b3JkKQotCi0KLS8qIHdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCi0KLSNkZWZpbmUgREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKE4pIFwKLUlOTElORV9WTVwKLSh2b2lkKSB2bV9kYXRhX21hcF93cml0ZV8jI04gXAotKHZtX2RhdGFfbWFwICptYXAsIFwKLSB1bnNpZ25lZF93b3JkIGFkZHIsIFwKLSB1bnNpZ25lZF8jI04gdmFsLCBcCi0gY3B1ICpwcm9jZXNzb3IsIFwKLSB1bnNpZ25lZF93b3JkIGNpYSk7Ci0KLURFQ0xBUkVfVk1fREFUQV9NQVBfV1JJVEVfTigxKQotREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKDIpCi1ERUNMQVJFX1ZNX0RBVEFfTUFQX1dSSVRFX04oNCkKLURFQ0xBUkVfVk1fREFUQV9NQVBfV1JJVEVfTig4KQotREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKHdvcmQpCi0KLQotLyogdXBkYXRlIHZtIGRhdGEgc3RydWN0dXJlcyBkdWUgdG8gYSBzeW5jaHJvbml6YXRpb24gcG9pbnQgKi8KLQotSU5MSU5FX1ZNXAotKHZvaWQpIHZtX3N5bmNocm9uaXplX2NvbnRleHQKLSh2bSAqbWVtb3J5LAotIHNwcmVnICpzcHJzLAotIHNyZWcgKnNycywKLSBtc3JlZyBtc3IsCi0gLyoqLwotIGNwdSAqcHJvY2Vzc29yLAotIHVuc2lnbmVkX3dvcmQgY2lhKTsKLQotCi0vKiB1cGRhdGUgdm0gZGF0YSBzdHJ1Y3R1cmVzIGR1ZSB0byBhIFRMQiBvcGVyYXRpb24gKi8KLQotSU5MSU5FX1ZNXAotKHZvaWQpIHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkKLSh2bSAqbWVtb3J5LAotIHVuc2lnbmVkX3dvcmQgZWEpOwotCi1JTkxJTkVfVk1cCi0odm9pZCkgdm1fcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwKLSh2bSAqbWVtb3J5KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL3ZtX24uaCBiL3NpbS9wcGMvdm1fbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjIyZmZhLi4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvdm1fbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAKLSAgICAqLwotCi0KLSNpZm5kZWYgTgotI2Vycm9yICJOIG11c3QgYmUgI2RlZmluZWQiCi0jZW5kaWYKLQotLyogTk9URTogU2VlIGVuZCBvZiBmaWxlIGZvciAjdW5kZWYgKi8KLSNkZWZpbmUgdW5zaWduZWRfTiBYQ09OQ0FUMih1bnNpZ25lZF8sTikKLSNkZWZpbmUgVDJIX04gWENPTkNBVDIoVDJIXyxOKQotI2RlZmluZSBIMlRfTiBYQ09OQ0FUMihIMlRfLE4pCi0jZGVmaW5lIHZtX2RhdGFfbWFwX3JlYWRfTiBYQ09OQ0FUMih2bV9kYXRhX21hcF9yZWFkXyxOKQotI2RlZmluZSB2bV9kYXRhX21hcF93cml0ZV9OIFhDT05DQVQyKHZtX2RhdGFfbWFwX3dyaXRlXyxOKQotCi0KLUlOTElORV9WTVwKLSh1bnNpZ25lZF9OKQotdm1fZGF0YV9tYXBfcmVhZF9OKHZtX2RhdGFfbWFwICptYXAsCi0JCSAgIHVuc2lnbmVkX3dvcmQgZWEsCi0JCSAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKLXsKLSAgaWYgKChlYSAmIChzaXplb2YodW5zaWduZWRfTiktMSkpID09IDApIHsKLSAgICB1bnNpZ25lZCByYSA9IHZtX3JlYWxfZGF0YV9hZGRyKG1hcCwgZWEsIDEvKmlzLXJlYWQqLywgcHJvY2Vzc29yLCBjaWEpOwotICAgIHVuc2lnbmVkX04gdmFsOwotICAgIGlmIChXSVRIX1hPUl9FTkRJQU4pCi0gICAgICByYSBePSBtYXAtPnRyYW5zbGF0aW9uLnhvcltzaXplb2YodW5zaWduZWRfTikgLSAxXTsKLSAgICB2YWwgPSBYQ09OQ0FUMihjb3JlX21hcF9yZWFkXyxOKShtYXAtPnJlYWQsIHJhLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgaWYgKFdJVEhfTU9OICYgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQpCi0gICAgICBtb25fcmVhZChlYSwgcmEsIHNpemVvZih1bnNpZ25lZF9OKSwgcHJvY2Vzc29yLCBjaWEpOwotICAgIFRSQUNFKHRyYWNlX2xvYWRfc3RvcmUsICgibG9hZCBjaWE9MHglbHggZWE9MHglbHggTj0lbGQgdmFsPTB4JWx4XG4iLAotCQkJICAgICAobG9uZyljaWEsIChsb25nKWVhLCAobG9uZylzaXplb2YodW5zaWduZWRfTiksIChsb25nKXZhbCkpOwotICAgIHJldHVybiB2YWw7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3dpdGNoIChDVVJSRU5UX0FMSUdOTUVOVCkgewotICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKLSAgICAgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoKLSAgICAgIHsKLQl1bnNpZ25lZF9OIHZhbDsKLQlpZiAodm1fZGF0YV9tYXBfcmVhZF9idWZmZXIobWFwLCAmdmFsLCBlYSwgc2l6ZW9mKHVuc2lnbmVkX04pLCBwcm9jZXNzb3IsIGNpYSkKLQkgICAgIT0gc2l6ZW9mKHVuc2lnbmVkX04pKSB7Ci0JICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJtaXNhbGlnbmVkICVkIGJ5dGUgcmVhZCB0byAweCVseCBmYWlsZWQiLAotCQkgICAgc2l6ZW9mKHVuc2lnbmVkX04pLCAodW5zaWduZWQgbG9uZyllYSk7Ci0JfQotCXZhbCA9IFQySF9OKHZhbCk7Ci0JaWYgKFdJVEhfTU9OICYgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQpIHsKLQkgIC8qIFlVQ0sgKi8KLQkgIHVuc2lnbmVkIHJhID0gdm1fcmVhbF9kYXRhX2FkZHIobWFwLCBlYSwgMSwgcHJvY2Vzc29yLCBjaWEpOwotCSAgbW9uX3JlYWQoZWEsIHJhLCBzaXplb2YodW5zaWduZWRfTiksIHByb2Nlc3NvciwgY2lhKTsKLQl9Ci0JVFJBQ0UodHJhY2VfbG9hZF9zdG9yZSwgKCJsb2FkIGNpYT0weCVseCBlYT0weCVseCBOPSVsZCBkYXRhPTB4JWx4XG4iLAotCQkJCSAobG9uZyljaWEsIChsb25nKWVhLCAobG9uZylzaXplb2YodW5zaWduZWRfTiksIChsb25nKXZhbCkpOwotCXJldHVybiB2YWw7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHZtX2RhdGFfbWFwX3JlYWRfTiAtIGJhZCBzd2l0Y2giKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotfQotCi1JTkxJTkVfVk1cCi0odm9pZCkKLXZtX2RhdGFfbWFwX3dyaXRlX04odm1fZGF0YV9tYXAgKm1hcCwKLQkJICAgIHVuc2lnbmVkX3dvcmQgZWEsCi0JCSAgICB1bnNpZ25lZF9OIHZhbCwKLQkJICAgIGNwdSAqcHJvY2Vzc29yLAotCQkgICAgdW5zaWduZWRfd29yZCBjaWEpCi17Ci0gIGlmICgoZWEgJiAoc2l6ZW9mKHVuc2lnbmVkX04pLTEpKSA9PSAwKSB7Ci0gICAgdW5zaWduZWQgcmEgPSB2bV9yZWFsX2RhdGFfYWRkcihtYXAsIGVhLCAwLyppcy1yZWFkPyovLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgaWYgKFdJVEhfWE9SX0VORElBTikKLSAgICAgIHJhIF49IG1hcC0+dHJhbnNsYXRpb24ueG9yW3NpemVvZih1bnNpZ25lZF9OKSAtIDFdOwotICAgIFhDT05DQVQyKGNvcmVfbWFwX3dyaXRlXyxOKShtYXAtPndyaXRlLCByYSwgdmFsLCBwcm9jZXNzb3IsIGNpYSk7Ci0gICAgaWYgKFdJVEhfTU9OICYgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQpCi0gICAgICBtb25fd3JpdGUoZWEsIHJhLCBzaXplb2YodW5zaWduZWRfTiksIHByb2Nlc3NvciwgY2lhKTsKLSAgICBUUkFDRSh0cmFjZV9sb2FkX3N0b3JlLCAoInN0b3JlIGNpYT0weCVseCBlYT0weCVseCBOPSVsZCB2YWw9MHglbHhcbiIsCi0JCQkgICAgIChsb25nKWNpYSwgKGxvbmcpZWEsIChsb25nKXNpemVvZih1bnNpZ25lZF9OKSwgKGxvbmcpdmFsKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3dpdGNoIChDVVJSRU5UX0FMSUdOTUVOVCkgewotICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKLSAgICAgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoKLSAgICAgIHsKLQl1bnNpZ25lZF9OIGRhdGEgPSBIMlRfTih2YWwpOwotCWlmICh2bV9kYXRhX21hcF93cml0ZV9idWZmZXIobWFwLCAmZGF0YSwgZWEsIHNpemVvZih1bnNpZ25lZF9OKSwgMCwgcHJvY2Vzc29yLCBjaWEpCi0JICAgICE9IHNpemVvZih1bnNpZ25lZF9OKSkgewotCSAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAibWlzYWxpZ25lZCAlZCBieXRlIHdyaXRlIHRvIDB4JWx4IGZhaWxlZCIsCi0JCSAgICBzaXplb2YodW5zaWduZWRfTiksICh1bnNpZ25lZCBsb25nKWVhKTsKLQl9Ci0JaWYgKFdJVEhfTU9OICYgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQpIHsKLQkgIC8qIFlVQ0sgKi8KLQkgIHVuc2lnbmVkIHJhID0gdm1fcmVhbF9kYXRhX2FkZHIobWFwLCBlYSwgMSwgcHJvY2Vzc29yLCBjaWEpOwotCSAgbW9uX3dyaXRlKGVhLCByYSwgc2l6ZW9mKHVuc2lnbmVkX04pLCBwcm9jZXNzb3IsIGNpYSk7Ci0JfQotCVRSQUNFKHRyYWNlX2xvYWRfc3RvcmUsICgic3RvcmUgY2lhPTB4JWx4IGVhPTB4JWx4IE49JWxkIHZhbD0weCVseFxuIiwKLQkJCQkgKGxvbmcpY2lhLCAobG9uZyllYSwgKGxvbmcpc2l6ZW9mKHVuc2lnbmVkX04pLCAobG9uZyl2YWwpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSB2bV9kYXRhX21hcF93cml0ZV9OIC0gYmFkIHN3aXRjaCIpOwotICAgIH0KLSAgfQotfQotCi0vKiBOT1RFOiBzZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSAqLwotI3VuZGVmIHVuc2lnbmVkX04KLSN1bmRlZiBUMkhfTgotI3VuZGVmIEgyVF9OCi0jdW5kZWYgdm1fZGF0YV9tYXBfcmVhZF9OCi0jdW5kZWYgdm1fZGF0YV9tYXBfd3JpdGVfTgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy93b3Jkcy5oIGIvc2ltL3BwYy93b3Jkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzE4ZGY0Li4wMDAwMDAwCi0tLSBhL3NpbS9wcGMvd29yZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBwc2ltIChtb2RlbCBvZiB0aGUgUG93ZXJQQyh0bSkgYXJjaGl0ZWN0dXJlKQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gCi0gICAtLQotCi0gICBQb3dlclBDIGlzIGEgdHJhZGVtYXJrIG9mIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24uICovCi0KLQotLyogQmFzaWMgdHlwZSBzaXplcyBmb3IgdGhlIFBvd2VyUEMgKi8KLQotI2lmbmRlZiBfV09SRFNfSF8KLSNkZWZpbmUgX1dPUkRTX0hfCi0KLS8qIFRZUEVTOgotCi0gICAgIG5hdHVyYWwqCXNpZ24gZGV0ZXJtaW5lZCBieSBob3N0Ci0gICAgIHNpZ25lZCogICAgc2lnbmVkIHR5cGUgb2YgdGhlIGdpdmVuIHNpemUKLSAgICAgdW5zaWduZWQqICBUaGUgY29ycmVzcG9uZGluZyBpbnNpZ25lZCB0eXBlCi0KLSAgIFNJWkVTCi0KLSAgICAgKk5OCVNpemUgYmFzZWQgb24gdGhlIG51bWJlciBvZiBiaXRzCi0gICAgICpfTk4gICAgICAgU2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBieXRlcwotICAgICAqX3dvcmQgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncyB3b3JkCi0gICAgIAkJd29yZCBzaXplICgzMi82NCBiaXRzKQotICAgICAqX2NlbGwgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncwotICAgICAJCUlFRUUgMTI3NSBjZWxsIHNpemUgKGFsbW9zdCBhbHdheXMgMzIgYml0cykKLQotKi8KLQotCi0vKiBiaXQgYmFzZWQgKi8KLXR5cGVkZWYgY2hhciBuYXR1cmFsODsKLXR5cGVkZWYgc2hvcnQgbmF0dXJhbDE2OwotdHlwZWRlZiBsb25nIG5hdHVyYWwzMjsKLQotdHlwZWRlZiBzaWduZWQgY2hhciBzaWduZWQ4OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgc2lnbmVkMTY7Ci10eXBlZGVmIHNpZ25lZCBsb25nIHNpZ25lZDMyOwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdW5zaWduZWQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bnNpZ25lZDE2OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVuc2lnbmVkMzI7Ci0KLSNpZmRlZiBfX0dOVUNfXwotdHlwZWRlZiBsb25nIGxvbmcgbmF0dXJhbDY0OwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHNpZ25lZDY0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWQ2NDsKLSNlbmRpZgotCi0jaWZkZWYgX01TQ19WRVIKLXR5cGVkZWYgX19pbnQ2NCBuYXR1cmFsNjQ7Ci10eXBlZGVmIHNpZ25lZCBfX2ludDY0IHNpZ25lZDY0OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVuc2lnbmVkNjQ7Ci0jZW5kaWYgCi0KLQotLyogYnl0ZSBiYXNlZCAqLwotdHlwZWRlZiBuYXR1cmFsOCBuYXR1cmFsXzE7Ci10eXBlZGVmIG5hdHVyYWwxNiBuYXR1cmFsXzI7Ci10eXBlZGVmIG5hdHVyYWwzMiBuYXR1cmFsXzQ7Ci10eXBlZGVmIG5hdHVyYWw2NCBuYXR1cmFsXzg7Ci0KLXR5cGVkZWYgc2lnbmVkOCBzaWduZWRfMTsKLXR5cGVkZWYgc2lnbmVkMTYgc2lnbmVkXzI7Ci10eXBlZGVmIHNpZ25lZDMyIHNpZ25lZF80OwotdHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfODsKLQotdHlwZWRlZiB1bnNpZ25lZDggdW5zaWduZWRfMTsKLXR5cGVkZWYgdW5zaWduZWQxNiB1bnNpZ25lZF8yOwotdHlwZWRlZiB1bnNpZ25lZDMyIHVuc2lnbmVkXzQ7Ci10eXBlZGVmIHVuc2lnbmVkNjQgdW5zaWduZWRfODsKLQotCi0vKiBmb3IgZ2VuZXJhbCB3b3JrLCB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkICovCi0vKiB1bnNpZ25lZDogPj0gMzIgYml0cyAqLwotLyogc2lnbmVkOiAgID49IDMyIGJpdHMgKi8KLS8qIGxvbmc6ICAgICA+PSAzMiBiaXRzLCBzaWduIHVuZGVmaW5lZCAqLwotLyogaW50OiAgICAgIHNtYWxsIGluZGljYXRvciAqLwotCi0vKiB0YXJnZXQgYXJjaGl0ZWN0dXJlIGJhc2VkICovCi0jaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKLXR5cGVkZWYgbmF0dXJhbDY0IG5hdHVyYWxfd29yZDsKLXR5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF93b3JkOwotdHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfd29yZDsKLSNlbHNlCi10eXBlZGVmIG5hdHVyYWwzMiBuYXR1cmFsX3dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfd29yZDsKLXR5cGVkZWYgc2lnbmVkMzIgc2lnbmVkX3dvcmQ7Ci0jZW5kaWYKLQotCi0vKiBPdGhlciBpbnN0cnVjdGlvbnMgKi8KLXR5cGVkZWYgdW5zaWduZWQzMiBpbnN0cnVjdGlvbl93b3JkOwotCi0vKiBJRUVFIDEyNzUgY2VsbCBzaXplIC0gb25seSBzdXBwb3J0IDMyYml0IG1vZGUgYXQgcHJlc2VudCAqLwotdHlwZWRlZiBuYXR1cmFsMzIgbmF0dXJhbF9jZWxsOwotdHlwZWRlZiB1bnNpZ25lZDMyIHVuc2lnbmVkX2NlbGw7Ci10eXBlZGVmIHNpZ25lZDMyIHNpZ25lZF9jZWxsOwotCi0jZW5kaWYgLyogX1dPUkRTX0hfICovCmRpZmYgLS1naXQgYS9zaW0vc2gvQ2hhbmdlTG9nIGIvc2ltL3NoL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyNjUyYS4uMDAwMDAwMAotLS0gYS9zaW0vc2gvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTYwICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBNYXkgMTUgMjI6MDQ6NTEgMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi1zaC1kc3Agc3VwcG9ydCwgc2ltdWxhdG9yIHNwZWVkdXAgYnkgdXNpbmcgaG9zdCBieXRlIG9yZGVyOgotCi0JKiBNYWtlZmlsZS5pbiAoaW50ZXJwLm8pOiBEZXBlbmRzIG9uIHBwaS5jIC4KLQkocHBpLmMpOiBOZXcgcnVsZS4KLQkqIGdlbmNvZGUuYyAocHJpbnRvbm1hdGNoLCB0aGluaywgZ2Vub3BjKTogRGVsZXRlZC4KLQkoTUFYX05SX1NUVUZGKTogTm93IDQyLgotCSh0YWIpOiBBZGQgU0gtRFNQIENQVSBpbnN0cnVjdGlvbnMuCi0JQW1hbGdhbWF0ZSBsZGMgLyBzdGMgLyBsZHMgLyBzdHMgaW5zdHJ1Y3Rpb25zIHdpdGggc2ltaWxhcgotCWJpdCBwYXR0ZXJucy4gIEZpeCBvcGNvZGVzIG9mIHN0YyBSbV9CQU5LLEAtPFJFR19OPi4KLQlGaXggc2VtYW50aWNzIG9mIGxkcy5sIEA8UkVHX04+KyxNQUNIIChubyBzaWduIGV4dGVuZCkuCi0JKG1vdnN4eV90YWIpOiBOZXcgYXJyYXkuCi0JRm9yIG1vdnMsIGNoYW5nZSBNTU1NIGZpZWxkIHRvIEdHR0csIGFuZCBtbW1tIGZpZWxkIHRvIE1NTU0uCi0JQWRkZWQgZW50cmllcyBmb3IgbW92eCwgbW92eSBhbmQgcGFyYWxsZWwgcHJvY2Vzc2luZyBpbnNucy4KLQkocHBpX3RhYik6IE5ldyBhcnJheS4KLQkocWZ1bmMpOiBTdGFiaWxpemUgc29ydC4KLQkoZXhwYW5kX29wY29kZSk6IEhhbmRsZSBbMDFdWzAxXU5OLCBbMDFdWzAxXXh4IGFuZCBbMDFdWzAxXXl5LgotCUhhbmRsZSAnTScsICdHJyAncycgJ1gnLCAnYScsICdZJyBhbmQgJ0EnLgotCShkdW1wdGFibGUpOiBOb3cgdGFrZXMgdGhyZWUgYXJndW1lbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQlFbWl0IGp1c3Qgb25lIGNvbnRpZ291cyBqdW1wIHRhYmxlLgotCShmaWxsdGFibGUpOiBOb3cgdGFrZXMgYW4gYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCU1ha2UgaW5kZXggc3RhdGljLgotCShwcGlfbW92ZXMsIGV4cGFuZF9wcGlfY29kZSwgcHBpX2ZpbGx0YWJsZSwgcHBpX2dlbnNpbSk6IE5ldyBmdW5jdGlvbnMuCi0JKGdlbnNpbV9jYXNlbGlzdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiBnZW5zaW0uCi0JSGFuZGxlIG9wY29kZSBmaWVsZHMgJ3gnLCAneScsICdzJywgJ00nLCAnRycsICdYJywgJ2EnLCBhbmQgJ1knLgotCUhhbmRsZSByZWYgJzknLgotCShnZW5zaW0pOiBIYW5kbGUgJ04nIGluIGNvZGUgZmllbGQgYW5kICc4JyBpbiByZWZzIGZpZWxkLgotCUNhbGwgZ2Vuc2ltX2Nhc2VsaXN0IC0gdHdpY2UuCi0JKHBwaV9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1haW4pOiBVbnN1cHBvcnQgZGVmYXVsdCBhY3Rpb24uCi0JQWRkIGRzcCBzdXBwb3J0IGZvciAteCAvIC1zIG9wdGlvbi4gIEFkZCAtcCBvcHRpb24uCi0JKiBpbnRlcnAuYyAoc2hfanVtcF90YWJsZSwgc2hfZHNwX3RhYmxlLCBwcGlfdGFibGUpOiBEZWNsYXJlLgotCShzYXZlZF9zdGF0ZV90eXBlKTogUmVhcnJhbmdlIHRvIGFsbG93IGFtYWxnYW1hdGVkIGxkYyAvIHN0YyAvCi0JbGRzIC8gc3RzIHRvIHdvcmsgZWZmaWNpZW50bHkuCi0JKHRhcmdldF9kc3ApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShHQlIsIFZCUiwgU1NSLCBTUEMsIE1BQ0gsIE1BQ0wpOiBSZWZsZWN0IHNhdmVkX3N0YXRlX3R5cGUgY2hhbmdlLgotCShGUFVMLCBSbl9CQU5LLCBTRVRfUm5fQkFOSywgTSwgUSwgUywgVCwgU1JfQkwsIFNSX1JCKTogTGlrZXdpc2UuCi0JKFNSX01ELCBTUl9SQywgU0VUX1NSX0JJVCwgR0VUX1NSLCBTRVRfUkMsIEdFVF9GUFNDUik6IExpa2V3aXNlLgotCShSUywgUkUsIE1PRCwgTU9EX01FLCBEU1BfUik6IExpa2V3aXNlLgotCShzZXRfZnBzY3IxKTogTGlrZXdpc2UuICBVc2UgdGFyZ2V0X2RzcCB0byBjaGVjayBmb3IgZHNwLgotCShNT0RfTVNpLCBTSUdfQlVTX0ZFVENIKTogRGVsZXRlZC4KLQkoQ1JFRywgU1JFRywgUFIsIFNSX01BU0tfRE1ZLCBTUl9NQVNLX0RNWCwgU1JfRE1ZKTogTmV3IG1hY3Jvcy4KLQkoU1JfRE1YLCBEU1IsIE1PRF9ERUxUQSwgR0VUX0RTUF9HUkQpOiBMaWtld2lzZS4KLQkoU0VUX01PRCk6IFJlZmxlY3Qgc2F2ZWRfc3RhdGVfdHlwZSBjaGFuZ2UuICBTZXQgTU9EX0RFTFRBIGluc3RlYWQKLQlvZiBNT0RfTVMsIGFuZCBlbmNvZGUgU1JfRE1ZIC8gU1JfRE1YIGludG8gaGlnaCB3b3JkIG9mIE1PRF9NRS4KLQkoc2V0X3NyKTogUmVmbGVjdCBzYXZlZF9zdGF0ZV90eXBlIGNoYW5nZS4gIEZpeCBTUl9SQiBoYW5kbGluZy4KLQlVc2UgU0VUX01PRC4KLQkoTUEsIEwsIFRMLCBUQik6IE5vdyBjb250cm9sbGVkIGJ5IEFDRV9GQVNULgotCShTRVhUMzIpOiBKdXN0IGNhc3QgdG8gaW50LgotCShTSUdOMzIpOiBGaXhlZCB0byBvbmx5IHNoaWZ0IGJ5IDMxLgotCShDSEVDS19JTlNOX1BUUik6IFNJR0JVUyBhdCBpbnNuIGZldGNoIG5vdyByZXByZXNlbnRlZCBieSBpbnNuX2VuZCAwLgotCShwcGlfaW5zbik6IERlY2xhcmUuCi0JKHBwaS5jKTogSW5jbHVkZS4KLQkoaW5pdF9kc3ApOiBTZXQgdGFyZ2V0X2RzcC4gIFdoZW4gaXQgY2hhbmdlcywgc3dpdGNoIGVuZCBvZgotCXNoX2p1bXBfdGFibGUgd2l0aCBzaF9kc3BfdGFibGUuCi0JKHNpbV9yZXN1bWUpIERvbid0IGRlY2xhcmUgc2hfanVtcF90YWJsZTAuICBVc2Ugc2hfanVtcF90YWJsZSBpbnN0ZWFkLgotCURvbid0IERlY2xhcmUgUFIgaWYgaXQncyAjZGVmaW5lZC4KLQlGaXggc2luZ2xlLXN0ZXBwaW5nIChXYXMgYnJva2VuIGluIE1hciAgNiAxNjo1OToxMCBwYXRjaCkuCi0JKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX3JlYWRfcmVnaXN0ZXIpOiBUcmFuc2xhdGUgYWNjZXNzZXMgdG8KLQlyZWZsZWN0IHNhdmVkX3N0YXRlX3R5cGUgY2hhbmdlLgotCi0JKiBpbnRlcnAuYyAoc2V0X3NyKTogU2V0IHNyLgotCShTRVRfUkMsIE1PRCwgTU9EX01TLCBNT0RfTUUsIFNFVF9NT0QsIE1PRF9NUywgTU9EX01FKTogTmV3IG1hY3Jvcy4KLQkoc2V0X2Zwc2NyMSk6IERvbid0IGJhbmstc3dpdGNoIGZwdSByZWdpc3RlcnMgd2hlbiBzaW11bGF0aW5nIHNoLWRzcC4KLQkoRFNQX1IpOiBGaXggZGVmaW5pdGlvbi4KLQkoc2ltX3Jlc3VtZSk6IFJlbW92ZSBvdXRkYXRlZCBTRVRfU1IgdXNlLgotCi0JKiBpbnRlcnAuYyAoc2F2ZWRfc3RhdGUpOiBOZXcgbWVtYmVycyBmb3Igc3RydWN0IG1lbWJlciBhc3JlZ3M6Ci0JcnMsIHJlLCBpbnNuX2VuZCwgeHJhbV9zdGFydCwgeXJhbV9zdGFydC4KLQkoc3RydWN0IGxvb3BfYm91bmRzKTogTmV3IHN0cnVjdC4KLQkoU0tJUF9JTlNOKTogTmV3IG1hY3JvLgotCShnZXRfbG9vcF9ib3VuZHMpOiBOZXcgZnVuY3Rpb24uCi0JKGVuZGlhbncpOiBSZW5hbWVkIHRvIGdsb2JhbF9lbmRpYW53LgotCShtYXNrdyk6IG5lZ2F0ZWQgYml0cy4KLQkoUEMpOiBOb3cgaW5zbl9wdHIuCi0JKFNSX01BU0tfUkMsIFNSX1JDX0lOQ1JFTUVOVCwgU1JfUkMsIFJBSVNFX0VYQ0VQVElPTik6IE5ldyBtYWNyb3MuCi0JKFJTLCBSRSwgRFNQX1IsIERTUF9HUkQsIEExLCBBMCwgWDAsIFgxLCBZMCwgWTEsIE0wLCBBMUcpOiBMaWtld2lzZS4KLQkoTTEsIEEwRywgUklBVCwgUFQySCwgUEgyVCwgU0VUX05JUCwgQ0hFQ0tfSU5TTl9QVFIpOiBMaWtld2lzZS4KLQkoU0lHX0JVU19GRVRDSCk6IExpa2V3aXNlCi0JKHJhaXNlX2V4Y2VwdGlvbiwgcmlhdF9mYXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkocmFpc2VfYnVzZXJyb3IsIHNpbV9zdG9wKTogVXNlIHJhaXNlX2V4Y2VwdGlvbi4KLQkoUFJPQ0VTU19TUEVDSUFMX0FERFJFU1MpOiBVc2UgeHJhbV9zdGFydCAvIHlyYW1fc3RhcnQuCi0JKEJVU0VSUk9SLCBXUklURV9CVVNFUlJPUiwgUkVBRF9CVVNFUlJPUik6Ci0JUmV2ZXJzZSBzZW5zZSBvZiBtYXNrIGFyZ3VtZW50LgotCShGUF9PUCwgc2V0X2RyKTogVXNlIFJBSVNFX0VYQ0VQVElPTi4KLQkod2xhdF9mYXN0LCB3d2F0X2Zhc3QsIHdiYXRfZmFzdCwgcmxhdF9mYXN0LCByd2F0X2Zhc3QsIHJiYXRfZmFzdCk6Ci0JRGVjbGFyZS4gIFJlbW92ZSByZWR1bmRhbnQgbWFza2luZy4KLQkod3dhdF9mYXN0LCByd2F0X2Zhc3QpOiBBZGQgYXJndW1lbnQgZW5kaWFudy4gIENoYW5nZWQgY2FsbGVycy4KLQkoTUEpOiBVcGRhdGVkIGZvciBjaGFuZ2UgcGMgLT4gUEMuCi0JKERlbGF5X1Nsb3QpOiBVc2UgUklBVC4KLQkoZW1wdHkpOiBEZWxldGVkLgotCSh0cmFwKTogUmVtb3ZlIGFyZ3VtZW50IGxpdHRsZV9lbmRpYW4uICBBZGQgYXJndW1lbnQgZW5kaWFudy4KLQlDaGFuZ2VkIGFsbCBjYWxsZXJzLiAgVXNlIHJhaXNlX2V4Y2VwdGlvbi4KLQkobWFjdyk6IEFkZCBhcmd1bWVudCBlbmRhaW53LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoaW5pdF9kc3ApOiBOZXcgZnVuY3Rpb24sIGV4dGVuZGVkIGFmdGVyIGJyb2tlbiBvdXQgb2YgaW5pdF9wb2ludGVycy4KLQkoc2ltX3Jlc3VtZSk6IFJlcGxhY2UgcGMgd2l0aCBpbnNuX3B0ci4gIFJlcGxhY2UgbGl0dGxlX2VuZGlhbiB3aXRoCi0JZW5kaWFudy4gIFJlcGxhY2UgbmlhIHdpdGggbmlwLiAgUmV2ZXJzZSBzZW5zZSBvZiBtYXNrYiAvIG1hc2t3IC8KLQltYXNrbC4gIEltcGxlbWVudCBsb2dpYyBmb3IgemVyby1vdmVyaGVhZCBsb29wcy4gIERvbid0IHRyeSB0bwotCWludGVycHJldCBnYXJiYWdlIHdoZW4gZ2V0dGluZyBhIFNJR0JVUyBhdCBpbnNuIGZldGNoLgotCShzaW1fb3Blbik6IENhbGwgaW5pdF9kc3AuCi0JKiBnZW5jb2RlLmMgKHRhYik6IFVzZSBTRVRfTklQIGluc3RlYWQgb2YgbmlhID0gLiAgVXNlIFBIMlQgLyBQVDJIIC8KLQlSQUlTRV9FWENFUFRJT04gd2hlcmUgYXBwcm9wcmlhdGUuCi0JQWRkIGV4dHJhIGN5Y2xlcyBmb3IgYnJhaSwgYnJhZiAsIGJzciwgYnNyZiwgam1wLCBqc3IuCi0KLQkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6Ci0JRG8gcHJvcGVyIGVuZGlhbm5lc3Mgc3dpdGNoLgotCi0JKiBpbnRlcnAuYyAoc2F2ZWRfc3RhdGVfdHlwZSk6IE5ldyBtZW1iZXJzIGZvciBzdHJ1Y3QgbWVtYmVyIGFzcmVnczoKLQl4eW1lbV9zZWxlY3QsIHhtZW0sIHltZW0sIHhtZW1fb2Zmc2V0LCB5bWVtX29mZnNldC4KLQkoc3BlY2lhbF9hZGRyZXNzKTogRGVsZXRlLgotCShCVVNFUlJPUik6IE5vdyBhIHR3by1hcmd1bWVudCBwcmVkaWNhdGUuCi0JKFBST0NFU1NfU1BFQ0lBTF9BRERSRVNTLCBXUklURV9CVVNFUlJPUiwgUkVBRF9CVVNFUlJPUik6IE5ldyBtYWNyb3MuCi0JKHdsYXRfbGl0dGxlLCB3d2F0X2xpdHRsZSwgd2JhdF9hbnksIHdsYXRfYmlnLCB3d2F0X2JpZyk6IERlbGV0ZS4KLQkocHJvY2Vzc193bGF0X2FkZHIsIHByb2Nlc3Nfd3dhdF9hZGRyKTogTmV3IGZ1bmN0aW9ucy4KLQkocHJvY2Vzc193YmF0X2FkZHIsIHByb2Nlc3NfcmxhdF9hZGRyLCBwcm9jZXNzX3J3YXRfYWRkcik6IExpa2V3aXNlLgotCShwcm9jZXNzX3JiYXRfYWRkcik6IExpa2V3aXNlLgotCSh3bGF0X2Zhc3QsIHd3YXRfZmFzdCwgd2JhdF9mYXN0KTogVXNlIFdSSVRFX0JVU0VSUk9SLgotCShybGF0X2xpdHRsZSwgcndhdF9saXR0bGUsIHJiYXRfYW55LCBybGF0X2JpZywgcndhdF9iaWcpOiBEZWxldGUuCi0JKHJsYXRfZmFzdCwgcndhdF9mYXN0LCByYmF0X2Zhc3QpOiBVc2UgUkVBRF9CVVNFUlJPUi4KLQkoUldBVCwgUkxBVCwgUkJBVCwgV1dBVCwgV0xBVCwgV0JBVCk6IERlbGV0ZSBTTE9XIHZlcnNpb25zLgotCShkb19yZGF0LCB0cmFwKTogRGVsZXRlIFNMT1cgY29kZS4KLQkoU0VYVDMyLCBTSUdOMzIpOiBOZXcgbWFjcm9zLgotCShzd2FwLCBzd2FwMTYpOiBOb3cgaW50ZWdlciBpbiAtIGludGVnZXIgb3V0LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoc3Ryc3dhcGxlbiwgc3RybnN3YXApOiBEZWxldGUgU0xPVyB2ZXJzaW9ucy4KLQkoaW5pdF9wb2ludGVycyk6IEluaXRpYWxpemUgZHNwIG1lbW9yeSBzZWxlY3Rpb24gKHByZWxpbWluYXJ5KS4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBVc2Ugc3dhcCBpbnN0ZWFkIG9mCi0JYmlnIC8gbGl0dGxlIGVuZGlhbiByZWFkIC8gd3JpdGUgZnVuY3Rpb25zLgotCi0JKiBpbnRlcnAuYyAobWFza2wpOiBEZWxldGVkLgotCShlbmRpYW53LCBlbmRpYW5iKTogTmV3IHZhcmlhYmxlcy4KLQkoc3BlY2lhbF9hZGRyZXNzKTogTm93IGlubGluZS4KLQkoYnBfaG9sZGVyKTogUHV0IHJhaXNpbmcgb2YgYnVzZXJyb3IgdGhlcmUsIHJlbmFtZSB0bzoKLQkocmFpc2VfYnVzZXJyb3IpLgotCShCVVNFUlJPUik6IE5vdyB5aWVsZHMgYSB2YWx1ZS4gIENoYW5nZWQgYWxsIHVzZXJzLgotCSh3YmF0X2JpZyk6IERlbGV0ZS4KLQkod2xhdF9mYXN0LCB3d2F0X2Zhc3QsIHdiYXRfZmFzdCk6IE5ldyBmdW5jdGlvbnMuCi0JKHJsYXRfZmFzdCwgcndhdF9mYXN0LCByYmF0X2Zhc3QpOiBMaWtld2lzZS4KLQkoUldBVCwgUkxBVCwgUkJBVCwgV1dBVCwgV0xBVCwgV0JBVCk6IFVzZSBuZXcgZnVuY3Rpb25zLgotCShkb19yZGF0LCBkb193ZGF0KTogTGlrZXdpc2UuICBUYWtlIG1hc2tsIGFyZ3VtZW50IGluc3RlYWQgb2YKLQlsaXR0bGVfZW5kaWFuIG9uZS4gIENoYW5nZWQgY2FsbGVyIG1hY3Jvcy4KLQkoc3dhcCwgc3dhcDE2KTogVXNlIHdbcnddbGF0X2JpZyAvIHdbcnddbGF0X2xpdHRsZSBkaXJlY3RseS4KLQkoc3Ryc3dhcGxlbiwgc3RybnN3YXApOiBOZXcgZnVuY3Rpb25zLgotCSh0cmFwKTogVXNlIHRoZW0gdG8gZml4IHVwIGVuZGlhbiBtaXNtYXRjaGVzOwotCWRpc2FibGUgU1lTX2V4ZWN2ZSBhbmQgU1lTX2V4ZWN2OyBmaXggZG91YmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gZm9yCi0JU1lTX3BpcGUgYW5kIFNZU19zdGF0LgotCShzeW1fd3JpdGUsIHN5bV9yZWFkKTogQWRkIGVuZGlhbm5lc3MgdHJhbnNsYXRpb24uCi0JKHN5bV9zdG9yZV9yZWdpc3Rlciwgc3ltX2ZldGNoX3JlZ2lzdGVyKTogQWRkIG1hc2tsIGxvY2FsIHZhcmlhYmxlLgotCShzaW1fb3Blbik6IFNldCBlbmRpYW53IGFuZCBlbmRpYW5iLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXVnIDI1IDA3OjU1OjIzIDE5OTkgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAoZmNudmRzIDxEUl9OPixGUFVMKTogUmV3cml0ZSB0byB1c2UgYSBsb2NhbCBhbm9ueW1vdXMKLQl1bmlvbiB0eXBlLCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gYW4gaW50KiB0aGVuIGEgZmxvYXQqLgotCShmY252c2QgRlBVTCw8RFJfTj4pOiBMaWtld2lzZS4KLQkoZmxkcyA8RlJFR19OPixGUFVMKTogTGlrZXdpc2UuCi0JKGZzdHMgRlBVTCw8RlJFR19OPik6IExpa2V3aXNlLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLTE5OTktMDQtMDIgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChQT0xMX1FVSVRfSU5URVJWQUwpOiBEZWZpbmUuIFVzZWQgdG8gdHdlYWsgdGhlCi0JZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBwb2xsX3F1aXQgY2FsbGJhY2sgaXMgY2FsbGVkLgotCShzaW1fcmVzdW1lKTogVXNlIFBPTExfUVVJVF9JTlRFUlZBTCBpbnN0ZWFkIG9mIGEKLQloYXJkLWNvZGVkIHZhbHVlLgotCi1UaHUgU2VwIDEwIDAyOjE2OjM5IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogaW50ZXJwLmMgKHNhdmVkX3N0YXRlLmFzcmVncyk6IEFkZCBuZXcgbWVtYmVyIHBhZF9kdW1teS4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnc2l0ZXIpOiBBZGQgMSB0byBybiBmb3IgdXNlCi0JYXMgaW5kZXggaW50byBzYXZlZF9zdGF0ZS5hc2ludHMuCi0KLU1vbiBKdW4gMjkgMTk6MzU6MjQgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IHNldCBlbmRpYW5uZXNzIGJhc2VkIG9uIHRoZSBBQkZEIGlmIGEgLUUKLQlvcHRpb24gaXMgbm90IHByZXNlbnQgYW5kIHdlIGhhdmUgYW4gQUJGRC4KLQotVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjE5OjQ4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxODozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEZlYiAxNyAxMjo0OTo0NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9zdG9yZV9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9sb2FkKTogUGFzcyBsbWFfcCBhbmQgc2ltX3dyaXRlIGFyZ3MgdG8KLSAJc2ltX2xvYWRfZmlsZS4KLQotRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAgOSAyMDo1MjoyMSAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogcG9sbF9xdWl0KCkgYXQgbGVhc3Qgb25jZSBwZXIgY2FsbDsKLSAJb3RoZXJ3aXNlIGdkYiBjYW4gbG9vcCBzaW1fcmVzdW1lKCkgdW5pbnRlcnJ1cHRhYmx5LgotCi1UaHUgU2VwICA0IDE3OjIxOjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UdWUgU2VwICAyIDEzOjE1OjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jICh0YWIpOiBPcmRlciBpbnN0cnVjdGlvbnMgYWNjb3JkaW5nIHRvIFNIMyBkb2N1bWVudC4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVR1ZSBBdWcgMjYgMTA6NDE6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTY6MTc6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotTW9uIEp1biAyMyAxNTo0OToxNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChnZXRfZHIpOiBBdm9pZCBTSUdGUEUgYnkgbW92aW5nIGludGVnZXJzIGluc3RlYWQgb2YKLSAJRlAncyBhcm91bmQuCi0JKHNldF9kcik6IERpdHRvLgotCQotTW9uIEp1biAyMyAxNTowMjo0MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChYRCwgU0VUX1hEKTogRGVsZXRlLgotICAJKFhGLCBTRVRfWEYsIFhEX1RPX1hGKTogRGVmaW5lLCBtb3ZlIGFyb3VuZCByZWdpc3RlcnMgaW4gZWl0aGVyCi0gCUZQIGJhbmsuCi0JCi0JKiBnZW5jb2RlLmMgKGZtb3YpOiBVcGRhdGUuCi0KLVN1biBKdW4gMjIgMTk6MzM6MzMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2V0X2Zwc2NyMSk6IEZyb20gSiJvcm4gUmVubmVja2UKLSAJPGFteWxhYXJAY3lnbnVzLmNvLnVrPiwgRml4IHR5cG8uIERpdHRvIGZvciBjb21tZW50LgotCQotVHVlIEF1ZyAxMiAwMDoxOToxMSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGludGVycC5jIChzcGVjaWFsX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKEJVU0VSUk9SKTogQ2FsbCBpdC4gIEFkZGVkIHBhcmFtZXRlcnMgYml0c193cml0dGVuIGFuZCBkYXRhLgotCUNoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBnZW5jb2RlLmMgKHRhYik6IEZpeGVkIG9jYndiIGFuZCBwcmVmLgotCi1GcmkgSnVuIDIwIDIyOjAzOjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogaW50ZXJwLmMgKGRvX3dkYXQsIGRvX3dkYXQpOiBGaXggYnVnIGluIHJlZ2lzdGVyIG51bWJlciBjYWxjdWxhdGlvbi4KLQotVGh1IEp1biAxOSAwMDoyODowOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQ2xlYXIgcmVnaXN0ZXJzIGVhY2ggdGltZSBhbgotIAlpbmZlcmlvciBpcyBzdGFydGVkLgotCi1Nb24gSnVuIDE2IDE0OjAxOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKCpGUCwgRlBfT1AsIEZQX0NNUCwgRlBfVU5BUlkpOiBQcm92aWRlIGEgaG9vayBmb3IKLSAJd2hlbiBhIGhvc3QgZG9lc24ndCBzdXBwb3J0IElFRUUgRlAuCi0JKCpEUCk6IFByb3ZpZGUgYWx0ZXJuYXRpdmUgZGVmaW5pdGlvbiB0aGF0IHN1cHBvcnRzIDY0Yml0IGZsb2F0aW5nCi0gCXBvaW50LgotCSh0YXJnZXRfbGl0dGxlX2VuZGlhbik6IENvbWJpbmUgbGl0dGxlX2VuZGlhbiBhbmQgbGl0dGxlX2VuZGlhbl9wLgotCShzYXZlZF9zdGF0ZV90eXBlKTogTWFrZSBmcHNjciBhbmQgc3Igc2ltcGxlIGludGVnZXJzLgotCShTRVRfRlBTQ1IsIEdFVF9GUFNDUik6IFVzZSBtYWNyb3MgdG8gdXBkYXRlIGZwc2NyIHJlZ2lzdGVyLgotCShzZXRfZnBzY3IxKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlIHN3YXBwaW5nIHdoZW4gUFIgLyBGUiBiaXRzCi0gCWNoYW5nZWQuIENhbGwgdmlhICpfRlBTQ1IgbWFjcm8uCi0JKFNFVF9TUiosIEdFVF9TUiopOiBVc2UgbWFjcm8ncyB0byBhY2Nlc3MgdGhlIFNSIGJpdHMgLSBhdm9pZHMKLSAJZW5kaWFuIHByb2JsZW1zLgotCi0JKiBnZW5jb2RlLmMgKHRhYik6IFVwZGF0ZS4KLQkKLVN1biBKdW4gMTUgMTU6MjI6NTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKG1haW4pOiBQZXJmb3JtIGJhc2ljIGNoZWNrcyBvbiB0YWIgZW50cmllcy4KLQotCSogTWFrZWZpbGUuaW4gKGdlbmNvZGUpOiBBbHdheXMgY29tcGlsZSB3aXRoIC1nLgotCi1TYXQgSnVuIDE0IDEzOjQ1OjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChnZW5zaW0pOiBNb3ZlIHJlZiBjaGVja2luZyBjb2RlIHRvIGJlZm9yZSBgc3R1ZmYnLgotICAJRm9yIGJyYW5jaGVzIHdpdGggZGVsYXkgc2xvdHMgcmVmcyB3ZXJlIG5vdCBiZWluZyBjaGVja2VkLgotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IFVzZSBuaWEgdG8gc3BlY2lmeSB0aGUgbmV4dCBpbnN0cnVjdGlvbgotIAlhZGRyZXNzIGluc3RlYWQgb2Ygb3ZlcmxvYWRpbmcgcGMuCi0JKEMpOiBEZWxldGUgZGVmaW5pdG9uIC0gcmVmZXIgdG8gY3ljbGVzIGRpcmVjdGx5LgotCShTRVhUMTIpOiBOZXcgbWFjcm8gLSBzaWduIGV4dGVuZCBhIDEyIGJpdCBxdWFudGl0eS4KLQkoRGVsYXlfU2xvdCk6IFJlbmFtZSBmcm9tIFNMLgotCi0JKiBnZW5jb2RlLmMgKHRhYik6IFVwZGF0ZS9zaW1wbGlmeS4KLQkKLQkqIGdlbmNvZGUuYyAoZ2Vuc2ltKTogQmV0dGVyIGZvcm1hdHRpbmcgb2Ygb3V0cHV0IGNvZGUuCi0JKGdlbnNpbSk6IFJlcGxhY2UgMTAgd2l0aCBjb25zdGFudCBNQVhfTlJfU1RVRkYtIGRlZmluZSBhcyAxNS4KLQkodGFiKTogU29ydCBhbHBoYWJldGljYWxseS4gIEJyZWFrIGBzdHVmZicgaW50byBtdWx0aXBsZSBsaW5lcy4KLQotRnJpIEp1biAxMyAyMjoxMDoxMyAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGdlbmNvZGUuYyAoYnJhZiwgYnNyZik6IEZpeCBicmFuY2ggZGVzdGluYXRpb24gY2FsY3VsYXRpb24gdG8KLQliZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGRvY3VtZW50YXRpb24uCi0KLUZyaSBKdW4gMTMgMTU6MzM6NTMgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBpbnRlcnAuYyAoaW5pdF9wb2ludGVycyk6IEZpeCBsaXR0bGUgZW5kaWFuIHRlc3QuCi0KLVRodSBKdW4gIDUgMTI6NTY6MDggMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBpbnRlcnAuYyAoaW5pdF9wb2ludGVycyk6IFNINCBoYXJkd2FyZSBpcyBhbHdheXMgV09SRFNfQklUX0VORElBTi4KLQkqIGdlbmNvZGUgKGZtb3YgZnJvbS90byBtZW1vcnkpOiB0YWtlIGVuZGlhbl9taXNtYXRjaCBpbnRvIGFjY291bnQKLQlmb3IgMzIgYml0IG1vdmVzIHRvby4KLQotV2VkIE1heSAyOCAyMzo0MjozNSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLSAgICAgICAgKiBnZW5jb2RlLmMgKHN3YXAuYik6IEZpeCB0cmVhdG1lbnQgb2YgaGlnaCB3b3JkLgotCi1XZWQgTWF5IDI4IDIzOjQyOjM1IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotICAgICAgICAqIHNoL2dlbmNvZGUuYywKLSAgICAgICAgKiBpbnRlcnAuYzogZXhwZXJpbWVudGFsIFNINCBzdXBwb3J0LgotICAgICAgICBERm1vZGUgbW92ZXMgYXJlIHByb2JhbHkgYnJva2VuIGZvciB0YXJnZXQgbGl0dGxlIGVuZGlhbi4KLQotVHVlIE1heSAyMCAxMDoyMzoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVdlZCBBcHIgMzAgMTE6Mzg6MDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9DTEVBTik6IERlZmluZS4KLQkoY2xlYW4gdGFyZ2V0cyk6IERlbGV0ZS4KLQkoc2gtY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAyMyAxNzo1NToyMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB0Y29uZmlnLmluOiBOZXcgZmlsZS4KLQkqIGludGVycC5jIChzaW1fb3Blbik6IEhhbmRsZSBtaXNzaW5nIGFyZyB0byAtRS4KLQotVHVlIEFwciAyMiAwODo1NTozNSAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjbGVhbiB0YXJnZXRzLgotCi1GcmkgQXByIDE4IDE4OjU3OjA0IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jOiAgSW5jbHVkZSBmbG9hdC5oIGFuZCBkZWZpbmUgU0lHVFJBUCBpZiBfV0lOMzIuCi0JV0lOMzIgLT4gX1dJTjMyLgotCSogKHRyYXApOiAgRG8gZG8gU1lTX2Nob3duIGZvciBfV0lOMzIuCi0KLUZyaSBBcHIgMTggMTM6MzM6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGaXggYXJndW1lbnQgdG8gcG9sbF9xdWl0LgotCi1GcmkgQXByIDE4IDE0OjE0OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fcmVzdW1lKTogVXNlIHBvbGxfcXVpdCBmb3IgcG9sbGluZy4KLQotVGh1IEFwciAxNyAwMzozMjowNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWxvYWQuby4KLQkqIGludGVycC5jICh0YXJnZXRfYnl0ZV9vcmRlcik6IERlbGV0ZS4KLQkoc2ltX2tpbmQsIG15bmFtZSwgbGl0dGxlX2VuZGlhbl9wKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKGluaXRfcG9pbnRlcnMpOiBVc2UgbGl0dGxlX2VuZGlhbl9wIGluc3RlYWQgb2YgdGFyZ2V0X2J5dGVfb3JkZXIuCi0JKHNpbV9yZXN1bWUpOiBMaWtld2lzZS4KLQkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4gIFNldCBsaXR0bGVfZW5kaWFuX3AgZnJvbSAtRSBhcmcuCi0JKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bwotCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KLQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgTWFyIDE5IDA5OjM0OjM2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2RvX2NvbW1hbmQpOiBDaGVjayBmb3IgTlVMTCBjb21tYW5kIG9yIGVtcHR5Ci0Jc3RyaW5nIGFuZCBoYW5kbGUgaXQgdGhlIHNhbWUgYXMgYSAiaGVscCIgY29tbWFuZC4gIFVzZSBjYWxsYmFjawotIAl0byBwcmludCBlcnJvciBtZXNzYWdlIGZvciB1bnJlY29nbml6ZWQgY29tbWFuZHMuICBSZXBsYWNlCi0JaGFyZGNvZGVkIHRhYiBpbiBsaXRlcmFsIHN0cmluZyB3aXRoIGEgXHQuICBPdGhlciBtaW5vciBjb2RlCi0gCWNsZWFudXAuCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBNYXIgMTMgMTM6MDA6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdwotCWluIGFyZ3YgZm9ybS4KLQkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCi0KLVR1ZSBGZWIgIDQgMTM6MzM6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEBDT01NT05fTUFLRUZJTEVfRlJBRyk6IFVzZQotCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEphbiAyMyAxMTo0NjoyMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKLQlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgotCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KLQltYWtlZmlsZSBmcmFnbWVudC4KLQotV2VkIE5vdiAyMCAwMjowNDozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIHN0dWZmIG1vdmVkIHRvIC4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbi4KLQkoU0lNX09CSlMsU0lNX0VYVFJBX0xJQlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFNpbXBsaWZ5IHVzaW5nIG1hY3JvcyBpbiAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQlDYWxsIEFDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUuCi0JKiBpbnRlcnAuYzogI2luY2x1ZGUgImNvbmZpZy5oIi4gICNpbmNsdWRlIDx1bmlzdGQuaD4gaWYgcHJlc2VudC4KLQkodHJhcCk6IEZldGNoIGVycm5vIHZhbHVlIHdpdGggY2FsbGJhY2stPmdldF9lcnJuby4KLQotVHVlIE5vdiAxMiAxMzozNDowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+ICAgCi0KLQkqIGludGVycC5jOiBEb24ndCBpbmNsdWRlIHdpbmRvd3MgcG9sbGluZyBjb2RlIGlmIGluc2lkZSBzaW1sdWF0b3IuCi0KLUZyaSBTZXAgMjAgMTQ6NTc6NTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogTWlub3IgZm9ybWF0dGluZyBpbXByb3ZlbWVudHMuCi0JKHNhdmVkX3N0YXRlX3R5cGUpOiBBZGQgYmFuayByZWdpc3RlcnMuCi0JKGJwX2hvbGRlcik6IE5ldyBmdW5jdGlvbiwgdXNlIHRvIGJyZWFrIG9uIHdoZW4gZGVidWdnaW5nIEJVU0VSUk9SLgotCShCVVNFUlJPUik6IENhbGwgaXQgaWYgYnVzIGVycm9yIG9jY3Vycy4KLQotV2VkIEp1biAyNiAxMjoyOToyMiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVGh1IE1heSAxNiAxNTo0NDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzYXZlZF9zdGF0ZV90eXBlKTogQWRkIG1lbXN0YWxscyBmaWVsZC4KLQkoTUEpIERlZmluZSBtYWNyby4KLQkoc2ltX3Jlc3VtZSk6IE5ldyBsb2NhbCB2YXJpYWJsZSBtZW1zdGFsbHMuICBBZGQgaXQgYmFjayBpbiB0bwotCXNhdmVkX3N0YXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShzaW1faW5mbyk6IFJlcG9ydCBtZW1zdGFsbHMuCi0JKiBnZW5jb2RlLmMgKHRhYik6IEFkZCBNQSgpIHRvIHRoZSBleGVjdXRpb24gc3RyaW5nIG9mIGFsbAotCWluc3RydWN0aW9ucyB3aGljaCBhY2Nlc3MgbWVtb3J5LgotCi1XZWQgRmViIDIxIDEyOjE2OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi1UdWUgRGVjICA1IDE2OjM4OjU1IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGdlbmNvZGUuYyAobWFjLmwpOiAgRG9uJ3QgYWJvcnQgR0RCIGlmIGV4ZWN1dGluZyBtYWMubAotCWluc3RydWN0aW9uICh3aGljaCBpcyB1bmltcGxlbWVudGVkKS4gIEdlbmVyYXRlIGEgU0lHVFJBUCAoaW4gdGhlCi0Jc2ltdWxhdGVkIHRhcmdldCkgaW5zdGVhZC4KLQotTW9uIERlYyAgNCAxMjoyMjoyNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAodGFiKTogQWRkZWQgc2V2ZXJhbCBzaDMgb3Bjb2Rlcy4KLQkodGhpbmspOiBBZGRlZCBwcmludG9ubWF0Y2ggZm9yIEFfU1NSIGFuZCBBX1NQQy4KLQkqIGludGVycC5jIChTU1IsIFNQQyk6IEFkZGVkIGRlZmluaXRpb25zLgotCShzYXZlZF9zdGF0ZV90eXBlKTogQWRkZWQgc3NyIGFuZCBzcGMgcmVnaXN0ZXJzLgotCi1XZWQgTm92IDI5IDEyOjM5OjI3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jICh0YWIpOiBJbiBzaGFkL3NobGQgZGVmaW5pdGlvbnMsIG5lZ2F0ZSBSW21dIGJlZm9yZQotCXRoZSBhbmQgb3BlcmF0aW9uIGluc3RlYWQgb2YgYWZ0ZXIuICBGb3Igc2hhZCBkZWxldGUgY2FzdC4gIEZvciBzaGxkCi0JdXNlIFVSIGluc3RlYWQgb2YgUiBhbmQgZGVsZXRlIGNhc3QuCi0KLUZyaSBOb3YgMTcgMTI6NDg6NTUgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKHRhYik6IEFkZCBleHBsaWNpdCBOYU4gc3VwcG9ydCBmb3IgZnRyYyBpbnN0cnVjdGlvbi4KLQotV2VkIE5vdiAxNSAxMToyNToyNyAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYzogIE1ha2UgdGFyZ2V0X2J5dGVfb3JkZXIgYmUgZXh0ZXJuIHRvIHByZXZlbnQgU0dJIGNjIGZyb20KLQlpc3N1aW5nIHdhcm5pbmdzIGFib3V0IHRoZSB1c2Ugb2YgY29tbW9uIHN5bWJvbHMuCi0KLVR1ZSBOb3YgMTQgMTU6MTk6NDMgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogZ2VuY29kZS5jOiAganNyLCBic3IgYW5kIGJzcmYgYWN0dWFsbHkgc2F2ZSBwYys0IGluIHByLCBhbmQgcnRzCi0JYWN0dWFsbHkgdXNlcyBwciswLgotCi1TYXQgT2N0IDIxIDEzOjAxOjE4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gvaW50ZXJwLmMgKHNpbV9zdG9wX3JlYXNvbik6IENhdGNoIFNJR1FVSVQgYW5kIGluZGljYXRlCi0JcHJvZ3JhbSBleGl0ZWQuCi0JKHNpbV9nZXRfcXVpdF9jb2RlKTogRGVsZXRlLgotCQotCSogZ2VuY29kZS5jIChnZW5zaW0pOiBJbmRpY2F0ZSBTSUdJTEwgaW5zdGVhZCBvZiBjYWxsaW5nIGFib3J0IGZvcgotCWRlZmF1bHQgY2FzZS4KLQotTW9uIE9jdCAxNiAxODoyNDowMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzYXZlZF9zdGF0ZV90eXBlKTogTW92ZSBGUCByZWdpc3RlcnMgdG8gaW1tZWRpYXRlbHkKLQlhZnRlciBTUi4KLQotVHVlIE9jdCAxMCAxMToxMjoxNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgotCi1GcmkgT2N0ICA2IDEyOjA4OjE4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHRyYXAsIGNhc2UgU1lTX3V0aW1lKTogQ2FzdCBzZWNvbmQgYXJnIG9mIHV0aW1lIHRvCi0Jdm9pZCAqIHRvIGF2b2lkIGNvbXBpbGVyIGVycm9yLgotCQotCSogaW50ZXJwLmMgKGNhbGxiYWNrKTogUmVtb3ZlIGxhc3QgY2hhbmdlLiAgSXQgaXMgaW5pdGlhbGl6ZWQgYnkKLQlhIHNpbV9zZXRfY2FsbGJhY2tzIGNhbGwuCi0JCi1UaHUgT2N0ICA1IDE0OjEzOjI5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChjYWxsYmFjayk6IEluaXRpYWxpemUgdG8gZGVmYXVsdCBjYWxsYmFjay4KLQotVGh1IFNlcCAyOCAxNToyNjo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBydW4uYzogTW92ZWQgdG8gLi4vY29tbW9uLgotCSogaW50ZXJwLmMgKHRyYXApOiBVc2UgZ2RiJ3MgY2FsbGJhY2sgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQuCi0KLVdlZCBTZXAgMjAgMTM6MzU6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLVdlZCBTZXAgMjAgMDk6NTE6NTAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcnVuLmMgKHNpbV9jYWxsYmFja193cml0ZV9zdGRvdXQpOiAgTmV3LgotCSogaW50ZXJwLmMgKHRyYXApOiBDYWxsIHNpbV9jYWxsYmFja193cml0ZV9zdGRvdXQgd2hlbiBuZWVkZWQuCi0KLU1vbiBTZXAgMTggMTg6NDI6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHRyYXApOiBSZW1vdmUgdXNlbGVzcyBjb2RlLgotCi1GcmkgU2VwIDE1IDE5OjMwOjA1IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN5c2NhbGwuaDogQ29weSBmcm9tIG5ld2xpYi4KLQotVGh1IFNlcCAxNCAxOTozMjo1OSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmM6ICBCYWNrIHVwIFBDIGJ5IDIgZm9yIGJyZWFrcG9pbnRzLgotCSogaW50ZXJwLmM6ICBNb3ZlIGZwIHJlZ3MgYmV5b25kIHBjL3ByL2V0YyB0byBhdm9pZCBjb25mdXNpbmcgR0RCLAotCXdoaWNoIGV4cGVjdCBwYyB0byBpbW1lZGlhdGx5IGZvbGxvdyByZWdzW10uCi0KLUZyaSBTZXAgIDggMTQ6MTg6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBDQ19GT1JfQlVJTEQuICBEb24ndCBjYWxsIEFDX1BST0dfSU5TVEFMTC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogUmV2ZXJ0IHRvIHVzaW5nIGluc3RhbGwuc2guCi0JKElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogU2V0IHRvICQoSU5TVEFMTCkuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVzdG9yZS4KLQkoQ0NfRk9SX0JVSUxEKTogUmVzdG9yZS4KLQkoZ2VuY29kZSk6IEJ1aWxkIHVzaW5nICQoQ0NfRk9SX0JVSUxEKS4KLQkoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotVGh1IFNlcCAgNyAxNTowMjozMSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkoVHJ5IHRvKSBVcGRhdGUgdG8gbmV3IGJmZCBhdXRvY29uZiBzY2hlbWUuCi0JKiBydW4uYzogRG9uJ3QgaW5jbHVkZSBzeXNkZXAuaC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMeyxfUFJPR1JBTSxfREFUQX0pOiBVc2UgYXV0b2NvbmYgY29tcHV0ZWQgdmFsdWUuCi0JKENDLCBDRkxBR1MsIEFSLCBSQU5MSUIpOiBMaWtld2lzZS4KLQkoSERFRklORVMsIFRERUZJTkVTKTogRGVmaW5lLgotCShDQ19GT1JfQlVJTEQpOiBEZWxldGUuCi0JKGhvc3RfbWFrZWZpbGVfZnJhZyk6IERlbGV0ZS4KLQkoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgb24gZnJhZ3MuCi0JKiBjb25maWd1cmUuaW4gKHN5c2RlcC5oKTogRG9uJ3QgY3JlYXRlIHN5bWxpbmsuCi0JKGhvc3RfbWFrZWZpbGVfZnJhZywgZnJhZ3MpOiBEZWxldGVkLgotCShDQywgQ0ZMQUdTLCBBUiwgUkFOTElCLCBJTlNUQUxMKTogQ29tcHV0ZSB2YWx1ZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgQXVnIDMxIDEyOjM5OjA3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmM6IEluY2x1ZGUgPG1hdGguaD4uCi0KLVdlZCBBdWcgMzAgMjI6MDU6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChydW4pOiBMaW5rIGluIG1hdGggbGlicmFyeSB0b28uCi0JKiBnZW5jb2RlLmMgKGdlbnNpbSk6IGFib3J0IGlmIGFuIHVua25vd24gb3Bjb2RlIGlzIGVuY291bnRlcmVkLgotCSogaW50ZXJwLmMgKEZQU0NSLCBGUFVMKTogRGVmaW5lLgotCShzdHJ1Y3Qgc2F2ZV9zdGF0ZSk6IEFkZCBmaWVsZHMgZm9yIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywKLQlGUFNDUiBhbmQgRlBVTC4KLQkoc2ltX3Jlc3VtZSk6IEFkZCAnRicgZm9yIGFjY2Vzc2luZyBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMKLQlpbiB0aGUgc2F2ZSBzdGF0ZSBzdHJ1Y3R1cmUuCi0JKiBnZW5jb2RlLmM6IEFkZCBzaDNlIG9wY29kZXMuCi0JKGdlbnN5bSk6IERlZmluZSBhIGJ1ZmZlciBmb3IgaW50PC0+ZnAgY29udmVyc2lvbnMuCi0KLVR1ZSBBdWcgMjIgMTQ6MTY6NDYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAodHJhcCk6IFVzZSB0cmFwIHZlY3RvciAzNCBmb3IgaG9zdCBzeXN0ZW0gaW50ZXJmYWNlLgotCSogZ2VuY29kZS5jOiBBZGQgMzQgdG8gY29uZGl0aW9uYWwgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaCB0cmFwcwotCXdpbGwgYmUgaGFuZGxlZCBieSBzaW11bGF0b3IuCi0KLUZyaSBBdWcgMTEgMTc6NTk6MTUgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBydW4uYzogSW5jbHVkZSA8c2lnbmFsLmg+LiAgRGVmaW5lIFNJR1FVSVQgaWYgbm90IGRlZmluZWQuCi0JKG1haW4pOiBOZXcgdmFyaWFibGVzIHJlYXNvbiBhbmQgc2lncmMuICBBZnRlciBzaW11bGF0b3IgZXhpdHMsCi0JY2hlY2sgdG8gc2VlIGlmIGl0IGV4aXRlZCBiZWNhdXNlIG9mIGEgc2lnbmFsLCBhbmQgaWYgc28sIHRoZW4KLQl1c2UgdGhlIHNpZ25hbCBudW1iZXIgYXMgdGhlIHJldHVybiB2YWx1ZS4KLQotVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KLQotVHVlIEp1bCAxOCAyMzozMzoxMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAZmlzaGJvd2w+Ci0KLQkqIGludGVycC5jICh0cmFwKTogT25seSB1c2UgU1lTX2V4ZWN2IGlmIGRlZmluZWQuICBNaWdodCBiZQotCWltcGxlbWVudGVkIGFzIGV4ZWN2ZShhcmcxLGFyZzIsMCksIGFzIHdpdGggVW5peHdhcmUgMi4wLgotCShzaW1fcmVzdW1lKTogSW4gc2JpdCBpbml0aWFsaXplciwgY2FzdCBzaGlmdGVkIGFyZyB0byB1bnNpZ25lZAotCXRvIGF2b2lkIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93LgotCi1XZWQgSnVsICA1IDE0OjMyOjU0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIHJ1biwgbGlic2ltLmEuCi0JICAoZGlzdGNsZWFuLCBtb3N0bHljbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIE1ha2VmaWxlIGFuZCAKLQkgIGF1dG9jb25mIGZpbGVzLgotCi0JKiBzaC5tdDogUmVtb3ZlZC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogY29udmVydGVkIHRvIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0Y29uZiAyLjQuCi0KLUZyaSBKdW4gMzAgMTY6NTE6MzggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBJZiBhcmd1bWVudCBzdXBwbGllZCwgaW50ZXJwcmV0IGFzCi0JZGVzaXJlZCBtZW1vcnkgc2l6ZS4KLQkocGFyc2VfYW5kX3NldF9tZW1vcnlfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2RvX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBKdW4gMjkgMTA6MDI6MjggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jICAoU1lTX3dhaXQpOiBEZWZpbmUgYXMgU1lTX3dhaXQ0IGlmIGF2YWlsYWJsZSBhbmQKLQlTWVNfd2FpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkIChTdW5PUyA0LjEuMyBmb3IgZXhhbXBsZSkuCi0JKFNZU191dGltZSk6IERlZmluZSBhcyBTWVNfdXRpbWVzIGlmIGF2YWlsYWJsZSBhbmQKLQlTWVNfdXRpbWUgaXMgbm90IGFscmVhZHkgZGVmaW5lZC4KLQotVGh1IEp1biAyMiAxNzoyNTo1NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogRG9uJ3QgaW5jbHVkZSBzeXMvdGltZXMuaCBvciBzeXMvcGFyYW0uaAotCi1XZWQgSnVuIDIxIDE1OjAzOjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChTSUdCVVMsIFNJR1RFUk0pOiBEZWZpbmUgaWYgbm90LgotCShzaW1fbWVtb3J5X3NpemUpOiBkZWZhdWx0IHRvIDJeMTkgb24gUENzLgotCShzaW1fcmVzdW1lKTogUG9sbCBmb3IgcXVpdHMgb24gd2luMzIuCi0KLVdlZCBNYXkgMjQgMTY6MjI6NDggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKG9wX3RhYik6IEFkZCBTSDMgc3VwcG9ydC4KLQotV2VkIE1heSAyNCAxNDowNzoxMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKHRhYik6IEFkZCBic3JmIGFuZCBicmFmLgotCi1Nb24gQXByIDI0IDE1OjA5OjQ5IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCwgbm90IAotCS4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oICh3aGljaCBkb2Vzbid0IGV4aXN0KS4KLQotTW9uIE1hciAyNyAxMDozMjozNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jOiBwYXJzZSBhcmd1bWVudHMgd2l0aCBnZXRvcHQoKS4KLQotU3VuIEZlYiAyNiAxNToyNzoyNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCBpZiBzcGVjaWZpYwotCWhvc3QgdW5hdmFpbGFibGUuCi0KLU1vbiBKYW4gMjMgMTY6MTA6NTggMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAobWFjdyk6IFNpZ24gZXh0ZW5kIE1BQ0ggYXQgYml0IDEwIGZvciBub24tc2F0dXJhdGluZyBjYXNlLgotCi1TdW4gSmFuIDIyIDEzOjU1OjM2IDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBydGwuY3lnbnVzLmNvbT4KLQotCSogZ2VuY29kZS5jIChvcF90YWIpOiBNYWtlIE1BQy5XIGNhbGwgbWFjdywgbm90IGFib3J0LgotCSogaW50ZXJwLmMgKG1hY3cpOiBOZXcgZnVuY3Rpb24uCi0JKFMpOiBOZXcgI2RlZmluZS4KLQotU2F0IEphbiAyMSAxNTo1MjozMCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGdlbmNvZGUuYyAob3BfdGFiKTogTmV3IGNvZGUgZm9yIEFERFYgYW5kIFNVQlYuCi0JTWFrZSBNQUMuTCBhYm9ydCBzaWNuZSBpdCBpcyBub3QgaW1wbGVtZW50ZWQuCi0KLQkqIGludGVycC5jIChkbXVsKTogSGFuZGxlIHRoZSBzaWduZWQgY2FzZSBieSBhZGp1c3RpbmcgYWZ0ZXIgdW5zaWduZWQgbXVsdGlwbHkuCi0JR2V0IHJpZCBvZiBfX0dOVUNfXyBjb25kaXRpb25hbC4KLQotYVRodSBKYW4gMTkgMDU6NTA6NTAgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQHJ0bC5jeWdudXMuY29tPgotCi0JKiBnZW5jb2RlLmMgKG9wX3RhYik6IEFsc28gcmVwbGFjZSBORUdDLCBhbmQgdHJ5IGFnYWluIHdpdGggU1VCQy4KLQlDaGFuZ2UgQUREQyBmb3Igc3ltbWV0cnkuCi0KLQkqIGdlbmNvZGUuYyAob3BfdGFiKTogUmVwbGFjZSBjb2RlIGZvciBBRERDIGFuZCBTVUJDLgotCi1Nb24gSmFuICA5IDE1OjQzOjUzIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGludGVycC5jOiAgUmVtb3ZlIGRlZiBvZiBJTkxJTkUuICBUaGlzIGNvbWVzIGZyb20gYmZkLmguICBBbHNvLAotCWRlY2xhcmUgSU9NRU0gYmVmb3JlIHVzaW5nIGl0LgotCi1XZWQgRGVjIDI4IDIxOjI1OjMxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChCVVNFUlJPUik6IE5ldyBtYWNyby4KLQkoW3J8d11bYndsXWF0W2xpdHRsZXxiaWddKSBOZXcgZnVuY3Rpb25zLgotCShzaW1fcmVzdW1lKTogSWYgR08zMiBjaGVjayBmb3IgaW50ZXJydXB0IGV2ZXJ5IG5vdwotCWFuZCBhZ2Fpbi4gIERlY3JlbWVudCBQQyBpZiBTSUdCVVMgc2Vlbi4KLQkqIHJ1bi5jIChtYWluKTogIFJldHVybiByZXN1bHQgb2Ygc2ltdWxhdGVkIF9leGl0LgotCi1Nb24gRGVjICA1IDIxOjU5OjUxIDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChnZW5jb2RlKTogQWxsb3cgYnVpbGQgaW4gZGlmZmVyZW50IGRpcmVjdG9yeS4KLQotV2VkIE5vdiAzMCAxNzo0NzoxMyAxOTk0ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChnZW5jb2RlKTogQ2hhbmdlICQ8IHRvIGdlbmNvZGUuYyBmb3IgcG9ydGFiaWxpdHkuCi0KLVdlZCBOb3YgMjMgMjE6MzE6NTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKFt3cl1bYndsXWF0KTogTmV3IGZ1bmN0aW9ucy4KLQkodHJhcCk6IENvcGUgd2l0aCBib3RoIGJ5dGUgbW9kZXMuCi0KLVRodSBTZXAgIDggMTc6MzU6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2VuY29kZS5jICh0YWIpOiBTaW11bGF0ZSBUIGJpdCBhZnRlciBhIG5lZ2MgaW5zbiByaWdodC4KLQkqIGludGVycC5jIChSU0JBVCk6IFNpZ24gZXh0ZW5kIHRoZSBhcmcuCi0JKEFDRV9GQVNUKTogTmV3IG1hY3JvLgotCShzaW1fcmVzdW1lKTogUmVtb3ZlIG9ic29sZXRlIHRlc3Qgb2Ygc2ltX3RpbWVvdXQuCi0JCi1GcmkgQXVnICA1IDE0OjEyOjMxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChJT01FTSk6IE5ldyBmdW5jdGlvbiwgc2ltdWxhdGVzIHZlcnkgYmFzaWMgSS9PIGFyZWEgb2YKLQl0aGUgU0guCi0JKFdCQVQsIFJCQVQpIDogQ2FsbCBJL08gZnVuY3Rpb25zLgotCSogZ2VuY29kZS5jICh0YWIpOiBTcGVjaWFsIGNhc2UgdHJhcGEgIzMuCi0KLU1vbiBKdW4gMjcgMTg6MDQ6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHJ1bi5jIChtYWluKTogU3BlY2lmeSB0aGUgZmlsZSB0eXBlIGFnYWluLgotCi1UaHUgTWF5IDI2IDE5OjA0OjM3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAodHJhcCk6IEZpeCBpcml4IGluY29tcGF0aWJpbGl0eS4KLQkqIHJ1bi5jIChtYWluKTogb3BlbiB3aXRob3V0IHNwZWNpZnlpbmcgZmlsZSB0eXBlLgotCi1XZWQgTWF5IDE4IDE0OjE4OjUzIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChzaW1fKik6IE1ha2UgcmVzdWx0IHZvaWQgd2hlcmUgdGhlcmUgaXNuJ3Qgb25lLgotCShzaW1fc2V0X3BjKTogRGVsZXRlLgotCShzaW1faW5mbyk6IERlbGV0ZSBwcmludGZfZm4gYXJnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCUNhbGwgcHJpbnRmX2ZpbHRlcmVkIGluc3RlYWQuCi0JKHNpbV9jbG9zZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2xvYWQpOiBOZXcgZnVuY3Rpb24uCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZW5hbWVkIGZyb20gc2ltX3NldF9hcmdzLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCSogcnVuLmM6ICNpbmNsdWRlIDx2YXJhcmdzLmg+LCAicmVtb3RlLXNpbS5oIi4KLQkocHJpbnRmX2ZpbHRlcmVkKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgQXByIDI3IDEyOjAzOjQ4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGdlbmNvZGUuYyAodGFibGUpOiBHZXQgZGlyZWN0aW9uIG9mIHNvbWUgb3Bjb2RlcyByaWdodC4KLSAgICAgICAgKHRyYXBhLCBydGUpOiBJbXBsZW1lbnQgZnVsbHkuCi0JKiBpbnRlcnAuYyAodHJhcCk6IE1ha2Ugc3RhdCBjYWxsIG1vcmUgcG9ydGFibGUuCi0KLUZyaSBGZWIgMTEgMjE6NTk6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAc3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogZ2VuY29kZS5jIChtYWluLCBnZW5kZWZpbmVzKTogTmV3IC1kIG9wdGlvbiBwcmludHMgdGFibGUgb2YgZGVmaW5lcy4KLQkqIGludGVycC5jICh0cmFwKTogQWRkIGEgbG9hZCBvZiBzeXN0ZW0gY2FsbHMuIAotCShzaW1fbWVtb3J5X3NpemUpOiBOb3cgZGVmYXVsdCB0byA4TWJ5dGUuCi0gICAgICAgIChQQVJBTk9JRCk6IEtlZXAgdmVjdG9yIG9mIHJlZ2lzdGVycyB3aXRoIHVuZGVmaW5lZCBjb250ZW50cy4KLQotTW9uIE5vdiAxNSAxNDozNzoxOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmM6IG1vdmEgdXNlcyBhbGlnbmVkIGFkZHJlc3NlcwotCSogaW50ZXJwLmMgKHRyYXApOiBSZXR1cm4gcmVzdWx0cyBpbiByMC4KLQotVHVlIE9jdCAyNiAxMDozODo1NSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1NFQVJDSCk6IEFkZCAtSSQoc3JjZGlyKS8uLi8uLi9nZGIKLQkqIGludGVycC5jOiAjaW5jbHVkZSAicmVtb3RlLXNpbS5oIi4KLQkoc2ltX3Jlc3VtZSk6IGludCByZXN1bHQsIG5ldyBhcmcgYHNpZ2duYWwnLgotCShzaW1fd3JpdGUpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGBhZGRyJy4KLQkoc2ltX3JlYWQpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGBhZGRyJy4KLQlVc2UgdW5zaWduZWQgY2hhciAqIGZvciBgYnVmZmVyJy4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogaW50IHJlc3VsdC4KLQkoc2ltX2ZldGNoX3JlZ2lzdGVyKTogRGl0dG8uCi0JKHNpbV9zdG9wX3JlYXNvbik6IFJlbmFtZWQgZnJvbSBzaW1fc3RvcF9zaWduYWwuICBOZXcgYXJnIGByZWFzb24nLgotCShzaW1fc2V0X3BjKTogaW50IHJlc3VsdCwgdXNlIFNJTV9BRERSIGZvciB0eXBlIG9mIGFyZyBgeCcuCi0JKHNpbV9pbmZvKTogaW50IHJlc3VsdCwgbmV3IGFyZ3MgYHZlcmJvc2UnLCBgcHJpbnRmX2ZuJy4KLQkoc2ltX2tpbGwpOiBpbnQgcmVzdWx0LgotCShzaW1fb3Blbik6IGludCByZXN1bHQsIG5ldyBhcmcgYG5hbWUnLgotCSogcnVuLmM6ICNpbmNsdWRlIDxzdGRpby5oPgotCShtYWluKTogVXBkYXRlIGNhbGwgdG8gc2ltX2luZm8uCi0KLVNhdCBPY3QgMjMgMTU6MDk6MjkgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKHNpbV9zdG9wX3NpZ25hbCk6IFJlc3VsdCBpcyBub3cgZW51bSBzaW1fc3RvcC4KLQotRnJpIE9jdCAgOCAxMDo0NzowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmMgKHRhYmxlKTogQmVjb21lcyB1bnNpZ25lZC4KLQkqIGludGVycC5jICh0cmFwKTogR2V0IHJpZ2h0IGJyZWFrcG9pbnQgU0lHbnVtLiAoc2ltX3dyaXRlLAotCXNpbV9yZWFkKTogUmV0dXJuIG51bWJlciBvZiBieXRlcyBjb3BpZWQuICAoc2ltX3N0b3JlX3JlZ2lzdGVyKToKLQlWYWx1ZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiAoc2ltX2tpbGwsIHNpbV9vcGVuLCBzaW1fc2V0X2FyZ3MpOiBOZXcgZnVuY3Rpb25zLgotCi1UdWUgU2VwICA3IDE2OjI0OjEzIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKHNpbV9pbmZvKTogRml4IHNtYWxsIHR5cG8gaW4gcHJpbnRmIHN0cmluZy4KLQotVGh1IEF1ZyAgNSAxMTozNzo0OCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChzaW1fcmVzdW1lKTogU2V0IG1lbW9yeSBhZnRlciBwb2ludGVycyBpbml0ZWQuCi0KLU1vbiBBdWcgIDIgMTQ6MTM6MjIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKGdldF9ub3cpOiBVc2UgdGltZSBzeXN0ZW0gY2FsbC4KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIGNvcnJlY3RseS4KLQotVHVlIEp1bCAgNiAxMDozMDo0NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBydW4uYyAobWFpbiksIGludGVycC5jIChzaW1fc2V0X3RpbWVvdXQpOiBSZW1vdmUgdGltZW91dAotCWZ1bmN0aW9uYWxpdHkuCi0KLVRodSBKdW4gMjQgMTM6Mjk6NTcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgcnVuIGluZGVudCBldmVyeXRpbWU7IGFsc28gYWRkIGEgc3BhY2UgaW4gdGhlCi0JaW5jbHVkZXMgCi0KLVRodSBKdW4gMTcgMTg6MzA6NDIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogZ2VuY29kZS5jOiBGaXggc29tZSBvcGNvZGVzLgotCSogaW50ZXJwLmM6IFN1cHBvcnQgZm9yIHByb2ZpbGluZyBhbmQgcG9ydGFiaWxpdHkgZml4ZXMuCi0JKiBydW4uYyAobWFpbik6IEdldCBwcm9maWxpbmcgYXJncy4KLQotV2VkIE1heSAgNSAxMzoxNzoyMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBnZW5jb2RlLmMgKHRhYik6IExpbnQgZm9yIHNnaSBjb21waWxlcgotCSogaW50ZXJwLmM6IExpbnQgZm9yIHNnaSBjb21waWxlci4KLQotTW9uIE1heSAgMyAxNToyNTozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcnVuLmMgKG1haW4pOiBTdXBwb3J0IGZvciByZXNpemluZyBzaW11bGF0ZWQgUkFNLgkKLQkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IGZvciBicm9rZW4gbWFrZXMuCi0JKiBpbnRlcnAuYywgZ2VuY29kZS5jOiBMaW50LgotCi1Nb24gQXByIDI2IDE4OjAxOjEwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcmVhdGVkCi0KZGlmZiAtLWdpdCBhL3NpbS9zaC9NYWtlZmlsZS5pbiBiL3NpbS9zaC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlNGI1My4uMDAwMDAwMAotLS0gYS9zaW0vc2gvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBTSCBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1TSU1fT0JKUyA9IGludGVycC5vIHRhYmxlLm8gc2ltLWxvYWQubwotU0lNX0VYVFJBX0xJQlMgPSAtbG0KLVNJTV9FWFRSQV9DTEVBTiA9IHNoLWNsZWFuCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLWludGVycC5vOiBpbnRlcnAuYyBjb2RlLmMgdGFibGUuYwotCi1jb2RlLmM6IGdlbmNvZGUKLQkuL2dlbmNvZGUgLXggPmNvZGUuYwotIwlpbmRlbnQgY29kZS5jCi0KLXRhYmxlLmM6IGdlbmNvZGUKLQkuL2dlbmNvZGUgLXMgPnRhYmxlLmMKLSMJaW5kZW50IHRhYmxlLmMKLQotZ2VuY29kZTogZ2VuY29kZS5jCi0JJChDQ19GT1JfQlVJTEQpIC1vIGdlbmNvZGUgJChzcmNkaXIpL2dlbmNvZGUuYwotCi1zaC1jbGVhbjoKLQlybSAtZiBnZW5jb2RlIGNvZGUuYyB0YWJsZS5jCmRpZmYgLS1naXQgYS9zaW0vc2gvYWNjb25maWcuaCBiL3NpbS9zaC9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4N2ExLi4wMDAwMDAwCi0tLSBhL3NpbS9zaC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vc2gvY29uZmlnLmluIGIvc2ltL3NoL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4N2EyYi4uMDAwMDAwMAotLS0gYS9zaW0vc2gvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUlVTQUdFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vc2gvY29uZmlndXJlIGIvc2ltL3NoL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjcyMGQ2Yi4uMDAwMDAwMAotLS0gYS9zaW0vc2gvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDAyNCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL3NoL2NvbmZpZ3VyZS5pbiBiL3NpbS9zaC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzM2IwYmMuLjAwMDAwMDAKLS0tIGEvc2ltL3NoL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1BQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQotCi1TSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vc2gvZ2VuY29kZS5jIGIvc2ltL3NoL2dlbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2MDVmYy4uMDAwMDAwMAotLS0gYS9zaW0vc2gvZ2VuY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYxOSArMCwwIEBACi0vKiBTaW11bGF0b3IvT3Bjb2RlIGdlbmVyYXRvciBmb3IgdGhlIEhpdGFjaGkgU3VwZXItSCBhcmNoaXRlY3R1cmUuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTSCBzaW0KLQotCi0JCVRISVMgU09GVFdBUkUgSVMgTk9UIENPUFlSSUdIVEVECi0KLSAgIEN5Z251cyBvZmZlcnMgdGhlIGZvbGxvd2luZyBmb3IgdXNlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgQ3lnbnVzCi0gICBtYWtlcyBubyB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXQncyBwZXJmb3JtYW5jZQotICAgYW5kIHRoZSB1c2VyIGFjY2VwdHMgdGhlIHNvZnR3YXJlICJBUyBJUyIgd2l0aCBhbGwgZmF1bHRzLgotCi0gICBDWUdOVVMgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFdJVEggUkVHQVJEIFRPCi0gICBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSovCi0KLS8qIFRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgdGhlIG9wY29kZSB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciBhbmQKLSAgIHRoZSBzaW11bGF0b3IgY29kZQotCi0gICAtdAkJcHJpbnRzIGEgcHJldHR5IHRhYmxlIGZvciB0aGUgYXNzZW1ibGVyIG1hbnVhbAotICAgLXMJCWdlbmVyYXRlcyB0aGUgc2ltdWxhdG9yIGNvZGUganVtcCB0YWJsZQotICAgLWQJCWdlbmVyYXRlcyBhIGRlZmluZSB0YWJsZQotICAgLXgJCWdlbmVyYXRlcyB0aGUgc2ltdWxhdG9yIGNvZGUgc3dpdGNoIHN0YXRlbWVudAotICAgZGVmYXVsdCAJdXNlZCB0byBnZW5lcmF0ZSB0aGUgb3Bjb2RlIHRhYmxlcwotCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBNQVhfTlJfU1RVRkYgNDIKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqZGVmczsKLSAgY2hhciAqcmVmczsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqY29kZTsKLSAgY2hhciAqc3R1ZmZbTUFYX05SX1NUVUZGXTsKLSAgaW50IGluZGV4OwotfQotCi1vcDsKLQotCi1vcCB0YWJbXSA9Ci17Ci0KLSAgeyAibiIsICIiLCAiYWRkICM8aW1tPiw8UkVHX04+IiwgIjAxMTFubm5uaTgqMS4uLi4iLAotICAgICJSW25dICs9IFNFWFQoaSk7IiwKLSAgICAiaWYgKGkgPT0gMCkgeyIsCi0gICAgIiAgVU5ERUYobik7IC8qIHNlZSAjaWZkZWYgUEFSQU5PSUQgKi8iLAotICAgICIgIGJyZWFrOyIsCi0gICAgIn0iLAotICB9LAotICB7ICJuIiwgIm1uIiwgImFkZCA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTEwMCIsCi0gICAgIlJbbl0gKz0gUlttXTsiLAotICB9LAotCi0gIHsgIm4iLCAibW4iLCAiYWRkYyA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTExMCIsCi0gICAgInVsdCA9IFJbbl0gKyBUOyIsCi0gICAgIlNFVF9TUl9UICh1bHQgPCBSW25dKTsiLAotICAgICJSW25dID0gdWx0ICsgUlttXTsiLAotICAgICJTRVRfU1JfVCAoVCB8fCAoUltuXSA8IHVsdCkpOyIsCi0gIH0sCi0KLSAgeyAibiIsICJtbiIsICJhZGR2IDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMTExIiwKLSAgICAidWx0ID0gUltuXSArIFJbbV07IiwKLSAgICAiU0VUX1NSX1QgKCh+KFJbbl0gXiBSW21dKSAmICh1bHQgXiBSW25dKSkgPj4gMzEpOyIsCi0gICAgIlJbbl0gPSB1bHQ7IiwKLSAgfSwKLQotICB7ICIwIiwgIiIsICJhbmQgIzxpbW0+LFIwIiwgIjExMDAxMDAxaTgqMS4uLi4iLAotICAgICJSMCAmPSBpOyIsCi0gIH0sCi0gIHsgIm4iLCAibm0iLCAiYW5kIDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMDAxIiwKLSAgICAiUltuXSAmPSBSW21dOyIsCi0gIH0sCi0gIHsgIiIsICIwIiwgImFuZC5iICM8aW1tPixAKFIwLEdCUikiLCAiMTEwMDExMDFpOCoxLi4uLiIsCi0gICAgIk1BICgxKTsiLAotICAgICJXQkFUIChHQlIgKyBSMCwgUkJBVCAoR0JSICsgUjApICYgaSk7IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImJmIDxiZGlzcDg+IiwgIjEwMDAxMDExaThwMS4uLi4iLAotICAgICJpZiAoIVQpIHsiLAotICAgICIgIFNFVF9OSVAgKFBDICsgNCArIChTRVhUKGkpICogMikpOyIsCi0gICAgIiAgY3ljbGVzICs9IDI7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJiZi5zIDxiZGlzcDg+IiwgIjEwMDAxMTExaThwMS4uLi4iLAotICAgICJpZiAoIVQpIHsiLAotICAgICIgIFNFVF9OSVAgKFBDICsgNCArIChTRVhUIChpKSAqIDIpKTsiLAotICAgICIgIGN5Y2xlcyArPSAyOyIsCi0gICAgIiAgRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAotICAgICJ9IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImJyYSA8YmRpc3AxMj4iLCAiMTAxMGkxMi4uLi4uLi4uLiIsCi0gICAgIlNFVF9OSVAgKFBDICsgNCArIChTRVhUMTIgKGkpICogMikpOyIsCi0gICAgImN5Y2xlcyArPSAyOyIsCi0gICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKLSAgfSwKLQotICB7ICIiLCAibiIsICJicmFmIDxSRUdfTj4iLCAiMDAwMG5ubm4wMDEwMDAxMSIsCi0gICAgIlNFVF9OSVAgKFBDICsgNCArIFJbbl0pOyIsCi0gICAgImN5Y2xlcyArPSAyOyIsCi0gICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImJzciA8YmRpc3AxMj4iLCAiMTAxMWkxMi4uLi4uLi4uLiIsCi0gICAgIlBSID0gUEgyVCAoUEMgKyA0KTsiLAotICAgICJTRVRfTklQIChQQyArIDQgKyAoU0VYVDEyIChpKSAqIDIpKTsiLAotICAgICJjeWNsZXMgKz0gMjsiLAotICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCi0gIH0sCi0KLSAgeyAiIiwgIm4iLCAiYnNyZiA8UkVHX04+IiwgIjAwMDBubm5uMDAwMDAwMTEiLAotICAgICJQUiA9IFBIMlQgKFBDKSArIDQ7IiwKLSAgICAiU0VUX05JUCAoUEMgKyA0ICsgUltuXSk7IiwKLSAgICAiY3ljbGVzICs9IDI7IiwKLSAgICAiRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAotICB9LAotCi0gIHsgIiIsICIiLCAiYnQgPGJkaXNwOD4iLCAiMTAwMDEwMDFpOHAxLi4uLiIsCi0gICAgImlmIChUKSB7IiwKLSAgICAiICBTRVRfTklQIChQQyArIDQgKyAoU0VYVCAoaSkgKiAyKSk7IiwKLSAgICAiICBjeWNsZXMgKz0gMjsiLAotICAgICJ9IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImJ0LnMgPGJkaXNwOD4iLCAiMTAwMDExMDFpOHAxLi4uLiIsCi0gICAgImlmIChUKSB7IiwKLSAgICAiICBTRVRfTklQIChQQyArIDQgKyAoU0VYVCAoaSkgKiAyKSk7IiwKLSAgICAiICBjeWNsZXMgKz0gMjsiLAotICAgICIgIERlbGF5X1Nsb3QgKFBDICsgMik7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJjbHJtYWMiLCAiMDAwMDAwMDAwMDEwMTAwMCIsCi0gICAgIk1BQ0ggPSAwOyIsCi0gICAgIk1BQ0wgPSAwOyIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJjbHJzIiwgIjAwMDAwMDAwMDEwMDEwMDAiLAotICAgICJTRVRfU1JfUyAoMCk7IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImNscnQiLCAiMDAwMDAwMDAwMDAwMTAwMCIsCi0gICAgIlNFVF9TUl9UICgwKTsiLAotICB9LAotCi0gIHsgIiIsICIwIiwgImNtcC9lcSAjPGltbT4sUjAiLCAiMTAwMDEwMDBpOCoxLi4uLiIsCi0gICAgIlNFVF9TUl9UIChSMCA9PSBTRVhUIChpKSk7IiwKLSAgfSwKLSAgeyAiIiwgIm1uIiwgImNtcC9lcSA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMDAwMCIsCi0gICAgIlNFVF9TUl9UIChSW25dID09IFJbbV0pOyIsCi0gIH0sCi0gIHsgIiIsICJtbiIsICJjbXAvZ2UgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAwMTEiLAotICAgICJTRVRfU1JfVCAoUltuXSA+PSBSW21dKTsiLAotICB9LAotICB7ICIiLCAibW4iLCAiY21wL2d0IDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0wMTExIiwKLSAgICAiU0VUX1NSX1QgKFJbbl0gPiBSW21dKTsiLAotICB9LAotICB7ICIiLCAibW4iLCAiY21wL2hpIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0wMTEwIiwKLSAgICAiU0VUX1NSX1QgKFVSW25dID4gVVJbbV0pOyIsCi0gIH0sCi0gIHsgIiIsICJtbiIsICJjbXAvaHMgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAwMTAiLAotICAgICJTRVRfU1JfVCAoVVJbbl0gPj0gVVJbbV0pOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgImNtcC9wbCA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTAxMDEiLAotICAgICJTRVRfU1JfVCAoUltuXSA+IDApOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgImNtcC9weiA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTAwMDEiLAotICAgICJTRVRfU1JfVCAoUltuXSA+PSAwKTsiLAotICB9LAotICB7ICIiLCAibW4iLCAiY21wL3N0ciA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMTEwMCIsCi0gICAgInVsdCA9IFJbbl0gXiBSW21dOyIsCi0gICAgIlNFVF9TUl9UICgoKHVsdCAmIDB4ZmYwMDAwMDApID09IDApIiwKLSAgICAiICAgICAgICAgIHwgKCh1bHQgJiAweGZmMDAwMCkgPT0gMCkiLAotICAgICIgICAgICAgICAgfCAoKHVsdCAmIDB4ZmYwMCkgPT0gMCkiLAotICAgICIgICAgICAgICAgfCAoKHVsdCAmIDB4ZmYpID09IDApKTsiLAotICB9LAotCi0gIHsgIiIsICJtbiIsICJkaXYwcyA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMDExMSIsCi0gICAgIlNFVF9TUl9RICgoUltuXSAmIHNiaXQpICE9IDApOyIsCi0gICAgIlNFVF9TUl9NICgoUlttXSAmIHNiaXQpICE9IDApOyIsCi0gICAgIlNFVF9TUl9UIChNICE9IFEpOyIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJkaXYwdSIsICIwMDAwMDAwMDAwMDExMDAxIiwKLSAgICAiU0VUX1NSX00gKDApOyIsCi0gICAgIlNFVF9TUl9RICgwKTsiLAotICAgICJTRVRfU1JfVCAoMCk7IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgImRpdjEgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAxMDAiLAotICAgICJkaXYxIChSLCBtLCBuLyosIFQqLyk7IiwKLSAgfSwKLQotICB7ICIiLCAibm0iLCAiZG11bHMubCA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTEwMSIsCi0gICAgImRtdWwgKDEvKnNpZ25lZCovLCBSW25dLCBSW21dKTsiLAotICB9LAotCi0gIHsgIiIsICJubSIsICJkbXVsdS5sIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0wMTAxIiwKLSAgICAiZG11bCAoMC8qdW5zaWduZWQqLywgUltuXSwgUlttXSk7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAiZHQgPFJFR19OPiIsICIwMTAwbm5ubjAwMDEwMDAwIiwKLSAgICAiUltuXS0tOyIsCi0gICAgIlNFVF9TUl9UIChSW25dID09IDApOyIsCi0gIH0sCi0KLSAgeyAibiIsICJtIiwgImV4dHMuYiA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMTExMCIsCi0gICAgIlJbbl0gPSBTRVhUIChSW21dKTsiLAotICB9LAotICB7ICJuIiwgIm0iLCAiZXh0cy53IDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0xMTExIiwKLSAgICAiUltuXSA9IFNFWFRXIChSW21dKTsiLAotICB9LAotCi0gIHsgIm4iLCAibSIsICJleHR1LmIgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTExMDAiLAotICAgICJSW25dID0gKFJbbV0gJiAweGZmKTsiLAotICB9LAotICB7ICJuIiwgIm0iLCAiZXh0dS53IDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0xMTAxIiwKLSAgICAiUltuXSA9IChSW21dICYgMHhmZmZmKTsiLAotICB9LAotCi0gIC8qIHNoM2UgKi8KLSAgeyAiIiwgIiIsICJmYWJzIDxGUkVHX04+IiwgIjExMTFubm5uMDEwMTExMDEiLAotICAgICJGUF9VTkFSWSAobiwgZmFicyk7IiwKLSAgICAiLyogRklYTUU6IEZSKG4pICY9IDB4N2ZmZmZmZmY7ICovIiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZmFkZCA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMDAwIiwKLSAgICAiRlBfT1AgKG4sICssIG0pOyIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZjbXAvZXEgPEZSRUdfTT4sPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMDEwMCIsCi0gICAgIkZQX0NNUCAobiwgPT0sIG0pOyIsCi0gIH0sCi0gIC8qIHNoM2UgKi8KLSAgeyAiIiwgIiIsICJmY21wL2d0IDxGUkVHX00+LDxGUkVHX04+IiwgIjExMTFubm5ubW1tbTAxMDEiLAotICAgICJGUF9DTVAgKG4sID4sIG0pOyIsCi0gIH0sCi0KLSAgLyogc2g0ICovCi0gIHsgIiIsICIiLCAiZmNudmRzIDxEUl9OPixGUFVMIiwgIjExMTFubm5uMTAxMTExMDEiLAotICAgICJpZiAoISBGUFNDUl9QUiB8fCBuICYgMSkiLAotICAgICIgIFJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTsiLAotICAgICJlbHNlIiwKLSAgICAieyIsCi0gICAgIiAgdW5pb24iLAotICAgICIgIHsiLAotICAgICIgICAgaW50IGk7IiwKLSAgICAiICAgIGZsb2F0IGY7IiwKLSAgICAiICB9IHU7IiwKLSAgICAiICB1LmYgPSBEUihuKTsiLAotICAgICIgIEZQVUwgPSB1Lmk7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgLyogc2g0ICovCi0gIHsgIiIsICIiLCAiZmNudnNkIEZQVUwsPERSX04+IiwgIjExMTFubm5uMTAxMDExMDEiLAotICAgICJpZiAoISBGUFNDUl9QUiB8fCBuICYgMSkiLAotICAgICIgIFJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTsiLAotICAgICJlbHNlIiwKLSAgICAieyIsCi0gICAgIiAgdW5pb24iLAotICAgICIgIHsiLAotICAgICIgICAgaW50IGk7IiwKLSAgICAiICAgIGZsb2F0IGY7IiwKLSAgICAiICB9IHU7IiwKLSAgICAiICB1LmkgPSBGUFVMOyIsCi0gICAgIiAgU0VUX0RSKG4sIHUuZik7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZkaXYgPEZSRUdfTT4sPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMDAxMSIsCi0gICAgIkZQX09QIChuLCAvLCBtKTsiLAotICAgICIvKiBGSVhNRTogY2hlY2sgZm9yIERQIGFuZCAobiAmIDEpID09IDA/ICovIiwKLSAgfSwKLQotICAvKiBzaDQgKi8KLSAgeyAiIiwgIiIsICJmaXByIDxGVl9NPiw8RlZfTj4iLCAiMTExMW5ubW0xMTEwMTEwMSIsCi0gICAgIi8qIEZJWE1FOiBub3QgaW1wbGVtZW50ZWQgKi8iLAotICAgICJSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IiwKLSAgICAiLyogRklYTUU6IGNoZWNrIGZvciBEUCBhbmQgKG4gJiAxKSA9PSAwPyAqLyIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZsZGkwIDxGUkVHX04+IiwgIjExMTFubm5uMTAwMDExMDEiLAotICAgICJTRVRfRlIgKG4sIChmbG9hdCkwLjApOyIsCi0gICAgIi8qIEZJWE1FOiBjaGVjayBmb3IgRFAgYW5kIChuICYgMSkgPT0gMD8gKi8iLAotICB9LAotCi0gIC8qIHNoM2UgKi8KLSAgeyAiIiwgIiIsICJmbGRpMSA8RlJFR19OPiIsICIxMTExbm5ubjEwMDExMTAxIiwKLSAgICAiU0VUX0ZSIChuLCAoZmxvYXQpMS4wKTsiLAotICAgICIvKiBGSVhNRTogY2hlY2sgZm9yIERQIGFuZCAobiAmIDEpID09IDA/ICovIiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZmxkcyA8RlJFR19OPixGUFVMIiwgIjExMTFubm5uMDAwMTExMDEiLAotICAgICIgIHVuaW9uIiwKLSAgICAiICB7IiwKLSAgICAiICAgIGludCBpOyIsCi0gICAgIiAgICBmbG9hdCBmOyIsCi0gICAgIiAgfSB1OyIsCi0gICAgIiAgdS5mID0gRlIobik7IiwKLSAgICAiICBGUFVMID0gdS5pOyIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZsb2F0IEZQVUwsPEZSRUdfTj4iLCAiMTExMW5ubm4wMDEwMTEwMSIsCi0gICAgLyogc2g0ICovCi0gICAgImlmIChGUFNDUl9QUikiLAotICAgICIgIFNFVF9EUiAobiwgKGRvdWJsZSlGUFVMKTsiLAotICAgICJlbHNlIiwKLSAgICAieyIsCi0gICAgIiAgU0VUX0ZSIChuLCAoZmxvYXQpRlBVTCk7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtYWMgPEZSRUdfMD4sPEZSRUdfTT4sPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMTExMCIsCi0gICAgIlNFVF9GUiAobiwgRlIobSkgKiBGUigwKSArIEZSKG4pKTsiLAotICAgICIvKiBGSVhNRTogY2hlY2sgZm9yIERQIGFuZCAobiAmIDEpID09IDA/ICovIiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZm1vdiA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0xMTAwIiwKLSAgICAvKiBzaDQgKi8KLSAgICAiaWYgKEZQU0NSX1NaKSB7IiwKLSAgICAiICBpbnQgbmkgPSBYRF9UT19YRiAobik7IiwKLSAgICAiICBpbnQgbWkgPSBYRF9UT19YRiAobSk7IiwKLSAgICAiICBTRVRfWEYgKG5pICsgMCwgWEYgKG1pICsgMCkpOyIsCi0gICAgIiAgU0VUX1hGIChuaSArIDEsIFhGIChtaSArIDEpKTsiLAotICAgICJ9IiwKLSAgICAiZWxzZSIsCi0gICAgInsiLAotICAgICIgIFNFVF9GUiAobiwgRlIgKG0pKTsiLAotICAgICJ9IiwKLSAgfSwKLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtb3YucyA8RlJFR19NPixAPFJFR19OPiIsICIxMTExbm5ubm1tbW0xMDEwIiwKLSAgICAvKiBzaDQgKi8KLSAgICAiaWYgKEZQU0NSX1NaKSB7IiwKLSAgICAiICBNQSAoMik7IiwKLSAgICAiICBXREFUIChSW25dLCBtKTsiLAotICAgICJ9IiwKLSAgICAiZWxzZSIsCi0gICAgInsiLAotICAgICIgIE1BICgxKTsiLAotICAgICIgIFdMQVQgKFJbbl0sIEZJKG0pKTsiLAotICAgICJ9IiwKLSAgfSwKLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtb3YucyBAPFJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0xMDAwIiwKLSAgICAvKiBzaDQgKi8KLSAgICAiaWYgKEZQU0NSX1NaKSB7IiwKLSAgICAiICBNQSAoMik7IiwKLSAgICAiICBSREFUIChSW21dLCBuKTsiLAotICAgICJ9IiwKLSAgICAiZWxzZSIsCi0gICAgInsiLAotICAgICIgIE1BICgxKTsiLAotICAgICIgIFNFVF9GSShuLCBSTEFUKFJbbV0pKTsiLAotICAgICJ9IiwKLSAgfSwKLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtb3YucyBAPFJFR19NPissPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMTAwMSIsCi0gICAgLyogc2g0ICovCi0gICAgImlmIChGUFNDUl9TWikgeyIsCi0gICAgIiAgTUEgKDIpOyIsCi0gICAgIiAgUkRBVCAoUlttXSwgbik7IiwKLSAgICAiICBSW21dICs9IDg7IiwKLSAgICAifSIsCi0gICAgImVsc2UiLAotICAgICJ7IiwKLSAgICAiICBNQSAoMSk7IiwKLSAgICAiICBTRVRfRkkgKG4sIFJMQVQgKFJbbV0pKTsiLAotICAgICIgIFJbbV0gKz0gNDsiLAotICAgICJ9IiwKLSAgfSwKLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtb3YucyA8RlJFR19NPixALTxSRUdfTj4iLCAiMTExMW5ubm5tbW1tMTAxMSIsCi0gICAgLyogc2g0ICovCi0gICAgImlmIChGUFNDUl9TWikgeyIsCi0gICAgIiAgTUEgKDIpOyIsCi0gICAgIiAgUltuXSAtPSA4OyIsCi0gICAgIiAgV0RBVCAoUltuXSwgbSk7IiwKLSAgICAifSIsCi0gICAgImVsc2UiLAotICAgICJ7IiwKLSAgICAiICBNQSAoMSk7IiwKLSAgICAiICBSW25dIC09IDQ7IiwKLSAgICAiICBXTEFUIChSW25dLCBGSShtKSk7IiwKLSAgICAifSIsCi0gIH0sCi0gIC8qIHNoM2UgKi8KLSAgeyAiIiwgIiIsICJmbW92LnMgQChSMCw8UkVHX00+KSw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMTEwIiwKLSAgICAvKiBzaDQgKi8KLSAgICAiaWYgKEZQU0NSX1NaKSB7IiwKLSAgICAiICBNQSAoMik7IiwKLSAgICAiICBSREFUIChSWzBdK1JbbV0sIG4pOyIsCi0gICAgIn0iLAotICAgICJlbHNlIiwKLSAgICAieyIsCi0gICAgIiAgTUEgKDEpOyIsCi0gICAgIiAgU0VUX0ZJKG4sIFJMQVQoUlswXSArIFJbbV0pKTsiLAotICAgICJ9IiwKLSAgfSwKLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZtb3YucyA8RlJFR19NPixAKFIwLDxSRUdfTj4pIiwgIjExMTFubm5ubW1tbTAxMTEiLAotICAgIC8qIHNoNCAqLwotICAgICJpZiAoRlBTQ1JfU1opIHsiLAotICAgICIgIE1BICgyKTsiLAotICAgICIgIFdEQVQgKFJbMF0rUltuXSwgbSk7IiwKLSAgICAifSIsCi0gICAgImVsc2UiLAotICAgICJ7IiwKLSAgICAiICBNQSAoMSk7IiwKLSAgICAiICBXTEFUKChSWzBdK1Jbbl0pLCBGSShtKSk7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgLyogc2g0OiBTZWUgZm1vdiBpbnN0cnVjdGlvbnMgYWJvdmUgZm9yIG1vdmUgdG8vZnJvbSBleHRlbmRlZCBmcCByZWdpc3RlcnMgKi8KLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZm11bCA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMDEwIiwKLSAgICAiRlBfT1AobiwgKiwgbSk7IiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZm5lZyA8RlJFR19OPiIsICIxMTExbm5ubjAxMDAxMTAxIiwKLSAgICAiRlBfVU5BUlkobiwgLSk7IiwKLSAgfSwKLQotICAvKiBzaDQgKi8KLSAgeyAiIiwgIiIsICJmcmNoZyIsICIxMTExMTAxMTExMTExMTAxIiwKLSAgICAiU0VUX0ZQU0NSIChHRVRfRlBTQ1IoKSBeIEZQU0NSX01BU0tfRlIpOyIsCi0gIH0sCi0KLSAgLyogc2g0ICovCi0gIHsgIiIsICIiLCAiZnNjaGciLCAiMTExMTAwMTExMTExMTEwMSIsCi0gICAgIlNFVF9GUFNDUiAoR0VUX0ZQU0NSKCkgXiBGUFNDUl9NQVNLX1NaKTsiLAotICB9LAotCi0gIC8qIHNoM2UgKi8KLSAgeyAiIiwgIiIsICJmc3FydCA8RlJFR19OPiIsICIxMTExbm5ubjAxMTAxMTAxIiwKLSAgICAiRlBfVU5BUlkobiwgc3FydCk7IiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZnN1YiA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMDAxIiwKLSAgICAiRlBfT1AobiwgLSwgbSk7IiwKLSAgfSwKLQotICAvKiBzaDNlICovCi0gIHsgIiIsICIiLCAiZnRyYyA8RlJFR19OPiwgRlBVTCIsICIxMTExbm5ubjAwMTExMTAxIiwKLSAgICAvKiBzaDQgKi8KLSAgICAiaWYgKEZQU0NSX1BSKSB7IiwKLSAgICAiICBpZiAoRFIobikgIT0gRFIobikpIC8qIE5hTiAqLyIsCi0gICAgIiAgICBGUFVMID0gMHg4MDAwMDAwMDsiLAotICAgICIgIGVsc2UiLAotICAgICIgICAgRlBVTCA9ICAoaW50KURSKG4pOyIsCi0gICAgIn0iLAotICAgICJlbHNlIiwKLSAgICAiaWYgKEZSKG4pICE9IEZSKG4pKSAvKiBOYU4gKi8iLAotICAgICIgIEZQVUwgPSAweDgwMDAwMDAwOyIsCi0gICAgImVsc2UiLAotICAgICIgIEZQVUwgPSAoaW50KUZSKG4pOyIsCi0gIH0sCi0KLSAgLyogc2gzZSAqLwotICB7ICIiLCAiIiwgImZzdHMgRlBVTCw8RlJFR19OPiIsICIxMTExbm5ubjAwMDAxMTAxIiwKLSAgICAiICB1bmlvbiIsCi0gICAgIiAgeyIsCi0gICAgIiAgICBpbnQgaTsiLAotICAgICIgICAgZmxvYXQgZjsiLAotICAgICIgIH0gdTsiLAotICAgICIgIHUuaSA9IEZQVUw7IiwKLSAgICAiICBTRVRfRlIgKG4sIHUuZik7IiwKLSAgfSwKLQotICB7ICIiLCAibiIsICJqbXAgQDxSRUdfTj4iLCAiMDEwMG5ubm4wMDEwMTAxMSIsCi0gICAgIlNFVF9OSVAgKFBUMkggKFJbbl0pKTsiLAotICAgICJjeWNsZXMgKz0gMjsiLAotICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCi0gIH0sCi0KLSAgeyAiIiwgIm4iLCAianNyIEA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDEwMTEiLAotICAgICJQUiA9IFBIMlQgKFBDICsgNCk7IiwKLSAgICAiaWYgKH5kb3Byb2ZpbGUpIiwKLSAgICAiICBnb3RjYWxsIChQUiwgUltuXSk7IiwKLSAgICAiU0VUX05JUCAoUFQySCAoUltuXSkpOyIsCi0gICAgImN5Y2xlcyArPSAyOyIsCi0gICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKLSAgfSwKLQotICB7ICIiLCAibiIsICJsZGMgPFJFR19OPiw8Q1JFR19NPiIsICIwMTAwbm5ubm1tbW0xMTEwIiwKLSAgICAiQ1JFRyAobSkgPSBSW25dOyIsCi0gICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAotICB9LAotICB7ICIiLCAibiIsICJsZGMgPFJFR19OPixTUiIsICIwMTAwbm5ubjAwMDAxMTEwIiwKLSAgICAiU0VUX1NSIChSW25dKTsiLAotICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKLSAgfSwKLSAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sTU9EIiwgIjAxMDBubm5uMDEwMTExMTAiLAotICAgICJTRVRfTU9EIChSW25dKTsiLAotICB9LAotI2lmIDAKLSAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sREJSIiwgIjAxMDBubm5uMTExMTEwMTAiLAotICAgICJEQlIgPSBSW25dOyIsCi0gICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAotICB9LAotI2VuZGlmCi0gIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+Kyw8Q1JFR19NPiIsICIwMTAwbm5ubm1tbW0wMTExIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIkNSRUcgKG0pID0gUkxBVCAoUltuXSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAotICB9LAotICB7ICIiLCAibiIsICJsZGMubCBAPFJFR19OPissU1IiLCAiMDEwMG5ubm4wMDAwMDExMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJTRVRfU1IgKFJMQVQgKFJbbl0pKTsiLAotICAgICJSW25dICs9IDQ7IiwKLSAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxNT0QiLCAiMDEwMG5ubm4wMTAxMDExMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJTRVRfTU9EIChSTEFUIChSW25dKSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gIH0sCi0jaWYgMAotICB7ICIiLCAibiIsICJsZGMubCBAPFJFR19OPissREJSIiwgIjAxMDBubm5uMTExMTAxMTAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiREJSID0gUkxBVCAoUltuXSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAotICB9LAotI2VuZGlmCi0KLSAgLyogc2gtZHNwICovCi0gIHsgIiIsICIiLCAibGRyZSBAKDxkaXNwPixQQykiLCAiMTAwMDExMTBpOHAxLi4uLiIsCi0gICAgIlJFID0gU0VYVCAoaSkgKiAyICsgNCArIFBIMlQgKFBDKTsiLAotICB9LAotICB7ICIiLCAiIiwgImxkcnMgQCg8ZGlzcD4sUEMpIiwgIjEwMDAxMTAwaThwMS4uLi4iLAotICAgICJSUyA9IFNFWFQgKGkpICogMiArIDQgKyBQSDJUIChQQyk7IiwKLSAgfSwKLQotICB7ICIiLCAibiIsICJsZHMgPFJFR19OPiw8U1JFR19NPiIsICIwMTAwbm5ubnNzc3MxMDEwIiwKLSAgICAiU1JFRyAobSkgPSBSW25dOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgImxkcy5sIEA8UkVHX04+Kyw8U1JFR19NPiIsICIwMTAwbm5ubnNzc3MwMTEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlNSRUcgKG0pID0gUkxBVChSW25dKTsiLAotICAgICJSW25dICs9IDQ7IiwKLSAgfSwKLSAgLyogc2gzZSAvIHNoLWRzcCAobGRzIDxSRUdfTj4sRFNSKSAqLwotICB7ICIiLCAibiIsICJsZHMgPFJFR19OPixGUFNDUiIsICIwMTAwbm5ubjAxMTAxMDEwIiwKLSAgICAiU0VUX0ZQU0NSKFJbbl0pOyIsCi0gIH0sCi0gIC8qIHNoM2UgLyBzaC1kc3AgKGxkcy5sIEA8UkVHX04+KyxEU1IpICovCi0gIHsgIiIsICJuIiwgImxkcy5sIEA8UkVHX04+KyxGUFNDUiIsICIwMTAwbm5ubjAxMTAwMTEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlNFVF9GUFNDUiAoUkxBVChSW25dKSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJsZHRsYiIsICIwMDAwMDAwMDAwMTExMDAwIiwKLSAgICAiLyogRklYTUU6IFhYWCovIGFib3J0KCk7IiwKLSAgfSwKLQotICB7ICIiLCAibm0iLCAibWFjLmwgQDxSRUdfTT4rLEA8UkVHX04+KyIsICIwMDAwbm5ubm1tbW0xMTExIiwKLSAgICAidHJhcCAoMjU1LFIwLG1lbW9yeSxtYXNrbCxtYXNrdywgZW5kaWFudyk7IiwKLSAgICAiLyogRklYTUU6IG1hYy5sIHN1cHBvcnQgKi8iLAotICB9LAotCi0gIHsgIiIsICJubSIsICJtYWMudyBAPFJFR19NPissQDxSRUdfTj4rIiwgIjAxMDBubm5ubW1tbTExMTEiLAotICAgICJtYWN3KFIwLG1lbW9yeSxuLG0sZW5kaWFudyk7IiwKLSAgfSwKLQotICB7ICJuIiwgIiIsICJtb3YgIzxpbW0+LDxSRUdfTj4iLCAiMTExMG5ubm5pOCoxLi4uLiIsCi0gICAgIlJbbl0gPSBTRVhUKGkpOyIsCi0gIH0sCi0gIHsgIm4iLCAibSIsICJtb3YgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAwMTEiLAotICAgICJSW25dID0gUlttXTsiLAotICB9LAotCi0gIHsgIjAiLCAiIiwgIm1vdi5iIEAoPGRpc3A+LEdCUiksUjAiLCAiMTEwMDAxMDBpOCoxLi4uLiIsCi0gICAgIk1BICgxKTsiLAotICAgICJSMCA9IFJTQkFUIChpICsgR0JSKTsiLAotICAgICJMICgwKTsiLAotICB9LAotICB7ICIwIiwgIm0iLCAibW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAiLCAiMTAwMDAxMDBtbW1taTQqMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJSMCA9IFJTQkFUIChpICsgUlttXSk7IiwKLSAgICAiTCAoMCk7IiwKLSAgfSwKLSAgeyAibiIsICIwbSIsICJtb3YuYiBAKFIwLDxSRUdfTT4pLDxSRUdfTj4iLCAiMDAwMG5ubm5tbW1tMTEwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dID0gUlNCQVQgKFIwICsgUlttXSk7IiwKLSAgICAiTCAobik7IiwKLSAgfSwKLSAgeyAibiIsICJtIiwgIm1vdi5iIEA8UkVHX00+Kyw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAxMDAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSA9IFJTQkFUIChSW21dKTsiLAotICAgICJSW21dICs9IDE7IiwKLSAgICAiTCAobik7IiwKLSAgfSwKLSAgeyAiIiwgIm1uIiwgIm1vdi5iIDxSRUdfTT4sQDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMDAwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJXQkFUIChSW25dLCBSW21dKTsiLAotICB9LAotICB7ICIiLCAiMCIsICJtb3YuYiBSMCxAKDxkaXNwPixHQlIpIiwgIjExMDAwMDAwaTgqMS4uLi4iLAotICAgICJNQSAoMSk7IiwKLSAgICAiV0JBVCAoaSArIEdCUiwgUjApOyIsCi0gIH0sCi0gIHsgIiIsICJtMCIsICJtb3YuYiBSMCxAKDxkaXNwPiw8UkVHX00+KSIsICIxMDAwMDAwMG1tbW1pNCoxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldCQVQgKGkgKyBSW21dLCBSMCk7IiwKLSAgfSwKLSAgeyAiIiwgIm1uMCIsICJtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikiLCAiMDAwMG5ubm5tbW1tMDEwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJXQkFUIChSW25dICsgUjAsIFJbbV0pOyIsCi0gIH0sCi0gIHsgIiIsICJubSIsICJtb3YuYiA8UkVHX00+LEAtPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMTAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gMTsiLAotICAgICJXQkFUIChSW25dLCBSW21dKTsiLAotICB9LAotICB7ICJuIiwgIm0iLCAibW92LmIgQDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0wMDAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gPSBSU0JBVCAoUlttXSk7IiwKLSAgICAiTCAobik7IiwKLSAgfSwKLQotICB7ICIwIiwgIiIsICJtb3YubCBAKDxkaXNwPixHQlIpLFIwIiwgIjExMDAwMTEwaTgqNC4uLi4iLAotICAgICJNQSAoMSk7IiwKLSAgICAiUjAgPSBSTEFUIChpICsgR0JSKTsiLAotICAgICJMICgwKTsiLAotICB9LAotICB7ICJuIiwgIiIsICJtb3YubCBAKDxkaXNwPixQQyksPFJFR19OPiIsICIxMTAxbm5ubmk4cDQuLi4uIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gPSBSTEFUICgoUEgyVCAoUEMpICYgfjMpICsgNCArIGkpOyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIm4iLCAibSIsICJtb3YubCBAKDxkaXNwPiw8UkVHX00+KSw8UkVHX04+IiwgIjAxMDFubm5ubW1tbWk0KjQiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSA9IFJMQVQgKGkgKyBSW21dKTsiLAotICAgICJMIChuKTsiLAotICB9LAotICB7ICJuIiwgIm0wIiwgIm1vdi5sIEAoUjAsPFJFR19NPiksPFJFR19OPiIsICIwMDAwbm5ubm1tbW0xMTEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gPSBSTEFUIChSMCArIFJbbV0pOyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIm5tIiwgIm0iLCAibW92LmwgQDxSRUdfTT4rLDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDExMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dID0gUkxBVCAoUlttXSk7IiwKLSAgICAiUlttXSArPSA0OyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIm4iLCAibSIsICJtb3YubCBAPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAwMTAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSA9IFJMQVQgKFJbbV0pOyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIiIsICIwIiwgIm1vdi5sIFIwLEAoPGRpc3A+LEdCUikiLCAiMTEwMDAwMTBpOCo0Li4uLiIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChpICsgR0JSLCBSMCk7IiwKLSAgfSwKLSAgeyAiIiwgIm5tIiwgIm1vdi5sIDxSRUdfTT4sQCg8ZGlzcD4sPFJFR19OPikiLCAiMDAwMW5ubm5tbW1taTQqNCIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChpICsgUltuXSwgUlttXSk7IiwKLSAgfSwKLSAgeyAiIiwgIm5tMCIsICJtb3YubCA8UkVHX00+LEAoUjAsPFJFR19OPikiLCAiMDAwMG5ubm5tbW1tMDExMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChSMCArIFJbbl0sIFJbbV0pOyIsCi0gIH0sCi0gIHsgIiIsICJubSIsICJtb3YubCA8UkVHX00+LEAtPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMTEwIiwKLSAgICAiTUEgKDEpIDsiLAotICAgICJSW25dIC09IDQ7IiwKLSAgICAiV0xBVCAoUltuXSwgUlttXSk7IiwKLSAgfSwKLSAgeyAiIiwgIm5tIiwgIm1vdi5sIDxSRUdfTT4sQDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMDAxMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChSW25dLCBSW21dKTsiLAotICB9LAotCi0gIHsgIjAiLCAiIiwgIm1vdi53IEAoPGRpc3A+LEdCUiksUjAiLCAiMTEwMDAxMDFpOCoyLi4uLiIsCi0gICAgIk1BICgxKSIsCi0gICAgIjtSMCA9IFJTV0FUIChpICsgR0JSKTsiLAotICAgICJMICgwKTsiLAotICB9LAotICB7ICJuIiwgIiIsICJtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPiIsICIxMDAxbm5ubmk4cDIuLi4uIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gPSBSU1dBVCAoUEgyVCAoUEMgKyA0ICsgaSkpOyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIjAiLCAibSIsICJtb3YudyBAKDxkaXNwPiw8UkVHX00+KSxSMCIsICIxMDAwMDEwMW1tbW1pNCoyIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlIwID0gUlNXQVQgKGkgKyBSW21dKTsiLAotICAgICJMICgwKTsiLAotICB9LAotICB7ICJuIiwgIm0wIiwgIm1vdi53IEAoUjAsPFJFR19NPiksPFJFR19OPiIsICIwMDAwbm5ubm1tbW0xMTAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gPSBSU1dBVCAoUjAgKyBSW21dKTsiLAotICAgICJMIChuKTsiLAotICB9LAotICB7ICJubSIsICJuIiwgIm1vdi53IEA8UkVHX00+Kyw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAxMDEiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSA9IFJTV0FUIChSW21dKTsiLAotICAgICJSW21dICs9IDI7IiwKLSAgICAiTCAobik7IiwKLSAgfSwKLSAgeyAibiIsICJtIiwgIm1vdi53IEA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDAwMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dID0gUlNXQVQgKFJbbV0pOyIsCi0gICAgIkwgKG4pOyIsCi0gIH0sCi0gIHsgIiIsICIwIiwgIm1vdi53IFIwLEAoPGRpc3A+LEdCUikiLCAiMTEwMDAwMDFpOCoyLi4uLiIsCi0gICAgIk1BICgxKTsiLAotICAgICJXV0FUIChpICsgR0JSLCBSMCk7IiwKLSAgfSwKLSAgeyAiIiwgIjBtIiwgIm1vdi53IFIwLEAoPGRpc3A+LDxSRUdfTT4pIiwgIjEwMDAwMDAxbW1tbWk0KjIiLAotICAgICJNQSAoMSk7IiwKLSAgICAiV1dBVCAoaSArIFJbbV0sIFIwKTsiLAotICB9LAotICB7ICIiLCAibTBuIiwgIm1vdi53IDxSRUdfTT4sQChSMCw8UkVHX04+KSIsICIwMDAwbm5ubm1tbW0wMTAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldXQVQgKFIwICsgUltuXSwgUlttXSk7IiwKLSAgfSwKLSAgeyAibiIsICJtbiIsICJtb3YudyA8UkVHX00+LEAtPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMTAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gMjsiLAotICAgICJXV0FUIChSW25dLCBSW21dKTsiLAotICB9LAotICB7ICIiLCAibm0iLCAibW92LncgPFJFR19NPixAPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMDAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldXQVQgKFJbbl0sIFJbbV0pOyIsCi0gIH0sCi0KLSAgeyAiMCIsICIiLCAibW92YSBAKDxkaXNwPixQQyksUjAiLCAiMTEwMDAxMTFpOHA0Li4uLiIsCi0gICAgIlIwID0gKChpICsgNCArIFBIMlQgKFBDKSkgJiB+MHgzKTsiLAotICB9LAotCi0gIHsgIjAiLCAiIiwgIm1vdmNhLmwgQFIwLCA8UkVHX04+IiwgIjAwMDBubm5uMTEwMDAwMTEiLAotICAgICIvKiBGSVhNRTogTm90IGltcGxlbWVudGVkICovIiwKLSAgICAiUkFJU0VfRVhDRVBUSU9OIChTSUdJTEwpOyIsCi0gIH0sCi0KLSAgeyAibiIsICIiLCAibW92dCA8UkVHX04+IiwgIjAwMDBubm5uMDAxMDEwMDEiLAotICAgICJSW25dID0gVDsiLAotICB9LAotCi0gIHsgIiIsICJtbiIsICJtdWwubCA8UkVHX00+LDxSRUdfTj4iLCAiMDAwMG5ubm5tbW1tMDExMSIsCi0gICAgIk1BQ0wgPSAoKGludClSW25dKSAqICgoaW50KVJbbV0pOyIsCi0gIH0sCi0jaWYgMAotICB7ICIiLCAibm0iLCAibXVsLmwgPFJFR19NPiw8UkVHX04+IiwgIjAwMDBubm5ubW1tbTAxMTEiLAotICAgICJNQUNMID0gUltuXSAqIFJbbV07IiwKLSAgfSwKLSNlbmRpZgotCi0gIC8qIG11bHMudyAtIHNlZSBtdWxzICovCi0gIHsgIiIsICJtbiIsICJtdWxzIDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMTExIiwKLSAgICAiTUFDTCA9ICgoaW50KShzaG9ydClSW25dKSAqICgoaW50KShzaG9ydClSW21dKTsiLAotICB9LAotCi0gIC8qIG11bHUudyAtIHNlZSBtdWx1ICovCi0gIHsgIiIsICJtbiIsICJtdWx1IDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMTEwIiwKLSAgICAiTUFDTCA9ICgoKHVuc2lnbmVkIGludCkodW5zaWduZWQgc2hvcnQpUltuXSkiLAotICAgICIgICAgICAgICogKCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIHNob3J0KVJbbV0pKTsiLAotICB9LAotCi0gIHsgIm4iLCAibSIsICJuZWcgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTEwMTEiLAotICAgICJSW25dID0gLSBSW21dOyIsCi0gIH0sCi0KLSAgeyAibiIsICJtIiwgIm5lZ2MgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTEwMTAiLAotICAgICJ1bHQgPSAtVDsiLAotICAgICJTRVRfU1JfVCAodWx0ID4gMCk7IiwKLSAgICAiUltuXSA9IHVsdCAtIFJbbV07IiwKLSAgICAiU0VUX1NSX1QgKFQgfHwgKFJbbl0gPiB1bHQpKTsiLAotICB9LAotCi0gIHsgIiIsICIiLCAibm9wIiwgIjAwMDAwMDAwMDAwMDEwMDEiLAotICAgICIvKiBub3AgKi8iLAotICB9LAotCi0gIHsgIm4iLCAibSIsICJub3QgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAxMTEiLAotICAgICJSW25dID0gflJbbV07IiwKLSAgfSwKLQotICB7ICIwIiwgIiIsICJvY2JpIEA8UkVHX04+IiwgIjAwMDBubm5uMTAwMTAwMTEiLAotICAgICIvKiBGSVhNRTogTm90IGltcGxlbWVudGVkICovIiwKLSAgICAiUkFJU0VfRVhDRVBUSU9OIChTSUdJTEwpOyIsCi0gIH0sCi0KLSAgeyAiMCIsICIiLCAib2NicCBAPFJFR19OPiIsICIwMDAwbm5ubjEwMTAwMDExIiwKLSAgICAiLyogRklYTUU6IE5vdCBpbXBsZW1lbnRlZCAqLyIsCi0gICAgIlJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTsiLAotICB9LAotCi0gIHsgIiIsICJuIiwgIm9jYndiIEA8UkVHX04+IiwgIjAwMDBubm5uMTAxMTAwMTEiLAotICAgICJSU0JBVCAoUltuXSk7IC8qIFRha2UgZXhjZXB0aW9ucyBsaWtlIGJ5dGUgbG9hZC4gICovIiwKLSAgICAiLyogRklYTUU6IENhY2hlIG5vdCBpbXBsZW1lbnRlZCAqLyIsCi0gIH0sCi0KLSAgeyAiMCIsICIiLCAib3IgIzxpbW0+LFIwIiwgIjExMDAxMDExaTgqMS4uLi4iLAotICAgICJSMCB8PSBpOyIsCi0gIH0sCi0gIHsgIm4iLCAibSIsICJvciA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMTAxMSIsCi0gICAgIlJbbl0gfD0gUlttXTsiLAotICB9LAotICB7ICIiLCAiMCIsICJvci5iICM8aW1tPixAKFIwLEdCUikiLCAiMTEwMDExMTFpOCoxLi4uLiIsCi0gICAgIk1BICgxKTsiLAotICAgICJXQkFUIChSMCArIEdCUiwgKFJCQVQgKFIwICsgR0JSKSB8IGkpKTsiLAotICB9LAotCi0gIHsgIiIsICJuIiwgInByZWYgQDxSRUdfTj4iLCAiMDAwMG5ubm4xMDAwMDAxMSIsCi0gICAgIi8qIEV4Y2VwdCBmb3IgdGhlIGVmZmVjdCBvbiB0aGUgY2FjaGUgLSB3aGljaCBpcyBub3Qgc2ltdWxhdGVkIC0iLAotICAgICIgICB0aGlzIGlzIGxpa2UgYSBub3AuICAqLyIsCi0gIH0sCi0KLSAgeyAibiIsICJuIiwgInJvdGNsIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDEwMDEwMCIsCi0gICAgInVsdCA9IFJbbl0gPCAwOyIsCi0gICAgIlJbbl0gPSAoUltuXSA8PCAxKSB8IFQ7IiwKLSAgICAiU0VUX1NSX1QgKHVsdCk7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAicm90Y3IgPFJFR19OPiIsICIwMTAwbm5ubjAwMTAwMTAxIiwKLSAgICAidWx0ID0gUltuXSAmIDE7IiwKLSAgICAiUltuXSA9IChVUltuXSA+PiAxKSB8IChUIDw8IDMxKTsiLAotICAgICJTRVRfU1JfVCAodWx0KTsiLAotICB9LAotCi0gIHsgIm4iLCAibiIsICJyb3RsIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAwMDEwMCIsCi0gICAgIlNFVF9TUl9UIChSW25dIDwgMCk7IiwKLSAgICAiUltuXSA8PD0gMTsiLAotICAgICJSW25dIHw9IFQ7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAicm90ciA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDAxMDEiLAotICAgICJTRVRfU1JfVCAoUltuXSAmIDEpOyIsCi0gICAgIlJbbl0gPSBVUltuXSA+PiAxOyIsCi0gICAgIlJbbl0gfD0gKFQgPDwgMzEpOyIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJydGUiLCAiMDAwMDAwMDAwMDEwMTAxMSIsIAotI2lmIDAKLSAgICAvKiBTSC1bMTJdICovCi0gICAgImludCB0bXAgPSBQQzsiLAotICAgICJTRVRfTklQIChQVDJIIChSTEFUIChSWzE1XSkgKyAyKSk7IiwKLSAgICAiUlsxNV0gKz0gNDsiLAotICAgICJTRVRfU1IgKFJMQVQgKFJbMTVdKSAmIDB4M2YzKTsiLAotICAgICJSWzE1XSArPSA0OyIsCi0gICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKLSNlbHNlCi0gICAgIlNFVF9TUiAoU1NSKTsiLAotICAgICJTRVRfTklQIChQVDJIIChTUEMpKTsiLAotICAgICJjeWNsZXMgKz0gMjsiLAotICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCi0jZW5kaWYKLSAgfSwKLQotICB7ICIiLCAiIiwgInJ0cyIsICIwMDAwMDAwMDAwMDAxMDExIiwKLSAgICAiU0VUX05JUCAoUFQySCAoUFIpKTsiLAotICAgICJjeWNsZXMgKz0gMjsiLAotICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCi0gIH0sCi0KLSAgLyogc2gtZHNwICovCi0gIHsgIiIsICJuIiwgInNldHJjIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMDEwMCIsCi0gICAgIlNFVF9SQyAoUltuXSk7IiwKLSAgfSwKLSAgeyAiIiwgIm4iLCAic2V0cmMgIzxpbW0+IiwgIjEwMDAwMDEwaTgqMS4uLi4iLAotICAgIC8qIEl0IHdvdWxkIGJlIG1vcmUgcmVhbGlzdGljIHRvIGxldCBsb29wX3N0YXJ0IHBvaW50IHRvIHNvbWUgc3RhdGljCi0gICAgICAgbWVtb3J5IHRoYXQgY29udGFpbnMgYW4gaWxsZWdhbCBvcGNvZGUgYW5kIHRoZW4gZ2l2ZSBhIGJ1cyBlcnJvciB3aGVuCi0gICAgICAgdGhlIGxvb3AgaXMgZXZlbnR1YWxseSBlbmNvdW50ZXJlZCwgYnV0IGl0IHNlZW1zIG5vdCBvbmx5IHNpbXBsZXIsCi0gICAgICAgYnV0IGFsc28gbW9yZSBkZWJ1Z2dpbmctZnJpZW5kbHkgdG8ganVzdCBjYXRjaCB0aGUgZmFpbHVyZSBoZXJlLiAgKi8KLSAgICAiaWYgKEJVU0VSUk9SIChSUyB8IFJFLCBtYXNrdykpIiwKLSAgICAiICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IiwKLSAgICAiZWxzZSB7IiwKLSAgICAiICBTRVRfUkMgKGkpOyIsCi0gICAgIiAgbG9vcCA9IGdldF9sb29wX2JvdW5kcyAoUlMsIFJFLCBtZW1vcnksIG1lbV9lbmQsIG1hc2t3LCBlbmRpYW53KTsiLAotICAgICIgIENIRUNLX0lOU05fUFRSIChpbnNuX3B0cik7IiwKLSAgICAifSIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJzZXRzIiwgIjAwMDAwMDAwMDEwMTEwMDAiLAotICAgICJTRVRfU1JfUyAoMSk7IiwKLSAgfSwKLQotICB7ICIiLCAiIiwgInNldHQiLCAiMDAwMDAwMDAwMDAxMTAwMCIsCi0gICAgIlNFVF9TUl9UICgxKTsiLAotICB9LAotCi0gIHsgIm4iLCAibW4iLCAic2hhZCA8UkVHX00+LDxSRUdfTj4iLCAiMDEwMG5ubm5tbW1tMTEwMCIsCi0gICAgIlJbbl0gPSAoUlttXSA8IDApID8gKFJbbl0gPj4gKCgtUlttXSkmMHgxZikpIDogKFJbbl0gPDwgKFJbbV0gJiAweDFmKSk7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAic2hhbCA8UkVHX04+IiwgIjAxMDBubm5uMDAxMDAwMDAiLAotICAgICJTRVRfU1JfVCAoUltuXSA8IDApOyIsCi0gICAgIlJbbl0gPDw9IDE7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAic2hhciA8UkVHX04+IiwgIjAxMDBubm5uMDAxMDAwMDEiLAotICAgICJTRVRfU1JfVCAoUltuXSAmIDEpOyIsCi0gICAgIlJbbl0gPSBSW25dID4+IDE7IiwKLSAgfSwKLQotICB7ICJuIiwgIm1uIiwgInNobGQgPFJFR19NPiw8UkVHX04+IiwgIjAxMDBubm5ubW1tbTExMDEiLAotICAgICJSW25dID0gKFJbbV0gPCAwKSA/IChVUltuXSA+PiAoKC1SW21dKSYweDFmKSk6IChSW25dIDw8IChSW21dICYgMHgxZikpOyIsCi0gIH0sCi0KLSAgeyAibiIsICJuIiwgInNobGwgPFJFR19OPiIsICIwMTAwbm5ubjAwMDAwMDAwIiwKLSAgICAiU0VUX1NSX1QgKFJbbl0gPCAwKTsiLAotICAgICJSW25dIDw8PSAxOyIsCi0gIH0sCi0KLSAgeyAibiIsICJuIiwgInNobGwyIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAwMTAwMCIsCi0gICAgIlJbbl0gPDw9IDI7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgInNobGw4IDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMTAwMCIsCi0gICAgIlJbbl0gPDw9IDg7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgInNobGwxNiA8UkVHX04+IiwgIjAxMDBubm5uMDAxMDEwMDAiLAotICAgICJSW25dIDw8PSAxNjsiLAotICB9LAotCi0gIHsgIm4iLCAibiIsICJzaGxyIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAwMDAwMSIsCi0gICAgIlNFVF9TUl9UIChSW25dICYgMSk7IiwKLSAgICAiUltuXSA9IFVSW25dID4+IDE7IiwKLSAgfSwKLQotICB7ICJuIiwgIm4iLCAic2hscjIgPFJFR19OPiIsICIwMTAwbm5ubjAwMDAxMDAxIiwKLSAgICAiUltuXSA9IFVSW25dID4+IDI7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgInNobHI4IDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMTAwMSIsCi0gICAgIlJbbl0gPSBVUltuXSA+PiA4OyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJzaGxyMTYgPFJFR19OPiIsICIwMTAwbm5ubjAwMTAxMDAxIiwKLSAgICAiUltuXSA9IFVSW25dID4+IDE2OyIsCi0gIH0sCi0KLSAgeyAiIiwgIiIsICJzbGVlcCIsICIwMDAwMDAwMDAwMDExMDExIiwKLSAgICAibmlwID0gUEM7IiwKLSAgICAidHJhcCAoMHhjMywgUjAsIG1lbW9yeSwgbWFza2wsIG1hc2t3LCBlbmRpYW53KTsiLAotICB9LAotCi0gIHsgIm4iLCAiIiwgInN0YyA8Q1JFR19NPiw8UkVHX04+IiwgIjAwMDBubm5ubW1tbTAwMTAiLAotICAgICJSW25dID0gQ1JFRyAobSk7IiwKLSAgfSwKLQotI2lmIDAKLSAgeyAibiIsICIiLCAic3RjIFNHUiw8UkVHX04+IiwgIjAwMDBubm5uMDAxMTEwMTAiLAotICAgICJSW25dID0gU0dSOyIsCi0gIH0sCi0gIHsgIm4iLCAiIiwgInN0YyBEQlIsPFJFR19OPiIsICIwMDAwbm5ubjExMTExMDEwIiwKLSAgICAiUltuXSA9IERCUjsiLAotICB9LAotI2VuZGlmCi0gIHsgIm4iLCAibiIsICJzdGMubCA8Q1JFR19NPixALTxSRUdfTj4iLCAiMDEwMG5ubm5tbW1tMDAxMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dIC09IDQ7IiwKLSAgICAiV0xBVCAoUltuXSwgQ1JFRyAobSkpOyIsCi0gIH0sCi0jaWYgMAotICB7ICJuIiwgIm4iLCAic3RjLmwgU0dSLEAtPFJFR19OPiIsICIwMTAwbm5ubjAwMTEwMDEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gNDsiLAotICAgICJXTEFUIChSW25dLCBTR1IpOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJzdGMubCBEQlIsQC08UkVHX04+IiwgIjAxMDBubm5uMTExMTAwMTAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSAtPSA0OyIsCi0gICAgIldMQVQgKFJbbl0sIERCUik7IiwKLSAgfSwKLSNlbmRpZgotCi0gIHsgIm4iLCAiIiwgInN0cyA8U1JFR19NPiw8UkVHX04+IiwgIjAwMDBubm5uc3NzczEwMTAiLAotICAgICJSW25dID0gU1JFRyAobSk7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgInN0cy5sIDxTUkVHX00+LEAtPFJFR19OPiIsICIwMTAwbm5ubnNzc3MwMDEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gNDsiLAotICAgICJXTEFUIChSW25dLCBTUkVHIChtKSk7IiwKLSAgfSwKLQotICB7ICJuIiwgIm5tIiwgInN1YiA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTAwMCIsCi0gICAgIlJbbl0gLT0gUlttXTsiLAotICB9LAotCi0gIHsgIm4iLCAibm0iLCAic3ViYyA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTAxMCIsCi0gICAgInVsdCA9IFJbbl0gLSBUOyIsCi0gICAgIlNFVF9TUl9UICh1bHQgPiBSW25dKTsiLAotICAgICJSW25dID0gdWx0IC0gUlttXTsiLAotICAgICJTRVRfU1JfVCAoVCB8fCAoUltuXSA+IHVsdCkpOyIsCi0gIH0sCi0KLSAgeyAibiIsICJubSIsICJzdWJ2IDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMDExIiwKLSAgICAidWx0ID0gUltuXSAtIFJbbV07IiwKLSAgICAiU0VUX1NSX1QgKCgoUltuXSBeIFJbbV0pICYgKHVsdCBeIFJbbl0pKSA+PiAzMSk7IiwKLSAgICAiUltuXSA9IHVsdDsiLAotICB9LAotCi0gIHsgIm4iLCAibm0iLCAic3dhcC5iIDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0xMDAwIiwKLSAgICAiUltuXSA9ICgoUlttXSAmIDB4ZmZmZjAwMDApIiwKLSAgICAiICAgICAgICB8ICgoUlttXSA8PCA4KSAmIDB4ZmYwMCkiLAotICAgICIgICAgICAgIHwgKChSW21dID4+IDgpICYgMHgwMGZmKSk7IiwKLSAgfSwKLSAgeyAibiIsICJubSIsICJzd2FwLncgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTEwMDEiLAotICAgICJSW25dID0gKCgoUlttXSA8PCAxNikgJiAweGZmZmYwMDAwKSIsCi0gICAgIiAgICAgICAgfCAoKFJbbV0gPj4gMTYpICYgMHgwMGZmZmYpKTsiLAotICB9LAotCi0gIHsgIiIsICJuIiwgInRhcy5iIEA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTEwMTEiLAotICAgICJNQSAoMSk7IiwKLSAgICAidWx0ID0gUkJBVChSW25dKTsiLAotICAgICJTRVRfU1JfVCAodWx0ID09IDApOyIsCi0gICAgIldCQVQoUltuXSx1bHR8MHg4MCk7IiwKLSAgfSwKLQotICB7ICIwIiwgIiIsICJ0cmFwYSAjPGltbT4iLCAiMTEwMDAwMTFpOCoxLi4uLiIsIAotI2lmIDAKLSAgICAvKiBTSC1bMTJdICovCi0gICAgImxvbmcgaW1tID0gMHhmZiAmIGk7IiwKLSAgICAiaWYgKGk9PTB4YzMpIiwKLSAgICAiICBQQy09MjsiLAotICAgICJpZiAoaTwyMHx8aT09MzR8fGk9PTB4YzMpIiwKLSAgICAiICB0cmFwKGksUixtZW1vcnksbWFza2wsbWFza3csZW5kaWFudyk7IiwKLSAgICAiZWxzZSB7IiwKLSAgICAiICBSWzE1XS09NDsiLAotICAgICIgIFdMQVQoUlsxNV0sR0VUX1NSKCkpOyIsCi0gICAgIiAgUlsxNV0tPTQ7IiwKLSAgICAiICBXTEFUKFJbMTVdLFBDKzIpOyIsCi0gICAgIiAgUEM9UkxBVChWQlIrKGltbTw8MikpLTI7IiwKLSAgICAifSIsCi0jZWxzZQotICAgICJpZiAoaSA9PSAweGMzKSIsCi0gICAgIiAgeyIsCi0gICAgIiAgICBuaXAgPSBQQzsiLAotICAgICIgICAgdHJhcCAoaSwgUiwgbWVtb3J5LCBtYXNrbCwgbWFza3csZW5kaWFudyk7IiwKLSAgICAiICB9IiwKLSAgICAiZWxzZSBpZiAoaSA8IDIwIHx8IGk9PTM0IHx8IGk9PTB4YzMpIiwKLSAgICAiICB0cmFwIChpLCBSLCBtZW1vcnksIG1hc2tsLCBtYXNrdyxlbmRpYW53KTsiLAotICAgICJlbHNlIGlmICghU1JfQkwpIHsiLAotICAgICIgIC8qIEZJWE1FOiBUUkEgPSAoaW1tIDw8IDIpOyAqLyIsCi0gICAgIiAgU1NSID0gR0VUX1NSKCk7IiwKLSAgICAiICBTUEMgPSBQSDJUIChQQyArIDIpOyIsCi0gICAgIiAgU0VUX1NSIChHRVRfU1IoKSB8IFNSX01BU0tfTUQgfCBTUl9NQVNLX0JMIHwgU1JfTUFTS19SQik7IiwKLSAgICAiICAvKiBGSVhNRTogRVhQRVZUID0gMHgwMDAwMDE2MDsgKi8iLAotICAgICIgIFNFVF9OSVAgKFBUMkggKFZCUiArIDB4MDAwMDAxMDApKTsiLAotICAgICJ9IiwKLSNlbmRpZgotICB9LAotCi0gIHsgIiIsICJtbiIsICJ0c3QgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTEwMDAiLAotICAgICJTRVRfU1JfVCAoKFJbbl0gJiBSW21dKSA9PSAwKTsiLAotICB9LAotICB7ICIiLCAiMCIsICJ0c3QgIzxpbW0+LFIwIiwgIjExMDAxMDAwaTgqMS4uLi4iLAotICAgICJTRVRfU1JfVCAoKFIwICYgaSkgPT0gMCk7IiwKLSAgfSwKLSAgeyAiIiwgIjAiLCAidHN0LmIgIzxpbW0+LEAoUjAsR0JSKSIsICIxMTAwMTEwMGk4KjEuLi4uIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlNFVF9TUl9UICgoUkJBVCAoR0JSK1IwKSAmIGkpID09IDApOyIsCi0gIH0sCi0KLSAgeyAiIiwgIjAiLCAieG9yICM8aW1tPixSMCIsICIxMTAwMTAxMGk4KjEuLi4uIiwKLSAgICAiUjAgXj0gaTsiLAotICB9LAotICB7ICJuIiwgIm1uIiwgInhvciA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMTAxMCIsCi0gICAgIlJbbl0gXj0gUlttXTsiLAotICB9LAotICB7ICIiLCAiMCIsICJ4b3IuYiAjPGltbT4sQChSMCxHQlIpIiwgIjExMDAxMTEwaTgqMS4uLi4iLAotICAgICJNQSAoMSk7IiwKLSAgICAidWx0ID0gUkJBVCAoR0JSK1IwKTsiLAotICAgICJ1bHQgXj0gaTsiLAotICAgICJXQkFUIChHQlIgKyBSMCwgdWx0KTsiLAotICB9LAotCi0gIHsgIm4iLCAibm0iLCAieHRyY3QgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTExMDEiLAotICAgICJSW25dID0gKCgoUltuXSA+PiAxNikgJiAweGZmZmYpIiwKLSAgICAiICAgICAgICB8ICgoUlttXSA8PCAxNikgJiAweGZmZmYwMDAwKSk7IiwKLSAgfSwKLQotI2lmIDAKLSAgeyAiZGl2cy5sIDxSRUdfTT4sPFJFR19OPiIsICIwMTAwbm5ubm1tbW0xMTEwIiwKLSAgICAiZGl2bCgwLFJbbl0sUlttXSk7IiwKLSAgfSwKLSAgeyAiZGl2dS5sIDxSRUdfTT4sPFJFR19OPiIsICIwMTAwbm5ubm1tbW0xMTAxIiwKLSAgICAiZGl2bCgwLFJbbl0sUlttXSk7IiwKLSAgfSwKLSNlbmRpZgotCi0gIHswLCAwfX07Ci0KLW9wIG1vdnN4eV90YWJbXSA9Ci17Ci0vKiBJZiB0aGlzIGlzIGRpc2FibGVkLCB0aGUgc2ltdWxhdG9yIHNwZWVkcyB1cCBieSBhYm91dCAxMiUgb24gYQotICAgNDUwIE1IeiBQSUlJIC0gOSUgd2l0aCBBQ0VfRkFTVC4KLSAgIE1heWJlIHdlIHNob3VsZCBoYXZlIHNlcGFyYXRlIHNpbXVsYXRvciBsb29wcz8gICovCi0jaWYgMQotICB7ICJuIiwgIm4iLCAibW92cy53IEAtPFJFR19OPiw8RFNQX1JFR19NPiIsICIxMTExMDFOTk1NTU0wMDAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gMjsiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgICAiRFNQX0dSRCAobSkgPSBTSUdOMzIgKERTUF9SIChtKSk7IiwKLSAgfSwKLSAgeyAiIiwgIm4iLCAgIm1vdnMudyBAPFJFR19OPiw8RFNQX1JFR19NPiIsICAiMTExMTAxTk5NTU1NMDEwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgICAiRFNQX0dSRCAobSkgPSBTSUdOMzIgKERTUF9SIChtKSk7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdnMudyBAPFJFR19OPissPERTUF9SRUdfTT4iLCAiMTExMTAxTk5NTU1NMTAwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgICAiRFNQX0dSRCAobSkgPSBTSUdOMzIgKERTUF9SIChtKSk7IiwKLSAgICAiUltuXSArPSAyOyIsCi0gIH0sCi0gIHsgIm4iLCAibjgiLCJtb3ZzLncgQDxSRUdfTj4rUkVHXzgsPERTUF9SRUdfTT4iLCAiMTExMTAxTk5NTU1NMTEwMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgICAiRFNQX0dSRCAobSkgPSBTSUdOMzIgKERTUF9SIChtKSk7IiwKLSAgICAiUltuXSArPSBSWzhdOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJtb3ZzLncgQC08UkVHX04+LDxEU1BfR1JEX00+IiwgIjExMTEwMU5OR0dHRzAwMDAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSAtPSAyOyIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKTsiLAotICB9LAotICB7ICIiLCAibiIsICAibW92cy53IEA8UkVHX04+LDxEU1BfR1JEX00+IiwgICIxMTExMDFOTkdHR0cwMTAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKTsiLAotICB9LAotICB7ICJuIiwgIm4iLCAibW92cy53IEA8UkVHX04+Kyw8RFNQX0dSRF9NPiIsICIxMTExMDFOTkdHR0cxMDAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKTsiLAotICAgICJSW25dICs9IDI7IiwKLSAgfSwKLSAgeyAibiIsICJuOCIsIm1vdnMudyBAPFJFR19OPitSRUdfOCw8RFNQX0dSRF9NPiIsICIxMTExMDFOTkdHR0cxMTAwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKTsiLAotICAgICJSW25dICs9IFJbOF07IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIjxEU1BfUkVHX00+LG1vdnMudyBALTxSRUdfTj4iLCAiMTExMTAxTk5NTU1NMDAwMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dIC09IDI7IiwKLSAgICAiV1dBVCAoUltuXSwgRFNQX1IgKG0pID4+IDE2KTsiLAotICB9LAotICB7ICIiLCAibiIsICAibW92cy53IDxEU1BfUkVHX00+LEA8UkVHX04+IiwgICIxMTExMDFOTk1NTU0wMTAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldXQVQgKFJbbl0sIERTUF9SIChtKSA+PiAxNik7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdnMudyA8RFNQX1JFR19NPixAPFJFR19OPisiLCAiMTExMTAxTk5NTU1NMTAwMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJXV0FUIChSW25dLCBEU1BfUiAobSkgPj4gMTYpOyIsCi0gICAgIlJbbl0gKz0gMjsiLAotICB9LAotICB7ICJuIiwgIm44IiwibW92cy53IDxEU1BfUkVHX00+LEA8UkVHX04+K1JFR184IiwgIjExMTEwMU5OTU1NTTExMDEiLAotICAgICJNQSAoMSk7IiwKLSAgICAiV1dBVCAoUltuXSwgRFNQX1IgKG0pID4+IDE2KTsiLAotICAgICJSW25dICs9IFJbOF07IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdnMudyA8RFNQX0dSRF9NPixALTxSRUdfTj4iLCAiMTExMTAxTk5HR0dHMDAwMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJSW25dIC09IDI7IiwKLSAgICAiV1dBVCAoUltuXSwgU0VYVCAoRFNQX1IgKG0pKSk7IiwKLSAgfSwKLSAgeyAiIiwgIm4iLCAgIm1vdnMudyA8RFNQX0dSRF9NPixAPFJFR19OPiIsICAiMTExMTAxTk5HR0dHMDEwMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJXV0FUIChSW25dLCBTRVhUIChEU1BfUiAobSkpKTsiLAotICB9LAotICB7ICJuIiwgIm4iLCAibW92cy53IDxEU1BfR1JEX00+LEA8UkVHX04+KyIsICIxMTExMDFOTkdHR0cxMDAxIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldXQVQgKFJbbl0sIFNFWFQgKERTUF9SIChtKSkpOyIsCi0gICAgIlJbbl0gKz0gMjsiLAotICB9LAotICB7ICJuIiwgIm44IiwibW92cy53IDxEU1BfR1JEX00+LEA8UkVHX04+K1JFR184IiwgIjExMTEwMU5OR0dHRzExMDEiLAotICAgICJNQSAoMSk7IiwKLSAgICAiV1dBVCAoUltuXSwgU0VYVCAoRFNQX1IgKG0pKSk7IiwKLSAgICAiUltuXSArPSBSWzhdOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJtb3ZzLmwgQC08UkVHX04+LDxEU1BfUkVHX00+IiwgIjExMTEwMU5OTU1NTTAwMTAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiUltuXSAtPSA0OyIsCi0gICAgIkRTUF9SIChtKSA9IFJMQVQgKFJbbl0pOyIsCi0gICAgIkRTUF9HUkQgKG0pID0gU0lHTjMyIChEU1BfUiAobSkpOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgICJtb3ZzLmwgQDxSRUdfTj4sPERTUF9SRUdfTT4iLCAgIjExMTEwMU5OTU1NTTAxMTAiLAotICAgICJNQSAoMSk7IiwKLSAgICAiRFNQX1IgKG0pID0gUkxBVCAoUltuXSk7IiwKLSAgICAiRFNQX0dSRCAobSkgPSBTSUdOMzIgKERTUF9SIChtKSk7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdnMubCBAPFJFR19OPissPERTUF9SRUdfTT4iLCAiMTExMTAxTk5NTU1NMTAxMCIsCi0gICAgIk1BICgxKTsiLAotICAgICJEU1BfUiAobSkgPSBSTEFUIChSW25dKTsiLAotICAgICJEU1BfR1JEIChtKSA9IFNJR04zMiAoRFNQX1IgKG0pKTsiLAotICAgICJSW25dICs9IDQ7IiwKLSAgfSwKLSAgeyAibiIsICJuOCIsIm1vdnMubCBAPFJFR19OPitSRUdfOCw8RFNQX1JFR19NPiIsICIxMTExMDFOTk1NTU0xMTEwIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIkRTUF9SIChtKSA9IFJMQVQgKFJbbl0pOyIsCi0gICAgIkRTUF9HUkQgKG0pID0gU0lHTjMyIChEU1BfUiAobSkpOyIsCi0gICAgIlJbbl0gKz0gUls4XTsiLAotICB9LAotICB7ICJuIiwgIm4iLCAiPERTUF9SRUdfTT4sbW92cy5sIEAtPFJFR19OPiIsICIxMTExMDFOTk1NTU0wMDExIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gNDsiLAotICAgICJXTEFUIChSW25dLCBEU1BfUiAobSkpOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgICJtb3ZzLmwgPERTUF9SRUdfTT4sQDxSRUdfTj4iLCAgIjExMTEwMU5OTU1NTTAxMTEiLAotICAgICJNQSAoMSk7IiwKLSAgICAiV0xBVCAoUltuXSwgRFNQX1IgKG0pKTsiLAotICB9LAotICB7ICJuIiwgIm4iLCAibW92cy5sIDxEU1BfUkVHX00+LEA8UkVHX04+KyIsICIxMTExMDFOTk1NTU0xMDExIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldMQVQgKFJbbl0sIERTUF9SIChtKSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gIH0sCi0gIHsgIm4iLCAibjgiLCJtb3ZzLmwgPERTUF9SRUdfTT4sQDxSRUdfTj4rUkVHXzgiLCAiMTExMTAxTk5NTU1NMTExMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChSW25dLCBEU1BfUiAobSkpOyIsCi0gICAgIlJbbl0gKz0gUls4XTsiLAotICB9LAotICB7ICJuIiwgIm4iLCAiPERTUF9HUkRfTT4sbW92cy5sIEAtPFJFR19OPiIsICIxMTExMDFOTkdHR0cwMDExIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIlJbbl0gLT0gNDsiLAotICAgICJXTEFUIChSW25dLCBTRVhUIChEU1BfUiAobSkpKTsiLAotICB9LAotICB7ICIiLCAibiIsICAibW92cy5sIDxEU1BfR1JEX00+LEA8UkVHX04+IiwgICIxMTExMDFOTkdHR0cwMTExIiwKLSAgICAiTUEgKDEpOyIsCi0gICAgIldMQVQgKFJbbl0sIFNFWFQgKERTUF9SIChtKSkpOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJtb3ZzLmwgPERTUF9HUkRfTT4sQDxSRUdfTj4rIiwgIjExMTEwMU5OR0dHRzEwMTEiLAotICAgICJNQSAoMSk7IiwKLSAgICAiV0xBVCAoUltuXSwgU0VYVCAoRFNQX1IgKG0pKSk7IiwKLSAgICAiUltuXSArPSA0OyIsCi0gIH0sCi0gIHsgIm4iLCAibjgiLCJtb3ZzLmwgPERTUF9HUkRfTT4sQDxSRUdfTj4rUkVHXzgiLCAiMTExMTAxTk5HR0dHMTExMSIsCi0gICAgIk1BICgxKTsiLAotICAgICJXTEFUIChSW25dLCBTRVhUIChEU1BfUiAobSkpKTsiLAotICAgICJSW25dICs9IFJbOF07IiwKLSAgfSwKLSAgeyAiIiwgIm4iLCAibW92eC53IEA8UkVHX3g+LDxEU1BfWFg+IiwgICAiMTExMTAweHhYWDAwMDEwMCIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKSA8PCAxNjsiLAotICAgICJpd29yZCAmPSAweGZkNTM7IGdvdG8gdG9wOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJtb3Z4LncgQDxSRUdfeD4rLDxEU1BfWFg+IiwgIjExMTEwMHh4WFgwMDEwMDAiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgICAiUltuXSArPSAoKFJbbl0gJiAweGZmZmYpID09IE1PRF9NRSkgPyBNT0RfREVMVEEgOiAyOyIsCi0gICAgIml3b3JkICY9IDB4ZmQ1MzsgZ290byB0b3A7IiwKLSAgfSwKLSAgeyAibiIsICJuOCIsIm1vdngudyBAPFJFR194PitSRUdfOCw8RFNQX1hYPiIsICIxMTExMDB4eFhYMDAxMDAwIiwKLSAgICAiRFNQX1IgKG0pID0gUlNXQVQgKFJbbl0pIDw8IDE2OyIsCi0gICAgIlJbbl0gKz0gKChSW25dICYgMHhmZmZmKSA9PSBNT0RfTUUpID8gTU9EX0RFTFRBIDogUls4XTsiLAotICAgICJpd29yZCAmPSAweGZkNTM7IGdvdG8gdG9wOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgIm1vdngudyA8RFNQX0FhPixAPFJFR194PiIsICAgIjExMTEwMHh4YWExMDAxMDAiLAotICAgICJXV0FUIChSW25dLCBEU1BfUiAobSkgPj4gMTYpOyIsCi0gICAgIml3b3JkICY9IDB4ZmQ1MzsgZ290byB0b3A7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdngudyA8RFNQX0FhPixAPFJFR194PisiLCAiMTExMTAweHhhYTEwMTAwMCIsCi0gICAgIldXQVQgKFJbbl0sIERTUF9SIChtKSA+PiAxNik7IiwKLSAgICAiUltuXSArPSAoKFJbbl0gJiAweGZmZmYpID09IE1PRF9NRSkgPyBNT0RfREVMVEEgOiAyOyIsCi0gICAgIml3b3JkICY9IDB4ZmQ1MzsgZ290byB0b3A7IiwKLSAgfSwKLSAgeyAibiIsICJuOCIsIm1vdngudyA8RFNQX0FhPixAPFJFR194PitSRUdfOCIsIjExMTEwMHh4YWExMDEwMDAiLAotICAgICJXV0FUIChSW25dLCBEU1BfUiAobSkgPj4gMTYpOyIsCi0gICAgIlJbbl0gKz0gKChSW25dICYgMHhmZmZmKSA9PSBNT0RfTUUpID8gTU9EX0RFTFRBIDogUls4XTsiLAotICAgICJpd29yZCAmPSAweGZkNTM7IGdvdG8gdG9wOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgIm1vdnkudyBAPFJFR195Piw8RFNQX1lZPiIsICAgIjExMTEwMHl5WVkwMDAwMDEiLAotICAgICJEU1BfUiAobSkgPSBSU1dBVCAoUltuXSkgPDwgMTY7IiwKLSAgfSwKLSAgeyAibiIsICJuIiwgIm1vdnkudyBAPFJFR194PissPERTUF9ZWT4iLCAiMTExMTAweXlZWTAwMDAxMCIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKSA8PCAxNjsiLAotICAgICJSW25dICs9ICgoUltuXSB8IH4weGZmZmYpID09IE1PRF9NRSkgPyBNT0RfREVMVEEgOiAyOyIsCi0gIH0sCi0gIHsgIm4iLCAibjkiLCJtb3Z5LncgQDxSRUdfeD4rUkVHXzksPERTUF9ZWT4iLCAiMTExMTAweXlZWTAwMDAxMCIsCi0gICAgIkRTUF9SIChtKSA9IFJTV0FUIChSW25dKSA8PCAxNjsiLAotICAgICJSW25dICs9ICgoUltuXSB8IH4weGZmZmYpID09IE1PRF9NRSkgPyBNT0RfREVMVEEgOiBSWzldOyIsCi0gIH0sCi0gIHsgIiIsICJuIiwgIm1vdnkudyA8RFNQX0FhPixAPFJFR194PiIsICAgIjExMTEwMHl5QUEwMTAwMDEiLAotICAgICJXV0FUIChSW25dLCBEU1BfUiAobSkgPj4gMTYpOyIsCi0gIH0sCi0gIHsgIm4iLCAibiIsICJtb3Z5LncgPERTUF9BYT4sQDxSRUdfeD4rIiwgIjExMTEwMHl5QUEwMTAwMTAiLAotICAgICJXV0FUIChSW25dLCBEU1BfUiAobSkgPj4gMTYpOyIsCi0gICAgIlJbbl0gKz0gKChSW25dIHwgfjB4ZmZmZikgPT0gTU9EX01FKSA/IE1PRF9ERUxUQSA6IDI7IiwKLSAgfSwKLSAgeyAibiIsICJuOSIsICJtb3Z5LncgPERTUF9BYT4sQDxSRUdfeD4rUkVHXzkiLCAiMTExMTAweXlBQTAxMDAxMCIsCi0gICAgIldXQVQgKFJbbl0sIERTUF9SIChtKSA+PiAxNik7IiwKLSAgICAiUltuXSArPSAoKFJbbl0gfCB+MHhmZmZmKSA9PSBNT0RfTUUpID8gTU9EX0RFTFRBIDogUls5XTsiLAotICB9LAotICB7ICIiLCAiIiwgIm5vcHggbm9weSIsICIxMTExMDAwMDAwMDAwMDAwIiwKLSAgICAiLyogbm9wICovIiwKLSAgfSwKLSAgeyAiIiwgIiIsICJwcGkiLCAiMTExMTEwMDAwMDAwMDAwMCIsCi0gICAgInBwaV9pbnNuIChSSUFUIChuaXApKTsiLAotICAgICJuaXAgKz0gMjsiLAotICAgICJpd29yZCAmPSAweGY3ZmY7IGdvdG8gdG9wOyIsCi0gIH0sCi0jZW5kaWYKLSAgezAsIDB9fTsKLQotb3AgcHBpX3RhYltdID0KLXsKLSAgeyAiIiwiIiwgInBzaGwgIzxpbW0+LGR6IiwJIjAwMDAwaWlpbTE2Lnp6enoiLAotICAgICJpbnQgU3ogPSBEU1BfUiAoeikgJiAweGZmZmYwMDAwOyIsCi0gICAgIiIsCi0gICAgImlmIChpIDwgMTYpIiwKLSAgICAiICByZXMgPSBTeiA8PCBpOyIsCi0gICAgImVsc2UgaWYgKGkgPj0gMTI4IC0gMTYpIiwKLSAgICAiICByZXMgPSBTeiA+PiAxMjggLSBpOyIsCi0gICAgImVsc2UiCi0gICAgIiAgeyIsCi0gICAgIiAgICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IiwKLSAgICAiICAgIHJldHVybjsiLAotICAgICIgIH0iLAotICAgICJyZXMgJj0gMHhmZmZmMDAwMDsiLAotICAgICJyZXNfZ3JkID0gMDsiLAotICAgICJnb3RvIGxvZ2ljYWw7IiwKLSAgfSwKLSAgeyAiIiwiIiwgInBzaGEgIzxpbW0+LGR6IiwJIjAwMDEwaWlpbTMyLnp6enoiLAotICAgICJpbnQgU3ogPSBEU1BfUiAoeik7IiwKLSAgICAiaW50IFN6X2dyZCA9IEdFVF9EU1BfR1JEICh6KTsiLAotICAgICIiLAotICAgICJpZiAoaSA8IDMyKSIsCi0gICAgIiAgeyIsCi0gICAgIiAgICBpZiAoaSA9PSAzMikiCi0gICAgIiAgICAgIHsiLAotICAgICIgICAgICAgIHJlcyA9IDA7IiwKLSAgICAiICAgICAgICByZXNfZ3JkID0gU3o7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICBlbHNlIiwKLSAgICAiICAgICAgeyIsCi0gICAgIiAgICAgICAgcmVzID0gU3ogPDwgaTsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTel9ncmQgPDwgaSB8ICh1bnNpZ25lZCkgU3ogPj4gMzIgLSBpOyIsCi0gICAgIiAgICAgIH0iLAotICAgICIgICAgcmVzX2dyZCA9IFNFWFQgKHJlc19ncmQpOyIsCi0gICAgIiAgICBjYXJyeSA9IHJlc19ncmQgJiAxOyIsCi0gICAgIiAgfSIsCi0gICAgImVsc2UgaWYgKGkgPj0gOTYpIiwKLSAgICAiICB7IiwKLSAgICAiICAgIGkgPSAxMjggLSBpOyIsCi0gICAgIiAgICBpZiAoaSA9PSAzMikiCi0gICAgIiAgICAgIHsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTSUdOMzIgKFN6X2dyZCk7IiwKLSAgICAiICAgICAgICByZXMgPSBTel9ncmQ7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICBlbHNlIiwKLSAgICAiICAgICAgeyIsCi0gICAgIiAgICAgICAgcmVzID0gU3ogPj4gaSB8IFN6X2dyZCA8PCAzMiAtIGk7IiwKLSAgICAiICAgICAgICByZXNfZ3JkID0gU3pfZ3JkID4+IGk7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICBjYXJyeSA9IFN6ID4+IChpIC0gMSkgJiAxOyIsCi0gICAgIiAgfSIsCi0gICAgImVsc2UiCi0gICAgIiAgeyIsCi0gICAgIiAgICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IiwKLSAgICAiICAgIHJldHVybjsiLAotICAgICIgIH0iLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gICAgImdyZWF0ZXJfZXF1YWwgPSAwOyIsCi0gIH0sCi0gIHsgIiIsIiIsICJwbXVscyBTZSxTZixEZyIsCSIwMTAwZWVmZnh4eXlnZ3V1IiwKLSAgICAicmVzID0gKERTUF9SIChlKSkgPj4gMTYgKiAoRFNQX1IgKGYpID4+IDE2KSAqIDI7IiwKLSAgICAiaWYgKHJlcyA9PSAweDgwMDAwMDAwKSIsCi0gICAgIiAgcmVzID0gMHg3ZmZmZmZmZjsiLAotICAgICJEU1BfUiAoZykgPSByZXM7IiwKLSAgICAiRFNQX0dSRCAoZykgPSBTSUdOMzIgKHJlcyk7IiwKLSAgICAicmV0dXJuOyIsCi0gIH0sCi0gIHsgIiIsIiIsICJwc3ViIFN4LFN5LER1IHBtdWxzIFNlLFNmLERnIiwJIjAxMTBlZWZmeHh5eWdndXUiLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IChEU1BfUiAoZSkpID4+IDE2ICogKERTUF9SIChmKSA+PiAxNikgKiAyOyIsCi0gICAgImlmIChyZXMgPT0gMHg4MDAwMDAwMCkiLAotICAgICIgIHJlcyA9IDB4N2ZmZmZmZmY7IiwKLSAgICAiRFNQX1IgKGcpID0gcmVzOyIsCi0gICAgIkRTUF9HUkQgKGcpID0gU0lHTjMyIChyZXMpOyIsCi0gICAgIiIsCi0gICAgInogPSB1OyIsCi0gICAgInJlcyA9IFN4IC0gU3k7IiwKLSAgICAiY2FycnkgPSAodW5zaWduZWQpIHJlcyA+ICh1bnNpZ25lZCkgU3g7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCAtIFN5X2dyZCAtIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAicGFkZCBTeCxTeSxEdSBwbXVscyBTZSxTZixEZyIsCSIwMTExZWVmZnh4eXlnZ3V1IiwKLSAgICAiaW50IFN4ID0gRFNQX1IgKHgpOyIsCi0gICAgImludCBTeF9ncmQgPSBHRVRfRFNQX0dSRCAoeCk7IiwKLSAgICAiaW50IFN5ID0gRFNQX1IgKHkpOyIsCi0gICAgImludCBTeV9ncmQgPSBTSUdOMzIgKFN5KTsiLAotICAgICIiLAotICAgICJyZXMgPSAoRFNQX1IgKGUpKSA+PiAxNiAqIChEU1BfUiAoZikgPj4gMTYpICogMjsiLAotICAgICJpZiAocmVzID09IDB4ODAwMDAwMDApIiwKLSAgICAiICByZXMgPSAweDdmZmZmZmZmOyIsCi0gICAgIkRTUF9SIChnKSA9IHJlczsiLAotICAgICJEU1BfR1JEIChnKSA9IFNJR04zMiAocmVzKTsiLAotICAgICIiLAotICAgICJ6ID0gdTsiLAotICAgICJyZXMgPSBTeCArIFN5OyIsCi0gICAgImNhcnJ5ID0gKHVuc2lnbmVkKSByZXMgPCAodW5zaWduZWQpIFN4OyIsCi0gICAgInJlc19ncmQgPSBTeF9ncmQgKyBTeV9ncmQgKyBjYXJyeTsiLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gIH0sCi0gIHsgIiIsIiIsICJwc3ViYyBTeCxTeSxEeiIsCQkiMTAxMDAwMDB4eHl5enp6eiIsCi0gICAgImludCBTeCA9IERTUF9SICh4KTsiLAotICAgICJpbnQgU3hfZ3JkID0gR0VUX0RTUF9HUkQgKHgpOyIsCi0gICAgImludCBTeSA9IERTUF9SICh5KTsiLAotICAgICJpbnQgU3lfZ3JkID0gU0lHTjMyIChTeSk7IiwKLSAgICAiIiwKLSAgICAicmVzID0gU3ggLSBTeSAtIChEU1IgJiAxKTsiLAotICAgICJjYXJyeSA9ICh1bnNpZ25lZCkgcmVzID4gKHVuc2lnbmVkKSBTeCB8fCAocmVzID09IFN4ICYmIFN5KTsiLAotICAgICJyZXNfZ3JkID0gU3hfZ3JkICsgU3lfZ3JkICsgY2Fycnk7IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gICAgIkRTUiAmPSB+MHhmMTtcbiIsCi0gICAgImlmIChyZXMgfHwgcmVzX2dyZClcbiIsCi0gICAgIiAgRFNSIHw9IGdyZWF0ZXJfZXF1YWwgfCByZXNfZ3JkID4+IDIgJiBEU1JfTUFTS19OIHwgb3ZlcmZsb3c7XG4iLAotICAgICJlbHNlXG4iLAotICAgICIgIERTUiB8PSBEU1JfTUFTS19aIHwgb3ZlcmZsb3c7XG4iLAotICAgICJEU1IgfD0gY2Fycnk7XG4iLAotICAgICJnb3RvIGFzc2lnbl96O1xuIiwKLSAgfSwKLSAgeyAiIiwiIiwgInBhZGRjIFN4LFN5LER6IiwJIjEwMTEwMDAweHh5eXp6enoiLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IFN4ICsgU3kgKyAoRFNSICYgMSk7IiwKLSAgICAiY2FycnkgPSAodW5zaWduZWQpIHJlcyA8ICh1bnNpZ25lZCkgU3ggfHwgKHJlcyA9PSBTeCAmJiBTeSk7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCArIFN5X2dyZCArIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICAgICJEU1IgJj0gfjB4ZjE7XG4iLAotICAgICJpZiAocmVzIHx8IHJlc19ncmQpXG4iLAotICAgICIgIERTUiB8PSBncmVhdGVyX2VxdWFsIHwgcmVzX2dyZCA+PiAyICYgRFNSX01BU0tfTiB8IG92ZXJmbG93O1xuIiwKLSAgICAiZWxzZVxuIiwKLSAgICAiICBEU1IgfD0gRFNSX01BU0tfWiB8IG92ZXJmbG93O1xuIiwKLSAgICAiRFNSIHw9IGNhcnJ5O1xuIiwKLSAgICAiZ290byBhc3NpZ25fejtcbiIsCi0gIH0sCi0gIHsgIiIsIiIsICJwY21wIFN4LFN5IiwJIjEwMDAwMTAweHh5eS4uLi4iLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInogPSAxNzsgLyogSWdub3JlIHJlc3VsdC4gICovIiwKLSAgICAicmVzID0gU3ggLSBTeTsiLAotICAgICJjYXJyeSA9ICh1bnNpZ25lZCkgcmVzID4gKHVuc2lnbmVkKSBTeDsiLAotICAgICJyZXNfZ3JkID0gU3hfZ3JkIC0gU3lfZ3JkIC0gY2Fycnk7IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gIH0sCi0gIHsgIiIsIiIsICJwd3NiIFN4LFN5LER6IiwJIjEwMTAwMTAweHh5eXp6enoiLAotICB9LAotICB7ICIiLCIiLCAicHdhZCBTeCxTeSxEeiIsCSIxMDExMDEwMHh4eXl6enp6IiwKLSAgfSwKLSAgeyAiIiwiIiwgInBhYnMgU3gsRHoiLAkiMTAwMDEwMDB4eC4uenp6eiIsCi0gICAgInJlcyA9IERTUF9SICh4KTsiLAotICAgICJyZXNfZ3JkID0gR0VUX0RTUF9HUkQgKHgpOyIsCi0gICAgImlmIChyZXMgPj0gMCkiLAotICAgICIgIGNhcnJ5ID0gMDsiLAotICAgICJlbHNlIiwKLSAgICAiICB7IiwKLSAgICAiICAgIHJlcyA9IC1yZXM7IiwKLSAgICAiICAgIGNhcnJ5ID0gKHJlcyAhPSAwKTsgLyogVGhlIG1hbnVhbCBoYXMgYSBidWcgaGVyZS4gICovIiwgCi0gICAgIiAgICByZXNfZ3JkID0gLXJlc19ncmQgLSBjYXJyeTsiLCAKLSAgICAiICB9IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICIvKiA/Pz8gVGhlIHJlLWNvbXB1dGluZyBvZiBvdmVyZmxvdyBhZnRlciIsCi0gICAgIiAgIHNhdHVyYXRpb24gcHJvY2Vzc2luZyBpcyBzcGVjaWZpYyB0byBwYWJzLiAgKi8iLAotICAgICJvdmVyZmxvdyA9IHJlc19ncmQgIT0gU0lHTjMyIChyZXMpID8gRFNSX01BU0tfViA6IDA7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAicHJuZCBTeCxEeiIsCSIxMDAxMTAwMHh4Li56enp6IiwKLSAgICAiaW50IFN4ID0gRFNQX1IgKHgpOyIsCi0gICAgImludCBTeF9ncmQgPSBHRVRfRFNQX0dSRCAoeCk7IiwKLSAgICAiIiwKLSAgICAicmVzID0gU3ggKyAweDgwMDA7IiwKLSAgICAiY2FycnkgPSAodW5zaWduZWQpIHJlcyA8ICh1bnNpZ25lZCkgU3g7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCArIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAicGFicyBTeSxEeiIsCSIxMDEwMTAwMC4ueXl6enp6IiwKLSAgICAicmVzID0gRFNQX1IgKHkpOyIsCi0gICAgInJlc19ncmQgPSAwOyIsCi0gICAgIm92ZXJmbG93ID0gMDsiLAotICAgICJncmVhdGVyX2VxdWFsID0gRFNSX01BU0tfRzsiLAotICAgICJpZiAocmVzID49IDApIiwKLSAgICAiICBjYXJyeSA9IDA7IiwKLSAgICAiZWxzZSIsCi0gICAgIiAgeyIsCi0gICAgIiAgICByZXMgPSAtcmVzOyIsCi0gICAgIiAgICBjYXJyeSA9IDE7IiwKLSAgICAiICAgIGlmIChyZXMgPCAwKSIsCi0gICAgIiAgICAgIHsiLAotICAgICIgICAgICAgIGlmIChTKSIsCi0gICAgIiAgICAgICAgICByZXMgPSAweDdmZmZmZmZmOyIsCi0gICAgIiAgICAgICAgZWxzZSIsCi0gICAgIiAgICAgICAgICB7IiwKLSAgICAiICAgICAgICAgICAgb3ZlcmZsb3cgPSBEU1JfTUFTS19WOyIsCi0gICAgIiAgICAgICAgICAgIGdyZWF0ZXJfZXF1YWwgPSAwOyIsCi0gICAgIiAgICAgICAgICB9IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgfSIsCi0gIH0sCi0gIHsgIiIsIiIsICJwcm5kIFN5LER6IiwJIjEwMTExMDAwLi55eXp6enoiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IFN5ICsgMHg4MDAwOyIsCi0gICAgImNhcnJ5ID0gKHVuc2lnbmVkKSByZXMgPCAodW5zaWduZWQpIFN5OyIsCi0gICAgInJlc19ncmQgPSBTeV9ncmQgKyBjYXJyeTsiLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gICAgIkFERF9TVUJfR0U7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcHNobCBTeCxTeSxEeiIsCSIxMDAwMDBjY3h4eXl6enp6IiwKLSAgICAiaW50IFN4ID0gRFNQX1IgKHgpICYgMHhmZmZmMDAwMDsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSkgPj4gMTYgJiAweDdmOyIsCi0gICAgIiIsCi0gICAgImlmIChTeSA8IDE2KSIsCi0gICAgIiAgcmVzID0gU3ggPDwgU3k7IiwKLSAgICAiZWxzZSBpZiAoU3kgPj0gMTI4IC0gMTYpIiwKLSAgICAiICByZXMgPSBTeCA+PiAxMjggLSBTeTsiLAotICAgICJlbHNlIgotICAgICIgIHsiLAotICAgICIgICAgUkFJU0VfRVhDRVBUSU9OIChTSUdJTEwpOyIsCi0gICAgIiAgICByZXR1cm47IiwKLSAgICAiICB9IiwKLSAgICAiZ290byBjb25kX2xvZ2ljYWw7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcHNoYSBTeCxTeSxEeiIsCSIxMDAxMDBjY3h4eXl6enp6IiwKLSAgICAiaW50IFN4ID0gRFNQX1IgKHgpOyIsCi0gICAgImludCBTeF9ncmQgPSBHRVRfRFNQX0dSRCAoeCk7IiwKLSAgICAiaW50IFN5ID0gRFNQX1IgKHkpID4+IDE2ICYgMHg3ZjsiLAotICAgICIiLAotICAgICJpZiAoU3kgPCAzMikiLAotICAgICIgIHsiLAotICAgICIgICAgaWYgKFN5ID09IDMyKSIKLSAgICAiICAgICAgeyIsCi0gICAgIiAgICAgICAgcmVzID0gMDsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTeDsiLAotICAgICIgICAgICB9IiwKLSAgICAiICAgIGVsc2UiLAotICAgICIgICAgICB7IiwKLSAgICAiICAgICAgICByZXMgPSBTeCA8PCBTeTsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTeF9ncmQgPDwgU3kgfCAodW5zaWduZWQpIFN4ID4+IDMyIC0gU3k7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICByZXNfZ3JkID0gU0VYVCAocmVzX2dyZCk7IiwKLSAgICAiICAgIGNhcnJ5ID0gcmVzX2dyZCAmIDE7IiwKLSAgICAiICB9IiwKLSAgICAiZWxzZSBpZiAoU3kgPj0gOTYpIiwKLSAgICAiICB7IiwKLSAgICAiICAgIFN5ID0gMTI4IC0gU3k7IiwKLSAgICAiICAgIGlmIChTeSA9PSAzMikiCi0gICAgIiAgICAgIHsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTSUdOMzIgKFN4X2dyZCk7IiwKLSAgICAiICAgICAgICByZXMgPSBTeF9ncmQ7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICBlbHNlIiwKLSAgICAiICAgICAgeyIsCi0gICAgIiAgICAgICAgcmVzID0gU3ggPj4gU3kgfCBTeF9ncmQgPDwgMzIgLSBTeTsiLAotICAgICIgICAgICAgIHJlc19ncmQgPSBTeF9ncmQgPj4gU3k7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgICBjYXJyeSA9IFN4ID4+IChTeSAtIDEpICYgMTsiLAotICAgICIgIH0iLAotICAgICJlbHNlIgotICAgICIgIHsiLAotICAgICIgICAgUkFJU0VfRVhDRVBUSU9OIChTSUdJTEwpOyIsCi0gICAgIiAgICByZXR1cm47IiwKLSAgICAiICB9IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJncmVhdGVyX2VxdWFsID0gMDsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwc3ViIFN4LFN5LER6IiwJIjEwMTAwMGNjeHh5eXp6enoiLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IFN4IC0gU3k7IiwKLSAgICAiY2FycnkgPSAodW5zaWduZWQpIHJlcyA+ICh1bnNpZ25lZCkgU3g7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCAtIFN5X2dyZCAtIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwYWRkIFN4LFN5LER6IiwJIjEwMTEwMGNjeHh5eXp6enoiLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IFN4ICsgU3k7IiwKLSAgICAiY2FycnkgPSAodW5zaWduZWQpIHJlcyA8ICh1bnNpZ25lZCkgU3g7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCArIFN5X2dyZCArIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwYW5kIFN4LFN5LER6IiwJIjEwMDEwMWNjeHh5eXp6enoiLAotICAgICJyZXMgPSBEU1BfUiAoeCkgJiBEU1BfUiAoeSk7IiwKLSAgImNvbmRfbG9naWNhbDoiLAotICAgICJyZXMgJj0gMHhmZmZmMDAwMDsiLAotICAgICJyZXNfZ3JkID0gMDsiLAotICAgICJpZiAoaXdvcmQgJiAweDIwMClcbiIsCi0gICAgIiAgZ290byBhc3NpZ25fejtcbiIsCi0gICJsb2dpY2FsOiIsCi0gICAgImNhcnJ5ID0gMDsiLAotICAgICJvdmVyZmxvdyA9IDA7IiwKLSAgICAiZ3JlYXRlcl9lcXVhbCA9IDA7IiwKLSAgICAiRFNSICY9IH4weGYxO1xuIiwKLSAgICAiaWYgKHJlcylcbiIsCi0gICAgIiAgRFNSIHw9IHJlcyA+PiAyNiAmIERTUl9NQVNLX047XG4iLAotICAgICJlbHNlXG4iLAotICAgICIgIERTUiB8PSBEU1JfTUFTS19aO1xuIiwKLSAgICAiZ290byBhc3NpZ25fZGM7XG4iLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBweG9yIFN4LFN5LER6IiwJIjEwMTAwMWNjeHh5eXp6enoiLAotICAgICJyZXMgPSBEU1BfUiAoeCkgXiBEU1BfUiAoeSk7IiwKLSAgICAiZ290byBjb25kX2xvZ2ljYWw7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcG9yIFN4LFN5LER6IiwJIjEwMTEwMWNjeHh5eXp6enoiLAotICAgICJyZXMgPSBEU1BfUiAoeCkgfCBEU1BfUiAoeSk7IiwKLSAgICAiZ290byBjb25kX2xvZ2ljYWw7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcGRlYyBTeCxEeiIsCSIxMDAwMTBjY3h4Li56enp6IiwKLSAgICAiaW50IFN4ID0gRFNQX1IgKHgpOyIsCi0gICAgImludCBTeF9ncmQgPSBHRVRfRFNQX0dSRCAoeCk7IiwKLSAgICAiIiwKLSAgICAicmVzID0gU3ggLSAweDEwMDAwOyIsCi0gICAgImNhcnJ5ID0gcmVzID4gU3g7IiwKLSAgICAicmVzX2dyZCA9IFN4X2dyZCAtIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICAgICJyZXMgJj0gMHhmZmZmMDAwMDsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwaW5jIFN4LER6IiwJIjEwMDExMGNjeHguLnp6enoiLAotICAgICJpbnQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICIiLAotICAgICJyZXMgPSBTeCArIDB4MTAwMDA7IiwKLSAgICAiY2FycnkgPSByZXMgPCBTeDsiLAotICAgICJyZXNfZ3JkID0gU3hfZ3JkICsgY2Fycnk7IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gICAgInJlcyAmPSAweGZmZmYwMDAwOyIsCi0gIH0sCi0gIHsgIiIsIiIsICIoaWYgY2MpIHBkZWMgU3ksRHoiLAkiMTAxMDEwY2MuLnl5enp6eiIsCi0gICAgImludCBTeSA9IERTUF9SICh5KTsiLAotICAgICJpbnQgU3lfZ3JkID0gU0lHTjMyIChTeSk7IiwKLSAgICAiIiwKLSAgICAicmVzID0gU3kgLSAweDEwMDAwOyIsCi0gICAgImNhcnJ5ID0gcmVzID4gU3k7IiwKLSAgICAicmVzX2dyZCA9IFN5X2dyZCAtIGNhcnJ5OyIsCi0gICAgIkNPTVBVVEVfT1ZFUkZMT1c7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICAgICJyZXMgJj0gMHhmZmZmMDAwMDsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwaW5jIFN5LER6IiwJIjEwMTExMGNjLi55eXp6enoiLAotICAgICJpbnQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IFN5X2dyZCA9IFNJR04zMiAoU3kpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IFN5ICsgMHgxMDAwMDsiLAotICAgICJjYXJyeSA9IHJlcyA8IFN5OyIsCi0gICAgInJlc19ncmQgPSBTeV9ncmQgKyBjYXJyeTsiLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gICAgIkFERF9TVUJfR0U7IiwKLSAgICAicmVzICY9IDB4ZmZmZjAwMDA7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcGNsciBEeiIsCQkiMTAwMDExY2MuLi4uenp6eiIsCi0gICAgInJlcyA9IDA7IiwKLSAgICAicmVzX2dyZCA9IDA7IiwKLSAgICAiY2FycnkgPSAwOyIsCi0gICAgIm92ZXJmbG93ID0gMDsiLAotICAgICJncmVhdGVyX2VxdWFsID0gMTsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwZG1zYiBTeCxEeiIsCSIxMDAxMTFjY3h4Li56enp6IiwKLSAgICAidW5zaWduZWQgU3ggPSBEU1BfUiAoeCk7IiwKLSAgICAiaW50IFN4X2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJpbnQgaSA9IDE2OyIKLSAgICAiIiwKLSAgICAiaWYgKFN4X2dyZCA8IDApIiwKLSAgICAiICB7IiwKLSAgICAiICAgIFN4X2dyZCA9IH5TeF9ncmQ7IiwKLSAgICAiICAgIFN4ID0gflN4OyIsCi0gICAgIiAgfSIsCi0gICAgImlmIChTeF9ncmQpIiwKLSAgICAiICB7IiwKLSAgICAiICAgIFN4ID0gU3hfZ3JkOyIsCi0gICAgIiAgICByZXMgPSAtMjsiLAotICAgICIgIH0iLAotICAgICJlbHNlIGlmIChTeCkiLAotICAgICIgIHJlcyA9IDMwOyIsCi0gICAgImVsc2UiLAotICAgICIgIHJlcyA9IDMxOyIsCi0gICAgImRvIgotICAgICIgIHsiLAotICAgICIgICAgaWYgKFN4ICYgfjAgPDwgaSkiLAotICAgICIgICAgICB7IiwKLSAgICAiICAgICAgICByZXMgLT0gaTsiLAotICAgICIgICAgICAgIFN4ID4+PSBpOyIsCi0gICAgIiAgICAgIH0iLAotICAgICIgIH0iLAotICAgICJ3aGlsZSAoaSA+Pj0gMSk7IiwKLSAgICAicmVzIDw8PSAxNjsiLAotICAgICJyZXNfZ3JkID0gU0lHTjMyIChyZXMpOyIsCi0gICAgImNhcnJ5ID0gMDsiLAotICAgICJvdmVyZmxvdyA9IDA7IiwKLSAgICAiQUREX1NVQl9HRTsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwZG1zYiBTeSxEeiIsCSIxMDExMTFjYy4ueXl6enp6IiwKLSAgICAidW5zaWduZWQgU3kgPSBEU1BfUiAoeSk7IiwKLSAgICAiaW50IGk7IgotICAgICIiLAotICAgICJpZiAoU3kgPCAwKSIsCi0gICAgIiAgU3kgPSB+U3k7IiwKLSAgICAiU3kgPDw9IDE7IiwKLSAgICAicmVzID0gMzE7IiwKLSAgICAiZG8iCi0gICAgIiAgeyIsCi0gICAgIiAgICBpZiAoU3kgJiB+MCA8PCBpKSIsCi0gICAgIiAgICAgIHsiLAotICAgICIgICAgICAgIHJlcyAtPSBpOyIsCi0gICAgIiAgICAgICAgU3kgPj49IGk7IiwKLSAgICAiICAgICAgfSIsCi0gICAgIiAgfSIsCi0gICAgIndoaWxlIChpID4+PSAxKTsiLAotICAgICJyZXMgPDw9IDE2OyIsCi0gICAgInJlc19ncmQgPSBTSUdOMzIgKHJlcyk7IiwKLSAgICAiY2FycnkgPSAwOyIsCi0gICAgIm92ZXJmbG93ID0gMDsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gIH0sCi0gIHsgIiIsIiIsICIoaWYgY2MpIHBuZWcgU3gsRHoiLAkiMTEwMDEwY2N4eC4uenp6eiIsCi0gICAgImludCBTeCA9IERTUF9SICh4KTsiLAotICAgICJpbnQgU3hfZ3JkID0gR0VUX0RTUF9HUkQgKHgpOyIsCi0gICAgIiIsCi0gICAgInJlcyA9IDAgLSBTeDsiLAotICAgICJjYXJyeSA9IHJlcyAhPSAwOyIsCi0gICAgInJlc19ncmQgPSAwIC0gU3hfZ3JkIC0gY2Fycnk7IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gIH0sCi0gIHsgIiIsIiIsICIoaWYgY2MpIHBjb3B5IFN4LER6IiwJIjExMDExMGNjeHguLnp6enoiLAotICAgICJyZXMgPSBEU1BfUiAoeCk7IiwKLSAgICAicmVzX2dyZCA9IEdFVF9EU1BfR1JEICh4KTsiLAotICAgICJjYXJyeSA9IDA7IiwKLSAgICAiQ09NUFVURV9PVkVSRkxPVzsiLAotICAgICJBRERfU1VCX0dFOyIsCi0gIH0sCi0gIHsgIiIsIiIsICIoaWYgY2MpIHBuZWcgU3ksRHoiLAkiMTExMDEwY2MuLnl5enp6eiIsCi0gICAgImludCBTeSA9IERTUF9SICh5KTsiLAotICAgICJpbnQgU3lfZ3JkID0gU0lHTjMyIChTeSk7IiwKLSAgICAiIiwKLSAgICAicmVzID0gMCAtIFN5OyIsCi0gICAgImNhcnJ5ID0gcmVzICE9IDA7IiwKLSAgICAicmVzX2dyZCA9IDAgLSBTeV9ncmQgLSBjYXJyeTsiLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gICAgIkFERF9TVUJfR0U7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcGNvcHkgU3ksRHoiLAkiMTExMTEwY2MuLnl5enp6eiIsCi0gICAgInJlcyA9IERTUF9SICh5KTsiLAotICAgICJyZXNfZ3JkID0gU0lHTjMyIChyZXMpOyIsCi0gICAgImNhcnJ5ID0gMDsiLAotICAgICJDT01QVVRFX09WRVJGTE9XOyIsCi0gICAgIkFERF9TVUJfR0U7IiwKLSAgfSwKLSAgeyAiIiwiIiwgIihpZiBjYykgcHN0cyBNQUNILER6IiwJIjExMDAxMWNjLi4uLnp6enoiLAotICAgICJyZXMgPSBNQUNIOyIsCi0gICAgInJlc19ncmQgPSBTSUdOMzIgKHJlcyk7IiwKLSAgICAiZ290byBhc3NpZ25fejsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwc3RzIE1BQ0wsRHoiLAkiMTEwMTExY2MuLi4uenp6eiIsCi0gICAgInJlcyA9IE1BQ0w7IiwKLSAgICAicmVzX2dyZCA9IFNJR04zMiAocmVzKTsiLAotICAgICJnb3RvIGFzc2lnbl96OyIsCi0gIH0sCi0gIHsgIiIsIiIsICIoaWYgY2MpIHBsZHMgRHosTUFDSCIsCSIxMTEwMTFjYy4uLi56enp6IiwKLSAgICAiaWYgKDB4YTA1ZiA+PiB6ICYgMSkiLAotICAgICIgIFJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTsiLAotICAgICJlbHNlIiwKLSAgICAiICBNQUNIID0gRFNQX1IgKHopOyIsCi0gICAgInJldHVybjsiLAotICB9LAotICB7ICIiLCIiLCAiKGlmIGNjKSBwbGRzIER6LE1BQ0wiLAkiMTExMTExY2MuLi4uenp6eiIsCi0gICAgImlmICgweGEwNWYgPj4geiAmIDEpIiwKLSAgICAiICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IiwKLSAgICAiZWxzZSIsCi0gICAgIiAgTUFDTCA9IERTUF9SICh6KSA9IHJlczsiLAotICAgICJyZXR1cm47IiwKLSAgfSwKLSAgezAsIDB9Ci19OwotCi0vKiBUYWJsZXMgb2YgdGhpbmdzIHRvIHB1dCBpbnRvIGVudW1zIGZvciBzaC1vcGMuaCAqLwotc3RhdGljIGNoYXIgKm5pYmJsZV90eXBlX2xpc3RbXSA9Ci17Ci0gICJIRVhfMCIsCi0gICJIRVhfMSIsCi0gICJIRVhfMiIsCi0gICJIRVhfMyIsCi0gICJIRVhfNCIsCi0gICJIRVhfNSIsCi0gICJIRVhfNiIsCi0gICJIRVhfNyIsCi0gICJIRVhfOCIsCi0gICJIRVhfOSIsCi0gICJIRVhfQSIsCi0gICJIRVhfQiIsCi0gICJIRVhfQyIsCi0gICJIRVhfRCIsCi0gICJIRVhfRSIsCi0gICJIRVhfRiIsCi0gICJSRUdfTiIsCi0gICJSRUdfTSIsCi0gICJCUkFOQ0hfMTIiLAotICAiQlJBTkNIXzgiLAotICAiRElTUF84IiwKLSAgIkRJU1BfNCIsCi0gICJJTU1fNCIsCi0gICJJTU1fNEJZMiIsCi0gICJJTU1fNEJZNCIsCi0gICJQQ1JFTElNTV84QlkyIiwKLSAgIlBDUkVMSU1NXzhCWTQiLAotICAiSU1NXzgiLAotICAiSU1NXzhCWTIiLAotICAiSU1NXzhCWTQiLAotICAwCi19Owotc3RhdGljCi1jaGFyICphcmdfdHlwZV9saXN0W10gPQotewotICAiQV9FTkQiLAotICAiQV9CRElTUDEyIiwKLSAgIkFfQkRJU1A4IiwKLSAgIkFfREVDX00iLAotICAiQV9ERUNfTiIsCi0gICJBX0RJU1BfR0JSIiwKLSAgIkFfRElTUF9QQyIsCi0gICJBX0RJU1BfUkVHX00iLAotICAiQV9ESVNQX1JFR19OIiwKLSAgIkFfR0JSIiwKLSAgIkFfSU1NIiwKLSAgIkFfSU5DX00iLAotICAiQV9JTkNfTiIsCi0gICJBX0lORF9NIiwKLSAgIkFfSU5EX04iLAotICAiQV9JTkRfUjBfUkVHX00iLAotICAiQV9JTkRfUjBfUkVHX04iLAotICAiQV9NQUNIIiwKLSAgIkFfTUFDTCIsCi0gICJBX1BSIiwKLSAgIkFfUjAiLAotICAiQV9SMF9HQlIiLAotICAiQV9SRUdfTSIsCi0gICJBX1JFR19OIiwKLSAgIkFfU1IiLAotICAiQV9WQlIiLAotICAiQV9TU1IiLAotICAiQV9TUEMiLAotICAwLAotfTsKLQotc3RhdGljIHZvaWQKLW1ha2VfZW51bV9saXN0IChuYW1lLCBzKQotICAgICBjaGFyICpuYW1lOwotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGkgPSAxOwotICBwcmludGYgKCJ0eXBlZGVmIGVudW0ge1xuIik7Ci0gIHdoaWxlICgqcykKLSAgICB7Ci0gICAgICBwcmludGYgKCJcdCVzLFxuIiwgKnMpOwotICAgICAgcysrOwotICAgICAgaSsrOwotICAgIH0KLSAgcHJpbnRmICgifSAlcztcbiIsIG5hbWUpOwotfQotCi1zdGF0aWMgaW50Ci1xZnVuYyAoYSwgYikKLSAgICAgb3AgKmE7Ci0gICAgIG9wICpiOwotewotICBjaGFyIGJ1ZmFbOV07Ci0gIGNoYXIgYnVmYls5XTsKLSAgaW50IGRpZmY7Ci0KLSAgbWVtY3B5IChidWZhLCBhLT5jb2RlLCA0KTsKLSAgbWVtY3B5IChidWZhICsgNCwgYS0+Y29kZSArIDEyLCA0KTsKLSAgYnVmYVs4XSA9IDA7Ci0KLSAgbWVtY3B5IChidWZiLCBiLT5jb2RlLCA0KTsKLSAgbWVtY3B5IChidWZiICsgNCwgYi0+Y29kZSArIDEyLCA0KTsKLSAgYnVmYls4XSA9IDA7Ci0gIGRpZmYgPSBzdHJjbXAgKGJ1ZmEsIGJ1ZmIpOwotICAvKiBTdGFiaWxpemUgdGhlIHNvcnQsIHNvIHRoYXQgbGF0ZXIgZW50cmllcyBjYW4gb3ZlcnJpZGUgbW9yZSBnZW5lcmFsCi0gICAgIHByZWNlZGluZyBlbnRyaWVzLiAgKi8KLSAgcmV0dXJuIGRpZmYgPyBkaWZmIDogYSAtIGI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zb3J0dGFiICgpCi17Ci0gIG9wICpwID0gdGFiOwotICBpbnQgbGVuID0gMDsKLQotICB3aGlsZSAocC0+bmFtZSkKLSAgICB7Ci0gICAgICBwKys7Ci0gICAgICBsZW4rKzsKLSAgICB9Ci0gIHFzb3J0ICh0YWIsIGxlbiwgc2l6ZW9mICgqcCksIHFmdW5jKTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbmdhc3RhYiAoKQotewotICBvcCAqcDsKLSAgc29ydHRhYiAoKTsKLSAgZm9yIChwID0gdGFiOyBwLT5uYW1lOyBwKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJXMgJS0zMHNcbiIsIHAtPmNvZGUsIHAtPm5hbWUpOwotICAgIH0KLQotCi19Ci0KLS8qIENvbnZlcnQgYSBzdHJpbmcgb2YgNCBiaW5hcnkgZGlnaXRzIGludG8gYW4gaW50ICovCi0KLXN0YXRpYwotaW50Ci1idG9uIChzKQotICAgICBjaGFyICpzOwotCi17Ci0gIGludCBuID0gMDsKLSAgaW50IHYgPSA4OwotICB3aGlsZSAodikKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJzEnKQotCW4gfD0gdjsKLSAgICAgIHYgPj49IDE7Ci0gICAgICBzKys7Ci0gICAgfQotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVbMSA8PCAxNl07Ci0KLS8qIFRha2UgYW4gb3Bjb2RlIGV4cGFuZCBhbGwgdmFyeWluZyBmaWVsZHMgaW4gaXQgb3V0IGFuZCBmaWxsIGFsbCB0aGUKLSAgcmlnaHQgZW50cmllcyBpbiAndGFibGUnIHdpdGggdGhlIG9wY29kZSBpbmRleCovCi0KLXN0YXRpYyB2b2lkCi1leHBhbmRfb3Bjb2RlIChzaGlmdCwgdmFsLCBpLCBzKQotICAgICBpbnQgc2hpZnQ7Ci0gICAgIGludCB2YWw7Ci0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbnQgajsKLQotICBpZiAoKnMgPT0gMCkKLSAgICB7Ci0gICAgICB0YWJsZVt2YWxdID0gaTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNbMF0pCi0JewotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JICB7Ci0JICAgIGludCBtLCBtdjsKLQotCSAgICB2YWwgfD0gYnRvbiAocykgPDwgc2hpZnQ7Ci0JICAgIGlmIChzWzJdID09ICcwJyB8fCBzWzJdID09ICcxJykKLQkgICAgICBleHBhbmRfb3Bjb2RlIChzaGlmdCAtIDQsIHZhbCwgaSwgcyArIDQpOwotCSAgICBlbHNlIGlmIChzWzJdID09ICdOJykKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotCQlleHBhbmRfb3Bjb2RlIChzaGlmdCAtIDQsIHZhbCB8IChqIDw8IHNoaWZ0KSwgaSwgcyArIDQpOwotCSAgICBlbHNlIGlmIChzWzJdID09ICd4JykKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAyKQotCQlmb3IgKG0gPSAwOyBtIDwgMzI7IG0rKykKLQkJICB7Ci0JCSAgICAvKiBJZ25vcmUgaWxsZWdhbCBub3B5ICovCi0JCSAgICBpZiAoKG0gJiA3KSA9PSAwICYmIG0gIT0gMCkKLQkJICAgICAgY29udGludWU7Ci0JCSAgICBtdiA9IG0gJiAzIHwgKG0gJiA0KSA8PCAyIHwgKG0gJiA4KSA8PCAzIHwgKG0gJiAxNikgPDwgNDsKLQkJICAgIGV4cGFuZF9vcGNvZGUgKHNoaWZ0IC0gNCwgdmFsIHwgbXYgfCAoaiA8PCBzaGlmdCksIGksCi0JCQkJICAgcyArIDQpOwotCQkgIH0KLQkgICAgZWxzZSBpZiAoc1syXSA9PSAneScpCi0JICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLQkJZXhwYW5kX29wY29kZSAoc2hpZnQgLSA0LCB2YWwgfCAoaiA8PCBzaGlmdCksIGksIHMgKyA0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnbic6Ci0JY2FzZSAnbSc6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGV4cGFuZF9vcGNvZGUgKHNoaWZ0IC0gNCwgdmFsIHwgKGogPDwgc2hpZnQpLCBpLCBzICsgNCk7Ci0KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICAvKiBBMSwgQTAsWDAsWDEsWTAsWTEsTTAsQTFHLE0xLE0xRyAqLwotCSAgZm9yIChqID0gNTsgaiA8IDE2OyBqKyspCi0JICAgIGlmIChqICE9IDYpCi0JICAgICAgZXhwYW5kX29wY29kZSAoc2hpZnQgLSA0LCB2YWwgfCAoaiA8PCBzaGlmdCksIGksIHMgKyA0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ0cnOgotCSAgLyogQTFHLCBBMEc6ICovCi0JICBmb3IgKGogPSAxMzsgaiA8PSAxNTsgaiArPTIpCi0JICAgIGV4cGFuZF9vcGNvZGUgKHNoaWZ0IC0gNCwgdmFsIHwgKGogPDwgc2hpZnQpLCBpLCBzICsgNCk7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIC8qIFN5c3RlbSByZWdpc3RlcnMgbWFjaCwgbWFjbCwgcHI6ICovCi0JICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotCSAgICBleHBhbmRfb3Bjb2RlIChzaGlmdCAtIDQsIHZhbCB8IChqIDw8IHNoaWZ0KSwgaSwgcyArIDQpOwotCSAgLyogU3lzdGVtIHJlZ2lzdGVycyBmcHVsLCBmcHNjci9kc3IsIGEwLCB4MCwgeDEsIHkwLCB5MTogKi8KLQkgIGZvciAoaiA9IDU7IGogPCAxMjsgaisrKQotCSAgICBleHBhbmRfb3Bjb2RlIChzaGlmdCAtIDQsIHZhbCB8IChqIDw8IHNoaWZ0KSwgaSwgcyArIDQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JY2FzZSAnYSc6Ci0JICB2YWwgfD0gYnRvbiAocykgPDwgc2hpZnQ7Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gOCkKLQkgICAgZXhwYW5kX29wY29kZSAoc2hpZnQgLSA0LCB2YWwgfCAoaiA8PCBzaGlmdCksIGksIHMgKyA0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ1knOgotCWNhc2UgJ0EnOgotCSAgdmFsIHw9IGJ0b24gKHMpIDw8IHNoaWZ0OwotCSAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gNCkKLQkgICAgZXhwYW5kX29wY29kZSAoc2hpZnQgLSA0LCB2YWwgfCAoaiA8PCBzaGlmdCksIGksIHMgKyA0KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGZvciAoaiA9IDA7IGogPCAoMSA8PCAoc2hpZnQgKyA0KSk7IGorKykKLQkgICAgewotCSAgICAgIHRhYmxlW3ZhbCB8IGpdID0gaTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBqdW1wIHRhYmxlIHVzZWQgdG8gaW5kZXggYW4gb3Bjb2RlIGludG8gYSBzd2l0Y2gKLSAgIHN0YXRlbWVudCBlbnRyeS4gKi8KLQotc3RhdGljIHZvaWQKLWR1bXB0YWJsZSAobmFtZSwgc2l6ZSwgc3RhcnQpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgc3RhcnQ7Ci17Ci0gIGludCBsdW1wID0gMjU2OwotICBpbnQgb25saW5lID0gMTY7Ci0KLSAgaW50IGkgPSBzdGFydDsKLQotICBwcmludGYgKCJ1bnNpZ25lZCBjaGFyICVzWyVkXT17XG4iLCBuYW1lLCBzaXplKTsKLSAgd2hpbGUgKGkgPCBzdGFydCArIHNpemUpCi0gICAgewotICAgICAgaW50IGogPSAwOwotCi0gICAgICBwcmludGYgKCIvKiAweCV4ICovXG4iLCBpKTsKLQotICAgICAgd2hpbGUgKGogPCBsdW1wKQotCXsKLQkgIGludCBrID0gMDsKLQkgIHdoaWxlIChrIDwgb25saW5lKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJTJkIiwgdGFibGVbaSArIGogKyBrXSk7Ci0JICAgICAgaWYgKGogKyBrIDwgbHVtcCkKLQkJcHJpbnRmICgiLCIpOwotCi0JICAgICAgaysrOwotCSAgICB9Ci0JICBqICs9IGs7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGkgKz0gajsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZmlsbHRhYmxlIChwKQotICAgICBvcCAqcDsKLXsKLSAgc3RhdGljIGludCBpbmRleCA9IDE7Ci0KLSAgc29ydHRhYiAoKTsKLSAgZm9yICg7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBwLT5pbmRleCA9IGluZGV4Kys7Ci0gICAgICBleHBhbmRfb3Bjb2RlICgxMiwgMCwgcC0+aW5kZXgsIHAtPmNvZGUpOwotICAgIH0KLX0KLQotLyogVGFibGUgYWxyZWFkeSBjb250YWlzIGFsbCB0aGUgc3dpdGNoIGNhc2UgdGFncyBmb3IgMTYtYml0IG9wY29kZSBkb3VibGUKLSAgIGRhdGEgdHJhbnNmZXIgKGRkdCkgaW5zbnMsIGFuZCB0aGUgc3dpdGNoIGNhc2UgdGFnIGZvciBwcm9jZXNzaW5nIHBhcmFsbGVsCi0gICBwcm9jZXNzaW5nIGluc25zIChwcGkpIGZvciBjb2RlIDB4ZjgwMCAocHBpIG5vcHggbm9weSkuICBDb3B5IHRoZQotICAgbGF0dGVyIHRhZyB0byByZXByZXNlbnQgYWxsIGNvbWJpbmF0aW9ucyBvZiBwcGkgd2l0aCBkZHQuICAqLwotc3RhdGljIHZvaWQKLXBwaV9tb3ZlcyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAweGYwMDA7IGkgPCAweGY0MDA7IGkrKykKLSAgICBpZiAodGFibGVbaV0pCi0gICAgICB0YWJsZVtpICsgMHg4MDBdID0gdGFibGVbMHhmODAwXTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbnNpbV9jYXNlbGlzdCAocCkKLSAgICAgb3AgKnA7Ci17Ci0gIGZvciAoOyBwLT5uYW1lOyBwKyspCi0gICAgewotICAgICAgaW50IGo7Ci0gICAgICBpbnQgc2V4dGJpdCA9IC0xOwotICAgICAgaW50IG5lZWRtID0gMDsKLSAgICAgIGludCBuZWVkbiA9IDA7Ci0gICAgICAKLSAgICAgIGNoYXIgKnMgPSBwLT5jb2RlOwotCi0gICAgICBwcmludGYgKCIgIC8qICVzICVzICovXG4iLCBwLT5uYW1lLCBwLT5jb2RlKTsKLSAgICAgIHByaW50ZiAoIiAgY2FzZSAlZDogICAgICBcbiIsIHAtPmluZGV4KTsKLQotICAgICAgcHJpbnRmICgiICAgIHtcbiIpOwotICAgICAgd2hpbGUgKCpzKQotCXsKLQkgIHN3aXRjaCAoKnMpCi0JICAgIHsKLQkgICAgY2FzZSAnMCc6Ci0JICAgIGNhc2UgJzEnOgotCSAgICAgIHMgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnLic6Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICduJzoKLQkgICAgICBwcmludGYgKCIgICAgICBpbnQgbiA9IChpd29yZCA+PjgpICYgMHhmO1xuIik7Ci0JICAgICAgbmVlZG4gPSAxOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnTic6Ci0JICAgICAgcHJpbnRmICgiICAgICAgaW50IG4gPSAoKChpd29yZCA+PiA4KSAtIDIpICYgMHgzKSArIDI7XG4iKTsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3gnOgotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCBuID0gKChpd29yZCA+PiA5KSAmIDEpICsgNDtcbiIpOwotCSAgICAgIG5lZWRuID0gMTsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3knOgotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCBuID0gKChpd29yZCA+PiA4KSAmIDEpICsgNDtcbiIpOwotCSAgICAgIG5lZWRuID0gMTsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIG5lZWRtID0gMTsKLQkgICAgY2FzZSAncyc6Ci0JICAgIGNhc2UgJ00nOgotCSAgICBjYXNlICdHJzoKLQkgICAgICBwcmludGYgKCIgICAgICBpbnQgbSA9IChpd29yZCA+PjQpICYgMHhmO1xuIik7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdYJzoKLQkgICAgICBwcmludGYgKCIgICAgICBpbnQgbSA9ICgoaXdvcmQgPj4gNykgJiAxKSArIDg7XG4iKTsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2EnOgotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCBtID0gNyAtICgoaXdvcmQgPj4gNikgJiAyKTtcbiIpOwotCSAgICAgIHMgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnWSc6Ci0JICAgICAgcHJpbnRmICgiICAgICAgaW50IG0gPSAoKGl3b3JkID4+IDYpICYgMSkgKyAxMDtcbiIpOwotCSAgICAgIHMgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgcHJpbnRmICgiICAgICAgaW50IG0gPSA3IC0gKChpd29yZCA+PiA1KSAmIDIpO1xuIik7Ci0JICAgICAgcyArPSAyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCBpID0gKGl3b3JkICYgMHgiKTsKLQotCSAgICAgIHN3aXRjaCAoc1sxXSkKLQkJewotCQljYXNlICc0JzoKLQkJICBwcmludGYgKCJmIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzgnOgotCQkgIHByaW50ZiAoImZmIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzEnOgotCQkgIHNleHRiaXQgPSAxMjsKLQotCQkgIHByaW50ZiAoImZmZiIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgcHJpbnRmICgiKSIpOwotCi0JICAgICAgc3dpdGNoIChzWzNdKQotCQl7Ci0JCWNhc2UgJzEnOgotCQkgIGJyZWFrOwotCQljYXNlICcyJzoKLQkJICBwcmludGYgKCI8PDEiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnNCc6Ci0JCSAgcHJpbnRmICgiPDwyIik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBwcmludGYgKCI7XG4iKTsKLQkgICAgICBzICs9IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc2V4dGJpdCA+IDApCi0JewotCSAgcHJpbnRmICgiICAgICAgaSA9IChpIF4gKDE8PCVkKSktKDE8PCVkKTtcbiIsCi0JCSAgc2V4dGJpdCAtIDEsIHNleHRiaXQgLSAxKTsKLQl9Ci0KLSAgICAgIGlmIChuZWVkbSAmJiBuZWVkbikKLQlwcmludGYgKCIgICAgICBUQihtLG4pO1xuIik7ICAKLSAgICAgIGVsc2UgaWYgKG5lZWRtKQotCXByaW50ZiAoIiAgICAgIFRMKG0pO1xuIik7Ci0gICAgICBlbHNlIGlmIChuZWVkbikKLQlwcmludGYgKCIgICAgICBUTChuKTtcbiIpOwotCi0gICAgICB7Ci0JLyogRG8gdGhlIHJlZnMgKi8KLQljaGFyICpyOwotCWZvciAociA9IHAtPnJlZnM7ICpyOyByKyspCi0JICB7Ci0JICAgIGlmICgqciA9PSAnMCcpIHByaW50ZigiICAgICAgQ1JFRigwKTtcbiIpOyAKLQkgICAgaWYgKCpyID09ICc4JykgcHJpbnRmKCIgICAgICBDUkVGKDgpO1xuIik7IAotCSAgICBpZiAoKnIgPT0gJzknKSBwcmludGYoIiAgICAgIENSRUYoOSk7XG4iKTsgCi0JICAgIGlmICgqciA9PSAnbicpIHByaW50ZigiICAgICAgQ1JFRihuKTtcbiIpOyAKLQkgICAgaWYgKCpyID09ICdtJykgcHJpbnRmKCIgICAgICBDUkVGKG0pO1xuIik7IAotCSAgfQotICAgICAgfQotCi0gICAgICBwcmludGYgKCIgICAgICB7XG4iKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfTlJfU1RVRkY7IGorKykKLQl7Ci0JICBpZiAocC0+c3R1ZmZbal0pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgICAgICAgICVzXG4iLCBwLT5zdHVmZltqXSk7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCIgICAgICB9XG4iKTsKLQotICAgICAgewotCS8qIERvIHRoZSBkZWZzICovCi0JY2hhciAqcjsKLQlmb3IgKHIgPSBwLT5kZWZzOyAqcjsgcisrKSAKLQkgIHsKLQkgICAgaWYgKCpyID09ICcwJykgcHJpbnRmKCIgICAgICBDREVGKDApO1xuIik7IAotCSAgICBpZiAoKnIgPT0gJ24nKSBwcmludGYoIiAgICAgIENERUYobik7XG4iKTsgCi0JICAgIGlmICgqciA9PSAnbScpIHByaW50ZigiICAgICAgQ0RFRihtKTtcbiIpOyAKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcHJpbnRmICgiICAgICAgYnJlYWs7XG4iKTsKLSAgICAgIHByaW50ZiAoIiAgICB9XG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5zaW0gKCkKLXsKLSAgcHJpbnRmICgie1xuIik7Ci0gIHByaW50ZiAoIiAgc3dpdGNoIChqdW1wX3RhYmxlW2l3b3JkXSkge1xuIik7Ci0KLSAgZ2Vuc2ltX2Nhc2VsaXN0ICh0YWIpOwotICBnZW5zaW1fY2FzZWxpc3QgKG1vdnN4eV90YWIpOwotCi0gIHByaW50ZiAoIiAgZGVmYXVsdDpcbiIpOwotICBwcmludGYgKCIgICAge1xuIik7Ci0gIHByaW50ZiAoIiAgICAgIFJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTtcbiIpOwotICBwcmludGYgKCIgICAgfVxuIik7Ci0gIHByaW50ZiAoIiAgfVxuIik7Ci0gIHByaW50ZiAoIn1cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuZGVmaW5lcyAoKQotewotICBvcCAqcDsKLSAgZmlsbHRhYmxlICh0YWIpOwotICBmb3IgKHAgPSB0YWI7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBjaGFyICpzID0gcC0+bmFtZTsKLSAgICAgIHByaW50ZiAoIiNkZWZpbmUgT1BDXyIpOwotICAgICAgd2hpbGUgKCpzKSB7Ci0JaWYgKGlzdXBwZXIoKnMpKSAKLQkgICpzID0gdG9sb3dlcigqcyk7Ci0JaWYgKGlzYWxwaGEoKnMpKSBwcmludGYoIiVjIiwgKnMpOwotCWlmICgqcyA9PSAnICcpIHByaW50ZigiXyIpOwotCWlmICgqcyA9PSAnQCcpIHByaW50ZigiaW5kXyIpOwotCWlmICgqcyA9PSAnLCcpIHByaW50ZigiXyIpOwotCXMrKzsKLSAgICAgIH0KLSAgICAgIHByaW50ZigiICVkXG4iLHAtPmluZGV4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcHBpX2luZGV4OwotCi0vKiBUYWtlIGFuIHBwaSBjb2RlLCBleHBhbmQgYWxsIHZhcnlpbmcgZmllbGRzIGluIGl0IGFuZCBmaWxsIGFsbCB0aGUKLSAgIHJpZ2h0IGVudHJpZXMgaW4gJ3RhYmxlJyB3aXRoIHRoZSBvcGNvZGUgaW5kZXguICAqLwotCi1zdGF0aWMgdm9pZAotZXhwYW5kX3BwaV9jb2RlICh2YWwsIGksIHMpCi0gICAgIGludCB2YWw7Ci0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbnQgajsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHN3aXRjaCAoc1swXSkKLQl7Ci0JLyogVGhlIGxhc3QgZWlnaHQgYml0cyBhcmUgZGlzcmVnYXJkZWQgZm9yIHRoZSBzd2l0Y2ggdGFibGUuICAqLwotCWNhc2UgJ20nOgotCWNhc2UgJ3gnOgotCWNhc2UgJy4nOgotCSAgdGFibGVbdmFsXSA9IGk7Ci0JICByZXR1cm47Ci0JY2FzZSAnMCc6Ci0JICB2YWwgKz0gdmFsOwotCSAgcysrOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2YWwgKz0gdmFsICsgMTsKLQkgIHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCWNhc2UgJ2UnOiBjYXNlICdmJzoKLQkgIHZhbCArPSB2YWw7Ci0JICBzKys7Ci0JICBleHBhbmRfcHBpX2NvZGUgKHZhbCwgaSwgcyk7Ci0JICB2YWwrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgdmFsIDw8PSAyOwotCSAgcyArPSAyOwotCSAgdmFsKys7Ci0JICBleHBhbmRfcHBpX2NvZGUgKHZhbCwgcHBpX2luZGV4KyssIHMpOwotCSAgdmFsKys7Ci0JICBleHBhbmRfcHBpX2NvZGUgKHZhbCwgaSwgcyk7Ci0JICB2YWwrKzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcGlfZmlsbHRhYmxlICgpCi17Ci0gIG9wICpwOwotICBwcGlfaW5kZXggPSAxOwotCi0gIGZvciAocCA9IHBwaV90YWI7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBwLT5pbmRleCA9IHBwaV9pbmRleCsrOwotICAgICAgZXhwYW5kX3BwaV9jb2RlICgwLCBwLT5pbmRleCwgcC0+Y29kZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHBpX2dlbnNpbSAoKQotewotICBvcCAqcCA9IHBwaV90YWI7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBEU1JfTUFTS19HIDB4ODBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIERTUl9NQVNLX1ogMHg0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgRFNSX01BU0tfTiAweDIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBEU1JfTUFTS19WIDB4MTBcbiIpOwotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENPTVBVVEVfT1ZFUkZMT1cgZG8ge1xcXG4iKTsKLSAgcHJpbnRmICgiICBvdmVyZmxvdyA9IHJlc19ncmQgIT0gU0lHTjMyIChyZXMpID8gRFNSX01BU0tfViA6IDA7IFxcXG4iKTsKLSAgcHJpbnRmICgiICBpZiAob3ZlcmZsb3cgJiYgUykgXFxcbiIpOwotICBwcmludGYgKCIgICAgeyBcXFxuIik7Ci0gIHByaW50ZiAoIiAgICAgIGlmIChyZXNfZ3JkICYgMHg4MCkgXFxcbiIpOwotICBwcmludGYgKCIgICAgICAgIHsgXFxcbiIpOwotICBwcmludGYgKCIgICAgICAgICAgcmVzID0gMHg4MDAwMDAwMDsgXFxcbiIpOwotICBwcmludGYgKCIgICAgICAgICAgcmVzX2dyZCB8PSAgMHhmZjsgXFxcbiIpOwotICBwcmludGYgKCIgICAgICAgIH0gXFxcbiIpOwotICBwcmludGYgKCIgICAgICBlbHNlIFxcXG4iKTsKLSAgcHJpbnRmICgiICAgICAgICB7IFxcXG4iKTsKLSAgcHJpbnRmICgiICAgICAgICAgIHJlcyA9IDB4N2ZmZmZmZmY7IFxcXG4iKTsKLSAgcHJpbnRmICgiICAgICAgICAgIHJlc19ncmQgJj0gfjB4ZmY7IFxcXG4iKTsKLSAgcHJpbnRmICgiICAgICAgICB9IFxcXG4iKTsKLSAgcHJpbnRmICgiICAgICAgb3ZlcmZsb3cgPSAwOyBcXFxuIik7Ci0gIHByaW50ZiAoIiAgICB9IFxcXG4iKTsKLSAgcHJpbnRmICgifSB3aGlsZSAoMClcbiIpOwotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFERF9TVUJfR0UgXFxcbiIpOwotICBwcmludGYgKCIgIChncmVhdGVyX2VxdWFsID0gfihvdmVyZmxvdyA8PCAzICYgcmVzX2dyZCkgJiBEU1JfTUFTS19HKVxuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoInN0YXRpYyB2b2lkXG4iKTsKLSAgcHJpbnRmICgicHBpX2luc24gKGl3b3JkKVxuIik7Ci0gIHByaW50ZiAoIiAgICAgaW50IGl3b3JkO1xuIik7Ci0gIHByaW50ZiAoIntcbiIpOwotICBwcmludGYgKCIgIHN0YXRpYyBjaGFyIGVfdGFiW10gPSB7IDgsICA5LCAxMCwgIDV9O1xuIik7Ci0gIHByaW50ZiAoIiAgc3RhdGljIGNoYXIgZl90YWJbXSA9IHsxMCwgMTEsICA4LCAgNX07XG4iKTsKLSAgcHJpbnRmICgiICBzdGF0aWMgY2hhciB4X3RhYltdID0geyA4LCAgOSwgIDcsICA1fTtcbiIpOwotICBwcmludGYgKCIgIHN0YXRpYyBjaGFyIHlfdGFiW10gPSB7MTAsIDExLCAxMiwgMTR9O1xuIik7Ci0gIHByaW50ZiAoIiAgc3RhdGljIGNoYXIgZ190YWJbXSA9IHsxMiwgMTQsICA3LCAgNX07XG4iKTsKLSAgcHJpbnRmICgiICBzdGF0aWMgY2hhciB1X3RhYltdID0geyA4LCAxMCwgIDcsICA1fTtcbiIpOwotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCIgIGludCB6O1xuIik7Ci0gIHByaW50ZiAoIiAgaW50IHJlcywgcmVzX2dyZDtcbiIpOwotICBwcmludGYgKCIgIGludCBjYXJyeSwgb3ZlcmZsb3csIGdyZWF0ZXJfZXF1YWw7XG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgiICBzd2l0Y2ggKHBwaV90YWJsZVtpd29yZCA+PiA4XSkge1xuIik7Ci0KLSAgZm9yICg7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBpbnQgc2hpZnQsIGo7Ci0gICAgICBpbnQgY29uZCA9IDA7Ci0gICAgICBpbnQgaGF2ZWRlY2wgPSAwOwotICAgICAgCi0gICAgICBjaGFyICpzID0gcC0+Y29kZTsKLQotICAgICAgcHJpbnRmICgiICAvKiAlcyAlcyAqL1xuIiwgcC0+bmFtZSwgcC0+Y29kZSk7Ci0gICAgICBwcmludGYgKCIgIGNhc2UgJWQ6ICAgICAgXG4iLCBwLT5pbmRleCk7Ci0KLSAgICAgIHByaW50ZiAoIiAgICB7XG4iKTsKLSAgICAgIGZvciAoc2hpZnQgPSAxNjsgKnM7ICkKLQl7Ci0JICBzd2l0Y2ggKCpzKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCBpID0gKGl3b3JkID4+IDQpICYgMHg3ZjtcbiIpOwotCSAgICAgIHMgKz0gNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZSc6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICd4JzoKLQkgICAgY2FzZSAneSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICd1JzoKLQkgICAgICBzaGlmdCAtPSAyOwotCSAgICAgIHByaW50ZiAoIiAgICAgIGludCAlYyA9ICVjX3RhYlsoaXdvcmQgPj4gJWQpICYgM107XG4iLAotCQkgICAgICAqcywgKnMsIHNoaWZ0KTsKLQkgICAgICBoYXZlZGVjbCA9IDE7Ci0JICAgICAgcyArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdjJzoKLQkgICAgICBwcmludGYgKCIgICAgICBpZiAoKCgoaXdvcmQgPj4gOCkgXiBEU1IpICYgMSkgPT0gMClcbiIpOwotCSAgICAgIHByaW50ZiAoIlx0YnJlYWs7XG4iKTsKLQkgICAgICBwcmludGYgKCIgICAgfVxuIik7Ci0JICAgICAgcHJpbnRmICgiICBjYXNlICVkOiAgICAgIFxuIiwgcC0+aW5kZXggKyAxKTsKLQkgICAgICBwcmludGYgKCIgICAge1xuIik7Ci0JICAgICAgY29uZCA9IDE7Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnLic6Ci0JICAgICAgc2hpZnQgLT0gMjsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3onOgotCSAgICAgIGlmIChoYXZlZGVjbCkKLQkJcHJpbnRmICgiXG4iKTsKLQkgICAgICBwcmludGYgKCIgICAgICB6ID0gaXdvcmQgJiAweGY7XG4iKTsKLQkgICAgICBoYXZlZGVjbCA9IDI7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGhhdmVkZWNsID09IDEpCi0JcHJpbnRmICgiXG4iKTsKLSAgICAgIGVsc2UgaWYgKGhhdmVkZWNsID09IDIpCi0JcHJpbnRmICgiICAgICAge1xuIik7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05SX1NUVUZGOyBqKyspCi0JewotCSAgaWYgKHAtPnN0dWZmW2pdKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICAgICAgJXMlc1xuIiwKLQkJICAgICAgKGhhdmVkZWNsID09IDIgPyAiICAiIDogIiIpLAotCQkgICAgICBwLT5zdHVmZltqXSk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoaGF2ZWRlY2wgPT0gMikKLQlwcmludGYgKCIgICAgICB9XG4iKTsKLSAgICAgIGlmIChjb25kKQotCXsKLQkgIHByaW50ZiAoIiAgICAgIGlmIChpd29yZCAmIDB4MjAwKVxuIik7Ci0JICBwcmludGYgKCIgICAgICAgIGdvdG8gYXNzaWduX3o7XG4iKTsKLQl9Ci0gICAgICBwcmludGYgKCIgICAgICBicmVhaztcbiIpOwotICAgICAgcHJpbnRmICgiICAgIH1cbiIpOwotICAgIH0KLQotICBwcmludGYgKCIgIGRlZmF1bHQ6XG4iKTsKLSAgcHJpbnRmICgiICAgIHtcbiIpOwotICBwcmludGYgKCIgICAgICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7XG4iKTsKLSAgcHJpbnRmICgiICAgICAgcmV0dXJuO1xuIik7Ci0gIHByaW50ZiAoIiAgICB9XG4iKTsKLSAgcHJpbnRmICgiICB9XG4iKTsKLSAgcHJpbnRmICgiICBEU1IgJj0gfjB4ZjE7XG4iKTsKLSAgcHJpbnRmICgiICBpZiAocmVzIHx8IHJlc19ncmQpXG4iKTsKLSAgcHJpbnRmICgiICAgIERTUiB8PSBncmVhdGVyX2VxdWFsIHwgcmVzX2dyZCA+PiAyICYgRFNSX01BU0tfTiB8IG92ZXJmbG93O1xuIik7Ci0gIHByaW50ZiAoIiAgZWxzZVxuIik7Ci0gIHByaW50ZiAoIiAgICBEU1IgfD0gRFNSX01BU0tfWiB8IG92ZXJmbG93O1xuIik7Ci0gIHByaW50ZiAoIiBhc3NpZ25fZGM6XG4iKTsKLSAgcHJpbnRmICgiICBzd2l0Y2ggKERTUiA+PiAxICYgNylcbiIpOwotICBwcmludGYgKCIgICAge1xuIik7Ci0gIHByaW50ZiAoIiAgICBjYXNlIDA6IC8qIENhcnJ5IE1vZGUgKi9cbiIpOwotICBwcmludGYgKCIgICAgICBEU1IgfD0gY2Fycnk7XG4iKTsKLSAgcHJpbnRmICgiICAgIGNhc2UgMTogLyogTmVnYXRpdmUgVmFsdWUgTW9kZSAqL1xuIik7Ci0gIHByaW50ZiAoIiAgICAgIERTUiB8PSByZXNfZ3JkID4+IDcgJiAxO1xuIik7Ci0gIHByaW50ZiAoIiAgICBjYXNlIDI6IC8qIFplcm8gVmFsdWUgTW9kZSAqL1xuIik7Ci0gIHByaW50ZiAoIiAgICAgIERTUiB8PSBEU1IgPj4gNiAmIDE7XG4iKTsKLSAgcHJpbnRmICgiICAgIGNhc2UgMzogLyogT3ZlcmZsb3cgbW9kZVxuIik7Ci0gIHByaW50ZiAoIiAgICAgIERTUiB8PSBvdmVyZmxvdyA+PiA0O1xuIik7Ci0gIHByaW50ZiAoIiAgICBjYXNlIDQ6IC8qIFNpZ25lZCBHcmVhdGVyIFRoYW4gTW9kZSAqL1xuIik7Ci0gIHByaW50ZiAoIiAgICAgIERTUiB8PSBEU1IgPj4gNyAmIDE7XG4iKTsKLSAgcHJpbnRmICgiICAgIGNhc2UgNDogLyogU2lnbmVkIEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBNb2RlICovXG4iKTsKLSAgcHJpbnRmICgiICAgICAgRFNSIHw9IGdyZWF0ZXJfZXF1YWwgPj4gNztcbiIpOwotICBwcmludGYgKCIgICAgfVxuIik7Ci0gIHByaW50ZiAoIiBhc3NpZ25fejpcbiIpOwotICBwcmludGYgKCIgIGlmICgweGEwNWYgPj4geiAmIDEpXG4iKTsKLSAgcHJpbnRmICgiICAgIHtcbiIpOwotICBwcmludGYgKCIgICAgICBSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7XG4iKTsKLSAgcHJpbnRmICgiICAgICAgcmV0dXJuO1xuIik7Ci0gIHByaW50ZiAoIiAgICB9XG4iKTsKLSAgcHJpbnRmICgiICBEU1BfUiAoeikgPSByZXM7XG4iKTsKLSAgcHJpbnRmICgiICBEU1BfR1JEICh6KSA9IHJlc19ncmQ7XG4iKTsKLSAgcHJpbnRmICgifVxuIik7Ci19Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgLyogdmVyaWZ5IHRoZSB0YWJsZSBiZWZvcmUgYW55dGhpbmcgZWxzZSAqLwotICB7Ci0gICAgb3AgKnA7Ci0gICAgZm9yIChwID0gdGFiOyBwLT5uYW1lOyBwKyspCi0gICAgICB7Ci0JLyogY2hlY2sgdGhhdCB0aGUgY29kZSBmaWVsZCBjb250YWlucyAxNiBiaXRzICovCi0JaWYgKHN0cmxlbiAocC0+Y29kZSkgIT0gMTYpCi0JICB7Ci0JICAgIGZwcmludGYgKHN0ZGVyciwgIkNvZGUgYCVzJyBsZW5ndGggd3JvbmcgKCVkKSBmb3IgYCVzJ1xuIiwKLQkJICAgICBwLT5jb2RlLCBzdHJsZW4gKHAtPmNvZGUpLCBwLT5uYW1lKTsKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBub3cgZ2VuZXJhdGUgdGhlIHJlcXVlc3RlZCBkYXRhICovCi0gIGlmIChhYyA+IDEpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXZbMV0sICItdCIpID09IDApCi0JewotCSAgZ2VuZ2FzdGFiICgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXZbMV0sICItZCIpID09IDApCi0JewotCSAgZ2VuZGVmaW5lcyAoKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGF2WzFdLCAiLXMiKSA9PSAwKQotCXsKLQkgIGZpbGx0YWJsZSAodGFiKTsKLQkgIGR1bXB0YWJsZSAoInNoX2p1bXBfdGFibGUiLCAxIDw8IDE2LCAwKTsKLQotCSAgbWVtc2V0ICh0YWJsZSwgMCwgc2l6ZW9mIHRhYmxlKTsKLQkgIGZpbGx0YWJsZSAobW92c3h5X3RhYik7Ci0JICBwcGlfbW92ZXMgKCk7Ci0JICBkdW1wdGFibGUgKCJzaF9kc3BfdGFibGUiLCAxIDw8IDEyLCAweGYwMDApOwotCi0JICBtZW1zZXQgKHRhYmxlLCAwLCBzaXplb2YgdGFibGUpOwotCSAgcHBpX2ZpbGx0YWJsZSAoKTsKLQkgIGR1bXB0YWJsZSAoInBwaV90YWJsZSIsIDEgPDwgOCwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhdlsxXSwgIi14IikgPT0gMCkKLQl7Ci0JICBmaWxsdGFibGUgKHRhYik7Ci0JICBmaWxsdGFibGUgKG1vdnN4eV90YWIpOwotCSAgZ2Vuc2ltICgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXZbMV0sICItcCIpID09IDApCi0JewotCSAgcHBpX2ZpbGx0YWJsZSAoKTsKLQkgIHBwaV9nZW5zaW0gKCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIk9wY29kZSB0YWJsZSBnZW5lcmF0aW9uIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4iKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zaW0vc2gvaW50ZXJwLmMgYi9zaW0vc2gvaW50ZXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDQyMjcuLjAwMDAwMDAKLS0tIGEvc2ltL3NoL2ludGVycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5MCArMCwwIEBACi0vKiBTaW11bGF0b3IgZm9yIHRoZSBIaXRhY2hpIFNIIGFyY2hpdGVjdHVyZS4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLSAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFNIIHNpbQotCi0KLQkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKLQotICAgQ3lnbnVzIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBDeWdudXMKLSAgIG1ha2VzIG5vIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlCi0gICBhbmQgdGhlIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCi0KLSAgIENZR05VUyBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQgVE8KLSAgIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKLQotLyogVGhpcyBmaWxlIGlzIGxvY2FsIC0gaWYgbmV3bGliIGNoYW5nZXMsIHRoZW4gc28gc2hvdWxkIHRoaXMuICAqLwotI2luY2x1ZGUgInN5c2NhbGwuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPGZsb2F0Lmg+CQkvKiBOZWVkZWQgZm9yIF9pc25hbigpICovCi0jZGVmaW5lIGlzbmFuIF9pc25hbgotI2VuZGlmCi0KLSNpZm5kZWYgU0lHQlVTCi0jZGVmaW5lIFNJR0JVUyBTSUdTRUdWCi0jZW5kaWYKLQotI2lmbmRlZiBTSUdRVUlUCi0jZGVmaW5lIFNJR1FVSVQgU0lHVEVSTQotI2VuZGlmCi0KLSNpZm5kZWYgU0lHVFJBUAotI2RlZmluZSBTSUdUUkFQIDUKLSNlbmRpZgotCi1leHRlcm4gdW5zaWduZWQgY2hhciBzaF9qdW1wX3RhYmxlW10sIHNoX2RzcF90YWJsZVsweDEwMDBdLCBwcGlfdGFibGVbXTsKLQotI2RlZmluZSBPX1JFQ09NUElMRSA4NQotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNkZWZpbmUgRElTQVNTRU1CTEVSX1RBQkxFCi0KLS8qIERlZmluZSB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgc2ltdWxhdG9yIHNob3VsZCBwb2xsIHRoZSBob3N0Ci0gICBmb3IgYSBxdWl0LiAqLwotI2RlZmluZSBQT0xMX1FVSVRfSU5URVJWQUwgMHg2MDAwMAotCi10eXBlZGVmIHVuaW9uCi17Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBpbnQgcmVnc1sxNl07Ci0gICAgaW50IHBjOwotCi0gICAgLyogU3lzdGVtIHJlZ2lzdGVycy4gIEZvciBzaC1kc3AgdGhpcyBhbHNvIGluY2x1ZGVzIEEwIC8gWDAgLyBYMSAvIFkwIC8gWTEKLSAgICAgICB3aGljaCBhcmUgbG9jYXRlZCBpbiBmcmVncywgaS5lLiBzdHJpY3RseSBzcGVha2luZywgdGhlc2UgYXJlCi0gICAgICAgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvZiBzcmVncy5pIC4gIFRoaXMgd2FydCBvZiB0aGUgY29kZSBjb3VsZCBiZQotICAgICAgIGZpeGVkIGJ5IG1ha2luZyBmcmVncyBwYXJ0IG9mIHNyZWdzLCBhbmQgaW5jbHVkaW5nIHBjIHRvbyAtIHRvIGF2b2lkCi0gICAgICAgYWxpZ25tZW50IHJlcGVyY3Vzc2lvbnMgLSBidXQgdGhpcyB3b3VsZCBjYXVzZSB2ZXJ5IG9uZXJvdXMgdW5pb24gLwotICAgICAgIHN0cnVjdHVyZSBuZXN0aW5nLCB3aGljaCB3b3VsZCBvbmx5IGJlIG1hbmFnYWJsZSB3aXRoIGFub255bW91cwotICAgICAgIHVuaW9ucyBhbmQgc3RydWN0cy4gICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzdHJ1Y3QKLQkgIHsKLQkgICAgaW50IG1hY2g7Ci0JICAgIGludCBtYWNsOwotCSAgICBpbnQgcHI7Ci0JICAgIGludCBkdW1teTMsIGR1bW15NDsKLQkgICAgaW50IGZwdWw7IC8qIEExIGZvciBzaC1kc3AgLSAgYnV0IG9ubHkgZm9yIG1vdnMgZXRjLiAgKi8KLQkgICAgaW50IGZwc2NyOyAvKiBkc3IgZm9yIHNoLWRzcCAqLwotCSAgfSBuYW1lZDsKLQlpbnQgaVs3XTsKLSAgICAgIH0gc3JlZ3M7Ci0KLSAgICAvKiBzaDNlIC8gc2gtZHNwICovCi0gICAgdW5pb24gZnJlZ3NfdQotICAgICAgewotCWZsb2F0IGZbMTZdOwotCWRvdWJsZSBkWzhdOwotCWludCBpWzE2XTsKLSAgICAgIH0KLSAgICBmcmVnc1syXTsKLQotICAgIC8qIENvbnRyb2wgcmVnaXN0ZXJzOyBvbiB0aGUgU0g0LCBsZGMgLyBzdGMgaXMgcHJpdmlsZWdlZCwgZXhjZXB0IHdoZW4KLSAgICAgICBhY2Nlc3NpbmcgZ2JyLiAgKi8KLSAgICB1bmlvbgotICAgICAgewotCXN0cnVjdAotCSAgewotCSAgICBpbnQgc3I7Ci0JICAgIGludCBnYnI7Ci0JICAgIGludCB2YnI7Ci0JICAgIGludCBzc3I7Ci0JICAgIGludCBzcGM7Ci0JICAgIGludCBtb2Q7Ci0JICAgIC8qIHNoLWRzcCAqLwotCSAgICBpbnQgcnM7Ci0JICAgIGludCByZTsKLQkgICAgLyogc2gzICovCi0JICAgIGludCBiYW5rWzhdOwotCSAgfSBuYW1lZDsKLQlpbnQgaVsxNl07Ci0gICAgICB9IGNyZWdzOwotCi0gICAgdW5zaWduZWQgY2hhciAqaW5zbl9lbmQ7Ci0KLSAgICBpbnQgdGlja3M7Ci0gICAgaW50IHN0YWxsczsKLSAgICBpbnQgbWVtc3RhbGxzOwotICAgIGludCBjeWNsZXM7Ci0gICAgaW50IGluc3RzOwotCi0gICAgaW50IHByZXZsb2NrOwotICAgIGludCB0aGlzbG9jazsKLSAgICBpbnQgZXhjZXB0aW9uOwotCi0gICAgaW50IGVuZF9vZl9yZWdpc3RlcnM7Ci0KLSAgICBpbnQgbXNpemU7Ci0jZGVmaW5lIFBST0ZJTEVfRlJFUSAxCi0jZGVmaW5lIFBST0ZJTEVfU0hJRlQgMgotICAgIGludCBwcm9maWxlOwotICAgIHVuc2lnbmVkIHNob3J0ICpwcm9maWxlX2hpc3Q7Ci0gICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgIGludCB4eXJhbV9zZWxlY3QsIHhyYW1fc3RhcnQsIHlyYW1fc3RhcnQ7Ci0gICAgdW5zaWduZWQgY2hhciAqeG1lbTsKLSAgICB1bnNpZ25lZCBjaGFyICp5bWVtOwotICAgIHVuc2lnbmVkIGNoYXIgKnhtZW1fb2Zmc2V0OwotICAgIHVuc2lnbmVkIGNoYXIgKnltZW1fb2Zmc2V0OwotICB9Ci0gIGFzcmVnczsKLSAgaW50IGFzaW50c1s0MF07Ci19IHNhdmVkX3N0YXRlX3R5cGU7Ci0KLXNhdmVkX3N0YXRlX3R5cGUgc2F2ZWRfc3RhdGU7Ci0KLXN0cnVjdCBsb29wX2JvdW5kcyB7IHVuc2lnbmVkIGNoYXIgKnN0YXJ0LCAqZW5kOyB9OwotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGF0IGZpbGUgc2NvcGUgc28gdGhhdCBmdW5jdGlvbnMgb3RoZXIgdGhhbgotICAgc2ltX3Jlc3VtZSBjYW4gdXNlIHRoZSBmZXRjaC9zdG9yZSBtYWNyb3MgKi8KLQotc3RhdGljIGludCB0YXJnZXRfbGl0dGxlX2VuZGlhbjsKLXN0YXRpYyBpbnQgZ2xvYmFsX2VuZGlhbncsIGVuZGlhbmI7Ci1zdGF0aWMgaW50IHRhcmdldF9kc3A7Ci1zdGF0aWMgaW50IGhvc3RfbGl0dGxlX2VuZGlhbjsKLQotI2lmIDEKLXN0YXRpYyBpbnQgbWFza3cgPSAwOwotI2VuZGlmCi0KLXN0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOwotc3RhdGljIGNoYXIgKm15bmFtZTsKLQotCi0vKiBTaG9ydCBoYW5kIGRlZmluaXRpb25zIG9mIHRoZSByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBTQklUKHgpICgoeCkmc2JpdCkKLSNkZWZpbmUgUjAgCXNhdmVkX3N0YXRlLmFzcmVncy5yZWdzWzBdCi0jZGVmaW5lIFJuIAlzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1tuXQotI2RlZmluZSBSbSAJc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbbV0KLSNkZWZpbmUgVVIwIAkodW5zaWduZWQgaW50KShzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1swXSkKLSNkZWZpbmUgVVIgCSh1bnNpZ25lZCBpbnQpUgotI2RlZmluZSBVUiAJKHVuc2lnbmVkIGludClSCi0jZGVmaW5lIFNSMCAJc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbMF0KLSNkZWZpbmUgQ1JFRyhuKQkoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLmlbKG4pXSkKLSNkZWZpbmUgR0JSIAlzYXZlZF9zdGF0ZS5hc3JlZ3MuY3JlZ3MubmFtZWQuZ2JyCi0jZGVmaW5lIFZCUiAJc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnZicgotI2RlZmluZSBTU1IJc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNzcgotI2RlZmluZSBTUEMJc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNwYwotI2RlZmluZSBTUkVHKG4pCShzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MuaVsobildKQotI2RlZmluZSBNQUNIIAlzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQubWFjaAotI2RlZmluZSBNQUNMIAlzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQubWFjbAotI2RlZmluZSBQUglzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQucHIKLSNkZWZpbmUgRlBVTAlzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQuZnB1bAotCi0jZGVmaW5lIFBDIGluc25fcHRyCi0KLQotCi0vKiBBbHRlcm5hdGUgYmFuayBvZiByZWdpc3RlcnMgcjAtcjcgKi8KLQotLyogTm90ZTogY29kZSBjb250cm9saW5nIFNSIGhhbmRsZXMgZmxpcHMgYmV0d2VlbiBCQU5LMCBhbmQgQkFOSzEgKi8KLSNkZWZpbmUgUm5fQkFOSyhuKSAoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLmJhbmtbKG4pXSkKLSNkZWZpbmUgU0VUX1JuX0JBTksobiwgRVhQKSBkbyB7IHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5iYW5rWyhuKV0gPSAoRVhQKTsgfSB3aGlsZSAoMCkKLQotCi0vKiBNYW5pcHVsYXRlIFNSICovCi0KLSNkZWZpbmUgU1JfTUFTS19ETVkgKDEgPDwgMTEpCi0jZGVmaW5lIFNSX01BU0tfRE1YICgxIDw8IDEwKQotI2RlZmluZSBTUl9NQVNLX00gKDEgPDwgOSkKLSNkZWZpbmUgU1JfTUFTS19RICgxIDw8IDgpCi0jZGVmaW5lIFNSX01BU0tfSSAoMHhmIDw8IDQpCi0jZGVmaW5lIFNSX01BU0tfUyAoMSA8PCAxKQotI2RlZmluZSBTUl9NQVNLX1QgKDEgPDwgMCkKLQotI2RlZmluZSBTUl9NQVNLX0JMICgxIDw8IDI4KQotI2RlZmluZSBTUl9NQVNLX1JCICgxIDw8IDI5KQotI2RlZmluZSBTUl9NQVNLX01EICgxIDw8IDMwKQotI2RlZmluZSBTUl9NQVNLX1JDIDB4MGZmZjAwMDAKLSNkZWZpbmUgU1JfUkNfSU5DUkVNRU5UIC0weDAwMDEwMDAwCi0KLSNkZWZpbmUgTSAJKChzYXZlZF9zdGF0ZS5hc3JlZ3MuY3JlZ3MubmFtZWQuc3IgJiBTUl9NQVNLX00pICE9IDApCi0jZGVmaW5lIFEgCSgoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyICYgU1JfTUFTS19RKSAhPSAwKQotI2RlZmluZSBTIAkoKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAmIFNSX01BU0tfUykgIT0gMCkKLSNkZWZpbmUgVCAJKChzYXZlZF9zdGF0ZS5hc3JlZ3MuY3JlZ3MubmFtZWQuc3IgJiBTUl9NQVNLX1QpICE9IDApCi0KLSNkZWZpbmUgU1JfQkwgKChzYXZlZF9zdGF0ZS5hc3JlZ3MuY3JlZ3MubmFtZWQuc3IgJiBTUl9NQVNLX0JMKSAhPSAwKQotI2RlZmluZSBTUl9SQiAoKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAmIFNSX01BU0tfUkIpICE9IDApCi0jZGVmaW5lIFNSX01EICgoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyICYgU1JfTUFTS19NRCkgIT0gMCkKLSNkZWZpbmUgU1JfRE1ZICgoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyICYgU1JfTUFTS19ETVkpICE9IDApCi0jZGVmaW5lIFNSX0RNWCAoKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAmIFNSX01BU0tfRE1YKSAhPSAwKQotI2RlZmluZSBTUl9SQyAoKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAmIFNSX01BU0tfUkMpKQotCi0vKiBOb3RlOiBkb24ndCB1c2UgdGhpcyBmb3IgcHJpdmlsZWdlZCBiaXRzICovCi0jZGVmaW5lIFNFVF9TUl9CSVQoRVhQLCBCSVQpIFwKLWRvIHsgXAotICBpZiAoKEVYUCkgJiAxKSBcCi0gICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyIHw9IChCSVQpOyBcCi0gIGVsc2UgXAotICAgIHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAmPSB+KEJJVCk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VUX1NSX00oRVhQKSBTRVRfU1JfQklUICgoRVhQKSwgU1JfTUFTS19NKQotI2RlZmluZSBTRVRfU1JfUShFWFApIFNFVF9TUl9CSVQgKChFWFApLCBTUl9NQVNLX1EpCi0jZGVmaW5lIFNFVF9TUl9TKEVYUCkgU0VUX1NSX0JJVCAoKEVYUCksIFNSX01BU0tfUykKLSNkZWZpbmUgU0VUX1NSX1QoRVhQKSBTRVRfU1JfQklUICgoRVhQKSwgU1JfTUFTS19UKQotCi0vKiBzdGMgY3VycmVudGx5IHJlbGllcyBvbiBiZWluZyBhYmxlIHRvIHJlYWQgU1Igd2l0aG91dCBtb2RpZmljYXRpb25zLiAgKi8KLSNkZWZpbmUgR0VUX1NSKCkgKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciAtIDApCi0KLSNkZWZpbmUgU0VUX1NSKHgpIHNldF9zciAoeCkKLQotI2RlZmluZSBTRVRfUkMoeCkgXAotICAoc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyIFwKLSAgID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnNyICYgMHhmMDAwZmZmZiB8ICgoeCkgJiAweGZmZikgPDwgMTYpCi0KLS8qIE1hbmlwdWxhdGUgRlBTQ1IgKi8KLQotI2RlZmluZSBGUFNDUl9NQVNLX0ZSICgxIDw8IDIxKQotI2RlZmluZSBGUFNDUl9NQVNLX1NaICgxIDw8IDIwKQotI2RlZmluZSBGUFNDUl9NQVNLX1BSICgxIDw8IDE5KQotCi0jZGVmaW5lIEZQU0NSX0ZSICAoKEdFVF9GUFNDUigpICYgRlBTQ1JfTUFTS19GUikgIT0gMCkKLSNkZWZpbmUgRlBTQ1JfU1ogICgoR0VUX0ZQU0NSKCkgJiBGUFNDUl9NQVNLX1NaKSAhPSAwKQotI2RlZmluZSBGUFNDUl9QUiAgKChHRVRfRlBTQ1IoKSAmIEZQU0NSX01BU0tfUFIpICE9IDApCi0KLXN0YXRpYyB2b2lkCi1zZXRfZnBzY3IxICh4KQotCWludCB4OwotewotICBpbnQgb2xkID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnNyZWdzLm5hbWVkLmZwc2NyOwotICBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQuZnBzY3IgPSAoeCk7Ci0gIC8qIHN3YXAgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGJhbmtzICovCi0gIGlmICgoc2F2ZWRfc3RhdGUuYXNyZWdzLnNyZWdzLm5hbWVkLmZwc2NyIF4gb2xkKSAmIEZQU0NSX01BU0tfRlIKLSAgICAgIC8qIElnbm9yZSBiaXQgY2hhbmdlIGlmIHNpbXVsYXRpbmcgc2gtZHNwLiAgKi8KLSAgICAgICYmICEgdGFyZ2V0X2RzcCkKLSAgICB7Ci0gICAgICB1bmlvbiBmcmVnc191IHRtcGYgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMF07Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMF0gPSBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMV07Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMV0gPSB0bXBmOwotICAgIH0KLX0KLQotLyogc3RzIHJlbGllcyBvbiBiZWluZyBhYmxlIHRvIHJlYWQgZnBzY3IgZGlyZWN0bHkuICAqLwotI2RlZmluZSBHRVRfRlBTQ1IoKSAgKHNhdmVkX3N0YXRlLmFzcmVncy5zcmVncy5uYW1lZC5mcHNjcikKLSNkZWZpbmUgU0VUX0ZQU0NSKHgpIFwKLWRvIHsgXAotICBzZXRfZnBzY3IxICh4KTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBEU1IgIChzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MubmFtZWQuZnBzY3IpCi0KLWludCAKLWZhaWwgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNkZWZpbmUgUkFJU0VfRVhDRVBUSU9OKHgpIFwKLSAgKHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPSB4LCBzYXZlZF9zdGF0ZS5hc3JlZ3MuaW5zbl9lbmQgPSAwKQotCi0vKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBtYWlubHkgZm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgYSBicmVha3BvaW50IHRvCi0gICBjYXRjaCBzaW11bGF0ZWQgYnVzIGVycm9ycyB3aGVuIHJ1bm5pbmcgdGhlIHNpbXVsYXRvciB1bmRlciBHREIuICAqLwotCi12b2lkCi1yYWlzZV9leGNlcHRpb24gKHgpCi0gICAgIGludCB4OwotewotICBSQUlTRV9FWENFUFRJT04oeCk7Ci19Ci0KLXZvaWQKLXJhaXNlX2J1c2Vycm9yICgpCi17Ci0gIHJhaXNlX2V4Y2VwdGlvbiAoU0lHQlVTKTsKLX0KLQotI2RlZmluZSBQUk9DRVNTX1NQRUNJQUxfQUREUkVTUyhhZGRyLCBlbmRpYW4sIHB0ciwgYml0c193cml0dGVuLCBcCi0JCQkJZm9yYmlkZGVuX2FkZHJfYml0cywgZGF0YSwgcmV0dmFsKSBcCi1kbyB7IFwKLSAgaWYgKGFkZHIgJiBmb3JiaWRkZW5fYWRkcl9iaXRzKSBcCi0gICAgeyBcCi0gICAgICByYWlzZV9idXNlcnJvciAoKTsgXAotICAgICAgcmV0dXJuIHJldHZhbDsgXAotICAgIH0gXAotICBlbHNlIGlmICgoYWRkciAmIHNhdmVkX3N0YXRlLmFzcmVncy54eXJhbV9zZWxlY3QpIFwKLQkgICA9PSBzYXZlZF9zdGF0ZS5hc3JlZ3MueHJhbV9zdGFydCkgXAotICAgIHB0ciA9ICh2b2lkICopICZzYXZlZF9zdGF0ZS5hc3JlZ3MueG1lbV9vZmZzZXRbYWRkciBeIGVuZGlhbl07IFwKLSAgZWxzZSBpZiAoKGFkZHIgJiBzYXZlZF9zdGF0ZS5hc3JlZ3MueHlyYW1fc2VsZWN0KSBcCi0JICAgPT0gc2F2ZWRfc3RhdGUuYXNyZWdzLnlyYW1fc3RhcnQpIFwKLSAgICBwdHIgPSAodm9pZCAqKSAmc2F2ZWRfc3RhdGUuYXNyZWdzLnltZW1fb2Zmc2V0W2FkZHIgXiBlbmRpYW5dOyBcCi0gIGVsc2UgaWYgKCh1bnNpZ25lZCkgYWRkciA+PiAyNCA9PSAweGYwIFwKLQkgICAmJiBiaXRzX3dyaXR0ZW4gPT0gMzIgJiYgKGRhdGEgJiAxKSA9PSAwKSBcCi0gICAgLyogVGhpcyBpbnZhbGlkYXRlcyAoaWYgbm90IGFzc29jaWF0aXZlKSBvciBtaWdodCBpbnZhbGlkYXRlIFwKLSAgICAgICAoaWYgYXNzb2NpYXRpdmUpIGFuIGluc3RydWN0aW9uIGNhY2hlIGxpbmUuICBUaGlzIGlzIHVzZWQgZm9yIFwKLSAgICAgICB0cmFtcG9saW5lcy4gIFNpbmNlIHdlIGRvbid0IHNpbXVsYXRlIHRoZSBjYWNoZSwgdGhpcyBpcyBhIG5vLW9wIFwKLSAgICAgICBhcyBmYXIgYXMgdGhlIHNpbXVsYXRvciBpcyBjb25jZXJuZWQuICAqLyBcCi0gICAgcmV0dXJuIHJldHZhbDsgXAotICBlbHNlIFwKLSAgICB7IFwKLSAgICAgIGlmIChiaXRzX3dyaXR0ZW4gPT0gOCAmJiBhZGRyID4gMHg1MDAwMDAwKSBcCi0JSU9NRU0gKGFkZHIsIDEsIGRhdGEpOyBcCi0gICAgICAvKiBXZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGUgb3RoZXIgc3R1ZmYsIHNvIGZhaWwuICAqLyBcCi0gICAgICByYWlzZV9idXNlcnJvciAoKTsgXAotICAgICAgcmV0dXJuIHJldHZhbDsgXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLQotLyogRklYTUU6IHNpbV9yZXN1bWUgc2hvdWxkIGJlIHJlbmFtZWQgdG8gc2ltX2VuZ2luZV9ydW4uICBzaW1fcmVzdW1lCi0gICBiZWluZyBpbXBsZW1lbnRlZCBieSAuLi9jb21tb24vc2ltX3Jlc3VtZS5jIGFuZCB0aGUgYmVsb3cgc2hvdWxkCi0gICBtYWtlIGEgY2FsbCB0byBzaW1fZW5naW5lX2hhbHQgKi8KLQotI2RlZmluZSBCVVNFUlJPUihhZGRyLCBtYXNrKSAoKGFkZHIpICYgKG1hc2spKQotCi0jZGVmaW5lIFdSSVRFX0JVU0VSUk9SKGFkZHIsIG1hc2ssIGRhdGEsIGFkZHJfZnVuYykgXAotICBkbyBcCi0gICAgeyBcCi0gICAgICBpZiAoYWRkciAmIG1hc2spIFwKLQl7IFwKLQkgIGFkZHJfZnVuYyAoYWRkciwgZGF0YSk7IFwKLQkgIHJldHVybjsgXAotCX0gXAotICAgIH0gXAotICB3aGlsZSAoMCkKLQotI2RlZmluZSBSRUFEX0JVU0VSUk9SKGFkZHIsIG1hc2ssIGFkZHJfZnVuYykgXAotICBkbyBcCi0gICAgeyBcCi0gICAgICBpZiAoYWRkciAmIG1hc2spIFwKLQlyZXR1cm4gYWRkcl9mdW5jIChhZGRyKTsgXAotICAgIH0gXAotICB3aGlsZSAoMCkKLQotLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHJlZ2lzdGVyIGxpZmV0aW1lIGNoZWNraW5nLgotICAgVGhlIGNvbXBpbGVyIGdlbmVyYXRlcyAiYWRkICMwLHJuIiBpbnNucyB0byBtYXJrIHJlZ2lzdGVycyBhcyBpbnZhbGlkLAotICAgdGhlIHNpbXVsYXRvciB1c2VzIHRoaXMgaW5mbyB0byBjYWxsIGZhaWwgaWYgaXQgZmluZHMgYSByZWYgdG8gYW4gaW52YWxpZAotICAgcmVnaXN0ZXIgYmVmb3JlIGEgZGVmCi0KLSAgICNkZWZpbmUgUEFSQU5PSUQKLSovCi0KLSNpZmRlZiBQQVJBTk9JRAotaW50IHZhbGlkWzE2XTsKLSNkZWZpbmUgQ1JFRih4KSAgaWYoIXZhbGlkW3hdKSBmYWlsKCk7Ci0jZGVmaW5lIENERUYoeCkgIHZhbGlkW3hdID0gMTsKLSNkZWZpbmUgVU5ERUYoeCkgdmFsaWRbeF0gPSAwOwotI2Vsc2UKLSNkZWZpbmUgQ1JFRih4KQotI2RlZmluZSBDREVGKHgpCi0jZGVmaW5lIFVOREVGKHgpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgcGFyc2VfYW5kX3NldF9tZW1vcnlfc2l6ZSBQQVJBTVMgKChjaGFyICpzdHIpKTsKLXN0YXRpYyBpbnQgSU9NRU0gUEFSQU1TICgoaW50IGFkZHIsIGludCB3cml0ZSwgaW50IHZhbHVlKSk7Ci1zdGF0aWMgc3RydWN0IGxvb3BfYm91bmRzIGdldF9sb29wX2JvdW5kcyBQQVJBTVMoKGludCwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCQkgIHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3Nfd2xhdF9hZGRyIFBBUkFNUygoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3Nfd3dhdF9hZGRyIFBBUkFNUygoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3Nfd2JhdF9hZGRyIFBBUkFNUygoaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19ybGF0X2FkZHIgUEFSQU1TKChpbnQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19yd2F0X2FkZHIgUEFSQU1TKChpbnQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19yYmF0X2FkZHIgUEFSQU1TKChpbnQpKTsKLXN0YXRpYyB2b2lkIElOTElORSB3bGF0X2Zhc3QgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBJTkxJTkUgd3dhdF9mYXN0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBJTkxJTkUgd2JhdF9mYXN0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotc3RhdGljIGludCBJTkxJTkUgcmxhdF9mYXN0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgSU5MSU5FIHJ3YXRfZmFzdCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgSU5MSU5FIHJiYXRfZmFzdCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKLQotCi0KLS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIERSKG4pIChnZXRfZHIgKG4pKQotc3RhdGljIGRvdWJsZQotZ2V0X2RyIChuKQotICAgICBpbnQgbjsKLXsKLSAgbiA9IChuICYgfjEpOwotICBpZiAoaG9zdF9saXR0bGVfZW5kaWFuKQotICAgIHsKLSAgICAgIHVuaW9uCi0gICAgICB7Ci0JaW50IGlbMl07Ci0JZG91YmxlIGQ7Ci0gICAgICB9IGRyOwotICAgICAgZHIuaVsxXSA9IHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5pW24gKyAwXTsKLSAgICAgIGRyLmlbMF0gPSBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMF0uaVtuICsgMV07Ci0gICAgICByZXR1cm4gZHIuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5kW24gPj4gMV0pOwotfQotCi0jZGVmaW5lIFNFVF9EUihuLCBFWFApIHNldF9kciAoKG4pLCAoRVhQKSkKLXN0YXRpYyB2b2lkCi1zZXRfZHIgKG4sIGV4cCkKLSAgICAgaW50IG47Ci0gICAgIGRvdWJsZSBleHA7Ci17Ci0gIG4gPSAobiAmIH4xKTsKLSAgaWYgKGhvc3RfbGl0dGxlX2VuZGlhbikKLSAgICB7Ci0gICAgICB1bmlvbgotICAgICAgewotCWludCBpWzJdOwotCWRvdWJsZSBkOwotICAgICAgfSBkcjsKLSAgICAgIGRyLmQgPSBleHA7Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMF0uaVtuICsgMF0gPSBkci5pWzFdOwotICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmZyZWdzWzBdLmlbbiArIDFdID0gZHIuaVswXTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3NbMF0uZFtuID4+IDFdID0gZXhwOwotfQotCi0jZGVmaW5lIFNFVF9GSShuLEVYUCkgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5pWyhuKV0gPSAoRVhQKSkKLSNkZWZpbmUgRkkobikgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5pWyhuKV0pCi0KLSNkZWZpbmUgRlIobikgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5mWyhuKV0pCi0jZGVmaW5lIFNFVF9GUihuLEVYUCkgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1swXS5mWyhuKV0gPSAoRVhQKSkKLQotI2RlZmluZSBYRF9UT19YRihuKSAoKCgobikgJiAxKSA8PCA1KSB8ICgobikgJiAweDFlKSkKLSNkZWZpbmUgWEYobikgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1sobikgPj4gNV0uaVsobikgJiAweDFmXSkKLSNkZWZpbmUgU0VUX1hGKG4sRVhQKSAoc2F2ZWRfc3RhdGUuYXNyZWdzLmZyZWdzWyhuKSA+PiA1XS5pWyhuKSAmIDB4MWZdID0gKEVYUCkpCi0KLSNkZWZpbmUgUlMgc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLnJzCi0jZGVmaW5lIFJFIHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5yZQotI2RlZmluZSBNT0QgKHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5tb2QpCi0jZGVmaW5lIFNFVF9NT0QoaSkgXAotKE1PRCA9IChpKSwgXAotIE1PRF9NRSA9ICh1bnNpZ25lZCkgTU9EID4+IDE2IHwgKFNSX0RNWSA/IH4weGZmZmYgOiAoU1JfRE1YID8gMCA6IDB4MTAwMDApKSwgXAotIE1PRF9ERUxUQSA9IChNT0QgJiAweGZmZmYpIC0gKCh1bnNpZ25lZCkgTU9EID4+IDE2KSkKLQotI2RlZmluZSBEU1BfUihuKSBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3JlZ3MuaVsobildCi0jZGVmaW5lIERTUF9HUkQobikgRFNQX1IgKChuKSArIDgpCi0jZGVmaW5lIEdFVF9EU1BfR1JEKG4pICgobiB8IDIpID09IDcgPyBTRVhUIChEU1BfR1JEIChuKSkgOiBTSUdOMzIgKERTUF9SIChuKSkpCi0jZGVmaW5lIEExIERTUF9SICg1KQotI2RlZmluZSBBMCBEU1BfUiAoNykKLSNkZWZpbmUgWDAgRFNQX1IgKDgpCi0jZGVmaW5lIFgxIERTUF9SICg5KQotI2RlZmluZSBZMCBEU1BfUiAoMTApCi0jZGVmaW5lIFkxIERTUF9SICgxMSkKLSNkZWZpbmUgTTAgRFNQX1IgKDEyKQotI2RlZmluZSBBMUcgRFNQX1IgKDEzKQotI2RlZmluZSBNMSBEU1BfUiAoMTQpCi0jZGVmaW5lIEEwRyBEU1BfUiAoMTUpCi0vKiBEU1BfUiAoMTYpIC8gRFNQX0dSRCAoMTYpIGFyZSB1c2VkIGFzIGEgZmFrZSBkZXN0aW5hdGlvbiBmb3IgcGNtcC4gICovCi0jZGVmaW5lIE1PRF9NRSBEU1BfR1JEICgxNykKLSNkZWZpbmUgTU9EX0RFTFRBIERTUF9HUkQgKDE4KQotCi0jZGVmaW5lIEZQX09QKG4sIE9QLCBtKSBcCi17IFwKLSAgaWYgKEZQU0NSX1BSKSBcCi0gICAgeyBcCi0gICAgICBpZiAoKChuKSAmIDEpIHx8ICgobSkgJiAxKSkgXAotCVJBSVNFX0VYQ0VQVElPTiAoU0lHSUxMKTsgXAotICAgICAgZWxzZSBcCi0JU0VUX0RSKG4sIChEUihuKSBPUCBEUihtKSkpOyBcCi0gICAgfSBcCi0gIGVsc2UgXAotICAgIFNFVF9GUihuLCAoRlIobikgT1AgRlIobSkpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGUF9VTkFSWShuLCBPUCkgXAoteyBcCi0gIGlmIChGUFNDUl9QUikgXAotICAgIHsgXAotICAgICAgaWYgKChuKSAmIDEpIFwKLQlSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IFwKLSAgICAgIGVsc2UgXAotCVNFVF9EUihuLCAoT1AgKERSKG4pKSkpOyBcCi0gICAgfSBcCi0gIGVsc2UgXAotICAgIFNFVF9GUihuLCAoT1AgKEZSKG4pKSkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQX0NNUChuLCBPUCwgbSkgXAoteyBcCi0gIGlmIChGUFNDUl9QUikgXAotICAgIHsgXAotICAgICAgaWYgKCgobikgJiAxKSB8fCAoKG0pICYgMSkpIFwKLQlSQUlTRV9FWENFUFRJT04gKFNJR0lMTCk7IFwKLSAgICAgIGVsc2UgXAotCVNFVF9TUl9UIChEUihuKSBPUCBEUihtKSk7IFwKLSAgICB9IFwKLSAgZWxzZSBcCi0gICAgU0VUX1NSX1QgKEZSKG4pIE9QIEZSKG0pKTsgXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIHZvaWQKLXNldF9zciAobmV3X3NyKQotICAgICBpbnQgbmV3X3NyOwotewotICAvKiBkbyB3ZSBuZWVkIHRvIHN3YXAgYmFua3MgKi8KLSAgaW50IG9sZF9ncHIgPSBTUl9NRCAmJiBTUl9SQjsKLSAgaW50IG5ld19ncHIgPSAobmV3X3NyICYgU1JfTUFTS19NRCkgJiYgKG5ld19zciAmIFNSX01BU0tfUkIpOwotICBpZiAob2xkX2dwciAhPSBuZXdfZ3ByKQotICAgIHsKLSAgICAgIGludCBpLCB0bXA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkgIHRtcCA9IHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5iYW5rW2ldOwotCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLmNyZWdzLm5hbWVkLmJhbmtbaV0gPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1tpXTsKLQkgIHNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW2ldID0gdG1wOwotCX0KLSAgICB9Ci0gIHNhdmVkX3N0YXRlLmFzcmVncy5jcmVncy5uYW1lZC5zciA9IG5ld19zcjsKLSAgU0VUX01PRCAoTU9EKTsKLX0KLQotc3RhdGljIHZvaWQgSU5MSU5FIAotd2xhdF9mYXN0IChtZW1vcnksIHgsIHZhbHVlLCBtYXNrbCkKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotewotICBpbnQgdiA9IHZhbHVlOwotICB1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopKG1lbW9yeSArIHgpOwotICBXUklURV9CVVNFUlJPUiAoeCwgbWFza2wsIHYsIHByb2Nlc3Nfd2xhdF9hZGRyKTsKLSAgKnAgPSB2OwotfQotCi1zdGF0aWMgdm9pZCBJTkxJTkUgCi13d2F0X2Zhc3QgKG1lbW9yeSwgeCwgdmFsdWUsIG1hc2t3LCBlbmRpYW53KQotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci17Ci0gIGludCB2ID0gdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopKG1lbW9yeSArICh4IF4gZW5kaWFudykpOwotICBXUklURV9CVVNFUlJPUiAoeCwgbWFza3csIHYsIHByb2Nlc3Nfd3dhdF9hZGRyKTsKLSAgKnAgPSB2OwotfQotCi1zdGF0aWMgdm9pZCBJTkxJTkUgCi13YmF0X2Zhc3QgKG1lbW9yeSwgeCwgdmFsdWUsIG1hc2tiKQotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnAgPSBtZW1vcnkgKyAoeCBeIGVuZGlhbmIpOwotICBXUklURV9CVVNFUlJPUiAoeCwgbWFza2IsIHZhbHVlLCBwcm9jZXNzX3diYXRfYWRkcik7Ci0KLSAgcFswXSA9IHZhbHVlOwotfQotCi0vKiBSZWFkIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IElOTElORSAKLXJsYXRfZmFzdCAobWVtb3J5LCB4LCBtYXNrbCkKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotewotICB1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopKG1lbW9yeSArIHgpOwotICBSRUFEX0JVU0VSUk9SICh4LCBtYXNrbCwgcHJvY2Vzc19ybGF0X2FkZHIpOwotCi0gIHJldHVybiAqcDsKLX0KLQotc3RhdGljIGludCBJTkxJTkUgCi1yd2F0X2Zhc3QgKG1lbW9yeSwgeCwgbWFza3csIGVuZGlhbncpCi0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IHgsIG1hc2t3LCBlbmRpYW53OwotewotICB1bnNpZ25lZCBzaG9ydCAqcCA9ICh1bnNpZ25lZCBzaG9ydCAqKShtZW1vcnkgKyAoeCBeIGVuZGlhbncpKTsKLSAgUkVBRF9CVVNFUlJPUiAoeCwgbWFza3csIHByb2Nlc3NfcndhdF9hZGRyKTsKLQotICByZXR1cm4gKnA7Ci19Ci0KLXN0YXRpYyBpbnQgSU5MSU5FIAotcmlhdF9mYXN0IChpbnNuX3B0ciwgZW5kaWFudykKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbl9wdHI7Ci17Ci0gIHVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopKChzaXplX3QpIGluc25fcHRyIF4gZW5kaWFudyk7Ci0KLSAgcmV0dXJuICpwOwotfQotCi1zdGF0aWMgaW50IElOTElORSAKLXJiYXRfZmFzdCAobWVtb3J5LCB4LCBtYXNrYikKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotewotICB1bnNpZ25lZCBjaGFyICpwID0gbWVtb3J5ICsgKHggXiBlbmRpYW5iKTsKLSAgUkVBRF9CVVNFUlJPUiAoeCwgbWFza2IsIHByb2Nlc3NfcmJhdF9hZGRyKTsKLQotICByZXR1cm4gKnA7Ci19Ci0KLSNkZWZpbmUgUldBVCh4KSAJKHJ3YXRfZmFzdCAobWVtb3J5LCB4LCBtYXNrdywgZW5kaWFudykpCi0jZGVmaW5lIFJMQVQoeCkgCShybGF0X2Zhc3QgKG1lbW9yeSwgeCwgbWFza2wpKQotI2RlZmluZSBSQkFUKHgpICAgICAgICAgKHJiYXRfZmFzdCAobWVtb3J5LCB4LCBtYXNrYikpCi0jZGVmaW5lIFJJQVQocCkJCShyaWF0X2Zhc3QgKChwKSwgZW5kaWFudykpCi0jZGVmaW5lIFdXQVQoeCx2KSAJKHd3YXRfZmFzdCAobWVtb3J5LCB4LCB2LCBtYXNrdywgZW5kaWFudykpCi0jZGVmaW5lIFdMQVQoeCx2KSAJKHdsYXRfZmFzdCAobWVtb3J5LCB4LCB2LCBtYXNrbCkpCi0jZGVmaW5lIFdCQVQoeCx2KSAgICAgICAod2JhdF9mYXN0IChtZW1vcnksIHgsIHYsIG1hc2tiKSkKLQotI2RlZmluZSBSVVdBVCh4KSAgKFJXQVQoeCkgJiAweGZmZmYpCi0jZGVmaW5lIFJTV0FUKHgpICAoKHNob3J0KShSV0FUKHgpKSkKLSNkZWZpbmUgUlNCQVQoeCkgIChTRVhUKFJCQVQoeCkpKQotCi0jZGVmaW5lIFJEQVQoeCwgbikgKGRvX3JkYXQgKG1lbW9yeSwgKHgpLCAobiksIChtYXNrbCkpKQotc3RhdGljIGludAotZG9fcmRhdCAobWVtb3J5LCB4LCBuLCBtYXNrbCkKLSAgICAgY2hhciAqbWVtb3J5OwotICAgICBpbnQgeDsKLSAgICAgaW50IG47Ci0gICAgIGludCBtYXNrbDsKLXsKLSAgaW50IGYwOwotICBpbnQgZjE7Ci0gIGludCBpID0gKG4gJiAxKTsKLSAgaW50IGogPSAobiAmIH4xKTsKLSAgZjAgPSBybGF0X2Zhc3QgKG1lbW9yeSwgeCArIDAsIG1hc2tsKTsKLSAgZjEgPSBybGF0X2Zhc3QgKG1lbW9yeSwgeCArIDQsIG1hc2tsKTsKLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLmZyZWdzW2ldLmlbKGogKyAwKV0gPSBmMDsKLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLmZyZWdzW2ldLmlbKGogKyAxKV0gPSBmMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgV0RBVCh4LCBuKSAoZG9fd2RhdCAobWVtb3J5LCAoeCksIChuKSwgKG1hc2tsKSkpCi1zdGF0aWMgaW50Ci1kb193ZGF0IChtZW1vcnksIHgsIG4sIG1hc2tsKQotICAgICBjaGFyICptZW1vcnk7Ci0gICAgIGludCB4OwotICAgICBpbnQgbjsKLSAgICAgaW50IG1hc2tsOwotewotICBpbnQgZjA7Ci0gIGludCBmMTsKLSAgaW50IGkgPSAobiAmIDEpOwotICBpbnQgaiA9IChuICYgfjEpOwotICBmMCA9IHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1tpXS5pWyhqICsgMCldOwotICBmMSA9IHNhdmVkX3N0YXRlLmFzcmVncy5mcmVnc1tpXS5pWyhqICsgMSldOwotICB3bGF0X2Zhc3QgKG1lbW9yeSwgKHggKyAwKSwgZjAsIG1hc2tsKTsKLSAgd2xhdF9mYXN0IChtZW1vcnksICh4ICsgNCksIGYxLCBtYXNrbCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc193bGF0X2FkZHIgKGFkZHIsIHZhbHVlKQotICAgICBpbnQgYWRkcjsKLSAgICAgaW50IHZhbHVlOwotewotICB1bnNpZ25lZCBpbnQgKnB0cjsKLQotICBQUk9DRVNTX1NQRUNJQUxfQUREUkVTUyAoYWRkciwgZW5kaWFuYiwgcHRyLCAzMiwgMywgdmFsdWUsICk7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfd3dhdF9hZGRyIChhZGRyLCB2YWx1ZSkKLSAgICAgaW50IGFkZHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgc2hvcnQgKnB0cjsKLQotICBQUk9DRVNTX1NQRUNJQUxfQUREUkVTUyAoYWRkciwgZW5kaWFuYiwgcHRyLCAxNiwgMSwgdmFsdWUsICk7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfd2JhdF9hZGRyIChhZGRyLCB2YWx1ZSkKLSAgICAgaW50IGFkZHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gIFBST0NFU1NfU1BFQ0lBTF9BRERSRVNTIChhZGRyLCBlbmRpYW5iLCBwdHIsIDgsIDAsIHZhbHVlLCApOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfcmxhdF9hZGRyIChhZGRyKQotICAgICBpbnQgYWRkcjsKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gIFBST0NFU1NfU1BFQ0lBTF9BRERSRVNTIChhZGRyLCBlbmRpYW5iLCBwdHIsIC0zMiwgMywgLTEsIDApOwotICByZXR1cm4gKnB0cjsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19yd2F0X2FkZHIgKGFkZHIpCi0gICAgIGludCBhZGRyOwotewotICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0KLSAgUFJPQ0VTU19TUEVDSUFMX0FERFJFU1MgKGFkZHIsIGVuZGlhbmIsIHB0ciwgLTE2LCAxLCAtMSwgMCk7Ci0gIHJldHVybiAqcHRyOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3JiYXRfYWRkciAoYWRkcikKLSAgICAgaW50IGFkZHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cjsKLQotICBQUk9DRVNTX1NQRUNJQUxfQUREUkVTUyAoYWRkciwgZW5kaWFuYiwgcHRyLCAtOCwgMCwgLTEsIDApOwotICByZXR1cm4gKnB0cjsKLX0KLQotI2RlZmluZSBTRVhUKHgpICAgICAJKCgoeCAmICAweGZmKSBeICh+MHg3ZikpKzB4ODApCi0jZGVmaW5lIFNFWFQxMih4KQkoKCh4ICYgMHhmZmYpIF4gMHg4MDApIC0gMHg4MDApCi0jZGVmaW5lIFNFWFRXKHkpICAgIAkoKGludCkoKHNob3J0KXkpKQotI2lmIDAKLSNkZWZpbmUgU0VYVDMyKHgpCSgoaW50KSgoeCAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMFUpIC0gMHg3ZmZmZmZmZiAtIDEpCi0jZWxzZQotI2RlZmluZSBTRVhUMzIoeCkJKChpbnQpKHgpKQotI2VuZGlmCi0jZGVmaW5lIFNJR04zMih4KQkoU0VYVDMyICh4KSA+PiAzMSkKLQotLyogY29udmVydCBwb2ludGVyIGZyb20gdGFyZ2V0IHRvIGhvc3QgdmFsdWUuICAqLwotI2RlZmluZSBQVDJIKHgpICgoeCkgKyBtZW1vcnkpCi0vKiBjb252ZXJ0IHBvaW50ZXIgZnJvbSBob3N0IHRvIHRhcmdldCB2YWx1ZS4gICovCi0jZGVmaW5lIFBIMlQoeCkgKCh4KSAtIG1lbW9yeSkKLQotI2RlZmluZSBTS0lQX0lOU04ocCkgKChwKSArPSAoKFJJQVQgKHApICYgMHhmYzAwKSA9PSAweGY4MDAgPyA0IDogMikpCi0KLSNkZWZpbmUgU0VUX05JUCh4KSBuaXAgPSAoeCk7IENIRUNLX0lOU05fUFRSIChuaXApOwotCi0jZGVmaW5lIERlbGF5X1Nsb3QoVEVNUFBDKSAgCWl3b3JkID0gUklBVCAoVEVNUFBDKTsgZ290byB0b3A7Ci0KLSNkZWZpbmUgQ0hFQ0tfSU5TTl9QVFIocCkgXAotZG8geyBcCi0gIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uIHx8IFBIMlQgKHApICYgbWFza3cpIFwKLSAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuaW5zbl9lbmQgPSAwOyBcCi0gIGVsc2UgaWYgKHAgPCBsb29wLmVuZCkgXAotICAgIHNhdmVkX3N0YXRlLmFzcmVncy5pbnNuX2VuZCA9IGxvb3AuZW5kOyBcCi0gIGVsc2UgXAotICAgIHNhdmVkX3N0YXRlLmFzcmVncy5pbnNuX2VuZCA9IG1lbV9lbmQ7IFwKLX0gd2hpbGUgKDApCi0KLSNpZmRlZiBBQ0VfRkFTVAotCi0jZGVmaW5lIE1BKG4pCi0jZGVmaW5lIEwoeCkKLSNkZWZpbmUgVEwoeCkKLSNkZWZpbmUgVEIoeCkKLQotI2Vsc2UKLQotI2RlZmluZSBNQShuKSBcCi0gIGRvIHsgbWVtc3RhbGxzICs9ICgoKChpbnQpIFBDICYgMykgIT0gMCkgPyAobikgOiAoKG4pIC0gMSkpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEwoeCkgICB0aGlzbG9jayA9IHg7Ci0jZGVmaW5lIFRMKHgpICBpZiAoKHgpID09IHByZXZsb2NrKSBzdGFsbHMrKzsKLSNkZWZpbmUgVEIoeCx5KSAgaWYgKCh4KSA9PSBwcmV2bG9jayB8fCAoeSk9PXByZXZsb2NrKSBzdGFsbHMrKzsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikKLWludCBzaW1fbWVtb3J5X3NpemUgPSAxOTsKLSNlbHNlCi1pbnQgc2ltX21lbW9yeV9zaXplID0gMjQ7Ci0jZW5kaWYKLQotc3RhdGljIGludCBzaW1fcHJvZmlsZV9zaXplID0gMTc7Ci1zdGF0aWMgaW50IG5zYW1wbGVzOwotCi0jdW5kZWYgVEIKLSNkZWZpbmUgVEIoeCx5KQotCi0jZGVmaW5lIFNNUjEgKDB4MDVGRkZFQzgpCS8qIENoYW5uZWwgMSAgc2VyaWFsIG1vZGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQlJSMSAoMHgwNUZGRkVDOSkJLyogQ2hhbm5lbCAxICBiaXQgcmF0ZSByZWdpc3RlciAqLwotI2RlZmluZSBTQ1IxICgweDA1RkZGRUNBKQkvKiBDaGFubmVsIDEgIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFREUjEgKDB4MDVGRkZFQ0IpCS8qIENoYW5uZWwgMSAgdHJhbnNtaXQgZGF0YSByZWdpc3RlciAqLwotI2RlZmluZSBTU1IxICgweDA1RkZGRUNDKQkvKiBDaGFubmVsIDEgIHNlcmlhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUkRSMSAoMHgwNUZGRkVDRCkJLyogQ2hhbm5lbCAxICByZWNlaXZlIGRhdGEgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTQ0lfUkRSRiAgCSAweDQwCS8qIFJlY2lldmUgZGF0YSByZWdpc3RlciBmdWxsICovCi0jZGVmaW5lIFNDSV9URFJFCTB4ODAJLyogVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAqLwotCi1zdGF0aWMgaW50Ci1JT01FTSAoYWRkciwgd3JpdGUsIHZhbHVlKQotICAgICBpbnQgYWRkcjsKLSAgICAgaW50IHdyaXRlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGlmICh3cml0ZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFkZHIpCi0JewotCWNhc2UgVERSMToKLQkgIGlmICh2YWx1ZSAhPSAnXHInKQotCSAgICB7Ci0JICAgICAgcHV0Y2hhciAodmFsdWUpOwotCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoYWRkcikKLQl7Ci0JY2FzZSBSRFIxOgotCSAgcmV0dXJuIGdldGNoYXIgKCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9ub3cgKCkKLXsKLSAgcmV0dXJuIHRpbWUgKChsb25nICopIDApOwotfQotCi1zdGF0aWMgaW50Ci1ub3dfcGVyc2VjICgpCi17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgRklMRSAqcHJvZmlsZV9maWxlOwotCi1zdGF0aWMgdW5zaWduZWQgSU5MSU5FCi1zd2FwIChuKQotICAgICB1bnNpZ25lZCBuOwotewotICBpZiAoZW5kaWFuYikKLSAgICBuID0gKG4gPDwgMjQgfCAobiAmIDB4ZmYwMCkgPDwgOAotCSB8IChuICYgMHhmZjAwMDApID4+IDggfCAobiAmIDB4ZmYwMDAwMDApID4+IDI0KTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBJTkxJTkUKLXN3YXAxNiAobikKLSAgICAgdW5zaWduZWQgc2hvcnQgbjsKLXsKLSAgaWYgKGVuZGlhbmIpCi0gICAgbiA9IG4gPDwgOCB8IChuICYgMHhmZjAwKSA+PiA4OwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHZvaWQKLXN3YXBvdXQgKG4pCi0gICAgIGludCBuOwotewotICBpZiAocHJvZmlsZV9maWxlKQotICAgIHsKLSAgICAgIHVuaW9uIHsgY2hhciBiWzRdOyBpbnQgbjsgfSB1OwotICAgICAgdS5uID0gc3dhcCAobik7Ci0gICAgICBmd3JpdGUgKHUuYiwgNCwgMSwgcHJvZmlsZV9maWxlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zd2Fwb3V0MTYgKG4pCi0gICAgIGludCBuOwotewotICB1bmlvbiB7IGNoYXIgYls0XTsgaW50IG47IH0gdTsKLSAgdS5uID0gc3dhcDE2IChuKTsKLSAgZndyaXRlICh1LmIsIDIsIDEsIHByb2ZpbGVfZmlsZSk7Ci19Ci0KLS8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KLQotc3RhdGljIGNoYXIgKgotcHRyICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuIChjaGFyICopICh4ICsgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0cnN3YXBsZW4gKHN0cikKLSAgICAgaW50IHN0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqbWVtb3J5ID0gc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeTsKLSAgaW50IHN0YXJ0LCBlbmQ7Ci0gIGludCBlbmRpYW4gPSBlbmRpYW5iOwotCi0gIGlmICghIGVuZGlhbikKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3RyOwotICBmb3IgKGVuZCA9IHN0cjsgbWVtb3J5W2VuZCBeIGVuZGlhbl07IGVuZCsrKSA7Ci0gIHJldHVybiBlbmQgLSBzdHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJuc3dhcCAoc3RyLCBsZW4pCi0gICAgIGludCBzdHI7Ci0gICAgIGludCBsZW47Ci17Ci0gIGludCAqc3RhcnQsICplbmQ7Ci0KLSAgaWYgKCEgZW5kaWFuYiB8fCAhIGxlbikKLSAgICByZXR1cm47Ci0gIHN0YXJ0ID0gKGludCAqKSBwdHIgKHN0ciAmIH4zKTsKLSAgZW5kID0gKGludCAqKSBwdHIgKHN0ciArIGxlbik7Ci0gIGRvCi0gICAgewotICAgICAgaW50IG9sZCA9ICpzdGFydDsKLSAgICAgICpzdGFydCA9IChvbGQgPDwgMjQgfCAob2xkICYgMHhmZjAwKSA8PCA4Ci0JCXwgKG9sZCAmIDB4ZmYwMDAwKSA+PiA4IHwgKG9sZCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKLSAgICAgIHN0YXJ0Kys7Ci0gICAgfQotICB3aGlsZSAoc3RhcnQgPCBlbmQpOwotfQotCi0vKiBTaW11bGF0ZSBhIG1vbml0b3IgdHJhcCwgcHV0IHRoZSByZXN1bHQgaW50byByMCBhbmQgZXJybm8gaW50byByMSAqLwotCi1zdGF0aWMgdm9pZAotdHJhcCAoaSwgcmVncywgbWVtb3J5LCBtYXNrbCwgbWFza3csIGVuZGlhbncpCi0gICAgIGludCBpOwotICAgICBpbnQgKnJlZ3M7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLXsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBwcmludGYgKCIlYyIsIHJlZ3NbMF0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcmFpc2VfZXhjZXB0aW9uIChTSUdRVUlUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoJCQkvKiBGSVhNRTogZm9yIGJhY2t3YXJkcyBjb21wYXQsIHNob3VsZCBiZSByZW1vdmVkICovCi0gICAgY2FzZSAzNDoKLSAgICAgIHsKLQlleHRlcm4gaW50IGVycm5vOwotCWludCBwZXJybm8gPSBlcnJubzsKLQllcnJubyA9IDA7Ci0KLQlzd2l0Y2ggKHJlZ3NbNF0pCi0JICB7Ci0KLSNpZiAhZGVmaW5lZChfX0dPMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyKQotCSAgY2FzZSBTWVNfZm9yazoKLQkgICAgcmVnc1swXSA9IGZvcmsgKCk7Ci0JICAgIGJyZWFrOwotLyogVGhpcyB3b3VsZCB3b3JrIG9ubHkgaWYgZW5kaWFubmVzcyBtYXRjaGVkIGJldHdlZW4gaG9zdCBhbmQgdGFyZ2V0LgotICAgQmVzaWRlcywgaXQncyBxdWl0ZSBkYW5nZXJvdXMuICAqLwotI2lmIDAKLQkgIGNhc2UgU1lTX2V4ZWN2ZToKLQkgICAgcmVnc1swXSA9IGV4ZWN2ZSAocHRyIChyZWdzWzVdKSwgKGNoYXIgKiopcHRyIChyZWdzWzZdKSwgKGNoYXIgKiopcHRyIChyZWdzWzddKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTWVNfZXhlY3Y6Ci0JICAgIHJlZ3NbMF0gPSBleGVjdmUgKHB0ciAocmVnc1s1XSksKGNoYXIgKiopIHB0ciAocmVnc1s2XSksIDApOwotCSAgICBicmVhazsKLSNlbmRpZgotCSAgY2FzZSBTWVNfcGlwZToKLQkgICAgewotCSAgICAgIHJlZ3NbMF0gPSAoQlVTRVJST1IgKHJlZ3NbNV0sIG1hc2tsKQotCQkJID8gLUVJTlZBTAotCQkJIDogcGlwZSAoKGludCAqKSBwdHIgKHJlZ3NbNV0pKSk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgU1lTX3dhaXQ6Ci0JICAgIHJlZ3NbMF0gPSB3YWl0IChwdHIgKHJlZ3NbNV0pKTsKLQkgICAgYnJlYWs7Ci0jZW5kaWYgLyogIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikgKi8KLQotCSAgY2FzZSBTWVNfcmVhZDoKLQkgICAgc3RybnN3YXAgKHJlZ3NbNl0sIHJlZ3NbN10pOwotCSAgICByZWdzWzBdCi0JICAgICAgPSBjYWxsYmFjay0+cmVhZCAoY2FsbGJhY2ssIHJlZ3NbNV0sIHB0ciAocmVnc1s2XSksIHJlZ3NbN10pOwotCSAgICBzdHJuc3dhcCAocmVnc1s2XSwgcmVnc1s3XSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTWVNfd3JpdGU6Ci0JICAgIHN0cm5zd2FwIChyZWdzWzZdLCByZWdzWzddKTsKLQkgICAgaWYgKHJlZ3NbNV0gPT0gMSkKLQkgICAgICByZWdzWzBdID0gKGludCljYWxsYmFjay0+d3JpdGVfc3Rkb3V0IChjYWxsYmFjaywgcHRyKHJlZ3NbNl0pLCByZWdzWzddKTsKLQkgICAgZWxzZQotCSAgICAgIHJlZ3NbMF0gPSAoaW50KWNhbGxiYWNrLT53cml0ZSAoY2FsbGJhY2ssIHJlZ3NbNV0sIHB0ciAocmVnc1s2XSksIHJlZ3NbN10pOwotCSAgICBzdHJuc3dhcCAocmVnc1s2XSwgcmVnc1s3XSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTWVNfbHNlZWs6Ci0JICAgIHJlZ3NbMF0gPSBjYWxsYmFjay0+bHNlZWsgKGNhbGxiYWNrLHJlZ3NbNV0sIHJlZ3NbNl0sIHJlZ3NbN10pOwotCSAgICBicmVhazsKLQkgIGNhc2UgU1lTX2Nsb3NlOgotCSAgICByZWdzWzBdID0gY2FsbGJhY2stPmNsb3NlIChjYWxsYmFjayxyZWdzWzVdKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNZU19vcGVuOgotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IHN0cnN3YXBsZW4gKHJlZ3NbNV0pOwotCSAgICAgIHN0cm5zd2FwIChyZWdzWzVdLCBsZW4pOwotCSAgICAgIHJlZ3NbMF0gPSBjYWxsYmFjay0+b3BlbiAoY2FsbGJhY2sscHRyIChyZWdzWzVdKSwgcmVnc1s2XSk7Ci0JICAgICAgc3RybnN3YXAgKHJlZ3NbNV0sIGxlbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGNhc2UgU1lTX2V4aXQ6Ci0JICAgIC8qIEVYSVQgLSBjYWxsZXIgY2FuIGxvb2sgaW4gcjUgdG8gd29yayBvdXQgdGhlIHJlYXNvbiAqLwotCSAgICByYWlzZV9leGNlcHRpb24gKFNJR1FVSVQpOwotCSAgICByZWdzWzBdID0gcmVnc1s1XTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgU1lTX3N0YXQ6CS8qIGFkZGVkIGF0IGhtc2kgKi8KLQkgICAgLyogc3RhdCBzeXN0ZW0gY2FsbCAqLwotCSAgICB7Ci0JICAgICAgc3RydWN0IHN0YXQgaG9zdF9zdGF0OwotCSAgICAgIGludCBidWY7Ci0JICAgICAgaW50IGxlbiA9IHN0cnN3YXBsZW4gKHJlZ3NbNV0pOwotCi0JICAgICAgc3RybnN3YXAgKHJlZ3NbNV0sIGxlbik7Ci0JICAgICAgcmVnc1swXSA9IHN0YXQgKHB0ciAocmVnc1s1XSksICZob3N0X3N0YXQpOwotCSAgICAgIHN0cm5zd2FwIChyZWdzWzVdLCBsZW4pOwotCi0JICAgICAgYnVmID0gcmVnc1s2XTsKLQotCSAgICAgIFdXQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X2Rldik7Ci0JICAgICAgYnVmICs9IDI7Ci0JICAgICAgV1dBVCAoYnVmLCBob3N0X3N0YXQuc3RfaW5vKTsKLQkgICAgICBidWYgKz0gMjsKLQkgICAgICBXTEFUIChidWYsIGhvc3Rfc3RhdC5zdF9tb2RlKTsKLQkgICAgICBidWYgKz0gNDsKLQkgICAgICBXV0FUIChidWYsIGhvc3Rfc3RhdC5zdF9ubGluayk7Ci0JICAgICAgYnVmICs9IDI7Ci0JICAgICAgV1dBVCAoYnVmLCBob3N0X3N0YXQuc3RfdWlkKTsKLQkgICAgICBidWYgKz0gMjsKLQkgICAgICBXV0FUIChidWYsIGhvc3Rfc3RhdC5zdF9naWQpOwotCSAgICAgIGJ1ZiArPSAyOwotCSAgICAgIFdXQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X3JkZXYpOwotCSAgICAgIGJ1ZiArPSAyOwotCSAgICAgIFdMQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X3NpemUpOwotCSAgICAgIGJ1ZiArPSA0OwotCSAgICAgIFdMQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKLQkgICAgICBidWYgKz0gNDsKLQkgICAgICBXTEFUIChidWYsIDApOwotCSAgICAgIGJ1ZiArPSA0OwotCSAgICAgIFdMQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X210aW1lKTsKLQkgICAgICBidWYgKz0gNDsKLQkgICAgICBXTEFUIChidWYsIDApOwotCSAgICAgIGJ1ZiArPSA0OwotCSAgICAgIFdMQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X2N0aW1lKTsKLQkgICAgICBidWYgKz0gNDsKLQkgICAgICBXTEFUIChidWYsIDApOwotCSAgICAgIGJ1ZiArPSA0OwotCSAgICAgIFdMQVQgKGJ1ZiwgMCk7Ci0JICAgICAgYnVmICs9IDQ7Ci0JICAgICAgV0xBVCAoYnVmLCAwKTsKLQkgICAgICBidWYgKz0gNDsKLQkgICAgfQotCSAgICBicmVhazsKLQotI2lmbmRlZiBfV0lOMzIKLQkgIGNhc2UgU1lTX2Nob3duOgotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IHN0cnN3YXBsZW4gKHJlZ3NbNV0pOwotCi0JICAgICAgc3RybnN3YXAgKHJlZ3NbNV0sIGxlbik7Ci0JICAgICAgcmVnc1swXSA9IGNob3duIChwdHIgKHJlZ3NbNV0pLCByZWdzWzZdLCByZWdzWzddKTsKLQkgICAgICBzdHJuc3dhcCAocmVnc1s1XSwgbGVuKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotI2VuZGlmIC8qIF9XSU4zMiAqLwotCSAgY2FzZSBTWVNfY2htb2Q6Ci0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gc3Ryc3dhcGxlbiAocmVnc1s1XSk7Ci0KLQkgICAgICBzdHJuc3dhcCAocmVnc1s1XSwgbGVuKTsKLQkgICAgICByZWdzWzBdID0gY2htb2QgKHB0ciAocmVnc1s1XSksIHJlZ3NbNl0pOwotCSAgICAgIHN0cm5zd2FwIChyZWdzWzVdLCBsZW4pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBjYXNlIFNZU191dGltZToKLQkgICAgewotCSAgICAgIC8qIENhc3QgdGhlIHNlY29uZCBhcmd1bWVudCB0byB2b2lkICosIHRvIGF2b2lkIHR5cGUgbWlzbWF0Y2gKLQkJIGlmIGEgcHJvdG90eXBlIGlzIHByZXNlbnQuICAqLwotCSAgICAgIGludCBsZW4gPSBzdHJzd2FwbGVuIChyZWdzWzVdKTsKLQotCSAgICAgIHN0cm5zd2FwIChyZWdzWzVdLCBsZW4pOwotCSAgICAgIHJlZ3NbMF0gPSB1dGltZSAocHRyIChyZWdzWzVdKSwgKHZvaWQgKikgcHRyIChyZWdzWzZdKSk7Ci0JICAgICAgc3RybnN3YXAgKHJlZ3NbNV0sIGxlbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCXJlZ3NbMV0gPSBjYWxsYmFjay0+Z2V0X2Vycm5vIChjYWxsYmFjayk7Ci0JZXJybm8gPSBwZXJybm87Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHhjMzoKLSAgICBjYXNlIDI1NToKLSAgICAgIHJhaXNlX2V4Y2VwdGlvbiAoU0lHVFJBUCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLX0KLQotdm9pZAotY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKLSAgICAgaW50IHNpZzsKLSAgICAgaW50IGNvZGU7Ci0gICAgIGNoYXIgKnNjcDsKLSAgICAgY2hhciAqYWRkcjsKLXsKLSAgcmFpc2VfZXhjZXB0aW9uIChTSUdJTlQpOwotfQotCi1zdGF0aWMgaW50Ci1kaXYxIChSLCBpUm4yLCBpUm4xLyosIFQqLykKLSAgICAgaW50ICpSOwotICAgICBpbnQgaVJuMTsKLSAgICAgaW50IGlSbjI7Ci0gICAgIC8qIGludCBUOyovCi17Ci0gIHVuc2lnbmVkIGxvbmcgdG1wMDsKLSAgdW5zaWduZWQgY2hhciBvbGRfcSwgdG1wMTsKLQotICBvbGRfcSA9IFE7Ci0gIFNFVF9TUl9RICgodW5zaWduZWQgY2hhcikgKCgweDgwMDAwMDAwICYgUltpUm4xXSkgIT0gMCkpOwotICBSW2lSbjFdIDw8PSAxOwotICBSW2lSbjFdIHw9ICh1bnNpZ25lZCBsb25nKSBUOwotCi0gIHN3aXRjaCAob2xkX3EpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHN3aXRjaCAoTSkKLQl7Ci0JY2FzZSAwOgotCSAgdG1wMCA9IFJbaVJuMV07Ci0JICBSW2lSbjFdIC09IFJbaVJuMl07Ci0JICB0bXAxID0gKFJbaVJuMV0gPiB0bXAwKTsKLQkgIHN3aXRjaCAoUSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgU0VUX1NSX1EgKHRtcDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgU0VUX1NSX1EgKCh1bnNpZ25lZCBjaGFyKSAodG1wMSA9PSAwKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIHRtcDAgPSBSW2lSbjFdOwotCSAgUltpUm4xXSArPSBSW2lSbjJdOwotCSAgdG1wMSA9IChSW2lSbjFdIDwgdG1wMCk7Ci0JICBzd2l0Y2ggKFEpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIFNFVF9TUl9RICgodW5zaWduZWQgY2hhcikgKHRtcDEgPT0gMCkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgU0VUX1NSX1EgKHRtcDEpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBzd2l0Y2ggKE0pCi0JewotCWNhc2UgMDoKLQkgIHRtcDAgPSBSW2lSbjFdOwotCSAgUltpUm4xXSArPSBSW2lSbjJdOwotCSAgdG1wMSA9IChSW2lSbjFdIDwgdG1wMCk7Ci0JICBzd2l0Y2ggKFEpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIFNFVF9TUl9RICh0bXAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIFNFVF9TUl9RICgodW5zaWduZWQgY2hhcikgKHRtcDEgPT0gMCkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICB0bXAwID0gUltpUm4xXTsKLQkgIFJbaVJuMV0gLT0gUltpUm4yXTsKLQkgIHRtcDEgPSAoUltpUm4xXSA+IHRtcDApOwotCSAgc3dpdGNoIChRKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBTRVRfU1JfUSAoKHVuc2lnbmVkIGNoYXIpICh0bXAxID09IDApKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIFNFVF9TUl9RICh0bXAxKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKlQgPSAoUSA9PSBNKTsqLwotICBTRVRfU1JfVCAoUSA9PSBNKTsKLSAgLypyZXR1cm4gVDsqLwotfQotCi1zdGF0aWMgdm9pZAotZG11bCAoc2lnbiwgcm0sIHJuKQotICAgICBpbnQgc2lnbjsKLSAgICAgdW5zaWduZWQgaW50IHJtOwotICAgICB1bnNpZ25lZCBpbnQgcm47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgUm5MLCBSbkg7Ci0gIHVuc2lnbmVkIGxvbmcgUm1MLCBSbUg7Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7Ci0gIHVuc2lnbmVkIGxvbmcgUmVzMiwgUmVzMSwgUmVzMDsKLQotICBSbkwgPSBybiAmIDB4ZmZmZjsKLSAgUm5IID0gKHJuID4+IDE2KSAmIDB4ZmZmZjsKLSAgUm1MID0gcm0gJiAweGZmZmY7Ci0gIFJtSCA9IChybSA+PiAxNikgJiAweGZmZmY7Ci0gIHRlbXAwID0gUm1MICogUm5MOwotICB0ZW1wMSA9IFJtSCAqIFJuTDsKLSAgdGVtcDIgPSBSbUwgKiBSbkg7Ci0gIHRlbXAzID0gUm1IICogUm5IOwotICBSZXMyID0gMDsKLSAgUmVzMSA9IHRlbXAxICsgdGVtcDI7Ci0gIGlmIChSZXMxIDwgdGVtcDEpCi0gICAgUmVzMiArPSAweDAwMDEwMDAwOwotICB0ZW1wMSA9IChSZXMxIDw8IDE2KSAmIDB4ZmZmZjAwMDA7Ci0gIFJlczAgPSB0ZW1wMCArIHRlbXAxOwotICBpZiAoUmVzMCA8IHRlbXAwKQotICAgIFJlczIgKz0gMTsKLSAgUmVzMiArPSAoKFJlczEgPj4gMTYpICYgMHhmZmZmKSArIHRlbXAzOwotICAKLSAgaWYgKHNpZ24pCi0gICAgewotICAgICAgaWYgKHJuICYgMHg4MDAwMDAwMCkKLQlSZXMyIC09IHJtOwotICAgICAgaWYgKHJtICYgMHg4MDAwMDAwMCkKLQlSZXMyIC09IHJuOwotICAgIH0KLQotICBNQUNIID0gUmVzMjsKLSAgTUFDTCA9IFJlczA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWN3IChyZWdzLCBtZW1vcnksIG4sIG0sIGVuZGlhbncpCi0gICAgIGludCAqcmVnczsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICAgICBpbnQgbSwgbjsKLSAgICAgaW50IGVuZGlhbnc7Ci17Ci0gIGxvbmcgdGVtcG0sIHRlbXBuOwotICBsb25nIHByb2QsIG1hY2wsIHN1bTsKLQotICB0ZW1wbT1SU1dBVChyZWdzW21dKTsgcmVnc1ttXSs9MjsKLSAgdGVtcG49UlNXQVQocmVnc1tuXSk7IHJlZ3Nbbl0rPTI7Ci0KLSAgbWFjbCA9IE1BQ0w7Ci0gIHByb2QgPSAobG9uZykoc2hvcnQpIHRlbXBtICogKGxvbmcpKHNob3J0KSB0ZW1wbjsKLSAgc3VtID0gcHJvZCArIG1hY2w7Ci0gIGlmIChTKQotICAgIHsKLSAgICAgIGlmICgofihwcm9kIF4gbWFjbCkgJiAoc3VtIF4gcHJvZCkpIDwgMCkKLQl7Ci0JICAvKiBNQUNIJ3MgbHNiIGlzIGEgc3RpY2t5IG92ZXJmbG93IGJpdC4gICovCi0JICBNQUNIIHw9IDE7Ci0JICAvKiBTdG9yZSB0aGUgc21hbGxlc3QgbmVnYXRpdmUgbnVtYmVyIGluIE1BQ0wgaWYgcHJvZCBpcwotCSAgICAgbmVnYXRpdmUsIGFuZCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLiAgKi8KLQkgIHN1bSA9IDB4N2ZmZmZmZmYgKyAocHJvZCA8IDApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1hY2g7Ci0gICAgICAvKiBBZGQgdG8gTUFDSCB0aGUgc2lnbiBleHRlbmRlZCBwcm9kdWN0LCBhbmQgY2FycnkgZnJvbSBsb3cgc3VtLiAgKi8KLSAgICAgIG1hY2ggPSBNQUNIICsgKC0ocHJvZCA8IDApKSArICgodW5zaWduZWQgbG9uZykgc3VtIDwgcHJvZCk7Ci0gICAgICAvKiBTaWduIGV4dGVuZCBhdCAxMDp0aCBiaXQgaW4gTUFDSC4gICovCi0gICAgICBNQUNIID0gKG1hY2ggJiAweDFmZikgfCAtKG1hY2ggJiAweDIwMCk7Ci0gICAgfQotICBNQUNMID0gc3VtOwotfQotCi1zdGF0aWMgc3RydWN0IGxvb3BfYm91bmRzCi1nZXRfbG9vcF9ib3VuZHMgKHJzLCByZSwgbWVtb3J5LCBtZW1fZW5kLCBtYXNrdywgZW5kaWFudykKLSAgICAgaW50IHJzLCByZTsKLSAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5LCAqbWVtX2VuZDsKLSAgICAgaW50IG1hc2t3LCBlbmRpYW53OwotewotICBzdHJ1Y3QgbG9vcF9ib3VuZHMgbG9vcDsKLQotICBpZiAoU1JfUkMpCi0gICAgewotICAgICAgaWYgKFJTID49IFJFKQotCXsKLQkgIGxvb3Auc3RhcnQgPSBQVDJIIChSRSAtIDQpOwotCSAgU0tJUF9JTlNOIChsb29wLnN0YXJ0KTsKLQkgIGxvb3AuZW5kID0gbG9vcC5zdGFydDsKLQkgIGlmIChSUyAtIFJFID09IDApCi0JICAgIFNLSVBfSU5TTiAobG9vcC5lbmQpOwotCSAgaWYgKFJTIC0gUkUgPD0gMikKLQkgICAgU0tJUF9JTlNOIChsb29wLmVuZCk7Ci0JICBTS0lQX0lOU04gKGxvb3AuZW5kKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9vcC5zdGFydCA9IFBUMkggKFJTKTsKLQkgIGxvb3AuZW5kID0gUFQySCAoUkUgLSA0KTsKLQkgIFNLSVBfSU5TTiAobG9vcC5lbmQpOwotCSAgU0tJUF9JTlNOIChsb29wLmVuZCk7Ci0JICBTS0lQX0lOU04gKGxvb3AuZW5kKTsKLQkgIFNLSVBfSU5TTiAobG9vcC5lbmQpOwotCX0KLSAgICAgIGlmIChsb29wLmVuZCA+PSBtZW1fZW5kKQotCWxvb3AuZW5kID0gUFQySCAoMCk7Ci0gICAgfQotICBlbHNlCi0gICAgbG9vcC5lbmQgPSBQVDJIICgwKTsKLQotICByZXR1cm4gbG9vcDsKLX0KLQotc3RhdGljIHZvaWQKLXBwaV9pbnNuKCk7Ci0KLSNpbmNsdWRlICJwcGkuYyIKLQotLyogU2V0IHRoZSBtZW1vcnkgc2l6ZSB0byB0aGUgcG93ZXIgb2YgdHdvIHByb3ZpZGVkLiAqLwotCi12b2lkCi1zaW1fc2l6ZSAocG93ZXIpCi0gICAgIGludCBwb3dlcjsKLQotewotICBzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUgPSAxIDw8IHBvd2VyOwotCi0gIHNpbV9tZW1vcnlfc2l6ZSA9IHBvd2VyOwotCi0gIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MubWVtb3J5KQotICAgIHsKLSAgICAgIGZyZWUgKHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnkpOwotICAgIH0KLQotICBzYXZlZF9zdGF0ZS5hc3JlZ3MubWVtb3J5ID0KLSAgICAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKDY0LCBzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUgLyA2NCk7Ci0KLSAgaWYgKCFzYXZlZF9zdGF0ZS5hc3JlZ3MubWVtb3J5KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIk5vdCBlbm91Z2ggVk0gZm9yIHNpbXVsYXRpb24gb2YgJWQgYnl0ZXMgb2YgUkFNXG4iLAotCSAgICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUpOwotCi0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUgPSAxOwotICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoMSwgMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotaW5pdF9kc3AgKGFiZmQpCi0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotewotICBpbnQgd2FzX2RzcCA9IHRhcmdldF9kc3A7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7Ci0KLSAgaWYgKG1hY2ggPT0gYmZkX21hY2hfc2hfZHNwIHx8IG1hY2ggPT0gYmZkX21hY2hfc2gzX2RzcCkKLSAgICB7Ci0gICAgICBpbnQgcmFtX2FyZWFfc2l6ZSwgeHJhbV9zdGFydCwgeXJhbV9zdGFydDsKLSAgICAgIGludCBuZXdfc2VsZWN0OwotCi0gICAgICB0YXJnZXRfZHNwID0gMTsKLSAgICAgIGlmIChtYWNoID09IGJmZF9tYWNoX3NoX2RzcCkKLQl7Ci0JICAvKiBTSDc0MTAgKG9yaWcuIHNoLXNkcCk6Ci0JICAgICA0S0IgZWFjaCBmb3IgWCAmIFkgbWVtb3J5OwotCSAgICAgT24tY2hpcCBYIFJBTSAweDA4MDBmMDAwLTB4MDgwMGZmZmYKLQkgICAgIE9uLWNoaXAgWSBSQU0gMHgwODAxZjAwMC0weDA4MDFmZmZmICAqLwotCSAgeHJhbV9zdGFydCA9IDB4MDgwMGYwMDA7Ci0JICByYW1fYXJlYV9zaXplID0gMHgxMDAwOwotCX0KLSAgICAgIGlmIChtYWNoID09IGJmZF9tYWNoX3NoM19kc3ApCi0JewotCSAgLyogU0g3NjEyOgotCSAgICAgOEtCIGVhY2ggZm9yIFggJiBZIG1lbW9yeTsKLQkgICAgIE9uLWNoaXAgWCBSQU0gMHgxMDAwZTAwMC0weDEwMDBmZmZmCi0JICAgICBPbi1jaGlwIFkgUkFNIDB4MTAwMWUwMDAtMHgxMDAxZmZmZiAgKi8KLQkgIHhyYW1fc3RhcnQgPSAweDEwMDBlMDAwOwotCSAgcmFtX2FyZWFfc2l6ZSA9IDB4MjAwMDsKLQl9Ci0gICAgICB5cmFtX3N0YXJ0ID0geHJhbV9zdGFydCArIDB4MTAwMDA7Ci0gICAgICBuZXdfc2VsZWN0ID0gfihyYW1fYXJlYV9zaXplIC0gMSk7Ci0gICAgICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLnh5cmFtX3NlbGVjdCAhPSBuZXdfc2VsZWN0KQotCXsKLQkgIHNhdmVkX3N0YXRlLmFzcmVncy54eXJhbV9zZWxlY3QgPSBuZXdfc2VsZWN0OwotCSAgZnJlZSAoc2F2ZWRfc3RhdGUuYXNyZWdzLnhtZW0pOwotCSAgZnJlZSAoc2F2ZWRfc3RhdGUuYXNyZWdzLnltZW0pOwotCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnhtZW0gPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKDEsIHJhbV9hcmVhX3NpemUpOwotCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnltZW0gPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKDEsIHJhbV9hcmVhX3NpemUpOwotCi0JICAvKiBEaXNhYmxlIHVzZSBvZiBYIC8gWSBtbWVvcnkgaWYgbm90IGFsbG9jYXRlZC4gICovCi0JICBpZiAoISBzYXZlZF9zdGF0ZS5hc3JlZ3MueG1lbSB8fCAhIHNhdmVkX3N0YXRlLmFzcmVncy55bWVtKQotCSAgICB7Ci0JICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLnh5cmFtX3NlbGVjdCA9IDA7Ci0JICAgICAgaWYgKHNhdmVkX3N0YXRlLmFzcmVncy54bWVtKQotCQlmcmVlIChzYXZlZF9zdGF0ZS5hc3JlZ3MueG1lbSk7Ci0JICAgICAgaWYgKHNhdmVkX3N0YXRlLmFzcmVncy55bWVtKQotCQlmcmVlIChzYXZlZF9zdGF0ZS5hc3JlZ3MueW1lbSk7Ci0JICAgIH0KLQl9Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MueHJhbV9zdGFydCA9IHhyYW1fc3RhcnQ7Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MueXJhbV9zdGFydCA9IHlyYW1fc3RhcnQ7Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MueG1lbV9vZmZzZXQgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MueG1lbSAtIHhyYW1fc3RhcnQ7Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MueW1lbV9vZmZzZXQgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MueW1lbSAtIHlyYW1fc3RhcnQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGFyZ2V0X2RzcCA9IDA7Ci0gICAgICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLnh5cmFtX3NlbGVjdCkKLQl7Ci0JICBzYXZlZF9zdGF0ZS5hc3JlZ3MueHlyYW1fc2VsZWN0ID0gMDsKLQkgIGZyZWUgKHNhdmVkX3N0YXRlLmFzcmVncy54bWVtKTsKLQkgIGZyZWUgKHNhdmVkX3N0YXRlLmFzcmVncy55bWVtKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIHNhdmVkX3N0YXRlLmFzcmVncy54eXJhbV9zZWxlY3QpCi0gICAgewotICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLnhyYW1fc3RhcnQgPSAxOwotICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLnlyYW1fc3RhcnQgPSAxOwotICAgIH0KLQotICBpZiAodGFyZ2V0X2RzcCAhPSB3YXNfZHNwKQotICAgIHsKLSAgICAgIGludCBpLCB0bXA7Ci0KLSAgICAgIGZvciAoaSA9IHNpemVvZiBzaF9kc3BfdGFibGUgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICB0bXAgPSBzaF9qdW1wX3RhYmxlWzB4ZjAwMCArIGldOwotCSAgc2hfanVtcF90YWJsZVsweGYwMDAgKyBpXSA9IHNoX2RzcF90YWJsZVtpXTsKLQkgIHNoX2RzcF90YWJsZVtpXSA9IHRtcDsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotaW5pdF9wb2ludGVycyAoKQotewotICBob3N0X2xpdHRsZV9lbmRpYW4gPSAwOwotICAqKGNoYXIqKSZob3N0X2xpdHRsZV9lbmRpYW4gPSAxOwotICBob3N0X2xpdHRsZV9lbmRpYW4gJj0gMTsKLQotICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplICE9IDEgPDwgc2ltX21lbW9yeV9zaXplKQotICAgIHsKLSAgICAgIHNpbV9zaXplIChzaW1fbWVtb3J5X3NpemUpOwotICAgIH0KLQotICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGUgJiYgIXByb2ZpbGVfZmlsZSkKLSAgICB7Ci0gICAgICBwcm9maWxlX2ZpbGUgPSBmb3BlbiAoImdtb24ub3V0IiwgIndiIik7Ci0gICAgICAvKiBTZWVrIHRvIHdoZXJlIHRvIHB1dCB0aGUgY2FsbCBhcmMgZGF0YSAqLwotICAgICAgbnNhbXBsZXMgPSAoMSA8PCBzaW1fcHJvZmlsZV9zaXplKTsKLQotICAgICAgZnNlZWsgKHByb2ZpbGVfZmlsZSwgbnNhbXBsZXMgKiAyICsgMTIsIDApOwotCi0gICAgICBpZiAoIXByb2ZpbGVfZmlsZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBvcGVuIGdtb24ub3V0XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGVfaGlzdCA9Ci0JICAgICh1bnNpZ25lZCBzaG9ydCAqKSBjYWxsb2MgKDY0LCAobnNhbXBsZXMgKiBzaXplb2YgKHNob3J0KSAvIDY0KSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfcHJvZmlsZSAoKQotewotICB1bnNpZ25lZCBpbnQgbWlucGM7Ci0gIHVuc2lnbmVkIGludCBtYXhwYzsKLSAgdW5zaWduZWQgc2hvcnQgKnA7Ci0gIGludCBpOwotCi0gIHAgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZV9oaXN0OwotICBtaW5wYyA9IDA7Ci0gIG1heHBjID0gKDEgPDwgc2ltX3Byb2ZpbGVfc2l6ZSk7Ci0KLSAgZnNlZWsgKHByb2ZpbGVfZmlsZSwgMEwsIDApOwotICBzd2Fwb3V0IChtaW5wYyA8PCBQUk9GSUxFX1NISUZUKTsKLSAgc3dhcG91dCAobWF4cGMgPDwgUFJPRklMRV9TSElGVCk7Ci0gIHN3YXBvdXQgKG5zYW1wbGVzICogMiArIDEyKTsKLSAgZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyspCi0gICAgc3dhcG91dDE2IChzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZV9oaXN0W2ldKTsKLQotfQotCi1zdGF0aWMgdm9pZAotZ290Y2FsbCAoZnJvbSwgdG8pCi0gICAgIGludCBmcm9tOwotICAgICBpbnQgdG87Ci17Ci0gIHN3YXBvdXQgKGZyb20pOwotICBzd2Fwb3V0ICh0byk7Ci0gIHN3YXBvdXQgKDEpOwotfQotCi0jZGVmaW5lIE1NQVNLQiAoKHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSAtMSkgJiB+MCkKLQotaW50Ci1zaW1fc3RvcCAoc2QpCi0gICAgIFNJTV9ERVNDIHNkOwotewotICByYWlzZV9leGNlcHRpb24gKFNJR0lOVCk7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBzdGVwLCBzaWdnbmFsOwotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICppbnNuX3B0cjsKLSAgdW5zaWduZWQgY2hhciAqbWVtX2VuZDsKLSAgc3RydWN0IGxvb3BfYm91bmRzIGxvb3A7Ci0gIHJlZ2lzdGVyIGludCBjeWNsZXMgPSAwOwotICByZWdpc3RlciBpbnQgc3RhbGxzID0gMDsKLSAgcmVnaXN0ZXIgaW50IG1lbXN0YWxscyA9IDA7Ci0gIHJlZ2lzdGVyIGludCBpbnN0cyA9IDA7Ci0gIHJlZ2lzdGVyIGludCBwcmV2bG9jazsKLSAgcmVnaXN0ZXIgaW50IHRoaXNsb2NrOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgZG9wcm9maWxlOwotICByZWdpc3RlciBpbnQgcG9sbGNvdW50ID0gMDsKLSAgLyogZW5kaWFudyBpcyB1c2VkIGZvciBldmVyeSBpbnNuIGZldGNoLCBoZW5jZSBpdCBtYWtlcyBzZW5zZSB0byBjYWNoZSBpdC4KLSAgICAgZW5kaWFuYiBpcyB1c2VkIGxlc3Mgb2Z0ZW4uICAqLwotICByZWdpc3RlciBpbnQgZW5kaWFudyA9IGdsb2JhbF9lbmRpYW53OwotCi0gIGludCB0aWNrX3N0YXJ0ID0gZ2V0X25vdyAoKTsKLSAgdm9pZCAoKnByZXYpICgpOwotICB2b2lkICgqcHJldl9mcGUpICgpOwotCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmp1bXBfdGFibGUgPSBzaF9qdW1wX3RhYmxlOwotCi0gIHJlZ2lzdGVyIGludCAqUiA9ICYoc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbMF0pOwotICAvKnJlZ2lzdGVyIGludCBUOyovCi0jaWZuZGVmIFBSCi0gIHJlZ2lzdGVyIGludCBQUjsKLSNlbmRpZgotCi0gIHJlZ2lzdGVyIGludCBtYXNrYiA9IH4oKHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSAtIDEpICYgfjApOwotICByZWdpc3RlciBpbnQgbWFza3cgPSB+KChzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUgLSAxKSAmIH4xKTsKLSAgcmVnaXN0ZXIgaW50IG1hc2tsID0gfigoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplIC0gMSkgJiB+Myk7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHNiaXQgPSAoKHVuc2lnbmVkIGludCkgMSA8PCAzMSk7Ci0KLSAgcHJldiA9IHNpZ25hbCAoU0lHSU5ULCBjb250cm9sX2MpOwotICBwcmV2X2ZwZSA9IHNpZ25hbCAoU0lHRlBFLCBTSUdfSUdOKTsKLQotICBpbml0X3BvaW50ZXJzICgpOwotICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uID0gMDsKLQotICBtZW1vcnkgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MubWVtb3J5OwotICBtZW1fZW5kID0gbWVtb3J5ICsgc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplOwotCi0gIGxvb3AgPSBnZXRfbG9vcF9ib3VuZHMgKFJTLCBSRSwgbWVtb3J5LCBtZW1fZW5kLCBtYXNrdywgZW5kaWFudyk7Ci0gIGluc25fcHRyID0gUFQySCAoc2F2ZWRfc3RhdGUuYXNyZWdzLnBjKTsKLSAgQ0hFQ0tfSU5TTl9QVFIgKGluc25fcHRyKTsKLQotI2lmbmRlZiBQUgotICBQUiA9IHNhdmVkX3N0YXRlLmFzcmVncy5zcmVncy5uYW1lZC5wcjsKLSNlbmRpZgotICAvKlQgPSBHRVRfU1IgKCkgJiBTUl9NQVNLX1Q7Ki8KLSAgcHJldmxvY2sgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJldmxvY2s7Ci0gIHRoaXNsb2NrID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnRoaXNsb2NrOwotICBkb3Byb2ZpbGUgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZTsKLQotICAvKiBJZiBwcm9maWxpbmcgbm90IGVuYWJsZWQsIGRpc2FibGUgaXQgYnkgYXNraW5nIGZvcgotICAgICBwcm9maWxlcyBpbmZyZXF1ZW50bHkuICovCi0gIGlmIChkb3Byb2ZpbGUgPT0gMCkKLSAgICBkb3Byb2ZpbGUgPSB+MDsKLQotIGxvb3A6Ci0gIGlmIChzdGVwICYmIGluc25fcHRyIDwgc2F2ZWRfc3RhdGUuYXNyZWdzLmluc25fZW5kKQotICAgIHsKLSAgICAgIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uKQotCS8qIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gc2luZ2xlLXN0ZXBwaW5nIGFuZAotCSAgIGVuY291bnRlcmVkIGEgbG9vcCBlbmQuICAqLwotCXNhdmVkX3N0YXRlLmFzcmVncy5pbnNuX2VuZCA9IGluc25fcHRyOwotICAgICAgZWxzZQotCXsKLQkgIHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPSBTSUdUUkFQOwotCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLmluc25fZW5kID0gaW5zbl9wdHIgKyAyOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKGluc25fcHRyIDwgc2F2ZWRfc3RhdGUuYXNyZWdzLmluc25fZW5kKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZCA9IFJJQVQgKGluc25fcHRyKTsKLSAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB1bHQ7Ci0gICAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpuaXAgPSBpbnNuX3B0ciArIDI7Ci0KLSNpZm5kZWYgQUNFX0ZBU1QKLSAgICAgIGluc3RzKys7Ci0jZW5kaWYKLSAgICB0b3A6Ci0KLSNpbmNsdWRlICJjb2RlLmMiCi0KLQotICAgICAgaW5zbl9wdHIgPSBuaXA7Ci0KLSAgICAgIGlmICgtLXBvbGxjb3VudCA8IDApCi0JewotCSAgcG9sbGNvdW50ID0gUE9MTF9RVUlUX0lOVEVSVkFMOwotCSAgaWYgKCgqY2FsbGJhY2stPnBvbGxfcXVpdCkgIT0gTlVMTAotCSAgICAgICYmICgqY2FsbGJhY2stPnBvbGxfcXVpdCkgKGNhbGxiYWNrKSkKLQkgICAgewotCSAgICAgIHNpbV9zdG9wIChzZCk7Ci0JICAgIH0JICAgIAotCX0KLQotI2lmbmRlZiBBQ0VfRkFTVAotICAgICAgcHJldmxvY2sgPSB0aGlzbG9jazsKLSAgICAgIHRoaXNsb2NrID0gMzA7Ci0gICAgICBjeWNsZXMrKzsKLQotICAgICAgaWYgKGN5Y2xlcyA+PSBkb3Byb2ZpbGUpCi0JewotCi0JICBzYXZlZF9zdGF0ZS5hc3JlZ3MuY3ljbGVzICs9IGRvcHJvZmlsZTsKLQkgIGN5Y2xlcyAtPSBkb3Byb2ZpbGU7Ci0JICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGVfaGlzdCkKLQkgICAgewotCSAgICAgIGludCBuID0gUEgyVCAoaW5zbl9wdHIpID4+IFBST0ZJTEVfU0hJRlQ7Ci0JICAgICAgaWYgKG4gPCBuc2FtcGxlcykKLQkJewotCQkgIGludCBpID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGVfaGlzdFtuXTsKLQkJICBpZiAoaSA8IDY1MDAwKQotCQkgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGVfaGlzdFtuXSA9IGkgKyAxOwotCQl9Ci0KLQkgICAgfQotCX0KLSNlbmRpZgotICAgIH0KLSAgaWYgKHNhdmVkX3N0YXRlLmFzcmVncy5pbnNuX2VuZCA9PSBsb29wLmVuZCkKLSAgICB7Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuY3JlZ3MubmFtZWQuc3IgKz0gU1JfUkNfSU5DUkVNRU5UOwotICAgICAgaWYgKFNSX1JDKQotCWluc25fcHRyID0gbG9vcC5zdGFydDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzYXZlZF9zdGF0ZS5hc3JlZ3MuaW5zbl9lbmQgPSBtZW1fZW5kOwotCSAgbG9vcC5lbmQgPSBQVDJIICgwKTsKLQl9Ci0gICAgICBnb3RvIGxvb3A7Ci0gICAgfQotCi0gIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uID09IFNJR0lMTAotICAgICAgfHwgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9PSBTSUdCVVMpCi0gICAgewotICAgICAgaW5zbl9wdHIgLT0gMjsKLSAgICB9Ci0gIC8qIENoZWNrIGZvciBTSUdCVVMgZHVlIHRvIGluc24gZmV0Y2guICAqLwotICBlbHNlIGlmICghIHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24pCi0gICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9PSBTSUdCVVM7Ci0KLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnRpY2tzICs9IGdldF9ub3cgKCkgLSB0aWNrX3N0YXJ0OwotICBzYXZlZF9zdGF0ZS5hc3JlZ3MuY3ljbGVzICs9IGN5Y2xlczsKLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnN0YWxscyArPSBzdGFsbHM7Ci0gIHNhdmVkX3N0YXRlLmFzcmVncy5tZW1zdGFsbHMgKz0gbWVtc3RhbGxzOwotICBzYXZlZF9zdGF0ZS5hc3JlZ3MuaW5zdHMgKz0gaW5zdHM7Ci0gIHNhdmVkX3N0YXRlLmFzcmVncy5wYyA9IFBIMlQgKGluc25fcHRyKTsKLSNpZm5kZWYgUFIKLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnNyZWdzLm5hbWVkLnByID0gUFI7Ci0jZW5kaWYKLQotICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJldmxvY2sgPSBwcmV2bG9jazsKLSAgc2F2ZWRfc3RhdGUuYXNyZWdzLnRoaXNsb2NrID0gdGhpc2xvY2s7Ci0KLSAgaWYgKHByb2ZpbGVfZmlsZSkKLSAgICB7Ci0gICAgICBkdW1wX3Byb2ZpbGUgKCk7Ci0gICAgfQotCi0gIHNpZ25hbCAoU0lHRlBFLCBwcmV2X2ZwZSk7Ci0gIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKLX0KLQotaW50Ci1zaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLQotICBpbml0X3BvaW50ZXJzICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeVsoTU1BU0tCICYgKGFkZHIgKyBpKSkgXiBlbmRpYW5iXSA9IGJ1ZmZlcltpXTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGk7Ci0KLSAgaW5pdF9wb2ludGVycyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGJ1ZmZlcltpXSA9IHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnlbKE1NQVNLQiAmIChhZGRyICsgaSkpIF4gZW5kaWFuYl07Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotaW50Ci1zaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgdW5zaWduZWQgdmFsOwotCi0gIGluaXRfcG9pbnRlcnMgKCk7Ci0gIHZhbCA9IHN3YXAgKCogKGludCAqKW1lbW9yeSk7Ci0gIHN3aXRjaCAocm4pCi0gICAgewotICAgIGNhc2UgIDA6IGNhc2UgIDE6IGNhc2UgIDI6IGNhc2UgIDM6IGNhc2UgIDQ6IGNhc2UgIDU6IGNhc2UgIDY6IGNhc2UgIDc6Ci0gICAgY2FzZSAgODogY2FzZSAgOTogY2FzZSAxMDogY2FzZSAxMTogY2FzZSAxMjogY2FzZSAxMzogY2FzZSAxNDogY2FzZSAxNToKLSAgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW3JuXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MucGMgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE3OgotICAgICAgUFIgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE4OgotICAgICAgR0JSID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOToKLSAgICAgIFZCUiA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjA6Ci0gICAgICBNQUNIID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMToKLSAgICAgIE1BQ0wgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIyOgotICAgICAgU0VUX1NSICh2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMzoKLSAgICAgIEZQVUwgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgU0VUX0ZQU0NSICh2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNToKLSAgICAgIGlmICh0YXJnZXRfZHNwKQotCUEwRyA9IHZhbDsKLSAgICBlbHNlIGNhc2UgMjY6Ci0gICAgICBpZiAodGFyZ2V0X2RzcCkKLQlBMCA9IHZhbDsKLSAgICBlbHNlIGNhc2UgMjc6Ci0gICAgICBpZiAodGFyZ2V0X2RzcCkKLQlBMUcgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDI4OgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JQTEgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDI5OgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JTTAgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDMwOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JTTEgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDMxOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JWDAgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDMyOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JWDEgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDMzOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JWTAgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDM0OgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JWTEgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDQwOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JU0VUX01PRCAodmFsKTsKLSAgICBlbHNlIGNhc2UgMzU6IGNhc2UgMzY6IGNhc2UgMzc6IGNhc2UgMzg6IGNhc2UgMzk6Ci0JU0VUX0ZJIChybiAtIDI1LCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0MToKLSAgICAgIFNTUiA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDI6Ci0gICAgICBTUEMgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICAvKiBUaGUgcm5fYmFuayBpZGlvc3luY3JhY2llcyBhcmUgbm90IGR1ZSB0byBoYXJkd2FyZSBkaWZmZXJlbmNlcywgYnV0IHRvCi0gICAgICAgYSB3ZWlyZCBhbGlhc2luZyBuYW1pbmcgc2NoZW1lIGZvciBzaDMgLyBzaDNlIC8gc2g0LiAgKi8KLSAgICBjYXNlIDQzOgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JUlMgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDQ0OgotICAgICAgaWYgKHRhcmdldF9kc3ApCi0JUkUgPSB2YWw7Ci0gICAgZWxzZSBjYXNlIDQ1OiBjYXNlIDQ2OiBjYXNlIDQ3OiBjYXNlIDQ4OiBjYXNlIDQ5OiBjYXNlIDUwOgotICAgICAgaWYgKFNSX01EICYmIFNSX1JCKQotCVJuX0JBTksgKHJuIC0gNDMpID0gdmFsOwotICAgICAgZWxzZQotCXNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW3JuIC0gNDNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MTogY2FzZSA1MjogY2FzZSA1MzogY2FzZSA1NDogY2FzZSA1NTogY2FzZSA1NjogY2FzZSA1NzogY2FzZSA1ODoKLSAgICAgIGlmICh0YXJnZXRfZHNwIHx8ICEgU1JfTUQgfHwgISBTUl9SQikKLQlTRVRfUm5fQkFOSyAocm4gLSA1MSwgdmFsKTsKLSAgICAgIGVsc2UKLQlzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1tybiAtIDUxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgaW50IHZhbDsKLQotICBpbml0X3BvaW50ZXJzICgpOwotICBzd2l0Y2ggKHJuKQotICAgIHsKLSAgICBjYXNlICAwOiBjYXNlICAxOiBjYXNlICAyOiBjYXNlICAzOiBjYXNlICA0OiBjYXNlICA1OiBjYXNlICA2OiBjYXNlICA3OgotICAgIGNhc2UgIDg6IGNhc2UgIDk6IGNhc2UgMTA6IGNhc2UgMTE6IGNhc2UgMTI6IGNhc2UgMTM6IGNhc2UgMTQ6IGNhc2UgMTU6Ci0gICAgICB2YWwgPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1tybl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgdmFsID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnBjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzoKLSAgICAgIHZhbCA9IFBSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgIHZhbCA9IEdCUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTk6Ci0gICAgICB2YWwgPSBWQlI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIwOgotICAgICAgdmFsID0gTUFDSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6Ci0gICAgICB2YWwgPSBNQUNMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjoKLSAgICAgIHZhbCA9IEdFVF9TUiAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjM6Ci0gICAgICB2YWwgPSBGUFVMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIHZhbCA9IEdFVF9GUFNDUiAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU6Ci0gICAgICB2YWwgPSB0YXJnZXRfZHNwID8gU0VYVCAoQTBHKSA6IEZJICgwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjY6Ci0gICAgICB2YWwgPSB0YXJnZXRfZHNwID8gQTAgOiBGSSAoMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3OgotICAgICAgdmFsID0gdGFyZ2V0X2RzcCA/IFNFWFQgKEExRykgOiBGSSAoMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI4OgotICAgICAgdmFsID0gdGFyZ2V0X2RzcCA/IEExIDogRkkgKDMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOToKLSAgICAgIHZhbCA9IHRhcmdldF9kc3AgPyBNMCA6IEZJICg0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzA6Ci0gICAgICB2YWwgPSB0YXJnZXRfZHNwID8gTTEgOiBGSSAoNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMxOgotICAgICAgdmFsID0gdGFyZ2V0X2RzcCA/IFgwIDogRkkgKDYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIHZhbCA9IHRhcmdldF9kc3AgPyBYMSA6IEZJICg3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzM6Ci0gICAgICB2YWwgPSB0YXJnZXRfZHNwID8gWTAgOiBGSSAoOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM0OgotICAgICAgdmFsID0gdGFyZ2V0X2RzcCA/IFkxIDogRkkgKDkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzNTogY2FzZSAzNjogY2FzZSAzNzogY2FzZSAzODogY2FzZSAzOToKLSAgICAgIHZhbCA9IEZJIChybiAtIDI1KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDA6Ci0gICAgICB2YWwgPSB0YXJnZXRfZHNwID8gTU9EIDogRkkgKDE1KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDE6Ci0gICAgICB2YWwgPSBTU1I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQyOgotICAgICAgdmFsID0gU1BDOwotICAgICAgYnJlYWs7Ci0gICAgLyogVGhlIHJuX2JhbmsgaWRpb3N5bmNyYWNpZXMgYXJlIG5vdCBkdWUgdG8gaGFyZHdhcmUgZGlmZmVyZW5jZXMsIGJ1dCB0bwotICAgICAgIGEgd2VpcmQgYWxpYXNpbmcgbmFtaW5nIHNjaGVtZSBmb3Igc2gzIC8gc2gzZSAvIHNoNC4gICovCi0gICAgY2FzZSA0MzoKLSAgICAgIGlmICh0YXJnZXRfZHNwKQotCXZhbCA9IFJTOwotICAgIGVsc2UgY2FzZSA0NDoKLSAgICAgIGlmICh0YXJnZXRfZHNwKQotCXZhbCA9IFJFOwotICAgIGVsc2UgY2FzZSA0NTogY2FzZSA0NjogY2FzZSA0NzogY2FzZSA0ODogY2FzZSA0OTogY2FzZSA1MDoKLQl2YWwgPSAoU1JfTUQgJiYgU1JfUkIKLQkgICAgICAgPyBSbl9CQU5LIChybiAtIDQzKQotCSAgICAgICA6IHNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW3JuIC0gNDNdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNTE6IGNhc2UgNTI6IGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6IGNhc2UgNTc6IGNhc2UgNTg6Ci0gICAgICB2YWwgPSAodGFyZ2V0X2RzcCB8fCAhIFNSX01EIHx8ICEgU1JfUkIKLQkgICAgID8gUm5fQkFOSyAocm4gLSA1MSkKLQkgICAgIDogc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3Nbcm4gLSA1MV0pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgKiAoaW50ICopIG1lbW9yeSA9IHN3YXAgKHZhbCk7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fdHJhY2UgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247Ci0gICAgIGludCAqc2lncmM7Ci17Ci0gIC8qIFRoZSBTSCBzaW11bGF0b3IgdXNlcyBTSUdRVUlUIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2dyYW0gaGFzCi0gICAgIGV4aXRlZCwgc28gd2UgbXVzdCBjaGVjayBmb3IgaXQgaGVyZSBhbmQgdHJhbnNsYXRlIGl0IHRvIGV4aXQuICAqLwotICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9PSBTSUdRVUlUKQotICAgIHsKLSAgICAgICpyZWFzb24gPSBzaW1fZXhpdGVkOwotICAgICAgKnNpZ3JjID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbNV07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOwotICAgICAgKnNpZ3JjID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbjsKLSAgICB9Ci19Ci0KLXZvaWQKLXNpbV9pbmZvIChzZCwgdmVyYm9zZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCB2ZXJib3NlOwotewotICBkb3VibGUgdGltZXRha2VuID0gKGRvdWJsZSkgc2F2ZWRfc3RhdGUuYXNyZWdzLnRpY2tzIC8gKGRvdWJsZSkgbm93X3BlcnNlYyAoKTsKLSAgZG91YmxlIHZpcnR0aW1lID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmN5Y2xlcyAvIDM2LjBlNjsKLQotICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIlxuXG4jIGluc3RydWN0aW9ucyBleGVjdXRlZCAgJTEwZFxuIiwgCi0JCQkgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5pbnN0cyk7Ci0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBjeWNsZXMgICAgICAgICAgICAgICAgICUxMGRcbiIsCi0JCQkgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMpOwotICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgcGlwZWxpbmUgc3RhbGxzICAgICAgICAlMTBkXG4iLAotCQkJICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3RhbGxzKTsKLSAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICIjIG1pc2FsaWduZWQgbG9hZC9zdG9yZSAgJTEwZFxuIiwKLQkJCSAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbXN0YWxscyk7Ci0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyByZWFsIHRpbWUgdGFrZW4gICAgICAgICUxMC40ZlxuIiwKLQkJCSAgICAgdGltZXRha2VuKTsKLSAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICIjIHZpcnR1YWwgdGltZSB0YWtlbiAgICAgJTEwLjRmXG4iLAotCQkJICAgICB2aXJ0dGltZSk7Ci0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBwcm9maWxpbmcgc2l6ZSAgICAgICAgICUxMGRcbiIsCi0JCQkgICAgIHNpbV9wcm9maWxlX3NpemUpOwotICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgcHJvZmlsaW5nIGZyZXF1ZW5jeSAgICAlMTBkXG4iLAotCQkJICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZSk7Ci0gIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBwcm9maWxlIG1heHBjICAgICAgICAgICUxMHhcbiIsCi0JCQkgICAgICgxIDw8IHNpbV9wcm9maWxlX3NpemUpIDw8IFBST0ZJTEVfU0hJRlQpOwotCi0gIGlmICh0aW1ldGFrZW4gIT0gMCkKLSAgICB7Ci0gICAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgY3ljbGVzL3NlY29uZCAgICAgICAgICAlMTBkXG4iLCAKLQkJCQkgKGludCkgKHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMgLyB0aW1ldGFrZW4pKTsKLSAgICAgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBzaW11bGF0aW9uIHJhdGlvICAgICAgICUxMC40ZlxuIiwgCi0JCQkJIHZpcnR0aW1lIC8gdGltZXRha2VuKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXNpbV9zZXRfcHJvZmlsZSAobikKLSAgICAgaW50IG47Ci17Ci0gIHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlID0gbjsKLX0KLQotdm9pZAotc2ltX3NldF9wcm9maWxlX3NpemUgKG4pCi0gICAgIGludCBuOwotewotICBzaW1fcHJvZmlsZV9zaXplID0gbjsKLX0KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKLSAgICAgU0lNX09QRU5fS0lORCBraW5kOwotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICoqcDsKLSAgaW50IGVuZGlhbl9zZXQgPSAwOwotICBpbnQgaTsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHNob3J0IHNbMl07Ci0gICAgICBjaGFyIGNbNF07Ci0gICAgfQotICBtZW1fd29yZDsKLQotICBzaW1fa2luZCA9IGtpbmQ7Ci0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0gIGNhbGxiYWNrID0gY2I7Ci0KLSAgZm9yIChwID0gYXJndiArIDE7ICpwICE9IE5VTEw7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgqcCwgIi1FIikgPT0gMCkKLQl7Ci0JICArK3A7Ci0JICBpZiAoKnAgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGlzIGRvZXNuJ3QgdXNlIHN0ZGVyciwgYnV0IHRoZW4gdGhlIHJlc3Qgb2YgdGhlCi0JCSBmaWxlIGRvZXNuJ3QgZWl0aGVyLiAgKi8KLQkgICAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIk1pc3NpbmcgYXJndW1lbnQgdG8gYC1FJy5cbiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICB0YXJnZXRfbGl0dGxlX2VuZGlhbiA9IHN0cmNtcCAoKnAsICJiaWciKSAhPSAwOwotICAgICAgICAgIGVuZGlhbl9zZXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCoqcCkpCi0JcGFyc2VfYW5kX3NldF9tZW1vcnlfc2l6ZSAoKnApOwotICAgIH0KLQotICBpZiAoYWJmZCAhPSBOVUxMICYmICEgZW5kaWFuX3NldCkKLSAgICAgIHRhcmdldF9saXR0bGVfZW5kaWFuID0gISBiZmRfYmlnX2VuZGlhbiAoYWJmZCk7Ci0KLSAgaWYgKGFiZmQpCi0gICAgaW5pdF9kc3AgKGFiZmQpOwotCi0gIGZvciAoaSA9IDQ7IChpIC09IDIpID49IDA7ICkKLSAgICBtZW1fd29yZC5zW2kgPj4gMV0gPSBpOwotICBnbG9iYWxfZW5kaWFudyA9IG1lbV93b3JkLmkgPj4gKHRhcmdldF9saXR0bGVfZW5kaWFuID8gMCA6IDE2KSAmIDB4ZmZmZjsKLQotICBmb3IgKGkgPSA0OyAtLWkgPj0gMDsgKQotICAgIG1lbV93b3JkLmNbaV0gPSBpOwotICBlbmRpYW5iID0gbWVtX3dvcmQuaSA+PiAodGFyZ2V0X2xpdHRsZV9lbmRpYW4gPyAwIDogMjQpICYgMHhmZjsKLQotICAvKiBmdWRnZSBvdXIgZGVzY3JpcHRvciBmb3Igbm93ICovCi0gIHJldHVybiAoU0lNX0RFU0MpIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXJzZV9hbmRfc2V0X21lbW9yeV9zaXplIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgaW50IG47Ci0KLSAgbiA9IHN0cnRvbCAoc3RyLCBOVUxMLCAxMCk7Ci0gIGlmIChuID4gMCAmJiBuIDw9IDI0KQotICAgIHNpbV9tZW1vcnlfc2l6ZSA9IG47Ci0gIGVsc2UKLSAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIkJhZCBtZW1vcnkgc2l6ZSAlZDsgbXVzdCBiZSAxIHRvIDI0LCBpbmNsdXNpdmVcbiIsIG4pOwotfQotCi12b2lkCi1zaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBxdWl0dGluZzsKLXsKLSAgLyogbm90aGluZyB0byBkbyAqLwotfQotCi1TSU1fUkMKLXNpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpwcm9nOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCi0gIGJmZCAqcHJvZ19iZmQ7Ci0KLSAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBjYWxsYmFjaywgcHJvZywgYWJmZCwKLQkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLQkJCSAgICAwLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLVNJTV9SQwotc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBhcmd2LCBlbnYpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52OwotewotICAvKiBjbGVhciB0aGUgcmVnaXN0ZXJzICovCi0gIG1lbXNldCAoJnNhdmVkX3N0YXRlLCAwLAotCSAgKGNoYXIqKSZzYXZlZF9zdGF0ZS5hc3JlZ3MuZW5kX29mX3JlZ2lzdGVycyAtIChjaGFyKikmc2F2ZWRfc3RhdGUpOwotICAvKiBzZXQgdGhlIFBDICovCi0gIGlmIChwcm9nX2JmZCAhPSBOVUxMKQotICAgIHNhdmVkX3N0YXRlLmFzcmVncy5wYyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi12b2lkCi1zaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGNoYXIgKmNtZDsKLXsKLSAgY2hhciAqc21zX2NtZCA9ICJzZXQtbWVtb3J5LXNpemUiOwotICBpbnQgY21kc2l6ZTsKLQotICBpZiAoY21kID09IE5VTEwgfHwgKmNtZCA9PSAnXDAnKQotICAgIHsKLSAgICAgIGNtZCA9ICJoZWxwIjsKLSAgICB9Ci0KLSAgY21kc2l6ZSA9IHN0cmxlbiAoc21zX2NtZCk7Ci0gIGlmIChzdHJuY21wIChjbWQsIHNtc19jbWQsIGNtZHNpemUpID09IDAgJiYgc3RyY2hyICgiIFx0IiwgY21kW2NtZHNpemVdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHBhcnNlX2FuZF9zZXRfbWVtb3J5X3NpemUgKGNtZCArIGNtZHNpemUgKyAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoY21kLCAiaGVscCIpID09IDApCi0gICAgewotICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIkxpc3Qgb2YgU0ggc2ltdWxhdG9yIGNvbW1hbmRzOlxuXG4iKTsKLSAgICAgIChjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoY2FsbGJhY2ssICJzZXQtbWVtb3J5LXNpemUgPG4+IC0tIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3MgYml0cyB0byB1c2VcbiIpOwotICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIlxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIkVycm9yOiBcIiVzXCIgaXMgbm90IGEgdmFsaWQgU0ggc2ltdWxhdG9yIGNvbW1hbmQuXG4iLCBjbWQpOwotICAgIH0KLX0KLQotdm9pZAotc2ltX3NldF9jYWxsYmFja3MgKHApCi0gICAgIGhvc3RfY2FsbGJhY2sgKnA7Ci17Ci0gIGNhbGxiYWNrID0gcDsKLX0KZGlmZiAtLWdpdCBhL3NpbS9zaC9zeXNjYWxsLmggYi9zaW0vc2gvc3lzY2FsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE1NDQ3Li4wMDAwMDAwCi0tLSBhL3NpbS9zaC9zeXNjYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0KLS8qICEhISBEQU5HRVIgISEhCi0gICBUaGlzIHdhcyBjb3BpZWQgZnJvbSBuZXdsaWIuICovCi0KLQotI2RlZmluZQlTWVNfZXhpdAkxCi0jZGVmaW5lCVNZU19mb3JrCTIKLSNkZWZpbmUJU1lTX3JlYWQJMwotI2RlZmluZQlTWVNfd3JpdGUJNAotI2RlZmluZQlTWVNfb3Blbgk1Ci0jZGVmaW5lCVNZU19jbG9zZQk2Ci0jZGVmaW5lCVNZU193YWl0NAk3Ci0jZGVmaW5lCVNZU19jcmVhdAk4Ci0jZGVmaW5lCVNZU19saW5rCTkKLSNkZWZpbmUJU1lTX3VubGluawkxMAotI2RlZmluZQlTWVNfZXhlY3YJMTEKLSNkZWZpbmUJU1lTX2NoZGlyCTEyCi0jZGVmaW5lCVNZU19ta25vZAkxNAotI2RlZmluZQlTWVNfY2htb2QJMTUKLSNkZWZpbmUJU1lTX2Nob3duCTE2Ci0jZGVmaW5lCVNZU19sc2VlawkxOQotI2RlZmluZQlTWVNfZ2V0cGlkCTIwCi0jZGVmaW5lIFNZU19pc2F0dHkgICAgICAyMQotI2RlZmluZSBTWVNfZnN0YXQgICAgICAgMjIKLSNkZWZpbmUgU1lTX3RpbWUgCTIzCi0jZGVmaW5lIFNZU19BUkcJCTI0Ci0jZGVmaW5lCVNZU19zdGF0CTM4Ci0jZGVmaW5lCVNZU19waXBlCTQyCi0jZGVmaW5lCVNZU19leGVjdmUJNTkKLSNkZWZpbmUgU1lTX3V0aW1lICAgICAgIDIwMSAvKiBub3QgcmVhbGx5IGEgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgU1lTX3dhaXQgICAgICAgIDIwMiAvKiBub3IgaXMgdGhpcyAqLwotCi0KZGlmZiAtLWdpdCBhL3NpbS9zaC90Y29uZmlnLmluIGIvc2ltL3NoL3Rjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZWM0ZmEuLjAwMDAwMDAKLS0tIGEvc2ltL3NoL3Rjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKiBzaCB0YXJnZXQgY29uZmlnIGZpbGUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBwcm9maWxpbmcuCi0gICBTZWUgdGhlIG1pcHMgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLXAgZm9vJyBhbmQgYC1zIGJhcicgb3B0aW9ucy4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3Byb2ZpbGV7LF9zaXplfS4gICovCi0vKiAjZGVmaW5lIFNJTV9IQVZFX1BST0ZJTEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciB1c2VzIGFuIGluc3RydWN0aW9uIGNhY2hlLgotICAgU2VlIHRoZSBoOC8zMDAgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgotICAgVGhpcyBlbmFibGVzIHRoZSBgLWMgc2l6ZScgb3B0aW9uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuCi0gICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9zaW1jYWNoZV9zaXplLiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfU0lNQ0FDSEUgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHRhcmdldCBjcHUgaXMgYmktZW5kaWFuCi0gICBhbmQgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBpdC4gICovCi0jZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL0NoYW5nZUxvZyBiL3NpbS90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI5MDc4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTE5OTktMDktMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogc2ltL2FybS9iLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2FybS9iaWMuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vYXJtL2JsLmNnczogTmV3IHRlc3RjYXNlLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA4LTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGxpYi9zaW0tZGVmcy5leHAgKHJ1bl9zaW1fdGVzdCk6IFJlbmFtZSBhbGxfbWFjaHMgYXJnIHRvCi0JcmVxdWVzdGVkX21hY2hzLCBub3cgaXMgbGlzdCBvZiBtYWNocyB0byBydW4gdGVzdHMgZm9yLgotCURlbGV0ZSBsb2NhbHMgQVMsQVNGTEFHUyxMRCxMREZMQUdTLiAgVXNlIHRhcmdldF9hc3NlbWJsZQotCWFuZCB0YXJnZXRfbGluayBpbnN0ZWFkLgotCi0xOTk5LTA0LTIxICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIHNpbS9tMzJyL25vcC5jZ3M6IEFkZCBtaXNzaW5nIG5vcCBpbnNuLgotCi1Nb24gTWFyIDIyIDEzOjI4OjU2IDE5OTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogc2ltL2ZyMzAvc3RiLmNnczogQ29ycmVjdCBmb3IgdW5hbGlnbmVkIGFjY2Vzcy4KLQkqIHNpbS9mcjMwL3N0aC5jZ3M6IENvcnJlY3QgZm9yIHVuYWxpZ25lZCBhY2Nlc3MuCi0JKiBzaW0vZnIzMC9sZHViLmNnczogRml4IHR5cG86IGxkdWgtPmxkdWIuIENvcnJlY3QKLQlmb3IgdW5hbGlnbmVkIGFjY2Vzcy4KLQkqIHNpbS9mcjMwL2FuZC5jZ3M6IFRlc3QgdW5hbGlnbmVkIGFjY2Vzcy4KLQotRnJpIEZlYiAgNSAxMjo0MToxMSAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChzaW1fcnVuKTogUHJpbnQgc2ltdWxhdG9yIGFyZ3VtZW50cyBsb2cgbWVzc2FnZS4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChydW5fc2ltX3Rlc3QpOiBOZXcgYXJnIGFsbF9tYWNocy4KLQkqIHNpbS9mcjMwL2FsbGluc24uZXhwOiBVcGRhdGUuCi0JKiBzaW0vZnIzMC9taXNjLmV4cDogVXBkYXRlLgotCSogc2ltL20zMnIvYWxsaW5zbi5leHA6IFVwZGF0ZS4KLQkqIHNpbS9tMzJyL21pc2MuZXhwOiBVcGRhdGUuCi0KLUZyaSBEZWMgMTggMTc6MTk6MzQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBzaW0vZnIzMC9sZHJlcy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2NvcGxkLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvY29wc3QuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9jb3Bzdi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL25vcC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2FuZGNjci5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL29yY2NyLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYWRkc3AuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9zdGlsbS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2V4dHNiLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvZXh0dWIuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9leHRzaC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2V4dHVoLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvZW50ZXIuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9sZWF2ZS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL3hjaGIuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9kbW92Yi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2Rtb3YuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9kbW92aC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQotVGh1IERlYyAxNyAxNzoxODo0MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHNpbS9mcjMwL3Rlc3R1dGlscy5pbmMgKHRha2VfYnJhbmNoe19kfSxub19icmFuY2h7X2R9KTogTmV3IG1hY3Jvcy4KLQkqIHNpbS9mcjMwL3JldC5jZ3M6IEFkZCB0ZXN0cyBmaXIgcmV0OmQuCi0JKiBzaW0vZnIzMC9pbnRlLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvcmV0aS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2JyYS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2Juby5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2JlcS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2JuZS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2JjLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYm5jLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYm4uY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9icC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2J2LmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYm52LmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmx0LmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmdlLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmxlLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmd0LmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmxzLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvYmhpLmNnczogTmV3IHRlc3RjYXNlLgotCi1UdWUgRGVjIDE1IDE3OjQ3OjEzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogc2ltL2ZyMzAvZGl2LmNncyAoaW50KTogQWRkIHNpZ25lZCBkaXZpc2lvbiBzY2VuYXJpby4KLQkqIHNpbS9mcjMwL2ludC5jZ3MgKGludCk6IENvbXBsZXRlIHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvdGVzdHV0aWxzLmluYyAoX3N0YXJ0KTogSW5pdGlhbGl6ZSB0YnIuCi0JKHRlc3Rfc191c2VyLHRlc3Rfc19zeXN0ZW0sc2V0X2ksdGVzdF9pKTogTmV3IG1hY3Jvcy4KLQotMTk5OC0xMi0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChydW5fc2ltX3Rlc3QpOiBOZXcgb3B0aW9uIHhlcnJvciwgZm9yIGV4cGVjdGVkCi0JZXJyb3JzLiAgVHJhbnNsYXRlIFxuIHNlcXVlbmNlcyBpbiBleHBlY3RlZCBvdXRwdXQgdG8gbmV3bGluZSBjaGFyLgotCShzbHVycF9vcHRpb25zKTogTWFrZSBwYXJlbnRoZXNlcyBvcHRpb25hbC4KLQkoc2ltX3J1bik6IExvb2sgZm9yIGJvYXJkX2luZm8gc2ltLG9wdGlvbnMuCi0JKiBzaW0vZnIzMC9oZWxsby5tczogQWRkIHRyYWlsaW5nIFxuIHRvIGV4cGVjdGVkIG91dHB1dC4KLQkqIHNpbS9tMzJyL2hlbGxvLm1zOiBEaXR0by4KLQkqIHNpbS9tMzJyL2h3LXRyYXAubXM6IERpdHRvLgotCi0JKiBzaW0vbTMyci90cmFwLmNnczogUHJvcGVybHkgYWxpZ24gdHJhcDJfaGFuZGxlci4KLQotCSogc2ltL20zMnIvdXJlYWQxNi5tczogTmV3IHRlc3RjYXNlLgotCSogc2ltL20zMnIvdXJlYWQzMi5tczogTmV3IHRlc3RjYXNlLgotCSogc2ltL20zMnIvdXdyaXRlMTYubXM6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9tMzJyL3V3cml0ZTMyLm1zOiBOZXcgdGVzdGNhc2UuCi0KLTE5OTgtMTItMTQgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogc2ltL2ZyMzAvY2FsbC5jZ3M6IFRlc3QgcmV0IGhlcmUgYXMgd2VsbC4KLQkqIHNpbS9mcjMwL2xkLmNnczogUmVtb3ZlIGJvZ3VzIGNvbW1lbnQuCi0JKiBzaW0vZnIzMC90ZXN0dXRpbHMuaW5jIChzYXZlX3JwLHJlc3RvcmVfcnApOiBOZXcgbWFjcm9zLgotCSogc2ltL2ZyMzAvZGl2Lm1zOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9zdC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL3N0aC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL3N0Yi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL21vdi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2ptcC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL3JldC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2ludC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQotVGh1IERlYyAxMCAxODo0NjoyNSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHNpbS9mcjMwL2RpdjBzLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvZGl2MHUuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9kaXYxLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvZGl2Mi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2RpdjMuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9kaXY0cy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL3Rlc3R1dGlscy5pbmMgKG12aV9oX2RyLHNldF9kYml0cyx0ZXN0X2RiaXRzKTogTmV3IE1hY3Jvcy4KLQotVHVlIERlYyAgOCAxMzoxNjo1MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHNpbS9mcjMwL3Rlc3R1dGlscy5pbmMgKHNldF9zX3VzZXIpOiBDb3JyZWN0IE1hc2suCi0JKHNldF9zX3N5c3RlbSk6IENvcnJlY3QgTWFzay4KLQkqIHNpbS9mcjMwL2xkLmNncyAobGQpOiBNb3ZlIHByZXZpb3VzbHkgZmFpbGluZyB0ZXN0IGJhY2sKLQlpbnRvIHBsYWNlLgotCSogc2ltL2ZyMzAvbGRtMC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQkqIHNpbS9mcjMwL2xkbTEuY2dzOiBOZXcgdGVzdGNhc2UuCi0JKiBzaW0vZnIzMC9zdG0wLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvc3RtMS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KLQotVGh1IERlYyAgMyAxNDoyMDowMyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHNpbS9mcjMwL2xkLmNnczogSW1wbGVtZW50IG1vcmUgbG9hZHMuCi0JKiBzaW0vZnIzMC9jYWxsLmNnczogTmV3IHRlc3RjYXNlLgotCSogc2ltL2ZyMzAvdGVzdHV0aWxzLmluYyAodGVzdHJfaF9kcik6IE5ldyBtYWNyby4KLQkoc2V0X3NfdXNlcixzZXRfc19zeXN0ZW0pOiBOZXcgbWFjcm9zLgotCi0JKiBzaW0vZnIzMDogTmV3IERpcmVjdG9yeS4KLQotV2VkIE5vdiAxOCAxMDo1MDoxOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi9iaXRzLWdlbi5jIChtYWluKTogQWRkIEJZVEVfT1JERVIgc28gdGhhdCBpdCBtYXRjaGVzCi0gCXJlY2VudCBzaW0vY29tbW9uL3NpbS1iYXNpY3MuaCBjaGFuZ2VzLgotCSogY29tbW9uL01ha2VmaWxlLmluOiBVcGRhdGUuCi0JCi1GcmkgT2N0IDMwIDAwOjM3OjMxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogbGliL3NpbS1kZWZzLmV4cCAoc2ltX3J1bik6IGRvd25sb2FkIHRhcmdldCBwcm9ncmFtIHRvIHJlbW90ZQotIAlob3N0LCBpZiBuZWNlc3NhcnkuICBmb3IgdW5peC1kcml2ZW4gd2luMzIgdGVzdGluZy4KLQotVHVlIFNlcCAxNSAxNDo1NjoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0vbTMyci90ZXN0dXRpbHMuaW5jICh0ZXN0X2hfZ3IpOiBVc2UgbXZhZGRyX2hfZ3IuCi0JKiBzaW0vbTMyci9ydGUuY2dzOiBUZXN0IGJicGMsYmJwc3cuCi0JKiBzaW0vbTMyci90cmFwLmNnczogVGVzdCBiYnBjLGJicHN3LgotCi1GcmkgSnVsIDMxIDE3OjQ5OjEzIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogbGliL3NpbS1kZWZzLmV4cCAoc2ltX3J1bik6IHJlbW90ZV9zcGF3biwgdXNlIHdyaXRldG8gaW5zdGVhZCBvZgotIAl3cml0ZW9ubHkuCi0KLUZyaSBKdWwgMjQgMDk6NDA6MzQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLG1vc3RseWNsZWFuKTogQ2hhbmdlIGxlYWRpbmcgc3BhY2VzIHRvIGEgdGFiLgotCi1XZWQgSnVsICAxIDE1OjU3OjU0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzaW0vbTMyci9ody10cmFwLm1zOiBOZXcgdGVzdGNhc2UuCi0KLVR1ZSBKdW4gMTYgMTU6NDQ6MDEgMTk5OCBKaWxsaWFuIFllIDxqaWxsaWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9zaW0tZGVmcy5leHA6IFByaW50IG91dCB0aW1lb3V0IHNldHRpbmcgaW5mbyB3aGVuICItdiIgaXMgdXNlZC4KLQotVGh1IEp1biAxMSAxNToyNDo1MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChzaW1fcnVuKTogQXJndW1lbnQgZW52X3ZhbHMgcmVuYW1lZCB0byBvcHRpb25zLAotCXdoaWNoIGlzIG5vdyBhIGxpc3Qgb2Ygb3B0aW9ucyBjb250cm9sbGluZyB0aGUgYmVoYXZpb3VyIG9mIHNpbV9ydW4uCi0KLVdlZCBKdW4gMTAgMTA6NTM6MjAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNpbS9tMzJyL2FkZHguY2dzOiBBZGQgYW5vdGhlciB0ZXN0LgotCSogc2ltL20zMnIvam1wLmNnczogQWRkIGFub3RoZXIgdGVzdC4KLQotTW9uIEp1biAgOCAxNjowODoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzaW0vbTMyci90cmFwLmNnczogVGVzdCB0cmFwIDIuCi0KLU1vbiBKdW4gIDEgMTg6NTQ6MjIgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbGliL3NpbS1kZWZzLmV4cCAoc2ltX3J1bik6IEFkZCBwb3NzaWJsZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotIAlsaXN0IHRvIHNpbXVsYXRvciBydW4uCi0KLVRodSBNYXkgMjggMTQ6NTk6NDYgMTk5OCBKaWxsaWFuIFllIDxqaWxsaWFuQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogVGFrZSBSVU5URVNUIG91dCBvZiBGTEFHX1RPX1BBU1MKLSAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBtYWtlIGNoZWNrIGNhbiBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LgotCi1UaHUgTWF5IDE0IDExOjQ4OjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoQ0MsU0lNKTogRGVsZXRlLgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChzaW1fcnVuKTogRml4IGhhbmRsaW5nIG9mIG91dHB1dCByZWRpcmVjdGlvbi4KLQlOZXcgYXJnIHByb2dfb3B0cy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0KLUZyaSBNYXkgIDggMTg6MTA6MjggMTk5OCAgSmlsbGlhbiBZZSA8amlsbGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFkZSAiY2hlY2siIHRoZSB0YXJnZXQgb2YgdHdvCi0gICAgICAgICAgZGVwZW5kZW5jaWVzICh0ZXN0MSwgdGVzdDIpIHNvIHRoYXQgdGVzdDIgZ2V0IGEgY2hhbmNlIHRvIAotICAgICAgICAgIHJ1biBldmVuIHdoZW4gdGVzdDEgZmFpbGVkIGlmICJtYWtlIC1rIGNoZWNrIiBpcyB1c2VkLgotCi1GcmkgTWF5ICA4IDE0OjQxOjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9zaW0tZGVmcy5leHAgKHNpbV92ZXJzaW9uKTogU2ltcGxpZnkuCi0JKHNpbV9ydW4pOiBJbXBsZW1lbnQuCi0JKHJ1bl9zaW1fdGVzdCk6IFVzZSBzaW1fcnVuLgotCShzaW1fY29tcGlsZSk6IE5ldyBwcm9jLgotCi1Nb24gTWF5ICA0IDE3OjU5OjExIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQWRkZWQgQyBjb21waWxlciBzZXR0aW5ncy4KLQotV2VkIEFwciAyMiAxMjoyNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpOiBEZWxldGUgTElCUywgTERGTEFHUy4KLQotVHVlIEFwciAyMSAxMDo0OTowMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWIvc2ltLWRlZnMuZXhwIChydW5fc2ltX3Rlc3QpOiBEb24ndCBleGl0IGVhcmx5IGlmIG9uZSBtYWNoIGZhaWxzLAotCXRyeSBhbGwgbWFjaHMuCi0KLQkqIHNpbS9tMzJyL2FkZHguY2dzOiBUZXN0ICgtMSkrKC0xKSsxLgotCi1GcmkgQXByIDE3IDE2OjAwOjUyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNpbS9tMzJyL212W2Z0XWFjaGkuY2dzOiBGaXggZXhwZWN0ZWQgcmVzdWx0Ci0JKHNpZ24gZXh0ZW5zaW9uIG9mIHRvcCA4IGJpdHMpLgotCi1XZWQgRmViIDI1IDExOjAxOjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRml4IHBhdGggdG8gcnVudGVzdC4KLQotRnJpIEZlYiAyMCAxMTowMDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW0vbTMyci91bmxvY2suY2dzOiBGaXhlZCB0ZXN0LgotCSogc2ltL20zMnIvbXZmYy5jZ3M6IEZpeGVkIHRlc3QuCi0JKiBzaW0vbTMyci9yZW11LmNnczogRml4ZWQgdGVzdC4KLQkqIHNpbS9tMzJyL2JuYzI0LmNnczogVGVzdCBsb25nIEJOQyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JuYzguY2dzOiBUZXN0IHNob3J0IEJOQyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2xkLXBsdXMuY2dzOiBUZXN0IExEIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvbWFjd2hpLmNnczogVGVzdCBNQUNXSEkgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9tYWN3bG8uY2dzOiBUZXN0IE1BQ1dMTyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL211bHdoaS5jZ3M6IFRlc3QgTVVMV0hJIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvbXVsd2xvLmNnczogVGVzdCBNVUxXTE8gaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9tdmZhY2hpLmNnczogVGVzdCBNVkZBQ0hJIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvbXZmYWNsby5jZ3M6IFRlc3QgTVZGQUNMTyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL212dGFjbG8uY2dzOiBUZXN0IE1WVEFDTE8gaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9hZGR2LmNnczogVGVzdCBBRERWIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvYWRkdjMuY2dzOiBUZXN0IEFERFYzIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvYWRkeC5jZ3M6IFRlc3QgQUREWCBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2xvY2suY2dzOiBUZXN0IExPQ0sgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9uZWcuY2dzOiBUZXN0IE5FRyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL25vdC5jZ3M6IFRlc3QgTk9UIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvdW5sb2NrLmNnczogVGVzdCBVTkxPQ0sgaW5zdHJ1Y3Rpb24uCi0KLVRodSBGZWIgMTkgMTE6MTU6NDUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2ltL20zMnIvdGVzdHV0aWxzLmluYyAobXZhZGRyX2hfZ3IpOiBuZXcgbWFjcm8gdG8gbG9hZCBhbgotCWFkZHJlc3MgaW50byBhIGdlbmVyYWwgcmVnaXN0ZXIuCi0KLQkqIHNpbS9tMzJyL29yMy5jZ3M6IFRlc3QgT1IzIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvcmFjaC5jZ3M6IFRlc3QgUkFDSCBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL3JlbS5jZ3M6IFRlc3QgUkVNIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvc3ViLmNnczogVGVzdCBTVUIgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9tdi5jZ3M6IFRlc3QgTVYgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9tdWwuY2dzOiBUZXN0IE1VTCBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JsMjQuY2dzOiBUZXN0IGxvbmcgQkwgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9ibDguY2dzOiBUZXN0IHNob3J0IEJMIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvYmxlei5jZ3M6IFRlc3QgQkxFWiBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JsdHouY2dzOiBUZXN0IEJMVFogaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9ibmUuY2dzOiBUZXN0IEJORSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JuZXouY2dzOiBUZXN0IEJORVogaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9icmEyNC5jZ3M6IFRlc3QgbG9uZyBCUkEgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9icmE4LmNnczogVGVzdCBzaG9ydCBCUkEgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9qbC5jZ3M6IFRlc3QgSkwgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9vci5jZ3M6IFRlc3QgT1IgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9qbXAuY2dzOiBUZXN0IEpNUCBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2FuZC5jZ3M6IFRlc3QgQU5EIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvYW5kMy5jZ3M6IFRlc3QgQU5EMyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JlcS5jZ3M6IFRlc3QgQkVRIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvYmVxei5jZ3M6IFRlc3QgQkVRWiBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2JnZXouY2dzOiBUZXN0IEJHRVogaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9iZ3R6LmNnczogVGVzdCBCR1RaIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvY21wLmNnczogVGVzdCBDTVAgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9jbXBpLmNnczogVGVzdCBDTVBJIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvY21wdS5jZ3M6IFRlc3QgQ01QVSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2NtcHVpLmNnczogVGVzdCBDTVBVSSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2Rpdi5jZ3M6IFRlc3QgRElWIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvZGl2dS5jZ3M6IFRlc3QgRElWVSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL2NtcGVxLmNnczogVGVzdCBDTVBFUSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL3NsbC5jZ3M6IFRlc3QgU0xMIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvc2xsMy5jZ3M6IFRlc3QgU0xMMyBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL3NsbGkuY2dzOiBUZXN0IFNMTEkgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9zcmEuY2dzOiBUZXN0IFNSQSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL3NyYTMuY2dzOiBUZXN0IFNSQTMgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9zcmFpLmNnczogVGVzdCBTUkFJIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvc3JsLmNnczogVGVzdCBTUkwgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci9zcmwzLmNnczogVGVzdCBTUkwzIGluc3RydWN0aW9uLgotCSogc2ltL20zMnIvc3JsaS5jZ3M6IFRlc3QgU1JMSSBpbnN0cnVjdGlvbi4KLQkqIHNpbS9tMzJyL3hvcjMuY2dzOiBUZXN0IFhPUjMgaW5zdHJ1Y3Rpb24uCi0JKiBzaW0vbTMyci94b3IuY2dzOiBUZXN0IFhPUiBpbnN0cnVjdGlvbi4KLQotVHVlIEZlYiAxNyAxMjo0NjowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBOZXcgZmlsZS4KLQkqIGxpYi9zaW0tZGVmcy5leHA6IE5ldyBmaWxlLgotCSogc2ltL20zMnIvKjogbTMyciBkZWphZ251IHNpbXVsYXRvciB0ZXN0c3VpdGUuCi0KLQkqIE1ha2VmaWxlLmluIChidWlsZF9hbGlhcyk6IERlZmluZS4KLQkoYXJjaCk6IERlZmluZS4KLQkoUlVOVEVTVF9GT1JfVEFSR0VUKTogRGVsZXRlLgotCShSVU5URVNUKTogRml4LgotCShjaGVjayk6IERlcGVuZCBvbiBzaXRlLmV4cC4gIFJ1biBkZWphZ251LgotCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGFyY2gpOiBEZWZpbmUgZnJvbSB0YXJnZXRfY3B1LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgU2VwIDE3IDEwOjIxOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uL2JpdHMtZ2VuLmMgKGdlbl9iaXQpOiBQYXNzIGluIHRoZSBmdWxsIG5hbWUgb2YgdGhlIG1hY3JvLgotCShnZW5fbWFzayk6IERpdHRvLgotCi0JKiBjb21tb24vYml0cy10c3QuYyAobWFpbik6IEFkZCB0ZXN0cyBmb3IgTFNTRVhULCBNU1NFWFQuCi0JKGNhbGMpOiBBZGQgc3VwcG9ydCBmb3IgOCBiaXQgdmVyc2lvbiBvZiBtYWNyb3MuCi0JKG1haW4pOiBBZGQgdGVzdHMgZm9yIDggYml0IHZlcnNpb25zIG9mIG1hY3Jvcy4KLQkoY2hlY2tfc2V4dCk6IENoZWNrIFNFWFQgb2YgemVybyBjbGVhcnMgYml0cy4KLQotCSogY29tbW9uL2JpdHMtZ2VuLmMgKG1haW4pOiBHZW5lcmF0ZSB0ZXN0cyBmb3IgOCBiaXQgdmVyc2lvbnMgb2YKLSAJbWFjcm9zLgotCi1UaHUgU2VwIDExIDEzOjA0OjQwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uL01ha2UtY29tbW9uLmluOiBOZXcgZmlsZSwgcHJvdmlkZSBnZW5lcmljIHJ1bGVzIGZvcgotIAlydW5uaW5nIGNoZWNrcy4KLQotTW9uIFNlcCAgMSAxNjo0Mzo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IFRlc3QgZm9yIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluc3RlYWQKLSAJb2YgbWF0Y2hpbmcgb24gYSB0YXJnZXQuCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdhOGZlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIHRoZSBHTlUgZGVidWdnZXIuCi0jIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSMgR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVZQQVRIID0gQHNyY2RpckAKLXNyY2RpciA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJ1aWxkX2Nhbm9uaWNhbCA9IEBidWlsZEAKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotaG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLXRhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotYXJjaCA9IEBhcmNoQAotCi1TSEVMTCA9IC9iaW4vc2gKLVNVQkRJUlMgPSBAc3ViZGlyc0AKLVJQQVRIX0VOVlZBUiA9IEBSUEFUSF9FTlZWQVJACi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLQotUlVOVEVTVEZMQUdTID0KLQotIyMjIyBob3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdzIGNvbWUgaW4gaGVyZS4KLQotIyBUaGUgdXNlIG9mICQkKHhfRk9SX1RBUkdFVCkgcmVkdWNlcyB0aGUgY29tbWFuZCBsaW5lIGxlbmd0aCBieSBub3QKLSMgZHVwbGljYXRpbmcgdGhlIGxlbmd0aHkgZGVmaW5pdGlvbi4KLQotVEFSR0VUX0ZMQUdTX1RPX1BBU1MgPSBcCi0gICAgICAgICJwcmVmaXg9JChwcmVmaXgpIiBcCi0gICAgICAgICJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAotICAgICAgICAiYWdhaW5zdD0kKGFnYWluc3QpIiBcCi0gICAgICAgICdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotICAgICAgICAiQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpIiBcCi0gICAgICAgICJDRkxBR1M9JChURVNUU1VJVEVfQ0ZMQUdTKSIgXAotICAgICAgICAiQ0hJTExGTEFHUz0kKENISUxMRkxBR1MpIiBcCi0gICAgICAgICdDSElMTD0kJChDSElMTF9GT1JfVEFSR0VUKScgXAotICAgICAgICAiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0gICAgICAgICJDSElMTF9MSUI9JChDSElMTF9MSUIpIiBcCi0gICAgICAgICdDWFg9JCQoQ1hYX0ZPUl9UQVJHRVQpJyBcCi0gICAgICAgICJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotICAgICAgICAiQ1hYRkxBR1M9JChDWFhGTEFHUykiIFwKLSAgICAgICAgIk1BS0VJTkZPPSQoTUFLRUlORk8pIiBcCi0gICAgICAgICJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKLSAgICAgICAgIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLSAgICAgICAgIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKLSAgICAgICAgIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiCi0KLSMgICAgICAgICJSVU5URVNUPSQoUlVOVEVTVCkiIFwKLQotYWxsOgotCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKLQotLk5PRVhQT1JUOgotaW5mbzoKLWluc3RhbGwtaW5mbzoKLWR2aToKLQotaW5zdGFsbDoKLQotdW5pbnN0YWxsOiBmb3JjZQotCi1pbnN0YWxsY2hlY2s6Ci0KLWNoZWNrOiAgY2hlY2stREVKQUdOVSBjaGVjay1yZWN1cnNpdmUKLQotI3Rlc3QxOgotY2hlY2stcmVjdXJzaXZlOiAKLQlAZm9yIGkgaW4gLiAke1NVQkRJUlN9OyBkbyBcCi0JCWlmIFsgJCRpID0gLiBdIDsgdGhlbiBjb250aW51ZSA7IGZpIDsgXAotCQlpZiBbIC1kIC4vJCRpIF0gOyB0aGVuIFwKLQkJCWlmIChyb290bWU9YHB3ZGAvIDsgZXhwb3J0IHJvb3RtZSA7IFwKLQkJCSAgICByb290c3JjPWBjZCAkKHNyY2Rpcik7IHB3ZGAvIDsgZXhwb3J0IHJvb3RzcmMgOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gImNoZWNrIHJlY3Vyc2l2ZWx5IGludG8gJCRpIGRpcmVjdG9yeS4uLiI7IFwKLQkJCQljZCAuLyQkaTsgXAotCQkJCSQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2hlY2spIDsgdGhlbiB0cnVlIDsgXAotCQkJZWxzZSBleGl0IDEgOyBmaSA7IFwKLQkJZWxzZSB0cnVlIDsgZmkgOyBcCi0JZG9uZQotCi0jdGVzdDI6CQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQllY2hvICJEZWphZ251LWNoZWNraW5nIGluIGBwd2RgIGRpcmVjdG9yeSAuLi4iCi0Jcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBlY2hvIHJvb3RtZSA9ICQkcm9vdG1lOyBcCi0Jc3JjZGlyPWBjZCAke3NyY2Rpcn07IHB3ZGA7IGV4cG9ydCBzcmNkaXIgOyBlY2hvIHNyY2RpciA9ICQkc3JjZGlyOyBcCi0JRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBlY2hvIEVYUEVDVCA9ICQkRVhQRUNUOyBcCi0JaWYgWyAtZiAkJHJvb3RtZS8uLi8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQkc3JjZGlyLy4uLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0gICAgICAgIGVjaG8gVENMX0xJQlJBUlkgPSAkJFRDTF9MSUJSQVJZOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBlY2hvIHJ1bnRlc3QgPSAkJHJ1bnRlc3Q7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0KLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQktQHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCBzaW0nID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgYXJjaCAkKGFyY2gpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX2Nhbm9uaWNhbCknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF9jYW5vbmljYWwpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF9jYW5vbmljYWwpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JLUBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQktQG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLQotZm9yY2U6OwotCi1jbGVhbiBtb3N0bHljbGVhbjoKLQktcm0gLWYgKn4gY29yZSAqLm8gYS5vdXQgeGdkYiAqLnggKi5ncnQKLQktcm0gLWYgKi5ydW0gKi5jICouZGlmICouKm91dAotCWlmIFsgeCIke1NVQkRJUlN9IiAhPSB4IF0gOyB0aGVuIFwKLQkgICAgZm9yIGRpciBpbiAke1NVQkRJUlN9OyBcCi0JICAgIGRvIFwKLQkJICAgIGVjaG8gIiQkZGlyOiI7IFwKLQkJICAgIGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCi0JCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGNsZWFuKTsgXAotCQkgICAgZmk7IFwKLQkgICAgZG9uZSA7IFwKLQllbHNlIHRydWU7IGZpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQktcm0gLWYgKn4gY29yZQotCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKLQktcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCi0JaWYgWyB4IiR7U1VCRElSU30iICE9IHggXSA7IHRoZW4gXAotCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKLQkgICAgZG8gXAotCQkgICAgZWNobyAiJCRkaXI6IjsgXAotCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKLQkJCSAgICAoY2QgJCRkaXI7ICQoTUFLRSkgZGlzdGNsZWFuKTsgXAotCQkgICAgZmk7IFwKLQkgICAgZG9uZSA7IFwKLQllbHNlIHRydWU7IGZpCi0KLU1ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLSMgRklYTUU6IFJlcXVpcmVzIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSwgd2hpY2ggb25lIGNvdWxkIGFkZCwgYnV0Ci0jIGl0J3MgcHJvdmlkZWQgYnkgYXV0b21ha2UuICBNYXliZSBzd2l0Y2ggdG8gYXV0b21ha2Ugc29tZWRheS4KLSMkKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRAICQoc3JjZGlyKS9jb25maWd1cmUuaW4KLSMJY2QgJChzcmNkaXIpICYmIGF1dG9jb25mCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2UtY29tbW9uLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZlZjRhLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2UtY29tbW9uLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotQVNfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vZ2FzL2FzLW5ldyBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL2dhcy9hcy1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWFzIDsgXAotICBmaWAKLQotTERfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vbGQvbGQtbmV3IF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vbGQvbGQtbmV3IDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1sZCA7IFwKLSAgZmlgCi0KLVJVTl9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9zaW0vdjg1MC9ydW4gXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9zaW0vdjg1MC9ydW4gOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLXJ1biA7IFwKLSAgZmlgCi0KLQotY2hlY2s6IHNhbml0eSAkKFRFU1RTKQotc2FuaXR5OgotCUBldmFsIGVjaG8gQVNfRk9SX1RBUkdFVD0kKEFTX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUPSQoTERfRk9SX1RBUkdFVCkKLQlAZXZhbCBlY2hvIFJVTl9GT1JfVEFSR0VUPSQoUlVOX0ZPUl9UQVJHRVQpCi0KLWNsZWFuOgotCXJtIC1mICQoVEVTVFMpCi0Jcm0gLWYgKi5ydW4gKi5vCi0Jcm0gLWYgY29yZSAqLmNvcmUKLQotIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKLQotLlNVRkZJWEVTOiAub2sgLnJ1biAuaGkgLmtvIC50aQotLnJ1bi5vazoKLQlybSAtZiB0bXAtJCogJCouaGkKLQl1bGltaXQgLXQgNSA7IFwKLQkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgotCW12IHRtcC0kKiAkKi5vawotLnJ1bi5oaToKLQlybSAtZiB0bXAtJCogJCouaGkgZGlmZi0kKgotCXVsaW1pdCAtdCA1IDsgXAotCSQoUlVOX0ZPUl9UQVJHRVQpICQoUlVORkxBR1NfRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCi0JZWNobyAnSGVsbG8gV29ybGQhJyB8IGRpZmYgLSB0bXAtJCogPiBkaWZmLSQqCi0JY2F0IHRtcC0kKiBkaWZmLSQqID4gJCouaGkKLS5ydW4ua286Ci0Jcm0gLWYgdG1wLSQqICQqLmtvCi0Jc2V0ICtlIDsgXAotCXVsaW1pdCAtdCA1IDsgXAotCSQoUlVOX0ZPUl9UQVJHRVQpICQoUlVORkxBR1NfRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqIDsgXAotCWlmIFsgJCQ/IC1lcSA0NyBdIDsgdGhlbiBcCi0JICBleGl0IDAgOyBcCi0JZWxzZSBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQltdiB0bXAtJCogJCoua28KLS5ydW4udGk6Ci0Jcm0gLWYgdG1wLSQqICQqLnRpCi0Jc2V0ICtlIDsgXAotCXVsaW1pdCAtdCA1IDsgXAotCSQoUlVOX0ZPUl9UQVJHRVQpICQoUlVORkxBR1NfRk9SX1RBUkdFVCkgJChJTlRGTEFHU19GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKLQl0ZXN0IGBjYXQgdG1wLSQqIHwgd2MgLWxgIC1lcSAxMCA8IC9kZXYvbnVsbAotCXRlc3QgYGdyZXAgVGljayB0bXAtJCogfCB3YyAtbGAgLWVxIDEwIDwgL2Rldi9udWxsCi0JbXYgdG1wLSQqICQqLnRpCi0KLQotIyBSdWxlcyBmb3IgYnVpbGRpbmcgdGhlIHRlc3QKLSMgUHJlZmVyZW5jZSBpcyBmb3Igb2J0YWluaW5nIHRoZSBleGVjdXRhYmxlICgucnVuKSBmcm9tIGEgcHJlYnVpbHQgaW1hZ2UKLQotLlNVRkZJWEVTOiAudXVlIC5zIC5TIC5ydW4KLS51dWUucnVuOgotCWhlYWQgJCogfCBncmVwICQqLnJ1biA+IC9kZXYvbnVsbAotCXV1ZGVjb2RlICQqLnV1ZQotLnJ1bi51OgotCXV1ZW5jb2RlIDwgJCoucnVuICQqLnJ1biA+ICQqLnUKLS5vLnJ1bjoKLQkkKExEX0ZPUl9UQVJHRVQpICQoTERGTEFHU19GT1JfVEFSR0VUKSAtbyAkKi5ydW4gJCoubwotLnMubzoKLQkkKEFTX0ZPUl9UQVJHRVQpICQoQVNGTEFHU19GT1JfVEFSR0VUKSAtSSQoc3JjZGlyKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCi0uUy5vOgotCSQoQVNfRk9SX1RBUkdFVCkgJChBU0ZMQUdTX0ZPUl9UQVJHRVQpIC1JJChzcmNkaXIpICQoc3JjZGlyKS8kKi5TIC1vICQqLm8KLQotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiBjb25maWd1cmUKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9NYWtlZmlsZS5pbiBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg4NTAxLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotQ0M9Z2NjCi1DRkxBR1MgPSAtV2FsbCAtV2Vycm9yIC1JLi4vLi4vY29tbW9uIC1JLi4vLi4vLi4vaW5jbHVkZSAtZwotZGVmYXVsdDogY2hlY2sKLQotCi0jIFZlcmlmeSBTSU0tQklUUwotCi1jaGVjazogYml0czMybTAub2sgYml0czMybTMxLm9rIGJpdHM2NG0wLm9rIGJpdHM2NG02My5vawotYWxsOiBiaXRzMzJtMCBiaXRzMzJtMzEgYml0czY0bTAgYml0czY0bTYzCi0KLWJpdHMzMm0wLmM6IGJpdHMtZ2VuIGJpdHMtdHN0LmMKLQkuL2JpdHMtZ2VuIDMyIDAgYmlnID4gdG1wLWJpdHMzMm0wLmMKLQljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czMybTAuYwotCW12IHRtcC1iaXRzMzJtMC5jIGJpdHMzMm0wLmMKLWJpdHMzMm0zMS5jOiBiaXRzLWdlbiBiaXRzLXRzdC5jCi0JLi9iaXRzLWdlbiAzMiAzMSBsaXR0bGUgPiB0bXAtYml0czMybTMxLmMKLQljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czMybTMxLmMKLQltdiB0bXAtYml0czMybTMxLmMgYml0czMybTMxLmMKLWJpdHM2NG0wLmM6IGJpdHMtZ2VuIGJpdHMtdHN0LmMKLQkuL2JpdHMtZ2VuIDY0IDAgYmlnID4gdG1wLWJpdHM2NG0wLmMKLQljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czY0bTAuYwotCW12IHRtcC1iaXRzNjRtMC5jIGJpdHM2NG0wLmMKLWJpdHM2NG02My5jOiBiaXRzLWdlbiBiaXRzLXRzdC5jCi0JLi9iaXRzLWdlbiA2NCA2MyBsaXR0bGUgPiB0bXAtYml0czY0bTYzLmMKLQljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czY0bTYzLmMKLQltdiB0bXAtYml0czY0bTYzLmMgYml0czY0bTYzLmMKLQotCi0KLSMgVmVyaWZ5IFNJTS1GUFUKLSMKLSNjaGVjazogZnB1LXRzdC5vawotI2FsbDogZnB1LXRzdAotCi0KLQotIyBWZXJpZnkgU0lNLUFMVQotCi1jaGVjazogYWx1LXRzdC5vawotYWxsOiBhbHUtdHN0Ci1hbHUtdHN0Lm86IGFsdS10c3QuYyBhbHUtbi10c3QuaAotCi1jbGVhbjoKLQlybSAtZiAqLm8KLQlybSAtZiAqLm9rCi0Jcm0gLWYgYml0czMybTAgYml0czMybTMxIGJpdHM2NG0wIGJpdHM2NG02MyBiaXRzLWdlbgotCXJtIC1mIHRtcC0qCi0Jcm0gLWYgYWx1LXRzdAotCi0uU1VGSVhFUzogLm9rCi0lLm9rOiAlCi0JLi8kPAotCXRvdWNoICQ8Lm9rCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9hbHUtbi10c3QuaCBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2FsdS1uLXRzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIxOGQ0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL2FsdS1uLXRzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLSNpZm5kZWYgTgotI2Vycm9yICJOIG11c3QgYmUgI2RlZmluZWQiCi0jZW5kaWYKLQotI2luY2x1ZGUgInN5bWNhdC5oIgotCi0vKiBOT1RFOiBzZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiBvZiB0aGVzZSBtYWNyb3MgKi8KLSNkZWZpbmUgdW5zaWduZWROICAgIFhDT05DQVQyKHVuc2lnbmVkLE4pCi0jZGVmaW5lIE1BWF9JTlQgICAgICBYQ09OQ0FUMihNQVhfSU5ULE4pCi0jZGVmaW5lIE1JTl9JTlQgICAgICBYQ09OQ0FUMihNSU5fSU5ULE4pCi0jZGVmaW5lIGFsdV9OX3Rlc3RzICAgICBYQ09OQ0FUMyhhbHVfLE4sX3Rlc3RzKQotI2RlZmluZSBkb19hbHVfTl90ZXN0cyAgWENPTkNBVDMoZG9fYWx1XyxOLF90ZXN0cykKLSNkZWZpbmUgT1BfQkVHSU4gICAgIFhDT05DQVQzKEFMVSxOLF9CRUdJTikKLSNkZWZpbmUgT1BfQUREQyAgICAgIFhDT05DQVQzKEFMVSxOLF9BRERDKQotI2RlZmluZSBPUF9BRERDX0MgICAgWENPTkNBVDMoQUxVLE4sX0FERENfQykKLSNkZWZpbmUgT1BfU1VCQyAgICAgIFhDT05DQVQzKEFMVSxOLF9TVUJDKQotI2RlZmluZSBPUF9TVUJCICAgICAgWENPTkNBVDMoQUxVLE4sX1NVQkIpCi0jZGVmaW5lIE9QX1NVQkJfQiAgICBYQ09OQ0FUMyhBTFUsTixfU1VCQl9CKQotI2RlZmluZSBPUF9TVUJDX1ggICAgWENPTkNBVDMoQUxVLE4sX1NVQkNfWCkKLSNkZWZpbmUgT1BfTkVHQyAgICAgIFhDT05DQVQzKEFMVSxOLF9ORUdDKQotI2RlZmluZSBPUF9ORUdCICAgICAgWENPTkNBVDMoQUxVLE4sX05FR0IpCi0jZGVmaW5lIEhBRF9DQVJSWV9CT1JST1cgICAgKFhDT05DQVQzKEFMVSxOLF9IQURfQ0FSUllfQk9SUk9XKSAhPSAwKQotI2RlZmluZSBIQURfT1ZFUkZMT1cgKFhDT05DQVQzKEFMVSxOLF9IQURfT1ZFUkZMT1cpICE9IDApCi0jZGVmaW5lIFJFU1VMVCAgICAgICAgICBYQ09OQ0FUMyhBTFUsTixfUkVTVUxUKQotI2RlZmluZSBDQVJSWV9CT1JST1dfUkVTVUxUICAgIFhDT05DQVQzKEFMVSxOLF9DQVJSWV9CT1JST1dfUkVTVUxUKQotI2RlZmluZSBPVkVSRkxPV19SRVNVTFQgWENPTkNBVDMoQUxVLE4sX09WRVJGTE9XX1JFU1VMVCkKLSNkZWZpbmUgZG9fb3BfTiAgICAgIFhDT05DQVQyKGRvX29wXyxOKQotCi0KLXZvaWQKLWRvX29wX04gKGNvbnN0IGFsdV90ZXN0ICp0c3QpCi17Ci0gIGNvbnN0IGFsdV9vcCAqb3A7Ci0gIGludCBib3Jyb3dfcCA9IDA7Ci0gIE9QX0JFR0lOICh0c3QtPmJlZ2luKTsKLSAgcHJpbnRfaGV4ICh0c3QtPmJlZ2luLCBOKTsKLSAgZm9yIChvcCA9IHRzdC0+b3BzOyBvcC0+b3AgIT0gTlVMTDsgb3ArKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJXMgIiwgb3AtPm9wKTsKLSAgICAgIHByaW50X2hleCAob3AtPmFyZywgTik7Ci0gICAgICBpZiAoc3RyY21wIChvcC0+b3AsICJBRERDIikgPT0gMCkKLQlPUF9BRERDIChvcC0+YXJnKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiQUREQ19DMCIpID09IDApCi0JT1BfQUREQ19DIChvcC0+YXJnLCAwKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiQUREQ19DMSIpID09IDApCi0JT1BfQUREQ19DIChvcC0+YXJnLCAxKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiU1VCQyIpID09IDApCi0JT1BfU1VCQyAob3AtPmFyZyk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIlNVQkNfWDAiKSA9PSAwKQotCU9QX1NVQkNfWCAob3AtPmFyZywgMCk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIlNVQkNfWDEiKSA9PSAwKQotCU9QX1NVQkNfWCAob3AtPmFyZywgMSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIlNVQkIiKSA9PSAwKQotCXsKLQkgIE9QX1NVQkIgKG9wLT5hcmcpOwotCSAgYm9ycm93X3AgKys7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJTVUJCX0IwIikgPT0gMCkKLQl7Ci0JICBPUF9TVUJCX0IgKG9wLT5hcmcsIDApOwotCSAgYm9ycm93X3AgKys7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJTVUJCX0IxIikgPT0gMCkKLQl7Ci0JICBPUF9TVUJCX0IgKG9wLT5hcmcsIDEpOwotCSAgYm9ycm93X3AgKys7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJORUdDIikgPT0gMCkKLQlPUF9ORUdDICgpOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJORUdCIikgPT0gMCkKLQl7Ci0JICBPUF9ORUdCICgpOwotCSAgYm9ycm93X3AgKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAtLSBvcGVyYXRvciB1bmtub3duXG4iKTsKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHByaW50ZiAoIiA9ICIpOwotICBwcmludF9oZXggKHRzdC0+cmVzdWx0LCBOKTsKLSAgaWYgKGJvcnJvd19wKQotICAgIHByaW50ZiAoIiBCOiVkIiwgdHN0LT5jYXJyeV9ib3Jyb3cpOwotICBlbHNlCi0gICAgcHJpbnRmICgiIEM6JWQiLCB0c3QtPmNhcnJ5X2JvcnJvdyk7Ci0gIHByaW50ZiAoIiBWOiVkIiwgdHN0LT5vdmVyZmxvdyk7Ci0gIGlmICh0c3QtPmNhcnJ5X2JvcnJvdyAhPSBIQURfQ0FSUllfQk9SUk9XKQotICAgIHsKLSAgICAgIGlmIChib3Jyb3dfcCkKLQlwcmludGYgKCIgLS0gYm9ycm93ICglZCkgd3JvbmciLCBIQURfQ0FSUllfQk9SUk9XKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIgLS0gY2FycnkgKCVkKSB3cm9uZyIsIEhBRF9DQVJSWV9CT1JST1cpOwotICAgICAgZXJyb3JzICsrOwotICAgIH0KLSAgaWYgKHRzdC0+b3ZlcmZsb3cgIT0gSEFEX09WRVJGTE9XKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAtLSBvdmVyZmxvdyAoJWQpIHdyb25nIiwgSEFEX09WRVJGTE9XKTsKLSAgICAgIGVycm9ycyArKzsKLSAgICB9Ci0gIGlmICgodW5zaWduZWROKSBDQVJSWV9CT1JST1dfUkVTVUxUICE9ICh1bnNpZ25lZE4pIHRzdC0+cmVzdWx0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAtLSByZXN1bHQgZm9yIGNhcnJ5L2JvcnJvdyB3cm9uZyAiKTsKLSAgICAgIHByaW50X2hleCAoQ0FSUllfQk9SUk9XX1JFU1VMVCwgTik7Ci0gICAgICBlcnJvcnMgKys7Ci0gICAgfQotICBpZiAoKHVuc2lnbmVkTikgT1ZFUkZMT1dfUkVTVUxUICE9ICh1bnNpZ25lZE4pIHRzdC0+cmVzdWx0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAtLSByZXN1bHQgZm9yIG92ZXJmbG93IHdyb25nICIpOwotICAgICAgcHJpbnRfaGV4IChPVkVSRkxPV19SRVNVTFQsIE4pOwotICAgICAgZXJyb3JzICsrOwotICAgIH0KLSAgaWYgKCh1bnNpZ25lZE4pIFJFU1VMVCAhPSAodW5zaWduZWROKSB0c3QtPnJlc3VsdCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgLS0gcmVzdWx0IHdyb25nICIpOwotICAgICAgcHJpbnRfaGV4IChSRVNVTFQsIE4pOwotICAgICAgZXJyb3JzICsrOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotCi1jb25zdCBhbHVfdGVzdCBhbHVfTl90ZXN0c1tdID0gewotCi0gIC8qIDAgKyAwOyAwICsgMTsgMSArIDA7IDEgKyAxICovCi0gIHsgMCwgeyB7ICJBRERDIiwgMCB9LCB9LCAwLCAwLCAwLCB9LAotICB7IDAsIHsgeyAiQUREQyIsIDEgfSwgfSwgMSwgMCwgMCwgfSwKLSAgeyAxLCB7IHsgIkFEREMiLCAwIH0sIH0sIDEsIDAsIDAsIH0sCi0gIHsgMSwgeyB7ICJBRERDIiwgMSB9LCB9LCAyLCAwLCAwLCB9LAotCi0gIC8qIDAgKyAwICsgMDsgMCArIDAgKyAxOyAwICsgMSArIDA7IDAgKyAxICsgMSAqLwotICAvKiAxICsgMCArIDA7IDEgKyAwICsgMTsgMSArIDEgKyAwOyAxICsgMSArIDEgKi8KLSAgeyAwLCB7IHsgIkFERENfQzAiLCAwIH0sIH0sIDAsIDAsIDAsIH0sCi0gIHsgMCwgeyB7ICJBRERDX0MwIiwgMSB9LCB9LCAxLCAwLCAwLCB9LAotICB7IDAsIHsgeyAiQUREQ19DMSIsIDAgfSwgfSwgMSwgMCwgMCwgfSwKLSAgeyAwLCB7IHsgIkFERENfQzEiLCAxIH0sIH0sIDIsIDAsIDAsIH0sCi0gIHsgMSwgeyB7ICJBRERDX0MwIiwgMCB9LCB9LCAxLCAwLCAwLCB9LAotICB7IDEsIHsgeyAiQUREQ19DMCIsIDEgfSwgfSwgMiwgMCwgMCwgfSwKLSAgeyAxLCB7IHsgIkFERENfQzEiLCAwIH0sIH0sIDIsIDAsIDAsIH0sCi0gIHsgMSwgeyB7ICJBRERDX0MxIiwgMSB9LCB9LCAzLCAwLCAwLCB9LAotCi0gIC8qICovCi0gIHsgTUFYX0lOVCwgeyB7ICJBRERDIiwgMSB9LCB9LCBNSU5fSU5ULCAwLCAxLCB9LAotICB7IE1JTl9JTlQsIHsgeyAiQUREQyIsIC0xIH0sIH0sIE1BWF9JTlQsIDEsIDEsIH0sCi0gIHsgTUFYX0lOVCwgeyB7ICJBRERDIiwgTUlOX0lOVCB9LCB9LCAtMSwgMCwgMCwgfSwKLSAgeyBNSU5fSU5ULCB7IHsgIkFEREMiLCBNQVhfSU5UIH0sIH0sIC0xLCAwLCAwLCB9LAotICB7IE1BWF9JTlQsIHsgeyAiQUREQyIsIE1BWF9JTlQgfSwgfSwgTUFYX0lOVCA8PCAxLCAwLCAxLCB9LAotICB7IE1JTl9JTlQsIHsgeyAiQUREQyIsIE1JTl9JTlQgfSwgfSwgMCwgMSwgMSwgfSwKLSAgLyogKi8KLSAgeyAwLCB7IHsgIkFERENfQzEiLCAtMSB9LCB9LCAwLCAxLCAwLCB9LAotICB7IDAsIHsgeyAiQUREQ19DMSIsIC0yIH0sIH0sIC0xLCAwLCAwLCB9LAotICB7IC0xLCB7IHsgIkFERENfQzEiLCAwIH0sIH0sIDAsIDEsIDAsIH0sCi0gIHsgMCwgeyB7ICJBRERDX0MwIiwgMCB9LCB9LCAwLCAwLCAwLCB9LAotICB7IC0xLCB7IHsgIkFERENfQzEiLCAtMSB9LCB9LCAtMSwgMSwgMCwgfSwKLSAgeyAtMSwgeyB7ICJBRERDX0MxIiwgMSB9LCB9LCAxLCAxLCAwLCB9LAotICB7IDAsIHsgeyAiQUREQ19DMSIsIE1BWF9JTlQgfSwgfSwgTUlOX0lOVCwgMCwgMSwgfSwKLSAgeyBNQVhfSU5ULCB7IHsgIkFERENfQzEiLCAxIH0sIH0sIE1JTl9JTlQgKyAxLCAwLCAxLCB9LAotICB7IE1BWF9JTlQsIHsgeyAiQUREQ19DMSIsIE1JTl9JTlQgfSwgfSwgMCwgMSwgMCwgfSwKLSAgeyBNQVhfSU5ULCB7IHsgIkFERENfQzEiLCBNQVhfSU5UIH0sIH0sIChNQVhfSU5UIDw8IDEpICsgMSwgMCwgMSwgfSwKLSAgeyBNQVhfSU5ULCB7IHsgIkFERENfQzAiLCBNQVhfSU5UIH0sIH0sIE1BWF9JTlQgPDwgMSwgMCwgMSwgfSwKLQotICAvKiAwIC0gMCAqLwotICB7IDAsIHsgeyAiU1VCQyIsICAgIDAgfSwgfSwgIDAsIDEsIDAsIH0sCi0gIHsgMCwgeyB7ICJTVUJCIiwgICAgMCB9LCB9LCAgMCwgMCwgMCwgfSwKLQotICAvKiAwIC0gMSAqLwotICB7IDAsIHsgeyAiU1VCQyIsICAgIDEgfSwgfSwgLTEsIDAsIDAsIH0sCi0gIHsgMCwgeyB7ICJTVUJCIiwgICAgMSB9LCB9LCAtMSwgMSwgMCwgfSwKLQotICAvKiAxIC0gMCAqLwotICB7IDEsIHsgeyAiU1VCQyIsICAgIDAgfSwgfSwgIDEsIDEsIDAsIH0sCi0gIHsgMSwgeyB7ICJTVUJCIiwgICAgMCB9LCB9LCAgMSwgMCwgMCwgfSwKLQotICAvKiAxIC0gMSAqLwotICB7IDEsIHsgeyAiU1VCQyIsICAgIDEgfSwgfSwgIDAsIDEsIDAsIH0sCi0gIHsgMSwgeyB7ICJTVUJCIiwgICAgMSB9LCB9LCAgMCwgMCwgMCwgfSwKLQotICAvKiAwIC0gMCAtIDAgKi8KLSAgeyAwLCB7IHsgIlNVQkNfWDAiLCAwIH0sIH0sIC0xLCAwLCAwLCB9LAotICB7IDAsIHsgeyAiU1VCQl9CMCIsIDAgfSwgfSwgIDAsIDAsIDAsIH0sCi0KLSAgLyogMCAtIDAgLSAxICovCi0gIHsgMCwgeyB7ICJTVUJDX1gwIiwgMSB9LCB9LCAtMiwgMCwgMCwgfSwKLSAgeyAwLCB7IHsgIlNVQkJfQjAiLCAxIH0sIH0sIC0xLCAxLCAwLCB9LAotCi0gIC8qIDAgLSAxIC0gMCAqLwotICB7IDAsIHsgeyAiU1VCQ19YMSIsIDAgfSwgfSwgIDAsIDEsIDAsIH0sCi0gIHsgMCwgeyB7ICJTVUJCX0IxIiwgMCB9LCB9LCAtMSwgMSwgMCwgfSwKLQotICAvKiAwIC0gMSAtIDEgKi8KLSAgeyAwLCB7IHsgIlNVQkNfWDEiLCAxIH0sIH0sIC0xLCAwLCAwLCB9LAotICB7IDAsIHsgeyAiU1VCQl9CMSIsIDEgfSwgfSwgLTIsIDEsIDAsIH0sCi0KLSAgLyogMSAtIDAgLSAwICovCi0gIHsgMSwgeyB7ICJTVUJDX1gwIiwgMCB9LCB9LCAgMCwgMSwgMCwgfSwKLSAgeyAxLCB7IHsgIlNVQkJfQjAiLCAwIH0sIH0sICAxLCAwLCAwLCB9LAotCi0gIC8qIDEgLSAwIC0gMSAqLwotICB7IDEsIHsgeyAiU1VCQ19YMCIsIDEgfSwgfSwgLTEsIDAsIDAsIH0sCi0gIHsgMSwgeyB7ICJTVUJCX0IwIiwgMSB9LCB9LCAgMCwgMCwgMCwgfSwKLQotICAvKiAxIC0gMSAtIDAgKi8KLSAgeyAxLCB7IHsgIlNVQkNfWDEiLCAwIH0sIH0sICAxLCAxLCAwLCB9LAotICB7IDEsIHsgeyAiU1VCQl9CMSIsIDAgfSwgfSwgIDAsIDAsIDAsIH0sCi0KLSAgLyogMSAtIDEgLSAxICovCi0gIHsgMSwgeyB7ICJTVUJDX1gxIiwgMSB9LCB9LCAgMCwgMSwgMCwgfSwKLSAgeyAxLCB7IHsgIlNVQkJfQjEiLCAxIH0sIH0sIC0xLCAxLCAwLCB9LAotCi0gIC8qICovCi0gIHsgMCwgICAgICAgeyB7ICJTVUJDIiwgTUlOX0lOVCB9LCB9LCBNSU5fSU5ULCAwLCAxLCB9LAotICB7IE1JTl9JTlQsIHsgeyAiU1VCQyIsIDEgfSwgfSwgTUFYX0lOVCwgMSwgMSwgfSwKLSAgeyBNQVhfSU5ULCB7IHsgIlNVQkMiLCBNQVhfSU5UIH0sIH0sIDAsIDEsIDAsIH0sCi0KLSAgLyogKi8KLSAgeyAwLCAgICAgICB7IHsgIlNVQkNfWDAiLCBNSU5fSU5UIH0sIH0sIE1BWF9JTlQsIDAsIDAsIH0sCi0gIHsgTUlOX0lOVCwgeyB7ICJTVUJDX1gxIiwgICAgICAgMCB9LCB9LCBNSU5fSU5ULCAxLCAwLCB9LAotICB7IE1BWF9JTlQsIHsgeyAiU1VCQ19YMCIsIE1BWF9JTlQgfSwgfSwgICAgICAtMSwgMCwgMCwgfSwKLQotICAvKiAqLwotICB7IE1BWF9JTlQsIHsgeyAiTkVHQyIsIDAgfSwgfSwgTUlOX0lOVCArIDEsIDAsIDAsIH0sCi0gIHsgTUFYX0lOVCwgeyB7ICJORUdDIiwgMCB9LCB9LCBNSU5fSU5UICsgMSwgMCwgMCwgfSwKLSAgeyBNSU5fSU5ULCB7IHsgIk5FR0MiLCAwIH0sIH0sIE1JTl9JTlQsIDAsIDEsIH0sCi0gIHsgMCwgeyB7ICJORUdDIiwgMCB9LCB9LCAwLCAxLCAwLCB9LAotICB7IC0xLCB7IHsgIk5FR0MiLCAwIH0sIH0sIDEsIDAsIDAsIH0sCi0gIHsgMSwgeyB7ICJORUdDIiwgMCB9LCB9LCAtMSwgMCwgMCwgfSwKLX07Ci0KLQotc3RhdGljIHZvaWQKLWRvX2FsdV9OX3Rlc3RzICh2b2lkKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYWx1X05fdGVzdHMpIC8gc2l6ZW9mICgqYWx1X05fdGVzdHMpOyBpKyspCi0gICAgewotICAgICAgY29uc3QgYWx1X3Rlc3QgKnRzdCA9ICZhbHVfTl90ZXN0c1tpXTsKLSAgICAgIGRvX29wX04gKHRzdCk7Ci0gICAgfQotfQotCi0KLSN1bmRlZiBPUF9CRUdJTgotI3VuZGVmIE9QX0FEREMKLSN1bmRlZiBPUF9BRERDX0MKLSN1bmRlZiBPUF9TVUJCCi0jdW5kZWYgT1BfU1VCQwotI3VuZGVmIE9QX1NVQkNfWAotI3VuZGVmIE9QX1NVQkJfQgotI3VuZGVmIEhBRF9PVkVSRkxPVwotI3VuZGVmIEhBRF9DQVJSWV9CT1JST1cKLSN1bmRlZiBPVkVSRkxPV19SRVNVTFQKLSN1bmRlZiBDQVJSWV9CT1JST1dfUkVTVUxUCi0jdW5kZWYgUkVTVUxUCi0jdW5kZWYgZG9fb3BfTgotI3VuZGVmIHVuc2lnbmVkTgotI3VuZGVmIE1BWF9JTlQKLSN1bmRlZiBNSU5fSU5UCi0jdW5kZWYgYWx1X05fdGVzdHMKLSN1bmRlZiBkb19hbHVfTl90ZXN0cwotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9hbHUtdHN0LmMgYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9hbHUtdHN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZmZmZTUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYWx1LXRzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSNkZWZpbmUgV0lUSF9UQVJHRVRfV09SRF9NU0IgMAotI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgNjQKLSNkZWZpbmUgV0lUSF9IT1NUX1dPUkRfQklUU0laRSAoc2l6ZW9mIChpbnQpICogOCkKLSNkZWZpbmUgV0lUSF9UQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOIC8qIGRvZXMgbm90IG1hdHRlciAqLwotCi0jZGVmaW5lIEFTU0VSVChFWFBSRVNTSU9OKSBcCi17IFwKLSAgaWYgKCEoRVhQUkVTU0lPTikpIHsgXAotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiBhc3NlcnRpb24gZmFpbGVkIC0gJXNcbiIsIFwKLSAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNFWFBSRVNTSU9OKTsgXAotICAgIGFib3J0ICgpOyBcCi0gIH0gXAotfQotCi0jZGVmaW5lIFNJTV9CSVRTX0lOTElORSAoSU5DTFVERV9NT0RVTEUgfCBJTkNMVURFRF9CWV9NT0RVTEUpCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLQotI2luY2x1ZGUgInNpbS1hbHUuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqb3A7Ci0gIHVuc2lnbmVkNjQgYXJnOwotfSBhbHVfb3A7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQ2NCBiZWdpbjsKLSAgYWx1X29wIG9wc1s0XTsKLSAgdW5zaWduZWQ2NCByZXN1bHQ7Ci0gIGludCBjYXJyeV9ib3Jyb3c7Ci0gIGludCBvdmVyZmxvdzsKLX0gYWx1X3Rlc3Q7Ci0KLSNkZWZpbmUgTUFYX0lOVDggVU5TSUdORUQ2NCAoMTI3KQotI2RlZmluZSBNSU5fSU5UOCBVTlNJR05FRDY0ICgxMjgpCi0KLSNkZWZpbmUgTUFYX0lOVDE2IFVOU0lHTkVENjQgKDMyNzY3KQotI2RlZmluZSBNSU5fSU5UMTYgVU5TSUdORUQ2NCAoMzI3NjgpCi0KLSNkZWZpbmUgTUFYX0lOVDMyIFVOU0lHTkVENjQgKDB4N2ZmZmZmZmYpCi0jZGVmaW5lIE1JTl9JTlQzMiBVTlNJR05FRDY0ICgweDgwMDAwMDAwKQotCi0jZGVmaW5lIE1BWF9JTlQ2NCBVTlNJR05FRDY0ICgweDdmZmZmZmZmZmZmZmZmZmYpCi0jZGVmaW5lIE1JTl9JTlQ2NCBVTlNJR05FRDY0ICgweDgwMDAwMDAwMDAwMDAwMDApCi0KLXN0YXRpYyB2b2lkCi1wcmludF9oZXggKHVuc2lnbmVkNjQgdmFsLCBpbnQgbnJfYml0cykKLXsKLSAgc3dpdGNoIChucl9iaXRzKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICBwcmludGYgKCIweCUwMmx4IiwgKGxvbmcpICh1bnNpZ25lZDgpICh2YWwpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBwcmludGYgKCIweCUwNGx4IiwgKGxvbmcpICh1bnNpZ25lZDE2KSAodmFsKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgcHJpbnRmICgiMHglMDhseCIsIChsb25nKSAodW5zaWduZWQzMikgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2NDoKLSAgICAgIHByaW50ZiAoIjB4JTA4bHglMDhseCIsCi0JICAgICAgKGxvbmcpICh1bnNpZ25lZDMyKSAodmFsID4+IDMyKSwKLQkgICAgICAobG9uZykgKHVuc2lnbmVkMzIpICh2YWwpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotaW50IGVycm9ycyA9IDA7Ci0KLQotI2RlZmluZSBOIDgKLSNpbmNsdWRlICJhbHUtbi10c3QuaCIKLSN1bmRlZiBOCi0KLSNkZWZpbmUgTiAxNgotI2luY2x1ZGUgImFsdS1uLXRzdC5oIgotI3VuZGVmIE4KLQotI2RlZmluZSBOIDMyCi0jaW5jbHVkZSAiYWx1LW4tdHN0LmgiCi0jdW5kZWYgTgotCi0jZGVmaW5lIE4gNjQKLSNpbmNsdWRlICJhbHUtbi10c3QuaCIKLSN1bmRlZiBOCi0KLQotCi1pbnQKLW1haW4gKCkKLXsKLSAgZG9fYWx1XzhfdGVzdHMgKCk7Ci0gIGRvX2FsdV8xNl90ZXN0cyAoKTsKLSAgZG9fYWx1XzMyX3Rlc3RzICgpOwotICBkb19hbHVfNjRfdGVzdHMgKCk7Ci0gIHJldHVybiAoZXJyb3JzICE9IDApOwotfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYml0cy1nZW4uYyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2JpdHMtZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGRlZjMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYml0cy1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKiBNaXNjZWxsYW5lb3VzIHNpbXVsYXRvciB1dGlsaXRpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLXZvaWQKLWdlbl9zdHJ1Y3QgKHZvaWQpCi17Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IF90ZXN0X3R1cGxlcyB7XG4iKTsKLSAgcHJpbnRmICgiICBpbnQgbGluZTtcbiIpOwotICBwcmludGYgKCIgIGludCByb3c7XG4iKTsKLSAgcHJpbnRmICgiICBpbnQgY29sO1xuIik7Ci0gIHByaW50ZiAoIiAgbG9uZyBsb25nIHZhbDtcbiIpOwotICBwcmludGYgKCIgIGxvbmcgbG9uZyBjaGVjaztcbiIpOwotICBwcmludGYgKCJ9IHRlc3RfdHVwbGVzO1xuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IF90ZXN0X3NwZWMge1xuIik7Ci0gIHByaW50ZiAoIiAgY29uc3QgY2hhciAqZmlsZTtcbiIpOwotICBwcmludGYgKCIgIGNvbnN0IGNoYXIgKm1hY3JvO1xuIik7Ci0gIHByaW50ZiAoIiAgaW50IG5yX3Jvd3M7XG4iKTsKLSAgcHJpbnRmICgiICBpbnQgbnJfY29scztcbiIpOwotICBwcmludGYgKCIgIHRlc3RfdHVwbGVzICp0dXBsZXM7XG4iKTsKLSAgcHJpbnRmICgifSB0ZXN0X3NwZWM7XG4iKTsKLX0KLQotCi12b2lkCi1nZW5fYml0IChpbnQgYml0c2l6ZSwKLQkgaW50IG1zYiwKLQkgY29uc3QgY2hhciAqbWFjcm8sCi0JIGludCBucl9iaXRzKQotewotICBpbnQgaTsKLQotICBwcmludGYgKCJcbi8qIFRlc3QgdGhlICVzIG1hY3JvICovXG4iLCBtYWNybyk7Ci0gIHByaW50ZiAoInRlc3RfdHVwbGVzICVzX3R1cGxlc1slZF0gPSB7XG4iLCBtYWNybywgbnJfYml0cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucl9iaXRzOyBpKyspCi0gICAgewotICAgICAgLyogY29tcHV0ZSB3aGF0IHdlIHRoaW5rIHRoZSB2YWx1ZSBpcyAqLwotICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGJpdCA9IDE7Ci0gICAgICBpZiAobXNiID09IDApCi0JYml0IDw8PSBucl9iaXRzIC0gaSAtIDE7Ci0gICAgICBlbHNlCi0JYml0IDw8PSBpOwotICAgICAgaWYgKGJpdHNpemUgPT0gMzIpCi0JYml0ID0gKHVuc2lnbmVkKSBiaXQ7IC8qIHRydW5jYXRlIGl0ISAqLwotICAgICAgLyogd3JpdGUgaXQgb3V0ICovCi0gICAgICBwcmludGYgKCIgIHsgX19MSU5FX18sICIpOwotICAgICAgcHJpbnRmICgiJWQsICUyZCwgIiwgLTEsIGkpOwotICAgICAgcHJpbnRmICgiJXMgKCUyZCksICIsIG1hY3JvLCBpKTsKLSAgICAgIHByaW50ZiAoIlVOU0lHTkVENjQgKDB4JTA4bHglMDhseCksICIsCi0JICAgICAgKGxvbmcpIChiaXQgPj4gMzIpLCAobG9uZykgYml0KTsKLSAgICAgIHByaW50ZiAoIn0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgidGVzdF9zcGVjICVzX3Rlc3QgPSB7IF9fRklMRV9fLCBcIiVzXCIsIDEsICVkLCAlc190dXBsZXMsIH07XG4iLAotCSAgbWFjcm8sIG1hY3JvLCBucl9iaXRzLCBtYWNybyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotdm9pZAotZ2VuX2VudW0gKGNvbnN0IGNoYXIgKm1hY3JvLAotCSAgaW50IG5yX2JpdHMpCi17Ci0gIGludCBpOwotCi0gIHByaW50ZiAoIlxuLyogVGVzdCB0aGUgJXMgbWFjcm8gaW4gYW4gZW51bSAqL1xuIiwgbWFjcm8pOwotICBwcmludGYgKCJlbnVtIGVudW1fJXMge1xuIiwgbWFjcm8pOwotICBmb3IgKGkgPSAwOyBpIDwgbnJfYml0czsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAgZWxlbV8lc18lZCA9ICVzICglZCksXG4iLCBtYWNybywgaSwgbWFjcm8sIGkpOwotICAgIH0KLSAgcHJpbnRmICgifTtcbiIpOwotICBwcmludGYgKCJcbiIpOwotfQotCi0KLXZvaWQKLWdlbl9tYXNrIChpbnQgYml0c2l6ZSwKLQkgIGNvbnN0IGNoYXIgKm1zYiwKLQkgIGNvbnN0IGNoYXIgKm1hY3JvLAotCSAgaW50IG5yX2JpdHMpCi17Ci0gIGludCBsOwotICBpbnQgaDsKLSAgcHJpbnRmICgiXG4vKiBUZXN0IHRoZSAlcyVzIG1hY3JvICovXG4iLCBtc2IsIG1hY3JvKTsKLSAgcHJpbnRmICgidGVzdF90dXBsZXMgJXNfdHVwbGVzWyVkXVslZF0gPSB7XG4iLCBtYWNybywgbnJfYml0cywgbnJfYml0cyk7Ci0gIGZvciAobCA9IDA7IGwgPCBucl9iaXRzOyBsKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICB7XG4iKTsKLSAgICAgIGZvciAoaCA9IDA7IGggPCBucl9iaXRzOyBoKyspCi0JewotCSAgcHJpbnRmICgiICAgIHsgX19MSU5FX18sICIpOwotCSAgaWYgKChzdHJjbXAgKG1zYiwgIk1TIikgPT0gMCAmJiBsIDw9IGgpCi0JICAgICAgfHwgKHN0cmNtcCAobXNiLCAiTVMiKSAhPSAwICYmIGwgPj0gaCkKLQkgICAgICB8fCAoc3RyY21wIChtYWNybywgIiIpID09IDApKQotCSAgICB7Ci0JICAgICAgLyogY29tcHV0ZSB0aGUgbWFzayAqLwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXNrID0gMDsKLQkgICAgICBpbnQgYjsKLQkgICAgICBmb3IgKGIgPSAwOyBiIDwgbnJfYml0czsgYisrKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBsb25nIGJpdCA9IDE7Ci0JCSAgaWYgKHN0cmNtcCAobXNiLCAiTVMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpZiAoKGwgPD0gYiAmJiBiIDw9IGgpCi0JCQkgIHx8IChoIDwgbCAmJiAoYiA8PSBoIHx8IGIgPj0gbCkpKQotCQkJYml0IDw8PSAobnJfYml0cyAtIGIgLSAxKTsKLQkJICAgICAgZWxzZQotCQkJYml0ID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICgobCA+PSBiICYmIGIgPj0gaCkKLQkJCSAgfHwgKGggPiBsICYmIChiID49IGggfHwgYiA8PSBsKSkpCi0JCQliaXQgPDw9IGI7Ci0JCSAgICAgIGVsc2UKLQkJCWJpdCA9IDA7Ci0JCSAgICB9Ci0JCSAgbWFzayB8PSBiaXQ7Ci0JCX0KLQkgICAgICBpZiAoYml0c2l6ZSA9PSAzMikKLQkJbWFzayA9ICh1bnNpZ25lZCBsb25nKSBtYXNrOwotCSAgICAgIHByaW50ZiAoIiVkLCAlZCwgIiwgbCwgaCk7Ci0JICAgICAgcHJpbnRmICgiJXMlcyAoJTJkLCAlMmQpLCAiLCBtc2IsIG1hY3JvLCBsLCBoKTsKLQkgICAgICBwcmludGYgKCJVTlNJR05FRDY0ICgweCUwOGx4JTA4bHgpLCAiLAotCQkgICAgICAobG9uZykgKG1hc2sgPj4gMzIpLCAobG9uZykgbWFzayk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLTEsIC0xLCAiKTsKLQkgIHByaW50ZiAoIn0sXG4iKTsKLQl9Ci0gICAgICBwcmludGYgKCIgIH0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoIn07XG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgidGVzdF9zcGVjICVzX3Rlc3QgPSB7IF9fRklMRV9fLCBcIiVzJXNcIiwgJWQsICVkLCAmJXNfdHVwbGVzWzBdWzBdLCB9O1xuIiwKLQkgIG1hY3JvLCBtc2IsIG1hY3JvLCBucl9iaXRzLCBucl9iaXRzLCBtYWNybyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotdm9pZAotdXNhZ2UgKGludCByZWFzb24pCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgYml0cy1nZW4gPG5yLWJpdHM+IDxtc2I+IDxieXRlLW9yZGVyPlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIkdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciB0aGUgc2ltdWxhdG9yIGJpdCBtYW5pcHVsYXRpb24gY29kZVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgPG5yLWJpdHM+ID0geyAzMiB8IDY0IH1cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgIDxtc2I+ID0geyAwIHwgeyAzMSB8IDYzIH0gfVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgPGJ5dGUtb3JkZXI+ID0geyBiaWcgfCBsaXR0bGUgfVxuIik7Ci0KLSAgc3dpdGNoIChyZWFzb24pCi0gICAgewotICAgIGNhc2UgMTogZnByaW50ZiAoc3RkZXJyLCAiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50c1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIDxuci1iaXRzPiBhcmd1bWVudFxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIDxtc2I+IGFyZ3VtZW50XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgPGJ5dGUtb3JkZXI+IGFyZ3VtZW50XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgfQotCi0gIGV4aXQgKDEpOwotfQotCi0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBiaXRzaXplOwotICBpbnQgbXNiOwotICBjaGFyICptczsKLSAgaW50IGJpZ19lbmRpYW47Ci0KLSAgaWYgKGFyZ2MgIT0gNCkKLSAgICB1c2FnZSAoMSk7Ci0KLSAgaWYgKHN0cmNtcCAoYXJndiBbMV0sICIzMiIpID09IDApCi0gICAgYml0c2l6ZSA9IDMyOwotICBlbHNlIGlmIChzdHJjbXAgKGFyZ3YgWzFdLCAiNjQiKSA9PSAwKQotICAgIGJpdHNpemUgPSA2NDsKLSAgZWxzZQotICAgIHVzYWdlICgyKTsKLQotICBpZiAoc3RyY21wIChhcmd2IFsyXSwgIjAiKSA9PSAwKQotICAgIG1zYiA9IDA7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJndiBbMl0sICIzMSIpID09IDAgJiYgYml0c2l6ZSA9PSAzMikKLSAgICBtc2IgPSAzMTsKLSAgZWxzZSBpZiAoc3RyY21wIChhcmd2IFsyXSwgIjYzIikgPT0gMCAmJiBiaXRzaXplID09IDY0KQotICAgIG1zYiA9IDYzOwotICBlbHNlCi0gICAgdXNhZ2UgKDMpOwotICBpZiAobXNiID09IDApCi0gICAgbXMgPSAiTVMiOwotICBlbHNlCi0gICAgbXMgPSAiTFMiOwotICAKLSAgaWYgKHN0cmNtcCAoYXJndiBbM10sICJiaWciKSA9PSAwKQotICAgIGJpZ19lbmRpYW4gPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKGFyZ3YgWzNdLCAibGl0dGxlIikgPT0gMCkKLSAgICBiaWdfZW5kaWFuID0gMDsKLSAgZWxzZQotICAgIHVzYWdlICg0KTsKLSAgICAKLSAgcHJpbnRmICgiI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgJWRcbiIsIGJpdHNpemUpOwotICBwcmludGYgKCIjZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfTVNCICVkXG4iLCBtc2IpOwotICBwcmludGYgKCIjZGVmaW5lIFdJVEhfSE9TVF9XT1JEX0JJVFNJWkUgJWRcbiIsIHNpemVvZiAoaW50KSAqIDgpOwotICBwcmludGYgKCIjZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIgJXNcbiIsIGJpZ19lbmRpYW4gPyAiQklHX0VORElBTiIgOiAiTElUVExFX0VORElBTiIpOwotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIFNJTV9CSVRTX0lOTElORSAoQUxMX0hfSU5MSU5FKVxuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVNTRVJUKFgpIGRvIHsgaWYgKCEoWCkpIGFib3J0KCk7IH0gd2hpbGUgKDApXG4iKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW0tYmFzaWNzLmhcIlxuIik7Ci0KLSAgZ2VuX3N0cnVjdCAoKTsKLQotCi0KLSAgcHJpbnRmICgiI2RlZmluZSBET19CSVRfVEVTVFNcbiIpOwotICBnZW5fYml0ICggNCwgbXNiLCAiQklUNCIsICA0KTsKLSAgZ2VuX2JpdCAoIDUsIG1zYiwgIkJJVDUiLCAgNSk7Ci0gIGdlbl9iaXQgKCA4LCBtc2IsICJCSVQ4IiwgIDgpOwotICBnZW5fYml0ICgxMCwgbXNiLCAiQklUMTAiLCAxMCk7Ci0gIGdlbl9iaXQgKDE2LCBtc2IsICJCSVQxNiIsIDE2KTsKLSAgZ2VuX2JpdCAoMzIsIG1zYiwgIkJJVDMyIiwgMzIpOwotICBnZW5fYml0ICg2NCwgbXNiLCAiQklUNjQiLCA2NCk7Ci0gIGdlbl9iaXQgKGJpdHNpemUsIG1zYiwgIkJJVCIsIDY0KTsKLQotICBnZW5fYml0ICggOCwgIDggLSAxLCAiTFNCSVQ4IiwgICA4KTsKLSAgZ2VuX2JpdCAoMTYsIDE2IC0gMSwgIkxTQklUMTYiLCAxNik7Ci0gIGdlbl9iaXQgKDMyLCAzMiAtIDEsICJMU0JJVDMyIiwgMzIpOwotICBnZW5fYml0ICg2NCwgNjQgLSAxLCAiTFNCSVQ2NCIsIDY0KTsKLSAgZ2VuX2JpdCAoYml0c2l6ZSwgYml0c2l6ZSAtIDEsICJMU0JJVCIsICAgNjQpOwotCi0gIGdlbl9iaXQgKCA4LCAgMCwgIk1TQklUOCIsICAgOCk7Ci0gIGdlbl9iaXQgKDE2LCAgMCwgIk1TQklUMTYiLCAxNik7Ci0gIGdlbl9iaXQgKDMyLCAgMCwgIk1TQklUMzIiLCAzMik7Ci0gIGdlbl9iaXQgKDY0LCAgMCwgIk1TQklUNjQiLCA2NCk7Ci0gIGdlbl9iaXQgKGJpdHNpemUsICAwLCAiTVNCSVQiLCAgIDY0KTsKLQotICBwcmludGYgKCJ0ZXN0X3NwZWMgKihiaXRfdGVzdHNbXSkgPSB7XG4iKTsKLSAgcHJpbnRmICgiICAmQklUNF90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJkJJVDVfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZCSVQ4X3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAmQklUMTBfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZCSVQxNl90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJkJJVDMyX3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAmQklUNjRfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZCSVRfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZMU0JJVDhfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZMU0JJVDE2X3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAmTFNCSVQzMl90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJkxTQklUNjRfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZMU0JJVF90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJk1TQklUOF90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJk1TQklUMTZfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZNU0JJVDMyX3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAmTVNCSVQ2NF90ZXN0LFxuIik7Ci0gIHByaW50ZiAoIiAgJk1TQklUX3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAwLFxuIik7Ci0gIHByaW50ZiAoIn07XG5cbiIpOwotCi0gIGdlbl9lbnVtICgiQklUIiwgICA2NCk7Ci0gIGdlbl9lbnVtICgiTFNCSVQiLCA2NCk7Ci0gIGdlbl9lbnVtICgiTVNCSVQiLCA2NCk7Ci0gIGdlbl9lbnVtICgiQklUMzIiLCAgIDMyKTsKLSAgZ2VuX2VudW0gKCJMU0JJVDMyIiwgMzIpOwotICBnZW5fZW51bSAoIk1TQklUMzIiLCAzMik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBET19NQVNLX1RFU1RTXG4iKTsKLSAgZ2VuX21hc2sgKCA4LCBtcywgIk1BU0s4IiwgIDgpOwotICBnZW5fbWFzayAoMTYsIG1zLCAiTUFTSzE2IiwgMTYpOwotICBnZW5fbWFzayAoMzIsIG1zLCAiTUFTSzMyIiwgMzIpOwotICBnZW5fbWFzayAoNjQsIG1zLCAiTUFTSzY0IiwgNjQpOwotICBnZW5fbWFzayAoYml0c2l6ZSwgbXMsICJNQVNLIiwgNjQpOwotCi0gIHByaW50ZiAoInRlc3Rfc3BlYyAqKG1hc2tfdGVzdHNbXSkgPSB7XG4iKTsKLSAgcHJpbnRmICgiICAmTUFTSzhfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZNQVNLMTZfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZNQVNLMzJfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZNQVNLNjRfdGVzdCxcbiIpOwotICBwcmludGYgKCIgICZNQVNLX3Rlc3QsXG4iKTsKLSAgcHJpbnRmICgiICAwLFxuIik7Ci0gIHByaW50ZiAoIn07XG5cbiIpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYml0cy10c3QuYyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2JpdHMtdHN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDIxMGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYml0cy10c3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0jIDIgImJpdHMtdHN0LmMiCi0KLS8qIERyaXZlIHRoZSBiaXQgdGVzdCByb3V0aW5lcyAqLwotCi0KLWxvbmcgbG9uZwotY2FsYyAoY29uc3QgY2hhciAqY2FsbCwKLSAgICAgIGxvbmcgbG9uZyB2YWwsCi0gICAgICBpbnQgcm93LAotICAgICAgaW50IGNvbCkKLXsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1BU0siKSA9PSAwKQotICAgIHJldHVybiBNQVNLRUQgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTUFTSzgiKSA9PSAwKQotICAgIHJldHVybiBNQVNLRUQ4ICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1BU0sxNiIpID09IDApCi0gICAgcmV0dXJuIE1BU0tFRDE2ICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1BU0szMiIpID09IDApCi0gICAgcmV0dXJuIE1BU0tFRDMyICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1BU0s2NCIpID09IDApCi0gICAgcmV0dXJuIE1BU0tFRDY0ICh2YWwsIHJvdywgY29sKTsKLQotICBpZiAoc3RyY21wIChjYWxsLCAiRVhUUkFDVCIpID09IDApCi0gICAgcmV0dXJuIEVYVFJBQ1RFRCAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJFWFRSQUNUOCIpID09IDApCi0gICAgcmV0dXJuIEVYVFJBQ1RFRDggKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiRVhUUkFDVDE2IikgPT0gMCkKLSAgICByZXR1cm4gRVhUUkFDVEVEMTYgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiRVhUUkFDVDMyIikgPT0gMCkKLSAgICByZXR1cm4gRVhUUkFDVEVEMzIgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiRVhUUkFDVDY0IikgPT0gMCkKLSAgICByZXR1cm4gRVhUUkFDVEVENjQgKHZhbCwgcm93LCBjb2wpOwotCi0gIGlmIChzdHJjbXAgKGNhbGwsICJMU0VYVFJBQ1QiKSA9PSAwKQotICAgIHJldHVybiBMU0VYVFJBQ1RFRCAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJMU0VYVFJBQ1Q4IikgPT0gMCkKLSAgICByZXR1cm4gTFNFWFRSQUNURUQ4ICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTRVhUUkFDVDE2IikgPT0gMCkKLSAgICByZXR1cm4gTFNFWFRSQUNURUQxNiAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJMU0VYVFJBQ1QzMiIpID09IDApCi0gICAgcmV0dXJuIExTRVhUUkFDVEVEMzIgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNFWFRSQUNUNjQiKSA9PSAwKQotICAgIHJldHVybiBMU0VYVFJBQ1RFRDY0ICh2YWwsIHJvdywgY29sKTsKLQotICBpZiAoc3RyY21wIChjYWxsLCAiTVNFWFRSQUNUIikgPT0gMCkKLSAgICByZXR1cm4gTVNFWFRSQUNURUQgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTVNFWFRSQUNUOCIpID09IDApCi0gICAgcmV0dXJuIE1TRVhUUkFDVEVEOCAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJNU0VYVFJBQ1QxNiIpID09IDApCi0gICAgcmV0dXJuIE1TRVhUUkFDVEVEMTYgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTVNFWFRSQUNUMzIiKSA9PSAwKQotICAgIHJldHVybiBNU0VYVFJBQ1RFRDMyICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TRVhUUkFDVDY0IikgPT0gMCkKLSAgICByZXR1cm4gTVNFWFRSQUNURUQ2NCAodmFsLCByb3csIGNvbCk7Ci0KLSAgaWYgKHN0cmNtcCAoY2FsbCwgIklOU0VSVCIpID09IDApCi0gICAgcmV0dXJuIElOU0VSVEVEICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIklOU0VSVDgiKSA9PSAwKQotICAgIHJldHVybiBJTlNFUlRFRDggKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiSU5TRVJUMTYiKSA9PSAwKQotICAgIHJldHVybiBJTlNFUlRFRDE2ICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIklOU0VSVDMyIikgPT0gMCkKLSAgICByZXR1cm4gSU5TRVJURUQzMiAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJJTlNFUlQ2NCIpID09IDApCi0gICAgcmV0dXJuIElOU0VSVEVENjQgKHZhbCwgcm93LCBjb2wpOwotCi0gIGlmIChzdHJjbXAgKGNhbGwsICJMU0lOU0VSVCIpID09IDApCi0gICAgcmV0dXJuIExTSU5TRVJURUQgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNJTlNFUlQ4IikgPT0gMCkKLSAgICByZXR1cm4gTFNJTlNFUlRFRDggKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNJTlNFUlQxNiIpID09IDApCi0gICAgcmV0dXJuIExTSU5TRVJURUQxNiAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJMU0lOU0VSVDMyIikgPT0gMCkKLSAgICByZXR1cm4gTFNJTlNFUlRFRDMyICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTSU5TRVJUNjQiKSA9PSAwKQotICAgIHJldHVybiBMU0lOU0VSVEVENjQgKHZhbCwgcm93LCBjb2wpOwotCi0gIGlmIChzdHJjbXAgKGNhbGwsICJNU0lOU0VSVCIpID09IDApCi0gICAgcmV0dXJuIE1TSU5TRVJURUQgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTVNJTlNFUlQ4IikgPT0gMCkKLSAgICByZXR1cm4gTVNJTlNFUlRFRDggKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTVNJTlNFUlQxNiIpID09IDApCi0gICAgcmV0dXJuIE1TSU5TRVJURUQxNiAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJNU0lOU0VSVDMyIikgPT0gMCkKLSAgICByZXR1cm4gTVNJTlNFUlRFRDMyICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TSU5TRVJUNjQiKSA9PSAwKQotICAgIHJldHVybiBNU0lOU0VSVEVENjQgKHZhbCwgcm93LCBjb2wpOwotCi0gIGlmIChzdHJjbXAgKGNhbGwsICJNU01BU0siKSA9PSAwKQotICAgIHJldHVybiBNU01BU0tFRCAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJNU01BU0s4IikgPT0gMCkKLSAgICByZXR1cm4gTVNNQVNLRUQ4ICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TTUFTSzE2IikgPT0gMCkKLSAgICByZXR1cm4gTVNNQVNLRUQxNiAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJNU01BU0szMiIpID09IDApCi0gICAgcmV0dXJuIE1TTUFTS0VEMzIgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTVNNQVNLNjQiKSA9PSAwKQotICAgIHJldHVybiBNU01BU0tFRDY0ICh2YWwsIHJvdywgY29sKTsKLQotICBpZiAoc3RyY21wIChjYWxsLCAiTFNNQVNLIikgPT0gMCkKLSAgICByZXR1cm4gTFNNQVNLRUQgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNNQVNLOCIpID09IDApCi0gICAgcmV0dXJuIExTTUFTS0VEOCAodmFsLCByb3csIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJMU01BU0sxNiIpID09IDApCi0gICAgcmV0dXJuIExTTUFTS0VEMTYgKHZhbCwgcm93LCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNNQVNLMzIiKSA9PSAwKQotICAgIHJldHVybiBMU01BU0tFRDMyICh2YWwsIHJvdywgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTTUFTSzY0IikgPT0gMCkKLSAgICByZXR1cm4gTFNNQVNLRUQ2NCAodmFsLCByb3csIGNvbCk7Ci0KLSAgaWYgKHN0cmNtcCAoY2FsbCwgIlJPVDY0IikgPT0gMCkKLSAgICByZXR1cm4gUk9UNjQgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIlJPVDgiKSA9PSAwKQotICAgIHJldHVybiBST1Q4ICh2YWwsIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJST1QxNiIpID09IDApCi0gICAgcmV0dXJuIFJPVDE2ICh2YWwsIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJST1QzMiIpID09IDApCi0gICAgcmV0dXJuIFJPVDMyICh2YWwsIGNvbCk7Ci0KLSAgaWYgKHN0cmNtcCAoY2FsbCwgIlNFWFQiKSA9PSAwKQotICAgIHJldHVybiBTRVhUICh2YWwsIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJTRVhUOCIpID09IDApCi0gICAgcmV0dXJuIFNFWFQ4ICh2YWwsIGNvbCk7Ci0gIGlmIChzdHJjbXAgKGNhbGwsICJTRVhUMTYiKSA9PSAwKQotICAgIHJldHVybiBTRVhUMTYgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIlNFWFQzMiIpID09IDApCi0gICAgcmV0dXJuIFNFWFQzMiAodmFsLCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiU0VYVDY0IikgPT0gMCkKLSAgICByZXR1cm4gU0VYVDY0ICh2YWwsIGNvbCk7Ci0KLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTU0VYVCIpID09IDApCi0gICAgcmV0dXJuIExTU0VYVCAodmFsLCBjb2wpOwotICBpZiAoc3RyY21wIChjYWxsLCAiTFNTRVhUOCIpID09IDApCi0gICAgcmV0dXJuIExTU0VYVDggKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTU0VYVDE2IikgPT0gMCkKLSAgICByZXR1cm4gTFNTRVhUMTYgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTU0VYVDMyIikgPT0gMCkKLSAgICByZXR1cm4gTFNTRVhUMzIgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTU0VYVDY0IikgPT0gMCkKLSAgICByZXR1cm4gTFNTRVhUNjQgKHZhbCwgY29sKTsKLQotICBpZiAoc3RyY21wIChjYWxsLCAiTVNTRVhUOCIpID09IDApCi0gICAgcmV0dXJuIE1TU0VYVDggKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TU0VYVDE2IikgPT0gMCkKLSAgICByZXR1cm4gTVNTRVhUMTYgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TU0VYVDMyIikgPT0gMCkKLSAgICByZXR1cm4gTVNTRVhUMzIgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TU0VYVDY0IikgPT0gMCkKLSAgICByZXR1cm4gTVNTRVhUNjQgKHZhbCwgY29sKTsKLSAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TU0VYVCIpID09IDApCi0gICAgcmV0dXJuIE1TU0VYVCAodmFsLCBjb2wpOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJVbmtub3duIGNhbGwgcGFzc2VkIHRvIGNhbGMgKCVzLCAweCUwOGx4JTA4bHgsICVkLCAlZClcbiIsCi0JICAgICAgIGNhbGwsIChsb25nKSh2YWwgPj4gMzIpLCAobG9uZyl2YWwsIHJvdywgY29sKTsKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci19Ci0KLQotaW50Ci1jaGVja19zZXh0IChpbnQgbnJfYml0cywKLQkgICAgaW50IG1zYl9uciwKLQkgICAgY29uc3QgY2hhciAqc2V4dGVkLAotCSAgICBjb25zdCBjaGFyICptYXNrZWQsCi0JICAgIGNvbnN0IGNoYXIgKm1zbWFza2VkKQotewotICBpbnQgZXJyb3JzID0gMDsKLSAgaW50IGNvbDsKLSAgZm9yIChjb2wgPSAwOyBjb2wgPCBucl9iaXRzOyBjb2wgKyspCi0gICAgewotICAgICAgbG9uZyBsb25nIG1hc2sgPSBjYWxjIChtYXNrZWQsIC0xLCBjb2wsIGNvbCk7Ci0gICAgICBsb25nIGxvbmcgbXNtYXNrID0gY2FsYyAobXNtYXNrZWQsIC0xLAotCQkJICAgICAgIDAsIChtc2JfbnIgPyBucl9iaXRzIC0gY29sIC0gMSA6IGNvbCkpOwotICAgICAgbG9uZyBsb25nIHNleHQgPSBjYWxjIChzZXh0ZWQsIG1hc2ssIC0xLCBjb2wpOwotICAgICAgbG9uZyBsb25nIG1hc2tfMSA9IG1hc2sgPj4gMTsKLSAgICAgIGxvbmcgbG9uZyBzZXh0XzEgPSBjYWxjIChzZXh0ZWQsIG1hc2tfMSwgLTEsIGNvbCk7Ci0gICAgICBsb25nIGxvbmcgbWFza18wID0gKG1hc2sgPDwgMSkgfCBtYXNrXzE7Ci0gICAgICBsb25nIGxvbmcgc2V4dF8wID0gY2FsYyAoc2V4dGVkLCBtYXNrXzAsIC0xLCBjb2wpOwotICAgICAgaWYgKHNleHRfMCAhPSBtYXNrXzEpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiJXM6JWQ6ICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICIgJXMoMHglMDhseCUwOGx4LCVkKSA9PSAweCUwOGx4JTA4bHggd3JvbmcsICE9IDB4JTA4bHglMDhseFxuIiwKLQkJICAgc2V4dGVkLCAobG9uZykobWFza18wID4+IDMyKSwgKGxvbmcpbWFza18wLCBjb2wsCi0JCSAgIChsb25nKShzZXh0XzAgPj4gMzIpLCAobG9uZylzZXh0XzAsCi0JCSAgIChsb25nKShtYXNrXzEgPj4gMzIpLCAobG9uZyltYXNrXzEpOwotCSAgZXJyb3JzICsrOwotCX0KLSAgICAgIGlmIChzZXh0XzEgIT0gbWFza18xKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgIiVzOiVkOiAiLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiICVzKDB4JTA4bHglMDhseCwlZCkgPT0gMHglMDhseCUwOGx4IHdyb25nLCAhPSAweCUwOGx4JTA4bHhcbiIsCi0JCSAgIHNleHRlZCwgKGxvbmcpKG1hc2tfMSA+PiAzMiksIChsb25nKW1hc2tfMSwgY29sLAotCQkgICAobG9uZykoc2V4dF8xID4+IDMyKSwgKGxvbmcpc2V4dF8xLAotCQkgICAobG9uZykobWFza18xID4+IDMyKSwgKGxvbmcpbWFza18xKTsKLQkgIGVycm9ycyArKzsKLQl9Ci0gICAgICBpZiAoc2V4dCAhPSBtc21hc2spCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiJXM6JWQ6ICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICIgJXMoMHglMDhseCUwOGx4LCVkKSA9PSAweCUwOGx4JTA4bHggd3JvbmcsICE9IDB4JTA4bHglMDhseCAoJXMoJWQsJWQpKVxuIiwKLQkJICAgc2V4dGVkLCAobG9uZykobWFzayA+PiAzMiksIChsb25nKW1hc2ssIGNvbCwKLQkJICAgKGxvbmcpKHNleHQgPj4gMzIpLCAobG9uZylzZXh0LAotCQkgICAobG9uZykobXNtYXNrID4+IDMyKSwgKGxvbmcpbXNtYXNrLAotCQkgICBtc21hc2tlZCwgMCwgKG1zYl9uciA/IG5yX2JpdHMgLSBjb2wgLSAxIDogY29sKSk7Ci0JICBlcnJvcnMgKys7Ci0JfQotCi0gICAgfQotICByZXR1cm4gZXJyb3JzOwotfQotCi0KLWludAotY2hlY2tfcm90IChpbnQgbnJfYml0cywKLQkgICBjb25zdCBjaGFyICpyb3RlZCwKLQkgICBjb25zdCBjaGFyICptYXNrZWQpCi17Ci0gIGludCBlcnJvcnMgPSAwOwotICBpbnQgcm93OwotICBpbnQgY29sOwotICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5yX2JpdHM7IHJvdysrKQotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnJfYml0czsgY29sKyspCi0gICAgICBpZiAoKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDAgJiYgcm93IDw9IGNvbCkKLQkgIHx8IChXSVRIX1RBUkdFVF9XT1JEX01TQiAhPSAwICYmIHJvdyA+PSBjb2wpKQotCXsKLQkgIGxvbmcgbG9uZyBtYXNrID0gY2FsYyAobWFza2VkLCAtMSwgcm93LCBjb2wpOwotCSAgaW50IHNoaWZ0OwotCSAgZm9yIChzaGlmdCA9IC1ucl9iaXRzICsgMTsgc2hpZnQgPCBucl9iaXRzOyBzaGlmdCArKykKLQkgICAgewotCSAgICAgIGxvbmcgbG9uZyByb3QgPSBjYWxjIChyb3RlZCwgbWFzaywgLTEsIHNoaWZ0KTsKLQkgICAgICBsb25nIGxvbmcgdXJvdCA9IGNhbGMgKHJvdGVkLCByb3QsIC0xLCAtc2hpZnQpOwotCSAgICAgIGlmIChtYXNrICE9IHVyb3QKLQkJICB8fCAoc2hpZnQgPT0gMCAmJiByb3QgIT0gbWFzaykKLQkJICB8fCAoc2hpZnQgIT0gMCAmJiByb3QgPT0gbWFzayAmJiBhYnMocm93IC0gY29sKSAhPSAobnJfYml0cyAtIDEpKSkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAiLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCQkgIGZwcmludGYgKHN0ZGVyciwgIiAlcyglcygweCUwOGx4JTA4bHgsJWQpID09IDB4JTA4bHglMDhseCwgJWQpIGZhaWxlZFxuIiwKLQkJCSAgIHJvdGVkLCByb3RlZCwKLQkJCSAgIChsb25nKShtYXNrID4+IDMyKSwgKGxvbmcpbWFzaywgc2hpZnQsCi0JCQkgICAobG9uZykodXJvdCA+PiAzMiksIChsb25nKXVyb3QsIC1zaGlmdCk7Ci0JCSAgZXJyb3JzICsrOwotCQl9Ci0JICAgIH0KLQl9Ci0gIHJldHVybiBlcnJvcnM7Ci19Ci0KLQotaW50Ci1jaGVja19leHRyYWN0IChpbnQgbnJfYml0cywKLQkgICAgICAgY29uc3QgY2hhciAqZXh0cmFjdGVkLAotCSAgICAgICBjb25zdCBjaGFyICppbnNlcnRlZCwKLQkgICAgICAgY29uc3QgY2hhciAqbWFza2VkKQotewotICBpbnQgZXJyb3JzID0gMDsKLSAgaW50IHJvdzsKLSAgaW50IGNvbDsKLSAgZm9yIChyb3cgPSAwOyByb3cgPCBucl9iaXRzOyByb3crKykKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG5yX2JpdHM7IGNvbCArKykKLSAgICAgIGlmICgoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCAmJiByb3cgPD0gY29sKQotCSAgfHwgKFdJVEhfVEFSR0VUX1dPUkRfTVNCICE9IDAgJiYgcm93ID49IGNvbCkpCi0JewotCSAgbG9uZyBsb25nIG1hc2sgPSBjYWxjIChtYXNrZWQsIC0xLCByb3csIGNvbCk7Ci0JICBsb25nIGxvbmcgZXh0ciA9IGNhbGMgKGV4dHJhY3RlZCwgbWFzaywgcm93LCBjb2wpOwotCSAgbG9uZyBsb25nIGluc3QgPSBjYWxjIChpbnNlcnRlZCwgZXh0ciwgcm93LCBjb2wpOwotCSAgaWYgKG1hc2sgIT0gaW5zdCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAiLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlcyglZCwlZCk9MHglMDhseCUwOGx4IC0+ICVzPTB4JTA4bHglMDhseCAtPiAlcz0weCUwOGx4JTA4bHggZmFpbGVkXG4iLAotCQkgICAgICAgbWFza2VkLCByb3csIGNvbCwgKGxvbmcpKG1hc2sgPj4gMzIpLCAobG9uZyltYXNrLAotCQkgICAgICAgZXh0cmFjdGVkLCAobG9uZykoZXh0ciA+PiAzMiksIChsb25nKWV4dHIsCi0JCSAgICAgICBpbnNlcnRlZCwgKGxvbmcpKGluc3QgPj4gMzIpLCAobG9uZylpbnN0KTsKLQkgICAgICBlcnJvcnMgKys7Ci0JICAgIH0KLQl9Ci0gIHJldHVybiBlcnJvcnM7Ci19Ci0KLQotaW50Ci1jaGVja19iaXRzIChpbnQgY2FsbCwKLQkgICAgdGVzdF9zcGVjICoqdGVzdHMpCi17Ci0gIGludCByOwotICBpbnQgYzsKLSAgaW50IGVycm9ycyA9IDA7Ci0gIHdoaWxlICgqdGVzdHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgbnJfcm93cyA9ICgqdGVzdHMpLT5ucl9yb3dzOwotICAgICAgaW50IG5yX2NvbHMgPSAoKnRlc3RzKS0+bnJfY29sczsKLSAgICAgIHRlc3RfdHVwbGVzICp0dXBsZXMgPSAoKnRlc3RzKS0+dHVwbGVzOwotICAgICAgZm9yIChyID0gMDsgciA8IG5yX3Jvd3M7IHIrKykKLQlmb3IgKGMgPSAwOyBjIDwgbnJfY29sczsgYysrKQotCSAgewotCSAgICBpbnQgaSA9IHIgKiBucl9yb3dzICsgYzsKLQkgICAgdGVzdF90dXBsZXMgKnR1cGxlID0gJnR1cGxlc1tpXTsKLQkgICAgaWYgKHR1cGxlLT5jb2wgPj0gMCkKLQkgICAgICB7Ci0JCWxvbmcgbG9uZyB2YWwgPSAoIWNhbGwgPyB0dXBsZS0+dmFsIDogY2FsYyAoKCp0ZXN0cyktPm1hY3JvLCAtMSwKLQkJCQkJCQkgICAgdHVwbGUtPnJvdywgdHVwbGUtPmNvbCkpOwotCQlsb25nIGxvbmcgY2hlY2sgPSB0dXBsZS0+Y2hlY2s7Ci0JCWlmICh2YWwgIT0gY2hlY2spCi0JCSAgewotCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6IiwgKCp0ZXN0cyktPmZpbGUsIHR1cGxlLT5saW5lKTsKLQkJICAgIGZwcmludGYgKHN0ZGVyciwgIiAlcyIsICgqdGVzdHMpLT5tYWNybyk7Ci0JCSAgICBpZiAodHVwbGUtPnJvdyA+PSAwKQotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIgKCVkLCAlZCkiLCB0dXBsZS0+cm93LCB0dXBsZS0+Y29sKTsKLQkJICAgIGVsc2UKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICglZCkiLCB0dXBsZS0+Y29sKTsKLQkJICAgIGZwcmludGYgKHN0ZGVyciwgIiA9PSAweCUwOGx4JTA4bHggd3JvbmcsICE9IDB4JTA4bHglMDhseFxuIiwKLQkJCSAgICAgKGxvbmcpICh2YWwgPj4gMzIpLCAobG9uZykgdmFsLAotCQkJICAgICAobG9uZykgKGNoZWNrID4+IDMyKSwgKGxvbmcpIGNoZWNrKTsKLQkJICAgIGVycm9ycyArKzsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgdGVzdHMgKys7Ci0gICAgfQotICByZXR1cm4gZXJyb3JzOwotfSAgICAgCi0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBlcnJvcnMgPSAwOwotCi0KLSNpZiBkZWZpbmVkIChET19CSVRfVEVTVFMpCi0gIHByaW50ZiAoIkNoZWNraW5nIEJJVCpcbiIpOwotICBlcnJvcnMgKz0gY2hlY2tfYml0cyAoMCwgYml0X3Rlc3RzKTsKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChET19NQVNLX1RFU1RTKQotICBwcmludGYgKCJDaGVja2luZyBNQVNLKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19iaXRzICgwLCBtYXNrX3Rlc3RzKTsKLQotICBwcmludGYgKCJDaGVja2luZyBNQVNLRUQqXG4iKTsKLSAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDEsIG1hc2tfdGVzdHMpOwotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgKERPX0xTTUFTS19URVNUUykKLSAgcHJpbnRmICgiQ2hlY2tpbmcgTFNNQVNLKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19iaXRzICgwLCBsc21hc2tfdGVzdHMpOwotCi0gIHByaW50ZiAoIkNoZWNraW5nIExTTUFTS0VEKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19iaXRzICgxLCBsc21hc2tfdGVzdHMpOwotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgKERPX01TTUFTS19URVNUUykKLSAgcHJpbnRmICgiQ2hlY2tpbmcgTVNNQVNLKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19iaXRzICgwLCBtc21hc2tfdGVzdHMpOwotCi0gIHByaW50ZiAoIkNoZWNraW5nIE1TTUFTS0VEKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19iaXRzICgxLCBtc21hc2tfdGVzdHMpOwotI2VuZGlmCi0KLQotICBwcmludGYgKCJDaGVja2luZyBFWFRSQUNURUQqXG4iKTsKLSAgZXJyb3JzICs9IGNoZWNrX2V4dHJhY3QgKCA4LCAiRVhUUkFDVDgiLCAgIklOU0VSVDgiLCAgIk1BU0s4Iik7Ci0gIGVycm9ycyArPSBjaGVja19leHRyYWN0ICgxNiwgIkVYVFJBQ1QxNiIsICJJTlNFUlQxNiIsICJNQVNLMTYiKTsKLSAgZXJyb3JzICs9IGNoZWNrX2V4dHJhY3QgKDMyLCAiRVhUUkFDVDMyIiwgIklOU0VSVDMyIiwgIk1BU0szMiIpOwotICBlcnJvcnMgKz0gY2hlY2tfZXh0cmFjdCAoNjQsICJFWFRSQUNUNjQiLCAiSU5TRVJUNjQiLCAiTUFTSzY0Iik7Ci0gIGVycm9ycyArPSBjaGVja19leHRyYWN0ICg2NCwgIkVYVFJBQ1QiLCAgICJJTlNFUlQiLCAgICJNQVNLIik7Ci0KLSAgcHJpbnRmICgiQ2hlY2tpbmcgU0VYVCpcbiIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoIDgsIFdJVEhfVEFSR0VUX1dPUkRfTVNCLCAiU0VYVDgiLCAgIk1BU0s4IiwgICJNU01BU0s4Iik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICgxNiwgV0lUSF9UQVJHRVRfV09SRF9NU0IsICJTRVhUMTYiLCAiTUFTSzE2IiwgIk1TTUFTSzE2Iik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICgzMiwgV0lUSF9UQVJHRVRfV09SRF9NU0IsICJTRVhUMzIiLCAiTUFTSzMyIiwgIk1TTUFTSzMyIik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICg2NCwgV0lUSF9UQVJHRVRfV09SRF9NU0IsICJTRVhUNjQiLCAiTUFTSzY0IiwgIk1TTUFTSzY0Iik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICg2NCwgV0lUSF9UQVJHRVRfV09SRF9NU0IsICJTRVhUIiwgICAiTUFTSyIsICAgIk1TTUFTSyIpOwotICAKLSAgcHJpbnRmICgiQ2hlY2tpbmcgTFNTRVhUKlxuIik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICggOCwgIDggLSAxLCAiTFNTRVhUOCIsICAiTFNNQVNLOCIsICAiTVNNQVNLOCIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoMTYsIDE2IC0gMSwgIkxTU0VYVDE2IiwgIkxTTUFTSzE2IiwgIk1TTUFTSzE2Iik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICgzMiwgMzIgLSAxLCAiTFNTRVhUMzIiLCAiTFNNQVNLMzIiLCAiTVNNQVNLMzIiKTsKLSAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDY0LCA2NCAtIDEsICJMU1NFWFQ2NCIsICJMU01BU0s2NCIsICJNU01BU0s2NCIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoNjQsIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSAtIDEsICJMU1NFWFQiLCAgICJMU01BU0siLCAgICJNU01BU0siKTsKLSAgCi0gIHByaW50ZiAoIkNoZWNraW5nIE1TU0VYVCpcbiIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoOCwgICAwLCAiTVNTRVhUOCIsICAiTVNNQVNLOCIsICAiTVNNQVNLOCIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoMTYsICAwLCAiTVNTRVhUMTYiLCAiTVNNQVNLMTYiLCAiTVNNQVNLMTYiKTsKLSAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDMyLCAgMCwgIk1TU0VYVDMyIiwgIk1TTUFTSzMyIiwgIk1TTUFTSzMyIik7Ci0gIGVycm9ycyArPSBjaGVja19zZXh0ICg2NCwgIDAsICJNU1NFWFQ2NCIsICJNU01BU0s2NCIsICJNU01BU0s2NCIpOwotICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoNjQsICAwLCAiTVNTRVhUIiwgICAiTVNNQVNLIiwgICAiTVNNQVNLIik7Ci0gIAotICBwcmludGYgKCJDaGVja2luZyBST1QqXG4iKTsKLSAgZXJyb3JzICs9IGNoZWNrX3JvdCAoMTYsICJST1QxNiIsICJNQVNLMTYiKTsKLSAgZXJyb3JzICs9IGNoZWNrX3JvdCAoMzIsICJST1QzMiIsICJNQVNLMzIiKTsKLSAgZXJyb3JzICs9IGNoZWNrX3JvdCAoNjQsICJST1Q2NCIsICJNQVNLNjQiKTsKLQotICByZXR1cm4gZXJyb3JzICE9IDA7Ci19CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9mcHUtdHN0LmMgYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9mcHUtdHN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDdlMTIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vZnB1LXRzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLSNkZWZpbmUgQVNTRVJUKEVYUFJFU1NJT04pIFwKLWRvIHsgXAotICBpZiAoIShFWFBSRVNTSU9OKSkgeyBcCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6IGFzc2VydGlvbiBmYWlsZWQgLSAlc1xuIiwgXAotICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0VYUFJFU1NJT04pOyBcCi0gICAgYWJvcnQgKCk7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJTV9CSVRTX0lOTElORSAoSU5DTFVERV9NT0RVTEUgfCBJTkNMVURFRF9CWV9NT0RVTEUpCi0KLSNpbmNsdWRlICJtaWxpZXUuaCIKLSNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKLSNpbmNsdWRlICJzeXN0ZmxvYXQuaCIKLSNpbmNsdWRlICJzeXN0bW9kZXMuaCIKLQotLyogI2RlZmluZSBTSU1fRlBVX0lOTElORSAoSU5DTFVERV9NT0RVTEUgfCBJTkNMVURFRF9CWV9NT0RVTEUpICovCi0KLQotI2luY2x1ZGUgInNpbS1iaXRzLmgiCi0jaW5jbHVkZSAic2ltLWZwdS5oIgotI2luY2x1ZGUgInNpbS1mcHUuYyIKLQotCi0KLXN0YXRpYyBpbnQgZmxhZ3M7Ci0KLWludDgKLXN5c3RfZmxvYXRfZmxhZ3NfY2xlYXIgKCkKLXsKLSAgaW50IG9sZF9mbGFncyA9IDA7Ci0gIGludCBpID0gMTsKLSAgd2hpbGUgKGZsYWdzID49IGkpCi0gICAgewotICAgICAgc3dpdGNoICgoc2ltX2ZwdV9zdGF0dXMpIChmbGFncyAmIGkpKQotCXsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2Rlbm9ybToKLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOgotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOgotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pc2k6Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lkaToKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfemR6OgotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pbXo6Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2N2aToKLQljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY21wOgotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zcXJ0OgotCSAgb2xkX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW52YWxpZDsgLyogdiAqLwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OgotCSAgb2xkX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsgLyogeCAqLwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19vdmVyZmxvdzoKLQkgIG9sZF9mbGFncyB8PSBmbG9hdF9mbGFnX292ZXJmbG93OyAvKiBvICovCi0JICBicmVhazsKLQljYXNlIHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdzoKLQkgIG9sZF9mbGFncyB8PSBmbG9hdF9mbGFnX3VuZGVyZmxvdzsgLyogdSAqLwotCSAgYnJlYWs7Ci0JY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2RpdjA6Ci0JICBvbGRfZmxhZ3MgfD0gZmxvYXRfZmxhZ19kaXZieXplcm87IC8qIHogKi8KLQkgIGJyZWFrOwotCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfcm91bmRlZDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGkgPDw9IDE7Ci0gICAgfQotICBmbGFncyA9IDA7Ci0gIHJldHVybiBvbGRfZmxhZ3M7Ci19Ci0KLQotc2ltX2ZwdV9yb3VuZCByb3VuZGluZ19tb2RlOwotCi12b2lkCi1zeXN0X2Zsb2F0X3NldF9yb3VuZGluZ19tb2RlKGludDggbW9kZSkKLXsKLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbjoKLSAgICAgIHJvdW5kaW5nX21vZGUgPSBzaW1fZnB1X3JvdW5kX25lYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZsb2F0X3JvdW5kX2Rvd246Ci0gICAgICByb3VuZGluZ19tb2RlID0gc2ltX2ZwdV9yb3VuZF9kb3duOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmbG9hdF9yb3VuZF91cDoKLSAgICAgIHJvdW5kaW5nX21vZGUgPSBzaW1fZnB1X3JvdW5kX3VwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmbG9hdF9yb3VuZF90b196ZXJvOgotICAgICAgcm91bmRpbmdfbW9kZSA9IHNpbV9mcHVfcm91bmRfemVybzsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1mbG9hdDMyCi1zeXN0X2ludDMyX3RvX2Zsb2F0MzIoaW50MzIgYSkKLXsKLSAgZmxvYXQzMiB6OwotICBzaW1fZnB1IHM7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfaTMydG8gKCZzLCBhLCByb3VuZGluZ19tb2RlKTsKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF8zMiAoJnMsIHJvdW5kaW5nX21vZGUsIDApOwotICBzaW1fZnB1X3RvMzIgKCZ6LCAmcyk7Ci0gIHJldHVybiB6OwotfQotCi1mbG9hdDY0Ci1zeXN0X2ludDMyX3RvX2Zsb2F0NjQoIGludDMyIGEgKQotewotICBmbG9hdDY0IHo7Ci0gIHNpbV9mcHUgczsKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9pMzJ0byAoJnMsIGEsIHJvdW5kaW5nX21vZGUpOwotICBzaW1fZnB1X3RvNjQgKCZ6LCAmcyk7Ci0gIHJldHVybiB6OwotfQotCi1pbnQzMgotc3lzdF9mbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0MzIgYSApCi17Ci0gIGludDMyIHo7Ci0gIHNpbV9mcHUgczsKLSAgc2ltX2ZwdV8zMnRvICgmcywgYSk7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfdG8zMmkgKCZ6LCAmcywgc2ltX2ZwdV9yb3VuZF96ZXJvKTsKLSAgcmV0dXJuIHo7Ci19Ci0KLWZsb2F0NjQKLXN5c3RfZmxvYXQzMl90b19mbG9hdDY0IChmbG9hdDMyIGEpCi17Ci0gIGZsb2F0NjQgejsKLSAgc2ltX2ZwdSBzOwotICBzaW1fZnB1XzMydG8gKCZzLCBhKTsKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJnMsIHJvdW5kaW5nX21vZGUsIDApOwotICBzaW1fZnB1X3RvNjQgKCZ6LCAmcyk7Ci0gIHJldHVybiB6OwotfQotCi1mbG9hdDMyIHN5c3RfZmxvYXQzMl9hZGQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKLXsKLSAgZmxvYXQzMiB6OwotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHNpbV9mcHVfMzJ0byAoJkEsIGEpOwotICBzaW1fZnB1XzMydG8gKCZCLCBiKTsKLSNpZiAwCi0gIGZwcmludGYgKHN0ZG91dCwgIlxuICAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiXG4rICIpOwotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkIsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbj0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9hZGQgKCZhbnMsICZBLCAmQik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOwotI2lmIDAKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG8zMiAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQzMiBzeXN0X2Zsb2F0MzJfc3ViKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCi17Ci0gIGZsb2F0MzIgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKyAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9zdWIgKCZhbnMsICZBLCAmQik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOwotI2lmIDAKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG8zMiAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQzMiBzeXN0X2Zsb2F0MzJfbXVsKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCi17Ci0gIGZsb2F0MzIgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKyAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9tdWwgKCZhbnMsICZBLCAmQik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF8zMiAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X3N0YXR1cyAoZmxhZ3MsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG8zMiAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQzMiBzeXN0X2Zsb2F0MzJfZGl2KCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCi17Ci0gIGZsb2F0MzIgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfZGl2ICgmYW5zLCAmQSwgJkIpOwotICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzMyICgmYW5zLCByb3VuZGluZ19tb2RlLCAwKTsKLSAgc2ltX2ZwdV90bzMyICgmeiwgJmFucyk7Ci0gIHJldHVybiB6OwotfQotCi1mbG9hdDMyIHN5c3RfZmxvYXQzMl9zcXJ0KCBmbG9hdDMyIGEgKQotewotICBmbG9hdDMyIHo7Ci0gIHNpbV9mcHUgQTsKLSAgc2ltX2ZwdSBhbnM7Ci0gIHNpbV9mcHVfMzJ0byAoJkEsIGEpOwotI2lmIDAKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiIHNxcnQ+ICIpOwotI2VuZGlmCi0gIGZsYWdzIHw9IHNpbV9mcHVfc3FydCAoJmFucywgJkEpOwotI2lmIDAKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotI2VuZGlmCi0gIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOwotI2lmIDAKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICgleClcbiIsIGZsYWdzKTsKLSNlbmRpZgotICBzaW1fZnB1X3RvMzIgKCZ6LCAmYW5zKTsKLSAgcmV0dXJuIHo7Ci19Ci0KLWZsYWcgc3lzdF9mbG9hdDMyX2VxKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCi17Ci0gIHNpbV9mcHUgQTsKLSAgc2ltX2ZwdSBCOwotICBpbnQgaXM7Ci0gIHNpbV9mcHVfMzJ0byAoJkEsIGEpOwotICBzaW1fZnB1XzMydG8gKCZCLCBiKTsKLSAgZmxhZ3MgfD0gKHNpbV9mcHVfZXEgKCZpcywgJkEsICZCKSAmIH5zaW1fZnB1X3N0YXR1c19pbnZhbGlkX3FuYW4pOwotICByZXR1cm4gaXM7Ci19Ci0KLWZsYWcgc3lzdF9mbG9hdDMyX2VxX3NpZ25hbGluZyggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfZXEgKCZpcywgJkEsICZCKTsKLSAgcmV0dXJuIGlzOwotfQotCi1mbGFnIHN5c3RfZmxvYXQzMl9sZSggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfbGUgKCZpcywgJkEsICZCKTsKLSAgcmV0dXJuIGlzOwotfQotCi1mbGFnIHN5c3RfZmxvYXQzMl9sZV9xdWlldCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IChzaW1fZnB1X2xlICgmaXMsICZBLCAmQikgJiB+c2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuKTsKLSAgcmV0dXJuIGlzOwotfQotCi1mbGFnIHN5c3RfZmxvYXQzMl9sdCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IHNpbV9mcHVfbHQgKCZpcywgJkEsICZCKTsKLSAgcmV0dXJuIGlzOwotfQotCi1mbGFnIHN5c3RfZmxvYXQzMl9sdF9xdWlldCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV8zMnRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IChzaW1fZnB1X2x0ICgmaXMsICZBLCAmQikgJiB+c2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuKTsKLSAgcmV0dXJuIGlzOwotfQotCi1pbnQzMiBzeXN0X2Zsb2F0NjRfdG9faW50MzJfcm91bmRfdG9femVybyggZmxvYXQ2NCBhICkKLXsKLSAgaW50MzIgejsKLSAgc2ltX2ZwdSBzOwotICBzaW1fZnB1XzY0dG8gKCZzLCBhKTsKLSAgZmxhZ3MgfD0gc2ltX2ZwdV90bzMyaSAoJnosICZzLCBzaW1fZnB1X3JvdW5kX3plcm8pOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQzMiBzeXN0X2Zsb2F0NjRfdG9fZmxvYXQzMiggZmxvYXQ2NCBhICkKLXsKLSAgZmxvYXQzMiB6OwotICBzaW1fZnB1IHM7Ci0gIHNpbV9mcHVfNjR0byAoJnMsIGEpOwotI2lmIDAKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZzLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiIC0+ICIpOwotI2VuZGlmCi0gIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZzLCByb3VuZGluZ19tb2RlLCAwKTsKLSNpZiAwCi0gIHNpbV9mcHVfcHJpbnRfZnB1ICgmcywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0gIHNpbV9mcHVfcHJpbnRfc3RhdHVzIChmbGFncywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0jZW5kaWYKLSAgc2ltX2ZwdV90bzMyICgmeiwgJnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQ2NCBzeXN0X2Zsb2F0NjRfYWRkKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCi17Ci0gIGZsb2F0NjQgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV82NHRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKyAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9hZGQgKCZhbnMsICZBLCAmQik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7Ci0jaWYgMAotICBmcHJpbnRmIChzdGRvdXQsICIgKCV4KVxuIiwgZmxhZ3MpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG82NCAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQ2NCBzeXN0X2Zsb2F0NjRfc3ViKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCi17Ci0gIGZsb2F0NjQgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV82NHRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKyAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9zdWIgKCZhbnMsICZBLCAmQik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7Ci0jaWYgMAotICBmcHJpbnRmIChzdGRvdXQsICIgKCV4KVxuIiwgZmxhZ3MpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG82NCAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQ2NCBzeXN0X2Zsb2F0NjRfbXVsKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCi17Ci0gIGZsb2F0NjQgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV82NHRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKiAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9tdWwgKCZhbnMsICZBLCAmQik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X3N0YXR1cyAoZmxhZ3MsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG82NCAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQ2NCBzeXN0X2Zsb2F0NjRfZGl2KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCi17Ci0gIGZsb2F0NjQgejsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV82NHRvICgmQiwgYik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICIgKyAiKTsKLSAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiID0gIik7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9kaXYgKCZhbnMsICZBLCAmQik7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0jZW5kaWYKLSAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7Ci0jaWYgMAotICBzaW1fZnB1X3ByaW50X3N0YXR1cyAoZmxhZ3MsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotI2VuZGlmCi0gIHNpbV9mcHVfdG82NCAoJnosICZhbnMpOwotICByZXR1cm4gejsKLX0KLQotZmxvYXQ2NCBzeXN0X2Zsb2F0NjRfc3FydCggZmxvYXQ2NCBhICkKLXsKLSAgZmxvYXQ2NCB6OwotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgYW5zOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSNpZiAwCi0gIHNpbV9mcHVfcHJpbnRfZnB1ICgmQSwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0gIHByaW50ZiAoIiBzcXJ0PiAiKTsKLSAgcHJpbnRmICgiXG4iKTsKLSNlbmRpZgotICBmbGFncyB8PSBzaW1fZnB1X3NxcnQgKCZhbnMsICZBKTsKLSNpZiAwCi0gIHNpbV9mcHVfcHJpbnRfZnB1ICgmYW5zLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKLSNlbmRpZgotICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzY0ICgmYW5zLCByb3VuZGluZ19tb2RlLCAwKTsKLSNpZiAwCi0gIHNpbV9mcHVfcHJpbnRfc3RhdHVzIChmbGFncywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0jZW5kaWYKLSAgc2ltX2ZwdV90bzY0ICgmeiwgJmFucyk7Ci0gIHJldHVybiB6OwotfQotCi1mbGFnIHN5c3RfZmxvYXQ2NF9lcSggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQotewotICBzaW1fZnB1IEE7Ci0gIHNpbV9mcHUgQjsKLSAgaW50IGlzOwotICBzaW1fZnB1XzY0dG8gKCZBLCBhKTsKLSAgc2ltX2ZwdV82NHRvICgmQiwgYik7Ci0gIGZsYWdzIHw9IChzaW1fZnB1X2VxICgmaXMsICZBLCAmQikgJiB+c2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuKTsKLSAgcmV0dXJuIGlzOwotfQotCi1mbGFnIHN5c3RfZmxvYXQ2NF9lcV9zaWduYWxpbmcoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKLXsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIGludCBpczsKLSAgc2ltX2ZwdV82NHRvICgmQSwgYSk7Ci0gIHNpbV9mcHVfNjR0byAoJkIsIGIpOwotICBmbGFncyB8PSBzaW1fZnB1X2VxICgmaXMsICZBLCAmQik7Ci0gIHJldHVybiBpczsKLX0KLQotZmxhZyBzeXN0X2Zsb2F0NjRfbGUoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKLXsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIGludCBpczsKLSAgc2ltX2ZwdV82NHRvICgmQSwgYSk7Ci0gIHNpbV9mcHVfNjR0byAoJkIsIGIpOwotICBmbGFncyB8PSBzaW1fZnB1X2xlICgmaXMsICZBLCAmQik7Ci0gIHJldHVybiBpczsKLX0KLQotZmxhZyBzeXN0X2Zsb2F0NjRfbGVfcXVpZXQoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKLXsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIGludCBpczsKLSAgc2ltX2ZwdV82NHRvICgmQSwgYSk7Ci0gIHNpbV9mcHVfNjR0byAoJkIsIGIpOwotICBmbGFncyB8PSAoc2ltX2ZwdV9sZSAoJmlzLCAmQSwgJkIpICYgfnNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbik7Ci0gIHJldHVybiBpczsKLX0KLQotZmxhZyBzeXN0X2Zsb2F0NjRfbHQoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKLXsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIGludCBpczsKLSAgc2ltX2ZwdV82NHRvICgmQSwgYSk7Ci0gIHNpbV9mcHVfNjR0byAoJkIsIGIpOwotICBmbGFncyB8PSBzaW1fZnB1X2x0ICgmaXMsICZBLCAmQik7Ci0gIHJldHVybiBpczsKLX0KLQotZmxhZyBzeXN0X2Zsb2F0NjRfbHRfcXVpZXQoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKLXsKLSAgc2ltX2ZwdSBBOwotICBzaW1fZnB1IEI7Ci0gIGludCBpczsKLSAgc2ltX2ZwdV82NHRvICgmQSwgYSk7Ci0gIHNpbV9mcHVfNjR0byAoJkIsIGIpOwotICBmbGFncyB8PSAoc2ltX2ZwdV9sdCAoJmlzLCAmQSwgJkIpICYgfnNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbik7Ci0gIHJldHVybiBpczsKLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9zaW0vdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyNTVhMy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgU2ltdWxhdG9yIGRlZmF1bHQgZGVqYWdudSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLWxvYWRfbGliIHNpbS1kZWZzLmV4cAotCi1nbG9iYWwgQVMKLWlmICFbaW5mbyBleGlzdHMgQVNdIHsKLSAgICBzZXQgQVMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi8uLi9nYXMvYXMtbmV3IFwKLQkJICAgICBbdHJhbnNmb3JtIGFzXV0KLX0KLQotZ2xvYmFsIEFTRkxBR1MKLWlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10gewotICAgIHNldCBBU0ZMQUdTICIiCi19Ci0KLSMgQ29tcGlsYXRpb24gaXMgYWNoaWV2ZWQgd2l0aCBzaW1fY29tcGlsZSAuLi4gc28gd2UgZG9uJ3QgY2hlY2sgJENDIGhlcmUuCi0KLWdsb2JhbCBDRkxBR1MKLWlmICFbaW5mbyBleGlzdHMgQ0ZMQUdTXSB7Ci0gICAgc2V0IENGTEFHUyAiIgotfQotCi1nbG9iYWwgTEQKLWlmICFbaW5mbyBleGlzdHMgTERdIHsKLSAgICBzZXQgTEQgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9sZC9sZC1uZXcgJGJhc2VfZGlyLy4uLy4uL2xkL2xkLW5ldyBcCi0JCSAgICAgW3RyYW5zZm9ybSBsZF1dCi19Ci0KLWdsb2JhbCBMREZMQUdTCi1pZiAhW2luZm8gZXhpc3RzIExERkxBR1NdIHsKLSAgICBzZXQgTERGTEFHUyAiIgotfQotCi0jIFRoZSBwYXRoIHRvIHRoZSBzaW11bGF0b3IgaXMgb2J0YWluZWQgd2l0aCBbYm9hcmRfaW5mbyBob3N0IHNpbV0sCi0jIHNvIHdlIGRvbid0IGNoZWNrICRTSU0gaGVyZS4KLQotZ2xvYmFsIFNJTUZMQUdTCi1pZiAhW2luZm8gZXhpc3RzIFNJTUZMQUdTXSB7Ci0gICAgc2V0IFNJTUZMQUdTICIiCi19Ci0KLXNpbV9pbml0CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbmZpZ3VyZSBiL3NpbS90ZXN0c3VpdGUvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjk1MTc3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1jb21tb24vYml0cy10c3QuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotQ0M9JHtDQy1jY30KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODY6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjU6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRGlyZWN0b3JpZXMgdG8gdXNlIGluIGFsbCBjb25maWd1cmF0aW9ucy4KLWNvbmZpZ2RpcnM9IiIKLQotIyBhZGQgdGVzdCBzdWItZGlyZWN0b3J5IGZvciBhcHByb3ByaWF0ZSB0YXJnZXRzCi10ZXN0ZGlyPWBlY2hvICR7dGFyZ2V0fSB8IHNlZCAtZSAncy8tLiotLy0vJ2AKLWlmIHRlc3QgLXIgJHtzcmNkaXJ9LyR7dGVzdGRpcn0vY29uZmlndXJlIDsgdGhlbgotICBjb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR0ZXN0ZGlyIgotZmkKLQotIyBhZGQgYW55IGV4dHJhIHN1YmRpcmVjdG9yaWVzCi1jYXNlICR0YXJnZXQgaW4KLSAgKikgOzsKLWVzYWMKLQotIyBDb21wdXRlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgotIyBGSVhNRTogV2lsbCBuZWVkIHRvIGNhbm9uaWNhbGl6ZSBzb21lIHZhbHVlcy4KLSMgRklYTUU6IFNob3VsZCBiZSBpbiBnZW5lcmFsbHkgYWNjZXNzYWJsZSBwbGFjZS4KLWNhc2UgJHRhcmdldCBpbgotICAqKSBhcmNoPSR7dGFyZ2V0X2NwdX0gOzsKLWVzYWMKLQotCi0jIGNvbmZpZ3VyZSB0aGUgc3ViZGlyZWN0b3JpZXMgdG9vCi1zdWJkaXJzPSIkY29uZmlnZGlycyIKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCi0jIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgotIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgotY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZwotcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKLXMlXFslXFwmJWcKLXMlXF0lXFwmJWcKLXMlXCQlJCQlZwotRU9GCi1ERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKLXJtIC1mIGNvbmZ0ZXN0LmRlZnMKLQotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQENDQCUkQ0MlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAYXJjaEAlJGFyY2glZwotcyVAc3ViZGlyc0AlJHN1YmRpcnMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLWlmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgotCi0gICMgUmVtb3ZlIC0tY2FjaGUtZmlsZSBhbmQgLS1zcmNkaXIgYXJndW1lbnRzIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0gIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KLSAgYWNfcHJldj0KLSAgZm9yIGFjX2FyZyBpbiAkYWNfY29uZmlndXJlX2FyZ3M7IGRvCi0gICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgICBhY19wcmV2PQotICAgICAgY29udGludWUKLSAgICBmaQotICAgIGNhc2UgIiRhY19hcmciIGluCi0gICAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICAgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gICAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gICAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICAgIDs7Ci0gICAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICAgIDs7Ci0gICAgKikgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSIkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgZm9yIGFjX2NvbmZpZ19kaXIgaW4gJGNvbmZpZ2RpcnM7IGRvCi0KLSAgICAjIERvIG5vdCBjb21wbGFpbiwgc28gYSBjb25maWd1cmUgc2NyaXB0IGNhbiBjb25maWd1cmUgd2hpY2hldmVyCi0gICAgIyBwYXJ0cyBvZiBhIGxhcmdlIHNvdXJjZSB0cmVlIGFyZSBwcmVzZW50LgotICAgIGlmIHRlc3QgISAtZCAkc3JjZGlyLyRhY19jb25maWdfZGlyOyB0aGVuCi0gICAgICBjb250aW51ZQotICAgIGZpCi0KLSAgICBlY2hvIGNvbmZpZ3VyaW5nIGluICRhY19jb25maWdfZGlyCi0KLSAgICBjYXNlICIkc3JjZGlyIiBpbgotICAgIC4pIDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLWQgLi8kYWNfY29uZmlnX2RpciB8fCBta2RpciAuLyRhY19jb25maWdfZGlyOyB0aGVuIDo7Ci0gICAgICBlbHNlCi0gICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBjcmVhdGUgYHB3ZGAvJGFjX2NvbmZpZ19kaXIiIDE+JjI7IGV4aXQgMTsgfQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgYWNfcG9wZGlyPWBwd2RgCi0gICAgY2QgJGFjX2NvbmZpZ19kaXIKLQotICAgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAvJGFjX2NvbmZpZ19kaXIuCi0gICAgICBhY19kb3RzPWBlY2hvICRhY19jb25maWdfZGlyfHNlZCAtZSAncyVeXC4vJSUnIC1lICdzJVteL10kJSYvJScgLWUgJ3MlW14vXSovJS4uLyVnJ2AKLQotICAgIGNhc2UgIiRzcmNkaXIiIGluCi0gICAgLikgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIgOzsKLSAgICAvKikgIyBBYnNvbHV0ZSBwYXRoLgotICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyLyRhY19jb25maWdfZGlyIDs7Ci0gICAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgICAgYWNfc3ViX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIvJGFjX2NvbmZpZ19kaXIgOzsKLSAgICBlc2FjCi0KLSAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgotICAgIGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlOyB0aGVuCi0gICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZQotICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KLSAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2NvbmZpZ3VyZQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfY29uZmlnX2RpciIgMT4mMgotICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KLSAgICBmaQotCi0gICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCi0gICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgTWFrZSB0aGUgY2FjaGUgZmlsZSBuYW1lIGNvcnJlY3QgcmVsYXRpdmUgdG8gdGhlIHN1YmRpcmVjdG9yeS4KLSAgICAgIGNhc2UgIiRjYWNoZV9maWxlIiBpbgotICAgICAgLyopIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7Ci0gICAgICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgICAgIGFjX3N1Yl9jYWNoZV9maWxlPSIkYWNfZG90cyRjYWNoZV9maWxlIiA7OwotICAgICAgZXNhYwotCi0gICAgICBlY2hvICJydW5uaW5nICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpciIKLSAgICAgICMgVGhlIGV2YWwgbWFrZXMgcXVvdGluZyBhcmd1bWVudHMgd29yay4KLSAgICAgIGlmIGV2YWwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zdWJfc3JjZGlyCi0gICAgICB0aGVuIDoKLSAgICAgIGVsc2UKLSAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfc3ViX2NvbmZpZ3VyZSBmYWlsZWQgZm9yICRhY19jb25maWdfZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNkICRhY19wb3BkaXIKLSAgZG9uZQotZmkKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb25maWd1cmUuaW4gYi9zaW0vdGVzdHN1aXRlL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlYmI3YS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi1kbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCi1kbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjawotZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19QUkVSRVEoMi41KQotQUNfSU5JVChjb21tb24vYml0cy10c3QuYykKLQotQ0M9JHtDQy1jY30KLUFDX1NVQlNUKENDKQotQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLikKLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotIyBEaXJlY3RvcmllcyB0byB1c2UgaW4gYWxsIGNvbmZpZ3VyYXRpb25zLgotY29uZmlnZGlycz0iIgotCi0jIGFkZCB0ZXN0IHN1Yi1kaXJlY3RvcnkgZm9yIGFwcHJvcHJpYXRlIHRhcmdldHMKLXRlc3RkaXI9YGVjaG8gJHt0YXJnZXR9IHwgc2VkIC1lICdzLy0uKi0vLS8nYAotaWYgdGVzdCAtciAke3NyY2Rpcn0vJHt0ZXN0ZGlyfS9jb25maWd1cmUgOyB0aGVuCi0gIGNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gJHRlc3RkaXIiCi1maQotCi0jIGFkZCBhbnkgZXh0cmEgc3ViZGlyZWN0b3JpZXMKLWNhc2UgJHRhcmdldCBpbgotICAqKSA7OwotZXNhYwotCi0jIENvbXB1dGUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCi0jIEZJWE1FOiBXaWxsIG5lZWQgdG8gY2Fub25pY2FsaXplIHNvbWUgdmFsdWVzLgotIyBGSVhNRTogU2hvdWxkIGJlIGluIGdlbmVyYWxseSBhY2Nlc3NhYmxlIHBsYWNlLgotY2FzZSAkdGFyZ2V0IGluCi0gICopIGFyY2g9JHt0YXJnZXRfY3B1fSA7OwotZXNhYwotQUNfU1VCU1QoYXJjaCkKLQotIyBjb25maWd1cmUgdGhlIHN1YmRpcmVjdG9yaWVzIHRvbwotQUNfQ09ORklHX1NVQkRJUlMoJGNvbmZpZ2RpcnMpCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvQ2hhbmdlTG9nIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDQzMTkuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotVHVlIEFwciAxOCAxNjozMjowNyAyMDAwICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtcmllLXh4LnMgKHRlc3RfcmllX3h4KTogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5pbiAoVEVTVFMpOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMjIgMTc6MzY6MzQgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRm9yY2UgZDEwdiBpbnRvIG9wZXJhdGluZyBtb2RlLgotCi1Nb24gSmFuICAzIDAwOjE3OjI4IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1hZS1sZC1kLnMsIHQtYWUtbGQtaS5zLCB0LWFlLWxkLWlkLnMsIHQtYWUtbGQtaW0ucyAsCi0gCXQtYWUtbGQtaXAucywgdC1hZS1sZDJ3LWQucywgdC1hZS1sZDJ3LWkucywgdC1hZS1sZDJ3LWlkLnMgLAotIAl0LWFlLWxkMnctaW0ucywgdC1hZS1sZDJ3LWlwLnMsIHQtYWUtc3QtZC5zLCB0LWFlLXN0LWkucyAsCi0gCXQtYWUtc3QtaWQucywgdC1hZS1zdC1pbS5zLCB0LWFlLXN0LWlwLnMsIHQtYWUtc3QtaXMucyAsCi0gCXQtYWUtc3Qydy1kLnMsIHQtYWUtc3Qydy1pLnMsIHQtYWUtc3Qydy1pZC5zLCB0LWFlLXN0MnctaW0ucyAsCi0gCXQtYWUtc3Qydy1pcC5zLCB0LWFlLXN0MnctaXMuczogTmV3IHRlc3RzLiAgQ2hlY2sgdGhhdCBhbiBhZGRyZXNzCi0gCWV4Y2VwdGlvbiBvY2N1cmVzIHdoZW4gYSB3b3JkL3R3by13b3JkIGxvYWQvc3RvcmUgaXMgbm90IHdvcmQKLSAJYWxpZ25lZC4KLQkqIE1ha2VmaWxlLmluIChURVNUUyk6IFVwZGF0ZS4KLQotRnJpIE9jdCAyOSAxODozNjozNCAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtbXZ0Yy5zOiBDaGVjayB0aGF0IHRoZSB1c2VyIGNhbiBub3QgbW9kaWZ5IHRoZSBETSBiaXQgaW4gdGhlCi0gCUJQU1cgb3IgRFBTVy4KLQotVGh1IE9jdCAyOCAwMTo0NzoyNiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtbXZ0Yy5zOiBVcGRhdGUuIENoZWNrIHRoYXQgdXNlciBjYW4gbm90IG1vZGlmeSBETSBiaXQuCi0KLVdlZCBTZXAgIDggMTk6MzQ6NTUgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogdC1sZC1zdC5zOiBOZXcgZmlsZS4KLQkqIHQtc2FjLnM6IE5ldyBmaWxlLgotCSogdC1zYWNoaS5zOiBOZXcgZmlsZS4KLQkqIHQtc2xhZS5zOiBOZXcgZmlsZS4KLQotMTk5OS0wMS0xMyAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiB0LXNhZGQuczogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoVEVTVFMpOiBBZGQgdC1zYWRkLgotCi1Nb24gRmViIDE2IDA5OjIwOjU3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1tYWNyb3MuaSAoVkVDXyopOiBEZWZpbmUuCi0JKERNQVBfUkVHLCBETUFQX0JBU0UsIERNQVBfTUFTSyk6IERlZmluZS4KLQkoSU1BUFswMV1fUkVHKTogRGVmaW5lLgotCi0JKiB0LXJkdC5zICh0ZXN0X3RkdCk6IE5ldyBmaWxlLgotCi0JKiB0LWRidC5zICh0ZXN0X2RidCk6IE5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbiAoVEVTVFMpOiBBZGQgdC1yZHQgYW5kIHQtZGJ0LgotCQotCi1GcmkgRmViIDEzIDE2OjIxOjEzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1zcC5zOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmluIChURVNUUyk6IFVwZGF0ZS4KLQotV2VkIEZlYiAxMSAxNzo1ODo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtbWFjcm9zLmk6IFVwZGF0ZSB0cmFwIGNhbGxzLCBmdW5jIGluIHI0LCBhcmdzIGluCi0gCXIwLi4uCi0JKHN0YXJ0KTogRm9yY2UgcjAgdG8gemVyby4KLQotCSogdC1zdWIydy5zOiBEaXR0by4KLQotVHVlIERlYyAgOSAxMDo0MTo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtcnRlLnMgKHN1Y2Nlc3MpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUuCi0KLQkqIHQtcmVwLnM6IENoZWNrIHJlcCByZXBlYXRzIGNvcnJlY3QgbnVtYmVyIG9mIHRpbWVzLgotCi1GcmkgRGVjICA1IDEwOjExOjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1tdnRjLnM6IENoZWNrIGZvciBzdHVjay16ZXJvIGluIE1PRF9FLCBNT0RfUy4KLQotCSogdC10cmFwLnM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogVXBkYXRlLgotCi1UaHUgRGVjICA0IDE2OjU2OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1tYWNyb3MuaTogQWRkIGRlZmluaXRpb25zIGZvciBQU1cgYml0cy4KLQotCSogdC1tdnRjLnM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogVXBkYXRlLgotCi1XZWQgRGVjICAzIDE2OjM1OjI0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1yYWMuczogTmV3IGZpbGVzLgotCQotCSogdC1tYWNyb3MuaTogQWRkIG1hY3JvcyBmb3IgY2hlY2tpbmcgcHN3IGFuZCAydyBxdWFudGl0aWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoVEVTVFMpOiBVcGRhdGUuCi0KLVR1ZSBEZWMgIDIgMTE6MDE6MzYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB0LXN1YjJ3LnMsIHQtbXVseHUucywgdC1tYWMucywgdC1tdnRhYy5zLCB0LW1zYnUucywgdC1zdWIuczogTmV3Ci0gCWZpbGVzLgotICAJCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlLgotCi1Nb24gTm92IDE3IDIwOjE0OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdC1zdWJpLnMgKHRlc3Rfc3ViaSk6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZS4KLQotRnJpIE5vdiAxNCAxNDowNjowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHQtcmVwLnM6IE5ldyBmaWxlLiBUZXN0IGNhc2Ugb2YgYnJhbmNoIHRvIFJQVF9FIGFkZHJlc3MuCi0KLU1vbiBOb3YgMTAgMTk6MjE6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB0LW1hY3Jvcy5pIChfc3RhcnQpOiBOZXcgZmlsZS4KLQkqIHQtcmFjaGkuczogTmV3IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChSVU5fRk9SX1RBUkdFVCk6IExvb2sgZm9yIHNpbXVsYXRvciBpbiBkMTB2Ci0gCWRpcmVjdG9yeS4KLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9NYWtlZmlsZS5pbiBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjZlZTguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgdGhlIEdOVSBkZWJ1Z2dlci4KLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXNyY3Jvb3QgPSAkKHNyY2RpcikvLi4KLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAotaG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKLXRhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAotdGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAotCi0KLVNIRUxMID0gL2Jpbi9zaAotU1VCRElSUyA9IEBzdWJkaXJzQAotUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKLQotVEVTVFMgPSBcCi0JZXhpdDQ3LmtvIFwKLQloZWxsby5oaSBcCi0JdC1kYnQub2sgXAotCXQtbGQtc3Qub2sgXAotCXQtbWFjLm9rIFwKLQl0LW12dGFjLm9rIFwKLQl0LW12dGMub2sgXAotCXQtbXNidS5vayBcCi0JdC1tdWx4dS5vayBcCi0JdC1yYWMub2sgXAotCXQtcmFjaGkub2sgXAotCXQtcmR0Lm9rIFwKLQl0LXJlcC5vayBcCi0JdC1ydGUub2sgXAotCXQtc2FjLm9rIFwKLQl0LXNhY2hpLm9rIFwKLQl0LXNhZGQub2sgXAotCXQtc2xhZS5vayBcCi0JdC1zcC5vayBcCi0JdC1zdWIydy5vayBcCi0JdC1zdWIub2sgXAotCXQtc3ViaS5vayBcCi0JdC1hZS1sZC1kLm9rIFwKLQl0LWFlLWxkLWkub2sgXAotCXQtYWUtbGQtaWQub2sgXAotCXQtYWUtbGQtaW0ub2sgXAotCXQtYWUtbGQtaXAub2sgXAotCXQtYWUtbGQydy1kLm9rIFwKLQl0LWFlLWxkMnctaS5vayBcCi0JdC1hZS1sZDJ3LWlkLm9rIFwKLQl0LWFlLWxkMnctaW0ub2sgXAotCXQtYWUtbGQydy1pcC5vayBcCi0JdC1hZS1zdC1kLm9rIFwKLQl0LWFlLXN0LWkub2sgXAotCXQtYWUtc3QtaWQub2sgXAotCXQtYWUtc3QtaW0ub2sgXAotCXQtYWUtc3QtaXAub2sgXAotCXQtYWUtc3QtaXMub2sgXAotCXQtYWUtc3Qydy1kLm9rIFwKLQl0LWFlLXN0MnctaS5vayBcCi0JdC1hZS1zdDJ3LWlkLm9rIFwKLQl0LWFlLXN0MnctaW0ub2sgXAotCXQtYWUtc3Qydy1pcC5vayBcCi0JdC1hZS1zdDJ3LWlzLm9rIFwKLQl0LW1vZC1sZC1wcmUub2sgXAotCXQtcmllLXh4Lm9rIFwKLSMKLQotQVNfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vZ2FzL2FzLW5ldyBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL2dhcy9hcy1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWFzIDsgXAotICBmaWAKLQotTERfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vbGQvbGQtbmV3IF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vbGQvbGQtbmV3IDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1sZCA7IFwKLSAgZmlgCi0KLVJVTl9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9zaW0vZDEwdi9ydW4gXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9zaW0vZDEwdi9ydW4gOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLXJ1biA7IFwKLSAgZmlgCi0KLSMgRm9yY2UgZDEwdiBpbnRvIG9wZXJhdGluZyBtb2RlLgotUlVORkxBR1NfRk9SX1RBUkdFVD0tbwotCi0KLWNoZWNrOiBzYW5pdHkgJChURVNUUykKLXNhbml0eToKLQlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQ9JChBU19GT1JfVEFSR0VUKQotCUBldmFsIGVjaG8gTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBSVU5fRk9SX1RBUkdFVD0kKFJVTl9GT1JfVEFSR0VUKQotCi1jbGVhbjoKLQlybSAtZiAkKFRFU1RTKQotCXJtIC1mICoucnVuICoubwotCXJtIC1mIGNvcmUgKi5jb3JlCi0KLSMgUnVsZXMgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzCi0KLS5TVUZGSVhFUzogLm9rIC5ydW4gLmhpIC5rbyAudGkKLS5ydW4ub2s6Ci0Jcm0gLWYgdG1wLSQqICQqLmhpCi0JdWxpbWl0IC10IDUgOyBcCi0JJChSVU5fRk9SX1RBUkdFVCkgJChSVU5GTEFHU19GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKLQltdiB0bXAtJCogJCoub2sKLS5ydW4uaGk6Ci0Jcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKLQl1bGltaXQgLXQgNSA7IFwKLQkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgotCWVjaG8gJ0hlbGxvIFdvcmxkIScgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgotCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCi0ucnVuLmtvOgotCXJtIC1mIHRtcC0kKiAkKi5rbwotCXNldCArZSA7IFwKLQl1bGltaXQgLXQgNSA7IFwKLQkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKLQlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAotCSAgZXhpdCAwIDsgXAotCWVsc2UgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JbXYgdG1wLSQqICQqLmtvCi0ucnVuLnRpOgotCXJtIC1mIHRtcC0kKiAkKi50aQotCXNldCArZSA7IFwKLQl1bGltaXQgLXQgNSA7IFwKLQkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQoSU5URkxBR1NfRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCi0JdGVzdCBgY2F0IHRtcC0kKiB8IHdjIC1sYCAtZXEgMTAgPCAvZGV2L251bGwKLQl0ZXN0IGBncmVwIFRpY2sgdG1wLSQqIHwgd2MgLWxgIC1lcSAxMCA8IC9kZXYvbnVsbAotCW12IHRtcC0kKiAkKi50aQotCi0KLSMgUnVsZXMgZm9yIGJ1aWxkaW5nIHRoZSB0ZXN0Ci0jIFByZWZlcmVuY2UgaXMgZm9yIG9idGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoLnJ1bikgZnJvbSBhIHByZWJ1aWx0IGltYWdlCi0KLS5TVUZGSVhFUzogLnV1ZSAucyAuUyAucnVuCi0udXVlLnJ1bjoKLQloZWFkICQqIHwgZ3JlcCAkKi5ydW4gPiAvZGV2L251bGwKLQl1dWRlY29kZSAkKi51dWUKLS5ydW4udToKLQl1dWVuY29kZSA8ICQqLnJ1biAkKi5ydW4gPiAkKi51Ci0uby5ydW46Ci0JJChMRF9GT1JfVEFSR0VUKSAkKExERkxBR1NfRk9SX1RBUkdFVCkgLW8gJCoucnVuICQqLm8KLS5zLm86Ci0JJChBU19GT1JfVEFSR0VUKSAkKEFTRkxBR1NfRk9SX1RBUkdFVCkgLUkkKHNyY2RpcikgJChzcmNkaXIpLyQqLnMgLW8gJCoubwotLlMubzoKLQkkKEFTX0ZPUl9UQVJHRVQpICQoQVNGTEFHU19GT1JfVEFSR0VUKSAtSSQoc3JjZGlyKSAkKHNyY2RpcikvJCouUyAtbyAkKi5vCi0KLQotTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjkzNDhiYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDkwMCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLUNDPSR7Q0MtY2N9Ci0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTcyOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5MzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjExOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KLSMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCi0jIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcwotCi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMiIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAQ0NAJSRDQyVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9jb25maWd1cmUuaW4gYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0Mzg5ZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi1kbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCi1kbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjawotZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19QUkVSRVEoMi41KQotZG5sIEZJWE1FIC0gdGhpbmsgb2YgYSB0cnVseSB1bmlxIGZpbGUgdG8gdGhpcyBkaXJlY3RvcnkKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLUNDPSR7Q0MtY2N9Ci1BQ19TVUJTVChDQykKLUFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4pCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFDX1NVQlNUKHRhcmdldF9jcHUpCi0KLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9leGl0NDcucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvZXhpdDQ3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTQ2NjQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9leGl0NDcucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9oZWxsby5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9oZWxsby5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDYwYzg5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvaGVsbG8ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQloZWxsbwotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2xvb3AucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvbG9vcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM3MWU0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvbG9vcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX3N0YXJ0Ci0KLV9zdGFydDoKLQlicmEgX3N0YXJ0Ci0Jbm9wCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtZC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlNzgzZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9sZAotCQotCWxkIHI4LEAweDQwMDAKLXRlc3RfbGQ6Ci0JbGQgcjgsQDB4NDAwMQotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWkucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZC1pLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTY4ZTEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWkucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3RfbGQKLQkKLQlsZGkgcjEwLCAjMHg0MDAwCi0JbGQgcjgsIEByMTAKLQotCWxkaSByMTAsICMweDQwMDEKLXRlc3RfbGQ6Ci0JbGQgcjgsQHIxMAotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWlkLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtaWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNzM4Mi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtaWQucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3RfbGQKLQkKLQlsZGkgcjEwLCAjMHg0MDAxCi0JbGQgcjgsIEAoMSxyMTApCi0KLXRlc3RfbGQ6Ci0JbGQgcjgsQCgyLHIxMCkKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZC1pbS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWltLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTJiYTYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWltLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X2xkCi0JCi0JbGRpIHIxMCwgIzB4NDAwMAotCWxkIHI4LCBAcjEwLQotCi0JbGRpIHIxMCwgIzB4NDAwMQotdGVzdF9sZDoKLQlsZCByOCxAcjEwLQotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkLWlwLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtaXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNjY2MC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQtaXAucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3RfbGQKLQkKLQlsZGkgcjEwLCAjMHg0MDAwCi0JbGQgcjgsIEByMTArCi0KLQlsZGkgcjEwLCAjMHg0MDAxCi10ZXN0X2xkOgotCWxkIHI4LEByMTArCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1kLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjU0YWIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkMnctZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9sZDJ3Ci0JCi0JbGQydyByOCxAMHg0MDAwCi10ZXN0X2xkMnc6Ci0JbGQydyByOCxAMHg0MDAxCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzJkZjUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkMnctaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9sZDJ3Ci0JCi0JbGRpIHIxMCwgIzB4NDAwMAotCWxkMncgcjgsIEByMTAKLQotCWxkaSByMTAsICMweDQwMDEKLXRlc3RfbGQydzoKLQlsZDJ3IHI4LEByMTAKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZDJ3LWlkLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZiMmEwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZDJ3LWlkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X2xkMncKLQkKLQlsZGkgcjEwLCAjMHg0MDAxCi0JbGQydyByOCxAKDEscjEwKQotdGVzdF9sZDJ3OgotCWxkMncgcjgsQCgyLHIxMCkKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZDJ3LWltLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE3Mjg2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1sZDJ3LWltLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X2xkMncKLQkKLQlsZGkgcjEwLCAjMHg0MDAwCi0JbGQydyByOCwgQHIxMC0KLQotCWxkaSByMTAsICMweDQwMDEKLXRlc3RfbGQydzoKLQlsZDJ3IHI4LEByMTAtCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLWxkMnctaXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjZmFiNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtbGQydy1pcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9sZDJ3Ci0JCi0JbGRpIHIxMCwgIzB4NDAwMAotCWxkMncgcjgsIEByMTArCi0KLQlsZGkgcjEwLCAjMHg0MDAxCi10ZXN0X2xkMnc6Ci0JbGQydyByOCxAcjEwKwotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0LWQucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGVkZDguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0LWQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3Rfc3QKLQkKLQlzdCByOCxAMHg0MDAwCi10ZXN0X3N0OgotCXN0IHI4LEAweDQwMDEKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3QtaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTI0NTk4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X3N0Ci0JCi0JbGRpIHIxMCwjMHg0MDAwCi0Jc3QgcjgsIEByMTAKLQotCWxkaSByMTAsIzB4NDAwMQotdGVzdF9zdDoKLQlzdCByOCxAcjEwCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3QtaWQucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FhMWI0ZmEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0LWlkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X3N0Ci0JCi0JbGRpIHIxMCwjMHg0MDAxCi0Jc3QgcjgsIEAoMSxyMTApCi10ZXN0X3N0OgotCXN0IHI4LEAoMixyMTApCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3QtaW0ucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM4YmFmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9zdAotCQotCWxkaSByMTAsIzB4NDAwMAotCXN0IHI4LCBAcjEwLQotCi0JbGRpIHIxMCwjMHg0MDAxCi10ZXN0X3N0OgotCXN0IHI4LEByMTAtCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3QtaXAucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2EwMmVlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9zdAotCQotCWxkaSByMTAsIzB4NDAwMAotCXN0IHI4LCBAcjEwKwotCi0JbGRpIHIxMCwjMHg0MDAxCi10ZXN0X3N0OgotCXN0IHI4LEByMTArCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3QtaXMucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODY4NzgwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdC1pcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9zdAotCQotCWxkaSBzcCwjMHg0MDAwCi0Jc3QgcjgsIEAtU1AKLQotCWxkaSBzcCwjMHg0MDAxCi10ZXN0X3N0OgotCXN0IHI4LEAtU1AKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWQucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkOWMzMS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3Qydy1kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X3N0MncKLQkKLQlzdDJ3IHI4LEAweDQwMDAKLXRlc3Rfc3QydzoKLQlzdDJ3IHI4LEAweDQwMDEKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWkucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNGJjOS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3Qydy1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X3N0MncKLQkKLQlsZGkgcjEwLCAjMHg0MDAwCi0Jc3QydyByOCwgQHIxMAotCi0JbGRpIHIxMCwgIzB4NDAwMQotdGVzdF9zdDJ3OgotCXN0MncgcjgsQHIxMAotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0MnctaWQucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWlkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmZkNGQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0MnctaWQucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3Rfc3QydwotCQotCWxkaSByMTAsICMweDQwMDEKLQlzdDJ3IHI4LCBAKDEscjEwKQotdGVzdF9zdDJ3OgotCXN0MncgcjgsQCgyLHIxMCkKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWltLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3Qydy1pbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBhOWViLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWltLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19BRSZETUFQX01BU0spK0RNQVBfQkFTRSBQU1dfQklUUyB0ZXN0X3N0MncKLQkKLQlsZGkgcjEwLCAjMHg0MDAwCi0Jc3QydyByOCwgQHIxMC0KLQotCWxkaSByMTAsICMweDQwMDEKLXRlc3Rfc3QydzoKLQlzdDJ3IHI4LEByMTAtCi0Jbm9wCi0JZXhpdDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3Qydy1pcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0MnctaXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5MTFmNy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtYWUtc3Qydy1pcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSAwCi0JcG9pbnRfZG1hcF9hdF9pbWVtCi0JY2hlY2tfaW50ZXJydXB0IChWRUNfQUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9zdDJ3Ci0JCi0JbGRpIHIxMCwgIzB4NDAwMAotCXN0MncgcjgsIEByMTArCi0KLQlsZGkgcjEwLCAjMHg0MDAxCi10ZXN0X3N0Mnc6Ci0Jc3QydyByOCxAcjEwKwotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0MnctaXMucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1hZS1zdDJ3LWlzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWQ3MWMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWFlLXN0MnctaXMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gMAotCXBvaW50X2RtYXBfYXRfaW1lbQotCWNoZWNrX2ludGVycnVwdCAoVkVDX0FFJkRNQVBfTUFTSykrRE1BUF9CQVNFIFBTV19CSVRTIHRlc3Rfc3QydwotCQotCWxkaSBzcCwgIzB4NDAwNAotCXN0MncgcjgsIEAtU1AKLQotCWxkaSBzcCwgIzB4NDAwNQotdGVzdF9zdDJ3OgotCXN0MncgcjgsQC1TUAotCW5vcAotCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWRidC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWRidC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzUxODQ3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1kYnQucworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCVBTV19CSVRTID0gUFNXX0RNCi0JCi07OzsgQmxhdCBvdXIgRE1BUCByZWdpc3RlcnMgc28gdGhhdCB0aGV5IHBvaW50IGF0IG9uLWNoaXAgaW1lbQotCi0JbGRpIHIyLCBNQVBfSU5TTiB8IDB4ZgotCXN0IHIyLCBAKERNQVBfUkVHLHIwKQotCWxkaSByMiwgTUFQX0lOU04KLQlzdCByMiwgQChJTUFQMV9SRUcscjApCi0KLTs7OyBQYXRjaCB0aGUgaW50ZXJydXB0IHZlY3RvcidzIGRidCBlbnRyeSB3aXRoIGEgam1wIHRvIHN1Y2Nlc3MKLQotCWxkaSByNCwgI3RyYXAKLQlsZGkgcjUsIChWRUNfREJUICYgRE1BUF9NQVNLKSArIERNQVBfQkFTRQotCWxkMncgcjIsIEAoMCxyNCkKLQlzdDJ3IHIyLCBAKDAscjUpCi0JbGQydyByMiwgQCg0LHI0KQotCXN0MncgcjIsIEAoNCxyNSkKLQotdGVzdF9kYnQ6Ci0JZGJ0IC0+IG5vcAotCWV4aXQ0NwotCi1zdWNjZXNzOgotCWNoZWNrcHN3MiAxIFBTV19CSVRTCi0JZXhpdDAKLQotCS5kYXRhCi10cmFwOglsZGkgcjEsIHN1Y2Nlc3NAd29yZAotCWptcCByMQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWxkLXN0LnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbGQtc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5ZjIwMi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbGQtc3QucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCTsgVGVzdCBsZCBhbmQgc3QKLQlsZCByNCwgQGZvbwotCWNoZWNrIDEgcjQgMHhkZWFkCi0KLQlsZGkgcjQsICMweDIxNTIKLQlzdCByNCwgQGZvbwotCWxkIHI0LCBAZm9vCi0JY2hlY2sgMiByNCAweDIxNTIKLQotCTsgVGVzdCBsZDJ3IGFuZCBzdDJ3Ci0JbGRpIHI0LCAjMHhkZWFkCi0Jc3QgcjQsIEBmb28KLQlsZDJ3IHI0LCBAZm9vCi0JY2hlY2sydzIgMyByNCAweGRlYWQgMHhmMDAwCi0KLQlsZGkgcjQsICMweDIxMTIKLQlsZGkgcjUsICMweDE5ODQKLQlzdDJ3IHI0LCBAZm9vCi0JbGQydyByNCwgQGZvbwotCWNoZWNrMncyIDQgcjQgMHgyMTEyIDB4MTk4NAotCi0JLmRhdGEKLQkuYWxpZ24gMgotZm9vOgkuc2hvcnQgMHhkZWFkCi1iYXI6CS5zaG9ydCAweGYwMDAKLQkudGV4dAotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWMucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ZjYxNS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbWFjLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQk7OyBjbGVhciBGWAotCWxvYWRwc3cyIDB4ODAwNQotCWxvYWRhY2MyIGExIDB4N2YgMHhmZmZmIDB4ZmZmZgotCWxvYWQgcjggMHhmZmZmCi0JbG9hZCByOSAweDgwMDEKLXRlc3RfbWFjdTE6Ci0JTUFDVSBhMSwgcjksIHI4Ci0JY2hlY2thY2MyIDEgYTEgMHg4MCAweDgwMDAgMHg3RkZFCi0KLQk7OyBzZXQgRlgKLQlsb2FkcHN3MiAweDgwODUKLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsb2FkIHI4IDB4ZmZmZgotCWxvYWQgcjkgMHg4MDAxCi10ZXN0X21hY3UyOgotCU1BQ1UgYTEsIHI5LCByOAotCWNoZWNrYWNjMiAyIGExIDB4ODEgMHgwMDAwIDB4ZmZmZAotCi0KLQotCQotCTs7IGNsZWFyIEZYCi0JbGRpIHIyLCAjMHg4MDA1Ci0JbXZ0YyByMiwgY3IwCi0KLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsZGkgcjgsICMweGZmZmYKLQlsZGkgcjksICMweDdGRkYKLXRlc3RfbWFjc3UxOgotCU1BQ1NVIGExLCByOSwgcjgKLQljaGVja2FjYzIgMyBhMSAweDgwIDB4N0ZGRSAweDgwMDAKLQotCTs7IHNldCBGWAotCWxkaSByMiwgIzB4ODA4NQotCW12dGMgcjIsIGNyMAotCi0JbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCi0JbGRpIHI4LCAjMHhmZmZmCi0JbGRpIHI5LCAjMHg3RkZGCi10ZXN0X21hY3N1MjoKLQlNQUNTVSBhMSwgcjksIHI4Ci0JY2hlY2thY2MyIDQgYTEgMHg4MCAweGZmZmQgMHgwMDAxCi0KLQk7OyBjbGVhciBGWAotCWxkaSByMiwgIzB4ODAwNQotCW12dGMgcjIsIGNyMAotCi0JbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCi0JbGRpIHI4LCAweGZmZmYKLQlsZGkgcjksIDB4ODAwMQotdGVzdF9tYWNzdTM6Ci0JTUFDU1UgYTEsIHI5LCByOAotCWNoZWNrYWNjMiA1IGExIDB4N0YgMHg4MDAxIDB4N0ZGRQotCi0JOzsgc2V0IEZYCi0JbGRpIHIyLCAjMHg4MDg1Ci0JbXZ0YyByMiwgY3IwCi0KLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsZGkgcjgsICMweGZmZmYKLQlsZGkgcjksICMweDgwMDEKLXRlc3RfbWFjc3U0OgotCU1BQ1NVIGExLCByOSwgcjgKLQljaGVja2FjYzIgNiBhMSAweDdmIDB4MDAwMiAweEZGRkQKLQotCWV4aXQwCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWNyb3MuaSBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWNyb3MuaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNGFjZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbWFjcm9zLmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotCS5tYWNybyBzdGFydAotCS50ZXh0Ci0JLmFsaWduIDIKLQkuZ2xvYmwgX3N0YXJ0Ci1fc3RhcnQ6Ci0JbGRpIHIwLCAwCi0JLmVuZG0KLQotCi0JLm1hY3JvIGV4aXQ0NwotCWxkaSByNCwgMQotCWxkaSByMCwgNDcKLQl0cmFwIDE1Ci0JLmVuZG0KLQotCi0JLm1hY3JvIGV4aXQwCi0JbGRpIHI0LCAxCi0JbGRpIHIwLCAwCi0JdHJhcCAxNQotCS5lbmRtCi0KLQotCS5tYWNybyBleGl0MQotCWxkaSByNCwgMQotCWxkaSByMCwgMQotCXRyYXAgMTUKLQkuZW5kbQotCi0KLQkubWFjcm8gZXhpdDIKLQlsZGkgcjQsIDEKLQlsZGkgcjAsIDIKLQl0cmFwIDE1Ci0JLmVuZG0KLQotCi0JLm1hY3JvIGxvYWQgcmVnIHZhbAotCWxkaSBccmVnLCAjXHZhbAotCS5lbmRtCi0KLQotCS5tYWNybyBsb2FkMncgcmVnIGhpIGxvCi0JbGQydyBccmVnLCBAKDFmLHIwKQotCS5kYXRhCi0JLmFsaWduIDIKLTE6CS5zaG9ydCBcaGkKLQkuc2hvcnQgXGxvCi0JLnRleHQKLQkuZW5kbQotCi0KLQkubWFjcm8gY2hlY2sgZXhpdCByZWcgdmFsCi0JY21wZXFpCVxyZWcsICNcdmFsCi0JYnJmMHQgMWYKLTA6CWxkaSByNCwgMQotCWxkaSByMCwgXGV4aXQKLQl0cmFwIDE1Ci0xOgotCS5lbmRtCi0KLQotCS5tYWNybyBjaGVjazJ3MiBleGl0IHJlZyBoaSBsbwotCXN0MncJXHJlZywgQCgxZixyMCkKLQlsZAlyMiwgQCgxZiwgcjApCi0JY21wZXFpCXIyLCAjXGhpCi0JYnJmMGYJMGYKLQlsZAlyMiwgQCgxZiArIDIsIHIwKQotCWNtcGVxaQlyMiwgI1xsbwotCWJyZjBmCTBmCi0JYnJhCTJmCi0wOglsZGkgcjQsIDEKLQlsZGkgcjAsIFxleGl0Ci0JdHJhcCAxNQotCS5kYXRhCi0JLmFsaWduIDIKLTE6CS5sb25nIDAKLQkudGV4dAotMjoKLQkuZW5kbQotCi0KLQkubWFjcm8gbG9hZGFjYzIgYWNjIGd1YXJkIGhpIGxvCi0JbGRpCXIyLCAjXGxvCi0JbXZ0YWNsbwlyMiwgXGFjYwotCWxkaQlyMiwgI1xoaQotCW12dGFjaGkJcjIsIFxhY2MKLQlsZGkJcjIsICNcZ3VhcmQKLQltdnRhY2cJcjIsIFxhY2MKLQkuZW5kbQotCi0KLQkubWFjcm8gY2hlY2thY2MyIGV4aXQgYWNjIGd1YXJkIGhpIGxvCi0JbGRpCXIyLCAjXGd1YXJkCi0JbXZmYWNnCXIzLCBcYWNjCi0JY21wZXEJcjIsIHIzCi0JYnJmMGYJMGYKLQlsZGkJcjIsICNcaGkKLQltdmZhY2hpCXIzLCBcYWNjCi0JY21wZXEJcjIsIHIzCi0JYnJmMGYJMGYKLQlsZGkJcjIsICNcbG8KLQltdmZhY2xvCXIzLCBcYWNjCi0JY21wZXEJcjIsIHIzCi0JYnJmMGYJMGYKLQlicmEJNGYKLTA6CWxkaSByNCwgMQotCWxkaSByMCwgXGV4aXQKLQl0cmFwIDE1Ci00OgotCS5lbmRtCi0KLQotCS5tYWNybyBsb2FkcHN3MiB2YWwKLQlsZGkgcjIsICNcdmFsCi0JbXZ0YwlyMiwgY3IwCi0JLmVuZG0KLQotCi0JLm1hY3JvIGNoZWNrcHN3MiBleGl0IHZhbAotCW12ZmMJcjIsIGNyMAotCWNtcGVxaQlyMiwgI1x2YWwKLQlicmYwdAkxZgotCWxkaSByNCwgMQotCWxkaSByMCwgXGV4aXQKLQl0cmFwIDE1Ci0xOgotCS5lbmRtCi0KLQotCS5tYWNybyBoZWxsbwotCTs7IDQ6d3JpdGUgKDEsIHN0cmluZywgc3RybGVuIChzdHJpbmcpKQotCWxkaSByNCwgNAotCWxkaSByMCwgMQotCWxkaSByMSwgMWYKLQlsZGkgcjIsIDJmLTFmLTEKLQl0cmFwIDE1Ci0JLnNlY3Rpb24JLnJvZGF0YQotMToJLnN0cmluZyAiSGVsbG8gV29ybGQhXG4iCi0yOgkuYWxpZ24gMgotCS50ZXh0Ci0JLmVuZG0KLQotCi07OzsgQmxhdCBvdXIgRE1BUCByZWdpc3RlcnMgc28gdGhhdCB0aGV5IHBvaW50IGF0IG9uLWNoaXAgaW1lbQotCS5tYWNybyBwb2ludF9kbWFwX2F0X2ltZW0KLQkudGV4dAotCWxkaSByMiwgTUFQX0lOU04gfCAweGYKLQlzdCByMiwgQChETUFQX1JFRyxyMCkKLQlsZGkgcjIsIE1BUF9JTlNOCi0Jc3QgcjIsIEAoSU1BUDFfUkVHLHIwKQotCS5lbmRtCi0KLTs7OyBQYXRjaCBWRUMgc28gdGhhdCBpdCBqdW1wcyBiYWNrIHRvIGNvZGUgdGhhdCBjaGVja3MgUFNXCi07OzsgYW5kIHRoZW4gZXhpdHMgd2l0aCBzdWNjZXNzLgotCS5tYWNybyBjaGVja19pbnRlcnJ1cHQgdmVjIHBzdyBzcmMKLTs7OyBQYXRjaCB0aGUgaW50ZXJydXB0IHZlY3RvcidzIEFFIGVudHJ5IHdpdGggYSBqbXAgdG8gc3VjY2VzcwotCS50ZXh0Ci0JbGRpIHI0LCAjMWYKLQlsZGkgcjUsIFx2ZWMKLQk7OyAJCi0JbGQydyByMiwgQCgwLHI0KQotCXN0MncgcjIsIEAoMCxyNSkKLQlsZDJ3IHIyLCBAKDQscjQpCi0Jc3QydyByMiwgQCg0LHI1KQotCTs7IAkKLQlicmEgOWYKLQlub3AKLTs7OyBDb2RlIHRoYXQgZ2V0cyBwYXRjaGVkIGludG8gdGhlIGludGVycnVwdCB2ZWN0b3IKLQkuZGF0YQotMToJbGRpIHIxLCAyZkB3b3JkCi0Jam1wIHIxCi07OzsgU3VjY2Vzc2Z1bGwgdHJhcCBqdW1wcyBiYWNrIHRvIGhlcmUKLQkudGV4dAotOzs7IFZlcmlmeSB0aGUgUFNXCi0yOgltdmZjCXIyLCBjcjAKLQljbXBlcWkJcjIsICNccHN3Ci0JYnJmMHQJM2YKLQlub3AKLQlleGl0MQotOzs7IFZlcmlmeSB0aGUgb3JpZ2luYWwgYWRkcgotMzoJbXZmYwlyMiwgYnBjCi0JY21wZXFpCXIyLCAjXHNyY0B3b3JkCi0JYnJmMHQJNGYKLQlleGl0MgotNDoJZXhpdDAKLTs7OyBjb250aW51ZSBhcyBub3JtYWwKLTk6CQotCS5lbmRtCi0KLQotCVBTV19TTSA9IDB4ODAwMAotCVBTV18wMSA9IDB4NDAwMAotCVBTV19FQSA9IDB4MjAwMAotCVBTV19EQiA9IDB4MTAwMAotCVBTV19ETSA9IDB4MDgwMAotCVBTV19JRSA9IDB4MDQwMAotCVBTV19SUCA9IDB4MDIwMAotCVBTV19NRCA9IDB4MDEwMAotCVBTV19GWCA9IDB4MDA4MAotCVBTV19TVCA9IDB4MDA0MAotCVBTV18xMCA9IDB4MDAyMAotCVBTV18xMSA9IDB4MDAxMAotCVBTV19GMCA9IDB4MDAwOAotCVBTV19GMSA9IDB4MDAwNAotCVBTV18xNCA9IDB4MDAwMgotCVBTV19DICA9IDB4MDAwMQotCi0KLTs7OwotCi0JRE1BUF9NQVNLID0gMHgzZmZmCi0JRE1BUF9CQVNFID0gMHg4MDAwCi0JRE1BUF9SRUcgPSAweGZmMDQKLQotCUlNQVAwX1JFRyA9IDB4ZmYwMAotCUlNQVAxX1JFRyA9IDB4ZmYwMgotCi0JTUFQX0lOU04gPSAweDEwMDAKLQotOzs7Ci0KLQlWRUNfUkkgICA9IDB4M2ZmMDAKLQlWRUNfQkFFICA9IDB4M2ZmMDQKLQlWRUNfUklFICA9IDB4M2ZmMDgKLQlWRUNfQUUgICA9IDB4M2ZmMGMKLQlWRUNfVFJBUCA9IDB4M2ZmMTAKLQlWRUNfREJUICA9IDB4M2ZmNTAKLQlWRUNfU0RCVCA9IDB4M2ZmZjQKLQlWRUNfREJJICA9IDB4M2ZmNTgKLQlWRUNfRUkgICA9IDB4M2ZmNWMKLQotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbW9kLWxkLXByZS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW1vZC1sZC1wcmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNmUwMy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbW9kLWxkLXByZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0uc2VjdGlvbiAgICAgICAgLnJvZGF0YQotIAotICAgICAgICAudGV4dAotICAgICAgICAuZ2xvYmwgIG1haW4KLSAgICAgICAgLnR5cGUgICBtYWluLEBmdW5jdGlvbgotbWFpbjoKLSAgICBtdmZjICAgICAgICByMCwgUFNXICAgICAgICAgICAgIHx8ICBsZGkucyAgICAgICByMTQsICMwCi0gICAgbGRpLmwgICAgICAgcjIsIDB4MTAwICAgICAgICAgICAgICAgOyBNT0RfRQotICAgIGxkaS5sICAgICAgIHIzLCAweDEwOCAgICAgICAgICAgICAgIDsgTU9EX1MKLSAKLXRlc3RfbW9kX2RlY19sZDoKLSAgICBtdnRjICAgICAgICByMiwgTU9EX0UgICAgICAgICAgIHx8ICBic2V0aSAgICAgICByMCwgIzcKLSAgICBtdnRjICAgICAgICByMywgTU9EX1MKLSAgICBtdnRjICAgICAgICByMCwgUFNXICAgICAgICAgICAgICAgICA7IG1vZHVsbyBtb2RlIGVuYWJsZQotICAgIG12ICAgICAgICAgIHIxLHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMT0weDEwOAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNgotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMgotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwOCAKLSAgICBsZCAgICAgICAgICByNCwgQHIxLSAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDYgCi0gCi0gICAgY21wZXFpICAgICAgcjEsIzB4MTA2Ci0gICAgYnJmMGYgICAgICAgX0VSUiAgICAgICAgICAgIDsgIGJyYW5jaCB0byBlcnJvcgotIAotdGVzdF9tb2RfaW5jX2xkOgotICAgIG12dGMgICAgICAgIHIyLCBNT0RfUwotICAgIG12dGMgICAgICAgIHIzLCBNT0RfRQotICAgIG12ICAgICAgICAgIHIxLHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMT0weDEwMAotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMgotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNAotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNgotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwOAotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMAotICAgIGxkICAgICAgICAgIHI0LCBAcjErICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMgotIAotICAgIGNtcGVxaSAgICAgIHIxLCMweDEwMgotICAgIGJyZjBmICAgICAgIF9FUlIKLSAKLXRlc3RfbW9kX2RlY19sZDJ3OgotICAgIG12dGMgICAgICAgIHIyLCBNT0RfRQotICAgIG12dGMgICAgICAgIHIzLCBNT0RfUwotICAgIG12ICAgICAgICAgIHIxLHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMT0weDEwOAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwOCAKLSAgICBsZDJXICAgICAgICByNCwgQHIxLSAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDQgCi0gCi0gICAgY21wZXFpICAgICAgcjEsIzB4MTA0Ci0gICAgYnJmMGYgICAgICAgX0VSUiAgICAgICAgICAgIDsgPD0gYnJhbmNoIHRvIGVycm9yCi0gCi10ZXN0X21vZF9pbmNfbGQydzoKLSAgICBtdnRjICAgICAgICByMiwgTU9EX1MKLSAgICBtdnRjICAgICAgICByMywgTU9EX0UgICAgICAgICAgIHx8ICBCQ0xSSSAgICAgICByMCwgIzcKLSAgICBtdiAgICAgICAgICByMSxyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcjE9MHgxMDAKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDQKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDgKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDAKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDQKLSAKLSAgICBjbXBlcWkgICAgICByMSwjMHgxMDQKLSAgICBicmYwZiAgICAgICBfRVJSCi0gCi10ZXN0X21vZF9kZWNfbGRfZGlzOgotICAgIG12dGMgICAgICAgIHIwLCBQU1cgICAgICAgICAgICAgICAgIDsgbW9kdWxvIG1vZGUgZGlzYWJsZQotICAgIG12dGMgICAgICAgIHIyLCBNT0RfRQotICAgIG12dGMgICAgICAgIHIzLCBNT0RfUwotICAgIG12ICAgICAgICAgIHIxLHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMT0weDEwOAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNgotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMgotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMAotICAgIGxkICAgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weEZFCi0gICAgbGQgICAgICAgICAgcjQsIEByMS0gICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4RkMKLSAKLSAgICBjbXBlcWkgICAgICByMSwjMHhGQwotICAgIGJyZjBmICAgICAgIF9FUlIKLSAKLXRlc3RfbW9kX2luY19sZF9kaXM6Ci0gICAgbXZ0YyAgICAgICAgcjIsIE1PRF9TCi0gICAgbXZ0YyAgICAgICAgcjMsIE1PRF9FCi0gICAgbXYgICAgICAgICAgcjEscjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHIxPTB4MTAwCi0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTAyCi0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTA0Ci0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTA2Ci0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTA4Ci0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTBBCi0gICAgbGQgICAgICAgICAgcjQsIEByMSsgICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4MTBDCi0gCi0gICAgY21wZXFpICAgICAgcjEsIzB4MTBDCi0gICAgYnJmMGYgICAgICAgX0VSUgotIAotdGVzdF9tb2RfZGVjX2xkMndfZGlzOgotICAgIG12dGMgICAgICAgIHIyLCBNT0RfRQotICAgIG12dGMgICAgICAgIHIzLCBNT0RfUwotICAgIG12ICAgICAgICAgIHIxLHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByMT0weDEwOAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwNAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weDEwMAotICAgIGxkMlcgICAgICAgIHI0LCBAcjEtICAgICAgICB8fCAgICAgIG5vcCAgICAgOyByMT0weEZDCi0gICAgbGQyVyAgICAgICAgcjQsIEByMS0gICAgICAgIHx8ICAgICAgbm9wICAgICA7IHIxPTB4RjgKLSAKLSAgICBjbXBlcWkgICAgICByMSwjMHhGOAotICAgIGJyZjBmICAgICAgIF9FUlIKLQotIHRlc3RfbW9kX2luY19sZDJ3X2RpczoKLSAgICBtdnRjICAgICAgICByMiwgTU9EX1MKLSAgICBtdnRjICAgICAgICByMywgTU9EX0UKLSAgICBtdiAgICAgICAgICByMSxyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcjE9MHgxMDAKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDQKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMDgKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMEMKLSAgICBsZDJXICAgICAgICByNCwgQHIxKyAgICAgICAgfHwgICAgICBub3AgICAgIDsgcjE9MHgxMTAKLSAKLSAgICBjbXBlcWkgICAgICByMSwjMHgxMTAKLSAgICBicmYwZiAgICAgICBfRVJSIAotCi1fT0s6Ci0JZXhpdDAKLSAKLV9FUlI6Ci0JZXhpdDQ3Ci0KLSAKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW1zYnUucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tc2J1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Mjc2Y2MuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW1zYnUucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCTs7IGNsZWFyIEZYCi0JbGRpIHIyLCAjMHg4MDA1Ci0JbXZ0YyByMiwgY3IwCi0KLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsZGkgcjgsIDB4ZmZmZgotCWxkaSByOSwgMHg4MDAxCi10ZXN0X21zYnUxOgotCU1TQlUgYTEsIHI5LCByOAotCWNoZWNrYWNjMiAxIGExIDBYN0YgMHg3RkZGIDB4ODAwMAotCi0JCi0JOzsgc2V0IEZYCi0JbGRpIHIyLCAjMHg4MDg1Ci0JbXZ0YyByMiwgY3IwCi0KLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsZGkgcjgsIDB4ZmZmZgotCWxkaSByOSwgMHg4MDAxCi10ZXN0X21zYnUyOgotCU1TQlUgYTEsIHI5LCByOAotCWNoZWNrYWNjMiAyIGExIDBYN0UgMHhGRkZGIDB4MDAwMQotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tdWx4dS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW11bHh1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTZmZmMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW11bHh1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQk7OyBjbGVhciBGWAotCWxkaSByMiwgIzB4ODAwNQotCW12dGMgcjIsIGNyMAotCi0JbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCi0JbGRpIHI4LCAweGZmZmYKLQlsZGkgcjksIDB4ODAwMQotdGVzdF9tdWx4dTE6Ci0JTVVMWFUgYTEsIHI5LCByOAotCWNoZWNrYWNjMiAxIGExIDB4MDAgMHg4MDAwIDB4N0ZGRgotCi0JCi0JOzsgc2V0IEZYCi0JbGRpIHIyLCAjMHg4MDg1Ci0JbXZ0YyByMiwgY3IwCi0KLQlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKLQlsZGkgcjgsIDB4ZmZmZgotCWxkaSByOSwgMHg4MDAxCi10ZXN0X211bHh1MjoKLQlNVUxYVSBhMSwgcjksIHI4Ci0JY2hlY2thY2MyIDIgYTEgMHgwMSAweDAwMDAgMHhGRkZFCi0KLQlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW12dGFjLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXZ0YWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NTJkYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXZ0YWMucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCWxkaSByOCwgMHhiZWVmCi0JbXZ0YWNsbyByOCwgYTAKLQljaGVja2FjYzIgMSBhMCAweGZmIDB4ZmZmZiAweGJlZWYKLQotCW12dGFjZwlyMCwgYTAKLQljaGVja2FjYzIgMiBhMCAweDAwIDB4ZmZmZiAweGJlZWYKLQkKLQlsZGkgcjgsIDB4ZGVhZAotCW12dGFjaGkJcjgsIGEwCi0JY2hlY2thY2MyIDMgYTAgMHhmZiAweGRlYWQgMHhiZWVmCi0KLQlsb2FkYWNjMiBhMSAweGZlIDB4YmVlZiAweGRlYWQKLQljaGVja2FjYzIgNCBhMSAweGZlIDB4YmVlZiAweGRlYWQKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXZ0Yy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW12dGMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlZDgzMy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXZ0Yy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotOzs7IFRyeSBvdXQgZWFjaCBiaXQgaW4gdGhlIFBTVwotCi0JbG9hZHBzdzIgUFNXX1NNCi0JY2hlY2twc3cyIDEgUFNXX1NNCi0KLQlsb2FkcHN3MiBQU1dfMDEKLQljaGVja3BzdzIgMiAwIDs7IFBTV18wMQotCi0JbG9hZHBzdzIgUFNXX0VBCi0JY2hlY2twc3cyIDMgUFNXX0VBCi0KLQlsb2FkcHN3MiBQU1dfREIKLQljaGVja3BzdzIgNCBQU1dfREIKLQotCWxvYWRwc3cyIFBTV19ETQotCWNoZWNrcHN3MiA1IDAgOzsgUFNXX0RNCi0KLQlsb2FkcHN3MiBQU1dfSUUKLQljaGVja3BzdzIgNiBQU1dfSUUKLQotCWxvYWRwc3cyIFBTV19SUAotCWNoZWNrcHN3MiA3IFBTV19SUAotCi0JbG9hZHBzdzIgUFNXX01ECi0JY2hlY2twc3cyIDggUFNXX01ECi0KLQlsb2FkcHN3MiBQU1dfRlh8UFNXX1NUCi0JY2hlY2twc3cyIDkgUFNXX0ZYfFBTV19TVAotCi0JOzsgbG9hZHBzdzIgUFNXX1NUCi0JOzsgY2hlY2twc3cyIDEwIAotCi0JbG9hZHBzdzIgUFNXXzEwCi0JY2hlY2twc3cyIDExIDAgOzsgUFNXXzEwCi0KLQlsb2FkcHN3MiBQU1dfMTEKLQljaGVja3BzdzIgMTIgMCA7OyBQU1dfMTEKLQotCWxvYWRwc3cyIFBTV19GMAotCWNoZWNrcHN3MiAxMyBQU1dfRjAKLQotCWxvYWRwc3cyIFBTV19GMQotCWNoZWNrcHN3MiAxNCBQU1dfRjEKLQotCWxvYWRwc3cyIFBTV18xNAotCWNoZWNrcHN3MiAxNSAwIDs7IFBTV18xNAotCi0JbG9hZHBzdzIgUFNXX0MKLQljaGVja3BzdzIgMTYgUFNXX0MKLQotCi07OzsgQ2hlY2sgdGhhdCBiaXQgMCAoTFNCKSBvZiB0aGUgTU9EX0UgJiBNT0RfUyByZWdpc3RlcnMgYXJlIHN0dWNrIGF0IFpFUk8uCi0KLQlsZGkJcjYsICMweGRlYWQKLQltdnRjCXI2LCBjcjEwCi0JbGRpCXI2LCAjMHhiZWVmCi0JbXZ0YwlyNiwgY3IxMQotCQotCW12ZmMJcjcsIGNyMTAKLQljaGVjayAxNyByNyAweGRlYWMKLQltdmZjCXI3LCBjcjExCi0JY2hlY2sgMTggcjcgMHhiZWVlCi0KLTs7OyBDaGVjayB0aGF0IGNlcnRhaW4gYml0cyBvZiB0aGUgUFNXLCBEUFNXIGFuZCBCUFNXIGFyZSBoYXJkd2lyZWQgdG8gemVybwotCi1wc3dfZmZmZjoKLQlsZGkJcjYsIDB4ZmZmZgotCW12dGMJcjYsIHBzdwotCW12ZmMJcjcsIHBzdwotCWNoZWNrIDE4IHI3IDB4YjdjZAotCi1icHN3X2ZmZmY6Ci0JbGRpCXI2LCAweGZmZmYKLQltdnRjCXI2LCBicHN3Ci0JbXZmYwlyNywgYnBzdwotCWNoZWNrIDE4IHI3IDB4YjdjZAotCi1kcHN3X2ZmZmY6Ci0JbGRpCXI2LCAweGZmZmYKLQltdnRjCXI2LCBkcHN3Ci0JbXZmYwlyNywgZHBzdwotCWNoZWNrIDE4IHI3IDB4YjdjZAotCi07OzsgQW5vdGhlciBjaGVjay4gVmVyeSBzaW1pbGFyCi0KLXBzd19kZmZmOgotCWxkaQlyNiwgMHhkZmZmCi0JbXZ0YwlyNiwgcHN3Ci0JbXZmYwlyNywgcHN3Ci0JY2hlY2sgMTggcjcgMHg5N2NkCi0KLWJwc3dfZGZmZjoKLQlsZGkJcjYsIDB4ZGZmZgotCW12dGMJcjYsIGJwc3cKLQltdmZjCXI3LCBicHN3Ci0JY2hlY2sgMTggcjcgMHg5N2NkCi0KLWRwc3dfZGZmZjoKLQlsZGkJcjYsIDB4ZGZmZgotCW12dGMJcjYsIGRwc3cKLQltdmZjCXI3LCBkcHN3Ci0JY2hlY2sgMTggcjcgMHg5N2NkCi0KLTs7OyBBbmQgYWdhaW4uCi0KLXBzd184MDA1OgotCWxkaQlyNiwgMHg4MDA1Ci0JbXZ0YwlyNiwgcHN3Ci0JbXZmYwlyNywgcHN3Ci0JY2hlY2sgMTggcjcgMHg4MDA1Ci0KLWJwc3dfODAwNToKLQlsZGkJcjYsIDB4ODAwNQotCW12dGMJcjYsIGJwc3cKLQltdmZjCXI3LCBicHN3Ci0JY2hlY2sgMTggcjcgMHg4MDA1Ci0KLWRwc3dfODAwNToKLQlsZGkJcjYsIDB4ODAwNQotCW12dGMJcjYsIGRwc3cKLQltdmZjCXI3LCBkcHN3Ci0JY2hlY2sgMTggcjcgMHg4MDA1Ci0KLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmFjLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmFjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTIzMTEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JOzsgY2xlYXIgRlgKLQlsb2FkcHN3MiAweDgwMDQKLQlsb2FkYWNjMiBhMCAweDgwIDB4MDAwMCAweDAwMDAKLQlsb2FkYWNjMiBhMSAweDAwIDB4MDAwMCAweDUwMDAKLQlsb2FkIHIxMCAweDAxMjMKLQlsb2FkIHIxMSAweDQ1NjcKLXRlc3RfcmFjMToKLQlSQUMJcjEwLCBhMCwgIy0yCi0JY2hlY2twc3cyIDEgMHg4MDA4Ci0JY2hlY2sydzIgMiByMTAgMHg4MDAwIDB4MDAwMAotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yYWNoaS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhY2hpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTAxOTUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhY2hpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlsb2FkYWNjMiBhMCAweDAwIDB4N0ZGRiAweDgwMDAKLXRlc3RfcmFjaGlfMToKLQlyYWNoaSByNCwgYTAsIDAKLQljaGVjayAxIHI0IDB4N0ZGRgotCi0KLQlsb2FkYWNjMiBhMCAweEZGIDB4ODAwMCAweDEwMDAKLXRlc3RfcmFjaGlfMjoKLQlyYWNoaSByNCwgYTAsIDAKLQljaGVjayAyIHI0IDB4ODAwMAotCi0KLQlsb2FkYWNjMiBhMCAweDAwIDB4MTAwMCAweEEwMDAKLXRlc3RfcmFjaGlfMzoKLQlyYWNoaSByNCwgYTAsIDAKLQljaGVjayAzIHI0IDB4MTAwMQotCi0KLQlsb2FkYWNjMiBhMCAweEZGIDB4QTAwMCAweDdGRkYKLXRlc3RfcmFjaGlfNDoKLQlyYWNoaSByNCwgYTAsIDAKLQljaGVjayA0IHI0IDB4YTAwMAotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yZHQucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yZHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxYjU4My4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmR0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IFBTV19DfFBTV19GMHxQU1dfRjEKLQkKLQlsZGkJcjYsICNzdWNjZXNzQHdvcmQKLQltdnRjCXI2LCBkcGMKLQlsZGkJcjYsICNQU1dfQklUUwotCW12dGMJcjYsIGRwc3cKLQotdGVzdF9yZHQ6Ci0JUlRECi0JZXhpdDQ3Ci0KLXN1Y2Nlc3M6Ci0JY2hlY2twc3cyIDEgUFNXX0JJVFMKLQlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJlcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJlcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEzZWE4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yZXAucworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotCi0JCi0JOzsgQ2hlY2sgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gQFJFUF9FIGlzIGV4ZWN1dGVkIHdoZW4gaXQKLQk7OyBpcyByZWFjaGVkIHVzaW5nIGEgYnJhbmNoIGluc3RydWN0aW9uCi0JCi0JbGRpIHIyLCAxCi10ZXN0X3JlcF8xOgotCXJlcAlyMiwgZW5kX3JlcF8xCi0Jbm9wIHx8IG5vcAotCW5vcCB8fCBub3AKLQlub3AgfHwgbm9wCi0Jbm9wIHx8IG5vcAotCWxkaQlyMywgNDYKLQlicmEJZW5kX3JlcF8xCi0JbGRpCXIzLCA0MgotZW5kX3JlcF8xOgotCWFkZGkJcjMsIDEKLQotCWNoZWNrIDEgcjMgNDcKLQotCi0JOzsgQ2hlY2sgdGhhdCB0aGUgbG9vcCBpcyBleGVjdXRlZCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGltZXMKLQotCWxkaQlyMiwgMTAKLQlsZGkJcjMsIDAKLQlsZGkJcjQsIDAKLXRlc3RfcmVwXzI6Ci0JcmVwCXIyLCBlbmRfcmVwXzIKLQlub3AgfHwgbm9wCi0Jbm9wIHx8IG5vcAotCW5vcCB8fCBub3AKLQlub3AgfHwgbm9wCi0Jbm9wIHx8IG5vcAotCWFkZGkJcjMsIDEKLWVuZF9yZXBfMjoKLQlhZGRpCXI0LCAxCi0KLQljaGVjayAyIHIzIDEwCi0JY2hlY2sgMyByNCAxMAotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yaWUteHgucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yaWUteHgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2ZmNiZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmllLXh4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IDAKLQlwb2ludF9kbWFwX2F0X2ltZW0KLQljaGVja19pbnRlcnJ1cHQgKFZFQ19SSUUmRE1BUF9NQVNLKStETUFQX0JBU0UgUFNXX0JJVFMgdGVzdF9yaWVfeHgKLQkKLXRlc3RfcmllX3h4OgotICAgICAgICAuc2hvcnQgMHhlMTIwLCAweDAwMDAgIDs7IEV4YW1wbGUgb2YgUklFIGNvZGUKLQlub3AKLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1ydGUucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1ydGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMzFkZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcnRlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlQU1dfQklUUyA9IFBTV19DfFBTV19GMHxQU1dfRjEKLQkKLQlsZGkJcjYsICNzdWNjZXNzQHdvcmQKLQltdnRjCXI2LCBicGMKLQlsZGkJcjYsICNQU1dfQklUUwotCW12dGMJcjYsIGJwc3cKLQotdGVzdF9ydGU6Ci0JUlRFCi0JZXhpdDQ3Ci0KLXN1Y2Nlc3M6Ci0JY2hlY2twc3cyIDEgUFNXX0JJVFMKLQlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNhYy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNhYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQyYmUwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zYWMucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotdGVzdF9zYWNfMToKLQlsb2FkYWNjMiBhMCAweDAwIDB4QUZGRiAweDAwMDAKLQlzYWMgcjQsIGEwCi0JY2hlY2sgMSByNCAweDdGRkYKLQljaGVjayAyIHI1IDB4RkZGRgotCi10ZXN0X3NhY18yOgotCWxvYWRhY2MyIGEwIDB4RkYgMHg3MDAwIDB4MDAwMAotCXNhYyByNCwgYTAKLQljaGVjayAzIHI0IDB4ODAwMAotCWNoZWNrIDQgcjUgMHgwMDAwCi0KLXRlc3Rfc2FjXzM6Ci0JbG9hZGFjYzIgYTAgMHgwMCAweDEwMDAgMHhBMDAwCi0Jc2FjIHI0LCBhMAotCWNoZWNrIDUgcjQgMHgxMDAwCi0JY2hlY2sgNiByNSAweEEwMDAKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc2FjaGkucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zYWNoaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc0ZWUwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zYWNoaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi10ZXN0X3NhY2hpXzE6Ci0JbG9hZGFjYzIgYTAgMHgwMCAweEFGRkYgMHgwMDAwCi0Jc2FjaGkgcjQsIGEwCi0JY2hlY2sgMSByNCAweDdGRkYKLQotCi10ZXN0X3NhY2hpXzI6Ci0JbG9hZGFjYzIgYTAgMHhGRiAweDgwMDAgMHgxMDAwCi0Jc2FjaGkgcjQsIGEwCi0JY2hlY2sgMiByNCAweDgwMDAKLQotCi10ZXN0X3NhY2hpXzM6Ci0JbG9hZGFjYzIgYTAgMHgwMCAweDEwMDAgMHhBMDAwCi0Jc2FjaGkgcjQsIGEwCi0JY2hlY2sgMyByNCAweDEwMDAKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc2FkZC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlNGViZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi0JUFNXX0JJVFMgPSBQU1dfRlh8UFNXX1NUfFBTV19TTQotICAgICAgICBsb2FkcHN3MiBQU1dfQklUUwotCi0gOzsgVGVzdCBub3JtYWwgc2FkZAotCi0gICAgICAgIGxvYWRhY2MyIGEwIDB4MDAgMHg3ZmZmIDB4ZmZmZgotICAgICAgICBsb2FkYWNjMiBhMSAweGZmIDB4ODAwMCAweDAwMDAKLSAgICAgICAgc2FkZCBhMSwgYTAKLSAgICAgICAgY2hlY2thY2MyIDEgYTAgMHgwMCAweDdmZmYgMHhmZmZmCi0gICAgICAgIGNoZWNrYWNjMiAyIGExIDB4ZmYgMHg4MDAwIDB4N2ZmZgotCi0gOzsgVGVzdCBvdmVyZmxvdyAKLQotICAgICAgICBsb2FkYWNjMiBhMCAweDAwIDB4MDAwMCAweDAwMDAKLSAgICAgICAgbG9hZGFjYzIgYTEgMHgwMSAweDgwMDAgMHgwMDAwCi0gICAgICAgIHNhZGQgYTEsIGEwCi0gICAgICAgIGNoZWNrYWNjMiAzIGEwIDB4MDAgMHgwMDAwIDB4MDAwMAotICAgICAgICBjaGVja2FjYzIgNCBhMSAweDAwIDB4N2ZmZiAweGZmZmYKLQotICAgICAgICBsb2FkYWNjMiBhMCAweDAwIDB4ZmZmZiAweGZmZmYKLSAgICAgICAgbG9hZGFjYzIgYTEgMHgwMCAweGZmZmYgMHhmZmZmCi0gICAgICAgIHNhZGQgYTEsIGEwCi0gICAgICAgIGNoZWNrYWNjMiA1IGExIDB4MDAgMHg3ZmZmIDB4ZmZmZgotICAgICAgICBjaGVja2FjYzIgNiBhMCAweDAwIDB4ZmZmZiAweGZmZmYKLQotIDs7IFRlc3QgdW5kZXJmbG93Ci0KLSAgICAgICAgbG9hZGFjYzIgYTAgMHgwMCAweDAwMDAgMHgwMDAwCi0gICAgICAgIGxvYWRhY2MyIGExIDB4ODAgMHg4MDAwIDB4MDAwMAotICAgICAgICBzYWRkIGExLCBhMAotICAgICAgICBjaGVja2FjYzIgNyBhMCAweDAwIDB4MDAwMCAweDAwMDAKLSAgICAgICAgY2hlY2thY2MyIDggYTEgMHhmZiAweDgwMDAgMHgwMDAwCi0KLQlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNsYWUucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zbGFlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODQyMmQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNsYWUucworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotdGVzdF9zbGFlXzE6Ci0JbG9hZHBzdzIgUFNXX1NUfFBTV19GWAotCWxvYWRhY2MyIGEwIDB4MDAgMHgwQUZGIDB4RjAwMAotCWxkaSByMCwgNAotCXNsYWUgYTAsIHIwCi0JY2hlY2thY2MyIDEgYTAgMHgwMCAweDdGRkYgMHhGRkZGCi0KLXRlc3Rfc2xhZV8yOgotCWxvYWRwc3cyIFBTV19TVHxQU1dfRlgKLQlsb2FkYWNjMiBhMCAweEZGIDB4RjcwMCAweDEwMDAKLQlsZGkgcjAsIDQKLQlzbGFlIGEwLCByMAotCWNoZWNrYWNjMiAyIGEwIDB4RkYgMHg4MDAwIDB4MDAwMAotCi10ZXN0X3NsYWVfMzoKLQlsb2FkcHN3MiBQU1dfU1R8UFNXX0ZYCi0JbG9hZGFjYzIgYTAgMHgwMCAweDAwMTAgMHhBMDAwCi0JbGRpIHIwLCA0Ci0Jc2xhZSBhMCwgcjAKLQljaGVja2FjYzIgMyBhMCAweDAwIDB4MDEwQSAweDAwMDAKLQotdGVzdF9zbGFlXzQ6Ci0JbG9hZHBzdzIgMAotCWxvYWRhY2MyIGEwIDB4MDAgMHgwMDEwIDB4QTAwMAotCWxkaSByMCwgNAotCXNsYWUgYTAsIHIwCi0JY2hlY2thY2MyIDQgYTAgMHgwMCAweDAxMEEgMHgwMDAwCi0KLXRlc3Rfc2xhZV81OgotCWxvYWRhY2MyIGEwIDB4MDAgMHgwMDEwIDB4QTAwMAotCWxkaSByMCwgLTQKLQlzbGFlIGEwLCByMAotCWNoZWNrYWNjMiA0IGEwIDB4MDAgMHgwMDAxIDB4MEEwMAotCi0JZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZjlhZDQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLTs7OyBSZWFkL1dyaXRlIHZhbHVlcyB0byBTUFUvU1BJCi0KLQlsb2FkcHN3MiAwCi0JbGRpIHNwLCAweGRlYWQKLQlsb2FkcHN3MiBQU1dfU00KLQlsZGkgc3AsIDB4YmVlZgotCQotCWxvYWRwc3cyIDAKLQljaGVjayAxIHNwIDB4ZGVhZAotCWxvYWRwc3cyIFBTV19TTQotCWNoZWNrIDIgc3AgMHhiZWVmCi0KLQlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1Yi5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQwYTNhLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS5pbmNsdWRlICJ0LW1hY3Jvcy5pIgotCi0Jc3RhcnQKLQotOzsgIFRoZSBkMTB2IGltcGxlbWVudHMgbmVnYXRlZCBhZGRpdGlvbiBmb3Igc3VidHJhY3Rpb24KLQotCS5tYWNybyBjaGVja19zdWIgcyB4IHkgciBjCi0JOzsgY2xlYXIgY2FycnkKLQlsZGkJcjYsIzB4ODAwNAotCW12dGMJcjYsY3IwCi0JOzsgc3VidHJhY3QKLQlsZGkJcjEwLCNceAotCWxkaQlyMTEsI1x5Ci0Jc3ViCXIxMCwgcjExCi0JOzsgdmVyaWZ5IHJlc3VsdAotCWxkaQlyMTIsICNccgotCWNtcGVxCXIxMCwgcjEyCi0JYnJmMHQJMWYKLQlsZGkJcjYsIDEKLQlsZGkJcjIsICNccwotCXRyYXAJMTUKLTE6Ci0JOzsgdmVyaWZ5IGNhcnJ5Ci0JbXZmYwlyNiwgY3IwCi0JYW5kMwlyNiwgcjYsICMxCi0JY21wZXFpCXI2LCAjXGMKLQlicmYwdAkxZgotCWxkaQlyNiwgMQotCWxkaQlyMiwgI1xzCi0JdHJhcAkxNQotMToKLQkuZW5kbQotCi1jaGVja19zdWIgMSAweDAwMDAgMHgwMDAwICAweDAwMDAgIDEKLWNoZWNrX3N1YiAyIDB4MDAwMCAweDAwMDEgIDB4ZmZmZiAgMAotY2hlY2tfc3ViIDMgMHgwMDAxIDB4MDAwMCAgMHgwMDAxICAxCi1jaGVja19zdWIgNCAweDAwMDEgMHgwMDAxICAweDAwMDAgIDEKLWNoZWNrX3N1YiA1IDB4MDAwMCAweDgwMDAgIDB4ODAwMCAgMAotY2hlY2tfc3ViIDYgMHg4MDAwIDB4MDAwMSAgMHg3ZmZmICAxCi1jaGVja19zdWIgNyAweDdmZmYgMHg3ZmZmICAweDAwMDAgIDEKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3ViMncucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWIydy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFiYmI3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWIydy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi07OyAgVGhlIGQxMHYgaW1wbGVtZW50cyBuZWdhdGVkIGFkZGl0aW9uIGZvciBzdWJ0cmFjdGlvbgotCi0JLm1hY3JvIGNoZWNrX3N1YjJ3IHMgeCB5IHIgYyB2Ci0JCi0JOzsgY2xlYXIgY2FycnkKLQlsZGkJcjYsIzB4ODAwNAotCW12dGMJcjYsY3IwCi0JCi0JOzsgbG9hZCBvcG5kcwotCWxkMncJcjYsIEAoMWYscjApCi0JbGQydwlyOCwgQCgyZixyMCkKLQkuZGF0YQotMToJLmxvbmcJXHgKLTI6CS5sb25nCVx5Ci0JLnRleHQKLQkKLQk7OyBzdWJ0cmFjdAotCVNVQjJXCXI2LCByOAotCQotCTs7IHZlcmlmeSByZXN1bHQKLQlsZDJ3CXIxMCwgQCgxZixyMCkKLQkuZGF0YQotMToJLmxvbmcJXHIKLQkudGV4dAotCWNtcGVxCXI2LCByMTAKLQlicmYwZgkyZgotCWNtcGVxCXI3LCByMTEKLQlicmYwdAkzZgotMjoJbGRpCXI0LCAxCi0JbGRpCXIwLCBccwotCXRyYXAJMTUKLTM6Ci0JCi0JOzsgdmVyaWZ5IGNhcnJ5Ci0JbXZmYwlyNiwgY3IwCi0JYW5kMwlyNiwgcjYsICMxCi0JY21wZXFpCXI2LCAjXGMKLQlicmYwdAkxZgotCWxkaQlyNCwgMQotCWxkaQlyMCwgXHMKLQl0cmFwCTE1Ci0xOgotCS5lbmRtCi0JCi1jaGVja19zdWIydyAxIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAgMHgwMDAwMDAwMCAxIDAKLWNoZWNrX3N1YjJ3IDIgMHgwMDAwMDAwMCAweDAwMDAwMDAxICAweGZmZmZmZmZmIDAgMAotY2hlY2tfc3ViMncgMyAweDAwMDAwMDAxIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDEgMSAwCi1jaGVja19zdWIydyAzIDB4MDAwMDAwMDEgMHgwMDAwMDAwMSAgMHgwMDAwMDAwMCAxIDAKLWNoZWNrX3N1YjJ3IDUgMHgwMDAwMDAwMCAweDgwMDAwMDAwICAweDgwMDAwMDAwIDAgMQotY2hlY2tfc3ViMncgNiAweDgwMDAwMDAwIDB4MDAwMDAwMDEgIDB4N2ZmZmZmZmYgMSAxCi1jaGVja19zdWIydyA3IDB4N2ZmZmZmZmYgMHg3ZmZmZmZmZiAgMHgwMDAwMDAwMCAxIDAKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3ViaS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1YmkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmYWFkNS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3ViaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLmluY2x1ZGUgInQtbWFjcm9zLmkiCi0KLQlzdGFydAotCi07OyAgVGhlIGQxMHYgaW1wbGVtZW50cyBuZWdhdGVkIGFkZGl0aW9uIGZvciBzdWJ0cmFjdGlvbgotCi0JLm1hY3JvIGNoZWNrX3N1YmkgcyB4IHkgciBjIHYKLQk7OyBjbGVhciBjYXJyeQotCWxkaQlyNiwjMHg4MDA0Ci0JbXZ0YwlyNixjcjAKLQk7OyBzdWJ0cmFjdAotCWxkaQlyMTAsI1x4Ci0JU1VCSQlyMTAsI1x5Ci0JOzsgdmVyaWZ5IHJlc3VsdAotCWxkaQlyMTEsICNccgotCWNtcGVxCXIxMCwgcjExCi0JYnJmMHQJMWYKLQlsZGkJcjYsIDEKLQlsZGkJcjIsIFxzCi0JdHJhcAkxNQotMToKLQk7OyB2ZXJpZnkgY2FycnkKLQltdmZjCXI2LCBjcjAKLQlhbmQzCXI2LCByNiwgIzEKLQljbXBlcWkJcjYsICNcYwotCWJyZjB0CTFmCi0JbGRpCXI2LCAxCi0JbGRpCXIyLCBccwotCXRyYXAJMTUKLTE6Ci0JLmVuZG0KLQotCWNoZWNrX3N1YmkgMSAwMDAwICAweDAwMDAgIDB4ZmZmMCAwMCA7OyAgMCAtIDB4MTAKLQljaGVja19zdWJpIDIgMHgwMDAwICAweDAwMDEgIDB4ZmZmZiAwIDAKLQljaGVja19zdWJpIDMgMHgwMDAxICAweDAwMDAgIDB4ZmZmMSAwIDAKLQljaGVja19zdWJpIDQgMHgwMDAxICAweDAwMDEgIDB4MDAwMCAxIDAKLQljaGVja19zdWJpIDUgMHg4MDAwICAweDAwMDEgIDB4N2ZmZiAxIDEKLQotCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtdHJhcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXRyYXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNGFlMC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtdHJhcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0uaW5jbHVkZSAidC1tYWNyb3MuaSIKLQotCXN0YXJ0Ci0KLQlleGl0NDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvQ2hhbmdlTG9nIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTU4NzcuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0xOTk5LTAzLTE3ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkby1mbGFncy5TOiBBZGRlZCBuZXcgdGVzdCBmb3Igbm9uLWxrciBzdGF0dXMgb2YgTVZUU1lTLgotCi0xOTk5LTAxLTEyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkby1mbGFncy5TOiBBZGRlZCBvbmUgb2xkLCBvbmUgbmV3IHJlZ3Jlc3Npb24gdGVzdC4KLQotMTk5OS0wMS0xMSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZG8tZmxhZ3MuUzogTmV3IHRlc3QgZm9yIHBhcmFsbGVsIFBTVyB1cGRhdGUgY29uZmxpY3RzLgotCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogUnVuIGl0LgotCi0xOTk5LTAxLTA3ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkby0yd29yZG9wcy5TOiBOZXcgdGVzdCBmb3Igc2lnbi1leHRlbnNpb24gYnkgbGQyaC4KLQotMTk5OC0xMi0wOCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZG8tMndvcmRvcHMuUzogTmV3IHRlc3QgZm9yIGRvdWJsZS13b3JkIGxvYWQtbGlrZSBvcGVyYXRpb25zLgotCi0xOTk4LTEyLTA0ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkby1zaGlmdHMuUzogVXBkYXRlIGFuIG9sZGVyIHRlc3QgY2FzZS4KLQotMTk5OC0xMi0wMyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZG8tc2hpZnRzLlM6IE5ldyB0ZXN0IGZvciBtb3JlIFNSQyBzaGlmdCBjb3VudHMuIAotCi0xOTk4LTExLTIyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkby1zaGlmdHMuUzogTmV3IHRlc3QgZm9yIGxhcmdlIFNSQyBzaGlmdCBjb3VudHMuCi0KLTE5OTgtMTEtMTIgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGJyLWRqc3IuUzogTmV3IHRlc3QgZm9yIG5ldyBSNjItdXBkYXRlIHRpbWluZy4KLQotMTk5OC0xMS0wNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZG8tc2hpZnRzLlM6IEFkZCB0ZXN0IGZvciBsYXJnZSBtdmZhY2Mgc2hpZnRzLgotCi1UdWUgT2N0IDEzIDEwOjU0OjUxIEVEVCAxOTk4IEZyYW5rIENoLiBFaWdsZXIgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogQWRkZWQgZG8tc2hpZnRzIHRlc3QgY2FzZS4KLQkqIGRvLXNoaWZ0cy5TOiBOZXcgZmlsZS4KLQotV2VkIEFwciAyOSAxMjo0OTowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBscy1tb2RhZGRyLlM6IE5ldyB0ZXN0IGZvciBtb2R1bGFyIGFkZHJlc3NpbmcuCi0JKiBNYWtlZmlsZS5pbjogUnVuIGl0LgotCi1XZWQgU2VwICAzIDE0OjMzOjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5TLnJ1bik6IFJlcGxhY2UgLmQzMHYgd2l0aCAucnVuLgotCi1XZWQgQXByICAyIDE0OjEwOjQzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmQzMHYua28pOiBMaW1pdCB0aGUgY3B1IHRpbWUgdG8gNSBzZWNvbmRzLgotCi1XZWQgTWFyIDI2IDExOjEzOjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmQzMHYua28pOiBEaXNhYmxlIHRoZSBzaGVsbCdzIGV4aXQtb24tZXJyb3Igd2hpY2gKLSAJaXMgZW5hYmxlZCBieSBCU0Qgc3R5bGUgbWFrZS4KLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9NYWtlZmlsZS5pbiBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTdmZTQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgdGhlIEdOVSBkZWJ1Z2dlci4KLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXNyY3Jvb3QgPSAkKHNyY2RpcikvLi4KLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAotaG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKLXRhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAotdGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAotCi0KLVNIRUxMID0gL2Jpbi9zaAotU1VCRElSUyA9IEBzdWJkaXJzQAotUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKLQotRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSAkKFJVTlRFU1RfRk9SX1RBUkdFVCkKLQotUlVOVEVTVEZMQUdTID0KLQotUlVOVEVTVF9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uLy4uLy4uL2RlamFnbnUvcnVudGVzdCBdOyB0aGVuIFwKLSAgICBlY2hvICQke3NyY2Rpcn0vLi4vLi4vLi4vZGVqYWdudS9ydW50ZXN0OyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdOyB0aGVuIFwKLSAgICAgIGVjaG8gcnVudGVzdDsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gcnVudGVzdCB8IHNlZCAtZSAnJyAkJHQ7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1BU19GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9nYXMvYXMtbmV3IF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgZWNobyAkKHRhcmdldF9hbGlhcyktYXMgOyBcCi0gIGZpYAotCi1MRF9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9sZC9sZC1uZXcgXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWxkIDsgXAotICBmaWAKLQotUlVOX0ZPUl9UQVJHRVQgPSBgXAotICBpZiBbIC14IC4uLy4uLy4uL3NpbS8ke3RhcmdldF9jcHV9L3J1biBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL3NpbS8ke3RhcmdldF9jcHV9L3J1biA7IFwKLSAgZWxzZSBcCi0gICAgZWNobyAkKHRhcmdldF9hbGlhcyktcnVuIDsgXAotICBmaWAKLQotVEVTVFMgPSBcCi0JZW0tZTAub2sgXAotCWVtLWU0Ny5rbyBcCi0JZW0tcHN0ci5oaSBcCi0JZW0tcGNoci5oaSBcCi0JXAotCWxzLWxkMmgua28gXAotCWxzLWxkMncua28gXAotCWxzLWxkNGJoLmtvIFwKLQlscy1sZDRiaHUua28gXAotCWxzLWxkYi5rbyBcCi0JbHMtbGRidS5rbyBcCi0JbHMtbGRoLmtvIFwKLQlscy1sZGhoLmtvIFwKLQlscy1sZGh1LmtvIFwKLQlscy1sZHcua28gXAotCWxzLW1vZGRlYy5rbyBcCi0JbHMtbW9kaW5jLmtvIFwKLQlscy1tb2RhZGRyLm9rIFwKLQlscy1zdDJoLmhpIFwKLQlscy1zdDJ3LmhpIFwKLQlscy1zdDRoYi5oaSBcCi0JbHMtc3RiLmhpIFwKLQlscy1zdGguaGkgXAotCWxzLXN0aGguaGkgXAotCWxzLXN0dy5oaSBcCi0JXAotCWJyLWJyYS5vayBcCi0JYnItYnJhdG56Lm9rIFwKLQlici1icmF0enIub2sgXAotCWJyLWJzci5vayBcCi0JYnItZGJyYS5rbyBcCi0JYnItZGptcC5rbyBcCi0JYnItZGpzci5vayBcCi0JXAotCW9zLWRidC5vayBcCi0JZG8tZmxhZ3Mub2sgXAotCWRvLXNoaWZ0cy5vayBcCi0JZG8tMndvcmRvcHMub2sgXAotCVwKLQl0cmFwLm9rCi0KLWNoZWNrOiBzYW5pdHkgJChURVNUUykKLXNhbml0eToKLQlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQgPSAkKEFTX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUID0gJChMRF9GT1JfVEFSR0VUKQotCUBldmFsIGVjaG8gUlVOX0ZPUl9UQVJHRVQgPSAkKFJVTl9GT1JfVEFSR0VUKQotCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBwdXQgaW50byB0aHJlZSB0eXBlcwotIyBleGl0IHN1Y2Nlc3MsIGV4aXQgZmFpbCwgcHJpbnQgIkhlbGxvIFdvcmxkIgotCi0udS5sb2c6Ci0JdXVkZWNvZGUgJCoudQotCSQoUlVOX0ZPUl9UQVJHRVQpICQqID4gJCoubG9nCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKLQotLlNVRkZJWEVTOiAudSAub2sgLnJ1biAuaGkgLmtvCi0ucnVuLm9rOgotCXJtIC1mIHRtcC0kKiAkKi5oaQotCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCi0JbXYgdG1wLSQqICQqLm9rCi0ucnVuLmhpOgotCXJtIC1mIHRtcC0kKiAkKi5oaSBkaWZmLSQqCi0JdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKLQllY2hvICJIZWxsbyBXb3JsZCIgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgotCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCi0ucnVuLmtvOgotCXJtIC1mIHRtcC0kKiAkKi5rbwotCXNldCArZSA7IFwKLQl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKLQlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAotCSAgZXhpdCAwIDsgXAotCWVsc2UgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JbXYgdG1wLSQqICQqLmtvCi0KLQotIyBSdWxlcyBmb3IgYnVpbGRpbmcgYWxsIHRoZSB0ZXN0cyBhbmQgcGFja2luZyB0aGVtIGludG8KLSMgdXVlbmNvZGVkIGZpbGVzLgotCi11dWVuY29kZTogZW0tcHN0ci51IGVtLWUwLnUgZW0tZTQ3LnUgZW0tcGNoci51Ci0KLS5TVUZGSVhFUzogLnUgLlMgLnJ1bgotLlMudToKLQlybSAtZiAkKi5vICQqLnJ1bgotCSQoQVNfRk9SX1RBUkdFVCkgJChzcmNkaXIpLyQqLlMgLW8gJCoubwotCSQoTERfRk9SX1RBUkdFVCkgLW8gJCogJCoubwotCXV1ZW5jb2RlIDwgJCogJCogPiAkKi51Ci0Jcm0gLWYgJCoubyAkKgotLlMucnVuOgotCXJtIC1mICQqLm8gJCoucnVuCi0JJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCouUyAtbyAkKi5vCi0JJChMRF9GT1JfVEFSR0VUKSAtbyAkKi5ydW4gJCoubwotCXJtIC1mICQqLm8gJCoKLQotCi0KLSMKLSMgU3RhbmRhcmQKLSMKLWNsZWFuIG1vc3RseWNsZWFuOgotCS1ybSAtZiAqfiBjb3JlICoubyBhLm91dCAqLnggKi5ncnQKLQlybSAtZiAkKFRFU1RTKQotIwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCi0jCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKLSMJICAgIGRvIFwKLSMJCSAgICBlY2hvICIkJGRpcjoiOyBcCi0jCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKLSMJCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGNsZWFuKTsgXAotIwkJICAgIGZpOyBcCi0jCSAgICBkb25lIDsgXAotIwllbHNlIHRydWU7IGZpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQktcm0gLWYgKn4gY29yZQotCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKLQktcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCi0jCWlmIFsgeCIke1NVQkRJUlN9IiAhPSB4IF0gOyB0aGVuIFwKLSMJICAgIGZvciBkaXIgaW4gJHtTVUJESVJTfTsgXAotIwkgICAgZG8gXAotIwkJICAgIGVjaG8gIiQkZGlyOiI7IFwKLSMJCSAgICBpZiBbIC1kICQkZGlyIF07IHRoZW4gXAotIwkJCSAgICAoY2QgJCRkaXI7ICQoTUFLRSkgZGlzdGNsZWFuKTsgXAotIwkJICAgIGZpOyBcCi0jCSAgICBkb25lIDsgXAotIwllbHNlIHRydWU7IGZpCi0KLU1ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzU4YjgyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JYWRkIHIzLCByMCwgZGVzdDEKLQlzdWIgcjMsIHIzLCBvZmYxCi1vZmYxOgotCWJyYSByMwotCi0JLmFsaWduIDQKLWRlc3QxOgkKLQlicmEgZGVzdDIKLQotCS5hbGlnbiA1Ci1kZXN0MjoJCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0bnouUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhdG56LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTA0OGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0bnouUworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQlhZGQgcjMsIHIwLCBkZXN0MQotCXN1YiByMywgcjMsIG9mZjEKLW9mZjE6Ci0JYnJhdG56IHIzLCByMwotCi0JLmFsaWduIDQKLWRlc3QxOgkKLQlicmF0bnogcjAsIGRlc3QyCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCi0JLmFsaWduIDUKLWRlc3QyOgkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhdHpyLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYXR6ci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODMzMzZlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhdHpyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JYWRkIHIzLCByMCwgZGVzdDEKLQlzdWIgcjMsIHIzLCBvZmYxCi1vZmYxOgotCWJyYXR6ciByMiwgcjMKLQotCS5hbGlnbiA0Ci1kZXN0MToJCi0JYnJhdHpyIHIzLCBkZXN0MgotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQotCS5hbGlnbiA1Ci1kZXN0MjoJCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJzci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1ic3IuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyOWY5Ny4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJzci5TCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCSMgdmVyaWZ5IHRoYXQgdGhlIHJldHVybiBhZGRyZXNzIGlzIHNldCBjb3JyZWN0bHkKLQlhZGQgcjIsIHIwLCAxCi0JYWRkIHIzLCByMCwgZGVzdDEKLQlzdWIgcjMsIHIzLCBvZmYxCi1vZmYxOgotCWJzciByMyB8fCBub3AKLXJldDE6Ci0KLQkuYWxpZ24gNQotZGVzdDE6CQotCXN1YiByMiwgcjYyLCByZXQxCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kYnJhLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRicmEuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3YzU5Zi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRicmEuUworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMgcGVyZm9ybSBhIGRlbGF5ZWQgYnJhbmNoIDQ3IGluc3RydWN0aW9ucyBsYXRlcgotCWFkZCByMywgcjAsIDQ3Ci0Jc3JsIHIzLCByMywgLTMKLQlkYnJhIHIzLCBkZXN0Ci0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0KLS5hbGlnbiA0Ci1kZXN0OgkKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRqbXAuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItZGptcC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFmOTk2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItZGptcC5TCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIyBwZXJmb3JtIGEgZGVsYXllZCBqdW1wIDQ3IGluc3RydWN0aW9ucyBsYXRlcgotCWFkZCByMywgcjAsIGluc240NwotCWRqbXAgcjMsIGRlc3QKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLWluc240NzogIyBhY3R1YWxseSA0NQotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCi0uYWxpZ24gNAotZGVzdDoJCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kanNyLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRqc3IuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkNDdkMi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRqc3IuUworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSAgICAgICAgIyBUZXN0IG1hY3JvCi0KLSAgICAgICAgLm1hY3JvIGFzc2VydCByZWcsdmFsdWUKLSAgICAgICAgY21wZXEgZjAsXHJlZyxcdmFsdWUKLSAgICAgICAgYnJhL2Z4IGZhaWwKLSAgICAgICAgLmVuZG0KLQotCQotCSMgUFIgMTgyMzAKLQkKLQlhZGQgIHI2MixyMCwweGZmZmZmZmZmIHx8IG5vcAotCWFkZCAgcjEscjAsMjQgfHwgbm9wCi0JZGpzciByMSx0ZXN0X2VuZAotCWFkZCAgcjIscjAscjYyCi10ZXN0X2VuZDoJbm9wCi0JCi0JYXNzZXJ0IHIyLCAweDAwMDAwMDMwCi0JYXNzZXJ0IHI2MiwgMHgwMDAwMDAzMAotCi0JCQkKLSMgY2hlY2sgcmV0dXJuIGFkZHJlc3MgY29ycmVjdGx5IHNldCBieSBhIGRqc3IgaW5zbgotCi0JYWRkIHIzLCByMCwgbGFzdAotCXN1YiByMywgcjMsIHN0YXJ0Ci1zdGFydDoJCi0JZGpzciByMywgZGVzdAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLWxhc3Q6Ci0JYWRkIHIyLCByMiwgMSB8fCBub3AKLW5leHRpOgkKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCWFkZCByMiwgcjIsIDEgfHwgbm9wCi0JYWRkIHIyLCByMiwgMSB8fCBub3AKLQlhZGQgcjIsIHIyLCAxIHx8IG5vcAotCi0uYWxpZ24gNAotZGVzdDoKLQotCWFzc2VydCByNjIsbmV4dGkKLQotCi0KLQkjIGFsbCBva2F5Ci0JYnJhIG9rCi0JCQotb2s6Ci0gICAgICAgIGFkZCByMiwgcjAsIDAKLSAgICAgICAgLmxvbmcgMHgwZTAwMDAwNAotICAgICAgICBub3AKLQotZmFpbDoKLSAgICAgICAgYWRkIHIyLCByMCwgNDcKLSAgICAgICAgLmxvbmcgMHgwZTAwMDAwNAotICAgICAgICBub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvY29uZmlndXJlIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0NTE4YTAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMCAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEwIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1DQz0ke0NDLWNjfQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIHNlZCAtbiAicy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9XCR7XDE9J1wyJ30vcCIgXAotICA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCi0jIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgotIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgotY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZwotcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKLXMlXFslXFwmJWcKLXMlXF0lXFwmJWcKLXMlXCQlJCQlZwotRU9GCi1ERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKLXJtIC1mIGNvbmZ0ZXN0LmRlZnMKLQotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTAiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQENDQCUkQ0MlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotCi1DRU9GCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyUuKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCByZWxhdGl2ZSBzcmNkaXIsIGV0Yy4gZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi0iIC1mIGNvbmZ0ZXN0LnN1YnMgJGFjX2dpdmVuX3NyY2Rpci8kYWNfZmlsZV9pbiA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3Quc3VicwotCi0KLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDM4OWUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgotZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQotZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLWRubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KLQotQUNfUFJFUkVRKDIuNSkKLWRubCBGSVhNRSAtIHRoaW5rIG9mIGEgdHJ1bHkgdW5pcSBmaWxlIHRvIHRoaXMgZGlyZWN0b3J5Ci1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1DQz0ke0NDLWNjfQotQUNfU1VCU1QoQ0MpCi1BQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uKQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BQ19TVUJTVCh0YXJnZXRfY3B1KQotCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tMndvcmRvcHMuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tMndvcmRvcHMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhOTJlNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2RvLTJ3b3Jkb3BzLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0JIyBUZXN0IG1hY3JvCi0KLQkubWFjcm8gYXNzZXJ0IHJlZyx2YWx1ZQotCWNtcGVxIGYwLFxyZWcsXHZhbHVlCi0JYnJhL2Z4IGZhaWwKLQkuZW5kbQotCi0JLm1hY3JvIG5hc3NlcnQgcmVnLHZhbHVlCi0JY21wbmUgZjAsXHJlZyxcdmFsdWUKLQlicmEvZnggZmFpbAotCS5lbmRtCi0KLQkKLQkjIFBSIDE4NDUyIC0gYS5zCi0KLQlhZGQgcjEsIHIwLCAwCi0JYWRkIHIyLHIwLDB4MTEyMjMzNDQKLQlhZGQgcjMscjAsMHg4ODk5YWFiYgotCW5vcCAgIHx8bXVseDJoIHIwLHIyLHIzCi0KLQlhc3NlcnQgcjAsIDB4MAotCWFzc2VydCByMSwgMHgwCi0KLQkjIHRlc3Qgb3RoZXIgZG91YmxlLXdvcmQgbG9hZHMKLQotCWFkZAlyMixyMCxkYXRhCi0JbGQydwlyMCxAKHIyLDApCi0JYXNzZXJ0CXIwLCAweDAKLQlhc3NlcnQJcjEsIDB4MAotCi0JYWRkCXIyLHIwLGRhdGEKLQlsZDJoCXIwLEAocjIsMCkKLQlhc3NlcnQJcjAsIDB4MAotCWFzc2VydAlyMSwgMHgwCi0KLQlhZGQJcjIscjAsZGF0YQotCWxkNGJoCXIwLEAocjIsMCkKLQlhc3NlcnQJcjAsIDB4MAotCWFzc2VydAlyMSwgMHgwCi0KLQlhZGQJcjIscjAsZGF0YQotCWxkNGJodQlyMCxAKHIyLDApCi0JYXNzZXJ0CXIwLCAweDAKLQlhc3NlcnQJcjEsIDB4MAotCi0JCi0JIyBQUiAxODY3OSAtIGEucwotCi0JbGQyaAlyMiwgQChyMCwgYikKLQlsZDJoCXI0LCBAKHIwLCBkKQotCWFzc2VydAlyMiwgMHgwMDAwMTExMQotCWFzc2VydAlyMywgMHhmZmZmODg5OQotCWFzc2VydAlyNCwgMHgwMDAwMTExMQotCWFzc2VydAlyNSwgMHgwMDAwMjIyMgotCQotCQkJCQkKLQkjIGFsbCBva2F5Ci0KLQlicmEJb2sKLQotb2s6Ci0JYWRkIHIyLCByMCwgMAotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKLQotZmFpbDoKLQlhZGQgcjIsIHIwLCA0NwotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKLQotCSMgc29tZSBub24temVybyBkYXRhCi1kYXRhOgotCS5sb25nIDB4MTIzNDU2NzgKLQkubG9uZyAweDlhYmNkZWYwCi0JLmxvbmcgMHhkZWFkYmVlZgotCi1iOgotCS53b3JkIDB4MTExMTg4OTksIDB4MAotZDoKLQkud29yZCAweDExMTEyMjIyLCAweDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tZmxhZ3MuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tZmxhZ3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMTVjZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2RvLWZsYWdzLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotCSMgVGVzdCBtYWNybwotCi0JLm1hY3JvIGFzc2VydCByZWcsdmFsdWUKLQljbXBlcSBmMCxccmVnLFx2YWx1ZQotCWJyYS9meCBmYWlsCi0JLmVuZG0KLQotCi0JIyBQUiAxNTk2NCAtIGEucwotCi0JYWRkICByOCxyMCwweDdmZmY3ZmZmICAgICAgICAgOwotCWFkZCAgcjkscjAsMHg1NTU1NTU1NSAgICAgICAgIDsKLQlhZGQgIHIxMixyMCwweDExMTExMTExICAgICAgICAgOwotCWFkZCAgcjEscjAsMHg4MDAwMDAxMSAgIDsgZm9yIHBzdwotCW12dHN5cyBwc3cscjEgfHxub3AKLQlhZGRoaGhoIHIxMixyOCxyOSB8fGFkZGhsbGwgcjEzLHIxMixyMTIKLQltdmZzeXMgcjIwLHBzdyAgICAgICAgICAgICAgfHxub3AKLQltdnRzeXMgcHN3LHIxIHx8IGFkZCByMixyOCwgcjkKLQltdmZzeXMgcjIxLHBzdyAgICAgICAgICAgICAgfHxub3AKLQotCWFzc2VydCByMjAsIDB4ODAwMDAwMDAKLQlhc3NlcnQgcjIxLCAweDgwMDAwMDE0Ci0KLQkKLQkjIFBSIDE1OTY0IC0gYi5zCi0JCi0JYWRkICByNDAscjAsMHg3ZmZmZmZmZgotCWFkZCAgcjQxLHIwLDB4N2ZmZmZmZmYKLQlhZGQgIHIxLHIwLDB4ODAwMDAwMDAgICAgICAgOyBmb3IgcHN3Ci0JbXZ0c3lzIHBzdyxyMSx8fG5vcAotCWNtcGVxIGYxLHI0MCxyNDEsfHxjbXBlcSBmMCxyNDAscjQxLDsKLQltdmZzeXMgcjQyLHBzdwotCQotCWFzc2VydCByNDIsIDB4ODAwMDUwMDAKLQotCQkKLQkjIFBSIDE2OTkzIC0gYS5zCi0KLQlhZGQgIHI4LHIwLDB4ODAwMDU1NTUgIDsgZm9yIHBzdwotCWFkZCAgcjkscjAsMHg4MDAwMDAwMCAgOyBmb3IgcHN3Ci0JYWRkICByNDAscjAsMHgxMTExMTExMSAgOwotCWFkZCAgcjQxLHIwLDB4MjIyMjIyMjIgIDsKLQlhZGQgIHI0MixyMCwweDAwMDAwMDAwICA7Ci0JbXZ0c3lzIHBzdyxyOCB8fG5vcAotCW12dHN5cyBwc3cscjkgfHxhZGQgcjQyLHI0MCxyNDEsOwotCi0JbXZmc3lzIHIxMCxwc3cKLQlhc3NlcnQgcjEwLCAweDgwMDAwMDAwCi0JCi0KLQkjIFBSIDE2OTk1IC0gYi5zCi0KLQlhZGQgIHI4LHIwLDB4ODAwMDAwMDAgIDsgZm9yIHBzdwotCWFkZCAgcjkscjAsMHg4MDAwNTU1NSAgOyBmb3IgcHN3Ci0JYWRkICByMTAscjAsMHgwMDAwMDAwMCAgOwotCWFkZCAgcjQwLHIwLDB4MTExMTExMTEgIDsKLQlhZGQgIHI0MSxyMCwweDIyMjIyMjIyICA7Ci0JYWRkICByNDIscjAsMHgwMDAwMDAwMCAgOwotCW12dHN5cyBwc3cscjggfHxub3AKLQltdnRzeXMgcHN3LHI5IHx8YWRkIHI0MixyNDAscjQxLDsKLQotCW12ZnN5cyByMTAscHN3Ci0JYXNzZXJ0IHIxMCwgMHg4MDAwNTU0NAotCQotCi0JIyBQUiAxNzAwNiAtIGMucwotCi0JYWRkICByOCxyMCwweDgwMDA1NTU1ICA7IGZvciBwc3cKLQlhZGQgIHI5LHIwLDB4ODAwMDAwMDAgIDsgZm9yIHBzdwotCWFkZCAgcjEwLHIwLDB4MDAwMDAwMDAgIDsKLQlhZGQgIHI0MCxyMCwweDAwMDAwMDExICA7Ci0JYWRkICByNDEscjAsMHgwMDAwMDAxMSAgOwotCW12dHN5cyBwc3cscjggfHxub3AKLQltdnRzeXMgcHN3LHI5IHx8Y21wZXEgZjUscjQwLHI0MSw7Ci0JCQotCW12ZnN5cyByMTAscHN3Ci0JYXNzZXJ0IHIxMCwgMHg4MDAwMDAxMAotCi0KLQkjIFBSIDE3MDA2IC0gZC5zCi0KLQlhZGQgIHI5LHIwLDB4ODAwMDAwMDAgIDsgZm9yIHBzdwotCWFkZCAgcjQwLHIwLDB4MDAwMDAwMTEgIDsKLQlhZGQgIHI0MSxyMCwweDAwMDAwMDExICA7Ci0Jbm9wICB8fG5vcAotCW12dHN5cyBwc3csIHI5IHx8IG5vcAotCW5vcCAgfHxub3AKLQlub3AgfHxjbXBlcSBmNSxyNDAscjQxLDsKLQotCW12ZnN5cyByMTAscHN3Ci0JYXNzZXJ0IHIxMCwgMHg4MDAwMDAxMAotCi0JCi0JIyBQUiAxNzEwNiAtIGEucwotCi0JOyB0ZXN0IDAwMCAgICAgOyAgbXZ0c3lzKHM9MCkgfHwgc2F0aGwocz0wKSBwcmFsbGVsIGV4ZWN1dGlvbiB0ZXN0Ci0JYWRkICByOCxyMCwweDgwMDA1NTU1ICA7IGZvciBwc3cKLQlhZGQgIHI5LHIwLDB4ODAwMDAwMDAgIDsgZm9yIHBzdwotCWFkZCAgcjQwLHIwLDB4MDAwMDAwNDQgIDsKLQlhZGQgIHI0MSxyMCwweDAwMDAwMDA4ICA7Ci0JbXZ0c3lzIHBzdyxyOCB8fG5vcAotCW12dHN5cyBwc3cscjkgfHxzYXRobCByMzAscjQwLHI0MSw7Ci0JbXZmc3lzIHIyMCwgcHN3IHx8bm9wCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQk7IHRlc3QgMDAxICAgICA7ICBtdnRzeXMocz0wKSB8fCBzYXRobChzPTEpIHByYWxsZWwgZXhlY3V0aW9uIHRlc3QKLQlfdGVzdF8wMDE6Ci0JYWRkICByNDAscjAsMHgwMDAwNDQ0NCAgOwotCWFkZCAgcjQxLHIwLDB4MDAwMDAwMDggIDsKLQltdnRzeXMgcHN3LHI4IHx8bm9wCi0JbXZ0c3lzIHBzdyxyOSB8fHNhdGhsIHIzMSxyNDAscjQxLDsKLQltdmZzeXMgcjIxLHBzdyB8fG5vcAotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JOyB0ZXN0IDAwMiAgICAgOyAgbXZ0c3lzKHM9MSkgfHwgc2F0aGwocz0wKSBwcmFsbGVsIGV4ZWN1dGlvbiB0ZXN0Ci0JYWRkICByOCxyMCwweDgwMDAwMDAwICA7IGZvciBwc3cKLQlhZGQgIHI5LHIwLDB4ODAwMDU1NTUgIDsgZm9yIHBzdwotCWFkZCAgcjQwLHIwLDB4MDAwMDAwNDQgIDsKLQlhZGQgIHI0MSxyMCwweDAwMDAwMDA4ICA7Ci0JbXZ0c3lzIHBzdyxyOCB8fG5vcAotCW12dHN5cyBwc3cscjkgfHxzYXRobCByMzIscjQwLHI0MSw7Ci0JbXZmc3lzIHIyMixwc3cgICAgICAgICAgICAgfHxub3AKLQk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTsgdGVzdCAwMDMgICAgIDsgIG12dHN5cyhzPTEpIHx8IHNhdGhsKHM9MSkgcHJhbGxlbCBleGVjdXRpb24gdGVzdAotCTsgICBpbml0LXJlZwotCWFkZCAgcjQwLHIwLDB4MDAwMDQ0NDQgIDsKLQlhZGQgIHI0MSxyMCwweDAwMDAwMDA4ICA7Ci0JbXZ0c3lzIHBzdyxyOCB8fG5vcAotCW12dHN5cyBwc3cscjkgfHxzYXRobCByMzMscjQwLHI0MSw7Ci0JbXZmc3lzIHIyMyxwc3cgICAgICAgICAgICAgfHxub3AKLQotCWFzc2VydCByMjAsIDB4ODAwMDAwMDAKLQlhc3NlcnQgcjIxLCAweDgwMDAwMDQwCi0JYXNzZXJ0IHIyMiwgMHg4MDAwNTU1NQotCWFzc2VydCByMjMsIDB4ODAwMDU1MTUKLQotCQotCSMgUFIgMTgyODggLSBhLnMKLQotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQk7IG12dHN5cyAoQyA9MSwgVj0gVkEgPSAwKSB8fCAgYWRkYyAoQz0gVj0gVkEgPTApCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXRlc3RfMDAwYjoKLQlhZGQgcjEscjAsMSAgIHx8bm9wICA7IHNldCBDIGJpdAotCW12dHN5cyBwc3cgcjAgfHxub3AKLQltdnRzeXMgcHN3IHIxIHx8YWRkYyByMjAscjAsMSAKLQltdmZzeXMgcjEwLHBzdyB8fG5vcAotCTsgQyBjaGFuZ2VkIGluIE1VIGlzIG5vdCB1c2VkIGluIElVLgotCTsgSVUgcHJldmFpbCBmb3IgcmVzdWx0aW5nIEMuIAotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQk7IG12dHN5cyAoViA9MSwgQyA9IFZBID0gMCkgfHwgIGFkZCAoQz0gVj0gVkEgPTApCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXRlc3RfMDAxYjoKLQlhZGQgcjEscjAsMHgxMCB8fG5vcCAgOyBzZXQgViBiaXQKLQltdnRzeXMgcHN3IHIwIHx8bm9wCi0JbXZ0c3lzIHBzdyByMSB8fGFkZCByMCxyMCxyMAotCW12ZnN5cyByMTEscHN3IHx8bm9wCi0JOyBJVSBwcmV2YWlsIGZvciByZXN1bHRpbmcgVi4KLQk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JOyBtdnRzeXMgKFYgPSBDPSBWQSA9IDApIHx8ICBhZGQgKEM9MCxWPSBWQSA9MSkKLQk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JdGVzdF8wMDJiOgotCWFkZCByMSxyMCwweDcwMDAwMDAwCi0JYWRkIHIyLHIwLDB4MzAwMDAwMDAKLQltdnRzeXMgcHN3IHIwIHx8bm9wCi0JbXZ0c3lzIHBzdyByMCB8fGFkZCByMCxyMSxyMgotCW12ZnN5cyByMTIscHN3IHx8bm9wCi0JOyBJVSBwcmV2YWlsIGZvciByZXN1bHRpbmcgVi4gCi0JOyBWQSBpcyBzZXQoT1InZWQpCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTsgbXZ0c3lzIChDPSAwIFYgPSBWQSA9IDEpIHx8ICBhZGQgKEM9IFY9IFZBID0wKQotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQl0ZXN0XzAwM2I6Ci0JYWRkIHIxLHIwLDB4MTQgfHxub3AgIDsgc2V0IFYgYW5kIFZBIGJpdAotCW12dHN5cyBwc3cgcjAgfHxub3AKLQltdnRzeXMgcHN3IHIxIHx8YWRkIHIwLHIwLHIwCi0JbXZmc3lzIHIxMyxwc3cgfHxub3AKLQk7IElVIHByZXZhaWwgZm9yIHJlc3VsZ2luZyBWCi0JOyBWQSBpcyBzZXQoT1InZWQpCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTsgbXZ0c3lzIChmMyA9MSkgfHwgIG9yZmcgKGYzKSA6IEdST1VQX0IKLQk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JdGVzdF8wMDRiOgotCWFkZCByMSxyMCwweDEwMCA7IHNldCBmMwotCW12dHN5cyBwc3cgcjAgfHxub3AKLQltdnRzeXMgcHN3LHIxIHx8b3JmZyBmMyxmMywwCi0JbXZmc3lzIHIxNCxwc3cgfHxub3AKLQk7IHJlc3VsdHMgb2YgSVUgcHJldmFpbC4gCi0JOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTsgbXZ0c3lzIChmNCA9MSkgfHwgIHNhdGhwIAotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQl0ZXN0XzAwNWI6Ci0JYWRkIHIxLHIwLDB4NDAgOyBzZXQgZjQKLQltdnRzeXMgcHN3IHIwIHx8bm9wCi0JbXZ0c3lzIHBzdyByMSB8fHNhdGhsIHIyLHIxLDMKLQltdmZzeXMgcjE1LHBzdyB8fG5vcAotCTsgcmVzdWx0cyBvZiBNVSBpcyB1c2VkIGluIElVCi0KLQlhc3NlcnQgcjIwLCAweDEKLQlhc3NlcnQgcjEwLCAweDAKLQlhc3NlcnQgcjExLCAweDAKLQlhc3NlcnQgcjEyLCAweDE0Ci0JYXNzZXJ0IHIxMywgMHg0Ci0JYXNzZXJ0IHIxNCwgMHgwCi0JYXNzZXJ0IHIxNSwgMHgwCi0KLQkKLQkjIFBSIDE4Mjg4IC0gYi5zCi0JYWRkIHI3LHIwLDB4ODAwMDAwMDAKLQltdnRzeXMgcHN3LHI3IHx8IG5vcAotCQkKLQlhZGQgcjgscjAsMHg3ZmZmN2ZmZiAgICAgICAgIDsKLQlhZGQgcjkscjAsMHg1NTU1NTU1NSAgICAgICAgIDsKLQlhZGQgcjEyLHIwLDB4MTExMTExMTEgICAgICAgICA7Ci0JYWRkIHIxMyxyMCwweDAwMDAwMDAwICAgICAgICAgOwotCWFkZGhoaGggcjEyLHI4LHI5IHx8YWRkaGxsbCByMTMscjEyLHIxMgotCW12ZnN5cyByNjAscHN3ICAgICAgICAgICAgICB8fG5vcAotCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlhZGQgcjIwLHIwLDB4NjY2NjY2NjYgIDsKLQlhZGQgcjIxLHIwLDB4Nzc3Nzc3NzcgIDsKLQlhZGQgcjQwLHIwLDB4MjIyMjIyMjIgIDsKLQlhZGQgcjQxLHIwLDB4NTU1NTU1NTUgIDsKLQlhZGQgcjIyLHIyMCxyMjEgfHxhZGQgcjQyLHI0MCxyNDEsOwotCW12ZnN5cyByNjEscHN3ICAgICAgICAgICAgICB8fG5vcAotCi0JYXNzZXJ0IHI2MCwgMHg4MDAwMDAwMAotCWFzc2VydCByNjEsIDB4ODAwMDAwMDAKLQkKLQotCSMgUFIgMTkyMjQKLQotCWFkZCByNyxyMCwweDgwMDAwMDAwCi0JYWRkIHIyLHIwLHIwICAgICAgICAgICAgfHwgbm9wCi0JYWRkIHIxLHIwLDB4MSAgICAgICAgICAgfHwgbm9wCi0JIyBjb25maXJtIHRoYXQgdGhlc2UgaW5zbnMgZG8gbm90IGtpbGwgdGhlIGFkZCBpbiB0aGUgcmlnaHQgY29udGFpbmVyCi0JbXZ0c3lzIHBzdyxyNyAgICAgICAgICAgLT4gYWRkIHIyLHIyLHIxCi0JbXZ0c3lzIHBzd2gscjcgICAgICAgICAgLT4gYWRkIHIyLHIyLHIxCi0JbXZ0c3lzIHBzd2wscjcgICAgICAgICAgLT4gYWRkIHIyLHIyLHIxCQotCW12dHN5cyBmMCxyNyAgICAgICAgICAgIC0+IGFkZCByMixyMixyMQkJCQotCW12dHN5cyBtb2RfcyxyNyAgICAgICAgIC0+IGFkZCByMixyMixyMQkJCQkJCQkKLQotCWFzc2VydCByMiwgMHg1Ci0KLQkJCQkJCQkJCQotCSMgYWxsIG9rYXkKLQotCWJyYQlvawotCi1vazoKLQlhZGQgcjIsIHIwLCAwCi0JLmxvbmcgMHgwZTAwMDAwNAotCW5vcAotCi1mYWlsOgotCWFkZCByMiwgcjAsIDQ3Ci0JLmxvbmcgMHgwZTAwMDAwNAotCW5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9kby1zaGlmdHMuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tc2hpZnRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDEyOWYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9kby1zaGlmdHMuUworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0JIyBUZXN0IG1hY3JvCi0KLQkubWFjcm8gYXNzZXJ0IHJlZyx2YWx1ZQotCWNtcGVxIGYwLFxyZWcsXHZhbHVlCi0JYnJhL2Z4IGZhaWwKLQkuZW5kbQotCi0KLQkjIFBSIDE0NTgwIC0gYS5zCi0KLQlhZGQgIHI4LHIwLDB4MTExMTIyMjIKLQlhZGQgIHI5LHIwLC0zMgotCXNyYSByMSxyOCxyOSAgICAgICAgICAgIHx8bm9wCi0Jc3JhIHIyLHI4LC0zMiAgICAgICAgICAgfHxub3AKLQlzcmwgcjMscjgscjkgICAgICAgICAgICB8fG5vcAotCXNybCByNCxyOCwtMzIgICAgICAgICAgIHx8bm9wCi0KLQlhc3NlcnQgcjEsIDAKLQlhc3NlcnQgcjIsIDAKLQlhc3NlcnQgcjMsIDAKLQlhc3NlcnQgcjQsIDAKLQotCi0JIyBQUiAxNzI2NiAtIGEucwotCi0JYWRkIHIyMCwgcjAsIDB4ZmZmZmZmZmYKLQlhZGQgcjIxLCByMCwgMHhmZmZmZmZmZgotCWFkZCByMjIsIHIwLCAweGZmZmZmZmZmCi0JYWRkIHIyMywgcjAsIDB4ZmZmZmZmZmYKLQlhZGQgcjEsIHIwLCAweDEyMzQ1Njc4IAotCWFkZCByMiwgcjAsIC0zMwotCXNyYWhoIHIyMCwgcjEsIHIyCi0Jc3JhaGwgcjIxLCByMSwgcjIKLQlzcmxoaCByMjIsIHIxLCByMgotCXNybGhsIHIyMywgcjEsIHIyCi0Jc3JhIHIyNCwgcjEsIHIyCi0Jc3JsIHIyNSwgcjEsIHIyCi0Jcm90IHIyNiwgcjEsIHIyCi0KLQlhc3NlcnQgcjIwLCAweGFjZjBmZmZmCi0JYXNzZXJ0IHIyMSwgMHhmZmZmYWNmMAotCWFzc2VydCByMjIsIDB4YWNmMGZmZmYKLQlhc3NlcnQgcjIzLCAweGZmZmZhY2YwCi0JYXNzZXJ0IHIyNCwgMHgyNDY4YWNmMAotCWFzc2VydCByMjUsIDB4MjQ2OGFjZjAKLQlhc3NlcnQgcjI2LCAweDI0NjhhY2YwCi0KLQkKLQkjIFBSIDE3MjY2IC0gYTIucwotCi0JYWRkIHIyMCwgcjAsIDB4ZmZmZmZmZmYKLQlhZGQgcjIxLCByMCwgMHhmZmZmZmZmZgotCWFkZCByMjIsIHIwLCAweGZmZmZmZmZmCi0JYWRkIHIyMywgcjAsIDB4ZmZmZmZmZmYKLQlhZGQgcjEsIHIwLCAweDEyMzQ1Njc4IAotCWFkZCByMiwgcjAsIC0xNwotCXNyYTJoIHIyMCwgcjEsIHIyCi0Jc3JsMmggcjIxLCByMSwgcjIKLQlyb3QyaCByMjIsIHIxLCByMgotCi0JYXNzZXJ0IHIyMCwgMHgyNDY4YWNmMAotCWFzc2VydCByMjEsIDB4MjQ2OGFjZjAKLQlhc3NlcnQgcjIyLCAweDI0NjhhY2YwCi0KLQotCSMgUFIgMTc2ODUgLSBhLnMKLQotCWFkZCByMjAscjAscjAKLQlhZGQgcjIxLHIwLHIwCi0JYWRkIHIyMixyMCxyMAotCWFkZCByMjMscjAscjAKLQlhZGQgcjI0LHIwLHIwCi0JYWRkIHIyNSxyMCxyMAotCWFkZCByMzAscjAscjAKLQlhZGQgcjMxLHIwLHIwCi0KLQlhZGQgIHI4LHIwLDB4NTU1NTU1NTUKLQlhZGQgIHI5LHIwLDB4MWYKLQlzcmEgcjIwLHI4LHI5IHx8bm9wCi0Jc3JsIHIyMSxyOCxyOSB8fG5vcAotCXNyYWhoIHIyMixyOCxyOSB8fG5vcAotCXNyYWhsIHIyMyxyOCxyOSB8fG5vcAotCXNybGhoIHIyNCxyOCxyOSB8fG5vcAotCXNybGhsIHIyNSxyOCxyOSB8fG5vcAotCi0JYWRkICByOCxyMCwweDU1NTVhYWFhCi0JYWRkICByOSxyMCwweDAwMGZmZmYxCi0Jc3JhMmggcjMwLHI4LHI5IHx8bm9wCi0Jc3JsMmggcjMxLHI4LHI5IHx8bm9wCi0KLQlhc3NlcnQJcjIwLCAwCi0JYXNzZXJ0CXIyMSwgMAotCWFzc2VydAlyMjIsIDAKLQlhc3NlcnQJcjIzLCAwCi0JYXNzZXJ0CXIyNCwgMAotCWFzc2VydAlyMjUsIDAKLQlhc3NlcnQJcjMwLCAwCi0JYXNzZXJ0CXIzMSwgMAotCi0JCi0JIyBQUiAxODE5NiAtIGEucwotCi0JYWRkIHIxLHIwLDB4ZmVkY2JhOTgKLQlhZGQgcjIscjAsMHg3NjU0MzIxMAotCWFkZCByMyxyMCwweDQxICAgICAgICAgICAKLQlhZGQgcjQscjAsMSAgICAgICAgICAgCi0Jbm9wICAgICAgICAgICAgICAgICAgICAgIHx8IG12dGFjYyBhMCByMSxyMgotCW5vcCAgICAgICAgICAgICAgICAgICAgICB8fCBtdmZhY2MgcjEwLGEwIHIzICAgICAgCi0Jbm9wICAgICAgICAgICAgICAgICAgICAgIHx8IG12ZmFjYyByMTEsYTAgcjQgICAgICAKLQotCWFzc2VydCByMTAsIDB4M2IyYTE5MDgKLQlhc3NlcnQgcjExLCAweDNiMmExOTA4Ci0KLQkKLQkjIFBSIDE4MzI5IC0gYS5zCi0KLQlhZGQgcjEwLHIwLDAgIHx8IGFkZCByMixyMCwtMQotCWFkZCByMTEscjAsMCAgfHwgYWRkIHIxMixyMCwwCi0JYWRkIHIxMyxyMCwwICB8fCBhZGQgcjE0LHIwLDAKLQlhZGQgcjE1LHIwLDAgIHx8IGFkZCByMTYscjAsMAotCWFkZCByMTcscjAsMCAgfHwgYWRkIHIxOCxyMCwwCi0JCi0JYWRkIHIzLHIwLDB4MDAwMDAwMjAgICAgOyAzMgotCXNyYyByMTAscjIscjMKLQlhZGQgcjMscjAsMHgwMDAwMDAyMSAgICA7IDMzCi0Jc3JjIHIxMSxyMixyMwotCWFkZCByMyxyMCwweDAwMDAwMDNmICAgIDsgNjMKLQlzcmMgcjEyLHIyLHIzCi0JYWRkIHIzLHIwLDB4MDAwMDAwNDAgICAgOzY0Ci0Jc3JjIHIxMyxyMixyMwotCWFkZCByMyxyMCwweDAwMDAwMDQxICAgIDs2NQotCXNyYyByMTQscjIscjMKLQkKLQlhZGQgcjMscjAsMHhmZmZmZmZkZiAgICA7LTMzCi0Jc3JjIHIxNSxyMixyMwotCWFkZCByMyxyMCwweGZmZmZmZmMxICAgIDstNjMKLQlzcmMgcjE2LHIyLHIzCi0JYWRkIHIzLHIwLDB4ZmZmZmZmYzAgICAgOy02NAotCXNyYyByMTcscjIscjMKLQlhZGQgcjMscjAsMHhmZmZmZmZiZiAgICA7LTY1Ci0Jc3JjIHIxOCxyMixyMwotCQotCWFzc2VydCByMTAsIDB4MDAwMDAwMDAKLQlhc3NlcnQgcjExLCAweDgwMDAwMDAwCi0JYXNzZXJ0IHIxMiwgMHhmZmZmZmZmZQotCWFzc2VydCByMTMsIDB4MDAwMDAwMDAKLQlhc3NlcnQgcjE0LCAweDgwMDAwMDAwCi0JYXNzZXJ0IHIxNSwgMHgwMDAwMDAwMQotCWFzc2VydCByMTYsIDB4N2ZmZmZmZmYKLQlhc3NlcnQgcjE3LCAweGZmZmZmZmZmCi0JYXNzZXJ0IHIxOCwgMHgwMDAwMDAwMQotCi0KLQkjIFBSIDE4MzY0IC0gYi5zCi0KLQlhZGQgcjEscjAsMHgxMjM0NTY3OAotCWFkZCByMixyMCwweDlhYmNkZWYwCi0JYWRkIHIzLHIwLDB4ZmZmZmZmZTAgOyAtMzIKLQlhZGQgcjQscjAsMHhmZmZmZmZjMCA7IC02NAotCXNyYyByMSxyMixyMyB8fG5vcAotCWFkZCByMTAscjEscjAgfHxub3AKLQlhZGQgcjEscjAsMHgxMjM0NTY3OAotCXNyYyByMSxyMixyNCB8fG5vcAotCWFkZCByMTEscjEscjAgfHxub3AKLQotCWFzc2VydCByMTAsIDB4OWFiY2RlZjAKLQlhc3NlcnQgcjExLCAweDlhYmNkZWYwCi0KLQkJCQkKLQkjIGFsbCBva2F5Ci0KLQlicmEJb2sKLQotb2s6Ci0JYWRkIHIyLCByMCwgMAotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKLQotZmFpbDoKLQlhZGQgcjIsIHIwLCA0NwotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tZTAuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tZTAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlOTMzNS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2VtLWUwLlMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgVmVyaWZ5IHRoYXQgdGhlIGV4aXQgY2FsbCB3b3JrcwotCWFkZCByMiwgcjAsIDAgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNAotCW5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1lNDcuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tZTQ3LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzBmZmIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1lNDcuUworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBWZXJpZnkgcjIgPSA0NzsgZXhpdChyNDcpIHdvcmtzCi0JYWRkIHIyLCByMCwgNDcKLQkubG9uZyAweDBlMDAwMDA0Ci0Jbm9wCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2VtLXBjaHIuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tcGNoci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM4YjBiLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tcGNoci5TCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0JYWRkIHIyLCByMCwgJ0gnIAotCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKLQlhZGQgcjIsIHIwLCAnZScKLQkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCi0JYWRkIHIyLCByMCwgJ2wnCi0JLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAotCWFkZCByMiwgcjAsICdsJwotCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKLQlhZGQgcjIsIHIwLCAnbycKLQkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCi0JYWRkIHIyLCByMCwgJyAnCi0JLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAotCWFkZCByMiwgcjAsICdXJwotCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKLQlhZGQgcjIsIHIwLCAnbycKLQkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCi0JYWRkIHIyLCByMCwgJ3InCi0JLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAotCWFkZCByMiwgcjAsICdsJwotCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKLQlhZGQgcjIsIHIwLCAnZCcKLQkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCi0JYWRkIHIyLCByMCwgJ1xuJyB8fCBub3AKLQkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCi0JIyBmaW5pc2hlZAotCWFkZCByMiwgcjAsIHIwIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tcHN0ci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1wc3RyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTJjMzUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1wc3RyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQlhZGQgcjIsIHIwLCBoZWxsbwotCSMgcHV0c3RyCi0JLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAotCSMgZmluaXNoZWQKLQlhZGQgcjIsIHIwLCByMCB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0KLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2V4aXQ0Ny5zIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9leGl0NDcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzMGZmYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2V4aXQ0Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIFZlcmlmeSByMiA9IDQ3OyBleGl0KHI0Nykgd29ya3MKLQlhZGQgcjIsIHIwLCA0NwotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvaGVsbG8ucyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvaGVsbG8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNjI5ZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2hlbGxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkKLQlhZGQgcjIsIHIwLCBoZWxsbwotCSMgcHV0c3RyCi0JLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAotCSMgZmluaXNoZWQKLQlhZGQgcjIsIHIwLCByMCB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0KLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXHJcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbG9vcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9sb29wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjI2OTIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9sb29wLnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1sb29wOglicmEgbG9vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDJoLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMmguUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkZTE0ZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMmguUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkjIGNvbXB1dGUgMTcobWVtKSArIDMwKG1lbSsyKSA9IDQ3Ci0JYWRkIHIzLCByMCwgNCB8fCBub3AKLQlsZDJoIHIyLCBAKHIzLDYwKQotCWFkZCByMiwgcjIsIHIzIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAtMSwgLTEKLSMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQotCS5ieXRlIDAsIDE3LCAwLCAzMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDJ3LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMncuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NjRjYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMncuUworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkjIGNvbXB1dGUgMTcobWVtKSArIDMwKG1lbSs0KSA9IDQ3Ci0JYWRkIHIzLCByMCwgNCB8fCBub3AKLQlsZDJ3IHIyLCBAKHIzLDYwKQotCWFkZCByMiwgcjIsIHIzIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAtMSwgLTEKLSMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQotCS5ieXRlIDAsIDAsIDAsIDE3Ci0JLmJ5dGUgMCwgMCwgMCwgMzAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQ0YmguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQ0YmguUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyMmNlYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkNGJoLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JIyBjb21wdXRlIGxvIDogMTcobWVtKzEpICsgMzAobWVtKzMpID0gNDcKLQkjIGNvbXB1dGUgaGkgOiAtMShtZW0pICsgMShtZW0rMikgPSAwCQotCWFkZCByMywgcjAsIDQgfHwgbm9wCi0JbGQ0YmggcjIsIEAocjMsNjApCi0JYWRkIHIyLCByMiwgcjMgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIC0xLCAtMQotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgLTEsIDE3LCAxLCAzMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDRiaHUuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQ0Ymh1LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMGE5YTMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDRiaHUuUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkjIGNvbXB1dGUgbG8gOiA0OChtZW0rMSkgKyAyNTUobWVtKzMpIC0gMjU2ID0gNDcKLQlhZGQgcjMsIHIwLCA0IHx8IG5vcAotCWxkNGJodSByMiwgQChyMyw2MCkKLQlhZGQgcjIsIHIyLCByMyB8fCBub3AKLQlzdWIgcjIsIHIyLCAweDEwMAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIC0xLCAtMQotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgMCwgNDgsIDAsIDI1NQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGIuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRiLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTY0Y2UuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGIuUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkjIGNvbXB1dGUgLTIoZnJvbSBtZW0pICsgNDkgPSA0NwotCWFkZCByMywgcjAsIDQgfHwgbm9wCi0JbGRiIHIyLCBAKHIzLDYwKQotCWFkZCByMiwgcjIsIDQ5Ci0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIC0xLCAtMQotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgLTIsIDB4ZmYsIDB4ZmYsIDB4ZmYKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRidS5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGJ1LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1M2Q2YTQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGJ1LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JIyBjb21wdXRlIDI1NChtZW0pIC0gMjA3ID0gNDcKLQlhZGQgcjMsIHIwLCA0IHx8IG5vcAotCWxkYnUgcjIsIEAocjMsNjApCi0Jc3ViIHIyLCByMiwgMjA3Ci0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIC0xLCAtMQotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgLTIsIDB4ZmYsIDB4ZmYsIDB4ZmYKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwYmMwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JIyBsb2FkIHRoZSA0N0BhZGRyPTYwIGJlbG93IGludG8gcjIKLQlhZGQgcjMsIHIwLCA0IHx8IG5vcAotCWxkaCByMiwgQChyMyw2MCkKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIC0xLCAtMQotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgMCwgNDcsIDB4ZmYsIDB4ZmYKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoaC5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGhoLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmRhZWYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGhoLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JIyBjb21wdXRlICg0NyB8fCAwfDE2KSA+PiAxNgotCWFkZCByMywgcjAsIDQgfHwgbm9wCi0JbGRoaCByMiwgQChyMyw2MCkKLQlzcmwgcjIsIHIyLCAxNiB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgLTEsIC0xCi0jIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKLQkuYnl0ZSAwLCA0NywgMHhmZiwgMHhmZgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGh1LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaHUuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmNTBlMi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaHUuUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkjIGNvbXB1dGUgMjU0KG1lbSkgLSAyMDcgPSA0NwotCWFkZCByMywgcjAsIDQgfHwgbm9wCi0JbGRodSByMiwgQChyMyw2MCkKLQlzdWIgcjIsIHIyLCAyMDcKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgLTEsIC0xCi0jIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKLQkuYnl0ZSAweGZmLCAtMiwgMHhmZiwgMHhmZgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZHcuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGR3LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDJlYmYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZHcuUworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkjIGxvYWQgdGhlIDQ3QGFkZHI9NjAgYmVsb3cgaW50byByMgotCWFkZCByMywgcjAsIDQgfHwgbm9wCi0JbGR3IHIyLCBAKHIzLDYwKQotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotCS5sb25nIDAsIDAKLQkubG9uZyAwLCAwCi0JLmxvbmcgMCwgMAotIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCi0JLmJ5dGUgMCwgMCwgMCwgNDcKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kYWRkci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1tb2RhZGRyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDI4YWIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1tb2RhZGRyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0JOyBNb2R1bGFyIGFkZHJlc3MgcG9zdGluY3JlbWVudC9wb3N0ZGVjcmVtZW50IHRlc3QKLQkKLXN0YXJ0OgkKLQk7ICBwcm9ncmFtIFBTVyBmb3IgbW9kdWxhciBhZGRyZXNzIG1vZGUKLQlhZGQgIHIxLHIwLDB4ODEwMDAwMDAKLQlub3AgfHwgbm9wCi0JbXZ0c3lzIHBzdyxyMSB8fCBub3AKLQlub3AgfHwgbm9wCi0JCi10ZXN0MToJCi0JOyBzZXQgbW9kdWxhciBhZGRyZXNzIGxpbWl0czogMHgxOCBieXRlcwotCWFkZCAgcjEscjAsMHgyMDAwMDA3MCAgICA7IFtzdGFydCwgLi4uCi0Jbm9wIHx8IG5vcAotCW12dHN5cyBtb2RfcyxyMSB8fCBub3AKLQlub3AgfHwgbm9wCi0JYWRkICByMSxyMCwweDIwMDAwMDg4ICAgIDsgLi4uLCBlbmQpCi0Jbm9wIHx8IG5vcAotCW12dHN5cyBtb2RfZSxyMSB8fCBub3AKLQotCTsgbW9kdWxhciBhdXRvaW5jcmVtZW50IHRlc3QKLQlhZGQJcjMwLHIwLDB4MjAwMDAwNzAgOyBiYXNlIGFkZHJlc3MgPSBtb2RfcwotCWxkMncJcjQwLEAocjMwKyxyMCkgfHwgbm9wIDsgYWZ0ZXI6ICAgICByMzAgPSAuLi4wNzgKLQlsZDJ3CXI0MCxAKHIzMCsscjApIHx8IG5vcCA7IGFmdGVyOglyMzAgPSAuLi4wODAKLQlsZDJ3CXI0MCxAKHIzMCsscjApIHx8IG5vcCA7IGFmdGVyOglyMzAgPSAuLi4wNzAKLQkKLQlhZGQJcjI5LHIwLDB4MjAwMDAwNzAgOyBleHBlY3RlZCBlbmQgYWRkcmVzczsgd3JhcHBpbmcgYXJvdW5kCi0JY21wZXEJZjEscjMwLHIyOQotCWJyYS94ZglmYWlsCi0KLXRlc3QyOgkKLQk7IHNldCBtb2R1bGFyIGFkZHJlc3MgbGltaXRzOiAweDE4IGJ5dGVzCi0JYWRkICByMSxyMCwweDIwMDAwMDg4ICAgIDsgW3N0YXJ0LCAuLi4KLQlub3AgfHwgbm9wCi0JbXZ0c3lzIG1vZF9zLHIxIHx8IG5vcAotCW5vcCB8fCBub3AKLQlhZGQgIHIxLHIwLDB4MjAwMDAwNzAgICAgOyAuLi4sIGVuZCkKLQlub3AgfHwgbm9wCi0JbXZ0c3lzIG1vZF9lLHIxIHx8IG5vcAotCi0JOyBtb2R1bGFyIGF1dG9kZWNyZW1lbnQgdGVzdAotCWFkZAlyMzAscjAsMHgyMDAwMDA4OCA7IGJhc2UgYWRkcmVzcyA9IG1vZF9zCi0JbGQydwlyNDAsQChyMzAtLHIwKSB8fCBub3AgOyBhZnRlcjogIHIzMCA9IC4uLjA4MAotCWxkMncJcjQwLEAocjMwLSxyMCkgfHwgbm9wIDsgYWZ0ZXI6CXIzMCA9IC4uLjA3OAotCWxkMncJcjQwLEAocjMwLSxyMCkgfHwgbm9wIDsgYWZ0ZXI6CXIzMCA9IC4uLjA4OAotCQotCWFkZAlyMjkscjAsMHgyMDAwMDA4OCA7IGV4cGVjdGVkIGVuZCBhZGRyZXNzOyB3cmFwcGluZyBhcm91bmQKLQljbXBlcQlmMSxyMzAscjI5Ci0JYnJhL3hmCWZhaWwKLQkKLW9rOgkKLQlhZGQJcjIscjAsMAkKLQkubG9uZwkweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0JCQotZmFpbDoJCi0JYWRkCXIyLHIwLDQ3CQotCS5sb25nCTB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kZGVjLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGRlYy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI5MTQzLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kZGVjLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQlhZGQgcjIsIHIwLCA1MAotCW1vZGRlYyByMiwgMyB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGluYy5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1tb2RpbmMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwYzNmNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGluYy5TCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JYWRkIHIyLCByMCwgNDAKLQltb2RpbmMgcjIsIDcgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDJoLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0MmguUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNGIxOS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0MmguUworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQlhZGQgcjIsIHIwLCBoZWxsbwotCWFkZCByNCwgcjAsICgnSCcgPDwgOCkgKyAnZScKLQlhZGQgcjUsIHIwLCAoJ2wnIDw8IDgpICsgJ2wnCi0Jc3QyaCByNCwgQChyMiwwKSB8fCBub3AKLQkjIHB1dHN0cgotCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKLQkjIGZpbmlzaGVkCi0JYWRkIHIyLCByMCwgcjAgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCi0JLmFsaWduIDMKLWhlbGxvOiAgCi0JLmFzY2lpICI/Pz8/byBXb3JsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDJ3LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0MncuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkOGI2Ni4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0MncuUworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQlhZGQgcjIsIHIwLCBoZWxsbwotCWFkZCByNCwgcjAsICgnSCcgPDwgMjQpICsgKCdlJyA8PCAxNikgKyAoJ2wnIDw8IDgpICsgKCdsJyA8PCAwKQotCWFkZCByNSwgcjAsICgnbycgPDwgMjQpICsgKCcgJyA8PCAxNikgKyAoJ1cnIDw8IDgpICsgKCdvJyA8PCAwKQotCXN0MncgcjQsIEAocjIsMCkgfHwgbm9wCi0JIyBwdXRzdHIKLQkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCi0JIyBmaW5pc2hlZAotCWFkZCByMiwgcjAsIHIwIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQotCS5hbGlnbiAzCi1oZWxsbzogIAotCS5hc2NpaSAiPz8/Py4uLi5ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3Q0aGIuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3Q0aGIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDIyNS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0NGhiLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JYWRkIHIyLCByMCwgaGVsbG8KLQlhZGQgcjQsIHIwLCAoJ0gnIDw8IDE2KSArICgnZScgPDwgMCkKLQlhZGQgcjUsIHIwLCAoJ2wnIDw8IDE2KSArICgnbCcgPDwgMCkKLQlzdDRoYiByNCwgQChyMiwwKSB8fCBub3AKLQkjIHB1dHN0cgotCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKLQkjIGZpbmlzaGVkCi0JYWRkIHIyLCByMCwgcjAgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCi0JLmFsaWduIDMKLWhlbGxvOiAgCi0JLmFzY2lpICI/Pz8/byBXb3JsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGIuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RiLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGE4NWIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGIuUworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQlhZGQgcjIsIHIwLCBoZWxsbwotCWFkZCByNCwgcjAsICdIJwotCXN0YiByNCwgQChyMiwwKSB8fCBub3AKLQkjIHB1dHN0cgotCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKLQkjIGZpbmlzaGVkCi0JYWRkIHIyLCByMCwgcjAgfHwgbm9wCi0JLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAotCi0JLmFsaWduIDMKLWhlbGxvOiAgCi0JLmFzY2lpICI/ZWxsbyBXb3JsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjM2NDAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGguUworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQlhZGQgcjIsIHIwLCBoZWxsbwotCWFkZCByNCwgcjAsICgnSCcgPDwgOCkgKyAoJ2UnIDw8IDApCi0Jc3RoIHI0LCBAKHIyLDApIHx8IG5vcAotCSMgcHV0c3RyCi0JLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAotCSMgZmluaXNoZWQKLQlhZGQgcjIsIHIwLCByMCB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0KLQkuYWxpZ24gMwotaGVsbG86ICAKLQkuYXNjaWkgIj8/bGxvIFdvcmxkXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0aGguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoaC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmMzA5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoaC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCWFkZCByMiwgcjAsIGhlbGxvCi0JYWRkIHI0LCByMCwgKCdIJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KQotCXN0aGggcjQsIEAocjIsMCkgfHwgbm9wCi0JIyBwdXRzdHIKLQkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCi0JIyBmaW5pc2hlZAotCWFkZCByMiwgcjAsIHIwIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQotCS5hbGlnbiAzCi1oZWxsbzogIAotCS5hc2NpaSAiPz9sbG8gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3R3LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0dy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzE3ZjJhLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3R3LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JYWRkIHIyLCByMCwgaGVsbG8KLQlhZGQgcjQsIHIwLCAoJ0gnIDw8IDI0KSArICgnZScgPDwgMTYpICsgKCdsJyA8PCA4KSArICgnbCcgPDwgMCkKLQlzdHcgcjQsIEAocjIsMCkgfHwgbm9wCi0JIyBwdXRzdHIKLQkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCi0JIyBmaW5pc2hlZAotCWFkZCByMiwgcjAsIHIwIHx8IG5vcAotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQotCS5hbGlnbiAzCi1oZWxsbzogIAotCS5hc2NpaSAiPz8/P28gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvb3MtZGJ0LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL29zLWRidC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDY4ODY3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvb3MtZGJ0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLmdsb2JsIF9zdGFydAotCSMKLQkjIE5PVEU6CVJlZ2lzdGVycyByMTAtcjExIGFyZSByZXNlcnZlZCBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCi0JIwl3aGlsZSB0aGUgb3RoZXJzIGNhbiBiZSB1c2VkIGJ5IHRoZSBtYWluIGxvb3Avc3RhcnQgY29kZS4KLQotX3N0YXJ0OgkJCi0JIyBwYXRjaCB0aGUgREJUIGhhbmRsZXIKLQlhZGQgcjEsIHIwLCBoYW5kbGVyCi0JbGR3IHIyLCBAKHIxLCAwKQotCWxkdyByMywgQChyMSwgNCkKLQkjIERCVCB2ZWN0b3IgYWRkcmVzcwotCWFkZCByMSwgcjAsIDB4ZmZmZmYxMjAKLQlzdHcgcjIsIEAocjEsIDApCi0Jc3R3IHIzLCBAKHIxLCA0KQotCi0JIyB0cnkgb3V0IHRoZSBicmVha3BvaW50L3JldHVybgotCWFkZCByMiwgcjAsIDQ3Ci0JI2RidAotCW5vcAotCS5sb25nIDB4MDBiMDAwMDAKLQlub3AKLQotCSMgZXhpdCB3aXRoIHdoYXQgZXZlciB0aGUgYnJlYWtwb2ludCBoYW5kZXIgc2V0IHIyIHRvLgotCW5vcAotCS5sb25nIDB4MGUwMDAwMDQKLQlub3AKLQotaGFuZGxlcjoKLQlqbXAgcmVhbF9oYW5kbGVyCi0JCi0JIyBUaGUgQnJlYWtwb2ludCBoYW5kbGVyIHNldHMgcjIgdG8gMCBpZiBQU1cgd2FzIHNldCBjb3JyZWN0bHkuCi1yZWFsX2hhbmRsZXI6Ci0JbXZmc3lzIHIyLCBjcjAKLQlzdWIgcjIsIHIwLCAweDA4MDAwMDAwCi0JI3J0ZAotCW5vcAotCS5sb25nIDB4MDBhMDAwMDAKLQlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvdGljay5zIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90aWNrLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzRjYTcuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90aWNrLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLmdsb2JsIF9zdGFydAotCSMKLQkjIE5PVEU6CVJlZ2lzdGVycyByMTAtcjExIGFyZSByZXNlcnZlZCBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCi0JIwl3aGlsZSB0aGUgb3RoZXJzIGNhbiBiZSB1c2VkIGJ5IHRoZSBtYWluIGxvb3Avc3RhcnQgY29kZS4KLQotX3N0YXJ0OgkJCi0JIyBwYXRjaCB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IGhhbmRsZXJzIGVudHJ5Ci0JYWRkIHIxLCByMCwgaGFuZGxlcgotCWxkdyByMiwgQChyMSwgMCkKLQlsZHcgcjMsIEAocjEsIDQpCi0JYWRkIHIxLCByMCwgMHhmZmZmZjEzOAotCXN0dyByMiwgQChyMSwgMCkKLQlzdHcgcjMsIEAocjEsIDQpCi0JCi0JIyBlbmFibGUgZXh0ZXJuYWwgaW50ZXJydXB0cyAtIGNyMCA9PSBQU1cKLQltdmZzeXMgcjIsIGNyMAotCW9yIHIyLCByMCwgMHgwNDAwMDAwMAotCW12dHN5cyBjcjAsIHIyCi0KLQotCSMgd2FpdCBmb3IgZmxhZyB0byBiZSBzZXQKLWxvb3A6CQotCWFkZCByMiwgcjAsIGZsYWcKLQlsZHcgcjMsIEAocjIsIDApCi0JYnJhdHpyIHIzLCBsb29wCi0KLQkjIGNsZWFyIHRoZSBmbGFnCi0Jc3R3IHIwLCBAKHIyLCAwKQotCi0JYWRkIHIyLCByMCwgdGljawotCSMgcHV0c3RyCi0JLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAotCi0JYnJhIGxvb3AKLQotCSMgZmluaXNoZWQKLQlhZGQgcjIsIHIwLCByMCB8fCBub3AKLQkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCi0KLQkKLWhhbmRsZXI6Ci0Jam1wIHJlYWxfaGFuZGxlcgotcmVhbF9oYW5kbGVyOgotCWFkZCByMTAsIHIwLCAxCi0JYWRkIHIxMSwgcjAsIGZsYWcKLQlzdGIgcjEwLCBAKHIxMSwwKQotCXJlaXQKLQotCi1mbGFnOgkubG9uZyAwCi10aWNrOgkuYXNjaWkgIlRpY2tcclxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90cmFwLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL3RyYXAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOTlmOS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL3RyYXAuUworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgdmVyaWZ5IHRoYXQgdHJhcCB8fCBjbXAgd29ya3MKLQlhZGQgIHI4LHIwLDB4MTEyMjMzNDQgICAgICAgICA7Ci0JYWRkICByOSxyMCwweDExMjIzMzQ0ICAgICAgICAgOwotCi0JbXZ0c3lzIGJwc3cscjAgfHwgbm9wCi0JbXZ0c3lzIGJwYyxyMCAgfHwgbm9wCi0KLQlhZGQgIHIxLHIwLDB4OTcwMDA1NTUgICAgICAgOyBmb3IgcHN3Ci0JbXZ0c3lzIHBzdyxyMSB8fCBub3AKLQl0cmFwIDAgIHx8IGNtcGVxIGYwLHI4LHI5LDsKLQotCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKLQotCS5zZWN0aW9uIC5laXRfdiwgImEiCi0Jbm9wICAgICB8fCBub3AKLQlub3AgICAgIHx8IG5vcAotCW5vcCAgICAgfHwgbm9wCi0Jbm9wICAgICB8fCBub3AKLQotIyBzYXZlIHRoZSBvbGQgYnBzdywgcHN3Ci0JbXZmc3lzIHI0LGJwc3cgfHwgbm9wCi0JbXZmc3lzIHI1LHBzdyB8fCBub3AKLQotIyBsb2FkIHVwIHdoYXQgdGhleSBzaG91bGQgYmUKLQlhZGQgcjYscjAsMHg5NzAwNDU1NQotCWFkZCByNyxyMCwweDkwMDAwMDAwCi0KLSMgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSByaWdodCB2YWx1ZXMKLSMgcmV0dXJuIGV4aXQgdmFsdWUgaW4gcjIgLS0gMCBzdWNjZXNzLCA0NyBmYWlsdXJlCi0JYWRkIHIyLHIwLDQ3Ci0JY21wZXEgZjAscjQscjYgfHwgbm9wCi0JY21wZXEgZjEscjUscjcgfHwgbm9wCi0JYWRkL3R0IHIyLHIwLHIwIHx8IG5vcAotCi0JcmVpdApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9DaGFuZ2VMb2cgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyZDBlNC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVGh1IE5vdiAyNiAxMTozNDo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGxvb3AucyAoX3N0YXJ0KTogUmVtb3ZlZCBkaXJlY3QgYWRkcmVzcyBoYWNrLgotCi1Nb24gTm92IDIzIDE3OjAyOjQ3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogRGlyZWN0b3J5IGNyZWF0ZWQuCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNjM2VmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIHRoZSBmcjMwIHNpbXVsYXRvci4KLSMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotVlBBVEggPSBAc3JjZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXNyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4vLi4KLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAotaG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKLXRhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAotdGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAotCi0KLVNIRUxMID0gQFNIRUxMQAotU1VCRElSUyA9IEBzdWJkaXJzQAotUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKLQotRVhQRUNUID0gYGlmIFsgLWYgLi4vLi4vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAuLi8uLi8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotUlVOVEVTVCA9ICQoUlVOVEVTVF9GT1JfVEFSR0VUKQotCi1SVU5URVNURkxBR1MgPQotCi1SVU5URVNUX0ZPUl9UQVJHRVQgPSBgXAotICBpZiBbIC1mICQke3NyY3Jvb3R9L2RlamFnbnUvcnVudGVzdCBdOyB0aGVuIFwKLSAgICBlY2hvICQke3NyY3Jvb3R9L2RlamFnbnUvcnVudGVzdDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXTsgdGhlbiBcCi0gICAgICBlY2hvIHJ1bnRlc3Q7IFwKLSAgICBlbHNlIFwKLSAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHJ1bnRlc3QgfCBzZWQgLWUgJycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLQotQVNfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vZ2FzL2FzLW5ldyBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL2dhcy9hcy1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWFzIDsgXAotICBmaWAKLQotTERfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vbGQvbGQtbmV3IF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vbGQvbGQtbmV3IDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1sZCA7IFwKLSAgZmlgCi0KLVJVTl9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9zaW0vJHt0YXJnZXRfY3B1fS9ydW4gXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9zaW0vJHt0YXJnZXRfY3B1fS9ydW4gOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLXJ1biA7IFwKLSAgZmlgCi0KLVRFU1RTID0gXAotCWhlbGxvLm9rIFwKLQlleGl0NDcua28KLQotY2hlY2s6IHNhbml0eSAkKFRFU1RTKQotc2FuaXR5OgotCUBldmFsIGVjaG8gQVNfRk9SX1RBUkdFVCA9ICQoQVNfRk9SX1RBUkdFVCkKLQlAZXZhbCBlY2hvIExEX0ZPUl9UQVJHRVQgPSAkKExEX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBSVU5fRk9SX1RBUkdFVCA9ICQoUlVOX0ZPUl9UQVJHRVQpCi0KLQotCi0jIFJ1bGVzIGZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHB1dCBpbnRvIHRocmVlIHR5cGVzCi0jIGV4aXQgc3VjY2VzcywgZXhpdCBmYWlsLCBwcmludCAiSGVsbG8gV29ybGQiCi0KLS51LmxvZzoKLQl1dWRlY29kZSAkKi51Ci0JJChSVU5fRk9SX1RBUkdFVCkgJCogPiAkKi5sb2cKLQotCi0jIFJ1bGVzIGZvciBydW5uaW5nIHRoZSB0ZXN0cwotCi0uU1VGRklYRVM6IC51IC5vayAucnVuIC5oaSAua28KLS5ydW4ub2s6Ci0Jcm0gLWYgdG1wLSQqICQqLmhpCi0JdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKLQltdiB0bXAtJCogJCoub2sKLS5ydW4uaGk6Ci0Jcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKLQl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgotCWVjaG8gIkhlbGxvIFdvcmxkIiB8IGRpZmYgLSB0bXAtJCogPiBkaWZmLSQqCi0JY2F0IHRtcC0kKiBkaWZmLSQqID4gJCouaGkKLS5ydW4ua286Ci0Jcm0gLWYgdG1wLSQqICQqLmtvCi0Jc2V0ICtlIDsgXAotCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqIDsgXAotCWlmIFsgJCQ/IC1lcSA0NyBdIDsgdGhlbiBcCi0JICBleGl0IDAgOyBcCi0JZWxzZSBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQltdiB0bXAtJCogJCoua28KLQotCi0jIFJ1bGVzIGZvciBidWlsZGluZyBhbGwgdGhlIHRlc3RzIGFuZCBwYWNraW5nIHRoZW0gaW50bwotIyB1dWVuY29kZWQgZmlsZXMuCi0KLXV1ZW5jb2RlOiBlbS1wc3RyLnUgZW0tZTAudSBlbS1lNDcudSBlbS1wY2hyLnUKLQotLlNVRkZJWEVTOiAudSAucyAucnVuCi0ucy51OgotCXJtIC1mICQqLm8gJCoucnVuCi0JJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCi0JJChMRF9GT1JfVEFSR0VUKSAtbyAkKiAkKi5vCi0JdXVlbmNvZGUgPCAkKiAkKiA+ICQqLnUKLQlybSAtZiAkKi5vICQqCi0ucy5ydW46Ci0Jcm0gLWYgJCoubyAkKi5ydW4KLQkkKEFTX0ZPUl9UQVJHRVQpICQoc3JjZGlyKS8kKi5zIC1vICQqLm8KLQkkKExEX0ZPUl9UQVJHRVQpIC1vICQqLnJ1biAkKi5vCi0Jcm0gLWYgJCoubyAkKgotCi0KLWNsZWFuIG1vc3RseWNsZWFuOgotCXJtIC1mICp+IGNvcmUgKi5vIGEub3V0Ci0Jcm0gLWYgJChURVNUUykKLQotZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgotCXJtIC1mICp+IGNvcmUKLQlybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKLQlybSAtZnIgKi5sb2cgc3VtbWFyeSBkZXRhaWwgKi5wbG9nICouc3VtICoucHN1bSBzaXRlLioKLQotTWFrZWZpbGUgOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JJChTSEVMTCkgY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiBjb25maWd1cmUKLQkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmE2NTZjYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDkwMiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotQ0M9JHtDQy1jY30KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NzM6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTI6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KLSMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCi0jIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcwotCi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQENDQCUkQ0MlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDM4OWUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgotZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQotZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLWRubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KLQotQUNfUFJFUkVRKDIuNSkKLWRubCBGSVhNRSAtIHRoaW5rIG9mIGEgdHJ1bHkgdW5pcSBmaWxlIHRvIHRoaXMgZGlyZWN0b3J5Ci1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1DQz0ke0NDLWNjfQotQUNfU1VCU1QoQ0MpCi1BQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uKQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BQ19TVUJTVCh0YXJnZXRfY3B1KQotCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvZXhpdDQ3LnMgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2V4aXQ0Ny5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGM3Yzk5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvZXhpdDQ3LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQk7OyBSZXR1cm4gd2l0aCBleGl0IGNvZGUgNDcuCi0KLQkuZ2xvYmFsIF9zdGFydAotX3N0YXJ0OgotCWxkaTMyICM0NyxyNAotCWxkaTMyICMxLHIwCi0JaW50ICAgIzEwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2hlbGxvLnMgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2hlbGxvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjU5Y2QuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9oZWxsby5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5nbG9iYWwgX3N0YXJ0Ci1fc3RhcnQ6Ci0KLTsgd3JpdGUgKGhlbGxvIHdvcmxkKQotCWxkaTMyICMxNCxyNgotCWxkaTMyICNoZWxsbyxyNQotCWxkaTMyICMxLHI0Ci0JbGRpMzIgIzUscjAKLQlpbnQgICAjMTAKLTsgZXhpdCAoMCkKLQlsZGkzMiAjMCxyNAotCWxkaTMyICMxLHIwCi0JaW50ICAgIzEwCi0KLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkIVxyXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2xvb3AucyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvbG9vcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDliNzhmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvbG9vcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLmdsb2JhbCBfc3RhcnQKLV9zdGFydDoJYnJhIF9zdGFydApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9saWIvc2ltLWRlZnMuZXhwIGIvc2ltL3Rlc3RzdWl0ZS9saWIvc2ltLWRlZnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjI0NTI4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvbGliL3NpbS1kZWZzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0jIFNpbXVsYXRvciBkZWphZ251IHV0aWxpdGllcy4KLQotIyBDb21tdW5pY2F0ZSBzaW11bGF0b3IgcGF0aCBmcm9tIHNpbV9pbml0IHRvIHNpbV92ZXJzaW9uLgotIyBGb3Igc29tZSByZWFzb24gW2JvYXJkX2luZm8gdGFyZ2V0IHNpbV0gZG9lc24ndCB3b3JrIGluIHNpbV92ZXJzaW9uLgotIyBbUHJlc3VtdWJseSBiZWNhdXNlIHRoZSB0YXJnZXQgaGFzIGJlZW4gInBvcHBlZCIgYnkgdGhlbi4gIE9kZCB0aG91Z2guXQotc2V0IHNpbV9wYXRoICJ1bmtub3duLXJ1biIKLQotIyBJbml0aWFsaXplIHRoZSB0ZXN0cnVuLgotIyBSZXF1aXJlZCBieSBkZWphZ251LgotCi1wcm9jIHNpbV9pbml0IHsgYXJncyB9IHsKLSAgICBnbG9iYWwgc2ltX3BhdGgKLSAgICBzZXQgc2ltX3BhdGggW2JvYXJkX2luZm8gdGFyZ2V0IHNpbV0KLSAgICAjIE5lZWQgdG8gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyAoY29waWVkIGZyb20gR0FTKS4KLSAgICByZXR1cm4gIiIKLX0KLQotIyBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgc2ltdWxhdG9yIGJlaW5nIHRlc3RlZC4KLSMgUmVxdWlyZWQgYnkgZGVqYWdudS4KLQotcHJvYyBzaW1fdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIHNpbV9wYXRoCi0gICAgc2V0IHZlcnNpb24gMC41Ci0gICAgY2xvbmVfb3V0cHV0ICIkc2ltX3BhdGggJHZlcnNpb25cbiIKLX0KLQotIyBDb3ZlciBmdW5jdGlvbiB0byB0YXJnZXRfY29tcGlsZS4KLSMgQ29waWVkIGZyb20gZ2RiX2NvbXBpbGUuCi0KLXByb2Mgc2ltX2NvbXBpbGUgeyBzb3VyY2UgZGVzdCB0eXBlIG9wdGlvbnMgfSB7Ci0gICAgc2V0IHJlc3VsdCBbdGFyZ2V0X2NvbXBpbGUgJHNvdXJjZSAkZGVzdCAkdHlwZSAkb3B0aW9uc10KLSAgICByZWdzdWIgIlxbXHJcblxdKiQiICIkcmVzdWx0IiAiIiByZXN1bHQKLSAgICByZWdzdWIgIl5cW1xyXG5cXSoiICIkcmVzdWx0IiAiIiByZXN1bHQKLSAgICBpZiB7ICRyZXN1bHQgIT0gIiIgfSB7Ci0JY2xvbmVfb3V0cHV0ICJzaW0gY29tcGlsZSBvdXRwdXQ6ICRyZXN1bHQiCi0gICAgfQotICAgIHJldHVybiAkcmVzdWx0Ci19Ci0KLSMgUnVuIGEgcHJvZ3JhbSBvbiB0aGUgc2ltdWxhdG9yLgotIyBSZXF1aXJlZCBieSBkZWphZ251IChhdCBsZWFzdCAke3Rvb2x9X3J1biB1c2VkIHRvIGJlKS4KLSMKLSMgU0lNX09QVFMgYXJlIG9wdGlvbnMgZm9yIHRoZSBzaW11bGF0b3IuCi0jIFBST0dfT1BUUyBhcmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgotIyBBdCBwcmVzZW50IFJFRElSIG11c3QgYmUgIiIgb3IgIj4gZm9vIi4KLSMgT1BUSU9OUyBpcyBhIGxpc3Qgb2Ygb3B0aW9ucyBpbnRlcm5hbCB0byB0aGlzIHJvdXRpbmUuCi0jIFRoaXMgaXMgbW9kZWxsZWQgYWZ0ZXIgdGFyZ2V0X2NvbXBpbGUuICBXZSB3YW50IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotIyBvcHRpb25zIHdpdGhvdXQgaGF2aW5nIHRvIHVwZGF0ZSBhbGwgb3VyIHVzZXJzLgotIyBDdXJyZW50bHk6Ci0jCWVudihmb28pPXZhbAktIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb28gdG8gdmFsIGZvciB0aGlzIHJ1bgotIwl0aW1lb3V0PXZhbAktIHNldCB0aGUgdGltZW91dCB0byB2YWwgZm9yIHRoaXMgcnVuCi0jCi0jIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHR3byBlbGVtZW50cy4KLSMgVGhlIGZpcnN0IGlzIG9uZSBvZiBwYXNzL2ZhaWwvZXRjLgotIyBUaGUgc2Vjb25kIGlzIHRoZSBwcm9ncmFtJ3Mgb3V0cHV0LgotIwotIyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBzaW1fbG9hZCByb3V0aW5lIHByb3ZpZGVkIGJ5Ci0jIGRlamFnbnUvY29uZmlnL3NpbS5leHAuICBJdCdzIG5vdCBjbGVhciBob3cgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlCi0jIHNpbXVsYXRvciAobm90IHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSwgdGhlIHNpbXVsYXRvcikgd2l0aCBzaW1fbG9hZC4KLQotcHJvYyBzaW1fcnVuIHsgcHJvZyBzaW1fb3B0cyBwcm9nX29wdHMgcmVkaXIgb3B0aW9ucyB9IHsKLSAgICBnbG9iYWwgU0lNRkxBR1MKLQotICAgICMgU2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB0aW1lb3V0LgotICAgICMgRklYTUU6IFRoZSB0aW1lb3V0IHZhbHVlIHdlIGFjdHVhbGx5IHdhbnQgaXMgYSBmdW5jdGlvbiBvZgotICAgICMgaG9zdCwgdGFyZ2V0LCBhbmQgdGVzdGNhc2UuCi0gICAgc2V0IHRlc3RjYXNlX3RpbWVvdXQgW2JvYXJkX2luZm8gdGFyZ2V0IHNpbV90aW1lX2xpbWl0XQotICAgIGlmIHsgIiR0ZXN0Y2FzZV90aW1lb3V0IiA9PSAiIiB9IHsKLQlzZXQgdGVzdGNhc2VfdGltZW91dCBbYm9hcmRfaW5mbyBob3N0IHRlc3RjYXNlX3RpbWVvdXRdCi0gICAgfQotICAgIGlmIHsgIiR0ZXN0Y2FzZV90aW1lb3V0IiA9PSAiIiB9IHsKLQlzZXQgdGVzdGNhc2VfdGltZW91dCAyNDAgOyMgMjQwIHNhbWUgYXMgaW4gZGVqYWdudS9jb25maWcvc2ltLmV4cC4KLSAgICB9Ci0KLSAgICAjIEluaXRpYWwgdGhlIGVudmlyb25tZW50IHdlIHBhc3MgdG8gdGhlIHRlc3RjYXNlLgotICAgIHNldCB0ZXN0Y2FzZV9lbnYgIiIKLQotICAgICMgUHJvY2VzcyBPUFRJT05TIC4uLgotICAgIGZvcmVhY2ggbyAkb3B0aW9ucyB7Ci0JaWYgW3JlZ2V4cCB7XmVudlwoKC4qKVwpPSguKil9ICRvIGZ1bGwgdmFyIHZhbF0gewotCSAgICBzZXQgdGVzdGNhc2VfZW52ICIkdGVzdGNhc2VfZW52ICR2YXI9JHZhbCIKLQl9IGVsc2VpZiBbcmVnZXhwIHtedGltZW91dD0oLiopfSAkbyBmdWxsIHZhbF0gewotCSAgICBzZXQgdGVzdGNhc2VfdGltZW91dCAkdmFsCi0JfQotCQotICAgIH0KLQkKLSAgICB2ZXJib3NlICJ0ZXN0Y2FzZSB0aW1lb3V0IGlzIHNldCB0byAkdGVzdGNhc2VfdGltZW91dCIgMQotCi0gICAgc2V0IHNpbSBbYm9hcmRfaW5mbyB0YXJnZXQgc2ltXQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IHByb2cgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRwcm9nXQotCWlmIHsgJHByb2cgPT0gIiIgfSB7Ci0JICAgIGVycm9yICJkb3dubG9hZCBmYWlsZWQiCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gICAgc2V0IGJvYXJkIFt0YXJnZXRfaW5mbyBuYW1lXQotICAgIGlmIFtib2FyZF9pbmZvICRib2FyZCBleGlzdHMgc2ltLG9wdGlvbnNdIHsKLQlzZXQgYWx3YXlzX29wdHMgW2JvYXJkX2luZm8gJGJvYXJkIHNpbSxvcHRpb25zXQotICAgIH0gZWxzZSB7Ci0Jc2V0IGFsd2F5c19vcHRzICIiCi0gICAgfQotCi0gICAgIyBGSVhNRTogdGhpcyB3b3JrcyBmb3IgVU5JWCBvbmx5Ci0gICAgaWYgeyAiJHRlc3RjYXNlX2VudiIgIT0gIiIgfSB7Ci0Jc2V0IHNpbSAiZW52ICR0ZXN0Y2FzZV9lbnYgJHNpbSIKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJHNpbSAkYWx3YXlzX29wdHMgJFNJTUZMQUdTICRzaW1fb3B0cyAkcHJvZyAkcHJvZ19vcHRzXG4iCi0KLSAgICBpZiB7ICIkcmVkaXIiID09ICIiIH0gewotCXJlbW90ZV9zcGF3biBob3N0ICIkc2ltICRhbHdheXNfb3B0cyAkU0lNRkxBR1MgJHNpbV9vcHRzICRwcm9nICRwcm9nX29wdHMiCi0gICAgfSBlbHNlIHsKLQlyZW1vdGVfc3Bhd24gaG9zdCAiJHNpbSAkYWx3YXlzX29wdHMgJFNJTUZMQUdTICRzaW1fb3B0cyAkcHJvZyAkcHJvZ19vcHRzICRyZWRpciIgd3JpdGVvbmx5Ci0gICAgfQotICAgIHNldCByZXN1bHQgW3JlbW90ZV93YWl0IGhvc3QgJHRlc3RjYXNlX3RpbWVvdXRdCi0KLSAgICBzZXQgcmV0dXJuX2NvZGUgW2xpbmRleCAkcmVzdWx0IDBdCi0gICAgc2V0IG91dHB1dCBbbGluZGV4ICRyZXN1bHQgMV0KLSAgICAjIFJlbW92ZSB0aGUgXHIgcGFydCBvZiAiXHJcbiIgc28gd2UgZG9uJ3QgYnJlYWsgYWxsIHRoZSBwYXR0ZXJucwotICAgICMgd2Ugd2FudCB0byBtYXRjaC4KLSAgICByZWdzdWIgLWFsbCAtLSAiXHIiICRvdXRwdXQgIiIgb3V0cHV0Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQkjIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4KLQlyZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkcHJvZwotICAgIH0KLQotICAgICMgPz8/IE5vdCBzdXJlIHRoZSB0ZXN0IGZvciBwYXNzL2ZhaWwgaXMgcmlnaHQuCi0gICAgIyBXZSBqdXN0IGNhcmUgdGhhdCB0aGUgc2ltdWxhdG9yIHJhbiBjb3JyZWN0bHksIG5vdCB3aGV0aGVyIHRoZSBzaW11bGF0ZWQKLSAgICAjIHByb2dyYW0gcmV0dXJuIDAgb3Igbm9uLXplcm8gZnJvbSBgbWFpbicuCi0gICAgc2V0IHN0YXR1cyBmYWlsCi0gICAgaWYgeyAkcmV0dXJuX2NvZGUgPT0gMCB9IHsKLQlzZXQgc3RhdHVzIHBhc3MKLSAgICB9Ci0KLSAgICByZXR1cm4gW2xpc3QgJHN0YXR1cyAkb3V0cHV0XQotfQotCi0jIFJ1biB0ZXN0Y2FzZSBOQU1FLgotIyBOQU1FIGlzIGVpdGhlciBhIGZ1bGx5IHNwZWNpZmllZCBmaWxlIG5hbWUsIG9yIGp1c3QgdGhlIGZpbGUgbmFtZSBpbiB3aGljaAotIyBjYXNlICRzcmNkaXIvJHN1YmRpciB3aWxsIGJlIHByZXBlbmRlZC4KLSMgUkVRVUVTVEVEX01BQ0hTIGlzIGEgbGlzdCBvZiBtYWNoaW5lcyB0byBydW4gdGhlIHRlc3RjYXNlIG9uLiAgSWYgTkFNRSBpc24ndAotIyBmb3IgdGhlIHNwZWNpZmllZCBtYWNoaW5lKHMpLCBpdCBpcyBpZ25vcmVkLgotIyBUeXBpY2FsbHkgUkVRVUVTVEVEX01BQ0hTIGNvbnRhaW5zIGp1c3Qgb25lIGVsZW1lbnQsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKLSMgdG8gaXRlcmF0ZSBvdmVyIHRoZSBkZXNpcmVkIG1hY2hpbmUgdmFyaWFudHMuCi0jCi0jIFRoZSBmaWxlIGNhbiBjb250YWluIG9wdGlvbnMgaW4gdGhlIGZvcm0gIiMgb3B0aW9uKG1hY2ggbGlzdCk6IHZhbHVlIi4KLSMgUG9zc2liaWxpdGllczoKLSMgbWFjaDogW2FsbCB8IG1hY2hpbmUgbmFtZXNdCi0jIGFzWyhtYWNoLWxpc3QpXTogPGFzc2VtYmxlciBvcHRpb25zPgotIyBsZFsobWFjaC1saXN0KV06IDxsaW5rZXIgb3B0aW9ucz4KLSMgc2ltWyhtYWNoLWxpc3QpXTogPHNpbXVsYXRvciBvcHRpb25zPgotIyBvdXRwdXRbKG1hY2gtbGlzdCldOiBwcm9ncmFtIG91dHB1dCBwYXR0ZXJuIHRvIG1hdGNoIHdpdGggc3RyaW5nLW1hdGNoCi0jIHhlcnJvclsobWFjaC1saXN0KV06IHByb2dyYW0gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHdpdGggYSAiZmFpbHVyZSIgZXhpdCBjb2RlCi0jIElmIGBvdXRwdXQnIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBwcm9ncmFtIG11c3Qgb3V0cHV0ICJwYXNzIiBpZiAheGVycm9yIG9yCi0jICJmYWlsIiBpZiB4ZXJyb3IuCi0jIFRoZSBwYXJlbnMgaW4gIm9wdG5hbWUoKSIgYXJlIG9wdGlvbmFsIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGZvciBhbGwgbWFjaHMuCi0KLXByb2MgcnVuX3NpbV90ZXN0IHsgbmFtZSByZXF1ZXN0ZWRfbWFjaHMgfSB7Ci0gICAgZ2xvYmFsIHN1YmRpciBzcmNkaXIKLSAgICBnbG9iYWwgU0lNRkxBR1MKLSAgICBnbG9iYWwgb3B0cwotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKi8qIiAkbmFtZV0gewotCXNldCBmaWxlICRuYW1lCi0Jc2V0IG5hbWUgW2ZpbGUgdGFpbCAkbmFtZV0KLSAgICB9IGVsc2UgewotCXNldCBmaWxlICIkc3JjZGlyLyRzdWJkaXIvJG5hbWUiCi0gICAgfQotCi0gICAgc2V0IG9wdF9hcnJheSBbc2x1cnBfb3B0aW9ucyAiJHtmaWxlfSJdCi0gICAgaWYgeyAkb3B0X2FycmF5ID09IC0xIH0gewotCXVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCXJldHVybgotICAgIH0KLSAgICBzZXQgb3B0cyhhcykge30KLSAgICBzZXQgb3B0cyhsZCkge30KLSAgICBzZXQgb3B0cyhzaW0pIHt9Ci0gICAgc2V0IG9wdHMob3V0cHV0KSB7fQotICAgIHNldCBvcHRzKG1hY2gpIHt9Ci0gICAgc2V0IG9wdHModGltZW91dCkge30KLSAgICBzZXQgb3B0cyh4ZXJyb3IpICJubyIKLQotICAgIGZvcmVhY2ggaSAkb3B0X2FycmF5IHsKLQlzZXQgb3B0X25hbWUgW2xpbmRleCAkaSAwXQotCXNldCBvcHRfbWFjaHMgW2xpbmRleCAkaSAxXQotCXNldCBvcHRfdmFsIFtsaW5kZXggJGkgMl0KLQlpZiAhW2luZm8gZXhpc3RzIG9wdHMoJG9wdF9uYW1lKV0gewotCSAgICBwZXJyb3IgInVua25vd24gb3B0aW9uICRvcHRfbmFtZSBpbiBmaWxlICRmaWxlIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCWZvcmVhY2ggbSAkb3B0X21hY2hzIHsKLQkgICAgc2V0IG9wdHMoJG9wdF9uYW1lLCRtKSAkb3B0X3ZhbAotCX0KLQlpZiB7ICIkb3B0X21hY2hzIiA9PSAiIiB9IHsKLQkgICAgc2V0IG9wdHMoJG9wdF9uYW1lKSAkb3B0X3ZhbAotCX0KLSAgICB9Ci0KLSAgICBzZXQgdGVzdG5hbWUgJG5hbWUKLSAgICBzZXQgc291cmNlZmlsZSAkZmlsZQotICAgIGlmIHsgJG9wdHMob3V0cHV0KSA9PSAiIiB9IHsKLQlpZiB7ICIkb3B0cyh4ZXJyb3IpIiA9PSAibm8iIH0gewotCSAgICBzZXQgb3B0cyhvdXRwdXQpICJwYXNzXG4iCi0JfSBlbHNlIHsKLQkgICAgc2V0IG9wdHMob3V0cHV0KSAiZmFpbFxuIgotCX0KLSAgICB9Ci0gICAgIyBDaGFuZ2UgXG4gc2VxdWVuY2VzIHRvIG5ld2xpbmUgY2hhcnMuCi0gICAgcmVnc3ViIC1hbGwgIlxcXFxuIiAkb3B0cyhvdXRwdXQpICJcbiIgb3B0cyhvdXRwdXQpCi0KLSAgICBzZXQgdGVzdGNhc2VfbWFjaHMgJG9wdHMobWFjaCkKLSAgICBpZiB7ICIkdGVzdGNhc2VfbWFjaHMiID09ICJhbGwiIH0gewotCXNldCB0ZXN0Y2FzZV9tYWNocyAkcmVxdWVzdGVkX21hY2hzCi0gICAgfQotCi0gICAgZm9yZWFjaCBtYWNoICR0ZXN0Y2FzZV9tYWNocyB7Ci0JaWYgeyBbbHNlYXJjaCAkcmVxdWVzdGVkX21hY2hzICRtYWNoXSA8IDAgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiU2tpcHBpbmcgJG1hY2ggdmVyc2lvbiBvZiAkbmFtZSwgbm90IHJlcXVlc3RlZC4iCi0JICAgIGNvbnRpbnVlCi0JfQotCi0JdmVyYm9zZSAtbG9nICJUZXN0aW5nICRuYW1lIG9uIG1hY2hpbmUgJG1hY2guIgotCi0JaWYgIVtpbmZvIGV4aXN0cyBvcHRzKGFzLCRtYWNoKV0gewotCSAgICBzZXQgb3B0cyhhcywkbWFjaCkgJG9wdHMoYXMpCi0JfQotCi0Jc2V0IGNvbXBfb3V0cHV0IFt0YXJnZXRfYXNzZW1ibGUgJHNvdXJjZWZpbGUgJHtuYW1lfS5vICIkb3B0cyhhcywkbWFjaCkgLUkkc3JjZGlyLyRzdWJkaXIiXQotCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiJGNvbXBfb3V0cHV0IiAzCi0JICAgIGZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKLQkgICAgY29udGludWUKLQl9Ci0KLQlpZiAhW2luZm8gZXhpc3RzIG9wdHMobGQsJG1hY2gpXSB7Ci0JICAgIHNldCBvcHRzKGxkLCRtYWNoKSAkb3B0cyhsZCkKLQl9Ci0KLQlzZXQgY29tcF9vdXRwdXQgW3RhcmdldF9saW5rICR7bmFtZX0ubyAke25hbWV9LnggIiRvcHRzKGxkLCRtYWNoKSJdCi0KLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHsKLQkgICAgdmVyYm9zZSAtbG9nICIkY29tcF9vdXRwdXQiIDMKLQkgICAgZmFpbCAiJG1hY2ggJHRlc3RuYW1lIgotCSAgICBjb250aW51ZQotCX0KLQotCSMgSWYgbm8gbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zLCBkZWZhdWx0IHRvIHRoZSBnZW5lcmFsIHZlcnNpb24uCi0JaWYgIVtpbmZvIGV4aXN0cyBvcHRzKHNpbSwkbWFjaCldIHsKLQkgICAgc2V0IG9wdHMoc2ltLCRtYWNoKSAkb3B0cyhzaW0pCi0JfQotCi0JIyBCdWlsZCB0aGUgb3B0aW9ucyBhcmd1bWVudC4KLQlzZXQgb3B0aW9ucyAiIgotCWlmIHsgIiRvcHRzKHRpbWVvdXQpIiAhPSAiIiB9IHsKLQkgICAgc2V0IG9wdGlvbnMgIiRvcHRpb25zIHRpbWVvdXQ9JG9wdHModGltZW91dCkiCi0JfQotCi0Jc2V0IHJlc3VsdCBbc2ltX3J1biAke25hbWV9LnggIiRvcHRzKHNpbSwkbWFjaCkiICIiICIiICIkb3B0aW9ucyJdCi0Jc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF0KLQlzZXQgb3V0cHV0IFtsaW5kZXggJHJlc3VsdCAxXQotCi0JaWYgeyAiJHN0YXR1cyIgPT0gInBhc3MiIH0gewotCSAgICBpZiB7ICIkb3B0cyh4ZXJyb3IpIiA9PSAibm8iIH0gewotCQlpZiBbc3RyaW5nIG1hdGNoICRvcHRzKG91dHB1dCkgJG91dHB1dF0gewotCQkgICAgcGFzcyAiJG1hY2ggJHRlc3RuYW1lIgotCQl9IGVsc2UgewotCQkgICAgdmVyYm9zZSAtbG9nICJvdXRwdXQ6ICAkb3V0cHV0IiAzCi0JCSAgICB2ZXJib3NlIC1sb2cgInBhdHRlcm46ICRvcHRzKG91dHB1dCkiIDMKLQkJICAgIGZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKLQkJfQotCSAgICB9IGVsc2UgewotCQl2ZXJib3NlIC1sb2cgImBwYXNzJyByZXR1cm4gY29kZSB3aGVuIGV4cGVjdGluZyBmYWlsdXJlIiAzCi0JCWZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKLQkgICAgfQotCX0gZWxzZWlmIHsgIiRzdGF0dXMiID09ICJmYWlsIiB9IHsKLQkgICAgaWYgeyAiJG9wdHMoeGVycm9yKSIgPT0gIm5vIiB9IHsKLQkJZmFpbCAiJG1hY2ggJHRlc3RuYW1lIgotCSAgICB9IGVsc2UgewotCQlpZiBbc3RyaW5nIG1hdGNoICRvcHRzKG91dHB1dCkgJG91dHB1dF0gewotCQkgICAgcGFzcyAiJG1hY2ggJHRlc3RuYW1lIgotCQl9IGVsc2UgewotCQkgICAgdmVyYm9zZSAtbG9nICJvdXRwdXQ6ICAkb3V0cHV0IiAzCi0JCSAgICB2ZXJib3NlIC1sb2cgInBhdHRlcm46ICRvcHRzKG91dHB1dCkiIDMKLQkJICAgIGZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgJHN0YXR1cyAiJG1hY2ggJHRlc3RuYW1lIgotCX0KLSAgICB9Ci19Ci0KLSMgU3Vicm91dGluZSBvZiBydW5fc2ltX3Rlc3QgdG8gcHJvY2VzcyBvcHRpb25zIGluIEZJTEUuCi0KLXByb2Mgc2x1cnBfb3B0aW9ucyB7IGZpbGUgfSB7Ci0gICAgaWYgW2NhdGNoIHsgc2V0IGYgW29wZW4gJGZpbGUgcl0gfSB4XSB7Ci0JI3BlcnJvciAiY291bGRuJ3Qgb3BlbiBgJGZpbGUnOiAkeCIKLQlwZXJyb3IgIiR4IgotCXJldHVybiAtMQotICAgIH0KLSAgICBzZXQgb3B0X2FycmF5IHt9Ci0gICAgIyB3aGl0ZXNwYWNlIGV4cHJlc3Npb24KLSAgICBzZXQgd3MgIHtbIAldKn0KLSAgICBzZXQgbndzIHtbXiAJXSp9Ci0gICAgIyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgYW55d2hlcmUgZXhjZXB0IHdpdGhpbiB0aGUgb3B0aW9ucyBsaXN0OwotICAgICMgb3B0aW9uIG5hbWVzIGFyZSBhbHBoYWJldGljIG9ubHkKLSAgICBzZXQgcGF0ICJeIyR7d3N9KFxbYS16QS1aXF0qKVxcKD8oXFteKTpcXSopXFwpPyR3czoke3dzfSguKikkd3NcJCIKLSAgICAjIEFsbG93IGNvbW1lbnQgYXMgZmlyc3QgbGluZSBvZiBmaWxlLgotICAgIHNldCBmaXJzdGxpbmUgMQotICAgIHdoaWxlIHsgW2dldHMgJGYgbGluZV0gIT0gLTEgfSB7Ci0Jc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCSMgV2hpdGVzcGFjZSBoZXJlIGlzIHNwYWNlLXRhYi4KLQlpZiBbcmVnZXhwICRwYXQgJGxpbmUgeHh4IG9wdF9uYW1lIG9wdF9tYWNocyBvcHRfdmFsXSB7Ci0JICAgICMgbWF0Y2ghCi0JICAgIGxhcHBlbmQgb3B0X2FycmF5IFtsaXN0ICRvcHRfbmFtZSAkb3B0X21hY2hzICRvcHRfdmFsXQotCX0gZWxzZSB7Ci0JICAgIGlmIHsgISAkZmlyc3RsaW5lIH0gewotCQlicmVhawotCSAgICB9Ci0JfQotCXNldCBmaXJzdGxpbmUgMAotICAgIH0KLSAgICBjbG9zZSAkZgotICAgIHJldHVybiAkb3B0X2FycmF5Ci19CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL0NoYW5nZUxvZyBiL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFhODM5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaHUgRmViIDEyIDE5OjA5OjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIERpcmVjdG9yeSBjcmVhdGVkLgotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL01ha2VmaWxlLmluIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYjZhNS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHJlZ3Jlc3Npb24gdGVzdGluZyB0aGUgbTMyciBzaW11bGF0b3IuCi0jIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSMgR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVZQQVRIID0gQHNyY2RpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zcmNyb290ID0gJChzcmNkaXIpLy4uLy4uLy4uCi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWJ1aWxkX2Nhbm9uaWNhbCA9IEBidWlsZEAKLWhvc3RfY2Fub25pY2FsID0gQGhvc3RACi10YXJnZXRfY2Fub25pY2FsID0gQHRhcmdldEAKLXRhcmdldF9jcHUgPSBAdGFyZ2V0X2NwdUAKLQotCi1TSEVMTCA9IEBTSEVMTEAKLVNVQkRJUlMgPSBAc3ViZGlyc0AKLVJQQVRIX0VOVlZBUiA9IEBSUEFUSF9FTlZWQVJACi0KLUVYUEVDVCA9IGBpZiBbIC1mIC4uLy4uLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gLi4vLi4vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSAkKFJVTlRFU1RfRk9SX1RBUkdFVCkKLQotUlVOVEVTVEZMQUdTID0KLQotUlVOVEVTVF9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAtZiAkJHtzcmNyb290fS9kZWphZ251L3J1bnRlc3QgXTsgdGhlbiBcCi0gICAgZWNobyAkJHtzcmNyb290fS9kZWphZ251L3J1bnRlc3Q7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF07IHRoZW4gXAotICAgICAgZWNobyBydW50ZXN0OyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBydW50ZXN0IHwgc2VkIC1lICcnICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUFTX0ZPUl9UQVJHRVQgPSBgXAotICBpZiBbIC14IC4uLy4uLy4uL2dhcy9hcy1uZXcgXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9nYXMvYXMtbmV3IDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1hcyA7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgXAotICBpZiBbIC14IC4uLy4uLy4uL2xkL2xkLW5ldyBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL2xkL2xkLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgZWNobyAkKHRhcmdldF9hbGlhcyktbGQgOyBcCi0gIGZpYAotCi1SVU5fRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vc2ltLyR7dGFyZ2V0X2NwdX0vcnVuIF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vc2ltLyR7dGFyZ2V0X2NwdX0vcnVuIDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1ydW4gOyBcCi0gIGZpYAotCi1URVNUUyA9IFwKLQloZWxsby5vayBcCi0JZXhpdDQ3LmtvCi0KLWNoZWNrOiBzYW5pdHkgJChURVNUUykKLXNhbml0eToKLQlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQgPSAkKEFTX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUID0gJChMRF9GT1JfVEFSR0VUKQotCUBldmFsIGVjaG8gUlVOX0ZPUl9UQVJHRVQgPSAkKFJVTl9GT1JfVEFSR0VUKQotCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBwdXQgaW50byB0aHJlZSB0eXBlcwotIyBleGl0IHN1Y2Nlc3MsIGV4aXQgZmFpbCwgcHJpbnQgIkhlbGxvIFdvcmxkIgotCi0udS5sb2c6Ci0JdXVkZWNvZGUgJCoudQotCSQoUlVOX0ZPUl9UQVJHRVQpICQqID4gJCoubG9nCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKLQotLlNVRkZJWEVTOiAudSAub2sgLnJ1biAuaGkgLmtvCi0ucnVuLm9rOgotCXJtIC1mIHRtcC0kKiAkKi5oaQotCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCi0JbXYgdG1wLSQqICQqLm9rCi0ucnVuLmhpOgotCXJtIC1mIHRtcC0kKiAkKi5oaSBkaWZmLSQqCi0JdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKLQllY2hvICJIZWxsbyBXb3JsZCIgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgotCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCi0ucnVuLmtvOgotCXJtIC1mIHRtcC0kKiAkKi5rbwotCXNldCArZSA7IFwKLQl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKLQlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAotCSAgZXhpdCAwIDsgXAotCWVsc2UgXAotCSAgZXhpdCAxIDsgXAotCWZpCi0JbXYgdG1wLSQqICQqLmtvCi0KLQotIyBSdWxlcyBmb3IgYnVpbGRpbmcgYWxsIHRoZSB0ZXN0cyBhbmQgcGFja2luZyB0aGVtIGludG8KLSMgdXVlbmNvZGVkIGZpbGVzLgotCi11dWVuY29kZTogZW0tcHN0ci51IGVtLWUwLnUgZW0tZTQ3LnUgZW0tcGNoci51Ci0KLS5TVUZGSVhFUzogLnUgLnMgLnJ1bgotLnMudToKLQlybSAtZiAkKi5vICQqLnJ1bgotCSQoQVNfRk9SX1RBUkdFVCkgJChzcmNkaXIpLyQqLnMgLW8gJCoubwotCSQoTERfRk9SX1RBUkdFVCkgLW8gJCogJCoubwotCXV1ZW5jb2RlIDwgJCogJCogPiAkKi51Ci0Jcm0gLWYgJCoubyAkKgotLnMucnVuOgotCXJtIC1mICQqLm8gJCoucnVuCi0JJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCi0JJChMRF9GT1JfVEFSR0VUKSAtbyAkKi5ydW4gJCoubwotCXJtIC1mICQqLm8gJCoKLQotCi1jbGVhbiBtb3N0bHljbGVhbjoKLQlybSAtZiAqfiBjb3JlICoubyBhLm91dAotCXJtIC1mICQoVEVTVFMpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQlybSAtZiAqfiBjb3JlCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyAqLWluaXQuZXhwCi0Jcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCi0KLU1ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvY29uZmlndXJlIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNjU2Y2IuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw5MDIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLUNDPSR7Q0MtY2N9Ci0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTczOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjEyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0KLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCi0jIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgotIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgotY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZwotcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKLXMlXFslXFwmJWcKLXMlXF0lXFwmJWcKLXMlXCQlJCQlZwotRU9GCi1ERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKLXJtIC1mIGNvbmZ0ZXN0LmRlZnMKLQotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBDQ0AlJENDJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2NvbmZpZ3VyZS5pbiBiL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzODllLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KLWRubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKLWRubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCi1kbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUFDX1BSRVJFUSgyLjUpCi1kbmwgRklYTUUgLSB0aGluayBvZiBhIHRydWx5IHVuaXEgZmlsZSB0byB0aGlzIGRpcmVjdG9yeQotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotQ0M9JHtDQy1jY30KLUFDX1NVQlNUKENDKQotQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQUNfU1VCU1QodGFyZ2V0X2NwdSkKLQotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2V4aXQ0Ny5zIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9leGl0NDcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MTRlMy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2V4aXQ0Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JOzsgUmV0dXJuIHdpdGggZXhpdCBjb2RlIDQ3LgotCi0JLmdsb2JsIF9zdGFydAotX3N0YXJ0OgotCWxkaTggcjEsIzQ3Ci0JbGRpOCByMCwjMQotCXRyYXAgIzAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvaGVsbG8ucyBiL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvaGVsbG8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxNjkzNC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2hlbGxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0KLQkuZ2xvYmwgX3N0YXJ0Ci1fc3RhcnQ6Ci0KLTsgd3JpdGUgKGhlbGxvIHdvcmxkKQotCWxkaTggcjMsIzE0Ci0JbGQyNCByMiwjaGVsbG8KLQlsZGk4IHIxLCMxCi0JbGRpOCByMCwjNQotCXRyYXAgIzAKLTsgZXhpdCAoMCkKLQlsZGk4IHIxLCMwCi0JbGRpOCByMCwjMQotCXRyYXAgIzAKLQotbGVuZ3RoOgkubG9uZyAxNAotaGVsbG86CS5hc2NpaSAiSGVsbG8gV29ybGQhXHJcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvbG9vcC5zIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9sb29wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGNmYjQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9sb29wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkuZ2xvYmwgX3N0YXJ0Ci1fc3RhcnQ6CWJyYSBfc3RhcnQKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL0NoYW5nZUxvZyBiL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYWQyMi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRodSBBdWcgMTMgMjI6Mzc6MjkgRURUIDE5OTggIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLCBjb25maWd1cmUuaW46Ci0JQ3JlYXRlIGEgbWluaW1hbCB0ZXN0c3VpdGUuCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL01ha2VmaWxlLmluIGIvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTkxYWUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIHRoZSBHTlUgZGVidWdnZXIuCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSMgR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVZQQVRIID0gQHNyY2RpckAKLXNyY2RpciA9IEBzcmNkaXJACi1zcmNyb290ID0gJChzcmNkaXIpLy4uCi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWJ1aWxkX2Nhbm9uaWNhbCA9IEBidWlsZEAKLWhvc3RfY2Fub25pY2FsID0gQGhvc3RACi10YXJnZXRfY2Fub25pY2FsID0gQHRhcmdldEAKLXRhcmdldF9jcHUgPSBAdGFyZ2V0X2NwdUAKLQotCi1TSEVMTCA9IC9iaW4vc2gKLVNVQkRJUlMgPSBAc3ViZGlyc0AKLVJQQVRIX0VOVlZBUiA9IEBSUEFUSF9FTlZWQVJACi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gJChSVU5URVNUX0ZPUl9UQVJHRVQpCi0KLVJVTlRFU1RGTEFHUyA9Ci0KLVJVTlRFU1RfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLWYgJCR7c3JjZGlyfS8uLi8uLi8uLi9kZWphZ251L3J1bnRlc3QgXTsgdGhlbiBcCi0gICAgZWNobyAkJHtzcmNkaXJ9Ly4uLy4uLy4uL2RlamFnbnUvcnVudGVzdDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXTsgdGhlbiBcCi0gICAgICBlY2hvIHJ1bnRlc3Q7IFwKLSAgICBlbHNlIFwKLSAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHJ1bnRlc3QgfCBzZWQgLWUgJycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLQotQVNfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vZ2FzL2FzLW5ldyBdOyB0aGVuIFwKLSAgICBlY2hvIC4uLy4uLy4uL2dhcy9hcy1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWFzIDsgXAotICBmaWAKLQotTERfRk9SX1RBUkdFVCA9IGBcCi0gIGlmIFsgLXggLi4vLi4vLi4vbGQvbGQtbmV3IF07IHRoZW4gXAotICAgIGVjaG8gLi4vLi4vLi4vbGQvbGQtbmV3IDsgXAotICBlbHNlIFwKLSAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1sZCA7IFwKLSAgZmlgCi0KLVJVTl9GT1JfVEFSR0VUID0gYFwKLSAgaWYgWyAteCAuLi8uLi8uLi9zaW0vbWlwcy9ydW4gXTsgdGhlbiBcCi0gICAgZWNobyAuLi8uLi8uLi9zaW0vbWlwcy9ydW4gOyBcCi0gIGVsc2UgXAotICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLXJ1biA7IFwKLSAgZmlgCi0KLVRFU1RTID0gCi0KLWNoZWNrOiBzYW5pdHkgJChURVNUUykKLXNhbml0eToKLQlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQgPSAkKEFTX0ZPUl9UQVJHRVQpCi0JQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUID0gJChMRF9GT1JfVEFSR0VUKQotCUBldmFsIGVjaG8gUlVOX0ZPUl9UQVJHRVQgPSAkKFJVTl9GT1JfVEFSR0VUKQotCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBwdXQgaW50byB0aHJlZSB0eXBlcwotIyBleGl0IHN1Y2Nlc3MsIGV4aXQgZmFpbCwgcHJpbnQgIkhlbGxvIFdvcmxkIgotCi0udS5sb2c6Ci0JdXVkZWNvZGUgJCoudQotCSQoUlVOX0ZPUl9UQVJHRVQpICQqID4gJCoubG9nCi0KLQotIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKLQotLlNVRkZJWEVTOiAudSAudXVlIC5vayAub2sgLnJ1biAuaGkgLmtvIC5rbwotLnJ1bi5vazoKLQlybSAtZiB0bXAtJCogJCoub2sKLQl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgotCW12IHRtcC0kKiAkKi5vawotLnJ1bi5oaToKLQlybSAtZiB0bXAtJCogJCouaGkgZGlmZi0kKgotCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCi0JZWNobyAnSGVsbG8gV29ybGQhJyB8IGRpZmYgLSB0bXAtJCogPiBkaWZmLSQqCi0JY2F0IHRtcC0kKiBkaWZmLSQqID4gJCouaGkKLS5ydW4ua286Ci0Jcm0gLWYgdG1wLSQqICQqLmtvCi0Jc2V0ICtlIDsgXAotCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqIDsgXAotCWlmIFsgJCQ/IC1lcSA0NyBdIDsgdGhlbiBcCi0JICBleGl0IDAgOyBcCi0JZWxzZSBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQltdiB0bXAtJCogJCoua28KLQotCi0jIFJ1bGVzIGZvciBidWlsZGluZyBhbGwgdGhlIHRlc3RzIGFuZCBwYWNraW5nIHRoZW0gaW50bwotIyB1dWVuY29kZWQgZmlsZXMuCi0KLS5ydW4udToKLQl1dWVuY29kZSA8ICQqLnJ1biAkKi5ydW4gPiAkKi51Ci0JQGVjaG8gIk1vdmUgJCoudSAkKi51dWUiCi0udXVlLnJ1bjoKLQl1dWRlY29kZSAkKHNyY2RpcikvJCoudXVlCi0uby5ydW46Ci0JJChMRF9GT1JfVEFSR0VUKSAtVHRleHQgMHhhMDAyMDAwMCAtbyAkKi5ydW4gJCoubwotLnMubzoKLQkkKEFTX0ZPUl9UQVJHRVQpIC1JICQoc3JjZGlyKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCi0KLQotIwotIyBTdGFuZGFyZAotIwotY2xlYW4gbW9zdGx5Y2xlYW46Ci0JLXJtIC1mICp+IGNvcmUgKi5vIGEub3V0ICoueCAqLmdydCAqLnJ1biB0bXAtKiBkaWZmLSoKLQlybSAtZiAkKFRFU1RTKQotIwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCi0jCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKLSMJICAgIGRvIFwKLSMJCSAgICBlY2hvICIkJGRpcjoiOyBcCi0jCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKLSMJCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGNsZWFuKTsgXAotIwkJICAgIGZpOyBcCi0jCSAgICBkb25lIDsgXAotIwllbHNlIHRydWU7IGZpCi0KLWRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KLQktcm0gLWYgKn4gY29yZQotCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKLQktcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCi0jCWlmIFsgeCIke1NVQkRJUlN9IiAhPSB4IF0gOyB0aGVuIFwKLSMJICAgIGZvciBkaXIgaW4gJHtTVUJESVJTfTsgXAotIwkgICAgZG8gXAotIwkJICAgIGVjaG8gIiQkZGlyOiI7IFwKLSMJCSAgICBpZiBbIC1kICQkZGlyIF07IHRoZW4gXAotIwkJCSAgICAoY2QgJCRkaXI7ICQoTUFLRSkgZGlzdGNsZWFuKTsgXAotIwkJICAgIGZpOyBcCi0jCSAgICBkb25lIDsgXAotIwllbHNlIHRydWU7IGZpCi0KLU1ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogY29uZmlndXJlCi0JJChTSEVMTCkgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL2NvbmZpZ3VyZSBiL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZmMDgzNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1DQz0ke0NDLWNjfQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3NTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTY6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgotIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KLSMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KLWNhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKLXMlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCi1zJVxbJVxcJiVnCi1zJVxdJVxcJiVnCi1zJVwkJSQkJWcKLUVPRgotREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCi1ybSAtZiBjb25mdGVzdC5kZWZzCi0KLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAQ0NAJSRDQyVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzODllLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi1kbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCi1kbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjawotZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19QUkVSRVEoMi41KQotZG5sIEZJWE1FIC0gdGhpbmsgb2YgYSB0cnVseSB1bmlxIGZpbGUgdG8gdGhpcyBkaXJlY3RvcnkKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLUNDPSR7Q0MtY2N9Ci1BQ19TVUJTVChDQykKLUFDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4pCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFDX1NVQlNUKHRhcmdldF9jcHUpCi0KLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA5ZGYxLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkLmNncworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYWRkICRSaiwkUmksIGFkZCAkdTQsJFJqCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZAotYWRkOgotCTsgVGVzdCBhZGQgJFJqLCRSaQotCW12aV9oX2dyICAgCTEscjcKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMyxyOAotCi0JbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyNwotCW12aV9oX2dyICAgCTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFkZAkJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQJCXI4LHI4Ci0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9nciAgCTAscjgKLQotCTsgVGVzdCBhZGQgJHU0UmkKLQltdmlfaF9nciAgIAk0LHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQJCTAscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJNCxyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYWRkCQkxLHI4Ci0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfaF9nciAgCTUscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFkZAkJMTUscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMjAscjgKLQltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI4CTsgdGVzdCBuZWcgYW5kIG92ZXJmbG93IGJpdHMKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFkZAkJMSxyOAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQJCXI4LHI4CQk7IHRlc3QgemVybywgY2FycnkgYW5kIG92ZXJmbG93IGJpdHMKLQl0ZXN0X2NjCQkwIDEgMSAxOwotCXRlc3RfaF9nciAgCTAscjgKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGQubXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTY4NjguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGQubXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGFkZCAkUmosJFJpCi0jIGNwdSB7fQotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZAotYWRkOgotCWFkZCBhYyxhYwotCWZhaWwKLQlFWElUIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZDIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTZhY2RlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkMi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGFkZDIgJG00LCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQltdmlfaF9nciAgIAkzMCxyOAotCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQyICAgICAgIAktMTYscjgJOyBNYXggdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9nciAgCTE0LHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYWRkMiAgICAgICAJLTMscjgJOyBNaWQgdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9nciAgCTExLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYWRkMiAgICAgICAJLTEscjgJOyBNaW4gdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9nciAgCTEwLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYWRkMiAgICAgICAJLTEwLHI4CTsgVGVzdCB6ZXJvIGFuZCBjYXJyeSBiaXRzCi0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9nciAgCTAscjgKLQotCXNldF9jYyAgICAgICAgICAweDA3CTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhZGQyICAgICAgIAktMTYscjgJOyBUZXN0IG5lZ2F0aXZlIGJpdAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfZ3IgIAktMTYscjgKLQotCW12aV9oX2dyCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYwk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYWRkMiAgICAgICAJLTEscjgJOyBUZXN0IG92ZXJmbG93IGJpdAotCXRlc3RfY2MJCTAgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZGMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRjLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNTQ3OC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZGMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBhZGRjICRSaiwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkCi1hZGQ6Ci0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBNYWtlIHN1cmUgY2FycnkgYml0IGlzIG9mZgotCWFkZGMgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMyxyOAotCi0JbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyNwotCW12aV9oX2dyICAgCTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBNYWtlIHN1cmUgY2FycnkgYml0IGlzIG9mZgotCWFkZGMJCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IE1ha2Ugc3VyZSBjYXJyeSBiaXQgaXMgb2ZmCi0JYWRkYwkJcjgscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyOAotCi0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBNYWtlIHN1cmUgY2FycnkgYml0IGlzIG9uCi0JYWRkYyAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2hfZ3IgIAk0LHI4Ci0KLQltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI3Ci0JbXZpX2hfZ3IgICAJMCxyOAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IE1ha2Ugc3VyZSBjYXJyeSBiaXQgaXMgb24KLQlhZGRjCQlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgTWFrZSBzdXJlIGNhcnJ5IGJpdCBpcyBvbgotCWFkZGMJCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMTsKLQl0ZXN0X2hfZ3IgIAkwLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZG4uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRuLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2MzhkNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZG4uY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBhZGRuICRSaiwkUmksIGFkZG4gJHU0LCRSagotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRuCi1hZGRuOgotCTsgVGVzdCBhZGRuICRSaiwkUmkKLQltdmlfaF9nciAgIAkxLHI3Ci0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTMscjgKLQotCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcKLQltdmlfaF9nciAgIAkxLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAotCWFkZG4JCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuCQlyOCxyOAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkwLHI4Ci0KLQk7IFRlc3QgYWRkbiAkdTRSaQotCW12aV9oX2dyICAgCTQscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0Ci0JYWRkbgkJMCxyOAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAk0LHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAotCWFkZG4JCTEscjgKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJNSxyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuCQkxNSxyOAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkyMCxyOAotCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjgJOyB0ZXN0IG5lZyBhbmQgb3ZlcmZsb3cgYml0cwotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuCQkxLHI4Ci0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0Ci0JYWRkbgkJcjgscjgJCTsgdGVzdCB6ZXJvLCBjYXJyeSBhbmQgb3ZlcmZsb3cgYml0cwotCXRlc3RfY2MJCTEgMCAwIDA7Ci0JdGVzdF9oX2dyICAJMCxyOAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRuMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZG4yLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyNWJhZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZG4yLmNncworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYWRkbjIgJG00LCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQltdmlfaF9nciAgIAkzMCxyOAotCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAotCWFkZG4yICAgICAgIAktMTYscjgJOyBNYXggdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTE0LHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuMiAgICAgICAJLTMscjgJOyBNaWQgdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTExLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuMiAgICAgICAJLTEscjgJOyBNaW4gdmFsdWUgb2YgaW1tZWRpYXRlIGZpZWxkCi0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTEwLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuMiAgICAgICAJLTEwLHI4CTsgVGVzdCB6ZXJvIGFuZCBjYXJyeSBiaXRzCi0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTAscjgKLQotCXNldF9jYyAgICAgICAgICAweDA3CTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAotCWFkZG4yICAgICAgIAktMTYscjgJOyBUZXN0IG5lZ2F0aXZlIGJpdAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAktMTYscjgKLQotCW12aV9oX2dyCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYwk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKLQlhZGRuMiAgICAgICAJLTEscjgJOyBUZXN0IG92ZXJmbG93IGJpdAotCXRlc3RfY2MJCTEgMSAwIDAKLQl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZHNwLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkc3AuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTViYzM2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkc3AuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBhZGRzcCAkczEwCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHNwCi1hZGRzcDoKLQk7IFRlc3QgYWRkc3AgJHMxMAotCW12cl9oX2dyICAgCXNwLHI3CQkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgcGVybWFuZW50bHkKLQltdnJfaF9ncglzcCxyOAkJCTsgU2hhZG93IHVwZGF0ZWQgc3AKLQlzZXRfY2MJMHgwZgkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JYWRkc3AgICAgICAJNTA4Ci0JdGVzdF9jYwkJMSAxIDEgMQotCWluY2lfaF9ncgk1MDgscjgKLQl0ZXN0cl9oX2dyCXI4LHNwCi0KLQlzZXRfY2MJMHgwZQkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JYWRkc3AgICAgICAJMAotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0cl9oX2dyCXI4LHNwCi0KLQlzZXRfY2MJMHgwZAkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JYWRkc3AgICAgICAJLTUxMgotCXRlc3RfY2MJCTEgMSAwIDEKLQlpbmNpX2hfZ3IJLTUxMixyOAotCXRlc3RyX2hfZ3IJcjgsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWxsaW5zbi5leHAgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNkNTEyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIEZSMzAgc2ltdWxhdG9yIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0gewotICAgICMgbG9hZCBzdXBwb3J0IHByb2NzCi0gICAgIyBsb2FkX2xpYiBjZ2VuLmV4cAotCi0gICAgIyBhbGwgbWFjaGluZXMKLSAgICBzZXQgYWxsX21hY2hzICJmcjMwIgotCi0gICAgZm9yZWFjaCBzcmMgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNnc11dIHsKLQkjIElmIHdlJ3JlIG9ubHkgdGVzdGluZyBzcGVjaWZpYyBmaWxlcyBhbmQgdGhpcyBpc24ndCBvbmUgb2YgdGhlbSwKLQkjIHNraXAgaXQuCi0JaWYgIVtydW50ZXN0X2ZpbGVfcCAkcnVudGVzdHMgJHNyY10gewotCSAgICBjb250aW51ZQotCX0KLQotCXJ1bl9zaW1fdGVzdCAkc3JjICRhbGxfbWFjaHMKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDhhMzEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBhbmQgJFJqLCRSaSwgYW5kICRSaixAJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGFuZAotYW5kOgotCTsgVGVzdCBhbmQgJFJqLCRSaQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9nciAgIAkweDU1NTU1NTU1LHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhbmQgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyOAotCi0JbXZpX2hfZ3IgICAJMHhmZmZmMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYW5kCQlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkweGFhYWEwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweGZmZmYscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFuZAkJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX2dyICAJMHhhYWFhLHI4Ci0KLQk7IFRlc3QgYW5kICRSaixAJFJpCi0JbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNwotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFuZCAgICAgIAlyNyxAc3AKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX21lbSAJMCxzcAotCi0JbXZpX2hfbWVtICAJMHhmZmZmMDAwMCxzcAotCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYW5kCQlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX21lbSAJMHhhYWFhMDAwMCxzcAotCi0JbXZyX2hfZ3IJc3AscjkKLQlpbmNpX2hfZ3IJNCxyOQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQltdmlfaF9tZW0gIAkweGZmZmYwMDAwLHI5Ci0JaW5jaV9oX2dyCTEsc3AJCTsgdGVzdCB1bmFsaWduZWQgYWNjZXNzCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhbmQJCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAwIDEKLQlpbmNpX2hfZ3IJLTEsc3AKLQl0ZXN0X2hfbWVtIAkweGFhYWFhYWFhLHNwCi0JdGVzdF9oX21lbSAJMHhmZmZmMDAwMCxyOQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kYi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWQ0OWQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRiLmNncworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYW5kYiAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhbmRiCi1hbmRiOgotCTsgVGVzdCBhbmRiICRSaixAJFJpCi0JbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNwotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFuZGIgICAgICAJcjcsQHNwCi0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9tZW0gCTB4MDA1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFuZGIJCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfbWVtIAkweGFhZmZmZmZmLHNwCi0KLQltdmlfaF9tZW0gIAkweDBmZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhbmRiCQlyNyxAc3AKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX21lbSAJMHgwYWZmZmZmZixzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRjY3IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRjY3IuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhmOTllLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kY2NyLmNncworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYW5kY2NyICR1OAotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhbmRjY3IKLWFuZGNjcjoKLQlzZXRfY2MJCTB4MDAKLQlzZXRfaQkJCTAKLQlzZXRfc19zeXN0ZW0KLQlhbmRjY3IgICAgICAJMHhmZgotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2kJCTAKLQl0ZXN0X3Nfc3lzdGVtCi0KLQlzZXRfY2MJCTB4MGYKLQlzZXRfaQkJCTEKLQlzZXRfc191c2VyCi0JYW5kY2NyICAgICAgCTB4ZmYKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9pCQkxCi0JdGVzdF9zX3VzZXIKLQotCXNldF9jYwkJMHgwZgotCXNldF9pCQkJMQotCXNldF9zX3VzZXIKLQlhbmRjY3IgICAgICAJMHhhYQotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2kJCTAKLQl0ZXN0X3NfdXNlcgotCi0Jc2V0X2NjCQkweDBmCi0Jc2V0X2kJCQkxCi0Jc2V0X3NfdXNlcgotCWFuZGNjciAgICAgIAkweGMwCi0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfaQkJMAotCXRlc3Rfc19zeXN0ZW0KLQotCXNldF9jYwkJMHgwZgotCXNldF9pCQkJMQotCXNldF9zX3VzZXIKLQlhbmRjY3IgICAgICAJMHgzZgkJOyBubyBlZmZlY3QKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9pCQkxCi0JdGVzdF9zX3VzZXIKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZGguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTcyZmM3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kaC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGFuZGggJFJqLEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYW5kaAotYW5kaDoKLQk7IFRlc3QgYW5kaCAkUmosQCRSaQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhbmRoICAgICAgCXI3LEBzcAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfbWVtIAkweDAwMDA1NTU1LHNwCi0KLQltdmlfaF9tZW0gIAkweGZmZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhbmRoCQlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX21lbSAJMHhhYWFhZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHgwMGZmZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYW5kaAkJcjcsQHNwCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9tZW0gCTB4MDBhYWZmZmYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYXNyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYXNyLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4M2Q0MS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Fzci5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGFzciAkUmosJFJpLCBhc3IgJHU0LCRSagotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBhc3IKLWFzcjoKLQk7IFRlc3QgYXNyICRSaiwkUmkKLQltdmlfaF9nciAgIAkweGRlYWRiZWUwLHI3CTsgU2hpZnQgYnkgMAotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFzciAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweGRlYWRiZWUxLHI3CTsgU2hpZnQgYnkgMQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFzciAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweGMwMDAwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweGRlYWRiZWZmLHI3CTsgU2hpZnQgYnkgMzEKLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhc3IgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2dyICAJLTEscjgKLQotCW12aV9oX2dyICAgCTB4ZGVhZGJlZmYscjcJOyBjbGVhciByZWdpc3RlcgotCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFzciAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQk7IFRlc3QgYXNyICR1NFJpCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYXNyICAgICAgCTAscjgKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyOAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYXNyICAgICAgCTEscjgKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2dyICAJMHhjMDAwMDAwMCxyOAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYXNyICAgICAgCTE1LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTB4ZmZmZjAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4MDAwMDQwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFzciAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FzcjIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hc3IyLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0ZTQwZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FzcjIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBhc3IyICR1NCwkUmoKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYXNyMgotYXNyMjoKLQk7IFRlc3QgYXNyMiAkdTRSaQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWFzcjIgICAgICAJMCxyOAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkweGZmZmY4MDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlhc3IyICAgICAgCTEscjgKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2dyICAJMHhmZmZmYzAwMCxyOAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYXNyMiAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfZ3IgIAktMSxyOAotCi0JbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JYXNyMiAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JhbmRoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmFuZGguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFiNWU1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmFuZGguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBiYW5kaCAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBiYW5kaAotYmFuZGg6Ci0JOyBUZXN0IGJhbmRoICRSaixAJFJpCi0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJhbmRoICAgICAgCTB4MGEsQHNwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9tZW0gCTB4MDU1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQliYW5kaAkJMHgwYSxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHhhZmZmZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHhlNWZmZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJhbmRoCQkweDA3LEBzcAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfbWVtIAkweDY1ZmZmZmZmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JhbmRsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmFuZGwuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0ODI1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmFuZGwuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBiYW5kbCAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBiYW5kbAotYmFuZGw6Ci0JOyBUZXN0IGJhbmRsICRSaixAJFJpCi0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJhbmRsICAgICAgCTB4MGEsQHNwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9tZW0gCTB4NTA1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQliYW5kbAkJMHgwYSxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHhmYWZmZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHg1ZWZmZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJhbmRsCQkweDA3LEBzcAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfbWVtIAkweDU2ZmZmZmZmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JjLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmMuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyNjI1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmMgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBiYwotYmM6Ci0JOyBUZXN0IGJjICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmMKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliYwotCi0JOyBUZXN0IGJjOmQgbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweGIKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4YQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweDcKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4NgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweDUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4NAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmM6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliYzpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZW9yaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jlb3JoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwN2YxYS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jlb3JoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmVvcmggJFJqLEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYmVvcmgKLWJlb3JoOgotCTsgVGVzdCBiZW9yaCAkUmosQCRSaQotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQliZW9yaCAgICAgIAkweDBhLEBzcAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfbWVtIAkweGY1NTU1NTU1LHNwCi0KLQltdmlfaF9tZW0gIAkweDBmZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JYmVvcmgJCTB4MDAsQHNwCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9tZW0gCTB4MGZmZmZmZmYsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQliZW9yaAkJMHgwZixAc3AKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX21lbSAJMHgwZmZmZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHg5ZWFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJlb3JoCQkweDA0LEBzcAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jlb3JsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVvcmwuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VhMDUzLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVvcmwuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBiZW9ybCAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBiZW9ybAotYmVvcmw6Ci0JOyBUZXN0IGJlb3JsICRSaixAJFJpCi0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJlb3JsICAgICAgCTB4MGEsQHNwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9tZW0gCTB4NWY1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZjBmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQliZW9ybAkJMHgwMCxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHhmMGZmZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHhmZmZmZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJlb3JsCQkweDBmLEBzcAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfbWVtIAkweGYwZmZmZmZmLHNwCi0KLQltdmlfaF9tZW0gIAkweGRkYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JYmVvcmwJCTB4MDMsQHNwCi0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVxLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVxLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNzk3ZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JlcS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBiZXEgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBiZXEKLWJlcToKLQk7IFRlc3QgYmVxICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZXEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZXEKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmVxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJlcQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZXEKLQotCTsgVGVzdCBiZXE6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJlcTpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmVxOmQgMHhkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweGMKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZXE6ZCAweGIKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZXE6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZXE6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZXE6ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJlcTpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmVxOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweDUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJlcTpkIDB4NAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJlcTpkIDB4MwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJlcTpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJlcTpkIDB4MQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJlcTpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZ2UuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZ2UuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDc3OTZjLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmdlLmNncworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGJnZSAkbGFiZWw5Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGJnZQotYmdlOgotCTsgVGVzdCBiZ2UgJGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmdlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmdlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ2UKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmdlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJnZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJnZQotCi0JOyBUZXN0IGJnZTpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmdlOmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmdlOmQgMHhkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmdlOmQgMHhjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZ2U6ZCAweGIKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4YQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJnZTpkIDB4OQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJnZTpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJnZTpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJnZTpkIDB4NgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmdlOmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZ2U6ZCAweDQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ2U6ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ2U6ZCAweDIKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4MQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmdlOmQgMHgwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JndC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JndC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNWFjMmUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZ3QuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmd0ICRsYWJlbDkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYmd0Ci1iZ3Q6Ci0JOyBUZXN0IGJndCAkbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmd0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJndAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmd0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJndAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmd0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJndAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliZ3QKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmd0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJndAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJndAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJndAotCi0JOyBUZXN0IGJndDpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweGUKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweGMKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJndDpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmd0OmQgMHhhCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg5Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHgzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmd0OmQgMHgyCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliZ3Q6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJndDpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iaGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iaGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWExNTQ5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmhpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGJoaSAkbGFiZWw5Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGJoaQotYmhpOgotCTsgVGVzdCBiaGkgJGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmhpCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliaGkKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmhpCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliaGkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliaGkKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmhpCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliaGkKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmhpCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJoaQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAliaGkKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAliaGkKLQotCTsgVGVzdCBiaGk6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHhmCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHhkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHhjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHhiCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliaGk6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAliaGk6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJoaTpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJoaTpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJoaTpkIDB4NgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJoaTpkIDB4NQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJoaTpkIDB4NAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJoaTpkIDB4MwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmhpOmQgMHgyCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmhpOmQgMHgxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAliaGk6ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxlLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxlLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzM2Y3OC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JsZS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibGUgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibGUKLWJsZToKLQk7IFRlc3QgYmxlICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJsZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibGUKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmxlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJsZQotCi0JOyBUZXN0IGJsZTpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxlOmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsZTpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsZTpkIDB4YQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxlOmQgMHg5Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxlOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4NAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxlOmQgMHgzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDIKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibGU6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibGU6ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxzLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxNDhiNy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jscy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibHMgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibHMKLWJsczoKLQk7IFRlc3QgYmxzICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJscwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJscwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmxzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJscwotCi0JOyBUZXN0IGJsczpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxzOmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxzOmQgMHhiCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmxzOmQgMHhhCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibHM6ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxzOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweDUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4NAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmxzOmQgMHgzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmxzOmQgMHgyCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibHM6ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmx0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmx0LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiNmZmMS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JsdC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibHQgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibHQKLWJsdDoKLQk7IFRlc3QgYmx0ICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibHQKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibHQKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmx0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibHQKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYmx0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmx0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYmx0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJsdAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibHQKLQotCTsgVGVzdCBibHQ6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmx0OmQgMHhmCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmx0OmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsdDpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsdDpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsdDpkIDB4YQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmx0OmQgMHg5Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsdDpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYmx0OmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmx0OmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYmx0OmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJsdDpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsdDpkIDB4MQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJsdDpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JuLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4NThmYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JuLmNncworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGJuICRsYWJlbDkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYm4KLWJuOgotCTsgVGVzdCBibiAkbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm4KLQotCTsgVGVzdCBibjpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuOmQgMHhmCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibjpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm46ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuOmQgMHhjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibjpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm46ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuOmQgMHg5Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibjpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuOmQgMHg3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm46ZCAweDYKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibjpkIDB4NQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuOmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm46ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibjpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuOmQgMHgxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm46ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5jLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5jLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2OGM0My4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JuYy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibmMgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibmMKLWJjOgotCTsgVGVzdCBibmMgJGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJuYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibmMKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmMKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJuYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibmMKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmMKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5jCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJuYwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJuYwotCi0JOyBUZXN0IGJuYzpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibmM6ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuYzpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuYzpkIDB4ZAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5jOmQgMHhjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5jOmQgMHhiCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibmM6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibmM6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuYzpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuYzpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5jOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5jOmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibmM6ZCAweDQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibmM6ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuYzpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuYzpkIDB4MQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5jOmQgMHgwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JuZS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JuZS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTcxZGUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibmUuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYm5lICRsYWJlbDkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYm5lCi1ibmU6Ci0JOyBUZXN0IGJuZSAkbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJuZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJuZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibmUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5lCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm5lCi0KLQk7IFRlc3QgYm5lOmQgbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuZTpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuZTpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuZTpkIDB4ZAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJuZTpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5lOmQgMHhiCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibmU6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuZTpkIDB4OQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5lOmQgMHg4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5lOmQgMHg3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5lOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5lOmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm5lOmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibmU6ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJuZTpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm5lOmQgMHgxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibmU6ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5vLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5vLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZjliYS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Juby5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibm8gJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibm8KLWJubzoKLQk7IFRlc3QgYm5vICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibm8KLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5vCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibm8KLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5vCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibm8KLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5vCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibm8KLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5vCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibm8KLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm5vCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJubwotCi0JOyBUZXN0IGJubzpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGUKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGMKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGIKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDcKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDYKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDUKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDMKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDIKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibm86ZCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm52LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm52LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNWFiZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Judi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBibnYgJGxhYmVsOQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBibnYKLWJudjoKLQk7IFRlc3QgYm52ICRsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJudgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm52Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJudgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJudgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJudgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYm52Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm52Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYm52Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJudgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibnYKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlibnYKLQotCTsgVGVzdCBibnY6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm52OmQgMHhmCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm52OmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibnY6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJudjpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJudjpkIDB4YQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm52OmQgMHg5Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibnY6ZCAweDgKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibnY6ZCAweDcKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlibnY6ZCAweDYKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4NQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYm52OmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm52OmQgMHgzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYm52OmQgMHgyCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlibnY6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm9yaC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOWYxOGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYm9yaCAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBib3JoCi1ib3JoOgotCTsgVGVzdCBib3JoICRSaixAJFJpCi0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJvcmggICAgICAJMHgwYSxAc3AKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX21lbSAJMHhmNTU1NTU1NSxzcAotCi0JbXZpX2hfbWVtICAJMHgwZmZmZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDA0CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJvcmgJCTB4MDAsQHNwCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9tZW0gCTB4MGZmZmZmZmYsc3AKLQotCW12aV9oX21lbSAgCTB4Y2VhZGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlib3JoCQkweDAxLEBzcAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JvcmwuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JsLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMmJiYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JvcmwuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBib3JsICRSaixAJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGJvcmwKLWJvcmw6Ci0JOyBUZXN0IGJvcmwgJFJqLEAkUmkKLQltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JYm9ybCAgICAgIAkweDBhLEBzcAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfbWVtIAkweDVmNTU1NTU1LHNwCi0KLQltdmlfaF9tZW0gIAkweGYwZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JYm9ybAkJMHgwMCxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHhmMGZmZmZmZixzcAotCi0JbXZpX2hfbWVtICAJMHhkY2FkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWJvcmwJCTB4MDIsQHNwCi0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9icC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTMyODMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9icC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBicCAkbGFiZWw5Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGJwCi1icDoKLQk7IFRlc3QgYnAgJGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlicAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJwCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlicAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJwCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYnAKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlicAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJwCi0KLQk7IFRlc3QgYnA6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYnA6ZCAweGYKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlicDpkIDB4ZQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJwOmQgMHhkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYnA6ZCAweGMKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlicDpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJwOmQgMHhhCi0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2hfZCAJYnA6ZCAweDkKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlicDpkIDB4OAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnA6ZCAweDcKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJwOmQgMHg2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicDpkIDB4NQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnA6ZCAweDQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJwOmQgMHgzCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicDpkIDB4MgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnA6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJwOmQgMHgwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JyYS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JyYS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzJmNzQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9icmEuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYnJhICRsYWJlbDkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYnJhCi1icmE6Ci0JOyBUZXN0IGJyYSAkbGFiZWw5Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJyYQotCi0JOyBUZXN0IGJyYTpkIGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnJhOmQgMHhlCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweGQKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4YwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnJhOmQgMHhiCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4OQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnJhOmQgMHg4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDcKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4NgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnJhOmQgMHg1Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4MwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnJhOmQgMHgyCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDEKLQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4MAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idHN0aC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J0c3RoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5N2MzNC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J0c3RoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYnRzdGggJFJqLEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYnRzdGgKLWJ0c3RoOgotCTsgVGVzdCBidHN0aCAkUmosQCRSaQotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWJ0c3RoICAgICAgCTB4MGEsQHNwCi0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9tZW0gCTB4NTU1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWJ0c3RoCQkweDBhLEBzcAotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfbWVtIAkweGZmZmZmZmZmLHNwCi0KLQltdmlfaF9tZW0gIAkweGU1ZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlidHN0aAkJMHgwNyxAc3AKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX21lbSAJMHhlNWZmZmZmZixzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idHN0bC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J0c3RsLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmNWE5Mi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J0c3RsLmNncworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgYnRzdGwgJFJqLEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgYnRzdGwKLWJ0c3RsOgotCTsgVGVzdCBidHN0bCAkUmosQCRSaQotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWJ0c3RsICAgICAgCTB4MGEsQHNwCi0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9tZW0gCTB4NTU1NTU1NTUsc3AKLQotCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWJ0c3RsCQkweDBhLEBzcAotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2hfbWVtIAkweGZmZmZmZmZmLHNwCi0KLQltdmlfaF9tZW0gIAkweDVlZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlidHN0bAkJMHgwNyxAc3AKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX21lbSAJMHg1ZWZmZmZmZixzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J2LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYjlhY2YuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBidiAkbGFiZWw5Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGJ2Ci1idjoKLQk7IFRlc3QgYnYgJGxhYmVsOQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlidgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYnYKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlidgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlidgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoIAlidgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaCAJYnYKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnYKLQotCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaCAJYnYKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCXRha2VfYnJhbmNoIAlidgotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJ2Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub19icmFuY2ggCWJ2Ci0KLQk7IFRlc3QgYnY6ZCBsYWJlbDkKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlidjpkIDB4ZgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnY6ZCAweGUKLQotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlidjpkIDB4ZAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJ2OmQgMHhjCi0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlidjpkIDB4YgotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnY6ZCAweGEKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlidjpkIDB4OQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJ2OmQgMHg4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlidjpkIDB4NwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnY6ZCAweDYKLQotCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlidjpkIDB4NQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJ2OmQgMHg0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQl0YWtlX2JyYW5jaF9kIAlidjpkIDB4MwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JdGFrZV9icmFuY2hfZCAJYnY6ZCAweDIKLQotCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCW5vX2JyYW5jaF9kIAlidjpkIDB4MQotCi0Jc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0Jbm9fYnJhbmNoX2QgCWJ2OmQgMHgwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NhbGwuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jYWxsLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzODQwZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NhbGwuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBjYWxsIEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgY2FsbAotCi0JOyBUZXN0IGNhbGwgJFJpCi0JbXZpX2hfZ3IJMHhkZWFkYmVlZixyOQotCW12aV9oX2dyICAgCSNmdW5jMSxyMAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi1jYWxsMToKLQljYWxsCQlAcjAKLQl0ZXN0X2hfZ3IJMHhiZWVmZGVhZCxyOQotCXBhc3MKLQotZnVuYzE6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCW12aV9oX2dyCSNjYWxsMSxyNwotCWluY2lfaF9ncgkyLHI3Ci0JdGVzdHJfaF9kcglyNyxycAotCXNhdmVfcnAKLQotCW12aV9oX2dyICAgCSNmdW5jMixyMAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi1jYWxsMjoKLQljYWxsOmQJCUByMAotCWxkaTo4CQkxLHIwCQk7IE11c3QgYXNzdW1lIHRoaXMgd29ya3MKLQlyZXN0b3JlX3JwCi0JcmV0Ci1mdW5jMjoKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JbXZpX2hfZ3IJI2NhbGwyLHI3Ci0JaW5jaV9oX2dyCTQscjcKLQl0ZXN0cl9oX2RyCXI3LHJwCi0JdGVzdHJfaF9ncgkxLHIwCi0Jc2F2ZV9ycAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLWNhbGwzOgotCWNhbGwJCWZ1bmMzCi0JcmVzdG9yZV9ycAotCXJldAotZnVuYzM6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCW12aV9oX2dyCSNjYWxsMyxyNwotCWluY2lfaF9ncgkyLHI3Ci0JdGVzdHJfaF9kcglyNyxycAotCXNhdmVfcnAKLQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi1jYWxsNDoKLQljYWxsOmQJCWZ1bmM0Ci0JbGRpOjgJCTEscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcwotCXJlc3RvcmVfcnAKLQlyZXQKLWZ1bmM0OgotCXRlc3RfY2MJCTEgMSAxIDEKLQltdmlfaF9ncgkjY2FsbDQscjcKLQlpbmNpX2hfZ3IJNCxyNwotCXRlc3RyX2hfZHIJcjcscnAKLQl0ZXN0cl9oX2dyCTEscjAKLQltdmlfaF9ncgkweGJlZWZkZWFkLHI5Ci0JcmV0Ci0KLQlmYWlsCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NtcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NtcC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmJiZjguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jbXAuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBjbXAgJFJqLCRSaSwgY21wICR1NCwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgY21wCi1jbXA6Ci0JOyBUZXN0IGNtcCAkUmosJFJpCi0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWNtcCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDAKLQotCW12aV9oX2dyICAgCTEscjcKLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQljbXAJCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQljbXAJCXI4LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCi0JbXZpX2hfZ3IgICAJMCxyOAotCXNldF9jYyAgICAgICAgICAweDA2CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JY21wCQlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQotCTsgVGVzdCBjbXAgJHU0LCRSaQotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWNtcCAgICAgIAkxLHI4Ci0JdGVzdF9jYwkJMCAwIDAgMAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JY21wCQkxLHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCi0JbXZpX2hfZ3IgICAJMCxyOAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JY21wCQkwLHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQljbXAJCTE1LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jbXAyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY21wMi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTYyMDEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jbXAyLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgY21wMiAkdTQsJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcDIKLWNtcDI6Ci0JOyBUZXN0IGNtcDIgJHU0LCRSaQotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWNtcDIgICAgICAJLTEscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0KLQltdmlfaF9nciAgIAkweDdmZmZmZmZlLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQljbXAyCQktMixyOAotCXRlc3RfY2MJCTEgMCAxIDEKLQotCW12aV9oX2dyICAgCS0xNixyOAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JY21wMgkJLTE2LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BsZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcGxkLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhYmFiYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcGxkLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgY29wbGQgJHU0LCRjYywkUmosQ1JpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGNvcGxkCi1jb3BsZDoKLQk7IFRlc3QgY29wbGQgY29wbGQgJHU0LCRjYywkUmosQ1JpCi0JOyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vb3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQljb3BsZCAgICAgIAkwLDAscjAsY3IxNQotCXRlc3RfY2MJCTEgMSAxIDEKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWNvcGxkICAgICAgCTE1LDI1NSxyMTUsY3IwCi0JdGVzdF9jYwkJMSAxIDEgMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BvcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcG9wLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZmQ3Ny4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcG9wLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgY29wb3AgJHU0LCRjYywkQ1JqLENSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBjb3BvcAotY29wb3A6Ci0JOyBUZXN0IGNvcG9wIGNvcG9wICR1NCwkY2MsJENSaixDUmkKLQk7IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGEgbm9vcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWNvcG9wICAgICAgCTAsMCxjcjAsY3IxNQotCXRlc3RfY2MJCTEgMSAxIDEKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWNvcG9wICAgICAgCTE1LDI1NSxjcjAsY3IxNQotCXRlc3RfY2MJCTEgMSAxIDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY29wc3QuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BzdC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTIwYjIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BzdC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGNvcHN0ICR1NCwkY2MsJENSaixSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBjb3BzdAotY29wc3Q6Ci0JOyBUZXN0IGNvcHN0IGNvcHN0ICR1NCwkY2MsJENSaixSaQotCTsgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBub29wCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JY29wc3QgICAgICAJMCwwLGNyMCxyMTUKLQl0ZXN0X2NjCQkxIDEgMSAxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQljb3BzdCAgICAgIAkxNSwyNTUsY3IxNSxyMAotCXRlc3RfY2MJCTEgMSAxIDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY29wc3YuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3Bzdi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGE0ZjUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3Bzdi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGNvcHN2ICR1NCwkY2MsJENSaixSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBjb3BzdgotY29wc3Y6Ci0JOyBUZXN0IGNvcHN2IGNvcHN2ICR1NCwkY2MsJENSaixSaQotCTsgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBub29wCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JY29wc3YgICAgICAJMCwwLGNyMCxyMTUKLQl0ZXN0X2NjCQkxIDEgMSAxCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQljb3BzdiAgICAgIAkxNSwyNTUsY3IxNSxyMAotCXRlc3RfY2MJCTEgMSAxIDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYubXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2FhZjIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYubXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBkaXZpc2lvbgotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkaXYKLWRpdjoKLQk7IHNpbXBsZSBkaXZpc2lvbiAxMiAvIDMKLQltdmlfaF9nciAgIAkweDAwMDAwMDAzLHIyCi0JbXZpX2hfZHIgICAJMHhkZWFkYmVlZixtZGgKLQltdmlfaF9kciAgIAkweDAwMDAwMDBjLG1kbAotCWRpdjBzICAgICAgCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjIgICAgICAgICAgICByMgotCWRpdjMKLQlkaXY0cwotCXRlc3RfaF9nciAgCTB4MDAwMDAwMDMscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDQsbWRsCi0JdGVzdF9kYml0cwkweDAKLQotCTsgZXhhbXBsZSAxIGZyb20gZGl2MHMgdGhlIG1hbnVhbAotCW12aV9oX2dyICAgCTB4MDEyMzQ1NjcscjIKLQltdmlfaF9kciAgIAkweGRlYWRiZWVmLG1kaAotCW12aV9oX2RyICAgCTB4ZmVkY2JhOTgsbWRsCi0JZGl2MHMgICAgICAJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MiAgICAgICAgICAgIHIyCi0JZGl2MwotCWRpdjRzCi0JdGVzdF9oX2dyICAJMHgwMTIzNDU2NyxyMgotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGwKLQl0ZXN0X2RiaXRzCTB4MwotCi0JOyBleGFtcGxlIDIgZnJvbSBkaXYwcyB0aGUgbWFudWFsCi0JbXZpX2hfZHIgICAJMHhkZWFkYmVlZixtZGgKLQltdmlfaF9kciAgIAkweGZlZGNiYTk4LG1kbAotCW12aV9oX2dyICAgCTB4MTIzNDU2NyxyMgotCW12aV9oX2dyICAgCTEscjAKLQltdmlfaF9nciAgIAkzMixyMQotCWRpdjBzICAgICAgCXIyCi1sb29wMToJc3ViCQlyMCxyMQotCWJuZTpkCQlsb29wMQotCWRpdjEJCXIyCi0JZGl2MgkJcjIKLQlkaXYzCi0JZGl2NHMKLQl0ZXN0X2hfZ3IgIAkweDAxMjM0NTY3LHIyCi0JdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGgKLQl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kbAotCXRlc3RfZGJpdHMJMHgzCi0KLQk7IGV4YW1wbGUgMSBmcm9tIGRpdjB1IGluIHRoZSBtYW51YWwKLQltdmlfaF9nciAgIAkweDAxMjM0NTY3LHIyCi0JbXZpX2hfZHIgICAJMHhkZWFkYmVlZixtZGgKLQltdmlfaF9kciAgIAkweGZlZGNiYTk4LG1kbAotCWRpdjB1ICAgICAgCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCWRpdjEJCXIyCi0JZGl2MQkJcjIKLQlkaXYxCQlyMgotCXRlc3RfaF9nciAgCTB4MDEyMzQ1NjcscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDc4LG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwZTAsbWRsCi0JdGVzdF9kYml0cwkweDAKLQotCTsgZXhhbXBsZSAyIGZyb20gZGl2MHUgaW4gdGhlIG1hbnVhbAotCW12aV9oX2RyICAgCTB4ZGVhZGJlZWYsbWRoCi0JbXZpX2hfZHIgICAJMHhmZWRjYmE5OCxtZGwKLQltdmlfaF9nciAgIAkweDEyMzQ1NjcscjIKLQltdmlfaF9nciAgIAkxLHIwCi0JbXZpX2hfZ3IgICAJMzIscjEKLQlkaXYwdSAgICAgIAlyMgotbG9vcDI6CXN1YgkJcjAscjEKLQlibmU6ZAkJbG9vcDIKLQlkaXYxCQlyMgotCXRlc3RfaF9nciAgCTB4MDEyMzQ1NjcscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDc4LG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwZTAsbWRsCi0JdGVzdF9kYml0cwkweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MHMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwcy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDc2YzQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwcy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGRpdjBzICRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkaXYwcwotZGl2MHM6Ci0JOyBUZXN0IGRpdjBzICRSaiwkUmkKLQk7IGV4YW1wbGUgZnJvbSB0aGUgbWFudWFsIC0gbmVnYXRpdmUgZGl2aWRlbmQKLQltdmlfaF9nciAgIAkweDBmZmZmZmZmLHIyCi0JbXZpX2hfZHIgICAJMHgwMDAwMDAwMCxtZGgKLQltdmlfaF9kciAgIAkweGZmZmZmZmYwLG1kbAotCXNldF9kYml0cwkweDAJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JZGl2MHMgICAgICAJcjIKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgwZmZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHhmZmZmZmZmMCxtZGwKLQl0ZXN0X2RiaXRzCTB4MwotCi0JOyBuZWdhdGl2ZSBkaXZpc29yCi0JbXZpX2hfZ3IgICAJMHhmZmZmZmZmZixyMgotCW12aV9oX2RyICAgCTB4ZmZmZmZmZmYsbWRoCi0JbXZpX2hfZHIgICAJMHg3ZmZmZmZmZixtZGwKLQlzZXRfZGJpdHMJMHgxCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWRpdjBzICAgICAgCXIyCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4N2ZmZmZmZmYsbWRsCi0JdGVzdF9kYml0cwkweDIKLQotCTsgQm90aCBzaWduIGJpdHMgMAotCW12aV9oX2dyICAgCTB4MGZmZmZmZmYscjIKLQltdmlfaF9kciAgIAkweGZmZmZmZmZmLG1kaAotCW12aV9oX2RyICAgCTB4N2ZmZmZmZjAsbWRsCi0Jc2V0X2RiaXRzCTB4MwkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlkaXYwcyAgICAgIAlyMgotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDBmZmZmZmZmLHIyCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDdmZmZmZmYwLG1kbAotCXRlc3RfZGJpdHMJMHgwCi0KLQk7IEJvdGggc2lnbiBiaXRzIDEKLQltdmlfaF9nciAgIAkweGZmZmZmZmZmLHIyCi0JbXZpX2hfZHIgICAJMHgwMDAwMDAwMCxtZGgKLQltdmlfaF9kciAgIAkweGZmZmZmZmZmLG1kbAotCXNldF9kYml0cwkweDIJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JZGl2MHMgICAgICAJcjIKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHhmZmZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGwKLQl0ZXN0X2RiaXRzCTB4MQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwdS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjB1LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkODRhNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjB1LmNncworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2MHUgJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGRpdjB1Ci1kaXYwdToKLQk7IFRlc3QgZGl2MHUgJFJqLCRSaQotCTsgb3BlcmFuZCByZWdpc3RlciBoYXMgbm8gZWZmZWN0Ci0JbXZpX2hfZ3IgICAJMHhkZWFkYmVlZixyMgotCW12aV9oX2RyICAgCTB4ZGVhZGJlZWYsbWRoCi0JbXZpX2hfZHIgICAJMHgwZmZmZmZmMCxtZGwKLQlzZXRfZGJpdHMJMHgzCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWRpdjB1ICAgICAgCXIyCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4MGZmZmZmZjAsbWRsCi0JdGVzdF9kYml0cwkweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjEuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMzNWZlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBkaXYxICRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkaXYxCi1kaXYxOgotCTsgVGVzdCBkaXYxICRSaQotCTsgZXhhbXBsZSBmcm9tIHRoZSBtYW51YWwgLS0gYWxsIHN0YXR1cyBiaXRzIDAKLQltdmlfaF9nciAgIAkweDAwZmZmZmZmLHIyCi0JbXZpX2hfZHIgICAJMHgwMGZmZmZmZixtZGgKLQltdmlfaF9kciAgIAkweDAwMDAwMDAwLG1kbAotCXNldF9kYml0cwkweDAKLQlzZXRfY2MgICAgICAgICAgMHgwMAotCWRpdjEgICAgICAJcjIKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9kYml0cwkweDAKLQl0ZXN0X2hfZ3IgIAkweDAwZmZmZmZmLHIyCi0JdGVzdF9oX2RyICAJMHgwMGZmZmZmZixtZGgJOyBtaXNwcmludGVkIGluIG1hbnVhbD8KLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAxLG1kbAotCi0JOyBEMCA9PSAxCi0Jc2V0X2RiaXRzCTB4MQotCXNldF9jYyAgICAgICAgICAweDAwCi0JZGl2MSAgICAgIAlyMgotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2RiaXRzCTB4MQotCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAxZmZmZmZlLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDIsbWRsCi0KLQk7IEQxID09IDEKLQlzZXRfZGJpdHMJMHgyCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYxICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfZGJpdHMJMHgyCi0JdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4MDNmZmZmZmMsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwNCxtZGwKLQotCTsgRDAgPT0gMSwgRDEgPT0gMQotCXNldF9kYml0cwkweDMKLQlzZXRfY2MgICAgICAgICAgMHgwMAotCWRpdjEgICAgICAJcjIKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9kYml0cwkweDMKLQl0ZXN0X2hfZ3IgIAkweDAwZmZmZmZmLHIyCi0JdGVzdF9oX2RyICAJMHgwOGZmZmZmNyxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDA5LG1kbAotCi0JOyBDID09IDEKLQltdmlfaF9nciAgCTB4MTFmZmZmZWYscjIKLQlzZXRfZGJpdHMJMHgwCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYxICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgwCi0JdGVzdF9oX2dyICAJMHgxMWZmZmZlZixyMgotCXRlc3RfaF9kciAgCTB4MTFmZmZmZWUsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAxMixtZGwKLQotCTsgRDAgPT0gMSwgQyA9PSAxCi0JbXZpX2hfZ3IgIAkweDIzZmZmZmRkLHIyCi0Jc2V0X2RiaXRzCTB4MQotCXNldF9jYyAgICAgICAgICAweDAwCi0JZGl2MSAgICAgIAlyMgotCXRlc3RfY2MJCTAgMCAwIDEKLQl0ZXN0X2RiaXRzCTB4MQotCXRlc3RfaF9nciAgCTB4MjNmZmZmZGQscjIKLQl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMjUsbWRsCi0KLQk7IEQxID09IDEsIEMgPT0gMQotCW12aV9oX2dyICAJMHgwMDAwMDAwMyxyMgotCXNldF9kYml0cwkweDIKLQlzZXRfY2MgICAgICAgICAgMHgwMAotCWRpdjEgICAgICAJcjIKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9kYml0cwkweDIKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAzLHIyCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDRiLG1kbAotCi0JOyBEMCA9PSAxLCBEMSA9PSAxLCBDID09IDEKLQltdmlfaF9nciAgCTB4ZmZmZmZmZmUscjIKLQlzZXRfZGJpdHMJMHgzCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYxICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgzCi0JdGVzdF9oX2dyICAJMHhmZmZmZmZmZSxyMgotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDIsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDA5NixtZGwKLQotCTsgcmVtYWluZGVyIGlzIHplcm8KLQltdmlfaF9nciAgCTB4MDAwMDAwMDQscjIKLQlzZXRfZGJpdHMJMHgwCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYxICAgICAgCXIyCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfZGJpdHMJMHgwCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwNCxyMgotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDEyZCxtZGwKLQotCXBhc3MKLQotCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Mi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAwMGEyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Mi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBkaXYyICRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkaXYyCi1kaXYyOgotCTsgVGVzdCBkaXYyICRSaQotCTsgZXhhbXBsZSBmcm9tIHRoZSBtYW51YWwgLS0gYWxsIHN0YXR1cyBiaXRzIDAKLQltdmlfaF9nciAgIAkweDAwZmZmZmZmLHIyCi0JbXZpX2hfZHIgICAJMHgwMGZmZmZmZixtZGgKLQltdmlfaF9kciAgIAkweDAwMDAwMDBmLG1kbAotCXNldF9kYml0cwkweDAKLQlzZXRfY2MgICAgICAgICAgMHgwMAotCWRpdjIgICAgICAJcjIKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9kYml0cwkweDAKLQl0ZXN0X2hfZ3IgIAkweDAwZmZmZmZmLHIyCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDBmLG1kbAotCi0JOyBEMCA9PSAxCi0JbXZpX2hfZHIgICAJMHgwMGZmZmZmZixtZGgKLQlzZXRfZGJpdHMJMHgxCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfZGJpdHMJMHgxCi0JdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgRDEgPT0gMQotCW12aV9oX2RyICAgCTB4MDBmZmZmZmYsbWRoCi0Jc2V0X2RiaXRzCTB4MgotCXNldF9jYyAgICAgICAgICAweDAwCi0JZGl2MiAgICAgIAlyMgotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2RiaXRzCTB4MgotCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAwZmZmZmZmLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCi0KLQk7IEQwID09IDEsIEQxID09IDEKLQlzZXRfZGJpdHMJMHgzCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfZGJpdHMJMHgzCi0JdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4MDBmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgQyA9PSAxCi0JbXZpX2hfZHIgICAJMHgxMWZmZmZlZSxtZGgKLQltdmlfaF9nciAgCTB4MTFmZmZmZWYscjIKLQlzZXRfZGJpdHMJMHgwCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgwCi0JdGVzdF9oX2dyICAJMHgxMWZmZmZlZixyMgotCXRlc3RfaF9kciAgCTB4MTFmZmZmZWUsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgRDAgPT0gMSwgQyA9PSAxCi0JbXZpX2hfZHIgICAJMHgyM2ZmZmZkYyxtZGgKLQltdmlfaF9nciAgCTB4MjNmZmZmZGQscjIKLQlzZXRfZGJpdHMJMHgxCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgxCi0JdGVzdF9oX2dyICAJMHgyM2ZmZmZkZCxyMgotCXRlc3RfaF9kciAgCTB4MjNmZmZmZGMsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgRDEgPT0gMSwgQyA9PSAxCi0JbXZpX2hfZHIgICAJMHhmZmZmZmZmZCxtZGgKLQltdmlfaF9nciAgCTB4MDAwMDAwMDQscjIKLQlzZXRfZGJpdHMJMHgyCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgyCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwNCxyMgotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmQsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgRDAgPT0gMSwgRDEgPT0gMSwgQyA9PSAxCi0JbXZpX2hfZHIgICAJMHgwMDAwMDAwMixtZGgKLQltdmlfaF9nciAgCTB4ZmZmZmZmZmYscjIKLQlzZXRfZGJpdHMJMHgzCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYyICAgICAgCXIyCi0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfZGJpdHMJMHgzCi0JdGVzdF9oX2dyICAJMHhmZmZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDIsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKLQotCTsgcmVtYWluZGVyIGlzIHplcm8KLQltdmlfaF9kciAgIAkweDAwMDAwMDA0LG1kaAotCW12aV9oX2dyICAJMHgwMDAwMDAwNCxyMgotCXNldF9kYml0cwkweDAKLQlzZXRfY2MgICAgICAgICAgMHgwMAotCWRpdjIgICAgICAJcjIKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9kYml0cwkweDAKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDA0LHIyCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDBmLG1kbAotCi0JcGFzcwotCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2My5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2RhMWEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2MwotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkaXYzCi1kaXYzOgotCTsgVGVzdCBkaXYzCi0JOyBleGFtcGxlIGZyb20gdGhlIG1hbnVhbAotCW12aV9oX2dyICAgCTB4MDBmZmZmZmYscjIKLQltdmlfaF9kciAgIAkweDAwMDAwMDAwLG1kaAotCW12aV9oX2RyICAgCTB4MDAwMDAwMGYsbWRsCi0Jc2V0X2RiaXRzCTB4MAotCXNldF9jYyAgICAgICAgICAweDA0Ci0JZGl2MwotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2RiaXRzCTB4MAotCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMTAsbWRsCi0KLQlzZXRfZGJpdHMJMHgwCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXYzCi0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfZGJpdHMJMHgwCi0JdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAxMCxtZGwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2NHMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXY0cy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOThlY2EuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXY0cy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGRpdjRzCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGRpdjRzCi1kaXY0czoKLQk7IFRlc3QgZGl2NHMKLQk7IGV4YW1wbGUgZnJvbSB0aGUgbWFudWFsCi0JbXZpX2hfZ3IgICAJMHgwMGZmZmZmZixyMgotCW12aV9oX2RyICAgCTB4MDAwMDAwMDAsbWRoCi0JbXZpX2hfZHIgICAJMHgwMDAwMDAwZixtZGwKLQlzZXRfZGJpdHMJMHgzCi0Jc2V0X2NjICAgICAgICAgIDB4MGYKLQlkaXY0cwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2RiaXRzCTB4MwotCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZjEsbWRsCi0KLQlzZXRfZGJpdHMJMHgwCi0Jc2V0X2NjICAgICAgICAgIDB4MDAKLQlkaXY0cwotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2RiaXRzCTB4MAotCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZjEsbWRsCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3YuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kbW92LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZTVjYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3YuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBkbW92Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkbW92Ci1kbW92OgotCTsgVGVzdCBkbW92IEAkZGlyMTAsJFIxMwotCW12aV9oX2dyCTB4ZGVhZGJlZWYscjEKLQltdmlfaF9ncgkweDIwMCxyMgotCW12cl9oX21lbQlyMSxyMgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdgkJQDB4MjAwLHIxMwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixyMTMKLQotCTsgVGVzdCBkbW92ICRSMTMsQCRkaXIxMAotCW12aV9oX2dyCTB4YmVlZmRlYWQscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLQlkbW92CQlyMTMsQDB4MjAwCi0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxyMgotCi0JOyBUZXN0IGRtb3YgQCRkaXIxMCxAUjEzKwotCW12aV9oX2dyCTB4MWZjLHIxMwotCXNldF9jYyAgICAgICAgICAweDBkCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdgkJQDB4MjAwLEByMTMrCi0JdGVzdF9jYwkJMSAxIDAgMQotCW12aV9oX2dyCTB4MWZjLHIyCi0JdGVzdF9oX21lbQkweGJlZWZkZWFkLHIyCi0JaW5jaV9oX2dyCTQscjIKLQl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjIKLQl0ZXN0X2hfZ3IJMHgyMDAscjEzCi0KLQk7IFRlc3QgZG1vdiBAJFIxMyssQCRkaXIxMAotCW12aV9oX2dyCTB4MWZjLHIxMwotCW12aV9oX21lbQkweGRlYWRiZWVmLHIxMwotCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdgkJQHIxMyssQDB4MjAwCi0JdGVzdF9jYwkJMSAxIDAgMAotCW12aV9oX2dyCTB4MWZjLHIyCi0JdGVzdF9oX21lbQkweGRlYWRiZWVmLHIyCi0JaW5jaV9oX2dyCTQscjIKLQl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYscjIKLQl0ZXN0X2hfZ3IJMHgyMDAscjEzCi0KLQk7IFRlc3QgZG1vdiBAJGRpcjEwLEAtUjE1Ci0JbXZpX2hfZ3IJMHgyMDAscjE1Ci0JbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE1Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLQlkbW92CQlAMHgyMDAsQC1yMTUKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JbXZpX2hfZ3IJMHgxZmMscjIKLQl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYscjIKLQlpbmNpX2hfZ3IJNCxyMgotCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixyMgotCXRlc3RfaF9ncgkweDFmYyxyMTUKLQotCTsgVGVzdCBkbW92IEAkUjE1KyxAJGRpcjEwCi0JbXZpX2hfZ3IJMHgxZmMscjE1Ci0JbXZpX2hfbWVtCTB4YmVlZmRlYWQscjE1Ci0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLQlkbW92CQlAcjE1KyxAMHgyMDAKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JbXZpX2hfZ3IJMHgxZmMscjIKLQl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjIKLQlpbmNpX2hfZ3IJNCxyMgotCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxyMgotCXRlc3RfaF9ncgkweDIwMCxyMTUKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdmIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kbW92Yi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2ZiOWQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kbW92Yi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGRtb3ZiCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBkbW92YgotZG1vdmI6Ci0JOyBUZXN0IGRtb3ZiIEAkZGlyOCwkUjEzCi0JbXZpX2hfZ3IJMHhkZWFkYmVlZixyMQotCW12aV9oX2dyCTB4ODAscjIKLQltdnJfaF9tZW0JcjEscjIKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQotCWRtb3ZiCQlAMHg4MCxyMTMKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyCTB4ZmZmZmZmZGUscjEzCi0KLQk7IFRlc3QgZG1vdmIgJFIxMyxAJGRpcjgKLQltdmlfaF9ncgkweGJlZWZkZWFkLHIxMwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdmIJCXIxMyxAMHg4MAotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfbWVtCTB4YWRhZGJlZWYscjIKLQotCTsgVGVzdCBkbW92YiBAJGRpcjgsQFIxMysKLQltdmlfaF9ncgkweDdjLHIxMwotCW12aV9oX21lbQkweGRlYWRiZWVmLHIxMwotCXNldF9jYyAgICAgICAgICAweDBkCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdmIJCUAweDdmLEByMTMrCi0JdGVzdF9jYwkJMSAxIDAgMQotCW12aV9oX2dyCTB4N2MscjIKLQl0ZXN0X2hfbWVtCTB4ZWZhZGJlZWYscjIKLQl0ZXN0X2hfZ3IJMHg3ZCxyMTMKLQotCTsgVGVzdCBkbW92YiBAJFIxMyssQCRkaXI4Ci0JbXZpX2hfZ3IJMHg3YyxyMTMKLQltdmlfaF9tZW0JMHhiZWVmZGVhZCxyMTMKLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQotCWRtb3ZiCQlAcjEzKyxAMHg3ZgotCXRlc3RfY2MJCTEgMSAwIDAKLQltdmlfaF9ncgkweDdjLHIyCi0JdGVzdF9oX21lbQkweGJlZWZkZWJlLHIyCi0JdGVzdF9oX2dyCTB4N2QscjEzCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3ZoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdmguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFmYjQ0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdmguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBkbW92aAotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgZG1vdmgKLWRtb3ZoOgotCTsgVGVzdCBkbW92aCBAJGRpcjksJFIxMwotCW12aV9oX2dyCTB4ZGVhZGJlZWYscjEKLQltdmlfaF9ncgkweDEwMCxyMgotCW12cl9oX21lbQlyMSxyMgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdmgJCUAweDEwMCxyMTMKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyCTB4ZmZmZmRlYWQscjEzCi0KLQk7IFRlc3QgZG1vdmggJFIxMyxAJGRpcjkKLQltdmlfaF9ncgkweGRlYWRiZWVmLHIxMwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi0JZG1vdmgJCXIxMyxAMHgxMDAKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX21lbQkweGJlZWZiZWVmLHIyCi0KLQk7IFRlc3QgZG1vdmggQCRkaXI5LEBSMTMrCi0JbXZpX2hfZ3IJMHgxZmMscjEzCi0JbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLQlkbW92aAkJQDB4MWZlLEByMTMrCi0JdGVzdF9jYwkJMSAxIDAgMQotCW12aV9oX2dyCTB4MWZjLHIyCi0JdGVzdF9oX21lbQkweGJlZWZiZWVmLHIyCi0JdGVzdF9oX2dyCTB4MWZlLHIxMwotCi0JOyBUZXN0IGRtb3ZoIEAkUjEzKyxAJGRpcjkKLQltdmlfaF9ncgkweDFmYyxyMTMKLQltdmlfaF9tZW0JMHhiZWVmZGVhZCxyMTMKLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQotCWRtb3ZoCQlAcjEzKyxAMHgxZmUKLQl0ZXN0X2NjCQkxIDEgMCAwCi0JbXZpX2hfZ3IJMHgxZmMscjIKLQl0ZXN0X2hfbWVtCTB4YmVlZmJlZWYscjIKLQl0ZXN0X2hfZ3IJMHgxZmUscjEzCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2VudGVyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW50ZXIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTc1ZTE2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW50ZXIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBlbnRlciAkdTEwCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGVudGVyCi1lbnRlcjoKLQk7IFRlc3QgZW50ZXIgJHUxMAotCW12cl9oX2dyICAgCXNwLHI3CQkJOyBzYXZlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglzcCxyOAkJCTsgc2hhZG93IHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglzcCxyMTQJCTsgSW5pdGlhbGl6ZQotCXNldF9jYwkweDBmCQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQllbnRlciAgICAgIAkwCi0JdGVzdF9jYwkxIDEgMSAxCi0JdGVzdHJfaF9nciAJcjgsc3AKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0cl9oX2dyCXIxNCxyOAotCXRlc3RyX2hfbWVtCXI3LHIxNAotCi0JbXZyX2hfZ3IJc3AscjgJCQk7IHNoYWRvdyBzdGFjayBwb2ludGVyCi0JbXZyX2hfZ3IJcjE0LHI5CQk7IHNhdmUKLQlzZXRfY2MJMHgwZQkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZW50ZXIgICAgICAJMHgzZmMKLQl0ZXN0X2NjCTEgMSAxIDAKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0cl9oX2dyCXIxNCxyOAotCXRlc3RyX2hfbWVtCXI5LHIxNAotCWluY2lfaF9ncgktMHgzZjgscjgKLQl0ZXN0cl9oX2dyIAlyOCxzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3IuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwNzYxLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yLmNncworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgZW9yICRSaiwkUmksIGVvciAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBlb3IKLWVvcjoKLQk7IFRlc3QgZW9yICRSaiwkUmkKLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3Ci0JbXZpX2hfZ3IgICAJMHg1NTU1NTU1NSxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKLQotCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKLQltdmlfaF9nciAgIAkweDAwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3IJCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3IgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMCxyNwotCW12aV9oX2dyICAgCTB4MDAwMGJlZWYscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWVvcgkJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyOAotCi0JOyBUZXN0IGVvciAkUmosQCRSaQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3IgICAgICAJcjcsQHNwCi0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9tZW0gCTB4ZmZmZmZmZmYsc3AKLQotCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKLQltdmlfaF9tZW0gIAkweDAwMDAwMDAwLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3IJCXI3LEBzcAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfbWVtIAkweDAwMDAwMDAwLHNwCi0KLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3Ci0JbXZpX2hfbWVtICAJMHhhYWFhYWFhYSxzcAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yICAgICAgCXI3LEBzcAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfbWVtIAkweDAwMDAwMDAwLHNwCi0KLQltdmlfaF9nciAgIAkweGRlYWQwMDAwLHI3Ci0JbXZpX2hfbWVtICAJMHgwMDAwYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yCQlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX21lbSAJMHhkZWFkYmVlZixzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3JiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yYi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MGYzZjcuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3JiLmNncworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgZW9yYiAkUmosJFJpLCBlb3JiICRSaixAJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGVvcmIKLWVvcmI6Ci0JOyBUZXN0IGVvcmIgJFJqLEAkUmkKLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3Ci0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yYiAgICAgIAlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX21lbSAJMHhmZjU1NTU1NSxzcAotCi0JbXZpX2hfZ3IgICAJMHhhYWFhYWEwMCxyNwotCW12aV9oX21lbSAgCTB4MDA1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWVvcmIJCXI3LEBzcAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfbWVtIAkweDAwNTU1NTU1LHNwCi0KLQltdmlfaF9nciAgIAkweGFhYWFhYTU1LHI3Ci0JbXZpX2hfbWVtICAJMHg1NWFhYWFhYSxzcAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yYiAgICAgIAlyNyxAc3AKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX21lbSAJMHgwMGFhYWFhYSxzcAotCi0JbXZpX2hfZ3IgICAJMHgwMDAwMDBkMCxyNwotCW12aV9oX21lbSAgCTB4MGVhZGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWVvcmIJCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2VvcmguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3JoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmODQ3My4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2VvcmguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBlb3JoICRSaiwkUmksIGVvcmggJFJqLEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgZW9yaAotZW9yaDoKLQk7IFRlc3QgZW9yaCAkUmosQCRSaQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3JoICAgICAgCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfbWVtIAkweGZmZmY1NTU1LHNwCi0KLQltdmlfaF9nciAgIAkweGFhYWEwMDAwLHI3Ci0JbXZpX2hfbWVtICAJMHgwMDAwNTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yaAkJcjcsQHNwCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9tZW0gCTB4MDAwMDU1NTUsc3AKLQotCW12aV9oX2dyICAgCTB4YWFhYTU1NTUscjcKLQltdmlfaF9tZW0gIAkweDU1NTVhYWFhLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQllb3JoICAgICAgCXI3LEBzcAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfbWVtIAkweDAwMDBhYWFhLHNwCi0KLQltdmlfaF9nciAgIAkweDAwMDBkZTAwLHI3Ci0JbXZpX2hfbWVtICAJMHgwMGFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JZW9yaAkJcjcsQHNwCi0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0c2IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHRzYi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMThkN2UuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHRzYi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGV4dHNiICRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBleHRzYgotZXh0c2I6Ci0JOyBUZXN0IGV4dHNiICRSaQotCW12aV9oX2dyICAgCTAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHRzYiAgICAgIAlyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkwLHI3Ci0KLQltdmlfaF9nciAgIAkweDdmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0c2IgICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX2dyICAJMHg3ZixyNwotCi0gCW12aV9oX2dyICAgCTB4ODAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHRzYiAgICAgIAlyNwotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfZ3IgIAkweGZmZmZmZjgwLHI3Ci0KLQltdmlfaF9nciAgIAkweGZmZmZmZjdmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0c2IgICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMCAwCi0JdGVzdF9oX2dyICAJMHg3ZixyNwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHRzaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHNoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxMmZkMC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHNoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgZXh0c2ggJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGV4dHNoCi1leHRzaDoKLQk7IFRlc3QgZXh0c2ggJFJpCi0JbXZpX2hfZ3IgICAJMCxyNwotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWV4dHNoICAgICAgCXI3Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTAscjcKLQotCW12aV9oX2dyICAgCTB4N2YscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHRzaCAgICAgIAlyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweDdmLHI3Ci0KLSAJbXZpX2hfZ3IgICAJMHg4MCxyNwotCXNldF9jYyAgICAgICAgICAweDBkCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWV4dHNoICAgICAgCXI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ODAscjcKLQotIAltdmlfaF9nciAgIAkweDdmZmYscjcKLQlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHRzaCAgICAgIAlyNwotCXRlc3RfY2MJCTEgMSAwIDAKLQl0ZXN0X2hfZ3IgIAkweDdmZmYscjcKLQotIAltdmlfaF9nciAgIAkweDgwMDAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHRzaCAgICAgIAlyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweGZmZmY4MDAwLHI3Ci0KLQltdmlfaF9nciAgIAkweGZmZmY3ZmZmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0c2ggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2dyICAJMHg3ZmZmLHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHViLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGNjNjgzLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBleHR1YiAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgZXh0dWIKLWV4dHViOgotCTsgVGVzdCBleHR1YiAkUmkKLQltdmlfaF9nciAgIAkwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWIgICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyNwotCi0JbXZpX2hfZ3IgICAJMHg3ZixyNwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWV4dHViICAgICAgCXI3Ci0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTB4N2YscjcKLQotIAltdmlfaF9nciAgIAkweDgwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWIgICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MCxyNwotCi0JbXZpX2hfZ3IgICAJMHhmZmZmZmY3ZixyNwotCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWV4dHViICAgICAgCXI3Ci0JdGVzdF9jYwkJMSAxIDAgMAotCXRlc3RfaF9nciAgCTB4N2YscjcKLQotCW12aV9oX2dyICAgCTB4ZmZmZmZmODAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlleHR1YiAgICAgIAlyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweDgwLHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHVoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI1NzllLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBleHR1aCAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgZXh0dWgKLWV4dHVoOgotCTsgVGVzdCBleHR1aCAkUmkKLQltdmlfaF9nciAgIAkwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyNwotCi0JbXZpX2hfZ3IgICAJMHg3ZixyNwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAotCWV4dHVoICAgICAgCXI3Ci0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTB4N2YscjcKLQotIAltdmlfaF9nciAgIAkweDgwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MCxyNwotCi0JbXZpX2hfZ3IgICAJMHg3ZmZmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX2dyICAJMHg3ZmZmLHI3Ci0KLSAJbXZpX2hfZ3IgICAJMHg4MDAwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MDAwLHI3Ci0KLQltdmlfaF9nciAgIAkweGZmZmY3ZmZmLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDEgMCAwCi0JdGVzdF9oX2dyICAJMHg3ZmZmLHI3Ci0KLQltdmlfaF9nciAgIAkweGZmZmY4MDAwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JZXh0dWggICAgICAJcjcKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHg4MDAwLHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2hlbGxvLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9oZWxsby5tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyMDhkZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2hlbGxvLm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBtYWNoOiBmcjMwCi0jIG91dHB1dDogSGVsbG8gd29ybGQhXG4KLQotCS5nbG9iYWwgX3N0YXJ0Ci1fc3RhcnQ6Ci0KLTsgd3JpdGUgKGhlbGxvIHdvcmxkKQotCWxkaTMyICMxNCxyNgotCWxkaTMyICNoZWxsbyxyNQotCWxkaTMyICMxLHI0Ci0JbGRpMzIgIzUscjAKLQlpbnQgICAjMTAKLTsgZXhpdCAoMCkKLQlsZGkzMiAjMCxyNAotCWxkaTMyICMxLHIwCi0JaW50ICAgIzEwCi0KLWxlbmd0aDoJLmxvbmcgMTQKLWhlbGxvOgkuYXNjaWkgIkhlbGxvIHdvcmxkIVxyXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2ludC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2ludC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGNhN2IuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9pbnQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBpbnQgJHU4Ci0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGludAotaW50OgotCTsgVGVzdCBpbnQgJHU4IC0gc2V0dXAgYW5kIHRlc3QgYW4gaW50ZXJydXB0ICMweGZkIChyYW5kb21seSBjaG9zZW4pCi0JbXZyX2hfZ3IgICAJdGJyLHI3Ci0JaW5jaV9oX2dyCTgscjcKLQltdmlfaF9tZW0JcGFzcyxyNwotCW12aV9oX2dyCWRvaW50LHI5Ci0JaW5jaV9oX2dyCTIscjkKLQltdnJfaF9ncglzc3AscjEwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc2V0X3NfdXNlcgkJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jc2V0X2kJCTEJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXZyX2hfZ3IJcHMscjgKLWRvaW50OglpbnQJCTB4ZmQKLQlmYWlsCi0KLXBhc3M6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3Rfc19zeXN0ZW0KLQl0ZXN0X2kJCTAKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9tZW0JcjgscjEwCi0JaW5jaV9oX2dyCS00LHIxMAotCXRlc3RyX2hfbWVtCXI5LHIxMAotCXRlc3RyX2hfZHIJcjEwLHNzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9pbnRlLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvaW50ZS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNWJmZDkuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9pbnRlLmNncworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgaW50ZQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBpbnRlCi1pbnRlOgotCTsgVGVzdCBpbnRlIHdoaWNoIGlzIGVzc2VudGlhbGx5IGludCAjOQotCW12cl9oX2dyICAgCXRicixyNwotCWluY2lfaF9ncgkweDNkOCxyNwotCW12aV9oX21lbQlwYXNzLHI3Ci0JbXZpX2hfZ3IJZG9pbnQscjkKLQlpbmNpX2hfZ3IJMixyOQotCW12cl9oX2dyCXNzcCxyMTAKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzZXRfc191c2VyCQkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlzZXRfaQkJMQkJOyBTaG91bGQgbm90IGNoYW5nZQotCW12cl9oX2dyCXBzLHI4Ci1kb2ludDoJaW50ZQotCWZhaWwKLQotcGFzczoKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9pbG0JNAotCXRlc3Rfc19zeXN0ZW0KLQl0ZXN0X2kJCTEKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9tZW0JcjgscjEwCi0JaW5jaV9oX2dyCS00LHIxMAotCXRlc3RyX2hfbWVtCXI5LHIxMAotCXRlc3RyX2hfZHIJcjEwLHNzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9qbXAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9qbXAuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRhZjIyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvam1wLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3Igam1wIEAkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgam1wCi0KLQk7IFRlc3Qgam1wICRSaQotCW12aV9oX2dyICAgCSNmdW5jMSxyMAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi1qbXAxOgotCWptcAkJQHIwCi0JZmFpbAotZnVuYzE6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCW12aV9oX2dyICAgCSNmdW5jMixyMAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCi1qbXAyOgotCWptcDpkCQlAcjAKLQlsZGk6OAkJMSxyMAkJOyBNdXN0IGFzc3VtZSB0aGlzIHdvcmtzCi0JZmFpbAotZnVuYzI6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RyX2hfZ3IJMSxyMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZDMwYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yCi0jIG1hY2goKTogZnIzMAotIyBsZCAkUmosJFJpCi0jIGxkIEAoJFIxMywkUmopLCRSaQotIyBsZCBAKCRSMTQsJGRpc3AxMCksJFJpCi0jIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkKLSMgbGQgQCRSMTUrLCRSaQotIyBsZCBAJFIxNSssJFJzCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbGQKLWxkOgotCTsgVGVzdCBsZCAkUmosJFJpCi0JbXZpX2hfbWVtCSMweDAwMDAwMDAwLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQJCUBzcCxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkwLHI3Ci0KLQltdmlfaF9tZW0JIzB4MDAwMDAwMDEsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZCAgICAJCUBzcCxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkxLHI3Ci0KLQltdmlfaF9tZW0JIzB4N2ZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQHNwLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjcKLQotCW12aV9oX21lbQkjMHg4MDAwMDAwMCxzcAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkICAgICAgCUBzcCxyNwotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI3Ci0KLQltdmlfaF9tZW0JIzB4ZmZmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQHNwLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCS0xLHI3Ci0KLQk7IFRlc3QgbGQgQCgkUjEzLCRSaiksJFJpCi0JbXZyX2hfZ3IJc3AscjEzCi0JaW5jaV9oX2dyCS04LHIxMwotCW12aV9oX2dyCTgscjgKLQotCW12aV9oX21lbQkjMHgwMDAwMDAwMCxzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyNwotCi0JbXZpX2hfbWVtCSMweDAwMDAwMDAxLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQgICAgCQlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMSxyNwotCi0JbXZpX2hfbWVtCSMweDdmZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQJCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI3Ci0KLQltdmlfaF9tZW0JIzB4ODAwMDAwMDAsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZCAgICAgIAlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyNwotCi0JbXZpX2hfbWVtCSMweGZmZmZmZmZmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQJCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAktMSxyNwotCi0JOyBUZXN0IGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkKLQltdmlfaF9tZW0JIzB4ZGVhZGJlZWYsc3AKLQltdnJfaF9ncglzcCxyMTQKLQltdmlfaF9ncgktMHgxZmMscjgKLQlhZGRfaF9ncglyOCxyMTQKLQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAKHIxNCwweDFmYykscjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNwotCi0JaW5jaV9oX2dyCTB4ZmMscjE0Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQgICAgCQlAKHIxNCwweDEwMCkscjcKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNwotCi0JaW5jaV9oX2dyCTB4MTAwLHIxNAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAKHIxNCwweDApLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjcKLQotCWluY2lfaF9ncgkweDEwMCxyMTQKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZCAgICAgIAlAKHIxNCwtMHgxMDApLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjcKLQotCWluY2lfaF9ncgkweDEwMCxyMTQKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQChyMTQsLTB4MjAwKSxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3Ci0KLQk7IFRlc3QgbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaQotCW12aV9oX21lbQkjMHhkZWFkYmVlZixzcAotCW12cl9oX2dyCXNwLHIxNAotCW12aV9oX2dyCS0weDNjLHI4Ci0JYWRkX2hfZ3IJcjgscjE0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQChyMTQsMHgzYykscjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNwotCi0JaW5jaV9oX2dyCTB4MWMscjE0Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQgICAgCQlAKHIxNCwweDIwKSxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3Ci0KLQlpbmNpX2hfZ3IJMHgyMCxyMTQKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQChyMTQsMHgwKSxyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3Ci0KLQk7IFRlc3QgbGQgQCRSMTUrLCRSaQotCW12cl9oX2dyCXNwLHI4CQk7IHNhdmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCW12cl9oX2dyCXI4LHI5Ci0JaW5jaV9oX2dyCTQscjkJCTsgb3JpZ2luYWwgc3RhY2sgcG9pbnRlciArIDQKLQltdmlfaF9tZW0JIzB4ZGVhZGJlZWYsc3AJOyBwcmltZSBtZW1vcnkKLQotCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAcjE1KyxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3Ci0JdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQHIxNSssc3AKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHhkZWFkYmVlZixzcAk7IHNob3VsZCBub3QgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQk7IFRlc3QgbGQgQCRSMTUrLCRScwotCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAcjE1Kyx0YnIKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2RyICAJMHhkZWFkYmVlZix0YnIKLQl0ZXN0cl9oX2dyCXNwLHI5CQk7IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKLQotCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAcjE1KyxycAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweGRlYWRiZWVmLHJwCi0JdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQHIxNSssbWRoCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9kciAgCTB4ZGVhZGJlZWYsbWRoCi0JdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZAkJQHIxNSssbWRsCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9kciAgCTB4ZGVhZGJlZWYsbWRsCi0JdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQlzZXRfc191c2VyCi0JbXZyX2hfZ3IJcjgsc3AJCTsgcmVzdG9yZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQJCUByMTUrLHNzcAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweGRlYWRiZWVmLHNzcAotCXRlc3RyX2hfZ3IJc3AscjkJCTsgc2hvdWxkIGhhdmUgYmVlbiBpbmNyZW1lbnRlZAotCi0JbXZyX2hfZ3IJcjgsc3AJCTsgcmVzdG9yZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGQJCUByMTUrLHVzcAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweGRlYWRiZWVmLHVzcAotCXRlc3RfaF9ncgkweGRlYWRiZWVmLHNwCTsgc2hvdWxkIG5vdCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKLQotCXNldF9zX3N5c3RlbQotCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAcjE1Kyx1c3AKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2RyICAJMHhkZWFkYmVlZix1c3AKLQl0ZXN0cl9oX2dyCXNwLHI5CQk7IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKLQotCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkCQlAcjE1Kyxzc3AKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2RyICAJMHhkZWFkYmVlZixzc3AKLQl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixzcAk7IHNob3VsZCBub3QgaGF2ZSBiZWVuIGluY3JlbWVudGVkCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTIwLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRpMjAuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E0ZWY0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRpMjAuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBsZGkyMCAkaTIwLCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBsZGkyMAotbGRpMjA6Ci0JOyBUZXN0IGxkaTIwICRpMjAsJFJpCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpMjAJCSMweDAwMDAwMDAwLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTAscjcKLQotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkaToyMAkJMSxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkxLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZGkyMAkJMHg3ZmZmZixyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDdmZmZmLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZGk6MjAJCTB4ODAwMDAscjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHgwMDA4MDAwMCxyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpMjAJCTB4ZmZmZmYscjcKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX2dyICAJMHgwMDBmZmZmZixyNwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGkzMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTMyLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NmRiNy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTMyLmNncworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRpMzIgJGkzMiwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbGRpMzIKLWxkaTMyOgotCTsgVGVzdCBsZGkzMiAkaTMyLCRSaQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkaTMyCQkjMHgwMDAwMDAwMCxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkwLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZGk6MzIJCTEscjcKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMSxyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpMzIJCTB4N2ZmZmZmZmYscjcKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpOjMyCQkweDgwMDAwMDAwLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjcKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkaTMyCQkweGZmZmZmZmZmLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCS0xLHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGk4LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNWVkZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBsZGk4ICRpOCwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbGRpOAotbGRpODoKLQk7IFRlc3QgbGRpOCAkaTgsJFJpCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpOAkJIzB4MDAwMDAwMDAscjcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMCxyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpOjIwCQkxLHI3Ci0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9nciAgCTEscjcKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkaTgJCTB4N2YscjcKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHgwMDAwMDA3ZixyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRpOjIwCQkweDgwLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4MDAwMDAwODAscjcKLQotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkaTgJCTB4ZmYscjcKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX2dyICAJMHgwMDAwMDBmZixyNwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZG0wLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRtMC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWI1NjQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZG0wLmNncworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRtMCAoJHJlZ2xpc3RfbG93KQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBsZG0wCi1sZG0wOgotCTsgVGVzdCBsZG0wICgkcmVnbGlzdF9sb3cpCi0JbXZyX2hfZ3IJc3AscjkJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHBlcm1hbmVudGx5Ci0JaW5jaV9oX2dyCS00LHNwCi0JbXZpX2hfbWVtICAJMyxzcAotCWluY2lfaF9ncgktNCxzcAotCW12aV9oX21lbSAgCTIsc3AKLQlpbmNpX2hfZ3IJLTQsc3AKLQltdmlfaF9tZW0gIAkxLHNwCi0JaW5jaV9oX2dyCS00LHNwCi0JbXZpX2hfbWVtICAJMCxzcAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRtMCAgICAgIAkocjAscjIscjQscjYpCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RyX2hfZ3IJc3AscjkKLQl0ZXN0X2hfZ3IgCTAscjAKLQl0ZXN0X2hfZ3IgCTEscjIKLQl0ZXN0X2hfZ3IgCTIscjQKLQl0ZXN0X2hfZ3IgICAJMyxyNgotCi0JaW5jaV9oX2dyCS0xNixzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkbTAgICAgICAJKHIxLHIzLHI1LHI3KQotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0cl9oX2dyCXNwLHI5Ci0JdGVzdF9oX2dyIAkwLHIxCi0JdGVzdF9oX2dyIAkxLHIzCi0JdGVzdF9oX2dyIAkyLHI1Ci0JdGVzdF9oX2dyICAgCTMscjcKLQotCWluY2lfaF9ncgktMTYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZG0wICAgICAgCShyMSxyNSxyNyxyMykJOyBPcmRlciBzcGVmaWNpZWQgc2hvdWxkIG5vdCBtYXR0ZXIKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdHJfaF9ncglzcCxyOQotCXRlc3RfaF9nciAJMCxyMQotCXRlc3RfaF9nciAJMSxyMwotCXRlc3RfaF9nciAJMixyNQotCXRlc3RfaF9nciAgIAkzLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZG0wICAgICAgCSgpCQk7IE5vdGhpbmcgc2hvdWxkIGhhcHBlbgotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0cl9oX2dyCXNwLHI5Ci0JdGVzdF9oX2dyIAkwLHIxCi0JdGVzdF9oX2dyIAkxLHIzCi0JdGVzdF9oX2dyIAkyLHI1Ci0JdGVzdF9oX2dyICAgCTMscjcKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRtMS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkbTEuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NmY2RiLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRtMS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGxkbTEgKCRyZWdsaXN0X2xvdykKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbGRtMQotbGRtMToKLQk7IFRlc3QgbGRtMSAoJHJlZ2xpc3RfbG93KQotCW12cl9oX2dyCXNwLHIxCQk7IHNhdmUgc3RhY2sgcG9pbnRlciBwZXJtYW5lbnRseQotCWluY2lfaF9ncgktNCxzcAotCW12aV9oX21lbSAgCTMsc3AKLQlpbmNpX2hfZ3IJLTQsc3AKLQltdmlfaF9tZW0gIAkyLHNwCi0JaW5jaV9oX2dyCS00LHNwCi0JbXZpX2hfbWVtICAJMSxzcAotCWluY2lfaF9ncgktNCxzcAotCW12aV9oX21lbSAgCTAsc3AKLQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkbTEgICAgICAJKHI4LHIxMCxyMTIscjE0KQotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0cl9oX2dyCXNwLHIxCi0JdGVzdF9oX2dyIAkwLHI4Ci0JdGVzdF9oX2dyIAkxLHIxMAotCXRlc3RfaF9nciAJMixyMTIKLQl0ZXN0X2hfZ3IgICAJMyxyMTQKLQotCWluY2lfaF9ncgktMTYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZG0xICAgICAgCShyOSxyMTEscjEzLHIxNSkKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyIAkwLHI5Ci0JdGVzdF9oX2dyIAkxLHIxMQotCXRlc3RfaF9nciAJMixyMTMKLQl0ZXN0X2hfZ3IgICAJMyxyMTUKLQotCW12cl9oX2dyCXIxLHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgotCWluY2lfaF9ncgktMTYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZG0xICAgICAgCShyOSxyMTMscjE1LHIxMSk7IE9yZGVyIHNwZWZpY2llZCBzaG91bGQgbm90IG1hdHRlcgotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgCTAscjkKLQl0ZXN0X2hfZ3IgCTEscjExCi0JdGVzdF9oX2dyIAkyLHIxMwotCXRlc3RfaF9nciAgIAkzLHIxNQotCi0JbXZyX2hfZ3IJcjEsc3AJCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGRtMSAgICAgIAkoKQkJOyBOb3RoaW5nIHNob3VsZCBoYXBwZW4KLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdHJfaF9ncglzcCxyMQotCXRlc3RfaF9nciAJMCxyOQotCXRlc3RfaF9nciAJMSxyMTEKLQl0ZXN0X2hfZ3IgCTIscjEzCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkcmVzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRyZXMuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDgzNDg5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRyZXMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBsZHJlcyAkQFJpKywkdTQKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbGRyZXMKLWxkcmVzOgotCTsgVGVzdCBsZHJlcyAkQFJpKywkdTQKLQk7IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNpbXBseSBpbmNyZW1lbnRzIFJpCi0JbXZpX2hfZ3IgICAJMHgxMDAwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JbGRyZXMgICAgICAJQHI3KywwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTB4MTAwNCxyNwotCi0JbXZpX2hfZ3IgICAJMHgxMDAwLHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JbGRyZXMgICAgICAJQHI3KywweGYKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgxMDA0LHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkdWIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHViLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0MmNmYS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkdWIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IKLSMgbWFjaCgpOiBmcjMwCi0jICBsZHViICRSaiwkUmkKLSMgIGxkdWIgQCgkUjEzLCRSaiksJFJpCi0jICBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaQotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWIKLWxkdWI6Ci0JOyBUZXN0IGxkdWIgJFJqLCRSaQotCW12aV9oX21lbQkjMHgwMGFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIJCUBzcCxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkwLHI3Ci0KLQltdmlfaF9tZW0JIzB4MDFhZGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHViICAgIAlAc3AscjcKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMSxyNwotCi0JbXZpX2hfbWVtCSMweDdmYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1YgkJQHNwLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4N2YscjcKLQotCW12aV9oX21lbQkjMHg4MGFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIgICAgICAJQHNwLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ODAscjcKLQotCW12aV9oX21lbQkjMHhmZmFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIJCUBzcCxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweGZmLHI3Ci0KLQk7IFRlc3QgbGR1YiBAKCRSMTMsJFJqKSwkUmkKLQltdnJfaF9ncglzcCxyMTMKLQlpbmNpX2hfZ3IJLTgscjEzCi0JbXZpX2hfZ3IJOCxyOAotCi0JbXZpX2hfbWVtCSMweDAwYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1YgkJQChyMTMscjgpLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTAscjcKLQotCW12aV9oX21lbQkjMHgwMWFkYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIgICAgCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkxLHI3Ci0KLQltdmlfaF9tZW0JIzB4N2ZhZGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHViCQlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHg3ZixyNwotCi0JbXZpX2hfbWVtCSMweDgwYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1YiAgICAgIAlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MCxyNwotCi0JbXZpX2hfbWVtCSMweGZmYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1YgkJQChyMTMscjgpLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTB4ZmYscjcKLQotCTsgVGVzdCBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaQotCW12aV9oX21lbQkjMHhkZWFkYmVlZixzcAotCW12cl9oX2dyCXNwLHIxNAotCW12aV9oX2dyCS0weDdmLHI4Ci0JYWRkX2hfZ3IJcjgscjE0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHViCQlAKHIxNCwweDdmKSxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlLHI3Ci0KLQlpbmNpX2hfZ3IJMHgzZixyMTQKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHViICAgIAlAKHIxNCwweDQwKSxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlLHI3Ci0KLQlpbmNpX2hfZ3IJMHg0MCxyMTQKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHViCQlAKHIxNCwweDApLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4ZGUscjcKLQotCWluY2lfaF9ncgkweDQwLHIxNAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIgICAgICAJQChyMTQsLTB4NDApLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ZGUscjcKLQotCWluY2lfaF9ncgkweDQwLHIxNAotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWIJCUAocjE0LC0weDgwKSxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweGRlLHI3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkdWguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHVoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzNmI3NS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkdWguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IKLSMgbWFjaCgpOiBmcjMwCi0jIGxkdWggJFJqLCRSaQotIyBsZHVoIEAoJFIxMywkUmopLCRSaQotIyBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaQotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWgKLWxkdWg6Ci0JOyBUZXN0IGxkdWggJFJqLCRSaQotCW12aV9oX21lbQkjMHgwMDAwYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWgJCUBzcCxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkwLHI3Ci0KLQltdmlfaF9tZW0JIzB4MDAwMWJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHVoICAgIAlAc3AscjcKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMSxyNwotCi0JbXZpX2hfbWVtCSMweDdmZmZiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1aAkJQHNwLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9nciAgCTB4N2ZmZixyNwotCi0JbXZpX2hfbWVtCSMweDgwMDBiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1aCAgICAgIAlAc3AscjcKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg4MDAwLHI3Ci0KLQltdmlfaF9tZW0JIzB4ZmZmZmJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHVoCQlAc3AscjcKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX2dyICAJMHhmZmZmLHI3Ci0KLQk7IFRlc3QgbGR1aCBAKCRSMTMsJFJqKSwkUmkKLQltdnJfaF9ncglzcCxyMTMKLQlpbmNpX2hfZ3IJLTgscjEzCi0JbXZpX2hfZ3IJOCxyOAotCi0JbXZpX2hfbWVtCSMweDAwMDBiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1aAkJQChyMTMscjgpLHI3Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTAscjcKLQotCW12aV9oX21lbQkjMHgwMDAxYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWggICAgCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkxLHI3Ci0KLQltdmlfaF9tZW0JIzB4N2ZmZmJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHVoCQlAKHIxMyxyOCkscjcKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHg3ZmZmLHI3Ci0KLQltdmlfaF9tZW0JIzB4ODAwMGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHVoICAgICAgCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfZ3IgIAkweDgwMDAscjcKLQotCW12aV9oX21lbQkjMHhmZmZmYmVlZixzcAotCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWgJCUAocjEzLHI4KSxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweGZmZmYscjcKLQotCTsgVGVzdCBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaQotCW12aV9oX21lbQkjMHhkZWFkYmVlZixzcAotCW12cl9oX2dyCXNwLHIxNAotCW12aV9oX2dyCS0weGZlLHI4Ci0JYWRkX2hfZ3IJcjgscjE0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlsZHVoCQlAKHIxNCwweGZlKSxyNwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlYWQscjcKLQotCWluY2lfaF9ncgkweDdlLHIxNAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWggICAgCUAocjE0LDB4ODApLHI3Ci0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9nciAgCTB4ZGVhZCxyNwotCi0JaW5jaV9oX2dyCTB4ODAscjE0Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1aAkJQChyMTQsMHgwKSxyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweGRlYWQscjcKLQotCWluY2lfaF9ncgkweDgwLHIxNAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCWxkdWggICAgICAJQChyMTQsLTB4ODApLHI3Ci0JdGVzdF9jYwkJMSAxIDAgMQotCXRlc3RfaF9nciAgCTB4ZGVhZCxyNwotCi0JaW5jaV9oX2dyCTB4ODAscjE0Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbGR1aAkJQChyMTQsLTB4MTAwKSxyNwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfZ3IgIAkweGRlYWQscjcKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGVhdmUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZWF2ZS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkM2RkNzAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZWF2ZS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIGxlYXZlCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGxlYXZlCi1sZWF2ZToKLQk7IFRlc3QgbGVhdmUgJHUxMAotCW12cl9oX2dyCXNwLHI3CQkJOyBzYXZlIFN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglzcCxyMTQKLQlpbmNpX2hfZ3IJLTQscjE0Ci0JbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0Ci0JbXZpX2hfZ3IJMHhiZWVmZGVhZCxyMTUKLQlzZXRfY2MJMHgwZgkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JbGVhdmUKLQl0ZXN0X2NjCTEgMSAxIDEKLQl0ZXN0cl9oX2dyCXNwLHI3Ci0JdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjE0Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDc0OWYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBsc2wgJFJqLCRSaSwgbHNsICR1NCwkUmoKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbHNsCi1sc2w6Ci0JOyBUZXN0IGxzbCAkUmosJFJpCi0JbXZpX2hfZ3IgICAJMHhkZWFkYmVlMCxyNwk7IFNoaWZ0IGJ5IDAKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc2wgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMixyOAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkYmVlMSxyNwk7IFNoaWZ0IGJ5IDEKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc2wgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX2dyICAJNCxyOAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkYmVmZixyNwk7IFNoaWZ0IGJ5IDMxCi0JbXZpX2hfZ3IgICAJMSxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ZGVhZGJlZmYscjcJOyBjbGVhciByZWdpc3RlcgotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzbCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQk7IFRlc3QgbHNsICR1NFJpCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNsICAgICAgCTAscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMixyOAotCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNsICAgICAgCTEscjgKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX2dyICAJNCxyOAotCi0JbXZpX2hfZ3IgICAJMSxyOAotCXNldF9jYyAgICAgICAgICAweDBlCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNsICAgICAgCTE1LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9nciAgCTB4MDAwMDgwMDAscjgKLQotCW12aV9oX2dyICAgCTB4MDAwMjAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzbCAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbDIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wyLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhY2Y4NC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbDIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBsc2wyICRSaiwkUmksIGxzbDIgJHU0LCRSagotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBsc2wyCi1sc2wyOgotCTsgVGVzdCBsc2wyICR1NFJpCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNsMiAgICAgIAkwLHI4Ci0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfaF9nciAgCTB4MjAwMDAscjgKLQotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzbDIgICAgICAJMSxyOAotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweDQwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkxLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc2wyICAgICAgCTE1LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzbDIgICAgICAJMTUscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc3IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc3IuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjk1ODdmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbHNyLmNncworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgbHNyICRSaiwkUmksIGxzciAkdTQsJFJqCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGxzcgotbHNyOgotCTsgVGVzdCBsc3IgJFJqLCRSaQotCW12aV9oX2dyICAgCTB4ZGVhZGJlZTAscjcJOyBTaGlmdCBieSAwCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNyICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMAotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ZGVhZGJlZTEscjcJOyBTaGlmdCBieSAxCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNyICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9nciAgCTB4NDAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ZGVhZGJlZmYscjcJOyBTaGlmdCBieSAzMQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzciAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkxLHI4Ci0KLQltdmlfaF9nciAgIAkweGRlYWRiZWZmLHI3CTsgY2xlYXIgcmVnaXN0ZXIKLQltdmlfaF9nciAgIAkweDQwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc3IgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAotCi0JOyBUZXN0IGxzciAkdTRSaQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzciAgICAgIAkwLHI4Ci0JdGVzdF9jYwkJMSAwIDAgMAotCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzciAgICAgIAkxLHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9nciAgCTB4NDAwMDAwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzciAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweDAwMDEwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweDAwMDA0MDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc3IgICAgICAJMTUscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc3IyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbHNyMi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmNlYWEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc3IyLmNncworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IgbHNyMiAkdTQsJFJqCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIGxzcjIKLWxzcjI6Ci0JOyBUZXN0IGxzcjIgJHU0UmkKLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlsc3IyICAgICAgCTAscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMHgwMDAwODAwMCxyOAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNyMiAgICAgIAkxLHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9nciAgCTB4MDAwMDQwMDAscjgKLQotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCWxzcjIgICAgICAJMTUscjgKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX2dyICAJMSxyOAotCi0JbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbHNyMiAgICAgIAkxNSxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL21pc2MuZXhwIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9taXNjLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNDkwZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL21pc2MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBNaXNjZWxsYW5lb3VzIEZSMzAgc2ltdWxhdG9yIHRlc3RjYXNlcwotCi1pZiBbaXN0YXJnZXQgZnIzMCotKi0qXSB7Ci0gICAgIyBsb2FkIHN1cHBvcnQgcHJvY3MKLSAgICAjIGxvYWRfbGliIGNnZW4uZXhwCi0KLSAgICAjIGFsbCBtYWNoaW5lcwotICAgIHNldCBhbGxfbWFjaHMgImZyMzAiCi0KLSAgICAjIFRoZSAubXMgc3VmZml4IGlzIGZvciAibWlzY2VsbGFuZW91cyAucyIuCi0gICAgZm9yZWFjaCBzcmMgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLm1zXV0gewotCSMgSWYgd2UncmUgb25seSB0ZXN0aW5nIHNwZWNpZmljIGZpbGVzIGFuZCB0aGlzIGlzbid0IG9uZSBvZiB0aGVtLAotCSMgc2tpcCBpdC4KLQlpZiAhW3J1bnRlc3RfZmlsZV9wICRydW50ZXN0cyAkc3JjXSB7Ci0JICAgIGNvbnRpbnVlCi0JfQotCi0JcnVuX3NpbV90ZXN0ICRzcmMgJGFsbF9tYWNocwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbW92LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbW92LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5OTI1Mi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL21vdi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBtb3YgJFJqLCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBtb3YKLW1vdjoKLQk7IFRlc3QgbW92ICRSaiwkUmkKLQltdmlfaF9nciAgIAkxLHI3Ci0JbXZpX2hfZHIgICAJMHhhLHRicgotCW12aV9oX2RyICAgCTB4YixycAotCW12aV9oX2RyICAgCTB4YyxtZGgKLQltdmlfaF9kciAgIAkweGQsbWRsCi0JbXZyX2hfZ3IgICAgICAgIHNwLHNzcAotCW12cl9oX2dyCXNwLHVzcAotCi0JbW92CQlyNyxyNwotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkxLHI3Ci0KLQltb3YJCXI3LHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JdGVzdF9jYwkJMSAxIDEgMAotCXRlc3RfaF9nciAgCTEscjcKLQl0ZXN0X2hfZ3IgIAkxLHI4Ci0KLQk7IFRlc3QgbW92ICRScywkUmkKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXRicixyNwotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfZ3IgIAkweGEscjcKLQotCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCW1vdgkJcnAscjcKLQl0ZXN0X2NjCQkxIDEgMCAwCi0JdGVzdF9oX2dyICAJMHhiLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCW1kaCxyNwotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZ3IgIAkweGMscjcKLQotCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCW1vdgkJbWRsLHI3Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9nciAgCTB4ZCxyNwotCi0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0JbW92CQl1c3AscjcKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdHJfaF9nciAgCXNwLHI3Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXNzcCxyNwotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0cl9oX2dyICAJc3AscjcKLQotCTsgVGVzdCBtb3YgJFJpLCRScwotCXNldF9jYyAgICAgICAgICAweDA3CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCW1vdgkJcjgsdGJyCi0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9kciAgCTB4MSx0YnIKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCW1vdgkJcjgscnAKLQl0ZXN0X2NjCQkwIDEgMSAwCi0JdGVzdF9oX2RyICAJMHgxLHJwCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXI4LG1kaAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkweDEsbWRoCi0KLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXI4LG1kbAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkweDEsbWRsCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXI4LHNzcAotCXRlc3RfY2MJCTAgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweDEsc3NwCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQltb3YJCXI4LHVzcAotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfZHIgIAkweDEsdXNwCi0KLQk7IFRlc3QgbW92ICRQUywkUmkKLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBDb25kaXRpb24gY29kZXMgYWZmZWN0IHJlc3VsdAotCXNldF9kYml0cwkweDMKLQltb3YJCXBzLHI3Ci0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9nciAgCTB4MDAwMDA2MDEscjcKLQotCTsgVGVzdCBtb3YgJFJpLFBTCi0Jc2V0X2NjICAgICAgICAgIDB4MDEJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jc2V0X2RiaXRzCTB4MQkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdmlfaF9ncgkweDAwMDAwNDBlLHI3Ci0JbW92CQlyNyxQUwotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2RiaXRzCTB4MgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWwuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWwuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2NiZjU4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIG11bCAkUmosJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIG11bAotbXVsOgotCTsgVGVzdCBtdWwgJFJqLCRSaQotCTsgUG9zaXRpdmUgb3BlcmFuZHMKLQltdmlfaF9nciAgIAkzLHI3CQk7IG11bHRpcGx5IHNtYWxsIG51bWJlcnMKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAk2LG1kbAotCi0JbXZpX2hfZ3IgICAJMSxyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBlCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMixtZGwKLQotCW12aV9oX2dyICAgCTIscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTIsbWRsCi0KLQltdmlfaF9nciAgIAkwLHI3CQk7IG11bHRpcGx5IGJ5IDAKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMCAxCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAkwLG1kbAotCi0JbXZpX2hfZ3IgICAJMixyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJMCxyOAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMCxtZGwKLQotCW12aV9oX2dyICAgCTB4M2ZmZmZmZmYscjcJOyAzMSBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMiBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMHg4MDAwMDAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMyBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJNCxyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMQotCXRlc3RfaF9kciAgCTEsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcJOyBtYXggcG9zaXRpdmUgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMQotCXRlc3RfaF9kciAgCTB4M2ZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGwKLQotCTsgTWl4ZWQgb3BlcmFuZHMKLQltdmlfaF9nciAgIAktMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9kciAgCS0xLG1kaAotCXRlc3RfaF9kciAgCS02LG1kbAotCi0JbXZpX2hfZ3IgICAJMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCi0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfZHIgIAktMSxtZGgKLQl0ZXN0X2hfZHIgIAktNixtZGwKLQotCW12aV9oX2dyICAgCTEscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX2RyICAJLTEsbWRoCi0JdGVzdF9oX2RyICAJLTIsbWRsCi0KLQltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJMSxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9kciAgCS0xLG1kaAotCXRlc3RfaF9kciAgCS0yLG1kbAotCi0JbXZpX2hfZ3IgICAJMCxyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTAsbWRsCi0KLQltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJMCxyOAotCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMCxtZGwKLQotCW12aV9oX2dyICAgCTB4MjAwMDAwMDEscjcJOyAzMSBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAotCXRlc3RfaF9kciAgCTB4YmZmZmZmZmUsbWRsCi0KLQltdmlfaF9nciAgIAkweDQwMDAwMDAwLHI3CTsgMzIgYml0IHJlc3VsdAotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGgKLQl0ZXN0X2hfZHIgIAkweDgwMDAwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHg0MDAwMDAwMSxyNwk7IDMyIGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAktMixyOAotCXNldF9jYyAgICAgICAgICAweDBjCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMyBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTQscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRsCi0KLQltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI3CTsgbWF4IG5lZ2F0aXZlIHJlc3VsdAotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweGMwMDAwMDAwLG1kaAotCXRlc3RfaF9kciAgCTB4ODAwMDAwMDAsbWRsCi0KLQk7IE5lZ2F0aXZlIG9wZXJhbmRzCi0JbXZpX2hfZ3IgICAJLTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycwotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAk2LG1kbAotCi0JbXZpX2hfZ3IgICAJLTEscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJLTIscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCS0xLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhjMDAwMDAwMSxyNwk7IDMxIGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAktMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDAgMQotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4YzAwMDAwMDAscjcJOyAzMiBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTB4ODAwMDAwMDAsbWRsCi0KLQltdmlfaF9nciAgIAkweGMwMDAwMDAwLHI3CTsgMzMgYml0IHJlc3VsdAotCW12aV9oX2dyICAgCS00LHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMSAxCi0JdGVzdF9oX2RyICAJMSxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMSxyNwk7IGFsbW9zdCBtYXggcG9zaXRpdmUgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMSxyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMQotCXRlc3RfaF9kciAgCTB4M2ZmZmZmZmYsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGwKLQotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWwgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMSAxCi0JdGVzdF9oX2RyICAJMHg0MDAwMDAwMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kbAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWxoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsaC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjFmMDcuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWxoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIG11bGggJFJqLCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBtdWxoCi1tdWxoOgotCTsgVGVzdCBtdWxoICRSaiwkUmkKLQk7IFBvc2l0aXZlIG9wZXJhbmRzCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMixyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAk2LG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMSxyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMixyOAotCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMixyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMSxyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMCxyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMixyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMixyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkM2ZmZixyNwk7IDE1IGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWxoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9kciAgCTB4MDAwMDdmZmUsbWRsCi0KLQltdmlfaF9nciAgIAkweGRlYWQ0MDAwLHI3CTsgMTYgYml0IHJlc3VsdAotCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAwCi0JdGVzdF9oX2RyICAJMHgwMDAwODAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDQwMDAscjcJOyAxNyBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwNCxyOAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweDAwMDEwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkN2ZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWY3ZmZmLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWxoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9kciAgCTB4M2ZmZjAwMDEsbWRsCi0KLQk7IE1peGVkIG9wZXJhbmRzCi0JbXZpX2hfZ3IgICAJLTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX2RyICAJLTYsbWRsCi0KLQltdmlfaF9nciAgIAkzLHI3CQk7IG11bHRpcGx5IHNtYWxsIG51bWJlcnMKLQltdmlfaF9nciAgIAktMixyOAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfZHIgIAktNixtZGwKLQotCW12aV9oX2dyICAgCTEscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWxoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMAotCXRlc3RfaF9kciAgCS0yLG1kbAotCi0JbXZpX2hfZ3IgICAJLTIscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX2RyICAJLTIsbWRsCi0KLQltdmlfaF9nciAgIAkwLHI3CQk7IG11bHRpcGx5IGJ5IDAKLQltdmlfaF9nciAgIAktMixyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kbAotCi0JbXZpX2hfZ3IgICAJLTIscjcJCTsgbXVsdGlwbHkgYnkgMAotCW12aV9oX2dyICAgCTAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX2RyICAJMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDIwMDEscjcJOyAxNSBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX2RyICAJMHhmZmZmYmZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDQwMDAscjcJOyAxNiBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMCAwCi0JdGVzdF9oX2RyICAJMHhmZmZmODAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDQwMDEscjcJOyAxNiBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX2RyICAJMHhmZmZmN2ZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDQwMDAscjcJOyAxNyBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTQscjgKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2RyICAJMHhmZmZmMDAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDdmZmYscjcJOyBtYXggbmVnYXRpdmUgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHhiZWVmODAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweGMwMDA4MDAwLG1kbAotCi0JOyBOZWdhdGl2ZSBvcGVyYW5kcwotCW12aV9oX2dyICAgCS0zLHI3CQk7IG11bHRpcGx5IHNtYWxsIG51bWJlcnMKLQltdmlfaF9nciAgIAktMixyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAk2LG1kbAotCi0JbXZpX2hfZ3IgICAJLTEscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCS0yLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWxoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9kciAgCTIsbWRsCi0KLQltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJLTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMCAxCi0JdGVzdF9oX2RyICAJMixtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZGMwMDEscjcJOyAxNSBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMCAxCi0JdGVzdF9oX2RyICAJMHgwMDAwN2ZmZSxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZGMwMDAscjcJOyAxNiBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAwCi0JdGVzdF9oX2RyICAJMHgwMDAwODAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZGMwMDAscjcJOyAxNyBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJLTQscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2RyICAJMHgwMDAxMDAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDgwMDEscjcJOyBhbG1vc3QgbWF4IHBvc2l0aXZlIHJlc3VsdAotCW12aV9oX2dyICAgCTB4YmVlZjgwMDEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bGggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2RyICAJMHgzZmZmMDAwMSxtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDgwMDAscjcJOyBtYXggcG9zaXRpdmUgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHhiZWVmODAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsaCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweDQwMDAwMDAwLG1kbAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsdS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzU4M2IuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1LmNncworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIG11bHUgJFJqLCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBtdWx1Ci1tdWx1OgotCTsgVGVzdCBtdWx1ICRSaiwkUmkKLQk7IFBvc2l0aXZlIG9wZXJhbmRzCi0JbXZpX2hfZ3IgICAJMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsdSAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTYsbWRsCi0KLQltdmlfaF9nciAgIAkxLHI3CQk7IG11bHRpcGx5IGJ5IDEKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1ICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDAgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMixtZGwKLQotCW12aV9oX2dyICAgCTIscjcJCTsgbXVsdGlwbHkgYnkgMQotCW12aV9oX2dyICAgCTEscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bHUgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJMCxyNwkJOyBtdWx0aXBseSBieSAwCi0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsdSAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTAsbWRsCi0KLQltdmlfaF9nciAgIAkyLHI3CQk7IG11bHRpcGx5IGJ5IDAKLQltdmlfaF9nciAgIAkwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1ICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9kciAgCTAsbWRoCi0JdGVzdF9oX2RyICAJMCxtZGwKLQotCW12aV9oX2dyICAgCTB4M2ZmZmZmZmYscjcJOyAzMSBiaXQgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsdSAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDEKLQl0ZXN0X2hfZHIgIAkwLG1kaAotCXRlc3RfaF9kciAgCTB4N2ZmZmZmZmUsbWRsCi0KLQltdmlfaF9nciAgIAkweDQwMDAwMDAwLHI3CTsgMzIgYml0IHJlc3VsdAotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bHUgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2RyICAJMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDgwMDAwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyNwk7IDMzIGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1ICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDEgMQotCXRlc3RfaF9kciAgCTEsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGwKLQotCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcJOyBtYXggcG9zaXRpdmUgcmVzdWx0Ci0JbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsdSAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweDNmZmZmZmZmLG1kaAotCXRlc3RfaF9kciAgCTB4MDAwMDAwMDEsbWRsCi0KLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI3CTsgbWF4IHBvc2l0aXZlIHJlc3VsdAotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bHUgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX2RyICAJMHg0MDAwMDAwMCxtZGgKLQl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhmZmZmZmZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweGZmZmZmZmZmLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1ICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmUsbWRoCi0JdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsdWguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1aC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzg0N2UuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1aC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIG11bHVoICRSaiwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgbXVsdWgKLW11bHVoOgotCTsgVGVzdCBtdWx1aCAkUmosJFJpCi0JOyBQb3NpdGl2ZSBvcGVyYW5kcwotCW12aV9oX2dyICAgCTB4ZGVhZDAwMDMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycwotCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bHVoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9kciAgCTYsbWRsCi0KLQltdmlfaF9nciAgIAkweGRlYWQwMDAxLHI3CQk7IG11bHRpcGx5IGJ5IDEKLQltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkyLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMixyNwkJOyBtdWx0aXBseSBieSAxCi0JbXZpX2hfZ3IgICAJMHhiZWVmMDAwMSxyOAotCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0JbXVsdWggICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMCAxCi0JdGVzdF9oX2RyICAJMixtZGwKLQotCW12aV9oX2dyICAgCTB4ZGVhZDAwMDAscjcJCTsgbXVsdGlwbHkgYnkgMAotCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW11bHVoICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMQotCXRlc3RfaF9kciAgCTAsbWRsCi0KLQltdmlfaF9nciAgIAkweGRlYWQwMDAyLHI3CQk7IG11bHRpcGx5IGJ5IDAKLQltdmlfaF9nciAgIAkweGJlZWYwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkM2ZmZixyNwk7IDE1IGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDEKLQl0ZXN0X2hfZHIgIAkweDAwMDA3ZmZlLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkNDAwMCxyNwk7IDE2IGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZHIgIAkweDAwMDA4MDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkODAwMCxyNwk7IDE3IGJpdCByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweDAwMDEwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkN2ZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWY3ZmZmLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweDNmZmYwMDAxLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkODAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWY4MDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMSAxIDEKLQl0ZXN0X2hfZHIgIAkweDQwMDAwMDAwLG1kbAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkZmZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKLQltdmlfaF9nciAgIAkweGJlZWZmZmZmLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQltdWx1aCAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfZHIgIAkweGZmZmUwMDAxLG1kbAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ub3AuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ub3AuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODVjNTVjLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbm9wLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3Igbm9wCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIG5vcAotbm9wOgotCTsgVGVzdCBub3AKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlub3AKLQl0ZXN0X2NjCQkxIDEgMSAxCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3IuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWNiOTcwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3IuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBvciAkUmosJFJpLCBvciAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBvcgotb3I6Ci0JOyBUZXN0IG9yICRSaiwkUmkKLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3Ci0JbXZpX2hfZ3IgICAJMHg1NTU1NTU1NSxyOAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jb3IgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMHhmZmZmZmZmZixyOAotCi0JbXZpX2hfZ3IgICAJMHgwMDAwMDAwMCxyNwotCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yCQlyNyxyOAotCXRlc3RfY2MJCTAgMSAwIDAKLQl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4Ci0KLQltdmlfaF9nciAgIAkweGRlYWQwMDAwLHI3Ci0JbXZpX2hfZ3IgICAJMHgwMDAwYmVlZixyOAotCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jb3IJCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjgKLQotCTsgVGVzdCBvciAkUmosQCRSaQotCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKLQltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlvciAgICAgIAlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX21lbSAJMHhmZmZmZmZmZixzcAotCi0JbXZpX2hfZ3IgICAJMHgwMDAwMDAwMCxyNwotCW12aV9oX21lbSAgCTB4MDAwMDAwMDAsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yCQlyNyxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHgwMDAwMDAwMCxzcAotCi0JbXZpX2hfZ3IgICAJMHhkZWFkMDAwMCxyNwotCW12aV9oX21lbSAgCTB4MDAwMGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yCQlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX21lbSAJMHhkZWFkYmVlZixzcAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vcmIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vcmIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2IzNmJmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JiLmNncworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3Igb3JiICRSaiwkUmksIG9yYiAkUmosQCRSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBvcmIKLW9yYjoKLQk7IFRlc3Qgb3JiICRSaixAJFJpCi0JbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNwotCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yYiAgICAgIAlyNyxAc3AKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX21lbSAJMHhmZjU1NTU1NSxzcAotCi0JbXZpX2hfZ3IgICAJMHhmZmZmZmYwMCxyNwotCW12aV9oX21lbSAgCTB4MDBmZmZmZmYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yYgkJcjcsQHNwCi0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9tZW0gCTB4MDBmZmZmZmYsc3AKLQotCW12aV9oX2dyICAgCTB4MDAwMDAwZDAscjcKLQltdmlfaF9tZW0gIAkweDBlYWRiZWVmLHNwCi0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlvcmIJCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yY2NyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JjY3IuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmM1NWE4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JjY3IuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBvcmNjciAkdTgKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgb3JjY3IKLW9yY2NyOgotCW9yY2NyICAgICAgCTB4ZmYKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9pCQkxCi0JdGVzdF9zX3VzZXIKLQotCXNldF9jYwkweDBmCi0Jb3JjY3IgICAgICAJMHgwMAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2kJCTEKLQl0ZXN0X3NfdXNlcgotCi0Jc2V0X2NjCQkweDAwCi0Jc2V0X2kJCQkwCi0Jc2V0X3Nfc3lzdGVtCi0Jb3JjY3IgICAgICAJMHhhYQotCXRlc3RfY2MJCTEgMCAxIDAKLQl0ZXN0X2kJCTAKLQl0ZXN0X3NfdXNlcgotCi0Jc2V0X2NjCQkweDAwCi0Jc2V0X2kJCQkwCi0Jc2V0X3Nfc3lzdGVtCi0Jb3JjY3IgICAgICAJMHhjMAotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2kJCTAKLQl0ZXN0X3Nfc3lzdGVtCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yaC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMGI0MDIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vcmguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBvcmggJFJqLCRSaSwgb3JoICRSaixAJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIG9yaAotb3JoOgotCTsgVGVzdCBvcmggJFJqLEAkUmkKLQltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3Ci0JbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAotCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jb3JoICAgICAgCXI3LEBzcAotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfbWVtIAkweGZmZmY1NTU1LHNwCi0KLQltdmlfaF9nciAgIAkweGZmZmYwMDAwLHI3Ci0JbXZpX2hfbWVtICAJMHgwMDAwZmZmZixzcAotCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jb3JoCQlyNyxAc3AKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX21lbSAJMHgwMDAwZmZmZixzcAotCi0JbXZpX2hfZ3IgICAJMHgwMDAwZGUwMCxyNwotCW12aV9oX21lbSAgCTB4MDBhZGJlZWYsc3AKLQlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCW9yaAkJcjcsQHNwCi0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmYTBiMi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHJldAotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCByZXQKLQotCTsgVGVzdCByZXQKLQltdmlfaF9ncgkweGRlYWRiZWVmLHI5Ci0JbXZpX2hfZ3IgICAJI2Z1bmMxLHIwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLWNhbGwxOgotCWNhbGwJCUByMAotCXRlc3RyX2hfZ3IJMixyMAotCXRlc3RfaF9ncgkweGJlZWZkZWFkLHI5Ci0JcGFzcwotCi1mdW5jMToKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JbXZpX2hfZ3IJI2NhbGwxLHI3Ci0JaW5jaV9oX2dyCTIscjcKLQl0ZXN0cl9oX2RyCXI3LHJwCi0Jc2F2ZV9ycAotCi0JbXZpX2hfZ3IgICAJI2Z1bmMyLHIwCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLWNhbGwyOgotCWNhbGw6ZAkJQHIwCi0JbGRpOjgJCTEscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcwotCXRlc3RyX2hfZ3IJMixyMAotCXJlc3RvcmVfcnAKLQlyZXQKLWZ1bmMyOgotCXRlc3RfY2MJCTEgMSAxIDEKLQltdmlfaF9ncgkjY2FsbDIscjcKLQlpbmNpX2hfZ3IJNCxyNwotCXRlc3RyX2hfZHIJcjcscnAKLQl0ZXN0cl9oX2dyCTEscjAKLQlzYXZlX3JwCi0KLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQotY2FsbDM6Ci0JY2FsbAkJZnVuYzMKLQl0ZXN0cl9oX2dyCTIscjAKLQlyZXN0b3JlX3JwCi0JcmV0Ci1mdW5jMzoKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JbXZpX2hfZ3IJI2NhbGwzLHI3Ci0JaW5jaV9oX2dyCTIscjcKLQl0ZXN0cl9oX2RyCXI3LHJwCi0Jc2F2ZV9ycAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKLWNhbGw0OgotCWNhbGw6ZAkJZnVuYzQKLQlsZGk6OAkJMSxyMAkJOyBNdXN0IGFzc3VtZSB0aGlzIHdvcmtzCi0JdGVzdHJfaF9ncgkzLHIwCi0JcmVzdG9yZV9ycAotCXJldDpkCi0JbGRpOjgJCTIscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcwotZnVuYzQ6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCW12aV9oX2dyCSNjYWxsNCxyNwotCWluY2lfaF9ncgk0LHI3Ci0JdGVzdHJfaF9kcglyNyxycAotCXRlc3RyX2hfZ3IJMSxyMAotCW12aV9oX2dyCTB4YmVlZmRlYWQscjkKLQlyZXQ6ZAotCWxkaTo4CQkzLHIwCQk7IE11c3QgYXNzdW1lIHRoaXMgd29ya3MKLQotCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0aS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmExYWYwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0aS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHJldGkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgcmV0aQotcmV0aToKLQk7IFRlc3QgcmV0aSB3aXRoIGxvdyByZXNldCBvZiBpbG0gYWxsb3dlZAotCW12cl9oX2dyCXNwLHI4CQk7IFNhdmUgc3RhY2sgcG9pbnRlcgotCXNldF9zX3N5c3RlbQotCXNldF9pCQkxCi0Jc2V0X2lsbQkJMTUJCTsgYXR0ZW1wdCByZXNldCBvZiBsb3cgcmFuZ2UJIAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXNhdmVfcHMKLQlpbmNpX2hfZ3IJLTQsc3AKLQltdmlfaF9tZW0JcmV0MSxzcAotCXNldF9pCQkwCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCXNldF9pbG0JCTAgCQk7IGF0dGVtcHQgcmVzZXQgb2YgbG93IHJhbmdlCSAKLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQotCXJldGkKLQlmYWlsCi0KLXJldDE6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3Rfc19zeXN0ZW0KLQl0ZXN0X2kJCTEKLQl0ZXN0X2lsbQkxNQotCXRlc3RyX2hfZ3IJcjgsc3AKLQotCTsgVGVzdCByZXRpIHdpdGggbG93IHJlc2V0IG9mIGlsbSBub3QgYWxsb3dlZAotCW12cl9oX2dyCXNwLHI4CQk7IFNhdmUgc3RhY2sgcG9pbnRlcgotCXNldF9zX3N5c3RlbQotCXNldF9pCQkwCi0Jc2V0X2lsbQkJMTUJCTsgYXR0ZW1wdCByZXNldCBvZiBsb3cgcmFuZ2UJIAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXNhdmVfcHMKLQlpbmNpX2hfZ3IJLTQsc3AKLQltdmlfaF9tZW0JcmV0MixzcAotCXNldF9pCQkwCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCXNldF9pbG0JCTE2IAkJOyBkaXNhbGxvdyByZXNldCBvZiBsb3cgcmFuZ2UKLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQotCXJldGkKLQlmYWlsCi0KLXJldDI6Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3Rfc19zeXN0ZW0KLQl0ZXN0X2kJCTAKLQl0ZXN0X2lsbQkzMQotCXRlc3RyX2hfZ3IJcjgsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3QuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NThkMTQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvcgotIyBtYWNoKCk6IGZyMzAKLSMgIHN0ICRSaSxAJFJqCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgc3QKLXN0OgotCW12cl9oX2dyCXNwLHI5CQk7IFNhdmUgc3RhY2sgcG9pbnRlcgotCTsgVGVzdCBzdCAkUmksQFJqCi0JbXZpX2hfZ3IJMHhkZWFkYmVlZixyOAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXI4LEBzcAotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYsc3AKLQl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixyOAotCi0JOyBUZXN0IHN0ICRSaSxAKFIxMyxSaikKLQltdmlfaF9ncgkweGJlZWZkZWFkLHI4Ci0JbXZyX2hfZ3IJc3AscjEKLQlpbmNpX2hfZ3IJLTgsc3AKLQltdnJfaF9ncglzcCxyMgotCWluY2lfaF9ncgk0LHNwCi0KLQltdmlfaF9ncgk0LHIxMwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAxIDAKLQl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjEKLQl0ZXN0X2hfZ3IJMHhiZWVmZGVhZCxyOAotCi0JbXZpX2hfZ3IJMCxyMTMKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdCAgICAgIAlyOCxAKHIxMyxzcCkKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX21lbQkweGJlZWZkZWFkLHNwCi0JdGVzdF9oX2dyCTB4YmVlZmRlYWQscjgKLQotCW12aV9oX2dyCS00LHIxMwotCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAwIDAKLQl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjIKLQl0ZXN0X2hfZ3IJMHhiZWVmZGVhZCxyOAotCi0JOyBUZXN0IHN0ICRSaSxAKFIxNCwkZGlzcDEwKQotCW12aV9oX2dyCTB4ZGVhZGJlZWYscjgKLQltdnJfaF9ncglyOSxzcAkJOyBSZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglzcCxyMTQKLQlpbmNpX2hfZ3IJLTUwOCxyMTQKLQltdnJfaF9ncglyMTQscjIKLQlpbmNpX2hfZ3IJLTUxMixyMTQKLQltdnJfaF9ncglyMTQscjMKLQlpbmNpX2hfZ3IJNTEyLHIxNAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3QgICAgICAJcjgsQChyMTQsNTA4KQotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYscjEKLQl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3QgICAgICAJcjgsQChyMTQsMCkKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX21lbQkweGRlYWRiZWVmLHIyCi0JdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjgKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXI4LEAocjE0LC01MTIpCi0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixyMwotCXRlc3RfaF9ncgkweGRlYWRiZWVmLHI4Ci0KLQk7IFRlc3Qgc3QgJFJpLEAoUjE1LCR1ZGlzcDYpCi0JbXZpX2hfZ3IJMHhiZWVmZGVhZCxyOAotCW12cl9oX2dyCXI5LHNwCQk7IFJlc3RvcmUgc3RhY2sgcG9pbnRlcgotCWluY2lfaF9ncgktNjAsc3AKLQotCXNldF9jYyAgICAgICAgICAweDA4CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXI4LEAocjE1LDYwKQotCXRlc3RfY2MJCTEgMCAwIDAKLQl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjkKLQl0ZXN0X2hfZ3IJMHhiZWVmZGVhZCxyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDcJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3QgICAgICAJcjgsQChyMTUsMCkKLQl0ZXN0X2NjCQkwIDEgMSAxCi0JdGVzdF9oX21lbQkweGJlZWZkZWFkLHI5Ci0JdGVzdF9oX2dyCTB4YmVlZmRlYWQscjgKLQotCTsgVGVzdCBzdCAkUmksQC1SMTUKLQltdnJfaF9ncglyOSxzcAkJOyBSZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglyOSxyMTAKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXIxNSxALXIxNQotCXRlc3RfY2MJCTAgMSAxIDAKLQl0ZXN0cl9oX21lbQlyOSxzcAkJOyBvcmlnaW5hbCB2YWx1ZSBzdG9yZWQKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCi0KLQltdmlfaF9ncgkweGRlYWRiZWVmLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MDUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3QgICAgICAJcjgsQC1yMTUKLQl0ZXN0X2NjCQkwIDEgMCAxCi0JdGVzdF9oX21lbQkweGRlYWRiZWVmLHNwCi0JdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjgKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCi0KLQk7IFRlc3Qgc3QgJFJzLEAtUjE1Ci0JbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCi0JbXZyX2hfZ3IJcjkscjEwCi0JbXZpX2hfZHIJMHhiZWVmZGVhZCx0YnIKLQltdmlfaF9kcgkweGRlYWRiZWVmLHJwCi0JbXZpX2hfZHIJMHgwMDAwZGVhZCxtZGgKLQltdmlfaF9kcgkweGJlZWYwMDAwLG1kbAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3QgICAgICAJdGJyLEAtcjE1Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxzcAotCWluY2lfaF9ncgktNCxyMTAKLQl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKLQotCXNldF9jYyAgICAgICAgICAweDAzCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXJwLEAtcjE1Ci0JdGVzdF9jYwkJMCAwIDEgMQotCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixzcAotCWluY2lfaF9ncgktNCxyMTAKLQl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKLQotCXNldF9jYyAgICAgICAgICAweDAyCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCW1kaCxALXIxNQotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfbWVtCTB4MDAwMGRlYWQsc3AKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdCAgICAgIAltZGwsQC1yMTUKLQl0ZXN0X2NjCQkwIDAgMCAxCi0JdGVzdF9oX21lbQkweGJlZWYwMDAwLHNwCi0JaW5jaV9oX2dyCS00LHIxMAotCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAotCi0JbXZyX2hfZ3IJc3AsdXNwCi0Jc2V0X3NfdXNlcgotCXNldF9jYyAgICAgICAgICAweDAwCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXNzcCxALXIxNQotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0cl9oX21lbQlyMTAsc3AKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdCAgICAgIAl1c3AsQC1yMTUKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdHJfaF9tZW0JcjEwLHNwCQk7IG9yaWdpbmFsIHZhbHVlIHN0b3JlZAotCWluY2lfaF9ncgktNCxyMTAKLQl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKLQotCW12cl9oX2dyCXNwLHNzcAotCXNldF9zX3N5c3RlbQotCXNldF9jYyAgICAgICAgICAweDAwCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0ICAgICAgCXVzcCxALXIxNQotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0cl9oX21lbQlyMTAsc3AKLQlpbmNpX2hfZ3IJLTQscjEwCi0JdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCi0KLQlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdCAgICAgIAlzc3AsQC1yMTUKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdHJfaF9tZW0JcjEwLHNwCQk7IG9yaWdpbmFsIHZhbHVlIHN0b3JlZAotCWluY2lfaF9ncgktNCxyMTAKLQl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKLQotCTsgVGVzdCBzdCAkUFMsQC1SMTUKLQltdnJfaF9ncglyOSxzcAkJOyBSZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglyOSxyMTAKLQotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhZmZlY3QgcmVzdWx0Ci0Jc2V0X2RiaXRzCTMJCTsgRGl2aXNpb24gYml0cyBhZmZlY3QgcmVzdWx0Ci0Jc3QgICAgICAJcHMsQC1yMTUKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX21lbQkweDAwMDAwNjBmLHNwCi0JaW5jaV9oX2dyCS00LHIxMAotCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGJmNGYyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RiLmNncworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IKLSMgbWFjaCgpOiBmcjMwCi0jICBzdGIgJFJpLEAkUmoKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGIKLXN0YjoKLQltdnJfaF9ncglzcCxyOQkJOyBTYXZlIHN0YWNrIHBvaW50ZXIKLQk7IFRlc3Qgc3RiICRSaSxAUmoKLQltdmlfaF9tZW0JMHhkZWFkYmVlZixzcAotCW12aV9oX2dyCTB4YWFhYWFhZmUscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdGIgICAgICAJcjgsQHNwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9tZW0JMHhmZWFkYmVlZixzcAotCXRlc3RfaF9ncgkweGFhYWFhYWZlLHI4Ci0KLQk7IFRlc3Qgc3RiICRSaSxAKFIxMyxSaikKLQltdmlfaF9tZW0JMHhiZWVmZGVhZCxzcAotCW12aV9oX2dyCTB4YWFhYWFhZGUscjgKLQltdnJfaF9ncglzcCxyMQotCWluY2lfaF9ncgktOCxzcAotCW12cl9oX2dyCXNwLHIyCi0JbXZpX2hfbWVtCTB4YmVlZmRlYWQsc3AKLQlpbmNpX2hfZ3IJNCxzcAotCW12aV9oX21lbQkweGJlZWZkZWFkLHNwCi0KLQltdmlfaF9ncgk0LHIxMwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0YiAgICAgIAlyOCxAKHIxMyxzcCkKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX21lbQkweGRlZWZkZWFkLHIxCi0JdGVzdF9oX2dyCTB4YWFhYWFhZGUscjgKLQotCW12aV9oX2dyCTAscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RiICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfbWVtCTB4ZGVlZmRlYWQsc3AKLQl0ZXN0X2hfZ3IJMHhhYWFhYWFkZSxyOAotCi0JbXZpX2hfZ3IJLTQscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RiICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAwIDAKLQl0ZXN0X2hfbWVtCTB4ZGVlZmRlYWQscjIKLQl0ZXN0X2hfZ3IJMHhhYWFhYWFkZSxyOAotCi0JOyBUZXN0IHN0YiAkUmksQChSMTQsJGRpc3A4Ci0JbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCi0JbXZpX2hfZ3IJMHhhYWFhYWFmZSxyOAotCW12aV9oX21lbQkweGRlYWRiZWVmLHNwCi0JbXZyX2hfZ3IJc3AscjE0Ci0JaW5jaV9oX2dyCS0xMjgscjE0CTsgbXVzdCBiZSBhbGlnbmVkCi0JbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0Ci0JbXZyX2hfZ3IJcjE0LHIyCi0JaW5jaV9oX2dyCS0xMjgscjE0CTsgbXVzdCBiZSBhbGlnbmVkCi0JbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0Ci0JbXZyX2hfZ3IJcjE0LHIzCi0JaW5jaV9oX2dyCTEyOSxyMTQKLQotCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0YiAgICAgIAlyOCxAKHIxNCwxMjcpCi0JdGVzdF9jYwkJMSAwIDEgMQotCXRlc3RfaF9tZW0JMHhmZWFkYmVlZixyMQotCXRlc3RfaF9ncgkweGFhYWFhYWZlLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdGIgICAgICAJcjgsQChyMTQsMCkKLQl0ZXN0X2NjCQkxIDAgMSAwCi0JdGVzdF9oX21lbQkweGRlZmViZWVmLHIyCi0JdGVzdF9oX2dyCTB4YWFhYWFhZmUscjgKLQotCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0YiAgICAgIAlyOCxAKHIxNCwtMTI4KQotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfbWVtCTB4ZGVmZWJlZWYscjMKLQl0ZXN0X2hfZ3IJMHhhYWFhYWFmZSxyOAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRhMTE1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMgZnIzMCB0ZXN0Y2FzZSBmb3IKLSMgbWFjaCgpOiBmcjMwCi0jICBzdGggJFJpLEAkUmoKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGgKLXN0aDoKLQltdnJfaF9ncglzcCxyOQkJOyBTYXZlIHN0YWNrIHBvaW50ZXIKLQk7IFRlc3Qgc3RoICRSaSxAUmoKLQltdmlfaF9tZW0JMHhkZWFkYmVlZixzcAotCW12aV9oX2dyCTB4YWFhYWJlZWYscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdGggICAgICAJcjgsQHNwCi0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9tZW0JMHhiZWVmYmVlZixzcAotCXRlc3RfaF9ncgkweGFhYWFiZWVmLHI4Ci0KLQk7IFRlc3Qgc3RoICRSaSxAKFIxMyxSaikKLQltdmlfaF9tZW0JMHhiZWVmZGVhZCxzcAotCW12aV9oX2dyCTB4YWFhYWRlYWQscjgKLQltdnJfaF9ncglzcCxyMQotCWluY2lfaF9ncgktOCxzcAotCW12cl9oX2dyCXNwLHIyCi0JbXZpX2hfbWVtCTB4YmVlZmRlYWQsc3AKLQlpbmNpX2hfZ3IJNCxzcAotCW12aV9oX21lbQkweGJlZWZkZWFkLHNwCi0KLQltdmlfaF9ncgk0LHIxMwotCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0aCAgICAgIAlyOCxAKHIxMyxzcCkKLQl0ZXN0X2NjCQkxIDEgMSAwCi0JdGVzdF9oX21lbQkweGRlYWRkZWFkLHIxCi0JdGVzdF9oX2dyCTB4YWFhYWRlYWQscjgKLQotCW12aV9oX2dyCTAscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RoICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAwIDEKLQl0ZXN0X2hfbWVtCTB4ZGVhZGRlYWQsc3AKLQl0ZXN0X2hfZ3IJMHhhYWFhZGVhZCxyOAotCi0JbXZpX2hfZ3IJLTQscjEzCi0Jc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RoICAgICAgCXI4LEAocjEzLHNwKQotCXRlc3RfY2MJCTEgMSAwIDAKLQl0ZXN0X2hfbWVtCTB4ZGVhZGRlYWQscjIKLQl0ZXN0X2hfZ3IJMHhhYWFhZGVhZCxyOAotCi0JOyBUZXN0IHN0aCAkUmksQChSMTQsJGRpc3A5KQotCW12cl9oX2dyCXI5LHNwCQk7IFJlc3RvcmUgc3RhY2sgcG9pbnRlcgotCW12aV9oX2dyCTB4YWFhYWFiY2QscjgKLQltdmlfaF9tZW0JMHhkZWFkYmVlZixzcAotCW12cl9oX2dyCXNwLHIxNAotCWluY2lfaF9ncgktMjU2LHIxNAk7IG11c3QgYmUgYWxpZ25lZAotCW12cl9oX2dyCXIxNCxyMgotCW12aV9oX21lbQkweGRlYWRiZWVmLHIxNAotCWluY2lfaF9ncgktMjU2LHIxNAotCW12cl9oX2dyCXIxNCxyMwotCW12aV9oX21lbQkweGRlYWRiZWVmLHIxNAotCWluY2lfaF9ncgkyNTgscjE0Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdGggICAgICAJcjgsQChyMTQsMjU0KQotCXRlc3RfY2MJCTEgMCAxIDEKLQl0ZXN0X2hfbWVtCTB4YWJjZGJlZWYscjEKLQl0ZXN0X2hfZ3IJMHhhYWFhYWJjZCxyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RoICAgICAgCXI4LEAocjE0LDApCi0JdGVzdF9jYwkJMSAwIDEgMAotCXRlc3RfaF9tZW0JMHhkZWFkYWJjZCxyMgotCXRlc3RfaF9ncgkweGFhYWFhYmNkLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdGggICAgICAJcjgsQChyMTQsLTI1NikKLQl0ZXN0X2NjCQkxIDAgMCAxCi0JdGVzdF9oX21lbQkweGRlYWRhYmNkLHIzCi0JdGVzdF9oX2dyCTB4YWFhYWFiY2QscjgKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RpbG0uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGlsbS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Nzk0MGIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGlsbS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHN0aWxtICRpOAotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGlsbQotc3RpbG06Ci0Jc3RpbG0gICAgICAJMAotCXRlc3RfaWxtCTAKLQotCXN0aWxtCQkweGUwCi0JdGVzdF9pbG0JMAotCi0Jc3RpbG0JCTEKLQl0ZXN0X2lsbQkxCi0KLQlzdGlsbQkJMTUKLQl0ZXN0X2lsbQkxNQotCi0Jc3RpbG0JCTE2Ci0JdGVzdF9pbG0JMTYKLQotCXN0aWxtCQkwCi0JdGVzdF9pbG0JMTYKLQotCXN0aWxtCQkxCi0JdGVzdF9pbG0JMTcKLQotCXN0aWxtCQkxOAotCXRlc3RfaWxtCTE4Ci0KLQlzdGlsbQkJMzEKLQl0ZXN0X2lsbQkzMQotCi0Jc3RpbG0JCTB4ZmYKLQl0ZXN0X2lsbQkzMQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdG0wLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RtMC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzE2MmMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdG0wLmNncworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHN0bTAgKCRyZWdsaXN0X2xvdykKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgc3RtMAotc3RtMDoKLQk7IFRlc3Qgc3RtMCAoJHJlZ2xpc3RfbG93KQotCW12cl9oX2dyCXNwLHI4CQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQotCW12cl9oX2dyCXNwLHI5CQk7IHNhdmUgc3RhY2sgcG9pbnRlciBwZXJtYW5lbnRseQotCW12aV9oX2dyICAgCTAscjAKLQltdmlfaF9nciAgIAkxLHIxCi0JbXZpX2hfZ3IgICAJMixyMgotCW12aV9oX2dyICAgCTMscjMKLQltdmlfaF9nciAgIAk0LHI0Ci0JbXZpX2hfZ3IgICAJNSxyNQotCW12aV9oX2dyICAgCTYscjYKLQltdmlfaF9nciAgIAk3LHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RtMCAgICAgIAkocjAscjIscjQscjYpCi0JdGVzdF9jYwkJMSAxIDEgMQotCWluY2lfaF9ncgktNCxyOAotCXRlc3RfaF9tZW0JNixyOAotCWluY2lfaF9ncgktNCxyOAotCXRlc3RfaF9tZW0JNCxyOAotCWluY2lfaF9ncgktNCxyOAotCXRlc3RfaF9tZW0JMixyOAotCWluY2lfaF9ncgktNCxyOAotCXRlc3RfaF9tZW0JMCxyOAotCi0JbXZyX2hfZ3IJcjksc3AJCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCi0JbXZyX2hfZ3IJcjkscjgJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHRlbXBvcmFyaWx5Ci0JbXZpX2hfZ3IgICAJMCxyMAotCW12aV9oX2dyICAgCTEscjEKLQltdmlfaF9nciAgIAkyLHIyCi0JbXZpX2hfZ3IgICAJMyxyMwotCW12aV9oX2dyICAgCTQscjQKLQltdmlfaF9nciAgIAk1LHI1Ci0JbXZpX2hfZ3IgICAJNixyNgotCW12aV9oX2dyICAgCTcscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKLQlzdG0wICAgICAgCShyMSxyMyxyNSxyNykKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQk3LHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQk1LHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQkzLHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQkxLHI4Ci0KLQltdnJfaF9ncglyOSxzcAkJOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglyOSxyOAkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKLQltdmlfaF9nciAgIAkwLHIwCi0JbXZpX2hfZ3IgICAJMSxyMQotCW12aV9oX2dyICAgCTIscjIKLQltdmlfaF9nciAgIAkzLHIzCi0JbXZpX2hfZ3IgICAJNCxyNAotCW12aV9oX2dyICAgCTUscjUKLQltdmlfaF9nciAgIAk2LHI2Ci0JbXZpX2hfZ3IgICAJNyxyNwotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0bTAgICAgICAJKHIxLHI1LHI3LHIzKQk7IE9yZGVyIHNwZWNpZmllZCBzaG91bGQgbm90IG1hdHRlcgotCXRlc3RfY2MJCTEgMSAxIDEKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0X2hfbWVtCTcscjgKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0X2hfbWVtCTUscjgKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0X2hfbWVtCTMscjgKLQlpbmNpX2hfZ3IJLTQscjgKLQl0ZXN0X2hfbWVtCTEscjgKLQotCW12cl9oX2dyCXI5LHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgotCW12cl9oX2dyCXI5LHI4CQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQotCW12aV9oX2dyICAgCTkscjAKLQltdmlfaF9nciAgIAk5LHIxCi0JbXZpX2hfZ3IgICAJOSxyMgotCW12aV9oX2dyICAgCTkscjMKLQltdmlfaF9nciAgIAk5LHI0Ci0JbXZpX2hfZ3IgICAJOSxyNQotCW12aV9oX2dyICAgCTkscjYKLQltdmlfaF9nciAgIAk5LHI3Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCi0Jc3RtMCAgICAgIAkoKQkJOyBzaG91bGQgZG8gbm90aGluZwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0cl9oX2dyCXI5LHNwCi0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQk3LHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQk1LHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQkzLHI4Ci0JaW5jaV9oX2dyCS00LHI4Ci0JdGVzdF9oX21lbQkxLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0bTEuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdG0xLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjMzczZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0bTEuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBzdG0xICgkcmVnbGlzdF9sb3cpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIHN0bTEKLXN0bTE6Ci0JOyBUZXN0IHN0bTEgKCRyZWdsaXN0X2xvdykKLQltdnJfaF9ncglzcCxyMQkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKLQltdnJfaF9ncglzcCxyMgkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgcGVybWFuZW50bHkKLQltdmlfaF9nciAgIAk4LHI4Ci0JbXZpX2hfZ3IgICAJOSxyOQotCW12aV9oX2dyICAgCTEwLHIxMAotCW12aV9oX2dyICAgCTExLHIxMQotCW12aV9oX2dyICAgCTEyLHIxMgotCW12aV9oX2dyICAgCTEzLHIxMwotCW12aV9oX2dyICAgCTE0LHIxNAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0bTEgICAgICAJKHI4LHIxMCxyMTIscjE0KQotCXRlc3RfY2MJCTEgMSAxIDEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0X2hfbWVtCTE0LHIxCi0JaW5jaV9oX2dyCS00LHIxCi0JdGVzdF9oX21lbQkxMixyMQotCWluY2lfaF9ncgktNCxyMQotCXRlc3RfaF9tZW0JMTAscjEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0cl9oX21lbQk4LHIxCi0KLQltdnJfaF9ncglyMixzcAkJOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglyMixyMQkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKLQltdmlfaF9nciAgIAk4LHI4Ci0JbXZpX2hfZ3IgICAJOSxyOQotCW12aV9oX2dyICAgCTEwLHIxMAotCW12aV9oX2dyICAgCTExLHIxMQotCW12aV9oX2dyICAgCTEyLHIxMgotCW12aV9oX2dyICAgCTEzLHIxMwotCW12aV9oX2dyICAgCTE0LHIxNAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0bTEgICAgICAJKHI5LHIxMSxyMTMscjE1KQotCXRlc3RfY2MJCTEgMSAxIDEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0cl9oX21lbQlyMixyMQotCWluY2lfaF9ncgktNCxyMQotCXRlc3RfaF9tZW0JMTMscjEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0X2hfbWVtCTExLHIxCi0JaW5jaV9oX2dyCS00LHIxCi0JdGVzdF9oX21lbQk5LHIxCQk7IHNhdmVkIHIxNSBpcyBmcm9tIGJlZm9yZSBzdG0xCi0KLQltdnJfaF9ncglyMixzcAkJOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKLQltdnJfaF9ncglyMixyMQkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKLQltdmlfaF9nciAgIAk4LHI4Ci0JbXZpX2hfZ3IgICAJOSxyOQotCW12aV9oX2dyICAgCTEwLHIxMAotCW12aV9oX2dyICAgCTExLHIxMQotCW12aV9oX2dyICAgCTEyLHIxMgotCW12aV9oX2dyICAgCTEzLHIxMwotCW12aV9oX2dyICAgCTE0LHIxNAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0bTEgICAgICAJKHI5LHIxMyxyMTUscjExKTsgT3JkZXIgc3BlY2lmaWVkIHNob3VsZCBub3QgbWF0dGVyCi0JdGVzdF9jYwkJMSAxIDEgMQotCWluY2lfaF9ncgktNCxyMQotCXRlc3RyX2hfbWVtCXIyLHIxCi0JaW5jaV9oX2dyCS00LHIxCi0JdGVzdF9oX21lbQkxMyxyMQotCWluY2lfaF9ncgktNCxyMQotCXRlc3RfaF9tZW0JMTEscjEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0X2hfbWVtCTkscjEJCTsgc2F2ZWQgcjE1IGlzIGZyb20gYmVmb3JlIHN0bTEKLQotCW12cl9oX2dyCXIyLHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgotCW12cl9oX2dyCXIyLHIxCQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQotCW12aV9oX2dyICAgCTkscjgKLQltdmlfaF9nciAgIAk5LHI5Ci0JbXZpX2hfZ3IgICAJOSxyMTAKLQltdmlfaF9nciAgIAk5LHIxMQotCW12aV9oX2dyICAgCTkscjEyCi0JbXZpX2hfZ3IgICAJOSxyMTMKLQltdmlfaF9nciAgIAk5LHIxNAotCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQotCXN0bTEgICAgICAJKCkJCTsgc2hvdWxkIGRvIG5vdGhpbmcKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdHJfaF9ncglyMixzcAotCWluY2lfaF9ncgktNCxyMQotCXRlc3RyX2hfbWVtCXIyLHIxCi0JaW5jaV9oX2dyCS00LHIxCi0JdGVzdF9oX21lbQkxMyxyMQotCWluY2lfaF9ncgktNCxyMQotCXRlc3RfaF9tZW0JMTEscjEKLQlpbmNpX2hfZ3IJLTQscjEKLQl0ZXN0X2hfbWVtCTkscjEKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RyZXMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdHJlcy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWZkZjMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdHJlcy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHN0cmVzICRAUmkrLCR1NAotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdHJlcwotc3RyZXM6Ci0JOyBUZXN0IHN0cmVzICRAUmkrLCR1NAotCTsgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGluY3JlbWVudHMgUmkKLQltdmlfaF9nciAgIAkweDEwMDAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlzdHJlcyAgICAgIAkwLEByNysKLQl0ZXN0X2NjCQkxIDEgMSAxCi0JdGVzdF9oX2dyICAJMHgxMDA0LHI3Ci0KLQltdmlfaF9nciAgIAkweDEwMDAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKLQlzdHJlcyAgICAgIAkweGYsQHI3KwotCXRlc3RfY2MJCTEgMSAxIDEKLQl0ZXN0X2hfZ3IgIAkweDEwMDQscjcKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3ViLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3ViLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlYWE3OS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Yi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHN1YiAkUmosJFJpCi0jIG1hY2goKTogZnIzMAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlTVEFSVAotCi0JLnRleHQKLQkuZ2xvYmFsIHN1Ygotc3ViOgotCTsgVGVzdCBzdWIgJFJqLCRSaQotCW12aV9oX2dyICAgCTEscjcKLQltdmlfaF9nciAgIAkyLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlzdWIgICAgICAJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMCAwCi0JdGVzdF9oX2dyICAJMSxyOAotCi0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAotCXN1YgkJcjcscjgKLQl0ZXN0X2NjCQkwIDAgMSAwCi0JdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKLQlzdWIJCXI4LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9nciAgCTAscjgKLQotCXNldF9jYyAgICAgICAgICAweDA2CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCi0Jc3ViCQlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfZ3IgIAkweGZmZmZmZmZmLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1YmMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdWJjLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3OGU0MC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1YmMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBzdWJjICRSaiwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgc3ViYwotc3ViYzoKLQk7IFRlc3Qgc3ViYyAkUmosJFJpCi0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBNYWtlIHN1cmUgY2FycnkgaXMgb2ZmCi0Jc3ViYyAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkxLHI4Ci0KLQltdmlfaF9nciAgIAkxLHI3Ci0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBjCQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvZmYKLQlzdWJjCQlyNyxyOAotCXRlc3RfY2MJCTAgMCAxIDAKLQl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI4Ci0KLQlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBNYWtlIHN1cmUgY2FycnkgaXMgb2ZmCi0Jc3ViYwkJcjgscjgKLQl0ZXN0X2NjCQkwIDEgMCAwCi0JdGVzdF9oX2dyICAJMCxyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgTWFrZSBzdXJlIGNhcnJ5IGlzIG9mZgotCXN1YmMJCXI3LHI4Ci0JdGVzdF9jYwkJMSAwIDAgMQotCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKLQotCW12aV9oX2dyICAgCTEscjcKLQltdmlfaF9nciAgIAkzLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGYJCTsgTWFrZSBzdXJlIGNhcnJ5IGlzIG9uCi0Jc3ViYyAgICAgIAlyNyxyOAotCXRlc3RfY2MJCTAgMCAwIDAKLQl0ZXN0X2hfZ3IgIAkxLHI4Ci0KLQltdmlfaF9nciAgIAkwLHI3Ci0JbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAotCXNldF9jYyAgICAgICAgICAweDBkCQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvbgotCXN1YmMJCXI3LHI4Ci0JdGVzdF9jYwkJMCAwIDEgMAotCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjgKLQotCW12aV9oX2dyICAJMHg3ZmZmZmZmZSxyNwotCXNldF9jYyAgICAgICAgICAweDBiCQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvbgotCXN1YmMJCXI3LHI4Ci0JdGVzdF9jYwkJMCAxIDAgMAotCXRlc3RfaF9nciAgCTAscjgKLQotCW12aV9oX2dyICAgCTAscjcKLQlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBNYWtlIHN1cmUgY2FycnkgaXMgb24KLQlzdWJjCQlyNyxyOAotCXRlc3RfY2MJCTEgMCAwIDEKLQl0ZXN0X2hfZ3IgIAkweGZmZmZmZmZmLHI4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Ym4uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdWJuLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4MzA0Ni4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Ym4uY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBmcjMwIHRlc3RjYXNlIGZvciBzdWJuICRSaiwkUmkKLSMgbWFjaCgpOiBmcjMwCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCVNUQVJUCi0KLQkudGV4dAotCS5nbG9iYWwgc3Vibgotc3VibjoKLQk7IFRlc3Qgc3VibiAkUmosJFJpCi0JbXZpX2hfZ3IgICAJMSxyNwotCW12aV9oX2dyICAgCTIscjgKLQlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiB1c3VhbCByZXN1bHQKLQlzdWJuICAgICAgCXI3LHI4Ci0JdGVzdF9jYwkJMSAxIDEgMQotCXRlc3RfaF9nciAgCTEscjgKLQotCW12aV9oX2dyICAgCTEscjcKLQltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4Ci0Jc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgdXN1YWwgcmVzdWx0Ci0Jc3VibgkJcjcscjgKLQl0ZXN0X2NjCQkxIDEgMCAxCi0JdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgdXN1YWwgcmVzdWx0Ci0Jc3VibgkJcjgscjgKLQl0ZXN0X2NjCQkxIDAgMSAxCi0JdGVzdF9oX2dyICAJMCxyOAotCi0Jc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgdXN1YWwgcmVzdWx0Ci0Jc3VibgkJcjcscjgKLQl0ZXN0X2NjCQkwIDEgMSAwCi0JdGVzdF9oX2dyICAJMHhmZmZmZmZmZixyOAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC90ZXN0dXRpbHMuaW5jIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC90ZXN0dXRpbHMuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIzZDZmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvdGVzdHV0aWxzLmluYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0jIHIwLCByNC1yNiBhcmUgdXNlZCBhcyB0bXBzLCBjb25zaWRlciB0aGVtIGNhbGwgY2xvYmJlcmVkIGJ5IHRoZXNlIG1hY3Jvcy4KLQotCS5tYWNybyBzdGFydAotCS5kYXRhCi1mYWlsbXNnOgotCS5hc2NpaSAiZmFpbFxuIgotcGFzc21zZzoKLQkuYXNjaWkgInBhc3NcbiIKLQkudGV4dAotCS5nbG9iYWwgX3N0YXJ0Ci1fc3RhcnQ6Ci0JbGRpMzIgMHg3ZmZmYyxzcAk7IFRPRE8gLS0gd2hhdCdzIGEgZ29vZCB2YWx1ZSBmb3IgdGhpcz8KLQlsZGkzMiAweGZmYzAwLHIwCi0JbW92ICAgcjAsdGJyCQk7IGRlZmluZWQgaW4gbWFudWFsCi0JbW92ICAgc3AsdXNwCi0JbW92ICAgc3Asc3NwCi0JLmVuZG0KLQotOyBFeGl0IHdpdGggcmV0dXJuIGNvZGUKLQkubWFjcm8gZXhpdCByYwotCWxkaTMyIFxyYyxyNAotCWxkaTMyICMxLHIwCi0JaW50ICAgIzEwCi0JLmVuZG0KLQotOyBQYXNzIHRoZSB0ZXN0IGNhc2UKLQkubWFjcm8gcGFzcwotCWxkaTMyICM1LHI2Ci0JbGRpMzIgI3Bhc3Ntc2cscjUKLQlsZGkzMiAjMSxyNAotCWxkaTMyICM1LHIwCi0JaW50ICAgIzEwCi0JZXhpdCAgIzAKLQkuZW5kbQotCi07IEZhaWwgdGhlIHRlc3RjYXNlCi0JLm1hY3JvIGZhaWwKLQlsZGkzMiAjNSxyNgotCWxkaTMyICNmYWlsbXNnLHI1Ci0JbGRpMzIgIzEscjQKLQlsZGkzMiAjNSxyMAotCWludCAgICMxMAotCWV4aXQgICMxCi0JLmVuZG0KLQotOyBMb2FkIGFuIGltbWVkaWF0ZSB2YWx1ZSBpbnRvIGEgZ2VuZXJhbCByZWdpc3RlcgotOyBUT0RPOiB1c2UgbWluaW1hbCBzaXplZCBpbnNuCi0JLm1hY3JvIG12aV9oX2dyIHZhbCByZWcKLQlsZGkzMiBcdmFsLFxyZWcKLQkuZW5kbQotCi07IExvYWQgYW4gaW1tZWRpYXRlIHZhbHVlIGludG8gYSBkZWRpY2F0ZWQgcmVnaXN0ZXIKLQkubWFjcm8gbXZpX2hfZHIgdmFsIHJlZwotCWxkaTMyIFx2YWwscjAKLQltb3YgcjAsXHJlZwotCS5lbmRtCi0KLTsgTG9hZCBhIGdlbmVyYWwgcmVnaXN0ZXIgaW50byBhbm90aGVyIGdlbmVyYWwgcmVnaXN0ZXIKLQkubWFjcm8gbXZyX2hfZ3Igc3JjIHRhcmcKLQltb3YgXHNyYyxcdGFyZwotCS5lbmRtCi0KLTsgU3RvcmUgYW4gaW1tZWRpYXRlIGludG8gYSB3b3JkIGluIG1lbW9yeQotCS5tYWNybyBtdmlfaF9tZW0gdmFsIGFkZHIKLQltdmlfaF9nciAgXHZhbCByNAotCW12cl9oX21lbSByNCxcYWRkcgotCS5lbmRtCi0KLTsgU3RvcmUgYSByZWdpc3RlciBpbnRvIGEgd29yZCBpbiBtZW1vcnkKLQkubWFjcm8gbXZyX2hfbWVtIHJlZyBhZGRyCi0Jc3QgXHJlZyxAXGFkZHIKLQkuZW5kbQotCi07IFN0b3JlIHRoZSBjdXJyZW50IHBzIG9uIHRoZSBzdGFjawotCS5tYWNybyBzYXZlX3BzCi0Jc3QgcHMsQC1yMTUKLQkuZW5kbQotCi07IExvYWQgYSB3b3JkIHZhbHVlIGZyb20gbWVtb3J5Ci0JLm1hY3JvIGxkbWVtX2hfZ3IgYWRkciByZWcKLQlsZCBAXGFkZHIsXHJlZwotCS5lbmRtCi0KLTsgQWRkIDIgZ2VuZXJhbCByZWdpc3RlcnMKLQkubWFjcm8gYWRkX2hfZ3IgcmVnMSByZWcyCi0JYWRkIFxyZWcxLFxyZWcyCi0JLmVuZG0KLQotOyBJbmNyZW1lbnQgYSByZWdpc3RlciBieSBhbmQgaW1tZWRpYXRlCi0JLm1hY3JvIGluY2lfaF9nciBpbmMgcmVnCi0JbXZpX2hfZ3IgXGluYyxyNAotCWFkZCByNCxccmVnCi0JLmVuZG0KLQotOyBUZXN0IHRoZSB2YWx1ZSBvZiBhbiBpbW1lZGlhdGUgYWdhaW5zdCBhIGdlbmVyYWwgcmVnaXN0ZXIKLQkubWFjcm8gdGVzdF9oX2dyIHZhbCByZWcKLQkuaWYgKFx2YWwgPj0gMCkgJiYgKFx2YWwgPD0gMTUpCi0JY21wIFx2YWwsXHJlZwotCS5lbHNlCi0JLmlmIChcdmFsIDwgMCkgJiYgKFx2YWwgPj0gLTE2KQotCWNtcDIgXHZhbCxccmVnCi0JLmVsc2UKLQlsZGkzMiBcdmFsLHI0Ci0JY21wIHI0LFxyZWcKLQkuZW5kaWYKLQkuZW5kaWYKLQliZXEgdGVzdF9nclxACi0JZmFpbAotdGVzdF9nclxAOgotCS5lbmRtCi0KLTsgY29tcGFyZSB0d28gZ2VuZXJhbCByZWdpc3RlcnMKLQkubWFjcm8gdGVzdHJfaF9nciByZWcxIHJlZzIKLQljbXAgXHJlZzEsXHJlZzIKLQliZXEgdGVzdHJfZ3JcQAotCWZhaWwKLXRlc3RyX2dyXEA6Ci0JLmVuZG0KLQotOyBUZXN0IHRoZSB2YWx1ZSBvZiBhbiBpbW1lZGlhdGUgYWdhaW5zdCBhIGRlZGljYXRlZCByZWdpc3RlcgotCS5tYWNybyB0ZXN0X2hfZHIgdmFsIHJlZwotCW1vdiBccmVnLHI1Ci0JdGVzdF9oX2dyIFx2YWwgcjUKLQkuZW5kbQotCi07IFRlc3QgdGhlIHZhbHVlIG9mIGFuIGdlbmVyYWwgcmVnaXN0ZXIgYWdhaW5zdCBhIGRlZGljYXRlZCByZWdpc3RlcgotCS5tYWNybyB0ZXN0cl9oX2RyIGdyIGRyCi0JbW92IFxkcixyNQotCXRlc3RyX2hfZ3IgXGdyIHI1Ci0JLmVuZG0KLQotOyBDb21wYXJlIGFuIGltbWVkaWF0ZSB3aXRoIHdvcmQgaW4gbWVtb3J5Ci0JLm1hY3JvIHRlc3RfaF9tZW0gdmFsIGFkZHIKLQlsZG1lbV9oX2dyIFxhZGRyIHI1Ci0JdGVzdF9oX2dyIFx2YWwgcjUKLQkuZW5kbQotCi07IENvbXBhcmUgYSBnZW5lcmFsIHJlZ2lzdGVyIHdpdGggd29yZCBpbiBtZW1vcnkKLQkubWFjcm8gdGVzdHJfaF9tZW0gcmVnIGFkZHIKLQlsZG1lbV9oX2dyIFxhZGRyIHI1Ci0JdGVzdHJfaF9nciBccmVnIHI1Ci0JLmVuZG0KLQotOyBTZXQgdGhlIGNvbmRpdGlvbiBjb2RlcwotCS5tYWNybyBzZXRfY2MgbWFzawotCWFuZGNjcgkweGYwCi0Jb3JjY3IJXG1hc2sKLQkuZW5kbQotCi07IFNldCB0aGUgc3RhY2sgbW9kZQotCS5tYWNybyBzZXRfc191c2VyCi0Jb3JjY3IJMHgyMAotCS5lbmRtCi0KLQkubWFjcm8gc2V0X3Nfc3lzdGVtCi0JYW5kY2NyCTB4MWYKLQkuZW5kbQotCi07IFRlc3QgdGhlIHN0YWNrIG1vZGUKLQkubWFjcm8gdGVzdF9zX3VzZXIKLQltdnJfaF9nciBwcyxyMAotCW12aV9oX2dyIDB4MjAscjQKLQlhbmQgICAgICByNCxyMAotCXRlc3RfaF9nciAweDIwLHIwCi0JLmVuZG0KLQotCS5tYWNybyB0ZXN0X3Nfc3lzdGVtCi0JbXZyX2hfZ3IgcHMscjAKLQltdmlfaF9nciAweDIwLHI0Ci0JYW5kICAgICAgcjQscjAKLQl0ZXN0X2hfZ3IgMHgwLHIwCi0JLmVuZG0KLQotOyBTZXQgdGhlIGludGVycnVwdCBiaXQKLQkubWFjcm8gc2V0X2kgdmFsCi0JLmlmIChcdmFsID09IDEpCi0Jb3JjY3IJMHgxMAotCS5lbHNlCi0JYW5kY2NyCTB4MmYKLQkuZW5kaWYKLQkuZW5kbQotCi07IFRlc3QgdGhlIHN0YWNrIG1vZGUKLQkubWFjcm8gdGVzdF9pIHZhbAotCW12cl9oX2dyICBwcyxyMAotCW12aV9oX2dyICAweDEwLHI0Ci0JYW5kICAgICAgIHI0LHIwCi0JLmlmIChcdmFsID09IDEpCi0JdGVzdF9oX2dyIDB4MTAscjAKLQkuZWxzZQotCXRlc3RfaF9nciAweDAscjAKLQkuZW5kaWYKLQkuZW5kbQotCi07IFNldCB0aGUgaWxtCi0JLm1hY3JvIHNldF9pbG0gdmFsCi0Jc3RpbG0gXHZhbAotCS5lbmRtCi0KLTsgVGVzdCB0aGUgaWxtCi0JLm1hY3JvIHRlc3RfaWxtIHZhbAotCW12cl9oX2dyICAgcHMscjAKLQltdmlfaF9nciAgIDB4MWYwMDAwLHI0Ci0JYW5kICAgICAgICByNCxyMAotCW12aV9oX2dyICAgXHZhbCxyNQotCW12aV9oX2dyICAgMHgxZixyNAotCWFuZAkgICByNCxyNQotCWxzbCAgICAgICAgMTUscjUKLQlsc2wgICAgICAgIDEscjUKLQl0ZXN0cl9oX2dyIHIwLHI1Ci0JLmVuZG0KLQotOyBUZXN0IHRoZSBjb25kaXRpb24gY29kZXMKLQkubWFjcm8gdGVzdF9jYyBOIFogViBDCi0JLmlmIChcTiA9PSAxKQotCWJwIGZhaWxcQAotCS5lbHNlCi0JYm4gZmFpbFxACi0JLmVuZGlmCi0JLmlmIChcWiA9PSAxKQotCWJuZSBmYWlsXEAKLQkuZWxzZQotCWJlcSBmYWlsXEAKLQkuZW5kaWYKLQkuaWYgKFxWID09IDEpCi0JYm52IGZhaWxcQAotCS5lbHNlCi0JYnYgZmFpbFxACi0JLmVuZGlmCi0JLmlmIChcQyA9PSAxKQotCWJuYyBmYWlsXEAKLQkuZWxzZQotCWJjIGZhaWxcQAotCS5lbmRpZgotCWJyYSB0ZXN0X2NjXEAKLWZhaWxcQDoKLQlmYWlsCi10ZXN0X2NjXEA6Ci0JLmVuZG0KLQotOyBTZXQgdGhlIGRpdmlzaW9uIGJpdHMKLQkubWFjcm8gc2V0X2RiaXRzIHZhbAotCW12cl9oX2dyIHBzLHI1Ci0JbXZpX2hfZ3IgMHhmZmZmZjhmZixyNAotCWFuZCByNCxyNQotCW12aV9oX2dyIFx2YWwscjAKLQltdmlfaF9nciAzLHI0Ci0JYW5kIHI0LHIwCi0JbHNsIDkscjAKLQlvciByMCxyNQotCW12cl9oX2dyIHI1LHBzCi0JLmVuZG0KLQotOyBUZXN0IHRoZSBkaXZpc2lvbiBiaXRzCi0JLm1hY3JvIHRlc3RfZGJpdHMgdmFsCi0JbXZyX2hfZ3IgcHMscjAKLQlsc3IgOSxyMAotCW12aV9oX2dyIDMscjQKLQlhbmQgcjQscjAKLQl0ZXN0X2hfZ3IgXHZhbCxyMAotCS5lbmRtCi0KLTsgU2F2ZSB0aGUgcmV0dXJuIHBvaW50ZXIKLQkubWFjcm8gc2F2ZV9ycAotCXN0IHJwLEAtUjE1Ci0JLkVORE0KLQotOyByZXN0b3JlIHRoZSByZXR1cm4gcG9pbnRlcgotCS5tYWNybyByZXN0b3JlX3JwCi0JbGQgQFIxNSsscnAKLQkuZW5kbQotCi07IEVuc3VyZSBicmFuY2ggdGFrZW4KLQkubWFjcm8gdGFrZV9icmFuY2ggb3Bjb2RlCi0JXG9wY29kZSB0YWtlX2JyXEAKLQlmYWlsCi10YWtlX2JyXEA6Ci0JLmVuZG0KLQotCS5tYWNybyB0YWtlX2JyYW5jaF9kIG9wY29kZSB2YWwKLQlcb3Bjb2RlIHRha2VfYnJkXEAKLQlsZGk6OCBcdmFsLHIwCi0JZmFpbAotdGFrZV9icmRcQDoKLQl0ZXN0X2hfZ3IgXHZhbCxyMAotCS5lbmRtCi0KLTsgRW5zdXJlIGJyYW5jaCBub3QgdGFrZW4KLQkubWFjcm8gbm9fYnJhbmNoIG9wY29kZQotCVxvcGNvZGUgbm9fYnJmXEAKLQlicmEJbm9fYnJzXEAKLW5vX2JyZlxAOgotCWZhaWwKLW5vX2Jyc1xAOgotCS5lbmRtCi0KLQkubWFjcm8gbm9fYnJhbmNoX2Qgb3Bjb2RlIHZhbAotCVxvcGNvZGUgbm9fYnJkZlxACi0JbGRpOjggICBcdmFsLHIwCi0JYnJhCW5vX2JyZHNcQAotbm9fYnJkZlxAOgotCWZhaWwKLW5vX2JyZHNcQDoKLQl0ZXN0X2hfZ3IgXHZhbCxyMAotCS5lbmRtCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAveGNoYi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3hjaGIuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDUwYTJlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAveGNoYi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIGZyMzAgdGVzdGNhc2UgZm9yIHhjaGIgQCRSaixSaQotIyBtYWNoKCk6IGZyMzAKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0JU1RBUlQKLQotCS50ZXh0Ci0JLmdsb2JhbCB4Y2hiCi14Y2hiOgotCTsgVGVzdCB4Y2hiIEAkUmosUmkKLQltdmlfaF9tZW0JMHhkZWFkYmVlZixzcAotCW12aV9oX2dyCTB4YmVlZmRlYWQscjAKLQlzZXRfY2MJMHgwZgkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50Ci0JeGNoYgkJQHNwLHIwCi0JdGVzdF9jYwkxIDEgMSAxCi0JdGVzdF9oX2dyCTB4ZGUscjAKLQl0ZXN0X2hfbWVtCTB4YWRhZGJlZWYsc3AKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkMmIzYS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGFkZCAkZHIsJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBhZGQKLWFkZDoKLQotCW12aV9oX2dyIHI0LCAxCi0JbXZpX2hfZ3IgcjUsIDIKLQlhZGQgcjQsIHI1Ci0JdGVzdF9oX2dyIHI0LCAzCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZDMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGQzLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjYzg0OC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZDMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBhZGQzICRkciwkc3IsIyRzbG8xNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYWRkMwotYWRkMzoKLQotCW12aV9oX2dyIHI1LCAxCi0JYWRkMyByNCwgcjUsIDIKLQl0ZXN0X2hfZ3IgcjQsIDMKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ4ZDBkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkaS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGFkZGkgJGRyLCMkc2ltbTgKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGFkZGkKLWFkZGk6Ci0KLQltdmlfaF9nciByNSwgMQotCWFkZGkgcjUsIDIKLQl0ZXN0X2hfZ3IgcjUsIDMKLQotCXBhc3MKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkdi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGJlODMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2LmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgYWRkdiAkZHIsJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBhZGR2Ci1hZGR2OgotCW12aV9oX2NvbmRiaXQgMAotCW12aV9oX2dyIHI0LCAweDgwMDAwMDAwCi0JbXZpX2hfZ3IgcjUsIDB4ODAwMDAwMDAKLQotCWFkZHYgcjQsIHI1Ci0KLQlibmMgbm90X29rCi0JdGVzdF9oX2dyIHI0LCAwCi0JCi0JcGFzcwotbm90X29rOgotCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkdjMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2My5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzBhMTAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2My5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGFkZHYzICRkciwkc3IsIyRzaW1tMTYKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGFkZHYzCi1hZGR2MzoKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMQotCW12aV9oX2dyIHI1LCAxCi0KLQlhZGR2MyByNCwgcjUsICMyCi0KLQliYyBub3Rfb2sKLQotCXRlc3RfaF9nciByNCwgMwotCi0JbXZpX2hfZ3IgcjUsIDB4N2ZmZjgwMDEKLQotCWFkZHYzIHI0LCByNSwgIzB4N2ZmZgotCi0JYm5jIG5vdF9vawotCi0JcGFzcwotbm90X29rOgotCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkeC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzBlM2RiLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkeC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGFkZHggJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLSMgdGltZW91dCgpOiA0MgotCi0jIHRpbWVvdXQgaXMgc2V0IHRvIHRlc3QgaXQKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYWRkeAotYWRkeDoKLQltdmlfaF9jb25kYml0IDEKLQltdmlfaF9nciByNCwgMQotCW12aV9oX2dyIHI1LCAyCi0JYWRkeCByNCwgcjUKLQliYyBub3Rfb2sKLQl0ZXN0X2hfZ3IgcjQsIDQKLQotCW12aV9oX2dyIHI0LCAweGZmZmZmZmZlCi0JYWRkeCByNCwgcjUKLQlibmMgbm90X29rCi0JdGVzdF9oX2dyIHI0LCAwCi0KLQltdmlfaF9nciByNCwgLTEKLQltdmlfaF9nciByNSwgLTEKLQltdmlfaF9jb25kYml0IDEKLQlhZGR4IHI0LHI1Ci0JYm5jIG5vdF9vawotCXRlc3RfaF9nciByNCwgLTEKLQotCW12aV9oX2dyIHI0LC0xCi0JbXZpX2hfZ3IgcjUsMHg3ZmZmZmZmZgotCW12aV9oX2NvbmRiaXQgMQotCWFkZHggcjUscjQKLQlibmMgbm90X29rCi0JdGVzdF9oX2dyIHI1LDB4N2ZmZmZmZmYKLQotCXBhc3MKLQotbm90X29rOgotCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWxsaW5zbi5leHAgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVkODBmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIE0zMlIgc2ltdWxhdG9yIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgICMgbG9hZCBzdXBwb3J0IHByb2NzCi0gICAgIyBsb2FkX2xpYiBjZ2VuLmV4cAotCi0gICAgIyBhbGwgbWFjaGluZXMKLSAgICBzZXQgYWxsX21hY2hzICJtMzJyIgotCi0KLSAgICAjIFRoZSAuY2dzIHN1ZmZpeCBpcyBmb3IgImNnZW4gLnMiLgotICAgIGZvcmVhY2ggc3JjIFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5jZ3NdXSB7Ci0JIyBJZiB3ZSdyZSBvbmx5IHRlc3Rpbmcgc3BlY2lmaWMgZmlsZXMgYW5kIHRoaXMgaXNuJ3Qgb25lIG9mIHRoZW0sCi0JIyBza2lwIGl0LgotCWlmICFbcnVudGVzdF9maWxlX3AgJHJ1bnRlc3RzICRzcmNdIHsKLQkgICAgY29udGludWUKLQl9Ci0KLQlydW5fc2ltX3Rlc3QgJHNyYyAkYWxsX21hY2hzCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI2ODg1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgYW5kICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGFuZAotYW5kOgotCW12aV9oX2dyIHI0LCAzCi0JbXZpX2hfZ3IgcjUsIDYKLQotCWFuZCByNCwgcjUKLQotCXRlc3RfaF9nciByNCwgMgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kMy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWRlMzAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgYW5kMyAkZHIsJHNyLCMkdWltbTE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBhbmQzCi1hbmQzOgotCW12aV9oX2dyIHI0LCAwCi0JbXZpX2hfZ3IgcjUsIDYKLQotCWFuZDMgcjQsIHI1LCAjMwotCi0JdGVzdF9oX2dyIHI0LCAyCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjMjQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iYzI0LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNDMzMy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjMjQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBiYyAkZGlzcDI0Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBiYzI0Ci1iYzI0OgotCi0JbXZpX2hfY29uZGJpdCAwCi0JYmMubCB0ZXN0MGZhaWwKLQlicmEgdGVzdDBwYXNzCi10ZXN0MGZhaWw6Ci0JZmFpbAotdGVzdDBwYXNzOgotCi0JbXZpX2hfY29uZGJpdCAxCi0JYmMubCB0ZXN0MXBhc3MKLQlmYWlsCi10ZXN0MXBhc3M6Ci0KLQlwYXNzCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmM4LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmM4LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViNjIyYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjOC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJjICRkaXNwOAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYmM4Ci1iYzg6Ci0KLQltdmlfaF9jb25kYml0IDAKLQliYy5zIHRlc3QwZmFpbAotCWJyYSB0ZXN0MHBhc3MKLXRlc3QwZmFpbDoKLQlmYWlsCi10ZXN0MHBhc3M6Ci0KLQltdmlfaF9jb25kYml0IDEKLQliYy5zIHRlc3QxcGFzcwotCWZhaWwKLXRlc3QxcGFzczoKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmVxLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmVxLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkNmQ4Yi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JlcS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBiZXEKLWJlcToKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMTIKLQltdmlfaF9nciByNSwgMTIKLQliZXEgcjQsIHI1LCBvawotbm90X29rOgotCWZhaWwKLW9rOgotCW12aV9oX2dyIHI1LCAxMQotCWJlcSByNCwgcjUsIG5vdF9vawotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZXF6LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmVxei5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDczN2QuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZXF6LmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgYmVxeiAkc3JjMiwkZGlzcDE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBiZXF6Ci1iZXF6OgotCW12aV9oX2dyIHI0LCAwCi0JYmVxeiByNCwgb2sKLW5vdF9vazoKLQlmYWlsCi1vazoKLQltdmlfaF9nciByNCwgMQotCWJlcXogcjQsIG5vdF9vawotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZ2V6LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmdlei5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MDMxZjAuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZ2V6LmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgYmdleiAkc3JjMiwkZGlzcDE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBiZ2V6Ci1iZ2V6OgotCW12aV9oX2dyIHI0LCAxCi0JYmdleiByNCwgb2sKLW5vdF9vazoKLQlmYWlsCi1vazoKLQltdmlfaF9nciByNCwgLTEKLQliZ2V6IHI0LCBub3Rfb2sKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmd0ei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JndHouY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI4OTg5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmd0ei5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJndHogJHNyYzIsJGRpc3AxNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYmd0egotYmd0ejoKLQltdmlfaF9nciByNCwgMQotCWJndHogcjQsIG9rCi1ub3Rfb2s6Ci0JZmFpbAotb2s6Ci0JbXZpX2hfZ3IgcjQsIDAKLQliZ3R6IHI0LCBub3Rfb2sKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmwyNC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsMjQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZmMGRkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmwyNC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJsICRkaXNwMjQKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGJsMjQKLWJsMjQ6Ci0JYmwubCB0ZXN0MHBhc3MKLXRlc3QxZmFpbDoKLQlmYWlsCi0KLXRlc3QwcGFzczoKLQltdmFkZHJfaF9nciByNCwgdGVzdDFmYWlsCi0JYm5lICByNCwgcjE0LCB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmw4LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmw4LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2MzY5OC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsOC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJsICRkaXNwOAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYmw4Ci1ibDg6Ci0JYmwucyB0ZXN0MHBhc3MKLXRlc3QxZmFpbDoKLQlmYWlsCi0KLXRlc3QwcGFzczoKLQltdmFkZHJfaF9nciByNCwgdGVzdDFmYWlsCi0JYm5lICByNCwgcjE0LCB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmxlei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsZXouY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QxOThkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmxlei5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJsZXogJHNyYzIsJGRpc3AxNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYmxlegotYmxlejoKLQltdmlfaF9nciByNCwgMAotCWJsZXogcjQsIHRlc3QwcGFzcwotdGVzdDFmYWlsOgotCWZhaWwKLQotdGVzdDBwYXNzOgotCW12aV9oX2dyIHI0LCAxCi0JYmxleiByNCwgdGVzdDFmYWlsCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsdHouY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibHR6LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzNzdmYy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsdHouY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBibHR6ICRzcmMyLCRkaXNwMTYKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGJsdHoKLWJsdHo6Ci0JbXZpX2hfZ3IgcjQsIC0xCi0JYmx0eiByNCwgdGVzdDBwYXNzCi10ZXN0MWZhaWw6Ci0JZmFpbAotCi10ZXN0MHBhc3M6Ci0JbXZpX2hfZ3IgcjQsIDAKLQlibHR6IHI0LCB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5jMjQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmMyNC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmQyZDUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmMyNC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJuYyAkZGlzcDI0Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBibmMyNAotYm5jMjQ6Ci0JbXZpX2hfY29uZGJpdCAwCi0JYm5jLmwgdGVzdDBwYXNzCi0KLXRlc3QxZmFpbDoKLQlmYWlsCi10ZXN0MHBhc3M6Ci0KLQltdmlfaF9jb25kYml0IDEKLQlibmMubCB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5jOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuYzguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWUyNjEzLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5jOC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJuYyAkZGlzcDgKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGJuYzgKLWJuYzg6Ci0JbXZpX2hfY29uZGJpdCAwCi0JYm5jLnMgdGVzdDBwYXNzCi0KLXRlc3QxZmFpbDoKLQlmYWlsCi0KLXRlc3QwcGFzczoKLQltdmlfaF9jb25kYml0IDEKLQlibmMucyB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5lLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5lLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZDdhNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuZS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBibmUKLWJuZToKLQltdmlfaF9nciByNCwgMQotCW12aV9oX2dyIHI1LCAyCi0JYm5lIHI0LCByNSwgdGVzdDBwYXNzCi10ZXN0MWZhaWw6Ci0JZmFpbAotCi10ZXN0MHBhc3M6Ci0JbXZpX2hfZ3IgcjQsIDIKLQlibmUgcjQsIHI1LCB0ZXN0MWZhaWwKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5lei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuZXouY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEwMjg5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5lei5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJuZXogJHNyYzIsJGRpc3AxNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYm5legotYm5lejoKLQltdmlfaF9nciByNCwgMQotCWJuZXogcjQsIHRlc3QwcGFzcwotdGVzdDFmYWlsOgotCWZhaWwKLQotdGVzdDBwYXNzOgotCW12aV9oX2dyIHI0LCAwCi0JYm5leiByNCwgdGVzdDFmYWlsCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JyYTI0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhMjQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJkMmJmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhMjQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBicmEgJGRpc3AyNAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgYnJhMjQKLWJyYTI0OgotCWJyYS5sIG9rCi0KLQlmYWlsCi0KLW9rOgotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JyYTguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWY1MGFkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhOC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGJyYSAkZGlzcDgKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGJyYTgKLWJyYTg6Ci0JYnJhLnMgb2sKLQotCWZhaWwKLW9rOgotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhNjcyMC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGNtcCAkc3JjMSwkc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgY21wCi1jbXA6Ci0JbXZpX2hfY29uZGJpdCAwCi0JbXZpX2hfZ3IgcjQsIDEKLQltdmlfaF9nciByNSwgMgotCWNtcCByNCwgcjUKLQliYyBvawotbm90X29rOgotCWZhaWwKLW9rOgotCW12aV9oX2NvbmRiaXQgMQotCW12aV9oX2dyIHI0LCAyCi0JY21wIHI0LCByNQotCWJjIG5vdF9vawotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXBpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21waS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTEyODMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXBpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgY21waSAkc3JjMiwjJHNpbW0xNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgY21waQotY21waToKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMQotCi0JY21waSByNCwgIzIKLQliYyBvawotbm90X29rOgotCWZhaWwKLW9rOgotCW12aV9oX2NvbmRiaXQgMQotCW12aV9oX2dyIHI0LCAyCi0JY21waSByNCwgIzIKLQliYyBub3Rfb2sKLQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wdS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjRlZjEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1LmNncworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgY21wdSAkc3JjMSwkc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgY21wdQotY21wdToKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMQotCW12aV9oX2dyIHI1LCAtMgotCWNtcHUgcjQsIHI1Ci0JYmMgb2sKLW5vdF9vazoKLQlmYWlsCi1vazoKLQltdmlfaF9jb25kYml0IDEKLQltdmlfaF9nciByNCwgLTEKLQljbXB1IHI0LCByNQotCWJjIG5vdF9vawotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1aS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcHVpLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzMDIwNy4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcHVpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgY21wdWkgJHNyYzIsIyRzaW1tMTYKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGNtcHVpCi1jbXB1aToKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMQotCWNtcHVpIHI0LCAjMgotCWJjIG9rCi1ub3Rfb2s6Ci0JZmFpbAotb2s6Ci0JbXZpX2hfY29uZGJpdCAxCi0JbXZpX2hfZ3IgcjQsIC0xCi0JY21wdWkgcjQsICMyCi0JYmMgbm90X29rCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2Rpdi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2Rpdi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2YzNjIuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9kaXYuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBkaXYgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgZGl2Ci1kaXY6Ci0JbXZpX2hfZ3IgcjQsIDB4MTgwMDAKLQltdmlfaF9nciByNSwgOAotCi0JZGl2IHI0LCByNQotCi0JdGVzdF9oX2dyIHI0LCAweDMwMDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvZGl2dS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2RpdnUuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTM0MmQ1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvZGl2dS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGRpdnUgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgZGl2dQotZGl2dToKLQltdmlfaF9nciByNCwgMHgxODAwMAotCW12aV9oX2dyIHI1LCA4Ci0KLQlkaXZ1IHI0LCByNQotCi0JdGVzdF9oX2dyIHI0LCAweDMwMDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvaGVsbG8ubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2hlbGxvLm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUyMjc3Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvaGVsbG8ubXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIG91dHB1dCgpOiBIZWxsbyB3b3JsZCFcbgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5nbG9ibCBfc3RhcnQKLV9zdGFydDoKLQotOyB3cml0ZSAoaGVsbG8gd29ybGQpCi0JbGRpOCByMywjMTQKLQlsZDI0IHIyLCNoZWxsbwotCWxkaTggcjEsIzEKLQlsZGk4IHIwLCM1Ci0JdHJhcCAjMAotOyBleGl0ICgwKQotCWxkaTggcjEsIzAKLQlsZGk4IHIwLCMxCi0JdHJhcCAjMAotCi1sZW5ndGg6CS5sb25nIDE0Ci1oZWxsbzoJLmFzY2lpICJIZWxsbyB3b3JsZCFcclxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ody10cmFwLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ody10cmFwLm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWEyMDBiLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvaHctdHJhcC5tcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0jIG91dHB1dCgpOiBwYXNzXG4KLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotOyBjb25zdHJ1Y3QgYnJhIHRyYXAyX2hhbmRsZXIgaW4gdHJhcCAyIHNsb3QKLQlsZDI0IHIwLCNicmFfaW5zbgotCWxkIHIwLEByMAotCWxkMjQgcjEsI3RyYXAyX2hhbmRsZXIKLQlhZGRpIHIxLCMtMHg0OCA7IHBjIHJlbGF0aXZlIGFkZHJlc3MgZnJvbSB0cmFwIDIgc2xvdCB0byBoYW5kbGVyCi0Jc3JhaSByMSwjMgotCW9yIHIwLHIxCi0JbGQyNCByMiwjMHg0OCA7IGFkZHJlc3Mgb2YgdHJhcCAyIHNsb3QKLQlzdCByMCxAcjIKLQotOyBwZXJmb3JtIHRyYXAKLQlsZGkgcjQsIzAKLQl0cmFwICMyCi0JdGVzdF9oX2dyIHI0LDQyCi0KLQlwYXNzCi0KLTsgdHJhcCAyIGhhbmRsZXIKLXRyYXAyX2hhbmRsZXI6Ci0JbGRpIHI0LCM0MgotCXJ0ZQotCi1icmFfaW5zbjoKLQlicmEubCAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2psLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvamwuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODljMjZhLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvamwuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBqbCAkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGpsCi1qbDoKLQltdmFkZHJfaF9nciByNCwgb2sKLQlqbCAgIHI0Ci1ub3Rfb2s6Ci0JZmFpbAotb2s6Ci0JbXZhZGRyX2hfZ3IgcjQsIG5vdF9vawotCWJuZSAgcjQsIHIxNCwgbm90X29rCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2ptcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2ptcC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDg2NGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9qbXAuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBqbXAgJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBqbXAKLWptcDoKLQltdmFkZHJfaF9nciByNCwgb2sxCi0Jam1wICByNAotCWZhaWwKLW9rMToKLQltdmFkZHJfaF9nciByNCwgb2syCi0JYWRkaSByNCwjMQotCWptcCByNAotCWZhaWwKLW9rMjoKLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLWQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC1kLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxNzQzNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLWQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZCAkZHIsQCgkc2xvMTYsJHNyKQotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbGRfZAotbGRfZDoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMAotCi0JbGQgcjUsIEAoIzQsIHI0KQotCi0JdGVzdF9oX2dyIHI1LCAweDEyMzQ1Njc4IAotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAweDExMjIzMzQ0Ci0JLndvcmQgMHgxMjM0NTY3OAotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLXBsdXMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC1wbHVzLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlYWY2Mi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLXBsdXMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZCAkZHIsQCRzcisKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkX3BsdXMKLWxkX3BsdXM6Ci0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCi0JbXZpX2hfZ3IgICAgcjUsIDAKLQotCWxkIHI1LCBAcjQrCi0KLQl0ZXN0X2hfZ3IgcjUsIDB4MTIzNDU2NzgKLQotCW12YWRkcl9oX2dyIHI1LCBkYXRhX2xvYzIKLQlibmUgcjQsIHI1LCBub3Rfb2sKLQotCXBhc3MKLW5vdF9vazoKLQlmYWlsCi0KLWRhdGFfbG9jOgotCS53b3JkIDB4MTIzNDU2NzgKLWRhdGFfbG9jMjoKLQkud29yZCAweDExMjIzMzQ0Ci0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGI4NmYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxkICRkcixAJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBsZAotbGQ6Ci0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCi0JbXZpX2hfZ3IgICAgcjUsIDAKLQotCWxkIHI1LCBAcjQKLQotCXRlc3RfaF9nciByNSwgMHgxMjM0NTY3OAotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAweDEyMzQ1Njc4Ci0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQyNC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkMjQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIxNTU1Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQyNC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxkMjQgJGRyLCMkdWltbTI0Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBsZDI0Ci1sZDI0OgotCWxkMjQgcjQsICMweDEyMzQ1NgotCi0JdGVzdF9oX2dyIHI0LCAweDEyMzQ1NgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGItZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi1kLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExY2ViYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi1kLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbGRiICRkcixAKCRzbG8xNiwkc3IpCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBsZGJfZAotbGRiX2Q6Ci0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCi0JbXZpX2hfZ3IgICAgcjUsIDAKLQotCWxkYiByNSwgQCgjMiwgcjQpCi0KLQl0ZXN0X2hfZ3IgcjUsIDB4NTYgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAweDEyMzQ1Njc4CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODk1NDUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZGIgJGRyLEAkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkYgotbGRiOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAwCi0KLQlsZGIgcjUsIEByNAotCi0JdGVzdF9oX2dyIHI1LCAweDEyIDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLQotCXBhc3MKLQotZGF0YV9sb2M6Ci0JLndvcmQgMHgxMjM0NTY3OAotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaC1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRoLWQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmUwMzA5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRoLWQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZGggJGRyLEAoJHNsbzE2LCRzcikKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkaF9kCi1sZGhfZDoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMAotCi0JbGRoIHI1LCBAKCMyLCByNCkKLQotCXRlc3RfaF9nciByNSwgMHg1Njc4IDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLQotCXBhc3MKLQotZGF0YV9sb2M6Ci0JLndvcmQgMHgxMjM0NTY3OAotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGRiOTUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGguY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZGggJGRyLEAkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkaAotbGRoOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAwCi0KLQlsZGggcjUsIEByNAotCi0JdGVzdF9oX2dyIHI1LCAweDEyMzQgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAweDEyMzQ1Njc4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaTE2LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRpMTYuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzhkZjFjLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRpMTYuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBsZGkgJGRyLCRzbG8xNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbGRpMTYKLWxkaTE2OgotCWxkaSByNCwgIzB4MTIzNAotCi0JdGVzdF9oX2dyIHI0LCAweDEyMzQKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRpOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaTguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFlN2E4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRpOC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxkaSAkZHIsIyRzaW1tOAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbGRpOAotbGRpODoKLQlsZGkgcjQsICMweDc4Ci0KLQl0ZXN0X2hfZ3IgcjQsIDB4NzgKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1Yi1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1Yi1kLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MTA3MS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWItZC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkdWJfZAotbGR1Yl9kOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAwCi0KLQlsZHViIHI1LCBAKCMyLCByNCkKLQotCXRlc3RfaF9nciByNSwgMHhhMCA7IGJpZyBlbmRpYW4gcHJvY2Vzc29yCi0KLQlwYXNzCi0KLWRhdGFfbG9jOgotCS53b3JkIDB4ODA5MGEwYjAKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHViLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1Yi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTEzYjUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHViLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbGR1YiAkZHIsQCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbGR1YgotbGR1YjoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMAotCi0JbGR1YiByNSwgQHI0Ci0KLQl0ZXN0X2hfZ3IgcjUsIDB4ODAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAweDgwMDAwMGYwCi0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1aC1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1aC1kLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlMjk0Zi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWgtZC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxkdWggJGRyLEAoJHNsbzE2LCRzcikKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxkdWhfZAotbGR1aF9kOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAwCi0KLQlsZHVoIHI1LCBAKCMyLCByNCkKLQotCXRlc3RfaF9nciByNSwgMHhmMDAwIDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLQotCXBhc3MKLQotZGF0YV9sb2M6Ci0JLndvcmQgMHg4MDAwZjAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHVoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1aC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwM2JiZWUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHVoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbGR1aCAkZHIsQCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbGR1aAotbGR1aDoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMAotCi0JbGR1aCByNSwgQHI0Ci0KLQl0ZXN0X2hfZ3IgcjUsIDB4ODAxMCA7IGJpZyBlbmRpYW4gcHJvY2Vzc29yCi0KLQlwYXNzCi0KLWRhdGFfbG9jOgotCS53b3JkIDB4ODAxMGYwMjAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbG9jay5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xvY2suY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE1MjVlLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbG9jay5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIGxvY2sgJGRyLEAkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIGxvY2sKLWxvY2s6Ci0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCi0JbXZpX2hfZ3IgICAgcjUsIDAKLQotCWxvY2sgcjUsIEByNAotCi0JdGVzdF9oX2dyIHI1LCAweDEyMzQ1Njc4Ci0KLQk7IFRoZXJlIGlzIG5vIHdheSB0byB0ZXN0IHRoZSBsb2NrIGJpdAotCi0JdW5sb2NrIHI1LCBAcjQgCTsgVW5sb2NrIHRoZSBwcm9jZXNzb3IKLQotCXBhc3MKLQotZGF0YV9sb2M6Ci0JLndvcmQgMHgxMjM0NTY3OAotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21hY2hpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjaGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTJlZjAwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjaGkuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtYWNoaSAkc3JjMSwkc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbWFjaGkKLW1hY2hpOgotCi0JbXZpX2hfYWNjdW0wIDAsIDEKLQltdmlfaF9nciByNCwgMHgxMDEyMwotCW12aV9oX2dyIHI1LCAweDIwNDU2Ci0JbWFjaGkgcjQsIHI1Ci0JdGVzdF9oX2FjY3VtMCAwLCAweDIwMDAxCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21hY2xvLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjbG8uY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDAzNTM5Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjbG8uY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtYWNsbyAkc3JjMSwkc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbWFjbG8KLW1hY2xvOgotCi0JbXZpX2hfYWNjdW0wIDAsIDEKLQltdmlfaF9nciByNCwgMHgxMjMwMDAxCi0JbXZpX2hfZ3IgcjUsIDB4NDU2MDAwMgotCW1hY2xvIHI0LCByNQotCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDAwMQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3aGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3aGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3YTViLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjd2hpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbWFjd2hpICRzcmMxLCRzcmMyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtYWN3aGkKLW1hY3doaToKLQltdmlfaF9hY2N1bTAgMCwgMQotCW12aV9oX2dyIHI0LCAweDEwMTIzCi0JbXZpX2hfZ3IgcjUsIDB4MjA0NTYKLQotCW1hY3doaSByNCwgcjUKLQotCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3bG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3bG8uY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NlNGVkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjd2xvLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbWFjd2xvICRzcmMxLCRzcmMyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtYWN3bG8KLW1hY3dsbzoKLQltdmlfaF9hY2N1bTAgMCwgMQotCW12aV9oX2dyIHI0LCAweDEwMTIzCi0JbXZpX2hfZ3IgcjUsIDB4NDAwMDIKLQotCW1hY3dsbyByNCwgcjUKLQotCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9taXNjLmV4cCBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWlzYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDU2MzguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9taXNjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgTWlzY2VsbGFuZW91cyBNMzJSIHNpbXVsYXRvciB0ZXN0Y2FzZXMKLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgICMgbG9hZCBzdXBwb3J0IHByb2NzCi0gICAgIyBsb2FkX2xpYiBjZ2VuLmV4cAotCi0gICAgIyBhbGwgbWFjaGluZXMKLSAgICBzZXQgYWxsX21hY2hzICJtMzJyIgotCi0KLSAgICAjIFRoZSAubXMgc3VmZml4IGlzIGZvciAibWlzY2VsbGFuZW91cyAucyIuCi0gICAgZm9yZWFjaCBzcmMgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLm1zXV0gewotCSMgSWYgd2UncmUgb25seSB0ZXN0aW5nIHNwZWNpZmljIGZpbGVzIGFuZCB0aGlzIGlzbid0IG9uZSBvZiB0aGVtLAotCSMgc2tpcCBpdC4KLQlpZiAhW3J1bnRlc3RfZmlsZV9wICRydW50ZXN0cyAkc3JjXSB7Ci0JICAgIGNvbnRpbnVlCi0JfQotCi0JcnVuX3NpbV90ZXN0ICRzcmMgJGFsbF9tYWNocwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4ZjI0Yi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIG11bCAkZHIsJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtdWwKLW11bDoKLQltdmlfaF9nciByNCwgMwotCW12aV9oX2dyIHI1LCA3Ci0KLQltdWwgcjUsIHI0Ci0KLQl0ZXN0X2hfZ3IgcjUsIDIxCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bGhpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsaGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MxMDNkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsaGkuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtdWxoaSAkc3JjMSwkc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbXVsaGkKLW11bGhpOgotCi0JbXZpX2hfZ3IgcjQsIDB4NDAwMDAKLQltdmlfaF9nciByNSwgMHg1MDAwMAotCW11bGhpIHI0LCByNQotCXRlc3RfaF9hY2N1bTAgMCwgMHgxNDAwMDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsbG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWxsby5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWFkZmYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWxsby5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIG11bGxvICRzcmMxLCRzcmMyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtdWxsbwotbXVsbG86Ci0KLQltdmlfaF9nciByNCwgNAotCW12aV9oX2dyIHI1LCA1Ci0JbXVsbG8gcjQsIHI1Ci0JdGVzdF9oX2FjY3VtMCAwLCAweDE0MDAwMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3aGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3aGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE4NTYyLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsd2hpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbXVsd2hpICRzcmMxLCRzcmMyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtdWx3aGkKLW11bHdoaToKLQltdmlfaF9hY2N1bTAgMCwgMQotCW12aV9oX2dyIHI0LCAweDEwMTIzCi0JbXZpX2hfZ3IgcjUsIDB4MjA0NTYKLQotCW11bHdoaSByNCwgcjUKLQotCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3bG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3bG8uY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJjMjY4Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsd2xvLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbXVsd2xvICRzcmMxLCRzcmMyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtdWx3bG8KLW11bHdsbzoKLQltdmlfaF9hY2N1bTAgMCwgMQotCW12aV9oX2dyIHI0LCAweDEwMTIzCi0JbXZpX2hfZ3IgcjUsIDB4NDAwMDIKLQotCW11bHdsbyByNCwgcjUKLQotCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212LmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NTY5NS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212LmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbXYgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbXYKLW12OgotCW12aV9oX2dyIHI0LCAxCi0JbXZpX2hfZ3IgcjUsIDAKLQotCW12IHI1LCByNAotCi0JdGVzdF9oX2dyIHI1LCAxCi0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjaGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY2hpLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMmUxYi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjaGkuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtdmZhY2hpICRkcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbXZmYWNoaQotbXZmYWNoaToKLQltdmlfaF9hY2N1bTAgMHgxMTIyMzM0NCwgMHg1NTY2Nzc4OAotCW12aV9oX2dyIHI0LCAwCi0KLQltdmZhY2hpIHI0Ci0JdGVzdF9oX2dyIHI0LCAweDIyMzM0NAotCi0JbXZpX2hfYWNjdW0wIDB4OTlhYWJiY2MsIDB4NTU2Njc3ODgKLQltdmlfaF9nciByNCwgMAotCi0JbXZmYWNoaSByNAotCXRlc3RfaF9nciByNCwgMHhmZmFhYmJjYwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY2xvLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNsby5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODhkODQuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY2xvLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbXZmYWNsbyAkZHIKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIG12ZmFjbG8KLW12ZmFjbG86Ci0JbXZpX2hfYWNjdW0wIDB4MTEyMjMzNDQsIDB4NTU2Njc3ODgKLQltdmlfaF9nciByNCwgMAotCi0JbXZmYWNsbyByNAotCi0JdGVzdF9oX2dyIHI0LCAweDU1NjY3Nzg4Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjbWkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY21pLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwYmNhZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjbWkuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtdmZhY21pICRkcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbXZmYWNtaQotbXZmYWNtaToKLQotCW12aV9oX2FjY3VtMCAweDEyMzQ1Njc4LCAweDg3NjU0MzIxCi0JbXZmYWNtaSByNAotCXRlc3RfaF9nciByNCwgMHg1Njc4ODc2NQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZjLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjQ3MGUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZjLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbXZmYyAkZHIsJHNjcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbXZmYwotbXZmYzoKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMQotCi0JbXZmYyByNCwgY3IxCi0KLQl0ZXN0X2hfZ3IgcjQsIDAKLQotCW12aV9oX2NvbmRiaXQgMQotCi0JbXZmYyByNCwgY3IxCi0KLQl0ZXN0X2hfZ3IgcjQsIDEKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNoaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGFjaGkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU5NjE2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNoaS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIG12dGFjaGkgJHNyYzEKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIG12dGFjaGkKLW12dGFjaGk6Ci0JbXZpX2hfYWNjdW0wIDAsIDAKLQotCW12aV9oX2dyIHI0LCAweDExMjIzMzQ0Ci0JbXZ0YWNoaSByNAotCXRlc3RfaF9hY2N1bTAgMHgyMjMzNDQsIDB4MAotCi0JbXZpX2hfZ3IgcjQsIDB4OTlhYWJiY2MKLQltdnRhY2hpIHI0Ci0JdGVzdF9oX2FjY3VtMCAweGZmYWFiYmNjLCAweDAKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNsby5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGFjbG8uY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFmZDgzLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNsby5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIG12dGFjbG8gJHNyYzEKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIG12dGFjbG8KLW12dGFjbG86Ci0JbXZpX2hfYWNjdW0wIDAsIDAKLQltdmlfaF9nciByNCwgMHgxMTIyMzM0NAotCi0JbXZ0YWNsbyByNAotCi0JdGVzdF9oX2FjY3VtMCAwLCAweDExMjIzMzQ0Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdnRjLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3ODBkZi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBtdnRjICRzciwkZGNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBtdnRjCi1tdnRjOgotCW12aV9oX2NvbmRiaXQgMAotCW12aV9oX2dyIHI0LCAxCi0KLQltdnRjIHI0LCBjcjEKLQliYyBvawotCi0JZmFpbAotb2s6Ci0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9uZWcuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9uZWcuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDUxZWZhLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbmVnLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgbmVnICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIG5lZwotbmVnOgotCW12aV9oX2dyIHI0LCAxCi0JbXZpX2hfZ3IgcjUsIDIKLQotCW5lZyByNCwgcjUKLQotCXRlc3RfaF9nciByNCwgLTIKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbm9wLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbm9wLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ZDY1Ni4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL25vcC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIG5vcAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgbm9wCi1ub3A6Ci0Jbm9wCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ub3QuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ub3QuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNlYjY0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbm90LmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igbm90ICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIG5vdAotbm90OgotCW12aV9oX2dyIHI0LCAxCi0JbXZpX2hfZ3IgcjUsIDIKLQotCW5vdCByNCwgcjUKLQotCXRlc3RfaF9nciByNCwgMHhmZmZmZmZmZAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9vci5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL29yLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwOGJkMC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL29yLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igb3IgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgb3IKLW9yOgotCW12aV9oX2dyIHI0LCAzCi0JbXZpX2hfZ3IgcjUsIDYKLQotCW9yIHI0LCByNQotCi0JdGVzdF9oX2dyIHI0LCA3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL29yMy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL29yMy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzZhZGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9vcjMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBvcjMgJGRyLCRzciwjJHVsbzE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBvcjMKLW9yMzoKLQltdmlfaF9nciByNCwgMAotCW12aV9oX2dyIHI1LCA2Ci0KLQlvcjMgcjQsIHI1LCAjMwotCi0JdGVzdF9oX2dyIHI0LCA3Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JhYy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JhYy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjlhZTMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciByYWMKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHJhYwotcmFjOgotCi0JbXZpX2hfYWNjdW0wIDEsIDB4NDAwMQotCXJhYwotCXRlc3RfaF9hY2N1bTAgMiwgMHgxMDAwMAotCi0JbXZpX2hfYWNjdW0wIDB4M2ZmZiwgMHhmZmZmNDAwMAotCXJhYwotCXRlc3RfaF9hY2N1bTAgMHg3ZmZmLCAweGZmZmYwMDAwCi0KLQltdmlfaF9hY2N1bTAgMHhmZmZmODAwMCwgMAotCXJhYwotCXRlc3RfaF9hY2N1bTAgMHhmZmZmODAwMCwgMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWNoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmFjaC5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjQ2OTguLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWNoLmNncworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgcmFjaAotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgcmFjaAotcmFjaDoKLQltdmlfaF9hY2N1bTAgMSwgMHg0MDAwNDAwMQotCXJhY2gKLQl0ZXN0X2hfYWNjdW0wIDMsIDAKLQotCW12aV9oX2FjY3VtMCAweDNmZmYsIDB4YzAwMDAwMDAKLQlyYWNoCi0JdGVzdF9oX2FjY3VtMCAweDdmZmYsIDAKLQotCW12aV9oX2FjY3VtMCAweGZmZmY4MDAwLCAwCi0JcmFjaAotCXRlc3RfaF9hY2N1bTAgMHhmZmZmODAwMCwgMAotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yZW0uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yZW0uY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGMxMWNiLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmVtLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgcmVtICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHJlbQotcmVtOgotCW12aV9oX2dyIHI0LCAxMjM0NTY3OAotCW12aV9oX2dyIHI1LCA3Ci0KLQlyZW0gcjQsIHI1Ci0KLQl0ZXN0X2hfZ3IgcjQsIDIKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmVtdS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JlbXUuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjMzNjMwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmVtdS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHJlbXUgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgcmVtdQotcmVtdToKLQltdmlfaF9nciByNCwgMTcKLQltdmlfaF9nciByNSwgNwotCi0JcmVtdSByNCwgcjUKLQotCXRlc3RfaF9nciByNCwgMwotCi0JbXZpX2hfZ3IgcjQsIC0xNwotCi0JcmVtdSByNCwgcjUKLQotCXRlc3RfaF9nciByNCwgMQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ydGUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ydGUuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzg5ZmUxLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcnRlLmNncworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgcnRlCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBydGUKLXJ0ZToKLQotOyBUZXN0IDE6IGJicHN3ID0gMCwgYnBzdyA9IDEsIHBzdyA9IDAKLQotCTsgYmJzbSA9IDAsIGJpZSA9IDAsIGJiY29uZCA9IDAKLQltdmlfaF9nciByNCwgMAotCW12dGMgcjQsIGNyOAotCi0JOyBic20gPSAxLCBiaWUgPSAxLCBiY29uZCA9IDEsIHNtID0gMCwgaWUgPSAwLCBjb25kID0gMAotCW12aV9oX2dyIHI0LCAweGMxMDAKLQltdnRjIHI0LCBjcjAKLQotCTsgYmJwYyA9IDAKLQltdmFkZHJfaF9nciByNCwgMAotCW12dGMgcjQsIGJicGMKLQotCTsgYnBjID0gcmV0MQotCW12YWRkcl9oX2dyIHI0LCByZXQxCi0JbXZ0YyByNCwgYnBjCi0KLQlydGUKLQlmYWlsCi0KLXJldDE6Ci0JOyB0ZXN0IGJic20gPSAwLCBiYmllID0gMCwgYmJjb25kID0gMAotCW12ZmMgcjQsIGNyOAotCXRlc3RfaF9nciByNCwgMAotCi0JOyB0ZXN0IGJzbSA9IDAsIGJpZSA9IDAsIGJjb25kID0gMCwgc20gPSAxLCBpZSA9IDEsIGNvbmQgPSAxCi0JbXZmYyByNCwgY3IwCi0JdGVzdF9oX2dyIHI0LCAweGMxCi0KLQk7IHRlc3QgYmJwYyA9IDAKLQltdmZjIHI0LCBiYnBjCi0JdGVzdF9oX2dyIHI0LCAwCi0KLQk7IHRlc3QgYnBjID0gMAotCW12ZmMgcjQsIGJwYwotCXRlc3RfaF9nciByNCwgMAotCi07IFRlc3QgMjogYmJwc3cgPSAxLCBicHN3ID0gMCwgcHN3ID0gMQotCi0JOyBiYnNtID0gMSwgYmllID0gMSwgYmJjb25kID0gMQotCW12aV9oX2dyIHI0LCAweGMxCi0JbXZ0YyByNCwgY3I4Ci0KLQk7IGJzbSA9IDAsIGJpZSA9IDAsIGJjb25kID0gMCwgc20gPSAxLCBpZSA9IDEsIGNvbmQgPSAxCi0JbXZpX2hfZ3IgcjQsIDB4YzEKLQltdnRjIHI0LCBjcjAKLQotCTsgYmJwYyA9IDQyCi0JbXZhZGRyX2hfZ3IgcjQsIDQyCi0JbXZ0YyByNCwgYmJwYwotCi0JOyBicGMgPSByZXQyICsgMgotCW12YWRkcl9oX2dyIHI0LCByZXQyICsgMgotCW12dGMgcjQsIGJwYwotCi0JcnRlCi0JZmFpbAotCi1yZXQyOgotCTsgdGVzdCBiYnNtID0gMSwgYmJpZSA9IDEsIGJiY29uZCA9IDEKLQltdmZjIHI0LCBjcjgKLQl0ZXN0X2hfZ3IgcjQsIDB4YzEKLQotCTsgdGVzdCBic20gPSAxLCBiaWUgPSAxLCBiY29uZCA9IDEsIHNtID0gMCwgaWUgPSAwLCBjb25kID0gMAotCW12ZmMgcjQsIGNyMAotCXRlc3RfaF9nciByNCwgMHhjMTAwCi0KLQk7IHRlc3QgYmJwYyA9IDQyCi0JbXZmYyByNCwgYmJwYwotCXRlc3RfaF9nciByNCwgNDIKLQotCTsgdGVzdCBicGMgPSA0MgotCW12ZmMgcjQsIGJwYwotCXRlc3RfaF9nciByNCwgNDIKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2V0aC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NldGguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWMzMjMwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2V0aC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHNldGggJGRyLCMkaGkxNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc2V0aAotc2V0aDoKLQlzZXRoICAgICAgcjQsICMweDEyMzQKLQotCTsgZG8gbm90IHVzZSB0ZXN0X2hfZ3IgbWFjcm8gc2luY2UgdGhpcyB1c2VzIHNldGgKLQotCXNybGkgICAgICByNCwgIzE2Ci0JbGQyNAkgIHI1LCAjMHgxMjM0Ci0JYmVxICAgICAgIHI0LCByNSwgb2sKLQotCWZhaWwKLW9rOgotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzY2ZlZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NsbC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHNsbCAkZHIsJHNyCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBzbGwKLXNsbDoKLQltdmlfaF9nciAgcjQsIDYKLQltdmlfaF9nciAgcjUsIDEKLQlzbGwgICAgICAgcjQsIHI1Ci0JdGVzdF9oX2dyIHI0LCAxMgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGwzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsMy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDM2MGMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGwzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc2xsMyAkZHIsJHNyLCMkc2ltbTE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBzbGwzCi1zbGwzOgotCW12aV9oX2dyICByNCwgMQotCW12aV9oX2dyICByNSwgNgotCXNsbDMgICAgICByNCwgcjUsICMxCi0JdGVzdF9oX2dyIHI0LCAxMgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGxpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsaS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjc3ZGEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGxpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc2xsaSAkZHIsIyR1aW1tNQotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc2xsaQotc2xsaToKLQltdmlfaF9nciAgcjQsIDYKLQlzbGxpICAgICAgcjQsICMxCi0JdGVzdF9oX2dyIHI0LCAxMgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY3MWVkLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JhICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHNyYQotc3JhOgotCi0JbXZpX2hfZ3IgIHI0LCAweGYwZjBmMGZmCi0JbXZpX2hfZ3IgIHI1LCA0Ci0Jc3JhICAgICAgIHI0LCByNQotCXRlc3RfaF9nciByNCwgMHhmZjBmMGYwZgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhMy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDM4N2EuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JhMyAkZHIsJHNyLCMkc2ltbTE2Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBzcmEzCi1zcmEzOgotCi0JbXZpX2hfZ3IgIHI0LCAwCi0JbXZpX2hfZ3IgIHI1LCAweGYwZjBmMGZmCi0Jc3JhMyAgICAgIHI0LCByNSwgIzQKLQl0ZXN0X2hfZ3IgcjQsIDB4ZmYwZjBmMGYKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NyYWkuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE1Njk0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhaS5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHNyYWkgJGRyLCMkdWltbTUKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHNyYWkKLXNyYWk6Ci0JbXZpX2hfZ3IgIHI1LCAweGYwZjBmMGZmCi0Jc3JhaSAgICAgIHI1LCAjNAotCXRlc3RfaF9nciByNSwgMHhmZjBmMGYwZgotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmwuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmwuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4YzJmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JsICRkciwkc3IKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHNybAotc3JsOgotCW12aV9oX2dyICByNCwgNgotCW12aV9oX2dyICByNSwgMQotCXNybCAgICAgICByNCwgcjUKLQl0ZXN0X2hfZ3IgcjQsIDMKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsMy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NybDMuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWRjNDg0Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsMy5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHNybDMgJGRyLCRzciwjJHNpbW0xNgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3JsMwotc3JsMzoKLQltdmlfaF9nciAgcjQsIDAKLQltdmlfaF9nciAgcjUsIDYKLQlzcmwzICAgICAgcjQsIHI1LCAjMQotCXRlc3RfaF9nciByNCwgMwotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmxpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsaS5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNThhNzYuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmxpLmNncworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JsaSAkZHIsIyR1aW1tNQotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3JsaQotc3JsaToKLQltdmlfaF9nciAgcjUsIDYKLQlzcmxpICAgICAgcjUsICMxCi0JdGVzdF9oX2dyIHI1LCAzCi0KLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3QtZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LWQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY2OGEwLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3QtZC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKQotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3RfZAotc3RfZDoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMQotCi0Jc3QgcjUsIEAoIzgscjQpCi0KLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MyCi0JbGQgcjQsIEByNAotCXRlc3RfaF9nciByNCwgMQotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAwCi0JLndvcmQgMAotZGF0YV9sb2MyOgotCS53b3JkIDAKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1taW51cy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LW1pbnVzLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5MDM1MS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LW1pbnVzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3QgJHNyYzEsQC0kc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3RfbWludXMKLXN0X21pbnVzOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYzIKLQltdmlfaF9nciAgICByNSwgMQotCi0Jc3QgcjUsIEAtcjQKLQotCW12YWRkcl9oX2dyIHI1LCBkYXRhX2xvYwotCi0JYm5lIHI0LCByNSwgbm90X29rCi0JbGQgcjQsIEByNAotCXRlc3RfaF9nciByNCwgMQotCi0JcGFzcwotbm90X29rOgotCWZhaWwKLQotZGF0YV9sb2M6Ci0JLndvcmQgMAotZGF0YV9sb2MyOgotCS53b3JkIDAKLQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1wbHVzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3QtcGx1cy5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjRkZDEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1wbHVzLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3QgJHNyYzEsQCskc3JjMgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3RfcGx1cwotc3RfcGx1czoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMQotCi0Jc3QgcjUsIEArcjQKLQotCW12YWRkcl9oX2dyIHI1LCBkYXRhX2xvYzIKLQotCWJuZSByNCwgcjUsIG5vdF9vawotCWxkIHI0LCBAcjQKLQl0ZXN0X2hfZ3IgcjQsIDEKLQotCXBhc3MKLW5vdF9vazoKLQlmYWlsCi0KLWRhdGFfbG9jOgotCS53b3JkIDAKLWRhdGFfbG9jMjoKLQkud29yZCAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3QuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg4YjhjLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3QuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBzdCAkc3JjMSxAJHNyYzIKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHN0Ci1zdDoKLQltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKLQltdmlfaF9nciAgICByNSwgMQotCi0Jc3QgcjUsIEByNAotCi0JbGQgcjQsIEByNAotCXRlc3RfaF9nciByNCwgMQotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0Yi1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RiLWQuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MyZDczLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RiLWQuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpCi0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCBzdGJfZAotc3RiX2Q6Ci0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCi0JbXZpX2hfZ3IgICAgcjUsIDB4MTIzNAotCi0Jc3RiIHI1LCBAKCM4LHI0KQotCi0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jMgotCWxkIHI0LCBAcjQKLQl0ZXN0X2hfZ3IgcjQsIDB4MzQwMDAwMDAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAwCi0JLndvcmQgMAotZGF0YV9sb2MyOgotCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RiLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyODMxNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0Yi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHN0YiAkc3JjMSxAJHNyYzIKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHN0Ygotc3RiOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAweDEyMzQKLQotCXN0YiByNSwgQHI0Ci0KLQlsZCByNCwgQHI0Ci0JdGVzdF9oX2dyIHI0LCAweDM0MDAwMDAwIDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLQotCXBhc3MKLQotZGF0YV9sb2M6Ci0JLndvcmQgMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdGgtZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0aC1kLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhYWE2ZC4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0aC1kLmNncworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3Igc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKQotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3RoX2QKLXN0aF9kOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAweDEyMzQ1NgotCi0Jc3RoIHI1LCBAKCM4LHI0KQotCi0JbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jMgotCWxkIHI0LCBAcjQKLQl0ZXN0X2hfZ3IgcjQsIDB4MzQ1NjAwMDAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAwCi0JLndvcmQgMAotZGF0YV9sb2MyOgotCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMGZkZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0aC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHN0aCAkc3JjMSxAJHNyYzIKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHN0aAotc3RoOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAweDEyMzQ1NgotCi0Jc3RoIHI1LCBAcjQKLQotCWxkIHI0LCBAcjQKLQl0ZXN0X2hfZ3IgcjQsIDB4MzQ1NjAwMDAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgotCi0JcGFzcwotCi1kYXRhX2xvYzoKLQkud29yZCAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1Yi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1Yi5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjc2ZTUuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdWIuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciBzdWIgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3ViCi1zdWI6Ci0KLQltdmlfaF9nciByNCwgNwotCW12aV9oX2dyIHI1LCAzCi0KLQlzdWIgcjQsIHI1Ci0KLQl0ZXN0X2hfZ3IgcjQsIDQKLQotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3Vidi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1YnYuY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc0NzY2Li4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3Vidi5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHN1YnYgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3Vidgotc3VidjoKLQltdmlfaF9jb25kYml0IDAKLQltdmlfaF9nciByNCwgMHg4MDAwMDAwMAotCW12aV9oX2dyIHI1LCAzCi0KLQlzdWJ2IHI0LCByNQotCi0JYmMgb2sKLQotCWZhaWwKLW9rOgotCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3VieC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1YnguY2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkwZmNmLi4wMDAwMDAwCi0tLSBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3VieC5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHN1YnggJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgc3VieAotc3VieDoKLQltdmlfaF9jb25kYml0IDEKLQltdmlfaF9nciByNCwgNgotCW12aV9oX2dyIHI1LCA0Ci0Jc3VieCByNCwgcjUKLQliYyBub3Rfb2sKLQl0ZXN0X2hfZ3IgcjQsIDEKLQotCW12aV9oX2NvbmRiaXQgMQotCW12aV9oX2dyIHI0LCA0Ci0JbXZpX2hfZ3IgcjUsIDQKLQlzdWJ4IHI0LCByNQotCWJuYyBub3Rfb2sKLQl0ZXN0X2hfZ3IgcjQsIDB4ZmZmZmZmZmYKLQotCXBhc3MKLW5vdF9vazoKLQlmYWlsCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3Rlc3R1dGlscy5pbmMgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3Rlc3R1dGlscy5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODgyMmEuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci90ZXN0dXRpbHMuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotIyByMC1yMyBhcmUgdXNlZCBhcyB0bXBzLCBjb25zaWRlciB0aGVtIGNhbGwgY2xvYmJlcmVkIGJ5IHRoZXNlIG1hY3Jvcy4KLQotCS5tYWNybyBzdGFydAotCS5kYXRhCi1mYWlsbXNnOgotCS5hc2NpaSAiZmFpbFxuIgotcGFzc21zZzoKLQkuYXNjaWkgInBhc3NcbiIKLQkudGV4dAotCS5nbG9iYWwgX3N0YXJ0Ci1fc3RhcnQ6Ci0JLmVuZG0KLQotCS5tYWNybyBleGl0IHJjCi0JbGRpOCByMSwgXHJjCi0JbGRpOCByMCwgIzEKLQl0cmFwICMwCi0JLmVuZG0KLQotCS5tYWNybyBwYXNzCi0JbGRpOCByMywgNQotCWxkMjQgcjIsIHBhc3Ntc2cKLQlsZGk4IHIxLCAxCi0JbGRpOCByMCwgNQotCXRyYXAgIzAKLQlleGl0IDAKLQkuZW5kbQotCi0JLm1hY3JvIGZhaWwKLQlsZGk4IHIzLCA1Ci0JbGQyNCByMiwgZmFpbG1zZwotCWxkaTggcjEsIDEKLQlsZGk4IHIwLCA1Ci0JdHJhcCAjMAotCWV4aXQgMQotCS5lbmRtCi0KLQkubWFjcm8gbXZpX2hfZ3IgcmVnLCB2YWwKLQkuaWYgKFx2YWwgPj0gLTEyOCkgJiYgKFx2YWwgPD0gMTI3KQotCWxkaTggXHJlZywgXHZhbAotCS5lbHNlCi0Jc2V0aCBccmVnLCBoaWdoKFx2YWwpCi0Jb3IzIFxyZWcsIFxyZWcsIGxvdyhcdmFsKQotCS5lbmRpZgotCS5lbmRtCi0KLQkubWFjcm8gbXZhZGRyX2hfZ3IgcmVnLCBhZGRyCi0Jc2V0aCBccmVnLCBoaWdoKFxhZGRyKQotCW9yMyBccmVnLCBccmVnLCBsb3coXGFkZHIpCi0JLmVuZG0KLQotIyBPdGhlciBtYWNyb3Mga25vdyB0aGlzIG9ubHkgY2xvYmJlcnMgcjAuCi0JLm1hY3JvIHRlc3RfaF9nciByZWcsIHZhbAotCW12YWRkcl9oX2dyIHIwLCBcdmFsCi0JYmVxIFxyZWcsIHIwLCB0ZXN0X2dyXEAKLQlmYWlsCi10ZXN0X2dyXEA6Ci0JLmVuZG0KLQotCS5tYWNybyBtdmlfaF9jb25kYml0IHZhbAotCWxkaTggcjAsIDAKLQlsZGk4IHIxLCAxCi0JLmlmIFx2YWwKLQljbXAgcjAsIHIxCi0JLmVsc2UKLQljbXAgcjEsIHIwCi0JLmVuZGlmCi0JLmVuZG0KLQotCS5tYWNybyB0ZXN0X2hfY29uZGJpdCB2YWwKLQkuaWYgXHZhbAotCWJjIHRlc3RfYzFcQAotCWZhaWwKLXRlc3RfYzFcQDoKLQkuZWxzZQotCWJuYyB0ZXN0X2MwXEAKLQlmYWlsCi10ZXN0X2MwXEA6Ci0JLmVuZGlmCi0JLmVuZG0KLQotCS5tYWNybyBtdmlfaF9hY2N1bTAgaGksIGxvCi0JbXZpX2hfZ3IgcjAsIFxoaQotCW12dGFjaGkgcjAKLQltdmlfaF9nciByMCwgXGxvCi0JbXZ0YWNsbyByMAotCS5lbmRtCi0KLQkubWFjcm8gdGVzdF9oX2FjY3VtMCBoaSwgbG8KLQltdmZhY2hpIHIxCi0JdGVzdF9oX2dyIHIxLCBcaGkKLQltdmZhY2xvIHIxCi0JdGVzdF9oX2dyIHIxLCBcbG8KLQkuZW5kbQotCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3RyYXAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci90cmFwLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllMTM2YS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3RyYXAuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgbTMyciB0ZXN0Y2FzZSBmb3IgdHJhcCAjJHVpbW00Ci0jIG1hY2goKTogbTMyciBtMzJyeAotCi0JLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCi0KLQlzdGFydAotCi0JLmdsb2JhbCB0cmFwCi10cmFwOgotCi07IFRlc3QgMTogYmJwc3cgPSAwLCBicHN3ID0gMSwgcHN3ID0gMAotCi0JOyBiYnNtID0gMCwgYmllID0gMCwgYmJjb25kID0gMAotCW12aV9oX2dyIHI0LCAwCi0JbXZ0YyByNCwgY3I4Ci0KLQk7IGJzbSA9IDEsIGJpZSA9IDEsIGJjb25kID0gMSwgc20gPSAwLCBpZSA9IDAsIGNvbmQgPSAwCi0JbXZpX2hfZ3IgcjQsIDB4YzEwMAotCW12dGMgcjQsIGNyMAotCi0JOyBiYnBjID0gMAotCW12YWRkcl9oX2dyIHI0LCAwCi0JbXZ0YyByNCwgYmJwYwotCi0JOyBicGMgPSA0MgotCW12YWRkcl9oX2dyIHI0LCA0MgotCW12dGMgcjQsIGJwYwotCi0JOyBDb3B5IHRyYXAyX2hhbmRsZXIgdG8gdHJhcCBhcmVhIG9mIG1lbW9yeS4KLQlsZDI0IHIwLCMweDQ4IDsgYWRkcmVzcyBvZiB0cmFwIDIgaGFuZGxlcgotCWxkMjQgcjEsI3RyYXAyX2hhbmRsZXIKLQlsZCByMixAcjEKLQlzdCByMixAcjAKLQk7IFNldCB1cCByZXR1cm4gYWRkcmVzcy4KLQlsZDI0IHI1LCN0cmFwMl9yZXQxCi0KLXRyYXBfaW5zbjE6Ci0JdHJhcCAjMgotCWZhaWwKLQotdHJhcDJfcmV0MToKLQk7IHRlc3QgYmJzbSA9IDEsIGJiaWUgPSAxLCBiYmNvbmQgPSAxCi0JbXZmYyByNCwgY3I4Ci0JdGVzdF9oX2dyIHI0LCAweGMxCi0KLQk7IHRlc3QgYnNtID0gMCwgYmllID0gMCwgYmNvbmQgPSAwLCBzbSA9IDAsIGllID0gMCwgY29uZCA9IDAKLQltdmZjIHI0LCBjcjAKLQl0ZXN0X2hfZ3IgcjQsIDAKLQotCTsgdGVzdCBiYnBjID0gNDIKLQltdmZjIHI0LCBiYnBjCi0JdGVzdF9oX2dyIHI0LCA0MgotCi0JOyB0ZXN0IGJwYyA9IHByb3BlciByZXR1cm4gYWRkcmVzcwotCW12ZmMgcjQsIGJwYwotCXRlc3RfaF9nciByNCwgdHJhcF9pbnNuMSArIDQKLQotOyBUZXN0IDI6IGJicHN3ID0gMSwgYnBzdyA9IDAsIHBzdyA9IDEKLQotCTsgYmJzbSA9IDEsIGJpZSA9IDEsIGJiY29uZCA9IDEKLQltdmlfaF9nciByNCwgMHhjMQotCW12dGMgcjQsIGNyOAotCi0JOyBic20gPSAwLCBiaWUgPSAwLCBiY29uZCA9IDAsIHNtID0gMSwgaWUgPSAxLCBjb25kID0gMQotCW12aV9oX2dyIHI0LCAweGMxCi0JbXZ0YyByNCwgY3IwCi0KLQk7IGJicGMgPSA0MgotCW12YWRkcl9oX2dyIHI0LCA0MgotCW12dGMgcjQsIGJicGMKLQotCTsgYnBjID0gMAotCW12YWRkcl9oX2dyIHI0LCAwCi0JbXZ0YyByNCwgYnBjCi0KLQk7IFNldCB1cCByZXR1cm4gYWRkcmVzcy4KLQlsZDI0IHI1LCN0cmFwMl9yZXQyCi0KLXRyYXBfaW5zbjI6Ci0JdHJhcCAjMgotCWZhaWwKLQotdHJhcDJfcmV0MjoKLQk7IHRlc3QgYmJzbSA9IDAsIGJiaWUgPSAwLCBiYmNvbmQgPSAwCi0JbXZmYyByNCwgY3I4Ci0JdGVzdF9oX2dyIHI0LCAwCi0KLQk7IHRlc3QgYnNtID0gMSwgYmllID0gMSwgYmNvbmQgPSAxLCBzbSA9IDEsIGllID0gMCwgY29uZCA9IDAKLQltdmZjIHI0LCBjcjAKLQl0ZXN0X2hfZ3IgcjQsIDB4YzE4MAotCi0JOyB0ZXN0IGJicGMgPSAwCi0JbXZmYyByNCwgYmJwYwotCXRlc3RfaF9nciByNCwgMAotCi0JOyB0ZXN0IGJwYyA9IHByb3BlciByZXR1cm4gYWRkcmVzcwotCW12ZmMgcjQsIGJwYwotCXRlc3RfaF9nciByNCwgdHJhcF9pbnNuMiArIDQKLQotCXBhc3MKLQotCS5kYXRhCi0KLTsgRG9uJ3QgdXNlIHJ0ZSBhcyBpdCB3aWxsIHVuZG8gdGhlIGVmZmVjdHMgb2YgdHJhcCB3ZSdyZSB0ZXN0aW5nLgotCi0JLnAyYWxpZ24gMgotdHJhcDJfaGFuZGxlcjoKLQlqbXAgcjUKLQlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdW5sb2NrLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdW5sb2NrLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1MWI3YS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VubG9jay5jZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIG0zMnIgdGVzdGNhc2UgZm9yIHVubG9jayAkc3JjMSxAJHNyYzIKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHVubG9jawotdW5sb2NrOgotCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYwotCW12aV9oX2dyICAgIHI1LCAxCi0KLQlsb2NrIHI1LCBAcjQKLQotCW12aV9oX2dyIHI1LCAyCi0JdW5sb2NrIHI1LCBAcjQKLQotCWxkIHI2LCBAcjQKLQl0ZXN0X2hfZ3IgcjYsIDIKLQotCW12aV9oX2dyIHI1LCAwCi0JdW5sb2NrIHI1LCBAcjQJOyBUaGlzIHNob3VsZCBiZSBhIG5vcCBzaW5jZSB0aGUgcHJvY2Vzc29yIHNob3VsZCBiZSB1bmxvY2tlZC4KLQotCWxkIHI2LCBAcjQKLQl0ZXN0X2hfZ3IgcjYsIDIKLQkKLQlwYXNzCi0KLWRhdGFfbG9jOgotCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXJlYWQxNi5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXJlYWQxNi5tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwZTk5YS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VyZWFkMTYubXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIG1hY2g6IG0zMnIgbTMycngKLSMgeGVycm9yOgotIyBvdXRwdXQ6ICptaXNhbGlnbmVkIHJlYWQqCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLTsgY29uc3RydWN0IGJyYSB0cmFwMl9oYW5kbGVyIGluIHRyYXAgMiBzbG90Ci0JbGQyNCByMCwjZm9vKzEKLQlsZGggcjAsQHIwCi0JZmFpbAotCWV4aXQgMAotCi0uZGF0YQotCS5wMmFsaWduIDIKLWZvbzoKLQkuc2hvcnQgNDIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXJlYWQzMi5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXJlYWQzMi5tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1YzcxNi4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VyZWFkMzIubXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIG1hY2g6IG0zMnIgbTMycngKLSMgeGVycm9yOgotIyBvdXRwdXQ6ICptaXNhbGlnbmVkIHJlYWQqCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLTsgY29uc3RydWN0IGJyYSB0cmFwMl9oYW5kbGVyIGluIHRyYXAgMiBzbG90Ci0JbGQyNCByMCwjZm9vKzEKLQlsZCByMCxAcjAKLQlmYWlsCi0JZXhpdCAwCi0KLS5kYXRhCi0JLnAyYWxpZ24gMgotZm9vOgotCS53b3JkIDQyCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3V3cml0ZTE2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUxNi5tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZmQ2ZS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3V3cml0ZTE2Lm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBtYWNoOiBtMzJyIG0zMnJ4Ci0jIHhlcnJvcjoKLSMgb3V0cHV0OiAqbWlzYWxpZ25lZCB3cml0ZSoKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotOyBjb25zdHJ1Y3QgYnJhIHRyYXAyX2hhbmRsZXIgaW4gdHJhcCAyIHNsb3QKLQlsZDI0IHIwLCNmb28rMQotCXN0aCByMCxAcjAKLQlmYWlsCi0JZXhpdCAwCi0KLS5kYXRhCi0JLnAyYWxpZ24gMgotZm9vOgotCS5zaG9ydCA0MgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUzMi5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXdyaXRlMzIubXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWExMjMuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUzMi5tcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgbWFjaDogbTMyciBtMzJyeAotIyB4ZXJyb3I6Ci0jIG91dHB1dDogKm1pc2FsaWduZWQgd3JpdGUqCi0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLTsgY29uc3RydWN0IGJyYSB0cmFwMl9oYW5kbGVyIGluIHRyYXAgMiBzbG90Ci0JbGQyNCByMCwjZm9vKzEKLQlzdCByMCxAcjAKLQlmYWlsCi0JZXhpdCAwCi0KLS5kYXRhCi0JLnAyYWxpZ24gMgotZm9vOgotCS53b3JkIDQyCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvci5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvci5jZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGRhNzkuLjAwMDAwMDAKLS0tIGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciB4b3IgJGRyLCRzcgotIyBtYWNoKCk6IG0zMnIgbTMycngKLQotCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgotCi0Jc3RhcnQKLQotCS5nbG9iYWwgeG9yCi14b3I6Ci0KLQltdmlfaF9nciAgcjQsIDMKLQltdmlfaF9nciAgcjUsIDYKLQl4b3IgICAgICAgcjQsIHI1Ci0JdGVzdF9oX2dyIHI0LCA1Ci0KLQlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvcjMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IzLmNncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlNzI2OS4uMDAwMDAwMAotLS0gYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvcjMuY2dzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBtMzJyIHRlc3RjYXNlIGZvciB4b3IzICRkciwkc3IsIyR1aW1tMTYKLSMgbWFjaCgpOiBtMzJyIG0zMnJ4Ci0KLQkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKLQotCXN0YXJ0Ci0KLQkuZ2xvYmFsIHhvcjMKLXhvcjM6Ci0KLQltdmlfaF9nciAgcjUsIDAKLQltdmlfaF9nciAgcjQsIDMKLQl4b3IzICAgICAgcjUsIHI0LCAjNgotCXRlc3RfaF9nciByNSwgNQotCi0JcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvQ2hhbmdlTG9nIGIvc2ltL3Y4NTAvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2MxNmIwLi4wMDAwMDAwCi0tLSBhL3NpbS92ODUwL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotMjAwMC0wNS0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5pZ2VuOiBSZW1vdmUgaWxsZWdhbCBpbnN0cnVjdGlvbiBwYXR0ZXJuLCBzaW5jZSBpdCBpcyB0aGUKLQlzYW1lIGFzIHRoZSBicmVha3BvaW50IHBhdHRlcm4uCi0KLVR1ZSBNYXkgMjMgMjE6Mzk6MjMgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLTIwMDAtMDQtMTQgIEdhcnkgVGhvbWFzICA8Z3Rob21hc0ByZWRoYXQuY29tPgotCi0JKiB2ODUwLmlnZW46IERlZmluZSAnYnIgKicgYXMgaWxsZWdhbCBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5Ci0Jd2F5IHRvIHByb3ZpZGUgYSBicmVha3BvaW50IG9uIHNvbWUgdjg1MCBmYW1pbHkgcHJvY2Vzc29ycy4KLQotMjAwMC0wMy0yNCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAcmVkaGF0LmNvbT4KLQotCSogdjg1MC5pZ2VuIChpbGdvcCk6IE5ldyBpbnNuIHBhdHRlcm4gZm9yIGZvdXItYnl0ZSBicmVha3BvaW50cy4KLQotVGh1IFNlcCAgMiAxODoxNTo1MyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotMTk5OS0wNS0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JCi1UdWUgRGVjICAxIDE3OjI1OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE5MX1RBUkdFVCk6IERlZmluZSBhcyAtRE5MX1RBUkdFVF92ODUwLgotCi1XZWQgTm92IDI1IDE3OjUyOjU4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNpbW9wcy5vKTogRGVwZW5kcyBvbiB0YXJnLXZhbHMuaAotCSogc2ltb3BzLmM6IEluY2x1ZGUgdGFyZy12YWxzLmggaW5zdGVhZCBvZgotIAlsaWJnbG9zcy8uLi4vc3lzY2FsbC5oLiBSZXBsYWNlIFNZU18qIHdpdGggVEFSR0VUX1NZU18qLgotCShkaXZuLCBkaXZ1biwgT1BfMUMwMDdFMCwgT1BfMTgyMDdFMCwgT1BfMUMyMDdFMCxPUF8xODAwN0UwKToKLSAJUmVwbGFjZSBzaWduZWQgbG9uZyBpbnQgd2l0aCBzaWduZWQzMi4KLQotRnJpIE9jdCAgOSAxODowMjoyNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYzogI2luY2x1ZGUgIml0YWJsZS5oIi4KLQkoZ2V0X2luc25fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX29wZW4pOiBJbml0aWFsaXplIENQVV9JTlNOX05BTUUsQ1BVX01BWF9JTlNOUy4KLQkqIHNpbS1tYWluLmggKE1BWF9JTlNOUyxJTlNOX05BTUUpOiBEZWxldGUuCi0KLVdlZCBNYXkgIDYgMTk6NDM6MjcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2ltLW1haW4uaCAoSU5TTl9OQU1FKTogTmV3IGFyZyBgY3B1Jy4KLQotVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1TdW4gQXByIDI2IDE1OjE5OjE0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxODowOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIHNpbS1tYWluLmggKFNJTV9NQUlOX0gpOiBXcmFwIGhlYWRlci4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIE1hciAxMCAxNTo1NDo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcCk6IERlbGV0ZSwgc2Vjb25kIGF0dGVtcHQuCi0KLVRodSBGZWIgMjYgMTk6MDk6NDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBEZWxldGUuCi0KLVdlZCBGZWIgMTggMTA6NDc6MzIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oIChUUkFDRV9BTFVfSU5QVVQqKTogRGVsZXRlLiAgTW92ZWQgdG8gc2ltLXRyYWNlLltoY10uCi0KLQkqIHNpbW9wcy5jICh0cmFjZV9yZXN1bHQpOiBDYWxsIHRyYWNlX2dlbmVyaWMgaW5zdGVhZCBvZgotIAl0cmFjZV9vbmVfaW5zbi4KLQkodHJhY2VfbW9kdWxlKTogQ2hhbmdlIHZhcmlhYmxlIHR5cGUgdG8gaW50ZWdlci4KLQkodHJhY2VfaW5wdXQpOiBJbml0aWFsaXplIHRyYWNlX21vZHVsZSB3aXRoIFRSQUNFX0FMVV9JRFguCi0KLQkqIHNpbS1tYWluLmggKHRyYWNlX21vZHVsZSk6IENoYW5nZSB2YXJpYWJsZSBkZWNsIHRvIGludGVnZXIgdHlwZS4KLQkoVFJBQ0VfQlJBTkNIKiwgVFJBQ0VfTEQsIFRSQUNFX1NUKTogVXBkYXRlLgotCQotVHVlIEZlYiAxNyAxMjo1MToxOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KLSAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KLQotVHVlIEZlYiAgMyAxNjoyNDo0MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKElNRU0xNiwgSU1FTTE2X0lNTUVEKTogUmVuYW1lIElNRU0gYW5kCi0gCUlNRU1fSU1NRUQuIFRvIG1hdGNoIHJlY2VudCBpZ2VuIGNoYW5nZS4KLQotU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIEphbiAzMCAwOTo1MToyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKENQVV9DSUEpOiBEZWxldGUsIHJlcGxhY2VkIGJ5LgotCShDSUFfU0VULCBDSUFfU0VUKTogRGVmaW5lLgotCi1Nb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIERlYyAgNSAwOToyNjowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmlnZW46IFJldmVydCBicmVhayB2YWx1ZSBiYWNrIHRvIGl0cyBvbGQgdmFsdWUuCi0KLVRodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1XZWQgRGVjICAzIDE3OjI3OjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaWdlbjogTWFrZSBicmVhayBoYXZlIGEgemVybyBmaXJzdCBmaWVsZCwgc2luY2Ugb3RoZXJ3aXNlCi0JaXQgY2xhc2hlcyB3aXRoIHRoZSBESVZIIGluc3RydWN0aW9uLgotCi1TYXQgTm92IDIyIDIxOjMyOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBSZW5hbWUgU0lHQUJSVCAtPiBTSU1fU0lHQUJSVC4gR2l2ZQotIAlzaW1fc3RvcHBlZCBpbnN0ZWFkIG9mIHNpbV9zaWduYWxsZWQuCi0KLQkqIHY4NTAuaWdlbiAoQlJFQUspLCBzaW1vcHMuYyAoT1BfMTIwMDdFMCk6IFJlbmFtZSBTSUdUUkFQIHRvCi0gCVNJTV9TSUdUUkFQLgotCShpbGxlZ2FsKTogUmVuYW1lIFNJR0lMTCB0byBTSU1fU0lHSUxMLgotCQotCSogc2ltLW1haW4uaCwgc2ltb3BzLmMsIGludGVycC5jOiBEbyBub3QgaW5jbHVkZSBzaWduYWwuaC4KLQotCSogc2ltLW1haW4uaDogSW5jbHVkZSBzaW0tc2lnbmFsLmggaW5zdGVhZCBvZiBzaWduYWwuaC4KLQkoU0lHVFJBUCwgU0lHUVVJVCk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShTSUdfVjg1MF9FWElUKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLVR1ZSBOb3YgMTggMTU6MzM6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogVXNlICQoU0lNX05FV19DT01NT05fT0JKUykuCi0KLUZyaSBPY3QgMzEgMTA6MzM6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDaGVjayBzdGF0ZSBtYWdpYyBudW1iZXIuCi0JKHNpbS1hc3NlcnQuaCk6IEluY2x1ZGUuCi0KLVR1ZSBPY3QgMjggMTE6MDY6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2ODUwLmlnZW46IEFkZCBtb2RlbCBmaWx0ZXIgZmllbGQgdG8gcmVjb3Jkcy4KLQotRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIFNlcCAyNiAxMTo1NjowMiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmg6IGRlbGV0ZSBudWxsIG92ZXJyaWRlIG9mIFNJTV9FTkdJTkVfSEFMVF9IT09LIGFuZAotIAlTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSy4KLQkKLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mjg6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW0tbWFpbi5oIChXSVRIX1RBUkdFVF9XT1JEX01TQik6IERlbGV0ZS4KLQotCSogY29uZmlndXJlLmluIChTSU1fQUNfT1BUSU9OX0JJVFNJWkUpOiBTcGVjaWZ5IDMyIGJpdAotIAlhcmNoaXRlY3R1cmUgd2l0aCBNU0IgPT0gMzEuCi0KLVdlZCBTZXAgMjQgMTQ6MDQ6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2ODUwLmlnZW46IE1ha2UgZGl2aCBpbnNuIHdpdGggUlJSUlI9PTAgYnJlYWtwb2ludC4KLQotVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIFNlcCAyMyAxMDoxOTo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTSU1fV0FSTklOR1MsIFNJTV9BTElHTk1FTlQsIFNJTV9FTkRJQU4sCi0gCVNJTV9IT1NURU5ESUFOLCBTSU1fUkVTRVJWRURfQklUUyk6IERlbGV0ZSwgbW92ZWQgdG8gY29tbW9uLgotCShTSU1fRVhUUkFfQ0ZMQUdTKTogVXBkYXRlLgotCQotTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZ3VyZS5pbjogUmVhbGx5IHNwZWNpZnkgTk9OU1RSSUNUX0FMSUdOTUVOVCBhcyB0aGUgZGVmYXVsdC4KLQotRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3BlY2lmeSBOT05TVFJJQ1RfQUxJR05NRU5UIGFzIHRoZSBkZWZhdWx0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgU2VwIDE5IDEwOjM3OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5pZ2VuIChkaXNwMTYpOiBVc2UgRVhURU5EMTYgdG8gc2lnbiBleHRlbmQgZGlzcC4KLQkoZGlzcDIyKTogT25seSBzaGlmdCBsZWZ0IGJ5IDEsIG5vdCAyLgotCSgiam1wIik6IEVuc3VyZSBQQyBpcyAyIGJ5dGUgYWxpZ25lZC4KLQotCSogc2ltb3BzLmMsIHY4NTAuaWdlbjogTW92ZSAiQmNvbmQiLCAianIiLCAiamFybCIgY29kZSB0bwotIAl2ODUwLmlnZW4uIEZpeCB0cmFjaW5nLgotCi0JKiBzaW1vcHMuYyAoT1BfMzAwLCBPUF80MDAsIE9QXzUwMCk6IE1vdmUgInNkbC5iIiwgInNsZC5oIiwKLSAJInNsZC53IiBpbnNucyB0byB2ODUwLmlnZW4uICBGaXggdHJhY2luZy4KLQkoT1BfNzApOiBEaXR0byBmb3IgInNsZC5odSIuCi0KLQkqIHY4NTAuaWdlbjogQ2xhcmlmeSB0cmFjaW5nIG9mICJzbGQuYiIsICJzbGQuaCIgZXQuYWwuCi0KLQkqIHNpbW9wcy5jIChjb25kaXRpb25fbWV0KTogTWFrZSBnbG9iYWwuCi0KLQkqIHNpbS1tYWluLmggKFRSQUNFX0FMVV9JTlBVVDMsIFRSQUNFX0JSQU5DSDAsIFRSQUNFX0xELAotIAlUUkFDRV9TVCk6IERlZmluZS4KLQkoVFJBQ0VfTERfTkFNRSk6IERlZmluZS4KLQotCSogc2ltb3BzLmM6IE1vdmUgImNtb3YiLCAiY21vdiBpbW0iIHRvIHY4NTAuaWdlbiwgZml4LgotCi1XZWQgU2VwIDE3IDE2OjIxOjA4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmM6IE1vdmUgIm1vdiIsICJyZXRpIiwgdG8gdjg1MC5pZ2VuLCBmaXggdHJhY2luZy4KLQkKLQkqIGludGVycC5jIChoYXNoKTogRGVsZXRlLgotCi0JKiB2ODUwLmlnZW4gKG5vcCk6IFJlYWxseSBkbyBub3RoaW5nLgotCi0JKiBpbnRlcnAuYyAoZG9faW50ZXJydXB0KTogTWFzayBpbnRlcnJ1cHRzIGFmdGVyIFBTVyBpcyBzYXZlZCwgbm90Ci0gCWJlZm9yZS4KLQkqIHY4NTAuaWdlbiAocmV0aSk6IFJldHVybiB0byBjdXJyZW50IFBDIG5vdCBwcmV2aW91cy4KLQotV2VkIFNlcCAxNyAxNDowMjoxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jOiBNb3ZlICJjdHJldCIsICJic3ciLCAiaHN3IiB0byB2ODUwLmlnZW4sIGZpeCB0cmFjaW5nLgotCSh0cmFjZV9tb2R1bGUpOiBHbG9iYWwsIHNhdmUgY29tcG9uZW50L21vZHVsZSBuYW1lIGFjcm9zcyBpbnNuLgotCi0JKiBzaW1vcHMuYzogTW92ZSAiYnNoIiB0byB2ODUwLmlnZW4sIGZpeC4KLQkKLQkqIHY4NTAuaWdlbiAoY2FsbHQpOiBMb2FkIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzLiBGaXggdHJhY2luZy4KLQkoc3RzciwgbGRzcik6IENvcnJlY3Qgc3JjLCBkZXN0IGZpZWxkcy4gRml4IHRyYWNpbmcuCi0JKGN0cmV0KTogRm9yY2UgYWxpZ25tZW50LiAgRml4IHRyYWNpbmcuCi0JCi1UdWUgU2VwIDE2IDIyOjE0OjAxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKHRyYWNlX291dHB1dCk6IEFkZCByZXN1bHQgYXJndW1lbnQuCi0JKHRyYWNlX3Jlc3VsdCk6IE5ldyBmdW5jdGlvbi4gIFNpbXBsZXIgdmVyc2lvbiBvZiB0cmFjZV9vdXRwdXQsCi0gCWFzc3VtZXMgdHJhY2UgbmVlZGVkLgotCSh0cmFjZV9vdXRwdXQpOiBDYWxsIHRyYWNlX3Jlc3VsdC4KLQkodHJhY2Vfb3V0cHV0KTogRm9yIElNTV9SRUdfUkVHLCB0cmFjZSBjb3JyZWN0IHJlZ2lzdGVyLgotCSh0cmFjZV9pbnB1dCk6IEFkZCBjYXNlIGZvciAxNmJpdCBpbW1lZGlhdGVzLgotCShPUF82MDAsIE9QXzY0MCwgT1BfNjgwLCBPUF82QzAsIE9QXzZBMCk6IFVzZS4KLQotCSogc2ltLW1haW4uaCAoVFJBQ0VfQUxVX0lOUFVULCBUUkFDRV9BTFVfUkVTVUxUKTogRGVmaW5lLgotCSh0cmFjZV92YWx1ZXMsIHRyYWNlX25hbWUsIHRyYWNlX3BjLCB0cmFjZV9udW1fdmFsdWVzKTogTWFrZQotIAlnbG9iYWwuCi0JKEdSLCBTUik6IERlZmluZS4KLQkKLQl2ODUwLmluc24gKG1vdmVhLCBzdHNyKTogVXNlLgotCShzeGIsIHN4aCwgenhiLCB6eGgpOiBEaXR0by4KLQkKLVR1ZSBTZXAgMTYgMjE6MTQ6MDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYzogTW92ZSAibW92ZWEiIGZyb20gaGVyZS4KLQkqIHY4NTAuaWdlbjogVG8gaGVyZS4KLQotCSogdjg1MC5pZ2VuIChzaW1tMTYpOiBEZWZpbmUsIHNpZ24gZXh0ZW5kIGltbTE2LgotCSh1aW1tMTYpOiBEZWZpbmUsIG5vIHNpZ24gZXh0ZW5zaW9uLgotCShhZGRpLCBhbmRpLCBtb3ZlYSwgbW92aGksIG11bGhpLCBvcmksIHNhdHN1YmksIHhvcmkpOiBVc2UuCi0JCi0JKiBzaW1vcHMuYzogTW92ZSAic3hoIiwgInN3aXRjaCIsICJzeGIiLCAiY2FsbHQiLCAiZGlzcG9zZSIsCi0gCSJtb3YzMiIgZnJvbSBoZXJlLgotCSogdjg1MC5pZ2VuOiBUbyBoZXJlLgotCShzd2l0Y2gpOiBGaXggb2ZmIGJ5IHR3byBlcnJvciBpbiBOSUEgY2FsYy4KLQkKLVR1ZSBTZXAgMTYgMTU6MTQ6MDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAodHJhY2VfcGMsIHRyYWNlX25hbWUsIHRyYWNlX3ZhbHVlcywgdHJhY2VfbnVtX3ZhbHVlcyk6Ci0gCU5ldyBzdGF0aWMgZ2xvYmFscy4KLQkodHJhY2VfaW5wdXQpOiBKdXN0IHNhdmUgcGMsIG5hbWUgYW5kIHZhbHVlcyBmb3IgdHJhY2Vfb3V0cHV0LgotCSh0cmFjZV9vdXRwdXQpOiBXcml0ZSB0cmFjZSB2YWx1ZXMgdG8gYSBidWZmZXIuICBVc2UKLSAJdHJhY2Vfb25lX2luc24gdG8gcHJpbnQgdHJhY2UgaW5mbyBhbmQgYnVmZmVyLgotCShTSVpFX09QRVJBTkRTLCBTSVpFX0xPQ0FUSU9OKTogRGVsZXRlLgotCQotVHVlIFNlcCAxNiAwOTowMjowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmggKHN0cnVjdCBfc2ltX2NwdSk6IEFkZCBwc3dfbWFzayBzbyB0aGF0IHJlc2VydmVkIGJpdHMKLSAJY2FuIGJlIG1hc2tlZCBvdXQuCi0KLQkqIHNpbW9wcy5jIChPUF8yMDA3RTAsIE9QXzQwMDdFMCk6IE1vdmUgImxkc3IiLCAic3RzciIKLSAJaW5zdHJ1Y3Rpb25zIGZyb20gaGVyZS4KLQkqIHY4NTAuaWdlbiAobGRzciwgc3Rzcik6IFRvIGhlcmUuICBNYXNrIG91dCByZXNlcnZlZCBiaXRzIHdoZW4KLSAJc2V0dGluZyBQU1cuCi0JCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBTZXQgcHN3X21hc2sgaWYgbWFjaGluZSBrbm93bi4KLQotVHVlIFNlcCAxNiAxMDoyMDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGM6IEFkZCBydWxlIHRvIGRpZmVyZW50aWF0ZSBiZXR3ZWVuIGJyZWFrcG9pbnQgYW5kIGRpdmguCi0JKiB2ODUwLmlnZW4gKGJyZWFrKTogTmV3IGluc3RydWN0aW9uLCBicmVha3BvaW50IHNpbXVsYXRvci4KLQkqIHY4NTAuaWdlbiAoYnJlYWtwb2ludCk6IEVuYWJsZS4gIENoYW5nZSB0byBhIDMyYml0IGluc3RydWN0aW9uLgotCi1Nb24gU2VwIDE1IDE4OjQ0OjA1IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE11bHRpcGx5NjQpOiBEb24ndCBzdG9yZSBpbnRvIHJlZ2lzdGVyIHplcm8uCi0KLVR1ZSBTZXAgMTYgMDk6MDI6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc2VtYW50aWNzLm8pOiBBZGQgZGVwZW5kZW5jeS4KLQotCSogc2ltLW1haW4uaCAoU0FWRV8xLCBTQVZFXzIpOiBQZXJmb3JtIGJhY2t3YXJkIGNvbXBhdGlibGUgc2F2ZSwKLSAJZG8gbm90IGFkanVzdCBDSUEvTklBLgotCi1Nb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzMwMCwgT1BfNDAwLCBPUF83MCk6IE1ha2UgYmVoYXZvdXIgZGVwZW5kIG9uIFBTV1tVU10uCi0JCi0JKiBzaW1vcHMuYzogTW92ZSAiZGl2dW4iLCAic2xkLmJ1IiwgImRpdmhuIiwgImRpdmh1biIsICJkaXZuIiwKLSAJImRpdnVuIiwgInB1c2htbCIgY29kZSBmcm9tIGhlcmUgdG8gdjg1MC5pZ2VuLgotCShkaXZ1bik6IE1ha2UgZ2xvYmFsLgotCSh0eXBlM19yZWdzKTogTWFrZSBnbG9iYWwKLQkKLQkqIHY4NTAuaWdlbjogTW92ZSBzaW1vcHMuYyBjb2RlIHRvIGhlcmUuCi0KLQkqIGludGVycC5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogRm9yIHY4NTBlcSBzZXQgVVMgYml0IGJ5Ci0gCWRlZmF1bHQuCi0KLQkqIGludGVycC5jIChzaW1fb3Blbik6IERvbid0IHNldCBhcmNoLCBub3cgc2V0IGJ5Ci0gCXNpbV9hbmFseXplX3Byb2dyYW0uCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIFNlcCAxNSAxNDozOTozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChvcF90eXBlcyk6IE1vdmUgZnJvbSBoZXJlLgotCXNpbS1tYWluLmg6IFRvIGhlcmUuCi0KLQkqIHNpbS1tYWluLmggKHRyYWNlX2lucHV0LCB0cmFjZV9vdXRwdXQpLCBzaW1vcHMuYzogTWFrZSBnbG9iYWwuCi0KLQkqIHNpbW9wcy5jIChPUF82MCk6IE1vdmUgImptcCIgY29kZSBmcm9tIGhlcmUuCi0JKiB2ODUwLmlnZW4gKGptcCk6IFRvIGhlcmUuCi0KLQkqIHNpbW9wcy5jIChPUF82MCk6IE1vdmUgInNsZC5idSIgY29kZSBmcm9tIGhlcmUuCi0JKiB2ODUwLmlnZW4gKHNsZC5idSk6IFRvIGhlcmUuCi0KLUZyaSBTZXAgMTIgMTU6MTE6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2ODUwLmlnZW4gKHByZXBhcmUsIC4uLik6IEFkZCB0byB2ODUwZXEgYXJjaGl0ZWN0dXJlLgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBEZWZhdWx0IHRvIHY4NTBlcS4KLQkKLQkqIGludGVycC5jIChzaW1fb3Blbik6IERlZmF1bHQgdG8gdjg1MGUuCi0JKiBzaW0tbWFpbi5oIChzaWduYWwuaCk6IEluY2x1ZGUuCi0KLQkqIHY4NTAuaWdlbiAoaWxsZWdhbCk6IFJlcG9ydC9oYWx0IGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0NGTEFHUyk6IEFkZCBTSU1fUkVTRVJWRURfQklUUy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcmVzZXJ2ZWQgYml0cyBvcHRpb24uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBTZXAgMTEgMDg6NDA6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBVc2Ugc2ltX2RvX2NvbW1hbmRmIGluc3RlYWQgb2YgYXNwcmludGYuCi0KLQkqIHNpbS1tYWluLmggKElOU05fTkFNRSk6IAotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERSk6IEFkZCBTSU1fRVhUUkFfREVQUy4KLQkoU0lNX0VYVFJBX0RFUFMpOiBBZGQgaXRhYmxlLmgKLQkodG1wLWdlbmNvZGUpOiBEb2VzIG5vdCBkZXBlbmQgb24gc2ltb3BzLmgKLQotCSogc2ltLW1haW4uaCAoaXRhYmxlLmgpOiBJbmNsdWRlLgotCShNQVhfSU5TTlMsIElOU05fTkFNRSk6IERlZmluZS4KLQotCSogaW50ZXJwLmM6IENvbXB1dGUgaW50dHlwZSBmcm9tIHRoZSBpbnRlcnJ1cHRfbmFtZXMgaW5kZXggdGhhdAotIAl3YXMgcGFzc2VkIGluLgotCi1XZWQgU2VwIDEwIDEwOjI1OjQwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKHRyYWNlX2lucHV0KTogVXNlIHRyYWNlX3ByaW50ZiBpbnN0ZWFkIG9mCi0gCXNpbV9pb19wcmludGYuCi0JKHRyYWNlX291dHB1dCk6IERpdHRvLgotCSh0cmFjZV9pbnB1dCk6IE9ubHkgdHJhY2Ugd2hlbiBUUkFDRV9BTFVfUC4gIERlbGV0ZSBjb2RlCi0gCWRpc2FzZW1ibGluZyBpbnN0cnVjdGlvbi4KLQkodHJhY2Vfb3V0cHV0KTogT25seSB0cmFjZSB3aGVuIFRSQUNFX0FMVV9QLgotCi1UdWUgU2VwICA5IDAxOjI5OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKHRyYWNlX2lucHV0LCB0cmFjZV9vdXRwdXQpOiBVc2Ugc2ltX2lvX3ByaW50Zi4KLQkoT1BfNjIwKTogUGFzcyBjb3JyZWN0IGFyZ3VtZW50IHRvIHRyYWNlLgotCShPUF9FNjA3RTApOiBEaXR0by4KLQkodHJhY2VfaW5wdXQpOiBPYnRhaW4gcHJvZ19iZmQsIHRleHRfc3RhcnQgZXQuYWwgZnJvbSBzaW11bGF0b3IKLSAJc3RydWN0LgotCi1Nb24gU2VwICA4IDIxOjAzOjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5pZ2VuOiBOZXcgZmlsZS4KLQkqIHY4NTAtZGM6IE5ldyBmaWxlLgotCi1Nb24gU2VwICA4IDE4OjMzOjA0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCi0JKiBzaW0tbWFpbi5oIChTRVhUMTYpOiBEZWxldGUsIHVzZSBFWFRFTkQxNi4KLQkoU0VYVDgpOiBEZWxldGUsIHVzZSBFWFRFTkQ4LgotCShTRVhUMzIpOiBEZWxldGUsIHVzZWQ/Ci0JKFNFWFQ0MCwgU0VYVDQ0LCBTRVhUNjQpOiBVc2UgVU5TSUdORUQ2NCBmb3IgY29uc3RhbnRzLCBub3QgLi4uTEwuCi0JKFdJVEhfVEFSR0VUX1dPUkRfTVNCKTogRGVmaW5lIGFzIDMxLiB2ODUwIGxpdHRsZSBiaXQgZW5kaWFuLgotCQotCSogc2ltb3BzLmM6IFVzZSBFWFRFTkQxNSBmcm9tIHNpbS1iaXRzIGluc3RlYWQgb2YgU0VYVDE2LgotCi0JKiBzaW0tbWFpbi5oIChERUJVR19UUkFDRSwgREVCVUdfVkFMVUVTLCB2ODUwX2RlYnVnKTogRGVsZXRlLAotIAlyZXBsYWNlIHdpdGggVFJBQ0VfSU5TTl9QIGFuZCBUUkFDRV9BTFVfUC4KLQotCSogc2ltb3BzLmMgKHRyYWNlX2lucHV0LCB0cmFjZV9vdXRwdXQpOiBVcGRhdGUuCi0KLQkqIGludGVycC5jIChzaW1fZW5naW5lX3J1bik6IERlbGV0ZS4KLQkobG9va3VwX2hhc2gpOiBEZWxldGUuCi0JKHNpbV9vcGVuKTogRG8gbm90IGZpbGwgaGFzaCB0YWJsZS4KLQkoc2ltX3RyYWNlKTogRGVsZXRlLgotCi1GcmkgU2VwICA1IDE3OjA0OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QX0ZGRkYpOiBVc2Ugc2ltX2VuZ2luZV9oYWx0LgotCShPUF8xMjAwN0UwKTogRGl0dG8uCi0JKE9QXzEwMDA3RTApOiBEaXR0by4KLQotCSogc2ltLW1haW4uaCAoc3RydWN0IHNpbV9jcHUpOiBEZWxldGUgbWVtYmVyIGV4Y2VwdGlvbi4gVXNpbmcKLSAJc2ltLWVuZ2luZSBldC5hbC4KLQotCSogaW50ZXJwLmMgKHNpbV9pbmZvKTogRG8gbm90IGRvIGFueXRoaW5nIGluIHNpbS1pbmZvLgotCShzaW1fc3RvcCk6IERlbGV0ZSwgcmVwbGFjZSB3aXRoIHNpbS1zdG9wLgotCShzaW1fc3RvcF9yZWFzb24pOiBEZWxldGUsIHJlcGxhY2Ugd2l0aCBzaW0tcmVhc29uLgotCi0JKiBzaW0tbWFpbi5oIChXSVRIX1dBVENIUE9JTlRTKTogRGVmaW5lLgotCShXSVRIX01PRFVMT19NRU1PUlkpOiBEZWZpbmUKLQkKLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tcmVzdW1lLCBzaW0td2F0Y2gsIHNpbS1zdG9wLAotIAlzaW0tcmVhc29uLgotCi0JKiBpbnRlcnAuYyAoZW51bSBpbnRlcnJ1cHRfY29uZF90eXBlKTogRGVsZXRlLgotCShzdHJ1Y3QgaW50ZXJydXB0X2dlbmVyYXRvcik6IERlbGV0ZS4KLQkoZW51bSBpbnRlcnJ1cHRfdHlwZSk6IERyb3AgaW50X25vbmUuCi0JKHNpbV9vcGVuKTogSW5pdGlhbGl6ZSBXQVRDSFBPSU5UIG1vZHVsZS4KLQkoc2ltX3Jlc3VtZSwgc2ltX3J1bik6IFJlbmFtZSBzaW1fcmVzdW1lIHRvIHNpbV9ydW4uCi0JKHNpbV9lbmdpbmVfcnVuKTogUmVwbGFjZSBpbnRlcnJ1cHQgY29kZSB3aXRoIGNhbGwgdG8gc2ltLWV2ZW50cy4KLQkoc2ltX3NldF9pbnRlcnJ1cHQpOiBEZWxldGUuCi0JKHNpbV9wYXJzZV9udW1iZXIpOiBEZWxldGUuCi0KLVRodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDQgMTg6MTE6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoZmV0Y2hfYXJndik6IE5ldyBmdW5jdGlvbiwgZmV0Y2ggYSBhcmcgdmVjdG9yIGZyb20KLSAJc2ltdWxhdG9yIG1lbW9yeS4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZm9yaywgZXhlY3ZlLCBleGVjdi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogVXNlIEgyVF80IGFuZAotIAlUMkhfNCBmb3IgYnl0ZSBzd2FwcGluZy4KLQotCSogc2ltLW1haW4uaCwgaW50ZXJwLmMgKGdldF93b3JkLCBnZXRfaGFsZiwgZ2V0X2J5dGUsIHB1dF93b3JkLAotIAlwdXRfaGFsZiwgcHV0X2J5dGUpOiBEZWxldGUuCi0KLQkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbWVtb3B0Lm8gbW9kdWxlLgotCi0JKiBzaW0tbWFpbi5oIChsb2FkX21lbSwgc3RvcmVfbWVtKTogUmVkZWZpbmUgYXMgbWFjcm9zLgotCShJTUVNLCBJTUVNX0lNTUVEKTogTmV3IG1hY3JvcyAtIGZldGNoIGluc3RydWN0aW9ucy4KLQotCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBGb3IgU1lTX3JlYWQsIFNZU193cml0ZSwgU1lTX29wZW4KLSAJdHJhbnNmZXIgZGF0YSB2aWEgYSBidWZmZXIuCi0JKGZldGNoX3N0cik6IE5ldyBmdW5jdGlvbiwgZmV0Y2ggc3RyaW5nIGZyb20gbWVtb3J5LgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhydy5vIG1vZHVsZS4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogRXN0YWJsaXNoIG1lbW9yeSBtYXBzIHVzaW5nIHNpbS1tZW1vcHQuYwotIAl2aWEgc2ltX2RvX2NvbW1hbmQuCi0JKHNpbV9kb19jb21tYW5kKTogUHJpbnQgZXJyb3IgaWYgbWVtb3J5LW1hcCBjb21tYW5kIGlzIHVzZWQuIENhbGwKLSAJc2ltX2FyZ3NfY29tbWFuZC4KLQkobWFwKTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0tY29yZS4KLQkoc2ltX21lbW9yeV9pbml0KTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0tY29yZS4KLQkoc2ltX3NldF9tZW1vcnlfbWFwKTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0tbWVtb3B0LgotCShsb2FkX21lbSk6IERlbGV0ZSwgcmVwbGFjZWQgYnkgc2ltLWNvcmUuCi0JKHN0b3JlX21lbSk6IERlbGV0ZSwgcmVwbGFjZWQgYnkgc2ltLWNvcmUuCi0JKHNpbV93cml0ZSk6IERlbGV0ZSwgcmVwbGFjZWQgYnkgc2ltLWhydy4KLQkoc2ltX3JlYWQpOiBEZWxldGUsIHJlcGxhY2VkIGJ5IHNpbS1ocncuCi0KLQkqIHNpbS1tYWluLmggKHN0cnVjdCBzaW1fc3RhdGUpOiBSZW1vdmUgbWVtb3J5IG1lbWJlcnMsIHVzaW5nCi0gCXNpbS1jb3JlLmMKLQotV2VkIFNlcCAgMyAxMDoxODo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNpbS1tYWluLmg6IFJlcGxhY2UgU0lNX0hBVkVfRkxBVE1FTSB3aXRoIG1lbSBwdHIuCi0JKiBpbnRlcnAuYyAobWFwKTogRG8gbm90IGFkZCB0byBhIHZvaWQgcG9pbnRlci4KLQkKLQkqIE1ha2VmaWxlLmluIChJTkNMVURFKTogQWRkIHNpbS1tYWluLmgKLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgdGltZS5oCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi0JKiBpbnRlcnAuYyAoc3RydWN0IGludGVycnVwdF9nZW5lcmF0b3IpOiBNYWtlIHRpbWUgdW5zaWduZWQgbG9uZywKLSAJYWRkcmVzcyBTSU1fQUREUi4KLQkoc2ltX3Jlc3VtZSk6IE1ha2Ugb2xkcGMgU0lNX0FERFIuCi0JKHN0cnVjdCBoYXNoX2VudHJ5KTogTWFrZSBtYXNrL29wY29kZSB1bnNpZ25lZC4KLQotCSogdjg1MF9zaW0uaCAoc3RydWN0IHNpbW9wcyApOiBNYWtlIG9wY29kZSBhbmQgbWFzayB1bnNpZ25lZC4KLQotCSogc2ltb3BzLmMgKHV0aW1lLmgpOiBJbmNsdWRlIGlmIGF2YWlsYWJsZS4KLQkoT1BfMTAwMDdFMCk6IENoZWNrIGZvciBVVElNRSBmdW5jdGlvbi4KLQkoZGl2dW4pOiBQdXQgcGFyZW50aGVzZXMgYXJvdW5kIHNoaWZ0IGFyZ3VtZW50LgotCShPUF82NDApOiBQdXQgcGFyZW50aGVzZXMgYXJvdW5kIHNoaWZ0IGFyZ3VtZW50LCB3YXMgd3JvbmcuCi0JKE9QXzEwN0YwKTogUmV0dXJuIHNvbWV0aGluZy4KLQotCSogaW50ZXJwLmMgKHNpbV9wYXJzZV9udW1iZXIpOiBVc2Ugc3RydG91bCBub3Qgc3RydG9sLgotCShzaW1fcmVzdW1lKTogVXNlIHNpbV9lbGFwc2VkX3RpbWVfZ2V0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHRpbWUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9XQVJOSU5HUyk6IEFkZC4KLSAJKFNJTV9BQ19PUFRJT05fRU5ESUFOKTogU2V0IHRvIGhhcmR3aXJlZCBiaWcuCi0JKFNJTV9BQ19PUFRJT05fSE9TVF9FTkRJQU4pOiBBZGQuCi0JKEFDX0NIRUNLX0ZVTkNTKTogQWRkIHV0aW1lLgotCShBQ19DSEVDS19IRUFERVJTKTogQWRkIHN0ZGxpYi5oLCBzdHJpbmcuaCwgc3RyaW5ncy5oLCB1dGltZS5oCi0JY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCQotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX1JVTl9PQkpTKTogVXNlIG5ydW4uby4KLQkoU0lNX09CSlMpOiBBZGQgc2ltLWlvLm8sIHNpbS1obG9hZC5vLCBzaW0tdXRpbHMubywgc2ltLW9wdGlvbnMubywKLSAJc2ltLWNvbmZpZy5vLCBzaW0tbW9kdWxlLm8sIHNpbS1ldmVudHMubywgc2ltLWNvcmUubywKLSAJc2ltLWVuZGlhbi5vLCBzaW0tZW5naW5lLm8sIHNpbS10cmFjZS5vLCBzaW0tcHJvZmlsZS5vCi0JKFNJTV9FTkRJQU4sIFNJTV9XQVJOR0lOUyk6IERlZmluZS4KLQotCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBVc2Ugc2ltX2lvXyogZm9yIHRyYW5zZmVycy4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBQYXNzIHNkIGFyb3VuZC4KLQotCSogc2ltb3BzLmMgKHNpbS1tYWluLmgpOiBJbmNsdWRlLgotCi0JKiBnZW5jb2RlLmMgKHdyaXRlX3RlbXBsYXRlKTogR2VuZXJhdGUgI2luY2x1ZGUgc2ltLW1haW4uaC4KLQkod3JpdGVfb3Bjb2Rlcyk6IERpdHRvLgotCQotCSogaW50ZXJwLmMgKHByb2dfYmZkLCBwcm9nX2JmZF93YXNfb3BlbmVkX3ApOiBEZWxldGUuCi0JKHY4NTBfY2FsbGJhY2spOiBEaXR0by4KLQkoc2ltX2tpbmQsIG15bmFtZSk6IERpdHRvLgotCShsb29rdXBfaGFzaCk6IFBhc3MgU0QuIFVzZSBzaW1faW9fZXJyb3IuCi0JKHNpbV9zZXRfbWVtb3J5X21hcCk6IFBhc3MgaW4gU0QsIHVzZS4KLQkoaW5pdF9zeXN0ZW0pOiBQYXNzIGluIFNELCB1c2UuCi0JKHNpbV9vcGVuKTogVXBkYXRlLgotCShzaW1fc2V0X3Byb2ZpbGUpOiBEZWxldGUuCi0JKHNpbV9zZXRfcHJvZmlsZV9zaXplKTogRGVsZXRlLgotCShkb19pbnRlcnJ1cHQpOiBQYXNzIGluIFNELCB1c2UuCi0JKHNpbV9pbmZvKTogVXNlIHNpbV9pb19wcmludGYuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXNldCByZWdpc3RlcnMuICBTZXQgUEMgZnJvbSBwcm9nX2JmZAotIAlhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBEZWxldGUsIHVzZSBjb21tb24vc2ltLWhsb2FkLmMKLQkoc2ltX3NpemUpOiBSZW5hbWUgdG8gc2ltX21lbW9yeV9pbml0LgotCShzaW1fd3JpdGUpOiBSZW1vdmUgY2FsbCB0byBpbml0X3N5c3RlbS4KLQkoaW5pdF9zeXN0ZW0pOiBEZWxldGUuCi0JKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlLgotCShzaW1fc2V0X2ludGVycnVwdCk6IFBhc3MgaW4gU0QsIHVzZS4KLQkoc3RhcnRfdGltZSk6IERlbGV0ZS4KLQkKLQkqIHY4NTBfc2ltLmg6IFJlbW92ZSBldmVyeXRoaW5nIGV4Y2VwdCBgc3RydWN0IHNpbW9wcycgZnJvbSBoZXJlLgotIAkqIHNpbS1tYWluLmg6IE1vdmUgbW9zdCB0byBoZXJlLgotCSogZ2VuY29kZS5jOiBNb3ZlICNpbmNsdWRlcyB0byBoZXJlLgotCi0JKiBzaW0tbWFpbi5oKHN0cnVjdCBfc2ltX2NwdSk6IFJlbmFtZSBzdHJ1Y3QgX3N0YXRlLgotCSgjZGVmaW5lIFBDLCBldC5hbC4pOiBVcGRhdGUKLQkodjg1MF9jYWxsYmFjayk6IERlbGV0ZS4gIFJlcGxhY2VkIHdpdGggU0lNX0RFU0MgYXJnLgotCShpbnQ4LCB1aW50OCwgaW50MTYsIHVpbnQxNiwgaW50MzIsIHVpbnQzMik6IERlZmluZSB0eXBlcyB1c2luZwotIAl1bnNpZ25lZDggZXQuYWwgZnJvbSBjb21tb24vc2ltLXR5cGVzLmguCi0JKiBzaW0tbWFpbi5oIChTdGF0ZSk6IERlZmluZSBhcyBTVEFURV9DUFUuCi0KLU1vbiBTZXAgIDEgMTI6MDc6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB0aW1lLCBjaG1vZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIHNpbW9wcy5jIChTWVNfdGltZSwgU1lTX2NobW9kKTogVXNlIEhBVkVfVElNRSwgSEFWRV9DSE1PRC4KLQkKLQkqIHNpbW9wcy5jICguLi8uLi9saWJnbG9zcy92ODUwL3N5cy9zeXNjYWxsLmgpOiBJbmNsdWRlIGluc3RlYWQgb2YKLSAJc3lzL3N5c2NhbGwuaC4KLQkoT1BfMTAwMDdFMCk6IENoZWNrIHRoZSBleGlzdGFuY2UgZWFjaCBTWVNfKiBtYWNybyBpbmRlcGVuZGFudGx5LgotCi0JKiB2ODUwX3NpbS5oIChTSUdRVUlULCBTSUdUUkFQKTogT25seSBkZWZpbmUgaWYgbWlzc2luZy4KLQotV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVR1ZSBBdWcgMjYgMTA6NDI6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQotTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLU1vbiBBdWcgMjUgMTE6MzE6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KLQotRnJpIEF1ZyAyMiAxMDozOToyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoYnNoKTogT25seSBzZXQgQ1kgZmxhZyBpZiBlaXRoZXIgb2YgdGhlIGJvdHRvbQotCWJ5dGVzIGlzIHplcm8uCi0JCi0JKiBzaW1vcHMuYyAocHJlcGFyZSwgZGlzcG9zZSk6IExvd2VyIG51bWJlcmVkCi0JcmVnaXN0ZXJzIGdvIHRvIGhpZ2hlciBudW1iZXJlZCBhZGRyZXNzLgotCi0JKiBzaW1vcHMuYyAodW5zaWduZWQgZGl2aWRlIGluc3RydWN0aW9ucyk6IFMgYml0IHNldCBpZiByZXN1bHQgaGFzCi0JdG9wIGJpdCBzZXQuCi0JCi0JKiBzaW1vcHMuYyAocHVzaG1sLCBwdXNobWgsIHBvcG1sLCBwb3BtaCk6IExvd2VyIG51bWJlcmVkCi0JcmVnaXN0ZXJzIGdvIHRvIGhpZ2hlciBudW1iZXJlZCBhZGRyZXNzLgotCQotV2VkIEF1ZyAyMCAxMzo1NjozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfMTA3RTAsIE9QXzEwN0YwLCBPUF8zMDdFMCwgT1BfMzA3RjApOiBVc2UgY29ycmVjdAotCWludGVycHJldGF0aW9uIG9mIFNSIGJpdCBpbiBsaXN0MTggc3RydWN0dXJlLgotCShkaXZuLCBkaXZ1bik6IE5ldyBmdW5jdGlvbnMgdG8gcGVyZm9ybSBOIHN0ZXAgZGl2aWRlIGZ1bmN0aW9ucy4KLQotTW9uIEF1ZyAxOCAxMDo1OTowMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoT1BfMzAwLCBPUF80MDAsIE9QXzYwLCBPUF83MCk6IFN1cHBvcnQgdmFyaWFudCBvcGNvZGVzCi0Jd2l0aCBVUyBiaXQgc2V0IGluIHRoZSBQU1cuCi0KLVdlZCBBdWcgMTMgMTk6MDY6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBPcGNvZGUgZnVuY3Rpb25zIHJldHVybiBhbW91bnQgdG8gYmUKLQlhZGRlZCB0byBQQyBhbmQgYWxsIG9wY29kZXMgdGFrZSBhIHN0YW5kYXJkIGZvcm1hdCBpbiB0aGUgT1BbXQotCWFycmF5LgotCQotCShkb19mb3JtYXRfKik6IEZ1bmN0aW9ucyByZW1vdmVkLgotCi0JKiB2ODUwX3NpbS5oIChTUCwgRVApOiBOZXcgcmVnaXN0ZXIgbW5lbW9uaWNzLgotCQotCSogZ2VuY29kZS5jICh3cml0ZV9oZWFkZXIpOiBGdW5jdGlvbnMgcHJvdG90eXBlcyByZXR1cm4gYW4KLQlpbnRlZ2VyLgotCi0JKiBzaW1vcHMuYzogT3Bjb2RlIGZ1bmN0aW9ucyByZXR1cm4gYW1vdW50IHRvIGJlIGFkZGVkIHRvIFBDLgotCQotCSogdjg1MF9zaW0uaCAoQ1RQQywgQ1RQU1csIENUQlApOiBOZXcgcmVnaXN0ZXIgbW5lbW9uaWNzLgotCQotCSogc2ltb3BzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSBpbnN0cnVjdGlvbnMuCi0JCi0JKiBzaW1vcHMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlcSBpbnN0cnVjdGlvbnMuCi0JCi1UdWUgTWF5IDIwIDEwOjI0OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KLQotVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgMjMgMTc6MjA6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHByb2dfYmZkX3dhc19vcGVuZWRfcCk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHByb2dfYmZkKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc2ltX29wZW4pOiBVbmRvIHBhdGNoIHRvIGFkZCAtRSBzdXBwb3J0LgotCShzaW1fY2xvc2UpOiBDbG9zZSBwcm9nX2JmZCBpZiBzaW1fbG9hZCBvcGVuZWQgaXQuCi0JKHNpbV9sb2FkKTogUmVjb3JkIGJmZCBvZiBsb2FkZWQgZmlsZSBpbiBwcm9nX2JmZC4KLQkqIHNpbW9wcy5jIChwcm9nX2JmZCk6IFJlbmFtZWQgZnJvbSBleGVjX2JmZC4KLQotRnJpIEFwciAxOCAxNDoxNzoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGludGVycC5jIChzaW1fc3RvcCk6IFN0dWIgZnVuY3Rpb24uCi0KLVRodSBBcHIgMTcgMDM6NTM6MTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1sb2FkLm8uCi0JKiBpbnRlcnAuYyAoc2ltX2tpbmQsIG15bmFtZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLiAgSWdub3JlIC1FIGFyZy4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgQ2FsbCBzaW1fbG9hZF9maWxlIHRvCi0JbG9hZCBmaWxlIGludG8gc2ltdWxhdG9yLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgotCi1XZWQgQXByIDE2IDE5OjUzOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBPbmx5IHByb3ZpZGUgc3lzdGVtIGNhbGxzIFNZU19leGVjdiwKLSAJU1lTX3dhaXQsIFNZU193YWl0LCBTWVNfdXRpbWUsIFNZU190aW1lIGlmIGRlZmluZWQgYnkgdGhlIGhvc3QuCi0KLU1vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVdlZCBBcHIgIDIgMTU6MDY6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuCi0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCi1GcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVGh1IE1hciAxMyAxMzowMDo1NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93Ci0JaW4gYXJndiBmb3JtLgotCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KLQotVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCi0JQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQotCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgotCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgotCW1ha2VmaWxlIGZyYWdtZW50LgotCi1Nb24gSmFuIDIwIDE2OjA1OjM0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKE9QX3tFMCwyRTAsNkUwfSk6IFRoZSBtdWx0aXBseSBvcGVyYXRpb25zIHNpZ24gZXh0ZW5kLAotCW5vdCB6ZXJvIGV4dGVuZC4KLQotVHVlIEphbiAxNCAxNzowNjowMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYzogIFB1dCBpZmRlZnMgYXJvdW5kIHRoaW5ncyB0byBtYWtlIE1TVkMgaGFwcHkuICBHZXQgcmlkCi0Jb2YgdW5pc3RkLmguICBEaXNhYmxlIFNZU19zdGF0LCBTWVNfY2hvd24sIFNZU190aW1lLCBTWVNfdGltZXMsCi0JU1lTX2dldHRpbWVvZmRheSBhbmQgU1lTX3V0aW1lIGZyb20gTVNWQy4KLQotVHVlIERlYyAzMSAxODoxMToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNpbW9wcy5jIChPUF8xMDAwN0UwKTogS25vdyB0aGF0IGtpbGwgZW5jb2RlcyB0aGUgc2lnbmFsIG51bWJlcgotCXZpYTogMHhkZWFkMDAwMCB8IHNpZ25hbCBhbmQgdHVybiBpdCBiYWNrIGludG8gYSBzaWduYWwuCi0KLUZyaSBEZWMgMjcgMTQ6NDQ6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwX3NpbS5oIChTSUdfVjg1MF9FWElUKTogRGVmaW5lIGFzIC0xLgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDYXN0IGNhbGxvYyBmdW5jdGlvbi4KLQkoc2ltX3N0b3BfcmVhc29uKTogSWYgc2lnbmFsIGlzIFNJR19WODUwX0VYSVQsIGluZm9ybSBnZGIgdGhlCi0JcHJvZ3JhbSBleGl0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZXhpdCBjb2RlLgotCShzaW1fc2V0X2ludGVycnVwdCk6IERlY2xhcmUgYnVpbGRhcmd2LgotCi0JKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IE1ha2UgZXhpdCBzaWduYWwgbm9ybWFsIGV4aXQuICBNYWtlIHRpbWUKLQl0eXBlIGNvcnJlY3QgYW5kIHdvcmsgb24gYmlnIGVuZGlhbiBzeXN0ZW1zLgotCi1XZWQgTm92IDIwIDAyOjE4OjQ0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fT0JKUyxTSU1fRVhUUkFfQ0ZMQUdTLFNJTV9FWFRSQV9DTEVBTik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnLmluOiBOZXcgZmlsZS4KLQkqIHNpbW9wcy5jOiAjaW5jbHVkZSAiY29uZmlnLmgiLiAgI2luY2x1ZGUgPHVuaXN0ZC5oPiBpZiBwcmVzZW50LgotCi1TdW4gTm92ICAzIDIzOjAyOjU0IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogdjg1MF9zaW0uaCAoU3RhdGUpOiBOZXcgc2xvdHMgZHVtbXlfbWVtLCBwZW5kaW5nX25taS4KLQkoRUlQQywgZXRjKTogTmV3IG1hY3JvcyBmb3Igc3lzdGVtIHJlZ2lzdGVycy4KLQkqIHNpbW9wcy5jLCBpbnRlcnAuYzogVXNlIGV2ZXJ5d2hlcmUuCi0KLQkqIGludGVycC5jOiBBZGQgc3VwcG9ydCBmb3IgaW50ZXJydXB0cyBpc3N1ZWQgYnkgaW50ZXJydXB0Ci0JZ2VuZXJhdG9ycywgZWl0aGVyIFBDLSBvciB0aW1lLWJhc2VkLiAgQ29udHJvbGxlZCBieSBzaW11bGF0b3IKLQljb21tYW5kICJzaW0gaW50ZXJydXB0Ii4KLQotCSogaW50ZXJwLmM6IEFkZCBzdXBwb3J0IGZvciB2YXJpYWJsZS1zaXplIGFsbG9jYXRpb24gb2YgbWVtb3J5LAotCXZpYSBzaW11bGF0b3IgY29tbWFuZCAic2ltIG1lbW9yeS1tYXAiLgotCShtYXApOiBJc3N1ZSBTSUdTRUdWIGZvciByZWZlcmVuY2VzIHRvIGludmFsaWQgbWVtb3J5IHJlZ2lvbnMuCi0JCi1UaHUgT2N0IDMxIDE0OjQ0OjEwIDE5OTYgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotICAgICAgICAKLSAgICAgICAgKiBzaW1vcHMuYzogSW5jbHVkZSA8c3lzL3RpbWUuaD4gZm9yIHN0cnVjdCB0aW1ldmFsIGFuZCAKLSAgICAgICAgc3RydWN0IHRpbWV6b25lLgotICAgICAgICAKLVdlZCBPY3QgMzAgMDg6NDk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IEhhbmRsZSBTWVNfdGltZXMgYW5kIFNZU19nZXR0aW1lb2ZkYXkuCi0KLQkqIHNpbW9wcy5jIChPUF8xMDAwN0UwKTogSGFuZGxlIFNZU190aW1lLgotCi1UdWUgT2N0IDI5IDE0OjIyOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmM6IEluY2x1ZGUgPHN5cy9zdGF0Lmg+LgotCShPUF8xMDAwN0UwKTogSGFuZGxlIFNZU19zdGF0LgotCi1UaHUgT2N0IDI0IDEyOjI2OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBEb24ndCBkZWNsYXJlIGVycm5vLgotCi0JKiBzaW1vcHMuYyAoT1BfNTAwKTogTWFzayBvZmYgbG93IGJpdCBpbiBkaXNwbGFjZW1lbnQKLQlmb3Igc2xkLncuCi0JKE9QXzUwMSk6IFNpbWlsYXJseS4KLQotCSogc2ltb3BzLmMgKE9QXzUwMCk6IEZpeCBkaXNwbGFjZW1lbnQgaGFuZGxpbmcgZm9yIHNsZC53LgotCShPUF81MDEpOiBTaW1pbGFybHkgZm9yIHNzdC53LgotCi0JKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQpOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gU0VYVDcuCi0JKE9QXzMwMCwgT1BfNDAwLCBPUF81MDAsIE9QXzM4MCwgT1BfNDgwLCBPUF81MDEpOiBEaXNwbGFjZW1lbnQKLQlpcyB6ZXJvIGV4dGVuZGVkIGZvciBzc3Qvc2xkIGluc3RydWN0aW9ucy4KLQkqIHY4NTBfc2ltLmggKFNFWDcpOiBEZWxldGUuICBJdCdzIG5vIGxvbmdlciBuZWVkZWQgKGFuZCBpdAotCXdhcyBpbmNvcnJlY3QgYW55d2F5KS4KLQotVGh1IE9jdCAyNCAxMDozMzozMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEdldCByaWQgb2Ygc3Jjcm9vdC4gIFNldCBhbGwgSU5TVEFMTCBtYWNyb3MgdmlhCi0JYXV0b2NvbmYuCi0JKiBnZW5jb2RlLmMgKHdyaXRlX29wY29kZXMpOiAgUGFkIG9wZXJhbmRzIGZpZWxkIHRvIGFjY291bnQgZm9yCi0JTVNWQyBicmFpbmRhbWFnZS4KLQkqIHNpbW9wcy5jOiAgSW5jbHVkZSBlcnJuby5oLiAgRXhjbHVkZSBTWVNfY2hvd24sIHNpbmNlIE1TVkMKLQlkb2Vzbid0IHN1cHBvcnQgaXQuICAoV2h5IGlzIHRoaXMgaGVyZSBpbiB0aGUgZmlyc3QgcGxhY2U/IT8pCi0JKiB2ODUwX3NpbS5oOiAgR2V0IHJpZCBvZiA2NCBiaXQgZGVmcy4gIEFsc28sIGdldCByaWQgb2YgI2VsaWYncy4KLQlDaGFuZ2UgbnVtYmVyIG9mIG9wZXJhbmRzIGluIHN0cnVjdCBzaW1vcHMgZnJvbSA5IHRvIDYuICBEZWZpbmUKLQlTSUdUUkFQIGFuZCBTSUdRVUlUIGZvciBNU1ZDLgotCi1UdWUgT2N0IDE1IDE2OjE5OjUxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGludGVycC5jIChNRU1fU0laRSk6ICBJdCdzIG5vdyBieXRlcywgbm90IGEgcG93ZXIgb2YgMi4KLQkqIChtYXApOiAgQWRkIHN1cHBvcnQgZm9yIGV4dGVybmFsIG1lbSBpbiB0aGUgMS0+MiBtZWcgcmFuZ2UuCi0JQWxzbywgYWJvcnQoKSB3aGVuIG1lbW9yeSBhY2Nlc3MgaXMgd2F5IG91dCBvZiBib3VuZHMuICAoQmV0dGVyIHRvCi0JZGllIHRoYW4gdG8gZ2l2ZSB3cm9uZyByZXN1bHQuICAoVGhpcyB3aWxsIGJlIGZpeGVkIGxhdGVyLikpCi0JKiAoc2ltX3NpemUpOiAgTUVNX1NJWkUgaXMgbm93IGJ5dGVzLCBub3Qgc2hpZnQgZmFjdG9yLgotCi1UdWUgT2N0ICAxIDE1OjUzOjI0IDE5OTYgIEdhdmluIEtvY2ggPGdhdmluQGN5Z251cy5jb20+Ci0gICAgICAgIAotICAgICAgICAqIHNpbW9wcy5jICh0cmFjZV9pbnB1dCk6IFN3YXBwZWQgb3JkZXIgb2Ygb3BlcmFuZHMgZm9yIG91dHB1dAotICAgICAgICBvdXRwdXQgb2YgT1BfSU1NX1JFRy4gIENoYW5nZWQgdGhlIGZldGNoaW5nIG9mIHRoZSBvcGVyYW5kcyBmb3IKLSAgICAgICAgT1BfTE9BRDMyLCBhbmQgT1BfU1RPUkUzMiB0byB3b3JrIGxpa2Ugb3AtZnVuY3Rpb24uCi0gICAgICAgIAotTW9uIFNlcCAzMCAxNTo0NjozMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYzogIE1vdmUgaW5jbHVkZXMgb2YgcmVtb3RlLXNpbS5oIGFuZCBjYWxsYmFjay5oIHRvCi0Jdjg1MC1zaW0uaC4KLQkqIChsb29rdXBfaGFzaCk6IEFkZCBQQyB0byByZXBvcnQgb2YgaGFzaCBmYWlsdXJlLgotCSogKG1hcCBsb2FkX21lbSBzdG9yZV9tZW0pOiAgTmV3IG1lbW9yeSBzdWJzeXN0ZW0uICBNb2RlbHMgVjg1MQotCW1lbW9yeSBzeXN0ZW0uCi0JKiAoc2ltX3dyaXRlIHNpbV9yZWFkKTogIFVzZSBuZXcgbWVtb3J5IHN1YnN5c3RlbS4KLQkqIChzaW1fcmVzdW1lKTogIERvbid0IGxvYWQgYW5kIHNhdmUgUEMgaW50byBFSVBDIGFueW1vcmUuICBOZWVkZWQKLQl0byBtYWtlIHVzZXItZGVmaW5lZCB0cmFwcyB3b3JrIHJpZ2h0LgotCSogc2ltb3BzLmMgKE9QXyopOiAgVXNlIG5ldyBtZW1vcnkgc3Vic3lzdGVtLgotCSogKE9QXzE0MDA3RTAgKHJldGkpKTogIEltcGxlbWVudCByZXRpLgotCSogKE9QXzE0OTk2RTAgKHRyYXApKTogIEltcGxlbWVudCB1c2VyLWRlZmluZWQgdHJhcHMuICBNb3ZlIEkvTyB0bwotCXRyYXAgMzEuICBVc2UgbmV3IG1lbW9yeSBzdWJzeXN0ZW0uCi0JKiB2ODUwX3NpbS5oOiAgUHJvdG90eXBlcyBmb3IgbG9hZF9tZW0sIHN0b3JlX21lbSBhbmQgbWFwLiAgVXNlCi0JbG9hZF9tZW0gaW4gUkxXIG1hY3JvLgotCi1GcmkgU2VwIDI3IDE4OjM0OjA5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6ICBPdXRwdXQgaGV4IHZhbHVlcyBmb3Igb3Bjb2RlIG1hc2sKLQlhbmQgcGF0dGVybnMuCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6ICBTYXZlIGFuZCByZXN0b3JlIFBDIGZyb20gdGhlIGFwcHJvcHJpYXRlCi0JcmVnaXN0ZXIuCi0JKiAoc2ltX2ZldGNoX3JlZ2lzdGVyIHNpbV9zdG9yZV9yZWdpc3Rlcik6ICBGaXggYnl0ZS1vcmRlciBwcm9ibGVtCi0Jd2l0aCByZWFkaW5nIGFuZCB3cml0aW5nIHJlZ2lzdGVycy4KLQkqIHNpbW9wcy5jIChPUF9GRkZGKTogIEltcGxlbWVudCBwc2V1ZG8tYnJlYWtwb2ludCBpbnNuLgotCi1GcmkgU2VwIDI3IDE3OjQyOjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2ltb3BzLmMgKHRyYWNlX2lucHV0KTogRml4IHRoaW5rby4gCi0KLVdlZCBTZXAgMTggMDk6NTQ6MTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzaW1vcHMuYyAoZXhlY19iZmQpOiBSZW5hbWUgZnJvbSBzaW1fYmZkLgotCSh0cmFjZV9pbnB1dCk6IERpdHRvLgotCi1UaHUgU2VwIDEyIDEyOjAzOjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmMgKHRyYWNlX2lucHV0KTogVXNlIGZpbmRfbmVhcmVzdF9saW5lIHRvIHByaW50IGxpbmUKLQludW1iZXIsIGZ1bmN0aW9uIG5hbWUgb3IgZmlsZSBuYW1lIG9mIFBDLgotCi1XZWQgU2VwIDExIDE2OjQ0OjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2ltb3BzLmM6IEFkZCB0cmFjaW5nIHN1cHBvcnQuICBVc2UgU0VYVHh4IG1hY3JvcyBpbnN0ZWFkIG9mCi0JZG9pbmcgaGFyZHdpcmVkIHNoaWZ0cy4KLQotCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tY2ZsYWdzKTogQWRkIHN3aXRjaCB0byBhZGQgYWRkaXRpb25hbAotCWZsYWdzIHRvIHNpbXVsYXRvciBidWxkLiAgSWYgLS1lbmFibGUtc2ltLWNmbGFncz10cmFjZSwgdHVybiBvbgotCXRyYWNpbmcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIE1ha2VmaWxlLmluOiBEb24ndCByZXF1aXJlIGEgVlBBVEggY2FwYWJsZSBtYWtlIGlmIGNvbmZpZ3VyaW5nCi0JaW4gdGhlIHNhbWUgZGlyZWN0b3J5LiAgRG9uJ3QgdXNlIENGTEFHUyBmb3IgY29uZmlndXJhdGlvbiBmbGFncy4KLQlBZGQgZmxhZ3MgZnJvbSAtLWVuYWJsZS1zaW0tY2ZsYWdzLiAgU3VwcG9ydCBjYW5hZGlhbiBjcm9zcwotCWJ1aWxkcy4gIFJlYnVpbGQgd2hvbGUgc2ltdWxhdG9yIGlmIGluY2x1ZGUgZmlsZXMgY2hhbmdlLgotCi0JKiBpbnRlcnAuYyAodjg1MF9kZWJ1Zyk6IE5ldyBnbG9iYWwgZm9yIGRlYnVnZ2luZy4KLQkobG9va3VwX2hhc2gsc2ltX3NpemUsc2ltX3NldF9wcm9maWxlKTogVXNlCi0JcHJpbnRmX2ZpbHRlcmVkIGNhbGxiYWNrLCBpbnN0ZWFkIG9mIGNhbGxpbmcgcHJpbnRmIGRpcmVjdGx5LgotCShzaW1fe29wZW4sdHJhY2V9KTogRW5hYmxlIHRyYWNpbmcgaWYgLXQgYW5kIGNvbXBpbGVkIGZvciB0cmFjaW5nLgotCi0JKiB2ODUwX3NpbS5oOiBVc2UgbGltaXRzLmggdG8gc2V0IHRoZSB2YXJpb3VzIHNpemVkIHR5cGVzLgotCShTRVhUezUsNywxNiwyMn0pOiBOZXcgbWFjcm9zLgotCi1Nb24gU2VwICA5IDIwOjUwOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKGhhc2gpOiBNYWtlIHRoaXMgYW4gaW5saW5lIGZ1bmN0aW9uCi0Jd2hlbiBjb21waWxpbmcgd2l0aCBHQ0MuICBTaW1wbGlmeS4KLQkqIHNpbXBvcy5jOiBFeHBsaWNpdGx5IGluY2x1ZGUgInN5cy9zeXNjYWxsLmgiLiAgUmVtb3ZlCi0Jc29tZSAjaWYgMCdkIGNvZGUuICBFbmFibGUgbW9yZSBlbXVsYXRlZCBzeXNjYWxscy4KLQotV2VkIFNlcCAgNCAwMTo0ODo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVycC5jOiBGaXggc2lnbiBiaXQgaGFuZGxpbmcgZm9yIGFkZCBhbmQgc3ViIGluc3RydWN0aW9ucy4KLQotVHVlIFNlcCAgMyAxMDoyMDozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdlbmNvZGUuYzogRml4IHZhcmlvdXMgaW5kZW50aW9uICYgc3R5bGUgcHJvYmxlbXMuCi0JUmVtb3ZlIHRlc3QgY29kZS4gIFJlbW92ZSAjaWYgMCBjb2RlLgotCSogaW50ZXJwLmM6IFByb3ZpZGUgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCi0JRml4IG1pbm9yIGluZGVudGlvbiBwcm9ibGVtcy4KLQkoc2ltX29wZW4sIHNpbV9yZXN1bWUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoc2ltX3JlYWQpOiBSZXR1cm4gdHlwZSBpcyAiaW50Ii4KLQkqIHNpbW9wcy5jOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoZGl2aCk6IE1ha2UgcmVzdWx0IG9mIGRpdmlkZS1ieS16ZXJvIHplcm8uCi0JKHNldGYpOiBJbml0aWFsaXplIHJlc3VsdCB0byBrZWVwIGNvbXBpbGVyIHF1aWV0LgotCShzYXIgaW5zdHJ1Y3Rpb25zKTogVGhlc2UganVzdCBjbGVhciB0aGUgb3ZlcmZsb3cgYml0LgotCSogdjg1MF9zaW0uaDogUHJvdmlkZSBwcm90b3R5cGVzIGZvciBwdXRfYnl0ZSwgcHV0X2hhbGYKLQlhbmQgcHV0X3dvcmQuCi0KLQkqIGludGVycC5jOiBPUCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgMzJiaXQgb3BlcmFuZHMhCi0JKHY4NTBfY2FsbGJhY2spOiBEZWNsYXJlLgotCShkb19mb3JtYXRfNSk6IEZpeCBleHRyYWN0aW9uIG9mIE9QWzBdLgotCShzaW1fc2l6ZSk6IFJlbW92ZSBkZWJ1Z2dpbmcgcHJpbnRmLgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERvIHNvbWV0aGluZyB1c2VmdWwuCi0JKHNpbV9zdG9wX3JlYXNvbik6IEdyb3NzIGhhY2tzIHRvIGdldCBjLXRvcnR1cmUgcnVubmluZy4KLQkqIHNpbW9wcy5jOiBTaW1wbGlmeSBjb2RlIGZvciBjb21wdXRpbmcgdGFyZ2V0cyBvZiBiQ0MKLQlpbnNucy4gICBJbnZlcnQgJ3MnIGJpdCBpZiAnb3YnIGJpdCBpcyBzZXQgZm9yIHNvbWUKLQlpbnN0cnVjdGlvbnMuICBGaXggJ2N5JyBiaXQgaGFuZGxpbmcgZm9yIG51bWVyb3VzCi0JaW5zdHJ1Y3Rpb25zLiAgTWFrZSB0aGUgc2ltdWxhdG9yIHN0b3Agd2hlbiBhIGhhbHQKLQlpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFZlcnkgY3J1ZGUgc3VwcG9ydCBmb3IKLQllbXVsYXRlZCBzeXNjYWxscyAodHJhcCAwKS4KLQkqIHY4NTBfc2ltLmg6IEluY2x1ZGUgImNhbGxiYWNrLmgiIGFuZCBkZWNsYXJlCi0Jdjg1MF9jYWxsYmFjay4gIEl0ZW1zIGluIHRoZSBvcGVyYW5kIGFycmF5IGFyZSAzMmJpdHMuCi0KLVN1biBTZXAgIDEgMjI6MzU6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IEZpeCBjb2RlIHRvIGNoZWNrIGZvciBhIGZvcm1hdCAzCi0Jb3Bjb2RlLgotCSogc2ltb3BzLmM6IGJDQyBpbnNucyBvbmx5IGFyZ3VtZW50IGlzIGEgY29uc3RhbnQsIG5vdCBhCi0JcmVnaXN0ZXIgdmFsdWUgKGR1aC4uLikKLQotRnJpIEF1ZyAzMCAxMDozMzo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpbW9wcy5jOiBGaXggIm5vdDEiIGFuZCAic2V0MSIuCi0KLQkqIHNpbW9wcy5jOiBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0ZW1wIGZvcgotCSJsZC5oIiBhbmQgImxkLnciCi0KLQkqIGludGVycC5jOiBSZW1vdmUgdmFyaW91cyBkZWJ1Z2dpbmcgcHJpbnRmcy4KLQotCSogc2ltb3BzLmM6IEZpeCBzYXRhZGQsIHNhdHN1YiBib3VuZGFyeSBjYXNlIGhhbmRsaW5nLgotCi0JKiBpbnRlcnAuYyAoaGFzaCk6IEZpeC4KLQkqIGludGVycC5jIChkb19mb3JtYXRfOCk6IEdldCBvcGVyYW5kcyBjb3JyZWN0bHkgYW5kCi0JY2FsbCB0aGUgdGFyZ2V0IGZ1bmN0aW9uLgotCSogc2ltb3BzLmM6IFJvdWdoIGN1dCBhdCAiY2xyMSIsICJub3QxIiwgInNldDEiLCBhbmQgInRzdDEiLgotCi1UaHUgQXVnIDI5IDEzOjUzOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJwLmMgKGRvX2Zvcm1hdF80KTogR2V0IG9wZXJhbmRzIGNvcnJlY3RseSBhbmQKLQljYWxsIHRoZSB0YXJnZXQgZnVuY3Rpb24uCi0JKiBzaW1vcHMuYzogUm91Z2ggY3V0IGF0ICJzbGQuYiIsICJzbGQuaCIsICJzbGQudyIsICJzc3QuYiIsCi0JInNzdC5oIiwgYW5kICJzc3QudyIuCi0KLQkqIHY4NTBfc2ltLmg6IFRoZSBWODUwIGRvZXNuJ3QgaGF2ZSBzcGxpdCBJJkQgc3BhY2VzLiAgQ2hhbmdlCi0JYWNjb3JkaW5nbHkuICBSZW1vdmUgbWFueSB1bnVzZWQgZGVmaW5pdGlvbnMuCi0JKiBpbnRlcnAuYzogVGhlIFY4NTAgZG9lc24ndCBoYXZlIHNwbGl0IEkmRCBzcGFjZXMuICBDaGFuZ2UKLQlhY2NvcmRpbmdseS4KLQkoZ2V0X2xvbmdsb25nLCBnZXRfbG9uZ3dvcmQsIGdldF93b3JkKTogRGVsZXRlZC4KLQkod3JpdGVfbG9uZ2xvbmcsIHdyaXRlX2xvbmd3b3JkLCB3cml0ZV93b3JkKTogRGVsZXRlZC4KLQkoZ2V0X29wZXJhbmRzKTogRGVsZXRlZC4KLQkoZ2V0X2J5dGUsIGdldF9oYWxmLCBnZXRfd29yZCk6IE5ldyBmdW5jdGlvbnMuCi0JKHB1dF9ieXRlLCBwdXRfaGFsZiwgcHV0X3dvcmQpOiBOZXcgZnVuY3Rpb25zLgotCSogc2ltb3BzLmM6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25zLiAgUm91Z2ggY3V0IGF0Ci0JImxkLmIiLCAibGQuaCIsICJsZC53IiwgInN0LmIiLCAic3QuaCIsICJzdC53IiBpbnNucy4KLQotCSogdjg1MF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IFJlbW92ZSAicHN3IiBmaWVsZC4gIEFkZAotCSJzcmVncyIgZmllbGQuCi0JKFBTVyk6IFJlbW92ZSBib2d1cyBkZWZpbml0aW9uLgotCSogc2ltb3BzLmM6IENoYW5nZSBjb25kaXRpb24gY29kZSBoYW5kbGluZyB0byB1c2UgdGhlIHBzdwotCXJlZ2lzdGVyIHdpdGhpbiB0aGUgc3JlZ3MgYXJyYXkuICBIYW5kbGUgImxkc3IiIGFuZCAic3RzciIuCi0KLQkqIHNpbW9wcy5jOiBIYW5kbGUgInNhdGFkZCIsICJzYXRzdWIiLCAic2F0c3ViaSIsICJzYXRzdWJyIi4KLQotCSogaW50ZXJwLmMgKGRvX2Zvcm1hdF81KTogR2V0IG9wZXJhbmRzIGNvcnJlY3RseSBhbmQKLQljYWxsIHRoZSB0YXJnZXQgZnVuY3Rpb24uCi0JKHNpbV9yZXN1bWUpOiBEb24ndCBkbyBhIFBDIHVwZGF0ZSBmb3IgZm9ybWF0IDUgaW5zdHJ1Y3Rpb25zLgotCSogc2ltb3BzLmM6IEhhbmRsZSAiamFybCIgYW5kICJqbXAiIGluc3RydWN0aW9ucy4KLQotCSogc2ltb3BzLmM6IEZpeCBtaW5vciB0eXBvcy4gIEhhbmRsZSAiY21wIiwgInNldGYiLCAidHN0IgotCSJkaSIsIGFuZCAiZWkiIGluc3RydWN0aW9ucyBjb3JyZWN0bHkuCi0KLQkqIGludGVycC5jIChkb19mb3JtYXRfMyk6IEdldCBvcGVyYW5kcyBjb3JyZWN0bHkgYW5kIGNhbGwKLQl0aGUgdGFyZ2V0IGZ1bmN0aW9uLgotCSogc2ltb3BzLmM6IEhhbmRsZSBiQ0MgaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogQWRkIGNvbmRpdGlvbiBjb2RlIGhhbmRsaW5nIHRvIHNoaWZ0IGluc25zLgotCUZpeCBtaW5vciB0eXBvcyBpbiBjb25kaXRpb24gY29kZSBoYW5kbGluZyBmb3Igb3RoZXIgaW5zbnMuCi0KLQkqIE1ha2VmaWxlLmluOiBGaXggdHlwby4KLQkqIHNpbW9wcy5jOiBBZGQgY29uZGl0aW9uIGNvZGUgaGFuZGxpbmcgdG8gInN1YiIgInN1YnIiIGFuZAotCSJkaXZoIiBpbnN0cnVjdGlvbnMuCi0KLQkqIGludGVycC5jIChoYXNoKTogVXBkYXRlIHRvIGJlIG1vcmUgYWNjdXJhdGUuCi0JKGxvb2t1cF9oYXNoKTogQ2FsbCBoYXNoIHJhdGhlciB0aGFuIGNvbXB1dGluZyB0aGUgaGFzaAotCWNvZGUgaGVyZS4KLQkoZG9fZm9ybWF0XzFfMik6IEhhbmRsZSBmb3JtYXQgMSBhbmQgZm9ybWF0IDIgaW5zdHJ1Y3Rpb25zLgotCUdldCBvcGVyYW5kcyBjb3JyZWN0bHkgYW5kIGNhbGwgdGhlIHRhcmdldCBmdW5jdGlvbi4KLQkoZG9fZm9ybWF0XzYpOiBHZXQgb3BlcmFuZHMgY29ycmVjdGx5IGFuZCBjYWxsIHRoZSB0YXJnZXQKLQlmdW5jdGlvbi4KLQkoZG9fZm9ybWF0c185XzEwKTogUm91Z2ggY3V0IHNvIHNoaWZ0IG9wcyB3aWxsIHdvcmsuCi0JKHNpbV9yZXN1bWUpOiBUd2VhayB0byBkZWFsIHdpdGggZm9ybWF0IDEgYW5kIGZvcm1hdCAyCi0JaGFuZGxpbmcgaW4gYSBzaW5nbGUgZnVudGlvbi4gIERvbid0IHVwZGF0ZSB0aGUgUEMKLQlmb3IgZm9ybWF0IDMgaW5zbnMuICBGaXggdHlwb3MuCi0JKiBzaW1vcHMuYzogU2xpZ2h0bHkgcmVvcmdhbml6ZS4gIEFkZCBjb25kaXRpb24gY29kZSBoYW5kbGluZwotCXRvICJhZGQiLCAiYWRkaSIsICJhbmQiLCAiYW5kaSIsICJvciIsICJvcmkiLCAieG9yIiwgInhvcmkiCi0JYW5kICJub3QiIGluc3RydWN0aW9ucy4KLQkqIHY4NTBfc2ltLmggKHJlZ190KTogUmVnaXN0ZXJzIGFyZSAzMmJpdHMuCi0JKF9zdGF0ZSk6IFRoZSBWODUwIGhhcyAzMiBnZW5lcmFsIHJlZ2lzdGVycy4gIEFkZCBhIDMyYml0Ci0JcHN3IGFuZCBwYyByZWdpc3RlciB0b28uICBBZGQgYWNjZXNzb3IgbWFjcm9zCi0KLQkqIE1ha2VmaWxlLmluLCBpbnRlcnAuYywgdjg1MF9zaW0uaDogQnJpbmcgb3ZlciBlbmRpYW5uZXNzCi0JY2hhbmdlcyBmcm9tIHRoZSBkMTB2IHNpbXVsYXRvci4KLQotCSogc2ltb3BzLmM6IEFkZCBzaGlmdCBzdXBwb3J0LgotCi0JKiBzaW1vcHMuYzogQWRkIG11bHRpcGx5ICYgZGl2aWRlIHN1cHBvcnQuICBBYm9ydCBmb3Igc3lzdGVtCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBzaW1vcHMuYzogQWRkIGxvZ2ljYWxzLCBtb3YsIG1vdmhpLCBtb3ZlYSwgYWRkLCBhZGRpLCBzdWIKLQlhbmQgc3Vici4gIE5vIGNvbmRpdGlvbiBjb2RlcyB5ZXQuCi0KLVdlZCBBdWcgMjggMTM6NTM6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgdjg1MF9zaW0uaCwgCi0JZ2VuY29kZS5jLCBpbnRlcnAuYywgc2ltb3BzLmM6IENyZWF0ZWQuCi0KZGlmZiAtLWdpdCBhL3NpbS92ODUwL01ha2VmaWxlLmluIGIvc2ltL3Y4NTAvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjUyMzAuLjAwMDAwMDAKLS0tIGEvc2ltL3Y4NTAvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgVjg1MCBzaW0gbGlicmFyeS4KLSMgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCi0KLVNJTV9PQkpTID0gXAotCSQoU0lNX05FV19DT01NT05fT0JKUykgXAotCXNpbW9wcy5vIGludGVycC5vIFwKLQlpdGFibGUubyBzZW1hbnRpY3MubyBpZGVjb2RlLm8gaWNhY2hlLm8gZW5naW5lLm8gaXJ1bi5vIHN1cHBvcnQubyBcCi0Jc2ltLWVuZ2luZS5vIFwKLQlzaW0taGxvYWQubyBcCi0Jc2ltLWhydy5vIFwKLQlzaW0tcmVzdW1lLm8gXAotCXNpbS1yZWFzb24ubyBcCi0Jc2ltLXN0b3AubwotCi1TSU1fUlVOX09CSlMgPSBucnVuLm8KLQotIyBMaXN0IG9mIGV4dHJhIGRlcGVuZGVuY2llcy4KLSMgR2VuZXJhbGx5IHRoaXMgY29uc2lzdHMgb2Ygc2ltdWxhdG9yIHNwZWNpZmljIGZpbGVzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCi1TSU1fRVhUUkFfREVQUyA9IHY4NTBfc2ltLmggc2ltLW1haW4uaCBzaW1vcHMuaCBpdGFibGUuaAotCi0jIExpc3Qgb2YgZmxhZ3MgdG8gYWx3YXlzIHBhc3MgdG8gJChDQykKLVNJTV9FWFRSQV9DRkxBR1MgPSBcCi0JLURERUJVRyBcCi0JLUkkKHNyY2RpcikvLi4vLi4vbmV3bGliL2xpYmMvc3lzL3N5c25lY3Y4NTAKLVNJTV9FWFRSQV9DTEVBTiA9IGNsZWFuLWV4dHJhCi0KLUlOQ0xVREUgPSAkKHNpbV9tYWluX2hlYWRlcnMpICQoU0lNX0VYVFJBX0RFUFMpIAotCi1OTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF92ODUwCi0KLSMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCi0KLXNpbW9wcy5oIHRhYmxlLmM6IHRtcC1nZW5jb2RlCi10bXAtZ2VuY29kZTogZ2VuY29kZQotCS4vZ2VuY29kZSA+dG1wLXRhYmxlLmMKLQltdiB0bXAtdGFibGUuYyB0YWJsZS5jCi0JLi9nZW5jb2RlIC1oID50bXAtc2ltb3BzLmgKLQltdiB0bXAtc2ltb3BzLmggc2ltb3BzLmgKLQl0b3VjaCB0bXAtZ2VuY29kZQotZ2VuY29kZS5vOiBnZW5jb2RlLmMKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW5jb2RlLmMKLXY4NTAtb3BjLm86ICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL3Y4NTAtb3BjLmMKLQkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQ8Ci1nZW5jb2RlOiBnZW5jb2RlLm8gdjg1MC1vcGMubwotCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLW8gZ2VuY29kZSBnZW5jb2RlLm8gdjg1MC1vcGMubwotCi0KLQotQlVJTFRfU1JDX0ZST01fSUdFTiA9IFwKLQlpY2FjaGUuaCBcCi0JaWNhY2hlLmMgXAotCWlkZWNvZGUuaCBcCi0JaWRlY29kZS5jIFwKLQlzZW1hbnRpY3MuaCBcCi0Jc2VtYW50aWNzLmMgXAotCW1vZGVsLmggXAotCW1vZGVsLmMgXAotCXN1cHBvcnQuaCBcCi0Jc3VwcG9ydC5jIFwKLQlpdGFibGUuaCBcCi0JaXRhYmxlLmMgXAotCWVuZ2luZS5oIFwKLQllbmdpbmUuYyBcCi0JaXJ1bi5jCi0kKEJVSUxUX1NSQ19GUk9NX0lHRU4pOiB0bXAtaWdlbiBzaW1vcHMuaAotIwotCi0uUEhPTlk6IGNsZWFuLWlnZW4KLWNsZWFuLWlnZW46Ci0Jcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9JR0VOKQotCXJtIC1mIHRtcC1pZ2VuIHRtcC1pbnNucwotCi0uLi9pZ2VuL2lnZW46Ci0JY2QgLi4vaWdlbiAmJiAkKE1BS0UpCi0KLUlHRU5fVFJBQ0U9ICMgLUcgb21pdC1saW5lLW51bWJlcnMgIyAtRyB0cmFjZS1ydWxlLXNlbGVjdGlvbiAtRyB0cmFjZS1ydWxlLXJlamVjdGlvbiAtRyB0cmFjZS1lbnRyaWVzCi1JR0VOX0lOU049JChzcmNkaXIpL3Y4NTAuaWdlbgotSUdFTl9EQz0kKHNyY2Rpcikvdjg1MC1kYwotdG1wLWlnZW46ICQoSUdFTl9JTlNOKSAkKElHRU5fREMpIC4uL2lnZW4vaWdlbgotCWNkIC4uL2lnZW4gJiYgJChNQUtFKQotCS4uL2lnZW4vaWdlbiBcCi0JCSQoSUdFTl9UUkFDRSkgXAotCQktRyBnZW4tZGlyZWN0LWFjY2VzcyBcCi0JCS1pICQoSUdFTl9JTlNOKSBcCi0JCS1vICQoSUdFTl9EQykgXAotCQkteCBcCi0JCS1uIGljYWNoZS5oICAgIC1oYyB0bXAtaWNhY2hlLmggXAotCQktbiBpY2FjaGUuYyAgICAtYyAgdG1wLWljYWNoZS5jIFwKLQkJLW4gc2VtYW50aWNzLmggLWhzIHRtcC1zZW1hbnRpY3MuaCBcCi0JCS1uIHNlbWFudGljcy5jIC1zICB0bXAtc2VtYW50aWNzLmMgXAotCQktbiBpZGVjb2RlLmggICAtaGQgdG1wLWlkZWNvZGUuaCBcCi0JCS1uIGlkZWNvZGUuYyAgIC1kICB0bXAtaWRlY29kZS5jIFwKLQkJLW4gbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKLQkJLW4gbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKLQkJLW4gc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAotCQktbiBzdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYyBcCi0JCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAotCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jIFwKLQkJLW4gZW5naW5lLmggICAgLWhlIHRtcC1lbmdpbmUuaCBcCi0JCS1uIGVuZ2luZS5jICAgIC1lICB0bXAtZW5naW5lLmMgXAotCQktbiBpcnVuLmMgICAgICAtciAgdG1wLWlydW4uYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggaWNhY2hlLmgKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIGljYWNoZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggaWRlY29kZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgaWRlY29kZS5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBzZW1hbnRpY3MuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgc2VtYW50aWNzLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmggbW9kZWwuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuYyBtb2RlbC5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0Lmggc3VwcG9ydC5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmMgc3VwcG9ydC5jCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuaCBpdGFibGUuaAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmMgaXRhYmxlLmMKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWVuZ2luZS5oIGVuZ2luZS5oCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1lbmdpbmUuYyBlbmdpbmUuYwotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXJ1bi5jIGlydW4uYwotCXRvdWNoIHRtcC1pZ2VuCi0KLWNsZWFuLWV4dHJhOiBjbGVhbi1pZ2VuCi0Jcm0gLWYgdGFibGUuYyBzaW1vcHMuaCBnZW5jb2RlCi0KLSNpbnRlcnAubzogaW50ZXJwLmMgdGFibGUuYyAkKElOQ0xVREUpCi1zaW1vcHMubzogc2ltb3BzLmMgJChJTkNMVURFKSB0YXJnLXZhbHMuaAotI3RhYmxlLm86IHRhYmxlLmMKLXNlbWFudGljcy5vOiAkKElOQ0xVREUpCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9hY2NvbmZpZy5oIGIvc2ltL3Y4NTAvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vdjg1MC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9jb25maWcuaW4gYi9zaW0vdjg1MC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWNhOWMuLjAwMDAwMDAKLS0tIGEvc2ltL3Y4NTAvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLwotI3VuZGVmIFdPUkRTX0JJR0VORElBTgotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19TRVRGUFVDVwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNobW9kIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NITU9ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2hvd24gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQ0hPV04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZXhlY3YgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRVhFQ1YKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBleGVjdmUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRVhFQ1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZm9yayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GT1JLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0lHQUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dXRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVVRJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS92ODUwL2NvbmZpZ3VyZSBiL3NpbS92ODUwL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTAwZDQ2Yi4uMDAwMDAwMAotLS0gYS9zaW0vdjg1MC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCwgIG5vbnN0cmljdCBvciBmb3JjZWQgYWxpZ25tZW50IG9mIG1lbW9yeSBhY2Nlc3Nlcy4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1idWlsZC13YXJuaW5nc1s9TElTVF0JCUVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMJCVNwZWNpZnkgd2hldGhlciB0byBjaGVjayByZXNlcnZlZCBiaXRzIGluIGluc3RydWN0aW9uLiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1iaXRzaXplPU4JCVNwZWNpZnkgdGFyZ2V0IGJpdHNpemUgKDMyIG9yIDY0KS4iCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDcwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzEyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzcxOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTg6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk5ODogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMzg6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA3MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA2OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEzOTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjg5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzQ2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Mzc6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0jIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTY6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczNzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1NTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3OTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Mjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTEyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxOTIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTU0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk1OTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk2ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTg3OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLQotCi0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDk4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1BTExfTElOR1VBUz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjMwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjU6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0NTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzY0OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzkxOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQxOTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDU0OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUyODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYxOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzYxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODUxOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODc5OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KLSMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCi0jIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgotZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk1ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5Njg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTk4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAwODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAzODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA3ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwODg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzExNzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTcyOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kKCk7Ci0KLWludCBtYWluKCkgewotYmluZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfbGliIDEKLUVPRgotCi0gIExJQlM9Ii1sc29ja2V0ICRMSUJTIgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMTk6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGdldGhvc3RieW5hbWUoKTsKLQotaW50IG1haW4oKSB7Ci1nZXRob3N0YnluYW1lKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLS4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLQotVVNFX01BSU5UQUlORVJfTU9ERT1ubwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKLSAgbm8pCU1BSU5UPSIjIiA7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKLWZpCi1lbHNlCi0gIE1BSU5UPSIjIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OwotICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCi1maQotZWxzZQotICBzaW1fYnN3YXA9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OwotICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OwotICBubykJIHNpbV9jZmxhZ3M9IiI7OwotICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9jZmxhZ3M9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OwotICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7Ci0gICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9kZWJ1Zz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OwotICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKLSAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9zdGRpbz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OwotICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3RyYWNlPSIiCi0JZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCi0JICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCi0JICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCi0JICBlbHNlCi0JICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCi1maQotZWxzZQotICBzaW1fdHJhY2U9IiIKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OwotICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKLSAgWy0wLTldKikKLQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OwotICBbYS16XSopCi0Jc2ltX3Byb2ZpbGU9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgotCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgotCSAgZWxzZQotCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKLQkgIGZpCi0JZG9uZQotCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSIKLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTQ6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSN1bmRlZiBzaWduYWwKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7Ci0jZWxzZQotdm9pZCAoKnNpZ25hbCAoKSkgKCk7Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1pbnQgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCi1FT0YKLQotCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NTg6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXNpbV9saW5rX2ZpbGVzPQotc2ltX2xpbmtfbGlua3M9Ci0KLXNpbV9saW5rX2xpbmtzPXRjb25maWcuaAotaWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgotdGhlbgotICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCi1lbHNlCi0gIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCi1maQotCi0jIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCi1jYXNlICIke3RhcmdldH0iIGluCi0qLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKLWVzYWMKLXNpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igotc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCi0KLQotCi0KLXdpcmVfZW5kaWFuPSJMSVRUTEVfRU5ESUFOIgotZGVmYXVsdF9lbmRpYW49IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0tZW5kaWFuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OwotICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgotCSBlbHNlCi0gICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgotCSAgIGZpCi0JIGZpOzsKLSAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCi0JIGVsc2UKLQkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCi0JICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLQkgICBlbHNlCi0JICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCi0JICAgZmkKLQkgZmk7OwotICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW5kaWFuPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQotZmkKLWVsc2UKLSAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgotICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgotICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKLSAgZWxzZQotICAgIHNpbV9lbmRpYW49Ci0gIGZpCi1maQotZmkKLQotd2lyZV9hbGlnbm1lbnQ9IiIKLWRlZmF1bHRfYWxpZ25tZW50PSJOT05TVFJJQ1RfQUxJR05NRU5UIgotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7Ci0gIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7Ci0gIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgIGVsc2UKLSAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICAgIGVsc2UKLQkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLQkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLSAgICAgICBlbHNlCi0gICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0JICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgotICAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKLSAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCi0gICAgICAgICBmaQotICAgICAgIGZpOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCi1maQotZWxzZQotICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCi0gIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKLWVsc2UKLSAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgotICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCi0gIGVsc2UKLSAgICBzaW1fYWxpZ25tZW50PQotICBmaQotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7Ci0gIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7Ci0gIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7Ci0gICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKLWZpCi1lbHNlCi0gIAotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYxOTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci1pbnQgbWFpbigpIHsKLQotI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLWludCBtYWluKCkgewotCi0jaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KLSAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgotICBlbHNlCi0gICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKLSAgZmkKLWVsc2UKLSAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgotICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQk7OwotICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7Ci0gICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7Ci0gICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAotCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7Ci0gICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCi1maQotV0FSTl9DRkxBR1M9IiIKLVdFUlJPUl9DRkxBR1M9IiIKLWlmIHRlc3QgIngke2J1aWxkX3dhcm5pbmdzfSIgIT0geCAtYSAieCRHQ0MiID0geHllcwotdGhlbgotICAjIFNlcGFyYXRlIG91dCB0aGUgLVdlcnJvciBmbGFnIGFzIHNvbWUgZmlsZXMganVzdCBjYW5ub3QgYmUKLSAgIyBjb21waWxlZCB3aXRoIGl0IGVuYWJsZWQuCi0gIGZvciB3IGluICR7YnVpbGRfd2FybmluZ3N9OyBkbwotICAgIGNhc2UgJHcgaW4KLSAgICAtV2VyciopIFdFUlJPUl9DRkxBR1M9LVdlcnJvciA7OwotICAgICopIFdBUk5fQ0ZMQUdTPSIke1dBUk5fQ0ZMQUdTfSAkdyIKLSAgICBlc2FjCi0gIGRvbmUKLWZpCi1lbHNlCi0gIGJ1aWxkX3dhcm5pbmdzPSIiCi1maQotCi0KLWRlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHM9IjEiCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMgb3IgLS1kaXNhYmxlLXNpbS1yZXNlcnZlZC1iaXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9yZXNlcnZlZF9iaXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0xIjs7Ci0gIG5vKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZXNlcnZlZF9iaXRzPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVzZXJ2ZWRfYml0cyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgcmVzZXJ2ZWQgZmxhZ3MgPSAkc2ltX3Jlc2VydmVkX2JpdHMiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0ke2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHN9IgotZmkKLQotd2lyZV93b3JkX2JpdHNpemU9IjMyIgotd2lyZV93b3JkX21zYj0iMzEiCi13aXJlX2FkZHJlc3NfYml0c2l6ZT0iIgotd2lyZV9jZWxsX2JpdHNpemU9IiIKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYml0c2l6ZSBvciAtLWRpc2FibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX2JpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9iaXRzaXplIgotICBzaW1fYml0c2l6ZT0KLWNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgNjQsNjMgfCA2NCw2MywqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiOzsKLSAgMzIsMzEgfCAzMiwzMSwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MzEiOzsKLSAgNjQsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKLSAgMzIsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKLSAgMzIpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgotICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSIKLSAgICAgIGVsc2UKLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKLSAgICAgIGZpIDs7Ci0gIDY0KSBpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHggLWEgeCIkd2lyZV93b3JkX21zYiIgIT0geDA7IHRoZW4KLSAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiCi0gICAgICBlbHNlCi0gICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiCi0gICAgICBmaSA7OwotICAqKSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotIyBhZGRyZXNzIGJpdHNpemUKLXRtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05XSosKi8vImAKLWNhc2UgeCIke3RtcH0iIGluCi0gIHggKSA7OwotICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0zMiIgOzsKLSAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9NjQiIDs7Ci0gICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gYWRkcmVzcyBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotIyBjZWxsIGJpdHNpemUKLXRtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05Kl0qLCpbMC05XSosKi8vImAKLWNhc2UgeCIke3RtcH0iIGluCi0gIHggKSA7OwotICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT0zMiIgOzsKLSAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9NjQiIDs7Ci0gICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gY2VsbCBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCi1maQotZWxzZQotICBzaW1fYml0c2l6ZT0iIgotaWYgdGVzdCB4IiR3aXJlX3dvcmRfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSR3aXJlX3dvcmRfYml0c2l6ZSIKLWZpCi1pZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPSR3aXJlX3dvcmRfbXNiIgotZmkKLWlmIHRlc3QgeCIkd2lyZV9hZGRyZXNzX2JpdHNpemUiICE9IHg7IHRoZW4KLSAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0kd2lyZV9hZGRyZXNzX2JpdHNpemUiCi1maQotaWYgdGVzdCB4IiR3aXJlX2NlbGxfYml0c2l6ZSIgIT0geDsgdGhlbgotICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPSR3aXJlX2NlbGxfYml0c2l6ZSIKLWZpCi1maQotCi0KLWZvciBhY19mdW5jIGluIHRpbWUgY2htb2QgdXRpbWUgZm9yayBleGVjdmUgZXhlY3YgY2hvd24KLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MzM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdXRpbWUuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODg5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg5OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKLXMlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKLXMlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKLXMlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZwotcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZwotcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCi1zJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZwotcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZwotcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCi1zJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCi1zJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKLXMlQHNpbV9od0AlJHNpbV9odyVnCi1zJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCi1zJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZwotcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCi1zJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKLXMlQHNpbV9zbXBAJSRzaW1fc21wJWcKLXMlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZwotcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCi1zJUBXQVJOX0NGTEFHU0AlJFdBUk5fQ0ZMQUdTJWcKLXMlQFdFUlJPUl9DRkxBR1NAJSRXRVJST1JfQ0ZMQUdTJWcKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCi1zJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCi1zJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZwotcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKLXMlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCi1zJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgotYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotIHhNYWtlZmlsZSopCi0gICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCi0gICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCi0gICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCi0gICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCi0JLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAotCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCi0gICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKLSAgIDs7Ci0gZXNhYwotIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KLQpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvY29uZmlndXJlLmluIGIvc2ltL3Y4NTAvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U4OTJkLi4wMDAwMDAwCi0tLSBhL3NpbS92ODUwL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgotc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCi1BQ19QUkVSRVEoMi41KWRubAotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotU0lNX0FDX0NPTU1PTgotCi1TSU1fQUNfT1BUSU9OX0VORElBTihMSVRUTEVfRU5ESUFOKQotU0lNX0FDX09QVElPTl9BTElHTk1FTlQoLE5PTlNUUklDVF9BTElHTk1FTlQpCi1TSU1fQUNfT1BUSU9OX0hPU1RFTkRJQU4KLVNJTV9BQ19PUFRJT05fV0FSTklOR1MKLVNJTV9BQ19PUFRJT05fUkVTRVJWRURfQklUUwotU0lNX0FDX09QVElPTl9CSVRTSVpFKDMyLDMxKQotCi1BQ19DSEVDS19GVU5DUyh0aW1lIGNobW9kIHV0aW1lIGZvcmsgZXhlY3ZlIGV4ZWN2IGNob3duKQotQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdXRpbWUuaCB0aW1lLmgpCi0KLVNJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS92ODUwL2dlbmNvZGUuYyBiL3NpbS92ODUwL2dlbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjZTg2Ni4uMDAwMDAwMAotLS0gYS9zaW0vdjg1MC9nZW5jb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX2hlYWRlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9vcGNvZGVzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3RlbXBsYXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotbG9uZyBPcGNvZGVzWzUxMl07Ci1zdGF0aWMgaW50IGN1cm9wPTA7Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCkpCi0gICAgd3JpdGVfaGVhZGVyKCk7Ci0gIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkpCi0gICAgd3JpdGVfdGVtcGxhdGUgKCk7Ci0gIGVsc2UKLSAgICB3cml0ZV9vcGNvZGVzKCk7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9oZWFkZXIgKCkKLXsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICpvcGNvZGU7Ci0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopdjg1MF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHByaW50ZigiaW50IE9QXyVYIFBBUkFNUyAoKHZvaWQpKTtcdFx0LyogJXMgKi9cbiIsCi0JICAgb3Bjb2RlLT5vcGNvZGUsIG9wY29kZS0+bmFtZSk7Ci19Ci0KLQotLyogd3JpdGVfdGVtcGxhdGUgY3JlYXRlcyBhIGZpbGUgYWxsIHJlcXVpcmVkIGZ1bmN0aW9ucywgcmVhZHkgKi8KLS8qIHRvIGJlIGZpbGxlZCBvdXQgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3RlbXBsYXRlICgpCi17Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqb3Bjb2RlOwotICBpbnQgaSxqOwotCi0gIHByaW50ZiAoIiNpbmNsdWRlIFwic2ltLW1haW4uaFwiXG4iKTsKLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJ2ODUwX3NpbS5oXCJcbiIpOwotICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcbiIpOwotCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKXY4NTBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBwcmludGYoIi8qICVzICovXG52b2lkXG5PUF8lWCAodm9pZClcbntcbiIsIG9wY29kZS0+bmFtZSwgb3Bjb2RlLT5vcGNvZGUpOwotCSAgCi0gICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLwotICAgICAgaiA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkgIGludCBmbGFncyA9IHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0KLQkgIGlmIChmbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRyB8IFY4NTBfT1BFUkFORF9DQykpCi0JICAgIGorKzsKLQl9Ci0gICAgICBzd2l0Y2ggKGopCi0JewotCWNhc2UgMDoKLQkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFxuXCIpO1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4XFxuXCIsIE9QWzBdKTtcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXhcXG5cIixPUFswXSxPUFsxXSk7XG4iLAotCQkgIG9wY29kZS0+bmFtZSk7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0sT1BbMl0pO1xuIiwKLQkJICBvcGNvZGUtPm5hbWUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGZwcmludGYgKHN0ZGVyciwiVG9vIG1hbnkgb3BlcmFuZHM6ICVkXG4iLCBqKTsKLQl9Ci0gICAgICBwcmludGYgKCJ9XG5cbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX29wY29kZXMgKCkKLXsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICpvcGNvZGU7Ci0gIGludCBpLCBqOwotICBpbnQgbnVtb3BzOwotICAKLSAgLyogd3JpdGUgb3V0IG9wY29kZSB0YWJsZSAqLwotICBwcmludGYgKCIjaW5jbHVkZSBcInNpbS1tYWluLmhcIlxuIik7Ci0gIHByaW50ZiAoIiNpbmNsdWRlIFwidjg1MF9zaW0uaFwiXG4iKTsKLSAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW1vcHMuaFwiXG5cbiIpOwotICBwcmludGYgKCJzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdID0ge1xuIik7Ci0gIAotICBmb3IgKG9wY29kZSA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKil2ODUwX29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICB7IDB4JXgsMHgleCxPUF8lWCwiLAotCSAgICAgIG9wY29kZS0+b3Bjb2RlLCBvcGNvZGUtPm1hc2ssIG9wY29kZS0+b3Bjb2RlKTsKLSAgICAgIAotICAgICAgT3Bjb2Rlc1tjdXJvcCsrXSA9IG9wY29kZS0+b3Bjb2RlOwotCi0gICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLwotICAgICAgaiA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkgIGludCBmbGFncyA9IHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0KLQkgIGlmIChmbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRyB8IFY4NTBfT1BFUkFORF9DQykpCi0JICAgIGorKzsKLQl9Ci0gICAgICBwcmludGYgKCIlZCx7IixqKTsKLQkgIAotICAgICAgaiA9IDA7Ci0gICAgICBudW1vcHMgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JICBpbnQgZmxhZ3MgPSB2ODUwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgaW50IHNoaWZ0ID0gdjg1MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5zaGlmdDsKLQotCSAgaWYgKGZsYWdzICYgKFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX09QRVJBTkRfU1JHIHwgVjg1MF9PUEVSQU5EX0NDKSkKLQkgICAgewotCSAgICAgIGlmIChqKQotCQlwcmludGYgKCIsICIpOwotCSAgICAgIHByaW50ZiAoIiVkLCVkLCVkIiwgc2hpZnQsCi0JCSAgICAgIHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uYml0cyxmbGFncyk7Ci0JICAgICAgaiA9IDE7Ci0JICAgICAgbnVtb3BzKys7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAobnVtb3BzKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCIwLDAsMCIpOwotCWNhc2UgMToKLQkgIHByaW50ZiAoIiwwLDAsMCIpOwotCX0KLQotICAgICAgcHJpbnRmICgifX0sXG4iKTsKLSAgICB9Ci0gIHByaW50ZiAoInsgMCwwLE5VTEwsMCx7MCwwLDAsMCwwLDB9fSxcbn07XG4iKTsKLX0KZGlmZiAtLWdpdCBhL3NpbS92ODUwL2ludGVycC5jIGIvc2ltL3Y4NTAvaW50ZXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTVlM2EuLjAwMDAwMDAKLS0tIGEvc2ltL3Y4NTAvaW50ZXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJ2ODUwX3NpbS5oIgotI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKLSNpbmNsdWRlICJpdGFibGUuaCIKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgaW5saW5lCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyICogZ2V0X2luc25fbmFtZSAoc2ltX2NwdSAqLCBpbnQpOwotCi0vKiBGb3IgY29tcGF0aWJpbGl0eSAqLwotU0lNX0RFU0Mgc2ltdWxhdG9yOwotCi0KLQotLyogdjg1MCBpbnRlcnJ1cHQgbW9kZWwgKi8KLQotZW51bSBpbnRlcnJ1cHRfdHlwZQotewotICBpbnRfcmVzZXQsCi0gIGludF9ubWksCi0gIGludF9pbnRvdjEsCi0gIGludF9pbnRwMTAsCi0gIGludF9pbnRwMTEsCi0gIGludF9pbnRwMTIsCi0gIGludF9pbnRwMTMsCi0gIGludF9pbnRjbTQsCi0gIG51bV9pbnRfdHlwZXMKLX07Ci0KLWNoYXIgKmludGVycnVwdF9uYW1lc1tdID0gewotICAicmVzZXQiLAotICAibm1pIiwKLSAgImludG92MSIsCi0gICJpbnRwMTAiLAotICAiaW50cDExIiwKLSAgImludHAxMiIsCi0gICJpbnRwMTMiLAotICAiaW50Y200IiwKLSAgTlVMTAotfTsKLQotc3RhdGljIHZvaWQKLWRvX2ludGVycnVwdCAoc2QsIGRhdGEpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICB2b2lkICpkYXRhOwotewotICBjaGFyICoqaW50ZXJydXB0X25hbWUgPSAoY2hhcioqKWRhdGE7Ci0gIGVudW0gaW50ZXJydXB0X3R5cGUgaW50dHlwZTsKLSAgaW50dHlwZSA9IChpbnRlcnJ1cHRfbmFtZSAtIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPmludGVycnVwdF9uYW1lcyk7Ci0KLSAgLyogRm9yIGEgaGFyZHdhcmUgcmVzZXQsIGRyb3AgZXZlcnl0aGluZyBhbmQganVtcCB0byB0aGUgc3RhcnQKLSAgICAgYWRkcmVzcyAqLwotICBpZiAoaW50dHlwZSA9PSBpbnRfcmVzZXQpCi0gICAgewotICAgICAgUEMgPSAwOwotICAgICAgUFNXID0gMHgyMDsKLSAgICAgIEVDUiA9IDA7Ci0gICAgICBzaW1fZW5naW5lX3Jlc3RhcnQgKHNkLCBOVUxMLCBOVUxMLCBOVUxMX0NJQSk7Ci0gICAgfQotCi0gIC8qIERlbGl2ZXIgYW4gTk1JIHdoZW4gYWxsb3dlZCAqLwotICBpZiAoaW50dHlwZSA9PSBpbnRfbm1pKQotICAgIHsKLSAgICAgIGlmIChQU1cgJiBQU1dfTlApCi0JewotCSAgLyogV2UncmUgYWxyZWFkeSB3b3JraW5nIG9uIGFuIE5NSSwgc28gdGhpcyBvbmUgbXVzdCB3YWl0Ci0JICAgICBhcm91bmQgdW50aWwgdGhlIHByZXZpb3VzIG9uZSBpcyBkb25lLiAgVGhlIHByb2Nlc3NvcgotCSAgICAgaWdub3JlcyBzdWJzZXF1ZW50IE5NSXMsIHNvIHdlIGRvbid0IG5lZWQgdG8gY291bnQgdGhlbS4KLQkgICAgIEp1c3Qga2VlcCByZS1zY2hlZHVsaW5nIGEgc2luZ2xlIE5NSSB1bnRpbCBpdCBtYW5hZ2VzIHRvCi0JICAgICBiZSBkZWxpdmVyZWQgKi8KLQkgIGlmIChTVEFURV9DUFUgKHNkLCAwKS0+cGVuZGluZ19ubWkgIT0gTlVMTCkKLQkgICAgc2ltX2V2ZW50c19kZXNjaGVkdWxlIChzZCwgU1RBVEVfQ1BVIChzZCwgMCktPnBlbmRpbmdfbm1pKTsKLQkgIFNUQVRFX0NQVSAoc2QsIDApLT5wZW5kaW5nX25taSA9Ci0JICAgIHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLCBkb19pbnRlcnJ1cHQsIGRhdGEpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBOTUkgY2FuIGJlIGRlbGl2ZXJlZC4gIERvIG5vdCBkZXNjaGVkdWxlIHBlbmRpbmdfbm1pIGFzCi0gICAgICAgICAgICAgdGhhdCwgaWYgc3RpbGwgaW4gdGhlIGV2ZW50IHF1ZXVlLCBpcyBhIHNlY29uZCBOTUkgdGhhdAotICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGRlbGl2ZXJlZCBsYXRlci4gKi8KLQkgIEZFUEMgPSBQQzsKLQkgIEZFUFNXID0gUFNXOwotCSAgLyogU2V0IHRoZSBGRUNDIHBhcnQgb2YgdGhlIEVDUi4gKi8KLQkgIEVDUiAmPSAweDAwMDBmZmZmOwotCSAgRUNSIHw9IDB4MTA7Ci0JICBQU1cgfD0gUFNXX05QOwotCSAgUFNXICY9IH5QU1dfRVA7Ci0JICBQU1cgfD0gUFNXX0lEOwotCSAgUEMgPSAweDEwOwotCSAgc2ltX2VuZ2luZV9yZXN0YXJ0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEpOwotCX0KLSAgICB9Ci0KLSAgLyogZGVsaXZlciBtYXNrYWJsZSBpbnRlcnJ1cHQgd2hlbiBhbGxvd2VkICovCi0gIGlmIChpbnR0eXBlID4gaW50X25taSAmJiBpbnR0eXBlIDwgbnVtX2ludF90eXBlcykKLSAgICB7Ci0gICAgICBpZiAoKFBTVyAmIFBTV19OUCkgfHwgKFBTVyAmIFBTV19JRCkpCi0JewotCSAgLyogQ2FuJ3QgZGVsaXZlciB0aGlzIGludGVycnVwdCwgcmVzY2hlZHVsZSBpdCBmb3IgbGF0ZXIgKi8KLQkgIHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLCBkb19pbnRlcnJ1cHQsIGRhdGEpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzYXZlIGNvbnRleHQgKi8KLQkgIEVJUEMgPSBQQzsKLQkgIEVJUFNXID0gUFNXOwotCSAgLyogRGlzYWJsZSBmdXJ0aGVyIGludGVycnVwdHMuICAqLwotCSAgUFNXIHw9IFBTV19JRDsKLQkgIC8qIEluZGljYXRlIHRoYXQgd2UncmUgZG9pbmcgaW50ZXJydXB0IG5vdCBleGNlcHRpb24gcHJvY2Vzc2luZy4gICovCi0JICBQU1cgJj0gflBTV19FUDsKLQkgIC8qIENsZWFyIHRoZSBFSUNDIHBhcnQgb2YgdGhlIEVDUiwgd2lsbCBzZXQgYmVsb3cuICovCi0JICBFQ1IgJj0gMHhmZmZmMDAwMDsKLQkgIHN3aXRjaCAoaW50dHlwZSkKLQkgICAgewotCSAgICBjYXNlIGludF9pbnRvdjE6Ci0JICAgICAgUEMgPSAweDgwOwotCSAgICAgIEVDUiB8PSAweDgwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGludF9pbnRwMTA6Ci0JICAgICAgUEMgPSAweDkwOwotCSAgICAgIEVDUiB8PSAweDkwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGludF9pbnRwMTE6Ci0JICAgICAgUEMgPSAweGEwOwotCSAgICAgIEVDUiB8PSAweGEwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGludF9pbnRwMTI6Ci0JICAgICAgUEMgPSAweGIwOwotCSAgICAgIEVDUiB8PSAweGIwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGludF9pbnRwMTM6Ci0JICAgICAgUEMgPSAweGMwOwotCSAgICAgIEVDUiB8PSAweGMwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGludF9pbnRjbTQ6Ci0JICAgICAgUEMgPSAweGQwOwotCSAgICAgIEVDUiB8PSAweGQwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIFNob3VsZCBuZXZlciBiZSBwb3NzaWJsZS4gICovCi0JICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIE5VTEwsIE5VTExfQ0lBLAotCQkJCSJkb19pbnRlcnJ1cHQgLSBpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2giKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoc2QsIE5VTEwsIE5VTEwsIE5VTExfQ0lBKTsKLSAgICB9Ci0gIAotICAvKiBzb21lIG90aGVyIGludGVycnVwdD8gKi8KLSAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIE5VTEwsIE5VTExfQ0lBLAotCQkgICAgImRvX2ludGVycnVwdCAtIGludGVybmFsIGVycm9yIC0gaW50ZXJydXB0ICVkIHVua25vd24iLAotCQkgICAgaW50dHlwZSk7Ci19Ci0KLS8qIFJldHVybiBuYW1lIG9mIGFuIGluc24sIHVzZWQgYnkgaW5zbiBwcm9maWxpbmcuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfaW5zbl9uYW1lIChzaW1fY3B1ICpjcHUsIGludCBpKQotewotICByZXR1cm4gaXRhYmxlW2ldLm5hbWU7Ci19Ci0KLS8qIFRoZXNlIGRlZmF1bHQgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZXhwZWN0ZWQgdXNhZ2UgZm9yIHRoZSBjaGlwLiAgKi8KLQotdWludDMyIE9QWzRdOwotCi0KLVNJTV9ERVNDCi1zaW1fb3BlbiAoa2luZCwgY2IsIGFiZmQsIGFyZ3YpCi0gICAgIFNJTV9PUEVOX0tJTkQga2luZDsKLSAgICAgaG9zdF9jYWxsYmFjayAqY2I7Ci0gICAgIHN0cnVjdCBfYmZkICphYmZkOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNiKTsKLSAgaW50IG1hY2g7Ci0KLSAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKLQotICAvKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotICBzaW11bGF0b3IgPSBzZDsKLQotICAvKiBGSVhNRTogc2hvdWxkIGJlIGJldHRlciB3YXkgb2Ygc2V0dGluZyB1cCBpbnRlcnJ1cHRzICovCi0gIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjID0gJihQQyk7Ci0gIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyA9IHNpemVvZiAoUEMpOwotICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfaGFuZGxlciA9IGRvX2ludGVycnVwdDsKLSAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X25hbWVzID0gaW50ZXJydXB0X25hbWVzOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lY2hhbmlzbSBmb3IgZG9pbmcgaW5zbiBwcm9maWxpbmcuICAqLwotICBDUFVfSU5TTl9OQU1FIChTVEFURV9DUFUgKHNkLCAwKSkgPSBnZXRfaW5zbl9uYW1lOwotICBDUFVfTUFYX0lOU05TIChTVEFURV9DUFUgKHNkLCAwKSkgPSBucl9pdGFibGVfZW50cmllczsKLQotICBpZiAoc2ltX3ByZV9hcmd2X2luaXQgKHNkLCBhcmd2WzBdKSAhPSBTSU1fUkNfT0spCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogQWxsb2NhdGUgY29yZSBtYW5hZ2VkIG1lbW9yeSAqLwotCi0gIC8qICJNaXJyb3IiIHRoZSBST00gYWRkcmVzc2VzIGJlbG93IDFNQi4gKi8KLSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMCwweDEwMDAwMCwweCVseCIsIFY4NTBfUk9NX1NJWkUpOwotICAvKiBDaHVuayBvZiByYW0gYWRqYWNlbnQgdG8gcm9tICovCi0gIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4MTAwMDAwLDB4JWx4IiwgVjg1MF9MT1dfRU5ELTB4MTAwMDAwKTsKLSAgLyogcGVyaXBoZXJhbCBJL08gcmVnaW9uIC0gbWlycm9yIDFLIGFjcm9zcyA0ayAoMHgxMDAwKSAqLwotICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4ZmZmMDAwLDB4MTAwMCwxMDI0Iik7Ci0gIC8qIHNpbWlsYXJseSBpZiBpbiB0aGUgaW50ZXJuYWwgUkFNIHJlZ2lvbiAqLwotICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4ZmZlMDAwLDB4MTAwMCwxMDI0Iik7Ci0KLSAgLyogZ2V0b3B0IHdpbGwgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2Ugc28gd2UganVzdCBoYXZlIHRvIGV4aXQgaWYgdGhpcyBmYWlscy4KLSAgICAgRklYTUU6IEhtbW0uLi4gIGluIHRoZSBjYXNlIG9mIGdkYiB3ZSBuZWVkIGdldG9wdCB0byBjYWxsCi0gICAgIHByaW50X2ZpbHRlcmVkLiAgKi8KLSAgaWYgKHNpbV9wYXJzZV9hcmdzIChzZCwgYXJndikgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MsCi0JIGZpbGUgZGVzY3JpcHRvciBsZWFrcywgZXRjLiAgKi8KLSAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogY2hlY2sgZm9yL2VzdGFibGlzaCB0aGUgYSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLwotICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCi0JCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAotCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCi0JCQkgICAgOiBOVUxMKSwKLQkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIGVzdGFibGlzaCBhbnkgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwotICBpZiAoc2ltX2NvbmZpZyAoc2QpICE9IFNJTV9SQ19PSykKLSAgICB7Ci0gICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCi0gICAgewotICAgICAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKLQkgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLwotICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotCi0gIC8qIGRldGVybWluZSB0aGUgbWFjaGluZSB0eXBlICovCi0gIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSAhPSBOVUxMCi0gICAgICAmJiBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+YXJjaCA9PSBiZmRfYXJjaF92ODUwKQotICAgIG1hY2ggPSBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaDsKLSAgZWxzZQotICAgIG1hY2ggPSBiZmRfbWFjaF92ODUwOyAvKiBkZWZhdWx0ICovCi0KLSAgLyogc2V0IG1hY2hpbmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfdjg1MDoKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOgotICAgICAgU1RBVEVfQ1BVIChzZCwgMCktPnBzd19tYXNrID0gKFBTV19OUCB8IFBTV19FUCB8IFBTV19JRCB8IFBTV19TQVQKLQkJCQkgICAgIHwgUFNXX0NZIHwgUFNXX09WIHwgUFNXX1MgfCBQU1dfWik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYToKLSAgICAgIFBTVyB8PSBQU1dfVVM7Ci0gICAgICBTVEFURV9DUFUgKHNkLCAwKS0+cHN3X21hc2sgPSAoUFNXX1VTCi0JCQkJICAgICB8IFBTV19OUCB8IFBTV19FUCB8IFBTV19JRCB8IFBTV19TQVQKLQkJCQkgICAgIHwgUFNXX0NZIHwgUFNXX09WIHwgUFNXX1MgfCBQU1dfWik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHNkOwotfQotCi0KLXZvaWQKLXNpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHF1aXR0aW5nOwotewotICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOwotfQotCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBwcm9nX2JmZCwgYXJndiwgZW52KQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgc3RydWN0IF9iZmQgKnByb2dfYmZkOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgbWVtc2V0ICgmU3RhdGUsIDAsIHNpemVvZiAoU3RhdGUpKTsKLSAgaWYgKHByb2dfYmZkICE9IE5VTEwpCi0gICAgUEMgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKHByb2dfYmZkKTsKLSAgLyogRm9yIHY4NTBlYSwgc2V0IFBTV1tVU10gYnkgZGVmYXVsdCAqLwotICBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCkgIT0gTlVMTAotICAgICAgJiYgU1RBVEVfQVJDSElURUNUVVJFIChzZCktPmFyY2ggPT0gYmZkX2FyY2hfdjg1MAotICAgICAgJiYgU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2ggPT0gYmZkX21hY2hfdjg1MGVhKQotICAgIFBTVyB8PSBQU1dfVVM7Ci0gIHJldHVybiBTSU1fUkNfT0s7Ci19Ci0KLWludAotc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gICoodW5zaWduZWQzMiopbWVtb3J5ID0gSDJUXzQgKFN0YXRlLnJlZ3Nbcm5dKTsKLSAgcmV0dXJuIC0xOwotfQotIAotaW50Ci1zaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcm47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgU3RhdGUucmVnc1tybl0gPSBUMkhfNCAoKih1bnNpZ25lZDMyKiltZW1vcnkpOwotICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQKLXNpbV9kb19jb21tYW5kIChzZCwgY21kKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgY2hhciAqY21kOwotewotICBjaGFyICptbV9jbWQgPSAibWVtb3J5LW1hcCI7Ci0gIGNoYXIgKmludF9jbWQgPSAiaW50ZXJydXB0IjsKLQotICBpZiAoc2ltX2FyZ3NfY29tbWFuZCAoc2QsIGNtZCkgIT0gU0lNX1JDX09LKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChjbWQsIG1tX2NtZCwgc3RybGVuIChtbV9jbWQpID09IDApKQotCXNpbV9pb19lcHJpbnRmIChzZCwgImBtZW1vcnktbWFwJyBjb21tYW5kIHJlcGxhY2VkIGJ5IGBzaW0gbWVtb3J5J1xuIik7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChjbWQsIGludF9jbWQsIHN0cmxlbiAoaW50X2NtZCkpID09IDApCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiYGludGVycnVwdCcgY29tbWFuZCByZXBsYWNlZCBieSBgc2ltIHdhdGNoJ1xuIik7Ci0gICAgICBlbHNlCi0Jc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBjb21tYW5kIGAlcydcbiIsIGNtZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvc2ltLW1haW4uaCBiL3NpbS92ODUwL3NpbS1tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWEzMWYuLjAwMDAwMDAKLS0tIGEvc2ltL3Y4NTAvc2ltLW1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0jaWZuZGVmIFNJTV9NQUlOX0gKLSNkZWZpbmUgU0lNX01BSU5fSAotCi0vKiBHZW5lcmFsIGNvbmZpZyBvcHRpb25zICovCi0KLSNkZWZpbmUgV0lUSF9DT1JFCi0jZGVmaW5lIFdJVEhfTU9EVUxPX01FTU9SWSAxCi0jZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQotCi0KLS8qIFRoZSB2ODUwIGhhcyAzMmJpdCB3b3JkcywgbnVtYmVyZWQgMzEgKE1TQikgdG8gMCAoTFNCKSAqLwotCi0jZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfTVNCIDMxCi0KLQotI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKLSNpbmNsdWRlICJzaW0tc2lnbmFsLmgiCi0KLXR5cGVkZWYgYWRkcmVzc193b3JkIHNpbV9jaWE7Ci0KLSNpbmNsdWRlICJzaW0tYmFzZS5oIgotCi0jaW5jbHVkZSAic2ltb3BzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0KLQotdHlwZWRlZiBzaWduZWQ4IGludDg7Ci10eXBlZGVmIHVuc2lnbmVkOCB1aW50ODsKLXR5cGVkZWYgc2lnbmVkMTYgaW50MTY7Ci10eXBlZGVmIHVuc2lnbmVkMTYgdWludDE2OwotdHlwZWRlZiBzaWduZWQzMiBpbnQzMjsKLXR5cGVkZWYgdW5zaWduZWQzMiB1aW50MzI7Ci10eXBlZGVmIHVuc2lnbmVkMzIgcmVnX3Q7Ci0KLQotLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2Nlc3NvcjsgcmVnaXN0ZXJzLCBtZW1vcnksIGV0Yy4gICovCi0KLXR5cGVkZWYgc3RydWN0IF92ODUwX3JlZ3MgewotICByZWdfdCByZWdzWzMyXTsJCS8qIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgKi8KLSAgcmVnX3Qgc3JlZ3NbMzJdOwkJLyogc3lzdGVtIHJlZ2lzdGVycywgaW5jbHVkaW5nIHBzdyAqLwotICByZWdfdCBwYzsKLSAgaW50IGR1bW15X21lbTsJCS8qIHdoZXJlIGludmFsaWQgYWNjZXNzZXMgZ28gKi8KLX0gdjg1MF9yZWdzOwotCi1zdHJ1Y3QgX3NpbV9jcHUKLXsKLSAgLyogLi4uIHNpbXVsYXRvciBzcGVjaWZpYyBtZW1iZXJzIC4uLiAqLwotICB2ODUwX3JlZ3MgcmVnOwotICByZWdfdCBwc3dfbWFzazsgICAgICAgICAgICAgICAvKiBvbmx5IGFsbG93IG5vbi1yZXNlcnZlZCBiaXRzIHRvIGJlIHNldCAqLwotICBzaW1fZXZlbnQgKnBlbmRpbmdfbm1pOwotICAvKiAuLi4gYmFzZSB0eXBlIC4uLiAqLwotICBzaW1fY3B1X2Jhc2UgYmFzZTsKLX07Ci0KLSNkZWZpbmUgQ0lBX0dFVChDUFUpICgoQ1BVKS0+cmVnLnBjICsgMCkKLSNkZWZpbmUgQ0lBX1NFVChDUFUsVkFMKSAoKENQVSktPnJlZy5wYyA9IChWQUwpKQotCi1zdHJ1Y3Qgc2ltX3N0YXRlIHsKLSAgc2ltX2NwdSBjcHVbTUFYX05SX1BST0NFU1NPUlNdOwotI2lmIChXSVRIX1NNUCkKLSNkZWZpbmUgU1RBVEVfQ1BVKHNkLG4pICgmKHNkKS0+Y3B1W25dKQotI2Vsc2UKLSNkZWZpbmUgU1RBVEVfQ1BVKHNkLG4pICgmKHNkKS0+Y3B1WzBdKQotI2VuZGlmCi0jaWYgMAotICBTSU1fQUREUiByb21fc2l6ZTsKLSAgU0lNX0FERFIgbG93X2VuZDsKLSAgU0lNX0FERFIgaGlnaF9zdGFydDsKLSAgU0lNX0FERFIgaGlnaF9iYXNlOwotICB2b2lkICptZW07Ci0jZW5kaWYKLSAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKLX07Ci0KLS8qIEZvciBjb21wYXRpYmlsaXR5LCB1bnRpbCBhbGwgZnVuY3Rpb25zIGNvbnZlcnRlZCB0byBwYXNzaW5nCi0gICBTSU1fREVTQyBhcyBhbiBhcmd1bWVudCAqLwotZXh0ZXJuIFNJTV9ERVNDIHNpbXVsYXRvcjsKLQotCi0jZGVmaW5lIFY4NTBfUk9NX1NJWkUgMHg4MDAwCi0jZGVmaW5lIFY4NTBfTE9XX0VORCAweDIwMDAwMAotI2RlZmluZSBWODUwX0hJR0hfU1RBUlQgMHhmZmUwMDAKLQotCi0vKiBCZWNhdXNlIHdlIGFyZSBzdGlsbCB1c2luZyB0aGUgb2xkIHNlbWFudGljIHRhYmxlLCBwcm92aWRlIGNvbXBhdAotICAgbWFjcm8ncyB0aGF0IHN0b3JlIHRoZSBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgb2xkIHNpbW9wcyBleHBlY3RzCi0gICBpdC4gKi8KLQotZXh0ZXJuIHVpbnQzMiBPUFs0XTsKLSNpZiAwCi1PUFswXSA9IGluc3QgJiAweDFmOyAgICAgICAgICAgLyogUlJSUlIgLT4gcmVnMSAqLwotT1BbMV0gPSAoaW5zdCA+PiAxMSkgJiAweDFmOyAgIC8qIHJycnJyIC0+IHJlZzIgKi8KLU9QWzJdID0gKGluc3QgPj4gMTYpICYgMHhmZmZmOyAvKiB3d3d3dyAtPiByZWczIE9SIGltbTE2ICovCi1PUFszXSA9IGluc3Q7Ci0jZW5kaWYKLQotI2RlZmluZSBTQVZFXzEgXAotUEMgPSBjaWE7IFwKLU9QWzBdID0gaW5zdHJ1Y3Rpb25fMCAmIDB4MWY7IFwKLU9QWzFdID0gKGluc3RydWN0aW9uXzAgPj4gMTEpICYgMHgxZjsgXAotT1BbMl0gPSAwOyBcCi1PUFszXSA9IGluc3RydWN0aW9uXzAKLQotI2RlZmluZSBDT01QQVRfMShDQUxMKSBcCi1TQVZFXzE7IFwKLVBDICs9IChDQUxMKTsgXAotbmlhID0gUEMKLQotI2RlZmluZSBTQVZFXzIgXAotUEMgPSBjaWE7IFwKLU9QWzBdID0gaW5zdHJ1Y3Rpb25fMCAmIDB4MWY7IFwKLU9QWzFdID0gKGluc3RydWN0aW9uXzAgPj4gMTEpICYgMHgxZjsgXAotT1BbMl0gPSBpbnN0cnVjdGlvbl8xOyBcCi1PUFszXSA9IChpbnN0cnVjdGlvbl8xIDw8IDE2KSB8IGluc3RydWN0aW9uXzAKLQotI2RlZmluZSBDT01QQVRfMihDQUxMKSBcCi1TQVZFXzI7IFwKLVBDICs9IChDQUxMKTsgXAotbmlhID0gUEMKLQotCi0vKiBuZXcgKi8KLSNkZWZpbmUgR1IgICgoQ1BVKS0+cmVnLnJlZ3MpCi0jZGVmaW5lIFNSICAoKENQVSktPnJlZy5zcmVncykKLQotLyogb2xkICovCi0jZGVmaW5lIFN0YXRlICAgIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCktPnJlZykKLSNkZWZpbmUgUEMJKFN0YXRlLnBjKQotI2RlZmluZSBTUAkoU3RhdGUucmVnc1szXSkKLSNkZWZpbmUgRVAJKFN0YXRlLnJlZ3NbMzBdKQotCi0jZGVmaW5lIEVJUEMgIChTdGF0ZS5zcmVnc1swXSkKLSNkZWZpbmUgRUlQU1cgKFN0YXRlLnNyZWdzWzFdKQotI2RlZmluZSBGRVBDICAoU3RhdGUuc3JlZ3NbMl0pCi0jZGVmaW5lIEZFUFNXIChTdGF0ZS5zcmVnc1szXSkKLSNkZWZpbmUgRUNSICAgKFN0YXRlLnNyZWdzWzRdKQotI2RlZmluZSBQU1cgICAoU3RhdGUuc3JlZ3NbNV0pCi0jZGVmaW5lIENUUEMgIChTUlsxNl0pCi0jZGVmaW5lIENUUFNXIChTUlsxN10pCi0jZGVmaW5lIERCUEMgIChTdGF0ZS5zcmVnc1sxOF0pCi0jZGVmaW5lIERCUFNXIChTdGF0ZS5zcmVnc1sxOV0pCi0jZGVmaW5lIENUQlAgIChTdGF0ZS5zcmVnc1syMF0pCi0KLSNkZWZpbmUgUFNXX1VTIEJJVDMyICg4KQotI2RlZmluZSBQU1dfTlAgMHg4MAotI2RlZmluZSBQU1dfRVAgMHg0MAotI2RlZmluZSBQU1dfSUQgMHgyMAotI2RlZmluZSBQU1dfU0FUIDB4MTAKLSNkZWZpbmUgUFNXX0NZIDB4OAotI2RlZmluZSBQU1dfT1YgMHg0Ci0jZGVmaW5lIFBTV19TIDB4MgotI2RlZmluZSBQU1dfWiAweDEKLQotI2RlZmluZSBTRVhUMyh4KQkoKCgoeCkmMHg3KV4ofjB4MykpKzB4NCkJCi0KLS8qIHNpZ24tZXh0ZW5kIGEgNC1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ0KHgpCSgoKCh4KSYweGYpXih+MHg3KSkrMHg4KQkKLQotLyogc2lnbi1leHRlbmQgYSA1LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDUoeCkJKCgoKHgpJjB4MWYpXih+MHhmKSkrMHgxMCkJCi0KLS8qIHNpZ24tZXh0ZW5kIGEgOS1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQ5KHgpCSgoKCh4KSYweDFmZileKH4weGZmKSkrMHgxMDApCi0KLS8qIHNpZ24tZXh0ZW5kIGEgMjItYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUMjIoeCkJKCgoKHgpJjB4M2ZmZmZmKV4ofjB4MWZmZmZmKSkrMHgyMDAwMDApCi0KLS8qIHNpZ24gZXh0ZW5kIGEgNDAgYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUNDAoeCkJKCgoKHgpICYgVU5TSUdORUQ2NCAoMHhmZmZmZmZmZmZmKSkgXAotCQkJICBeICh+VU5TSUdORUQ2NCAoMHg3ZmZmZmZmZmZmKSkpIFwKLQkJCSArIFVOU0lHTkVENjQgKDB4ODAwMDAwMDAwMCkpCi0KLS8qIHNpZ24gZXh0ZW5kIGEgNDQgYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUNDQoeCkJKCgoKHgpICYgVU5TSUdORUQ2NCAoMHhmZmZmZmZmZmZmZikpIFwKLQkJCSAgXiAofiBVTlNJR05FRDY0ICgweDdmZmZmZmZmZmZmKSkpIFwKLQkJCSArIFVOU0lHTkVENjQgKDB4ODAwMDAwMDAwMDApKQotCi0vKiBzaWduIGV4dGVuZCBhIDYwIGJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDYwKHgpCSgoKCh4KSAmIFVOU0lHTkVENjQgKDB4ZmZmZmZmZmZmZmZmZmZmKSkgXAotCQkJICBeICh+IFVOU0lHTkVENjQgKDB4N2ZmZmZmZmZmZmZmZmZmKSkpIFwKLQkJCSArIFVOU0lHTkVENjQgKDB4ODAwMDAwMDAwMDAwMDAwKSkKLQotLyogTm8gc2lnbiBleHRlbnNpb24gKi8KLSNkZWZpbmUgTk9QKHgpCQkoeCkKLQotI2RlZmluZSBJTkNfQUREUih4LGkpCXggPSAoKFN0YXRlLk1EICYmIHggPT0gTU9EX0UpID8gTU9EX1MgOiAoeCkrKGkpKQotCi0jZGVmaW5lIFJMVyh4KSBsb2FkX21lbSAoeCwgNCkKLQotLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgKi8KLQotI2RlZmluZSBJTUVNMTYoRUEpIFwKLXNpbV9jb3JlX3JlYWRfYWxpZ25lZF8yIChDUFUsIFBDLCBleGVjX21hcCwgKEVBKSkKLQotI2RlZmluZSBJTUVNMTZfSU1NRUQoRUEsTikgXAotc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzIgKFNUQVRFX0NQVSAoc2QsIDApLCBcCi0JCQkgUEMsIGV4ZWNfbWFwLCAoRUEpICsgKE4pICogMikKLQotI2RlZmluZSBsb2FkX21lbShBRERSLExFTikgXAotc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfIyNMRU4gKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgXAotCQkJICAgICAgIFBDLCByZWFkX21hcCwgKEFERFIpKQotCi0jZGVmaW5lIHN0b3JlX21lbShBRERSLExFTixEQVRBKSBcCi1zaW1fY29yZV93cml0ZV91bmFsaWduZWRfIyNMRU4gKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgXAotCQkJCVBDLCB3cml0ZV9tYXAsIChBRERSKSwgKERBVEEpKQotCi0KLS8qIGNvbXBhcmUgY2NjYyBmaWVsZCBhZ2FpbnN0IFBTVyAqLwotaW50IGNvbmRpdGlvbl9tZXQgKHVuc2lnbmVkIGNvZGUpOwotCi0KLS8qIERlYnVnL3RyYWNpbmcgY2FsbHMgKi8KLQotZW51bSBvcF90eXBlcwotewotICBPUF9VTktOT1dOLAotICBPUF9OT05FLAotICBPUF9UUkFQLAotICBPUF9SRUcsCi0gIE9QX1JFR19SRUcsCi0gIE9QX1JFR19SRUdfQ01QLAotICBPUF9SRUdfUkVHX01PVkUsCi0gIE9QX0lNTV9SRUcsCi0gIE9QX0lNTV9SRUdfQ01QLAotICBPUF9JTU1fUkVHX01PVkUsCi0gIE9QX0NPTkRfQlIsCi0gIE9QX0xPQUQxNiwKLSAgT1BfU1RPUkUxNiwKLSAgT1BfTE9BRDMyLAotICBPUF9TVE9SRTMyLAotICBPUF9KVU1QLAotICBPUF9JTU1fUkVHX1JFRywKLSAgT1BfVUlNTV9SRUdfUkVHLAotICBPUF9JTU0xNl9SRUdfUkVHLAotICBPUF9VSU1NMTZfUkVHX1JFRywKLSAgT1BfQklULAotICBPUF9FWDEsCi0gIE9QX0VYMiwKLSAgT1BfTERTUiwKLSAgT1BfU1RTUiwKLSAgT1BfQklUX0NIQU5HRSwKLSAgT1BfUkVHX1JFR19SRUcsCi0gIE9QX1JFR19SRUczLAotICBPUF9JTU1fUkVHX1JFR19SRUcsCi0gIE9QX1BVU0hQT1AxLAotICBPUF9QVVNIUE9QMiwKLSAgT1BfUFVTSFBPUDMsCi19OwotCi0jaWZkZWYgREVCVUcKLXZvaWQgdHJhY2VfaW5wdXQgUEFSQU1TICgoY2hhciAqbmFtZSwgZW51bSBvcF90eXBlcyB0eXBlLCBpbnQgc2l6ZSkpOwotdm9pZCB0cmFjZV9vdXRwdXQgUEFSQU1TICgoZW51bSBvcF90eXBlcyByZXN1bHQpKTsKLXZvaWQgdHJhY2VfcmVzdWx0IFBBUkFNUyAoKGludCBoYXNfcmVzdWx0LCB1bnNpZ25lZDMyIHJlc3VsdCkpOwotCi1leHRlcm4gaW50IHRyYWNlX251bV92YWx1ZXM7Ci1leHRlcm4gdW5zaWduZWQzMiB0cmFjZV92YWx1ZXNbXTsKLWV4dGVybiB1bnNpZ25lZDMyIHRyYWNlX3BjOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnRyYWNlX25hbWU7Ci1leHRlcm4gaW50IHRyYWNlX21vZHVsZTsKLQotI2RlZmluZSBUUkFDRV9CUkFOQ0gwKCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgeyBcCi0gICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQlJBTkNIX0lEWDsgXAotICAgIHRyYWNlX3BjID0gY2lhOyBcCi0gICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAotICAgIHRyYWNlX251bV92YWx1ZXMgPSAwOyBcCi0gICAgdHJhY2VfcmVzdWx0ICgxLCAobmlhKSk7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0JSQU5DSDEoSU4xKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0JSQU5DSF9QIChDUFUpKSB7IFwKLSAgICB0cmFjZV9tb2R1bGUgPSBUUkFDRV9CUkFOQ0hfSURYOyBcCi0gICAgdHJhY2VfcGMgPSBjaWE7IFwKLSAgICB0cmFjZV9uYW1lID0gaXRhYmxlW01ZX0lOREVYXS5uYW1lOyBcCi0gICAgdHJhY2VfdmFsdWVzWzBdID0gKElOMSk7IFwKLSAgICB0cmFjZV9udW1fdmFsdWVzID0gMTsgXAotICAgIHRyYWNlX3Jlc3VsdCAoMSwgKG5pYSkpOyBcCi0gIH0gXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkFDRV9CUkFOQ0gyKElOMSwgSU4yKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX0JSQU5DSF9QIChDUFUpKSB7IFwKLSAgICB0cmFjZV9tb2R1bGUgPSBUUkFDRV9CUkFOQ0hfSURYOyBcCi0gICAgdHJhY2VfcGMgPSBjaWE7IFwKLSAgICB0cmFjZV9uYW1lID0gaXRhYmxlW01ZX0lOREVYXS5uYW1lOyBcCi0gICAgdHJhY2VfdmFsdWVzWzBdID0gKElOMSk7IFwKLSAgICB0cmFjZV92YWx1ZXNbMV0gPSAoSU4yKTsgXAotICAgIHRyYWNlX251bV92YWx1ZXMgPSAyOyBcCi0gICAgdHJhY2VfcmVzdWx0ICgxLCAobmlhKSk7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0JSQU5DSDMoSU4xLCBJTjIsIElOMykgXAotZG8geyBcCi0gIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgeyBcCi0gICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQlJBTkNIX0lEWDsgXAotICAgIHRyYWNlX3BjID0gY2lhOyBcCi0gICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAotICAgIHRyYWNlX3ZhbHVlc1swXSA9IChJTjEpOyBcCi0gICAgdHJhY2VfdmFsdWVzWzFdID0gKElOMik7IFwKLSAgICB0cmFjZV92YWx1ZXNbMl0gPSAoSU4zKTsgXAotICAgIHRyYWNlX251bV92YWx1ZXMgPSAzOyBcCi0gICAgdHJhY2VfcmVzdWx0ICgxLCAobmlhKSk7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0xEKEFERFIsUkVTVUxUKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX01FTU9SWV9QIChDUFUpKSB7IFwKLSAgICB0cmFjZV9tb2R1bGUgPSBUUkFDRV9NRU1PUllfSURYOyBcCi0gICAgdHJhY2VfcGMgPSBjaWE7IFwKLSAgICB0cmFjZV9uYW1lID0gaXRhYmxlW01ZX0lOREVYXS5uYW1lOyBcCi0gICAgdHJhY2VfdmFsdWVzWzBdID0gKEFERFIpOyBcCi0gICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7IFwKLSAgICB0cmFjZV9yZXN1bHQgKDEsIChSRVNVTFQpKTsgXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfTERfTkFNRShOQU1FLCBBRERSLFJFU1VMVCkgXAotZG8geyBcCi0gIGlmIChUUkFDRV9NRU1PUllfUCAoQ1BVKSkgeyBcCi0gICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfTUVNT1JZX0lEWDsgXAotICAgIHRyYWNlX3BjID0gY2lhOyBcCi0gICAgdHJhY2VfbmFtZSA9IChOQU1FKTsgXAotICAgIHRyYWNlX3ZhbHVlc1swXSA9IChBRERSKTsgXAotICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOyBcCi0gICAgdHJhY2VfcmVzdWx0ICgxLCAoUkVTVUxUKSk7IFwKLSAgfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX1NUKEFERFIsUkVTVUxUKSBcCi1kbyB7IFwKLSAgaWYgKFRSQUNFX01FTU9SWV9QIChDUFUpKSB7IFwKLSAgICB0cmFjZV9tb2R1bGUgPSBUUkFDRV9NRU1PUllfSURYOyBcCi0gICAgdHJhY2VfcGMgPSBjaWE7IFwKLSAgICB0cmFjZV9uYW1lID0gaXRhYmxlW01ZX0lOREVYXS5uYW1lOyBcCi0gICAgdHJhY2VfdmFsdWVzWzBdID0gKEFERFIpOyBcCi0gICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7IFwKLSAgICB0cmFjZV9yZXN1bHQgKDEsIChSRVNVTFQpKTsgXAotICB9IFwKLX0gd2hpbGUgKDApCi0KLSNlbHNlCi0jZGVmaW5lIHRyYWNlX2lucHV0KE5BTUUsIElOMSwgSU4yKQotI2RlZmluZSB0cmFjZV9vdXRwdXQoUkVTVUxUKQotI2RlZmluZSB0cmFjZV9yZXN1bHQoSEFTX1JFU1VMVCwgUkVTVUxUKQotCi0jZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDAoKQotI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQxKElOMCkKLSNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMihJTjAsIElOMSkKLSNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMihJTjAsIElOMSkKLSNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMihJTjAsIElOMSBJTlMyKQotI2RlZmluZSBUUkFDRV9BTFVfUkVTVUxUKFJFU1VMVCkKLQotI2RlZmluZSBUUkFDRV9CUkFOQ0gwKCkKLSNkZWZpbmUgVFJBQ0VfQlJBTkNIMShJTjEpCi0jZGVmaW5lIFRSQUNFX0JSQU5DSDIoSU4xLCBJTjIpCi0jZGVmaW5lIFRSQUNFX0JSQU5DSDIoSU4xLCBJTjIsIElOMykKLQotI2RlZmluZSBUUkFDRV9MRChBRERSLFJFU1VMVCkKLSNkZWZpbmUgVFJBQ0VfU1QoQUREUixSRVNVTFQpCi0KLSNlbmRpZgotCi0KLWV4dGVybiB2b2lkIGRpdnVuICggdW5zaWduZWQgaW50ICAgICAgIE4sCi0JCSAgICB1bnNpZ25lZCBsb25nIGludCAgYWxzLAotCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgIHNmaSwKLQkJICAgIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICogIHF1b3RpZW50X3B0ciwKLQkJICAgIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICogIHJlbWFpbmRlcl9wdHIsCi0JCSAgICBib29sZWFuICogICAgICAgICAgb3ZlcmZsb3dfcHRyCi0JCSAgICApOwotZXh0ZXJuIHZvaWQgZGl2biAoIHVuc2lnbmVkIGludCAgICAgICBOLAotCQkgICB1bnNpZ25lZCBsb25nIGludCAgYWxzLAotCQkgICB1bnNpZ25lZCBsb25nIGludCAgc2ZpLAotCQkgICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICogIHF1b3RpZW50X3B0ciwKLQkJICAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAqICByZW1haW5kZXJfcHRyLAotCQkgICBib29sZWFuICogICAgICAgICAgb3ZlcmZsb3dfcHRyCi0JCSAgICk7Ci1leHRlcm4gaW50IHR5cGUxX3JlZ3NbXTsKLWV4dGVybiBpbnQgdHlwZTJfcmVnc1tdOwotZXh0ZXJuIGludCB0eXBlM19yZWdzW107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvc2ltb3BzLmMgYi9zaW0vdjg1MC9zaW1vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmNDNlZS4uMDAwMDAwMAotLS0gYS9zaW0vdjg1MC9zaW1vcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MzMgKzAsMCBAQAotI2luY2x1ZGUgInNpbS1tYWluLmgiCi0jaW5jbHVkZSAidjg1MF9zaW0uaCIKLSNpbmNsdWRlICJzaW1vcHMuaCIKLQotI2lmZGVmIEhBVkVfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAidGFyZy12YWxzLmgiCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBhbiBhcnJheSBvZiB0aGUgYml0IHBvc2l0aW9ucyBvZiByZWdpc3RlcnMgcjIwIC4uIHIzMSBpbgotICAgdGhhdCBvcmRlciBpbiBhIHByZXBhcmUvZGlzcG9zZSBpbnN0cnVjdGlvbi4gICovCi1pbnQgdHlwZTFfcmVnc1sxMl0gPSB7IDI3LCAyNiwgMjUsIDI0LCAzMSwgMzAsIDI5LCAyOCwgMjMsIDIyLCAwLCAyMSB9OwotLyogVGhpcyBpcyBhbiBhcnJheSBvZiB0aGUgYml0IHBvc2l0aW9ucyBvZiByZWdpc3RlcnMgcjE2IC4uIHIzMSBpbgotICAgdGhhdCBvcmRlciBpbiBhIHB1c2gvcG9wIGluc3RydWN0aW9uLiAgKi8KLWludCB0eXBlMl9yZWdzWzE2XSA9IHsgMywgMiwgMSwgMCwgMjcsIDI2LCAyNSwgMjQsIDMxLCAzMCwgMjksIDI4LCAyMywgMjIsIDIwLCAyMX07Ci0vKiBUaGlzIGlzIGFuIGFycmF5IG9mIHRoZSBiaXQgcG9zaXRpb25zIG9mIHJlZ2lzdGVycyByMSAuLiByMTUgaW4KLSAgIHRoYXQgb3JkZXIgaW4gYSBwdXNoL3BvcCBpbnN0cnVjdGlvbi4gICovCi1pbnQgdHlwZTNfcmVnc1sxNV0gPSB7IDIsIDEsIDAsIDI3LCAyNiwgMjUsIDI0LCAzMSwgMzAsIDI5LCAyOCwgMjMsIDIyLCAyMCwgMjF9OwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYgU0laRV9JTlNUUlVDVElPTgotI2RlZmluZSBTSVpFX0lOU1RSVUNUSU9OIDE4Ci0jZW5kaWYKLQotI2lmbmRlZiBTSVpFX1ZBTFVFUwotI2RlZmluZSBTSVpFX1ZBTFVFUyAxMQotI2VuZGlmCi0KLQotdW5zaWduZWQzMiB0cmFjZV92YWx1ZXNbM107Ci1pbnQgdHJhY2VfbnVtX3ZhbHVlczsKLXVuc2lnbmVkMzIgdHJhY2VfcGM7Ci1jb25zdCBjaGFyICp0cmFjZV9uYW1lOwotaW50IHRyYWNlX21vZHVsZTsKLQotCi12b2lkCi10cmFjZV9pbnB1dCAobmFtZSwgdHlwZSwgc2l6ZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgZW51bSBvcF90eXBlcyB0eXBlOwotICAgICBpbnQgc2l6ZTsKLXsKLQotICBpZiAoIVRSQUNFX0FMVV9QIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCkpKQotICAgIHJldHVybjsKLQotICB0cmFjZV9wYyA9IFBDOwotICB0cmFjZV9uYW1lID0gbmFtZTsKLSAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQUxVX0lEWDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBPUF9VTktOT1dOOgotICAgIGNhc2UgT1BfTk9ORToKLSAgICBjYXNlIE9QX1RSQVA6Ci0gICAgICB0cmFjZV9udW1fdmFsdWVzID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9SRUc6Ci0gICAgY2FzZSBPUF9SRUdfUkVHX01PVkU6Ci0gICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzBdXTsKLSAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QX0JJVF9DSEFOR0U6Ci0gICAgY2FzZSBPUF9SRUdfUkVHOgotICAgIGNhc2UgT1BfUkVHX1JFR19DTVA6Ci0gICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzFdXTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfSU1NX1JFRzoKLSAgICBjYXNlIE9QX0lNTV9SRUdfQ01QOgotICAgICAgdHJhY2VfdmFsdWVzWzBdID0gU0VYVDUgKE9QWzBdKTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IE9QWzFdOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfSU1NX1JFR19NT1ZFOgotICAgICAgdHJhY2VfdmFsdWVzWzBdID0gU0VYVDUgKE9QWzBdKTsKLSAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QX0NPTkRfQlI6Ci0gICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5wYzsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFNFWFQ5IChPUFswXSk7Ci0gICAgICB0cmFjZV92YWx1ZXNbMl0gPSBQU1c7Ci0gICAgICB0cmFjZV9udW1fdmFsdWVzID0gMzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9MT0FEMTY6Ci0gICAgICB0cmFjZV92YWx1ZXNbMF0gPSBPUFsxXSAqIHNpemU7Ci0gICAgICB0cmFjZV92YWx1ZXNbMV0gPSBTdGF0ZS5yZWdzWzMwXTsKLSAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QX1NUT1JFMTY6Ci0gICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzBdXTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IE9QWzFdICogc2l6ZTsKLSAgICAgIHRyYWNlX3ZhbHVlc1syXSA9IFN0YXRlLnJlZ3NbMzBdOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDM7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfTE9BRDMyOgotICAgICAgdHJhY2VfdmFsdWVzWzBdID0gRVhURU5EMTYgKE9QWzJdKTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfU1RPUkUzMjoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOwotICAgICAgdHJhY2VfdmFsdWVzWzFdID0gRVhURU5EMTYgKE9QWzJdKTsKLSAgICAgIHRyYWNlX3ZhbHVlc1syXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDM7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfSlVNUDoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFNFWFQyMiAoT1BbMF0pOwotICAgICAgdHJhY2VfdmFsdWVzWzFdID0gU3RhdGUucGM7Ci0gICAgICB0cmFjZV9udW1fdmFsdWVzID0gMjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9JTU1fUkVHX1JFRzoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IEVYVEVORDE2IChPUFswXSkgPDwgc2l6ZTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfSU1NMTZfUkVHX1JFRzoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IEVYVEVORDE2IChPUFsyXSkgPDwgc2l6ZTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfVUlNTV9SRUdfUkVHOgotICAgICAgdHJhY2VfdmFsdWVzWzBdID0gKE9QWzBdICYgMHhmZmZmKSA8PCBzaXplOwotICAgICAgdHJhY2VfdmFsdWVzWzFdID0gU3RhdGUucmVnc1tPUFsxXV07Ci0gICAgICB0cmFjZV9udW1fdmFsdWVzID0gMjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9VSU1NMTZfUkVHX1JFRzoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IChPUFsyXSkgPDwgc2l6ZTsKLSAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfQklUOgotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfRVgxOgotICAgICAgdHJhY2VfdmFsdWVzWzBdID0gUFNXOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfRVgyOgotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfTERTUjoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOwotICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfU1RTUjoKLSAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnNyZWdzW09QWzFdXTsKLSAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOwotICAgIH0KLSAgCi19Ci0KLXZvaWQKLXRyYWNlX3Jlc3VsdCAoaW50IGhhc19yZXN1bHQsIHVuc2lnbmVkMzIgcmVzdWx0KQotewotICBjaGFyIGJ1ZlsxMDAwXTsKLSAgY2hhciAqY2hwOwotCi0gIGJ1ZlswXSA9ICdcMCc7Ci0gIGNocCA9IGJ1ZjsKLQotICAvKiB3cml0ZSBvdXQgdGhlIHZhbHVlcyBzYXZlZCBkdXJpbmcgdGhlIHRyYWNlX2lucHV0IGNhbGwgKi8KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB0cmFjZV9udW1fdmFsdWVzOyBpKyspCi0gICAgICB7Ci0Jc3ByaW50ZiAoY2hwLCAiJSpzMHglLjhseCIsIFNJWkVfVkFMVUVTIC0gMTAsICIiLCB0cmFjZV92YWx1ZXNbaV0pOwotCWNocCA9IHN0cmNociAoY2hwLCAnXDAnKTsKLSAgICAgIH0KLSAgICB3aGlsZSAoaSsrIDwgMykKLSAgICAgIHsKLQlzcHJpbnRmIChjaHAsICIlKnMiLCBTSVpFX1ZBTFVFUywgIiIpOwotCWNocCA9IHN0cmNociAoY2hwLCAnXDAnKTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIGFwcGVuZCBhbnkgcmVzdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotICBpZiAoaGFzX3Jlc3VsdCkKLSAgICBzcHJpbnRmIChjaHAsICIgOjogMHglLjhseCIsICh1bnNpZ25lZCBsb25nKXJlc3VsdCk7Ci0gIAotICB0cmFjZV9nZW5lcmljIChzaW11bGF0b3IsIFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgdHJhY2VfbW9kdWxlLCBidWYpOwotfQotCi12b2lkCi10cmFjZV9vdXRwdXQgKHJlc3VsdCkKLSAgICAgZW51bSBvcF90eXBlcyByZXN1bHQ7Ci17Ci0gIGlmICghVFJBQ0VfQUxVX1AgKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSkpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAocmVzdWx0KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgT1BfVU5LTk9XTjoKLSAgICBjYXNlIE9QX05PTkU6Ci0gICAgY2FzZSBPUF9UUkFQOgotICAgIGNhc2UgT1BfUkVHOgotICAgIGNhc2UgT1BfUkVHX1JFR19DTVA6Ci0gICAgY2FzZSBPUF9JTU1fUkVHX0NNUDoKLSAgICBjYXNlIE9QX0NPTkRfQlI6Ci0gICAgY2FzZSBPUF9TVE9SRTE2OgotICAgIGNhc2UgT1BfU1RPUkUzMjoKLSAgICBjYXNlIE9QX0JJVDoKLSAgICBjYXNlIE9QX0VYMjoKLSAgICAgIHRyYWNlX3Jlc3VsdCAoMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfTE9BRDE2OgotICAgIGNhc2UgT1BfU1RTUjoKLSAgICAgIHRyYWNlX3Jlc3VsdCAoMSwgU3RhdGUucmVnc1tPUFswXV0pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QX1JFR19SRUc6Ci0gICAgY2FzZSBPUF9SRUdfUkVHX01PVkU6Ci0gICAgY2FzZSBPUF9JTU1fUkVHOgotICAgIGNhc2UgT1BfSU1NX1JFR19NT1ZFOgotICAgIGNhc2UgT1BfTE9BRDMyOgotICAgIGNhc2UgT1BfRVgxOgotICAgICAgdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5yZWdzW09QWzFdXSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BfSU1NX1JFR19SRUc6Ci0gICAgY2FzZSBPUF9VSU1NX1JFR19SRUc6Ci0gICAgY2FzZSBPUF9JTU0xNl9SRUdfUkVHOgotICAgIGNhc2UgT1BfVUlNTTE2X1JFR19SRUc6Ci0gICAgICB0cmFjZV9yZXN1bHQgKDEsIFN0YXRlLnJlZ3NbT1BbMV1dKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9KVU1QOgotICAgICAgaWYgKE9QWzFdICE9IDApCi0JdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5yZWdzW09QWzFdXSk7Ci0gICAgICBlbHNlCi0JdHJhY2VfcmVzdWx0ICgwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUF9MRFNSOgotICAgICAgdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5zcmVnc1tPUFsxXV0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotI2VuZGlmCi0KLQwKLS8qIFJldHVybnMgMSBpZiB0aGUgc3BlY2lmaWMgY29uZGl0aW9uIGlzIG1ldCwgcmV0dXJucyAwIG90aGVyd2lzZS4gICovCi1pbnQKLWNvbmRpdGlvbl9tZXQgKHVuc2lnbmVkIGNvZGUpCi17Ci0gIHVuc2lnbmVkIGludCBwc3cgPSBQU1c7Ci0KLSAgc3dpdGNoIChjb2RlICYgMHhmKQotICAgIHsKLSAgICAgIGNhc2UgMHgwOiByZXR1cm4gKChwc3cgJiBQU1dfT1YpICE9IDApOyAKLSAgICAgIGNhc2UgMHgxOglyZXR1cm4gKChwc3cgJiBQU1dfQ1kpICE9IDApOwotICAgICAgY2FzZSAweDI6CXJldHVybiAoKHBzdyAmIFBTV19aKSAhPSAwKTsKLSAgICAgIGNhc2UgMHgzOglyZXR1cm4gKCgoKHBzdyAmIFBTV19DWSkgIT0gMCkgfCAoKHBzdyAmIFBTV19aKSAhPSAwKSkgIT0gMCk7Ci0gICAgICBjYXNlIDB4NDoJcmV0dXJuICgocHN3ICYgUFNXX1MpICE9IDApOwotICAgIC8qY2FzZSAweDU6CXJldHVybiAxOyovCi0gICAgICBjYXNlIDB4NjogcmV0dXJuICgoKChwc3cgJiBQU1dfUykgIT0gMCkgXiAoKHBzdyAmIFBTV19PVikgIT0gMCkpICE9IDApOwotICAgICAgY2FzZSAweDc6CXJldHVybiAoKCgoKHBzdyAmIFBTV19TKSAhPSAwKSBeICgocHN3ICYgUFNXX09WKSAhPSAwKSkgfHwgKChwc3cgJiBQU1dfWikgIT0gMCkpICE9IDApOwotICAgICAgY2FzZSAweDg6CXJldHVybiAoKHBzdyAmIFBTV19PVikgPT0gMCk7Ci0gICAgICBjYXNlIDB4OToJcmV0dXJuICgocHN3ICYgUFNXX0NZKSA9PSAwKTsKLSAgICAgIGNhc2UgMHhhOglyZXR1cm4gKChwc3cgJiBQU1dfWikgPT0gMCk7Ci0gICAgICBjYXNlIDB4YjoJcmV0dXJuICgoKChwc3cgJiBQU1dfQ1kpICE9IDApIHwgKChwc3cgJiBQU1dfWikgIT0gMCkpID09IDApOwotICAgICAgY2FzZSAweGM6CXJldHVybiAoKHBzdyAmIFBTV19TKSA9PSAwKTsKLSAgICAgIGNhc2UgMHhkOglyZXR1cm4gKChwc3cgJiBQU1dfU0FUKSAhPSAwKTsKLSAgICAgIGNhc2UgMHhlOglyZXR1cm4gKCgoKHBzdyAmIFBTV19TKSAhPSAwKSBeICgocHN3ICYgUFNXX09WKSAhPSAwKSkgPT0gMCk7Ci0gICAgICBjYXNlIDB4ZjoJcmV0dXJuICgoKCgocHN3ICYgUFNXX1MpICE9IDApIF4gKChwc3cgJiBQU1dfT1YpICE9IDApKSB8fCAoKHBzdyAmIFBTV19aKSAhPSAwKSkgPT0gMCk7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1BZGQzMiAodW5zaWduZWQgbG9uZyBhMSwgdW5zaWduZWQgbG9uZyBhMiwgaW50ICogY2FycnkpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gKGExICsgYTIpOwotCi0gICogY2FycnkgPSAocmVzdWx0IDwgYTEpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1NdWx0aXBseTY0IChib29sZWFuIHNpZ24sIHVuc2lnbmVkIGxvbmcgb3AwKQotewotICB1bnNpZ25lZCBsb25nIG9wMTsKLSAgdW5zaWduZWQgbG9uZyBsbzsKLSAgdW5zaWduZWQgbG9uZyBtaWQxOwotICB1bnNpZ25lZCBsb25nIG1pZDI7Ci0gIHVuc2lnbmVkIGxvbmcgaGk7Ci0gIHVuc2lnbmVkIGxvbmcgUmRMbzsKLSAgdW5zaWduZWQgbG9uZyBSZEhpOwotICBpbnQgICAgICAgICAgIGNhcnJ5OwotICAKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLQotICBpZiAoc2lnbikKLSAgICB7Ci0gICAgICAvKiBDb21wdXRlIHNpZ24gb2YgcmVzdWx0IGFuZCBhZGp1c3Qgb3BlcmFuZHMgaWYgbmVjZXNzYXJ5LiAgKi8KLQkgIAotICAgICAgc2lnbiA9IChvcDAgXiBvcDEpICYgMHg4MDAwMDAwMDsKLQkgIAotICAgICAgaWYgKCgoc2lnbmVkIGxvbmcpIG9wMCkgPCAwKQotCW9wMCA9IC0gb3AwOwotCSAgCi0gICAgICBpZiAoKChzaWduZWQgbG9uZykgb3AxKSA8IDApCi0Jb3AxID0gLSBvcDE7Ci0gICAgfQotICAgICAgCi0gIC8qIFdlIGNhbiBzcGxpdCB0aGUgMzJ4MzIgaW50byBmb3VyIDE2eDE2IG9wZXJhdGlvbnMuIFRoaXMgZW5zdXJlcwotICAgICB0aGF0IHdlIGRvIG5vdCBsb3NlIHByZWNpc2lvbiBvbiAzMmJpdCBvbmx5IGhvc3RzOiAqLwotICBsbyAgID0gKCAob3AwICAgICAgICAmIDB4RkZGRikgKiAgKG9wMSAgICAgICAgJiAweEZGRkYpKTsKLSAgbWlkMSA9ICggKG9wMCAgICAgICAgJiAweEZGRkYpICogKChvcDEgPj4gMTYpICYgMHhGRkZGKSk7Ci0gIG1pZDIgPSAoKChvcDAgPj4gMTYpICYgMHhGRkZGKSAqICAob3AxICAgICAgICAmIDB4RkZGRikpOwotICBoaSAgID0gKCgob3AwID4+IDE2KSAmIDB4RkZGRikgKiAoKG9wMSA+PiAxNikgJiAweEZGRkYpKTsKLSAgCi0gIC8qIFdlIG5vdyBuZWVkIHRvIGFkZCBhbGwgb2YgdGhlc2UgcmVzdWx0cyB0b2dldGhlciwgdGFraW5nIGNhcmUKLSAgICAgdG8gcHJvcG9nYXRlIHRoZSBjYXJyaWVzIGZyb20gdGhlIGFkZGl0aW9uczogKi8KLSAgUmRMbyA9IEFkZDMyIChsbywgKG1pZDEgPDwgMTYpLCAmIGNhcnJ5KTsKLSAgUmRIaSA9IGNhcnJ5OwotICBSZExvID0gQWRkMzIgKFJkTG8sIChtaWQyIDw8IDE2KSwgJiBjYXJyeSk7Ci0gIFJkSGkgKz0gKGNhcnJ5ICsgKChtaWQxID4+IDE2KSAmIDB4RkZGRikgKyAoKG1pZDIgPj4gMTYpICYgMHhGRkZGKSArIGhpKTsKLQotICBpZiAoc2lnbikKLSAgICB7Ci0gICAgICAvKiBOZWdhdGUgcmVzdWx0IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICAKLSAgICAgIFJkTG8gPSB+IFJkTG87Ci0gICAgICBSZEhpID0gfiBSZEhpOwotICAgICAgaWYgKFJkTG8gPT0gMHhGRkZGRkZGRikKLQl7Ci0JICBSZExvID0gMDsKLQkgIFJkSGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlCi0JUmRMbyArPSAxOwotICAgIH0KLSAgCi0gIC8qIERvbid0IHN0b3JlIGludG8gcmVnaXN0ZXIgMC4gICovCi0gIGlmIChPUFsxXSkKLSAgICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gUmRMbzsKLSAgaWYgKE9QWzJdID4+IDExKQotICAgIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSBSZEhpOwotCi0gIHJldHVybjsKLX0KLQotDAotLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSBtZW1vcnksIHJldHVybiBpbiBhIGJ1ZmZlciAqLwotc3RhdGljIGNoYXIgKgotZmV0Y2hfc3RyIChzZCwgYWRkcikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGFkZHJlc3Nfd29yZCBhZGRyOwotewotICBjaGFyICpidWY7Ci0gIGludCBuciA9IDA7Ci0gIHdoaWxlIChzaW1fY29yZV9yZWFkXzEgKFNUQVRFX0NQVSAoc2QsIDApLAotCQkJICBQQywgcmVhZF9tYXAsIGFkZHIgKyBucikgIT0gMCkKLSAgICBucisrOwotICBidWYgPSBOWkFMTE9DIChjaGFyLCBuciArIDEpOwotICBzaW1fcmVhZCAoc2ltdWxhdG9yLCBhZGRyLCBidWYsIG5yKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBhcmd1bWVudCB2ZWN0b3IgZnJvbSBtZW1vcnksIHJldHVybiBpbiBhCi0gICBidWZmZXIgKi8KLXN0YXRpYyBjaGFyICoqCi1mZXRjaF9hcmd2IChzZCwgYWRkcikKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGFkZHJlc3Nfd29yZCBhZGRyOwotewotICBpbnQgbWF4X25yID0gNjQ7Ci0gIGludCBuciA9IDA7Ci0gIGNoYXIgKipidWYgPSB4bWFsbG9jIChtYXhfbnIgKiBzaXplb2YgKGNoYXIqKSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkMzIgYSA9IHNpbV9jb3JlX3JlYWRfNCAoU1RBVEVfQ1BVIChzZCwgMCksCi0JCQkJICAgICAgUEMsIHJlYWRfbWFwLCBhZGRyICsgbnIgKiA0KTsKLSAgICAgIGlmIChhID09IDApIGJyZWFrOwotICAgICAgYnVmW25yXSA9IGZldGNoX3N0ciAoc2QsIGEpOwotICAgICAgbnIgKys7Ci0gICAgICBpZiAobnIgPT0gbWF4X25yIC0gMSkKLQl7Ci0JICBtYXhfbnIgKz0gNTA7Ci0JICBidWYgPSB4cmVhbGxvYyAoYnVmLCBtYXhfbnIgKiBzaXplb2YgKGNoYXIqKSk7Ci0JfQotICAgIH0KLSAgYnVmW25yXSA9IDA7Ci0gIHJldHVybiBidWY7Ci19Ci0KLQwKLS8qIHNzdC5iICovCi1pbnQKLU9QXzM4MCAoKQotewotICB0cmFjZV9pbnB1dCAoInNzdC5iIiwgT1BfU1RPUkUxNiwgMSk7Ci0KLSAgc3RvcmVfbWVtIChTdGF0ZS5yZWdzWzMwXSArIChPUFszXSAmIDB4N2YpLCAxLCBTdGF0ZS5yZWdzWyBPUFsxXSBdKTsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfU1RPUkUxNik7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHNzdC5oICovCi1pbnQKLU9QXzQ4MCAoKQotewotICB0cmFjZV9pbnB1dCAoInNzdC5oIiwgT1BfU1RPUkUxNiwgMik7Ci0KLSAgc3RvcmVfbWVtIChTdGF0ZS5yZWdzWzMwXSArICgoT1BbM10gJiAweDdmKSA8PCAxKSwgMiwgU3RhdGUucmVnc1sgT1BbMV0gXSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMTYpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBzc3QudyAqLwotaW50Ci1PUF81MDEgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJzc3QudyIsIE9QX1NUT1JFMTYsIDQpOwotCi0gIHN0b3JlX21lbSAoU3RhdGUucmVnc1szMF0gKyAoKE9QWzNdICYgMHg3ZSkgPDwgMSksIDQsIFN0YXRlLnJlZ3NbIE9QWzFdIF0pOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9TVE9SRTE2KTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogbGQuYiAqLwotaW50Ci1PUF83MDAgKCkKLXsKLSAgaW50IGFkcjsKLQotICB0cmFjZV9pbnB1dCAoImxkLmIiLCBPUF9MT0FEMzIsIDEpOwotCi0gIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0pOwotCi0gIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBFWFRFTkQ4IChsb2FkX21lbSAoYWRyLCAxKSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGxkLmggKi8KLWludAotT1BfNzIwICgpCi17Ci0gIGludCBhZHI7Ci0KLSAgdHJhY2VfaW5wdXQgKCJsZC5oIiwgT1BfTE9BRDMyLCAyKTsKLQotICBhZHIgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICsgRVhURU5EMTYgKE9QWzJdKTsKLSAgYWRyICY9IH4weDE7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKGxvYWRfbWVtIChhZHIsIDIpKTsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfTE9BRDMyKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogbGQudyAqLwotaW50Ci1PUF8xMDcyMCAoKQotewotICBpbnQgYWRyOwotCi0gIHRyYWNlX2lucHV0ICgibGQudyIsIE9QX0xPQUQzMiwgNCk7Ci0KLSAgYWRyID0gU3RhdGUucmVnc1sgT1BbMF0gXSArIEVYVEVORDE2IChPUFsyXSAmIH4xKTsKLSAgYWRyICY9IH4weDM7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gbG9hZF9tZW0gKGFkciwgNCk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHN0LmIgKi8KLWludAotT1BfNzQwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgic3QuYiIsIE9QX1NUT1JFMzIsIDEpOwotCi0gIHN0b3JlX21lbSAoU3RhdGUucmVnc1sgT1BbMF0gXSArIEVYVEVORDE2IChPUFsyXSksIDEsIFN0YXRlLnJlZ3NbIE9QWzFdIF0pOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9TVE9SRTMyKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogc3QuaCAqLwotaW50Ci1PUF83NjAgKCkKLXsKLSAgaW50IGFkcjsKLSAgCi0gIHRyYWNlX2lucHV0ICgic3QuaCIsIE9QX1NUT1JFMzIsIDIpOwotCi0gIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0pOwotICBhZHIgJj0gfjE7Ci0gIAotICBzdG9yZV9tZW0gKGFkciwgMiwgU3RhdGUucmVnc1sgT1BbMV0gXSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMzIpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBzdC53ICovCi1pbnQKLU9QXzEwNzYwICgpCi17Ci0gIGludCBhZHI7Ci0gIAotICB0cmFjZV9pbnB1dCAoInN0LnciLCBPUF9TVE9SRTMyLCA0KTsKLQotICBhZHIgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICsgRVhURU5EMTYgKE9QWzJdICYgfjEpOwotICBhZHIgJj0gfjM7Ci0gIAotICBzdG9yZV9tZW0gKGFkciwgNCwgU3RhdGUucmVnc1sgT1BbMV0gXSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMzIpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBhZGQgcmVnLCByZWcgKi8KLWludAotT1BfMUMwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3Y7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9SRUdfUkVHLCAwKTsKLSAgCi0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0gIAotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOwotICAKLSAgcmVzdWx0ID0gb3AwICsgb3AxOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKLSAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQotCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJICAgICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBhZGQgc2lnbl9leHRlbmQoaW1tNSksIHJlZyAqLwotaW50Ci1PUF8yNDAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKLSAgaW50IHRlbXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9JTU1fUkVHLCAwKTsKLQotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKLSAgb3AwID0gdGVtcDsKLSAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07Ci0gIHJlc3VsdCA9IG9wMCArIG9wMTsKLSAgCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKLSAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQotCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogYWRkaSBzaWduX2V4dGVuZChpbW0xNiksIHJlZywgcmVnICovCi1pbnQKLU9QXzYwMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92OwotCi0gIHRyYWNlX2lucHV0ICgiYWRkaSIsIE9QX0lNTTE2X1JFR19SRUcsIDApOwotCi0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0KLSAgb3AwID0gRVhURU5EMTYgKE9QWzJdKTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgcmVzdWx0ID0gb3AwICsgb3AxOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKHJlc3VsdCA8IG9wMCB8fCByZXN1bHQgPCBvcDEpOwotICBvdiA9ICgob3AwICYgMHg4MDAwMDAwMCkgPT0gKG9wMSAmIDB4ODAwMDAwMDApCi0JJiYgKG9wMCAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX0lNTTE2X1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBzdWIgcmVnMSwgcmVnMiAqLwotaW50Ci1PUF8xQTAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKLQotICB0cmFjZV9pbnB1dCAoInN1YiIsIE9QX1JFR19SRUcsIDApOwotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOwotICByZXN1bHQgPSBvcDEgLSBvcDA7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKG9wMSA8IG9wMCk7Ci0gIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKLQkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKLQotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCi0JCXwgKGN5ID8gUFNXX0NZIDogMCkgfCAob3YgPyBQU1dfT1YgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHN1YnIgcmVnMSwgcmVnMiAqLwotaW50Ci1PUF8xODAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKLQotICB0cmFjZV9pbnB1dCAoInN1YnIiLCBPUF9SRUdfUkVHLCAwKTsKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AwIC0gb3AxOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChvcDAgPCBvcDEpOwotICBvdiA9ICgob3AwICYgMHg4MDAwMDAwMCkgIT0gKG9wMSAmIDB4ODAwMDAwMDApCi0JJiYgKG9wMCAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBzeGggcmVnMSAqLwotaW50Ci1PUF9FMCAoKQotewotICB0cmFjZV9pbnB1dCAoIm11bGgiLCBPUF9SRUdfUkVHLCAwKTsKLSAgICAgIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gKEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFsxXSBdKSAqIEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFswXSBdKSk7Ci0gICAgICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogbXVsaCBzaWduX2V4dGVuZChpbW01KSwgcmVnMiAqLwotaW50Ci1PUF8yRTAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJtdWxoIiwgT1BfSU1NX1JFRywgMCk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzFdIF0pICogU0VYVDUgKE9QWzBdKTsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFRyk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIG11bGhpIGltbTE2LCByZWcxLCByZWcyICovCi1pbnQKLU9QXzZFMCAoKQotewotICB0cmFjZV9pbnB1dCAoIm11bGhpIiwgT1BfSU1NMTZfUkVHX1JFRywgMCk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzBdIF0pICogRVhURU5EMTYgKE9QWzJdKTsKLSAgICAgIAotICB0cmFjZV9vdXRwdXQgKE9QX0lNTTE2X1JFR19SRUcpOwotICAKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGRpdmggcmVnMSwgcmVnMiAqLwotaW50Ci1PUF80MCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgb3YsIHMsIHo7Ci0gIGludCB0ZW1wOwotCi0gIHRyYWNlX2lucHV0ICgiZGl2aCIsIE9QX1JFR19SRUcsIDApOwotCi0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0gIHRlbXAgPSBFWFRFTkQxNiAoU3RhdGUucmVnc1sgT1BbMF0gXSk7Ci0gIG9wMCA9IHRlbXA7Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbT1BbMV1dOwotICAKLSAgaWYgKG9wMCA9PSAweGZmZmZmZmZmICYmIG9wMSA9PSAweDgwMDAwMDAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDB4ODAwMDAwMDA7Ci0gICAgICBvdiA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChvcDAgIT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBvcDEgLyBvcDA7Ci0gICAgICBvdiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gMHgwOwotICAgICAgb3YgPSAxOwotICAgIH0KLSAgCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCSAgfCAob3YgPyBQU1dfT1YgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIGNtcCByZWcsIHJlZyAqLwotaW50Ci1PUF8xRTAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKLQotICB0cmFjZV9pbnB1dCAoImNtcCIsIE9QX1JFR19SRUdfQ01QLCAwKTsKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AxIC0gb3AwOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChvcDEgPCBvcDApOwotICBvdiA9ICgob3AxICYgMHg4MDAwMDAwMCkgIT0gKG9wMCAmIDB4ODAwMDAwMDApCi0JJiYgKG9wMSAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7Ci0KLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfQ01QKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogY21wIHNpZ25fZXh0ZW5kKGltbTUpLCByZWcgKi8KLWludAotT1BfMjYwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3Y7Ci0gIGludCB0ZW1wOwotCi0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0gIHRyYWNlX2lucHV0ICgiY21wIiwgT1BfSU1NX1JFR19DTVAsIDApOwotICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKLSAgb3AwID0gdGVtcDsKLSAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07Ci0gIHJlc3VsdCA9IG9wMSAtIG9wMDsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLSAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKLSAgY3kgPSAob3AxIDwgb3AwKTsKLSAgb3YgPSAoKG9wMSAmIDB4ODAwMDAwMDApICE9IChvcDAgJiAweDgwMDAwMDAwKQotCSYmIChvcDEgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOwotCi0gIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX0NNUCk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHNldGYgY2NjYyxyZWcyICovCi1pbnQKLU9QXzdFMCAoKQotewotICB0cmFjZV9pbnB1dCAoInNldGYiLCBPUF9FWDEsIDApOwotCi0gIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBjb25kaXRpb25fbWV0IChPUFswXSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0VYMSk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHNhdGFkZCByZWcscmVnICovCi1pbnQKLU9QX0MwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3YsIHNhdDsKLSAgCi0gIHRyYWNlX2lucHV0ICgic2F0YWRkIiwgT1BfUkVHX1JFRywgMCk7Ci0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0gIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIHJlc3VsdCA9IG9wMCArIG9wMTsKLSAgCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKLSAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQotCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOwotICBzYXQgPSBvdjsKLSAgCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkgIHwgKGN5ID8gUFNXX0NZIDogMCkgfCAob3YgPyBQU1dfT1YgOiAwKQotCSAgfCAoc2F0ID8gUFNXX1NBVCA6IDApKTsKLSAgCi0gIC8qIEhhbmRsZSBzYXR1cmF0ZWQgcmVzdWx0cy4gICovCi0gIGlmIChzYXQgJiYgcykKLSAgICBTdGF0ZS5yZWdzW09QWzFdXSA9IDB4ODAwMDAwMDA7Ci0gIGVsc2UgaWYgKHNhdCkKLSAgICBTdGF0ZS5yZWdzW09QWzFdXSA9IDB4N2ZmZmZmZmY7Ci0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHNhdGFkZCBzaWduX2V4dGVuZChpbW01KSwgcmVnICovCi1pbnQKLU9QXzIyMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92LCBzYXQ7Ci0KLSAgaW50IHRlbXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzYXRhZGQiLCBPUF9JTU1fUkVHLCAwKTsKLQotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKLSAgb3AwID0gdGVtcDsKLSAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07Ci0gIHJlc3VsdCA9IG9wMCArIG9wMTsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLSAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKLSAgY3kgPSAocmVzdWx0IDwgb3AwIHx8IHJlc3VsdCA8IG9wMSk7Ci0gIG92ID0gKChvcDAgJiAweDgwMDAwMDAwKSA9PSAob3AxICYgMHg4MDAwMDAwMCkKLQkmJiAob3AwICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKLSAgc2F0ID0gb3Y7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKLQkJfCAoc2F0ID8gUFNXX1NBVCA6IDApKTsKLQotICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLwotICBpZiAoc2F0ICYmIHMpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOwotICBlbHNlIGlmIChzYXQpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOwotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBzYXRzdWIgcmVnMSwgcmVnMiAqLwotaW50Ci1PUF9BMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92LCBzYXQ7Ci0gIAotICB0cmFjZV9pbnB1dCAoInNhdHN1YiIsIE9QX1JFR19SRUcsIDApOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AxIC0gb3AwOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKG9wMSA8IG9wMCk7Ci0gIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKLQkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKLSAgc2F0ID0gb3Y7Ci0gIAotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCi0JICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKLQkgIHwgKHNhdCA/IFBTV19TQVQgOiAwKSk7Ci0gIAotICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLwotICBpZiAoc2F0ICYmIHMpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOwotICBlbHNlIGlmIChzYXQpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotICByZXR1cm4gMjsKLX0KLQotLyogc2F0c3ViaSBzaWduX2V4dGVuZChpbW0xNiksIHJlZyAqLwotaW50Ci1PUF82NjAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdiwgc2F0OwotICBpbnQgdGVtcDsKLQotICB0cmFjZV9pbnB1dCAoInNhdHN1YmkiLCBPUF9JTU1fUkVHLCAwKTsKLQotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICB0ZW1wID0gRVhURU5EMTYgKE9QWzJdKTsKLSAgb3AwID0gdGVtcDsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgcmVzdWx0ID0gb3AxIC0gb3AwOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChvcDEgPCBvcDApOwotICBvdiA9ICgob3AxICYgMHg4MDAwMDAwMCkgIT0gKG9wMCAmIDB4ODAwMDAwMDApCi0JJiYgKG9wMSAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7Ci0gIHNhdCA9IG92OwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApCi0JCXwgKHNhdCA/IFBTV19TQVQgOiAwKSk7Ci0KLSAgLyogSGFuZGxlIHNhdHVyYXRlZCByZXN1bHRzLiAgKi8KLSAgaWYgKHNhdCAmJiBzKQotICAgIFN0YXRlLnJlZ3NbT1BbMV1dID0gMHg4MDAwMDAwMDsKLSAgZWxzZSBpZiAoc2F0KQotICAgIFN0YXRlLnJlZ3NbT1BbMV1dID0gMHg3ZmZmZmZmZjsKLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogc2F0c3ViciByZWcscmVnICovCi1pbnQKLU9QXzgwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3YsIHNhdDsKLSAgCi0gIHRyYWNlX2lucHV0ICgic2F0c3ViciIsIE9QX1JFR19SRUcsIDApOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AwIC0gb3AxOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKHJlc3VsdCA8IG9wMCk7Ci0gIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKLQkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKLSAgc2F0ID0gb3Y7Ci0gIAotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCi0JICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKLQkgIHwgKHNhdCA/IFBTV19TQVQgOiAwKSk7Ci0gIAotICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLwotICBpZiAoc2F0ICYmIHMpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOwotICBlbHNlIGlmIChzYXQpCi0gICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiB0c3QgcmVnLHJlZyAqLwotaW50Ci1PUF8xNjAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHM7Ci0KLSAgdHJhY2VfaW5wdXQgKCJ0c3QiLCBPUF9SRUdfUkVHX0NNUCwgMCk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AwICYgb3AxOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotCi0gIC8qIFN0b3JlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfQ01QKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogbW92IHNpZ25fZXh0ZW5kKGltbTUpLCByZWcgKi8KLWludAotT1BfMjAwICgpCi17Ci0gIGludCB2YWx1ZSA9IFNFWFQ1IChPUFswXSk7Ci0gIAotICB0cmFjZV9pbnB1dCAoIm1vdiIsIE9QX0lNTV9SRUdfTU9WRSwgMCk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gdmFsdWU7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfTU9WRSk7Ci0gIAotICByZXR1cm4gMjsKLX0KLQotLyogbW92aGkgaW1tMTYsIHJlZywgcmVnICovCi1pbnQKLU9QXzY0MCAoKQotewotICB0cmFjZV9pbnB1dCAoIm1vdmhpIiwgT1BfVUlNTTE2X1JFR19SRUcsIDE2KTsKLSAgICAgIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gU3RhdGUucmVnc1sgT1BbMF0gXSArIChPUFsyXSA8PCAxNik7Ci0gICAgICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9VSU1NMTZfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHNhciB6ZXJvX2V4dGVuZChpbW01KSxyZWcxICovCi1pbnQKLU9QXzJBMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzYXIiLCBPUF9JTU1fUkVHLCAwKTsKLSAgb3AwID0gT1BbMF07Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIHJlc3VsdCA9IChzaWduZWQpb3AxID4+IG9wMDsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLSAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKLSAgY3kgPSAob3AxICYgKDEgPDwgKG9wMCAtIDEpKSk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1sgT1BbMV0gXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PViB8IFBTV19DWSk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCi0JCXwgKGN5ID8gUFNXX0NZIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBzYXIgcmVnMSwgcmVnMiAqLwotaW50Ci1PUF9BMDA3RTAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5OwotCi0gIHRyYWNlX2lucHV0ICgic2FyIiwgT1BfUkVHX1JFRywgMCk7Ci0gIAotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHgxZjsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gKHNpZ25lZClvcDEgPj4gb3AwOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChvcDEgJiAoMSA8PCAob3AwIC0gMSkpKTsKLQotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PViB8IFBTV19DWSk7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCi0JCXwgKGN5ID8gUFNXX0NZIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBzaGwgemVyb19leHRlbmQoaW1tNSkscmVnMSAqLwotaW50Ci1PUF8yQzAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5OwotCi0gIHRyYWNlX2lucHV0ICgic2hsIiwgT1BfSU1NX1JFRywgMCk7Ci0gIG9wMCA9IE9QWzBdOwotICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOwotICByZXN1bHQgPSBvcDEgPDwgb3AwOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotICBjeSA9IChvcDEgJiAoMSA8PCAoMzIgLSBvcDApKSk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YgfCBQU1dfQ1kpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQotCQl8IChjeSA/IFBTV19DWSA6IDApKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogc2hsIHJlZzEsIHJlZzIgKi8KLWludAotT1BfQzAwN0UwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeTsKLQotICB0cmFjZV9pbnB1dCAoInNobCIsIE9QX1JFR19SRUcsIDApOwotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHgxZjsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AxIDw8IG9wMDsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLSAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKLSAgY3kgPSAob3AxICYgKDEgPDwgKDMyIC0gb3AwKSkpOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHNociB6ZXJvX2V4dGVuZChpbW01KSxyZWcxICovCi1pbnQKLU9QXzI4MCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzaHIiLCBPUF9JTU1fUkVHLCAwKTsKLSAgb3AwID0gT1BbMF07Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIHJlc3VsdCA9IG9wMSA+PiBvcDA7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKG9wMSAmICgxIDw8IChvcDAgLSAxKSkpOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFRyk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHNociByZWcxLCByZWcyICovCi1pbnQKLU9QXzgwMDdFMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7Ci0KLSAgdHJhY2VfaW5wdXQgKCJzaHIiLCBPUF9SRUdfUkVHLCAwKTsKLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXSAmIDB4MWY7Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIHJlc3VsdCA9IG9wMSA+PiBvcDA7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0gIGN5ID0gKG9wMSAmICgxIDw8IChvcDAgLSAxKSkpOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKLQkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIG9yIHJlZywgcmVnICovCi1pbnQKLU9QXzEwMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKLQotICB0cmFjZV9pbnB1dCAoIm9yIiwgT1BfUkVHX1JFRywgMCk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AwIHwgb3AxOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBvcmkgemVyb19leHRlbmQoaW1tMTYpLCByZWcsIHJlZyAqLwotaW50Ci1PUF82ODAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHM7Ci0KLSAgdHJhY2VfaW5wdXQgKCJvcmkiLCBPUF9VSU1NMTZfUkVHX1JFRywgMCk7Ci0gIG9wMCA9IE9QWzJdOwotICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICByZXN1bHQgPSBvcDAgfCBvcDE7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfVUlNTTE2X1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBhbmQgcmVnLCByZWcgKi8KLWludAotT1BfMTQwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzOwotCi0gIHRyYWNlX2lucHV0ICgiYW5kIiwgT1BfUkVHX1JFRywgMCk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKLSAgcmVzdWx0ID0gb3AwICYgb3AxOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOwotCi0gIHJldHVybiAyOwotfQotCi0vKiBhbmRpIHplcm9fZXh0ZW5kKGltbTE2KSwgcmVnLCByZWcgKi8KLWludAotT1BfNkMwICgpCi17Ci0gIHVuc2lnbmVkIGludCByZXN1bHQsIHo7Ci0KLSAgdHJhY2VfaW5wdXQgKCJhbmRpIiwgT1BfVUlNTTE2X1JFR19SRUcsIDApOwotCi0gIHJlc3VsdCA9IE9QWzJdICYgU3RhdGUucmVnc1sgT1BbMF0gXTsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLQotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gcmVzdWx0OwotICAKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1VJTU0xNl9SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogeG9yIHJlZywgcmVnICovCi1pbnQKLU9QXzEyMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKLQotICB0cmFjZV9pbnB1dCAoInhvciIsIE9QX1JFR19SRUcsIDApOwotCi0gIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCi0gIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07Ci0gIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIHJlc3VsdCA9IG9wMCBeIG9wMTsKLQotICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLwotICB6ID0gKHJlc3VsdCA9PSAwKTsKLSAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKLQotICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLwotICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHKTsKLQotICByZXR1cm4gMjsKLX0KLQotLyogeG9yaSB6ZXJvX2V4dGVuZChpbW0xNiksIHJlZywgcmVnICovCi1pbnQKLU9QXzZBMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKLQotICB0cmFjZV9pbnB1dCAoInhvcmkiLCBPUF9VSU1NMTZfUkVHX1JFRywgMCk7Ci0gIG9wMCA9IE9QWzJdOwotICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICByZXN1bHQgPSBvcDAgXiBvcDE7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgeiA9IChyZXN1bHQgPT0gMCk7Ci0gIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKSk7Ci0gIHRyYWNlX291dHB1dCAoT1BfVUlNTTE2X1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBub3QgcmVnMSwgcmVnMiAqLwotaW50Ci1PUF8yMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCByZXN1bHQsIHosIHM7Ci0KLSAgdHJhY2VfaW5wdXQgKCJub3QiLCBPUF9SRUdfUkVHX01PVkUsIDApOwotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICByZXN1bHQgPSB+b3AwOwotCi0gIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIHogPSAocmVzdWx0ID09IDApOwotICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOwotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOwotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfTU9WRSk7Ci0KLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIHNldDEgKi8KLWludAotT1BfN0MwICgpCi17Ci0gIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgb3AyOwotICBpbnQgdGVtcDsKLQotICB0cmFjZV9pbnB1dCAoInNldDEiLCBPUF9CSVQsIDApOwotICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBvcDEgPSBPUFsxXSAmIDB4NzsKLSAgdGVtcCA9IEVYVEVORDE2IChPUFsyXSk7Ci0gIG9wMiA9IHRlbXA7Ci0gIHRlbXAgPSBsb2FkX21lbSAob3AwICsgb3AyLCAxKTsKLSAgUFNXICY9IH5QU1dfWjsKLSAgaWYgKCh0ZW1wICYgKDEgPDwgb3AxKSkgPT0gMCkKLSAgICBQU1cgfD0gUFNXX1o7Ci0gIHRlbXAgfD0gKDEgPDwgb3AxKTsKLSAgc3RvcmVfbWVtIChvcDAgKyBvcDIsIDEsIHRlbXApOwotICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIG5vdDEgKi8KLWludAotT1BfNDdDMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIG9wMjsKLSAgaW50IHRlbXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJub3QxIiwgT1BfQklULCAwKTsKLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gT1BbMV0gJiAweDc7Ci0gIHRlbXAgPSBFWFRFTkQxNiAoT1BbMl0pOwotICBvcDIgPSB0ZW1wOwotICB0ZW1wID0gbG9hZF9tZW0gKG9wMCArIG9wMiwgMSk7Ci0gIFBTVyAmPSB+UFNXX1o7Ci0gIGlmICgodGVtcCAmICgxIDw8IG9wMSkpID09IDApCi0gICAgUFNXIHw9IFBTV19aOwotICB0ZW1wIF49ICgxIDw8IG9wMSk7Ci0gIHN0b3JlX21lbSAob3AwICsgb3AyLCAxLCB0ZW1wKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9CSVQpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBjbHIxICovCi1pbnQKLU9QXzg3QzAgKCkKLXsKLSAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCBvcDI7Ci0gIGludCB0ZW1wOwotCi0gIHRyYWNlX2lucHV0ICgiY2xyMSIsIE9QX0JJVCwgMCk7Ci0gIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07Ci0gIG9wMSA9IE9QWzFdICYgMHg3OwotICB0ZW1wID0gRVhURU5EMTYgKE9QWzJdKTsKLSAgb3AyID0gdGVtcDsKLSAgdGVtcCA9IGxvYWRfbWVtIChvcDAgKyBvcDIsIDEpOwotICBQU1cgJj0gflBTV19aOwotICBpZiAoKHRlbXAgJiAoMSA8PCBvcDEpKSA9PSAwKQotICAgIFBTVyB8PSBQU1dfWjsKLSAgdGVtcCAmPSB+KDEgPDwgb3AxKTsKLSAgc3RvcmVfbWVtIChvcDAgKyBvcDIsIDEsIHRlbXApOwotICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHRzdDEgKi8KLWludAotT1BfQzdDMCAoKQotewotICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIG9wMjsKLSAgaW50IHRlbXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJ0c3QxIiwgT1BfQklULCAwKTsKLSAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgb3AxID0gT1BbMV0gJiAweDc7Ci0gIHRlbXAgPSBFWFRFTkQxNiAoT1BbMl0pOwotICBvcDIgPSB0ZW1wOwotICB0ZW1wID0gbG9hZF9tZW0gKG9wMCArIG9wMiwgMSk7Ci0gIFBTVyAmPSB+UFNXX1o7Ci0gIGlmICgodGVtcCAmICgxIDw8IG9wMSkpID09IDApCi0gICAgUFNXIHw9IFBTV19aOwotICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGRpICovCi1pbnQKLU9QXzE2MDA3RTAgKCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJkaSIsIE9QX05PTkUsIDApOwotICBQU1cgfD0gUFNXX0lEOwotICB0cmFjZV9vdXRwdXQgKE9QX05PTkUpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBlaSAqLwotaW50Ci1PUF8xNjA4N0UwICgpCi17Ci0gIHRyYWNlX2lucHV0ICgiZWkiLCBPUF9OT05FLCAwKTsKLSAgUFNXICY9IH5QU1dfSUQ7Ci0gIHRyYWNlX291dHB1dCAoT1BfTk9ORSk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGhhbHQgKi8KLWludAotT1BfMTIwMDdFMCAoKQotewotICB0cmFjZV9pbnB1dCAoImhhbHQiLCBPUF9OT05FLCAwKTsKLSAgLyogRklYTUUgdGhpcyBzaG91bGQgcHV0IHByb2Nlc3NvciBpbnRvIGEgbW9kZSB3aGVyZSBOTUkgc3RpbGwgaGFuZGxlZCAqLwotICB0cmFjZV9vdXRwdXQgKE9QX05PTkUpOwotICBzaW1fZW5naW5lX2hhbHQgKHNpbXVsYXRvciwgU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBOVUxMLCBQQywKLQkJICAgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHRyYXAgKi8KLWludAotT1BfMTAwMDdFMCAoKQotewotICB0cmFjZV9pbnB1dCAoInRyYXAiLCBPUF9UUkFQLCAwKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9UUkFQKTsKLQotICAvKiBUcmFwIDMxIGlzIHVzZWQgZm9yIHNpbXVsYXRpbmcgT1MgSS9PIGZ1bmN0aW9ucyAqLwotCi0gIGlmIChPUFswXSA9PSAzMSkKLSAgICB7Ci0gICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkKLSAgICAgIGVycm5vID0gMDsKLQotLyogUmVnaXN0ZXJzIHBhc3NlZCB0byB0cmFwIDAgKi8KLQotI2RlZmluZSBGVU5DICAgU3RhdGUucmVnc1s2XQkvKiBmdW5jdGlvbiBudW1iZXIsIHJldHVybiB2YWx1ZSAqLwotI2RlZmluZSBQQVJNMSAgU3RhdGUucmVnc1s3XQkvKiBvcHRpb25hbCBwYXJtIDEgKi8KLSNkZWZpbmUgUEFSTTIgIFN0YXRlLnJlZ3NbOF0JLyogb3B0aW9uYWwgcGFybSAyICovCi0jZGVmaW5lIFBBUk0zICBTdGF0ZS5yZWdzWzldCS8qIG9wdGlvbmFsIHBhcm0gMyAqLwotCi0vKiBSZWdpc3RlcnMgc2V0IGJ5IHRyYXAgMCAqLwotCi0jZGVmaW5lIFJFVFZBTCBTdGF0ZS5yZWdzWzEwXQkvKiByZXR1cm4gdmFsdWUgKi8KLSNkZWZpbmUgUkVURVJSIFN0YXRlLnJlZ3NbMTFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCi0KLS8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KLQotI2RlZmluZSBNRU1QVFIoeCkgKG1hcCAoeCkpCi0KLSAgICAgIHN3aXRjaCAoRlVOQykKLQl7Ci0KLSNpZmRlZiBIQVZFX0ZPUksKLSNpZmRlZiBUQVJHRVRfU1lTX2ZvcmsKLQljYXNlIFRBUkdFVF9TWVNfZm9yazoKLQkgIFJFVFZBTCA9IGZvcmsgKCk7Ci0JICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0VYRUNWRQotI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKLQljYXNlIFRBUkdFVF9TWVNfZXhlY3ZlOgotCSAgewotCSAgICBjaGFyICpwYXRoID0gZmV0Y2hfc3RyIChzaW11bGF0b3IsIFBBUk0xKTsKLQkgICAgY2hhciAqKmFyZ3YgPSBmZXRjaF9hcmd2IChzaW11bGF0b3IsIFBBUk0yKTsKLQkgICAgY2hhciAqKmVudnAgPSBmZXRjaF9hcmd2IChzaW11bGF0b3IsIFBBUk0zKTsKLQkgICAgUkVUVkFMID0gZXhlY3ZlIChwYXRoLCBhcmd2LCBlbnZwKTsKLQkgICAgemZyZWUgKHBhdGgpOwotCSAgICBmcmVlYXJndiAoYXJndik7Ci0JICAgIGZyZWVhcmd2IChlbnZwKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgSEFWRV9FWEVDVgotI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKLQljYXNlIFRBUkdFVF9TWVNfZXhlY3Y6Ci0JICB7Ci0JICAgIGNoYXIgKnBhdGggPSBmZXRjaF9zdHIgKHNpbXVsYXRvciwgUEFSTTEpOwotCSAgICBjaGFyICoqYXJndiA9IGZldGNoX2FyZ3YgKHNpbXVsYXRvciwgUEFSTTIpOwotCSAgICBSRVRWQUwgPSBleGVjdiAocGF0aCwgYXJndik7Ci0JICAgIHpmcmVlIChwYXRoKTsKLQkgICAgZnJlZWFyZ3YgKGFyZ3YpOwotCSAgICBicmVhazsKLQkgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAwCi0jaWZkZWYgVEFSR0VUX1NZU19waXBlCi0JY2FzZSBUQVJHRVRfU1lTX3BpcGU6Ci0JICB7Ci0JICAgIHJlZ190IGJ1ZjsKLQkgICAgaW50IGhvc3RfZmRbMl07Ci0KLQkgICAgYnVmID0gUEFSTTE7Ci0JICAgIFJFVFZBTCA9IHBpcGUgKGhvc3RfZmQpOwotCSAgICBTVyAoYnVmLCBob3N0X2ZkWzBdKTsKLQkgICAgYnVmICs9IHNpemVvZih1aW50MTYpOwotCSAgICBTVyAoYnVmLCBob3N0X2ZkWzFdKTsKLQkgIH0KLQkgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIDAKLSNpZmRlZiBUQVJHRVRfU1lTX3dhaXQKLQljYXNlIFRBUkdFVF9TWVNfd2FpdDoKLQkgIHsKLQkgICAgaW50IHN0YXR1czsKLQotCSAgICBSRVRWQUwgPSB3YWl0ICgmc3RhdHVzKTsKLQkgICAgU1cgKFBBUk0xLCBzdGF0dXMpOwotCSAgfQotCSAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NZU19yZWFkCi0JY2FzZSBUQVJHRVRfU1lTX3JlYWQ6Ci0JICB7Ci0JICAgIGNoYXIgKmJ1ZiA9IHphbGxvYyAoUEFSTTMpOwotCSAgICBSRVRWQUwgPSBzaW1faW9fcmVhZCAoc2ltdWxhdG9yLCBQQVJNMSwgYnVmLCBQQVJNMyk7Ci0JICAgIHNpbV93cml0ZSAoc2ltdWxhdG9yLCBQQVJNMiwgYnVmLCBQQVJNMyk7Ci0JICAgIHpmcmVlIChidWYpOwotCSAgICBicmVhazsKLQkgIH0KLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NZU193cml0ZQotCWNhc2UgVEFSR0VUX1NZU193cml0ZToKLQkgIHsKLQkgICAgY2hhciAqYnVmID0gemFsbG9jIChQQVJNMyk7Ci0JICAgIHNpbV9yZWFkIChzaW11bGF0b3IsIFBBUk0yLCBidWYsIFBBUk0zKTsKLQkgICAgaWYgKFBBUk0xID09IDEpCi0JICAgICAgUkVUVkFMID0gc2ltX2lvX3dyaXRlX3N0ZG91dCAoc2ltdWxhdG9yLCBidWYsIFBBUk0zKTsKLQkgICAgZWxzZQotCSAgICAgIFJFVFZBTCA9IHNpbV9pb193cml0ZSAoc2ltdWxhdG9yLCBQQVJNMSwgYnVmLCBQQVJNMyk7Ci0JICAgIHpmcmVlIChidWYpOwotCSAgICBicmVhazsKLQkgIH0KLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NZU19sc2VlawotCWNhc2UgVEFSR0VUX1NZU19sc2VlazoKLQkgIFJFVFZBTCA9IHNpbV9pb19sc2VlayAoc2ltdWxhdG9yLCBQQVJNMSwgUEFSTTIsIFBBUk0zKTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfU1lTX2Nsb3NlCi0JY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgotCSAgUkVUVkFMID0gc2ltX2lvX2Nsb3NlIChzaW11bGF0b3IsIFBBUk0xKTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfU1lTX29wZW4KLQljYXNlIFRBUkdFVF9TWVNfb3BlbjoKLQkgIHsKLQkgICAgY2hhciAqYnVmID0gZmV0Y2hfc3RyIChzaW11bGF0b3IsIFBBUk0xKTsKLQkgICAgUkVUVkFMID0gc2ltX2lvX29wZW4gKHNpbXVsYXRvciwgYnVmLCBQQVJNMik7Ci0JICAgIHpmcmVlIChidWYpOwotCSAgICBicmVhazsKLQkgIH0KLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NZU19leGl0Ci0JY2FzZSBUQVJHRVRfU1lTX2V4aXQ6Ci0JICBpZiAoKFBBUk0xICYgMHhmZmZmMDAwMCkgPT0gMHhkZWFkMDAwMCAmJiAoUEFSTTEgJiAweGZmZmYpICE9IDApCi0JICAgIC8qIGdldCBzaWduYWwgZW5jb2RlZCBieSBraWxsICovCi0JICAgIHNpbV9lbmdpbmVfaGFsdCAoc2ltdWxhdG9yLCBTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIE5VTEwsIFBDLAotCQkJICAgICBzaW1fc2lnbmFsbGVkLCBQQVJNMSAmIDB4ZmZmZik7Ci0JICBlbHNlIGlmIChQQVJNMSA9PSAweGRlYWQpCi0JICAgIC8qIG9sZCBsaWJyYXJpZXMgKi8KLQkgICAgc2ltX2VuZ2luZV9oYWx0IChzaW11bGF0b3IsIFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgTlVMTCwgUEMsCi0JCQkgICAgIHNpbV9zdG9wcGVkLCBTSU1fU0lHQUJSVCk7Ci0JICBlbHNlCi0JICAgIC8qIFBBUk0xIGhhcyBleGl0IHN0YXR1cyAqLwotCSAgICBzaW1fZW5naW5lX2hhbHQgKHNpbXVsYXRvciwgU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBOVUxMLCBQQywKLQkJCSAgICAgc2ltX2V4aXRlZCwgUEFSTTEpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0jaWZkZWYgVEFSR0VUX1NZU19zdGF0Ci0JY2FzZSBUQVJHRVRfU1lTX3N0YXQ6CS8qIGFkZGVkIGF0IGhtc2kgKi8KLQkgIC8qIHN0YXQgc3lzdGVtIGNhbGwgKi8KLQkgIHsKLQkgICAgc3RydWN0IHN0YXQgaG9zdF9zdGF0OwotCSAgICByZWdfdCBidWY7Ci0JICAgIGNoYXIgKnBhdGggPSBmZXRjaF9zdHIgKHNpbXVsYXRvciwgUEFSTTEpOwotCi0JICAgIFJFVFZBTCA9IHN0YXQgKHBhdGgsICZob3N0X3N0YXQpOwotCi0JICAgIHpmcmVlIChwYXRoKTsKLQkgICAgYnVmID0gUEFSTTI7Ci0KLQkgICAgLyogSnVzdCB3aWxkLWFzc2VkIGd1ZXNzZXMuICAqLwotCSAgICBzdG9yZV9tZW0gKGJ1ZiwgMiwgaG9zdF9zdGF0LnN0X2Rldik7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgMiwgMiwgaG9zdF9zdGF0LnN0X2lubyk7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgNCwgNCwgaG9zdF9zdGF0LnN0X21vZGUpOwotCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDgsIDIsIGhvc3Rfc3RhdC5zdF9ubGluayk7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgMTAsIDIsIGhvc3Rfc3RhdC5zdF91aWQpOwotCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDEyLCAyLCBob3N0X3N0YXQuc3RfZ2lkKTsKLQkgICAgc3RvcmVfbWVtIChidWYgKyAxNCwgMiwgaG9zdF9zdGF0LnN0X3JkZXYpOwotCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDE2LCA0LCBob3N0X3N0YXQuc3Rfc2l6ZSk7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgMjAsIDQsIGhvc3Rfc3RhdC5zdF9hdGltZSk7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgMjgsIDQsIGhvc3Rfc3RhdC5zdF9tdGltZSk7Ci0JICAgIHN0b3JlX21lbSAoYnVmICsgMzYsIDQsIGhvc3Rfc3RhdC5zdF9jdGltZSk7Ci0JICB9Ci0JICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NIT1dOCi0jaWZkZWYgVEFSR0VUX1NZU19jaG93bgotCWNhc2UgVEFSR0VUX1NZU19jaG93bjoKLQkgIHsKLQkgICAgY2hhciAqcGF0aCA9IGZldGNoX3N0ciAoc2ltdWxhdG9yLCBQQVJNMSk7Ci0JICAgIFJFVFZBTCA9IGNob3duIChwYXRoLCBQQVJNMiwgUEFSTTMpOwotCSAgICB6ZnJlZSAocGF0aCk7Ci0JICB9Ci0JICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBIQVZFX0NITU9ECi0jaWZkZWYgVEFSR0VUX1NZU19jaG1vZAotCWNhc2UgVEFSR0VUX1NZU19jaG1vZDoKLQkgIHsKLQkgICAgY2hhciAqcGF0aCA9IGZldGNoX3N0ciAoc2ltdWxhdG9yLCBQQVJNMSk7Ci0JICAgIFJFVFZBTCA9IGNobW9kIChwYXRoLCBQQVJNMik7Ci0JICAgIHpmcmVlIChwYXRoKTsKLQkgIH0KLQkgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9TWVNfdGltZQotI2lmIEhBVkVfVElNRQotCWNhc2UgVEFSR0VUX1NZU190aW1lOgotCSAgewotCSAgICB0aW1lX3Qgbm93OwotCSAgICBSRVRWQUwgPSB0aW1lICgmbm93KTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMSwgNCwgbm93KTsKLQkgIH0KLQkgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0jaWZkZWYgVEFSR0VUX1NZU190aW1lcwotCWNhc2UgVEFSR0VUX1NZU190aW1lczoKLQkgIHsKLQkgICAgc3RydWN0IHRtcyB0bXM7Ci0JICAgIFJFVFZBTCA9IHRpbWVzICgmdG1zKTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMSwgNCwgdG1zLnRtc191dGltZSk7Ci0JICAgIHN0b3JlX21lbSAoUEFSTTEgKyA0LCA0LCB0bXMudG1zX3N0aW1lKTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMSArIDgsIDQsIHRtcy50bXNfY3V0aW1lKTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMSArIDEyLCA0LCB0bXMudG1zX2NzdGltZSk7Ci0JICAgIGJyZWFrOwotCSAgfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5Ci0jaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKLQljYXNlIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5OgotCSAgewotCSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotCSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0JICAgIFJFVFZBTCA9IGdldHRpbWVvZmRheSAoJnQsICZ0eik7Ci0JICAgIHN0b3JlX21lbSAoUEFSTTEsIDQsIHQudHZfc2VjKTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMSArIDQsIDQsIHQudHZfdXNlYyk7Ci0JICAgIHN0b3JlX21lbSAoUEFSTTIsIDQsIHR6LnR6X21pbnV0ZXN3ZXN0KTsKLQkgICAgc3RvcmVfbWVtIChQQVJNMiArIDQsIDQsIHR6LnR6X2RzdHRpbWUpOwotCSAgICBicmVhazsKLQkgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfU1lTX3V0aW1lCi0jaWYgSEFWRV9VVElNRQotCWNhc2UgVEFSR0VUX1NZU191dGltZToKLQkgIHsKLQkgICAgLyogQ2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHZvaWQgKiwgdG8gYXZvaWQgdHlwZSBtaXNtYXRjaAotCSAgICAgICBpZiBhIHByb3RvdHlwZSBpcyBwcmVzZW50LiAgKi8KLQkgICAgc2ltX2lvX2Vycm9yIChzaW11bGF0b3IsICJVdGltZSBub3Qgc3VwcG9ydGVkIik7Ci0JICAgIC8qIFJFVFZBTCA9IHV0aW1lIChwYXRoLCAodm9pZCAqKSBNRU1QVFIgKFBBUk0yKSk7ICovCi0JICB9Ci0JICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgUkVURVJSID0gZXJybm87Ci0gICAgICBlcnJubyA9IHNhdmVfZXJybm87Ci0KLSAgICAgIHJldHVybiA0OwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogVHJhcCAwIC0+IDMwICovCi0gICAgICBFSVBDID0gUEMgKyA0OwotICAgICAgRUlQU1cgPSBQU1c7Ci0gICAgICAvKiBNYXNrIG91dCBFSUNDICovCi0gICAgICBFQ1IgJj0gMHhmZmZmMDAwMDsKLSAgICAgIEVDUiB8PSAweDQwICsgT1BbMF07Ci0gICAgICAvKiBGbGFnIHRoYXQgd2UgYXJlIG5vdyBkb2luZyBleGNlcHRpb24gcHJvY2Vzc2luZy4gICovCi0gICAgICBQU1cgfD0gUFNXX0VQIHwgUFNXX0lEOwotICAgICAgUEMgPSAoKE9QWzBdIDwgMHgxMCkgPyAweDQwIDogMHg1MCkgLSA0OwotCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIHRzdDEgcmVnMiwgW3JlZzFdICovCi1pbnQKLU9QX0U2MDdFMCAodm9pZCkKLXsKLSAgaW50IHRlbXA7Ci0KLSAgdHJhY2VfaW5wdXQgKCJ0c3QxIiwgT1BfQklULCAxKTsKLQotICB0ZW1wID0gbG9hZF9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEpOwotICAKLSAgUFNXICY9IH5QU1dfWjsKLSAgaWYgKCh0ZW1wICYgKDEgPDwgU3RhdGUucmVnc1sgT1BbMV0gJiAweDcgXSkpID09IDApCi0gICAgUFNXIHw9IFBTV19aOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9CSVQpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBtdWx1IHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjIyMDdFMCAodm9pZCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJtdWx1IiwgT1BfUkVHX1JFR19SRUcsIDApOwotCi0gIE11bHRpcGx5NjQgKGZhbHNlLCBTdGF0ZS5yZWdzWyBPUFswXSBdKTsKLQotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotI2RlZmluZSBCSVRfQ0hBTkdFX09QKCBuYW1lLCBiaW5vcCApCQlcCi0gIHVuc2lnbmVkIGludCBiaXQ7CQkJCVwKLSAgdW5zaWduZWQgaW50IHRlbXA7CQkJCVwKLSAgCQkJCQkJXAotICB0cmFjZV9pbnB1dCAobmFtZSwgT1BfQklUX0NIQU5HRSwgMCk7CQlcCi0gIAkJCQkJCVwKLSAgYml0ICA9IDEgPDwgU3RhdGUucmVnc1sgT1BbMV0gJiAweDcgXTsJXAotICB0ZW1wID0gbG9hZF9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEpOwlcCi0JCQkJCQlcCi0gIFBTVyAmPSB+UFNXX1o7CQkJCVwKLSAgaWYgKCh0ZW1wICYgYml0KSA9PSAwKQkJCVwKLSAgICBQU1cgfD0gUFNXX1o7CQkJCVwKLSAgdGVtcCBiaW5vcCBiaXQ7CQkJCVwKLSAgCQkJCQkJXAotICBzdG9yZV9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEsIHRlbXApOwlcCi0JICAgICAJCQkJCVwKLSAgdHJhY2Vfb3V0cHV0IChPUF9CSVRfQ0hBTkdFKTsJCQlcCi0JICAgICAJCQkJCVwKLSAgcmV0dXJuIDQ7Ci0KLS8qIGNscjEgcmVnMiwgW3JlZzFdICovCi1pbnQKLU9QX0U0MDdFMCAodm9pZCkKLXsKLSAgQklUX0NIQU5HRV9PUCAoImNscjEiLCAmPSB+ICk7Ci19Ci0KLS8qIG5vdDEgcmVnMiwgW3JlZzFdICovCi1pbnQKLU9QX0UyMDdFMCAodm9pZCkKLXsKLSAgQklUX0NIQU5HRV9PUCAoIm5vdDEiLCBePSApOwotfQotCi0vKiBzZXQxICovCi1pbnQKLU9QX0UwMDdFMCAodm9pZCkKLXsKLSAgQklUX0NIQU5HRV9PUCAoInNldDEiLCB8PSApOwotfQotCi0vKiBzYXNmICovCi1pbnQKLU9QXzIwMDA3RTAgKHZvaWQpCi17Ci0gIHRyYWNlX2lucHV0ICgic2FzZiIsIE9QX0VYMSwgMCk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gKFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgMSkgfCBjb25kaXRpb25fbWV0IChPUFswXSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0VYMSk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY291cnRlc3kgb2YgU3VnaW1vdG8gYXQgTkVDLCB2aWEgU2VvdyBUYW4KLSAgIChTb2V3X1RhbkBlbC5uZWMuY29tKSAqLwotdm9pZAotZGl2dW4KLSgKLSAgdW5zaWduZWQgaW50ICAgICAgIE4sCi0gIHVuc2lnbmVkIGxvbmcgaW50ICBhbHMsCi0gIHVuc2lnbmVkIGxvbmcgaW50ICBzZmksCi0gIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICogIHF1b3RpZW50X3B0ciwKLSAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gKiAgcmVtYWluZGVyX3B0ciwKLSAgYm9vbGVhbiAqICAgICAgICAgIG92ZXJmbG93X3B0cgotKQotewotICB1bnNpZ25lZCBsb25nICAgYWxkID0gc2ZpID4+IChOIC0gMSk7Ci0gIHVuc2lnbmVkIGxvbmcgICBhbG8gPSBhbHM7Ci0gIHVuc2lnbmVkIGludCAgICBRICAgPSAxOwotICB1bnNpZ25lZCBpbnQgICAgQzsKLSAgdW5zaWduZWQgaW50ICAgIFMgICA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICBpOwotICB1bnNpZ25lZCBpbnQgICAgUjEgID0gMTsKLSAgdW5zaWduZWQgaW50ICAgIERCWiA9IChhbHMgPT0gMCkgPyAxIDogMDsKLSAgdW5zaWduZWQgbG9uZyAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOwotCi0gIC8qIDFzdCBMb29wICovCi0gIGFsbyA9IGFsZCArIGFsdCArIFE7Ci0gIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7Ci0gIEMgICA9IEMgXiBROwotICBRICAgPSB+KEMgXiBTKSAmIDE7Ci0gIFIxICA9IChhbG8gPT0gMCkgPyAwIDogKFIxICYgUSk7Ci0gIGlmICgoUyBeIChhbG8+PjMxKSkgJiYgIUMpCi0gICAgewotICAgICAgREJaID0gMTsKLSAgICB9Ci0gIFMgICA9IGFsbyA+PiAzMTsKLSAgc2ZpID0gKHNmaSA8PCAoMzItTisxKSkgfCBROwotICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7Ci0KLSAgLyogMm5kIC0gTi0xdGggTG9vcCAqLwotICBmb3IgKGkgPSAyOyBpIDwgTjsgaSsrKQotICAgIHsKLSAgICAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOwotICAgICAgYWxvID0gYWxkICsgYWx0ICsgUTsKLSAgICAgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgICAgIHwgKCgoYWx0ID4+IDMxKSBeIChhbGQgPj4gMzEpKSAmICh+YWxvID4+IDMxKSkpOwotICAgICAgQyAgID0gQyBeIFE7Ci0gICAgICBRICAgPSB+KEMgXiBTKSAmIDE7Ci0gICAgICBSMSAgPSAoYWxvID09IDApID8gMCA6IChSMSAmIFEpOwotICAgICAgaWYgKChTIF4gKGFsbz4+MzEpKSAmJiAhQyAmJiAhREJaKQotCXsKLQkgIERCWiA9IDE7Ci0JfQotICAgICAgUyAgID0gYWxvID4+IDMxOwotICAgICAgc2ZpID0gKHNmaSA8PCAxKSB8IFE7Ci0gICAgICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7Ci0gICAgfQotICAKLSAgLyogTnRoIExvb3AgKi8KLSAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7Ci0gIGFsbyA9IGFsZCArIGFsdCArIFE7Ci0gIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7Ci0gIEMgICA9IEMgXiBROwotICBRICAgPSB+KEMgXiBTKSAmIDE7Ci0gIFIxICA9IChhbG8gPT0gMCkgPyAwIDogKFIxICYgUSk7Ci0gIGlmICgoUyBeIChhbG8+PjMxKSkgJiYgIUMpCi0gICAgewotICAgICAgREJaID0gMTsKLSAgICB9Ci0gIAotICAqIHF1b3RpZW50X3B0ciAgPSAoc2ZpIDw8IDEpIHwgUTsKLSAgKiByZW1haW5kZXJfcHRyID0gUSA/IGFsbyA6IChhbG8gKyBhbHMpOwotICAqIG92ZXJmbG93X3B0ciAgPSBEQlogfCBSMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjb3VydGVzeSBvZiBTdWdpbW90byBhdCBORUMsIHZpYSBTZW93IFRhbiAoU29ld19UYW5AZWwubmVjLmNvbSkgKi8KLXZvaWQKLWRpdm4KLSgKLSAgdW5zaWduZWQgaW50ICAgICAgIE4sCi0gIHVuc2lnbmVkIGxvbmcgaW50ICBhbHMsCi0gIHVuc2lnbmVkIGxvbmcgaW50ICBzZmksCi0gIHNpZ25lZDMyIC8qc2lnbmVkIGxvbmcgaW50Ki8gKiAgcXVvdGllbnRfcHRyLAotICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICogIHJlbWFpbmRlcl9wdHIsCi0gIGJvb2xlYW4gKiAgICAgICAgICBvdmVyZmxvd19wdHIKLSkKLXsKLSAgdW5zaWduZWQgbG9uZwkgIGFsZCA9IChzaWduZWQgbG9uZykgc2ZpID4+IChOIC0gMSk7Ci0gIHVuc2lnbmVkIGxvbmcgICBhbG8gPSBhbHM7Ci0gIHVuc2lnbmVkIGludCAgICBTUyAgPSBhbHMgPj4gMzE7Ci0gIHVuc2lnbmVkIGludAkgIFNEICA9IHNmaSA+PiAzMTsKLSAgdW5zaWduZWQgaW50ICAgIFIxICA9IDE7Ci0gIHVuc2lnbmVkIGludCAgICBPVjsKLSAgdW5zaWduZWQgaW50ICAgIERCWiA9IGFscyA9PSAwID8gMSA6IDA7Ci0gIHVuc2lnbmVkIGludCAgICBRICAgPSB+KFNTIF4gU0QpICYgMTsKLSAgdW5zaWduZWQgaW50ICAgIEM7Ci0gIHVuc2lnbmVkIGludCAgICBTOwotICB1bnNpZ25lZCBpbnQgICAgaTsKLSAgdW5zaWduZWQgbG9uZyAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOwotCi0KLSAgLyogMXN0IExvb3AgKi8KLSAgCi0gIGFsbyA9IGFsZCArIGFsdCArIFE7Ci0gIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7Ci0gIFEgICA9IEMgXiBTUzsKLSAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOwotICBTICAgPSBhbG8gPj4gMzE7Ci0gIHNmaSA9IChzZmkgPDwgKDMyLU4rMSkpIHwgUTsKLSAgYWxkID0gKGFsbyA8PCAxKSB8IChzZmkgPj4gMzEpOwotICBpZiAoKGFsbyA+PiAzMSkgXiAoYWxkID4+IDMxKSkKLSAgICB7Ci0gICAgICBEQlogPSAxOwotICAgIH0KLQotICAvKiAybmQgLSBOLTF0aCBMb29wICovCi0gIAotICBmb3IgKGkgPSAyOyBpIDwgTjsgaSsrKQotICAgIHsKLSAgICAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOwotICAgICAgYWxvID0gYWxkICsgYWx0ICsgUTsKLSAgICAgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgICAgIHwgKCgoYWx0ID4+IDMxKSBeIChhbGQgPj4gMzEpKSAmICh+YWxvID4+IDMxKSkpOwotICAgICAgUSAgID0gQyBeIFNTOwotICAgICAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOwotICAgICAgUyAgID0gYWxvID4+IDMxOwotICAgICAgc2ZpID0gKHNmaSA8PCAxKSB8IFE7Ci0gICAgICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7Ci0gICAgICBpZiAoKGFsbyA+PiAzMSkgXiAoYWxkID4+IDMxKSkKLQl7Ci0JICBEQlogPSAxOwotCX0KLSAgICB9Ci0KLSAgLyogTnRoIExvb3AgKi8KLSAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7Ci0gIGFsbyA9IGFsZCArIGFsdCArIFE7Ci0gIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKLQkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7Ci0gIFEgICA9IEMgXiBTUzsKLSAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOwotICBzZmkgPSAoc2ZpIDw8ICgzMi1OKzEpKTsKLSAgYWxkID0gYWxvOwotCi0gIC8qIEVuZCAqLwotICBpZiAoYWxvICE9IDApCi0gICAgewotICAgICAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7Ci0gICAgICBhbG8gPSBhbGQgKyBhbHQgKyBROwotICAgIH0KLSAgUjEgID0gUjEgJiAoKH5hbG8gPj4gMzEpIF4gU0QpOwotICBpZiAoKGFsbyAhPSAwKSAmJiAoKFEgXiAoU1MgXiBTRCkpIF4gUjEpKSBhbG8gPSBhbGQ7Ci0gIGlmIChOICE9IDMyKQotICAgIGFsZCA9IHNmaSA9IChsb25nKSAoKHNmaSA+PiAxKSB8IChTUyBeIFNEKSA8PCAzMSkgPj4gKDMyLU4tMSkgfCBROwotICBlbHNlCi0gICAgYWxkID0gc2ZpID0gc2ZpIHwgUTsKLSAgCi0gIE9WID0gREJaIHwgKChhbG8gPT0gMCkgPyAwIDogUjEpOwotICAKLSAgKiByZW1haW5kZXJfcHRyID0gYWxvOwotCi0gIC8qIEFkaiAqLwotICBpZiAoKChhbG8gIT0gMCkgJiYgKChTUyBeIFNEKSBeIFIxKSkKLSAgICAgIHx8ICgoYWxvID09IDApICYmIChTUyBeIFIxKSkpCi0gICAgYWxvID0gYWxkICsgMTsKLSAgZWxzZQotICAgIGFsbyA9IGFsZDsKLSAgCi0gIE9WICA9IChEQlogfCBSMSkgPyBPViA6ICgoYWxvID4+IDMxKSAmICh+YWxkID4+IDMxKSk7Ci0KLSAgKiBxdW90aWVudF9wdHIgID0gYWxvOwotICAqIG92ZXJmbG93X3B0ciAgPSBPVjsKLX0KLQotLyogc2RpdnVuIGltbTUsIHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMUMyMDdFMCAodm9pZCkKLXsKLSAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gIHF1b3RpZW50OwotICB1bnNpZ25lZDMyIC8qdW5zaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOwotICB1bnNpZ25lZCBsb25nIGludCAgZGl2aWRlX2J5OwotICB1bnNpZ25lZCBsb25nIGludCAgZGl2aWRlX3RoaXM7Ci0gIGJvb2xlYW4gICAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICB1bnNpZ25lZCBpbnQgICAgICAgaW1tNTsKLSAgICAgIAotICB0cmFjZV9pbnB1dCAoInNkaXZ1biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7Ci0KLSAgaW1tNSA9IDMyIC0gKChPUFszXSAmIDB4M2MwMDAwKSA+PiAxNyk7Ci0KLSAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKLQotICBkaXZ1biAoaW1tNSwgZGl2aWRlX2J5LCBkaXZpZGVfdGhpcywgJiBxdW90aWVudCwgJiByZW1haW5kZXIsICYgb3ZlcmZsb3cpOwotICAKLSAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50OwotICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyOwotICAKLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICAKLSAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7Ci0gIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmIChxdW90aWVudCAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogc2Rpdm4gaW1tNSwgcmVnMSwgcmVnMiwgcmVnMyAqLwotaW50Ci1PUF8xQzAwN0UwICh2b2lkKQotewotICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKLSAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOwotICBzaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKLSAgc2lnbmVkIGxvbmcgaW50ICBkaXZpZGVfdGhpczsKLSAgYm9vbGVhbiAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICB1bnNpZ25lZCBpbnQgICAgIGltbTU7Ci0gICAgICAKLSAgdHJhY2VfaW5wdXQgKCJzZGl2biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7Ci0KLSAgaW1tNSA9IDMyIC0gKChPUFszXSAmIDB4M2MwMDAwKSA+PiAxNyk7Ci0KLSAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKLQotICBkaXZuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7Ci0gIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7Ci0gIAotICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogc2Rpdmh1biBpbW01LCByZWcxLCByZWcyLCByZWczICovCi1pbnQKLU9QXzE4MjA3RTAgKHZvaWQpCi17Ci0gIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKLSAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gIHJlbWFpbmRlcjsKLSAgdW5zaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgIGRpdmlkZV90aGlzOwotICBib29sZWFuICAgICAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgdW5zaWduZWQgaW50ICAgICAgIGltbTU7Ci0gICAgICAKLSAgdHJhY2VfaW5wdXQgKCJzZGl2aHVuIiwgT1BfSU1NX1JFR19SRUdfUkVHLCAwKTsKLQotICBpbW01ID0gMzIgLSAoKE9QWzNdICYgMHgzYzAwMDApID4+IDE3KTsKLQotICBkaXZpZGVfYnkgICA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gJiAweGZmZmY7Ci0gIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgT1BbMV0gXSA8PCBpbW01OwotCi0gIGRpdnVuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7Ci0gIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7Ci0gIAotICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBzZGl2aG4gaW1tNSwgcmVnMSwgcmVnMiwgcmVnMyAqLwotaW50Ci1PUF8xODAwN0UwICh2b2lkKQotewotICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKLSAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOwotICBzaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKLSAgc2lnbmVkIGxvbmcgaW50ICBkaXZpZGVfdGhpczsKLSAgYm9vbGVhbiAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICB1bnNpZ25lZCBpbnQgICAgIGltbTU7Ci0gICAgICAKLSAgdHJhY2VfaW5wdXQgKCJzZGl2aG4iLCBPUF9JTU1fUkVHX1JFR19SRUcsIDApOwotCi0gIGltbTUgPSAzMiAtICgoT1BbM10gJiAweDNjMDAwMCkgPj4gMTcpOwotCi0gIGRpdmlkZV9ieSAgID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzBdIF0pOwotICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKLQotICBkaXZuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7Ci0gIAotICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7Ci0gIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7Ci0gIAotICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogZGl2dSAgcmVnMSwgcmVnMiwgcmVnMyAqLwotaW50Ci1PUF8yQzIwN0UwICh2b2lkKQotewotICB1bnNpZ25lZCBsb25nIGludCBxdW90aWVudDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOwotICB1bnNpZ25lZCBsb25nIGludCBkaXZpZGVfYnk7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGRpdmlkZV90aGlzOwotICBib29sZWFuICAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAKLSAgdHJhY2VfaW5wdXQgKCJkaXZ1IiwgT1BfUkVHX1JFR19SRUcsIDApOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgCi0gIGRpdmlkZV9ieSAgID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKLSAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOwotICAKLSAgaWYgKGRpdmlkZV9ieSA9PSAwKQotICAgIHsKLSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLSAgICAgIGRpdmlkZV9ieSAgPSAxOwotICAgIH0KLSAgCi0gIFN0YXRlLnJlZ3NbIE9QWzFdICAgICAgIF0gPSBxdW90aWVudCAgPSBkaXZpZGVfdGhpcyAvIGRpdmlkZV9ieTsKLSAgU3RhdGUucmVnc1sgT1BbMl0gPj4gMTEgXSA9IHJlbWFpbmRlciA9IGRpdmlkZV90aGlzICUgZGl2aWRlX2J5OwotICAKLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICAKLSAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7Ci0gIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmIChxdW90aWVudCAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBkaXYgIHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMkMwMDdFMCAodm9pZCkKLXsKLSAgc2lnbmVkIGxvbmcgaW50IHF1b3RpZW50OwotICBzaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOwotICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OwotICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX3RoaXM7Ci0gIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAKLSAgdHJhY2VfaW5wdXQgKCJkaXYiLCBPUF9SRUdfUkVHX1JFRywgMCk7Ci0gIAotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICAKLSAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIAotICBpZiAoZGl2aWRlX2J5ID09IDAgfHwgKGRpdmlkZV9ieSA9PSAtMSAmJiBkaXZpZGVfdGhpcyA9PSAoMSA8PCAzMSkpKQotICAgIHsKLSAgICAgIG92ZXJmbG93ICA9IHRydWU7Ci0gICAgICBkaXZpZGVfYnkgPSAxOwotICAgIH0KLSAgCi0gIFN0YXRlLnJlZ3NbIE9QWzFdICAgICAgIF0gPSBxdW90aWVudCAgPSBkaXZpZGVfdGhpcyAvIGRpdmlkZV9ieTsKLSAgU3RhdGUucmVnc1sgT1BbMl0gPj4gMTEgXSA9IHJlbWFpbmRlciA9IGRpdmlkZV90aGlzICUgZGl2aWRlX2J5OwotICAKLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICAKLSAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7Ci0gIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmIChxdW90aWVudCA8ICAwKSBQU1cgfD0gUFNXX1M7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogZGl2aHUgIHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjgyMDdFMCAodm9pZCkKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgcXVvdGllbnQ7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlbWFpbmRlcjsKLSAgdW5zaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OwotICB1bnNpZ25lZCBsb25nIGludCBkaXZpZGVfdGhpczsKLSAgYm9vbGVhbiAgICAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgCi0gIHRyYWNlX2lucHV0ICgiZGl2aHUiLCBPUF9SRUdfUkVHX1JFRywgMCk7Ci0gIAotICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLwotICAKLSAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHhmZmZmOwotICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07Ci0gIAotICBpZiAoZGl2aWRlX2J5ID09IDApCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgZGl2aWRlX2J5ICA9IDE7Ci0gICAgfQotICAKLSAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50ICA9IGRpdmlkZV90aGlzIC8gZGl2aWRlX2J5OwotICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyID0gZGl2aWRlX3RoaXMgJSBkaXZpZGVfYnk7Ci0gIAotICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGRpdmggIHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjgwMDdFMCAodm9pZCkKLXsKLSAgc2lnbmVkIGxvbmcgaW50IHF1b3RpZW50OwotICBzaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOwotICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OwotICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX3RoaXM7Ci0gIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAKLSAgdHJhY2VfaW5wdXQgKCJkaXZoIiwgT1BfUkVHX1JFR19SRUcsIDApOwotICAKLSAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KLSAgCi0gIGRpdmlkZV9ieSAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOwotICBkaXZpZGVfdGhpcyA9IEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFsxXSBdKTsKLSAgCi0gIGlmIChkaXZpZGVfYnkgPT0gMCB8fCAoZGl2aWRlX2J5ID09IC0xICYmIGRpdmlkZV90aGlzID09ICgxIDw8IDMxKSkpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgZGl2aWRlX2J5ICA9IDE7Ci0gICAgfQotICAKLSAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50ICA9IGRpdmlkZV90aGlzIC8gZGl2aWRlX2J5OwotICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyID0gZGl2aWRlX3RoaXMgJSBkaXZpZGVfYnk7Ci0gIAotICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KLSAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7Ci0gIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFR19SRUcpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBtdWx1IGltbTksIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjQyMDdFMCAodm9pZCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJtdWx1IiwgT1BfSU1NX1JFR19SRUcsIDApOwotCi0gIE11bHRpcGx5NjQgKGZhbHNlLCAoT1BbM10gJiAweDFmKSB8ICgoT1BbM10gPj4gMTMpICYgMHgxZTApKTsKLQotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfUkVHKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogbXVsIGltbTksIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjQwMDdFMCAodm9pZCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJtdWwiLCBPUF9JTU1fUkVHX1JFRywgMCk7Ci0KLSAgTXVsdGlwbHk2NCAodHJ1ZSwgKE9QWzNdICYgMHgxZikgfCAoKE9QWzNdID4+IDEzKSAmIDB4MWUwKSk7Ci0KLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIGxkLmh1ICovCi1pbnQKLU9QXzEwN0UwICh2b2lkKQotewotICBpbnQgYWRyOwotCi0gIHRyYWNlX2lucHV0ICgibGQuaHUiLCBPUF9MT0FEMzIsIDIpOwotCi0gIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0gJiB+MSk7Ci0gIGFkciAmPSB+MHgxOwotICAgICAgCi0gIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBsb2FkX21lbSAoYWRyLCAyKTsKLSAgICAgIAotICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7Ci0gIAotICByZXR1cm4gNDsKLX0KLQotCi0vKiBsZC5idSAqLwotaW50Ci1PUF8xMDc4MCAodm9pZCkKLXsKLSAgaW50IGFkcjsKLQotICB0cmFjZV9pbnB1dCAoImxkLmJ1IiwgT1BfTE9BRDMyLCAxKTsKLQotICBhZHIgPSAoU3RhdGUucmVnc1sgT1BbMF0gXQotCSArIChFWFRFTkQxNiAoT1BbMl0gJiB+MSkgfCAoKE9QWzNdID4+IDUpICYgMSkpKTsKLSAgICAgIAotICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gbG9hZF9tZW0gKGFkciwgMSk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7Ci0gIAotICByZXR1cm4gNDsKLX0KLQotLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTMyICovCi1pbnQKLU9QXzFCMDc4MCAodm9pZCkKLXsKLSAgaW50ICBpOwotICAKLSAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCi0gICAgICB7Ci0JU1AgLT0gNDsKLQlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7Ci0gICAgICB9Ci0gIAotICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOwotCi0gIEVQID0gbG9hZF9tZW0gKFBDICsgNCwgNCk7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKLQotICByZXR1cm4gODsKLX0KLQotLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTE2LTMyICovCi1pbnQKLU9QXzEzMDc4MCAodm9pZCkKLXsKLSAgaW50ICBpOwotICAKLSAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCi0gICAgICB7Ci0JU1AgLT0gNDsKLQlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7Ci0gICAgICB9Ci0gIAotICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOwotCi0gIEVQID0gbG9hZF9tZW0gKFBDICsgNCwgMikgPDwgMTY7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKLQotICByZXR1cm4gNjsKLX0KLQotLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTE2ICovCi1pbnQKLU9QX0IwNzgwICh2b2lkKQotewotICBpbnQgIGk7Ci0gIAotICB0cmFjZV9pbnB1dCAoInByZXBhcmUiLCBPUF9QVVNIUE9QMSwgMCk7Ci0gIAotICAvKiBTdG9yZSB0aGUgcmVnaXN0ZXJzIHdpdGggbG93ZXIgbnVtYmVyIHJlZ2lzdGVycyBiZWluZyBwbGFjZWQgYXQgaGlnaGVyIGFkZHJlc3Nlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQotICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlMV9yZWdzWyBpIF0pKSkKLSAgICAgIHsKLQlTUCAtPSA0OwotCXN0b3JlX21lbSAoU1AsIDQsIFN0YXRlLnJlZ3NbIDIwICsgaSBdKTsKLSAgICAgIH0KLSAgCi0gIFNQIC09IChPUFszXSAmIDB4M2UpIDw8IDE7Ci0KLSAgRVAgPSBFWFRFTkQxNiAobG9hZF9tZW0gKFBDICsgNCwgMikpOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMSk7Ci0KLSAgcmV0dXJuIDY7Ci19Ci0KLS8qIHByZXBhcmUgbGlzdDEyLCBpbW01LCBzcCAqLwotaW50Ci1PUF8zMDc4MCAodm9pZCkKLXsKLSAgaW50ICBpOwotICAKLSAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCi0gICAgICB7Ci0JU1AgLT0gNDsKLQlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7Ci0gICAgICB9Ci0gIAotICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOwotCi0gIEVQID0gU1A7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKLQotICByZXR1cm4gNDsKLX0KLQotLyogbXVsIHJlZzEsIHJlZzIsIHJlZzMgKi8KLWludAotT1BfMjIwMDdFMCAodm9pZCkKLXsKLSAgdHJhY2VfaW5wdXQgKCJtdWwiLCBPUF9SRUdfUkVHX1JFRywgMCk7Ci0KLSAgTXVsdGlwbHk2NCAodHJ1ZSwgU3RhdGUucmVnc1sgT1BbMF0gXSk7Ci0KLSAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHX1JFRyk7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHBvcG1oIGxpc3QxOCAqLwotaW50Ci1PUF8zMDdGMCAodm9pZCkKLXsKLSAgaW50IGk7Ci0gIAotICB0cmFjZV9pbnB1dCAoInBvcG1oIiwgT1BfUFVTSFBPUDIsIDApOwotICAKLSAgaWYgKE9QWzNdICYgKDEgPDwgMTkpKQotICAgIHsKLSAgICAgIGlmICgoUFNXICYgUFNXX05QKSAmJiAoKFBTVyAmIFBTV19FUCkgPT0gMCkpCi0JewotCSAgRkVQU1cgPSBsb2FkX21lbSAoIFNQICAgICAgJiB+IDMsIDQpOwotCSAgRkVQQyAgPSBsb2FkX21lbSAoKFNQICsgNCkgJiB+IDMsIDQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFSVBTVyA9IGxvYWRfbWVtICggU1AgICAgICAmIH4gMywgNCk7Ci0JICBFSVBDICA9IGxvYWRfbWVtICgoU1AgKyA0KSAmIH4gMywgNCk7Ci0JfQotICAgICAgCi0gICAgICBTUCArPSA4OwotICAgIH0KLSAgCi0gIC8qIExvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcmV0cmlldmVkIGZyb20gaGlnaGVyIGFkZHJlc3Nlcy4gICovCi0gIGZvciAoaSA9IDE2OyBpLS07KQotICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlMl9yZWdzWyBpIF0pKSkKLSAgICAgIHsKLQlTdGF0ZS5yZWdzWyBpICsgMTYgXSA9IGxvYWRfbWVtIChTUCAmIH4gMywgNCk7Ci0JU1AgKz0gNDsKLSAgICAgIH0KLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDIpOwotCi0gIHJldHVybiA0OwotfQotCi0vKiBwb3BtbCBsc2l0MTggKi8KLWludAotT1BfMTA3RjAgKHZvaWQpCi17Ci0gIGludCBpOwotCi0gIHRyYWNlX2lucHV0ICgicG9wbWwiLCBPUF9QVVNIUE9QMywgMCk7Ci0KLSAgaWYgKE9QWzNdICYgKDEgPDwgMTkpKQotICAgIHsKLSAgICAgIGlmICgoUFNXICYgUFNXX05QKSAmJiAoKFBTVyAmIFBTV19FUCkgPT0gMCkpCi0JewotCSAgRkVQU1cgPSBsb2FkX21lbSAoIFNQICAgICAgJiB+IDMsIDQpOwotCSAgRkVQQyA9ICBsb2FkX21lbSAoKFNQICsgNCkgJiB+IDMsIDQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFSVBTVyA9IGxvYWRfbWVtICggU1AgICAgICAmIH4gMywgNCk7Ci0JICBFSVBDICA9IGxvYWRfbWVtICgoU1AgKyA0KSAmIH4gMywgNCk7Ci0JfQotICAgICAgCi0gICAgICBTUCArPSA4OwotICAgIH0KLSAgCi0gIGlmIChPUFszXSAmICgxIDw8IDMpKQotICAgIHsKLSAgICAgIFBTVyA9IGxvYWRfbWVtIChTUCAmIH4gMywgNCk7Ci0gICAgICBTUCArPSA0OwotICAgIH0KLSAgCi0gIC8qIExvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcmV0cmlldmVkIGZyb20gaGlnaGVyIGFkZHJlc3Nlcy4gICovCi0gIGZvciAoaSA9IDE1OyBpLS07KQotICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlM19yZWdzWyBpIF0pKSkKLSAgICAgIHsKLQlTdGF0ZS5yZWdzWyBpICsgMSBdID0gbG9hZF9tZW0gKFNQICYgfiAzLCA0KTsKLQlTUCArPSA0OwotICAgICAgfQotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMik7Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIHB1c2htaCBsaXN0MTggKi8KLWludAotT1BfMzA3RTAgKHZvaWQpCi17Ci0gIGludCBpOwotCi0gIHRyYWNlX2lucHV0ICgicHVzaG1oIiwgT1BfUFVTSFBPUDIsIDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTJfcmVnc1sgaSBdKSkpCi0gICAgICB7Ci0JU1AgLT0gNDsKLQlzdG9yZV9tZW0gKFNQICYgfiAzLCA0LCBTdGF0ZS5yZWdzWyBpICsgMTYgXSk7Ci0gICAgICB9Ci0gIAotICBpZiAoT1BbM10gJiAoMSA8PCAxOSkpCi0gICAgewotICAgICAgU1AgLT0gODsKLSAgICAgIAotICAgICAgaWYgKChQU1cgJiBQU1dfTlApICYmICgoUFNXICYgUFNXX0VQKSA9PSAwKSkKLQl7Ci0JICBzdG9yZV9tZW0gKChTUCArIDQpICYgfiAzLCA0LCBGRVBDKTsKLQkgIHN0b3JlX21lbSAoIFNQICAgICAgJiB+IDMsIDQsIEZFUFNXKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RvcmVfbWVtICgoU1AgKyA0KSAmIH4gMywgNCwgRUlQQyk7Ci0JICBzdG9yZV9tZW0gKCBTUCAgICAgICYgfiAzLCA0LCBFSVBTVyk7Ci0JfQotICAgIH0KLSAgCi0gIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDIpOwotCi0gIHJldHVybiA0OwotfQotCmRpZmYgLS1naXQgYS9zaW0vdjg1MC92ODUwLWRjIGIvc2ltL3Y4NTAvdjg1MC1kYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YTM3NS4uMDAwMDAwMAotLS0gYS9zaW0vdjg1MC92ODUwLWRjCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBtb3N0IGluc3RydWN0aW9ucwotIyAtLS0tLS0gb3B0aW9ucyAtLS0tLS0gOiBGc3QgOiBMc3QgOiBmZiA6IGZsIDogZmUgOiB3b3JkIDogLS0tIGZtdCAtLS0gOiBtb2RlbCAuLi4KLSMgeyA6IG1hc2sgOiB2YWx1ZSA6IHdvcmQgfQotCi0jIFRvcCBsZXZlbCAtIGNyZWF0ZSBhIHZlcnkgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuCi0KLSAgcGFkZGVkLXN3aXRjaCxjb21iaW5lIDogIDE1IDogICA1IDogICAgOiAgICA6ICAgIDogICAgMCA6ICAgICAgICAgICAgIDoKLQotCi0jIGZvciBvcGNvZGUgNjAsMTI0Ci0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6IFYsVklJICAgICAgIDoKLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6IFYsWElJSSAgICAgIDogdjg1MGUKLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6IFYsWElJSSAgICAgIDogdjg1MGVhCi0KLQotIyBmb3Igb3Bjb2RlIDYzLCAxMjcsIDEwODcgZXQuYWwuCi0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA5IDogICA1IDogICAgOiAgICA6ICAgIDogICAgMSA6ICAgICAgICAgICAgIDoKLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6ICAgICAgICAgICAgIDoKLQotCi0jIGZvciBvcGNvZGUgNDAgZXQuYWwuCi0KLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMCA6IElJSSxJViAgICAgIDoKLSAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMCA6IElJSSxJVixYSVYgIDogdjg1MGVhCi0KLSMgZm9yIG9wY29kZSA2NiAtIGRpdmgvYnJlYWsKLQotICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAwIDogSSAgICAgICAgICAgOgpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvdjg1MC5pZ2VuIGIvc2ltL3Y4NTAvdjg1MC5pZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZhNDNmLi4wMDAwMDAwCi0tLSBhL3NpbS92ODUwL3Y4NTAuaWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotOm9wdGlvbjo6Omluc24tYml0LXNpemU6MTYKLTpvcHRpb246OjpoaS1iaXQtbnI6MTUKLQotCi06b3B0aW9uOjo6Zm9ybWF0LW5hbWVzOkksSUksSUlJLElWLFYsVkksVklJLFZJSUksSVgsWAotOm9wdGlvbjo6OmZvcm1hdC1uYW1lczpYSSxYSUksWElJSQotOm9wdGlvbjo6OmZvcm1hdC1uYW1lczpYSVYsWFYKLTpvcHRpb246Ojpmb3JtYXQtbmFtZXM6WgotCi0KLTptb2RlbDo6OnY4NTA6djg1MDoKLQotOm9wdGlvbjo6Om11bHRpLXNpbTp0cnVlCi06bW9kZWw6Ojp2ODUwZTp2ODUwZToKLQotOm9wdGlvbjo6Om11bHRpLXNpbTp0cnVlCi06bW9kZWw6Ojp2ODUwZWE6djg1MGVhOgotCi0KLQotLy8gQ2FjaGUgbWFjcm9zCi0KLTpjYWNoZTo6OnVuc2lnbmVkOnJlZzE6UlJSUlI6KFJSUlJSKQotOmNhY2hlOjo6dW5zaWduZWQ6cmVnMjpycnJycjoocnJycnIpCi06Y2FjaGU6Ojp1bnNpZ25lZDpyZWczOnd3d3d3Oih3d3d3dykKLQotOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDQ6ZGRkZDooZGRkZCkKLTpjYWNoZTo6OnVuc2lnbmVkOmRpc3A1OmRkZGQ6KGRkZGQgPDwgMSkKLTpjYWNoZTo6OnVuc2lnbmVkOmRpc3A3OmRkZGRkZGQ6ZGRkZGRkZAotOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDg6ZGRkZGRkZDooZGRkZGRkZCA8PCAxKQotOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDg6ZGRkZGRkOihkZGRkZGQgPDwgMikKLTpjYWNoZTo6OnVuc2lnbmVkOmRpc3A5OmRkZGRkLGRkZDpTRVhUMzIgKChkZGRkZCA8PCA0KSArIChkZGQgPDwgMSksIDkgLSAxKQotOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDE2OmRkZGRkZGRkZGRkZGRkZGQ6RVhURU5EMTYgKGRkZGRkZGRkZGRkZGRkZGQpCi06Y2FjaGU6Ojp1bnNpZ25lZDpkaXNwMTY6ZGRkZGRkZGRkZGRkZGRkOiBFWFRFTkQxNiAoZGRkZGRkZGRkZGRkZGRkIDw8IDEpCi06Y2FjaGU6Ojp1bnNpZ25lZDpkaXNwMjI6ZGRkZGRkLGRkZGRkZGRkZGRkZGRkZDogU0VYVDMyICgoZGRkZGRkIDw8IDE2KSArIChkZGRkZGRkZGRkZGRkZGQgPDwgMSksIDIyIC0gMSkKLQotOmNhY2hlOjo6dW5zaWduZWQ6aW1tNTppaWlpaTpTRVhUMzIgKGlpaWlpLCA0KQotOmNhY2hlOjo6dW5zaWduZWQ6aW1tNjppaWlpaWk6aWlpaWlpCi06Y2FjaGU6Ojp1bnNpZ25lZDppbW05OmlpaWlpLElJSUk6U0VYVCAoKElJSUkgPDwgNSkgKyBpaWlpaSwgOSAtIDEpCi06Y2FjaGU6Ojp1bnNpZ25lZDppbW01OmlpaWk6KDMyIC0gKGlpaWkgPDwgMSkpCi06Y2FjaGU6Ojp1bnNpZ25lZDpzaW1tMTY6aWlpaWlpaWlpaWlpaWlpaTpFWFRFTkQxNiAoaWlpaWlpaWlpaWlpaWlpaSkKLTpjYWNoZTo6OnVuc2lnbmVkOnVpbW0xNjppaWlpaWlpaWlpaWlpaWlpOmlpaWlpaWlpaWlpaWlpaWkKLTpjYWNoZTo6OnVuc2lnbmVkOmltbTMyOmlpaWlpaWlpaWlpaWlpaWksSUlJSUlJSUlJSUlJSUlJSTooaWlpaWlpaWlpaWlpaWlpaSA8IDE2ICsgSUlJSUlJSUlJSUlJSUlJSSkKLTpjYWNoZTo6OnVuc2lnbmVkOnVpbW0zMjppaWlpaWlpaWlpaWlpaWlpLGRkZGRkZGRkZGRkZGRkZGQ6KChpaWlpaWlpaWlpaWlpaWlpIDw8IDE2KSArIGRkZGRkZGRkZGRkZGRkZGQpCi0KLTpjYWNoZTo6OnVuc2lnbmVkOnZlY3RvcjppaWlpaTppaWlpaQotCi06Y2FjaGU6Ojp1bnNpZ25lZDpsaXN0MTI6TCxMTExMTExMTExMTDooKEwgPDwgMTEpICsgTExMTExMTExMTEwpCi06Y2FjaGU6Ojp1bnNpZ25lZDpsaXN0MTg6TExMTCxMTExMTExMTExMTEw6KChMTExMIDw8IDEyKSArIExMTExMTExMTExMTCkKLQotOmNhY2hlOjo6dW5zaWduZWQ6Yml0MzpiYmI6YmJiCi0KLQotLy8gV2hhdCBkbyB3ZSBkbyB3aXRoIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24/Ci06aW50ZXJuYWw6Ojo6aWxsZWdhbDoKLXsKLSAgc2ltX2lvX2VwcmludGYgKFNELCAiSWxsZWdhbCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIDB4JWx4XG4iLAotCQkgICh1bnNpZ25lZCBsb25nKSBjaWEpOwotICBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwgc2ltX3NpZ25hbGxlZCwgU0lNX1NJR0lMTCk7Ci19Ci0KLQotCi0vLyBBZGQKLQotcnJycnIsMDAxMTEwLFJSUlJSOkk6OjphZGQKLSJhZGQgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzFDMCAoKSk7Ci19Ci0KLXJycnJyLDAxMDAxMCxpaWlpaTpJSTo6OmFkZAotImFkZCA8aW1tNT4scjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzI0MCAoKSk7Ci19Ci0KLQotCi0vLyBBRERJCi1ycnJyciwxMTAwMDAsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6YWRkaQotImFkZGkgPHNpbW0xNj4sIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8yIChPUF82MDAgKCkpOwotfQotCi0KLQotLy8gQU5ECi1ycnJyciwwMDEwMTAsUlJSUlI6STo6OmFuZAotImFuZCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMTQwICgpKTsKLX0KLQotCi0KLS8vIEFOREkKLXJycnJyLDExMDExMCxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWk6Vkk6OjphbmRpCi0iYW5kaSA8dWltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzZDMCAoKSk7Ci19Ci0KLQotCi0vLyBNYXAgY29uZGl0aW9uIGNvZGUgdG8gYSBzdHJpbmcKLTolczo6OjpjY2NjOmludCBjY2NjCi17Ci0gIHN3aXRjaCAoY2NjYykKLSAgICB7Ci0gICAgY2FzZSAweGY6IHJldHVybiAiZ3QiOwotICAgIGNhc2UgMHhlOiByZXR1cm4gImdlIjsKLSAgICBjYXNlIDB4NjogcmV0dXJuICJsdCI7Ci0KLSAgICBjYXNlIDB4NzogcmV0dXJuICJsZSI7Ci0KLSAgICBjYXNlIDB4YjogcmV0dXJuICJoIjsKLSAgICBjYXNlIDB4OTogcmV0dXJuICJubCI7Ci0gICAgY2FzZSAweDE6IHJldHVybiAibCI7Ci0KLSAgICBjYXNlIDB4MzogcmV0dXJuICJuaCI7Ci0KLSAgICBjYXNlIDB4MjogcmV0dXJuICJlIjsKLQotICAgIGNhc2UgMHhhOiByZXR1cm4gIm5lIjsKLQotICAgIGNhc2UgMHgwOiByZXR1cm4gInYiOwotICAgIGNhc2UgMHg4OiByZXR1cm4gIm52IjsKLSAgICBjYXNlIDB4NDogcmV0dXJuICJuIjsKLSAgICBjYXNlIDB4YzogcmV0dXJuICJwIjsKLSAgICAgIC8qIGNhc2UgMHgxOiByZXR1cm4gImMiOyAqLwotICAgICAgLyogY2FzZSAweDk6IHJldHVybiAibmMiOyAqLwotICAgICAgLyogY2FzZSAweDI6IHJldHVybiAieiI7ICovCi0gICAgICAvKiBjYXNlIDB4YTogcmV0dXJuICJueiI7ICovCi0gICAgY2FzZSAweDU6IHJldHVybiAiciI7IC8qIGFsd2F5cyAqLwotICAgIGNhc2UgMHhkOiByZXR1cm4gInNhIjsKLSAgICB9Ci0gIHJldHVybiAiKG51bGwpIjsKLX0KLQotCi0vLyBCY29uZAotZGRkZGQsMTAxMSxkZGQsY2NjYzpJSUk6OjpCY29uZAotImIlczxjY2NjPiA8ZGlzcDk+IgotewotICBpbnQgY29uZDsKLSAgaWYgKChkZGRkZCA9PSAweDAwKSAmJiAoZGRkID09IDB4MDApICYmIChjY2NjID09IDB4MDUpKSB7Ci0gICAgLy8gU3BlY2lhbCBjYXNlIC0gdHJlYXQgImJyICoiIGxpa2UgaWxsZWdhbCBpbnN0cnVjdGlvbgotICAgIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotICB9IGVsc2UgewotICAgIGNvbmQgPSBjb25kaXRpb25fbWV0IChjY2NjKTsKLSAgICBpZiAoY29uZCkKLSAgICAgIG5pYSA9IGNpYSArIGRpc3A5OwotICAgIFRSQUNFX0JSQU5DSDEgKGNvbmQpOwotICB9Ci19Ci0KLQotCi0vLyBCU0gKLXJycnJyLDExMTExMTAwMDAwICsgd3d3d3csMDExMDEwMDAwMTA6WElJOjo6YnNoCi0qdjg1MGUKLSp2ODUwZWEKLSJic2ggcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgdW5zaWduZWQzMiB2YWx1ZTsKLSAgVFJBQ0VfQUxVX0lOUFVUMSAoR1JbcmVnMl0pOwotCi0gIHZhbHVlID0gKE1PVkVEMzIgKEdSW3JlZzJdLCAyMywgMTYsIDMxLCAyNCkKLQkgICB8IE1PVkVEMzIgKEdSW3JlZzJdLCAzMSwgMjQsIDIzLCAxNikKLQkgICB8IE1PVkVEMzIgKEdSW3JlZzJdLCA3LCAwLCAxNSwgOCkKLQkgICB8IE1PVkVEMzIgKEdSW3JlZzJdLCAxNSwgOCwgNywgMCkpOwotCi0gIEdSW3JlZzNdID0gdmFsdWU7Ci0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotICBpZiAodmFsdWUgPT0gMCkgUFNXIHw9IFBTV19aOwotICBpZiAodmFsdWUgJiAweDgwMDAwMDAwKSBQU1cgfD0gUFNXX1M7Ci0gIGlmICgoKHZhbHVlICYgMHhmZikgPT0gMCkgfHwgKHZhbHVlICYgMHgwMGZmKSA9PSAwKSBQU1cgfD0gUFNXX0NZOwotCi0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzNdKTsKLX0KLQotLy8gQlNXCi1ycnJyciwxMTExMTEwMDAwMCArIHd3d3d3LDAxMTAxMDAwMDAwOlhJSTo6OmJzdwotKnY4NTBlCi0qdjg1MGVhCi0iYnN3IHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0jZGVmaW5lIFdPUkRIQVNOVUxMQllURSh4KSAoKCh4KSAtIDB4MDEwMTAxMDEpICYgfih4KSYweDgwODA4MDgwKQotICB1bnNpZ25lZDMyIHZhbHVlOwotICBUUkFDRV9BTFVfSU5QVVQxIChHUltyZWcyXSk7Ci0KLSAgdmFsdWUgPSBHUltyZWcyXTsKLSAgdmFsdWUgPj49IDI0OwotICB2YWx1ZSB8PSAoR1JbcmVnMl0gPDwgMjQpOwotICB2YWx1ZSB8PSAoKEdSW3JlZzJdIDw8IDgpICYgMHgwMGZmMDAwMCk7Ci0gIHZhbHVlIHw9ICgoR1JbcmVnMl0gPj4gOCkgJiAweDAwMDBmZjAwKTsKLSAgR1JbcmVnM10gPSB2YWx1ZTsKLQotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKLQotICBpZiAodmFsdWUgPT0gMCkgUFNXIHw9IFBTV19aOwotICBpZiAodmFsdWUgJiAweDgwMDAwMDAwKSBQU1cgfD0gUFNXX1M7Ci0gIGlmIChXT1JESEFTTlVMTEJZVEUgKHZhbHVlKSkgUFNXIHw9IFBTV19DWTsKLQotICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWczXSk7Ci19Ci0KLS8vIENBTExUCi0wMDAwMDAxMDAwLGlpaWlpaTpJSTo6OmNhbGx0Ci0qdjg1MGUKLSp2ODUwZWEKLSJjYWxsdCA8aW1tNj4iCi17Ci0gIHVuc2lnbmVkMzIgYWRyOwotICB1bnNpZ25lZDMyIG9mZjsKLSAgQ1RQQyAgPSBjaWEgKyAyOwotICBDVFBTVyA9IFBTVzsKLSAgYWRyID0gKENUQlAgJiB+MSkgKyAoaW1tNiA8PCAxKTsKLSAgb2ZmID0gbG9hZF9tZW0gKGFkciwgMikgJiB+MTsgLyogRm9yY2UgYWxpZ25tZW50ICovCi0gIG5pYSA9IChDVEJQICYgfjEpICsgb2ZmOwotICBUUkFDRV9CUkFOQ0gzIChhZHIsIENUQlAsIG9mZik7Ci19Ci0KLQotLy8gQ0xSMQotMTAsYmJiLDExMTExMCxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZGQ6VklJSTo6OmNscjEKLSJjbHIxIDxiaXQzPiwgPGRpc3AxNj5bcjxyZWcxPl0iCi17Ci0gIENPTVBBVF8yIChPUF84N0MwICgpKTsKLX0KLQotcnJycnIsMTExMTExLFJSUlJSICsgMDAwMDAwMDAxMTEwMDEwMDpJWDo6OmNscjEKLSp2ODUwZQotKnY4NTBlYQotImNscjEgcjxyZWcyPiwgW3I8cmVnMT5dIgotewotICBDT01QQVRfMiAoT1BfRTQwN0UwICgpKTsKLX0KLQotCi0vLyBDVFJFVAotMDAwMDAxMTExMTEwMDAwMCArIDAwMDAwMDAxMDEwMDAxMDA6WDo6OmN0cmV0Ci0qdjg1MGUKLSp2ODUwZWEKLSJjdHJldCIKLXsKLSAgbmlhICA9IChDVFBDICYgfjEpOwotICBQU1cgPSAoQ1RQU1cgJiAoQ1BVKS0+cHN3X21hc2spOwotICBUUkFDRV9CUkFOQ0gxIChQU1cpOwotfQotCi0vLyBDTU9WCi1ycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTEwMDEsY2NjYywwOlhJOjo6Y21vdgotKnY4NTBlCi0qdjg1MGVhCi0iY21vdiAlczxjY2NjPiwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgaW50IGNvbmQgPSBjb25kaXRpb25fbWV0IChjY2NjKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMyAoY29uZCwgR1JbcmVnMV0sIEdSW3JlZzJdKTsKLSAgR1JbcmVnM10gPSBjb25kID8gR1JbcmVnMV0gOiBHUltyZWcyXTsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1JbcmVnM10pOwotfQotCi1ycnJyciwxMTExMTEsaWlpaWkgKyB3d3d3dywwMTEwMDAsY2NjYywwOlhJSTo6OmNtb3YKLSp2ODUwZQotKnY4NTBlYQotImNtb3YgJXM8Y2NjYz4sIDxpbW01PiwgcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgaW50IGNvbmQgPSBjb25kaXRpb25fbWV0IChjY2NjKTsKLSAgVFJBQ0VfQUxVX0lOUFVUMyAoY29uZCwgaW1tNSwgR1JbcmVnMl0pOwotICBHUltyZWczXSA9IGNvbmQgPyBpbW01IDogR1JbcmVnMl07Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzNdKTsKLX0KLQotLy8gQ01QCi1ycnJyciwwMDExMTEsUlJSUlI6STo6OmNtcAotImNtcCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMUUwICgpKTsKLX0KLQotcnJycnIsMDEwMDExLGlpaWlpOklJOjo6Y21wCi0iY21wIDxpbW01PiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzI2MCAoKSk7Ci19Ci0KLQotCi0vLyBESQotMDAwMDAxMTExMTEwMDAwMCArIDAwMDAwMDAxMDExMDAwMDA6WDo6OmRpCi0iZGkiCi17Ci0gIENPTVBBVF8yIChPUF8xNjAwN0UwICgpKTsKLX0KLQotCi0KLS8vIERJU1BPU0UKLS8vIDAwMDAwMTEwMDEsaWlpaWksTCArIExMTExMTExMTExMLDAwMDAwOlhJSUk6OjpkaXNwb3NlCi0vLyAiZGlzcG9zZSA8aW1tNT4sIDxsaXN0MTI+IgotMDAwMDAxMTAwMSxpaWlpaSxMICsgTExMTExMTExMTEwsUlJSUlI6WElJSTo6OmRpc3Bvc2UKLSp2ODUwZQotKnY4NTBlYQotImRpc3Bvc2UgPGltbTU+LCA8bGlzdDEyPiI6UlJSUlIgPT0gMAotImRpc3Bvc2UgPGltbTU+LCA8bGlzdDEyPiwgW3JlZzFdIgotewotICBpbnQgaTsKLSAgU0FWRV8yOwotICAgICAgCi0gIHRyYWNlX2lucHV0ICgiZGlzcG9zZSIsIE9QX1BVU0hQT1AxLCAwKTsKLQotICBTUCArPSAoT1BbM10gJiAweDNlKSA8PCAxOwotCi0gIC8qIExvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcmV0cmlldmVkCi0gICAgIGZyb20gaGlnaGVyIGFkZHJlc3Nlcy4gICovCi0gIGZvciAoaSA9IDEyOyBpLS07KQotICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlMV9yZWdzWyBpIF0pKSkKLSAgICAgIHsKLQlTdGF0ZS5yZWdzWyAyMCArIGkgXSA9IGxvYWRfbWVtIChTUCwgNCk7Ci0JU1AgKz0gNDsKLSAgICAgIH0KLSAgCi0gIGlmICgoT1BbM10gJiAweDFmMDAwMCkgIT0gMCkKLSAgICB7Ci0gICAgICBuaWEgPSBTdGF0ZS5yZWdzWyAoT1BbM10gPj4gMTYpICYgMHgxZl07Ci0gICAgfQotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMSk7Ci19Ci0KLQotLy8gRElWCi1ycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAxMTAwMDAwMDpYSTo6OmRpdgotKnY4NTBlCi0iZGl2IHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8yQzAwN0UwICgpKTsKLX0KLQotCi0vLyBESVZICi1ycnJyciEwLDAwMDAxMCxSUlJSUiEwOkk6OjpkaXZoCi0iZGl2aCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfNDAgKCkpOwotfQotCi1ycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAxMDAwMDAwMDpYSTo6OmRpdmgKLSp2ODUwZQotImRpdmggcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzI4MDA3RTAgKCkpOwotfQotCi0KLS8vIERJVkhVCi1ycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAxMDAwMDAxMDpYSTo6OmRpdmh1Ci0qdjg1MGUKLSJkaXZodSByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBDT01QQVRfMiAoT1BfMjgyMDdFMCAoKSk7Ci19Ci0KLQotLy8gRElWVQotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTEwMDAwMTA6WEk6OjpkaXZ1Ci0qdjg1MGUKLSJkaXZ1IHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8yQzIwN0UwICgpKTsKLX0KLQotCi0vLyBFSQotMTAwMDAxMTExMTEwMDAwMCArIDAwMDAwMDAxMDExMDAwMDA6WDo6OmVpCi0iZWkiCi17Ci0gIENPTVBBVF8yIChPUF8xNjA4N0UwICgpKTsKLX0KLQotCi0KLS8vIEhBTFQKLTAwMDAwMTExMTExMDAwMDAgKyAwMDAwMDAwMTAwMTAwMDAwOlg6OjpoYWx0Ci0iaGFsdCIKLXsKLSAgQ09NUEFUXzIgKE9QXzEyMDA3RTAgKCkpOwotfQotCi0KLQotLy8gSFNXCi1ycnJyciwxMTExMTEwMDAwMCArIHd3d3d3LDAxMTAxMDAwMTAwOlhJSTo6OmhzdwotKnY4NTBlCi0qdjg1MGVhCi0iaHN3IHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIHVuc2lnbmVkMzIgdmFsdWU7Ci0gIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzJdKTsKLQotICB2YWx1ZSA9IEdSW3JlZzJdOwotICB2YWx1ZSA+Pj0gMTY7Ci0gIHZhbHVlIHw9IChHUltyZWcyXSA8PCAxNik7Ci0gIAotICBHUltyZWczXSA9IHZhbHVlOwotCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOwotCi0gIGlmICh2YWx1ZSA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmICh2YWx1ZSAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKLSAgaWYgKCgodmFsdWUgJiAweGZmZmYpID09IDApIHx8ICh2YWx1ZSAmIDB4ZmZmZjAwMDApID09IDApIFBTVyB8PSBQU1dfQ1k7Ci0KLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1JbcmVnM10pOwotfQotCi0KLQotLy8gSkFSTAotcnJycnIhMCwxMTExMCxkZGRkZGQgKyBkZGRkZGRkZGRkZGRkZGQsMDpWOjo6amFybAotImphcmwgPGRpc3AyMj4sIHI8cmVnMj4iCi17Ci0gIEdSW3JlZzJdID0gbmlhOwotICBuaWEgPSBjaWEgKyBkaXNwMjI7Ci0gIFRSQUNFX0JSQU5DSDEgKEdSW3JlZzJdKTsKLX0KLQotCi0KLS8vIEpNUAotMDAwMDAwMDAwMTEsUlJSUlI6STo6OmptcAotImptcCBbcjxyZWcxPl0iCi17Ci0gIG5pYSA9IEdSW3JlZzFdICYgfjE7Ci0gIFRSQUNFX0JSQU5DSDAgKCk7Ci19Ci0KLQotCi0vLyBKUgotMDAwMDAxMTExMCxkZGRkZGQgKyBkZGRkZGRkZGRkZGRkZGQsMDpWOjo6anIKLSJqciA8ZGlzcDIyPiIKLXsKLSAgbmlhID0gY2lhICsgZGlzcDIyOwotICBUUkFDRV9CUkFOQ0gwICgpOwotfQotCi0KLQotLy8gTEQKLXJycnJyLDExMTAwMCxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZGQ6VklJOjo6bGQuYgotImxkLmIgPGRpc3AxNj5bcjxyZWcxPl0sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8yIChPUF83MDAgKCkpOwotfQotCi1ycnJyciwxMTEwMDEsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGQsMDpWSUk6OjpsZC5oCi0ibGQuaCA8ZGlzcDE2PltyPHJlZzE+XSwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzcyMCAoKSk7Ci19Ci0KLXJycnJyLDExMTAwMSxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZCwxOlZJSTo6OmxkLncKLSJsZC53IDxkaXNwMTY+W3I8cmVnMT5dLCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfMTA3MjAgKCkpOwotfQotCi1ycnJyciEwLDExMTEwLGIsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGQsMTpWSUk6OjpsZC5idQotKnY4NTBlCi0qdjg1MGVhCi0ibGQuYnUgPGRpc3AxNj5bcjxyZWcxPl0sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8yIChPUF8xMDc4MCAoKSk7Ci19Ci0KLXJycnJyITAsMTExMTExLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkLDE6VklJOjo6bGQuaHUKLSp2ODUwZQotKnY4NTBlYQotImxkLmh1IDxkaXNwMTY+W3I8cmVnMT5dLCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfMTA3RTAgKCkpOwotfQotCi0KLS8vIExEU1IKLXJlZ0lELDExMTExMSxSUlJSUiArIDAwMDAwMDAwMDAxMDAwMDA6SVg6OjpsZHNyCi0ibGRzciByPHJlZzE+LCBzPHJlZ0lEPiIKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMSAoR1JbcmVnMV0pOwotICAKLSAgaWYgKCZQU1cgPT0gJlNSW3JlZ0lEXSkKLSAgICBQU1cgPSAoR1JbcmVnMV0gJiAoQ1BVKS0+cHN3X21hc2spOwotICBlbHNlCi0gICAgU1JbcmVnSURdID0gR1JbcmVnMV07Ci0gIAotICBUUkFDRV9BTFVfUkVTVUxUIChTUltyZWdJRF0pOwotfQotCi0KLQotLy8gTU9WCi1ycnJyciEwLDAwMDAwMCxSUlJSUjpJOjo6bW92Ci0ibW92IHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDAgKCk7Ci0gIEdSW3JlZzJdID0gR1JbcmVnMV07Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzJdKTsKLX0KLQotCi1ycnJyciEwLDAxMDAwMCxpaWlpaTpJSTo6Om1vdgotIm1vdiA8aW1tNT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF8yMDAgKCkpOwotfQotCi0wMDAwMDExMDAwMSxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWkgKyBJSUlJSUlJSUlJSUlJSUlJOlZJOjo6bW92Ci0qdjg1MGUKLSp2ODUwZWEKLSJtb3YgPGltbTMyPiwgcjxyZWcxPiIKLXsKLSAgU0FWRV8yOwotICB0cmFjZV9pbnB1dCAoIm1vdiIsIE9QX0lNTV9SRUcsIDQpOwotICBTdGF0ZS5yZWdzWyBPUFswXSBdID0gbG9hZF9tZW0gKFBDICsgMiwgNCk7Ci0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFRyk7Ci19Ci0KLQotCi0vLyBNT1ZFQQotcnJycnIhMCwxMTAwMDEsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6bW92ZWEKLSJtb3ZlYSA8c2ltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMiAoR1JbcmVnMV0sIHNpbW0xNik7Ci0gIEdSW3JlZzJdID0gR1JbcmVnMV0gKyBzaW1tMTY7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzJdKTsKLX0KLQotCi0KLS8vIE1PVkhJCi1ycnJyciEwLDExMDAxMCxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWk6Vkk6Ojptb3ZoaQotIm1vdmhpIDx1aW1tMTY+LCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfNjQwICgpKTsKLX0KLQotCi0KLS8vIE1VTAotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMDAxMDAwMDA6WEk6OjptdWwKLSp2ODUwZQotKnY4NTBlYQotIm11bCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBDT01QQVRfMiAoT1BfMjIwMDdFMCAoKSk7Ci19Ci0KLXJycnJyLDExMTExMSxpaWlpaSArIHd3d3d3LDAxMDAxLElJSUksMDA6WElJOjo6bXVsCi0qdjg1MGUKLSp2ODUwZWEKLSJtdWwgPGltbTk+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBDT01QQVRfMiAoT1BfMjQwMDdFMCAoKSk7Ci19Ci0KLQotLy8gTVVMSAotcnJycnIhMCwwMDAxMTEsUlJSUlI6STo6Om11bGgKLSJtdWxoIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF9FMCAoKSk7Ci19Ci0KLXJycnJyITAsMDEwMTExLGlpaWlpOklJOjo6bXVsaAotIm11bGggPGltbTU+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMkUwICgpKTsKLX0KLQotCi0KLS8vIE1VTEhJCi1ycnJyciEwLDExMDExMSxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWk6Vkk6OjptdWxoaQotIm11bGhpIDx1aW1tMTY+LCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfNkUwICgpKTsKLX0KLQotCi0KLS8vIE1VTFUKLXJycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDAwMTAwMDEwOlhJOjo6bXVsdQotKnY4NTBlCi0qdjg1MGVhCi0ibXVsdSByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBDT01QQVRfMiAoT1BfMjIyMDdFMCAoKSk7Ci19Ci0KLXJycnJyLDExMTExMSxpaWlpaSArIHd3d3d3LDAxMDAxLElJSUksMTA6WElJOjo6bXVsdQotKnY4NTBlCi0qdjg1MGVhCi0ibXVsdSA8aW1tOT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8yNDIwN0UwICgpKTsKLX0KLQotCi0KLS8vIE5PUAotMDAwMDAwMDAwMDAwMDAwMDpJOjo6bm9wCi0ibm9wIgotewotICAvKiBkbyBub3RoaW5nLCB0cmFjZSBub3RoaW5nICovCi19Ci0KLQotCi0vLyBOT1QKLXJycnJyLDAwMDAwMSxSUlJSUjpJOjo6bm90Ci0ibm90IHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF8yMCAoKSk7Ci19Ci0KLQotCi0vLyBOT1QxCi0wMSxiYmIsMTExMTEwLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkZDpWSUlJOjo6bm90MQotIm5vdDEgPGJpdDM+LCA8ZGlzcDE2PltyPHJlZzE+XSIKLXsKLSAgQ09NUEFUXzIgKE9QXzQ3QzAgKCkpOwotfQotCi1ycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDExMTAwMDEwOklYOjo6bm90MQotKnY4NTBlCi0qdjg1MGVhCi0ibm90MSByPHJlZzI+LCByPHJlZzE+IgotewotICBDT01QQVRfMiAoT1BfRTIwN0UwICgpKTsKLX0KLQotCi0KLS8vIE9SCi1ycnJyciwwMDEwMDAsUlJSUlI6STo6Om9yCi0ib3IgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzEwMCAoKSk7Ci19Ci0KLQotCi0vLyBPUkkgCi1ycnJyciwxMTAxMDAsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6b3JpCi0ib3JpIDx1aW1tMTY+LCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfNjgwICgpKTsKLX0KLQotCi0KLS8vIFBSRVBBUkUKLTAwMDAwMTExMTAsaWlpaWksTCArIExMTExMTExMTExMLDAwMDAxOlhJSUk6OjpwcmVwYXJlCi0qdjg1MGUKLSp2ODUwZWEKLSJwcmVwYXJlIDxsaXN0MTI+LCA8aW1tNT4iCi17Ci0gIGludCAgaTsKLSAgU0FWRV8yOwotICAKLSAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOwotICAKLSAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0Ci0gICAgIGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCi0gICAgICB7Ci0JU1AgLT0gNDsKLQlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7Ci0gICAgICB9Ci0gIAotICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOwotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMSk7Ci19Ci0KLQotMDAwMDAxMTExMCxpaWlpaSxMICsgTExMTExMTExMTEwsMDAwMTE6WElJSTo6OnByZXBhcmUwMAotKnY4NTBlCi0qdjg1MGVhCi0icHJlcGFyZSA8bGlzdDEyPiwgPGltbTU+LCBzcCIKLXsKLSAgQ09NUEFUXzIgKE9QXzMwNzgwICgpKTsKLX0KLQotMDAwMDAxMTExMCxpaWlpaSxMICsgTExMTExMTExMTEwsMDEwMTEgKyBpaWlpaWlpaWlpaWlpaWlpOlhJSUk6OjpwcmVwYXJlMDEKLSp2ODUwZQotKnY4NTBlYQotInByZXBhcmUgPGxpc3QxMj4sIDxpbW01PiwgPHVpbW0xNj4iCi17Ci0gIENPTVBBVF8yIChPUF9CMDc4MCAoKSk7Ci19Ci0KLTAwMDAwMTExMTAsaWlpaWksTCArIExMTExMTExMTExMLDEwMDExICsgaWlpaWlpaWlpaWlpaWlpaTpYSUlJOjo6cHJlcGFyZTEwCi0qdjg1MGUKLSp2ODUwZWEKLSJwcmVwYXJlIDxsaXN0MTI+LCA8aW1tNT4sIDx1aW1tMTY+IgotewotICBDT01QQVRfMiAoT1BfMTMwNzgwICgpKTsKLX0KLQotMDAwMDAxMTExMCxpaWlpaSxMICsgTExMTExMTExMTEwsMTEwMTEgKyBpaWlpaWlpaWlpaWlpaWlpICsgZGRkZGRkZGRkZGRkZGRkZDpYSUlJOjo6cHJlcGFyZTExCi0qdjg1MGUKLSp2ODUwZWEKLSJwcmVwYXJlIDxsaXN0MTI+LCA8aW1tNT4sIDx1aW1tMzI+IgotewotICBDT01QQVRfMiAoT1BfMUIwNzgwICgpKTsKLX0KLQotCi0KLS8vIFJFVEkKLTAwMDAwMTExMTExMDAwMDAgKyAwMDAwMDAwMTAxMDAwMDAwOlg6OjpyZXRpCi0icmV0aSIKLXsKLSAgaWYgKChQU1cgJiBQU1dfRVApKQotICAgIHsKLSAgICAgIG5pYSA9IChFSVBDICYgfjEpOwotICAgICAgUFNXID0gRUlQU1c7Ci0gICAgfQotICBlbHNlIGlmICgoUFNXICYgUFNXX05QKSkKLSAgICB7Ci0gICAgICBuaWEgPSAoRkVQQyAmIH4xKTsKLSAgICAgIFBTVyA9IEZFUFNXOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5pYSA9IChFSVBDICYgfjEpOwotICAgICAgUFNXID0gRUlQU1c7Ci0gICAgfQotICBUUkFDRV9CUkFOQ0gxIChQU1cpOwotfQotCi0KLQotLy8gU0FSCi1ycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDEwMTAwMDAwOklYOjo6c2FyCi0ic2FyIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8yIChPUF9BMDA3RTAgKCkpOwotfQotCi1ycnJyciwwMTAxMDEsaWlpaWk6SUk6OjpzYXIKLSJzYXIgPGltbTU+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMkEwICgpKTsKLX0KLQotCi0KLS8vIFNBU0YKLXJycnJyLDExMTExMTAsY2NjYyArIDAwMDAwMDEwMDAwMDAwMDA6SVg6OjpzYXNmCi0qdjg1MGUKLSp2ODUwZWEKLSJzYXNmICVzPGNjY2M+LCByPHJlZzI+IgotewotICBDT01QQVRfMiAoT1BfMjAwMDdFMCAoKSk7Ci19Ci0KLQotCi0KLS8vIFNBVEFERAotcnJycnIhMCwwMDAxMTAsUlJSUlI6STo6OnNhdGFkZAotInNhdGFkZCByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfQzAgKCkpOwotfQotCi1ycnJyciEwLDAxMDAwMSxpaWlpaTpJSTo6OnNhdGFkZAotInNhdGFkZCA8aW1tNT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF8yMjAgKCkpOwotfQotCi0KLQotLy8gU0FUU1VCCi1ycnJyciEwLDAwMDEwMSxSUlJSUjpJOjo6c2F0c3ViCi0ic2F0c3ViIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF9BMCAoKSk7Ci19Ci0KLQotCi0vLyBTQVRTVUJJCi1ycnJyciEwLDExMDAxMSxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWk6Vkk6OjpzYXRzdWJpCi0ic2F0c3ViaSA8c2ltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzY2MCAoKSk7Ci19Ci0KLQotCi0vLyBTQVRTVUJSCi1ycnJyciEwLDAwMDEwMCxSUlJSUjpJOjo6c2F0c3VicgotInNhdHN1YnIgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzgwICgpKTsKLX0KLQotCi0KLS8vIFNFVEYKLXJycnJyLDExMTExMTAsY2NjYyArIDAwMDAwMDAwMDAwMDAwMDA6SVg6OjpzZXRmCi0ic2V0ZiAlczxjY2NjPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzdFMCAoKSk7Ci19Ci0KLQotCi0vLyBTRVQxCi0wMCxiYmIsMTExMTEwLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkZDpWSUlJOjo6c2V0MQotInNldDEgPGJpdDM+LCA8ZGlzcDE2PltyPHJlZzE+XSIKLXsKLSAgQ09NUEFUXzIgKE9QXzdDMCAoKSk7Ci19Ci0KLXJycnJyLDExMTExMSxSUlJSUiArIDAwMDAwMDAwMTExMDAwMDA6SVg6OjpzZXQxCi0qdjg1MGUKLSp2ODUwZWEKLSJzZXQxIHI8cmVnMj4sIFtyPHJlZzE+XSIKLXsKLSAgQ09NUEFUXzIgKE9QX0UwMDdFMCAoKSk7Ci19Ci0KLQotCi0vLyBTSEwKLXJycnJyLDExMTExMSxSUlJSUiArIDAwMDAwMDAwMTEwMDAwMDA6SVg6OjpzaGwKLSJzaGwgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QX0MwMDdFMCAoKSk7Ci19Ci0KLXJycnJyLDAxMDExMCxpaWlpaTpJSTo6OnNobAotInNobCA8aW1tNT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF8yQzAgKCkpOwotfQotCi0KLQotLy8gU0hSCi1ycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDEwMDAwMDAwOklYOjo6c2hyCi0ic2hyIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8yIChPUF84MDA3RTAgKCkpOwotfQotCi1ycnJyciwwMTAxMDAsaWlpaWk6SUk6OjpzaHIKLSJzaHIgPGltbTU+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMjgwICgpKTsKLX0KLQotCi0KLS8vIFNMRAotcnJycnIsMDExMCxkZGRkZGRkOklWOjo6c2xkLmIKLSJzbGQuYnUgPGRpc3A3PltlcF0sIHI8cmVnMj4iOihQU1cgJiBQU1dfVVMpCi0ic2xkLmIgPGRpc3A3PltlcF0sIHI8cmVnMj4iCi17Ci0gIHVuc2lnbmVkMzIgYWRkciA9IEVQICsgZGlzcDc7Ci0gIHVuc2lnbmVkMzIgcmVzdWx0ID0gbG9hZF9tZW0gKGFkZHIsIDEpOwotICBpZiAoUFNXICYgUFNXX1VTKQotICAgIHsKLSAgICAgIEdSW3JlZzJdID0gcmVzdWx0OwotICAgICAgVFJBQ0VfTERfTkFNRSAoInNsZC5idSIsIGFkZHIsIHJlc3VsdCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gRVhURU5EOCAocmVzdWx0KTsKLSAgICAgIEdSW3JlZzJdID0gcmVzdWx0OwotICAgICAgVFJBQ0VfTEQgKGFkZHIsIHJlc3VsdCk7Ci0gICAgfQotfQotCi1ycnJyciwxMDAwLGRkZGRkZGQ6SVY6OjpzbGQuaAotInNsZC5odSA8ZGlzcDg+W2VwXSwgcjxyZWcyPiI6KFBTVyAmIFBTV19VUykKLSJzbGQuaCA8ZGlzcDg+W2VwXSwgcjxyZWcyPiIKLXsKLSAgdW5zaWduZWQzMiBhZGRyID0gRVAgKyBkaXNwODsKLSAgdW5zaWduZWQzMiByZXN1bHQgPSBsb2FkX21lbSAoYWRkciwgMik7Ci0gIGlmIChQU1cgJiBQU1dfVVMpCi0gICAgewotICAgICAgR1JbcmVnMl0gPSByZXN1bHQ7Ci0gICAgICBUUkFDRV9MRF9OQU1FICgic2xkLmh1IiwgYWRkciwgcmVzdWx0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBFWFRFTkQxNiAocmVzdWx0KTsKLSAgICAgIEdSW3JlZzJdID0gcmVzdWx0OwotICAgICAgVFJBQ0VfTEQgKGFkZHIsIHJlc3VsdCk7Ci0gICAgfQotfQotCi1ycnJyciwxMDEwLGRkZGRkZCwwOklWOjo6c2xkLncKLSJzbGQudyA8ZGlzcDg+W2VwXSwgcjxyZWcyPiIKLXsKLSAgdW5zaWduZWQzMiBhZGRyID0gRVAgKyBkaXNwODsKLSAgdW5zaWduZWQzMiByZXN1bHQgPSBsb2FkX21lbSAoYWRkciwgNCk7Ci0gIEdSW3JlZzJdID0gcmVzdWx0OwotICBUUkFDRV9MRCAoYWRkciwgcmVzdWx0KTsKLX0KLQotcnJycnIhMCwwMDAwMTEwLGRkZGQ6SVY6OjpzbGQuYnUKLSp2ODUwZQotKnY4NTBlYQotInNsZC5iIDxkaXNwND5bZXBdLCByPHJlZzI+IjooUFNXICYgUFNXX1VTKQotInNsZC5idSA8ZGlzcDQ+W2VwXSwgcjxyZWcyPiIKLXsKLSAgdW5zaWduZWQzMiBhZGRyID0gRVAgKyBkaXNwNDsKLSAgdW5zaWduZWQzMiByZXN1bHQgPSBsb2FkX21lbSAoYWRkciwgMSk7Ci0gIGlmIChQU1cgJiBQU1dfVVMpCi0gICAgewotICAgICAgcmVzdWx0ID0gRVhURU5EOCAocmVzdWx0KTsKLSAgICAgIEdSW3JlZzJdID0gcmVzdWx0OwotICAgICAgVFJBQ0VfTERfTkFNRSAoInNsZC5iIiwgYWRkciwgcmVzdWx0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBHUltyZWcyXSA9IHJlc3VsdDsKLSAgICAgIFRSQUNFX0xEIChhZGRyLCByZXN1bHQpOwotICAgIH0KLX0KLQotcnJycnIhMCwwMDAwMTExLGRkZGQ6SVY6OjpzbGQuaHUKLSp2ODUwZQotKnY4NTBlYQotInNsZC5oIDxkaXNwNT5bZXBdLCByPHJlZzI+IjooUFNXICYgUFNXX1VTKQotInNsZC5odSA8ZGlzcDU+W2VwXSwgcjxyZWcyPiIKLXsKLSAgdW5zaWduZWQzMiBhZGRyID0gRVAgKyBkaXNwNTsKLSAgdW5zaWduZWQzMiByZXN1bHQgPSBsb2FkX21lbSAoYWRkciwgMik7Ci0gIGlmIChQU1cgJiBQU1dfVVMpCi0gICAgewotICAgICAgcmVzdWx0ID0gRVhURU5EMTYgKHJlc3VsdCk7Ci0gICAgICBHUltyZWcyXSA9IHJlc3VsdDsKLSAgICAgIFRSQUNFX0xEX05BTUUgKCJzbGQuaCIsIGFkZHIsIHJlc3VsdCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgR1JbcmVnMl0gPSByZXN1bHQ7Ci0gICAgICBUUkFDRV9MRCAoYWRkciwgcmVzdWx0KTsKLSAgICB9Ci19Ci0KLQotLy8gU1NUCi1ycnJyciwwMTExLGRkZGRkZGQ6SVY6Ojpzc3QuYgotInNzdC5iIHI8cmVnMj4sIDxkaXNwNz5bZXBdIgotewotICBDT01QQVRfMSAoT1BfMzgwICgpKTsKLX0KLQotcnJycnIsMTAwMSxkZGRkZGRkOklWOjo6c3N0LmgKLSJzc3QuaCByPHJlZzI+LCA8ZGlzcDg+W2VwXSIKLXsKLSAgQ09NUEFUXzEgKE9QXzQ4MCAoKSk7Ci19Ci0KLXJycnJyLDEwMTAsZGRkZGRkLDE6SVY6Ojpzc3QudwotInNzdC53IHI8cmVnMj4sIDxkaXNwOD5bZXBdIgotewotICBDT01QQVRfMSAoT1BfNTAxICgpKTsKLX0KLQotCi0KLS8vIFNUCi1ycnJyciwxMTEwMTAsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGRkOlZJSTo6OnN0LmIKLSJzdC5iIHI8cmVnMj4sIDxkaXNwMTY+W3I8cmVnMT5dIgotewotICBDT01QQVRfMiAoT1BfNzQwICgpKTsKLX0KLQotcnJycnIsMTExMDExLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkLDA6VklJOjo6c3QuaAotInN0LmggcjxyZWcyPiwgPGRpc3AxNj5bcjxyZWcxPl0iCi17Ci0gIENPTVBBVF8yIChPUF83NjAgKCkpOwotfQotCi1ycnJyciwxMTEwMTEsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGQsMTpWSUk6OjpzdC53Ci0ic3QudyByPHJlZzI+LCA8ZGlzcDE2PltyPHJlZzE+XSIKLXsKLSAgQ09NUEFUXzIgKE9QXzEwNzYwICgpKTsKLX0KLQotCi0KLS8vIFNUU1IKLXJycnJyLDExMTExMSxyZWdJRCArIDAwMDAwMDAwMDEwMDAwMDA6SVg6OjpzdHNyCi0ic3RzciBzPHJlZ0lEPiwgcjxyZWcyPiIKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMSAoU1JbcmVnSURdKTsKLSAgR1JbcmVnMl0gPSBTUltyZWdJRF07Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzJdKTsKLX0KLQotCi0KLS8vIFNVQgotcnJycnIsMDAxMTAxLFJSUlJSOkk6OjpzdWIKLSJzdWIgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzFBMCAoKSk7Ci19Ci0KLQotCi0vLyBTVUJSCi1ycnJyciwwMDExMDAsUlJSUlI6STo6OnN1YnIKLSJzdWJyIHI8cmVnMT4sIHI8cmVnMj4iCi17Ci0gIENPTVBBVF8xIChPUF8xODAgKCkpOwotfQotCi0KLQotLy8gU1dJVENICi0wMDAwMDAwMDAxMCxSUlJSUjpJOjo6c3dpdGNoCi0qdjg1MGUKLSp2ODUwZWEKLSJzd2l0Y2ggcjxyZWcxPiIKLXsKLSAgdW5zaWduZWQgbG9uZyBhZHI7Ci0gIFNBVkVfMTsKLSAgdHJhY2VfaW5wdXQgKCJzd2l0Y2giLCBPUF9SRUcsIDApOwotICBhZHIgPSAoY2lhICsgMikgKyAoU3RhdGUucmVnc1sgcmVnMSBdIDw8IDEpOwotICBuaWEgPSAoY2lhICsgMikgKyAoRVhURU5EMTYgKGxvYWRfbWVtIChhZHIsIDIpKSA8PCAxKTsKLSAgdHJhY2Vfb3V0cHV0IChPUF9SRUcpOwotfQotCi0KLS8vIFNYQgotMDAwMDAwMDAxMDEsUlJSUlI6STo6OnN4YgotKnY4NTBlCi0qdjg1MGVhCi0ic3hiIHI8cmVnMT4iCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzFdKTsKLSAgR1JbcmVnMV0gPSBFWFRFTkQ4IChHUltyZWcxXSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzFdKTsKLX0KLQotLy8gU1hICi0wMDAwMDAwMDExMSxSUlJSUjpJOjo6c3hoCi0qdjg1MGUKLSp2ODUwZWEKLSJzeGggcjxyZWcxPiIKLXsKLSAgVFJBQ0VfQUxVX0lOUFVUMSAoR1JbcmVnMV0pOwotICBHUltyZWcxXSA9IEVYVEVORDE2IChHUltyZWcxXSk7Ci0gIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzFdKTsKLX0KLQotCi0KLS8vIFRSQVAKLTAwMDAwMTExMTExLGlpaWlpICsgMDAwMDAwMDEwMDAwMDAwMDpYOjo6dHJhcAotInRyYXAgPHZlY3Rvcj4iCi17Ci0gIENPTVBBVF8yIChPUF8xMDAwN0UwICgpKTsKLX0KLQotCi0KLS8vIFRTVAotcnJycnIsMDAxMDExLFJSUlJSOkk6Ojp0c3QKLSJ0c3QgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzEgKE9QXzE2MCAoKSk7Ci19Ci0KLQotCi0vLyBUU1QxCi0xMSxiYmIsMTExMTEwLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkZDpWSUlJOjo6dHN0MQotInRzdDEgPGJpdDM+LCA8ZGlzcDE2PltyPHJlZzE+XSIKLXsKLSAgQ09NUEFUXzIgKE9QX0M3QzAgKCkpOwotfQotCi1ycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDExMTAwMTEwOklYOjo6dHN0MQotKnY4NTBlCi0qdjg1MGVhCi0idHN0MSByPHJlZzI+LCBbcjxyZWcxPl0iCi17Ci0gIENPTVBBVF8yIChPUF9FNjA3RTAgKCkpOwotfQotCi0KLQotLy8gWE9SCi1ycnJyciwwMDEwMDEsUlJSUlI6STo6OnhvcgotInhvciByPHJlZzE+LCByPHJlZzI+IgotewotICBDT01QQVRfMSAoT1BfMTIwICgpKTsKLX0KLQotCi0KLS8vIFhPUkkKLXJycnJyLDExMDEwMSxSUlJSUiArIGlpaWlpaWlpaWlpaWlpaWk6Vkk6Ojp4b3JpCi0ieG9yaSA8dWltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKLXsKLSAgQ09NUEFUXzIgKE9QXzZBMCAoKSk7Ci19Ci0KLQotCi0vLyBaWEIKLTAwMDAwMDAwMTAwLFJSUlJSOkk6Ojp6eGIKLSp2ODUwZQotKnY4NTBlYQotInp4YiByPHJlZzE+IgotewotICBUUkFDRV9BTFVfSU5QVVQxIChHUltyZWcxXSk7Ci0gIEdSW3JlZzFdID0gR1JbcmVnMV0gJiAweGZmOwotICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcxXSk7Ci19Ci0KLS8vIFpYSAotMDAwMDAwMDAxMTAsUlJSUlI6STo6Onp4aAotKnY4NTBlCi0qdjg1MGVhCi0ienhoIHI8cmVnMT4iCi17Ci0gIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzFdKTsKLSAgR1JbcmVnMV0gPSBHUltyZWcxXSAmIDB4ZmZmZjsKLSAgVFJBQ0VfQUxVX1JFU1VMVCAoR1JbcmVnMV0pOwotfQotCi0KLS8vIFJpZ2h0IGZpZWxkIG11c3QgYmUgemVybyBzbyB0aGF0IGl0IGRvZXNuJ3QgY2xhc2ggd2l0aCBESVZICi0vLyBMZWZ0IGZpZWxkIG11c3QgYmUgbm9uLXplcm8gc28gdGhhdCBpdCBkb2Vzbid0IGNsYXNoIHdpdGggU1dJVENICi0xMTExMSwwMDAwMTAsMDAwMDA6STo6OmJyZWFrCi17Ci0gIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOwotfQotCi0KLS8vIE5ldyBicmVha3BvaW50OiAweDdFMCAweDdFMAotMDAwMDAsMTExMTExLDAwMDAwICsgMDAwMDAsMTExMTEsMTAwMDAwOlg6OjppbGdvcAotewotICBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKLX0KLQotLy8gRElWSE4KLXJycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDEwLGlpaWksMDA6WEk6OjpkaXZobgotKnY4NTBlYQotImRpdmhuIDxpbW01PiwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgc2lnbmVkMzIgcXVvdGllbnQ7Ci0gIHNpZ25lZDMyIHJlbWFpbmRlcjsKLSAgc2lnbmVkMzIgZGl2aWRlX2J5OwotICBzaWduZWQzMiBkaXZpZGVfdGhpczsKLSAgYm9vbGVhbiBvdmVyZmxvdyA9IGZhbHNlOwotICBTQVZFXzI7Ci0gICAgICAKLSAgdHJhY2VfaW5wdXQgKCJkaXZobiIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7Ci0KLSAgZGl2aWRlX2J5ICAgPSBFWFRFTkQxNiAoU3RhdGUucmVnc1sgcmVnMSBdKTsKLSAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyByZWcyIF07Ci0gIAotICBkaXZuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7Ci0gIAotICBTdGF0ZS5yZWdzWyByZWcyIF0gPSBxdW90aWVudDsKLSAgU3RhdGUucmVnc1sgcmVnMyBdID0gcmVtYWluZGVyOwotICAKLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICAKLSAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7Ci0gIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmIChxdW90aWVudCA8ICAwKSBQU1cgfD0gUFNXX1M7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfUkVHX1JFRyk7Ci19Ci0KLQotCi0vLyBESVZIVU4KLXJycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDEwLGlpaWksMTA6WEk6OjpkaXZodW4KLSp2ODUwZWEKLSJkaXZodW4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBzaWduZWQzMiBxdW90aWVudDsKLSAgc2lnbmVkMzIgcmVtYWluZGVyOwotICBzaWduZWQzMiBkaXZpZGVfYnk7Ci0gIHNpZ25lZDMyIGRpdmlkZV90aGlzOwotICBib29sZWFuIG92ZXJmbG93ID0gZmFsc2U7Ci0gIFNBVkVfMjsKLSAgICAgIAotICB0cmFjZV9pbnB1dCAoImRpdmh1biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7Ci0gIAotICBkaXZpZGVfYnkgICA9IFN0YXRlLnJlZ3NbIHJlZzEgXSAmIDB4ZmZmZjsKLSAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyByZWcyIF07Ci0gIAotICBkaXZ1biAoaW1tNSwgZGl2aWRlX2J5LCBkaXZpZGVfdGhpcywgJiBxdW90aWVudCwgJiByZW1haW5kZXIsICYgb3ZlcmZsb3cpOwotICAKLSAgU3RhdGUucmVnc1sgcmVnMiBdID0gcXVvdGllbnQ7Ci0gIFN0YXRlLnJlZ3NbIHJlZzMgXSA9IHJlbWFpbmRlcjsKLSAgCi0gIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgCi0gIGlmIChvdmVyZmxvdykgICAgICBQU1cgfD0gUFNXX09WOwotICBpZiAocXVvdGllbnQgPT0gMCkgUFNXIHw9IFBTV19aOwotICBpZiAocXVvdGllbnQgJiAweDgwMDAwMDAwKSBQU1cgfD0gUFNXX1M7Ci0KLSAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFR19SRUcpOwotfQotCi0KLQotLy8gRElWTgotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTEsaWlpaSwwMDpYSTo6OmRpdm4KLSp2ODUwZWEKLSJkaXZuIDxpbW01PiwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKLXsKLSAgc2lnbmVkMzIgcXVvdGllbnQ7Ci0gIHNpZ25lZDMyIHJlbWFpbmRlcjsKLSAgc2lnbmVkMzIgZGl2aWRlX2J5OwotICBzaWduZWQzMiBkaXZpZGVfdGhpczsKLSAgYm9vbGVhbiBvdmVyZmxvdyA9IGZhbHNlOwotICBTQVZFXzI7Ci0gICAgICAKLSAgdHJhY2VfaW5wdXQgKCJkaXZuIiwgT1BfSU1NX1JFR19SRUdfUkVHLCAwKTsKLQotICBkaXZpZGVfYnkgICA9IFN0YXRlLnJlZ3NbIHJlZzEgXTsKLSAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyByZWcyIF07Ci0KLSAgZGl2biAoaW1tNSwgZGl2aWRlX2J5LCBkaXZpZGVfdGhpcywgJiBxdW90aWVudCwgJiByZW1haW5kZXIsICYgb3ZlcmZsb3cpOwotICAgICAgCi0gIFN0YXRlLnJlZ3NbIHJlZzIgXSA9IHF1b3RpZW50OwotICBTdGF0ZS5yZWdzWyByZWczIF0gPSByZW1haW5kZXI7Ci0gICAgICAKLSAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCi0gIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOwotICAKLSAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7Ci0gIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7Ci0gIGlmIChxdW90aWVudCA8ICAwKSBQU1cgfD0gUFNXX1M7Ci0gIAotICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfUkVHX1JFRyk7Ci19Ci0KLQotCi0vLyBESVZVTgotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTEsaWlpaSwxMDpYSTo6OmRpdnVuCi0qdjg1MGVhCi0iZGl2dW4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgotewotICBzaWduZWQzMiBxdW90aWVudDsKLSAgc2lnbmVkMzIgcmVtYWluZGVyOwotICBzaWduZWQzMiBkaXZpZGVfYnk7Ci0gIHNpZ25lZDMyIGRpdmlkZV90aGlzOwotICBib29sZWFuIG92ZXJmbG93ID0gZmFsc2U7Ci0gIFNBVkVfMjsKLQotICB0cmFjZV9pbnB1dCAoImRpdnVuIiwgT1BfSU1NX1JFR19SRUdfUkVHLCAwKTsKLQotICBkaXZpZGVfYnkgICA9IFN0YXRlLnJlZ3NbIHJlZzEgXTsKLSAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyByZWcyIF07Ci0KLSAgZGl2dW4gKGltbTUsIGRpdmlkZV9ieSwgZGl2aWRlX3RoaXMsICYgcXVvdGllbnQsICYgcmVtYWluZGVyLCAmIG92ZXJmbG93KTsKLSAgICAgIAotICBTdGF0ZS5yZWdzWyByZWcyIF0gPSBxdW90aWVudDsKLSAgU3RhdGUucmVnc1sgcmVnMyBdID0gcmVtYWluZGVyOwotICAgICAgCi0gIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLwotICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKLSAgICAgIAotICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKLSAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKLSAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOwotCi0gIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKLX0KLQotCi0KLS8vIFNESVZITgotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDAxMTAsaWlpaSwwMDpYSTo6OnNkaXZobgotKnY4NTBlYQotInNkaXZobiA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8xODAwN0UwICgpKTsKLX0KLQotCi0KLS8vIFNESVZIVU4KLXJycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAwMTEwLGlpaWksMTA6WEk6OjpzZGl2aHVuCi0qdjg1MGVhCi0ic2Rpdmh1biA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8xODIwN0UwICgpKTsKLX0KLQotCi0KLS8vIFNESVZOCi1ycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMDExMSxpaWlpLDAwOlhJOjo6c2Rpdm4KLSp2ODUwZWEKLSJzZGl2biA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8xQzAwN0UwICgpKTsKLX0KLQotCi0KLS8vIFNESVZVTgotcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDAxMTEsaWlpaSwxMDpYSTo6OnNkaXZ1bgotKnY4NTBlYQotInNkaXZ1biA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCi17Ci0gIENPTVBBVF8yIChPUF8xQzIwN0UwICgpKTsKLX0KLQotCi0KLS8vIFBVU0hNTAotMDAwMDAxMTExMTEwLExMTEwgKyBMTExMTExMTExMTEwsUywwMDE6WElWOjo6cHVzaG1sCi0qdjg1MGVhCi0icHVzaG1sIDxsaXN0MTg+IgotewotICBpbnQgaTsKLSAgU0FWRV8yOwotICAKLSAgdHJhY2VfaW5wdXQgKCJwdXNobWwiLCBPUF9QVVNIUE9QMywgMCk7Ci0gIAotICAvKiBTdG9yZSB0aGUgcmVnaXN0ZXJzIHdpdGggbG93ZXIgbnVtYmVyIHJlZ2lzdGVycyBiZWluZyBwbGFjZWQgYXQKLSAgICAgaGlnaGVyIGFkZHJlc3Nlcy4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCi0gICAgaWYgKChPUFszXSAmICgxIDw8IHR5cGUzX3JlZ3NbIGkgXSkpKQotICAgICAgewotCVNQIC09IDQ7Ci0Jc3RvcmVfbWVtIChTUCAmIH4gMywgNCwgU3RhdGUucmVnc1sgaSArIDEgXSk7Ci0gICAgICB9Ci0gIAotICBpZiAoT1BbM10gJiAoMSA8PCAzKSkKLSAgICB7Ci0gICAgICBTUCAtPSA0OwotICAgICAgCi0gICAgICBzdG9yZV9tZW0gKFNQICYgfiAzLCA0LCBQU1cpOwotICAgIH0KLSAgCi0gIGlmIChPUFszXSAmICgxIDw8IDE5KSkKLSAgICB7Ci0gICAgICBTUCAtPSA4OwotICAgICAgCi0gICAgICBpZiAoKFBTVyAmIFBTV19OUCkgJiYgKChQU1cgJiBQU1dfRVApID09IDApKQotCXsKLQkgIHN0b3JlX21lbSAoKFNQICsgNCkgJiB+IDMsIDQsIEZFUEMpOwotCSAgc3RvcmVfbWVtICggU1AgICAgICAmIH4gMywgNCwgRkVQU1cpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdG9yZV9tZW0gKChTUCArIDQpICYgfiAzLCA0LCBFSVBDKTsKLQkgIHN0b3JlX21lbSAoIFNQICAgICAgJiB+IDMsIDQsIEVJUFNXKTsKLQl9Ci0gICAgfQotICAKLSAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMik7Ci19Ci0KLQotCi0vLyBQVVNISE1MCi0wMDAwMDExMTExMTAsTExMTCArIExMTExMTExMTExMTCxTLDAxMTpYSVY6OjpwdXNobWgKLSp2ODUwZWEKLSJwdXNoaG1sIDxsaXN0MTg+IgotewotICBDT01QQVRfMiAoT1BfMzA3RTAgKCkpOwotfQotCi0KLQotLy8gUE9QTUwKLTAwMDAwMTExMTExMSxMTExMICsgTExMTExMTExMTExMLFMsMDAxOlhJVjo6OnBvcG1sCi0qdjg1MGVhCi0icG9wbWwgPGxpc3QxOD4iCi17Ci0gIENPTVBBVF8yIChPUF8xMDdGMCAoKSk7Ci19Ci0KLQotCi0vLyBQT1BNSAotMDAwMDAxMTExMTExLExMTEwgKyBMTExMTExMTExMTEwsUywwMTE6WElWOjo6cG9wbWgKLSp2ODUwZWEKLSJwb3BtaCA8bGlzdDE4PiIKLXsKLSAgQ09NUEFUXzIgKE9QXzMwN0YwICgpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvdjg1MF9zaW0uaCBiL3NpbS92ODUwL3Y4NTBfc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTk3MjcuLjAwMDAwMDAKLS0tIGEvc2ltL3Y4NTAvdjg1MF9zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc3RydWN0IHNpbW9wcyAKLXsKLSAgdW5zaWduZWQgbG9uZyAgIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyAgIG1hc2s7Ci0gIGludCAoKiBmdW5jKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGludCAgICBudW1vcHM7Ci0gIGludCAgICBvcGVyYW5kc1sxMl07Ci19OwpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9DaGFuZ2VMb2cgYi9zaW0vdzY1L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4ZjhiMi4uMDAwMDAwMAotLS0gYS9zaW0vdzY1L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLVN1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLVN1biBBcHIgMjYgMTU6MTk6MDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgotCURvbid0IGNhbGwgQUNfQ19DUk9TUy4KLQotRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotRnJpIEFwciAyNCAxMToxNzo0NiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmg6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuCi0JKiBNYWtlZmlsZS5pbiAoSU5UTExJQlMpOiBOZXcgbWFjcm8uCi0JKElOVExERVBTKTogTGlrZXdpc2UuCi0JKCQoUlVOX1BST0cpKTogRGVwZW5kIG9uIElOVExERVBTOyBsaW5rIGFnYWluc3QgSU5UTExJQlMuCi0JKHRvcF9idWlsZGRpcik6IE5ldyBtYWNyby4KLQotV2VkIEFwciAyMiAxNDoyOTo1MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCi1UdWUgRmViIDE3IDEyOjUyOjI0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcnVuLmMgKG1haW4pOiBQYXNzIGxlbmd0aCBpbnRvIHNpbV9mZXRjaF9yZWdpc3Rlci4KLQotCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgotIAlsZW5ndGggcGFyYW1ldGVyLiBSZXR1cm4gLTEuCi0KLVR1ZSBBdWcgMjYgMTA6NDM6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4gIFNldCBQQyBmcm9tIHNhbWUuCi0KLU1vbiBBdWcgMjUgMTY6MzQ6MzMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4gQ2hhbmdlIEFSR1YgdG8gUEFSR1YuCi0KLVR1ZSBNYXkgMjAgMTA6MjQ6NTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCi0KLVR1ZSBBcHIgMTUgMTQ6NTU6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pIGFuZAotCSQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLU1vbiBBcHIgMTQgMTY6MzA6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLVdlZCBBcHIgIDIgMTU6NDA6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuICBgbmFtZSBpcyBub3cgYGFyZ3YnLgotCi1UaHUgT2N0ICAzIDE2OjE3OjU5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCi0KLVdlZCBKdW4gMjYgMTI6MzA6NDUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotICAgICAgICBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotICAgICAgICAoZG9jZGlyKTogUmVtb3ZlZC4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0gICAgICAgIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBGZWIgMjEgMTI6MTc6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVRodSBPY3QgMTkgMjE6NDQ6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHRhYnMgZnJvbSBvdGhlcndpc2UgZW1wdHkgbGluZS4KLQlDb25mdXNlcyBtYW55IG9sZGVyIG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgotCi1UdWUgT2N0IDEwIDExOjEzOjAxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT05GTEFHUyk6IFJlbW92ZSBtYWNyby4KLQotV2VkIFNlcCAyMCAxMzozNTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotRnJpIFNlcCAgOCAxNDowMzozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29udmVydCB0byB1c2UgYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvY29uZi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoSU5TVEFMTCk6IEdvIHVwIHR3byBsZXZlbHMsIG5vdCBvbmUuCi0JKEFMTE9DQSwgTUFMTE9DLCBPUENPREVTKTogUmVtb3ZlLgotCShnZW5jb2RlKTogVXNlICQoQ0NfRk9SX0JVSUxEKS4KLQkoY2FzZS5vKTogUmVtb3ZlLgotCShydW4ubywgaW50ZXJwLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkqIGludGVycC5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0JSW5jbHVkZSA8c3RkbGliLmg+LCA8dGltZS5oPiwgYW5kIDx1bmlzdGQuaD4gaWYgdGhleSBleGlzdC4KLQkqIHJ1bi5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlCi0JPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuICBJbmNsdWRlICJnZXRvcHQuaCIuICBEZWNsYXJlIHByaW50ZiBpZgotCW5lY2Vzc2FyeS4KLQotVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KLQotV2VkIEp1bCAgNSAxNjoxMjo1MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHc2NS5tdDogUmVtb3ZlZC4KLQotV2VkIE1heSAyNCAxNjozMTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLU1vbiBNYXIgMjcgMTA6MzI6MzQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBydW4uYzogcGFyc2UgYXJndW1lbnRzIHdpdGggZ2V0b3B0KCkuCi0KLVR1ZSBGZWIgMjggMTc6MzE6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCBpZiBzcGVjaWZpYwotCWhvc3QgdW5hdmFpbGFibGUuCi0KLQkqIFN0YXJ0ZWQgQ2hhbmdlTG9nLgpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9NYWtlZmlsZS5pbiBiL3NpbS93NjUvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDNiZDUuLjAwMDAwMDAKLS0tIGEvc2ltL3c2NS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBHTlUgYmluYXJ5LWZpbGUgdXRpbGl0aWVzCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBiaW51dGlscy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLVZQQVRIID0gQHNyY2RpckAKLXNyY2RpciA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWJpbmRpciA9IEBiaW5kaXJACi1saWJkaXIgPSBAbGliZGlyQAotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1kYXRhZGlyID0gQGRhdGFkaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotCi0jIFRoaXMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGdldHRleHQgY29uZmlndXJhdGlvbiBjb2RlLgotdG9wX2J1aWxkZGlyID0gLi4KLQotU0hFTEwgPSAvYmluL3NoCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotCi1BUiA9IEBBUkAKLUFSX0ZMQUdTID0gcXYKLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLU1BS0VJTkZPID0gbWFrZWluZm8KLVRFWEkyRFZJID0gdGV4aTJkdmkKLVJBTkxJQiA9IEBSQU5MSUJACi1URVhJMlJPRkY9dGV4aTJyb2ZmCi1NQUtFT1ZFUlJJREVTPQotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLQotSERFRklORVMgPSBASERFRklORVNACi1UREVGSU5FUyA9Ci0KLSMgQ29tbWVudCB0aGVzZSBvdXQgaWYgdXNpbmcgbGV4LgotIyBEaXN0cmlidXRpb24gdmVyc2lvbgotCi0jIERpc3RyaWJ1dGlvbiBuYW1lCi0KLSMgV2hlcmUgdG8gZmluZCB0ZXhpbmZvLnRleCB0byBmb3JtYXQgZG9jbiB3aXRoIFRlWAotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi90ZXhpbmZvCi0KLSMgVGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBwcm9ncmFtIHRvby4KLVJVTl9QUk9HPXJ1bgotU0lNX0xJQj1saWJzaW0uYQotQURETF9MSUJTPQotCi1QUk9HUyA9ICQoUlVOX1BST0cpCi1MSUJTPSAkKFNJTV9MSUIpCi0KLURJU1RTVFVGRiA9ICQoUFJPR1MpICQoTElCUykKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLi8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotR0RCRElSID0gJChCQVNFRElSKS9nZGIKLUlOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JLi4vLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJChHREJESVIpCi0KLSMjIyMgaG9zdCBhbmQgdGFyZ2V0IGRlcGVuZGFudCBNYWtlZmlsZSBmcmFnbWVudHMgY29tZSBpbiBoZXJlLgotIyMjCi0KLUFMTF9DRkxBR1MgPSAkKElOQ0xVREVTKSAkKEhERUZJTkVTKSAkKFRERUZJTkVTKSAkKENGTEFHUykKLQotLmMubzoKLQkkKENDKSAtYyAkKEFMTF9DRkxBR1MpICQ8Ci0KLUxJQklCRVJUWSA9IC4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1CRkQgPSAuLi8uLi9iZmQvbGliYmZkLmEKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLQotUlVOVEVTVCA9IHJ1bnRlc3QKLVJVTlRFU1RGTEFHUyA9IAotRkxBR1NfVE9fUEFTUyA9IFwKLQkiQ0M9JChDQykiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJSVU5URVNUPSQoUlVOVEVTVCkiIFwKLQkiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIKLQotIwwKLSMjIFRoZSBydWxlcwotCi1hbGw6ICQoTElCUykgJChQUk9HUykKLQotCi0kKFJVTl9QUk9HKTogJChMSUJTKSBydW4ubyAkKEJGRCkgJChJTlRMREVQUykKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKFJVTl9QUk9HKSBydW4ubyAkKFNJTV9MSUIpICQoQkZEKSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotJChTSU1fTElCKTogY2FzZS5vIGludGVycC5vCi0Jcm0gLWYgJChTSU1fTElCKQotCSQoQVIpICQoQVJfRkxBR1MpICQoU0lNX0xJQikgY2FzZS5vIGludGVycC5vCi0JJChSQU5MSUIpICQoU0lNX0xJQikKLQotY2FzZS5jOiBnZW5jb2RlCi0JLi9nZW5jb2RlIC1jID5jYXNlLmMgICAgICAgICAgICAgICAgICAgICA7IFwKLQlpZiBbIC14IC91c3IvbGF0ZXN0L2Jpbi9pbmRlbnQgXSA7IHRoZW4gICAgXAotCQkvdXNyL2xhdGVzdC9iaW4vaW5kZW50IGNhc2UuYyAgICA7IFwKLQlmaQotCi1vcHRhYmxlOmdlbmNvZGUKLQkuL2dlbmNvZGUgPm9wdGFibGUKLQkuL2dlbmNvZGUgLWEgPiQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL3c2NS1vcGMuaAotCi1nZW5jb2RlOmdlbmNvZGUuYwotCSQoQ0NfRk9SX0JVSUxEKSAtbyBnZW5jb2RlICQ8Ci0KLXJ1bi5vOnJ1bi5jIGNvbmZpZy5oCi1pbnRlcnAubzppbnRlcnAuYyBjb25maWcuaAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotbW9zdGx5Y2xlYW46Ci0JLXJtIC1mICoubyAqfiBcIyogY29yZSBiaW51dGlscy4/PyBiaW51dGlscy4/Pz8gY2FzZS5jCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCS1ybSAtZiAkKFBST0dTKSAqLm8gKi5hCi0KLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBzeXNkZXAuaCAqLm8gKn4gXCMqIGNvcmUgeS4qIFwKLQkJYmludXRpbHMuPz8gYmludXRpbHMuPz9zIGJpbnV0aWxzLmF1eCBiaW51dGlscy5sb2cgXAotCQliaW51dGlscy50b2MgZ2VuY29kZSBydW4gY29uZmlnLmxvZwotCS1ybSAtZiAkKFBST0dTKSBjb25maWcuaCBzdGFtcC1oCi0KLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbiBkaXN0Y2xlYW4KLQktcm0gLWYgJChESVNUU1RVRkYpIFRBR1MKLQotZXRhZ3MgdGFnczogVEFHUwotCi1UQUdTOiBmb3JjZQotCWV0YWdzICQoSU5DRElSKS8qLmggJChzcmNkaXIpLyouW2hjXSAKLQotaW5zdGFsbDogYWxsIGluc3RhbGxkaXJzCi0JZm9yIGkgaW4gJChQUk9HUykgOyBkbyBcCi0JICBuPWBlY2hvICQkaSB8IHNlZCAtZSAncy8ubmV3Ly8nIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKLQkgICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkgJChiaW5kaXIpLyQkbjsgXAotCWRvbmUKLQotaW5zdGFsbGRpcnM6Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMgJChiaW5kaXIpCi0KLWluc3RhbGwtaW5mbzoKLQotY2xlYW4taW5mbzoKLQktcm0gLXJmICouaW5mbyoKLQotIyBNYWtpbmcgYSBkaXN0OgotIyBjdnMgcnRhZyBiaW51dGlscy14LXl5IGxkK3V0aWxzCi0jIGN2cyBjbyAtciBiaW51dGlscy14LXl5IGxkK3V0aWxzCi0jIGNkIHtIRVJFfTsgbWFrZSBkaXN0IFstZiBNYWtlZmlsZS5pbl0KLQotZGlzdDogJChESVNUX05BTUUpLnRhci56Ci0KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpCi0KLSQoRElTVF9OQU1FKS50YXIuejoKLQljZCAuLi8uLjsgcm0gLWYgJChESVNUX05BTUUpOyBsbiAtcyBkZXZvICQoRElTVF9OQU1FKQotCW1ha2UgZGlzdHN0dWZmIC1mIE1ha2VmaWxlLmluCi0JY2QgLi4vbGQ7IG1ha2UgZGlzdHN0dWZmIC1mIE1ha2VmaWxlLmluCi0JY2QgLi4vZ3Byb2Y7IG1ha2UgZGlzdHN0dWZmIC1mIE1ha2VmaWxlLmluCi0JY2QgLi4vdGV4aW5mbzsgbXYgdGV4aW5mby50ZXggLi47IHJtIC1yZiAqOyBtdiAuLi90ZXhpbmZvLnRleCAuCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQltdiAuLi9jb25maWd1cmUuaW4gdG1wOyBcCi0JICBzZWQgLWUgJy9eaG9zdF90b29scz0vcy90ZXhpbmZvIC8vJyA8dG1wID4uLi9jb25maWd1cmUuaW47IHJtIHRtcAotCWNkIC4uOyBjaG1vZCBvZz11IGBmaW5kIC4gLXByaW50YAotCWNkIC4uLy4uOyB0YXIgY2hmIC0gJChESVNUX05BTUUpIHwgZ3ppcCA+JChESVNUX05BTUUpLnRhci56Ci0Jcm0gLXJmIC4uLy4uLyQoRElTVF9OQU1FKQotCi0KLSMgRHVtbXkgdGFyZ2V0IHRvIGZvcmNlIGV4ZWN1dGlvbiBvZiBkZXBlbmRlbnQgdGFyZ2V0cy4KLSMKLWZvcmNlOgotCi0jIFRhcmdldCB0byB1bmNvbW1lbnQgaG9zdC1zcGVjaWZpYyBsaW5lcyBpbiB0aGlzIG1ha2VmaWxlLiAgU3VjaCBsaW5lcyBtdXN0Ci0jIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJpbmcgYmVnaW5uaW5nIGluIGNvbHVtbiAxOiAjX188aG9zdG5hbWU+X18jCi0jIE9yaWdpbmFsIE1ha2VmaWxlIGlzIGJhY2tlZCB1cCBhcyAnTWFrZWZpbGUub2xkJy4KLSMKLSMgSW52b2tlIHdpdGg6ICBtYWtlIG1ha2UgSE9TVD14eHgKLSMKLW1ha2U6Ci0JLUBpZiB0ZXN0ICQoSE9TVCl4ID0geCA7IHRoZW4gXAotCQllY2hvICcHU3BlY2lmeSAibWFrZSBtYWtlIEhPU1Q9Pz8/Iic7IFwKLQkJZXhpdCAxOyBcCi0JZmkgOyBcCi0JZ3JlcCAtcyAiXiNUaGUgbmV4dCBsaW5lIHdhcyBnZW5lcmF0ZWQgYnkgJ21ha2UgbWFrZSciIE1ha2VmaWxlOyBcCi0JaWYgdGVzdCAkJD8gPSAwIDsgdGhlbglcCi0JCWVjaG8gIgdNYWtlZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCB3aXRoICdtYWtlIG1ha2UnIjtcCi0JCWV4aXQgMTsgXAotCWZpIDsgXAotCW12IC1mIE1ha2VmaWxlIE1ha2VmaWxlLm9sZDsgXAotCWVjaG8gIiNUaGUgbmV4dCBsaW5lIHdhcyBnZW5lcmF0ZWQgYnkgJ21ha2UgbWFrZSciCSA+TWFrZWZpbGUgOyBcCi0JZWNobyAiSE9TVD0kKEhPU1QpIgkJCQkJPj5NYWtlZmlsZSA7IFwKLQllY2hvCQkJCQkJCT4+TWFrZWZpbGUgOyBcCi0Jc2VkICJzL14jX18kKEhPU1QpX18jLy8iIDwgTWFrZWZpbGUub2xkCQkJPj5NYWtlZmlsZQotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6IGNvbmZpZ3VyZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyMjIExvY2FsIFZhcmlhYmxlczogKioqCi0jIyMgbW9kZTpmdW5kYW1lbnRhbCAqKioKLSMjIyBwYWdlLWRlbGltaXRlcjogIl4jDCIgKioqCi0jIyMgRW5kOiAqKioKLSMjIyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9hY2NvbmZpZy5oIGIvc2ltL3c2NS9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjExNDBjLi4wMDAwMDAwCi0tLSBhL3NpbS93NjUvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBXaGV0aGVyIHByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGlvLmg+IGlzIGluY2x1ZGVkLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1BSSU5URgpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9jb25maWcuaW4gYi9zaW0vdzY1L2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkMmJmNy4uMDAwMDAwMAotLS0gYS9zaW0vdzY1L2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIFdoZXRoZXIgcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkaW8uaD4gaXMgaW5jbHVkZWQuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS93NjUvY29uZmlndXJlIGIvc2ltL3c2NS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiMmI5ZWMuLjAwMDAwMDAKLS0tIGEvc2ltL3c2NS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMzU0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotCi0KLQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi0KLQotCi0KLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MTM6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzM0OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTI6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTA5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSA5MjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTUxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTU2OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTg0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjc6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIENDX0ZPUl9CVUlMRD0nJChDQyknCi1lbHNlCi0gIENDX0ZPUl9CVUlMRD1nY2MKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTU5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTY1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTgyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzQ6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTU6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzU5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDM0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ3NDogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTA3OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NDI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTc1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1ODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY3MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc3NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE3ODc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY5OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDg1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjA0OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIzNzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjU3OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNzY6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMDM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMxOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjY6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDQwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0OTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYzNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NjM6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTE6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWZvciBhY19oZHIgaW4gc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Nzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MDU6IGNoZWNraW5nIHdoZXRoZXIgcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3NpbV9jdl9kZWNsX25lZWRlZF9wcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotaW50IG1haW4oKSB7Ci1pbnQgKCpwZm4pID0gKGludCAoKikpIHByaW50ZgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBzaW1fY3ZfZGVjbF9uZWVkZWRfcHJpbnRmPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGYiIDE+JjYKLWlmIHRlc3QgJHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fUFJJTlRGIDEKLUVPRgotCi1maQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCi1zJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCi1zJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCi1zJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKLXMlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKLXMlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZwotcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKLXMlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKLXMlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZwotcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZwotcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCi1zJUBzaW1faHdAJSRzaW1faHclZwotcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZwotcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKLXMlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZwotcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCi1zJUBzaW1fc21wQCUkc2ltX3NtcCVnCi1zJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKLXMlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZwotcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCi1zJUBXRVJST1JfQ0ZMQUdTQCUkV0VSUk9SX0NGTEFHUyVnCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9zaW0vdzY1L2NvbmZpZ3VyZS5pbiBiL3NpbS93NjUvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRhN2RiLi4wMDAwMDAwCi0tLSBhL3NpbS93NjUvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1BQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLikKLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0FSR19QUk9HUkFNCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKENGTEFHUykKLUFDX1NVQlNUKEhERUZJTkVTKQotQVI9JHtBUi1hcn0KLUFDX1NVQlNUKEFSKQotQUNfUFJPR19SQU5MSUIKLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgQ0NfRk9SX0JVSUxEPSckKENDKScKLWVsc2UKLSAgQ0NfRk9SX0JVSUxEPWdjYwotZmkKLUFDX1NVQlNUKENDX0ZPUl9CVUlMRCkKLQotZG5sIFdlIGRvbid0IHVzZSBnZXR0ZXh0LCBidXQgYmZkIGRvZXMuICBTbyB3ZSBkbyB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzCi1kbmwgdG8gc2VlIGlmIHRoZXJlIGFyZSBpbnRsIGxpYnJhcmllcyB3ZSBzaG91bGQgbGluayBhZ2FpbnN0LgotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oIHRpbWUuaCB1bmlzdGQuaCkKLQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHByaW50ZiBtdXN0IGJlIGRlY2xhcmVkXSkKLUFDX0NBQ0hFX1ZBTChzaW1fY3ZfZGVjbF9uZWVkZWRfcHJpbnRmLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkaW8uaD5dLAotW2ludCAoKnBmbikgPSAoaW50ICgqKSkgcHJpbnRmXSwKLXNpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9bm8sIHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRzaW1fY3ZfZGVjbF9uZWVkZWRfcHJpbnRmKQotaWYgdGVzdCAkc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50ZiA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoTkVFRF9ERUNMQVJBVElPTl9QUklOVEYpCi1maQotCi1BQ19PVVRQVVQoTWFrZWZpbGUsCi1bY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWNdKQpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9nZW5jb2RlLmMgYi9zaW0vdzY1L2dlbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiZWI1Yi4uMDAwMDAwMAotLS0gYS9zaW0vdzY1L2dlbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKiBQcm9ncmFtIHRvIHdyaXRlIG91dCBvcGNvZGUgdGFibGVzIGZvciB0aGUgVzY1ODE2IGFuZCBmcmllbmRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tCi0KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotCi1zdHJ1Y3Qgb3BpbmZvCi0gIHsKLSAgICBpbnQgY29kZTsKLSAgICBjaGFyICpvcGNvZGU7Ci0gICAgY2hhciAqbW9kZTsKLSAgICBpbnQgY2xvY2tzOwotICAgIGludCBjcHU7Ci0gICAgc3RydWN0IGFpbmZvICphaTsKLSAgICBzdHJ1Y3Qgb2luZm8gKm9pOwotICB9OwotCi0jZGVmaW5lIFcxNl9PTkxZIDEKLSNkZWZpbmUgQzAyX09OTFkgMgotCi1zdHJ1Y3QgYWluZm8KLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciAqZW51bW5hbWU7Ci0gICAgY2hhciAqZGlzYXNtc3RyaW5nOwotICAgIGNoYXIgKnNpemVyOwotICAgIGNoYXIgKnJlbG9jMDsKLSAgICBjaGFyICpob3dsdmFsOwotCi0gICAgLyogSWYgYWRkciB2YWwgY291bGQgYmUgcmVnIGFkZHIgIC0gdXNlZCBmb3IgZGlzYXNzc21ibHkgb2YgCi0gICAgICAgYXJncyBpbnRvIHJlZyBuYW1lcyAtIHlvdSB3YW50IGxkYSA8MHgxMCB0byB0dXJuIGludG8gbGRhIDxyMAotICAgICAgIGJ1dCB5b3UgZG9uJ3Qgd2FudCBsZGEgIzB4MTAgdG8gZG8gdGhlIHNhbWUuICovCi0gICAgY2hhciByZWdmbGFnOyAKLSAgfTsKLQotI2RlZmluZSBHRVRfTSAJMQotI2RlZmluZSBTUEVDSUFMX0NBU0UgCTIKLSNkZWZpbmUgQ09QX0dFVCAJMwotI2RlZmluZSBHMl9HRVQgCQk0Ci0jZGVmaW5lIEJSQU5DSAkJNQotI2RlZmluZSBHRVRfWCA2Ci0jZGVmaW5lIFNUQU5EQVJEX1BDX0dFVCAJNwotI2RlZmluZSBQVVNIXzE2IDgKLSNkZWZpbmUgUFVTSF84IDkKLSNkZWZpbmUgUFVTSF9YIDEwCi0jZGVmaW5lIFBVU0hfTSAxMQotI2RlZmluZSBQT1BfMTYgMTIKLSNkZWZpbmUgUE9QXzggMTMKLSNkZWZpbmUgUE9QX1ggMTQKLSNkZWZpbmUgUE9QX00gMTUKLSNkZWZpbmUgU1RPUkVfTSAgMTYKLSNkZWZpbmUgU1RPUkVfWCAgMTcKLXN0cnVjdCBvaW5mbwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgaG93c3JjOwotICAgIGNoYXIgKmhvd3RvOwotICB9Owotc3RydWN0IG9pbmZvIG9saXN0W10gPQotewotICB7ImFkYyIsIEdFVF9NLCAieyBpbnQgb2xkX2FjYyA9IEdFVF9BOyBpbnQgb2xkX3NyYyA9c3JjOyBzcmMgPSBvbGRfc3JjICsgb2xkX2FjYyArIEdFVF9DQklUOyBTRVRfTkJJVF9NKHNyYyk7IFNFVF9WQklUX00ob2xkX3NyYywgb2xkX2FjYywgc3JjKTsgU0VUX0NCSVRfTShzcmMpOyBTRVRfWkJJVF9NKHNyYyk7IFNFVF9BKHNyYyk7fSJ9LAotICB7ImFuZCIsIEdFVF9NLCAic3JjID0gR0VUX0EgJiBzcmM7IFNFVF9OQklUX00oc3JjKTsgU0VUX1pCSVRfTShzcmMpO1NFVF9BKHNyYyk7In0sCi0gIHsiYXNsIiwgRzJfR0VULCAiIHNyYyA8PD0xOyBTRVRfQ0JJVF9NKHNyYyk7IFNFVF9aQklUX00oc3JjKTtTRVRfTkJJVF9NKHNyYyk7In0sCi0gIHsiYmNjIiwgQlJBTkNILCAiR0VUX0NCSVQ9PTAifSwKLSAgeyJiY3MiLCBCUkFOQ0gsICJHRVRfQ0JJVD09MSJ9LAotICB7ImJlcSIsIEJSQU5DSCwgIkdFVF9aQklUPT0xIn0sCi0gIHsiYml0IiwgR0VUX00sICJTRVRfTkJJVF9NKHNyYyk7IFNFVF9WQklUKChzcmMgPj4gKEdFVF9NQklUID8gNjoxNCApICYxKSk7IFNFVF9aQklUX00gKEdFVF9BICYgc3JjKTsifSwKLSAgeyJibWkiLCBCUkFOQ0gsICJHRVRfTkJJVD09MSJ9LAotICB7ImJuZSIsIEJSQU5DSCwgIkdFVF9aQklUPT0wIn0sCi0gIHsiYnBsIiwgQlJBTkNILCAiR0VUX05CSVQ9PTAifSwKLSAgeyJicmEiLCBCUkFOQ0gsICIxIn0sCi0gIHsiYnJrIiwgU1BFQ0lBTF9DQVNFLAotICAgIlwKLXtcCi0gICBpZiAoR0VUX0UgPT0gMSkgXAotICAgICB7IFBVU0gxNihHRVRfUEMgKyAxKTsgUFVTSDggKEdFVF9QIHwgQkZMQUcpOyBTRVRfUCAoR0VUX1AgfCBJRkxBRyk7IFNFVF9PTkxZX1BDKGZldGNoMTYgKDB4ZmZmZSkpO31cCi0gICBlbHNlIFwKLSAgICAgeyBQVVNIOCAoR0VUX1BCUl9MT1cpOyBQVVNIMTYgKEdFVF9QQyk7IFBVU0g4KEdFVF9QKTsgU0VUX1AoR0VUX1AgfElGTEFHKTsgU0VUX1BCUlBDKGZldGNoMTYgKDB4ZmZlNikpO307XAotICAgICB9In0sCi0gIHsiYnJsIiwgQlJBTkNILCAiMSJ9LAotICB7ImJ2YyIsIEJSQU5DSCwgIkdFVF9WQklUPT0wIn0sCi0gIHsiYnZzIiwgQlJBTkNILCAiR0VUX1ZCSVQ9PTEifSwKLSAgeyJjbGMiLCBTUEVDSUFMX0NBU0UsICJTRVRfQ0JJVCgwKTsifSwKLSAgeyJjbGQiLCBTUEVDSUFMX0NBU0UsICJTRVRfREJJVCgwKTsifSwKLSAgeyJjbGkiLCBTUEVDSUFMX0NBU0UsICJTRVRfSUJJVCgwKTsifSwKLSAgeyJjbHYiLCBTUEVDSUFMX0NBU0UsICJTRVRfVkJJVCgwKTsifSwKLSAgeyJjbXAiLCBHRVRfTSwgInNyYyA9IEdFVF9BIC0gc3JjOyBTRVRfWkJJVF9NKHNyYyk7IFNFVF9DQklUX00ofnNyYyk7IFNFVF9OQklUX00oc3JjKTsifSwKLSAgeyJjb3AiLCBDT1BfR0VULAotICAgIlwKLXtcCi0gICBpZiAoR0VUX0UgPT0gMSkgXAotICAgICB7IFBVU0gxNihHRVRfUEMgKyAxKTsgUFVTSDggKEdFVF9QIHwgQkZMQUcpOyBTRVRfUCAoKEdFVF9QIHwgSUZMQUcpICYgfkRGTEFHKTsgU0VUX09OTFlfUEMoZmV0Y2gxNiAoMHhmZmY0KSk7fVwKLSAgIGVsc2UgXAotICAgICB7IFBVU0g4IChHRVRfUEJSX0xPVyk7IFBVU0gxNiAoR0VUX1BDKTsgUFVTSDgoR0VUX1ApOyBTRVRfUCgoR0VUX1AgfElGTEFHKSAmIH5ERkxBRyk7IFNFVF9QQlJQQyhmZXRjaDE2ICgweGZmZTQpKTt9O1wKLSAgICAgfSJ9LAotICB7ImNweCIsIEdFVF9YLCAic3JjID0gR0VUX1ggLSBzcmM7IFNFVF9OQklUX1goc3JjKTsgU0VUX1pCSVRfWChzcmMpOyBTRVRfQ0JJVF9YKH5zcmMpOyJ9LAotICB7ImNweSIsIEdFVF9YLCAic3JjID0gR0VUX1kgLSBzcmM7IFNFVF9OQklUX1goc3JjKTsgU0VUX1pCSVRfWChzcmMpOyBTRVRfQ0JJVF9YKH5zcmMpOyJ9LAotICB7ImRlYyIsIEcyX0dFVCwgInNyYyAtLTsgU0VUX05CSVRfTShzcmMpOyBTRVRfWkJJVF9NKHNyYyk7ICJ9LAotICB7ImRleCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9YKEdFVF9YIC0xKTsgU0VUX05CSVRfWChHRVRfWCk7IFNFVF9aQklUX1goR0VUX1gpOyJ9LAotICB7ImRleSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9ZKEdFVF9ZIC0xKTsgU0VUX05CSVRfWChHRVRfWSk7IFNFVF9aQklUX1goR0VUX1kpOyJ9LAotICB7ImVvciIsIEdFVF9NLCAic3JjID0gR0VUX0EgXiBzcmM7ICBTRVRfTkJJVF9NKHNyYyk7IFNFVF9aQklUX00oc3JjKTtTRVRfQShzcmMpOyAifSwKLSAgeyJpbmMiLCBHMl9HRVQsICJzcmMgKys7IFNFVF9OQklUX00oc3JjKTsgU0VUX1pCSVRfTShzcmMpOyAifSwKLSAgeyJpbngiLCBTUEVDSUFMX0NBU0UsICJTRVRfWChHRVRfWCArMSk7IFNFVF9OQklUX1goR0VUX1gpOyBTRVRfWkJJVF9YKEdFVF9YKTsifSwKLSAgeyJpbnkiLCBTUEVDSUFMX0NBU0UsICJTRVRfWShHRVRfWSArMSk7IFNFVF9OQklUX1goR0VUX1kpOyBTRVRfWkJJVF9YKEdFVF9ZKTsifSwKLSAgeyJqbXAiLCBTVEFOREFSRF9QQ19HRVQsICJTRVRfT05MWV9QQyhsdmFsKTsifSwKLSAgeyJqc3IiLCBTVEFOREFSRF9QQ19HRVQsICJpZiAobCkgeyBQVVNIOChHRVRfUEJSX0xPVyk7fSBQVVNIMTYoR0VUX1BDKTsgU0VUX09OTFlfUEMobHZhbCk7XG4ifSwKLSAgeyJsZGEiLCBHRVRfTSwgIlNFVF9BKHNyYyk7IFNFVF9OQklUX00oR0VUX0EpOyBTRVRfWkJJVF9NKEdFVF9BKTsifSwKLSAgeyJsZHgiLCBHRVRfWCwgIlNFVF9YKHNyYyk7U0VUX05CSVRfWChHRVRfWCk7IFNFVF9aQklUX1goR0VUX1gpOyJ9LAotICB7ImxkeSIsIEdFVF9YLCAiU0VUX1koc3JjKTtTRVRfTkJJVF9YKEdFVF9ZKTsgU0VUX1pCSVRfWChHRVRfWSk7In0sCi0gIHsibHNyIiwgRzJfR0VULCAKLSAgICAgICAiU0VUX0NCSVQoc3JjICYgMSk7IFwKLSAgICAgICAgU0VUX05CSVQoMCk7ICAgICAgIFwKLSAgICAgICAgIHNyYyA9IHNyYyA+PiAxOyAgIFwKLSAgICAgICAgIFNFVF9aQklUX00oc3JjKTsifSwKLSAgeyJtdm4iLCBTUEVDSUFMX0NBU0UsCi0gICAieyBpbnQgZHN0X2Jhbms7IGludCBzcmNfYmFuazsgZHN0X2JhbmsgPSBmZXRjaDggKCBHRVRfUEMpPDwxNjsgSU5DX1BDKDEpOyBzcmNfYmFuayA9IGZldGNoOCAoR0VUX1BDKTw8MTY7IElOQ19QQygxKTtcCi0gICAgICAgZG8geyAgc3RvcmU4ICggZHN0X2JhbmsgKyBHRVRfWCwgZmV0Y2g4IChzcmNfYmFuayArICBHRVRfWSkpOyBTRVRfWChHRVRfWCsxKTsgU0VUX1koR0VUX1krMSk7IFNFVF9BKChHRVRfQS0xKSAmIDB4ZmZmZik7IH0gd2hpbGUgKEdFVF9BICE9IDB4ZmZmZik7fSJ9LAotICB7Im12cCIsIFNQRUNJQUxfQ0FTRSwKLSAgICJ7IGludCBkc3RfYmFuazsgaW50IHNyY19iYW5rOyBkc3RfYmFuayA9IGZldGNoOCAoIEdFVF9QQlJQQyk8PDE2OyBJTkNfUEMoMSk7IHNyY19iYW5rID0gZmV0Y2g4IChHRVRfUEJSUEMpPDwxNjsgSU5DX1BDKDEpO1wKLSAgICAgICBkbyB7ICBzdG9yZTggKCBkc3RfYmFuayArIEdFVF9YLCBmZXRjaDggKHNyY19iYW5rICsgR0VUX1kpKTsgU0VUX1goR0VUX1gtMSk7IFNFVF9ZKEdFVF9ZLTEpOyBTRVRfQSgoR0VUX0EtMSkgJiAweGZmZmYpOyB9IHdoaWxlIChHRVRfQSAhPSAweGZmZmYpO30ifSwKLQotICB7Im5vcCIsIFNQRUNJQUxfQ0FTRSwgIiJ9LAoteyJvcmEiLCBHRVRfTSwgIlNFVF9BKEdFVF9BIHwgc3JjKTsgU0VUX05CSVRfTShHRVRfQSk7IFNFVF9aQklUX00oR0VUX0EpOyJ9LAotICB7InBlYSIsIFBVU0hfMTYsICJzcmMgPSBmZXRjaDE2KEdFVF9QQlJQQyk7IElOQ19QQygyKTsifSwKLSAgeyJwZWkiLCBQVVNIXzE2LCAic3JjID0gZmV0Y2gxNihmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9EKTsgSU5DX1BDKDEpOyJ9LAotICB7InBlciIsIFBVU0hfMTYsICJzcmMgPSBmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfUEMrMjsgSU5DX1BDKDIpOyJ9LAotICB7InBoYSIsIFBVU0hfTSwgInNyYyA9IEdFVF9BOyJ9LAotICB7InBoYiIsIFBVU0hfOCwgInNyYyA9IEdFVF9EQlJfTE9XOyJ9LAotICB7InBoZCIsIFBVU0hfMTYsICJzcmMgPSBHRVRfRFBSOyJ9LAotICB7InBoayIsIFBVU0hfOCwgInNyYyA9IEdFVF9QQlJfTE9XOyJ9LAotICB7InBocCIsIFBVU0hfOCwgInNyYyA9IEdFVF9QOyJ9LAotICB7InBoeCIsIFBVU0hfWCwgInNyYyA9IEdFVF9YOyJ9LAotICB7InBoeSIsIFBVU0hfWCwgInNyYyA9IEdFVF9ZOyJ9LAotICB7InBsYSIsIFBPUF9NLCAiU0VUX0EoIHNyYyk7IFNFVF9OQklUX00oR0VUX0EpO1NFVF9aQklUX00oR0VUX0EpOyJ9LAotICB7InBsYiIsIFBPUF84LCAiU0VUX0RCUl9MT1coc3JjKTtTRVRfTkJJVF84KHNyYyk7IFNFVF9aQklUXzgoc3JjKTsifSwKLSAgeyJwbGQiLCBQT1BfMTYsICJTRVRfRFBSKHNyYyk7U0VUX05CSVRfMTYoc3JjKTsgU0VUX1pCSVRfMTYoc3JjKTsifSwKLSAgeyJwbHAiLCBQT1BfOCwgIlNFVF9QKHNyYyk7IFJFVEhJTks7In0sCi0gIHsicGx4IiwgUE9QX1gsICJTRVRfWChzcmMpO1NFVF9OQklUX1goc3JjKTtTRVRfWkJJVF9YKHNyYyk7In0sCi0gIHsicGx5IiwgUE9QX1gsICJTRVRfWShzcmMpO1NFVF9OQklUX1goc3JjKTtTRVRfWkJJVF9YKHNyYyk7In0sCi0gIHsicmVwIiwgQ09QX0dFVCwgIlNFVF9QKEdFVF9QICYgfnNyYyk7IFJFVEhJTks7In0sCi0gIHsicm9sIiwgRzJfR0VULCAic3JjID0gKHNyYyA8PCAxKSB8IEdFVF9DQklUOyBTRVRfQ0JJVCgoc3JjID4+IChHRVRfTUJJVCA/IDcgOiAxNSkpICYxKTsgU0VUX1pCSVRfTShzcmMpOyJ9LAotICB7InJvciIsIEcyX0dFVCwgInsgaW50IHQgPSBzcmM7IHNyYyAgPSAoc3JjPj4xKSB8IChHRVRfQ0JJVDw8KChHRVRfTUJJVCA/IDg6MTYpLTEpKTtTRVRfTkJJVF9NKHNyYyk7U0VUX1pCSVRfTShzcmMpOyBTRVRfQ0JJVCh0JjEpO30ifSwKLSAgeyJydGkiLCBTUEVDSUFMX0NBU0UsICJ7IGludCB0OyBQT1AxNih0KTsgU0VUX09OTFlfUEModCk7IGlmIChHRVRfRT09MCkgeyBQT1A4KHQpOyBTRVRfUEJSKHQpO30gIFBPUDgodCk7U0VUX1AodCk7fSJ9LAotICB7InJ0bCIsIFNQRUNJQUxfQ0FTRSwgInsgaW50IHQ7IFBPUDI0KHQpOyBTRVRfUEJSUEModCk7fSJ9LAotICB7InJ0cyIsIFNQRUNJQUxfQ0FTRSwgInsgaW50IHQ7IFBPUDE2KHQpOyBTRVRfT05MWV9QQyh0KTt9In0sCi0gIHsic2JjIiwgR0VUX00sCi0gICAieyBpbnQgb2xkX2FjYyA9IEdFVF9BICYgQU1BU0s7IGludCBvbGRfc3JjID0gc3JjICYgQU1BU0s7ICBzcmMgPSBvbGRfYWNjIC0gb2xkX3NyYyAtICFHRVRfQ0JJVDsgU0VUX0Eoc3JjKTtcCi0gICAgU0VUX0NCSVQoIShzcmM+PihHRVRfTUJJVD84OjE2KSAmMSkpOyBTRVRfVkJJVF9NKG9sZF9zcmMsb2xkX2FjYywgc3JjKTsgU0VUX1pCSVRfTShzcmMpOyBTRVRfTkJJVF9NKHNyYyk7fSJ9LAotICB7InNlYyIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9DQklUKDEpOyJ9LAotICB7InNlZCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9EQklUKDEpOyJ9LAotICB7InNlaSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9JQklUKDEpOyJ9LAotICB7InNlcCIsIENPUF9HRVQsICJTRVRfUChHRVRfUCB8IHNyYyk7UkVUSElOSzsifSwKLSAgeyJzdGEiLCBTVE9SRV9NLCAic3JjID0gR0VUX0E7In0sCi0gIHsic3RwIiwgU1BFQ0lBTF9DQVNFLCAiYWJvcnQoKTsifSwKLSAgeyJzdHgiLCBTVE9SRV9YLCAic3JjID0gR0VUX1g7In0sCi0gIHsic3R5IiwgU1RPUkVfWCwgInNyYyA9IEdFVF9ZOyJ9LAotICB7InN0eiIsIFNUT1JFX00sICJzcmMgPSAwOyJ9LAoteyJ0YXgiLCBTUEVDSUFMX0NBU0UsICJTRVRfWChHRVRfQSk7IFNFVF9OQklUX1goR0VUX0EpO1NFVF9aQklUX1goR0VUX0EpOyJ9LAoteyJ0YXkiLCBTUEVDSUFMX0NBU0UsICJTRVRfWShHRVRfQSk7IFNFVF9OQklUX1goR0VUX0EpO1NFVF9aQklUX1goR0VUX0EpOyJ9LAotICB7InRjZCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9EUFIoR0VUX0EpOyBTRVRfTkJJVF9YKEdFVF9BKTsgU0VUX1pCSVRfWChHRVRfQSk7In0sCi0gIHsidGNzIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX1MoR0VUX0EpOyJ9LAotICB7InRkYyIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9BKEdFVF9EUFIpOyBTRVRfTkJJVF9NKEdFVF9BKTsgU0VUX1pCSVRfTShHRVRfQSk7In0sCi0gIHsidHJiIiwgRzJfR0VULCAiU0VUX1pCSVRfTShzcmMgJiBHRVRfQSk7IHNyYyA9IHNyYyAmIH5HRVRfQTsgIn0sCi0gIHsidHNiIiwgRzJfR0VULCAiU0VUX1pCSVRfTShzcmMgJiBHRVRfQSk7IHNyYyA9IHNyYyB8IEdFVF9BOyJ9LAoteyJ0c2MiLCBTUEVDSUFMX0NBU0UsICJTRVRfQShHRVRfUyk7IFNFVF9OQklUXzE2KEdFVF9BKTsgU0VUX1pCSVRfMTYoR0VUX0EpOyJ9LAoteyJ0c3giLCBTUEVDSUFMX0NBU0UsICJTRVRfWChHRVRfUyk7IFNFVF9OQklUX1goR0VUX1gpOyBTRVRfWkJJVF9YKEdFVF9YKTsifSwKLXsidHhhIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0EoR0VUX1gpOyBTRVRfTkJJVF9NKEdFVF9BKTsgU0VUX1pCSVRfTShHRVRfQSk7In0sCi0gIHsidHhzIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX1MoR0VUX1gpOyJ9LAoteyJ0eHkiLCBTUEVDSUFMX0NBU0UsICJTRVRfWShHRVRfWCk7IFNFVF9OQklUX1goR0VUX1kpOyBTRVRfWkJJVF9YKEdFVF9ZKTsifSwKLXsidHlhIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0EoR0VUX1kpOyBTRVRfTkJJVF9NKEdFVF9BKTsgU0VUX1pCSVRfTShHRVRfQSk7In0sCi17InR5eCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9YKEdFVF9ZKTsgU0VUX05CSVRfWChHRVRfWCk7IFNFVF9aQklUX1goR0VUX1gpOyJ9LAotICB7IndhaSIsIFNQRUNJQUxfQ0FTRSwgIndhaSgpO0lOQ19QQygtMSk7In0sCi0gIHsid2RtIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0Eod2RtKEdFVF9BLCBHRVRfWCkpOyJ9LAotICB7InhiYSIsIFNQRUNJQUxfQ0FTRSwKLSAgICJpZiAoR0VUX1hCSVQ9PTApIHsgU0VUX0EoKChHRVRfQSA+PiA4KSAmIDB4ZmYpIHwgKChHRVRfQSAmIDB4ZmYpPDw4KSk7fSBlbHNlIHsgaW50IHQgPSBHRVRfQTsgU0VUX0EoR0VUX0IpOyBTRVRfQih0KTt9OyBTRVRfTkJJVF84KEdFVF9BKTsgU0VUX1pCSVRfOChHRVRfQSk7In0sCi0gIHsieGNlIiwgU1BFQ0lBTF9DQVNFLCAieyBpbnQgdCA9IEdFVF9FOyBTRVRfRShHRVRfQ0JJVCk7IFNFVF9DQklUKEdFVF9FKTtpZiAoR0VUX0UpIHsgU0VUX01CSVQoMSk7IFNFVF9YQklUKDEpO319OyBnb3RvIHRvcDsifSwKLSAgMH07Ci0KLXN0cnVjdCBhaW5mbyBhbGlzdFtdID0KLXsKLSAgeyIjYSIsICJJTU1UT0EiLCAiIyQwIiwgIk09PTAgPyAyOjEiLCAiTT09MCA/ICVzUl9XNjVfQUJTMTYgOiAlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gR0VUX1BCUlBDOyBJTkNfUEMoR0VUX01CSVQgPyAxOjIpOyAiLCAwfSwKLSAgeyIjYyIsICJJTU1DT1AiLCAiIyQwIiwgIjEiLCAiJXNSX1c2NV9BQlM4IiwgICAibHZhbCA9IEdFVF9QQlJQQzsgSU5DX1BDKDEpOyAiLCAwfSwKLSAgeyIjaSIsICJJTU1UT0kiLCAiIyQwIiwgIlg9PTAgPyAyOjEiLCAiWD09MCA/ICVzUl9XNjVfQUJTMTYgOiAlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gR0VUX1BCUlBDOyBJTkNfUEMoR0VUX1hCSVQgPyAxOjIpOyIsIDB9LAotICB7IkEiLCAiQUNDIiwgImEiLCAiMCIsIDAsICIqRkFJTCoqIiwgMH0sCi0gIHsiciIsICJQQ19SRUwiLCAiJDAiLCAiMSIsICIlc1JfVzY1X1BDUjgiLCAgICJsdmFsID0gR0VUX1BCUl9ISUdIICsgKDB4ZmZmZiAmKGZldGNoOHNleHQoR0VUX1BCUlBDKSArIEdFVF9QQyArIDEpKTsgSU5DX1BDKDEpOyIsIDB9LAotICB7InJsIiwgIlBDX1JFTF9MT05HIiwgIiQwIiwgIjIiLCAiJXNSX1c2NV9QQ1IxNiIsICAgImx2YWwgPSBHRVRfUEJSX0hJR0ggKyAoMHhmZmZmICYgKGZldGNoMTYgKEdFVF9QQlJQQykgKyBHRVRfUEMgKyAyKSk7IElOQ19QQygyKTsiLCAwfSwKLSAgeyJpIiwgIklNUExJRUQiLCAiIiwgIjAiLCAiIiwgMH0sCi0gIHsicyIsICJTVEFDSyIsICIiLCAiMCIsICIiLCAwfSwKLSAgeyJkIiwgIkRJUiIsICI8JDAiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfRDsgSU5DX1BDKDEpOyIsIDF9LAotICB7ImQseCIsICJESVJfSURYX1giLCAiPCQwLHgiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfWCsgR0VUX0Q7IElOQ19QQygxKTsiLCAxfSwKLSAgeyJkLHkiLCAiRElSX0lEWF9ZIiwgIjwkMCx5IiwgIjEiLCAiJXNSX1c2NV9BQlM4IiwgICAibHZhbCA9IGZldGNoOChHRVRfUEJSUEMpICsgR0VUX1kgKyBHRVRfRDsgSU5DX1BDKDEpOyIsIDF9LAotICB7IihkKSIsICJESVJfSU5EIiwgIig8JDApIiwgIjEiLCAiJXNSX1c2NV9BQlM4IiwgICAibHZhbCA9IEdFVF9EQlJfSElHSCArICgweGZmZmYgJiBmZXRjaDE2KGZldGNoOChHRVRfUEJSUEMpICsgR0VUX0QpKTtJTkNfUEMoMSk7IiwxfSwKLSAgeyIoZCx4KSIsICJESVJfSURYX0lORF9YIiwgIig8JDAseCkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gR0VUX0RCUl9ISUdIICsgKDB4ZmZmZiAmIChmZXRjaDggKEdFVF9QQlJQQykgKyBHRVRfRCArIEdFVF9YKSkgOyBJTkNfUEMoMSk7IiwxfSwKLSAgeyIoZCkseSIsICJESVJfSU5EX0lEWF9ZIiwgIig8JDApLHkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2gxNihmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9EKSArIEdFVF9ZICArIEdFVF9EQlJfSElHSDtJTkNfUEMoMSk7IiwxfSwKLSAgeyJbZF0iLCAiRElSX0lORF9MT05HIiwgIlskMF0iLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2gyNChHRVRfRCArIGZldGNoOChHRVRfUEJSUEMpKTtJTkNfUEMoMSk7IiwxfSwKLQotICB7IltkXSx5IiwgIkRJUl9JTkRfSURYX1lfTE9ORyIsICJbJDBdLHkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2gyNChmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9EKSArIEdFVF9ZO0lOQ19QQygxKTsiLDF9LAotCi0gIHsiYSIsICJBQlMiLCAiISQwIiwgIjIiLCAiJXNSX1c2NV9BQlMxNiIsICAgImx2YWwgPSBmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfREJSX0hJR0g7IElOQ19QQygyKSA7ICIsMX0sCi0gIHsiYSx4IiwgIkFCU19JRFhfWCIsICIhJDAseCIsICIyIiwgIiVzUl9XNjVfQUJTMTYiLCAgICJsdmFsID0gZmV0Y2gxNihHRVRfUEJSUEMpICsgR0VUX0RCUl9ISUdIICsgR0VUX1g7IElOQ19QQygyKTsgIiwxfSwKLSAgeyJhLHkiLCAiQUJTX0lEWF9ZIiwgIiEkMCx5IiwgIjIiLCAiJXNSX1c2NV9BQlMxNiIsICAgImx2YWwgPSBmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfREJSX0hJR0ggKyBHRVRfWTsgSU5DX1BDKDIpOyAiLCAxfSwKLSAgeyJhbCIsICJBQlNfTE9ORyIsICI+JDAiLCAiMyIsICIlc1JfVzY1X0FCUzI0IiwgICAibHZhbCA9IGZldGNoMjQoR0VUX1BCUlBDKTsgSU5DX1BDKDMpO1xubD0xO1xuIiwgMX0sCi0gIHsiW2FdIiwgIkFCU19JTkRfTE9ORyIsICJbPiQwXSIsICIyIiwgIiVzUl9XNjVfQUJTMTYiLCAgICJsdmFsID0gZmV0Y2gyNChmZXRjaDE2KEdFVF9QQlJQQykpOyBJTkNfUEMoMik7IiwgMX0sCi0gIHsiYWwseCIsICJBQlNfTE9OR19JRFhfWCIsICI+JDAseCIsICIzIiwgIiVzUl9XNjVfQUJTMjQiLCAgICJsdmFsID0gZmV0Y2gyNChHRVRfUEJSUEMpICsgR0VUX1g7IElOQ19QQygzKTsiLCAxfSwKLSAgeyJkLHMiLCAiU1RBQ0tfUkVMIiwgIiQwLHMiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfUzsgSU5DX1BDKDEpOyIsIDB9LAotICB7IihkLHMpLHkiLCAiU1RBQ0tfUkVMX0lORFhfSURYIiwgIigkMCxzKSx5IiwgIjEiLCAiJXNSX1c2NV9BQlM4IiwgICAibHZhbCA9IGZldGNoMTYoZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfUykgKyBHRVRfREJSX0hJR0ggKyBHRVRfWTtJTkNfUEMoMSk7IiwwfSwKLSAgeyIoYSkiLCAiQUJTX0lORCIsICIoJDApIiwgIjIiLCAiJXNSX1c2NV9BQlMxNiIsICAgImx2YWwgPSBmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfREJSX0hJR0g7IElOQ19QQygyKTsiLCAxfSwKLSAgeyIoYSx4KSIsICJBQlNfSU5EX0lEWCIsICIoJDAseCkiLCAiMiIsICIlc1JfVzY1X0FCUzE2IiwKLSAgICAgImx2YWwgPSBmZXRjaDE2KCgweGZmZmYgJiAoZmV0Y2gxNihHRVRfUEJSUEMpICsgR0VUX1ggKSkgKyBHRVRfUEJSX0hJR0gpICsgR0VUX1BCUl9ISUdIO0lOQ19QQygyKTsiLDF9LAotICB7Inh5eiIsICJCTE9DS19NT1ZFIiwgIiIsICIyIiwgIiIsIDB9LAkKLSAgMH07Ci0KLQotc3RydWN0IG9waW5mbyBvcHRhYmxlWzI1N10gPQotewotICB7MHgwMCwgImJyayIsICJzIn0sCi0gIHsweDAxLCAib3JhIiwgIihkLHgpIn0sCi0gIHsweDAyLCAiY29wIiwgIiNjIn0sCi0gIHsweDAzLCAib3JhIiwgImQscyJ9LAotICB7MHgwNCwgInRzYiIsICJkIn0sCi0gIHsweDA1LCAib3JhIiwgImQifSwKLSAgezB4MDYsICJhc2wiLCAiZCJ9LAotICB7MHgwNywgIm9yYSIsICJbZF0ifSwKLSAgezB4MDgsICJwaHAiLCAicyJ9LAotICB7MHgwOSwgIm9yYSIsICIjYSJ9LAotICB7MHgwYSwgImFzbCIsICJBIn0sCi0gIHsweDBiLCAicGhkIiwgInMifSwKLSAgezB4MGMsICJ0c2IiLCAiYSJ9LAotICB7MHgwZCwgIm9yYSIsICJhIn0sCi0gIHsweDBlLCAiYXNsIiwgImEifSwKLSAgezB4MGYsICJvcmEiLCAiYWwifSwKLSAgezB4MTAsICJicGwiLCAiciJ9LAotICB7MHgxMSwgIm9yYSIsICIoZCkseSJ9LAotICB7MHgxMiwgIm9yYSIsICIoZCkifSwKLSAgezB4MTMsICJvcmEiLCAiKGQscykseSJ9LAotICB7MHgxNCwgInRyYiIsICJkIn0sCi0gIHsweDE1LCAib3JhIiwgImQseCJ9LAotICB7MHgxNiwgImFzbCIsICJkLHgifSwKLSAgezB4MTcsICJvcmEiLCAiW2RdLHkifSwKLSAgezB4MTgsICJjbGMiLCAiaSJ9LAotICB7MHgxOSwgIm9yYSIsICJhLHkifSwKLSAgezB4MWEsICJpbmMiLCAiQSJ9LAotICB7MHgxYiwgInRjcyIsICJpIn0sCi0gIHsweDFjLCAidHJiIiwgImEifSwKLSAgezB4MWQsICJvcmEiLCAiYSx4In0sCi0gIHsweDFlLCAiYXNsIiwgImEseCJ9LAotICB7MHgxZiwgIm9yYSIsICJhbCx4In0sCi0gIHsweDIwLCAianNyIiwgImEifSwKLSAgezB4MjEsICJhbmQiLCAiKGQseCkifSwKLSAgezB4MjIsICJqc3IiLCAiYWwifSwKLSAgezB4MjMsICJhbmQiLCAiZCxzIn0sCi0gIHsweDI0LCAiYml0IiwgIihkKSJ9LAotICB7MHgyNSwgImFuZCIsICJkIn0sCi0gIHsweDI2LCAicm9sIiwgImQifSwKLSAgezB4MjcsICJhbmQiLCAiW2RdIn0sCi0gIHsweDI4LCAicGxwIiwgInMifSwKLSAgezB4MjksICJhbmQiLCAiI2EifSwKLSAgezB4MmEsICJyb2wiLCAiQSJ9LAotICB7MHgyYiwgInBsZCIsICJzIn0sCi0gIHsweDJjLCAiYml0IiwgImEifSwKLSAgezB4MmQsICJhbmQiLCAiYSJ9LAotICB7MHgyZSwgInJvbCIsICJhIn0sCi0gIHsweDJmLCAiYW5kIiwgImFsIn0sCi0gIHsweDMwLCAiYm1pIiwgInIifSwKLSAgezB4MzEsICJhbmQiLCAiKGQpLHkifSwKLSAgezB4MzIsICJhbmQiLCAiKGQpIn0sCi0gIHsweDMzLCAiYW5kIiwgIihkLHMpLHkifSwKLSAgezB4MzQsICJiaXQiLCAiKGQseCkifSwKLSAgezB4MzUsICJhbmQiLCAiZCx4In0sCi0gIHsweDM2LCAicm9sIiwgImQseCJ9LAotICB7MHgzNywgImFuZCIsICJbZF0seSJ9LAotICB7MHgzOCwgInNlYyIsICJpIn0sCi0gIHsweDM5LCAiYW5kIiwgImEseSJ9LAotICB7MHgzYSwgImRlYyIsICJBIn0sCi0gIHsweDNiLCAidHNjIiwgImkifSwKLSAgezB4M2MsICJiaXQiLCAiYSx4In0sCi0gIHsweDNkLCAiYW5kIiwgImEseCJ9LAotICB7MHgzZSwgInJvbCIsICJhLHgifSwKLSAgezB4M2YsICJhbmQiLCAiYWwseCJ9LAotICB7MHg0MCwgInJ0aSIsICJzIn0sCi0gIHsweDQxLCAiZW9yIiwgIihkLHgpIn0sCi0gIHsweDQyLCAid2RtIiwgImkifSwKLSAgezB4NDMsICJlb3IiLCAiZCxzIn0sCi0gIHsweDQ0LCAibXZwIiwgInh5eiJ9LAotICB7MHg0NSwgImVvciIsICJkIn0sCi0gIHsweDQ2LCAibHNyIiwgImQifSwKLSAgezB4NDcsICJlb3IiLCAiW2RdIn0sCi0gIHsweDQ4LCAicGhhIiwgInMifSwKLSAgezB4NDksICJlb3IiLCAiI2EifSwKLSAgezB4NGEsICJsc3IiLCAiQSJ9LAotICB7MHg0YiwgInBoayIsICJzIn0sCi0gIHsweDRjLCAiam1wIiwgImEifSwKLSAgezB4NGQsICJlb3IiLCAiYSJ9LAotICB7MHg0ZSwgImxzciIsICJhIn0sCi0gIHsweDRmLCAiZW9yIiwgImFsIn0sCi0gIHsweDUwLCAiYnZjIiwgInIifSwKLSAgezB4NTEsICJlb3IiLCAiKGQpLHkifSwKLSAgezB4NTIsICJlb3IiLCAiKGQpIn0sCi0gIHsweDUzLCAiZW9yIiwgIihkLHMpLHkifSwKLSAgezB4NTQsICJtdm4iLCAieHl6In0sCi0gIHsweDU1LCAiZW9yIiwgImQseCJ9LAotICB7MHg1NiwgImxzciIsICJkLHgifSwKLSAgezB4NTcsICJlb3IiLCAiW2RdLHkifSwKLSAgezB4NTgsICJjbGkiLCAiaSJ9LAotICB7MHg1OSwgImVvciIsICJhLHkifSwKLSAgezB4NWEsICJwaHkiLCAicyJ9LAotICB7MHg1YiwgInRjZCIsICJpIn0sCi0gIHsweDVjLCAiam1wIiwgImFsIn0sCi0gIHsweDVkLCAiZW9yIiwgImEseCJ9LAotICB7MHg1ZSwgImxzciIsICJhLHgifSwKLSAgezB4NWYsICJlb3IiLCAiYWwseCJ9LAotICB7MHg2MCwgInJ0cyIsICJzIn0sCi0gIHsweDYxLCAiYWRjIiwgIihkLHgpIn0sCi0gIHsweDYyLCAicGVyIiwgInJsIn0sCi0gIHsweDYzLCAiYWRjIiwgImQscyJ9LAotICB7MHg2NCwgInN0eiIsICJkIn0sCi0gIHsweDY1LCAiYWRjIiwgImQifSwKLSAgezB4NjYsICJyb3IiLCAiZCJ9LAotICB7MHg2NywgImFkYyIsICJbZF0ifSwKLSAgezB4NjgsICJwbGEiLCAicyJ9LAotICB7MHg2OSwgImFkYyIsICIjYSJ9LAotICB7MHg2YSwgInJvciIsICJBIn0sCi0gIHsweDZiLCAicnRsIiwgInMifSwKLSAgezB4NmMsICJqbXAiLCAiKGEpIn0sCi0gIHsweDZkLCAiYWRjIiwgImEifSwKLSAgezB4NmUsICJyb3IiLCAiYSJ9LAotICB7MHg2ZiwgImFkYyIsICJhbCJ9LAotICB7MHg3MCwgImJ2cyIsICJyIn0sCi0gIHsweDcxLCAiYWRjIiwgIihkKSx5In0sCi0gIHsweDcyLCAiYWRjIiwgIihkKSJ9LAotICB7MHg3MywgImFkYyIsICIoZCxzKSx5In0sCi0gIHsweDc0LCAic3R6IiwgImQseCJ9LAotICB7MHg3NSwgImFkYyIsICJkLHgifSwKLSAgezB4NzYsICJyb3IiLCAiZCx4In0sCi0gIHsweDc3LCAiYWRjIiwgIltkXSx5In0sCi0gIHsweDc4LCAic2VpIiwgImkifSwKLSAgezB4NzksICJhZGMiLCAiYSx5In0sCi0gIHsweDdhLCAicGx5IiwgInMifSwKLSAgezB4N2IsICJ0ZGMiLCAiaSJ9LAotICB7MHg3YywgImptcCIsICIoYSx4KSJ9LAotICB7MHg3ZCwgImFkYyIsICJhLHgifSwKLSAgezB4N2UsICJyb3IiLCAiYSx4In0sCi0gIHsweDdmLCAiYWRjIiwgImFsLHgifSwKLSAgezB4ODAsICJicmEiLCAiciJ9LAotICB7MHg4MSwgInN0YSIsICIoZCx4KSJ9LAotICB7MHg4MiwgImJybCIsICJybCJ9LAotICB7MHg4MywgInN0YSIsICJkLHMifSwKLSAgezB4ODQsICJzdHkiLCAiZCJ9LAotICB7MHg4NSwgInN0YSIsICJkIn0sCi0gIHsweDg2LCAic3R4IiwgImQifSwKLSAgezB4ODcsICJzdGEiLCAiW2RdIn0sCi0gIHsweDg4LCAiZGV5IiwgImkifSwKLSAgezB4ODksICJiaXQiLCAiI2EifSwKLSAgezB4OGEsICJ0eGEiLCAiaSJ9LAotICB7MHg4YiwgInBoYiIsICJzIn0sCi0gIHsweDhjLCAic3R5IiwgImEifSwKLSAgezB4OGQsICJzdGEiLCAiYSJ9LAotICB7MHg4ZSwgInN0eCIsICJhIn0sCi0gIHsweDhmLCAic3RhIiwgImFsIn0sCi0gIHsweDkwLCAiYmNjIiwgInIifSwKLSAgezB4OTEsICJzdGEiLCAiKGQpLHkifSwKLSAgezB4OTIsICJzdGEiLCAiKGQpIn0sCi0gIHsweDkzLCAic3RhIiwgIihkLHMpLHkifSwKLSAgezB4OTQsICJzdHkiLCAiZCx4In0sCi0gIHsweDk1LCAic3RhIiwgImQseCJ9LAotICB7MHg5NiwgInN0eCIsICJkLHgifSwKLSAgezB4OTcsICJzdGEiLCAiW2RdLHkifSwKLSAgezB4OTgsICJ0eWEiLCAiaSJ9LAotICB7MHg5OSwgInN0YSIsICJhLHkifSwKLSAgezB4OWEsICJ0eHMiLCAiaSJ9LAotICB7MHg5YiwgInR4eSIsICJpIn0sCi0gIHsweDljLCAic3R6IiwgImEifSwKLSAgezB4OWQsICJzdGEiLCAiYSx4In0sCi0gIHsweDllLCAic3R6IiwgImEseCJ9LAotICB7MHg5ZiwgInN0YSIsICJhbCx4In0sCi0gIHsweGEwLCAibGR5IiwgIiNpIn0sCi0gIHsweGExLCAibGRhIiwgIihkLHgpIn0sCi0gIHsweGEyLCAibGR4IiwgIiNpIn0sCi0gIHsweGEzLCAibGRhIiwgImQscyJ9LAotICB7MHhhNCwgImxkeSIsICJkIn0sCi0gIHsweGE1LCAibGRhIiwgImQifSwKLSAgezB4YTYsICJsZHgiLCAiZCJ9LAotICB7MHhhNywgImxkYSIsICJbZF0ifSwKLSAgezB4YTgsICJ0YXkiLCAiaSJ9LAotICB7MHhhOSwgImxkYSIsICIjYSJ9LAotICB7MHhhYSwgInRheCIsICJpIn0sCi0gIHsweGFiLCAicGxiIiwgInMifSwKLSAgezB4YWMsICJsZHkiLCAiYSJ9LAotICB7MHhhZCwgImxkYSIsICJhIn0sCi0gIHsweGFlLCAibGR4IiwgImEifSwKLSAgezB4YWYsICJsZGEiLCAiYWwifSwKLSAgezB4YjAsICJiY3MiLCAiciJ9LAotICB7MHhiMSwgImxkYSIsICIoZCkseSJ9LAotICB7MHhiMiwgImxkYSIsICIoZCkifSwKLSAgezB4YjMsICJsZGEiLCAiKGQscykseSJ9LAotICB7MHhiNCwgImxkeSIsICJkLHgifSwKLSAgezB4YjUsICJsZGEiLCAiZCx4In0sCi0gIHsweGI2LCAibGR4IiwgImQseSJ9LAotICB7MHhiNywgImxkYSIsICJbZF0seSJ9LAotICB7MHhiOCwgImNsdiIsICJpIn0sCi0gIHsweGI5LCAibGRhIiwgImEseSJ9LAotICB7MHhiYSwgInRzeCIsICJpIn0sCi0gIHsweGJiLCAidHl4IiwgImkifSwKLSAgezB4YmMsICJsZHkiLCAiYSx4In0sCi0gIHsweGJkLCAibGRhIiwgImEseCJ9LAotICB7MHhiZSwgImxkeCIsICJhLHkifSwKLSAgezB4YmYsICJsZGEiLCAiYWwseCJ9LAotICB7MHhjMCwgImNweSIsICIjaSJ9LAotICB7MHhjMSwgImNtcCIsICIoZCx4KSJ9LAotICB7MHhjMiwgInJlcCIsICIjYyJ9LAotICB7MHhjMywgImNtcCIsICJkLHMifSwKLSAgezB4YzQsICJjcHkiLCAiZCJ9LAotICB7MHhjNSwgImNtcCIsICJkIn0sCi0gIHsweGM2LCAiZGVjIiwgImQifSwKLSAgezB4YzcsICJjbXAiLCAiW2RdIn0sCi0gIHsweGM4LCAiaW55IiwgImkifSwKLSAgezB4YzksICJjbXAiLCAiI2EifSwKLSAgezB4Y2EsICJkZXgiLCAiaSJ9LAotICB7MHhjYiwgIndhaSIsICJpIn0sCi0gIHsweGNjLCAiY3B5IiwgImEifSwKLSAgezB4Y2QsICJjbXAiLCAiYSJ9LAotICB7MHhjZSwgImRlYyIsICJhIn0sCi0gIHsweGNmLCAiY21wIiwgImFsIn0sCi0gIHsweGQwLCAiYm5lIiwgInIifSwKLSAgezB4ZDEsICJjbXAiLCAiKGQpLHkifSwKLSAgezB4ZDIsICJjbXAiLCAiKGQpIn0sCi0gIHsweGQzLCAiY21wIiwgIihkLHMpLHkifSwKLSAgezB4ZDQsICJwZWkiLCAiZCJ9LAotICB7MHhkNSwgImNtcCIsICJkLHgifSwKLSAgezB4ZDYsICJkZWMiLCAiZCx4In0sCi0gIHsweGQ3LCAiY21wIiwgIltkXSx5In0sCi0gIHsweGQ4LCAiY2xkIiwgImkifSwKLSAgezB4ZDksICJjbXAiLCAiYSx5In0sCi0gIHsweGRhLCAicGh4IiwgInMifSwKLSAgezB4ZGIsICJzdHAiLCAiaSJ9LAotICB7MHhkYywgImptcCIsICJbYV0ifSwKLSAgezB4ZGQsICJjbXAiLCAiYSx4In0sCi0gIHsweGRlLCAiZGVjIiwgImEseCJ9LAotICB7MHhkZiwgImNtcCIsICJhbCx4In0sCi0gIHsweGUwLCAiY3B4IiwgIiNpIn0sCi0gIHsweGUxLCAic2JjIiwgIihkLHgpIn0sCi0gIHsweGUyLCAic2VwIiwgIiNjIn0sCi0gIHsweGUzLCAic2JjIiwgImQscyJ9LAotICB7MHhlNCwgImNweCIsICJkIn0sCi0gIHsweGU1LCAic2JjIiwgImQifSwKLSAgezB4ZTYsICJpbmMiLCAiZCJ9LAotICB7MHhlNywgInNiYyIsICJbZF0ifSwKLSAgezB4ZTgsICJpbngiLCAiaSJ9LAotICB7MHhlOSwgInNiYyIsICIjYSJ9LAotICB7MHhlYSwgIm5vcCIsICJpIn0sCi0gIHsweGViLCAieGJhIiwgImkifSwKLSAgezB4ZWMsICJjcHgiLCAiYSJ9LAotICB7MHhlZCwgInNiYyIsICJhIn0sCi0gIHsweGVlLCAiaW5jIiwgImEifSwKLSAgezB4ZWYsICJzYmMiLCAiYWwifSwKLSAgezB4ZjAsICJiZXEiLCAiciJ9LAotICB7MHhmMSwgInNiYyIsICIoZCkseSJ9LAotICB7MHhmMiwgInNiYyIsICIoZCkifSwKLSAgezB4ZjMsICJzYmMiLCAiKGQscykseSJ9LAotICB7MHhmNCwgInBlYSIsICJhIn0sCi0gIHsweGY1LCAic2JjIiwgImQseCJ9LAotICB7MHhmNiwgImluYyIsICJkLHgifSwKLSAgezB4ZjcsICJzYmMiLCAiW2RdLHkifSwKLSAgezB4ZjgsICJzZWQiLCAiaSJ9LAotICB7MHhmOSwgInNiYyIsICJhLHkifSwKLSAgezB4ZmEsICJwbHgiLCAicyJ9LAotICB7MHhmYiwgInhjZSIsICJpIn0sCi0gIHsweGZjLCAianNyIiwgIihhLHgpIn0sCi0gIHsweGZkLCAic2JjIiwgImEseCJ9LAotICB7MHhmZSwgImluYyIsICJhLHgifSwKLSAgezB4ZmYsICJzYmMiLCAiYWwseCJ9LAotICAwfTsKLQotCi1pbnQgcGZ1bmMoYSxiKQotc3RydWN0IG9waW5mbyAqYTsKLXN0cnVjdCBvcGluZm8gKmI7Ci17Ci1yZXR1cm4gc3RyY21wKGEtPm1vZGUsIGItPm1vZGUpOwotCi19Ci1zdGF0aWMgdm9pZAotZHVtcF90YWJsZSAoKQotewotICBpbnQgeDsKLSAgaW50IHk7Ci0gIHByaW50ZiAoIiAgfCIpOwotICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgICAleCAgIHwiLCB4KTsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIiAgfCIpOwotICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCItLS0tLS0tfCIpOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLQotICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIleCB8IiwgeSk7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLQl7Ci0JICBzdHJ1Y3Qgb3BpbmZvICpwID0gJm9wdGFibGVbeSAqIDE2ICsgeF07Ci0JICBpZiAocC0+b3Bjb2RlKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJS03cyIsIHAtPm9wY29kZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIioqKioqKioiKTsKLQkgICAgfQotCSAgcHJpbnRmICgifCIpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCIgIHwiKTsKLQotICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0JewotCSAgc3RydWN0IG9waW5mbyAqcCA9ICZvcHRhYmxlW3kgKiAxNiArIHhdOwotCSAgaWYgKHAtPm1vZGUpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlLTdzIiwgcC0+bW9kZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIioqKioqKioiKTsKLQkgICAgfQotCSAgcHJpbnRmICgifCIpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCIgIHwiKTsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotCXsKLQkgIHByaW50ZiAoIi0tLS0tLS18Iik7Ci0JfQotCi0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi1kdCAoKQotewotI2lmIDAKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb3BpbmZvICpwID0gJm9wdGFibGVbaV07Ci0gICAgICBwcmludGYgKCIvKiAlMDJ4ICovICIsIGkpOwotICAgICAgaWYgKHAtPm9wY29kZSkKLQlwcmludGYgKCJ7XCIlc1wiLFwiJXNcIiwlZCwlZH0sIiwgcC0+b3Bjb2RlLT5uYW1lLCBwLT5hZGRyLT5uYW1lKTsKLQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotfQotc3RhdGljCi12b2lkCi1pbml0X3RhYmxlICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IG9waW5mbyAqcCA9IG9wdGFibGUgKyBpOwotICAgICAgc3RydWN0IGFpbmZvICphOwotICAgICAgc3RydWN0IG9pbmZvICpvOwotICAgICAgZm9yIChhID0gYWxpc3Q7IGEtPm5hbWU7IGErKykKLQl7Ci0JICBpZiAoc3RyY21wIChhLT5uYW1lLCBwLT5tb2RlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcC0+YWkgPSBhOwotCSAgICAgIGdvdG8gZG9uZTsKLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoImJhZCAleFxuIiwgaSk7Ci0gICAgZG9uZTo7Ci0gICAgICBmb3IgKG8gPSBvbGlzdDsgby0+bmFtZTsgbysrKQotCXsKLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsIHAtPm9wY29kZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHAtPm9pID0gbzsKLQkgICAgICBnb3RvIGRvbmVvOwotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiYmFkICV4XG4iLCBpKTsKLSAgICBkb25lbzo7Ci0KLSAgICB9Ci19Ci0KLS8qIER1bXAgdGhlIG9wY29kZXMgc29ydGVkIGJ5IG5hbWUgKi8KLXN0YXRpYwotdm9pZAotYXNzZW1ibGVyX3RhYmxlIChhcykKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBvaW5mbyAqbzsKLSAgc3RydWN0IGFpbmZvICphOwotICBpbnQgbiA9IDA7Ci0gIC8qIFN0ZXAgdGhyb3VnaCB0aGUgc29ydGVkIGxpc3Qgb2Ygb3BuYW1lcyAqLwotICBwcmludGYgKCIJCQkvKiBXREMgNjU4MTYgQXNzZW1ibGVyIG9wY29kZSB0YWJsZSAqL1xuIik7Ci0gIHByaW50ZiAoIgkJCS8qICAgKGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBzaW0vdzY1L2dlbmNvZGUgLWEpICovXG4iKTsKLQotICBmb3IgKGEgPSBhbGlzdDsgYS0+bmFtZTsgYSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiNkZWZpbmUgQUREUl8lLTIwcyVkXHQgLyogJS03cyAqL1xuIiwgYS0+ZW51bW5hbWUsICsrbiwgYS0+bmFtZSk7Ci0gICAgfQotCi0gIHByaW50ZiAoInN0cnVjdCBvcGluZm8ge1xuXHRpbnQgdmFsO1xuXHRpbnQgY29kZTtcblx0Y2hhciAqbmFtZTtcblx0aW50IGFtb2RlO1xufTtcbiIpOwotCi0gIHByaW50ZiAoInN0cnVjdCBvcGluZm8gb3B0YWJsZVsyNTddPXtcbiIpOwotICBpZiAoYXMpCi0gICAgewotICAgICAgaSA9IDE7Ci0gICAgICBmb3IgKG8gPSBvbGlzdDsgby0+bmFtZTsgbysrKQotCXsKLQkgIHByaW50ZiAoIiNkZWZpbmUgT18lcyAlZFxuIiwgby0+bmFtZSwgaSsrKTsKLQl9Ci0gICAgICAKLSAgICAgIHFzb3J0IChvcHRhYmxlLCAyNTYsIHNpemVvZiAoc3RydWN0IG9waW5mbyksIHBmdW5jKTsKLQotICAgICAgcHJpbnRmICgiI2lmZGVmIERFRklORV9UQUJMRVxuIik7Ci0gICAgICBmb3IgKG8gPSBvbGlzdDsgby0+bmFtZTsgbysrKQotCXsKLQotCSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IG9waW5mbyAqcCA9IG9wdGFibGUgKyBpOwotCi0JICAgICAgaWYgKHAtPm9pID09IG8pCi0JCXsKLQkJICAvKiBUaGlzIG9wY29kZSBpcyBvZiB0aGUgcmlnaHQgbmFtZSAqLwotCQkgIHByaW50ZiAoIlx0ezB4JTAyWCxcdE9fJXMsXHRcIiVzXCIsXHRBRERSXyVzfSxcbiIsIHAtPmNvZGUsIHAtPm9pLT5uYW1lLCBwLT5vaS0+bmFtZSwgcC0+YWktPmVudW1uYW1lKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQl7Ci0JICBzdHJ1Y3Qgb3BpbmZvICpwID0gb3B0YWJsZSArIGk7Ci0JICBwcmludGYgKCJcdHsweCUwMlgsXHRcIiVzXCIsXHRBRERSXyVzfSxcbiIsIGksIHAtPm9pLT5uYW1lLCBwLT5haS0+ZW51bW5hbWUpOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmICgiMH07XG4iKTsKLSAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLQotCi0gIC8qIEdlbmVyYXRlIHRoZSBvcGVyYW5kIGRpc2Fzc2VtYmx5IGNhc2UgbGlzdCAqLwotCi0gIHByaW50ZiAoIiNkZWZpbmUgRElTQVNNKClcXFxuIik7Ci0gIHsKLSAgICBzdHJ1Y3QgYWluZm8gKmE7Ci0gICAgZm9yIChhID0gYWxpc3Q7IGEtPm5hbWU7IGErKykKLSAgICAgIHsKLQlwcmludGYgKCIgIGNhc2UgQUREUl8lczpcXFxuXHQiLCBhLT5lbnVtbmFtZSk7Ci0JaWYgKHN0cmNtcCAoYS0+ZW51bW5hbWUsICJCTE9DS19NT1ZFIikgPT0gMCkKLQkgIHsKLQkgICAgcHJpbnRmICgiYXJnc1swXSA9IChhc1JfVzY1X0FCUzE2ID4+OCkgJjB4ZmY7XFxcbiIpOwotCSAgICBwcmludGYgKCJcdGFyZ3NbMV0gPSAoIGFzUl9XNjVfQUJTMTYgJiAweGZmKTtcXFxuIik7Ci0JICAgIHByaW50ZiAoIlx0cHJpbnRfb3BlcmFuZCAoMCxcIlx0JDAsJDFcIixhcmdzKTtcXFxuIik7Ci0JICB9Ci0JZWxzZSBpZiAoYS0+cmVsb2MwID09IDApIAotCSAgewotCSAgICBwcmludGYgKCJwcmludF9vcGVyYW5kICgwLCBcIlx0JXNcIiwgMCk7XFxcbiIsIGEtPmRpc2FzbXN0cmluZyApOwotCSAgfQotCWVsc2UgaWYgKHN0cmxlbiAoYS0+cmVsb2MwKSkKLQkgIHsKLQkgICAgcHJpbnRmICgiYXJnc1swXSA9ICIpOwotCSAgICBwcmludGYgKGEtPnJlbG9jMCwgImFzIiwiYXMiKTsKLQkgICAgcHJpbnRmICgiO1xcXG4iKTsKLQkgICAgcHJpbnRmICgiXHRwcmludF9vcGVyYW5kICglZCwgXCJcdCVzXCIsIGFyZ3MpO1xcXG4iLAotCQkgICAgYS0+cmVnZmxhZywKLQkJICAgIGEtPmRpc2FzbXN0cmluZyk7Ci0JICB9Ci0JCi0JcHJpbnRmICgiXHRzaXplICs9ICVzO1xcXG5cdGJyZWFrO1xcXG4iLCBhLT5zaXplcik7Ci0gICAgICB9Ci0gIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIC8qIEdlbmVyYXRlIHRoZSBvcGVyYW5kIHNpemUgYW5kIHR5cGUgY2FzZSBsaXN0ICovCi0KLSAgcHJpbnRmICgiI2RlZmluZSBHRVRJTkZPKHNpemUsdHlwZSxwY3JlbClcXFxuIik7Ci0gIHsKLSAgICBzdHJ1Y3QgYWluZm8gKmE7Ci0gICAgZm9yIChhID0gYWxpc3Q7IGEtPm5hbWU7IGErKykKLSAgICAgIHsKLQlwcmludGYgKCJcdGNhc2UgQUREUl8lczogIiwgYS0+ZW51bW5hbWUpOwotCXByaW50ZiAoInNpemUgPSAlczt0eXBlPSIsIGEtPnNpemVyKTsKLQlpZiAoYS0+cmVsb2MwICYmIHN0cmxlbiAoYS0+cmVsb2MwKSkKLQkgIHsKLQkgICAgcHJpbnRmIChhLT5yZWxvYzAsICIiLCAiIik7Ci0JICB9Ci0JZWxzZQotCSAgcHJpbnRmICgiLTEiKTsKLQlwcmludGYgKCI7cGNyZWw9JWQ7IiwgYS0+bmFtZVswXSA9PSAnUCcpOwotCXByaW50ZiAoImJyZWFrO1xcXG4iKTsKLSAgICAgIH0KLSAgfQotICBwcmludGYgKCJcbiIpOwotfQotCi0KLS8qIFdyaXRlIG91dCBleGFtcGxlcyBvZiBlYWNoIG9wY29kZSAqLwotc3RhdGljCi12b2lkCi10ZXN0X3RhYmxlICgpCi17Ci0gIHN0cnVjdCBvcGluZm8gKm87Ci0gIGZvciAobyA9IG9wdGFibGU7IG8tPm9wY29kZTsgbysrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlx0JXNcdCIsIG8tPm9wY29kZSk7Ci0gICAgICBwcmludGYgKG8tPmFpLT5kaXNhc21zdHJpbmcsIDB4NjU0MzIxMCwgMHg2NTQzMjEwKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1vcF90YWJsZSAoKQotewotICBzdHJ1Y3Qgb3BpbmZvICpvOwotICBpbnQgaSA9IDA7Ci0gIC8qIFdyaXRlIGZvdXIgb3B0YWJsZXMsIE09MCwxIFg9MCwxICovCi0KLSAgZm9yIChvID0gb3B0YWJsZTsgby0+b3Bjb2RlOyBvKyspCi0gICAgewotICAgICAgcHJpbnRmICgiezB4JTAyeCwgXCIlc1wiLCBcIiVzXCJcdH0sXG4iLAotCSAgICAgIGkrKywKLQkgICAgICBvLT5vcGNvZGUsCi0JICAgICAgby0+bW9kZSk7Ci0gICAgfQotfQotCi1pbnQgd29ya2VkX291dF9sdmFsOwotc3RhdGljIHZvaWQKLWdlbmZldGNoIChhbW9kZSwgc2l6ZSkKLSAgICAgc3RydWN0IGFpbmZvICphbW9kZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGlmIChhbW9kZS0+aG93bHZhbCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChhbW9kZS0+bmFtZSwgIkEiKSA9PSAwKQotCXsKLQkgIC8qIENhbid0IGdldCB0aGUgbHZhbCBmb3IgdGhlIGFjY3VtdWxhdG9yICovCi0JICBwcmludGYgKCJzcmMgPSBHRVRfQTtcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIlc1xuIiwgYW1vZGUtPmhvd2x2YWwpOwotd29ya2VkX291dF9sdmFsID0gMTsKLQkgIGlmIChzaXplID09IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzcmMgPSBmZXRjaDE2IChsdmFsKTtcbiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzcmMgPSBmZXRjaDggKGx2YWwpO1xuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1nZW5zdG9yZSAoYW1vZGUsIHNpemUpCi0gICAgIHN0cnVjdCBhaW5mbyAqYW1vZGU7Ci0gICAgIGludCBzaXplOwotewotICBpZiAoYW1vZGUtPmhvd2x2YWwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYW1vZGUtPm5hbWUsICJBIikgPT0gMCkKLQl7Ci0JICAvKiBDYW4ndCBnZXQgdGhlIGx2YWwgZm9yIHRoZSBhY2N1bXVsYXRvciAqLwotCSAgcHJpbnRmICgiU0VUX0EgKHNyYyk7XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCF3b3JrZWRfb3V0X2x2YWwpCi0JICAgIHByaW50ZiAoIiVzXG4iLCBhbW9kZS0+aG93bHZhbCk7Ci0JICBpZiAoc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgic3RvcmUxNihsdmFsLCBzcmMpO1xuIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoInN0b3JlOChsdmFsLCBzcmMpO1xuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotLyogR2VuZXJhdGUgdGhlIGNvZGUgdG8gc2ltdWxhdGUgdGhlIGluc3RydWN0aW9ucyAqLwotc3RhdGljIHZvaWQKLWNvZGVfdGFibGUgKCkKLXsKLSAgc3RydWN0IG9waW5mbyAqbzsKLSAgaW50IHgsIG07Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJpbnRlcnAuaFwiXG4iKTsKLQotICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0gICAgZm9yIChtID0gMDsgbSA8IDI7IG0rKykgewotICAgICAgcHJpbnRmKCJpZnVuY19YJWRfTSVkKCkge1xuIix4LG0pOwotICAgICAgcHJpbnRmKCIjdW5kZWYgR0VUX01CSVRcbiIpOwotICAgICAgcHJpbnRmKCIjdW5kZWYgR0VUX1hCSVRcbiIpOwotICAgICAgcHJpbnRmKCIjZGVmaW5lIEdFVF9YQklUICVkXG4iLCB4KTsKLSAgICAgIHByaW50ZigiI2RlZmluZSBHRVRfTUJJVCAlZFxuIiwgbSk7Ci0gICAgICBwcmludGYoIlNUQVJURlVOQygpO1xuIik7Ci0gICAgICBwcmludGYoImRvIHsgcmVnaXN0ZXIgb3Bjb2RlID0gZmV0Y2g4KEdFVF9QQlJQQyk7IGluc3RzKys7IElOQ19QQygxKTtcbiIpOwotICAgICAgcHJpbnRmICgic3dpdGNoIChvcGNvZGUpIHtcbiIpOwotICAgICAgZm9yIChvID0gb3B0YWJsZTsgby0+b3Bjb2RlOyBvKyspCi0JewotCSAgcHJpbnRmICgiCQkvKiAlcyAlcyAqL1xuIiwgby0+b3Bjb2RlLCBvLT5haS0+bmFtZSk7Ci0JICBwcmludGYgKCJjYXNlIDB4JTAyeDpcbiIsIG8tPmNvZGUpOwotCSAgcHJpbnRmICgie1xuIik7Ci0JICBwcmludGYgKCJpbnQgbCA7XG4iKTsKLQkgIHByaW50ZiAoInJlZ2lzdGVyIGludCBzcmM7XG4iKTsKLQkgIHByaW50ZiAoInJlZ2lzdGVyIGludCBsdmFsO1xuIik7Ci13b3JrZWRfb3V0X2x2YWwgPSAwOwotCSAgc3dpdGNoIChvLT5vaS0+aG93c3JjKQotCSAgICB7Ci0JICAgIGNhc2UgUE9QX006Ci0JICAgICAgaWYgKG0gPT0gMCkKLQkJcHJpbnRmICgiUE9QMTYgKHNyYyk7Iik7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJQT1A4KHNyYyk7Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUE9QX1g6Ci0JICAgICAgaWYgKHggPT0gMCkKLQkJcHJpbnRmICgiUE9QMTYgKHNyYyk7Iik7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJQT1A4IChzcmMpOyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBPUF84OgotCSAgICAgIHByaW50ZiAoIlBPUDggKHNyYyk7Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUE9QXzE2OgotCSAgICAgIHByaW50ZiAoIlBPUDE2IChzcmMpOyIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU1RBTkRBUkRfUENfR0VUOgotCSAgICAgIHByaW50ZiAoIiVzXG4iLCBvLT5haS0+aG93bHZhbCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHRVRfTToKLQkgICAgICBnZW5mZXRjaCAoby0+YWksIG0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEcyX0dFVDoKLQkgICAgICBnZW5mZXRjaCAoby0+YWksIG0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEdFVF9YOgotCSAgICAgIGdlbmZldGNoIChvLT5haSwgeCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQlJBTkNIOgotCSAgICAgIHByaW50ZiAoIiVzIiwgby0+YWktPmhvd2x2YWwpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENPUF9HRVQ6Ci0JICAgICAgZ2VuZmV0Y2goby0+YWksMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RPUkVfWDoKLQkgICAgY2FzZSBTVE9SRV9NOgotCSAgICAgIDsKLQkgICAgfQotCi0JICBzd2l0Y2ggKG8tPm9pLT5ob3dzcmMpCi0JICAgIHsKLQkgICAgY2FzZSBCUkFOQ0g6Ci0JICAgICAgcHJpbnRmICgiaWYgKCVzKSB7IFNFVF9PTkxZX1BDKGx2YWwpO30gIiwgby0+b2ktPmhvd3RvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUEVDSUFMX0NBU0U6Ci0JICAgIGNhc2UgR0VUX006Ci0JICAgIGNhc2UgR0VUX1g6Ci0JICAgIGNhc2UgU1RPUkVfWDoKLQkgICAgY2FzZSBTVEFOREFSRF9QQ19HRVQ6Ci0JICAgIGNhc2UgRzJfR0VUOgotCSAgICBjYXNlIFBVU0hfMTY6Ci0JICAgIGNhc2UgUFVTSF84OgotCSAgICBjYXNlIFBVU0hfTToKLQkgICAgY2FzZSBQVVNIX1g6Ci0JICAgIGNhc2UgUE9QXzE2OgotCSAgICBjYXNlIFBPUF84OgotCSAgICBjYXNlIFBPUF9NOgotCSAgICBjYXNlIFBPUF9YOgotCSAgICBjYXNlIENPUF9HRVQ6Ci0JICAgIGNhc2UgU1RPUkVfTToKLQkgICAgICBwcmludGYgKCIlcyIsIG8tPm9pLT5ob3d0byk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChvLT5vaS0+aG93c3JjKQotCSAgICB7Ci0JICAgIGNhc2UgU1RPUkVfTToKLQkgICAgICBnZW5zdG9yZSAoby0+YWksIG0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUT1JFX1g6Ci0JICAgICAgZ2Vuc3RvcmUgKG8tPmFpLCB4KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVVNIX006Ci0JICAgICAgaWYgKG0gPT0gMCkKLQkJcHJpbnRmICgiUFVTSDE2IChzcmMpOyIpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiUFVTSDgoc3JjKTsiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVVNIX1g6Ci0JICAgICAgaWYgKHggPT0gMCkKLQkJcHJpbnRmICgiUFVTSDE2IChzcmMpOyIpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiUFVTSDggKHNyYyk7Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFVTSF84OgotCSAgICAgIHByaW50ZiAoIlBVU0g4IChzcmMpOyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBVU0hfMTY6Ci0JICAgICAgcHJpbnRmICgiUFVTSDE2IChzcmMpOyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEcyX0dFVDoKLQkgICAgICBnZW5zdG9yZSAoby0+YWksIHgsIG0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBwcmludGYgKCJ9XG4iKTsKLQotCSAgcHJpbnRmICgiYnJlYWs7XG4iKTsKLQl9Ci0gICAgICBwcmludGYgKCJ9XG59XG4iKTsKLSAgICAgIHByaW50Zigid2hpbGUgKCFzYXZlZF9zdGF0ZS5leGNlcHRpb24pO1xuIik7Ci0gICAgICBwcmludGYoIiN1bmRlZiBHRVRfTUJJVFxuIik7Ci0gICAgICBwcmludGYoIiN1bmRlZiBHRVRfWEJJVFxuIik7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgR0VUX01CSVQgKHRoZV9tYml0KVxuIik7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgR0VUX1hCSVQgKHRoZV94Yml0KVxuIik7Ci0gICAgICAKLSAgICAgIHByaW50ZigiRU5ERlVOQygpO1xuIik7Ci0gICAgICBwcmludGYoIn0iKTsKLSAgICB9Ci0gIH0KLX0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGNoYXIgKiphdjsKLXsKLSAgaW5pdF90YWJsZSAoKTsKLQotICBpZiAoYWMgPiAxKQotICAgIHsKLSAgICAgIGlmIChhdlsxXVsxXSA9PSAnYScpCi0JewotCSAgYXNzZW1ibGVyX3RhYmxlICgxKTsKLQl9Ci0gICAgICBpZiAoYXZbMV1bMV0gPT0gJ3QnKQotCXsKLQkgIHRlc3RfdGFibGUgKCk7Ci0JfQotICAgICAgaWYgKGF2WzFdWzFdID09ICdvJykKLQl7Ci0JICBvcF90YWJsZSAoKTsKLQl9Ci0gICAgICBpZiAoYXZbMV1bMV0gPT0gJ2MnKQotCXsKLQkgIGNvZGVfdGFibGUgKCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGR1bXBfdGFibGUgKCk7Ci0KLSAgZHQgKCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zaW0vdzY1L2ludGVycC5jIGIvc2ltL3c2NS9pbnRlcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNGUzMi4uMDAwMDAwMAotLS0gYS9zaW0vdzY1L2ludGVycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qIFNpbXVsYXRvciBmb3IgdGhlIFdEQyA2NTgxNiBhcmNoaXRlY3R1cmUuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBXNjUgc2ltCi0KLQotCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAotCi0gICBDeWdudXMgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEN5Z251cwotICAgbWFrZXMgbm8gd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UKLSAgIGFuZCB0aGUgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KLQotICAgQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTwotICAgVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0jaW5jbHVkZSAiLi4vLi4vbmV3bGliL2xpYmMvc3lzL3c2NS9zeXMvc3lzY2FsbC5oIgotCi0jaW5jbHVkZSAiaW50ZXJwLmgiCi0KLXNhdmVkX3N0YXRlX3R5cGUgc2F2ZWRfc3RhdGU7Ci0KLWludAotZ2V0X25vdyAoKQotewotICByZXR1cm4gdGltZSAoKGxvbmcgKikgMCk7Ci19Ci12b2lkCi1jb250cm9sX2MgKHNpZywgY29kZSwgc2NwLCBhZGRyKQotICAgICBpbnQgc2lnOwotICAgICBpbnQgY29kZTsKLSAgICAgY2hhciAqc2NwOwotICAgICBjaGFyICphZGRyOwotewotICBzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdJTlQ7Ci19Ci0KLXdhaSAoKQotewotICBzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOwotfQotCi0KLQotd2RtIChhY2MsIHgpCi0gICAgIGludCBhY2M7Ci0gICAgIGludCB4OwotCi17Ci1pbnQgY3ljbGVzOwotICAvKiBUaGUgeCBwb2ludHMgdG8gd2hlcmUgdGhlIHJlZ2lzdGVycyBsaXZlLCBhY2MgaGFzIGNvZGUgKi8KLQotI2RlZmluZSBSKGFyZykgICh4ICsgIGFyZyAqIDIpCi11bnNpZ25lZCAgUjAgPSBSKDApOwotdW5zaWduZWQgIFI0ID0gUig0KTsKLXVuc2lnbmVkICBSNSA9IFIoNSk7Ci11bnNpZ25lZCAgUjYgPSBSKDYpOwotdW5zaWduZWQgIFI3ID0gUig3KTsKLXVuc2lnbmVkICBSOCA9IFIoOCk7Ci11bnNpZ25lZCBjaGFyICptZW1vcnkgPSBzYXZlZF9zdGF0ZS5tZW1vcnk7Ci0gIGludCBhMSA9IGZldGNoMTYgKFIgKDQpKTsKLSAgc3dpdGNoIChhMSkKLSAgICB7Ci0gICAgY2FzZSBTWVNfd3JpdGU6Ci0gICAgICB7Ci0JaW50IGZpbGUgPSBmZXRjaDE2IChSNSk7Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gZmV0Y2gyNCAoUjYpICsgbWVtb3J5OwotCWludCBsZW4gPSBmZXRjaDE2IChSOCk7Ci0JaW50IHJlcyA9IHdyaXRlIChmaWxlLCBidWYsIGxlbik7Ci0Jc3RvcmUxNiAoUjAsIHJlcyk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAwOgotICAgICAgcHJpbnRmICgiJWMiLCBhY2MpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotdm9pZAotc2ltX3Jlc3VtZSAoc3RlcCwgaW5zaWduYWwpCi0gICAgIGludCBzdGVwOwotICAgICBpbnQgaW5zaWduYWw7Ci17Ci0gIHZvaWQgKCpwcmV2KSAoKTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqbWVtb3J5OwotICBpZiAoc3RlcCkKLSAgICB7Ci0gICAgICBzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9IDA7Ci0gICAgfQotCi0KLSAgcHJldiA9IHNpZ25hbCAoU0lHSU5ULCBjb250cm9sX2MpOwotICBkbwotICAgIHsKLSAgICAgIGludCB4ID0gKHNhdmVkX3N0YXRlLnAgPj4gNCkgJiAxOwotICAgICAgaW50IG0gPSAoc2F2ZWRfc3RhdGUucCA+PiA1KSAmIDE7Ci0gICAgICBpZiAoeCA9PSAwICYmIG0gPT0gMCkKLQl7Ci0JICBpZnVuY19YMF9NMCAoKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ID09IDAgJiYgbSA9PSAxKQotCXsKLQkgIGlmdW5jX1gwX00xICgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHggPT0gMSAmJiBtID09IDApCi0JewotCSAgaWZ1bmNfWDFfTTAgKCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCA9PSAxICYmIG0gPT0gMSkKLQl7Ci0JICBpZnVuY19YMV9NMSAoKTsKLQl9Ci0gICAgfQotICB3aGlsZSAoc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID09IDApOwotCi0gIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKLX0KLQotCi0KLQotaW5pdF9wb2ludGVycyAoKQotewotICBpZiAoIXNhdmVkX3N0YXRlLm1lbW9yeSkKLSAgICB7Ci0gICAgICBzYXZlZF9zdGF0ZS5tZW1vcnkgPSBjYWxsb2MgKDY0ICogMTAyNCwgTlVNU0VHUyk7Ci0gICAgfQotfQotCi1pbnQKLXNpbV93cml0ZSAoYWRkciwgYnVmZmVyLCBzaXplKQotICAgICBTSU1fQUREUiBhZGRyOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW5pdF9wb2ludGVycyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHNhdmVkX3N0YXRlLm1lbW9yeVsoYWRkciArIGkpICYgTU1BU0tdID0gYnVmZmVyW2ldOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWludAotc2ltX3JlYWQgKGFkZHIsIGJ1ZmZlciwgc2l6ZSkKLSAgICAgU0lNX0FERFIgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGk7Ci0KLSAgaW5pdF9wb2ludGVycyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGJ1ZmZlcltpXSA9IHNhdmVkX3N0YXRlLm1lbW9yeVsoYWRkciArIGkpICYgTU1BU0tdOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLQotCi1zdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50ICpwdHI7Ci0gIGludCBzaXplOwotfQotcmluZm9bXSA9Ci0KLXsKLSAgJnNhdmVkX3N0YXRlLnJbMF0sIDIsCi0gICZzYXZlZF9zdGF0ZS5yWzFdLCAyLAotICAmc2F2ZWRfc3RhdGUuclsyXSwgMiwKLSAgJnNhdmVkX3N0YXRlLnJbM10sIDIsCi0gICZzYXZlZF9zdGF0ZS5yWzRdLCAyLAotICAmc2F2ZWRfc3RhdGUucls1XSwgMiwKLSAgJnNhdmVkX3N0YXRlLnJbNl0sIDIsCi0gICZzYXZlZF9zdGF0ZS5yWzddLCAyLAotICAmc2F2ZWRfc3RhdGUucls4XSwgMiwKLSAgJnNhdmVkX3N0YXRlLnJbOV0sIDIsCi0gICZzYXZlZF9zdGF0ZS5yWzEwXSwgMiwKLSAgJnNhdmVkX3N0YXRlLnJbMTFdLCAyLAotICAmc2F2ZWRfc3RhdGUuclsxMl0sIDIsCi0gICZzYXZlZF9zdGF0ZS5yWzEzXSwgMiwKLSAgJnNhdmVkX3N0YXRlLnJbMTRdLCAyLAotICAmc2F2ZWRfc3RhdGUuclsxNV0sIDQsCi0gICZzYXZlZF9zdGF0ZS5wYywgNCwKLSAgJnNhdmVkX3N0YXRlLmEsIDQsCi0gICZzYXZlZF9zdGF0ZS54LCA0LAotICAmc2F2ZWRfc3RhdGUueSwgNCwKLSAgJnNhdmVkX3N0YXRlLmRiciwgNCwKLSAgJnNhdmVkX3N0YXRlLmQsIDQsCi0gICZzYXZlZF9zdGF0ZS5zLCA0LAotICAmc2F2ZWRfc3RhdGUucCwgNCwKLSAgJnNhdmVkX3N0YXRlLnRpY2tzLCA0LAotICAmc2F2ZWRfc3RhdGUuY3ljbGVzLCA0LAotICAmc2F2ZWRfc3RhdGUuaW5zdHMsIDQsCi0gIDAKLX07Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChybiwgdmFsdWUsIGxlbmd0aCkKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbDsKLSAgaW50IGk7Ci0gIHZhbCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCByaW5mb1tybl0uc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZhbCB8PSAoKnZhbHVlKyspIDw8IChpICogOCk7Ci0gICAgfQotCi0gICoocmluZm9bcm5dLnB0cikgPSB2YWw7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHJuLCBidWYsIGxlbmd0aCkKLSAgICAgaW50IHJuOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHVuc2lnbmVkIGludCB2YWwgPSAqKHJpbmZvW3JuXS5wdHIpOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmluZm9bcm5dLnNpemU7IGkrKykKLSAgICB7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB2YWwgPSB2YWwgPj4gODsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KLQotCi1zaW1fcmVnX3NpemUgKG4pCi17Ci0gIHJldHVybiByaW5mb1tuXS5zaXplOwotfQotaW50Ci1zaW1fdHJhY2UgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXNpbV9zdG9wX3JlYXNvbiAocmVhc29uLCBzaWdyYykKLSAgICAgZW51bSBzaW1fc3RvcCAqcmVhc29uOwotICAgICBpbnQgKnNpZ3JjOwotewotICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci0gICpzaWdyYyA9IHNhdmVkX3N0YXRlLmV4Y2VwdGlvbjsKLX0KLQotaW50Ci1zaW1fc2V0X3BjICh4KQotICAgICBTSU1fQUREUiB4OwotewotICBzYXZlZF9zdGF0ZS5wYyA9IHg7Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQKLXNpbV9pbmZvICh2ZXJib3NlKQotICAgICBpbnQgdmVyYm9zZTsKLXsKLSAgZG91YmxlIHRpbWV0YWtlbiA9IChkb3VibGUpIHNhdmVkX3N0YXRlLnRpY2tzOwotICBkb3VibGUgdmlydHRpbWUgPSBzYXZlZF9zdGF0ZS5jeWNsZXMgLyAyLjBlNjsKLQotICBwcmludGYgKCJcblxuIyBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQgICUxMGRcbiIsIHNhdmVkX3N0YXRlLmluc3RzKTsKLSAgcHJpbnRmICgiIyBjeWNsZXMgICAgICAgICAgICAgICAgICUxMGRcbiIsIHNhdmVkX3N0YXRlLmN5Y2xlcyk7Ci0gIHByaW50ZiAoIiMgcmVhbCB0aW1lIHRha2VuICAgICAgICAlMTAuNGZcbiIsIHRpbWV0YWtlbik7Ci0gIHByaW50ZiAoIiMgdmlydHVhbCB0aW1lIHRha2VuICAgICAlMTAuNGZcbiIsIHZpcnR0aW1lKTsKLQotICBpZiAodGltZXRha2VuICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiIyBjeWNsZXMvc2Vjb25kICAgICAgICAgICUxMGRcbiIsIChpbnQpIChzYXZlZF9zdGF0ZS5jeWNsZXMgLyB0aW1ldGFrZW4pKTsKLSAgICAgIHByaW50ZiAoIiMgc2ltdWxhdGlvbiByYXRpbyAgICAgICAlMTAuNGZcbiIsIHZpcnR0aW1lIC8gdGltZXRha2VuKTsKLSAgICB9Ci0KLX0KLQotCi0KLXZvaWQKLXNpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKLSAgICAgU0lNX09QRU5fS0lORCBraW5kOwotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotewotfQotCi0KLQotI3VuZGVmIGZldGNoOAotZmV0Y2g4ZnVuYyAoeCkKLXsKLSAgaWYgKHggJiB+TU1BU0spCi0gICAgewotICAgICAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHQlVTOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gc2F2ZWRfc3RhdGUubWVtb3J5W3hdOwotfQotCi1mZXRjaDggKHgpCi17Ci1yZXR1cm4gZmV0Y2g4ZnVuYyh4KTsKLX0KLQotdm9pZAotc2ltX2Nsb3NlIChxdWl0dGluZykKLSAgICAgaW50IHF1aXR0aW5nOwotewotICAvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLWludAotc2ltX2xvYWQgKHByb2csIGZyb21fdHR5KQotICAgICBjaGFyICpwcm9nOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIC8qIFJldHVybiBub256ZXJvIHNvIGdkYiB3aWxsIGhhbmRsZSBpdC4gICovCi0gIHJldHVybiAxOwotfQotCi0KLXZvaWQKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKGFiZmQsIGFyZ3YsIGVudikKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICoqZW52OwotewotICBTSU1fQUREUiBzdGFydF9hZGRyZXNzOwotICBpbnQgcGM7Ci0gIGlmIChhYmZkICE9IE5VTEwpCi0gICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdGFydF9hZGRyZXNzID0gMDsgLyo/PyovCi0gIC8qID8/PyBXZSBhc3N1bWUgdGhpcyBpcyBhIDQgYnl0ZSBxdWFudGl0eS4gICovCi0gIHBjID0gc3RhcnRfYWRkcmVzczsKLSAgc2ltX3N0b3JlX3JlZ2lzdGVyICgxNiwgKHVuc2lnbmVkIGNoYXIgKikgJnBjKTsKLX0KLQotdm9pZAotc2ltX3NldF9jYWxsYmFja3MgKHB0cikKLXN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqcHRyOwotewotCi19CmRpZmYgLS1naXQgYS9zaW0vdzY1L2ludGVycC5oIGIvc2ltL3c2NS9pbnRlcnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNWQyMi4uMDAwMDAwMAotLS0gYS9zaW0vdzY1L2ludGVycC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSNkZWZpbmUgZmV0Y2g4KHgpIGZldGNoOGZ1bmMoKGN5Y2xlcysrLCh4KSkpCi0jZGVmaW5lIE5GQUtFUyAxNgotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkICBhOwotICAgIHVuc2lnbmVkICB4OwotICAgIHVuc2lnbmVkICB5OwotICAgIHVuc2lnbmVkICBwYzsJCS8qIEtlZXAgcGJyIGluIHRoZXJlIHRvbyAqLwotICAgIHVuc2lnbmVkICBkYnI7Ci0gICAgdW5zaWduZWQgIGQ7Ci0gICAgdW5zaWduZWQgIHM7Ci0gICAgdW5zaWduZWQgIHA7Ci0gICAgdW5zaWduZWQgIGU7Ci0gICAgdW5zaWduZWQgIGNoYXIgKm1lbW9yeTsKLSAgICB1bnNpZ25lZCAgaW50IGV4Y2VwdGlvbjsKLSAgICB1bnNpZ25lZCAgaW50IHRpY2tzOwotICAgIHVuc2lnbmVkICBpbnQgY3ljbGVzOwotICAgIHVuc2lnbmVkICBpbnQgaW5zdHM7Ci0gICAgdW5zaWduZWQgIGludCByW05GQUtFU107Ci0gIH0KLXNhdmVkX3N0YXRlX3R5cGU7Ci0KLQotCi0jZGVmaW5lIEdFVF9QICAgICAgXAotICAoKEdFVF9OQklUIDw8IDcpIFwKLSB8IChHRVRfVkJJVCA8PCA2KSBcCi0gfCAoR0VUX01CSVQgPDwgNSkgXAotIHwgKEdFVF9YQklUIDw8IDQpIFwKLSB8IChHRVRfREJJVCA8PCAzKSBcCi0gfCAoR0VUX0lCSVQgPDwgMikgXAotIHwgKEdFVF9aQklUIDw8IDEpIFwKLSB8IChHRVRfQ0JJVCA8PCAwKSkKLQotI2RlZmluZSBTRVRfUChfYml0cykgICBcCi17IGludCBiaXRzID0gX2JpdHM7ICAgIFwKLVNFVF9OQklUKChiaXRzPj43KSYxKTsgXAotU0VUX1ZCSVQoKGJpdHM+PjYpJjEpOyBcCi1TRVRfTUJJVCgoYml0cz4+NSkmMSk7IFwKLVNFVF9YQklUKChiaXRzPj40KSYxKTsgXAotU0VUX0RCSVQoKGJpdHM+PjMpJjEpOyBcCi1TRVRfSUJJVCgoYml0cz4+MikmMSk7IFwKLVNFVF9aQklUKChiaXRzPj4xKSYxKTsgXAotU0VUX0NCSVQoKGJpdHM+PjApJjEpOyAgfQotCi0jZGVmaW5lIEJGTEFHCQkoMTw8NCkKLSNkZWZpbmUgREZMQUcgCQkoMTw8MykKLQotI2RlZmluZSBHRVRfQSAJCSh0aGVfYSkKLSNkZWZpbmUgR0VUX0UJCSh0aGVfZSkKLSNkZWZpbmUgR0VUX0IgCQkodGhlX2IpCi0jZGVmaW5lIEdFVF9DQklUIAkodGhlX2NiaXQpCi0jZGVmaW5lIEdFVF9ECQkodGhlX2QpCi0jZGVmaW5lIEdFVF9EQklUIAkodGhlX2RiaXQpCi0jZGVmaW5lIEdFVF9EQlJfSElHSCAJKHRoZV9kYnIpCi0jZGVmaW5lIEdFVF9EQlJfTE9XIAkodGhlX2RiciA+PiAxNikKLSNkZWZpbmUgR0VUX0RQUiAJKHRoZV9kcHIpCi0jZGVmaW5lIEdFVF9JQklUCSh0aGVfaWJpdCkKLSNkZWZpbmUgR0VUX01CSVQJKHRoZV9tYml0KQotI2RlZmluZSBTRVRfWEJJVCh4KSAgICAgeyB0aGVfeGJpdCA9IHg7IH0gICAgICAgCi0jZGVmaW5lIEdFVF9OQklUIAkodGhlX25iaXQpCi0jZGVmaW5lIEdFVF9QQlJQQyAJKHRoZV9wYykKLSNkZWZpbmUgR0VUX1BCUl9ISUdIIAkodGhlX3BjICYgMHhmZjAwMDApCi0jZGVmaW5lIEdFVF9QQlJfTE9XIAkodGhlX3BjID4+IDE2KQotI2RlZmluZSBHRVRfUEMgCQkodGhlX3BjICYgMHhmZmZmKQotI2RlZmluZSBHRVRfUyAJCSh0aGVfcykKLSNkZWZpbmUgR0VUX1ZCSVQgCSh0aGVfdmJpdCkKLSNkZWZpbmUgR0VUX1ggCQkodGhlX3gpCi0jZGVmaW5lIEdFVF9YQklUIAkodGhlX3hiaXQpCi0jZGVmaW5lIEdFVF9ZIAkJKHRoZV95KQotI2RlZmluZSBHRVRfWkJJVCAJKHRoZV96Yml0KQotI2RlZmluZSBJRkxBRyAJCSgxPDwyKQotI2RlZmluZSBJTkNfUEMoeCkgCXt0aGVfcGMgKz0geDt9Ci0jZGVmaW5lIFBPUDE2KHgpICAgICAgICB7IGludCBfeHg7IFBPUDgoeCk7IFBPUDgoX3h4KTsgeCs9IF94eDw8ODt9Ci0jZGVmaW5lIFBPUDI0KHgpICAJeyBpbnQgX3h4OyBQT1A4KHgpOyBQT1A4KF94eCk7IHggKz0gX3h4IDw8IDg7IFBPUDgoX3h4KTsgeCArPSBfeHggPDwgMTY7IH0KLSNkZWZpbmUgUE9QOCh4KSAgIAl7IFNFVF9TKEdFVF9TICsxKTsgeCA9ICBmZXRjaDgoR0VUX1MpO30KLSNkZWZpbmUgUFVTSDE2KHgpIAl7IGludCBfeHggPSB4O1BVU0g4KF94eCA+PiA4KTsgUFVTSDgoX3h4KTt9Ci0jZGVmaW5lIFBVU0g4KHgpICAJeyBzdG9yZTgoR0VUX1MsIHgpOyBTRVRfUyhHRVRfUy0xKTt9Ci0jZGVmaW5lIFNFVF9BKHgpICAJeyB0aGVfYSA9IHggJiBBTUFTSzsgfQotI2RlZmluZSBTRVRfQih4KSAgCXsgdGhlX2IgPSB4O30KLSNkZWZpbmUgU0VUX0NCSVQoeCkgIAl7IHRoZV9jYml0ID0geDt9Ci0jZGVmaW5lIFNFVF9DQklUX00oeCkgCXsgdGhlX2NiaXQgPSAoeCAmIChHRVRfTUJJVCA/IDB4MTAwOiAweDEwMDAwKSkgIT0gMDt9Ci0jZGVmaW5lIFNFVF9DQklUX1goeCkgCXsgdGhlX2NiaXQgPSAoeCAmIChHRVRfWEJJVCA/IDB4MTAwOiAweDEwMDAwKSkgIT0gMDt9Ci0jZGVmaW5lIFNFVF9EKHgpCXt0aGVfZCA9IHg7fQotI2RlZmluZSBTRVRfREJJVCh4KSAJeyB0aGVfZGJpdD0geDt9Ci0jZGVmaW5lIFNFVF9EQlJfTE9XKHgpIAl7dGhlX2RiciA9ICh4PDwxNik7fQotI2RlZmluZSBTRVRfRFBSKHgpIAl7IHRoZV9kcHIgPSB4O30KLSNkZWZpbmUgU0VUX0UoeCkgCXsgdGhlX2UgPSB4O30KLSNkZWZpbmUgU0VUX0lCSVQoeCkgCXsgdGhlX2liaXQgPSB4O30KLSNkZWZpbmUgU0VUX01CSVQoeCkgCXsgdGhlX21iaXQgPSB4OyB9Ci0jZGVmaW5lIFNFVF9OQklUKHgpICAgICB7IHRoZV9uYml0ID0geDt9Ci0jZGVmaW5lIFNFVF9OQklUXzE2KHgpICB7IHRoZV9uYml0PSAoICgoeCkgJiAoMHg4MDAwKSkgIT0gMCk7fQotI2RlZmluZSBTRVRfTkJJVF84KHgpICB7IHRoZV9uYml0PSAoICgoeCkgJiAoMHg4MCkpICE9IDApO30KLSNkZWZpbmUgU0VUX05CSVRfTSh4KSAgIHsgaWYgKEdFVF9NQklUKSB7IFNFVF9OQklUXzgoeCk7IH0gZWxzZSB7IFNFVF9OQklUXzE2KHgpO319Ci0jZGVmaW5lIFNFVF9OQklUX1goeCkgICB7IGlmIChHRVRfWEJJVCkgeyBTRVRfTkJJVF84KHgpOyB9IGVsc2UgeyBTRVRfTkJJVF8xNih4KTt9fQotI2RlZmluZSBTRVRfUEJSKHgpICAgICAgeyB0aGVfcGMgPSAodGhlX3BjICYgMHhmZmZmKSArICgoeCk8PDE2KTt9Ci0jZGVmaW5lIFNFVF9QQlJQQyh4KSAgICB7IHRoZV9wYyA9IHg7fQotI2RlZmluZSBTRVRfT05MWV9QQyh4KSAgeyB0aGVfcGMgPSAodGhlX3BjICYgMHhmZjAwMDApICsgKCh4ICkgJiAweGZmZmYpO30KLSNkZWZpbmUgU0VUX1MoeCkJe3RoZV9zID0geDsgfQotI2RlZmluZSBTRVRfVkJJVF8xNih4KSAge3RoZV92Yml0ID0gKCgoKGludCl4KSA8IC0weDgwMDApIHx8ICgoKGludCl4KSA+IDB4N2ZmZikpO30KLSNkZWZpbmUgU0VUX1ZCSVRfOCh4KSAgIHt0aGVfdmJpdCA9ICgoKChpbnQpeCkgPCAtMHg4MCkgfHwgKCgoaW50KXgpID4gMHg3ZikpO30KLS8qI2RlZmluZSBTRVRfVkJJVF9NKHgpICAgeyBpZihHRVRfTUJJVCkge1NFVF9WQklUXzgoeCk7fWVsc2Uge1NFVF9WQklUXzE2KHgpO319Ki8KLSNkZWZpbmUgU0VUX1pCSVRfMTYoeCkgIHsgdGhlX3piaXQgPSAoKHggJiAweGZmZmYpID09IDApO30KLSNkZWZpbmUgU0VUX1pCSVRfOCh4KSAgIHsgdGhlX3piaXQgPSAoKHggJiAweGZmKSA9PSAwKTt9Ci0jZGVmaW5lIFNFVF9aQklUX00oeCkgICB7IGlmKEdFVF9NQklUKSB7U0VUX1pCSVRfOCh4KTt9ZWxzZSB7U0VUX1pCSVRfMTYoeCk7fX0KLSNkZWZpbmUgU0VUX1pCSVRfWCh4KSAgIHsgaWYoR0VUX1hCSVQpIHtTRVRfWkJJVF84KHgpO31lbHNlIHtTRVRfWkJJVF8xNih4KTt9fQotI2RlZmluZSBTRVRfVkJJVCh4KSAgICAgeyB0aGVfdmJpdCA9IHg7IH0KLSNkZWZpbmUgU0VUX1pCSVQoeCkgICAgIHsgdGhlX3piaXQgPSB4OyB9Ci0jZGVmaW5lIFNFVF9YKHgpICAgICAgICB7IHRoZV94ID0gKHgpICYgKEdFVF9YQklUID8gMHhmZiA6IDB4ZmZmZik7fQotI2RlZmluZSBTRVRfWSh4KSAgICAgICAgeyB0aGVfeSA9ICh4KSAmIChHRVRfWEJJVCA/IDB4ZmYgOiAweGZmZmYpO30KLQotI2RlZmluZSBBTUFTSyAgICAgICAgICAgICggR0VUX01CSVQgPyAweGZmIDogMHhmZmZmKQotI2RlZmluZSBTTUFTSyAgICAgICAgICAgICAoIEdFVF9NQklUID8gMHg4MCA6IDB4ODAwMCkKLSNkZWZpbmUgU0VUX1ZCSVRfTShzMSxhY2MsZCkgKCB0aGVfdmJpdCA9ICgoczEgXiBhY2MpICYgKGFjYyBeIGQpICYgU01BU0sgKSE9MCkKLQotLyojZGVmaW5lIGZldGNoOCh4KSAobWVtb3J5W3gmTU1BU0tdKSovCi0jZGVmaW5lIGZldGNoMTYoeCkgKGZldGNoOCh4KSArIChmZXRjaDgoKHgpKzEpPDw4KSkKLSNkZWZpbmUgZmV0Y2gyNCh4KSAoZmV0Y2g4KHgpICsgKGZldGNoOCgoeCkrMSk8PDgpICsgKGZldGNoOCgoeCkrMik8PDE2KSkKLSNkZWZpbmUgZmV0Y2g4c2V4dCh4KSAoKGNoYXIpZmV0Y2g4KHgpKQotI2RlZmluZSBmZXRjaDE2c2V4dCh4KSAoKHNob3J0KWZldGNoMTYoeCkpCi0jZGVmaW5lIHN0b3JlOCh4LHkpIHttZW1vcnlbeCZNTUFTS109eTt9Ci0jZGVmaW5lIHN0b3JlMTYoeCx5KSB7IHN0b3JlOCh4LHkpOyBzdG9yZTgoeCsxLHk+PjgpO30KLSNkZWZpbmUgU0VYVE0oeCkgIChHRVRfTUJJVCA/ICgoY2hhcil4KTogKChzaG9ydCl4KSkKLQotCi0jZGVmaW5lIFNUQVJURlVOQygpIAlcCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTtcCi0gIGludCB0aGVfczsJCVwKLSAgaW50IHRoZV9iOwkJXAotICBpbnQgdGhlX3g7CQlcCi0gIGludCB0aGVfZDsJCVwKLSAgaW50IHRoZV95OwkJXAotICBpbnQgdGhlX2RicjsJCVwKLSAgaW50IHRoZV9wYzsJCVwKLSAgaW50IHRoZV9uYml0OwkJXAotICBpbnQgdGhlX3ZiaXQ7CQlcCi0gIGludCB0aGVfejsJCVwKLSAgaW50IHRoZV9tYml0OwkJXAotICBpbnQgdGhlX2liaXQ7CQlcCi0gIGludCB0aGVfeGJpdDsJCVwKLSAgaW50IHRoZV96Yml0OwkJXAotICBpbnQgdGhlX2NiaXQ7CQlcCi0gIGludCB0aGVfZGJpdDsJCVwKLSAgaW50IHRoZV9kcHI7CQlcCi0gIGludCB0aGVfZTsgICAgICAgICAgICBcCi0gIGludCB0aGVfYTsJCVwKLSAgaW50IHRpY2tfc3RhcnQgPSBnZXRfbm93ICgpO1wKLSAgaW50IGN5Y2xlcyA9IDA7CSAgICAgIFwKLSAgaW50IGluc3RzID0gMDsJICAgICAgXAotCQkJCSAgICBcCi0gIFNFVF9FIChzYXZlZF9zdGF0ZS5lKTsJICAgIFwKLSAgU0VUX1AgKHNhdmVkX3N0YXRlLnApOwkgICAgXAotICBTRVRfQSAoc2F2ZWRfc3RhdGUuYSk7CSAgICBcCi0gIFNFVF9YIChzYXZlZF9zdGF0ZS54KTsJICAgIFwKLSAgU0VUX1kgKHNhdmVkX3N0YXRlLnkpOwkgICAgXAotICBTRVRfT05MWV9QQyAoc2F2ZWRfc3RhdGUucGMpOwkgICAgXAotICBTRVRfUEJSIChzYXZlZF9zdGF0ZS5wYyA+PiAxNik7ICAgXAotICBTRVRfREJSX0xPVyAoc2F2ZWRfc3RhdGUuZGJyKTsgICAgXAotICBTRVRfRCAoc2F2ZWRfc3RhdGUuZCk7CSAgICBcCi0gIFNFVF9TIChzYXZlZF9zdGF0ZS5zKTsJICAgIFwKLSAgbWVtb3J5ID0gc2F2ZWRfc3RhdGUubWVtb3J5IDsgICAgIFwKLXsgaW50IGs7IGZvciAoayA9IDA7IGsgPCBORkFLRVM7IGsrKykgCSAgIFwKLSBzdG9yZTE2KDB4MTAgKyBrICogMiwgc2F2ZWRfc3RhdGUucltrXSk7IH1cCi0JCQkJICAgIFwKLSAgICB0b3A6CQkJICAgICAgXAotCi0KLQotI2RlZmluZSBFTkRGVU5DKCkgXAotIHJldGhpbms6ICAgICAgICAgIFwKLSAgc2F2ZWRfc3RhdGUudGlja3MgKz0gZ2V0X25vdyAoKSAtIHRpY2tfc3RhcnQ7XAotICBzYXZlZF9zdGF0ZS5jeWNsZXMgKz0gY3ljbGVzOyAgIFwKLSAgc2F2ZWRfc3RhdGUuaW5zdHMgKz0gaW5zdHM7ICAJICBcCi17IGludCBrOyBmb3IgKGsgPSAwOyBrIDwgTkZBS0VTOyBrKyspIAkgICBcCi1zYXZlZF9zdGF0ZS5yW2tdID0gZmV0Y2gxNigweDEwICsgayAqIDIpOyB9XAotCQkJICAgICAgIAkgIFwKLSAgc2F2ZWRfc3RhdGUuZSA9IEdFVF9FOwkgIFwKLSAgc2F2ZWRfc3RhdGUucCA9IEdFVF9QOwkgIFwKLSAgc2F2ZWRfc3RhdGUuYSA9IEdFVF9BOwkgIFwKLSAgc2F2ZWRfc3RhdGUueCA9IEdFVF9YOwkgIFwKLSAgc2F2ZWRfc3RhdGUueSA9IEdFVF9ZOwkgIFwKLSAgc2F2ZWRfc3RhdGUucGMgPSBHRVRfUEJSUEM7CSAgXAotICBzYXZlZF9zdGF0ZS5kYnIgPSBHRVRfREJSX0xPVzsgIFwKLSAgc2F2ZWRfc3RhdGUuZCA9IEdFVF9EOwkgIFwKLSAgc2F2ZWRfc3RhdGUucyA9IEdFVF9TOwkgIFwKLQkJCQkgIFwKLSAgcmV0dXJuIDA7CQkJICBcCi0KLQotZXh0ZXJuIHNhdmVkX3N0YXRlX3R5cGUgc2F2ZWRfc3RhdGU7Ci0KLSNkZWZpbmUgTU1BU0sgMHhmZmZmZgotI2RlZmluZSBOVU1TRUdTIDE2Ci0jZGVmaW5lIFJFVEhJTksgZ290byByZXRoaW5rOwpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9ydW4uYyBiL3NpbS93NjUvcnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTY2ZWUuLjAwMDAwMDAKLS0tIGEvc2ltL3c2NS9ydW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiBydW4gZnJvbnQgZW5kIHN1cHBvcnQgZm9yIFc2NQotICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBXNjUgU0lNCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogU3RldmUgQ2hhbWJlcmxhaW4KLSAgIHNhY0BjeWdudXMuY29tICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1BSSU5URgotZXh0ZXJuIGludCBwcmludGYgKCk7Ci0jZW5kaWYKLQotdm9pZCB1c2FnZSgpOwotZXh0ZXJuIGludCBvcHRpbmQ7Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgYmZkICphYmZkOwotICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0gIGFzZWN0aW9uICpzOwotICBpbnQgaTsKLSAgaW50IHZlcmJvc2UgPSAwOwotICBpbnQgdHJhY2UgPSAwOwotICBjaGFyICpuYW1lID0gIiI7Ci0KLSAgd2hpbGUgKChpID0gZ2V0b3B0IChhYywgYXYsICJ0diIpKSAhPSBFT0YpCi0gICAgc3dpdGNoIChpKQotICAgICAgewotICAgICAgY2FzZSAndCc6Ci0JdHJhY2UgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSAndic6Ci0JdmVyYm9zZSA9IDE7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXVzYWdlKCk7Ci0gICAgICB9Ci0gIGFjIC09IG9wdGluZDsKLSAgYXYgKz0gb3B0aW5kOwotCi0gIGlmIChhYyAhPSAxKSAKLSAgICB1c2FnZSgpOwotCi0gIG5hbWUgPSAqYXY7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgcHJpbnRmICgicnVuICVzXG4iLCBuYW1lKTsKLSAgICB9Ci0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsICJjb2ZmLXc2NSIpOwotICBpZiAoYWJmZCkKLSAgICB7Ci0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQl7Ci0KLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IG1hbGxvYyAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcykpOwotCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJcywKLQkJCQkJYnVmZmVyLAotCQkJCQkwLAotCQkJCQliZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKSk7Ci0JICAgICAgc2ltX3dyaXRlIChzLT52bWEsIGJ1ZmZlciwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcykpOwotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgIH0KLQotCSAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0JICBzaW1fc2V0X3BjIChzdGFydF9hZGRyZXNzKTsKLQkgIGlmICh0cmFjZSkKLQkgICAgewotCSAgICAgIGludCBkb25lID0gMDsKLQkgICAgICB3aGlsZSAoIWRvbmUpCi0JCXsKLQkJICBkb25lID0gc2ltX3RyYWNlICgpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNpbV9yZXN1bWUgKDAsIDApOwotCSAgICB9Ci0JICBpZiAodmVyYm9zZSkKLQkgICAgc2ltX2luZm8gKHByaW50ZiwgMCk7Ci0KLQkgIC8qIEZpbmQgb3V0IHdoYXQgd2FzIGluIHIwIGFuZCByZXR1cm4gdGhhdCAqLwotCSAgewotCSAgICB1bnNpZ25lZCBjaGFyIGJbNF07Ci0JICAgIHNpbV9mZXRjaF9yZWdpc3RlcigwLCBiLCA0KTsKLQkgICAgcmV0dXJuIGJbM107Ci0JICB9Ci0JICAKLQl9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi11c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiBydW4gWy10dl0gcHJvZ3JhbVxuIik7Ci0gIGV4aXQgKDEpOwotfQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9DaGFuZ2VMb2cgYi9zaW0vejhrL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0NjhhMS4uMDAwMDAwMAotLS0gYS9zaW0vejhrL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi1UdWUgTWF5IDIzIDIxOjM5OjIzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1UaHUgU2VwICAyIDE4OjE1OjUzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi0xOTk5LTA1LTA4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkKLVdlZCBOb3YgMjUgMTg6MjI6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzdXBwb3J0LmM6IEluY2x1ZGUgPGVycm5vLmg+Ci0KLVR1ZSBBcHIgMjggMTg6MzM6MzEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotU3VuIEFwciAyNiAxNTozMTo1NSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotU3VuIEFwciAyNiAxNToxODo0NSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSZXZlcnRlZCBjaGFuZ2Ugb2YgQXByIDI0OyB1c2Ugc2luY2x1ZGUgYWdhaW4uCi0KLUZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQkqIGNvbmZpZy5pbjogRGl0dG8uCi0KLUZyaSBBcHIgMjQgMTE6MTc6MjggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBzaW5jbHVkZS4KLQotU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotVHVlIEZlYiAxNyAxMjo1NDowNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGlmYWNlLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbiBsZW5ndGgKLSAJcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgotCi1TdW4gRmViICAxIDE2OjQ3OjUxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1TYXQgSmFuIDMxIDE4OjE1OjQxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1Nb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZmFjZS5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCi0gCXNpbV9sb2FkX2ZpbGUuCi0KLUZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVR1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLU1vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLUZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBTZXAgMTcgMTM6MjM6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHX0gpOiBVc2UgY29uZmlnLmggZnJvbSBsb2NhbCBkaXJlY3RvcnkuCi0KLU1vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1UdWUgQXVnIDI2IDEwOjQzOjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWZhY2UuYyAoc2ltX2tpbGwpOiBEZWxldGUuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KLQkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KLQkoc2ltX29wZW4sIHNpbV9sb2FkKTogQWRkIEZJWE1FIGFib3V0IG5lZWQgdG8gbW92ZSBhcmNoIHRlc3QgdG8KLSAJc2ltX29wZW4uCi0KLU1vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0JKiBjb25maWcuaW46IERpdHRvLgotCi1Nb24gQXVnIDI1IDE2OjM2OjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogaWZhY2UuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4gQ2hhbmdlIEFSR1YgdG8gUEFSR1YuCi0KLVR1ZSBNYXkgMjAgMTA6Mjg6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBpZmFjZS5jIChzaW1fc2V0X2NhbGxiYWNzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgotCShzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KLQotV2VkIEFwciAzMCAxMDoyODozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpZmFjZS5jIChzaW1fbG9hZCk6IFNldCBzaW1fejgwMDFfbW9kZSBpZiBiZmRfbWFjaF96ODAwMS4KLQkqIHRjb25maWcuaW4gKFNJTV9QUkVfTE9BRCk6IERlbGV0ZSwgbm8gbG9uZ2VyIHVzZWQuCi0KLVRodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCi1GcmkgQXByIDE4IDE0OjE4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbWVtLmggKFo4a19QQUdFX1NJWkUpOiBSZW5hbWUgZnJvbSBQQUdFX1NJWkUuICBJcyBpdCB1c2VkPwotCi0JKiBpZmFjZS5jIChzaW1fc3RvcCk6IE5ldyBmdW5jdGlvbi4KLQkoTlVMTCk6IERlZmluZSBpZiBub3QgYWxyZWFkeS4KLQotVGh1IEFwciAxNyAwMzo1NDoyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWxvYWQuby4KLQkqIGlmYWNlLmM6ICNpbmNsdWRlIGJmZC5oLgotCSh6OGtfY2FsbGJhY2spOiBOZXcgZ2xvYmFsLgotCShzaW1fa2luZCwgbXluYW1lKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuCi0JKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bwotCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgotCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KLQkoc2ltX3NldF9jYWxsYmFja3MpOiBTZXQgejhrX2NhbGxiYWNrLgotCi1UaHUgQXByIDE3IDExOjM2OjA0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdG0uaCAoc2ltX3RyYWNlKSA6IFJlbW92ZSBwcm90b3R5cGUgLSBub3cgaW4gcmVtb3RlLXNpbS5oCi0JKiBzdXBwb3J0LmMgKHNpbV90cmFjZSk6IFVwZGF0ZS4KLQotTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgotCSogY29uZmlnLmluOiBEaXR0by4KLQotV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpZmFjZS5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVdlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KLQotTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KLQotRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCi0KLVRodSBNYXIgMTMgMTM6MDI6MDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaWZhY2UuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93Ci0JaW4gYXJndiBmb3JtLgotCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KLQotVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCi0JQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQotCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgotCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgotCW1ha2VmaWxlIGZyYWdtZW50LgotCi1XZWQgTm92IDIwIDAyOjI4OjIxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgotCShTSU1fT0JKUyxTSU1fRVhUUkFfQ0ZMQUdTLFNJTV9FWFRSQV9DTEVBTik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGlmYWNlLmMgKHNpbV9zaXplKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fc3RvcF9yZWFzb24pOiBQcm9wZXJseSBzZXQgc2ltX2V4aXRlZCByZXR1cm4gY29kZS4KLQkqIHN1cHBvcnQuYzogI2luY2x1ZGUgImNhbGxiYWNrLmgiLgotCSogcnVuLmM6IERlbGV0ZWQsIHVzaW5nIG9uZSBpbiAuLi9jb21tb24gbm93LgotCSogdGNvbmZpZy5pbjogTmV3IGZpbGUuCi0KLVRodSBPY3QgIDMgMTY6MTk6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZy5sb2cgaGVyZS4KLQotV2VkIEp1biAyNiAxMjozMjoyOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0gICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLSAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIEZlYiAyMSAxMjoxNzoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotVGh1IEphbiAxMSAxNjo1OTowNyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlY29kZS5jIChpbmZvX2FyZ3MsIGNhc2UgQ0xBU1NfRElTUDgpOiBTaWduIGV4dGVuZCB1c2luZwotCXNoaWZ0cyBpbnN0ZWFkIG9mIGNoYXIgY2FzdC4KLQkoc2hpZnQpOiBMaWtld2lzZS4KLQotRnJpIEphbiAgNSAxNTozNjoyNiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIG1lbS5jIChnZXRfcGFnZV9hbmRfb2Zmc2V0KTogQWxsb2NhdGUgMTZNQiBub3QgOE1CLgotCi1GcmkgT2N0IDEzIDE1OjAyOjQ1IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGlmYWNlLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogTmV3LgotCi1UdWUgT2N0IDEwIDExOjEzOjU1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0KLVdlZCBTZXAgMjAgMTM6MzU6MzUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLUZyaSBTZXAgIDggMTM6MTY6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBEb24ndCB0cnkgdG8gdXNlCi0JYmZkL2hvc3RzLyouaCBmaWxlIG9yIGJmZC9jb25maWcvKi5taCBmaWxlLiAgQ2FsbCBBQ19QUk9HX0NDIGFuZAotCUFDX1BST0dfUkFOTElCLiAgU3Vic3RpdHV0ZSBpbiB2YWx1ZXMgZm9yIENGTEFHUywgSERFRklORVMsIEFSLAotCWFuZCBDQ19GT1JfQlVJTEQuICBDYWxsIEFDX0NIRUNLX0hFQURFUlMgZm9yIHZhcmlvdXMgaGVhZGVyIGZpbGVzLgotCVRvdWNoIHN0YW1wLmggaWYgY3JlYXRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBNYWtlZmlsZS5pbiAoQVIpOiBEZWZpbmUgYXMgQEFSQC4KLQkoQ0MpOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgYXMgQENDQC4KLQkoQ0ZMQUdTKTogRGVmaW5lIGFzIEBDRkxBR1NALgotCShDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgYXMgQENDX0ZPUl9CVUlMREAuCi0JKFJBTkxJQik6IERlZmluZSBhcyBAUkFOTElCQC4KLQkoSERFRklORVMsIFRERUZJTkVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKHN1cHBvcnQubywgY29tcGVkMS5vLCBjb21wZWQzLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoY29tcGVkYjMubywgY29tcGVkMi5vKTogTGlrZXdpc2UuCi0JKG1lbS5vKTogTmV3IHRhcmdldC4KLQkodGMtZ2VuMi5oKTogRGVwZW5kIHVwb24gd3JpdGVjb2RlLCBub3QgcXVpY2suYy4KLQkod3JpdGVjb2RlKTogQnVpbGQgdXNpbmcgJChDQ19GT1JfQlVJTEQpLgotCSh3cml0ZWNvZGUubywgbGlzdC5vLCBxdWljay5vKTogTmV3IHRhcmdldHMuCi0JKG1vc3RseWNsZWFuKTogTWFrZSB0aGUgc2FtZSBhcyBjbGVhbiwgbm90IGRpc3RjbGVhbi4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCShNYWtlZmlsZSk6IERvbid0IGRlcGVuZCB1cG9uIEBmcmFnc0AuICBKdXN0IHJlYnVpbGQgTWFrZWZpbGUgd2hlbgotCWludm9raW5nIGNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb21wZWQxLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQkoSU5MSU5FKTogRGVmaW5lIGFzIGlubGluZSwgbm90IHN0YXRpYyBpbmxpbmUuCi0JKiBjb21wZWQzLmMsIGNvbXBlZGIzLmMsIHJ1bi5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0JKiBtZW0uYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgSW5jbHVkZQotCTxzdGRsaWIuaD4gaWYgaXQgZXhpc3RzLgotCSogc3VwcG9ydC5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0JSW5jbHVkZSA8c3RkaW8uaD4uICBJbmNsdWRlIDx0aW1lLmg+IGFuZCA8c3lzL3RpbWVzLmg+IGlmIHRoZXkKLQlleGlzdHMuICBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kIDxzeXMvc3RhdC5oPi4KLQkoZ2V0X25vdyk6IE9ubHkgdXNlIHRpbWVzIGlmIDxzeXMvdGltZXMuaD4gZXhpc3RzOyBvdGhlcndpc2UgdXNlCi0JdGltZS4KLQkqIHdyaXRlY29kZS5jOiBJbmNsdWRlICJjb25maWcuaCIuICBJbmNsdWRlIDxzdGRpby5oPi4gIEluY2x1ZGUKLQk8c3RkbGliLmg+IGFuZCA8c3RyaW5nLmg+IGlmIHRoZXkgZXhpc3QuICBJbmNsdWRlIDxzdHJpbmdzLmg+IGlmCi0JaXQgZXhpc3RzIGFuZCA8c3RyaW5nLmg+IGRvZXMgbm90LgotCi1UaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgotCi1Nb24gSnVsIDMxIDEwOjE4OjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN1cHBvcnQuYyAobm9ybWFsX2ZsYWdzXzE2KTogQ2FsY3VsYXRlIGNhcnJ5IGNvcnJlY3RseS4KLQkoc3VwcG9ydF9jYWxsKTogUmV0dXJuIHZhbHVlcyBpbiBzdGQgcmVncyB0b28uCi0KLUZyaSBKdWwgMjggMTI6MTA6MDYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW5saW5lcy5oIChwdXRfYnl0ZV9tZW1fZGEpOiBNb3ZlZC4KLQkqIHJ1bi5jIChtYWluKTogUmV0dXJuIHByb2dyYW0gcmVzdWx0LgotCSogc3VwcG9ydC5jIChzdXBwb3J0X2NhbGwpOiBSZXR1cm4gZXhpdCBhcmd1bWVudC4KLQkqIHdyaXRlY29kZS5jIChyb3RhdGUpOiBGaXggYSBsb2FkIG9mIGJ1Z3MuCi0JKGluZm9fZGVjb2RlKTogSW5zZXJ0IG1pc3NpbmcgYnJlYWsgYWZ0ZXIgT1BDX3JyYy4KLQotV2VkIEp1bCAgNSAxNjoxMzo0MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLSAgCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogY29udmVydGVkIHRvIGF1dG9jb25mLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0Y29uZiAyLjQuCi0KLQkqIHo4ay5tdDogUmVtb3ZlZC4KLQotRnJpIEp1biAzMCAxNjo1MzowOSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGlmYWNlLmMgKHNpbV9kb19jb21tYW5kKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTWF5IDI0IDE2OjMxOjM4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotTW9uIE1hciAyNyAxMDozMjozNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHJ1bi5jOiBwYXJzZSBhcmd1bWVudHMgd2l0aCBnZXRvcHQoKS4KLQotVHVlIEZlYiAyOCAxNzozMTowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIC4uLy4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oIGlmIHNwZWNpZmljCi0JaG9zdCB1bmF2YWlsYWJsZS4KLQotU3VuIEZlYiAxMiAxNjowMzoyOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogaWZhY2UuYyAoc2ltX3N0b3BfcmVhc29uKTogKE1ha2UgYSBiYWQgc3lzY2FsbCBnaXZlIGEgU0lHSUxMLgotCSogd3JpdGVjb2RlLmMgKGFkaXYpOiAgRGl2aWRlcyBhcmUgYWx3YXlzIHNpZ25lZC4KLQotV2VkIERlYyAyOCAyMTozMDowOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBpbmxpbmVzLmg6IE1ha2UgSU5MSU5FUyBzdGF0aWMuCi0JKiBtZW0uYyAoc2l0b3B0cik6IE5ldyBpbnN0YW5jZS4KLQkqIHN1cHBvcnQuYyAobm9ybWFsX2ZsYWdzX1szMnwxNnw4XSk6IE5ldyBmdW5jdGlvbnMuCi0JKG9wdGltaXplX25vcm1hbF9mbGFncyk6IFVzZSBuZXcgZnVuY3Rpb25zLgotCSogd3JpdGVjb2RlLmMgKGluZm9fc3BlY2lhbCk6IEhhbmRsZSBzYmMuIChvcHRpbWl6ZV9ub3JtYWxfZmxhZ3MpOgotCUFsd2F5cyByZWNhbGMgZmxhZ3MuCi0KLVdlZCBNYXkgMTggMTQ6Mzg6NDkgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogc3VwcG9ydC5jIChzaW1fb3Blbik6IERlbGV0ZSBmcm9tIGhlcmUuCi0JKHNpbV9zZXRfYXJncyk6IERlbGV0ZSBmcm9tIGhlcmUuCi0JKHNpbV9raWxsKTogRGVsZXRlIGZyb20gaGVyZS4KLQkqIGlmYWNlLmMgKHNpbV8qKTogTWFrZSByZXN1bHQgdm9pZCB3aGVyZSB0aGVyZSBpc24ndCBvbmUuCi0JKHNpbV9jbGVhcl9icmVha3BvaW50cyk6IERlbGV0ZS4KLQkoc2ltX3NldF9wYyk6IERlbGV0ZS4KLQkoc2ltX2luZm8pOiBEZWxldGUgcHJpbnRmX2ZuIGFyZywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoc2ltX29wZW4pOiBEZWZpbmUgaGVyZS4KLQkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgotCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KLQkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJlbmFtZWQgZnJvbSBzaW1fc2V0X2FyZ3MuCi0JKHNpbV9raWxsKTogRGVmaW5lIGhlcmUuCi0JKiBydW4uYyAocHJpbnRmKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShtYWluKTogQ2FsbCBzaW1fY3JlYXRlX2luZmVyaW9yIGluc3RlYWQgb2Ygc2ltX3NldF9wYy4KLQkqIHNpbS5oIChzaW1fY2xlYXJfYnJlYWtwb2ludHMpOiBEZWxldGUuCi0KLVdlZCBNYXkgMTggMTM6MjI6MDIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogd3JpdGVjb2RlLmMgKG1haW4pOiBEaXNhYmxlIHRoZSBjaG9wcGluZyBvZiBsYXJnZSBpbml0aWFsaXplcnMuCi0JR0NDIGNhbiBub3cgY29wZS4KLQotU2F0IE1heSAgNyAxNzoyNDo0NiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiB3cml0ZWNvZGUuYyAoaW5mb19hcmdzKTogQWRkIHJlc2ZsZyBhbmQgc2V0ZmxnLgotCSogbGlzdC5jIDogUmVnZW5lcmF0ZWQuCi0JKiBNYWtlZmlsZS5pbjogRmlyc3QgcnVsZSBpcyBub3cgY2FsbGVkICdhbGwnCi0KLVNhdCBEZWMgMTEgMTY6Mzk6MzAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGlmYWNlLmMgKHNpbV9zdG9yZV9yZWdpc3Rlcik6IEdldCByZWd2YWwgdGhlIHJpZ2h0IHdheSB1cC4KLQkqIHdyaXRlY29kZS5jIChpbmZvX2FyZ3MpOiBBZGQgbGRhLgotCi1UdWUgT2N0IDI2IDEzOjAxOjQ2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNESVIpOiBGaXggZGVmaW5pdGlvbi4KLQkoQ1NFQVJDSCk6IEFkZCAtSSQoc3JjZGlyKS8uLi8uLi9nZGIKLQkoY29tcGVkMS5vLCBjb21wZWQzLm8sIGNvbXBlZGIzLm8sIGNvbXBlZDIubyk6IFVzZSBDU0VBUkNILCBub3QgSU5DRElSLgotCSogaWZhY2UuYzogUmVwbGFjZSAjaW5jbHVkZSAiLi4vaW5jbHVkZS93YWl0LmgiIHdpdGggInJlbW90ZS1zaW0uaCIuCi0JKHNpbV9zZXRfcGMpOiBpbnQgcmVzdWx0LCB1c2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGBhZGRyJy4KLQkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogaW50IHJlc3VsdCwgcGFzcyB2YWx1ZSBieSByZWZlcmVuY2UuCi0JKHNpbV9mZXRjaF9yZWdpc3Rlcik6IFVzZSB1bnNpZ25lZCBjaGFyICogZm9yIGFyZyBgYnVmJy4KLQkoc2ltX3dyaXRlKTogaW50IHJlc3VsdCwgdXNlIFNJTV9BRERSIGZvciBgd2hlcmUnIGFyZywKLQl1c2UgdW5zaWduZWQgY2hhciAqIGZvciBgd2hhdCcgYXJnLgotCShzaW1fcmVhZCk6IERpdHRvLgotCShzaW1fcmVzdW1lKTogaW50IHJlc3VsdC4KLQkoc2ltX3N0b3BfcmVhc29uKTogUmVuYW1lZCBmcm9tIHNpbV9zdG9wX3NpZ25hbCwgaW50IHJlc3VsdCwKLQluZXcgYXJnIGByZWFzb24nLgotCShzaW1faW5mbyk6IGludCByZXN1bHQsIG1lcmdlIHNpbV9pbmZvX3ByaW50IGludG8gaGVyZS4KLQkoc2ltX2luZm9fcHJpbnQpOiBEZWxldGVkLgotCSogcnVuLmM6ICNpbmNsdWRlIDxzdGRpby5oPgotCShtYWluKTogVXBkYXRlIGNhbGwgdG8gc2ltX2luZm8uCi0JKiBzaW0uaDogUmVtb3ZlIHZhcmlvdXMgcHJvdG90eXBlcyBkZWZpbmVkIGluIHJlbW90ZS1zaW0uaC4KLQotU2F0IE9jdCAyMyAxNToxNjo0NSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBpZmFjZS5jIChzaW1fc3RvcF9zaWduYWwpOiBSZXN1bHQgaXMgbm93IGVudW0gc2ltX3N0b3AuCi0KLVRodSBPY3QgIDcgMTk6MDE6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogd3JpdGVjb2RlLmMgKGRvc2V0LCBpbmZvX2RvY29kZSk6IFVuZGVyc3RhbmQgc2V0IGFuZCByZXMgaW5zbnMuCi0KLVRodSBTZXAgMzAgMTE6MzA6NDIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc3VwcG9ydC5jICh0bV9pbmZvX3ByaW50KTogIElmIG5vIHRpbWV0YWtlbiwgZG9uJ3QgZGl2aWRlIGJ5IHplcm8uCi0KLUZyaSBKdWwgMzAgMTU6NTE6NTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiB3cml0ZWNvZGUuYyAoZGl2KTogcmVuYW1lIHRvIGRpdmlkZSwgdG8gcmVzb2x2ZSBjb25mbGljdCB3aXRoCi0JQU5TSSBmdW5jdGlvbiBkaXYgZnJvbSA8c3RkbGliLmg+Ci0KLU1vbiBNYXIgMTUgMTU6NDg6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB6OGsubXQgKERPX0lOU1RBTEwpOiBSZW5hbWVkIGZyb20gSU5TVEFMTC4KLQotVHVlIE1hciAgOSAxMjozMjoyOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGVjb2RlLmMgKG1haW4pOiBNYWtlIHRoZSB2ZWN0b3IgJ2JpZycgc3RhdGljLCBzbyB0aGF0IGl0Ci0Jd2lsbCBjb21waWxlIG9uIHRoZSBhcG9sbG8uCi0JKiBzdXBwb3J0LmM6IFVzZSB0aGUgQU5TSSBjb21waWxhbnQgX19pbmxpbmVfXy4KLQotRnJpIE1hciAgNSAwNzo1NDoxOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGVjb2RlLmMgKG1haW4pOiBXaGVuIHVzaW5nIGdjYywgc3BsaXQgdGhlIHRhYmxlcyBpbnRvCi0Jc2VjdGlvbnMgc28gdGhhdCBpdCB3aWxsIGNvbXBpbGUuCi0JKiBNYWtlZmlsZS5pbjogR2V0IGFyIGFyZ3MgcmlnaHQuCi0JKiB0bS5oOiBGaXggZ2NjIHByb3RvdHlwZXMuCi0KLVdlZCBNYXIgIDMgMTU6MDQ6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogc3VwcG9ydC5jIChmYWlsKTogR2V0IHRoZSBhcmd1bWVudCBjb3VudCByaWdodC4KLQkqIHRtLmg6IExpbnQuCi0JKiB3cml0ZWNvZGUuYyAobWFpbik6IFBhc3MgYWxsIHRoZSBhcmd1bWVudHMgZW1pdCBuZWVkcy4KLQotVHVlIEZlYiAgMiAwNzo0OTo0MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGludCwgcHJvdG90eXBlcwotCi1GcmkgSmFuIDE1IDEyOjQzOjA4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBOZXcKLQotCmRpZmYgLS1naXQgYS9zaW0vejhrL01ha2VmaWxlLmluIGIvc2ltL3o4ay9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0MzJkNC4uMDAwMDAwMAotLS0gYS9zaW0vejhrL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgejhrIHNpbSBsaWJyYXJ5LgotIyAgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRwotCi1TSU1fT0JKUyA9IGlmYWNlLm8gbWVtLm8gc3VwcG9ydC5vIHF1aWNrLm8gXAotCWNvbXBlZDEubyBjb21wZWQyLm8gY29tcGVkMy5vIGNvbXBlZGIzLm8gc2ltLWxvYWQubwotIyBGSVhNRTogaGFjayB0byBmaW5kIHN5c2NhbGwuaC4gIEJldHRlciBzdXBwb3J0IGZvciBzeXNjYWxsLmggaXMKLSMgaW4gcHJvZ3Jlc3MuCi1TSU1fRVhUUkFfQ0ZMQUdTID0gLUkkKHNyY2RpcikvLi4vLi4vbmV3bGliL2xpYmMvc3lzL3o4awotU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4tZXh0cmEKLQotQ09ORklHX0ggPSBjb25maWcuaAotCi0jIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRwotCi1zdXBwb3J0Lm86c3VwcG9ydC5jIGlubGluZXMuaCAkKENPTkZJR19IKQotbWVtLm86IG1lbS5jIHRtLmggbWVtLmggc2ltLmggJChDT05GSUdfSCkKLQotY29tcGVkMS5vOmNvbXBlZDEuYyB0Yy1nZW4xLmggJChDT05GSUdfSCkKLWNvbXBlZDMubzpjb21wZWQzLmMgdGMtZ2VuMy5oICQoQ09ORklHX0gpCi1jb21wZWRiMy5vOmNvbXBlZGIzLmMgdGMtZ2VuYjMuaCAkKENPTkZJR19IKQotY29tcGVkMi5vOmNvbXBlZDIuYyB0Yy1nZW4yLmggJChDT05GSUdfSCkKLQotdGMtZ2VuMS5oOndyaXRlY29kZQotCS4vd3JpdGVjb2RlICAtMSA+dGMtZ2VuMS5oCi0KLXRjLWdlbjIuaDp3cml0ZWNvZGUKLQkuL3dyaXRlY29kZSAgLTIgPnRjLWdlbjIuaAotCi10Yy1nZW4zLmg6d3JpdGVjb2RlCi0JLi93cml0ZWNvZGUgIC0zID50Yy1nZW4zLmgKLQotdGMtZ2VuYjMuaDp3cml0ZWNvZGUKLQkuL3dyaXRlY29kZSAgLWIzID50Yy1nZW5iMy5oCi0KLXdyaXRlY29kZTogd3JpdGVjb2RlLm8gbGlzdC5vIGJxdWljay5vCi0JJChDQ19GT1JfQlVJTEQpIC1vIHdyaXRlY29kZSB3cml0ZWNvZGUubyBsaXN0Lm8gYnF1aWNrLm8KLQotd3JpdGVjb2RlLm86IHdyaXRlY29kZS5jICQoQ09ORklHX0gpCi0JJChDQ19GT1JfQlVJTEQpIC1jICQoQ0ZMQUdTKSAkKEhERUZJTkVTKSAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAkKHNyY2Rpcikvd3JpdGVjb2RlLmMKLQotbGlzdC5vOiBsaXN0LmMKLQkkKENDX0ZPUl9CVUlMRCkgLWMgJChDRkxBR1MpICQoSERFRklORVMpICQoQ1NFQVJDSCkgJChDU1dJVENIRVMpICQoc3JjZGlyKS9saXN0LmMKLQotIyBUd28gY29waWVzIG9mIHF1aWNrLm8gYXJlIGNyZWF0ZWQuICBPbmUgZm9yICRidWlsZCBhbmQgb25lIGZvciAkaG9zdC4KLWJxdWljay5vOiBxdWljay5jCi0JJChDQ19GT1JfQlVJTEQpIC1jICQoQ0ZMQUdTKSAkKEhERUZJTkVTKSAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAkKHNyY2RpcikvcXVpY2suYyAtbyBicXVpY2subwotCi1jbGVhbi1leHRyYToKLQlybSAtZiB0Yy1nZW4xLmggdGMtZ2VuMi5oIHRjLWdlbjMuaCB0Yy1nZW5iMy5oIHdyaXRlY29kZSAKZGlmZiAtLWdpdCBhL3NpbS96OGsvYWNjb25maWcuaCBiL3NpbS96OGsvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliODdhMS4uMDAwMDAwMAotLS0gYS9zaW0vejhrL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS96OGsvY29tcGVkMS5jIGIvc2ltL3o4ay9jb21wZWQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTY1MTMuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay9jb21wZWQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBpbnN0cnVjdGlvbiBpbnRlcnByZXRlciBtb2R1bGUgMQotICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotWjhLWklNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAidG0uaCIKLSNpbmNsdWRlICJzaW0uaCIKLQotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSU5MSU5FIGlubGluZQotI2luY2x1ZGUgImlubGluZXMuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidGMtZ2VuMS5oIgotCmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbXBlZDIuYyBiL3NpbS96OGsvY29tcGVkMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDAxMmQxLi4wMDAwMDAwCi0tLSBhL3NpbS96OGsvY29tcGVkMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogaW5zdHJ1Y3Rpb24gaW50ZXJwcmV0ZXIgbW9kdWxlIDIKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInRtLmgiCi0jaW5jbHVkZSAic2ltLmgiCi0jaW5jbHVkZSAidGMtZ2VuMi5oIgotCi0KZGlmZiAtLWdpdCBhL3NpbS96OGsvY29tcGVkMy5jIGIvc2ltL3o4ay9jb21wZWQzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjY5NjkuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay9jb21wZWQzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBpbnN0cnVjdGlvbiBpbnRlcnByZXRlciBtb2R1bGUgMgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KLQotWjhLU0lNIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotWjhLU0lNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJ0bS5oIgotI2luY2x1ZGUgInNpbS5oIgotCi0jaW5jbHVkZSAiaW5saW5lcy5oIgotI2luY2x1ZGUgInRjLWdlbjMuaCIKLQotCmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbXBlZGIzLmMgYi9zaW0vejhrL2NvbXBlZGIzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTQxZGIuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay9jb21wZWRiMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogaW5zdHJ1Y3Rpb24gaW50ZXJwcmV0ZXIgbW9kdWxlIDMKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLVo4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVo4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgdXNob3J0X3R5cGUgdW5zaWduZWQgc2hvcnQKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAidG0uaCIKLSNpbmNsdWRlICJzaW0uaCIKLSNpbmNsdWRlICJpbmxpbmVzLmgiCi0KLSNpbmNsdWRlICJ0Yy1nZW5iMy5oIgotCi0KZGlmZiAtLWdpdCBhL3NpbS96OGsvY29uZmlnLmluIGIvc2ltL3o4ay9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDc3MjQuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSN1bmRlZiBSRVRTSUdUWVBFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX1NFVEZQVUNXCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR0FDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbmZpZ3VyZSBiL3NpbS96OGsvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjFlZGY4Li4wMDAwMDAwCi0tLSBhL3NpbS96OGsvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDAyNCArMCwwIEBACi0jISAvYmluL3NoCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLQotCi0KLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotCi0KLQotCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjcxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzU5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLSMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzI1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotZWxzZQotICBDQ19GT1JfQlVJTEQ9Z2NjCi1maQotCi0KLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMzOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTI6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDA3OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTE2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgotIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KLSMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCi1mb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDI2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmQoKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAotICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9saWIgMQotRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQotYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbG5zbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZ2V0aG9zdGJ5bmFtZSgpOwotCi1pbnQgbWFpbigpIHsKLWdldGhvc3RieW5hbWUoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCi0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2xpYiAxCi1FT0YKLQotICBMSUJTPSItbG5zbCAkTElCUyIKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi1VU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OwotICBubykJTUFJTlQ9IiMiIDs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQotZmkKLWVsc2UKLSAgTUFJTlQ9IiMiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7Ci0gIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7Ci0gICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Ci1lc2FjCi1pZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV9ic3dhcD0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7Ci0gIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7Ci0gIG5vKQkgc2ltX2NmbGFncz0iIjs7Ci0gICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2NmbGFncz0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7Ci0gIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKLSAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCi0gIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX2RlYnVnPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7Ci0gIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OwotICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3N0ZGlvPSIiCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7Ci0gIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OwotICBbLTAtOV0qKQotCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fdHJhY2U9IiIKLQlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KLQkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KLQkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKLQkgIGVsc2UKLQkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCi0JICBmaQotCWRvbmUKLQlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKLWVzYWMKLWlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgotICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKLWZpCi1lbHNlCi0gIHNpbV90cmFjZT0iIgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7Ci0gIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OwotICBbLTAtOV0qKQotCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7Ci0gIFthLXpdKikKLQlzaW1fcHJvZmlsZT0iIgotCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbwotCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCi0JICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCi0JICBlbHNlCi0JICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgotCSAgZmkKLQlkb25lCi0Jc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OwotZXNhYwotaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KLSAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQotZmkKLWVsc2UKLSAgc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIgotZmkKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKLSNlbHNlCi12b2lkICgqc2lnbmFsICgpKSAoKTsKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWludCBpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpZ25hbD12b2lkCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2lnbmFsPWludAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLUVPRgotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotc2ltX2xpbmtfZmlsZXM9Ci1zaW1fbGlua19saW5rcz0KLQotc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCi1pZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCi10aGVuCi0gIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KLWVsc2UKLSAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KLWZpCi0KLSMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OwotZXNhYwotc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCi1zaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKLQotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCBzeXMvdGltZXMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTExOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZwotcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZwotcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZwotcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCi1zJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCi1zJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKLXMlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCi1zJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCi1zJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKLXMlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKLXMlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZwotcyVAc2ltX2h3QCUkc2ltX2h3JWcKLXMlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKLXMlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCi1zJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKLXMlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZwotcyVAc2ltX3NtcEAlJHNpbV9zbXAlZwotcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCi1zJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKLXMlQFdBUk5fQ0ZMQUdTQCUkV0FSTl9DRkxBR1MlZwotcyVAV0VSUk9SX0NGTEFHU0AlJFdFUlJPUl9DRkxBR1MlZwotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKLXMlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKLXMlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCi1zJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZwotcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKLXMlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1hY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCi1hY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXNyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCi13aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCi0gIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgotICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKLQotICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKLQotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgJGFjX2Rlc3QKLQotICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRzcmNkaXIiIGluCi0gIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICBlc2FjCi0KLSAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKLSAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWRvbmUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotY2FzZSAieCRDT05GSUdfRklMRVMiIGluCi0geE1ha2VmaWxlKikKLSAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKLSAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKLSAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAotICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKLSAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKLQktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCi0JPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKLSAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAotICAgOzsKLSBlc2FjCi0gY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYwotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQotCmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbmZpZ3VyZS5pbiBiL3NpbS96OGsvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTZmYzdkLi4wMDAwMDAwCi0tLSBhL3NpbS96OGsvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1zaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKLUFDX1BSRVJFUSgyLjUpZG5sCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1TSU1fQUNfQ09NTU9OCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCBzeXMvdGltZXMuaCkKLQotU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL3o4ay9pZmFjZS5jIGIvc2ltL3o4ay9pZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjM4ODNlLi4wMDAwMDAwCi0tLSBhL3NpbS96OGsvaWZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKiBnZGItPnNpbXVsYXRvciBpbnRlcmZhY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQotCi1aOEtTSU0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1aOEtTSU0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzaW0uaCIKLSNpbmNsdWRlICJ0bS5oIgotI2luY2x1ZGUgInNpZ25hbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAicmVtb3RlLXNpbS5oIgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotaG9zdF9jYWxsYmFjayAqejhrX2NhbGxiYWNrOwotCi1zdGF0aWMgU0lNX09QRU5fS0lORCBzaW1fa2luZDsKLXN0YXRpYyBjaGFyICpteW5hbWU7Ci0KLXZvaWQKLXNpbV9zaXplIChuKQotICAgICBpbnQgbjsKLXsKLSAgLyogU2l6ZSBpcyBmaXhlZC4gICovCi19Ci0KLWludAotc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcmVnbm8sIHZhbHVlLCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcmVnbm87Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotewotICAvKiBGSVhNRTogUmV2aWV3IHRoZSBjb21wdXRhdGlvbiBvZiByZWd2YWwuICAqLwotICBpbnQgcmVndmFsID0gKHZhbHVlWzBdIDw8IDI0KSB8ICh2YWx1ZVsxXSA8PCAxNikgfCAodmFsdWVbMl0gPDwgOCkgfCB2YWx1ZVszXTsKLQotICB0bV9zdG9yZV9yZWdpc3RlciAocmVnbm8sIHJlZ3ZhbCk7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1zaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCByZWdubywgYnVmLCBsZW5ndGgpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBpbnQgcmVnbm87Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgdG1fZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotc2ltX3dyaXRlIChzZCwgd2hlcmUsIHdoYXQsIGhvd211Y2gpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBTSU1fQUREUiB3aGVyZTsKLSAgICAgdW5zaWduZWQgY2hhciAqd2hhdDsKLSAgICAgaW50IGhvd211Y2g7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBob3dtdWNoOyBpKyspCi0gICAgdG1fd3JpdGVfYnl0ZSAod2hlcmUgKyBpLCB3aGF0W2ldKTsKLSAgcmV0dXJuIGhvd211Y2g7Ci19Ci0KLWludAotc2ltX3JlYWQgKHNkLCB3aGVyZSwgd2hhdCwgaG93bXVjaCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIFNJTV9BRERSIHdoZXJlOwotICAgICB1bnNpZ25lZCBjaGFyICp3aGF0OwotICAgICBpbnQgaG93bXVjaDsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGhvd211Y2g7IGkrKykKLSAgICB3aGF0W2ldID0gdG1fcmVhZF9ieXRlICh3aGVyZSArIGkpOwotICByZXR1cm4gaG93bXVjaDsKLX0KLQotc3RhdGljIHZvaWQgCi1jb250cm9sX2MgKHNpZywgY29kZSwgc2NwLCBhZGRyKQotICAgICBpbnQgc2lnOwotICAgICBpbnQgY29kZTsKLSAgICAgY2hhciAqc2NwOwotICAgICBjaGFyICphZGRyOwotewotICB0bV9leGNlcHRpb24gKFNJTV9JTlRFUlJVUFQpOwotfQotCi1pbnQKLXNpbV9zdG9wIChzZCkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci17Ci0gIHRtX2V4Y2VwdGlvbiAoU0lNX0lOVEVSUlVQVCk7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnKQotICAgICBTSU1fREVTQyBzZDsKLSAgICAgaW50IHN0ZXA7Ci0gICAgIGludCBzaWc7Ci17Ci0gIHZvaWQgKCpwcmV2KSAoKTsKLQotICBwcmV2ID0gc2lnbmFsIChTSUdJTlQsIGNvbnRyb2xfYyk7Ci0gIHRtX3Jlc3VtZSAoc3RlcCk7Ci0gIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKLX0KLQotdm9pZAotc2ltX3N0b3BfcmVhc29uIChzZCwgcmVhc29uLCBzaWdyYykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKLSAgICAgaW50ICpzaWdyYzsKLXsKLSAgc3dpdGNoICh0bV9zaWduYWwgKCkpCi0gICAgewotICAgIGNhc2UgU0lNX0RJVl9aRVJPOgotICAgICAgKnNpZ3JjID0gU0lHRlBFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU1fSU5URVJSVVBUOgotICAgICAgKnNpZ3JjID0gU0lHSU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU1fQkFEX0lOU1Q6Ci0gICAgICAqc2lncmMgPSBTSUdJTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJTV9CUkVBS1BPSU5UOgotICAgICAgKnNpZ3JjID0gU0lHVFJBUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0lNX1NJTkdMRV9TVEVQOgotICAgICAgKnNpZ3JjID0gU0lHVFJBUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0lNX0JBRF9TWVNDQUxMOgotICAgICAgKnNpZ3JjID0gU0lHSUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU1fQkFEX0FMSUdOOgotICAgICAgKnNpZ3JjID0gU0lHU0VHVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0lNX0RPTkU6Ci0gICAgICB7Ci0Jc2ltX3N0YXRlX3R5cGUgeDsKLQl0bV9zdGF0ZSAoJngpOwotCSpzaWdyYyA9IHgucmVnc1syXS53b3JkICYgMjU1OwotCSpyZWFzb24gPSBzaW1fZXhpdGVkOwotCXJldHVybjsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Ci19Ci0KLXZvaWQKLXNpbV9pbmZvIChzZCwgdmVyYm9zZSkKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCB2ZXJib3NlOwotewotICBzaW1fc3RhdGVfdHlwZSB4OwotCi0gIHRtX3N0YXRlICgmeCk7Ci0gIHRtX2luZm9fcHJpbnQgKCZ4KTsKLX0KLQotU0lNX0RFU0MKLXNpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKLSAgICAgU0lNX09QRU5fS0lORCBraW5kOwotICAgICBob3N0X2NhbGxiYWNrICpjYjsKLSAgICAgc3RydWN0IF9iZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICAvKiBGSVhNRTogVGhlIGNvZGUgaW4gc2ltX2xvYWQgdGhhdCBkZXRlcm1pbmVzIHRoZSBleGFjdCB6OGsgYXJjaAotICAgICBzaG91bGQgYmUgbW92ZWQgdG8gaGVyZSAqLwotCi0gIHNpbV9raW5kID0ga2luZDsKLSAgbXluYW1lID0gYXJndlswXTsKLSAgejhrX2NhbGxiYWNrID0gY2I7Ci0KLSAgLyogZnVkZ2Ugb3VyIGRlc2NyaXB0b3IgZm9yIG5vdyAqLwotICByZXR1cm4gKFNJTV9ERVNDKSAxOwotfQotCi12b2lkCi1zaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKLSAgICAgU0lNX0RFU0Mgc2Q7Ci0gICAgIGludCBxdWl0dGluZzsKLXsKLSAgLyogbm90aGluZyB0byBkbyAqLwotfQotCi1TSU1fUkMKLXNpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpwcm9nOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCi0gIGJmZCAqcHJvZ19iZmQ7Ci0KLSAgLyogRklYTUU6IFRoZSBjb2RlIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIHo5ayBwcm9jZXNzb3Igc2hvdWxkIGJlCi0gICAgIG1vdmVkIGZyb20gaGVyZSB0byBzaW1fb3Blbi4gKi8KLQotICBwcm9nX2JmZCA9IHNpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIHo4a19jYWxsYmFjaywgcHJvZywgYWJmZCwKLQkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKLQkJCSAgICAwLCBzaW1fd3JpdGUpOwotICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7Ci0gIGlmIChiZmRfZ2V0X21hY2ggKHByb2dfYmZkKSA9PSBiZmRfbWFjaF96ODAwMSkKLSAgICB7Ci0gICAgICBleHRlcm4gaW50IHNpbV96ODAwMV9tb2RlOwotICAgICAgc2ltX3o4MDAxX21vZGUgPSAxOwotICAgIH0KLSAgLyogQ2xvc2UgdGhlIGJmZCBpZiB3ZSBvcGVuZWQgaXQuICAqLwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9jbG9zZSAocHJvZ19iZmQpOwotICByZXR1cm4gU0lNX1JDX09LOwotfQotCi1TSU1fUkMKLXNpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKLSAgICAgY2hhciAqKmFyZ3Y7Ci0gICAgIGNoYXIgKiplbnY7Ci17Ci0gIGlmIChhYmZkICE9IE5VTEwpCi0gICAgdG1fc3RvcmVfcmVnaXN0ZXIgKFJFR19QQywgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7Ci0gIGVsc2UKLSAgICB0bV9zdG9yZV9yZWdpc3RlciAoUkVHX1BDLCAwKTsKLSAgcmV0dXJuIFNJTV9SQ19PSzsKLX0KLQotdm9pZAotc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCi0gICAgIFNJTV9ERVNDIHNkOwotICAgICBjaGFyICpjbWQ7Ci17Ci19Ci0KLXZvaWQKLXNpbV9zZXRfY2FsbGJhY2tzIChwdHIpCi0gICAgIGhvc3RfY2FsbGJhY2sgKnB0cjsKLXsKLSAgejhrX2NhbGxiYWNrID0gcHRyOwotfQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9pbmxpbmVzLmggYi9zaW0vejhrL2lubGluZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmMjA5ZS4uMDAwMDAwMAotLS0gYS9zaW0vejhrL2lubGluZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKiBpbmxpbmUgZnVuY3Rpb25zIGZvciBaOEtTSU0KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSU5MSU5FCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZGVmaW5lIFVHVCAweDBiCi0jZGVmaW5lIFVMRSAweDAzCi0jZGVmaW5lIFVMVCAweDA3Ci0jZGVmaW5lIFVHRSAweDBmCi0jZGVmaW5lIFNMT1cgMAotI2RlZmluZSBUIDB4OAotI2RlZmluZSBGIDB4MAotI2RlZmluZSBMVCAweDEKLSNkZWZpbmUgR1QgMHhhCi0jZGVmaW5lIExFIDB4MgotI2RlZmluZSBFUSAweDYKLSNkZWZpbmUgTkUgMHhlCi0jZGVmaW5lIEdFIDB4OQotCi0gc3RhdGljIGludCBpc19jb25kX3RydWUgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGMpKTsgCi0gc3RhdGljIHZvaWQgbWFrZWZsYWdzIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBtYXNrKSk7IAotCi1zdGF0aWMgSU5MSU5FCi1sb25nCi1zaXRvcHRyIChzaSkKLWxvbmcgc2k7Ci17Ci0gIHJldHVybiAoKHNpICYgMHhmZjAwMDAwMCkgPj4gOCkgfCAoc2kgJiAweGZmZmYpOwotfQotc3RhdGljIElOTElORSBsb25nCi1wdHJ0b3NpIChwdHIpCi1sb25nIHB0cjsKLXsKLSAgcmV0dXJuICgocHRyICYgMHhmZjAwMDApIDw8IDgpIHwgKHB0ciAmIDB4ZmZmZik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfbG9uZ19yZWcgKGNvbnRleHQsIHJlZywgdmFsKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29udGV4dC0+cmVnc1tyZWddLndvcmQgPSB2YWwgPj4gMTY7Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICsgMV0ud29yZCA9IHZhbDsKLX0KLQotc3RhdGljIElOTElORQotdm9pZCAKLXB1dF9xdWFkX3JlZyAoY29udGV4dCwgcmVnLCB2YWwxLCB2YWwyKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHZhbDE7Ci0gICAgIGludCB2YWwyOwotewotICBjb250ZXh0LT5yZWdzW3JlZ10ud29yZCA9IHZhbDIgPj4gMTY7Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICsgMV0ud29yZCA9IHZhbDI7Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICsgMl0ud29yZCA9IHZhbDEgPj4gMTY7Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICsgM10ud29yZCA9IHZhbDE7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZywgdmFsKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29udGV4dC0+cmVnc1tyZWddLndvcmQgPSB2YWw7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLVNJdHlwZSBnZXRfbG9uZ19yZWcgKGNvbnRleHQsIHJlZykKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci17Ci0gIFVTSXR5cGUgbHN3ID0gY29udGV4dC0+cmVnc1tyZWcgKyAxXS53b3JkOwotICBVU0l0eXBlIG1zdyA9IGNvbnRleHQtPnJlZ3NbcmVnXS53b3JkOwotCi0gIHJldHVybiAobXN3IDw8IDE2KSB8IGxzdzsKLX0KLQotI2lmZGVmIF9fR05VQ19fCi1zdGF0aWMgSU5MSU5FCi1zdHJ1Y3QgVURJc3RydWN0Ci1nZXRfcXVhZF9yZWcgKGNvbnRleHQsIHJlZykKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci17Ci0gIFVESXR5cGUgcmVzOwotICBVU0l0eXBlIGxzdyA9IGdldF9sb25nX3JlZyAoY29udGV4dCwgcmVnICsgMik7Ci0gIFVTSXR5cGUgbXN3ID0gZ2V0X2xvbmdfcmVnIChjb250ZXh0LCByZWcpOwotCi0gIHJlcy5sb3cgPSBsc3c7Ci0gIHJlcy5oaWdoID0gbXN3OwotICByZXR1cm4gcmVzOwotfQotCi0jZW5kaWYKLQotc3RhdGljIElOTElORSB2b2lkCi1wdXRfYnl0ZV9tZW1fZGEgKGNvbnRleHQsIGFkZHIsIHZhbHVlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGFkZHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgKCh1bnNpZ25lZCBjaGFyICopIChjb250ZXh0LT5tZW1vcnkpKVthZGRyXSA9IHZhbHVlOwotfQotCi1zdGF0aWMgSU5MSU5FCi12b2lkIAotcHV0X2J5dGVfcmVnIChjb250ZXh0LCByZWcsIHZhbCkKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB2YWw7Ci17Ci0gIGludCBvbGQgPSBjb250ZXh0LT5yZWdzW3JlZyAmIDB4N10ud29yZDsKLSAgaWYgKHJlZyAmIDB4OCkKLSAgICB7Ci0gICAgICBvbGQgPSBvbGQgJiAweGZmMDAgfCAodmFsICYgMHhmZik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2xkID0gb2xkICYgMHgwMGZmIHwgKHZhbCA8PCA4KTsKLSAgICB9Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICYgMHg3XS53b3JkID0gb2xkOyAgICAgIAotfQotCi1zdGF0aWMgSU5MSU5FCi1pbnQgCi1nZXRfYnl0ZV9yZWcgKGNvbnRleHQsIHJlZykKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci17Ci0gIGlmIChyZWcgJiAweDgpCi0gICAgcmV0dXJuICBjb250ZXh0LT5yZWdzW3JlZyAmIDB4N10ud29yZCAmIDB4ZmY7Ci0gIGVsc2UKLSAgICByZXR1cm4gIChjb250ZXh0LT5yZWdzW3JlZyAmIDB4N10ud29yZCA+PiA4KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIGFkZHIsIHZhbHVlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGFkZHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgaWYgKGFkZHIgJiAxKQotICAgIHsKLSAgICAgIGNvbnRleHQtPmV4Y2VwdGlvbiA9IFNJTV9CQURfQUxJR047Ci0gICAgICBhZGRyICY9IH4xOwotICAgIH0KLSAgcHV0X2J5dGVfbWVtX2RhKGNvbnRleHQsIGFkZHIsIHZhbHVlPj44KTsKLSAgcHV0X2J5dGVfbWVtX2RhKGNvbnRleHQsIGFkZHIrMSwgdmFsdWUpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGNoYXIKLWdldF9ieXRlX21lbV9kYSAoY29udGV4dCwgYWRkcikKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCBhZGRyOwotewotICByZXR1cm4gKCh1bnNpZ25lZCBjaGFyICopIChjb250ZXh0LT5tZW1vcnkpKVthZGRyXTsKLX0KLQotCi0jaWYgMAotI2RlZmluZSBnZXRfd29yZF9tZW1fZGEoY29udGV4dCxhZGRyKVwKLSAqKCh1bnNpZ25lZCBzaG9ydCopKChjaGFyKikoKGNvbnRleHQpLT5tZW1vcnkpKyhhZGRyKSkpCi0KLSNlbHNlCi0jZGVmaW5lIGdldF93b3JkX21lbV9kYShjb250ZXh0LGFkZHIpIChnZXRfYnl0ZV9tZW1fZGEoY29udGV4dCwgYWRkcikgPDwgOCkgfCAoZ2V0X2J5dGVfbWVtX2RhKGNvbnRleHQsYWRkcisxKSkKLSNlbmRpZgotCi0jZGVmaW5lIGdldF93b3JkX3JlZyhjb250ZXh0LHJlZykgKGNvbnRleHQpLT5yZWdzW3JlZ10ud29yZAotCi1zdGF0aWMgSU5MSU5FCi1TSXR5cGUKLWdldF9sb25nX21lbV9kYSAoY29udGV4dCwgYWRkcikKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCBhZGRyOwotewotICBVU0l0eXBlIGxzdyA9IGdldF93b3JkX21lbV9kYShjb250ZXh0LGFkZHIrMik7Ci0gIFVTSXR5cGUgbXN3ID0gIGdldF93b3JkX21lbV9kYShjb250ZXh0LCBhZGRyKTsKLQotICByZXR1cm4gKG1zdyA8PCAxNikgKyBsc3c7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGFkZHIsIHZhbHVlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGFkZHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgcHV0X3dvcmRfbWVtX2RhKGNvbnRleHQsYWRkciwgdmFsdWU+PjE2KTsKLSAgcHV0X3dvcmRfbWVtX2RhKGNvbnRleHQsYWRkcisyLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLWludCAKLWdldF93b3JkX21lbV9pciAoY29udGV4dCwgcmVnKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHJlZzsKLXsKLSAgcmV0dXJuIGdldF93b3JkX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpKTsKLX0KLQotc3RhdGljIElOTElORQotdm9pZCAKLXB1dF93b3JkX21lbV9pciAoY29udGV4dCwgcmVnLCB2YWx1ZSkKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB2YWx1ZTsKLXsKLQotICBwdXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSwgdmFsdWUpOwotfQotCi1zdGF0aWMgSU5MSU5FCi1pbnQgCi1nZXRfYnl0ZV9tZW1faXIgKGNvbnRleHQsIHJlZykKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci17Ci0gIHJldHVybiBnZXRfYnl0ZV9tZW1fZGEgKGNvbnRleHQsIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfYnl0ZV9tZW1faXIgKGNvbnRleHQsIHJlZywgdmFsdWUpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgcmVnOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHB1dF9ieXRlX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLWludCAKLWdldF9sb25nX21lbV9pciAoY29udGV4dCwgcmVnKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHJlZzsKLXsKLSAgcmV0dXJuIGdldF9sb25nX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpKTsKLX0KLQotc3RhdGljIElOTElORQotdm9pZCAKLXB1dF9sb25nX21lbV9pciAoY29udGV4dCwgcmVnLCB2YWx1ZSkKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB2YWx1ZTsKLXsKLQotICBwdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSwgdmFsdWUpOwotfQotCi1zdGF0aWMgSU5MSU5FCi12b2lkIAotcHV0X2xvbmdfbWVtX3ggKGNvbnRleHQsIGJhc2UsIHJlZywgdmFsdWUpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgYmFzZTsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHZhbHVlOwotewotICBwdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSArIGJhc2UsIHZhbHVlKTsKLX0KLQotc3RhdGljIElOTElORQotdm9pZCAKLXB1dF93b3JkX21lbV94IChjb250ZXh0LCBiYXNlLCByZWcsIHZhbHVlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGJhc2U7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgcHV0X3dvcmRfbWVtX2RhIChjb250ZXh0LCBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykgKyBiYXNlLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfYnl0ZV9tZW1feCAoY29udGV4dCwgYmFzZSwgcmVnLCB2YWx1ZSkKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCBiYXNlOwotICAgICBpbnQgcmVnOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHB1dF9ieXRlX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpICsgYmFzZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgSU5MSU5FCi1pbnQgCi1nZXRfd29yZF9tZW1feCAoY29udGV4dCwgYmFzZSwgcmVnKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGJhc2U7Ci0gICAgIGludCByZWc7Ci17Ci0gIHJldHVybiBnZXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIGJhc2UgKyBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykpOwotfQotCi1zdGF0aWMgSU5MSU5FCi1pbnQgCi1nZXRfYnl0ZV9tZW1feCAoY29udGV4dCwgYmFzZSwgcmVnKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGJhc2U7Ci0gICAgIGludCByZWc7Ci17Ci0gIHJldHVybiBnZXRfYnl0ZV9tZW1fZGEgKGNvbnRleHQsIGJhc2UgKyBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykpOwotfQotCi1zdGF0aWMgSU5MSU5FCi1pbnQgCi1nZXRfbG9uZ19tZW1feCAoY29udGV4dCwgYmFzZSwgcmVnKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGJhc2U7Ci0gICAgIGludCByZWc7Ci17Ci0gIHJldHVybiBnZXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGJhc2UgKyBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykpOwotfQotCi0KLXN0YXRpYwotdm9pZAotbWFrZWZsYWdzIChjb250ZXh0LCBtYXNrKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IG1hc2s7Ci17Ci0KLSAgUFNXX1pFUk8gPSAoY29udGV4dC0+ZHN0ICYgbWFzaykgPT0gMDsKLSAgUFNXX1NJR04gPSAoY29udGV4dC0+ZHN0ID4+IChjb250ZXh0LT5zaXplIC0gMSkpOwotCi0gIGlmIChjb250ZXh0LT5icm9rZW5fZmxhZ3MgPT0gVFNUX0ZMQUdTKQotICAgIHsKLSAgICAgIGV4dGVybiBjaGFyIHRoZV9wYXJpdHlbXTsKLQotICAgICAgaWYgKGNvbnRleHQtPnNpemUgPT0gOCkKLQl7Ci0JICBQU1dfT1ZFUkZMT1cgPSB0aGVfcGFyaXR5W2NvbnRleHQtPmRzdCAmIDB4ZmZdOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBPdmVyZmxvdyBpcyBzZXQgaWYgYm90aCBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIHNpZ24gYW5kIHRoZQotICAgICAgICAgcmVzdWx0IGlzIG9mIGRpZmZlcmVudCBzaWduLgotCi0gICAgICAgICBWID0gIEE9PUIgJiYgUiE9QiAganVtcGluZyBsb2dpYwotICAgICAgICAgKH4oQV5CKSkmKFJeQikKLSAgICAgICAgIFYgPSAgKEFeQileKFJeQikgICBib29sZWFuCi0gICAgICAgICAqLwotCi0gICAgICBQU1dfT1ZFUkZMT1cgPQotCSgoCi0JICAgKH4oY29udGV4dC0+c3JjYSBeIGNvbnRleHQtPnNyY2IpCi0JICAgICYgKGNvbnRleHQtPnNyY2EgXiBjb250ZXh0LT5kc3QpKQotCSApID4+IChjb250ZXh0LT5zaXplIC0gMSkKLQkpOwotCi0gICAgICBpZiAoY29udGV4dC0+c2l6ZSA8IDMyKQotCXsKLQkgIFBTV19DQVJSWSA9ICgoY29udGV4dC0+ZHN0ID4+IGNvbnRleHQtPnNpemUpKSAmIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIGNhcnJ5IGlzIHNldCB3aGVuIHRoZSByZXN1bHQgaXMgc21hbGxlciB0aGFuIGEgc291cmNlICovCi0KLQotCSAgUFNXX0NBUlJZID0gICh1bnNpZ25lZCkgY29udGV4dC0+ZHN0ID4gKHVuc2lnbmVkKSBjb250ZXh0LT5zcmNhIDsKLQotCX0KLSAgICB9Ci0gIGNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7Ci19Ci0KLQotLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNhbGN1bGF0ZSB0aGUgZmxhZ3MuICBXZSBjYW4KLSAgIGVpdGhlciBhbHdheXMgY2FsY3VsYXRlIHRoZW0gYW5kIHNvIHRoZSBjYyB3aWxsIGFsd2F5cwotICAgYmUgY29ycmVjdCwgb3Igd2UgY2FuIG9ubHkga2VlcCB0aGUgYXJndW1lbnRzIGFyb3VuZCBhbmQKLSAgIGNhbGMgdGhlIGZsYWdzIHdoZW4gdGhleSdyZSBhY3R1YWxseSBnb2luZyB0byBiZSB1c2VkLiAqLwotCi0vKiBSaWdodCBub3cgd2UgYWx3YXlzIGNhbGMgdGhlIGZsYWdzIC0gSSB0aGluayBpdCBtYXkgYmUgZmFzdGVyKi8KLQotCi0jZGVmaW5lIE5PUk1BTF9GTEFHUyhjLHMsZCxzYSxzYixzdWIpIAlcCi0gICAgaWYgKHMgPT0gOCkgICAgICAgICAgICAgICAgXAotICAgICAgbm9ybWFsX2ZsYWdzXzgoYyxkLHNhLHNiLHN1Yik7IFwKLSAgICBlbHNlIGlmIChzID09IDE2KSAgICAgICAgICAgICAgICBcCi0gICAgICBub3JtYWxfZmxhZ3NfMTYoYyxkLHNhLHNiLHN1Yik7IFwKLSAgICBlbHNlIGlmIChzID09IDMyKSAgICAgICAgICAgICAgICBcCi0gICAgICBub3JtYWxfZmxhZ3NfMzIoYyxkLHNhLHNiLHN1Yik7IAotCi1zdGF0aWMgSU5MSU5FCi12b2lkIAotbm9ybWFsX2ZsYWdzIChjb250ZXh0LCBzaXplLCBkc3QsIHNyY2EsIHNyY2IpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGRzdDsKLSAgICAgaW50IHNyY2E7Ci0gICAgIGludCBzcmNiOwotewotICBjb250ZXh0LT5zcmNhID0gc3JjYTsKLSAgY29udGV4dC0+c3JjYiA9IHNyY2I7Ci0gIGNvbnRleHQtPmRzdCA9IGRzdDsKLSAgY29udGV4dC0+c2l6ZSA9IHNpemU7Ci0gIGNvbnRleHQtPmJyb2tlbl9mbGFncyA9IENNUF9GTEFHUzsKLX0KLQotc3RhdGljIElOTElORQotdm9pZCAKLVRFU1RfTk9STUFMX0ZMQUdTIChjb250ZXh0LCBzaXplLCBkc3QpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGRzdDsKLXsKLSAgY29udGV4dC0+ZHN0ID0gZHN0OwotICBjb250ZXh0LT5zaXplID0gc2l6ZTsKLSAgY29udGV4dC0+YnJva2VuX2ZsYWdzID0gVFNUX0ZMQUdTOwotfQotCi1zdGF0aWMgSU5MSU5FCi12b2lkIAotcHV0X3B0cl9sb25nX3JlZyAoY29udGV4dCwgcmVnLCB2YWwpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgcmVnOwotICAgICBpbnQgdmFsOwotewotICBjb250ZXh0LT5yZWdzW3JlZ10ud29yZCA9ICh2YWwgPj4gOCkgJiAweDdmMDA7Ci0gIGNvbnRleHQtPnJlZ3NbcmVnICsgMV0ud29yZCA9IHZhbDsKLX0KLQotc3RhdGljIElOTElORQotbG9uZyAKLWdldF9wdHJfbG9uZ19yZWcgKGNvbnRleHQsIHJlZykKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCByZWc7Ci17Ci0gIGludCB2YWw7Ci0KLSAgdmFsID0gKGNvbnRleHQtPnJlZ3NbcmVnXS53b3JkIDw8IDgpIHwgY29udGV4dC0+cmVnc1tyZWcgKyAxXS53b3JkOwotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgSU5MSU5FCi1sb25nIAotZ2V0X3B0cl9sb25nX21lbV9pciAoY29udGV4dCwgcmVnKQotc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci1pbnQgcmVnOwotewotICByZXR1cm4gc2l0b3B0ciAoZ2V0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBnZXRfcHRyX2xvbmdfcmVnIChjb250ZXh0LCByZWcpKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLWxvbmcgCi1nZXRfcHRyX2xvbmdfbWVtX2RhIChjb250ZXh0LCBhZGRyKQotc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci1sb25nIGFkZHI7IAotewotICByZXR1cm4gc2l0b3B0ciAoZ2V0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBhZGRyKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUKLXZvaWQgCi1wdXRfcHRyX2xvbmdfbWVtX2RhIChjb250ZXh0LCBhZGRyLCBwdHIpCi1zaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLWxvbmcgYWRkcjsgCi1sb25nIHB0cjsKLXsKLSAgcHV0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBhZGRyLCBwdHJ0b3NpIChwdHIpKTsKLQotfQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9saXN0LmMgYi9zaW0vejhrL2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkZTc2MC4uMDAwMDAwMAotLS0gYS9zaW0vejhrL2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDExMjY2ICswLDAgQEAKLXNob3J0IGludCB6OGtfaW52X2xpc3RbXSA9IHsKLQotMTAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLAotNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi03LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi03LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi03LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi03LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi01Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAotMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKLTIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCi0yLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKLTIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCi0yLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKLTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCi0yLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKLTIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCi0yCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKLTIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCi0yLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotMzcwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q3MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LAotMzY1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4OTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q5NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLAotMjYwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTA4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCi0yNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCi0yNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCi0yNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCi0yNTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAotMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAotMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAotMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAotMjU3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKLTI1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAotMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAotMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAotMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAotMjUyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKLTI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKLTI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKLTI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKLTI1MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTQ3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCi0yNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTUzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsMjUsCi0yMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKLTIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTYwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKLTIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKLTIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTcyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKLTIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAotMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCi0yMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTc5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsMjAsCi0xNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKLTE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTg1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKLTE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTkyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKLTE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTk4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi0xNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKLTE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAotMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCi00MTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKLTQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKLTQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKLTQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKLTQxMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjE3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCi00MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCi00MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCi00MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCi00MTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAotNDEwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCwKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjM2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCi00MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCi00MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCi00MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCi00MDcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAotNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAotNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAotNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAotNDA3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKLTczCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3Myw3MywKLTcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAotNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAotNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAotNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAotNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCi03MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKLTY1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSw2NSwKLTYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAotNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAotNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyOTQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAotNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLTYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAotNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCi02Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzIwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyNjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCi01MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAotNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKLTUwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi01OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAotNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKLTUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCi01MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAotNTAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCi01MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAotNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKLTUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCi01MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzUyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKLTUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCi01MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAotNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKLTEyNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM2NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAotMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAotMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAotMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAotMTI3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNzEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKLTEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKLTEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKLTEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKLTEyNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCi0xMjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKLTEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKLTEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKLTEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKLTEyOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCi0xMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCi0xMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCi0xMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCi0xMjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwMzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAotODYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LDg2LAotODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCi04Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxNjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCi04Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyMjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCi04Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCi04Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKLTgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCi0tMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKLS0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCi0tMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKLS0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCi0tMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKLS0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCi0tMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKLS0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAotMzc1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCi0zNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCi0zNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCi0zNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCi0zNzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAotMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAotMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAotMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAotMzcyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLTM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAotLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCi0tMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAotLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCi0tMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAotLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCi0tMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLS0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAotLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCi0tMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKLTIxMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTEyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAotMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAotMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAotMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAotMjA3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKLTIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKLTIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKLTIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKLTIwNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTMxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0yMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTM3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKLS0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAotLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQ0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKLS0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAotLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTUwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKLS0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAotLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTU2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0tMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKLS0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAotLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCi0xNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTYzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCi0xMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKLTEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTY5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKLTEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTc2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKLTEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTgyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0xMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKLTEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAotMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTg4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKLS0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAotLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTk1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKLS0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAotLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjAxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKLS0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAotLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjA4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0tMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKLS0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAotLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCi0yNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYxNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKLTIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKLTIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKLTIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKLTIzOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjI3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCi0yMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCi0yMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCi0yMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCi0yMzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYzMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAotMjM2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjQ2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCi0yMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCi0yMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCi0yMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCi0yMzMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY1MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAotMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAotMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAotMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAotMjMzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKLTExNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjY1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY3MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAotMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAotMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAotMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAotMTEyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2Nzg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKLTExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKLTExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKLTExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKLTExMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Njg0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCi0xMTAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY5MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2OTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKLTEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKLTEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKLTEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKLTEwNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NzA0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCi0xMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCi0xMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCi0xMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCi0xMDcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDcxMDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDcxNjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDcyMzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDcyOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDczNjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDc0MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q3NDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKLTIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKLTIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKLTIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKLTIwMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NzU1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCi0yMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCi0yMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCi0yMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCi0yMDIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDc2MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDc2ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q3NzQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKLTE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKLTE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKLTE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKLTE1MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NzgwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCi0xNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCi0xNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCi0xNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCi0xNTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDc4NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDc5MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDgwMDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDgwNjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDgxMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDgxOTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4MjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKLTE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKLTE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKLTE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKLTE4MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0ODMyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCi0xODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCi0xODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCi0xODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCi0xODIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDgzODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAotMTY3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4NDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0ODUxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCi0xNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCi0xNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCi0xNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCi0xNjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDg1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAotMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAotMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAotMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAotMTY0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4NjQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKLTI5NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0ODcwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDg3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAotMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAotMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAotMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAotMjkzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q4ODMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKLTI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKLTI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKLTI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKLTI5MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0ODg5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCi0yOTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDg5NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q5MDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKLTI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKLTI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKLTI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKLTI4OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTA4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCi0yODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCi0yODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCi0yODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCi0yODgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDkxNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAotMzM2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q5MjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCi0zMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCi0zMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCi0zMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCi0zMzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDkzNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAotMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAotMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAotMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAotMzMyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q5NDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKLTMzMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTQ3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDk1MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAotMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAotMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAotMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAotMzI3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q5NjAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKLTMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKLTMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKLTMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKLTMyNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTY2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCi0zNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTcyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsMzYsCi0zMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLTMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTc5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLTMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTg1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLTMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTkyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLTMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0zMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0OTk4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsCi0yNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKLTI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAotMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCi0yNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTAwNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAotMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCi0yNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKLTI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAotMjcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEwMTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKLTI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAotMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCi0yNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKLTI3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDE3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCi0yNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKLTI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAotMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTAyNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDMwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCi0xNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCi0xNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCi0xNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCi0xNDMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEwMzY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKLTE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKLTE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKLTE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKLTE0MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTA0MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEwNDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTA1NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAotMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAotMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAotMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAotMTM5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDYyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCi0xMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCi0xMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCi0xMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCi0xMzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEwNjg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLTEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDc1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEwODE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKLTEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKLTEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKLTEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKLTEwMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTA4ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAotMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAotMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAotMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAotMTAyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMDk0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0xMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTEwMDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCi05OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKLTk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAotOTgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExMDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi05OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKLTk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAotOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCi05OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKLTk4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMTEzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCi05OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKLTk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAotOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCi05OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTEyMDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAotOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCi05OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKLTk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExMjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTEzMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAotMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAotMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAotMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAotMTIzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMTM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCi0xMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCi0xMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCi0xMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCi0xMjMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExNDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLTEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMTUyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExNTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKLTExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKLTExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKLTExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKLTExOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTE2NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAotMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAotMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAotMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAotMTE5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMTcxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0xMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTE3NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMTg0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCi0xNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCi0xNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCi0xNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCi0xNzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDExOTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKLTE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKLTE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKLTE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKLTE3NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTE5NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyMDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTIwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAotMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAotMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAotMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAotMTU3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCi0xNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCi0xNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCi0xNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCi0xNTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyMjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKLTIyNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTIyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjM1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCi0xODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCi0xODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCi0xODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCi0xODcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyNDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKLTE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKLTE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKLTE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKLTE4NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTI0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAotMjI0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjU0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyNjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKLTE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKLTE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKLTE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKLTE2OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTI2NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAotMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAotMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAotMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAotMTY5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjczNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0xNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCi0yMjUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyODAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTI4NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAotMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAotMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAotMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAotMTg5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMjkyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCi0xODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCi0xODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCi0xODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCi0xODkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEyOTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKLTIyMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTMwNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMzEyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCi0xNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCi0xNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCi0xNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCi0xNjIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzMTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKLTE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKLTE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKLTE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKLTE2MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTMyNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAotMTc1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMzMxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzMzc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKLTE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKLTE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKLTE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKLTE3MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTM0NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAotMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAotMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAotMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAotMTczCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMzUwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0xNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCi0yMjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzNTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTM2MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAotMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAotMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAotMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAotMjEyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMzY5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCi0yMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCi0yMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCi0yMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCi0yMTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzNzYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKLTM3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxMzgyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDEzODg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKLTMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKLTMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKLTMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKLTMxMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTM5NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAotMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAotMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAotMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAotMzEwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDAxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0zMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCi0yMjcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE0MDgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTQxNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAotMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAotMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAotMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAotMjA1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDIwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCi0yMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCi0yMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCi0yMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCi0yMDUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE0MjcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKLTMxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTQzMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDQwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCi0zMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCi0zMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCi0zMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCi0zMTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE0NDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKLTMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKLTMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKLTMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKLTMxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTQ1MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE0NTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTQ2NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDcyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE0Nzg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDg0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsMTM4LDMzOCwyNjUsMzUxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKLTE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCi0xNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDkxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKLTE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCi0xNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNDk3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKLTE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCi0xNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTA0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKLTE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCi0xNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE1MTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwzMzksMjYzLDM1MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTE2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAotLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAotLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAotLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE1MjMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCi0tMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCi0tMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCi0tMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTUyOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTM2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE1NDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKLTEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKLTEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKLTEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKLTEzNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTU0ODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAotMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAotMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAotMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAotMTM3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTU1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0xMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTU2MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLDEzNiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTU2ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAotMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAotMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAotMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAotMTM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTc0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCi0xMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCi0xMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCi0xMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCi0xMzUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE1ODA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLTEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNTg3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE1OTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKLTI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKLTI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKLTI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKLTI2NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTYwMDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAotMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAotMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAotMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAotMjY0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNjA2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0yNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTYxMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNjE5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCi0yNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCi0yNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCi0yNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCi0yNjIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE2MjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKLTI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKLTI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKLTI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKLTI2MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTYzMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAotOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTYzODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAotOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCi05LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY0NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCi05LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY1MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCi05LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKLTksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCi05LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAotMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY2NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAotNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi00LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY3MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi00LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi00LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTY4MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKLTQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi00LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotMzY4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNjg5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE2OTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKLTM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKLTM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKLTM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKLTM2OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTcwMjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAotMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAotMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAotMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAotMzY5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNzA4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCi0zNjMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE3MTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTcyMTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAotMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAotMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAotMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAotMzY0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNzI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCi0zNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCi0zNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCi0zNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCi0zNjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE3MzQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKLTI1OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTc0MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNzQ3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCi0yNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCi0yNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCi0yNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCi0yNTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE3NTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKLTI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKLTI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKLTI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKLTI1OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTc2MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAotMjUzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNzY2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE3NzI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKLTI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKLTI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKLTI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKLTI1NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTc3OTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAotMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAotMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAotMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAotMjU0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxNzg1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCi0yMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTc5MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLAotMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCi0yNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKLTI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAotMjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE3OTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKLTI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAotMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCi0yNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKLTI0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxODA0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCi0yNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKLTI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAotMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCi0yNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTgxMTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAotMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCi0yNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKLTI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAotMTgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE4MTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwxOCwKLTE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAotMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCi0xOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKLTE5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxODI0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCi0xOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKLTE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAotMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCi0xOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTgzMDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAotMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCi0xOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKLTE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAotMTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE4MzY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKLTE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAotMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCi0xOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKLTQxMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTg0MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxODQ5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCi00MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCi00MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCi00MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCi00MTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE4NTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKLTQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKLTQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKLTQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKLTQxNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTg2MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAotNDA4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxODY4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE4NzUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKLTQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKLTQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKLTQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKLTQwOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTg4MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAotNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAotNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAotNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAotNDA5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxODg4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi00MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCi03MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTg5NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLDcxLAotNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCi03Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKLTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAotNzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5MDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKLTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAotNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCi03Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKLTcyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxOTA3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCi03Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKLTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAotNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCi03MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTkxMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAotNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCi03Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKLTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAotNjMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5MjAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2Myw2MywKLTY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAotNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCi02NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKLTY0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxOTI2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCi02NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKLTY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAotNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCi02NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTkzMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAotNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCi02NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKLTY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAotNjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5MzkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKLTY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAotNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCi02NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKLTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxOTQ1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjksMjQ4LC0xLDM4NCwxODAsNDA0LC0xLDQ3LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5NTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTk1ODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxOTY0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5NzEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02MSwyNDQsLTEsMzgwLDE2MCw0MDAsLTEsNDMsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTk3NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QxOTg0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDE5OTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MTk5NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwMDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDA5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjAxNjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwMjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDI4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjAzNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwNDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTg0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDQ4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsODQsCi04NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKLTg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAotODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCi04NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjA1NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAotODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCi04NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKLTg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAotODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwNjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi04NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKLTg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAotODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCi04NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKLTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDY3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCi04NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKLTg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAotODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjA3MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDgwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCi0yODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCi0yODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCi0yODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCi0yODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIwODY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKLTI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKLTI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKLTI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKLTI4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjA5MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAotMzczCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMDk5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIxMDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKLTM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKLTM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKLTM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKLTM3NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjExMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAotMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAotMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAotMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAotMzc0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTE4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0zNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjEyNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTMxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCi0yODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCi0yODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCi0yODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCi0yODAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIxMzc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKLTI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKLTI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKLTI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKLTI4MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjE0NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAotMjA4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTUwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIxNTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKLTIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKLTIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKLTIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKLTIwOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjE2MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAotMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAotMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAotMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAotMjA5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTY5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0yMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjE3NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMTgyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCi0yNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCi0yNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCi0yNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCi0yNzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIxODg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKLTI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKLTI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKLTI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKLTI3NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjE5NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAotMTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyMDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywKLTE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAotMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCi0xNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKLTE0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMjA4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCi0xNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKLTE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAotMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCi0xNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjIxNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAotMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCi0xNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKLTE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAotMTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyMjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKLTE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAotMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCi0xNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMjI3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyMzM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKLTI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKLTI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKLTI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKLTI3MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjI0MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAotMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAotMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAotMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAotMjczCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMjQ2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCi0yMzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyNTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjI1OTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAotMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAotMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAotMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAotMjQwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMjY1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCi0yNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCi0yNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCi0yNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCi0yNDAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyNzIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKLTIzNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjI3ODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMjg0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCi0yMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCi0yMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCi0yMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCi0yMzUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIyOTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKLTIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKLTIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKLTIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKLTIzNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjI5NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAotMTEzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzA0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIzMTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKLTExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKLTExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKLTExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKLTExNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjMxNjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAotMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAotMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAotMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAotMTE0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzIzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCi0xMDgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIzMjk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjMzNjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAotMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAotMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAotMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAotMTA5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzQyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCi0xMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCi0xMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCi0xMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCi0xMDkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIzNDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLTEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzU1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjE5LC0xLC0xLC0xLC0xLC0xLC0xLDM4OCwyMTYsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjM2MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIzNjgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzc0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMDQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDIzODA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjM4NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAotMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAotMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAotMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAotMjAzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyMzkzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCi0yMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCi0yMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCi0yMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCi0yMDMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0MDAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKLTE1MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQwNjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNDEyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCi0xNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCi0xNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCi0xNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCi0xNTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0MTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKLTE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKLTE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKLTE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKLTE1NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQyNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAotMzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0MzIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi00MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTQwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNDM4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi00MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi00MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQ0NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi00MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNDAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0NTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi00MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTE4MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQ1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNDY0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCi0xODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCi0xODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCi0xODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCi0xODQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0NzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKLTE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKLTE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKLTE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKLTE4NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQ3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAotMTY1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNDgzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI0ODk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKLTE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKLTE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKLTE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKLTE2NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjQ5NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAotMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAotMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAotMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAotMTY2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTAyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0xNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCi0yOTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI1MDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjUxNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAotMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAotMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAotMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAotMjk0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTIxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCi0yOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCi0yOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCi0yOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCi0yOTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI1MjgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKLTI5MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjUzNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTQwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCi0yODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCi0yODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCi0yODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCi0yODkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI1NDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKLTI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKLTI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKLTI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKLTI4OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjU1MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAotMzM0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTYwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI1NjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKLTMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKLTMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKLTMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKLTMzMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjU3MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAotMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAotMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAotMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAotMzMzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTc5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCi0zMjkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI1ODU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjU5MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAotMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAotMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAotMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAotMzI4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNTk4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCi0zMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCi0zMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCi0zMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCi0zMjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI2MDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKLTM0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjExMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsMzQsCi0zMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKLTMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAotMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCi0zMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjYxNzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAotMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCi0zMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKLTMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAotMzMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI2MjQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKLTMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAotMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCi0zMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKLTMzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjMwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCi0zMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKLTMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAotMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCi0yOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjYzNjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LDI5LAotMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCi0yOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKLTI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAotMjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI2NDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKLTI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAotMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCi0yOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKLTI4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjQ5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCi0yOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKLTI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAotMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCi0yOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjY1NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAotMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCi0yOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKLTI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAotMTQ1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjYyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI2Njg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKLTE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKLTE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKLTE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKLTE0NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjY3NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAotMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAotMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAotMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAotMTQ0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNjgxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCi0xNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI2ODgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjY5NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAotMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAotMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAotMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAotMTQwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzAwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCi0xNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCi0xNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCi0xNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCi0xNDAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI3MDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKLTEwNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjcxMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzIwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCi0xMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCi0xMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCi0xMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCi0xMDMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI3MjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKLTEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKLTEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKLTEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKLTEwMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjczMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAotMTAwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsCi05OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKLTk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAotOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCi05OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjc0NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAotOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCi05OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKLTk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAotOTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI3NTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi05OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKLTk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAotOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCi05OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKLTk5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCi05OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKLTk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAotOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCi0xMjQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI3NjQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjc3MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAotMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAotMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAotMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAotMTI1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCi0xMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCi0xMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCi0xMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCi0xMjUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI3ODQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKLTEyMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjc5MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyNzk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCi0xMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCi0xMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCi0xMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCi0xMjEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI4MDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKLTEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKLTEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKLTEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKLTEyMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjgwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAotMTgxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI4MjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKLTE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKLTE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKLTE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKLTE3OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjgyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAotMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAotMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAotMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAotMTc5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODM1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCi0xNjEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI4NDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjg0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAotMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAotMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAotMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAotMTU5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODU0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCi0xNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCi0xNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCi0xNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCi0xNTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI4NjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLTE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODY3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI4NzM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKLTE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKLTE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKLTE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKLTE4OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjg4MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAotMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAotMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAotMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAotMTg4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODg2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0xODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjg5MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyODk5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCi0xNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCi0xNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCi0xNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCi0xNzAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5MDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKLTE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKLTE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKLTE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKLTE3MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjkxMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5MTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MjkyNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAotMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAotMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAotMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAotMTkwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyOTMxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCi0xOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCi0xOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCi0xOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCi0xOTAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5Mzc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLTE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyOTQ0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5NTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKLTE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKLTE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKLTE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKLTE2MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjk1NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAotMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAotMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAotMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAotMTYzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyOTYzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0xNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjk2OTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QyOTc2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCi0xNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCi0xNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCi0xNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCi0xNzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5ODI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKLTE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKLTE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKLTE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKLTE3NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mjk4ODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDI5OTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzAwMTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAotMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAotMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAotMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAotMjEzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDA4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCi0yMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCi0yMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCi0yMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCi0yMTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMwMTQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKLTE3MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzAyMDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDI3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCi0xNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCi0xNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCi0xNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCi0xNzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMwMzM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKLTE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKLTE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKLTE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKLTE3MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzA0MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMwNDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzA1MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAotMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAotMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAotMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAotMjA2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDU5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCi0yMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCi0yMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCi0yMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCi0yMDYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMwNjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKLTMxMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzA3MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDc4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCi0zMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCi0zMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCi0zMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCi0zMTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMwODQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKLTMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKLTMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKLTMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKLTMxMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzA5MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAotMjIxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMDk3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMxMDQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTIyMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzExMDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjIyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMTE2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0yMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xMzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMxMjMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMTI5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzEzNjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMxNDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTE1MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzE0ODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMiwyMzEsMjI5LC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMTU1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMxNjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzE2ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKLTEwNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzE3NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwNiwxMDYsMTA2LDExOCwxMTgsMTE4LDExOCwxMDYsMTA2LDEwNiwxMDYsMTE4LDExOCwxMTgsMTE4LAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMxODA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMTg3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzE5MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMTkyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMjAwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyMDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKLTE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKLTE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKLTE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKLTE5MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzIxMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAotMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAotMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAotMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAotMTkyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMjE5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0xOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCi0zMTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyMjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzIzMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAotMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAotMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAotMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAotMzEzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMjM4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCi0zMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCi0zMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCi0zMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCi0zMTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyNDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKLTMyMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzI1MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMjU3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCi0zMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCi0zMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCi0zMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCi0zMjAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyNjQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKLTMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKLTMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKLTMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKLTMyMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzI3MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAotMTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyNzY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAotMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMjgzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAotMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCi0xMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzI4OTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAotMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAotMTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMyOTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAotMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCi0xMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKLTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzMDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzMDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzMTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzMjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi02LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLTM3MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzMyODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzM0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCi0zNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCi0zNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCi0zNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCi0zNzEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzNDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKLTM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKLTM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKLTM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKLTM3MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzM0NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAotMzY2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzUzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzNjAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKLTM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKLTM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKLTM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKLTM2NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzM2NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAotMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAotMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAotMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAotMzY2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzcyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0zNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCi0yNjEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzNzkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzM4NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAotMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAotMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAotMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAotMjYxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzMzkyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCi0yNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCi0yNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCi0yNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCi0yNjEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDMzOTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKLTI1NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzQwNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNDExMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCi0yNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCi0yNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCi0yNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCi0yNTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0MTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKLTI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKLTI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKLTI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKLTI1NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzQyNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAotMjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0MzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAotMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTI2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNDM2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAotMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCi0yNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzQ0MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAotMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAotMjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0NDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAotMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCi0yNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKLTIxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNDU2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi0yMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKLTIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi0yMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzQ2MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi0yMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKLTIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAotMjEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0Njg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKLTIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi0yMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKLTIxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNDc1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi0yMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKLTIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAotMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCi00MTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM0ODE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzQ4ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAotNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAotNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAotNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAotNDE2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNDk0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCi00MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCi00MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCi00MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCi00MTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1MDA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKLTQxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzUwNzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNTEzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCi00MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCi00MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCi00MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCi00MTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1MjAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKLTQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKLTQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKLTQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKLTQxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzUyNjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAotNzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1MzI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAotNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTc0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNTM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAotNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCi03NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzU0NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAotNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAotNzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1NTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAotNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCi03NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKLTY2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNTU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi02Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKLTY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi02NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzU2NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi02Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKLTY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAotNjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1NzEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi02Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKLTY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi02Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKLTY2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNTc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi02Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKLTY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAotNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCi01NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzU4NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM1OTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNTk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzYwMzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM2MDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzcsMjQ2LDI5OCwzODIsNTgsNDAyLDI1MSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjIyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjI4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi01MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTEyOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzYzNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjQxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCi0xMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCi0xMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCi0xMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCi0xMjkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM2NDgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKLTEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKLTEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKLTEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKLTEyOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzY1NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAotMTMwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjYwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM2NjcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKLTEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKLTEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKLTEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKLTEzMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzY3MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAotMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAotMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAotMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAotMTMwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjgwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi0xMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCi04NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzY4NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCi04Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotODcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM2OTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi04Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCi04Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKLTg3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNjk5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCi04Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCi04NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzcwNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCi04Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKLTg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM3MTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzcxODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAotMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAotMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAotMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAotMjg3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNzI0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCi0yODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCi0yODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCi0yODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCi0yODcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM3MzEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKLTM3NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzczNzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNzQ0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCi0zNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCi0zNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCi0zNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCi0zNzYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM3NTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKLTM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKLTM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKLTM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKLTM3NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzc1NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM3NjMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzc2OTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAotMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAotMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAotMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAotMjgzCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNzc2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCi0yODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCi0yODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCi0yODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCi0yODMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM3ODI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKLTIxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzc4ODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzNzk1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCi0yMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCi0yMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCi0yMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCi0yMTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4MDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKLTIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKLTIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKLTIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKLTIxMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzgwODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4MTQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzgyMDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAotMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAotMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAotMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAotMjc4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzODI3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCi0yNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCi0yNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCi0yNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCi0yNzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4MzM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKLTE2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzODQwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0xNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKLTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0xNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzg0NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0xNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKLTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAotMTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4NTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKLTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0xNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKLTE2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzODU5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0xNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKLTE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAotMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzg2NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzODcyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCi0yNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCi0yNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCi0yNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCi0yNzQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4Nzg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKLTI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKLTI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKLTI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKLTI3NAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzg4NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAotMjQyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzODkxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM4OTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKLTI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKLTI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKLTI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKLTI0MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzkwNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAotMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAotMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAotMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAotMjQyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTEwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCi0yMzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM5MTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0MzkyMzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAotMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAotMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAotMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAotMjM3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTI5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCi0yMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCi0yMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCi0yMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCi0yMzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM5MzYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKLTExNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzk0MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTQ4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCi0xMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCi0xMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCi0xMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCi0xMTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM5NTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKLTExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKLTExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKLTExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKLTExNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzk2MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAotMTExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTY4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDM5NzQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKLTExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKLTExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKLTExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKLTExMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzk4MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAotMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAotMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAotMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAotMTExCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3QzOTg3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0xMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0Mzk5MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MDAwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwMDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDAxMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTMxNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDAxOTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MDI1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCi0zMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCi0zMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCi0zMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCi0zMTQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwMzIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKLTMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKLTMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKLTMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKLTMxNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDAzODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAotMjk5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MDQ0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDA1MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwNTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MDY0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zMTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwNzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDA3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAotMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAotMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAotMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAotMzE1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MDgzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCi0zMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCi0zMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCi0zMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCi0zMTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQwODk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKLTE4NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDA5NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTAyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCi0xODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCi0xODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCi0xODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCi0xODYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxMDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKLTE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKLTE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKLTE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKLTE4NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDExNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAotMTY4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTIxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxMjgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKLTE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKLTE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKLTE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKLTE2OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDEzNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAotMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAotMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAotMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAotMTY4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTQwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0xNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCi0yOTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxNDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDE1MzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAotMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAotMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAotMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAotMjk2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTYwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCi0yOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCi0yOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCi0yOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCi0yOTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxNjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKLTI5MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDE3MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTc5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCi0yOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCi0yOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCi0yOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCi0yOTEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQxODU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKLTI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKLTI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKLTI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKLTI5MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDE5MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAotMzM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MTk4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyMDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKLTMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKLTMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKLTMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKLTMzNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDIxMTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAotMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAotMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAotMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAotMzM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MjE3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCi0zMzAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyMjQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDIzMDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAotMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAotMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAotMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAotMzMwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MjM2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCi0zMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCi0zMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCi0zMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCi0zMzAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyNDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKLTM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MjQ5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKLTM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDI1NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKLTM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAotMzUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyNjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKLTM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKLTM1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MjY4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKLTM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAotMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCi0zMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDI3NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCi0zMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMzAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQyODE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCi0zMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKLTMwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0Mjg4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCi0zMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCi0zMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDI5NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCi0zMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKLTMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAotMTQ2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MzAwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzMDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKLTE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKLTE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKLTE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKLTE0NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDMxMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAotMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAotMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAotMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAotMTQ2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MzIwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCi0xNDIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzMjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDMzMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAotMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAotMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAotMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAotMTQyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MzM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCi0xNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCi0xNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCi0xNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCi0xNDIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzNDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKLTEwNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDM1MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0MzU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCi0xMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCi0xMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCi0xMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCi0xMDUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzNjQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKLTEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKLTEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKLTEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKLTEwNQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDM3MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAotMTAxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0Mzc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQzODQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKLTEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKLTEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKLTEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKLTEwMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDM5MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAotMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAotMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAotMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAotMTAxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0Mzk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCi0xMjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0MDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDQwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAotMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAotMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAotMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAotMTI2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCi0xMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCi0xMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCi0xMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCi0xMjYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0MjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKLTEyMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDQyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDM1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCi0xMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCi0xMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCi0xMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCi0xMjIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0NDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKLTEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKLTEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKLTEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKLTEyMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDQ0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAotMzc4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDU0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0NjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKLTM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKLTM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKLTM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKLTM3OAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDQ2NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAotMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAotMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAotMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAotMzc4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDczNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCi0zNzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0ODAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDQ4NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAotMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAotMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAotMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAotMzc3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NDkyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCi0zNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCi0zNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCi0zNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCi0zNzcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ0OTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKLTk2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTA1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi05NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi05NgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDUxMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi05NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1MTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi05NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTk2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTI0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi05NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLTk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0xMzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1MzEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCi0xMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKLTEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMTMyCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTM3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKLTEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCi0xMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKLTEzMgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDU0NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCi0xMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKLTEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCi0xMzIKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1NTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCi0xMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKLTEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAotMzAxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTU2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAotMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCi0zMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDU2MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCi0zMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAotMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCi0zMDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1Njk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAotMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCi0zMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAotMzAxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTc2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAotMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCi0zMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKLTMwMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDU4MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NTg4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCi0zMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCi0zMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCi0zMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCi0zMDAKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ1OTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKLTMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKLTMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKLTMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKLTMwMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYwMTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAotMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYwODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCi0xLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYxNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCi0xLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYyMDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCi0xLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYyNzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCi0xLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAotMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDYzMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY0MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY0NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY1MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMzE5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NjU5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ2NjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKLTMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKLTMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKLTMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKLTMxOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY3MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAotMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAotMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAotMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAotMzE5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0Njc4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCi0zMTgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ2ODQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDY5MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAotMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAotMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAotMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAotMzE4Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0Njk3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCi0zMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCi0zMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCi0zMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCi0zMTgKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3MDQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLTMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NzEwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0zOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAotMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKLTM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3MTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAotMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKLTM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3MjMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAotMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKLTM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3Mjk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0tMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAotMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKLTM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCi0zMTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3MzYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNgotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDc0MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAotMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAotMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAotMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAotMzE2Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NzQ4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCi0zMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCi0zMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCi0zMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCi0zMTYKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3NTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLTMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKLS0xCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0NzYxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi04MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAotODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKLTgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDc2ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAotODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKLTgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDc3NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAotODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKLTgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDc4MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi04MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAotODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKLTgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCi0tMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDc4NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKLTc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCi03OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ3OTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKLTc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCi03OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4MDAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKLTc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCi03OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4MDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKLTc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCi03OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAotMzA5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODEyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDkKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4MTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKLTMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKLTMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKLTMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKLTMwOQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDgyNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAotMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAotMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAotMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAotMzA5Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODMyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0zMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCi0yMDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4Mzg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDg0NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAotMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAotMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAotMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAotMjAxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODUxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCi0yMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCi0yMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCi0yMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCi0yMDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4NTc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0yMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKLTMwNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDg2NDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODcwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCi0zMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCi0zMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCi0zMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCi0zMDQKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4NzY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKLTMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKLTMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKLTMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKLTMwNAotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDg4MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAotMzE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0ODg5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ4OTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKLTMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKLTMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKLTMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKLTMxNwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDkwMjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAotMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAotMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAotMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAotMzE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTA4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0zMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ5MTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDkyMTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ5MzQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDk0MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTQ3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ5NTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDk2MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTY2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ5NzI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDk3OTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q0OTg1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDQ5OTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NDk5ODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDA0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUwMTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTAxNzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDI0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUwMzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTAzNjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDQzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUwNDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTA1NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDYyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUwNjg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTA3NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MDgxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUwODgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTA5NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTAwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxMDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTExMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTIwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxMjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTEzMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxNDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTE1MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxNjQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTE3MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUxODQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTE5MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MTk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyMDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTIwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyMjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTIyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjM1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyNDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTI0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjU0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyNjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTI2NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjczNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyODAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTI4NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MjkyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUyOTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTMwNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAotMTg1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MzEyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCi0xODUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUzMTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MzI0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTMzMTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUzMzc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MzQ0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTM1MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUzNTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MzYzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTM2OTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUzNzYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1MzgyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTM4ODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDUzOTUyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDAxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQwODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU0MTQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDIwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQyNzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU0MzM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDQwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQ0NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU0NTI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDU5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQ2NTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU0NzIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDc4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTQ4NDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU0OTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NDk3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTUwNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU1MTA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NTE2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTUyMzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU1Mjk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NTM2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTU0MjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU1NDg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NTU1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTU2MTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU1NjgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NTc0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTU4MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU1ODcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NTkzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTYwMDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU2MDY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NjEyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTYxOTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU2MjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NjMyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTYzODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU2NDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NjUxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTY1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU2NjQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NjcwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTY3NjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU2ODMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1Njg5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTY5NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3MDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NzA4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTcxNTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3MjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxCi0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NzI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi00MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKLTQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAotNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3MzQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTc0MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NzQ3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3NTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTc2MDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1NzY2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3NzI4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTc3OTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1Nzg1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU3OTIwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTc5ODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1ODA0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU4MTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTgxNzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1ODI0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU4MzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTgzNjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1ODQzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU4NDk2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTg1NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1ODYyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU4Njg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTg3NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1ODgxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU4ODgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTg5NDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTAwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU5MDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTkxMzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTIwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU5MjY0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTkzMjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTM5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU5NDU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTk1MjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTU4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU5NjQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTk3MTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTc3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDU5ODQwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NTk5MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q1OTk2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwMDMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjAwOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MDE2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwMjI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjAyODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MDM1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwNDE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjA0ODBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MDU0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwNjA4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjA2NzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MDczNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwODAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjA4NjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MDkyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYwOTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjEwNTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTEyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYxMTg0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NQotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjEyNDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAotMTU1Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTMxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCi0xNTUKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYxMzc2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTQ0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjE1MDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTU2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYxNjMyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTY5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjE3NjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTgyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYxODg4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MTk1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjIwMTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjA4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYyMTQ0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjIwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjIyNzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjMzNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYyNDAwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjQ2NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjI1MjhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjU5MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYyNjU2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MjcyMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjI3ODRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2Mjg0OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYyOTEyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2Mjk3NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjMwNDBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MzEwNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYzMTY4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MzIzMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjMyOTZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MzM2MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYzNDI0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MzQ4OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjM1NTJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2MzYxNltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYzNjgwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2Mzc0NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjM4MDhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2Mzg3MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDYzOTM2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDAwMFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjQwNjRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDEyOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY0MTkyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDI1NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjQzMjBbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDM4NFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY0NDQ4W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDUxMltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjQ1NzZbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDY0MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY0NzA0W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDc2OFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjQ4MzJbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NDg5NltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY0OTYwW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NTAyNFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjUwODhbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NTE1MltdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY1MjE2W10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTk3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NTI4MFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05NwotI2lmZGVmIF9fR05VQ19fCi19Owotc2hvcnQgaW50IGludF9saXN0NjUzNDRbXSA9IHsKLSNlbHNlCi0sCi0jZW5kaWYKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCi05Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKLTk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAotMTE3Ci0jaWZkZWYgX19HTlVDX18KLX07Ci1zaG9ydCBpbnQgaW50X2xpc3Q2NTQwOFtdID0gewotI2Vsc2UKLSwKLSNlbmRpZgotMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCi0xMTcKLSNpZmRlZiBfX0dOVUNfXwotfTsKLXNob3J0IGludCBpbnRfbGlzdDY1NDcyW10gPSB7Ci0jZWxzZQotLAotI2VuZGlmCi0xMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywKLTExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExN307CmRpZmYgLS1naXQgYS9zaW0vejhrL21lbS5jIGIvc2ltL3o4ay9tZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0MmE2Ni4uMDAwMDAwMAotLS0gYS9zaW0vejhrL21lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qIG1lbW9yeSBzdXBwb3J0IGZvciBaOEtTSU0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLVo4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVo4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInRtLmgiCi0jaW5jbHVkZSAibWVtLmgiCi0jaW5jbHVkZSAic2ltLmgiCi0KLSNkZWZpbmUgSU5MSU5FCi1zdGF0aWMgCi1sb25nCi1zaXRvcHRyIChzaSkKLWxvbmcgc2k7Ci17Ci0gIHJldHVybiAoKHNpICYgMHhmZjAwMDAwMCkgPj4gOCkgfCAoc2kgJiAweGZmZmYpOwotfQotCi1zdGF0aWMKLXVuc2lnbmVkIHNob3J0ICoKLWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCBvZmZzZXRfcHRyKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOwotICAgICBpbnQgKm9mZnNldF9wdHI7Ci17Ci0gIC8qIElzIHRoZSBwYWdlIGFsbG9jYXRlZCA/ICovCi0KLSAgaWYgKGNvbnRleHQtPm1lbW9yeSA9PSAwKQotICAgIHsKLSAgICAgIC8qIE11c3QgYWxsb2NhdGUgMTZNQiBpbiBvcmRlciB0byBydW4gWjgwMDEgcHJvZ3JhbXMuICAqLwotICAgICAgY29udGV4dC0+bWVtb3J5ICA9ICh1bnNpZ25lZCBzaG9ydCAqKWNhbGxvYyg2NCoxMDI0KjY0LDQpOwotICAgIH0KLQotICAqb2Zmc2V0X3B0ciA9IHNpdG9wdHIod2hlcmUpOwotICByZXR1cm4gY29udGV4dC0+bWVtb3J5OwotfQotCi12b2lkCi1zaW1fd3JpdGVfYnl0ZSAoY29udGV4dCwgd2hlcmUsIHdoYXQpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7Ci0gICAgIGludCB3aGF0OwotewotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKLQotICBwdHJbb2Zmc2V0XSA9IHdoYXQ7Ci19Ci0KLXZvaWQKLXNpbV93cml0ZV9zaG9ydCAoY29udGV4dCwgd2hlcmUsIHdoYXQpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7Ci0gICAgIGludCB3aGF0OwotewotICBpbnQgb2Zmc2V0OwotICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKLQotICBwdHJbb2Zmc2V0XSA9IHdoYXQgPj4gODsKLSAgcHRyW29mZnNldCArIDFdID0gd2hhdDsKLX0KLQotdm9pZAotc2ltX3dyaXRlX2xvbmcgKGNvbnRleHQsIHdoZXJlLCB3aGF0KQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOwotICAgICBpbnQgd2hhdDsKLXsKLSAgaW50IG9mZnNldDsKLSAgY2hhciAqcHRyID0gKGNoYXIgKilnZXRfcGFnZV9hbmRfb2Zmc2V0IChjb250ZXh0LCB3aGVyZSwgJm9mZnNldCk7Ci0KLSAgcHRyW29mZnNldF0gPSB3aGF0ID4+IDI0OwotICBwdHJbb2Zmc2V0ICsgMV0gPSB3aGF0ID4+IDE2OwotICBwdHJbb2Zmc2V0ICsgM10gPSB3aGF0ID4+IDg7Ci0gIHB0cltvZmZzZXQgKyA0XSA9IHdoYXQ7Ci19Ci0KLWludAotc2ltX3JlYWRfYnl0ZSAoY29udGV4dCwgd2hlcmUpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7Ci17Ci0gIGludCBvZmZzZXQ7Ci0gIGNoYXIgKnB0ciA9IChjaGFyICopZ2V0X3BhZ2VfYW5kX29mZnNldCAoY29udGV4dCwgd2hlcmUsICZvZmZzZXQpOwotCi0gcmV0dXJuIHB0cltvZmZzZXRdOwotfQotCi11bnNpZ25lZAotc2ltX3JlYWRfc2hvcnQgKGNvbnRleHQsIHdoZXJlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOwotewotICBpbnQgd2hhdDsKLSAgaW50IG9mZnNldDsKLQotICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKLQotICB3aGF0ID0gKHB0cltvZmZzZXRdIDw8IDgpIHwgcHRyW29mZnNldCArIDFdOwotICByZXR1cm4gd2hhdDsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3NpbS96OGsvbWVtLmggYi9zaW0vejhrL21lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg5YmQ0Li4wMDAwMDAwCi0tLSBhL3NpbS96OGsvbWVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNkZWZpbmUgWjhrX1BBR0VfU0laRSAoMTw8UEFHRV9QT1dFUikKLQotaW50IHNpbV9yZWFkX2J5dGUgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqLCBzaW1fcGh5c19hZGRyX3R5cGUpKTsKLXVuc2lnbmVkIGludCBzaW1fcmVhZF9zaG9ydCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICosIHNpbV9waHlzX2FkZHJfdHlwZSkpOwotdm9pZCBzaW1fd3JpdGVfbG9uZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICosIHNpbV9waHlzX2FkZHJfdHlwZSwKLQkJCSAgICBpbnQpKTsKLXZvaWQgc2ltX3dyaXRlX3Nob3J0IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKiwgc2ltX3BoeXNfYWRkcl90eXBlLCBpbnQpKTsKLXZvaWQgc2ltX3dyaXRlX2J5dGUgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqLCBzaW1fcGh5c19hZGRyX3R5cGUsIGludCkpOwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9xdWljay5jIGIvc2ltL3o4ay9xdWljay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ3YzdkLi4wMDAwMDAwCi0tLSBhL3NpbS96OGsvcXVpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDc4MyArMCwwIEBACi0vKiBsaXN0IG9mIG9wY29kZXMgdG8gY29tcGlsZSBhbGwgdGhlIHdheSAqLwotaW50IHF1aWNrW109Ci17Ci0jaWYgMAotICAvKiAxMTAwMDAqLyAweGMsCi0gIC8qICAgICAzNSovIDB4MTA0LAotICAvKiAgICAgIDQqLyAweDEwNSwKLSAgLyogICAgICAzKi8gMHgxMDcsCi0gIC8qICAgICAyMCovIDB4MTBkLAotICAvKiAgICAgIDIqLyAweDFkYywKLSAgLyogICAgIDY5Ki8gMHgyMGYsCi0gIC8qICAgICAgMSovIDB4NDBkLAotICAvKiAgICAgNDAqLyAweDUwMSwKLSAgLyogICAgICA3Ki8gMHg1MDQsCi0gIC8qICAgICAgNyovIDB4NTA1LAotICAvKiAgICAgIDYqLyAweDUwOCwKLSAgLyogICAgICA2Ki8gMHg1MDksCi0gIC8qICAgICAgOCovIDB4NjA5LAotICAvKiAgICAxMTgqLyAweDYwYywKLSAgLyogICAgICAyKi8gMHg3MDIsCi0gIC8qICAgICA4NSovIDB4NzA0LAotICAvKiAgICAgODgqLyAweDcwNSwKLSAgLyogICAgICAzKi8gMHg3MDcsCi0gIC8qICAgICAgNSovIDB4NzA4LAotICAvKiAgICAgIDQqLyAweDcwOSwKLSAgLyogMTEwMDAwKi8gMHhhMDgsCi0gIC8qIDEwMTU3MSovIDB4YTA5LAotICAvKiAxMTAwMDAqLyAweGEwYywKLSAgLyogMTAwMDAwKi8gMHhhMGYsCi0gIC8qIDMwMDAwMCovIDB4YTZkLAotICAvKiAxMDE2ODEqLyAweGIwMiwKLSAgLyogMTAwMDc3Ki8gMHhiMDQsCi0gIC8qICAgICAgOCovIDB4YjA1LAotICAvKiAxMTAwMDAqLyAweGIwNywKLSAgLyogIDEwMDA1Ki8gMHhiMDgsCi0gIC8qIDE0MDAwMCovIDB4YjBhLAotICAvKiAxMDAwMzYqLyAweGIwYywKLSAgLyogMTAwMDQyKi8gMHhiMGQsCi0gIC8qICAgICAgMyovIDB4YzI1LAotICAvKiAxMDUxNTgqLyAweGM1OCwKLSAgLyogMzAwMjM2Ki8gMHhjNzQsCi0gIC8qICAgICAyMCovIDB4ZDQxLAotICAvKiAxMDAwMDgqLyAweGQ0NSwKLSAgLyogICAgIDEwKi8gMHhkNTEsCi0gIC8qICAgICAxMCovIDB4ZDU0LAotICAvKiAxMTAwMDAqLyAweGRjNSwKLSAgLyogMTAwMDAwKi8gMHhkZDUsCi0gIC8qICAgICA3OSovIDB4ZGY5LAotICAvKiAgICAgIDYqLyAweDEwMDQsCi0gIC8qICAgICA1MyovIDB4MTAwOCwKLSAgLyogICAgICA1Ki8gMHgxM2Y0LAotICAvKiAgICAgIDEqLyAweDE0MDIsCi0gIC8qICAgICAgMiovIDB4MTQwNCwKLSAgLyogICAgICAyKi8gMHgxNDA2LAotICAvKiAgICAgIDcqLyAweDE0MDgsCi0gIC8qICAgICAgNCovIDB4MTYwNiwKLSAgLyogICAgIDcyKi8gMHgxZTQ4LAotICAvKiAgICAgIDYqLyAweDFmNDAsCi0gIC8qIDEwMDAwNiovIDB4MjA1ZSwKLSAgLyogICAgICAyKi8gMHgyMDY4LAotICAvKiAxMTAwMDAqLyAweDIwNmMsCi0gIC8qIDExMDAwMCovIDB4MjA3YywKLSAgLyogMzAwMDAwKi8gMHgyMDdkLAotICAvKiAxMDE2NDIqLyAweDIwODgsCi0gIC8qIDEwMTUzOSovIDB4MjA4OSwKLSAgLyogMTAxNjc5Ki8gMHgyMDhjLAotICAvKiAgICAgNDAqLyAweDIwOWMsCi0gIC8qICAgICAgOCovIDB4MjEwMiwKLSAgLyogMTIwMDA5Ki8gMHgyMTA0LAotICAvKiAxMTAwMDMqLyAweDIxMDUsCi0gIC8qIDEzMDAwMCovIDB4MjEwNiwKLSAgLyogMTEwMDY4Ki8gMHgyMTA3LAotICAvKiAgICAgMzIqLyAweDIxMDgsCi0gIC8qICAgICAgMSovIDB4MjEwOSwKLSAgLyogICAgMTA1Ki8gMHgyMTBjLAotICAvKiAgICAgIDEqLyAweDIxMGQsCi0gIC8qICAgICAgMyovIDB4MjEyNiwKLSAgLyogICAgICAzKi8gMHgyMTQyLAotICAvKiAxMjAwMDIqLyAweDIxNDQsCi0gIC8qIDEwMDAxMiovIDB4MjE0NSwKLSAgLyogIDEwMDAwKi8gMHgyMTQ3LAotICAvKiAxMDAwMDAqLyAweDIxNDgsCi0gIC8qICAgICAgNiovIDB4MjE1NiwKLSAgLyogMTAwMDAwKi8gMHgyMTU3LAotICAvKiAxMDAwMDAqLyAweDIxNTgsCi0gIC8qIDEwMTY3NyovIDB4MjE2NSwKLSAgLyogMTAwMDAwKi8gMHgyMTY4LAotICAvKiAxMTAwMDAqLyAweDIxNzQsCi0gIC8qICAgICAgMiovIDB4MjE5MCwKLSAgLyogICAgICAyKi8gMHgyMTk4LAotICAvKiAgICAgIDIqLyAweDIxYzQsCi0gIC8qICAgICAgMiovIDB4MjFjNSwKLSAgLyogMTEwMDAwKi8gMHgyMWM4LAotICAvKiAxMTAwMDAqLyAweDIxY2EsCi0gIC8qICAgICAgMiovIDB4MjFjZCwKLSAgLyogMTAwMDAyKi8gMHgyMWQ3LAotICAvKiAxMDAwMDAqLyAweDIxZGMsCi0gIC8qIDEwMTY3NyovIDB4Mjk2MCwKLSAgLyogICAgICAyKi8gMHgyOWMwLAotICAvKiAgICAgIDQqLyAweDJlNDgsCi0gIC8qIDEwMTY3NyovIDB4MmU1YywKLSAgLyogMTAwMDAwKi8gMHgyZTdjLAotICAvKiAgICAgMzEqLyAweDJmMjQsCi0gIC8qICAgICAgMSovIDB4MmYyOCwKLSAgLyogMTAwMDAwKi8gMHgyZjQ1LAotICAvKiAgICAgIDMqLyAweDJmNDYsCi0gIC8qIDEwMDAwMCovIDB4MmY0NywKLSAgLyogMTAwMDAwKi8gMHgyZjQ4LAotICAvKiAxMDAwMDAqLyAweDJmNTQsCi0gIC8qIDEzMDAwMCovIDB4MmY1NiwKLSAgLyogMTAwMDAwKi8gMHgyZjU4LAotICAvKiAgMTAwMDAqLyAweDJmNjQsCi0gIC8qIDEwMDAwMCovIDB4MmY2NSwKLSAgLyogMTAwMDAwKi8gMHgyZjcyLAotICAvKiAxMTAwMDAqLyAweDJmNzQsCi0gIC8qICAxMDAwMCovIDB4MmY3OCwKLSAgLyogMTEwMDAwKi8gMHgyZmE0LAotICAvKiAxMTAwMDAqLyAweDJmYTgsCi0gIC8qICAgICAgMSovIDB4MmZjMiwKLSAgLyogMTAwMDAwKi8gMHgyZmM0LAotICAvKiAxMDAwMDAqLyAweDJmYzcsCi0gIC8qICAgICAgMiovIDB4MmZjOCwKLSAgLyogMTEwMDAwKi8gMHgyZmNhLAotICAvKiAxMDAwMDIqLyAweDJmZGMsCi0gIC8qICAgICA3NyovIDB4MzE0NCwKLSAgLyogICAgICAzKi8gMHgzMTQ2LAotICAvKiAgICAgIDIqLyAweDMzNDIsCi0gIC8qICAgICAgMyovIDB4MzM0NiwKLSAgLyogMTAwMDAwKi8gMHgzNDQ1LAotICAvKiAgICAgIDIqLyAweDM0NTQsCi0gIC8qIDEwMDAwMCovIDB4MzQ1NiwKLSAgLyogIDEwMDAwKi8gMHgzNDU4LAotICAvKiAgICAgIDYqLyAweDM0NTksCi0gIC8qIDEwMDAwMCovIDB4MzQ2NCwKLSAgLyogMTAwMDAwKi8gMHgzNDY4LAotICAvKiAgMTAwMDAqLyAweDM0ODUsCi0gIC8qIDEwMDAwMCovIDB4MzQ4NiwKLSAgLyogICAgICAxKi8gMHgzNGEwLAotICAvKiAxMTAwMjYqLyAweDM0YTQsCi0gIC8qIDExMDA2OSovIDB4MzRhNSwKLSAgLyogMTEwMDE0Ki8gMHgzNGE2LAotICAvKiAgMjAwMzgqLyAweDM0YTcsCi0gIC8qICAgICAgMSovIDB4MzRhOSwKLSAgLyogICAgICAxKi8gMHgzNGFkLAotICAvKiAxMDAwMDAqLyAweDM0YzQsCi0gIC8qIDEwMDAwMCovIDB4MzRjNSwKLSAgLyogICAgICAyKi8gMHgzNGQ0LAotICAvKiAxMDAwMDAqLyAweDM0ZjUsCi0gIC8qIDEwMDAwMCovIDB4MzRmNywKLSAgLyogICAgICA0Ki8gMHg0MTAyLAotICAvKiAgICAgIDQqLyAweDQxMDQsCi0gIC8qICAgICAgMSovIDB4NDE2OSwKLSAgLyogMTEwMDAwKi8gMHg0MWE0LAotICAvKiAxMDAwMDAqLyAweDQxYTUsCi0gIC8qIDEwMDAwMCovIDB4NDFhNiwKLSAgLyogMTAwMDAwKi8gMHg0MWE4LAotICAvKiAxMDAwMDAqLyAweDQxZjQsCi0gIC8qIDEwMDAwMCovIDB4NDMwMiwKLSAgLyogMTAwMDAwKi8gMHg0MzA1LAotICAvKiAxMTAwMDAqLyAweDQzMDgsCi0gIC8qICAgICAgMSovIDB4NDM2OSwKLSAgLyogICAgICAxKi8gMHg0M2E0LAotICAvKiAxMDAwMDAqLyAweDQzYTUsCi0gIC8qIDEwMDAwMCovIDB4NDNhOCwKLSAgLyogMTAwMDAwKi8gMHg0M2E5LAotICAvKiAxMjAwMDAqLyAweDQzYWMsCi0gIC8qICAgICAgMiovIDB4NDNjNSwKLSAgLyogMTAwMDAwKi8gMHg0M2Y1LAotICAvKiAxMDAwMDAqLyAweDQzZmEsCi0gIC8qIDExMDAwMCovIDB4NDUwNCwKLSAgLyogICAgICA0Ki8gMHg0NWExLAotICAvKiAgICAgMTgqLyAweDQ1YTQsCi0gIC8qIDEwMDAxOCovIDB4NDVhNSwKLSAgLyogICAgICAxKi8gMHg0OTY4LAotICAvKiAxMzAwMDAqLyAweDRhMDgsCi0gIC8qIDEwMDAwMCovIDB4NGEwYiwKLSAgLyogMTAwMDAwKi8gMHg0YWFjLAotICAvKiAgICAgIDMqLyAweDRiNjgsCi0gIC8qIDEwMDAwMCovIDB4NGJhOCwKLSAgLyogMTAwMDAwKi8gMHg0YmE5LAotICAvKiAgICAgIDQqLyAweDRiYzUsCi0gIC8qIDExMDAwMCovIDB4NGMwMSwKLSAgLyogMTIwMDAwKi8gMHg0YzA1LAotICAvKiAgICAgMzIqLyAweDRjNzgsCi0gIC8qIDEwMDAwMCovIDB4NGNhMSwKLSAgLyogMTAwMDAwKi8gMHg0Y2E1LAotICAvKiAgICAgIDEqLyAweDRjYzQsCi0gIC8qICAgICAyMCovIDB4NGNkNCwKLSAgLyogMTEwMDA3Ki8gMHg0ZDA0LAotICAvKiAxMTAwMDQqLyAweDRkMDUsCi0gIC8qIDExMDAwMCovIDB4NGQwOCwKLSAgLyogICAgICAyKi8gMHg0ZDI1LAotICAvKiAgICAgIDEqLyAweDRkMjgsCi0gIC8qICAgICAgOCovIDB4NGQ0MSwKLSAgLyogMTAwMDAwKi8gMHg0ZDQ0LAotICAvKiAxMDAwMDAqLyAweDRkNDUsCi0gIC8qIDEwMTY3OSovIDB4NGQ2NCwKLSAgLyogMTAwMDM0Ki8gMHg0ZGExLAotICAvKiAxMTAwMDUqLyAweDRkYTQsCi0gIC8qIDE0MDAxNCovIDB4NGRhNSwKLSAgLyogMTAwMDAxKi8gMHg0ZGE4LAotICAvKiAxMDAwMDMqLyAweDRkYzQsCi0gIC8qIDExMDAwMCovIDB4NGRjNSwKLSAgLyogICAgICAyKi8gMHg0ZGQ0LAotICAvKiAxMDAwMDAqLyAweDRkZDUsCi0gIC8qIDEwMDAwMCovIDB4NGRmNSwKLSAgLyogICAgICAzKi8gMHg0ZTJkLAotICAvKiAgMzAwMDAqLyAweDRlYTgsCi0gIC8qICAgICA1MiovIDB4NGVhOSwKLSAgLyogMTAwMDAwKi8gMHg0ZWFiLAotICAvKiAxMDAwMDAqLyAweDRlYWMsCi0gIC8qICAgICAzMiovIDB4NGVhZCwKLSAgLyogMTAwMDAwKi8gMHg0ZWFlLAotICAvKiAxMDAwMDAqLyAweDRlYWYsCi0gIC8qICAgICAgMiovIDB4NGVjOCwKLSAgLyogICAgICAyKi8gMHg0ZWNkLAotICAvKiAgICAgIDMqLyAweDUwYTYsCi0gIC8qICAgICAzMiovIDB4NTBhOCwKLSAgLyogICAgICAxKi8gMHg1MjBjLAotICAvKiAgICAgMTgqLyAweDUyYTgsCi0gIC8qICAgICAgMiovIDB4NTNmMCwKLSAgLyogICAgICA2Ki8gMHg1M2Y0LAotICAvKiAgICAgIDMqLyAweDUzZmEsCi0gIC8qICAgICAgMSovIDB4NTQwNiwKLSAgLyogICAgICA4Ki8gMHg1NDQ4LAotICAvKiAgICAgIDQqLyAweDU0YTIsCi0gIC8qICAgICA0MiovIDB4NTRhNCwKLSAgLyogICAgIDEwKi8gMHg1NGE2LAotICAvKiAgICAzMjIqLyAweDU0YTgsCi0gIC8qICAgICAgMyovIDB4NTZhNCwKLSAgLyogICAgICAzKi8gMHg1NmE2LAotICAvKiAxMTAwMDAqLyAweDU5YTQsCi0gIC8qIDEwMDAwMCovIDB4NTlmNCwKLSAgLyogICAgICA0Ki8gMHg1ZDAyLAotICAvKiAgICAgIDEqLyAweDVkMGMsCi0gIC8qICAgICAgMiovIDB4NWQ0OCwKLSAgLyogICAgIDMzKi8gMHg1ZGE0LAotICAvKiAgICAgNDgqLyAweDVkYTYsCi0gIC8qICAgIDIxMyovIDB4NWRhOCwKLSAgLyogICAgIDMyKi8gMHg1ZTAxLAotICAvKiAxMTAwMDUqLyAweDVlMDIsCi0gIC8qIDEwMDAwNSovIDB4NWUwMywKLSAgLyogMTAxNzI4Ki8gMHg1ZTA2LAotICAvKiAgICAgMzEqLyAweDVlMDcsCi0gIC8qIDEwMDI2NiovIDB4NWUwOCwKLSAgLyogMTAwMDA2Ki8gMHg1ZTA5LAotICAvKiAxMDAwMzMqLyAweDVlMGEsCi0gIC8qIDEwMDA4MCovIDB4NWUwYiwKLSAgLyogMTAwMDMwKi8gMHg1ZTBlLAotICAvKiAgICAgIDEqLyAweDVlMGYsCi0gIC8qIDI2MjAzMiovIDB4NWYwMCwKLSAgLyogMTEwMDAwKi8gMHg2MDA4LAotICAvKiAxMDAwMDAqLyAweDYwMDksCi0gIC8qICAgICAgMiovIDB4NjAwYywKLSAgLyogMTEwMDAwKi8gMHg2MDRjLAotICAvKiAgICAgIDQqLyAweDYwNGQsCi0gIC8qICAgICAgNiovIDB4NjA2ZiwKLSAgLyogICAgIDM2Ki8gMHg2MDg5LAotICAvKiAxNDAwNjQqLyAweDYwYTgsCi0gIC8qICAgICA0OCovIDB4NjBhOSwKLSAgLyogMTAwMDk2Ki8gMHg2MGFjLAotICAvKiAxMDAwMDAqLyAweDYwYWQsCi0gIC8qICAgICAgMiovIDB4NjBjOCwKLSAgLyogICAgIDE5Ki8gMHg2MGNjLAotICAvKiAgICAgIDIqLyAweDYwY2QsCi0gIC8qICAgICAgOCovIDB4NjBkYywKLSAgLyogMTIwMDA5Ki8gMHg2MTA0LAotICAvKiAxMjAwMzIqLyAweDYxMDUsCi0gIC8qIDExMDAwMSovIDB4NjEwNiwKLSAgLyogMTEwMDAwKi8gMHg2MTA3LAotICAvKiAgICAgIDIqLyAweDYxMDgsCi0gIC8qICAgICAgMSovIDB4NjEwOSwKLSAgLyogICAgICAxKi8gMHg2MTBkLAotICAvKiAgICAgIDEqLyAweDYxMGYsCi0gIC8qICAgICAgNCovIDB4NjE0NSwKLSAgLyogMTAwMDAwKi8gMHg2MTQ3LAotICAvKiAgICAgIDIqLyAweDYxNGMsCi0gIC8qICAgICAgMiovIDB4NjE0ZCwKLSAgLyogMTAwMDAwKi8gMHg2MTU3LAotICAvKiAxMDAwMDIqLyAweDYxNTgsCi0gIC8qICAgICAgMyovIDB4NjE1OSwKLSAgLyogICAgICA2Ki8gMHg2MTY1LAotICAvKiAgICAgMTIqLyAweDYxNjgsCi0gIC8qICAgICAzMiovIDB4NjE4MSwKLSAgLyogICAgICA0Ki8gMHg2MTkxLAotICAvKiAgICAgIDIqLyAweDYxOTQsCi0gIC8qICAgICAgMiovIDB4NjE5OCwKLSAgLyogICAgIDY4Ki8gMHg2MWEwLAotICAvKiAxMDE2ODIqLyAweDYxYTEsCi0gIC8qIDExMDA2NiovIDB4NjFhMiwKLSAgLyogMTAwMDQwKi8gMHg2MWEzLAotICAvKiAxMjAyMzIqLyAweDYxYTQsCi0gIC8qIDExMDE3MiovIDB4NjFhNSwKLSAgLyogMTAxODAwKi8gMHg2MWE2LAotICAvKiAxMTAxMTkqLyAweDYxYTcsCi0gIC8qIDE0MzkyMyovIDB4NjFhOCwKLSAgLyogMTEwMDk4Ki8gMHg2MWE5LAotICAvKiAgICAgNDQqLyAweDYxYWMsCi0gIC8qICAgICAgNCovIDB4NjFjMCwKLSAgLyogICAgICAyKi8gMHg2MWM0LAotICAvKiAgICAgIDEqLyAweDYxYzUsCi0gIC8qIDExMDAwMiovIDB4NjFjNywKLSAgLyogICAgICAzKi8gMHg2MWM4LAotICAvKiAxMDAwMDAqLyAweDYxZDQsCi0gIC8qICAgICAgMiovIDB4NjFkOCwKLSAgLyogICAgICAyKi8gMHg2MWRjLAotICAvKiAxMDAwMDAqLyAweDYxZjMsCi0gIC8qIDEwMDAwMCovIDB4NjFmNCwKLSAgLyogMTAwMDAwKi8gMHg2MWY1LAotICAvKiAxMDAwMDAqLyAweDYxZjcsCi0gIC8qIDEwMDAwMCovIDB4NjFmYiwKLSAgLyogMTAwMDAwKi8gMHg2OGEwLAotICAvKiAxMTAwMDAqLyAweDY5NDAsCi0gIC8qIDExMDAzMiovIDB4NjlhMCwKLSAgLyogMTAwMDAwKi8gMHg2OWYwLAotICAvKiAgICAgIDIqLyAweDZiNDAsCi0gIC8qIDEwMTY3OSovIDB4NmI2MCwKLSAgLyogMTAwMDQ0Ki8gMHg2YmEwLAotICAvKiAgICAgIDIqLyAweDZiYzAsCi0gIC8qICAgICAgNiovIDB4NmYwMiwKLSAgLyogMTIwMDAwKi8gMHg2ZjA0LAotICAvKiAxMDAwMDIqLyAweDZmMDUsCi0gIC8qICAgICAgNyovIDB4NmY0NSwKLSAgLyogMTEwMDAwKi8gMHg2ZjQ3LAotICAvKiAxMDAwMDcqLyAweDZmNDgsCi0gIC8qICAgICAxNSovIDB4NmY0OSwKLSAgLyogMTAwMDAwKi8gMHg2ZjRiLAotICAvKiAxMDAwMDAqLyAweDZmNTQsCi0gIC8qIDEwMDAwMCovIDB4NmY1OCwKLSAgLyogIDEwMDAwKi8gMHg2ZjY0LAotICAvKiAgMTAwMDAqLyAweDZmNjgsCi0gIC8qICAgICAgMiovIDB4NmY5NCwKLSAgLyogICAgMTQ1Ki8gMHg2ZmEwLAotICAvKiAxMDE3MTQqLyAweDZmYTEsCi0gIC8qICAgICA5NCovIDB4NmZhMiwKLSAgLyogMTIwMDYwKi8gMHg2ZmE0LAotICAvKiAxMDAxMDkqLyAweDZmYTUsCi0gIC8qIDEwMDEyMyovIDB4NmZhNiwKLSAgLyogMTAwMTU3Ki8gMHg2ZmE3LAotICAvKiAxMTE4NDIqLyAweDZmYTgsCi0gIC8qIDEwMDA5MSovIDB4NmZhOSwKLSAgLyogICAgICA0Ki8gMHg2ZmMwLAotICAvKiAgICAgIDEqLyAweDZmYzIsCi0gIC8qICAgICAgMSovIDB4NmZjNSwKLSAgLyogICAgICAxKi8gMHg2ZmNkLAotICAvKiAgICAgIDIqLyAweDZmZDgsCi0gIC8qIDEwMDAwMCovIDB4NmZmNCwKLSAgLyogICAgIDU2Ki8gMHg3MDVjLAotICAvKiAxMDAwMDAqLyAweDcwNmQsCi0gIC8qIDEwMDAwMCovIDB4NzA3OCwKLSAgLyogMTAwMDAwKi8gMHg3MDhkLAotICAvKiAxMDAwMDAqLyAweDcwOGUsCi0gIC8qIDEwMDAwMCovIDB4NzA5ZSwKLSAgLyogMTEwMDAwKi8gMHg3MGRkLAotICAvKiAxMTAwMDAqLyAweDcxNTcsCi0gIC8qIDEwMDAwMCovIDB4NzE1YiwKLSAgLyogICAgIDU2Ki8gMHg3MjdjLAotICAvKiAxMjAwMDAqLyAweDczNDgsCi0gIC8qICAgICAzMSovIDB4NzQyNCwKLSAgLyogMTAwMDAwKi8gMHg3NDQ2LAotICAvKiAxMDAwMDAqLyAweDc0NDcsCi0gIC8qICAxMDAwMCovIDB4NzQ0OSwKLSAgLyogMTIwMDAwKi8gMHg3NDU0LAotICAvKiAgICAgIDIqLyAweDc0NjgsCi0gIC8qICAgICAzMiovIDB4NzQ3MiwKLSAgLyogMTEwMDAwKi8gMHg3NGE0LAotICAvKiAxMDAwMDAqLyAweDc0YjQsCi0gIC8qIDEwMDAwMCovIDB4NzRiNSwKLSAgLyogICAgIDEwKi8gMHg3NGMyLAotICAvKiAxMDAwMDAqLyAweDc0YzQsCi0gIC8qICAgICAzMiovIDB4NzRkNCwKLSAgLyogICAgICAxKi8gMHg3ZjAxLAotICAvKiAgICAgIDIqLyAweDdmMDQsCi0gIC8qICAgICAgMiovIDB4N2YxMywKLSAgLyogICAgICAxKi8gMHg3ZjE2LAotICAvKiAgICAgIDIqLyAweDdmMTcsCi0gIC8qICAgICAgMiovIDB4ODEyOCwKLSAgLyogMTkwMDkxKi8gMHg4MTQ0LAotICAvKiAxMDAwMDAqLyAweDgxNDUsCi0gIC8qIDEwMDAwMCovIDB4ODE1NCwKLSAgLyogMTEwMDAwKi8gMHg4MTU1LAotICAvKiAxMDAwMDAqLyAweDgxNTYsCi0gIC8qIDEwMDAwMCovIDB4ODE2NCwKLSAgLyogMTAwMDAwKi8gMHg4MTY1LAotICAvKiAxMTAwMDAqLyAweDgxNjYsCi0gIC8qIDEwMDAwMCovIDB4ODE2NywKLSAgLyogMTQwMDAwKi8gMHg4MTc2LAotICAvKiAxMDAwMDAqLyAweDgxNzcsCi0gIC8qIDEzMDAwMCovIDB4ODE4NCwKLSAgLyogICAgIDQwKi8gMHg4MThjLAotICAvKiAxMDAwMDAqLyAweDgxOTQsCi0gIC8qIDExMDAwMCovIDB4ODFiNCwKLSAgLyogMTAwMDAwKi8gMHg4MWJiLAotICAvKiAgICAgIDIqLyAweDgxYzksCi0gIC8qICAgICAzNiovIDB4ODFkMCwKLSAgLyogICAgICA0Ki8gMHg4MWQxLAotICAvKiAgICAgNDAqLyAweDgxZGMsCi0gIC8qIDExMTY3NyovIDB4ODIyMiwKLSAgLyogMTEwMDc2Ki8gMHg4MjQ0LAotICAvKiAxMDAwMzgqLyAweDgyNTUsCi0gIC8qIDExMDAwNiovIDB4ODI2NiwKLSAgLyogMTMxNjc5Ki8gMHg4Mjc3LAotICAvKiAgICAxMDcqLyAweDgzMDAsCi0gIC8qICAgIDEzMSovIDB4ODMxMSwKLSAgLyogMTQwMDE1Ki8gMHg4MzIyLAotICAvKiAgICAgIDIqLyAweDgzMmQsCi0gIC8qIDExMDA1NiovIDB4ODM0MiwKLSAgLyogMTAwMDE5Ki8gMHg4MzQ0LAotICAvKiAxMDAwMDAqLyAweDgzNTIsCi0gIC8qIDEwMDAwMCovIDB4ODM1NCwKLSAgLyogMTEwMDAzKi8gMHg4MzU1LAotICAvKiAxMDAwMDEqLyAweDgzNjYsCi0gIC8qICAgICAgNiovIDB4ODM3NywKLSAgLyogICAgIDcxKi8gMHg4Mzg4LAotICAvKiAgICAgIDIqLyAweDgzOGQsCi0gIC8qICAgICAzNCovIDB4ODM5OSwKLSAgLyogMTAwMDAwKi8gMHg4M2E0LAotICAvKiAxMjAwMDIqLyAweDgzYzQsCi0gIC8qICAgICAgNCovIDB4ODNjOCwKLSAgLyogICAgMTEzKi8gMHg4M2NjLAotICAvKiAgICAgIDIqLyAweDgzZDQsCi0gIC8qICAgICAgNCovIDB4ODRjOSwKLSAgLyogICAgICA0Ki8gMHg4NGQ5LAotICAvKiAgICAgIDMqLyAweDg1MjQsCi0gIC8qICAgICAgNCovIDB4ODU1OSwKLSAgLyogMTAwMDAwKi8gMHg4YWRjLAotICAvKiAgMTAwMDAqLyAweDhhZTgsCi0gIC8qIDEwMDAwMCovIDB4OGFlOSwKLSAgLyogMTMwMDAwKi8gMHg4YWVmLAotICAvKiAxMDAwMDAqLyAweDhhZjgsCi0gIC8qICAgICAgMiovIDB4OGIyNiwKLSAgLyogIDIwMDAwKi8gMHg4YjI4LAotICAvKiAgICAgIDEqLyAweDhiNDUsCi0gIC8qIDEwMDAwMCovIDB4OGI0OCwKLSAgLyogICAgIDMyKi8gMHg4YjQ5LAotICAvKiAgMjAwMDAqLyAweDhiNTYsCi0gIC8qICAxMDAwMCovIDB4OGI1OCwKLSAgLyogMTAwMDAwKi8gMHg4YjU5LAotICAvKiAxMDUxNTgqLyAweDhiNjUsCi0gIC8qIDEwMDAwMCovIDB4OGI2OCwKLSAgLyogICAgICAyKi8gMHg4Yjc1LAotICAvKiAgICAgIDIqLyAweDhiODIsCi0gIC8qICAgIDI2MCovIDB4OGI4YywKLSAgLyogMTAwMDAwKi8gMHg4YmEzLAotICAvKiAxMDAwMDAqLyAweDhiYWIsCi0gIC8qIDEwMDAwMCovIDB4OGJjMiwKLSAgLyogMTAwMDAwKi8gMHg4YmMzLAotICAvKiAgMTAwMDAqLyAweDhiYzgsCi0gIC8qICAxMDAwMiovIDB4OGJjOSwKLSAgLyogICAgICAyKi8gMHg4YmQ1LAotICAvKiAgICAgIDQqLyAweDhiZDksCi0gIC8qICAgICAzMiovIDB4OGJkYywKLSAgLyogMTAxNjc0Ki8gMHg4Yzg0LAotICAvKiAxMDAwNjMqLyAweDhjYzQsCi0gIC8qICAgICAgMSovIDB4OGNlMiwKLSAgLyogMTAwMDAwKi8gMHg4Y2U0LAotICAvKiAgICAgMzIqLyAweDhkMDQsCi0gIC8qICAgIDEwNyovIDB4OGQxNCwKLSAgLyogMTQwMDE5Ki8gMHg4ZDI0LAotICAvKiAgICAgMjAqLyAweDhkMjgsCi0gIC8qIDEwMDA0MCovIDB4OGQ0NCwKLSAgLyogMTIwMDAzKi8gMHg4ZDQ4LAotICAvKiAxMTAwMTMqLyAweDhkNTQsCi0gIC8qICAgICAgMiovIDB4OGQ1OCwKLSAgLyogICAgICAyKi8gMHg4ZDYyLAotICAvKiAxMDAwODgqLyAweDhkNjQsCi0gIC8qICAgIDIxOCovIDB4OGQ4NCwKLSAgLyogICAgIDkxKi8gMHg4ZGM0LAotICAvKiAgICAgODUqLyAweDhkZDQsCi0gIC8qIDExMDEyNyovIDB4OTFmYywKLSAgLyogICAgICAxKi8gMHg5M2YwLAotICAvKiAgICAgMzYqLyAweDkzZjEsCi0gIC8qICAgICAgMyovIDB4OTNmNCwKLSAgLyogICAgICAxKi8gMHg5M2Y4LAotICAvKiAgICAgIDYqLyAweDkzZjksCi0gIC8qIDE0MjAzNyovIDB4OTNmYSwKLSAgLyogMTIwMDE1Ki8gMHg5M2ZjLAotICAvKiAxMDAwMDAqLyAweDk0MjAsCi0gIC8qICAgICAgNCovIDB4OTQyNiwKLSAgLyogICAgICAxKi8gMHg5NDJjLAotICAvKiAgICAgNDIqLyAweDk0NDYsCi0gIC8qICAgICAgMSovIDB4OTQ2MiwKLSAgLyogICAgICAzKi8gMHg5NDY0LAotICAvKiAgICAgIDEqLyAweDk0YzQsCi0gIC8qICAgICAgMSovIDB4OTRjNiwKLSAgLyogMTEwMTI2Ki8gMHg5NWZjLAotICAvKiAgICAgIDMqLyAweDk2NDYsCi0gIC8qICAgICAzMiovIDB4OTY2NiwKLSAgLyogICAgMTEwKi8gMHg5Njg4LAotICAvKiAxNDIwMzMqLyAweDk3ZmEsCi0gIC8qIDEyMDAxNCovIDB4OTdmYywKLSAgLyogICAgICAxKi8gMHg5YTQwLAotICAvKiAxMTAxMTIqLyAweDliMjAsCi0gIC8qIDEwMDAwMCovIDB4OWI0MCwKLSAgLyogICAgIDY0Ki8gMHg5YzQ4LAotICAvKiAgICAgMzgqLyAweDljODgsCi0gIC8qIDEwMDAwMCovIDB4OWUwNiwKLSAgLyogMjYyMDM1Ki8gMHg5ZTA4LAotICAvKiAxMTAwMDAqLyAweDllMGUsCi0gIC8qIDEwMDAwMiovIDB4YTA4YywKLSAgLyogICAgIDMyKi8gMHhhMDhkLAotICAvKiAgMjAwMDAqLyAweGEwOGYsCi0gIC8qICAgICAgOCovIDB4YTBhYywKLSAgLyogMTExNjgxKi8gMHhhMGNhLAotICAvKiAxMDAwMDAqLyAweGEwY2QsCi0gIC8qIDExMDAwMSovIDB4YTBjZSwKLSAgLyogMTAxNjg0Ki8gMHhhMGNmLAotICAvKiAxMDAwMzIqLyAweGEwZGMsCi0gIC8qIDExMDAwMCovIDB4YTBkZiwKLSAgLyogMTAwMDAwKi8gMHhhMGVjLAotICAvKiAxMDAwMDYqLyAweGEwZWQsCi0gIC8qIDEwMTY3NyovIDB4YTBmYywKLSAgLyogICAgICA2Ki8gMHhhMGZlLAotICAvKiAxMDAwNTYqLyAweGExMDQsCi0gIC8qIDEwMDAwMCovIDB4YTEwNSwKLSAgLyogMTAwMDAwKi8gMHhhMTA4LAotICAvKiAxMTAwMDAqLyAweGExMTQsCi0gIC8qIDEwMDAwMCovIDB4YTExNSwKLSAgLyogICAgIDU2Ki8gMHhhMTE2LAotICAvKiAxMDAwMzIqLyAweGExMjQsCi0gIC8qICAgICA3NiovIDB4YTEyZCwKLSAgLyogICAgICAxKi8gMHhhMTM0LAotICAvKiAgICAgNDAqLyAweGExM2QsCi0gIC8qIDEwMDAwMCovIDB4YTE0MSwKLSAgLyogMTAwMDQxKi8gMHhhMTQyLAotICAvKiAgICAgIDEqLyAweGExNDMsCi0gIC8qICAgICAgMSovIDB4YTE0NCwKLSAgLyogMTEwMDA5Ki8gMHhhMTQ1LAotICAvKiAxMDAwMDcqLyAweGExNDYsCi0gIC8qIDEwMDAwOCovIDB4YTE0NywKLSAgLyogMTEwMDAwKi8gMHhhMTQ4LAotICAvKiAxMDAwMDAqLyAweGExNDksCi0gIC8qIDEwMDAwMCovIDB4YTE0YSwKLSAgLyogMTAwMDAwKi8gMHhhMTRiLAotICAvKiAxMTAwMDAqLyAweGExNGMsCi0gIC8qIDEwMDAwMiovIDB4YTE0ZCwKLSAgLyogMTAwMDAwKi8gMHhhMTUwLAotICAvKiAxMDAwMDQqLyAweGExNTQsCi0gIC8qIDEwMDAwMCovIDB4YTE1NiwKLSAgLyogMTAwMDA2Ki8gMHhhMTU3LAotICAvKiAxMDAwMDAqLyAweGExNTgsCi0gIC8qIDEwMDAwMCovIDB4YTE1OSwKLSAgLyogMTAwMDAwKi8gMHhhMTVhLAotICAvKiAxMTAwMDAqLyAweGExNWMsCi0gIC8qIDEwMDAwMiovIDB4YTE1ZCwKLSAgLyogICAgMTEyKi8gMHhhMTYxLAotICAvKiAxMjAwMDYqLyAweGExNjQsCi0gIC8qIDEwMDAwNiovIDB4YTE2NSwKLSAgLyogMTAwMDAwKi8gMHhhMTY3LAotICAvKiAgICAgIDYqLyAweGExNjgsCi0gIC8qICAxMDAwMCovIDB4YTE2YiwKLSAgLyogMTIwMDEyKi8gMHhhMTZjLAotICAvKiAxMDAwNjIqLyAweGExNzIsCi0gIC8qICAgICA2MCovIDB4YTE3NCwKLSAgLyogMTAwMDAwKi8gMHhhMTc1LAotICAvKiAxMDAwMDAqLyAweGExNzYsCi0gIC8qICAgICAgNiovIDB4YTE3OSwKLSAgLyogMTEwMDAwKi8gMHhhMTdhLAotICAvKiAxMTAwMDgqLyAweGExN2MsCi0gIC8qIDExMDAxNCovIDB4YTE3ZCwKLSAgLyogMTEwMDAwKi8gMHhhMTg0LAotICAvKiAxMTAwMDAqLyAweGExODUsCi0gIC8qICAyMDAwMCovIDB4YTE4NiwKLSAgLyogMTAwMDA0Ki8gMHhhMTg5LAotICAvKiAxMDAwMDAqLyAweGExOGIsCi0gIC8qICAgICAgNCovIDB4YTE5MSwKLSAgLyogICAgIDU2Ki8gMHhhMTkyLAotICAvKiAxMDAwMDAqLyAweGExYTEsCi0gIC8qIDEwMDAwMCovIDB4YTFhNSwKLSAgLyogMTEwMDAwKi8gMHhhMWE2LAotICAvKiAxMTAwMDAqLyAweGExYTcsCi0gIC8qIDExMjAzMyovIDB4YTFhZiwKLSAgLyogIDEwMDAwKi8gMHhhMWMxLAotICAvKiAxMDAwNjIqLyAweGExYzIsCi0gIC8qIDExMDAwOSovIDB4YTFjNCwKLSAgLyogMTEwMDA1Ki8gMHhhMWM1LAotICAvKiAxMjAwMDAqLyAweGExYzYsCi0gIC8qICAgICAxNSovIDB4YTFjNywKLSAgLyogICAgICA0Ki8gMHhhMWQwLAotICAvKiAgICAgIDIqLyAweGExZDIsCi0gIC8qICAgICAgNCovIDB4YTFkNCwKLSAgLyogMTAwMDA0Ki8gMHhhMWQ1LAotICAvKiAxMjAwMzYqLyAweGExZDYsCi0gIC8qIDExMDAwNCovIDB4YTFkNywKLSAgLyogMTEyMDM4Ki8gMHhhMWZhLAotICAvKiAgMjAwMDAqLyAweGE4ODAsCi0gIC8qIDEwMTQ5OSovIDB4YTkxMCwKLSAgLyogICAgICAzKi8gMHhhOTIxLAotICAvKiAxMDAwMDIqLyAweGE5NDAsCi0gIC8qIDEwMDAwMCovIDB4YTk0MSwKLSAgLyogMTAwMDAwKi8gMHhhOTQzLAotICAvKiAxMDAwMDAqLyAweGE5NDUsCi0gIC8qIDExMDAwMCovIDB4YTk0OSwKLSAgLyogMTA1MTYwKi8gMHhhOTUwLAotICAvKiAxMjAwMDAqLyAweGE5NTUsCi0gIC8qIDEwMDAwMCovIDB4YTk1OSwKLSAgLyogMzEwMDA1Ki8gMHhhOTYwLAotICAvKiAxMDAwMDAqLyAweGE5NjUsCi0gIC8qICAgICAgMSovIDB4YTk2NywKLSAgLyogMjkwMTgwKi8gMHhhOTcwLAotICAvKiAxMzAwMDAqLyAweGE5NzEsCi0gIC8qICAgICAgMyovIDB4YTk3NCwKLSAgLyogMTExNzUxKi8gMHhhOTgwLAotICAvKiAxMDAwMzYqLyAweGE5ODEsCi0gIC8qIDEwMDAwMCovIDB4YTk4NCwKLSAgLyogICAgICAxKi8gMHhhOTg3LAotICAvKiAxMDAwNDAqLyAweGE5OTAsCi0gIC8qICAgICAgNSovIDB4YTk5MSwKLSAgLyogICAgICAyKi8gMHhhOTkzLAotICAvKiAgICAgIDEqLyAweGE5OTcsCi0gIC8qIDExMDAwMCovIDB4YTlhMCwKLSAgLyogMTAwMTk0Ki8gMHhhOWMwLAotICAvKiAxMDAwMDAqLyAweGE5ZDAsCi0gIC8qICAgICA2MyovIDB4YTlmMSwKLSAgLyogICAgIDQwKi8gMHhhOWYzLAotICAvKiAxMTAwMDAqLyAweGFiNDAsCi0gIC8qIDEwMDAwNCovIDB4YWI1MCwKLSAgLyogICAgIDU2Ki8gMHhhYjgwLAotICAvKiAgICAgNTUqLyAweGFiYzAsCi0gIC8qIDEwMDA2OSovIDB4YWJmMSwKLSAgLyogMTAwMDAwKi8gMHhhYmYzLAotICAvKiAxMDAwMDEqLyAweGFiZjUsCi0gIC8qIDEwMDAwNiovIDB4YWJmNywKLSAgLyogICAgIDUwKi8gMHhhYmY5LAotICAvKiAxMDAwMTQqLyAweGFiZmIsCi0gIC8qICAgICAgMiovIDB4YWJmZCwKLSAgLyogICAgICAyKi8gMHhhYmZmLAotICAvKiAgICAgMjAqLyAweGFmMjYsCi0gIC8qIDEyMDAwMCovIDB4YWY0NiwKLSAgLyogICAgICAzKi8gMHhhZjQ3LAotICAvKiAgICAgIDEqLyAweGFmNTYsCi0gIC8qICAgICAgMSovIDB4YWY1ZSwKLSAgLyogICAgICAxKi8gMHhiMTA3LAotICAvKiAxMTAxMTIqLyAweGIxMGEsCi0gIC8qICAgICAgNCovIDB4YjEyMCwKLSAgLyogMTAwMDAxKi8gMHhiMTJhLAotICAvKiAgICAgIDMqLyAweGIxNGEsCi0gIC8qICAgICAgNSovIDB4YjE3MCwKLSAgLyogICAgICAxKi8gMHhiMThhLAotICAvKiAgICAgIDQqLyAweGIyZDEsCi0gIC8qICAgICAgNiovIDB4YjJlMSwKLSAgLyogICAgICAyKi8gMHhiMzQ1LAotICAvKiAgICAgIDEqLyAweGIzNDcsCi0gIC8qIDEzMDAwMCovIDB4YjM0OSwKLSAgLyogICAgICA0Ki8gMHhiMzU5LAotICAvKiAgICAgIDIqLyAweGIzNWIsCi0gIC8qIDEwMDAwNiovIDB4YjM2OSwKLSAgLyogICAgICA2Ki8gMHhiMzZkLAotICAvKiAxMDAwMTcqLyAweGIzNzksCi0gIC8qICAgICAgMiovIDB4YjM3YiwKLSAgLyogICAgIDY3Ki8gMHhiMzg1LAotICAvKiAgICAgIDIqLyAweGIzY2IsCi0gIC8qIDEyMDAwMiovIDB4YmE1MSwKLSAgLyogMTEwMDAwKi8gMHhiZDIxLAotICAvKiAgICAgIDIqLyAweGJkMzIsCi0gIC8qIDEwMDAwMCovIDB4YmQ0MSwKLSAgLyogMTAwMDAwKi8gMHhiZDRhLAotICAvKiAgICAgIDIqLyAweGJkNTEsCi0gIC8qIDEwMDAwMCovIDB4YmQ1YSwKLSAgLyogICAgICAyKi8gMHhiZDViLAotICAvKiAgICAgIDQqLyAweGJkNjEsCi0gIC8qIDExMDAwMCovIDB4YmQ2YSwKLSAgLyogICAgICAyKi8gMHhiZDcxLAotICAvKiAxMTAwMDAqLyAweGJkN2EsCi0gIC8qICAgICAgMSovIDB4YmQ5MSwKLSAgLyogICAgIDMyKi8gMHhiZDlhLAotICAvKiAxMTAwMDAqLyAweGJkYTIsCi0gIC8qIDEwMDAwMCovIDB4YmRhMywKLSAgLyogICAgIDM0Ki8gMHhiZGMxLAotICAvKiAxMDAwMDAqLyAweGJkYzIsCi0gIC8qIDExMDAwMCovIDB4YmRjMywKLSAgLyogMTIwMDAwKi8gMHhjODQxLAotICAvKiAxMDAwMDAqLyAweGNiNDEsCi0gIC8qIDExMDAwMCovIDB4Y2M0MSwKLSAgLyogMTEwMDAwKi8gMHhjZTQxLAotICAvKiAxMDAwMDAqLyAweGNmNDEsCi0gIC8qICAgICAgMiovIDB4ZTEwNiwKLSAgLyogICAgICAzKi8gMHhlMTBhLAotICAvKiAxMTAwMDAqLyAweGUxZWEsCi0gIC8qICAgIDIyMCovIDB4ZTFlYywKLSAgLyogICAgIDQwKi8gMHhlMWYyLAotICAvKiAgICAgIDIqLyAweGUyMDIsCi0gIC8qICAgICA0MCovIDB4ZTIwMywKLSAgLyogICAgIDMyKi8gMHhlMjA0LAotICAvKiAgICAgIDIqLyAweGUyZWEsCi0gIC8qIDEwMDAwMCovIDB4ZTJlYywKLSAgLyogMTEwMDAwKi8gMHhlMmVlLAotICAvKiAxMjAwMDAqLyAweGUyZjksCi0gIC8qIDEwMDAwMCovIDB4ZTJmYiwKLSAgLyogIDMwMDAwKi8gMHhlM2RiLAotICAvKiAgICAgIDcqLyAweGU2MDIsCi0gIC8qIDMwMDEyOCovIDB4ZTYwMywKLSAgLyogICAgIDE1Ki8gMHhlNjA0LAotICAvKiAxMTAwMDIqLyAweGU2MDUsCi0gIC8qICAgICAzMiovIDB4ZTYwNiwKLSAgLyogICAgIDcyKi8gMHhlNjA3LAotICAvKiAgICAgIDMqLyAweGU2MDgsCi0gIC8qIDEwMTYyNCovIDB4ZTYwOSwKLSAgLyogICAgIDM0Ki8gMHhlNjBhLAotICAvKiAxMTAwMDIqLyAweGU2MGIsCi0gIC8qIDEwMDA0MCovIDB4ZTYwYywKLSAgLyogMTIwMDAwKi8gMHhlNjBkLAotICAvKiAgICAgIDEqLyAweGU2MGUsCi0gIC8qICAgICAgMSovIDB4ZTYwZiwKLSAgLyogICAgICAzKi8gMHhlNjEwLAotICAvKiAgICAgNDAqLyAweGU2MTQsCi0gIC8qICAgICAgMiovIDB4ZTYxNiwKLSAgLyogICAgICAyKi8gMHhlNjE5LAotICAvKiAgICAgMzAqLyAweGU2MjIsCi0gIC8qICAgICAgMyovIDB4ZTYyYywKLSAgLyogICAgMTgwKi8gMHhlNjJkLAotICAvKiAgICAgIDQqLyAweGU2MzIsCi0gIC8qICAgICAgMiovIDB4ZTYzOSwKLSAgLyogICAgIDU2Ki8gMHhlNjNhLAotICAvKiAgICAgNDAqLyAweGU2NDAsCi0gIC8qICAgICAgMiovIDB4ZTZmMiwKLSAgLyogMzAwMDAwKi8gMHhlNmY5LAotICAvKiAgICAgIDQqLyAweGU3MDYsCi0gIC8qIDEwNTE1OCovIDB4ZTdmYywKLSAgLyogMTAwMDQ1Ki8gMHhlODAxLAotICAvKiAxMjE2NzcqLyAweGU4MDIsCi0gIC8qIDExMDAwMCovIDB4ZTgwMywKLSAgLyogMTEwMDAyKi8gMHhlODA0LAotICAvKiAxMTAwMDAqLyAweGU4MDYsCi0gIC8qICAgICA0MiovIDB4ZTgwOCwKLSAgLyogICAgIDQwKi8gMHhlODBhLAotICAvKiAgICAgIDIqLyAweGU4MGUsCi0gIC8qICAgICA0MCovIDB4ZTgxMCwKLSAgLyogICAgMTAzKi8gMHhlODE1LAotICAvKiAgICAgIDEqLyAweGU4MWIsCi0gIC8qICAgICAgMiovIDB4ZTgxYywKLSAgLyogIDEwMDAwKi8gMHhlODIwLAotICAvKiAgICAgIDIqLyAweGU4MzEsCi0gIC8qICAgICAgMiovIDB4ZTgzYiwKLSAgLyogICAgIDM0Ki8gMHhlOTAxLAotICAvKiAgICAgMzIqLyAweGU5MDMsCi0gIC8qICAgICAgMSovIDB4ZTkwNiwKLSAgLyogMTAxNjc5Ki8gMHhlOTA4LAotICAvKiAgICAgMzIqLyAweGU5MGYsCi0gIC8qIDExMDAwMCovIDB4ZTkxNiwKLSAgLyogICAgIDI0Ki8gMHhlOWVlLAotICAvKiAgICAgMjIqLyAweGU5ZWYsCi0gIC8qIDExMDAwMCovIDB4ZWEwMiwKLSAgLyogMTEwMDAwKi8gMHhlYTAzLAotICAvKiAxMDAwMDAqLyAweGVhMTEsCi0gIC8qIDExMDAwMCovIDB4ZWExMywKLSAgLyogICAgICA0Ki8gMHhlYWVlLAotICAvKiAgICAgMzMqLyAweGVhZjksCi0gIC8qIDExMDAwMCovIDB4ZWIwMSwKLSAgLyogMTAwMDAwKi8gMHhlYjI0LAotICAvKiAxMDAwMDAqLyAweGViMjYsCi0gIC8qICAgICA0MCovIDB4ZWJiZiwKLSAgLyogMTEwMDAwKi8gMHhlZTAxLAotICAvKiAxMTAwMDIqLyAweGVlMDIsCi0gIC8qICAgICAgOCovIDB4ZWUwMywKLSAgLyogMTMwMDc2Ki8gMHhlZTA0LAotICAvKiAgICAgIDYqLyAweGVlMDUsCi0gIC8qIDExMDAwMiovIDB4ZWUwNiwKLSAgLyogICAgICAxKi8gMHhlZTBiLAotICAvKiAgICAgIDQqLyAweGVlMGUsCi0gIC8qICAgICAgMSovIDB4ZWUwZiwKLSAgLyogIDIwMDAwKi8gMHhlZTExLAotICAvKiAxMDAwMDAqLyAweGVlMTQsCi0gIC8qIDExMDAwMCovIDB4ZWUxNSwKLSAgLyogICAgICAxKi8gMHhlZTE4LAotICAvKiAgICAgIDEqLyAweGVlMjcsCi0gIC8qICAgICAgMSovIDB4ZWUyZCwKLSAgLyogICAgMTAzKi8gMHhlZTMzLAotICAvKiAgICAgIDIqLyAweGVlM2IsCi0gIC8qICAgICAgMSovIDB4ZWU0MiwKLSAgLyogICAgICAzKi8gMHhlZWUxLAotICAvKiAxMDE1MzkqLyAweGVlZTIsCi0gIC8qIDExMDAwMCovIDB4ZWVmNCwKLSAgLyogICAgICAyKi8gMHhlZWY5LAotICAvKiAxMDAwMDAqLyAweGVlZmEsCi0gIC8qICAgICAxNCovIDB4ZWVmYywKLSAgLyogICAgMTgwKi8gMHhlZWZkLAotICAvKiAgICAgIDIqLyAweGVmMDIsCi0gIC8qICAgICAgMSovIDB4ZWYwNCwKLSAgLyogICAgICAyKi8gMHhlZjExLAotICAvKiAgICAgIDIqLyAweGVmMTUsCi0jZW5kaWYKLSAgMCx9OwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9zaW0uaCBiL3NpbS96OGsvc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzMyZjUuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay9zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI2RlZmluZSBTSU1fU0lOR0xFX1NURVAgMQotI2RlZmluZSBTSU1fRE9ORSAyCi0jZGVmaW5lIFNJTV9CUkVBS1BPSU5UIDMKLSNkZWZpbmUgU0lNX0lOVEVSUlVQVCA0Ci0jZGVmaW5lIFNJTV9CQURfSU5TVCA1Ci0jZGVmaW5lIFNJTV9ESVZfWkVSTyA2Ci0jZGVmaW5lIFNJTV9CQURfU1lTQ0FMTCA3Ci0jZGVmaW5lIFNJTV9CQURfQUxJR04gOAotI2RlZmluZSBTSU1fQkFEX0FERFIgOQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9zdXBwb3J0LmMgYi9zaW0vejhrL3N1cHBvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5MjM2NC4uMDAwMDAwMAotLS0gYS9zaW0vejhrL3N1cHBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDc4NCArMCwwIEBACi0vKiBzdXBwb3J0IHJvdXRpbmVzIGZvciBpbnRlcnByZXRlZCBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLVo4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVo4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgInRtLmgiCi0jaW5jbHVkZSAic2ltLmgiCi0jaW5jbHVkZSAibWVtLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1RJTUVTX0gKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCi0jaW5jbHVkZSAic3lzY2FsbC5oIgotCi1zdGF0aWMgaW50IGdldF9ub3cgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBub3dfcGVyc2VjIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHV0X2xvbmcgUEFSQU1TICgoc2ltX3N0YXRlX3R5cGUgKiBjb250ZXh0LCBpbnQgcHRyLCBpbnQgdmFsdWUpKTsKLXN0YXRpYyBpbnQgcHV0X3Nob3J0IFBBUkFNUyAoKHNpbV9zdGF0ZV90eXBlICogY29udGV4dCwgaW50IHB0ciwgaW50IHZhbHVlKSk7Ci0KLWludCBzaW1fejgwMDFfbW9kZTsKLQotc3RhdGljIGludAotZ2V0X25vdyAoKQotewotI2lmZGVmIEhBVkVfU1lTX1RJTUVTX0gKLSAgc3RydWN0IHRtcyBiOwotCi0gIHRpbWVzICgmYik7Ci0gIHJldHVybiBiLnRtc191dGltZSArIGIudG1zX3N0aW1lOwotI2Vsc2UKLSAgcmV0dXJuIHRpbWUgKDApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLW5vd19wZXJzZWMgKCkKLXsKLSAgcmV0dXJuIDUwOwotfQotCi0KLS8qICNkZWZpbmUgTE9HIC8qIGRlZmluZSB0aGlzIHRvIHByaW50IGluc3RydWN0aW9uIHVzZSBjb3VudHMgKi8KLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jaW5jbHVkZSAiaW5saW5lcy5oIgotI2Vsc2UKLSNpbmNsdWRlICJpbmxpbmVzLmgiCi0jZW5kaWYKLQotLyogVGhpcyBob2xkcyB0aGUgZW50aXJlIGNwdSBjb250ZXh0ICovCi1zdGF0aWMgc2ltX3N0YXRlX3R5cGUgdGhlX3N0YXRlOwotCi1pbnQKLWZhaWwgKGNvbnRleHQsIGR1bW15KQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGR1bW15OwotewotICBjb250ZXh0LT5leGNlcHRpb24gPSBTSU1fQkFEX0lOU1Q7Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1zZm9wX2JhZDEgKGNvbnRleHQpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotewotICBjb250ZXh0LT5leGNlcHRpb24KLSAgICA9IFNJTV9CQURfSU5TVDsKLX0KLQotdm9pZAotYmZvcF9iYWQxIChjb250ZXh0KQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLXsKLSAgY29udGV4dC0+ZXhjZXB0aW9uCi0gICAgPSBTSU1fQkFEX0lOU1Q7Ci19Ci0KLXZvaWQKLWZvcF9iYWQgKGNvbnRleHQpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotewotICBjb250ZXh0LT5leGNlcHRpb24gPQotICAgIFNJTV9CQURfSU5TVDsKLX0KLQotLyogVGFibGUgb2YgYml0IGNvdW50cyBmb3IgYWxsIGJ5dGUgdmFsdWVzICovCi0KLWNoYXIgdGhlX3Bhcml0eVsyNTZdID0KLXsKLSAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMSwgMiwgMiwgMywgMiwgMywgMywKLSAgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwKLSAgNCwgNSwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgMSwgMiwgMiwgMywgMiwKLSAgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwKLSAgNCwgNSwgNSwgNiwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgMywgNCwgNCwKLSAgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywKLSAgMywgNCwgMywgNCwgNCwgNSwgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgMiwKLSAgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwKLSAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwKLSAgNiwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgMywgNCwgNCwgNSwgNCwgNSwKLSAgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwKLSAgNywgNywgOH07Ci0KLQotaW50IHJlYWQgKCk7Ci1pbnQgd3JpdGUgKCk7Ci1pbnQgb3BlbiAoKTsKLWludCBjbG9zZSAoKTsKLWludCBvcGVuICgpOwotaW50IGNsb3NlICgpOwotCi1pbnQgbGluayAoKTsKLWludCBmc3RhdCAoKTsKLQotc3RhdGljIGludAotcHV0X3Nob3J0IChjb250ZXh0LCBwdHIsIHZhbHVlKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IHB0cjsKLSAgICAgaW50IHZhbHVlOwotewotICBwdXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIHB0ciwgdmFsdWUpOwotICByZXR1cm4gcHRyICsgMjsKLX0KLQotc3RhdGljIGludAotcHV0X2xvbmcgKGNvbnRleHQsIHB0ciwgdmFsdWUpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQKLSAgICAgICBwdHI7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgcHV0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBwdHIsIHZhbHVlKTsKLSAgcmV0dXJuIHB0ciArIDQ7Ci19Ci0KLSNkZWZpbmUgYXB0cih4KSAoKHNpdG9wdHIoeCkpICsgKGNoYXIgKikoY29udGV4dC0+bWVtb3J5KSkKLQotc3RhdGljIGludCBhcmdzWzNdOwotc3RhdGljIGludCBhcmdfaW5kZXg7CQkvKiBUcmFuc2xhdGUgYSB6OGsgc3lzdGVtIGNhbGwgaW50byBhIGhvc3Qgc3lzdGVtIGNhbGwgKi8KLXZvaWQKLXN1cHBvcnRfY2FsbCAoY29udGV4dCwgc2MpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgc2M7Ci17Ci0gIGV4dGVybiBpbnQgZXJybm87Ci0gIGludCByZXQ7Ci0gIGludCByZXRuZXh0ID0gMDsKLSAgaW50IGZkOwotCi0gIGludCBvbGRlcnJubyA9IGVycm5vOwotICBlcnJubyA9IDA7Ci0gIHN3aXRjaCAoc2MpCi0gICAgewotICAgIGNhc2UgU1lTX0FSRzoKLSAgICAgIGFyZ3NbYXJnX2luZGV4KytdID0gY29udGV4dC0+cmVnc1swXS53b3JkIDw8IDE2IHwgY29udGV4dC0+cmVnc1sxXS53b3JkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTWVNfZXhpdDoKLSAgICAgIGNvbnRleHQtPmV4Y2VwdGlvbiA9IFNJTV9ET05FOwotICAgICAgcmV0ID0gYXJnc1swXTsKLSAgICAgIGFyZ19pbmRleCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNZU19jbG9zZToKLSAgICAgIHJldCA9IGNsb3NlICgoaW50KSAoYXJnc1swXSkpOwotICAgICAgYXJnX2luZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1lTX2NyZWF0OgotICAgICAgcmV0ID0gY3JlYXQgKGFwdHIgKGFyZ3NbMF0pLCBhcmdzWzFdKTsKLSAgICAgIGFyZ19pbmRleCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNZU19pc2F0dHk6Ci0gICAgICByZXQgPSBpc2F0dHkgKGFyZ3NbMF0pOwotICAgICAgYXJnX2luZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1lTX29wZW46Ci0gICAgICByZXQgPSBvcGVuIChhcHRyIChhcmdzWzBdKSwgYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICBhcmdfaW5kZXggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTWVNfbHNlZWs6Ci0gICAgICByZXQgPSBsc2VlayAoYXJnc1swXSwgKG9mZl90KSBhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgIGFyZ19pbmRleCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNZU19yZWFkOgotICAgICAgcmV0ID0gcmVhZCAoYXJnc1swXSwgYXB0ciAoYXJnc1sxXSksIGFyZ3NbMl0pOwotICAgICAgYXJnX2luZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1lTX3dyaXRlOgotICAgICAgcmV0ID0gd3JpdGUgKGFyZ3NbMF0sYXB0ciAoYXJnc1sxXSksIGFyZ3NbMl0pOwotICAgICAgYXJnX2luZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1lTX3RpbWU6Ci0gICAgICB7Ci0JaW50IGRzdCA9IGFyZ3NbMF07Ci0KLQlyZXQgPSB0aW1lICgwKTsKLQlpZiAoZHN0KQotCSAgewotCSAgICBwdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsCi0JCQkgICAgIHNpdG9wdHIgKGRzdCksIHJldCk7Ci0JICB9Ci0JcmV0bmV4dCA9IHJldDsKLQlyZXQgPSByZXRuZXh0ID4+IDE2OwotCWFyZ19pbmRleCA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNZU19mc3RhdDoKLSAgICAgIHsKLQlpbnQgYnVmOwotCXN0cnVjdCBzdGF0IGhvc3Rfc3RhdDsKLQlmZCA9IGFyZ3NbMF07Ci0JYnVmID0gc2l0b3B0ciAoYXJnc1sxXSk7Ci0JcmV0ID0gZnN0YXQgKGZkLCAmaG9zdF9zdGF0KTsKLQlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X2Rldik7Ci0JYnVmID0gcHV0X3Nob3J0IChjb250ZXh0LCBidWYsIGhvc3Rfc3RhdC5zdF9pbm8pOwotCS8qIEZJWE1FOiBJc24ndCBtb2RlX3QgNCBieXRlcz8gICovCi0JYnVmID0gcHV0X3Nob3J0IChjb250ZXh0LCBidWYsIGhvc3Rfc3RhdC5zdF9tb2RlKTsKLQlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X25saW5rKTsKLQlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X3VpZCk7Ci0JYnVmID0gcHV0X3Nob3J0IChjb250ZXh0LCBidWYsIGhvc3Rfc3RhdC5zdF91aWQpOwotCWJ1ZiA9IHB1dF9zaG9ydCAoY29udGV4dCwgYnVmLCBob3N0X3N0YXQuc3RfcmRldik7Ci0JYnVmID0gcHV0X2xvbmcgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X3NpemUpOwotCWJ1ZiA9IHB1dF9sb25nIChjb250ZXh0LCBidWYsIGhvc3Rfc3RhdC5zdF9hdGltZSk7Ci0JYXJnX2luZGV4ID0gMDsKLSAgICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIFNZU19saW5rOgotICAgICAgY29udGV4dC0+ZXhjZXB0aW9uID0gU0lNX0JBRF9TWVNDQUxMOwotICAgICAgYXJnX2luZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgY29udGV4dC0+cmVnc1syXS53b3JkID0gcmV0OwotICBjb250ZXh0LT5yZWdzWzNdLndvcmQgPSByZXRuZXh0OwotICBjb250ZXh0LT5yZWdzWzVdLndvcmQgPSBlcnJubzsKLQotCi0gIC8qIHN1cHBvcnQgZm9yIHRoZSBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbiAqLwotICBjb250ZXh0LT5yZWdzWzZdLndvcmQgPSByZXRuZXh0OwotICBjb250ZXh0LT5yZWdzWzddLndvcmQgPSByZXQ7Ci0KLSAgZXJybm8gPSBvbGRlcnJubzsKLX0KLQotI3VuZGVmIGdldF93b3JkX21lbV9kYQotCi1pbnQKLWdldF93b3JkX21lbV9kYSAoY29udGV4dCwgYWRkcikKLSAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Ci0gICAgIGludCBhZGRyOwotewotICByZXR1cm4gKGdldF9ieXRlX21lbV9kYSAoY29udGV4dCwgYWRkcikgPDwgOCkgfCAoZ2V0X2J5dGVfbWVtX2RhIChjb250ZXh0LCBhZGRyICsgMSkpOwotCi19Ci0KLSN1bmRlZiBnZXRfd29yZF9yZWcKLWludCAKLWdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSBzaW1fc3RhdGVfdHlwZQotKiBjb250ZXh0OwotICAgICBpbnQgcmVnOwotewotICByZXR1cm4gY29udGV4dC0+cmVnc1tyZWddLndvcmQ7Ci19Ci0KLSNpZmRlZiBMT0cKLWludCBsb2dbNjQgKiAxMDI0XTsKLQotI2VuZGlmCi0KLXZvaWQKLXRtX3N0b3JlX3JlZ2lzdGVyIChyZWdubywgdmFsdWUpCi0gICAgIGludCByZWdubzsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2gKLSAgICAocmVnbm8pCi0gICAgewotICAgIGNhc2UgUkVHX1BDOgotICAgICAgdGhlX3N0YXRlLnNvbWV0aW1lc19wYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcHV0X3dvcmRfcmVnICgmdGhlX3N0YXRlLCByZWdubywgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZAotc3dhcF9sb25nIChidWYsIHZhbCkKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgdmFsOwotewotICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgYnVmWzJdID0gdmFsID4+IDg7Ci0gIGJ1ZlszXSA9IHZhbCA+PiAwOwotfQotCi12b2lkCi1zd2FwX3dvcmQgKGJ1ZiwgdmFsKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCB2YWw7Ci17Ci0gIGJ1ZlswXSA9IHZhbCA+PiA4OwotICBidWZbMV0gPSB2YWwgPj4gMDsKLX0KLQotdm9pZAotdG1fZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vLCBidWYpCi0gICAgIGludCByZWdubzsKLSAgICAgY2hhciAqYnVmOwotewotICBzd2l0Y2gKLSAgICAocmVnbm8pCi0gICAgewotICAgIGNhc2UgUkVHX0NZQ0xFUzoKLSAgICAgIHN3YXBfbG9uZyAoYnVmLCB0aGVfc3RhdGUuY3ljbGVzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVHX0lOU1RTOgotICAgICAgc3dhcF9sb25nIChidWYsIHRoZV9zdGF0ZS5pbnN0cyk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UKLSAgICBSRUdfVElNRToKLSAgICAgIHN3YXBfbG9uZyAoYnVmLCB0aGVfc3RhdGUudGlja3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRUdfUEM6Ci0gICAgICBzd2FwX2xvbmcgKGJ1ZiwgdGhlX3N0YXRlLnNvbWV0aW1lc19wYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFR19TUDoKLSAgICAgIHsKLQlpZiAoc2ltX3o4MDAxX21vZGUpCi0JICB7Ci0JICAgIHN3YXBfbG9uZyAoYnVmLCBnZXRfbG9uZ19yZWcgKCZ0aGVfc3RhdGUsIDE0KSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzd2FwX2xvbmcgKGJ1ZiwgZ2V0X3dvcmRfcmVnICgmdGhlX3N0YXRlLCAxNSkpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlCi0gICAgUkVHX0ZQOgotICAgICAgewotCWlmIChzaW1fejgwMDFfbW9kZSkKLQkgIHsKLQkgICAgc3dhcF9sb25nIChidWYsIGdldF9sb25nX3JlZwotCQkgICAgICAgKCZ0aGVfc3RhdGUsIDEwKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzd2FwX2xvbmcgKGJ1ZiwKLQkJICAgICAgIGdldF93b3JkX3JlZyAoJnRoZV9zdGF0ZSwgMTApKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3dhcF93b3JkIChidWYsCi0JCSAgIGdldF93b3JkX3JlZyAoJnRoZV9zdGF0ZSwgcmVnbm8pKTsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQKLXRtX3Jlc3VtZSAoc3RlcCkKLSAgICAgaW50IHN0ZXA7Ci17Ci0gIGludCBub3cgPSBnZXRfbm93ICgpOwotICBzdHJ1Y3Qgb3BfaW5mbwotICAgKnA7Ci0gIGludCB3b3JkOwotICBpbnQgcGM7Ci0gIGV4dGVybiBpbnQgKCooc2ZvcF90YWJsZVtdKSkgKCk7Ci0gIGV4dGVybiBpbnQgKCooYmZvcF90YWJsZVtdKSkgKCk7Ci0gIGludCAoKigoKnRhYmxlKSkpICgpOwotICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dCA9ICZ0aGVfc3RhdGU7Ci0KLSAgaWYgKHN0ZXApCi0gICAgewotICAgICAgY29udGV4dC0+ZXhjZXB0aW9uID0gU0lNX1NJTkdMRV9TVEVQOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRleHQtPmV4Y2VwdGlvbiA9IDA7Ci0gICAgfQotCi0gIHBjID0gY29udGV4dC0+c29tZXRpbWVzX3BjOwotICBpZiAoc2ltX3o4MDAxX21vZGUpCi0gICAgewotICAgICAgdGFibGUgPSBiZm9wX3RhYmxlOwotICAgICAgcGMgPSBNQVBfUEhZU0lDQUxfVE9fTE9HSUNBTCAocGMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRhYmxlID0gc2ZvcF90YWJsZTsKLSAgICB9Ci0KLQotICBkbwotICAgIHsKLSAgICAgIHdvcmQgPSBnZXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIHBjKTsKLSAgICAgIHAgPSBvcF9pbmZvX3RhYmxlICsgd29yZDsKLQotI2lmZGVmIExPRwotICAgICAgbG9nW3dvcmRdKys7Ci0jZW5kaWYKLSAgICAgIHBjID0gdGFibGVbcC0+ZXhlY10gKGNvbnRleHQsIHBjLCB3b3JkKTsKLSAgICAgIGNvbnRleHQtPmluc3RzKys7Ci0KLSAgICB9Ci0gIHdoaWxlICghY29udGV4dC0+ZXhjZXB0aW9uKTsKLQotCi0KLSAgY29udGV4dC0+c29tZXRpbWVzX3BjID0gTUFQX0xPR0lDQUxfVE9fUEhZU0lDQUwgKHBjKTsKLSAgY29udGV4dC0+dGlja3MgKz0gZ2V0X25vdyAoKSAtIG5vdzsKLX0KLQotaW50Ci10bV9zaWduYWwgKCkKLXsKLSAgcmV0dXJuIHRoZV9zdGF0ZS5leGNlcHRpb247Ci19Ci0KLXZvaWQKLXRtX2luZm9fcHJpbnQgKHgpCi0gICAgIHNpbV9zdGF0ZV90eXBlICp4OwotewotICBkb3VibGUgdGltZXRha2VuID0gKGRvdWJsZSkgeC0+dGlja3MgLyAoZG91YmxlKSBub3dfcGVyc2VjICgpOwotICBkb3VibGUgdmlydHRpbWUgPSB4LT5jeWNsZXMgLyA0LjBlNjsKLQotICBwcmludGYgKCJpbnN0cnVjdGlvbnMgZXhlY3V0ZWQgICAgICAgICAgICA6ICU5ZFxuIiwgeC0+aW5zdHMpOwotICBwcmludGYgKCJjeWNsZXMgY291bnRlZCAgICAgICAgICAgICAgICAgICA6ICU5ZCBcbiIsIHgtPmN5Y2xlcyk7Ci0gIHByaW50ZiAoImN5Y2xlcyAvIGluc3QgICAgICAgICAgICAgICAgICAgIDogJTkuMWYgXG4iLCAoZG91YmxlKSB4LT5jeWNsZXMgLyAoZG91YmxlKSB4LT5pbnN0cyk7Ci0gIHByaW50ZiAoInZpcnR1YWwgdGltZSB0YWtlZCAoYXQgNCBNaHopICAgIDogJTkuMWYgXG4iLCB2aXJ0dGltZSk7Ci0gIHByaW50ZiAoInJlYWwgdGltZSB0YWtlbiAgICAgICAgICAgICAgICAgIDogJTkuMWYgXG4iLCB0aW1ldGFrZW4pOwotCi0gIGlmICh0aW1ldGFrZW4pCi0gICAgewotICAgICAgcHJpbnRmICgidmlydHVhbCBpbnN0cnVjdGlvbnMgcGVyIHNlY29uZCAgOiAlOS4xZlxuIiwgeC0+aW5zdHMgLyB0aW1ldGFrZW4pOwotICAgICAgcHJpbnRmICgiZW11bGF0aW9uIHNwZWVkICAgICAgICAgICAgICAgICAgOiAlOS4xZiUlXG4iLCB2aXJ0dGltZSAvIHRpbWV0YWtlbiAqIDEwMC4wKTsKLSAgICB9Ci0jaWZkZWYgTE9HCi0gIHsKLSAgICBleHRlcm4gaW50IHF1aWNrW107Ci0KLSAgICBmb3IgKGkgPSAwOyBxdWlja1tpXTsgaSsrKQotICAgICAgewotCWxvZ1txdWlja1tpXV0gKz0gMTAwMDAwOwotICAgICAgfQotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IDY0ICogMTAyNDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsb2dbaV0pCi0JewotCSAgcHJpbnRmICgiCQkJLyolN2QqLyAweCV4LFxuIiwgbG9nW2ldLCBpKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLX0KLQotaW50Ci1zaW1fdHJhY2UgKHNkKQotICAgICBTSU1fREVTQyBzZDsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmZmVyWzEwXTsKLSAgaW50IHI7Ci0KLSAgcHJpbnRmICgiXG4iKTsKLSAgZm9yIChyID0gMDsgciA8IDE2OyByKyspCi0gICAgewotICAgICAgaW50IG07Ci0KLSAgICAgIHByaW50ZiAoInIlMmQiLCByKTsKLSAgICAgIHByaW50ZiAoIj0lMDR4ICIsIGdldF93b3JkX3JlZyAoJnRoZV9zdGF0ZSwKLQkJCQkgICAgICByKSk7Ci0gICAgICBmb3IgKG0gPSAtNDsgbSA8IDg7IG0rKykKLQl7Ci0JICBpZiAobSA9PSAwKQotCSAgICBwcmludGYgKCI+Iik7Ci0JICBwcmludGYgKCIlMDR4ICIsCi0JCSAgZ2V0X3dvcmRfbWVtX2RhICgmdGhlX3N0YXRlLCAoMHhmZmZlICYgZ2V0X3dvcmRfcmVnICgmdGhlX3N0YXRlLCByKSkgKyBtICogMikpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIiU5ZCAlOWQgJTA4eCAiLCB0aGVfc3RhdGUuY3ljbGVzLAotCSAgdGhlX3N0YXRlLmluc3RzLCB0aGVfc3RhdGUuc29tZXRpbWVzX3BjKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGJ1ZmZlcltpXSA9IGdldF9ieXRlX21lbV9kYSAoJnRoZV9zdGF0ZSwKLQkJCQkgICB0aGVfc3RhdGUuc29tZXRpbWVzX3BjICsgaSk7Ci0gICAgfQotCi0gIHByaW50X2luc25fejgwMDEgKHRoZV9zdGF0ZS5zb21ldGltZXNfcGMsIGJ1ZmZlciwgc3Rkb3V0KTsKLSAgcHJpbnRmCi0gICAgKCJcbiIpOwotICB0bV9yZXN1bWUgKDEpOwotICBpZiAodGhlX3N0YXRlLmV4Y2VwdGlvbiAhPSBTSU1fU0lOR0xFX1NURVApCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi10bV9zdGF0ZSAoeCkKLSAgICAgc2ltX3N0YXRlX3R5cGUgKng7Ci17Ci0gICp4ID0gdGhlX3N0YXRlOwotfQotCi12b2lkCi10bV9leGNlcHRpb24gKHgpCi0gICAgIGludCB4OwotewotICB0aGVfc3RhdGUuZXhjZXB0aW9uID0geDsKLX0KLQotaW50Ci10bV9yZWFkX2J5dGUgKHgpCi0gICAgIGludCB4OwotewotICB4ICY9IDB4M2YwMGZmZmY7Ci0gIHJldHVybiBzaW1fcmVhZF9ieXRlICgmdGhlX3N0YXRlLCB4KTsKLX0KLQotdm9pZAotdG1fd3JpdGVfYnl0ZSAoeCwgeSkKLSAgICAgaW50IHgsIHk7Ci17Ci0gIHggJj0gMHgzZjAwZmZmZjsKLSAgc2ltX3dyaXRlX2J5dGUgKCZ0aGVfc3RhdGUsIHgsIHkpOwotfQotCi0jZGVmaW5lIFNJR04oeCkgKCh4KSAmIE1BU0spCi1ub3JtYWxfZmxhZ3NfMzIoY29udGV4dCxkLHNhLHNiLHN1YikKLXNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotdW5zaWduZWQgaW50IGQ7Ci11bnNpZ25lZCBpbnQgc2E7Ci11bnNpZ25lZCBpbnQgc2I7Ci11bnNpZ25lZCBpbnQgc3ViOwotewotI3VuZGVmIE1BU0sKLSNkZWZpbmUgTUFTSyAoMTw8MzEpCi0gIGNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7CQotICBpZiAoc3ViKSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFBTV19DQVJSWSA9IHNhIDwgc2I7IAkJCi0gIGVsc2UgCQkJCQotICAgIFBTV19DQVJSWSA9IGQgPCBzYTsgCQkKLSAgaWYgKHN1YikKLSAgICBQU1dfT1ZFUkZMT1cgPSAoU0lHTihzYSkgIT0gU0lHTihzYikpICYmIChTSUdOKGQpID09IFNJR04oc2IpKTsKLSAgZWxzZQotICAgIFBTV19PVkVSRkxPVyA9IChTSUdOKHNhKSA9PSBTSUdOKHNiKSkgJiYgKFNJR04oZCkgIT0gU0lHTihzYikpOwotCi0gIFBTV19TSUdOID0gKChpbnQpZCkgPDA7IAotICBQU1dfWkVSTyA9IGQgPT0gMDsKLX0KLQotbm9ybWFsX2ZsYWdzXzE2KGNvbnRleHQsZCxzYWwsc2JsLHN1YikKLXNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotdW5zaWduZWQgIGludCBkOwotdW5zaWduZWQgIGludCBzYWw7Ci11bnNpZ25lZCAgaW50IHNibDsKLXVuc2lnbmVkIHNob3J0IGludCBzdWI7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IHNhID0gc2FsOwotICB1bnNpZ25lZCBzaG9ydCBzYiA9IHNibDsKLSN1bmRlZiBNQVNLCi0jZGVmaW5lIE1BU0sgKDE8PDE1KQotICBjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSAwOwkKLSAgaWYgKHN1YikgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQU1dfQ0FSUlkgPSBzYWwgPCBzYmw7IAkJCi0gIGVsc2UgCQkJCi0gICAgUFNXX0NBUlJZID0gKGQgJiAweDEwMDAwKSAhPSAwOwotCi0gIGlmIChzdWIpCi0gICAgUFNXX09WRVJGTE9XID0gKFNJR04oc2EpICE9IFNJR04oc2IpKSAmJiAoU0lHTihkKSA9PSBTSUdOKHNiKSk7Ci0gIGVsc2UKLSAgICBQU1dfT1ZFUkZMT1cgPSAoU0lHTihzYSkgPT0gU0lHTihzYikpICYmIChTSUdOKGQpICE9IFNJR04oc2IpKTsKLQotICBQU1dfU0lHTiA9ICgoc2hvcnQgaW50KWQpIDwwOyAKLSAgUFNXX1pFUk8gPSAoKHNob3J0KWQpID09IDA7Ci19Ci0KLW5vcm1hbF9mbGFnc184KGNvbnRleHQsZCxzYSxzYixzdWIpCi1zaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLXVuc2lnbmVkIGNoYXIgZDsKLXVuc2lnbmVkIGNoYXIgc2E7Ci11bnNpZ25lZCBjaGFyIHNiOwotdW5zaWduZWQgY2hhciBzdWI7Ci17Ci0jdW5kZWYgTUFTSwotI2RlZmluZSBNQVNLICgxPDw3KQotICBjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSAwOwkKLSAgaWYgKHN1YikgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQU1dfQ0FSUlkgPSBzYSA8IHNiOyAJCQotICBlbHNlIAkJCQkKLSAgICBQU1dfQ0FSUlkgPSBkIDwgc2E7IAkJCi0gIGlmIChzdWIpCi0gICAgUFNXX09WRVJGTE9XID0gKFNJR04oc2EpICE9IFNJR04oc2IpKSAmJiAoU0lHTihkKSA9PSBTSUdOKHNiKSk7Ci0gIGVsc2UKLSAgICBQU1dfT1ZFUkZMT1cgPSAoU0lHTihzYSkgPT0gU0lHTihzYikpICYmIChTSUdOKGQpICE9IFNJR04oc2IpKTsKLSAgUFNXX1NJR04gPSAoKGNoYXIpZCkgPDA7IAotICBQU1dfWkVSTyA9IGQgPT0gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1pc19jb25kX3RydWUgKGNvbnRleHQsIGMpCi0gICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OwotICAgICBpbnQgYzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIFQ6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEY6Ci0gICAgICByZXR1cm4gMDsJCQkvKiBGICovCi0gICAgY2FzZSBMRToKLSAgICAgIHJldHVybiAoUFNXX1pFUk8gfCAoUFNXX1NJR04gXiBQU1dfT1ZFUkZMT1cpKSAmIDE7CS8qTEUgKi8KLSAgICBjYXNlIEdUOgotICAgICAgcmV0dXJuICh+KFBTV19aRVJPIHwgKFBTV19TSUdOIF4gUFNXX09WRVJGTE9XKSkpICYgMTsJLypHVCAqLwotICAgIGNhc2UgMHg1OgotICAgICAgcmV0dXJuIChQU1dfU0lHTiAmIDEpOwkvKiBzaWduICovCi0gICAgY2FzZSAweGQ6Ci0gICAgICByZXR1cm4gKH4oUFNXX1NJR04pKSAmIDE7CS8qIG5vdCBzaWduICovCi0gICAgY2FzZSAweDM6Ci0gICAgICByZXR1cm4gKChQU1dfQ0FSUlkgfCBQU1dfWkVSTykgJiAxKTsJLyogdWxlKi8KLSAgICBjYXNlIFVHVDoKLSAgICAgIHJldHVybiAoKH4oUFNXX0NBUlJZIHwgUFNXX1pFUk8pKSAmIDEpOwkvKiB1Z3QgKi8KLSAgICBjYXNlIDB4NDoKLSAgICAgIHJldHVybiAoUFNXX09WRVJGTE9XICYgMSk7Lyogb3ZlcmZsb3cgKi8KLSAgICBjYXNlIDB4YzoKLSAgICAgIHJldHVybiAofihQU1dfT1ZFUkZMT1cpKSAmIDE7CS8qIG5vdCBvdmVyZmxvdyAqLwotICAgIGNhc2UgTFQ6Ci0gICAgICByZXR1cm4gKFBTV19TSUdOIF4gUFNXX09WRVJGTE9XKSAmIDE7CS8qIExUICovCi0gICAgY2FzZSBHRToKLSAgICAgIHJldHVybiAofihQU1dfU0lHTiBeIFBTV19PVkVSRkxPVykpICYgMTsJLyogR0UgKi8KLSAgICBjYXNlIEVROgotICAgICAgcmV0dXJuIChQU1dfWkVSTykgJiAxOwkvKiB6ZXJvICovCi0gICAgY2FzZSBORToKLSAgICAgIHJldHVybiAoKH5QU1dfWkVSTykgJiAxKTsJLyogbm90IHplcm8gKi8KLSAgICBjYXNlIDB4NzoKLSAgICAgIHJldHVybiAoUFNXX0NBUlJZKSAmIDE7CS8qIGNhcnJ5ICovCi0gICAgY2FzZSAweGY6Ci0gICAgICByZXR1cm4gKH5QU1dfQ0FSUlkpICYgMTsJLyogbm90IGNhcnJ5ICovCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotaW50Ci1DT05EIChjb250ZXh0LCBjKQotICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChjID09IDgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogV2UgY2FuIGNhbGN1bGF0ZSB3aGF0IHRoZSBmbGFncyB3b3VsZCBoYXZlIGJlZW4gYnkKLSAgICAgbG9va2luZyBhdCB0aGUgc3JjIGFuZCBkc3QgYW5kIHNpemUgb2YgdGhlIG9wZXJhdGlvbiAqLwotCi0gIGlmIChjb250ZXh0LT5icm9rZW5fZmxhZ3MpCi0gICAgewotICAgICAgaW50IHNsb3cgPSAwOwotICAgICAgaW50IHNpemU7Ci0gICAgICBpbnQgZHN0OwotICAgICAgaW50IHNyY2E7Ci0gICAgICBpbnQgc3JjYjsKLSAgICAgIGludCBtYXNrOwotICAgICAgaW50IGFuczsKLQotICAgICAgLyogc2VlIGlmIHdlIGNhbiBzaG9ydC1jdXQgdGhlIG5hc3R5IGZsYWcgY2FsY3MgKi8KLQotICAgICAgc3dpdGNoIChzaXplID0gY29udGV4dC0+c2l6ZSkKLQl7Ci0JIGRlZmF1bHQ6Ci0JICBhYm9ydCgpOwotCSAgcmV0dXJuIDA7Ci0JY2FzZSA4OgotCSAgc3JjYSA9IChjaGFyKSAoY29udGV4dC0+c3JjYSk7Ci0JICBzcmNiID0gKGNoYXIpIChjb250ZXh0LT5zcmNiKTsKLQkgIGRzdCA9IChjaGFyKSAoY29udGV4dC0+ZHN0KTsKLQkgIG1hc2sgPSAweGZmOwotCSAgYnJlYWs7Ci0JY2FzZSAxNjoKLQkgIHNyY2EgPSAoc2hvcnQpIChjb250ZXh0LT5zcmNhKTsKLQkgIHNyY2IgPSAoc2hvcnQpIChjb250ZXh0LT5zcmNiKTsKLQkgIGRzdCA9IChzaG9ydCkgKGNvbnRleHQtPmRzdCk7Ci0JICBtYXNrID0gMHhmZmZmOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIHNyY2EgPSAobG9uZykgKGNvbnRleHQtPnNyY2EpOwotCSAgc3JjYiA9IChsb25nKSAoY29udGV4dC0+c3JjYik7Ci0JICBkc3QgPSAobG9uZykgKGNvbnRleHQtPmRzdCk7Ci0JICBtYXNrID0gMHhmZmZmZmZmZjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIFQ6Ci0JICByZXR1cm4gMTsKLQljYXNlIEY6Ci0JICByZXR1cm4gMDsKLQljYXNlIEVROgotCSAgcmV0dXJuICFkc3Q7Ci0JY2FzZSBORToKLQkgIHJldHVybiBkc3Q7Ci0JY2FzZSBHVDoKLQkgIGFucyA9ICgoZHN0KSkgPiAwOwotCSAgaWYgKHNsb3cpCi0JICAgIHsKLQkgICAgICBpZiAoaXNfY29uZF90cnVlIChjb250ZXh0LCBjKSAhPSBhbnMpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0JICByZXR1cm4gYW5zOwotCWNhc2UgTEU6Ci0JICBhbnMgPSAoKGRzdCkpIDw9IDA7Ci0JICBpZiAoc2xvdykKLQkgICAgewotCSAgICAgIGlmIChpc19jb25kX3RydWUgKGNvbnRleHQsIGMpICE9IGFucykKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQkgIHJldHVybiBhbnM7Ci0JY2FzZSBHRToKLQkgIGFucyA9ICgoZHN0KSkgPj0gMDsKLQkgIGlmIChzbG93KQotCSAgICB7Ci0JICAgICAgaWYgKGlzX2NvbmRfdHJ1ZSAoY29udGV4dCwgYykgIT0gYW5zKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCSAgcmV0dXJuIGFuczsKLQljYXNlIExUOgotCSAgYW5zID0gKChkc3QpKSA8IDA7Ci0JICBpZiAoc2xvdykKLQkgICAgewotCSAgICAgIGlmIChpc19jb25kX3RydWUgKGNvbnRleHQsIGMpICE9IGFucykKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQkgIHJldHVybiBhbnM7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2FuJ3QgZmFrZSBpdCwgd2UnbGwgaGF2ZSB0byB3b3JrIG91dCB0aGUgZmxhZ3MgdGhlCi0gICAgICAgICBoYXJkIHdheSAqLwotCi0gICAgICBtYWtlZmxhZ3MgKGNvbnRleHQsIG1hc2spOwotICAgIH0KLQotICAvKiBkb24ndCBrbm93IGhvdyB0byBmYWtlIGEgdGVzdCwgaW5zcGVjdCB0aGUgZmxhZ3MKLSAgICAgdGhlIGhhcmQgd2F5ICovCi0KLSAgcmV0dXJuIGlzX2NvbmRfdHJ1ZSAoY29udGV4dCwgYyk7Ci19CmRpZmYgLS1naXQgYS9zaW0vejhrL3N5c2NhbGwuaCBiL3NpbS96OGsvc3lzY2FsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODljZDVmLi4wMDAwMDAwCi0tLSBhL3NpbS96OGsvc3lzY2FsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogc3lzdGVtIGNhbGwgbnVtYmVycwotICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KLQotWjhLU0lNIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotWjhLU0lNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lCVNZU19leGl0CTEKLSNkZWZpbmUJU1lTX2ZvcmsJMgotI2RlZmluZQlTWVNfcmVhZAkzCi0jZGVmaW5lCVNZU193cml0ZQk0Ci0jZGVmaW5lCVNZU19vcGVuCTUKLSNkZWZpbmUJU1lTX2Nsb3NlCTYKLSNkZWZpbmUJU1lTX3dhaXQ0CTcKLSNkZWZpbmUJU1lTX2NyZWF0CTgKLSNkZWZpbmUJU1lTX2xpbmsJOQotI2RlZmluZQlTWVNfdW5saW5rCTEwCi0jZGVmaW5lCVNZU19leGVjdgkxMQotI2RlZmluZQlTWVNfY2hkaXIJMTIKLSNkZWZpbmUJU1lTX21rbm9kCTE0Ci0jZGVmaW5lCVNZU19jaG1vZAkxNQotI2RlZmluZQlTWVNfY2hvd24JMTYKLSNkZWZpbmUJU1lTX2xzZWVrCTE5Ci0jZGVmaW5lCVNZU19nZXRwaWQJMjAKLSNkZWZpbmUgU1lTX2lzYXR0eSAgICAgIDIxCi0jZGVmaW5lIFNZU19mc3RhdCAgICAgICAyMgotI2RlZmluZSBTWVNfdGltZSAJMjMKLQotCi0jZGVmaW5lIFNZU19BUkcJCTI0CmRpZmYgLS1naXQgYS9zaW0vejhrL3Rjb25maWcuaW4gYi9zaW0vejhrL3Rjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzBjMzIuLjAwMDAwMDAKLS0tIGEvc2ltL3o4ay90Y29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogejhrIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KLSAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgotICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KLS8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCi0gICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KLSAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLwotLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay90bS5oIGIvc2ltL3o4ay90bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTI3ZmY5Li4wMDAwMDAwCi0tLSBhL3NpbS96OGsvdG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiB0bS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQotCi1aOEtTSU0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1aOEtTSU0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9UTV9ICi0jZGVmaW5lIF9UTV9ICi0KLSNpZmRlZiBfX0ZPT0JFWUdOVUNfXwotdHlwZWRlZiBTRnR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNGKSkpOwotdHlwZWRlZiBERnR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERGKSkpOwotCi10eXBlZGVmIGludCBISXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKEhJKSkpOwotdHlwZWRlZiBpbnQgU0l0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUhJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVU0l0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKLSNlbHNlCi10eXBlZGVmIGZsb2F0IFNGdHlwZTsKLXR5cGVkZWYgZG91YmxlIERGdHlwZTsKLXR5cGVkZWYgc2hvcnQgaW50IEhJdHlwZTsKLXR5cGVkZWYgbG9uZyBpbnQgU0l0eXBlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSEl0eXBlIDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUgOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IFVESXN0cnVjdAotewotICBVU0l0eXBlIGhpZ2g7Ci0gIFVTSXR5cGUgbG93OwotfSBVREl0eXBlOwotCi0jZGVmaW5lIEJJR19FTkRJQU5fSE9TVAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2ltX3BoeXNfYWRkcl90eXBlOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2ltX2xvZ2ljYWxfYWRkcl90eXBlOwotCi0jZGVmaW5lIFBBR0VfUE9XRVIgMjMJCS8qICBvbmx5IG9uZSBwYWdlcyAqLwotCi0jZGVmaW5lIE1BUF9QSFlTSUNBTF9UT19MT0dJQ0FMKHgpICAoKCh4ID4+IDgpICYgMHg3ZjAwMDApIHwgKHggJiAweGZmZmYpKQotI2RlZmluZSBNQVBfTE9HSUNBTF9UT19QSFlTSUNBTCh4KSAgKCgoeCA8PDgpICYgMHg3ZjAwMDAwMCkgfCAoeCAmIDB4ZmZmZikpCi0jZGVmaW5lIFJFR19QQyAgICAgMTcKLSNkZWZpbmUgUkVHX0NZQ0xFUyAxOAotI2RlZmluZSBSRUdfSU5TVFMgIDE5Ci0jZGVmaW5lIFJFR19USU1FICAgMjAKLSNkZWZpbmUgUkVHX0ZQICAgICAyMQotI2RlZmluZSBSRUdfU1AgICAgIDIyCi0jZGVmaW5lIFJFR19DQ1IgICAgMTYKLQotI2RlZmluZSBTRVRfUkVHKHgseSkgIHNldF9yZWcoeCx5KQotI2RlZmluZSBTSU5HTEVfU1RFUCAxCi0KLSNkZWZpbmUgUFNXX0NBUlJZIGNvbnRleHQtPmNhcnJ5Ci0jZGVmaW5lIFBTV19PUCAgICBjb250ZXh0LT5vcAotI2RlZmluZSBQU1dfT1ZFUkZMT1cgY29udGV4dC0+b3ZlcmZsb3cKLSNkZWZpbmUgUFNXX1NJR04gY29udGV4dC0+c2lnbgotI2RlZmluZSBQU1dfWkVSTyBjb250ZXh0LT56ZXJvCi0jZGVmaW5lIEdFVF9QQygpICBjb250ZXh0LT5wYwotI2RlZmluZSBTRVRfUEMoeCkgY29udGV4dC0+cGMgPSB4Ci0KLXN0cnVjdCBvcF9pbmZvCi17Ci0gIHNob3J0IGludCBleGVjOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBvcF9pbmZvIG9wX2luZm9fdGFibGVbXTsKLQotdHlwZWRlZiB1bmlvbgotewotICB1bnNpZ25lZCBzaG9ydCBpbnQgd29yZDsKLQotfQotCi1ib3J3X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHN0YXRlX3N0cnVjdAotewotICB1bnNpZ25lZCBzaG9ydCAqbWVtb3J5OwotICBpbnQgY2Fycnk7Ci0gIGludCBzaWduOwotICBpbnQgemVybzsKLSAgaW50IG92ZXJmbG93OwotICBpbnQgb3A7Ci0gIGludCBjeWNsZXM7Ci0KLSAgYm9yd190eXBlIHJlZ3NbMTZdOwotCi0gIHNpbV9waHlzX2FkZHJfdHlwZSBzb21ldGltZXNfcGM7Ci0jaWZkZWYgX19HTlVDX18KLSAgdm9sYXRpbGUKLSNlbmRpZgotICBpbnQgZXhjZXB0aW9uOwotCi0jZGVmaW5lIGl3b3Jkc18wICBpd29yZHMwCi0jZGVmaW5lIGl3b3Jkc18xICBpd29yZHMxCi0jZGVmaW5lIGl3b3Jkc18yICBpd29yZHMyCi0jZGVmaW5lIGl3b3Jkc18zICBpd29yZHMzCi0KLSNkZWZpbmUgaWJ5dGVzXzAgICAgKGl3b3Jkc18wPj44KQotI2RlZmluZSBpYnl0ZXNfMSAgICAoaXdvcmRzXzAmMHhmZikKLSNkZWZpbmUgaWJ5dGVzXzIgICAgKGl3b3Jkc18xPj44KQotI2RlZmluZSBpYnl0ZXNfMyAgICAoaXdvcmRzXzEmIDB4ZmYpCi0jZGVmaW5lIGlieXRlc180ICAgIChpd29yZHNfMj4+OCkKLQotICBpbnQgaW5zdHM7Ci0gIGludCB0aWNrczsKLQotICBpbnQgbmV4dF9pbnN0OwotICBpbnQgYnJva2VuX2ZsYWdzOwotCi0gIGludCBzcmNhOwotICBpbnQgc3JjYjsKLSAgaW50IGRzdDsKLSAgaW50IHNpemU7Ci19Ci0KLXNpbV9zdGF0ZV90eXBlOwotCi0jZGVmaW5lIENNUF9GTEFHUyAxMDAKLSNkZWZpbmUgVFNUX0ZMQUdTIDEwMQotI2VuZGlmCi0KLWV4dGVybiBpbnQgZ2V0X3dvcmRfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBhZGRyKSk7IAotZXh0ZXJuIGludCBnZXRfd29yZF9yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLWV4dGVybiB2b2lkIHN1cHBvcnRfY2FsbCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgc2MpKTsgCi1leHRlcm4gdm9pZCB0bV9leGNlcHRpb24gUEFSQU1TKChpbnQgeCkpOyAKLWV4dGVybiBpbnQgdG1fcmVhZF9ieXRlIFBBUkFNUygoaW50IHgpKTsgCi1leHRlcm4gaW50IHRtX3NpZ25hbCBQQVJBTVMoKHZvaWQpKTsgCi1leHRlcm4gdm9pZCB0bV9zdGF0ZSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICp4KSk7IAotZXh0ZXJuIHZvaWQgdG1fd3JpdGVfYnl0ZSBQQVJBTVMoKGludCB4LCBpbnQgeSkpOyAKLWV4dGVybiB2b2lkIGJmb3BfYmFkMSBQQVJBTVMoKCkpOyAKLWV4dGVybiBpbnQgZmFpbCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgdikpOyAKLWV4dGVybiB2b2lkIGZvcF9iYWQgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCkpOyAKLWV4dGVybiB2b2lkIHNmb3BfYmFkMSBQQVJBTVMoKCkpOyAKLWV4dGVybiB2b2lkIHN3YXBfbG9uZyBQQVJBTVMoKGNoYXIgKmJ1ZiwgaW50IHZhbCkpOyAKLWV4dGVybiB2b2lkIHN3YXBfd29yZCBQQVJBTVMoKGNoYXIgKmJ1ZiwgaW50IHZhbCkpOyAKLWV4dGVybiB2b2lkIHRtX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUygoaW50IHJlZ25vLCBjaGFyICpidWYpKTsgCi1leHRlcm4gdm9pZCB0bV9pbmZvX3ByaW50IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKngpKTsgCi1leHRlcm4gdm9pZCB0bV9yZXN1bWUgUEFSQU1TKChpbnQgc3RlcCkpOyAKLWV4dGVybiB2b2lkIHRtX3N0b3JlX3JlZ2lzdGVyIFBBUkFNUygoaW50IHJlZ25vLCBpbnQgdmFsdWUpKTsgCi0KLQotI2lmbmRlZiBfX0dOVUNfXwotLyogSWYgd2VyZSB1c2luZyBnbnVjIHRoZW4gdGhlc2Ugd2lsbCBiZSBpbmxpbmVkLCBzbyB0aGUgcHJvdG90eXBlcyAKLSB3b24ndCBiZSByaWdodCAqLwotbG9uZyBpbnQgc2l0b3B0ciBQQVJBTVMoKGxvbmcgaW50IHNpKSk7IAotbG9uZyBpbnQgcHRydG9zaSBQQVJBTVMoKGxvbmcgaW50IHB0cikpOyAKLXZvaWQgcHV0X2xvbmdfcmVnIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWwpKTsgCi12b2lkIHB1dF9xdWFkX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnLCBpbnQgdmFsMSwgaW50IHZhbDIpKTsgCi12b2lkIHB1dF93b3JkX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnLCBpbnQgdmFsKSk7IAotU0l0eXBlIGdldF9sb25nX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAotdm9pZCBwdXRfYnl0ZV9yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbCkpOyAKLWludCBnZXRfYnl0ZV9yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLXZvaWQgcHV0X3dvcmRfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBhZGRyLCBpbnQgdmFsdWUpKTsgCi11bnNpZ25lZCBjaGFyIGdldF9ieXRlX21lbV9kYSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYWRkcikpOyAKLXZvaWQgcHV0X2J5dGVfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBhZGRyLCBpbnQgdmFsdWUpKTsgCi1TSXR5cGUgZ2V0X2xvbmdfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBhZGRyKSk7IAotdm9pZCBwdXRfbG9uZ19tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGFkZHIsIGludCB2YWx1ZSkpOyAKLWludCBnZXRfd29yZF9tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLXZvaWQgcHV0X3dvcmRfbWVtX2lyIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLWludCBnZXRfYnl0ZV9tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLXZvaWQgcHV0X2J5dGVfbWVtX2lyIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLWludCBnZXRfbG9uZ19tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLXZvaWQgcHV0X2xvbmdfbWVtX2lyIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLXZvaWQgcHV0X2xvbmdfbWVtX3ggUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGJhc2UsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLXZvaWQgcHV0X3dvcmRfbWVtX3ggUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGJhc2UsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLXZvaWQgcHV0X2J5dGVfbWVtX3ggUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGJhc2UsIGludCByZWcsIGludCB2YWx1ZSkpOyAKLWludCBnZXRfd29yZF9tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZykpOyAKLWludCBnZXRfYnl0ZV9tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZykpOyAKLWludCBnZXRfbG9uZ19tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZykpOyAKLWludCBDT05EIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBjKSk7IAotdm9pZCBOT1JNQUxfRkxBR1MgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHNpemUsIGludCBkc3QsIGludCBzcmNhLCBpbnQgc3JjYikpOyAKLXZvaWQgVEVTVF9OT1JNQUxfRkxBR1MgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHNpemUsIGludCBkc3QpKTsgCi12b2lkIHB1dF9wdHJfbG9uZ19yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbCkpOyAKLWxvbmcgaW50IGdldF9wdHJfbG9uZ19yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLWxvbmcgaW50IGdldF9wdHJfbG9uZ19tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZykpOyAKLWxvbmcgaW50IGdldF9wdHJfbG9uZ19tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgbG9uZyBpbnQgYWRkcikpOyAKLXZvaWQgcHV0X3B0cl9sb25nX21lbV9kYSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBsb25nIGludCBhZGRyLCBsb25nIGludCBwdHIpKTsgCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS96OGsvd3JpdGVjb2RlLmMgYi9zaW0vejhrL3dyaXRlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRjODY4Li4wMDAwMDAwCi0tLSBhL3NpbS96OGsvd3JpdGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDExICswLDAgQEAKLQotLyogZ2VuZXJhdGUgaW5zdHJ1Y3Rpb25zIGZvciBaOEtTSU0KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCi0KLVo4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVo4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgdGhlIGNvZGUgd2hpY2ggZW11bGF0ZXMgZWFjaCBvZiB0aGUgejhrCi0gICBpbnN0cnVjdGlvbnMKLQotICAgY29kZSBnb2VzIGludG8gdGhyZWUgZmlsZXMsIHRjLWdlbjEuaCwgdGMtZ2VuMi5oIGFuZCB0Yy1nZW4zLmguCi0gICB3aGljaCBmaWxlIGJlaW5nIG1hZGUgZGVwZW5kcyB1cG9uIHRoZSBvcHRpb25zCi0KLSAgIC0xICB0Yy1nZW4xLmggY29udGFpbnMgdGhlIGZ1bGx5IGV4cGFuZGVkIGNvZGUgZm9yIHNvbWUgc2VsZWN0ZWQKLSAgICAgICBvcGNvZGVzLCAodGhvc2UgaW4gdGhlIHF1aWNrLmMgbGlzdCkKLQotICAgLTIgICB0Yy1nZW4yLmggY29udGFpbnMgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgb25lIGZvciBlYWNoCi0gICBvcGNvZGUuICBJdCBwb2ludHMgdG8gZnVuY3Rpb25zIGluIHRjLWdlbjMuaCBhbmQgdGMtZ2VuMS5oCi0gICBkZXBlbmRpbmcgdXBvbiBxdWljay5jCi0KLSAgIC0zICAgdGMtZ2VuMy5oIGNvbnRhaW5zIGFsbCB0aGUgb3Bjb2RlcyBpbiB1bmV4cGFuZGVkIGZvcm0uCi0KLSAgIC1iMyAgIHRjLWdlbmIzLmggc2FtZSBhcyAtMyBidXQgZm9yIGxvbmcgcG9pbnRlcnMKLQotICAgLW0gIHJlZ2VuZXJhdGVzIGxpc3QuYywgd2hpY2ggaXMgYW4gaW52ZXJ0ZWQgbGlzdCBvZiBvcGNvZGVzIHRvCi0gICAgICAgcG9pbnRlcnMgaW50byB0aGUgejhrIGRpc3Nhc3NlbWJsZSBvcGNvZGUgdGFibGUsIGl0J3MganVzdCB0aGVyZQotICAgICAgIHRvIG1ha2VzIHRoaW5ncyBmYXN0ZXIuCi0gICAqLwotCi0vKiBzdGV2ZSBjaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIE5JQ0VOQU1FUwotCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIi4uL29wY29kZXMvejhrLW9wYy5oIgotCi0jZGVmaW5lIE5PUFMgNTAwCi0KLSNkZWZpbmUgRElSVFlfSEFDSyAwIC8qIEVuYWJsZSBpZiB5b3VyIGdjYyBjYW4ndCBjb3BlIHdpdGggaHVnZSB0YWJsZXMgKi8KLWV4dGVybiBzaG9ydCB6OGtfaW52X2xpc3RbXTsKLXN0cnVjdCBvcGNvZGVfdmFsdWUKLXsKLSAgaW50IG47Ci0gIHN0cnVjdCBvcGNvZGVfdmFsdWUgKm5leHQ7Ci19OwotCi0jZGVmaW5lIE5JQ0VOQU1FUwotaW50IEJJRzsKLQotc3RhdGljIGNoYXIgKnJlZ19uYW1lc1tdID0KLXsiYmFkIiwgInNyYyIsICJkc3QiLCAiYXV4X2EiLCAiYXV4X2IiLCAiYXV4X3IiLCAiYXV4X3gifTsKLQotI2RlZmluZSBJU19EU1QoeCkgKCh4ICYgMHhmKSA9PSAyKQotI2RlZmluZSBJU19TUkMoeCkgKCh4ICYgMHhmKT09MSkKLSNkZWZpbmUgU0laRV9BRERSRVNTIChCSUcgPyA4IDogNCkJLyogbnVtYmVyIG9mIG5pYmJsZXMgaW4gYSBwdHIqLwotCi1zdGF0aWMgaW50IGZpbGU7Ci1zdGF0aWMgaW50IG1ha2VsaXN0OwotCi1zdGF0aWMgaW50IG5pYnMgPSAwOwotCi1zdGF0aWMgY2hhciAqY3VycmVudF9zaXplOwotc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKLXN0YXRpYyBjaGFyIGN1cnJlbnRfd29yZDBbNDBdOwotc3RhdGljIGNoYXIgY3VycmVudF9ieXRlMFs0MF07Ci1zdGF0aWMgY2hhciBjdXJyZW50X2J5dGUxWzQwXTsKLXN0YXRpYyBpbnQgaW5kZW50Owotc3RhdGljIGNoYXIgKnA7Ci1zdGF0aWMgY2hhciAqZDsKLQotc3RydWN0IG9wY29kZV92YWx1ZSAqbGlzdFtOT1BTXTsKLQotc3RhdGljIG9wY29kZV9lbnRyeV90eXBlICoKLWxvb2t1cF9pbnN0ICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgaWYgKG1ha2VsaXN0KQotICAgIHsKLQotICAgICAgaW50IG5pYmxfaW5kZXg7Ci0gICAgICBpbnQgbmlibF9tYXRjaGVkOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLSAgICAgIGNoYXIgaW5zdHJfbmliYmxlc1s4XTsKLQotICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnB0ciA9IHo4a190YWJsZTsKLQotICAgICAgbmlibF9tYXRjaGVkID0gMDsKLQotICAgICAgaW5zdHJfbmliYmxlc1szXSA9ICh3aGF0ID4+IDApICYgMHhmOwotICAgICAgaW5zdHJfbmliYmxlc1syXSA9ICh3aGF0ID4+IDQpICYgMHhmOwotICAgICAgaW5zdHJfbmliYmxlc1sxXSA9ICh3aGF0ID4+IDgpICYgMHhmOwotICAgICAgaW5zdHJfbmliYmxlc1swXSA9ICh3aGF0ID4+IDEyKSAmIDB4ZjsKLQotICAgICAgd2hpbGUgKHB0ci0+bmFtZSkKLQl7Ci0JICBuaWJsX21hdGNoZWQgPSAxOwotCSAgZm9yIChuaWJsX2luZGV4ID0gMDsgbmlibF9pbmRleCA8IDQgJiYgbmlibF9tYXRjaGVkOyBuaWJsX2luZGV4KyspCi0JICAgIHsKLQkgICAgICBpbnN0cl9uaWJsID0gaW5zdHJfbmliYmxlc1tuaWJsX2luZGV4XTsKLQotCSAgICAgIHRhYmxfZGF0dW0gPSBwdHItPmJ5dGVfaW5mb1tuaWJsX2luZGV4XTsKLQkgICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotCSAgICAgIGRhdHVtX3ZhbHVlID0gfkNMQVNTX01BU0sgJiB0YWJsX2RhdHVtOwotCi0JICAgICAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQkJewotCQljYXNlIENMQVNTX0JJVF8xT1IyOgotCQkgIGlmIChkYXR1bV92YWx1ZSAhPSAoaW5zdHJfbmlibCAmIH4weDIpKQotCQkgICAgbmlibF9tYXRjaGVkID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlIENMQVNTX0JJVDoKLQkJICBpZiAoZGF0dW1fdmFsdWUgIT0gaW5zdHJfbmlibCkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMDBJSToKLQkJICBpZiAoISgofmluc3RyX25pYmwpICYgMHg0KSkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMDFJSToKLQkJICBpZiAoIShpbnN0cl9uaWJsICYgMHg0KSkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMENDQzoKLQkJICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMUNDQzoKLQkJICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMERJU1A3OgotCQkgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDgpKQotCQkgICAgbmlibF9tYXRjaGVkID0gMDsKLQkJICBuaWJsX2luZGV4ICs9IDE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfMURJU1A3OgotCQkgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQotCQkgICAgbmlibF9tYXRjaGVkID0gMDsKLQkJICBuaWJsX2luZGV4ICs9IDE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JCSAgaWYgKGluc3RyX25pYmwgPT0gMCkKLQkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG5pYmxfbWF0Y2hlZCkKLQkgICAgewotCSAgICAgIHJldHVybiBwdHI7Ci0JICAgIH0KLQkgIHB0cisrOwotCX0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLQotICAgICAgaWYgKHo4a19pbnZfbGlzdFt3aGF0XSA8IDApCi0JcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gejhrX3RhYmxlICsgejhrX2ludl9saXN0W3doYXRdOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotaW5zbl80IChuKQotICAgICBpbnQgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gIigoaXdvcmRzXzA+PjgpICYgMHhmKSI7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuICIoKGlieXRlc18xID4+IDQpICYgMHhmKSI7Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuICIoKGlieXRlc18xKSAmIDB4ZikiOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiAiKChpYnl0ZXNfMj4+NCkgJiAweGYpIjsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gIigoaWJ5dGVzXzIpICYgMHhmKSI7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuICIoKGlieXRlc18zID4+IDQpICYgMHhmKSI7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuICIoKGlieXRlc18zKSAmIDB4ZikiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIioqKioiOwotICAgIH0KLX0KLQotY2hhciAqCi1wdHJfbW9kZSAoKQotewotICBpZiAoQklHKQotICAgIHsKLSAgICAgIHJldHVybiAicHRyX2xvbmciOwotICAgIH0KLSAgcmV0dXJuICJ3b3JkIjsKLX0KLQotc3RhdGljCi1jaGFyICoKLXB0cl9zaXplICgpCi17Ci0gIGlmIChCSUcpCi0gICAgcmV0dXJuICI0IjsKLSAgcmV0dXJuICIyIjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVnX24gKHgpCi0gICAgIHVuc2lnbmVkIGludCB4OwotewotICByZXR1cm4gcmVnX25hbWVzW3ggJiAweGZdOwotfQotCi1jaGFyICoKLXN0YWNrX3B0ciAoKQotewotICByZXR1cm4gQklHID8gIjE0IiA6ICIxNSI7Ci19Ci0KLWNoYXIgKgotbWVtICgpCi17Ci0jaWYgMAotICByZXR1cm4gQklHID8gInNlZ21lbSIgOiAidW5zZWdtZW0iOwotI2Vsc2UKLSAgcmV0dXJuICJtZW0iOwotI2VuZGlmCi19Ci0KLWludAotbWF0Y2ggKGEpCi0gICAgIGNoYXIgKmE7Ci17Ci0gIGlmIChzdHJuY21wIChwLCBhLCBzdHJsZW4gKGEpKSA9PSAwKQotICAgIHsKLSAgICAgIHAgKz0gc3RybGVuIChhKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotdm9pZAotc3ViICh5KQotICAgICBjaGFyICp5OwotewotICBzcHJpbnRmIChkLCAiJXMiLCB5KTsKLSAgZCArPSBzdHJsZW4gKGQpOwotfQotCi1zdGF0aWMgY2hhciAqCi1pbnNuXzE2IChuKQotICAgICBpbnQgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIihpd29yZHNfMCkiOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiAiKGl3b3Jkc18xKSI7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuICIoaXdvcmRzXzIpIjsKLSAgICBjYXNlIDEyOgotICAgICAgcmV0dXJuICIoaXdvcmRzXzMpIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIqKioqIjsKLSAgICB9Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1pbnNuXzMyIChuKQotICAgICBpbnQgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIigoaXdvcmRzXzA8PDE2KSB8IChpd29yZHNfMSkpIjsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gIigoaXdvcmRzXzE8PDE2KSB8IChpd29yZHNfMikpIjsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gIigoaXdvcmRzXzI8PDE2KSB8IChpd29yZHNfMykpIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIqKioqIjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNpemVfbmFtZSAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHN3aXRjaCAoeCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICBjYXNlIDE2OgotICAgICAgcmV0dXJuICJ3b3JkIjsKLSAgICBjYXNlIDMyOgotICAgICAgcmV0dXJuICJsb25nIjsKLSAgICBjYXNlIDY0OgotICAgICAgcmV0dXJuICJxdWFkIjsKLSAgICB9Ci0gIHJldHVybiAiISEiOwotfQotCi0vKlZBUkFSR1MqLwotdm9pZAotZW1pdCAoc3RyaW5nLCBhMSwgYTIsIGEzLCBhNCwgYTUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciogYTE7Ci0gICAgIGNoYXIqIGEyOwotICAgICBjaGFyKiBhMzsKLSAgICAgY2hhciogYTQ7Ci0gICAgIGNoYXIqIGE1OwotewotICBpbnQgaW5kZW50X2luYyA9IDA7Ci0gIGludCBpbmRlbnRfZGVjID0gMDsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmZmVyWzEwMDBdOwotCi0gIGQgPSBidWZmZXI7Ci0gIHAgPSBzdHJpbmc7Ci0KLSAgd2hpbGUgKCpwKQotICAgIHsKLSAgICAgIGlmIChtYXRjaCAoIjxmb3A+IikpCi0JewotCSAgaWYgKEJJRykKLQkgICAgewotCSAgICAgIHN1YiAoImJmb3AiKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ViICgic2ZvcCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8aXB0cj4iKSkKLQl7Ci0JICBpZiAoQklHKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChuaWJzKQotCQl7Ci0JCWNhc2UgNDoKLQkJICBzdWIgKCIoKChpd29yZHNfMSA8PCA4KSB8IChpd29yZHNfMikpICYgMHg3ZmZmZmYpIik7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgc3ViICgiZmFpbChjb250ZXh0LDEyNCkiKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKG5pYnMpCi0JCXsKLQkJY2FzZSA0OgotCQkgIHN1YiAoIml3b3Jkc18xIik7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgc3ViICgiZmFpbChjb250ZXh0LDEyMykiKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8bmFtZT4iKSkKLQl7Ci0JICBzdWIgKGN1cnJlbnRfbmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8c2l6ZT4iKSkKLQl7Ci0JICBzdWIgKGN1cnJlbnRfc2l6ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8aW5zbl80PiIpKQotCXsKLQkgIHN1YiAoaW5zbl80IChuaWJzKSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8aW5zbl8xNj4iKSkKLQl7Ci0JICBzdWIgKGluc25fMTYgKG5pYnMpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtYXRjaCAoIjxpbnNuXzMyPiIpKQotCXsKLQkgIHN1YiAoaW5zbl8zMiAobmlicykpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoICgiaXdvcmRzXzAiKSkKLQl7Ci0JICBzdWIgKGN1cnJlbnRfd29yZDApOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoICgiaWJ5dGVzXzAiKSkKLQl7Ci0JICBzdWIgKGN1cnJlbnRfYnl0ZTApOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGlieXRlc18xPiIpKQotCXsKLQkgIHN1YiAoY3VycmVudF9ieXRlMSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8bmV4dF9zaXplPiIpKQotCXsKLQkgIGlmIChzdHJjbXAgKGN1cnJlbnRfc2l6ZSwgIndvcmQiKSA9PSAwKQotCSAgICBzdWIgKCJsb25nIik7Ci0JICBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJieXRlIikgPT0gMCkKLQkgICAgc3ViICgid29yZCIpOwotCSAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJsb25nIikgPT0gMCkKLQkgICAgc3ViICgicXVhZCIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtYXRjaCAoIjxhZGRyX3R5cGU+IikpCi0JewotCSAgaWYgKEJJRykKLQkgICAgc3ViICgidW5zaWduZWQgbG9uZyIpOwotCSAgZWxzZQotCSAgICBzdWIgKCJ1bnNpZ25lZCBzaG9ydCIpOwotCX0KLQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8Y19zaXplPiIpKQotCXsKLQkgIGlmIChzdHJjbXAgKGN1cnJlbnRfc2l6ZSwgIndvcmQiKSA9PSAwKQotCSAgICBzdWIgKCJzaG9ydCIpOwotCSAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJieXRlIikgPT0gMCkKLQkgICAgc3ViICgiY2hhciIpOwotCSAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJsb25nIikgPT0gMCkKLQkgICAgc3ViICgibG9uZyIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKG1hdGNoICgiPHBjPiIpKQotCXsKLQkgIHN1YiAoInBjIik7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8bWVtPiIpKQotCXsKLQkgIHN1YiAobWVtICgpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtYXRjaCAoIjxzcD4iKSkKLQl7Ci0JICBzdWIgKHN0YWNrX3B0ciAoKSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8cHRyX3NpemU+IikpCi0JewotCSAgc3ViIChwdHJfc2l6ZSAoKSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8cHRyX21vZGU+IikpCi0JewotCSAgc3ViIChwdHJfbW9kZSAoKSk7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8aW5zbl84PiIpKQotCXsKLQkgIHN3aXRjaCAobmlicykKLQkgICAgewotCSAgICBjYXNlIDI6Ci0JICAgICAgc3ViICgiKGl3b3Jkc18wJjB4ZmYpIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkgICAgICBzdWIgKCIoaXdvcmRzXzE+PjgpIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkgICAgICBzdWIgKCIoaXdvcmRzXzEmMHhmZikiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA4OgotCSAgICAgIHN1YiAoIihpd29yZHNfMj4+OCkiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxMjoKLQkgICAgICBzdWIgKCIoLyogV0hPICovaXdvcmRzXzMmMHhmZikiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKnAgPT0gJ3snKQotCSAgICBpbmRlbnRfaW5jKys7Ci0JICBpZiAoKnAgPT0gJ30nKQotCSAgICBpbmRlbnRfZGVjKys7Ci0JICAqZCsrID0gKnA7Ci0JICBwKys7Ci0JfQotICAgIH0KLSAgKmQrKyA9IDA7Ci0gIGluZGVudCAtPSBpbmRlbnRfZGVjOwotICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgcHJpbnRmICgiXHQiKTsKLSAgaW5kZW50ICs9IGluZGVudF9pbmM7Ci0gIHByaW50ZiAoYnVmZmVyLCBhMSwgYTIsIGEzLCBhNCwgYTUpOwotCi19Ci0KLS8qIGZldGNoIHRoZSBsdmFsdWVzIG9mIHRoZSBvcGVyYW5kcyAqLwotdm9pZAotaW5mb19hcmdzIChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLSAgdW5zaWduZWQgaW50ICpzOwotCi0gIGludCBkb25lX29uZV9pbW04ID0gMDsKLQotICAvKiBpbnQgZG9uZV9yZWFkID0gNDsqLwotICBzID0gcC0+Ynl0ZV9pbmZvOwotICBuaWJzID0gMDsKLSAgd2hpbGUgKCpzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKnMgJiBDTEFTU19NQVNLKQotCXsKLQljYXNlIENMQVNTX0JJVF8xT1IyOgotCSAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbW1fc3JjPSg8aW5zbl80PiYgMik/MjoxO1xuIik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JJVDoKLQkgIC8qIEp1c3QgaWdub3JlIHRoZXNlLCB3ZSd2ZSBhbHJlYWR5IGRlY29kZWQgdGhpcyBiaXQgKi8KLQkgIG5pYnMrKzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JY2FzZSBDTEFTU19SRUc6Ci0JICAvKiB0aGlzIG5pYmJsZSB0ZWxscyB1cyB3aGljaCByZWdpc3RlciB0byB1c2UgYXMgYW4gYXJnLAotCSAgICAgaWYgd2UndmUgYWxyZWFkeSBnb2JibGVkIHRoZSBuaWJibGUgd2Uga25vdyB3aGF0IHRvIHVzZSAqLwotCSAgewotCSAgICBpbnQgcmVnbmFtZSA9ICpzICYgMHhmOwotCi0JICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnXyVzPTxpbnNuXzQ+O1xuIiwKLQkJICByZWdfbmFtZXNbcmVnbmFtZV0pOwotCi0JICAgIG5pYnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBiYXNlXyVzPTxpcHRyPjtcbiIsIHJlZ19uICgqcykpOwotCi0JICBuaWJzICs9IFNJWkVfQUREUkVTUzsKLQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wMUlJOgotCWNhc2UgQ0xBU1NfMDBJSToKLQkgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz08aW5zbl80PiYweDI7XG4iKTsKLQkgIG5pYnMrKzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRkxBR1M6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz08aW5zbl80PjtcbiIpOwotCQluaWJzKys7Ci1icmVhazsJICAKLQljYXNlIENMQVNTX0lNTToKLQkgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSB0aGluayB0byBmZXRjaCAqLwotCi0JICB7Ci0JICAgIHN3aXRjaCAoKnMgJiB+Q0xBU1NfTUFTSykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBBUkdfSU1NMTY6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbW1fc3JjPTxpbnNuXzE2PjtcbiIpOwotCQluaWJzICs9IDQ7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTTMyOgotCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9ICVzO1xuIiwgaW5zbl8zMiAobmlicykpOwotCQluaWJzICs9IDg7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTTQ6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz08aW5zbl80PjtcbiIpOwotCQluaWJzKys7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTTI6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz08aW5zbl80PiAmIDB4MjtcbiIpOwotCQluaWJzKys7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBBUkdfSU1NNE0xOgotCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9KDxpbnNuXzQ+ICsgMSk7XG4iKTsKLQkJbmlicysrOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU1fMToKLQkJZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbW1fc3JjPTE7XG4iKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NXzI6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz0yO1xuIik7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX05JTTg6Ci0JCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz0tPGluc25fOD47XG4iKTsKLQkJbmlicyArPSAyOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19JTU04OgotCQlpZiAoIWRvbmVfb25lX2ltbTgpCi0JCSAgewotCQkgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbW1fc3JjPTxpbnNuXzg+O1xuIik7Ci0JCSAgICBuaWJzICs9IDI7Ci0JCSAgICBkb25lX29uZV9pbW04ID0gMTsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWVtaXQgKCJyZWdpc3RlciBpbnQgZmFpbCVkPWZhaWwoY29udGV4dCwxKTtcbiIsIG5pYnMpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBDTEFTU19ESVNQODoKLQkgICAgLyogV2UgY2FuJ3QgdXNlIGAoY2hhciknIHNpbmNlIGNoYXIgbWlnaHQgYmUgdW5zaWduZWQuCi0JICAgICAgIFdlIGNhbid0IHVzZSBgKHNpZ25lZCBjaGFyKScgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWlnaHQgYmUgSyZSLgotCSAgICAgICBUaGlzIHNlZW1zIHNhZmUsIHNpbmNlIGl0IG9ubHkgYXNzdW1lcyB0aGF0IGJ5dGVzIGFyZSA4Ci0JICAgICAgIGJpdHMuICAqLwotCSAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IG9wbHZhbF9kc3Q9KChpYnl0ZXNfMSA8PCAoc2l6ZW9mIChpbnQpICogOCAtIDgpKSA+PiAoc2l6ZW9mIChpbnQpICogOCAtIDkpKSArIHBjO1xuIik7Ci0jaWYgMAotCSAgICAvKiBPcmlnaW5hbCBjb2RlOiBmYWlscyBpZiBjaGFyYWN0ZXJzIGFyZSB1bnNpZ25lZC4gICovCi0JICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgb3BsdmFsX2RzdD0oKChjaGFyKWlieXRlc18xKTw8MSkgKyBwYztcbiIpOwotI2VuZGlmCi0JICAgIG5pYnMgKz0gMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBvcF9jYz08aW5zbl80PjtcbiIpOwotCSAgICBuaWJzKys7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGVtaXQgKCJyZWdpc3RlciBpbnQgRkFJTCVkPWZhaWwoY29udGV4dCwyKTtcbiIsIG5pYnMpOwotCSAgICBicmVhazsKLQkgIH0KLQkgIDsKLQkgIC8qIHdvcmsgb3V0IGhvdyB0byBmZXRjaCB0aGUgaW1tZWRpYXRlIHZhbHVlICovCi0JfQotCi0gICAgICBzKys7Ci0gICAgfQotfQotCi12b2lkCi1pbmZvX3NwZWNpYWwgKHAsIGdldGRzdCwgbm9zdG9yZSwgYmVmb3JlLCBub3NyYykKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci0gICAgIGludCAqZ2V0ZHN0OwotICAgICBpbnQgKm5vc3RvcmU7Ci0gICAgIGludCAqYmVmb3JlOwotICAgICBpbnQgKm5vc3JjOwotewotICBzd2l0Y2ggKHAtPm9wY29kZSkKLSAgICB7Ci0gICAgY2FzZSBPUENfZXh0czoKLSAgICBjYXNlIE9QQ19leHRzYjoKLSAgICBjYXNlIE9QQ19leHRzbDoKLSAgICAgICpub3N0b3JlID0gMTsKLSAgICAgICpub3NyYyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19sZG06Ci0gICAgICAqbm9zdG9yZSA9IDE7Ci0gICAgICAqbm9zcmMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfbmVnYjoKLSAgICBjYXNlIE9QQ19uZWc6Ci0gICAgY2FzZSBPUENfc2xhOgotICAgIGNhc2UgT1BDX3NsYWI6Ci0gICAgY2FzZSBPUENfc2xhbDoKLSAgICBjYXNlIE9QQ19zZGE6Ci0gICAgY2FzZSBPUENfc2RhYjoKLSAgICBjYXNlIE9QQ19zZGFsOgotICAgIGNhc2UgT1BDX2NvbToKLSAgICBjYXNlIE9QQ19jb21iOgotICAgIGNhc2UgT1BDX2FkYzoKLSAgICBjYXNlIE9QQ19zYmM6Ci0gICAgY2FzZSBPUENfbm9wOgotICAgIGNhc2UgT1BDX2FkY2I6Ci0gICAgY2FzZSBPUENfYWRkOgotICAgIGNhc2UgT1BDX2FkZGI6Ci0gICAgY2FzZSBPUENfYWRkbDoKLSAgICBjYXNlIE9QQ19pbmM6Ci0gICAgY2FzZSBPUENfc3ViOgotICAgIGNhc2UgT1BDX3N1YmI6Ci0gICAgY2FzZSBPUENfc3VibDoKLSAgICBjYXNlIE9QQ19hbmQ6Ci0gICAgY2FzZSBPUENfYW5kYjoKLSAgICBjYXNlIE9QQ194b3JiOgotICAgIGNhc2UgT1BDX3hvcjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENfbXVsdDoKLSAgICBjYXNlIE9QQ19tdWx0bDoKLSAgICBjYXNlIE9QQ19kaXY6Ci0gICAgY2FzZSBPUENfZGl2bDoKLQotICAgICAgKm5vc3RvcmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ190ZXN0YjoKLSAgICBjYXNlIE9QQ190ZXN0OgotICAgIGNhc2UgT1BDX3Rlc3RsOgotICAgIGNhc2UgT1BDX2NwOgotICAgIGNhc2UgT1BDX2NwYjoKLSAgICBjYXNlIE9QQ19jcGw6Ci0gICAgY2FzZSBPUENfYml0OgotICAgICAgKm5vc3RvcmUgPSAxOwotICAgICAgKmJlZm9yZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDX2JwdDoKLSAgICBjYXNlIE9QQ19qcjoKLSAgICBjYXNlIE9QQ19qcDoKLSAgICBjYXNlIE9QQ19yZXQ6Ci0gICAgY2FzZSBPUENfY2FsbDoKLSAgICBjYXNlIE9QQ190Y2M6Ci0gICAgICAqbm9zcmMgPSAxOwotICAgICAgKm5vc3RvcmUgPSAxOwotICAgICAgKmJlZm9yZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19zYzoKLSAgICAgICpub3N0b3JlID0gMTsKLSAgICAgICpiZWZvcmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfY2xyYjoKLSAgICBjYXNlIE9QQ19jbHI6Ci0gICAgICAqYmVmb3JlID0gMTsKLSAgICAgICpub3NyYyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19sZGk6Ci0gICAgY2FzZSBPUENfbGRpYjoKLSAgICBjYXNlIE9QQ19sZGRiOgotICAgIGNhc2UgT1BDX2xkZDoKLQotICAgICAgKmJlZm9yZSA9IDE7Ci0gICAgICAqbm9zdG9yZSA9IDE7Ci0gICAgICAqbm9zcmMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfbGRrOgotICAgIGNhc2UgT1BDX2xkOgotICAgIGNhc2UgT1BDX2xkYjoKLSAgICBjYXNlIE9QQ19sZGw6Ci0gICAgICAqYmVmb3JlID0gMTsKLSAgICAgICpnZXRkc3QgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcHVzaDoKLSAgICBjYXNlIE9QQ19wdXNobDoKLSAgICBjYXNlIE9QQ19wb3A6Ci0gICAgY2FzZSBPUENfcG9wbDoKLSAgICAgICpiZWZvcmUgPSAxOwotICAgICAgKmdldGRzdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19sZGE6Ci0gICAgICAqbm9zcmMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBjYWxjdWxhdGUgdGhlIGx2YWx1ZXMgcmVxdWlyZWQgZm9yIHRoZSBvcGNvZGUgKi8KLXZvaWQKLWluZm9fbHZhbHMgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICAvKiBlbWl0IGNvZGUgdG8gd29yayBvdXQgbHZhbHVlcywgaWYgYW55ICovCi0gIHVuc2lnbmVkIGludCAqaSA9IHAtPmFyZ19pbmZvOwotCi0gIHdoaWxlICgqaSkKLSAgICB7Ci0gICAgICBjdXJyZW50X25hbWUgPSByZWdfbiAoKmkpOwotICAgICAgY3VycmVudF9zaXplID0gc2l6ZV9uYW1lIChwLT50eXBlKTsKLSAgICAgIHN3aXRjaCAoKmkgJiBDTEFTU19NQVNLKQotCXsKLQljYXNlIENMQVNTX1g6Ci0JICAvKiBhZGRyZXNzKHJlZykgKi8KLQkgIGVtaXQgKCJyZWdpc3RlciAgPGFkZHJfdHlwZT4gb3BsdmFsXzxuYW1lPj0gKChiYXNlXzxuYW1lPiArIChzaG9ydClnZXRfd29yZF9yZWcoY29udGV4dCxyZWdfPG5hbWU+KSkgJiAweGZmZmYpICsgKGJhc2VfPG5hbWU+ICYgfjB4ZmZmZik7XG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSVI6Ci0JICAvKiBJbmRpcmVjdCByZWdpc3RlciAqLwotCSAgZW1pdCAoInJlZ2lzdGVyICBpbnQgb3BsdmFsXzxuYW1lPiA9IGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ188bmFtZT4pO1xuIik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RBOgotCSAgZW1pdCAoInJlZ2lzdGVyICBpbnQgb3BsdmFsXzxuYW1lPj1iYXNlXzxuYW1lPjtcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JTU06Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQljYXNlIENMQVNTX1JFR19MT05HOgotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JY2FzZSBDTEFTU19QUjoKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQkE6Ci0JICBlbWl0ICgicmVnaXN0ZXIgIGludCBvcGx2YWxfPG5hbWU+ID0gZ2V0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQscmVnXzxuYW1lPikgKyAoc2hvcnQpKGltbV9zcmMpO1xuIik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JYOgotCSAgZW1pdCAoInJlZ2lzdGVyICBpbnQgb3BsdmFsXzxuYW1lPiA9IGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ188bmFtZT4pXG4iKTsKLQkgIGVtaXQgKCIgICsgZ2V0X3dvcmRfcmVnKGNvbnRleHQscmVnX2F1eF94KTtcbiIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLX0KLQotLyogZW1pdCBjb2RlIHRvIGZldGNoIHRoZSBhcmdzIGZyb20gY2FsY3VsYXRlZCBsdmFsdWVzICovCi1pbnQgYWxscmVnczsKLXZvaWQKLWluZm9fZmV0Y2ggKHAsIGdldGRzdCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci0gICAgIGludCBnZXRkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCAqaSA9IHAtPmFyZ19pbmZvOwotICBpbnQgaGFkX3NyYyA9IDA7Ci0KLSAgYWxscmVncyA9IDE7Ci0gIHdoaWxlICgqaSkKLSAgICB7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IHJlZ19uICgqaSk7Ci0gICAgICBjdXJyZW50X3NpemUgPSBzaXplX25hbWUgKHAtPnR5cGUpOwotICAgICAgc3dpdGNoICgqaSAmIENMQVNTX01BU0spCi0JewotCWNhc2UgQ0xBU1NfWDoKLQljYXNlIENMQVNTX0lSOgotCWNhc2UgQ0xBU1NfQkE6Ci0JY2FzZSBDTEFTU19CWDoKLQljYXNlIENMQVNTX0RBOgotCSAgaWYgKCFnZXRkc3QgJiYgSVNfRFNUICgqaSkpCi0JICAgIGJyZWFrOwotCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF88bmFtZT49IGdldF88c2l6ZT5fPG1lbT5fZGEoY29udGV4dCxvcGx2YWxfPG5hbWU+KTtcbiIpOwotCSAgYWxscmVncyA9IDA7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIGlmICghaGFkX3NyYykKLQkgICAgewotCSAgICAgIGlmIChwLT5vcGNvZGUgPT0gT1BDX291dCB8fAotCQkgIHAtPm9wY29kZSA9PSBPUENfb3V0YiB8fAotCQkgIHAtPm9wY29kZSA9PSBPUENfc291dCB8fAotCQkgIHAtPm9wY29kZSA9PSBPUENfc291dGIpCi0JCXsKLQkJICAvKiBUaGUgaW1tIGlzIGEgZGVzdCBoZXJlICovCi0JCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF9kc3QgPSBpbW1fc3JjO1xuIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlbWl0ICgicmVnaXN0ZXIgaW50IG9wX3NyYyA9IGltbV9zcmM7XG4iKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgaWYgKCFnZXRkc3QgJiYgSVNfRFNUICgqaSkpCi0JICAgIGJyZWFrOwotCSAgaGFkX3NyYyB8PSBJU19TUkMgKCppKTsKLQkgIGVtaXQgKCJVREl0eXBlIG9wXzxuYW1lPiA7XG4iKTsKLQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgIGlmICghZ2V0ZHN0ICYmIElTX0RTVCAoKmkpKQotCSAgICBicmVhazsKLQkgIGhhZF9zcmMgfD0gSVNfU1JDICgqaSk7Ci0JICBlbWl0ICgicmVnaXN0ZXIgaW50IG9wXzxuYW1lPiA9IGdldF93b3JkX3JlZyhjb250ZXh0LHJlZ188bmFtZT4pO1xuIik7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICBpZiAoIWdldGRzdCAmJiBJU19EU1QgKCppKSkKLQkgICAgYnJlYWs7Ci0JICBoYWRfc3JjIHw9IElTX1NSQyAoKmkpOwotCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF88bmFtZT4gPSBnZXRfbG9uZ19yZWcoY29udGV4dCxyZWdfPG5hbWU+KTtcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQkgIGlmICghZ2V0ZHN0ICYmIElTX0RTVCAoKmkpKQotCSAgICBicmVhazsKLQkgIGhhZF9zcmMgfD0gSVNfU1JDICgqaSk7Ci0JICBlbWl0ICgicmVnaXN0ZXIgaW50IG9wXzxuYW1lPiA9IGdldF9ieXRlX3JlZyhjb250ZXh0LHJlZ188bmFtZT4pO1xuIik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpKys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbm9ybWFsX2ZsYWdzIChwLCBzLCBuZWcpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotICAgICBjaGFyICpzOwotewotICBlbWl0ICgiICVzO1xuIiwgcyk7Ci0gIGVtaXQgKCJOT1JNQUxfRkxBR1MoY29udGV4dCwlZCwgdG1wLCAgb3BfZHN0LCBvcF9zcmMsJWQpOyBcbiIsIHAtPnR5cGUsbmVnKTsKLX0KLQotc3RhdGljIHZvaWQKLXRlc3Rfbm9ybWFsX2ZsYWdzIChwLCBzLCBvcHQpCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotICAgICBjaGFyICpzOwotICAgICBpbnQgb3B0OwotewotICBlbWl0ICgiICVzO1xuIiwgcyk7Ci0gIGlmICgwICYmIG9wdCkKLSAgICB7Ci0gICAgICBlbWl0ICgiY29udGV4dC0+YnJva2VuX2ZsYWdzID0gVFNUX0ZMQUdTO1xuIik7Ci0gICAgICBlbWl0ICgiY29udGV4dC0+c2l6ZSA9ICVkO1xuIiwgcC0+dHlwZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW1pdCAoIlRFU1RfTk9STUFMX0ZMQUdTKGNvbnRleHQsJWQsIHRtcCk7IFxuIiwgcC0+dHlwZSk7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1vcHRpbWl6ZV9ub3JtYWxfZmxhZ3MgKHAsIHMsbmVnKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLSAgICAgY2hhciAqczsKLXsKLSAgZW1pdCAoIiAlcztcbiIsIHMpOwotI2lmIDAKLSAgZW1pdCAoImNvbnRleHQtPmJyb2tlbl9mbGFncyA9IENNUF9GTEFHUztcbiIpOwotI2Vsc2UKLSAgZW1pdCAoIk5PUk1BTF9GTEFHUyhjb250ZXh0LCVkLCB0bXAsICBvcF9kc3QsIG9wX3NyYywlZCk7IFxuIiwgcC0+dHlwZSwgbmVnKTsKLSNlbmRpZgotfQotCi1zdGF0aWMKLXZvaWQKLWpwIChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLQotICBlbWl0ICgiaWYob3BfY2MgPT0gOCB8fCBDT05EKGNvbnRleHQsb3BfY2MpKSBwYyA9IG9wbHZhbF9kc3Q7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWpyIChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLSAgZW1pdCAoImlmKG9wX2NjID09IDggfHwgQ09ORChjb250ZXh0LG9wX2NjKSkgcGMgPSBvcGx2YWxfZHN0O1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXQgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICBlbWl0ICgiaWYob3BfY2MgPT0gOCB8fCBDT05EKGNvbnRleHQsb3BfY2MpKVxue1xuIik7Ci0gIGVtaXQgKCJwYyA9IGdldF88cHRyX21vZGU+XzxtZW0+X2lyKGNvbnRleHQsPHNwPik7XG4iKTsKLSAgZW1pdCAoInB1dF88cHRyX21vZGU+X3JlZyhjb250ZXh0LDxzcD4sIGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LDxzcD4pICsgPHB0cl9zaXplPik7XG4iKTsKLSAgZW1pdCAoIn07XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWNhbGwgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICBlbWl0ICgicHV0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQsPHNwPix0bXAgPSAgZ2V0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQsPHNwPikgLSA8cHRyX3NpemU+KTtcbiIpOwotICBlbWl0ICgicHV0XzxwdHJfbW9kZT5fPG1lbT5fZGEoY29udGV4dCx0bXAsIHBjKTtcbiIpOwotICBlbWl0ICgicGMgPSBvcGx2YWxfZHN0O1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdXNoIChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLSAgZW1pdCAoInRtcCA9IG9wX3NyYztcbiIpOwotICBlbWl0ICgib3BsdmFsX2RzdCAtPSAlZDtcbiIsIHAtPnR5cGUgLyA4KTsKLSAgZW1pdCAoInB1dF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ19kc3QsIG9wbHZhbF9kc3QpO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wb3AgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICBlbWl0ICgidG1wID0gb3Bfc3JjO1xuIik7Ci0gIGVtaXQgKCJwdXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfc3JjLCBvcGx2YWxfc3JjICsgJWQpO1xuIiwgcC0+dHlwZSAvIDgpOwotfQotCi1zdGF0aWMgdm9pZAotbGQgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICBlbWl0ICgidG1wID0gb3Bfc3JjO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zYyAoKQotewotICBlbWl0ICgic3VwcG9ydF9jYWxsKGNvbnRleHQsaW1tX3NyYyk7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWJwdCAoKQotewotICBlbWl0ICgicGMgLT0yOyBcbiIpOwotICBlbWl0ICgiY29udGV4dC0+ZXhjZXB0aW9uID0gU0lNX0JSRUFLUE9JTlQ7XG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWxkaSAocCwgc2l6ZSwgaW5jKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBpbmM7Ci17Ci0gIGludCBkaW5jID0gKHNpemUgLyA4KSAqIGluYzsKLQotICBjdXJyZW50X3NpemUgPSBzaXplX25hbWUgKHNpemUpOwotICBlbWl0ICgieyBcbiIpOwotICBlbWl0ICgiaW50IHR5cGUgPSAlcztcbiIsIGluc25fNCAoNykpOwotICBlbWl0ICgiaW50IHJzID0gZ2V0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQscmVnX3NyYyk7XG4iKTsKLSAgZW1pdCAoImludCByZCA9IGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ19kc3QpO1xuIik7Ci0gIGVtaXQgKCJpbnQgcnIgPSBnZXRfd29yZF9yZWcoY29udGV4dCxyZWdfYXV4X3IpO1xuIik7Ci0gIGVtaXQgKCJkbyB7XG4iKTsKLSAgZW1pdCAoInB1dF88c2l6ZT5fPG1lbT5fZGEoY29udGV4dCxyZCwgZ2V0XzxzaXplPl88bWVtPl9kYShjb250ZXh0LHJzKSk7XG4iKTsKLSAgZW1pdCAoInJkICs9ICVkO1xuIiwgZGluYyk7Ci0gIGVtaXQgKCJycyArPSAlZDtcbiIsIGRpbmMpOwotICBlbWl0ICgicnIgLS07XG4iKTsKLSAgZW1pdCAoImNvbnRleHQtPmN5Y2xlcyArPSA5O1xuIik7Ci0gIGVtaXQgKCJ9IHdoaWxlICghdHlwZSAmJiByciAhPSAwICYmIGNvbnRleHQtPmV4Y2VwdGlvbiA8PSAxKTtcbiIpOwotICBlbWl0ICgiaWYgKGNvbnRleHQtPmV4Y2VwdGlvbj4xKSBwYyAtPTQ7XG4iKTsKLSAgZW1pdCAoInB1dF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ19zcmMsIHJzKTtcbiIpOwotICBlbWl0ICgicHV0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQscmVnX2RzdCwgcmQpO1xuIik7Ci0gIGVtaXQgKCJwdXRfd29yZF9yZWcoY29udGV4dCxyZWdfYXV4X3IsIHJyKTtcbiIpOwotICBlbWl0ICgifVxuIik7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXNoaWZ0IChwLCBhcml0aCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci0gICAgIGludCBhcml0aDsKLXsKLQotICAvKiBXZSBjYW4ndCB1c2UgYChjaGFyKScgc2luY2UgY2hhciBtaWdodCBiZSB1bnNpZ25lZC4KLSAgICAgV2UgY2FuJ3QgdXNlIGAoc2lnbmVkIGNoYXIpJyBiZWNhdXNlIHRoZSBjb21waWxlciBtaWdodCBiZSBLJlIuCi0gICAgIFRoaXMgc2VlbXMgc2FmZSwgc2luY2UgaXQgb25seSBhc3N1bWVzIHRoYXQgYnl0ZXMgYXJlIDggYml0cy4gICovCi0gIGVtaXQgKCJvcF9zcmMgPSAob3Bfc3JjIDw8IChzaXplb2YgKGludCkgKiA4IC0gOCkpID4+IChzaXplb2YgKGludCkgKiA4IC0gOCk7XG4iKTsKLSNpZiAwCi0gIC8qIE9yaWdpbmFsIGNvZGU6IGZhaWxzIGlmIGNoYXJhY3RlcnMgYXJlIHVuc2lnbmVkLiAgKi8KLSAgZW1pdCAoIm9wX3NyYyA9IChjaGFyKW9wX3NyYztcbiIpOwotI2VuZGlmCi0gIGVtaXQgKCJpZiAob3Bfc3JjIDwgMCkgXG4iKTsKLSAgZW1pdCAoIntcbiIpOwotICBlbWl0ICgib3Bfc3JjID0gLW9wX3NyYztcbiIpOwotICBlbWl0ICgib3BfZHN0ID0gKCVzIDxjX3NpemU+KW9wX2RzdDtcbiIsIGFyaXRoID8gIiIgOiAidW5zaWduZWQiKTsKLSAgZW1pdCAoInRtcCA9ICglcyBvcF9kc3QpID4+IG9wX3NyYztcbiIsIGFyaXRoID8gIiIgOiAiKHVuc2lnbmVkKSIpOwotICBlbWl0ICgiY29udGV4dC0+Y2FycnkgPSBvcF9kc3QgPj4gKG9wX3NyYy0xKTtcbiIsIHAtPnR5cGUpOwotICBlbWl0ICgifVxuIik7Ci0gIGVtaXQgKCJlbHNlXG4iKTsKLSAgZW1pdCAoIntcbiIpOwotICBlbWl0ICgidG1wID0gb3BfZHN0IDw8IG9wX3NyYztcbiIpOwotICBlbWl0ICgiY29udGV4dC0+Y2FycnkgPSBvcF9kc3QgPj4gKCVkIC0gb3Bfc3JjKTtcbiIsIHAtPnR5cGUpOwotICBlbWl0ICgifVxuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT56ZXJvID0gKDxjX3NpemU+KXRtcCA9PSAwO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5zaWduID0gKGludCkoKDxjX3NpemU+KXRtcCkgPCAwO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5vdmVyZmxvdyA9ICgoaW50KXRtcCA8IDApICE9ICgoaW50KW9wX2RzdCA8IDApO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5jeWNsZXMgKz0gMypvcF9zcmM7XG4iKTsKLSAgZW1pdCAoImNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7XG4iKTsKLQotfQotCi1zdGF0aWMgdm9pZAotcm90YXRlIChwLCB0aHJvdWdoX2NhcnJ5LCBzaXplLCBsZWZ0KQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLSAgICAgaW50IHRocm91Z2hfY2Fycnk7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgbGVmdDsKLXsKLQotICBpZiAoIWxlZnQpCi0gICAgewotICAgICAgZW1pdCAoIndoaWxlIChvcF9zcmMtLSkge1xuIik7Ci0gICAgICBlbWl0ICgiaW50IHJvdGJpdDtcbiIpOwotICAgICAgZW1pdCAoInJvdGJpdCA9IG9wX2RzdCAmIDE7XG4iKTsKLSAgICAgIGVtaXQgKCJvcF9kc3QgPSAoKHVuc2lnbmVkKW9wX2RzdCkgPj4gMTtcbiIpOwotCi0gICAgICBpZiAodGhyb3VnaF9jYXJyeSkKLQl7Ci0JICBlbWl0ICgib3BfZHN0IHw9IGNvbnRleHQtPmNhcnJ5IDw8ICVkO1xuIiwgc2l6ZSAtIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlbWl0ICgib3BfZHN0IHw9IHJvdGJpdCA8PCAlZDtcbiIsIHNpemUgLSAxKTsKLQl9Ci0gICAgICBlbWl0ICgiY29udGV4dC0+Y2FycnkgPSByb3RiaXQ7XG4iKTsKLSAgICAgIGVtaXQgKCJ9XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbWl0ICgid2hpbGUgKG9wX3NyYy0tKSB7XG4iKTsKLSAgICAgIGVtaXQgKCJpbnQgcm90Yml0O1xuIik7Ci0KLSAgICAgIGVtaXQgKCJyb3RiaXQgPSAob3BfZHN0ID4+ICglZCkpJjE7XG4iLCBzaXplIC0gMSk7Ci0gICAgICBlbWl0ICgib3BfZHN0IDw8PTE7XG4iKTsKLSAgICAgIGlmICh0aHJvdWdoX2NhcnJ5KQotCXsKLQkgIGVtaXQgKCJpZiAoY29udGV4dC0+Y2FycnkpIG9wX2RzdCB8PTE7XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZW1pdCAoImlmIChyb3RiaXQpIG9wX2RzdCB8PSAxO1xuIik7Ci0JfQotICAgICAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gcm90Yml0O1xuIik7Ci0gICAgICBlbWl0ICgifVxuIik7Ci0gICAgfQotICBlbWl0ICgidG1wID0gKDxjX3NpemU+KW9wX2RzdDtcbiIpOwotICBlbWl0ICgiY29udGV4dC0+emVybyA9IHRtcCA9PSAwO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5zaWduID0gKGludCl0bXAgPCAwO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5vdmVyZmxvdyA9ICgoaW50KXRtcCA8IDApICE9ICgoaW50KW9wX2RzdCA8IDApO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5jeWNsZXMgKz0gMypvcF9zcmM7XG4iKTsKLSAgZW1pdCAoImNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7XG4iKTsKLQotfQotCi1zdGF0aWMgdm9pZAotYWRpdiAocCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci17Ci0gIGVtaXQgKCJpZiAob3Bfc3JjPT0wKVxuIik7Ci0gIGVtaXQgKCJ7XG4iKTsKLSAgZW1pdCAoImNvbnRleHQtPmV4Y2VwdGlvbiA9IFNJTV9ESVZfWkVSTztcbiIpOwotICBlbWl0ICgifVxuIik7Ci0gIGVtaXQgKCJlbHNlXG4iKTsKLSAgZW1pdCAoIntcbiIpOwotCi0gIGlmIChwLT50eXBlID09IDMyKQotICAgIHsKLSAgICAgIGVtaXQgKCJvcF9kc3QubG93ID0gKGludClnZXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0KzIpO1xuIik7Ci0gICAgICBlbWl0ICgib3BfZHN0LmhpZ2ggPSAoaW50KWdldF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QrMCk7XG4iKTsKLSNpZmRlZiBfX0dOVUNfXwotICAgICAgZW1pdCAoInRtcCA9ICgoKGxvbmcgbG9uZylvcF9kc3QuaGlnaCA8PCAzMikgKyAob3BfZHN0LmxvdykpIC8gKGludClvcF9zcmM7XG4iKTsKLSNlbHNlCi0gICAgICBlbWl0ICgidG1wID0gKGxvbmcpb3BfZHN0LmxvdyAvIChpbnQpb3Bfc3JjO1xuIik7Ci0jZW5kaWYKLSAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0KzIsIHRtcCk7XG4iKTsKLSNpZmRlZiBfX0dOVUNfXwotICAgICAgZW1pdCAoInB1dF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QsICgoKGxvbmcgbG9uZylvcF9kc3QuaGlnaCA8PCAzMikgKyAob3BfZHN0LmxvdykpICUlIChpbnQpb3Bfc3JjKTtcbiIpOwotI2Vsc2UKLSAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0LCAoaW50KW9wX2RzdC5sb3cgJSUgKGludClvcF9zcmMpO1xuIik7Ci0jZW5kaWYKLQotICAgICAgZW1pdCAoImNvbnRleHQtPnplcm8gPSBvcF9zcmMgPT0gMCB8fCAob3BfZHN0Lmxvdz09MCAmJiBvcF9kc3QuaGlnaD09MCk7XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbWl0ICgidG1wID0gKGxvbmcpb3BfZHN0IC8gKHNob3J0KW9wX3NyYztcbiIpOwotICAgICAgZW1pdCAoInB1dF93b3JkX3JlZyhjb250ZXh0LHJlZ19kc3QrMSwgdG1wKTtcbiIpOwotICAgICAgZW1pdCAoInB1dF93b3JkX3JlZyhjb250ZXh0LHJlZ19kc3QsIChsb25nKSBvcF9kc3QgJSUgKHNob3J0KW9wX3NyYyk7XG4iKTsKLSAgICAgIGVtaXQgKCJjb250ZXh0LT56ZXJvID0gb3Bfc3JjID09IDAgfHwgb3BfZHN0PT0wO1xuIik7Ci0gICAgfQotCi0gIGVtaXQgKCJjb250ZXh0LT5zaWduID0gKGludCl0bXAgPCAwO1xuIik7Ci0gIGVtaXQgKCJjb250ZXh0LT5vdmVyZmxvdyA9KHRtcCAmIDB4JXgpICE9IDA7XG4iLAotCX4oKDEgPDwgKHAtPnR5cGUpKSAtIDEpKTsKLSAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gKHRtcCAmIDB4JXgpICE9IDA7XG4iLAotCX4oMSA8PCAocC0+dHlwZSkpKTsKLQotICBlbWl0ICgifVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb2JpdCAocCkKLW9wY29kZV9lbnRyeV90eXBlICpwOwotewotICBlbWl0KCJjb250ZXh0LT56ZXJvID0gKG9wX2RzdCAmICgxPDxvcF9zcmMpKT09MDtcbiIpOwotICBlbWl0KCJjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSAwO1xuIik7Ci19Ci1zdGF0aWMgdm9pZAotZG9zZXQgKHAsIHYpCi1vcGNvZGVfZW50cnlfdHlwZSpwOwotaW50IHY7Ci17Ci0gIGlmICh2KSAKLSAgICBlbWl0ICgiIHRtcCA9IG9wX2RzdCB8ICgxPDwgb3Bfc3JjKTtcbiIpOwotICBlbHNlCi0gICAgZW1pdCAoIiB0bXAgPSBvcF9kc3QgJiB+KDE8PCBvcF9zcmMpO1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tdWx0IChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLQotICBpZiAocC0+dHlwZSA9PSAzMikKLSAgICB7Ci0gICAgICBlbWl0ICgib3BfZHN0LmxvdyA9ICBnZXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0KzIpO1xuIik7Ci0gICAgICBlbWl0ICgidG1wID0gb3BfZHN0LmxvdyAqIG9wX3NyYztcbiIpOwotICAgICAgZW1pdCAoInB1dF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QrMiwgdG1wKTtcbiIpOwotICAgICAgZW1pdCAoInB1dF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QsIDApO1xuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW1pdCAoIm9wX2RzdCA9ICBnZXRfd29yZF9yZWcoY29udGV4dCxyZWdfZHN0KzEpO1xuIik7Ci0gICAgICBlbWl0ICgidG1wID0gb3BfZHN0ICogb3Bfc3JjO1xuIik7Ci0gICAgICBlbWl0ICgicHV0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCwgdG1wKTtcbiIpOwotICAgIH0KLQotICBlbWl0ICgiY29udGV4dC0+c2lnbiA9IChpbnQpdG1wIDwgMDtcbiIpOwotICBlbWl0ICgiY29udGV4dC0+b3ZlcmZsb3cgPTA7XG4iKTsKLSAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gKHRtcCAmIDB4JXgpICE9IDA7XG4iLCB+KCgxIDw8IChwLT50eXBlKSkgLSAxKSk7Ci0gIGVtaXQgKCJjb250ZXh0LT56ZXJvID0gdG1wID09IDA7XG4iKTsKLQotfQotCi1zdGF0aWMgdm9pZAotZXh0cyAocCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci17Ci0gIC8qIEZldGNoIHRoZSBscyBwYXJ0IG9mIHRoZSBzcmMgKi8KLSAgY3VycmVudF9zaXplID0gc2l6ZV9uYW1lIChwLT50eXBlICogMik7Ci0KLSAgaWYgKHAtPnR5cGUgPT0gMzIpCi0gICAgewotICAgICAgZW1pdCAoInRtcD0gZ2V0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCsyKTtcbiIpOwotICAgICAgZW1pdCAoImlmICh0bXAgJiAoMTw8JWQpKSB7XG4iLCBwLT50eXBlIC0gMSk7Ci0gICAgICBlbWl0ICgicHV0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCwgMHhmZmZmZmZmZik7XG4iKTsKLSAgICAgIGVtaXQgKCJ9XG4iKTsKLSAgICAgIGVtaXQgKCJlbHNlXG4iKTsKLSAgICAgIGVtaXQgKCJ7XG4iKTsKLSAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0LCAwKTtcbiIpOwotICAgICAgZW1pdCAoIn1cbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVtaXQgKCJ0bXA9IGdldF88c2l6ZT5fcmVnKGNvbnRleHQscmVnX2RzdCk7XG4iKTsKLSAgICAgIGVtaXQgKCJpZiAodG1wICYgKDE8PCVkKSkge1xuIiwgcC0+dHlwZSAtIDEpOwotICAgICAgZW1pdCAoInRtcCB8PSAweCV4O1xuIiwgfigoMSA8PCBwLT50eXBlKSAtIDEpKTsKLSAgICAgIGVtaXQgKCJ9XG4iKTsKLSAgICAgIGVtaXQgKCJlbHNlXG4iKTsKLSAgICAgIGVtaXQgKCJ7XG4iKTsKLQotICAgICAgZW1pdCAoInRtcCAmPSAweCV4O1xuIiwgKCgxIDw8IHAtPnR5cGUpIC0gMSkpOwotICAgICAgZW1pdCAoIn1cbiIpOwotICAgICAgZW1pdCAoInB1dF88c2l6ZT5fcmVnKGNvbnRleHQscmVnX2RzdCwgdG1wKTtcbiIpOwotICAgIH0KLX0KLWRvZmxhZyhvbikKLWludCBvbjsKLXsKLSAgLyogTG9hZCB1cCB0aGUgZmxhZ3MgKi8KLSAgZW1pdCgiIENPTkQgKGNvbnRleHQsIDB4MGIpO1xuIik7Ci0KLSAgaWYgKG9uKQotICAgIGVtaXQgKCJ7IGludCBvbiA9MTtcbiAiKTsKLSAgZWxzZQotICAgIGVtaXQgKCJ7IGludCBvbiA9MDtcbiAiKTsKLQotICBlbWl0ICgiaWYgKGltbV9zcmMgJiAxKVxuIik7Ci0gIGVtaXQgKCJQU1dfT1ZFUkZMT1cgPSBvbjtcbiIpOwotCi0gIGVtaXQgKCJpZiAoaW1tX3NyYyAmIDIpXG4iKTsKLSAgZW1pdCAoIlBTV19TSUdOID0gb247XG4iKTsKLQotICBlbWl0ICgiaWYgKGltbV9zcmMgJiA0KVxuIik7Ci0gIGVtaXQgKCJQU1dfWkVSTyA9IG9uO1xuIik7Ci0KLSAgZW1pdCAoImlmIChpbW1fc3JjICYgOClcbiIpOwotICBlbWl0ICgiUFNXX0NBUlJZID0gb247XG4iKTsKLSAgZW1pdCgifVxuIik7Ci0KLQotfQotLyogZW1pdCBjb2RlIHRvIHBlcmZvcm0gb3BlcmF0aW9uICovCi12b2lkCi1pbmZvX2RvY29kZSAocCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci17Ci0gIHN3aXRjaCAocC0+b3Bjb2RlKQotICAgIHsKLSAgICBjYXNlIE9QQ19jbHI6Ci0gICAgY2FzZSBPUENfY2xyYjoKLSAgICAgIGVtaXQgKCJ0bXAgPSAwO1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19leDoKLSAgICBjYXNlIE9QQ19leGI6Ci0KLSAgICAgIGVtaXQgKCJ0bXAgPSBvcF9zcmM7IFxuIik7Ci0gICAgICBpZiAoYWxscmVncykKLQl7Ci0JICBlbWl0ICgicHV0XzxzaXplPl9yZWcoY29udGV4dCxyZWdfc3JjLCBvcF9kc3QpO1xuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVtaXQgKCJwdXRfPHNpemU+X21lbV9kYShjb250ZXh0LCBvcGx2YWxfc3JjLCBvcF9kc3QpO1xuIik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfYWRjOgotICAgIGNhc2UgT1BDX2FkY2I6Ci0gICAgICBub3JtYWxfZmxhZ3MgKHAsICJvcF9zcmMgKz0gQ09ORChjb250ZXh0LDcpO3RtcCA9IG9wX2RzdCArIG9wX3NyYyA7IiwwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3NiYzoKLSAgICAgIG5vcm1hbF9mbGFncyAocCwgIm9wX3NyYyArPSAgQ09ORChjb250ZXh0LDcpO3RtcCA9IG9wX2RzdCAtIG9wX3NyYyA7IiwxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX25vcDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2NvbToKLSAgICBjYXNlIE9QQ19jb21iOgotICAgICAgdGVzdF9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSB+IG9wX2RzdCIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfYW5kOgotICAgIGNhc2UgT1BDX2FuZGI6Ci0gICAgICB0ZXN0X25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCAmIG9wX3NyYyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfeG9yOgotICAgIGNhc2UgT1BDX3hvcmI6Ci0gICAgICB0ZXN0X25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCBeIG9wX3NyYyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfb3I6Ci0gICAgY2FzZSBPUENfb3JiOgotICAgICAgdGVzdF9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QgfCBvcF9zcmMiLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3NsYToKLSAgICBjYXNlIE9QQ19zbGFiOgotICAgIGNhc2UgT1BDX3NsYWw6Ci0gICAgY2FzZSBPUENfc2RhOgotICAgIGNhc2UgT1BDX3NkYWI6Ci0gICAgY2FzZSBPUENfc2RhbDoKLSAgICAgIHNoaWZ0IChwLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENfc2xsOgotICAgIGNhc2UgT1BDX3NsbGI6Ci0gICAgY2FzZSBPUENfc2xsbDoKLSAgICBjYXNlIE9QQ19zZGw6Ci0gICAgY2FzZSBPUENfc2RsYjoKLSAgICBjYXNlIE9QQ19zZGxsOgotICAgICAgc2hpZnQgKHAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcmw6Ci0gICAgICByb3RhdGUgKHAsIDAsIDE2LCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3JsYjoKLSAgICAgIHJvdGF0ZSAocCwgMCwgOCwgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19ycjoKLSAgICAgIHJvdGF0ZSAocCwgMCwgMTYsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcnJiOgotICAgICAgcm90YXRlIChwLCAwLCA4LCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3JyYzoKLSAgICAgIHJvdGF0ZSAocCwgMSwgMTYsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcnJjYjoKLSAgICAgIHJvdGF0ZSAocCwgMSwgOCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19ybGM6Ci0gICAgICByb3RhdGUgKHAsIDEsIDE2LCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3JsY2I6Ci0gICAgICByb3RhdGUgKHAsIDEsIDgsIDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ19leHRzYjoKLSAgICBjYXNlIE9QQ19leHRzOgotICAgIGNhc2UgT1BDX2V4dHNsOgotICAgICAgZXh0cyAocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19hZGQ6Ci0gICAgY2FzZSBPUENfYWRkYjoKLSAgICBjYXNlIE9QQ19hZGRsOgotICAgIGNhc2UgT1BDX2luYzoKLSAgICBjYXNlIE9QQ19pbmNiOgotICAgICAgb3B0aW1pemVfbm9ybWFsX2ZsYWdzIChwLCAidG1wID0gb3BfZHN0ICsgb3Bfc3JjIiwwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3Rlc3RiOgotICAgIGNhc2UgT1BDX3Rlc3Q6Ci0gICAgY2FzZSBPUENfdGVzdGw6Ci0gICAgICB0ZXN0X25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfY3A6Ci0gICAgY2FzZSBPUENfY3BiOgotICAgIGNhc2UgT1BDX2NwbDoKLSAgICAgIG5vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCAtIG9wX3NyYyIsMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19uZWdiOgotICAgIGNhc2UgT1BDX25lZzoKLSAgICAgIGVtaXQgKCJ7XG4iKTsKLSAgICAgIGVtaXQgKCJpbnQgb3Bfc3JjID0gLW9wX2RzdDtcbiIpOwotICAgICAgZW1pdCAoIm9wX2RzdCA9IDA7XG4iKTsKLSAgICAgIG9wdGltaXplX25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCArIG9wX3NyYztcbiIsMSk7Ci0gICAgICBlbWl0ICgifSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ19zdWI6Ci0gICAgY2FzZSBPUENfc3ViYjoKLSAgICBjYXNlIE9QQ19zdWJsOgotICAgIGNhc2UgT1BDX2RlYzoKLSAgICBjYXNlIE9QQ19kZWNiOgotICAgICAgb3B0aW1pemVfbm9ybWFsX2ZsYWdzIChwLCAidG1wID0gb3BfZHN0IC0gb3Bfc3JjIiwxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2JwdDoKLSAgICAgIGJwdCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2pyOgotICAgICAganIgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfc2M6Ci0gICAgICBzYyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2pwOgotICAgICAganAgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcmV0OgotICAgICAgcmV0IChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2NhbGw6Ci0gICAgICBjYWxsIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX3RjYzoKLSAgICBjYXNlIE9QQ190Y2NiOgotICAgICAgZW1pdCAoImlmKG9wX2NjID09IDggfHwgQ09ORChjb250ZXh0LG9wX2NjKSkgcHV0X3dvcmRfcmVnKGNvbnRleHQscmVnX2RzdCwgMSk7XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2xkYToKLSAgICAgIGVtaXQgKCJ0bXAgPSBvcGx2YWxfc3JjOyBcbiIpOwotICAgICAgLyooKChvcGx2YWxfc3JjKSAmIDB4ZmYwMDAwKSA8PCA4KSB8IChvcGx2YWxfc3JjICYgMHhmZmZmKTsgXG4iKTsqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfbGRrOgotICAgIGNhc2UgT1BDX2xkOgotCi0gICAgY2FzZSBPUENfbGRiOgotICAgIGNhc2UgT1BDX2xkbDoKLSAgICAgIGxkIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2xkaWI6Ci0gICAgICBsZGkgKHAsIDgsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfbGRpOgotICAgICAgbGRpIChwLCAxNiwgMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDX2xkZGI6Ci0gICAgICBsZGkgKHAsIDgsIC0xKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2xkZDoKLSAgICAgIGxkaSAocCwgMTYsIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENfcHVzaDoKLSAgICBjYXNlIE9QQ19wdXNobDoKLSAgICAgIHB1c2ggKHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ19kaXY6Ci0gICAgY2FzZSBPUENfZGl2bDoKLSAgICAgIGFkaXYgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfbXVsdDoKLSAgICBjYXNlIE9QQ19tdWx0bDoKLSAgICAgIG11bHQgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcG9wOgotICAgIGNhc2UgT1BDX3BvcGw6Ci0gICAgICBwb3AgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfc2V0OgotICAgICAgZG9zZXQgKHAsMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QQ19yZXM6Ci0gICAgICBkb3NldCAocCwwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BDX2JpdDoKLSAgICAgIGRvYml0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfcmVzZmxnOgotICAgICAgZG9mbGFnKDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUENfc2V0ZmxnOgotICAgICAgZG9mbGFnKDEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQotICAgICAgZW1pdCAoInRtcCA9IGZhaWwoY29udGV4dCwlZCk7XG4iLCBwLT5vcGNvZGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBlbWl0IGNvZGUgdG8gc3RvcmUgcmVzdWx0IGluIGNhbGN1bGF0ZWQgbHZhbHVlICovCi0KLXZvaWQKLWluZm9fc3RvcmUgKHApCi0gICAgIG9wY29kZV9lbnRyeV90eXBlICpwOwotewotICB1bnNpZ25lZCBpbnQgKmkgPSBwLT5hcmdfaW5mbzsKLQotICB3aGlsZSAoKmkpCi0gICAgewotICAgICAgY3VycmVudF9uYW1lID0gcmVnX24gKCppKTsKLSAgICAgIGN1cnJlbnRfc2l6ZSA9IHNpemVfbmFtZSAocC0+dHlwZSk7Ci0KLSAgICAgIGlmIChJU19EU1QgKCppKSkKLQl7Ci0JICBzd2l0Y2ggKCppICYgQ0xBU1NfTUFTSykKLQkgICAgewotCSAgICBjYXNlIENMQVNTX1BSOgotCSAgICAgIGVtaXQgKCJwdXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfPG5hbWU+LCB0bXApO1xuIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0KLQkgICAgICBlbWl0ICgicHV0XzxzaXplPl9yZWcoY29udGV4dCxyZWdfPG5hbWU+LHRtcCk7XG4iKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19YOgotCSAgICBjYXNlIENMQVNTX0lSOgotCSAgICBjYXNlIENMQVNTX0RBOgotCSAgICBjYXNlIENMQVNTX0JYOgotCSAgICBjYXNlIENMQVNTX0JBOgotCi0JICAgICAgZW1pdCAoInB1dF88c2l6ZT5fPG1lbT5fZGEoY29udGV4dCxvcGx2YWxfPG5hbWU+LCB0bXApO1xuIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfSU1NOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGVtaXQgKCJhYm9ydCgpOyAiKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JfQotICAgICAgaSsrOwotICAgIH0KLX0KLQotc3RhdGljCi12b2lkCi1tYW5nbGUgKHAsIHNob3J0Y3V0LCB2YWx1ZSkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Ci0gICAgIGludCBzaG9ydGN1dDsKLSAgICAgaW50IHZhbHVlOwotewotICBpbnQgbm9zdG9yZSA9IDA7Ci0gIGludCBleHRyYTsKLSAgaW50IGdldGRzdCA9IDE7Ci0gIGludCBiZWZvcmUgPSAwOwotICBpbnQgbm9zcmMgPSAwOwotCi0gIGVtaXQgKCIvXDA1MiAlcyBcMDUyL1xuIiwgcC0+bmljZW5hbWUpOwotICBpZiAoc2hvcnRjdXQpCi0gICAgewotICAgICAgZW1pdCAoImludCA8Zm9wPl8lMDR4KGNvbnRleHQscGMpXG4iLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW1pdCAoImludCA8Zm9wPl8lZChjb250ZXh0LHBjLGl3b3JkczApXG4iLCBwLT5pZHgpOwotICAgICAgZW1pdCAoImludCBpd29yZHMwO1xuIik7Ci0gICAgfQotICBlbWl0ICgic2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7XG4iKTsKLSAgZW1pdCAoImludCBwYztcbiIpOwotICBlbWl0ICgie1xuIik7Ci0gIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgdG1wO1xuIik7Ci0gIGlmIChzaG9ydGN1dCkKLSAgICB7Ci0gICAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGl3b3JkczAgPSAweCV4O1xuIiwgdmFsdWUpOwotICAgIH0KLQotICAvKiB3b3JrIG91dCBob3cgbXVjaCBiaWdnZXIgdGhpcyBvcGNvZGUgY291bGQgYmUgYmVjYXVzZSBpdCdzIGxhcmdlCi0gICAgIG1vZGVsICovCi0gIGlmIChCSUcpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGV4dHJhID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCSAgaWYgKChwLT5hcmdfaW5mb1tpXSAmIENMQVNTX01BU0spID09IENMQVNTX0RBCi0JICAgICAgfHwgKHAtPmFyZ19pbmZvW2ldICYgQ0xBU1NfTUFTSykgPT0gQ0xBU1NfWCkKLQkgICAgZXh0cmEgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0cmEgPSAwOwotICAgIH0KLSAgcHJpbnRmICgiCQkJLyogTGVuZ3RoICVkICovIFxuIiwgcC0+bGVuZ3RoICsgZXh0cmEpOwotICBzd2l0Y2ggKHAtPmxlbmd0aCArIGV4dHJhKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBlbWl0ICgicGMgKz0gMlxuOyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZHMxID0gZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQscGMrMik7XG4iKTsKLSAgICAgIGVtaXQgKCJwYyArPSA0O1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0KLSAgICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaXdvcmRzMSA9IGdldF93b3JkX21lbV9kYShjb250ZXh0LHBjKzIpO1xuIik7Ci0gICAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGl3b3JkczIgPSBnZXRfd29yZF9tZW1fZGEoY29udGV4dCxwYys0KTtcbiIpOwotICAgICAgZW1pdCAoInBjICs9IDY7XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaXdvcmRzMSA9IGdldF93b3JkX21lbV9kYShjb250ZXh0LHBjKzIpO1xuIik7Ci0gICAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGl3b3JkczIgPSBnZXRfd29yZF9tZW1fZGEoY29udGV4dCxwYys0KTtcbiIpOwotICAgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZHMzID0gZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQscGMrNik7XG4iKTsKLSAgICAgIGVtaXQgKCJwYyArPSA4O1xuIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIGVtaXQgKCJjb250ZXh0LT5jeWNsZXMgKz0gJWQ7XG4iLCBwLT5jeWNsZXMpOwotCi0gIGVtaXQgKCJ7XG4iKTsKLSAgaW5mb19hcmdzIChwKTsKLSAgaW5mb19zcGVjaWFsIChwLCAmZ2V0ZHN0LCAmbm9zdG9yZSwgJmJlZm9yZSwgJm5vc3JjKTsKLQotICBpbmZvX2x2YWxzIChwKTsKLSAgaWYgKCFub3NyYykKLSAgICB7Ci0gICAgICBpbmZvX2ZldGNoIChwLCBnZXRkc3QpOwotICAgIH0KLQotICBpZiAoYmVmb3JlKQotICAgIHsKLSAgICAgIGluZm9fZG9jb2RlIChwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmZvX2RvY29kZSAocCk7Ci0gICAgfQotICBpZiAoIW5vc3RvcmUpCi0gICAgaW5mb19zdG9yZSAocCk7Ci0gIGVtaXQgKCJ9XG4iKTsKLSAgZW1pdCAoInJldHVybiBwYztcbiIpOwotICBlbWl0ICgifVxuIik7Ci19Ci0KLXZvaWQKLXN0YXRpYwotb25lX2luc3RydWN0aW9uIChpKQotICAgICBpbnQgaTsKLXsKLSAgLyogZmluZCB0aGUgdGFibGUgZW50cnkgKi8KLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnAgPSB6OGtfdGFibGUgKyBpOwotCi0gIGlmICghcCkKLSAgICByZXR1cm47Ci0gIG1hbmdsZSAocCwgMCwgMCk7Ci19Ci0KLXZvaWQKLWFkZF90b19saXN0IChwdHIsIHZhbHVlKQotICAgICBzdHJ1Y3Qgb3Bjb2RlX3ZhbHVlICoqcHRyOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHN0cnVjdCBvcGNvZGVfdmFsdWUgKnByZXY7Ci0KLSAgcHJldiA9ICpwdHI7Ci0gICpwdHIgPSAoc3RydWN0IG9wY29kZV92YWx1ZSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9wY29kZV92YWx1ZSkpOwotCi0gICgqcHRyKS0+biA9IHZhbHVlOwotICAoKnB0ciktPm5leHQgPSBwcmV2OwotfQotCi12b2lkCi1idWlsZF9saXN0IChpKQotICAgICBpbnQgaTsKLXsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnAgPSBsb29rdXBfaW5zdCAoaSk7Ci0KLSAgaWYgKCFwKQotICAgIHJldHVybjsKLSAgYWRkX3RvX2xpc3QgKCZsaXN0W3AtPmlkeF0sIGkpOwotfQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIGludCBpOwotICBpbnQgbmVlZGNvbW1hID0gMDsKLQotICBtYWtlbGlzdCA9IDA7Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFjOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXZbaV0sICItbSIpID09IDApCi0JbWFrZWxpc3QgPSAxOwotICAgICAgaWYgKHN0cmNtcCAoYXZbaV0sICItMSIpID09IDApCi0JZmlsZSA9IDE7Ci0gICAgICBpZiAoc3RyY21wIChhdltpXSwgIi0yIikgPT0gMCkKLQlmaWxlID0gMjsKLSAgICAgIGlmIChzdHJjbXAgKGF2W2ldLCAiLTMiKSA9PSAwKQotCWZpbGUgPSAzOwotICAgICAgaWYgKHN0cmNtcCAoYXZbaV0sICItYjMiKSA9PSAwKQotCXsKLQkgIGZpbGUgPSAzOwotCSAgQklHID0gMTsKLQl9Ci0KLSAgICB9Ci0gIGlmIChtYWtlbGlzdCkKLSAgICB7Ci0KLSAgICAgIGludCBpOwotICAgICAgbmVlZGNvbW1hID0gMDsKLSAgICAgIHByaW50ZiAoInNob3J0IGludCB6OGtfaW52X2xpc3RbXSA9IHtcbiIpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMSA8PCAxNjsgaSsrKQotCXsKLQkgIG9wY29kZV9lbnRyeV90eXBlICpwID0gbG9va3VwX2luc3QgKGkpOwotCi0JICBpZihuZWVkY29tbWEpCi0JICAgIHByaW50ZigiLCIpOwotCSAgaWYgKChpICYgMHhmKSA9PSAwKQotCSAgICBwcmludGYgKCJcbiIpOwotCi0jaWYgMAotCSAgcHJpbnRmICgiXG4JCS8qJTA0eCAlcyAqLyIsIGksIHAgPyBwLT5uaWNlbmFtZSA6ICIiKTsKLSNlbmRpZgotCi0JICBpZiAoIXApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCItMSIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlZCIsIHAtPmlkeCk7Ci0JICAgIH0KLQotCSAgaWYgKChpICYgMHgzZikgPT0gMCAmJiBESVJUWV9IQUNLKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXG4jaWZkZWYgX19HTlVDX19cbiIpOwotCSAgICAgIHByaW50ZiAoIn07XG4iKTsKLQkgICAgICBwcmludGYoInNob3J0IGludCBpbnRfbGlzdCVkW10gPSB7XG4iLCBpKTsKLQkgICAgICBwcmludGYgKCIjZWxzZVxuIik7Ci0JICAgICAgcHJpbnRmICgiLFxuIik7Ci0JICAgICAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLQkgICAgICBuZWVkY29tbWEgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG5lZWRjb21tYSA9IDE7Ci0KLQl9Ci0gICAgICBwcmludGYgKCJ9O1xuIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogRmlyc3Qgd29yayBvdXQgd2hpY2ggb3Bjb2RlcyB1c2Ugd2hpY2ggYml0IHBhdHRlcm5zLAotICAgICBidWlsZCBhIGxpc3Qgb2YgYWxsIG1hdGNoaW5nIGJpdCBwYXR0ZW5zICovCi0gIGZvciAoaSA9IDA7IGkgPCAxIDw8IDE2OyBpKyspCi0gICAgewotICAgICAgYnVpbGRfbGlzdCAoaSk7Ci0gICAgfQotI2lmIERVTVBfTElTVAotICBmb3IgKGkgPSAwOyBpIDwgTk9QUzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBvcGNvZGVfdmFsdWUgKnA7Ci0KLSAgICAgIHByaW50ZiAoIiVkLCIsIGkpOwotICAgICAgcCA9IGxpc3RbaV07Ci0gICAgICB3aGlsZSAocCkKLQl7Ci0JICBwcmludGYgKCIgJTA0eCwiLCBwLT5uKTsKLQkgIHAgPSBwLT5uZXh0OwotCX0KLSAgICAgIHByaW50ZiAoIi0xXG4iKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmIChmaWxlID09IDEpCi0gICAgewotICAgICAgZXh0ZXJuIGludCBxdWlja1tdOwotCi0gICAgICAvKiBEbyB0aGUgc2hvcnRjdXRzICovCi0gICAgICBwcmludGYgKCIJCQkvKiBTSE9SVENVVFMgKi9cbiIpOwotICAgICAgZm9yIChpID0gMDsgcXVpY2tbaV07IGkrKykKLQl7Ci0JICBpbnQgdCA9IHF1aWNrW2ldOwotCi0JICBtYW5nbGUgKHo4a190YWJsZSArIHo4a19pbnZfbGlzdFt0XSwKLQkJICAxLAotCQkgIHQpOwotCX0KLSAgICB9Ci0gIGlmIChmaWxlID09IDMpCi0gICAgewotICAgICAgcHJpbnRmICgiCQkJLyogTk9UIC1TSE9SVENVVFMgKi9cbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE5PUFM7IGkrKykKLQl7Ci0JICBpZiAobGlzdFtpXSkKLQkgICAgewotCSAgICAgIG9uZV9pbnN0cnVjdGlvbiAoaSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVtaXQgKCJpbnQgPGZvcD5fJWQoY29udGV4dCxwYylcbiIsIGkpOwotCSAgICAgIHByaW50ZiAoInNpbV9zdGF0ZV90eXBlICpjb250ZXh0O1xuIik7Ci0JICAgICAgcHJpbnRmICgiaW50IHBjO1xuIik7Ci0JICAgICAgZW1pdCAoInsgPGZvcD5fYmFkMSgpO3JldHVybiBwYzsgfVxuIik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbWl0ICgiaW50IDxmb3A+X2JhZCgpIDtcbiIpOwotCi0gICAgICAvKiBXcml0ZSB0aGUganVtcCB0YWJsZSAqLwotICAgICAgZW1pdCAoImludCAoKig8Zm9wPl90YWJsZVtdKSkoKSA9IHsiKTsKLSAgICAgIG5lZWRjb21tYSA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTk9QUzsgaSsrKQotCXsKLQkgIGlmIChuZWVkY29tbWEpCi0JICAgIHByaW50ZiAoIiwiKTsKLQkgIGVtaXQgKCI8Zm9wPl8lZFxuIiwgaSk7Ci0JICBuZWVkY29tbWEgPSAxOwotCSAgaWYgKChpICYgMHgzZikgPT0gMCAmJiBESVJUWV9IQUNLKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiI2lmZGVmIF9fR05VQ19fXG4iKTsKLQkgICAgICBwcmludGYgKCJ9O1xuIik7Ci0JICAgICAgZW1pdCAoImludCAoKig8Zm9wPl90YWJsZSVkW10pKSgpID0ge1xuIiwgaSk7Ci0JICAgICAgcHJpbnRmICgiI2Vsc2VcbiIpOwotCSAgICAgIHByaW50ZiAoIixcbiIpOwotCSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7Ci0JICAgICAgbmVlZGNvbW1hID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVtaXQgKCJ9O1xuIik7Ci0gICAgfQotCi0gIGlmIChmaWxlID09IDIpCi0gICAgewotICAgICAgZXh0ZXJuIGludCBxdWlja1tdOwotICAgICAgLyogU3RhdGljIC0gc2luY2UgaXQncyB0b28gYmUgdG8gYmUgYXV0b21hdGljIG9uIHRoZSBhcG9sbG8gKi8KLSAgICAgIHN0YXRpYyBpbnQgYmlnWzY0ICogMTAyNF07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2NCAqIDEwMjQ7IGkrKykKLQliaWdbaV0gPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBxdWlja1tpXTsgaSsrKQotCXsKLSNpZiAwCi0KLQkgIHByaW50ZiAoImV4dGVybiBpbnQgPGZvcD5fJTA0eCgpO1xuIiwgcXVpY2tbaV0pOwotI2VuZGlmCi0KLQkgIGJpZ1txdWlja1tpXV0gPSAxOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IE5PUFM7IGkrKykKLQl7Ci0jaWYgMAotCSAgcHJpbnRmICgiZXh0ZXJuIGludCBmb3BfJWQoKTtcbiIsIGkpOwotI2VuZGlmCi0JfQotI2lmIDAKLSAgICAgIHByaW50ZiAoImV4dGVybiBpbnQgZm9wX2JhZCgpO1xuIik7Ci0jZW5kaWYKLSAgICAgIHByaW50ZiAoInN0cnVjdCBvcF9pbmZvIG9wX2luZm9fdGFibGVbXSA9IHtcbiIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IDEgPDwgMTY7IGkrKykKLQl7Ci0JICBpbnQgaW52ID0gejhrX2ludl9saXN0W2ldOwotCSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnAgPSB6OGtfdGFibGUgKyBpbnY7Ci0KLQkgIGlmIChuZWVkY29tbWEpCi0JICAgIHByaW50ZiAoIiwiKTsKLSNpZiAwCi0JICBpZiAoYmlnW2ldKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiPGZvcD5fJTA0eCIsIGkpOwotCSAgICB9Ci0JICBlbHNlCi0jZW5kaWYKLQkgIGlmIChpbnYgPj0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVkIiwgaW52KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcmludGYgKCI0MDAiKTsKLQkgIGlmIChpbnYgPj0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIgkJLyogJTA0eCAlcyAqL1xuIiwgaSwgcC0+bmljZW5hbWUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICB9Ci0JICBuZWVkY29tbWEgPSAxOwotCSAgaWYgKChpICYgMHgzZikgPT0gMCAmJiBESVJUWV9IQUNLKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiI2lmZGVmIF9fR05VQ19fXG4iKTsKLQkgICAgICBwcmludGYgKCJ9OyBcbiIpOwotCSAgICAgIHByaW50ZiAoInN0cnVjdCBvcF9pbmZvIG9wX2luZm9fdGFibGUlZFtdID0ge1xuIiwgaSk7Ci0JICAgICAgcHJpbnRmICgiI2Vsc2VcbiIpOwotCSAgICAgIHByaW50ZiAoIixcbiIpOwotCi0JICAgICAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLQkgICAgICBuZWVkY29tbWEgPSAwOwotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgifTtcbiIpOwotCi0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1pbnNuX3B0ciAobikKLSAgICAgaW50IG47Ci17Ci0gIGlmIChCSUcpCi0gICAgewotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN3aXRjaCAobikKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICJpd29yZHNfMSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiZmFpbChjb250ZXh0LDEyMykiOwotICAgIH0KLX0KLQotLyogd29yayBvdXQgaWYgdGhlIG9wY29kZSBvbmx5IHdhbnRzIGx2YWx1ZXMgKi8KLWludAotbHZhbHVlIChwKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKLXsKLSAgc3dpdGNoIChwLT5vcGNvZGUpCi0gICAgewotICAgIGNhc2UgT1BDX2xkYToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgT1BDX2NhbGw6Ci0gICAgY2FzZSBPUENfanA6Ci0gICAgICByZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1pbnQKLWluZm9fbGVuX2luX3dvcmRzIChvKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqbzsKLXsKLSAgdW5zaWduZWQgIGludCAqcCA9IG8tPmJ5dGVfaW5mbzsKLSAgaW50IG5pYnMgPSAwOwotCi0gIHdoaWxlICgqcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpwICYgQ0xBU1NfTUFTSykKLQl7Ci0JY2FzZSBDTEFTU19CSVQ6Ci0JY2FzZSBDTEFTU19SRUdOMDoKLQljYXNlIENMQVNTX1JFRzoKLQljYXNlIENMQVNTXzAxSUk6Ci0JY2FzZSBDTEFTU18wMElJOgotCSAgbmlicysrOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgbmlicyArPSBTSVpFX0FERFJFU1M7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIHN3aXRjaCAoKnAgJiB+Q0xBU1NfTUFTSykKLQkgICAgewotCSAgICBjYXNlIEFSR19JTU0xNjoKLQkgICAgICBuaWJzICs9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTMyOgotCSAgICAgIG5pYnMgKz0gODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMjoKLQkgICAgY2FzZSBBUkdfSU1NNDoKLQkgICAgY2FzZSBBUkdfSU1NNE0xOgotCSAgICBjYXNlIEFSR19JTU1fMToKLQkgICAgY2FzZSBBUkdfSU1NXzI6Ci0JICAgIGNhc2UgQVJHX0lNTU5NSU5VUzE6Ci0JICAgICAgbmlicysrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19OSU04OgotCi0JICAgIGNhc2UgQVJHX0lNTTg6Ci0JICAgICAgbmlicyArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBzd2l0Y2ggKCpwICYgfkNMQVNTX01BU0spCi0JICAgIHsKLQkgICAgY2FzZSBBUkdfRElTUDE2OgotCSAgICAgIG5pYnMgKz0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfRElTUDEyOgotCSAgICAgIG5pYnMgKz0gMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfRElTUDg6Ci0JICAgICAgbmlicyArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzBESVNQNzoKLQljYXNlIENMQVNTXzFESVNQNzoKLQljYXNlIENMQVNTX0RJU1A4OgotCSAgbmlicyArPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CSVRfMU9SMjoKLQljYXNlIENMQVNTXzBDQ0M6Ci0JY2FzZSBDTEFTU18xQ0NDOgotCWNhc2UgQ0xBU1NfQ0M6Ci0JICBuaWJzKys7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZW1pdCAoImRvbid0IGtub3cgJXhcbiIsICpwKTsKLQl9Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIHJldHVybiBuaWJzIC8gNDsJCS8qIHJldHVybiB1bWJlciBvZiB3b3JkcyAqLwotfQpkaWZmIC0tZ2l0IGEvc3ltbGluay10cmVlIGIvc3ltbGluay10cmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTY1ODJkLi4wMDAwMDAwCi0tLSBhL3N5bWxpbmstdHJlZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBDcmVhdGUgYSBzeW1saW5rIHRyZWUuCi0jCi0jIFN5bnRheDogc3ltbGluay10cmVlIHNyY2RpciAiaWdub3JlMSBpZ25vcmUyIC4uLiIKLSMKLSMgd2hlcmUgc3JjZGlyIGlzIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIGEgc3ltbGluayB0cmVlIHRvLAotIyBhbmQgImlnbm9yZU4iIGlzIGEgbGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyB0byBpZ25vcmUuCi0KLXByb2c9JDAKLXNyY2Rpcj0kMQotaWdub3JlPSIkMiIKLQotaWdub3JlX2FkZGl0aW9uYWw9Ii4gLi4gQ1ZTIgotCi0jIElmIHdlIHdlcmUgaW52b2tlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCBuYW1lLCBhZGp1c3QgJHtwcm9nfSB0byB3b3JrCi0jIGluIHN1YmRpcnMuCi1jYXNlICR7cHJvZ30gaW4KLS8qKSA7OwotKikgcHJvZz0uLi8ke3Byb2d9IDs7Ci1lc2FjCi0KLSMgU2V0IG5ld3NyY2RpciB0byBzb21ldGhpbmcgc3ViZGlyZWN0b3JpZXMgY2FuIHVzZS4KLWNhc2UgJHtzcmNkaXJ9IGluCi0vKikgbmV3c3JjZGlyPSR7c3JjZGlyfSA7OwotKikgbmV3c3JjZGlyPS4uLyR7c3JjZGlyfSA7OwotZXNhYwotCi1mb3IgZiBpbiBgbHMgLWEgJHtzcmNkaXJ9YDsgZG8KLSAgaWYgWyAtZCAke3NyY2Rpcn0vJGYgXTsgdGhlbgotICAgIGZvdW5kPQotICAgIGZvciBpIGluICR7aWdub3JlfSAke2lnbm9yZV9hZGRpdGlvbmFsfTsgZG8KLSAgICAgIGlmIFsgIiRmIiA9ICIkaSIgXTsgdGhlbgotCWZvdW5kPXllcwotICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAteiAiJHtmb3VuZH0iIF07IHRoZW4KLSAgICAgIGVjaG8gIiRmCQkuLndvcmtpbmcgaW4iCi0gICAgICBpZiBbIC1kICRmIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAkZjsgZmkKLSAgICAgIChjZCAkZjsgJHtwcm9nfSAke25ld3NyY2Rpcn0vJGYgIiR7aWdub3JlfSIpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRmCQkuLmxpbmtlZCIKLSAgICBybSAtZiAkZgotICAgIGxuIC1zICR7c3JjZGlyfS8kZiAuCi0gIGZpCi1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGV4aW5mby90ZXhpbmZvLnRleCBiL3RleGluZm8vdGV4aW5mby50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OWFmOWYuLjAwMDAwMDAKLS0tIGEvdGV4aW5mby90ZXhpbmZvLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDU5OTIgKzAsMCBAQAotJSB0ZXhpbmZvLnRleCAtLSBUZVggbWFjcm9zIHRvIGhhbmRsZSBUZXhpbmZvIGZpbGVzLgotJQotJSBMb2FkIHBsYWluIGlmIG5lY2Vzc2FyeSwgaS5lLiwgaWYgcnVubmluZyB1bmRlciBpbml0ZXguCi1cZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbXRuYW1lXGVuZGNzbmFtZVxyZWxheFxpbnB1dCBwbGFpblxmaQotJQotXGRlZlx0ZXhpbmZvdmVyc2lvbnsxOTk5LTA5LTI1LjEwfQotJQotJSBDb3B5cmlnaHQgKEMpIDE5ODUsIDg2LCA4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTkKLSUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0lCi0lIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSUgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSUgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotJSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0lCi0lIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotJSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotJSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0lCi0lIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0lIGFsb25nIHdpdGggdGhpcyB0ZXhpbmZvLnRleCBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotJSBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSUKLSUgSW4gb3RoZXIgd29yZHMsIHlvdSBhcmUgd2VsY29tZSB0byB1c2UsIHNoYXJlIGFuZCBpbXByb3ZlIHRoaXMgcHJvZ3JhbS4KLSUgWW91IGFyZSBmb3JiaWRkZW4gdG8gZm9yYmlkIGFueW9uZSBlbHNlIHRvIHVzZSwgc2hhcmUgYW5kIGltcHJvdmUKLSUgd2hhdCB5b3UgZ2l2ZSB0aGVtLiAgIEhlbHAgc3RhbXAgb3V0IHNvZnR3YXJlLWhvYXJkaW5nIQotJQotJSBQbGVhc2UgdHJ5IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0ZXhpbmZvLnRleCBiZWZvcmUgc3VibWl0dGluZyBidWcKLSUgcmVwb3J0czsgeW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb206Ci0lICAgZnRwOi8vZnRwLmdudS5vcmcvZ251L3RleGluZm8udGV4Ci0lICAgKGFuZCBhbGwgR05VIG1pcnJvcnMsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvb3JkZXIvZnRwLmh0bWwpCi0lICAgZnRwOi8vdGV4aW5mby5vcmcvdGV4L3RleGluZm8udGV4Ci0lICAgZnRwOi8vdXMuY3Rhbi5vcmcvbWFjcm9zL3RleGluZm8vdGV4aW5mby50ZXgKLSUgICAoYW5kIGFsbCBDVEFOIG1pcnJvcnMsIGZpbmdlciBjdGFuQHVzLmN0YW4ub3JnIGZvciBhIGxpc3QpLgotJSAgIC9ob21lL2dkL2dudS9kb2MvdGV4aW5mby50ZXggb24gdGhlIEdOVSBtYWNoaW5lcy4KLSUgVGhlIHRleGluZm8udGV4IGluIGFueSBnaXZlbiBUZXhpbmZvIGRpc3RyaWJ1dGlvbiBjb3VsZCB3ZWxsIGJlIG91dAotJSBvZiBkYXRlLCBzbyBpZiB0aGF0J3Mgd2hhdCB5b3UncmUgdXNpbmcsIHBsZWFzZSBjaGVjay4KLSUgVGV4aW5mbyBoYXMgYSBzbWFsbCBob21lIHBhZ2UgYXQgaHR0cDovL3RleGluZm8ub3JnLy4KLSUKLSUgU2VuZCBidWcgcmVwb3J0cyB0byBidWctdGV4aW5mb0BnbnUub3JnLiAgUGxlYXNlIGluY2x1ZGUgaW5jbHVkaW5nIGEKLSUgY29tcGxldGUgZG9jdW1lbnQgaW4gZWFjaCBidWcgcmVwb3J0IHdpdGggd2hpY2ggd2UgY2FuIHJlcHJvZHVjZSB0aGUKLSUgcHJvYmxlbS4gIFBhdGNoZXMgYXJlLCBvZiBjb3Vyc2UsIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCi0lCi0lIFRvIHByb2Nlc3MgYSBUZXhpbmZvIG1hbnVhbCB3aXRoIFRlWCwgaXQncyBtb3N0IHJlbGlhYmxlIHRvIHVzZSB0aGUKLSUgdGV4aTJkdmkgc2hlbGwgc2NyaXB0IHRoYXQgY29tZXMgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgRm9yIGEgc2ltcGxlCi0lIG1hbnVhbCBmb28udGV4aSwgaG93ZXZlciwgeW91IGNhbiBnZXQgYXdheSB3aXRoIHRoaXM6Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4aW5kZXggZm9vLj8/Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4IGZvby50ZXhpCi0lICAgZHZpcHMgZm9vLmR2aSAtbyAjIG9yIHdoYXRldmVyLCB0byBwcm9jZXNzIHRoZSBkdmkgZmlsZTsgdGhpcyBtYWtlcyBmb28ucHMuCi0lIFRoZSBleHRyYSBydW5zIG9mIFRlWCBnZXQgdGhlIGNyb3NzLXJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb3JyZWN0LgotJSBTb21ldGltZXMgb25lIHJ1biBhZnRlciB0ZXhpbmRleCBzdWZmaWNlcywgYW5kIHNvbWV0aW1lcyB5b3UgbmVlZCBtb3JlCi0lIHRoYW4gdHdvOyB0ZXhpMmR2aSBkb2VzIGl0IGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgotJQotJSBJdCBpcyBwb3NzaWJsZSB0byBhZGFwdCB0ZXhpbmZvLnRleCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLiAgWW91IGNhbiBnZXQKLSUgdGhlIGV4aXN0aW5nIGxhbmd1YWdlLXNwZWNpZmljIGZpbGVzIGZyb20gZnRwOi8vZnRwLmdudS5vcmcvZ251L3RleGluZm8vLgotCi1cbWVzc2FnZXtMb2FkaW5nIHRleGluZm8gW3ZlcnNpb24gXHRleGluZm92ZXJzaW9uXTp9Ci0KLSUgSWYgaW4gYSAuZm10IGZpbGUsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlcgotJSBhbmQgdHVybiBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IHdlIGNvdWxkbid0IGRvIGVhcmxpZXIgYmVjYXVzZQotJSB0aGV5IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGlucHV0IGZpbGUgbmFtZS4KLVxldmVyeWpvYntcbWVzc2FnZXtbVGV4aW5mbyB2ZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl19JQotICBcY2F0Y29kZWArPVxhY3RpdmUgXGNhdGNvZGVgXF89XGFjdGl2ZX0KLQotJSBTYXZlIHNvbWUgcGFydHMgb2YgcGxhaW4gdGV4IHdob3NlIG5hbWVzIHdlIHdpbGwgcmVkZWZpbmUuCi1cbGV0XHB0ZXhiPVxiCi1cbGV0XHB0ZXhidWxsZXQ9XGJ1bGxldAotXGxldFxwdGV4Yz1cYwotXGxldFxwdGV4Y29tbWE9XCwKLVxsZXRccHRleGRvdD1cLgotXGxldFxwdGV4ZG90cz1cZG90cwotXGxldFxwdGV4ZW5kPVxlbmQKLVxsZXRccHRleGVxdWl2PVxlcXVpdgotXGxldFxwdGV4ZXhjbGFtPVwhCi1cbGV0XHB0ZXhpPVxpCi1cbGV0XHB0ZXhsYnJhY2U9XHsKLVxsZXRccHRleHJicmFjZT1cfQotXGxldFxwdGV4c3Rhcj1cKgotXGxldFxwdGV4dD1cdAotCi0lIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBvdXRlciBcKyBkZWZpbml0aW9uIGluIFRleGluZm8uCi0lIEZvciBAdGV4LCB3ZSBjYW4gdXNlIFx0YWJhbGlnbi4KLVxsZXRcKyA9IFxyZWxheAotCi1cbWVzc2FnZXtCYXNpY3MsfQotXGNoYXJkZWZcb3RoZXI9MTIKLQotJSBJZiB0aGlzIGNoYXJhY3RlciBhcHBlYXJzIGluIGFuIGVycm9yIG1lc3NhZ2Ugb3IgaGVscCBzdHJpbmcsIGl0Ci0lIHN0YXJ0cyBhIG5ldyBsaW5lIGluIHRoZSBvdXRwdXQuCi1cbmV3bGluZWNoYXIgPSBgXl5KCi0KLSUgU2V0IHVwIGZpeGVkIHdvcmRzIGZvciBFbmdsaXNoIGlmIG5vdCBhbHJlYWR5IHNldC4KLVxpZnhccHV0d29yZEFwcGVuZGl4XHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZEFwcGVuZGl4e0FwcGVuZGl4fVxmaQotXGlmeFxwdXR3b3JkQ2hhcHRlclx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkQ2hhcHRlcntDaGFwdGVyfVxmaQotXGlmeFxwdXR3b3JkZmlsZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkZmlsZXtmaWxlfVxmaQotXGlmeFxwdXR3b3JkaW5cdW5kZWZpbmVkICAgICAgICBcZ2RlZlxwdXR3b3JkaW57aW59XGZpCi1caWZ4XHB1dHdvcmRJbmRleElzRW1wdHlcdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkSW5kZXhJc0VtcHR5eyhJbmRleCBpcyBlbXB0eSl9XGZpCi1caWZ4XHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkSW5kZXhOb25leGlzdGVudHsoSW5kZXggaXMgbm9uZXhpc3RlbnQpfVxmaQotXGlmeFxwdXR3b3JkSW5mb1x1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkSW5mb3tJbmZvfVxmaQotXGlmeFxwdXR3b3JkSW5zdGFuY2VWYXJpYWJsZW9mXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkSW5zdGFuY2VWYXJpYWJsZW9me0luc3RhbmNlIFZhcmlhYmxlIG9mfVxmaQotXGlmeFxwdXR3b3JkTWV0aG9kb25cdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkTWV0aG9kb257TWV0aG9kIG9ufVxmaQotXGlmeFxwdXR3b3JkTm9UaXRsZVx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkTm9UaXRsZXtObyBUaXRsZX1cZmkKLVxpZnhccHV0d29yZG9mXHVuZGVmaW5lZCAgICAgICAgXGdkZWZccHV0d29yZG9me29mfVxmaQotXGlmeFxwdXR3b3Jkb25cdW5kZWZpbmVkICAgICAgICBcZ2RlZlxwdXR3b3Jkb257b259XGZpCi1caWZ4XHB1dHdvcmRwYWdlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRwYWdle3BhZ2V9XGZpCi1caWZ4XHB1dHdvcmRzZWN0aW9uXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmRzZWN0aW9ue3NlY3Rpb259XGZpCi1caWZ4XHB1dHdvcmRTZWN0aW9uXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmRTZWN0aW9ue1NlY3Rpb259XGZpCi1caWZ4XHB1dHdvcmRzZWVcdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRzZWV7c2VlfVxmaQotXGlmeFxwdXR3b3JkU2VlXHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3JkU2Vle1NlZX1cZmkKLVxpZnhccHV0d29yZFNob3J0VE9DXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZFNob3J0VE9De1Nob3J0IENvbnRlbnRzfVxmaQotXGlmeFxwdXR3b3JkVE9DXHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3JkVE9De1RhYmxlIG9mIENvbnRlbnRzfVxmaQotJQotXGlmeFxwdXR3b3JkTUphblx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1KYW57SmFudWFyeX1cZmkKLVxpZnhccHV0d29yZE1GZWJcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNRmVie0ZlYnJ1YXJ5fVxmaQotXGlmeFxwdXR3b3JkTU1hclx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1NYXJ7TWFyY2h9XGZpCi1caWZ4XHB1dHdvcmRNQXByXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUFwcntBcHJpbH1cZmkKLVxpZnhccHV0d29yZE1NYXlcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNTWF5e01heX1cZmkKLVxpZnhccHV0d29yZE1KdW5cdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNSnVue0p1bmV9XGZpCi1caWZ4XHB1dHdvcmRNSnVsXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUp1bHtKdWx5fVxmaQotXGlmeFxwdXR3b3JkTUF1Z1x1bmRlZmluZWQgXGdkZWZccHV0d29yZE1BdWd7QXVndXN0fVxmaQotXGlmeFxwdXR3b3JkTVNlcFx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1TZXB7U2VwdGVtYmVyfVxmaQotXGlmeFxwdXR3b3JkTU9jdFx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1PY3R7T2N0b2Jlcn1cZmkKLVxpZnhccHV0d29yZE1Ob3ZcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNTm92e05vdmVtYmVyfVxmaQotXGlmeFxwdXR3b3JkTURlY1x1bmRlZmluZWQgXGdkZWZccHV0d29yZE1EZWN7RGVjZW1iZXJ9XGZpCi0lCi1caWZ4XHB1dHdvcmREZWZtYWNcdW5kZWZpbmVkICAgIFxnZGVmXHB1dHdvcmREZWZtYWN7TWFjcm99XGZpCi1caWZ4XHB1dHdvcmREZWZzcGVjXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmREZWZzcGVje1NwZWNpYWwgRm9ybX1cZmkKLVxpZnhccHV0d29yZERlZnZhclx1bmRlZmluZWQgICAgXGdkZWZccHV0d29yZERlZnZhcntWYXJpYWJsZX1cZmkKLVxpZnhccHV0d29yZERlZm9wdFx1bmRlZmluZWQgICAgXGdkZWZccHV0d29yZERlZm9wdHtVc2VyIE9wdGlvbn1cZmkKLVxpZnhccHV0d29yZERlZnR5cGV2YXJcdW5kZWZpbmVkXGdkZWZccHV0d29yZERlZnR5cGV2YXJ7VmFyaWFibGV9XGZpCi1caWZ4XHB1dHdvcmREZWZmdW5jXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmREZWZmdW5je0Z1bmN0aW9ufVxmaQotXGlmeFxwdXR3b3JkRGVmdHlwZWZ1blx1bmRlZmluZWRcZ2RlZlxwdXR3b3JkRGVmdHlwZWZ1bntGdW5jdGlvbn1cZmkKLQotJSBJZ25vcmUgYSB0b2tlbi4KLSUKLVxkZWZcZ29iYmxlIzF7fQotCi1caHlwaGVuYXRpb257YXAtcGVuLWRpeH0KLVxoeXBoZW5hdGlvbnttaW5pLWJ1Zi1mZXIgbWluaS1idWYtZmVyc30KLVxoeXBoZW5hdGlvbntlc2hlbGx9Ci1caHlwaGVuYXRpb257d2hpdGUtc3BhY2V9Ci0KLSUgTWFyZ2luIHRvIGFkZCB0byByaWdodCBvZiBldmVuIHBhZ2VzLCB0byBsZWZ0IG9mIG9kZCBwYWdlcy4KLVxuZXdkaW1lbiBcYmluZGluZ29mZnNldAotXG5ld2RpbWVuIFxub3JtYWxvZmZzZXQKLVxuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKLQotJSBTb21ldGltZXMgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIGV2ZXJ5dGhpbmcgaW4gdGhlIHRyYW5zY3JpcHQgZmlsZQotJSBhbmQgbm90aGluZyBvbiB0aGUgdGVybWluYWwuICBXZSBkb24ndCBqdXN0IGNhbGwgXHRyYWNpbmdhbGwgaGVyZSwKLSUgc2luY2UgdGhhdCBwcm9kdWNlcyBzb21lIHVzZWxlc3Mgb3V0cHV0IG9uIHRoZSB0ZXJtaW5hbC4KLSUKLVxkZWZcZ2xvZ2dpbmdhbGx7XGJlZ2luZ3JvdXAgXGdsb2JhbGRlZnMgPSAxIFxsb2dnaW5nYWxsIFxlbmRncm91cH0lCi1caWZ4XGVUZVh2ZXJzaW9uXHVuZGVmaW5lZAotXGRlZlxsb2dnaW5nYWxse1x0cmFjaW5nY29tbWFuZHMyIFx0cmFjaW5nc3RhdHMyCi0gICBcdHJhY2luZ3BhZ2VzMSBcdHJhY2luZ291dHB1dDEgXHRyYWNpbmdsb3N0Y2hhcnMxCi0gICBcdHJhY2luZ21hY3JvczIgXHRyYWNpbmdwYXJhZ3JhcGhzMSBcdHJhY2luZ3Jlc3RvcmVzMQotICAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuXHNob3dib3hkZXB0aFxtYXhkaW1lbgotfSUKLVxlbHNlCi1cZGVmXGxvZ2dpbmdhbGx7XHRyYWNpbmdjb21tYW5kczMgXHRyYWNpbmdzdGF0czIKLSAgIFx0cmFjaW5ncGFnZXMxIFx0cmFjaW5nb3V0cHV0MSBcdHJhY2luZ2xvc3RjaGFyczEKLSAgIFx0cmFjaW5nbWFjcm9zMiBcdHJhY2luZ3BhcmFncmFwaHMxIFx0cmFjaW5ncmVzdG9yZXMxCi0gICBcdHJhY2luZ3NjYW50b2tlbnMxIFx0cmFjaW5nYXNzaWduczEgXHRyYWNpbmdpZnMxCi0gICBcdHJhY2luZ2dyb3VwczEgXHRyYWNpbmduZXN0aW5nMgotICAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuXHNob3dib3hkZXB0aFxtYXhkaW1lbgotfSUKLVxmaQotCi0lIEZvciBAY3JvcG1hcmtzIGNvbW1hbmQuCi0lIERvIEBjcm9wbWFya3MgdG8gZ2V0IGNyb3AgbWFya3MuCi0lCi1cbmV3aWZcaWZjcm9wbWFya3MKLVxsZXRcY3JvcG1hcmtzID0gXGNyb3BtYXJrc3RydWUKLSUKLSUgRGltZW5zaW9ucyB0byBhZGQgY3JvcG1hcmtzIGF0IGNvcm5lcnMuCi0lIEFkZGVkIGJ5IFAuIEEuIE1hY0theSwgMTIgTm92LiAxOTg2Ci0lCi1cbmV3ZGltZW5cb3V0ZXJoc2l6ZSBcbmV3ZGltZW5cb3V0ZXJ2c2l6ZSAlIHNldCBieSB0aGUgcGFwZXIgc2l6ZSByb3V0aW5lcwotXG5ld2RpbWVuXGNvcm5lcmxvbmcgIFxjb3JuZXJsb25nPTFwYwotXG5ld2RpbWVuXGNvcm5lcnRoaWNrIFxjb3JuZXJ0aGljaz0uM3B0Ci1cbmV3ZGltZW5cdG9wYW5kYm90dG9tbWFyZ2luIFx0b3BhbmRib3R0b21tYXJnaW49Ljc1aW4KLQotJSBNYWluIG91dHB1dCByb3V0aW5lLgotXGNoYXJkZWZcUEFHRSA9IDI1NQotXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fQotCi1cbmV3Ym94XGhlYWRsaW5lYm94Ci1cbmV3Ym94XGZvb3RsaW5lYm94Ci0KLSUgXG9uZXBhZ2VvdXQgdGFrZXMgYSB2Ym94IGFzIGFuIGFyZ3VtZW50LiAgTm90ZSB0aGF0IFxwYWdlY29udGVudHMKLSUgZG9lcyBpbnNlcnRpb25zLCBidXQgeW91IGhhdmUgdG8gY2FsbCBpdCB5b3Vyc2VsZi4KLVxkZWZcb25lcGFnZW91dCMxeyUKLSAgXGlmY3JvcG1hcmtzIFxob2Zmc2V0PTBwdCBcZWxzZSBcaG9mZnNldD1cbm9ybWFsb2Zmc2V0IFxmaQotICAlCi0gIFxpZm9kZFxwYWdlbm8gIFxhZHZhbmNlXGhvZmZzZXQgYnkgXGJpbmRpbmdvZmZzZXQKLSAgXGVsc2UgXGFkdmFuY2VcaG9mZnNldCBieSAtXGJpbmRpbmdvZmZzZXRcZmkKLSAgJQotICAlIERvIHRoaXMgb3V0c2lkZSBvZiB0aGUgXHNoaXBvdXQgc28gQGNvZGUgZXRjLiB3aWxsIGJlIGV4cGFuZGVkIGluCi0gICUgdGhlIGhlYWRsaW5lIGFzIHRoZXkgc2hvdWxkIGJlLCBub3QgdGFrZW4gbGl0ZXJhbGx5IChvdXRwdXR0aW5nICcnY29kZSkuCi0gIFxzZXRib3hcaGVhZGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0lCi0gIFxzZXRib3hcZm9vdGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX0lCi0gICUKLSAgeyUKLSAgICAlIEhhdmUgdG8gZG8gdGhpcyBzdHVmZiBvdXRzaWRlIHRoZSBcc2hpcG91dCBiZWNhdXNlIHdlIHdhbnQgaXQgdG8KLSAgICAlIHRha2UgZWZmZWN0IGluIFx3cml0ZSdzLCB5ZXQgdGhlIGdyb3VwIGRlZmluZWQgYnkgdGhlIFx2Ym94IGVuZHMKLSAgICAlIGJlZm9yZSB0aGUgXHNoaXBvdXQgcnVucy4KLSAgICAlCi0gICAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCi0gICAgXGluZGV4ZHVtbWllcyAgICAgICAgICUgZG9uJ3QgZXhwYW5kIGNvbW1hbmRzIGluIHRoZSBvdXRwdXQuCi0gICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgXCBpbiBpbmRleCBlbnRyaWVzIG11c3Qgbm90IHN0YXkgXCwgZS5nLiwgaWYKLSAgICAgICAgICAgICAgICAgICAlIHRoZSBwYWdlIGJyZWFrIGhhcHBlbnMgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBleGFtcGxlLgotICAgIFxzaGlwb3V0XHZib3h7JQotICAgICAgXGlmY3JvcG1hcmtzIFx2Ym94IHRvIFxvdXRlcnZzaXplXGJncm91cAotICAgICAgICBcaHNpemUgPSBcb3V0ZXJoc2l6ZQotICAgICAgICBcdnNraXAtXHRvcGFuZGJvdHRvbW1hcmdpbgotICAgICAgICBcdnRvcCB0bzBwdHslCi0gICAgICAgICAgXGxpbmV7XGV3dG9wXGhmaWxcZXd0b3B9JQotICAgICAgICAgIFxub2ludGVybGluZXNraXAKLSAgICAgICAgICBcbGluZXslCi0gICAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnN0b3B9JQotICAgICAgICAgICAgXGhmaWxsCi0gICAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zdG9wfSUKLSAgICAgICAgICB9JQotICAgICAgICAgIFx2c3N9JQotICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luCi0gICAgICAgIFxsaW5lXGJncm91cAotICAgICAgICAgIFxoZmlsICUgY2VudGVyIHRoZSBwYWdlIHdpdGhpbiB0aGUgb3V0ZXIgKHBhZ2UpIGhzaXplLgotICAgICAgICAgIFxpZm9kZFxwYWdlbm9caHNraXBcYmluZGluZ29mZnNldFxmaQotICAgICAgICAgIFx2Ym94XGJncm91cAotICAgICAgXGZpCi0gICAgICAlCi0gICAgICBcdW52Ym94XGhlYWRsaW5lYm94Ci0gICAgICBccGFnZWJvZHl7IzF9JQotICAgICAgXGlmZGltXGh0XGZvb3RsaW5lYm94ID4gMHB0Ci0gICAgICAgICUgT25seSBsZWF2ZSB0aGlzIHNwYWNlIGlmIHRoZSBmb290bGluZSBpcyBub25lbXB0eS4KLSAgICAgICAgJSAoV2UgbGVzc2VuZWQgXHZzaXplIGZvciBpdCBpbiBcb2RkZm9vdGluZ3h4eC4pCi0gICAgICAgICUgVGhlIFxiYXNlbGluZXNraXA9MjRwdCBpbiBwbGFpbidzIFxtYWtlZm9vdGxpbmUgaGFzIG5vIGVmZmVjdC4KLSAgICAgICAgXHZza2lwIDJcYmFzZWxpbmVza2lwCi0gICAgICAgIFx1bnZib3hcZm9vdGxpbmVib3gKLSAgICAgIFxmaQotICAgICAgJQotICAgICAgXGlmcGRmbWFrZXBhZ2VkZXN0IFxwZGZta2Rlc3R7XHRoZVxwYWdlbm99IFxmaQotICAgICAgJQotICAgICAgXGlmY3JvcG1hcmtzCi0gICAgICAgICAgXGVncm91cCAlIGVuZCBvZiBcdmJveFxiZ3JvdXAKLSAgICAgICAgXGhmaWxcZWdyb3VwICUgZW5kIG9mIChjZW50ZXJpbmcpIFxsaW5lXGJncm91cAotICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luIHBsdXMxZmlsbCBtaW51czFmaWxsCi0gICAgICAgIFxib3htYXhkZXB0aCA9IFxjb3JuZXJ0aGljawotICAgICAgICBcdmJveCB0bzBwdHtcdnNzCi0gICAgICAgICAgXGxpbmV7JQotICAgICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zYm90fSUKLSAgICAgICAgICAgIFxoZmlsbAotICAgICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc2JvdH0lCi0gICAgICAgICAgfSUKLSAgICAgICAgICBcbm9pbnRlcmxpbmVza2lwCi0gICAgICAgICAgXGxpbmV7XGV3Ym90XGhmaWxcZXdib3R9JQotICAgICAgICB9JQotICAgICAgXGVncm91cCAlIFx2Ym94IGZyb20gZmlyc3QgY3JvcG1hcmtzIGNsYXVzZQotICAgICAgXGZpCi0gICAgfSUgZW5kIG9mIFxzaGlwb3V0XHZib3gKLSAgfSUgZW5kIG9mIGdyb3VwIHdpdGggXHR1cm5vZmZhY3RpdmUKLSAgXGFkdmFuY2VwYWdlbm8KLSAgXGlmbnVtXG91dHB1dHBlbmFsdHk+LTIwMDAwIFxlbHNlXGRvc3VwZXJlamVjdFxmaQotfQotCi1cbmV3aW5zZXJ0XG1hcmdpbiBcZGltZW5cbWFyZ2luPVxtYXhkaW1lbgotCi1cZGVmXHBhZ2Vib2R5IzF7XHZib3ggdG9ccGFnZWhlaWdodHtcYm94bWF4ZGVwdGg9XG1heGRlcHRoICMxfX0KLXtcY2F0Y29kZWBcQCA9MTEKLVxnZGVmXHBhZ2Vjb250ZW50cyMxe1xpZnZvaWRcdG9waW5zXGVsc2VcdW52Ym94XHRvcGluc1xmaQotJSBtYXJnaW5hbCBoYWNrcywganVoYUB2aWlzYS51dWNwIChKdWhhIFRha2FsYSkKLVxpZnZvaWRcbWFyZ2luXGVsc2UgJSBtYXJnaW5hbCBpbmZvIGlzIHByZXNlbnQKLSAgXHJsYXB7XGtlcm5caHNpemVcdmJveCB0b1x6QHtca2VybjFwdFxib3hcbWFyZ2luIFx2c3N9fVxmaQotXGRpbWVuQD1cZHAjMSBcdW52Ym94IzEKLVxpZnZvaWRcZm9vdGluc1xlbHNlXHZza2lwXHNraXBcZm9vdGluc1xmb290bm90ZXJ1bGUgXHVudmJveFxmb290aW5zXGZpCi1caWZyQGdnZWRib3R0b20gXGtlcm4tXGRpbWVuQCBcdmZpbCBcZml9Ci19Ci0KLSUgSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciB0aGUgY3JvcG1hcmtzLiAgTm90ZSB0aGF0IHRoZXkgYXJlCi0lIG9mZnNldCBzbyB0aGF0IHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0gaXMgdHJ1bHkgXG91dGVyaHNpemUgb3IgXG91dGVydnNpemUKLSUgKFAuIEEuIE1hY0theSwgMTIgTm92ZW1iZXIsIDE5ODYpCi0lCi1cZGVmXGV3dG9we1x2cnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGgwcHQgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnN0b3B7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGhcY29ybmVybG9uZyB3aWR0aFxjb3JuZXJ0aGlja319Ci1cZGVmXGV3Ym90e1x2cnVsZSBoZWlnaHQwcHQgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVybG9uZ30KLVxkZWZcbnNib3R7XHZib3gKLSAge1xocnVsZSBoZWlnaHRcY29ybmVybG9uZyBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJ0aGlja319Ci0KLSUgUGFyc2UgYW4gYXJndW1lbnQsIHRoZW4gcGFzcyBpdCB0byAjMS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgcmVzdCBvZgotJSB0aGUgaW5wdXQgbGluZSAoZXhjZXB0IHdlIHJlbW92ZSBhIHRyYWlsaW5nIGNvbW1lbnQpLiAgIzEgc2hvdWxkIGJlIGEKLSUgbWFjcm8gd2hpY2ggZXhwZWN0cyBhbiBvcmRpbmFyeSB1bmRlbGltaXRlZCBUZVggYXJndW1lbnQuCi0lCi1cZGVmXHBhcnNlYXJnIzF7JQotICBcbGV0XG5leHQgPSAjMSUKLSAgXGJlZ2luZ3JvdXAKLSAgICBcb2JleWxpbmVzCi0gICAgXGZ1dHVyZWxldFx0ZW1wXHBhcnNlYXJneAotfQotCi0lIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIG9iZXllZCBzcGFjZSAoZnJvbSBhbiBAZXhhbXBsZSBlbnZpcm9ubWVudCBvcgotJSB0aGUgbGlrZSksIHJlbW92ZSBpdCBhbmQgcmVjdXJzZS4gIE90aGVyd2lzZSwgd2UncmUgZG9uZS4KLVxkZWZccGFyc2Vhcmd4eyUKLSAgJSBcb2JleWVkc3BhY2UgaXMgZGVmaW5lZCBmYXIgYmVsb3csIGFmdGVyIHRoZSBkZWZpbml0aW9uIG9mIFxzZXBzcGFjZXMuCi0gIFxpZnhcb2JleWVkc3BhY2VcdGVtcAotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2Rpc2NhcmRzcGFjZQotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZ2xpbmUKLSAgXGZpCi19Ci0KLSUgUmVtb3ZlIGEgc2luZ2xlIHNwYWNlIChhcyB0aGUgZGVsaW1pdGVyIHRva2VuIHRvIHRoZSBtYWNybyBjYWxsKS4KLXtcb2JleXNwYWNlcyAlCi0gXGdkZWZccGFyc2VhcmdkaXNjYXJkc3BhY2Uge1xmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3h9fQotCi17XG9iZXlsaW5lcyAlCi0gIFxnZGVmXHBhcnNlYXJnbGluZSMxXl5NeyUKLSAgICBcZW5kZ3JvdXAgJSBFbmQgb2YgdGhlIGdyb3VwIHN0YXJ0ZWQgaW4gXHBhcnNlYXJnLgotICAgICUKLSAgICAlIEZpcnN0IHJlbW92ZSBhbnkgQGMgY29tbWVudCwgdGhlbiBhbnkgQGNvbW1lbnQuCi0gICAgJSBSZXN1bHQgb2YgZWFjaCBtYWNybyBpcyBwdXQgaW4gXHRva3MwLgotICAgIFxhcmdyZW1vdmVjICMxXGNccmVsYXggJQotICAgIFxleHBhbmRhZnRlclxhcmdyZW1vdmVjb21tZW50IFx0aGVcdG9rczAgXGNvbW1lbnRccmVsYXggJQotICAgICUKLSAgICAlIENhbGwgdGhlIGNhbGxlcidzIG1hY3JvLCBzYXZlZCBhcyBcbmV4dCBpbiBccGFyc2VhcmcuCi0gICAgXGV4cGFuZGFmdGVyXG5leHRcZXhwYW5kYWZ0ZXJ7XHRoZVx0b2tzMH0lCi0gIH0lCi19Ci0KLSUgU2luY2UgYWxsIFxjeyxvbW1lbnR9IGRvZXMgaXMgdGhyb3cgYXdheSB0aGUgYXJndW1lbnQsIHdlIGNhbiBsZXQgVGVYCi0lIGRvIHRoYXQgZm9yIHVzLiAgVGhlIFxyZWxheCBoZXJlIGlzIG1hdGNoZWQgYnkgdGhlIFxyZWxheCBpbiB0aGUgY2FsbAotJSBpbiBccGFyc2VhcmdsaW5lOyBpdCBjb3VsZCBiZSBtb3JlIG9yIGxlc3MgYW55dGhpbmcsIGl0cyBwdXJwb3NlIGlzCi0lIGp1c3QgdG8gZGVsaW1pdCB0aGUgYXJndW1lbnQgdG8gdGhlIFxjLgotXGRlZlxhcmdyZW1vdmVjIzFcYyMyXHJlbGF4e1x0b2tzMCA9IHsjMX19Ci1cZGVmXGFyZ3JlbW92ZWNvbW1lbnQjMVxjb21tZW50IzJccmVsYXh7XHRva3MwID0geyMxfX0KLQotJSBcYXJncmVtb3ZlY3ssb21tZW50fSBtaWdodCBsZWF2ZSB1cyB3aXRoIHRyYWlsaW5nIHNwYWNlcywgdGhvdWdoOyBlLmcuLAotJSAgICBAZW5kIGl0ZW1pemUgIEBjIGZvbwotJSB3aWxsIGhhdmUgdHdvIGFjdGl2ZSBzcGFjZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgd2l0aCB0aGUKLSUgYGl0ZW1pemUnLiAgSGVyZSB3ZSByZW1vdmUgYWxsIGFjdGl2ZSBzcGFjZXMgZnJvbSAjMSwgYW5kIGFzc2lnbiB0aGUKLSUgcmVzdWx0IHRvIFx0b2tzMC4KLSUKLSUgVGhpcyBsb3NlcyBpZiB0aGVyZSBhcmUgYW55ICpvdGhlciogYWN0aXZlIGNoYXJhY3RlcnMgYmVzaWRlcyBzcGFjZXMKLSUgaW4gdGhlIGFyZ3VtZW50IC0tIF8gXiArLCBmb3IgZXhhbXBsZSAtLSBzaW5jZSB0aGV5IGdldCBleHBhbmRlZC4KLSUgRm9ydHVuYXRlbHksIFRleGluZm8gZG9lcyBub3QgZGVmaW5lIGFueSBzdWNoIGNvbW1hbmRzLiAgKElmIGl0IGV2ZXIKLSUgZG9lcywgdGhlIGNhdGNvZGUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gcXVlc3Rpb253aWxsIGhhdmUgdG8gYmUgY2hhbmdlZAotJSBoZXJlLikgIEJ1dCB0aGlzIG1lYW5zIHdlIGNhbm5vdCBjYWxsIFxyZW1vdmVhY3RpdmVzcGFjZXMgYXMgcGFydCBvZgotJSBcYXJncmVtb3ZlY3ssb21tZW50fSwgc2luY2UgQGMgdXNlcyBccGFyc2VhcmcsIGFuZCB0aHVzIHRoZSBhcmd1bWVudAotJSB0aGF0IFxwYXJzZWFyZyBnZXRzIG1pZ2h0IHdlbGwgaGF2ZSBhbnkgY2hhcmFjdGVyIGF0IGFsbCBpbiBpdC4KLSUKLVxkZWZccmVtb3ZlYWN0aXZlc3BhY2VzIzF7JQotICBcYmVnaW5ncm91cAotICAgIFxpZ25vcmVhY3RpdmVzcGFjZXMKLSAgICBcZWRlZlx0ZW1weyMxfSUKLSAgICBcZ2xvYmFsXHRva3MwID0gXGV4cGFuZGFmdGVye1x0ZW1wfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQ2hhbmdlIHRoZSBhY3RpdmUgc3BhY2UgdG8gZXhwYW5kIHRvIG5vdGhpbmcuCi0lCi1cYmVnaW5ncm91cAotICBcb2JleXNwYWNlcwotICBcZ2RlZlxpZ25vcmVhY3RpdmVzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cZW1wdHl9Ci1cZW5kZ3JvdXAKLQotCi1cZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQotCi0lJSBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIEBiZWdpbi9AZW5kIGxldmVscyBmcm9tIHJ1bm5pbmcgYXdheQotJSUgQ2FsbCBcaW5FTlYgd2l0aGluIGVudmlyb25tZW50cyAoYWZ0ZXIgYSBcYmVnaW5ncm91cCkKLVxuZXdpZlxpZkVOViBcRU5WZmFsc2UgXGRlZlxpbkVOVntcaWZFTlZccmVsYXhcZWxzZVxFTlZ0cnVlXGZpfQotXGRlZlxFTlZjaGVja3slCi1caWZFTlZcZXJybWVzc2FnZXtTdGlsbCB3aXRoaW4gYW4gZW52aXJvbm1lbnQ7IHByZXNzIFJFVFVSTiB0byBjb250aW51ZX0KLVxlbmRncm91cFxmaX0gJSBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXQgc2hvdWxkIHJlZHVjZSBsb3NzYWdlCi0KLSUgQGJlZ2luIGZvbyAgaXMgdGhlIHNhbWUgYXMgQGZvbywgZm9yIG5vdy4KLVxuZXdoZWxwXEVNc2ltcGxle1ByZXNzIFJFVFVSTiB0byBjb250aW51ZS59Ci0KLVxvdXRlclxkZWZcYmVnaW57XHBhcnNlYXJnXGJlZ2lueHh4fQotCi1cZGVmXGJlZ2lueHh4ICMxeyUKLVxleHBhbmRhZnRlclxpZnhcY3NuYW1lICMxXGVuZGNzbmFtZVxyZWxheAote1xlcnJoZWxwPVxFTXNpbXBsZSBcZXJybWVzc2FnZXtVbmRlZmluZWQgY29tbWFuZCBAYmVnaW4gIzF9fVxlbHNlCi1cY3NuYW1lICMxXGVuZGNzbmFtZVxmaX0KLQotJSBAZW5kIGZvbyBleGVjdXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBcRWZvby4KLSUKLVxkZWZcZW5ke1xwYXJzZWFyZ1xlbmR4eHh9Ci1cZGVmXGVuZHh4eCAjMXslCi0gIFxyZW1vdmVhY3RpdmVzcGFjZXN7IzF9JQotICBcZWRlZlxlbmR0aGluZ3tcdGhlXHRva3MwfSUKLSAgJQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZVxyZWxheAotICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFxlbmR0aGluZ1xlbmRjc25hbWVccmVsYXgKLSAgICAgICUgVGhlcmUncyBubyBcZm9vLCBpLmUuLCBubyBgYGVudmlyb25tZW50JycgZm9vLgotICAgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgICAgIFxlcnJtZXNzYWdle1VuZGVmaW5lZCBjb21tYW5kIGBAZW5kIFxlbmR0aGluZyd9JQotICAgIFxlbHNlCi0gICAgICBcdW5tYXRjaGVkZW5kZXJyb3JcZW5kdGhpbmcKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIEV2ZXJ5dGhpbmcncyBvazsgdGhlIHJpZ2h0IGVudmlyb25tZW50IGhhcyBiZWVuIHN0YXJ0ZWQuCi0gICAgXGNzbmFtZSBFXGVuZHRoaW5nXGVuZGNzbmFtZQotICBcZmkKLX0KLQotJSBUaGVyZSBpcyBhbiBlbnZpcm9ubWVudCAjMSwgYnV0IGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQuICBHaXZlIGFuIGVycm9yLgotJQotXGRlZlx1bm1hdGNoZWRlbmRlcnJvciMxeyUKLSAgXGVycmhlbHAgPSBcRU1zaW1wbGUKLSAgXGVycm1lc3NhZ2V7VGhpcyBgQGVuZCAjMScgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgYEAjMSd9JQotfQotCi0lIERlZmluZSB0aGUgY29udHJvbCBzZXF1ZW5jZSBcRSMxIHRvIGdpdmUgYW4gdW5tYXRjaGVkIEBlbmQgZXJyb3IuCi0lCi1cZGVmXGRlZmluZXVubWF0Y2hlZGVuZCMxeyUKLSAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcdW5tYXRjaGVkZW5kZXJyb3J7IzF9fSUKLX0KLQotCi0lIFNpbmdsZS1zcGFjaW5nIGlzIGRvbmUgYnkgdmFyaW91cyBlbnZpcm9ubWVudHMgKHNwZWNpZmljYWxseSwgaW4KLSUgXG5vbmZpbGxzdGFydCBhbmQgXHF1b3RhdGlvbnMpLgotXG5ld3NraXBcc2luZ2xlc3BhY2Vza2lwIFxzaW5nbGVzcGFjZXNraXAgPSAxMi41cHQKLVxkZWZcc2luZ2xlc3BhY2V7JQotICAlIFdoeSB3YXMgdGhpcyBrZXJuIGhlcmU/ICBJdCBtZXNzZXMgdXAgZXF1YWxpemluZyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cKLSAgJSBlbnZpcm9ubWVudHMuICAtLWthcmwsIDZtYXk5MwotICAle1xhZHZhbmNlIFxiYXNlbGluZXNraXAgYnkgLVxzaW5nbGVzcGFjZXNraXAKLSAgJVxrZXJuIFxiYXNlbGluZXNraXB9JQotICBcc2V0bGVhZGluZyBcc2luZ2xlc3BhY2Vza2lwCi19Ci0KLSUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKLQotJSBAQCBwcmludHMgYW4gQAotJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgotXGRlZlxAe3tcdHRcY2hhcjY0fX0KLQotJSBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZAotJSBhbmQgeW91IGNhbiB1c2UgQHd7Li4ufSBhcm91bmQgYSBxdW90ZSB0byBzdXBwcmVzcyBsaWdhdHVyZXMuCi0lJSBEZWZpbmUgQGAgYW5kIEAnIHRvIGJlIHRoZSBzYW1lIGFzIGAgYW5kICcKLSUlIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCi0lXGRlZlxge3tgfX0KLSVcZGVmXCd7eyd9fQotCi0lIFVzZWQgdG8gZ2VuZXJhdGUgcXVvdGVkIGJyYWNlcy4KLVxkZWZcbXlsYnJhY2Uge3tcdHRcY2hhcjEyM319Ci1cZGVmXG15cmJyYWNlIHt7XHR0XGNoYXIxMjV9fQotXGxldFx7PVxteWxicmFjZQotXGxldFx9PVxteXJicmFjZQotXGJlZ2luZ3JvdXAKLSAgJSBEZWZpbml0aW9ucyB0byBwcm9kdWNlIGFjdHVhbCBceyAmIFx9IGNvbW1hbmQgaW4gYW4gaW5kZXguCi0gIFxjYXRjb2RlYFx7ID0gMTIgXGNhdGNvZGVgXH0gPSAxMgotICBcY2F0Y29kZWBcWyA9IDEgXGNhdGNvZGVgXF0gPSAyCi0gIFxjYXRjb2RlYFxAID0gMCBcY2F0Y29kZWBcXCA9IDEyCi0gIEBnZGVmQGxicmFjZWNtZFtce10lCi0gIEBnZGVmQHJicmFjZWNtZFtcfV0lCi1AZW5kZ3JvdXAKLQotJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50Ci0lIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB2IEBILgotXGxldFwsID0gXGMKLVxsZXRcZG90YWNjZW50ID0gXC4KLVxkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQotXGxldFx0aWVhY2NlbnQgPSBcdAotXGxldFx1YmFyYWNjZW50ID0gXGIKLVxsZXRcdWRvdGFjY2VudCA9IFxkCi0KLSUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duCi0lIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAoYW5kIGxvd2VyY2FzZSB2ZXJzaW9ucykgQHNzLgotXGRlZlxxdWVzdGlvbmRvd257P2B9Ci1cZGVmXGV4Y2xhbWRvd257IWB9Ci0KLSUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCi1cZGVmXGltYWNyb3tpfQotXGRlZlxqbWFjcm97an0KLVxkZWZcZG90bGVzcyMxeyUKLSAgXGRlZlx0ZW1weyMxfSUKLSAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKLSAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCi0gIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQotICBcZmlcZmkKLX0KLQotJSBCZSBzdXJlIHdlJ3JlIGluIGhvcml6b250YWwgbW9kZSB3aGVuIGRvaW5nIGEgdGllLCBzaW5jZSB3ZSBtYWtlIHNwYWNlCi0lIGVxdWl2YWxlbnQgdG8gdGhpcyBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cy4gT3RoZXJ3aXNlLCBhIHNwYWNlCi0lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpbGwgc3RhcnQgd2l0aCBccGVuYWx0eSAtLSBhbmQKLSUgc2luY2UgXHBlbmFsdHkgaXMgdmFsaWQgaW4gdmVydGljYWwgbW9kZSwgd2UnZCBlbmQgdXAgcHV0dGluZyB0aGUKLSUgcGVuYWx0eSBvbiB0aGUgdmVydGljYWwgbGlzdCBpbnN0ZWFkIG9mIGluIHRoZSBuZXcgcGFyYWdyYXBoLgote1xjYXRjb2RlYEAgPSAxMQotICUgQXZvaWQgdXNpbmcgXEBNIGRpcmVjdGx5LCBiZWNhdXNlIHRoYXQgY2F1c2VzIHRyb3VibGUKLSAlIGlmIHRoZSBkZWZpbml0aW9uIGlzIHdyaXR0ZW4gaW50byBhbiBpbmRleCBmaWxlLgotIFxnbG9iYWxcbGV0XHRpZXBlbmFsdHkgPSBcQE0KLSBcZ2RlZlx0aWV7XGxlYXZldm1vZGVccGVuYWx0eVx0aWVwZW5hbHR5XCB9Ci19Ci0KLSUgQDogZm9yY2VzIG5vcm1hbCBzaXplIHdoaXRlc3BhY2UgZm9sbG93aW5nLgotXGRlZlw6e1xzcGFjZWZhY3Rvcj0xMDAwIH0KLQotJSBAKiBmb3JjZXMgYSBsaW5lIGJyZWFrLgotXGRlZlwqe1xoZmlsXGJyZWFrXGhib3h7fVxpZ25vcmVzcGFjZXN9Ci0KLSUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KLVxkZWZcLnsuXHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEAhIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBiYW5nLgotXGRlZlwheyFcc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQD8gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHF1ZXJ5LgotXGRlZlw/ez9cc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQHcgcHJldmVudHMgYSB3b3JkIGJyZWFrLiAgV2l0aG91dCB0aGUgXGxlYXZldm1vZGUsIEB3IGF0IHRoZQotJSBiZWdpbm5pbmcgb2YgYSBwYXJhZ3JhcGgsIHdoZW4gVGVYIGlzIHN0aWxsIGluIHZlcnRpY2FsIG1vZGUsIHdvdWxkCi0lIHByb2R1Y2UgYSB3aG9sZSBsaW5lIG9mIG91dHB1dCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIHRoZSBwYXJhZ3JhcGguCi1cZGVmXHcjMXtcbGVhdmV2bW9kZVxoYm94eyMxfX0KLQotJSBAZ3JvdXAgLi4uIEBlbmQgZ3JvdXAgZm9yY2VzIC4uLiB0byBiZSBhbGwgb24gb25lIHBhZ2UsIGJ5IGVuY2xvc2luZwotJSBpdCBpbiBhIFRlWCB2Ym94LiAgV2UgdXNlIFx2dG9wIGluc3RlYWQgb2YgXHZib3ggdG8gY29uc3RydWN0IHRoZSBib3gKLSUgdG8ga2VlcCBpdHMgaGVpZ2h0IHRoYXQgb2YgYSBub3JtYWwgbGluZS4gIEFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yCi0lIFx0b3Bza2lwIChwLjExNCBvZiB0aGUgVGVYYm9vayksIHRoZSBnbHVlIGluc2VydGVkIGlzCi0lIG1heCAoXHRvcHNraXAgLSBcaHQgKGZpcnN0IGl0ZW0pLCAwKS4gIElmIHRoYXQgaGVpZ2h0IGlzIGxhcmdlLAotJSB0aGVyZWZvcmUsIG5vIGdsdWUgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgaGVhZGxpbmUgYW5kCi0lIHRoZSB0ZXh0IGlzIHNtYWxsLCB3aGljaCBsb29rcyBiYWQuCi0lCi1cZGVmXGdyb3Vwe1xiZWdpbmdyb3VwCi0gIFxpZm51bVxjYXRjb2RlMTM9XGFjdGl2ZSBcZWxzZQotICAgIFxlcnJoZWxwID0gXGdyb3VwaW52YWxpZGhlbHAKLSAgICBcZXJybWVzc2FnZXtAZ3JvdXAgaW52YWxpZCBpbiBjb250ZXh0IHdoZXJlIGZpbGxpbmcgaXMgZW5hYmxlZH0lCi0gIFxmaQotICAlCi0gICUgVGhlIFx2dG9wIHdlIHN0YXJ0IGJlbG93IHByb2R1Y2VzIGEgYm94IHdpdGggbm9ybWFsIGhlaWdodCBhbmQgbGFyZ2UKLSAgJSBkZXB0aDsgdGh1cywgVGVYIHB1dHMgXGJhc2VsaW5lc2tpcCBnbHVlIGJlZm9yZSBpdCwgYW5kICh3aGVuIHRoZQotICAlIG5leHQgbGluZSBvZiB0ZXh0IGlzIGRvbmUpIFxsaW5lc2tpcCBnbHVlIGFmdGVyIGl0LiAgKFNlZSBwLjgyIG9mCi0gICUgdGhlIFRlWGJvb2suKSAgVGh1cywgc3BhY2UgYmVsb3cgaXMgbm90IHF1aXRlIGVxdWFsIHRvIHNwYWNlCi0gICUgYWJvdmUuICBCdXQgaXQncyBwcmV0dHkgY2xvc2UuCi0gIFxkZWZcRWdyb3VweyUKLSAgICBcZWdyb3VwICAgICAgICAgICAlIEVuZCB0aGUgXHZ0b3AuCi0gICAgXGVuZGdyb3VwICAgICAgICAgJSBFbmQgdGhlIFxncm91cC4KLSAgfSUKLSAgJQotICBcdnRvcFxiZ3JvdXAKLSAgICAlIFdlIGhhdmUgdG8gcHV0IGEgc3RydXQgb24gdGhlIGxhc3QgbGluZSBpbiBjYXNlIHRoZSBAZ3JvdXAgaXMgaW4KLSAgICAlIHRoZSBtaWRzdCBvZiBhbiBleGFtcGxlLCByYXRoZXIgdGhhbiBjb21wbGV0ZWx5IGVuY2xvc2luZyBpdC4KLSAgICAlIE90aGVyd2lzZSwgdGhlIGludGVybGluZSBzcGFjZSBiZXR3ZWVuIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGdyb3VwCi0gICAgJSBhbmQgdGhlIGZpcnN0IGxpbmUgYWZ0ZXJ3YXJkcyBpcyB0b28gc21hbGwuICBCdXQgd2UgY2FuJ3QgcHV0IHRoZQotICAgICUgc3RydXQgaW4gXEVncm91cCwgc2luY2UgdGhlcmUgaXQgd291bGQgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZi4KLSAgICAlIEhlbmNlIHRoaXMganVzdCBpbnNlcnRzIGEgc3RydXQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuCi0gICAgXGV2ZXJ5cGFyID0ge1xzdHJ1dH0lCi0gICAgJQotICAgICUgU2luY2Ugd2UgaGF2ZSBhIHN0cnV0IG9uIGV2ZXJ5IGxpbmUsIHdlIGRvbid0IG5lZWQgYW55IG9mIFRlWCdzCi0gICAgJSBub3JtYWwgaW50ZXJsaW5lIHNwYWNpbmcuCi0gICAgXG9mZmludGVybGluZXNraXAKLSAgICAlCi0gICAgJSBPSywgYnV0IG5vdyB3ZSBoYXZlIHRvIGRvIHNvbWV0aGluZyBhYm91dCBibGFuawotICAgICUgbGluZXMgaW4gdGhlIGlucHV0IGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLCB3aGljaCBub3JtYWxseQotICAgICUganVzdCB0dXJuIGludG8gXGxpc3BwYXIsIHdoaWNoIHdpbGwgaW5zZXJ0IG5vIHNwYWNlIG5vdyB0aGF0IHdlJ3ZlCi0gICAgJSB0dXJuZWQgb2ZmIHRoZSBpbnRlcmxpbmUgc3BhY2UuICBTaW1wbGVzdCBpcyB0byBtYWtlIHRoZW0gYmUgYW4KLSAgICAlIGVtcHR5IHBhcmFncmFwaC4KLSAgICBcaWZ4XHBhclxsaXNwcGFyCi0gICAgICBcZWRlZlxwYXJ7XGxlYXZldm1vZGUgXHBhcn0lCi0gICAgICAlCi0gICAgICAlIFJlc2V0IF5eTSdzIGRlZmluaXRpb24gdG8gbmV3IGRlZmluaXRpb24gb2YgXHBhci4KLSAgICAgIFxvYmV5bGluZXMKLSAgICBcZmkKLSAgICAlCi0gICAgJSBEbyBAY29tbWVudCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGluc2lkZSBhbiBlbnZpcm9ubWVudCBzdWNoIGFzCi0gICAgJSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBlbmQtb2YtbGluZSBpbiB0aGUgaW5wdXQgY2F1c2VzIGFuCi0gICAgJSBlbmQtb2YtbGluZSBpbiB0aGUgb3V0cHV0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZW5kLW9mLWxpbmUgYWZ0ZXIKLSAgICAlIHRoZSBgQGdyb3VwJyB0byBwdXQgZXh0cmEgc3BhY2UgaW4gdGhlIG91dHB1dC4gIFNpbmNlIEBncm91cAotICAgICUgc2hvdWxkIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIChhY2NvcmRpbmcgdG8gdGhlIFRleGluZm8KLSAgICAlIG1hbnVhbCksIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVhdGluZyBhbnkgdXNlciB0ZXh0LgotICAgIFxjb21tZW50Ci19Ci0lCi0lIFRlWCBwdXRzIGluIGFuIFxlc2NhcGVjaGFyIChpLmUuLCBgQCcpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlbHAKLSUgbWVzc2FnZSwgc28gdGhpcyBlbmRzIHVwIHByaW50aW5nIGBAZ3JvdXAgY2FuIG9ubHkgLi4uJy4KLSUKLVxuZXdoZWxwXGdyb3VwaW52YWxpZGhlbHB7JQotZ3JvdXAgY2FuIG9ubHkgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZSxeXkolCi13aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQgcHJvZHVjZXMgYSBsaW5lIG9mIG91dHB1dC59Ci0KLSUgQG5lZWQgc3BhY2UtaW4tbWlscwotJSBmb3JjZXMgYSBwYWdlIGJyZWFrIGlmIHRoZXJlIGlzIG5vdCBzcGFjZS1pbi1taWxzIHJlbWFpbmluZy4KLQotXG5ld2RpbWVuXG1pbCAgXG1pbD0wLjAwMWluCi0KLVxkZWZcbmVlZHtccGFyc2VhcmdcbmVlZHh9Ci0KLSUgT2xkIGRlZmluaXRpb24tLWRpZG4ndCB3b3JrLgotJVxkZWZcbmVlZHggIzF7XHBhciAlCi0lJSBUaGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIFRlWCBicmVhayB0aGUgcGFnZSBuYXR1cmFsbHkKLSUlIGlmIHRoZSBkZXB0aCBvZiB0aGUgYm94IGRvZXMgbm90IGZpdC4KLSV7XGJhc2VsaW5lc2tpcD0wcHQlCi0lXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfVxrZXJuIC0jMVxtaWxcbm9icmVhawotJVxwcmV2ZGVwdGg9LTEwMDBwdAotJX19Ci0KLVxkZWZcbmVlZHgjMXslCi0gICUgRW5zdXJlIHZlcnRpY2FsIG1vZGUsIHNvIHdlIGRvbid0IG1ha2UgYSBiaWcgYm94IGluIHRoZSBtaWRkbGUgb2YgYQotICAlIHBhcmFncmFwaC4KLSAgXHBhcgotICAlCi0gICUgSWYgdGhlIEBuZWVkIHZhbHVlIGlzIGxlc3MgdGhhbiBvbmUgbGluZSBzcGFjZSwgaXQncyB1c2VsZXNzLgotICBcZGltZW4wID0gIzFcbWlsCi0gIFxkaW1lbjIgPSBcaHRcc3RydXRib3gKLSAgXGFkdmFuY2VcZGltZW4yIGJ5IFxkcFxzdHJ1dGJveAotICBcaWZkaW1cZGltZW4wID4gXGRpbWVuMgotICAgICUKLSAgICAlIERvIGEgXHN0cnV0IGp1c3QgdG8gbWFrZSB0aGUgaGVpZ2h0IG9mIHRoaXMgYm94IGJlIG5vcm1hbCwgc28gdGhlCi0gICAgJSBub3JtYWwgbGVhZGluZyBpcyBpbnNlcnRlZCByZWxhdGl2ZSB0byB0aGUgcHJlY2VkaW5nIGxpbmUuCi0gICAgJSBBbmQgYSBwYWdlIGJyZWFrIGhlcmUgaXMgZmluZS4KLSAgICBcdnRvcCB0byAjMVxtaWx7XHN0cnV0XHZmaWx9JQotICAgICUKLSAgICAlIFRlWCBkb2VzIG5vdCBldmVuIGNvbnNpZGVyIHBhZ2UgYnJlYWtzIGlmIGEgcGVuYWx0eSBhZGRlZCB0byB0aGUKLSAgICAlIG1haW4gdmVydGljYWwgbGlzdCBpcyAxMDAwMCBvciBtb3JlLiAgQnV0IGluIG9yZGVyIHRvIHNlZSBpZiB0aGUKLSAgICAlIGVtcHR5IGJveCB3ZSBqdXN0IGFkZGVkIGZpdHMgb24gdGhlIHBhZ2UsIHdlIG11c3QgbWFrZSBpdCBjb25zaWRlcgotICAgICUgcGFnZSBicmVha3MuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBicmVhayB0aGUKLSAgICAlIHBhZ2UgYWZ0ZXIgdGhlIGVtcHR5IGJveC4gIFNvIHdlIHVzZSBhIHBlbmFsdHkgb2YgOTk5OS4KLSAgICAlCi0gICAgJSBUaGVyZSBpcyBhbiBleHRyZW1lbHkgc21hbGwgY2hhbmNlIHRoYXQgVGVYIHdpbGwgYWN0dWFsbHkgYnJlYWsgdGhlCi0gICAgJSBwYWdlIGF0IHRoaXMgXHBlbmFsdHksIGlmIHRoZXJlIGFyZSBubyBvdGhlciBmZWFzaWJsZSBicmVha3BvaW50cyBpbgotICAgICUgc2lnaHQuICAoSWYgdGhlIHVzZXIgaXMgdXNpbmcgbG90cyBvZiBiaWcgQGdyb3VwIGNvbW1hbmRzLCB3aGljaAotICAgICUgYWxtb3N0LWJ1dC1ub3QtcXVpdGUgZmlsbCB1cCBhIHBhZ2UsIFRlWCB3aWxsIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcKLSAgICAlIGdvb2QgcGFnZSBicmVha2luZywgZm9yIGV4YW1wbGUuKSAgSG93ZXZlciwgSSBjb3VsZCBub3QgY29uc3RydWN0IGFuCi0gICAgJSBleGFtcGxlIHdoZXJlIGEgcGFnZSBicm9rZSBhdCB0aGlzIFxwZW5hbHR5OyBpZiBpdCBoYXBwZW5zIGluIGEgcmVhbAotICAgICUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHJlY29uc2lkZXIgb3VyIHN0cmF0ZWd5LgotICAgIFxwZW5hbHR5OTk5OQotICAgICUKLSAgICAlIEJhY2sgdXAgYnkgdGhlIHNpemUgb2YgdGhlIGJveCwgd2hldGhlciB3ZSBkaWQgYSBwYWdlIGJyZWFrIG9yIG5vdC4KLSAgICBca2VybiAtIzFcbWlsCi0gICAgJQotICAgICUgRG8gbm90IGFsbG93IGEgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIGtlcm4uCi0gICAgXG5vYnJlYWsKLSAgXGZpCi19Ci0KLSUgQGJyICAgZm9yY2VzIHBhcmFncmFwaCBicmVhawotCi1cbGV0XGJyID0gXHBhcgotCi0lIEBkb3Rze30gb3V0cHV0IGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCi0lIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIGEgdHlwZXdyaXRlcgotJSBmb250IGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVycy4KLSUKLVxkZWZcZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDEuNWVteyUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbCBtaW51cyAwLjI1ZmlsCi0gICAgLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLX0KLQotJSBAZW5kZG90c3t9IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBlbGxpcHNpcy4KLSUKLVxkZWZcZW5kZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDJlbXslCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuMjVmaWwgbWludXMgMC4yNWZpbAotICAgIC5caHNzLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLSAgXHNwYWNlZmFjdG9yPTMwMDAKLX0KLQotCi0lIEBwYWdlICAgIGZvcmNlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZQotJQotXGRlZlxwYWdle1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLQotJSBAZXhkZW50IHRleHQuLi4uCi0lIG91dHB1dHMgdGV4dCBvbiBzZXBhcmF0ZSBsaW5lIGluIHJvbWFuIGZvbnQsIHN0YXJ0aW5nIGF0IHN0YW5kYXJkIHBhZ2UgbWFyZ2luCi0KLSUgVGhpcyByZWNvcmRzIHRoZSBhbW91bnQgb2YgaW5kZW50IGluIHRoZSBpbm5lcm1vc3QgZW52aXJvbm1lbnQuCi0lIFRoYXQncyBob3cgbXVjaCBcZXhkZW50IHNob3VsZCB0YWtlIG91dC4KLVxuZXdza2lwXGV4ZGVudGFtb3VudAotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBmaWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBkZWZ1bi4KLVxkZWZcZXhkZW50e1xwYXJzZWFyZ1xleGRlbnR5eXl9Ci1cZGVmXGV4ZGVudHl5eSAjMXt7XGhmaWxcYnJlYWtcaGJveHtca2VybiAtXGV4ZGVudGFtb3VudHtccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBub2ZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUuCi1cZGVmXG5vZmlsbGV4ZGVudHtccGFyc2Vhcmdcbm9maWxsZXhkZW50eXl5fQotXGRlZlxub2ZpbGxleGRlbnR5eXkgIzF7e1xhZHZhbmNlIFxsZWZ0c2tpcCBieSAtXGV4ZGVudGFtb3VudAotXGxlZnRsaW5le1xoc2tpcFxsZWZ0c2tpcHtccm0jMX19fX0KLQotJSBAaW5tYXJnaW57VEVYVH0gcHV0cyBURVhUIGluIHRoZSBtYXJnaW4gbmV4dCB0byB0aGUgY3VycmVudCBwYXJhZ3JhcGguCi0KLVxkZWZcaW5tYXJnaW4jMXslCi1cc3RydXRcdmFkanVzdHtcbm9icmVha1xrZXJuLVxzdHJ1dGRlcHRoCi0gIFx2dG9wIHRvIFxzdHJ1dGRlcHRoe1xiYXNlbGluZXNraXBcc3RydXRkZXB0aFx2c3MKLSAgXGxsYXB7XHJpZ2h0c2tpcD1caW5tYXJnaW5zcGFjaW5nIFx2Ym94e1xub2luZGVudCAjMX19XG51bGx9fX0KLVxuZXdza2lwXGlubWFyZ2luc3BhY2luZyBcaW5tYXJnaW5zcGFjaW5nPTFjbQotXGRlZlxzdHJ1dGRlcHRoe1xkcFxzdHJ1dGJveH0KLQotJVxoYm94e3tccm0jMX19XGhmaWxcYnJlYWt9fQotCi0lIEBpbmNsdWRlIGZpbGUgICAgaW5zZXJ0IHRleHQgb2YgdGhhdCBmaWxlIGFzIGlucHV0LgotJSBBbGxvdyBub3JtYWwgY2hhcmFjdGVycyB0aGF0ICB3ZSBtYWtlIGFjdGl2ZSBpbiB0aGUgYXJndW1lbnQgKGEgZmlsZSBuYW1lKS4KLVxkZWZcaW5jbHVkZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXD0xMgotICBcY2F0Y29kZWB+PTEyCi0gIFxjYXRjb2RlYF49MTIKLSAgXGNhdGNvZGVgXz0xMgotICBcY2F0Y29kZWB8PTEyCi0gIFxjYXRjb2RlYDw9MTIKLSAgXGNhdGNvZGVgPj0xMgotICBcY2F0Y29kZWArPTEyCi0gIFxwYXJzZWFyZ1xpbmNsdWRlenp6fQotJSBSZXN0b3JlIGFjdGl2ZSBjaGFycyBmb3IgaW5jbHVkZWQgZmlsZS4KLVxkZWZcaW5jbHVkZXp6eiMxe1xlbmRncm91cFxiZWdpbmdyb3VwCi0gICUgUmVhZCB0aGUgaW5jbHVkZWQgZmlsZSBpbiBhIGdyb3VwIHNvIG5lc3RlZCBAaW5jbHVkZSdzIHdvcmsuCi0gIFxkZWZcdGhpc2ZpbGV7IzF9JQotICBcaW5wdXRcdGhpc2ZpbGUKLVxlbmRncm91cH0KLQotXGRlZlx0aGlzZmlsZXt9Ci0KLSUgQGNlbnRlciBsaW5lICAgb3V0cHV0cyB0aGF0IGxpbmUsIGNlbnRlcmVkCi0KLVxkZWZcY2VudGVye1xwYXJzZWFyZ1xjZW50ZXJ6enp9Ci1cZGVmXGNlbnRlcnp6eiAjMXt7XGFkdmFuY2VcaHNpemUgYnkgLVxsZWZ0c2tpcAotXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKLVxjZW50ZXJsaW5leyMxfX19Ci0KLSUgQHNwIG4gICBvdXRwdXRzIG4gbGluZXMgb2YgdmVydGljYWwgc3BhY2UKLQotXGRlZlxzcHtccGFyc2Vhcmdcc3B4eHh9Ci1cZGVmXHNweHh4ICMxe1x2c2tpcCAjMVxiYXNlbGluZXNraXB9Ci0KLSUgQGNvbW1lbnQgLi4ubGluZSB3aGljaCBpcyBpZ25vcmVkLi4uCi0lIEBjIGlzIHRoZSBzYW1lIGFzIEBjb21tZW50Ci0lIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlICBpcyBhbm90aGVyIHdheSB0byB3cml0ZSBhIGNvbW1lbnQKLQotXGRlZlxjb21tZW50e1xiZWdpbmdyb3VwIFxjYXRjb2RlYFxeXk09XG90aGVyJQotXGNhdGNvZGVgXEA9XG90aGVyIFxjYXRjb2RlYFx7PVxvdGhlciBcY2F0Y29kZWBcfT1cb3RoZXIlCi1cY29tbWVudHh4eH0KLXtcY2F0Y29kZWBcXl5NPVxvdGhlciBcZ2RlZlxjb21tZW50eHh4IzFeXk17XGVuZGdyb3VwfX0KLQotXGxldFxjPVxjb21tZW50Ci0KLSUgQHBhcmFncmFwaGluZGVudCBOQ0hBUlMKLSUgV2UnbGwgdXNlIGVtcyBmb3IgTkNIQVJTLCBjbG9zZSBlbm91Z2guCi0lIFdlIGNhbm5vdCBpbXBsZW1lbnQgQHBhcmFncmFwaGluZGVudCBhc2lzLCB0aG91Z2guCi0lIAotXGRlZlxhc2lzd29yZHthc2lzfSAlIG5vIHRyYW5zbGF0aW9uLCB0aGVzZSBhcmUga2V5d29yZHMKLVxkZWZcbm9uZXdvcmR7bm9uZX0KLSUKLVxkZWZccGFyYWdyYXBoaW5kZW50e1xwYXJzZWFyZ1xkb3BhcmFncmFwaGluZGVudH0KLVxkZWZcZG9wYXJhZ3JhcGhpbmRlbnQjMXslCi0gIFxkZWZcdGVtcHsjMX0lCi0gIFxpZnhcdGVtcFxhc2lzd29yZAotICBcZWxzZQotICAgIFxpZnhcdGVtcFxub25ld29yZAotICAgICAgXGRlZmF1bHRwYXJpbmRlbnQgPSAwcHQKLSAgICBcZWxzZQotICAgICAgXGRlZmF1bHRwYXJpbmRlbnQgPSAjMWVtCi0gICAgXGZpCi0gIFxmaQotICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKLX0KLQotJSBAZXhhbXBsZWluZGVudCBOQ0hBUlMKLSUgV2UnbGwgdXNlIGVtcyBmb3IgTkNIQVJTIGxpa2UgQHBhcmFncmFwaGluZGVudC4KLSUgSXQgc2VlbXMgQGV4YW1wbGVpbmRlbnQgYXNpcyBpc24ndCBuZWNlc3NhcnksIGJ1dAotJSBJIHByZXNlcnZlIGl0IHRvIG1ha2UgaXQgc2ltaWxhciB0byBAcGFyYWdyYXBoaW5kZW50LgotXGRlZlxleGFtcGxlaW5kZW50e1xwYXJzZWFyZ1xkb2V4YW1wbGVpbmRlbnR9Ci1cZGVmXGRvZXhhbXBsZWluZGVudCMxeyUKLSAgXGRlZlx0ZW1weyMxfSUKLSAgXGlmeFx0ZW1wXGFzaXN3b3JkCi0gIFxlbHNlCi0gICAgXGlmeFx0ZW1wXG5vbmV3b3JkCi0gICAgICBcbGlzcG5hcnJvd2luZyA9IDBwdAotICAgIFxlbHNlCi0gICAgICBcbGlzcG5hcnJvd2luZyA9ICMxZW0KLSAgICBcZmkKLSAgXGZpCi19Ci0KLSUgQGFzaXMganVzdCB5aWVsZHMgaXRzIGFyZ3VtZW50LiAgVXNlZCB3aXRoIEB0YWJsZSwgZm9yIGV4YW1wbGUuCi0lCi1cZGVmXGFzaXMjMXsjMX0KLQotJSBAbWF0aCBtZWFucyBvdXRwdXQgaW4gbWF0aCBtb2RlLgotJSBXZSBkb24ndCB1c2UgJCdzIGRpcmVjdGx5IGluIHRoZSBkZWZpbml0aW9uIG9mIFxtYXRoIGJlY2F1c2UgY29udHJvbAotJSBzZXF1ZW5jZXMgbGlrZSBcbWF0aCBhcmUgZXhwYW5kZWQgd2hlbiB0aGUgdG9jIGZpbGUgaXMgd3JpdHRlbi4gIFRoZW4sCi0lIHdlIHJlYWQgdGhlIHRvYyBmaWxlIGJhY2ssIHRoZSAkJ3Mgd2lsbCBiZSBub3JtYWwgY2hhcmFjdGVycyAoYXMgdGhleQotJSBzaG91bGQgYmUsIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiBUZXhpbmZvKS4gIFNvIHdlIG11c3QgdXNlIGEKLSUgY29udHJvbCBzZXF1ZW5jZSB0byBzd2l0Y2ggaW50byBhbmQgb3V0IG9mIG1hdGggbW9kZS4KLSUKLSUgVGhpcyBpc24ndCBxdWl0ZSBlbm91Z2ggZm9yIEBtYXRoIHRvIHdvcmsgcHJvcGVybHkgaW4gaW5kaWNlcywgYnV0IGl0Ci0lIHNlZW1zIHVubGlrZWx5IGl0IHdpbGwgZXZlciBiZSBuZWVkZWQgdGhlcmUuCi0lCi1cbGV0XGltcGxpY2l0bWF0aCA9ICQKLVxkZWZcbWF0aCMxe1xpbXBsaWNpdG1hdGggIzFcaW1wbGljaXRtYXRofQotCi0lIEBidWxsZXQgYW5kIEBtaW51cyBuZWVkIHRoZSBzYW1lIHRyZWF0bWVudCBhcyBAbWF0aCwganVzdCBhYm92ZS4KLVxkZWZcYnVsbGV0e1xpbXBsaWNpdG1hdGhccHRleGJ1bGxldFxpbXBsaWNpdG1hdGh9Ci1cZGVmXG1pbnVze1xpbXBsaWNpdG1hdGgtXGltcGxpY2l0bWF0aH0KLQotJSBAcmVmaWxsIGlzIGEgbm8tb3AuCi1cbGV0XHJlZmlsbD1ccmVsYXgKLQotJSBJZiB3b3JraW5nIG9uIGEgbGFyZ2UgZG9jdW1lbnQgaW4gY2hhcHRlcnMsIGl0IGlzIGNvbnZlbmllbnQgdG8KLSUgYmUgYWJsZSB0byBkaXNhYmxlIGluZGV4aW5nLCBjcm9zcy1yZWZlcmVuY2luZywgYW5kIGNvbnRlbnRzLCBmb3IgdGVzdCBydW5zLgotJSBUaGlzIGlzIGRvbmUgd2l0aCBAbm92YWxpZGF0ZSAoYmVmb3JlIEBzZXRmaWxlbmFtZSkuCi0lCi1cbmV3aWZcaWZsaW5rcyBcbGlua3N0cnVlICUgYnkgZGVmYXVsdCB3ZSB3YW50IHRoZSBhdXggZmlsZXMuCi1cbGV0XG5vdmFsaWRhdGUgPSBcbGlua3NmYWxzZQotCi0lIEBzZXRmaWxlbmFtZSBpcyBkb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgdGV4aW5mbyBmaWxlLgotJSBTbyBvcGVuIGhlcmUgdGhlIGZpbGVzIHdlIG5lZWQgdG8gaGF2ZSBvcGVuIHdoaWxlIHJlYWRpbmcgdGhlIGlucHV0LgotJSBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1ha2UgYSAuZm10IGZpbGUgZm9yIHRleGluZm8uCi1cZGVmXHNldGZpbGVuYW1leyUKLSAgIFxpZmxpbmtzCi0gICAgIFxyZWFkYXV4ZmlsZQotICAgXGZpICUgXG9wZW5pbmRpY2VzIG5lZWRzIHRvIGRvIHNvbWUgd29yayBpbiBhbnkgY2FzZS4KLSAgIFxvcGVuaW5kaWNlcwotICAgXGZpeGJhY2tzbGFzaCAgJSBUdXJuIG9mZiBoYWNrIHRvIHN3YWxsb3cgYFxpbnB1dCB0ZXhpbmZvJy4KLSAgIFxnbG9iYWxcbGV0XHNldGZpbGVuYW1lPVxjb21tZW50ICUgSWdub3JlIGV4dHJhIEBzZXRmaWxlbmFtZSBjbWRzLgotICAgJQotICAgJSBJZiB0ZXhpbmZvLmNuZiBpcyBwcmVzZW50IG9uIHRoZSBzeXN0ZW0sIHJlYWQgaXQuCi0gICAlIFVzZWZ1bCBmb3Igc2l0ZS13aWRlIEBhZm91cnBhcGVyLCBldGMuCi0gICAlIEp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSwgY2xvc2UgdGhlIGlucHV0IHN0cmVhbSBiZWZvcmUgdGhlIFxpbnB1dC4KLSAgIFxvcGVuaW4gMSB0ZXhpbmZvLmNuZgotICAgXGlmZW9mMSBcbGV0XHRlbXA9XHJlbGF4IFxlbHNlIFxkZWZcdGVtcHtcaW5wdXQgdGV4aW5mby5jbmYgfVxmaQotICAgXGNsb3NlaW4xCi0gICBcdGVtcAotICAgJQotICAgXGNvbW1lbnQgJSBJZ25vcmUgdGhlIGFjdHVhbCBmaWxlbmFtZS4KLX0KLQotJSBDYWxsZWQgZnJvbSBcc2V0ZmlsZW5hbWUuCi0lCi1cZGVmXG9wZW5pbmRpY2VzeyUKLSAgXG5ld2luZGV4e2NwfSUKLSAgXG5ld2NvZGVpbmRleHtmbn0lCi0gIFxuZXdjb2RlaW5kZXh7dnJ9JQotICBcbmV3Y29kZWluZGV4e3RwfSUKLSAgXG5ld2NvZGVpbmRleHtreX0lCi0gIFxuZXdjb2RlaW5kZXh7cGd9JQotfQotCi0lIEBieWUuCi1cb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KLQotCi1cbWVzc2FnZXtwZGYsfQotJSBhZG9iZSBgcG9ydGFibGUnIGRvY3VtZW50IGZvcm1hdAotXG5ld2NvdW50XHRlbXBudW0KLVxuZXdjb3VudFxsbmtjb3VudAotXG5ld3Rva3NcZmlsZW5hbWUKLVxuZXdjb3VudFxmaWxlbmFtZWxlbmd0aAotXG5ld2NvdW50XHBnbgotXG5ld3Rva3NcdG9rc0EKLVxuZXd0b2tzXHRva3NCCi1cbmV3dG9rc1x0b2tzQwotXG5ld3Rva3NcdG9rc0QKLVxuZXdib3hcYm94QQotXG5ld2NvdW50XGNvdW50QQotXG5ld2lmXGlmcGRmCi1cbmV3aWZcaWZwZGZtYWtlcGFnZWRlc3QKLQotXGlmeFxwZGZvdXRwdXRcdW5kZWZpbmVkCi0gIFxwZGZmYWxzZQotICBcbGV0XHBkZm1rZGVzdCA9IFxnb2JibGUKLSAgXGxldFxwZGZ1cmwgPSBcZ29iYmxlCi0gIFxsZXRcZW5kbGluayA9IFxyZWxheAotICBcbGV0XGxpbmtjb2xvciA9IFxyZWxheAotICBcbGV0XHBkZm1ha2VvdXRsaW5lcyA9IFxyZWxheAotXGVsc2UKLSAgXHBkZnRydWUKLSAgXHBkZm91dHB1dCA9IDEKLSAgXGlucHV0IHBkZmNvbG9yCi0gIFxkZWZcZG9wZGZpbWFnZSMxIzIjM3slCi0gICAgXGRlZlxpbWFnZXdpZHRoeyMyfSUKLSAgICBcZGVmXGltYWdlaGVpZ2h0eyMzfSUKLSAgICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0Ci0gICAgICBccGRmaW1hZ2UKLSAgICBcZWxzZQotICAgICAgXHBkZnhpbWFnZQotICAgIFxmaQotICAgICAgXGlmeFxlbXB0eVxpbWFnZXdpZHRoXGVsc2Ugd2lkdGggXGltYWdld2lkdGggXGZpCi0gICAgICBcaWZ4XGVtcHR5XGltYWdlaGVpZ2h0XGVsc2UgaGVpZ2h0IFxpbWFnZWhlaWdodCBcZmkKLSAgICAgIHsjMS5wZGZ9JQotICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQgXGVsc2UKLSAgICAgIFxwZGZyZWZ4aW1hZ2UgXHBkZmxhc3R4aW1hZ2UKLSAgICBcZml9Ci0gIFxkZWZccGRmbWtkZXN0IzF7XHBkZmRlc3QgbmFtZXsjMUB9IHh5en0KLSAgXGRlZlxwZGZta3BnbiMxeyMxQH0KLSAgXGxldFxsaW5rY29sb3IgPSBcQ3lhbgotICBcZGVmXGVuZGxpbmt7XEJsYWNrXHBkZmVuZGxpbmt9Ci0gICUgQWRkaW5nIG91dGxpbmVzIHRvIFBERjsgbWFjcm9zIGZvciBjYWxjdWxhdGluZyBzdHJ1Y3R1cmUgb2Ygb3V0bGluZXMKLSAgJSBjb21lIGZyb20gUGV0ciBPbHNhawotICBcZGVmXGV4cG51bWJlciMxe1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIzFcZW5kY3NuYW1lXHJlbGF4IDAlCi0gICAgXGVsc2UgXGNzbmFtZSMxXGVuZGNzbmFtZSBcZml9Ci0gIFxkZWZcYWR2YW5jZW51bWJlciMxe1x0ZW1wbnVtPVxleHBudW1iZXJ7IzF9XHJlbGF4Ci0gICAgXGFkdmFuY2VcdGVtcG51bSBieTEKLSAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMVxlbmRjc25hbWV7XHRoZVx0ZW1wbnVtfX0KLSAgXGRlZlxwZGZtYWtlb3V0bGluZXN7eyUKLSAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgXGlmZW9mIDFcZWxzZVxiZ3JvdXAKLSAgICAgIFxjbG9zZWluIDEgCi0gICAgICBcaW5kZXhub2ZvbnRzCi0gICAgICBcZGVmXHR0e30KLSAgICAgICUgdGhhbmgncyBoYWNrIC8gcHJvcGVyIGJyYWNlcyBpbiBib29rbWFya3MgIAotICAgICAgXGVkZWZcbXlsYnJhY2V7XGlmdHJ1ZSBcc3RyaW5ne1xlbHNlfVxmaX1cbGV0XHs9XG15bGJyYWNlCi0gICAgICBcZWRlZlxteXJicmFjZXtcaWZmYWxzZXtcZWxzZVxzdHJpbmd9XGZpfVxsZXRcfT1cbXlyYnJhY2UKLSAgICAgICUKLSAgICAgIFxkZWZcY2hhcGVudHJ5ICMjMSMjMiMjM3t9Ci0gICAgICBcZGVmXHVubnVtYmNoYXBlbnRyeSAjIzEjIzJ7fQotICAgICAgXGRlZlxzZWNlbnRyeSAjIzEjIzIjIzMjIzR7XGFkdmFuY2VudW1iZXJ7Y2hhcCMjMn19Ci0gICAgICBcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNXtcYWR2YW5jZW51bWJlcntzZWMjIzIuIyMzfX0KLSAgICAgIFxkZWZcdW5udW1ic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxkZWZcc3Vic3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1IyM2e1xhZHZhbmNlbnVtYmVye3N1YnNlYyMjMi4jIzMuIyM0fX0KLSAgICAgIFxkZWZcdW5udW1ic3Vic3Vic2VjZW50cnkgIyMxIyMye30KLSAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgIFxkZWZcY2hhcGVudHJ5ICMjMSMjMiMjM3slCi0gICAgICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257IyMzfX1jb3VudC1cZXhwbnVtYmVye2NoYXAjIzJ9eyMjMX19Ci0gICAgICBcZGVmXHVubnVtYmNoYXBlbnRyeSAjIzEjIzJ7JQotICAgICAgICBccGRmb3V0bGluZSBnb3RvIG5hbWV7XHBkZm1rcGdueyMjMn19eyMjMX19Ci0gICAgICBcZGVmXHNlY2VudHJ5ICMjMSMjMiMjMyMjNHslCi0gICAgICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257IyM0fX1jb3VudC1cZXhwbnVtYmVye3NlYyMjMi4jIzN9eyMjMX19Ci0gICAgICBcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnslCi0gICAgICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257IyMyfX17IyMxfX0KLSAgICAgIFxkZWZcc3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1eyUKLSAgICAgICAgXHBkZm91dGxpbmUgZ290byBuYW1le1xwZGZta3BnbnsjIzV9fWNvdW50LVxleHBudW1iZXJ7c3Vic2VjIyMyLiMjMy4jIzR9eyMjMX19Ci0gICAgICBcZGVmXHVubnVtYnN1YnNlY2VudHJ5ICMjMSMjMnslCi0gICAgICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257IyMyfX17IyMxfX0KLSAgICAgIFxkZWZcc3Vic3Vic2VjZW50cnkgIyMxIyMyIyMzIyM0IyM1IyM2eyUKLSAgICAgICAgXHBkZm91dGxpbmUgZ290byBuYW1le1xwZGZta3BnbnsjIzZ9fXsjIzF9fQotICAgICAgXGRlZlx1bm51bWJzdWJzdWJzZWNlbnRyeSAjIzEjIzJ7JQotICAgICAgICBccGRmb3V0bGluZSBnb3RvIG5hbWV7XHBkZm1rcGdueyMjMn19eyMjMX19Ci0gICAgICBcaW5wdXQgXGpvYm5hbWUudG9jCi0gICAgXGVncm91cFxmaQotICB9fQotICBcZGVmXG1ha2VsaW5rcyAjMSx7JQotICAgIFxkZWZccGFyYW1zeyMxfVxkZWZcRXtFTkR9JQotICAgIFxpZnhccGFyYW1zXEUKLSAgICAgIFxsZXRcbmV4dG1ha2VsaW5rcz1ccmVsYXgKLSAgICBcZWxzZQotICAgICAgXGxldFxuZXh0bWFrZWxpbmtzPVxtYWtlbGlua3MKLSAgICAgIFxpZm51bVxsbmtjb3VudD4wLFxmaQotICAgICAgXHBpY2tudW17IzF9JQotICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0gCi0gICAgICAgIGdvdG8gbmFtZXtccGRmbWtwZ257XHRoZVxwZ259fSUKLSAgICAgIFxsaW5rY29sb3IgIzElCi0gICAgICBcYWR2YW5jZVxsbmtjb3VudCBieSAxJQotICAgICAgXGVuZGxpbmsKLSAgICBcZmkKLSAgICBcbmV4dG1ha2VsaW5rcwotICB9Ci0gIFxkZWZccGlja251bSMxe1xleHBhbmRhZnRlclxwbiMxfQotICBcZGVmXHBuIzF7JQotICAgIFxkZWZccHsjMX0lCi0gICAgXGlmeFxwXGxicmFjZQotICAgICAgXGxldFxuZXh0cG49XHBwbgotICAgIFxlbHNlCi0gICAgICBcbGV0XG5leHRwbj1ccHBubgotICAgICAgXGRlZlxmaXJzdHsjMX0KLSAgICBcZmkKLSAgICBcbmV4dHBuCi0gIH0KLSAgXGRlZlxwcG4jMXtccGduPSMxXGdvYmJsZX0KLSAgXGRlZlxwcG5ue1xwZ249XGZpcnN0fQotICBcZGVmXHBkZm1rbG5rIzF7XGxua2NvdW50PTBcbWFrZWxpbmtzICMxLEVORCx9Ci0gIFxkZWZcYWRkdG9rZW5zIzEjMntcZWRlZlxhZGR0b2tze1xub2V4cGFuZCMxPXtcdGhlIzEjMn19XGFkZHRva3N9Ci0gIFxkZWZcc2tpcHNwYWNlcyMxe1xkZWZcUFB7IzF9XGRlZlxEe3x9JQotICAgIFxpZnhcUFBcRFxsZXRcbmV4dHNwXHJlbGF4Ci0gICAgXGVsc2VcbGV0XG5leHRzcFxza2lwc3BhY2VzCi0gICAgICBcaWZ4XHBcc3BhY2VcZWxzZVxhZGR0b2tlbnN7XGZpbGVuYW1lfXtcUFB9JQotICAgICAgICBcYWR2YW5jZVxmaWxlbmFtZWxlbmd0aCBieSAxCi0gICAgICBcZmkKLSAgICBcZmkKLSAgICBcbmV4dHNwfQotICBcZGVmXGdldGZpbGVuYW1lIzF7XGZpbGVuYW1lbGVuZ3RoPTBcZXhwYW5kYWZ0ZXJcc2tpcHNwYWNlcyMxfFxyZWxheH0KLSAgXGlmbnVtXHBkZnRleHZlcnNpb24gPCAxNAotICAgIFxsZXQgXHN0YXJ0bGluayBccGRmYW5ub3RsaW5rCi0gIFxlbHNlCi0gICAgXGxldCBcc3RhcnRsaW5rIFxwZGZzdGFydGxpbmsKLSAgXGZpCi0gIFxkZWZccGRmdXJsIzF7JQotICAgIFxiZWdpbmdyb3VwCi0gICAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZVxkZWZcQHtAfSUKLSAgICAgIFxsZWF2ZXZtb2RlXFJlZAotICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCi0gICAgICAgIHVzZXJ7L1N1YnR5cGUgL0xpbmsgL0EgPDwgL1MgL1VSSSAvVVJJICgjMSkgPj59JQotICAgICAgICAlICMxCi0gICAgXGVuZGdyb3VwfQotICBcZGVmXHBkZmdldHRva3MjMS57XHNldGJveFxib3hBPVxoYm94e1x0b2tzQT17IzEufVx0b2tzQj17fVxtYWtldG9rc319Ci0gIFxkZWZcYWRkdG9rZW5zIzEjMntcZWRlZlxhZGR0b2tze1xub2V4cGFuZCMxPXtcdGhlIzEjMn19XGFkZHRva3N9Ci0gIFxkZWZcYWRuIzF7XGFkZHRva2Vuc3tcdG9rc0N9eyMxfVxnbG9iYWxcY291bnRBPTFcbGV0XG5leHQ9XG1ha2V0b2tzfQotICBcZGVmXHBvcHRva3MjMSMyfEVORFRPS1N8e1xsZXRcZmlyc3Q9IzFcdG9rc0Q9eyMxfVx0b2tzQT17IzJ9fQotICBcZGVmXG1ha2V0b2tzeyUKLSAgICBcZXhwYW5kYWZ0ZXJccG9wdG9rc1x0aGVcdG9rc0F8RU5EVE9LU3wKLSAgICBcaWZ4XGZpcnN0MFxhZG4wCi0gICAgXGVsc2VcaWZ4XGZpcnN0MVxhZG4xIFxlbHNlXGlmeFxmaXJzdDJcYWRuMiBcZWxzZVxpZnhcZmlyc3QzXGFkbjMKLSAgICBcZWxzZVxpZnhcZmlyc3Q0XGFkbjQgXGVsc2VcaWZ4XGZpcnN0NVxhZG41IFxlbHNlXGlmeFxmaXJzdDZcYWRuNgotICAgIFxlbHNlXGlmeFxmaXJzdDdcYWRuNyBcZWxzZVxpZnhcZmlyc3Q4XGFkbjggXGVsc2VcaWZ4XGZpcnN0OVxhZG45IAotICAgIFxlbHNlCi0gICAgICBcaWZudW0wPVxjb3VudEFcZWxzZVxtYWtlbGlua1xmaQotICAgICAgXGlmeFxmaXJzdC5cbGV0XG5leHQ9XGRvbmVcZWxzZQotICAgICAgICBcbGV0XG5leHQ9XG1ha2V0b2tzCi0gICAgICAgIFxhZGR0b2tlbnN7XHRva3NCfXtcdGhlXHRva3NEfQotICAgICAgICBcaWZ4XGZpcnN0LFxhZGR0b2tlbnN7XHRva3NCfXtcc3BhY2V9XGZpCi0gICAgICBcZmkKLSAgICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmkKLSAgICBcbmV4dH0KLSAgXGRlZlxtYWtlbGlua3tcYWRkdG9rZW5ze1x0b2tzQn0lCi0gICAge1xub2V4cGFuZFxwZGZsaW5re1x0aGVcdG9rc0N9fVx0b2tzQz17fVxnbG9iYWxcY291bnRBPTB9Ci0gIFxkZWZccGRmbGluayMxeyUKLSAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSBnb3RvIG5hbWV7XG1rcGdueyMxfX0KLSAgICBcbGlua2NvbG9yICMxXGVuZGxpbmt9Ci0gIFxkZWZcbWtwZ24jMXsjMUB9IAotICBcZGVmXGRvbmV7XGVkZWZcc3R7XGdsb2JhbFxub2V4cGFuZFx0b2tzQT17XHRoZVx0b2tzQn19XHN0fQotXGZpICUgXGlmeFxwZGZvdXRwdXQKLQotCi1cbWVzc2FnZXtmb250cyx9Ci0lIEZvbnQtY2hhbmdlIGNvbW1hbmRzLgotCi0lIFRleGluZm8gc29ydCBvZiBzdXBwb3J0cyB0aGUgc2FucyBzZXJpZiBmb250IHN0eWxlLCB3aGljaCBwbGFpbiBUZVggZG9lcyBub3QuCi0lIFNvIHdlIHNldCB1cCBhIFxzZiBhbmFsb2dvdXMgdG8gcGxhaW4ncyBccm0sIGV0Yy4KLVxuZXdmYW1cc2ZmYW0KLVxkZWZcc2Z7XGZhbT1cc2ZmYW0gXHRlbnNmfQotXGxldFxsaSA9IFxzZiAlIFNvbWV0aW1lcyB3ZSBjYWxsIGl0IFxsaSwgbm90IFxzZi4KLQotJSBXZSBkb24ndCBuZWVkIG1hdGggZm9yIHRoaXMgb25lLgotXGRlZlx0dHNse1x0ZW50dHNsfQotCi0lIFVzZSBDb21wdXRlciBNb2Rlcm4gZm9udHMgYXQgXG1hZ3N0ZXBoYWxmICgxMXB0KS4KLVxuZXdjb3VudFxtYWlubWFnc3RlcAotXG1haW5tYWdzdGVwPVxtYWdzdGVwaGFsZgotCi0lIFNldCB0aGUgZm9udCBtYWNybyAjMSB0byB0aGUgZm9udCBuYW1lZCAjMiwgYWRkaW5nIG9uIHRoZQotJSBzcGVjaWZpZWQgZm9udCBwcmVmaXggKG5vcm1hbGx5IGBjbScpLgotJSAjMyBpcyB0aGUgZm9udCdzIGRlc2lnbiBzaXplLCAjNCBpcyBhIHNjYWxlIGZhY3RvcgotXGRlZlxzZXRmb250IzEjMiMzIzR7XGZvbnQjMT1cZm9udHByZWZpeCMyIzMgc2NhbGVkICM0fQotCi0lIFVzZSBjbSBhcyB0aGUgZGVmYXVsdCBmb250IHByZWZpeC4KLSUgVG8gc3BlY2lmeSB0aGUgZm9udCBwcmVmaXgsIHlvdSBtdXN0IGRlZmluZSBcZm9udHByZWZpeAotJSBiZWZvcmUgeW91IHJlYWQgaW4gdGV4aW5mby50ZXguCi1caWZ4XGZvbnRwcmVmaXhcdW5kZWZpbmVkCi1cZGVmXGZvbnRwcmVmaXh7Y219Ci1cZmkKLSUgU3VwcG9ydCBmb250IGZhbWlsaWVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUgYXMgQ00uCi1cZGVmXHJtc2hhcGV7cn0KLVxkZWZccm1ic2hhcGV7Ynh9ICAgICAgICAgICAgICAgJXdoZXJlIHRoZSBub3JtYWwgZmFjZSBpcyBib2xkCi1cZGVmXGJmc2hhcGV7Yn0KLVxkZWZcYnhzaGFwZXtieH0KLVxkZWZcdHRzaGFwZXt0dH0KLVxkZWZcdHRic2hhcGV7dHR9Ci1cZGVmXHR0c2xzaGFwZXtzbHR0fQotXGRlZlxpdHNoYXBle3RpfQotXGRlZlxpdGJzaGFwZXtieHRpfQotXGRlZlxzbHNoYXBle3NsfQotXGRlZlxzbGJzaGFwZXtieHNsfQotXGRlZlxzZnNoYXBle3NzfQotXGRlZlxzZmJzaGFwZXtzc30KLVxkZWZcc2NzaGFwZXtjc2N9Ci1cZGVmXHNjYnNoYXBle2NzY30KLQotXGlmeFxiaWdnZXJccmVsYXgKLVxsZXRcbWFpbm1hZ3N0ZXA9XG1hZ3N0ZXAxCi1cc2V0Zm9udFx0ZXh0cm1ccm1zaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHRleHR0dFx0dHNoYXBlezEyfXsxMDAwfQotXGVsc2UKLVxzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZpCi0lIEluc3RlYWQgb2YgY21iMTAsIHlvdSBtYW55IHdhbnQgdG8gdXNlIGNtYngxMC4KLSUgY21ieDEwIGlzIGEgcHJldHRpZXIgZm9udCBvbiBpdHMgb3duLCBidXQgY21iMTAKLSUgbG9va3MgYmV0dGVyIHdoZW4gZW1iZWRkZWQgaW4gYSBsaW5lIHdpdGggY21yMTAuCi1cc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNjXHNjc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZvbnRcdGV4dGk9Y21taTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKLVxmb250XHRleHRzeT1jbXN5MTAgc2NhbGVkIFxtYWlubWFnc3RlcAotCi0lIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4sIGV0Yy4KLVxzZXRmb250XGRlZmJmXGJ4c2hhcGV7MTB9e1xtYWdzdGVwMX0gJXdhcyAxMzE0Ci1cc2V0Zm9udFxkZWZ0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZGVmXGRme1xsZXRcdGVudHQ9XGRlZnR0IFxsZXRcdGVuYmYgPSBcZGVmYmYgXGJmfQotCi0lIEZvbnRzIGZvciBpbmRpY2VzLCBmb290bm90ZXMsIHNtYWxsIGV4YW1wbGVzICg5cHQpLgotXHNldGZvbnRcc21hbGxybVxybXNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxzbWFsbHR0XHR0c2hhcGV7OX17MTAwMH0KLVxzZXRmb250XHNtYWxsYmZcYmZzaGFwZXsxMH17OTAwfQotXHNldGZvbnRcc21hbGxpdFxpdHNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxzbWFsbHNsXHNsc2hhcGV7OX17MTAwMH0KLVxzZXRmb250XHNtYWxsc2Zcc2ZzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcc21hbGxzY1xzY3NoYXBlezEwfXs5MDB9Ci1cc2V0Zm9udFxzbWFsbHR0c2xcdHRzbHNoYXBlezEwfXs5MDB9Ci1cZm9udFxzbWFsbGk9Y21taTkKLVxmb250XHNtYWxsc3k9Y21zeTkKLQotJSBGb250cyBmb3IgdGl0bGUgcGFnZToKLVxzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KLVxzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KLVxsZXRcdGl0bGViZj1cdGl0bGVybQotXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXGZvbnRcdGl0bGVpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAzCi1cZm9udFx0aXRsZXN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXA0Ci1cZGVmXGF1dGhvcnJte1xzZWNybX0KLQotJSBDaGFwdGVyIChhbmQgdW5udW1iZXJlZCkgZm9udHMgKDE3LjI4cHQpLgotXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXBzZlxzZmJzaGFwZXsxN317MTAwMH0KLVxsZXRcY2hhcGJmPVxjaGFwcm0KLVxzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDIKLVxmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMwotCi0lIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCi1cc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9Ci1cbGV0XHNlY2JmXHNlY3JtCi1cc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQotXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKLQotJSBcc2V0Zm9udFxzc2Vjcm1cYnhzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgICAlIFRoaXMgc2l6ZSBhbiBmb250IGxvb2tlZCBiYWQuCi0lIFxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXtcbWFnc3RlcDF9ICAgICUgVGhlIGxldHRlcnMgd2VyZSB0b28gY3Jvd2RlZC4KLSUgXHNldGZvbnRcc3NlY3NsXHNsc2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3R0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KLSUgXHNldGZvbnRcc3NlY3NmXHNmc2hhcGV7MTB9e1xtYWdzdGVwMX0KLQotJVxzZXRmb250XHNzZWNybVxiZnNoYXBlezEwfXsxMzE1fSAgICAgICUgTm90ZSB0aGUgdXNlIG9mIGNtYiByYXRoZXIgdGhhbiBjbWJ4LgotJVxzZXRmb250XHNzZWNpdFxpdHNoYXBlezEwfXsxMzE1fSAgICAgICUgQWxzbywgdGhlIHNpemUgaXMgYSBsaXR0bGUgbGFyZ2VyIHRoYW4KLSVcc2V0Zm9udFxzc2Vjc2xcc2xzaGFwZXsxMH17MTMxNX0gICAgICAlIGJlaW5nIHNjYWxlZCBtYWdzdGVwMS4KLSVcc2V0Zm9udFxzc2VjdHRcdHRzaGFwZXsxMH17MTMxNX0KLSVcc2V0Zm9udFxzc2Vjc2Zcc2ZzaGFwZXsxMH17MTMxNX0KLQotJVxsZXRcc3NlY2JmPVxzc2Vjcm0KLQotJSBTdWJzZWN0aW9uIGZvbnRzICgxMy4xNXB0KS4KLVxzZXRmb250XHNzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXHNldGZvbnRcc3NlY2l0XGl0YnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3NsXHNsYnNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cc2V0Zm9udFxzc2VjdHRzbFx0dHNsc2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxsZXRcc3NlY2JmXHNzZWNybQotXHNldGZvbnRcc3NlY3NjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZm9udFxzc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwaGFsZgotXGZvbnRcc3NlY3N5PWNtc3kxMCBzY2FsZWQgMTMxNQotJSBUaGUgc21hbGxjYXBzIGFuZCBzeW1ib2wgZm9udHMgc2hvdWxkIGFjdHVhbGx5IGJlIHNjYWxlZCBcbWFnc3RlcDEuNSwKLSUgYnV0IHRoYXQgaXMgbm90IGEgc3RhbmRhcmQgbWFnbmlmaWNhdGlvbi4KLQotJSBJbiBvcmRlciBmb3IgdGhlIGZvbnQgY2hhbmdlcyB0byBhZmZlY3QgbW9zdCBtYXRoIHN5bWJvbHMgYW5kIGxldHRlcnMsCi0lIHdlIGhhdmUgdG8gZGVmaW5lIHRoZSBcdGV4dGZvbnQgb2YgdGhlIHN0YW5kYXJkIGZhbWlsaWVzLiAgU2luY2UKLSUgdGV4aW5mbyBkb2Vzbid0IGFsbG93IGZvciBwcm9kdWNpbmcgc3Vic2NyaXB0cyBhbmQgc3VwZXJzY3JpcHRzLCB3ZQotJSBkb24ndCBib3RoZXIgdG8gcmVzZXQgXHNjcmlwdGZvbnQgYW5kIFxzY3JpcHRzY3JpcHRmb250ICh3aGljaCB3b3VsZAotJSBhbHNvIHJlcXVpcmUgbG9hZGluZyBhIGxvdCBtb3JlIGZvbnRzKS4KLSUKLVxkZWZccmVzZXRtYXRoZm9udHN7JQotICBcdGV4dGZvbnQwID0gXHRlbnJtIFx0ZXh0Zm9udDEgPSBcdGVuaSBcdGV4dGZvbnQyID0gXHRlbnN5Ci0gIFx0ZXh0Zm9udFxpdGZhbSA9IFx0ZW5pdCBcdGV4dGZvbnRcc2xmYW0gPSBcdGVuc2wgXHRleHRmb250XGJmZmFtID0gXHRlbmJmCi0gIFx0ZXh0Zm9udFx0dGZhbSA9IFx0ZW50dCBcdGV4dGZvbnRcc2ZmYW0gPSBcdGVuc2YKLX0KLQotCi0lIFRoZSBmb250LWNoYW5naW5nIGNvbW1hbmRzIHJlZGVmaW5lIHRoZSBtZWFuaW5ncyBvZiBcdGVuU1RZTEUsIGluc3RlYWQKLSUgb2YganVzdCBcU1RZTEUuICBXZSBkbyB0aGlzIHNvIHRoYXQgZm9udCBjaGFuZ2VzIHdpbGwgY29udGludWUgdG8gd29yawotJSBpbiBtYXRoIG1vZGUsIHdoZXJlIGl0IGlzIHRoZSBjdXJyZW50IFxmYW0gdGhhdCBpcyByZWxldmFudCBpbiBtb3N0Ci0lIGNhc2VzLCBub3QgdGhlIGN1cnJlbnQgZm9udC4gIFBsYWluIFRlWCBkb2VzIFxkZWZcYmZ7XGZhbT1cYmZmYW0KLSUgXHRlbmJmfSwgZm9yIGV4YW1wbGUuICBCeSByZWRlZmluaW5nIFx0ZW5iZiwgd2Ugb2J2aWF0ZSB0aGUgbmVlZCB0bwotJSByZWRlZmluZSBcYmYgaXRzZWxmLgotXGRlZlx0ZXh0Zm9udHN7JQotICBcbGV0XHRlbnJtPVx0ZXh0cm0gXGxldFx0ZW5pdD1cdGV4dGl0IFxsZXRcdGVuc2w9XHRleHRzbAotICBcbGV0XHRlbmJmPVx0ZXh0YmYgXGxldFx0ZW50dD1cdGV4dHR0IFxsZXRcc21hbGxjYXBzPVx0ZXh0c2MKLSAgXGxldFx0ZW5zZj1cdGV4dHNmIFxsZXRcdGVuaT1cdGV4dGkgXGxldFx0ZW5zeT1cdGV4dHN5IFxsZXRcdGVudHRzbD1cdGV4dHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzfQotXGRlZlx0aXRsZWZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cdGl0bGVybSBcbGV0XHRlbml0PVx0aXRsZWl0IFxsZXRcdGVuc2w9XHRpdGxlc2wKLSAgXGxldFx0ZW5iZj1cdGl0bGViZiBcbGV0XHRlbnR0PVx0aXRsZXR0IFxsZXRcc21hbGxjYXBzPVx0aXRsZXNjCi0gIFxsZXRcdGVuc2Y9XHRpdGxlc2YgXGxldFx0ZW5pPVx0aXRsZWkgXGxldFx0ZW5zeT1cdGl0bGVzeQotICBcbGV0XHRlbnR0c2w9XHRpdGxldHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MjVwdH19Ci1cZGVmXHRpdGxlZm9udCMxe3tcdGl0bGVmb250c1xybSAjMX19Ci1cZGVmXGNoYXBmb250c3slCi0gIFxsZXRcdGVucm09XGNoYXBybSBcbGV0XHRlbml0PVxjaGFwaXQgXGxldFx0ZW5zbD1cY2hhcHNsCi0gIFxsZXRcdGVuYmY9XGNoYXBiZiBcbGV0XHRlbnR0PVxjaGFwdHQgXGxldFxzbWFsbGNhcHM9XGNoYXBzYwotICBcbGV0XHRlbnNmPVxjaGFwc2YgXGxldFx0ZW5pPVxjaGFwaSBcbGV0XHRlbnN5PVxjaGFwc3kgXGxldFx0ZW50dHNsPVxjaGFwdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTlwdH19Ci1cZGVmXHNlY2ZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cc2Vjcm0gXGxldFx0ZW5pdD1cc2VjaXQgXGxldFx0ZW5zbD1cc2Vjc2wKLSAgXGxldFx0ZW5iZj1cc2VjYmYgXGxldFx0ZW50dD1cc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNlY3NjCi0gIFxsZXRcdGVuc2Y9XHNlY3NmIFxsZXRcdGVuaT1cc2VjaSBcbGV0XHRlbnN5PVxzZWNzeSBcbGV0XHRlbnR0c2w9XHNlY3R0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE2cHR9fQotXGRlZlxzdWJzZWNmb250c3slCi0gIFxsZXRcdGVucm09XHNzZWNybSBcbGV0XHRlbml0PVxzc2VjaXQgXGxldFx0ZW5zbD1cc3NlY3NsCi0gIFxsZXRcdGVuYmY9XHNzZWNiZiBcbGV0XHRlbnR0PVxzc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNzZWNzYwotICBcbGV0XHRlbnNmPVxzc2Vjc2YgXGxldFx0ZW5pPVxzc2VjaSBcbGV0XHRlbnN5PVxzc2Vjc3kgXGxldFx0ZW50dHNsPVxzc2VjdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTVwdH19Ci1cbGV0XHN1YnN1YnNlY2ZvbnRzID0gXHN1YnNlY2ZvbnRzICUgTWF5YmUgbWFrZSBzc3NlYyBmb250cyBzY2FsZWQgbWFnc3RlcGhhbGY/Ci1cZGVmXHNtYWxsZm9udHN7JQotICBcbGV0XHRlbnJtPVxzbWFsbHJtIFxsZXRcdGVuaXQ9XHNtYWxsaXQgXGxldFx0ZW5zbD1cc21hbGxzbAotICBcbGV0XHRlbmJmPVxzbWFsbGJmIFxsZXRcdGVudHQ9XHNtYWxsdHQgXGxldFxzbWFsbGNhcHM9XHNtYWxsc2MKLSAgXGxldFx0ZW5zZj1cc21hbGxzZiBcbGV0XHRlbmk9XHNtYWxsaSBcbGV0XHRlbnN5PVxzbWFsbHN5Ci0gIFxsZXRcdGVudHRzbD1cc21hbGx0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxMXB0fX0KLQotJSBTZXQgdXAgdGhlIGRlZmF1bHQgZm9udHMsIHNvIHdlIGNhbiB1c2UgdGhlbSBmb3IgY3JlYXRpbmcgYm94ZXMuCi0lCi1cdGV4dGZvbnRzCi0KLSUgRGVmaW5lIHRoZXNlIHNvIHRoZXkgY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGZvciBvdGhlciBmb250cy4KLVxkZWZcYW5nbGVsZWZ0eyRcbGFuZ2xlJH0KLVxkZWZcYW5nbGVyaWdodHskXHJhbmdsZSR9Ci0KLSUgQ291bnQgZGVwdGggaW4gZm9udC1jaGFuZ2VzLCBmb3IgZXJyb3IgY2hlY2tzCi1cbmV3Y291bnRcZm9udGRlcHRoIFxmb250ZGVwdGg9MAotCi0lIEZvbnRzIGZvciBzaG9ydCB0YWJsZSBvZiBjb250ZW50cy4KLVxzZXRmb250XHNob3J0Y29udHJtXHJtc2hhcGV7MTJ9ezEwMDB9Ci1cc2V0Zm9udFxzaG9ydGNvbnRiZlxieHNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcc2hvcnRjb250c2xcc2xzaGFwZXsxMn17MTAwMH0KLQotJSUgQWRkIHNjcmliZS1saWtlIGZvbnQgZW52aXJvbm1lbnRzLCBwbHVzIEBsIGZvciBpbmxpbmUgbGlzcCAodXN1YWxseSBzYW5zCi0lJSBzZXJpZikgYW5kIEBpaSBmb3IgVGVYIGl0YWxpYwotCi0lIFxzbWFydGl0YWxpY3tBUkd9IG91dHB1dHMgYXJnIGluIGl0YWxpY3MsIGZvbGxvd2VkIGJ5IGFuIGl0YWxpYyBjb3JyZWN0aW9uCi0lIHVubGVzcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBpcyBzdWNoIGFzIG5vdCB0byBuZWVkIG9uZS4KLVxkZWZcc21hcnRpdGFsaWN4e1xpZnhcbmV4dCxcZWxzZVxpZnhcbmV4dC1cZWxzZVxpZnhcbmV4dC5cZWxzZVwvXGZpXGZpXGZpfQotXGRlZlxzbWFydHNsYW50ZWQjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9Ci1cZGVmXHNtYXJ0aXRhbGljIzF7e1xpdCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQotCi1cbGV0XGk9XHNtYXJ0aXRhbGljCi1cbGV0XHZhcj1cc21hcnRzbGFudGVkCi1cbGV0XGRmbj1cc21hcnRzbGFudGVkCi1cbGV0XGVtcGg9XHNtYXJ0aXRhbGljCi1cbGV0XGNpdGU9XHNtYXJ0c2xhbnRlZAotCi1cZGVmXGIjMXt7XGJmICMxfX0KLVxsZXRcc3Ryb25nPVxiCi0KLSUgV2UgY2FuJ3QganVzdCB1c2UgXGV4aHlwaGVucGVuYWx0eSwgYmVjYXVzZSB0aGF0IG9ubHkgaGFzIGVmZmVjdCBhdAotJSB0aGUgZW5kIG9mIGEgcGFyYWdyYXBoLiAgUmVzdG9yZSBub3JtYWwgaHlwaGVuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUKLSUgZ3JvdXAgd2l0aGluIHdoaWNoIFxub2h5cGhlbmF0aW9uIGlzIHByZXN1bWFibHkgY2FsbGVkLgotJQotXGRlZlxub2h5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSAtMSAgXGFmdGVyZ3JvdXBccmVzdG9yZWh5cGhlbmF0aW9ufQotXGRlZlxyZXN0b3JlaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IGAtIH0KLQotXGRlZlx0IzF7JQotICB7XHR0IFxyYXdiYWNrc2xhc2ggXGZyZW5jaHNwYWNpbmcgIzF9JQotICBcbnVsbAotfQotXGxldFx0dGZvbnQ9XHQKLVxkZWZcc2FtcCMxe2BcdGNsb3NleyMxfSdcbnVsbH0KLVxzZXRmb250XGtleXJtXHJtc2hhcGV7OH17MTAwMH0KLVxmb250XGtleXN5PWNtc3k5Ci1cZGVmXGtleSMxe3tca2V5cm1cdGV4dGZvbnQyPVxrZXlzeSBcbGVhdmV2bW9kZVxoYm94eyUKLSAgXHJhaXNlMC40cHRcaGJveHtcYW5nbGVsZWZ0fVxrZXJuLS4wOGVtXHZ0b3B7JQotICAgIFx2Ym94e1xocnVsZVxrZXJuLTAuNHB0Ci0gICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCi0gICAgXGtlcm4tMC40cHRcaHJ1bGV9JQotICBca2Vybi0uMDZlbVxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlcmlnaHR9fX19Ci0lIFRoZSBvbGQgZGVmaW5pdGlvbiwgd2l0aCBubyBsb3plbmdlOgotJVxkZWZca2V5ICMxe3tcdHRzbCBcbm9oeXBoZW5hdGlvbiBcdXBwZXJjYXNleyMxfX1cbnVsbH0KLVxkZWZcY3RybCAjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGhhdH0jMX0KLQotJSBAZmlsZSwgQG9wdGlvbiBhcmUgdGhlIHNhbWUgYXMgQHNhbXAuCi1cbGV0XGZpbGU9XHNhbXAKLVxsZXRcb3B0aW9uPVxzYW1wCi0KLSUgQGNvZGUgaXMgYSBtb2RpZmljYXRpb24gb2YgQHQsCi0lIHdoaWNoIG1ha2VzIHNwYWNlcyB0aGUgc2FtZSBzaXplIGFzIG5vcm1hbCBpbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLVxkZWZcdGNsb3NlIzF7JQotICB7JQotICAgICUgQ2hhbmdlIG5vcm1hbCBpbnRlcndvcmQgc3BhY2UgdG8gYmUgc2FtZSBhcyBmb3IgdGhlIGN1cnJlbnQgZm9udC4KLSAgICBcc3BhY2Vza2lwID0gXGZvbnRkaW1lbjJcZm9udAotICAgICUKLSAgICAlIFN3aXRjaCB0byB0eXBld3JpdGVyLgotICAgIFx0dAotICAgICUKLSAgICAlIEJ1dCBgXCAnIHByb2R1Y2VzIHRoZSBsYXJnZSB0eXBld3JpdGVyIGludGVyd29yZCBzcGFjZS4KLSAgICBcZGVmXCB7e1xzcGFjZXNraXAgPSAwcHR7fSB9fSUKLSAgICAlCi0gICAgJSBUdXJuIG9mZiBoeXBoZW5hdGlvbi4KLSAgICBcbm9oeXBoZW5hdGlvbgotICAgICUKLSAgICBccmF3YmFja3NsYXNoCi0gICAgXGZyZW5jaHNwYWNpbmcKLSAgICAjMSUKLSAgfSUKLSAgXG51bGwKLX0KLQotJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBcY29kZS4KLSUgT3RoZXJ3aXNlLCBpdCBpcyB0b28gaGFyZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94ZXMKLSUgaW4gdGhlIEVtYWNzIG1hbnVhbCwgdGhlIExpYnJhcnkgbWFudWFsLCBldGMuCi0KLSUgVW5mb3J0dW5hdGVseSwgVGVYIHVzZXMgb25lIHBhcmFtZXRlciAoXGh5cGhlbmNoYXIpIHRvIGNvbnRyb2wKLSUgYm90aCBoeXBoZW5hdGlvbiBhdCAtIGFuZCBoeXBoZW5hdGlvbiB3aXRoaW4gd29yZHMuCi0lIFdlIG11c3QgdGhlcmVmb3JlIHR1cm4gdGhlbSBib3RoIG9mZiAoXHRjbG9zZSBkb2VzIHRoYXQpCi0lIGFuZCBhcnJhbmdlIGV4cGxpY2l0bHkgdG8gaHlwaGVuYXRlIGF0IGEgZGFzaC4KLSUgIC0tIHJtcy4KLXsKLSAgXGNhdGNvZGVgXC09XGFjdGl2ZQotICBcY2F0Y29kZWBcXz1cYWN0aXZlCi0gICUKLSAgXGdsb2JhbFxkZWZcY29kZXtcYmVnaW5ncm91cAotICAgIFxjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1cY29kZWRhc2gKLSAgICBcY2F0Y29kZWBcXz1cYWN0aXZlIFxsZXRfXGNvZGV1bmRlcgotICAgIFxjb2RleAotICB9Ci0gICUKLSAgJSBJZiB3ZSBlbmQgdXAgd2l0aCBhbnkgYWN0aXZlIC0gY2hhcmFjdGVycyB3aGVuIGhhbmRsaW5nIHRoZSBpbmRleCwKLSAgJSBqdXN0IHRyZWF0IHRoZW0gYXMgYSBub3JtYWwgLS4KLSAgXGdsb2JhbFxkZWZcaW5kZXhicmVha3N7XGNhdGNvZGVgXC09XGFjdGl2ZSBcbGV0LVxyZWFsZGFzaH0KLX0KLQotXGRlZlxyZWFsZGFzaHstfQotXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319Ci1cZGVmXGNvZGV1bmRlcntcaWZ1c2luZ3R0e1xub3JtYWx1bmRlcnNjb3JlXGRpc2NyZXRpb25hcnl7fXt9e319e1xffX0KLVxkZWZcY29kZXggIzF7XHRjbG9zZXsjMX1cZW5kZ3JvdXB9Ci0KLSVcbGV0XGV4cD1cdGNsb3NlICAlV2FzIHRlbXBvcmFyeQotCi0lIEBrYmQgaXMgbGlrZSBAY29kZSwgZXhjZXB0IHRoYXQgaWYgdGhlIGFyZ3VtZW50IGlzIGp1c3Qgb25lIEBrZXkgY29tbWFuZCwKLSUgdGhlbiBAa2JkIGhhcyBubyBlZmZlY3QuCi0KLSUgQGtiZGlucHV0c3R5bGUgLS0gYXJnIGlzIGBkaXN0aW5jdCcgKEBrYmQgdXNlcyBzbGFudGVkIHR0eSBmb250IGFsd2F5cyksCi0lICAgYGV4YW1wbGUnIChAa2JkIHVzZXMgdHRzbCBvbmx5IGluc2lkZSBvZiBAZXhhbXBsZSBhbmQgZnJpZW5kcyksCi0lICAgb3IgYGNvZGUnIChAa2JkIHVzZXMgbm9ybWFsIHR0eSBmb250IGFsd2F5cykuCi1cZGVmXGtiZGlucHV0c3R5bGV7XHBhcnNlYXJnXGtiZGlucHV0c3R5bGV4eHh9Ci1cZGVmXGtiZGlucHV0c3R5bGV4eHgjMXslCi0gIFxkZWZcYXJneyMxfSUKLSAgXGlmeFxhcmdcd29yZGRpc3RpbmN0Ci0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGV4YW1wbGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dH0lCi0gIFxlbHNlXGlmeFxhcmdcd29yZGNvZGUKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHR9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZmlcZmlcZmkKLX0KLVxkZWZcd29yZGRpc3RpbmN0e2Rpc3RpbmN0fQotXGRlZlx3b3JkZXhhbXBsZXtleGFtcGxlfQotXGRlZlx3b3JkY29kZXtjb2RlfQotCi0lIERlZmF1bHQgaXMga2JkaW5wdXRkaXN0aW5jdC4gIChUb28gbXVjaCBvZiBhIGhhc3NsZSB0byBjYWxsIHRoZSBtYWNybywKLSUgdGhlIGNhdGNvZGVzIGFyZSB3cm9uZyBmb3IgcGFyc2VhcmcgdG8gd29yay4pCi1cZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dHNsfQotCi1cZGVmXHhrZXl7XGtleX0KLVxkZWZca2JkZm9vIzEjMiMzXHBhcntcZGVmXG9uZXsjMX1cZGVmXHRocmVleyMzfVxkZWZcdGhyZWV4ez8/fSUKLVxpZnhcb25lXHhrZXlcaWZ4XHRocmVleFx0aHJlZSBca2V5eyMyfSUKLVxlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaX0KLQotJSBGb3IgQHVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KLVxsZXRcdXJsPVxjb2RlCi1cbGV0XGVudj1cY29kZQotXGxldFxjb21tYW5kPVxjb2RlCi0KLSUgQHVyZWYgKGFiYnJldmlhdGlvbiBmb3IgYHVybHJlZicpIHRha2VzIGFuIG9wdGlvbmFsIChjb21tYS1zZXBhcmF0ZWQpCi0lIHNlY29uZCBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSB0ZXh0IHRvIGRpc3BsYXkgYW5kIGFuIG9wdGlvbmFsIHRoaXJkCi0lIGFyZyBhcyB0ZXh0IHRvIGRpc3BsYXkgaW5zdGVhZCBvZiAocmF0aGVyIHRoYW4gaW4gYWRkaXRpb24gdG8pIHRoZSB1cmwKLSUgaXRzZWxmLiAgRmlyc3QgKG1hbmRhdG9yeSkgYXJnIGlzIHRoZSB1cmwuICBQZXJoYXBzIGV2ZW50dWFsbHkgcHV0IGluCi0lIGEgaHlwZXJ0ZXggXHNwZWNpYWwgaGVyZS4KLSUKLVxkZWZcdXJlZiMxe1xkb3VyZWYgIzEsLCxcZmluaXNofQotXGRlZlxkb3VyZWYjMSwjMiwjMywjNFxmaW5pc2h7XGJlZ2luZ3JvdXAKLSAgXHVuc2Vwc3BhY2VzCi0gIFxwZGZ1cmx7IzF9JQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzN9JQotICBcaWZkaW1cd2QwID4gMHB0Ci0gICAgXHVuaGJveDAgJSB0aGlyZCBhcmcgZ2l2ZW4sIHNob3cgb25seSB0aGF0Ci0gIFxlbHNlCi0gICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKLSAgICBcaWZkaW1cd2QwID4gMHB0Ci0gICAgICBcaWZwZGYKLSAgICAgICAgXHVuaGJveDAgICAgICAgICAgICAgJSBQREY6IDJuZCBhcmcgZ2l2ZW4sIHNob3cgb25seSBpdAotICAgICAgXGVsc2UKLSAgICAgICAgXHVuaGJveDBcIChcY29kZXsjMX0pJSBEVkk6IDJuZCBhcmcgZ2l2ZW4sIHNob3cgYm90aCBpdCBhbmQgdXJsCi0gICAgICBcZmkKLSAgICBcZWxzZQotICAgICAgXGNvZGV7IzF9JSBvbmx5IHVybCBnaXZlbiwgc28gc2hvdyBpdAotICAgIFxmaQotICBcZmkKLSAgXGVuZGxpbmsKLVxlbmRncm91cH0KLQotJSBybXMgZG9lcyBub3QgbGlrZSBhbmdsZSBicmFja2V0cyAtLWthcmwsIDE3bWF5OTcuCi0lIFNvIG5vdyBAZW1haWwgaXMganVzdCBsaWtlIEB1cmVmLCB1bmxlc3Mgd2UgYXJlIHBkZi4KLSUgCi0lXGRlZlxlbWFpbCMxe1xhbmdsZWxlZnR7XHR0ICMxfVxhbmdsZXJpZ2h0fQotXGlmcGRmCi0gIFxkZWZcZW1haWwjMXtcZG9lbWFpbCMxLCxcZmluaXNofQotICBcZGVmXGRvZW1haWwjMSwjMiwjM1xmaW5pc2h7XGJlZ2luZ3JvdXAKLSAgICBcdW5zZXBzcGFjZXMKLSAgICBccGRmdXJse21haWx0bzojMX0lCi0gICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKLSAgICBcaWZkaW1cd2QwPjBwdFx1bmhib3gwXGVsc2VcY29kZXsjMX1cZmkKLSAgICBcZW5kbGluawotICBcZW5kZ3JvdXB9Ci1cZWxzZQotICBcbGV0XGVtYWlsPVx1cmVmCi1cZmkKLQotJSBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgdHlwZXdyaXRlciBmb250LiAgU2luY2UgYWxsIHRoZQotJSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8gaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZAotJSBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZQotJSB0aGlzIHByb3BlcnR5LCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KLSUKLVxkZWZcaWZtb25vc3BhY2V7XGlmZGltXGZvbnRkaW1lbjNcZm9udD0wcHQgfQotCi0lIFR5cGVzZXQgYSBkaW1lbnNpb24sIGUuZy4sIGBpbicgb3IgYHB0Jy4gIFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhlCi0lIGFyZ3VtZW50IGlzIHRvIG1ha2UgdGhlIGlucHV0IGxvb2sgcmlnaHQ6IEBkbW57cHR9IGluc3RlYWQgb2YgQGRtbnt9cHQuCi0lCi1cZGVmXGRtbiMxe1x0aGluc3BhY2UgIzF9Ci0KLVxkZWZca2JkIzF7XGRlZlxsb29reyMxfVxleHBhbmRhZnRlclxrYmRmb29cbG9vaz8/XHBhcn0KLQotJSBAbCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCB0byBtZWFuIGBgc3dpdGNoIHRvIHRoZSBMaXNwIGZvbnQnJywKLSUgYW5kIGl0IGlzIG5vdCB1c2VkIGFzIHN1Y2ggaW4gYW55IG1hbnVhbCBJIGNhbiBmaW5kLiAgV2UgbmVlZCBpdCBmb3IKLSUgUG9saXNoIHN1cHByZXNzZWQtbC4gIC0ta2FybCwgMjJzZXA5Ni4KLSVcZGVmXGwjMXt7XGxpICMxfVxudWxsfQotCi0lIEV4cGxpY2l0IGZvbnQgY2hhbmdlczogQHIsIEBzYywgdW5kb2N1bWVudGVkIEBpaS4KLVxkZWZcciMxe3tccm0gIzF9fSAgICAgICAgICAgICAgJSByb21hbiBmb250Ci1cZGVmXHNjIzF7e1xzbWFsbGNhcHMjMX19ICAgICAgICUgc21hbGxjYXBzIGZvbnQKLVxkZWZcaWkjMXt7XGl0ICMxfX0gICAgICAgICAgICAgJSBpdGFsaWMgZm9udAotCi0lIEBhY3JvbnltIGRvd25jYXNlcyB0aGUgYXJndW1lbnQgYW5kIHByaW50cyBpbiBzbWFsbGNhcHMuCi1cZGVmXGFjcm9ueW0jMXt7XHNtYWxsY2FwcyBcbG93ZXJjYXNleyMxfX19Ci0KLSUgQHBvdW5kc3t9IGlzIGEgc3Rlcmxpbmcgc2lnbi4KLVxkZWZccG91bmRze3tcaXRcJH19Ci0KLQotXG1lc3NhZ2V7cGFnZSBoZWFkaW5ncyx9Ci0KLVxuZXdza2lwXHRpdGxlcGFnZXRvcGdsdWUgXHRpdGxlcGFnZXRvcGdsdWUgPSAxLjVpbgotXG5ld3NraXBcdGl0bGVwYWdlYm90dG9tZ2x1ZSBcdGl0bGVwYWdlYm90dG9tZ2x1ZSA9IDJwYwotCi0lIEZpcnN0IHRoZSB0aXRsZSBwYWdlLiAgTXVzdCBkbyBAc2V0dGl0bGUgYmVmb3JlIEB0aXRsZXBhZ2UuCi1cbmV3aWZcaWZzZWVuYXV0aG9yCi1cbmV3aWZcaWZmaW5pc2hlZHRpdGxlcGFnZQotCi0lIERvIGFuIGltcGxpY2l0IEBjb250ZW50cyBvciBAc2hvcnRjb250ZW50cyBhZnRlciBAZW5kIHRpdGxlcGFnZSBpZiB0aGUKLSUgdXNlciBzYXlzIEBzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlIG9yIEBzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UuCi0lCi1cbmV3aWZcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gXGxldFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi1cbmV3aWZcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSBcbGV0XHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2V0cnVlCi0KLVxkZWZcc2hvcnR0aXRsZXBhZ2V7XHBhcnNlYXJnXHNob3J0dGl0bGVwYWdlenp6fQotXGRlZlxzaG9ydHRpdGxlcGFnZXp6eiAjMXtcYmVnaW5ncm91cFxoYm94e31cdnNraXAgMS41aW4gXGNoYXBybSBcY2VudGVybGluZXsjMX0lCi0gICAgICAgIFxlbmRncm91cFxwYWdlXGhib3h7fVxwYWdlfQotCi1cZGVmXHRpdGxlcGFnZXtcYmVnaW5ncm91cCBccGFyaW5kZW50PTBwdCBcdGV4dGZvbnRzCi0gICBcbGV0XHN1YnRpdGxlcm09XHRlbnJtCi0gICBcZGVmXHN1YnRpdGxlZm9udHtcc3VidGl0bGVybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTNwdCBcbm9ybWFsYmFzZWxpbmVzfSUKLSAgICUKLSAgIFxkZWZcYXV0aG9yZm9udHtcYXV0aG9ycm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDE2cHQgXG5vcm1hbGJhc2VsaW5lc30lCi0gICAlCi0gICAlIExlYXZlIHNvbWUgc3BhY2UgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBwYWdlLgotICAgXHZnbHVlXHRpdGxlcGFnZXRvcGdsdWUKLSAgICUKLSAgICUgTm93IHlvdSBjYW4gcHJpbnQgdGhlIHRpdGxlIHVzaW5nIEB0aXRsZS4KLSAgIFxkZWZcdGl0bGV7XHBhcnNlYXJnXHRpdGxlenp6fSUKLSAgIFxkZWZcdGl0bGV6enojIzF7XGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtICMjMX0KLSAgICAgICAgICAgICAgICAgICAgJSBwcmludCBhIHJ1bGUgYXQgdGhlIHBhZ2UgYm90dG9tIGFsc28uCi0gICAgICAgICAgICAgICAgICAgIFxmaW5pc2hlZHRpdGxlcGFnZWZhbHNlCi0gICAgICAgICAgICAgICAgICAgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDRwdCB3aWR0aCBcaHNpemUgXHZza2lwNHB0fSUKLSAgICUgTm8gcnVsZSBhdCBwYWdlIGJvdHRvbSB1bmxlc3Mgd2UgcHJpbnQgb25lIGF0IHRoZSB0b3Agd2l0aCBAdGl0bGUuCi0gICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCi0gICAlCi0gICAlIE5vdyB5b3UgY2FuIHB1dCB0ZXh0IHVzaW5nIEBzdWJ0aXRsZS4KLSAgIFxkZWZcc3VidGl0bGV7XHBhcnNlYXJnXHN1YnRpdGxlenp6fSUKLSAgIFxkZWZcc3VidGl0bGV6enojIzF7e1xzdWJ0aXRsZWZvbnQgXHJpZ2h0bGluZXsjIzF9fX0lCi0gICAlCi0gICAlIEBhdXRob3Igc2hvdWxkIGNvbWUgbGFzdCwgYnV0IG1heSBjb21lIG1hbnkgdGltZXMuCi0gICBcZGVmXGF1dGhvcntccGFyc2VhcmdcYXV0aG9yenp6fSUKLSAgIFxkZWZcYXV0aG9yenp6IyMxe1xpZnNlZW5hdXRob3JcZWxzZVx2c2tpcCAwcHQgcGx1cyAxZmlsbGxcc2VlbmF1dGhvcnRydWVcZmkKLSAgICAgIHtcYXV0aG9yZm9udCBcbGVmdGxpbmV7IyMxfX19JQotICAgJQotICAgJSBNb3N0IHRpdGxlIGBgcGFnZXMnJyBhcmUgYWN0dWFsbHkgdHdvIHBhZ2VzIGxvbmcsIHdpdGggc3BhY2UKLSAgICUgYXQgdGhlIHRvcCBvZiB0aGUgc2Vjb25kLiAgV2UgZG9uJ3Qgd2FudCB0aGUgcmFnZ2VkIGxlZnQgb24gdGhlIHNlY29uZC4KLSAgIFxsZXRcb2xkcGFnZSA9IFxwYWdlCi0gICBcZGVmXHBhZ2V7JQotICAgICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgICAgXGZpCi0gICAgICBcb2xkcGFnZQotICAgICAgXGxldFxwYWdlID0gXG9sZHBhZ2UKLSAgICAgIFxoYm94e319JQotJSAgIFxkZWZccGFnZXtcb2xkcGFnZSBcaGJveHt9fQotfQotCi1cZGVmXEV0aXRsZXBhZ2V7JQotICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQotICAgICAgXGZpbmlzaHRpdGxlcGFnZQotICAgXGZpCi0gICAlIEl0IGlzIGltcG9ydGFudCB0byBkbyB0aGUgcGFnZSBicmVhayBiZWZvcmUgZW5kaW5nIHRoZSBncm91cCwKLSAgICUgYmVjYXVzZSB0aGUgaGVhZGxpbmUgYW5kIGZvb3RsaW5lIGFyZSBvbmx5IGVtcHR5IGluc2lkZSB0aGUgZ3JvdXAuCi0gICAlIElmIHdlIHVzZSB0aGUgbmV3IGRlZmluaXRpb24gb2YgXHBhZ2UsIHdlIGFsd2F5cyBnZXQgYSBibGFuayBwYWdlCi0gICAlIGFmdGVyIHRoZSB0aXRsZSBwYWdlLCB3aGljaCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudC4KLSAgIFxvbGRwYWdlCi0gICBcZW5kZ3JvdXAKLSAgICUKLSAgICUgSWYgdGhleSB3YW50IHNob3J0LCB0aGV5IGNlcnRhaW5seSB3YW50IGxvbmcgdG9vLgotICAgXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gICAgIFxzaG9ydGNvbnRlbnRzCi0gICAgIFxjb250ZW50cwotICAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICBcZmkKLSAgICUKLSAgIFxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSAgICAgXGNvbnRlbnRzCi0gICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4Ci0gICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKLSAgIFxmaQotICAgJQotICAgXGlmcGRmIFxwZGZtYWtlcGFnZWRlc3R0cnVlIFxmaQotICAgJQotICAgXEhFQURJTkdTb24KLX0KLQotXGRlZlxmaW5pc2h0aXRsZXBhZ2V7JQotICAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgMnB0IHdpZHRoIFxoc2l6ZQotICAgXHZza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUKLSAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKLX0KLQotJSUlIFNldCB1cCBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KLQotXGxldFx0aGlzcGFnZT1cZm9saW8KLQotXG5ld3Rva3NcZXZlbmhlYWRsaW5lICAgICUgaGVhZGxpbmUgb24gZXZlbiBwYWdlcwotXG5ld3Rva3Ncb2RkaGVhZGxpbmUgICAgICUgaGVhZGxpbmUgb24gb2RkIHBhZ2VzCi1cbmV3dG9rc1xldmVuZm9vdGxpbmUgICAgJSBmb290bGluZSBvbiBldmVuIHBhZ2VzCi1cbmV3dG9rc1xvZGRmb290bGluZSAgICAgJSBmb290bGluZSBvbiBvZGQgcGFnZXMKLQotJSBOb3cgbWFrZSBUZXggdXNlIHRob3NlIHZhcmlhYmxlcwotXGhlYWRsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkaGVhZGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5oZWFkbGluZSBcZml9fQotXGZvb3RsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkZm9vdGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZWxzZSBcdGhlXGV2ZW5mb290bGluZSBcZml9XEhFQURJTkdTaG9va30KLVxsZXRcSEVBRElOR1Nob29rPVxyZWxheAotCi0lIENvbW1hbmRzIHRvIHNldCB0aG9zZSB2YXJpYWJsZXMuCi0lIEZvciBleGFtcGxlLCB0aGlzIGlzIHdoYXQgIEBoZWFkaW5ncyBvbiAgZG9lcwotJSBAZXZlbmhlYWRpbmcgQHRoaXN0aXRsZXxAdGhpc3BhZ2V8QHRoaXNjaGFwdGVyCi0lIEBvZGRoZWFkaW5nIEB0aGlzY2hhcHRlcnxAdGhpc3BhZ2V8QHRoaXN0aXRsZQotJSBAZXZlbmZvb3RpbmcgQHRoaXNmaWxlfHwKLSUgQG9kZGZvb3RpbmcgfHxAdGhpc2ZpbGUKLQotXGRlZlxldmVuaGVhZGluZ3tccGFyc2VhcmdcZXZlbmhlYWRpbmd4eHh9Ci1cZGVmXG9kZGhlYWRpbmd7XHBhcnNlYXJnXG9kZGhlYWRpbmd4eHh9Ci1cZGVmXGV2ZXJ5aGVhZGluZ3tccGFyc2VhcmdcZXZlcnloZWFkaW5neHh4fQotCi1cZGVmXGV2ZW5mb290aW5ne1xwYXJzZWFyZ1xldmVuZm9vdGluZ3h4eH0KLVxkZWZcb2RkZm9vdGluZ3tccGFyc2Vhcmdcb2RkZm9vdGluZ3h4eH0KLVxkZWZcZXZlcnlmb290aW5ne1xwYXJzZWFyZ1xldmVyeWZvb3Rpbmd4eHh9Ci0KLXtcY2F0Y29kZWBcQD0wICUKLQotXGdkZWZcZXZlbmhlYWRpbmd4eHggIzF7XGV2ZW5oZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcZXZlbmhlYWRpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXG9kZGhlYWRpbmd4eHggIzF7XG9kZGhlYWRpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxvZGRoZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXGV2ZXJ5aGVhZGluZ3h4eCMxe1xvZGRoZWFkaW5neHh4eyMxfVxldmVuaGVhZGluZ3h4eHsjMX19JQotCi1cZ2RlZlxldmVuZm9vdGluZ3h4eCAjMXtcZXZlbmZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxldmVuZm9vdGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KLQotXGdkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXG9kZGZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLSAgXGdsb2JhbFxvZGRmb290bGluZSA9IHtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX0lCi0gICUKLSAgJSBMZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgZm9vdGxpbmUuICBIb3BlZnVsbHkgb2sgdG8gYXNzdW1lCi0gICUgQGV2ZW5mb290aW5nIHdpbGwgbm90IGJlIHVzZWQgYnkgaXRzZWxmLgotICBcZ2xvYmFsXGFkdmFuY2VccGFnZWhlaWdodCBieSAtXGJhc2VsaW5lc2tpcAotICBcZ2xvYmFsXGFkdmFuY2VcdnNpemUgYnkgLVxiYXNlbGluZXNraXAKLX0KLQotXGdkZWZcZXZlcnlmb290aW5neHh4IzF7XG9kZGZvb3Rpbmd4eHh7IzF9XGV2ZW5mb290aW5neHh4eyMxfX0KLSUKLX0lIHVuYmluZCB0aGUgY2F0Y29kZSBvZiBALgotCi0lIEBoZWFkaW5ncyBkb3VibGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLgotJSBAaGVhZGluZ3Mgc2luZ2xlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIHNpbmdsZS1zaWRlZCBwcmludGluZy4KLSUgQGhlYWRpbmdzIG9mZiAgICAgICAgIHR1cm5zIHRoZW0gb2ZmLgotJSBAaGVhZGluZ3Mgb24gICAgICAgICAgc2FtZSBhcyBAaGVhZGluZ3MgZG91YmxlLCByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4KLSUgQGhlYWRpbmdzIGFmdGVyICAgICAgIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEBoZWFkaW5ncyBkb3VibGVhZnRlciB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBAaGVhZGluZ3Mgc2luZ2xlYWZ0ZXIgdHVybnMgb24gc2luZ2xlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQnkgZGVmYXVsdCwgdGhleSBhcmUgb2ZmIGF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50LAotJSBhbmQgdHVybmVkIGBvbicgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UuCi0KLVxkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9Ci0KLVxkZWZcSEVBRElOR1NvZmZ7Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH19Ci1cSEVBRElOR1NvZmYKLSUgV2hlbiB3ZSB0dXJuIGhlYWRpbmdzIG9uLCBzZXQgdGhlIHBhZ2UgbnVtYmVyIHRvIDEuCi0lIEZvciBkb3VibGUtc2lkZWQgcHJpbnRpbmcsIHB1dCBjdXJyZW50IGZpbGUgbmFtZSBpbiBsb3dlciBsZWZ0IGNvcm5lciwKLSUgY2hhcHRlciBuYW1lIG9uIGluc2lkZSB0b3Agb2YgcmlnaHQgaGFuZCBwYWdlcywgZG9jdW1lbnQKLSUgdGl0bGUgb24gaW5zaWRlIHRvcCBvZiBsZWZ0IGhhbmQgcGFnZXMsIGFuZCBwYWdlIG51bWJlcnMgb24gb3V0c2lkZSB0b3AKLSUgZWRnZSBvZiBhbGwgcGFnZXMuCi1cZGVmXEhFQURJTkdTZG91YmxlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotfQotXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi0KLSUgRm9yIHNpbmdsZS1zaWRlZCBwcmludGluZywgY2hhcHRlciB0aXRsZSBnb2VzIGFjcm9zcyB0b3AgbGVmdCBvZiBwYWdlLAotJSBwYWdlIG51bWJlciBvbiB0b3AgcmlnaHQuCi1cZGVmXEhFQURJTkdTc2luZ2xlewotXGdsb2JhbFxwYWdlbm89MQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotfQotXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX0KLQotXGRlZlxIRUFESU5HU2FmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU2RvdWJsZXh9Ci1cbGV0XEhFQURJTkdTZG91YmxlYWZ0ZXI9XEhFQURJTkdTYWZ0ZXIKLVxkZWZcSEVBRElOR1Nkb3VibGV4eyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLX0KLQotXGRlZlxIRUFESU5HU3NpbmdsZWFmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU3NpbmdsZXh9Ci1cZGVmXEhFQURJTkdTc2luZ2xleHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi19Ci0KLSUgU3Vicm91dGluZXMgdXNlZCBpbiBnZW5lcmF0aW5nIGhlYWRpbmdzCi0lIFByb2R1Y2VzIERheSBNb250aCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KLVxkZWZcdG9kYXl7JQotICBcbnVtYmVyXGRheVxzcGFjZQotICBcaWZjYXNlXG1vbnRoCi0gIFxvclxwdXR3b3JkTUphblxvclxwdXR3b3JkTUZlYlxvclxwdXR3b3JkTU1hclxvclxwdXR3b3JkTUFwcgotICBcb3JccHV0d29yZE1NYXlcb3JccHV0d29yZE1KdW5cb3JccHV0d29yZE1KdWxcb3JccHV0d29yZE1BdWcKLSAgXG9yXHB1dHdvcmRNU2VwXG9yXHB1dHdvcmRNT2N0XG9yXHB1dHdvcmRNTm92XG9yXHB1dHdvcmRNRGVjCi0gIFxmaQotICBcc3BhY2VcbnVtYmVyXHllYXJ9Ci0KLSUgQHNldHRpdGxlIGxpbmUuLi4gIHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LCBmb3IgaGVhZGluZ3MuCi0lIEl0IGdlbmVyYXRlcyBubyBvdXRwdXQgb2YgaXRzIG93bi4KLVxkZWZcdGhpc3RpdGxle1xwdXR3b3JkTm9UaXRsZX0KLVxkZWZcc2V0dGl0bGV7XHBhcnNlYXJnXHNldHRpdGxlenp6fQotXGRlZlxzZXR0aXRsZXp6eiAjMXtcZ2RlZlx0aGlzdGl0bGV7IzF9fQotCi0KLVxtZXNzYWdle3RhYmxlcyx9Ci0lIFRhYmxlcyAtLSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUsIEBpdGVtKHgpLCBAa2l0ZW0oeCksIEB4aXRlbSh4KS4KLQotJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIHRhYmxlIHRleHQKLVxuZXdkaW1lblx0YWJsZWluZGVudCBcdGFibGVpbmRlbnQ9LjhpbgotJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlIHRleHQKLVxuZXdkaW1lblxpdGVtaW5kZW50ICBcaXRlbWluZGVudD0uM2luCi0lIG1hcmdpbiBiZXR3ZWVuIGVuZCBvZiB0YWJsZSBpdGVtIGFuZCBzdGFydCBvZiB0YWJsZSB0ZXh0LgotXG5ld2RpbWVuXGl0ZW1tYXJnaW4gIFxpdGVtbWFyZ2luPS4xaW4KLQotJSB1c2VkIGludGVybmFsbHkgZm9yIFxpdGVtaW5kZW50IG1pbnVzIFxpdGVtbWFyZ2luCi1cbmV3ZGltZW5caXRlbW1heAotCi0lIE5vdGUgQHRhYmxlLCBAdnRhYmxlLCBhbmQgQHZ0YWJsZSBkZWZpbmUgQGl0ZW0sIEBpdGVteCwgZXRjLiwgd2l0aAotJSB0aGVzZSBkZWZzLgotJSBUaGV5IGFsc28gZGVmaW5lIFxpdGVtaW5kZXgKLSUgdG8gaW5kZXggdGhlIGl0ZW0gbmFtZSBpbiB3aGF0ZXZlciBtYW5uZXIgaXMgZGVzaXJlZCAocGVyaGFwcyBub25lKS4KLQotXG5ld2lmXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXAKLQotXGRlZlxpdGVteHBhcntccGFyXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXBcbm9icmVha1x2c2tpcC1ccGFyc2tpcFxub2JyZWFrXGZpfQotCi1cZGVmXGludGVybmFsQml0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGl0ZW16enp9Ci1cZGVmXGludGVybmFsQml0ZW14e1xpdGVteHBhciBccGFyc2VhcmdcaXRlbXp6en0KLQotXGRlZlxpbnRlcm5hbEJ4aXRlbSAiIzEie1xkZWZceGl0ZW1zdWJ0b3BpeHsjMX0gXHNtYWxsYnJlYWsgXHBhcnNlYXJnXHhpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJ4aXRlbXggIiMxIntcZGVmXHhpdGVtc3VidG9waXh7IzF9IFxpdGVteHBhciBccGFyc2VhcmdceGl0ZW16enp9Ci0KLVxkZWZcaW50ZXJuYWxCa2l0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGtpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJraXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xraXRlbXp6en0KLQotXGRlZlxraXRlbXp6eiAjMXtcZG9zdWJpbmQge2t3fXtcY29kZXsjMX19e2ZvciB7XGJmIFxsYXN0ZnVuY3Rpb259fSUKLSAgICAgICAgICAgICAgICAgXGl0ZW16enogeyMxfX0KLQotXGRlZlx4aXRlbXp6eiAjMXtcZG9zdWJpbmQge2t3fXtcY29kZXsjMX19e2ZvciB7XGJmIFx4aXRlbXN1YnRvcGljfX0lCi0gICAgICAgICAgICAgICAgIFxpdGVtenp6IHsjMX19Ci0KLVxkZWZcaXRlbXp6eiAjMXtcYmVnaW5ncm91cCAlCi0gIFxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCi0gIFxhZHZhbmNlXGhzaXplIGJ5IC1cdGFibGVpbmRlbnQKLSAgXHNldGJveDA9XGhib3h7XGl0ZW1mb250eyMxfX0lCi0gIFxpdGVtaW5kZXh7IzF9JQotICBcbm9icmVhayAlIFRoaXMgcHJldmVudHMgYSBicmVhayBiZWZvcmUgQGl0ZW14LgotICAlCi0gICUgSWYgdGhlIGl0ZW0gdGV4dCBkb2VzIG5vdCBmaXQgaW4gdGhlIHNwYWNlIHdlIGhhdmUsIHB1dCBpdCBvbiBhIGxpbmUKLSAgJSBieSBpdHNlbGYsIGFuZCBkbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAotICAlIGxpbmUuICBXZSBkbyBub3Qgc3RhcnQgYSBwYXJhZ3JhcGggaGVyZSBiZWNhdXNlIHRoZW4gaWYgdGhlIG5leHQKLSAgJSBjb21tYW5kIGlzLCBlLmcuLCBAa2luZGV4LCB0aGUgd2hhdHNpdCB3b3VsZCBnZXQgcHV0IGludG8gdGhlCi0gICUgaG9yaXpvbnRhbCBsaXN0IG9uIGEgbGluZSBieSBpdHNlbGYsIHJlc3VsdGluZyBpbiBleHRyYSBibGFuayBzcGFjZS4KLSAgXGlmZGltIFx3ZDA+XGl0ZW1tYXgKLSAgICAlCi0gICAgJSBNYWtlIHRoaXMgYSBwYXJhZ3JhcGggc28gd2UgZ2V0IHRoZSBccGFyc2tpcCBnbHVlIGFuZCB3cmFwcGluZywKLSAgICAlIGJ1dCBsZWF2ZSBpdCByYWdnZWQtcmlnaHQuCi0gICAgXGJlZ2luZ3JvdXAKLSAgICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5LVx0YWJsZWluZGVudAotICAgICAgXGFkdmFuY2VcaHNpemUgYnlcdGFibGVpbmRlbnQKLSAgICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieTBwdCBwbHVzMWZpbAotICAgICAgXGxlYXZldm1vZGVcdW5oYm94MFxwYXIKLSAgICBcZW5kZ3JvdXAKLSAgICAlCi0gICAgJSBXZSdyZSBnb2luZyB0byBiZSBzdGFydGluZyBhIHBhcmFncmFwaCwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCi0gICAgJSBccGFyc2tpcCBnbHVlIC0tIGxvZ2ljYWxseSBpdCdzIHBhcnQgb2YgdGhlIEBpdGVtIHdlIGp1c3Qgc3RhcnRlZC4KLSAgICBcbm9icmVhayBcdnNraXAtXHBhcnNraXAKLSAgICAlCi0gICAgJSBTdG9wIGEgcGFnZSBicmVhayBhdCB0aGUgXHBhcnNraXAgZ2x1ZSBjb21pbmcgdXAuICBVbmZvcnR1bmF0ZWx5Ci0gICAgJSB3ZSBjYW4ndCBwcmV2ZW50IGEgcG9zc2libGUgcGFnZSBicmVhayBhdCB0aGUgZm9sbG93aW5nCi0gICAgJSBcYmFzZWxpbmVza2lwIGdsdWUuCi0gICAgXG5vYnJlYWsKLSAgICBcZW5kZ3JvdXAKLSAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXBmYWxzZQotICBcZWxzZQotICAgICUgVGhlIGl0ZW0gdGV4dCBmaXRzIGludG8gdGhlIHNwYWNlLiAgU3RhcnQgYSBwYXJhZ3JhcGgsIHNvIHRoYXQgdGhlCi0gICAgJSBmb2xsb3dpbmcgdGV4dCAoaWYgYW55KSB3aWxsIGVuZCB1cCBvbiB0aGUgc2FtZSBsaW5lLgotICAgIFxub2luZGVudAotICAgICUgRG8gdGhpcyB3aXRoIGtlcm5zIGFuZCBcdW5oYm94IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSBmb290bm90ZSBpbgotICAgICUgdGhlIGl0ZW0gdGV4dCwgaXQgY2FuIG1pZ3JhdGUgdG8gdGhlIG1haW4gdmVydGljYWwgbGlzdCBhbmQKLSAgICAlIGV2ZW50dWFsbHkgYmUgcHJpbnRlZC4KLSAgICBcbm9icmVha1xrZXJuLVx0YWJsZWluZGVudAotICAgIFxkaW1lbjAgPSBcaXRlbW1heCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxpdGVtbWFyZ2luIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMAotICAgIFx1bmhib3gwCi0gICAgXG5vYnJlYWtca2VyblxkaW1lbjAKLSAgICBcZW5kZ3JvdXAKLSAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXB0cnVlCi0gIFxmaQotfQotCi1cZGVmXGl0ZW17XGVycm1lc3NhZ2V7QGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxpdGVteHtcZXJybWVzc2FnZXtAaXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXtcZXJybWVzc2FnZXtAa2l0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlxraXRlbXh7XGVycm1lc3NhZ2V7QGtpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVte1xlcnJtZXNzYWdle0B4aXRlbSB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXHhpdGVteHtcZXJybWVzc2FnZXtAeGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLQotJSBDb250YWlucyBhIGtsdWRnZSB0byBnZXQgQGVuZFtkZXNjcmlwdGlvbl0gdG8gd29yay4KLVxkZWZcZGVzY3JpcHRpb257XHRhYmxlentcZG9udGluZGV4fXsxfXt9e317fXt9fQotCi0lIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZS4KLVxkZWZcdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdGFibGV4fQote1xvYmV5bGluZXNcb2JleXNwYWNlcyUKLVxnZGVmXHRhYmxleCAjMV5eTXslCi1cdGFibGV5XGRvbnRpbmRleCMxICAgICAgICBcZW5kdGFibGV5fX0KLQotXGRlZlxmdGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcZnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlxmdGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcZm5pdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFZnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlx2dGFibGV7XGJlZ2luZ3JvdXBcaW5FTlZcb2JleWxpbmVzXG9iZXlzcGFjZXNcdnRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlx2dGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcdnJpdGVtaW5kZXgjMSAgICAgICAgXGVuZHRhYmxleQotXGRlZlxFdnRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxFdGFibGU9XHJlbGF4fX0KLQotXGRlZlxkb250aW5kZXggIzF7fQotXGRlZlxmbml0ZW1pbmRleCAjMXtcZG9pbmQge2ZufXtcY29kZXsjMX19fSUKLVxkZWZcdnJpdGVtaW5kZXggIzF7XGRvaW5kIHt2cn17XGNvZGV7IzF9fX0lCi0KLXtcb2JleXNwYWNlcyAlCi1cZ2RlZlx0YWJsZXkjMSMyICMzICM0ICM1ICM2ICM3XGVuZHRhYmxleXtcZW5kZ3JvdXAlCi1cdGFibGV6eyMxfXsjMn17IzN9eyM0fXsjNX17IzZ9fX0KLQotXGRlZlx0YWJsZXogIzEjMiMzIzQjNSM2eyUKLVxhYm92ZWVudmJyZWFrICUKLVxiZWdpbmdyb3VwICUKLVxkZWZcRWRlc2NyaXB0aW9ue1xFdGFibGV9JSBOZWNlc3Nhcnkga2x1ZGdlLgotXGxldFxpdGVtaW5kZXg9IzElCi1caWZudW0gMCMzPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMzXG1pbCBcZmkgJQotXGlmbnVtIDAjND4wIFx0YWJsZWluZGVudD0jNFxtaWwgXGZpICUKLVxpZm51bSAwIzU+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICM1XG1pbCBcZmkgJQotXGRlZlxpdGVtZm9udHsjMn0lCi1caXRlbW1heD1cdGFibGVpbmRlbnQgJQotXGFkdmFuY2UgXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luICUKLVxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcdGFibGVpbmRlbnQgJQotXGV4ZGVudGFtb3VudD1cdGFibGVpbmRlbnQKLVxwYXJpbmRlbnQgPSAwcHQKLVxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudAotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZlxFdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cbGV0XGl0ZW0gPSBcaW50ZXJuYWxCaXRlbSAlCi1cbGV0XGl0ZW14ID0gXGludGVybmFsQml0ZW14ICUKLVxsZXRca2l0ZW0gPSBcaW50ZXJuYWxCa2l0ZW0gJQotXGxldFxraXRlbXggPSBcaW50ZXJuYWxCa2l0ZW14ICUKLVxsZXRceGl0ZW0gPSBcaW50ZXJuYWxCeGl0ZW0gJQotXGxldFx4aXRlbXggPSBcaW50ZXJuYWxCeGl0ZW14ICUKLX0KLQotJSBUaGlzIGlzIHRoZSBjb3VudGVyIHVzZWQgYnkgQGVudW1lcmF0ZSwgd2hpY2ggaXMgcmVhbGx5IEBpdGVtaXplCi0KLVxuZXdjb3VudCBcaXRlbW5vCi0KLVxkZWZcaXRlbWl6ZXtccGFyc2VhcmdcaXRlbWl6ZXp6en0KLQotXGRlZlxpdGVtaXplenp6ICMxeyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBpdGVtaXplCi0gIFxpdGVtaXpleSB7IzF9e1xFaXRlbWl6ZX0KLX0KLQotXGRlZlxpdGVtaXpleSAjMSMyeyUKLVxhYm92ZWVudmJyZWFrICUKLVxpdGVtbWF4PVxpdGVtaW5kZW50ICUKLVxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCi1cYWR2YW5jZSBcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQgJQotXGV4ZGVudGFtb3VudD1caXRlbWluZGVudAotXHBhcmluZGVudCA9IDBwdCAlCi1ccGFyc2tpcCA9IFxzbWFsbHNraXBhbW91bnQgJQotXGlmZGltIFxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpJQotXGRlZiMye1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGRlZlxpdGVtY29udGVudHN7IzF9JQotXGxldFxpdGVtPVxpdGVtaXplaXRlbX0KLQotJSBTZXQgc2Zjb2RlIHRvIG5vcm1hbCBmb3IgdGhlIGNoYXJzIHRoYXQgdXN1YWxseSBoYXZlIGFub3RoZXIgdmFsdWUuCi0lIFRoZXNlIGFyZSBgLj8hOjssJwotXGRlZlxmcmVuY2hzcGFjaW5ne1xzZmNvZGU0Nj0xMDAwIFxzZmNvZGU2Mz0xMDAwIFxzZmNvZGUzMz0xMDAwCi0gIFxzZmNvZGU1OD0xMDAwIFxzZmNvZGU1OT0xMDAwIFxzZmNvZGU0ND0xMDAwIH0KLQotJSBcc3BsaXRvZmYgVE9LRU5TXGVuZG1hcmsgZGVmaW5lcyBcZmlyc3QgdG8gYmUgdGhlIGZpcnN0IHRva2VuIGluCi0lIFRPS0VOUywgYW5kIFxyZXN0IHRvIGJlIHRoZSByZW1haW5kZXIuCi0lCi1cZGVmXHNwbGl0b2ZmIzEjMlxlbmRtYXJre1xkZWZcZmlyc3R7IzF9XGRlZlxyZXN0eyMyfX0lCi0KLSUgQWxsb3cgYW4gb3B0aW9uYWwgYXJndW1lbnQgb2YgYW4gdXBwZXJjYXNlIGxldHRlciwgbG93ZXJjYXNlIGxldHRlciwKLSUgb3IgbnVtYmVyLCB0byBzcGVjaWZ5IHRoZSBmaXJzdCBsYWJlbCBpbiB0aGUgZW51bWVyYXRlZCBsaXN0LiAgTm8KLSUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgYDEnLgotJQotXGRlZlxlbnVtZXJhdGV7XHBhcnNlYXJnXGVudW1lcmF0ZXp6en0KLVxkZWZcZW51bWVyYXRlenp6ICMxe1xlbnVtZXJhdGV5ICMxICBcZW5kZW51bWVyYXRleX0KLVxkZWZcZW51bWVyYXRleSAjMSAjMlxlbmRlbnVtZXJhdGV5eyUKLSAgXGJlZ2luZ3JvdXAgJSBlbmRlZCBieSB0aGUgQGVuZCBlbnVtZXJhdGUKLSAgJQotICAlIElmIHdlIHdlcmUgZ2l2ZW4gbm8gYXJndW1lbnQsIHByZXRlbmQgd2Ugd2VyZSBnaXZlbiBgMScuCi0gIFxkZWZcdGhlYXJneyMxfSUKLSAgXGlmeFx0aGVhcmdcZW1wdHkgXGRlZlx0aGVhcmd7MX1cZmkKLSAgJQotICAlIERldGVjdCBpZiB0aGUgYXJndW1lbnQgaXMgYSBzaW5nbGUgdG9rZW4uICBJZiBzbywgaXQgbWlnaHQgYmUgYQotICAlIGxldHRlci4gIE90aGVyd2lzZSwgdGhlIG9ubHkgdmFsaWQgdGhpbmcgaXQgY2FuIGJlIGlzIGEgbnVtYmVyLgotICAlIChXZSB3aWxsIGFsd2F5cyBoYXZlIG9uZSB0b2tlbiwgYmVjYXVzZSBvZiB0aGUgdGVzdCB3ZSBqdXN0IG1hZGUuCi0gICUgVGhpcyBpcyBhIGdvb2QgdGhpbmcsIHNpbmNlIFxzcGxpdG9mZiBkb2Vzbid0IHdvcmsgZ2l2ZW4gbm90aGluZyBhdAotICAlIGFsbCAtLSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHVuZGVsaW1pdGVkLikKLSAgXGV4cGFuZGFmdGVyXHNwbGl0b2ZmXHRoZWFyZ1xlbmRtYXJrCi0gIFxpZnhccmVzdFxlbXB0eQotICAgICUgT25seSBvbmUgdG9rZW4gaW4gdGhlIGFyZ3VtZW50LiAgSXQgY291bGQgc3RpbGwgYmUgYW55dGhpbmcuCi0gICAgJSBBIGBgbG93ZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIG5vbnplcm8uCi0gICAgJSBBbiBgYHVwcGVyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBib3RoIG5vbnplcm8sIGFuZAotICAgICUgICBub3QgZXF1YWwgdG8gaXRzZWxmLgotICAgICUgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgaXQncyBhIG51bWJlci4KLSAgICAlCi0gICAgJSBXZSBuZWVkIHRoZSBccmVsYXggYXQgdGhlIGVuZCBvZiB0aGUgXGlmbnVtIGxpbmVzIHRvIHN0b3AgVGVYIGZyb20KLSAgICAlIGNvbnRpbnVpbmcgdG8gbG9vayBmb3IgYSA8bnVtYmVyPi4KLSAgICAlCi0gICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPTBccmVsYXgKLSAgICAgIFxudW1lcmljZW51bWVyYXRlICUgYSBudW1iZXIgKHdlIGhvcGUpCi0gICAgXGVsc2UKLSAgICAgICUgSXQncyBhIGxldHRlci4KLSAgICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz1cZXhwYW5kYWZ0ZXJgXHRoZWFyZ1xyZWxheAotICAgICAgICBcbG93ZXJjYXNlZW51bWVyYXRlICUgbG93ZXJjYXNlIGxldHRlcgotICAgICAgXGVsc2UKLSAgICAgICAgXHVwcGVyY2FzZWVudW1lcmF0ZSAlIHVwcGVyY2FzZSBsZXR0ZXIKLSAgICAgIFxmaQotICAgIFxmaQotICBcZWxzZQotICAgICUgTXVsdGlwbGUgdG9rZW5zIGluIHRoZSBhcmd1bWVudC4gIFdlIGhvcGUgaXQncyBhIG51bWJlci4KLSAgICBcbnVtZXJpY2VudW1lcmF0ZQotICBcZmkKLX0KLQotJSBBbiBAZW51bWVyYXRlIHdob3NlIGxhYmVscyBhcmUgaW50ZWdlcnMuICBUaGUgc3RhcnRpbmcgaW50ZWdlciBpcwotJSBnaXZlbiBpbiBcdGhlYXJnLgotJQotXGRlZlxudW1lcmljZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFx0aGVhcmcKLSAgXHN0YXJ0ZW51bWVyYXRpb257XHRoZVxpdGVtbm99JQotfQotCi0lIFRoZSBzdGFydGluZyAobG93ZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcbG93ZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0lCi0gICAgXGZpCi0gICAgXGNoYXJcbGNjb2RlXGl0ZW1ubwotICB9JQotfQotCi0lIFRoZSBzdGFydGluZyAodXBwZXJjYXNlKSBsZXR0ZXIgaXMgaW4gXHRoZWFyZy4KLVxkZWZcdXBwZXJjYXNlZW51bWVyYXRleyUKLSAgXGl0ZW1ubyA9IFxleHBhbmRhZnRlcmBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ueyUKLSAgICAlIEJlIHN1cmUgd2UncmUgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhbHBoYWJldC4KLSAgICBcaWZudW1caXRlbW5vPTAKLSAgICAgIFxlcnJtZXNzYWdle05vIG1vcmUgdXBwZXJjYXNlIGxldHRlcnMgaW4gQGVudW1lcmF0ZTsgZ2V0IGEgYmlnZ2VyCi0gICAgICAgICAgICAgICAgICBhbHBoYWJldH0KLSAgICBcZmkKLSAgICBcY2hhclx1Y2NvZGVcaXRlbW5vCi0gIH0lCi19Ci0KLSUgQ2FsbCBpdGVtaXpleSwgYWRkaW5nIGEgcGVyaW9kIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3VwcGx5aW5nIHRoZQotJSBjb21tb24gbGFzdCB0d28gYXJndW1lbnRzLiAgQWxzbyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZSBpbgotJSBcaXRlbW5vLCBzaW5jZSBAaXRlbSBpbmNyZW1lbnRzIFxpdGVtbm8uCi0lCi1cZGVmXHN0YXJ0ZW51bWVyYXRpb24jMXslCi0gIFxhZHZhbmNlXGl0ZW1ubyBieSAtMQotICBcaXRlbWl6ZXl7IzEufVxFZW51bWVyYXRlXGZsdXNoY3IKLX0KLQotJSBAYWxwaGFlbnVtZXJhdGUgYW5kIEBjYXBzZW51bWVyYXRlIGFyZSBhYmJyZXZpYXRpb25zIGZvciBnaXZpbmcgYW4gYXJnCi0lIHRvIEBlbnVtZXJhdGUuCi0lCi1cZGVmXGFscGhhZW51bWVyYXRle1xlbnVtZXJhdGV7YX19Ci1cZGVmXGNhcHNlbnVtZXJhdGV7XGVudW1lcmF0ZXtBfX0KLVxkZWZcRWFscGhhZW51bWVyYXRle1xFZW51bWVyYXRlfQotXGRlZlxFY2Fwc2VudW1lcmF0ZXtcRWVudW1lcmF0ZX0KLQotJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZS4KLQotXGRlZlxpdGVtaXplaXRlbXslCi1cYWR2YW5jZVxpdGVtbm8gYnkgMQote1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUKLVxpZmhtb2RlIFxlcnJtZXNzYWdle0luIGhtb2RlIGF0IGl0ZW1pemVpdGVtfVxmaQote1xwYXJza2lwPTBpbiBcaHNraXAgMHB0Ci1caGJveCB0byAwcHR7XGhzcyBcaXRlbWNvbnRlbnRzXGhza2lwIFxpdGVtbWFyZ2lufSUKLVx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUKLVxmbHVzaGNyfQotCi0lIEBtdWx0aXRhYmxlIG1hY3JvcwotJSBBbXkgSGVuZHJpY2tzb24sIDgvMTgvOTQsIDMvNi85NgotJQotJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIHdpbGwgbWFrZSBhcyBtYW55IGNvbHVtbnMgYXMgZGVzaXJlZC4KLSUgQ29udGVudHMgb2YgZWFjaCBjb2x1bW4gd2lsbCB3cmFwIGF0IHdpZHRoIGdpdmVuIGluIHByZWFtYmxlLiAgV2lkdGgKLSUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBzYW1wbGUgdGV4dCBnaXZlbiBpbiBhIHRlbXBsYXRlIGxpbmUsCi0lIG9yIGluIHBlcmNlbnQgb2YgXGhzaXplLCB0aGUgY3VycmVudCB3aWR0aCBvZiB0ZXh0IG9uIHBhZ2UuCi0KLSUgVGFibGUgY2FuIGNvbnRpbnVlIG92ZXIgcGFnZXMgYnV0IHdpbGwgb25seSBicmVhayBiZXR3ZWVuIGxpbmVzLgotCi0lIFRvIG1ha2UgcHJlYW1ibGU6Ci0lCi0lIEVpdGhlciBkZWZpbmUgd2lkdGhzIG9mIGNvbHVtbnMgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemU6Ci0lICAgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjMgLjQ1Ci0lICAgQGl0ZW0gLi4uCi0lCi0lICAgTnVtYmVycyBmb2xsb3dpbmcgQGNvbHVtbmZyYWN0aW9ucyBhcmUgdGhlIHBlcmNlbnQgb2YgdGhlIHRvdGFsCi0lICAgY3VycmVudCBoc2l6ZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbHVtbi4gWW91IG1heSB1c2UgYXMgbWFueQotJSAgIGNvbHVtbnMgYXMgZGVzaXJlZC4KLQotCi0lIE9yIHVzZSBhIHRlbXBsYXRlOgotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gLi4uCi0lICAgdXNpbmcgdGhlIHdpZGVzdCB0ZXJtIGRlc2lyZWQgaW4gZWFjaCBjb2x1bW4uCi0lCi0lIEZvciB0aG9zZSB3aG8gd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBsaW5lJ3Mgd29ydGggb2Ygd29yZHMgaW4KLSUgdGhlIHByZWFtYmxlLCBicmVhayB0aGUgbGluZSB3aXRoaW4gb25lIGFyZ3VtZW50IGFuZCBpdAotJSB3aWxsIHBhcnNlIGNvcnJlY3RseSwgaS5lLiwKLSUKLSUgICAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMKLSUgICAgICB0ZW1wbGF0ZX0KLSUgTm90OgotJSAgICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9Ci0lICAgICAge0NvbHVtbiAzIHRlbXBsYXRlfQotCi0lIEVhY2ggbmV3IHRhYmxlIGxpbmUgc3RhcnRzIHdpdGggQGl0ZW0sIGVhY2ggc3Vic2VxdWVudCBuZXcgY29sdW1uCi0lIHN0YXJ0cyB3aXRoIEB0YWIuIEVtcHR5IGNvbHVtbnMgbWF5IGJlIHByb2R1Y2VkIGJ5IHN1cHBseWluZyBAdGFiJ3MKLSUgd2l0aCBub3RoaW5nIGJldHdlZW4gdGhlbSBmb3IgYXMgbWFueSB0aW1lcyBhcyBlbXB0eSBjb2x1bW5zIGFyZSBuZWVkZWQsCi0lIGllLCBAdGFiQHRhYkB0YWIgd2lsbCBwcm9kdWNlIHR3byBlbXB0eSBjb2x1bW5zLgotCi0lIEBpdGVtLCBAdGFiLCBAbXVsdGl0YWJsZSBvciBAZW5kIG11bHRpdGFibGUgZG8gbm90IG5lZWQgdG8gYmUgb24gdGhlaXIKLSUgb3duIGxpbmVzLCBidXQgaXQgd2lsbCBub3QgaHVydCBpZiB0aGV5IGFyZS4KLQotJSBTYW1wbGUgbXVsdGl0YWJsZToKLQotJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZiBAdGFiIHRoaXJkIGNvbAotJSAgIEBpdGVtCi0lICAgZmlyc3QgY29sIHN0dWZmCi0lICAgQHRhYgotJSAgIHNlY29uZCBjb2wgc3R1ZmYKLSUgICBAdGFiCi0lICAgdGhpcmQgY29sCi0lICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZgotJSAgIEB0YWIgTWFueSBwYXJhZ3JhcGhzIG9mIHRleHQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbHVtbi4KLSUKLSUgICAgICAgICBUaGV5IHdpbGwgd3JhcCBhdCB0aGUgd2lkdGggZGV0ZXJtaW5lZCBieSB0aGUgdGVtcGxhdGUuCi0lICAgQGl0ZW1AdGFiQHRhYiBUaGlzIHdpbGwgYmUgaW4gdGhpcmQgY29sdW1uLgotJSAgIEBlbmQgbXVsdGl0YWJsZQotCi0lIERlZmF1bHQgZGltZW5zaW9ucyBtYXkgYmUgcmVzZXQgYnkgdXNlci4KLSUgQG11bHRpdGFibGVwYXJza2lwIGlzIHZlcnRpY2FsIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVwYXJpbmRlbnQgaXMgcGFyYWdyYXBoIGluZGVudCBpbiB0YWJsZS4KLSUgQG11bHRpdGFibGVjb2xtYXJnaW4gaXMgaG9yaXpvbnRhbCBzcGFjZSB0byBiZSBsZWZ0IGJldHdlZW4gY29sdW1ucy4KLSUgQG11bHRpdGFibGVsaW5lc3BhY2UgaXMgc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0YWJsZSBpdGVtcywgYmFzZWxpbmUKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiYXNlbGluZS4KLSUgICAwcHQgbWVhbnMgaXQgZGVwZW5kcyBvbiBjdXJyZW50IG5vcm1hbCBsaW5lIHNwYWNpbmcuCi0lCi1cbmV3c2tpcFxtdWx0aXRhYmxlcGFyc2tpcAotXG5ld3NraXBcbXVsdGl0YWJsZXBhcmluZGVudAotXG5ld2RpbWVuXG11bHRpdGFibGVjb2xzcGFjZQotXG5ld3NraXBcbXVsdGl0YWJsZWxpbmVzcGFjZQotXG11bHRpdGFibGVwYXJza2lwPTBwdAotXG11bHRpdGFibGVwYXJpbmRlbnQ9NnB0Ci1cbXVsdGl0YWJsZWNvbHNwYWNlPTEycHQKLVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAotCi0lIE1hY3JvcyB1c2VkIHRvIHNldCB1cCBoYWxpZ24gcHJlYW1ibGU6Ci0lCi1cbGV0XGVuZHNldHVwdGFibGVccmVsYXgKLVxkZWZceGVuZHNldHVwdGFibGV7XGVuZHNldHVwdGFibGV9Ci1cbGV0XGNvbHVtbmZyYWN0aW9uc1xyZWxheAotXGRlZlx4Y29sdW1uZnJhY3Rpb25ze1xjb2x1bW5mcmFjdGlvbnN9Ci1cbmV3aWZcaWZzZXRwZXJjZW50Ci0KLSUgIzEgaXMgdGhlIHBhcnQgb2YgdGhlIEBjb2x1bW5mcmFjdGlvbiBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQsIHdoaWNoCi0lIGlzIHByZXN1bWFibHkgZWl0aGVyIDAgb3IgdGhlIGVtcHR5IHN0cmluZyAoYnV0IHdlIGRvbid0IGNoZWNrLCB3ZQotJSBqdXN0IHRocm93IGl0IGF3YXkpLiAgIzIgaXMgdGhlIGRlY2ltYWwgcGFydCwgd2hpY2ggd2UgdXNlIGFzIHRoZQotJSBwZXJjZW50IG9mIFxoc2l6ZSBmb3IgdGhpcyBjb2x1bW4uCi1cZGVmXHBpY2t1cHdob2xlZnJhY3Rpb24jMS4jMiB7JQotICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7LiMyXGhzaXplfSUKLSAgXHNldHVwdGFibGUKLX0KLQotXG5ld2NvdW50XGNvbGNvdW50Ci1cZGVmXHNldHVwdGFibGUjMXslCi0gIFxkZWZcZmlyc3Rhcmd7IzF9JQotICBcaWZ4XGZpcnN0YXJnXHhlbmRzZXR1cHRhYmxlCi0gICAgXGxldFxnbyA9IFxyZWxheAotICBcZWxzZQotICAgIFxpZnhcZmlyc3RhcmdceGNvbHVtbmZyYWN0aW9ucwotICAgICAgXGdsb2JhbFxzZXRwZXJjZW50dHJ1ZQotICAgIFxlbHNlCi0gICAgICBcaWZzZXRwZXJjZW50Ci0gICAgICAgICBcbGV0XGdvXHBpY2t1cHdob2xlZnJhY3Rpb24KLSAgICAgIFxlbHNlCi0gICAgICAgICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQotICAgICAgICAgXHNldGJveDA9XGhib3h7IzFcdW5za2lwIH0lIEFkZCBhIG5vcm1hbCB3b3JkIHNwYWNlIGFzIGEgc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwaWNhbGx5IHRoYXQgaXMgYWx3YXlzIGluIHRoZSBpbnB1dCwgYW55d2F5LgotICAgICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1le1x0aGVcd2QwfSUKLSAgICAgIFxmaQotICAgIFxmaQotICAgIFxpZnhcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbgotICAgICAgJSBQdXQgdGhlIGFyZ3VtZW50IGJhY2sgZm9yIHRoZSBccGlja3Vwd2hvbGVmcmFjdGlvbiBjYWxsLCBzbwotICAgICAgJSB3ZSdsbCBhbHdheXMgaGF2ZSBhIHBlcmlvZCB0aGVyZSB0byBiZSBwYXJzZWQuCi0gICAgICBcZGVmXGdve1xwaWNrdXB3aG9sZWZyYWN0aW9uIzF9JQotICAgIFxlbHNlCi0gICAgICBcbGV0XGdvID0gXHNldHVwdGFibGUKLSAgICBcZmklCi0gIFxmaQotICBcZ28KLX0KLQotJSBUaGlzIHVzZWQgdG8gaGF2ZSBcaHNraXAxc3AuICBCdXQgdGhlbiB0aGUgc3BhY2UgaW4gYSB0ZW1wbGF0ZSBsaW5lIGlzCi0lIG5vdCBlbm91Z2guICBUaGF0IGlzIGJhZC4gIFNvIGxldCdzIGdvIGJhY2sgdG8ganVzdCAmIHVudGlsIHdlCi0lIGVuY291bnRlciB0aGUgcHJvYmxlbSBpdCB3YXMgaW50ZW5kZWQgdG8gc29sdmUgYWdhaW4uCi0lIC0ta2FybCwgbmF0aGFuQGFjbS5vcmcsIDIwYXByOTkuCi1cZGVmXHRhYnsmfQotCi0lIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgZGVmaW5pdGlvbnM6Ci0lCi1cZGVmXG11bHRpdGFibGV7XHBhcnNlYXJnXGRvdGFibGV9Ci1cZGVmXGRvdGFibGUjMXtcYmdyb3VwCi0gIFx2c2tpcFxwYXJza2lwCi0gIFxsZXRcaXRlbVxjcmNyCi0gIFx0b2xlcmFuY2U9OTUwMAotICBcaGJhZG5lc3M9OTUwMAotICBcc2V0bXVsdGl0YWJsZXNwYWNpbmcKLSAgXHBhcnNraXA9XG11bHRpdGFibGVwYXJza2lwCi0gIFxwYXJpbmRlbnQ9XG11bHRpdGFibGVwYXJpbmRlbnQKLSAgXG92ZXJmdWxscnVsZT0wcHQKLSAgXGdsb2JhbFxjb2xjb3VudD0wCi0gIFxkZWZcRW11bHRpdGFibGV7XGdsb2JhbFxzZXRwZXJjZW50ZmFsc2VcY3JcZWdyb3VwXGVncm91cH0lCi0gICUKLSAgJSBUbyBwYXJzZSBldmVyeXRoaW5nIGJldHdlZW4gQG11bHRpdGFibGUgYW5kIEBpdGVtOgotICBcc2V0dXB0YWJsZSMxIFxlbmRzZXR1cHRhYmxlCi0gICUKLSAgJSBcZXZlcnljciB3aWxsIHJlc2V0IGNvbHVtbiBjb3VudGVyLCBcY29sY291bnQsIGF0IHRoZSBlbmQgb2YKLSAgJSBlYWNoIGxpbmUuIEV2ZXJ5IGNvbHVtbiBlbnRyeSB3aWxsIGNhdXNlIFxjb2xjb3VudCB0byBhZHZhbmNlIGJ5IG9uZS4KLSAgJSBUaGUgdGFibGUgcHJlYW1ibGUKLSAgJSBsb29rcyBhdCB0aGUgY3VycmVudCBcY29sY291bnQgdG8gZmluZCB0aGUgY29ycmVjdCBjb2x1bW4gd2lkdGguCi0gIFxldmVyeWNye1xub2FsaWdueyUKLSAgJQotICAlIFxmaWxicmVhayUlIGtlZXBzIHVuZGVyZnVsbCBib3ggbWVzc2FnZXMgb2ZmIHdoZW4gdGFibGUgYnJlYWtzIG92ZXIgcGFnZXMuCi0gICUgTWF5YmUgc28sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcmVhbGx5IHdlaXJkIHBhZ2UgYnJlYWtzIHdoZW4gdGhlIHRhYmxlCi0gICUgYnJlYWtzIG92ZXIgcGFnZXMuIFdvdWxkbid0IFx2ZmlsIGJlIGJldHRlcj8gIFdhaXQgdW50aWwgdGhlIHByb2JsZW0KLSAgJSBtYW5pZmVzdHMgaXRzZWxmLCBzbyBpdCBjYW4gYmUgZml4ZWQgZm9yIHJlYWwgLS1rYXJsLgotICAgIFxnbG9iYWxcY29sY291bnQ9MFxyZWxheH19JQotICAlCi0gICUgVGhpcyBwcmVhbWJsZSBzZXRzIHVwIGEgZ2VuZXJpYyBjb2x1bW4gZGVmaW5pdGlvbiwgd2hpY2ggd2lsbAotICAlIGJlIHVzZWQgYXMgbWFueSB0aW1lcyBhcyB1c2VyIGNhbGxzIGZvciBjb2x1bW5zLgotICAlIFx2dG9wIHdpbGwgc2V0IGEgc2luZ2xlIGxpbmUgYW5kIHdpbGwgYWxzbyBsZXQgdGV4dCB3cmFwIGFuZAotICAlIGNvbnRpbnVlIGZvciBtYW55IHBhcmFncmFwaHMgaWYgZGVzaXJlZC4KLSAgXGhhbGlnblxiZ3JvdXAmXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDFccmVsYXgKLSAgICBcbXVsdGlzdHJ1dFx2dG9we1xoc2l6ZT1cZXhwYW5kYWZ0ZXJcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1lCi0gICUKLSAgJSBJbiBvcmRlciB0byBrZWVwIGVudHJpZXMgZnJvbSBidW1waW5nIGludG8gZWFjaCBvdGhlcgotICAlIHdlIHdpbGwgYWRkIGEgXGxlZnRza2lwIG9mIFxtdWx0aXRhYmxlY29sc3BhY2UgdG8gYWxsIGNvbHVtbnMgYWZ0ZXIKLSAgJSB0aGUgZmlyc3Qgb25lLgotICAlCi0gICUgSWYgYSB0ZW1wbGF0ZSBoYXMgYmVlbiB1c2VkLCB3ZSB3aWxsIGFkZCBcbXVsdGl0YWJsZWNvbHNwYWNlCi0gICUgdG8gdGhlIHdpZHRoIG9mIGVhY2ggdGVtcGxhdGUgZW50cnkuCi0gICUKLSAgJSBJZiB0aGUgdXNlciBoYXMgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplIHdlIHdpbGwKLSAgJSB1c2UgdGhhdCBkaW1lbnNpb24gYXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgXGxlZnRza2lwCi0gICUgd2lsbCBrZWVwIGVudHJpZXMgZnJvbSBidW1waW5nIGludG8gZWFjaCBvdGhlci4gIFRhYmxlIHdpbGwgc3RhcnQgYXQKLSAgJSBsZWZ0IG1hcmdpbiBhbmQgZmluYWwgY29sdW1uIHdpbGwganVzdGlmeSBhdCByaWdodCBtYXJnaW4uCi0gICUKLSAgJSBNYWtlIHN1cmUgd2UgZG9uJ3QgaW5oZXJpdCBccmlnaHRza2lwIGZyb20gdGhlIG91dGVyIGVudmlyb25tZW50LgotICBccmlnaHRza2lwPTBwdAotICBcaWZudW1cY29sY291bnQ9MQotICAgICUgVGhlIGZpcnN0IGNvbHVtbiB3aWxsIGJlIGluZGVudGVkIHdpdGggdGhlIHN1cnJvdW5kaW5nIHRleHQuCi0gICAgXGFkdmFuY2VcaHNpemUgYnlcbGVmdHNraXAKLSAgXGVsc2UKLSAgICBcaWZzZXRwZXJjZW50IFxlbHNlCi0gICAgICAlIElmIHVzZXIgaGFzIG5vdCBzZXQgcHJlYW1ibGUgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemUKLSAgICAgICUgd2Ugd2lsbCBhZHZhbmNlIFxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlLgotICAgICAgXGFkdmFuY2VcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZQotICAgIFxmaQotICAgJSBJbiBlaXRoZXIgY2FzZSB3ZSB3aWxsIG1ha2UgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2U6Ci0gIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlCi0gIFxmaQotICAlIElnbm9yaW5nIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBhdm9pZHMgYW4gb2NjYXNpb25hbCBzcHVyaW91cwotICAlIGJsYW5rIGxpbmUsIHdoZW4gVGVYIGRlY2lkZXMgdG8gYnJlYWsgdGhlIGxpbmUgYXQgdGhlIHNwYWNlIGJlZm9yZSB0aGUKLSAgJSBib3ggZnJvbSB0aGUgbXVsdGlzdHJ1dCwgc28gdGhlIHN0cnV0IGVuZHMgdXAgb24gYSBsaW5lIGJ5IGl0c2VsZi4KLSAgJSBGb3IgZXhhbXBsZToKLSAgJSBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4xMSAuODkKLSAgJSBAaXRlbSBAY29kZXsjfQotICAlIEB0YWIgTGVnYWwgaG9saWRheSB3aGljaCBpcyB2YWxpZCBpbiBtYWpvciBwYXJ0cyBvZiB0aGUgd2hvbGUgY291bnRyeS4KLSAgJSBJcyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHdpdGggaGlnaGxpZ2h0aW5nIHNlcXVlbmNlcyByZXNwZWN0aXZlbHkgbWFya2luZwotICAlIGNoYXJhY3RlcnMuCi0gIFxub2luZGVudFxpZ25vcmVzcGFjZXMjI1x1bnNraXBcbXVsdGlzdHJ1dH1cY3IKLX0KLQotXGRlZlxzZXRtdWx0aXRhYmxlc3BhY2luZ3slIHRlc3QgdG8gc2VlIGlmIHVzZXIgaGFzIHNldCBcbXVsdGl0YWJsZWxpbmVzcGFjZS4KLSUgSWYgc28sIGRvIG5vdGhpbmcuIElmIG5vdCwgZ2l2ZSBpdCBhbiBhcHByb3ByaWF0ZSBkaW1lbnNpb24gYmFzZWQgb24KLSUgY3VycmVudCBiYXNlbGluZXNraXAuCi1caWZkaW1cbXVsdGl0YWJsZWxpbmVzcGFjZT0wcHQKLVxzZXRib3gwPVx2Ym94e1h9XGdsb2JhbFxtdWx0aXRhYmxlbGluZXNwYWNlPVx0aGVcYmFzZWxpbmVza2lwCi1cZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZWxpbmVzcGFjZSBieS1caHQwCi0lJSBzdHJ1dCB0byBwdXQgaW4gdGFibGUgaW4gY2FzZSBzb21lIGVudHJ5IGRvZXNuJ3QgaGF2ZSBkZXNjZW5kZXJzLAotJSUgdG8ga2VlcCBsaW5lcyBlcXVhbGx5IHNwYWNlZAotXGxldFxtdWx0aXN0cnV0ID0gXHN0cnV0Ci1cZWxzZQotJSUgRklYTUU6IHdoYXQgaXMgXGJveDAgc3VwcG9zZWQgdG8gYmU/Ci1cZ2RlZlxtdWx0aXN0cnV0e1x2cnVsZSBoZWlnaHRcbXVsdGl0YWJsZWxpbmVzcGFjZSBkZXB0aFxkcDAKLXdpZHRoMHB0XHJlbGF4fSBcZmkKLSUlIFRlc3QgdG8gc2VlIGlmIHBhcnNraXAgaXMgbGFyZ2VyIHRoYW4gc3BhY2UgYmV0d2VlbiBsaW5lcyBvZgotJSUgdGFibGUuIElmIG5vdCwgZG8gbm90aGluZy4KLSUlICAgICAgICBJZiBzbywgc2V0IHRvIHNhbWUgZGltZW5zaW9uIGFzIG11bHRpdGFibGVsaW5lc3BhY2UuCi1caWZkaW1cbXVsdGl0YWJsZXBhcnNraXA+XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgotXGZpJQotXGlmZGltXG11bHRpdGFibGVwYXJza2lwPTBwdAotXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCi1cZml9Ci0KLQotXG1lc3NhZ2V7Y29uZGl0aW9uYWxzLH0KLSUgUHJldmVudCBlcnJvcnMgZm9yIHNlY3Rpb24gY29tbWFuZHMuCi0lIFVzZWQgaW4gQGlnbm9yZSBhbmQgaW4gZmFpbGluZyBjb25kaXRpb25hbHMuCi1cZGVmXGlnbm9yZXNlY3Rpb25zeyUKLSAgXGxldFxjaGFwdGVyPVxyZWxheAotICBcbGV0XHVubnVtYmVyZWQ9XHJlbGF4Ci0gIFxsZXRcdG9wPVxyZWxheAotICBcbGV0XHVubnVtYmVyZWRzZWM9XHJlbGF4Ci0gIFxsZXRcdW5udW1iZXJlZHNlY3Rpb249XHJlbGF4Ci0gIFxsZXRcdW5udW1iZXJlZHN1YnNlYz1ccmVsYXgKLSAgXGxldFx1bm51bWJlcmVkc3Vic2VjdGlvbj1ccmVsYXgKLSAgXGxldFx1bm51bWJlcmVkc3Vic3Vic2VjPVxyZWxheAotICBcbGV0XHVubnVtYmVyZWRzdWJzdWJzZWN0aW9uPVxyZWxheAotICBcbGV0XHNlY3Rpb249XHJlbGF4Ci0gIFxsZXRcc3Vic2VjPVxyZWxheAotICBcbGV0XHN1YnN1YnNlYz1ccmVsYXgKLSAgXGxldFxzdWJzZWN0aW9uPVxyZWxheAotICBcbGV0XHN1YnN1YnNlY3Rpb249XHJlbGF4Ci0gIFxsZXRcYXBwZW5kaXg9XHJlbGF4Ci0gIFxsZXRcYXBwZW5kaXhzZWM9XHJlbGF4Ci0gIFxsZXRcYXBwZW5kaXhzZWN0aW9uPVxyZWxheAotICBcbGV0XGFwcGVuZGl4c3Vic2VjPVxyZWxheAotICBcbGV0XGFwcGVuZGl4c3Vic2VjdGlvbj1ccmVsYXgKLSAgXGxldFxhcHBlbmRpeHN1YnN1YnNlYz1ccmVsYXgKLSAgXGxldFxhcHBlbmRpeHN1YnN1YnNlY3Rpb249XHJlbGF4Ci0gIFxsZXRcY29udGVudHM9XHJlbGF4Ci0gIFxsZXRcc21hbGxib29rPVxyZWxheAotICBcbGV0XHRpdGxlcGFnZT1ccmVsYXgKLX0KLQotJSBVc2VkIGluIG5lc3RlZCBjb25kaXRpb25hbHMsIHdoZXJlIHdlIGhhdmUgdG8gcGFyc2UgdGhlIFRleGluZm8gc291cmNlCi0lIGFuZCBzbyB3YW50IHRvIHR1cm4gb2ZmIG1vc3QgY29tbWFuZHMsIGluIGNhc2UgdGhleSBhcmUgdXNlZAotJSBpbmNvcnJlY3RseS4KLSUKLVxkZWZcaWdub3JlbW9yZWNvbW1hbmRzeyUKLSAgXGxldFxkZWZjb2RlaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZjdiA9IFxyZWxheAotICBcbGV0XGRlZmZuID0gXHJlbGF4Ci0gIFxsZXRcZGVmZm54ID0gXHJlbGF4Ci0gIFxsZXRcZGVmaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZpdmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWFjID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWV0aG9kID0gXHJlbGF4Ci0gIFxsZXRcZGVmb3AgPSBccmVsYXgKLSAgXGxldFxkZWZvcHQgPSBccmVsYXgKLSAgXGxldFxkZWZzcGVjID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHAgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZm4gPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZnVuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZWl2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlb3AgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBldmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZXZyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdW4gPSBccmVsYXgKLSAgXGxldFxkZWZ2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZ2ciA9IFxyZWxheAotICBcbGV0XHJlZiA9IFxyZWxheAotICBcbGV0XHhyZWYgPSBccmVsYXgKLSAgXGxldFxwcmludGluZGV4ID0gXHJlbGF4Ci0gIFxsZXRccHhyZWYgPSBccmVsYXgKLSAgXGxldFxzZXR0aXRsZSA9IFxyZWxheAotICBcbGV0XHNldGNoYXB0ZXJuZXdwYWdlID0gXHJlbGF4Ci0gIFxsZXRcc2V0Y2hhcHRlcnN0eWxlID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnloZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmhlYWRpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRoZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlcnlmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcZXZlbmZvb3RpbmcgPSBccmVsYXgKLSAgXGxldFxvZGRmb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcaGVhZGluZ3MgPSBccmVsYXgKLSAgXGxldFxpbmNsdWRlID0gXHJlbGF4Ci0gIFxsZXRcbG93ZXJzZWN0aW9ucyA9IFxyZWxheAotICBcbGV0XGRvd24gPSBccmVsYXgKLSAgXGxldFxyYWlzZXNlY3Rpb25zID0gXHJlbGF4Ci0gIFxsZXRcdXAgPSBccmVsYXgKLSAgXGxldFxzZXQgPSBccmVsYXgKLSAgXGxldFxjbGVhciA9IFxyZWxheAotICBcbGV0XGl0ZW0gPSBccmVsYXgKLX0KLQotJSBJZ25vcmUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUuCi0lCi1cZGVmXGlnbm9yZXtcZG9pZ25vcmV7aWdub3JlfX0KLQotJSBJZ25vcmUgQGlmaW5mbywgQGlmaHRtbCwgQGlmbm90dGV4LCBAaHRtbCwgQG1lbnUsIGFuZCBAZGlyZW50cnkgdGV4dC4KLSUKLVxkZWZcaWZpbmZve1xkb2lnbm9yZXtpZmluZm99fQotXGRlZlxpZmh0bWx7XGRvaWdub3Jle2lmaHRtbH19Ci1cZGVmXGlmbm90dGV4e1xkb2lnbm9yZXtpZm5vdHRleH19Ci1cZGVmXGh0bWx7XGRvaWdub3Jle2h0bWx9fQotXGRlZlxtZW51e1xkb2lnbm9yZXttZW51fX0KLVxkZWZcZGlyZW50cnl7XGRvaWdub3Jle2RpcmVudHJ5fX0KLQotJSBAZGlyY2F0ZWdvcnkgQ0FURUdPUlkgIC0tIHNwZWNpZnkgYSBjYXRlZ29yeSBvZiB0aGUgZGlyIGZpbGUKLSUgd2hpY2ggdGhpcyBmaWxlIHNob3VsZCBiZWxvbmcgdG8uICBJZ25vcmUgdGhpcyBpbiBUZVguCi1cbGV0XGRpcmNhdGVnb3J5ID0gXGNvbW1lbnQKLQotJSBJZ25vcmUgdGV4dCB1bnRpbCBhIGxpbmUgYEBlbmQgIzEnLgotJQotXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCi0gICUgRG9uJ3QgY29tcGxhaW4gYWJvdXQgY29udHJvbCBzZXF1ZW5jZXMgd2UgaGF2ZSBkZWNsYXJlZCBcb3V0ZXIuCi0gIFxpZ25vcmVzZWN0aW9ucwotICAlCi0gICUgRGVmaW5lIGEgY29tbWFuZCB0byBzd2FsbG93IHRleHQgdW50aWwgd2UgcmVhY2ggYEBlbmQgIzEnLgotICAlIFRoaXMgQCBpcyBhIGNhdGNvZGUgMTIgdG9rZW4gKHRoYXQgaXMgdGhlIG5vcm1hbCBjYXRjb2RlIG9mIEAgaW4KLSAgJSB0aGlzIHRleGluZm8udGV4IGZpbGUpLiAgV2UgY2hhbmdlIHRoZSBjYXRjb2RlIG9mIEAgYmVsb3cgdG8gbWF0Y2guCi0gIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFAZW5kICMxe1xlbmRkb2lnbm9yZX0lCi0gICUKLSAgJSBNYWtlIHN1cmUgdGhhdCBzcGFjZXMgdHVybiBpbnRvIHRva2VucyB0aGF0IG1hdGNoIHdoYXQgXGRvaWdub3JldGV4dCB3YW50cy4KLSAgXGNhdGNvZGUzMiA9IDEwCi0gICUKLSAgJSBJZ25vcmUgYnJhY2VzLCB0b28sIHNvIG1pc21hdGNoZWQgYnJhY2VzIGRvbid0IGNhdXNlIHRyb3VibGUuCi0gIFxjYXRjb2RlYFx7ID0gOQotICBcY2F0Y29kZWBcfSA9IDkKLSAgJQotICAlIFdlIG11c3Qgbm90IGhhdmUgQGMgaW50ZXJwcmV0ZWQgYXMgYSBjb250cm9sIHNlcXVlbmNlLgotICBcY2F0Y29kZWBcQCA9IDEyCi0gICUKLSAgJSBNYWtlIHRoZSBsZXR0ZXIgYyBhIGNvbW1lbnQgY2hhcmFjdGVyIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKLSAgJSB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgd2F5LCB0aGUgZG9jdW1lbnQgY2FuIGhhdmUgKGZvciBleGFtcGxlKQotICAlICAgQGMgQGVuZCBpZmluZm8KLSAgJSBhbmQgdGhlIEBlbmQgaWZpbmZvIHdpbGwgYmUgcHJvcGVybHkgaWdub3JlZC4KLSAgJSAoV2UndmUganVzdCBjaGFuZ2VkIEAgdG8gY2F0Y29kZSAxMi4pCi0gIFxjYXRjb2RlYFxjID0gMTQKLSAgJQotICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KLSAgXGRvaWdub3JldGV4dAotfQotCi0lIFdoYXQgd2UgZG8gdG8gZmluaXNoIG9mZiBpZ25vcmVkIHRleHQuCi0lCi1cZGVmXGVuZGRvaWdub3Jle1xlbmRncm91cFxpZ25vcmVzcGFjZXN9JQotCi1cbmV3aWZcaWZ3YXJuZWRvYnNcd2FybmVkb2JzZmFsc2UKLVxkZWZcb2JzdGV4d2FybnslCi0gIFxpZndhcm5lZG9ic1xyZWxheFxlbHNlCi0gICUgV2UgbmVlZCB0byB3YXJuIGZvbGtzIHRoYXQgdGhleSBtYXkgaGF2ZSB0cm91YmxlIHdpdGggVGVYIDMuMC4KLSAgJSBUaGlzIHVzZXMgXGltbWVkaWF0ZVx3cml0ZTE2IHJhdGhlciB0aGFuIFxtZXNzYWdlIHRvIGdldCBuZXdsaW5lcy4KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntXQVJOSU5HOiBmb3IgdXNlcnMgb2YgVW5peCBUZVggMy4wIX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7VGhpcyBtYW51YWwgdHJpcHMgYSBidWcgaW4gVGVYIHZlcnNpb24gMy4wICh0ZXggaGFuZ3MpLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIGFub3RoZXIgdmVyc2lvbiBvZiBUZVgsIHJlbGF4Ln0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIFVuaXggVGVYIDMuMCwga2lsbCB0aGlzIFRlWCBwcm9jZXNzLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBUaGVuIHVwZ3JhZGUgeW91ciBUZVggaW5zdGFsbGF0aW9uIGlmIHlvdSBjYW4ufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIChTZWUgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9UZVguUkVBRE1FLil9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e0lmIHlvdSBhcmUgc3R1Y2sgd2l0aCB2ZXJzaW9uIDMuMCwgcnVuIHRoZX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBzY3JpcHQgYGB0ZXgzcGF0Y2gnJyBmcm9tIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICB0byB1c2UgYSB3b3JrYXJvdW5kLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7fQotICAgIFxnbG9iYWxcd2FybmVkb2JzdHJ1ZQotICAgIFxmaQotfQotCi0lICoqSW4gVGVYIDMuMCwgc2V0dGluZyB0ZXh0IGluIFxudWxsZm9udCBoYW5ncyB0ZXguICBGb3IgYQotJSB3b3JrYXJvdW5kICh3aGljaCByZXF1aXJlcyB0aGUgZmlsZSBgYGR1bW15LnRmbScnIHRvIGJlIGluc3RhbGxlZCksCi0lIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmU6Ci0lJSUlJVxmb250XG51bGxmb250PWR1bW15XGxldFxvYnN0ZXh3YXJuPVxyZWxheAotCi0lIElnbm9yZSB0ZXh0LCBleGNlcHQgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIGNvbmRpdGlvbmFsIGNvbW1hbmRzIGZvcgotJSBwdXJwb3NlcyBvZiBuZXN0aW5nLCB1cCB0byBhbiBgQGVuZCAjMScgY29tbWFuZC4KLSUKLVxkZWZcbmVzdGVkaWdub3JlIzF7JQotICBcb2JzdGV4d2FybgotICAlIFdlIG11c3QgYWN0dWFsbHkgZXhwYW5kIHRoZSBpZ25vcmVkIHRleHQgdG8gbG9vayBmb3IgdGhlIEBlbmQKLSAgJSBjb21tYW5kLCBzbyB0aGF0IG5lc3RlZCBpZ25vcmUgY29uc3RydWN0cyB3b3JrLiAgVGh1cywgd2UgcHV0IHRoZQotICAlIHRleHQgaW50byBhIFx2Ym94IGFuZCB0aGVuIGRvIG5vdGhpbmcgd2l0aCB0aGUgcmVzdWx0LiAgVG8gbWluaW1pemUKLSAgJSB0aGUgY2hhbmdlIG9mIG1lbW9yeSBvdmVyZmxvdywgd2UgZm9sbG93IHRoZSBhcHByb2FjaCBvdXRsaW5lZCBvbgotICAlIHBhZ2UgNDAxIG9mIHRoZSBUZVhib29rOiBtYWtlIHRoZSBjdXJyZW50IGZvbnQgYmUgYSBkdW1teSBmb250LgotICAlCi0gIFxzZXRib3gwID0gXHZib3hcYmdyb3VwCi0gICAgJSBEb24ndCBjb21wbGFpbiBhYm91dCBjb250cm9sIHNlcXVlbmNlcyB3ZSBoYXZlIGRlY2xhcmVkIFxvdXRlci4KLSAgICBcaWdub3Jlc2VjdGlvbnMKLSAgICAlCi0gICAgJSBEZWZpbmUgYEBlbmQgIzEnIHRvIGVuZCB0aGUgYm94LCB3aGljaCB3aWxsIGluIHR1cm4gdW5kZWZpbmUgdGhlCi0gICAgJSBAZW5kIGNvbW1hbmQgYWdhaW4uCi0gICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgRSMxXGVuZGNzbmFtZXtcZWdyb3VwXGlnbm9yZXNwYWNlc30lCi0gICAgJQotICAgICUgV2UgYXJlIGdvaW5nIHRvIGJlIHBhcnNpbmcgVGV4aW5mbyBjb21tYW5kcy4gIE1vc3QgY2F1c2Ugbm8KLSAgICAlIHRyb3VibGUgd2hlbiB0aGV5IGFyZSB1c2VkIGluY29ycmVjdGx5LCBidXQgc29tZSBjb21tYW5kcyBkbwotICAgICUgY29tcGxpY2F0ZWQgYXJndW1lbnQgcGFyc2luZyBvciBvdGhlcndpc2UgZ2V0IGNvbmZ1c2VkLCBzbyB3ZQotICAgICUgdW5kZWZpbmUgdGhlbS4KLSAgICAlCi0gICAgJSBXZSBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBzdHJheSBALXNpZ25zLCB1bmZvcnR1bmF0ZWx5OwotICAgICUgdGhleSdsbCBwcm9kdWNlIGB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZScgZXJyb3JzLgotICAgIFxpZ25vcmVtb3JlY29tbWFuZHMKLSAgICAlCi0gICAgJSBTZXQgdGhlIGN1cnJlbnQgZm9udCB0byBiZSBcbnVsbGZvbnQsIGEgVGVYIHByaW1pdGl2ZSwgYW5kIGRlZmluZQotICAgICUgYWxsIHRoZSBmb250IGNvbW1hbmRzIHRvIGFsc28gdXNlIFxudWxsZm9udC4gIFdlIGRvbid0IHVzZQotICAgICUgZHVtbXkudGZtLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIFRlWGJvb2ssIGJlY2F1c2Ugbm90IGFsbCBzaXRlcwotICAgICUgbWlnaHQgaGF2ZSB0aGF0IGluc3RhbGxlZC4gIFRoZXJlZm9yZSwgbWF0aCBtb2RlIHdpbGwgc3RpbGwKLSAgICAlIHByb2R1Y2Ugb3V0cHV0LCBidXQgdGhhdCBzaG91bGQgYmUgYW4gZXh0cmVtZWx5IHNtYWxsIGFtb3VudCBvZgotICAgICUgc3R1ZmYgY29tcGFyZWQgdG8gdGhlIG1haW4gaW5wdXQuCi0gICAgJQotICAgIFxudWxsZm9udAotICAgIFxsZXRcdGVucm09XG51bGxmb250IFxsZXRcdGVuaXQ9XG51bGxmb250IFxsZXRcdGVuc2w9XG51bGxmb250Ci0gICAgXGxldFx0ZW5iZj1cbnVsbGZvbnQgXGxldFx0ZW50dD1cbnVsbGZvbnQgXGxldFxzbWFsbGNhcHM9XG51bGxmb250Ci0gICAgXGxldFx0ZW5zZj1cbnVsbGZvbnQKLSAgICAlIFNpbWlsYXJseSBmb3IgaW5kZXggZm9udHMgKG1vc3RseSBmb3IgdGhlaXIgdXNlIGluIHNtYWxsZXhhbXBsZSkuCi0gICAgXGxldFxzbWFsbHJtPVxudWxsZm9udCBcbGV0XHNtYWxsaXQ9XG51bGxmb250IFxsZXRcc21hbGxzbD1cbnVsbGZvbnQKLSAgICBcbGV0XHNtYWxsYmY9XG51bGxmb250IFxsZXRcc21hbGx0dD1cbnVsbGZvbnQgXGxldFxzbWFsbHNjPVxudWxsZm9udAotICAgIFxsZXRcc21hbGxzZj1cbnVsbGZvbnQKLSAgICAlCi0gICAgJSBEb24ndCBjb21wbGFpbiB3aGVuIGNoYXJhY3RlcnMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZm9udHMuCi0gICAgXHRyYWNpbmdsb3N0Y2hhcnMgPSAwCi0gICAgJQotICAgICUgRG9uJ3QgYm90aGVyIHRvIGRvIHNwYWNlIGZhY3RvciBjYWxjdWxhdGlvbnMuCi0gICAgXGZyZW5jaHNwYWNpbmcKLSAgICAlCi0gICAgJSBEb24ndCByZXBvcnQgdW5kZXJmdWxsIGhib3hlcy4KLSAgICBcaGJhZG5lc3MgPSAxMDAwMAotICAgICUKLSAgICAlIERvIG1pbmltYWwgbGluZS1icmVha2luZy4KLSAgICBccHJldG9sZXJhbmNlID0gMTAwMDAKLSAgICAlCi0gICAgJSBEbyBub3QgZXhlY3V0ZSBpbnN0cnVjdGlvbnMgaW4gQHRleAotICAgIFxkZWZcdGV4e1xkb2lnbm9yZXt0ZXh9fSUKLSAgICAlIERvIG5vdCBleGVjdXRlIG1hY3JvIGRlZmluaXRpb25zLgotICAgICUgYGMnIGlzIGEgY29tbWVudCBjaGFyYWN0ZXIsIHNvIHRoZSB3b3JkIGBtYWNybycgd2lsbCBnZXQgY3V0IG9mZi4KLSAgICBcZGVmXG1hY3Jve1xkb2lnbm9yZXttYX19JQotfQotCi0lIEBzZXQgVkFSIHNldHMgdGhlIHZhcmlhYmxlIFZBUiB0byBhbiBlbXB0eSB2YWx1ZS4KLSUgQHNldCBWQVIgUkVTVC1PRi1MSU5FIHNldHMgVkFSIHRvIHRoZSB2YWx1ZSBSRVNULU9GLUxJTkUuCi0lCi0lIFNpbmNlIHdlIHdhbnQgdG8gc2VwYXJhdGUgVkFSIGZyb20gUkVTVC1PRi1MSU5FICh3aGljaCBtaWdodCBiZQotJSBlbXB0eSksIHdlIGNhbid0IGp1c3QgdXNlIFxwYXJzZWFyZzsgd2UgaGF2ZSB0byBpbnNlcnQgYSBzcGFjZSBvZiBvdXIKLSUgb3duIHRvIGRlbGltaXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGFuZCB0aGVuIHRha2UgaXQgb3V0IGFnYWluIGlmIHdlCi0lIGRpZG4ndCBuZWVkIGl0LiAgTWFrZSBzdXJlIHRoZSBjYXRjb2RlIG9mIHNwYWNlIGlzIGNvcnJlY3QgdG8gYXZvaWQKLSUgbG9zaW5nIGluc2lkZSBAZXhhbXBsZSwgZm9yIGluc3RhbmNlLgotJQotXGRlZlxzZXR7XGJlZ2luZ3JvdXBcY2F0Y29kZWAgPTEwCi0gIFxjYXRjb2RlYFwtPTEyIFxjYXRjb2RlYFxfPTEyICUgQWxsb3cgLSBhbmQgXyBpbiBWQVIuCi0gIFxwYXJzZWFyZ1xzZXR4eHh9Ci1cZGVmXHNldHh4eCMxe1xzZXR5eXkjMSBcZW5kc2V0eXl5fQotXGRlZlxzZXR5eXkjMSAjMlxlbmRzZXR5eXl7JQotICBcZGVmXHRlbXB7IzJ9JQotICBcaWZ4XHRlbXBcZW1wdHkgXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZSA9IFxlbXB0eQotICBcZWxzZSBcc2V0enp6eyMxfSMyXGVuZHNldHp6eiAlIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2UgXHNldHh4eCBpbnNlcnRlZC4KLSAgXGZpCi0gIFxlbmRncm91cAotfQotJSBDYW4ndCB1c2UgXHhkZWYgdG8gcHJlLWV4cGFuZCAjMiBhbmQgc2F2ZSBzb21lIHRpbWUsIHNpbmNlIFx0ZW1wIG9yCi0lIFxuZXh0IG9yIG90aGVyIGNvbnRyb2wgc2VxdWVuY2VzIHRoYXQgd2UndmUgZGVmaW5lZCBtaWdodCBnZXQgdXMgaW50bwotJSBhbiBpbmZpbml0ZSBsb29wLiBDb25zaWRlciBgQHNldCBmb28gQGNpdGV7YmFyfScuCi1cZGVmXHNldHp6eiMxIzIgXGVuZHNldHp6entcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgU0VUIzFcZW5kY3NuYW1leyMyfX0KLQotJSBAY2xlYXIgVkFSIGNsZWFycyAoaS5lLiwgdW5zZXRzKSB0aGUgdmFyaWFibGUgVkFSLgotJQotXGRlZlxjbGVhcntccGFyc2VhcmdcY2xlYXJ4eHh9Ci1cZGVmXGNsZWFyeHh4IzF7XGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZT1ccmVsYXh9Ci0KLSUgQHZhbHVle2Zvb30gZ2V0cyB0aGUgdGV4dCBzYXZlZCBpbiB2YXJpYWJsZSBmb28uCi17Ci0gIFxjYXRjb2RlYFxfID0gXGFjdGl2ZQotICAlCi0gICUgV2UgbWlnaHQgZW5kIHVwIHdpdGggYWN0aXZlIF8gb3IgLSBjaGFyYWN0ZXJzIGluIHRoZSBhcmd1bWVudCBpZgotICAlIHdlJ3JlIGNhbGxlZCBmcm9tIEBjb2RlLCBhcyBAY29kZXtAdmFsdWV7Zm9vLWJhcl99fS4gIFNvIFxsZXQgYW55Ci0gICUgc3VjaCBhY3RpdmUgY2hhcmFjdGVycyB0byB0aGVpciBub3JtYWwgZXF1aXZhbGVudHMuCi0gIFxnZGVmXHZhbHVle1xiZWdpbmdyb3VwCi0gICAgXGNhdGNvZGVgXC09MTIgXGNhdGNvZGVgXF89MTIKLSAgICBcaW5kZXhicmVha3MgXGxldF9cbm9ybWFsdW5kZXJzY29yZQotICAgIFx2YWx1ZXh4eH0KLX0KLVxkZWZcdmFsdWV4eHgjMXtcZXhwYW5kYWJsZXZhbHVleyMxfVxlbmRncm91cH0KLQotJSBXZSBoYXZlIHRoaXMgc3Vicm91dGluZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgYXQgbGVhc3Qgc29tZSBAdmFsdWUncwotJSBwcm9wZXJseSBpbiBpbmRleGVzICh3ZSBcbGV0XHZhbHVlIHRvIHRoaXMgaW4gXGluZGV4ZHVtbWllcykuICBPbmVzCi0lIHdob3NlIG5hbWVzIGNvbnRhaW4gLSBvciBfIHN0aWxsIHdvbid0IHdvcmssIGJ1dCB3ZSBjYW4ndCBkbyBhbnl0aGluZwotJSBhYm91dCB0aGF0LiAgVGhlIGNvbW1hbmQgaGFzIHRvIGJlIGZ1bGx5IGV4cGFuZGFibGUsIHNpbmNlIHRoZSByZXN1bHQKLSUgd2luZHMgdXAgaW4gdGhlIGluZGV4IGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUKLSUgY29udGFpbnMgb3RoZXIgVGV4aW5mbyBjb21tYW5kcywgaXQncyBhbG1vc3QgY2VydGFpbiBpdCB3aWxsIGZhaWwKLSUgKGFsdGhvdWdoIHBlcmhhcHMgd2UgY291bGQgZml4IHRoYXQgd2l0aCBzdWZmaWNpZW50IHdvcmsgdG8gZG8gYQotJSBvbmUtbGV2ZWwgZXhwYW5zaW9uIG9uIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgY29tcGxldGUpLgotJQotXGRlZlxleHBhbmRhYmxldmFsdWUjMXslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAotICAgIHtbTm8gdmFsdWUgZm9yIGBgIzEnJ119JQotICBcZWxzZQotICAgIFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lCi0gIFxmaQotfQotCi0lIEBpZnNldCBWQVIgLi4uIEBlbmQgaWZzZXQgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIGJlZW4gZGVmaW5lZAotJSB3aXRoIEBzZXQuCi0lCi1cZGVmXGlmc2V0e1xwYXJzZWFyZ1xpZnNldHh4eH0KLVxkZWZcaWZzZXR4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZzZXRmYWlsCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGlmc2V0c3VjY2VlZAotICBcZmkKLX0KLVxkZWZcaWZzZXRzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZzZXR9fQotXGRlZlxpZnNldGZhaWx7XG5lc3RlZGlnbm9yZXtpZnNldH19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmc2V0fQotCi0lIEBpZmNsZWFyIFZBUiAuLi4gQGVuZCBpZmNsZWFyIHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBuZXZlciBiZWVuCi0lIGRlZmluZWQgd2l0aCBAc2V0LCBvciBoYXMgYmVlbiB1bmRlZmluZWQgd2l0aCBAY2xlYXIuCi0lCi1cZGVmXGlmY2xlYXJ7XHBhcnNlYXJnXGlmY2xlYXJ4eHh9Ci1cZGVmXGlmY2xlYXJ4eHggIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcnN1Y2NlZWQKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcaWZjbGVhcmZhaWwKLSAgXGZpCi19Ci1cZGVmXGlmY2xlYXJzdWNjZWVke1xjb25kaXRpb25hbHN1Y2NlZWR7aWZjbGVhcn19Ci1cZGVmXGlmY2xlYXJmYWlse1xuZXN0ZWRpZ25vcmV7aWZjbGVhcn19Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmY2xlYXJ9Ci0KLSUgQGlmdGV4LCBAaWZub3RodG1sLCBAaWZub3RpbmZvIGFsd2F5cyBzdWNjZWVkOyB3ZSByZWFkIHRoZSB0ZXh0Ci0lIGZvbGxvd2luZywgdGhyb3VnaCB0aGUgZmlyc3QgQGVuZCBpZnRleCAoZXRjLikuICBNYWtlIGBAZW5kIGlmdGV4JwotJSAoZXRjLikgdmFsaWQgb25seSBhZnRlciBhbiBAaWZ0ZXguCi0lCi1cZGVmXGlmdGV4e1xjb25kaXRpb25hbHN1Y2NlZWR7aWZ0ZXh9fQotXGRlZlxpZm5vdGh0bWx7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGh0bWx9fQotXGRlZlxpZm5vdGluZm97XGNvbmRpdGlvbmFsc3VjY2VlZHtpZm5vdGluZm99fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZnRleH0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZub3RodG1sfQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZm5vdGluZm99Ci0KLSUgV2UgY2FuJ3QganVzdCB3YW50IHRvIHN0YXJ0IGEgZ3JvdXAgYXQgQGlmdGV4IChmb3IgZXhhbXBsZSkgYW5kIGVuZCBpdAotJSBhdCBAZW5kIGlmdGV4LCBzaW5jZSB0aGVuIEBzZXQgY29tbWFuZHMgaW5zaWRlIHRoZSBjb25kaXRpb25hbCBoYXZlIG5vCi0lIGVmZmVjdCAodGhleSdkIGdldCByZXZlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCkuICBTbyB3ZSBtdXN0Ci0lIGRlZmluZSBcRWlmdGV4IHRvIHJlZGVmaW5lIGl0c2VsZiB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuICAoV2UgY2FuJ3QKLSUganVzdCBkZWZpbmUgaXQgdG8gZmFpbCBhZ2FpbiB3aXRoIGFuIGBgdW5tYXRjaGVkIGVuZCcnIGVycm9yLCBzaW5jZQotJSB0aGUgQGlmc2V0IG1pZ2h0IGJlIG5lc3RlZC4pCi0lCi1cZGVmXGNvbmRpdGlvbmFsc3VjY2VlZCMxeyUKLSAgXGVkZWZcdGVtcHslCi0gICAgJSBSZW1lbWJlciB0aGUgY3VycmVudCB2YWx1ZSBvZiBcRSMxLgotICAgIFxsZXRcbmVjZXtwcmV2RSMxfSA9IFxuZWNle0UjMX0lCi0gICAgJQotICAgICUgQXQgdGhlIGBAZW5kICMxJywgcmVkZWZpbmUgXEUjMSB0byBiZSBpdHMgcHJldmlvdXMgdmFsdWUuCi0gICAgXGRlZlxuZWNle0UjMX17XGxldFxuZWNle0UjMX0gPSBcbmVjZXtwcmV2RSMxfX0lCi0gIH0lCi0gIFx0ZW1wCi19Ci0KLSUgV2UgbmVlZCB0byBleHBhbmQgbG90cyBvZiBcY3NuYW1lJ3MsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGV4cGFuZCB0aGUKLSUgY29udHJvbCBzZXF1ZW5jZXMgYWZ0ZXIgd2UndmUgY29uc3RydWN0ZWQgdGhlbS4KLSUKLVxkZWZcbmVjZSMxe1xleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWUjMVxlbmRjc25hbWV9Ci0KLSUgQGRlZmluaW5mb2VuY2xvc2UuCi1cbGV0XGRlZmluZm9lbmNsb3NlPVxjb21tZW50Ci0KLQotXG1lc3NhZ2V7aW5kZXhpbmcsfQotJSBJbmRleCBnZW5lcmF0aW9uIGZhY2lsaXRpZXMKLQotJSBEZWZpbmUgXG5ld3dyaXRlIHRvIGJlIGlkZW50aWNhbCB0byBwbGFpbiB0ZXgncyBcbmV3d3JpdGUKLSUgZXhjZXB0IG5vdCBcb3V0ZXIsIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhpbiBcbmV3aW5kZXguCi17XGNhdGNvZGVgXEA9MTEKLVxnZGVmXG5ld3dyaXRle1xhbGxvY0A3XHdyaXRlXGNoYXJkZWZcc2l4dEBAbn19Ci0KLSUgXG5ld2luZGV4IHtmb299IGRlZmluZXMgYW4gaW5kZXggbmFtZWQgZm9vLgotJSBJdCBhdXRvbWF0aWNhbGx5IGRlZmluZXMgXGZvb2luZGV4IHN1Y2ggdGhhdAotJSBcZm9vaW5kZXggLi4ucmVzdCBvZiBsaW5lLi4uIHB1dHMgYW4gZW50cnkgaW4gdGhlIGluZGV4IGZvby4KLSUgSXQgYWxzbyBkZWZpbmVzIFxmb29pbmRmaWxlIHRvIGJlIHRoZSBudW1iZXIgb2YgdGhlIG91dHB1dCBjaGFubmVsIGZvcgotJSB0aGUgZmlsZSB0aGF0IGFjY3VtdWxhdGVzIHRoaXMgaW5kZXguICBUaGUgZmlsZSdzIGV4dGVuc2lvbiBpcyBmb28uCi0lIFRoZSBuYW1lIG9mIGFuIGluZGV4IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMiBjaGFyYWN0ZXJzIGxvbmcKLSUgZm9yIHRoZSBzYWtlIG9mIHZtcy4KLSUKLVxkZWZcbmV3aW5kZXgjMXslCi0gIFxpZmxpbmtzCi0gICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEgJSBPcGVuIHRoZSBmaWxlCi0gIFxmaQotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslICAgICAlIERlZmluZSBAIzFpbmRleAotICAgIFxub2V4cGFuZFxkb2luZGV4eyMxfX0KLX0KLQotJSBAZGVmaW5kZXggZm9vICA9PSAgXG5ld2luZGV4e2Zvb30KLQotXGRlZlxkZWZpbmRleHtccGFyc2VhcmdcbmV3aW5kZXh9Ci0KLSUgRGVmaW5lIEBkZWZjb2RlaW5kZXgsIGxpa2UgQGRlZmluZGV4IGV4Y2VwdCBwdXQgYWxsIGVudHJpZXMgaW4gQGNvZGUuCi0KLVxkZWZcbmV3Y29kZWluZGV4IzF7JQotICBcaWZsaW5rcwotICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxCi0gIFxmaQotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCi0gICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMxfX0KLX0KLQotXGRlZlxkZWZjb2RlaW5kZXh7XHBhcnNlYXJnXG5ld2NvZGVpbmRleH0KLQotJSBAc3luaW5kZXggZm9vIGJhciAgICBtYWtlcyBpbmRleCBmb28gZmVlZCBpbnRvIGluZGV4IGJhci4KLSUgRG8gdGhpcyBpbnN0ZWFkIG9mIEBkZWZpbmRleCBmb28gaWYgeW91IGRvbid0IHdhbnQgaXQgYXMgYSBzZXBhcmF0ZSBpbmRleC4KLSUgVGhlIFxjbG9zZW91dCBoZWxwcyByZWR1Y2UgdW5uZWNlc3Nhcnkgb3BlbiBmaWxlczsgdGhlIGxpbWl0IG9uIHRoZQotJSBBY29ybiBSSVNDIE9TIGlzIGEgbWVyZSAxNiBmaWxlcy4KLVxkZWZcc3luaW5kZXgjMSAjMiB7JQotICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHN5bmluZGV4Zm9vXGV4cGFuZGFmdGVyPVxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxjbG9zZW91dFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZT1cc3luaW5kZXhmb28KLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSBkZWZpbmUgXHh4eGluZGV4Ci0gICAgXG5vZXhwYW5kXGRvaW5kZXh7IzJ9fSUKLX0KLQotJSBAc3luY29kZWluZGV4IGZvbyBiYXIgICBzaW1pbGFyLCBidXQgcHV0IGFsbCBlbnRyaWVzIG1hZGUgZm9yIGluZGV4IGZvbwotJSBpbnNpZGUgQGNvZGUuCi1cZGVmXHN5bmNvZGVpbmRleCMxICMyIHslCi0gIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcc3luaW5kZXhmb29cZXhwYW5kYWZ0ZXI9XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lPVxzeW5pbmRleGZvbwotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslIGRlZmluZSBceHh4aW5kZXgKLSAgICBcbm9leHBhbmRcZG9jb2RlaW5kZXh7IzJ9fSUKLX0KLQotJSBEZWZpbmUgXGRvaW5kZXgsIHRoZSBkcml2ZXIgZm9yIGFsbCBcZm9vaW5kZXggbWFjcm9zLgotJSBBcmd1bWVudCAjMSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxpbmcgXGZvb2luZGV4IG1hY3JvLAotJSAgYW5kIGl0IGlzICJmb28iLCB0aGUgbmFtZSBvZiB0aGUgaW5kZXguCi0KLSUgXGRvaW5kZXgganVzdCB1c2VzIFxwYXJzZWFyZzsgaXQgY2FsbHMgXGRvaW5kIGZvciB0aGUgYWN0dWFsIHdvcmsuCi0lIFRoaXMgaXMgYmVjYXVzZSBcZG9pbmQgaXMgbW9yZSB1c2VmdWwgdG8gY2FsbCBmcm9tIG90aGVyIG1hY3Jvcy4KLQotJSBUaGVyZSBpcyBhbHNvIFxkb3N1YmluZCB7aW5kZXh9e3RvcGljfXtzdWJ0b3BpY30KLSUgd2hpY2ggbWFrZXMgYW4gZW50cnkgaW4gYSB0d28tbGV2ZWwgaW5kZXggc3VjaCBhcyB0aGUgb3BlcmF0aW9uIGluZGV4LgotCi1cZGVmXGRvaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWluZGV4ZXJ9Ci1cZGVmXHNpbmdsZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9eyMxfX0KLQotJSBsaWtlIHRoZSBwcmV2aW91cyB0d28sIGJ1dCB0aGV5IHB1dCBAY29kZSBhcm91bmQgdGhlIGFyZ3VtZW50LgotXGRlZlxkb2NvZGVpbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlY29kZWluZGV4ZXJ9Ci1cZGVmXHNpbmdsZWNvZGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXtcY29kZXsjMX19fQotCi1cZGVmXGluZGV4ZHVtbWllc3slCi1cZGVmXCB7IH0lCi0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IGFjY2VudCBjb21tYW5kcy4KLVxkZWZcIntccmVhbGJhY2tzbGFzaCAifSUKLVxkZWZcYHtccmVhbGJhY2tzbGFzaCBgfSUKLVxkZWZcJ3tccmVhbGJhY2tzbGFzaCAnfSUKLVxkZWZcXntccmVhbGJhY2tzbGFzaCBefSUKLVxkZWZcfntccmVhbGJhY2tzbGFzaCB+fSUKLVxkZWZcPXtccmVhbGJhY2tzbGFzaCA9fSUKLVxkZWZcYntccmVhbGJhY2tzbGFzaCBifSUKLVxkZWZcY3tccmVhbGJhY2tzbGFzaCBjfSUKLVxkZWZcZHtccmVhbGJhY2tzbGFzaCBkfSUKLVxkZWZcdXtccmVhbGJhY2tzbGFzaCB1fSUKLVxkZWZcdntccmVhbGJhY2tzbGFzaCB2fSUKLVxkZWZcSHtccmVhbGJhY2tzbGFzaCBIfSUKLSUgVGFrZSBjYXJlIG9mIHRoZSBwbGFpbiB0ZXggc3BlY2lhbCBFdXJvcGVhbiBtb2RpZmllZCBsZXR0ZXJzLgotXGRlZlxvZXtccmVhbGJhY2tzbGFzaCBvZX0lCi1cZGVmXGFle1xyZWFsYmFja3NsYXNoIGFlfSUKLVxkZWZcYWF7XHJlYWxiYWNrc2xhc2ggYWF9JQotXGRlZlxPRXtccmVhbGJhY2tzbGFzaCBPRX0lCi1cZGVmXEFFe1xyZWFsYmFja3NsYXNoIEFFfSUKLVxkZWZcQUF7XHJlYWxiYWNrc2xhc2ggQUF9JQotXGRlZlxve1xyZWFsYmFja3NsYXNoIG99JQotXGRlZlxPe1xyZWFsYmFja3NsYXNoIE99JQotXGRlZlxse1xyZWFsYmFja3NsYXNoIGx9JQotXGRlZlxMe1xyZWFsYmFja3NsYXNoIEx9JQotXGRlZlxzc3tccmVhbGJhY2tzbGFzaCBzc30lCi0lIFRha2UgY2FyZSBvZiB0ZXhpbmZvIGNvbW1hbmRzIGxpa2VseSB0byBhcHBlYXIgaW4gYW4gaW5kZXggZW50cnkuCi0lIChNdXN0IGJlIGEgd2F5IHRvIGF2b2lkIGRvaW5nIGV4cGFuc2lvbiBhdCBhbGwsIGFuZCB0aHVzIG5vdCBoYXZlIHRvCi0lIGxhYm9yaW91c2x5IGxpc3QgZXZlcnkgc2luZ2xlIGNvbW1hbmQgaGVyZS4pCi1cZGVmXEB7QH0lIHdpbGwgYmUgQEAgd2hlbiB3ZSBzd2l0Y2ggdG8gQCBhcyBlc2NhcGUgY2hhci4KLSUgTmVlZCB0aGVzZSBpbiBjYXNlIFx0ZXggaXMgaW4gZWZmZWN0IGFuZCBceyBpcyBhIFxkZWxpbWl0ZXIgYWdhaW4uCi0lIEJ1dCBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKLSUgYnJhY2VzIGFuZCBiYWNrc2xhc2hlcyBhcmUgdXNlZCBvbmx5IGFzIGRlbGltaXRlcnMuICAKLVxsZXRceyA9IFxteWxicmFjZQotXGxldFx9ID0gXG15cmJyYWNlCi1cZGVmXF97e1xyZWFsYmFja3NsYXNoIF99fSUKLVxkZWZcd3tccmVhbGJhY2tzbGFzaCB3IH0lCi1cZGVmXGJme1xyZWFsYmFja3NsYXNoIGJmIH0lCi0lXGRlZlxybXtccmVhbGJhY2tzbGFzaCBybSB9JQotXGRlZlxzbHtccmVhbGJhY2tzbGFzaCBzbCB9JQotXGRlZlxzZntccmVhbGJhY2tzbGFzaCBzZn0lCi1cZGVmXHR0e1xyZWFsYmFja3NsYXNoIHR0fSUKLVxkZWZcZ3Rye1xyZWFsYmFja3NsYXNoIGd0cn0lCi1cZGVmXGxlc3N7XHJlYWxiYWNrc2xhc2ggbGVzc30lCi1cZGVmXGhhdHtccmVhbGJhY2tzbGFzaCBoYXR9JQotXGRlZlxUZVh7XHJlYWxiYWNrc2xhc2ggVGVYfSUKLVxkZWZcZG90c3tccmVhbGJhY2tzbGFzaCBkb3RzIH0lCi1cZGVmXHJlc3VsdHtccmVhbGJhY2tzbGFzaCByZXN1bHR9JQotXGRlZlxlcXVpdntccmVhbGJhY2tzbGFzaCBlcXVpdn0lCi1cZGVmXGV4cGFuc2lvbntccmVhbGJhY2tzbGFzaCBleHBhbnNpb259JQotXGRlZlxwcmludHtccmVhbGJhY2tzbGFzaCBwcmludH0lCi1cZGVmXGVycm9ye1xyZWFsYmFja3NsYXNoIGVycm9yfSUKLVxkZWZccG9pbnR7XHJlYWxiYWNrc2xhc2ggcG9pbnR9JQotXGRlZlxjb3B5cmlnaHR7XHJlYWxiYWNrc2xhc2ggY29weXJpZ2h0fSUKLVxkZWZcdGNsb3NlIyMxe1xyZWFsYmFja3NsYXNoIHRjbG9zZSB7IyMxfX0lCi1cZGVmXGNvZGUjIzF7XHJlYWxiYWNrc2xhc2ggY29kZSB7IyMxfX0lCi1cZGVmXHVyZWYjIzF7XHJlYWxiYWNrc2xhc2ggdXJlZiB7IyMxfX0lCi1cZGVmXHVybCMjMXtccmVhbGJhY2tzbGFzaCB1cmwgeyMjMX19JQotXGRlZlxlbnYjIzF7XHJlYWxiYWNrc2xhc2ggZW52IHsjIzF9fSUKLVxkZWZcY29tbWFuZCMjMXtccmVhbGJhY2tzbGFzaCBjb21tYW5kIHsjIzF9fSUKLVxkZWZcb3B0aW9uIyMxe1xyZWFsYmFja3NsYXNoIG9wdGlvbiB7IyMxfX0lCi1cZGVmXGRvdGxlc3MjIzF7XHJlYWxiYWNrc2xhc2ggZG90bGVzcyB7IyMxfX0lCi1cZGVmXHNhbXAjIzF7XHJlYWxiYWNrc2xhc2ggc2FtcCB7IyMxfX0lCi1cZGVmXCwjIzF7XHJlYWxiYWNrc2xhc2ggLHsjIzF9fSUKLVxkZWZcdCMjMXtccmVhbGJhY2tzbGFzaCB0IHsjIzF9fSUKLVxkZWZcciMjMXtccmVhbGJhY2tzbGFzaCByIHsjIzF9fSUKLVxkZWZcaSMjMXtccmVhbGJhY2tzbGFzaCBpIHsjIzF9fSUKLVxkZWZcYiMjMXtccmVhbGJhY2tzbGFzaCBiIHsjIzF9fSUKLVxkZWZcc2MjIzF7XHJlYWxiYWNrc2xhc2ggc2MgeyMjMX19JQotXGRlZlxjaXRlIyMxe1xyZWFsYmFja3NsYXNoIGNpdGUgeyMjMX19JQotXGRlZlxrZXkjIzF7XHJlYWxiYWNrc2xhc2gga2V5IHsjIzF9fSUKLVxkZWZcZmlsZSMjMXtccmVhbGJhY2tzbGFzaCBmaWxlIHsjIzF9fSUKLVxkZWZcdmFyIyMxe1xyZWFsYmFja3NsYXNoIHZhciB7IyMxfX0lCi1cZGVmXGtiZCMjMXtccmVhbGJhY2tzbGFzaCBrYmQgeyMjMX19JQotXGRlZlxkZm4jIzF7XHJlYWxiYWNrc2xhc2ggZGZuIHsjIzF9fSUKLVxkZWZcZW1waCMjMXtccmVhbGJhY2tzbGFzaCBlbXBoIHsjIzF9fSUKLVxkZWZcYWNyb255bSMjMXtccmVhbGJhY2tzbGFzaCBhY3JvbnltIHsjIzF9fSUKLSUKLSUgSGFuZGxlIHNvbWUgY2FzZXMgb2YgQHZhbHVlIC0tIHdoZXJlIHRoZSB2YXJpYWJsZSBuYW1lIGRvZXMgbm90Ci0lIGNvbnRhaW4gLSBvciBfLCBhbmQgdGhlIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gYW55Ci0lIChub24tZnVsbHktZXhwYW5kYWJsZSkgY29tbWFuZHMuCi1cbGV0XHZhbHVlID0gXGV4cGFuZGFibGV2YWx1ZQotJQotXHVuc2Vwc3BhY2VzCi0lIFR1cm4gb2ZmIG1hY3JvIGV4cGFuc2lvbgotXHR1cm5vZmZtYWNyb3MKLX0KLQotJSBJZiBhbiBpbmRleCBjb21tYW5kIGlzIHVzZWQgaW4gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQsIGFueSBzcGFjZXMKLSUgdGhlcmVpbiBzaG91bGQgYmVjb21lIHJlZ3VsYXIgc3BhY2VzIGluIHRoZSByYXcgaW5kZXggZmlsZSwgbm90IHRoZQotJSBleHBhbnNpb24gb2YgXHRpZSAoXFxsZWF2ZXZtb2RlIFxwZW5hbHR5IFxATSBcICkuCi17XG9iZXlzcGFjZXMKLSBcZ2RlZlx1bnNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVxzcGFjZX19Ci0KLSUgXGluZGV4bm9mb250cyBuby1vcHMgYWxsIGZvbnQtY2hhbmdlIGNvbW1hbmRzLgotJSBUaGlzIGlzIHVzZWQgd2hlbiBvdXRwdXR0aW5nIHRoZSBzdHJpbmdzIHRvIHNvcnQgdGhlIGluZGV4IGJ5LgotXGRlZlxpbmRleGR1bW15Zm9udCMxeyMxfQotXGRlZlxpbmRleGR1bW15dGV4e1RlWH0KLVxkZWZcaW5kZXhkdW1teWRvdHN7Li4ufQotCi1cZGVmXGluZGV4bm9mb250c3slCi0lIEp1c3QgaWdub3JlIGFjY2VudHMuCi1cbGV0XCw9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGA9XGluZGV4ZHVtbXlmb250Ci1cbGV0XCc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XF49XGluZGV4ZHVtbXlmb250Ci1cbGV0XH49XGluZGV4ZHVtbXlmb250Ci1cbGV0XD09XGluZGV4ZHVtbXlmb250Ci1cbGV0XGI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGM9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHY9XGluZGV4ZHVtbXlmb250Ci1cbGV0XEg9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGRvdGxlc3M9XGluZGV4ZHVtbXlmb250Ci0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IHNwZWNpYWwgRXVyb3BlYW4gbW9kaWZpZWQgbGV0dGVycy4KLVxkZWZcb2V7b2V9JQotXGRlZlxhZXthZX0lCi1cZGVmXGFhe2FhfSUKLVxkZWZcT0V7T0V9JQotXGRlZlxBRXtBRX0lCi1cZGVmXEFBe0FBfSUKLVxkZWZcb3tvfSUKLVxkZWZcT3tPfSUKLVxkZWZcbHtsfSUKLVxkZWZcTHtMfSUKLVxkZWZcc3N7c3N9JQotXGxldFx3PVxpbmRleGR1bW15Zm9udAotXGxldFx0PVxpbmRleGR1bW15Zm9udAotXGxldFxyPVxpbmRleGR1bW15Zm9udAotXGxldFxpPVxpbmRleGR1bW15Zm9udAotXGxldFxiPVxpbmRleGR1bW15Zm9udAotXGxldFxlbXBoPVxpbmRleGR1bW15Zm9udAotXGxldFxzdHJvbmc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGNpdGU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHNjPVxpbmRleGR1bW15Zm9udAotJURvbid0IG5vLW9wIFx0dCwgc2luY2UgaXQgaXNuJ3QgYSB1c2VyLWxldmVsIGNvbW1hbmQKLSUgYW5kIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3RpdmUgY2hhcnMgbGlrZSA8LCA+LCB8Li4uCi0lXGxldFx0dD1caW5kZXhkdW1teWZvbnQKLVxsZXRcdGNsb3NlPVxpbmRleGR1bW15Zm9udAotXGxldFxjb2RlPVxpbmRleGR1bW15Zm9udAotXGxldFx1cmw9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHVyZWY9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGVudj1caW5kZXhkdW1teWZvbnQKLVxsZXRcYWNyb255bT1caW5kZXhkdW1teWZvbnQKLVxsZXRcY29tbWFuZD1caW5kZXhkdW1teWZvbnQKLVxsZXRcb3B0aW9uPVxpbmRleGR1bW15Zm9udAotXGxldFxmaWxlPVxpbmRleGR1bW15Zm9udAotXGxldFxzYW1wPVxpbmRleGR1bW15Zm9udAotXGxldFxrYmQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGtleT1caW5kZXhkdW1teWZvbnQKLVxsZXRcdmFyPVxpbmRleGR1bW15Zm9udAotXGxldFxUZVg9XGluZGV4ZHVtbXl0ZXgKLVxsZXRcZG90cz1caW5kZXhkdW1teWRvdHMKLVxkZWZcQHtAfSUKLX0KLQotJSBUbyBkZWZpbmUgXHJlYWxiYWNrc2xhc2gsIHdlIG11c3QgbWFrZSBcIG5vdCBiZSBhbiBlc2NhcGUuCi0lIFdlIG11c3QgZmlyc3QgbWFrZSBhbm90aGVyIGNoYXJhY3RlciAoQCkgYW4gZXNjYXBlCi0lIHNvIHdlIGRvIG5vdCBiZWNvbWUgdW5hYmxlIHRvIGRvIGEgZGVmaW5pdGlvbi4KLQote1xjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XG90aGVyCi0gQGdkZWZAcmVhbGJhY2tzbGFzaHtcfX0KLQotXGxldFxpbmRleGJhY2tzbGFzaD0wICAlb3ZlcnJpZGRlbiBkdXJpbmcgXHByaW50aW5kZXguCi1cbGV0XFNFVG1hcmdpbmluZGV4PVxyZWxheCAlIHB1dCBpbmRleCBlbnRyaWVzIGluIG1hcmdpbiAodW5kb2N1bWVudGVkKT8KLQotJSBGb3IgXGlmeCBjb21wYXJpc29ucy4KLVxkZWZcZW1wdHltYWNyb3tcZW1wdHl9Ci0KLSUgTW9zdCBpbmRleCBlbnRyaWVzIGdvIHRocm91Z2ggaGVyZSwgYnV0IFxkb3N1YmluZCBpcyB0aGUgZ2VuZXJhbCBjYXNlLgotJQotXGRlZlxkb2luZCMxIzJ7XGRvc3ViaW5keyMxfXsjMn1cZW1wdHl9Ci0KLSUgV29ya2hvcnNlIGZvciBhbGwgXGZvb2luZGV4ZXMuCi0lICMxIGlzIG5hbWUgb2YgaW5kZXgsICMyIGlzIHN0dWZmIHRvIHB1dCB0aGVyZSwgIzMgaXMgc3ViZW50cnkgLS0KLSUgXGVtcHR5IGlmIGNhbGxlZCBmcm9tIFxkb2luZCwgYXMgd2UgdXN1YWxseSBhcmUuICBUaGUgbWFpbiBleGNlcHRpb24KLSUgaXMgd2l0aCBkZWZ1bnMsIHdoaWNoIGNhbGwgdXMgZGlyZWN0bHkuCi0lCi1cZGVmXGRvc3ViaW5kIzEjMiMzeyUKLSAgJSBQdXQgdGhlIGluZGV4IGVudHJ5IGluIHRoZSBtYXJnaW4gaWYgZGVzaXJlZC4KLSAgXGlmeFxTRVRtYXJnaW5pbmRleFxyZWxheFxlbHNlCi0gICAgXGluc2VydFxtYXJnaW57XGhib3h7XHZydWxlIGhlaWdodDhwdCBkZXB0aDNwdCB3aWR0aDBwdCAjMn19JQotICBcZmkKLSAgeyUKLSAgICBcY291bnQyNTU9XGxhc3RwZW5hbHR5Ci0gICAgeyUKLSAgICAgIFxpbmRleGR1bW1pZXMgJSBNdXN0IGRvIHRoaXMgaGVyZSwgc2luY2UgXGJmLCBldGMgZXhwYW5kIGF0IHRoaXMgc3RhZ2UKLSAgICAgIFxlc2NhcGVjaGFyPWBcXAotICAgICAgeyUKLSAgICAgICAgXGxldFxmb2xpbyA9IDAlIFdlIHdpbGwgZXhwYW5kIGFsbCBtYWNyb3Mgbm93IEVYQ0VQVCBcZm9saW8uCi0gICAgICAgIFxkZWZccmF3YmFja3NsYXNoeHh7XGluZGV4YmFja3NsYXNofSUgXGluZGV4YmFja3NsYXNoIGlzbid0IGRlZmluZWQgbm93Ci0gICAgICAgICUgc28gaXQgd2lsbCBiZSBvdXRwdXQgYXMgaXM7IGFuZCBpdCB3aWxsIHByaW50IGFzIGJhY2tzbGFzaC4KLSAgICAgICAgJQotICAgICAgICBcZGVmXHRoaXJkYXJneyMzfSUKLSAgICAgICAgJQotICAgICAgICAlIElmIHRoaXJkIGFyZyBpcyBwcmVzZW50LCBwcmVjZWRlIGl0IHdpdGggc3BhY2UgaW4gc29ydCBrZXkuCi0gICAgICAgIFxpZnhcdGhpcmRhcmdcZW1wdHltYWNybwotICAgICAgICAgIFxsZXRcc3ViZW50cnkgPSBcZW1wdHkKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICBcZGVmXHN1YmVudHJ5eyAjM30lCi0gICAgICAgIFxmaQotICAgICAgICAlCi0gICAgICAgICUgRmlyc3QgcHJvY2VzcyB0aGUgaW5kZXggZW50cnkgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQKLSAgICAgICAgJSBvZmYgdG8gZ2V0IHRoZSBzdHJpbmcgdG8gc29ydCBieS4KLSAgICAgICAge1xpbmRleG5vZm9udHMgXHhkZWZcaW5kZXhzb3J0dG1weyMyXHN1YmVudHJ5fX0lCi0gICAgICAgICUKLSAgICAgICAgJSBOb3cgdGhlIHJlYWwgaW5kZXggZW50cnkgd2l0aCB0aGUgZm9udHMuCi0gICAgICAgIFx0b2tzMCA9IHsjMn0lCi0gICAgICAgICUKLSAgICAgICAgJSBJZiB0aGlyZCAoc3ViZW50cnkpIGFyZyBpcyBwcmVzZW50LCBhZGQgaXQgdG8gdGhlIGluZGV4Ci0gICAgICAgICUgc3RyaW5nLiAgQW5kIGluY2x1ZGUgYSBzcGFjZS4KLSAgICAgICAgXGlmeFx0aGlyZGFyZ1xlbXB0eW1hY3JvIFxlbHNlCi0gICAgICAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1x0aGVcdG9rczAgXHNwYWNlICMzfSUKLSAgICAgICAgXGZpCi0gICAgICAgICUKLSAgICAgICAgJSBTZXQgdXAgdGhlIGNvbXBsZXRlIGluZGV4IGVudHJ5LCB3aXRoIGJvdGggdGhlIHNvcnQga2V5Ci0gICAgICAgICUgYW5kIHRoZSBvcmlnaW5hbCB0ZXh0LCBpbmNsdWRpbmcgYW55IGZvbnQgY29tbWFuZHMuICBXZSB3cml0ZQotICAgICAgICAlIHRocmVlIGFyZ3VtZW50cyB0byBcZW50cnkgdG8gdGhlIC4/PyBmaWxlLCB0ZXhpbmRleCByZWR1Y2VzIHRvCi0gICAgICAgICUgdHdvIHdoZW4gd3JpdGluZyB0aGUgLj8/cyBzb3J0ZWQgcmVzdWx0LgotICAgICAgICBcZWRlZlx0ZW1weyUKLSAgICAgICAgICBcd3JpdGVcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZXslCi0gICAgICAgICAgICBccmVhbGJhY2tzbGFzaCBlbnRyeXtcaW5kZXhzb3J0dG1wfXtcZm9saW99e1x0aGVcdG9rczB9fSUKLSAgICAgICAgfSUKLSAgICAgICAgJQotICAgICAgICAlIElmIGEgc2tpcCBpcyB0aGUgbGFzdCB0aGluZyBvbiB0aGUgbGlzdCBub3csIHByZXNlcnZlIGl0Ci0gICAgICAgICUgYnkgYmFja2luZyB1cCBieSBcbGFzdHNraXAsIGRvaW5nIHRoZSBcd3JpdGUsIHRoZW4gaW5zZXJ0aW5nCi0gICAgICAgICUgdGhlIHNraXAgYWdhaW4uICBPdGhlcndpc2UsIHRoZSB3aGF0c2l0IGdlbmVyYXRlZCBieSB0aGUKLSAgICAgICAgJSBcd3JpdGUgd2lsbCBtYWtlIFxsYXN0c2tpcCB6ZXJvLiAgVGhlIHJlc3VsdCBpcyB0aGF0IHNlcXVlbmNlcwotICAgICAgICAlIGxpa2UgdGhpczoKLSAgICAgICAgJSBAZW5kIGRlZnVuCi0gICAgICAgICUgQHRpbmRleCB3aGF0ZXZlcgotICAgICAgICAlIEBkZWZ1biAuLi4KLSAgICAgICAgJSB3aWxsIGhhdmUgZXh0cmEgc3BhY2UgaW5zZXJ0ZWQsIGJlY2F1c2UgdGhlIFxtZWRicmVhayBpbiB0aGUKLSAgICAgICAgJSBzdGFydCBvZiB0aGUgQGRlZnVuIHdvbid0IHNlZSB0aGUgc2tpcCBpbnNlcnRlZCBieSB0aGUgQGVuZCBvZgotICAgICAgICAlIHRoZSBwcmV2aW91cyBkZWZ1bi4KLSAgICAgICAgJQotICAgICAgICAlIEJ1dCBkb24ndCBkbyBhbnkgb2YgdGhpcyBpZiB3ZSdyZSBub3QgaW4gdmVydGljYWwgbW9kZS4gIFdlCi0gICAgICAgICUgZG9uJ3Qgd2FudCB0byBkbyBhIFx2c2tpcCBhbmQgcHJlbWF0dXJlbHkgZW5kIGEgcGFyYWdyYXBoLgotICAgICAgICAlCi0gICAgICAgICUgQXZvaWQgcGFnZSBicmVha3MgZHVlIHRvIHRoZXNlIGV4dHJhIHNraXBzLCB0b28uCi0gICAgICAgICUKLSAgICAgICAgXGlmbGlua3MKLSAgICAgICAgICBcaWZ2bW9kZQotICAgICAgICAgICAgXHNraXAwID0gXGxhc3Rza2lwCi0gICAgICAgICAgICBcaWZkaW1cbGFzdHNraXAgPSAwcHQgXGVsc2UgXG5vYnJlYWtcdnNraXAtXGxhc3Rza2lwIFxmaQotICAgICAgICAgIFxmaQotICAgICAgICAgICUKLSAgICAgICAgICBcdGVtcCAlIGRvIHRoZSB3cml0ZQotICAgICAgICAgICUKLSAgICAgICAgICAlCi0gICAgICAgICAgXGlmdm1vZGUgXGlmZGltXHNraXAwID0gMHB0IFxlbHNlIFxub2JyZWFrXHZza2lwXHNraXAwIFxmaSBcZmkKLSAgICAgICAgXGZpCi0gICAgICB9JQotICAgIH0lCi0gICAgXHBlbmFsdHlcY291bnQyNTUKLSAgfSUKLX0KLQotJSBUaGUgaW5kZXggZW50cnkgd3JpdHRlbiBpbiB0aGUgZmlsZSBhY3R1YWxseSBsb29rcyBsaWtlCi0lICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfQotJSBvcgotJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY317c3VidG9waWN9Ci0lIFRoZSB0ZXhpbmRleCBwcm9ncmFtIHJlYWRzIGluIHRoZXNlIGZpbGVzIGFuZCB3cml0ZXMgZmlsZXMKLSUgY29udGFpbmluZyB0aGVzZSBraW5kcyBvZiBsaW5lczoKLSUgIFxpbml0aWFsIHtjfQotJSAgICAgYmVmb3JlIHRoZSBmaXJzdCB0b3BpYyB3aG9zZSBpbml0aWFsIGlzIGMKLSUgIFxlbnRyeSB7dG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGhvdXQgc3VidG9waWNzCi0lICBccHJpbWFyeSB7dG9waWN9Ci0lICAgICBmb3IgdGhlIGJlZ2lubmluZyBvZiBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRoIHN1YnRvcGljcwotJSAgXHNlY29uZGFyeSB7c3VidG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGVhY2ggc3VidG9waWMuCi0KLSUgRGVmaW5lIHRoZSB1c2VyLWFjY2Vzc2libGUgaW5kZXhpbmcgY29tbWFuZHMKLSUgQGZpbmRleCwgQHZpbmRleCwgQGtpbmRleCwgQGNpbmRleC4KLQotXGRlZlxmaW5kZXgge1xmbmluZGV4fQotXGRlZlxraW5kZXgge1xreWluZGV4fQotXGRlZlxjaW5kZXgge1xjcGluZGV4fQotXGRlZlx2aW5kZXgge1x2cmluZGV4fQotXGRlZlx0aW5kZXgge1x0cGluZGV4fQotXGRlZlxwaW5kZXgge1xwZ2luZGV4fQotCi1cZGVmXGNpbmRleHN1YiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGNpbmRleHN1Yn0KLXtcb2JleWxpbmVzICUKLVxnZGVmXGNpbmRleHN1YiAiIzEiICMyXl5Ne1xlbmRncm91cCAlCi1cZG9zdWJpbmR7Y3B9eyMyfXsjMX19fQotCi0lIERlZmluZSB0aGUgbWFjcm9zIHVzZWQgaW4gZm9ybWF0dGluZyBvdXRwdXQgb2YgdGhlIHNvcnRlZCBpbmRleCBtYXRlcmlhbC4KLQotJSBAcHJpbnRpbmRleCBjYXVzZXMgYSBwYXJ0aWN1bGFyIGluZGV4ICh0aGUgPz9zIGZpbGUpIHRvIGdldCBwcmludGVkLgotJSBJdCBkb2VzIG5vdCBwcmludCBhbnkgY2hhcHRlciBoZWFkaW5nICh1c3VhbGx5IGFuIEB1bm51bWJlcmVkKS4KLSUKLVxkZWZccHJpbnRpbmRleHtccGFyc2VhcmdcZG9wcmludGluZGV4fQotXGRlZlxkb3ByaW50aW5kZXgjMXtcYmVnaW5ncm91cAotICBcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwezEwMDAwfSUKLSAgJQotICBcc21hbGxmb250cyBccm0KLSAgXHRvbGVyYW5jZSA9IDk1MDAKLSAgXGluZGV4YnJlYWtzCi0gICUKLSAgJSBTZWUgaWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGFuZCBpcyBub25lbXB0eS4KLSAgJSBDaGFuZ2UgY2F0Y29kZSBvZiBAIGhlcmUgc28gdGhhdCBpZiB0aGUgaW5kZXggZmlsZSBjb250YWlucwotICAlIFxpbml0aWFsIHtAfQotICAlIGFzIGl0cyBmaXJzdCBsaW5lLCBUZVggZG9lc24ndCBjb21wbGFpbiBhYm91dCBtaXNtYXRjaGVkIGJyYWNlcwotICAlIChiZWNhdXNlIGl0IHRoaW5rcyBAfSBpcyBhIGNvbnRyb2wgc2VxdWVuY2UpLgotICBcY2F0Y29kZWBcQCA9IDExCi0gIFxvcGVuaW4gMSBcam9ibmFtZS4jMXMKLSAgXGlmZW9mIDEKLSAgICAlIFxlbmRkb3VibGVjb2x1bW5zIGdldHMgY29uZnVzZWQgaWYgdGhlcmUgaXMgbm8gdGV4dCBpbiB0aGUgaW5kZXgsCi0gICAgJSBhbmQgaXQgbG9zZXMgdGhlIGNoYXB0ZXIgdGl0bGUgYW5kIHRoZSBhdXggZmlsZSBlbnRyaWVzIGZvciB0aGUKLSAgICAlIGluZGV4LiAgVGhlIGVhc2llc3Qgd2F5IHRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGlzIHRvIG1ha2Ugc3VyZQotICAgICUgdGhlcmUgaXMgc29tZSB0ZXh0LgotICAgIFxwdXR3b3JkSW5kZXhOb25leGlzdGVudAotICBcZWxzZQotICAgICUKLSAgICAlIElmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHksIHRoZW4gXG9wZW5pbiBsZWF2ZXMgXGlmZW9mCi0gICAgJSBmYWxzZS4gIFdlIGhhdmUgdG8gbWFrZSBUZVggdHJ5IHRvIHJlYWQgc29tZXRoaW5nIGZyb20gdGhlIGZpbGUsIHNvCi0gICAgJSBpdCBjYW4gZGlzY292ZXIgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gaXQuCi0gICAgXHJlYWQgMSB0byBcdGVtcAotICAgIFxpZmVvZiAxCi0gICAgICBccHV0d29yZEluZGV4SXNFbXB0eQotICAgIFxlbHNlCi0gICAgICAlIEluZGV4IGZpbGVzIGFyZSBhbG1vc3QgVGV4aW5mbyBzb3VyY2UsIGJ1dCB3ZSB1c2UgXCBhcyB0aGUgZXNjYXBlCi0gICAgICAlIGNoYXJhY3Rlci4gIEl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgQCwgYnV0IHRoYXQncyB0b28gYmlnIGEgY2hhbmdlCi0gICAgICAlIHRvIG1ha2UgcmlnaHQgbm93LgotICAgICAgXGRlZlxpbmRleGJhY2tzbGFzaHtccmF3YmFja3NsYXNoeHh9JQotICAgICAgXGNhdGNvZGVgXFwgPSAwCi0gICAgICBcZXNjYXBlY2hhciA9IGBcXAotICAgICAgXGJlZ2luZG91YmxlY29sdW1ucwotICAgICAgXGlucHV0IFxqb2JuYW1lLiMxcwotICAgICAgXGVuZGRvdWJsZWNvbHVtbnMKLSAgICBcZmkKLSAgXGZpCi0gIFxjbG9zZWluIDEKLVxlbmRncm91cH0KLQotJSBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHNvcnRlZCBpbmRleCBmaWxlIGl0c2VsZi4KLSUgQ2hhbmdlIHRoZW0gdG8gY29udHJvbCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5kZXguCi0KLVxkZWZcaW5pdGlhbCMxe3slCi0gICUgU29tZSBtaW5vciBmb250IGNoYW5nZXMgZm9yIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuCi0gIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcdHQ9XHNlY3R0IFxsZXRcc2Y9XHNlY3R0Ci0gICUKLSAgJSBSZW1vdmUgYW55IGdsdWUgd2UgbWF5IGhhdmUsIHdlJ2xsIGJlIGluc2VydGluZyBvdXIgb3duLgotICBccmVtb3ZlbGFzdHNraXAKLSAgJQotICAlIFdlIGxpa2UgYnJlYWtzIGJlZm9yZSB0aGUgaW5kZXggaW5pdGlhbHMsIHNvIGluc2VydCBhIGJvbnVzLgotICBccGVuYWx0eSAtMzAwCi0gICUKLSAgJSBUeXBlc2V0IHRoZSBpbml0aWFsLiAgTWFraW5nIHRoaXMgYWRkIHVwIHRvIGEgd2hvbGUgbnVtYmVyIG9mCi0gICUgYmFzZWxpbmVza2lwcyBpbmNyZWFzZXMgdGhlIGNoYW5jZSBvZiB0aGUgZG90cyBsaW5pbmcgdXAgZnJvbSBjb2x1bW4KLSAgJSB0byBjb2x1bW4uICBJdCBzdGlsbCB3b24ndCBvZnRlbiBiZSBwZXJmZWN0LCBiZWNhdXNlIG9mIHRoZSBzdHJldGNoCi0gICUgd2UgbmVlZCBiZWZvcmUgZWFjaCBlbnRyeSwgYnV0IGl0J3MgYmV0dGVyLgotICAlCi0gICUgTm8gc2hyaW5rIGJlY2F1c2UgaXQgY29uZnVzZXMgXGJhbGFuY2Vjb2x1bW5zLgotICBcdnNraXAgMS42N1xiYXNlbGluZXNraXAgcGx1cyAuNVxiYXNlbGluZXNraXAKLSAgXGxlZnRsaW5le1xzZWNiZiAjMX0lCi0gIFx2c2tpcCAuMzNcYmFzZWxpbmVza2lwIHBsdXMgLjFcYmFzZWxpbmVza2lwCi0gICUKLSAgJSBEbyBvdXIgYmVzdCBub3QgdG8gYnJlYWsgYWZ0ZXIgdGhlIGluaXRpYWwuCi0gIFxub2JyZWFrCi19fQotCi0lIFRoaXMgdHlwZXNldHMgYSBwYXJhZ3JhcGggY29uc2lzdGluZyBvZiAjMSwgZG90IGxlYWRlcnMsIGFuZCB0aGVuICMyCi0lIGZsdXNoIHRvIHRoZSByaWdodCBtYXJnaW4uICBJdCBpcyB1c2VkIGZvciBpbmRleCBhbmQgdGFibGUgb2YgY29udGVudHMKLSUgZW50cmllcy4gIFRoZSBwYXJhZ3JhcGggaXMgaW5kZW50ZWQgYnkgXGxlZnRza2lwLgotJQotXGRlZlxlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgJQotICAlIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCBpZiBuZWNlc3NhcnksIHNvIG91ciBhc3NpZ25tZW50cyBiZWxvdyBjYW4ndAotICAlIGFmZmVjdCBwcmV2aW91cyB0ZXh0LgotICBccGFyCi0gICUKLSAgJSBEbyBub3QgZmlsbCBvdXQgdGhlIGxhc3QgbGluZSB3aXRoIHdoaXRlIHNwYWNlLgotICBccGFyZmlsbHNraXAgPSAwaW4KLSAgJQotICAlIE5vIGV4dHJhIHNwYWNlIGFib3ZlIHRoaXMgcGFyYWdyYXBoLgotICBccGFyc2tpcCA9IDBpbgotICAlCi0gICUgRG8gbm90IHByZWZlciBhIHNlcGFyYXRlIGxpbmUgZW5kaW5nIHdpdGggYSBoeXBoZW4gdG8gZmV3ZXIgbGluZXMuCi0gIFxmaW5hbGh5cGhlbmRlbWVyaXRzID0gMAotICAlCi0gICUgXGhhbmdpbmRlbnQgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSBlbnRyeSB0ZXh0IGFuZCBwYWdlIG51bWJlcgotICAlIGRvbid0IGJvdGggZml0IG9uIG9uZSBsaW5lLiAgSW4gdGhhdCBjYXNlLCBib2Igc3VnZ2VzdHMgc3RhcnRpbmcgdGhlCi0gICUgZG90cyBwcmV0dHkgZmFyIG92ZXIgb24gdGhlIGxpbmUuICBVbmZvcnR1bmF0ZWx5LCBhIGxhcmdlCi0gICUgaW5kZW50YXRpb24gbG9va3Mgd3Jvbmcgd2hlbiB0aGUgZW50cnkgdGV4dCBpdHNlbGYgaXMgYnJva2VuIGFjcm9zcwotICAlIGxpbmVzLiAgU28gd2UgdXNlIGEgc21hbGwgaW5kZW50YXRpb24gYW5kIHB1dCB1cCB3aXRoIGxvbmcgbGVhZGVycy4KLSAgJQotICAlIFxoYW5nYWZ0ZXIgaXMgcmVzZXQgdG8gMSAod2hpY2ggaXMgdGhlIHZhbHVlIHdlIHdhbnQpIGF0IHRoZSBzdGFydAotICAlIG9mIGVhY2ggcGFyYWdyYXBoLCBzbyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoYXQuCi0gIFxoYW5naW5kZW50ID0gMmVtCi0gICUKLSAgJSBXaGVuIHRoZSBlbnRyeSB0ZXh0IG5lZWRzIHRvIGJlIGJyb2tlbiwganVzdCBmaWxsIG91dCB0aGUgZmlyc3QgbGluZQotICAlIHdpdGggYmxhbmsgc3BhY2UuCi0gIFxyaWdodHNraXAgPSAwcHQgcGx1czFmaWwKLSAgJQotICAlIEEgYml0IG9mIHN0cmV0Y2ggYmVmb3JlIGVhY2ggZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIGJhbGFuY2luZyBjb2x1bW5zLgotICBcdnNraXAgMHB0IHBsdXMxcHQKLSAgJQotICAlIFN0YXJ0IGEgYGBwYXJhZ3JhcGgnJyBmb3IgdGhlIGluZGV4IGVudHJ5IHNvIHRoZSBsaW5lIGJyZWFraW5nCi0gICUgcGFyYW1ldGVycyB3ZSd2ZSBzZXQgYWJvdmUgd2lsbCBoYXZlIGFuIGVmZmVjdC4KLSAgXG5vaW5kZW50Ci0gICUKLSAgJSBJbnNlcnQgdGhlIHRleHQgb2YgdGhlIGluZGV4IGVudHJ5LiAgVGVYIHdpbGwgZG8gbGluZS1icmVha2luZyBvbiBpdC4KLSAgIzElCi0gICUgVGhlIGZvbGxvd2luZyBpcyBrbHVkZ2VkIHRvIG5vdCBvdXRwdXQgYSBsaW5lIG9mIGRvdHMgaW4gdGhlIGluZGV4IGlmCi0gICUgdGhlcmUgYXJlIG5vIHBhZ2UgbnVtYmVycy4gIFRoZSBuZXh0IHBlcnNvbiB3aG8gYnJlYWtzIHRoaXMgd2lsbCBiZQotICAlIGN1cnNlZCBieSBhIFVuaXggZGFlbW9uLgotICBcZGVmXHRlbXBhe3tccm0gfX0lCi0gIFxkZWZcdGVtcGJ7IzJ9JQotICBcZWRlZlx0ZW1wY3tcdGVtcGF9JQotICBcZWRlZlx0ZW1wZHtcdGVtcGJ9JQotICBcaWZ4XHRlbXBjXHRlbXBkXCBcZWxzZSUKLSAgICAlCi0gICAgJSBJZiB3ZSBtdXN0LCBwdXQgdGhlIHBhZ2UgbnVtYmVyIG9uIGEgbGluZSBvZiBpdHMgb3duLCBhbmQgZmlsbCBvdXQKLSAgICAlIHRoaXMgbGluZSB3aXRoIGJsYW5rIHNwYWNlLiAgKFRoZSBcaGZpbCBpcyBvdmVyd2hlbG1lZCB3aXRoIHRoZQotICAgICUgZmlsbCBsZWFkZXJzIGdsdWUgaW4gXGluZGV4ZG90ZmlsbCBpZiB0aGUgcGFnZSBudW1iZXIgZG9lcyBmaXQuKQotICAgIFxoZmlsXHBlbmFsdHk1MAotICAgIFxudWxsXG5vYnJlYWtcaW5kZXhkb3RmaWxsICUgSGF2ZSBsZWFkZXJzIGJlZm9yZSB0aGUgcGFnZSBudW1iZXIuCi0gICAgJQotICAgICUgVGhlIGBcICcgaGVyZSBpcyByZW1vdmVkIGJ5IHRoZSBpbXBsaWNpdCBcdW5za2lwIHRoYXQgVGVYIGRvZXMgYXMKLSAgICAlIHBhcnQgb2YgKHRoZSBwcmltaXRpdmUpIFxwYXIuICBXaXRob3V0IGl0LCBhIHNwdXJpb3VzIHVuZGVyZnVsbAotICAgICUgXGhib3ggZW5zdWVzLgotICAgIFxpZnBkZgotICAgICAgXHBkZmdldHRva3MjMi5cIFx0aGVcdG9rc0EgJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgotICAgIFxlbHNlCi0gICAgICBcICMyJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgotICAgIFxmaQotICBcZmklCi0gIFxwYXIKLVxlbmRncm91cH0KLQotJSBMaWtlIFxkb3RmaWxsIGV4Y2VwdCB0YWtlcyBhdCBsZWFzdCAxIGVtLgotXGRlZlxpbmRleGRvdGZpbGx7XGNsZWFkZXJzCi0gIFxoYm94eyRcbWF0aHN1cnJvdW5kPTBwdCBcbWtlcm4xLjVtdSAke1xpdCAufSQgXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KLQotXGRlZlxwcmltYXJ5ICMxe1xsaW5leyMxXGhmaWx9fQotCi1cbmV3c2tpcFxzZWNvbmRhcnlpbmRlbnQgXHNlY29uZGFyeWluZGVudD0wLjVjbQotCi1cZGVmXHNlY29uZGFyeSAjMSMyewote1xwYXJmaWxsc2tpcD0waW4gXHBhcnNraXA9MGluCi1caGFuZ2luZGVudCA9MWluIFxoYW5nYWZ0ZXI9MQotXG5vaW5kZW50XGhza2lwXHNlY29uZGFyeWluZGVudFxoYm94eyMxfVxpbmRleGRvdGZpbGwgIzJccGFyCi19fQotCi0lIERlZmluZSB0d28tY29sdW1uIG1vZGUsIHdoaWNoIHdlIHVzZSB0byB0eXBlc2V0IGluZGV4ZXMuCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaywgcGFnZSA0MTYsIHdoaWNoIGlzIHRvIHNheSwKLSUgdGhlIG1hbm1hYy50ZXggZm9ybWF0IHVzZWQgdG8gcHJpbnQgdGhlIFRlWGJvb2sgaXRzZWxmLgotXGNhdGNvZGVgXEA9MTEKLQotXG5ld2JveFxwYXJ0aWFscGFnZQotXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplCi0KLVxkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwICUgZW5kZWQgYnkgXGVuZGRvdWJsZWNvbHVtbnMKLSAgJSBHcmFiIGFueSBzaW5nbGUtY29sdW1uIG1hdGVyaWFsIGFib3ZlIHVzLgotICBcb3V0cHV0ID0geyUKLSAgICAlCi0gICAgJSBIZXJlIGlzIGEgcG9zc2liaWxpdHkgbm90IGZvcmVzZWVuIGluIG1hbm1hYzogaWYgd2UgYWNjdW11bGF0ZSBhCi0gICAgJSB3aG9sZSBsb3Qgb2YgbWF0ZXJpYWwsIHdlIG1pZ2h0IGVuZCB1cCBjYWxsaW5nIHRoaXMgXG91dHB1dAotICAgICUgcm91dGluZSB0d2ljZSBpbiBhIHJvdyAoc2VlIHRoZSBkb3VibGVjb2wtbG9zZSB0ZXN0LCB3aGljaCBpcwotICAgICUgZXNzZW50aWFsbHkgYSBjb3VwbGUgb2YgaW5kZXhlcyB3aXRoIEBzZXRjaGFwdGVybmV3cGFnZSBvZmYpLiAgSW4KLSAgICAlIHRoYXQgY2FzZSB3ZSBqdXN0IHNoaXAgb3V0IHdoYXQgaXMgaW4gXHBhcnRpYWxwYWdlIHdpdGggdGhlIG5vcm1hbAotICAgICUgb3V0cHV0IHJvdXRpbmUuICBHZW5lcmFsbHksIFxwYXJ0aWFscGFnZSB3aWxsIGJlIGVtcHR5IHdoZW4gdGhpcwotICAgICUgcnVucyBhbmQgdGhpcyB3aWxsIGJlIGEgbm8tb3AuICBTZWUgdGhlIGluZGV4c3ByZWFkLnRleCB0ZXN0IGNhc2UuCi0gICAgXGlmdm9pZFxwYXJ0aWFscGFnZSBcZWxzZQotICAgICAgXG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xwYXJ0aWFscGFnZX0lCi0gICAgXGZpCi0gICAgJQotICAgIFxnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlID0gXHZib3h7JQotICAgICAgJSBVbnZib3ggdGhlIG1haW4gb3V0cHV0IHBhZ2UuCi0gICAgICBcdW52Ym94XFBBR0UKLSAgICAgIFxrZXJuLVx0b3Bza2lwIFxrZXJuXGJhc2VsaW5lc2tpcAotICAgIH0lCi0gIH0lCi0gIFxlamVjdCAlIHJ1biB0aGF0IG91dHB1dCByb3V0aW5lIHRvIHNldCBccGFydGlhbHBhZ2UKLSAgJQotICAlIFVzZSB0aGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3Igc3Vic2VxdWVudCBwYWdlcy4KLSAgXG91dHB1dCA9IHtcZG91YmxlY29sdW1ub3V0fSUKLSAgJQotICAlIENoYW5nZSB0aGUgcGFnZSBzaXplIHBhcmFtZXRlcnMuICBXZSBjb3VsZCBkbyB0aGlzIG9uY2Ugb3V0c2lkZSB0aGlzCi0gICUgcm91dGluZSwgaW4gZWFjaCBvZiBAc21hbGxib29rLCBAYWZvdXJwYXBlciwgYW5kIHRoZSBkZWZhdWx0IDguNXgxMQotICAlIGZvcm1hdCwgYnV0IHRoZW4gd2UgcmVwZWF0IHRoZSBzYW1lIGNvbXB1dGF0aW9uLiAgUmVwZWF0aW5nIGEgY291cGxlCi0gICUgb2YgYXNzaWdubWVudHMgb25jZSBwZXIgaW5kZXggaXMgY2xlYXJseSBtZWFuaW5nbGVzcyBmb3IgdGhlCi0gICUgZXhlY3V0aW9uIHRpbWUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGluIG9uZSBwbGFjZS4KLSAgJQotICAlIEZpcnN0IHdlIGhhbHZlIHRoZSBsaW5lIGxlbmd0aCwgbGVzcyBhIGxpdHRsZSBmb3IgdGhlIGd1dHRlciBiZXR3ZWVuCi0gICUgdGhlIGNvbHVtbnMuICBXZSBjb21wdXRlIHRoZSBndXR0ZXIgYmFzZWQgb24gdGhlIGxpbmUgbGVuZ3RoLCBzbyBpdAotICAlIGNoYW5nZXMgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwYXBlciBmb3JtYXQuICBUaGUgbWFnaWMgY29uc3RhbnQKLSAgJSBiZWxvdyBpcyBjaG9zZW4gc28gdGhhdCB0aGUgZ3V0dGVyIGhhcyB0aGUgc2FtZSB2YWx1ZSAod2VsbCwgKy08MXB0KQotICAlIGFzIGl0IGRpZCB3aGVuIHdlIGhhcmQtY29kZWQgaXQuCi0gICUKLSAgJSBXZSBwdXQgdGhlIHJlc3VsdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLCBcZG91YmxlY29sdW1oc2l6ZSwgc28gd2UKLSAgJSBjYW4gcmVzdG9yZSBpdCBpbiBccGFnZXNvZmFyLCBhZnRlciBcaHNpemUgaXRzZWxmIGhhcyAocG90ZW50aWFsbHkpCi0gICUgYmVlbiBjbG9iYmVyZWQuCi0gICUKLSAgXGRvdWJsZWNvbHVtbmhzaXplID0gXGhzaXplCi0gICAgXGFkdmFuY2VcZG91YmxlY29sdW1uaHNpemUgYnkgLS4wNDE1NFxoc2l6ZQotICAgIFxkaXZpZGVcZG91YmxlY29sdW1uaHNpemUgYnkgMgotICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKLSAgJQotICAlIERvdWJsZSB0aGUgXHZzaXplIGFzIHdlbGwuICAoV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIHJlZ2lzdGVyIGhlcmUsCi0gICUgc2luY2Ugbm9ib2R5IGNsb2JiZXJzIFx2c2l6ZS4pCi0gIFxhZHZhbmNlXHZzaXplIGJ5IC1caHRccGFydGlhbHBhZ2UKLSAgXHZzaXplID0gMlx2c2l6ZQotfQotCi0lIFRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBhbGwgZG91YmxlLWNvbHVtbiBwYWdlcyBleGNlcHQKLSUgdGhlIGxhc3QuCi0lCi1cZGVmXGRvdWJsZWNvbHVtbm91dHslCi0gIFxzcGxpdHRvcHNraXA9XHRvcHNraXAgXHNwbGl0bWF4ZGVwdGg9XG1heGRlcHRoCi0gICUgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSBkb3VibGUgY29sdW1ucyAtLSB0aGUgbm9ybWFsCi0gICUgKHVuZG91YmxlZCkgcGFnZSBoZWlnaHQgbWludXMgYW55IG1hdGVyaWFsIGxlZnQgb3ZlciBmcm9tIHRoZQotICAlIHByZXZpb3VzIHBhZ2UuCi0gIFxkaW1lbkAgPSBcdnNpemUKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMgotICAlCi0gICUgYm94MCB3aWxsIGJlIHRoZSBsZWZ0LWhhbmQgY29sdW1uLCBib3gyIHRoZSByaWdodC4KLSAgXHNldGJveDA9XHZzcGxpdDI1NSB0b1xkaW1lbkAgXHNldGJveDI9XHZzcGxpdDI1NSB0b1xkaW1lbkAKLSAgXG9uZXBhZ2VvdXRccGFnZXNvZmFyCi0gIFx1bnZib3gyNTUKLSAgXHBlbmFsdHlcb3V0cHV0cGVuYWx0eQotfQotXGRlZlxwYWdlc29mYXJ7JQotICAlIFJlLW91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBwYWdlIC0tIGFueSBwcmV2aW91cyBtYXRlcmlhbCwKLSAgJSBmb2xsb3dlZCBieSB0aGUgdHdvIGJveGVzIHdlIGp1c3Qgc3BsaXQsIGluIGJveDAgYW5kIGJveDIuCi0gIFx1bnZib3hccGFydGlhbHBhZ2UKLSAgJQotICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKLSAgXHdkMD1caHNpemUgXHdkMj1caHNpemUKLSAgXGhib3ggdG9ccGFnZXdpZHRoe1xib3gwXGhmaWxcYm94Mn0lCi19Ci1cZGVmXGVuZGRvdWJsZWNvbHVtbnN7JQotICBcb3V0cHV0ID0geyUKLSAgICAlIFNwbGl0IHRoZSBsYXN0IG9mIHRoZSBkb3VibGUtY29sdW1uIG1hdGVyaWFsLiAgTGVhdmUgaXQgb24gdGhlCi0gICAgJSBjdXJyZW50IHBhZ2UsIG5vIGF1dG9tYXRpYyBwYWdlIGJyZWFrLgotICAgIFxiYWxhbmNlY29sdW1ucwotICAgICUKLSAgICAlIElmIHdlIGVuZCB1cCBzcGxpdHRpbmcgdG9vIG11Y2ggbWF0ZXJpYWwgZm9yIHRoZSBjdXJyZW50IHBhZ2UsCi0gICAgJSB0aG91Z2gsIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMgXG91dHB1dAotICAgICUgaW52b2NhdGlvbiBlbmRzLiAgSGF2aW5nIGNhbGxlZCBcYmFsYW5jZWNvbHVtbnMgb25jZSwgd2UgZG8gbm90Ci0gICAgJSB3YW50IHRvIGNhbGwgaXQgYWdhaW4uICBUaGVyZWZvcmUsIHJlc2V0IFxvdXRwdXQgdG8gaXRzIG5vcm1hbAotICAgICUgZGVmaW5pdGlvbiByaWdodCBhd2F5LiAgKFdlIGhvcGUgXGJhbGFuY2Vjb2x1bW5zIHdpbGwgbmV2ZXIgYmUKLSAgICAlIGNhbGxlZCBvbiB0byBiYWxhbmNlIHRvbyBtdWNoIG1hdGVyaWFsLCBidXQgaWYgaXQgaXMsIHRoaXMgbWFrZXMKLSAgICAlIHRoZSBvdXRwdXQgc29tZXdoYXQgbW9yZSBwYWxhdGFibGUuKQotICAgIFxnbG9iYWxcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19JQotICB9JQotICBcZWplY3QKLSAgXGVuZGdyb3VwICUgc3RhcnRlZCBpbiBcYmVnaW5kb3VibGVjb2x1bW5zCi0gICUKLSAgJSBccGFnZWdvYWwgd2FzIHNldCB0byB0aGUgZG91YmxlZCBcdnNpemUgYWJvdmUsIHNpbmNlIHdlIHJlc3RhcnRlZAotICAlIHRoZSBjdXJyZW50IHBhZ2UuICBXZSdyZSBub3cgYmFjayB0byBub3JtYWwgc2luZ2xlLWNvbHVtbgotICAlIHR5cGVzZXR0aW5nLCBzbyByZXNldCBccGFnZWdvYWwgdG8gdGhlIG5vcm1hbCBcdnNpemUgKGFmdGVyIHRoZQotICAlIFxlbmRncm91cCB3aGVyZSBcdnNpemUgZ290IHJlc3RvcmVkKS4KLSAgXHBhZ2Vnb2FsID0gXHZzaXplCi19Ci1cZGVmXGJhbGFuY2Vjb2x1bW5zeyUKLSAgJSBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZG91YmxlIGNvbHVtbiBtYXRlcmlhbC4KLSAgXHNldGJveDAgPSBcdmJveHtcdW52Ym94MjU1fSUgbGlrZSBcYm94MjU1IGJ1dCBtb3JlIGVmZmljaWVudCwgc2VlIHAuMTIwLgotICBcZGltZW5AID0gXGh0MAotICBcYWR2YW5jZVxkaW1lbkAgYnkgXHRvcHNraXAKLSAgXGFkdmFuY2VcZGltZW5AIGJ5LVxiYXNlbGluZXNraXAKLSAgXGRpdmlkZVxkaW1lbkAgYnkgMiAlIHRhcmdldCB0byBzcGxpdCB0bwotICAlZGVidWdcbWVzc2FnZXtmaW5hbCAyLWNvbHVtbiBtYXRlcmlhbCBoZWlnaHQ9XHRoZVxodDAsIHRhcmdldD1cdGhlXGRpbWVuQC59JQotICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKLSAgJSBMb29wIHVudGlsIHdlIGdldCBhIGRlY2VudCBicmVha3BvaW50LgotICB7JQotICAgIFx2YmFkbmVzcyA9IDEwMDAwCi0gICAgXGxvb3AKLSAgICAgIFxnbG9iYWxcc2V0Ym94MyA9IFxjb3B5MAotICAgICAgXGdsb2JhbFxzZXRib3gxID0gXHZzcGxpdDMgdG8gXGRpbWVuQAotICAgIFxpZmRpbVxodDM+XGRpbWVuQAotICAgICAgXGdsb2JhbFxhZHZhbmNlXGRpbWVuQCBieSAxcHQKLSAgICBccmVwZWF0Ci0gIH0lCi0gICVkZWJ1Z1xtZXNzYWdle3NwbGl0IHRvIFx0aGVcZGltZW5ALCBjb2x1bW4gaGVpZ2h0czogXHRoZVxodDEsIFx0aGVcaHQzLn0lCi0gIFxzZXRib3gwPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94MX0lCi0gIFxzZXRib3gyPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94M30lCi0gICUKLSAgXHBhZ2Vzb2ZhcgotfQotXGNhdGNvZGVgXEAgPSBcb3RoZXIKLQotCi1cbWVzc2FnZXtzZWN0aW9uaW5nLH0KLSUgQ2hhcHRlcnMsIHNlY3Rpb25zLCBldGMuCi0KLVxuZXdjb3VudFxjaGFwbm8KLVxuZXdjb3VudFxzZWNubyAgICAgICAgXHNlY25vPTAKLVxuZXdjb3VudFxzdWJzZWNubyAgICAgXHN1YnNlY25vPTAKLVxuZXdjb3VudFxzdWJzdWJzZWNubyAgXHN1YnN1YnNlY25vPTAKLQotJSBUaGlzIGNvdW50ZXIgaXMgZnVubnkgc2luY2UgaXQgY291bnRzIHRocm91Z2ggY2hhcmNvZGVzIG9mIGxldHRlcnMgQSwgQiwgLi4uCi1cbmV3Y291bnRcYXBwZW5kaXhubyAgXGFwcGVuZGl4bm8gPSBgXEAKLSUgXGRlZlxhcHBlbmRpeGxldHRlcntcY2hhclx0aGVcYXBwZW5kaXhub30KLSUgV2UgZG8gdGhlIGZvbGxvd2luZyBmb3IgdGhlIHNha2Ugb2YgcGRmdGV4LCB3aGljaCBuZWVkcyB0aGUgYWN0dWFsCi0lIGxldHRlciBpbiB0aGUgZXhwYW5zaW9uLCBub3QganVzdCB0eXBlc2V0LgotXGRlZlxhcHBlbmRpeGxldHRlcnslCi0gIFxpZm51bVxhcHBlbmRpeG5vPWBBIEElCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEIgQiUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gQyBDJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBEIEQlCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEUgRSUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRiBGJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBHIEclCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEggSCUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSSBJJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBKIEolCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEsgSyUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTCBMJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBNIE0lCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YE4gTiUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTyBPJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBQIFAlCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFEgUSUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUiBSJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBTIFMlCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFQgVCUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gVSBVJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBWIFYlCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFcgVyUKLSAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gWCBYJQotICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBZIFklCi0gIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFogWiUKLSAgJSBUaGUgXHRoZSBpcyBuZWNlc3NhcnksIGRlc3BpdGUgYXBwZWFyYW5jZXMsIGJlY2F1c2UgXGFwcGVuZGl4bGV0dGVyIGlzCi0gICUgZXhwYW5kZWQgd2hpbGUgd3JpdGluZyB0aGUgLnRvYyBmaWxlLiAgXGNoYXJcYXBwZW5kaXhubyBpcyBub3QKLSAgJSBleHBhbmRhYmxlLCB0aHVzIGl0IGlzIHdyaXR0ZW4gbGl0ZXJhbGx5LCB0aHVzIGFsbCBhcHBlbmRpeGVzIGNvbWUgb3V0Ci0gICUgd2l0aCB0aGUgc2FtZSBsZXR0ZXIgKG9yIEApIGluIHRoZSB0b2Mgd2l0aG91dCBpdC4KLSAgXGVsc2VcY2hhclx0aGVcYXBwZW5kaXhubwotICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmkKLSAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpfQotCi0lIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjaGFwdGVyLgotJSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncyBjYW4gdXNlIGl0LiAgQHNlY3Rpb24gZG9lcyBsaWtld2lzZS4KLVxkZWZcdGhpc2NoYXB0ZXJ7fQotXGRlZlx0aGlzc2VjdGlvbnt9Ci0KLVxuZXdjb3VudFxhYnNzZWNsZXZlbCAlIHVzZWQgdG8gY2FsY3VsYXRlIHByb3BlciBoZWFkaW5nIGxldmVsCi1cbmV3Y291bnRcc2VjYmFzZVxzZWNiYXNlPTAgJSBAcmFpc2UvbG93ZXJzZWN0aW9ucyBtb2RpZnkgdGhpcyBjb3VudAotCi0lIEByYWlzZXNlY3Rpb25zOiB0cmVhdCBAc2VjdGlvbiBhcyBjaGFwdGVyLCBAc3Vic2VjdGlvbiBhcyBzZWN0aW9uLCBldGMuCi1cZGVmXHJhaXNlc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgLTF9Ci1cbGV0XHVwPVxyYWlzZXNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQGxvd2Vyc2VjdGlvbnM6IHRyZWF0IEBjaGFwdGVyIGFzIHNlY3Rpb24sIEBzZWN0aW9uIGFzIHN1YnNlY3Rpb24sIGV0Yy4KLVxkZWZcbG93ZXJzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAxfQotXGxldFxkb3duPVxsb3dlcnNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCi0KLSUgQ2hvb3NlIGEgbnVtYmVyZWQtaGVhZGluZyBtYWNybwotJSAjMSBpcyBoZWFkaW5nIGxldmVsIGlmIHVubW9kaWZpZWQgYnkgQHJhaXNlc2VjdGlvbnMgb3IgQGxvd2Vyc2VjdGlvbnMKLSUgIzIgaXMgdGV4dCBmb3IgaGVhZGluZwotXGRlZlxudW1oZWFkIzEjMntcYWJzc2VjbGV2ZWw9XHNlY2Jhc2VcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSAjMQotXGlmY2FzZVxhYnNzZWNsZXZlbAotICBcY2hhcHRlcnp6ensjMn0KLVxvcgotICBcc2Vjenp6eyMyfQotXG9yCi0gIFxudW1iZXJlZHN1YnNlY3p6ensjMn0KLVxvcgotICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcY2hhcHRlcnp6ensjMn0KLSAgXGVsc2UKLSAgICBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgYXBwZW5kaXggaGVhZGluZyBsZXZlbHMKLVxkZWZcYXBwaGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXGFwcGVuZGl4enp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHNlY3Rpb256enp7IzJ9Ci1cb3IKLSAgXGFwcGVuZGl4c3Vic2Vjenp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHN1YnN1YnNlY3p6ensjMn0KLVxlbHNlCi0gIFxpZm51bSBcYWJzc2VjbGV2ZWw8MAotICAgIFxhcHBlbmRpeHp6ensjMn0KLSAgXGVsc2UKLSAgICBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgbGlrZSBcbnVtaGVhZCwgYnV0IGNob29zZXMgbnVtYmVybGVzcyBoZWFkaW5nIGxldmVscwotXGRlZlx1bm5taGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXHVubnVtYmVyZWR6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcdW5udW1iZXJlZHp6ensjMn0KLSAgXGVsc2UKLSAgICBcdW5udW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLSAgXGZpCi1cZmkKLX0KLQotJSBAY2hhcHRlciwgQGFwcGVuZGl4LCBAdW5udW1iZXJlZC4KLVxkZWZcdGhpc2NoYXB0ZXJuYW1le05vIENoYXB0ZXIgVGl0bGV9Ci1cb3V0ZXJcZGVmXGNoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ5eXl9Ci1cZGVmXGNoYXB0ZXJ5eXkgIzF7XG51bWhlYWQweyMxfX0gJSBub3JtYWxseSBudW1oZWFkMCBjYWxscyBjaGFwdGVyenp6Ci1cZGVmXGNoYXB0ZXJ6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcY2hhcG5vIGJ5IDEgXG1lc3NhZ2V7XHB1dHdvcmRDaGFwdGVyXHNwYWNlIFx0aGVcY2hhcG5vfSUKLVxjaGFwbWFjcm8geyMxfXtcdGhlXGNoYXBub30lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotJSBXZSBkb24ndCBzdWJzdGl0dXRlIHRoZSBhY3R1YWwgY2hhcHRlciBuYW1lIGludG8gXHRoaXNjaGFwdGVyCi0lIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdHMgbWFjcm9zIGV2YWx1YXRlZCBub3cuCi1ceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZENoYXB0ZXJ7fSBcdGhlXGNoYXBubzogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh5eXl9Ci1cZGVmXGFwcGVuZGl4eXl5ICMxe1xhcHBoZWFkMHsjMX19ICUgbm9ybWFsbHkgYXBwaGVhZDAgY2FsbHMgYXBwZW5kaXh6enoKLVxkZWZcYXBwZW5kaXh6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLVxnbG9iYWxcYWR2YW5jZSBcYXBwZW5kaXhubyBieSAxCi1cbWVzc2FnZXtccHV0d29yZEFwcGVuZGl4XHNwYWNlIFxhcHBlbmRpeGxldHRlcn0lCi1cY2hhcG1hY3JvIHsjMX17XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcn0lCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQotXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcjogXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBjaGFwZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgIHtccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcYXBwZW5kaXhzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzdWJzZWMKLX0KLQotJSBAY2VudGVyY2hhcCBpcyBsaWtlIEB1bm51bWJlcmVkLCBidXQgdGhlIGhlYWRpbmcgaXMgY2VudGVyZWQuCi1cb3V0ZXJcZGVmXGNlbnRlcmNoYXB7XHBhcnNlYXJnXGNlbnRlcmNoYXB5eXl9Ci1cZGVmXGNlbnRlcmNoYXB5eXkgIzF7e1xsZXRcdW5udW1iY2hhcG1hY3JvPVxjZW50ZXJjaGFwbWFjcm8gXHVubnVtYmVyZWR5eXl7IzF9fX0KLQotJSBAdG9wIGlzIGxpa2UgQHVubnVtYmVyZWQuCi1cb3V0ZXJcZGVmXHRvcHtccGFyc2VhcmdcdW5udW1iZXJlZHl5eX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVke1xwYXJzZWFyZ1x1bm51bWJlcmVkeXl5fQotXGRlZlx1bm51bWJlcmVkeXl5ICMxe1x1bm5taGVhZDB7IzF9fSAlIG5vcm1hbGx5IHVubm1oZWFkMCBjYWxscyB1bm51bWJlcmVkenp6Ci1cZGVmXHVubnVtYmVyZWR6enogIzF7JQotXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAKLSUKLSUgVGhpcyB1c2VkIHRvIGJlIHNpbXBseSBcbWVzc2FnZXsjMX0sIGJ1dCBUZVggZnVsbHkgZXhwYW5kcyB0aGUKLSUgYXJndW1lbnQgdG8gXG1lc3NhZ2UuICBUaGVyZWZvcmUsIGlmICMxIGNvbnRhaW5lZCBALWNvbW1hbmRzLCBUZVgKLSUgZXhwYW5kZWQgdGhlbS4gIEZvciBleGFtcGxlLCBpbiBgQHVubnVtYmVyZWQgVGhlIEBjaXRle0Jvb2t9JywgVGVYCi0lIGV4cGFuZGVkIEBjaXRlICh3aGljaCB0dXJucyBvdXQgdG8gY2F1c2UgZXJyb3JzIGJlY2F1c2UgXGNpdGUgaXMgbWVhbnQKLSUgdG8gYmUgZXhlY3V0ZWQsIG5vdCBleHBhbmRlZCkuCi0lCi0lIEFueXdheSwgd2UgZG9uJ3Qgd2FudCB0aGUgZnVsbHktZXhwYW5kZWQgZGVmaW5pdGlvbiBvZiBAY2l0ZSB0byBhcHBlYXIKLSUgYXMgYSByZXN1bHQgb2YgdGhlIFxtZXNzYWdlLCB3ZSBqdXN0IHdhbnQgYEBjaXRlJyBpdHNlbGYuICBXZSB1c2UKLSUgXHRoZTx0b2tzIHJlZ2lzdGVyPiB0byBhY2hpZXZlIHRoaXM6IFRlWCBleHBhbmRzIFx0aGU8dG9rcz4gb25seSBvbmNlLAotJSBzaW1wbHkgeWllbGRpbmcgdGhlIGNvbnRlbnRzIG9mIDx0b2tzIHJlZ2lzdGVyPi4gIChXZSBhbHNvIGRvIHRoaXMgZm9yCi0lIHRoZSB0b2MgZW50cmllcy4pCi1cdG9rczAgPSB7IzF9XG1lc3NhZ2V7KFx0aGVcdG9rczApfSUKLSUKLVx1bm51bWJjaGFwbWFjcm8geyMxfSUKLVxnZGVmXHRoaXNjaGFwdGVyeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYmNoYXBlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXHVubnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic3Vic2VjCi19Ci0KLSUgU2VjdGlvbnMuCi1cb3V0ZXJcZGVmXG51bWJlcmVkc2Vje1xwYXJzZWFyZ1xzZWN5eXl9Ci1cZGVmXHNlY3l5eSAjMXtcbnVtaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHNlY3p6egotXGRlZlxzZWN6enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN0aW9ue1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3l5eX0KLVxvdXRlclxkZWZcYXBwZW5kaXhzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c2VjeXl5fQotXGRlZlxhcHBlbmRpeHNlY3l5eSAjMXtcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egotXGRlZlxhcHBlbmRpeHNlY3Rpb256enogIzF7JQotXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc2VjeXl5ICMxe1x1bm5taGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzZWN6enoKLVxkZWZcdW5udW1iZXJlZHNlY3p6eiAjMXslCi1ccGxhaW5zZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzZWNlbnRyeXtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic2VjeXl5ICMxe1xudW1oZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgbnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic2VjeXl5ICMxe1xhcHBoZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzdWJzZWNubyBieSAxICUKLVxzdWJzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHN1YnNlY3l5eSAjMXtcdW5ubWhlYWQyeyMxfX0gJW5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzdWJzZWN6enoKLVxkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiAjMXslCi1ccGxhaW5zdWJzZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzdWJzZWNlbnRyeSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFN1YnN1YnNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHN1YnN1YnNlY3tccGFyc2VhcmdcbnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXG51bWJlcmVkc3Vic3Vic2VjeXl5ICMxe1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKLVxkZWZcbnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzdWJzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c3Vic3Vic2VjeXl5ICMxe1xhcHBoZWFkM3sjMX19ICUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6enoKLVxkZWZcYXBwZW5kaXhzdWJzdWJzZWN6enogIzF7JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKLVxzdWJzdWJzZWNoZWFkaW5nIHsjMX0KLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN5eXkgIzF7XHVubm1oZWFkM3sjMX19ICVub3JtYWxseSB1bm51bWJlcmVkc3Vic3Vic2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN6enogIzF7JQotXHBsYWluc3Vic3Vic2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic3Vic2VjZW50cnklCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBUaGVzZSBhcmUgdmFyaWFudHMgd2hpY2ggYXJlIG5vdCAib3V0ZXIiLCBzbyB0aGV5IGNhbiBhcHBlYXIgaW4gQGlmaW5mby4KLSUgQWN0dWFsbHksIHRoZXkgc2hvdWxkIG5vdyBiZSBvYnNvbGV0ZTsgb3JkaW5hcnkgc2VjdGlvbiBjb21tYW5kcyBzaG91bGQgd29yay4KLVxkZWZcaW5mb3RvcHtccGFyc2VhcmdcdW5udW1iZXJlZHp6en0KLVxkZWZcaW5mb3VubnVtYmVyZWR7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc2Vjenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3p6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN6enp9Ci0KLVxkZWZcaW5mb2FwcGVuZGl4e1xwYXJzZWFyZ1xhcHBlbmRpeHp6en0KLVxkZWZcaW5mb2FwcGVuZGl4c2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnNlY3p6en0KLVxkZWZcaW5mb2FwcGVuZGl4c3Vic3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnN1YnNlY3p6en0KLQotXGRlZlxpbmZvY2hhcHRlcntccGFyc2VhcmdcY2hhcHRlcnp6en0KLVxkZWZcaW5mb3NlY3Rpb257XHBhcnNlYXJnXHNlY3Rpb256enp9Ci1cZGVmXGluZm9zdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzZWN0aW9uenp6fQotXGRlZlxpbmZvc3Vic3Vic2VjdGlvbntccGFyc2Vhcmdcc3Vic3Vic2VjdGlvbnp6en0KLQotJSBUaGVzZSBtYWNyb3MgY29udHJvbCB3aGF0IHRoZSBzZWN0aW9uIGNvbW1hbmRzIGRvLCBhY2NvcmRpbmcKLSUgdG8gd2hhdCBraW5kIG9mIGNoYXB0ZXIgd2UgYXJlIGluIChvcmRpbmFyeSwgYXBwZW5kaXgsIG9yIHVubnVtYmVyZWQpLgotJSBEZWZpbmUgdGhlbSBieSBkZWZhdWx0IGZvciBhIG51bWJlcmVkIGNoYXB0ZXIuCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCi0KLSUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZwotCi0lIE5PVEUgb24gdXNlIG9mIFx2Ym94IGZvciBjaGFwdGVyIGhlYWRpbmdzLCBzZWN0aW9uIGhlYWRpbmdzLCBhbmQgc3VjaDoKLSUgICAgICAgMSkgV2UgdXNlIFx2Ym94IHJhdGhlciB0aGFuIHRoZSBlYXJsaWVyIFxsaW5lIHRvIHBlcm1pdAotJSAgICAgICAgICBvdmVybG9uZyBoZWFkaW5ncyB0byBmb2xkLgotJSAgICAgICAyKSBcaHlwaGVucGVuYWx0eSBpcyBzZXQgdG8gMTAwMDAgYmVjYXVzZSBoeXBoZW5hdGlvbiBpbiBhCi0lICAgICAgICAgIGhlYWRpbmcgaXMgb2Jub3hpb3VzOyB0aGlzIGZvcmJpZHMgaXQuCi0lICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKLSUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgotCi0KLVxkZWZcbWFqb3JoZWFkaW5ne1xwYXJzZWFyZ1xtYWpvcmhlYWRpbmd6enp9Ci1cZGVmXG1ham9yaGVhZGluZ3p6eiAjMXslCi17XGFkdmFuY2VcY2hhcGhlYWRpbmdza2lwIGJ5IDEwcHQgXGNoYXBicmVhayB9JQote1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDB9Ci0KLVxkZWZcY2hhcGhlYWRpbmd7XHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6fQotXGRlZlxjaGFwaGVhZGluZ3p6eiAjMXtcY2hhcGJyZWFrICUKLXtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwfQotCi0lIEBoZWFkaW5nLCBAc3ViaGVhZGluZywgQHN1YnN1YmhlYWRpbmcuCi1cZGVmXGhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc2VjaGVhZGluZ30KLVxkZWZcc3ViaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zdWJzZWNoZWFkaW5nfQotXGRlZlxzdWJzdWJoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnN1YnN1YnNlY2hlYWRpbmd9Ci0KLSUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGEgY2hhcHRlciwgc2VjdGlvbiwgZXRjLiBoZWFkaW5nIG9ubHkKLSUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKLSUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KLQotJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQotXGRlZlxkb2JyZWFrIzEjMntccGFyXGlmZGltXGxhc3Rza2lwPCMxXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHkjMlx2c2tpcCMxXGZpfQotCi1cZGVmXHNldGNoYXB0ZXJzdHlsZSAjMSB7XGNzbmFtZSBDSEFQRiMxXGVuZGNzbmFtZX0KLQotJSUlIERlZmluZSBwbGFpbiBjaGFwdGVyIHN0YXJ0cywgYW5kIHBhZ2Ugb24vb2ZmIHN3aXRjaGluZyBmb3IgaXQKLSUgUGFyYW1ldGVyIGNvbnRyb2xsaW5nIHNraXAgYmVmb3JlIGNoYXB0ZXIgaGVhZGluZ3MgKGlmIG5lZWRlZCkKLQotXG5ld3NraXBcY2hhcGhlYWRpbmdza2lwCi0KLVxkZWZcY2hhcGJyZWFre1xkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXAgey00MDAwfX0KLVxkZWZcY2hhcHBhZ2Vye1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KLVxkZWZcY2hhcG9kZHBhZ2V7XGNoYXBwYWdlciBcaWZvZGRccGFnZW5vIFxlbHNlIFxoYm94IHRvIDBwdHt9IFxjaGFwcGFnZXJcZml9Ci0KLVxkZWZcc2V0Y2hhcHRlcm5ld3BhZ2UgIzEge1xjc25hbWUgQ0hBUFBBRyMxXGVuZGNzbmFtZX0KLQotXGRlZlxDSEFQUEFHb2ZmeyUKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBicmVhawotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcn0KLQotXGRlZlxDSEFQUEFHb257JQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyCi1cZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU3NpbmdsZX19Ci0KLVxkZWZcQ0hBUFBBR29kZHsKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcG9kZHBhZ2UKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwb2RkcGFnZQotXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9fQotCi1cQ0hBUFBBR29uCi0KLVxkZWZcQ0hBUEZwbGFpbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmcGxhaW4KLVxnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmcGxhaW4KLVxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmcGxhaW59Ci0KLSUgUGxhaW4gY2hhcHRlciBvcGVuaW5nLgotJSAjMSBpcyB0aGUgdGV4dCwgIzIgdGhlIGNoYXB0ZXIgbnVtYmVyIG9yIGVtcHR5IGlmIHVubnVtYmVyZWQuCi1cZGVmXGNoZnBsYWluIzEjMnslCi0gIFxwY2hhcHNlcG1hY3JvCi0gIHslCi0gICAgXGNoYXBmb250cyBccm0KLSAgICBcZGVmXGNoYXBudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XGNoYXBudW1cZW1wdHlcZWxzZVxlbnNwYWNlXGZpfSUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwIFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUKLSAgICAgICAgICBcdW5oYm94MCAjMVxwYXJ9JQotICB9JQotICBcbm9icmVha1xiaWdza2lwICUgbm8gcGFnZSBicmVhayBhZnRlciBhIGNoYXB0ZXIgdGl0bGUKLSAgXG5vYnJlYWsKLX0KLQotJSBQbGFpbiBvcGVuaW5nIGZvciB1bm51bWJlcmVkLgotXGRlZlx1bm5jaGZwbGFpbiMxe1xjaGZwbGFpbnsjMX17fX0KLQotJSBAY2VudGVyY2hhcCAtLSBjZW50ZXJlZCBhbmQgdW5udW1iZXJlZC4KLVxsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXHJlbGF4Ci1cZGVmXGNlbnRlcmNoZnBsYWluIzF7eyUKLSAgXGRlZlxjZW50ZXJwYXJhbWV0ZXJzbWF5YmV7JQotICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAzXHJpZ2h0c2tpcAotICAgIFxsZWZ0c2tpcCA9IFxyaWdodHNraXAKLSAgICBccGFyZmlsbHNraXAgPSAwcHQKLSAgfSUKLSAgXGNoZnBsYWlueyMxfXt9JQotfX0KLQotXENIQVBGcGxhaW4gJSBUaGUgZGVmYXVsdAotCi1cZGVmXHVubmNoZm9wZW4gIzF7JQotXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCi19Ci0KLVxkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cwotXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKLVxwYXJccGVuYWx0eSA1MDAwICUKLX0KLQotXGRlZlxjZW50ZXJjaGZvcGVuICMxeyUKLVxjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdAotICAgICAgICAgICAgICAgICAgICAgICBcaGZpbGwge1xybSAjMX1caGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawotfQotCi1cZGVmXENIQVBGb3BlbnsKLVxnbG9iYWxcbGV0XGNoYXBtYWNybz1cY2hmb3BlbgotXGdsb2JhbFxsZXRcdW5udW1iY2hhcG1hY3JvPVx1bm5jaGZvcGVuCi1cZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZm9wZW59Ci0KLQotJSBTZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwXHNlY2hlYWRpbmdza2lwCi1cZGVmXHNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc2VjaGVhZGluZ3NraXAgey0xMDAwfX0KLVxkZWZcc2VjaGVhZGluZyMxIzIjM3tcc2VjdGlvbmhlYWRpbmd7c2VjfXsjMi4jM317IzF9fQotXGRlZlxwbGFpbnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c2VjfXt9eyMxfX0KLQotJSBTdWJzZWN0aW9uIHRpdGxlcy4KLVxuZXdza2lwIFxzdWJzZWNoZWFkaW5nc2tpcAotXGRlZlxzdWJzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHN1YnNlY2hlYWRpbmdza2lwIHstNTAwfX0KLVxkZWZcc3Vic2VjaGVhZGluZyMxIzIjMyM0e1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9eyMyLiMzLiM0fXsjMX19Ci1cZGVmXHBsYWluc3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzZWN9e317IzF9fQotCi0lIFN1YnN1YnNlY3Rpb24gdGl0bGVzLgotXGxldFxzdWJzdWJzZWNoZWFkaW5nc2tpcCA9IFxzdWJzZWNoZWFkaW5nc2tpcAotXGxldFxzdWJzdWJzZWNoZWFkaW5nYnJlYWsgPSBcc3Vic2VjaGVhZGluZ2JyZWFrCi1cZGVmXHN1YnN1YnNlY2hlYWRpbmcjMSMyIzMjNCM1e1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9eyMyLiMzLiM0LiM1fXsjMX19Ci1cZGVmXHBsYWluc3Vic3Vic2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzdWJzdWJzZWN9e317IzF9fQotCi0KLSUgUHJpbnQgYW55IHNpemUgc2VjdGlvbiB0aXRsZS4KLSUKLSUgIzEgaXMgdGhlIHNlY3Rpb24gdHlwZSAoc2VjL3N1YnNlYy9zdWJzdWJzZWMpLCAjMiBpcyB0aGUgc2VjdGlvbgotJSBudW1iZXIgKG1heWJlIGVtcHR5KSwgIzMgdGhlIHRleHQuCi1cZGVmXHNlY3Rpb25oZWFkaW5nIzEjMiMzeyUKLSAgeyUKLSAgICBcZXhwYW5kYWZ0ZXJcYWR2YW5jZVxjc25hbWUgIzFoZWFkaW5nc2tpcFxlbmRjc25hbWUgYnkgXHBhcnNraXAKLSAgICBcY3NuYW1lICMxaGVhZGluZ2JyZWFrXGVuZGNzbmFtZQotICB9JQotICB7JQotICAgICUgU3dpdGNoIHRvIHRoZSByaWdodCBzZXQgb2YgZm9udHMuCi0gICAgXGNzbmFtZSAjMWZvbnRzXGVuZGNzbmFtZSBccm0KLSAgICAlCi0gICAgJSBPbmx5IGluc2VydCB0aGUgc2VwYXJhdGluZyBzcGFjZSBpZiB3ZSBoYXZlIGEgc2VjdGlvbiBudW1iZXIuCi0gICAgXGRlZlxzZWNudW17IzJ9JQotICAgIFxzZXRib3gwID0gXGhib3h7IzJcaWZ4XHNlY251bVxlbXB0eVxlbHNlXGVuc3BhY2VcZml9JQotICAgICUKLSAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgXGhhbmdpbmRlbnQgPSBcd2QwICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgotICAgICAgICAgIFx1bmhib3gwICMzfSUKLSAgfSUKLSAgXGlmZGltXHBhcnNraXA8MTBwdCBcbm9icmVha1xrZXJuMTBwdFxub2JyZWFrXGtlcm4tXHBhcnNraXBcZmkgXG5vYnJlYWsKLX0KLQotCi1cbWVzc2FnZXt0b2MsfQotJSBUYWJsZSBvZiBjb250ZW50cy4KLVxuZXd3cml0ZVx0b2NmaWxlCi0KLSUgV3JpdGUgYW4gZW50cnkgdG8gdGhlIHRvYyBmaWxlLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSUgQ2FsbGVkIGZyb20gQGNoYXB0ZXIsIGV0Yy4gIFdlIHN1cHBseSB7XGZvbGlvfSBhdCB0aGUgZW5kIG9mIHRoZQotJSBhcmd1bWVudCwgd2hpY2ggd2lsbCBlbmQgdXAgYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlIFwuLi5lbnRyeSBtYWNyby4KLSUKLSUgV2Ugb3BlbiB0aGUgLnRvYyBmaWxlIGhlcmUgaW5zdGVhZCBvZiBhdCBAc2V0ZmlsZW5hbWUgb3IgYW55IG90aGVyCi0lIGdpdmVuIHRpbWUgc28gdGhhdCBAY29udGVudHMgY2FuIGJlIHB1dCBpbiB0aGUgZG9jdW1lbnQgYW55d2hlcmUuCi0lCi1cbmV3aWZcaWZ0b2NmaWxlb3BlbmVkCi1cZGVmXHdyaXRldG9jZW50cnkjMXslCi0gIFxpZnRvY2ZpbGVvcGVuZWRcZWxzZQotICAgIFxpbW1lZGlhdGVcb3Blbm91dFx0b2NmaWxlID0gXGpvYm5hbWUudG9jCi0gICAgXGdsb2JhbFx0b2NmaWxlb3BlbmVkdHJ1ZQotICBcZmkKLSAgXGlmbGlua3MgXHdyaXRlXHRvY2ZpbGV7IzF7XGZvbGlvfX1cZmkKLX0KLQotXG5ld3NraXBcY29udGVudHNyaWdodG1hcmdpbiBcY29udGVudHNyaWdodG1hcmdpbj0xaW4KLVxuZXdjb3VudFxzYXZlcGFnZW5vCi1cbmV3Y291bnRcbGFzdG5lZ2F0aXZlcGFnZW5vIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSAtMQotCi0lIEZpbmlzaCB1cCB0aGUgbWFpbiB0ZXh0IGFuZCBwcmVwYXJlIHRvIHJlYWQgd2hhdCB3ZSd2ZSB3cml0dGVuCi0lIHRvIFx0b2NmaWxlLgotJQotXGRlZlxzdGFydGNvbnRlbnRzIzF7JQotICAgJSBJZiBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24sIGFuZCBAaGVhZGluZ3MgZG91YmxlLCB0aGUgY29udGVudHMgc2hvdWxkCi0gICAlIHN0YXJ0IG9uIGFuIG9kZCBwYWdlLCB1bmxpa2UgY2hhcHRlcnMuICBUaHVzLCB3ZSBtYWludGFpbgotICAgJSBcY29udGVudHNhbGlnbm1hY3JvIGluIHBhcmFsbGVsIHdpdGggXHBhZ2VhbGlnbm1hY3JvLgotICAgJSBGcm9tOiBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+Ci0gICBcY29udGVudHNhbGlnbm1hY3JvCi0gICBcaW1tZWRpYXRlXGNsb3Nlb3V0XHRvY2ZpbGUKLSAgICUKLSAgICUgRG9uJ3QgbmVlZCB0byBwdXQgYENvbnRlbnRzJyBvciBgU2hvcnQgQ29udGVudHMnIGluIHRoZSBoZWFkbGluZS4KLSAgICUgSXQgaXMgYWJ1bmRhbnRseSBjbGVhciB3aGF0IHRoZXkgYXJlLgotICAgXHVubnVtYmNoYXBtYWNyb3sjMX1cZGVmXHRoaXNjaGFwdGVye30lCi0gICBcc2F2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxiZWdpbmdyb3VwICAgICAgICAgICAgICAgICAgJSBTZXQgdXAgdG8gaGFuZGxlIGNvbnRlbnRzIGZpbGVzIHByb3Blcmx5LgotICAgICAgXGNhdGNvZGVgXFw9MCAgXGNhdGNvZGVgXHs9MSAgXGNhdGNvZGVgXH09MiAgXGNhdGNvZGVgXEA9MTEKLSAgICAgICUgV2UgY2FuJ3QgZG8gdGhpcywgYmVjYXVzZSB0aGVuIGFuIGFjdHVhbCBeIGluIGEgc2VjdGlvbgotICAgICAgJSB0aXRsZSBmYWlscywgZS5nLiwgQGNoYXB0ZXIgXiAtLSBleHBvbmVudGlhdGlvbi4gIC0ta2FybCwgOWp1bDk3LgotICAgICAgJVxjYXRjb2RlYFxePTcgJSB0byBzZWUgXl5lNCBhcyBcImEgZXRjLiBqdWhhQHBpdWhhLnlkaS52dHQuZmkKLSAgICAgIFxyYWdnZWRib3R0b20gICAgICAgICAgICAgJSBXb3JyeSBtb3JlIGFib3V0IGJyZWFrcG9pbnRzIHRoYW4gdGhlIGJvdHRvbS4KLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cY29udGVudHNyaWdodG1hcmdpbiAlIERvbid0IHVzZSB0aGUgZnVsbCBsaW5lIGxlbmd0aC4KLSAgICAgICUKLSAgICAgICUgUm9tYW4gbnVtZXJhbHMgZm9yIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxpZm51bSBccGFnZW5vPjAgXHBhZ2VubyA9IFxsYXN0bmVnYXRpdmVwYWdlbm8gXGZpCi19Ci0KLQotJSBOb3JtYWwgKGxvbmcpIHRvYy4KLVxkZWZcY29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRUT0N9JQotICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgIFxpZmVvZiAxIFxlbHNlCi0gICAgICAgXGNsb3NlaW4gMQotICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgXGZpCi0gICAgIFx2ZmlsbCBcZWplY3QKLSAgICAgXGNvbnRlbnRzYWxpZ25tYWNybyAlIGluIGNhc2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9kZCBpcyBpbiBlZmZlY3QKLSAgICAgXHBkZm1ha2VvdXRsaW5lcwotICAgXGVuZGdyb3VwCi0gICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubwotICAgXHBhZ2VubyA9IFxzYXZlcGFnZW5vCi19Ci0KLSUgQW5kIGp1c3QgdGhlIGNoYXB0ZXJzLgotXGRlZlxzdW1tYXJ5Y29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRTaG9ydFRPQ30lCi0gICAgICAlCi0gICAgICBcbGV0XGNoYXBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQotICAgICAgXGxldFx1bm51bWJjaGFwZW50cnkgPSBcc2hvcnR1bm51bWJlcmVkZW50cnkKLSAgICAgICUgV2Ugd2FudCBhIHRydWUgcm9tYW4gaGVyZSBmb3IgdGhlIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxzZWNmb250cwotICAgICAgXGxldFxybT1cc2hvcnRjb250cm0gXGxldFxiZj1cc2hvcnRjb250YmYgXGxldFxzbD1cc2hvcnRjb250c2wKLSAgICAgIFxybQotICAgICAgXGh5cGhlbnBlbmFsdHkgPSAxMDAwMAotICAgICAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIGJ5IDFwdCAlIE9wZW4gaXQgdXAgYSBsaXR0bGUuCi0gICAgICBcZGVmXHNlY2VudHJ5ICMjMSMjMiMjMyMjNHt9Ci0gICAgICBcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNXt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNSMjNnt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgICBcaWZlb2YgMSBcZWxzZQotICAgICAgICBcY2xvc2VpbiAxCi0gICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgIFxmaQotICAgICBcdmZpbGwgXGVqZWN0Ci0gICAgIFxjb250ZW50c2FsaWdubWFjcm8gJSBpbiBjYXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvZGQgaXMgaW4gZWZmZWN0Ci0gICBcZW5kZ3JvdXAKLSAgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCi0gICBccGFnZW5vID0gXHNhdmVwYWdlbm8KLX0KLVxsZXRcc2hvcnRjb250ZW50cyA9IFxzdW1tYXJ5Y29udGVudHMKLQotXGlmcGRmCi0gIFxwZGZjYXRhbG9ney9QYWdlTW9kZSAvVXNlT3V0bGluZXN9JQotXGZpCi0KLSUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgdGFibGUgb2YgY29udGVudHMuCi0lIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY2hhcHRlciBvciBzZWN0aW9uIG5hbWUuCi0lIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBwYWdlIG51bWJlci4KLSUgVGhlIGFyZ3VtZW50cyBpbiBiZXR3ZWVuIGFyZSB0aGUgY2hhcHRlciBudW1iZXIsIHNlY3Rpb24gbnVtYmVyLCAuLi4KLQotJSBDaGFwdGVyLWxldmVsIHRoaW5ncywgZm9yIGJvdGggdGhlIGxvbmcgYW5kIHNob3J0IGNvbnRlbnRzLgotXGRlZlxjaGFwZW50cnkjMSMyIzN7XGRvY2hhcGVudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzN9fQotCi0lIFNlZSBjb21tZW50cyBpbiBcZG9jaGFwZW50cnkgcmUgdmJveCBhbmQgcmVsYXRlZCBzZXR0aW5ncwotXGRlZlxzaG9ydGNoYXBlbnRyeSMxIzIjM3slCi0gIFx0b2NlbnRyeXtcc2hvcnRjaGFwbGFiZWx7IzJ9XGxhYmVsc3BhY2UgIzF9e1xkb3Nob3J0cGFnZW5vXGJncm91cCMzXGVncm91cH0lCi19Ci0KLSUgVHlwZXNldCB0aGUgbGFiZWwgZm9yIGEgY2hhcHRlciBvciBhcHBlbmRpeCBmb3IgdGhlIHNob3J0IGNvbnRlbnRzLgotJSBUaGUgYXJnIGlzLCBlLmcuIGBBcHBlbmRpeCBBJyBmb3IgYW4gYXBwZW5kaXgsIG9yIGAzJyBmb3IgYSBjaGFwdGVyLgotJSBXZSBjb3VsZCBzaW1wbGlmeSB0aGUgY29kZSBoZXJlIGJ5IHdyaXRpbmcgb3V0IGFuIFxhcHBlbmRpeGVudHJ5Ci0lIGNvbW1hbmQgaW4gdGhlIHRvYyBmaWxlIGZvciBhcHBlbmRpY2VzLCBpbnN0ZWFkIG9mIHVzaW5nIFxjaGFwZW50cnkKLSUgZm9yIGJvdGgsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gd29ydGggaXQuCi0lCi1cbmV3ZGltZW5cc2hvcnRhcHBlbmRpeHdpZHRoCi0lCi1cZGVmXHNob3J0Y2hhcGxhYmVsIzF7JQotICAlIENvbXB1dGUgd2lkdGggb2Ygd29yZCAiQXBwZW5kaXgiLCBtYXkgY2hhbmdlIHdpdGggbGFuZ3VhZ2UuCi0gIFxzZXRib3gwID0gXGhib3h7XHNob3J0Y29udHJtIFxwdXR3b3JkQXBwZW5kaXh9JQotICBcc2hvcnRhcHBlbmRpeHdpZHRoID0gXHdkMAotICAlCi0gICUgV2UgdHlwZXNldCAjMSBpbiBhIGJveCBvZiBjb25zdGFudCB3aWR0aCwgcmVnYXJkbGVzcyBvZiB0aGUgdGV4dCBvZgotICAlICMxLCBzbyB0aGUgY2hhcHRlciB0aXRsZXMgd2lsbCBjb21lIG91dCBhbGlnbmVkLgotICBcc2V0Ym94MCA9IFxoYm94eyMxfSUKLSAgXGRpbWVuMCA9IFxpZmRpbVx3ZDAgPiBcc2hvcnRhcHBlbmRpeHdpZHRoIFxzaG9ydGFwcGVuZGl4d2lkdGggXGVsc2UgMHB0IFxmaQotICAlCi0gICUgVGhpcyBzcGFjZSBzaG91bGQgYmUgcGxlbnR5LCBzaW5jZSBhIHNpbmdsZSBudW1iZXIgaXMgLjVlbSwgYW5kIHRoZQotICAlIHdpZGVzdCBsZXR0ZXIgKE0pIGlzIDFlbSwgYXQgbGVhc3QgaW4gdGhlIENvbXB1dGVyIE1vZGVybiBmb250cy4KLSAgJSAoVGhpcyBzcGFjZSBkb2Vzbid0IGluY2x1ZGUgdGhlIGV4dHJhIHNwYWNlIHRoYXQgZ2V0cyBhZGRlZCBhZnRlcgotICAlIHRoZSBsYWJlbDsgdGhhdCBnZXRzIHB1dCBpbiBieSBcc2hvcnRjaGFwZW50cnkgYWJvdmUuKQotICBcYWR2YW5jZVxkaW1lbjAgYnkgMS4xZW0KLSAgXGhib3ggdG8gXGRpbWVuMHsjMVxoZmlsfSUKLX0KLQotXGRlZlx1bm51bWJjaGFwZW50cnkjMSMye1xkb2NoYXBlbnRyeXsjMX17IzJ9fQotXGRlZlxzaG9ydHVubnVtYmVyZWRlbnRyeSMxIzJ7XHRvY2VudHJ5eyMxfXtcZG9zaG9ydHBhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9fQotCi0lIFNlY3Rpb25zLgotXGRlZlxzZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMyLiMzXGxhYmVsc3BhY2UjMX17IzR9fQotXGRlZlx1bm51bWJzZWNlbnRyeSMxIzJ7XGRvc2VjZW50cnl7IzF9eyMyfX0KLQotJSBTdWJzZWN0aW9ucy4KLVxkZWZcc3Vic2VjZW50cnkjMSMyIzMjNCM1e1xkb3N1YnNlY2VudHJ5eyMyLiMzLiM0XGxhYmVsc3BhY2UjMX17IzV9fQotXGRlZlx1bm51bWJzdWJzZWNlbnRyeSMxIzJ7XGRvc3Vic2VjZW50cnl7IzF9eyMyfX0KLQotJSBBbmQgc3Vic3Vic2VjdGlvbnMuCi1cZGVmXHN1YnN1YnNlY2VudHJ5IzEjMiMzIzQjNSM2eyUKLSAgXGRvc3Vic3Vic2VjZW50cnl7IzIuIzMuIzQuIzVcbGFiZWxzcGFjZSMxfXsjNn19Ci1cZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5IzEjMntcZG9zdWJzdWJzZWNlbnRyeXsjMX17IzJ9fQotCi0lIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBsZXZlbHMuCi1cbmV3ZGltZW5cdG9jaW5kZW50IFx0b2NpbmRlbnQgPSAzcGMKLQotJSBOb3cgZm9yIHRoZSBhY3R1YWwgdHlwZXNldHRpbmcuIEluIGFsbCB0aGVzZSwgIzEgaXMgdGhlIHRleHQgYW5kICMyIGlzIHRoZQotJSBwYWdlIG51bWJlci4KLSUKLSUgSWYgdGhlIHRvYyBoYXMgdG8gYmUgYnJva2VuIG92ZXIgcGFnZXMsIHdlIHdhbnQgaXQgdG8gYmUgYXQgY2hhcHRlcnMKLSUgaWYgYXQgYWxsIHBvc3NpYmxlOyBoZW5jZSB0aGUgXHBlbmFsdHkuCi1cZGVmXGRvY2hhcGVudHJ5IzEjMnslCi0gICBccGVuYWx0eS0zMDAgXHZza2lwMVxiYXNlbGluZXNraXAgcGx1cy4zM1xiYXNlbGluZXNraXAgbWludXMuMjVcYmFzZWxpbmVza2lwCi0gICBcYmVnaW5ncm91cAotICAgICBcY2hhcGVudHJ5Zm9udHMKLSAgICAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKLSAgIFxlbmRncm91cAotICAgXG5vYnJlYWtcdnNraXAgLjI1XGJhc2VsaW5lc2tpcCBwbHVzLjFcYmFzZWxpbmVza2lwCi19Ci0KLVxkZWZcZG9zZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPVx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9Mlx0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKLVxlbmRncm91cH0KLQotXGRlZlxkb3N1YnN1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc3Vic3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9M1x0b2NpbmRlbnQKLSAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKLVxlbmRncm91cH0KLQotJSBGaW5hbCB0eXBlc2V0dGluZyBvZiBhIHRvYyBlbnRyeTsgd2UgdXNlIHRoZSBzYW1lIFxlbnRyeSBtYWNybyBhcyBmb3IKLSUgdGhlIGluZGV4IGVudHJpZXMsIGJ1dCB3ZSB3YW50IHRvIHN1cHByZXNzIGh5cGhlbmF0aW9uIGhlcmUuICAoV2UKLSUgY2FuJ3QgZG8gdGhhdCBpbiB0aGUgXGVudHJ5IG1hY3JvLCBzaW5jZSBpbmRleCBlbnRyaWVzIG1pZ2h0IGNvbnNpc3QKLSUgb2YgaHlwaGVuYXRlZC1pZGVudGlmaWVycy10aGF0LWRvLW5vdC1maXQtb24tYS1saW5lLWFuZC1ub3RoaW5nLWVsc2UuKQotXGRlZlx0b2NlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHZza2lwIDBwdCBwbHVzMXB0ICUgYWxsb3cgYSBsaXR0bGUgc3RyZXRjaCBmb3IgdGhlIHNha2Ugb2YgbmljZSBwYWdlIGJyZWFrcwotICAlIERvIG5vdCB1c2UgXHR1cm5vZmZhY3RpdmUgaW4gdGhlc2UgYXJndW1lbnRzLiAgU2luY2UgdGhlIHRvYyBpcwotICAlIHR5cGVzZXQgaW4gY21yLCBzbyBjaGFyYWN0ZXJzIHN1Y2ggYXMgXyB3b3VsZCBjb21lIG91dCB3cm9uZzsgd2UKLSAgJSBoYXZlIHRvIGRvIHRoZSB1c3VhbCB0cmFuc2xhdGlvbiB0cmlja3MuCi0gIFxlbnRyeXsjMX17IzJ9JQotXGVuZGdyb3VwfQotCi0lIFNwYWNlIGJldHdlZW4gY2hhcHRlciAob3Igd2hhdGV2ZXIpIG51bWJlciBhbmQgdGhlIHRpdGxlLgotXGRlZlxsYWJlbHNwYWNle1xoc2tpcDFlbSBccmVsYXh9Ci0KLVxkZWZcZG9wYWdlbm8jMXt7XHJtICMxfX0KLVxkZWZcZG9zaG9ydHBhZ2VubyMxe3tccm0gIzF9fQotCi1cZGVmXGNoYXBlbnRyeWZvbnRze1xzZWNmb250cyBccm19Ci1cZGVmXHNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KLVxsZXRcc3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLVxsZXRcc3Vic3Vic2VjZW50cnlmb250cyA9IFx0ZXh0Zm9udHMKLQotCi1cbWVzc2FnZXtlbnZpcm9ubWVudHMsfQotJSBAZm9vIC4uLiBAZW5kIGZvby4KLQotJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCBpdCBzaG91bGQgYmUgYW4gZXZlbiBudW1iZXIgb2YKLSUgXHR0IHdpZHRocy4gRWFjaCBcdHQgY2hhcmFjdGVyIGlzIDFlbiwgc28gdHdvIG1ha2VzIGl0IDFlbS4KLSUgRnVydGhlcm1vcmUsIHRoZXNlIGRlZmluaXRpb25zIG11c3QgY29tZSBhZnRlciB3ZSBkZWZpbmUgb3VyIGZvbnRzLgotXG5ld2JveFxkYmxhcnJvd2JveCAgICBcbmV3Ym94XGxvbmdkYmxhcnJvd2JveAotXG5ld2JveFxwdXNoY2hhcmJveCAgICBcbmV3Ym94XGJ1bGxib3gKLVxuZXdib3hcZXF1aXZib3ggICAgICAgXG5ld2JveFxlcnJvcmJveAotCi0le1x0ZW50dAotJVxnbG9iYWxcc2V0Ym94XGRibGFycm93Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxSaWdodGFycm93JFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XGxvbmdkYmxhcnJvd2JveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRcbWFwc3RvJFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XHB1c2hjaGFyYm94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxkYXNodiRcaGZpbH0KLSVcZ2xvYmFsXHNldGJveFxlcXVpdmJveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfQotJSBBZGFwdGVkIGZyb20gdGhlIG1hbm1hYyBmb3JtYXQgKHAuNDIwIG9mIFRlWGJvb2spCi0lXGdsb2JhbFxzZXRib3hcYnVsbGJveCA9IFxoYm94IHRvIDFlbXtca2Vybi4xNWVtXHZydWxlIGhlaWdodCAuNzVleCB3aWR0aCAuODVleAotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLjFleFxoZmlsfQotJX0KLQotJSBAcG9pbnR7fSwgQHJlc3VsdHt9LCBAZXhwYW5zaW9ue30sIEBwcmludHt9LCBAZXF1aXZ7fS4KLVxkZWZccG9pbnR7JFxzdGFyJH0KLVxkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjE1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQotXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVccmFpc2UuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9fQotXGRlZlxwcmludHtcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfX0KLVxkZWZcZXF1aXZ7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9fQotCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaydzIFxib3hpdC4KLXtcdGVudHQgXGdsb2JhbFxkaW1lbjAgPSAzZW19JSBXaWR0aCBvZiB0aGUgYm94LgotXGRpbWVuMiA9IC41NXB0ICUgVGhpY2tuZXNzIG9mIHJ1bGVzCi0lIFRoZSB0ZXh0LiAoYHInIGlzIG9wZW4gb24gdGhlIHJpZ2h0LCBgZScgc29tZXdoYXQgbGVzcyBzbyBvbiB0aGUgbGVmdC4pCi1cc2V0Ym94MCA9IFxoYm94e1xrZXJuLS43NXB0IFx0ZW5zZiBlcnJvclxrZXJuLTEuNXB0fQotCi1cZ2xvYmFsXHNldGJveFxlcnJvcmJveD1caGJveCB0byBcZGltZW4we1xoZmlsCi0gICBcaHNpemUgPSBcZGltZW4wIFxhZHZhbmNlXGhzaXplIGJ5IC01LjhwdCAlIFNwYWNlIHRvIGxlZnQrcmlnaHQuCi0gICBcYWR2YW5jZVxoc2l6ZSBieSAtMlxkaW1lbjIgJSBSdWxlcy4KLSAgIFx2Ym94ewotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjIKLSAgICAgIFxoYm94e1x2cnVsZSB3aWR0aFxkaW1lbjIgXGtlcm4zcHQgICAgICAgICAgJSBTcGFjZSB0byBsZWZ0IG9mIHRleHQuCi0gICAgICAgICBcdnRvcHtca2VybjIuNHB0IFxib3gwIFxrZXJuMi40cHR9JSBTcGFjZSBhYm92ZS9iZWxvdy4KLSAgICAgICAgIFxrZXJuM3B0XHZydWxlIHdpZHRoXGRpbWVuMn0lIFNwYWNlIHRvIHJpZ2h0LgotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjJ9Ci0gICAgXGhmaWx9Ci0KLSUgVGhlIEBlcnJvcnt9IGNvbW1hbmQuCi1cZGVmXGVycm9ye1xsZWF2ZXZtb2RlXGxvd2VyLjdleFxjb3B5XGVycm9yYm94fQotCi0lIEB0ZXggLi4uIEBlbmQgdGV4ICAgIGVzY2FwZXMgaW50byByYXcgVGV4IHRlbXBvcmFyaWx5LgotJSBPbmUgZXhjZXB0aW9uOiBAIGlzIHN0aWxsIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHNvIHRoYXQgQGVuZCB0ZXggd29ya3MuCi0lIEJ1dCBcQCBvciBAQCB3aWxsIGdldCBhIHBsYWluIHRleCBAIGNoYXJhY3Rlci4KLQotXGRlZlx0ZXh7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGUgYFxcPTAgXGNhdGNvZGUgYFx7PTEgXGNhdGNvZGUgYFx9PTIKLSAgXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKLSAgXGNhdGNvZGUgYFxePTcgXGNhdGNvZGUgYFxfPTggXGNhdGNvZGUgYFx+PTEzIFxsZXR+PVx0aWUKLSAgXGNhdGNvZGUgYFwlPTE0Ci0gIFxjYXRjb2RlIDQzPTEyICUgcGx1cwotICBcY2F0Y29kZWBcIj0xMgotICBcY2F0Y29kZWBcPT0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcZXNjYXBlY2hhcj1gXFwKLSAgJQotICBcbGV0XGI9XHB0ZXhiCi0gIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0Ci0gIFxsZXRcYz1ccHRleGMKLSAgXGxldFwsPVxwdGV4Y29tbWEKLSAgXGxldFwuPVxwdGV4ZG90Ci0gIFxsZXRcZG90cz1ccHRleGRvdHMKLSAgXGxldFxlcXVpdj1ccHRleGVxdWl2Ci0gIFxsZXRcIT1ccHRleGV4Y2xhbQotICBcbGV0XGk9XHB0ZXhpCi0gIFxsZXRcez1ccHRleGxicmFjZQotICBcbGV0XCs9XHRhYmFsaWduCi0gIFxsZXRcfT1ccHRleHJicmFjZQotICBcbGV0XCo9XHB0ZXhzdGFyCi0gIFxsZXRcdD1ccHRleHQKLSAgJQotICBcZGVmXGVuZGxkb3Rze1xtYXRoaW5uZXJ7XGxkb3RzXGxkb3RzXGxkb3RzXGxkb3RzfX0lCi0gIFxkZWZcZW5kZG90c3tccmVsYXhcaWZtbW9kZVxlbmRsZG90c1xlbHNlJFxtYXRoc3Vycm91bmQ9MHB0IFxlbmRsZG90c1wsJFxmaX0lCi0gIFxkZWZcQHtAfSUKLVxsZXRcRXRleD1cZW5kZ3JvdXB9Ci0KLSUgRGVmaW5lIEBsaXNwIC4uLiBAZW5kbGlzcC4KLSUgQGxpc3AgZG9lcyBhIFxiZWdpbmdyb3VwIHNvIGl0IGNhbiByZWJpbmQgdGhpbmdzLAotJSBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGVuZGxpc3AgKHdoaWNoIG5vcm1hbGx5IGlzIGVycm9uZW91cykuCi0KLSUgQW1vdW50IHRvIG5hcnJvdyB0aGUgbWFyZ2lucyBieSBmb3IgQGxpc3AuCi1cbmV3c2tpcFxsaXNwbmFycm93aW5nIFxsaXNwbmFycm93aW5nPTAuNGluCi0KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB0aGF0IF5eTSBnZXRzIGluc2lkZSBAbGlzcCwgQGV4YW1wbGUsIGFuZCBvdGhlcgotJSBzdWNoIGVudmlyb25tZW50cy4gIFxudWxsIGlzIGJldHRlciB0aGFuIGEgc3BhY2UsIHNpbmNlIGl0IGRvZXNuJ3QKLSUgaGF2ZSBhbnkgd2lkdGguCi1cZGVmXGxpc3BwYXJ7XG51bGxcZW5kZ3JhZn0KLQotJSBNYWtlIGVhY2ggc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCBwcm9kdWNlIGEgbm9ybWFsIGludGVyd29yZAotJSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgRG9uJ3QgYWxsb3cgYSBsaW5lIGJyZWFrIGF0IHRoaXMgc3BhY2UsIGFzIHRoaXMKLSUgaXMgdXNlZCBvbmx5IGluIGVudmlyb25tZW50cyBsaWtlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQKLSUgc2hvdWxkIHByb2R1Y2UgYSBsaW5lIG9mIG91dHB1dCBhbnl3YXkuCi0lCi17XG9iZXlzcGFjZXMgJQotXGdkZWZcc2Vwc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XHRpZX19Ci0KLSUgRGVmaW5lIFxvYmV5ZWRzcGFjZSB0byBiZSBvdXIgYWN0aXZlIHNwYWNlLCB3aGF0ZXZlciBpdCBpcy4gIFRoaXMgaXMKLSUgZm9yIHVzZSBpbiBccGFyc2VhcmcuCi17XHNlcHNwYWNlcyUKLVxnbG9iYWxcbGV0XG9iZXllZHNwYWNlPSB9Ci0KLSUgVGhpcyBzcGFjZSBpcyBhbHdheXMgcHJlc2VudCBhYm92ZSBhbmQgYmVsb3cgZW52aXJvbm1lbnRzLgotXG5ld3NraXBcZW52c2tpcGFtb3VudCBcZW52c2tpcGFtb3VudCA9IDBwdAotCi0lIE1ha2Ugc3BhY2luZyBhbmQgYmVsb3cgZW52aXJvbm1lbnQgc3ltbWV0cmljYWwuICBXZSB1c2UgXHBhcnNraXAgaGVyZQotJSB0byBoZWxwIGluIGRvaW5nIHRoYXQsIHNpbmNlIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzIFxwYXJza2lwCi0lIGlzIHJlc2V0IHRvIHplcm87IHRodXMgdGhlIFxhZnRlcmVudmJyZWFrIGluc2VydHMgbm8gc3BhY2UgLS0gYnV0IHRoZQotJSBzdGFydCBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2lsbCBpbnNlcnQgXHBhcnNraXAKLSUKLVxkZWZcYWJvdmVlbnZicmVha3t7XGFkdmFuY2VcZW52c2tpcGFtb3VudCBieSBccGFyc2tpcAotXGVuZGdyYWYgXGlmZGltXGxhc3Rza2lwPFxlbnZza2lwYW1vdW50Ci1ccmVtb3ZlbGFzdHNraXAgXHBlbmFsdHktNTAgXHZza2lwXGVudnNraXBhbW91bnQgXGZpfX0KLQotXGxldFxhZnRlcmVudmJyZWFrID0gXGFib3ZlZW52YnJlYWsKLQotJSBcbm9uYXJyb3dpbmcgaXMgYSBmbGFnLiAgSWYgInNldCIsIEBsaXNwIGV0YyBkb24ndCBuYXJyb3cgbWFyZ2lucy4KLVxsZXRcbm9uYXJyb3dpbmc9XHJlbGF4Ci0KLSUgQGNhcnRvdWNoZSAuLi4gQGVuZCBjYXJ0b3VjaGU6IGRyYXcgcmVjdGFuZ2xlIHcvcm91bmRlZCBjb3JuZXJzIGFyb3VuZAotJSBlbnZpcm9ubWVudCBjb250ZW50cy4KLVxmb250XGNpcmNsZT1sY2lyY2xlMTAKLVxuZXdkaW1lblxjaXJjdGhpY2sKLVxuZXdkaW1lblxjYXJ0b3V0ZXJcbmV3ZGltZW5cY2FydGlubmVyCi1cbmV3c2tpcFxub3JtYnNraXBcbmV3c2tpcFxub3JtcHNraXBcbmV3c2tpcFxub3JtbHNraXAKLVxjaXJjdGhpY2s9XGZvbnRkaW1lbjhcY2lyY2xlCi0lCi1cZGVmXGN0bHt7XGNpcmNsZVxjaGFyJzAxM1xoc2tpcCAtNnB0fX0lIDZwdCBmcm9tIHBsIGZpbGU6IDEvMmNoYXJ3aWR0aAotXGRlZlxjdHJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDEwfX0KLVxkZWZcY2Jse3tcY2lyY2xlXGNoYXInMDEyXGhza2lwIC02cHR9fQotXGRlZlxjYnJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDExfX0KLVxkZWZcY2FydHRvcHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAotICAgICAgICBcY3RsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGN0cgotICAgICAgICBcaHNraXBccnNraXB9fQotXGRlZlxjYXJ0Ym90e1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCi0gICAgICAgIFxjYmxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY2JyCi0gICAgICAgIFxoc2tpcFxyc2tpcH19Ci0lCi1cbmV3c2tpcFxsc2tpcFxuZXdza2lwXHJza2lwCi0KLVxsb25nXGRlZlxjYXJ0b3VjaGV7JQotXGJlZ2luZ3JvdXAKLSAgICAgICAgXGxza2lwPVxsZWZ0c2tpcCBccnNraXA9XHJpZ2h0c2tpcAotICAgICAgICBcbGVmdHNraXA9MHB0XHJpZ2h0c2tpcD0wcHQgJXdlIHdhbnQgdGhlc2UgKm91dHNpZGUqLgotICAgICAgICBcY2FydGlubmVyPVxoc2l6ZSBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXGxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFxhZHZhbmNlXGNhcnRpbm5lciBieS1ccnNraXAKLSAgICAgICAgXGNhcnRvdXRlcj1caHNpemUKLSAgICAgICAgXGFkdmFuY2VcY2FydG91dGVyIGJ5IDE4LjRwdCAlIGFsbG93IGZvciAzcHQga2VybnMgb24gZWl0aGVyCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSwgYW5kIGZvciA2cHQgd2FzdGUgZnJvbQotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY29ybmVyIGNoYXIsIGFuZCBydWxlIHRoaWNrbmVzcwotICAgICAgICBcbm9ybWJza2lwPVxiYXNlbGluZXNraXAgXG5vcm1wc2tpcD1ccGFyc2tpcCBcbm9ybWxza2lwPVxsaW5lc2tpcAotICAgICAgICAlIEZsYWcgdG8gdGVsbCBAbGlzcCwgZXRjLiwgbm90IHRvIG5hcnJvdyBtYXJnaW4uCi0gICAgICAgIFxsZXRcbm9uYXJyb3dpbmc9XGNvbW1lbnQKLSAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0Ci0gICAgICAgICAgICAgICAgXGNhcnR0b3AKLSAgICAgICAgICAgICAgICBcaGJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxsc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgXHZydWxlXGtlcm4zcHQKLSAgICAgICAgICAgICAgICAgICAgICAgIFx2Ym94XGJncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcaHNpemU9XGNhcnRpbm5lcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcYmVnaW5ncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxiYXNlbGluZXNraXA9XG5vcm1ic2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxsaW5lc2tpcD1cbm9ybWxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHBhcnNraXA9XG5vcm1wc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx2c2tpcCAtXHBhcnNraXAKLVxkZWZcRWNhcnRvdWNoZXslCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbmRncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgXGVncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgXGtlcm4zcHRcdnJ1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxyc2tpcAotICAgICAgICAgICAgICAgIFxlZ3JvdXAKLSAgICAgICAgICAgICAgICBcY2FydGJvdAotICAgICAgICBcZWdyb3VwCi1cZW5kZ3JvdXAKLX19Ci0KLQotJSBUaGlzIG1hY3JvIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCB0aGUgQGV4YW1wbGUgdmFyaWFudHMsCi0lIGluc2lkZSBhIGdyb3VwLgotXGRlZlxub25maWxsc3RhcnR7JQotICBcYWJvdmVlbnZicmVhawotICBcaW5FTlYgJSBUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgYm9keQotICBcaGZ1enogPSAxMnB0ICUgRG9uJ3QgYmUgZnVzc3kKLSAgXHNlcHNwYWNlcyAlIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCi0gIFxzaW5nbGVzcGFjZQotICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCi0gIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAotICBccGFyc2tpcCA9IDBwdAotICBccGFyaW5kZW50ID0gMHB0Ci0gIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCi0gICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZwotICAlIGF0IG5leHQgbGV2ZWwgZG93bi4KLSAgXGlmeFxub25hcnJvd2luZ1xyZWxheAotICAgIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxleGRlbnRhbW91bnQ9XGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XGV4ZGVudD1cbm9maWxsZXhkZW50Ci0gICAgXGxldFxub25hcnJvd2luZz1ccmVsYXgKLSAgXGZpCi19Ci0KLSUgRGVmaW5lIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIG9ubHkgaWYgd2UgYXJlIGluc2lkZSB0aGUgcGFydGljdWxhcgotJSBlbnZpcm9ubWVudCwgc28gdGhlIGVycm9yIGNoZWNraW5nIGluIFxlbmQgd2lsbCB3b3JrLgotJQotJSBUbyBlbmQgYW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudCwgd2UgZmlyc3QgZW5kIHRoZSBwYXJhZ3JhcGggKHZpYQotJSBcYWZ0ZXJlbnZicmVhaydzIHZlcnRpY2FsIGdsdWUpLCBhbmQgdGhlbiB0aGUgZ3JvdXAuICBUaGF0IHdheSB3ZSBrZWVwCi0lIHRoZSB6ZXJvIFxwYXJza2lwIHRoYXQgdGhlIGVudmlyb25tZW50cyBzZXQgLS0gXHBhcnNraXAgZ2x1ZSB3aWxsIGJlCi0lIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudCwgYWZ0ZXIKLSUgdGhlIGVudmlyb25tZW50LgotJQotXGRlZlxub25maWxsZmluaXNoe1xhZnRlcmVudmJyZWFrXGVuZGdyb3VwfQotCi0lIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udC4KLVxkZWZcbGlzcHtcYmVnaW5ncm91cAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWxpc3AgPSBcbm9uZmlsbGZpbmlzaAotICBcdHQKLSAgXGxldFxrYmRmb250ID0gXGtiZGV4YW1wbGVmb250ICUgQWxsb3cgQGtiZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbC4KLSAgXGdvYmJsZSAgICAgICAlIGVhdCByZXR1cm4KLX0KLQotJSBAZXhhbXBsZTogU2FtZSBhcyBAbGlzcC4KLVxkZWZcZXhhbXBsZXtcYmVnaW5ncm91cCBcZGVmXEVleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotCi0lIEBzbWFsbC4uLiBpcyB1c3VhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIG5vbi1zbWFsbCAoQHNtYWxsYm9vawotJSByZWRlZmluZXMpLiAgV2UgbXVzdCBjYWxsIFxleGFtcGxlIChvciB3aGF0ZXZlcikgbGFzdCBpbiB0aGUKLSUgZGVmaW5pdGlvbiwgc2luY2UgaXQgcmVhZHMgdGhlIHJldHVybiBmb2xsb3dpbmcgdGhlIEBleGFtcGxlIChvcgotJSB3aGF0ZXZlcikgY29tbWFuZC4KLSUKLSUgVGhpcyBhY3R1YWxseSBhbGxvd3MgKGZvciBleGFtcGxlKSBAZW5kIGRpc3BsYXkgaW5zaWRlIGFuCi0lIEBzbWFsbGRpc3BsYXkuICBUb28gYmFkLCBidXQgbWFrZWluZm8gd2lsbCBjYXRjaCB0aGUgZXJyb3IgYW55d2F5LgotJQotXGRlZlxzbWFsbGRpc3BsYXl7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGRpc3BsYXl7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGRpc3BsYXl9Ci1cZGVmXHNtYWxsZXhhbXBsZXtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLVxkZWZcc21hbGxmb3JtYXR7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGZvcm1hdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZm9ybWF0fQotXGRlZlxzbWFsbGxpc3B7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGxpc3B7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGxpc3B9Ci0KLSUgUmVhbCBAc21hbGxleGFtcGxlIGFuZCBAc21hbGxsaXNwICh3aGVuIEBzbWFsbGJvb2spOiB1c2Ugc21hbGxlciBmb250cy4KLSUgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBQYXZlbEB4ZXJveC4KLVxkZWZcc21hbGxsaXNweHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGxpc3B7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcZGVmXEVzbWFsbGV4YW1wbGV7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcc21hbGxmb250cwotICBcbGlzcAotfQotCi0lIEBkaXNwbGF5OiBzYW1lIGFzIEBsaXNwIGV4Y2VwdCBrZWVwIGN1cnJlbnQgZm9udC4KLSUKLVxkZWZcZGlzcGxheXtcYmVnaW5ncm91cAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWRpc3BsYXkgPSBcbm9uZmlsbGZpbmlzaAotICBcZ29iYmxlCi19Ci0KLSUgQHNtYWxsZGlzcGxheSAod2hlbiBAc21hbGxib29rKTogQGRpc3BsYXkgcGx1cyBzbWFsbGVyIGZvbnRzLgotJQotXGRlZlxzbWFsbGRpc3BsYXl4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsZGlzcGxheXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxzbWFsbGZvbnRzIFxybQotICBcZGlzcGxheQotfQotCi0lIEBmb3JtYXQ6IHNhbWUgYXMgQGRpc3BsYXkgZXhjZXB0IGRvbid0IG5hcnJvdyBtYXJnaW5zLgotJQotXGRlZlxmb3JtYXR7XGJlZ2luZ3JvdXAKLSAgXGxldFxub25hcnJvd2luZyA9IHQKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVmb3JtYXQgPSBcbm9uZmlsbGZpbmlzaAotICBcZ29iYmxlCi19Ci0KLSUgQHNtYWxsZm9ybWF0ICh3aGVuIEBzbWFsbGJvb2spOiBAZm9ybWF0IHBsdXMgc21hbGxlciBmb250cy4KLSUKLVxkZWZcc21hbGxmb3JtYXR4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsZm9ybWF0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXHNtYWxsZm9udHMgXHJtCi0gIFxmb3JtYXQKLX0KLQotJSBAZmx1c2hsZWZ0IChzYW1lIGFzIEBmb3JtYXQpLgotJQotXGRlZlxmbHVzaGxlZnR7XGJlZ2luZ3JvdXAgXGRlZlxFZmx1c2hsZWZ0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxmb3JtYXR9Ci0KLSUgQGZsdXNocmlnaHQuCi0lCi1cZGVmXGZsdXNocmlnaHR7XGJlZ2luZ3JvdXAKLSAgXGxldFxub25hcnJvd2luZyA9IHQKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVmbHVzaHJpZ2h0ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGwKLSAgXGdvYmJsZQotfQotCi0lIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKLSUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuCi0lCi1cZGVmXHF1b3RhdGlvbnslCi0gIFxiZWdpbmdyb3VwXGluRU5WICVUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQHF1b3RhdGlvbiBib2R5Ci0gIHtccGFyc2tpcD0wcHQgXGFib3ZlZW52YnJlYWt9JSBiZWNhdXNlIFxhYm92ZWVudmJyZWFrIGluc2VydHMgXHBhcnNraXAKLSAgXHNpbmdsZXNwYWNlCi0gIFxwYXJpbmRlbnQ9MHB0Ci0gICUgV2UgaGF2ZSByZXRhaW5lZCBhIG5vbnplcm8gcGFyc2tpcCBmb3IgdGhlIGVudmlyb25tZW50LCBzaW5jZSB3ZSdyZQotICAlIGRvaW5nIG5vcm1hbCBmaWxsaW5nLiBTbyB0byBhdm9pZCBleHRyYSBzcGFjZSBiZWxvdyB0aGUgZW52aXJvbm1lbnQuLi4KLSAgXGRlZlxFcXVvdGF0aW9ue1xwYXJza2lwID0gMHB0IFxub25maWxsZmluaXNofSUKLSAgJQotICAlIEBjYXJ0b3VjaGUgZGVmaW5lcyBcbm9uYXJyb3dpbmcgdG8gaW5oaWJpdCBuYXJyb3dpbmcgYXQgbmV4dCBsZXZlbCBkb3duLgotICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4Ci0gICAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcZXhkZW50YW1vdW50ID0gXGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XG5vbmFycm93aW5nID0gXHJlbGF4Ci0gIFxmaQotfQotCi0KLVxtZXNzYWdle2RlZnVucyx9Ci0lIEBkZWZ1biBldGMuCi0KLSUgQWxsb3cgdXNlciB0byBjaGFuZ2UgZGVmaW5pdGlvbiBvYmplY3QgZm9udCAoXGRmKSBpbnRlcm5hbGx5Ci1cZGVmXHNldGRlZmZvbnQgIzEge1xjc25hbWUgREVGIzFcZW5kY3NuYW1lfQotCi1cbmV3c2tpcFxkZWZib2R5aW5kZW50IFxkZWZib2R5aW5kZW50PS40aW4KLVxuZXdza2lwXGRlZmFyZ3NpbmRlbnQgXGRlZmFyZ3NpbmRlbnQ9NTBwdAotXG5ld3NraXBcZGVmdHlwZW1hcmdpbiBcZGVmdHlwZW1hcmdpbj0xMnB0Ci1cbmV3c2tpcFxkZWZsYXN0YXJnbWFyZ2luIFxkZWZsYXN0YXJnbWFyZ2luPTE4cHQKLQotXG5ld2NvdW50XHBhcmVuY291bnQKLSUgZGVmaW5lIFxmdW5jdGlvbnBhcmVucywgd2hpY2ggbWFrZXMgKCBhbmQgKSBhbmQgJiBkbyBzcGVjaWFsIHRoaW5ncy4KLSUgXGZ1bmN0aW9ucGFyZW5zIGFmZmVjdHMgdGhlIGdyb3VwIGl0IGlzIGNvbnRhaW5lZCBpbi4KLVxkZWZcYWN0aXZlcGFyZW5zeyUKLVxjYXRjb2RlYFwoPVxhY3RpdmUgXGNhdGNvZGVgXCk9XGFjdGl2ZSBcY2F0Y29kZWBcJj1cYWN0aXZlCi1cY2F0Y29kZWBcWz1cYWN0aXZlIFxjYXRjb2RlYFxdPVxhY3RpdmV9Ci0KLSUgTWFrZSBjb250cm9sIHNlcXVlbmNlcyB3aGljaCBhY3QgbGlrZSBub3JtYWwgcGFyZW50aGVzaXMgY2hhcnMuCi1cbGV0XGxwYXJlbiA9ICggXGxldFxycGFyZW4gPSApCi0KLXtcYWN0aXZlcGFyZW5zICUgTm93LCBzbWFydCBwYXJlbnMgZG9uJ3QgdHVybiBvbiB1bnRpbCAmZm9vIChzZWUgXGFtcHJtKQotCi0lIEJlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGRlZmluaXRpb24gZm9yIGAoJywgZXRjLiAgRm9yIGV4YW1wbGUsCi0lIGlmIHRoZSBmbiBuYW1lIGhhcyBwYXJlbnMgaW4gaXQsIFxib2xkYnJheCB3aWxsIG5vdCBiZSBpbiBlZmZlY3QgeWV0LAotJSBzbyBUZVggd291bGQgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0IHVuZGVmaW5lZCBjb250cm9sIHNlcXVlbmNlLgotXGdsb2JhbFxsZXQoPVxscGFyZW4gXGdsb2JhbFxsZXQpPVxycGFyZW4KLVxnbG9iYWxcbGV0Wz1cbGJyYWNrIFxnbG9iYWxcbGV0XT1ccmJyYWNrCi0KLVxnZGVmXGZ1bmN0aW9ucGFyZW5ze1xib2xkYnJheFxsZXQmPVxhbXBybVxwYXJlbmNvdW50PTAgfQotXGdkZWZcYm9sZGJyYXh7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJ9Ci0lIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIHNwZWNpYWwgcGFyZW5zCi0lIGJ1dCBtYWtlICYgYWN0IG9yZGluYXJ5IChnaXZlbiB0aGF0IGl0J3MgYWN0aXZlKS4KLVxnZGVmXGJvbGRicmF4bm9hbXB7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJcbGV0Jj1cYW1wbnJ9Ci0KLSUgRGVmaW5pdGlvbnMgb2YgKCwgKSBhbmQgJiB1c2VkIGluIGFyZ3MgZm9yIGZ1bmN0aW9ucy4KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiAoIG91dHNpZGUgb2YgYWxsIHBhcmVudGhlc2VzLgotXGdkZWZcb3BybSMxIHt7XHJtXGNoYXJgXCh9IzEgXGJmIFxsZXQoPVxvcG5lc3RlZAotICBcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxCi19Ci0lCi0lIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCB3aGVuIGFscmVhZHkgaW5zaWRlIGEgbGV2ZWwgb2YgcGFyZW5zLgotXGdkZWZcb3BuZXN0ZWR7XGNoYXJgXChcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KLSUKLVxnZGVmXGNscm17JSBQcmludCBhIHBhcmVuIGluIHJvbWFuIGlmIGl0IGlzIHRha2luZyB1cyBiYWNrIHRvIGRlcHRoIG9mIDAuCi0gICUgYWxzbyBpbiB0aGF0IGNhc2UgcmVzdG9yZSB0aGUgb3V0ZXItbGV2ZWwgZGVmaW5pdGlvbiBvZiAoLgotICBcaWZudW0gXHBhcmVuY291bnQ9MSB7XHJtIFxjaGFyIGBcKX1cc2wgXGxldCg9XG9wcm0gXGVsc2UgXGNoYXIgYFwpIFxmaQotICBcZ2xvYmFsXGFkdmFuY2UgXHBhcmVuY291bnQgYnkgLTEgfQotJSBJZiB3ZSBlbmNvdW50ZXIgJmZvbywgdGhlbiB0dXJuIG9uICgpLWhhY2tpbmcgYWZ0ZXJ3YXJkcwotXGdkZWZcYW1wcm0jMSB7e1xybVwmIzF9XGxldCg9XG9wcm0gXGxldCk9XGNscm1cIH0KLSUKLVxnZGVmXG5vcm1hbHBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wbnJ9Ci19ICUgRW5kIG9mIGRlZmluaXRpb24gaW5zaWRlIFxhY3RpdmVwYXJlbnMKLSUlIFRoZXNlIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4gdGhlCi0lJSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0KLVxkZWZcb3Bucnt7XHNmXGNoYXJgXCh9XGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMSB9Ci1cZGVmXGNsbnJ7e1xzZlxjaGFyYFwpfVxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IC0xIH0KLVxsZXRcYW1wbnIgPSBcJgotXGRlZlxsYnJie3tcYmZcY2hhcmBcW319Ci1cZGVmXHJicmJ7e1xiZlxjaGFyYFxdfX0KLQotJSBBY3RpdmUgJidzIHNuZWFrIGludG8gdGhlIGluZGV4IGFyZ3VtZW50cywgc28gbWFrZSBzdXJlIGl0J3MgZGVmaW5lZC4KLXsKLSAgXGNhdGNvZGVgJiA9IDEzCi0gIFxnbG9iYWxcbGV0JiA9IFxhbXBucgotfQotCi0lIEZpcnN0LCBkZWZuYW1lLCB3aGljaCBmb3JtYXRzIHRoZSBoZWFkZXIgbGluZSBpdHNlbGYuCi0lICMxIHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZS4KLSUgIzIgc2hvdWxkIGJlIHRoZSB0eXBlIG9mIGRlZmluaXRpb24sIHN1Y2ggYXMgIkZ1bmN0aW9uIi4KLQotXGRlZlxkZWZuYW1lICMxIzJ7JQotJSBHZXQgdGhlIHZhbHVlcyBvZiBcbGVmdHNraXAgYW5kIFxyaWdodHNraXAgYXMgdGhleSB3ZXJlCi0lIG91dHNpZGUgdGhlIEBkZWYuLi4KLVxkaW1lbjI9XGxlZnRza2lwCi1cYWR2YW5jZVxkaW1lbjIgYnkgLVxkZWZib2R5aW5kZW50Ci1cbm9pbmRlbnQKLVxzZXRib3gwPVxoYm94e1xoc2tpcCBcZGVmbGFzdGFyZ21hcmdpbntccm0gIzJ9XGhza2lwIFxkZWZ0eXBlbWFyZ2lufSUKLVxkaW1lbjA9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjAgYnkgLVx3ZDAgJSBjb21wdXRlIHNpemUgZm9yIGZpcnN0IGxpbmUKLVxkaW1lbjE9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjEgYnkgLVxkZWZhcmdzaW5kZW50ICVzaXplIGZvciBjb250aW51YXRpb25zCi1ccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4xCi0lIE5vdyBvdXRwdXQgYXJnIDIgKCJGdW5jdGlvbiIgb3Igc29tZSBzdWNoKQotJSBlbmRpbmcgYXQgXGRlZnR5cGVtYXJnaW4gZnJvbSB0aGUgcmlnaHQgbWFyZ2luLAotJSBidXQgc3R1Y2sgaW5zaWRlIGEgYm94IG9mIHdpZHRoIDAgc28gaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbGluZWJyZWFraW5nCi17JSBBZGp1c3QgXGhzaXplIHRvIGV4Y2x1ZGUgdGhlIGFtYmllbnQgbWFyZ2lucywKLSUgc28gdGhhdCBccmlnaHRsaW5lIHdpbGwgb2JleSB0aGVtLgotXGFkdmFuY2UgXGhzaXplIGJ5IC1cZGltZW4yCi1ccmxhcHtccmlnaHRsaW5le3tccm0gIzJ9XGhza2lwIC0xLjI1cGMgfX19JQotJSBNYWtlIGFsbCBsaW5lcyB1bmRlcmZ1bGwgYW5kIG5vIGNvbXBsYWludHM6Ci1cdG9sZXJhbmNlPTEwMDAwIFxoYmFkbmVzcz0xMDAwMAotXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci17XGRmICMxfVxlbnNraXAgICAgICAgICUgR2VuZXJhdGUgZnVuY3Rpb24gbmFtZQotfQotCi0lIEFjdHVhbGx5IHByb2Nlc3MgdGhlIGJvZHkgb2YgYSBkZWZpbml0aW9uCi0lICMxIHNob3VsZCBiZSB0aGUgdGVybWluYXRpbmcgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcRWRlZnVuLgotJSAjMiBzaG91bGQgYmUgdGhlICJhbm90aGVyIG5hbWUiIGNvbnRyb2wgc2VxdWVuY2UsIHN1Y2ggYXMgXGRlZnVueC4KLSUgIzMgc2hvdWxkIGJlIHRoZSBjb250cm9sIHNlcXVlbmNlIHRoYXQgYWN0dWFsbHkgcHJvY2Vzc2VzIHRoZSBoZWFkZXIsCi0lICAgIHN1Y2ggYXMgXGRlZnVuaGVhZGVyLgotCi1cZGVmXGRlZnBhcnNlYm9keSAjMSMyIzN7XGJlZ2luZ3JvdXBcaW5FTlYlIEVudmlyb25tZW50IGZvciBkZWZpbml0aW9uYm9keQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzJ7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cCAlCi1cY2F0Y29kZSA2MT1cYWN0aXZlICUgNjEgaXMgYD0nCi1cb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9Ci0KLSUgIzEgaXMgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2UgdG8gZW5kIHRoZSBkZWZpbml0aW9uICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMiBpcyB0aGUgXC4uLnggY29udHJvbCBzZXF1ZW5jZSBmb3IgY29uc2VjdXRpdmUgZm5zICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB0byBjYWxsIHRvIHJlc3VtZSBwcm9jZXNzaW5nLgotJSAjNCwgZGVsaW1pdGVkIGJ5IHRoZSBzcGFjZSwgaXMgdGhlIGNsYXNzIG5hbWUuCi0lCi1cZGVmXGRlZm1ldGhwYXJzZWJvZHkjMSMyIzMjNCB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNH19fQotCi0lIFVzZWQgZm9yIEBkZWZ0eXBlbWV0aG9kIGFuZCBAZGVmdHlwZWl2YXIuCi0lICMxIGlzIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIHRvIGVuZCB0aGUgZGVmaW5pdGlvbiAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzIgaXMgdGhlIFwuLi54IGNvbnRyb2wgc2VxdWVuY2UgZm9yIGNvbnNlY3V0aXZlIGZucyAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzMgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdG8gY2FsbCB0byByZXN1bWUgcHJvY2Vzc2luZy4KLSUgIzQsIGRlbGltaXRlZCBieSBhIHNwYWNlLCBpcyB0aGUgY2xhc3MgbmFtZS4KLSUgIzUgaXMgdGhlIG1ldGhvZCdzIHJldHVybiB0eXBlLgotJQotXGRlZlxkZWZ0eXBlbWV0aHBhcnNlYm9keSMxIzIjMyM0ICM1IHtcYmVnaW5ncm91cFxpbkVOVgotICBcbWVkYnJlYWsKLSAgXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLSAgXGRlZiMyIyMxICMjMiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMX17IyMyfX19JQotICBccGFyaW5kZW50PTBpbgotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci0gIFxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNH17IzV9fX0KLQotJSBVc2VkIGZvciBAZGVmdHlwZW9wLiAgVGhlIGNoYW5nZSBmcm9tIFxkZWZ0eXBlbWV0aHBhcnNlYm9keSBpcyBhbgotJSBleHRyYSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIHdoaWNoIGlzIHRoZSBgY2F0ZWdvcnknLCBpbnN0ZWFkIG9mIGl0Ci0lIGJlaW5nIHRoZSBoYXJkd2lyZWQgc3RyaW5nIGBNZXRob2QnIG9yIGBJbnN0YW5jZSBWYXJpYWJsZScuICBXZSBoYXZlCi0lIHRvIGFjY291bnQgZm9yIHRoaXMgYm90aCBpbiB0aGUgXC4uLnggZGVmaW5pdGlvbiBhbmQgaW4gcGFyc2luZyB0aGUKLSUgaW5wdXQgYXQgaGFuZC4gIFRodXMgYWxzbyBuZWVkIGEgY29udHJvbCBzZXF1ZW5jZSAocGFzc2VkIGFzICM1KSBmb3IKLSUgdGhlIFxFLi4uIGRlZmluaXRpb24gdG8gYXNzaWduIHRoZSBjYXRlZ29yeSBuYW1lIHRvLgotJSAKLVxkZWZcZGVmdHlwZW9wcGFyc2Vib2R5IzEjMiMzIzQjNSAjNiB7XGJlZ2luZ3JvdXBcaW5FTlYKLSAgXG1lZGJyZWFrCi0gIFxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi0gIFxkZWYjMiMjMSAjIzIgIyMzIHslCi0gICAgXGRlZiM0eyMjMX0lCi0gICAgXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMn17IyMzfX19JQotICBccGFyaW5kZW50PTBpbgotICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci0gIFxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNX17IzZ9fX0KLQotXGRlZlxkZWZvcHBhcnNlYm9keSAjMSMyIzMjNCM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xkZWYjNHsjIzF9JQotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM1fX19Ci0KLSUgVGhlc2UgcGFyc2luZyBmdW5jdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIHByZWNlZGluZyBvbmVzCi0lIGV4Y2VwdCB0aGF0IHRoZXkgZG8gbm90IG1ha2UgcGFyZW5zIGludG8gYWN0aXZlIGNoYXJhY3RlcnMuCi0lIFRoZXNlIGFyZSB1c2VkIGZvciAidmFyaWFibGVzIiBzaW5jZSB0aGV5IGhhdmUgbm8gYXJndW1lbnRzLgotCi1cZGVmXGRlZnZhcnBhcnNlYm9keSAjMSMyIzN7XGJlZ2luZ3JvdXBcaW5FTlYlIEVudmlyb25tZW50IGZvciBkZWZpbml0aW9uYm9keQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzJ7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXQjM30lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwICUKLVxjYXRjb2RlIDYxPVxhY3RpdmUgJQotXG9iZXlsaW5lc1xzcGFjZXNwbGl0IzN9Ci0KLSUgVGhpcyBpcyB1c2VkIGZvciBcZGVme3RwLHZyfXBhcnNlYm9keS4gIEl0IGNvdWxkIHByb2JhYmx5IGJlIHVzZWQgZm9yCi0lIHNvbWUgb2YgdGhlIG90aGVycywgdG9vLCB3aXRoIHNvbWUganVkaWNpb3VzIGNvbmRpdGlvbmFscy4KLSUKLVxkZWZccGFyc2Vib2R5Y29tbW9uIzEjMiMzeyUKLSAgXGJlZ2luZ3JvdXBcaW5FTlYgJQotICBcbWVkYnJlYWsgJQotICAlIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0gICUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLSAgXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLSAgXGRlZiMyIyMxIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCi0gIFxwYXJpbmRlbnQ9MGluCi0gIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci0gIFxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLSAgXGJlZ2luZ3JvdXBcb2JleWxpbmVzCi19Ci0KLVxkZWZcZGVmdnJwYXJzZWJvZHkjMSMyIzMjNCB7JQotICBccGFyc2Vib2R5Y29tbW9ueyMxfXsjMn17IzN9JQotICBcc3BhY2VzcGxpdHsjM3sjNH19JQotfQotCi0lIFRoaXMgbG9zZXMgb24gYEBkZWZ0cCB7RGF0YSBUeXBlfSB7c3RydWN0IHRlcm1pb3N9JyAtLSBpdCB0aGlua3MgdGhlCi0lIHR5cGUgaXMganVzdCBgc3RydWN0JywgYmVjYXVzZSB3ZSBsb3NlIHRoZSBicmFjZXMgaW4gYHtzdHJ1Y3QKLSUgdGVybWlvc30nIHdoZW4gXHNwYWNlc3BsaXQgcmVhZHMgaXRzIHVuZGVsaW1pdGVkIGFyZ3VtZW50LiAgU2lnaC4KLSUgXGxldFxkZWZ0cHBhcnNlYm9keT1cZGVmdnJwYXJzZWJvZHkKLSUKLSUgU28sIHRvIGdldCBhcm91bmQgdGhpcywgd2UgcHV0IFxlbXB0eSBpbiB3aXRoIHRoZSB0eXBlIG5hbWUuICBUaGF0Ci0lIHdheSwgVGVYIHdvbid0IGZpbmQgZXhhY3RseSBgey4uLn0nIGFzIGFuIHVuZGVsaW1pdGVkIGFyZ3VtZW50LCBhbmQKLSUgd29uJ3Qgc3RyaXAgb2ZmIHRoZSBicmFjZXMuCi0lCi1cZGVmXGRlZnRwcGFyc2Vib2R5ICMxIzIjMyM0IHslCi0gIFxwYXJzZWJvZHljb21tb257IzF9eyMyfXsjM30lCi0gIFxzcGFjZXNwbGl0e1xwYXJzZXRwaGVhZGVybGluZXsjM3sjNH19fVxlbXB0eQotfQotCi0lIEZpbmUsIGJ1dCB0aGVuIHdlIGhhdmUgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhlIFxlbXB0eSAqYW5kKiB0aGUKLSUgYnJhY2VzIChpZiBhbnkpLiAgVGhhdCdzIHdoYXQgdGhpcyBkb2VzLgotJQotXGRlZlxyZW1vdmVlbXB0eWJyYWNlc1xlbXB0eSMxXHJlbGF4eyMxfQotCi0lIEFmdGVyIFxzcGFjZXNwbGl0IGhhcyBkb25lIGl0cyB3b3JrLCB0aGlzIGlzIGNhbGxlZCAtLSAjMSBpcyB0aGUgZmluYWwKLSUgdGhpbmcgdG8gY2FsbCwgIzIgdGhlIHR5cGUgbmFtZSAod2hpY2ggc3RhcnRzIHdpdGggXGVtcHR5KSwgYW5kICMzCi0lICh3aGljaCBtaWdodCBiZSBlbXB0eSkgdGhlIGFyZ3VtZW50cy4KLSUKLVxkZWZccGFyc2V0cGhlYWRlcmxpbmUjMSMyIzN7JQotICAjMXtccmVtb3ZlZW1wdHlicmFjZXMjMlxyZWxheH17IzN9JQotfSUKLQotXGRlZlxkZWZvcHZhcnBhcnNlYm9keSAjMSMyIzMjNCM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xkZWYjNHsjIzF9JQotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjNX19fQotCi0lIFNwbGl0IHVwICMyIGF0IHRoZSBmaXJzdCBzcGFjZSB0b2tlbi4KLSUgY2FsbCAjMSB3aXRoIHR3byBhcmd1bWVudHM6Ci0lICB0aGUgZmlyc3QgaXMgYWxsIG9mICMyIGJlZm9yZSB0aGUgc3BhY2UgdG9rZW4sCi0lICB0aGUgc2Vjb25kIGlzIGFsbCBvZiAjMiBhZnRlciB0aGF0IHNwYWNlIHRva2VuLgotJSBJZiAjMiBjb250YWlucyBubyBzcGFjZSB0b2tlbiwgYWxsIG9mIGl0IGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJnCi0lIGFuZCB0aGUgc2Vjb25kIGlzIHBhc3NlZCBhcyBlbXB0eS4KLQote1xvYmV5bGluZXMKLVxnZGVmXHNwYWNlc3BsaXQjMSMyXl5Ne1xlbmRncm91cFxzcGFjZXNwbGl0Zm9veyMxfSMyIFxyZWxheFxzcGFjZXNwbGl0Zm9vfSUKLVxsb25nXGdkZWZcc3BhY2VzcGxpdGZvbyMxIzIgIzMjNFxzcGFjZXNwbGl0Zm9veyUKLVxpZnhccmVsYXggIzMlCi0jMXsjMn17fVxlbHNlICMxeyMyfXsjMyM0fVxmaX19Ci0KLSUgU28gbXVjaCBmb3IgdGhlIHRoaW5ncyBjb21tb24gdG8gYWxsIGtpbmRzIG9mIGRlZmluaXRpb25zLgotCi0lIERlZmluZSBAZGVmdW4uCi0KLSUgRmlyc3QsIGRlZmluZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHdhbnRlZCBmb3IgYXJndW1lbnRzIG9mIFxkZWZ1bgotJSBVc2UgdGhpcyB0byBleHBhbmQgdGhlIGFyZ3MgYW5kIHRlcm1pbmF0ZSB0aGUgcGFyYWdyYXBoIHRoZXkgbWFrZSB1cAotCi1cZGVmXGRlZnVuYXJncyMxe1xmdW5jdGlvbnBhcmVucyBcc2wKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLSUgU2V0IHRoZSBmb250IHRlbXBvcmFyaWx5IGFuZCB1c2UgXGZvbnQgaW4gY2FzZSBcc2V0Zm9udCBtYWRlIFx0ZW5zbCBhIG1hY3JvLgote1x0ZW5zbFxoeXBoZW5jaGFyXGZvbnQ9MH0lCi0jMSUKLXtcdGVuc2xcaHlwaGVuY2hhclxmb250PTQ1fSUKLVxpZm51bVxwYXJlbmNvdW50PTAgXGVsc2UgXGVycm1lc3NhZ2V7VW5iYWxhbmNlZCBwYXJlbnRoZXNlcyBpbiBAZGVmfVxmaSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotfQotCi1cZGVmXGRlZnR5cGVmdW5hcmdzICMxeyUKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLSUgVXNlIFxib2xkYnJheG5vYW1wLCBub3QgXGZ1bmN0aW9ucGFyZW5zLCBzbyB0aGF0ICYgaXMgbm90IHNwZWNpYWwuCi1cYm9sZGJyYXhub2FtcAotXHRjbG9zZXsjMX0lIGF2b2lkIFxjb2RlIGJlY2F1c2Ugb2Ygc2lkZSBlZmZlY3RzIG9uIGFjdGl2ZSBjaGFycwotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi19Ci0KLSUgRG8gY29tcGxldGUgcHJvY2Vzc2luZyBvZiBvbmUgQGRlZnVuIG9yIEBkZWZ1bnggbGluZSBhbHJlYWR5IHBhcnNlZC4KLQotJSBAZGVmZm4gQ29tbWFuZCBmb3J3YXJkLWNoYXIgbmNoYXJzCi0KLVxkZWZcZGVmZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZmZuXGRlZmZueFxkZWZmbmhlYWRlcn0KLQotXGRlZlxkZWZmbmhlYWRlciAjMSMyIzN7XGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdW5hcmdzeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnVuID09IEBkZWZmbiBGdW5jdGlvbgotCi1cZGVmXGRlZnVue1xkZWZwYXJzZWJvZHlcRWRlZnVuXGRlZnVueFxkZWZ1bmhlYWRlcn0KLQotXGRlZlxkZWZ1bmhlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtccHV0d29yZERlZmZ1bmN9JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmdHlwZWZ1biBpbnQgZm9vYmFyIChpbnQgQHZhcntmb299LCBmbG9hdCBAdmFye2Jhcn0pCi0KLVxkZWZcZGVmdHlwZWZ1bntcZGVmcGFyc2Vib2R5XEVkZWZ0eXBlZnVuXGRlZnR5cGVmdW54XGRlZnR5cGVmdW5oZWFkZXJ9Ci0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZS4gICMyIGlzIHRoZSBuYW1lIGFuZCBhcmdzLgotXGRlZlxkZWZ0eXBlZnVuaGVhZGVyICMxIzJ7XGRlZnR5cGVmdW5oZWFkZXJ4eyMxfSMyIFxyZWxheH0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZSwgIzIgdGhlIG5hbWUsICMzIHRoZSBhcmdzLgotXGRlZlxkZWZ0eXBlZnVuaGVhZGVyeCAjMSMyICMzXHJlbGF4eyUKLVxkb2luZCB7Zm59e1xjb2RleyMyfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkIzJ9e1xwdXR3b3JkRGVmdHlwZWZ1bn0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnR5cGVmbiB7TGlicmFyeSBGdW5jdGlvbn0gaW50IGZvb2JhciAoaW50IEB2YXJ7Zm9vfSwgZmxvYXQgQHZhcntiYXJ9KQotCi1cZGVmXGRlZnR5cGVmbntcZGVmbWV0aHBhcnNlYm9keVxFZGVmdHlwZWZuXGRlZnR5cGVmbnhcZGVmdHlwZWZuaGVhZGVyfQotCi0lIFxkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkCi0lIHB1dHMgIzEgaW4gQGNvZGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGJ1dCBkb2VzIG5vdGhpbmcgaWYgIzEgaXMgbnVsbC4KLVxkZWZcZGVmaGVhZGVyeGNvbmQjMSMyJCQke1xpZngjMVxyZWxheFxlbHNlXGNvZGV7IzEjMn0gXGZpfQotCi0lICMxIGlzIHRoZSBjbGFzc2lmaWNhdGlvbi4gICMyIGlzIHRoZSBkYXRhIHR5cGUuICAjMyBpcyB0aGUgbmFtZSBhbmQgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyICMxIzIjM3tcZGVmdHlwZWZuaGVhZGVyeHsjMX17IzJ9IzMgXHJlbGF4fQotJSAjMSBpcyB0aGUgY2xhc3NpZmljYXRpb24sICMyIHRoZSBkYXRhIHR5cGUsICMzIHRoZSBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZWZuaGVhZGVyeCAjMSMyIzMgIzRccmVsYXh7JQotXGRvaW5kIHtmbn17XGNvZGV7IzN9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXAKLVxub3JtYWxwYXJlbnMgJSBub3RhYmx5LCB0dXJuIG9mZiBgJicgbWFnaWMsIHdoaWNoIHByZXZlbnRzCi0lICAgICAgICAgICAgICAgYXQgbGVhc3Qgc29tZSBDKysgdGV4dCBmcm9tIHdvcmtpbmcKLVxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfXsjMX0lCi1cZGVmdHlwZWZ1bmFyZ3MgeyM0fVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZm1hYyA9PSBAZGVmZm4gTWFjcm8KLQotXGRlZlxkZWZtYWN7XGRlZnBhcnNlYm9keVxFZGVmbWFjXGRlZm1hY3hcZGVmbWFjaGVhZGVyfQotCi1cZGVmXGRlZm1hY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtccHV0d29yZERlZm1hY30lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZzcGVjID09IEBkZWZmbiBTcGVjaWFsIEZvcm0KLQotXGRlZlxkZWZzcGVje1xkZWZwYXJzZWJvZHlcRWRlZnNwZWNcZGVmc3BlY3hcZGVmc3BlY2hlYWRlcn0KLQotXGRlZlxkZWZzcGVjaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1xwdXR3b3JkRGVmc3BlY30lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZvcCBDQVRFR09SWSBDTEFTUyBPUEVSQVRJT04gQVJHLi4uCi0lCi1cZGVmXGRlZm9wICMxIHtcZGVmXGRlZm9wdHlwZXsjMX0lCi1cZGVmb3BwYXJzZWJvZHlcRWRlZm9wXGRlZm9weFxkZWZvcGhlYWRlclxkZWZvcHR5cGV9Ci0lCi1cZGVmXGRlZm9waGVhZGVyIzEjMiMzeyUKLVxkb3N1YmluZCB7Zm59e1xjb2RleyMyfX17XHB1dHdvcmRvblwgIzF9JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17XGRlZm9wdHlwZVwgXHB1dHdvcmRvblwgIzF9JQotXGRlZnVuYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmdHlwZW9wIENBVEVHT1JZIENMQVNTIFRZUEUgT1BFUkFUSU9OIEFSRy4uLgotJQotXGRlZlxkZWZ0eXBlb3AgIzEge1xkZWZcZGVmdHlwZW9wY2F0ZWdvcnl7IzF9JQotICBcZGVmdHlwZW9wcGFyc2Vib2R5XEVkZWZ0eXBlb3BcZGVmdHlwZW9weFxkZWZ0eXBlb3BoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgXGRlZnR5cGVvcGNhdGVnb3J5fQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIGRhdGEgdHlwZSwgIzMgdGhlIG9wZXJhdGlvbiBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZW9waGVhZGVyIzEjMiMzIzR7JQotICBcZG9zdWJpbmR7Zm59e1xjb2RleyMzfX17XHB1dHdvcmRvblwgXGNvZGV7IzF9fSUgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfQotICAgICAgICAgICAge1xkZWZ0eXBlb3BjYXRlZ29yeVwgXHB1dHdvcmRvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdHlwZWZ1bmFyZ3N7IzR9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmdHlwZW1ldGhvZCBDTEFTUyBUWVBFIE1FVEhPRCBBUkcuLi4KLSUKLVxkZWZcZGVmdHlwZW1ldGhvZHslCi0gIFxkZWZ0eXBlbWV0aHBhcnNlYm9keVxFZGVmdHlwZW1ldGhvZFxkZWZ0eXBlbWV0aG9keFxkZWZ0eXBlbWV0aG9kaGVhZGVyfQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIGRhdGEgdHlwZSwgIzMgdGhlIG1ldGhvZCBuYW1lLCAjNCB0aGUgYXJncy4KLVxkZWZcZGVmdHlwZW1ldGhvZGhlYWRlciMxIzIjMyM0eyUKLSAgXGRvc3ViaW5ke2ZufXtcY29kZXsjM319e1xwdXR3b3Jkb25cIFxjb2RleyMxfX0lIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci0gIFxiZWdpbmdyb3VwCi0gICAgXGRlZm5hbWV7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdHlwZWZ1bmFyZ3N7IzR9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmdHlwZWl2YXIgQ0xBU1MgVFlQRSBWQVJOQU1FCi0lCi1cZGVmXGRlZnR5cGVpdmFyeyUKLSAgXGRlZnR5cGVtZXRocGFyc2Vib2R5XEVkZWZ0eXBlaXZhclxkZWZ0eXBlaXZhcnhcZGVmdHlwZWl2YXJoZWFkZXJ9Ci0lCi0lICMxIGlzIHRoZSBjbGFzcyBuYW1lLCAjMiB0aGUgZGF0YSB0eXBlLCAjMyB0aGUgdmFyaWFibGUgbmFtZS4KLVxkZWZcZGVmdHlwZWl2YXJoZWFkZXIjMSMyIzN7JQotICBcZG9zdWJpbmR7dnJ9e1xjb2RleyMzfX17XHB1dHdvcmRvZlwgXGNvZGV7IzF9fSUgZW50cnkgaW4gdmFyaWFibGUgaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXsjM317XHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2ZcIFxjb2RleyMxfX0lCi0gICAgXGRlZnZhcmFyZ3N7IzN9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmbWV0aG9kID09IEBkZWZvcCBNZXRob2QKLSUKLVxkZWZcZGVmbWV0aG9ke1xkZWZtZXRocGFyc2Vib2R5XEVkZWZtZXRob2RcZGVmbWV0aG9keFxkZWZtZXRob2RoZWFkZXJ9Ci0lCi0lICMxIGlzIHRoZSBjbGFzcyBuYW1lLCAjMiB0aGUgbWV0aG9kIG5hbWUsICMzIHRoZSBhcmdzLgotXGRlZlxkZWZtZXRob2RoZWFkZXIjMSMyIzN7JQotICBcZG9zdWJpbmR7Zm59e1xjb2RleyMyfX17XHB1dHdvcmRvblwgXGNvZGV7IzF9fSUgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXsjMn17XHB1dHdvcmRNZXRob2RvblwgXGNvZGV7IzF9fSUKLSAgICBcZGVmdW5hcmdzeyMzfSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQGRlZmN2IHtDbGFzcyBPcHRpb259IGZvby1jbGFzcyBmb28tZmxhZwotCi1cZGVmXGRlZmN2ICMxIHtcZGVmXGRlZmN2dHlwZXsjMX0lCi1cZGVmb3B2YXJwYXJzZWJvZHlcRWRlZmN2XGRlZmN2eFxkZWZjdmFyaGVhZGVyXGRlZmN2dHlwZX0KLQotXGRlZlxkZWZjdmFyaGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e1xwdXR3b3Jkb2ZcICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmY3Z0eXBlXCBccHV0d29yZG9mXCAjMX0lCi1cZGVmdmFyYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmaXZhciBDTEFTUyBWQVJOQU1FID09IEBkZWZjdiB7SW5zdGFuY2UgVmFyaWFibGV9IENMQVNTIFZBUk5BTUUKLSUKLVxkZWZcZGVmaXZhcntcZGVmdnJwYXJzZWJvZHlcRWRlZml2YXJcZGVmaXZhcnhcZGVmaXZhcmhlYWRlcn0KLSUKLVxkZWZcZGVmaXZhcmhlYWRlciMxIzIjM3slCi0gIFxkb3N1YmluZCB7dnJ9e1xjb2RleyMyfX17XHB1dHdvcmRvZlwgIzF9JSBlbnRyeSBpbiB2YXIgaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXsjMn17XHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2ZcICMxfSUKLSAgICBcZGVmdmFyYXJnc3sjM30lCi0gIFxlbmRncm91cAotfQotCi0lIEBkZWZ2YXIKLSUgRmlyc3QsIGRlZmluZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHdhbnRlZCBmb3IgYXJndW1lbnRzIG9mIEBkZWZ2YXIuCi0lIFRoaXMgaXMgYWN0dWFsbHkgc2ltcGxlOiBqdXN0IHByaW50IHRoZW0gaW4gcm9tYW4uCi0lIFRoaXMgbXVzdCBleHBhbmQgdGhlIGFyZ3MgYW5kIHRlcm1pbmF0ZSB0aGUgcGFyYWdyYXBoIHRoZXkgbWFrZSB1cAotXGRlZlxkZWZ2YXJhcmdzICMxe1xub3JtYWxwYXJlbnMgIzElCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVha30KLQotJSBAZGVmdnIgQ291bnRlciBmb28tY291bnQKLQotXGRlZlxkZWZ2cntcZGVmdnJwYXJzZWJvZHlcRWRlZnZyXGRlZnZyeFxkZWZ2cmhlYWRlcn0KLQotXGRlZlxkZWZ2cmhlYWRlciAjMSMyIzN7XGRvaW5kIHt2cn17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdmFyYXJnc3sjM31cZW5kZ3JvdXB9Ci0KLSUgQGRlZnZhciA9PSBAZGVmdnIgVmFyaWFibGUKLQotXGRlZlxkZWZ2YXJ7XGRlZnZhcnBhcnNlYm9keVxFZGVmdmFyXGRlZnZhcnhcZGVmdmFyaGVhZGVyfQotCi1cZGVmXGRlZnZhcmhlYWRlciAjMSMye1xkb2luZCB7dnJ9e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17XHB1dHdvcmREZWZ2YXJ9JQotXGRlZnZhcmFyZ3MgeyMyfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZm9wdCA9PSBAZGVmdnIge1VzZXIgT3B0aW9ufQotCi1cZGVmXGRlZm9wdHtcZGVmdmFycGFyc2Vib2R5XEVkZWZvcHRcZGVmb3B0eFxkZWZvcHRoZWFkZXJ9Ci0KLVxkZWZcZGVmb3B0aGVhZGVyICMxIzJ7XGRvaW5kIHt2cn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtccHV0d29yZERlZm9wdH0lCi1cZGVmdmFyYXJncyB7IzJ9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmdHlwZXZhciBpbnQgZm9vYmFyCi0KLVxkZWZcZGVmdHlwZXZhcntcZGVmdmFycGFyc2Vib2R5XEVkZWZ0eXBldmFyXGRlZnR5cGV2YXJ4XGRlZnR5cGV2YXJoZWFkZXJ9Ci0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZS4gICMyIGlzIHRoZSBuYW1lLCBwZXJoYXBzIGZvbGxvd2VkIGJ5IHRleHQgdGhhdAotJSBpcyBhY3R1YWxseSBwYXJ0IG9mIHRoZSBkYXRhIHR5cGUsIHdoaWNoIHNob3VsZCBub3QgYmUgcHV0IGludG8gdGhlIGluZGV4LgotXGRlZlxkZWZ0eXBldmFyaGVhZGVyICMxIzJ7JQotXGRvdmFyaW5kIzIgXHJlbGF4JSBNYWtlIGVudHJ5IGluIHZhcmlhYmxlcyBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzFccmVsYXgkJCQjMn17XHB1dHdvcmREZWZ0eXBldmFyfSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi1cZW5kZ3JvdXB9Ci1cZGVmXGRvdmFyaW5kIzEgIzJccmVsYXh7XGRvaW5ke3ZyfXtcY29kZXsjMX19fQotCi0lIEBkZWZ0eXBldnIge0dsb2JhbCBGbGFnfSBpbnQgZW5hYmxlCi0KLVxkZWZcZGVmdHlwZXZye1xkZWZ2cnBhcnNlYm9keVxFZGVmdHlwZXZyXGRlZnR5cGV2cnhcZGVmdHlwZXZyaGVhZGVyfQotCi1cZGVmXGRlZnR5cGV2cmhlYWRlciAjMSMyIzN7XGRvdmFyaW5kIzMgXHJlbGF4JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317IzF9Ci1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotXGVuZGdyb3VwfQotCi0lIE5vdyBkZWZpbmUgQGRlZnRwCi0lIEFyZ3MgYXJlIHByaW50ZWQgaW4gYm9sZCwgYSBzbGlnaHQgZGlmZmVyZW5jZSBmcm9tIEBkZWZ2YXIuCi0KLVxkZWZcZGVmdHBhcmdzICMxe1xiZiBcZGVmdmFyYXJnc3sjMX19Ci0KLSUgQGRlZnRwIENsYXNzIHdpbmRvdyBoZWlnaHQgd2lkdGggLi4uCi0KLVxkZWZcZGVmdHB7XGRlZnRwcGFyc2Vib2R5XEVkZWZ0cFxkZWZ0cHhcZGVmdHBoZWFkZXJ9Ci0KLVxkZWZcZGVmdHBoZWFkZXIgIzEjMiMze1xkb2luZCB7dHB9e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnRwYXJnc3sjM31cZW5kZ3JvdXB9Ci0KLSUgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHVzZWQgaWYgeW91IHVzZSBAZGVmdW54IChldGMuKQotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnVuIG9yIEBkZWZ1bnguCi0lIAotXGRlZlxkZWZjdngjMSB7XGVycm1lc3NhZ2V7QGRlZmN2eCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZmbngjMSB7XGVycm1lc3NhZ2V7QGRlZmZueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZpdmFyeCMxIHtcZXJybWVzc2FnZXtAZGVmaXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmbWFjeCMxIHtcZXJybWVzc2FnZXtAZGVmbWFjeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZtZXRob2R4IzEge1xlcnJtZXNzYWdle0BkZWZtZXRob2R4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm9wdHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHR4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm9weCMxIHtcZXJybWVzc2FnZXtAZGVmb3B4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnNwZWN4IzEge1xlcnJtZXNzYWdle0BkZWZzcGVjeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0cHgjMSB7XGVycm1lc3NhZ2V7QGRlZnRweCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlZm54IzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZm54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVmdW54IzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlaXZhcngjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVpdmFyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlbWV0aG9keCMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZW1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZW9weCMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZW9weCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBldmFyeCMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZXZyeCMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ1bngjMSB7XGVycm1lc3NhZ2V7QGRlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ2YXJ4IzEge1xlcnJtZXNzYWdle0BkZWZ2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnZyeCMxIHtcZXJybWVzc2FnZXtAZGVmdnJ4IGluIGludmFsaWQgY29udGV4dH19Ci0KLQotXG1lc3NhZ2V7bWFjcm9zLH0KLSUgQG1hY3JvLgotCi0lIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLAotJSB3aGljaCB3ZSBhcnJhbmdlIHRvIGVtdWxhdGUgd2l0aCBhIHRlbXBvcmFyeSBmaWxlIGluIG9yZGluYXJ5IFRlWC4KLVxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCi0gXG5ld3dyaXRlXG1hY3NjcmliYmxlCi0gXGRlZlxzY2FubWFjcm8jMXslCi0gICBcYmVnaW5ncm91cCBcbmV3bGluZWNoYXJgXF5eTQotICAgJSBVbmRvIGNhdGNvZGUgY2hhbmdlcyBvZiBcc3RhcnRjb250ZW50cyBhbmQgXGRvcHJpbnRpbmRleAotICAgXGNhdGNvZGVgXEA9MCBcY2F0Y29kZWBcXD0xMiBcZXNjYXBlY2hhcj1gXEAKLSAgICUgQXBwZW5kIFxlbmRpbnB1dCB0byBtYWtlIHN1cmUgdGhhdCBUZVggZG9lcyBub3Qgc2VlIHRoZSBlbmRpbmcgbmV3bGluZS4KLSAgIFx0b2tzMD17IzFcZW5kaW5wdXR9JQotICAgXGltbWVkaWF0ZVxvcGVub3V0XG1hY3NjcmliYmxlPVxqb2JuYW1lLnRtcAotICAgXGltbWVkaWF0ZVx3cml0ZVxtYWNzY3JpYmJsZXtcdGhlXHRva3MwfSUKLSAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcbWFjc2NyaWJibGUKLSAgIFxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXMKLSAgIFxpbnB1dCBcam9ibmFtZS50bXAKLSAgIFxlbmRncm91cAotfQotXGVsc2UKLVxkZWZcc2Nhbm1hY3JvIzF7JQotXGJlZ2luZ3JvdXAgXG5ld2xpbmVjaGFyYFxeXk0KLSUgVW5kbyBjYXRjb2RlIGNoYW5nZXMgb2YgXHN0YXJ0Y29udGVudHMgYW5kIFxkb3ByaW50aW5kZXgKLVxjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9MTIgXGVzY2FwZWNoYXI9YFxACi1cbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzXHNjYW50b2tlbnN7IzFcZW5kaW5wdXR9XGVuZGdyb3VwfQotXGZpCi0KLVxuZXdjb3VudFxwYXJhbW5vICAgJSBDb3VudCBvZiBwYXJhbWV0ZXJzCi1cbmV3dG9rc1xtYWNuYW1lICAgICUgTWFjcm8gbmFtZQotXG5ld2lmXGlmcmVjdXJzaXZlICAlIElzIGl0IHJlY3Vyc2l2ZT8KLVxkZWZcbWFjcm9saXN0e30gICAgJSBMaXN0IG9mIGFsbCBkZWZpbmVkIG1hY3JvcyBpbiB0aGUgZm9ybQotICAgICAgICAgICAgICAgICAgICAlIFxkb1xtYWNybzFcZG9cbWFjcm8yLi4uCi0KLSUgVXRpbGl0eSByb3V0aW5lcy4KLSUgVGhpc2RvZXMgXGxldCAjMSA9ICMyLCBleGNlcHQgd2l0aCBcY3NuYW1lcy4KLVxkZWZcY3NsZXQjMSMyeyUKLVxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotXGV4cGFuZGFmdGVyXGxldAotXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi1cY3NuYW1lIzFcZW5kY3NuYW1lCi1cY3NuYW1lIzJcZW5kY3NuYW1lfQotCi0lIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIG9mZiBhIHN0cmluZy4KLSUgQ29uY2VwdHMgZnJvbSBhcm8tYmVuZCBwcm9ibGVtIDE1IChzZWUgQ1RBTikuCi17XGNhdGNvZGVgXEA9MTEKLVxnZGVmXGVhdHNwYWNlcyAjMXtcZXhwYW5kYWZ0ZXJcdHJpbUBcZXhwYW5kYWZ0ZXJ7IzEgfX0KLVxnZGVmXHRyaW1AICMxe1x0cmltQEAgQCMxIEAgIzEgQCBAQH0KLVxnZGVmXHRyaW1AQCAjMUAgIzJAICMzQEB7XHRyaW1AQEBcZW1wdHkgIzIgQH0KLVxkZWZcdW5icmFjZSMxeyMxfQotXHVuYnJhY2V7XGdkZWZcdHJpbUBAQCAjMSB9ICMyQHsjMX0KLX0KLQotJSBUcmltIGEgc2luZ2xlIHRyYWlsaW5nIF5eTSBvZmYgYSBzdHJpbmcuCi17XGNhdGNvZGVgXF5eTT0xMlxjYXRjb2RlYFxRPTMlCi1cZ2RlZlxlYXRjciAjMXtcZWF0Y3JhICMxUV5eTVF9JQotXGdkZWZcZWF0Y3JhIzFeXk1Re1xlYXRjcmIjMVF9JQotXGdkZWZcZWF0Y3JiIzFRIzJReyMxfSUKLX0KLQotJSBNYWNybyBib2RpZXMgYXJlIGFic29yYmVkIGFzIGFuIGFyZ3VtZW50IGluIGEgY29udGV4dCB3aGVyZQotJSBhbGwgY2hhcmFjdGVycyBhcmUgY2F0Y29kZSAxMCwgMTEgb3IgMTIsIGV4Y2VwdCBcIHdoaWNoIGlzIGFjdGl2ZQotJSAoYXMgaW4gbm9ybWFsIHRleGluZm8pLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIFwuCi0KLSUgSXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBoYXJkIENScyB3aGVuIHRoZSBtYWNybyBpcyBleGVjdXRlZC4gVGhpcyBpcwotJSBkb25lIGJ5ICBtYWtpbmcgXl5NIChcZW5kbGluZWNoYXIpIGNhdGNvZGUgMTIgd2hlbiByZWFkaW5nIHRoZSBtYWNybwotJSBib2R5LCBhbmQgdGhlbiBtYWtpbmcgaXQgdGhlIFxuZXdsaW5lY2hhciBpbiBcc2Nhbm1hY3JvLgotCi1cZGVmXG1hY3JvYm9keWN0eHR7JQotICBcY2F0Y29kZWBcfj0xMgotICBcY2F0Y29kZWBcXj0xMgotICBcY2F0Y29kZWBcXz0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcY2F0Y29kZWBcKz0xMgotICBcY2F0Y29kZWBcez0xMgotICBcY2F0Y29kZWBcfT0xMgotICBcY2F0Y29kZWBcQD0xMgotICBcY2F0Y29kZWBcXl5NPTEyCi0gIFx1c2VtYm9keWJhY2tzbGFzaH0KLQotXGRlZlxtYWNyb2FyZ2N0eHR7JQotICBcY2F0Y29kZWBcfj0xMgotICBcY2F0Y29kZWBcXj0xMgotICBcY2F0Y29kZWBcXz0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcY2F0Y29kZWBcKz0xMgotICBcY2F0Y29kZWBcQD0xMgotICBcY2F0Y29kZWBcXD0xMn0KLQotJSBcbWJvZHliYWNrc2xhc2ggaXMgdGhlIGRlZmluaXRpb24gb2YgXCBpbiBAbWFjcm8gYm9kaWVzLgotJSBJdCBtYXBzIFxmb29cID0+IFxjc25hbWUgbWFjYXJnLmZvb1xlbmRjc25hbWUgPT4gI04KLSUgd2hlcmUgTiBpcyB0aGUgbWFjcm8gcGFyYW1ldGVyIG51bWJlci4KLSUgV2UgZGVmaW5lIFxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWUgdG8gYmUgXHJlYWxiYWNrc2xhc2gsIHNvCi0lIFxcIGluIG1hY3JvIHJlcGxhY2VtZW50IHRleHQgZ2V0cyB5b3UgYSBiYWNrc2xhc2guCi0KLXtcY2F0Y29kZWBAPTAgQGNhdGNvZGVgQFw9QGFjdGl2ZQotIEBnZGVmQHVzZW1ib2R5YmFja3NsYXNoe0BsZXRcPUBtYm9keWJhY2tzbGFzaH0KLSBAZ2RlZkBtYm9keWJhY2tzbGFzaCMxXHtAY3NuYW1lIG1hY2FyZy4jMUBlbmRjc25hbWV9Ci19Ci1cZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaH0KLQotXGRlZlxtYWNyb3tccmVjdXJzaXZlZmFsc2VccGFyc2VhcmdcbWFjcm94eHh9Ci1cZGVmXHJtYWNyb3tccmVjdXJzaXZldHJ1ZVxwYXJzZWFyZ1xtYWNyb3h4eH0KLQotXGRlZlxtYWNyb3h4eCMxeyUKLSAgXGdldGFyZ3N7IzF9JSAgICAgICAgICAgbm93IFxtYWNuYW1lIGlzIHRoZSBtYWNuYW1lIGFuZCBcYXJnbCB0aGUgYXJnbGlzdAotICBcaWZ4XGFyZ2xcZW1wdHkgICAgICAgJSBubyBhcmd1bWVudHMKLSAgICAgXHBhcmFtbm89MCUKLSAgXGVsc2UKLSAgICAgXGV4cGFuZGFmdGVyXHBhcnNlbWFyZ2RlZiBcYXJnbDslCi0gIFxmaQotICBcaWYxXGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUKLSAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQotICBcZWxzZQotICAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBcdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAotICAgICBcZWxzZSBcZXJybWVzc2FnZXtUaGUgbmFtZSBcdGhlXG1hY25hbWVcc3BhY2UgaXMgcmVzZXJ2ZWR9XGZpCi0gICAgIFxnbG9iYWxcY3NsZXR7bWFjc2F2ZS5cdGhlXG1hY25hbWV9e1x0aGVcbWFjbmFtZX0lCi0gICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWU9MSUKLSAgICAgJSBBZGQgdGhlIG1hY3JvbmFtZSB0byBcbWFjcm9saXN0Ci0gICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcbWFjcm9saXN0XGRvfSUKLSAgICAgXHhkZWZcbWFjcm9saXN0e1x0aGVcdG9rczAKLSAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZX0lCi0gIFxmaQotICBcYmVnaW5ncm91cCBcbWFjcm9ib2R5Y3R4dAotICBcaWZyZWN1cnNpdmUgXGV4cGFuZGFmdGVyXHBhcnNlcm1hY2JvZHkKLSAgXGVsc2UgXGV4cGFuZGFmdGVyXHBhcnNlbWFjYm9keQotICBcZml9Ci0KLVxkZWZcdW5tYWNyb3tccGFyc2VhcmdcdW5tYWNyb3h4eH0KLVxkZWZcdW5tYWNyb3h4eCMxeyUKLSAgXGlmMVxjc25hbWUgaXNtYWNyby4jMVxlbmRjc25hbWUKLSAgICBcZ2xvYmFsXGNzbGV0eyMxfXttYWNzYXZlLiMxfSUKLSAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldCBcY3NuYW1lIGlzbWFjcm8uIzFcZW5kY3NuYW1lPTAlCi0gICAgJSBSZW1vdmUgdGhlIG1hY3JvIG5hbWUgZnJvbSBcbWFjcm9saXN0Ci0gICAgXGJlZ2luZ3JvdXAKLSAgICAgIFxlZGVmXHRlbXBhe1xleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWUjMVxlbmRjc25hbWV9JQotICAgICAgXGRlZlxkbyMjMXslCi0gICAgICAgIFxkZWZcdGVtcGJ7IyMxfSUKLSAgICAgICAgXGlmeFx0ZW1wYVx0ZW1wYgotICAgICAgICAgICUgcmVtb3ZlIHRoaXMKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XG5ld21hY3JvbGlzdFxkb30lCi0gICAgICAgICAgXGVkZWZcbmV3bWFjcm9saXN0e1x0aGVcdG9rczBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcdGVtcGF9JQotICAgICAgICBcZml9JQotICAgICAgXGRlZlxuZXdtYWNyb2xpc3R7fSUKLSAgICAgICUgRXhlY3V0ZSBtYWNybyBsaXN0IHRvIGRlZmluZSBcbmV3bWFjcm9saXN0Ci0gICAgICBcbWFjcm9saXN0Ci0gICAgICBcZ2xvYmFsXGxldFxtYWNyb2xpc3RcbmV3bWFjcm9saXN0Ci0gICAgXGVuZGdyb3VwCi0gIFxlbHNlCi0gICAgXGVycm1lc3NhZ2V7TWFjcm8gIzEgbm90IGRlZmluZWR9JQotICBcZmkKLX0KLQotJSBUaGlzIG1ha2VzIHVzZSBvZiB0aGUgb2JzY3VyZSBmZWF0dXJlIHRoYXQgaWYgdGhlIGxhc3QgdG9rZW4gb2YgYQotJSA8cGFyYW1ldGVyIGxpc3Q+IGlzICMsIHRoZW4gdGhlIHByZWNlZGluZyBhcmd1bWVudCBpcyBkZWxpbWl0ZWQgYnkKLSUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCi1cZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319Ci1cZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9Ci1cZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KLVxkZWZcZ2V0bWFjYXJncyMxe1xkZWZcYXJnbHsjMX19Ci0KLSUgUGFyc2UgdGhlIG9wdGlvbmFsIHtwYXJhbXN9IGxpc3QuICBTZXQgdXAgXHBhcmFtbm8gYW5kIFxwYXJhbWxpc3QKLSUgc28gXGRlZm1hY3JvIGtub3dzIHdoYXQgdG8gZG8uICBEZWZpbmUgXG1hY2FyZy5ibGFoIGZvciBlYWNoIGJsYWgKLSUgaW4gdGhlIHBhcmFtcyBsaXN0LCB0byBiZSAjI04gd2hlcmUgTiBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LgotJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KLQotJSBXZSBuZWVkIHRvIGdldCBgbWFjcm8gcGFyYW1ldGVyIGNoYXIgIycgaW50byBzZXZlcmFsIGRlZmluaXRpb25zLgotJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6ICBsZXQgXGhhc2ggYmUgc29tZXRoaW5nCi0lIHVuZXhwYW5kYWJsZSwgaW5zZXJ0IHRoYXQgd2hlcmV2ZXIgeW91IG5lZWQgYSAjLCBhbmQgdGhlbiByZWRlZmluZQotJSBpdCB0byAjIGp1c3QgYmVmb3JlIHVzaW5nIHRoZSB0b2tlbiBsaXN0IHByb2R1Y2VkLgotJQotJSBUaGUgc2FtZSB0ZWNobmlxdWUgaXMgdXNlZCB0byBwcm90ZWN0IFxlYXRzcGFjZXMgdGlsbCBqdXN0IGJlZm9yZQotJSB0aGUgbWFjcm8gaXMgdXNlZC4KLQotXGRlZlxwYXJzZW1hcmdkZWYjMTt7XHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCi0gICAgICAgIFxsZXRcaGFzaFxyZWxheFxsZXRceGVhdHNwYWNlc1xyZWxheFxwYXJzZW1hcmdkZWZ4eHgjMSw7LH0KLVxkZWZccGFyc2VtYXJnZGVmeHh4IzEseyUKLSAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAotICBcZWxzZSBcbGV0XG5leHQ9XHBhcnNlbWFyZ2RlZnh4eAotICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMSUKLSAgICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgbWFjYXJnLlxlYXRzcGFjZXN7IzF9XGVuZGNzbmFtZQotICAgICAgICB7XHhlYXRzcGFjZXN7XGhhc2hcdGhlXHBhcmFtbm99fSUKLSAgICBcZWRlZlxwYXJhbWxpc3R7XHBhcmFtbGlzdFxoYXNoXHRoZVxwYXJhbW5vLH0lCi0gIFxmaVxuZXh0fQotCi0lIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KLSUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQotCi1cbG9uZ1xkZWZccGFyc2VtYWNib2R5IzFAZW5kIG1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotXGxvbmdcZGVmXHBhcnNlcm1hY2JvZHkjMUBlbmQgcm1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotCi0lIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCi0lIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCi0lIE11Y2ggbWFnaWMgd2l0aCBcZXhwYW5kYWZ0ZXIgaGVyZS4KLSUgXHhkZWYgaXMgdXNlZCBzbyB0aGF0IG1hY3JvIGRlZmluaXRpb25zIHdpbGwgc3Vydml2ZSB0aGUgZmlsZQotJSB0aGV5J3JlIGRlZmluZWQgaW47IEBpbmNsdWRlIHJlYWRzIHRoZSBmaWxlIGluc2lkZSBhIGdyb3VwLgotXGRlZlxkZWZtYWNyb3slCi0gIFxsZXRcaGFzaD0jIyUgY29udmVydCBwbGFjZWhvbGRlcnMgdG8gbWFjcm8gcGFyYW1ldGVyIGNoYXJzCi0gIFxpZnJlY3Vyc2l2ZQotICAgIFxpZmNhc2VccGFyYW1ubwotICAgICUgMAotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcb3IgJSAxCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0Ci0gICAgICAgICBcbm9leHBhbmRcYnJhY2VvcmxpbmUKLSAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgICBcZWdyb3VwXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxlbHNlICUgbWFueQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAotICAgICAgICAgXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWV9JQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZgotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQotICAgICAgICAgIFxwYXJhbWxpc3R7XGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcZmkKLSAgXGVsc2UKLSAgICBcaWZjYXNlXHBhcmFtbm8KLSAgICAlIDAKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXG9yICUgMQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAotICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lCi0gICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQotICAgICAgICBcZWdyb3VwCi0gICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcZWxzZSAlIG1hbnkKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKLSAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWUjIzF7JQotICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lCi0gICAgICBccGFyYW1saXN0eyUKLSAgICAgICAgICBcZWdyb3VwCi0gICAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXGZpCi0gIFxmaX0KLQotXGRlZlxub3JlY3Vyc2UjMXtcYmdyb3VwXGNzbGV0eyMxfXttYWNzYXZlLiMxfX0KLQotJSBcYnJhY2VvcmxpbmUgZGVjaWRlcyB3aGV0aGVyIHRoZSBuZXh0IG5vbndoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEKLSUgey4gIElmIHNvIGl0IHJlYWRzIHVwIHRvIHRoZSBjbG9zaW5nIH0sIGlmIG5vdCwgaXQgcmVhZHMgdGhlIHdob2xlCi0lIGxpbmUuICBXaGF0ZXZlciB3YXMgcmVhZCBpcyB0aGVuIGZlZCB0byB0aGUgbmV4dCBjb250cm9sIHNlcXVlbmNlCi0lIGFzIGFuIGFyZ3VtZW50IChieSBccGFyc2VicmFjZSBvciBccGFyc2VhcmcpCi1cZGVmXGJyYWNlb3JsaW5lIzF7XGxldFxuZXh0PSMxXGZ1dHVyZWxldFxuY2hhclxicmFjZW9ybGluZXh4eH0KLVxkZWZcYnJhY2VvcmxpbmV4eHh7JQotICBcaWZ4XG5jaGFyXGJncm91cFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnCi0gIFxmaSBcbmV4dH0KLQotJSBXZSBtYW50IHRvIGRpc2FibGUgYWxsIG1hY3JvcyBkdXJpbmcgXHNoaXBvdXQgc28gdGhhdCB0aGV5IGFyZSBub3QKLSUgZXhwYW5kZWQgYnkgXHdyaXRlLgotXGRlZlx0dXJub2ZmbWFjcm9ze1xiZWdpbmdyb3VwIFxkZWZcZG8jIzF7XGxldFxub2V4cGFuZCMjMT1ccmVsYXh9JQotICBcZWRlZlxuZXh0e1xtYWNyb2xpc3R9XGV4cGFuZGFmdGVyXGVuZGdyb3VwXG5leHR9Ci0KLQotJSBAYWxpYXMuCi0lIFdlIG5lZWQgc29tZSB0cmlja2VyeSB0byByZW1vdmUgdGhlIG9wdGlvbmFsIHNwYWNlcyBhcm91bmQgdGhlIGVxdWFsCi0lIHNpZ24uICBKdXN0IG1ha2UgdGhlbSBhY3RpdmUgYW5kIHRoZW4gZXhwYW5kIHRoZW0gYWxsIHRvIG5vdGhpbmcuCi1cZGVmXGFsaWFze1xiZWdpbmdyb3VwXG9iZXlzcGFjZXNccGFyc2VhcmdcYWxpYXN4eHh9Ci1cZGVmXGFsaWFzeHh4ICMxe1xhbGlhc3l5eSMxXHJlbGF4fQotXGRlZlxhbGlhc3l5eSAjMT0jMlxyZWxheHtcaWdub3JlYWN0aXZlc3BhY2VzCi1cZWRlZlxuZXh0e1xnbG9iYWxcbGV0XGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZSMxXGVuZGNzbmFtZT0lCi0gICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWUjMlxlbmRjc25hbWV9JQotXGV4cGFuZGFmdGVyXGVuZGdyb3VwXG5leHR9Ci0KLQotXG1lc3NhZ2V7Y3Jvc3MgcmVmZXJlbmNlcyx9Ci0lIEB4cmVmIGV0Yy4KLQotXG5ld3dyaXRlXGF1eGZpbGUKLQotXG5ld2lmXGlmaGF2ZXhyZWZzICAgICUgVHJ1ZSBpZiB4cmVmIHZhbHVlcyBhcmUga25vd24uCi1cbmV3aWZcaWZ3YXJuZWR4cmVmcyAgJSBUcnVlIGlmIHdlIHdhcm5lZCBvbmNlIHRoYXQgdGhleSBhcmVuJ3Qga25vd24uCi0KLSUgQGluZm9yZWYgaXMgcmVsYXRpdmVseSBzaW1wbGUuCi1cZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9Ci1cZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCi0gIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQotCi0lIEBub2RlJ3Mgam9iIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUuCi1cZGVmXG5vZGV7XEVOVmNoZWNrXHBhcnNlYXJnXG5vZGV6enp9Ci1cZGVmXG5vZGV6enojMXtcbm9kZXh4eCBbIzEsXX0KLVxkZWZcbm9kZXh4eFsjMSwjMl17XGdkZWZcbGFzdG5vZGV7IzF9fQotXGxldFxud25vZGU9XG5vZGUKLVxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0KLSUgVGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgKEBjaGFwdGVyLCBldGMuKSBjYWxsIHRoZXNlLgotXGRlZlxkb25vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX0lCi0gICAgICB7WXNlY3Rpb25udW1iZXJhbmR0eXBlfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci1cZGVmXHVubnVtYm5vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX17WW5vdGhpbmd9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLVxkZWZcYXBwZW5kaXhub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9JQotICAgICAge1lhcHBlbmRpeGxldHRlcmFuZHR5cGV9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLQotCi0lIEBhbmNob3J7TkFNRX0gLS0gZGVmaW5lIHhyZWYgdGFyZ2V0IGF0IGFyYml0cmFyeSBwb2ludC4KLSUKLVxuZXdjb3VudFxzYXZlc2ZyZWdpc3RlcgotXGdkZWZcc2F2ZXNme1xyZWxheCBcaWZobW9kZSBcc2F2ZXNmcmVnaXN0ZXI9XHNwYWNlZmFjdG9yIFxmaX0KLVxnZGVmXHJlc3RvcmVzZntccmVsYXggXGlmaG1vZGUgXHNwYWNlZmFjdG9yPVxzYXZlc2ZyZWdpc3RlciBcZml9Ci1cZ2RlZlxhbmNob3IjMXtcc2F2ZXNmIFxzZXRyZWZ7IzF9e1lub3RoaW5nfVxyZXN0b3Jlc2YgXGlnbm9yZXNwYWNlc30KLQotJSBcc2V0cmVme05BTUV9e1NOVH0gZGVmaW5lcyBhIGNyb3NzLXJlZmVyZW5jZSBwb2ludCBOQU1FLCBuYW1lbHkKLSUgTkFNRS10aXRsZSwgTkFNRS1wZywgYW5kIE5BTUUtU05ULiAgQ2FsbGVkIGZyb20gXGZvb25vZGVyZWYuICBXZSBoYXZlCi0lIHRvIHNldCBcaW5kZXhkdW1taWVzIHNvIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGUgaW4gYSBzZWN0aW9uIHRpdGxlCi0lIGFyZW4ndCBleHBhbmRlZC4gIEl0IHdvdWxkIGJlIG5pY2VyIG5vdCB0byBleHBhbmQgdGhlIHRpdGxlcyBpbiB0aGUKLSUgZmlyc3QgcGxhY2UsIGJ1dCB0aGVyZSdzIHNvIG1hbnkgbGF5ZXJzIHRoYXQgdGhhdCBpcyBoYXJkIHRvIGRvLgotJQotXGRlZlxzZXRyZWYjMSMye3slCi0gIFxpbmRleGR1bW1pZXMKLSAgXHBkZm1rZGVzdHsjMX0lCi0gIFxkb3NldHF7IzEtdGl0bGV9e1l0aXRsZX0lCi0gIFxkb3NldHF7IzEtcGd9e1lwYWdlbnVtYmVyfSUKLSAgXGRvc2V0cXsjMS1zbnR9eyMyfSUKLX19Ci0KLSUgQHhyZWYsIEBweHJlZiwgYW5kIEByZWYgZ2VuZXJhdGUgY3Jvc3MtcmVmZXJlbmNlcy4gIEZvciBceHJlZlgsICMxIGlzCi0lIHRoZSBub2RlIG5hbWUsICMyIHRoZSBuYW1lIG9mIHRoZSBJbmZvIGNyb3NzLXJlZmVyZW5jZSwgIzMgdGhlIHByaW50ZWQKLSUgbm9kZSBuYW1lLCAjNCB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLCAjNSB0aGUgbmFtZSBvZiB0aGUgcHJpbnRlZAotJSBtYW51YWwuICBBbGwgYnV0IHRoZSBub2RlIG5hbWUgY2FuIGJlIG9taXR0ZWQuCi0lCi1cZGVmXHB4cmVmIzF7XHB1dHdvcmRzZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZceHJlZiMxe1xwdXR3b3JkU2Vle30gXHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHJlZiMxe1x4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlx4cmVmWFsjMSwjMiwjMywjNCwjNSwjNl17XGJlZ2luZ3JvdXAKLSAgXHVuc2Vwc3BhY2VzCi0gIFxkZWZccHJpbnRlZG1hbnVhbHtcaWdub3Jlc3BhY2VzICM1fSUKLSAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjM30lCi0gIFxzZXRib3gxPVxoYm94e1xwcmludGVkbWFudWFsfSUKLSAgXHNldGJveDA9XGhib3h7XHByaW50ZWRub2RlbmFtZX0lCi0gIFxpZmRpbSBcd2QwID0gMHB0Ci0gICAgJSBObyBwcmludGVkIG5vZGUgbmFtZSB3YXMgZXhwbGljaXRseSBnaXZlbi4KLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVR4cmVmLWF1dG9tYXRpYy1zZWN0aW9uLXRpdGxlXGVuZGNzbmFtZVxyZWxheAotICAgICAgJSBVc2UgdGhlIG5vZGUgbmFtZSBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KLSAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgIFxlbHNlCi0gICAgICAlIFVzZSB0aGUgYWN0dWFsIGNoYXB0ZXIvc2VjdGlvbiB0aXRsZSBhcHBlYXIgaW5zaWRlCi0gICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMuICBVc2UgdGhlIHJlYWwgc2VjdGlvbiB0aXRsZSBpZiB3ZSBoYXZlIGl0LgotICAgICAgXGlmZGltIFx3ZDEgPiAwcHQKLSAgICAgICAgJSBJdCBpcyBpbiBhbm90aGVyIG1hbnVhbCwgc28gd2UgZG9uJ3QgaGF2ZSBpdC4KLSAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICBcZWxzZQotICAgICAgICBcaWZoYXZleHJlZnMKLSAgICAgICAgICAlIFdlIGtub3cgdGhlIHJlYWwgdGl0bGUgaWYgd2UgaGF2ZSB0aGUgeHJlZiB2YWx1ZXMuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XHJlZnh7IzEtdGl0bGV9e319JQotICAgICAgICBcZWxzZQotICAgICAgICAgICUgT3RoZXJ3aXNlIGp1c3QgY29weSB0aGUgSW5mbyBub2RlIG5hbWUuCi0gICAgICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgICAgIFxmaSUKLSAgICAgIFxmaQotICAgIFxmaQotICBcZmkKLSAgJQotICAlIElmIHdlIHVzZSBcdW5oYm94MCBhbmQgXHVuaGJveDEgdG8gcHJpbnQgdGhlIG5vZGUgbmFtZXMsIFRlWCBkb2VzIG5vdAotICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCi0gICUgbm90IGZpbmQgYSBsaW5lIGJyZWFrIGF0IGEgaHlwaGVuIGluIGEgbm9kZSBuYW1lcy4gIFNpbmNlIHNvbWUgbWFudWFscwotICAlIGFyZSBiZXN0IHdyaXR0ZW4gd2l0aCBmYWlybHkgbG9uZyBub2RlIG5hbWVzLCBjb250YWluaW5nIGh5cGhlbnMsIHRoaXMKLSAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKLSAgJSBpcyBhcyBpZiBUZVggaXMgc2VlaW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KLSAgXGlmcGRmCi0gICAgXGxlYXZldm1vZGUKLSAgICBcZ2V0ZmlsZW5hbWV7IzR9JQotICAgIFxpZm51bVxmaWxlbmFtZWxlbmd0aD4wCi0gICAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSUKLSAgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1leyMxQH0lCi0gICAgXGVsc2UKLSAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQotICAgICAgICBnb3RvIG5hbWV7IzFAfSUKLSAgICBcZmkKLSAgICBcbGlua2NvbG9yCi0gIFxmaQotICAlCi0gIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgXHB1dHdvcmRzZWN0aW9ue30gYGBccHJpbnRlZG5vZGVuYW1lJycgXHB1dHdvcmRpbnt9IFxjaXRle1xwcmludGVkbWFudWFsfSUKLSAgXGVsc2UKLSAgICAlIF8gKGZvciBleGFtcGxlKSBoYXMgdG8gYmUgdGhlIGNoYXJhY3RlciBfIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlCi0gICAgJSBjb250cm9sIHNlcXVlbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUsIGJ1dCBpdCBoYXMgdG8gZXhwYW5kCi0gICAgJSBpbnRvIHRoZSB1c3VhbCBcbGVhdmV2bW9kZS4uLlx2cnVsZSBzdHVmZiBmb3IgcHVycG9zZXMgb2YKLSAgICAlIHByaW50aW5nLiBTbyB3ZSBcdHVybm9mZmFjdGl2ZSBmb3IgdGhlIFxyZWZ4LXNudCwgYmFjayBvbiBmb3IgdGhlCi0gICAgJSBwcmludGluZywgYmFjayBvZmYgZm9yIHRoZSBccmVmeC1wZy4KLSAgICB7XG5vcm1hbHR1cm5vZmZhY3RpdmUKLSAgICAgJSBPbmx5IG91dHB1dCBhIGZvbGxvd2luZyBzcGFjZSBpZiB0aGUgLXNudCByZWYgaXMgbm9uZW1wdHk7IGZvcgotICAgICAlIEB1bm51bWJlcmVkIGFuZCBAYW5jaG9yLCBpdCB3b24ndCBiZS4KLSAgICAgXHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzIFxyZWZ4eyMxLXNudH17fX0lCi0gICAgIFxpZmRpbSBcd2QyID4gMHB0IFxyZWZ4eyMxLXNudH1cc3BhY2VcZmkKLSAgICB9JQotICAgICUgW215bm9kZV0sCi0gICAgW1xwcmludGVkbm9kZW5hbWVdLFxzcGFjZQotICAgICUgcGFnZSAzCi0gICAgXHR1cm5vZmZhY3RpdmUgXHB1dHdvcmRwYWdlXHRpZVxyZWZ4eyMxLXBnfXt9JQotICBcZmkKLSAgXGVuZGxpbmsKLVxlbmRncm91cH0KLQotJSBcZG9zZXRxIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGNhbGxzIGZyb20gb3RoZXIgbWFjcm9zCi0KLSUgVXNlIFxub3JtYWx0dXJub2ZmYWN0aXZlIHNvIHRoYXQgcHVuY3R1YXRpb24gY2hhcnMgc3VjaCBhcyB1bmRlcnNjb3JlCi0lIGFuZCBiYWNrc2xhc2ggd29yayBpbiBub2RlIG5hbWVzLiAgKFx0dXJub2ZmYWN0aXZlIGRvZXNuJ3QgZG8gXC4pCi1cZGVmXGRvc2V0cSMxIzJ7JQotICB7XGxldFxmb2xpbz0wJQotICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKLSAgIFxlZGVmXG5leHR7XHdyaXRlXGF1eGZpbGV7XGludGVybmFsc2V0cXsjMX17IzJ9fX0lCi0gICBcaWZsaW5rcwotICAgICBcbmV4dAotICAgXGZpCi0gIH0lCi19Ci0KLSUgXGludGVybmFsc2V0cSB7Zm9vfXtwYWdlfSBleHBhbmRzIGludG8KLSUgQ0hBUkFDVEVSUyAneHJkZWYge2Zvb317Li4uZXhwYW5zaW9uIG9mIFxZcGFnZS4uLn0KLSUgV2hlbiB0aGUgYXV4IGZpbGUgaXMgcmVhZCwgJyBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgotCi1cZGVmXGludGVybmFsc2V0cSAjMSMyeyd4cmRlZiB7IzF9e1xjc25hbWUgIzJcZW5kY3NuYW1lfX0KLQotJSBUaGluZ3MgdG8gYmUgZXhwYW5kZWQgYnkgXGludGVybmFsc2V0cQotCi1cZGVmXFlwYWdlbnVtYmVye1xmb2xpb30KLQotXGRlZlxZdGl0bGV7XHRoaXNzZWN0aW9ufQotCi1cZGVmXFlub3RoaW5ne30KLQotXGRlZlxZc2VjdGlvbm51bWJlcmFuZHR5cGV7JQotXGlmbnVtXHNlY25vPTAgXHB1dHdvcmRDaGFwdGVyXHhyZWZ0aWVcdGhlXGNoYXBubyAlCi1cZWxzZSBcaWZudW0gXHN1YnNlY25vPTAgXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vICUKLVxlbHNlIFxpZm51bSBcc3Vic3Vic2Vjbm89MCAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubyAlCi1cZWxzZSAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vICUKLVxmaSBcZmkgXGZpIH0KLQotXGRlZlxZYXBwZW5kaXhsZXR0ZXJhbmR0eXBleyUKLVxpZm51bVxzZWNubz0wIFxwdXR3b3JkQXBwZW5kaXhceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5ve30lCi1cZWxzZSBcaWZudW0gXHN1YnNlY25vPTAgXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vICUKLVxlbHNlIFxpZm51bSBcc3Vic3Vic2Vjbm89MCAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubyAlCi1cZWxzZSAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vICUKLVxmaSBcZmkgXGZpIH0KLQotXGdkZWZceHJlZnRpZXsndGllfQotCi0lIFVzZSBUZVggMy4wJ3MgXGlucHV0bGluZW5vIHRvIGdldCB0aGUgbGluZSBudW1iZXIsIGZvciBiZXR0ZXIgZXJyb3IKLSUgbWVzc2FnZXMsIGJ1dCBpZiB3ZSdyZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLgotJQotXGlmeFxpbnB1dGxpbmVub1x0aGlzaXN1bmRlZmluZWQKLSAgXGxldFxsaW5lbnVtYmVyID0gXGVtcHR5ICUgTm9uLTMuMC4KLVxlbHNlCi0gIFxkZWZcbGluZW51bWJlcntcdGhlXGlucHV0bGluZW5vOlxzcGFjZX0KLVxmaQotCi0lIERlZmluZSBccmVmeHtOQU1FfXtTVUZGSVh9IHRvIHJlZmVyZW5jZSBhIGNyb3NzLXJlZmVyZW5jZSBzdHJpbmcgbmFtZWQgTkFNRS4KLSUgSWYgaXRzIHZhbHVlIGlzIG5vbmVtcHR5LCBTVUZGSVggaXMgb3V0cHV0IGFmdGVyd2FyZC4KLQotXGRlZlxyZWZ4IzEjMnslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFgjMVxlbmRjc25hbWVccmVsYXgKLSAgICAlIElmIG5vdCBkZWZpbmVkLCBzYXkgc29tZXRoaW5nIGF0IGxlYXN0LgotICAgIFxhbmdsZWxlZnQgdW5cLWRlXC1maW5lZFxhbmdsZXJpZ2h0Ci0gICAgXGlmbGlua3MKLSAgICAgIFxpZmhhdmV4cmVmcwotICAgICAgICBcbWVzc2FnZXtcbGluZW51bWJlciBVbmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlIGAjMScufSUKLSAgICAgIFxlbHNlCi0gICAgICAgIFxpZndhcm5lZHhyZWZzXGVsc2UKLSAgICAgICAgICBcZ2xvYmFsXHdhcm5lZHhyZWZzdHJ1ZQotICAgICAgICAgIFxtZXNzYWdle0Nyb3NzIHJlZmVyZW5jZSB2YWx1ZXMgdW5rbm93bjsgeW91IG11c3QgcnVuIFRlWCBhZ2Fpbi59JQotICAgICAgICBcZmkKLSAgICAgIFxmaQotICAgIFxmaQotICBcZWxzZQotICAgICUgSXQncyBkZWZpbmVkLCBzbyBqdXN0IHVzZSBpdC4KLSAgICBcY3NuYW1lIFgjMVxlbmRjc25hbWUKLSAgXGZpCi0gICMyJSBPdXRwdXQgdGhlIHN1ZmZpeCBpbiBhbnkgY2FzZS4KLX0KLQotJSBUaGlzIGlzIHRoZSBtYWNybyBpbnZva2VkIGJ5IGVudHJpZXMgaW4gdGhlIGF1eCBmaWxlLgotJQotXGRlZlx4cmRlZiMxe1xiZWdpbmdyb3VwCi0gICUgUmVlbmFibGUgXCBhcyBhbiBlc2NhcGUgd2hpbGUgcmVhZGluZyB0aGUgc2Vjb25kIGFyZ3VtZW50LgotICBcY2F0Y29kZWBcXCA9IDAKLSAgXGFmdGVyYXNzaWdubWVudFxlbmRncm91cAotICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWCMxXGVuZGNzbmFtZQotfQotCi0lIFJlYWQgdGhlIGxhc3QgZXhpc3RpbmcgYXV4IGZpbGUsIGlmIGFueS4gIE5vIGVycm9yIGlmIG5vbmUgZXhpc3RzLgotXGRlZlxyZWFkYXV4ZmlsZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXl5APVxvdGhlcgotICBcY2F0Y29kZWBcXl5BPVxvdGhlcgotICBcY2F0Y29kZWBcXl5CPVxvdGhlcgotICBcY2F0Y29kZWBcXl5DPVxvdGhlcgotICBcY2F0Y29kZWBcXl5EPVxvdGhlcgotICBcY2F0Y29kZWBcXl5FPVxvdGhlcgotICBcY2F0Y29kZWBcXl5GPVxvdGhlcgotICBcY2F0Y29kZWBcXl5HPVxvdGhlcgotICBcY2F0Y29kZWBcXl5IPVxvdGhlcgotICBcY2F0Y29kZWBcXl5LPVxvdGhlcgotICBcY2F0Y29kZWBcXl5MPVxvdGhlcgotICBcY2F0Y29kZWBcXl5OPVxvdGhlcgotICBcY2F0Y29kZWBcXl5QPVxvdGhlcgotICBcY2F0Y29kZWBcXl5RPVxvdGhlcgotICBcY2F0Y29kZWBcXl5SPVxvdGhlcgotICBcY2F0Y29kZWBcXl5TPVxvdGhlcgotICBcY2F0Y29kZWBcXl5UPVxvdGhlcgotICBcY2F0Y29kZWBcXl5VPVxvdGhlcgotICBcY2F0Y29kZWBcXl5WPVxvdGhlcgotICBcY2F0Y29kZWBcXl5XPVxvdGhlcgotICBcY2F0Y29kZWBcXl5YPVxvdGhlcgotICBcY2F0Y29kZWBcXl5aPVxvdGhlcgotICBcY2F0Y29kZWBcXl5bPVxvdGhlcgotICBcY2F0Y29kZWBcXl5cPVxvdGhlcgotICBcY2F0Y29kZWBcXl5dPVxvdGhlcgotICBcY2F0Y29kZWBcXl5ePVxvdGhlcgotICBcY2F0Y29kZWBcXl5fPVxvdGhlcgotICBcY2F0Y29kZWBcQD1cb3RoZXIKLSAgXGNhdGNvZGVgXF49XG90aGVyCi0gICUgSXQgd2FzIHN1Z2dlc3RlZCB0byBkZWZpbmUgdGhpcyBhcyA3LCB3aGljaCB3b3VsZCBhbGxvdyBeXmU0IGV0Yy4KLSAgJSBpbiB4cmVmIHRhZ3MsIGkuZS4sIG5vZGUgbmFtZXMuICBCdXQgc2luY2UgXl5lNCBub3RhdGlvbiBpc24ndAotICAlIHN1cHBvcnRlZCBpbiB0aGUgbWFpbiB0ZXh0LCBpdCBkb2Vzbid0IHNlZW0gZGVzaXJhYmxlLiAgRnVydGhlcm1vcmUsCi0gICUgdGhhdCBpcyBub3QgZW5vdWdoOiBmb3Igbm9kZSBuYW1lcyB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gYSBeCi0gICUgY2hhcmFjdGVyLCB3ZSB3b3VsZCBlbmQgdXAgd3JpdGluZyBhIGxpbmUgbGlrZSB0aGlzOiAneHJkZWYgeydoYXQKLSAgJSBiLXRpdGxlfXsnaGF0IGJ9IGFuZCBceHJkZWYgZG9lcyBhIFxjc25hbWUuLi5cZW5kY3NuYW1lIG9uIHRoZSBmaXJzdAotICAlIGFyZ3VtZW50LCBhbmQgXGhhdCBpcyBub3QgYW4gZXhwYW5kYWJsZSBjb250cm9sIHNlcXVlbmNlLiAgSXQgY291bGQKLSAgJSBhbGwgYmUgd29ya2VkIG91dCwgYnV0IHdoeT8gIEVpdGhlciB3ZSBzdXBwb3J0IF5eIG9yIHdlIGRvbid0LgotICAlCi0gICUgVGhlIG90aGVyIGNoYW5nZSBuZWNlc3NhcnkgZm9yIHRoaXMgd2FzIHRvIGRlZmluZSBcYXV4aGF0OgotICAlIFxkZWZcYXV4aGF0e1xkZWZeeydoYXQgfX0lIGV4dHJhIHNwYWNlIHNvIG9rIGlmIGZvbGxvd2VkIGJ5IGxldHRlcgotICAlIGFuZCB0aGVuIHRvIGNhbGwgXGF1eGhhdCBpbiBcc2V0cS4KLSAgJQotICBcY2F0Y29kZWBcfj1cb3RoZXIKLSAgXGNhdGNvZGVgXFs9XG90aGVyCi0gIFxjYXRjb2RlYFxdPVxvdGhlcgotICBcY2F0Y29kZWBcIj1cb3RoZXIKLSAgXGNhdGNvZGVgXF89XG90aGVyCi0gIFxjYXRjb2RlYFx8PVxvdGhlcgotICBcY2F0Y29kZWBcPD1cb3RoZXIKLSAgXGNhdGNvZGVgXD49XG90aGVyCi0gIFxjYXRjb2RlYFwkPVxvdGhlcgotICBcY2F0Y29kZWBcIz1cb3RoZXIKLSAgXGNhdGNvZGVgXCY9XG90aGVyCi0gIFxjYXRjb2RlYCs9XG90aGVyICUgYXZvaWQgXCsgZm9yIHBhcmFub2lhIGV2ZW4gdGhvdWdoIHdlJ3ZlIHR1cm5lZCBpdCBvZmYKLSAgJSBNYWtlIHRoZSBjaGFyYWN0ZXJzIDEyOC0yNTUgYmUgcHJpbnRpbmcgY2hhcmFjdGVycwotICB7JQotICAgIFxjb3VudCAxPTEyOAotICAgIFxkZWZcbG9vcHslCi0gICAgICBcY2F0Y29kZVxjb3VudCAxPVxvdGhlcgotICAgICAgXGFkdmFuY2VcY291bnQgMSBieSAxCi0gICAgICBcaWZudW0gXGNvdW50IDE8MjU2IFxsb29wIFxmaQotICAgIH0lCi0gIH0lCi0gICUgVGhlIGF1eCBmaWxlIHVzZXMgJyBhcyB0aGUgZXNjYXBlIChmb3Igbm93KS4KLSAgJSBUdXJuIG9mZiBcIGFzIGFuIGVzY2FwZSBzbyB3ZSBkbyBub3QgbG9zZSBvbgotICAlIGVudHJpZXMgd2hpY2ggd2VyZSBkdW1wZWQgd2l0aCBjb250cm9sIHNlcXVlbmNlcyBpbiB0aGVpciBuYW1lcy4KLSAgJSBGb3IgZXhhbXBsZSwgJ3hyZGVmIHskXGxlcSAkLWZ1bn17cGFnZSAuLi59IG1hZGUgYnkgQGRlZnVuIF5eCi0gICUgUmVmZXJlbmNlIHRvIHN1Y2ggZW50cmllcyBzdGlsbCBkb2VzIG5vdCB3b3JrIHRoZSB3YXkgb25lIHdvdWxkIHdpc2gsCi0gICUgYnV0IGF0IGxlYXN0IHRoZXkgZG8gbm90IGJvbWIgb3V0IHdoZW4gdGhlIGF1eCBmaWxlIGlzIHJlYWQgaW4uCi0gIFxjYXRjb2RlYFx7PTEKLSAgXGNhdGNvZGVgXH09MgotICBcY2F0Y29kZWBcJT1cb3RoZXIKLSAgXGNhdGNvZGVgXCc9MAotICBcY2F0Y29kZWBcXD1cb3RoZXIKLSAgJQotICBcb3BlbmluIDEgXGpvYm5hbWUuYXV4Ci0gIFxpZmVvZiAxIFxlbHNlCi0gICAgXGNsb3NlaW4gMQotICAgIFxpbnB1dCBcam9ibmFtZS5hdXgKLSAgICBcZ2xvYmFsXGhhdmV4cmVmc3RydWUKLSAgICBcZ2xvYmFsXHdhcm5lZG9ic3RydWUKLSAgXGZpCi0gICUgT3BlbiB0aGUgbmV3IGF1eCBmaWxlLiAgVGVYIHdpbGwgY2xvc2UgaXQgYXV0b21hdGljYWxseSBhdCBleGl0LgotICBcb3Blbm91dFxhdXhmaWxlPVxqb2JuYW1lLmF1eAotXGVuZGdyb3VwfQotCi0KLSUgRm9vdG5vdGVzLgotCi1cbmV3Y291bnQgXGZvb3Rub3Rlbm8KLQotJSBUaGUgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciBzdXBlcmVqZWN0IGlzCi0lIHZpdGFsIGZvciBwcm9wZXIgZmlsbGluZzsgcGFnZXMgY29tZSBvdXQgdW5hbGlnbmVkIHdoZW4geW91IGRvIGEKLSUgcGFnZWFsaWdubWFjcm8gY2FsbCBpZiB0aGF0IHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBpcwotJSByZW1vdmVkLiAoR2VuZXJhbGx5LCBudW1lcmljIGNvbnN0YW50cyBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEKLSUgc3BhY2UgdG8gcHJldmVudCBzdHJhbmdlIGV4cGFuc2lvbiBlcnJvcnMuKQotXGRlZlxzdXBlcmVqZWN0e1xwYXJccGVuYWx0eSAtMjAwMDBcZm9vdG5vdGVubyA9MCB9Ci0KLSUgQGZvb3Rub3Rlc3R5bGUgaXMgbWVhbmluZ2Z1bCBmb3IgaW5mbyBvdXRwdXQgb25seS4KLVxsZXRcZm9vdG5vdGVzdHlsZT1cY29tbWVudAotCi1cbGV0XHB0ZXhmb290bm90ZT1cZm9vdG5vdGUKLQote1xjYXRjb2RlIGBcQD0xMQotJQotJSBBdXRvLW51bWJlciBmb290bm90ZXMuICBPdGhlcndpc2UgbGlrZSBwbGFpbi4KLVxnZGVmXGZvb3Rub3RleyUKLSAgXGdsb2JhbFxhZHZhbmNlXGZvb3Rub3Rlbm8gYnkgXEBuZQotICBcZWRlZlx0aGlzZm9vdG5veyRee1x0aGVcZm9vdG5vdGVub30kfSUKLSAgJQotICAlIEluIGNhc2UgdGhlIGZvb3Rub3RlIGNvbWVzIGF0IHRoZSBlbmQgb2YgYSBzZW50ZW5jZSwgcHJlc2VydmUgdGhlCi0gICUgZXh0cmEgc3BhY2luZyBhZnRlciB3ZSBkbyB0aGUgZm9vdG5vdGUgbnVtYmVyLgotICBcbGV0XEBzZlxlbXB0eQotICBcaWZobW9kZVxlZGVmXEBzZntcc3BhY2VmYWN0b3JcdGhlXHNwYWNlZmFjdG9yfVwvXGZpCi0gICUKLSAgJSBSZW1vdmUgaW5hZHZlcnRlbnQgYmxhbmsgc3BhY2UgYmVmb3JlIHR5cGVzZXR0aW5nIHRoZSBmb290bm90ZSBudW1iZXIuCi0gIFx1bnNraXAKLSAgXHRoaXNmb290bm9cQHNmCi0gIFxmb290bm90ZXp6egotfSUKLQotJSBEb24ndCBib3RoZXIgd2l0aCB0aGUgdHJpY2tlcnkgaW4gcGxhaW4udGV4IHRvIG5vdCByZXF1aXJlIHRoZQotJSBmb290bm90ZSB0ZXh0IGFzIGEgcGFyYW1ldGVyLiAgT3VyIGZvb3Rub3RlcyBkb24ndCBuZWVkIHRvIGJlIHNvIGdlbmVyYWwuCi0lCi0lIE9oIHllcywgdGhleSBkbzsgb3RoZXJ3aXNlLCBAaWZzZXQgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCB1c2VzCi0lIFxwYXJzZWFyZ2xpbmUgZmFpbCBpbnNpZGUgZm9vdG5vdGVzIGJlY2F1c2UgdGhlIHRva2VucyBhcmUgZml4ZWQgd2hlbgotJSB0aGUgZm9vdG5vdGUgaXMgcmVhZC4gIC0ta2FybCwgMTZub3Y5Ni4KLSUKLVxsb25nXGdkZWZcZm9vdG5vdGV6enp7XGluc2VydFxmb290aW5zXGJncm91cAotICAlIFdlIHdhbnQgdG8gdHlwZXNldCB0aGlzIHRleHQgYXMgYSBub3JtYWwgcGFyYWdyYXBoLCBldmVuIGlmIHRoZQotICAlIGZvb3Rub3RlIHJlZmVyZW5jZSBvY2N1cnMgaW4gKGZvciBleGFtcGxlKSBhIGRpc3BsYXkgZW52aXJvbm1lbnQuCi0gICUgU28gcmVzZXQgc29tZSBwYXJhbWV0ZXJzLgotICBcaW50ZXJsaW5lcGVuYWx0eVxpbnRlcmZvb3Rub3RlbGluZXBlbmFsdHkKLSAgXHNwbGl0dG9wc2tpcFxodFxzdHJ1dGJveCAlIHRvcCBiYXNlbGluZSBmb3IgYnJva2VuIGZvb3Rub3RlcwotICBcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveAotICBcZmxvYXRpbmdwZW5hbHR5XEBNTQotICBcbGVmdHNraXBcekBza2lwCi0gIFxyaWdodHNraXBcekBza2lwCi0gIFxzcGFjZXNraXBcekBza2lwCi0gIFx4c3BhY2Vza2lwXHpAc2tpcAotICBccGFyaW5kZW50XGRlZmF1bHRwYXJpbmRlbnQKLSAgJQotICBcc21hbGxmb250cyBccm0KLSAgJQotICAlIEhhbmcgdGhlIGZvb3Rub3RlIHRleHQgb2ZmIHRoZSBudW1iZXIuCi0gIFxoYW5nCi0gIFx0ZXh0aW5kZW50e1x0aGlzZm9vdG5vfSUKLSAgJQotICAlIERvbid0IGNyYXNoIGludG8gdGhlIGxpbmUgYWJvdmUgdGhlIGZvb3Rub3RlIHRleHQuICBTaW5jZSB0aGlzCi0gICUgZXhwYW5kcyBpbnRvIGEgYm94LCBpdCBtdXN0IGNvbWUgd2l0aGluIHRoZSBwYXJhZ3JhcGgsIGxlc3QgaXQKLSAgJSBwcm92aWRlIGEgcGxhY2Ugd2hlcmUgVGVYIGNhbiBzcGxpdCB0aGUgZm9vdG5vdGUuCi0gIFxmb290c3RydXQKLSAgXGZ1dHVyZWxldFxuZXh0XGZvQHQKLX0KLVxkZWZcZm9AdHtcaWZjYXRcYmdyb3VwXG5vZXhwYW5kXG5leHQgXGxldFxuZXh0XGZAQHQKLSAgXGVsc2VcbGV0XG5leHRcZkB0XGZpIFxuZXh0fQotXGRlZlxmQEB0e1xiZ3JvdXBcYWZ0ZXJncm91cFxAZm9vdFxsZXRcbmV4dH0KLVxkZWZcZkB0IzF7IzFcQGZvb3R9Ci1cZGVmXEBmb290e1xzdHJ1dFxwYXJcZWdyb3VwfQotCi19JWVuZCBcY2F0Y29kZSBgXEA9MTEKLQotJSBTZXQgdGhlIGJhc2VsaW5lc2tpcCB0byAjMSwgYW5kIHRoZSBsaW5lc2tpcCBhbmQgc3RydXQgc2l6ZQotJSBjb3JyZXNwb25kaW5nbHkuICBUaGVyZSBpcyBubyBkZWVwIG1lYW5pbmcgYmVoaW5kIHRoZXNlIG1hZ2ljIG51bWJlcnMKLSUgdXNlZCBhcyBmYWN0b3JzOyB0aGV5IGp1c3QgbWF0Y2ggKGNsb3NlbHkgZW5vdWdoKSB3aGF0IEtudXRoIGRlZmluZWQuCi0lCi1cZGVmXGxpbmVza2lwZmFjdG9yey4wODMzM30KLVxkZWZcc3RydXRoZWlnaHRwZXJjZW50ey43MDgzM30KLVxkZWZcc3RydXRkZXB0aHBlcmNlbnQgey4yOTE2N30KLSUKLVxkZWZcc2V0bGVhZGluZyMxeyUKLSAgXG5vcm1hbGJhc2VsaW5lc2tpcCA9ICMxXHJlbGF4Ci0gIFxub3JtYWxsaW5lc2tpcCA9IFxsaW5lc2tpcGZhY3Rvclxub3JtYWxiYXNlbGluZXNraXAKLSAgXG5vcm1hbGJhc2VsaW5lcwotICBcc2V0Ym94XHN0cnV0Ym94ID1caGJveHslCi0gICAgXHZydWxlIHdpZHRoMHB0IGhlaWdodFxzdHJ1dGhlaWdodHBlcmNlbnRcYmFzZWxpbmVza2lwCi0gICAgICAgICAgICAgICAgICAgIGRlcHRoIFxzdHJ1dGRlcHRocGVyY2VudCBcYmFzZWxpbmVza2lwCi0gIH0lCi19Ci0KLSUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCi0lIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKLSUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCi0lIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KLSUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KLSUKLVxkZWZcfHslCi0gICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCi0gIFxsZWF2ZXZtb2RlCi0gICUKLSAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KLSAgXHZhZGp1c3R7JQotICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKLSAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCi0gICAgXHZza2lwLVxiYXNlbGluZXNraXAKLSAgICAlCi0gICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCi0gICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KLSAgICBcbGxhcHslCi0gICAgICAlCi0gICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCi0gICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAotICAgICAgJQotICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgotICAgICAgXGhza2lwIDEycHQKLSAgICB9JQotICB9JQotfQotCi0lIEZvciBhIGZpbmFsIGNvcHksIHRha2Ugb3V0IHRoZSByZWN0YW5nbGVzCi0lIHRoYXQgbWFyayBvdmVyZnVsbCBib3hlcyAoaW4gY2FzZSB5b3UgaGF2ZSBkZWNpZGVkCi0lIHRoYXQgdGhlIHRleHQgbG9va3Mgb2sgZXZlbiB0aG91Z2ggaXQgcGFzc2VzIHRoZSBtYXJnaW4pLgotJQotXGRlZlxmaW5hbG91dHtcb3ZlcmZ1bGxydWxlPTBwdH0KLQotJSBAaW1hZ2UuICBXZSB1c2UgdGhlIG1hY3JvcyBmcm9tIGVwc2YudGV4IHRvIHN1cHBvcnQgdGhpcy4KLSUgSWYgZXBzZi50ZXggaXMgbm90IGluc3RhbGxlZCBhbmQgQGltYWdlIGlzIHVzZWQsIHdlIGNvbXBsYWluLgotJQotJSBDaGVjayBmb3IgYW5kIHJlYWQgZXBzZi50ZXggdXAgZnJvbnQuICBJZiB3ZSByZWFkIGl0IG9ubHkgYXQgQGltYWdlCi0lIHRpbWUsIHdlIG1pZ2h0IGJlIGluc2lkZSBhIGdyb3VwLCBhbmQgdGhlbiBpdHMgZGVmaW5pdGlvbnMgd291bGQgZ2V0Ci0lIHVuZG9uZSBhbmQgdGhlIG5leHQgaW1hZ2Ugd291bGQgZmFpbC4KLVxvcGVuaW4gMSA9IGVwc2YudGV4Ci1caWZlb2YgMSBcZWxzZQotICBcY2xvc2VpbiAxCi0gICUgRG8gbm90IGJvdGhlciBzaG93aW5nIGJhbm5lciB3aXRoIHBvc3QtdjIuNyBlcHNmLnRleCAoYXZhaWxhYmxlIGluCi0gICUgZG9jL2Vwc2YudGV4IHVudGlsIGl0IHNob3dzIHVwIG9uIGN0YW4pLgotICBcZGVmXGVwc2Zhbm5vdW5jZXtcdG9rczAgPSB9JQotICBcaW5wdXQgZXBzZi50ZXgKLVxmaQotJQotJSBXZSB3aWxsIG9ubHkgY29tcGxhaW4gb25jZSBhYm91dCBsYWNrIG9mIGVwc2YudGV4LgotXG5ld2lmXGlmd2FybmVkbm9lcHNmCi1cbmV3aGVscFxub2Vwc2ZoZWxwe2Vwc2YudGV4IG11c3QgYmUgaW5zdGFsbGVkIGZvciBpbWFnZXMgdG8KLSAgd29yay4gIEl0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIFRleGluZm8gZGlzdHJpYnV0aW9uLCBvciB5b3UgY2FuIGdldAotICBpdCBmcm9tIGZ0cDovL3R1Zy5vcmcvdGV4L2Vwc2YudGV4Ln0KLSUKLVxkZWZcaW1hZ2UjMXslCi0gIFxpZnhcZXBzZmJveFx1bmRlZmluZWQKLSAgICBcaWZ3YXJuZWRub2Vwc2YgXGVsc2UKLSAgICAgIFxlcnJoZWxwID0gXG5vZXBzZmhlbHAKLSAgICAgIFxlcnJtZXNzYWdle2Vwc2YudGV4IG5vdCBmb3VuZCwgaW1hZ2VzIHdpbGwgYmUgaWdub3JlZH0lCi0gICAgICBcZ2xvYmFsXHdhcm5lZG5vZXBzZnRydWUKLSAgICBcZmkKLSAgXGVsc2UKLSAgICBcaW1hZ2V4eHggIzEsLCxcZmluaXNoCi0gIFxmaQotfQotJQotJSBBcmd1bWVudHMgdG8gQGltYWdlOgotJSAjMSBpcyAobWFuZGF0b3J5KSBpbWFnZSBmaWxlbmFtZTsgd2UgdGFjayBvbiAuZXBzIGV4dGVuc2lvbi4KLSUgIzIgaXMgKG9wdGlvbmFsKSB3aWR0aCwgIzMgaXMgKG9wdGlvbmFsKSBoZWlnaHQuCi0lICM0IGlzIGp1c3QgdGhlIHVzdWFsIGV4dHJhIGlnbm9yZWQgYXJnIGZvciBwYXJzaW5nIHRoaXMgc3R1ZmYuCi1cZGVmXGltYWdleHh4IzEsIzIsIzMsIzRcZmluaXNoeyUKLSAgXGlmcGRmCi0gICAgXGNlbnRlcmxpbmV7XGRvcGRmaW1hZ2V7IzF9eyMyfXsjM319JQotICBcZWxzZQotICAgICUgXGVwc2Zib3ggaXRzZWxmIHJlc2V0cyBcZXBzZj9zaXplIGF0IGVhY2ggZmlndXJlLgotICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxlcHNmeHNpemU9IzJccmVsYXggXGZpCi0gICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z5c2l6ZT0jM1xyZWxheCBcZmkKLSAgICBcYmVnaW5ncm91cAotICAgICAgXGNhdGNvZGVgXF5eTSA9IDUgJSBpbiBjYXNlIHdlJ3JlIGluc2lkZSBhbiBleGFtcGxlCi0gICAgICAlIElmIHRoZSBpbWFnZSBpcyBieSBpdHNlbGYsIGNlbnRlciBpdC4KLSAgICAgIFxpZnZtb2RlCi0gICAgICAgIFxub2JyZWFrXGJpZ3NraXAKLSAgICAgICAgJSBVc3VhbGx5IHdlJ2xsIGhhdmUgdGV4dCBhZnRlciB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBpbnNlcnQKLSAgICAgICAgJSBccGFyc2tpcCBnbHVlLCBzbyBpbnNlcnQgaXQgaGVyZSB0b28gdG8gZXF1YWxpemUgdGhlIHNwYWNlCi0gICAgICAgICUgYWJvdmUgYW5kIGJlbG93LiAKLSAgICAgICAgXG5vYnJlYWtcdnNraXBccGFyc2tpcAotICAgICAgICBcbm9icmVhawotICAgICAgICBcY2VudGVybGluZXtcZXBzZmJveHsjMS5lcHN9fSUKLSAgICAgICAgXGJpZ2JyZWFrCi0gICAgICBcZWxzZQotICAgICAgICAlIEluIHRoZSBtaWRkbGUgb2YgYSBwYXJhZ3JhcGgsIG5vIGV4dHJhIHNwYWNlLgotICAgICAgICBcZXBzZmJveHsjMS5lcHN9JQotICAgICAgXGZpCi0gICAgXGVuZGdyb3VwCi0gIFxmaQotfQotCi0KLVxtZXNzYWdle2xvY2FsaXphdGlvbix9Ci0lIGFuZCBpMThuLgotCi0lIEBkb2N1bWVudGxhbmd1YWdlIGlzIHVzdWFsbHkgZ2l2ZW4gdmVyeSBlYXJseSwganVzdCBhZnRlcgotJSBAc2V0ZmlsZW5hbWUuICBJZiBkb25lIHRvbyBsYXRlLCBpdCBtYXkgbm90IG92ZXJyaWRlIGV2ZXJ5dGhpbmcKLSUgcHJvcGVybHkuICBTaW5nbGUgYXJndW1lbnQgaXMgdGhlIGxhbmd1YWdlIGFiYnJldmlhdGlvbi4KLSUgSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzZXQgdXAgYSBoeXBoZW5hdGlvbiBmaWxlIGhlcmUuCi0lCi1cZGVmXGRvY3VtZW50bGFuZ3VhZ2V7XHBhcnNlYXJnXGRvZG9jdW1lbnRsYW5ndWFnZX0KLVxkZWZcZG9kb2N1bWVudGxhbmd1YWdlIzF7JQotICBcdGV4ICUgcmVhZCB0eGktPz8udGV4IGZpbGUgaW4gcGxhaW4gVGVYLgotICAlIFJlYWQgdGhlIGZpbGUgaWYgaXQgZXhpc3RzLgotICBcb3BlbmluIDEgdHhpLSMxLnRleAotICBcaWZlb2YxCi0gICAgXGVycmhlbHAgPSBcbm9sYW5naGVscAotICAgIFxlcnJtZXNzYWdle0Nhbm5vdCByZWFkIGxhbmd1YWdlIGZpbGUgdHhpLSMxLnRleH0lCi0gICAgXGxldFx0ZW1wID0gXHJlbGF4Ci0gIFxlbHNlCi0gICAgXGRlZlx0ZW1we1xpbnB1dCB0eGktIzEudGV4IH0lCi0gIFxmaQotICBcdGVtcAotICBcZW5kZ3JvdXAKLX0KLVxuZXdoZWxwXG5vbGFuZ2hlbHB7VGhlIGdpdmVuIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IKLWlzIGVtcHR5LiAgTWF5YmUgeW91IG5lZWQgdG8gaW5zdGFsbCBpdD8gIEluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotc2hvdWxkIHdvcmsgaWYgbm93aGVyZSBlbHNlIGRvZXMufQotCi0KLSUgQGRvY3VtZW50ZW5jb2Rpbmcgc2hvdWxkIGNoYW5nZSBzb21ldGhpbmcgaW4gVGVYIGV2ZW50dWFsbHksIG1vc3QKLSUgbGlrZWx5LCBidXQgZm9yIG5vdyBqdXN0IHJlY29nbml6ZSBpdC4KLVxsZXRcZG9jdW1lbnRlbmNvZGluZyA9IFxjb21tZW50Ci0KLQotJSBQYWdlIHNpemUgcGFyYW1ldGVycy4KLSUKLVxuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAotCi1cY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKLVxzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Ci1cc3Vic2VjaGVhZGluZ3NraXAgPSA5cHQgcGx1cyAycHQgbWludXMgMnB0Ci0KLSUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KLVx2YmFkbmVzcyA9IDEwMDAwCi0KLSUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCi1caGJhZG5lc3MgPSAyMDAwCi0KLSUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgotXHdpZG93cGVuYWx0eT0xMDAwMAotXGNsdWJwZW5hbHR5PTEwMDAwCi0KLSUgVXNlIFRlWCAzLjAncyBcZW1lcmdlbmN5c3RyZXRjaCB0byBoZWxwIGxpbmUgYnJlYWtpbmcsIGJ1dCBpZiB3ZSdyZQotJSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLiAgV2Ugd2FudCB0aGUgYW1vdW50IG9mCi0lIHN0cmV0Y2ggYWRkZWQgdG8gZGVwZW5kIG9uIHRoZSBsaW5lIGxlbmd0aCwgaGVuY2UgdGhlIGRlcGVuZGVuY2Ugb24KLSUgXGhzaXplLiAgV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHRoZSBwYXBlciBzaXplIGlzIHNldC4KLSUKLVxkZWZcc2V0ZW1lcmdlbmN5c3RyZXRjaHslCi0gIFxpZnhcZW1lcmdlbmN5c3RyZXRjaFx0aGlzaXN1bmRlZmluZWQKLSAgICAlIEFsbG93IHVzIHRvIGFzc2lnbiB0byBcZW1lcmdlbmN5c3RyZXRjaCBhbnl3YXkuCi0gICAgXGRlZlxlbWVyZ2VuY3lzdHJldGNoe1xkaW1lbjB9JQotICBcZWxzZQotICAgIFxlbWVyZ2VuY3lzdHJldGNoID0gLjE1XGhzaXplCi0gIFxmaQotfQotCi0lIFBhcmFtZXRlcnMgaW4gb3JkZXI6IDEpIHRleHRoZWlnaHQ7IDIpIHRleHR3aWR0aDsgMykgdm9mZnNldDsKLSUgNCkgaG9mZnNldDsgNSkgYmluZGluZyBvZmZzZXQ7IDYpIHRvcHNraXAuICBUaGVuIHdob2V2ZXIgY2FsbHMgdXMgY2FuCi0lIHNldCBccGFyc2tpcCBhbmQgY2FsbCBcc2V0bGVhZGluZyBmb3IgXGJhc2VsaW5lc2tpcC4KLSUKLVxkZWZcaW50ZXJuYWxwYWdlc2l6ZXMjMSMyIzMjNCM1IzZ7JQotICBcdm9mZnNldCA9ICMzXHJlbGF4Ci0gIFx0b3Bza2lwID0gIzZccmVsYXgKLSAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCi0gICUKLSAgXHZzaXplID0gIzFccmVsYXgKLSAgXGFkdmFuY2VcdnNpemUgYnkgXHRvcHNraXAKLSAgXG91dGVydnNpemUgPSBcdnNpemUKLSAgXGFkdmFuY2Vcb3V0ZXJ2c2l6ZSBieSAyXHRvcGFuZGJvdHRvbW1hcmdpbgotICBccGFnZWhlaWdodCA9IFx2c2l6ZQotICAlCi0gIFxoc2l6ZSA9ICMyXHJlbGF4Ci0gIFxvdXRlcmhzaXplID0gXGhzaXplCi0gIFxhZHZhbmNlXG91dGVyaHNpemUgYnkgMC41aW4KLSAgXHBhZ2V3aWR0aCA9IFxoc2l6ZQotICAlCi0gIFxub3JtYWxvZmZzZXQgPSAjNFxyZWxheAotICBcYmluZGluZ29mZnNldCA9ICM1XHJlbGF4Ci0gICUKLSAgXHBhcmluZGVudCA9IFxkZWZhdWx0cGFyaW5kZW50Ci0gIFxzZXRlbWVyZ2VuY3lzdHJldGNoCi19Ci0KLSUgQGxldHRlcnBhcGVyICh0aGUgZGVmYXVsdCkuCi1cZGVmXGxldHRlcnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgJSBJZiBwYWdlIGlzIG5vdGhpbmcgYnV0IHRleHQsIG1ha2UgaXQgY29tZSBvdXQgZXZlbi4KLSAgXGludGVybmFscGFnZXNpemVzezQ2XGJhc2VsaW5lc2tpcH17NmlufXtcdm9mZnNldH17LjI1aW59e1xiaW5kaW5nb2Zmc2V0fXszNnB0fSUKLX19Ci0KLSUgVXNlIEBzbWFsbGJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgN3g5LjUgKG9yIHNvKSBmb3JtYXQuCi1cZGVmXHNtYWxsYm9va3t7XGdsb2JhbGRlZnMgPSAxCi0gIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEycHR9JQotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjVpbn17NS5pbn17XHZvZmZzZXR9ey4yNWlufXtcYmluZGluZ29mZnNldH17MTZwdH0lCi0gICUKLSAgXGxpc3BuYXJyb3dpbmcgPSAwLjNpbgotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAotICBcZGVmdHlwZW1hcmdpbiA9IDBwdAotICBcZGVmYm9keWluZGVudCA9IC41Y20KLSAgJQotICBcbGV0XHNtYWxsZGlzcGxheSA9IFxzbWFsbGRpc3BsYXl4Ci0gIFxsZXRcc21hbGxleGFtcGxlID0gXHNtYWxsbGlzcHgKLSAgXGxldFxzbWFsbGZvcm1hdCA9IFxzbWFsbGZvcm1hdHgKLSAgXGxldFxzbWFsbGxpc3AgPSBcc21hbGxsaXNweAotfX0KLQotJSBVc2UgQGFmb3VycGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIuCi1cZGVmXGFmb3VycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQotICBcc2V0bGVhZGluZ3sxMnB0fSUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gICUKLSAgXGludGVybmFscGFnZXNpemVzezUzXGJhc2VsaW5lc2tpcH17MTYwbW19e1x2b2Zmc2V0fXs0bW19e1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKLSAgJQotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotfX0KLQotJSBBIHNwZWNpZmljIHRleHQgbGF5b3V0LCAyNHgxNWNtIG92ZXJhbGwsIGludGVuZGVkIGZvciBBNCBwYXBlci4gIFRvcCBtYXJnaW4KLSUgMjltbSwgaGVuY2UgYm90dG9tIG1hcmdpbiAyOG1tLCBub21pbmFsIHNpZGUgbWFyZ2luIDNjbS4KLVxkZWZcYWZvdXJsYXRleHt7XGdsb2JhbGRlZnMgPSAxCi0gIFxzZXRsZWFkaW5nezEzLjZwdH0lCi0gICUKLSAgXGFmb3VycGFwZXIKLSAgXGludGVybmFscGFnZXNpemVzezIzN21tfXsxNTBtbX17My42bW19ezMuNm1tfXszbW19ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19fQotCi0lIFVzZSBAYWZvdXJ3aWRlIHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyIGluIHdpZGUgZm9ybWF0LgotXGRlZlxhZm91cndpZGV7JQotICBcYWZvdXJwYXBlcgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7OS41aW59ezYuNWlufXtcaG9mZnNldH17XG5vcm1hbG9mZnNldH17XGJpbmRpbmdvZmZzZXR9ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19Ci0KLSUgQHBhZ2VzaXplcyBURVhUSEVJR0hUWyxURVhUV0lEVEhdCi0lIFBlcmhhcHMgd2Ugc2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIG1hcmdpbnMsIFx0b3Bza2lwLCBccGFyc2tpcCwKLSUgYW5kL29yIGxlYWRpbmcsIGFsc28uIE9yIHBlcmhhcHMgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlbSBzb21laG93LgotJQotXGRlZlxwYWdlc2l6ZXN7XHBhcnNlYXJnXHBhZ2VzaXplc3h4eH0KLVxkZWZccGFnZXNpemVzeHh4IzF7XHBhZ2VzaXplc3l5eSAjMSwsXGZpbmlzaH0KLVxkZWZccGFnZXNpemVzeXl5IzEsIzIsIzNcZmluaXNoe3slCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxoc2l6ZT0jMlxyZWxheCBcZmkKLSAgXGdsb2JhbGRlZnMgPSAxCi0gICUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgXGludGVybmFscGFnZXNpemVzeyMxfXtcaHNpemV9e1x2b2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fXtcYmluZGluZ29mZnNldH17NDRwdH0lCi19fQotCi0lIFNldCBkZWZhdWx0IHRvIGxldHRlci4KLSUKLVxsZXR0ZXJwYXBlcgotCi0KLVxtZXNzYWdle2FuZCB0dXJuaW5nIG9uIHRleGluZm8gaW5wdXQgZm9ybWF0Ln0KLQotJSBEZWZpbmUgbWFjcm9zIHRvIG91dHB1dCB2YXJpb3VzIGNoYXJhY3RlcnMgd2l0aCBjYXRjb2RlIGZvciBub3JtYWwgdGV4dC4KLVxjYXRjb2RlYFwiPVxvdGhlcgotXGNhdGNvZGVgXH49XG90aGVyCi1cY2F0Y29kZWBcXj1cb3RoZXIKLVxjYXRjb2RlYFxfPVxvdGhlcgotXGNhdGNvZGVgXHw9XG90aGVyCi1cY2F0Y29kZWBcPD1cb3RoZXIKLVxjYXRjb2RlYFw+PVxvdGhlcgotXGNhdGNvZGVgXCs9XG90aGVyCi1cY2F0Y29kZWBcJD1cb3RoZXIKLVxkZWZcbm9ybWFsZG91YmxlcXVvdGV7In0KLVxkZWZcbm9ybWFsdGlsZGV7fn0KLVxkZWZcbm9ybWFsY2FyZXR7Xn0KLVxkZWZcbm9ybWFsdW5kZXJzY29yZXtffQotXGRlZlxub3JtYWx2ZXJ0aWNhbGJhcnt8fQotXGRlZlxub3JtYWxsZXNzezx9Ci1cZGVmXG5vcm1hbGdyZWF0ZXJ7Pn0KLVxkZWZcbm9ybWFscGx1c3srfQotXGRlZlxub3JtYWxkb2xsYXJ7JH0KLQotJSBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbWFrZSBhIGNoYXJhY3RlciBwcmludCBvbmUgd2F5IGluIHR0Zm9udAotJSB3aGVyZSBpdCBjYW4gcHJvYmFibHkganVzdCBiZSBvdXRwdXQsIGFuZCBhbm90aGVyIHdheSBpbiBvdGhlciBmb250cywKLSUgd2hlcmUgc29tZXRoaW5nIGhhaXJpZXIgcHJvYmFibHkgbmVlZHMgdG8gYmUgZG9uZS4KLSUKLSUgIzEgaXMgd2hhdCB0byBwcmludCBpZiB3ZSBhcmUgaW5kZWVkIHVzaW5nIFx0dDsgIzIgaXMgd2hhdCB0byBwcmludAotJSBvdGhlcndpc2UuICBTaW5jZSBhbGwgdGhlIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybwotJSBpbnRlcndvcmQgc3RyZXRjaCAoYW5kIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwKLSUgdHlwZXdyaXRlciBmb250cyB0byBoYXZlIHRoaXMsIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgotJQotXGRlZlxpZnVzaW5ndHQjMSMye1xpZmRpbSBcZm9udGRpbWVuM1xmb250PTBwdCAjMVxlbHNlICMyXGZpfQotCi0lIFNhbWUgYXMgYWJvdmUsIGJ1dCBjaGVjayBmb3IgaXRhbGljIGZvbnQuICBBY3R1YWxseSB0aGlzIGFsc28gY2F0Y2hlcwotJSBub24taXRhbGljIHNsYW50ZWQgZm9udHMgc2luY2UgaXQgaXMgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20KLSUgaXRhbGljIGZvbnRzLiAgQnV0IHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGJ5ICQgYW5kIGl0IHVzZXMgXHNsIGFueXdheQotJSB0aGlzIGlzIG5vdCBhIHByb2JsZW0uCi1cZGVmXGlmdXNpbmdpdCMxIzJ7XGlmZGltIFxmb250ZGltZW4xXGZvbnQ+MHB0ICMxXGVsc2UgIzJcZml9Ci0KLSUgVHVybiBvZmYgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyBleGNlcHQgQAotJSAoYW5kIHRob3NlIHdoaWNoIHRoZSB1c2VyIGNhbiB1c2UgYXMgaWYgdGhleSB3ZXJlIG9yZGluYXJ5KS4KLSUgTW9zdCBvZiB0aGVzZSB3ZSBzaW1wbHkgcHJpbnQgZnJvbSB0aGUgXHR0IGZvbnQsIGJ1dCBmb3Igc29tZSwgd2UgY2FuCi0lIHVzZSBtYXRoIG9yIG90aGVyIHZhcmlhbnRzIHRoYXQgbG9vayBiZXR0ZXIgaW4gbm9ybWFsIHRleHQuCi0KLVxjYXRjb2RlYFwiPVxhY3RpdmUKLVxkZWZcYWN0aXZlZG91YmxlcXVvdGV7e1x0dFxjaGFyMzR9fQotXGxldCI9XGFjdGl2ZWRvdWJsZXF1b3RlCi1cY2F0Y29kZWBcfj1cYWN0aXZlCi1cZGVmfnt7XHR0XGNoYXIxMjZ9fQotXGNoYXJkZWZcaGF0PWBcXgotXGNhdGNvZGVgXF49XGFjdGl2ZQotXGRlZl57e1x0dCBcaGF0fX0KLQotXGNhdGNvZGVgXF89XGFjdGl2ZQotXGRlZl97XGlmdXNpbmd0dFxub3JtYWx1bmRlcnNjb3JlXF99Ci0lIFN1YnJvdXRpbmUgZm9yIHRoZSBwcmV2aW91cyBtYWNyby4KLVxkZWZcX3tcbGVhdmV2bW9kZSBca2Vybi4wNmVtIFx2Ym94e1xocnVsZSB3aWR0aC4zZW0gaGVpZ2h0LjFleH19Ci0KLVxjYXRjb2RlYFx8PVxhY3RpdmUKLVxkZWZ8e3tcdHRcY2hhcjEyNH19Ci1cY2hhcmRlZiBcbGVzcz1gXDwKLVxjYXRjb2RlYFw8PVxhY3RpdmUKLVxkZWY8e3tcdHQgXGxlc3N9fQotXGNoYXJkZWYgXGd0cj1gXD4KLVxjYXRjb2RlYFw+PVxhY3RpdmUKLVxkZWY+e3tcdHQgXGd0cn19Ci1cY2F0Y29kZWBcKz1cYWN0aXZlCi1cZGVmK3t7XHR0IFxjaGFyIDQzfX0KLVxjYXRjb2RlYFwkPVxhY3RpdmUKLVxkZWYke1xpZnVzaW5naXR7e1xzbFwkfX1cbm9ybWFsZG9sbGFyfQotJVxjYXRjb2RlIDI3PVxhY3RpdmUKLSVcZGVmXl5beyRcZGlhbW9uZHN1aXQkfQotCi0lIFNldCB1cCBhbiBhY3RpdmUgZGVmaW5pdGlvbiBmb3IgPSwgYnV0IGRvbid0IGVuYWJsZSBpdCBtb3N0IG9mIHRoZSB0aW1lLgote1xjYXRjb2RlYFw9PVxhY3RpdmUKLVxnbG9iYWxcZGVmPXt7XHR0IFxjaGFyIDYxfX19Ci0KLVxjYXRjb2RlYCs9XGFjdGl2ZQotXGNhdGNvZGVgXF89XGFjdGl2ZQotCi0lIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmaWxlCi0lIG5hbWUgY2Fubm90IGJlIGFjdGl2ZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29tbWFuZCBsaW5lLgotJSBTbyB0dXJuIHRoZW0gb2ZmIGFnYWluLCBhbmQgaGF2ZSBcZXZlcnlqb2IgKG9yIEBzZXRmaWxlbmFtZSkgdHVybiB0aGVtIG9uLgotJSBcb3RoZXJpZnlhY3RpdmUgaXMgY2FsbGVkIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi1cZGVmXG90aGVyaWZ5YWN0aXZle1xjYXRjb2RlYCs9XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcn0KLQotXGNhdGNvZGVgXEA9MAotCi0lIFxyYXdiYWNrc2xhc2h4eCBvdXRwdXQgb25lIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaW4gY3VycmVudCBmb250Ci1cZ2xvYmFsXGNoYXJkZWZccmF3YmFja3NsYXNoeHg9YFxcCi0le1xjYXRjb2RlYFxcPVxvdGhlcgotJUBnZGVmQHJhd2JhY2tzbGFzaHh4e1x9fQotCi0lIFxyYXdiYWNrc2xhc2ggcmVkZWZpbmVzIFwgYXMgaW5wdXQgdG8gZG8gXHJhd2JhY2tzbGFzaHh4Lgote1xjYXRjb2RlYFxcPVxhY3RpdmUKLUBnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AcmF3YmFja3NsYXNoeHggfX0KLQotJSBcbm9ybWFsYmFja3NsYXNoIG91dHB1dHMgb25lIGJhY2tzbGFzaCBpbiBmaXhlZCB3aWR0aCBmb250LgotXGRlZlxub3JtYWxiYWNrc2xhc2h7e1x0dFxyYXdiYWNrc2xhc2h4eH19Ci0KLSUgXGNhdGNvZGUgMTc9MCAgICUgRGVmaW5lIGNvbnRyb2wtcQotXGNhdGNvZGVgXFw9XGFjdGl2ZQotCi0lIFVzZWQgc29tZXRpbWVzIHRvIHR1cm4gb2ZmIChlZmZlY3RpdmVseSkgdGhlIGFjdGl2ZSBjaGFyYWN0ZXJzCi0lIGV2ZW4gYWZ0ZXIgcGFyc2luZyB0aGVtLgotQGRlZkB0dXJub2ZmYWN0aXZle0BsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotQGxldFw9QHJlYWxiYWNrc2xhc2gKLUBsZXR+PUBub3JtYWx0aWxkZQotQGxldF49QG5vcm1hbGNhcmV0Ci1AbGV0Xz1Abm9ybWFsdW5kZXJzY29yZQotQGxldHw9QG5vcm1hbHZlcnRpY2FsYmFyCi1AbGV0PD1Abm9ybWFsbGVzcwotQGxldD49QG5vcm1hbGdyZWF0ZXIKLUBsZXQrPUBub3JtYWxwbHVzCi1AbGV0JD1Abm9ybWFsZG9sbGFyfQotCi1AZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7QGxldCI9QG5vcm1hbGRvdWJsZXF1b3RlCi1AbGV0XD1Abm9ybWFsYmFja3NsYXNoCi1AbGV0fj1Abm9ybWFsdGlsZGUKLUBsZXRePUBub3JtYWxjYXJldAotQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKLUBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotQGxldDw9QG5vcm1hbGxlc3MKLUBsZXQ+PUBub3JtYWxncmVhdGVyCi1AbGV0Kz1Abm9ybWFscGx1cwotQGxldCQ9QG5vcm1hbGRvbGxhcn0KLQotJSBNYWtlIF8gYW5kICsgXG90aGVyIGNoYXJhY3RlcnMsIHRlbXBvcmFyaWx5LgotJSBUaGlzIGlzIGNhbmNlbGVkIGJ5IEBmaXhiYWNrc2xhc2guCi1Ab3RoZXJpZnlhY3RpdmUKLQotJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCB3ZSBkb24ndCB3YW50IHRoZSBgXGlucHV0IHRleGluZm8nIHRvIHNob3cgdXAuCi0lIFRoYXQgaXMgd2hhdCBcZWF0aW5wdXQgaXMgZm9yOyBhZnRlciB0aGF0LCB0aGUgYFwnIHNob3VsZCByZXZlcnQgdG8gcHJpbnRpbmcKLSUgYSBiYWNrc2xhc2guCi0lCi1AZ2RlZkBlYXRpbnB1dCBpbnB1dCB0ZXhpbmZve0BmaXhiYWNrc2xhc2h9Ci1AZ2xvYmFsQGxldFwgPSBAZWF0aW5wdXQKLQotJSBPbiB0aGUgb3RoZXIgaGFuZCwgcGVyaGFwcyB0aGUgZmlsZSBkaWQgbm90IGhhdmUgYSBgXGlucHV0IHRleGluZm8nLiBUaGVuCi0lIHRoZSBmaXJzdCBgXHsgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4Ci0lIHRoYXQsIGFzc3VtaW5nIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGBcJyBjb3VsZCBwbGF1c2libHkgb2NjdXIuCi0lIEFsc28gYmFjayB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIHRoZSBpbnB1dAotJSBmaWxlIG5hbWUsIGluIGNhc2Ugbm90IHVzaW5nIGEgcHJlLWR1bXBlZCBmb3JtYXQuCi0lCi1AZ2RlZkBmaXhiYWNrc2xhc2h7JQotICBAaWZ4XEBlYXRpbnB1dCBAbGV0XCA9IEBub3JtYWxiYWNrc2xhc2ggQGZpCi0gIEBjYXRjb2RlYCs9QGFjdGl2ZQotICBAY2F0Y29kZWBAXz1AYWN0aXZlCi19Ci0KLSUgU2F5IEBmb28sIG5vdCBcZm9vLCBpbiBlcnJvciBtZXNzYWdlcy4KLUBlc2NhcGVjaGFyID0gYEBACi0KLSUgVGhlc2UgbG9vayBvayBpbiBhbGwgZm9udHMsIHNvIGp1c3QgbWFrZSB0aGVtIG5vdCBzcGVjaWFsLiAgCi1AY2F0Y29kZWBAJiA9IEBvdGhlcgotQGNhdGNvZGVgQCMgPSBAb3RoZXIKLUBjYXRjb2RlYEAlID0gQG90aGVyCi0KLUBjIFNldCBpbml0aWFsIGZvbnRzLgotQHRleHRmb250cwotQHJtCi0KLQotQGMgTG9jYWwgdmFyaWFibGVzOgotQGMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotQGMgcGFnZS1kZWxpbWl0ZXI6ICJeXFxcXG1lc3NhZ2UiCi1AYyB0aW1lLXN0YW1wLXN0YXJ0OiAiZGVmXFxcXHRleGluZm92ZXJzaW9ueyIKLUBjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotQGMgdGltZS1zdGFtcC1lbmQ6ICJ9IgotQGMgRW5kOgpkaWZmIC0tZ2l0IGEveWx3cmFwIGIveWx3cmFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjg4Y2NkLi4wMDAwMDAwCi0tLSBhL3lsd3JhcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jISAvYmluL3NoCi0jIHlsd3JhcCAtIHdyYXBwZXIgZm9yIGxleC95YWNjIGludm9jYXRpb25zLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFVzYWdlOgotIyAgICAgeWx3cmFwIFBST0dSQU0gSU5QVVQgW09VVFBVVCBERVNJUkVEXS4uLiAtLSBbQVJHU10uLi4KLSMgKiBQUk9HUkFNIGlzIHByb2dyYW0gdG8gcnVuLgotIyAqIElOUFVUIGlzIHRoZSBpbnB1dCBmaWxlCi0jICogT1VUUFVUIGlzIGZpbGUgUFJPRyBnZW5lcmF0ZXMKLSMgKiBERVNJUkVEIGlzIGZpbGUgd2UgYWN0dWFsbHkgd2FudAotIyAqIEFSR1MgYXJlIHBhc3NlZCB0byBQUk9HCi0jIEFueSBudW1iZXIgb2YgT1VUUFVULERFU0lSRUQgcGFpcnMgbWF5IGJlIHVzZWQuCi0KLSMgVGhlIHByb2dyYW0gdG8gcnVuLgotcHJvZz0iJDEiCi1zaGlmdAotIyBNYWtlIGFueSByZWxhdGl2ZSBwYXRoIGluICRwcm9nIGFic29sdXRlLgotY2FzZSAiJHByb2ciIGluCi0gLyogfCBbQS1aYS16XTpcXCopIDs7Ci0gKi8qKSBwcm9nPSJgcHdkYC8kcHJvZyIgOzsKLWVzYWMKLQotIyBUaGUgaW5wdXQuCi1pbnB1dD0iJDEiCi1zaGlmdAotY2FzZSAiJGlucHV0IiBpbgotIC8qIHwgW0EtWmEtel06XFwqKQotICAgICMgQWJzb2x1dGUgcGF0aDsgZG8gbm90aGluZy4KLSAgICA7OwotICopCi0gICAgIyBSZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZS4gIFdoeT8gIEJlY2F1c2Ugb3RoZXJ3aXNlIGFueQotICAgICMgZGVidWdnaW5nIGluZm8gaW4gdGhlIGdlbmVyYXRlZCBmaWxlIHdpbGwgcG9pbnQgdG8gdGhlIHdyb25nCi0gICAgIyBwbGFjZS4gIFRoaXMgaXMgcmVhbGx5IGdyb3NzLgotICAgIGlucHV0PSJgcHdkYC8kaW5wdXQiCi0gICAgOzsKLWVzYWMKLQotIyBXZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpZiB0aGUgaW5wdXQgaW4gdGhlIGN1cnJlbnQKLSMgZGlyZWN0b3J5IGxpa2Ugd2hlbiBtYWtpbmcgYSB0YXIgYmFsbC4KLWlucHV0X2Jhc2U9YGVjaG8gJGlucHV0IHwgc2VkIC1lICdzfC4qL3x8J2AKLWlmIHRlc3QgLWYgJGlucHV0X2Jhc2UgJiYgY21wICRpbnB1dF9iYXNlICRpbnB1dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgaW5wdXQ9JGlucHV0X2Jhc2UKLWZpCi0KLXBhaXJsaXN0PQotd2hpbGUgdGVzdCAiJCMiIC1uZSAwOyBkbwotICAgaWYgdGVzdCAiJDEiID0gIi0tIjsgdGhlbgotICAgICAgc2hpZnQKLSAgICAgIGJyZWFrCi0gICBmaQotICAgcGFpcmxpc3Q9IiRwYWlybGlzdCAkMSIKLSAgIHNoaWZ0Ci1kb25lCi0KLSMgRklYTUU6IGFkZCBob3N0bmFtZSBoZXJlIGZvciBwYXJhbGxlbCBtYWtlcyB0aGF0IHJ1biBjb21tYW5kcyBvbgotIyBvdGhlciBtYWNoaW5lcy4gIEJ1dCB0aGF0IG1pZ2h0IHRha2UgdXMgb3ZlciB0aGUgMTQtY2hhciBsaW1pdC4KLWRpcm5hbWU9eWx3cmFwJCQKLXRyYXAgImNkIGBwd2RgOyBybSAtcmYgJGRpcm5hbWUgPiAvZGV2L251bGwgMj4mMSIgMSAyIDMgMTUKLW1rZGlyICRkaXJuYW1lIHx8IGV4aXQgMQotCi1jZCAkZGlybmFtZQotY2FzZSAiJGlucHV0IiBpbgotIC8qIHwgW0EtWmEtel06XFwqKQotICAgICMgQWJzb2x1dGUgcGF0aDsgZG8gbm90aGluZy4KLSAgICA7OwotICopCi0gICAgIyBNYWtlIGEgc3ltYm9saWMgbGluaywgaGFyZCBsaW5rIG9yIGhhcmRjb3B5LgotICAgIGxuIC1zIC4uLyIkaW5wdXQiIC4gPiAvZGV2L251bGwgMj4mMSB8fCBsbiAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgY3AgLi4vIiRpbnB1dCIgLgotICAgIDs7Ci1lc2FjCi0kcHJvZyAkezErIiRAIn0gIiRpbnB1dCIKLXN0YXR1cz0kPwotCi1pZiB0ZXN0ICRzdGF0dXMgLWVxIDA7IHRoZW4KLSAgIHNldCBYICRwYWlybGlzdAotICAgc2hpZnQKLSAgIGZpcnN0PXllcwotICAgd2hpbGUgdGVzdCAiJCMiIC1uZSAwOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJDEiOyB0aGVuCi0gICAgICAgICAjIElmICQyIGlzIGFuIGFic29sdXRlIHBhdGggbmFtZSwgdGhlbiBqdXN0IHVzZSB0aGF0LAotICAgICAgICAgIyBvdGhlcndpc2UgcHJlcGVuZCBgLi4vJy4KLSAgICAgICAgIGNhc2UgIiQyIiBpbgotCSAgIC8qIHwgW0EtWmEtel06XFwqKSB0YXJnZXQ9IiQyIjs7Ci0JICAgKikgdGFyZ2V0PSIuLi8kMiI7OwotCSBlc2FjCi0JIG12ICIkMSIgIiR0YXJnZXQiIHx8IHN0YXR1cz0kPwotICAgICAgZWxzZQotCSAjIEEgbWlzc2luZyBmaWxlIGlzIG9ubHkgYW4gZXJyb3IgZm9yIHRoZSBmaXJzdCBmaWxlLiAgVGhpcwotCSAjIGlzIGEgYmxhdGFudCBoYWNrIHRvIGxldCB1cyBzdXBwb3J0IHVzaW5nICJ5YWNjIC1kIi4gIElmIC1kCi0JICMgaXMgbm90IHNwZWNpZmllZCwgd2UgZG9uJ3Qgd2FudCBhbiBlcnJvciB3aGVuIHRoZSBoZWFkZXIKLQkgIyBmaWxlIGlzICJtaXNzaW5nIi4KLQkgaWYgdGVzdCAkZmlyc3QgPSB5ZXM7IHRoZW4KLQkgICAgc3RhdHVzPTEKLQkgZmkKLSAgICAgIGZpCi0gICAgICBzaGlmdAotICAgICAgc2hpZnQKLSAgICAgIGZpcnN0PW5vCi0gICBkb25lCi1lbHNlCi0gICBzdGF0dXM9JD8KLWZpCi0KLSMgUmVtb3ZlIHRoZSBkaXJlY3RvcnkuCi1jZCAuLgotcm0gLXJmICRkaXJuYW1lCi0KLWV4aXQgJHN0YXR1cwo=